diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aa11892fa6..0dc8d3051b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,37 +1,17 @@ job1: script: - - echo $PWD - - echo $USER - - echo $OAI_USER - - echo $OAI_EXTRA_ARGS - - echo $NFS_SHARE_DIR - - echo $EXTERNAL_SHARE_DIR - - echo $SHELL - - echo $OAI_TEST_CASE_GROUP - - echo $MACHINELIST - - echo $MACHINELISTGENERIC - - git rev-parse --abbrev-ref HEAD - - git_repo=`git config --get remote.origin.url` - - git_head=`git rev-parse HEAD` - - echo $git_head - - tmp=`git show-ref --head | grep $git_head` - - tmp=(${tmp///// }) - - git_branch=${tmp[@]:(-1)} - - echo $git_branch - - source oaienv - - echo $OPENAIR_DIR - - NFS_TEST_RESULTS_DIR=$NFS_SHARE_DIR/$git_branch/$git_head - - EXTERNAL_SHARE_RESULTS_DIR=$EXTERNAL_SHARE_DIR/$git_branch/$git_head - - echo $NFS_TEST_RESULTS_DIR - - echo $EXTERNAL_SHARE_RESULTS_DIR - - echo $NRUNS_LTE_SOFTMODEM - - echo $TIMEOUT_CMD - - mkdir -p $OPENAIR_DIR/cmake_targets/autotests/log - - python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -c -5GRepo $git_repo -MachineList "$MACHINELIST" -MachineListGeneric "$MACHINELISTGENERIC" -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS $OAI_EXTRA_ARGS -g "$OAI_TEST_CASE_GROUP">& $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log - - python $OPENAIR_DIR/cmake_targets/autotests/run_exec_lte-softmodem_tests.py -r -5GRepo $git_repo -MachineList "$MACHINELIST" -MachineListGeneric "$MACHINELISTGENERIC" -5GRepoHeadVersion $git_head -n $NFS_SHARE_DIR -u $OAI_USER -p $OAI_PASS `echo $OAI_EXTRA_ARGS` -g "$OAI_TEST_CASE_GROUP" --nrun_lte_softmodem $NRUNS_LTE_SOFTMODEM --timeout_cmd $TIMEOUT_CMD >& $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log - - mv $OPENAIR_DIR/cmake_targets/autotests/python_autotest.log $OPENAIR_DIR/cmake_targets/autotests/log/python_autotest.log - - mv $OPENAIR_DIR/cmake_targets/autotests/python_autotest_cleanup.log $OPENAIR_DIR/cmake_targets/autotests/log/python_autotest_cleanup.log - - sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $NFS_TEST_RESULTS_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$NFS_TEST_RESULTS_DIR - - sshpass -p "$OAI_PASS" rsync -az -e "ssh -o StrictHostKeyChecking=no " --rsync-path="mkdir -p $EXTERNAL_SHARE_DIR && rsync" $OPENAIR_DIR/cmake_targets/autotests/log $OAI_USER@localhost:$EXTERNAL_SHARE_DIR - - cat $OPENAIR_DIR/cmake_targets/autotests/log/results_autotests.xml - when: manual + - date + - pwd + - echo $OAI_TEST_CASE_GROUP + - echo $MACHINELIST + - echo $MACHINELISTGENERIC + - echo $RESULT_DIR + - echo $NRUNS_LTE_SOFTMODEM + - source oaienv + - rm -rf cmake_targets/autotests/log + - mkdir cmake_targets/autotests/log + - cd cmake_targets/autotests/v2 + - python main.py + - date + only: + - triggers diff --git a/COPYING b/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..44a9a405fb --- /dev/null +++ b/LICENSE @@ -0,0 +1,200 @@ + The OpenAirInterface Software Alliance (OSA) + OAI Public License (Version 1.1) + +LICENSE TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION OF OPENAIR 5G SOFTWARE. + +1. Definitions. + +“License� shall mean the terms and conditions for use, reproduction, and distribution set forth +in this document. + +“Licensor� shall mean the OpenAirInterface Software Alliance. + +“Legal Entity� shall mean the union, at the time an acting entity joins the Alliance, of the +acting entity and all other entities that control, are controlled by, or are under common control +with that entity. For the purposes of this definition, “control� means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by contract or +otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) +beneficial ownership of such entity. + +“You� (or “Your�) shall mean an individual or Legal Entity exercising permissions granted by +this License. + +“Source� form shall mean the preferred form for making modifications, including but not +limited to software source code, documentation source, and configuration files. + +“Object� form shall mean any form resulting from mechanical transformation or translation of +a Source form, including but not limited to compiled object code, generated documentation, +and conversions to other media types. + +“OpenAirInterface Software Alliance� shall mean the endowment fund established at the +initiative of Eurecom, an educational and research establishment located at Campus Sophia +Tech, 450 Route des Chappes, 06410 Biot, France, which statutes were signed on 18 +November 2014. + +“Work� shall mean the work of authorship, whether in Source or Object form, made available +under the License, as indicated by a copyright notice that is included in or attached to the +work (an example is provided in the Appendix below). + +“Derivative Works� shall mean any work, whether in Source or Object form, that is based on +(or derived from) the Work and for which the editorial revisions, annotations, elaborations, or +other modifications represent, as a whole, an original work of authorship. For the purposes of +this License, Derivative Works shall not include works that remain separable from, or merely +link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +“Contribution� shall mean any work of authorship that is intentionally submitted to Licensor +for inclusion in the Work by the copyright owner or by an individual or Legal Entity +authorized to submit on behalf of the copyright owner. For the purposes of this definition, +“submitted� means any form of electronic, , or written communication sent to the Licensor or +its representatives, including but not limited to communication on electronic mailing lists, +source code control systems, and issue tracking systems that are managed by, or on behalf of, +the Licensor for the purpose of discussing and improving the Work + +“Contributor License Agreement� shall mean the agreement signed by any Contributor setting +forth the terms and conditions applicable to its Contribution. + +“Contributor� shall mean any individual or Legal Entity on behalf of whom a Contribution +has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. +Subject to the terms and conditions of this License, Licensor and each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, publicly display, publicly +perform, and distribute the Work and such Derivative Works in Source or Object form + +3. Grant of Patent License. + +3.1 Grant of Patent License for study, testing and research purposes: +Subject to the terms and conditions of this License, Licensor and each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, use, and otherwise +transfer (excluding selling) the Work, solely for study, testing and research purposes, where +such license applies only to those patent claims licensable by Licensor or such Contributor +that are necessarily infringed respectively by the Work and/or the said Contributor +Contribution(s) alone or by combination of their Contribution(s) with the Work to which +such Contribution(s) was submitted (“Essential Patents�). + +3.2 Grant of Patent License for purposes other than study and research: +For purposes other than study, testing and research, and subject to the terms and conditions of +this License, You commit to be prepared to negotiate a non-exclusive, non-transferable, non- +assignable license of Essential Patents with each Contributor and/or the Licensor on Fair, +Reasonable and Non-Discriminatory (“FRAND�) terms and conditions for the use of the +Work or Contribution(s) incorporated within the Work. +Licensor and/or each Contributor, by submitting a Contribution, will identify any of its known +Essential Patent it owns related to the Work and/or its Contribution. + +3.3 Patent Litigation +If You institute patent litigation against any entity making use of the Work solely for study, +testing and research purposes (including a cross-claim or counterclaim in a lawsuit) alleging +that the Work or a Contribution incorporated within the Work constitutes direct or +contributory patent infringement, then the patent licenses granted to You under section 3.1 of +this License for that Work shall terminate as of the date such litigation is filed. + +4. Sublicensing +You may grant sublicenses under the licenses granted under sections 2 and 3.1 provided that +the sublicense is subject to and inclusive of all the terms of and rights under this License to +which the Work is or was distributed by the OpenAirInterface Software Alliance. + +5. Redistribution +Subject to terms and conditions set forth in sections 2 and 3, You may reproduce and +distribute copies of the Work or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You meet the following +conditions: + +1. You must give any other recipients of the Work or Derivative Works a copy of this +License; and + +2. You must cause any modified files by You to carry prominent notices stating that You +changed the files; and + +3. You must retain, in the Source form of any Derivative Works that You distribute, all +copyright, patent, trademark, and attribution notices from the Source form of the Work, +excluding those notices that do not pertain to any part of the Derivative Works; and + +4. If the Work includes a “NOTICE� text file as part of its distribution, then any Derivative +Works that You distribute must include a readable copy of the attribution notices contained +within such NOTICE file, excluding those notices that do not pertain to any part of the +Derivative Works, in at least one of the following places: within a NOTICE text file +distributed as part of the Derivative Works; within the Source form or documentation, if +provided along with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of the +NOTICE file are for informational purposes only and do not modify the License. You may +add Your own attribution notices within Derivative Works that You distribute, alongside or as +an addendum to the NOTICE text from the Work, provided that such additional attribution +notices cannot be construed as modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or distribution of +Your modifications, or for any such Derivative Works as a whole, provided Your use, +reproduction, and distribution of the Work otherwise complies with the conditions stated in +this License. + +6. Submission of Contributions. +Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be +under the terms and conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of any +separate license agreement such as the Contributor License Agreement You may have +executed with Licensor regarding such Contributions. + +7. Trademarks. +This License does not grant permission to use the trade names, trademarks, service marks, or +product names of the Licensor, except as required for reasonable and customary use in +describing the origin of the Work and reproducing the content of the NOTICE file. + +8. Disclaimer of Warranty. +Unless required by applicable law or agreed to in writing, Licensor provides the Work (and +each Contributor provides its Contributions) on an “AS IS� BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, +without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, +MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely +responsible for determining the appropriateness of using or redistributing the Work and +assume any risks associated with your exercise of permissions under this License. + +9. Limitation of Liability. +In no event and under no legal theory, whether in tort (including negligence), contract, or +otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or +agreed to in writing, shall Licensor and any Contributor, as such, be liable to You for +damages, including any direct, indirect, special, incidental, or consequential damages of any +character arising as a result of this License or out of Your use or inability to use the Work +(including but not limited to damages for loss of goodwill, work stoppage, computer failure or +malfunction, or any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +10. Accepting Warranty or Additional Liability. +While redistributing the Work or Derivative Works thereof, You may choose to offer, and +charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations +and/or rights consistent with this License. However, in accepting such obligations, You may +act only on Your own behalf and on Your sole responsibility, not on behalf of any other +Contributor and/or the Licensor, and only if You agree to indemnify, defend, and hold each +Contributor and/or the Licensor harmless for any liability incurred by, or claims asserted +against, such Contributor and/or Licensor by reason of Your accepting any such warranty or +additional liability. + +11. Applicable law. +The present license shall be governed by the laws of France. + +END OF TERMS AND CONDITIONS + +1. APPENDIX: How to apply the PRESENT OPENAIR 5G License to your work +To apply the present License to your work, attach the following boilerplate notice, with the +fields enclosed by brackets “[]� replaced with your own identifying information. (Don’t +include the brackets!) The text should be enclosed in the appropriate comment syntax for the +file format. We also recommend that a file or class name and description of purpose be +included on the same “printed page� as the copyright notice for easier identification within +third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the License terms and conditions for use, reproduction, and distribution of +OPENAIR 5G software (the “License�); + +you may not use this file except in compliance with the License. You may obtain a copy of +the License at + +Unless required by applicable law or agreed to in writing, software distributed under the +License is distributed on an “AS IS� BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and limitations under the +License. + diff --git a/NOTICE.txt b/NOTICE.txt new file mode 100644 index 0000000000..38d493284a --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,21 @@ +The source code of openairinterface5g is distributed under OAI Public License V1.0. +For more details of the license, refer to LICENSE file in the same directory. + +However, the source code also contains third party software that is acknowledged here for reference. + +Credits for LFDS user space source code located in folder openair2/UTILS/LFDS/liblfds6.1.1/ +http://liblfds.org/. +Extract from http://liblfds.org/pages/downloads_and_license.html: +"There is no license. You are free to use this software in any way, for any purpose. Go forth and create wealth! +If however for legal reasons a licence is required, the license of your choice will be granted." + + +Credits for source code common/utils/collection/queue.h: +The Regents of the University of California: BSD 3-Clause Licence. + + +Credits for source code common/utils/collection/tree.h: +Niels Provos : BSD 2-Clause Licence. + + + diff --git a/README.txt b/README.txt index b549f8122f..edd233830f 100644 --- a/README.txt +++ b/README.txt @@ -1,27 +1,46 @@ -OpenAirInterface is under OpenAirInterface Software Alliance license. -├── http://www.openairinterface.org/?page_id=101 -├── http://www.openairinterface.org/?page_id=698 - -The OpenAirInterface (OAI) software is composed of the following parts: - -openairinterface5g -├── cmake_targets: build utilities to compile (simulation, emulation and real-time platforms), and generated build files -├── common : some common OAI utilities, other tools can be found at openair2/UTILS -├── COPYING -├── maketags : script to generate emacs tags -├── openair1 : 3GPP LTE Rel-10 PHY layer + PHY RF simulation and a subset of Rel 12 Features. -├── openair2 :3GPP LTE Rel-10 RLC/MAC/PDCP/RRC/X2AP implementation. - ├── LAYER2/RLC/ with the following subdirectories: UM_v9.3.0, TM_v9.3.0, and AM_v9.3.0. - ├── LAYER2/PDCP/PDCP_v10.1.0. - ├── RRC/LITE - ├── PHY_INTERFACE - ├── X2AP - ├── ENB_APP -├── openair3: 3GPP LTE Rel10 for S1AP, NAS GTPV1-U for both ENB and UE. - ├── GTPV1-U - ├── NAS - ├── S1AP - ├── SCTP - ├── SECU - ├── UDP -└── targets: top level wrapper for unitary simulation for PHY channels, system-level emulation (eNB-UE with and without S1), and realtime eNB and UE and RRH GW. +OpenAirInterface is under OpenAirInterface Software Alliance license. +├── http://www.openairinterface.org/?page_id=101 +├── http://www.openairinterface.org/?page_id=698 + +It is distributed under OAI Public License V1.0. +The license information is distributed under LICENSE file in the same directory. +Please see NOTICE.txt for third party software that is included in the sources. + +The OpenAirInterface (OAI) software is composed of the following parts: + +openairinterface5g +├── cmake_targets: build utilities to compile (simulation, emulation and real-time platforms), and generated build files +├── common : some common OAI utilities, other tools can be found at openair2/UTILS +├── LICENSE +├── maketags : script to generate emacs tags +├── openair1 : 3GPP LTE Rel-10 PHY layer + PHY RF simulation and a subset of Rel 12 Features. +├── openair2 :3GPP LTE Rel-10 RLC/MAC/PDCP/RRC/X2AP implementation. + ├── LAYER2/RLC/ with the following subdirectories: UM_v9.3.0, TM_v9.3.0, and AM_v9.3.0. + ├── LAYER2/PDCP/PDCP_v10.1.0. + ├── RRC/LITE + ├── PHY_INTERFACE + ├── X2AP + ├── ENB_APP +├── openair3: 3GPP LTE Rel10 for S1AP, NAS GTPV1-U for both ENB and UE. + ├── GTPV1-U + ├── NAS + ├── S1AP + ├── SCTP + ├── SECU + ├── UDP +└── targets: top level wrapper for unitary simulation for PHY channels, system-level emulation (eNB-UE with and without S1), and realtime eNB and UE and RRH GW. + + +RELEASE NOTES: + +v0.1 -> Last stable commit on develop branch before enhancement-10-harmony +v0.2 -> Merge of enhancement-10-harmony to include NGFI RRH + New Interface for RF/BBU +v0.3 -> Last stable commit on develop branch before the merge of feature-131-new-license. This is the last commit with GPL License +v0.4 -> Merge of feature-131-new-license. It closes issue#131 and changes the license to OAI Public License V1.0 +v0.5 -> Merge of enhancement-10-harmony-lts. It includes fixes for Ubuntu 16.04 support +v0.5.1 -> Merge of bugfix-137-uplink-fixes. It includes stablity fixes for eNB +v0.5.2 -> Last version with old code for oaisim (abstraction mode works) +v0.6 -> RRH functionality, UE greatly improved, better TDD support, + a lot of bugs fixed. WARNING: oaisim in PHY abstraction mode does not + work, you need to use v0.5.2 for that. +v0.6.1 -> Mostly bugfixes. This is the last version without NFAPI. diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 8a01b4c512..0f2655b571 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1,30 +1,25 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # Author: laurent THOMAS, Lionel GAUTHIER -############################################################################### cmake_minimum_required (VERSION 2.8) @@ -32,6 +27,8 @@ cmake_minimum_required (VERSION 2.8) # Base directories, compatible with legacy OAI building ################################################ set (OPENAIR_DIR $ENV{OPENAIR_DIR}) +set (NFAPI_DIR ${OPENAIR_DIR}/nfapi/open-nFAPI) +set (NFAPI_USER_DIR ${OPENAIR_DIR}/nfapi/oai_integration) set (OPENAIR1_DIR ${OPENAIR_DIR}/openair1) set (OPENAIR2_DIR ${OPENAIR_DIR}/openair2) set (OPENAIR3_DIR ${OPENAIR_DIR}/openair3) @@ -42,10 +39,6 @@ set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}) project (OpenAirInterface) -add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m lms7002m) -add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR lmsSDR) -add_subdirectory(${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C Si5351C) - ########################################### # macros to define options as there is numerous options in oai ################################################ @@ -123,6 +116,8 @@ endmacro(add_list_string_option) #################################################### # compilation flags ############################################# + +#set(CMAKE_BUILD_TYPE "Debug") if (CMAKE_BUILD_TYPE STREQUAL "") set(CMAKE_BUILD_TYPE "RelWithDebInfo") endif() @@ -137,6 +132,9 @@ else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1) if (CPUINFO MATCHES "avx2") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2") + set(COMPILATION_AVX2 "True") + else() + set(COMPILATION_AVX2 "False") endif() if (CPUINFO MATCHES "sse4_1") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1") @@ -178,14 +176,13 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CU # these changes are related to hardcoded path to include .h files add_definitions(-DCMAKER) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3") -set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O3") +set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g -DMALLOC_CHECK_=3 -O2") set(GIT_BRANCH "UNKNOWN") set(GIT_COMMIT_HASH "UNKNOWN") set(GIT_COMMIT_DATE "UNKNOWN") - find_package(Git) if(GIT_FOUND) message("git found: ${GIT_EXECUTABLE}") @@ -204,7 +201,7 @@ if(GIT_FOUND) OUTPUT_VARIABLE GIT_COMMIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ) - + # Get the latest commit date of the working branch execute_process( COMMAND git log -1 --format=%cd @@ -221,6 +218,7 @@ add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"") add_definitions("-DPACKAGE_VERSION=\"Branch: ${GIT_BRANCH} Abrev. Hash: ${GIT_COMMIT_HASH} Date: ${GIT_COMMIT_DATE}\"") add_definitions("-DPACKAGE_BUGREPORT=\"openair4g-devel@lists.eurecom.fr\"") +add_boolean_option(PDCP_SPLIT True "enable PDCP split") # Debug related options @@ -232,14 +230,19 @@ add_boolean_option(DISABLE_XER_PRINT False "print XER Format") add_boolean_option(XER_PRINT False "print XER Format") add_boolean_option(RRC_MSG_PRINT False "print RRC messages") add_boolean_option(PDCP_MSG_PRINT False "print PDCP messages to /tmp/pdcp.log") -add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace -add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace -add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace +add_boolean_option(DEBUG_PDCP_PAYLOAD False "print PDCP PDU to stdout") # if true, make sure that global and PDCP log levels are trace +add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace +add_boolean_option(TRACE_RLC_PAYLOAD False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace add_boolean_option(TEST_OMG False "???") add_boolean_option(DEBUG_OMG False "???") add_boolean_option(XFORMS False "This adds the possibility to see the signal oscilloscope") add_boolean_option(PRINT_STATS False "This adds the possibility to see the status") add_boolean_option(T_TRACER False "Activate the T tracer, a debugging/monitoring framework" ) +add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs") +add_boolean_option(UE_DEBUG_TRACE False "Activate UE debug trace") +add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace") +add_boolean_option(DISABLE_LOG_X False "Deactivate all LOG_* macros") +add_boolean_option(USRP_REC_PLAY False "Enable USRP record playback mode") add_boolean_option(DEBUG_CONSOLE False "makes debugging easier, disables stdout/stderr buffering") @@ -260,17 +263,6 @@ if (${ENABLE_ITTI}) set(GTPU_need_ITTI ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_eNB.c) endif (${ENABLE_ITTI}) -add_boolean_option(RTAI False "Use RTAI") -if (${RTAI}) - set(DEADLINE_SCHEDULER False) - set(CPU_AFFINITY False) - add_definitions("-DENABLE_RTAI_CLOCK") - add_definitions("-DCONFIG_RTAI_LXRT_INLINE") - include_directories ("/usr/realtime/include") - include_directories ("/usr/realtime/include/asm") - set(RTAI_SOURCE sched_dlsch.c sched_rx_pdsch.c rt_wrapper.c vcd_signal_dumper.c log.c) -endif (${RTAI}) - ############################# # ASN.1 grammar C code generation & dependancies ################################ @@ -295,8 +287,10 @@ if (${RRC_ASN1_VERSION} STREQUAL "Rel8") set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1c/ASN1_files/EUTRA-RRC-Definitions-86.asn) elseif (${RRC_ASN1_VERSION} STREQUAL "CBA") set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1c/ASN1_files/EUTRA-RRC-Definitions-a20-lola.asn) -else() +elseif (${RRC_ASN1_VERSION} STREQUAL "Rel10") set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1c/ASN1_files/EUTRA-RRC-Definitions-a20.asn) +else() + set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1c/ASN1_files/RRC-e30.asn) endif (${RRC_ASN1_VERSION} STREQUAL "Rel8") set (RRC_FULL_DIR ${asn1_generated_dir}/${RRC_ASN1_VERSION}) @@ -317,11 +311,11 @@ if (NOT ${ret} STREQUAL 0) message(FATAL_ERROR "${fix_asn1c_call}: error") endif (NOT ${ret} STREQUAL 0) file(GLOB rrc_source ${RRC_FULL_DIR}/*.c) -set(rrc_source ${rrc_source} ${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1_msg.c) file(GLOB rrc_h ${RRC_FULL_DIR}/*.h) set(rrc_h ${rrc_h} ${RRC_FULL_DIR}/asn1_constants.h) set_source_files_properties(${rrc_source} PROPERTIES COMPILE_FLAGS -w) # suppress warnings from generated code -add_library(RRC_LIB ${rrc_h} ${rrc_source}) +add_library(RRC_LIB ${rrc_h} ${rrc_source} + ${OPENAIR2_DIR}/RRC/LITE/MESSAGES/asn1_msg.c) include_directories ("${RRC_FULL_DIR}") # add the command to generate the source code @@ -488,121 +482,95 @@ include_directories ("${X2AP_DIR}") # Hardware dependant options ################################### add_list1_option(NB_ANTENNAS_RX "2" "Number of antennas in reception" "1" "2" "4") -add_list1_option(NB_ANTENNAS_TX "2" "Number of antennas in transmission" "1" "2" "4") -add_list1_option(NB_ANTENNAS_TXRX "2" "Number of antennas in ????" "1" "2" "4") +add_list1_option(NB_ANTENNAS_TX "4" "Number of antennas in transmission" "1" "2" "4") add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "EXMIMO" "OAI_USRP" "OAI_BLADERF" "CPRIGW" "OAI_LMSSDR") add_list2_option(TRANSP_PRO "None" "Transport protocol type" "None" "ETHERNET") - - +#NOKIA config enhancement +set (CONFIG_ROOTDIR + ${OPENAIR_DIR}/common/config + ) +set (CONFIG_SOURCES + ${CONFIG_ROOTDIR}/config_load_configmodule.c + ${CONFIG_ROOTDIR}/config_userapi.c + ${CONFIG_ROOTDIR}/config_cmdline.c + ) +set (CONFIG_LIBCONFIG_SOURCES + ${CONFIG_ROOTDIR}/libconfig/config_libconfig.c + ) +add_library(params_libconfig MODULE ${CONFIG_LIBCONFIG_SOURCES} ) +target_link_libraries(params_libconfig config) +# shared library loader +set (SHLIB_LOADER_SOURCES + ${OPENAIR_DIR}/common/utils/load_module_shlib.c +) # include RF devices / transport protocols library modules ###################################################################### include_directories("${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/") include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/DEFS/") #set (option_HWEXMIMOLIB_lib "-l ") -set(HWLIB_EXMIMO_SOURCE +set(HWLIB_EXMIMO_SOURCE ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c - ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c +# ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c ) add_library(oai_exmimodevif MODULE ${HWLIB_EXMIMO_SOURCE} ) include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/") -set (option_HWUSRPLIB_lib "-l uhd") -set(HWLIB_USRP_SOURCE +set(HWLIB_USRP_SOURCE ${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp ) add_library(oai_usrpdevif MODULE ${HWLIB_USRP_SOURCE} ) +target_link_libraries(oai_usrpdevif uhd) include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/") -set (option_HWBLADERFLIB_lib "-l bladerf") -set(HWLIB_BLADERF_SOURCE +set(HWLIB_BLADERF_SOURCE ${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c ) add_library(oai_bladerfdevif MODULE ${HWLIB_BLADERF_SOURCE} ) +target_link_libraries(oai_bladerfdevif bladeRF) include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/") -set (option_HWLMSSDRLIB_lib "-l LMS_SDR -l LMS7002M -l Si5351C") -set(HWLIB_LMSSDR_SOURCE + +set(HWLIB_LMSSDR_SOURCE ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp ) add_library(oai_lmssdrdevif MODULE ${HWLIB_LMSSDR_SOURCE} ) +target_include_directories(oai_lmssdrdevif PRIVATE /usr/local/include/lime) +target_link_libraries(oai_lmssdrdevif LimeSuite ) include_directories("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/") -set(TPLIB_ETHERNET_SOURCE +set(TPLIB_ETHERNET_SOURCE ${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c ${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c ${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c ) add_library(oai_eth_transpro MODULE ${TPLIB_ETHERNET_SOURCE} ) +include_directories("${OPENAIR_TARGETS}/ARCH/mobipass/") +set(TPLIB_MOBIPASS_SOURCE + ${OPENAIR_TARGETS}/ARCH/mobipass/interface.c + ${OPENAIR_TARGETS}/ARCH/mobipass/mobipass.c + ${OPENAIR_TARGETS}/ARCH/mobipass/queues.c + ) +add_library(oai_mobipass MODULE ${TPLIB_MOBIPASS_SOURCE} ) -# RF devices / transport protocols settings -###################################################################### -if (${RF_BOARD} STREQUAL "EXMIMO") - set(DRIVER2013) - include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/") - include_directories ("${OPENAIR_TARGETS}/ARCH/EXMIMO/DEFS/") - set(HW_SOURCE ${HW_SOURCE} - ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c - ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c) - set(option_HW_lib "-rdynamic -ldl") +# Hide all functions/variables in the mobipass library. +# Use __attribute__((__visibility__("default"))) +# in the source code to unhide a function/variable. +get_target_property(mobipas_cflags oai_mobipass COMPILE_FLAGS) +set_target_properties(oai_mobipass PROPERTIES COMPILE_FLAGS "${mobipass_cflags} -fvisibility=hidden") -elseif (${RF_BOARD} STREQUAL "OAI_USRP") - include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/") - include_directories("/opt/include/uhd") - set(HW_SOURCE ${HW_SOURCE} - ${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp) - LINK_DIRECTORIES("/opt/lib") - set(option_HW_lib "-luhd -rdynamic -ldl") +set(HWLIB_TCP_BRIDGE_SOURCE + ${OPENAIR_TARGETS}/ARCH/tcp_bridge/tcp_bridge.c + ) +add_library(oai_tcp_bridge MODULE ${HWLIB_TCP_BRIDGE_SOURCE} ) -elseif (${RF_BOARD} STREQUAL "OAI_BLADERF") - include_directories("${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/") - include_directories("${OPENAIR2_DIR}/UTIL/LOG") - include_directories("/usr/include") - set(HW_SOURCE ${HW_SOURCE} - ${OPENAIR_TARGETS}/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c - ) - LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu") +#get_target_property(tcp_bridge_cflags oai_tcp_bridge COMPILE_FLAGS) +#set_target_properties(oai_tcp_bridge PROPERTIES COMPILE_FLAGS "${tcp_bridge_cflags} -fvisibility=hidden") +set_target_properties(oai_tcp_bridge PROPERTIES COMPILE_FLAGS "-fvisibility=hidden") - set(option_HW_lib "bladeRF -rdynamic -ldl") - -elseif (${RF_BOARD} STREQUAL "OAI_LMSSDR") - include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB") - include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR") - include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms7002m") - include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/Si5351C") - include_directories("${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard") - LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu") - LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lmsSDR") - LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/lms7002m") - LINK_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/Si5351C") - set(HW_SOURCE ${HW_SOURCE} ${OPENAIR_TARGETS}/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp) - set(option_HW_lib "-lLMS_SDR -lLMS7002M -lSi5351C -rdynamic -ldl") - -elseif (${RF_BOARD} STREQUAL "CPRIGW") - set(HW_SOURCE ${HW_SOURCE} - ${OPENAIR_TARGETS}/ARCH/CPRIGW/USERSPACE/LIB/cprigw_lib.c - ) - include_directories("${OPENAIR_TARGETS}/ARCH/CPRIGW/USERSPACE/LIB/") - set(option_HW_lib "-rdynamic dl") - -endif (${RF_BOARD} STREQUAL "EXMIMO") - - -if (${TRANSP_PRO} STREQUAL "ETHERNET") - - include_directories ("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB") - set(TRANSPORT_SOURCE ${TRANSPORT_SOURCE} - ${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c - ${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c - ${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c - ) - set(option_TP_lib "-rdynamic -ldl") - - -endif (${TRANSP_PRO} STREQUAL "ETHERNET") ########################################################## include_directories ("${OPENAIR_TARGETS}/ARCH/COMMON") @@ -616,49 +584,35 @@ Message("CPU_Affinity flag is ${CPU_AFFINITY}") add_boolean_option(ENABLE_SECURITY True "Enable LTE integrity and ciphering between RRC UE and eNB") add_boolean_option(ENABLE_USE_MME True "eNB connected to MME (INTERFACE S1-C), not standalone eNB") add_boolean_option(NO_RRM True "DO WE HAVE A RADIO RESSOURCE MANAGER: NO") -add_boolean_option(USER_MODE True "????") add_boolean_option(RRC_DEFAULT_RAB_IS_AM False "set the RLC mode to AM for the default bearer") add_boolean_option(OAI_NW_DRIVER_TYPE_ETHERNET False "????") -add_boolean_option(DISABLE_USE_NAS False "???") add_boolean_option(DEADLINE_SCHEDULER True "Use the Linux scheduler SCHED_DEADLINE: kernel >= 3.14") add_boolean_option(CPU_AFFINITY False "Enable CPU Affinity of threads (only valid without deadline scheduler). It is enabled only with >2 CPUs") add_boolean_option(NAS_ADDRESS_FIX False "specific to oaisim: for nasmesh driver") -add_boolean_option(NAS_NETLINK False "???? Must be True to compile nasmesh driver without rtai") +add_boolean_option(NAS_NETLINK False "useless ??? Must be True to compile nasmesh driver without rtai ????") add_boolean_option(OAISIM False "specific to oaisim") add_boolean_option(OAI_NW_DRIVER_USE_NETLINK True "????") + add_boolean_option(USE_MME False "this flag is used only one time in lte-softmodem.c") add_list_string_option(PACKAGE_NAME "NotDefined" "As per attribute name") add_boolean_option(MESSAGE_CHART_GENERATOR False "For generating sequence diagrams") add_boolean_option(MESSAGE_CHART_GENERATOR_RLC_MAC False "trace RLC-MAC exchanges in sequence diagrams") add_boolean_option(MESSAGE_CHART_GENERATOR_PHY False "trace some PHY exchanges in sequence diagrams") -add_boolean_option(ENB_AGENT True "enable eNB agent to inteface with a SDN contrller") - -# temporary FLAG -add_boolean_option(PDCP_SPLIT True "enable PDCP split") +add_boolean_option(FLEXRAN_AGENT_SB_IF False "enable FlexRAN agent to inteface with a SDN controller") ######################## # Include order ########################## add_boolean_option(ENB_MODE True "Swap the include directories between openair2 and openair3" ) -########################## -# Emulation options -########################## -add_boolean_option(ENABLE_PGM_TRANSPORT False "specific to oaisim, emulation through ethernet, reliable multicast") -add_boolean_option(ADDR_CONF False "specific to oaisim, IP autoconf of user-plane IP interface") -add_boolean_option(OPENAIR_EMU False "specific to oaisim") -add_boolean_option(OAI_EMU False "specific to oaisim") -add_boolean_option(PHY_ABSTRACTION False "specific to oaisim") - ########################## # SCHEDULING/REAL-TIME/PERF options ########################## add_boolean_option(ENABLE_USE_CPU_EXECUTION_TIME True "Add data in vcd traces: disable it if perf issues") add_boolean_option(ENABLE_VCD True "always true now, time measurements of proc calls and var displays") add_boolean_option(ENABLE_VCD_FIFO True "time measurements of proc calls and var displays sent to FIFO (one more thread)") -add_boolean_option(HARD_RT False "???") add_boolean_option(LINUX False "used in weird memcpy() in pdcp.c ???") add_boolean_option(LINUX_LIST False "used only in lists.c: either use OAI implementation of lists or Linux one (should be True, but it is False") add_boolean_option(LOG_NO_THREAD True "Disable thread for log, seems always set to true") @@ -668,24 +622,15 @@ add_boolean_option(OPENAIR_LTE True "Seems legacy: keep it to true") # PHY options ########################## add_boolean_option(DRIVER2013 True "only relevant for EXMIMO") -add_boolean_option(ENABLE_FXP True "????") add_boolean_option(ENABLE_NEW_MULTICAST False "specific to oaisim") add_boolean_option(EXMIMO_IOT True "????") add_boolean_option(LARGE_SCALE False "specific to oaisim: defines max eNB=2 and max UE=120") add_boolean_option(LOCALIZATION False "???") add_integer_option(MAX_NUM_CCs 1 "????") add_boolean_option(MU_RECEIVER False "????") -add_boolean_option(NEW_FFT True "????") -add_boolean_option(OPENAIR1 True "????") -add_boolean_option(PBS_SIM False "????") -add_boolean_option(PC_DSP True "????") -add_boolean_option(PC_TARGET True "????") -add_boolean_option(PERFECT_CE False "????") add_boolean_option(PHYSIM True "for L1 simulators (dlsim, ulsim, ...)") add_boolean_option(PHY_CONTEXT True "not clear: must remain False for dlsim") add_boolean_option(PHY_EMUL False "not clear: must remain False for dlsim") -add_boolean_option(PUCCH True "????") -add_boolean_option(RANDOM_BF False "????") add_boolean_option(SMBV False "Rohde&Schwarz SMBV100A vector signal generator") add_boolean_option(DEBUG_PHY False "Enable PHY layer debugging options") add_boolean_option(DEBUG_PHY_PROC False "Enable debugging of PHY layer procedures") @@ -758,23 +703,7 @@ add_boolean_option(RRC_DEFAULT_RAB_IS_AM False "Otherwise it is UM, confi ########################## # none -########################## -# PROJECTS (IST, FRENCH COLL., etc) -# SPECIFIC OPTIONS -########################## -add_boolean_option(SPECTRA False "???") -add_boolean_option(MIH_C_MEDIEVAL_EXTENSIONS False "EXTENSIONS TO MIH 802.21 IN CONTEXT OF IST PROJECT CALLED MEDIEVAL") - - - -add_boolean_option(EMOS False "????") -if(${EMOS}) - add_definitions("-D_FILE_OFFSET_BITS=64") - set(EMOS_LIB gps) -endif(${EMOS}) - - - # add the binary tree to the search path for include files +# add the binary tree to the search path for include files ####################################################### # We will find ConfigOAI.h after generation in target directory include_directories("${OPENAIR_BIN_DIR}") @@ -800,9 +729,16 @@ else() include_directories("${OPENAIR2_DIR}/UTIL") include_directories("${OPENAIR2_DIR}/UTIL/LOG") endif() +include_directories("${NFAPI_DIR}/nfapi/public_inc") +include_directories("${NFAPI_DIR}/common/public_inc") +include_directories("${NFAPI_DIR}/pnf/public_inc") +include_directories("${NFAPI_DIR}/nfapi/inc") +include_directories("${NFAPI_DIR}/sim_common/inc") +include_directories("${NFAPI_DIR}/pnf_sim/inc") include_directories("${OPENAIR1_DIR}") -include_directories("${OPENAIR2_DIR}/NAS") include_directories("${OPENAIR2_DIR}") +include_directories("${OPENAIR3_DIR}/NAS/TOOLS") +include_directories("${OPENAIR2_DIR}/ENB_APP") include_directories("${OPENAIR2_DIR}/LAYER2/RLC") include_directories("${OPENAIR2_DIR}/LAYER2/RLC/AM_v9.3.0") include_directories("${OPENAIR2_DIR}/LAYER2/RLC/UM_v9.3.0") @@ -830,16 +766,15 @@ include_directories("${OPENAIR3_DIR}/GTPV1-U") include_directories("${OPENAIR_DIR}/targets/COMMON") include_directories("${OPENAIR_DIR}/targets/ARCH/COMMON") include_directories("${OPENAIR_DIR}/targets/ARCH/EXMIMO/USERSPACE/LIB/") -include_directories("${OPENAIR2_DIR}/UTIL/MEM") -include_directories("${OPENAIR2_DIR}/UTIL/LISTS") -include_directories("${OPENAIR2_DIR}/UTIL/FIFO") include_directories("${OPENAIR_DIR}/targets/ARCH/EXMIMO/DEFS") -include_directories("${OPENAIR2_DIR}/UTIL/ASYNC_IF") +include_directories("${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC") +include_directories("${OPENAIR2_DIR}/UTIL/OSA") include_directories("${OPENAIR2_DIR}/UTIL/LFDS/liblfds6.1.1/liblfds611/inc") include_directories("${OPENAIR2_DIR}/UTIL/LFDS/liblfds7.0.0/liblfds700/inc") include_directories("${OPENAIR2_DIR}/LAYER2/PROTO_AGENT") -include_directories("${OPENAIR2_DIR}/ENB_APP") -include_directories("${OPENAIR2_DIR}/UTIL/OSA") +include_directories("${OPENAIR2_DIR}/UTIL/MEM") +include_directories("${OPENAIR2_DIR}/UTIL/LISTS") +include_directories("${OPENAIR2_DIR}/UTIL/FIFO") include_directories("${OPENAIR2_DIR}/UTIL/OCG") include_directories("${OPENAIR2_DIR}/UTIL/MATH") include_directories("${OPENAIR2_DIR}/UTIL/TIMER") @@ -855,6 +790,93 @@ include_directories("${OPENAIR_DIR}") # Utilities Library ################ +if (FLEXRAN_AGENT_SB_IF) + # set the version of protobuf messages, V3 not supported yet + add_list1_option(FLPT_VERSION V2 "FLPT MSG protobuf grammar version" V2 V3) + + if (${FLPT_VERSION} STREQUAL "V2") + set (FLPTDIR V2) + elseif (${FLPT_VERSION} STREQUAL "V3") + set (FLPTDIR V3) + endif(${FLPT_VERSION} STREQUAL "V2") + + set(FLPT_MSG_DIR ${OPENAIR2_DIR}/ENB_APP/MESSAGES/${FLPTDIR} ) + set(FLPT_MSG_FILES + ${FLPT_MSG_DIR}/header.proto + ${FLPT_MSG_DIR}/flexran.proto + ${FLPT_MSG_DIR}/stats_common.proto + ${FLPT_MSG_DIR}/stats_messages.proto + ${FLPT_MSG_DIR}/time_common.proto + ${FLPT_MSG_DIR}/controller_commands.proto + ${FLPT_MSG_DIR}/mac_primitives.proto + ${FLPT_MSG_DIR}/config_messages.proto + ${FLPT_MSG_DIR}/config_common.proto + ${FLPT_MSG_DIR}/control_delegation.proto + ) + + set(FLPT_C_DIR ${protobuf_generated_dir}/${FLPTDIR}) + #message("calling protoc_call=${protoc_call} FLPT_C_DIR=${FLPT_C_DIR} FLPT_MSG_FILES=${FLPT_MSG_FILES}") + execute_process(COMMAND ${protoc_call} ${FLPT_C_DIR} ${FLPT_MSG_DIR} ${FLPT_MSG_FILES}) + file(GLOB FLPT_source ${FLPT_C_DIR}/*.c) + set(FLPT_OAI_generated + ${FLPT_C_DIR}/header.pb-c.c + ${FLPT_C_DIR}/flexran.pb-c.c + ${FLPT_C_DIR}/stats_common.pb-c.c + ${FLPT_C_DIR}/stats_messages.pb-c.c + ${FLPT_C_DIR}/time_common.pb-c.c + ${FLPT_C_DIR}/controller_commands.pb-c.c + ${FLPT_C_DIR}/mac_primitives.pb-c.c + ${FLPT_C_DIR}/config_messages.pb-c.c + ${FLPT_C_DIR}/config_common.pb-c.c + ${FLPT_C_DIR}/control_delegation.pb-c.c + ) + + file(GLOB flpt_h ${FLPT_C_DIR}/*.h) + set(flpt_h ${flpt_h} ) + + add_library(FLPT_MSG + ${FLPT_OAI_generated} + ${FLPT_source} + ) + set(FLPT_MSG_LIB FLPT_MSG) + #message("prpt c dir is : ${FLPT_C_DIR}") + include_directories (${FLPT_C_DIR}) + + add_library(ASYNC_IF + ${OPENAIR2_DIR}/UTIL/ASYNC_IF/socket_link.c + ${OPENAIR2_DIR}/UTIL/ASYNC_IF/link_manager.c + ${OPENAIR2_DIR}/UTIL/ASYNC_IF/message_queue.c + ${OPENAIR2_DIR}/UTIL/ASYNC_IF/ringbuffer_queue.c + ) + set(ASYNC_IF_LIB ASYNC_IF) + include_directories(${OPENAIR2_DIR}/UTIL/ASYNC_IF) + + add_library(FLEXRAN_AGENT + ${OPENAIR2_DIR}/ENB_APP/flexran_agent_handler.c + ${OPENAIR2_DIR}/ENB_APP/flexran_agent_common.c + ${OPENAIR2_DIR}/ENB_APP/flexran_agent_common_internal.c + ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c + ${OPENAIR2_DIR}/ENB_APP/flexran_agent.c + ${OPENAIR2_DIR}/ENB_APP/flexran_agent_task_manager.c + ${OPENAIR2_DIR}/ENB_APP/flexran_agent_net_comm.c + ${OPENAIR2_DIR}/ENB_APP/flexran_agent_async.c + ${OPENAIR2_DIR}/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c + ) + set(FLEXRAN_AGENT_LIB FLEXRAN_AGENT) + #include_directories(${OPENAIR2_DIR}/ENB_APP) + + set(PROTOBUF_LIB "protobuf-c") + + FIND_PATH(LIBYAML_INCLUDE_DIR NAMES yaml.h) + FIND_LIBRARY(LIBYAML_LIBRARIES NAMES yaml libyaml) + + INCLUDE(FindPackageHandleStandardArgs) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(Yaml DEFAULT_MSG LIBYAML_LIBRARIES LIBYAML_INCLUDE_DIR) + MARK_AS_ADVANCED(LIBYAML_INCLUDE_DIR LIBYAML_LIBRARIES) + + #set(PROTOBUF_LIB "protobuf") #for Cpp +endif() + if (PDCP_SPLIT) # set the version of protobuf messages, V3 not supported yet add_list1_option(FSPT_VERSION V2 "FSPT MSG protobuf grammar version" V2 V3) @@ -875,7 +897,7 @@ if (PDCP_SPLIT) set(FSPT_C_DIR ${protobuf_generated_dir}/${FSPTDIR}) message("calling protoc_call=${protoc_call} FSPT_C_DIR=${FSPT_C_DIR} FSPT_MSG_FILES=${FSPT_MSG_FILES}") execute_process(COMMAND ${protoc_call} ${FSPT_C_DIR} ${FSPT_MSG_DIR} ${FSPT_MSG_FILES}) - file(GLOB FSPT_source ${FSPT_C_DIR}/*.c) + file(GLOB FSPT_source ${FSPT_C_DIR}/*.c) set(FSPT_OAI_generated ${FSPT_C_DIR}/header.pb-c.c ${FSPT_C_DIR}/flexsplit.pb-c.c @@ -910,7 +932,7 @@ if (PDCP_SPLIT) ${OPENAIR2_DIR}/LAYER2/PROTO_AGENT/proto_agent_async.c ) set(PROTO_AGENT_LIB PROTO_AGENT) - #include_directories(${OPENAIR2_DIR}/LAYER2/PROTO_AGENT) + include_directories(${OPENAIR2_DIR}/LAYER2/PROTO_AGENT) @@ -920,15 +942,15 @@ if (PDCP_SPLIT) endif() add_library(HASHTABLE - ${OPENAIR_DIR}/common/utils/collection/hashtable/hashtable.c - ${OPENAIR_DIR}/common/utils/collection/hashtable/obj_hashtable.c + ${OPENAIR_DIR}/common/utils/hashtable/hashtable.c + ${OPENAIR_DIR}/common/utils/hashtable/obj_hashtable.c ) -include_directories(${OPENAIR_DIR}/common/utils/collection/hashtable) +include_directories(${OPENAIR_DIR}/common/utils/hashtable) if (MESSAGE_CHART_GENERATOR) - add_library(MSC + add_library(MSC ${OPENAIR_DIR}/common/utils/msc/msc.c - ) + ) set(MSC_LIB MSC) endif() include_directories(${OPENAIR_DIR}/common/utils/msc) @@ -951,20 +973,16 @@ set(UTIL_SRC ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_filename.c ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_XML.c ${OPENAIR2_DIR}/UTIL/OCG/OCG_save_XML.c - ${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c ${OPENAIR2_DIR}/UTIL/OMG/common.c ${OPENAIR2_DIR}/UTIL/OMG/grid.c - ${OPENAIR2_DIR}/UTIL/OMG/id_manager.c ${OPENAIR2_DIR}/UTIL/OMG/job.c ${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c ${OPENAIR2_DIR}/UTIL/OMG/omg.c - ${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c + #${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c ${OPENAIR2_DIR}/UTIL/OMG/rwalk.c ${OPENAIR2_DIR}/UTIL/OMG/rwp.c - ${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c ${OPENAIR2_DIR}/UTIL/OMG/static.c ${OPENAIR2_DIR}/UTIL/OMG/steadystaterwp.c - ${OPENAIR2_DIR}/UTIL/OMG/storage_traci_OMG.c ${OPENAIR2_DIR}/UTIL/OMG/trace.c ${OPENAIR2_DIR}/UTIL/OMG/trace_hashtable.c ${OPENAIR2_DIR}/UTIL/OPT/probe.c @@ -977,6 +995,15 @@ set(UTIL_SRC ) add_library(UTIL ${UTIL_SRC}) +#set(OMG_SUMO_SRC +# ${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c +# ${OPENAIR2_DIR}/UTIL/OMG/id_manager.c +# ${OPENAIR2_DIR}/UTIL/OMG/sumo.c +# ${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c +# ${OPENAIR2_DIR}/UTIL/OMG/storage_traci_OMG.c +# ) +#add_library(OMG_SUMO ${OMG_SUMO_SRC}) + set(SECU_OSA_SRC ${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c ${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c @@ -1000,16 +1027,83 @@ add_library(SECU_CN ${SECU_CN_SRC}) # Scheduler ################################" -set(SCHED_SRC +set(SCHED_SRC + ${OPENAIR1_DIR}/SCHED/fapi_l1.c ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_eNb.c ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_ue.c ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c - ${OPENAIR1_DIR}/SCHED/phy_mac_stub.c + ${OPENAIR1_DIR}/SCHED/prach_procedures.c + ${OPENAIR1_DIR}/SCHED/ru_procedures.c +# ${OPENAIR1_DIR}/SCHED/phy_mac_stub.c ${OPENAIR1_DIR}/SCHED/pucch_pc.c ${OPENAIR1_DIR}/SCHED/pusch_pc.c + ${OPENAIR1_DIR}/SCHED/srs_pc.c ) add_library(SCHED_LIB ${SCHED_SRC}) +set(SCHED_SRC_UE + ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_ue.c + ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c + ${OPENAIR1_DIR}/SCHED/ru_procedures.c + ${OPENAIR1_DIR}/SCHED/prach_procedures.c + ${OPENAIR1_DIR}/SCHED/pucch_pc.c + ${OPENAIR1_DIR}/SCHED/pusch_pc.c + ${OPENAIR1_DIR}/SCHED/srs_pc.c +) +add_library(SCHED_UE_LIB ${SCHED_SRC_UE}) + +# nFAPI +################################# +set(NFAPI_COMMON_SRC + ${NFAPI_DIR}/common/src/debug.c +) +add_library(NFAPI_COMMON_LIB ${NFAPI_COMMON_SRC}) + +include_directories(${NFAPI_DIR}/common/public_inc) + +set(NFAPI_SRC + ${NFAPI_DIR}/nfapi/src/nfapi.c + ${NFAPI_DIR}/nfapi/src/nfapi_p4.c + ${NFAPI_DIR}/nfapi/src/nfapi_p5.c + ${NFAPI_DIR}/nfapi/src/nfapi_p7.c +) +add_library(NFAPI_LIB ${NFAPI_SRC}) + +include_directories(${NFAPI_DIR}/nfapi/public_inc) +include_directories(${NFAPI_DIR}/nfapi/inc) + +set(NFAPI_PNF_SRC + ${NFAPI_DIR}/pnf/src/pnf.c + ${NFAPI_DIR}/pnf/src/pnf_interface.c + ${NFAPI_DIR}/pnf/src/pnf_p7.c + ${NFAPI_DIR}/pnf/src/pnf_p7_interface.c +) +add_library(NFAPI_PNF_LIB ${NFAPI_PNF_SRC}) + +include_directories(${NFAPI_DIR}/pnf/public_inc) +include_directories(${NFAPI_DIR}/pnf/inc) + +set(NFAPI_VNF_SRC + ${NFAPI_DIR}/vnf/src/vnf.c + ${NFAPI_DIR}/vnf/src/vnf_interface.c + ${NFAPI_DIR}/vnf/src/vnf_p7.c + ${NFAPI_DIR}/vnf/src/vnf_p7_interface.c +) +add_library(NFAPI_VNF_LIB ${NFAPI_VNF_SRC}) + +include_directories(${NFAPI_DIR}/vnf/public_inc) +include_directories(${NFAPI_DIR}/vnf/inc) + +# nFAPI user defined code +############################# +set(NFAPI_USER_SRC + ${NFAPI_USER_DIR}/nfapi.c + ${NFAPI_USER_DIR}/nfapi_pnf.c + ${NFAPI_USER_DIR}/nfapi_vnf.c +) +add_library(NFAPI_USER_LIB ${NFAPI_USER_SRC}) +include_directories(${NFAPI_USER_DIR}) + # Layer 1 ############################# set(PHY_SRC @@ -1032,11 +1126,13 @@ set(PHY_SRC ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pbch.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/edci.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pcfich.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pch.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/srs_modulation.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/drs_modulation.c @@ -1047,16 +1143,21 @@ set(PHY_SRC ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/rar_tools.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/print_stats.c ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/initial_sync.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if5_tools.c ${OPENAIR1_DIR}/PHY/MODULATION/ofdm_mod.c ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep.c ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c ${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c + ${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c + ${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_time.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_timefreq.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_est_freq_offset.c @@ -1078,13 +1179,16 @@ set(PHY_SRC ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c ${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c - ${OPENAIR1_DIR}/PHY/CODING/rate_matching.c ${OPENAIR1_DIR}/PHY/CODING/viterbi.c ${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c ${OPENAIR1_DIR}/PHY/INIT/lte_init.c + ${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.c + ${OPENAIR1_DIR}/PHY/INIT/lte_init_ue.c + ${OPENAIR1_DIR}/PHY/INIT/init_top.c ${OPENAIR1_DIR}/PHY/INIT/lte_parms.c ${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c + ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c ${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c ${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c ${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c @@ -1096,14 +1200,117 @@ set(PHY_SRC ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c ${OPENAIR1_DIR}/PHY/TOOLS/lut.c ) + +set(PHY_SRC_UE + # depend on code generation from asn1c + ${RRC_FULL_DIR}/asn1_constants.h + # actual source + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pss.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/sss.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pilots_mbsfn.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_coding.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_modulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_demodulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_llr_computation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/power_control.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_decoding.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_scrambling.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/uci_tools.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pbch.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/edci.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pcfich.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pucch.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pch.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/group_hopping.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/srs_modulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/drs_modulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_modulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_demodulation.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_coding.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/ulsch_decoding.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/rar_tools.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/print_stats.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/initial_sync.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if4_tools.c + ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/if5_tools.c + ${OPENAIR1_DIR}/PHY/MODULATION/ofdm_mod.c + ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep.c + ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c + ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_ul.c + ${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz.c + ${OPENAIR1_DIR}/PHY/MODULATION/beamforming.c + ${OPENAIR1_DIR}/PHY/MODULATION/compute_bf_weights.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/freq_equalization.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_time.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_timefreq.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_adjust_sync.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_est_freq_offset.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ue_measurements.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_eNB_measurements.c + ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/adjust_gain.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_cell_spec.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_uespec.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_gold.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_gold_mbsfn.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_mbsfn.c + ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_ul_ref.c + ${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c + ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c + ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c + ${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c + ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c + ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c + ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c + ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c + ${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c + ${OPENAIR1_DIR}/PHY/CODING/viterbi.c + ${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c + ${OPENAIR1_DIR}/PHY/INIT/lte_init_ru.c + ${OPENAIR1_DIR}/PHY/INIT/lte_init_ue.c + ${OPENAIR1_DIR}/PHY/INIT/init_top.c + ${OPENAIR1_DIR}/PHY/INIT/lte_parms.c + ${OPENAIR1_DIR}/PHY/INIT/lte_param_init.c + ${OPENAIR1_DIR}/PHY/TOOLS/file_output.c + ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c + ${OPENAIR1_DIR}/PHY/TOOLS/lte_dfts.c + ${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c + ${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c + ${OPENAIR1_DIR}/PHY/TOOLS/cmult_vv.c + ${OPENAIR1_DIR}/PHY/TOOLS/cdot_prod.c + ${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c + ${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c + ${OPENAIR1_DIR}/PHY/TOOLS/sqrt.c + ${OPENAIR1_DIR}/PHY/TOOLS/time_meas.c + ${OPENAIR1_DIR}/PHY/TOOLS/lut.c + ) + if (${SMBV}) set(PHY_SRC "${PHY_SRC} ${OPENAIR1_DIR}/PHY/TOOLS/smbv.c") endif (${SMBV}) + +if (${COMPILATION_AVX2} STREQUAL "True") + set(PHY_SRC ${PHY_SRC} ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.c) + set(PHY_SRC_UE ${PHY_SRC_UE} ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.c) +endif () + add_library(PHY ${PHY_SRC}) +add_library(PHY_UE ${PHY_SRC_UE}) #Layer 2 library ##################### set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC) +set(PHY_INTERFACE_DIR ${OPENAIR2_DIR}/PHY_INTERFACE) set(RLC_DIR ${OPENAIR2_DIR}/LAYER2/RLC) set(RLC_UM_DIR ${OPENAIR2_DIR}/LAYER2/RLC/UM_v9.3.0) set(RLC_AM_DIR ${OPENAIR2_DIR}/LAYER2/RLC/AM_v9.3.0) @@ -1152,14 +1359,61 @@ set(L2_SRC ${RRC_DIR}/rrc_eNB_UE_context.c ${RRC_DIR}/rrc_common.c ${RRC_DIR}/L2_interface.c + ${RRC_DIR}/L2_interface_common.c + ${RRC_DIR}/L2_interface_ue.c ) + +set(L2_SRC_UE + ${OPENAIR2_DIR}/LAYER2/openair2_proc.c + ${PDCP_DIR}/pdcp.c + ${PDCP_DIR}/pdcp_fifo.c + ${PDCP_DIR}/pdcp_sequence_manager.c + ${PDCP_DIR}/pdcp_primitives.c + ${PDCP_DIR}/pdcp_util.c + ${PDCP_DIR}/pdcp_security.c + ${PDCP_DIR}/pdcp_netlink.c + ${RLC_AM_DIR}/rlc_am.c + ${RLC_AM_DIR}/rlc_am_init.c + ${RLC_AM_DIR}/rlc_am_timer_poll_retransmit.c + ${RLC_AM_DIR}/rlc_am_timer_reordering.c + ${RLC_AM_DIR}/rlc_am_timer_status_prohibit.c + ${RLC_AM_DIR}/rlc_am_segment.c + ${RLC_AM_DIR}/rlc_am_segments_holes.c + ${RLC_AM_DIR}/rlc_am_in_sdu.c + ${RLC_AM_DIR}/rlc_am_receiver.c + ${RLC_AM_DIR}/rlc_am_retransmit.c + ${RLC_AM_DIR}/rlc_am_windows.c + ${RLC_AM_DIR}/rlc_am_rx_list.c + ${RLC_AM_DIR}/rlc_am_reassembly.c + ${RLC_AM_DIR}/rlc_am_status_report.c + ${RLC_TM_DIR}/rlc_tm.c + ${RLC_TM_DIR}/rlc_tm_init.c + ${RLC_UM_DIR}/rlc_um.c + ${RLC_UM_DIR}/rlc_um_fsm.c + ${RLC_UM_DIR}/rlc_um_control_primitives.c + ${RLC_UM_DIR}/rlc_um_segment.c + ${RLC_UM_DIR}/rlc_um_reassembly.c + ${RLC_UM_DIR}/rlc_um_receiver.c + ${RLC_UM_DIR}/rlc_um_dar.c + ${RLC_DIR}/rlc_mac.c + ${RLC_DIR}/rlc.c + ${RLC_DIR}/rlc_rrc.c + ${RLC_DIR}/rlc_mpls.c + ${RRC_DIR}/rrc_UE.c + ${RRC_DIR}/rrc_common.c + ${RRC_DIR}/L2_interface_common.c + ${RRC_DIR}/L2_interface_ue.c + ) + set (MAC_SRC - ${MAC_DIR}/lte_transport_init.c + ${PHY_INTERFACE_DIR}/IF_Module.c ${MAC_DIR}/main.c + ${MAC_DIR}/main_ue.c ${MAC_DIR}/ue_procedures.c ${MAC_DIR}/ra_procedures.c ${MAC_DIR}/l1_helpers.c ${MAC_DIR}/rar_tools.c + ${MAC_DIR}/rar_tools_ue.c ${MAC_DIR}/eNB_scheduler.c ${MAC_DIR}/eNB_scheduler_dlsch.c ${MAC_DIR}/eNB_scheduler_ulsch.c @@ -1169,7 +1423,28 @@ set (MAC_SRC ${MAC_DIR}/eNB_scheduler_RA.c ${MAC_DIR}/pre_processor.c ${MAC_DIR}/config.c - ) + ${MAC_DIR}/config_ue.c + ) + +set (MAC_SRC_UE + ${MAC_DIR}/main_ue.c + ${MAC_DIR}/ue_procedures.c + ${MAC_DIR}/ra_procedures.c + ${MAC_DIR}/l1_helpers.c + ${MAC_DIR}/rar_tools_ue.c + ${MAC_DIR}/config_ue.c + ) + + +if (FLEXRAN_AGENT_SB_IF) + +set (MAC_SRC ${MAC_SRC} + ${MAC_DIR}/flexran_agent_scheduler_dlsch_ue.c + ${MAC_DIR}/flexran_agent_scheduler_dataplane.c + ${MAC_DIR}/flexran_agent_scheduler_dlsch_ue_remote.c +) + +endif() set (ENB_APP_SRC ${OPENAIR2_DIR}/ENB_APP/enb_app.c @@ -1182,6 +1457,22 @@ add_library(L2 ${ENB_APP_SRC}) # ${OPENAIR2_DIR}/RRC/L2_INTERFACE/openair_rrc_L2_interface.c) +add_library(L2_UE + ${L2_SRC_UE} + ${MAC_SRC_UE} +) + + +include_directories(${NFAPI_USER_DIR}) + +if (FLEXRAN_AGENT_SB_IF) + +#Test for adding a shared library +add_library(default_sched SHARED ${MAC_DIR}/flexran_agent_scheduler_dlsch_ue.c) +add_library(remote_sched SHARED ${MAC_DIR}/flexran_agent_scheduler_dlsch_ue_remote.c) + +endif() + # L3 Libs ########################## @@ -1211,26 +1502,6 @@ if (${ENABLE_RAL}) set(RAL_LIB RAL) endif() -if(${MIH_C_MEDIEVAL_EXTENSIONS}) - set(MIH_SRC - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_header_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_msg_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_primitive_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F1_basic_data_types_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F2_general_data_types_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F3_data_types_for_address_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F4_data_types_for_links_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F9_data_types_for_qos_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_F13_data_types_for_information_elements_codec.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_L2_type_values_for_tlv_encoding.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_Medieval_extensions.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C_bit_buffer.c - ${RAL_LTE_DIR}INTERFACE-802.21/C/MIH_C.c - ) - add_library(MIH ${MIH_SRC}) - set(MIH_LIB MIH) -endif() - # CN libs ########################## @@ -1268,7 +1539,7 @@ set(libnas_api_OBJS ${NAS_SRC}COMMON/API/NETWORK/nas_message.c ${NAS_SRC}COMMON/API/NETWORK/network_api.c ) - + set(libnas_emm_msg_OBJS ${NAS_SRC}COMMON/EMM/MSG/AttachAccept.c ${NAS_SRC}COMMON/EMM/MSG/AttachComplete.c @@ -1301,7 +1572,7 @@ set(libnas_emm_msg_OBJS ${NAS_SRC}COMMON/EMM/MSG/TrackingAreaUpdateRequest.c ${NAS_SRC}COMMON/EMM/MSG/UplinkNasTransport.c ) - + set(libnas_esm_msg_OBJS ${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c ${NAS_SRC}COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c @@ -1421,7 +1692,7 @@ set (libnas_utils_OBJS ${NAS_SRC}COMMON/UTIL/OctetString.c ) -if(NAS_UE) +if(NAS_UE) set(libnas_ue_api_OBJS ${NAS_SRC}UE/API/USER/at_command.c ${NAS_SRC}UE/API/USER/at_error.c @@ -1542,7 +1813,6 @@ add_library(LFDS ${lfds}/lfds611_abstraction/lfds611_abstraction_malloc.c ) - set(lfds7 ${OPENAIR2_DIR}/UTIL/LFDS/liblfds7.0.0/liblfds700/src/) file(GLOB lfds7_queue ${lfds7}/lfds700_queue/*.c) file(GLOB lfds7_ring ${lfds7}/lfds700_ringbuffer/*.c) @@ -1572,6 +1842,7 @@ ${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_tv_channel.c ${OPENAIR1_DIR}/SIMULATION/RF/rf.c ${OPENAIR1_DIR}/SIMULATION/RF/dac.c ${OPENAIR1_DIR}/SIMULATION/RF/adc.c +${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ) add_library(SIMU_ETH @@ -1579,14 +1850,20 @@ ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/socket.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c -${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/emu_transport.c -${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/pgm_link.c +#${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/emu_transport.c ) add_library(OPENAIR0_LIB ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c ) +include_directories("${NFAPI_DIR}/nfapi/public_inc") +include_directories("${NFAPI_DIR}/common/public_inc") +include_directories("${NFAPI_DIR}/pnf/public_inc") +include_directories("${NFAPI_DIR}/nfapi/inc") +include_directories("${NFAPI_DIR}/sim_common/inc") +include_directories("${NFAPI_DIR}/pnf_sim/inc") + # System packages that are required # We use either the cmake buildin, in ubuntu are in: /usr/share/cmake*/Modules/ # or cmake provide a generic interface to pkg-config that widely used @@ -1623,11 +1900,25 @@ endif() pkg_search_module(NETTLE nettle) if(NOT ${NETTLE_FOUND}) - message("PACKAGE nettle not found: some targets will fail") + message( FATAL_ERROR "PACKAGE nettle not found: some targets will fail. Run build_oai -I again!") else() include_directories(${NETTLE_INCLUDE_DIRS}) endif() +message ("NETTLE VERSION_INSTALLED = ${NETTLE_VERSION}") + +string(REGEX REPLACE "([0-9]+).*" "\\1" NETTLE_VERSION_MAJOR ${NETTLE_VERSION}) +string(REGEX REPLACE "[0-9]+\\.([0-9]+).*" "\\1" NETTLE_VERSION_MINOR ${NETTLE_VERSION}) +message ("NETTLE_VERSION_MAJOR = ${NETTLE_VERSION_MAJOR}") +message ("NETTLE_VERSION_MINOR = ${NETTLE_VERSION_MINOR}") + +if ("${NETTLE_VERSION_MAJOR}" STREQUAL "" OR "${NETTLE_VERSION_MINOR}" STREQUAL "") + message( FATAL_ERROR "The nettle version not detected properly. Try to run build_oai -I again" ) +endif() + +add_definitions("-DNETTLE_VERSION_MAJOR=${NETTLE_VERSION_MAJOR}") +add_definitions("-DNETTLE_VERSION_MINOR=${NETTLE_VERSION_MINOR}") + pkg_search_module(XPM xpm) if(NOT ${XPM_FOUND}) message("PACKAGE xpm not found: some targets will fail") @@ -1636,9 +1927,25 @@ else() endif() # Atlas is required by some packages, but not found in pkg-config -if(EXISTS "/usr/include/atlas/cblas.h") +# So, here are some hacks here. Hope this gets fixed in future! +if(EXISTS "/usr/include/atlas/cblas.h" OR EXISTS "/usr/include/cblas.h") include_directories("/usr/include/atlas") - list(APPEND ATLAS_LIBRARIES lapack cblas atlas) + LINK_DIRECTORIES("/usr/lib64") + LINK_DIRECTORIES("/usr/lib64/atlas") #Added because atlas libraries in CentOS 7 are here! + + if(EXISTS "/usr/lib64/libblas.so" OR EXISTS "/usr/lib/libblas.so") #Case for CentOS7 + list(APPEND ATLAS_LIBRARIES blas) + else() # Case for Ubuntu + list(APPEND ATLAS_LIBRARIES cblas) + endif() + + if(EXISTS "/usr/lib/atlas/libtatlas.so" OR EXISTS "/usr/lib64/atlas/libtatlas.so") #Case for CentOS7 + list(APPEND ATLAS_LIBRARIES tatlas) + else() + list(APPEND ATLAS_LIBRARIES atlas) #Case for Ubuntu + endif() + + list(APPEND ATLAS_LIBRARIES lapack) else() message("No Blas/Atlas libs found, some targets will fail") endif() @@ -1701,34 +2008,37 @@ add_executable(lte-softmodem ${rrc_h} ${s1ap_h} ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIR_TARGETS}/RT/USER/sched_dlsch.c - ${OPENAIR_TARGETS}/RT/USER/sched_rx_pdsch.c ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c ${OPENAIR_TARGETS}/RT/USER/lte-ue.c + ${OPENAIR_TARGETS}/RT/USER/lte-enb.c + ${OPENAIR_TARGETS}/RT/USER/lte-ru.c ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c ${OPENAIR_TARGETS}/COMMON/create_tasks.c + ${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c + ${OPENAIR_DIR}/common/utils/utils.c + ${OPENAIR_DIR}/common/utils/system.c ${GTPU_need_ITTI} - ${HW_SOURCE} - ${TRANSPORT_SOURCE} - ${RTAI_SOURCE} ${XFORMS_SOURCE} ${XFORMS_SOURCE_SOFTMODEM} ${T_SOURCE} + ${CONFIG_SOURCES} + ${SHLIB_LOADER_SOURCES} ) -target_link_libraries (lte-softmodem -ldl +target_link_libraries (lte-softmodem -Wl,--start-group - RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} ${FSPT_MSG_LIB} ${ASYNC_IF_LIB} ${PROTO_AGENT_LIB} LFDS7 protobuf-c - -Wl,--end-group ) + RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} LFDS7 + NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB + NFAPI_USER_LIB + -Wl,--end-group z dl) target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES}) -target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt ${PROTOBUF_LIB} crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ) -target_link_libraries (lte-softmodem ${LIBBOOST_LIBRARIES} -lboost_system) #Added manually as it is not found for some reason for USRP +target_link_libraries (lte-softmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES}) target_link_libraries (lte-softmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (lte-softmodem ${T_LIB}) @@ -1738,72 +2048,38 @@ add_executable(lte-softmodem-nos1 ${rrc_h} ${s1ap_h} ${OPENAIR_BIN_DIR}/messages_xml.h - ${OPENAIR_TARGETS}/RT/USER/sched_dlsch.c - ${OPENAIR_TARGETS}/RT/USER/sched_rx_pdsch.c ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c ${OPENAIR_TARGETS}/RT/USER/lte-ue.c + ${OPENAIR_TARGETS}/RT/USER/lte-enb.c + ${OPENAIR_TARGETS}/RT/USER/lte-ru.c ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c ${OPENAIR_TARGETS}/COMMON/create_tasks.c + ${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR2_DIR}/RRC/NAS/rb_config.c ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c - ${HW_SOURCE} - ${TRANSPORT_SOURCE} - ${RTAI_SOURCE} + ${OPENAIR_DIR}/common/utils/system.c ${XFORMS_SOURCE} ${XFORMS_SOURCE_SOFTMODEM} ${T_SOURCE} + ${CONFIG_SOURCES} + ${SHLIB_LOADER_SOURCES} ) target_link_libraries (lte-softmodem-nos1 -Wl,--start-group - RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY LFDS ${RAL_LIB} ${ITTI_LIB} ${MIH_LIB} - -Wl,--end-group ) + RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} LFDS7 + NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB + NFAPI_USER_LIB + -Wl,--end-group z dl ) target_link_libraries (lte-softmodem-nos1 ${LIBXML2_LIBRARIES}) -target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt ${PROTOBUF_LIB} crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} ${XFORMS_LIBRARIES} ) -target_link_libraries (lte-softmodem-nos1 ${LIBBOOST_LIBRARIES} -lboost_system) #Added manually as it is not found for some reason for USRP +target_link_libraries (lte-softmodem-nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${XFORMS_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES}) target_link_libraries (lte-softmodem-nos1 ${LIB_LMS_LIBRARIES}) target_link_libraries (lte-softmodem-nos1 ${T_LIB}) -# rrh -################################ -#Note: only one RF type (USRP) is currently supported for RRH -add_executable(rrh_gw - ${OPENAIR_TARGETS}/RT/USER/rrh_gw.c - ${OPENAIR_TARGETS}/RT/USER/eNB_transport_IQ.c - ${OPENAIR_TARGETS}/RT/USER/UE_transport_IQ.c - ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c - ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c - ${HW_SOURCE} - ${TRANSPORT_SOURCE} - ${T_SOURCE} - ) -target_include_directories(rrh_gw PRIVATE ${OPENAIR_DIR}/common/utils/itti) -target_link_libraries(rrh_gw - -Wl,--start-group - UTIL LFDS - -Wl,--end-group ) -target_link_libraries (rrh_gw rt pthread m ) -target_link_libraries (rrh_gw ${option_HW_lib} ${option_TP_lib} ${LIBBOOST_LIBRARIES} -lboost_system ) #Added manually as it is not found for some reason for USRP -target_link_libraries (rrh_gw ${LIB_LMS_LIBRARIES}) -target_link_libraries (rrh_gw ${T_LIB}) - -Message("-- option_HW_lib=${option_HW_lib}") -Message("-- HW_SOURCE=${HW_SOURCE}") -Message("-- option_TP_lib=${option_TP_lib}") -Message("-- TRANSPORT_SOURCE=${TRANSPORT_SOURCE}") - -if (${RF_BOARD} STREQUAL "OAI_LMSSDR") - add_dependencies(lte-softmodem LMS7002M LMS_SDR Si5351C) - add_dependencies(lte-softmodem-nos1 LMS7002M LMS_SDR Si5351C) - add_dependencies(rrh_gw LMS7002M LMS_SDR Si5351C) -endif (${RF_BOARD} STREQUAL "OAI_LMSSDR") - - - # USIM process ################# #add_executable(usim @@ -1838,6 +2114,9 @@ add_executable(oaisim ${s1ap_h} ${x2ap_h} ${OPENAIR_BIN_DIR}/messages_xml.h + ${OPENAIR_TARGETS}/RT/USER/lte-ue.c + ${OPENAIR_TARGETS}/RT/USER/lte-ru.c + ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c ${OPENAIR_TARGETS}/SIMU/USER/channel_sim.c ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c ${OPENAIR_TARGETS}/SIMU/USER/oaisim_config.c @@ -1846,34 +2125,38 @@ add_executable(oaisim ${OPENAIR_TARGETS}/SIMU/USER/oaisim_functions.c ${OPENAIR_TARGETS}/SIMU/USER/event_handler.c ${OPENAIR_TARGETS}/SIMU/USER/oaisim.c + ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR2_DIR}/RRC/NAS/rb_config.c - ${OPENAIR2_DIR}/UTIL/OMG/sumo.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c + ${OPENAIR_DIR}/common/utils/utils.c + ${OPENAIR_DIR}/common/utils/system.c ${GTPU_need_ITTI} - ${OPENAIR_TARGETS}/COMMON/create_tasks.c - ${HW_SOURCE} - ${TRANSPORT_SOURCE} + ${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c ${XFORMS_SOURCE} ${T_SOURCE} + ${CONFIG_SOURCES} + ${SHLIB_LOADER_SOURCES} ) target_include_directories(oaisim PUBLIC ${OPENAIR_TARGETS}/SIMU/USER) target_link_libraries (oaisim - -Wl,--start-group - RRC_LIB S1AP_LIB S1AP_ENB ${FSPT_MSG_LIB} ${ASYNC_IF_LIB} ${PROTO_AGENT_LIB} LFDS7 X2AP_LIB GTPV1U SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} LIB_NAS_UE SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB} - -Wl,--end-group ) + -Wl,-ldl,--start-group + RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_UE_LIB PHY_UE LFDS L2 ${MSC_LIB} LIB_NAS_UE SIMU SECU_OSA ${ITTI_LIB} ${MIH_LIB} + ${ASYNC_IF_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} LFDS7 + NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB + NFAPI_USER_LIB + -Wl,--end-group z dl) target_link_libraries (oaisim ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES}) -target_link_libraries (oaisim pthread m ${PROTOBUF_LIB} ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${option_HW_lib} ${option_TP_lib} - ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES}) +target_link_libraries (oaisim pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp z + ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES} ) #Force link with forms, regardless XFORMS option target_link_libraries (oaisim forms) target_link_libraries (oaisim ${T_LIB}) - # A all in one network simulator ################ add_executable(oaisim_nos1 @@ -1881,6 +2164,9 @@ add_executable(oaisim_nos1 ${s1ap_h} ${x2ap_h} ${OPENAIR_BIN_DIR}/messages_xml.h + ${OPENAIR_TARGETS}/RT/USER/lte-ue.c + ${OPENAIR_TARGETS}/RT/USER/lte-ru.c + ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c ${OPENAIR_TARGETS}/SIMU/USER/channel_sim.c ${OPENAIR_TARGETS}/SIMU/USER/init_lte.c ${OPENAIR_TARGETS}/SIMU/USER/oaisim_config.c @@ -1889,32 +2175,52 @@ add_executable(oaisim_nos1 ${OPENAIR_TARGETS}/SIMU/USER/oaisim_functions.c ${OPENAIR_TARGETS}/SIMU/USER/event_handler.c ${OPENAIR_TARGETS}/SIMU/USER/oaisim.c + ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR2_DIR}/RRC/NAS/rb_config.c - ${OPENAIR2_DIR}/UTIL/OMG/sumo.c - ${OPENAIR_TARGETS}/COMMON/create_tasks.c - ${HW_SOURCE} - ${TRANSPORT_SOURCE} + ${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c + ${OPENAIR_DIR}/common/utils/system.c ${XFORMS_SOURCE} ${T_SOURCE} + ${CONFIG_SOURCES} + ${SHLIB_LOADER_SOURCES} ) target_include_directories(oaisim_nos1 PUBLIC ${OPENAIR_TARGETS}/SIMU/USER) target_link_libraries (oaisim_nos1 -Wl,--start-group - RRC_LIB X2AP_LIB SECU_CN UTIL HASHTABLE SCHED_LIB PHY LFDS ${MSC_LIB} L2 ${RAL_LIB} SIMU SIMU_ETH SECU_OSA ${ITTI_LIB} ${MIH_LIB} ${FSPT_MSG_LIB} ${ASYNC_IF_LIB} ${PROTO_AGENT_LIB} LFDS7 protobuf-c - -Wl,--end-group ) + RRC_LIB X2AP_LIB SECU_CN UTIL HASHTABLE SCHED_UE_LIB PHY_UE LFDS ${MSC_LIB} ${ITTI_LIB} SIMU L2_UE ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 + ${ASYNC_IF_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB} LFDS7 + NFAPI_USER_LIB + -Wl,--end-group z dl ) target_link_libraries (oaisim_nos1 ${LIBXML2_LIBRARIES} ${LAPACK_LIBRARIES}) -target_link_libraries (oaisim_nos1 pthread m ${PROTOBUF_LIB} ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${option_HW_lib} ${option_TP_lib} - ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES}) +target_link_libraries (oaisim_nos1 pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} + ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${OPENPGM_LIBRARIES} ${PROTOBUF_LIB} ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES}) #Force link with forms, regardless XFORMS option target_link_libraries (oaisim_nos1 forms) + +#message("protobuflib is ${PROTOBUF_LIB}") + target_link_libraries (oaisim_nos1 ${T_LIB}) + # Unitary tests for each piece of L1: example, mbmssim is MBMS L1 simulator ##################################### -foreach(myExe dlsim ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim) +#special case for dlim TM4, which uses its own version of phy_scope code +add_executable(dlsim_tm4 + ${OPENAIR_BIN_DIR}/messages_xml.h + ${OPENAIR1_DIR}/SIMULATION/LTE_PHY/dlsim_tm4.c + ${OPENAIR1_DIR}/PHY/TOOLS/lte_phy_scope_tm4.c + ${T_SOURCE} + ) +target_link_libraries (dlsim_tm4 + -Wl,--start-group SIMU UTIL SCHED_LIB PHY LFDS ${ITTI_LIB} -Wl,--end-group + pthread m rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} + ) + +foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim) + add_executable(${myExe} ${OPENAIR_BIN_DIR}/messages_xml.h ${OPENAIR1_DIR}/SIMULATION/LTE_PHY/${myExe}.c @@ -1922,7 +2228,8 @@ foreach(myExe dlsim ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syn ${T_SOURCE} ) target_link_libraries (${myExe} - -Wl,--start-group SIMU UTIL SCHED_LIB PHY LFDS ${ITTI_LIB} -Wl,--end-group + + -Wl,--start-group SIMU UTIL SCHED_LIB PHY LFDS ${ITTI_LIB} LFDS7 -Wl,--end-group pthread m rt ${CONFIG_LIBRARIES} ${ATLAS_LIBRARIES} ${XFORMS_LIBRARIES} ${T_LIB} ) endforeach(myExe) @@ -1938,7 +2245,7 @@ add_executable(test_epc_generate_scenario ${OPENAIR_BIN_DIR}/messages_xml.h ) target_link_libraries (test_epc_generate_scenario - -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} + -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} ) add_executable(test_epc_play_scenario @@ -1959,7 +2266,7 @@ add_executable(test_epc_play_scenario ) target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c) target_link_libraries (test_epc_play_scenario - -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} + -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} ) @@ -1976,11 +2283,10 @@ foreach(myExe s1ap aes128_cmac_encrypt secu_knas_encrypt_eia2) add_executable(test_${myExe} - ${OPENAIR3_DIR}/TEST/test_util.c ${OPENAIR3_DIR}/TEST/test_${myExe}.c ) target_link_libraries (test_${myExe} - -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} + -Wl,--start-group SECU_CN UTIL LFDS -Wl,--end-group m rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES} ) endforeach(myExe) @@ -1990,20 +2296,22 @@ endforeach(myExe) #ensure that the T header files are generated before targets depending on them if (${T_TRACER}) - add_dependencies(lte-softmodem generate_T) - add_dependencies(lte-softmodem-nos1 generate_T) - add_dependencies(rrh_gw generate_T) - add_dependencies(oaisim generate_T) - add_dependencies(oaisim_nos1 generate_T) - add_dependencies(dlsim generate_T) - add_dependencies(ulsim generate_T) - add_dependencies(pbchsim generate_T) - add_dependencies(scansim generate_T) - add_dependencies(mbmssim generate_T) - add_dependencies(pdcchsim generate_T) - add_dependencies(pucchsim generate_T) - add_dependencies(prachsim generate_T) - add_dependencies(syncsim generate_T) + foreach(i + #all "add_executable" definitions (except tests, rb_tool, updatefw) + lte-softmodem lte-softmodem-nos1 oaisim oaisim_nos1 + dlsim_tm4 dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim + pdcchsim pucchsim prachsim syncsim + #all "add_library" definitions + ITTI RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB + oai_exmimodevif oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif + oai_eth_transpro + FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA + SECU_CN SCHED_LIB PHY L2 default_sched remote_sched RAL CN_UTILS + GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB) + if (TARGET ${i}) + add_dependencies(${i} generate_T) + endif() + endforeach(i) endif (${T_TRACER}) ################################################## @@ -2028,11 +2336,16 @@ endforeach() # force castxml and clang compilation with gnu89 standard # we can't use cXX standard as pthread_rwlock_t is gnu standard list(APPEND itti_compiler_options "-std=gnu89") - set (ITTI_H ${ITTI_DIR}/intertask_interface_types.h) +if(EXISTS /usr/bin/gccxml) + set(xml_command gccxml ${itti_compiler_options} -fxml=${OPENAIR_BIN_DIR}/messages.xml ${ITTI_H}) +else() + set(xml_command castxml --castxml-gccxml ${itti_compiler_options} ${ITTI_H} -o ${OPENAIR_BIN_DIR}/messages.xml) +endif() + add_custom_command ( OUTPUT ${OPENAIR_BIN_DIR}/messages.xml - COMMAND gccxml ${itti_compiler_options} -fxml=${OPENAIR_BIN_DIR}/messages.xml ${ITTI_H} + COMMAND ${xml_command} DEPENDS ${S1AP_OAI_generated} ${RRC_FULL_DIR}/asn1_constants.h ) @@ -2055,7 +2368,6 @@ get_directory_property(DirDefs COMPILE_DEFINITIONS ) foreach( d ${DirDefs} ) set(module_cc_opt_tmp "${module_cc_opt_tmp} -D${d}") endforeach() -string(REPLACE "-DUSER_MODE" "" module_cc_opt ${module_cc_opt_tmp}) get_directory_property( DirDefs INCLUDE_DIRECTORIES ) foreach( d ${DirDefs} ) set(module_cc_opt "${module_cc_opt} -I${d}") @@ -2087,15 +2399,7 @@ endfunction(make_driver name dir src) # nashmesh module ################ list(APPEND nasmesh_src device.c common.c ioctl.c classifier.c tool.c mesh.c) -# Actually nasty stuff to be FIXED: the hereafter flag is for RTAI compilation in the driver, -# but has different meaning in the other parts of the code -# We should change the constant name to xxx_RTAI or likely -if(NOT ${module_cc_opt} MATCHES "DRTAI") - set(module_cc_opt "${module_cc_opt} -DNAS_NETLINK") -else() - string(REPLACE "-DNAS_NETLINK" "" tmp "${module_cc_opt}") - set(module_cc_opt ${tmp}) -endif() +set(module_cc_opt "${module_cc_opt} -DNAS_NETLINK -DPDCP_USE_NETLINK") # legacy Makefile was using NAS_NETLINK flag, but other drivers the hereafter flag # so, this cmake use OAI_NW_DRIVER_USE_NETLINK everywhere if (OAI_NW_DRIVER_USE_NETLINK) @@ -2142,16 +2446,16 @@ make_driver(ue_ip ${OPENAIR2_DIR}/NETWORK_DRIVER/UE_IP ${ue_ip_src}) # OCTAVE tools ############### set(OCT_INCL -I${OPENAIR_TARGETS}/ARCH/EXMIMO/DEFS -I${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/LIB -I${OPENAIR_TARGETS}/ARCH/COMMON) -set(OCT_LIBS -L${CMAKE_CURRENT_BINARY_DIR} -lm -lOPENAIR0_LIB) +set(OCT_LIBS -L${CMAKE_CURRENT_BINARY_DIR} -lm -lOPENAIR0_LIB) set(OCT_FLAGS -DEXMIMO) set(OCT_DIR ${OPENAIR_TARGETS}/ARCH/EXMIMO/USERSPACE/OCTAVE) set(OCT_FILES oarf_config_exmimo.oct - oarf_config_exmimo.oct - oarf_get_frame.oct - oarf_stop.oct - oarf_send_frame.oct - oarf_get_num_detected_cards.oct + oarf_config_exmimo.oct + oarf_get_frame.oct + oarf_stop.oct + oarf_send_frame.oct + oarf_get_num_detected_cards.oct oarf_stop_without_reset.oct ) @@ -2161,7 +2465,7 @@ foreach(file IN ITEMS ${OCT_FILES}) OUTPUT ${file} DEPENDS ${OCT_DIR}/${src} OPENAIR0_LIB COMMAND mkoctfile - ARGS ${OCT_FLAGS} ${OCT_INCL} ${OCT_LIBS} + ARGS ${OCT_FLAGS} ${OCT_INCL} ${OCT_LIBS} ARGS -o ${file} ${OCT_DIR}/${src} COMMENT "Generating ${file}" VERBATIM diff --git a/cmake_targets/at_commands/CMakeLists.txt b/cmake_targets/at_commands/CMakeLists.txt index 0b8bfed25b..54f369f977 100755 --- a/cmake_targets/at_commands/CMakeLists.txt +++ b/cmake_targets/at_commands/CMakeLists.txt @@ -1,30 +1,26 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # Author: Lionel GAUTHIER -############################################################################### + cmake_minimum_required(VERSION 2.8) set(CMAKE_VERBOSE_MAKEFILE ON) @@ -92,13 +88,47 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -std=gnu99 -Wall -Wstrict-prototype set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb -DMALLOC_CHECK_=3") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -ggdb -DMALLOC_CHECK_=3 -O2") +##This is to detect nettle version changes between Ubuntu 14.04/16.04 +#set ( nettle_cmd "nettle-hash" ) +#set ( nettle_arg "-V" ) +#execute_process(COMMAND ${nettle_cmd} ${nettle_arg} RESULT_VARIABLE rv OUTPUT_VARIABLE ov ERROR_VARIABLE ev) +# +#string(REGEX MATCH "[+-]?[0-9]+([.][0-9]+)?" nv ${ov}) +# +#message("NETTLE_VERSION = ${nv}") +# +## we need to remove decimal as floating point arithematic does not work properly with C preprocessor +#STRING(REGEX REPLACE "[.]" "" nv ${nv}) +# +#if ("${nv}" STREQUAL "") +# message( FATAL_ERROR "The nettle version not detected properly. Try to run build_oai -I again" ) +#endif() +# +#set (NETTLE_VERSION "${nv}") +#add_definitions("-DNETTLE_VERSION=${NETTLE_VERSION}") include(FindPkgConfig) -INCLUDE(FindNettle) -IF( NOT NETTLE_FOUND ) - MESSAGE( SEND_ERROR "Nettle is required" ) -ENDIF( NOT NETTLE_FOUND ) +pkg_search_module(NETTLE nettle) +if(NOT ${NETTLE_FOUND}) + message( FATAL_ERROR "PACKAGE nettle not found: some targets will fail. Run build_oai -I again!") +else() + include_directories(${NETTLE_INCLUDE_DIRS}) +endif() + +message ("NETTLE VERSION_INSTALLED = ${NETTLE_VERSION}") + +string(REGEX REPLACE "([0-9]+).*" "\\1" NETTLE_VERSION_MAJOR ${NETTLE_VERSION}) +string(REGEX REPLACE "[0-9]+\\.([0-9]+).*" "\\1" NETTLE_VERSION_MINOR ${NETTLE_VERSION}) +message ("NETTLE_VERSION_MAJOR = ${NETTLE_VERSION_MAJOR}") +message ("NETTLE_VERSION_MINOR = ${NETTLE_VERSION_MINOR}") + +if ("${NETTLE_VERSION_MAJOR}" STREQUAL "" OR "${NETTLE_VERSION_MINOR}" STREQUAL "") + message( FATAL_ERROR "The nettle version not detected properly. Try to run build_oai -I again" ) +endif() + +add_definitions("-DNETTLE_VERSION_MAJOR=${NETTLE_VERSION_MAJOR}") +add_definitions("-DNETTLE_VERSION_MINOR=${NETTLE_VERSION_MINOR}") pkg_search_module(OPENSSL openssl REQUIRED) @@ -201,8 +231,8 @@ set(api_user_HDR add_library(api_user ${api_user_SRC} ${api_user_HDR}) target_include_directories(api_user PRIVATE ${OPENAIR_NAS_DIR}/UE/API/USER - ${OPENAIR_NAS_DIR}/UE ${OPENAIR_NAS_DIR}/COMMON + ${OPENAIR_NAS_DIR}/UE ) ################################################################################ @@ -383,6 +413,7 @@ target_include_directories(emm PRIVATE ${OPENAIR_DIR}/common/utils/msc ${OPENAIR_DIR}/common/utils ${OPENAIR_DIR}/openair2/COMMON + ${OPENAIR_NAS_DIR}/UE ${OPENAIR_NAS_DIR}/UE/API/USIM ${OPENAIR_NAS_DIR}/UE/EMM ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG @@ -395,7 +426,6 @@ target_include_directories(emm PRIVATE # esm LIB ################################################################################ set(esm_SRC - ${OPENAIR_NAS_DIR}/UE/ESM/esm_main.c ${OPENAIR_NAS_DIR}/UE/ESM/DedicatedEpsBearerContextActivation.c ${OPENAIR_NAS_DIR}/UE/ESM/DefaultEpsBearerContextActivation.c ${OPENAIR_NAS_DIR}/UE/ESM/EpsBearerContextDeactivation.c @@ -438,6 +468,7 @@ set(esm_SRC ) set(esm_HDR + ${OPENAIR_TARGETS}/COMMON/openairinterface5g_limits.h ${OPENAIR_NAS_DIR}/UE/ESM/esm_main.h ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h @@ -467,13 +498,17 @@ set(esm_HDR ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_recv.h ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_sap.h ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_send.h + ${OPENAIR_DIR}/common/utils/utils.h ) add_library(esm ${esm_SRC} ${esm_HDR}) target_include_directories(esm PRIVATE + ${OPENAIR_DIR}/common/utils + ${OPENAIR_NAS_DIR}/UE ${OPENAIR_NAS_DIR}/UE/API/USER ${OPENAIR_NAS_DIR}/UE/ESM + ${OPENAIR_TARGETS}/COMMON ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG ${OPENAIR_NAS_DIR}/UE/ESM/SAP ${OPENAIR_NAS_DIR}/COMMON/IES @@ -656,6 +691,9 @@ target_include_directories(ies PRIVATE # EXECUTABLE at_nas_ue ################################################################################ include_directories( + ${OPENAIR_TARGETS}/COMMON + ${OPENAIR_NAS_DIR}/UE + ${OPENAIR_DIR}/common/utils ${OPENAIR_DIR}/common/utils/msc ${OPENAIR3_DIR}/COMMON ${OPENAIR3_DIR}/SECU @@ -677,6 +715,8 @@ ADD_EXECUTABLE(at_nas_ue ${OPENAIR_NAS_DIR}/UE/UEprocess.c ${OPENAIR_NAS_DIR}/UE/nas_parser.c ${OPENAIR_NAS_DIR}/UE/nas_proc.c ${OPENAIR_NAS_DIR}/UE/nas_user.c + ${OPENAIR_DIR}/common/utils/utils.c + ${OPENAIR_DIR}/common/utils/system.c ) target_link_libraries (at_nas_ue diff --git a/cmake_targets/autotests/README.txt b/cmake_targets/autotests/README.txt index cf1e28dd05..b94d99bff7 100644 --- a/cmake_targets/autotests/README.txt +++ b/cmake_targets/autotests/README.txt @@ -1,5 +1,4 @@ OAI Test PLAN -#UNDER CONSTRUCTION. Not correct at the moment Obj.# Case# Test# Description @@ -16,17 +15,22 @@ Obj.# Case# Test# Description 01 01 20 Build lte-softmodem.USRP.Rel10 01 01 21 Build lte-softmodem.EXMIMO.Rel10 01 01 22 Build lte-softmodem.BLADERF.Rel10 -01 01 23 Build lte-softmodem.ETHERNET.Rel10 +01 01 23 Build lte-softmodem.ETHERNET.Rel10 (RCC) 01 01 24 Build lte-softmodem.LMSSDR.Rel10 01 01 30 Build (dlsim.Rel10 + ulsim.Rel10 + pucchsim.Rel10 + prachsim.Rel10 + pdcchsim.Rel10 + pbchsim.Rel10 + mbmssim.Rel10 secu_knas_encrypt_eia1.Rel10 secu_kenb.Rel10 aes128_ctr_encrypt.Rel10 aes128_ctr_decrypt.Rel10 secu_knas_encrypt_eea2.Rel10 secu_knas.Rel10 secu_knas_encrypt_eea1.Rel10 kdf.Rel10 aes128_cmac_encrypt.Rel10 secu_knas_encrypt_eia2.Rel10) -01 01 40 Build RRH Gateway for USRP (Rel 10) -01 01 41 Build RRH Gateway for EXMIMO (Rel 10) -01 01 42 Build RRH Gateway for BLADERF (Rel 10) -01 01 43 Build RRH Gateway for LMSSDR (Rel 10) +01 01 40 Build RRH Gateway (time domain) for USRP (Rel 10) +01 01 41 Build RRH Gateway (time domain) for EXMIMO (Rel 10) +01 01 42 Build RRH Gateway (time domain) for BLADERF (Rel 10) +01 01 43 Build RRH Gateway (time domain) for LMSSDR (Rel 10) + +01 01 50 Build RRU (NGFI) for USRP (Rel 10) w/ ETHERNET transport +01 01 51 Build RRU (NGFI) for EXMIMO (Rel 10) w/ ETHERNET transport +01 01 52 Build RRU (NGFI) for BLADERF (Rel 10) w/ ETHERNET transport +01 01 53 Build RRU (NGFI) for LMSSDR (Rel 10) w/ ETHERNET transport 01 02 Run OAISIM-NOS1 Rel10 (TDD + 5MHz/10MHz/20MHz + TM 1,2), and check the operation @@ -97,27 +101,46 @@ Obj.# Case# Test# Description 01 51 04 pdcchsim (TBD) 01 51 05 pbchsim (TBD) 01 51 06 mbmssim (TBD) +01 51 10 dlsim_tm4 test cases (Test 1: 10 MHz, R2.FDD (MCS 5), EVA5, -1dB), + (Test 5: 1.4 MHz, R4.FDD (MCS 4), EVA5, 0dB (70%)), + (Test 6: 10 MHz, R3.FDD (MCS 15), EVA5, 6.7dB (70%)), + (Test 6b: 5 MHz, R3-1.FDD (MCS 15), EVA5, 6.7dB (70%)), + (Test 7: 5 MHz, R3-1.FDD (MCS 15), EVA5, 6.7dB (30%)), + (Test 7b: 5 MHz, R3-1.FDD (MCS 15), ETU70, 1.4 dB (30%)), + (Test 10: 5 MHz, R6.FDD (MCS 25), EVA5, 17.4 dB (70%)), + (Test 10b: 5 MHz, R6-1.FDD (MCS 24,18 PRB), EVA5, 17.5dB (70%)), + (Test 11: 10 MHz, R7.FDD (MCS 25), EVA5, 17.7dB (70%)) + (TM2 Test 1 10 MHz, R.11 FDD (MCS 14), EVA5, 6.8 dB (70%)), + (TM2 Test 1b 20 MHz, R.11-2 FDD (MCS 13), EVA5, 5.9 dB (70%)), -01 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX, 2TX/2RX + + +01 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX (TM1), 2TX/2RX (TM2) 01 55 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 01 55 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 01 55 02 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 01 55 03 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 1TX/1RX 01 55 04 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 1TX/1RX 01 55 05 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 1TX/1RX -01 55 06 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX -01 55 07 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX -01 55 08 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX -01 55 09 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX -01 55 10 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX -01 55 11 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX +01 55 06 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 55 07 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 55 08 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 55 09 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 55 10 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 55 11 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) 01 55 12 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 1TX/1RX 01 55 13 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 1TX/1RX 01 55 14 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 1TX/1RX 01 55 15 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 01 55 16 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 01 55 17 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX +01 55 18 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 55 19 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 55 20 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 55 21 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 55 22 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 55 23 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) 01 56 lte-softmodem tests with USRP B210 RF as eNB and OAI EPC (eNB and EPC are on same machines) w/ Bandrich COTS UE 01 56 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX @@ -135,7 +158,7 @@ Obj.# Case# Test# Description 01 57 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 57 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -01 58 lte-softmodem tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for `TX/1RX, 2TX/2RX +01 58 lte-softmodem tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX (TM1), 2TX/2RX(TM2) 01 58 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 01 58 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 01 58 02 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX @@ -148,6 +171,18 @@ Obj.# Case# Test# Description 01 58 09 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 01 58 10 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 01 58 11 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX +01 58 12 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 13 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 14 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 15 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 16 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 17 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 58 18 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 58 19 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 58 20 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 58 21 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 58 22 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 58 23 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) 01 59 lte-softmodem tests with USRP X310 RF as eNB and OAI EPC (eNB and EPC are on same machines) w/ Bandrich COTS UE @@ -160,7 +195,7 @@ Obj.# Case# Test# Description 01 60 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 60 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -01 61 lte-softmodem tests with EXMIMO RF as eNB and ALU EPC w/ Bandrich COTS UE for `TX/1RX, 2TX/2RX +01 61 lte-softmodem tests with EXMIMO RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX, 2TX/2RX 01 61 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 61 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 61 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX @@ -178,7 +213,7 @@ Obj.# Case# Test# Description 01 63 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 63 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -01 65 00 lte-softmodem tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX +01 65 lte-softmodem tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for 1TX/1RX 01 65 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 65 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 65 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX @@ -187,7 +222,7 @@ Obj.# Case# Test# Description 01 65 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -01 70 00 lte-softmodem tests with SoDeRa RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX +01 70 lte-softmodem tests with SoDeRa RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX 01 70 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 70 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 70 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX @@ -196,7 +231,7 @@ Obj.# Case# Test# Description 01 70 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -01 75 00 lte-softmodem + RRH tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX +01 75 lte-softmodem + RRU (NGFI IF4P5, RAW) tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX 01 75 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 75 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 75 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX @@ -204,7 +239,21 @@ Obj.# Case# Test# Description 01 75 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 75 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -01 80 00 lte-softmodem + RRH tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX +01 76 lte-softmodem + RRU (NGFI IF4P5, UDP) tests with B210 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX +01 76 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX +01 76 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX +01 76 02 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX +01 76 03 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 1TX/1RX +01 76 04 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 1TX/1RX +01 76 05 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 1TX/1RX +01 76 06 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 1TX/1RX +01 76 07 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 1TX/1RX +01 76 08 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 1TX/1RX +01 76 09 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX +01 76 10 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX +01 76 11 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX + +01 80 lte-softmodem + RRU (NGFI) tests with BladeRF RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX 01 80 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 80 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 80 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX @@ -212,7 +261,7 @@ Obj.# Case# Test# Description 01 80 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 80 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -01 85 00 lte-softmodem + RRH tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX +01 85 lte-softmodem + RRU (NGFI) tests with USRP X310 RF as eNB and ALU EPC w/ Bandrich COTS UE for TX/1RX 01 85 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX 01 85 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX 01 85 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX @@ -220,7 +269,33 @@ Obj.# Case# Test# Description 01 85 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX 01 85 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX -02 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Sony Experia M4 COTS UE for TX/1RX +01 86 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Huawei e3276 COTS UE for 1TX/1RX (TM1), 2TX/2RX (TM2) +01 86 00 Band 38 TDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX +01 86 01 Band 38 TDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX +01 86 02 Band 38 TDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX +01 86 03 Band 38 TDD 5MHz DL Throughput (UDP) for 300 sec for 1TX/1RX +01 86 04 Band 38 TDD 10MHz DL Throughput (UDP) for 300 sec for 1TX/1RX +01 86 05 Band 38 TDD 20MHz DL Throughput (UDP) for 300 sec for 1TX/1RX +01 86 06 Band 38 TDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 86 07 Band 38 TDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 86 08 Band 38 TDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 86 09 Band 38 TDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 86 10 Band 38 TDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 86 11 Band 38 TDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +01 86 12 Band 38 TDD 5MHz UL Throughput (TCP) for 300 sec for 1TX/1RX +01 86 13 Band 38 TDD 10MHz UL Throughput (TCP) for 300 sec for 1TX/1RX +01 86 14 Band 38 TDD 20MHz UL Throughput (TCP) for 300 sec for 1TX/1RX +01 86 15 Band 38 TDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX +01 86 16 Band 38 TDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX +01 86 17 Band 38 TDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX +01 86 18 Band 38 TDD 5MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 86 19 Band 38 TDD 10MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 86 20 Band 38 TDD 20MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 86 21 Band 38 TDD 5MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 86 22 Band 38 TDD 10MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +01 86 23 Band 38 TDD 20MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) + +02 55 lte-softmodem tests with USRP B210 RF as eNB and ALU EPC w/ Sony Experia M4 COTS UE for 1TX/1RX and 2TX/2RX (TM2) 02 55 00 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 02 55 01 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 1TX/1RX 02 55 02 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 1TX/1RX @@ -233,7 +308,27 @@ Obj.# Case# Test# Description 02 55 09 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 02 55 10 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 1TX/1RX 02 55 11 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 1TX/1RX - +02 55 12 Band 7 FDD 5MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 13 Band 7 FDD 10MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 14 Band 7 FDD 20MHz UL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 15 Band 7 FDD 5MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 16 Band 7 FDD 10MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 17 Band 7 FDD 20MHz DL Throughput (UDP) for 300 sec for 2TX/2RX (TM2) +02 55 18 Band 7 FDD 5MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +02 55 19 Band 7 FDD 10MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +02 55 20 Band 7 FDD 20MHz UL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +02 55 21 Band 7 FDD 5MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +02 55 22 Band 7 FDD 10MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) +02 55 23 Band 7 FDD 20MHz DL Throughput (TCP) for 300 sec for 2TX/2RX (TM2) + +02 57 lte-softmodem tests with USRP B210 RF as eNB and OAI EPC (eNB and EPC are on different machines) w/ OAI UE +02 57 00 Band 7 FDD 5MHz UL Throughput for 300 sec for 1TX/1RX +02 57 01 Band 7 FDD 10MHz UL Throughput for 300 sec for 1TX/1RX +02 57 02 Band 7 FDD 20MHz UL Throughput for 300 sec for 1TX/1RX +02 57 03 Band 7 FDD 5MHz DL Throughput for 300 sec for 1TX/1RX +02 57 04 Band 7 FDD 10MHz DL Throughput for 300 sec for 1TX/1RX +02 57 05 Band 7 FDD 20MHz DL Throughput for 300 sec for 1TX/1RX + 01 64 lte-softmodem-noS1 tests @@ -249,4 +344,4 @@ Obj.# Case# Test# Description #TODO: Add test cases for 10,20 MHz #TODO: Add test cases for TDD/FDD #TODO: Test and compile seperately for Rel8/Rel10 -#TODO: Case03.py eMBMS test case \ No newline at end of file +#TODO: Case03.py eMBMS test case diff --git a/cmake_targets/autotests/core.py b/cmake_targets/autotests/core.py index 5b1f39a85b..09785df120 100644 --- a/cmake_targets/autotests/core.py +++ b/cmake_targets/autotests/core.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file core.py # \brief OAI core testing class that provides various primitives to send/recv cmd to openair class searching for patterns and process the responses and tag the test case as passed/failed/skipped diff --git a/cmake_targets/autotests/log.py b/cmake_targets/autotests/log.py index 0b4baff3e9..5a97b19cf2 100644 --- a/cmake_targets/autotests/log.py +++ b/cmake_targets/autotests/log.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file log.py # \brief provides primitives and defines how the logs and statistics are generated diff --git a/cmake_targets/autotests/openair.py b/cmake_targets/autotests/openair.py index 1079c466a8..beb12cd2a2 100644 --- a/cmake_targets/autotests/openair.py +++ b/cmake_targets/autotests/openair.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file openair.py # \brief class that define the oaisim class and its attributes @@ -83,7 +75,7 @@ class openair(core): return (stdout, stderr) def connect(self, username, password, prompt='PEXPECT_OAI'): - max_retries=100 + max_retries=10 i=0 while i <= max_retries: self.prompt1 = prompt @@ -105,9 +97,9 @@ class openair(core): # need to look for twice the string of the prompt self.oai.prompt() self.oai.prompt() - self.oai.sendline('uptime') - self.oai.prompt() - print self.oai.before +# self.oai.sendline('uptime') +# self.oai.prompt() +# print self.oai.before break except Exception, e: error='' @@ -179,7 +171,7 @@ class openair(core): sys.exit(1) def disconnect(self): - print 'disconnecting the ssh connection to ' + self.address + '\n' +# print 'disconnecting the ssh connection to ' + self.address + '\n' self.oai.send('exit') # self.cancel() diff --git a/cmake_targets/autotests/run_compilation_autotests.bash b/cmake_targets/autotests/run_compilation_autotests.bash index a7b056dc81..10e4caa04b 100755 --- a/cmake_targets/autotests/run_compilation_autotests.bash +++ b/cmake_targets/autotests/run_compilation_autotests.bash @@ -1,4 +1,26 @@ #!/bin/bash +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# \author Navid Nikaein, Rohit Gupta if [ -s $OPENAIR_DIR/cmake_targets/tools/build_helper ] ; then source $OPENAIR_DIR/cmake_targets/tools/build_helper diff --git a/cmake_targets/autotests/run_exec_autotests.bash b/cmake_targets/autotests/run_exec_autotests.bash index 2d3f193b30..ff38ae9d3c 100755 --- a/cmake_targets/autotests/run_exec_autotests.bash +++ b/cmake_targets/autotests/run_exec_autotests.bash @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta if [ -s $OPENAIR_DIR/cmake_targets/tools/build_helper ] ; then diff --git a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py index eed2fffb77..65bcfd5af8 100755 --- a/cmake_targets/autotests/run_exec_lte-softmodem_tests.py +++ b/cmake_targets/autotests/run_exec_lte-softmodem_tests.py @@ -1,38 +1,33 @@ #! /usr/bin/python -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ - -# \author Rohit Gupta +# \author Rohit Gupta - Benoit ROBERT (benoit.robert@syrtem.com) # \version 0.1 # @ingroup _test +# \Changelog +# 2016-11-18 : +# - Add progess bar during test execution update_progress() + import tempfile import threading import sys @@ -46,6 +41,10 @@ import math #from time import clock import xml.etree.ElementTree as ET import re +#from dict2xml import dict2xml as xmlify + +from colorama import Fore, Back, Style + import numpy as np import log @@ -64,6 +63,36 @@ import ssh from ssh import SSHSession import argparse + +# update_progress() : Displays or updates a console progress bar +## Accepts a float between 0 and 1. Any int will be converted to a float. +## A value under 0 represents a 'halt'. +## A value at 1 or bigger represents 100% +def update_progress(progress, prefix_string): + barLength = 20 # Modify this to change the length of the progress bar + status = "" + #print "progress = "+ str(progress) + if isinstance(progress, int): + progress = float(progress) + if not isinstance(progress, float): + progress = 0 + status = "error: progress var must be float\r\n" + if progress < 0: + progress = 0 + status = "Halt...\r\n" + if progress >= 1: + progress = 1 + status = "Done...\r\n" + block = int(round(barLength*progress)) + text = "\r"+prefix_string+" [{0}] {1}% {2}".format( "="*block + " "*(barLength-block), progress*100, status) + sys.stdout.write(text) + sys.stdout.flush() + + +def exit_prog(exit_val): + print(Style.RESET_ALL), + sys.exit(exit_val) + # \brief write a string to a file # \param filename name of file # \param string string to write @@ -176,7 +205,7 @@ def sftp_module (username, password, hostname, ports, paramList,logfile): #paramiko logfile path should not be changed with multiple calls. The logs seem to in first file regardless error = "" #The lines below are outside exception loop to be sure to terminate the test case if the network connectivity goes down or there is authentication failure - transport = paramiko.Transport(hostname, ports) + transport = paramiko.Transport((hostname, ports)) transport.connect(username = username, password = password) sftp = paramiko.SFTPClient.from_transport(transport) # index =0 @@ -278,7 +307,7 @@ def update_config_file(oai, config_string, logdirRepo, python_script): # \param logdir_local_base local directory # \param operation operation to perform (get_all, put_all) transfers recursively for directories def SSHSessionWrapper(machine, username, key_file, password, logdir_remote, logdir_local_base, operation): - max_tries = 100 + max_tries = 10 i=0 while i <= max_tries: i = i +1 @@ -313,30 +342,50 @@ def SSHSessionWrapper(machine, username, key_file, password, logdir_remote, logd # \param CleanUpAluLteBox program to terminate AlU Bell Labs LTE Box # \param ExmimoRfStop String to stop EXMIMO card (specified in test_case_list.xml) def cleanOldPrograms(oai, programList, CleanUpAluLteBox, ExmimoRfStop, logdir, logdirOAI5GRepo): - cmd = 'sudo -E killall -9 -q -r ' + programList + cmd = 'killall -9 ' + programList result = oai.send(cmd, True) - print "Killing old programs..." + result +# print "\t\t > "+cmd +# print "\t\t < "+result + +# print "Killing old programs on ..." + result programArray = programList.split() programListJoin = '|'.join(programArray) cmd = " ( date ;echo \"Starting cleaning old programs.. \" ; dmesg|tail ; echo \"Current disk space.. \" ; df -h )>& " + logdir + "/oai_test_setup_cleanup.log.`hostname` 2>&1 ; sync" result=oai.send_recv(cmd) +# print "\t\t > "+cmd +# print "\t\t < "+result + cmd = cleanupOldProgramsScript + ' ' + '\''+programListJoin+'\'' #result = oai.send_recv(cmd) #print result result = oai.send_expect_false(cmd, 'Match found', False) - print "Looking for old programs..." + result +# print "\t\t > "+cmd +# print "\t\t < "+result + +# print "Looking for old programs..." + result res=oai.send_recv(CleanUpAluLteBox, True) +# print "\t\t > "+CleanUpAluLteBox +# print "\t\t < "+res cmd= " echo \"Starting EXmimoRF Stop... \" >> " + logdir + "/oai_test_setup_cleanup.log.`hostname` 2>&1 ; sync "; - oai.send_recv(cmd) + result = oai.send_recv(cmd) +# print "\t\t > "+cmd +# print "\t\t < "+result cmd = "( " + "cd " + logdirOAI5GRepo + " ; source oaienv ; " + ExmimoRfStop + " ) >> " + logdir + "/oai_test_setup_cleanup.log.`hostname` 2>&1 ; sync " - print "cleanoldprograms cmd = " + cmd +# print "cleanoldprograms cmd = " + cmd res=oai.send_recv(cmd, False, timeout=600) +# print "\t\t > "+cmd +# print "\t\t < "+res + cmd= " echo \"Stopping EXmimoRF Stop... \" >> " + logdir + "/oai_test_setup_cleanup.log.`hostname` 2>&1 ; sync "; - oai.send_recv(cmd) + result = oai.send_recv(cmd) +# print "\t\t > "+cmd +# print "\t\t < "+result #res = oai.send_recv(ExmimoRfStop, False) cmd = " ( date ;echo \"Finished cleaning old programs.. \" ; dmesg | tail)>> $HOME/.oai_test_setup_cleanup.log.`hostname` 2>&1 ; sync" res=oai.send_recv(cmd) +# print "\t\t > "+cmd +# print "\t\t < "+res # \brief Class thread to launch a generic command on remote machine # \param threadID number of thread (for book keeping) @@ -362,10 +411,10 @@ class oaiThread (threading.Thread): try: oai = openair('localdomain',self.machine) oai.connect(self.username, self.password) - print "Starting " + self.threadname + " on machine " + self.machine + # print "Starting " + self.threadname + " on machine " + self.machine result = oai.send_recv(self.cmd, self.sudo, self.timeout) - print "result = " + result - print "Exiting " + self.threadname + #print "result = " + result + #print "Exiting " + self.threadname oai.disconnect() except Exception, e: error='' @@ -559,7 +608,7 @@ def wait_testcaseclass_generic_threads(threadListGeneric, timeout = 1): # \param CleanupAluLteBox string that contains commands to stop ALU Bell Labs LTEBox (specified in test_case_list.xml) # \param ExmimoRfStop command to stop EXMIMO Card # \param nruns_lte-softmodem global parameter to override number of runs (nruns) within the test case -def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , logdirOpenaircnRepo, MachineList, user, password, CleanUpAluLteBox, ExmimoRfStop, nruns_lte_softmodem, timeout_cmd): +def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , logdirOpenaircnRepo, MachineList, user, password, CleanUpAluLteBox, ExmimoRfStop, nruns_lte_softmodem, GitOAI5GRepoBranch, GitOpenaircnRepoBranch,timeout_cmd): #We ignore the password sent to this function for secuirity reasons for password present in log files #It is recommended to add a line in /etc/sudoers that looks something like below. The line below will run sudo without password prompt # your_user_name ALL=(ALL:ALL) NOPASSWD: ALL @@ -582,14 +631,15 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , tags = testcase.findtext('tags',default='') RRHMachine = testcase.findtext('RRH',default='') + RRH_config_file = testcase.findtext('RRH_config_file',default='') RRH_compile_prog = testcase.findtext('RRH_compile_prog',default='') RRH_compile_prog_args = testcase.findtext('RRH_compile_prog_args',default='') RRH_pre_exec = testcase.findtext('RRH_pre_exec',default='') RRH_pre_exec_args = testcase.findtext('RRH_pre_exec_args',default='') RRH_main_exec = testcase.findtext('RRH_main_exec',default='') RRH_main_exec_args = testcase.findtext('RRH_main_exec_args',default='') - RRH_terminate_missing_procs = testcase.findtext('RRH_terminate_missing_procs',default='True') - + RRH_terminate_missing_procs = testcase.findtext('RRH_terminate_missing_procs',default='False') + RRH_branch = testcase.findtext('RRH_branch',default=GitOAI5GRepoBranch) eNBMachine = testcase.findtext('eNB',default='') eNB_config_file = testcase.findtext('eNB_config_file',default='') @@ -601,10 +651,11 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , eNB_main_exec_args = testcase.findtext('eNB_main_exec_args',default='') eNB_traffic_exec = testcase.findtext('eNB_traffic_exec',default='') eNB_traffic_exec_args = testcase.findtext('eNB_traffic_exec_args',default='') - eNB_terminate_missing_procs = testcase.findtext('eNB_terminate_missing_procs',default='True') + eNB_terminate_missing_procs = testcase.findtext('eNB_terminate_missing_procs',default='False') eNB_search_expr_true = testcase.findtext('eNB_search_expr_true','') if re.compile('\w+').match(eNB_search_expr_true) != None: eNB_search_expr_true = eNB_search_expr_true + ' duration=' + str(timeout_cmd-90) + 's' + eNB_branch = testcase.findtext('eNB_branch',default=GitOAI5GRepoBranch) UEMachine = testcase.findtext('UE',default='') UE_config_file = testcase.findtext('UE_config_file',default='') @@ -616,11 +667,12 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , UE_main_exec_args = testcase.findtext('UE_main_exec_args',default='') UE_traffic_exec = testcase.findtext('UE_traffic_exec',default='') UE_traffic_exec_args = testcase.findtext('UE_traffic_exec_args',default='') - UE_terminate_missing_procs = testcase.findtext('UE_terminate_missing_procs',default='True') + UE_terminate_missing_procs = testcase.findtext('UE_terminate_missing_procs',default='False') UE_search_expr_true = testcase.findtext('UE_search_expr_true','') UE_stop_script = testcase.findtext('UE_stop_script','') if re.compile('\w+').match(UE_search_expr_true) != None: UE_search_expr_true = UE_search_expr_true + ' duration=' + str(timeout_cmd-90) + 's' + UE_branch = testcase.findtext('UE_branch',default=GitOAI5GRepoBranch) EPCMachine = testcase.findtext('EPC',default='') EPC_config_file = testcase.findtext('EPC_config_file',default='') @@ -637,8 +689,10 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , HSS_main_exec_args = testcase.findtext('HSS_main_exec_args',default='') EPC_traffic_exec = testcase.findtext('EPC_traffic_exec',default='') EPC_traffic_exec_args = testcase.findtext('EPC_traffic_exec_args',default='') - EPC_terminate_missing_procs = testcase.findtext('EPC_terminate_missing_procs',default='True') + EPC_terminate_missing_procs = testcase.findtext('EPC_terminate_missing_procs',default='False') EPC_search_expr_true = testcase.findtext('EPC_search_expr_true','') + EPC_branch = testcase.findtext('EPC_branch',default=GitOpenaircnRepoBranch) + if re.compile('\w+').match(EPC_search_expr_true) != None: EPC_search_expr_true = EPC_search_expr_true + ' duration=' + str(timeout_cmd-90) + 's' @@ -695,7 +749,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , logdir_local_testcase = logdir_local + '/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run) #Make the log directory of test case if RRHMachine != '': - cmd = 'rm -fr ' + logdir_RRH + ' ; mkdir -p ' + logdir_RRH + cmd = 'rm -fr ' + logdir_RRH + ' ; mkdir -p ' + logdir_RRH result = oai_RRH.send_recv(cmd) cmd = 'rm -fr ' + logdir_eNB + ' ; mkdir -p ' + logdir_eNB result = oai_eNB.send_recv(cmd) @@ -715,8 +769,10 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , logfile_task_RRH_out = logdir_RRH + '/RRH_task_out' + '_' + str(run) + '_.log' logfile_task_RRH = logdir_local_testcase + '/RRH_task' + '_' + str(run) + '_.log' task_RRH_compile = ' ( uname -a ; date \n' - task_RRH_compile = task_RRH_compile + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n' + task_RRH_compile = task_RRH_compile + 'cd ' + logdirOAI5GRepo + '; git reset --hard HEAD ; git checkout ' + RRH_branch + ' ; source oaienv \n' + task_RRH_compile = task_RRH_compile + ' source cmake_targets/tools/build_helper \n' task_RRH_compile = task_RRH_compile + 'env |grep OPENAIR \n' + task_RRH_compile = task_RRH_compile + update_config_file(oai_RRH, RRH_config_file, logdirOAI5GRepo, '$OPENAIR_DIR/cmake_targets/autotests/tools/search_repl.py') + '\n' if RRH_compile_prog != "": task_RRH_compile = task_RRH_compile + ' ( ' + RRH_compile_prog + ' '+ RRH_compile_prog_args + ' ) > ' + logfile_compile_RRH + ' 2>&1 \n' task_RRH_compile = task_RRH_compile + ' date ) > ' + logfile_task_RRH_compile_out + ' 2>&1 ' @@ -754,7 +810,8 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , logfile_pcap_tmp_eNB = '/tmp/' + '/eNB_tshark' + '_' + str(run) + '_.pcap' task_eNB_compile = ' ( uname -a ; date \n' - task_eNB_compile = task_eNB_compile + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n' + task_eNB_compile = task_eNB_compile + 'cd ' + logdirOAI5GRepo + '; git reset --hard HEAD ; git checkout ' + eNB_branch + ' ; source oaienv \n' + task_eNB_compile = task_eNB_compile + ' source cmake_targets/tools/build_helper \n' task_eNB_compile = task_eNB_compile + 'env |grep OPENAIR \n' task_eNB_compile = task_eNB_compile + update_config_file(oai_eNB, eNB_config_file, logdirOAI5GRepo, '$OPENAIR_DIR/cmake_targets/autotests/tools/search_repl.py') + '\n' if eNB_compile_prog != "": @@ -804,8 +861,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , task_UE_compile = ' ( uname -a ; date \n' task_UE_compile = task_UE_compile + 'array_exec_pid=()' + '\n' - task_UE_compile = task_UE_compile + 'cd ' + logdirOAI5GRepo + '\n' - task_UE_compile = task_UE_compile + 'source oaienv \n' + task_UE_compile = task_UE_compile + 'cd ' + logdirOAI5GRepo + '; git reset --hard HEAD ; git checkout ' + UE_branch + ' ; source oaienv \n' task_UE_compile = task_UE_compile + 'source cmake_targets/tools/build_helper \n' task_UE_compile = task_UE_compile + 'env |grep OPENAIR \n' task_UE_compile = task_UE_compile + update_config_file(oai_UE, UE_config_file, logdirOAI5GRepo, '$OPENAIR_DIR/cmake_targets/autotests/tools/search_repl.py') + '\n' @@ -855,7 +911,7 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , task_EPC_compile = ' ( uname -a ; date \n' task_EPC_compile = task_EPC_compile + 'array_exec_pid=()' + '\n' - task_EPC_compile = task_EPC_compile + 'cd ' + logdirOpenaircnRepo + ' ; source oaienv \n' + task_EPC_compile = task_EPC_compile + 'cd ' + logdirOpenaircnRepo + '; git reset --hard HEAD ; git checkout ' + EPC_branch + ' ; source oaienv \n' task_EPC_compile = task_EPC_compile + update_config_file(oai_EPC, EPC_config_file, logdirOpenaircnRepo, logdirOpenaircnRepo+'/TEST/autotests/tools/search_repl.py') + '\n' task_EPC_compile = task_EPC_compile + 'source BUILD/TOOLS/build_helper \n' if EPC_compile_prog != "": @@ -894,27 +950,28 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , task_EPC = task_EPC + ' ) > ' + logfile_task_EPC_out + ' 2>&1 ' write_file(logfile_task_EPC, task_EPC, mode="w") - #first we compile all the programs - thread_EPC = oaiThread(1, "EPC_thread", EPCMachine, user, password , task_EPC_compile, False, timeout_thread) - thread_eNB = oaiThread(2, "eNB_thread", eNBMachine, user, password , task_eNB_compile, False, timeout_thread) - thread_UE = oaiThread(3, "UE_thread", UEMachine, user, password , task_UE_compile, False, timeout_thread) - if RRHMachine != '': - thread_RRH = oaiThread(4, "RRH_thread", RRHMachine, user, password , task_RRH_compile, False, timeout_thread) - threads=[] - threads.append(thread_eNB) - threads.append(thread_UE) - threads.append(thread_EPC) - if RRHMachine != '': - threads.append(thread_RRH) - # Start new Threads - thread_eNB.start() - thread_UE.start() - thread_EPC.start() - if RRHMachine != '': - thread_RRH.start() - #Wait for all the compile threads to complete - for t in threads: - t.join() + #first we compile all the programs but only for run_0 + if run == 0: + thread_EPC = oaiThread(1, "EPC_thread", EPCMachine, user, password , task_EPC_compile, False, timeout_thread) + thread_eNB = oaiThread(2, "eNB_thread", eNBMachine, user, password , task_eNB_compile, False, timeout_thread) + thread_UE = oaiThread(3, "UE_thread", UEMachine, user, password , task_UE_compile, False, timeout_thread) + if RRHMachine != '': + thread_RRH = oaiThread(4, "RRH_thread", RRHMachine, user, password , task_RRH_compile, False, timeout_thread) + threads=[] + threads.append(thread_eNB) + threads.append(thread_UE) + threads.append(thread_EPC) + if RRHMachine != '': + threads.append(thread_RRH) + # Start new Threads + thread_eNB.start() + thread_UE.start() + thread_EPC.start() + if RRHMachine != '': + thread_RRH.start() + #Wait for all the compile threads to complete + for t in threads: + t.join() #Now we execute all the threads thread_EPC = oaiThread(1, "EPC_thread", EPCMachine, user, password , task_EPC, False, timeout_thread) @@ -1050,6 +1107,665 @@ def handle_testcaseclass_softmodem (testcase, oldprogramList, logdirOAI5GRepo , write_file(xmlFile, xml, mode="w") + + +# \brief handler for executing test cases (lte-softmodem-noS1) +# \param testcase name of testcase +# \param oldprogramList list of programs which must be terminated before running a test case +# \param logdirOAI5GRepo directory on remote machine which has openairinterface5g repo installed +# \param logdirOpenaircnRepo directory on remote machine which has openair-cn repo installed +# \param MachineList list of all machines on which test cases can be run +# \param user username with which to login +# \param password password with which to login +# \param CleanupAluLteBox string that contains commands to stop ALU Bell Labs LTEBox (specified in test_case_list.xml) +# \param ExmimoRfStop command to stop EXMIMO Card +# \param nruns_lte-softmodem global parameter to override number of runs (nruns) within the test case +def handle_testcaseclass_softmodem_noS1 (testcase, oldprogramList, logdirOAI5GRepo , logdirOpenaircnRepo, MachineList, user, password, CleanUpAluLteBox, ExmimoRfStop, nruns_lte_softmodem, timeout_cmd): + #We ignore the password sent to this function for secuirity reasons for password present in log files + #It is recommended to add a line in /etc/sudoers that looks something like below. The line below will run sudo without password prompt + # your_user_name ALL=(ALL:ALL) NOPASSWD: ALL + + indent="\t" + threads=[] + + # + # Test case parameters + # ----------------------------------------------------------------------------- + testcase_verdict = 'PASS' + testcase_time_start = datetime.datetime.now() + testcase_name = testcase.get('id') + testcase_class = testcase.findtext('class',default='') + testcase_desc = testcase.findtext('desc',default='') + if timeout_cmd == '': + timeout_cmd = testcase.findtext('TimeOut_cmd',default='') + timeout_cmd = int(float(timeout_cmd)) + timeout_thread = timeout_cmd + 60 #Timeout_thread is more than that of cmd to have room for compilation time, etc + if nruns_lte_softmodem == '': + nruns = testcase.findtext('nruns',default='') + else: + nruns = nruns_lte_softmodem + nruns = int(float(nruns)) + tags = testcase.findtext('tags',default='') + + max_ntries = testcase.findtext('max_ntries',default='') + if max_ntries : + max_ntries = int(float(max_ntries)) + else : + max_ntries = nruns + + print( indent + "> testcase time start : " + str(testcase_time_start) ) + print( indent + "> testcase class : " + testcase_class ) + print( indent + "> testcase description : " + testcase_desc ) + print( indent + "> testcase timeout : " + str(timeout_cmd) ) + print( indent + "> testcase thread timeout : " + str(timeout_thread) ) + print( indent + "> number of runs : " + str(nruns) ) + print( indent + "> number of max tries : " + str(max_ntries) ) + print( indent + "> testcase tags : " + tags ) + + logdir_local_testcase = openairdir_local + '/cmake_targets/autotests/log/'+ testcasename + logdir_eNB_testcase = logdirOAI5GRepo +'/cmake_targets/autotests/log/'+ testcasename + logdir_UE_testcase = logdirOAI5GRepo +'/cmake_targets/autotests/log/'+ testcasename + + # + # Local checks for test cases + # ----------------------------------------------- + + # Logging directory + if (not os.path.exists(logdir_local_testcase)): + os.system('mkdir -p ' + logdir_local_testcase) + + # + # REMOTE MACHINE COMPILATION + # ------------------------------------------------ + + eNBMachine = testcase.findtext('eNB',default='') + eNB_config_file = testcase.findtext('eNB_config_file',default='') + eNB_compile_prog = testcase.findtext('eNB_compile_prog',default='') + eNB_compile_prog_args = testcase.findtext('eNB_compile_prog_args',default='') + + logfile_compile_eNB = logdir_eNB_testcase + '/eNB_compile.log' + logfile_task_eNB_compile_out = logdir_eNB_testcase + '/eNB_task_compile_out.log' + logfile_task_eNB_compile = logdir_local_testcase + '/eNB_task_compile.log' + + # Check that machine is in test setup machine list + print( Fore.WHITE + indent + "> testcase eNB machine :"), + if (eNBMachine not in MachineList): + print( Fore.RED + eNBMachine + " not in test setup machine list") + testcase_verdict = 'INCON' + else : + print eNBMachine, + # get machine description + eNBMachineDesc = MachineDescDic[eNBMachine] + index_eNBMachine = MachineList.index(eNBMachine) + # check that openairinterface is installed on machine + oai_eNB = openair('localdomain', eNBMachine) + oai_eNB.connect(user, password) + cmd = 'cd ' + logdirOAI5GRepo + '; source oaienv ; env|grep --color=never OPENAIR' + res= oai_eNB.send_recv(cmd) + m = re.search('OPENAIR_HOME', res, re.DOTALL) + if m: + print + # Create testcase directory on remote eNB + cmd = 'rm -fr ' + logdir_eNB_testcase + ' ; mkdir -p ' + logdir_eNB_testcase + result = oai_eNB.send_recv(cmd) + + # Check if we need to compile lte-softmodem-noS1 on remote machine + eNB_compile_cmd = eNB_compile_prog + ' '+ eNB_compile_prog_args + if ('last_compile_prog' in eNBMachineDesc) and eNBMachineDesc['last_compile_prog'] == eNB_compile_cmd: + print( Fore.WHITE + indent + "> eNB machine compilation : skipped -> "+eNB_compile_cmd ) + else: + print( Fore.WHITE + indent + "> eNB machine compilation : triggered -> "+eNB_compile_cmd ) + eNBMachineDesc['last_compile_prog'] = eNB_compile_prog + ' '+ eNB_compile_prog_args # if last compilation is the same do not compile again + task_eNB_compile = ' ( uname -a ; date \n' + task_eNB_compile = task_eNB_compile + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n' + task_eNB_compile = task_eNB_compile + 'env |grep OPENAIR \n' + task_eNB_compile = task_eNB_compile + update_config_file(oai_eNB, eNB_config_file, logdirOAI5GRepo, '$OPENAIR_DIR/cmake_targets/autotests/tools/search_repl.py') + '\n' + if eNB_compile_cmd != "": + task_eNB_compile = task_eNB_compile + ' ( ' + eNB_compile_cmd + ' ) > ' + logfile_compile_eNB + ' 2>&1 \n' + task_eNB_compile = task_eNB_compile + ' date ) > ' + logfile_task_eNB_compile_out + ' 2>&1 ' + write_file(logfile_task_eNB_compile, task_eNB_compile, mode="w") + + + thread_eNB = oaiThread(1, "eNB_thread_compile", eNBMachine, user, password , task_eNB_compile, False, timeout_thread) + threads.append(thread_eNB) + thread_eNB.start() + + else: + print( Fore.RED + " -> OAI5G not properly setup ! please check REMOTE MACHINE PREPARATION step") + testcase_verdict = 'INCON' + + + UEMachine = testcase.findtext('UE',default='') + UE_config_file = testcase.findtext('UE_config_file',default='') + UE_compile_prog = testcase.findtext('UE_compile_prog',default='') + UE_compile_prog_args = testcase.findtext('UE_compile_prog_args',default='') + + logfile_compile_UE = logdir_UE_testcase + '/UE_compile.log' + logfile_task_UE_compile_out = logdir_UE_testcase + '/UE_task_compile_out.log' + logfile_task_UE_compile = logdir_local_testcase + '/UE_task_compile.log' + + # Check that machine is in test setup machine list + print( Fore.WHITE + indent + "> testcase UE machine :"), + if (UEMachine not in MachineList): + print( Fore.RED + UEMachine + " not in test setup machine list") + testcase_verdict = 'INCON' + else : + print UEMachine, + # get machine description + UEMachineDesc = MachineDescDic[UEMachine] + index_UEMachine = MachineList.index(UEMachine) + # check that openairinterface is installed on machine + oai_UE = openair('localdomain', UEMachine) + oai_UE.connect(user, password) + cmd = 'cd ' + logdirOAI5GRepo + '; source oaienv ; env|grep --color=never OPENAIR' + res= oai_UE.send_recv(cmd) + m = re.search('OPENAIR_HOME', res, re.DOTALL) + if m: + print + # Create testcase directory on remote UE + cmd = 'rm -fr ' + logdir_UE_testcase + ' ; mkdir -p ' + logdir_UE_testcase + result = oai_UE.send_recv(cmd) + + # Check if we need to compile lte-softmodem-noS1 on remote machine + UE_compile_cmd = UE_compile_prog + ' '+ UE_compile_prog_args + if ('last_compile_prog' in UEMachineDesc) and UEMachineDesc['last_compile_prog'] == UE_compile_cmd: + print( Fore.WHITE + indent + "> UE machine compilation : skipped -> "+UE_compile_cmd ) + else: + print( Fore.WHITE + indent + "> UE machine compilation : triggered -> "+UE_compile_cmd ) + UEMachineDesc['last_compile_prog'] = UE_compile_prog + ' '+ UE_compile_prog_args + task_UE_compile = ' ( uname -a ; date \n' + task_UE_compile = task_UE_compile + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n' + task_UE_compile = task_UE_compile + 'env |grep OPENAIR \n' + task_UE_compile = task_UE_compile + update_config_file(oai_UE, UE_config_file, logdirOAI5GRepo, '$OPENAIR_DIR/cmake_targets/autotests/tools/search_repl.py') + '\n' + if UE_compile_cmd != "": + task_UE_compile = task_UE_compile + ' ( ' + UE_compile_cmd + ' ) > ' + logfile_compile_UE + ' 2>&1 \n' + task_UE_compile = task_UE_compile + ' date ) > ' + logfile_task_UE_compile_out + ' 2>&1 ' + write_file(logfile_task_UE_compile, task_UE_compile, mode="w") + + thread_UE = oaiThread(2, "UE_thread_compile", UEMachine, user, password , task_UE_compile, False, timeout_thread) + threads.append(thread_UE) + thread_UE.start() + + else: + print( Fore.RED + " -> OAI5G not properly setup ! please check REMOTE MACHINE PREPARATION step") + testcase_verdict = 'INCON' + + + + + + + # Wait for Compilation thread to terminate + #----------------------------------------- + for t in threads: + t.join() + + # TODO check that compilation is succeed + + #first we compile all the programs +# thread_UE = oaiThread(3, "UE_thread", UEMachine, user, password , task_UE_compile, False, timeout_thread) +# threads.append(thread_UE) +# thread_UE.start() + + + + + +# index_UEMachine = MachineList.index(UEMachine) +# oai_UE = openair('localdomain', UEMachine) +# oai_UE.connect(user, password) +# res = oai_UE.send_recv(cmd) +# res = oai_eNB.send_recv(cmd) + + + + # + # RUN LOOP + # ------------------------------------------------ + if testcase_verdict != 'PASS': # if something went wrong to not run test cases + max_ntries=0 + + indent="\t\t" + + runs_results = [] + nb_runs = 0 + nb_run_pass = 0 + nb_run_failed = 0 + nb_run_inc = 0 + nb_run_skip = 0 + + nb_seg_fault = 0 + + for run in range(0,max_ntries): + + if nruns == nb_run_pass + nb_run_failed: + break + + nb_runs += 1 + + # + # RUN initialization + # ---------------------------------------------------- + + prefix_string = Fore.WHITE + indent + "> RUN_"+str(run).zfill(2)+" :" + +# print (Fore.WHITE + indent + "> RUN_"+str(run).zfill(2)+" : " ), +# sys.stdout.flush() + + run_start_time=datetime.datetime.now() + + logdir_local_run = openairdir_local + '/cmake_targets/autotests/log/'+ testcasename + '/run_' + str(run) + logdir_eNB_run = logdirOAI5GRepo +'/cmake_targets/autotests/log/' + testcasename + '/run_' + str(run) + logdir_UE_run = logdirOAI5GRepo +'/cmake_targets/autotests/log/' + testcasename + '/run_' + str(run) + + cmd = 'rm -fr ' + logdir_eNB_run + ' ; mkdir -p ' + logdir_eNB_run + result = oai_eNB.send_recv(cmd) + cmd = 'rm -fr ' + logdir_UE_run + ' ; mkdir -p ' + logdir_UE_run + result = oai_UE.send_recv(cmd) + cmd = ' rm -fr ' + logdir_local_run + ' ; mkdir -p ' + logdir_local_run + result = os.system(cmd) + + + # + # RUN parametrization + # ---------------------------------------------------- + eNB_pre_exec = testcase.findtext('eNB_pre_exec',default='') + eNB_pre_exec_args = testcase.findtext('eNB_pre_exec_args',default='') + eNB_main_exec = testcase.findtext('eNB_main_exec',default='') + eNB_main_exec_args = testcase.findtext('eNB_main_exec_args',default='') + eNB_traffic_exec = testcase.findtext('eNB_traffic_exec',default='') + eNB_traffic_exec_args = testcase.findtext('eNB_traffic_exec_args',default='') + eNB_terminate_missing_procs = testcase.findtext('eNB_terminate_missing_procs',default='True') + + logfile_exec_eNB = logdir_eNB_run + '/eNB_exec' + '_' + str(run) + '_.log' + logfile_pre_exec_eNB = logdir_eNB_run + '/eNB_pre_exec' + '_' + str(run) + '_.log' + logfile_task_eNB_out = logdir_eNB_run + '/eNB_task_out' + '_' + str(run) + '_.log' + logfile_traffic_eNB = logdir_eNB_run + '/eNB_traffic' + '_' + str(run) + '_.log' + logfile_task_eNB = logdir_local_run + '/eNB_task' + '_' + str(run) + '_.log' + + task_eNB = ' ( uname -a ; date \n' + task_eNB = task_eNB + 'cd ' + logdirOAI5GRepo + ' ; source oaienv ; source cmake_targets/tools/build_helper \n' + task_eNB = task_eNB + 'env |grep OPENAIR \n' + 'array_exec_pid=() \n' + if eNB_pre_exec != "": + task_eNB = task_eNB + ' ( date; ' + eNB_pre_exec + ' '+ eNB_pre_exec_args + ' ) > ' + logfile_pre_exec_eNB + ' 2>&1 \n' + if eNB_main_exec != "": + task_eNB = task_eNB + ' ( date; ' + addsudo(eNB_main_exec + ' ' + eNB_main_exec_args, '') + ' ) > ' + logfile_exec_eNB + ' 2>&1 & \n' + task_eNB = task_eNB + 'array_exec_pid+=($!) \n' + task_eNB = task_eNB + 'echo eNB_main_exec PID = $! \n' + if eNB_traffic_exec != "": + cmd_traffic = eNB_traffic_exec + ' ' + eNB_traffic_exec_args + if cmd_traffic.find('-c') >= 0: + cmd_traffic = cmd_traffic + ' -t ' + str(timeout_cmd - 80) + task_eNB = task_eNB + ' (date; ' + cmd_traffic + ' ) > ' + logfile_traffic_eNB + ' 2>&1 & \n' + task_eNB = task_eNB + 'array_exec_pid+=($!) \n' + task_eNB = task_eNB + 'echo eNB_traffic_exec PID = $! \n' + #terminate the eNB test case after timeout_cmd seconds + task_eNB = task_eNB + finalize_deploy_script (timeout_cmd, eNB_terminate_missing_procs) + ' \n' + #task_eNB = task_eNB + 'sleep ' + str(timeout_cmd) + ' \n' + task_eNB = task_eNB + 'handle_ctrl_c' + '\n' + task_eNB = task_eNB + ' ) > ' + logfile_task_eNB_out + ' 2>&1 ' + write_file(logfile_task_eNB, task_eNB, mode="w") + + + UE_pre_exec = testcase.findtext('UE_pre_exec',default='') + UE_pre_exec_args = testcase.findtext('UE_pre_exec_args',default='') + UE_main_exec = testcase.findtext('UE_main_exec',default='') + UE_main_exec_args = testcase.findtext('UE_main_exec_args',default='') + UE_traffic_exec = testcase.findtext('UE_traffic_exec',default='') + UE_traffic_exec_args = testcase.findtext('UE_traffic_exec_args',default='') + UE_terminate_missing_procs = testcase.findtext('UE_terminate_missing_procs',default='True') + UE_search_expr_true = testcase.findtext('UE_search_expr_true','') + + logfile_exec_UE = logdir_UE_run + '/UE_exec' + '_' + str(run) + '_.log' + logfile_pre_exec_UE = logdir_UE_run + '/UE_pre_exec' + '_' + str(run) + '_.log' + logfile_task_UE_out = logdir_UE_run + '/UE_task_out' + '_' + str(run) + '_.log' + logfile_traffic_UE = logdir_UE_run + '/UE_traffic' + '_' + str(run) + '_.log' + logfile_task_UE = logdir_local_run + '/UE_task' + '_' + str(run) + '_.log' + + + task_UE = ' ( uname -a ; date \n' + task_UE = task_UE + 'array_exec_pid=()' + '\n' + task_UE = task_UE + 'cd ' + logdirOAI5GRepo + '\n' + task_UE = task_UE + 'source oaienv \n' + task_UE = task_UE + 'source cmake_targets/tools/build_helper \n' + task_UE = task_UE + 'env |grep OPENAIR \n' + if UE_pre_exec != "": + task_UE = task_UE + ' ( date; ' + UE_pre_exec + ' '+ UE_pre_exec_args + ' ) > ' + logfile_pre_exec_UE + ' 2>&1 \n' + if UE_main_exec != "": + task_UE = task_UE + ' ( date; ' + addsudo(UE_main_exec + ' ' + UE_main_exec_args, '') + ' ) > ' + logfile_exec_UE + ' 2>&1 & \n' + task_UE = task_UE + 'array_exec_pid+=($!) \n' + task_UE = task_UE + 'echo UE_main_exec PID = $! \n' + if UE_traffic_exec != "": + cmd_traffic = UE_traffic_exec + ' ' + UE_traffic_exec_args + if cmd_traffic.find('-c') >= 0: + cmd_traffic = cmd_traffic + ' -t ' + str(timeout_cmd - 60) + task_UE = task_UE + ' ( date; ' + cmd_traffic + ' ) >' + logfile_traffic_UE + ' 2>&1 & \n' + task_UE = task_UE + 'array_exec_pid+=($!) \n' + task_UE = task_UE + 'echo UE_traffic_exec PID = $! \n' + #terminate the UE test case after timeout_cmd seconds + task_UE = task_UE + finalize_deploy_script (timeout_cmd, UE_terminate_missing_procs) + ' \n' + #task_UE = task_UE + 'sleep ' + str(timeout_cmd) + ' \n' + task_UE = task_UE + 'handle_ctrl_c' + '\n' + task_UE = task_UE + ' ) > ' + logfile_task_UE_out + ' 2>&1 ' + write_file(logfile_task_UE, task_UE, mode="w") + #task_UE = 'echo \" ' + task_UE + '\" > ' + logfile_script_UE + ' 2>&1 ; ' + task_UE + + + + + + + + # + # RUN work + # ---------------------------------------------------- + thread_eNB = oaiThread(1, "eNB_thread", eNBMachine, user, password , task_eNB, False, timeout_thread) + thread_UE = oaiThread(2, "UE_thread", UEMachine, user, password , task_UE, False, timeout_thread) + threads=[] + threads.append(thread_eNB) + threads.append(thread_UE) + thread_eNB.start() + thread_UE.start() + + run_work_inprogress_flag = True + progress_step = timeout_thread/20 + progress_count = 0 + + while (run_work_inprogress_flag): + + + update_progress(float(progress_count)/float(timeout_thread),prefix_string) + + time.sleep(progress_step) + + progress_count += progress_step + +# sys.stdout.write ('#') +# sys.stdout.flush() + + run_work_inprogress_flag = False + for t in threads: + if t.isAlive(): + run_work_inprogress_flag = True + + + update_progress(1,prefix_string) + + for t in threads: + t.join() + + + # + # + #----------------------------------------------------- + cleanOldProgramsAllMachines([oai_eNB, oai_UE] , oldprogramList, CleanUpAluLteBox, ExmimoRfStop, [logdir_eNB_run, logdir_UE_run], logdirOAI5GRepo) + + SSHSessionWrapper(eNBMachine, user, None, password, logdir_eNB_run, logdir_local_testcase, "get_all") + #print "Copying files from UEMachine : " + UEMachine + "logdir_UE = " + logdir_UE + SSHSessionWrapper(UEMachine, user, None, password, logdir_UE_run, logdir_local_testcase, "get_all") + + metric_checks_flag = 1 + + fname = logdir_local_run+ '/UE_exec' + '_' + str(run) + '_.log' + cell_synch_status = analyser.check_cell_synchro(fname) + print (Fore.WHITE + indent + "> Check Cell synchro :"), + + if cell_synch_status == 'CELL_SYNCH': + print ( Fore.GREEN + cell_synch_status) + else : + print ( Fore.RED + cell_synch_status) + metric_checks_flag = 0 + + ue_seg_fault_status = analyser.check_exec_seg_fault(fname) + if ue_seg_fault_status == 'SEG_FAULT' : + nb_seg_fault += 1 + + # + # Check metrics + #---------------------------------------------------- + runs_metrics = [] + run_traffic = [] + + if metric_checks_flag : + verdict = 'PASS' + + # UE side metrics + metricList=testcase.findall('UE_metric') + for metric in metricList: + + metric_verdict = 'PASS' + + metric_def = {} + metric_def['id'] = metric.get('id') + metric_def['description'] = metric.get('description') + metric_def['regex'] = metric.get('regex') + metric_def['unit_of_meas'] = metric.get('unit_of_meas') + metric_def['pass_fail_stat']= metric.get('pass_fail_stat') + metric_min_lim = metric.get('min_limit') + if metric_min_lim: + metric_def['min_limit'] = float(metric_min_lim) + metric_max_lim = metric.get('max_limit') + if metric_max_lim: + metric_def['max_limit'] = float(metric_max_lim) + + fname = logdir_local_run+ '/UE_exec' + '_' + str(run) + '_.log' + + args = {'metric' : metric_def, + 'file' : fname } + + metric_extracted = analyser.do_extract_metrics(args) + + print (Fore.WHITE + indent + "> Metric : "+metric_def['id']), + print ("(min="+str( metric_extracted['metric_min'])+", max="+str( metric_extracted['metric_max'])+", mean="+str( metric_extracted['metric_mean'])+", median="+str( metric_extracted['metric_median'])+")") + +# print "\t > Metric "+metric_def['id']+" :" +# print "\t\t> min = "+ str( metric_extracted['metric_min'] ) +# print "\t\t> min_index = "+ str( metric_extracted['metric_min_index'] ) +# print "\t\t> max = "+ str( metric_extracted['metric_max'] ) +# print "\t\t> max_index = "+ str( metric_extracted['metric_max_index'] ) +# print "\t\t> mean = "+ str( metric_extracted['metric_mean'] ) +# print "\t\t> median = "+ str( metric_extracted['metric_median'] ) + + if metric_def['pass_fail_stat'] : + metric_verdict = analyser.do_check_verdict(metric_def, metric_extracted) + + metric_fig = logdir_local_run+ '/UE_metric_'+ metric_def['id']+'_' + str(run) + '_.png' + analyser.do_img_metrics(metric_def, metric_extracted, metric_fig) + + + metric_fig_report = '../log/'+ testcasename + '/run_' + str(run) + '/UE_metric_'+ metric_def['id']+'_' + str(run) + '_.png' + + run_metrics = dict( metric_id = metric_def['id'], + metric_desc = metric_def['description'], + metric_uom = metric_def['unit_of_meas'], + metric_min = metric_extracted['metric_min'], + metric_min_index= metric_extracted['metric_min_index'], + metric_max = metric_extracted['metric_max'], + metric_max_index= metric_extracted['metric_max_index'], + metric_mean = metric_extracted['metric_mean'], + metric_median = metric_extracted['metric_median'], + metric_fig = metric_fig_report) + + if metric_def['pass_fail_stat'] : + run_metrics['pass_fail_stat'] = metric_def['pass_fail_stat'] + if metric_min_lim : + run_metrics['pass_fail_min_limit'] = metric_def['min_limit'] + if metric_max_lim : + run_metrics['pass_fail_max_limit'] = metric_def['max_limit'] + + runs_metrics.append(run_metrics) + + if metric_verdict != 'PASS': + verdict = metric_verdict + + # End Metrics LOOP + # --------------------- + + + # Traffic analysis + if UE_traffic_exec != "": + + fname = logdir_local_run+ '/UE_traffic' + '_' + str(run) + '_.log' + args = {'file' : fname } + traffic_metrics = analyser.do_extract_traffic_metrics(args) + traffic_fig = logdir_local_run+ '/UE_traffic'+'_' + str(run) + '_.png' + analyser.do_img_traffic(traffic_metrics, traffic_fig) + + traffic_fig_report= '../log/'+ testcasename + '/run_' + str(run) + '/UE_traffic'+'_' + str(run) + '_.png' + + dur_pass_fail_crit = 'none' + if traffic_metrics['traffic_count'] == 0 : + verdict = 'FAIL' + elif UE_search_expr_true != "": + traffic_duration_limit = float(UE_search_expr_true) + dur_pass_fail_crit = str(traffic_duration_limit) + # print 'traffic_duration_limit = '+str(traffic_duration_limit) + # print 'traffic_metrics[interval_stop_max] = '+str(traffic_metrics['interval_stop_max']) + if traffic_metrics['interval_stop_max'] < traffic_duration_limit : + verdict = 'FAIL' + + + run_traffic = dict( traffic_count = traffic_metrics['traffic_count'], + bw_min = traffic_metrics['bw_min'], + bw_max = traffic_metrics['bw_max'], + bw_mean = traffic_metrics['bw_mean'], + bw_median = traffic_metrics['bw_median'], + jitter_min = traffic_metrics['jitter_min'], + jitter_max = traffic_metrics['jitter_max'], + jitter_mean = traffic_metrics['jitter_mean'], + jitter_median = traffic_metrics['jitter_median'], + rl_min = traffic_metrics['rl_min'], + rl_max = traffic_metrics['rl_max'], + rl_mean = traffic_metrics['rl_mean'], + rl_median = traffic_metrics['rl_median'], + iperf_duration = traffic_metrics['interval_stop_max'], + dur_pass_fail_crit = dur_pass_fail_crit, + traffic_fig = traffic_fig_report ) + else: + run_traffic = dict( traffic_count = 0) + + else : + verdict = 'SKIP' + + + + # + # RUN verdict and finalization + # ---------------------------------------------------- + run_stop_time=datetime.datetime.now() + run_duration = run_stop_time-run_start_time +# print (Fore.WHITE + ("duration=" :"), + print (Fore.WHITE + indent + "> RUN duration : "+ str(run_duration) +"s" ) + + print (Fore.WHITE + indent + "> RUN verdict :"), + + if verdict == 'PASS': + nb_run_pass += 1 + print ( Fore.GREEN + verdict) + elif verdict == 'FAIL': + nb_run_failed += 1 + testcase_verdict = 'FAIL' + print ( Fore.RED + verdict) + elif verdict == 'SKIP': + nb_run_skip += 1 + print ( Fore.YELLOW + verdict) + else: + nb_run_inc += 1 + if testcase_verdict == 'PASS' : testcase_verdict = 'INCON' + print (Fore.YELLOW+'INCONCLUSIVE') + + run_results = dict( run_id=str(run), + run_start_time = run_start_time, + run_stop_time = run_stop_time , + run_verdict = verdict, + ue_seg_fault_status = ue_seg_fault_status, + run_duration = run_duration, + runs_metrics = runs_metrics, + run_traffic = run_traffic) + runs_results.append(run_results) + + # END RUN LOOP + #---------------------------------------------------- + + indent="\t" + + # Test case duration + # ---------------------------------- + testcase_time_stop = datetime.datetime.now() + print(Fore.WHITE + indent + "> testcase time stop : " + str(testcase_time_start) ), + print " -> TestCase duration = "+str(testcase_time_stop - testcase_time_start) + + # Save remote log files + # ----------------------------------- + #Now we change the permissions of the logfiles to avoid some of them being with root permissions + cmd = 'sudo -E chown -R ' + user + ' ' + logdir_eNB_testcase + res= oai_eNB.send_recv(cmd) + cmd = 'sudo -E chown -R ' + user + ' ' + logdir_UE_testcase + res= oai_UE.send_recv(cmd) + + # Save remote log files on MTC + #print "Copying files from eNBMachine " + eNBMachine + "logdir_eNB = " + logdir_eNB + SSHSessionWrapper(eNBMachine, user, None, password, logdir_eNB_testcase, openairdir_local + '/cmake_targets/autotests/log/', "get_all") + #print "Copying files from UEMachine : " + UEMachine + "logdir_UE = " + logdir_UE + SSHSessionWrapper(UEMachine, user, None, password, logdir_UE_testcase, openairdir_local + '/cmake_targets/autotests/log/', "get_all") + + oai_eNB.disconnect() + oai_UE.disconnect() + + # Set test case final verdict + # ----------------------------------- + test_result_string = 'do be completed' + + if testcase_verdict == 'PASS': + if nb_run_pass == 0 : + testcase_verdict = 'INCON' + + print(Fore.WHITE + indent + "> testcase final verdict :"), + if testcase_verdict == 'PASS': + print ( Fore.GREEN + testcase_verdict) + elif testcase_verdict == 'FAIL': + print ( Fore.RED + testcase_verdict) + else: + print (Fore.YELLOW+'INCONCLUSIVE') + + print(Style.RESET_ALL) + + duration= testcase_time_stop - testcase_time_start + + test_result = dict(testcase_name=testcasename, + testcaseclass=testcaseclass, + testcase_verdict = testcase_verdict, + testcase_time_start=testcase_time_start, + testcase_time_stop=testcase_time_stop, + tags=tags, + nruns=nb_runs, + nb_run_pass = nb_run_pass, + nb_run_skip = nb_run_skip, + nb_run_failed = nb_run_failed, + nb_run_inc=nb_run_inc, + nb_seg_fault = nb_seg_fault, + testcase_timeout=timeout_cmd, + testcase_duration = duration, + testcase_eNBMachine =eNBMachine, + testcase_UEMachine =UEMachine, + runs_results = runs_results) + test_results.append(test_result) + + xmlFile = logdir_local_testcase + '/test.' + testcasename + '.xml' + xml="\n \n" + write_file(xmlFile, xml, mode="w") + +# xmlFile_ng = logdir_local_testcase + '/test.' + testcasename + '_ng.xml' +# xml_ng = xmlify(test_result, wrap=testcasename, indent=" ") +# write_file(xmlFile_ng, xml_ng, mode="w") + + + + return testcase_verdict + + + + # \brief This function searches if test case is present in list of test cases that need to be executed by user # \param testcasename the test case to search for # \param testcasegroup list that is passed from the arguments @@ -1062,12 +1778,12 @@ def search_test_case_group(testcasename, testcasegroup, test_case_exclude): if entry.find('+') >=0: match = re.search(entry, testcasename) if match: - print "\nSkipping test case as it is found in black list: " + testcasename + #print "\nSkipping test case as it is found in black list: " + testcasename return False else: match = entry.find(testcasename) if match >=0: - print "\nSkipping test case as it is found in black list: " + testcasename + #print "\nSkipping test case as it is found in black list: " + testcasename return False if testcasegroup == '': return True @@ -1155,18 +1871,28 @@ if openairdir_local is None: print "Environment variable OPENAIR_DIR not set correctly" sys.exit() locallogdir = openairdir_local + '/cmake_targets/autotests/log' +reportdir = openairdir_local + '/cmake_targets/autotests/report' MachineList = '' MachineListGeneric='' +MachineDescDic={} flag_remove_logdir=False flag_start_testcase=False nruns_lte_softmodem='' flag_skip_git_head_check=False flag_skip_oai_install=False +flag_skip_machine_preparation=False +flag_skip_sanity_check=False +flag_generate_html_report = False Timeout_cmd='' -print "Number of arguments argc = " + str(len(sys.argv)) +xmlInputFile='' + +#print "Number of arguments argc = " + str(len(sys.argv)) #for index in range(1,len(sys.argv) ): # print "argv_" + str(index) + " : " + sys.argv[index] +oai_list = [] + + i=1 while i < len (sys.argv): arg=sys.argv[i] @@ -1226,6 +1952,15 @@ while i < len (sys.argv): i = i +1 elif arg == '--skip-oai-install': flag_skip_oai_install=True + elif arg == '--skip-machine-preparation': + flag_skip_machine_preparation=True + elif arg == '--skip-sanity-check': + flag_skip_sanity_check=True + elif arg == '--test-suite' : + xmlInputFile = sys.argv[i+1] + i = i +1 + elif arg == '--generate-html-report': + flag_generate_html_report=True elif arg == '-h' : print "-s: This flag *MUST* be set to start the test cases" print "-r: Remove the log directory in autotests" @@ -1243,78 +1978,65 @@ while i < len (sys.argv): print "--skip-git-head-check: skip checking of GitHead remote/local branch (only for debugging)" print "--timeout_cmd: Override the default parameter (timeout_cmd) in test_case_list.xml. This parameter is in seconds and should be > 120" print "--skip-oai-install: Skips the openairinterface5g installer" + print "--skip-machine-preparation: skipp the whole system preparation -> direct to test cases" + print "--skip-sanity-check: skipp the machine sanity checks" + print "--test-suite: Select a XML test-suite file" + print "--generate-html-report: Generate an HTML report of the test campaign (supported only for noS1 testsuite !!)" sys.exit() else : print "Unrecongnized Option: <" + arg + ">. Use -h to see valid options" sys.exit() i= i + 1 -try: - os.environ["OPENAIR1_DIR"] -except KeyError: - print "Please set the environment variable OPENAIR1_DIR in the .bashrc" - sys.exit(1) - -try: - os.environ["OPENAIR2_DIR"] -except KeyError: - print "Please set the environment variable OPENAIR2_DIR in the .bashrc" - sys.exit(1) - -try: - os.environ["OPENAIR_TARGETS"] -except KeyError: - print "Please set the environment variable OPENAIR_TARGETS in the .bashrc" - sys.exit(1) - -print "Killing zombie ssh sessions from earlier sessions..." -cmd='ps aux |grep \"/usr/bin/ssh -q -l guptar\"| awk \'{print $2}\' | sudo xargs kill -9 ' - -os.system(cmd) - -if flag_start_testcase == False: - print "You need to start the testcase by passing option -s. Use -h to see all options. Aborting now..." - sys.exit(1) - -# get the oai object -host = os.uname()[1] -#oai = openair('localdomain','calisson') -oai_list = [] - -#start_time = time.time() # datetime.datetime.now() -if user=='': - user = getpass.getuser() -if pw=='': - pw = getpass.getpass() - -print "Killing zombie ssh sessions from earlier sessions..." -cmd='ps aux |grep \"/usr/bin/ssh -q -l guptar\"|tr -s \" \" :|cut -f 2 -d :|xargs kill -9 ' -cmd = cmd + '; ps aux |grep \"/usr/bin/ssh -q -l ' + user + '\"|tr -s \" \" :|cut -f 2 -d :|xargs kill -9 ' -os.system(cmd) - -print "host = " + host -print "user = " + user -xmlInputFile=os.environ.get('OPENAIR_DIR')+"/cmake_targets/autotests/test_case_list.xml" -NFSResultsDir = '/mnt/sradio' -cleanupOldProgramsScript = '$OPENAIR_DIR/cmake_targets/autotests/tools/remove_old_programs.bash' logdir = '/tmp/' + 'OAITestFrameWork-' + user + '/' logdirOAI5GRepo = logdir + 'openairinterface5g/' logdirOpenaircnRepo = logdir + 'openair-cn/' - -if flag_remove_logdir == True: - print "Removing directory: " + locallogdir - os.system(' rm -fr ' + locallogdir + '; mkdir -p ' + locallogdir ) - -paramiko_logfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/log/paramiko.log') -res=os.system(' echo > ' + paramiko_logfile) -paramiko.util.log_to_file(paramiko_logfile) - -#pw=getpass.getpass() +patchdir = logdirOAI5GRepo + 'cmake_targets/autotests/patches/' +NFSResultsDir = '/mnt/sradio' +cleanupOldProgramsScript = '$OPENAIR_DIR/cmake_targets/autotests/tools/remove_old_programs.bash' #Now we parse the xml file for basic configuration +if xmlInputFile == '': + xmlInputFile=os.environ.get('OPENAIR_DIR')+"/cmake_targets/autotests/test_case_list.xml" xmlTree = ET.parse(xmlInputFile) xmlRoot = xmlTree.getroot() +# +# Read test session configuration +# --------------------------------------------------------------------------------- +print (Fore.YELLOW + '\nStep 0.1 - Read test session configuration') +print (Fore.YELLOW + '-------------------------------------------------') + +test_session_start_time = datetime.datetime.now() +print (Fore.WHITE + ' - start time : '+ str(test_session_start_time)) + +host = os.uname()[1] +print (Fore.WHITE + ' - MTC host : '+host) + + +if user=='': + user = getpass.getuser() +print (Fore.WHITE + ' - user : '+user) + +if pw=='': + pw = getpass.getpass() +print (Fore.WHITE + ' - password : '+pw) + +print (Fore.WHITE + ' - cmd line flags : ') +print (Fore.WHITE + ' + -s : '+str(flag_start_testcase)) +print (Fore.WHITE + ' + -r : '+str(flag_remove_logdir)) +print (Fore.WHITE + ' + -c : '+str(cleanUpRemoteMachines)) +print (Fore.WHITE + ' + --skip-git-head-check : '+str(flag_skip_git_head_check)) +print (Fore.WHITE + ' + --skip-oai-install : '+str(flag_skip_oai_install)) +print (Fore.WHITE + ' + --skip-machine-preparation : '+str(flag_skip_machine_preparation)) +print (Fore.WHITE + ' + --skip-sanity-check : '+str(flag_skip_sanity_check)) + + +print (Fore.WHITE + ' - Test setup basic config : (* -> overwrite by cmd line parameter)') +print (Fore.WHITE + ' + test setup config file : '+str(xmlInputFile)) +print (Fore.WHITE + ' + remote setup dir : '+str(logdir)) +print (Fore.WHITE + ' + remote OAI5G repo : '+str(logdirOAI5GRepo)) +print (Fore.WHITE + ' + remote OpenAirCN repo : '+str(logdirOpenaircnRepo)) if MachineList =='': @@ -1327,6 +2049,8 @@ if GitOAI5GRepo == '': if GitOAI5GRepoBranch == '': GitOAI5GRepoBranch = xmlRoot.findtext('GitOAI5GRepoBranch',default='') +if GitOAI5GHeadVersion == '': + GitOAI5GHeadVersion = xmlRoot.findtext('GitOAI5GHeadVersion',default='') GitOpenaircnRepoBranch = xmlRoot.findtext('GitOpenair-cnRepoBranch',default='') CleanUpOldProgs = xmlRoot.findtext('CleanUpOldProgs',default='') @@ -1339,23 +2063,27 @@ ExmimoRfStop = xmlRoot.findtext('ExmimoRfStop',default='') if nruns_lte_softmodem == '': nruns_lte_softmodem = xmlRoot.findtext('nruns_lte-softmodem',default='') -print "MachineList = " + MachineList -print "GitOpenair-cnRepo = " + GitOpenaircnRepo -print "GitOAI5GRepo = " + GitOAI5GRepo -print "GitOAI5GBranch = " + GitOAI5GRepoBranch -print "GitOpenaircnRepoBranch = " + GitOpenaircnRepoBranch -print "NFSResultsShare = " + NFSResultsShare -print "nruns_lte_softmodem = " + nruns_lte_softmodem -print "Timeout_cmd = " + Timeout_cmd +print (Fore.WHITE + ' + MachineList : '+ MachineList) +print (Fore.WHITE + ' + GitOpenair-cnRepo : '+ GitOpenaircnRepo) +print (Fore.WHITE + ' + GitOAI5GRepo : '+ GitOAI5GRepo) +print (Fore.WHITE + ' + GitOAI5GBranch : '+ GitOAI5GRepoBranch) +print (Fore.WHITE + ' + GitOpenaircnRepoBranch : '+ GitOpenaircnRepoBranch) +print (Fore.WHITE + ' + NFSResultsShare : '+ NFSResultsShare) +print (Fore.WHITE + ' + nruns_lte_softmodem : '+ nruns_lte_softmodem) +print (Fore.WHITE + ' + Timeout_cmd : '+ Timeout_cmd) + if GitOAI5GHeadVersion == '': - cmd = "git show-ref --heads -s "+ GitOAI5GRepoBranch + cmd = "git log --pretty=format:\'%H\' -n 1" # origin/"+ GitOAI5GRepoBranch +# cmd = "git show-ref --heads -s "+ GitOAI5GRepoBranch GitOAI5GHeadVersion = subprocess.check_output ([cmd], shell=True) GitOAI5GHeadVersion=GitOAI5GHeadVersion.replace("\n","") -print "GitOAI5GHeadVersion = " + GitOAI5GHeadVersion -print "CleanUpOldProgs = " + CleanUpOldProgs -print "Timeout_execution = " + str(Timeout_execution) + # Print commiter and date : git log -1 --pretty=format:"%an %ad" + +print (Fore.WHITE + ' + GitOAI5GHeadVersion : '+ GitOAI5GHeadVersion) +#print "CleanUpOldProgs = " + CleanUpOldProgs +print (Fore.WHITE + ' + Timeout_execution (s) : '+ str(Timeout_execution)) if GitOAI5GHeadVersion == '': print "Error getting the OAI5GBranch Head version...Exiting" @@ -1363,194 +2091,404 @@ if GitOAI5GHeadVersion == '': NFSTestsResultsDir = NFSResultsShare + '/'+ GitOAI5GRepoBranch + '/' + GitOAI5GHeadVersion -print "NFSTestsResultsDir = " + NFSTestsResultsDir +#print "NFSTestsResultsDir = " + NFSTestsResultsDir + +OAI5GpatchFileList=xmlRoot.findall('OAI5GPatchFile') + + MachineList = MachineList.split() MachineListGeneric = MachineListGeneric.split() -#index=0 + +MachineDescDic + + +# +# 'Check Mater Test Controller sanity (MTC)' +# --------------------------------------------------------------------------------- +print (Fore.YELLOW + '\nStep 0.2 - Check Mater Test Controller sanity (MTC)') +print (Fore.YELLOW + '-------------------------------------------------') + +try: + print (Fore.WHITE + ' - check OpenAirInterface environment variable OPENAIR1_DIR... '), + os.environ["OPENAIR1_DIR"] +except KeyError: + print (Fore.RED + 'FAILED') + print "Please set the environment variable OPENAIR1_DIR in the .bashrc or run 'source oaienv' " + exit_prog(1) +print (Fore.GREEN + 'OK') + +try: + print (Fore.WHITE + ' - check OpenAirInterface environment variable OPENAIR2_DIR... '), + os.environ["OPENAIR2_DIR"] +except KeyError: + print (Fore.RED + 'FAILED') + print "Please set the environment variable OPENAIR2_DIR in the .bashrc or run 'source oaienv' " + exit_prog(1) +print (Fore.GREEN + 'OK') + +try: + os.environ["OPENAIR_TARGETS"] +except KeyError: + print "Please set the environment variable OPENAIR_TARGETS in the .bashrc or run 'source oaienv' " + sexit_prog(1) + +print (Fore.WHITE + ' - kill zombie ssh sessions from earlier sessions... '), +cmd='ps aux |grep \"/usr/bin/ssh -q -l ' + user + '\"| tr -s \" \" :| cut -f 2 -d :| xargs kill -9 ' +os.system(cmd) +print (Fore.GREEN + 'DONE') + +if flag_start_testcase == False: + print "You need to start the testcase by passing option -s. Use -h to see all options. Aborting now..." + exit_prog(1) + + +#print "Killing zombie ssh sessions from earlier sessions..." +#cmd='ps aux |grep \"/usr/bin/ssh -q -l guptar\"|tr -s \" \" :|cut -f 2 -d :|xargs kill -9 ' +#cmd = cmd + '; ps aux |grep \"/usr/bin/ssh -q -l ' + user + '\"| tr -s \" \" :| cut -f 2 -d :| xargs kill -9 ' +#os.system(cmd) +#print cmd + +try: + analyser = __import__("lib_autotest_analyser") +except ImportError as err: + print('Import error: ' + str(err)) + exit(0) + +if flag_remove_logdir == True: + print "Removing directory: " + locallogdir + os.system(' rm -fr ' + locallogdir + '; mkdir -p ' + locallogdir ) + +if not os.path.exists(locallogdir): + os.system('mkdir -p ' + locallogdir ) + + +paramiko_logfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/log/paramiko.log') +res=os.system(' echo > ' + paramiko_logfile) +paramiko.util.log_to_file(paramiko_logfile) + + +# +# 'REMOTE MACHINE SANITY CHEKS' +# --------------------------------------------------------------------------------- +print (Fore.YELLOW + '\nStep 0.3 - REMOTE MACHINE SANITY CHEKS') +print (Fore.YELLOW + '-------------------------------------------------') + + for machine in MachineList: oai_list.append( openair('localdomain',machine)) - #index = index + 1 + MachineDescDic[machine]={} -print "\nTesting the sanity of machines used for testing..." -if localshell == 0: +if not flag_skip_sanity_check: + + if localshell == 0: try: - index=0 - for machine in MachineList: - print '\n******* Note that the user <'+user+'> should be a sudoer *******\n' - print '******* Connecting to the machine <'+machine+'> to perform the test *******\n' - if not pw : - print "username: " + user - #pw = getpass.getpass() - #print "password: " + pw - else : - print "username: " + user - #print "password: " + pw - # issues in ubuntu 12.04 - oai_list[index].connect(user,pw) - print '\nChecking for sudo permissions on machine <'+machine+'>...' - result = oai_list[index].send_expect_false('sudo -S -v','may not run sudo',True) - print "Sudo permissions..." + result - - print '\nCleaning Older running programs : ' + CleanUpOldProgs - cleanOldPrograms(oai_list[index], CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop, '$HOME', '/tmp') + index=0 + for machine in MachineList: + print (Fore.WHITE + " - Check sanity for remote machine "+machine) - #result = oai_list[index].send('mount ' + NFSResultsDir, True) - #print "Mounting NFS Share " + NFSResultsDir + "..." + result + oai_list[index].connect(user,pw) + print (Fore.WHITE + " > Checking for sudo permissions for user "+user+ " : "), + result = oai_list[index].send_expect_false('sudo -S -v','may not run sudo',True) + if (result == 'OK'): + print (Fore.GREEN + result ) + else: + print (Fore.RED + result ) + + print (Fore.WHITE + " > Cleaning Older running programs : "), + cleanOldPrograms(oai_list[index], CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop, '$HOME', '/tmp') + print (Fore.WHITE + " Done") - # Check if NFS share is mounted correctly. - #print 'Checking if NFS Share<' + NFSResultsDir + '> is mounted correctly...' - #cmd = 'if grep -qs '+NFSResultsDir+ ' /proc/mounts; then echo \'' + NFSResultsDir + ' is mounted\' ; fi' - #search_expr = NFSResultsDir + ' is mounted' - #print "cmd = " + cmd - #print "search_expr = " + search_expr - #result = oai_list[index].send_expect(cmd, search_expr) - #print "Mount NFS_Results_Dir..." + result - index = index + 1 - - #oai.connect2(user,pw) - #oai.get_shell() + #result = oai_list[index].send('mount ' + NFSResultsDir, True) + #print "Mounting NFS Share " + NFSResultsDir + "..." + result + + # Check if NFS share is mounted correctly. + #print 'Checking if NFS Share<' + NFSResultsDir + '> is mounted correctly...' + #cmd = 'if grep -qs '+NFSResultsDir+ ' /proc/mounts; then echo \'' + NFSResultsDir + ' is mounted\' ; fi' + #search_expr = NFSResultsDir + ' is mounted' + #print "cmd = " + cmd + #print "search_expr = " + search_expr + #result = oai_list[index].send_expect(cmd, search_expr) + #print "Mount NFS_Results_Dir..." + result + index = index + 1 + + #oai.connect2(user,pw) + #oai.get_shell() except : print 'Fail to connect to the machine: '+ machine sys.exit(1) + else: + pw = '' + oai_list[0].connect_localshell() else: - pw = '' - oai_list[0].connect_localshell() + print (Fore.RED + " Skipping Machine sanity check...") -#We now prepare the machines for testing -index=0 -threads_init_setup=[] -for oai in oai_list: - try: - print "setting up machine: " + MachineList[index] - #print oai_list[oai].send_recv('echo \''+pw+'\' |sudo -S -v') - #print oai_list[oai].send_recv('sudo su') - #print oai_list[oai].send_recv('who am i') - #cleanUpPrograms(oai_list[oai] - cmd = 'sudo -S -E rm -fr ' + logdir + ' ; mkdir -p ' + logdir - result = oai.send_recv(cmd) +# +# 'REMOTE MACHINE TEST SETUP CONFIGURATION' +# --------------------------------------------------------------------------------- +print (Fore.YELLOW + '\nStep 0.4 - REMOTE MACHINE PREPARATION') +print (Fore.YELLOW + '-------------------------------------------------') + +if not flag_skip_machine_preparation: + index=0 + threads_init_setup=[] + for oai in oai_list: + try: + print "setting up machine: " + MachineList[index] + #print oai_list[oai].send_recv('echo \''+pw+'\' |sudo -S -v') + #print oai_list[oai].send_recv('sudo su') + #print oai_list[oai].send_recv('who am i') + #cleanUpPrograms(oai_list[oai] + cmd = 'sudo -S -E rm -fr ' + logdir + ' ; mkdir -p ' + logdir + result = oai.send_recv(cmd) + print cmd + + setuplogfile = logdir + '/setup_log_' + MachineList[index] + '_.txt' + setup_script = locallogdir + '/setup_script_' + MachineList[index] + '_.txt' + + #Sometimes git fails so the script below retries in that case + localfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/git-retry.sh') + remotefile = logdir + '/git-retry.sh' + paramList=[] + port=22 + paramList.append ( {"operation":'put', "localfile":localfile, "remotefile":remotefile} ) + sftp_log = os.path.expandvars(locallogdir + '/sftp_module.log') + sftp_module (user, pw, MachineList[index], port, paramList, sftp_log) + + cmd = ' ( \n' + #cmd = cmd + 'rm -fR ' + logdir + '\n' + #cmd = cmd + 'mkdir -p ' + logdir + '\n' + cmd = cmd + 'cd '+ logdir + '\n' + cmd = cmd + 'sudo apt-get install -y git \n' + cmd = cmd + 'chmod 700 ' + logdir + '/git-retry.sh \n' + cmd = cmd + logdir + '/git-retry.sh clone '+ GitOAI5GRepo +' \n' + cmd = cmd + logdir + '/git-retry.sh clone '+ GitOpenaircnRepo + ' \n' + cmd = cmd + 'cd ' + logdirOAI5GRepo + '\n' + cmd = cmd + 'git checkout ' + GitOAI5GRepoBranch + '\n' + if GitOAI5GHeadVersion : + cmd = cmd + 'git checkout ' + GitOAI5GHeadVersion + '\n' + cmd = cmd + 'git_head=`git ls-remote |grep \'' + GitOAI5GRepoBranch + '\'` \n' + cmd = cmd + 'git_head=($git_head) \n' + cmd = cmd + 'git_head=${git_head[0]} \n' + cmd = cmd + 'echo \"GitOAI5GHeadVersion_remote = $git_head\" \n' + cmd = cmd + 'echo \"GitOAI5GHeadVersion_local = ' + GitOAI5GHeadVersion + '\" \n' + if flag_skip_git_head_check==True: + cmd = cmd + 'echo \"skipping GitHead check...\" \n ' + else: + cmd = cmd + 'if [ \"$git_head\" != \"'+ GitOAI5GHeadVersion + '\" ]; then echo \"error: Git openairinterface5g head version does not match\" ; fi \n' + cmd = cmd + 'source oaienv' + '\n' + if flag_skip_oai_install == False: + cmd = cmd + 'source $OPENAIR_DIR/cmake_targets/tools/build_helper \n' + cmd = cmd + 'echo \"Installing core OAI dependencies...Start\" \n' + cmd = cmd + '$OPENAIR_DIR/cmake_targets/build_oai -I --install-optional-packages \n' + cmd = cmd + 'echo \"Installing core OAI dependencies...Finished\" \n' + #cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Start\" \n' + #cmd = cmd + 'check_install_bladerf_driver \n' + #cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Finished\" \n' + #cmd = cmd + 'echo \"Installing USRP OAI dependencies...Start\" \n' + #cmd = cmd + 'check_install_usrp_uhd_driver \n' + #cmd = cmd + 'echo \"Installing USRP OAI dependencies...Finished\" \n' + cmd = cmd + 'cd ' + logdirOpenaircnRepo + '\n' + cmd = cmd + 'git checkout ' + GitOpenaircnRepoBranch + '\n' + cmd = cmd + 'env |grep OPENAIR' + '\n' + cmd = cmd + ' cd ' + logdir + '\n' + cmd = cmd + 'mkdir -p ' + patchdir + '\n' + cmd = cmd + ' ) > ' + setuplogfile + ' 2>&1 \n' + #cmd = cmd + 'echo \' ' + cmd + '\' > ' + setup_script + ' 2>&1 \n ' + #result = oai_list[index].send_recv(cmd, False, 300 ) + write_file(setup_script, cmd, mode="w") + tempThread = oaiThread(index, 'thread_setup_'+str(index)+'_' + MachineList[index] , MachineList[index] , user, pw, cmd, False, 3000) + threads_init_setup.append(tempThread ) + tempThread.start() + index = index + 1 + except Exception, e: + print 'There is error in one of the commands to setup the machine '+ MachineList[index] + error='' + error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e) + error = error + traceback.format_exc() + print error + sys.exit(1) + + #Now we wait for all the threads to complete + index = 0 + for t in threads_init_setup: + t.join() + + port = 22 + paramList=[] + sftp_log = os.path.expandvars(locallogdir + '/sftp_module.log') + + #Now we copy patch files and apply them + print( Fore.WHITE + " - Installating patch files on machine " + MachineList[index]) + for patchFile in OAI5GpatchFileList: + localfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/patches/')+patchFile.get('name') + remotefile = logdirOAI5GRepo + '/cmake_targets/autotests/patches/'+patchFile.get('name') + if patchFile.get('machine') == MachineList[index] or patchFile.get('machine') == None: + if os.path.isfile(localfile): + print( Fore.WHITE + "\t> PATCH FILE :"+localfile) + paramList=[] + paramList.append ( {"operation":'put', "localfile":localfile, "remotefile":remotefile} ) + sftp_module (user, pw, MachineList[index], port, paramList, sftp_log) + cmd = ' cd ' + logdirOAI5GRepo + ' ;git apply cmake_targets/autotests/patches/'+patchFile.get('name') + res = oai_list[index].send_recv(cmd) + #print res - setuplogfile = logdir + '/setup_log_' + MachineList[index] + '_.txt' - setup_script = locallogdir + '/setup_script_' + MachineList[index] + '_.txt' + paramList=[] - #Sometimes git fails so the script below retries in that case - localfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/git-retry.sh') - remotefile = logdir + '/git-retry.sh' - paramList=[] - port=22 - paramList.append ( {"operation":'put', "localfile":localfile, "remotefile":remotefile} ) - sftp_log = os.path.expandvars(locallogdir + '/sftp_module.log') - sftp_module (user, pw, MachineList[index], port, paramList, sftp_log) + setuplogfile = logdir + '/setup_log_' + MachineList[index] + '_.txt' + setup_script = locallogdir + '/setup_script_' + MachineList[index] + '_.txt' + localfile = locallogdir + '/setup_log_' + MachineList[index] + '_.txt' + remotefile = logdir + '/setup_log_' + MachineList[index] + '_.txt' + sftp_log = os.path.expandvars(locallogdir + '/sftp_module.log') + paramList.append ( {"operation":'get', "localfile":localfile, "remotefile":remotefile} ) + #sftp_module (user, pw, MachineList[index], port, localfile, remotefile, sftp_log, "get") + + #Now we copy test_case_list.xml on the remote machines + localfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/test_case_list.xml') + remotefile = logdirOAI5GRepo + '/cmake_targets/autotests/test_case_list.xml' + # paramList.append ( {"operation":'put', "localfile":localfile, "remotefile":remotefile} ) + # sftp_module (user, pw, MachineList[index], port, paramList, sftp_log) + + sftp_module (user, pw, MachineList[index], port, paramList, sftp_log) - cmd = ' ( \n' - #cmd = cmd + 'rm -fR ' + logdir + '\n' - #cmd = cmd + 'mkdir -p ' + logdir + '\n' - cmd = cmd + 'cd '+ logdir + '\n' - cmd = cmd + 'sudo apt-get install -y git \n' - cmd = cmd + 'chmod 700 ' + logdir + '/git-retry.sh \n' - cmd = cmd + logdir + '/git-retry.sh clone '+ GitOAI5GRepo +' \n' - cmd = cmd + logdir + '/git-retry.sh clone '+ GitOpenaircnRepo + ' \n' - cmd = cmd + 'cd ' + logdirOAI5GRepo + '\n' - cmd = cmd + 'git checkout ' + GitOAI5GRepoBranch + '\n' - #cmd = cmd + 'git checkout ' + GitOAI5GHeadVersion + '\n' - cmd = cmd + 'git_head=`git ls-remote |grep \'' + GitOAI5GRepoBranch + '\'` \n' - cmd = cmd + 'git_head=($git_head) \n' - cmd = cmd + 'git_head=${git_head[0]} \n' - cmd = cmd + 'echo \"GitOAI5GHeadVersion_remote = $git_head\" \n' - cmd = cmd + 'echo \"GitOAI5GHeadVersion_local = ' + GitOAI5GHeadVersion + '\" \n' - if flag_skip_git_head_check==True: - cmd = cmd + 'echo \"skipping GitHead check...\" \n ' - else: - cmd = cmd + 'if [ \"$git_head\" != \"'+ GitOAI5GHeadVersion + '\" ]; then echo \"error: Git openairinterface5g head version does not match\" ; fi \n' - cmd = cmd + 'source oaienv' + '\n' - if flag_skip_oai_install == False: - cmd = cmd + 'source $OPENAIR_DIR/cmake_targets/tools/build_helper \n' - cmd = cmd + 'echo \"Installing core OAI dependencies...Start\" \n' - cmd = cmd + '$OPENAIR_DIR/cmake_targets/build_oai -I --install-optional-packages \n' - cmd = cmd + 'echo \"Installing core OAI dependencies...Finished\" \n' - #cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Start\" \n' - #cmd = cmd + 'check_install_bladerf_driver \n' - #cmd = cmd + 'echo \"Installing BLADERF OAI dependencies...Finished\" \n' - #cmd = cmd + 'echo \"Installing USRP OAI dependencies...Start\" \n' - #cmd = cmd + 'check_install_usrp_uhd_driver \n' - #cmd = cmd + 'echo \"Installing USRP OAI dependencies...Finished\" \n' - cmd = cmd + 'cd ' + logdirOpenaircnRepo + '\n' - cmd = cmd + 'git checkout ' + GitOpenaircnRepoBranch + '\n' - cmd = cmd + 'env |grep OPENAIR' + '\n' - cmd = cmd + ' cd ' + logdir + '\n' - cmd = cmd + ' ) > ' + setuplogfile + ' 2>&1 \n' - #cmd = cmd + 'echo \' ' + cmd + '\' > ' + setup_script + ' 2>&1 \n ' - #result = oai_list[index].send_recv(cmd, False, 300 ) - write_file(setup_script, cmd, mode="w") - tempThread = oaiThread(index, 'thread_setup_'+str(index)+'_' + MachineList[index] , MachineList[index] , user, pw, cmd, False, 3000) - threads_init_setup.append(tempThread ) - tempThread.start() - index = index + 1 - except Exception, e: - print 'There is error in one of the commands to setup the machine '+ MachineList[index] - error='' - error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e) - error = error + traceback.format_exc() - print error - sys.exit(1) - -#Now we wait for all the threads to complete -index = 0 -for t in threads_init_setup: - t.join() - setuplogfile = logdir + '/setup_log_' + MachineList[index] + '_.txt' - setup_script = locallogdir + '/setup_script_' + MachineList[index] + '_.txt' - localfile = locallogdir + '/setup_log_' + MachineList[index] + '_.txt' - remotefile = logdir + '/setup_log_' + MachineList[index] + '_.txt' - port = 22 - - paramList=[] - sftp_log = os.path.expandvars(locallogdir + '/sftp_module.log') - paramList.append ( {"operation":'get', "localfile":localfile, "remotefile":remotefile} ) - #sftp_module (user, pw, MachineList[index], port, localfile, remotefile, sftp_log, "get") - - #Now we copy test_case_list.xml on the remote machines - localfile = os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/test_case_list.xml') - remotefile = logdirOAI5GRepo + '/cmake_targets/autotests/test_case_list.xml' - paramList.append ( {"operation":'put', "localfile":localfile, "remotefile":remotefile} ) - sftp_log = os.path.expandvars(locallogdir + '/sftp_module.log') - sftp_module (user, pw, MachineList[index], port, paramList, sftp_log) - - cmd = ' cd ' + logdirOAI5GRepo + ' ; source oaienv ; env|grep OPENAIR \n' - res = oai_list[index].send_recv(cmd) - index = index +1 - if os.path.exists(localfile) == 0: + cmd = ' cd ' + logdirOAI5GRepo + ' ; source oaienv ; env|grep OPENAIR \n' + res = oai_list[index].send_recv(cmd) + index = index +1 + if os.path.exists(localfile) == 0: print "Setup log file <" + localfile + "> missing for machine <" + MachineList[index] + ">. Please check the setup log files. Exiting now" sys.exit(1) -#Now we process all the test cases -#Now we check if there was error in setup files + #Now we process all the test cases + #Now we check if there was error in setup files -status, out = commands.getstatusoutput('grep ' + ' -il \'error\' ' + locallogdir + '/setup_log*') -if (out != '') : - print "There is error in setup of machines" - print "status = " + str(status) + "\n Check files for error = " + out - print "Exiting now..." - sys.exit(1) + status, out = commands.getstatusoutput('grep ' + ' -il \'error\' ' + locallogdir + '/setup_log*') + if (out != '') : + print "There is error in setup of machines" + print "status = " + str(status) + "\n Check files for error = " + out + print "Exiting now..." + sys.exit(1) -cleanOldProgramsAllMachines(oai_list, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop, '$HOME' , logdirOAI5GRepo) -if cleanUpRemoteMachines == True: - sys.exit(0) + cleanOldProgramsAllMachines(oai_list, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop, '$HOME' , logdirOAI5GRepo) + if cleanUpRemoteMachines == True: + print "Error while cleaning Remote machines" + print "Exiting now..." + sys.exit(0) + + +else: + print (Fore.RED + " Skipping Machine preparation...") + +# ************************************************************************** +# ************************************************************************** +# STEP 2 - TEST SELECTION AND PARAMETRIZATION +# ************************************************************************** +# ************************************************************************** + +print (Fore.YELLOW + '\nStep 2 - TEST SELECTION') +print (Fore.YELLOW + '-------------------------------------------------') + +print (Fore.WHITE + " Parsing test case list for test selection...") +print (Fore.WHITE + " - TestCaseExclusionList : "+TestCaseExclusionList) +print (Fore.WHITE + " - testcasegroup : "+testcasegroup) + + +testcaseList=xmlRoot.findall('testCase') + +nb_total_testcases = 0 +nb_total_testcases_softmodem = 0 +nb_total_testcases_softmodem_noS1 = 0 +nb_total_testcases_compilation = 0 +nb_total_testcases_execution = 0 + +nb_run_testcases = 0 +nb_run_testcases_softmodem = 0 +nb_run_testcases_softmodem_noS1 = 0 +nb_run_testcases_compilation = 0 +nb_run_testcases_execution = 0 + + +for testcase in testcaseList: + try: + testcasename = testcase.get('id') + testcaseclass = testcase.findtext('class',default='') + desc = testcase.findtext('desc',default='') + nb_total_testcases+=1 + + run_flag = search_test_case_group(testcasename, testcasegroup, TestCaseExclusionList) + if (run_flag): + nb_run_testcases+=1 + + if testcaseclass == 'lte-softmodem' : + nb_total_testcases_softmodem+=1 + if (run_flag): nb_run_testcases_softmodem+=1 + elif testcaseclass == 'lte-softmodem-noS1': + nb_total_testcases_softmodem_noS1+=1 + if (run_flag): nb_run_testcases_softmodem_noS1+=1 + elif testcaseclass == 'compilation': + nb_total_testcases_compilation+=1 + if (run_flag): nb_run_testcases_compilation+=1 + elif testcaseclass == 'execution': + nb_total_testcases_execution+=1 + if (run_flag): nb_run_testcases_execution+=1 + else : + print "Unknown test case class: " + testcaseclass + sys.exit() + + except Exception, e: + error='' + error = error + ' In function: ' + sys._getframe().f_code.co_name + ': *** Caught exception: ' + str(e.__class__) + " : " + str( e) + error = error + '\n testcasename = ' + testcasename + '\n testcaseclass = ' + testcaseclass + '\n desc = ' + 'desc' + '\n' + error = error + traceback.format_exc() + print error + print "Continuing to next test case..." + +print (Fore.WHITE + " Parsing done...") + +print (Fore.WHITE + " - Total number of test cases : "+str(nb_total_testcases)) +print (Fore.WHITE + " - Total number class softmodem : "+str(nb_total_testcases_softmodem)) +print (Fore.WHITE + " - Total number class softmodem-noS1 : "+str(nb_total_testcases_softmodem_noS1)) +print (Fore.WHITE + " - Total number class compilation : "+str(nb_total_testcases_compilation)) +print (Fore.WHITE + " - Total number class execution : "+str(nb_total_testcases_execution)) +print +print (Fore.WHITE + " - Selected number of test cases : "+str(nb_run_testcases)) +print (Fore.WHITE + " - Selected class softmodem : "+str(nb_run_testcases_softmodem)) +print (Fore.WHITE + " - Selected class softmodem_noS1 : "+str(nb_run_testcases_softmodem_noS1)) +print (Fore.WHITE + " - Selected class compilation : "+str(nb_run_testcases_compilation)) +print (Fore.WHITE + " - Selected class execution : "+str(nb_run_testcases_execution)) + + +# ************************************************************************** +# ************************************************************************** +# STEP 3 - TEST CAMPAIGNS +# ************************************************************************** +# ************************************************************************** + +test_results = [] + + +print (Fore.YELLOW + '\nStep 3 - TEST CAMPAIGNS') +print (Fore.YELLOW + '-------------------------------------------------') + +print (Fore.WHITE + " Start test campaign...") threadListGlobal=[] -testcaseList=xmlRoot.findall('testCase') -#print testcaseList +run_count = 0 for testcase in testcaseList: try: testcasename = testcase.get('id') testcaseclass = testcase.findtext('class',default='') desc = testcase.findtext('desc',default='') #print "Machine list top level = " + ','.join(MachineList) + if search_test_case_group(testcasename, testcasegroup, TestCaseExclusionList) == True: + run_count+=1 + print (Fore.WHITE + " ("+str(run_count).zfill(3)+"/"+str(nb_run_testcases).zfill(3)+") - test case "+testcasename+" : "), if testcaseclass == 'lte-softmodem' : + #First we wait for all the test cases in generic test case class to finish as they are running in parallel + threadListGlobal = wait_testcaseclass_generic_threads(threadListGlobal, Timeout_execution) eNBMachine = testcase.findtext('eNB',default='') UEMachine = testcase.findtext('UE',default='') EPCMachine = testcase.findtext('EPC',default='') @@ -1561,9 +2499,8 @@ for testcase in testcaseList: print "One of the machines is not in the machine list" print "eNBMachine : " + eNBMachine + "UEMachine : " + UEMachine + "EPCMachine : " + EPCMachine + "MachineList : " + ','.join(MachineList) print "testcasename = " + testcasename + " class = " + testcaseclass - threadListGlobal = wait_testcaseclass_generic_threads(threadListGlobal, Timeout_execution) #cleanOldProgramsAllMachines(oai_list, CleanUpOldProgs, CleanUpAluLteBox, ExmimoRfStop) - handle_testcaseclass_softmodem (testcase, CleanUpOldProgs, logdirOAI5GRepo, logdirOpenaircnRepo, MachineList, user, pw, CleanUpAluLteBox, ExmimoRfStop, nruns_lte_softmodem, Timeout_cmd ) + handle_testcaseclass_softmodem (testcase, CleanUpOldProgs, logdirOAI5GRepo, logdirOpenaircnRepo, MachineList, user, pw, CleanUpAluLteBox, ExmimoRfStop, nruns_lte_softmodem, GitOAI5GRepoBranch, GitOpenaircnRepoBranch, Timeout_cmd ) #The lines below are copied from below to trace the failure of some of the machines in test setup. These lines below need to be removed in long term print "Creating xml file for overall results..." @@ -1580,6 +2517,23 @@ for testcase in testcaseList: SSHSessionWrapper('localhost', user, None, pw , NFSTestsResultsDir , locallogdir, "put_all") oai_localhost.disconnect() + elif testcaseclass == 'lte-softmodem-noS1' : + eNBMachine = testcase.findtext('eNB',default='') + UEMachine = testcase.findtext('UE',default='') + if (eNBMachine not in MachineList)|(UEMachine not in MachineList): + print "One of the machines is not in the machine list" + print "eNBMachine : " + eNBMachine + "UEMachine : " + UEMachine + "MachineList : " + ','.join(MachineList) + print "testcasename = " + testcasename + " class = " + testcaseclass + threadListGlobal = wait_testcaseclass_generic_threads(threadListGlobal, Timeout_execution) + + handle_testcaseclass_softmodem_noS1 (testcase, CleanUpOldProgs, logdirOAI5GRepo, logdirOpenaircnRepo, MachineList, user, pw, CleanUpAluLteBox, ExmimoRfStop, nruns_lte_softmodem, Timeout_cmd ) + + #The lines below are copied from below to trace the failure of some of the machines in test setup. These lines below need to be removed in long term + print "Creating xml file for overall results..." + cmd = "cat $OPENAIR_DIR/cmake_targets/autotests/log/*/*.xml > $OPENAIR_DIR/cmake_targets/autotests/log/results_autotests.xml " + res=os.system(cmd) + os.system('sync') + elif (testcaseclass == 'compilation'): threadListGlobal = handle_testcaseclass_generic (testcasename, threadListGlobal, CleanUpOldProgs, logdirOAI5GRepo, MachineListGeneric, user, pw, CleanUpAluLteBox,Timeout_execution, ExmimoRfStop) elif (testcaseclass == 'execution'): @@ -1604,6 +2558,22 @@ for param in threadListGlobal: thread_id = param["thread_id"] thread_id.join() + +# ************************************************************************** +# ************************************************************************** +# STEP 4 - TEST REPORT PRODUCTION +# ************************************************************************** +# ************************************************************************** + + + +test_session_stop_time = datetime.datetime.now() + +print (Fore.YELLOW + '\nStep 4 - TEST REPORT PRODUCTION') +print (Fore.YELLOW + '-------------------------------------------------') + +# XML test report +# -------------------------------------------------------------------- print "Creating xml file for overall results..." cmd = "cat $OPENAIR_DIR/cmake_targets/autotests/log/*/*.xml > $OPENAIR_DIR/cmake_targets/autotests/log/results_autotests.xml " res=os.system(cmd) @@ -1622,4 +2592,43 @@ res = oai_localhost.send_recv(cmd) oai_localhost.disconnect() + +# HTML test report +# -------------------------------------------------------------------- +if flag_generate_html_report: + + print "Creating html test report..." + + report_dir = reportdir + '/'+ test_session_start_time.strftime("%Y-%m-%d_%H-%M")+"_"+host + + cmd = 'mkdir -p ' + report_dir + result = os.system(cmd) + + cmd = 'cp -r '+locallogdir+' '+report_dir + result = os.system(cmd) + + context = { + 'report_path' : report_dir, + 'test_session_start_time' : test_session_start_time, + 'test_session_stop_time' : test_session_stop_time, + 'test_session_duration' : test_session_stop_time-test_session_start_time, + 'mtc_host' : host, + 'user' : user, + 'password' : pw, + 'test_results' : test_results, + } + + for test_result in test_results: + cmd = 'mkdir -p ' + report_dir + '/'+ test_result['testcase_name'] + result = os.system(cmd) + + report_file = report_dir + '/'+ test_result['testcase_name'] + '/'+ test_result['testcase_name']+ '_report.html' + + analyser.create_test_report_detailed_html(test_result, report_file ) + + # print test_result + + analyser.create_report_html(context) + + sys.exit() diff --git a/cmake_targets/autotests/templates/index.html b/cmake_targets/autotests/templates/index.html new file mode 100644 index 0000000000..10a15fb53d --- /dev/null +++ b/cmake_targets/autotests/templates/index.html @@ -0,0 +1,87 @@ + + + + + OAI5G UE Autotest Report + + + + +
+

OAI5G UE Autotest Report

+
+ +

+ + + + + + + + +
Test session configuration
Start time{{test_session_start_time}}
Stop time{{test_session_stop_time}}
Duration{{test_session_duration}}
MTC host{{mtc_host}}
User{{user}}
Password{{password}}
+

+ + +

Test Setup

+To be complete + +

+

UE phy-test performances tests results

+

Objectives

+

Checks that OAI UE can achieve at least 75 percent of the theoretical throughput.

+

Tests are done for all MCS (0 to 28) for 5MHz and 10MHz bandwidth.

+

Results

+ + + +{% for result in test_results|sort(attribute='testcase_name') %} + + + + {% if result.testcase_verdict == "PASS" %} + + {% elif result.testcase_verdict == "FAIL" %} + + {% else %} + + {% endif %} + + + + + + + + + + + + +{% endfor %} +
IDTAGVERDICTNB RUNSPASSFAILEDINCONSKIPPEDSEG FAULTTC TimeoutStartStopDurationDetails
{{result.testcase_name}}{{result.tags}}{{result.testcase_verdict}}{{result.testcase_verdict}}{{result.testcase_verdict}}{{result.nruns}}{{result.nb_run_pass}}{{result.nb_run_failed}}{{result.nb_run_inc}}{{result.nb_run_skip}}{{result.nb_seg_fault}}{{result.testcase_timeout}}{{result.testcase_time_start.strftime('%Y-%m-%d %H:%M:%S')}}{{result.testcase_time_stop.strftime('%Y-%m-%d %H:%M:%S')}}{{result.testcase_duration}}{{ result.testcase_name }}_report.html
+ + +

+

UE phy-test stability tests results

+

Objectives

+

To be complete

+

Results

+To be complete + + + + + diff --git a/cmake_targets/autotests/templates/testcase_report.html b/cmake_targets/autotests/templates/testcase_report.html new file mode 100644 index 0000000000..007ab56909 --- /dev/null +++ b/cmake_targets/autotests/templates/testcase_report.html @@ -0,0 +1,142 @@ + + + + + OAI5G UE test case report + + + + +
+

OAI5G UE test case report details

+
+ +

Test Case description

+

+ + + + + + + + + + + +
ID{{testcase_name}}
TAG{{tags}}
class{{testcaseclass}}
description
timeout{{testcase_timeout}}
number of runs{{nruns}}
eNB machine{{testcase_eNBMachine}}
UE machine{{testcase_UEMachine}}
+

+ + +

Test Case execution

+

+ + + + + + + + + + + + {% if testcase_verdict == "PASS" %} + + {% elif testcase_verdict == "FAIL" %} + + {% else %} + + {% endif %} + + + +
testcase_time_start{{testcase_time_start}}
testcase_time_stop{{testcase_time_stop}}
testcase_duration{{testcase_duration}}
Nb runs{{nruns}}
Nb PASS{{nb_run_pass}}
Nb FAILED{{nb_run_failed}}
Nb INCONCLUSIVE{{nb_run_inc}}
testcase_verdict{{testcase_verdict}}{{testcase_verdict}}{{testcase_verdict}}
Nb Seg Fault{{nb_seg_fault}}
+

+ + + +

Test Case runs results

+ +{% for run_results in runs_results|sort(attribute='run_id') %} +

RUN {{run_results.run_id}}

+ + + + + + + {% if run_results.run_verdict == "PASS" %} + + {% elif run_results.run_verdict == "FAIL" %} + + {% else %} + + {% endif %} + + + {% if run_results.ue_seg_fault_status == "NO_SEG_FAULT" %} + + {% elif run_results.ue_seg_fault_status == "SEG_FAULT" %} + + {% else %} + + {% endif %} + +
run_start_time {{run_results.run_start_time}}
run_stop_time{{run_results.run_stop_time}}
run_duration{{run_results.run_duration}}
run_verdict{{run_results.run_verdict}}{{run_results.run_verdict}}{{run_results.run_verdict}}
Seg Fault Satus{{run_results.ue_seg_fault_status}}{{run_results.ue_seg_fault_status}}unknown
+ + {% for run_metrics in run_results.runs_metrics %} +

+ + + + + + + + + + {% if run_metrics.pass_fail_stat is defined %} + + {% endif %} + {% if run_metrics.pass_fail_min_limit is defined %} + + {% endif %} + {% if run_metrics.pass_fail_max_limit is defined %} + + {% endif %} + + +
metric_id{{run_metrics.metric_id}}
Description{{run_metrics.metric_desc}}
Unit of measure{{run_metrics.metric_uom}}
metric_min{{run_metrics.metric_min}}
metric_max{{run_metrics.metric_max}}
metric_mean{{run_metrics.metric_mean}}
metric_median{{run_metrics.metric_median}}
Pass/fail stat{{run_metrics.pass_fail_stat}}
Pass/fail min limit{{run_metrics.pass_fail_min_limit}}
Pass/fail max limit{{run_metrics.pass_fail_max_limit}}
metric_fig
+ + {% endfor %} + + {% if run_results.run_traffic.traffic_count != 0 %} +

+ + + + + + + + + +
Iperf metricminmaxmeanmedian
Bandwidth {{run_results.run_traffic.bw_min}}{{run_results.run_traffic.bw_max}}{{run_results.run_traffic.bw_mean}}{{run_results.run_traffic.bw_median}}
Jitter{{run_results.run_traffic.jitter_min}}{{run_results.run_traffic.jitter_max}}{{run_results.run_traffic.jitter_mean}}{{run_results.run_traffic.jitter_median}}
Loss rate{{run_results.run_traffic.rl_min}}{{run_results.run_traffic.rl_max}}{{run_results.run_traffic.rl_mean}}{{run_results.run_traffic.rl_median}}
Iperf duration{{run_results.run_traffic.iperf_duration}}Pass/Fail criteria (min duration){{run_results.run_traffic.dur_pass_fail_crit}}
traffic_fig
+ {% endif %} + +{% endfor %} + + + diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 98c7247e30..d9ed38a4ec 100644 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1,18 +1,19 @@ -mozart hutch starsky stevens amerique calisson nano qseven + +amerique mozart hutch starsky stevens calisson nano superserver /mnt/sradio/TEST_RESULTS/ https://gitlab.eurecom.fr/oai/openairinterface5g.git https://gitlab.eurecom.fr/oai/openair-cn.git develop develop - oaisim oaisim_nos1 lte-softmodem lte-softmodem-nos1 mme_gw run_epc auth_request run_hss oai_hss mme spgw hss hss_sim configure_cots* wvdial iperf iperf_script iperf_script_phone ping tshark rrh_gw iperf3 iperf3_script iperf3_script_phone pppd starthss start_ltebox stop_ltebox configure_cots_sony_experia_m4_ue configure_cots_huaweiE398_ue configure_cots_bandrich_ue + oaisim oaisim_nos1 lte-softmodem lte-softmodem-nos1 mme_gw run_epc auth_request run_hss oai_hss mme spgw hss hss_sim wvdial iperf iperf_script iperf_script_phone ping tshark rrh_gw iperf3 iperf3_script iperf3_script_phone pppd starthss start_ltebox stop_ltebox configure_cots_sony_experia_m4_ue configure_cots_huaweiE398_ue configure_cots_bandrich_ue sudo -S -E /opt/ltebox/tools/stop_ltebox exmimo_pci=`lspci -m | grep Xilinx`; if [ -n "$exmimo_pci" ] ; then $OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; fi; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg 36000 - 010141 0102+ 010304 010305 0104+ 015502 015505 015506 015507 015508 015509 015510 015511 015514 015517 015602 015605 015702 015705 015802 015805 015808 015811 016102 016105 016502 016505 017002 017005 017502 017505 018002 018005 018502 018505 025502 025505 025508 025511 + 010141 0102+ 010301 010303 010304 010305 0104+ 015508 015511 015520 015523 015518 015519 015520 015521 015522 015523 015602 015605 015818 015819 015820 015821 015822 015823 016102 016105 016502 016505 017002 017005 018002 018005 018502 018505 025514 025517 025520 025523 025518 025519 025520 025521 025522 025523 3 - mozart hutch starsky stevens amerique calisson + nano mozart hutch starsky stevens calisson superserver compilation Build oaisim.Rel8 @@ -61,8 +62,7 @@ --oaisim -r Rel10 --noS1 -c $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/rb_tool - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/CMakeFiles/nasmesh/nasmesh.ko - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/CMakeFiles/oai_nw_drv/oai_nw_drv.ko + $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/CMakeFiles/nasmesh/nasmesh.ko $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash @@ -270,27 +270,17 @@ compilation - Build phy unitary simulators + secuirity unitary tests + Build phy unitary simulators $OPENAIR_DIR/cmake_targets/build_oai - --phy_simulators --core_simulators -c + --phy_simulators -c $OPENAIR_DIR/cmake_targets/lte-simulators/build/dlsim $OPENAIR_DIR/cmake_targets/lte-simulators/build/ulsim $OPENAIR_DIR/cmake_targets/lte-simulators/build/pucchsim $OPENAIR_DIR/cmake_targets/lte-simulators/build/prachsim $OPENAIR_DIR/cmake_targets/lte-simulators/build/pdcchsim $OPENAIR_DIR/cmake_targets/lte-simulators/build/pbchsim - $OPENAIR_DIR/cmake_targets/lte-simulators/build/mbmssim - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_kenb - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_encrypt - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_decrypt - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea2 - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea1 - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_kdf - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_cmac_encrypt - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia2 + $OPENAIR_DIR/cmake_targets/lte-simulators/build/mbmssim $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash @@ -301,7 +291,6 @@ 1 - compilation Build RRH Gateway for USRP(RF) + Ethernet (Transport) @@ -381,6 +370,85 @@ 1 + + compilation + Build RRU (NGFI) for USRP (Rel 10) w/ ETHERNET transport + + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -t ETHERNET -c + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_usrpdevif.so + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + + + + + RRU.USRP.Rel10 + 1 + + + + compilation + Build RRU (NGFI) for EXMIMO (Rel 10) w/ ETHERNET transport + + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w EXMIMO -t ETHERNET -c + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/CMakeFiles/openair_rf/openair_rf.ko + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/updatefw + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/oarf_config_exmimo.oct + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_exmimodevif.so + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + + + + + RRU.EXMIMO.Rel10 + 1 + + + + compilation + Build RRU (NGFI) for BLADERF (Rel 10) w/ ETHERNET transport + + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w BLADERF -t ETHERNET -c + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_bladerfdevif.so + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + + + + + RRU.BLADERF.Rel10 + 1 + + + + compilation + Build RRU (NGFI) for LMSSDR (Rel 10) w/ ETHERNET transport + + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w LMSSDR -t ETHERNET -c + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_lmssdrdevif.so + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/liboai_eth_transpro.so + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + + + + + RRU.LMSSDR.Rel10 + 1 + + execution Run OAISIM Rel10 TDD, 1 eNB + 1 UE (5 MHz/10MHz/20MHz), (TM 1,2) and search for errors, segmentation fault or exit @@ -390,13 +458,13 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -s15 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -s15 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -s15 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -s15 oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" segmentation fault|assertion|exiting|fatal @@ -412,13 +480,13 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -a -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -a -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -a -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -a -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -a -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -a -s15 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -a -s15 oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" segmentation fault|assertion|exiting|fatal @@ -434,13 +502,13 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -s15 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -s15 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -s15 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -s15 oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2" segmentation fault|assertion|exiting|fatal @@ -456,13 +524,13 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -a -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -a -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -a -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -a -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -a -s15 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -a -s15 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -a -s15 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -a -s15 oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_nos1.tdd.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2" segmentation fault|assertion|exiting|fatal @@ -478,13 +546,13 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -c26 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -c26 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -c26 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -c26 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -c26 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -c26 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -c26 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -c26 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -c26 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -c26 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -c26 + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -c26 oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2 "DL and UL loss rate below 10" segmentation fault|assertion|exiting|fatal @@ -500,13 +568,13 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -c26 -a - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -c26 -a - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -c26 -a - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -c26 -a - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -c26 -a - -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -c26 -a + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -c26 -a + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -c26 -a + -O $OPENAIR_LOGDIR/enb.band38.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -c26 -a + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -c26 -a + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -c26 -a + -O $OPENAIR_LOGDIR/enb.band38.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -c26 -a oaisim_noS1.tdd.5MHz.TM1 oaisim_noS1.tdd.10MHz.TM1 oaisim_noS1.tdd.20MHz.TM1 oaisim_noS1.tdd.5MHz.TM2 oaisim_noS1.tdd.10MHz.TM2 oaisim_noS1.tdd.20MHz.TM2 "DL and UL loss rate below 10" segmentation fault|assertion|exiting|fatal @@ -521,13 +589,13 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F -s15 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -s15 oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" segmentation fault|assertion|exiting|fatal @@ -542,13 +610,13 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F -a -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F -a -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F -a -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F -a -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F -a -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F -a -s15 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -a -s15 oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" segmentation fault|assertion|exiting|fatal @@ -563,13 +631,13 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -F -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -F -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -F -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -F -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -F -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -F -s15 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -F -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -F -s15 oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2" segmentation fault|assertion|exiting|fatal @@ -584,13 +652,13 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 1 -F -a -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 1 -F -a -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 1 -F -a -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -x 2 -F -a -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -x 2 -F -a -s15 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -x 2 -F -a -s15 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 25 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 50 -F -a -s15 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u3 -n100 -R 100 -F -a -s15 oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2 "Received RRCConnectionReconfigurationComplete from UE 0" "Received RRCConnectionReconfigurationComplete from UE 1" "Received RRCConnectionReconfigurationComplete from UE 2" segmentation fault|assertion|exiting|fatal @@ -605,13 +673,13 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F -c26 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F -c26 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F -c26 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F -c26 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F -c26 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F -c26 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -c26 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -c26 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -c26 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -c26 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -c26 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -c26 oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2 "DL and UL loss rate below 10" segmentation fault|assertion|exiting|fatal @@ -626,13 +694,13 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 1 -F -c26 -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 1 -F -c26 -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 1 -F -c26 -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -x 2 -F -c26 -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -x 2 -F -c26 -a - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -x 2 -F -c26 -a + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -c26 -a + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -c26 -a + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -c26 -a + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 25 -F -c26 -a + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 50 -F -c26 -a + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -b1 -u1 -n100 -R 100 -F -c26 -a oaisim_noS1.FDD.5MHz.TM1 oaisim_noS1.FDD.10MHz.TM1 oaisim_noS1.FDD.20MHz.TM1 oaisim_noS1.FDD.5MHz.TM2 oaisim_noS1.FDD.10MHz.TM2 oaisim_noS1.FDD.20MHz.TM2 "DL and UL loss rate below 10" segmentation fault|assertion|exiting|fatal @@ -647,8 +715,8 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -l7 -x 1 -Q3 -n 100 -b1 -u1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -l7 -Q3 -n 100 -b1 -u1 "Found MBSFNAreaConfiguration from eNB 0" segmentation fault|assertion|exiting|fatal oaisim_noS1.eMBMS @@ -663,8 +731,8 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -l7 -x 1 -T mscbr -Q3 -n 100 -b1 -u1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -l7 -T mscbr -Q3 -n 100 -b1 -u1 "Received a multicast packet" segmentation fault|assertion|exiting|fatal oaisim_noS1.eMBMS @@ -679,8 +747,8 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -l7 -F -T mscbr -x 1 -Q3 -n 100 -b1 -u1 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -l7 -F -T mscbr -Q3 -n 100 -b1 -u1 "Received a multicast packet" segmentation fault|assertion|exiting|fatal oaisim_noS1.eMBMS @@ -695,8 +763,8 @@ --oaisim --noS1 -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 - $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 - -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf -A AWGN -l7 -c43 -F -T mbvbr -Q4 -j1 -n120 + sudo -E $OPENAIR_DIR/cmake_targets/oaisim_noS1_build_oai/build/oaisim_nos1 + -O $OPENAIR_TARGETS/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.generic.oaisim.local_no_mme.conf -A AWGN -l7 -c43 -F -T mbvbr -Q4 -j1 -n120 "MTCH for sync area 1" segmentation fault|assertion|exiting|fatal oaisim_noS1.eMBMS @@ -711,7 +779,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_cmac_encrypt + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_cmac_encrypt --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -727,7 +795,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_decrypt + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_decrypt --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -743,7 +811,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_encrypt + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_aes128_ctr_encrypt --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -759,7 +827,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_kenb + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_kenb --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -775,7 +843,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -791,7 +859,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea1 + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea1 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -807,7 +875,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea2 + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eea2 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -823,7 +891,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -839,7 +907,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_secu_knas_encrypt_eia1 --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -855,7 +923,7 @@ --core_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_kdf + $OPENAIR_DIR/cmake_targets/lte-simulators/build/test_kdf --verbose "finished with 0 errors" segmentation fault|assertion|exiting|fatal @@ -873,27 +941,35 @@ (Test 7b, 5 MHz, R3-1.FDD (MCS 15), ETU70, 1.4 dB (30%)), (Test 10, 5 MHz, R6.FDD (MCS 25), EVA5, 17.4 dB (70%)), (Test 10b, 5 MHz, R6-1.FDD (MCS 24,18 PRB), EVA5, 17.5dB (70%)), - (Test 11, 10 MHz, R7.FDD (MCS 25), EVA5, 17.7dB (70%)) + (Test 11, 10 MHz, R7.FDD (MCS 25), EVA5, 17.7dB (70%)), + (Test 11b, 10 MHz, R7-1.FDD (MCS 25), EVA5, 16.7dB (70%)), + (Test 15, 20 MHz, R.9 FDD (MCS 26), EVA5, 17.6dB (70%)), + (Test 15b, 20 MHz, R.9-2 FDD (MCS 26, 17PRB), EVA5, 17.3dB (70%)), + (Test 15c, 20 MHz, R.9-1 FDD (MCS 26, 83 PRB), EVA5, 16.6dB (70%)), + (TM2 Test 1 10 MHz, R.11 FDD (MCS 14), EVA5, 6.8 dB (70%)), - (TM2 Test 1b 20 MHz, R.11-2 FDD (MCS 13), EVA5, 5.9 dB (70%)), + (TM2 Test 1b 5 MHz, R.11-2 FDD (MCS 13), EVA5, 5.9 dB (70%)), $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/dlsim - -m5 -gF -s-1 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 -L + $OPENAIR_DIR/cmake_targets/lte-simulators/build/dlsim + -m5 -gF -s-1 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 -m4 -gF -s0 -w1.0 -f.2 -n500 -B6 -c4 -z2 -O70 - -m15 -gF -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 -L - -m14 -gF -s6.7 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O70 -L - -m15 -gG -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O30 -L - -m14 -gG -s1.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O30 -L - -m25 -gF -s17.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O70 -L - -m25 -gF -s17.5 -w1.0 -f.2 -n500 -B25 -c3 -z2 -r1022 -O70 -L - -m26 -gF -s17.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 -L - -m14 -gF -s6.8 -w1.0 -f.2 -n500 -B50 -c2 -x2 -y2 -z2 -O70 -L - -m13 -gF -s5.9 -w1.0 -f.2 -n500 -B25 -c3 -x2 -y2 -z2 -O70 -L + -m15 -gF -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 + -m14 -gF -s6.7 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O70 + -m15 -gG -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O30 + -m14 -gG -s1.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O30 + -m25 -gF -s17.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O70 + -m25 -gF -s17.5 -w1.0 -f.2 -n500 -B25 -c3 -z2 -r1022 -O70 + -m26 -gF -s17.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 + -m26 -gF -s17.6 -w1.0 -f.2 -n500 -B100 -c2 -z2 -O70 + -m26 -gF -s17.3 -w1.0 -f.2 -n500 -B100 -c2 -z2 -r1600 -O70 + -m26 -gF -s16.6 -w1.0 -f.2 -n500 -B100 -c2 -z2 -r1899 -O70 + -m14 -gF -s6.8 -w1.0 -f.2 -n500 -B50 -c2 -x2 -y2 -z2 -O70 + -m13 -gF -s5.9 -w1.0 -f.2 -n500 -B25 -c3 -x2 -y2 -z2 -O70 dlsim.test1 dlsim.test5 dlsim.test6 dlsim.test6b dlsim.test7 dlsim.test7b dlsim.test10 dlsim.test10b dlsim.test11 dlsim.TM2_test1 dlsim.TM2_test1b "passed" segmentation fault|assertion|exiting|fatal @@ -913,7 +989,7 @@ --phy_simulators -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/lte-simulators/build/ulsim + $OPENAIR_DIR/cmake_targets/lte-simulators/build/ulsim -B25 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70 -L -B25 -m16 -y1 -gN -x1 -s12 -w1.0 -e.1 -P -n500 -O70 -L -B50 -m5 -y1 -gN -x1 -s6 -w1.0 -e.1 -P -n500 -O70 -L @@ -926,6 +1002,43 @@ 3 + + execution + dlsim_tm4 test cases (Test 1: 10 MHz, R2.FDD (MCS 5), EVA5, -1dB), + (Test 5: 1.4 MHz, R4.FDD (MCS 4), EVA5, 0dB (70%)), + (Test 6, 10 MHz, R3.FDD (MCS 15), EVA5, 6.7dB (70%)), + (Test 6b, 5 MHz, R3-1.FDD (MCS 15), EVA5, 6.7dB (70%)), + (Test 7, 5 MHz, R3-1.FDD (MCS 15), EVA5, 6.7dB (30%)), + (Test 7b, 5 MHz, R3-1.FDD (MCS 15), ETU70, 1.4 dB (30%)), + (Test 10, 5 MHz, R6.FDD (MCS 25), EVA5, 17.4 dB (70%)), + (Test 10b, 5 MHz, R6-1.FDD (MCS 24,18 PRB), EVA5, 17.5dB (70%)), + (Test 11, 10 MHz, R7.FDD (MCS 25), EVA5, 17.7dB (70%)) + (TM2 Test 1 10 MHz, R.11 FDD (MCS 14), EVA5, 6.8 dB (70%)), + (TM2 Test 1b 20 MHz, R.11-2 FDD (MCS 13), EVA5, 5.9 dB (70%)), + + + $OPENAIR_DIR/cmake_targets/build_oai + --phy_simulators -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/lte-simulators/build/dlsim_tm4 + -m5 -gF -s-1 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 + -m4 -gF -s0 -w1.0 -f.2 -n500 -B6 -c4 -z2 -O70 + -m15 -gF -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 + -m14 -gF -s6.7 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O70 + -m15 -gG -s6.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O30 + -m14 -gG -s1.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O30 + -m25 -gF -s17.4 -w1.0 -f.2 -n500 -B25 -c3 -z2 -O70 + -m25 -gF -s17.5 -w1.0 -f.2 -n500 -B25 -c3 -z2 -r1022 -O70 + -m26 -gF -s17.7 -w1.0 -f.2 -n500 -B50 -c2 -z2 -O70 + -m14 -gF -s6.8 -w1.0 -f.2 -n500 -B50 -c2 -x2 -y2 -z2 -O70 + -m13 -gF -s5.9 -w1.0 -f.2 -n500 -B25 -c3 -x2 -y2 -z2 -O70 + dlsim_tm4.test1 dlsim_tm4.test5 dlsim_tm4.test6 dlsim_tm4.test6b dlsim_tm4.test7 dlsim_tm4.test7b dlsim_tm4.test10 dlsim_tm4.test10b dlsim_tm4.test11 dlsim_tm4.TM2_test1 dlsim_tm4.TM2_test1b + "passed" + segmentation fault|assertion|exiting|fatal + 3 + + lte-softmodem @@ -952,11 +1065,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -971,7 +1084,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s @@ -1027,11 +1140,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1046,7 +1159,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s @@ -1090,6 +1203,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" @@ -1101,11 +1215,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1120,7 +1234,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14M @@ -1175,11 +1289,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1194,7 +1308,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -u + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m -u False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -1248,11 +1362,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1266,7 +1380,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -u + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m -u throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -1312,6 +1426,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 @@ -1321,11 +1436,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1340,9 +1455,9 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m - throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + throughput_test min=0.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -1361,7 +1476,7 @@ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33M -i 1 -f m -u False @@ -1378,29 +1493,31 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 25 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -1415,7 +1532,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue;$OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s @@ -1440,7 +1557,7 @@ throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec False - USRPb210.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.UL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 10 @@ -1453,29 +1570,31 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 50 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -1489,7 +1608,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue;$OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s @@ -1514,7 +1633,7 @@ throughput_test min=0.0Mbits/sec max=2.0Mbits/sec average=2.0Mbits/sec False - USRPb210.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.UL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 10 @@ -1526,29 +1645,32 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 100 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf -E @@ -1563,7 +1685,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 28Mbits/s @@ -1588,7 +1710,7 @@ throughput_test min=0.0Mbits/sec max=4.0Mbits/sec average=4.0Mbits/sec False - USRPb210.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.UL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 10 @@ -1600,29 +1722,31 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 25 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -1637,7 +1761,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec @@ -1658,11 +1782,11 @@ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 16Mbits/s False - USRPb210.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.DL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 10 @@ -1674,29 +1798,31 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 50 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf @@ -1711,7 +1837,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -1732,11 +1858,11 @@ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33Mbits/s -i 1 -f m False - USRPb210.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.DL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 10 @@ -1748,29 +1874,32 @@ amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 100 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 2 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf -E @@ -1785,7 +1914,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec @@ -1806,11 +1935,11 @@ /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33Mbits/s False - USRPb210.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.DL.2TX.2RX + USRPb210.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 10 @@ -1840,11 +1969,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1915,11 +2044,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -1980,6 +2109,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 @@ -1989,11 +2119,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2063,11 +2193,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2082,7 +2212,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -2136,11 +2266,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2154,7 +2284,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -2200,6 +2330,7 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 @@ -2209,11 +2340,11 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -2228,7 +2359,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec @@ -2258,6 +2389,469 @@ + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue;$OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPb210.ALU_EPC.Bandrich.5MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + > + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue;$OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=2.0Mbits/sec average=2.0Mbits/sec + + False + USRPb210.ALU_EPC.Bandrich.10MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf -E + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=4.0Mbits/sec average=4.0Mbits/sec + + False + USRPb210.ALU_EPC.Bandrich.20MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 + + + False + USRPb210.ALU_EPC.Bandrich.5MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s -i 1 -f m + + + False + USRPb210.ALU_EPC.Bandrich.10MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf -E + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s + + + False + USRPb210.ALU_EPC.Bandrich.20MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem @@ -2304,7 +2898,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s @@ -2388,7 +2982,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s @@ -2472,7 +3066,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -2556,7 +3150,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=00.0Mbits/sec max=10.5Mbits/sec average=11.0Mbits/sec @@ -2640,7 +3234,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec @@ -2724,7 +3318,7 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=42.0Mbits/sec average=44.0Mbits/sec @@ -2765,7 +3359,7 @@ lte-softmodem - calisson + hutch stevens nano 390 @@ -2783,10 +3377,10 @@ targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c @@ -2806,9 +3400,9 @@ $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s @@ -2818,30 +3412,35 @@ /tmp ETC/hss.conf MYSQL_user \"root\" ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"92\";MME_GID=\"4\";MME_CODE=\"1\";}" ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"92\";TAC=\"1\";}" - ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth0\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" ETC/mme.conf MME_PORT_FOR_S11_MME 2123 ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" ETC/mme.conf OUTPUT \"CONSOLE\" - ETC/mme.conf HSS_HOSTNAME \"hss\" + ETC/mme.conf HSS_HOSTNAME \"nano\" ETC/mme_fd.conf Identity \"nano.openair4G.eur\" - ETC/hss_fd.conf Identity \"hss.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 - ETC/spgw.conf PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.62/24\" - ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" - sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai -vf; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c - sudo mkdir -p /usr/local/etc/oai/freeDiamter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ hss.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c c - $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E ifconfig eth0 add 192.172.0.1 + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash sleep 10;$OPENAIRCN_DIR/TEST/autotests/tools/run_epc @@ -2859,7 +3458,7 @@ c lte-softmodem - calisson + hutch stevens nano 390 @@ -2877,10 +3476,10 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c @@ -2900,9 +3499,9 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s @@ -2912,27 +3511,32 @@ c /tmp ETC/hss.conf MYSQL_user \"root\" ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"92\";MME_GID=\"4\";MME_CODE=\"1\";}" ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"92\";TAC=\"1\";}" - ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth0\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" ETC/mme.conf MME_PORT_FOR_S11_MME 2123 ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" ETC/mme.conf OUTPUT \"CONSOLE\" - ETC/mme.conf HSS_HOSTNAME \"hss\" + ETC/mme.conf HSS_HOSTNAME \"nano\" ETC/mme_fd.conf Identity \"nano.openair4G.eur\" - ETC/hss_fd.conf Identity \"hss.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 - ETC/spgw.conf PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.62/24\" - ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" - sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai -vf; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c - sudo mkdir -p /usr/local/etc/oai/freeDiamter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ hss.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E ifconfig eth0 add 192.172.0.1 @@ -2953,7 +3557,7 @@ c lte-softmodem - calisson + hutch stevens nano 390 @@ -2962,7 +3566,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 100 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.62\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 @@ -2971,10 +3575,10 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c @@ -2994,9 +3598,9 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 28Mbits/s @@ -3006,27 +3610,32 @@ c /tmp ETC/hss.conf MYSQL_user \"root\" ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"92\";MME_GID=\"4\";MME_CODE=\"1\";}" ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"92\";TAC=\"1\";}" - ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth0\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" ETC/mme.conf MME_PORT_FOR_S11_MME 2123 ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" ETC/mme.conf OUTPUT \"CONSOLE\" - ETC/mme.conf HSS_HOSTNAME \"hss\" + ETC/mme.conf HSS_HOSTNAME \"nano\" ETC/mme_fd.conf Identity \"nano.openair4G.eur\" - ETC/hss_fd.conf Identity \"hss.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 - ETC/spgw.conf PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.62/24\" - ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" - sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai -vf; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c - sudo mkdir -p /usr/local/etc/oai/freeDiamter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ hss.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E ifconfig eth0 add 192.172.0.1 @@ -3047,7 +3656,7 @@ c lte-softmodem - calisson + hutch stevens nano 390 @@ -3065,10 +3674,10 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c @@ -3088,39 +3697,44 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 10M -R + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m -u - throughput_test min=0.0Mbits/sec max=9Mbits/sec average=9Mbits/sec - False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + /tmp ETC/hss.conf MYSQL_user \"root\" ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"92\";MME_GID=\"4\";MME_CODE=\"1\";}" ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"92\";TAC=\"1\";}" - ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth0\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" ETC/mme.conf MME_PORT_FOR_S11_MME 2123 ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" ETC/mme.conf OUTPUT \"CONSOLE\" - ETC/mme.conf HSS_HOSTNAME \"hss\" + ETC/mme.conf HSS_HOSTNAME \"nano\" ETC/mme_fd.conf Identity \"nano.openair4G.eur\" - ETC/hss_fd.conf Identity \"hss.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 - ETC/spgw.conf PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.62/24\" - ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" - sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai -vf; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c - sudo mkdir -p /usr/local/etc/oai/freeDiamter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ hss.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E ifconfig eth0 add 192.172.0.1 @@ -3129,7 +3743,7 @@ c cp -vf $OPENAIRCN_DIR/ETC/*.conf $OPENAIRCN_TESTDIR/; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db - $OPENAIRCN_DIR/TEST/autotests/tools/iperf3_script 5 lo -s -i 1 -f m + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 16M -i 1 -f m -u @@ -3141,7 +3755,7 @@ c lte-softmodem - calisson + hutch stevens nano 390 @@ -3159,10 +3773,10 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c @@ -3182,48 +3796,54 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 10M -R + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m -u - throughput_test min=0.0Mbits/sec max=9Mbits/sec average=9Mbits/sec - False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=9.0Mbits/sec + /tmp ETC/hss.conf MYSQL_user \"root\" ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"92\";MME_GID=\"4\";MME_CODE=\"1\";}" ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"92\";TAC=\"1\";}" - ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth0\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" ETC/mme.conf MME_PORT_FOR_S11_MME 2123 ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" ETC/mme.conf OUTPUT \"CONSOLE\" - ETC/mme.conf HSS_HOSTNAME \"hss\" + ETC/mme.conf HSS_HOSTNAME \"nano\" ETC/mme_fd.conf Identity \"nano.openair4G.eur\" - ETC/hss_fd.conf Identity \"hss.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 - ETC/spgw.conf PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.62/24\" - ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" - sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai -vf; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c - sudo mkdir -p /usr/local/etc/oai/freeDiamter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ hss.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c -c + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E ifconfig eth0 add 192.172.0.1 sleep 10;$OPENAIRCN_DIR/TEST/autotests/tools/run_epc cp -vf $OPENAIRCN_DIR/ETC/*.conf $OPENAIRCN_TESTDIR/; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db - $OPENAIRCN_DIR/TEST/autotests/tools/iperf3_script 5 lo -s -i 1 -f m + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b33M -i 1 -f m -u @@ -3235,7 +3855,7 @@ c lte-softmodem - calisson + hutch stevens nano 390 @@ -3244,7 +3864,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 100 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.62\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 @@ -3253,10 +3873,10 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w USRP -c @@ -3276,39 +3896,45 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 9M -R + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m -u - throughput_test min=0.0Mbits/sec max=9Mbits/sec average=9Mbits/sec - False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=9.0Mbits/sec + + /tmp ETC/hss.conf MYSQL_user \"root\" ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"92\";MME_GID=\"4\";MME_CODE=\"1\";}" ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"92\";TAC=\"1\";}" - ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth0\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" ETC/mme.conf MME_PORT_FOR_S11_MME 2123 ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" ETC/mme.conf OUTPUT \"CONSOLE\" - ETC/mme.conf HSS_HOSTNAME \"hss\" + ETC/mme.conf HSS_HOSTNAME \"nano\" ETC/mme_fd.conf Identity \"nano.openair4G.eur\" - ETC/hss_fd.conf Identity \"hss.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 - ETC/spgw.conf PGW_IPV4_ADDRESS_FOR_SGI \"192.168.12.62/24\" - ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\",\"192.172.1.0/24\" - sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai -vf; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c - sudo mkdir -p /usr/local/etc/oai/freeDiamter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ hss.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E ifconfig eth0 add 192.172.0.1 @@ -3317,7 +3943,7 @@ c cp -vf $OPENAIRCN_DIR/ETC/*.conf $OPENAIRCN_TESTDIR/; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db - $OPENAIRCN_DIR/TEST/autotests/tools/iperf3_script 5 lo -s -i 1 -f m + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b55M -i 1 -f m -u @@ -3351,11 +3977,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3369,7 +3995,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s @@ -3423,11 +4049,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3441,7 +4067,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s @@ -3488,17 +4114,18 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3513,7 +4140,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 17Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 17Mbits/s @@ -3566,11 +4193,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3585,7 +4212,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -3637,11 +4264,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3656,7 +4283,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -3676,7 +4303,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s -i 1 -f m -u + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 31Mbits/s -i 1 -f m -u False @@ -3702,17 +4329,18 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3727,7 +4355,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -3747,7 +4375,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33Mbits/s False @@ -3779,11 +4407,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3797,7 +4425,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 @@ -3851,11 +4479,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3869,7 +4497,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 @@ -3916,17 +4544,18 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -3941,7 +4570,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 @@ -3994,11 +4623,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -4013,7 +4642,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4065,11 +4694,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -4084,7 +4713,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4130,17 +4759,18 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w USRP -x -c + --eNB -w USRP -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf @@ -4155,7 +4785,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4175,7 +4805,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 75 lo -c 192.172.0.2 + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 False @@ -4183,6 +4813,890 @@ c 10 + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m -u + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf pdsch_referenceSignalPower -23 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 28Mbits/s + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -u -f m -b 16M + + + False + USRPx310.ALU_EPC.Bandrich.5MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s -i 1 -f m -u + + + False + USRPx310.ALU_EPC.Bandrich.10MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf pdsch_referenceSignalPower -23 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33Mbits/s + + + False + USRPx310.ALU_EPC.Bandrich.20MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.5MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.10MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf pdsch_referenceSignalPower -23 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPx310.ALU_EPC.Bandrich.20MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPx310.ALU_EPC.Bandrich.5MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPx310.ALU_EPC.Bandrich.10MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + mozart + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf pdsch_referenceSignalPower -23 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c --disable-cpu-affinity + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_usrpb210.py --stop-usrpb210 ; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S /usr/local/bin/niusrprio_pcie start ; dmesg|tail + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpx310.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPx310.ALU_EPC.Bandrich.20MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + @@ -4228,7 +5742,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -4311,7 +5825,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -4364,6 +5878,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.62\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 @@ -4392,7 +5907,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 17Mbits/s @@ -4473,7 +5988,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=00.0Mbits/sec max=10.5Mbits/sec average=11.0Mbits/sec @@ -4554,7 +6069,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec @@ -4607,6 +6122,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.62\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf downlink_frequency 2660000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 @@ -4635,7 +6151,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec @@ -4664,7 +6180,7 @@ c -r sleep 10; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -u -c 192.172.0.2 -b 33Mbits/s @@ -4691,17 +6207,17 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w EXMIMO -x -c + --eNB -w EXMIMO -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4715,7 +6231,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 7Mbits/s @@ -4769,11 +6285,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w EXMIMO -x -c + --eNB -w EXMIMO -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4788,7 +6304,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 14Mbits/s @@ -4825,21 +6341,22 @@ c amerique 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf N_RB_DL 100 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_INTERFACE_NAME_FOR_S1U \"eth5\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf pdsch_referenceSignalPower -23 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai --eNB -w EXMIMO -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail @@ -4860,7 +6377,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -4913,11 +6430,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w EXMIMO -x -c + --eNB -w EXMIMO -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -4932,7 +6449,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 10M -R + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -4952,7 +6469,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf3_script 5 lo -s -i 1 -f m + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -u -f m -b 16M False @@ -4984,11 +6501,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w EXMIMO -x -c + --eNB -w EXMIMO -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -5003,7 +6520,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf3_script 1 ppp0 -c 192.172.0.1 -i 1 -u -f m -B 192.172.0.2 -b 20M -R + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5023,7 +6540,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf3_script 5 lo -s -i 1 -f m + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -u -f m -b 32M False @@ -5055,11 +6572,11 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.82/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf ENB_PORT_FOR_S1U 2152 $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w EXMIMO -x -c + --eNB -w EXMIMO -x -c --disable-cpu-affinity $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo -E -S $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2 ; dmesg|tail $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf @@ -5074,7 +6591,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5094,7 +6611,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s + OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -u -f m -b 16M False @@ -5148,7 +6665,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -5231,7 +6748,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -5312,7 +6829,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -5393,7 +6910,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=00.0Mbits/sec max=10.5Mbits/sec average=11.0Mbits/sec @@ -5474,7 +6991,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec @@ -5555,7 +7072,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=21.0Mbits/sec average=22.0Mbits/sec @@ -5640,7 +7157,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -5716,7 +7233,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -5791,7 +7308,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -5866,7 +7383,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -5939,7 +7456,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -6014,7 +7531,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec @@ -6089,7 +7606,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -6165,7 +7682,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -6240,7 +7757,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s @@ -6315,7 +7832,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m False sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue @@ -6388,7 +7905,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec @@ -6463,7 +7980,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m throughput_test min=0.0Mbits/sec max=15.0Mbits/sec average=15.0Mbits/sec @@ -6495,67 +8012,90 @@ c lte-softmodem - calisson + superserver stevens amerique - mozart + hutch 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 25 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -26 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=70;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_function \"NGFI_RCC_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -24 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"em2\";remote_address=\"00:25:90:f0:f1:2f\";local_address=\"0c:c4:7a:82:95:95\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w None -t ETHERNET -x -c --disable-deadline + --eNB -w None -t ETHERNET -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf + sleep 30; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf False + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_function \"NGFI_RRU_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -24 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"eth3\";remote_address=\"0c:c4:7a:82:95:95\";local_address=\"00:25:90:f0:f1:2f\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" $OPENAIR_DIR/cmake_targets/build_oai - --RRH -w USRP -t ETHERNET -c --disable-deadline + --eNB -w USRP -t ETHERNET -c -x $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw - -n1 -x -m1 -i eth1 + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf False - - /tmp $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 7Mbits/s False - sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue /tmp @@ -6572,10 +8112,10 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=5.0Mbits/sec False - USRPb210.RRH.ALU_EPC.Bandrich.5MHz.FDD.Band_7.UL.1TX.1RX + USRPb210.RRH.IF4P5.ALU_EPC.SonyExperiaM4.5MHz.FDD.UDP.Band_7.UL.1TX.1RX 10 @@ -6583,65 +8123,91 @@ c lte-softmodem - calisson - mozart + superserver stevens amerique + hutch 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 50 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -29 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=113;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_function \"NGFI_RCC_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -27 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"em2\";remote_address=\"00:25:90:f0:f1:2f\";local_address=\"0c:c4:7a:82:95:95\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w None -t ETHERNET -x -c --disable-deadline + --eNB -w None -t ETHERNET -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf + sleep 30; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf False + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_function \"NGFI_RRU_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -27 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"eth3\";remote_address=\"0c:c4:7a:82:95:95\";local_address=\"00:25:90:f0:f1:2f\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" $OPENAIR_DIR/cmake_targets/build_oai - --RRH -w USRP -t ETHERNET -c --disable-deadline + --eNB -w USRP -t ETHERNET -c -x $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw - -n1 -x -m1 -i eth1 + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf False + /tmp $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 14Mbits/s False - sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue /tmp @@ -6658,59 +8224,84 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec False - USRPb210.RRH.ALU_EPC.Bandrich.10MHz.FDD.Band_7.UL.1TX.1RX + USRPb210.RRH.IF4P5.ALU_EPC.SonyExperiaM4.10MHz.FDD.UDP.Band_7.UL.1TX.1RX 10 lte-softmodem - calisson - mozart + superserver stevens amerique + hutch 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 100 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -32 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=115;tx_scheduling_advance=11;rrh_gw_active=\"yes\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_function \"NGFI_RCC_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"em2\";remote_address=\"00:25:90:f0:f1:2f\";local_address=\"0c:c4:7a:82:95:95\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w None -t ETHERNET -x -c --disable-deadline + --eNB -w None -t ETHERNET -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf + sleep 30; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf False + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_function \"NGFI_RRU_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"eth3\";remote_address=\"0c:c4:7a:82:95:95\";local_address=\"00:25:90:f0:f1:2f\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" $OPENAIR_DIR/cmake_targets/build_oai - --RRH -w USRP -t ETHERNET -c --disable-deadline + --eNB -w USRP -t ETHERNET -c -x $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw - -n1 -x -m1 -i eth1 + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf False /tmp @@ -6719,14 +8310,14 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 28Mbits/s False - sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue /tmp @@ -6743,76 +8334,103 @@ c $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m - throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=5.0Mbits/sec False - USRPb210.RRH.ALU_EPC.Bandrich.20MHz.FDD.Band_7.UL.1TX.1RX + USRPb210.RRH.IF4P5.ALU_EPC.SonyExperiaM4.10MHz.FDD.UDP.Band_7.UL.1TX.1RX 10 lte-softmodem - calisson - mozart + superserver stevens amerique + hutch 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 25 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -26 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=70;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_function \"NGFI_RCC_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -24 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"em2\";remote_address=\"00:25:90:f0:f1:2f\";local_address=\"0c:c4:7a:82:95:95\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w None -t ETHERNET -x -c --disable-deadline + --eNB -w None -t ETHERNET -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf + sleep 30; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf False + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_function \"NGFI_RRU_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -24 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"eth3\";remote_address=\"0c:c4:7a:82:95:95\";local_address=\"00:25:90:f0:f1:2f\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" $OPENAIR_DIR/cmake_targets/build_oai - --RRH -w USRP -t ETHERNET -c --disable-deadline + --eNB -w USRP -t ETHERNET -c -x $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw - -n1 -x -m1 -i eth1 + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf False + /tmp $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m - False - sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec - + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp @@ -6826,144 +8444,85 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 16Mbits/s -i 1 -f m -u False - USRPb210.RRH.ALU_EPC.Bandrich.5MHz.FDD.Band_7.DL.1TX.1RX + USRPb210.RRH.IF4P5.ALU_EPC.SonyExperiaM4.5MHz.FDD.UDP.Band_7.DL.1TX.1RX 10 lte-softmodem - calisson - mozart + superserver stevens amerique + hutch 390 /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 50 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -29 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=113;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_function \"NGFI_RCC_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -27 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"em2\";remote_address=\"00:25:90:f0:f1:2f\";local_address=\"0c:c4:7a:82:95:95\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w None -t ETHERNET -x -c --disable-deadline + --eNB -w None -t ETHERNET -x -c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - sleep 5; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf + sleep 30; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf False + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_function \"NGFI_RRU_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -27 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"eth3\";remote_address=\"0c:c4:7a:82:95:95\";local_address=\"00:25:90:f0:f1:2f\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" $OPENAIR_DIR/cmake_targets/build_oai - --RRH -w USRP -t ETHERNET -c --disable-deadline + --eNB -w USRP -t ETHERNET -c -x $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw - -n1 -x -m1 -i eth1 - False - - /tmp - - - $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue - - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 - - throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec - - False - sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - - - /tmp - - - - - - - $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - - /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 - - /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 10Mbits/s - - - False - USRPb210.RRH.ALU_EPC.Bandrich.10MHz.FDD.Band_7.DL.1TX.1RX - 10 - - - - lte-softmodem - - calisson - mozart - stevens - amerique - 390 - /tmp - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tracking_area_code \"1\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_country_code \"208\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mobile_network_code \"92\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf N_RB_DL 100 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf downlink_frequency 2660000000L - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf uplink_frequency_offset -120000000 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf tx_gain 90 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rx_gain 125 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf pdsch_referenceSignalPower -32 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf frame_type \"FDD\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_rx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf nb_antennas_tx 1 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.111/24\" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf ENB_PORT_FOR_S1U 2152 - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rrh_gw_config "local_if_name=\"eth0\";remote_address=\"10:60:4b:75:80:83\";local_address=\"98:90:96:df:66:07\";local_port=50000;remote_port=50000;tr_preference=\"raw\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=115;tx_scheduling_advance=11;rrh_gw_active=\"yes\";" - $OPENAIR_DIR/cmake_targets/build_oai - --eNB -w None -t ETHERNET -x -c --disable-deadline - $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - - sleep 5; $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf - - - - - False - - $OPENAIR_DIR/cmake_targets/build_oai - --RRH -w USRP -t ETHERNET -c --disable-deadline - $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - - sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/rrh_gw/build/rrh_gw - -n1 -x -m1 -i eth1 + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf False /tmp @@ -6972,16 +8531,16 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash - $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --stop-ue ; sleep 10; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --start-ue + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 ppp0 -s -i 1 -u -f m -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m - throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec False - sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue - - + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp @@ -6995,14 +8554,161 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 60 lo -u -c 192.172.0.2 -b 15Mbits/s + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 32Mbits/s -i 1 -f m -u False - USRPb210.RRH.ALU_EPC.Bandrich.20MHz.FDD.Band_7.DL.1TX.1RX + USRPb210.RRH.IF4P5.ALU_EPC.SonyExperiaM4.5MHz.FDD.UDP.Band_7.DL.1TX.1RX 10 + + lte-softmodem + + superserver + stevens + amerique + hutch + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_function \"NGFI_RCC_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth6\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"em2\";remote_address=\"00:25:90:f0:f1:2f\";local_address=\"0c:c4:7a:82:95:95\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w None -t ETHERNET -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 30; sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.usrpb210.conf + + + + + False + + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_function \"NGFI_RRU_IF4p5\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_timing \"synch_to_ext_device\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf node_synch_ref 0 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf nb_antenna_ports 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf ue_TransmissionMode 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf rrh_gw_config "local_if_name=\"eth3\";remote_address=\"0c:c4:7a:82:95:95\";local_address=\"00:25:90:f0:f1:2f\";local_port=50000;remote_port=50000;tr_preference=\"raw_if4p5\";rf_preference=\"usrp_b200\";iq_txshift=4;tx_sample_advance=80;tx_scheduling_advance=9;rrh_gw_active=\"yes\";" + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -t ETHERNET -c -x + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sudo -E chrt -f 99 $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.band7.tm1.usrpb210.conf + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 60Mbits/s -i 1 -f m -u + + + False + USRPb210.RRH.IF4P5.ALU_EPC.SonyExperiaM4.5MHz.FDD.UDP.Band_7.DL.1TX.1RX + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lte-softmodem @@ -7034,7 +8740,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7049,7 +8755,7 @@ c sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 7Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 7Mbits/s @@ -7109,7 +8815,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7124,7 +8830,7 @@ c sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 14Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 14Mbits/s @@ -7173,6 +8879,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -7183,7 +8890,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -E + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7198,7 +8905,7 @@ c sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 10Mbits/s -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 28Mbits/s @@ -7257,7 +8964,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7331,7 +9038,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7367,7 +9074,7 @@ c /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 - $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s -i 1 -f m -u + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 31Mbits/s -i 1 -f m -u False @@ -7395,6 +9102,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -7405,7 +9113,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -E + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7479,7 +9187,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7494,7 +9202,7 @@ c sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 @@ -7554,7 +9262,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7569,7 +9277,7 @@ c sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 @@ -7618,6 +9326,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -7628,7 +9337,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7643,7 +9352,7 @@ c sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue - $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 -B 192.172.0.2 + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 @@ -7702,7 +9411,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7759,7 +9468,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"92\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 50 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" - targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2680000000L targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 @@ -7776,7 +9485,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7840,6 +9549,7 @@ c targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -30 targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" @@ -7850,7 +9560,7 @@ c $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem - -E -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf @@ -7895,5 +9605,1529 @@ c + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 7Mbits/s + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=5.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.5MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 14Mbits/s + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.10MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf -E + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -u -c 192.172.0.1 -b 14Mbits/s + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.20MHz.FDD.UDP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 16Mbits/s -i 1 -f m -u + + + False + USRPb210.ALU_EPC.SonyExperiaM4.5MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33Mbits/s -i 1 -f m -u + + + False + USRPb210.ALU_EPC.SonyExperiaM4.10MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf -E + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -u -f m + + throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 33M -i 1 -f m -u + + + False + USRPb210.ALU_EPC.SonyExperiaM4.20MHz.FDD.UDP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=5.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.5MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.10MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf -E + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -c 192.172.0.1 + + + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPb210.ALU_EPC.SonyExperiaM4.20MHz.FDD.TCP.Band_7.UL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=5.0Mbits/sec average=4.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPb210.ALU_EPC.SonyExperiaM4.5MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -f m + + throughput_test min=0.0Mbits/sec max=9.0Mbits/sec average=8.5Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPb210.ALU_EPC.SonyExperiaM4.10MHz.FDD.TCP.Band_7.DL.2TX.2RX.TM2 + 10 + + + + lte-softmodem + + hutch + stevens + amerique + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mobile_network_code \"92\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.26\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf pdsch_referenceSignalPower -30 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antenna_ports 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_rx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf nb_antennas_tx 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ue_TransmissionMode 2 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\ + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -x -c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + $OPENAIR_DIR/cmake_targets/autotests/tools/run_gdb $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm2.usrpb210.conf -E + + + + + False + + /tmp + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 50; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue ; $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --start-ue + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script_phone 1 YT9115PX1E -s -i 1 -f m + + throughput_test min=00.0Mbits/sec max=10.0Mbits/sec average=10.0Mbits/sec + + False + sudo -S -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue + + + /tmp + + + + + + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + /opt/ltebox/tools/stop_ltebox ; /opt/ltebox/tools/start_ltebox ; sleep 3000 + + /opt/hss_sim0609/starthss >> /dev/null ; sleep 3000 + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -i 1 -f m + + + False + USRPb210.ALU_EPC.SonyExperiaM4.20MHz.TCP.FDD.Band_7.DL.2TX.2RX.TM2 + 10 + + + + + lte-softmodem + + hutch + starsky + nano + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"93\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -26 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.62\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -c + sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf + + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai --eNB --UE -w USRP -c -x + develop1B + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo rmmod nasmesh ; sudo rmmod ue_ip + + sleep 50; cd $OPENAIR_DIR/cmake_targets/lte_build_oai/build ; sudo -E $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 90 --ue-rxgain 125 + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 oai0 -u -c 192.172.0.1 -b 7Mbits/s + + + + False + + + /tmp + ETC/hss.conf MYSQL_user \"root\" + ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" + ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"93\";MME_GID=\"4\";MME_CODE=\"1\";}" + ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"93\";TAC=\"1\";}" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" + ETC/mme.conf MME_PORT_FOR_S11_MME 2123 + ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/mme.conf OUTPUT \"CONSOLE\" + ETC/mme.conf HSS_HOSTNAME \"nano\" + ETC/mme_fd.conf Identity \"nano.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" + ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + +c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 10;$OPENAIRCN_DIR/TEST/autotests/tools/run_epc + + cp -vf $OPENAIRCN_DIR/ETC/*.conf $OPENAIRCN_TESTDIR/; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPb210.OAI_EPC_remote.OAI_UE.5MHz.FDD.Band_7.UL.1TX.1RX + 10 + + + + lte-softmodem + + hutch + starsky + nano + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"93\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.62\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -c + sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf + + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai --eNB --UE -w USRP -c -x + develop1B + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo rmmod nasmesh ; sudo rmmod ue_ip + + sleep 50; cd $OPENAIR_DIR/cmake_targets/lte_build_oai/build ; sudo -E $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -U -C2660000000 -r50 --ue-scan-carrier --ue-txgain 90 --ue-rxgain 125 + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 oai0 -u -c 192.172.0.1 -b 14Mbits/s + + + + False + + + /tmp + ETC/hss.conf MYSQL_user \"root\" + ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" + ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"93\";MME_GID=\"4\";MME_CODE=\"1\";}" + ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"93\";TAC=\"1\";}" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" + ETC/mme.conf MME_PORT_FOR_S11_MME 2123 + ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/mme.conf OUTPUT \"CONSOLE\" + ETC/mme.conf HSS_HOSTNAME \"nano\" + ETC/mme_fd.conf Identity \"nano.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" + ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + +c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 10;$OPENAIRCN_DIR/TEST/autotests/tools/run_epc + + cp -vf $OPENAIRCN_DIR/ETC/*.conf $OPENAIRCN_TESTDIR/; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPb210.OAI_EPC_remote.OAI_UE.10MHz.FDD.Band_7.UL.1TX.1RX + 10 + + + + lte-softmodem + + hutch + starsky + nano + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"93\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.62\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -c + sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf + + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai --eNB --UE -w USRP -c -x + develop1B + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo rmmod nasmesh ; sudo rmmod ue_ip + + sleep 50; cd $OPENAIR_DIR/cmake_targets/lte_build_oai/build ; sudo -E $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -U -C2660000000 -r100 --ue-scan-carrier --ue-txgain 90 --ue-rxgain 125 + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 oai0 -u -c 192.172.0.1 -b 28Mbits/s + + + + False + + + /tmp + ETC/hss.conf MYSQL_user \"root\" + ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" + ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"93\";MME_GID=\"4\";MME_CODE=\"1\";}" + ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"93\";TAC=\"1\";}" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" + ETC/mme.conf MME_PORT_FOR_S11_MME 2123 + ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/mme.conf OUTPUT \"CONSOLE\" + ETC/mme.conf HSS_HOSTNAME \"nano\" + ETC/mme_fd.conf Identity \"nano.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" + ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + +c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 10;$OPENAIRCN_DIR/TEST/autotests/tools/run_epc + + cp -vf $OPENAIRCN_DIR/ETC/*.conf $OPENAIRCN_TESTDIR/; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 5 lo -s -i 1 -u -f m + + throughput_test min=0.0Mbits/sec max=1.0Mbits/sec average=1.0Mbits/sec + + False + USRPb210.OAI_EPC_remote.OAI_UE.20MHz.FDD.Band_7.UL.1TX.1RX + 10 + + + + lte-softmodem + + hutch + starsky + nano + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"93\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 25 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -24 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.62\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -c + sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf + + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + + + + + False + + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai --eNB --UE -w USRP -c -x + develop1B + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo rmmod nasmesh ; sudo rmmod ue_ip + + sleep 50; cd $OPENAIR_DIR/cmake_targets/lte_build_oai/build ; sudo -E $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 90 --ue-rxgain 125 + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m -u + + throughput_test min=0.0Mbits/sec max=1Mbits/sec average=1Mbits/sec + + False + + + /tmp + ETC/hss.conf MYSQL_user \"root\" + ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" + ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"93\";MME_GID=\"4\";MME_CODE=\"1\";}" + ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"93\";TAC=\"1\";}" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" + ETC/mme.conf MME_PORT_FOR_S11_MME 2123 + ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/mme.conf OUTPUT \"CONSOLE\" + ETC/mme.conf HSS_HOSTNAME \"nano\" + ETC/mme_fd.conf Identity \"nano.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" + ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + +c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + sleep 10;$OPENAIRCN_DIR/TEST/autotests/tools/run_epc + + cp -vf $OPENAIRCN_DIR/ETC/*.conf $OPENAIRCN_TESTDIR/; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b 16M -i 1 -f m -u + + + + False + USRPb210.OAI_EPC_remote.OAI_UE.5MHz.FDD.Band_7.DL.1TX.1RX + 10 + + + + lte-softmodem + + hutch + starsky + nano + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"93\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 50 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -29 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.62\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -c + sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf + + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai --eNB --UE -w USRP -c -x + develop1B + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo rmmod nasmesh ; sudo rmmod ue_ip + + sleep 50; cd $OPENAIR_DIR/cmake_targets/lte_build_oai/build ; sudo -E $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -U -C2660000000 -r50 --ue-scan-carrier --ue-txgain 90 --ue-rxgain 125 + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m -u + + throughput_test min=0.0Mbits/sec max=1Mbits/sec average=1Mbits/sec + + False + + + /tmp + + ETC/hss.conf MYSQL_user \"root\" + ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" + ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"93\";MME_GID=\"4\";MME_CODE=\"1\";}" + ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"93\";TAC=\"1\";}" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" + ETC/mme.conf MME_PORT_FOR_S11_MME 2123 + ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/mme.conf OUTPUT \"CONSOLE\" + ETC/mme.conf HSS_HOSTNAME \"nano\" + ETC/mme_fd.conf Identity \"nano.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" + ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + +c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + + sleep 10;$OPENAIRCN_DIR/TEST/autotests/tools/run_epc + + cp -vf $OPENAIRCN_DIR/ETC/*.conf $OPENAIRCN_TESTDIR/; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b33M -i 1 -f m -u + + + + False + USRPb210.OAI_EPC_remote.OAI_UE.10MHz.FDD.Band_7.DL.1TX.1RX + 10 + + + + lte-softmodem + + hutch + starsky + nano + 390 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tracking_area_code \"1\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_country_code \"208\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mobile_network_code \"93\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf N_RB_DL 100 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf pdsch_referenceSignalPower -32 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf mme_ip_address "ipv4=\"192.168.12.62\";ipv6=\"192:168:30::17\";active=\"yes\";preference=\"ipv4\";" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf downlink_frequency 2660000000L + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf uplink_frequency_offset -120000000 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf tx_gain 90 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf rx_gain 125 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf frame_type \"FDD\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_rx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf nb_antennas_tx 1 + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1_MME \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_INTERFACE_NAME_FOR_S1U \"eth0\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_IPV4_ADDRESS_FOR_S1U \"192.168.12.19/24\" + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf ENB_PORT_FOR_S1U 2152 + $OPENAIR_DIR/cmake_targets/build_oai + --eNB -w USRP -c + sleep 15; $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash; ifconfig ; cp $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf $OPENAIR_TESTDIR/enb.conf + + $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai --eNB --UE -w USRP -c -x + develop1B + + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash ; sudo rmmod nasmesh ; sudo rmmod ue_ip + + sleep 50; cd $OPENAIR_DIR/cmake_targets/lte_build_oai/build ; sudo -E $OPENAIR_DIR/cmake_targets/lte_build_oai/build/lte-softmodem -U -C2660000000 -r100 --ue-scan-carrier --ue-txgain 90 --ue-rxgain 125 + + $OPENAIR_DIR/cmake_targets/autotests/tools/iperf_script 1 lo -s -i 1 -f m -u + + throughput_test min=0.0Mbits/sec max=1Mbits/sec average=1Mbits/sec + + False + + + /tmp + ETC/hss.conf MYSQL_user \"root\" + ETC/hss.conf MYSQL_pass \"linux\" + ETC/hss.conf OPERATOR_key \"1006020f0a478bf6b699f15c062e42b3\" + ETC/mme.conf GUMMEI_LIST "{MCC=\"208\";MNC=\"93\";MME_GID=\"4\";MME_CODE=\"1\";}" + ETC/mme.conf TAI_LIST "{MCC=\"208\";MNC=\"93\";TAC=\"1\";}" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S1_MME \"eth1\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S1_MME \"192.168.12.62/24\" + ETC/mme.conf MME_INTERFACE_NAME_FOR_S11_MME \"lo\" + ETC/mme.conf MME_IPV4_ADDRESS_FOR_S11_MME \"127.0.11.1/8\" + ETC/mme.conf MME_PORT_FOR_S11_MME 2123 + ETC/mme.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/mme.conf OUTPUT \"CONSOLE\" + ETC/mme.conf HSS_HOSTNAME \"nano\" + ETC/mme_fd.conf Identity \"nano.openair4G.eur\" + ETC/mme_fd.conf ConnectPeer nano.openair4G.eur + ETC/hss_fd.conf Identity \"nano.openair4G.eur\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S11 \"lo\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S11 \"127.0.11.2/8\" + ETC/spgw.conf SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP \"eth1\" + ETC/spgw.conf SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP \"192.168.12.62/24\" + ETC/spgw.conf SGW_IPV4_PORT_FOR_S1U_S12_S4_UP 2152 + ETC/spgw.conf PGW_INTERFACE_NAME_FOR_SGI \"eth1\" + ETC/spgw.conf PGW_MASQUERADE_SGI \"yes\" + ETC/spgw.conf DEFAULT_DNS_IPV4_ADDRESS \"192.168.12.100\" + ETC/spgw.conf IPV4_LIST \"192.172.0.0/24\" + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/acl.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/mme.conf /usr/local/etc/oai/ ; sudo cp -vf $OPENAIRCN_DIR/ETC/mme_fd.conf /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/spgw.conf /usr/local/etc/oai ; $OPENAIRCN_DIR/SCRIPTS/./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur ; $OPENAIRCN_DIR/SCRIPTS/build_mme -c ; $OPENAIRCN_DIR/SCRIPTS/build_spgw -c + + sudo mkdir -p /usr/local/etc/oai/freeDiameter; sudo cp -vf $OPENAIRCN_DIR/ETC/hss.conf /usr/local/etc/oai ; sudo cp -vf $OPENAIRCN_DIR/ETC/hss_fd.conf /usr/local/etc/oai/freeDiameter ; $OPENAIRCN_DIR/SCRIPTS/check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ nano.openair4G.eur; $OPENAIRCN_DIR/SCRIPTS/build_hss -c + +c + $OPENAIR_DIR/cmake_targets/autotests/tools/free_mem.bash + + + sleep 10;$OPENAIRCN_DIR/TEST/autotests/tools/run_epc + + cp -vf $OPENAIRCN_DIR/ETC/*.conf $OPENAIRCN_TESTDIR/; $OPENAIRCN_DIR/SCRIPTS/run_hss --export-db $OPENAIRCN_TESTDIR/hss_export.db + + $OPENAIRCN_DIR/TEST/autotests/tools/iperf_script 10 192.172.0.2 -c 192.172.0.2 -b55M -i 1 -f m -u + + + + False + USRPb210.OAI_EPC_remote.OAI_UE.20MHz.FDD.Band_7.DL.1TX.1RX + 10 + + + diff --git a/cmake_targets/autotests/testsuite_ue_noS1.xml b/cmake_targets/autotests/testsuite_ue_noS1.xml new file mode 100644 index 0000000000..f88244e7ef --- /dev/null +++ b/cmake_targets/autotests/testsuite_ue_noS1.xml @@ -0,0 +1,3524 @@ + + +imb182-desktop yanbo-M4HM87P-00 + /mnt/sradio/TEST_RESULTS/ + https://gitlab.eurecom.fr/oai1B/openairinterface5g.git + + + https://gitlab.eurecom.fr/oai/openair-cn.git --> + develop1B + develop1B_integration_w49 --> + + + + + + + + + + + + + + develop + oaisim oaisim_nos1 lte-softmodem lte-softmodem-nos1 mme_gw run_epc auth_request run_hss oai_hss mme spgw hss hss_sim configure_cots* wvdial iperf iperf_script iperf_script_phone ping tshark rrh_gw iperf3 iperf3_script iperf3_script_phone pppd + sudo -S -E /opt/ltebox/tools/stop_ltebox +$OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg + 36000 + + + yanbo-M4HM87P-00 + + + + + + + + + + + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 0 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS00 + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 0 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS00 + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 1 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS01 + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 1 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS01 + 36 + + + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 9 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS09 + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 9 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS09 + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 16 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS16 + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 16 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS16 + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 10 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS10 + + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 10 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS10 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 17 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS17 + + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 17 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS17 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 18 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS18 + + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 18 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS18 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 19 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS19 + + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 19 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS19 + 36 + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 20 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS20 + + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 20 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS20 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 21 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS21 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 21 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS21 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 22 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS22 + + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 22 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS22 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 23 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS23 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 23 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS23 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 24 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS24 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 24 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS24 + 36 + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 25 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS25 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 25 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS25 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 26 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS26 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 26 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS26 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS27 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS27 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 28 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS28 + 36 + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 3600 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_STAB.BAND7.5MHZ.MCS27 + 16 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_STAB.BAND7.5MHZ.MCS27 + 36 + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r50 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.10MHZ.MCS27 + 36 + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r50 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.10MHZ.MCS27 + 36 + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 28 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r50 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.10MHZ.MCS28 + 36 + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 19 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r50 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.10MHZ.MCS19 + 36 + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 28 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 30M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r50 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.10MHZ.MCS28 + 36 + + + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 0 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 512K + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS00 + 36 + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 9 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS09 + 36 + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 10 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS10 + 36 + + + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 16 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS16 + 36 + + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 17 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS17 + 36 + + + + + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 19 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 10M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS19 + 36 + + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 3600 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 27 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 -u + + 2800 + + False + UE_USRP.NOS1.DATA_IPERF_STAB.BAND7.5MHZ.MCS27 + 16 + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + ued-PRM-130 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 27 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS27 + 36 + + + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 0 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 512K + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS00 + 36 + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 9 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS09 + 36 + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 10 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS10 + 36 + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 16 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS16 + 36 + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 17 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS17 + 36 + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 19 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS19 + 36 + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 27 + sleep 30;iperf -c 10.0.1.9 -i 1 -u -b 15M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS27 + 36 + + + + + + + + + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 28 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + + + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS28 + 36 + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 18000 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 28 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S --phy-test + + + + + + False + + + + UE_USRP.NOS1.PHYTEST_STAB.BAND7.5MHZ.MCS28 + 16 + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 28 + sleep 30;iperf -c 10.0.1.9 -i 1 -u -b 13700K + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 -u + + 200 + + False + + + + + UE_USRP.NOS1.DATA_IPERF_DL.BAND7.5MHZ.MCS28 + 36 + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 3600 + UE_USRP.NOS1.DATA_IPERF_STAB_DL.BAND7.5MHZ.MCS28 + 16 + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 28 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 -u + + 2800 + + False + + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf -W -m 28 + sleep 30;iperf -c 10.0.1.9 -i 1 + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 + + 200 + + False + + + + + UE_USRP.NOS1.DATA_IPERF_TCP_DL.BAND7.5MHZ.MCS28 + 36 + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 28 + sleep 80;iperf -c 10.0.1.9 -i 1 + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r50 --ue-scan-carrier --ue-txgain 85 -A 20 --ue-rxgain 125 -S + + iperf -s -i 1 + + 200 + + False + UE_USRP.NOS1.DATA_IPERF_TCP_DL.BAND7.10MHZ.MCS28 + 36 + + + + + + + + + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 28 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100 -S --phy-test + + + + + + False + + + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.20MHZ.MCS28 + 36 + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 0 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100 -S --phy-test + + + + + + False + + + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.20MHZ.MCS0 + 36 + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 18 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100 -S --phy-test + + + + + + False + + + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.20MHZ.MCS18 + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 700 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 0 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100 + + iperf -s -i 1 -u + + 600 + + False + + + + UE_USRP.NOS1.DATA_IPERF_DL.BAND7.20MHZ.MCS0 + 36 + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 700 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 18 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 24M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100 + + iperf -s -i 1 -u + + 600 + + False + + + + UE_USRP.NOS1.DATA_IPERF_DL.BAND7.20MHZ.MCS18 + 36 + + + + + + lte-softmodem-noS1 + + imb182-desktop + yanbo-M4HM87P-00 + 700 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 28 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 55M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 85 --ue-rxgain 100 + + iperf -s -i 1 -u + + 600 + + False + + + + UE_USRP.NOS1.DATA_IPERF_DL.BAND7.20MHZ.MCS28 + 36 + + + + + + + diff --git a/cmake_targets/autotests/testsuite_ue_noS1_TCL.xml b/cmake_targets/autotests/testsuite_ue_noS1_TCL.xml new file mode 100644 index 0000000000..43aef8c322 --- /dev/null +++ b/cmake_targets/autotests/testsuite_ue_noS1_TCL.xml @@ -0,0 +1,3812 @@ + + +TCT-Labo1 TCT-Labo3 + /mnt/sradio/TEST_RESULTS/ + https://gitlab.eurecom.fr/oai/openairinterface5g.git + + + https://gitlab.eurecom.fr/oai/openair-cn.git --> + + develop + develop --> + + + + + + + + develop + oaisim oaisim_nos1 lte-softmodem lte-softmodem-nos1 mme_gw run_epc auth_request run_hss oai_hss mme spgw hss hss_sim configure_cots* wvdial iperf iperf_script iperf_script_phone ping tshark rrh_gw iperf3 iperf3_script iperf3_script_phone pppd + sudo -S -E /opt/ltebox/tools/stop_ltebox +$OPENAIR_DIR/cmake_targets/build_oai -w EXMIMO -c; sudo -S -E $OPENAIR_DIR/cmake_targets/tools/stop_exmimo2; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py --reset-ue; sudo -E $OPENAIR_DIR/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py --stop-ue; uname -a; sudo -E dmesg + 36000 + + + TCT-Labo3 + + + + + + + + + + + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 0 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS00 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.25PRB.usrpb210.conf -W -m 0 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r25 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S --phy-test + + + + + + False + + UE_USRP.NOS1.PHYTEST_PERF.BAND40.5MHZ.MCS00 + 11 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 0 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS00 + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 1 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS01 + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 1 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS01 + 36 + + + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 9 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS09 + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 9 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS09 + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 16 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS16 + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 16 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS16 + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 10 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS10 + + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 10 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS10 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 17 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS17 + + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 17 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS17 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 18 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS18 + + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 18 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS18 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 19 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS19 + + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 19 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS19 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 20 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS20 + + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 20 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS20 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 21 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS21 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 21 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS21 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 22 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS22 + + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 22 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS22 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 23 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS23 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 23 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS23 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 24 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS24 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 24 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS24 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 25 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS25 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 25 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS25 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 26 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS26 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 26 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS26 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS27 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS27 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 28 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS28 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 3600 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_STAB.BAND7.5MHZ.MCS27 + 16 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_STAB.BAND7.5MHZ.MCS27 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + /targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.10MHZ.MCS27 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + /targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 27 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.10MHZ.MCS27 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + /targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 28 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + UE_USRP.NOS1.PHYTEST_PERF.BAND7.10MHZ.MCS28 + 36 + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + /targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 19 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 0 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 --phy-test + + + + + + False + UE_UEDV1.NOS1.PHYTEST_PERF.BAND7.10MHZ.MCS19 + 36 + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + /targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 28 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 30M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.10MHZ.MCS28 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.50PRB.usrpb210.conf -W -m 28 + sleep 30;iperf -c 10.0.1.9 -i 1 -u -b 18M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r50 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND40.10MHZ.MCS28 + 36 + + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 0 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 512K + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS00 + 36 + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 9 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS09 + 36 + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 10 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS10 + 36 + + + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 16 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS16 + 36 + + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 17 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS17 + 36 + + + + + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 19 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 10M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS19 + 36 + + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 3600 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 27 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 2800 + + False + UE_USRP.NOS1.DATA_IPERF_STAB.BAND7.5MHZ.MCS27 + 16 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + ued-PRM-130 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 27 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w EXMIMO --noS1 --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C 2660000000 -r25 --ue-scan-carrier --ue-txgain 15 --ue-rxgain 5 -S -A 6 -F myriadRF_FMX --ue-max-power -25 + + iperf -s -i 1 -u + + 200 + + False + UE_UEDV1.NOS1.DATA_IPERF.BAND7.5MHZ.MCS27 + 36 + + + + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 0 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 512K + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS00 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.25PRB.usrpb210.conf -W -m 0 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 300K + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r25 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND40.5MHZ.MCS00 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 9 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS09 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 10 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS10 + 36 + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 16 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS16 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.25PRB.usrpb210.conf -W -m 0 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 1200K + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r25 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND40.5MHZ.MCS16 + 36 + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 17 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS17 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 19 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS19 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 27 + sleep 30;iperf -c 10.0.1.9 -i 1 -u -b 15M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND7.5MHZ.MCS27 + 36 + + + + + + + + + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 28 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + + + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.5MHZ.MCS28 + 36 + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 18000 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 28 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S --phy-test + + + + + + False + + + + UE_USRP.NOS1.PHYTEST_STAB.BAND7.5MHZ.MCS28 + 16 + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 28 + sleep 30;iperf -c 10.0.1.9 -i 1 -u -b 13700K + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + + + + + UE_USRP.NOS1.DATA_IPERF_DL.BAND7.5MHZ.MCS28 + 36 + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.25PRB.usrpb210.conf -W -m 28 + sleep 30;iperf -c 10.0.1.9 -i 1 -u -b 8220K + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r25 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND40.5MHZ.MCS28 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 3600 + UE_USRP.NOS1.DATA_IPERF_STAB_DL.BAND7.5MHZ.MCS28 + 16 + + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 28 + sleep 80;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 2800 + + False + + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.conf -W -m 28 + sleep 30;iperf -c 10.0.1.9 -i 1 + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 5; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2660000000 -r25 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 + + 200 + + False + + + + + UE_USRP.NOS1.DATA_IPERF_TCP_DL.BAND7.5MHZ.MCS28 + 36 + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + /targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf downlink_frequency 2660000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf -W -m 28 + sleep 80;iperf -c 10.0.1.9 -i 1 + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2685000000 -r50 --ue-scan-carrier --ue-txgain 80 -A 24 --ue-rxgain 100 -S + + iperf -s -i 1 + + 200 + + False + UE_USRP.NOS1.DATA_IPERF_TCP_DL.BAND7.10MHZ.MCS28 + 36 + + + + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 28 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S --phy-test + + + + + + False + + + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.20MHZ.MCS28 + 36 + + + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 0 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S --phy-test + + + + + + False + + + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.20MHZ.MCS0 + 36 + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 18 --single-thread-disable --phy-test + + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S --phy-test + + + + + + False + + + + UE_USRP.NOS1.PHYTEST_PERF.BAND7.20MHZ.MCS18 + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 700 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 0 + sleep 60;iperf -c 10.0.1.9 -i 1 -u -b 2M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 + + iperf -s -i 1 -u + + 200 + + False + + + + UE_USRP.NOS1.DATA_IPERF_DL.BAND7.20MHZ.MCS0 + 36 + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 700 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 18 + sleep 60;iperf -c 10.0.1.9 -i 1 -u -b 24M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 + + iperf -s -i 1 -u + + 200 + + False + + + + UE_USRP.NOS1.DATA_IPERF_DL.BAND7.20MHZ.MCS18 + 36 + + + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 700 + /tmp + targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf downlink_frequency 2680000000L + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf -m 28 + sleep 60;iperf -c 10.0.1.9 -i 1 -u -b 55M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -C2680000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 + + iperf -s -i 1 -u + + 200 + + False + + + + UE_USRP.NOS1.DATA_IPERF_DL.BAND7.20MHZ.MCS28 + 36 + + + + lte-softmodem-noS1 + + TCT-Labo1 + TCT-Labo3 + 300 + /tmp + $OPENAIR_DIR/cmake_targets/build_oai + -c -w USRP --eNB --noS1 + source $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 eNB + + $OPENAIR_DIR/cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 + -O $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band40.tm1.TDD3SS5.100PRB.usrpb210.conf -W -m 28 + sleep 30;iperf -c 10.0.1.9 -i 1 -u -b 33M + + + + False + + /tmp + + $OPENAIR_DIR/cmake_targets/build_oai + -c --UE -w USRP --noS1 --eNB --ue-autotest-trace + source ./targets/bin/init_nas_nos1 UE + + sleep 20; ./cmake_targets/autotests/tools/run_gdb ./cmake_targets/lte_noS1_build_oai/build/lte-softmodem-nos1 -U -T -C2350000000 -r100 --ue-scan-carrier --ue-txgain 80 --ue-rxgain 100 -S + + iperf -s -i 1 -u + + 200 + + False + UE_USRP.NOS1.DATA_IPERF.BAND40.20MHZ.MCS28 + 36 + + + + + + + + diff --git a/cmake_targets/autotests/tools/autotest_analyser.py b/cmake_targets/autotests/tools/autotest_analyser.py new file mode 100755 index 0000000000..61759a1545 --- /dev/null +++ b/cmake_targets/autotests/tools/autotest_analyser.py @@ -0,0 +1,174 @@ +#! /usr/bin/python +#****************************************************************************** +# +# \file autotest_analyser.py +# +# \par Informations +# - \b Project : UED Autotest Framework +# - \b Software : +# +# \date 16 september 2016 +# +# \version 0.1 +# +# \brief helper to test lib_autotest_analyser.py +# +# \author Benoit ROBERT (benoit.robert@syrtem.com) +# +# \par Statement of Ownership +# COPYRIGHT (c) 2016 BY SYRTEM S.A.R.L +# This software is furnished under license and may be used and copied +# only in accordance with the terms of such license and with the inclusion +# of the above COPYRIGHT notice. This SOFTWARE or any other copies thereof +# may not be provided or otherwise made available to any other person. +# No title to and ownership of the SOFTWARE is hereby transferred. +# +# The information in this SOFTWARE is subject to change without notice +# and should not be constructed as a commitment by SYRTEM. +# SYRTEM assumes no responsibility for the use or reliability of its +# SOFTWARE on equipment or platform not explicitly validated by SYRTEM. +# +# ******************************************************************************* + +import os +import getopt +import sys +from subprocess import call + +import encoder + +sys.path.append(os.path.expandvars('$OPENAIR_DIR/cmake_targets/autotests/tools/')) + + +#test_cases = ('030001', '030901', '031001', '031601', '031701', '031801', '031901', '032001', '032101', '032201', '032301', '032501', '032601', '032801') +test_cases = ('032800' , '032730' ) + +nb_run = 2 + +def error_opt(msg): + print("Option error: " + msg) + + +def main(args): + try: + analyser = __import__("lib_autotest_analyser") + except ImportError as err: + print('Import error: ' + str(err)) + exit(0) + + + log_path = 'log_save_2016-08-14/log/' + + + + # metric = {} + # metric['id'] = 'UE_DLSCH_BITRATE' + # metric['description'] = 'UE downlink physical throughput' + # metric['regex'] = '(UE_DLSCH_BITRATE) =\s+(\d+\.\d+) kbps.+frame = (\d+)\)' + # metric['unit_of_meas'] = 'kbps' + # metric['min_limit'] = 14668.8 + + +#AUTOTEST Metric : RRC Measurments RSRP[0]=-97.60 dBm/RE, RSSI=-72.83 dBm, RSRQ[0] 9.03 dB, N0 -125 dBm/RE, NF 7.2 dB (frame = 4490) + + metric = {} + metric['id'] = 'UE_DL_RRC_MEAS' + metric['description'] = 'UE downlink RRC Measurments' + metric['nb_metric'] = 5 +# metric['regex'] = 'AUTOTEST Metric : RRC Measurments (RSRP\[0\])=(-?\d+\.?\d*)\s+(.+),\s+(RSRQ\[0\])=(-?\d+\.?\d*)\s+(.+),,\s+(N0)=(-?\d+\.?\d*)\s+(.+),,\s+(NF)=(-?\d+\.?\d*)\s+(.+)\s+\(frame = (\d+)\) ' + metric['regex'] = 'AUTOTEST Metric : RRC Measurments (RSRP\[0\])=(-?\d+\.?\d*)\s+(.+)\,\s+(RSSI)=(-?\d+\.?\d*)\s+(.+)\,\s+(RSRQ\[0\])=(-?\d+\.?\d*)\s+(.+)\,\s+(N0)=(-?\d+\.?\d*)\s+(.+)\,\s+(NF)=(-?\d+\.?\d*)\s+(.+)\s+\(frame = (\d+)\)' + metric['unit_of_meas'] = 'kbps' + metric['min_limit'] = 14668.8 + + + +#report_path = log_path+'/report/' + +#os.system(' mkdir -p ' + report_path) + +#analyser.create_report_html(report_path) + +#return(0) + + test_results = [] + + for test_case in test_cases: + + for i in range(0, nb_run): + fname = '..//log//'+test_case+'/run_'+str(i)+'/UE_exec_'+str(i)+'_.log' + args = {'metric' : metric, + 'file' : fname } + + # cell_synch_status = analyser.check_cell_synchro(fname) + # if cell_synch_status == 'CELL_SYNCH': + # print '!!!!!!!!!!!!!! Cell synchronized !!!!!!!!!!!' + # metric_checks_flag = 0 + # else : + # print '!!!!!!!!!!!!!! Cell NOT NOT synchronized !!!!!!!!!!!' + +# metrics_extracted = analyser.do_extract_metrics_new(args) + + + # de-xmlfy test report + xml_file = '..//log//'+test_case+'/test.'+test_case+'_ng.xml' + print xml_file + + # test_result = + + + # test_results.append(test_result) + + # xmlFile = logdir_local_testcase + '/test.' + testcasename + '.xml' + # xml="\n \n" + # write_file(xmlFile, xml, mode="w") + + # xmlFile_ng = logdir_local_testcase + '/test.' + testcasename + '_ng.xml' + # xml_ng = xmlify(test_result, wrap=testcasename, indent=" ") + # write_file(xmlFile_ng, xml_ng, mode="w") + + + + +# print "min = "+ str( metric_extracted['metric_min'] ) +# print "min_index = "+ str( metric_extracted['metric_min_index'] ) +# print "max = "+ str( metric_extracted['metric_max'] ) +# print "max_index = "+ str( metric_extracted['metric_max_index'] ) +# print "mean = "+ str( metric_extracted['metric_mean'] ) +# print "median = "+ str( metric_extracted['metric_median'] ) + +# verdict = analyser.do_check_verdict(metric, metric_extracted) +# print verdict + +# fname= 'report/2016-9-8_toto/'+test_case+'/UE_metric_UE_DLSCH_BITRATE_'+str(i)+'_.png' +# fname= 'report/UE_metric_UE_DLSCH_BITRATE_'+test_case+'_'+str(i)+'.png' + +# print fname +# analyser.do_img_metrics(metric, metric_extracted, fname) + + # fname = 'log//'+test_case+'/run_'+str(i)+'/UE_traffic_'+str(i)+'_.log' + + # args = {'file' : fname } + + # traffic_metrics = analyser.do_extract_traffic_metrics(args) + + # fname= 'report/iperf_'+test_case+'_'+str(i)+'.png' + + # print fname + # analyser.do_img_traffic(traffic_metrics, fname) + + + for test_result in test_results: + cmd = 'mkdir -p ' + report_dir + '/'+ test_result['testcase_name'] + result = os.system(cmd) + + report_file = report_dir + '/'+ test_result['testcase_name'] + '/'+ test_result['testcase_name']+ '_report.html' + + analyser.create_test_report_detailed_html(test_result, report_file ) + + print test_result + + + +if __name__ == "__main__": + main(sys.argv) + diff --git a/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py b/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py index 8f1161390f..ee4f3f93bc 100755 --- a/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py +++ b/cmake_targets/autotests/tools/configure_cots_bandrich_ue.py @@ -1,33 +1,25 @@ #!/usr/bin/python -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta import time diff --git a/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py b/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py index 929cc1c0a5..42e4b2ea9a 100755 --- a/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py +++ b/cmake_targets/autotests/tools/configure_cots_huaweiE398_ue.py @@ -1,33 +1,25 @@ #!/usr/bin/python -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta import time diff --git a/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py b/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py index c136067a61..8c2c1dd7f2 100755 --- a/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py +++ b/cmake_targets/autotests/tools/configure_cots_sony_experia_m4_ue.py @@ -1,4 +1,26 @@ #!/usr/bin/python +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# \author Navid Nikaein, Rohit Gupta import time import serial @@ -73,7 +95,7 @@ def start_ue () : time.sleep ( 2) #Now we check if ppp0 interface is up and running try: - cmd = 'sudo adb -s ' + device_id + ' shell netcfg |grep 192.' + cmd = 'sudo adb -s ' + device_id + ' shell netcfg |grep UP' status, out = commands.getstatusoutput(cmd) if (out == '') : print "Waiting for UE to connect and get IP Address..." diff --git a/cmake_targets/autotests/tools/configure_usrpb210.py b/cmake_targets/autotests/tools/configure_usrpb210.py index 12b091e4d8..588bde9d33 100755 --- a/cmake_targets/autotests/tools/configure_usrpb210.py +++ b/cmake_targets/autotests/tools/configure_usrpb210.py @@ -1,33 +1,25 @@ #!/usr/bin/python -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta import time diff --git a/cmake_targets/autotests/tools/find_usb_path.bash b/cmake_targets/autotests/tools/find_usb_path.bash index d2a80cd6c2..91156012b7 100755 --- a/cmake_targets/autotests/tools/find_usb_path.bash +++ b/cmake_targets/autotests/tools/find_usb_path.bash @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta diff --git a/cmake_targets/autotests/tools/free_mem.bash b/cmake_targets/autotests/tools/free_mem.bash index 873d6121e7..a5b2b00cb6 100755 --- a/cmake_targets/autotests/tools/free_mem.bash +++ b/cmake_targets/autotests/tools/free_mem.bash @@ -1,36 +1,48 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta # To free unused memory else test setup runs out of memory -sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches ' + +mem_threshold=0.2 #If free memory is less than this threshold, then VM drop cache is called +mem_tot=`vmstat -s -S k |grep "total memory" | awk '{print $1}'` +mem_free=`vmstat -s -S k |grep "free memory" | awk '{print $1}'` + +mem_frac=`bc <<< "scale=4;$mem_free/$mem_tot"` +echo $mem_frac +#mem_frac=`bc <<< "scale=4;`echo $mem_free`/`echo $mem_tot`"` +echo "Total Memory = $mem_tot k " +echo "Free Memory = $mem_free k" +echo "Fraction free memory = $mem_frac " + +res=`bc <<< "$mem_frac < 0.2" ` + +echo "Comparison Result = $res" + +if [ "$res" == "1" ] +then + echo "Free memory less than threshold = $mem_threshold" + sudo -E bash -c 'echo 3 > /proc/sys/vm/drop_caches ' +fi diff --git a/cmake_targets/autotests/tools/git-retry.sh b/cmake_targets/autotests/tools/git-retry.sh index b897ba379d..f0366b2ae5 100755 --- a/cmake_targets/autotests/tools/git-retry.sh +++ b/cmake_targets/autotests/tools/git-retry.sh @@ -1,4 +1,26 @@ #!/bin/bash +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# \author Navid Nikaein, Rohit Gupta #Simple script to retry git clone in case of failure diff --git a/cmake_targets/autotests/tools/iperf3_script b/cmake_targets/autotests/tools/iperf3_script index e82816f6e1..93aa742bd3 100755 --- a/cmake_targets/autotests/tools/iperf3_script +++ b/cmake_targets/autotests/tools/iperf3_script @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta #arg1 timeout to wait before running the script diff --git a/cmake_targets/autotests/tools/iperf3_script_phone b/cmake_targets/autotests/tools/iperf3_script_phone index c191f72ec3..1d9e9322a1 100755 --- a/cmake_targets/autotests/tools/iperf3_script_phone +++ b/cmake_targets/autotests/tools/iperf3_script_phone @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta #arg1 timeout to wait before running the script diff --git a/cmake_targets/autotests/tools/iperf_script b/cmake_targets/autotests/tools/iperf_script index 731438d65d..d74462cbcc 100755 --- a/cmake_targets/autotests/tools/iperf_script +++ b/cmake_targets/autotests/tools/iperf_script @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta #arg1 timeout to wait before running the script diff --git a/cmake_targets/autotests/tools/iperf_script_phone b/cmake_targets/autotests/tools/iperf_script_phone index f9ec7973f4..29c670f826 100755 --- a/cmake_targets/autotests/tools/iperf_script_phone +++ b/cmake_targets/autotests/tools/iperf_script_phone @@ -1,33 +1,25 @@ #!/bin/bash -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta #arg1 timeout to wait before running the script diff --git a/cmake_targets/autotests/tools/lib_autotest.py b/cmake_targets/autotests/tools/lib_autotest.py index 9ac2305250..54be808e1d 100644 --- a/cmake_targets/autotests/tools/lib_autotest.py +++ b/cmake_targets/autotests/tools/lib_autotest.py @@ -1,33 +1,25 @@ #!/usr/bin/python -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta import os diff --git a/cmake_targets/autotests/tools/lib_autotest_analyser.py b/cmake_targets/autotests/tools/lib_autotest_analyser.py new file mode 100644 index 0000000000..333bbd656e --- /dev/null +++ b/cmake_targets/autotests/tools/lib_autotest_analyser.py @@ -0,0 +1,544 @@ +#****************************************************************************** +# +# \file lib_autotest_analyser.py +# +# \par Informations +# - \b Project : UED Autotest Framework +# - \b Software : +# +# \date 16 september 2016 +# +# \version 0.1 +# +# \brief library to extract metrics from autotest logs and assign a verdict +# +# \author Benoit ROBERT (benoit.robert@syrtem.com) +# +# \par Statement of Ownership +# COPYRIGHT (c) 2016 BY SYRTEM S.A.R.L +# This software is furnished under license and may be used and copied +# only in accordance with the terms of such license and with the inclusion +# of the above COPYRIGHT notice. This SOFTWARE or any other copies thereof +# may not be provided or otherwise made available to any other person. +# No title to and ownership of the SOFTWARE is hereby transferred. +# +# The information in this SOFTWARE is subject to change without notice +# and should not be constructed as a commitment by SYRTEM. +# SYRTEM assumes no responsibility for the use or reliability of its +# SOFTWARE on equipment or platform not explicitly validated by SYRTEM. +# +# ******************************************************************************* + + +import re +from pylab import * +from matplotlib.font_manager import FontProperties + +import os +from jinja2 import Environment, FileSystemLoader + + +PATH = os.path.dirname(os.path.abspath(__file__)) +TEMPLATE_ENVIRONMENT = Environment( + autoescape=False, + loader=FileSystemLoader(os.path.join(PATH, '../templates')), + trim_blocks=False) + + +def render_template(template_filename, context): + return TEMPLATE_ENVIRONMENT.get_template(template_filename).render(context) + + + +def init(args = None): + return + + +# +# +# +def do_extract_metrics(args): + +# print "" +# print "do_extract_metrics ... " + + fname = args['file'] + metric = args['metric'] +# print(fname) +# print 'metric id = ' + metric['id'] +# print 'metric regex = ' + metric['regex'] + + count = 0 + mmin = 0 + mmin_index = 0 + mmax = 0 + mmax_index = 0 + mean = 0 + median = 0 + + + output = np.fromregex(fname,metric['regex'], [('id', 'S20'), ('metric', np.float), ('frame', np.int)] ) +# print 'T0T0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +# print output + count = output['metric'].size +# print count + if count > 0: + mmin = np.amin(output['metric']); + mmin_index = np.argmin(output['metric']); + mmax = np.amax(output['metric']); + mmax_index = np.argmax(output['metric']); + mean = np.mean(output['metric']); + median = np.median(output['metric']); + +# print ( ( (metric['min_limit'] > output['metric']).sum() / float(output['metric'].size) ) * 100 ) + + ret = { 'metric_count' : count, + 'metric_buf' : output, + 'metric_min' : mmin, + 'metric_min_index' : mmin_index, + 'metric_max' : mmax, + 'metric_max_index' : mmax_index, + 'metric_mean' : mean, + 'metric_median' : median, + } + return(ret) + + +def do_extract_metrics_new(args): + +# print "" +# print "do_extract_metrics ... " + + fname = args['file'] + metric = args['metric'] + print(fname) + print 'metric id = ' + metric['id'] + print 'metric regex = ' + metric['regex'] + + + + count = 0 + mmin = 0 + mmin_index = 0 + mmax = 0 + mmax_index = 0 + mean = 0 + median = 0 + + toto = [('id', 'S20'), ('metric', np.float), ('frame', np.int)] + print toto + + + np_format = [] + + for x in range(0, metric['nb_metric']): + np_format.append( ('id'+str(x), 'S20') ) + np_format.append( ('metric'+str(x), np.float) ) + np_format.append( ('uom'+str(x), 'S20') ) + np_format.append( ('frame', np.int)) + + print np_format + + output = np.fromregex(fname,metric['regex'], np_format) + print output + count = output['frame'].size + print count + if count > 0: + + + fontP = FontProperties() + fontP.set_size('small') + + fig = plt.figure(1) + plt.figure(figsize=(10,10)) + + plot_xmax = np.amax(output['frame'])+np.amin(output['frame']) + + for x in range(0, metric['nb_metric']): + + metric_name = output['id'+str(x)][0] + metric_uom = output['uom'+str(x)][0] + + mmin = np.amin(output['metric'+str(x)]) + mmax = np.amax(output['metric'+str(x)]) + mmean = np.mean(output['metric'+str(x)]) + mmedian = np.median(output['metric'+str(x)]) + + plot_loc = 100*metric['nb_metric']+10+x+1 + + sbplt = plt.subplot(plot_loc) + sbplt.plot(output['frame'], output['metric'+str(x)], color='b' ) + sbplt.set_title( metric_name+' ('+metric_uom+')') + if mmin < 0: + sbplot_ymin=mmin+mmin/10 + else: + sbplot_ymin=0 + sbplt.set_ylim(ymin=sbplot_ymin) + if mmax > 0: + sbplot_ymax=mmax+mmax/10 + else: + sbplot_ymax=0 + sbplt.set_ylim(ymax=sbplot_ymax) + + sbplt.set_xlim(xmax=plot_xmax) + sbplt.set_xlim(xmin=0) + text='min: '+str(mmin)+'\nmax: '+str(mmax)+'\nmean: '+str(mmean)+'\nmedian: '+str(mmedian) + sbplt.text( plot_xmax+10,sbplot_ymin,text) + sbplt.set_xlabel('frame') + sbplt.set_ylabel(metric_name) + + plt.tight_layout() + + fname = "toto.png" + +# lgd = plt.legend(prop=fontP, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) + mng = plt.get_current_fig_manager() + plt.savefig(fname, bbox_inches='tight') + plt.close() + + + + + + + + + + mmin = np.amin(output['metric']); + mmin_index = np.argmin(output['metric']); + mmax = np.amax(output['metric']); + mmax_index = np.argmax(output['metric']); + mean = np.mean(output['metric']); + median = np.median(output['metric']); + +# print ( ( (metric['min_limit'] > output['metric']).sum() / float(output['metric'].size) ) * 100 ) + + ret = { 'metric_count' : count, + 'metric_buf' : output, + + + 'metric_min' : mmin, + 'metric_min_index' : mmin_index, + 'metric_max' : mmax, + 'metric_max_index' : mmax_index, + 'metric_mean' : mean, + 'metric_median' : median, + } + return(ret) + +# +# +# +def do_check_verdict(metric_def, metric_data): + verdict = 'INCON' + + pass_fail_stat = metric_def['pass_fail_stat'] + + if pass_fail_stat == 'max_value': + metric_stat = metric_data['metric_max'] + elif pass_fail_stat == 'min_value': + metric_stat = metric_data['metric_min'] + elif pass_fail_stat == 'mean_value': + metric_stat = metric_data['metric_mean'] + elif pass_fail_stat == 'median_value': + metric_stat = metric_data['metric_median'] + else : + print "do_check_verdict -> undef metric stat (pass_fail_stat in xml file)" + return verdict + + if 'max_limit' in metric_def: + if metric_stat > metric_def['max_limit']: + verdict = 'FAIL' + else: + verdict = 'PASS' + + if 'min_limit' in metric_def: + if metric_stat < metric_def['min_limit']: + verdict = 'FAIL' + else: + verdict = 'PASS' + return verdict + + +def do_print_metrics(metric_def, metric_data): + + + if metric_data['metric_count'] > 0 : + +# output = np.array( metric_data['metric_buf'] , [('id', 'S20'), ('metric', np.float), ('frame', np.int)]) + output = metric_data['metric_buf'] +# print output + + fontP = FontProperties() + fontP.set_size('small') + + plt.scatter(output['frame'], output['metric'], color='b', alpha=0.33, s = 1 ) + plt.plot([0, output['frame'][metric_data['metric_count']-1]],[ metric_def['min_limit'],metric_def['min_limit']], 'r-', lw=2) # Red straight line + + plt.title('Physical throughput ') + plt.xlabel('frame') + plt.ylabel(metric_def['id']) + plt.legend(prop=fontP) + mng = plt.get_current_fig_manager() + plt.show() + +def do_img_metrics(metric_def, metric_data, fname): + + + if metric_data['metric_count'] > 0 : + +# output = np.array( metric_data['metric_buf'] , [('id', 'S20'), ('metric', np.float), ('frame', np.int)]) + output = metric_data['metric_buf'] +# print 'TITI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' +# print output + +# print metric_def['min_limit'] +# print metric_data['metric_count'] +# print output['frame'][metric_data['metric_count']-1] + + fontP = FontProperties() + fontP.set_size('small') + + plt.figure() + +# print output['frame'].size +# print output['metric'].size + + plt.scatter(output['frame'], output['metric'], color='b', alpha=0.33, s = 1 , label=metric_def['id']) + + if 'min_limit' in metric_def: + plt.plot([0, output['frame'][metric_data['metric_count']-1]],[ metric_def['min_limit'],metric_def['min_limit']], 'r-', lw=2, label='min limit') # Red straight line + + plt.title(metric_def['id'] +' ('+metric_def['unit_of_meas']+')') + plt.xlabel('frame') + plt.ylabel(metric_def['id']) + + # Set graphic minimum Y axis + # ------------------------- + if metric_data['metric_min'] < 0: + plt.ylim(ymin=metric_data['metric_min']+metric_data['metric_min']/10) + else : + plt.ylim(ymin=0) + + y_axis_max = 0 + if 'min_limit' in metric_def: + if metric_data['metric_max'] > metric_def['min_limit']: + y_axis_max =metric_data['metric_max']+metric_data['metric_max']/10 + else: + y_axis_max =metric_def['min_limit']+metric_def['min_limit']/10 + else: + y_axis_max =metric_data['metric_max']+metric_data['metric_max']/10 + + + plt.ylim(ymax=y_axis_max) + + lgd = plt.legend(prop=fontP, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) + mng = plt.get_current_fig_manager() + plt.savefig(fname, bbox_extra_artists=(lgd,), bbox_inches='tight') + plt.close() + +# with open(fname, 'r') as f: +# for line in f: +# m = re.search(metric['regex'], line) +# if m : +# print m.group(1) + " -> "+m.group(2) + + + + +def do_extract_traffic_metrics(args): + + fname = args['file'] + +# print(fname) +# print 'metric id = ' + metric['id'] + +#[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams +#[ 3] 0.0- 1.0 sec 238 KBytes 1.95 Mbits/sec 0.980 ms 2/ 174 (1.1%) +# [ 3] 0.0- 1.0 sec 63.2 KBytes 517 Kbits/sec 0.146 ms 1/ 45 (2.2%) + +# iperf_regex = '[\s*(\d+)]\s+\d+\.\d+-\s*(\d+\.\d+)\s+sec\s+(\d+).+(\d+\.\d+).+(\d+\.\d+).+(\d+)\/\s*(\d+)\s+\((\d+\.\d+)\%\)' + # ID 0.0 1.0 63.2 KByte 517 Kbits/s 0.146 + iperf_regex = '\[\s*(\d+)\]\s+(\d+\.*\d*)-\s*(\d+\.*\d*)\s+sec\s+(\d+\.*\d*)\s+(\D+)\s+(\d+\.*\d*)\s+(\D+)\s+(\d+\.*\d*)\s+ms\s+(\d+)\/\s*(\d+)\s+\((\d+\.*\d*)\%\)' +# print 'iperf regex = ' + iperf_regex + + count = 0 + bw_min = 0 + bw_max = 0 + bw_mean = 0 + bw_median = 0 + jitter_min = 0 + jitter_max = 0 + jitter_mean = 0 + jitter_median = 0 + + rl_min = 0 + rl_max = 0 + rl_mean = 0 + rl_median = 0 + + interval_stop_max = 0 + + output = np.fromregex(fname,iperf_regex, [('id', np.int) , ('interval_start', np.float), ('interval_stop', np.float), ('transfer', np.float), ('transfer_uom', 'S20') ,('bandwidth', np.float), ('bandwidth_uom', 'S20') ,('jitter', np.float), ('lost', np.int) , ('total', np.int), ('rate_lost', np.float) ] ) + + count = output['id'].size -1 + # remove last line that is an iperf result resume + + if count > 0: + + output= np.delete(output, (count), axis=0 ) +# print output + + bw_min = np.amin(output['bandwidth']); + bw_max = np.amax(output['bandwidth']); + bw_mean = np.mean(output['bandwidth']); + bw_median = np.median(output['bandwidth']); + + jitter_min = np.amin(output['jitter']); + jitter_max = np.amax(output['jitter']); + jitter_mean = np.mean(output['jitter']); + jitter_median = np.median(output['jitter']); + + rl_min = np.amin(output['rate_lost']); + rl_max = np.amax(output['rate_lost']); + rl_mean = np.mean(output['rate_lost']); + rl_median = np.median(output['rate_lost']); + + interval_stop_max = np.amax(output['interval_stop']); + + else : + count = 0 + + + ret = { 'traffic_count' : count, + 'traffic_buf' : output, + 'bw_min' : bw_min, + 'bw_max' : bw_max, + 'bw_mean' : bw_mean, + 'bw_median' : bw_median, + 'jitter_min' : jitter_min, + 'jitter_max' : jitter_max, + 'jitter_mean' : jitter_mean, + 'jitter_median' : jitter_median, + 'rl_min' : rl_min, + 'rl_max' : rl_max, + 'rl_mean' : rl_mean, + 'rl_median' : rl_median, + 'interval_stop_max' : interval_stop_max + } + return(ret) + + + + +def do_img_traffic(traffic_data, fname): + + + if traffic_data['traffic_count'] > 0 : + + output = traffic_data['traffic_buf'] + + + fontP = FontProperties() + fontP.set_size('small') + + fig = plt.figure(1) + + ax1= plt.subplot(311) + plt.plot(output['interval_stop'], output['bandwidth'], color='b' ) + ax1.set_title('Bandwidth (Mbits/s)') + ax1.set_ylim(ymin=-1) + ax1.set_xlim(xmax=np.amax(output['interval_stop'])) + text='min: '+str(traffic_data['bw_min'])+'\nmax: '+str(traffic_data['bw_max'])+'\nmean: '+str(traffic_data['bw_mean'])+'\nmedian: '+str(traffic_data['bw_median']) + ax1.text( np.amax(output['interval_stop'])+10,0,text) + ax1.set_xlabel('time (s)') + ax1.set_ylabel(' ') + + ax2=plt.subplot(312) + plt.plot(output['interval_stop'], output['jitter'], color='b' ) + ax2.set_title('Jitter (ms)') + ax2.set_xlim(xmax=np.amax(output['interval_stop'])) + ax2.set_ylim(ymin=-1) + text='min: '+str(traffic_data['jitter_min'])+'\nmax: '+str(traffic_data['jitter_max'])+'\nmean: '+str(traffic_data['jitter_mean'])+'\nmedian: '+str(traffic_data['jitter_median']) + ax2.text( np.amax(output['interval_stop'])+10,0,text) + ax2.set_xlabel('time (s)') + ax2.set_ylabel(' ') + + ax3=plt.subplot(313) + plt.plot(output['interval_stop'], output['rate_lost'], color='b') + ax3.set_title('Loss rate %') + ax3.set_xlim(xmax=np.amax(output['interval_stop'])) + ax3.set_ylim(ymin=-1) + text='min: '+str(traffic_data['rl_min'])+'\nmax: '+str(traffic_data['rl_max'])+'\nmean: '+str(traffic_data['rl_mean'])+'\nmedian: '+str(traffic_data['rl_median']) + ax3.text( np.amax(output['interval_stop'])+10,0,text) + ax3.set_xlabel('time (s)') + ax3.set_ylabel(' ') + +# plt.title('Physical throughput ('+metric_def['unit_of_meas']+')') +# plt.xlabel('time (s)') +# plt.ylabel(metric_def['id']) + + # Set graphic minimum Y axis + # ------------------------- +# if traffic_data['bw_min'] == 0 : +# plt.ylim(ymin=-metric_def['min_limit']/10) +# else : +# plt.ylim(ymin=0) + +# y_axis_max = 0 +# if traffic_data['metric_max'] > metric_def['min_limit']: +# y_axis_max =traffic_data['metric_max']+traffic_data['metric_max']/10 +# else: +# y_axis_max =metric_def['min_limit']+metric_def['min_limit']/10 +# +# plt.ylim(ymax=y_axis_max) + + plt.tight_layout() + +# lgd = plt.legend(prop=fontP, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) + mng = plt.get_current_fig_manager() + plt.savefig(fname, bbox_inches='tight') + plt.close() + + + + +def create_report_html(context): + fname = context['report_path']+"/index.html" + + # + with open(fname, 'w') as f: + html = render_template('index.html', context) + f.write(html) + + +def create_test_report_detailed_html(context, fname ): + with open(fname, 'w') as f: + html = render_template('testcase_report.html', context) + f.write(html) + + +def check_cell_synchro(fname): + + with open(fname, 'r') as f: + for line in f: + + m = re.search('AUTOTEST Cell Sync \:', line) + if m : + #print line + return 'CELL_SYNCH' + + return 'CELL_NOT_SYNCH' + + +def check_exec_seg_fault(fname): + + with open(fname, 'r') as f: + for line in f: + m = re.search('Segmentation fault', line) + if m : + #print line + return 'SEG_FAULT' + + return 'NO_SEG_FAULT' + diff --git a/cmake_targets/autotests/tools/run_gdb b/cmake_targets/autotests/tools/run_gdb index a12d6ce21d..ace8e7a296 100755 --- a/cmake_targets/autotests/tools/run_gdb +++ b/cmake_targets/autotests/tools/run_gdb @@ -1,4 +1,27 @@ #!/bin/bash +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# \author Navid Nikaein, Rohit Gupta + #arg0 -> Name of executable #args[1...N] -> arguments to be passed to executable diff --git a/cmake_targets/autotests/tools/search_repl.py b/cmake_targets/autotests/tools/search_repl.py index fefc142f08..f34533cfd0 100755 --- a/cmake_targets/autotests/tools/search_repl.py +++ b/cmake_targets/autotests/tools/search_repl.py @@ -1,33 +1,25 @@ #!/usr/bin/python -#****************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ # \author Navid Nikaein, Rohit Gupta import sys diff --git a/cmake_targets/autotests/v2/actions/3276.txt b/cmake_targets/autotests/v2/actions/3276.txt new file mode 100644 index 0000000000..1976ceb3f3 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/3276.txt @@ -0,0 +1,13 @@ +When running lsusb, if you have: + + Bus 001 Device 002: ID 12d1:14fe Huawei Technologies Co., Ltd. Modem (Mass Storage Mode) + +You need to run: + + usb_modeswitch -v 12d1 -p 14fe -M '55534243123456780000000000000011062000000100000000000000000000' + +After what, running lsusb should give: + + Bus 001 Device 004: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard + +Values of 'Bus' and 'Device' may differ of course. diff --git a/cmake_targets/autotests/v2/actions/alu_epc.bash b/cmake_targets/autotests/v2/actions/alu_epc.bash new file mode 100644 index 0000000000..b2106693bd --- /dev/null +++ b/cmake_targets/autotests/v2/actions/alu_epc.bash @@ -0,0 +1,2 @@ +sudo /opt/ltebox/tools/stop_ltebox || true +sudo /opt/ltebox/tools/start_ltebox diff --git a/cmake_targets/autotests/v2/actions/alu_epc_stop.bash b/cmake_targets/autotests/v2/actions/alu_epc_stop.bash new file mode 100644 index 0000000000..ca91a27ab1 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/alu_epc_stop.bash @@ -0,0 +1 @@ +sudo /opt/ltebox/tools/stop_ltebox diff --git a/cmake_targets/autotests/v2/actions/alu_hss.bash b/cmake_targets/autotests/v2/actions/alu_hss.bash new file mode 100644 index 0000000000..1fb719c25b --- /dev/null +++ b/cmake_targets/autotests/v2/actions/alu_hss.bash @@ -0,0 +1,5 @@ +sudo rmmod nasmesh || true +sudo rmmod ue_ip || true +sudo /opt/ltebox/tools/stop_ltebox || true +sudo killall -9 hss_sim || true +sudo /opt/hss_sim0609/starthss_real diff --git a/cmake_targets/autotests/v2/actions/bandrich.txt b/cmake_targets/autotests/v2/actions/bandrich.txt new file mode 100644 index 0000000000..faa294465b --- /dev/null +++ b/cmake_targets/autotests/v2/actions/bandrich.txt @@ -0,0 +1,146 @@ +The configuration for the bandrich in the test setup is a bit hackish. + +Here come some notes explaining what we do here. + +To get /dev/bandrich.data and /dev/bandrich.control (so that you don't need +to look for which /dev/ttyUSBx are used by your dongle, and always use +the same files, no matter what), add a udev file: + + /etc/udev/rules.d/bandrich.rules + +containing lines: + + SUBSYSTEM=="tty", ENV{ID_VENDOR_ID}=="1a8d", ENV{ID_MODEL_ID}=="100d", ENV{ID_SERIAL_SHORT}=="357473040068155", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="bandrich.data", MODE="0666" + SUBSYSTEM=="tty", ENV{ID_VENDOR_ID}=="1a8d", ENV{ID_MODEL_ID}=="100d", ENV{ID_SERIAL_SHORT}=="357473040068155", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="bandrich.control", MODE="0666" + +To avoid NetworkManager to play with the bandrich, add also the line: + + ENV{ID_VENDOR_ID}=="1a8d", ENV{ID_MM_DEVICE_IGNORE}="1" + +Maybe also add; , ENV{ID_MM_DEVICE_IGNORE}="1" +to the two other lines. + +Then run: udevadm control --reload-rules +And: service network-manager restart + +Change vendor_id/model_id/serial/interface num to match yours. +Use lsusb -v to find values. + +At first we used /dev/ttyUSB2 linked to /dev/bandrich for both data (in +the wvdial configuration file) and control (in the python code, opening +/dev/bandrich the standard unix way and read and write into it, with no +special libusb commands). + +But it turned out that using /dev/ttyUSB2 for data gives bad throughput +results. We tested downlink UDP at 15Mb/s but the maximum throughput for +a 5MHz cell was around 13, and we had a lot of packets lost at the iperf's +UDP level. Radio was looking fine (all packets acked correctly), so it was +not a radio problem. The dongle in a windows machine was working fine, +15Mbs/s. Using the wvdial configuration file from test setup v1 gave also +good results. The only difference was the use of /dev/ttyUSB0 instead of +/dev/ttyUSB2. Using /dev/ttyUSB0 solved the throughput issue. + +But using /dev/ttyUSB0 for control in the pyton code did not work. The +output was incorrect. + +So we decided to have /dev/bandrich.data linked to /dev/ttyUSB0 for data +(wvdial) and /dev/bandrich.control linked to /dev/ttyUSB2 for control +(in python code). + +It may not be the correct way to go, but it seems to do the trick so far. + +Your device may need some other solution. + +Here, we get, as result of lsusb -v: + + [SNIP] + Bus 003 Device 009: ID 1a8d:100d BandRich, Inc. 4G LTE adapter + Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 2.00 + bDeviceClass 0 (Defined at Interface level) + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 64 + idVendor 0x1a8d BandRich, Inc. + idProduct 0x100d 4G LTE adapter + bcdDevice 0.00 + iManufacturer 10 BandRich, Inc. + iProduct 9 BandLuxe HSPA-LTE Adapter + iSerial 11 357473040068155 + [SNIP] + +You can also run: + + udevadm monitor + +and unplug/replug the dongle. It will print some information. + +The command: + + udevadm info --export-db + +is also important to get the right identifier to put in ENV{}. (It also +gives the correct value.) + +Here is extracted what we have for our dongle: + + P: /devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.2/3-1.2:1.2/ttyUSB2/tty/ttyUSB2 + N: ttyUSB2 + S: bandrich + S: serial/by-id/usb-BandRich__Inc._BandLuxe_HSPA-LTE_Adapter_357473040068155-if02-port0 + S: serial/by-path/pci-0000:00:1a.0-usb-0:1.2:1.2-port0 + E: DEVLINKS=/dev/bandrich /dev/serial/by-id/usb-BandRich__Inc._BandLuxe_HSPA-LTE_Adapter_357473040068155-if02-port0 /dev/serial/by-path/pci-0000:00:1a.0-usb-0:1.2:1.2-port0 + E: DEVNAME=/dev/ttyUSB2 + E: DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb3/3-1/3-1.2/3-1.2:1.2/ttyUSB2/tty/ttyUSB2 + E: ID_BUS=usb + E: ID_MM_CANDIDATE=1 + E: ID_MODEL=BandLuxe_HSPA-LTE_Adapter + E: ID_MODEL_ENC=BandLuxe\x20HSPA-LTE\x20Adapter + E: ID_MODEL_FROM_DATABASE=4G LTE adapter + E: ID_MODEL_ID=100d + E: ID_PATH=pci-0000:00:1a.0-usb-0:1.2:1.2 + E: ID_PATH_TAG=pci-0000_00_1a_0-usb-0_1_2_1_2 + E: ID_REVISION=0000 + E: ID_SERIAL=BandRich__Inc._BandLuxe_HSPA-LTE_Adapter_357473040068155 + E: ID_SERIAL_SHORT=357473040068155 + E: ID_TYPE=generic + E: ID_USB_DRIVER=option + E: ID_USB_INTERFACES=:ffffff:020600:0a0000:080650: + E: ID_USB_INTERFACE_NUM=02 + E: ID_VENDOR=BandRich__Inc. + E: ID_VENDOR_ENC=BandRich\x2c\x20Inc. + E: ID_VENDOR_FROM_DATABASE=BandRich, Inc. + E: ID_VENDOR_ID=1a8d + E: MAJOR=188 + E: MINOR=2 + E: SUBSYSTEM=tty + E: USEC_INITIALIZED=672068596 + +You can also run: + + udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0 + udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB2 + +Note: after creating the udev files, you need to unplug/replug your +dongle for /dev/bandrich.data and /dev/bandrich.control to appear. + +Note: the mode 0666 is for everyone to access the dongle (no need for + root privileges). If you prefer you can set it to 0600 (only root) + or 0660 (root and group). + +Then you need to configure pppd, to get correct 'route' information when +you run wvdial. + +The file /etc/ppp/peers/wvdial should have the following content: + + noauth + name wvdial + usepeerdns + defaultroute + replacedefaultroute + +The file wvdial.bandrich.conf has been created by copying some information +found on the Internet. Its content may not be fully correct. Adapt to your +situation. It seems to work here. diff --git a/cmake_targets/autotests/v2/actions/client_tcp.bash b/cmake_targets/autotests/v2/actions/client_tcp.bash new file mode 100644 index 0000000000..1079f9aee8 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/client_tcp.bash @@ -0,0 +1,2 @@ +echo $SERVER_IP +timeout -s 9 20s iperf -c $SERVER_IP -i1 diff --git a/cmake_targets/autotests/v2/actions/client_udp.bash b/cmake_targets/autotests/v2/actions/client_udp.bash new file mode 100644 index 0000000000..00151aa1f8 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/client_udp.bash @@ -0,0 +1,3 @@ +echo $SERVER_IP +echo $UDP_BANDWIDTH +timeout -s 9 20s iperf -c $SERVER_IP -i1 -u -b $UDP_BANDWIDTH diff --git a/cmake_targets/autotests/v2/actions/clone_repository.bash b/cmake_targets/autotests/v2/actions/clone_repository.bash new file mode 100644 index 0000000000..2f1769a623 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/clone_repository.bash @@ -0,0 +1,6 @@ +sudo rm -rf /tmp/oai_test_setup +mkdir /tmp/oai_test_setup +cd /tmp/oai_test_setup +git clone $REPOSITORY_URL oai +cd oai +git checkout $COMMIT_ID diff --git a/cmake_targets/autotests/v2/actions/compilation.bash b/cmake_targets/autotests/v2/actions/compilation.bash new file mode 100644 index 0000000000..44966616fa --- /dev/null +++ b/cmake_targets/autotests/v2/actions/compilation.bash @@ -0,0 +1,9 @@ +cd /tmp/oai_test_setup/oai +source oaienv +cd cmake_targets +rm -rf log +mkdir -p log +echo $BUILD_ARGUMENTS +./build_oai $BUILD_ARGUMENTS +echo $BUILD_OUTPUT +ls $BUILD_OUTPUT diff --git a/cmake_targets/autotests/v2/actions/execution.bash b/cmake_targets/autotests/v2/actions/execution.bash new file mode 100644 index 0000000000..0e05014888 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/execution.bash @@ -0,0 +1,4 @@ +cd /tmp/oai_test_setup/oai +source oaienv +echo $EXEC $EXEC_ARGS +$EXEC $EXEC_ARGS diff --git a/cmake_targets/autotests/v2/actions/execution_compile.bash b/cmake_targets/autotests/v2/actions/execution_compile.bash new file mode 100644 index 0000000000..149ebdff85 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/execution_compile.bash @@ -0,0 +1,13 @@ +cd /tmp/oai_test_setup/oai +source oaienv +sudo rmmod nasmesh || true +sudo rmmod ue_ip || true +cd cmake_targets +rm -rf log +mkdir -p log +echo $PRE_BUILD +bash -c "$PRE_BUILD" +echo $BUILD_PROG $BUILD_ARGUMENTS +$BUILD_PROG $BUILD_ARGUMENTS +echo $PRE_EXEC +bash -c "$PRE_EXEC" diff --git a/cmake_targets/autotests/v2/actions/modem.py b/cmake_targets/autotests/v2/actions/modem.py new file mode 100644 index 0000000000..a6c49fa9bf --- /dev/null +++ b/cmake_targets/autotests/v2/actions/modem.py @@ -0,0 +1,103 @@ +import sys, os, select, re, time + +def quit(r): + sys.stdout.flush() + os._exit(r) + +class ModemResponse: + def __init__(self, retcode, retstring): + self.ret = retcode + self.data = retstring + +class Modem: + def open(self): + self.i = os.open(self.devname, os.O_RDONLY) + self.o = os.open(self.devname, os.O_WRONLY) + #clear output of modem, if any is pending (not sure of this) + while True: + (ri, ro, re) = select.select([self.i], [], [self.i], 0) + if len(ri) == 0: + break + l = os.read(self.i, 65536) + print "WARNING: modem had unread data: '" + \ + l.replace('\r', '\\r') + "'" + + def __init__(self, devname): + self.devname = devname + self.i = -1 + self.o = -1 + self.open() + + def send(self, s): + print "DEBUG: SEND TO MODEM: '" + s + "'" + os.write(self.o, s+"\r") + + def recv(self): + return os.read(self.i, 65536) + + def wait(self): + ok = '\r\nOK\r\n' + error = '\r\nERROR\r\n' + cme_error = '\r\nCME ERROR:[^\r]*\r\n' + no_carrier = '\r\nNO CARRIER\r\n' + l = '' + while True: + l = l + self.recv() + print "DEBUG: CURRENT MODEM RESPONSE: '" + \ + l.replace('\r','\\r').replace('\n','\\n') + "'" + + #AT returned 'things' are "\r\nXXXX\r\n", look for that. + #Check if last one matches 'ok', 'error' or 'cme_error'. + #(Hopefully this is enough and no other reply is possible.) + #This code accepts invalid responses from modem, ie. all + #that does not fit in the 'findall' is thrashed away, maybe + #we want to do something in this case? + + res = re.findall('\r\n[^\r]*\r\n', l) + if len(res) == 0: + print "DEBUG: NO MATCH: wait for more input from modem" + continue + last_res = res[len(res)-1] + print "DEBUG: CURRENT LAST LINE: '" + \ + last_res.replace('\r','\\r').replace('\n','\\n')+"'" + if re.match(ok, last_res) != None: + return ModemResponse(True, l) + if ( re.match(error, last_res) != None or + re.match(cme_error, last_res) != None or + re.match(no_carrier, last_res) != None): + return ModemResponse(False, l) + #TODO purge? + #re.purge() + + def modem_reset_cycle(self): + #close all + os.close(self.i) + os.close(self.o) + self.i = -1 + self.o = -1 + + print "DEBUG: RESET CYCLE: wait for modem to go away" + #wait for file descriptor to go away + while True: + try: + test = os.open(self.devname, os.O_RDONLY) + os.close(test) + time.sleep(0.1) + except BaseException, e: + break + print "DEBUG: RESET CYCLE: modem has gone away" + + print "DEBUG: RESET CYCLE: wait for modem to come back" + #wait for file descriptor to be back, try to open it over and over + #TODO: use inotify here? (it's not in basic python as it seems) + while True: + try: + test = os.open(self.devname, os.O_RDONLY) + os.close(test) + break + except BaseException, e: + time.sleep(0.1) + print "DEBUG: RESET CYCLE: modem is back" + + #back to business + self.open() diff --git a/cmake_targets/autotests/v2/actions/run_enb.bash b/cmake_targets/autotests/v2/actions/run_enb.bash new file mode 100644 index 0000000000..abf7dc0286 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/run_enb.bash @@ -0,0 +1,12 @@ +#enable control+C reception (to be refined if it does not work) +stty isig intr ^C + +cd /tmp/oai_test_setup/oai +source oaienv +sudo rmmod nasmesh || true +sudo rmmod ue_ip || true +cd cmake_targets/lte_build_oai/build +ulimit -c unlimited +sudo rm -f core +#sudo -E ./lte-softmodem -O $OPENAIR_DIR/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.conf +sudo -E ./lte-softmodem -O /tmp/enb.conf diff --git a/cmake_targets/autotests/v2/actions/server_tcp.bash b/cmake_targets/autotests/v2/actions/server_tcp.bash new file mode 100644 index 0000000000..3e9c4aafc4 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/server_tcp.bash @@ -0,0 +1,4 @@ +stty isig intr ^C + +#timeout -s 9 20s iperf -s -i1 +iperf -s -i1 diff --git a/cmake_targets/autotests/v2/actions/server_udp.bash b/cmake_targets/autotests/v2/actions/server_udp.bash new file mode 100644 index 0000000000..22fba07092 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/server_udp.bash @@ -0,0 +1,4 @@ +stty isig intr ^C + +#timeout -s 9 20s iperf -s -i1 -u +iperf -s -i1 -u diff --git a/cmake_targets/autotests/v2/actions/start_3276.bash b/cmake_targets/autotests/v2/actions/start_3276.bash new file mode 100644 index 0000000000..380c914d47 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/start_3276.bash @@ -0,0 +1,13 @@ +#enable control+C reception (to be refined if it does not work) +stty isig intr ^C + +cd /tmp/oai_test_setup/oai +source oaienv +sudo rmmod nasmesh || true +sudo rmmod ue_ip || true +cd cmake_targets/autotests/v2/actions +sudo python start_3276.py + +sudo wvdial -C wvdial.3276.conf || true + +sudo python stop_3276.py diff --git a/cmake_targets/autotests/v2/actions/start_3276.py b/cmake_targets/autotests/v2/actions/start_3276.py new file mode 100644 index 0000000000..cf0629213a --- /dev/null +++ b/cmake_targets/autotests/v2/actions/start_3276.py @@ -0,0 +1,59 @@ +import time + +from modem import quit, Modem + +try: + modem = Modem("/dev/ttyUSB0") + + #test that modem is there + print "INFO: check modem's presence" + modem.send('AT') + if modem.wait().ret != True: + print "ERROR: no modem?" + quit(1) + + #first deactivate + print "INFO: deactivate the modem" + modem.send('AT+CFUN=0') + if modem.wait().ret != True: + print "ERROR: failed deactivating the modem" + quit(1) + + #activate the modem + print "INFO: activate the modem" + modem.send('AT+CFUN=1') + if modem.wait().ret != True: + print "ERROR: failed asking modem for activation" + quit(1) + + #wait for modem to be connected + #timeout after one minute + print "INFO: wait for modem to be connected (timeout: one minute)" + start_time = time.time() + while True: + modem.send('AT+CGATT?') + r = modem.wait() + if r.ret != True: + print "ERROR: failed checking attachment status of modem" + quit(1) + if "+CGATT: 1" in r.data: + break + if not "CGATT: 0" in r.data: + print "ERROR: bad data when checking attachment status of modem" + quit(1) + time.sleep(0.1) + if time.time() > start_time + 60: + print "ERROR: modem not connected after one minute, close modem" + modem.send('AT+CFUN=0') + r = modem.wait() + if r.ret != True: + print "ERROR: closing modem failed" + quit(1) + + print "INFO: modem is connected" + +except BaseException, e: + print "ERROR: " + str(e) + quit(1) + +quit(0) diff --git a/cmake_targets/autotests/v2/actions/start_bandrich.bash b/cmake_targets/autotests/v2/actions/start_bandrich.bash new file mode 100644 index 0000000000..7620e89784 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/start_bandrich.bash @@ -0,0 +1,26 @@ +#enable control+C reception (to be refined if it does not work) +stty isig intr ^C + +#If /dev/bandrich is not present when we start the test, what to do? +#The following commented lines are an attempt at solving this. +#This is not satisfying, so we rather do nothing. + +##the UE got stuck once, I had to run usb_modeswitch by hand. +##So at this point, if /dev/bandrich does not exist, maybe the UE is +##stuck for whatever reason. Let's forcefully run usb_modeswitch. +#if [ ! -e /dev/bandrich ]; then sudo usb_modeswitch -v 1a8d -p 1000 -I -W -K; true; fi +# +##wait for /dev/bandrich (TODO: use inotify?) +##may fail if the bandrich is in a bad state +#while [ ! -e /dev/bandrich ]; do sleep 1; done + +cd /tmp/oai_test_setup/oai +source oaienv +sudo rmmod nasmesh || true +sudo rmmod ue_ip || true +cd cmake_targets/autotests/v2/actions +python start_bandrich.py + +sudo wvdial -C wvdial.bandrich.conf || true + +python stop_bandrich.py diff --git a/cmake_targets/autotests/v2/actions/start_bandrich.py b/cmake_targets/autotests/v2/actions/start_bandrich.py new file mode 100644 index 0000000000..698694df05 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/start_bandrich.py @@ -0,0 +1,55 @@ +import time + +from modem import quit, Modem + +try: + modem = Modem("/dev/bandrich.control") + + #test that modem is there + print "INFO: check modem's presence" + modem.send('AT') + if modem.wait().ret != True: + print "ERROR: no modem?" + quit(1) + + #activate the modem, be brutal and reset it too! + print "INFO: reset and activate the modem" + modem.send('AT+CFUN=1,1') + if modem.wait().ret != True: + print "ERROR: failed asking modem for activation" + quit(1) + + #modem has gone! wait for it to pop up again + modem.modem_reset_cycle() + + #wait for modem to be connected + #timeout after one minute + print "INFO: wait for modem to be connected (timeout: one minute)" + start_time = time.time() + while True: + modem.send('AT+CGATT?') + r = modem.wait() + if r.ret != True: + print "ERROR: failed checking attachment status of modem" + quit(1) + if "+CGATT: 1" in r.data: + break + if not "CGATT: 0" in r.data: + print "ERROR: bad data when checking attachment status of modem" + quit(1) + time.sleep(0.1) + if time.time() > start_time + 60: + print "ERROR: modem not connected after one minute, close modem" + modem.send('AT+CFUN=4') + r = modem.wait() + if r.ret != True: + print "ERROR: closing modem failed" + quit(1) + + print "INFO: modem is connected" + +except BaseException, e: + print "ERROR: " + str(e) + quit(1) + +quit(0) diff --git a/cmake_targets/autotests/v2/actions/stop_3276.py b/cmake_targets/autotests/v2/actions/stop_3276.py new file mode 100644 index 0000000000..3eb7e889c6 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/stop_3276.py @@ -0,0 +1,29 @@ +import time + +from modem import quit, Modem + +try: + modem = Modem("/dev/ttyUSB0") + + #test that modem is there + print "INFO: check modem's presence" + modem.send('AT') + r = modem.wait() + if r.ret != True and "NO CARRIER" not in r.data: + print "ERROR: no modem?" + quit(1) + if "NO CARRIER" in r.data: + print "WARNING: 'NO CARRIER' detected, not sure if handled correctly" + + #deactivate the modem + print "INFO: deactivate the modem" + modem.send('AT+CFUN=0') + if modem.wait().ret != True: + print "ERROR: failed asking modem for deactivation" + quit(1) + +except BaseException, e: + print "ERROR: " + str(e) + quit(1) + +quit(0) diff --git a/cmake_targets/autotests/v2/actions/stop_bandrich.py b/cmake_targets/autotests/v2/actions/stop_bandrich.py new file mode 100644 index 0000000000..d539faa9f8 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/stop_bandrich.py @@ -0,0 +1,29 @@ +import time + +from modem import quit, Modem + +try: + modem = Modem("/dev/bandrich.control") + + #test that modem is there + print "INFO: check modem's presence" + modem.send('AT') + r = modem.wait() + if r.ret != True and "NO CARRIER" not in r.data: + print "ERROR: no modem?" + quit(1) + if "NO CARRIER" in r.data: + print "WARNING: 'NO CARRIER' detected, not sure if handled correctly" + + #deactivate the modem + print "INFO: deactivate the modem" + modem.send('AT+CFUN=4') + if modem.wait().ret != True: + print "ERROR: failed asking modem for deactivation" + quit(1) + +except BaseException, e: + print "ERROR: " + str(e) + quit(1) + +quit(0) diff --git a/cmake_targets/autotests/v2/actions/wvdial.3276.conf b/cmake_targets/autotests/v2/actions/wvdial.3276.conf new file mode 100644 index 0000000000..81fedc8df2 --- /dev/null +++ b/cmake_targets/autotests/v2/actions/wvdial.3276.conf @@ -0,0 +1,27 @@ +[Dialer Defaults] +Modem = /dev/ttyUSB0 +ISDN = off +Modem Type = Analog Modem +Baud = 9600 +Init1 = ATZ +Init2 = AT&F &D2 &C1 +Init3 = AT+CGDCONT=1,"IP","oai.ipv4" +Phone = *99# +Phone1 = +Phone2 = +Phone3 = +Phone4 = +Ask Password = off +Password = '' +Username = ImaginLab +Auto Reconnect = off +Abort on Busy = off +Carrier Check = on +Check Def Route = on +Abort on No Dialtone = on +Stupid Mode = on +Idle Seconds = 0 +Auto DNS = on +;Minimize = off +;Dock = off +;Do NOT edit this file by hand! diff --git a/cmake_targets/autotests/v2/actions/wvdial.bandrich.conf b/cmake_targets/autotests/v2/actions/wvdial.bandrich.conf new file mode 100644 index 0000000000..d3146e3a2a --- /dev/null +++ b/cmake_targets/autotests/v2/actions/wvdial.bandrich.conf @@ -0,0 +1,36 @@ +[Dialer Defaults] +Modem = /dev/bandrich.data +ISDN = off +Modem Type = Analog Modem +Baud = 9600 +Init = ATZ +Init2 = AT+CPIN? +Init3 = AT+CGREG? +Init4 = AT+COPS? +Init5 = AT+CSQ +Init6 = +Init7 = AT+CGATT=1 +Init8 = +Init9 = +Phone = *99***1# +Phone1 = +Phone2 = +Phone3 = +Phone4 = +Dial Prefix = +Dial Attempts = 1 +Dial Command = ATM1L3DT +Ask Password = off +Password = '' +Username = ImaginLab +Auto Reconnect = off +Abort on Busy = off +Carrier Check = on +Check Def Route = on +Abort on No Dialtone = on +Stupid Mode = on +Idle Seconds = 0 +Auto DNS = on +;Minimize = off +;Dock = off +;Do NOT edit this file by hand! diff --git a/cmake_targets/autotests/v2/alu_test.py b/cmake_targets/autotests/v2/alu_test.py new file mode 100644 index 0000000000..762e414a95 --- /dev/null +++ b/cmake_targets/autotests/v2/alu_test.py @@ -0,0 +1,551 @@ +import threading, os, re + +from utils import quickshell, log, TestFailed, do_tests +from task import Task, WAITLOG_SUCCESS + +class alu_test: + def __init__(self, + epc, enb, ue, + openair, + user, password, + log_subdir, + env, + enb_rru = "", + enb_rcc = ""): + self.epc_machine = epc + self.enb_machine = enb + self.ue_machine = ue + self.openair_dir = openair + self.oai_user = user + self.oai_password = password + self.env = env + self.enb_rru_machine = enb_rru + self.enb_rcc_machine = enb_rcc + + self.task_hss = None + self.task_enb = None + self.task_ue = None + self.task_rru_enb = None + self.task_rcc_enb = None + + self.logdir = openair + '/cmake_targets/autotests/log/' + log_subdir + quickshell('mkdir -p ' + self.logdir) + + #event object used to wait for several tasks at once + self.event = threading.Event() + + ########################################################################## + # finish + ########################################################################## + def finish(self): + #brutally kill tasks still running + #TODO: call 'wait', some processes may still be there as zombies + if self.task_hss != None and self.task_hss.alive(): + self.task_hss.kill() + if self.task_enb != None and self.task_enb.alive(): + self.task_enb.kill() + if self.task_ue != None and self.task_ue.alive(): + self.task_ue.kill() + if self.task_rru_enb != None and self.task_rru_enb.alive(): + self.task_rru_enb.kill() + if self.task_rcc_enb != None and self.task_rcc_enb.alive(): + self.task_rcc_enb.kill() + + ########################################################################## + # start_epc + ########################################################################## + def start_epc(self): + #launch HSS, wait for prompt + log("INFO: ALU test: run HSS") + self.task_hss = Task("actions/alu_hss.bash", + "alu_hss", + self.epc_machine, + self.oai_user, + self.oai_password, + self.env, + self.logdir + "/alu_hss." + self.epc_machine, + event=self.event) + self.task_hss.waitlog('S6AS_SIM-> ') + + #then launch EPC, wait for connection on HSS side + log("INFO: ALU test: run EPC") + task_epc = Task("actions/alu_epc.bash", + "ALU EPC", + self.epc_machine, + self.oai_user, + self.oai_password, + self.env, + self.logdir + "/alu_epc." + self.epc_machine) + ret = task_epc.wait() + if ret != 0: + log("ERROR: EPC start failure"); + raise TestFailed() + self.task_hss.waitlog('Connected\n') + + ########################################################################## + # stop_epc + ########################################################################## + def stop_epc(self): + #stop EPC, wait for disconnection on HSS side + log("INFO: ALU test: stop EPC") + task_epc = Task("actions/alu_epc_stop.bash", + "alu_epc_stop", + self.epc_machine, + self.oai_user, + self.oai_password, + self.env, + self.logdir + "/alu_epc_stop." + self.epc_machine) + ret = task_epc.wait() + if ret != 0: + log("ERROR: ALU test: ALU EPC stop failed") + raise TestFailed() + self.task_hss.waitlog('Disconnected\n') + + log("INFO: ALU test: stop HSS") + self.task_hss.sendnow("exit\n") + ret = self.task_hss.wait() + if ret != 0: + log("ERROR: ALU test: ALU HSS failed") + raise TestFailed() + + ########################################################################## + # compile_enb + ########################################################################## + def compile_enb(self, build_arguments, log_suffix=""): + log("INFO: ALU test: compile softmodem on " + self.enb_machine) + envcomp = list(self.env) + envcomp.append('BUILD_ARGUMENTS="' + build_arguments + '"') + #we don't care about BUILD_OUTPUT but required (TODO: change that) + envcomp.append('BUILD_OUTPUT=/') + logdir = self.logdir + "/compile_log" + remote_files = "'/tmp/oai_test_setup/oai/cmake_targets/log/*'" + post_action = "mkdir -p "+ logdir + \ + " && sshpass -p " + self.oai_password + \ + " scp -r " + self.oai_user + \ + "@" + self.enb_machine + ":" + remote_files + " " + logdir + \ + " || true" + task = Task("actions/compilation.bash", + "compile_softmodem", + self.enb_machine, + self.oai_user, + self.oai_password, + envcomp, + self.logdir + "/compile_softmodem." + log_suffix + \ + self.enb_machine, + post_action=post_action) + ret = task.wait() + if ret != 0: + log("ERROR: softmodem compilation failure"); + raise TestFailed() + task.postaction() + + ########################################################################## + # start_enb + ########################################################################## + def start_enb(self, config_file): + #copy wanted configuration file + quickshell("sshpass -p " + self.oai_password + + " scp config/" + config_file + " " + + self.oai_user + "@" + self.enb_machine + ":/tmp/enb.conf") + + #run softmodem + log("INFO: ALU test: run softmodem with configuration file " + + config_file) + self.task_enb = Task("actions/run_enb.bash", + "run_softmodem", + self.enb_machine, + self.oai_user, + self.oai_password, + self.env, + self.logdir + "/run_softmodem." + self.enb_machine, + event=self.event) + self.task_enb.waitlog('got sync') + + ########################################################################## + # stop_enb + ########################################################################## + def stop_enb(self): + log("INFO: ALU test: stop softmodem") + self.task_enb.sendnow("%c" % 3) + ret = self.task_enb.wait() + if ret != 0: + log("ERROR: ALU test: softmodem failed") + #not sure if we have to quit here or not + #os._exit(1) + + ########################################################################## + # start_enb_rru_rcc + ########################################################################## + def start_enb_rru_rcc(self, rru_config_file, rcc_config_file): + #copy wanted configuration files + quickshell("sshpass -p " + self.oai_password + + " scp config/" + rru_config_file + " " + + self.oai_user + "@" + self.enb_rru_machine+":/tmp/enb.conf") + quickshell("sshpass -p " + self.oai_password + + " scp config/" + rcc_config_file + " " + + self.oai_user + "@" + self.enb_rcc_machine+":/tmp/enb.conf") + + #run RRU/RCC softmodem + log("INFO: ALU test: run RRU softmodem with configuration file " + + rru_config_file) + self.task_rru_enb = Task("actions/run_enb.bash", + "run_RRU_softmodem", + self.enb_rru_machine, + self.oai_user, + self.oai_password, + self.env, + self.logdir + "/run_softmodem." + self.enb_rru_machine, + event=self.event) + self.task_rru_enb.waitlog('[RRH] binding to') + log("INFO: ALU test: run RCC softmodem with configuration file " + + rcc_config_file) + self.task_rcc_enb = Task("actions/run_enb.bash", + "run_RCC_softmodem", + self.enb_rcc_machine, + self.oai_user, + self.oai_password, + self.env, + self.logdir + "/run_softmodem." + self.enb_rcc_machine, + event=self.event) + self.task_rcc_enb.waitlog('[BBU] local ip addr') + #wait for RRU and RCC to be connected + self.task_rru_enb.waitlog('devices ok (eNB_thread_asynch_rx)') + + ########################################################################## + # stop_enb_rru_rcc + ########################################################################## + def stop_enb_rru_rcc(self): + log("INFO: ALU test: stop RRU/RCC softmodem") + self.task_rru_enb.sendnow("%c" % 3) + ret = self.task_rru_enb.wait() + if ret != 0: + log("ERROR: ALU test: RRU softmodem failed") + #not sure if we have to quit here or not + #os._exit(1) + self.task_rcc_enb.sendnow("%c" % 3) + ret = self.task_rcc_enb.wait() + if ret != 0: + log("ERROR: ALU test: RCC softmodem failed") + #not sure if we have to quit here or not + #os._exit(1) + + ########################################################################## + # start_ue + ########################################################################## + def start_ue(self, ue): + log("INFO: ALU test: start " + ue + " UE") + self.task_ue = Task("actions/start_" + ue + ".bash", + "start_" + ue, + self.ue_machine, + self.oai_user, + self.oai_password, + self.env, + self.logdir + "/start_" + ue + "." + self.ue_machine, + event=self.event) + self.task_ue.waitlog("local IP address", event=self.event) + self.event.wait() + + #at this point one task has died or we have the line in the log + if self.task_ue.waitlog_state != WAITLOG_SUCCESS: + log("ERROR: ALU test: " + ue + " UE did not connect") + raise TestFailed() + + self.event.clear() + + if ( (self.task_enb != None and not self.task_enb.alive()) or + (self.task_rru_enb!=None and not self.task_rru_enb.alive()) or + (self.task_rcc_enb!=None and not self.task_rcc_enb.alive()) or + not self.task_hss.alive() or + not self.task_ue.alive()): + log("ERROR: ALU test: eNB, HSS or UE task died") + raise TestFailed() + + #get UE IP + l = open(self.task_ue.logfile, "r").read() + self.ue_ip = re.search("local IP address (.*)\n", l) \ + .groups()[0] + log("INFO: ALU test: " + ue + " UE IP address: " + self.ue_ip) + + ########################################################################## + # stop_ue + ########################################################################## + def stop_ue(self, ue): + log("INFO: ALU test: stop " + ue + " UE") + self.task_ue.sendnow("%c" % 3) + ret = self.task_ue.wait() + if ret != 0: + log("ERROR: ALU test: task " + ue + " UE failed") + #not sure if we have to quit here or not + #os._exit(1) + + ########################################################################## + # _do_traffic (internal function, do not call out of the class) + ########################################################################## + def _do_traffic(self, name, + server_code, server_machine, server_ip, + client_code, client_machine, + waitlog, + server_logfile, client_logfile, + udp_bandwidth=None): + log("INFO: ALU test: run traffic: " + name) + + log("INFO: ALU test: launch server") + task_traffic_server = Task("actions/" + server_code + ".bash", + server_logfile, + server_machine, + self.oai_user, + self.oai_password, + self.env, + self.logdir + "/" + server_logfile + "." + server_machine, + event=self.event) + task_traffic_server.waitlog(waitlog) + + env = list(self.env) + if udp_bandwidth != None: + env.append("UDP_BANDWIDTH=" + udp_bandwidth) + env.append("SERVER_IP=" + server_ip) + + log("INFO: ALU test: launch client") + task_traffic_client = Task("actions/" + client_code + ".bash", + client_logfile, + client_machine, + self.oai_user, + self.oai_password, + env, + self.logdir + "/" + client_logfile + "." + client_machine, + event=self.event) + log("INFO: ALU test: wait for client to finish (or some error)") + + self.event.wait() + log("DEBUG: event.wait() done") + + if ( (self.task_enb != None and not self.task_enb.alive()) or + (self.task_rru_enb!=None and not self.task_rru_enb.alive()) or + (self.task_rcc_enb!=None and not self.task_rcc_enb.alive()) or + not self.task_hss.alive() or + not self.task_ue.alive()): + log("ERROR: unexpected task exited, test failed, kill all") + if task_traffic_client.alive(): + task_traffic_client.kill() + if (self.task_enb != None and self.task_enb.alive()): + self.task_enb.kill() + if (self.task_rru_enb != None and self.task_rru_enb.alive()): + self.task_rru_enb.kill() + if (self.task_rcc_enb != None and self.task_rcc_enb.alive()): + self.task_rcc_enb.kill() + if self.task_ue.alive(): + self.task_ue.kill() + + ret = task_traffic_client.wait() + if ret != 0: + log("ERROR: ALU test: downlink traffic failed") + #not sure if we have to quit here or not + #os._exit(1) + + #stop downlink server + #log("INFO: ALU test: stop server (kill ssh connection)") + #task_traffic_server.kill() + log("INFO: ALU test: stop server (ctrl+z then kill -9 %1)") + task_traffic_server.sendnow("%ckill -9 %%1 || true\n" % 26) + log("INFO: ALU test: wait for server to quit") + task_traffic_server.wait() + + self.event.clear() + + if ( (self.task_enb != None and not self.task_enb.alive()) or + (self.task_rru_enb!=None and not self.task_rru_enb.alive()) or + (self.task_rcc_enb!=None and not self.task_rcc_enb.alive()) or + not self.task_hss.alive() or + not self.task_ue.alive()): + log("ERROR: ALU test: eNB, HSS or UE task died") + raise TestFailed() + + ########################################################################## + # dl_tcp + ########################################################################## + def dl_tcp(self, ue): + self._do_traffic(ue + " downlink TCP", + "server_tcp", self.ue_machine, self.ue_ip, + "client_tcp", self.epc_machine, + "Server listening on TCP port 5001", + ue + "_downlink_tcp_server", + ue + "_downlink_tcp_client") + + ########################################################################## + # ul_tcp + ########################################################################## + def ul_tcp(self, ue): + self._do_traffic(ue + " uplink TCP", + "server_tcp", self.epc_machine, "192.172.0.1", + "client_tcp", self.ue_machine, + "Server listening on TCP port 5001", + ue + "_uplink_tcp_server", + ue + "_uplink_tcp_client") + + ########################################################################## + # dl_udp + ########################################################################## + def dl_udp(self, ue, bandwidth): + self._do_traffic(ue + " downlink UDP", + "server_udp", self.ue_machine, self.ue_ip, + "client_udp", self.epc_machine, + "Server listening on UDP port 5001", + ue + "_downlink_udp_server", + ue + "_downlink_udp_client", + udp_bandwidth=bandwidth) + + ########################################################################## + # ul_udp + ########################################################################## + def ul_udp(self, ue, bandwidth): + self._do_traffic(ue + " uplink UDP", + "server_udp", self.epc_machine, "192.172.0.1", + "client_udp", self.ue_machine, + "Server listening on UDP port 5001", + ue + "_uplink_udp_server", + ue + "_uplink_udp_client", + udp_bandwidth=bandwidth) + +############################################################################## +# run_b210_alu +############################################################################## + +def run_b210_alu(tests, openair_dir, oai_user, oai_password, env): + + #compile eNB (two cases: one for FDD and one for TDD) + + if do_tests(tests['b210']['alu']['fdd']): + alu = alu_test(epc='amerique', enb='hutch', ue='stevens', + openair=openair_dir, + user=oai_user, password=oai_password, + log_subdir='enb_tests/b210_alu/compile_enb_fdd', + env=env) + + try: + alu.compile_enb("--eNB -w USRP -x -c --disable-cpu-affinity") + except BaseException, e: + log("ERROR: ALU test failed: eNB compilation failed: " + str(e)) + return + + if do_tests(tests['b210']['alu']['tdd']): + alu = alu_test(epc='amerique', enb='calisson', ue='mozart', + openair=openair_dir, + user=oai_user, password=oai_password, + log_subdir='enb_tests/b210_alu/compile_enb_tdd', + env=env) + + try: + alu.compile_enb("--eNB -w USRP -x -c --disable-cpu-affinity") + except BaseException, e: + log("ERROR: ALU test failed: eNB compilation failed: " + str(e)) + return + + #compile RRU/RCC eNB + + if do_tests(tests['remote b210']['alu']['fdd']): + #RRU + alu = alu_test(epc='amerique', ue='stevens', + openair=openair_dir, + user=oai_user, password=oai_password, + log_subdir='enb_tests/remote_b210_alu/compile_enb_rru', + env=env, + #hack: set 'enb' to reuse 'compile_enb' + enb = 'superserver', + enb_rru = 'superserver', enb_rcc = 'starsky') + + try: + alu.compile_enb("--eNB -x -c -w USRP -t ETHERNET", + log_suffix='rru.') + except BaseException, e: + log("ERROR: ALU test failed: RRU eNB compilation failed: "+str(e)) + return + + #RCC + alu = alu_test(epc='amerique', ue='stevens', + openair=openair_dir, + user=oai_user, password=oai_password, + log_subdir='enb_tests/remote_b210_alu/compile_enb_rcc', + env=env, + #hack: set 'enb' to reuse 'compile_enb' + enb = 'starsky', + enb_rru = 'superserver', enb_rcc = 'starsky') + + try: + alu.compile_enb("--eNB -w None -t ETHERNET", + log_suffix='rcc.') + except BaseException, e: + log("ERROR: ALU test failed: RCC eNB compilation failed: "+str(e)) + return + + + #run tests + + udp_dl_bandwidth = { "5" : "15M", + "10" : "30M", + "20" : "60M" } + + udp_ul_bandwidth = { "5" : "7M", + "10" : "15M", + "20" : "15M" } + + ue_machine = { "fdd" : "stevens", + "tdd" : "mozart" } + + enb_machine = { "fdd" : "hutch", + "tdd" : "calisson" } + + band = { "fdd" : "7", + "tdd" : "38" } + + for mode in ('fdd', 'tdd'): + for bw in ('5', '10', '20'): + if do_tests(tests['b210']['alu'][mode][bw]): + log("INFO: ALU test: run tests for bandwidth " + bw + " MHz") + ctest = tests['b210']['alu'][mode][bw] + alu = alu_test(epc='amerique', enb=enb_machine[mode], ue=ue_machine[mode], + openair=openair_dir, + user=oai_user, password=oai_password, + log_subdir='enb_tests/b210_alu/' + mode + "/" + bw, + env=env) + try: + alu.start_epc() + alu.start_enb("enb.band" + band[mode] + ".tm1.usrpb210." + mode + "." + bw + "MHz.conf") + for ue in ('bandrich', '3276'): + if ue in ctest and do_tests(ctest[ue]): + alu.start_ue(ue) + if do_tests(ctest[ue]['tcp']['dl']): alu.dl_tcp(ue) + if do_tests(ctest[ue]['tcp']['ul']): alu.ul_tcp(ue) + if do_tests(ctest[ue]['udp']['dl']): alu.dl_udp(ue, udp_dl_bandwidth[bw]) + if do_tests(ctest[ue]['udp']['ul']): alu.ul_udp(ue, udp_ul_bandwidth[bw]) + alu.stop_ue(ue) + alu.stop_enb() + alu.stop_epc() + except BaseException, e: + log("ERROR: ALU test failed: " + str(e)) + alu.finish() + if do_tests(tests['remote b210']['alu'][mode][bw]): + log("INFO: ALU test: run RRU/RCC tests for bandwidth " + bw + " MHz") + ctest = tests['remote b210']['alu'][mode][bw] + alu = alu_test(epc='amerique', enb='', ue=ue_machine[mode], + openair=openair_dir, + user=oai_user, password=oai_password, + log_subdir='enb_tests/remote_b210_alu/' + bw, + env=env, + enb_rru='superserver', enb_rcc='starsky') + try: + alu.start_epc() + alu.start_enb_rru_rcc("rru.band7.tm1.if4p5." + bw + "MHz.udp.usrpb210.conf", + "rcc.band7.tm1.if4p5." + bw + "MHz.conf") + for ue in ('bandrich', '3276'): + if ue in ctest and do_tests(ctest[ue]): + alu.start_ue(ue) + if do_tests(ctest[ue]['tcp']['dl']): alu.dl_tcp(ue) + if do_tests(ctest[ue]['tcp']['ul']): alu.ul_tcp(ue) + if do_tests(ctest[ue]['udp']['dl']): alu.dl_udp(ue, udp_dl_bandwidth[bw]) + if do_tests(ctest[ue]['udp']['ul']): alu.ul_udp(ue, udp_ul_bandwidth[bw]) + alu.stop_ue(ue) + alu.stop_enb_rru_rcc() + alu.stop_epc() + except BaseException, e: + log("ERROR: ALU test failed: " + str(e)) + alu.finish() diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf similarity index 84% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf rename to cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf index 434dd056b4..e09e068c63 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.usrpb210.conf +++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.10MHz.conf @@ -5,7 +5,7 @@ Asn1_verbosity = "none"; eNBs = ( { - ////////// Identification parameters: + ////////// Identification parameters: eNB_ID = 0xe00; cell_type = "CELL_MACRO_ENB"; @@ -23,16 +23,20 @@ eNBs = component_carriers = ( { - frame_type = "FDD"; + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "TDD"; tdd_config = 3; tdd_config_s = 0; prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; + eutra_band = 38; + downlink_frequency = 2580000000L; + uplink_frequency_offset = 0; Nid_cell = 0; N_RB_DL = 50; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; @@ -43,10 +47,10 @@ eNBs = prach_zero_correlation = 1; prach_freq_offset = 2; pucch_delta_shift = 1; - pucch_nRB_CQI = 1; + pucch_nRB_CQI = 0; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; + pdsch_referenceSignalPower = -24; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -82,7 +86,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -97,6 +101,8 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; } ); @@ -129,8 +135,8 @@ eNBs = SCTP_OUTSTREAMS = 2; }; - ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; ipv6 = "192:168:30::17"; active = "yes"; @@ -138,32 +144,13 @@ eNBs = } ); -rrh_gw_config = ( - { - local_if_name = "eth0"; - #remote_address = "169.254.10.158"; - #local_address = "169.254.8.15"; - remote_address = "74:d4:35:cc:88:45"; - local_address = "98:90:96:df:66:07"; - local_port = 50000; #for raw option local port must be the same to remote - remote_port = 50000; - rrh_gw_active = "yes"; - tr_preference = "raw"; - rf_preference = "usrp_b200"; - iq_txshift = 4; - tx_sample_advance = 103; - tx_scheduling_advance = 9; - -} -); - NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth6"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; @@ -185,4 +172,4 @@ rrh_gw_config = ( rrc_log_verbosity ="medium"; }; } -); \ No newline at end of file +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf similarity index 85% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf rename to cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf index 7d34889f67..1f992daba2 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf +++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.20MHz.conf @@ -17,22 +17,26 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "93"; + mobile_network_code = "92"; ////////// Physical parameters: component_carriers = ( { - frame_type = "FDD"; + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "TDD"; tdd_config = 3; tdd_config_s = 0; prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; + eutra_band = 38; + downlink_frequency = 2580000000L; + uplink_frequency_offset = 0; Nid_cell = 0; N_RB_DL = 100; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; @@ -43,10 +47,10 @@ eNBs = prach_zero_correlation = 1; prach_freq_offset = 2; pucch_delta_shift = 1; - pucch_nRB_CQI = 1; + pucch_nRB_CQI = 0; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; + pdsch_referenceSignalPower = -24; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -66,7 +70,7 @@ eNBs = pusch_p0_Nominal = -90; pusch_alpha = "AL1"; - pucch_p0_Nominal = -100; + pucch_p0_Nominal = -96; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -82,7 +86,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -97,6 +101,8 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; } ); @@ -130,7 +136,8 @@ eNBs = }; ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; + + mme_ip_address = ( { ipv4 = "192.168.12.26"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -139,11 +146,11 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth6"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; @@ -164,6 +171,5 @@ eNBs = rrc_log_level ="info"; rrc_log_verbosity ="medium"; }; - } ); diff --git a/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf new file mode 100644 index 0000000000..bb7df8b72d --- /dev/null +++ b/cmake_targets/autotests/v2/config/enb.band38.tm1.usrpb210.tdd.5MHz.conf @@ -0,0 +1,175 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "TDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 38; + downlink_frequency = 2580000000L; + uplink_frequency_offset = 0; + Nid_cell = 0; + N_RB_DL = 25; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 0; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -24; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -90; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -96; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -104; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + } + ); + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// MME parameters: + + mme_ip_address = ( { ipv4 = "192.168.12.26"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.82/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth6"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.82/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf similarity index 89% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf rename to cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf index d0488f2d37..ff97827b57 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpx310.conf +++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.10MHz.conf @@ -16,12 +16,16 @@ eNBs = tracking_area_code = "1"; mobile_country_code = "208"; + mobile_network_code = "92"; ////////// Physical parameters: component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; @@ -32,20 +36,21 @@ eNBs = Nid_cell = 0; N_RB_DL = 50; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; - tx_gain = 32; - rx_gain = 118; + tx_gain = 90; + rx_gain = 125; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; prach_zero_correlation = 1; prach_freq_offset = 2; pucch_delta_shift = 1; - pucch_nRB_CQI = 1; + pucch_nRB_CQI = 0; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -19; + pdsch_referenceSignalPower = -24; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -58,14 +63,14 @@ eNBs = phich_duration = "NORMAL"; phich_resource = "ONESIXTH"; srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; + /* srs_BandwidthConfig =; srs_SubframeConfig =; srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; + pucch_p0_Nominal = -103; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -75,13 +80,13 @@ eNBs = rach_numberOfRA_Preambles = 64; rach_preamblesGroupAConfig = "DISABLE"; - /* + /* rach_sizeOfRA_PreamblesGroupA = ; rach_messageSizeGroupA = ; rach_messagePowerOffsetGroupB = ; - */ + */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -96,10 +101,11 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; } ); - srb1_parameters : { # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] @@ -130,6 +136,7 @@ eNBs = }; ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; ipv6 = "192:168:30::17"; active = "yes"; @@ -139,17 +146,17 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; log_config : { - global_log_level ="debug"; + global_log_level ="info"; global_log_verbosity ="medium"; hw_log_level ="info"; hw_log_verbosity ="medium"; @@ -164,6 +171,5 @@ eNBs = rrc_log_level ="info"; rrc_log_verbosity ="medium"; }; - } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf similarity index 89% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf rename to cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf index 210c7ea740..ebb9e417e7 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf +++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.20MHz.conf @@ -16,12 +16,16 @@ eNBs = tracking_area_code = "1"; mobile_country_code = "208"; + mobile_network_code = "92"; ////////// Physical parameters: component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; @@ -32,20 +36,21 @@ eNBs = Nid_cell = 0; N_RB_DL = 100; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; - tx_gain = 32; - rx_gain = 116; + tx_gain = 90; + rx_gain = 125; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; prach_zero_correlation = 1; prach_freq_offset = 2; pucch_delta_shift = 1; - pucch_nRB_CQI = 1; + pucch_nRB_CQI = 0; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -23; + pdsch_referenceSignalPower = -24; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -58,14 +63,14 @@ eNBs = phich_duration = "NORMAL"; phich_resource = "ONESIXTH"; srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; + /* srs_BandwidthConfig =; srs_SubframeConfig =; srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; + pucch_p0_Nominal = -103; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -75,13 +80,13 @@ eNBs = rach_numberOfRA_Preambles = 64; rach_preamblesGroupAConfig = "DISABLE"; - /* + /* rach_sizeOfRA_PreamblesGroupA = ; rach_messageSizeGroupA = ; rach_messagePowerOffsetGroupB = ; - */ + */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -96,10 +101,11 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; } ); - srb1_parameters : { # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] @@ -130,6 +136,7 @@ eNBs = }; ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; ipv6 = "192:168:30::17"; active = "yes"; @@ -139,17 +146,17 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; log_config : { - global_log_level ="debug"; + global_log_level ="info"; global_log_verbosity ="medium"; hw_log_level ="info"; hw_log_verbosity ="medium"; @@ -164,6 +171,5 @@ eNBs = rrc_log_level ="info"; rrc_log_verbosity ="medium"; }; - } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf similarity index 89% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf rename to cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf index d4b88383e2..4e89102766 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpx310.conf +++ b/cmake_targets/autotests/v2/config/enb.band7.tm1.usrpb210.fdd.5MHz.conf @@ -16,12 +16,16 @@ eNBs = tracking_area_code = "1"; mobile_country_code = "208"; + mobile_network_code = "92"; ////////// Physical parameters: component_carriers = ( { + node_function = "eNodeB_3GPP"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; @@ -32,20 +36,21 @@ eNBs = Nid_cell = 0; N_RB_DL = 25; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; - tx_gain = 32; - rx_gain = 116; + tx_gain = 90; + rx_gain = 125; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; prach_zero_correlation = 1; prach_freq_offset = 2; pucch_delta_shift = 1; - pucch_nRB_CQI = 1; + pucch_nRB_CQI = 0; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -16; + pdsch_referenceSignalPower = -24; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -58,14 +63,14 @@ eNBs = phich_duration = "NORMAL"; phich_resource = "ONESIXTH"; srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; + /* srs_BandwidthConfig =; srs_SubframeConfig =; srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; + pucch_p0_Nominal = -103; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -75,13 +80,13 @@ eNBs = rach_numberOfRA_Preambles = 64; rach_preamblesGroupAConfig = "DISABLE"; - /* + /* rach_sizeOfRA_PreamblesGroupA = ; rach_messageSizeGroupA = ; rach_messagePowerOffsetGroupB = ; - */ + */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -96,10 +101,11 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; } ); - srb1_parameters : { # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] @@ -130,6 +136,7 @@ eNBs = }; ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; ipv6 = "192:168:30::17"; active = "yes"; @@ -139,17 +146,17 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.19/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; log_config : { - global_log_level ="debug"; + global_log_level ="info"; global_log_verbosity ="medium"; hw_log_level ="info"; hw_log_verbosity ="medium"; @@ -164,6 +171,5 @@ eNBs = rrc_log_level ="info"; rrc_log_verbosity ="medium"; }; - } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf similarity index 80% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf rename to cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf index 1bf3c6fbf2..beaf5ae0f1 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.usrpb210.conf +++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.10MHz.conf @@ -17,36 +17,40 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "95"; + mobile_network_code = "92"; ////////// Physical parameters: component_carriers = ( { + node_function = "NGFI_RCC_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; prefix_type = "NORMAL"; - eutra_band = 13; - downlink_frequency = 751000000L; - uplink_frequency_offset = 31000000; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 50; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 110; + rx_gain = 125; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; prach_zero_correlation = 1; prach_freq_offset = 2; pucch_delta_shift = 1; - pucch_nRB_CQI = 1; + pucch_nRB_CQI = 0; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -15; + pdsch_referenceSignalPower = -29; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -64,9 +68,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -82,7 +86,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -100; + rach_preambleInitialReceivedTargetPower = -108; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -97,7 +101,7 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; - + ue_TransmissionMode = 1; } ); @@ -133,7 +137,7 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "172.27.8.52"; + mme_ip_address = ( { ipv4 = "192.168.12.26"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -142,14 +146,31 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "172.27.8.51/23"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "172.27.8.51/23"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; + rrh_gw_config = ( + { + local_if_name = "eth1"; + remote_address = "10.10.10.157"; + local_address = "10.10.10.18"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "udp_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + if_compression = "alaw"; + } + ); + log_config : { global_log_level ="info"; @@ -168,4 +189,4 @@ eNBs = rrc_log_verbosity ="medium"; }; } -); \ No newline at end of file +); diff --git a/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf new file mode 100644 index 0000000000..b0efe66e14 --- /dev/null +++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.20MHz.conf @@ -0,0 +1,192 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RCC_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 100; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 0; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth1"; + remote_address = "10.10.10.157"; + local_address = "10.10.10.18"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "udp_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + if_compression = "alaw"; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf similarity index 80% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf rename to cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf index 266e5aae25..1b33c7b3c2 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.lmssdr.conf +++ b/cmake_targets/autotests/v2/config/rcc.band7.tm1.if4p5.5MHz.conf @@ -17,36 +17,40 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "93"; + mobile_network_code = "92"; ////////// Physical parameters: component_carriers = ( { + node_function = "NGFI_RCC_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; prefix_type = "NORMAL"; - eutra_band = 13; - downlink_frequency = 751000000L; - uplink_frequency_offset = 31000000; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 25; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 107; + rx_gain = 125; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; prach_zero_correlation = 1; prach_freq_offset = 2; pucch_delta_shift = 1; - pucch_nRB_CQI = 1; + pucch_nRB_CQI = 0; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -17; + pdsch_referenceSignalPower = -29; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -64,9 +68,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -97,7 +101,7 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; - + ue_TransmissionMode = 1; } ); @@ -133,7 +137,7 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; + mme_ip_address = ( { ipv4 = "192.168.12.26"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -142,14 +146,31 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.212/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.18/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.212/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.18/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; + rrh_gw_config = ( + { + local_if_name = "eth1"; + remote_address = "10.10.10.157"; + local_address = "10.10.10.18"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "udp_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + if_compression = "alaw"; + } + ); + log_config : { global_log_level ="info"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.rrh.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf similarity index 79% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.rrh.usrpb210.conf rename to cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf index 98226144ab..dc64a69c00 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.rrh.usrpb210.conf +++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.10MHz.udp.usrpb210.conf @@ -17,36 +17,40 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "95"; + mobile_network_code = "92"; ////////// Physical parameters: component_carriers = ( { + node_function = "NGFI_RRU_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; prefix_type = "NORMAL"; - eutra_band = 13; - downlink_frequency = 751000000L; - uplink_frequency_offset = 31000000; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; Nid_cell = 0; - N_RB_DL = 25; + N_RB_DL = 50; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 100; + rx_gain = 125; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; prach_zero_correlation = 1; prach_freq_offset = 2; pucch_delta_shift = 1; - pucch_nRB_CQI = 1; + pucch_nRB_CQI = 0; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -15; + pdsch_referenceSignalPower = -29; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -64,9 +68,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -86; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -82,7 +86,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -98,6 +102,8 @@ eNBs = ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + } ); @@ -133,42 +139,40 @@ eNBs = ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.62"; + mme_ip_address = ( { ipv4 = "192.168.12.11"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; } ); -rrh_gw_config = ( - { - local_if_name = "eth0"; - #remote_address = "169.254.10.158"; - #local_address = "169.254.8.15"; - remote_address = "74:d4:35:cc:88:45"; - local_address = "98:90:96:df:66:07"; - local_port = 50000; #for raw option local port must be the same to remote - remote_port = 50000; - rrh_gw_active = "yes"; - tr_preference = "raw"; - rf_preference = "usrp_b200"; - iq_txshift = 5; - tx_sample_advance = 70; - tx_scheduling_advance = 9; - -} -); - NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; - ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; + rrh_gw_config = ( + { + local_if_name = "eth3"; + remote_address = "10.10.10.18"; + local_address = "10.10.10.157"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "udp_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + if_compression = "alaw"; + } + ); + log_config : { global_log_level ="info"; diff --git a/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf new file mode 100644 index 0000000000..c93ce24d08 --- /dev/null +++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.20MHz.udp.usrpb210.conf @@ -0,0 +1,194 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "92"; + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RRU_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2660000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 100; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 0; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -29; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -104; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + + ue_TransmissionMode = 1; + + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.11"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth3"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + rrh_gw_config = ( + { + local_if_name = "eth3"; + remote_address = "10.10.10.18"; + local_address = "10.10.10.157"; + local_port = 50000; #for raw option local port must be the same to remote + remote_port = 50000; + rrh_gw_active = "yes"; + tr_preference = "udp_if4p5"; + rf_preference = "usrp_b200"; + iq_txshift = 4; + tx_sample_advance = 80; + tx_scheduling_advance = 9; + if_compression = "alaw"; + } + ); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf similarity index 91% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf rename to cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf index 894781fdfd..57f7ef83b9 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.usrpb210.conf +++ b/cmake_targets/autotests/v2/config/rru.band7.tm1.if4p5.5MHz.udp.usrpb210.conf @@ -17,12 +17,15 @@ eNBs = mobile_country_code = "208"; - mobile_network_code = "93"; + mobile_network_code = "92"; ////////// Physical parameters: component_carriers = ( { + node_function = "NGFI_RRU_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; @@ -33,6 +36,7 @@ eNBs = Nid_cell = 0; N_RB_DL = 25; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; @@ -43,7 +47,7 @@ eNBs = prach_zero_correlation = 1; prach_freq_offset = 2; pucch_delta_shift = 1; - pucch_nRB_CQI = 1; + pucch_nRB_CQI = 0; pucch_nCS_AN = 0; pucch_n1_AN = 32; pdsch_referenceSignalPower = -29; @@ -64,9 +68,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -82,7 +86,7 @@ eNBs = rach_messagePowerOffsetGroupB = ; */ rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; + rach_preambleInitialReceivedTargetPower = -104; rach_preambleTransMax = 10; rach_raResponseWindowSize = 10; rach_macContentionResolutionTimer = 48; @@ -98,6 +102,8 @@ eNBs = ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + } ); @@ -152,19 +158,18 @@ eNBs = rrh_gw_config = ( { - local_if_name = "eth0"; - #remote_address = "169.254.10.158"; - #local_address = "169.254.8.15"; - remote_address = "74:d4:35:cc:88:e3"; - local_address = "74:d4:35:cc:88:d1"; + local_if_name = "eth3"; + remote_address = "10.10.10.18"; + local_address = "10.10.10.157"; local_port = 50000; #for raw option local port must be the same to remote remote_port = 50000; rrh_gw_active = "yes"; - tr_preference = "raw"; + tr_preference = "udp_if4p5"; rf_preference = "usrp_b200"; iq_txshift = 4; tx_sample_advance = 80; tx_scheduling_advance = 9; + if_compression = "alaw"; } ); @@ -186,4 +191,4 @@ eNBs = rrc_log_verbosity ="medium"; }; } -); \ No newline at end of file +); diff --git a/cmake_targets/autotests/v2/connection.py b/cmake_targets/autotests/v2/connection.py new file mode 100644 index 0000000000..1952b8b72f --- /dev/null +++ b/cmake_targets/autotests/v2/connection.py @@ -0,0 +1,104 @@ +import os, subprocess, time, fcntl, termios, tty, signal, thread + +from utils import log + +class connection: + def __init__(self, description, host, user, password): + self.description = description + self.host = host + self.user = user + self.password = password + self.sendlock = thread.allocate_lock() + + try: + (pid, fd) = os.forkpty() + except BaseException, e: + log("ERROR: forkpty for '" + description + "': " + e) + (pid, fd) = (-1, -1) + + if pid == -1: + log("ERROR: creating connection for '" + description + "'") + os._exit(1) + + # child process, run ssh + if pid == 0: + try: + os.execvp('sshpass', ['sshpass', '-p', password, + 'ssh', user + '@' + host]) + except BaseException, e: + log("ERROR: execvp for '" + description + "': " + e) + log("ERROR: execvp failed for '" + description + "'") + os._exit(1) + + # parent process + # make the TTY raw to avoid getting input printed and no ^M + try: + tty.setraw(fd, termios.TCSANOW) + except BaseException, e: + log("ERROR: failed configuring TTY: " + str(e)) + os._exit(1) + +# try: +# fcntl.fcntl(fd, fcntl.F_SETFL, +# fcntl.fcntl(fd, fcntl.F_GETFL) | os.O_NONBLOCK) +# except: +# log("ERROR: fcntl failed for '" + description + "'") +# os._exit(1) + + self.pid = pid + self.fd = fd + self.active = True + self.retcode = -1 + + def send(self, string): + if self.active == False: + log("ERROR: send: child is dead for '" + self.description + "'") + return -1 + + try: + (pid, out) = os.waitpid(self.pid, os.WNOHANG) + except BaseException, e: + log("ERROR: send: waitpid failed for '" + self.description + + "': " + str(e)) + (pid, out) = (self.pid, 1) + if pid != 0: + log("ERROR: send: child process dead for '" + + self.description + "'") + try: + os.close(self.fd) + except BaseException, e: + #we don't care about errors at this point + pass + self.active = False + self.retcode = out + return -1 + + self.sendlock.acquire() + + length = len(string) + while length != 0: + try: + ret = os.write(self.fd, string) + except BaseException, e: + log("ERROR: send fails for '" + self.description + "': " + + str(e)) + os._exit(1) + + if ret == 0: + log("ERROR: send: write returns 0 for '" + + self.description + "'") + os._exit(1) + + length = length - ret + string = string[ret:] + + self.sendlock.release() + + return 0 + + def kill(self, signal=signal.SIGTERM): + log("INFO: kill connection '" + self.description + "'") + try: + os.kill(self.pid, signal) + except BaseException, e: + log("ERROR: connection.kill: " + str(e)) diff --git a/cmake_targets/autotests/v2/machine_list.py b/cmake_targets/autotests/v2/machine_list.py new file mode 100644 index 0000000000..dc41c504fe --- /dev/null +++ b/cmake_targets/autotests/v2/machine_list.py @@ -0,0 +1,79 @@ +import threading, os + +from utils import log + +class MachineWaiterThread(threading.Thread): + def __init__(self, machine, tasks): + threading.Thread.__init__(self) + self.machine = machine + self.tasks = tasks + + def run(self): + try: + for task in self.tasks: + ret = task.wait() + if ret != 0: + log("ERROR: task '" + task.description + "' failed " + + "on machine " + self.machine.name) + task.postaction() + self.machine.unbusy() + except BaseException, e: + log("ERROR: MachineWaiterThread: " + str(e)) + os._exit(1) + +class Machine(): + def __init__(self, machine, cond): + self.name = machine + self.free = True + self.cond = cond + def busy(self, tasks): + waiter = MachineWaiterThread(self, tasks) + waiter.start() + def unbusy(self): + self.cond.acquire() + self.free = True + self.cond.notify() + self.cond.release() + +class MachineList(): + def __init__(self, list): + self.list = [] + self.cond = threading.Condition() + for m in list: + self.list.append(Machine(m, self.cond)) + + def get_free_machine(self): + try: + self.cond.acquire() + while True: + free_machine = None + for m in self.list: + if m.free == True: + free_machine = m + break + if free_machine != None: + break + self.cond.wait() + free_machine.free = False + self.cond.release() + except BaseException, e: + log("ERROR: machine_list: " + str(e)) + os._exit(1) + return free_machine + + def wait_all_free(self): + try: + self.cond.acquire() + while True: + all_free = True + for m in self.list: + if m.free == False: + all_free = False + break + if all_free == True: + break + self.cond.wait() + self.cond.release() + except BaseException, e: + log("ERROR: machine_list: " + str(e)) + os._exit(1) diff --git a/cmake_targets/autotests/v2/main.py b/cmake_targets/autotests/v2/main.py new file mode 100644 index 0000000000..da38432dbc --- /dev/null +++ b/cmake_targets/autotests/v2/main.py @@ -0,0 +1,705 @@ +#!/usr/bin/python + +import os, re, sys, time, threading, thread +import xml.etree.ElementTree as ET + +from utils import test_in_list, quickshell, log +from task import Task, WAITLOG_SUCCESS, WAITLOG_FAILURE +from machine_list import MachineList + +oai_user = os.environ.get('OAI_USER') +oai_password = os.environ.get('OAI_PASS') +requested_tests = os.environ.get('OAI_TEST_CASE_GROUP') +machines = os.environ.get('MACHINELIST') +generic_machines = os.environ.get('MACHINELISTGENERIC') +result_dir = os.environ.get('RESULT_DIR') +nruns_softmodem = os.environ.get('NRUNS_LTE_SOFTMODEM') +openair_dir = os.environ.get('OPENAIR_DIR') + +some_undef = False +if (oai_user == None) : + log("variable OAI_USER is not defined") + some_undef = True +if (oai_password == None) : + log("variable OAI_PASS is not defined") + some_undef = True +if (requested_tests == None) : + log("variable OAI_TEST_CASE_GROUP is not defined") + some_undef = True +if (machines == None) : + log("variable MACHINELIST is not defined") + some_undef = True +if (generic_machines == None) : + log("variable MACHINELISTGENERIC is not defined") + some_undef = True +if (result_dir == None) : + log("variable RESULT_DIR is not defined") + some_undef = True +if (nruns_softmodem == None) : + log("variable NRUNS_LTE_SOFTMODEM is not defined") + some_undef = True +if (openair_dir == None) : + log("variable OPENAIR_DIR is not defined") + some_undef = True +if (some_undef == True): + os._exit(1) + +requested_tests = requested_tests .replace('"','') +machines = machines .replace('"','') +generic_machines = generic_machines .replace('"','') + +xml_test_file = os.environ.get('OPENAIR_DIR') + \ + "/cmake_targets/autotests/test_case_list.xml" + +xmlTree = ET.parse(xml_test_file) +xmlRoot = xmlTree.getroot() + +exclusion_tests=xmlRoot.findtext('TestCaseExclusionList',default='') +all_tests=xmlRoot.findall('testCase') + +exclusion_tests=exclusion_tests.split() +requested_tests=requested_tests.split() + +#check that exclusion tests are well formatted +#(6 digits or less than 6 digits followed by +) +for test in exclusion_tests: + if (not re.match('^[0-9]{6}$', test) and + not re.match('^[0-9]{1,5}\+$', test)): + log("ERROR: exclusion test is invalidly formatted: " + test) + os._exit(1) + +#check that requested tests are well formatted +#(6 digits or less than 6 digits followed by +) +#be verbose +for test in requested_tests: + if (re.match('^[0-9]{6}$', test) or + re.match('^[0-9]{1,5}\+$', test)): + log("INFO: test group/case requested: " + test) + else: + log("ERROR: requested test is invalidly formatted: " + test) + os._exit(1) + +#get the list of tests to be done +todo_tests=[] +for test in all_tests: + if (test_in_list(test.get('id'), requested_tests) and + not test_in_list(test.get('id'), exclusion_tests)): + log("INFO: test will be run: " + test.get('id')) + todo_tests.append(test) + else: + log("INFO: test will be skipped: " + test.get('id')) + +#get commit ID to use +commit_id = quickshell("git rev-parse --verify HEAD").replace('\n','') +if (len(commit_id) != 20*2): + log("ERROR: bad commit '" + commit_id + "'") +log("INFO: test for commit " + commit_id) + +#get repository URL +repository_url = quickshell("git config remote.origin.url").replace('\n','') +log("INFO: repository URL: " + repository_url) + +#prepare environment for tasks +env = [] +env.append("REPOSITORY_URL=" + repository_url) +env.append("COMMIT_ID=" + commit_id) + +#clone repository on all machines in the test setup +tasks=[] +for machine in machines.split(): + tasks.append(Task("actions/clone_repository.bash", + "clone repository on " + machine, + machine, + oai_user, + oai_password, + env, + openair_dir + "/cmake_targets/autotests/log/clone." \ + + machine)) +for task in tasks: + log("INFO: wait for task: " + task.description) + ret = task.wait() + if ret != 0 or not "TEST_SETUP_SUCCESS" in open(task.logfile).read(): + log("ERROR: task failed: " + task.description) + os._exit(1) + +############################################################################## +# run compilation tests # +############################################################################## + +machine_list = MachineList(generic_machines.split()) + +for test in todo_tests: + action = test.findtext('class') + if action != 'compilation': + continue + id = test.get('id') + machine = machine_list.get_free_machine() + log("INFO: start " + action + " test " + id + " on machine " + + machine.name) + tasks = [] + runenv = list(env) + runenv.append('OPENAIR_DIR=/tmp/oai_test_setup/oai') + runenv.append('BUILD_ARGUMENTS="' + + test.findtext('compile_prog_args') + + '"') + runenv.append('BUILD_OUTPUT="' + + test.findtext('compile_prog_out') + .replace('\n','') + + '"') + logdir = openair_dir +"/cmake_targets/autotests/log/"+ id +"/compile_log" + remote_files = "'/tmp/oai_test_setup/oai/cmake_targets/log/*'" + post_action = "mkdir -p "+ logdir + \ + " && sshpass -p " + oai_password + " scp -r " + oai_user + \ + "@" + machine.name + ":" + remote_files + " " + logdir + \ + " || true" + tasks.append(Task("actions/" + action + ".bash", + action + " of test " + id + " on " + machine.name, + machine.name, + oai_user, + oai_password, + runenv, + openair_dir + "/cmake_targets/autotests/log/" + + id + "." + + machine.name, + post_action=post_action)) + machine.busy(tasks) + +############################################################################## +# run execution tests # +############################################################################## + +class ExecutionThread(threading.Thread): + def __init__(self, id, machine, test): + threading.Thread.__init__(self) + self.machine = machine + self.id = id + self.test = test + + def run(self): + id = self.id + machine = self.machine + test = self.test + + # step 1: compile + + log("INFO: start compilation of test " + id + " on machine " + + machine.name) + tasks = [] + runenv = list(env) + runenv.append('OPENAIR_DIR=/tmp/oai_test_setup/oai') + runenv.append('PRE_BUILD="' + + test.findtext('pre_compile_prog') + + '"') + runenv.append('BUILD_PROG="' + + test.findtext('compile_prog') + + '"') + runenv.append('BUILD_ARGUMENTS="' + + test.findtext('compile_prog_args') + + '"') + runenv.append('PRE_EXEC="' + + test.findtext('pre_exec') + " " + + test.findtext('pre_exec_args') + + '"') + logdir = openair_dir +"/cmake_targets/autotests/log/"+ id + \ + "/compile_log" + remote_files = "'/tmp/oai_test_setup/oai/cmake_targets/log/*'" + post_action = "mkdir -p "+ logdir + \ + " && sshpass -p " + oai_password + \ + " scp -r " + oai_user + "@" + machine.name + ":" + \ + remote_files + " " + logdir + \ + " || true" + task = Task("actions/execution_compile.bash", + "compilation of test " + id + " on " + machine.name, + machine.name, + oai_user, + oai_password, + runenv, + openair_dir + "/cmake_targets/autotests/log/" + + id + "_compile." + + machine.name, + post_action=post_action) + ret = task.wait() + task.postaction() + if ret != 0: + log("ERROR: compilation of test " + id + " failed: " + str(ret)) + machine.unbusy() + return + + #step 2: run all tests + + nruns = test.findtext('nruns') + args = test.findtext('main_exec_args') + i = 0 + for arg in args.splitlines(): + i = i+1 + runenv2 = list(runenv) + runenv2.append('OPENAIR_TARGETS=/tmp/oai_test_setup/oai/targets') + runenv2.append('EXEC="' + + test.findtext('main_exec') + + '"') + runenv2.append('EXEC_ARGS="' + arg + '"') + for run in range(int(nruns)): + log("INFO: start execution of test " + id + " case " + + str(i) + " run " + str(run) + " on machine " + + machine.name) + task =Task("actions/execution.bash", + "execution of test " + id + " on " + machine.name, + machine.name, + oai_user, + oai_password, + runenv2, + openair_dir + "/cmake_targets/autotests/log/" + + id + "_case_" + str(i) + "_run_" + str(run) + + "." + machine.name) + ret = task.wait() + if ret != 0: + log("ERROR: execution of test " +id+ " failed: " + + str(ret)) + + machine.unbusy() + +for test in todo_tests: + action = test.findtext('class') + if action != 'execution': + continue + id = test.get('id') + machine = machine_list.get_free_machine() + ExecutionThread(id, machine, test).start() + +#wait for compilation/execution tests to be finished +#log only if some compilation/execution tests are actually done +for test in todo_tests: + action = test.findtext('class') + if action == 'execution' or action == 'compilation': + log("INFO: requested compilation/execution tests " + + "have been launched, waiting for completion") + break +machine_list.wait_all_free() + +############################################################################## +# run eNB softmodem tests # +############################################################################## + +tests = {} +for a in { 'b210', 'remote b210', 'x310', 'exmimo2' }: + tests[a] = {} + for b in { 'alu', 'openair-cn' }: + tests[a][b] = {} + for c in { 'fdd', 'tdd' }: + tests[a][b][c] = {} + for d in { '5', '10', '20' }: + tests[a][b][c][d] = {} + for e in { 'bandrich', 'sony', '3276' }: + tests[a][b][c][d][e] = {} + for f in { 'tcp', 'udp' }: + tests[a][b][c][d][e][f] = {} + for g in { 'dl', 'ul' }: + tests[a][b][c][d][e][f][g] = False + +todo_tests_ids = [] +for test in todo_tests: + todo_tests_ids.append(test.get('id')) + +for test in todo_tests_ids: + if test=='015500':tests['b210']['alu']['fdd'][ '5']['bandrich']['udp']['ul']=True + if test=='015501':tests['b210']['alu']['fdd']['10']['bandrich']['udp']['ul']=True + if test=='015502':tests['b210']['alu']['fdd']['20']['bandrich']['udp']['ul']=True + if test=='015503':tests['b210']['alu']['fdd'][ '5']['bandrich']['udp']['dl']=True + if test=='015504':tests['b210']['alu']['fdd']['10']['bandrich']['udp']['dl']=True + if test=='015505':tests['b210']['alu']['fdd']['20']['bandrich']['udp']['dl']=True + if test=='015506':log('WARNING: skip test ' + test) #TODO + if test=='015507':log('WARNING: skip test ' + test) #TODO + if test=='015508':log('WARNING: skip test ' + test) #TODO + if test=='015509':log('WARNING: skip test ' + test) #TODO + if test=='015510':log('WARNING: skip test ' + test) #TODO + if test=='015511':log('WARNING: skip test ' + test) #TODO + if test=='015512':tests['b210']['alu']['fdd'][ '5']['bandrich']['tcp']['ul']=True + if test=='015513':tests['b210']['alu']['fdd']['10']['bandrich']['tcp']['ul']=True + if test=='015514':tests['b210']['alu']['fdd']['20']['bandrich']['tcp']['ul']=True + if test=='015515':tests['b210']['alu']['fdd'][ '5']['bandrich']['tcp']['dl']=True + if test=='015516':tests['b210']['alu']['fdd']['10']['bandrich']['tcp']['dl']=True + if test=='015517':tests['b210']['alu']['fdd']['20']['bandrich']['tcp']['dl']=True + if test=='015518':log('WARNING: skip test ' + test) #TODO + if test=='015519':log('WARNING: skip test ' + test) #TODO + if test=='015520':log('WARNING: skip test ' + test) #TODO + if test=='015521':log('WARNING: skip test ' + test) #TODO + if test=='015522':log('WARNING: skip test ' + test) #TODO + if test=='015523':log('WARNING: skip test ' + test) #TODO + + if test=='015600':log('WARNING: skip test ' + test) #TODO + if test=='015601':log('WARNING: skip test ' + test) #TODO + if test=='015602':log('WARNING: skip test ' + test) #TODO + if test=='015603':log('WARNING: skip test ' + test) #TODO + if test=='015604':log('WARNING: skip test ' + test) #TODO + if test=='015605':log('WARNING: skip test ' + test) #TODO + + if test=='015700':log('WARNING: skip test ' + test) #TODO + if test=='015701':log('WARNING: skip test ' + test) #TODO + if test=='015702':log('WARNING: skip test ' + test) #TODO + if test=='015703':log('WARNING: skip test ' + test) #TODO + if test=='015704':log('WARNING: skip test ' + test) #TODO + if test=='015705':log('WARNING: skip test ' + test) #TODO + + if test=='015800':log('WARNING: skip test ' + test) #TODO + if test=='015801':log('WARNING: skip test ' + test) #TODO + if test=='015802':log('WARNING: skip test ' + test) #TODO + if test=='015803':log('WARNING: skip test ' + test) #TODO + if test=='015804':log('WARNING: skip test ' + test) #TODO + if test=='015805':log('WARNING: skip test ' + test) #TODO + if test=='015806':log('WARNING: skip test ' + test) #TODO + if test=='015807':log('WARNING: skip test ' + test) #TODO + if test=='015808':log('WARNING: skip test ' + test) #TODO + if test=='015809':log('WARNING: skip test ' + test) #TODO + if test=='015810':log('WARNING: skip test ' + test) #TODO + if test=='015811':log('WARNING: skip test ' + test) #TODO + if test=='015812':log('WARNING: skip test ' + test) #TODO + if test=='015813':log('WARNING: skip test ' + test) #TODO + if test=='015814':log('WARNING: skip test ' + test) #TODO + if test=='015815':log('WARNING: skip test ' + test) #TODO + if test=='015816':log('WARNING: skip test ' + test) #TODO + if test=='015817':log('WARNING: skip test ' + test) #TODO + if test=='015818':log('WARNING: skip test ' + test) #TODO + if test=='015819':log('WARNING: skip test ' + test) #TODO + if test=='015820':log('WARNING: skip test ' + test) #TODO + if test=='015821':log('WARNING: skip test ' + test) #TODO + if test=='015822':log('WARNING: skip test ' + test) #TODO + if test=='015823':log('WARNING: skip test ' + test) #TODO + + if test=='016000':log('WARNING: skip test ' + test) #TODO + if test=='016001':log('WARNING: skip test ' + test) #TODO + if test=='016002':log('WARNING: skip test ' + test) #TODO + if test=='016003':log('WARNING: skip test ' + test) #TODO + if test=='016004':log('WARNING: skip test ' + test) #TODO + if test=='016005':log('WARNING: skip test ' + test) #TODO + + if test=='016100':log('WARNING: skip test ' + test) #TODO + if test=='016101':log('WARNING: skip test ' + test) #TODO + if test=='016102':log('WARNING: skip test ' + test) #TODO + if test=='016103':log('WARNING: skip test ' + test) #TODO + if test=='016104':log('WARNING: skip test ' + test) #TODO + if test=='016105':log('WARNING: skip test ' + test) #TODO + + if test=='016300':log('WARNING: skip test ' + test) #TODO + if test=='016301':log('WARNING: skip test ' + test) #TODO + if test=='016302':log('WARNING: skip test ' + test) #TODO + if test=='016303':log('WARNING: skip test ' + test) #TODO + if test=='016304':log('WARNING: skip test ' + test) #TODO + if test=='016305':log('WARNING: skip test ' + test) #TODO + + if test=='016500':log('WARNING: skip test ' + test) #TODO + if test=='016501':log('WARNING: skip test ' + test) #TODO + if test=='016502':log('WARNING: skip test ' + test) #TODO + if test=='016503':log('WARNING: skip test ' + test) #TODO + if test=='016504':log('WARNING: skip test ' + test) #TODO + if test=='016505':log('WARNING: skip test ' + test) #TODO + + if test=='017000':log('WARNING: skip test ' + test) #TODO + if test=='017001':log('WARNING: skip test ' + test) #TODO + if test=='017002':log('WARNING: skip test ' + test) #TODO + if test=='017003':log('WARNING: skip test ' + test) #TODO + if test=='017004':log('WARNING: skip test ' + test) #TODO + if test=='017005':log('WARNING: skip test ' + test) #TODO + + if test=='017500':log('WARNING: skip test ' + test) #TODO + if test=='017501':log('WARNING: skip test ' + test) #TODO + if test=='017502':log('WARNING: skip test ' + test) #TODO + if test=='017503':log('WARNING: skip test ' + test) #TODO + if test=='017504':log('WARNING: skip test ' + test) #TODO + if test=='017505':log('WARNING: skip test ' + test) #TODO + + if test=='017600':tests['remote b210']['alu']['fdd'][ '5']['bandrich']['udp']['ul']=True + if test=='017601':tests['remote b210']['alu']['fdd']['10']['bandrich']['udp']['ul']=True + if test=='017602':tests['remote b210']['alu']['fdd']['20']['bandrich']['udp']['ul']=True + if test=='017603':tests['remote b210']['alu']['fdd'][ '5']['bandrich']['udp']['dl']=True + if test=='017604':tests['remote b210']['alu']['fdd']['10']['bandrich']['udp']['dl']=True + if test=='017605':tests['remote b210']['alu']['fdd']['20']['bandrich']['udp']['dl']=True + if test=='017606':tests['remote b210']['alu']['fdd'][ '5']['bandrich']['tcp']['ul']=True + if test=='017607':tests['remote b210']['alu']['fdd']['10']['bandrich']['tcp']['ul']=True + if test=='017608':tests['remote b210']['alu']['fdd']['20']['bandrich']['tcp']['ul']=True + if test=='017609':tests['remote b210']['alu']['fdd'][ '5']['bandrich']['tcp']['dl']=True + if test=='017610':tests['remote b210']['alu']['fdd']['10']['bandrich']['tcp']['dl']=True + if test=='017611':tests['remote b210']['alu']['fdd']['20']['bandrich']['tcp']['dl']=True + + if test=='018000':log('WARNING: skip test ' + test) #TODO + if test=='018001':log('WARNING: skip test ' + test) #TODO + if test=='018002':log('WARNING: skip test ' + test) #TODO + if test=='018003':log('WARNING: skip test ' + test) #TODO + if test=='018004':log('WARNING: skip test ' + test) #TODO + if test=='018005':log('WARNING: skip test ' + test) #TODO + + if test=='018500':log('WARNING: skip test ' + test) #TODO + if test=='018501':log('WARNING: skip test ' + test) #TODO + if test=='018502':log('WARNING: skip test ' + test) #TODO + if test=='018503':log('WARNING: skip test ' + test) #TODO + if test=='018504':log('WARNING: skip test ' + test) #TODO + if test=='018505':log('WARNING: skip test ' + test) #TODO + + if test=='018600':tests['b210']['alu']['tdd'][ '5']['3276']['udp']['ul']=True + if test=='018601':tests['b210']['alu']['tdd']['10']['3276']['udp']['ul']=True + if test=='018602':tests['b210']['alu']['tdd']['20']['3276']['udp']['ul']=True + if test=='018603':tests['b210']['alu']['tdd'][ '5']['3276']['udp']['dl']=True + if test=='018604':tests['b210']['alu']['tdd']['10']['3276']['udp']['dl']=True + if test=='018605':tests['b210']['alu']['tdd']['20']['3276']['udp']['dl']=True + if test=='018606':log('WARNING: skip test ' + test) #TODO + if test=='018607':log('WARNING: skip test ' + test) #TODO + if test=='018608':log('WARNING: skip test ' + test) #TODO + if test=='018609':log('WARNING: skip test ' + test) #TODO + if test=='018610':log('WARNING: skip test ' + test) #TODO + if test=='018611':log('WARNING: skip test ' + test) #TODO + if test=='018612':tests['b210']['alu']['tdd'][ '5']['3276']['tcp']['ul']=True + if test=='018613':tests['b210']['alu']['tdd']['10']['3276']['tcp']['ul']=True + if test=='018614':tests['b210']['alu']['tdd']['20']['3276']['tcp']['ul']=True + if test=='018615':tests['b210']['alu']['tdd'][ '5']['3276']['tcp']['dl']=True + if test=='018616':tests['b210']['alu']['tdd']['10']['3276']['tcp']['dl']=True + if test=='018617':tests['b210']['alu']['tdd']['20']['3276']['tcp']['dl']=True + if test=='018618':log('WARNING: skip test ' + test) #TODO + if test=='018619':log('WARNING: skip test ' + test) #TODO + if test=='018620':log('WARNING: skip test ' + test) #TODO + if test=='018621':log('WARNING: skip test ' + test) #TODO + if test=='018622':log('WARNING: skip test ' + test) #TODO + if test=='018623':log('WARNING: skip test ' + test) #TODO + + if test=='025500':log('WARNING: skip test ' + test) #TODO + if test=='025501':log('WARNING: skip test ' + test) #TODO + if test=='025502':log('WARNING: skip test ' + test) #TODO + if test=='025503':log('WARNING: skip test ' + test) #TODO + if test=='025504':log('WARNING: skip test ' + test) #TODO + if test=='025505':log('WARNING: skip test ' + test) #TODO + if test=='025506':log('WARNING: skip test ' + test) #TODO + if test=='025507':log('WARNING: skip test ' + test) #TODO + if test=='025508':log('WARNING: skip test ' + test) #TODO + if test=='025509':log('WARNING: skip test ' + test) #TODO + if test=='025510':log('WARNING: skip test ' + test) #TODO + if test=='025511':log('WARNING: skip test ' + test) #TODO + if test=='025512':log('WARNING: skip test ' + test) #TODO + if test=='025513':log('WARNING: skip test ' + test) #TODO + if test=='025514':log('WARNING: skip test ' + test) #TODO + if test=='025515':log('WARNING: skip test ' + test) #TODO + if test=='025516':log('WARNING: skip test ' + test) #TODO + if test=='025517':log('WARNING: skip test ' + test) #TODO + if test=='025518':log('WARNING: skip test ' + test) #TODO + if test=='025519':log('WARNING: skip test ' + test) #TODO + if test=='025520':log('WARNING: skip test ' + test) #TODO + if test=='025521':log('WARNING: skip test ' + test) #TODO + if test=='025522':log('WARNING: skip test ' + test) #TODO + if test=='025523':log('WARNING: skip test ' + test) #TODO + + if test=='025700':log('WARNING: skip test ' + test) #TODO + if test=='025701':log('WARNING: skip test ' + test) #TODO + if test=='025702':log('WARNING: skip test ' + test) #TODO + if test=='025703':log('WARNING: skip test ' + test) #TODO + if test=='025704':log('WARNING: skip test ' + test) #TODO + if test=='025705':log('WARNING: skip test ' + test) #TODO + +from alu_test import run_b210_alu + +#B210 ALU tests + +run_b210_alu(tests, openair_dir, oai_user, oai_password, env) + +#for test in todo_tests: +# action = test.findtext('class') +# if action != 'lte-softmodem': +# continue +# if not "start_ltebox" in test.findtext('EPC_main_exec'): +# continue +# id = test.get('id') +# log("INFO: Running ALU test " + id) +# logdir = openair_dir + "/cmake_targets/autotests/log/" + id +# quickshell("mkdir -p " + logdir) +# epc_machine = test.findtext('EPC') +# enb_machine = test.findtext('eNB') +# ue_machine = test.findtext('UE') +# +# #event object used to wait for several tasks at once +# event = threading.Event() +# +# #launch HSS, wait for prompt +# log("INFO: " + id + ": run HSS") +# task_hss = Task("actions/alu_hss.bash", +# "ALU HSS", +# epc_machine, +# oai_user, +# oai_password, +# env, +# logdir + "/alu_hss." + epc_machine, event=event) +# task_hss.waitlog('S6AS_SIM-> ') +# +# #then launch EPC, wait for connection on HSS side +# log("INFO: " + id + ": run EPC") +# task = Task("actions/alu_epc.bash", +# "ALU EPC", +# epc_machine, +# oai_user, +# oai_password, +# env, +# logdir + "/alu_epc." + epc_machine) +# ret = task.wait() +# if ret != 0: +# log("ERROR: EPC start failure"); +# os._exit(1) +# task_hss.waitlog('Connected\n') +# +# #compile softmodem +# log("INFO: " + id + ": compile softmodem") +# envcomp = list(env) +# envcomp.append('BUILD_ARGUMENTS="' + +# test.findtext('eNB_compile_prog_args') + '"') +# #we don't care about BUILD_OUTPUT but it's required (TODO: change that) +# envcomp.append('BUILD_OUTPUT=/') +# task = Task("actions/compilation.bash", +# "compile softmodem", +# enb_machine, +# oai_user, +# oai_password, +# envcomp, +# logdir + "/compile_softmodem." + enb_machine) +# ret = task.wait() +# if ret != 0: +# log("ERROR: softmodem compilation failure"); +# os._exit(1) +# +## #copy wanted configuration file +## quickshell("sshpass -p " + oai_password + +## " scp config/enb.band7.tm1.usrpb210.conf " + +## oai_user + "@" + enb_machine + ":/tmp/enb.conf") +# +# #run softmodem +# log("INFO: " + id + ": run softmodem") +# task_enb = Task("actions/run_enb.bash", +# "run softmodem", +# enb_machine, +# oai_user, +# oai_password, +# env, +# logdir + "/run_softmodem." + enb_machine, event=event) +# task_enb.waitlog('got sync') +# +# #start UE +# log("INFO: " + id + ": start bandrich UE") +# task_ue = Task("actions/start_bandrich.bash", +# "start bandrich UE", +# ue_machine, +# oai_user, +# oai_password, +# env, +# logdir + "/start_bandrich." + ue_machine, event=event) +# task_ue.waitlog("local IP address", event=event) +# +# event.wait() +# +# #at this point one task has died or we have the line in the log +# if task_ue.waitlog_state != WAITLOG_SUCCESS: +# log("ERROR: " + id + ": bandrich UE did not connect") +# os._exit(1) +# +# event.clear() +# +# if ( not task_enb.alive() or +# not task_hss.alive() or +# not task_ue.alive()): +# log("ERROR: " + id + ": eNB or UE tasks died") +# os._exit(1) +# +# #get bandrich UE IP +# l = open(task_ue.logfile, "r").read() +# ue_ip = re.search("local IP address (.*)\n", l).groups()[0] +# log("INFO: " + id + ": bandrich UE IP address: " + ue_ip) +# +# #run traffic +# log("INFO: " + id + ": run downlink TCP traffic") +# +# log("INFO: " + id + ": launch server") +# task_traffic_ue = Task("actions/downlink_bandrich.bash", +# "start iperf on bandrich UE as server", +# ue_machine, +# oai_user, +# oai_password, +# env, +# logdir + "/downlink_bandrich." + ue_machine, +# event=event) +# task_traffic_ue.waitlog("Server listening on TCP port 5001") +# +# log("INFO: " + id + ": launch client") +# envepc = list(env) +# envepc.append("UE_IP=" + ue_ip) +# task = Task("actions/downlink_epc.bash", +# "start iperf on EPC as client", +# epc_machine, +# oai_user, +# oai_password, +# envepc, +# logdir + "/downlink_epc." + epc_machine, event=event) +# log("INFO: " + id + ": wait for client (or some error)") +# +# event.wait() +# log("DEBUG: event.wait() done") +# +# if ( not task_enb.alive() or +# not task_hss.alive() or +# not task_ue.alive()): +# log("ERROR: unexpected task exited, test failed, kill all") +# if task.alive(): +# task.kill() +# if task_enb.alive(): +# task_enb.kill() +# if task_ue.alive(): +# task_ue.kill() +# +# ret = task.wait() +# if ret != 0: +# log("ERROR: " + id + ": downlink traffic failed") +# #not sure if we have to quit here or not +# #os._exit(1) +# +# #stop downlink server +# log("INFO: " + id + ": stop server (kill ssh connection)") +# task_traffic_ue.kill() +# log("INFO: " + id + ": wait for server to quit") +# task_traffic_ue.wait() +# +# #stop UE +# log("INFO: " + id + ": stop bandrich UE") +# task_ue.sendnow("%c" % 3) +# ret = task_ue.wait() +# if ret != 0: +# log("ERROR: " + id + ": task bandrich UE failed") +# #not sure if we have to quit here or not +# #os._exit(1) +# +# #stop softmodem +# log("INFO: " + id + ": stop softmodem") +# task_enb.sendnow("%c" % 3) +# ret = task_enb.wait() +# if ret != 0: +# log("ERROR: " + id + ": softmodem failed") +# #not sure if we have to quit here or not +# #os._exit(1) +# +# #stop EPC, wait for disconnection on HSS side +# log("INFO: " + id + ": stop EPC") +# task = Task("actions/alu_epc_stop.bash", +# "ALU EPC stop", +# epc_machine, +# oai_user, +# oai_password, +# env, +# logdir + "/alu_epc_stop." + epc_machine) +# ret = task.wait() +# if ret != 0: +# log("ERROR: " + id + ": ALU EPC stop failed") +# os._exit(1) +# task_hss.waitlog('Disconnected\n') +# +# log("INFO: " + id + ": stop HSS") +# task_hss.sendnow("exit\n") +# ret = task_hss.wait() +# if ret != 0: +# log("ERROR: " + id + ": ALU HSS failed") +# os._exit(1) + +import utils +log(utils.GREEN + "GOODBYE" + utils.RESET) +#os._exit(0) + +#run lte softmodem tests diff --git a/cmake_targets/autotests/v2/task.py b/cmake_targets/autotests/v2/task.py new file mode 100644 index 0000000000..68293e33e4 --- /dev/null +++ b/cmake_targets/autotests/v2/task.py @@ -0,0 +1,370 @@ +import os, time, threading, sys, os, errno, select +from connection import connection + +import utils +from utils import log + +#this class is to communicate between reader and sender threads +#the reader increments a count each time it receives the prompt +#and wakes up the sender +#it also indicates when it exits so the sender can exit too +#the sender (calling get) waits for the count to be greated than passed +#argument or if reader exited +#it returns argument+1 if things okay, -1 if reader exited +class Counter: + def __init__(self): + self.count = 0 + self.cond = threading.Condition() + + def inc(self): + self.cond.acquire() + self.count = self.count + 1 + self.cond.notify() + self.cond.release() + + def set(self, value): + self.cond.acquire() + self.count = value + self.cond.notify() + self.cond.release() + + def get(self, current): + self.cond.acquire() + while True: + if self.count == -1: + ret = -1 + break + if self.count >= current + 1: + ret = current + 1 + break + self.cond.wait() + self.cond.release() + return ret + +#this class is used for the main application to wait for some specific +#output from the remote program (typically the ALU HSS prompt, indicating +#it is ready and we can proceed further) +#(too much classes...) +class ProducerConsumer: + def __init__(self): + self.count = 0 + self.cond = threading.Condition() + + def add(self, v): + self.cond.acquire() + self.count = self.count + v + self.cond.notify() + self.cond.release() + + def set(self, v): + self.cond.acquire() + self.count = v + self.cond.notify() + self.cond.release() + + def get(self, old): + self.cond.acquire() + while True: + if self.count == -1: + ret = -1 + break + if self.count > old: + ret = self.count + break + self.cond.wait() + self.cond.release() + return ret + +#this thread gets input from the child process of the task +#it removes the prompts it gets (be carefully to use a prompt +#that will not be output of any command otherwise you dead) +class ReaderThread(threading.Thread): + def __init__(self, fdin, logfile, prompt, prompt_counter, producer): + threading.Thread.__init__(self) + self.fdin = fdin + self.logfile = logfile + self.prompt_counter = prompt_counter + self.prompt = prompt + self.promptsize = len(prompt) + self.stack = "" + self.stacksize = 0 + self.producer = producer + + def run(self): + try: + outfile = open(self.logfile, "w") + except BaseException, e: + log("ERROR: ReaderThread: " + self.logfile + ": " + str(e)) + os._exit(1) + while True: + try: + (a, b, c) = select.select([ self.fdin ], [], [ self.fdin ]) + except BaseException, e: + log("ERROR: ReaderThread: " + self.logfile + + ": select failed: " + str(e)) + os._exit(1) + try: + z = os.read(self.fdin, 1024) + except OSError, e: + if e.errno == errno.EIO: + #pipe has died, quit the thread + break + else: + log("ERROR: ReaderThread: " + self.logfile + + ": unhandled error: " + str(e)) + except BaseException, e: + log("ERROR: ReaderThread: " + self.logfile + + ": unhandled error: " + str(e)) + break + try: + produced = 0 + #this part is to remove the prompt + for x in z: + if x == self.prompt[self.stacksize]: + self.stack = self.stack + x + self.stacksize = self.stacksize + 1 + if self.stacksize == self.promptsize: + self.prompt_counter.inc() + self.stack = "" + self.stacksize = 0 + else: + outfile.write(self.stack) + outfile.write(x) + produced = produced + len(self.stack) + len(x) + self.stack = "" + self.stacksize = 0 + outfile.flush() + self.producer.add(produced) + except BaseException, e: + log("ERROR: ReaderThread: " + self.logfile + ": " + str(e)) + os._exit(1) + try: + outfile.close() + except BaseException, e: + log("ERROR: ReaderThread: " + self.logfile + ": " + str(e)) + os._exit(1) + #close the pipe, don't care about errors + try: + os.close(self.fdin) + except: + pass + #signal sender to quit + self.prompt_counter.set(-1) + self.producer.set(-1) + +class SenderQuit(Exception): + pass + +#this thread sends commands to the child process of the task +#it waits for the prompt between each command +#'event' is used for the main thread to wait for one of several tasks +#to quit, meaning error or end-of-test +class SenderThread(threading.Thread): + def __init__(self, fdout, prompt_counter, connection, env, action, + description, prompt, event=None): + threading.Thread.__init__(self) + self.fdin = fdout + self.prompt_counter = prompt_counter + self.connection = connection + self.env = env + self.action = action + self.description = description + self.prompt = prompt + self.count = 0 + self.event = event + self.alive = True + + def wait_prompt(self): + self.count = self.prompt_counter.get(self.count) + if self.count == -1: + raise SenderQuit() + + def _run(self): + self.connection.send('export PS1=' + self.prompt + '\n') + self.wait_prompt() + self.connection.send('set +o emacs\n') + self.wait_prompt() + self.connection.send('echo\n') + self.wait_prompt() + self.connection.send('echo\n') + self.wait_prompt() + self.connection.send("echo -e '" + utils.GREEN + + '---------------------------------------------' + + utils.RESET + "'\n") + self.wait_prompt() + self.connection.send('echo\n') + self.wait_prompt() + self.connection.send("echo -n -e '" + utils.YELLOW + + "COMMANDS START: " + + utils.RESET + "'\n") + self.wait_prompt() + self.connection.send('date\n') + self.wait_prompt() + + for l in self.env: + self.connection.send('export ' + l + '\n') + self.wait_prompt() + + with open(self.action) as f: + for line in f: + self.connection.send("echo -n -e '" + utils.GREEN + + "RUNNING: " + utils.RESET + "'\n") + self.wait_prompt() + self.connection.send("echo '" + + line.replace('\n','') + .replace("'", "'\\''") + "'\n") + self.wait_prompt() + self.connection.send(line) + self.wait_prompt() + self.connection.send("if [ $? != 0 ]; then " + + "echo -e '" + utils.RED + + "TEST_SETUP_ERROR: " + utils.RESET + + "last command failed, exiting'; " + + "date; exit 1; fi\n") + self.wait_prompt() + + self.connection.send("echo -n -e '" + utils.YELLOW + + "COMMANDS DONE: " + + utils.RESET + "'\n") + self.wait_prompt() + self.connection.send('date\n') + self.wait_prompt() + self.connection.send("echo -e '" + utils.GREEN + + "TEST_SETUP_SUCCESS" + utils.RESET + "'\n") + self.wait_prompt() + self.connection.send('exit\n') + + def run(self): + try: + self._run() + except SenderQuit: + log("WARNING: '" + self.description + "' exits too early?") + pass + except BaseException, e: + log("ERROR: task failed: " + str(e)) + log("ERROR: action is: " + self.action) + log("ERROR: description is: " + self.description) + os._exit(1) + + self.alive = False + + if self.event != None: + self.event.set() + +WAITLOG_RUNNING = 0 +WAITLOG_SUCCESS = 1 +WAITLOG_FAILURE = 2 + +class WaitlogFailed(Exception): + pass + +#'event' is used by main thread to wait for any of several threads to quit. +#'Task' passes it the 'SenderThread' above, which sets it when it finishes. +class Task: + def __init__(self, action, description, machine, user, password, env, + logfile, post_action = None, event=None): + self.action = action + self.description = description + self.machine = machine + self.user = user + self.password = password + self.post_action = post_action + self.producer = ProducerConsumer() + self.logfile = logfile + + prompt = "__OAI_TEST_SETUP_PROMPT__:" + prompt_counter = Counter() + + self.connection = connection(description, machine, user, password) + + self.reader = ReaderThread(self.connection.fd, logfile, prompt, + prompt_counter, self.producer) + self.reader.start() + + self.sender = SenderThread(self.connection.fd, prompt_counter, + self.connection, env, action, description, + prompt, event) + self.sender.start() + + def wait(self, timeout=-1): + if self.connection.active == False: + return self.connection.retcode + try: + (pid, ret) = os.waitpid(self.connection.pid, 0) + except KeyboardInterrupt, e: + log("ERROR: ctrl+c catched! " + str(e)) + os._exit(1) + except BaseException, e: + log("ERROR: " + str(e)) + os._exit(1) + self.sender.join() + self.reader.join() + return ret + + #this function should not be called, it is used internally by 'waitlog' + #in mode 'background thread' + #TODO: join() the thread at some point + def _waitlog_thread(self, task, s): + consumed = 0 + while True: + consumed = task.producer.get(consumed) + if consumed == -1: + log("ERROR: string '" + s + "' not found in logfile " + + task.logfile) + task.waitlog_state = WAITLOG_FAILURE + task.waitlog_event.set() + return + if s in open(task.logfile).read(): + task.waitlog_state = WAITLOG_SUCCESS + task.waitlog_event.set() + return + + #two ways to wait for a string in the log file: + # - blocking way + # - background thread, using an Event to signal success/failure + def waitlog(self, s, event=None): + if event != None: + self.waitlog_state = WAITLOG_RUNNING + self.waitlog_event = event + self.waitlog_thread = \ + threading.Thread(target=self._waitlog_thread, + args=(self, s)) + self.waitlog_thread.start() + return + + #TODO: optimize, do not process all the file at each wakeup + consumed = 0 + while True: + consumed = self.producer.get(consumed) + if consumed == -1: + log("ERROR: string '" + s + "' not found in logfile " + + self.logfile) + raise WaitlogFailed() + if s in open(self.logfile).read(): + return + + def sendnow(self, x): + self.connection.send(x) + + def alive(self): + return self.sender.alive + + def kill(self): + self.connection.kill() + #put some error log in logfile, for verbosity + try: + f = open(self.logfile, "a+") + f.write("\n\n" + utils.RED + "TEST_SETUP_ERROR: " + utils.RESET + + "task killed by test setup\n\n"); + close(f) + except BaseException, e: + pass + + def postaction(self): + if self.post_action != None: + out = utils.quickshell(self.post_action) + if len(out): + log("INFO: task '" + self.description + + "' post_action '" + self.post_action + "' says: ") + for l in out.splitlines(): + log("INFO: " + l) diff --git a/cmake_targets/autotests/v2/utils.py b/cmake_targets/autotests/v2/utils.py new file mode 100644 index 0000000000..e54bd45805 --- /dev/null +++ b/cmake_targets/autotests/v2/utils.py @@ -0,0 +1,84 @@ +import subprocess, os, thread, sys, time + +#logging facitiliy +#TODO: simplify (a first version redefined stdout, then we replaced 'print' +#instead, keeping stuff as is) +class Logger: + def __init__(self, stream): + self.stream = stream + self.start_of_line = True + self.lock = thread.allocate_lock() + openair_dir = os.environ.get('OPENAIR_DIR') + if openair_dir == None: + print "FATAL: no OPENAIR_DIR" + os._exit(1) + try: + self.logfile = open(openair_dir + + "/cmake_targets/autotests/log/python.stdout", "w") + except BaseException, e: + print "FATAL: cannot create log file" + print e + os._exit(1) + def put(self, data): + self.stream.write(data) + self.logfile.write(data) + def write(self, data): + self.lock.acquire() + for c in data: + if self.start_of_line: + self.start_of_line = False + t = time.strftime("%H:%M:%S", time.localtime()) + ": " + self.stream.write(t) + self.logfile.write(t) + self.put(c) + if c == '\n': + self.start_of_line = True + self.stream.flush() + self.logfile.flush() + self.lock.release() +logger = Logger(sys.stdout) +def log(x): + logger.write(x + "\n") + +#check if given test is in list +#it is in list if one of the strings in 'list' is at the beginning of 'test' +def test_in_list(test, list): + for check in list: + check=check.replace('+','') + if (test.startswith(check)): + return True + return False + +#run a local command in a shell +def quickshell(command): + process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + (retout, reterr) = process.communicate() + if (process.returncode != 0): + log("ERROR: shell command failed: " + command) + if len(retout): + log("ERROR: command says: ") + for l in retout.splitlines(): + log("ERROR: " + l) + os._exit(1) + return retout + +RED="\x1b[31m" +GREEN="\x1b[32m" +YELLOW="\x1b[33m" +RESET="\x1b[m" + +#an exception raised when a test fails +class TestFailed(Exception): + pass + +#this function returns True if a test in 'x' is set to True +#to be used as: if do_tests(tests['b210']['alu']) ... +def do_tests(x): + if type(x) == list: + for v in x: + if do_tests(v): return True + return False + if type(x) == dict: return do_tests(x.values()) + if x == True: return True + return False diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 935c57f0f1..0001b897db 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -1,34 +1,25 @@ #!/bin/bash -################################################################################ -# -# Copyright (c) 2015, EURECOM (www.eurecom.fr) -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# The views and conclusions contained in the software and documentation are those -# of the authors and should not be interpreted as representing official policies, -# either expressed or implied, of the FreeBSD Project. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file build_oai # brief OAI automated build tool that can be used to install, compile, run OAI. # author Navid Nikaein, Lionel GAUTHIER, Laurent Thomas @@ -42,14 +33,22 @@ ORIGIN_PATH=$PWD THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) source $THIS_SCRIPT_PATH/tools/build_helper +# set environment variables (OPENAIR_HOME, ...) +set_openair_env + +#variables for UE data generation +gen_nvram_path=$OPENAIR_DIR/targets/bin +conf_nvram_path=$OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf + MSC_GEN="False" XFORMS="True" +FLEXRAN_AGENT_SB_IF="True" PRINT_STATS="False" VCD_TIMING="False" DEADLINE_SCHEDULER_FLAG_USER="False" FORCE_DEADLINE_SCHEDULER_FLAG_USER="" -CPU_AFFINITY_FLAG_USER="True" #Only valid when lowlatecy flag is set to False -REL="Rel10" +CPU_AFFINITY_FLAG_USER="False" #Only valid when lowlatecy flag is set to False +REL="Rel14" HW="None" TP="None" NOS1=0 @@ -62,19 +61,26 @@ BUILD_DOXYGEN=0 T_TRACER="False" DISABLE_HARDWARE_DEPENDENCY="False" CMAKE_BUILD_TYPE="" +CMAKE_CMD="$CMAKE" +UE_AUTOTEST_TRACE="False" +UE_DEBUG_TRACE="False" +UE_TIMING_TRACE="False" +DISABLE_LOG_X="False" +USRP_REC_PLAY="False" +BUILD_ECLIPSE=0 trap handle_ctrl_c INT function print_help() { - echo_info ' + echo_info " This program installs OpenAirInterface Software You should have ubuntu 14.xx, updated, and the Linux kernel >= 3.14 Options -h This help -c | --clean - Erase all files to make a rebuild from start" + Erase all files to make a rebuild from start -C | --clean-all - Erase all files made by previous compilations, installations" + Erase all files made by previous compilations, installations --clean-kernel Erase previously installed features in kernel: iptables, drivers, ... -I | --install-external-packages @@ -83,18 +89,25 @@ Options --install-optional-packages Install useful but not mandatory packages such as valgrind -g | --run-with-gdb - Add debugging symbols to compilation directives. It also disables any compiler optimization. + Add debugging symbols to compilation directives. It also disables any compiler optimization. Only for debugging. Do not use in normal operation! -h | --help Print this help --eNB Makes the LTE softmodem --UE - Makes the UE specific parts (ue_ip, usim, nvram) ---RRH - Makes the RRH + Makes the UE specific parts (ue_ip, usim, nvram) from the given configuration file +--UE-conf-nvram [configuration file] + Specify conf_nvram_path (default \"$conf_nvram_path\") +--UE-gen-nvram [output path] + Specify gen_nvram_path (default \"$gen_nvram_path\") +-a | --agent + Enables agent for software-defined control of the eNB +--pdcp-split + Enables PDCP-RLC U plane split -r | --3gpp-release - default is Rel10, + default is Rel14, Rel8 limits the implementation to 3GPP Release 8 version + Rel10 limits the implementation to 3GPP Release 10 version -w | --hardware EXMIMO, USRP, BLADERF, ETHERNET, LMSSDR, None (Default) Adds this RF board support (in external packages installation and in compilation) @@ -102,7 +115,7 @@ Options ETHERNET , None Adds this trasport protocol support in compilation --oaisim - Makes the oaisim simulator. Hardware will be defaulted to "None". + Makes the oaisim simulator. Hardware will be defaulted to \"None\". --phy_simulators Makes the unitary tests Layer 1 simulators --core_simulators @@ -136,18 +149,31 @@ Options Enables the T tracer. --disable-hardware-dependency Disable HW dependency during installation +--ue-autotest-trace + Enable specific traces for UE autotest framework +--ue-trace + Enable traces for UE debugging +--ue-timing + Enable traces for timing +--disable-log + Disable all LOG_* macros +--build-eclipse + Build eclipse project files. Paths are auto corrected by fixprj.sh +--usrp-recplay + Build for I/Q record-playback modes Usage (first build): - oaisim (eNB + UE): ./build_oai -I -g --oaisim -x --install-system-files - Eurecom EXMIMO + COTS UE : ./build_oai -I -g --eNB -x --install-system-files - NI/ETTUS B201 + COTS UE : ./build_oai -I -g --eNB -x --install-system-files -w USRP + oaisim (eNB + UE): ./build_oai -I --oaisim -x --install-system-files + Eurecom EXMIMO + COTS UE : ./build_oai -I --eNB -x --install-system-files + NI/ETTUS B201 + COTS UE : ./build_oai -I --eNB -x --install-system-files -w USRP Usage (Regular): oaisim : ./build_oai --oaisim -x Eurecom EXMIMO + OAI ENB : ./build_oai --eNB -x - NI/ETTUS B201 + OAI ENB : ./build_oai --eNB -x -w USRP' + NI/ETTUS B201 + OAI ENB : ./build_oai --eNB -x -w USRP" } function main() { + until [ -z "$1" ] do case "$1" in @@ -173,19 +199,30 @@ function main() { GDB=1 CMAKE_BUILD_TYPE="Debug" echo_info "Will Compile with gdb symbols and disable compiler optimization" + CMAKE_CMD="$CMAKE_CMD -DCMAKE_BUILD_TYPE=Debug --trace-expand" shift;; --eNB) eNB=1 echo_info "Will compile eNB" shift;; + -a | --agent) + FLEXRAN_AGENT=1 + echo_info "Will compile eNB with agent support" + shift;; + --pdcp-split) + PDCP_SPLIT=1 + echo_info "Will compile PDCP-RLC U plane split support" + shift;; --UE) UE=1 echo_info "Will compile UE" shift;; - --RRH) - RRH=1 - echo_info "Will compile RRH" - shift;; + --UE-conf-nvram) + conf_nvram_path=$(readlink -f "$1") + shift 2;; + --UE-gen-nvram) + gen_nvram_path=$(readlink -f $2) + shift 2;; -r | --3gpp-release) REL=$2 echo_info "Setting release to: $REL" @@ -287,6 +324,39 @@ function main() { echo_info "Disabling hardware dependency for compiling software" DISABLE_HARDWARE_DEPENDENCY="True" shift 1;; + --ue-autotest-trace) + UE_AUTOTEST_TRACE="True" + echo_info "Enabling autotest specific trace for UE" + shift 1;; + --ue-trace) + UE_DEBUG_TRACE="True" + echo_info "Enabling UE trace for debug" + shift 1;; + --ue-timing) + UE_TIMING_TRACE="True" + echo_info "Enabling UE timing trace" + shift 1;; + --disable-log) + DISABLE_LOG_X="True" + echo_info "Disabling all LOG_* traces" + shift 1;; + --uhd-images-dir) + UHD_IMAGES_DIR=$2 + echo_info "Downloading UHD images in the indicated location" + shift 2;; + --build-eclipse) + BUILD_ECLIPSE=1 + CMAKE_CMD="$CMAKE_CMD"' -DCMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT=TRUE -G"Eclipse CDT4 - Unix Makefiles"' + echo_info "Enabling build eclipse project support" + shift 1;; + --build-telnetsrv) + BUILD_TELNETSRV=1 + echo_info "Build embedded telnet server" + shift ;; + --usrp-recplay) + USRP_REC_PLAY="True" + echo_info "Enabling USRP record playback mode" + shift 1;; -h | --help) print_help exit 1;; @@ -297,8 +367,11 @@ function main() { esac done + CMAKE_CMD="$CMAKE_CMD .." + echo_info "CMAKE_CMD=$CMAKE_CMD" + ######################################################### - # check validity of HW and TP parameters for RRH and eNB + # check validity of HW and TP parameters for eNB ######################################################### # to be discussed @@ -306,9 +379,6 @@ function main() { if [ "$HW" = "None" -a "$TP" = "None" ] ; then echo_fatal "Define a local radio head (e.g. -w EXMIMO) or a transport protocol (e.g. -t ETHERNET) to communicate with a remote radio head!" fi - if [ "$HW" != "None" -a "$TP" != "None" ] ; then - echo_fatal "Currently eNB can not support simultaniously local and remote radio heads!!" - fi if [ "$HW" = "None" ] ; then echo_info "No radio head has been selected (HW set to $HW)" fi @@ -317,15 +387,6 @@ function main() { fi fi - if [ "$RRH" = "1" ] ; then - if [ "$TP" = "None" ] ; then - echo_fatal "A transport protocol (e.g. -t ETHERNET) must be defined!" - fi - if [ "$HW" = "None" ] ; then - echo_info "No radio head has been selected (HW set to $HW)" - fi - fi - echo_info "RF HW set to $HW" #Now we set flags to enable deadline scheduler settings #By default: USRP: disable, @@ -333,9 +394,9 @@ function main() { #By default: EXMIMO: enable if [ "$FORCE_DEADLINE_SCHEDULER_FLAG_USER" = "" ]; then if [ "$HW" = "EXMIMO" ] ; then - DEADLINE_SCHEDULER_FLAG_USER="False" - elif [ "$HW" = "ETHERNET" ] ; then DEADLINE_SCHEDULER_FLAG_USER="True" + elif [ "$HW" = "ETHERNET" ] ; then + DEADLINE_SCHEDULER_FLAG_USER="False" elif [ "$HW" = "OAI_USRP" ] ; then DEADLINE_SCHEDULER_FLAG_USER="False" elif [ "$HW" = "OAI_BLADERF" ] ; then @@ -360,13 +421,16 @@ function main() { echo_info "Flags for Deadline scheduler: $DEADLINE_SCHEDULER_FLAG_USER" echo_info "Flags for CPU Affinity: $CPU_AFFINITY_FLAG_USER" + if [ -n "$UHD_IMAGES_DIR" ] && [ -z "$INSTALL_EXTERNAL" ]; then + echo_error "UHD images download settings will not be applied without -I present" + exit + fi ############################################ # setting and printing OAI envs, we should check here ############################################ echo_info "2. Setting the OAI PATHS ..." - set_openair_env cecho "OPENAIR_DIR = $OPENAIR_DIR" $green # for conf files copy in this bash script @@ -397,7 +461,7 @@ function main() { echo_info "installing packages for USRP support" check_install_usrp_uhd_driver if [ ! "$DISABLE_HARDWARE_DEPENDENCY" == "True" ]; then - install_usrp_uhd_driver + install_usrp_uhd_driver $UHD_IMAGES_DIR fi fi if [ "$HW" == "OAI_BLADERF" ] ; then @@ -407,6 +471,16 @@ function main() { flash_firmware_bladerf fi fi + if [ "$FLEXRAN_AGENT" == "1" ] ; then + echo_info "installing protobuf/protobuf-c for flexran agent support" + install_protobuf_from_source + install_protobuf_c_from_source + fi + if [ "$PDCP_SPLIT" == "1" ] ; then + echo_info "installing protobuf/protobuf-c for PDCP/RLC split support" + install_protobuf_from_source + install_protobuf_c_from_source + fi fi if [ "$INSTALL_OPTIONAL" = "1" ] ; then @@ -416,9 +490,9 @@ function main() { if [ "$oaisim" = "1" ] ; then #to be discussed - # there is no RF device and no transport protocol + # there is no RF device transport protocol HW="None" - TP="None" + TP="ETHERNET" if [ "$XFORMS" == "True" ] ; then PRINT_STATS="True" @@ -437,6 +511,9 @@ function main() { lte_exec=lte-softmodem fi +# configuration module libraries, one currently available, using libconfig + config_libconfig_shlib=params_libconfig + # first generate the CMakefile in the right directory if [ "$eNB" = "1" -o "$UE" = "1" -o "$HW" = "EXMIMO" ] ; then @@ -451,6 +528,9 @@ function main() { echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file echo "set ( XFORMS $XFORMS )" >> $cmake_file + if [ "$FLEXRAN_AGENT" = "1" ] ; then + echo "set ( FLEXRAN_AGENT_SB_IF $FLEXRAN_AGENT_SB_IF )" >> $cmake_file + fi echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file @@ -459,9 +539,19 @@ function main() { echo "set (DEADLINE_SCHEDULER \"${DEADLINE_SCHEDULER_FLAG_USER}\" )" >>$cmake_file echo "set (CPU_AFFINITY \"${CPU_AFFINITY_FLAG_USER}\" )" >>$cmake_file echo "set ( T_TRACER $T_TRACER )" >> $cmake_file + echo "set (UE_AUTOTEST_TRACE $UE_AUTOTEST_TRACE)" >> $cmake_file + echo "set (UE_DEBUG_TRACE $UE_DEBUG_TRACE)" >> $cmake_file + echo "set (UE_TIMING_TRACE $UE_TIMING_TRACE)" >> $cmake_file + echo "set (DISABLE_LOG_X $DISABLE_LOG_X)" >> $cmake_file + echo "set (USRP_REC_PLAY $USRP_REC_PLAY)" >> $cmake_file + if [ "$UE" = 1 -a "$NOS1" = "0" ] ; then + echo_info "Compiling UE S1 build : enabling Linux and NETLINK" + echo "set (LINUX True )" >> $cmake_file + echo "set (PDCP_USE_NETLINK True )" >> $cmake_file + fi echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file cd $DIR/$lte_build_dir/build - cmake .. + eval $CMAKE_CMD fi if [ "$eNB" = "1" -o "$UE" = "1" ] ; then @@ -470,6 +560,11 @@ function main() { $lte_build_dir $lte_exec \ $lte_exec $dbin/$lte_exec.$REL +# mandatory shared lib + compilations \ + $lte_build_dir $config_libconfig_shlib \ + lib$config_libconfig_shlib.so $dbin/lib$config_libconfig_shlib.so + if [ "$NOS1" = "1" ] ; then compilations \ $lte_build_dir nasmesh \ @@ -490,7 +585,7 @@ function main() { # mkdir -p $DIR/at_commands/build # cd $DIR/at_commands/build -# cmake .. +# eval $CMAKE_CMD # compilations \ # at_commands at_nas_ue \ # at_nas_ue $dbin/at_nas_ue @@ -499,22 +594,24 @@ function main() { mkdir -p $DIR/nas_sim_tools/build cd $DIR/nas_sim_tools/build - cmake .. + eval $CMAKE_CMD compilations \ nas_sim_tools usim \ usim $dbin/usim compilations \ nas_sim_tools nvram \ nvram $dbin/nvram + compilations \ + nas_sim_tools conf2uedata \ + conf2uedata $dbin/conf2uedata # generate USIM data - if [ -f $dbin/nvram ]; then - install_nas_tools $dbin $dconf + if [ -f $dbin/conf2uedata ]; then + install_nas_tools $conf_nvram_path $gen_nvram_path echo_info "Copying UE specific part to $DIR/$lte_build_dir/build" - cp -Rvf $dbin/.ue_emm.nvram $DIR/$lte_build_dir/build - cp -Rvf $dbin/.ue.nvram $DIR/$lte_build_dir/build - cp -Rvf $dbin/.usim.nvram $DIR/$lte_build_dir/build - + cp -Rvf $dbin/.ue_emm.nvram0 $DIR/$lte_build_dir/build + cp -Rvf $dbin/.ue.nvram0 $DIR/$lte_build_dir/build + cp -Rvf $dbin/.usim.nvram0 $DIR/$lte_build_dir/build else echo_warning "not generated UE NAS files: binaries not found" fi @@ -526,13 +623,13 @@ function main() { mkdir -p build cd build rm -f *sim - cmake .. + eval $CMAKE_CMD fi if [ "$SIMUS_PHY" = "1" ] ; then # lte unitary simulators compilation echo_info "Compiling unitary tests simulators" - simlist="dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim" + simlist="dlsim_tm4 dlsim ulsim pucchsim prachsim pdcchsim pbchsim mbmssim" for f in $simlist ; do compilations \ lte-simulators $f \ @@ -564,6 +661,7 @@ function main() { compilations \ $lte_build_dir updatefw \ updatefw $dbin/updatefw + echo_info "Compiling oarf tools. The logfile for compilation is here: $dlog/oarf.txt" make -C $OPENAIR_DIR/cmake_targets/$lte_build_dir/build oarf > $dlog/oarf.txt 2>&1 cp $OPENAIR_DIR/cmake_targets/$lte_build_dir/build/*.oct $dbin if [ -s $dbin/oarf_config_exmimo.oct ] ; then @@ -592,6 +690,10 @@ function main() { echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file echo "set ( CFLAGS_PROCESSOR_USER \"$CFLAGS_PROCESSOR_USER\" )" >> $cmake_file echo "set ( XFORMS $XFORMS )" >> $cmake_file + if [ "$FLEXRAN_AGENT" = "1" ] ; then + echo "set ( FLEXRAN_AGENT_SB_IF $FLEXRAN_AGENT_SB_IF )" >> $cmake_file + fi + #echo "set ( PDCP_SPLIT_NO_UE True )" >> $cmake_file echo "set ( PRINT_STATS $PRINT_STATS )" >> $cmake_file echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file @@ -600,7 +702,7 @@ function main() { [ "$CLEAN" = "1" ] && rm -rf $DIR/$oaisim_build_dir/build mkdir -p $DIR/$oaisim_build_dir/build cd $DIR/$oaisim_build_dir/build - cmake .. + eval $CMAKE_CMD compilations \ $oaisim_build_dir $oaisim_exec \ $oaisim_exec $dbin/$oaisim_exec.$REL @@ -611,7 +713,7 @@ function main() { echo_info "Compiling at_nas_ue" mkdir -p $DIR/at_commands/build cd $DIR/at_commands/build - cmake .. + eval $CMAKE_CMD compilations \ at_commands at_nas_ue \ at_nas_ue $dbin/at_nas_ue @@ -625,17 +727,20 @@ function main() { [ "$CLEAN" = "1" ] && rm -rf $DIR/nas_sim_tools/build mkdir -p $DIR/nas_sim_tools/build cd $DIR/nas_sim_tools/build - cmake .. + eval $CMAKE_CMD compilations \ nas_sim_tools usim \ usim $dbin/usim compilations \ nas_sim_tools nvram \ nvram $dbin/nvram + compilations \ + nas_sim_tools conf2uedata \ + conf2uedata $dbin/conf2uedata # generate USIM data - if [ -f $dbin/nvram ]; then - install_nas_tools $dbin $dconf + if [ -f $dbin/conf2uedata ]; then + install_nas_tools $conf_nvram_path $gen_nvram_path else echo_warning "not generated UE NAS files: binaries not found" fi @@ -651,15 +756,27 @@ function main() { CMakeFiles/nasmesh/nasmesh.ko $dbin/nasmesh.ko #oai_nw_drv - compilations \ - $oaisim_build_dir oai_nw_drv \ - CMakeFiles/oai_nw_drv/oai_nw_drv.ko $dbin/oai_nw_drv.ko + #compilations \ + # $oaisim_build_dir oai_nw_drv \ + # CMakeFiles/oai_nw_drv/oai_nw_drv.ko $dbin/oai_nw_drv.ko fi + if [ "$TP" == "ETHERNET" ] ; then + compilations \ + $oaisim_build_dir oai_eth_transpro \ + liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL + ln -sf liboai_eth_transpro.so liboai_transpro.so + ln -sf $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so + echo_info "liboai_transpro.so is linked with ETHERNET library" + fi + cmake_file=$DIR/oaisim_mme_build_oai/CMakeLists.txt cp $DIR/oaisim_mme_build_oai/CMakeLists.template $cmake_file echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file echo "set ( XFORMS $XFORMS )" >> $cmake_file + if [ "$FLEXRAN_AGENT" = "1" ] ; then + echo "set ( FLEXRAN_AGENT_SB_IF $FLEXRAN_AGENT_SB_IF )" >> $cmake_file + fi echo "set ( RRC_ASN1_VERSION \"${REL}\")" >> $cmake_file echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file echo "set ( T_TRACER $T_TRACER )" >> $cmake_file @@ -667,75 +784,55 @@ function main() { #[ "$CLEAN" = "1" ] && rm -rf $DIR/oaisim_mme_build_oai/build #mkdir -p $DIR/oaisim_mme_build_oai/build #cd $DIR/oaisim_mme_build_oai/build - #cmake .. + #eval $CMAKE_CMD #compilations \ # oaisim_mme_build_oai oaisim_mme \ # oaisim_mme $dbin/oaisim_mme.$REL fi - # RRH compilation + # Telnet server compilation ##################### - if [ "$RRH" = "1" ] ; then + if [ "$BUILD_TELNETSRV" = "1" ] ; then - rrh_exec=rrh_gw - rrh_build_dir=rrh_gw - - echo_info "Compiling $rrh_exec ..." + telnetsrv_build_dir=telnetsrv + mkdir -p $DIR/$telnetsrv_build_dir/build + cd $DIR/$telnetsrv_build_dir/build + echo_info "Compiling telnet server library ..." - [ "$CLEAN" = "1" ] && rm -rf $DIR/rrh_gw/build - mkdir -p $DIR/$rrh_build_dir/build - cmake_file=$DIR/$rrh_build_dir/CMakeLists.txt - echo "cmake_minimum_required(VERSION 2.8)" > $cmake_file - echo "set ( CMAKE_BUILD_TYPE $CMAKE_BUILD_TYPE )" >> $cmake_file - echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )" >> $cmake_file - echo "set ( ENABLE_ITTI False )" >> $cmake_file - echo "set ( RF_BOARD \"${HW}\")" >> $cmake_file - echo "set ( TRANSP_PRO \"${TP}\")" >> $cmake_file - echo 'set ( PACKAGE_NAME "\"rrh_gw\"")' >> $cmake_file - echo "set ( DEADLINE_SCHEDULER \"${DEADLINE_SCHEDULER_FLAG_USER}\" )" >>$cmake_file - echo "set ( CPU_AFFINITY \"${CPU_AFFINITY_FLAG_USER}\" )" >>$cmake_file - echo "set ( T_TRACER $T_TRACER )" >> $cmake_file - echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file - cd $DIR/$rrh_build_dir/build - cmake .. - compilations \ - rrh_gw rrh_gw \ - rrh_gw $dbin/rrh_gw + [ "$CLEAN" = "1" ] && rm -rf $DIR/$telnetsrv_build_dir + cmake_file=$OPENAIR_DIR/common/utils/$telnetsrv_build_dir/CMakeLists.txt + cd $DIR/$telnetsrv_build_dir/build + eval "$CMAKE_CMD $OPENAIR_DIR/common/utils/$telnetsrv_build_dir/" + make - fi - + fi # build RF device and transport protocol libraries ##################################### - if [ "$eNB" = "1" -o "$RRH" = "1" ] ; then + if [ "$eNB" = "1" -o "$UE" = "1" ] ; then - if [ "$eNB" = "1" ] ; then - build_dir=$lte_build_dir - else - build_dir=$rrh_build_dir - fi + build_dir=$lte_build_dir - # build RF device libraries (currently EXMIMO is not complied with the rest of HW targets) + # build RF device libraries if [ "$HW" != "None" ] ; then rm -f liboai_device.so rm -f $dbin/liboai_device.so - # link liboai_device.so with the selected RF device library if [ "$HW" == "EXMIMO" ] ; then - - #add exmimo compilation - #TODO EXMIMO library support - + compilations \ + $build_dir oai_exmimodevif \ + liboai_exmimodevif.so $dbin/liboai_exmimodevif.so.$REL + + ln -sf liboai_exmimodevif.so liboai_device.so + ln -sf $dbin/liboai_exmimodevif.so.$REL $dbin/liboai_device.so echo_info "liboai_device.so is linked to EXMIMO device library" elif [ "$HW" == "OAI_USRP" ] ; then - if [ -d "/usr/include/uhd" ] ; then - compilations \ - $build_dir oai_usrpdevif \ - liboai_usrpdevif.so $dbin/liboai_usrpdevif.so.$REL - fi + compilations \ + $build_dir oai_usrpdevif \ + liboai_usrpdevif.so $dbin/liboai_usrpdevif.so.$REL - ln -s liboai_usrpdevif.so liboai_device.so - ln -s $dbin/liboai_usrpdevif.so.$REL $dbin/liboai_device.so + ln -sf liboai_usrpdevif.so liboai_device.so + ln -sf $dbin/liboai_usrpdevif.so.$REL $dbin/liboai_device.so echo_info "liboai_device.so is linked to USRP device library" elif [ "$HW" == "OAI_BLADERF" ] ; then if [ -f "/usr/include/libbladeRF.h" ] ; then @@ -744,8 +841,8 @@ function main() { liboai_bladerfdevif.so $dbin/liboai_bladerfdevif.so.$REL fi - ln -s liboai_bladerfdevif.so liboai_device.so - ln -s $dbin/liboai_bladerfdevif.so.$REL $dbin/liboai_device.so + ln -sf liboai_bladerfdevif.so liboai_device.so + ln -sf $dbin/liboai_bladerfdevif.so.$REL $dbin/liboai_device.so echo_info "liboai_device.so is linked to BLADERF device library" elif [ "$HW" == "OAI_LMSSDR" ] ; then # if [ -f "/usr/include/libbladeRF.h" ] ; then @@ -754,8 +851,8 @@ function main() { liboai_lmssdrdevif.so $dbin/liboai_lmssdrdevif.so.$REL # fi - ln -s liboai_lmssdrdevif.so liboai_device.so - ln -s $dbin/liboai_lmssdrdevif.so.$REL $dbin/liboai_device.so + ln -sf liboai_lmssdrdevif.so liboai_device.so + ln -sf $dbin/liboai_lmssdrdevif.so.$REL $dbin/liboai_device.so echo_info "liboai_device.so is linked to LMSSDR device library" else echo_info "liboai_device.so is not linked to any device library" @@ -771,8 +868,8 @@ function main() { compilations \ $build_dir oai_eth_transpro \ liboai_eth_transpro.so $dbin/liboai_eth_transpro.so.$REL - ln -s liboai_eth_transpro.so liboai_transpro.so - ln -s $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so + ln -sf liboai_eth_transpro.so liboai_transpro.so + ln -sf $dbin/liboai_eth_transpro.so.$REL $dbin/liboai_transpro.so echo_info "liboai_transpro.so is linked with ETHERNET library" fi fi @@ -790,7 +887,7 @@ fi [ "$CLEAN" = "1" ] && rm -rf $OPENAIR_DIR/cmake_targets/doxygen/build mkdir -p $OPENAIR_DIR/cmake_targets/doxygen/build cd $OPENAIR_DIR/cmake_targets/doxygen/build - cmake .. + eval $CMAKE_CMD make doc ) >& $doxygen_log fi diff --git a/cmake_targets/build_ue b/cmake_targets/build_ue new file mode 100644 index 0000000000..9d9ca839d1 --- /dev/null +++ b/cmake_targets/build_ue @@ -0,0 +1,6 @@ +#!/bin/bash +#sudo ./build_oai -c -C -I --install-optional-packages --install-system-files --UE -w USRP -V +#sudo ./build_oai -c -C -I --install-optional-packages --UE -w USRP -V +#sudo ./build_oai -c -C --UE -w USRP -V +sudo ./build_oai -c -C --UE -w USRP +#sudo ./build_oai -c -C --UE -w USRP --build-eclipse diff --git a/cmake_targets/epc_test/CMakeLists.template b/cmake_targets/epc_test/CMakeLists.template index 76defbc7d7..e046bb7539 100644 --- a/cmake_targets/epc_test/CMakeLists.template +++ b/cmake_targets/epc_test/CMakeLists.template @@ -2,17 +2,13 @@ cmake_minimum_required(VERSION 2.8) set ( CMAKE_BUILD_TYPE "RelWithDebInfo" ) set ( ASN_DEBUG False) -set ( ADDR_CONF False ) set ( DEBUG_OMG False ) set ( DISABLE_XER_PRINT False ) set ( DRIVER2013 True ) -set ( EMOS False ) set ( EMIT_ASN_DEBUG False ) -set ( ENABLE_FXP True ) set ( ENABLE_ITTI True ) set ( ENABLE_NAS_UE_LOGGING True ) set ( ENABLE_NEW_MULTICAST True ) -set ( ENABLE_PGM_TRANSPORT True ) set ( ENABLE_SECURITY True ) set ( ENABLE_STANDALONE_EPC False) set ( ENABLE_USE_CPU_EXECUTION_TIME True ) @@ -21,7 +17,6 @@ set ( ENABLE_USE_RAW_SOCKET_FOR_SGI True) set ( ENABLE_VCD_FIFO False ) set ( ENB_MODE True ) set ( EXMIMO_IOT True ) -set ( HARD_RT False ) set ( JUMBO_FRAME True ) set ( LARGE_SCALE False ) set ( LINK_ENB_PDCP_TO_GTPV1U True) @@ -33,7 +28,6 @@ set ( DEADLINE_SCHEDULER False ) set ( MAC_CONTEXT 1 ) set ( MAX_NUM_CCs 1 ) set ( MESSAGE_CHART_GENERATOR False) -set ( MIH_C_MEDIEVAL_EXTENSIONS False ) set ( MSG_PRINT False ) set ( MU_RECEIVER False ) set ( NAS_ADDRESS_FIX False ) @@ -42,38 +36,25 @@ set ( NAS_MME False ) set ( NAS_UE True ) set ( NB_ANTENNAS_RX "2" ) set ( NB_ANTENNAS_TX "2" ) -set ( NB_ANTENNAS_TXRX "2" ) -set ( NEW_FFT True ) set ( NO_RRM True ) -set ( OAI_EMU False ) set ( OAISIM False ) set ( OAI_NW_DRIVER_TYPE_ETHERNET False ) set ( OAI_NW_DRIVER_USE_NETLINK True ) -set ( OPENAIR1 True ) set ( OPENAIR2 True ) set ( OPENAIR_LTE True ) set ( PACKAGE_NAME "epc_test" ) -set ( PBS_SIM False ) set ( PDCP_USE_NETLINK True ) -set ( PC_DSP True ) -set ( PC_TARGET True ) set ( PDCP_MSG_PRINT False ) -set ( PERFECT_CE False ) -set ( PHY_ABSTRACTION True ) set ( PHY_CONTEXT False ) set ( PHY_EMUL False ) set ( PHYSIM True ) -set ( PUCCH True ) -set ( RANDOM_BF False ) set ( RF_BOARD "False" ) set ( RLC_STOP_ON_LOST_PDU False ) set ( RRC_ASN1_VERSION "Rel10" ) set ( RRC_DEFAULT_RAB_IS_AM True) set ( RRC_MSG_PRINT False ) -set ( RTAI False ) set ( SECU False ) set ( SMBV False ) set ( TEST_OMG False ) set ( USE_MME "R10" ) -set ( USER_MODE True ) set ( XER_PRINT True ) diff --git a/cmake_targets/lte-simulators/CMakeLists.txt b/cmake_targets/lte-simulators/CMakeLists.txt index 0b706c8748..ca754449d7 100644 --- a/cmake_targets/lte-simulators/CMakeLists.txt +++ b/cmake_targets/lte-simulators/CMakeLists.txt @@ -3,12 +3,9 @@ set(PACKAGE_NAME "unitary_tests_simulators") set(PHYSIM True) set(RF_BOARD None) set(XFORMS True) - +set(ENABLE_ITTI False) set(DEBUG_PHY False) set(MU_RECIEVER False) -set(RANDOM_BF False) -set(PBS_SIM False) -set(PERFECT_CE False) set(NAS_UE False) set(MESSAGE_CHART_GENERATOR False) diff --git a/cmake_targets/nas_sim_tools/CMakeLists.txt b/cmake_targets/nas_sim_tools/CMakeLists.txt index 732ede3f94..81e3fe4b3c 100644 --- a/cmake_targets/nas_sim_tools/CMakeLists.txt +++ b/cmake_targets/nas_sim_tools/CMakeLists.txt @@ -2,70 +2,89 @@ cmake_minimum_required(VERSION 2.8) project(NAS_SIM_TOOLS) +include(FindPkgConfig) +pkg_search_module(CONFIG libconfig REQUIRED) +include_directories(${CONFIG_INCLUDE_DIRS}) +add_definitions(-std=gnu99) ENABLE_LANGUAGE(C) -#Sends the -std=c99 flag to the gcc compiler -add_definitions(-std=c99) -add_definitions(-DNAS_UE) + +set(CMAKE_C_FLAGS + "${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -Werror -Wall -Wstrict-prototypes -Wno-packed-bitfield-compat -g") set(OPENAIR_DIR $ENV{OPENAIR_DIR}) -set(OPENAIR1_DIR $ENV{OPENAIR_DIR}/openair1) -set(OPENAIR2_DIR $ENV{OPENAIR_DIR}/openair2) set(OPENAIR3_DIR $ENV{OPENAIR_DIR}/openair3) -set(OPENAIR3_DIR $ENV{OPENAIR_DIR}/openair3) -set(OPENAIR_TARGETS $ENV{OPENAIR_DIR}/targets) -#set(EXECUTABLE_OUTPUT_PATH ${OPENAIR_DIR}/targets/bin) - - -# Add .h files for dependancies -set(usim_SRC - ${OPENAIR_DIR}/openair3/NAS/TOOLS/usim_data.c +set(CONF2UEDATA_LIB_SRC + ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_emm.c + ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_user_data.c + ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_usim.c + ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_network.c + ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_user_plmn.c + ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_parser.c + ${OPENAIR_DIR}/openair3/NAS/TOOLS/fs.c + ${OPENAIR_DIR}/openair3/NAS/TOOLS/display.c ${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/usim_api.c ${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/aka_functions.c ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/memory.c ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/nas_log.c ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/OctetString.c ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/TLVEncoder.c + ${OPENAIR_DIR}/common/utils/utils.c ) -set(usim_HDR - ${OPENAIR_DIR}/openair3/NAS/TOOLS/network.h + +set(conf2uedata_HDR + ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf2uedata.h + ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_emm.h ${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/usim_api.h ${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/aka_functions.h ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/memory.h ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/nas_log.h ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/OctetString.h ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/TLVEncoder.h + ${OPENAIR_DIR}/common/utils/utils.h ) + include_directories( + ${OPENAIR_DIR}/common/utils + ${OPENAIR_DIR}/openair3/NAS/UE ${OPENAIR_DIR}/openair3/NAS/COMMON + ${OPENAIR_DIR}/openair3/NAS/UE/API/USER ${OPENAIR_DIR}/openair3/NAS/UE/API/USIM ${OPENAIR_DIR}/openair3/NAS/UE/EMM/ ${OPENAIR_DIR}/openair3/NAS/UE/ESM/ ${OPENAIR_DIR}/openair3/NAS/COMMON/IES/ ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL ) -ADD_EXECUTABLE(usim ${usim_SRC} ${usim_HDR}) + +# conf2uedata binary + +set(conf2uedata_SRC + ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf2uedata.c + ${CONF2UEDATA_LIB_SRC} +) + +add_executable(conf2uedata ${conf2uedata_SRC} ${conf2uedata_HDR} ) +target_link_libraries(conf2uedata ${CONFIG_LIBRARIES}) + +# usim binary + +set(usim_SRC + ${OPENAIR_DIR}/openair3/NAS/TOOLS/usim.c + ${CONF2UEDATA_LIB_SRC} +) +add_executable(usim ${usim_SRC} ${conf2uedata_HDR} ) +target_link_libraries(usim ${CONFIG_LIBRARIES}) +# nvram binary set(nvram_SRC - ${OPENAIR_DIR}/openair3/NAS/TOOLS/ue_data.c - ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/memory.c - ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/nas_log.c + ${OPENAIR_DIR}/openair3/NAS/TOOLS/nvram.c + ${CONF2UEDATA_LIB_SRC} ) -set(nvram_HDR - ${OPENAIR_DIR}/openair3/NAS/UE/EMM/emmData.h - ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/memory.h - ${OPENAIR_DIR}/openair3/NAS/COMMON/userDef.h -) -ADD_EXECUTABLE(nvram ${nvram_SRC} ${nvram_HDR}) - -#install (TARGETS usim DESTINATION ${EXECUTABLE_OUTPUT_PATH}) -#install (TARGETS nvram DESTINATION ${EXECUTABLE_OUTPUT_PATH}) - -#install(CODE "EXECUTE_PROCESS (COMMAND ${OPENAIR_TARGETS}/bin/nvram --gen WORKING_DIRECTORY ${OPENAIR_TARGETS}/bin)") -#install(CODE "EXECUTE_PROCESS (COMMAND ${OPENAIR_TARGETS}/bin/usim --gen WORKING_DIRECTORY ${OPENAIR_TARGETS}/bin)") +add_executable(nvram ${nvram_SRC} ${conf2uedata_HDR} ) +target_link_libraries(nvram ${CONFIG_LIBRARIES}) diff --git a/cmake_targets/oaisim_build_oai/CMakeLists.template b/cmake_targets/oaisim_build_oai/CMakeLists.template index 0a05d68d10..22faac75b5 100644 --- a/cmake_targets/oaisim_build_oai/CMakeLists.template +++ b/cmake_targets/oaisim_build_oai/CMakeLists.template @@ -1,16 +1,12 @@ cmake_minimum_required(VERSION 2.8) set ( CMAKE_BUILD_TYPE "RelWithDebInfo" ) -set ( ADDR_CONF False ) set ( DEBUG_OMG False ) set ( DISABLE_XER_PRINT False ) set ( DRIVER2013 True ) -set ( EMOS False ) -set ( ENABLE_FXP True ) set ( ENABLE_ITTI True ) set ( ENABLE_NAS_UE_LOGGING True ) set ( ENABLE_NEW_MULTICAST True ) -set ( ENABLE_PGM_TRANSPORT True ) set ( ENABLE_RAL False ) set ( ENABLE_SECURITY True ) set ( ENABLE_STANDALONE_EPC False) @@ -20,7 +16,6 @@ set ( ENABLE_USE_RAW_SOCKET_FOR_SGI True) set ( ENABLE_VCD_FIFO False ) set ( ENB_MODE True ) set ( EXMIMO_IOT True ) -set ( HARD_RT False ) set ( JUMBO_FRAME True ) set ( LARGE_SCALE False ) set ( LINK_ENB_PDCP_TO_GTPV1U True) @@ -32,7 +27,6 @@ set ( DEADLINE_SCHEDULER False ) set ( MAC_CONTEXT 1 ) set ( MAX_NUM_CCs 1 ) set ( MESSAGE_CHART_GENERATOR False) -set ( MIH_C_MEDIEVAL_EXTENSIONS False ) set ( MSG_PRINT False ) set ( MU_RECEIVER False ) set ( NAS_ADDRESS_FIX False ) @@ -41,40 +35,26 @@ set ( NAS_MME False ) set ( NAS_UE True ) set ( NB_ANTENNAS_RX "2" ) set ( NB_ANTENNAS_TX "2" ) -set ( NB_ANTENNAS_TXRX "2" ) -set ( NEW_FFT True ) set ( NO_RRM True ) -set ( OAI_EMU True ) set ( OAISIM True ) set ( OAI_NW_DRIVER_TYPE_ETHERNET False ) set ( OAI_NW_DRIVER_USE_NETLINK True ) -set ( OPENAIR1 True ) set ( OPENAIR2 True ) set ( OPENAIR_LTE True ) set ( PACKAGE_NAME "oaisim" ) -set ( PBS_SIM False ) set ( PDCP_USE_NETLINK True ) -set ( PC_DSP True ) -set ( PC_TARGET True ) set ( PDCP_MSG_PRINT False ) -set ( PERFECT_CE False ) -set ( PHY_ABSTRACTION True ) set ( PHY_CONTEXT False ) set ( PHY_EMUL False ) set ( PHYSIM True ) -set ( PUCCH True ) -set ( RANDOM_BF False ) set ( RF_BOARD "False" ) set ( RLC_STOP_ON_LOST_PDU False ) set ( RRC_ASN1_VERSION "Rel10" ) set ( RRC_DEFAULT_RAB_IS_AM True) set ( RRC_MSG_PRINT False ) -set ( RTAI False ) set ( SECU False ) set ( SMBV False ) -set ( SPECTRA False ) set ( TEST_OMG False ) set ( USE_3GPP_ADDR_AS_LINK_ADDR False ) set ( USE_MME "R10" ) -set ( USER_MODE True ) set ( XER_PRINT False ) diff --git a/cmake_targets/oaisim_mme_build_oai/CMakeLists.template b/cmake_targets/oaisim_mme_build_oai/CMakeLists.template index 69fa209b16..b18b23ee9a 100644 --- a/cmake_targets/oaisim_mme_build_oai/CMakeLists.template +++ b/cmake_targets/oaisim_mme_build_oai/CMakeLists.template @@ -1,16 +1,12 @@ cmake_minimum_required(VERSION 2.8) set ( CMAKE_BUILD_TYPE "RelWithDebInfo" ) -set ( ADDR_CONF False ) set ( DEBUG_OMG False ) set ( DISABLE_XER_PRINT False ) set ( DRIVER2013 False ) -set ( EMOS False ) -set ( ENABLE_FXP False ) set ( ENABLE_ITTI True ) set ( ENABLE_NAS_UE_LOGGING False ) set ( ENABLE_NEW_MULTICAST False ) -set ( ENABLE_PGM_TRANSPORT False ) set ( ENABLE_RAL False ) set ( ENABLE_SECURITY False ) set ( ENABLE_STANDALONE_EPC False ) @@ -21,7 +17,6 @@ set ( ENABLE_VCD_FIFO False ) set ( ENB_MODE False ) set ( EPC_BUILD True ) set ( EXMIMO_IOT False ) -set ( HARD_RT False ) set ( JUMBO_FRAME False ) set ( LARGE_SCALE False ) set ( LINK_ENB_PDCP_TO_GTPV1U True) @@ -32,7 +27,6 @@ set ( LOG_NO_THREAD False ) set ( DEADLINE_SCHEDULER False ) set ( MAC_CONTEXT 1 ) set ( MAX_NUM_CCs 1 ) -set ( MIH_C_MEDIEVAL_EXTENSIONS False ) set ( MSG_PRINT False ) set ( MU_RECEIVER False ) set ( NAS_ADDRESS_FIX False ) @@ -42,42 +36,27 @@ set ( NAS_NETLINK False ) set ( NAS_UE False ) set ( NB_ANTENNAS_RX "2" ) set ( NB_ANTENNAS_TX "2" ) -set ( NB_ANTENNAS_TXRX "2" ) -set ( NEW_FFT False ) set ( NO_RRM False ) -set ( OAI_EMU False ) set ( OAISIM False ) set ( OAI_NW_DRIVER_TYPE_ETHERNET False ) set ( OAI_NW_DRIVER_USE_NETLINK False ) -set ( OPENAIR1 False ) set ( OPENAIR2 False ) -set ( OPENAIR_EMU False ) set ( OPENAIR_LTE False ) set ( PACKAGE_NAME "EPC" ) -set ( PBS_SIM False ) -set ( PC_DSP False ) -set ( PC_TARGET False ) set ( PDCP_MSG_PRINT False ) -set ( PERFECT_CE False ) -set ( PHY_ABSTRACTION False ) set ( PHY_CONTEXT False ) set ( PHY_EMUL False ) set ( PHYSIM False ) -set ( PUCCH False ) -set ( RANDOM_BF False ) set ( RF_BOARD "False" ) set ( RRC_ASN1_VERSION "Rel10" ) set ( RLC_STOP_ON_LOST_PDU False ) set ( RRC_MSG_PRINT False ) -set ( RTAI False ) set ( SECU False ) set ( SMBV False ) -set ( SPECTRA False ) set ( TEST_OMG False ) set ( UPDATE_RELEASE_9 True) set ( UPDATE_RELEASE_10 True) set ( USE_3GPP_ADDR_AS_LINK_ADDR False ) set ( USE_MME "R10" ) -set ( USER_MODE True ) set ( XER_PRINT False ) set ( XFORMS False ) diff --git a/cmake_targets/oaisim_noS1_build_oai/CMakeLists.template b/cmake_targets/oaisim_noS1_build_oai/CMakeLists.template index 6d8fc6d26a..e0f100ca0a 100644 --- a/cmake_targets/oaisim_noS1_build_oai/CMakeLists.template +++ b/cmake_targets/oaisim_noS1_build_oai/CMakeLists.template @@ -1,16 +1,11 @@ cmake_minimum_required(VERSION 2.8) -set ( CMAKE_BUILD_TYPE "RelWithDebInfo" ) -set ( ADDR_CONF False ) set ( DEBUG_OMG False ) set ( DISABLE_XER_PRINT False ) set ( DRIVER2013 True ) -set ( EMOS False ) -set ( ENABLE_FXP True ) set ( ENABLE_ITTI True ) set ( ENABLE_NAS_UE_LOGGING False ) set ( ENABLE_NEW_MULTICAST True ) -set ( ENABLE_PGM_TRANSPORT True ) set ( ENABLE_RAL False ) set ( ENABLE_SECURITY False ) set ( ENABLE_STANDALONE_EPC False) @@ -20,7 +15,6 @@ set ( ENABLE_USE_RAW_SOCKET_FOR_SGI False) set ( ENABLE_VCD_FIFO False ) set ( ENB_MODE True ) set ( EXMIMO_IOT True ) -set ( HARD_RT False ) set ( JUMBO_FRAME True ) set ( LARGE_SCALE False ) set ( LINK_ENB_PDCP_TO_GTPV1U False) @@ -34,7 +28,6 @@ set ( MAX_NUM_CCs 1 ) set ( MESSAGE_CHART_GENERATOR False ) set ( MESSAGE_CHART_GENERATOR_RLC_MAC False ) set ( MESSAGE_CHART_GENERATOR_PHY False ) -set ( MIH_C_MEDIEVAL_EXTENSIONS False ) set ( MSG_PRINT False ) set ( MU_RECEIVER False ) set ( NAS_ADDRESS_FIX True ) @@ -43,42 +36,27 @@ set ( NAS_MME False ) set ( NAS_UE False ) set ( NB_ANTENNAS_RX "2" ) set ( NB_ANTENNAS_TX "2" ) -set ( NB_ANTENNAS_TXRX "2" ) -set ( NEW_FFT True ) set ( NO_RRM True ) -set ( OAI_EMU True ) set ( OAISIM True ) -set ( OAI_NW_DRIVER_TYPE_ETHERNET True ) +set ( OAI_NW_DRIVER_TYPE_ETHERNET False ) set ( OAI_NW_DRIVER_USE_NETLINK True ) -set ( OPENAIR1 True ) set ( OPENAIR2 True ) -set ( OPENAIR_EMU False ) set ( OPENAIR_LTE True ) set ( PACKAGE_NAME "oaisim" ) -set ( PBS_SIM False ) set ( PDCP_USE_NETLINK True ) -set ( PC_DSP True ) -set ( PC_TARGET True ) set ( PDCP_MSG_PRINT False ) -set ( PERFECT_CE False ) -set ( PHY_ABSTRACTION True ) set ( PHY_CONTEXT False ) set ( PHY_EMUL False ) set ( PHYSIM True ) -set ( PUCCH True ) -set ( RANDOM_BF False ) set ( RF_BOARD "False" ) set ( RRC_ASN1_VERSION "Rel10" ) set ( RLC_STOP_ON_LOST_PDU False ) set ( RRC_MSG_PRINT False ) -set ( RTAI False ) set ( SECU False ) set ( SMBV False ) -set ( SPECTRA False ) set ( TEST_OMG False ) set ( USE_3GPP_ADDR_AS_LINK_ADDR False ) set ( USE_MME "R10" ) -set ( USER_MODE True ) set ( XER_PRINT False ) set ( DEBUG_PHY False ) set ( DEBUG_PHY_PROC False) diff --git a/cmake_targets/s1c_mme_test/CMakeLists.template b/cmake_targets/s1c_mme_test/CMakeLists.template index 994edf8352..9f1ff3e360 100644 --- a/cmake_targets/s1c_mme_test/CMakeLists.template +++ b/cmake_targets/s1c_mme_test/CMakeLists.template @@ -1,17 +1,13 @@ cmake_minimum_required(VERSION 2.8) set ( CMAKE_BUILD_TYPE "RelWithDebInfo" ) -set ( ADDR_CONF False ) set ( DEBUG_OMG False ) set ( DISABLE_XER_PRINT False ) set ( DRIVER2013 True ) -set ( EMOS False ) -set ( ENABLE_FXP True ) set ( ENABLE_ITTI True ) set ( ENABLE_NAS_UE_LOGGING True ) set ( ENABLE_NEW_MULTICAST True ) set ( ENABLE_PDCP_NETLINK_FIFO False ) -set ( ENABLE_PGM_TRANSPORT True ) set ( ENABLE_RAL False ) set ( ENABLE_SECURITY True ) set ( ENABLE_STANDALONE_EPC False) @@ -21,7 +17,6 @@ set ( ENABLE_USE_RAW_SOCKET_FOR_SGI True) set ( ENABLE_VCD_FIFO False ) set ( ENB_MODE True ) set ( EXMIMO_IOT True ) -set ( HARD_RT False ) set ( JUMBO_FRAME True ) set ( LARGE_SCALE False ) set ( LINK_ENB_PDCP_TO_GTPV1U True) @@ -33,7 +28,6 @@ set ( DEADLINE_SCHEDULER False ) set ( MAC_CONTEXT 1 ) set ( MAX_NUM_CCs 1 ) set ( MESSAGE_CHART_GENERATOR False) -set ( MIH_C_MEDIEVAL_EXTENSIONS False ) set ( MSG_PRINT False ) set ( MU_RECEIVER False ) set ( NAS_ADDRESS_FIX False ) @@ -42,44 +36,30 @@ set ( NAS_MME False ) set ( NAS_UE True ) set ( NB_ANTENNAS_RX "2" ) set ( NB_ANTENNAS_TX "2" ) -set ( NB_ANTENNAS_TXRX "2" ) -set ( NEW_FFT True ) set ( NO_RRM True ) -set ( OAI_EMU True ) set ( OAISIM True ) set ( OAI_NW_DRIVER_TYPE_ETHERNET False ) set ( OAI_NW_DRIVER_USE_NETLINK True ) -set ( OPENAIR1 True ) set ( OPENAIR2 True ) set ( OPENAIR_LTE True ) set ( PACKAGE_NAME "oaisim" ) -set ( PBS_SIM False ) set ( PDCP_USE_NETLINK True ) -set ( PC_DSP True ) -set ( PC_TARGET True ) set ( PDCP_MSG_PRINT False ) -set ( PERFECT_CE False ) -set ( PHY_ABSTRACTION True ) set ( PHY_CONTEXT False ) set ( PHY_EMUL False ) set ( PHYSIM True ) -set ( PUCCH True ) -set ( RANDOM_BF False ) set ( RF_BOARD "False" ) set ( RLC_STOP_ON_LOST_PDU False ) set ( RRC_ASN1_VERSION "Rel10" ) set ( RRC_DEFAULT_RAB_IS_AM True) set ( RRC_MSG_PRINT False ) -set ( RTAI False ) set ( SECU False ) set ( SMBV False ) -set ( SPECTRA False ) set ( TEST_OMG False ) set ( TEST_S1C_MME True ) set ( USE_3GPP_ADDR_AS_LINK_ADDR False ) set ( USE_MME "R10" ) -set ( USER_MODE True ) set ( XER_PRINT False ) set ( XFORMS False ) diff --git a/cmake_targets/snap_environment.sh b/cmake_targets/snap_environment.sh new file mode 100755 index 0000000000..1c0725d8b5 --- /dev/null +++ b/cmake_targets/snap_environment.sh @@ -0,0 +1,3 @@ +#!/bin/sh +export UHD_IMAGES_DIR=$SNAP/uhd_images +exec $@ diff --git a/cmake_targets/tools/asn1tostruct.py b/cmake_targets/tools/asn1tostruct.py index c298e8ae87..8c0f7e8a16 100644 --- a/cmake_targets/tools/asn1tostruct.py +++ b/cmake_targets/tools/asn1tostruct.py @@ -33,35 +33,26 @@ def printDebug(string): def outputHeaderToFile(f, filename): now = datetime.datetime.now() - f.write("""/******************************************************************************* - - Eurecom OpenAirInterface - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fr/openairinterface - Address : EURECOM, Campus SophiaTech, 450 Route des Chappes - 06410 Biot FRANCE - -*******************************************************************************/ + f.write("""/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ """) f.write("/*******************************************************************************\n") diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index 284ec1e1a9..1ea97c030f 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -1,38 +1,45 @@ - ################################################################################ -# -# Copyright (c) 2015, EURECOM (www.eurecom.fr) -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# The views and conclusions contained in the software and documentation are those -# of the authors and should not be interpreted as representing official policies, -# either expressed or implied, of the FreeBSD Project. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file build_helper # brief # authors Laurent Thomas, Lionel GAUTHIER # ####################################### +if [ ! -f /etc/os-release ]; then + echo "No /etc/os-release file found. You're likely on an unsupported distro." + exit -1 +fi +OS_DISTRO=$(grep "^ID=" /etc/os-release | sed "s/ID=//" | sed "s/\"//g") +OS_RELEASE=$(grep "^VERSION_ID=" /etc/os-release | sed "s/VERSION_ID=//" | sed "s/\"//g") +case "$OS_DISTRO" in + fedora) OS_BASEDISTRO="fedora"; INSTALLER="dnf"; CMAKE="cmake" ;; + rhel) OS_BASEDISTRO="fedora"; INSTALLER="yum"; CMAKE="cmake3" ;; + centos) OS_BASEDISTRO="fedora"; INSTALLER="yum"; CMAKE="cmake3" ;; + debian) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;; + ubuntu) OS_BASEDISTRO="debian"; INSTALLER="apt-get"; CMAKE="cmake" ;; +esac +KERNEL_VERSION=$(uname -r | cut -d '.' -f1) +KERNEL_MAJOR=$(uname -r | cut -d '.' -f2) + SUDO='sudo -E' ############################### @@ -75,12 +82,11 @@ echo_info() { cecho "$*" $blue ;} # If we can't check the distribution, it returns "Unknown" # This function return always true as exit code by design # Examples: -# Ubuntu16.04 -# Debian8.5 +# ubuntu16.04 +# debian8.5 get_distribution_release() { - local distributor - if distributor=$(lsb_release -si 2>/dev/null) ; then - echo $distributor$(lsb_release -sr) + if [[ ! -z "$OS_DISTRO$OS_RELEASE" ]]; then + echo "$OS_DISTRO$OS_RELEASE" else echo Unknown fi @@ -89,8 +95,13 @@ get_distribution_release() { check_supported_distribution() { local distribution=$(get_distribution_release) case "$distribution" in - "Ubuntu16.04") return 0 ;; - "Ubuntu14.04") return 0 ;; + "ubuntu17.10") return 0 ;; + "ubuntu17.04") return 0 ;; + "ubuntu16.04") return 0 ;; + "ubuntu14.04") return 0 ;; + "fedora24") return 0 ;; + "rhel7") return 0 ;; + "centos7") return 0 ;; esac return 1 } @@ -145,6 +156,20 @@ clean_all_files() { # Compilers ################################### +#check_warnings: +# print error message if the compilation had warnings +#argument: +# $1: log file +check_warnings() { + #we look for 'warning:' in the compilation log file + #this is how gcc starts a warning + #this is not perfect, we may get false positive + warning_count=`grep "warning:" "$1"|wc -l` + if [ $warning_count -gt 0 ]; then + echo_error "WARNING: $warning_count warnings. See $1" + fi +} + compilations() { cd $OPENAIR_DIR/cmake_targets/$1/build set +e @@ -162,6 +187,7 @@ compilations() { if [ -s $3 ] ; then cp $3 $4 echo_success "$2 compiled" + check_warnings "$dlog/$2.$REL.txt" else echo_error "$2 compilation failed" exit 1 @@ -172,87 +198,73 @@ compilations() { # External packages installers ############################################ -install_nettle_from_source() { - nettle_install_log=$OPENAIR_DIR/cmake_targets/log/nettle_install_log.txt - echo_info "\nInstalling Nettle. The log file for nettle installation is here: $nettle_install_log " - ( - cd /tmp - echo "Downloading nettle archive" - $SUDO rm -rf /tmp/nettle-2.5.tar.gz* /tmp/nettle-2.5 - wget https://ftp.gnu.org/gnu/nettle/nettle-2.5.tar.gz - if [ $? -ne 0 ]; then - wget ftp://ftp.lysator.liu.se/pub/security/lsh/nettle-2.5.tar.gz - fi - if [ ! -f nettle-2.5.tar.gz ]; then - echo_error "Could not download nettle source files" - cd - - return - fi - tar -xzf nettle-2.5.tar.gz - cd nettle-2.5/ - ./configure --disable-openssl --enable-shared --prefix=/usr - echo "Compiling nettle" - make -j`nproc` - make check - $SUDO make install - ) >& $nettle_install_log -} - -install_gnutls_from_source(){ - gnutls_install_log=$OPENAIR_DIR/cmake_targets/log/gnutls_install_log.txt - echo_info "\nInstalling Gnutls. The log file for Gnutls installation is here: $gnutls_install_log " - ( - cd /tmp - echo "Downloading gnutls archive" - $SUDO rm -rf /tmp/gnutls-3.1.23.tar.xz* /tmp/gnutls-3.1.23 - wget http://mirrors.dotsrc.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz || \ - wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.1/gnutls-3.1.23.tar.xz - if [ ! -f gnutls-3.1.23.tar.xz ]; then - echo_error "Could not download gnutls source files" - cd - - return - fi - tar -xJf gnutls-3.1.23.tar.xz - cd gnutls-3.1.23/ - ./configure --prefix=/usr - echo "Compiling gnutls" - make -j`nproc` - $SUDO make install - )>& $gnutls_install_log -} - install_protobuf_from_source(){ + protobuf_install_log=$OPENAIR_DIR/cmake_targets/log/protobuf_install_log.txt + echo_info "\nInstalling Google Protobuf from sources. The log file for Protobuf installation is here: $protobuf_install_log " + ( cd /tmp echo "Downloading protobuf" - rm -rf /tmp/protobuf-2.6.1.tar.gz* /tmp/protobuf-2.6.1 - wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz - tar -xzvf protobuf-2.6.1.tar.gz - cd protobuf-2.6.1/ + #rm -rf /tmp/protobuf-2.6.1.tar.gz* /tmp/protobuf-2.6.1 + #wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz + #tar -xzvf protobuf-2.6.1.tar.gz --owner $USER --group $USER --no-same-owner + #cd protobuf-2.6.1/ + rm -rf /tmp/protobuf-cpp-3.3.0.tar.gz* /tmp/protobuf-3.3.0 + wget https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz + tar -xzvf protobuf-cpp-3.3.0.tar.gz --owner $USER --group $USER --no-same-owner + cd protobuf-3.3.0/ ./configure echo "Compiling protobuf" make -j`nproc` $SUDO make install - rm -rf /tmp/protobuf-2.6.1.tar.gz /tmp/protobuf-2.6.1 $SUDO ldconfig + ) >& $protobuf_install_log } install_protobuf_c_from_source(){ + protobuf_c_install_log=$OPENAIR_DIR/cmake_targets/log/protobuf_c_install_log.txt + echo_info "\nInstalling Google Protobuf_C from sources. The log file for Protobuf_C installation is here: $protobuf_c_install_log " + ( + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then + export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig + fi cd /tmp echo "Downloading protobuf-c" rm -rf /tmp/protobuf-c git clone https://github.com/protobuf-c/protobuf-c.git cd protobuf-c + git checkout 2a46af42784abf86804d536f6e0122d47cfeea45 ./autogen.sh ./configure echo "Compiling protobuf-c" make -j`nproc` $SUDO make install - rm -rf /tmp/protobuf-c $SUDO ldconfig + ) >& $protobuf_c_install_log } +install_usrp_uhd_driver_from_source(){ + uhd_install_log=$OPENAIR_DIR/cmake_targets/log/uhd_install_log.txt + echo_info "\nInstalling UHD driver from sources. The log file for UHD driver installation is here: $uhd_install_log " + ( + cd /tmp + echo "Downloading UHD driver" + rm -rf /tmp/uhd + git clone git://github.com/EttusResearch/uhd.git + cd uhd + git checkout tags/release_003_010_001_001 + mkdir -p host/build + cd host/build + $CMAKE ../ + echo "Compiling UHD" + make + make test + $SUDO make install + $SUDO ldconfig + ) >& $uhd_install_log +} check_install_usrp_uhd_driver(){ + if [[ "$OS_DISTRO" == "ubuntu" ]]; then #first we remove old installation $SUDO apt-get remove -y uhd || true $SUDO apt-get remove libuhd-dev libuhd003 uhd-host -y @@ -261,34 +273,99 @@ check_install_usrp_uhd_driver(){ #The new USRP repository $SUDO add-apt-repository ppa:ettusresearch/uhd -y $SUDO apt-get update - $SUDO apt-get -y install python python-tk libboost-all-dev libusb-1.0-0-dev - $SUDO apt-get -y install libuhd-dev libuhd003 + $SUDO apt-get -y --allow-unauthenticated install python python-tk libboost-all-dev libusb-1.0-0-dev + $SUDO apt-get -y --allow-unauthenticated install libuhd-dev libuhd003 uhd-host + elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then + $SUDO $INSTALLER -y install python boost libusb-devel libusbx-devel boost-devel python-mako python-docutils cmake + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then + # until EPEL repo hasn't bumped UHD driver to >=3.10 in EPEL, build driver from source + $SUDO $INSTALLER -y remove uhd uhd-devel uhd-firmware + install_ursp_uhd_driver_from_source + else + $SUDO $INSTALLER -y install uhd uhd-devel uhd-firmware + fi + fi } install_usrp_uhd_driver() { + if [[ "$OS_DISTRO" == "ubuntu" ]]; then # We move uhd-host apart because it depends on linux kernel version # On newer kernels, it fails to install $SUDO apt-get -y install uhd-host - $SUDO uhd_images_downloader + fi + if [ -z $1 ]; then + $SUDO uhd_images_downloader + else + $SUDO uhd_images_downloader -i $1 + fi +} + +install_bladerf_driver_from_source(){ + bladerf_install_log=$OPENAIR_DIR/cmake_targets/log/bladerf_install_log.txt + echo_info "\nInstalling BladeRF driver from sources. The log file for BladeRF driver installation is here: $bladerf_install_log " + ( + cd /tmp + echo "Downloading BladeRF driver" + rm -rf /tmp/bladeRF + git clone https://github.com/Nuand/bladeRF.git + cd bladeRF + git checkout tags/2016.06 + mkdir -p build + cd build + $CMAKE ../ + echo "Compiling BladeRF driver" + make + $SUDO make install + $SUDO ldconfig + echo "Downloading FPGA and firmware images" + cd /tmp/bladeRF + wget https://www.nuand.com/fx3/bladeRF_fw_latest.img + wget https://www.nuand.com/fpga/hostedx40-latest.rbf + sudo mkdir -p /usr/share/Nuand/bladeRF + sudo mv bladeRF_fw_latest.img /usr/share/Nuand/bladeRF/bladeRF_fw.img + sudo mv hostedx40-latest.rbf /usr/share/Nuand/bladeRF/hostedx40.rbf + ) >& $bladerf_install_log } check_install_bladerf_driver(){ - if [ "$(get_distribution_release)" == "Ubuntu14.04" ] ; then - $SUDO add-apt-repository -y ppa:bladerf/bladerf - $SUDO apt-get update - fi - $SUDO apt-get install -y bladerf libbladerf-dev - $SUDO apt-get install -y bladerf-firmware-fx3 - $SUDO apt-get install -y bladerf-fpga-hostedx40 + if [[ "$OS_DISTRO" == "ubuntu" ]]; then + if [ "$(get_distribution_release)" == "ubuntu14.04" ] ; then + $SUDO add-apt-repository -y ppa:bladerf/bladerf + $SUDO apt-get update + fi + $SUDO apt-get install -y --allow-unauthenticated bladerf libbladerf-dev + $SUDO apt-get install -y --allow-unauthenticated bladerf-firmware-fx3 + $SUDO apt-get install -y --allow-unauthenticated bladerf-fpga-hostedx40 + elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then + install_bladerf_driver_from_source + else + echo_error "BladeRF Installer for OAI does not support automatic build. Install BladeRF compiling sources manually from BladeRF website" + fi } flash_firmware_bladerf() { $SUDO bladeRF-cli --flash-firmware /usr/share/Nuand/bladeRF/bladeRF_fw.img } +check_install_lmssdr_driver(){ + if ( [ -d "/usr/local/include/lime" ] && + [ -f "/usr/local/include/lime/LimeSuite.h" ] ) + then + echo_success "Found lmssdr drivers and tools installed from source" + else + echo_error "lmssdr support implies installing lmssdr drivers and tools" \ + " from sources. check:" + echo_info "https://open-cells.com/index.php/2017/05/10/limesdr-installation/" + echo_fatal "Cannot compile lmssdr device" + fi + + +} + check_install_additional_tools (){ - $SUDO apt-get update - $SUDO apt-get install -y \ + $SUDO $INSTALLER update -y + if [[ "$OS_DISTRO" == "ubuntu" ]]; then + PACKAGE_LIST="\ check \ dialog \ dkms \ @@ -312,14 +389,78 @@ check_install_additional_tools (){ android-tools-adb \ wvdial \ python-numpy \ - sshpass \ - nscd - - $SUDO pip install paramiko - $SUDO pip install pyroute2 - $SUDO rm -fr /opt/ssh - $SUDO GIT_SSL_NO_VERIFY=true git clone https://gist.github.com/2190472.git /opt/ssh + sshpass \ + nscd \ + bc \ + ntp \ + python-scipy \ + python-matplotlib" + elif [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then + PACKAGE_LIST="\ + check \ + dialog \ + dkms \ + gawk \ + boost-devel \ + openvpn \ + pkgconfig \ + pexpect \ + sshfs \ + swig \ + wireshark \ + unzip \ + valgrind \ + vconfig \ + ctags \ + ntpdate \ + iperf3 \ + wvdial \ + numpy \ + sshpass \ + nscd \ + python2-paramiko \ + python-pyroute2 \ + python-netifaces \ + scipy \ + python-matplotlib" + elif [[ "$OS_DISTRO" == "fedora" ]]; then + PACKAGE_LIST=" \ + check \ + dialog \ + dkms \ + gawk \ + boost-devel \ + openvpn \ + pkgconfig \ + python-pexpect \ + sshfs \ + swig \ + wireshark \ + unzip \ + valgrind \ + vconfig \ + ctags \ + ntpdate \ + iperf3 \ + wvdial \ + python-numpy \ + sshpass \ + nscd \ + python2-paramiko \ + python-pyroute2 \ + python-netifaces \ + python2-scipy \ + python2-matplotlib" + fi + $SUDO $INSTALLER install -y $PACKAGE_LIST + $SUDO rm -fr /opt/ssh + $SUDO GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/ssh.git /opt/ssh + + #The packages below are already installed for Redhat distros (RHEL, CentOS, Fedora) + if [[ "$OS_DISTRO" == "ubuntu" ]]; then + $SUDO pip install paramiko + $SUDO pip install pyroute2 colorama log_netiface=$OPENAIR_DIR/cmake_targets/log/netiface_install_log.txt echo_info "Installing Netinterfaces package. The logfile for installation is in $log_netiface" ( @@ -330,6 +471,7 @@ check_install_additional_tools (){ $SUDO python setup.py install cd - ) >& $log_netiface + fi } check_install_oai_software() { @@ -338,17 +480,28 @@ check_install_oai_software() { echo_error "Your distribution $(get_distribution_release) is not supported by oai !" exit 1 fi - $SUDO apt-get update + $SUDO $INSTALLER update -y + if [[ "$OS_DISTRO" == "ubuntu" ]]; then + local LAPACK_LIBNAME="liblapack.so" + local LAPACK_TARGET="/usr/lib/atlas-base/atlas/liblapack.so" $SUDO apt install -y software-properties-common case "$(get_distribution_release)" in - "Ubuntu14.04") - specific_packages="libtasn1-3-dev" + "ubuntu14.04") + specific_packages="libtasn1-3-dev gccxml libgnutls-dev libatlas-dev" # For iperf3 $SUDO add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty-backports universe" $SUDO apt-get update ;; - "Ubuntu16.04") - specific_packages="libtasn1-6-dev" + "ubuntu16.04") + specific_packages="libtasn1-6-dev gccxml libgnutls-dev libatlas-dev" + ;; + "ubuntu17.04") + specific_packages="libtasn1-6-dev castxml libgnutls28-dev libatlas-dev" + ;; + "ubuntu17.10") + specific_packages="libtasn1-6-dev castxml libgnutls28-dev" + LAPACK_LIBNAME="liblapack.so-x86_64-linux-gnu" + LAPACK_TARGET="/usr/lib/x86_64-linux-gnu/atlas/liblapack.so" ;; esac $SUDO apt-get install -y \ @@ -364,7 +517,6 @@ check_install_oai_software() { texlive-latex-base \ ethtool \ flex \ - gccxml \ gdb \ git \ graphviz \ @@ -375,7 +527,6 @@ check_install_oai_software() { iptables \ iptables-dev \ libatlas-base-dev \ - libatlas-dev \ libblas-dev \ libconfig8-dev \ libffi-dev \ @@ -409,21 +560,96 @@ check_install_oai_software() { xmlstarlet \ python-pip \ pydb \ - wget + libyaml-dev \ + wget \ + libxpm-dev - $SUDO update-alternatives --set liblapack.so /usr/lib/atlas-base/atlas/liblapack.so + $SUDO update-alternatives --set "$LAPACK_LIBNAME" "$LAPACK_TARGET" + + $SUDO apt-get install -y nettle-dev nettle-bin + elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then + if [[ "$OS_DISTRO" == "rhel" ]] || [[ "$OS_DISTRO" == "centos" ]]; then + if rpm -q epel-release > /dev/null; then + echo "EPEL repos already present. Good." + else + echo "EPEL repos not present. Installing them." + $SUDO $INSTALLER install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm + fi + $SUDO $INSTALLER install -y python-epdb + $SUDO $INSTALLER install -y gccxml + else + $SUDO $INSTALLER install -y mscgen pydb + # Fedora repos already contain gccxml's successor castxml. + $SUDO $INSTALLER install -y castxml + fi - #Sometimes linux headers are not available in apt-get if kernel is custom or new - $SUDO apt-get install linux-headers-`uname -r` || true - # First we remove gnutls/nettle installation and then install from sources - $SUDO apt-get remove -y libgnutls-dev nettle-dev nettle-bin - install_nettle_from_source - install_gnutls_from_source + $SUDO $INSTALLER install -y \ + autoconf \ + automake \ + bc \ + bison \ + $CMAKE \ + doxygen \ + ethtool \ + flex \ + gdb \ + git \ + graphviz \ + gtkwave \ + guile-devel \ + iperf \ + iproute \ + iptables \ + iptables-devel \ + atlas-devel \ + blas-devel \ + libconfig-devel \ + libffi-devel \ + xforms \ + xforms-devel \ + libgcrypt-devel \ + gmp-devel \ + gtk3-devel \ + libidn2-devel \ + libidn-devel \ + mariadb-devel \ + octave-devel \ + openpgm-devel \ + lksctp-tools \ + lksctp-tools-devel \ + openssl-devel \ + libtasn1 \ + libtool \ + libusb-devel \ + libxml2 \ + libxml2-devel \ + libxslt-devel \ + octave \ + octave-signal \ + openssh-clients \ + openssh-server \ + openssl \ + patch \ + psmisc \ + python \ + subversion \ + xmlstarlet \ + python-pip \ + wget \ + kernel-headers \ + kernel-devel \ + nettle-devel \ + gnutls-devel \ + libXpm-devel \ + lapack \ + lapack-devel \ + blas \ + blas-devel + fi install_asn1c_from_source - - install_protobuf_from_source - install_protobuf_c_from_source + $SUDO rm -fr /opt/ssh + $SUDO git clone https://gist.github.com/2190472.git /opt/ssh } install_asn1c_from_source(){ @@ -431,12 +657,13 @@ install_asn1c_from_source(){ echo_info "\nInstalling ASN1. The log file for ASN1 installation is here: $asn1_install_log " ( $SUDO rm -rf /tmp/asn1c - git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c + GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c cd /tmp/asn1c ./configure make -j`nproc` $SUDO make install cd - + $SUDO ldconfig ) > $asn1_install_log 2>&1 } @@ -445,19 +672,18 @@ install_asn1c_from_source(){ ################################################ install_nas_tools() { - cd $1 - if [ ! -f .ue.nvram ]; then + if [ ! -f .ue.nvram0 ]; then echo_success "generate .ue_emm.nvram .ue.nvram" - ./nvram --gen + ./nvram --gen -c $1 -o $2 else - [ ./nvram -nt .ue.nvram -o ./nvram -nt .ue_emm.nvram ] && ./nvram --gen + [ ./nvram -nt .ue.nvram0 -o ./nvram -nt .ue_emm.nvram0 ] && ./nvram --gen -c $1 -o $2 fi - if [ ! -f .usim.nvram ]; then + if [ ! -f .usim.nvram0 ]; then echo_success "generate .usim.nvram" - ./usim --gen + ./usim --gen -c $1 -o $2 else - [ ./usim -nt .usim.nvram ] && ./usim --gen + [ ./usim -nt .usim.nvram0 ] && ./usim --gen -c $1 -o $2 fi } diff --git a/cmake_targets/tools/build_test_epc_tools b/cmake_targets/tools/build_test_epc_tools index aa7103fd78..dc2d016545 100755 --- a/cmake_targets/tools/build_test_epc_tools +++ b/cmake_targets/tools/build_test_epc_tools @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file build_test_epc_tools # brief # author Lionel Gauthier diff --git a/cmake_targets/tools/example_enb_exmimo_mme_hss.txt b/cmake_targets/tools/example_enb_exmimo_mme_hss.txt index 2c693a5003..238554f8e2 100644 --- a/cmake_targets/tools/example_enb_exmimo_mme_hss.txt +++ b/cmake_targets/tools/example_enb_exmimo_mme_hss.txt @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file example_enb_exmimo_mme_hss.txt # brief # author Lionel Gauthier diff --git a/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt b/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt index b47c6137c5..9996a53e19 100644 --- a/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt +++ b/cmake_targets/tools/example_oaisim_enb_ue_mme_virtual.txt @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file example_oaisim_enb_ue_mme_virtual.txt # brief # author Lionel Gauthier diff --git a/cmake_targets/tools/fix_asn1 b/cmake_targets/tools/fix_asn1 index 0661d7878d..5cdab5ffd8 100755 --- a/cmake_targets/tools/fix_asn1 +++ b/cmake_targets/tools/fix_asn1 @@ -3,19 +3,16 @@ # in those arrays, each line is: # +RRC_Rel14=( + "SystemInformation-r8-IEs.h" 4df485c5ddf2540eca271876cdc512caa19b0890 "fix_asn1.data/RRC.rel14/SystemInformation-r8-IEs.h.diff" +) + RRC_Rel10=( "SystemInformation-r8-IEs.h" 603cd6615cff36ec7020692d72c0d6de7c4859cb "fix_asn1.data/RRC.rel10/SystemInformation-r8-IEs.h.diff" ) X2AP_Rel11_2=( "X2ap-CriticalityDiagnostics-IE-List.h" ae96308b37fcbcbf39da5012e42968135fc5f27b "fix_asn1.data/X2AP.rel11.2/X2ap-CriticalityDiagnostics-IE-List.h.diff" - "NativeInteger.c" 1a55f5402fd363318cf5444ffe1f67530dcf66ff "fix_asn1.data/X2AP.rel11.2/NativeInteger.c.diff" - "constr_SET_OF.c" 808cbbdf19b118c0bdb04e3acf2cbe6e4133be2b "fix_asn1.data/X2AP.rel11.2/constr_SET_OF.c.diff" -) - -S1AP_Rel10_5=( - "NativeInteger.c" 1a55f5402fd363318cf5444ffe1f67530dcf66ff "fix_asn1.data/S1AP.rel10.5/NativeInteger.c.diff" - "constr_SET_OF.c" 808cbbdf19b118c0bdb04e3acf2cbe6e4133be2b "fix_asn1.data/S1AP.rel10.5/constr_SET_OF.c.diff" ) red_color="$(tput setaf 1)" @@ -94,6 +91,10 @@ function patch_rrc() local version="$2" case "$version" in + Rel14 ) + echo "patching RRC files release 14" + apply_patches "$directory" RRC_Rel14 ${#RRC_Rel14[*]} + ;; Rel10 ) echo "patching RRC files release 10" apply_patches "$directory" RRC_Rel10 ${#RRC_Rel10[*]} @@ -130,8 +131,7 @@ function patch_s1ap() case "$version" in R10 ) - echo "patching S1AP files release 10.5" - apply_patches "$directory" S1AP_Rel10_5 ${#S1AP_Rel10_5[*]} + #nothing to do anymore (fixes went to asn1c) ;; * ) error unknwon/unhandled S1AP version \'"$version"\' diff --git a/cmake_targets/tools/fix_asn1.data/RRC.rel14/SystemInformation-r8-IEs.h.diff b/cmake_targets/tools/fix_asn1.data/RRC.rel14/SystemInformation-r8-IEs.h.diff new file mode 100644 index 0000000000..b2d32cf052 --- /dev/null +++ b/cmake_targets/tools/fix_asn1.data/RRC.rel14/SystemInformation-r8-IEs.h.diff @@ -0,0 +1,23 @@ +73,77d72 +< /* SystemInformation-r8-IEs */ +< typedef struct SystemInformation_r8_IEs { +< struct SystemInformation_r8_IEs__sib_TypeAndInfo { +< A_SEQUENCE_OF(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member { +< SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR present; +103c98,102 +< } choice; +--- +> }; +> +> struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member { +> SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR present; +> union SystemInformation_r8_IEs__sib_TypeAndInfo__Member_u choice; +107c106,111 +< } ) list; +--- +> }; +> +> /* SystemInformation-r8-IEs */ +> typedef struct SystemInformation_r8_IEs { +> struct SystemInformation_r8_IEs__sib_TypeAndInfo { +> A_SEQUENCE_OF(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member) list; diff --git a/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/NativeInteger.c.diff b/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/NativeInteger.c.diff deleted file mode 100644 index 3b51426ad3..0000000000 --- a/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/NativeInteger.c.diff +++ /dev/null @@ -1,8 +0,0 @@ -283c283 -< int dynamic = 0; ---- -> //int dynamic = 0; -290c290 -< dynamic = 1; ---- -> //dynamic = 1; diff --git a/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/constr_SET_OF.c.diff b/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/constr_SET_OF.c.diff deleted file mode 100644 index 3ceaf5e3e5..0000000000 --- a/cmake_targets/tools/fix_asn1.data/S1AP.rel10.5/constr_SET_OF.c.diff +++ /dev/null @@ -1,4 +0,0 @@ -1007c1007 -< (int)nelems, (int)ct ? ct->effective_bits : -1); ---- -> (int)nelems, ct ? ct->effective_bits : -1); diff --git a/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/NativeInteger.c.diff b/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/NativeInteger.c.diff deleted file mode 100644 index 3b51426ad3..0000000000 --- a/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/NativeInteger.c.diff +++ /dev/null @@ -1,8 +0,0 @@ -283c283 -< int dynamic = 0; ---- -> //int dynamic = 0; -290c290 -< dynamic = 1; ---- -> //dynamic = 1; diff --git a/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/constr_SET_OF.c.diff b/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/constr_SET_OF.c.diff deleted file mode 100644 index 3ceaf5e3e5..0000000000 --- a/cmake_targets/tools/fix_asn1.data/X2AP.rel11.2/constr_SET_OF.c.diff +++ /dev/null @@ -1,4 +0,0 @@ -1007c1007 -< (int)nelems, (int)ct ? ct->effective_bits : -1); ---- -> (int)nelems, ct ? ct->effective_bits : -1); diff --git a/cmake_targets/tools/indent_source_code b/cmake_targets/tools/indent_source_code index 64de1c4c50..a16914a91d 100755 --- a/cmake_targets/tools/indent_source_code +++ b/cmake_targets/tools/indent_source_code @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file indent_source_code # brief # author Lionel Gauthier diff --git a/cmake_targets/tools/init_exmimo2 b/cmake_targets/tools/init_exmimo2 index 66eedf93dd..8e902a8433 100755 --- a/cmake_targets/tools/init_exmimo2 +++ b/cmake_targets/tools/init_exmimo2 @@ -1,33 +1,26 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2015 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file init_nas_nos1 # brief loads the nasmesh module and sets up the radio bearers (used to provide ip interface without S1 interface) # author Florian Kaltenberger @@ -71,15 +64,7 @@ if [ ! -e /dev/openair0 ]; then sudo chmod a+rw /dev/openair0 fi -DEVICE=`echo $PCI | awk -F\" '{print $(NF-1)}' | awk '{print $2}'` -DEVICE_SWID=${DEVICE:2:2} -if [ $DEVICE_SWID == '0a' ]; then - echo "Using firware version 10" $OPENAIR_DIR/targets/bin/updatefw -s 0x43fffff0 -b -f $OPENAIR_TARGETS/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/sdr_expressmimo2_v10 -else - echo 'No corresponding firmware found' - return -fi } main "$@" diff --git a/cmake_targets/tools/init_nas_nos1 b/cmake_targets/tools/init_nas_nos1 index d2b7760867..9bcaa0afb5 100755 --- a/cmake_targets/tools/init_nas_nos1 +++ b/cmake_targets/tools/init_nas_nos1 @@ -1,33 +1,26 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2015 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file init_nas_nos1 # brief loads the nasmesh module and sets up the radio bearers (used to provide ip interface without S1 interface) # author Florian Kaltenberger diff --git a/cmake_targets/tools/init_nas_s1 b/cmake_targets/tools/init_nas_s1 new file mode 100644 index 0000000000..cab4ad047b --- /dev/null +++ b/cmake_targets/tools/init_nas_s1 @@ -0,0 +1,71 @@ +#!/bin/bash + +#WARNING: this file may not work properly, be sure to know what you +#do when using it + +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +################################################################################ +# file init_nas_s1 +# brief loads the ue_ip module and sets up IP for the UE +# you may want to edit it to fit your settings (replace oip0 by oipX for +# instance) +# author Florian Kaltenberger +# +####################################### + +LTEIF=oip1 +#OPENAIR_DIR=/home/oai/svn-oai/openair4G + +load_module() { + mod_name=${1##*/} + mod_name=${mod_name%.*} + if awk "/$mod_name/ {found=1 ;exit} END {if (found!=1) exit 1}" /proc/modules + then + echo "module $mod_name already loaded: I remove it first" + sudo rmmod $mod_name + fi + echo loading $mod_name + sudo insmod $1 +} + +load_module ../../targets/bin/ue_ip.ko + +if [ "$1" = "UE" ]; then + echo "bring up $LTEIF interface for UE" + ifconfig $LTEIF up +fi + +ip route flush cache +sleep 1 +sysctl -w net.ipv4.conf.all.log_martians=1 +echo "Disabling reverse path filtering" +sysctl -w net.ipv4.conf.all.rp_filter=0 +ip route flush cache + +# Check table 200 lte in /etc/iproute2/rt_tables +fgrep lte /etc/iproute2/rt_tables > /dev/null +if [ $? -ne 0 ]; then + echo "200 lte " >> /etc/iproute2/rt_tables +fi +ip rule add fwmark 1 table lte +ip route add default dev $LTEIF table lte diff --git a/cmake_targets/tools/make_agent_cache b/cmake_targets/tools/make_agent_cache new file mode 100755 index 0000000000..d2eab20fc0 --- /dev/null +++ b/cmake_targets/tools/make_agent_cache @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +CACHE_DIR=/mnt/oai_agent_cache + +if [ ! -d $CACHE_DIR ]; then + echo "Creating cache dir in $CACHE_DIR" + sudo mkdir $CACHE_DIR +fi + +if grep -qs "$CACHE_DIR" /proc/mounts; then + echo "Agent cache is already mounted" +else + echo "Agent cache was not mounted" + echo "Mounting..." + sudo mount -o size=100m -t tmpfs none "$CACHE_DIR" + if [ $? -eq 0 ]; then + echo "Mount success" + else + echo "Something went wrong with the mount" + fi +fi diff --git a/cmake_targets/tools/perf_oai.bash b/cmake_targets/tools/perf_oai.bash index 42d6be0716..cd1ef5a400 100755 --- a/cmake_targets/tools/perf_oai.bash +++ b/cmake_targets/tools/perf_oai.bash @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2015 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file build_oai.bash # brief apply a traffic generator, send traffic and measure the performance of OAI # OTG is mainly used for OASIM and D-ITG (or iperf) for LTE-SOFTMODEM diff --git a/cmake_targets/tools/run_enb_s1_exmimo b/cmake_targets/tools/run_enb_s1_exmimo index e2df8b5049..1bb6ce4425 100755 --- a/cmake_targets/tools/run_enb_s1_exmimo +++ b/cmake_targets/tools/run_enb_s1_exmimo @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file run_enb_s1_exmimo # brief run script for eNB EXMIMO. # author Lionel GAUTHIER diff --git a/cmake_targets/tools/run_enb_s1_usrp b/cmake_targets/tools/run_enb_s1_usrp index 2969f759a1..e119126683 100755 --- a/cmake_targets/tools/run_enb_s1_usrp +++ b/cmake_targets/tools/run_enb_s1_usrp @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file run_enb_s1_usrp # brief run script for eNB USRP. # author Lionel GAUTHIER and Navid Nikaein diff --git a/cmake_targets/tools/run_enb_ue_virt_noS1 b/cmake_targets/tools/run_enb_ue_virt_noS1 index f5ed770f80..79d5bc35dc 100755 --- a/cmake_targets/tools/run_enb_ue_virt_noS1 +++ b/cmake_targets/tools/run_enb_ue_virt_noS1 @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file start_enb_ue_virt_noS1 # brief # author Lionel Gauthier @@ -157,7 +150,7 @@ function main() # -u | --num-ue ) -V | --vcd) - "setting gtk-wave output" + echo "setting gtk-wave output" exe_arguments="$exe_arguments -V /tmp/oai_gtk_wave.vcd" shift ; ;; @@ -171,6 +164,11 @@ function main() exe_arguments="$exe_arguments -n $2" shift 2; ;; + -x | --xforms) + echo "running with xforms" + exe_arguments="$exe_arguments --xforms" + shift 1; + ;; *) echo "Unknown option $1" help @@ -219,11 +217,11 @@ function main() fi if [ $run_gdb -eq 0 ]; then - exec $SUDO $OPENAIR_DIR/targets/bin/oaisim_nos1.Rel10 $exe_arguments | tee /tmp/enb_ue_nos1.log.txt + exec $SUDO $OPENAIR_DIR/targets/bin/oaisim_nos1.Rel14 $exe_arguments | tee /tmp/enb_ue_nos1.log.txt else touch ~/.gdb_enb_ue_nos1 chmod 777 ~/.gdb_enb_ue_nos1 - echo "file $OPENAIR_DIR/targets/bin/oaisim_nos1.Rel10" > ~/.gdb_enb_ue_nos1 + echo "file $OPENAIR_DIR/targets/bin/oaisim_nos1.Rel14" > ~/.gdb_enb_ue_nos1 echo "set args $exe_arguments" >> ~/.gdb_enb_ue_nos1 echo "run" >> ~/.gdb_enb_ue_nos1 cat ~/.gdb_enb_ue_nos1 diff --git a/cmake_targets/tools/run_enb_ue_virt_s1 b/cmake_targets/tools/run_enb_ue_virt_s1 index 9f325c7243..50fc819ec8 100755 --- a/cmake_targets/tools/run_enb_ue_virt_s1 +++ b/cmake_targets/tools/run_enb_ue_virt_s1 @@ -1,32 +1,25 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + # file start_enb_ue_virt_s1 # brief # author Lionel Gauthier @@ -181,7 +174,7 @@ function main() ;; -V | --vcd) - "setting gtk-wave output" + echo "setting gtk-wave output" exe_arguments="$exe_arguments -V /tmp/oai_gtk_wave.vcd" shift ; ;; @@ -190,6 +183,11 @@ function main() exe_arguments="$exe_arguments -P wireshark" shift 2; ;; + -x | --xforms) + echo "running with xforms" + exe_arguments="$exe_arguments --xforms" + shift 1; + ;; *) echo "Unknown option $1" help @@ -254,9 +252,6 @@ function main() if [ $? -ne 0 ]; then echo "200 lte " >> /etc/iproute2/rt_tables fi - ip rule add fwmark 1 table lte - ifconfig oip1 up - ip route add default dev oip1 table lte exe_arguments="$exe_arguments -s15 -AAWGN -y1 -b1 -u1 -Q0" @@ -268,11 +263,11 @@ function main() fi if [ $run_gdb -eq 0 ]; then - exec $OPENAIR_DIR/targets/bin/oaisim.Rel10 $exe_arguments | tee /tmp/enb_ue_s1.log.txt + exec $OPENAIR_DIR/targets/bin/oaisim.Rel14 $exe_arguments | tee /tmp/enb_ue_s1.log.txt else touch ~/.gdb_enb_ue_s1 chmod 777 ~/.gdb_enb_ue_s1 - echo "file $OPENAIR_DIR/targets/bin/oaisim.Rel10" > ~/.gdb_enb_ue_s1 + echo "file $OPENAIR_DIR/targets/bin/oaisim.Rel14" > ~/.gdb_enb_ue_s1 echo "set args $exe_arguments" >> ~/.gdb_enb_ue_s1 echo "run" >> ~/.gdb_enb_ue_s1 cat ~/.gdb_enb_ue_s1 diff --git a/cmake_targets/tools/run_ue_s1 b/cmake_targets/tools/run_ue_s1 new file mode 100644 index 0000000000..56b18d72b9 --- /dev/null +++ b/cmake_targets/tools/run_ue_s1 @@ -0,0 +1,33 @@ +#!/bin/bash + +# Carrier frequency in Hz +#FREQ=2660000000 #FDD +FREQ=2350000000 #TDD +NRB=50 +TA=0 + +#9:trace, 8/7:debug, 6:info, 4:warn, 3:error +LOGLEVEL=6 + +#enable or disable soft scope +#SCOPE='' +SCOPE='-d' + +#enable or disable VCD logging +VCD='' +#VCD='-V' + +ISTDD='-T' +#ISTDD='' + +#use external clock +ECLK="--external-clock" +#ECLK="" + +#UE scan carrier +#ISSCAN="--ue-scan-carrier" +ISSCAN="" + +sudo sh -c './init_nas_s1 UE' +cd ../../targets/bin/ +sudo -E ./lte-softmodem.Rel10 -U -C$FREQ -r$NRB $ISSCAN --ue-txgain 70 --ue-rxgain 80 -A $TA $ECLK -W $ISTDD -g $LOGLEVEL $SCOPE 2>&1 | sudo tee /tmp/UE.log diff --git a/cmake_targets/tools/stop_exmimo2 b/cmake_targets/tools/stop_exmimo2 index 102c9e0680..fdfe19425d 100755 --- a/cmake_targets/tools/stop_exmimo2 +++ b/cmake_targets/tools/stop_exmimo2 @@ -1,4 +1,26 @@ #!/bin/bash +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +# \author Navid Nikaein, Rohit Gupta echo "This script stops exmimo2 as it might be transmitting signal by itself if lte-softmodem terminates incorrectly" diff --git a/common/config/config_cmdline.c b/common/config/config_cmdline.c new file mode 100644 index 0000000000..cb24cc5222 --- /dev/null +++ b/common/config/config_cmdline.c @@ -0,0 +1,166 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/config/cmdline/config_libconfig.c + * \brief configuration module, command line parsing implementation + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#include +#include +#include +#include +#include "config_userapi.h" + +int processoption(paramdef_t *cfgoptions, char *value) +{ +char *tmpval = value; +int optisset=0; +char defbool[2]="1"; + + if ( value == NULL) { + if( (cfgoptions->paramflags &PARAMFLAG_BOOL) == 0 ) { /* not a boolean, argument required */ + fprintf(stderr,"[CONFIG] command line, option %s requires an argument\n",cfgoptions->optname); + return 0; + } else { /* boolean value option without argument, set value to true*/ + tmpval = defbool; + } + } + switch(cfgoptions->type) + { + case TYPE_STRING: + if (cfgoptions->numelt == 0 ) { + config_check_valptr(cfgoptions, cfgoptions->strptr, strlen(tmpval)+1); + sprintf(*(cfgoptions->strptr), "%s",tmpval); + } else { + sprintf( (char *)(cfgoptions->strptr), "%s",tmpval); + } + printf_cmdl("[CONFIG] %s set to %s from command line\n", cfgoptions->optname, tmpval); + optisset=1; + break; + + case TYPE_STRINGLIST: + break; + case TYPE_UINT32: + case TYPE_INT32: + case TYPE_UINT16: + case TYPE_INT16: + case TYPE_UINT8: + case TYPE_INT8: + config_check_valptr(cfgoptions, (char **)&(cfgoptions->iptr),sizeof(int32_t)); + config_assign_int(cfgoptions,cfgoptions->optname,(int32_t)strtol(tmpval,NULL,0)); + optisset=1; + break; + case TYPE_UINT64: + case TYPE_INT64: + config_check_valptr(cfgoptions, (char **)&(cfgoptions->i64ptr),sizeof(uint64_t)); + *(cfgoptions->i64ptr)=strtoll(tmpval,NULL,0); + printf_cmdl("[CONFIG] %s set to %lli from command line\n", cfgoptions->optname, (long long)*(cfgoptions->i64ptr)); + optisset=1; + break; + case TYPE_UINTARRAY: + case TYPE_INTARRAY: + + break; + case TYPE_DOUBLE: + config_check_valptr(cfgoptions, (char **)&(cfgoptions->dblptr),sizeof(double)); + *(cfgoptions->dblptr) = strtof(tmpval,NULL); + printf_cmdl("[CONFIG] %s set to %lf from command line\n", cfgoptions->optname, *(cfgoptions->dblptr)); + optisset=1; + break; + + case TYPE_IPV4ADDR: + + break; + + default: + fprintf(stderr,"[CONFIG] command line, %s type %i not supported\n",cfgoptions->optname, cfgoptions->type); + break; + } /* switch on param type */ + if (optisset == 1) { + cfgoptions->paramflags = cfgoptions->paramflags | PARAMFLAG_PARAMSET; + } + + return optisset; +} + +int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix) +{ +char **p = config_get_if()->argv; +int c = config_get_if()->argc; +int j; +char *pp; +char *cfgpath; + + j = (prefix ==NULL) ? 0 : strlen(prefix); + cfgpath = malloc( j + MAX_OPTNAME_SIZE +1); + if (cfgpath == NULL) { + fprintf(stderr,"[CONFIG] %s %i malloc error, %s\n", __FILE__, __LINE__,strerror(errno)); + return -1; + } + + j=0; + p++; + c--; + while (c > 0 && *p != NULL) { + if (strcmp(*p, "-h") == 0 || strcmp(*p, "--help") == 0 ) { + config_printhelp(cfgoptions,numoptions); + } + + if (*p[0] == '-') { + for(int i=0;i 2) && (strcmp(*p + 2,cfgpath ) == 0 )) ) { + pp = *(p+1); + if ( ( pp != NULL ) && (c>1) && (pp[0]!= '-') ) { + + j += processoption(&(cfgoptions[i]), pp); + } else { + j += processoption(&(cfgoptions[i]), NULL); + } + break; + } + } /* for */ + } /* if (*p[0] == '-') */ + p++; + c--; + } /* fin du while */ + printf_cmdl("[CONFIG] %s %i options set from command line\n",((prefix == NULL) ? "":prefix),j); + free(cfgpath); + return j; +} /* parse_cmdline*/ + + + diff --git a/common/config/config_load_configmodule.c b/common/config/config_load_configmodule.c new file mode 100644 index 0000000000..ff66d22a1c --- /dev/null +++ b/common/config/config_load_configmodule.c @@ -0,0 +1,227 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/config/config_load_configmodule.c + * \brief configuration module, load the shared library implementing the configuration module + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +#define CONFIG_LOADCONFIG_MAIN +#include "config_load_configmodule.h" +#include "config_userapi.h" +#define CONFIG_SHAREDLIBFORMAT "libparams_%s.so" + +int load_config_sharedlib(configmodule_interface_t *cfgptr) +{ +void *lib_handle; +char fname[128]; +char libname[FILENAME_MAX]; +int st; + + st=0; + sprintf(libname,CONFIG_SHAREDLIBFORMAT,cfgptr->cfgmode); + + lib_handle = dlopen(libname,RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE); + if (!lib_handle) { + fprintf(stderr,"[CONFIG] %s %d Error calling dlopen(%s): %s\n",__FILE__, __LINE__, libname,dlerror()); + st = -1; + } else { + sprintf (fname,"config_%s_init",cfgptr->cfgmode); + cfgptr->init = dlsym(lib_handle,fname); + + if (cfgptr->init == NULL ) { + printf("[CONFIG] %s %d no function %s for config mode %s\n", + __FILE__, __LINE__,fname, cfgptr->cfgmode); + } else { + st=cfgptr->init(cfgptr->cfgP,cfgptr->num_cfgP); + printf("[CONFIG] function %s returned %i\n", + fname, st); + } + + sprintf (fname,"config_%s_get",cfgptr->cfgmode); + cfgptr->get = dlsym(lib_handle,fname); + if (cfgptr->get == NULL ) { + printf("[CONFIG] %s %d no function %s for config mode %s\n", + __FILE__, __LINE__,fname, cfgptr->cfgmode); + st = -1; + } + + sprintf (fname,"config_%s_getlist",cfgptr->cfgmode); + cfgptr->getlist = dlsym(lib_handle,fname); + if (cfgptr->getlist == NULL ) { + printf("[CONFIG] %s %d no function %s for config mode %s\n", + __FILE__, __LINE__,fname, cfgptr->cfgmode); + st = -1; + } + + sprintf (fname,"config_%s_end",cfgptr->cfgmode); + cfgptr->end = dlsym(lib_handle,fname); + if (cfgptr->getlist == NULL ) { + printf("[CONFIG] %s %d no function %s for config mode %s\n", + __FILE__, __LINE__,fname, cfgptr->cfgmode); + } + } + + return st; +} +/*-----------------------------------------------------------------------------------*/ +/* from here: interface implementtion of the configuration module */ + + +configmodule_interface_t *load_configmodule(int argc, char **argv) +{ +char *cfgparam=NULL; +char *modeparams=NULL; +char *cfgmode=NULL; +char *strtokctx=NULL; +char *atoken; +uint32_t tmpflags=0; +int i; + +/* first parse the command line to look for the -O option */ + opterr=0; + for (i = 0;i option, default cfgmode to libconfig + with one parameter, the path to the configuration file */ + modeparams=cfgmode; + cfgmode=strdup(DEFAULT_CFGMODE); + } + + cfgptr = malloc(sizeof(configmodule_interface_t)); + memset(cfgptr,0,sizeof(configmodule_interface_t)); + + cfgptr->rtflags = cfgptr->rtflags | tmpflags; + cfgptr->argc = argc; + cfgptr->argv = argv; + cfgptr->cfgmode=strdup(cfgmode); + + cfgptr->num_cfgP=0; + atoken=strtok_r(modeparams,":",&strtokctx); + while ( cfgptr->num_cfgP< CONFIG_MAX_OOPT_PARAMS && atoken != NULL) { + /* look for debug level in the config parameters, it is commom to all config mode + and will be removed frome the parameter array passed to the shared module */ + char *aptr; + aptr=strcasestr(atoken,"dbgl"); + if (aptr != NULL) { + cfgptr->rtflags = cfgptr->rtflags | strtol(aptr+4,NULL,0); + + } else { + cfgptr->cfgP[cfgptr->num_cfgP] = strdup(atoken); + cfgptr->num_cfgP++; + } + atoken = strtok_r(NULL,":",&strtokctx); + } + + + printf("[CONFIG] get parameters from %s ",cfgmode); + for (i=0;inum_cfgP; i++) { + printf("%s ",cfgptr->cfgP[i]); + } + printf("\n"); + + + i=load_config_sharedlib(cfgptr); + if (i< 0) { + fprintf(stderr,"[CONFIG] %s %d config module %s couldn't be loaded\n", __FILE__, __LINE__,cfgmode); + cfgptr->rtflags = cfgptr->rtflags | CONFIG_HELP | CONFIG_ABORT; + } else { + printf("[CONFIG] config module %s loaded\n",cfgmode); + Config_Params[CONFIGPARAM_DEBUGFLAGS_IDX].uptr=&(cfgptr->rtflags); + config_get(Config_Params,CONFIG_PARAMLENGTH(Config_Params), CONFIG_SECTIONNAME ); + } + + + + if (modeparams != NULL) free(modeparams); + if (cfgmode != NULL) free(cfgmode); + if (CONFIG_ISFLAGSET(CONFIG_ABORT)) config_printhelp(Config_Params,CONFIG_PARAMLENGTH(Config_Params)); + return cfgptr; +} + +void end_configmodule() +{ + if (cfgptr != NULL) { + if (cfgptr->end != NULL) { + printf ("[CONFIG] calling config module end function...\n"); + cfgptr->end(); + } + if( cfgptr->cfgmode != NULL) free(cfgptr->cfgmode); + printf ("[CONFIG] free %u config parameter pointers\n",cfgptr->num_cfgP); + for (int i=0; inum_cfgP; i++) { + if ( cfgptr->cfgP[i] != NULL) free(cfgptr->cfgP[i]); + } + printf ("[CONFIG] free %u config value pointers\n",cfgptr->numptrs); + for(int i=0; inumptrs ; i++) { + if (cfgptr->ptrs[i] != NULL) { + free(cfgptr->ptrs[i]); + } + cfgptr->ptrs[i]=NULL; + } + + free(cfgptr); + cfgptr=NULL; + } +} + + + + diff --git a/common/config/config_load_configmodule.h b/common/config/config_load_configmodule.h new file mode 100644 index 0000000000..76f074cd6c --- /dev/null +++ b/common/config/config_load_configmodule.h @@ -0,0 +1,104 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/config/config_load_configmodule.h + * \brief: configuration module, include file to be used by the source code calling the + * configuration module initialization + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#ifndef INCLUDE_CONFIG_LOADCONFIGMODULE_H +#define INCLUDE_CONFIG_LOADCONFIGMODULE_H + + +#include +#include +#include "common/config/config_paramdesc.h" +#define CONFIG_MAX_OOPT_PARAMS 10 // maximum number of parameters in the -O option (-O :P1:P2... +#define CONFIG_MAX_ALLOCATEDPTRS 1024 // maximum number of parameters that can be dynamicaly allocated in the config module + +/* rtflags bit position definitions */ +#define CONFIG_PRINTPARAMS 1 // print parameters values while processing +#define CONFIG_DEBUGPTR 2 // print memory allocation/free debug messages +#define CONFIG_DEBUGCMDLINE 4 // print command line processing messages +#define CONFIG_HELP 8 // print help message +#define CONFIG_ABORT 16 // config failed,abort execution +#define CONFIG_NOOOPT 32 // no -O option found when parsing command line + + +typedef int(*configmodule_initfunc_t)(char *cfgP[],int numP); +typedef int(*configmodule_getfunc_t)(paramdef_t *,int numparams, char *prefix); +typedef int(*configmodule_getlistfunc_t)(paramlist_def_t *, paramdef_t *,int numparams, char *prefix); +typedef void(*configmodule_endfunc_t)(void); +typedef struct configmodule_interface +{ + int argc; + char **argv; + char *cfgmode; + int num_cfgP; + char *cfgP[CONFIG_MAX_OOPT_PARAMS]; + configmodule_initfunc_t init; + configmodule_getfunc_t get; + configmodule_getlistfunc_t getlist; + configmodule_endfunc_t end; + uint32_t numptrs; + uint32_t rtflags; + char *ptrs[CONFIG_MAX_ALLOCATEDPTRS]; +} configmodule_interface_t; + +#ifdef CONFIG_LOADCONFIG_MAIN +configmodule_interface_t *cfgptr=NULL; + +static char config_helpstr [] = "\n lte-softmodem -O [config mode]<:dbg[debugflags]> \n \ + debugflags can also be defined in the config_libconfig section of the config file\n \ + debugflags: mask, 1->print parameters, 2->print memory allocations debug messages\n \ + 4->print command line processing debug messages\n "; + +#define CONFIG_SECTIONNAME "config" +#define CONFIGPARAM_DEBUGFLAGS_IDX 0 + + +static paramdef_t Config_Params[] = { +/*-----------------------------------------------------------------------------------------------------------------------*/ +/* config parameters for config module */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*-----------------------------------------------------------------------------------------------------------------------*/ +{"debugflags", config_helpstr, 0, uptr:NULL, defintval:0, TYPE_MASK, 0}, +}; + +#else +extern configmodule_interface_t *cfgptr; +#endif + + +#define printf_params(...) if ( (cfgptr->rtflags & CONFIG_PRINTPARAMS) != 0 ) { printf ( __VA_ARGS__ ); } +#define printf_ptrs(...) if ( (cfgptr->rtflags & CONFIG_DEBUGPTR) != 0 ) { printf ( __VA_ARGS__ ); } +#define printf_cmdl(...) if ( (cfgptr->rtflags & CONFIG_DEBUGCMDLINE) != 0 ) { printf ( __VA_ARGS__ ); } + +extern configmodule_interface_t *load_configmodule(int argc, char **argv); +extern void end_configmodule(void); + +#endif /* INCLUDE_CONFIG_LOADCONFIGMODULE_H */ diff --git a/common/config/config_paramdesc.h b/common/config/config_paramdesc.h new file mode 100644 index 0000000000..a7de5e3098 --- /dev/null +++ b/common/config/config_paramdesc.h @@ -0,0 +1,120 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/config/config_paramdesc.h + * \brief configuration module, include file describing parameters, common to all implementations + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#include +#ifndef INCLUDE_CONFIG_PARAMDESC_H +#define INCLUDE_CONFIG_PARAMDESC_H + + + + + +#define MAX_OPTNAME_SIZE 64 + + + +/* parameter flags definitions */ +/* Flags to be used by calling modules in their parameters definitions to modify config module behavior*/ +#define PARAMFLAG_MANDATORY (1 << 0) // parameter must be explicitely set, default value ignored +#define PARAMFLAG_DISABLECMDLINE (1 << 1) // parameter cannot bet set from comand line +#define PARAMFLAG_DONOTREAD (1 << 2) // parameter must be ignored in get function +#define PARAMFLAG_NOFREE (1 << 3) // don't free parameter in end function +#define PARAMFLAG_BOOL (1 << 4) // integer param can be 0 or 1 + + +/* Flags used by config modules to return info to calling modules and/or to for internal usage*/ +#define PARAMFLAG_MALLOCINCONFIG (1 << 15) // parameter allocated in config module +#define PARAMFLAG_PARAMSET (1 << 16) // parameter has been explicitely set in get functions +#define PARAMFLAG_PARAMSETDEF (1 << 17) // parameter has been set to default value in get functions + +typedef struct paramdef +{ + char optname[MAX_OPTNAME_SIZE]; /* parameter name, can be used as long command line option */ + char *helpstr; /* help string */ + unsigned int paramflags; /* value is a "ored" combination of above PARAMFLAG_XXXX values */ + union { /* pointer to the parameter value, completed by the config module */ + char **strptr; + char **strlistptr; + uint8_t *u8ptr; + char *i8ptr; + uint16_t *u16ptr; + int16_t *i16ptr; + uint32_t *uptr; + int32_t *iptr; + uint64_t *u64ptr; + int64_t *i64ptr; + double *dblptr; + } ; + union { /* default parameter value, to be used when PARAMFLAG_MANDATORY is not specified */ + char *defstrval; + char **defstrlistval; + uint32_t defuintval; + int defintval; + uint64_t defint64val; + int *defintarrayval; + double defdblval; + } ; + char type; /* parameter value type, as listed below as TYPE_XXXX macro */ + int numelt; /* number of elements in a list or array parameters or max size of string value */ +} paramdef_t; + +#define TYPE_INT TYPE_INT32 +#define TYPE_UINT TYPE_UINT32 +#define TYPE_STRING 1 +#define TYPE_INT8 2 +#define TYPE_UINT8 3 +#define TYPE_INT16 4 +#define TYPE_UINT16 5 +#define TYPE_INT32 6 +#define TYPE_UINT32 7 +#define TYPE_INT64 8 +#define TYPE_UINT64 9 +#define TYPE_MASK 10 +#define TYPE_DOUBLE 16 +#define TYPE_IPV4ADDR 20 + + +#define TYPE_STRINGLIST 50 +#define TYPE_INTARRAY 51 +#define TYPE_UINTARRAY 52 +#define TYPE_LIST 55 + +#define ANY_IPV4ADDR_STRING "0.0.0.0" + +typedef struct paramlist_def { + char listname[MAX_OPTNAME_SIZE]; + paramdef_t **paramarray; + int numelt ; +} paramlist_def_t; + +/* macro helpers for module users */ +#define CONFIG_PARAMLENGTH(A) (sizeof(A)/sizeof(paramdef_t)) +#endif /* INCLUDE_CONFIG_PARAMDESC_H */ diff --git a/common/config/config_userapi.c b/common/config/config_userapi.c new file mode 100644 index 0000000000..acee5646cd --- /dev/null +++ b/common/config/config_userapi.c @@ -0,0 +1,158 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/config/config_userapi.c + * \brief configuration module, api implementation to access configuration parameters + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#include +#include +#include +#include +#include +#include +#include "config_userapi.h" + + +configmodule_interface_t *config_get_if(void) +{ + if (cfgptr == NULL) { + fprintf(stderr,"[CONFIG] %s %d config module not initialized\n",__FILE__, __LINE__); + exit(-1); + } + return cfgptr; +} + +char * config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) +{ + + printf_ptrs("[CONFIG] %s ptr: 0x%08lx requested size: %i\n",cfgoptions->optname,(uintptr_t)(ptr),length); + if(cfgoptions->numelt > 0) { /* already allocated */ + return *ptr; + } + + if (*ptr == NULL) { + *ptr = malloc(length); + if ( *ptr != NULL) { + memset(*ptr,0,length); + if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) != 0) { + config_get_if()->ptrs[config_get_if()->numptrs] = *ptr; + config_get_if()->numptrs++; + } + } else { + fprintf (stderr,"[CONFIG] %s %d malloc error\n",__FILE__, __LINE__); + exit(-1); + } + } + return *ptr; +} + +void config_assign_int(paramdef_t *cfgoptions, char *fullname, int val) +{ +int tmpval=val; + if ( ((cfgoptions->paramflags &PARAMFLAG_BOOL) != 0) && tmpval >1) { + tmpval =1; + } + switch (cfgoptions->type) { + case TYPE_UINT8: + *(cfgoptions->u8ptr) = (uint8_t)tmpval; + printf_params("[CONFIG] %s: %u\n", fullname, (uint8_t)tmpval); + break; + case TYPE_INT8: + *(cfgoptions->i8ptr) = (int8_t)tmpval; + printf_params("[CONFIG] %s: %i\n", fullname, (int8_t)tmpval); + break; + case TYPE_UINT16: + *(cfgoptions->u16ptr) = (uint16_t)tmpval; + printf_params("[CONFIG] %s: %hu\n", fullname, (uint16_t)tmpval); + break; + case TYPE_INT16: + *(cfgoptions->i16ptr) = (int16_t)tmpval; + printf_params("[CONFIG] %s: %hi\n", fullname, (int16_t)tmpval); + break; + case TYPE_UINT32: + *(cfgoptions->uptr) = (uint32_t)tmpval; + printf_params("[CONFIG] %s: %u\n", fullname, (uint32_t)tmpval); + break; + case TYPE_MASK: + *(cfgoptions->uptr) = *(cfgoptions->uptr) | (uint32_t)tmpval; + printf_params("[CONFIG] %s: 0x%08x\n", fullname, (uint32_t)tmpval); + break; + case TYPE_INT32: + *(cfgoptions->iptr) = (int32_t)tmpval; + printf_params("[CONFIG] %s: %i\n", fullname, (int32_t)tmpval); + break; + default: + fprintf (stderr,"[CONFIG] %s %i type %i non integer parameter %s not assigned\n",__FILE__, __LINE__,cfgoptions->type,fullname); + break; + } +} + +void config_printhelp(paramdef_t *params,int numparams) +{ + for (int i=0 ; iget(params, numparams,prefix); + if (ret >= 0) { + config_process_cmdline(params,numparams,prefix); + } + return ret; + } +return ret; +} + +int config_isparamset(paramdef_t *params,int paramidx) +{ + if ((params[paramidx].paramflags & PARAMFLAG_PARAMSET) != 0) { + return 1; + } else { + return 0; + } +} + +int config_getparamval_fromparamdefidx(paramdef_t *cfgoptions,int paramidx) { + return -1; +} diff --git a/common/config/config_userapi.h b/common/config/config_userapi.h new file mode 100644 index 0000000000..5bbc20a950 --- /dev/null +++ b/common/config/config_userapi.h @@ -0,0 +1,65 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/config/config_userapi.h + * \brief: configuration module, include file to be used by the source code calling the + * configuration module to access configuration parameters + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#ifndef INCLUDE_CONFIG_USERAPI_H +#define INCLUDE_CONFIG_USERAPI_H +#include "config_load_configmodule.h" + +#ifdef __cplusplus +extern "C" +{ +#endif +#define DEFAULT_CFGFILENAME "oaisoftmodem.conf" +#define DEFAULT_CFGMODE "libconfig" + +#define CONFIG_GETSOURCE ( (config_get_if()==NULL) ? NULL : config_get_if()->cfgmode ) +#define CONFIG_GETNUMP ( (config_get_if()==NULL) ? 0 : config_get_if()->num_cfgP ) +#define CONFIG_GETP(P) ( (config_get_if()==NULL) ? NULL : config_get_if()->cfgP[P] ) +#define CONFIG_ISFLAGSET(P) ( (config_get_if()==NULL) ? 0 : !!(config_get_if()->rtflags & P)) + +extern configmodule_interface_t *config_get_if(void); +extern char * config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) ; +extern void config_printhelp(paramdef_t *,int numparams); +extern int config_process_cmdline(paramdef_t *params,int numparams, char *prefix); +extern int config_get(paramdef_t *params,int numparams, char *prefix); +extern int config_isparamset(paramdef_t *params,int paramidx); +extern void config_assign_int(paramdef_t *cfgoptions, char *fullname, int val); +extern int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix); +extern int config_getparamval_fromparamdefidx(paramdef_t *cfgoptions,int paramidx); +#define config_getlist config_get_if()->getlist +#define CONFIG_GETCONFFILE (config_get_if()->cfgP[0]) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/common/config/libconfig/config_libconfig.c b/common/config/libconfig/config_libconfig.c new file mode 100644 index 0000000000..00f5f38b8f --- /dev/null +++ b/common/config/libconfig/config_libconfig.c @@ -0,0 +1,379 @@ +#define _GNU_SOURCE +#include + +#include +#include + +#include + +#include "config_libconfig.h" +#include "config_libconfig_private.h" +#include "../config_userapi.h" +#include "errno.h" + +#if ( LIBCONFIG_VER_MAJOR == 1 && LIBCONFIG_VER_MINOR < 5) +#define config_setting_lookup config_lookup_from +#endif + +void config_libconfig_end(void ); + +int read_strlist(paramdef_t *cfgoptions,config_setting_t *setting, char *cfgpath) +{ +const char *str; +int st; + + cfgoptions->numelt=config_setting_length(setting); + cfgoptions->strlistptr=malloc(sizeof(char *) * (cfgoptions->numelt)); + st=0; + for (int i=0; i< cfgoptions->numelt && cfgoptions->strlistptr != NULL; i++) { + str=config_setting_get_string_elem(setting,i); + if (str==NULL) { + printf("[LIBCONFIG] %s%i not found in config file\n", cfgoptions->optname,i); + } else { + cfgoptions->strlistptr[i]=malloc(strlen(str)+1); + sprintf(cfgoptions->strlistptr[i],"%s",str); + st++; + printf_params("[LIBCONFIG] %s%i: %s\n", cfgpath,i,cfgoptions->strlistptr[i]); + } + } + return st; +} + +int read_intarray(paramdef_t *cfgoptions,config_setting_t *setting, char *cfgpath) +{ + + cfgoptions->numelt=config_setting_length(setting); + + if (cfgoptions->numelt > 0) { + cfgoptions->iptr=malloc(sizeof(int) * (cfgoptions->numelt)); + for (int i=0; i< cfgoptions->numelt && cfgoptions->iptr != NULL; i++) { + cfgoptions->iptr[i]=config_setting_get_int_elem(setting,i); + printf_params("[LIBCONFIG] %s[%i]: %i\n", cfgpath,i,cfgoptions->iptr[i]); + } /* for loop on array element... */ + } + return cfgoptions->numelt; +} + + + + +int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix ) +{ + + + config_setting_t *setting; + char *str; + int i,u; + long long int llu; + double dbl; + int rst; + int status=0; + int notfound; + int defval; + int fatalerror=0; + char *cfgpath; /* listname.[listindex].paramname */ + int numdefvals=0; + + i = (prefix ==NULL) ? 0 : strlen(prefix); + cfgpath = malloc( i+ MAX_OPTNAME_SIZE +1); + if (cfgpath == NULL) { + fprintf(stderr,"[LIBCONFIG] %s %i malloc error, %s\n", __FILE__, __LINE__,strerror(errno)); + return -1; + } + for(i=0;iparamflags & PARAMFLAG_DONOTREAD) != 0) { + printf_params("[LIBCONFIG] %s.%s ignored\n", cfgpath,cfgoptions[i].optname ); + continue; + } + notfound=0; + defval=0; + switch(cfgoptions[i].type) + { + case TYPE_STRING: + + if ( config_lookup_string(&(libconfig_privdata.cfg),cfgpath, (const char **)&str)) { + if ( cfgoptions[i].numelt > 0 && str != NULL && strlen(str) >= cfgoptions[i].numelt ) { + fprintf(stderr,"[LIBCONFIG] %s: %s exceeds maximum length of %i bytes, value truncated\n", + cfgpath,str,cfgoptions[i].numelt); + str[strlen(str)-1] = 0; + } + if (cfgoptions[i].numelt == 0 ) { + config_check_valptr(&(cfgoptions[i]), (char **)(&(cfgoptions[i].strptr)), sizeof(char *)); + config_check_valptr(&(cfgoptions[i]), cfgoptions[i].strptr, strlen(str)+1); + sprintf( *(cfgoptions[i].strptr) , "%s", str); + printf_params("[LIBCONFIG] %s: %s\n", cfgpath,*(cfgoptions[i].strptr) ); + } else { + sprintf( (char *)(cfgoptions[i].strptr) , "%s", str); + printf_params("[LIBCONFIG] %s: %s\n", cfgpath,(char *)cfgoptions[i].strptr ); + } + } else { + if( cfgoptions[i].defstrval != NULL) { + defval=1; + + if (cfgoptions[i].numelt == 0 ) { + config_check_valptr(&(cfgoptions[i]), (char **)(&(cfgoptions[i].strptr)), sizeof(char *)); + config_check_valptr(&(cfgoptions[i]), cfgoptions[i].strptr, strlen(cfgoptions[i].defstrval)+1); + sprintf(*(cfgoptions[i].strptr), "%s",cfgoptions[i].defstrval); + printf_params("[LIBCONFIG] %s set to default value %s\n", cfgpath, *(cfgoptions[i].strptr)); + } else { + sprintf((char *)(cfgoptions[i].strptr), "%s",cfgoptions[i].defstrval); + printf_params("[LIBCONFIG] %s set to default value %s\n", cfgpath, (char *)cfgoptions[i].strptr); + } + } else { + notfound=1; + } + } + break; + case TYPE_STRINGLIST: + setting = config_setting_lookup (config_root_setting(&(libconfig_privdata.cfg)),cfgpath ); + if ( setting != NULL) { + read_strlist(&cfgoptions[i],setting,cfgpath); + } else { + if( cfgoptions[i].defstrlistval != NULL) { + cfgoptions[i].strlistptr=cfgoptions[i].defstrlistval; + defval=1; + for(int j=0; j 0) { + printf_params("[LIBCONFIG] %s: %s\n", cfgpath,str ); + } else { + if ( strncmp(str,ANY_IPV4ADDR_STRING,sizeof(ANY_IPV4ADDR_STRING)) == 0) { + printf_params("[LIBCONFIG] %s:%s (INADDR_ANY) \n",cfgpath,str); + *cfgoptions[i].uptr=INADDR_ANY; + } else { + fprintf(stderr,"[LIBCONFIG] %s not valid for %s \n", str, cfgpath); + fatalerror=1; + } + } + } else { + notfound=1; + } + + break; + case TYPE_LIST: + setting = config_setting_lookup (config_root_setting(&(libconfig_privdata.cfg)),cfgpath ); + if ( setting) { + cfgoptions[i].numelt=config_setting_length(setting); + } else { + notfound=1; + } + break; + default: + fprintf(stderr,"[LIBCONFIG] %s type %i not supported\n", cfgpath,cfgoptions[i].type); + fatalerror=1; + break; + } /* switch on param type */ + if( notfound == 1) { + printf("[LIBCONFIG] %s not found in %s ", cfgpath,libconfig_privdata.configfile ); + if ( (cfgoptions[i].paramflags & PARAMFLAG_MANDATORY) != 0) { + fatalerror=1; + printf(" mandatory parameter missing\n"); + } else { + printf("\n"); + } + } else { + if (defval == 1) { + numdefvals++; + cfgoptions[i].paramflags = cfgoptions[i].paramflags | PARAMFLAG_PARAMSETDEF; + } else { + cfgoptions[i].paramflags = cfgoptions[i].paramflags | PARAMFLAG_PARAMSET; + } + status++; + } + } /* for loop on options */ + printf("[LIBCONFIG] %s: %i/%i parameters successfully set, (%i to default value)\n", + ((prefix == NULL)?"(root)":prefix), + status,numoptions,numdefvals ); + if (fatalerror == 1) { + fprintf(stderr,"[LIBCONFIG] fatal errors found when processing %s \n", libconfig_privdata.configfile ); + config_libconfig_end(); + end_configmodule(); + } + free(cfgpath); + return status; +} + +int config_libconfig_getlist(paramlist_def_t *ParamList, + paramdef_t *params, int numparams, char *prefix) +{ +config_setting_t *setting; +int i,j,status; +char *listpath=NULL; +char cfgpath[MAX_OPTNAME_SIZE*2 + 6]; /* prefix.listname.[listindex] */ + + if (prefix != NULL) + { + i=asprintf(&listpath ,"%s.%s",prefix,ParamList->listname); + } + else + { + i=asprintf(&listpath ,"%s",ParamList->listname); + } + setting = config_lookup(&(libconfig_privdata.cfg), listpath); + if ( setting) { + status = ParamList->numelt = config_setting_length(setting); + printf_params("[LIBCONFIG] %i %s in config file %s \n", + ParamList->numelt,listpath,libconfig_privdata.configfile ); + } else { + printf("[LIBCONFIG] list %s not found in config file %s \n", + listpath,libconfig_privdata.configfile ); + ParamList->numelt= 0; + status = -1; + } + if (ParamList->numelt > 0 && params != NULL) { + ParamList->paramarray = malloc(ParamList->numelt * sizeof(paramdef_t *)); + if ( ParamList->paramarray != NULL) { + config_get_if()->ptrs[config_get_if()->numptrs] = (char *)(ParamList->paramarray); + config_get_if()->numptrs++; + } else { + fprintf (stderr,"[LIBCONFIG] %s %d malloc error\n",__FILE__, __LINE__); + exit(-1); + } + for (i=0 ; i < ParamList->numelt ; i++) { + ParamList->paramarray[i] = malloc(numparams * sizeof(paramdef_t)); + if ( ParamList->paramarray[i] != NULL) { + config_get_if()->ptrs[config_get_if()->numptrs] = (char *)(ParamList->paramarray[i]); + config_get_if()->numptrs++; + } else { + fprintf (stderr,"[LIBCONFIG] %s %d malloc error\n",__FILE__, __LINE__); + exit(-1); + } + + memcpy(ParamList->paramarray[i], params, sizeof(paramdef_t)*numparams); + for (j=0;jparamarray[i][j].strptr = NULL ; + } + sprintf(cfgpath,"%s.[%i]",listpath,i); + config_libconfig_get(ParamList->paramarray[i], numparams, cfgpath ); + } /* for i... */ + } /* ParamList->numelt > 0 && params != NULL */ + if (listpath != NULL) + free(listpath); + return status; +} + +int config_libconfig_init(char *cfgP[], int numP) +{ + config_init(&(libconfig_privdata.cfg)); + libconfig_privdata.configfile = strdup((char *)cfgP[0]); + config_get_if()->numptrs=0; + memset(config_get_if()->ptrs,0,sizeof(void *) * CONFIG_MAX_ALLOCATEDPTRS); + + /* Read the file. If there is an error, report it and exit. */ + if(! config_read_file(&(libconfig_privdata.cfg), libconfig_privdata.configfile)) { + fprintf(stderr,"[LIBCONFIG] %s %d file %s - %d - %s\n",__FILE__, __LINE__, + libconfig_privdata.configfile, config_error_line(&(libconfig_privdata.cfg)), + config_error_text(&(libconfig_privdata.cfg))); + config_destroy(&(libconfig_privdata.cfg)); + printf( "\n"); + return -1; + } + + + return 0; +} + + +void config_libconfig_end(void ) +{ + config_destroy(&(libconfig_privdata.cfg)); + if ( libconfig_privdata.configfile != NULL ) { + free(libconfig_privdata.configfile); + } + +} diff --git a/common/config/libconfig/config_libconfig.h b/common/config/libconfig/config_libconfig.h new file mode 100644 index 0000000000..8013d602cf --- /dev/null +++ b/common/config/libconfig/config_libconfig.h @@ -0,0 +1,54 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/config/libconfig/config_libconfig.c + * \brief configuration module, include file for libconfig implementation + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#ifndef INCLUDE_CONFIG_LIBCONFIG_H +#define INCLUDE_CONFIG_LIBCONFIG_H + + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "common/config/config_paramdesc.h" + + + + +typedef struct libconfig_privatedata { + char *configfile; + config_t cfg; +} libconfig_privatedata_t; + +#ifdef __cplusplus +} +#endif +#endif /* INCLUDE_CONFIG_LIBCONFIG_H */ diff --git a/common/config/libconfig/config_libconfig_private.h b/common/config/libconfig/config_libconfig_private.h new file mode 100644 index 0000000000..022e0e6330 --- /dev/null +++ b/common/config/libconfig/config_libconfig_private.h @@ -0,0 +1,39 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/config/libconfig/config_libconfig_private.h + * \brief configuration module, include file for libconfig implementation + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ + + +static libconfig_privatedata_t libconfig_privdata; + + + + + diff --git a/common/ran_context.h b/common/ran_context.h new file mode 100644 index 0000000000..d1a75df38a --- /dev/null +++ b/common/ran_context.h @@ -0,0 +1,91 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/impl_defs_lte.h +* \brief LTE Physical channel configuration and variable structure definitions +* \author R. Knopp, F. Kaltenberger +* \date 2011 +* \version 0.1 +* \company Eurecom +* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr +* \note +* \warning +*/ + +#ifndef __RAN_CONTEXT_H__ +#define __RAN_CONTEXT_H__ + +#include +#include "COMMON/platform_constants.h" +#include "PHY/defs.h" +#include "PHY/types.h" +#include "PHY/impl_defs_top.h" +#include "PHY/impl_defs_lte.h" +#include "RRC/LITE/defs.h" +#include "ENB_APP/enb_config.h" + +#include "gtpv1u.h" +#include "NwGtpv1u.h" +#include "NwGtpv1uMsg.h" +#include "NwGtpv1uPrivate.h" +#include "gtpv1u_eNB_defs.h" + + + +typedef struct { + /// RAN context config file name + char *config_file_name; + /// Number of RRC instances in this node + int nb_inst; + /// Number of Component Carriers per instance in this node + int *nb_CC; + /// Number of MACRLC instances in this node + int nb_macrlc_inst; + /// Number of component carriers per instance in this node + int *nb_mac_CC; + /// Number of L1 instances in this node + int nb_L1_inst; + /// Number of Component Carriers per instance in this node + int *nb_L1_CC; + /// Number of RU instances in this node + int nb_RU; + /// eNB context variables + struct PHY_VARS_eNB_s ***eNB; + /// RRC context variables + struct eNB_RRC_INST_s **rrc; + /// RRC context variables + struct eNB_MAC_INST_s **mac; + /// GTPu descriptor + gtpv1u_data_t *gtpv1u_data_g; + /// RU descriptors. These describe what each radio unit is supposed to do and contain the necessary functions for fronthaul interfaces + struct RU_t_s **ru; + /// Mask to indicate fronthaul setup status of RU (hard-limit to 64 RUs) + uint64_t ru_mask; + /// Mutex for protecting ru_mask + pthread_mutex_t ru_mutex; + /// condition variable for signaling setup completion of an RU + pthread_cond_t ru_cond; + + struct cudu_params_s cudu; +} RAN_CONTEXT_t; + + +#endif diff --git a/common/utils/COPYING b/common/utils/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/common/utils/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/common/utils/Makefile.inc b/common/utils/Makefile.inc deleted file mode 100644 index b7a1c82379..0000000000 --- a/common/utils/Makefile.inc +++ /dev/null @@ -1,59 +0,0 @@ -export KERNEL_DIR=/lib/modules/$(shell uname -r)/ -CC=gcc -CCC=gcc -linux := $(shell if [ `uname` = "Linux" ] ; then echo "1" ; else echo "0" ; fi) - - -CFLAGS += -std=gnu99 -#CFLAGS += -Wall -g -ggdb -Wstrict-prototypes -fno-strict-aliasing - -# Need to force this option because default kernel module builder is wrong -CFLAGS += $(call cc-option,-mpreferred-stack-boundary=4) - -#For performance, if some option doesn't exist in all gcc versions, use $(call cc-option,MY_OPTION) -CFLAGS += -O2 -CFLAGS += -funroll-loops -CFLAGS += -Wno-packed-bitfield-compat - -# This is the minimum CPU faetures for OAI -CFLAGS += -mmmx -msse -msse2 -mssse3 -msse4.1 -# Add CPU features from local CPU -#CFLAGS += -march=native - -ifeq ($(OSTYPE),Cygwin) -cygwin=1 -CFLAGS += -DCYGWIN -else -cygwin=0 -endif - -ifeq ($(linux),1) -CFLAGS += -LDFLAGS += -endif - -ITTI_DIR = $(COMMON_UTILS_DIR)/itti - -ITTI_OBJS = $(ITTI_DIR)/intertask_interface.o -ITTI_OBJS += $(ITTI_DIR)/intertask_interface_dump.o -ITTI_OBJS += $(ITTI_DIR)/backtrace.o -ITTI_OBJS += $(ITTI_DIR)/memory_pools.o -ITTI_OBJS += $(ITTI_DIR)/signals.o -ITTI_OBJS += $(ITTI_DIR)/timer.o - - -HASHTABLE_DIR = $(COMMON_UTILS_DIR)/collection/hashtable -MSC_DIR = $(COMMON_UTILS_DIR)/msc - -HASHTABLE_OBJS = $(HASHTABLE_DIR)/hashtable.o -HASHTABLE_OBJS += $(HASHTABLE_DIR)/obj_hashtable.o - -UTILS_OBJS = $(ITTI_OBJS) $(HASHTABLE_OBJS) - -UTILS_incl = \ - -I$(COMMON_UTILS_DIR) \ - -I$(HASHTABLE_DIR) \ - -I$(ITTI_DIR) \ - -I$(MSC_DIR) - -print-% : ; @echo $* = $($*) diff --git a/common/utils/T/.gitignore b/common/utils/T/.gitignore index f5724e6ff8..8177805924 100644 --- a/common/utils/T/.gitignore +++ b/common/utils/T/.gitignore @@ -10,4 +10,9 @@ tracer/replay tracer/textlog tracer/vcd tracer/macpdu2wireshark +tracer/ue +tracer/to_vcd +tracer/extract_input_subframe +tracer/extract_output_subframe +tracer/extract tracee/tracee diff --git a/common/utils/T/README b/common/utils/T/README new file mode 100644 index 0000000000..3d601d9221 --- /dev/null +++ b/common/utils/T/README @@ -0,0 +1,4 @@ +All the files in this directory, unless stated otherwise, +are released under the terms of the main license of +OpenAirInterface. See the file LICENSE in the top +directory. diff --git a/common/utils/T/T.c b/common/utils/T/T.c index 5d84afa660..f1fce83538 100644 --- a/common/utils/T/T.c +++ b/common/utils/T/T.c @@ -36,7 +36,7 @@ static void get_message(int s) int is_on; if (read(s, &t, 1) != 1) QUIT("get_message fails"); -printf("got mess %d\n", t); +printf("T tracer: got mess %d\n", t); switch (t) { case 0: /* toggle all those IDs */ diff --git a/common/utils/T/T.h b/common/utils/T/T.h index 819615131e..37668a8309 100644 --- a/common/utils/T/T.h +++ b/common/utils/T/T.h @@ -184,8 +184,30 @@ extern T_cache_t *T_cache; } while (0) #endif +/* we have 4 versions of T_HEADER: + * - bad quality C++ version with time + * - good quality C version with time + * - bad quality C++ version without time + * - good quality C version without time + */ + #ifdef T_SEND_TIME +#ifdef __cplusplus + +/* C++ version of T_HEADER with time */ +#define T_HEADER(x) \ + do { \ + struct timespec T_HEADER_time; \ + if (clock_gettime(CLOCK_REALTIME, &T_HEADER_time)) abort(); \ + memcpy(T_LOCAL_buf, &T_HEADER_time, sizeof(struct timespec)); \ + T_LOCAL_size += sizeof(struct timespec); \ + T_PUT_int(1, (int)(uintptr_t)(x)); \ + } while (0) + +#else /* #ifdef __cplusplus */ + +/* C version of T_HEADER with time */ #define T_HEADER(x) \ do { \ if (!__builtin_types_compatible_p(typeof(x), struct T_header *)) { \ @@ -201,8 +223,21 @@ extern T_cache_t *T_cache; T_PUT_int(1, (int)(uintptr_t)(x)); \ } while (0) +#endif /* #ifdef __cplusplus */ + #else /* #ifdef T_SEND_TIME */ +#ifdef __cplusplus + +/* C++ version of T_HEADER without time */ +#define T_HEADER(x) \ + do { \ + T_PUT_int(1, (int)(uintptr_t)(x)); \ + } while (0) + +#else /* #ifdef __cplusplus */ + +/* C version of T_HEADER without time */ #define T_HEADER(x) \ do { \ if (!__builtin_types_compatible_p(typeof(x), struct T_header *)) { \ @@ -214,6 +249,8 @@ extern T_cache_t *T_cache; T_PUT_int(1, (int)(uintptr_t)(x)); \ } while (0) +#endif /* #ifdef __cplusplus */ + #endif /* #ifdef T_SEND_TIME */ #define T1(t) \ diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h index 9285a68d56..6bdda0edac 100644 --- a/common/utils/T/T_defs.h +++ b/common/utils/T/T_defs.h @@ -29,15 +29,15 @@ typedef struct { #define T_SHM_FILENAME "/T_shm_segment" /* number of VCD functions (to be kept up to date! see in T_messages.txt) */ -#define VCD_NUM_FUNCTIONS 146 +#define VCD_NUM_FUNCTIONS 187 /* number of VCD variables (to be kept up to date! see in T_messages.txt) */ -#define VCD_NUM_VARIABLES 99 +#define VCD_NUM_VARIABLES 128 /* first VCD function (to be kept up to date! see in T_messages.txt) */ #define VCD_FIRST_FUNCTION ((uintptr_t)T_VCD_FUNCTION_RT_SLEEP) /* first VCD variable (to be kept up to date! see in T_messages.txt) */ -#define VCD_FIRST_VARIABLE ((uintptr_t)T_VCD_VARIABLE_FRAME_NUMBER_TX_ENB) +#define VCD_FIRST_VARIABLE ((uintptr_t)T_VCD_VARIABLE_FRAME_NUMBER_TX0_ENB) #endif /* _T_defs_H_ */ diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index 050c48d0a9..8d531f9067 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -16,51 +16,67 @@ ID = ENB_PHY_DL_TICK ID = ENB_PHY_DLSCH_UE_DCI DESC = eNodeB downlink UE specific DCI as sent by the PHY layer GROUP = ALL:PHY:GRAPHIC:ENB - FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,dci_format : int,harq_pid + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS ID = ENB_PHY_DLSCH_UE_ACK DESC = eNodeB downlink UE ACK as seen by the PHY layer in process_HARQ_feedback GROUP = ALL:PHY:GRAPHIC:ENB - FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid ID = ENB_PHY_DLSCH_UE_NACK DESC = eNodeB downlink UE NACK as seen by the PHY layer in process_HARQ_feedback GROUP = ALL:PHY:GRAPHIC:ENB - FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid ID = ENB_PHY_ULSCH_UE_DCI DESC = eNodeB uplink UE specific DCI as sent by the PHY layer GROUP = ALL:PHY:GRAPHIC:ENB - FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid : int,mcs : int,round : int,first_rb : int,nb_rb : int,TBS : int,L : int,firstCCE ID = ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION DESC = eNodeB uplink UE retransmission due to PHICH NACK (see generate_phich_top) GROUP = ALL:PHY:GRAPHIC:ENB - FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid ID = ENB_PHY_ULSCH_UE_ACK DESC = eNodeB uplink UE ACK as seen by the PHY layer GROUP = ALL:PHY:GRAPHIC:ENB - FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid ID = ENB_PHY_ULSCH_UE_NACK DESC = eNodeB uplink UE NACK as seen by the PHY layer GROUP = ALL:PHY:GRAPHIC:ENB - FORMAT = int,eNB_ID : int,frame : int,subframe : int,UE_id : int,rnti : int,harq_pid + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid ID = ENB_PHY_INPUT_SIGNAL DESC = eNodeB received signal in the time domain for a duration of 1ms GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,rxdata +ID = ENB_PHY_OUTPUT_SIGNAL + DESC = eNodeB sent signal in the time domain for a duration of 1ms + GROUP = ALL:PHY:HEAVY:ENB + FORMAT = int,eNB_ID : int,CC_id : int,frame : int,subframe : int,antenna : buffer,txdata ID = ENB_PHY_UL_CHANNEL_ESTIMATE DESC = eNodeB channel estimation in the time domain GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB - FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,antenna : buffer,chest_t + FORMAT = int,eNB_ID : int,rnti : int,frame : int,subframe : int,antenna : buffer,chest_t ID = ENB_PHY_PUSCH_IQ DESC = eNodeB PUSCH received IQ data GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB - FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,nb_rb : int,N_RB_UL : int,symbols_per_tti : buffer,pusch_comp + FORMAT = int,eNB_ID : int,rnti : int,frame : int,subframe : int,nb_rb : int,N_RB_UL : int,symbols_per_tti : buffer,pusch_comp ID = ENB_PHY_PUCCH_1AB_IQ DESC = eNodeB PUCCH received IQ data GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB - FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,I : int,Q + FORMAT = int,eNB_ID : int,rnti : int,frame : int,subframe : int,I : int,Q ID = ENB_PHY_PUCCH_1_ENERGY DESC = eNodeB PUCCH 1 energy and threshold GROUP = ALL:PHY:GRAPHIC:HEAVY:ENB - FORMAT = int,eNB_ID : int,UE_ID : int,frame : int,subframe : int,energy : int,threshold + FORMAT = int,eNB_ID : int,rnti : int,frame : int,subframe : int,energy : int,threshold +ID = ENB_PHY_PHICH + DESC = eNodeB PHICH + GROUP = ALL:PHY:ENB + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid : int,NGROUP : int,NSF : int,ngroup : int,nseq : int,ACK : int,first_rb : int,n_DMRS +ID = ENB_PHY_MSG3_ALLOCATION + DESC = eNodeB Msg3 allocation/reallocation + GROUP = ALL:PHY:ENB + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,first_transmission : int,Msg3_frame : int,Msg3_subframe +ID = ENB_PHY_INITIATE_RA_PROCEDURE + DESC = eNodeB initiates a random access procedure after detecting enough energy for one of the preambles + GROUP = ALL:PHY:ENB + FORMAT = int,eNB_ID : int,frame : int,subframe : int,preamble : int,energy : int,delay #MAC logs ID = ENB_MAC_UE_DL_SDU @@ -70,7 +86,7 @@ ID = ENB_MAC_UE_DL_SDU ID = ENB_MAC_UE_UL_SCHEDULE DESC = MAC uplink UE scheduling decision GROUP = ALL:MAC:ENB - FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,mcs : int,first_rb : int,nb_rb : int,TBS + FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,mcs : int,first_rb : int,nb_rb : int,TBS : int,ndi ID = ENB_MAC_UE_UL_SCHEDULE_RETRANSMISSION DESC = MAC uplink UE scheduling retransmission decision GROUP = ALL:MAC:ENB @@ -81,7 +97,7 @@ ID = ENB_MAC_UE_UL_PDU FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,sdu_length : int,num_ce : int,num_sdu ID = ENB_MAC_UE_UL_PDU_WITH_DATA DESC = MAC uplink UE received PDU - GROUP = ALL:MAC:ENB:HEAVY + GROUP = ALL:MAC:ENB FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : int,sdu_length : int,num_ce : int,num_sdu : buffer,data ID = ENB_MAC_UE_UL_SDU DESC = MAC uplink UE received SDU @@ -99,6 +115,10 @@ ID = ENB_MAC_UE_DL_PDU_WITH_DATA DESC = MAC downlink PDU for an UE GROUP = ALL:MAC:ENB FORMAT = int,eNB_ID : int,CC_id : int,rnti : int,frame : int,subframe : int,harq_pid : buffer,data +ID = ENB_MAC_SCHEDULING_REQUEST + DESC = MAC scheduling request detected for an UE + GROUP = ALL:MAC:ENB + FORMAT = int,eNB_ID : int,CC_id : int,frame : int,subframe : int,rnti #RLC logs ID = ENB_RLC_DL @@ -165,6 +185,10 @@ ID = ENB_RRC_CONNECTION_REESTABLISHMENT_REQUEST DESC = RRC connection reestablishment request GROUP = ALL:RRC:ENB FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti +ID = ENB_RRC_CONNECTION_REESTABLISHMENT + DESC = RRC connection reestablishment + GROUP = ALL:RRC:ENB + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti ID = ENB_RRC_CONNECTION_REESTABLISHMENT_COMPLETE DESC = RRC connection reestablishment complete GROUP = ALL:RRC:ENB @@ -411,6 +435,27 @@ ID = LEGACY_ENB_APP_TRACE GROUP = ALL:LEGACY_ENB_APP:LEGACY_GROUP_TRACE:LEGACY FORMAT = string,log +ID = LEGACY_FLEXRAN_AGENT_INFO + DESC = FLEXRAN_AGENT legacy logs - info level + GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_INFO:LEGACY + FORMAT = string,log +ID = LEGACY_FLEXRAN_AGENT_ERROR + DESC = FLEXRAN_AGENT legacy logs - error level + GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_ERROR:LEGACY + FORMAT = string,log +ID = LEGACY_FLEXRAN_AGENT_WARNING + DESC = FLEXRAN_AGENT legacy logs - warning level + GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_WARNING:LEGACY + FORMAT = string,log +ID = LEGACY_FLEXRAN_AGENT_DEBUG + DESC = FLEXRAN_AGENT legacy logs - debug level + GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_DEBUG:LEGACY + FORMAT = string,log +ID = LEGACY_FLEXRAN_AGENT_TRACE + DESC = FLEXRAN_AGENT legacy logs - trace level + GROUP = ALL:LEGACY_FLEXRAN_AGENT:LEGACY_GROUP_TRACE:LEGACY + FORMAT = string,log + ID = LEGACY_SCTP_INFO DESC = SCTP legacy logs - info level GROUP = ALL:LEGACY_SCTP:LEGACY_GROUP_INFO:LEGACY @@ -772,6 +817,85 @@ ID = LEGACY_CLI_TRACE GROUP = ALL:LEGACY_CLI:LEGACY_GROUP_TRACE:LEGACY FORMAT = string,log +################# +#### UE LOGS #### +################# +#general logs +ID = UE_MASTER_TICK + DESC = UE master tick - one tick per ms, to be used as "reference clock", mostly for ticktime view + GROUP = ALL:GENERAL:UE + FORMAT = int,eNB_ID : int,frame : int,subframe + +#PHY logs +ID = UE_PHY_UL_TICK + DESC = UE uplink tick - one tick per ms at start of uplink processing + GROUP = ALL:PHY:GRAPHIC:UE + FORMAT = int,eNB_ID : int,frame : int,subframe +ID = UE_PHY_DL_TICK + DESC = UE downlink tick - one tick per ms at start of downlink processing + GROUP = ALL:PHY:GRAPHIC:UE + FORMAT = int,eNB_ID : int,frame : int,subframe +ID = UE_PHY_DLSCH_UE_DCI + DESC = UE downlink UE specific DCI as sent by the PHY layer + GROUP = ALL:PHY:GRAPHIC:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS +ID = UE_PHY_DLSCH_UE_ACK + DESC = UE downlink UE ACK as seen by the PHY layer in process_HARQ_feedback + GROUP = ALL:PHY:GRAPHIC:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid +ID = UE_PHY_DLSCH_UE_NACK + DESC = UE downlink UE NACK as seen by the PHY layer in process_HARQ_feedback + GROUP = ALL:PHY:GRAPHIC:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid +ID = UE_PHY_ULSCH_UE_DCI + DESC = UE uplink UE specific DCI as sent by the PHY layer + GROUP = ALL:PHY:GRAPHIC:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid : int,mcs : int,round : int,first_rb : int,nb_rb : int,TBS +ID = UE_PHY_ULSCH_UE_ACK + DESC = UE uplink UE ACK as seen by the PHY layer + GROUP = ALL:PHY:GRAPHIC:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid +ID = UE_PHY_ULSCH_UE_NACK + DESC = UE uplink UE NACK as seen by the PHY layer + GROUP = ALL:PHY:GRAPHIC:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,harq_pid +ID = UE_PHY_INPUT_SIGNAL + DESC = UE received signal in the time domain for a duration of 1ms + GROUP = ALL:PHY:GRAPHIC:HEAVY:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,rxdata +ID = UE_PHY_DL_CHANNEL_ESTIMATE + DESC = UE channel estimation in the time domain + GROUP = ALL:PHY:GRAPHIC:HEAVY:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,antenna : buffer,chest_t +ID = UE_PHY_PDCCH_IQ + DESC = UE PDCCH received IQ data + GROUP = ALL:PHY:GRAPHIC:HEAVY:UE + FORMAT = int,nb_rb : int,NB_RB_DL : int,symbols_per_tti : buffer,rxdataF_comp +ID = UE_PHY_PDCCH_ENERGY + DESC = UE PDSCH 1 energy and threshold + GROUP = ALL:PHY:GRAPHIC:HEAVY:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,pdcch_ch_level00 : int,pdcch_ch_level01 : int,pdcch_ch_level10: int,pdcch_ch_level11 +ID = UE_PHY_PDSCH_IQ + DESC = UE PDSCH received IQ data + GROUP = ALL:PHY:GRAPHIC:HEAVY:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,nb_rb : int,N_RB_UL : int,symbols_per_tti : buffer,pusch_comp +ID = UE_PHY_PDSCH_ENERGY + DESC = UE PDSCH 1 energy and threshold + GROUP = ALL:PHY:GRAPHIC:HEAVY:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,pdsch_ch_level00 : int,pdsch_ch_level01 : int,pdsch_ch_level10: int,pdsch_ch_level11 +ID = UE_PHY_PUSCH_TX_POWER + DESC = UE PUSCH tx power + GROUP = ALL:PHY:GRAPHIC:HEAVY:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,p0_pusch : int,ampl: int,g_pusch: int,pl: int,nb_rb +ID = UE_PHY_PUCCH_TX_POWER + DESC = UE PDSCH 1 energy and threshold + GROUP = ALL:PHY:GRAPHIC:HEAVY:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,p0_pucch : int,ampl: int,g_pucch: int,pl +ID = UE_PHY_MEAS + DESC = UE PHY measurements + GROUP = ALL:PHY:GRAPHIC:HEAVY:UE + FORMAT = int,eNB_ID : int,frame : int,subframe : int,rsrp : int,rssi : int,snr: int,rx_power: int,noise_power: int,w_cqi: int,freq_offset + #for debug/test - not used ID = first ID = buf_test @@ -806,12 +930,68 @@ ID = buf_test #variables -ID = VCD_VARIABLE_FRAME_NUMBER_TX_ENB - DESC = VCD variable FRAME_NUMBER_TX_ENB +ID = VCD_VARIABLE_FRAME_NUMBER_TX0_ENB + DESC = VCD variable FRAME_NUMBER_TX0_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value -ID = VCD_VARIABLE_FRAME_NUMBER_RX_ENB - DESC = VCD variable FRAME_NUMBER_RX_ENB +ID = VCD_VARIABLE_FRAME_NUMBER_TX1_ENB + DESC = VCD variable FRAME_NUMBER_TX1_ENB + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_FRAME_NUMBER_RX0_ENB + DESC = VCD variable FRAME_NUMBER_RX0_ENB + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_FRAME_NUMBER_RX1_ENB + DESC = VCD variable FRAME_NUMBER_RX1_ENB + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_ENB + DESC = VCD variable SUBFRAME_NUMBER_TX0_ENB + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_ENB + DESC = VCD variable SUBFRAME_NUMBER_TX1_ENB + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_ENB + DESC = VCD variable SUBFRAME_NUMBER_RX0_ENB + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_ENB + DESC = VCD variable SUBFRAME_NUMBER_RX1_ENB + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_FRAME_NUMBER_TX0_RU + DESC = VCD variable FRAME_NUMBER_TX0_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_FRAME_NUMBER_TX1_RU + DESC = VCD variable FRAME_NUMBER_TX1_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_FRAME_NUMBER_RX0_RU + DESC = VCD variable FRAME_NUMBER_RX0_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_FRAME_NUMBER_RX1_RU + DESC = VCD variable FRAME_NUMBER_RX1_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_RU + DESC = VCD variable SUBFRAME_NUMBER_TX0_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_RU + DESC = VCD variable SUBFRAME_NUMBER_TX1_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_RU + DESC = VCD variable SUBFRAME_NUMBER_RX0_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_RU + DESC = VCD variable SUBFRAME_NUMBER_RX1_RU GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value ID = VCD_VARIABLE_RUNTIME_TX_ENB @@ -822,28 +1002,36 @@ ID = VCD_VARIABLE_RUNTIME_RX_ENB DESC = VCD variable RUNTIME_RX_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value -ID = VCD_VARIABLE_FRAME_NUMBER_TX_UE - DESC = VCD variable FRAME_NUMBER_TX_UE +ID = VCD_VARIABLE_FRAME_NUMBER_TX0_UE + DESC = VCD variable FRAME_NUMBER_TX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value -ID = VCD_VARIABLE_FRAME_NUMBER_RX_UE - DESC = VCD variable FRAME_NUMBER_RX_UE +ID = VCD_VARIABLE_FRAME_NUMBER_TX1_UE + DESC = VCD variable FRAME_NUMBER_TX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value -ID = VCD_VARIABLE_SLOT_NUMBER_TX_UE - DESC = VCD variable SLOT_NUMBER_TX_UE +ID = VCD_VARIABLE_FRAME_NUMBER_RX0_UE + DESC = VCD variable FRAME_NUMBER_RX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value -ID = VCD_VARIABLE_SLOT_NUMBER_RX_UE - DESC = VCD variable SLOT_NUMBER_RX_UE +ID = VCD_VARIABLE_FRAME_NUMBER_RX1_UE + DESC = VCD variable FRAME_NUMBER_RX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value -ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX_UE - DESC = VCD variable SUBFRAME_NUMBER_TX_UE +ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_UE + DESC = VCD variable SUBFRAME_NUMBER_TX0_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value -ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX_UE - DESC = VCD variable SUBFRAME_NUMBER_RX_UE +ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_UE + DESC = VCD variable SUBFRAME_NUMBER_TX1_UE + GROUP = ALL:VCD:UE:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_UE + DESC = VCD variable SUBFRAME_NUMBER_RX0_UE + GROUP = ALL:VCD:UE:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_UE + DESC = VCD variable SUBFRAME_NUMBER_RX1_UE GROUP = ALL:VCD:UE:VCD_VARIABLE FORMAT = ulong,value ID = VCD_VARIABLE_MISSED_SLOTS_ENB @@ -898,6 +1086,18 @@ ID = VCD_VARIABLE_TRX_TST DESC = VCD variable TRX_TST GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value +ID = VCD_VARIABLE_TRX_TS_UE + DESC = VCD variable TRX_TS_UE + GROUP = ALL:VCD:UE:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_TRX_TST_UE + DESC = VCD variable TRX_TST_UE + GROUP = ALL:VCD:UE:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_TRX_WRITE_FLAGS + DESC = VCD variable TRX_WRITE_FLAGS + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value ID = VCD_VARIABLE_TX_TS DESC = VCD variable TX_TS GROUP = ALL:VCD:ENB:VCD_VARIABLE @@ -1202,6 +1402,46 @@ ID = VCD_VARIABLE_UE0_SFN7 DESC = VCD variable UE0_SFN7 GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value +ID = VCD_VARIABLE_SEND_IF4_SYMBOL + DESC = VCD variable SEND_IF4_SYMBOL + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_RECV_IF4_SYMBOL + DESC = VCD variable RECV_IF4_SYMBOL + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SEND_IF5_PKT_ID + DESC = VCD variable SEND_IF5_PKT_ID + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_RECV_IF5_PKT_ID + DESC = VCD variable RECV_IF5_PKT_ID + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_UE_PDCP_FLUSH_SIZE + DESC = VCD variable UE_PDCP_FLUSH_SIZE + GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_UE_PDCP_FLUSH_ERR + DESC = VCD variable UE_PDCP_FLUSH_ERR + GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_UE0_TRX_READ_NS + DESC = VCD variable UE0_TRX_READ_NS + GROUP = ALL:VCD:UE:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_UE0_TRX_WRITE_NS + DESC = VCD variable UE0_TRX_WRITE_NS + GROUP = ALL:VCD:UE:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_UE0_TRX_READ_NS_MISSING + DESC = VCD variable UE0_TRX_READ_NS_MISSING + GROUP = ALL:VCD:UE:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_UE0_TRX_WRITE_NS_MISSING + DESC = VCD variable UE0_TRX_WRITE_NS_MISSING + GROUP = ALL:VCD:UE:VCD_VARIABLE + FORMAT = ulong,value #functions @@ -1217,92 +1457,88 @@ ID = VCD_FUNCTION_TRX_WRITE DESC = VCD function TRX_WRITE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_TX0 - DESC = VCD function eNB_PROC_TX0 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_RX0 - DESC = VCD function eNB_PROC_RX0 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_TX1 - DESC = VCD function eNB_PROC_TX1 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_RX1 - DESC = VCD function eNB_PROC_RX1 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_TX2 - DESC = VCD function eNB_PROC_TX2 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_RX2 - DESC = VCD function eNB_PROC_RX2 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_TX3 - DESC = VCD function eNB_PROC_TX3 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_RX3 - DESC = VCD function eNB_PROC_RX3 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_TX4 - DESC = VCD function eNB_PROC_TX4 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_RX4 - DESC = VCD function eNB_PROC_RX4 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_TX5 - DESC = VCD function eNB_PROC_TX5 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_RX5 - DESC = VCD function eNB_PROC_RX5 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_TX6 - DESC = VCD function eNB_PROC_TX6 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_RX6 - DESC = VCD function eNB_PROC_RX6 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_TX7 - DESC = VCD function eNB_PROC_TX7 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_RX7 - DESC = VCD function eNB_PROC_RX7 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_TX8 - DESC = VCD function eNB_PROC_TX8 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_RX8 - DESC = VCD function eNB_PROC_RX8 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_TX9 - DESC = VCD function eNB_PROC_TX9 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_eNB_PROC_RX9 - DESC = VCD function eNB_PROC_RX9 - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value -ID = VCD_FUNCTION_UE_THREAD_TX - DESC = VCD function UE_THREAD_TX +ID = VCD_FUNCTION_TRX_READ_UE + DESC = VCD function TRX_READ_UE GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value -ID = VCD_FUNCTION_UE_THREAD_RX - DESC = VCD function UE_THREAD_RX +ID = VCD_FUNCTION_TRX_WRITE_UE + DESC = VCD function TRX_WRITE_UE + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_TRX_READ_IF + DESC = VCD function TRX_READ_IF + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_TRX_WRITE_IF + DESC = VCD function TRX_WRITE_IF + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_eNB_PROC_RXTX0 + DESC = VCD function eNB_PROC_RXTX0 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_eNB_PROC_RXTX1 + DESC = VCD function eNB_PROC_RXTX1 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_THREAD_SYNCH + DESC = VCD function UE_THREAD_SYNCH + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_THREAD_RXTX0 + DESC = VCD function UE_THREAD_RXTX0 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_THREAD_RXTX1 + DESC = VCD function UE_THREAD_RXTX1 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_TRX_READ_SF9 + DESC = VCD function TRX_READ_SF9 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_TRX_WRITE_SF9 + DESC = VCD function TRX_WRITE_SF9 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX0 + DESC = VCD function UE_SIGNAL_COND_RXTX0 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX1 + DESC = VCD function UE_SIGNAL_COND_RXTX1 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_WAIT_COND_RXTX0 + DESC = VCD function UE_WAIT_COND_RXTX0 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_WAIT_COND_RXTX1 + DESC = VCD function UE_WAIT_COND_RXTX1 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0 + DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1 + DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0 + DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1 + DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0 + DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0 + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1 + DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1 GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value ID = VCD_FUNCTION_eNB_TX @@ -1377,8 +1613,40 @@ ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX DESC = VCD function PHY_PROCEDURES_ENB_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value -ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX - DESC = VCD function PHY_PROCEDURES_ENB_RX +ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX1 + DESC = VCD function PHY_PROCEDURES_ENB_TX1 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX + DESC = VCD function PHY_PROCEDURES_RU_FEPRX + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX1 + DESC = VCD function PHY_PROCEDURES_RU_FEPRX1 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM + DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM1 + DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM1 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC + DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC1 + DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC1 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC + DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC1 + DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX @@ -1389,6 +1657,26 @@ ID = VCD_FUNCTION_PHY_PROCEDURES_UE_RX DESC = VCD function PHY_PROCEDURES_UE_RX GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC + DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_UESPEC + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PUCCH + DESC = VCD function PHY_PROCEDURES_UE_TX_PUCCH + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_COMMON + DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_COMMON + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PRACH + DESC = VCD function PHY_PROCEDURES_UE_TX_PRACH + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_RAR + DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_RAR + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_LTE DESC = VCD function PHY_PROCEDURES_ENB_LTE GROUP = ALL:VCD:ENB:VCD_FUNCTION @@ -1477,6 +1765,22 @@ ID = VCD_FUNCTION_RX_PHICH DESC = VCD function RX_PHICH GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value +ID = VCD_FUNCTION_PDSCH_PROC + DESC = VCD function PDSCH_PROC + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PDSCH_PROC_SI + DESC = VCD function PDSCH_PROC_SI + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PDSCH_PROC_P + DESC = VCD function PDSCH_PROC_P + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PDSCH_PROC_RA + DESC = VCD function PDSCH_PROC_RA + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value ID = VCD_FUNCTION_PHY_UE_CONFIG_SIB2 DESC = VCD function PHY_UE_CONFIG_SIB2 GROUP = ALL:VCD:UE:VCD_FUNCTION @@ -1541,6 +1845,10 @@ ID = VCD_FUNCTION_PHY_ENB_PRACH_RX DESC = VCD function PHY_ENB_PRACH_RX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value +ID = VCD_FUNCTION_PHY_RU_PRACH_RX + DESC = VCD function PHY_RU_PRACH_RX + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value ID = VCD_FUNCTION_PHY_ENB_PDCCH_TX DESC = VCD function PHY_ENB_PDCCH_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION @@ -1561,6 +1869,10 @@ ID = VCD_FUNCTION_UE_ULSCH_ENCODING DESC = VCD function UE_ULSCH_ENCODING GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value +ID = VCD_FUNCTION_UE_ULSCH_ENCODING_FILL_CQI + DESC = VCD function UE_ULSCH_ENCODING_FILL_CQI + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value ID = VCD_FUNCTION_UE_ULSCH_SCRAMBLING DESC = VCD function UE_ULSCH_SCRAMBLING GROUP = ALL:VCD:UE:VCD_FUNCTION @@ -1573,10 +1885,22 @@ ID = VCD_FUNCTION_ENB_DLSCH_ENCODING DESC = VCD function ENB_DLSCH_ENCODING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value +ID = VCD_FUNCTION_ENB_DLSCH_ENCODING_W + DESC = VCD function ENB_DLSCH_ENCODING_W + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value ID = VCD_FUNCTION_ENB_DLSCH_SCRAMBLING DESC = VCD function ENB_DLSCH_SCRAMBLING GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value +ID = VCD_FUNCTION_ENB_BEAM_PRECODING + DESC = VCD function ENB_BEAM_PRECODING + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_ENB_OFDM_MODULATION + DESC = VCD function ENB_OFDM_MODULATION + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value ID = VCD_FUNCTION_MACPHY_INIT DESC = VCD function MACPHY_INIT GROUP = ALL:VCD:ENB:VCD_FUNCTION @@ -1645,6 +1969,10 @@ ID = VCD_FUNCTION_UE_DECODE_SI DESC = VCD function UE_DECODE_SI GROUP = ALL:VCD:UE:VCD_FUNCTION FORMAT = int,value +ID = VCD_FUNCTION_UE_DECODE_PCCH + DESC = VCD function UE_DECODE_PCCH + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value ID = VCD_FUNCTION_UE_DECODE_CCCH DESC = VCD function UE_DECODE_CCCH GROUP = ALL:VCD:UE:VCD_FUNCTION @@ -1685,6 +2013,10 @@ ID = VCD_FUNCTION_RLC_DATA_REQ DESC = VCD function RLC_DATA_REQ GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value +#ID = VCD_FUNCTION_RLC_DATA_IND +# DESC = VCD function RLC_DATA_IND +# GROUP = ALL:VCD:ENB:VCD_FUNCTION +# FORMAT = int,value ID = VCD_FUNCTION_MAC_RLC_STATUS_IND DESC = VCD function MAC_RLC_STATUS_IND GROUP = ALL:VCD:ENB:VCD_FUNCTION @@ -1729,6 +2061,22 @@ ID = VCD_FUNCTION_PDCP_VALIDATE_SECURITY DESC = VCD function PDCP_VALIDATE_SECURITY GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value +ID = VCD_FUNCTION_PDCP_FIFO_READ + DESC = VCD function PDCP_FIFO_READ + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PDCP_FIFO_READ_BUFFER + DESC = VCD function PDCP_FIFO_READ_BUFFER + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PDCP_FIFO_FLUSH + DESC = VCD function PDCP_FIFO_FLUSH + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PDCP_FIFO_FLUSH_BUFFER + DESC = VCD function PDCP_FIFO_FLUSH_BUFFER + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value ID = VCD_FUNCTION_RRC_RX_TX DESC = VCD function RRC_RX_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION @@ -1789,3 +2137,63 @@ ID = VCD_FUNCTION_TEST DESC = VCD function TEST GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value +ID = VCD_FUNCTION_SEND_IF4 + DESC = VCD function SEND_IF4 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_RECV_IF4 + DESC = VCD function RECV_IF4 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_SEND_IF5 + DESC = VCD function SEND_IF5 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_RECV_IF5 + DESC = VCD function RECV_IF5 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_TRX_COMPR_IF + DESC = VCD function TRX_COMPR_IF + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_TRX_DECOMPR_IF + DESC = VCD function TRX_DECOMPR_IF + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_NFAPI + DESC = VCD function NFAPI + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_GENERATE_PCFICH + DESC = VCD function GENERATE_PCFICH + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_GENERATE_DCI0 + DESC = VCD function GENERATE_DCI0 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_GENERATE_DLSCH + DESC = VCD function GENERATE_DLSCH + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_GENERATE_PHICH + DESC = VCD function GENERATE_PHICH + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PDCCH_SCRAMBLING + DESC = VCD function PDCCH_SCRAMBLING + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PDCCH_MODULATION + DESC = VCD function PDCCH_MODULATION + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PDCCH_INTERLEAVING + DESC = VCD function PDCCH_INTERLEAVING + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PDCCH_TX + DESC = VCD function PDCCH_TX + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value diff --git a/common/utils/T/local_tracer.c b/common/utils/T/local_tracer.c index 68a937a6b5..6d0ecddd45 100644 --- a/common/utils/T/local_tracer.c +++ b/common/utils/T/local_tracer.c @@ -63,7 +63,7 @@ static int get_connection(char *addr, int port) socklen_t alen; int s, t; - printf("waiting for connection on %s:%d\n", addr, port); + printf("T tracer: waiting for connection on %s:%d\n", addr, port); s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { perror("socket"); exit(1); } @@ -82,7 +82,7 @@ static int get_connection(char *addr, int port) if (t == -1) { perror("accept"); exit(1); } close(s); - printf("connected\n"); + printf("T tracer: connected\n"); return t; } @@ -150,7 +150,7 @@ process: while (size) { int l = write(f->socket_remote, b, size); if (l <= 0) { - printf("forward error\n"); + printf("T tracer: forward error\n"); close(f->socket_remote); f->socket_remote = -1; break; @@ -268,7 +268,7 @@ static void *forwarder(int port, int s) f->memusage = 0; f->last_warning_memusage = 0; - printf("waiting for remote tracer on port %d\n", port); + printf("T tracer: waiting for remote tracer on port %d\n", port); f->remote_port = port; f->socket_remote = get_connection("0.0.0.0", port); @@ -305,7 +305,7 @@ static void forward(void *_forwarder, char *buf, int size) if (f->memusage > f->last_warning_memusage && f->memusage - f->last_warning_memusage > 100000000) { f->last_warning_memusage += 100000000; - printf("WARNING: memory usage is over %"PRIu64"MB\n", + printf("T tracer: WARNING: memory usage is over %"PRIu64"MB\n", f->last_warning_memusage / 1000000); } else if (f->memusage < f->last_warning_memusage && diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile index 71f1d25f92..1c4a77587c 100644 --- a/common/utils/T/tracer/Makefile +++ b/common/utils/T/tracer/Makefile @@ -3,9 +3,11 @@ CFLAGS=-Wall -g -pthread -DT_TRACER -I. #CFLAGS += -O3 -ffast-math -fomit-frame-pointer -LIBS=-lX11 -lm -lpng -lXft +LIBS=-lm +XLIBS=-lX11 -lpng -lXft -all: record replay extract_config textlog enb vcd macpdu2wireshark +all: record replay extract_config textlog enb ue vcd macpdu2wireshark \ + extract_input_subframe extract_output_subframe to_vcd extract record: utils.o record.o database.o config.o $(CC) $(CFLAGS) -o record $^ $(LIBS) @@ -16,20 +18,40 @@ replay: utils.o replay.o extract_config: extract_config.o $(CC) $(CFLAGS) -o extract_config $^ $(LIBS) +extract_input_subframe: extract_input_subframe.o database.o event.o utils.o \ + config.o + $(CC) $(CFLAGS) -o $@ $^ $(LIBS) + +extract_output_subframe: extract_output_subframe.o database.o event.o utils.o \ + config.o + $(CC) $(CFLAGS) -o $@ $^ $(LIBS) + +extract: extract.o database.o event.o utils.o config.o + $(CC) $(CFLAGS) -o $@ $^ $(LIBS) + textlog: utils.o textlog.o database.o event.o handler.o config.o \ event_selector.o view/view.a gui/gui.a logger/logger.a \ filter/filter.a - $(CC) $(CFLAGS) -o textlog $^ $(LIBS) + $(CC) $(CFLAGS) -o textlog $^ $(LIBS) $(XLIBS) enb: utils.o enb.o database.o event.o handler.o config.o \ event_selector.o view/view.a gui/gui.a logger/logger.a \ filter/filter.a - $(CC) $(CFLAGS) -o enb $^ $(LIBS) + $(CC) $(CFLAGS) -o enb $^ $(LIBS) $(XLIBS) + +ue: utils.o ue.o database.o event.o handler.o config.o \ + event_selector.o view/view.a gui/gui.a logger/logger.a \ + filter/filter.a + $(CC) $(CFLAGS) -o ue $^ $(LIBS) $(XLIBS) vcd: utils.o vcd.o database.o event.o handler.o config.o \ event_selector.o view/view.a gui/gui.a logger/logger.a \ filter/filter.a - $(CC) $(CFLAGS) -o vcd $^ $(LIBS) + $(CC) $(CFLAGS) -o vcd $^ $(LIBS) $(XLIBS) + +to_vcd: to_vcd.o database.o event.o handler.o utils.o config.o \ + logger/logger.a filter/filter.a + $(CC) $(CFLAGS) -o to_vcd $^ $(LIBS) macpdu2wireshark: macpdu2wireshark.o database.o utils.o handler.o event.o \ config.o @@ -53,8 +75,9 @@ filter/filter.a: $(CC) $(CFLAGS) -c -o $@ $< clean: - rm -f *.o core tracer_remote textlog enb vcd record replay - rm -f extract_config macpdu2wireshark + rm -f *.o core tracer_remote textlog enb ue vcd record replay + rm -f extract_config macpdu2wireshark extract_input_subframe + rm -f extract_output_subframe to_vcd extract cd gui && make clean cd view && make clean cd logger && make clean diff --git a/common/utils/T/tracer/enb.c b/common/utils/T/tracer/enb.c index 3b8e2bf14e..f607743d15 100644 --- a/common/utils/T/tracer/enb.c +++ b/common/utils/T/tracer/enb.c @@ -17,6 +17,44 @@ #include "openair_logo.h" #include "config.h" +/****************************************************************************/ +/* conversion from rnti to "ue_id" (which does not really exists) */ +/* the idea is to assign an ue_id to an rnti as soon as we get an event */ +/* for the rnti */ +/****************************************************************************/ + +int ue_id[65536]; +int next_ue_id; + +void reset_ue_ids(void) +{ + int i; + printf("resetting known UEs\n"); + for (i = 0; i < 65536; i++) ue_id[i] = -1; + ue_id[65535] = 0; + ue_id[65534] = 1; /* HACK: to be removed */ + ue_id[2] = 2; /* this supposes RA RNTI = 2, very openair specific */ + next_ue_id = 3; +} + +int ue_id_from_rnti(void *_priv, int rnti) +{ + if (rnti < 0) rnti = 65534; /* HACK, to be removed */ + + if (rnti < 0 || rnti > 65535) { printf("bad rnti %d\n", rnti); exit(1); } + /* rnti not seen yet? give it a new ue_id */ + if (ue_id[rnti] == -1) { + ue_id[rnti] = next_ue_id; + next_ue_id++; + } + return ue_id[rnti]; +} + +/****************************************************************************/ +/* end of rnti->ue_id conversion */ +/****************************************************************************/ + + typedef struct { view *phyview; view *macview; @@ -24,6 +62,31 @@ typedef struct { view *pdcpview; view *rrcview; view *legacy; + widget *current_ue_label; + widget *current_ue_button; + widget *prev_ue_button; + widget *next_ue_button; + widget *pusch_iq_ue_xy_plot; + widget *ul_estimate_ue_xy_plot; + widget *pucch1_energy_ue_xy_plot; + widget *pucch_iq_ue_xy_plot; + widget *dl_ul_harq_ue_label; + widget *dl_mcs_xy_plot; + widget *ul_mcs_xy_plot; + logger *pusch_iq_ue_logger; + logger *ul_estimate_ue_logger; + logger *pucch1_energy_ue_threshold_logger; + logger *pucch1_energy_ue_energy_logger; + logger *pucch_iq_ue_logger; + logger *dl_dci_logger[8]; + logger *dl_ack_logger[8]; + logger *dl_nack_logger[8]; + logger *ul_dci_logger[8]; + logger *ul_dci_retransmission_logger[8]; + logger *ul_ack_logger[8]; + logger *ul_nack_logger[8]; + logger *dl_mcs_logger; + logger *ul_mcs_logger; } enb_gui; typedef struct { @@ -31,6 +94,10 @@ typedef struct { int *is_on; int nevents; pthread_mutex_t lock; + enb_gui *e; + int ue; /* what UE is displayed in the UE specific views */ + void *database; + int nb_rb; } enb_data; void is_on_changed(void *_d) @@ -58,27 +125,6 @@ connection_dies: if (pthread_mutex_unlock(&d->lock)) abort(); } -void usage(void) -{ - printf( -"options:\n" -" -d this option is mandatory\n" -" -on turn log ON for given GROUP or ID\n" -" -off turn log OFF for given GROUP or ID\n" -" -ON turn all logs ON\n" -" -OFF turn all logs OFF\n" -" note: you may pass several -on/-off/-ON/-OFF,\n" -" they will be processed in order\n" -" by default, all is off\n" -" -ip connect to given IP address (default %s)\n" -" -p connect to given port (default %d)\n" -" -debug-gui activate GUI debug logs\n", - DEFAULT_REMOTE_IP, - DEFAULT_REMOTE_PORT - ); - exit(1); -} - static void *gui_thread(void *_g) { gui *g = _g; @@ -86,18 +132,123 @@ static void *gui_thread(void *_g) return NULL; } -static filter *ticktime_filter(void *database, char *event, int i) +static filter *ticktime_filter(void *database, char *event, int i, int ue) { /* filter is "harq_pid == i && UE_id == 0 && eNB_id == 0" */ + /* we get the UE_id from the rnti */ return filter_and( filter_eq(filter_evarg(database, event, "harq_pid"), filter_int(i)), filter_and( - filter_eq(filter_evarg(database, event, "UE_id"), filter_int(0)), + filter_eq( + filter_evfun(database, ue_id_from_rnti, NULL, + filter_evarg(database, event, "rnti")), + filter_int(ue)), filter_eq(filter_evarg(database, event, "eNB_ID"), filter_int(0)))); } -static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) +static void set_current_ue(gui *g, enb_data *e, int ue) +{ + int i; + char s[256]; + + sprintf(s, "[UE %d] ", ue); + label_set_text(g, e->e->current_ue_label, s); + sprintf(s, "PUSCH IQ [UE %d]", ue); + xy_plot_set_title(g, e->e->pusch_iq_ue_xy_plot, s); + sprintf(s, "UL estimated channel [UE %d]", ue); + xy_plot_set_title(g, e->e->ul_estimate_ue_xy_plot, s); + sprintf(s, "PUCCH1 energy (SR) [UE %d]", ue); + xy_plot_set_title(g, e->e->pucch1_energy_ue_xy_plot, s); + sprintf(s, "PUCCH IQ [UE %d]", ue); + xy_plot_set_title(g, e->e->pucch_iq_ue_xy_plot, s); + sprintf(s, "DL/UL HARQ (x8) [UE %d]", ue); + label_set_text(g, e->e->dl_ul_harq_ue_label, s); + sprintf(s, "DL MCS [UE %d]", ue); + xy_plot_set_title(g, e->e->dl_mcs_xy_plot, s); + sprintf(s, "UL MCS [UE %d]", ue); + xy_plot_set_title(g, e->e->ul_mcs_xy_plot, s); + + logger_set_filter(e->e->pusch_iq_ue_logger, + filter_eq( + filter_evfun(e->database, ue_id_from_rnti, NULL, + filter_evarg(e->database, "ENB_PHY_PUSCH_IQ", "rnti")), + filter_int(ue))); + logger_set_filter(e->e->ul_estimate_ue_logger, + filter_eq( + filter_evfun(e->database, ue_id_from_rnti, NULL, + filter_evarg(e->database, "ENB_PHY_UL_CHANNEL_ESTIMATE", "rnti")), + filter_int(ue))); + logger_set_filter(e->e->pucch1_energy_ue_threshold_logger, + filter_eq( + filter_evfun(e->database, ue_id_from_rnti, NULL, + filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "rnti")), + filter_int(ue))); + logger_set_filter(e->e->pucch1_energy_ue_energy_logger, + filter_eq( + filter_evfun(e->database, ue_id_from_rnti, NULL, + filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "rnti")), + filter_int(ue))); + logger_set_filter(e->e->pucch_iq_ue_logger, + filter_eq( + filter_evfun(e->database, ue_id_from_rnti, NULL, + filter_evarg(e->database, "ENB_PHY_PUCCH_1AB_IQ", "rnti")), + filter_int(ue))); + for (i = 0; i < 8; i++) { + logger_set_filter(e->e->dl_dci_logger[i], + ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_DCI", i, ue)); + logger_set_filter(e->e->dl_ack_logger[i], + ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_ACK", i, ue)); + logger_set_filter(e->e->dl_nack_logger[i], + ticktime_filter(e->database, "ENB_PHY_DLSCH_UE_NACK", i, ue)); + logger_set_filter(e->e->ul_dci_logger[i], + ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_DCI", i, ue)); + logger_set_filter(e->e->ul_dci_retransmission_logger[i], + ticktime_filter(e->database, + "ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i, ue)); + logger_set_filter(e->e->ul_ack_logger[i], + ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_ACK", i, ue)); + logger_set_filter(e->e->ul_nack_logger[i], + ticktime_filter(e->database, "ENB_PHY_ULSCH_UE_NACK", i, ue)); + } + logger_set_filter(e->e->dl_mcs_logger, + filter_eq( + filter_evfun(e->database, ue_id_from_rnti, NULL, + filter_evarg(e->database, "ENB_PHY_DLSCH_UE_DCI", "rnti")), + filter_int(ue))); + logger_set_filter(e->e->ul_mcs_logger, + filter_eq( + filter_evfun(e->database, ue_id_from_rnti, NULL, + filter_evarg(e->database, "ENB_PHY_ULSCH_UE_DCI", "rnti")), + filter_int(ue))); +} + +static void click(void *private, gui *g, + char *notification, widget *w, void *notification_data) +{ + int *d = notification_data; + int button = d[0]; + enb_data *ed = private; + enb_gui *e = ed->e; + int ue = ed->ue; + int do_reset = 0; + + if (button != 1) return; + if (w == e->prev_ue_button) { ue--; if (ue < 0) ue = 0; } + if (w == e->next_ue_button) ue++; + if (w == e->current_ue_button) do_reset = 1; + + if (pthread_mutex_lock(&ed->lock)) abort(); + if (do_reset) reset_ue_ids(); + if (ue != ed->ue) { + set_current_ue(g, ed, ue); + ed->ue = ue; + } + if (pthread_mutex_unlock(&ed->lock)) abort(); +} + +static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database, + enb_data *ed) { widget *main_window; widget *top_container; @@ -113,7 +264,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) widget *text; view *textview; int i; - widget *w; + widget *w, *w2; view *v; logger *l; @@ -124,35 +275,55 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) line = new_container(g, HORIZONTAL); widget_add_child(g, top_container, line, -1); logo = new_image(g, openair_logo_png, openair_logo_png_len); - widget_add_child(g, line, logo, -1); + + /* logo + prev/next UE buttons */ + col = new_container(g, VERTICAL); + widget_add_child(g, col, logo, -1); + w = new_container(g, HORIZONTAL); + widget_add_child(g, col, w, -1); + /* TODO: use button widget, not label widget */ + w2 = new_label(g, ""); + widget_add_child(g, w, w2, -1); + label_set_clickable(g, w2, 1); + e->current_ue_button = w2; + e->current_ue_label = w2; + w2 = new_label(g, " [prev UE] "); + widget_add_child(g, w, w2, -1); + label_set_clickable(g, w2, 1); + e->prev_ue_button = w2; + w2 = new_label(g, " [next UE] "); + widget_add_child(g, w, w2, -1); + label_set_clickable(g, w2, 1); + e->next_ue_button = w2; + widget_add_child(g, line, col, -1); + input_signal_plot = new_xy_plot(g, 256, 55, "input signal", 20); widget_add_child(g, line, input_signal_plot, -1); - xy_plot_set_range(g, input_signal_plot, 0, 7680*10, 20, 70); + xy_plot_set_range(g, input_signal_plot, 0, 7680*10 * ed->nb_rb/25, 20, 70); input_signal_log = new_framelog(h, database, "ENB_PHY_INPUT_SIGNAL", "subframe", "rxdata"); /* a skip value of 10 means to process 1 frame over 10, that is * more or less 10 frames per second */ framelog_set_skip(input_signal_log, 10); - input_signal_view = new_view_xy(7680*10, 10, + input_signal_view = new_view_xy(7680*10 * ed->nb_rb/25, 10, g, input_signal_plot, new_color(g, "#0c0c72"), XY_LOOP_MODE); logger_add_view(input_signal_log, input_signal_view); - /* UE 0 PUSCH IQ data */ - w = new_xy_plot(g, 55, 55, "PUSCH IQ [UE 0]", 50); + /* UE x PUSCH IQ data */ + w = new_xy_plot(g, 55, 55, "", 50); + e->pusch_iq_ue_xy_plot = w; widget_add_child(g, line, w, -1); xy_plot_set_range(g, w, -1000, 1000, -1000, 1000); l = new_iqlog(h, database, "ENB_PHY_PUSCH_IQ", "nb_rb", "N_RB_UL", "symbols_per_tti", "pusch_comp"); v = new_view_xy(100*12*14,10,g,w,new_color(g,"#000"),XY_FORCED_MODE); logger_add_view(l, v); - logger_set_filter(l, - filter_eq( - filter_evarg(database, "ENB_PHY_PUSCH_IQ", "UE_ID"), - filter_int(0))); + e->pusch_iq_ue_logger = l; - /* UE 0 estimated UL channel */ - w = new_xy_plot(g, 280, 55, "UL estimated channel [UE 0]", 50); + /* UE x estimated UL channel */ + w = new_xy_plot(g, 280, 55, "", 50); + e->ul_estimate_ue_xy_plot = w; widget_add_child(g, line, w, -1); xy_plot_set_range(g, w, 0, 512*10, -10, 80); l = new_framelog(h, database, @@ -161,43 +332,87 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) framelog_set_update_only_at_sf9(l, 0); v = new_view_xy(512*10, 10, g, w, new_color(g, "#0c0c72"), XY_LOOP_MODE); logger_add_view(l, v); - logger_set_filter(l, - filter_eq( - filter_evarg(database, "ENB_PHY_UL_CHANNEL_ESTIMATE", "UE_ID"), - filter_int(0))); + e->ul_estimate_ue_logger = l; - /* UE 0 PUCCH energy */ - w = new_xy_plot(g, 128, 55, "PUCCH1 energy (SR) [UE 0]", 50); + /* UE x PUCCH energy */ + w = new_xy_plot(g, 128, 55, "", 50); + e->pucch1_energy_ue_xy_plot = w; widget_add_child(g, line, w, -1); xy_plot_set_range(g, w, 0, 1024*10, -10, 80); l = new_ttilog(h, database, "ENB_PHY_PUCCH_1_ENERGY", "frame", "subframe", "threshold", 0); v = new_view_tti(10, g, w, new_color(g, "#ff0000")); logger_add_view(l, v); - logger_set_filter(l, - filter_eq( - filter_evarg(database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"), - filter_int(0))); + e->pucch1_energy_ue_threshold_logger = l; l = new_ttilog(h, database, "ENB_PHY_PUCCH_1_ENERGY", "frame", "subframe", "energy", 1); v = new_view_tti(10, g, w, new_color(g, "#0c0c72")); logger_add_view(l, v); - logger_set_filter(l, - filter_eq( - filter_evarg(database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"), - filter_int(0))); + e->pucch1_energy_ue_energy_logger = l; - /* UE 0 PUCCH IQ data */ - w = new_xy_plot(g, 55, 55, "PUCCH IQ [UE 0]", 50); + /* UE x PUCCH IQ data */ + w = new_xy_plot(g, 55, 55, "", 50); + e->pucch_iq_ue_xy_plot = w; widget_add_child(g, line, w, -1); - xy_plot_set_range(g, w, -100, 100, -100, 100); + xy_plot_set_range(g, w, -2000, 2000, -2000, 2000); l = new_iqdotlog(h, database, "ENB_PHY_PUCCH_1AB_IQ", "I", "Q"); v = new_view_xy(500, 10, g, w, new_color(g,"#000"), XY_LOOP_MODE); logger_add_view(l, v); - logger_set_filter(l, - filter_eq( - filter_evarg(database, "ENB_PHY_PUCCH_1AB_IQ", "UE_ID"), - filter_int(0))); + e->pucch_iq_ue_logger = l; + + /* UE x DL mcs */ + line = new_container(g, HORIZONTAL); + widget_add_child(g, top_container, line, -1); + w = new_xy_plot(g, 128, 55, "", 20); + xy_plot_set_range(g, w, 0, 1024*10, -2, 30); + e->dl_mcs_xy_plot = w; + widget_add_child(g, line, w, -1); + l = new_ticked_ttilog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe", + "ENB_PHY_DLSCH_UE_DCI", "mcs", 0, -1); + v = new_view_tti(10, g, w, new_color(g, "#0c0c72")); + logger_add_view(l, v); + e->dl_mcs_logger = l; + + /* UE x UL mcs */ + w = new_xy_plot(g, 128, 55, "", 20); + xy_plot_set_range(g, w, 0, 1024*10, -2, 30); + e->ul_mcs_xy_plot = w; + widget_add_child(g, line, w, -1); + l = new_ticked_ttilog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe", + "ENB_PHY_ULSCH_UE_DCI", "mcs", 0, -1); + v = new_view_tti(10, g, w, new_color(g, "#0c0c72")); + logger_add_view(l, v); + e->ul_mcs_logger = l; + + /* UE x DL PHY (truly: DCI) throughput */ + col = new_container(g, VERTICAL); + widget_add_child(g, line, col, -1); + w = new_xy_plot(g, 70, 10, "DL PHY [0]", 35); + w2 = new_textarea(g, 70, 11, 64); + xy_plot_set_range(g, w, 0, 1000, 0, 100000); + xy_plot_set_tick_type(g, w, XY_PLOT_SCROLL_TICK); + widget_add_child(g, col, w2, -1); + widget_add_child(g, col, w, -1); + container_set_child_growable(g, col, w, 1); + l = new_throughputlog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe", + "ENB_PHY_DLSCH_UE_DCI", "TBS"); + v = new_view_scrolltti(10, g, w, new_color(g, "#0c0c72"), w2); + logger_add_view(l, v); + + /* UE x UL PHY (truly: DCI) throughput */ + col = new_container(g, VERTICAL); + widget_add_child(g, line, col, -1); + w = new_xy_plot(g, 70, 10, "UL PHY [0]", 35); + w2 = new_textarea(g, 70, 11, 64); + xy_plot_set_range(g, w, 0, 1000, 0, 100000); + xy_plot_set_tick_type(g, w, XY_PLOT_SCROLL_TICK); + widget_add_child(g, col, w2, -1); + widget_add_child(g, col, w, -1); + container_set_child_growable(g, col, w, 1); + l = new_throughputlog(h, database, "ENB_PHY_DL_TICK", "frame", "subframe", + "ENB_PHY_ULSCH_UE_DCI", "TBS"); + v = new_view_scrolltti(10, g, w, new_color(g, "#0c0c72"), w2); + logger_add_view(l, v); /* downlink/uplink UE DCIs */ widget_add_child(g, top_container, @@ -250,8 +465,8 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) logger_add_view(timelog, subview); /* harq processes' ticktime view */ - widget_add_child(g, top_container, - new_label(g,"DL/UL HARQ (x8) [UE 0]"), -1); + e->dl_ul_harq_ue_label = new_label(g, ""); + widget_add_child(g, top_container, e->dl_ul_harq_ue_label, -1); line = new_container(g, HORIZONTAL); widget_add_child(g, top_container, line, -1); timeline_plot = new_timeline(g, 512, 2*8+2, 3); @@ -271,15 +486,14 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) /* tick on UL view */ subview = new_subview_ticktime(timeview, 9, new_color(g,"#bbb"), 3600*1000); logger_add_view(timelog, subview); - /* DL harq pids */ + /* DL DCI */ for (i = 0; i < 8; i++) { timelog = new_ticklog(h, database, "ENB_PHY_DLSCH_UE_DCI", "frame", "subframe"); subview = new_subview_ticktime(timeview, i+1, new_color(g,"#55f"), 3600*1000); logger_add_view(timelog, subview); - logger_set_filter(timelog, - ticktime_filter(database, "ENB_PHY_DLSCH_UE_DCI", i)); + e->dl_dci_logger[i] = timelog; } /* DL ACK */ for (i = 0; i < 8; i++) { @@ -288,8 +502,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) subview = new_subview_ticktime(timeview, i+1, new_color(g,"#282"), 3600*1000); logger_add_view(timelog, subview); - logger_set_filter(timelog, - ticktime_filter(database, "ENB_PHY_DLSCH_UE_ACK", i)); + e->dl_ack_logger[i] = timelog; } /* DL NACK */ for (i = 0; i < 8; i++) { @@ -298,10 +511,9 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) subview = new_subview_ticktime(timeview, i+1, new_color(g,"#f22"), 3600*1000); logger_add_view(timelog, subview); - logger_set_filter(timelog, - ticktime_filter(database, "ENB_PHY_DLSCH_UE_NACK", i)); + e->dl_nack_logger[i] = timelog; } - /* UL harq pids */ + /* UL DCI/retransmission without DCI */ for (i = 0; i < 8; i++) { /* first transmission */ timelog = new_ticklog(h, database, "ENB_PHY_ULSCH_UE_DCI", @@ -309,17 +521,14 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) subview = new_subview_ticktime(timeview, i+9+1, new_color(g,"#55f"), 3600*1000); logger_add_view(timelog, subview); - logger_set_filter(timelog, - ticktime_filter(database, "ENB_PHY_ULSCH_UE_DCI", i)); + e->ul_dci_logger[i] = timelog; /* retransmission */ timelog = new_ticklog(h, database, "ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", "frame", "subframe"); subview = new_subview_ticktime(timeview, i+9+1, new_color(g,"#99f"), 3600*1000); logger_add_view(timelog, subview); - logger_set_filter(timelog, - ticktime_filter(database, - "ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i)); + e->ul_dci_retransmission_logger[i] = timelog; } /* UL ACK */ for (i = 0; i < 8; i++) { @@ -328,8 +537,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) subview = new_subview_ticktime(timeview, i+9+1, new_color(g,"#282"), 3600*1000); logger_add_view(timelog, subview); - logger_set_filter(timelog, - ticktime_filter(database, "ENB_PHY_ULSCH_UE_ACK", i)); + e->ul_ack_logger[i] = timelog; } /* UL NACK */ for (i = 0; i < 8; i++) { @@ -338,8 +546,7 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) subview = new_subview_ticktime(timeview, i+9+1, new_color(g,"#f22"), 3600*1000); logger_add_view(timelog, subview); - logger_set_filter(timelog, - ticktime_filter(database, "ENB_PHY_ULSCH_UE_NACK", i)); + e->ul_nack_logger[i] = timelog; } /* phy/mac/rlc/pdcp/rrc textlog */ @@ -416,6 +623,11 @@ static void enb_main_gui(enb_gui *e, gui *g, event_handler *h, void *database) widget_add_child(g, top_container, text, -1); container_set_child_growable(g, top_container, text, 1); e->legacy = new_view_textlist(10000, 10, g, text); + + set_current_ue(g, ed, ed->ue); + register_notifier(g, "click", e->current_ue_button, click, ed); + register_notifier(g, "click", e->prev_ue_button, click, ed); + register_notifier(g, "click", e->next_ue_button, click, ed); } void view_add_log(view *v, char *log, event_handler *h, void *database, @@ -434,6 +646,28 @@ void view_add_log(view *v, char *log, event_handler *h, void *database, on_off(database, log, is_on, 1); } +void usage(void) +{ + printf( +"options:\n" +" -d this option is mandatory\n" +" -rb setup for this number of RBs (default 25)\n" +" -on turn log ON for given GROUP or ID\n" +" -off turn log OFF for given GROUP or ID\n" +" -ON turn all logs ON\n" +" -OFF turn all logs OFF\n" +" note: you may pass several -on/-off/-ON/-OFF,\n" +" they will be processed in order\n" +" by default, all is off\n" +" -ip connect to given IP address (default %s)\n" +" -p connect to given port (default %d)\n" +" -debug-gui activate GUI debug logs\n", + DEFAULT_REMOTE_IP, + DEFAULT_REMOTE_PORT + ); + exit(1); +} + int main(int n, char **v) { extern int volatile gui_logd; @@ -452,6 +686,10 @@ int main(int n, char **v) enb_gui eg; enb_data enb_data; + reset_ue_ids(); + + enb_data.nb_rb = 25; + /* write on a socket fails if the other end is closed and we get SIGPIPE */ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort(); @@ -462,6 +700,8 @@ int main(int n, char **v) if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); if (!strcmp(v[i], "-d")) { if (i > n-2) usage(); database_filename = v[++i]; continue; } + if (!strcmp(v[i], "-rb")) + { if (i > n-2) usage(); enb_data.nb_rb = atoi(v[++i]); continue; } if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; } if (!strcmp(v[i], "-p")) { if (i > n-2) usage(); port = atoi(v[++i]); continue; } @@ -477,6 +717,11 @@ int main(int n, char **v) usage(); } + switch (enb_data.nb_rb) { + case 25: case 50: case 100: break; + default: printf("ERROR, bad value for -rb (%d)\n", enb_data.nb_rb); exit(1); + } + if (database_filename == NULL) { printf("ERROR: provide a database file (-d)\n"); exit(1); @@ -495,7 +740,11 @@ int main(int n, char **v) g = gui_init(); new_thread(gui_thread, g); - enb_main_gui(&eg, g, h, database); + enb_data.ue = 3; + enb_data.e = ⪚ + enb_data.database = database; + + enb_main_gui(&eg, g, h, database, &enb_data); for (i = 0; i < number_of_events; i++) { logger *textlog; @@ -525,9 +774,9 @@ int main(int n, char **v) on_off(database, "ENB_PHY_PUCCH_1_ENERGY", is_on, 1); on_off(database, "ENB_PHY_PUCCH_1AB_IQ", is_on, 1); - on_off(database, "LEGACY_RRC_INFO", is_on, 1); - on_off(database, "LEGACY_RRC_ERROR", is_on, 1); - on_off(database, "LEGACY_RRC_WARNING", is_on, 1); + on_off(database, "LEGACY_GROUP_INFO", is_on, 1); + on_off(database, "LEGACY_GROUP_ERROR", is_on, 1); + on_off(database, "LEGACY_GROUP_WARNING", is_on, 1); view_add_log(eg.phyview, "ENB_PHY_DLSCH_UE_DCI", h, database, is_on); view_add_log(eg.phyview, "ENB_PHY_DLSCH_UE_ACK", h, database, is_on); @@ -639,7 +888,9 @@ restart: event e; e = get_event(enb_data.socket, v, database); if (e.type == -1) goto restart; + if (pthread_mutex_lock(&enb_data.lock)) abort(); handle_event(h, e); + if (pthread_mutex_unlock(&enb_data.lock)) abort(); } return 0; diff --git a/common/utils/T/tracer/extract.c b/common/utils/T/tracer/extract.c new file mode 100644 index 0000000000..b9fca959ed --- /dev/null +++ b/common/utils/T/tracer/extract.c @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include "database.h" +#include "event.h" +#include "config.h" + +void usage(void) +{ + printf( +"usage: [options] \n" +"options:\n" +" -d this option is mandatory\n" +" -o this option is mandatory\n" +" -f field 'name' of 'event' has to match 'value'\n" +" type of 'name' must be int\n" +" (you can use several -f options)\n" + ); + exit(1); +} + +int get_filter_arg(database_event_format *f, char *field, char *type) +{ + int i; + for (i = 0; i < f->count; i++) + if (!strcmp(f->name[i], field)) { + if (strcmp(f->type[i], type)) break; + return i; + } + printf("bad field %s, check that it exists and has type '%s'\n",field,type); + exit(1); +} + +int main(int n, char **v) +{ + char *database_filename = NULL; + void *database; + int i; + int input_event_id; + database_event_format f; + char *file = NULL; + char *output_file = NULL; + FILE *out; + int fd; + char *event_name = NULL; + char *buffer_name = NULL; + char *filter[n]; + int filter_arg[n]; + int filter_value[n]; + int filter_count = 0; + int buffer_arg; + int found; + + for (i = 1; i < n; i++) { + if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); + if (!strcmp(v[i], "-d")) + { if (i > n-2) usage(); database_filename = v[++i]; continue; } + if (!strcmp(v[i], "-o")) + { if (i > n-2) usage(); output_file = v[++i]; continue; } + if (!strcmp(v[i], "-f")) { if (i>n-3) usage(); + filter[filter_count] = v[++i]; + filter_value[filter_count++] = atoi(v[++i]); + continue; + } + if (file == NULL) { file = v[i]; continue; } + if (event_name == NULL) { event_name = v[i]; continue; } + if (buffer_name == NULL) { buffer_name = v[i]; continue; } + usage(); + } + if (file == NULL || event_name == NULL || buffer_name == NULL) usage(); + + if (database_filename == NULL) { + printf("ERROR: provide a database file (-d)\n"); + exit(1); + } + + if (output_file == NULL) { + printf("gimme -o , thanks\n"); + exit(1); + } + + out = fopen(output_file, "w"); if(out==NULL){perror(output_file);exit(1);} + + database = parse_database(database_filename); + + load_config_file(database_filename); + + input_event_id = event_id_from_name(database, event_name); + f = get_format(database, input_event_id); + + buffer_arg = get_filter_arg(&f, buffer_name, "buffer"); + + for (i = 0; i < filter_count; i++) + filter_arg[i] = get_filter_arg(&f, filter[i], "int"); + + fd = open(file, O_RDONLY); + if (fd == -1) { perror(file); exit(1); } + + found = 0; + + while (1) { + char v[T_BUFFER_MAX]; + event e; + e = get_event(fd, v, database); + if (e.type == -1) break; + if (e.type != input_event_id) continue; + for (i = 0; i < filter_count; i++) + if (filter_value[i] != e.e[filter_arg[i]].i) + break; + if (i != filter_count) + continue; + if (fwrite(e.e[buffer_arg].b, e.e[buffer_arg].bsize, 1, out) != 1) + { perror(output_file); exit(1); } + found = 1; + break; + } + + if (found == 0) printf("ERROR: event not found\n"); + + fclose(out); + + return 0; +} diff --git a/common/utils/T/tracer/extract_input_subframe.c b/common/utils/T/tracer/extract_input_subframe.c new file mode 100644 index 0000000000..02c5f3d565 --- /dev/null +++ b/common/utils/T/tracer/extract_input_subframe.c @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include "database.h" +#include "event.h" +#include "config.h" + +void usage(void) +{ + printf( +"usage: [options] \n" +"options:\n" +" -d this option is mandatory\n" +" -o this option is mandatory\n" +" -v verbose\n" +" -c default to 1\n" + ); + exit(1); +} + +int main(int n, char **v) +{ + char *database_filename = NULL; + void *database; + int i; + int input_event_id; + database_event_format f; + char *file = NULL; + char *output_file = NULL; + FILE *out; + int fd; + int frame = -1, subframe = -1; + int frame_arg, subframe_arg, buffer_arg; + int verbose = 0; + int number_of_subframes = 1; + int processed_subframes = 0; + + for (i = 1; i < n; i++) { + if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); + if (!strcmp(v[i], "-d")) + { if (i > n-2) usage(); database_filename = v[++i]; continue; } + if (!strcmp(v[i], "-o")) + { if (i > n-2) usage(); output_file = v[++i]; continue; } + if (!strcmp(v[i], "-c")) + { if (i > n-2) usage(); number_of_subframes = atoi(v[++i]); continue; } + if (!strcmp(v[i], "-v")) { verbose = 1; continue; } + if (file == NULL) { file = v[i]; continue; } + if (frame == -1) { frame = atoi(v[i]); continue; } + if (subframe == -1) { subframe = atoi(v[i]); continue; } + usage(); + } + if (file == NULL || frame == -1 || subframe == -1) usage(); + + if (database_filename == NULL) { + printf("ERROR: provide a database file (-d)\n"); + exit(1); + } + + if (number_of_subframes < 1) { + printf("bad value for option -c, must be at least 1 and is %d\n", + number_of_subframes); + exit(1); + } + + if (output_file == NULL) { + printf("gimme -o , thanks\n"); + exit(1); + } + + out = fopen(output_file, "w"); if(out==NULL){perror(output_file);exit(1);} + + database = parse_database(database_filename); + + load_config_file(database_filename); + + input_event_id = event_id_from_name(database, "ENB_PHY_INPUT_SIGNAL"); + f = get_format(database, input_event_id); + + frame_arg = subframe_arg = buffer_arg = -1; + for (i = 0; i < f.count; i++) { + if (!strcmp(f.name[i], "frame")) { + if (frame_arg != -1) goto err; + if (strcmp(f.type[i], "int")) goto err; + frame_arg = i; + } + if (!strcmp(f.name[i], "subframe")) { + if (subframe_arg != -1) goto err; + if (strcmp(f.type[i], "int")) goto err; + subframe_arg = i; + } + if (!strcmp(f.name[i], "rxdata")) { + if (buffer_arg != -1) goto err; + if (strcmp(f.type[i], "buffer")) goto err; + buffer_arg = i; + } + continue; +err: + printf("cannot deal with ENB_PHY_INPUT_SIGNAL from database file\n"); + exit(1); + } + if (frame_arg == -1 || subframe_arg == -1 || buffer_arg == -1) goto err; + + fd = open(file, O_RDONLY); + if (fd == -1) { perror(file); exit(1); } + + /* get wanted frame/subframe */ + while (1) { + char v[T_BUFFER_MAX]; + event e; + e = get_event(fd, v, database); + if (e.type == -1) break; + if (e.type != input_event_id) continue; + if (verbose) + printf("input frame %d subframe %d size %d\n", + e.e[frame_arg].i, e.e[subframe_arg].i, e.e[buffer_arg].bsize); + if (!(frame == e.e[frame_arg].i && subframe == e.e[subframe_arg].i)) + continue; +#if 0 +for (i = 0; i < e.e[buffer_arg].bsize/2; i++) { +short *x = e.e[buffer_arg].b; +x[i] *= 14; +} +#endif + if (fwrite(e.e[buffer_arg].b, e.e[buffer_arg].bsize, 1, out) != 1) + { perror(output_file); exit(1); } + processed_subframes++; + number_of_subframes--; + if (!number_of_subframes) { + if (fclose(out)) perror(output_file); + printf("%d subframes dumped\n", processed_subframes); + return 0; + } + subframe++; + if (subframe == 10) { subframe = 0; frame=(frame+1)%1024; } + } + + printf("frame %d subframe %d not found\n", frame, subframe); + printf("%d subframes dumped\n", processed_subframes); + fclose(out); + + return 0; +} diff --git a/common/utils/T/tracer/extract_output_subframe.c b/common/utils/T/tracer/extract_output_subframe.c new file mode 100644 index 0000000000..b82ad0e766 --- /dev/null +++ b/common/utils/T/tracer/extract_output_subframe.c @@ -0,0 +1,158 @@ +#include +#include +#include +#include +#include "database.h" +#include "event.h" +#include "config.h" + +void usage(void) +{ + printf( +"usage: [options] \n" +" the program dumps 'number of subframes' subframes starting\n" +" at 'frame:suubframe'\n" +"options:\n" +" -d this option is mandatory\n" +" -o output to file (default: stdout)\n" +" -v verbose\n" + ); + exit(1); +} + +int main(int n, char **v) +{ + char *database_filename = NULL; + void *database; + int i; + int output_event_id; + database_event_format f; + char *file = NULL; + int fd; + int frame = -1, subframe = -1; + int number_of_subframes = -1; + int frame_arg, subframe_arg, buffer_arg; + int verbose = 0; + char *out_filename = NULL; + FILE *out; + + for (i = 1; i < n; i++) { + if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); + if (!strcmp(v[i], "-d")) + { if (i > n-2) usage(); database_filename = v[++i]; continue; } + if (!strcmp(v[i], "-o")) + { if (i > n-2) usage(); out_filename = v[++i]; continue; } + if (!strcmp(v[i], "-v")) { verbose = 1; continue; } + if (file == NULL) { file = v[i]; continue; } + if (frame == -1) { frame = atoi(v[i]); continue; } + if (subframe == -1) { subframe = atoi(v[i]); continue; } + if (number_of_subframes == -1) {number_of_subframes=atoi(v[i]);continue;} + usage(); + } + if (file == NULL || frame == -1 || subframe == -1 || + number_of_subframes == -1) usage(); + + if (database_filename == NULL) { + printf("ERROR: provide a database file (-d)\n"); + exit(1); + } + + if (out_filename == NULL) out = stdout; + else { + out = fopen(out_filename, "w"); + if (out == NULL) { perror(out_filename); exit(1); } + } + + database = parse_database(database_filename); + + load_config_file(database_filename); + + output_event_id = event_id_from_name(database, "ENB_PHY_OUTPUT_SIGNAL"); + f = get_format(database, output_event_id); + + frame_arg = subframe_arg = buffer_arg = -1; + for (i = 0; i < f.count; i++) { + if (!strcmp(f.name[i], "frame")) { + if (frame_arg != -1) goto err; + if (strcmp(f.type[i], "int")) goto err; + frame_arg = i; + } + if (!strcmp(f.name[i], "subframe")) { + if (subframe_arg != -1) goto err; + if (strcmp(f.type[i], "int")) goto err; + subframe_arg = i; + } + if (!strcmp(f.name[i], "txdata")) { + if (buffer_arg != -1) goto err; + if (strcmp(f.type[i], "buffer")) goto err; + buffer_arg = i; + } + continue; +err: + printf("cannot deal with ENB_PHY_OUTPUT_SIGNAL from database file\n"); + exit(1); + } + if (frame_arg == -1 || subframe_arg == -1 || buffer_arg == -1) goto err; + + fd = open(file, O_RDONLY); + if (fd == -1) { perror(file); exit(1); } + + int last_frame = -1; + int last_subframe = -1; + int subframe_written = 0; + while (1) { + char v[T_BUFFER_MAX]; + event e; + e = get_event(fd, v, database); + if (e.type == -1) break; + if (e.type != output_event_id) continue; + if (verbose) + printf("found output frame %d subframe %d size %d\n", + e.e[frame_arg].i, e.e[subframe_arg].i, e.e[buffer_arg].bsize); + if (!(last_frame != -1 || + (frame == e.e[frame_arg].i && subframe == e.e[subframe_arg].i))) + continue; + frame = e.e[frame_arg].i; + subframe = e.e[subframe_arg].i; + if (last_frame != -1) { + if (frame*10+subframe != (last_frame*10+last_subframe + 1) % 10240) { + printf("error: discontinuity, not what you want...\n"); + exit(1); + } + } + last_frame = frame; + last_subframe = subframe; +#if 0 +for (i = 0; i < e.e[buffer_arg].bsize/2; i++) { +short *x = e.e[buffer_arg].b; +x[i] *= 14; +} +#endif + if (verbose) + printf("save output frame %d subframe %d size %d\n", + e.e[frame_arg].i, e.e[subframe_arg].i, e.e[buffer_arg].bsize); + if (fwrite(e.e[buffer_arg].b, e.e[buffer_arg].bsize, 1, out) != 1) { + perror(out_filename); + exit(1); + } + subframe_written++; + if (subframe_written != number_of_subframes) + continue; + + /* done */ + fflush(out); + if (out_filename != NULL) { + if (fclose(out)) perror(out_filename); + } + if (verbose) + printf("%d subframes written\n", subframe_written); + return 0; + } + + printf("error with input file, %d subframe written\n", subframe_written); + fflush(out); + if (out_filename != NULL) { + if (fclose(out)) perror(out_filename); + } + return 1; +} diff --git a/common/utils/T/tracer/filter/filter.c b/common/utils/T/tracer/filter/filter.c index b09b01259d..ddc9e3af3e 100644 --- a/common/utils/T/tracer/filter/filter.c +++ b/common/utils/T/tracer/filter/filter.c @@ -10,9 +10,12 @@ struct filter { struct { struct filter *a, *b; } op2; int v; struct { int event_type; int arg_index; } evarg; + struct { int (*fun)(void *priv, int v); void *priv; + struct filter *x; } evfun; } v; int (*eval)(struct filter *this, event e); + void (*free)(struct filter *this); }; /****************************************************************************/ @@ -51,8 +54,35 @@ int eval_evarg(struct filter *f, event e) return e.e[f->v.evarg.arg_index].i; } +int eval_evfun(struct filter *f, event e) +{ + return f->v.evfun.fun(f->v.evfun.priv, f->v.evfun.x->eval(f->v.evfun.x, e)); +} + /****************************************************************************/ -/* filter construction functions */ +/* free memory functions */ +/****************************************************************************/ + +void free_op2(struct filter *f) +{ + free_filter(f->v.op2.a); + free_filter(f->v.op2.b); + free(f); +} + +void free_evfun(struct filter *f) +{ + free_filter(f->v.evfun.x); + free(f); +} + +void free_noop(struct filter *f) +{ + free(f); +} + +/****************************************************************************/ +/* filter construction/destruction functions */ /****************************************************************************/ filter *filter_and(filter *a, filter *b) @@ -60,6 +90,7 @@ filter *filter_and(filter *a, filter *b) struct filter *ret = calloc(1, sizeof(struct filter)); if (ret == NULL) abort(); ret->eval = eval_and; + ret->free = free_op2; ret->v.op2.a = a; ret->v.op2.b = b; return ret; @@ -70,6 +101,7 @@ filter *filter_eq(filter *a, filter *b) struct filter *ret = calloc(1, sizeof(struct filter)); if (ret == NULL) abort(); ret->eval = eval_eq; + ret->free = free_op2; ret->v.op2.a = a; ret->v.op2.b = b; return ret; @@ -80,6 +112,7 @@ filter *filter_int(int v) struct filter *ret = calloc(1, sizeof(struct filter)); if (ret == NULL) abort(); ret->eval = eval_int; + ret->free = free_noop; ret->v.v = v; return ret; } @@ -97,6 +130,7 @@ filter *filter_evarg(void *database, char *event_name, char *varname) f = get_format(database, event_id); ret->eval = eval_evarg; + ret->free = free_noop; ret->v.evarg.event_type = event_id; ret->v.evarg.arg_index = -1; @@ -114,6 +148,27 @@ filter *filter_evarg(void *database, char *event_name, char *varname) return ret; } +filter *filter_evfun(void *database, int (*fun)(void *priv, int v), + void *priv, filter *x) +{ + struct filter *ret = calloc(1, sizeof(struct filter)); + if (ret == NULL) abort(); + ret->eval = eval_evfun; + ret->free = free_evfun; + ret->v.evfun.fun = fun; + ret->v.evfun.priv = priv; + ret->v.evfun.x = x; + return ret; +} + +void free_filter(filter *_f) +{ + struct filter *f; + if (_f == NULL) return; + f = _f; + f->free(f); +} + /****************************************************************************/ /* eval function */ /****************************************************************************/ diff --git a/common/utils/T/tracer/filter/filter.h b/common/utils/T/tracer/filter/filter.h index eba02d7fb7..0e48fb6ca3 100644 --- a/common/utils/T/tracer/filter/filter.h +++ b/common/utils/T/tracer/filter/filter.h @@ -9,7 +9,11 @@ filter *filter_and(filter *a, filter *b); filter *filter_eq(filter *a, filter *b); filter *filter_int(int v); filter *filter_evarg(void *database, char *event_name, char *varname); +filter *filter_evfun(void *database, int (*fun)(void *priv, int v), + void *priv, filter *x); int filter_eval(filter *f, event e); +void free_filter(filter *f); + #endif /* _FILTER_H_ */ diff --git a/common/utils/T/tracer/gui/Makefile b/common/utils/T/tracer/gui/Makefile index 53f2077eac..2edec111d7 100644 --- a/common/utils/T/tracer/gui/Makefile +++ b/common/utils/T/tracer/gui/Makefile @@ -2,8 +2,8 @@ CC=gcc CFLAGS=-Wall -g -pthread -I/usr/include/X11/Xft -I/usr/include/freetype2 OBJS=init.o loop.o toplevel_window.o x.o container.o widget.o \ - gui.o label.o event.o xy_plot.o textlist.o notify.o positioner.o \ - timeline.o space.o image.o + gui.o label.o textarea.o event.o xy_plot.o textlist.o notify.o \ + positioner.o timeline.o space.o image.o gui.a: $(OBJS) ar cr gui.a $(OBJS) diff --git a/common/utils/T/tracer/gui/gui.h b/common/utils/T/tracer/gui/gui.h index 27e6603042..0fb96db325 100644 --- a/common/utils/T/tracer/gui/gui.h +++ b/common/utils/T/tracer/gui/gui.h @@ -14,6 +14,10 @@ typedef void widget; #define DEFAULT_FONT 0 +/* tic type for XY plot */ +#define XY_PLOT_DEFAULT_TICK 0 +#define XY_PLOT_SCROLL_TICK 1 + /* key modifiers */ #define KEY_SHIFT (1<<0) #define KEY_CONTROL (1<<1) @@ -30,6 +34,7 @@ widget *new_toplevel_window(gui *gui, int width, int height, char *title); widget *new_container(gui *gui, int vertical); widget *new_positioner(gui *gui); widget *new_label(gui *gui, const char *text); +widget *new_textarea(gui *gui, int width, int height, int maxsize); widget *new_xy_plot(gui *gui, int width, int height, char *label, int vruler_width); widget *new_textlist(gui *gui, int width, int nlines, int background_color); @@ -39,6 +44,9 @@ widget *new_space(gui *gui, int width, int height); widget *new_image(gui *gui, unsigned char *data, int length); void label_set_clickable(gui *gui, widget *label, int clickable); +void label_set_text(gui *gui, widget *label, char *text); + +void textarea_set_text(gui *gui, widget *textarea, char *text); void container_set_child_growable(gui *_gui, widget *_this, widget *child, int growable); @@ -49,6 +57,8 @@ void xy_plot_set_range(gui *gui, widget *this, void xy_plot_set_points(gui *gui, widget *this, int plot, int npoints, float *x, float *y); void xy_plot_get_dimensions(gui *gui, widget *this, int *width, int *height); +void xy_plot_set_title(gui *gui, widget *this, char *label); +void xy_plot_set_tick_type(gui *gui, widget *this, int type); void textlist_add(gui *gui, widget *this, const char *text, int position, int color); diff --git a/common/utils/T/tracer/gui/gui_defs.h b/common/utils/T/tracer/gui/gui_defs.h index ec72bb0e2b..88b8121ec9 100644 --- a/common/utils/T/tracer/gui/gui_defs.h +++ b/common/utils/T/tracer/gui/gui_defs.h @@ -31,7 +31,7 @@ extern int volatile gui_logd; enum widget_type { TOPLEVEL_WINDOW, CONTAINER, POSITIONER, TEXT_LIST, XY_PLOT, BUTTON, LABEL, - TIMELINE, SPACE, IMAGE + TEXTAREA, TIMELINE, SPACE, IMAGE }; struct widget_list; @@ -117,6 +117,7 @@ struct xy_plot_widget { int wanted_height; struct xy_plot_plot *plots; int nplots; + int tick_type; }; struct timeline_subline { @@ -141,13 +142,24 @@ struct button_widget { struct label_widget { struct widget common; - const char *t; + char *t; int color; int width; /* as given by the graphic's backend */ int height; /* as given by the graphic's backend */ int baseline; /* as given by the graphic's backend */ }; +struct textarea_widget { + struct widget common; + char *t; + int tmaxsize; + int color; + int wanted_width; + int wanted_height; + int baseline; /* as given by the graphic's backend */ + int text_width; /* as given by the graphic's backend */ +}; + struct space_widget { struct widget common; int wanted_width; diff --git a/common/utils/T/tracer/gui/label.c b/common/utils/T/tracer/gui/label.c index f649fa5201..02efabfaf3 100644 --- a/common/utils/T/tracer/gui/label.c +++ b/common/utils/T/tracer/gui/label.c @@ -81,3 +81,21 @@ void label_set_clickable(gui *_g, widget *_this, int clickable) gunlock(g); } + +void label_set_text(gui *_g, widget *_this, char *text) +{ + struct gui *g = _g; + struct label_widget *this = _this; + + glock(g); + + free(this->t); + this->t = strdup(text); if (this->t == NULL) OOM; + + x_text_get_dimensions(g->x, DEFAULT_FONT, text, + &this->width, &this->height, &this->baseline); + + send_event(g, REPACK, this->common.id); + + gunlock(g); +} diff --git a/common/utils/T/tracer/gui/textarea.c b/common/utils/T/tracer/gui/textarea.c new file mode 100644 index 0000000000..da84f850ca --- /dev/null +++ b/common/utils/T/tracer/gui/textarea.c @@ -0,0 +1,83 @@ +#include "gui.h" +#include "gui_defs.h" +#include "x.h" +#include +#include +#include + +static void paint(gui *_gui, widget *_w) +{ + struct gui *g = _gui; + struct textarea_widget *t = _w; + LOGD("PAINT textarea '%s'\n", t->t); + x_fill_rectangle(g->x, g->xwin, BACKGROUND_COLOR, + t->common.x, t->common.y, + t->common.width, t->common.height); + x_draw_clipped_string(g->x, g->xwin, DEFAULT_FONT, t->color, + t->common.x + t->common.width - t->text_width, + t->common.y + t->baseline, t->t, + t->common.x, t->common.y, + t->common.width, t->common.height); +} + +static void hints(gui *_gui, widget *_w, int *width, int *height) +{ + struct textarea_widget *t = _w; + LOGD("HINTS textarea '%s'\n", t->t); + *width = t->wanted_width; + *height = t->wanted_height; +} + +widget *new_textarea(gui *_gui, int width, int height, int maxsize) +{ + struct gui *g = _gui; + struct textarea_widget *w; + int _; + + glock(g); + + w = new_widget(g, TEXTAREA, sizeof(struct textarea_widget)); + + w->t = calloc(maxsize, 1); + if (w->t == NULL) OOM; + w->tmaxsize = maxsize; + w->wanted_width = width; + w->wanted_height = height; + w->color = FOREGROUND_COLOR; + w->text_width = 0; + + x_text_get_dimensions(g->x, DEFAULT_FONT, "jlM", + &_, &_, &w->baseline); + + w->common.paint = paint; + w->common.hints = hints; + + gunlock(g); + + return w; +} + +/*************************************************************************/ +/* public functions */ +/*************************************************************************/ + +void textarea_set_text(gui *_g, widget *_this, char *text) +{ + struct gui *g = _g; + struct textarea_widget *this = _this; + int _; + int len = strlen(text); + if (len >= this->tmaxsize) { + fprintf(stderr, "ERROR: string '%s' too big for textarea\n", text); + return; + } + + glock(g); + + strcpy(this->t, text); + x_text_get_dimensions(g->x, DEFAULT_FONT, text, + &this->text_width, &_, &this->baseline); + send_event(g, DIRTY, this->common.id); + + gunlock(g); +} diff --git a/common/utils/T/tracer/gui/widget.c b/common/utils/T/tracer/gui/widget.c index 362d2e1e48..b8ccba6d54 100644 --- a/common/utils/T/tracer/gui/widget.c +++ b/common/utils/T/tracer/gui/widget.c @@ -265,7 +265,7 @@ void widget_dirty(gui *_gui, widget *_this) static const char *names[] = { "TOPLEVEL_WINDOW", "CONTAINER", "POSITIONER", "TEXT_LIST", - "XY_PLOT", "BUTTON", "LABEL", "TIMELINE", "SPACE", "IMAGE" + "XY_PLOT", "BUTTON", "LABEL", "TEXTAREA", "TIMELINE", "SPACE", "IMAGE" }; const char *widget_name(enum widget_type type) { @@ -277,6 +277,7 @@ const char *widget_name(enum widget_type type) case XY_PLOT: case BUTTON: case LABEL: + case TEXTAREA: case TIMELINE: case SPACE: case IMAGE: diff --git a/common/utils/T/tracer/gui/xy_plot.c b/common/utils/T/tracer/gui/xy_plot.c index 7d20a027a1..4115f92103 100644 --- a/common/utils/T/tracer/gui/xy_plot.c +++ b/common/utils/T/tracer/gui/xy_plot.c @@ -1,11 +1,20 @@ #include "gui.h" #include "gui_defs.h" #include "x.h" +#include "../utils.h" #include #include #include #include +#if 0 +/* this version behaves differently when you resize the XY plot. Say + * you increase the size. The old (smaller) view is put at the center + * of the new view. Everything inside keeps the same size/aspect ratio. + * The other version below resizes the old view so that it fully occupies + * the new view. It may introduce aspect ratio changes, but usage seems + * to suggest it's a better behaviour. + */ static void paint(gui *_gui, widget *_this) { struct gui *g = _gui; @@ -70,9 +79,9 @@ static void paint(gui *_gui, widget *_this) */ char v[64]; int vwidth, dummy; - float x = (k * ticstep - allocated_xmin) / - (allocated_xmax - allocated_xmin) * - (allocated_plot_width - 1); + int x = (k * ticstep - allocated_xmin) / + (allocated_xmax - allocated_xmin) * + (allocated_plot_width - 1); x_draw_line(g->x, g->xwin, FOREGROUND_COLOR, this->common.x + this->vrule_width + x, this->common.y + this->common.height - this->label_height * 2, @@ -85,7 +94,7 @@ static void paint(gui *_gui, widget *_this) this->common.y + this->common.height - this->label_height * 2 + this->label_baseline, v); - LOGD("tic k %d val %g x %g\n", k, k * ticstep, x); + LOGD("tic k %d val %g x %d\n", k, k * ticstep, x); } /* vertical tics */ @@ -112,9 +121,9 @@ static void paint(gui *_gui, widget *_this) for (k = kmin; k <= kmax; k++) { char v[64]; int vwidth, dummy; - float y = (k * ticstep - allocated_ymin) / - (allocated_ymax - allocated_ymin) * - (allocated_plot_height - 1); + int y = (k * ticstep - allocated_ymin) / + (allocated_ymax - allocated_ymin) * + (allocated_plot_height - 1); sprintf(v, "%g", k * ticstep); x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy); x_draw_line(g->x, g->xwin, FOREGROUND_COLOR, @@ -155,6 +164,184 @@ static void paint(gui *_gui, widget *_this) x_plot_points(g->x, g->xwin, this->plots[n].color); } } +#endif + +static void paint(gui *_gui, widget *_this) +{ + struct gui *g = _gui; + struct xy_plot_widget *this = _this; + int allocated_plot_width; + int allocated_plot_height; + float pxsize; + float ticdist; + float tic; + float ticstep; + int k, kmin, kmax; + float allocated_xmin, allocated_xmax; + float allocated_ymin, allocated_ymax; + int i; + int n; + char v[64]; + int vwidth, dummy; + +# define FLIP(v) (-(v) + allocated_plot_height-1) + + LOGD("PAINT xy plot xywh %d %d %d %d\n", this->common.x, this->common.y, this->common.width, this->common.height); + +//x_draw_rectangle(g->x, g->xwin, 1, this->common.x, this->common.y, this->common.width, this->common.height); + + allocated_plot_width = this->common.width - this->vrule_width; + allocated_plot_height = this->common.height - this->label_height * 2; + + if (allocated_plot_width <= 1 || allocated_plot_height <= 1) { + WARN("PAINT xy plot: width (%d) or height (%d) is wrong, not painting\n", + this->common.width, this->common.height); + return; + } + + /* plot zone */ + /* TODO: refine height - height of hrule text may be != from label */ + x_draw_rectangle(g->x, g->xwin, 1, + this->common.x + this->vrule_width, + this->common.y, + this->common.width - this->vrule_width -1, /* -1 to see right border */ + this->common.height - this->label_height * 2); + + /* horizontal tics */ + pxsize = (this->xmax - this->xmin) / allocated_plot_width; + ticdist = 100; + tic = floor(log10(ticdist * pxsize)); + ticstep = powf(10, tic); + allocated_xmin = this->xmin; + allocated_xmax = this->xmax; + /* adjust tic if too tight */ + LOGD("pre x ticstep %g\n", ticstep); + while (1) { + if (ticstep / (allocated_xmax - allocated_xmin) + * (allocated_plot_width - 1) > 40) break; + ticstep *= 2; + } + LOGD("post x ticstep %g\n", ticstep); + LOGD("xmin/max %g %g width allocated %d alloc xmin/max %g %g ticstep %g\n", this->xmin, this->xmax, allocated_plot_width, allocated_xmin, allocated_xmax, ticstep); + kmin = ceil(allocated_xmin / ticstep); + kmax = floor(allocated_xmax / ticstep); + for (k = kmin; k <= kmax; k++) { +/* + (k * ticstep - allocated_xmin) / (allocated_max - allocated_xmin) = + (x - 0) / (allocated_plot_width-1 - 0) + */ + int x = (k * ticstep - allocated_xmin) / + (allocated_xmax - allocated_xmin) * + (allocated_plot_width - 1); + int px; + x_draw_line(g->x, g->xwin, FOREGROUND_COLOR, + this->common.x + this->vrule_width + x, + this->common.y + this->common.height - this->label_height * 2, + this->common.x + this->vrule_width + x, + this->common.y + this->common.height - this->label_height * 2 - 5); + sprintf(v, "%g", k * ticstep); + x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy); + + /* do not draw after the widget ('width-1' for if we use 'width' + * it is still off by 1 pixel for whatever reason) */ + px = this->vrule_width + x - vwidth/2; + if (px + vwidth > this->common.width-1) + px = this->common.width-1 - vwidth; + + x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR, + this->common.x + px, + this->common.y + this->common.height - this->label_height * 2 + + this->label_baseline, + v); + LOGD("tic k %d val %g x %d\n", k, k * ticstep, x); + } + + /* vertical tics */ + allocated_ymin = this->ymin; + allocated_ymax = this->ymax; + switch (this->tick_type) { + case XY_PLOT_DEFAULT_TICK: + pxsize = (this->ymax - this->ymin) / allocated_plot_height; + ticdist = 30; + tic = floor(log10(ticdist * pxsize)); + ticstep = powf(10, tic); + /* adjust tic if too tight */ + LOGD("pre y ticstep %g\n", ticstep); + while (1) { + if (ticstep / (allocated_ymax - allocated_ymin) + * (allocated_plot_height - 1) > 20) break; + ticstep *= 2; + } + LOGD("post y ticstep %g\n", ticstep); + LOGD("ymin/max %g %g height allocated %d alloc " + "ymin/max %g %g ticstep %g\n", this->ymin, this->ymax, + allocated_plot_height, allocated_ymin, allocated_ymax, ticstep); + kmin = ceil(allocated_ymin / ticstep); + kmax = floor(allocated_ymax / ticstep); + for (k = kmin; k <= kmax; k++) { + int y = (k * ticstep - allocated_ymin) / + (allocated_ymax - allocated_ymin) * + (allocated_plot_height - 1); + sprintf(v, "%g", k * ticstep); + x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy); + x_draw_line(g->x, g->xwin, FOREGROUND_COLOR, + this->common.x + this->vrule_width, + this->common.y + FLIP(y), + this->common.x + this->vrule_width + 5, + this->common.y + FLIP(y)); + x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR, + this->common.x + this->vrule_width - vwidth - 2, + this->common.y + FLIP(y)-this->label_height/2+this->label_baseline, + v); + } + break; + case XY_PLOT_SCROLL_TICK: + /* print only max value, formatted using 'bps' for readability */ + bps(v, this->ymax, ""); + x_text_get_dimensions(g->x, DEFAULT_FONT, v, &vwidth, &dummy, &dummy); + x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR, + this->common.x + this->vrule_width - vwidth - 2, + this->common.y + +this->label_baseline, + v); + /* vertically divide into 5 */ + for (k = 1; k < 5; k++) { + int y = round((k * (allocated_plot_height - 1)) / 5.); + x_draw_line(g->x, g->xwin, FOREGROUND_COLOR, + this->common.x + this->vrule_width, + this->common.y + y, + this->common.x + this->vrule_width + 5, + this->common.y + y); + } + break; + } /* swich (this->tick_type) */ + + /* label at bottom, in the middle */ + x_draw_string(g->x, g->xwin, DEFAULT_FONT, FOREGROUND_COLOR, + this->common.x + (this->common.width - this->label_width) / 2, + this->common.y + this->common.height - this->label_height + + this->label_baseline, + this->label); + + for (n = 0; n < this->nplots; n++) { + /* points */ + float ax, bx, ay, by; + ax = (allocated_plot_width-1) / (allocated_xmax - allocated_xmin); + bx = -ax * allocated_xmin; + ay = (allocated_plot_height-1) / (allocated_ymax - allocated_ymin); + by = -ay * allocated_ymin; + for (i = 0; i < this->plots[n].npoints; i++) { + int x, y; + x = ax * this->plots[n].x[i] + bx; + y = ay * this->plots[n].y[i] + by; + if (x >= 0 && x < allocated_plot_width && + y >= 0 && y < allocated_plot_height) + x_add_point(g->x, + this->common.x + this->vrule_width + x, + this->common.y + FLIP(y)); + } + x_plot_points(g->x, g->xwin, this->plots[n].color); + } +} static void hints(gui *_gui, widget *_w, int *width, int *height) { @@ -191,6 +378,7 @@ widget *new_xy_plot(gui *_gui, int width, int height, char *label, w->ymax = 1; w->plots = NULL; w->nplots = 0; + w->tick_type = XY_PLOT_DEFAULT_TICK; w->common.paint = paint; w->common.hints = hints; @@ -290,3 +478,36 @@ void xy_plot_get_dimensions(gui *_gui, widget *_this, int *width, int *height) gunlock(g); } + +void xy_plot_set_title(gui *_gui, widget *_this, char *label) +{ + struct gui *g = _gui; + struct xy_plot_widget *this = _this; + + glock(g); + + free(this->label); + this->label = strdup(label); if (this->label == NULL) OOM; + /* TODO: be sure calling X there is valid wrt "global model" (we are + * not in the "gui thread") */ + x_text_get_dimensions(g->x, DEFAULT_FONT, label, + &this->label_width, &this->label_height, &this->label_baseline); + + send_event(g, REPACK, this->common.id); + + gunlock(g); +} + +void xy_plot_set_tick_type(gui *_gui, widget *_this, int type) +{ + struct gui *g = _gui; + struct xy_plot_widget *this = _this; + + glock(g); + + this->tick_type = type; + + send_event(g, DIRTY, this->common.id); + + gunlock(g); +} diff --git a/common/utils/T/tracer/hacks/Makefile b/common/utils/T/tracer/hacks/Makefile index ab10305c0b..f49e437bf5 100644 --- a/common/utils/T/tracer/hacks/Makefile +++ b/common/utils/T/tracer/hacks/Makefile @@ -3,16 +3,23 @@ CFLAGS=-Wall -g -pthread -DT_TRACER -I. -I.. LIBS=-lX11 -lm -lpng -lXft -all: dump_nack_signal +all: dump_nack_signal time_meas timeplot dump_nack_signal: ../utils.o ../database.o ../config.o ../event.o \ dump_nack_signal.o $(CC) $(CFLAGS) -o dump_nack_signal $^ $(LIBS) +time_meas: ../utils.o ../database.o ../config.o ../event.o \ + time_meas.o + $(CC) $(CFLAGS) -o time_meas $^ $(LIBS) + +timplot: timeplot.o + $(CC) $(CFLAGS) -o timeplot $^ $(LIBS) + .PHONY: all %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< clean: - rm -f *.o core dump_nack_signal + rm -f *.o core dump_nack_signal time_meas timeplot diff --git a/common/utils/T/tracer/hacks/time_meas.c b/common/utils/T/tracer/hacks/time_meas.c new file mode 100644 index 0000000000..04d4fa5acf --- /dev/null +++ b/common/utils/T/tracer/hacks/time_meas.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include "utils.h" +#include "event.h" +#include "database.h" +#include "config.h" +#include "../T_defs.h" + +void usage(void) +{ + printf( +"options:\n" +" -d this option is mandatory\n" +" -ip connect to given IP address (default %s)\n" +" -p connect to given port (default %d)\n", + DEFAULT_REMOTE_IP, + DEFAULT_REMOTE_PORT + ); + exit(1); +} + +struct timespec time_sub(struct timespec a, struct timespec b) +{ + struct timespec ret; + if (a.tv_nsec < b.tv_nsec) { + ret.tv_nsec = (int64_t)a.tv_nsec - (int64_t)b.tv_nsec + 1000000000; + ret.tv_sec = a.tv_sec - b.tv_sec - 1; + } else { + ret.tv_nsec = a.tv_nsec - b.tv_nsec; + ret.tv_sec = a.tv_sec - b.tv_sec; + } + return ret; +} + +int main(int n, char **v) +{ + char *database_filename = NULL; + void *database; + char *ip = DEFAULT_REMOTE_IP; + int port = DEFAULT_REMOTE_PORT; + int i; + char t; + int number_of_events; + int socket; + int *is_on; + int ev_fun; + int start_valid = 0; + struct timespec start_time, stop_time, delta_time; + + for (i = 1; i < n; i++) { + if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); + if (!strcmp(v[i], "-d")) + { if (i > n-2) usage(); database_filename = v[++i]; continue; } + if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; } + if (!strcmp(v[i], "-p")) + { if (i > n-2) usage(); port = atoi(v[++i]); continue; } + usage(); + } + + if (database_filename == NULL) { + printf("ERROR: provide a database file (-d)\n"); + exit(1); + } + + database = parse_database(database_filename); + + load_config_file(database_filename); + + number_of_events = number_of_ids(database); + is_on = calloc(number_of_events, sizeof(int)); + if (is_on == NULL) abort(); + + on_off(database, "VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER", is_on, 1); + + ev_fun = event_id_from_name(database, + "VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER"); + + socket = connect_to(ip, port); + + t = 1; + if (socket_send(socket, &t, 1) == -1 || + socket_send(socket, &number_of_events, sizeof(int)) == -1 || + socket_send(socket, is_on, number_of_events * sizeof(int)) == -1) + abort(); + + while (1) { + char v[T_BUFFER_MAX]; + event e; + int on_off; + e = get_event(socket, v, database); + if (e.type == -1) break; + if (e.type != ev_fun) + { printf("unhandled event %d\n", e.type); continue; } + on_off = e.e[0].i; +printf("yo %d\n", on_off); + if (on_off == 1) { + start_time = e.sending_time; + start_valid = 1; + continue; + } + if (on_off != 0) { printf("fatal!\n"); abort(); } + if (!start_valid) continue; + stop_time = e.sending_time; + delta_time = time_sub(stop_time, start_time); + fprintf(stderr, "%ld\n", + delta_time.tv_sec * 1000000000UL + delta_time.tv_nsec); + fflush(stderr); + } + + return 0; +} diff --git a/common/utils/T/tracer/hacks/timeplot.c b/common/utils/T/tracer/hacks/timeplot.c new file mode 100644 index 0000000000..79905d16f9 --- /dev/null +++ b/common/utils/T/tracer/hacks/timeplot.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include +#include + +void RESET(void) +{ printf("\x1b""c"); fflush(stdout); } + +void GOTO(int x, int y) +{ char s[64];sprintf(s,"\x1b[%d;%dH",y,x);printf("%s",s);fflush(stdout); } + +void HIDE_CURSOR(void) +{ printf("\x1b[?25l"); fflush(stdout); } + +void sig(int x) +{ + RESET(); + exit(0); +} + +/* 0: [0-2[ + * ... + * 48: [96-98[ + * 49: [98-infinity] + */ +int bins[50]; + +#define N 1000 +int data[N]; + +void plot(void) +{ + int i; + int max = 0; + int vmin = data[0]; + int vmax = 0; + long vavg; + memset(bins, 0, sizeof(bins)); + int binsize_ns = 500; + + vavg = 0; + + for (i = 0; i < N; i++) { + if (data[i] < vmin) vmin = data[i]; + if (data[i] > vmax) vmax = data[i]; + vavg += data[i]; + int ms2 = data[i]/binsize_ns; + if (ms2 > 49) ms2 = 49; + bins[ms2]++; + if (bins[ms2] > max) max = bins[ms2]; + } + + vavg /= N; + + GOTO(1,1); + for (i = 0; i < 50; i++) { + double binend = (i+1) * binsize_ns / 1000.; + int k; + int width = bins[i] * 70 / max; + /* force at least width of 1 if some point is there */ + if (bins[i] && width == 0) width = 1; + printf("%#5.1f ", binend); + for (k = 0; k < width; k++) putchar('#'); + for (; k < 70; k++) putchar(' '); + putchar('\n'); + } + printf("min %d ns max %d ns avg %ld ns\n", vmin, vmax, vavg); +} + +int main(void) +{ + int i; + int pos = 0; + signal(SIGINT, sig); + RESET(); + HIDE_CURSOR(); + while (!feof(stdin)) { + for (i=0; i<100; i++) { scanf("%d", &data[pos]); pos++; pos%=N; } + plot(); + } + RESET(); + return 0; +} diff --git a/common/utils/T/tracer/logger/Makefile b/common/utils/T/tracer/logger/Makefile index 92431739db..28f0e0b813 100644 --- a/common/utils/T/tracer/logger/Makefile +++ b/common/utils/T/tracer/logger/Makefile @@ -2,7 +2,7 @@ CC=gcc CFLAGS=-Wall -g -pthread -I.. OBJS=logger.o textlog.o framelog.o ttilog.o timelog.o ticklog.o iqlog.o \ - iqdotlog.o + iqdotlog.o ticked_ttilog.o throughputlog.o logger.a: $(OBJS) ar cr logger.a $(OBJS) diff --git a/common/utils/T/tracer/logger/logger.c b/common/utils/T/tracer/logger/logger.c index ab6fb8bc62..ffba2d25c0 100644 --- a/common/utils/T/tracer/logger/logger.c +++ b/common/utils/T/tracer/logger/logger.c @@ -1,5 +1,6 @@ #include "logger.h" #include "logger_defs.h" +#include "filter/filter.h" #include void logger_add_view(logger *_l, view *v) @@ -13,5 +14,6 @@ void logger_add_view(logger *_l, view *v) void logger_set_filter(logger *_l, void *filter) { struct logger *l = _l; + free_filter(l->filter); l->filter = filter; } diff --git a/common/utils/T/tracer/logger/logger.h b/common/utils/T/tracer/logger/logger.h index b2ab4f8cbc..434cf5a90f 100644 --- a/common/utils/T/tracer/logger/logger.h +++ b/common/utils/T/tracer/logger/logger.h @@ -10,6 +10,13 @@ logger *new_textlog(void *event_handler, void *database, logger *new_ttilog(void *event_handler, void *database, char *event_name, char *frame_varname, char *subframe_varname, char *data_varname, int convert_to_dB); +logger *new_ticked_ttilog(void *event_handler, void *database, + char *tick_event_name, char *frame_varname, char *subframe_varname, + char *event_name, char *data_varname, + int convert_to_dB, float empty_value); +logger *new_throughputlog(void *event_handler, void *database, + char *tick_event_name, char *frame_varname, char *subframe_varname, + char *event_name, char *data_varname); logger *new_timelog(void *event_handler, void *database, char *event_name); logger *new_ticklog(void *event_handler, void *database, char *event_name, char *frame_name, char *subframe_name); @@ -28,5 +35,6 @@ void textlog_dump_buffer(logger *_this, int dump_buffer); void logger_add_view(logger *l, view *v); void logger_set_filter(logger *l, void *filter); +void ticked_ttilog_set_tick_filter(logger *l, void *filter); #endif /* _LOGGER_H_ */ diff --git a/common/utils/T/tracer/logger/throughputlog.c b/common/utils/T/tracer/logger/throughputlog.c new file mode 100644 index 0000000000..8a2d46da91 --- /dev/null +++ b/common/utils/T/tracer/logger/throughputlog.c @@ -0,0 +1,194 @@ +#include "logger.h" +#include "logger_defs.h" +#include "event.h" +#include "database.h" +#include "handler.h" +#include "filter/filter.h" +#include +#include +#include +#include + +struct throughputlog { + struct logger common; + void *database; + int tick_frame_arg; + int tick_subframe_arg; + int data_frame_arg; + int data_subframe_arg; + int data_arg; + int last_tick_frame; + int last_tick_subframe; + unsigned long bits[1000]; + unsigned long total; + int insert_point; + char *tick_event_name; + unsigned long tick_handler_id; + /* tick filter - NULL is no filter set */ + void *tick_filter; +}; + +static void _event(void *p, event e) +{ + struct throughputlog *l = p; + int frame; + int subframe; + unsigned long value; + + if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0) + return; + + frame = e.e[l->data_frame_arg].i; + subframe = e.e[l->data_subframe_arg].i; + + if (frame != l->last_tick_frame || subframe != l->last_tick_subframe) { + printf("WARNING: %s:%d: data comes without previous tick!\n", + __FILE__, __LINE__); + return; + } + + switch (e.e[l->data_arg].type) { + case EVENT_INT: value = e.e[l->data_arg].i; break; + case EVENT_ULONG: value = e.e[l->data_arg].ul; break; + default: printf("%s:%d: unsupported type\n", __FILE__, __LINE__); abort(); + } + + l->total += value; + l->bits[l->insert_point] += value; +} + +static void _tick_event(void *p, event e) +{ + struct throughputlog *l = p; + int i; + int frame; + int subframe; + + if (l->tick_filter != NULL && filter_eval(l->tick_filter, e) == 0) + return; + + frame = e.e[l->tick_frame_arg].i; + subframe = e.e[l->tick_subframe_arg].i; + + for (i = 0; i < l->common.vsize; i++) + l->common.v[i]->append(l->common.v[i], frame, subframe, (double)l->total); + + l->insert_point = (l->insert_point + 1) % 1000; + l->total -= l->bits[l->insert_point]; + l->bits[l->insert_point] = 0; + + l->last_tick_frame = frame; + l->last_tick_subframe = subframe; +} + +logger *new_throughputlog(event_handler *h, void *database, + char *tick_event_name, char *frame_varname, char *subframe_varname, + char *event_name, char *data_varname) +{ + struct throughputlog *ret; + int event_id; + database_event_format f; + int i; + + ret = calloc(1, sizeof(struct throughputlog)); if (ret == NULL) abort(); + + ret->common.event_name = strdup(event_name); + if (ret->common.event_name == NULL) abort(); + ret->database = database; + + ret->tick_event_name = strdup(tick_event_name); + if (ret->tick_event_name == NULL) abort(); + + /* tick event */ + event_id = event_id_from_name(database, tick_event_name); + + ret->tick_handler_id=register_handler_function(h,event_id,_tick_event,ret); + + f = get_format(database, event_id); + + /* look for frame and subframe */ + ret->tick_frame_arg = -1; + ret->tick_subframe_arg = -1; + for (i = 0; i < f.count; i++) { + if (!strcmp(f.name[i], frame_varname)) ret->tick_frame_arg = i; + if (!strcmp(f.name[i], subframe_varname)) ret->tick_subframe_arg = i; + } + if (ret->tick_frame_arg == -1) { + printf("%s:%d: frame argument '%s' not found in event '%s'\n", + __FILE__, __LINE__, frame_varname, event_name); + abort(); + } + if (ret->tick_subframe_arg == -1) { + printf("%s:%d: subframe argument '%s' not found in event '%s'\n", + __FILE__, __LINE__, subframe_varname, event_name); + abort(); + } + if (strcmp(f.type[ret->tick_frame_arg], "int") != 0) { + printf("%s:%d: argument '%s' has wrong type (should be 'int')\n", + __FILE__, __LINE__, frame_varname); + abort(); + } + if (strcmp(f.type[ret->tick_subframe_arg], "int") != 0) { + printf("%s:%d: argument '%s' has wrong type (should be 'int')\n", + __FILE__, __LINE__, subframe_varname); + abort(); + } + + /* data event */ + event_id = event_id_from_name(database, event_name); + + ret->common.handler_id = register_handler_function(h,event_id,_event,ret); + + f = get_format(database, event_id); + + /* look for frame, subframe and data args */ + ret->data_frame_arg = -1; + ret->data_subframe_arg = -1; + ret->data_arg = -1; + for (i = 0; i < f.count; i++) { + if (!strcmp(f.name[i], frame_varname)) ret->data_frame_arg = i; + if (!strcmp(f.name[i], subframe_varname)) ret->data_subframe_arg = i; + if (!strcmp(f.name[i], data_varname)) ret->data_arg = i; + } + if (ret->data_frame_arg == -1) { + printf("%s:%d: frame argument '%s' not found in event '%s'\n", + __FILE__, __LINE__, frame_varname, event_name); + abort(); + } + if (ret->data_subframe_arg == -1) { + printf("%s:%d: subframe argument '%s' not found in event '%s'\n", + __FILE__, __LINE__, subframe_varname, event_name); + abort(); + } + if (ret->data_arg == -1) { + printf("%s:%d: data argument '%s' not found in event '%s'\n", + __FILE__, __LINE__, data_varname, event_name); + abort(); + } + if (strcmp(f.type[ret->data_frame_arg], "int") != 0) { + printf("%s:%d: argument '%s' has wrong type (should be 'int')\n", + __FILE__, __LINE__, frame_varname); + abort(); + } + if (strcmp(f.type[ret->data_subframe_arg], "int") != 0) { + printf("%s:%d: argument '%s' has wrong type (should be 'int')\n", + __FILE__, __LINE__, subframe_varname); + abort(); + } + if (strcmp(f.type[ret->data_arg], "int") != 0 && + strcmp(f.type[ret->data_arg], "float") != 0) { + printf("%s:%d: argument '%s' has wrong type" + " (should be 'int' or 'float')\n", + __FILE__, __LINE__, data_varname); + abort(); + } + + return ret; +} + +void throughputlog_set_tick_filter(logger *_l, void *filter) +{ + struct throughputlog *l = (struct throughputlog *)_l; + free(l->tick_filter); + l->tick_filter = filter; +} diff --git a/common/utils/T/tracer/logger/ticked_ttilog.c b/common/utils/T/tracer/logger/ticked_ttilog.c new file mode 100644 index 0000000000..53bbad7681 --- /dev/null +++ b/common/utils/T/tracer/logger/ticked_ttilog.c @@ -0,0 +1,196 @@ +#include "logger.h" +#include "logger_defs.h" +#include "event.h" +#include "database.h" +#include "handler.h" +#include "filter/filter.h" +#include +#include +#include +#include + +struct ticked_ttilog { + struct logger common; + void *database; + int tick_frame_arg; + int tick_subframe_arg; + int data_frame_arg; + int data_subframe_arg; + int data_arg; + int convert_to_dB; + int last_tick_frame; + int last_tick_subframe; + float last_value; + float empty_value; + char *tick_event_name; + unsigned long tick_handler_id; + /* tick filter - NULL is no filter set */ + void *tick_filter; +}; + +static void _event(void *p, event e) +{ + struct ticked_ttilog *l = p; + int frame; + int subframe; + float value; + + if (l->common.filter != NULL && filter_eval(l->common.filter, e) == 0) + return; + + frame = e.e[l->data_frame_arg].i; + subframe = e.e[l->data_subframe_arg].i; + + if (frame != l->last_tick_frame || subframe != l->last_tick_subframe) { + printf("WARNING: %s:%d: data comes without previous tick!\n", + __FILE__, __LINE__); + return; + } + + switch (e.e[l->data_arg].type) { + case EVENT_INT: value = e.e[l->data_arg].i; break; + case EVENT_ULONG: value = e.e[l->data_arg].ul; break; + default: printf("%s:%d: unsupported type\n", __FILE__, __LINE__); abort(); + } + + if (l->convert_to_dB) value = 10 * log10(value); + + l->last_value = value; +} + +static void _tick_event(void *p, event e) +{ + struct ticked_ttilog *l = p; + int i; + int frame; + int subframe; + + if (l->tick_filter != NULL && filter_eval(l->tick_filter, e) == 0) + return; + + frame = e.e[l->tick_frame_arg].i; + subframe = e.e[l->tick_subframe_arg].i; + + for (i = 0; i < l->common.vsize; i++) + l->common.v[i]->append(l->common.v[i], frame, subframe, l->last_value); + + l->last_value = l->empty_value; + l->last_tick_frame = frame; + l->last_tick_subframe = subframe; +} + +logger *new_ticked_ttilog(event_handler *h, void *database, + char *tick_event_name, char *frame_varname, char *subframe_varname, + char *event_name, char *data_varname, + int convert_to_dB, float empty_value) +{ + struct ticked_ttilog *ret; + int event_id; + database_event_format f; + int i; + + ret = calloc(1, sizeof(struct ticked_ttilog)); if (ret == NULL) abort(); + + ret->common.event_name = strdup(event_name); + if (ret->common.event_name == NULL) abort(); + ret->database = database; + ret->convert_to_dB = convert_to_dB; + + ret->tick_event_name = strdup(tick_event_name); + if (ret->tick_event_name == NULL) abort(); + ret->empty_value = empty_value; + ret->last_value = empty_value; + + /* tick event */ + event_id = event_id_from_name(database, tick_event_name); + + ret->tick_handler_id=register_handler_function(h,event_id,_tick_event,ret); + + f = get_format(database, event_id); + + /* look for frame and subframe */ + ret->tick_frame_arg = -1; + ret->tick_subframe_arg = -1; + for (i = 0; i < f.count; i++) { + if (!strcmp(f.name[i], frame_varname)) ret->tick_frame_arg = i; + if (!strcmp(f.name[i], subframe_varname)) ret->tick_subframe_arg = i; + } + if (ret->tick_frame_arg == -1) { + printf("%s:%d: frame argument '%s' not found in event '%s'\n", + __FILE__, __LINE__, frame_varname, event_name); + abort(); + } + if (ret->tick_subframe_arg == -1) { + printf("%s:%d: subframe argument '%s' not found in event '%s'\n", + __FILE__, __LINE__, subframe_varname, event_name); + abort(); + } + if (strcmp(f.type[ret->tick_frame_arg], "int") != 0) { + printf("%s:%d: argument '%s' has wrong type (should be 'int')\n", + __FILE__, __LINE__, frame_varname); + abort(); + } + if (strcmp(f.type[ret->tick_subframe_arg], "int") != 0) { + printf("%s:%d: argument '%s' has wrong type (should be 'int')\n", + __FILE__, __LINE__, subframe_varname); + abort(); + } + + /* data event */ + event_id = event_id_from_name(database, event_name); + + ret->common.handler_id = register_handler_function(h,event_id,_event,ret); + + f = get_format(database, event_id); + + /* look for frame, subframe and data args */ + ret->data_frame_arg = -1; + ret->data_subframe_arg = -1; + ret->data_arg = -1; + for (i = 0; i < f.count; i++) { + if (!strcmp(f.name[i], frame_varname)) ret->data_frame_arg = i; + if (!strcmp(f.name[i], subframe_varname)) ret->data_subframe_arg = i; + if (!strcmp(f.name[i], data_varname)) ret->data_arg = i; + } + if (ret->data_frame_arg == -1) { + printf("%s:%d: frame argument '%s' not found in event '%s'\n", + __FILE__, __LINE__, frame_varname, event_name); + abort(); + } + if (ret->data_subframe_arg == -1) { + printf("%s:%d: subframe argument '%s' not found in event '%s'\n", + __FILE__, __LINE__, subframe_varname, event_name); + abort(); + } + if (ret->data_arg == -1) { + printf("%s:%d: data argument '%s' not found in event '%s'\n", + __FILE__, __LINE__, data_varname, event_name); + abort(); + } + if (strcmp(f.type[ret->data_frame_arg], "int") != 0) { + printf("%s:%d: argument '%s' has wrong type (should be 'int')\n", + __FILE__, __LINE__, frame_varname); + abort(); + } + if (strcmp(f.type[ret->data_subframe_arg], "int") != 0) { + printf("%s:%d: argument '%s' has wrong type (should be 'int')\n", + __FILE__, __LINE__, subframe_varname); + abort(); + } + if (strcmp(f.type[ret->data_arg], "int") != 0 && + strcmp(f.type[ret->data_arg], "float") != 0) { + printf("%s:%d: argument '%s' has wrong type" + " (should be 'int' or 'float')\n", + __FILE__, __LINE__, data_varname); + abort(); + } + + return ret; +} + +void ticked_ttilog_set_tick_filter(logger *_l, void *filter) +{ + struct ticked_ttilog *l = (struct ticked_ttilog *)_l; + free(l->tick_filter); + l->tick_filter = filter; +} diff --git a/common/utils/T/tracer/macpdu2wireshark.c b/common/utils/T/tracer/macpdu2wireshark.c index 886638f5ef..be0bbd3821 100644 --- a/common/utils/T/tracer/macpdu2wireshark.c +++ b/common/utils/T/tracer/macpdu2wireshark.c @@ -177,7 +177,7 @@ void usage(void) printf( "options:\n" " -d this option is mandatory\n" -" -in read events from this dump file\n" +" -i read events from this dump file\n" " -ip send packets to this IP address (default %s)\n" " -p send packets to this port (default %d)\n", DEFAULT_IP, @@ -205,7 +205,7 @@ int main(int n, char **v) if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); if (!strcmp(v[i], "-d")) { if (i > n-2) usage(); database_filename = v[++i]; continue; } - if (!strcmp(v[i], "-in")) + if (!strcmp(v[i], "-i")) { if (i > n-2) usage(); input_filename = v[++i]; continue; } if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; } if (!strcmp(v[i], "-p")) {if(i>n-2)usage(); port=atoi(v[++i]); continue; } diff --git a/common/utils/T/tracer/packet-mac-lte.h b/common/utils/T/tracer/packet-mac-lte.h index 039b9dc3c4..e418f3417e 100644 --- a/common/utils/T/tracer/packet-mac-lte.h +++ b/common/utils/T/tracer/packet-mac-lte.h @@ -6,20 +6,6 @@ * By Gerald Combs * Copyright 1998 Gerald Combs * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * * This header file may also be distributed under * the terms of the BSD Licence as follows: * diff --git a/common/utils/T/tracer/to_vcd.c b/common/utils/T/tracer/to_vcd.c new file mode 100644 index 0000000000..82cd3393d7 --- /dev/null +++ b/common/utils/T/tracer/to_vcd.c @@ -0,0 +1,302 @@ +#include +#include +#include +#include +#include +#include +#include +#include "database.h" +#include "utils.h" +#include "handler.h" +#include "config.h" +#include "logger/logger.h" +#include "view/view.h" + +typedef struct { + char *event; + char *arg; + char *vcd_name; + int boolean; +} vcd_vars; + +/****************************************************************************/ +/* VCD file handling begin */ +/****************************************************************************/ + +FILE *out; + +uint64_t start_time; +int start_time_inited; + +void vcd_init(char *file) +{ + out = fopen(file, "w"); if (out == NULL) { perror(file); exit(1); } +} + +void vcd_write_header(vcd_vars *v, int n) +{ + int i; + + if (fprintf(out, +"$date\n" +" January, 1, 1970.\n" +"$end\n" +"$version\n" +" to_vcd\n" +"$end\n" +"$timescale 1ns $end\n" +"$scope module logic $end\n") <= 0) abort(); + + for (i = 0; i < n; i++) + if (fprintf(out, "$var wire %d %s %s $end\n", + v[i].boolean ? 1 : 64, + v[i].vcd_name, v[i].vcd_name) <= 0) abort(); + + if (fprintf(out, +"$upscope $end\n" +"$enddefinitions $end\n" +"$dumpvars\n") <= 0) abort(); + + for (i = 0; i < n; i++) + if (v[i].boolean) { + if (fprintf(out, "0%s\n", v[i].vcd_name) <= 0) abort(); + } else { + if (fprintf(out, "b0 %s\n", v[i].vcd_name) <= 0) abort(); + } + + if (fprintf(out, +"$end\n") <= 0) abort(); + +} + +void vcd_end(void) +{ + if (fclose(out)) { perror("error closing VCD file"); exit(1); } +} + +char *b64(uint64_t val) +{ + static char v[65]; + char *s = &v[64]; + *s = 0; + if (val == 0) { s--; *s = '0'; return s; } + while (val) { + s--; + *s = val&1 ? '1' : '0'; + val >>= 1; + } + return s; +} + +void vcd_dump(char *v) +{ + uint64_t h, m, s, ns; + char t; + uint64_t val; + uint64_t time; + char var[256]; + if (sscanf(v, "%"SCNu64":%"SCNu64":%"SCNu64".%"SCNu64": %c %"SCNu64" %s", + &h, &m, &s, &ns, &t, &val, var) != 7) + goto err; + time = h*60*60*1000000000 + + m*60*1000000000 + + s*1000000000 + + ns; + if (!start_time_inited) { + start_time = time; + start_time_inited = 1; + } + if (fprintf(out, "#%"PRIu64"\n", time - start_time) <= 0) abort(); + switch (t) { + case 'b': if (fprintf(out, "%d%s\n", val!=0, var) <= 0) abort(); break; + case 'l': if (fprintf(out, "b%s %s\n", b64(val), var) <= 0) abort(); break; + default: goto err; + } + + return; + +err: + printf("bad vcd_dump line '%s'\n", v); + exit(1); +} + +/****************************************************************************/ +/* VCD file handling end */ +/****************************************************************************/ + + +/****************************************************************************/ +/* vcd view start */ +/****************************************************************************/ + +struct vcd_view { + view common; +}; + +static void vcd_view_clear(view *this) +{ + /* nothing */ +} + +static void vcd_view_append(view *_this, char *s) +{ + vcd_dump(s); +} + +static view *new_view_vcd(void) +{ + struct vcd_view *ret = calloc(1, sizeof(struct vcd_view)); + if (ret == NULL) abort(); + ret->common.clear = vcd_view_clear; + ret->common.append = (void (*)(view *, ...))vcd_view_append; + return (view *)ret; +} + +/****************************************************************************/ +/* vcd view end */ +/****************************************************************************/ + +void activate_traces(int socket, int number_of_events, int *is_on) +{ + char t = 1; + if (socket_send(socket, &t, 1) == -1 || + socket_send(socket, &number_of_events, sizeof(int)) == -1 || + socket_send(socket, is_on, number_of_events * sizeof(int)) == -1) + abort(); +} + +void usage(void) +{ + printf( +"options:\n" +" -d this option is mandatory\n" +" -o this option is mandatory\n" +" -ip connect to given IP address (default %s)\n" +" -p connect to given port (default %d)\n" +" -b trace as binary (0 off, anything else on)\n" +" -l trace as uint64_t\n", + DEFAULT_REMOTE_IP, + DEFAULT_REMOTE_PORT + ); + exit(1); +} + +int run = 1; +static int socket = -1; + +void force_stop(int x) +{ + printf("\ngently quit...\n"); + close(socket); + socket = -1; + run = 0; +} + +int main(int n, char **v) +{ + char *output_filename = NULL; + char *database_filename = NULL; + void *database; + char *ip = DEFAULT_REMOTE_IP; + int port = DEFAULT_REMOTE_PORT; + int *is_on; + int number_of_events; + int i; + vcd_vars vars[n]; + int nvars = 0; + view *vcd_view; + event_handler *h; + logger *textlog; + + /* write on a socket fails if the other end is closed and we get SIGPIPE */ + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort(); + + for (i = 1; i < n; i++) { + if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); + if (!strcmp(v[i], "-d")) + { if (i > n-2) usage(); database_filename = v[++i]; continue; } + if (!strcmp(v[i], "-o")) + { if (i > n-2) usage(); output_filename = v[++i]; continue; } + if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; } + if (!strcmp(v[i], "-p")) + { if (i > n-2) usage(); port = atoi(v[++i]); continue; } + if (!strcmp(v[i], "-b")) { if(i>n-4)usage(); + vars[nvars].event = v[++i]; + vars[nvars].arg = v[++i]; + vars[nvars].vcd_name = v[++i]; + vars[nvars++].boolean = 1; + continue; + } + if (!strcmp(v[i], "-l")) { if(i>n-4)usage(); + vars[nvars].event = v[++i]; + vars[nvars].arg = v[++i]; + vars[nvars].vcd_name = v[++i]; + vars[nvars++].boolean = 0; + continue; + } + usage(); + } + + if (output_filename == NULL) { + printf("ERROR; provide an output file (-o)\n"); + exit(1); + } + + if (database_filename == NULL) { + printf("ERROR: provide a database file (-d)\n"); + exit(1); + } + + database = parse_database(database_filename); + + load_config_file(database_filename); + + number_of_events = number_of_ids(database); + is_on = calloc(number_of_events, sizeof(int)); + if (is_on == NULL) abort(); + + h = new_handler(database); + + /* create the view */ + vcd_view = new_view_vcd(); + + /* setup traces */ + for (i = 0; i < nvars; i++) { + char format[256]; + if (strlen(vars[i].arg) > 256-3) abort(); + if (strlen(vars[i].vcd_name) > 256-1) abort(); + sprintf(format, "%c [%s] %s", + vars[i].boolean ? 'b' : 'l', + vars[i].arg, + vars[i].vcd_name); + textlog = new_textlog(h, database, vars[i].event, format); + logger_add_view(textlog, vcd_view); + on_off(database, vars[i].event, is_on, 1); + } + + socket = connect_to(ip, port); + + /* activate selected traces */ + activate_traces(socket, number_of_events, is_on); + + vcd_init(output_filename); + vcd_write_header(vars, nvars); + + /* exit on ctrl+c and ctrl+z */ + if (signal(SIGQUIT, force_stop) == SIG_ERR) abort(); + if (signal(SIGINT, force_stop) == SIG_ERR) abort(); + if (signal(SIGTSTP, force_stop) == SIG_ERR) abort(); + + /* read messages */ + while (run) { + char v[T_BUFFER_MAX]; + event e; + e = get_event(socket, v, database); + if (e.type == -1) { printf("disconnected? let's quit gently\n"); break; } + handle_event(h, e); + } + + vcd_end(); + + return 0; +} diff --git a/common/utils/T/tracer/ue.c b/common/utils/T/tracer/ue.c new file mode 100644 index 0000000000..5709a4e79e --- /dev/null +++ b/common/utils/T/tracer/ue.c @@ -0,0 +1,876 @@ +#include +#include +#include +#include +#include +#include +#include "database.h" +#include "event.h" +#include "handler.h" +#include "logger/logger.h" +#include "view/view.h" +#include "gui/gui.h" +#include "filter/filter.h" +#include "utils.h" +#include "../T_defs.h" +#include "event_selector.h" +#include "openair_logo.h" +#include "config.h" + +typedef struct { + view *phyview; + view *macview; + view *rlcview; + view *pdcpview; + view *rrcview; + view *legacy; + widget *current_ue_label; + widget *prev_ue_button; + widget *next_ue_button; + widget *pdsch_iq_ue_xy_plot; + widget *dl_estimate_ue_xy_plot; + widget *pdcch_energy_ue_xy_plot; + widget *pdsch_energy_ue_xy_plot; + widget *pdcch_iq_ue_xy_plot; + widget *dl_ul_harq_ue_label; + widget *dl_mcs_xy_plot; + widget *ul_mcs_xy_plot; + widget *pusch_power_xy_plot; + widget *pucch_power_xy_plot; + widget *phy_meas_xy_plot; + logger *pdsch_iq_ue_logger; + logger *dl_estimate_ue_logger; + logger *pdcch_iq_ue_logger; + logger *dl_dci_logger[8]; + logger *dl_ack_logger[8]; + logger *dl_nack_logger[8]; + logger *ul_dci_logger[8]; + logger *ul_dci_retransmission_logger[8]; + logger *ul_ack_logger[8]; + logger *ul_nack_logger[8]; + logger *dl_mcs_logger; + logger *ul_mcs_logger; + logger *pusch_power_logger; + logger *pusch_ampl_logger; + logger *pucch_power_logger; + logger *pucch_ampl_logger; + logger *pdcch_energy_logger; + logger *pdsch_energy_logger; + logger *phy_meas_logger; +} ue_gui; + +typedef struct { + int socket; + int *is_on; + int nevents; + pthread_mutex_t lock; + ue_gui *e; + int ue; /* what UE is displayed in the UE specific views */ + void *database; +} ue_data; + +void is_on_changed(void *_d) +{ + ue_data *d = _d; + char t; + + if (pthread_mutex_lock(&d->lock)) abort(); + + if (d->socket == -1) goto no_connection; + + t = 1; + if (socket_send(d->socket, &t, 1) == -1 || + socket_send(d->socket, &d->nevents, sizeof(int)) == -1 || + socket_send(d->socket, d->is_on, d->nevents * sizeof(int)) == -1) + goto connection_dies; + +no_connection: + if (pthread_mutex_unlock(&d->lock)) abort(); + return; + +connection_dies: + close(d->socket); + d->socket = -1; + if (pthread_mutex_unlock(&d->lock)) abort(); +} + +void usage(void) +{ + printf( +"options:\n" +" -d this option is mandatory\n" +" -on turn log ON for given GROUP or ID\n" +" -off turn log OFF for given GROUP or ID\n" +" -ON turn all logs ON\n" +" -OFF turn all logs OFF\n" +" note: you may pass several -on/-off/-ON/-OFF,\n" +" they will be processed in order\n" +" by default, all is off\n" +" -ip connect to given IP address (default %s)\n" +" -p connect to given port (default %d)\n" +" -debug-gui activate GUI debug logs\n", + DEFAULT_REMOTE_IP, + DEFAULT_REMOTE_PORT + ); + exit(1); +} + +static void *gui_thread(void *_g) +{ + gui *g = _g; + gui_loop(g); + return NULL; +} + +static filter *ticktime_filter(void *database, char *event, int i, int ue) +{ + /* filter is "harq_pid == i && UE_id == 0 && eNB_id == 0" */ + return + filter_and( + filter_eq(filter_evarg(database, event, "harq_pid"), filter_int(i)), + filter_and( + filter_eq(filter_evarg(database, event, "UE_id"), filter_int(ue)), + filter_eq(filter_evarg(database, event, "eNB_ID"), filter_int(0)))); +} + +static void set_current_ue(gui *g, ue_data *e, int ue) +{ + int i; + char s[256]; + + sprintf(s, "[UE %d] ", ue); + label_set_text(g, e->e->current_ue_label, s); + sprintf(s, "PDSCH IQ [UE %d]", ue); + xy_plot_set_title(g, e->e->pdsch_iq_ue_xy_plot, s); + sprintf(s, "DL estimated channel [UE %d]", ue); + xy_plot_set_title(g, e->e->dl_estimate_ue_xy_plot, s); + sprintf(s, "PDCCH energy [UE %d]", ue); + xy_plot_set_title(g, e->e->pdcch_energy_ue_xy_plot, s); + sprintf(s, "PDSCH energy [UE %d]", ue); + xy_plot_set_title(g, e->e->pdsch_energy_ue_xy_plot, s); + sprintf(s, "PDCCH IQ [UE %d]", ue); + xy_plot_set_title(g, e->e->pdcch_iq_ue_xy_plot, s); + sprintf(s, "DL/UL HARQ (x8) [UE %d]", ue); + label_set_text(g, e->e->dl_ul_harq_ue_label, s); + sprintf(s, "DL MCS [UE %d]", ue); + xy_plot_set_title(g, e->e->dl_mcs_xy_plot, s); + sprintf(s, "UL MCS [UE %d]", ue); + xy_plot_set_title(g, e->e->ul_mcs_xy_plot, s); + sprintf(s, "PUSCH POWER [UE %d]", ue); + xy_plot_set_title(g, e->e->pusch_power_xy_plot, s); + sprintf(s, "PUCCH POWER [UE %d]", ue); + xy_plot_set_title(g, e->e->pucch_power_xy_plot, s); + sprintf(s, "PHY Measurements [UE %d]", ue); + xy_plot_set_title(g, e->e->phy_meas_xy_plot, s); + + logger_set_filter(e->e->pdsch_iq_ue_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_PDSCH_IQ", "UE_ID"), + filter_int(ue))); + logger_set_filter(e->e->dl_estimate_ue_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_DL_CHANNEL_ESTIMATE", "UE_ID"), + filter_int(ue))); + logger_set_filter(e->e->pdcch_energy_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_PDCCH_ENERGY", "UE_ID"), + filter_int(ue))); + logger_set_filter(e->e->pdsch_energy_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_PDSCH_ENERGY", "UE_ID"), + filter_int(ue))); + logger_set_filter(e->e->phy_meas_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_MEAS", "UE_ID"), + filter_int(ue))); + /*logger_set_filter(e->pucch1_energy_ue_energy_logger, + filter_eq( + filter_evarg(e->database, "ENB_PHY_PUCCH_1_ENERGY", "UE_ID"), + filter_int(ue)));*/ + /*logger_set_filter(e->e->pdcch_iq_ue_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_PDCCH_IQ", "UE_ID"), + filter_int(ue)));*/ + for (i = 0; i < 8; i++) { + logger_set_filter(e->e->dl_dci_logger[i], + ticktime_filter(e->database, "UE_PHY_DLSCH_UE_DCI", i, ue)); + logger_set_filter(e->e->dl_ack_logger[i], + ticktime_filter(e->database, "UE_PHY_DLSCH_UE_ACK", i, ue)); + logger_set_filter(e->e->dl_nack_logger[i], + ticktime_filter(e->database, "UE_PHY_DLSCH_UE_NACK", i, ue)); + logger_set_filter(e->e->ul_dci_logger[i], + ticktime_filter(e->database, "UE_PHY_ULSCH_UE_DCI", i, ue)); + /*logger_set_filter(e->ul_dci_retransmission_logger[i], + ticktime_filter(e->database, + "ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", i, ue));*/ + logger_set_filter(e->e->ul_ack_logger[i], + ticktime_filter(e->database, "UE_PHY_ULSCH_UE_ACK", i, ue)); + logger_set_filter(e->e->ul_nack_logger[i], + ticktime_filter(e->database, "UE_PHY_ULSCH_UE_NACK", i, ue)); + } + logger_set_filter(e->e->dl_mcs_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_DLSCH_UE_DCI", "UE_id"), + filter_int(ue))); + logger_set_filter(e->e->ul_mcs_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_ULSCH_UE_DCI", "UE_id"), + filter_int(ue))); + logger_set_filter(e->e->pusch_power_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_PUSCH_TX_POWER", "UE_id"), + filter_int(ue))); + logger_set_filter(e->e->pusch_ampl_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_PUSCH_TX_POWER", "UE_id"), + filter_int(ue))); + logger_set_filter(e->e->pucch_power_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_PUCCH_TX_POWER", "UE_id"), + filter_int(ue))); + logger_set_filter(e->e->pucch_ampl_logger, + filter_eq( + filter_evarg(e->database, "UE_PHY_PUCCH_TX_POWER", "UE_id"), + filter_int(ue))); +} + +static void click(void *private, gui *g, + char *notification, widget *w, void *notification_data) +{ + int *d = notification_data; + int button = d[0]; + ue_data *ed = private; + ue_gui *e = ed->e; + int ue = ed->ue; + + if (button != 1) return; + if (w == e->prev_ue_button) { ue--; if (ue < 0) ue = 0; } + if (w == e->next_ue_button) ue++; + + if (pthread_mutex_lock(&ed->lock)) abort(); + if (ue != ed->ue) { + set_current_ue(g, ed, ue); + ed->ue = ue; + } + if (pthread_mutex_unlock(&ed->lock)) abort(); +} + +static void ue_main_gui(ue_gui *e, gui *g, event_handler *h, void *database, + ue_data *ed) +{ + widget *main_window; + widget *top_container; + widget *line, *col; + widget *logo; + widget *input_signal_plot; + logger *input_signal_log; + view *input_signal_view; + widget *timeline_plot; + logger *timelog; + view *timeview; + view *subview; + widget *text; + view *textview; + int i; + widget *w, *w2; + view *v; + logger *l; + + main_window = new_toplevel_window(g, 1200, 900, "eNB tracer"); + top_container = new_container(g, VERTICAL); + widget_add_child(g, main_window, top_container, -1); + + line = new_container(g, HORIZONTAL); + widget_add_child(g, top_container, line, -1); + logo = new_image(g, openair_logo_png, openair_logo_png_len); + + /* logo + prev/next UE buttons */ + col = new_container(g, VERTICAL); + widget_add_child(g, col, logo, -1); + w = new_container(g, HORIZONTAL); + widget_add_child(g, col, w, -1); + w2 = new_label(g, ""); + widget_add_child(g, w, w2, -1); + e->current_ue_label = w2; + /* TODO: use button widget, not label widget */ + w2 = new_label(g, " [prev UE] "); + widget_add_child(g, w, w2, -1); + label_set_clickable(g, w2, 1); + e->prev_ue_button = w2; + w2 = new_label(g, " [next UE] "); + widget_add_child(g, w, w2, -1); + label_set_clickable(g, w2, 1); + e->next_ue_button = w2; + widget_add_child(g, line, col, -1); + + input_signal_plot = new_xy_plot(g, 256, 55, "input signal", 20); + widget_add_child(g, line, input_signal_plot, -1); + xy_plot_set_range(g, input_signal_plot, 0, 7680*10, 20, 70); + input_signal_log = new_framelog(h, database, + "UE_PHY_INPUT_SIGNAL", "subframe", "rxdata"); + /* a skip value of 10 means to process 1 frame over 10, that is + * more or less 10 frames per second + */ + framelog_set_skip(input_signal_log, 10); + input_signal_view = new_view_xy(7680*10, 10, + g, input_signal_plot, new_color(g, "#0c0c72"), XY_LOOP_MODE); + logger_add_view(input_signal_log, input_signal_view); + + /* UE x PDSCH IQ data */ + w = new_xy_plot(g, 55, 55, "", 50); + e->pdsch_iq_ue_xy_plot = w; + widget_add_child(g, line, w, -1); + xy_plot_set_range(g, w, -500, 500, -500, 500); + l = new_iqlog(h, database, "UE_PHY_PDSCH_IQ", "nb_rb", + "N_RB_UL", "symbols_per_tti", "pusch_comp"); + v = new_view_xy(100*12*14,10,g,w,new_color(g,"#000"),XY_FORCED_MODE); + logger_add_view(l, v); + e->pdsch_iq_ue_logger = l; + + /* UE x estimated DL channel */ + w = new_xy_plot(g, 280, 55, "", 50); + e->dl_estimate_ue_xy_plot = w; + widget_add_child(g, line, w, -1); + xy_plot_set_range(g, w, 0, 512*10, -10, 80); + l = new_framelog(h, database, + "UE_PHY_DL_CHANNEL_ESTIMATE", "subframe", "chest_t"); + //framelog_set_skip(input_signal_log, 10); + framelog_set_update_only_at_sf9(l, 0); + v = new_view_xy(512*10, 10, g, w, new_color(g, "#0c0c72"), XY_LOOP_MODE); + logger_add_view(l, v); + e->dl_estimate_ue_logger = l; + + /* PHY Meas */ + w = new_xy_plot(g, 128, 55, "", 50); + e->phy_meas_xy_plot = w; + widget_add_child(g, line, w, -1); + xy_plot_set_range(g, w, 0, 1024*10, -130, 35); + /*l = new_ticked_ttilog(h, database,"UE_PHY_DL_TICK", "frame", "subframe","UE_PHY_MEAS", "rssi", 0, -1); + v = new_view_tti(10, g, w, new_color(g, "#720c0c")); + logger_add_view(l, v); + e->phy_meas_logger = l;*/ + l = new_ticked_ttilog(h, database,"UE_PHY_DL_TICK", "frame", "subframe","UE_PHY_MEAS", "rsrp", 0, -1); + v = new_view_tti(10, g, w, new_color(g, "#0c0c72")); + logger_add_view(l, v); + e->phy_meas_logger = l; + l = new_ticked_ttilog(h, database,"UE_PHY_DL_TICK", "frame", "subframe","UE_PHY_MEAS", "snr", 0, -1); + v = new_view_tti(10, g, w, new_color(g, "#0c720c")); + logger_add_view(l, v); + e->phy_meas_logger = l; + + /* UE x PDSCH energy */ + w = new_xy_plot(g, 128, 55, "", 50); + e->pdsch_energy_ue_xy_plot = w; + widget_add_child(g, line, w, -1); + xy_plot_set_range(g, w, 0, 1024*10, -10, 80); + l = new_ttilog(h, database, + "UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level00", 1); + v = new_view_tti(10, g, w, new_color(g, "#ff0000")); + logger_add_view(l, v); + e->pdsch_energy_logger = l; + l = new_ttilog(h, database, + "UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level01", 1); + v = new_view_tti(10, g, w, new_color(g, "#00ff00")); + logger_add_view(l, v); + e->pdsch_energy_logger = l; + l = new_ttilog(h, database, + "UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level10", 1); + v = new_view_tti(10, g, w, new_color(g, "#0f0f0f")); + logger_add_view(l, v); + e->pdsch_energy_logger = l; + l = new_ttilog(h, database, + "UE_PHY_PDSCH_ENERGY", "frame", "subframe", "pdsch_ch_level11", 1); + v = new_view_tti(10, g, w, new_color(g, "#0000ff")); + logger_add_view(l, v); + e->pdsch_energy_logger = l; + + /* UE x PDCCH energy */ + w = new_xy_plot(g, 128, 55, "", 50); + e->pdcch_energy_ue_xy_plot = w; + widget_add_child(g, line, w, -1); + xy_plot_set_range(g, w, 0, 1024*10, -10, 80); + l = new_ttilog(h, database, + "UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level00", 1); + v = new_view_tti(10, g, w, new_color(g, "#ff0000")); + logger_add_view(l, v); + e->pdcch_energy_logger = l; + l = new_ttilog(h, database, + "UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level01", 1); + v = new_view_tti(10, g, w, new_color(g, "#00ff00")); + logger_add_view(l, v); + e->pdcch_energy_logger = l; + l = new_ttilog(h, database, + "UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level10", 1); + v = new_view_tti(10, g, w, new_color(g, "#0f0f0f")); + logger_add_view(l, v); + e->pdcch_energy_logger = l; + l = new_ttilog(h, database, + "UE_PHY_PDCCH_ENERGY", "frame", "subframe", "pdcch_ch_level11", 1); + v = new_view_tti(10, g, w, new_color(g, "#0000ff")); + logger_add_view(l, v); + e->pdcch_energy_logger = l; + + /* UE x PDCCH IQ data */ + w = new_xy_plot(g, 55, 55, "", 50); + e->pdcch_iq_ue_xy_plot = w; + widget_add_child(g, line, w, -1); + xy_plot_set_range(g, w, -100, 100, -100, 100); + l = new_iqlog(h, database, "UE_PHY_PDCCH_IQ", "nb_rb", + "NB_RB_DL", "symbols_per_tti", "rxdataF_comp"); + v = new_view_xy(100*12*14,10,g,w,new_color(g,"#000"),XY_FORCED_MODE); + logger_add_view(l, v); + e->pdcch_iq_ue_logger = l; + + /* UE x PDCCH IQ data */ + /*w = new_xy_plot(g, 55, 55, "", 50); + e->pdcch_iq_ue_xy_plot = w; + widget_add_child(g, line, w, -1); + xy_plot_set_range(g, w, -2000, 2000, -2000, 2000); + l = new_iqdotlog(h, database, "UE_PHY_PDCCH_IQ", "I", "Q"); + v = new_view_xy(500, 10, g, w, new_color(g,"#000"), XY_LOOP_MODE); + logger_add_view(l, v); + e->pdcch_iq_ue_logger = l;*/ + + /* UE x DL mcs */ + line = new_container(g, HORIZONTAL); + widget_add_child(g, top_container, line, -1); + w = new_xy_plot(g, 128, 55, "", 20); + xy_plot_set_range(g, w, 0, 1024*10, -2, 30); + e->dl_mcs_xy_plot = w; + widget_add_child(g, line, w, -1); + l = new_ticked_ttilog(h, database, "UE_PHY_DL_TICK", "frame", "subframe", + "UE_PHY_DLSCH_UE_DCI", "mcs", 0, -1); + v = new_view_tti(10, g, w, new_color(g, "#0c0c72")); + logger_add_view(l, v); + e->dl_mcs_logger = l; + + /* UE x UL mcs */ + w = new_xy_plot(g, 128, 55, "", 20); + xy_plot_set_range(g, w, 0, 1024*10, -2, 30); + e->ul_mcs_xy_plot = w; + widget_add_child(g, line, w, -1); + l = new_ticked_ttilog(h, database, "UE_PHY_UL_TICK", "frame", "subframe", + "UE_PHY_ULSCH_UE_DCI", "mcs", 0, -1); + v = new_view_tti(10, g, w, new_color(g, "#0c0c72")); + logger_add_view(l, v); + e->ul_mcs_logger = l; + + /* UE x PUSCH TX Power */ +// line = new_container(g, HORIZONTAL); +// widget_add_child(g, top_container, line, -1); + w = new_xy_plot(g, 128, 55, "", 20); + e->pusch_power_xy_plot = w; + widget_add_child(g, line, w, -1); + xy_plot_set_range(g, w, 0, 1024*10, -30, 50); + l = new_ttilog(h, database, + "UE_PHY_PUSCH_TX_POWER", "frame", "subframe", "p0_pusch", 0); + v = new_view_tti(10, g, w, new_color(g, "#0c0c72")); + logger_add_view(l, v); + e->pusch_power_logger = l; + l = new_ttilog(h, database, + "UE_PHY_PUSCH_TX_POWER", "frame", "subframe", "ampl", 1); + v = new_view_tti(10, g, w, new_color(g, "#720c0c")); + logger_add_view(l, v); + e->pusch_ampl_logger = l; + + /* UE x PUCCH TX Power */ +// line = new_container(g, HORIZONTAL); +// widget_add_child(g, top_container, line, -1); + w = new_xy_plot(g, 128, 55, "", 20); + e->pucch_power_xy_plot = w; + widget_add_child(g, line, w, -1); + xy_plot_set_range(g, w, 0, 1024*10, -30, 50); + l = new_ttilog(h, database, + "UE_PHY_PUCCH_TX_POWER", "frame", "subframe", "p0_pucch", 0); + v = new_view_tti(10, g, w, new_color(g, "#0c0c72")); + logger_add_view(l, v); + e->pucch_power_logger = l; + l = new_ttilog(h, database, + "UE_PHY_PUCCH_TX_POWER", "frame", "subframe", "ampl", 1); + v = new_view_tti(10, g, w, new_color(g, "#720c0c")); + logger_add_view(l, v); + e->pucch_ampl_logger = l; + + + /* downlink/uplink UE DCIs */ + widget_add_child(g, top_container, + new_label(g,"DL/UL TICK/DCI/ACK/NACK [all UEs]"), -1); + line = new_container(g, HORIZONTAL); + widget_add_child(g, top_container, line, -1); + timeline_plot = new_timeline(g, 512, 8, 5); + widget_add_child(g, line, timeline_plot, -1); + container_set_child_growable(g, line, timeline_plot, 1); + for (i = 0; i < 8; i++) + timeline_set_subline_background_color(g, timeline_plot, i, + new_color(g, i==0 || i==4 ? "#aaf" : "#eee")); + timeview = new_view_time(3600, 10, g, timeline_plot); + /* DL tick logging */ + timelog = new_timelog(h, database, "UE_PHY_DL_TICK"); + subview = new_subview_time(timeview, 0, new_color(g, "#77c"), 3600*1000); + logger_add_view(timelog, subview); + /* DL DCI logging */ + timelog = new_timelog(h, database, "UE_PHY_DLSCH_UE_DCI"); + subview = new_subview_time(timeview, 1, new_color(g, "#228"), 3600*1000); + logger_add_view(timelog, subview); + /* DL ACK */ + timelog = new_timelog(h, database, "UE_PHY_DLSCH_UE_ACK"); + subview = new_subview_time(timeview, 2, new_color(g, "#282"), 3600*1000); + logger_add_view(timelog, subview); + /* DL NACK */ + timelog = new_timelog(h, database, "UE_PHY_DLSCH_UE_NACK"); + subview = new_subview_time(timeview, 3, new_color(g, "#f22"), 3600*1000); + logger_add_view(timelog, subview); + + /* UL tick logging */ + timelog = new_timelog(h, database, "UE_PHY_UL_TICK"); + subview = new_subview_time(timeview, 4, new_color(g, "#77c"), 3600*1000); + logger_add_view(timelog, subview); + /* UL DCI logging */ + timelog = new_timelog(h, database, "UE_PHY_ULSCH_UE_DCI"); + subview = new_subview_time(timeview, 5, new_color(g, "#228"), 3600*1000); + logger_add_view(timelog, subview); + /* UL retransmission without DCI logging */ + //timelog = new_timelog(h,database,"ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION"); + //subview = new_subview_time(timeview, 5, new_color(g, "#f22"), 3600*1000); + //logger_add_view(timelog, subview); + /* UL ACK */ + timelog = new_timelog(h, database, "UE_PHY_ULSCH_UE_ACK"); + subview = new_subview_time(timeview, 6, new_color(g, "#282"), 3600*1000); + logger_add_view(timelog, subview); + /* UL NACK */ + timelog = new_timelog(h, database, "UE_PHY_ULSCH_UE_NACK"); + subview = new_subview_time(timeview, 7, new_color(g, "#f22"), 3600*1000); + logger_add_view(timelog, subview); + + /* harq processes' ticktime view */ + e->dl_ul_harq_ue_label = new_label(g, ""); + widget_add_child(g, top_container, e->dl_ul_harq_ue_label, -1); + line = new_container(g, HORIZONTAL); + widget_add_child(g, top_container, line, -1); + timeline_plot = new_timeline(g, 512, 2*8+2, 3); + widget_add_child(g, line, timeline_plot, -1); + container_set_child_growable(g, line, timeline_plot, 1); + for (i = 0; i < 2*8+2; i++) + timeline_set_subline_background_color(g, timeline_plot, i, + new_color(g, i==0 || i==9 ? "#ddd" : (i%9)&1 ? "#e6e6e6" : "#eee")); + timeview = new_view_ticktime(10, g, timeline_plot); + ticktime_set_tick(timeview, + new_ticklog(h, database, "UE_MASTER_TICK", "frame", "subframe")); + /* tick */ + timelog = new_ticklog(h, database, "UE_MASTER_TICK", "frame", "subframe"); + /* tick on DL view */ + subview = new_subview_ticktime(timeview, 0, new_color(g,"#bbb"), 3600*1000); + logger_add_view(timelog, subview); + /* tick on UL view */ + subview = new_subview_ticktime(timeview, 9, new_color(g,"#bbb"), 3600*1000); + logger_add_view(timelog, subview); + /* DL DCI */ + for (i = 0; i < 8; i++) { + timelog = new_ticklog(h, database, "UE_PHY_DLSCH_UE_DCI", + "frame", "subframe"); + subview = new_subview_ticktime(timeview, i+1, + new_color(g,"#55f"), 3600*1000); + logger_add_view(timelog, subview); + e->dl_dci_logger[i] = timelog; + } + /* DL ACK */ + for (i = 0; i < 8; i++) { + timelog = new_ticklog(h, database, "UE_PHY_DLSCH_UE_ACK", + "frame", "subframe"); + subview = new_subview_ticktime(timeview, i+1, + new_color(g,"#282"), 3600*1000); + logger_add_view(timelog, subview); + e->dl_ack_logger[i] = timelog; + } + /* DL NACK */ + for (i = 0; i < 8; i++) { + timelog = new_ticklog(h, database, "UE_PHY_DLSCH_UE_NACK", + "frame", "subframe"); + subview = new_subview_ticktime(timeview, i+1, + new_color(g,"#f22"), 3600*1000); + logger_add_view(timelog, subview); + e->dl_nack_logger[i] = timelog; + } + /* UL DCI/retransmission without DCI */ + for (i = 0; i < 8; i++) { + /* first transmission */ + timelog = new_ticklog(h, database, "UE_PHY_ULSCH_UE_DCI", + "frame", "subframe"); + subview = new_subview_ticktime(timeview, i+9+1, + new_color(g,"#55f"), 3600*1000); + logger_add_view(timelog, subview); + e->ul_dci_logger[i] = timelog; + /* retransmission */ + + timelog = new_ticklog(h, database, + "ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION", "frame", "subframe"); + subview = new_subview_ticktime(timeview, i+9+1, + new_color(g,"#99f"), 3600*1000); + logger_add_view(timelog, subview); + e->ul_dci_retransmission_logger[i] = timelog; + + } + + /* UL ACK */ + for (i = 0; i < 8; i++) { + timelog = new_ticklog(h, database, "UE_PHY_ULSCH_UE_ACK", + "frame", "subframe"); + subview = new_subview_ticktime(timeview, i+9+1, + new_color(g,"#282"), 3600*1000); + logger_add_view(timelog, subview); + e->ul_ack_logger[i] = timelog; + } + /* UL NACK */ + for (i = 0; i < 8; i++) { + timelog = new_ticklog(h, database, "UE_PHY_ULSCH_UE_NACK", + "frame", "subframe"); + subview = new_subview_ticktime(timeview, i+9+1, + new_color(g,"#f22"), 3600*1000); + logger_add_view(timelog, subview); + e->ul_nack_logger[i] = timelog; + } + +#if 1 + /* phy/mac/rlc/pdcp/rrc textlog */ + line = new_container(g, HORIZONTAL); + widget_add_child(g, top_container, line, -1); + container_set_child_growable(g, top_container, line, 1); + + /* phy */ + col = new_container(g, VERTICAL); + widget_add_child(g, line, col, -1); + container_set_child_growable(g, line, col, 1); + widget_add_child(g, col, new_label(g, "PHY"), -1); + text = new_textlist(g, 100, 10, new_color(g, "#afa")); + widget_add_child(g, col, text, -1); + container_set_child_growable(g, col, text, 1); + textview = new_view_textlist(10000, 10, g, text); + e->phyview = textview; + + /* mac */ + col = new_container(g, VERTICAL); + widget_add_child(g, line, col, -1); + container_set_child_growable(g, line, col, 1); + widget_add_child(g, col, new_label(g, "MAC"), -1); + text = new_textlist(g, 100, 10, new_color(g, "#adf")); + widget_add_child(g, col, text, -1); + container_set_child_growable(g, col, text, 1); + textview = new_view_textlist(10000, 10, g, text); + e->macview = textview; + + line = new_container(g, HORIZONTAL); + widget_add_child(g, top_container, line, -1); + container_set_child_growable(g, top_container, line, 1); + + /* rlc */ + col = new_container(g, VERTICAL); + widget_add_child(g, line, col, -1); + container_set_child_growable(g, line, col, 1); + widget_add_child(g, col, new_label(g, "RLC"), -1); + text = new_textlist(g, 100, 10, new_color(g, "#aff")); + widget_add_child(g, col, text, -1); + container_set_child_growable(g, col, text, 1); + textview = new_view_textlist(10000, 10, g, text); + e->rlcview = textview; + + /* pdcp */ + col = new_container(g, VERTICAL); + widget_add_child(g, line, col, -1); + container_set_child_growable(g, line, col, 1); + widget_add_child(g, col, new_label(g, "PDCP"), -1); + text = new_textlist(g, 100, 10, new_color(g, "#ed9")); + widget_add_child(g, col, text, -1); + container_set_child_growable(g, col, text, 1); + textview = new_view_textlist(10000, 10, g, text); + e->pdcpview = textview; + + line = new_container(g, HORIZONTAL); + widget_add_child(g, top_container, line, -1); + container_set_child_growable(g, top_container, line, 1); + + /* rrc */ + col = new_container(g, VERTICAL); + widget_add_child(g, line, col, -1); + container_set_child_growable(g, line, col, 1); + widget_add_child(g, col, new_label(g, "RRC"), -1); + text = new_textlist(g, 100, 10, new_color(g, "#fdb")); + widget_add_child(g, col, text, -1); + container_set_child_growable(g, col, text, 1); + textview = new_view_textlist(10000, 10, g, text); + e->rrcview = textview; + + /* legacy logs (LOG_I, LOG_D, ...) */ + widget_add_child(g, top_container, new_label(g, "LEGACY"), -1); + text = new_textlist(g, 100, 10, new_color(g, "#eeb")); + widget_add_child(g, top_container, text, -1); + container_set_child_growable(g, top_container, text, 1); + e->legacy = new_view_textlist(10000, 10, g, text); +#endif + + set_current_ue(g, ed, 0); + register_notifier(g, "click", e->prev_ue_button, click, ed); + register_notifier(g, "click", e->next_ue_button, click, ed); +} + +void view_add_log(view *v, char *log, event_handler *h, void *database, + int *is_on) +{ + logger *textlog; + char *name, *desc; + + database_get_generic_description(database, + event_id_from_name(database, log), &name, &desc); + textlog = new_textlog(h, database, name, desc); + logger_add_view(textlog, v); + free(name); + free(desc); + + on_off(database, log, is_on, 1); +} + +int main(int n, char **v) +{ + extern int volatile gui_logd; + char *database_filename = NULL; + void *database; + char *ip = DEFAULT_REMOTE_IP; + int port = DEFAULT_REMOTE_PORT; + char **on_off_name; + int *on_off_action; + int on_off_n = 0; + int *is_on; + int number_of_events; + int i; + event_handler *h; + gui *g; + ue_gui eg; + ue_data ue_data; + + /* write on a socket fails if the other end is closed and we get SIGPIPE */ + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort(); + + on_off_name = malloc(n * sizeof(char *)); if (on_off_name == NULL) abort(); + on_off_action = malloc(n * sizeof(int)); if (on_off_action == NULL) abort(); + + for (i = 1; i < n; i++) { + if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); + if (!strcmp(v[i], "-d")) + { if (i > n-2) usage(); database_filename = v[++i]; continue; } + if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; } + if (!strcmp(v[i], "-p")) + { if (i > n-2) usage(); port = atoi(v[++i]); continue; } + if (!strcmp(v[i], "-on")) { if (i > n-2) usage(); + on_off_name[on_off_n]=v[++i]; on_off_action[on_off_n++]=1; continue; } + if (!strcmp(v[i], "-off")) { if (i > n-2) usage(); + on_off_name[on_off_n]=v[++i]; on_off_action[on_off_n++]=0; continue; } + if (!strcmp(v[i], "-ON")) + { on_off_name[on_off_n]=NULL; on_off_action[on_off_n++]=1; continue; } + if (!strcmp(v[i], "-OFF")) + { on_off_name[on_off_n]=NULL; on_off_action[on_off_n++]=0; continue; } + if (!strcmp(v[i], "-debug-gui")) { gui_logd = 1; continue; } + usage(); + } + + if (database_filename == NULL) { + printf("ERROR: provide a database file (-d)\n"); + exit(1); + } + + database = parse_database(database_filename); + + load_config_file(database_filename); + + number_of_events = number_of_ids(database); + is_on = calloc(number_of_events, sizeof(int)); + if (is_on == NULL) abort(); + + h = new_handler(database); + + g = gui_init(); + new_thread(gui_thread, g); + + ue_data.ue = 0; + ue_data.e = ⪚ + ue_data.database = database; + + ue_main_gui(&eg, g, h, database, &ue_data); + + for (i = 0; i < number_of_events; i++) { + logger *textlog; + char *name, *desc; + database_get_generic_description(database, i, &name, &desc); + if (!strncmp(name, "LEGACY_", 7)) { + textlog = new_textlog(h, database, name, desc); + logger_add_view(textlog, eg.legacy); + } + free(name); + free(desc); + } + + on_off(database, "UE_MASTER_TICK", is_on, 1); + on_off(database, "UE_PHY_UL_TICK", is_on, 1); + on_off(database, "UE_PHY_DL_TICK", is_on, 1); + on_off(database, "UE_PHY_DLSCH_UE_DCI", is_on, 1); + on_off(database, "UE_PHY_DLSCH_UE_ACK", is_on, 1); + on_off(database, "UE_PHY_DLSCH_UE_NACK", is_on, 1); + on_off(database, "UE_PHY_ULSCH_UE_DCI", is_on, 1); + on_off(database, "UE_PHY_ULSCH_UE_ACK", is_on, 1); + on_off(database, "UE_PHY_ULSCH_UE_NACK", is_on, 1); + on_off(database, "UE_PHY_INPUT_SIGNAL", is_on, 1); + on_off(database, "UE_PHY_DL_CHANNEL_ESTIMATE", is_on, 1); + on_off(database, "UE_PHY_PDCCH_IQ", is_on, 1); + on_off(database, "UE_PHY_PDCCH_ENERGY", is_on, 1); + on_off(database, "UE_PHY_PDSCH_IQ", is_on, 1); + on_off(database, "UE_PHY_PDSCH_ENERGY", is_on, 1); + on_off(database, "UE_PHY_PUSCH_TX_POWER", is_on, 1); + on_off(database, "UE_PHY_PUCCH_TX_POWER", is_on, 1); + on_off(database, "UE_PHY_MEAS", is_on, 1); + + on_off(database, "LEGACY_GROUP_INFO", is_on, 1); + on_off(database, "LEGACY_GROUP_ERROR", is_on, 1); + on_off(database, "LEGACY_GROUP_WARNING", is_on, 1); + + view_add_log(eg.phyview, "UE_PHY_UL_TICK", h, database, is_on); + view_add_log(eg.phyview, "UE_PHY_DL_TICK", h, database, is_on); + view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_DCI", h, database, is_on); + view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_ACK", h, database, is_on); + view_add_log(eg.phyview, "UE_PHY_DLSCH_UE_NACK",h, database, is_on); + view_add_log(eg.phyview, "UE_PHY_ULSCH_UE_DCI", h, database, is_on); + view_add_log(eg.phyview, "UE_PHY_ULSCH_UE_ACK", h, database, is_on); + view_add_log(eg.phyview, "UE_PHY_ULSCH_UE_NACK", h, database, is_on); + + + + /* deactivate those two by default, they are a bit heavy */ + //on_off(database, "ENB_MAC_UE_UL_SDU_WITH_DATA", is_on, 0); + //on_off(database, "ENB_MAC_UE_UL_PDU_WITH_DATA", is_on, 0); + + for (i = 0; i < on_off_n; i++) + on_off(database, on_off_name[i], is_on, on_off_action[i]); + + ue_data.socket = -1; + ue_data.is_on = is_on; + ue_data.nevents = number_of_events; + if (pthread_mutex_init(&ue_data.lock, NULL)) abort(); + setup_event_selector(g, database, is_on, is_on_changed, &ue_data); + +restart: + clear_remote_config(); + ue_data.socket = connect_to(ip, port); + + /* send the first message - activate selected traces */ + is_on_changed(&ue_data); + + /* read messages */ + while (1) { + char v[T_BUFFER_MAX]; + event e; + e = get_event(ue_data.socket, v, database); + if (e.type == -1) goto restart; + if (pthread_mutex_lock(&ue_data.lock)) abort(); + handle_event(h, e); + if (pthread_mutex_unlock(&ue_data.lock)) abort(); + } + + return 0; +} diff --git a/common/utils/T/tracer/utils.c b/common/utils/T/tracer/utils.c index a22e0a0565..5071546735 100644 --- a/common/utils/T/tracer/utils.c +++ b/common/utils/T/tracer/utils.c @@ -7,6 +7,7 @@ #include #include #include +#include void new_thread(void *(*f)(void *), void *data) { @@ -36,6 +37,16 @@ void sleepms(int ms) if (nanosleep(&t, NULL)) abort(); } +void bps(char *out, float v, char *suffix) +{ + static char *bps_unit[4] = { "", "k", "M", "G" }; + int flog; + if (v < 1000) flog = 0; else flog = floor(floor(log10(v)) / 3); + if (flog > 3) flog = 3; + v /= pow(10, flog*3); + sprintf(out, "%g%s%s", round(v*100)/100, bps_unit[flog], suffix); +} + /****************************************************************************/ /* list */ /****************************************************************************/ diff --git a/common/utils/T/tracer/utils.h b/common/utils/T/tracer/utils.h index 086e92b5dc..3be6cfe1a7 100644 --- a/common/utils/T/tracer/utils.h +++ b/common/utils/T/tracer/utils.h @@ -3,6 +3,7 @@ void new_thread(void *(*f)(void *), void *data); void sleepms(int ms); +void bps(char *out, float v, char *suffix); /****************************************************************************/ /* list */ diff --git a/common/utils/T/tracer/view/Makefile b/common/utils/T/tracer/view/Makefile index 32b267ec24..370c317e66 100644 --- a/common/utils/T/tracer/view/Makefile +++ b/common/utils/T/tracer/view/Makefile @@ -1,7 +1,7 @@ CC=gcc CFLAGS=-Wall -g -pthread -I.. -I../logger -OBJS=stdout.o textlist.o xy.o tti.o time.o ticktime.o +OBJS=stdout.o textlist.o xy.o tti.o time.o ticktime.o scrolltti.o view.a: $(OBJS) ar cr view.a $(OBJS) diff --git a/common/utils/T/tracer/view/scrolltti.c b/common/utils/T/tracer/view/scrolltti.c new file mode 100644 index 0000000000..ad83cbc756 --- /dev/null +++ b/common/utils/T/tracer/view/scrolltti.c @@ -0,0 +1,100 @@ +#include "view.h" +#include "../utils.h" +#include +#include +#include +#include +#include +#include + +struct scrolltti { + view common; + gui *g; + widget *w; + widget *throughput_textarea; + int plot; + float refresh_rate; + pthread_mutex_t lock; + unsigned long data[1000]; + unsigned long total; /* sum data[0..999] to have smoother value printed */ + float xout[1000]; + float yout[1000]; + int insert_point; +}; + +/* this array is used to get Y range 1000, 2000, 5000, 10000, ... */ +static int tolog[11] = { -1, 1, 2, 5, 5, 5, 10, 10, 10, 10, 10 }; + +static void *scrolltti_thread(void *_this) +{ + struct scrolltti *this = _this; + int i; + int p; + float max, mlog; + char o[64]; + + while (1) { + if (pthread_mutex_lock(&this->lock)) abort(); + /* TODO: optimize */ + p = this->insert_point; + max = 0; + for (i = 0; i < 1000; i++) { + this->xout[i] = i; + this->yout[i] = this->data[p]; + if (this->data[p] > max) max = this->data[p]; + p = (p + 1) % 1000; + } + bps(o, this->total/1000., "b/s"); + textarea_set_text(this->g, this->throughput_textarea, o); + /* for Y range we want 1000, 2000, 5000, 10000, 20000, 50000, etc. */ + if (max < 1000) max = 1000; + mlog = pow(10, floor(log10(max))); + max = tolog[(int)ceil(max/mlog)] * mlog; + xy_plot_set_range(this->g, this->w, 0, 1000, 0, max); + xy_plot_set_points(this->g, this->w, this->plot, + 1000, this->xout, this->yout); + if (pthread_mutex_unlock(&this->lock)) abort(); + sleepms(1000/this->refresh_rate); + } + + return 0; +} + +static void clear(view *this) +{ + /* TODO */ +} + +static void append(view *_this, int frame, int subframe, double value) +{ + struct scrolltti *this = (struct scrolltti *)_this; + + if (pthread_mutex_lock(&this->lock)) abort(); + this->total -= this->data[this->insert_point]; + this->data[this->insert_point] = value; + this->total += this->data[this->insert_point]; + this->insert_point = (this->insert_point + 1) % 1000; + if (pthread_mutex_unlock(&this->lock)) abort(); +} + +view *new_view_scrolltti(float refresh_rate, gui *g, widget *w, int color, + widget *throughput_textarea) +{ + struct scrolltti *ret = calloc(1, sizeof(struct scrolltti)); + if (ret == NULL) abort(); + + ret->common.clear = clear; + ret->common.append = (void (*)(view *, ...))append; + + ret->refresh_rate = refresh_rate; + ret->g = g; + ret->w = w; + ret->throughput_textarea = throughput_textarea; + ret->plot = xy_plot_new_plot(g, w, color); + + if (pthread_mutex_init(&ret->lock, NULL)) abort(); + + new_thread(scrolltti_thread, ret); + + return (view *)ret; +} diff --git a/common/utils/T/tracer/view/view.h b/common/utils/T/tracer/view/view.h index 2173c842ce..8167a00ccd 100644 --- a/common/utils/T/tracer/view/view.h +++ b/common/utils/T/tracer/view/view.h @@ -19,6 +19,8 @@ view *new_view_xy(int length, float refresh_rate, gui *g, widget *w, int color, enum xy_mode mode); view *new_view_tti(float refresh_rate, gui *g, widget *w, int color); +view *new_view_scrolltti(float refresh_rate, gui *g, widget *w, + int color, widget *throughput_label); view *new_view_time(int number_of_seconds, float refresh_rate, gui *g, widget *w); view *new_subview_time(view *time, int line, int color, int size); diff --git a/common/utils/asn1_conversions.h b/common/utils/asn1_conversions.h index bb7b244989..050c065d9d 100644 --- a/common/utils/asn1_conversions.h +++ b/common/utils/asn1_conversions.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef ASN1_CONVERSIONS_H_ diff --git a/common/utils/assertions.h b/common/utils/assertions.h index 8bb74109ed..f6728caf7b 100644 --- a/common/utils/assertions.h +++ b/common/utils/assertions.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef UTILS_ASSERTIONS_H_ diff --git a/common/utils/collection/COPYING b/common/utils/collection/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/collection/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/collection/hashtable/COPYING b/common/utils/collection/hashtable/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/collection/hashtable/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/collection/tree.h b/common/utils/collection/tree.h index 8e4e35c408..c9df686fbb 100755 --- a/common/utils/collection/tree.h +++ b/common/utils/collection/tree.h @@ -1,4 +1,8 @@ -/* +/* $NetBSD: tree.h,v 1.8 2004/03/28 19:38:30 provos Exp $ */ +/* $OpenBSD: tree.h,v 1.7 2002/10/17 21:51:54 art Exp $ */ +/* $FreeBSD$ */ + +/*- * Copyright 2002 Niels Provos * All rights reserved. * @@ -26,6 +30,8 @@ #ifndef _SYS_TREE_H_ #define _SYS_TREE_H_ +#include + /* * This file defines data structures for different types of trees: * splay trees and red-black trees. @@ -63,7 +69,7 @@ struct name { \ #define SPLAY_INIT(root) do { \ (root)->sph_root = NULL; \ -} while (0) +} while (/*CONSTCOND*/ 0) #define SPLAY_ENTRY(type) \ struct { \ @@ -81,32 +87,32 @@ struct { \ SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ (head)->sph_root = tmp; \ -} while (0) +} while (/*CONSTCOND*/ 0) #define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ SPLAY_LEFT(tmp, field) = (head)->sph_root; \ (head)->sph_root = tmp; \ -} while (0) +} while (/*CONSTCOND*/ 0) #define SPLAY_LINKLEFT(head, tmp, field) do { \ SPLAY_LEFT(tmp, field) = (head)->sph_root; \ tmp = (head)->sph_root; \ (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ -} while (0) +} while (/*CONSTCOND*/ 0) #define SPLAY_LINKRIGHT(head, tmp, field) do { \ SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ tmp = (head)->sph_root; \ (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ -} while (0) +} while (/*CONSTCOND*/ 0) #define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\ SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ -} while (0) +} while (/*CONSTCOND*/ 0) /* Generates prototypes and inline functions */ @@ -207,7 +213,7 @@ name##_SPLAY(struct name *head, struct type *elm) \ SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ __left = __right = &__node; \ \ - while ((__comp = (cmp)(elm, (head)->sph_root))) { \ + while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \ if (__comp < 0) { \ __tmp = SPLAY_LEFT((head)->sph_root, field); \ if (__tmp == NULL) \ @@ -286,7 +292,7 @@ void name##_SPLAY_MINMAX(struct name *head, int __comp) \ (x) != NULL; \ (x) = SPLAY_NEXT(name, head, x)) -/* Macros that define a red-back tree */ +/* Macros that define a red-black tree */ #define RB_HEAD(name, type) \ struct name { \ struct type *rbh_root; /* root of the tree */ \ @@ -297,7 +303,7 @@ struct name { \ #define RB_INIT(root) do { \ (root)->rbh_root = NULL; \ -} while (0) +} while (/*CONSTCOND*/ 0) #define RB_BLACK 0 #define RB_RED 1 @@ -320,24 +326,24 @@ struct { \ RB_PARENT(elm, field) = parent; \ RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ RB_COLOR(elm, field) = RB_RED; \ -} while (0) +} while (/*CONSTCOND*/ 0) #define RB_SET_BLACKRED(black, red, field) do { \ RB_COLOR(black, field) = RB_BLACK; \ RB_COLOR(red, field) = RB_RED; \ -} while (0) +} while (/*CONSTCOND*/ 0) #ifndef RB_AUGMENT -#define RB_AUGMENT(x) +#define RB_AUGMENT(x) do {} while (0) #endif #define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ (tmp) = RB_RIGHT(elm, field); \ - if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field))) { \ + if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \ RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \ } \ RB_AUGMENT(elm); \ - if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \ + if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ else \ @@ -349,15 +355,15 @@ struct { \ RB_AUGMENT(tmp); \ if ((RB_PARENT(tmp, field))) \ RB_AUGMENT(RB_PARENT(tmp, field)); \ -} while (0) +} while (/*CONSTCOND*/ 0) #define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ (tmp) = RB_LEFT(elm, field); \ - if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field))) { \ + if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \ RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \ } \ RB_AUGMENT(elm); \ - if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) { \ + if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ else \ @@ -369,28 +375,66 @@ struct { \ RB_AUGMENT(tmp); \ if ((RB_PARENT(tmp, field))) \ RB_AUGMENT(RB_PARENT(tmp, field)); \ -} while (0) +} while (/*CONSTCOND*/ 0) /* Generates prototypes and inline functions */ -#define RB_PROTOTYPE(name, type, field, cmp) \ -void name##_RB_INSERT_COLOR(struct name *, struct type *); \ -void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\ -struct type *name##_RB_REMOVE(struct name *, struct type *); \ -struct type *name##_RB_INSERT(struct name *, struct type *); \ -struct type *name##_RB_FIND(struct name *, struct type *); \ -struct type *name##_RB_NEXT(struct type *); \ -struct type *name##_RB_MINMAX(struct name *, int); \ - \ +#define RB_PROTOTYPE(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) +#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __unused static) +#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ + RB_PROTOTYPE_INSERT_COLOR(name, type, attr); \ + RB_PROTOTYPE_REMOVE_COLOR(name, type, attr); \ + RB_PROTOTYPE_INSERT(name, type, attr); \ + RB_PROTOTYPE_REMOVE(name, type, attr); \ + RB_PROTOTYPE_FIND(name, type, attr); \ + RB_PROTOTYPE_NFIND(name, type, attr); \ + RB_PROTOTYPE_NEXT(name, type, attr); \ + RB_PROTOTYPE_PREV(name, type, attr); \ + RB_PROTOTYPE_MINMAX(name, type, attr); +#define RB_PROTOTYPE_INSERT_COLOR(name, type, attr) \ + attr void name##_RB_INSERT_COLOR(struct name *, struct type *) +#define RB_PROTOTYPE_REMOVE_COLOR(name, type, attr) \ + attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *) +#define RB_PROTOTYPE_REMOVE(name, type, attr) \ + attr struct type *name##_RB_REMOVE(struct name *, struct type *) +#define RB_PROTOTYPE_INSERT(name, type, attr) \ + attr struct type *name##_RB_INSERT(struct name *, struct type *) +#define RB_PROTOTYPE_FIND(name, type, attr) \ + attr struct type *name##_RB_FIND(struct name *, struct type *) +#define RB_PROTOTYPE_NFIND(name, type, attr) \ + attr struct type *name##_RB_NFIND(struct name *, struct type *) +#define RB_PROTOTYPE_NEXT(name, type, attr) \ + attr struct type *name##_RB_NEXT(struct type *) +#define RB_PROTOTYPE_PREV(name, type, attr) \ + attr struct type *name##_RB_PREV(struct type *) +#define RB_PROTOTYPE_MINMAX(name, type, attr) \ + attr struct type *name##_RB_MINMAX(struct name *, int) /* Main rb operation. * Moves node close to the key of elm to top */ -#define RB_GENERATE(name, type, field, cmp) \ -void \ +#define RB_GENERATE(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp,) +#define RB_GENERATE_STATIC(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp, __unused static) +#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ + RB_GENERATE_INSERT_COLOR(name, type, field, attr) \ + RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \ + RB_GENERATE_INSERT(name, type, field, cmp, attr) \ + RB_GENERATE_REMOVE(name, type, field, attr) \ + RB_GENERATE_FIND(name, type, field, cmp, attr) \ + RB_GENERATE_NFIND(name, type, field, cmp, attr) \ + RB_GENERATE_NEXT(name, type, field, attr) \ + RB_GENERATE_PREV(name, type, field, attr) \ + RB_GENERATE_MINMAX(name, type, field, attr) + +#define RB_GENERATE_INSERT_COLOR(name, type, field, attr) \ +attr void \ name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ { \ struct type *parent, *gparent, *tmp; \ - while ((parent = RB_PARENT(elm, field)) && \ + while ((parent = RB_PARENT(elm, field)) != NULL && \ RB_COLOR(parent, field) == RB_RED) { \ gparent = RB_PARENT(parent, field); \ if (parent == RB_LEFT(gparent, field)) { \ @@ -428,9 +472,10 @@ name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ } \ } \ RB_COLOR(head->rbh_root, field) = RB_BLACK; \ -} \ - \ -void \ +} + +#define RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \ +attr void \ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \ { \ struct type *tmp; \ @@ -454,7 +499,8 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) if (RB_RIGHT(tmp, field) == NULL || \ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\ struct type *oleft; \ - if ((oleft = RB_LEFT(tmp, field)))\ + if ((oleft = RB_LEFT(tmp, field)) \ + != NULL) \ RB_COLOR(oleft, field) = RB_BLACK;\ RB_COLOR(tmp, field) = RB_RED; \ RB_ROTATE_RIGHT(head, tmp, oleft, field);\ @@ -486,7 +532,8 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) if (RB_LEFT(tmp, field) == NULL || \ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\ struct type *oright; \ - if ((oright = RB_RIGHT(tmp, field)))\ + if ((oright = RB_RIGHT(tmp, field)) \ + != NULL) \ RB_COLOR(oright, field) = RB_BLACK;\ RB_COLOR(tmp, field) = RB_RED; \ RB_ROTATE_LEFT(head, tmp, oright, field);\ @@ -504,9 +551,10 @@ name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) } \ if (elm) \ RB_COLOR(elm, field) = RB_BLACK; \ -} \ - \ -struct type * \ +} + +#define RB_GENERATE_REMOVE(name, type, field, attr) \ +attr struct type * \ name##_RB_REMOVE(struct name *head, struct type *elm) \ { \ struct type *child, *parent, *old = elm; \ @@ -518,7 +566,7 @@ name##_RB_REMOVE(struct name *head, struct type *elm) \ else { \ struct type *left; \ elm = RB_RIGHT(elm, field); \ - while ((left = RB_LEFT(elm, field))) \ + while ((left = RB_LEFT(elm, field)) != NULL) \ elm = left; \ child = RB_RIGHT(elm, field); \ parent = RB_PARENT(elm, field); \ @@ -551,7 +599,7 @@ name##_RB_REMOVE(struct name *head, struct type *elm) \ left = parent; \ do { \ RB_AUGMENT(left); \ - } while ((left = RB_PARENT(left, field))); \ + } while ((left = RB_PARENT(left, field)) != NULL); \ } \ goto color; \ } \ @@ -572,9 +620,10 @@ color: \ name##_RB_REMOVE_COLOR(head, parent, child); \ return (old); \ } \ - \ + +#define RB_GENERATE_INSERT(name, type, field, cmp, attr) \ /* Inserts a node into the RB tree */ \ -struct type * \ +attr struct type * \ name##_RB_INSERT(struct name *head, struct type *elm) \ { \ struct type *tmp; \ @@ -599,15 +648,14 @@ name##_RB_INSERT(struct name *head, struct type *elm) \ RB_RIGHT(parent, field) = elm; \ RB_AUGMENT(parent); \ } else \ - { \ RB_ROOT(head) = elm; \ - } \ name##_RB_INSERT_COLOR(head, elm); \ return (NULL); \ -} \ - \ +} + +#define RB_GENERATE_FIND(name, type, field, cmp, attr) \ /* Finds the node with the same key as elm */ \ -struct type * \ +attr struct type * \ name##_RB_FIND(struct name *head, struct type *elm) \ { \ struct type *tmp = RB_ROOT(head); \ @@ -622,9 +670,33 @@ name##_RB_FIND(struct name *head, struct type *elm) \ return (tmp); \ } \ return (NULL); \ -} \ - \ -struct type * \ +} + +#define RB_GENERATE_NFIND(name, type, field, cmp, attr) \ +/* Finds the first node greater than or equal to the search key */ \ +attr struct type * \ +name##_RB_NFIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *res = NULL; \ + int comp; \ + while (tmp) { \ + comp = cmp(elm, tmp); \ + if (comp < 0) { \ + res = tmp; \ + tmp = RB_LEFT(tmp, field); \ + } \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (res); \ +} + +#define RB_GENERATE_NEXT(name, type, field, attr) \ +/* ARGSUSED */ \ +attr struct type * \ name##_RB_NEXT(struct type *elm) \ { \ if (RB_RIGHT(elm, field)) { \ @@ -643,9 +715,33 @@ name##_RB_NEXT(struct type *elm) \ } \ } \ return (elm); \ -} \ - \ -struct type * \ +} + +#define RB_GENERATE_PREV(name, type, field, attr) \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_PREV(struct type *elm) \ +{ \ + if (RB_LEFT(elm, field)) { \ + elm = RB_LEFT(elm, field); \ + while (RB_RIGHT(elm, field)) \ + elm = RB_RIGHT(elm, field); \ + } else { \ + if (RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while (RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field)))\ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} + +#define RB_GENERATE_MINMAX(name, type, field, attr) \ +attr struct type * \ name##_RB_MINMAX(struct name *head, int val) \ { \ struct type *tmp = RB_ROOT(head); \ @@ -666,7 +762,9 @@ name##_RB_MINMAX(struct name *head, int val) \ #define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) #define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) #define RB_FIND(name, x, y) name##_RB_FIND(x, y) +#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y) #define RB_NEXT(name, x, y) name##_RB_NEXT(y) +#define RB_PREV(name, x, y) name##_RB_PREV(y) #define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) #define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) @@ -675,4 +773,29 @@ name##_RB_MINMAX(struct name *head, int val) \ (x) != NULL; \ (x) = name##_RB_NEXT(x)) +#define RB_FOREACH_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_SAFE(x, name, head, y) \ + for ((x) = RB_MIN(name, head); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE(x, name, head) \ + for ((x) = RB_MAX(name, head); \ + (x) != NULL; \ + (x) = name##_RB_PREV(x)) + +#define RB_FOREACH_REVERSE_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \ + for ((x) = RB_MAX(name, head); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + #endif /* _SYS_TREE_H_ */ diff --git a/common/utils/collection/hashtable/hashtable.c b/common/utils/hashtable/hashtable.c old mode 100755 new mode 100644 similarity index 88% rename from common/utils/collection/hashtable/hashtable.c rename to common/utils/hashtable/hashtable.c index 4ce0ee7a7e..6322b1dea6 --- a/common/utils/collection/hashtable/hashtable.c +++ b/common/utils/hashtable/hashtable.c @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #include diff --git a/common/utils/collection/hashtable/hashtable.h b/common/utils/hashtable/hashtable.h old mode 100755 new mode 100644 similarity index 56% rename from common/utils/collection/hashtable/hashtable.h rename to common/utils/hashtable/hashtable.h index 5c06937bed..62002fb60f --- a/common/utils/collection/hashtable/hashtable.h +++ b/common/utils/hashtable/hashtable.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef _UTILS_COLLECTION_HASH_TABLE_H_ #define _UTILS_COLLECTION_HASH_TABLE_H_ #include diff --git a/common/utils/collection/hashtable/obj_hashtable.c b/common/utils/hashtable/obj_hashtable.c old mode 100755 new mode 100644 similarity index 86% rename from common/utils/collection/hashtable/obj_hashtable.c rename to common/utils/hashtable/obj_hashtable.c index 63fd8a688b..7fb68d1681 --- a/common/utils/collection/hashtable/obj_hashtable.c +++ b/common/utils/hashtable/obj_hashtable.c @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #include diff --git a/common/utils/collection/hashtable/obj_hashtable.h b/common/utils/hashtable/obj_hashtable.h old mode 100755 new mode 100644 similarity index 50% rename from common/utils/collection/hashtable/obj_hashtable.h rename to common/utils/hashtable/obj_hashtable.h index 8743a13f08..a43d472a47 --- a/common/utils/collection/hashtable/obj_hashtable.h +++ b/common/utils/hashtable/obj_hashtable.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef _UTILS_COLLECTION_OBJ_HASH_TABLE_H_ diff --git a/common/utils/itti/COPYING b/common/utils/itti/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/common/utils/itti/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/common/utils/itti/assertions.h b/common/utils/itti/assertions.h index c047ef6b76..bb6c27cbab 100644 --- a/common/utils/itti/assertions.h +++ b/common/utils/itti/assertions.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #include @@ -59,7 +51,7 @@ do { \ "In %s() %s:%d\n" fORMAT, \ __FUNCTION__, __FILE__, __LINE__, ##aRGS); \ aCTION; \ - } \ + } \ } while(0) #define AssertFatal(cOND, fORMAT, aRGS...) _Assert_(cOND, _Assert_Exit_, fORMAT, ##aRGS) @@ -73,7 +65,7 @@ _Assert_(cOND, _Assert_Exit_, #vALUE1 ": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX " (intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3) #define DevCheck4(cOND, vALUE1, vALUE2, vALUE3, vALUE4) \ -_Assert_(cOND, _Assert_Exit_, #vALUE1": %"PRIdMAX"\n"#vALUE2": %"PRIdMAX"\n"#vALUE3": %"PRIdMAX"\n"#vALUE4": %"PRIdMAX"\n\n", \ +_Assert_(cOND, _Assert_Exit_, #vALUE1": %" PRIdMAX "\n" #vALUE2 ": %" PRIdMAX "\n" #vALUE3 ": %" PRIdMAX "\n" #vALUE4 ": %" PRIdMAX "\n\n", \ (intmax_t)vALUE1, (intmax_t)vALUE2, (intmax_t)vALUE3, (intmax_t)vALUE4) #define DevParam(vALUE1, vALUE2, vALUE3) DevCheck(0, vALUE1, vALUE2, vALUE3) diff --git a/common/utils/itti/backtrace.c b/common/utils/itti/backtrace.c index 3d984cbf11..889e0d84d1 100644 --- a/common/utils/itti/backtrace.c +++ b/common/utils/itti/backtrace.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include @@ -44,7 +37,8 @@ void display_backtrace(void) size_t size; char **strings; size_t i; - + char* test=getenv("NO_BACKTRACE"); + if (test!=0) *((int*)0)=0; size = backtrace(array, 10); strings = backtrace_symbols(array, size); diff --git a/common/utils/itti/backtrace.h b/common/utils/itti/backtrace.h index 1ba8143860..9a77767cf4 100644 --- a/common/utils/itti/backtrace.h +++ b/common/utils/itti/backtrace.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #include diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c index 6789dadce6..449fa434af 100644 --- a/common/utils/itti/intertask_interface.c +++ b/common/utils/itti/intertask_interface.c @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #define _GNU_SOURCE @@ -39,10 +31,6 @@ #include #include -#ifdef RTAI -# include -#endif - #if !defined(TRUE) #define TRUE 1 #endif @@ -53,11 +41,6 @@ #include "intertask_interface.h" #include "intertask_interface_dump.h" -#if defined(OAI_EMU) || defined(RTAI) -# include "memory_pools.h" -# include "vcd_signal_dumper.h" -#endif - #if T_TRACER #include "T.h" #endif @@ -72,14 +55,6 @@ #include "signals.h" #include "timer.h" -#ifdef RTAI -# include -# include -# define FIFO_PRINTF_MAX_STRING_SIZE 1000 -# define FIFO_PRINTF_NO 62 -# define FIFO_PRINTF_SIZE 65536 -#endif - /* ITTI DEBUG groups */ #define ITTI_DEBUG_POLL (1<<0) #define ITTI_DEBUG_SEND (1<<1) @@ -89,24 +64,14 @@ #define ITTI_DEBUG_ISSUES (1<<5) #define ITTI_DEBUG_MP_STATISTICS (1<<6) -const int itti_debug = ITTI_DEBUG_ISSUES | ITTI_DEBUG_MP_STATISTICS; +const int itti_debug = (ITTI_DEBUG_ISSUES | ITTI_DEBUG_MP_STATISTICS); -/* Don't flush if using RTAI */ -#ifdef RTAI -# define ITTI_DEBUG(m, x, args...) do { if ((m) & itti_debug) rt_log_debug (x, ##args); } while(0); -#else -# define ITTI_DEBUG(m, x, args...) do { if ((m) & itti_debug) fprintf(stdout, "[ITTI][D]"x, ##args); fflush (stdout); } while(0); -#endif +# define ITTI_DEBUG(m, x, args...) do { if ((m) & itti_debug) {fprintf(stdout, "[ITTI][D]"x, ##args); fflush (stdout);} } while(0); #define ITTI_ERROR(x, args...) do { fprintf(stdout, "[ITTI][E]"x, ##args); fflush (stdout); } while(0); /* Global message size */ #define MESSAGE_SIZE(mESSAGEiD) (sizeof(MessageHeader) + itti_desc.messages_info[mESSAGEiD].size) -#ifdef RTAI -# define ITTI_MEM_PAGE_SIZE (1024) -# define ITTI_MEM_SIZE (16 * 1024 * 1024) -#endif - typedef enum task_state_s { TASK_STATE_NOT_CONFIGURED, TASK_STATE_STARTING, TASK_STATE_READY, TASK_STATE_ENDED, TASK_STATE_MAX, } task_state_t; @@ -145,13 +110,11 @@ typedef struct thread_desc_s { int epoll_nb_events; - //#ifdef RTAI /* Flag to mark real time thread */ unsigned real_time; - /* Counter to indicate from RTAI threads that messages are pending for the thread */ + /* Counter to indicate that messages are pending for the thread */ unsigned messages_pending; - //#endif } thread_desc_t; typedef struct task_desc_s { @@ -183,17 +146,6 @@ typedef struct itti_desc_s { volatile uint32_t created_tasks; volatile uint32_t ready_tasks; volatile int wait_tasks; -#ifdef RTAI - pthread_t rt_relay_thread; -#endif - -#if defined(OAI_EMU) || defined(RTAI) - memory_pools_handle_t memory_pools_handle; - - uint64_t vcd_poll_msg; - uint64_t vcd_receive_msg; - uint64_t vcd_send_msg; -#endif } itti_desc_t; static itti_desc_t itti_desc; @@ -202,19 +154,8 @@ void *itti_malloc(task_id_t origin_task_id, task_id_t destination_task_id, ssize { void *ptr = NULL; -#if defined(OAI_EMU) || defined(RTAI) - ptr = memory_pools_allocate (itti_desc.memory_pools_handle, size, origin_task_id, destination_task_id); - - if (ptr == NULL) { - char *statistics = memory_pools_statistics (itti_desc.memory_pools_handle); - - ITTI_ERROR (" Memory pools statistics:\n%s", statistics); - free (statistics); - } - -#else ptr = malloc (size); -#endif + if (ptr) memset(ptr,0,size); AssertFatal (ptr != NULL, "Memory allocation of %d bytes failed (%d -> %d)!\n", (int) size, origin_task_id, destination_task_id); @@ -226,13 +167,7 @@ int itti_free(task_id_t task_id, void *ptr) int result = EXIT_SUCCESS; AssertFatal (ptr != NULL, "Trying to free a NULL pointer (%d)!\n", task_id); -#if defined(OAI_EMU) || defined(RTAI) - result = memory_pools_free (itti_desc.memory_pools_handle, ptr, task_id); - - AssertError (result == EXIT_SUCCESS, {}, "Failed to free memory at %p (%d)!\n", ptr, task_id); -#else free (ptr); -#endif return (result); } @@ -288,27 +223,6 @@ static task_id_t itti_get_current_task_id(void) return TASK_UNKNOWN; } -#ifdef RTAI -static void rt_log_debug(char *format, ...) -{ - task_id_t task_id; - va_list args; - char log_buffer[FIFO_PRINTF_MAX_STRING_SIZE]; - int len; - - task_id = itti_get_current_task_id (); - len = snprintf(log_buffer, FIFO_PRINTF_MAX_STRING_SIZE-1, "[ITTI][D][%s]", itti_get_task_name(task_id)); - va_start(args, format); - len += vsnprintf(&log_buffer[len], FIFO_PRINTF_MAX_STRING_SIZE-1-len, format, args); - va_end (args); - - if (task_id != TASK_UNKNOWN) - fwrite(log_buffer, len, 1, stdout); - else - rtf_put (FIFO_PRINTF_NO, log_buffer, len); -} -#endif - void itti_update_lte_time(uint32_t frame, uint8_t slot) { itti_desc.lte_time.frame = frame; @@ -365,10 +279,6 @@ MessageDef *itti_alloc_new_message_sized(task_id_t origin_task_id, MessagesIds m AssertFatal (message_id < itti_desc.messages_id_max, "Message id (%d) is out of range (%d)!\n", message_id, itti_desc.messages_id_max); -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_ALLOC_MSG, size); -#endif - if (origin_task_id == TASK_UNKNOWN) { /* Try to identify real origin task ID */ origin_task_id = itti_get_current_task_id(); @@ -380,10 +290,6 @@ MessageDef *itti_alloc_new_message_sized(task_id_t origin_task_id, MessagesIds m temp->ittiMsgHeader.originTaskId = origin_task_id; temp->ittiMsgHeader.ittiMsgSize = size; -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_ALLOC_MSG, 0); -#endif - return temp; } @@ -401,11 +307,6 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me message_number_t message_number; uint32_t message_id; -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG, - __sync_or_and_fetch (&itti_desc.vcd_send_msg, 1L << destination_task_id)); -#endif - AssertFatal (message != NULL, "Message is NULL!\n"); AssertFatal (destination_task_id < itti_desc.task_max, "Destination task id (%d) is out of range (%d)\n", destination_task_id, itti_desc.task_max); @@ -428,11 +329,6 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me sizeof(MessageHeader) + message->ittiMsgHeader.ittiMsgSize); if (destination_task_id != TASK_UNKNOWN) { -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_ENQUEUE_MESSAGE, VCD_FUNCTION_IN); - - memory_pools_set_info (itti_desc.memory_pools_handle, message, 1, destination_task_id); -#endif if (itti_desc.threads[destination_thread_id].task_state == TASK_STATE_ENDED) { ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Message %s, number %lu with priority %d can not be sent from %s to queue (%u:%s), ended destination task!\n", @@ -465,17 +361,6 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me AssertFatal(0, "Error: lfds611_queue_enqueue returns 0, queue is full, exiting\n"); } -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_ENQUEUE_MESSAGE, VCD_FUNCTION_OUT); -#endif - -#ifdef RTAI - - if (itti_desc.threads[TASK_GET_THREAD_ID(origin_task_id)].real_time) { - /* This is a RT task, increase destination task messages pending counter */ - __sync_fetch_and_add (&itti_desc.threads[destination_thread_id].messages_pending, 1); - } else -#endif { /* Only use event fd for tasks, subtasks will pool the queue */ if (TASK_GET_PARENT_TASK_ID(destination_task_id) == TASK_UNKNOWN) { @@ -503,11 +388,6 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); } -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG, - __sync_and_and_fetch (&itti_desc.vcd_send_msg, ~(1L << destination_task_id))); -#endif - return 0; } @@ -630,7 +510,6 @@ static inline void itti_receive_msg_internal_event_fd(task_id_t task_id, uint8_t read_ret = read (itti_desc.threads[thread_id].task_event_fd, &sem_counter, sizeof(sem_counter)); AssertFatal (read_ret == sizeof(sem_counter), "Read from task message FD (%d) failed (%d/%d)!\n", thread_id, (int) read_ret, (int) sizeof(sem_counter)); - if (lfds611_queue_dequeue (itti_desc.tasks[task_id].message_queue, (void **) &message) == 0) { /* No element in list -> this should not happen */ AssertFatal (0, "No message in queue for task %d while there are %d events and some for the messages queue!\n", task_id, epoll_ret); @@ -638,9 +517,12 @@ static inline void itti_receive_msg_internal_event_fd(task_id_t task_id, uint8_t AssertFatal(message != NULL, "Message from message queue is NULL!\n"); *received_msg = message->msg; + + result = itti_free (ITTI_MSG_ORIGIN_ID(*received_msg), message); AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + /* Mark that the event has been processed */ itti_desc.threads[thread_id].events[i].events &= ~EPOLLIN; return; @@ -650,17 +532,9 @@ static inline void itti_receive_msg_internal_event_fd(task_id_t task_id, uint8_t void itti_receive_msg(task_id_t task_id, MessageDef **received_msg) { -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG, - __sync_and_and_fetch (&itti_desc.vcd_receive_msg, ~(1L << task_id))); -#endif itti_receive_msg_internal_event_fd(task_id, 0, received_msg); -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG, - __sync_or_and_fetch (&itti_desc.vcd_receive_msg, 1L << task_id)); -#endif } void itti_poll_msg(task_id_t task_id, MessageDef **received_msg) @@ -669,11 +543,6 @@ void itti_poll_msg(task_id_t task_id, MessageDef **received_msg) *received_msg = NULL; -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG, - __sync_or_and_fetch (&itti_desc.vcd_poll_msg, 1L << task_id)); -#endif - { struct message_list_s *message; @@ -690,10 +559,6 @@ void itti_poll_msg(task_id_t task_id, MessageDef **received_msg) ITTI_DEBUG(ITTI_DEBUG_POLL, " No message in queue[(%u:%s)]\n", task_id, itti_get_task_name(task_id)); } -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG, - __sync_and_and_fetch (&itti_desc.vcd_poll_msg, ~(1L << task_id))); -#endif } int itti_create_task(task_id_t task_id, void *(*start_routine)(void *), void *args_p) @@ -725,7 +590,6 @@ int itti_create_task(task_id_t task_id, void *(*start_routine)(void *), void *ar return 0; } -//#ifdef RTAI void itti_set_task_real_time(task_id_t task_id) { thread_id_t thread_id = TASK_GET_THREAD_ID(task_id); @@ -734,7 +598,6 @@ void itti_set_task_real_time(task_id_t task_id) itti_desc.threads[thread_id].real_time = TRUE; } -//#endif void itti_wait_ready(int wait_tasks) { @@ -762,15 +625,6 @@ void itti_mark_task_ready(task_id_t task_id) /* Mark the thread as using LFDS queue */ lfds611_queue_use(itti_desc.tasks[task_id].message_queue); -#ifdef RTAI - /* Assign low priority to created threads */ - { - struct sched_param sched_param; - sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO) + 1; - sched_setscheduler(0, SCHED_FIFO, &sched_param); - } -#endif - itti_desc.threads[thread_id].task_state = TASK_STATE_READY; itti_desc.ready_tasks ++; @@ -783,15 +637,6 @@ void itti_mark_task_ready(task_id_t task_id) void itti_exit_task(void) { -#if defined(OAI_EMU) || defined(RTAI) - task_id_t task_id = itti_get_current_task_id(); - - if (task_id > TASK_UNKNOWN) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG, - __sync_and_and_fetch (&itti_desc.vcd_receive_msg, ~(1L << task_id))); - } - -#endif pthread_exit (NULL); } @@ -807,45 +652,6 @@ void itti_terminate_tasks(task_id_t task_id) pthread_exit (NULL); } -#ifdef RTAI -static void *itti_rt_relay_thread(void *arg) -{ - thread_id_t thread_id; - unsigned pending_messages; - - while (itti_desc.running) { - usleep (200); // Poll for messages a little more than 2 time by slot to get a small latency between RT and other tasks - -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_RELAY_THREAD, VCD_FUNCTION_IN); -#endif - - /* Checks for all non real time tasks if they have pending messages */ - for (thread_id = THREAD_FIRST; thread_id < itti_desc.thread_max; thread_id++) { - if ((itti_desc.threads[thread_id].task_state == TASK_STATE_READY) - && (itti_desc.threads[thread_id].real_time == FALSE)) { - pending_messages = __sync_fetch_and_and (&itti_desc.threads[thread_id].messages_pending, 0); - - if (pending_messages > 0) { - ssize_t write_ret; - eventfd_t sem_counter = pending_messages; - - /* Call to write for an event fd must be of 8 bytes */ - write_ret = write (itti_desc.threads[thread_id].task_event_fd, &sem_counter, sizeof(sem_counter)); - DevCheck(write_ret == sizeof(sem_counter), write_ret, sem_counter, thread_id); - } - } - } - -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_RELAY_THREAD, VCD_FUNCTION_OUT); -#endif - } - - return NULL; -} -#endif - int itti_init(task_id_t task_max, thread_id_t thread_max, MessagesIds messages_id_max, const task_info_t *tasks_info, const message_info_t *messages_info, const char * const messages_definition_xml, const char * const dump_file_name) { @@ -926,45 +732,12 @@ int itti_init(task_id_t task_max, thread_id_t thread_max, MessagesIds messages_i ITTI_DEBUG(ITTI_DEBUG_EVEN_FD, " Successfully subscribed fd %d for thread %d\n", itti_desc.threads[thread_id].task_event_fd, thread_id); -#ifdef RTAI - itti_desc.threads[thread_id].real_time = FALSE; - itti_desc.threads[thread_id].messages_pending = 0; -#endif } itti_desc.running = 1; itti_desc.wait_tasks = 0; itti_desc.created_tasks = 0; itti_desc.ready_tasks = 0; -#ifdef RTAI - /* Start RT relay thread */ - DevAssert(pthread_create (&itti_desc.rt_relay_thread, NULL, itti_rt_relay_thread, NULL) >= 0); - - rt_global_heap_open(); -#endif - -#if defined(OAI_EMU) || defined(RTAI) - itti_desc.memory_pools_handle = memory_pools_create (5); - memory_pools_add_pool (itti_desc.memory_pools_handle, 1000 + ITTI_QUEUE_MAX_ELEMENTS, 50); - memory_pools_add_pool (itti_desc.memory_pools_handle, 1000 + (2 * ITTI_QUEUE_MAX_ELEMENTS), 100); - memory_pools_add_pool (itti_desc.memory_pools_handle, 10000, 1000); - memory_pools_add_pool (itti_desc.memory_pools_handle, 400, 20050); - memory_pools_add_pool (itti_desc.memory_pools_handle, 100, 30050); - - { - char *statistics = memory_pools_statistics (itti_desc.memory_pools_handle); - - ITTI_DEBUG(ITTI_DEBUG_MP_STATISTICS, " Memory pools statistics:\n%s", statistics); - free (statistics); - } -#endif - -#if defined(OAI_EMU) || defined(RTAI) - itti_desc.vcd_poll_msg = 0; - itti_desc.vcd_receive_msg = 0; - itti_desc.vcd_send_msg = 0; -#endif - itti_dump_init (messages_definition_xml, dump_file_name); CHECK_INIT_RETURN(timer_init ()); @@ -1027,15 +800,6 @@ void itti_wait_tasks_end(void) itti_desc.running = 0; -#if defined(OAI_EMU) || defined(RTAI) - { - char *statistics = memory_pools_statistics (itti_desc.memory_pools_handle); - - ITTI_DEBUG(ITTI_DEBUG_MP_STATISTICS, " Memory pools statistics:\n%s", statistics); - free (statistics); - } -#endif - if (ready_tasks > 0) { ITTI_DEBUG(ITTI_DEBUG_ISSUES, " Some threads are still running, force exit\n"); exit (0); diff --git a/common/utils/itti/intertask_interface.h b/common/utils/itti/intertask_interface.h index 46fb0c749f..606c851d1d 100644 --- a/common/utils/itti/intertask_interface.h +++ b/common/utils/itti/intertask_interface.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms @@ -35,10 +27,6 @@ #include -#ifdef RTAI -# include -#endif - #ifndef INTERTASK_INTERFACE_H_ #define INTERTASK_INTERFACE_H_ @@ -163,12 +151,10 @@ int itti_create_task(task_id_t task_id, void *(*start_routine) (void *), void *args_p); -//#ifdef RTAI /** \brief Mark the task as a real time task * \param task_id task to mark as real time **/ void itti_set_task_real_time(task_id_t task_id); -//#endif /** \brief Indicates to ITTI if newly created tasks should wait for all tasks to be ready * \param wait_tasks non 0 to make new created tasks to wait, 0 to let created tasks to run diff --git a/common/utils/itti/intertask_interface_dump.c b/common/utils/itti/intertask_interface_dump.c index 30d92e3a29..bb77509726 100644 --- a/common/utils/itti/intertask_interface_dump.c +++ b/common/utils/itti/intertask_interface_dump.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - /** @brief Intertask Interface Signal Dumper * Allows users to connect their itti_analyzer to this process and dump * signals exchanged between tasks. @@ -60,23 +51,14 @@ #include "intertask_interface.h" #include "intertask_interface_dump.h" -#if defined(OAI_EMU) || defined(RTAI) -#include "vcd_signal_dumper.h" -#endif - #if T_TRACER #include "T.h" #endif static const int itti_dump_debug = 0; // 0x8 | 0x4 | 0x2; -#ifdef RTAI -# define ITTI_DUMP_DEBUG(m, x, args...) do { if ((m) & itti_dump_debug) rt_printk("[ITTI_DUMP][D]"x, ##args); } \ - while(0) -#else # define ITTI_DUMP_DEBUG(m, x, args...) do { if ((m) & itti_dump_debug) fprintf(stdout, "[ITTI_DUMP][D]"x, ##args); } \ while(0) -#endif #define ITTI_DUMP_ERROR(x, args...) do { fprintf(stdout, "[ITTI_DUMP][E]"x, ##args); } \ while(0) @@ -108,13 +90,8 @@ typedef struct itti_desc_s { int nb_connected; -#ifndef RTAI /* Event fd used to notify new messages (semaphore) */ int event_fd; -#else - unsigned long messages_in_queue __attribute__((aligned(8))); -#endif - int itti_listen_socket; itti_client_desc_t itti_clients[ITTI_DUMP_MAX_CON]; @@ -203,9 +180,7 @@ static int itti_dump_fwrite_message(itti_dump_queue_item_t *message) fwrite (&new_message_header, sizeof(itti_dump_message_t), 1, dump_file); fwrite (message->data, message->data_size, 1, dump_file); fwrite (&itti_dump_message_type_end, sizeof(itti_message_types_t), 1, dump_file); - // #if !defined(RTAI) fflush (dump_file); - // #endif return (1); } @@ -289,10 +264,6 @@ static int itti_dump_enqueue_message(itti_dump_queue_item_t *new, uint32_t messa int overwrite_flag; AssertFatal (new != NULL, "Message to queue is NULL!\n"); -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE, VCD_FUNCTION_IN); -#endif - new->message_type = message_type; new->message_size = message_size; @@ -312,9 +283,6 @@ static int itti_dump_enqueue_message(itti_dump_queue_item_t *new, uint32_t messa lfds611_ringbuffer_put_write_element(itti_dump_queue.itti_message_queue, new_queue_element); if (overwrite_flag == 0) { -#ifdef RTAI - __sync_fetch_and_add (&itti_dump_queue.messages_in_queue, 1); -#else { ssize_t write_ret; eventfd_t sem_counter = 1; @@ -323,25 +291,18 @@ static int itti_dump_enqueue_message(itti_dump_queue_item_t *new, uint32_t messa write_ret = write(itti_dump_queue.event_fd, &sem_counter, sizeof(sem_counter)); AssertFatal (write_ret == sizeof(sem_counter), "Write to dump event failed (%d/%d)!\n", (int) write_ret, (int) sizeof(sem_counter)); } -#endif // add one to pending_messages, atomically __sync_fetch_and_add (&pending_messages, 1); } ITTI_DUMP_DEBUG (0x2, " Added element to queue %p %p, pending %u, type %u\n", new_queue_element, new, pending_messages, message_type); -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE, VCD_FUNCTION_OUT); -#endif - return 0; } static void itti_dump_socket_exit(void) { -#ifndef RTAI close(itti_dump_queue.event_fd); -#endif close(itti_dump_queue.itti_listen_socket); /* Leave the thread as we detected end signal */ @@ -355,10 +316,6 @@ static int itti_dump_flush_ring_buffer(int flush_all) int j; int consumer; -#ifdef RTAI - unsigned long number_of_messages; -#endif - /* Check if there is a least one consumer */ consumer = 0; @@ -374,18 +331,6 @@ static int itti_dump_flush_ring_buffer(int flush_all) } if (consumer > 0) { -#ifdef RTAI - number_of_messages = itti_dump_queue.messages_in_queue; - - ITTI_DUMP_DEBUG(0x4, "%lu elements in queue\n", number_of_messages); - - if (number_of_messages == 0) { - return (consumer); - } - - __sync_sub_and_fetch(&itti_dump_queue.messages_in_queue, number_of_messages); -#endif - do { /* Acquire the ring element */ lfds611_ringbuffer_get_read_element(itti_dump_queue.itti_message_queue, &element); @@ -428,9 +373,6 @@ static int itti_dump_flush_ring_buffer(int flush_all) lfds611_ringbuffer_put_read_element(itti_dump_queue.itti_message_queue, element); } } while(flush_all -#ifdef RTAI - && --number_of_messages -#endif ); } @@ -487,9 +429,6 @@ static void *itti_dump_socket(void *arg_p) struct sockaddr_in servaddr; /* socket address structure */ struct timeval *timeout_p = NULL; -#ifdef RTAI - struct timeval timeout; -#endif ITTI_DUMP_DEBUG(0x2, " Creating TCP dump socket on port %u\n", ITTI_PORT); @@ -545,15 +484,11 @@ static void *itti_dump_socket(void *arg_p) /* Add the listener */ FD_SET(itti_listen_socket, &read_set); -#ifndef RTAI /* Add the event fd */ FD_SET(itti_dump_queue.event_fd, &read_set); /* Max of both sd */ max_sd = itti_listen_socket > itti_dump_queue.event_fd ? itti_listen_socket : itti_dump_queue.event_fd; -#else - max_sd = itti_listen_socket; -#endif itti_dump_queue.itti_listen_socket = itti_listen_socket; @@ -566,14 +501,7 @@ static void *itti_dump_socket(void *arg_p) int i; memcpy(&working_set, &read_set, sizeof(read_set)); -#ifdef RTAI - timeout.tv_sec = 0; - timeout.tv_usec = 100000; - - timeout_p = &timeout; -#else timeout_p = NULL; -#endif /* No timeout: select blocks till a new event has to be handled * on sd's. @@ -601,8 +529,6 @@ static void *itti_dump_socket(void *arg_p) if (FD_ISSET(i, &working_set)) { desc_ready -= 1; -#ifndef RTAI - if (i == itti_dump_queue.event_fd) { /* Notification of new element to dump from other tasks */ eventfd_t sem_counter; @@ -622,7 +548,6 @@ static void *itti_dump_socket(void *arg_p) if (itti_dump_running) { ITTI_DUMP_DEBUG (0x4, " No messages consumers, waiting ...\n"); usleep(100 * 1000); -#ifndef RTAI { ssize_t write_ret; @@ -631,7 +556,6 @@ static void *itti_dump_socket(void *arg_p) write_ret = write(itti_dump_queue.event_fd, &sem_counter, sizeof(sem_counter)); AssertFatal (write_ret == sizeof(sem_counter), "Failed to write to dump event FD (%d/%d)!\n", (int) write_ret, (int) sem_counter); } -#endif } else { itti_dump_socket_exit(); } @@ -639,7 +563,6 @@ static void *itti_dump_socket(void *arg_p) ITTI_DUMP_DEBUG(0x1, " Write element to file\n"); } } else -#endif if (i == itti_listen_socket) { do { client_socket = accept(itti_listen_socket, NULL, NULL); @@ -728,21 +651,9 @@ int itti_dump_queue_message(task_id_t sender_task, AssertFatal (message_name != NULL, "Message name is NULL!\n"); AssertFatal (message_p != NULL, "Message is NULL!\n"); -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC, VCD_FUNCTION_IN); -#endif new = itti_malloc(sender_task, TASK_MAX, sizeof(itti_dump_queue_item_t)); -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC, VCD_FUNCTION_OUT); -#endif -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC, VCD_FUNCTION_IN); -#endif new->data = itti_malloc(sender_task, TASK_MAX, message_size); -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC, VCD_FUNCTION_OUT); -#endif memcpy(new->data, message_p, message_size); new->data_size = message_size; @@ -800,9 +711,6 @@ int itti_dump_init(const char * const messages_definition_xml, const char * cons AssertFatal (0, " Failed to create ring buffer!\n"); } -#ifdef RTAI - itti_dump_queue.messages_in_queue = 0; -#else itti_dump_queue.event_fd = eventfd(0, EFD_SEMAPHORE); if (itti_dump_queue.event_fd == -1) { @@ -810,8 +718,6 @@ int itti_dump_init(const char * const messages_definition_xml, const char * cons AssertFatal (0, "eventfd failed: %s!\n", strerror(errno)); } -#endif - itti_dump_queue.nb_connected = 0; for(i = 0; i < ITTI_DUMP_MAX_CON; i++) { diff --git a/common/utils/itti/intertask_interface_dump.h b/common/utils/itti/intertask_interface_dump.h index acaf450cf4..a34dcecbf6 100644 --- a/common/utils/itti/intertask_interface_dump.h +++ b/common/utils/itti/intertask_interface_dump.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef INTERTASK_INTERFACE_DUMP_H_ diff --git a/common/utils/itti/intertask_interface_init.h b/common/utils/itti/intertask_interface_init.h index a01f1eea90..333b0653d7 100644 --- a/common/utils/itti/intertask_interface_init.h +++ b/common/utils/itti/intertask_interface_init.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms diff --git a/common/utils/itti/intertask_interface_types.h b/common/utils/itti/intertask_interface_types.h index bf29e12008..af1b4e9aa9 100644 --- a/common/utils/itti/intertask_interface_types.h +++ b/common/utils/itti/intertask_interface_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms diff --git a/common/utils/itti/intertask_messages_def.h b/common/utils/itti/intertask_messages_def.h index 4f125f4649..57c344c813 100644 --- a/common/utils/itti/intertask_messages_def.h +++ b/common/utils/itti/intertask_messages_def.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /* This message asks for task initialization */ diff --git a/common/utils/itti/intertask_messages_types.h b/common/utils/itti/intertask_messages_types.h index e64a709636..145f57648f 100644 --- a/common/utils/itti/intertask_messages_types.h +++ b/common/utils/itti/intertask_messages_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /* diff --git a/common/utils/itti/itti_types.h b/common/utils/itti/itti_types.h index f1a17d1228..d07853133b 100644 --- a/common/utils/itti/itti_types.h +++ b/common/utils/itti/itti_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /** @brief Intertask Interface common types @@ -35,11 +27,7 @@ #ifndef _ITTI_TYPES_H_ #define _ITTI_TYPES_H_ -#ifdef USER_MODE #include -#else -#include -#endif #define CHARS_TO_UINT32(c1, c2, c3, c4) (((c4) << 24) | ((c3) << 16) | ((c2) << 8) | (c1)) @@ -79,7 +67,5 @@ typedef struct { #define INSTANCE_DEFAULT (UINT16_MAX - 1) #define INSTANCE_ALL (UINT16_MAX) -typedef uint16_t instance_t; - #endif diff --git a/common/utils/itti/memory_pools.c b/common/utils/itti/memory_pools.c index a7d3448352..78b6923dc8 100644 --- a/common/utils/itti/memory_pools.c +++ b/common/utils/itti/memory_pools.c @@ -1,41 +1,26 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ -#ifdef RTAI -# include -#endif - #include "assertions.h" #include "memory_pools.h" -#if defined(OAI_EMU) || defined(RTAI) -# include "vcd_signal_dumper.h" -#endif #if T_TRACER #include @@ -45,18 +30,8 @@ /*------------------------------------------------------------------------------*/ const static int mp_debug = 0; -#ifdef RTAI -# define MP_DEBUG(x, args...) do { if (mp_debug) rt_printk("[MP][D]"x, ##args); } \ - while(0) -#else # define MP_DEBUG(x, args...) do { if (mp_debug) fprintf(stdout, "[MP][D]"x, ##args); fflush (stdout); } \ while(0) -#endif - -#if defined(OAI_EMU) || defined(RTAI) -uint64_t vcd_mp_alloc; -uint64_t vcd_mp_free; -#endif /*------------------------------------------------------------------------------*/ #ifndef CHARS_TO_UINT32 @@ -85,7 +60,7 @@ typedef struct items_group_s { } items_group_t; /*------------------------------------------------------------------------------*/ -static const items_group_position_t ITEMS_GROUP_POSITION_INVALID = -1; +//static const items_group_position_t ITEMS_GROUP_POSITION_INVALID = -1; static const items_group_index_t ITEMS_GROUP_INDEX_INVALID = -1; /*------------------------------------------------------------------------------*/ @@ -422,11 +397,6 @@ memory_pool_item_handle_t memory_pools_allocate (memory_pools_handle_t memory_po pool_id_t pool; items_group_index_t item_index = ITEMS_GROUP_INDEX_INVALID; -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_MP_ALLOC, - __sync_or_and_fetch (&vcd_mp_alloc, 1L << info_0)); -#endif - /* Recover memory_pools */ memory_pools = memory_pools_from_handler (memory_pools_handle); AssertError (memory_pools != NULL, {}, "Failed to retrieve memory pool for handle %p!\n", memory_pools_handle); @@ -472,11 +442,6 @@ memory_pool_item_handle_t memory_pools_allocate (memory_pools_handle_t memory_po MP_DEBUG(" Alloc [--][------]{------}, %3u %3u, %6u, failed!\n", info_0, info_1, item_size); } -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_MP_ALLOC, - __sync_and_and_fetch (&vcd_mp_alloc, ~(1L << info_0))); -#endif - return memory_pool_item_handle; } @@ -501,11 +466,6 @@ int memory_pools_free (memory_pools_handle_t memory_pools_handle, memory_pool_it info_1 = memory_pool_item->start.info[1]; -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_MP_FREE, - __sync_or_and_fetch (&vcd_mp_free, 1L << info_1)); -#endif - /* Recover pool index */ pool = memory_pool_item->start.pool_id; AssertFatal (pool < memory_pools->pools_defined, "Pool index is invalid (%u/%u)!\n", pool, memory_pools->pools_defined); @@ -539,11 +499,6 @@ int memory_pools_free (memory_pools_handle_t memory_pools_handle, memory_pool_it AssertError (result == EXIT_SUCCESS, {}, "Failed to free memory pool item (pool %u, item %d)!\n", pool, item_index); -#if defined(OAI_EMU) || defined(RTAI) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_MP_FREE, - __sync_and_and_fetch (&vcd_mp_free, ~(1L << info_1))); -#endif - return (result); } diff --git a/common/utils/itti/memory_pools.h b/common/utils/itti/memory_pools.h index 72268f90d7..1c1997f7f2 100644 --- a/common/utils/itti/memory_pools.h +++ b/common/utils/itti/memory_pools.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef MEMORY_POOLS_H_ diff --git a/common/utils/itti/messages_def.h b/common/utils/itti/messages_def.h index 7df3789fd7..f312669848 100644 --- a/common/utils/itti/messages_def.h +++ b/common/utils/itti/messages_def.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ // These messages files are mandatory and must always be placed in first position diff --git a/common/utils/itti/messages_types.h b/common/utils/itti/messages_types.h index 3426aada3e..d390bf0159 100644 --- a/common/utils/itti/messages_types.h +++ b/common/utils/itti/messages_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /* diff --git a/common/utils/itti/signals.c b/common/utils/itti/signals.c index b9a3316cec..9767ba3f67 100644 --- a/common/utils/itti/signals.c +++ b/common/utils/itti/signals.c @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #if HAVE_CONFIG_H diff --git a/common/utils/itti/signals.h b/common/utils/itti/signals.h index 53a73afa6f..5277e216a3 100644 --- a/common/utils/itti/signals.h +++ b/common/utils/itti/signals.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef SIGNALS_H_ diff --git a/common/utils/itti/tasks_def.h b/common/utils/itti/tasks_def.h index 5f2a413235..d54d09a26a 100644 --- a/common/utils/itti/tasks_def.h +++ b/common/utils/itti/tasks_def.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ // This task is mandatory and must always be placed in first position diff --git a/common/utils/itti/timer.c b/common/utils/itti/timer.c index 40e8791022..6327aeacfb 100644 --- a/common/utils/itti/timer.c +++ b/common/utils/itti/timer.c @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #include @@ -94,8 +86,8 @@ int timer_handle_signal(siginfo_t *info) timer_p = (struct timer_elm_s *)info->si_ptr; // LG: To many traces for msc timer: - // TMR_DEBUG("Timer with id 0x%lx has expired\n", (long)timer_p->timer); - + TMR_DEBUG("Timer with id 0x%lx has expired\n", (long)timer_p->timer); + task_id = timer_p->task_id; instance = timer_p->instance; message_p = itti_alloc_new_message(TASK_TIMER, TIMER_HAS_EXPIRED); @@ -128,6 +120,10 @@ int timer_handle_signal(siginfo_t *info) return -1; } +#if defined(ENB_AGENT_SB_IF) + +#endif + return 0; } diff --git a/common/utils/itti/timer.h b/common/utils/itti/timer.h index 825b3ca2eb..4f568a348c 100644 --- a/common/utils/itti/timer.h +++ b/common/utils/itti/timer.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef TIMER_H_ diff --git a/common/utils/itti/timer_messages_def.h b/common/utils/itti/timer_messages_def.h index 56af4e8a8e..761034730d 100644 --- a/common/utils/itti/timer_messages_def.h +++ b/common/utils/itti/timer_messages_def.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ MESSAGE_DEF(TIMER_HAS_EXPIRED, MESSAGE_PRIORITY_MED_PLUS, timer_has_expired_t, timer_has_expired) diff --git a/common/utils/itti/timer_messages_types.h b/common/utils/itti/timer_messages_types.h index 8126b75aef..0d06e3eebf 100644 --- a/common/utils/itti/timer_messages_types.h +++ b/common/utils/itti/timer_messages_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef TIMER_MESSAGES_TYPES_H_ diff --git a/common/utils/itti_analyzer/COPYING b/common/utils/itti_analyzer/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/common/utils/itti_analyzer/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/common/utils/itti_analyzer/common/COPYING b/common/utils/itti_analyzer/common/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/itti_analyzer/common/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/itti_analyzer/common/itti_types.h b/common/utils/itti_analyzer/common/itti_types.h index 3671b1d917..d405e48cbd 100644 --- a/common/utils/itti_analyzer/common/itti_types.h +++ b/common/utils/itti_analyzer/common/itti_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /** @brief Intertask Interface common types diff --git a/common/utils/itti_analyzer/common/logs.h b/common/utils/itti_analyzer/common/logs.h index 21d2dfad78..bd901cc394 100644 --- a/common/utils/itti_analyzer/common/logs.h +++ b/common/utils/itti_analyzer/common/logs.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /* diff --git a/common/utils/itti_analyzer/common/rc.h b/common/utils/itti_analyzer/common/rc.h index 11eb107632..50786f460f 100644 --- a/common/utils/itti_analyzer/common/rc.h +++ b/common/utils/itti_analyzer/common/rc.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include diff --git a/common/utils/itti_analyzer/itti_analyzer.c b/common/utils/itti_analyzer/itti_analyzer.c index 78bdb43b39..d87deb46e2 100644 --- a/common/utils/itti_analyzer/itti_analyzer.c +++ b/common/utils/itti_analyzer/itti_analyzer.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/COPYING b/common/utils/itti_analyzer/libbuffers/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/itti_analyzer/libbuffers/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/itti_analyzer/libbuffers/buffers.c b/common/utils/itti_analyzer/libbuffers/buffers.c index e8a1fc0c20..870c9cd40a 100644 --- a/common/utils/itti_analyzer/libbuffers/buffers.c +++ b/common/utils/itti_analyzer/libbuffers/buffers.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/buffers.h b/common/utils/itti_analyzer/libbuffers/buffers.h index fd57e7b021..34ecb355ab 100644 --- a/common/utils/itti_analyzer/libbuffers/buffers.h +++ b/common/utils/itti_analyzer/libbuffers/buffers.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #ifndef BUFFERS_H_ diff --git a/common/utils/itti_analyzer/libbuffers/file.c b/common/utils/itti_analyzer/libbuffers/file.c index b9404c31c0..291bf2d216 100644 --- a/common/utils/itti_analyzer/libbuffers/file.c +++ b/common/utils/itti_analyzer/libbuffers/file.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/file.h b/common/utils/itti_analyzer/libbuffers/file.h index 8d2b90a5cf..be0fa6ba2d 100644 --- a/common/utils/itti_analyzer/libbuffers/file.h +++ b/common/utils/itti_analyzer/libbuffers/file.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef FILE_H_ #define FILE_H_ diff --git a/common/utils/itti_analyzer/libbuffers/socket.c b/common/utils/itti_analyzer/libbuffers/socket.c index e782ee431b..f732af70ec 100644 --- a/common/utils/itti_analyzer/libbuffers/socket.c +++ b/common/utils/itti_analyzer/libbuffers/socket.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libbuffers/socket.h b/common/utils/itti_analyzer/libbuffers/socket.h index 45881f311b..8c2be2243e 100644 --- a/common/utils/itti_analyzer/libbuffers/socket.h +++ b/common/utils/itti_analyzer/libbuffers/socket.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include diff --git a/common/utils/itti_analyzer/libparser/COPYING b/common/utils/itti_analyzer/libparser/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/itti_analyzer/libparser/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/itti_analyzer/libparser/array_type.c b/common/utils/itti_analyzer/libparser/array_type.c index d88c7fa848..1d9f741281 100644 --- a/common/utils/itti_analyzer/libparser/array_type.c +++ b/common/utils/itti_analyzer/libparser/array_type.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/array_type.h b/common/utils/itti_analyzer/libparser/array_type.h index dd3eccf359..b336934dbb 100644 --- a/common/utils/itti_analyzer/libparser/array_type.h +++ b/common/utils/itti_analyzer/libparser/array_type.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "types.h" #ifndef ARRAY_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/enum_type.c b/common/utils/itti_analyzer/libparser/enum_type.c index 78328b5492..dbc99095bc 100644 --- a/common/utils/itti_analyzer/libparser/enum_type.c +++ b/common/utils/itti_analyzer/libparser/enum_type.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/enum_type.h b/common/utils/itti_analyzer/libparser/enum_type.h index ae19a5c495..4538829e78 100644 --- a/common/utils/itti_analyzer/libparser/enum_type.h +++ b/common/utils/itti_analyzer/libparser/enum_type.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "types.h" #ifndef ENUM_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.c b/common/utils/itti_analyzer/libparser/enum_value_type.c index eae25817b6..801317daaf 100644 --- a/common/utils/itti_analyzer/libparser/enum_value_type.c +++ b/common/utils/itti_analyzer/libparser/enum_value_type.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/enum_value_type.h b/common/utils/itti_analyzer/libparser/enum_value_type.h index 71ce4f9849..997e6cc3fe 100644 --- a/common/utils/itti_analyzer/libparser/enum_value_type.h +++ b/common/utils/itti_analyzer/libparser/enum_value_type.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "types.h" #ifndef ENUM_VALUE_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/field_type.c b/common/utils/itti_analyzer/libparser/field_type.c index 4ebb743150..b64d3bd0c1 100644 --- a/common/utils/itti_analyzer/libparser/field_type.c +++ b/common/utils/itti_analyzer/libparser/field_type.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/field_type.h b/common/utils/itti_analyzer/libparser/field_type.h index 0437f9e5ec..329e90c3be 100644 --- a/common/utils/itti_analyzer/libparser/field_type.h +++ b/common/utils/itti_analyzer/libparser/field_type.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "types.h" #ifndef FIELD_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/file_type.c b/common/utils/itti_analyzer/libparser/file_type.c index c032e6eb88..04d66b7a08 100644 --- a/common/utils/itti_analyzer/libparser/file_type.c +++ b/common/utils/itti_analyzer/libparser/file_type.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/file_type.h b/common/utils/itti_analyzer/libparser/file_type.h index d84f5af34f..34ebea6745 100644 --- a/common/utils/itti_analyzer/libparser/file_type.h +++ b/common/utils/itti_analyzer/libparser/file_type.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "types.h" #ifndef FILE_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.c b/common/utils/itti_analyzer/libparser/fundamental_type.c index 8559919730..92dd1c75cb 100644 --- a/common/utils/itti_analyzer/libparser/fundamental_type.c +++ b/common/utils/itti_analyzer/libparser/fundamental_type.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/fundamental_type.h b/common/utils/itti_analyzer/libparser/fundamental_type.h index cb13bf2b79..07ceb3b9ed 100644 --- a/common/utils/itti_analyzer/libparser/fundamental_type.h +++ b/common/utils/itti_analyzer/libparser/fundamental_type.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #include "types.h" diff --git a/common/utils/itti_analyzer/libparser/intertask_contexts.h b/common/utils/itti_analyzer/libparser/intertask_contexts.h index 72d3fb2cc6..cfe8f59402 100644 --- a/common/utils/itti_analyzer/libparser/intertask_contexts.h +++ b/common/utils/itti_analyzer/libparser/intertask_contexts.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "fundamental_type.h" #include "struct_type.h" diff --git a/common/utils/itti_analyzer/libparser/pointer_type.c b/common/utils/itti_analyzer/libparser/pointer_type.c index 921bafcac8..e4571f9f48 100644 --- a/common/utils/itti_analyzer/libparser/pointer_type.c +++ b/common/utils/itti_analyzer/libparser/pointer_type.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/pointer_type.h b/common/utils/itti_analyzer/libparser/pointer_type.h index 0c6b901f5b..be2b6cc33c 100644 --- a/common/utils/itti_analyzer/libparser/pointer_type.h +++ b/common/utils/itti_analyzer/libparser/pointer_type.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "types.h" #ifndef POINTER_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/reference_type.c b/common/utils/itti_analyzer/libparser/reference_type.c index ee49b10cd5..8d0fec4e61 100644 --- a/common/utils/itti_analyzer/libparser/reference_type.c +++ b/common/utils/itti_analyzer/libparser/reference_type.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/reference_type.h b/common/utils/itti_analyzer/libparser/reference_type.h index 693bc712d8..da56e9f942 100644 --- a/common/utils/itti_analyzer/libparser/reference_type.h +++ b/common/utils/itti_analyzer/libparser/reference_type.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "types.h" #ifndef REFERENCE_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/struct_type.c b/common/utils/itti_analyzer/libparser/struct_type.c index af1201b4d2..09d5280ea5 100644 --- a/common/utils/itti_analyzer/libparser/struct_type.c +++ b/common/utils/itti_analyzer/libparser/struct_type.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/struct_type.h b/common/utils/itti_analyzer/libparser/struct_type.h index 7bbb9ee100..29d4113b6f 100644 --- a/common/utils/itti_analyzer/libparser/struct_type.h +++ b/common/utils/itti_analyzer/libparser/struct_type.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "types.h" #ifndef STRUCT_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/typedef_type.c b/common/utils/itti_analyzer/libparser/typedef_type.c index 285acfad5c..e5cee1a1cf 100644 --- a/common/utils/itti_analyzer/libparser/typedef_type.c +++ b/common/utils/itti_analyzer/libparser/typedef_type.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/typedef_type.h b/common/utils/itti_analyzer/libparser/typedef_type.h index 0657f50c98..b5710dbfcb 100644 --- a/common/utils/itti_analyzer/libparser/typedef_type.h +++ b/common/utils/itti_analyzer/libparser/typedef_type.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "types.h" #ifndef TYPEDEF_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/types.c b/common/utils/itti_analyzer/libparser/types.c index 7ae55bb737..406db5249c 100644 --- a/common/utils/itti_analyzer/libparser/types.c +++ b/common/utils/itti_analyzer/libparser/types.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/types.h b/common/utils/itti_analyzer/libparser/types.h index 339029839d..c449c445fd 100644 --- a/common/utils/itti_analyzer/libparser/types.h +++ b/common/utils/itti_analyzer/libparser/types.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include "buffers.h" diff --git a/common/utils/itti_analyzer/libparser/union_type.c b/common/utils/itti_analyzer/libparser/union_type.c index ef8fd393ac..f38b7a1ccc 100644 --- a/common/utils/itti_analyzer/libparser/union_type.c +++ b/common/utils/itti_analyzer/libparser/union_type.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libparser/union_type.h b/common/utils/itti_analyzer/libparser/union_type.h index c1817dea6e..ed2dca73ba 100644 --- a/common/utils/itti_analyzer/libparser/union_type.h +++ b/common/utils/itti_analyzer/libparser/union_type.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "types.h" #ifndef UNION_TYPE_H_ diff --git a/common/utils/itti_analyzer/libparser/xml_parse.c b/common/utils/itti_analyzer/libparser/xml_parse.c index cdad8ee3ed..352b10d616 100644 --- a/common/utils/itti_analyzer/libparser/xml_parse.c +++ b/common/utils/itti_analyzer/libparser/xml_parse.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include diff --git a/common/utils/itti_analyzer/libparser/xml_parse.h b/common/utils/itti_analyzer/libparser/xml_parse.h index 5d23a6157a..f9624bc06b 100644 --- a/common/utils/itti_analyzer/libparser/xml_parse.h +++ b/common/utils/itti_analyzer/libparser/xml_parse.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include "rc.h" #include "types.h" diff --git a/common/utils/itti_analyzer/libresolver/COPYING b/common/utils/itti_analyzer/libresolver/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/itti_analyzer/libresolver/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/itti_analyzer/libresolver/locate_root.c b/common/utils/itti_analyzer/libresolver/locate_root.c index 8d1b101e73..dffd489944 100644 --- a/common/utils/itti_analyzer/libresolver/locate_root.c +++ b/common/utils/itti_analyzer/libresolver/locate_root.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include diff --git a/common/utils/itti_analyzer/libresolver/locate_root.h b/common/utils/itti_analyzer/libresolver/locate_root.h index 103e7b96ef..5cb2eb2588 100644 --- a/common/utils/itti_analyzer/libresolver/locate_root.h +++ b/common/utils/itti_analyzer/libresolver/locate_root.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef LOCATE_ROOT_H_ #define LOCATE_ROOT_H_ diff --git a/common/utils/itti_analyzer/libresolver/resolvers.c b/common/utils/itti_analyzer/libresolver/resolvers.c index 685cd84d87..8702c08942 100644 --- a/common/utils/itti_analyzer/libresolver/resolvers.c +++ b/common/utils/itti_analyzer/libresolver/resolvers.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libresolver/resolvers.h b/common/utils/itti_analyzer/libresolver/resolvers.h index 84d2e15ecf..17e16462b4 100644 --- a/common/utils/itti_analyzer/libresolver/resolvers.h +++ b/common/utils/itti_analyzer/libresolver/resolvers.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef RESOLVERS_H_ #define RESOLVERS_H_ diff --git a/common/utils/itti_analyzer/libui/COPYING b/common/utils/itti_analyzer/libui/COPYING deleted file mode 100644 index d605b9a3b1..0000000000 --- a/common/utils/itti_analyzer/libui/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.c b/common/utils/itti_analyzer/libui/ui_callbacks.c index 725a453334..6fc480e333 100644 --- a/common/utils/itti_analyzer/libui/ui_callbacks.c +++ b/common/utils/itti_analyzer/libui/ui_callbacks.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/common/utils/itti_analyzer/libui/ui_callbacks.h b/common/utils/itti_analyzer/libui/ui_callbacks.h index f408441548..b3d4b31c60 100644 --- a/common/utils/itti_analyzer/libui/ui_callbacks.h +++ b/common/utils/itti_analyzer/libui/ui_callbacks.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef UI_CALLBACKS_H_ #define UI_CALLBACKS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_filters.c b/common/utils/itti_analyzer/libui/ui_filters.c index e2fb993933..8a6321a538 100644 --- a/common/utils/itti_analyzer/libui/ui_filters.c +++ b/common/utils/itti_analyzer/libui/ui_filters.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include diff --git a/common/utils/itti_analyzer/libui/ui_filters.h b/common/utils/itti_analyzer/libui/ui_filters.h index 9e168ad62f..16bb38834b 100644 --- a/common/utils/itti_analyzer/libui/ui_filters.h +++ b/common/utils/itti_analyzer/libui/ui_filters.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef UI_FILTERS_H_ #define UI_FILTERS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_interface.c b/common/utils/itti_analyzer/libui/ui_interface.c index 8f0f5a8415..56139a8c6b 100644 --- a/common/utils/itti_analyzer/libui/ui_interface.c +++ b/common/utils/itti_analyzer/libui/ui_interface.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libui/ui_interface.h b/common/utils/itti_analyzer/libui/ui_interface.h index de120e6565..f77ec144d1 100644 --- a/common/utils/itti_analyzer/libui/ui_interface.h +++ b/common/utils/itti_analyzer/libui/ui_interface.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #ifndef UI_INTERFACE_H_ diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.c b/common/utils/itti_analyzer/libui/ui_main_screen.c index e440bfb50e..3d6ea266be 100644 --- a/common/utils/itti_analyzer/libui/ui_main_screen.c +++ b/common/utils/itti_analyzer/libui/ui_main_screen.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/common/utils/itti_analyzer/libui/ui_main_screen.h b/common/utils/itti_analyzer/libui/ui_main_screen.h index 4455195a1d..0411d687be 100644 --- a/common/utils/itti_analyzer/libui/ui_main_screen.h +++ b/common/utils/itti_analyzer/libui/ui_main_screen.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef UI_MAIN_SCREEN_H_ #define UI_MAIN_SCREEN_H_ diff --git a/common/utils/itti_analyzer/libui/ui_menu_bar.c b/common/utils/itti_analyzer/libui/ui_menu_bar.c index a5c7c2810f..62b51b3b9f 100644 --- a/common/utils/itti_analyzer/libui/ui_menu_bar.c +++ b/common/utils/itti_analyzer/libui/ui_menu_bar.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #define G_LOG_DOMAIN ("UI") #include diff --git a/common/utils/itti_analyzer/libui/ui_menu_bar.h b/common/utils/itti_analyzer/libui/ui_menu_bar.h index 7644862c7a..037dc5edca 100644 --- a/common/utils/itti_analyzer/libui/ui_menu_bar.h +++ b/common/utils/itti_analyzer/libui/ui_menu_bar.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef UI_MENU_BAR_H_ #define UI_MENU_BAR_H_ diff --git a/common/utils/itti_analyzer/libui/ui_notebook.c b/common/utils/itti_analyzer/libui/ui_notebook.c index 07bf12fe7c..93a439335f 100644 --- a/common/utils/itti_analyzer/libui/ui_notebook.c +++ b/common/utils/itti_analyzer/libui/ui_notebook.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/common/utils/itti_analyzer/libui/ui_notebook.h b/common/utils/itti_analyzer/libui/ui_notebook.h index cf574608ca..6f87856e84 100644 --- a/common/utils/itti_analyzer/libui/ui_notebook.h +++ b/common/utils/itti_analyzer/libui/ui_notebook.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef UI_NOTEBOOK_H_ #define UI_NOTEBOOK_H_ diff --git a/common/utils/itti_analyzer/libui/ui_notif_dlg.c b/common/utils/itti_analyzer/libui/ui_notif_dlg.c index 6d442a733c..4be4aa52cf 100644 --- a/common/utils/itti_analyzer/libui/ui_notif_dlg.c +++ b/common/utils/itti_analyzer/libui/ui_notif_dlg.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #define G_LOG_DOMAIN ("UI") #include "rc.h" diff --git a/common/utils/itti_analyzer/libui/ui_notif_dlg.h b/common/utils/itti_analyzer/libui/ui_notif_dlg.h index 871b7ddb0c..361ec81850 100644 --- a/common/utils/itti_analyzer/libui/ui_notif_dlg.h +++ b/common/utils/itti_analyzer/libui/ui_notif_dlg.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #ifndef UI_NOTIF_DLG_H_ diff --git a/common/utils/itti_analyzer/libui/ui_notifications.c b/common/utils/itti_analyzer/libui/ui_notifications.c index 5a3b57656b..6e7897c850 100644 --- a/common/utils/itti_analyzer/libui/ui_notifications.c +++ b/common/utils/itti_analyzer/libui/ui_notifications.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include #include diff --git a/common/utils/itti_analyzer/libui/ui_notifications.h b/common/utils/itti_analyzer/libui/ui_notifications.h index 9ea36aa1f2..33ef0ff5c0 100644 --- a/common/utils/itti_analyzer/libui/ui_notifications.h +++ b/common/utils/itti_analyzer/libui/ui_notifications.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef UI_NOTIFICATIONS_H_ #define UI_NOTIFICATIONS_H_ diff --git a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c index 49e8df315d..859eb66b03 100644 --- a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c +++ b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #define G_LOG_DOMAIN ("UI") diff --git a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h index 36d8d55de5..a5ccf6a9eb 100644 --- a/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h +++ b/common/utils/itti_analyzer/libui/ui_signal_dissect_view.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef UI_SIGNAL_DISSECT_VIEW_H_ #define UI_SIGNAL_DISSECT_VIEW_H_ diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.c b/common/utils/itti_analyzer/libui/ui_tree_view.c index 94a612dac6..0396e24819 100644 --- a/common/utils/itti_analyzer/libui/ui_tree_view.c +++ b/common/utils/itti_analyzer/libui/ui_tree_view.c @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #include #include diff --git a/common/utils/itti_analyzer/libui/ui_tree_view.h b/common/utils/itti_analyzer/libui/ui_tree_view.h index cee24eba38..88ab2fce71 100644 --- a/common/utils/itti_analyzer/libui/ui_tree_view.h +++ b/common/utils/itti_analyzer/libui/ui_tree_view.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef UI_TREE_VIEW_H_ #define UI_TREE_VIEW_H_ diff --git a/common/utils/load_module_shlib.c b/common/utils/load_module_shlib.c new file mode 100644 index 0000000000..b21f39e69d --- /dev/null +++ b/common/utils/load_module_shlib.c @@ -0,0 +1,111 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/utils/load_module_shlib.c + * \brief shared library loader implementation + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include "openair1/PHY/defs.h" +#define LOAD_MODULE_SHLIB_MAIN + +#include "common/config/config_userapi.h" +#include "load_module_shlib.h" +void loader_init(void) { + paramdef_t LoaderParams[] = LOADER_PARAMS_DESC; + + + int ret = config_get( LoaderParams,sizeof(LoaderParams)/sizeof(paramdef_t),LOADER_CONFIG_PREFIX); + if (ret <0) { + fprintf(stderr,"[LOADER] configuration couldn't be performed"); + if (loader_data.shlibpath == NULL) { + loader_data.shlibpath=DEFAULT_PATH; + } + return; + } +} + +int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf) +{ + void *lib_handle; + initfunc_t fpi; + char *tmpstr; + int ret=0; + + if (loader_data.shlibpath == NULL) { + loader_init(); + } + tmpstr = malloc(strlen(loader_data.shlibpath)+strlen(modname)+16); + if (tmpstr == NULL) { + fprintf(stderr,"[LOADER] %s %d malloc error loading module %s, %s\n",__FILE__, __LINE__, modname, strerror(errno)); + return -1; + } + + if(loader_data.shlibpath[0] != 0) { + ret=sprintf(tmpstr,"%s/",loader_data.shlibpath); + } + if(strstr(modname,".so") == NULL) { + sprintf(tmpstr+ret,"lib%s.so",modname); + } else { + sprintf(tmpstr+ret,"%s",modname); + } + ret = 0; + lib_handle = dlopen(tmpstr, RTLD_LAZY|RTLD_NODELETE|RTLD_GLOBAL); + if (!lib_handle) { + fprintf(stderr,"[LOADER] library %s is not loaded: %s\n", tmpstr,dlerror()); + ret = -1; + } else { + printf("[LOADER] library %s uccessfully loaded loaded\n", tmpstr); + sprintf(tmpstr,"%s_autoinit",modname); + fpi = dlsym(lib_handle,tmpstr); + + if (fpi != NULL ) + { + fpi(); + } + + if (farray != NULL) { + for (int i=0; i +#include +#include +#include +#include + +#define MAX_COMMAND 4096 + +static int command_pipe_read; +static int command_pipe_write; +static int result_pipe_read; +static int result_pipe_write; + +static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; + +static int module_initialized = 0; + +/********************************************************************/ +/* util functions */ +/********************************************************************/ + +static void lock_system(void) +{ + if (pthread_mutex_lock(&lock) != 0) { + printf("pthread_mutex_lock fails\n"); + abort(); + } +} + +static void unlock_system(void) +{ + if (pthread_mutex_unlock(&lock) != 0) { + printf("pthread_mutex_unlock fails\n"); + abort(); + } +} + +static void write_pipe(int p, char *b, int size) +{ + while (size) { + int ret = write(p, b, size); + if (ret <= 0) exit(0); + b += ret; + size -= ret; + } +} + +static void read_pipe(int p, char *b, int size) +{ + while (size) { + int ret = read(p, b, size); + if (ret <= 0) exit(0); + b += ret; + size -= ret; + } +} + +/********************************************************************/ +/* background process */ +/********************************************************************/ + +/* This function is run by background process. It waits for a command, + * runs it, and reports status back. It exits (in normal situations) + * when the main process exits, because then a "read" on the pipe + * will return 0, in which case "read_pipe" exits. + */ +static void background_system_process(void) +{ + int len; + int ret; + char command[MAX_COMMAND+1]; + + while (1) { + read_pipe(command_pipe_read, (char*)&len, sizeof(int)); + read_pipe(command_pipe_read, command, len); + ret = system(command); + write_pipe(result_pipe_write, (char *)&ret, sizeof(int)); + } +} + +/********************************************************************/ +/* background_system() */ +/* return -1 on error, 0 on success */ +/********************************************************************/ + +int background_system(char *command) +{ + int res; + int len; + + if (module_initialized == 0) { + printf("FATAL: calling 'background_system' but 'start_background_system' was not called\n"); + abort(); + } + + len = strlen(command)+1; + if (len > MAX_COMMAND) { + printf("FATAL: command too long. Increase MAX_COMMAND (%d).\n", MAX_COMMAND); + printf("command was: '%s'\n", command); + abort(); + } + /* only one command can run at a time, so let's lock/unlock */ + lock_system(); + write_pipe(command_pipe_write, (char*)&len, sizeof(int)); + write_pipe(command_pipe_write, command, len); + read_pipe(result_pipe_read, (char*)&res, sizeof(int)); + unlock_system(); + if (res == -1 || !WIFEXITED(res) || WEXITSTATUS(res) != 0) return -1; + return 0; +} + +/********************************************************************/ +/* start_background_system() */ +/* initializes the "background system" module */ +/* to be called very early by the main processing */ +/********************************************************************/ + +void start_background_system(void) +{ + int p[2]; + pid_t son; + + module_initialized = 1; + + if (pipe(p) == -1) { + perror("pipe"); + exit(1); + } + command_pipe_read = p[0]; + command_pipe_write = p[1]; + + if (pipe(p) == -1) { + perror("pipe"); + exit(1); + } + result_pipe_read = p[0]; + result_pipe_write = p[1]; + + son = fork(); + if (son == -1) { + perror("fork"); + exit(1); + } + + if (son) { + close(result_pipe_write); + close(command_pipe_read); + return; + } + + close(result_pipe_read); + close(command_pipe_write); + + background_system_process(); +} diff --git a/common/utils/system.h b/common/utils/system.h new file mode 100644 index 0000000000..658c17adc1 --- /dev/null +++ b/common/utils/system.h @@ -0,0 +1,39 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#ifndef _SYSTEM_H_OAI_ +#define _SYSTEM_H_OAI_ + +/**************************************************** + * send a command to the background process + * return -1 on error, 0 on success + ****************************************************/ + +int background_system(char *command); + +/**************************************************** + * initialize the background process + * to be called very early + ****************************************************/ + +void start_background_system(void); + +#endif /* _SYSTEM_H_OAI_ */ diff --git a/common/utils/telnetsrv/CMakeLists.txt b/common/utils/telnetsrv/CMakeLists.txt new file mode 100644 index 0000000000..bc4a550742 --- /dev/null +++ b/common/utils/telnetsrv/CMakeLists.txt @@ -0,0 +1,59 @@ +cmake_minimum_required(VERSION 2.8 FATAL_ERROR) +IF(DEFINED ENV{OPENAIR_DIR}) + message("...using oai source files in $ENV{OPENAIR_DIR}") +ELSE() + message("OPENAIR_DIR is not defined. You must run \"source oaienv\" from the oai root dir") + # exit early + return() +ENDIF() + + + +set(OPENAIR_DIR $ENV{OPENAIR_DIR}) +set(APPROOT ${OPENAIR_DIR}/common/utils/telnetsrv ) +set(OPENAIR_BUILD_DIR $ENV{OPENAIR_DIR}/cmake_targets) +set(OPENAIR1_DIR $ENV{OPENAIR1_DIR}) +set(OPENAIR2_DIR $ENV{OPENAIR2_DIR}) +set(OPENAIR3_DIR $ENV{OPENAIR3_DIR}) +set(OPENAIR_PHY_DIR $ENV{OPENAIR1_DIR}/PHY) +set(OPENAIR_TARGET_DIR $ENV{OPENAIR_DIR}/targets) +set(OPENAIR_COMMONUTILS_DIR $ENV{OPENAIR_DIR}/common/utils) +set(OPENAIR2_COMMON_DIR $ENV{OPENAIR_DIR}/openair2/COMMON) +set(OPENAIR_ASN1INC ${OPENAIR_BUILD_DIR}/lte_build_oai/build/CMakeFiles/Rel14) +set(OPENAIR_NFAPIINC $ENV{NFAPI_DIR} ) + +set(CMAKE_INSTALL_PREFIX $ENV{OPENAIR_TARGETS}) + +add_definitions (-DRel14 -DCMAKER -DENABLE_ITTI -DENABLE_NAS_UE_LOGGING -DENABLE_SECURITY -DENABLE_USE_CPU_EXECUTION_TIME -DENABLE_USE_MME -DENABLE_VCD -DENB_AGENT -DENB_MODE -DETHERNET=1 -DEXMIMO_IOT -DJUMBO_FRAME -DLINK_ENB_PDCP_TO_GTPV1U -DLOG_NO_THREAD -DMAC_CONTEXT -DMAX_NUM_CCs=1 -DNAS_BUILT_IN_UE -DNAS_UE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DNO_RRM -DNone=1 -DOAI_NW_DRIVER_USE_NETLINK -DOPENAIR2 -DOPENAIR_LTE -DPHYSIM -DPHY_CONTEXT -DRel10=1 -DS1AP_VERSION=R10 -DTRACE_RLC_MUTEX -DX2AP_VERSION=R11 -DXFORMS -mavx2 -msse4.1 -mssse3) +add_compile_options( -fPIC -march=native -Ofast) + +include_directories( ./ ${OPENAIR_COMMON_DIR} ${OPENAIR_DIR} ${OPENAIR1_DIR} ${OPENAIR2_DIR} ${OPENAIR2_COMMON_DIR} ${OPENAIR2_DIR}/UTIL/LOG + ${OPENAIR_COMMONUTILS_DIR}/msc ${OPENAIR_COMMONUTILS_DIR}/itti ${OPENAIR_COMMONUTILS_DIR}/hashtable ${OPENAIR_COMMONUTILS_DIR} ${OPENAIR_ASN1INC} + ${OPENAIR2_DIR}/LAYER2/RLC/AM_v9.3.0 ${OPENAIR_COMMONUTILS_DIR}/msc ${OPENAIR_COMMONUTILS_DIR}/itti ${OPENAIR_COMMONUTILS_DIR}/hashtable ${OPENAIR_COMMONUTILS_DIR} ${OPENAIR_ASN1INC} + ${OPENAIR2_DIR}/LAYER2/RLC ${OPENAIR2_DIR}/UTIL/LISTS ${OPENAIR2_DIR}/UTIL/MEM ${OPENAIR2_DIR}/LAYER2/RLC/UM_v9.3.0 + ${OPENAIR2_DIR}/LAYER2/RLC/TM_v9.3.0 ${OPENAIR2_DIR}/RRC/LITE ${OPENAIR_TARGET_DIR}/COMMON ${OPENAIR_TARGET_DIR}/ARCH/COMMON + ${OPENAIR3_DIR}/NAS/COMMON/API/NETWORK ${OPENAIR3_DIR}/NAS/COMMON/EMM/MSG/ ${OPENAIR3_DIR}/NAS/COMMON/IES/ ${OPENAIR3_DIR}/NAS/COMMON/UTIL + ${OPENAIR3_DIR}/NAS/COMMON/ESM/MSG/ ${OPENAIR3_DIR}/GTPV1-U ${OPENAIR3_DIR}/GTPV1-U/nw-gtpv1u/shared ${OPENAIR3_DIR}/GTPV1-U/nw-gtpv1u/include + ${OPENAIR3_DIR}/UTILS ${OPENAIR_NFAPIINC}) + +set(TELNETSRV_SOURCE + ${APPROOT}/telnetsrv.c + ${APPROOT}/telnetsrv_phycmd.c + ${APPROOT}/telnetsrv_proccmd.c + ) + +#set(TELNETSRV_ETHDEVCMD_SOURCE +# ${APPROOT}/telnetsrv/telnetsrv_ethdevcmd.c +# ) + + + +add_library(telnetsrv MODULE ${TELNETSRV_SOURCE} ) +#add_library(telnetsrv_ethdevcmd MODULE ${TELNETSRV_ETHDEVCMD_SOURCE} ) + + +install(TARGETS telnetsrv DESTINATION bin) + +if (EXISTS "${OPENAIR_BUILD_DIR}/lte_build_oai/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/lte_build_oai/build") + install(TARGETS telnetsrv DESTINATION ${OPENAIR_BUILD_DIR}/lte_build_oai/build) +endif (EXISTS "${OPENAIR_BUILD_DIR}/lte_build_oai/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/lte_build_oai/build") diff --git a/common/utils/telnetsrv/telnetsrv.c b/common/utils/telnetsrv/telnetsrv.c new file mode 100644 index 0000000000..f99a83f321 --- /dev/null +++ b/common/utils/telnetsrv/telnetsrv.c @@ -0,0 +1,696 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/utils/telnetsrv/telnetsrv.c + * \brief: implementation of a telnet server + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/config/config_userapi.h" + + +#include "telnetsrv_phycmd.h" +#include "telnetsrv_proccmd.h" +static char* telnet_defstatmod[] = {"softmodem","phy"}; +static telnetsrv_params_t telnetparams; +#define TELNETSRV_LISTENADDR 0 +#define TELNETSRV_LISTENPORT 1 +#define TELNETSRV_PRIORITY 2 +#define TELNETSRV_DEBUG 3 +#define TELNETSRV_STATICMOD 7 +#define TELNETSRV_SHRMOD 8 +paramdef_t telnetoptions[] = { +/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* configuration parameters for telnet utility */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + {"listenaddr", "", 0, uptr:&telnetparams.listenaddr, defstrval:"0.0.0.0", TYPE_IPV4ADDR, 0 }, + {"listenport", "", 0, uptr:&(telnetparams.listenport), defuintval:9090, TYPE_UINT, 0 }, + {"priority", "", 0, uptr:NULL, defuintval:0, TYPE_UINT, 0 }, + {"loopcount", "", 0, uptr:&(telnetparams.loopcount), defuintval:10, TYPE_UINT, 0 }, + {"loopdelay", "", 0, uptr:&(telnetparams.loopdelay), defuintval:5000, TYPE_UINT, 0 }, + {"phypbsize", "",0, uptr:&(telnetparams.phyprntbuff_size),defuintval:65000, TYPE_UINT, 0 }, + {"staticmod", "", 0, NULL, defstrlistval:telnet_defstatmod,TYPE_STRINGLIST,1}, + {"shrmod", "", 0, NULL, NULL,TYPE_STRINGLIST,0 }, +}; + +int get_phybsize() {return telnetparams.phyprntbuff_size; }; +int add_telnetcmd(char *modulename,telnetshell_vardef_t *var, telnetshell_cmddef_t *cmd ); +int setoutput(char *buff, int debug, telnet_printfunc_t prnt); +int setparam(char *buff, int debug, telnet_printfunc_t prnt); + +telnetshell_vardef_t telnet_vardef[] = { +{"debug",TELNET_VARTYPE_INT32,&telnetparams.telnetdbg}, +{"prio",TELNET_VARTYPE_INT32,&telnetparams.priority}, +{"loopc",TELNET_VARTYPE_INT32,&telnetparams.loopcount}, +{"loopd",TELNET_VARTYPE_INT32,&telnetparams.loopdelay}, +{"phypb",TELNET_VARTYPE_INT32,&telnetparams.phyprntbuff_size}, +{"",0,NULL} +}; + +telnetshell_cmddef_t telnet_cmdarray[] = { + {"redirlog","[here,file,off]",setoutput}, + {"param","[prio]",setparam}, + {"","",NULL}, +}; + + +void client_printf(const char *message, ...) +{ + va_list va_args; + + va_start(va_args, message); + if (telnetparams.new_socket > 0) + { + vsnprintf(telnetparams.msgbuff,sizeof(telnetparams.msgbuff)-1,message, va_args); + send(telnetparams.new_socket,telnetparams.msgbuff , strlen(telnetparams.msgbuff), MSG_NOSIGNAL); + } + else + { + vprintf(message, va_args); + } + va_end(va_args); + return ; +} + +#define NICE_MAX 19 +#define NICE_MIN -20 +void set_sched(pthread_t tid, int pid, int priority) +{ +int rt; +struct sched_param schedp; +int policy; +char strpolicy[10]; + + +//sched_get_priority_max(SCHED_FIFO) +if (priority < NICE_MIN) + { + policy=SCHED_FIFO; + sprintf(strpolicy,"%s","fifo"); + schedp.sched_priority= NICE_MIN - priority ; + } +else if (priority > NICE_MAX) + { + policy=SCHED_IDLE; + sprintf(strpolicy,"%s","idle"); + schedp.sched_priority=0; + } +else + { + policy=SCHED_OTHER; + sprintf(strpolicy,"%s","other"); + schedp.sched_priority=0; + } +if( tid != 0) + { + rt = pthread_setschedparam(tid, policy, &schedp); + } +else if(pid > 0) + { + rt = sched_setscheduler( pid, policy,&schedp); + } +if (rt != 0) + { + client_printf("Error %i: %s modifying sched param to %s:%i, \n", + errno,strerror(errno),strpolicy,schedp.sched_priority); + } +else + { + client_printf("policy set to %s, priority %i\n",strpolicy,schedp.sched_priority); + } + + + +if ( policy == SCHED_OTHER) + { + if ( tid > 0 && tid != pthread_self()) + { + client_printf("setting nice value using a thread id not implemented....\n"); + } + else if (pid > 0) + { + errno=0; + rt = setpriority(PRIO_PROCESS,pid,priority); + if (rt != 0) + { + client_printf("Error %i: %s calling setpriority, \n",errno,strerror(errno)); + } + else + { + client_printf("nice value set to %i\n",priority); + } + } + } +} + +void set_affinity(pthread_t tid, int pid, int coreid) +{ +cpu_set_t cpuset; +int rt; + + CPU_ZERO(&cpuset); + CPU_SET(coreid, &cpuset); + if (tid > 0) + { + rt = pthread_setaffinity_np((pthread_t)tid, sizeof(cpu_set_t), &cpuset); + } + else if (pid > 0) + { + rt = sched_setaffinity((pid_t)pid, sizeof(cpu_set_t), &cpuset); + } + if (rt != 0) + { + client_printf("Error %i: %s calling , xxx_setaffinity...\n",errno,strerror(errno)); + } + else + { + client_printf("thread %i affinity set to %i\n",(pid==0)?(int)tid:pid,coreid); + } +} +/*------------------------------------------------------------------------------------*/ +/* +function implementing telnet server specific commands, parameters of the +telnet_cmdarray table +*/ + +void redirstd(char *newfname,telnet_printfunc_t prnt ) +{ +FILE *fd; + fd=freopen(newfname, "w", stdout); + if (fd == NULL) + { + prnt("ERROR: stdout redir to %s error %s",strerror(errno)); + } + fd=freopen(newfname, "w", stderr); + if (fd == NULL) + { + prnt("ERROR: stderr redir to %s error %s",strerror(errno)); + } +} +int setoutput(char *buff, int debug, telnet_printfunc_t prnt) +{ + +char cmds[TELNET_MAX_MSGLENGTH/TELNET_CMD_MAXSIZE][TELNET_CMD_MAXSIZE]; +char *logfname; +char stdout_str[64]; + + +#define LOGFILE "logfile.log" +memset(cmds,0,sizeof(cmds)); +sscanf(buff,"%9s %32s %9s %9s %9s", cmds[0],cmds[1],cmds[2],cmds[3],cmds[4] ); +if (strncasecmp(cmds[0],"here",4) == 0) + { + fflush(stdout); + sprintf(stdout_str,"/proc/%i/fd/%i",getpid(),telnetparams.new_socket); + dup2(telnetparams.new_socket,fileno(stdout)); +// freopen(stdout_str, "w", stdout); +// freopen(stdout_str, "w", stderr); + dup2(telnetparams.new_socket,fileno(stderr)); + prnt("Log output redirected to this terminal (%s)\n",stdout_str); + } +if (strncasecmp(cmds[0],"file",4) == 0) + { + if (cmds[1][0] == 0) + logfname=LOGFILE; + else + logfname=cmds[1]; + fflush(stdout); + redirstd(logfname,prnt); + + } +if (strncasecmp(cmds[0],"off",3) == 0) + { + fflush(stdout); + redirstd("/dev/tty",prnt); + } + +return CMDSTATUS_FOUND; +} /* setoutput */ + +int setparam(char *buff, int debug, telnet_printfunc_t prnt) +{ +char cmds[TELNET_MAX_MSGLENGTH/TELNET_CMD_MAXSIZE][TELNET_CMD_MAXSIZE]; + + +memset(cmds,0,sizeof(cmds)); +sscanf(buff,"%9s %9s %9s %9s %9s", cmds[0],cmds[1],cmds[2],cmds[3],cmds[4] ); +if (strncasecmp(cmds[0],"prio",4) == 0) + { + pthread_attr_t attr; + int prio; + prio=(int)strtol(cmds[1],NULL,0); + if (errno == ERANGE) + return CMDSTATUS_VARNOTFOUND; + telnetparams.priority = prio; + set_sched(pthread_self(),0,prio); + return CMDSTATUS_FOUND; + } +if (strncasecmp(cmds[0],"aff",3) == 0) + { + int aff; + aff=(int)strtol(cmds[1],NULL,0); + if (errno == ERANGE) + return CMDSTATUS_VARNOTFOUND; + set_affinity(pthread_self(),0,aff); + return CMDSTATUS_FOUND; + } + +return CMDSTATUS_NOTFOUND; +} /* setparam */ +/*-------------------------------------------------------------------------------------------------------*/ +/* +generic commands available for all modules loaded by the server +*/ + +int setgetvar(int moduleindex,char getorset,char *params) +{ +int n,i; +char varname[TELNET_CMD_MAXSIZE]; +char varval[TELNET_CMD_MAXSIZE]; + + memset(varname,0,sizeof(varname)); + memset(varval,0,sizeof(varval)); + n = sscanf(params,"%s %s",varname,varval); + for ( i=0 ; telnetparams.CmdParsers[moduleindex].var[i].varvalptr != NULL ; i++) + { + if ( strncasecmp(telnetparams.CmdParsers[moduleindex].var[i].varname,varname,strlen(telnetparams.CmdParsers[moduleindex].var[i].varname)) == 0) + { + if (n > 0 && (getorset == 'g' || getorset == 'G')) + { + client_printf("%s, %s = ", telnetparams.CmdParsers[moduleindex].module, + telnetparams.CmdParsers[moduleindex].var[i].varname ); + switch(telnetparams.CmdParsers[moduleindex].var[i].vartype) + { + case TELNET_VARTYPE_INT32: + client_printf("%i\n",*(int *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr)); + break; + case TELNET_VARTYPE_INT16: + client_printf("%hi\n",*(short *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr)); + break; + case TELNET_VARTYPE_DOUBLE: + client_printf("%g\n",*(double *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr)); + break; + case TELNET_VARTYPE_PTR: + client_printf("0x%08x\n",*((unsigned int *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr))); + break; + default: + client_printf("unknown type\n"); + break; + } + } + if (n > 1 && (getorset == 's' || getorset == 'S')) + { + client_printf("%s, %s set to \n", telnetparams.CmdParsers[moduleindex].module, + telnetparams.CmdParsers[moduleindex].var[i].varname); + + switch(telnetparams.CmdParsers[moduleindex].var[i].vartype) + { + case TELNET_VARTYPE_INT32: + *(int *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr) = (int)strtol(varval,NULL,0); + client_printf("%i\n",*(int *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr)); + break; + case TELNET_VARTYPE_INT16: + *(short *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr) = (short)strtol(varval,NULL,0); + client_printf("%hi\n",*(short *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr)); + break; + case TELNET_VARTYPE_DOUBLE: + *(double *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr) = strtod(varval,NULL); + client_printf("%g\n",*(double *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr)); + break; + default: + client_printf("unknown type\n"); + break; + } + } + } + } +return CMDSTATUS_VARNOTFOUND; +} +/*----------------------------------------------------------------------------------------------------*/ +char *get_time(char *buff,int bufflen) +{ + +struct tm tmstruct; +time_t now = time (0); +strftime (buff, bufflen, "%Y-%m-%d %H:%M:%S.000", localtime_r(&now,&tmstruct)); +return buff; +} + +int process_command(char *buf) +{ +int i,j,k; +char modulename[TELNET_CMD_MAXSIZE]; +char cmd[TELNET_CMD_MAXSIZE]; +char cmdb[TELNET_MAX_MSGLENGTH]; +char *bufbck; +int rt; + +memset(modulename,0,sizeof(modulename)); +memset(cmd,0,sizeof(cmd)); +memset(cmdb,0,sizeof(cmdb)); +if (strncasecmp(buf,"ex",2) == 0) + return CMDSTATUS_EXIT; + +if (strncasecmp(buf,"help",4) == 0) + { + for (i=0; telnetparams.CmdParsers[i].var != NULL && telnetparams.CmdParsers[i].cmd != NULL; i++) + { + client_printf(" module %i = %s:\n",i,telnetparams.CmdParsers[i].module); + for(j=0; telnetparams.CmdParsers[i].var[j].varvalptr != NULL ; j++) + { + client_printf(" %s [get set] %s \n", + telnetparams.CmdParsers[i].module, telnetparams.CmdParsers[i].var[j].varname); + } + for(j=0; telnetparams.CmdParsers[i].cmd[j].cmdfunc != NULL ; j++) + { + client_printf(" %s %s %s\n", + telnetparams.CmdParsers[i].module,telnetparams.CmdParsers[i].cmd[j].cmdname, + telnetparams.CmdParsers[i].cmd[j].helpstr); + } + } + return CMDSTATUS_FOUND; + } + +memset(modulename,0,sizeof(modulename)); +memset(cmd,0,sizeof(cmd)); +memset(cmdb,0,sizeof(cmdb)); +bufbck=strdup(buf); +rt=CMDSTATUS_NOTFOUND; +j = sscanf(buf,"%9s %9s %[^\t\n]",modulename,cmd,cmdb); +if (telnetparams.telnetdbg > 0) + printf("process_command: %i words, module=%s cmd=%s, parameters= %s\n",j,modulename,cmd,cmdb); +for (i=0; j>=2 && telnetparams.CmdParsers[i].var != NULL && telnetparams.CmdParsers[i].cmd != NULL; i++) + { + if ( (strncasecmp(telnetparams.CmdParsers[i].module,modulename,strlen(telnetparams.CmdParsers[i].module)) == 0)) + { + if (strncasecmp(cmd,"getall",7) == 0 ) + { + for(j=0; telnetparams.CmdParsers[i].var[j].varvalptr != NULL ; j++) + { + setgetvar(i,'g',telnetparams.CmdParsers[i].var[j].varname); + } + rt= CMDSTATUS_FOUND; + } + else if (strncasecmp(cmd,"get",3) == 0 || strncasecmp(cmd,"set",3) == 0) + { + rt= setgetvar(i,cmd[0],cmdb); + } + else + { + for (k=0 ; telnetparams.CmdParsers[i].cmd[k].cmdfunc != NULL ; k++) + { + if (strncasecmp(cmd, telnetparams.CmdParsers[i].cmd[k].cmdname,sizeof(telnetparams.CmdParsers[i].cmd[k].cmdname)) == 0) + { + telnetparams.CmdParsers[i].cmd[k].cmdfunc(cmdb, telnetparams.telnetdbg, client_printf); + rt= CMDSTATUS_FOUND; + } + } /* for k */ + }/* else */ + }/* strncmp: module name test */ + else if (strncasecmp(modulename,"loop",4) == 0 ) + { + int lc; + int f = fcntl(telnetparams.new_socket,F_GETFL); + fcntl (telnetparams.new_socket, F_SETFL, O_NONBLOCK | f); + for(lc=0; lc 0 ) + { + break; + } + } + fcntl (telnetparams.new_socket, F_SETFL, f); + rt= CMDSTATUS_FOUND; + } /* loop */ + } /* for i */ +free(bufbck); +return rt; +} + +void run_telnetsrv(void) +{ +int sock; +struct sockaddr_in name; +char buf[TELNET_MAX_MSGLENGTH]; +struct sockaddr cli_addr; +unsigned int cli_len = sizeof(cli_addr); +int readc , filled; + +int status; +int optval = 1; + +pthread_setname_np(pthread_self(), "telnet"); +set_sched(pthread_self(),0,telnetparams.priority); +sock = socket(AF_INET, SOCK_STREAM, 0); +if (sock < 0) + fprintf(stderr,"[TELNETSRV] Error %s on socket call\n",strerror(errno)); + +setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval); +name.sin_family = AF_INET; +if (telnetparams.listenaddr == 0) + name.sin_addr.s_addr = INADDR_ANY; +else + name.sin_addr.s_addr = telnetparams.listenaddr; +name.sin_port = htons((unsigned short)(telnetparams.listenport)); + +if(bind(sock, (void*) &name, sizeof(name))) + fprintf(stderr,"[TELNETSRV] Error %s on bind call\n",strerror(errno)); +if(listen(sock, 1) == -1) + fprintf(stderr,"[TELNETSRV] Error %s on listen call\n",strerror(errno)); + + + +printf("\nInitializing telnet server...\n"); +while( (telnetparams.new_socket = accept(sock, &cli_addr, &cli_len)) ) + { + printf("[TELNETSRV] Telnet client connected....\n"); + + + if(telnetparams.new_socket < 0) + fprintf(stderr,"[TELNETSRV] Error %s on accept call\n",strerror(errno)); + + while(telnetparams.new_socket>0) + { + filled = 0; + memset(buf,0,sizeof(buf)); + while(filled < ( TELNET_MAX_MSGLENGTH-1)) + { + readc = recv(telnetparams.new_socket, buf+filled, TELNET_MAX_MSGLENGTH-filled-1, 0); + if(!readc) + break; + filled += readc; + if(buf[filled-1] == '\n') + { + buf[filled-1] = 0; + + break; + } + } + if(!readc) + { + printf ("[TELNETSRV] Telnet Client disconnected.\n"); + break; + } + if (telnetparams.telnetdbg > 0) + printf("[TELNETSRV] Command received: readc %i filled %i %s\n", readc, filled ,buf); + if (strlen(buf) >= 2 ) + { + status=process_command(buf); + } + else + status=CMDSTATUS_NOCMD; + + if (status != CMDSTATUS_EXIT) + { + if (status == CMDSTATUS_NOTFOUND) + { + char msg[TELNET_MAX_MSGLENGTH + 50]; + sprintf(msg,"Error: \n %s\n is not a softmodem command\n",buf); + send(telnetparams.new_socket, msg, strlen(msg), MSG_NOSIGNAL); + } + send(telnetparams.new_socket, TELNET_PROMPT, sizeof(TELNET_PROMPT), MSG_NOSIGNAL); + } + else + { + printf ("[TELNETSRV] Closing telnet connection...\n"); + break; + } + } + + close(telnetparams.new_socket); + printf ("[TELNETSRV] Telnet server waitting for connection...\n"); + } +close(sock); +return; +} + +/*------------------------------------------------------------------------------------------------*/ +/* set_telnetmodule loads the commands delivered with the telnet server + * + * + * +*/ +void exec_moduleinit(char *modname) +{ +void (*fptr)(); +char initfunc[TELNET_CMD_MAXSIZE+9]; + + if (strlen(modname) > TELNET_CMD_MAXSIZE) + { + fprintf(stderr,"[TELNETSRV] module %s not loaded, name exceeds the %i size limit\n", + modname, TELNET_CMD_MAXSIZE); + return; + } + sprintf(initfunc,"add_%s_cmds",modname); + fptr = dlsym(RTLD_DEFAULT,initfunc); + if ( fptr != NULL) + { + fptr(); + } + else + { + fprintf(stderr,"[TELNETSRV] couldn't find %s for module %s \n",initfunc,modname); + } +} + +int add_embeddedmodules() +{ + + + + + for(int i=0; i " +#define TELNET_MAXCMD 20 +#define TELNET_CMD_MAXSIZE 10 +#define TELNET_HELPSTR_SIZE 80 + +/* status return by the command parser after it analysed user input */ +#define CMDSTATUS_NOCMD 0 +#define CMDSTATUS_EXIT 1 +#define CMDSTATUS_FOUND 2 +#define CMDSTATUS_VARNOTFOUND 3 +#define CMDSTATUS_NOTFOUND 4 + +/*----------------------------------------------------------------------------*/ +/* structure to be used when adding a module to the telnet server */ +/* This is the second parameter of the add_telnetcmd function, which can be used */ +/* to add a set of new command to the telnet server shell */ +typedef void(*telnet_printfunc_t)(const char* format, ...); +typedef int(*cmdfunc_t)(char*, int, telnet_printfunc_t prnt); + +typedef struct cmddef { + char cmdname[TELNET_CMD_MAXSIZE]; + char helpstr[TELNET_HELPSTR_SIZE]; + cmdfunc_t cmdfunc; +} telnetshell_cmddef_t; + +/*----------------------------------------------------------------------------*/ +/*structure to be used when adding a module to the telnet server */ +/* This is the first parameter of the add_telnetcmd function, which can be used */ +/* to add a set of new variables which can be got/set from the telnet server shell */ +#define TELNET_VARTYPE_INT32 1 +#define TELNET_VARTYPE_INT16 2 +#define TELNET_VARTYPE_INT64 3 +#define TELNET_VARTYPE_STRING 4 +#define TELNET_VARTYPE_DOUBLE 5 +#define TELNET_VARTYPE_PTR 6 +typedef struct variabledef { + char varname[TELNET_CMD_MAXSIZE]; + char vartype; + void *varvalptr; +} telnetshell_vardef_t; + + + +/*----------------------------------------------------------------------------*/ +/* internal structure definitions */ +/* cmdparser_t is used to store all modules which have been added to the telnet server. */ +/* Each time the add_telnetcmd function is used, the internal array cmdparser_t[] of the */ +/* telnet server is populated with the new commands and variables */ +typedef struct cmdparser { + char module[TELNET_CMD_MAXSIZE]; // module name = first token of the telnet shell command + telnetshell_cmddef_t *cmd; // array of functions added to the shell + telnetshell_vardef_t *var; // array of variables added to the shell +} cmdparser_t; + +/* telnetsrv_params_t is an internal structure storing all the current parameters and */ +/* global variables used by the telnet server */ +typedef struct { + pthread_t telnet_pthread; // thread id of the telnet server + int telnetdbg; // debug level of the server + int priority; // server running priority + int new_socket; // socket of the client connection + int logfilefd; // file id of the log file when log output is redirected to a file + int saved_stdout; // file id of the previous stdout, used to be able to restore original stdout + cmdparser_t CmdParsers[TELNET_MAXCMD]; // array of registered modules. + char msgbuff[TELNET_MAX_MSGLENGTH]; // internal buffer of the client_printf function which is used to print to the client terminal */ + unsigned int listenport; // ip port the telnet server is listening on + unsigned int listenaddr; // ip address the telnet server is listening on + unsigned int loopcount; // loop command param: number of loop iteration + unsigned int loopdelay; // loop command param: delay in ms between 2 iterations + unsigned int phyprntbuff_size; // for phy module, dump_eNB_stats function buffer size +} telnetsrv_params_t; + + + +typedef int(*addcmdfunc_t)(char*, telnetshell_vardef_t*, telnetshell_cmddef_t*); + +typedef void(*settelnetmodule_t)(char *name, void *ptr); + +/*-------------------------------------------------------------------------------------------*/ +/* +VT escape sequence definition, for smarter display.... +*/ + +#define ESC "\x1b" +#define CSI "\x1b[" +#define BOLD "\x1b[1m" +#define RED "\x1b[31m" +#define GREEN "\x1b[32m" +#define BLUE "\x1b[34m" +#define MAGENTA "\x1b[35m" +#define CYAN "\x1b[36m" +#define STDFMT "\x1b[0m" + +/*---------------------------------------------------------------------------------------------*/ +#ifdef TELNETSERVERCODE +int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmddef_t *cmd); +void set_sched(pthread_t tid, int pid,int priority); +void set_affinity(pthread_t tid, int pid, int coreid); +extern int get_phybsize(); +#endif +#endif diff --git a/common/utils/telnetsrv/telnetsrv_phycmd.c b/common/utils/telnetsrv/telnetsrv_phycmd.c new file mode 100644 index 0000000000..6867d5deee --- /dev/null +++ b/common/utils/telnetsrv/telnetsrv_phycmd.c @@ -0,0 +1,142 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/utils/telnetsrv/telnetsrv_phycmd.c + * \brief: implementation of telnet commands related to softmodem linux process + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#define _GNU_SOURCE +#include +#include + + +#define TELNETSERVERCODE +#include "telnetsrv.h" +#define TELNETSRV_PHYCMD_MAIN +#include "telnetsrv_phycmd.h" +char *prnbuff; +extern int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length); + +void init_phytelnet() +{ +prnbuff=malloc(get_phybsize() ); +if (prnbuff == NULL) + { + fprintf(stderr,"Error %s on malloc in init_phytelnet()\n",strerror(errno)); + } +} + +void display_uestatshead( telnet_printfunc_t prnt) +{ +prnt("cc ue rnti Dmcs Umcs tao tau Dbr Dtb \n"); +} + +void dump_uestats(int debug, telnet_printfunc_t prnt, uint8_t prntflag) +{ + +int p; + + p=dump_eNB_l2_stats( prnbuff, 0); + if(prntflag>=1) + prnt("%s\n",prnbuff); + if(debug>=1) + prnt("%i bytes printed\n",p); + + +} + +void display_uestats(int debug, telnet_printfunc_t prnt, int ue) +{ + for (int cc=0; cc<1 ; cc++) + { + + + } +} + +void display_phycounters(char *buf, int debug, telnet_printfunc_t prnt) +{ + prnt(" DLSCH kb DLSCH kb/s\n"); + + dump_uestats(debug, prnt,0); + +} + +int dump_phyvars(char *buf, int debug, telnet_printfunc_t prnt) +{ + + + + if (debug > 0) + prnt("phy interface module received %s\n",buf); + if (strcasestr(buf,"phycnt") != NULL) + { + display_phycounters(buf, debug, prnt); + } + if (strcasestr(buf,"uestat") != NULL) + { + char *cptr=strcasestr(buf+sizeof("uestat"),"UE"); + display_uestatshead(prnt); + if (cptr != NULL) + { + int ueidx = strtol( cptr+sizeof("UE"), NULL, 10); + if (ueidx < NUMBER_OF_UE_MAX && ueidx >= 0) + { + display_uestats(debug, prnt,ueidx); + } + } /* if cptr != NULL */ + else + { + for (int ue=0; ue]", dump_phyvars}, + + {"","",NULL}, +}; + + +/*-------------------------------------------------------------------------------------*/ +void add_phy_cmds() +{ + + init_phytelnet(); + add_telnetcmd("phy", phy_vardef, phy_cmdarray); +} diff --git a/common/utils/telnetsrv/telnetsrv_phycmd.h b/common/utils/telnetsrv/telnetsrv_phycmd.h new file mode 100644 index 0000000000..3922bda727 --- /dev/null +++ b/common/utils/telnetsrv/telnetsrv_phycmd.h @@ -0,0 +1,65 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/utils/telnetsrv_proccmd.h + * \brief: Include file defining telnet commands related to softmodem linux process + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ + +#ifdef TELNETSRV_PHYCMD_MAIN + +#include "UTIL/LOG/log.h" + + +#include "openair1/PHY/extern.h" + + +#define TELNETVAR_PHYCC0 0 +#define TELNETVAR_PHYCC1 1 + +telnetshell_vardef_t phy_vardef[] = { +{"phycc1",TELNET_VARTYPE_PTR,NULL}, +{"phycc2",TELNET_VARTYPE_PTR,NULL}, +//{"iqmax",TELNET_VARTYPE_INT16,NULL}, +//{"iqmin",TELNET_VARTYPE_INT16,NULL}, +//{"loglvl",TELNET_VARTYPE_INT32,NULL}, +//{"sndslp",TELNET_VARTYPE_INT32,NULL}, +//{"rxrescale",TELNET_VARTYPE_INT32,NULL}, +//{"txshift",TELNET_VARTYPE_INT32,NULL}, +//{"rachemin",TELNET_VARTYPE_INT32,NULL}, +//{"rachdmax",TELNET_VARTYPE_INT32,NULL}, +{"",0,NULL} +}; + +#else + +extern void add_phy_cmds(); + +#endif + +/*-------------------------------------------------------------------------------------*/ + diff --git a/common/utils/telnetsrv/telnetsrv_proccmd.c b/common/utils/telnetsrv/telnetsrv_proccmd.c new file mode 100644 index 0000000000..82c4549fae --- /dev/null +++ b/common/utils/telnetsrv/telnetsrv_proccmd.c @@ -0,0 +1,262 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/utils/telnetsrv/telnetsrv_proccmd.c + * \brief: implementation of telnet commands related to this linux process + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define READCFG_DYNLOAD + +#define TELNETSERVERCODE +#include "telnetsrv.h" +#define TELNETSRV_PROCCMD_MAIN +#include "log.h" +#include "log_extern.h" +#include "telnetsrv_proccmd.h" + +void decode_procstat(char *record, int debug, telnet_printfunc_t prnt) +{ +char prntline[160]; +char *procfile_fiels; +char *strtokptr; +char *lptr; +int fieldcnt; +char toksep[2]; + + fieldcnt=0; + procfile_fiels =strtok_r(record," ",&strtokptr); + lptr= prntline; +/*http://man7.org/linux/man-pages/man5/proc.5.html gives the structure of the stat file */ + + while( procfile_fiels != NULL && fieldcnt < 42) + { + if (strlen(procfile_fiels) == 0) + continue; + fieldcnt++; + sprintf(toksep," "); + switch(fieldcnt) + { + case 1: /* id */ + lptr+=sprintf(lptr,"%9.9s ",procfile_fiels); + sprintf(toksep,")"); + break; + case 2: /* name */ + lptr+=sprintf(lptr,"%20.20s ",procfile_fiels+1); + break; + case 3: //thread state + lptr+=sprintf(lptr," %c ",procfile_fiels[0]); + break; + case 14: //time in user mode + case 15: //time in kernel mode + lptr+=sprintf(lptr,"%9.9s ",procfile_fiels); + break; + case 18: //priority + case 19: //nice + lptr+=sprintf(lptr,"%3.3s ",procfile_fiels); + break; + case 23: //vsize + lptr+=sprintf(lptr,"%9.9s ",procfile_fiels); + break; + case 39: //processor + lptr+=sprintf(lptr," %2.2s ",procfile_fiels); + break; + case 41: //policy + lptr+=sprintf(lptr,"%3.3s ",procfile_fiels); + break; + default: + break; + }/* switch on fieldcnr */ + procfile_fiels =strtok_r(NULL,toksep,&strtokptr); + } /* while on proc_fields != NULL */ + prnt("%s\n",prntline); +} /*decode_procstat */ + +void read_statfile(char *fname,int debug, telnet_printfunc_t prnt) +{ +FILE *procfile; +char arecord[1024]; + + procfile=fopen(fname,"r"); + if (procfile == NULL) + { + prnt("Error: Couldn't open %s %i %s\n",fname,errno,strerror(errno)); + return; + } + if ( fgets(arecord,sizeof(arecord),procfile) == NULL) + { + prnt("Error: Nothing read from %s %i %s\n",fname,errno,strerror(errno)); + fclose(procfile); + return; + } + fclose(procfile); + decode_procstat(arecord, debug, prnt); +} + +void print_threads(char *buf, int debug, telnet_printfunc_t prnt) +{ +char aname[256]; + +DIR *proc_dir; +struct dirent *entry; + +int rt; + + prnt(" id name state USRmod KRNmod prio nice vsize proc pol \n\n"); + snprintf(aname, sizeof(aname), "/proc/%d/stat", getpid()); + read_statfile(aname,debug,prnt); + prnt("\n"); + snprintf(aname, sizeof(aname), "/proc/%d/task", getpid()); + proc_dir = opendir(aname); + if (proc_dir == NULL) + { + prnt("Error: Couldn't open %s %i %s\n",aname,errno,strerror(errno)); + return; + } + + while ((entry = readdir(proc_dir)) != NULL) + { + if(entry->d_name[0] == '.') + continue; + snprintf(aname, sizeof(aname), "/proc/%d/task/%s/stat", getpid(),entry->d_name); + read_statfile(aname,debug,prnt); + } /* while entry != NULL */ + closedir(proc_dir); +} /* print_threads */ + + +int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt) +{ +extern log_t *g_log; + + if (debug > 0) + prnt(" proccmd_show received %s\n",buf); + if (strcasestr(buf,"thread") != NULL) + { + print_threads(buf,debug,prnt); + } + if (strcasestr(buf,"loglvl") != NULL) { + for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++){ + prnt("\t%s:\t%s\t%s\n",g_log->log_component[i].name, map_int_to_str(log_verbosity_names,g_log->log_component[i].flag), + map_int_to_str(log_level_names,g_log->log_component[i].level)); + } + } + return 0; +} + +int proccmd_thread(char *buf, int debug, telnet_printfunc_t prnt) +{ +int bv1,bv2; +int res; +char sv1[64]; +char tname[32]; + bv1=0; + bv2=0; + sv1[0]=0; + if (debug > 0) + prnt("proccmd_thread received %s\n",buf); + res=sscanf(buf,"%i %9s %i",&bv1,sv1,&bv2); + if (debug > 0) + prnt(" proccmd_thread: %i params = %i,%s,%i\n",res,bv1,sv1,bv2); + if(res != 3) + { + prnt("softmodem thread needs 3 params, %i received\n",res); + return 0; + } + + + if (strcasestr(sv1,"prio") != NULL) + { + set_sched(0,bv1, bv2); + } + else if (strcasestr(sv1,"aff") != NULL) + { + set_affinity(0,bv1, bv2); + } + else + { + prnt("%s is not a valid thread command\n",sv1); + } + return 0; +} +int proccmd_exit(char *buf, int debug, telnet_printfunc_t prnt) +{ +extern void exit_fun(const char* s); + + if (debug > 0) + prnt("process module received %s\n",buf); + + exit_fun("telnet server received exit command\n"); + return 0; +} + +int proccmd_log(char *buf, int debug, telnet_printfunc_t prnt) +{ +int idx1=0; +int idx2=NUM_LOG_LEVEL-1; +int s = sscanf(buf,"%*s %i-%i",&idx1,&idx2); + + if (debug > 0) + prnt("process module received %s\n",buf); + + if (strcasestr(buf,"enable") != NULL) + { + set_glog_onlinelog(1); + } + if (strcasestr(buf,"disable") != NULL) + { + set_glog_onlinelog(0); + } + if (strcasestr(buf,"show") != NULL) + { + proccmd_show("loglvl",debug,prnt); + } + return 0; +} +/*-------------------------------------------------------------------------------------*/ + +void add_softmodem_cmds() +{ + add_telnetcmd("softmodem",proc_vardef,proc_cmdarray); +} diff --git a/common/utils/telnetsrv/telnetsrv_proccmd.h b/common/utils/telnetsrv/telnetsrv_proccmd.h new file mode 100644 index 0000000000..d7fd0a6e24 --- /dev/null +++ b/common/utils/telnetsrv/telnetsrv_proccmd.h @@ -0,0 +1,57 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file common/utils/telnetsrv/telnetsrv_proccmd.h + * \brief: Include file defining telnet commands related to this linux process + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ +#include +#include "telnetsrv.h" + + +#ifdef TELNETSRV_PROCCMD_MAIN + + +extern int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt); +extern int proccmd_thread(char *buf, int debug, telnet_printfunc_t prnt); +extern int proccmd_exit(char *buf, int debug, telnet_printfunc_t prnt); +extern int proccmd_log(char *buf, int debug, telnet_printfunc_t prnt); +telnetshell_vardef_t proc_vardef[] = { +{"",0,NULL} +}; + +telnetshell_cmddef_t proc_cmdarray[] = { + {"show","loglvl|thread", proccmd_show}, + {"log","[enable,disable]", proccmd_log}, + {"thread"," aff|prio ", proccmd_thread}, + {"exit","", proccmd_exit}, + {"","",NULL}, +}; +#else +extern void add_proccmd_cmds(); +#endif /* TELNETSRV_PROCCMD_MAIN */ + diff --git a/common/utils/time_utils.h b/common/utils/time_utils.h new file mode 100644 index 0000000000..ee82c8cf95 --- /dev/null +++ b/common/utils/time_utils.h @@ -0,0 +1,23 @@ +#ifndef _TIME_UTILS_H_ +#define _TIME_UTILS_H_ + +#include +#include + +static inline int64_t clock_difftime_ns(struct timespec start, struct timespec end) +{ + struct timespec temp; + int64_t temp_ns; + + if ((end.tv_nsec-start.tv_nsec)<0) { + temp.tv_sec = end.tv_sec-start.tv_sec-1; + temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; + } else { + temp.tv_sec = end.tv_sec-start.tv_sec; + temp.tv_nsec = end.tv_nsec-start.tv_nsec; + } + temp_ns = (int64_t)(temp.tv_sec) * (int64_t)1000000000 + (temp.tv_nsec); + return temp_ns; +} + +#endif /* _TIME_UTILS_H_ */ diff --git a/common/utils/utils.c b/common/utils/utils.c new file mode 100644 index 0000000000..a807a27096 --- /dev/null +++ b/common/utils/utils.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include "utils.h" + +void *calloc_or_fail(size_t size) { + void *ptr = calloc(1, size); + if (ptr == NULL) { + fprintf(stderr, "[UE] Failed to calloc %zu bytes", size); + exit(EXIT_FAILURE); + } + return ptr; +} + +void *malloc_or_fail(size_t size) { + void *ptr = malloc(size); + if (ptr == NULL) { + fprintf(stderr, "[UE] Failed to malloc %zu bytes", size); + exit(EXIT_FAILURE); + } + return ptr; +} + +/**************************************************************************** + ** ** + ** Name: hex_char_to_hex_value() ** + ** ** + ** Description: Converts an hexadecimal ASCII coded digit into its value. ** + ** ** + ** Inputs: c: A char holding the ASCII coded value ** + ** Others: None ** + ** ** + ** Outputs: None ** + ** Return: Converted value (-1 on error) ** + ** Others: None ** + ** ** + ***************************************************************************/ +int hex_char_to_hex_value (char c) +{ + if (!((c >= 'a' && c <= 'f') || + (c >= 'A' && c <= 'F') || + (c >= '0' && c <= '9'))) + return -1; + + if (c >= 'A') { + /* Remove case bit */ + c &= ~('a' ^ 'A'); + + return (c - 'A' + 10); + } else { + return (c - '0'); + } +} + +/**************************************************************************** + ** ** + ** Name: hex_string_to_hex_value() ** + ** ** + ** Description: Converts an hexadecimal ASCII coded string into its value.** + ** ** + ** Inputs: hex_value: A pointer to the location to store the ** + ** conversion result ** + ** size: The size of hex_value in bytes ** + ** Others: None ** + ** ** + ** Outputs: hex_value: Converted value ** + ** Return: 0 on success, -1 on error ** + ** Others: None ** + ** ** + ***************************************************************************/ +int hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size) +{ + int i; + + if (strlen(hex_string) != size*2) { + fprintf(stderr, "the string '%s' should be of length %d\n", hex_string, size*2); + return -1; + } + + for (i=0; i < size; i++) { + int a = hex_char_to_hex_value(hex_string[2 * i]); + int b = hex_char_to_hex_value(hex_string[2 * i + 1]); + if (a == -1 || b == -1) goto error; + hex_value[i] = (a << 4) | b; + } + return 0; + +error: + fprintf(stderr, "the string '%s' is not a valid hexadecimal string\n", hex_string); + for (i=0; i < size; i++) + hex_value[i] = 0; + return -1; +} + +char *itoa(int i) { + char buffer[64]; + int ret; + + ret = snprintf(buffer, sizeof(buffer), "%d",i); + if ( ret <= 0 ) { + return NULL; + } + + return strdup(buffer); +} + diff --git a/common/utils/utils.h b/common/utils/utils.h new file mode 100644 index 0000000000..cfe3df34b9 --- /dev/null +++ b/common/utils/utils.h @@ -0,0 +1,17 @@ +#ifndef _UTILS_H +#define _UTILS_H + +#include +#include + +void *calloc_or_fail(size_t size); +void *malloc_or_fail(size_t size); + +// Converts an hexadecimal ASCII coded digit into its value. ** +int hex_char_to_hex_value (char c); +// Converts an hexadecimal ASCII coded string into its value.** +int hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size); + +char *itoa(int i); + +#endif diff --git a/maketags b/maketags index ec283c8bec..361adc5d67 100755 --- a/maketags +++ b/maketags @@ -1,3 +1,4 @@ #!/bin/sh echo "building ctags for openair1 and openair2 ..." -ctags -e -R --exclude=openair1/DOCS/ --exclude=openair2/DOCS/ --exclude=openair2/RRC/CELLULAR/ --exclude=openair2/NAS/DRIVER/CELLULAR/ --exclude=openair2/SIMULATION/ --exclude=targets/DOCS/ --exclude=targets/PROJECTS/ openair1 openair2 targets +ctags -e -R --exclude=openair1/DOCS/ --exclude=openair2/DOCS/ --exclude=openair2/RRC/CELLULAR/ --exclude=openair2/NAS/DRIVER/CELLULAR/ --exclude=openair2/SIMULATION/ --exclude=targets/DOCS/ --exclude=targets/PROJECTS/ openair1 openair2 openair3 targets cmake_targets common + diff --git a/nfapi/README b/nfapi/README new file mode 100644 index 0000000000..b2e1321532 --- /dev/null +++ b/nfapi/README @@ -0,0 +1,15 @@ +This directory contains the NFAPI code. + +It comes in two parts: + +1 - open-nFAPI + + This is a clone of the github repository + (https://github.com/cisco/open-nFAPI, + commit b3bc579b1697eab829d5d8a2de59c93a61b88fa4). + The patch open-nfapi.oai.patch has then been applied. + +2 - oai_integration + + This is code written by David Price from Cisco to integrate + open-nFAPI into OpenAirInterface. diff --git a/nfapi/oai_integration/nfapi.c b/nfapi/oai_integration/nfapi.c new file mode 100644 index 0000000000..5a3bc804c1 --- /dev/null +++ b/nfapi/oai_integration/nfapi.c @@ -0,0 +1,51 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include +#include + +void set_thread_priority(int priority) +{ + //printf("%s(priority:%d)\n", __FUNCTION__, priority); + + pthread_attr_t ptAttr; + + struct sched_param schedParam; + schedParam.__sched_priority = priority; //79; + if(sched_setscheduler(0, SCHED_RR, &schedParam) != 0) + { + printf("Failed to set scheduler to SCHED_RR\n"); + } + + if(pthread_attr_setschedpolicy(&ptAttr, SCHED_RR) != 0) + { + printf("Failed to set pthread sched policy SCHED_RR\n"); + } + + pthread_attr_setinheritsched(&ptAttr, PTHREAD_EXPLICIT_SCHED); + + struct sched_param thread_params; + thread_params.sched_priority = 20; + if(pthread_attr_setschedparam(&ptAttr, &thread_params) != 0) + { + printf("failed to set sched param\n"); + } +} diff --git a/nfapi/oai_integration/nfapi_pnf.c b/nfapi/oai_integration/nfapi_pnf.c new file mode 100644 index 0000000000..c63d504e43 --- /dev/null +++ b/nfapi/oai_integration/nfapi_pnf.c @@ -0,0 +1,1625 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include + +#include "debug.h" +#include "nfapi_pnf_interface.h" +#include "nfapi.h" +#include "nfapi_pnf.h" +#include "common/ran_context.h" +//#include "openair1/PHY/vars.h" +extern RAN_CONTEXT_t RC; + +#include +#include +#include +#include +#include +#include +#include + +#include +#include "fapi_stub.h" +//#include "fapi_l1.h" +#include "UTIL/LOG/log.h" +#include "openair2/LAYER2/MAC/proto.h" + +#define NUM_P5_PHY 2 + +#define _GNU_SOURCE + +extern void phy_init_RU(RU_t*); +extern int config_sync_var; + +extern pthread_cond_t nfapi_sync_cond; +extern pthread_mutex_t nfapi_sync_mutex; +extern int nfapi_sync_var; + +extern int sync_var; + +extern void init_eNB_afterRU(void); +extern void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB, int frame, int subframe, eNB_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu); +extern void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, nfapi_ul_config_request_pdu_t *ul_config_pdu, uint16_t frame,uint8_t subframe,uint8_t srs_present); +extern void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, eNB_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t codeword_index, uint8_t *sdu); +extern void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, eNB_rxtx_proc_t *proc, nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu); +extern void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, eNB_rxtx_proc_t *proc, nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu); +extern void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t *sdu); + +extern uint8_t nfapi_mode; + +nfapi_tx_request_pdu_t* tx_request_pdu[1023][10][10]; // [frame][subframe][max_num_pdus] + +uint8_t tx_pdus[32][8][4096]; + + +uint16_t phy_antenna_capability_values[] = { 1, 2, 4, 8, 16 }; + +nfapi_pnf_param_response_t g_pnf_param_resp; + + +nfapi_pnf_p7_config_t *p7_config_g = NULL; + +void* pnf_allocate(size_t size) { + return malloc(size); +} + +void pnf_deallocate(void* ptr) { + free(ptr); +} + + +typedef struct { + //public: + uint8_t enabled; + uint32_t rx_port; + uint32_t tx_port; + //std::string tx_addr; + char tx_addr[80]; +} udp_data; + +typedef struct { + uint16_t index; + uint16_t id; + uint8_t rfs[2]; + uint8_t excluded_rfs[2]; + + udp_data udp; + + char local_addr[80]; + int local_port; + + char* remote_addr; + int remote_port; + + uint8_t duplex_mode; + uint16_t dl_channel_bw_support; + uint16_t ul_channel_bw_support; + uint8_t num_dl_layers_supported; + uint8_t num_ul_layers_supported; + uint16_t release_supported; + uint8_t nmm_modes_supported; + + uint8_t dl_ues_per_subframe; + uint8_t ul_ues_per_subframe; + + uint8_t first_subframe_ind; + + // timing information recevied from the vnf + uint8_t timing_window; + uint8_t timing_info_mode; + uint8_t timing_info_period; + +} phy_info; + +typedef struct { + //public: + uint16_t index; + uint16_t band; + int16_t max_transmit_power; + int16_t min_transmit_power; + uint8_t num_antennas_supported; + uint32_t min_downlink_frequency; + uint32_t max_downlink_frequency; + uint32_t max_uplink_frequency; + uint32_t min_uplink_frequency; +} rf_info; + + +typedef struct { + + int release; + phy_info phys[2]; + rf_info rfs[2]; + + uint8_t sync_mode; + uint8_t location_mode; + uint8_t location_coordinates[6]; + uint32_t dl_config_timing; + uint32_t ul_config_timing; + uint32_t tx_timing; + uint32_t hi_dci0_timing; + + uint16_t max_phys; + uint16_t max_total_bw; + uint16_t max_total_dl_layers; + uint16_t max_total_ul_layers; + uint8_t shared_bands; + uint8_t shared_pa; + int16_t max_total_power; + uint8_t oui; + + uint8_t wireshark_test_mode; + +} pnf_info; + +typedef struct { + uint16_t phy_id; + nfapi_pnf_config_t* config; + phy_info* phy; + nfapi_pnf_p7_config_t* p7_config; +} pnf_phy_user_data_t; + +static pnf_info pnf; +static pthread_t pnf_start_pthread; + +extern void nfapi_log(char *file, char *func, int line, int comp, int level, const char* format, va_list args); + +void pnf_nfapi_trace(nfapi_trace_level_t nfapi_level, const char* message, ...) { + va_list args; + int oai_level; + + if (nfapi_level==NFAPI_TRACE_ERROR) { + oai_level = LOG_ERR; + } else if (nfapi_level==NFAPI_TRACE_WARN) { + oai_level = LOG_WARNING; + } else if (nfapi_level==NFAPI_TRACE_NOTE) { + oai_level = LOG_INFO; + } else if (nfapi_level==NFAPI_TRACE_INFO) { + oai_level = LOG_DEBUG; + } else { + oai_level = LOG_ERR; + } + + va_start(args, message); + nfapi_log("FILE>", "FUNC", 999, PHY, oai_level, message, args); + va_end(args); +} + +void pnf_set_thread_priority(int priority) { + + pthread_attr_t ptAttr; + + struct sched_param schedParam; + schedParam.__sched_priority = priority; + if(sched_setscheduler(0, SCHED_RR, &schedParam) != 0) { + printf("failed to set SCHED_RR\n"); + } + + if(pthread_attr_setschedpolicy(&ptAttr, SCHED_RR) != 0) { + printf("failed to set pthread SCHED_RR %d\n", errno); + } + + pthread_attr_setinheritsched(&ptAttr, PTHREAD_EXPLICIT_SCHED); + + struct sched_param thread_params; + thread_params.sched_priority = 20; + if(pthread_attr_setschedparam(&ptAttr, &thread_params) != 0) { + printf("failed to set sched param\n"); + } +} + +void* pnf_p7_thread_start(void* ptr) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] P7 THREAD %s\n", __FUNCTION__); + + pnf_set_thread_priority(79); + + nfapi_pnf_p7_config_t* config = (nfapi_pnf_p7_config_t*)ptr; + nfapi_pnf_p7_start(config); + + return 0; +} + +int pnf_param_request(nfapi_pnf_config_t* config, nfapi_pnf_param_request_t* req) { + + printf("[PNF] pnf param request\n"); + + nfapi_pnf_param_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_PARAM_RESPONSE; + resp.error_code = NFAPI_MSG_OK; + + pnf_info* pnf = (pnf_info*)(config->user_data); + + resp.pnf_param_general.tl.tag = NFAPI_PNF_PARAM_GENERAL_TAG; + resp.pnf_param_general.nfapi_sync_mode = pnf->sync_mode; + resp.pnf_param_general.location_mode = pnf->location_mode; + resp.pnf_param_general.dl_config_timing = pnf->dl_config_timing; + resp.pnf_param_general.tx_timing = pnf->tx_timing; + resp.pnf_param_general.ul_config_timing = pnf->ul_config_timing; + resp.pnf_param_general.hi_dci0_timing = pnf->hi_dci0_timing; + resp.pnf_param_general.maximum_number_phys = pnf->max_phys; + resp.pnf_param_general.maximum_total_bandwidth = pnf->max_total_bw; + resp.pnf_param_general.maximum_total_number_dl_layers = pnf->max_total_dl_layers; + resp.pnf_param_general.maximum_total_number_ul_layers = pnf->max_total_ul_layers; + resp.pnf_param_general.shared_bands = pnf->shared_bands; + resp.pnf_param_general.shared_pa = pnf->shared_pa; + resp.pnf_param_general.maximum_total_power = pnf->max_total_power; + + resp.pnf_phy.tl.tag = NFAPI_PNF_PHY_TAG; + resp.pnf_phy.number_of_phys = 1; + + for(int i = 0; i < 1; ++i) { + resp.pnf_phy.phy[i].phy_config_index = pnf->phys[i].index; + resp.pnf_phy.phy[i].downlink_channel_bandwidth_supported = pnf->phys[i].dl_channel_bw_support; + resp.pnf_phy.phy[i].uplink_channel_bandwidth_supported = pnf->phys[i].ul_channel_bw_support; + resp.pnf_phy.phy[i].number_of_dl_layers_supported = pnf->phys[i].num_dl_layers_supported; + resp.pnf_phy.phy[i].number_of_ul_layers_supported = pnf->phys[i].num_ul_layers_supported; + resp.pnf_phy.phy[i].maximum_3gpp_release_supported = pnf->phys[i].release_supported; + resp.pnf_phy.phy[i].nmm_modes_supported = pnf->phys[i].nmm_modes_supported; + + resp.pnf_phy.phy[i].number_of_rfs = 2; + for(int j = 0; j < 1; ++j) { + resp.pnf_phy.phy[i].rf_config[j].rf_config_index = pnf->phys[i].rfs[j]; + } + + resp.pnf_phy.phy[i].number_of_rf_exclusions = 0; + for(int j = 0; j < 0; ++j) { + resp.pnf_phy.phy[i].excluded_rf_config[j].rf_config_index = pnf->phys[i].excluded_rfs[j]; + } + } + + resp.pnf_rf.tl.tag = NFAPI_PNF_RF_TAG; + resp.pnf_rf.number_of_rfs = 2; + + for(int i = 0; i < 2; ++i) { + resp.pnf_rf.rf[i].rf_config_index = pnf->rfs[i].index; + resp.pnf_rf.rf[i].band = pnf->rfs[i].band; + resp.pnf_rf.rf[i].maximum_transmit_power = pnf->rfs[i].max_transmit_power; + resp.pnf_rf.rf[i].minimum_transmit_power = pnf->rfs[i].min_transmit_power; + resp.pnf_rf.rf[i].number_of_antennas_suppported = pnf->rfs[i].num_antennas_supported; + resp.pnf_rf.rf[i].minimum_downlink_frequency = pnf->rfs[i].min_downlink_frequency; + resp.pnf_rf.rf[i].maximum_downlink_frequency = pnf->rfs[i].max_downlink_frequency; + resp.pnf_rf.rf[i].minimum_uplink_frequency = pnf->rfs[i].min_uplink_frequency; + resp.pnf_rf.rf[i].maximum_uplink_frequency = pnf->rfs[i].max_uplink_frequency; + } + + if(pnf->release >= 10) { + resp.pnf_phy_rel10.tl.tag = NFAPI_PNF_PHY_REL10_TAG; + resp.pnf_phy_rel10.number_of_phys = 1; + + for(int i = 0; i < 1; ++i) + { + resp.pnf_phy_rel10.phy[i].phy_config_index = pnf->phys[i].index; + resp.pnf_phy_rel10.phy[i].transmission_mode_7_supported = 0; + resp.pnf_phy_rel10.phy[i].transmission_mode_8_supported = 1; + resp.pnf_phy_rel10.phy[i].two_antenna_ports_for_pucch = 0; + resp.pnf_phy_rel10.phy[i].transmission_mode_9_supported = 1; + resp.pnf_phy_rel10.phy[i].simultaneous_pucch_pusch = 0; + resp.pnf_phy_rel10.phy[i].four_layer_tx_with_tm3_and_tm4 = 1; + } + } + + if(pnf->release >= 11) { + resp.pnf_phy_rel11.tl.tag = NFAPI_PNF_PHY_REL11_TAG; + resp.pnf_phy_rel11.number_of_phys = 1; + + for(int i = 0; i < 1; ++i) { + resp.pnf_phy_rel11.phy[i].phy_config_index = pnf->phys[i].index; + resp.pnf_phy_rel11.phy[i].edpcch_supported = 0; + resp.pnf_phy_rel11.phy[i].multi_ack_csi_reporting = 1; + resp.pnf_phy_rel11.phy[i].pucch_tx_diversity = 0; + resp.pnf_phy_rel11.phy[i].ul_comp_supported = 1; + resp.pnf_phy_rel11.phy[i].transmission_mode_5_supported = 0; + } + } + + if(pnf->release >= 12) { + resp.pnf_phy_rel12.tl.tag = NFAPI_PNF_PHY_REL12_TAG; + resp.pnf_phy_rel12.number_of_phys = 1; + + for(int i = 0; i < 1; ++i) { + resp.pnf_phy_rel12.phy[i].phy_config_index = pnf->phys[i].index; + resp.pnf_phy_rel12.phy[i].csi_subframe_set = 0; + resp.pnf_phy_rel12.phy[i].enhanced_4tx_codebook = 2; + resp.pnf_phy_rel12.phy[i].drs_supported = 0; + resp.pnf_phy_rel12.phy[i].ul_64qam_supported = 1; + resp.pnf_phy_rel12.phy[i].transmission_mode_10_supported = 0; + resp.pnf_phy_rel12.phy[i].alternative_bts_indices = 1; + } + } + + if(pnf->release >= 13) { + resp.pnf_phy_rel13.tl.tag = NFAPI_PNF_PHY_REL13_TAG; + resp.pnf_phy_rel13.number_of_phys = 1; + + for(int i = 0; i < 1; ++i) { + resp.pnf_phy_rel13.phy[i].phy_config_index = pnf->phys[i].index; + resp.pnf_phy_rel13.phy[i].pucch_format4_supported = 0; + resp.pnf_phy_rel13.phy[i].pucch_format5_supported = 1; + resp.pnf_phy_rel13.phy[i].more_than_5_ca_support = 0; + resp.pnf_phy_rel13.phy[i].laa_supported = 1; + resp.pnf_phy_rel13.phy[i].laa_ending_in_dwpts_supported = 0; + resp.pnf_phy_rel13.phy[i].laa_starting_in_second_slot_supported = 1; + resp.pnf_phy_rel13.phy[i].beamforming_supported = 0; + resp.pnf_phy_rel13.phy[i].csi_rs_enhancement_supported = 1; + resp.pnf_phy_rel13.phy[i].drms_enhancement_supported = 0; + resp.pnf_phy_rel13.phy[i].srs_enhancement_supported = 1; + } + + resp.pnf_phy_rel13_nb_iot.tl.tag = NFAPI_PNF_PHY_REL13_NB_IOT_TAG; + resp.pnf_phy_rel13_nb_iot.number_of_phys = 1; + + for(int i = 0; i < 1; ++i) { + resp.pnf_phy_rel13_nb_iot.phy[i].phy_config_index = pnf->phys[i].index; + + resp.pnf_phy_rel13_nb_iot.phy[i].number_of_rfs = 1; + for(int j = 0; j < 1; ++j) { + resp.pnf_phy_rel13_nb_iot.phy[i].rf_config[j].rf_config_index = pnf->phys[i].rfs[j]; + } + + resp.pnf_phy_rel13_nb_iot.phy[i].number_of_rf_exclusions = 1; + for(int j = 0; j < 1; ++j) { + resp.pnf_phy_rel13_nb_iot.phy[i].excluded_rf_config[j].rf_config_index = pnf->phys[i].excluded_rfs[j]; + } + + resp.pnf_phy_rel13_nb_iot.phy[i].number_of_dl_layers_supported = pnf->phys[i].num_dl_layers_supported; + resp.pnf_phy_rel13_nb_iot.phy[i].number_of_ul_layers_supported = pnf->phys[i].num_ul_layers_supported; + resp.pnf_phy_rel13_nb_iot.phy[i].maximum_3gpp_release_supported = pnf->phys[i].release_supported; + resp.pnf_phy_rel13_nb_iot.phy[i].nmm_modes_supported = pnf->phys[i].nmm_modes_supported; + } + } + + nfapi_pnf_pnf_param_resp(config, &resp); + + return 0; +} + +int pnf_config_request(nfapi_pnf_config_t* config, nfapi_pnf_config_request_t* req) { + + printf("[PNF] pnf config request\n"); + + pnf_info* pnf = (pnf_info*)(config->user_data); + + phy_info *phy = pnf->phys; + phy->id = req->pnf_phy_rf_config.phy_rf_config[0].phy_id; + printf("[PNF] pnf config request assigned phy_id %d to phy_config_index %d\n", phy->id, req->pnf_phy_rf_config.phy_rf_config[0].phy_config_index); + + nfapi_pnf_config_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_CONFIG_RESPONSE; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_pnf_config_resp(config, &resp); + printf("[PNF] Sent pnf_config_resp\n"); + + return 0; +} + +void nfapi_send_pnf_start_resp(nfapi_pnf_config_t* config, uint16_t phy_id) { + + printf("Sending NFAPI_START_RESPONSE config:%p phy_id:%d\n", config, phy_id); + + nfapi_start_response_t start_resp; + memset(&start_resp, 0, sizeof(start_resp)); + start_resp.header.message_id = NFAPI_START_RESPONSE; + start_resp.header.phy_id = phy_id; + start_resp.error_code = NFAPI_MSG_OK; + + nfapi_pnf_start_resp(config, &start_resp); +} + +int pnf_start_request(nfapi_pnf_config_t* config, nfapi_pnf_start_request_t* req) { + + printf("Received NFAPI_PNF_START_REQUEST\n"); + + pnf_info* pnf = (pnf_info*)(config->user_data); + + // start all phys that have been configured + phy_info* phy = pnf->phys; + + if(phy->id != 0) { + nfapi_pnf_start_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_START_RESPONSE; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_pnf_start_resp(config, &resp); + printf("[PNF] Sent NFAPI_PNF_START_RESP\n"); + } + return 0; +} + +int pnf_stop_request(nfapi_pnf_config_t* config, nfapi_pnf_stop_request_t* req) { + + printf("[PNF] Received NFAPI_PNF_STOP_REQ\n"); + + nfapi_pnf_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_STOP_RESPONSE; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_pnf_stop_resp(config, &resp); + printf("[PNF] Sent NFAPI_PNF_STOP_REQ\n"); + + return 0; +} + +int param_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_param_request_t* req) { + + printf("[PNF] Received NFAPI_PARAM_REQUEST phy_id:%d\n", req->header.phy_id); + + //pnf_info* pnf = (pnf_info*)(config->user_data); + + nfapi_param_response_t nfapi_resp; + + pnf_info* pnf = (pnf_info*)(config->user_data); + + memset(&nfapi_resp, 0, sizeof(nfapi_resp)); + nfapi_resp.header.message_id = NFAPI_PARAM_RESPONSE; + nfapi_resp.header.phy_id = req->header.phy_id; + nfapi_resp.error_code = 0; // DJP - what value??? + + struct sockaddr_in pnf_p7_sockaddr; + + pnf_p7_sockaddr.sin_addr.s_addr = inet_addr(pnf->phys[0].local_addr); + nfapi_resp.nfapi_config.p7_pnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG; + memcpy(nfapi_resp.nfapi_config.p7_pnf_address_ipv4.address, &pnf_p7_sockaddr.sin_addr.s_addr, 4); + nfapi_resp.num_tlv++; + + // P7 PNF Port + nfapi_resp.nfapi_config.p7_pnf_port.tl.tag = NFAPI_NFAPI_P7_PNF_PORT_TAG; + nfapi_resp.nfapi_config.p7_pnf_port.value = 32123; // DJP - hard code alert!!!! FIXME TODO + nfapi_resp.num_tlv++; + + nfapi_pnf_param_resp(config, &nfapi_resp); + + printf("[PNF] Sent NFAPI_PARAM_RESPONSE phy_id:%d number_of_tlvs:%u\n", req->header.phy_id, nfapi_resp.num_tlv); + + printf("[PNF] param request .. exit\n"); + + return 0; +} + +int config_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_config_request_t* req) { + + printf("[PNF] Received NFAPI_CONFIG_REQ phy_id:%d\n", req->header.phy_id); + + pnf_info* pnf = (pnf_info*)(config->user_data); + uint8_t num_tlv = 0; + struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + + phy_info* phy_info = pnf->phys; + + if(req->nfapi_config.timing_window.tl.tag == NFAPI_NFAPI_TIMING_WINDOW_TAG) { + phy_info->timing_window = req->nfapi_config.timing_window.value; + printf("Phy_info:Timing window:%u NFAPI_CONFIG:timing_window:%u\n", phy_info->timing_window, req->nfapi_config.timing_window.value); + num_tlv++; + } + + if(req->nfapi_config.timing_info_mode.tl.tag == NFAPI_NFAPI_TIMING_INFO_MODE_TAG) { + printf("timing info mode:%d\n", req->nfapi_config.timing_info_mode.value); + phy_info->timing_info_mode = req->nfapi_config.timing_info_mode.value; + num_tlv++; + } else { + phy_info->timing_info_mode = 0; + printf("NO timing info mode provided\n"); + } + + if(req->nfapi_config.timing_info_period.tl.tag == NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG) { + printf("timing info period provided value:%d\n", req->nfapi_config.timing_info_period.value); + phy_info->timing_info_period = req->nfapi_config.timing_info_period.value; + num_tlv++; + } else { + phy_info->timing_info_period = 0; + } + + if(req->rf_config.dl_channel_bandwidth.tl.tag == NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG) { + phy_info->dl_channel_bw_support = req->rf_config.dl_channel_bandwidth.value; + fp->N_RB_DL = req->rf_config.dl_channel_bandwidth.value; + num_tlv++; + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG N_RB_DL:%u\n", __FUNCTION__, fp->N_RB_DL); + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() Missing NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG\n", __FUNCTION__); + } + + if(req->rf_config.ul_channel_bandwidth.tl.tag == NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG) { + phy_info->ul_channel_bw_support = req->rf_config.ul_channel_bandwidth.value; + fp->N_RB_UL = req->rf_config.ul_channel_bandwidth.value; + num_tlv++; + } + + if(req->nfapi_config.rf_bands.tl.tag == NFAPI_NFAPI_RF_BANDS_TAG) { + pnf->rfs[0].band = req->nfapi_config.rf_bands.rf_band[0]; + fp->eutra_band = req->nfapi_config.rf_bands.rf_band[0]; + num_tlv++; + } + + if(req->nfapi_config.earfcn.tl.tag == NFAPI_NFAPI_EARFCN_TAG) { + fp->dl_CarrierFreq = from_earfcn(fp->eutra_band, req->nfapi_config.earfcn.value); + fp->ul_CarrierFreq = fp->dl_CarrierFreq - (get_uldl_offset(fp->eutra_band) * 1e5); + num_tlv++; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() earfcn:%u dl_carrierFreq:%u ul_CarrierFreq:%u band:%u N_RB_DL:%u\n", + __FUNCTION__, req->nfapi_config.earfcn.value, fp->dl_CarrierFreq, fp->ul_CarrierFreq, pnf->rfs[0].band, fp->N_RB_DL); + } + + if (req->subframe_config.duplex_mode.tl.tag == NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG) { + fp->frame_type = req->subframe_config.duplex_mode.value==0 ? TDD : FDD; + num_tlv++; + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() frame_type:%d\n", __FUNCTION__, fp->frame_type); + } + + if (req->subframe_config.dl_cyclic_prefix_type.tl.tag == NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG) { + fp->Ncp = req->subframe_config.dl_cyclic_prefix_type.value; + num_tlv++; + } + + if (req->subframe_config.ul_cyclic_prefix_type.tl.tag == NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG) { + fp->Ncp_UL = req->subframe_config.ul_cyclic_prefix_type.value; + num_tlv++; + } + + fp->num_MBSFN_config = 0; // DJP - hard code alert + + if (req->sch_config.physical_cell_id.tl.tag == NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG) { + fp->Nid_cell = req->sch_config.physical_cell_id.value; + fp->nushift = fp->Nid_cell%6; + num_tlv++; + } + + if (req->rf_config.tx_antenna_ports.tl.tag == NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG) { + fp->nb_antennas_tx = req->rf_config.tx_antenna_ports.value; + fp->nb_antenna_ports_eNB = 1; + num_tlv++; + } + + if (req->rf_config.rx_antenna_ports.tl.tag == NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG) { + fp->nb_antennas_rx = req->rf_config.rx_antenna_ports.value; + num_tlv++; + } + + if (req->phich_config.phich_resource.tl.tag == NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG) { + fp->phich_config_common.phich_resource = req->phich_config.phich_resource.value; + num_tlv++; + } + + if (req->phich_config.phich_duration.tl.tag == NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG) { + fp->phich_config_common.phich_duration = req->phich_config.phich_duration.value; + num_tlv++; + } + + if (req->phich_config.phich_power_offset.tl.tag == NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG) { + LOG_E(PHY, "%s() NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG tag:%d not supported\n", __FUNCTION__, req->phich_config.phich_power_offset.tl.tag); + //fp->phich_config_common.phich_power_offset = req->phich_config. + num_tlv++; + } + + // UL RS Config + if (req->uplink_reference_signal_config.cyclic_shift_1_for_drms.tl.tag == NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG) { + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = req->uplink_reference_signal_config.cyclic_shift_1_for_drms.value; + num_tlv++; + } + + if (req->uplink_reference_signal_config.uplink_rs_hopping.tl.tag == NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG) { + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = req->uplink_reference_signal_config.uplink_rs_hopping.value; + num_tlv++; + } + + if (req->uplink_reference_signal_config.group_assignment.tl.tag == NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG) { + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = req->uplink_reference_signal_config.group_assignment.value; + num_tlv++; + } + + if (req->pusch_config.hopping_mode.tl.tag == NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG) { + } // DJP - not being handled? + + if (req->pusch_config.hopping_offset.tl.tag == NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG) { + } // DJP - not being handled? + + if (req->pusch_config.number_of_subbands.tl.tag == NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG) { + } // DJP - not being handled? + + if (req->prach_config.configuration_index.tl.tag == NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG) { + fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex=req->prach_config.configuration_index.value; + num_tlv++; + } + + if (req->prach_config.root_sequence_index.tl.tag == NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG) { + fp->prach_config_common.rootSequenceIndex=req->prach_config.root_sequence_index.value; + num_tlv++; + } + + if (req->prach_config.zero_correlation_zone_configuration.tl.tag == NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG) { + fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=req->prach_config.zero_correlation_zone_configuration.value; + num_tlv++; + } + + if (req->prach_config.high_speed_flag.tl.tag == NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG) { + fp->prach_config_common.prach_ConfigInfo.highSpeedFlag=req->prach_config.high_speed_flag.value; + num_tlv++; + } + + if (req->prach_config.frequency_offset.tl.tag == NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG) { + fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset=req->prach_config.frequency_offset.value; + num_tlv++; + } + + printf("[PNF] CONFIG_REQUEST[num_tlv:%d] TLVs processed:%d\n", req->num_tlv, num_tlv); + + printf("[PNF] Simulating PHY CONFIG - DJP\n"); + PHY_Config_t phy_config; + phy_config.Mod_id = 0; + phy_config.CC_id=0; + phy_config.cfg = req; + + phy_config_request(&phy_config); + + dump_frame_parms(fp); + + phy_info->remote_port = req->nfapi_config.p7_vnf_port.value; + + struct sockaddr_in vnf_p7_sockaddr; + memcpy(&vnf_p7_sockaddr.sin_addr.s_addr, &(req->nfapi_config.p7_vnf_address_ipv4.address[0]), 4); + phy_info->remote_addr = inet_ntoa(vnf_p7_sockaddr.sin_addr); + + printf("[PNF] %d vnf p7 %s:%d timing %d %d %d\n", phy_info->id, phy_info->remote_addr, phy_info->remote_port, + phy_info->timing_window, phy_info->timing_info_mode, phy_info->timing_info_period); + + nfapi_config_response_t nfapi_resp; + memset(&nfapi_resp, 0, sizeof(nfapi_resp)); + nfapi_resp.header.message_id = NFAPI_CONFIG_RESPONSE; + nfapi_resp.header.phy_id = phy_info->id; + nfapi_resp.error_code = 0; // DJP - some value resp->error_code; + nfapi_pnf_config_resp(config, &nfapi_resp); + printf("[PNF] Sent NFAPI_CONFIG_RESPONSE phy_id:%d\n", phy_info->id); + + return 0; +} + +nfapi_p7_message_header_t* pnf_phy_allocate_p7_vendor_ext(uint16_t message_id, uint16_t* msg_size) { + + if(message_id == P7_VENDOR_EXT_REQ) { + (*msg_size) = sizeof(vendor_ext_p7_req); + return (nfapi_p7_message_header_t*)malloc(sizeof(vendor_ext_p7_req)); + } + + return 0; +} + +void pnf_phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t* header) { + + free(header); +} + +int pnf_phy_hi_dci0_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_hi_dci0_request_t* req) { + + if (req->hi_dci0_request_body.number_of_dci == 0 && req->hi_dci0_request_body.number_of_hi == 0) + LOG_D(PHY,"[PNF] HI_DCI0_REQUEST SFN/SF:%05d dci:%d hi:%d\n", NFAPI_SFNSF2DEC(req->sfn_sf), req->hi_dci0_request_body.number_of_dci, req->hi_dci0_request_body.number_of_hi); + + //phy_info* phy = (phy_info*)(pnf_p7->user_data); + + struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; + eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0]; + + for (int i=0; ihi_dci0_request_body.number_of_dci + req->hi_dci0_request_body.number_of_hi; i++) { + + //LOG_D(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d PDU[%d]\n", NFAPI_SFNSF2DEC(req->sfn_sf), i); + + if (req->hi_dci0_request_body.hi_dci0_pdu_list[i].pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE) { + + //LOG_D(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d PDU[%d] - NFAPI_HI_DCI0_DCI_PDU_TYPE\n", NFAPI_SFNSF2DEC(req->sfn_sf), i); + + nfapi_hi_dci0_request_pdu_t *hi_dci0_req_pdu = &req->hi_dci0_request_body.hi_dci0_pdu_list[i]; + + handle_nfapi_hi_dci0_dci_pdu(eNB,NFAPI_SFNSF2SFN(req->sfn_sf),NFAPI_SFNSF2SF(req->sfn_sf),proc,hi_dci0_req_pdu); + + eNB->pdcch_vars[NFAPI_SFNSF2SF(req->sfn_sf)&1].num_dci++; + + } else if (req->hi_dci0_request_body.hi_dci0_pdu_list[i].pdu_type == NFAPI_HI_DCI0_HI_PDU_TYPE) { + + LOG_D(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d PDU[%d] - NFAPI_HI_DCI0_HI_PDU_TYPE\n", NFAPI_SFNSF2DEC(req->sfn_sf), i); + + nfapi_hi_dci0_request_pdu_t *hi_dci0_req_pdu = &req->hi_dci0_request_body.hi_dci0_pdu_list[i]; + + handle_nfapi_hi_dci0_hi_pdu(eNB, NFAPI_SFNSF2SFN(req->sfn_sf),NFAPI_SFNSF2SF(req->sfn_sf), proc, hi_dci0_req_pdu); + + } else { + + LOG_E(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d PDU[%d] - unknown pdu type:%d\n", NFAPI_SFNSF2DEC(req->sfn_sf), i, req->hi_dci0_request_body.hi_dci0_pdu_list[i].pdu_type); + + } + } + + return 0; +} + +int pnf_phy_dl_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_dl_config_request_t* req) { + + if (RC.ru == 0) { + return -1; + } + + if (RC.eNB == 0) { + return -2; + } + + if (RC.eNB[0][0] == 0) { + return -3; + } + + if (sync_var != 0) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Main system not up - is this a dummy subframe?\n", __FUNCTION__); + return -4; + } + + int sfn = NFAPI_SFNSF2SFN(req->sfn_sf); + int sf = NFAPI_SFNSF2SF(req->sfn_sf); + + struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; + eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0]; + nfapi_dl_config_request_pdu_t* dl_config_pdu_list = req->dl_config_request_body.dl_config_pdu_list; + LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[sf&1]; + + pdcch_vars->num_pdcch_symbols = req->dl_config_request_body.number_pdcch_ofdm_symbols; + pdcch_vars->num_dci = 0; + + if (req->dl_config_request_body.number_dci || + req->dl_config_request_body.number_pdu || + req->dl_config_request_body.number_pdsch_rnti) + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX:%d/%d RX:%d/%d sfn_sf:%d pdcch:%u dl_cfg[dci:%u pdus:%d pdsch_rnti:%d] pcfich:%u\n", + __FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->frame_rx, proc->subframe_rx, + NFAPI_SFNSF2DEC(req->sfn_sf), + req->dl_config_request_body.number_pdcch_ofdm_symbols, + req->dl_config_request_body.number_dci, + req->dl_config_request_body.number_pdu, + req->dl_config_request_body.number_pdsch_rnti, + req->dl_config_request_body.transmission_power_pcfich); + + for (int i=0;idl_config_request_body.number_pdu;i++) { + + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sfn/sf:%d PDU[%d] size:%d pdcch_vars->num_dci:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), i, dl_config_pdu_list[i].pdu_size,pdcch_vars->num_dci); + + if (dl_config_pdu_list[i].pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) { + + handle_nfapi_dci_dl_pdu(eNB,NFAPI_SFNSF2SFN(req->sfn_sf),NFAPI_SFNSF2SF(req->sfn_sf),proc,&dl_config_pdu_list[i]); + + pdcch_vars->num_dci++; // Is actually number of DCI PDUs + + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() pdcch_vars->num_dci:%d\n", __FUNCTION__, pdcch_vars->num_dci); + + } else if (dl_config_pdu_list[i].pdu_type == NFAPI_DL_CONFIG_BCH_PDU_TYPE) { + + nfapi_dl_config_bch_pdu *bch_pdu = &dl_config_pdu_list[i].bch_pdu; + uint16_t pdu_index = bch_pdu->bch_pdu_rel8.pdu_index; + + if (tx_request_pdu[sfn][sf][pdu_index] != NULL) { + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PDU:%d BCH: pdu_index:%u pdu_length:%d sdu_length:%d BCH_SDU:%x,%x,%x\n", __FUNCTION__, i, pdu_index, bch_pdu->bch_pdu_rel8.length, tx_request_pdu[sfn][sf][pdu_index]->segments[0].segment_length, sdu[0], sdu[1], sdu[2]); + + handle_nfapi_bch_pdu(eNB, proc, &dl_config_pdu_list[i], tx_request_pdu[sfn][sf][pdu_index]->segments[0].segment_data); + + eNB->pbch_configured=1; + + } else { + + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() BCH NULL TX PDU SFN/SF:%d PDU_INDEX:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pdu_index); + } + } else if (dl_config_pdu_list[i].pdu_type == NFAPI_DL_CONFIG_DLSCH_PDU_TYPE) { + + nfapi_dl_config_dlsch_pdu *dlsch_pdu = &dl_config_pdu_list[i].dlsch_pdu; + nfapi_dl_config_dlsch_pdu_rel8_t *rel8_pdu = &dlsch_pdu->dlsch_pdu_rel8; + nfapi_tx_request_pdu_t *tx_pdu = tx_request_pdu[sfn][sf][rel8_pdu->pdu_index]; + + if (tx_pdu != NULL) { + int UE_id = find_dlsch(rel8_pdu->rnti,eNB,SEARCH_EXIST_OR_FREE); + AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n"); + AssertFatal(UE_id= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX); + LTE_eNB_DLSCH_t *dlsch0 = eNB->dlsch[UE_id][0]; + //LTE_eNB_DLSCH_t *dlsch1 = eNB->dlsch[UE_id][1]; + int harq_pid = dlsch0->harq_ids[sf]; + uint8_t *dlsch_sdu = tx_pdus[UE_id][harq_pid]; + + memcpy(dlsch_sdu, tx_pdu->segments[0].segment_data, tx_pdu->segments[0].segment_length); + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DLSCH:pdu_index:%d handle_nfapi_dlsch_pdu(eNB, proc_rxtx, dlsch_pdu, transport_blocks:%d sdu:%p) eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols:%d\n", __FUNCTION__, rel8_pdu->pdu_index, rel8_pdu->transport_blocks, dlsch_sdu, eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols); + + handle_nfapi_dlsch_pdu( eNB, sfn,sf, &eNB->proc.proc_rxtx[0], &dl_config_pdu_list[i], rel8_pdu->transport_blocks-1, dlsch_sdu); + + } else { + + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() DLSCH NULL TX PDU SFN/SF:%d PDU_INDEX:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), rel8_pdu->pdu_index); + } + + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() UNKNOWN:%d\n", __FUNCTION__, dl_config_pdu_list[i].pdu_type); + } + } + + if(req->vendor_extension) + free(req->vendor_extension); + + return 0; +} + +int pnf_phy_tx_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_tx_request_t* req) { + + uint16_t sfn = NFAPI_SFNSF2SFN(req->sfn_sf); + uint16_t sf = NFAPI_SFNSF2SF(req->sfn_sf); + + if (req->tx_request_body.number_of_pdus==0) + LOG_D(PHY,"%s() SFN/SF:%d%d PDUs:%d\n", __FUNCTION__, sfn, sf, req->tx_request_body.number_of_pdus); + + if (req->tx_request_body.tl.tag==NFAPI_TX_REQUEST_BODY_TAG) { + for (int i=0; itx_request_body.number_of_pdus; i++) { + LOG_D(PHY,"%s() SFN/SF:%d%d number_of_pdus:%d [PDU:%d] pdu_length:%d pdu_index:%d num_segments:%d\n", + __FUNCTION__, + sfn, sf, + req->tx_request_body.number_of_pdus, + i, + req->tx_request_body.tx_pdu_list[i].pdu_length, + req->tx_request_body.tx_pdu_list[i].pdu_index, + req->tx_request_body.tx_pdu_list[i].num_segments + ); + + tx_request_pdu[sfn][sf][i] = &req->tx_request_body.tx_pdu_list[i]; + } + } + + return 0; +} + +int pnf_phy_ul_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_ul_config_request_t* req) { + + if (0)LOG_D(PHY,"[PNF] UL_CONFIG_REQ %s() sfn_sf:%d pdu:%d rach_prach_frequency_resources:%d srs_present:%u\n", + __FUNCTION__, + NFAPI_SFNSF2DEC(req->sfn_sf), + req->ul_config_request_body.number_of_pdus, + req->ul_config_request_body.rach_prach_frequency_resources, + req->ul_config_request_body.srs_present + ); + + if (RC.ru == 0) { + return -1; + } + + if (RC.eNB == 0) { + return -2; + } + + if (RC.eNB[0][0] == 0) { + return -3; + } + + if (sync_var != 0) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Main system not up - is this a dummy subframe?\n", __FUNCTION__); + return -4; + } + + uint16_t curr_sfn = NFAPI_SFNSF2SFN(req->sfn_sf); + uint16_t curr_sf = NFAPI_SFNSF2SF(req->sfn_sf); + + struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; + eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0]; + nfapi_ul_config_request_pdu_t* ul_config_pdu_list = req->ul_config_request_body.ul_config_pdu_list; + + for (int i=0;iul_config_request_body.number_of_pdus;i++) { + //LOG_D(PHY, "%s() sfn/sf:%d PDU[%d] size:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), i, ul_config_pdu_list[i].pdu_size); + + if ( + ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE || + ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE || + ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE || + ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE || + ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE || + ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE || + ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE + ) { + //LOG_D(PHY, "%s() handle_nfapi_ul_pdu() for PDU:%d\n", __FUNCTION__, i); + + handle_nfapi_ul_pdu(eNB,proc,&ul_config_pdu_list[i],curr_sfn,curr_sf,req->ul_config_request_body.srs_present); + } else { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() PDU:%i UNKNOWN type :%d\n", __FUNCTION__, i, ul_config_pdu_list[i].pdu_type); + } + } + + return 0; +} + +int pnf_phy_lbt_dl_config_req(nfapi_pnf_p7_config_t* config, nfapi_lbt_dl_config_request_t* req) { + //printf("[PNF] lbt dl config request\n"); + return 0; +} + +int pnf_phy_vendor_ext(nfapi_pnf_p7_config_t* config, nfapi_p7_message_header_t* msg) { + if(msg->message_id == P7_VENDOR_EXT_REQ) { + //vendor_ext_p7_req* req = (vendor_ext_p7_req*)msg; + //printf("[PNF] vendor request (1:%d 2:%d)\n", req->dummy1, req->dummy2); + } else { + printf("[PNF] unknown vendor ext\n"); + } + return 0; +} + +int pnf_phy_pack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t** ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* codex) { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P7_VENDOR_EXT_IND) { + vendor_ext_p7_ind* ind = (vendor_ext_p7_ind*)(header); + if(!push16(ind->error_code, ppWritePackedMsg, end)) + return 0; + + return 1; + } + return -1; +} + +int pnf_phy_unpack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t** ppReadPackedMessage, uint8_t *end, nfapi_p7_codec_config_t* codec) { + if(header->message_id == P7_VENDOR_EXT_REQ) { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + vendor_ext_p7_req* req = (vendor_ext_p7_req*)(header); + if(!(pull16(ppReadPackedMessage, &req->dummy1, end) && + pull16(ppReadPackedMessage, &req->dummy2, end))) + return 0; + return 1; + } + return -1; +} + +int pnf_phy_unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMessage, uint8_t* end, void** ve, nfapi_p7_codec_config_t* config) { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "pnf_phy_unpack_vendor_extension_tlv\n"); + + switch(tl->tag) + { + case VENDOR_EXT_TLV_1_TAG: + *ve = malloc(sizeof(vendor_ext_tlv_1)); + if(!pull32(ppReadPackedMessage, &((vendor_ext_tlv_1*)(*ve))->dummy, end)) + return 0; + + return 1; + break; + } + + return -1; +} + +int pnf_phy_pack_vendor_extention_tlv(void* ve, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p7_codec_config_t* config) { + //printf("%s\n", __FUNCTION__); + (void)ve; + (void)ppWritePackedMsg; + return -1; +} + +int pnf_sim_unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMessage, uint8_t *end, void** ve, nfapi_p4_p5_codec_config_t* config) { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "pnf_sim_unpack_vendor_extension_tlv\n"); + + switch(tl->tag) + { + case VENDOR_EXT_TLV_2_TAG: + *ve = malloc(sizeof(vendor_ext_tlv_2)); + if(!pull32(ppReadPackedMessage, &((vendor_ext_tlv_2*)(*ve))->dummy, end)) + return 0; + + return 1; + break; + } + + return -1; +} + +int pnf_sim_pack_vendor_extention_tlv(void* ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) { + //printf("%s\n", __FUNCTION__); + (void)ve; + (void)ppWritePackedMsg; + return -1; +} + +nfapi_dl_config_request_t dummy_dl_config_req; +nfapi_tx_request_t dummy_tx_req; + +nfapi_pnf_p7_subframe_buffer_t dummy_subframe; + +int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_start_request_t* req) { + + printf("[PNF] Received NFAPI_START_REQ phy_id:%d\n", req->header.phy_id); + + nfapi_set_trace_level(NFAPI_TRACE_INFO); + + pnf_info* pnf = (pnf_info*)(config->user_data); + + phy_info* phy_info = pnf->phys; + + nfapi_pnf_p7_config_t* p7_config = nfapi_pnf_p7_config_create(); + + p7_config->phy_id = phy->phy_id; + + p7_config->remote_p7_port = phy_info->remote_port; + p7_config->remote_p7_addr = phy_info->remote_addr; + p7_config->local_p7_port = 32123; // DJP - good grief cannot seem to get the right answer phy_info->local_port; + //DJP p7_config->local_p7_addr = (char*)phy_info->local_addr.c_str(); + p7_config->local_p7_addr = phy_info->local_addr; + + printf("[PNF] P7 remote:%s:%d local:%s:%d\n", p7_config->remote_p7_addr, p7_config->remote_p7_port, p7_config->local_p7_addr, p7_config->local_p7_port); + + p7_config->user_data = phy_info; + + p7_config->malloc = &pnf_allocate; + p7_config->free = &pnf_deallocate; + p7_config->codec_config.allocate = &pnf_allocate; + p7_config->codec_config.deallocate = &pnf_deallocate; + + p7_config->trace = &pnf_nfapi_trace; + + phy->user_data = p7_config; + + p7_config->subframe_buffer_size = phy_info->timing_window; + printf("subframe_buffer_size configured using phy_info->timing_window:%d\n", phy_info->timing_window); + if(phy_info->timing_info_mode & 0x1) { + p7_config->timing_info_mode_periodic = 1; + p7_config->timing_info_period = phy_info->timing_info_period; + } + + if(phy_info->timing_info_mode & 0x2) { + p7_config->timing_info_mode_aperiodic = 1; + } + + p7_config->dl_config_req = &pnf_phy_dl_config_req; + p7_config->ul_config_req = &pnf_phy_ul_config_req; + p7_config->hi_dci0_req = &pnf_phy_hi_dci0_req; + p7_config->tx_req = &pnf_phy_tx_req; + p7_config->lbt_dl_config_req = &pnf_phy_lbt_dl_config_req; + + memset(&dummy_dl_config_req, 0, sizeof(dummy_dl_config_req)); + dummy_dl_config_req.dl_config_request_body.tl.tag=NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + dummy_dl_config_req.dl_config_request_body.number_pdcch_ofdm_symbols=1; + dummy_dl_config_req.dl_config_request_body.number_dci=0; + dummy_dl_config_req.dl_config_request_body.number_pdu=0; + dummy_dl_config_req.dl_config_request_body.number_pdsch_rnti=0; + dummy_dl_config_req.dl_config_request_body.transmission_power_pcfich=6000; + dummy_dl_config_req.dl_config_request_body.dl_config_pdu_list=0; + + memset(&dummy_tx_req, 0, sizeof(dummy_tx_req)); + dummy_tx_req.tx_request_body.number_of_pdus=0; + dummy_tx_req.tx_request_body.tl.tag=NFAPI_TX_REQUEST_BODY_TAG; + + dummy_subframe.dl_config_req = &dummy_dl_config_req; + dummy_subframe.tx_req = 0;//&dummy_tx_req; + + dummy_subframe.ul_config_req=0; + dummy_subframe.hi_dci0_req=0; + dummy_subframe.lbt_dl_config_req=0; + + p7_config->dummy_subframe = dummy_subframe; + + p7_config->vendor_ext = &pnf_phy_vendor_ext; + + p7_config->allocate_p7_vendor_ext = &pnf_phy_allocate_p7_vendor_ext; + p7_config->deallocate_p7_vendor_ext = &pnf_phy_deallocate_p7_vendor_ext; + + p7_config->codec_config.unpack_p7_vendor_extension = &pnf_phy_unpack_p7_vendor_extension; + p7_config->codec_config.pack_p7_vendor_extension = &pnf_phy_pack_p7_vendor_extension; + p7_config->codec_config.unpack_vendor_extension_tlv = &pnf_phy_unpack_vendor_extension_tlv; + p7_config->codec_config.pack_vendor_extension_tlv = &pnf_phy_pack_vendor_extention_tlv; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] Creating P7 thread %s\n", __FUNCTION__); + pthread_t p7_thread; + pthread_create(&p7_thread, NULL, &pnf_p7_thread_start, p7_config); + + //((pnf_phy_user_data_t*)(phy_info->fapi->user_data))->p7_config = p7_config; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] Calling l1_north_init_eNB() %s\n", __FUNCTION__); + l1_north_init_eNB(); + + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] DJP - HACK - Set p7_config global ready for subframe ind%s\n", __FUNCTION__); + p7_config_g = p7_config; + + // Need to wait for main thread to create RU structures + while(config_sync_var<0) { + usleep(5000000); + printf("[PNF] waiting for OAI to be configured (eNB/RU)\n"); + } + printf("[PNF] OAI eNB/RU configured\n"); + + printf("[PNF] About to call init_eNB_afterRU()\n"); + init_eNB_afterRU(); + + // Signal to main thread that it can carry on - otherwise RU will startup too quickly and it is not initialised + pthread_mutex_lock(&nfapi_sync_mutex); + nfapi_sync_var=0; + pthread_cond_broadcast(&nfapi_sync_cond); + pthread_mutex_unlock(&nfapi_sync_mutex); + + while(sync_var<0) { + usleep(5000000); + printf("[PNF] waiting for OAI to be started\n"); + } + + printf("[PNF] Sending PNF_START_RESP\n"); + nfapi_send_pnf_start_resp(config, p7_config->phy_id); + + printf("[PNF] Sending first P7 subframe ind\n"); + nfapi_pnf_p7_subframe_ind(p7_config, p7_config->phy_id, 0); // DJP - SFN_SF set to zero - correct??? + printf("[PNF] Sent first P7 subframe ind\n"); + + return 0; +} + +int measurement_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_measurement_request_t* req) { + + nfapi_measurement_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_MEASUREMENT_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_measurement_resp(config, &resp); + return 0; +} + +int rssi_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_rssi_request_t* req) { + + nfapi_rssi_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_RSSI_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_rssi_resp(config, &resp); + + nfapi_rssi_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_RSSI_INDICATION; + ind.header.phy_id = req->header.phy_id; + ind.error_code = NFAPI_P4_MSG_OK; + ind.rssi_indication_body.tl.tag = NFAPI_RSSI_INDICATION_TAG; + ind.rssi_indication_body.number_of_rssi = 1; + ind.rssi_indication_body.rssi[0] = -42; + nfapi_pnf_rssi_ind(config, &ind); + + return 0; +} + +int cell_search_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_cell_search_request_t* req) { + + nfapi_cell_search_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_CELL_SEARCH_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_cell_search_resp(config, &resp); + + nfapi_cell_search_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_CELL_SEARCH_INDICATION; + ind.header.phy_id = req->header.phy_id; + ind.error_code = NFAPI_P4_MSG_OK; + + switch(req->rat_type) { + case NFAPI_RAT_TYPE_LTE: + ind.lte_cell_search_indication.tl.tag = NFAPI_LTE_CELL_SEARCH_INDICATION_TAG; + ind.lte_cell_search_indication.number_of_lte_cells_found = 1; + ind.lte_cell_search_indication.lte_found_cells[0].pci = 123; + ind.lte_cell_search_indication.lte_found_cells[0].rsrp = 123; + ind.lte_cell_search_indication.lte_found_cells[0].rsrq = 123; + ind.lte_cell_search_indication.lte_found_cells[0].frequency_offset = 123; + break; + case NFAPI_RAT_TYPE_UTRAN: + { + ind.utran_cell_search_indication.tl.tag = NFAPI_UTRAN_CELL_SEARCH_INDICATION_TAG; + ind.utran_cell_search_indication.number_of_utran_cells_found = 1; + ind.utran_cell_search_indication.utran_found_cells[0].psc = 89; + ind.utran_cell_search_indication.utran_found_cells[0].rscp = 89; + ind.utran_cell_search_indication.utran_found_cells[0].ecno = 89; + ind.utran_cell_search_indication.utran_found_cells[0].frequency_offset = -89; + + } + break; + case NFAPI_RAT_TYPE_GERAN: + { + ind.geran_cell_search_indication.tl.tag = NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG; + ind.geran_cell_search_indication.number_of_gsm_cells_found = 1; + ind.geran_cell_search_indication.gsm_found_cells[0].bsic = 23; + ind.geran_cell_search_indication.gsm_found_cells[0].rxlev = 23; + ind.geran_cell_search_indication.gsm_found_cells[0].rxqual = 23; + ind.geran_cell_search_indication.gsm_found_cells[0].frequency_offset = -23; + ind.geran_cell_search_indication.gsm_found_cells[0].sfn_offset = 230; + + } + break; + } + + ind.pnf_cell_search_state.tl.tag = NFAPI_PNF_CELL_SEARCH_STATE_TAG; + ind.pnf_cell_search_state.length = 3; + + nfapi_pnf_cell_search_ind(config, &ind); + + return 0; +} + +int broadcast_detect_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_broadcast_detect_request_t* req) +{ + nfapi_broadcast_detect_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_BROADCAST_DETECT_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_broadcast_detect_resp(config, &resp); + + nfapi_broadcast_detect_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_BROADCAST_DETECT_INDICATION; + ind.header.phy_id = req->header.phy_id; + ind.error_code = NFAPI_P4_MSG_OK; + + switch(req->rat_type) + { + case NFAPI_RAT_TYPE_LTE: + { + ind.lte_broadcast_detect_indication.tl.tag = NFAPI_LTE_BROADCAST_DETECT_INDICATION_TAG; + ind.lte_broadcast_detect_indication.number_of_tx_antenna = 1; + ind.lte_broadcast_detect_indication.mib_length = 4; + //ind.lte_broadcast_detect_indication.mib... + ind.lte_broadcast_detect_indication.sfn_offset = 77; + + } + break; + case NFAPI_RAT_TYPE_UTRAN: + { + ind.utran_broadcast_detect_indication.tl.tag = NFAPI_UTRAN_BROADCAST_DETECT_INDICATION_TAG; + ind.utran_broadcast_detect_indication.mib_length = 4; + //ind.utran_broadcast_detect_indication.mib... + // ind.utran_broadcast_detect_indication.sfn_offset; DJP - nonsense line + + } + break; + } + + ind.pnf_cell_broadcast_state.tl.tag = NFAPI_PNF_CELL_BROADCAST_STATE_TAG; + ind.pnf_cell_broadcast_state.length = 3; + + nfapi_pnf_broadcast_detect_ind(config, &ind); + + return 0; +} + +int system_information_schedule_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_system_information_schedule_request_t* req) +{ + nfapi_system_information_schedule_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_system_information_schedule_resp(config, &resp); + + nfapi_system_information_schedule_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION; + ind.header.phy_id = req->header.phy_id; + ind.error_code = NFAPI_P4_MSG_OK; + + ind.lte_system_information_indication.tl.tag = NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG; + ind.lte_system_information_indication.sib_type = 3; + ind.lte_system_information_indication.sib_length = 5; + //ind.lte_system_information_indication.sib... + + nfapi_pnf_system_information_schedule_ind(config, &ind); + + return 0; +} + +int system_information_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_system_information_request_t* req) +{ + nfapi_system_information_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_SYSTEM_INFORMATION_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_system_information_resp(config, &resp); + + nfapi_system_information_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_SYSTEM_INFORMATION_INDICATION; + ind.header.phy_id = req->header.phy_id; + ind.error_code = NFAPI_P4_MSG_OK; + + switch(req->rat_type) + { + case NFAPI_RAT_TYPE_LTE: + { + ind.lte_system_information_indication.tl.tag = NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG; + ind.lte_system_information_indication.sib_type = 1; + ind.lte_system_information_indication.sib_length = 3; + //ind.lte_system_information_indication.sib... + } + break; + case NFAPI_RAT_TYPE_UTRAN: + { + ind.utran_system_information_indication.tl.tag = NFAPI_UTRAN_SYSTEM_INFORMATION_INDICATION_TAG; + ind.utran_system_information_indication.sib_length = 3; + //ind.utran_system_information_indication.sib... + + } + break; + case NFAPI_RAT_TYPE_GERAN: + { + ind.geran_system_information_indication.tl.tag = NFAPI_GERAN_SYSTEM_INFORMATION_INDICATION_TAG; + ind.geran_system_information_indication.si_length = 3; + //ind.geran_system_information_indication.si... + + } + break; + } + + nfapi_pnf_system_information_ind(config, &ind); + + return 0; +} + +int nmm_stop_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_nmm_stop_request_t* req) +{ + nfapi_nmm_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_NMM_STOP_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_nmm_stop_resp(config, &resp); + return 0; +} + +int vendor_ext(nfapi_pnf_config_t* config, nfapi_p4_p5_message_header_t* msg) +{ + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] P5 %s %p\n", __FUNCTION__, msg); + + switch(msg->message_id) + { + case P5_VENDOR_EXT_REQ: + { + vendor_ext_p5_req* req = (vendor_ext_p5_req*)msg; + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] P5 Vendor Ext Req (%d %d)\n", req->dummy1, req->dummy2); + // send back the P5_VENDOR_EXT_RSP + vendor_ext_p5_rsp rsp; + memset(&rsp, 0, sizeof(rsp)); + rsp.header.message_id = P5_VENDOR_EXT_RSP; + rsp.error_code = NFAPI_MSG_OK; + nfapi_pnf_vendor_extension(config, &rsp.header, sizeof(vendor_ext_p5_rsp)); + } + break; + } + + return 0; +} + +nfapi_p4_p5_message_header_t* pnf_sim_allocate_p4_p5_vendor_ext(uint16_t message_id, uint16_t* msg_size) { + + if(message_id == P5_VENDOR_EXT_REQ) { + (*msg_size) = sizeof(vendor_ext_p5_req); + return (nfapi_p4_p5_message_header_t*)malloc(sizeof(vendor_ext_p5_req)); + } + + return 0; +} + +void pnf_sim_deallocate_p4_p5_vendor_ext(nfapi_p4_p5_message_header_t* header) { + free(header); +} + +int pnf_sim_pack_p4_p5_vendor_extension(nfapi_p4_p5_message_header_t* header, uint8_t** ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P5_VENDOR_EXT_RSP) { + vendor_ext_p5_rsp* rsp = (vendor_ext_p5_rsp*)(header); + return (!push16(rsp->error_code, ppWritePackedMsg, end)); + } + return 0; +} + +int pnf_sim_unpack_p4_p5_vendor_extension(nfapi_p4_p5_message_header_t* header, uint8_t** ppReadPackedMessage, uint8_t *end, nfapi_p4_p5_codec_config_t* codec) { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P5_VENDOR_EXT_REQ) { + vendor_ext_p5_req* req = (vendor_ext_p5_req*)(header); + return (!(pull16(ppReadPackedMessage, &req->dummy1, end) && + pull16(ppReadPackedMessage, &req->dummy2, end))); + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s (%d %d)\n", __FUNCTION__, req->dummy1, req->dummy2); + } + return 0; +} + +/*------------------------------------------------------------------------------*/ + +void* pnf_start_thread(void* ptr) { + + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] IN PNF NFAPI start thread %s\n", __FUNCTION__); + + nfapi_pnf_config_t *config = (nfapi_pnf_config_t*)ptr; + + struct sched_param sp; + sp.sched_priority = 20; + pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp); + + nfapi_pnf_start(config); + + return (void*)0; +} + +void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port) { + + printf("%s() PNF\n\n\n\n\n\n", __FUNCTION__); + + nfapi_mode = 1; // PNF! + + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + + config->vnf_ip_addr = vnf_ip_addr; + config->vnf_p5_port = vnf_p5_port; + + pnf.phys[0].udp.enabled = 1; + pnf.phys[0].udp.rx_port = pnf_p7_port; + pnf.phys[0].udp.tx_port = vnf_p7_port; + strcpy(pnf.phys[0].udp.tx_addr, vnf_ip_addr); + + strcpy(pnf.phys[0].local_addr, pnf_ip_addr); + + printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%d rx:%d]\n", + __FUNCTION__, + config->vnf_ip_addr, config->vnf_p5_port, + pnf.phys[0].local_addr, + pnf.phys[0].udp.tx_addr, pnf.phys[0].udp.tx_port, + pnf.phys[0].udp.rx_port); + + config->pnf_param_req = &pnf_param_request; + config->pnf_config_req = &pnf_config_request; + config->pnf_start_req = &pnf_start_request; + config->pnf_stop_req = &pnf_stop_request; + config->param_req = ¶m_request; + config->config_req = &config_request; + config->start_req = &start_request; + + config->measurement_req = &measurement_request; + config->rssi_req = &rssi_request; + config->cell_search_req = &cell_search_request; + config->broadcast_detect_req = &broadcast_detect_request; + config->system_information_schedule_req = &system_information_schedule_request; + config->system_information_req = &system_information_request; + config->nmm_stop_req = &nmm_stop_request; + + config->vendor_ext = &vendor_ext; + + config->trace = &pnf_nfapi_trace; + + config->user_data = &pnf; + + // To allow custom vendor extentions to be added to nfapi + config->codec_config.unpack_vendor_extension_tlv = &pnf_sim_unpack_vendor_extension_tlv; + config->codec_config.pack_vendor_extension_tlv = &pnf_sim_pack_vendor_extention_tlv; + + config->allocate_p4_p5_vendor_ext = &pnf_sim_allocate_p4_p5_vendor_ext; + config->deallocate_p4_p5_vendor_ext = &pnf_sim_deallocate_p4_p5_vendor_ext; + + config->codec_config.unpack_p4_p5_vendor_extension = &pnf_sim_unpack_p4_p5_vendor_extension; + config->codec_config.pack_p4_p5_vendor_extension = &pnf_sim_pack_p4_p5_vendor_extension; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] Creating PNF NFAPI start thread %s\n", __FUNCTION__); + pthread_create(&pnf_start_pthread, NULL, &pnf_start_thread, config); + + pthread_setname_np(pnf_start_pthread, "NFAPI_PNF"); +} + +void oai_subframe_ind(uint16_t sfn, uint16_t sf) { + + //LOG_D(PHY,"%s(sfn:%d, sf:%d)\n", __FUNCTION__, sfn, sf); + + //TODO FIXME - HACK - DJP - using a global to bodge it in + + if (p7_config_g != NULL && sync_var==0) { + + uint16_t sfn_sf_tx = sfn<<4 | sf; + + if ((sfn % 100 == 0) && sf==0) + { + struct timespec ts; + + clock_gettime(CLOCK_MONOTONIC, &ts); + + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s %d.%d (sfn:%u sf:%u) SFN/SF(TX):%u\n", __FUNCTION__, ts.tv_sec, ts.tv_nsec, sfn, sf, NFAPI_SFNSF2DEC(sfn_sf_tx)); + } + + int subframe_ret = nfapi_pnf_p7_subframe_ind(p7_config_g, p7_config_g->phy_id, sfn_sf_tx); + + if (subframe_ret) { + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s(frame:%u subframe:%u) SFN/SF(TX):%u - PROBLEM with pnf_p7_subframe_ind()\n", __FUNCTION__, sfn, sf, sfn_sf_tx, NFAPI_SFNSF2DEC(sfn_sf_tx)); + } else { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "***NFAPI subframe handler finished *** \n"); + } + } else { + } +} + +int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind) { + + rach_ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! + + LOG_D(PHY, "%s() sfn_sf:%d preambles:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(rach_ind->sfn_sf), rach_ind->rach_indication_body.number_of_preambles); + + return nfapi_pnf_p7_rach_ind(p7_config_g, rach_ind); +} + +int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind) { + + harq_ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! + harq_ind->header.message_id = NFAPI_HARQ_INDICATION; + + LOG_D(PHY, "%s() sfn_sf:%d number_of_harqs:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(harq_ind->sfn_sf), harq_ind->harq_indication_body.number_of_harqs); + + int retval = nfapi_pnf_p7_harq_ind(p7_config_g, harq_ind); + + if (retval != 0) + LOG_E(PHY, "%s() sfn_sf:%d number_of_harqs:%d nfapi_pnf_p7_harq_ind()=%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(harq_ind->sfn_sf), harq_ind->harq_indication_body.number_of_harqs, retval); + + return retval; +} + +int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind) { + + crc_ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! + crc_ind->header.message_id = NFAPI_CRC_INDICATION; + + //LOG_D(PHY, "%s() sfn_sf:%d number_of_crcs:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(crc_ind->sfn_sf), crc_ind->crc_indication_body.number_of_crcs); + + return nfapi_pnf_p7_crc_ind(p7_config_g, crc_ind); +} + +int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *ind) { + + ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! + ind->header.message_id = NFAPI_RX_CQI_INDICATION; + + //LOG_D(PHY, "%s() sfn_sf:%d number_of_cqis:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->cqi_indication_body.number_of_cqis); + + return nfapi_pnf_p7_cqi_ind(p7_config_g, ind); +} + +int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind) { + + ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! + ind->header.message_id = NFAPI_RX_ULSCH_INDICATION; + + int retval = nfapi_pnf_p7_rx_ind(p7_config_g, ind); + + //LOG_D(PHY,"%s() SFN/SF:%d pdus:%d retval:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->rx_indication_body.number_of_pdus, retval); + + //free(ind.rx_indication_body.rx_pdu_list); + + return retval; +} + +int oai_nfapi_sr_indication(nfapi_sr_indication_t *ind) { + + ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! + + int retval = nfapi_pnf_p7_sr_ind(p7_config_g, ind); + + //LOG_D(PHY,"%s() SFN/SF:%d srs:%d retval:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->sr_indication_body.number_of_srs, retval); + + //free(ind.rx_indication_body.rx_pdu_list); + + return retval; +} diff --git a/nfapi/oai_integration/nfapi_pnf.h b/nfapi/oai_integration/nfapi_pnf.h new file mode 100644 index 0000000000..592d4877af --- /dev/null +++ b/nfapi/oai_integration/nfapi_pnf.h @@ -0,0 +1,27 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#if !defined(NFAPI_PNF_H__) +#define NFAPI_PNF_H__ + +void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port); + +#endif diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c new file mode 100644 index 0000000000..07c3f1aa91 --- /dev/null +++ b/nfapi/oai_integration/nfapi_vnf.c @@ -0,0 +1,1221 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "nfapi_interface.h" +#include "nfapi_vnf_interface.h" +#include "nfapi.h" +#include "vendor_ext.h" + +#include "nfapi_vnf.h" + + +#include "common/ran_context.h" +extern RAN_CONTEXT_t RC; + +typedef struct { + uint8_t enabled; + uint32_t rx_port; + uint32_t tx_port; + char tx_addr[80]; +} udp_data; + +typedef struct { + uint16_t index; + uint16_t id; + uint8_t rfs[2]; + uint8_t excluded_rfs[2]; + + udp_data udp; + + char local_addr[80]; + int local_port; + + char* remote_addr; + int remote_port; + + uint8_t duplex_mode; + uint16_t dl_channel_bw_support; + uint16_t ul_channel_bw_support; + uint8_t num_dl_layers_supported; + uint8_t num_ul_layers_supported; + uint16_t release_supported; + uint8_t nmm_modes_supported; + + uint8_t dl_ues_per_subframe; + uint8_t ul_ues_per_subframe; + + uint8_t first_subframe_ind; + + // timing information recevied from the vnf + uint8_t timing_window; + uint8_t timing_info_mode; + uint8_t timing_info_period; + +} phy_info; + +typedef struct { + uint16_t index; + uint16_t band; + int16_t max_transmit_power; + int16_t min_transmit_power; + uint8_t num_antennas_supported; + uint32_t min_downlink_frequency; + uint32_t max_downlink_frequency; + uint32_t max_uplink_frequency; + uint32_t min_uplink_frequency; +} rf_info; + +typedef struct { + + int release; + phy_info phys[2]; + rf_info rfs[2]; + + uint8_t sync_mode; + uint8_t location_mode; + uint8_t location_coordinates[6]; + uint32_t dl_config_timing; + uint32_t ul_config_timing; + uint32_t tx_timing; + uint32_t hi_dci0_timing; + + uint16_t max_phys; + uint16_t max_total_bw; + uint16_t max_total_dl_layers; + uint16_t max_total_ul_layers; + uint8_t shared_bands; + uint8_t shared_pa; + int16_t max_total_power; + uint8_t oui; + + uint8_t wireshark_test_mode; + +} pnf_info; + +typedef struct mac mac_t; + +typedef struct mac { + + void* user_data; + + void (*dl_config_req)(mac_t* mac, nfapi_dl_config_request_t* req); + void (*ul_config_req)(mac_t* mac, nfapi_ul_config_request_t* req); + void (*hi_dci0_req)(mac_t* mac, nfapi_hi_dci0_request_t* req); + void (*tx_req)(mac_t* mac, nfapi_tx_request_t* req); +} mac_t; + +typedef struct { + + int local_port; + char local_addr[80]; + + unsigned timing_window; + unsigned periodic_timing_enabled; + unsigned aperiodic_timing_enabled; + unsigned periodic_timing_period; + + // This is not really the right place if we have multiple PHY, + // should be part of the phy struct + udp_data udp; + + uint8_t thread_started; + + nfapi_vnf_p7_config_t* config; + + mac_t* mac; + +} vnf_p7_info; + +typedef struct { + + uint8_t wireshark_test_mode; + pnf_info pnfs[2]; + vnf_p7_info p7_vnfs[2]; + +} vnf_info; + +int vnf_pack_vendor_extension_tlv(void* ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* codec) { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "vnf_pack_vendor_extension_tlv\n"); + nfapi_tl_t* tlv = (nfapi_tl_t*)ve; + switch(tlv->tag) { + case VENDOR_EXT_TLV_2_TAG: + { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Packing VENDOR_EXT_TLV_2\n"); + vendor_ext_tlv_2* ve = (vendor_ext_tlv_2*)tlv; + if(!push32(ve->dummy, ppWritePackedMsg, end)) + return 0; + return 1; + } + break; + } + return -1; +} + +int vnf_unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMessage, uint8_t *end, void** ve, nfapi_p4_p5_codec_config_t* codec) { + return -1; +} + +void install_schedule_handlers(IF_Module_t *if_inst); +extern int single_thread_flag; +extern void init_eNB_afterRU(void); +extern uint16_t sf_ahead; + +void oai_create_enb(void) { + + int bodge_counter=0; + PHY_VARS_eNB *eNB = RC.eNB[0][0]; + + printf("[VNF] RC.eNB[0][0]. Mod_id:%d CC_id:%d nb_CC[0]:%d abstraction_flag:%d single_thread_flag:%d td:%p te:%p if_inst:%p\n", eNB->Mod_id, eNB->CC_id, RC.nb_CC[0], eNB->abstraction_flag, eNB->single_thread_flag, eNB->td, eNB->te, eNB->if_inst); + + eNB->Mod_id = bodge_counter; + eNB->CC_id = bodge_counter; + eNB->abstraction_flag = 0; + eNB->single_thread_flag = 0;//single_thread_flag; + eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; + + RC.nb_CC[bodge_counter] = 1; + + if (eNB->if_inst==0) { + eNB->if_inst = IF_Module_init(bodge_counter); + } + + // This will cause phy_config_request to be installed. That will result in RRC configuring the PHY + // that will result in eNB->configured being set to TRUE. + // See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values + if (RC.eNB[0][0]->if_inst==0 || RC.eNB[0][0]->if_inst->PHY_config_req==0 || RC.eNB[0][0]->if_inst->schedule_response==0) { + + printf("RC.eNB[0][0]->if_inst->PHY_config_req is not installed - install it\n"); + install_schedule_handlers(RC.eNB[0][0]->if_inst); + } + + do { + printf("%s() Waiting for eNB to become configured (by RRC/PHY) - need to wait otherwise NFAPI messages won't contain correct values\n", __FUNCTION__); + usleep(50000); + } while(eNB->configured != 1); + + printf("%s() eNB is now configured\n", __FUNCTION__); +} + +void oai_enb_init(void) { + + printf("%s() About to call init_eNB_afterRU()\n", __FUNCTION__); + init_eNB_afterRU(); +} + +int pnf_connection_indication_cb(nfapi_vnf_config_t* config, int p5_idx) { + + printf("[VNF] pnf connection indication idx:%d\n", p5_idx); + + oai_create_enb(); + + nfapi_pnf_param_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PNF_PARAM_REQUEST; + nfapi_vnf_pnf_param_req(config, p5_idx, &req); + return 0; +} + +int pnf_disconnection_indication_cb(nfapi_vnf_config_t* config, int p5_idx) { + printf("[VNF] pnf disconnection indication idx:%d\n", p5_idx); + + vnf_info* vnf = (vnf_info*)(config->user_data); + + pnf_info *pnf = vnf->pnfs; + phy_info *phy = pnf->phys; + + vnf_p7_info* p7_vnf = vnf->p7_vnfs; + nfapi_vnf_p7_del_pnf((p7_vnf->config), phy->id); + + return 0; +} + +int pnf_param_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_param_response_t* resp) { + + printf("[VNF] pnf param response idx:%d error:%d\n", p5_idx, resp->error_code); + + vnf_info* vnf = (vnf_info*)(config->user_data); + + pnf_info *pnf = vnf->pnfs; + + for(int i = 0; i < resp->pnf_phy.number_of_phys; ++i) + { + phy_info phy; + phy.index = resp->pnf_phy.phy[i].phy_config_index; + + printf("[VNF] (PHY:%d) phy_config_idx:%d\n", i, resp->pnf_phy.phy[i].phy_config_index); + + nfapi_vnf_allocate_phy(config, p5_idx, &(phy.id)); + + for(int j = 0; j < resp->pnf_phy.phy[i].number_of_rfs; ++j) + { + printf("[VNF] (PHY:%d) (RF%d) %d\n", i, j, resp->pnf_phy.phy[i].rf_config[j].rf_config_index); + phy.rfs[0] = resp->pnf_phy.phy[i].rf_config[j].rf_config_index; + } + + pnf->phys[0] = phy; + } + + for(int i = 0; i < resp->pnf_rf.number_of_rfs; ++i) { + rf_info rf; + rf.index = resp->pnf_rf.rf[i].rf_config_index; + + printf("[VNF] (RF:%d) rf_config_idx:%d\n", i, resp->pnf_rf.rf[i].rf_config_index); + + pnf->rfs[0] = rf; + } + + nfapi_pnf_config_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PNF_CONFIG_REQUEST; + + req.pnf_phy_rf_config.tl.tag = NFAPI_PNF_PHY_RF_TAG; + req.pnf_phy_rf_config.number_phy_rf_config_info = 2; // DJP pnf.phys.size(); + printf("DJP:Hard coded num phy rf to 2\n"); + + for(unsigned i = 0; i < 2; ++i) { + req.pnf_phy_rf_config.phy_rf_config[i].phy_id = pnf->phys[i].id; + req.pnf_phy_rf_config.phy_rf_config[i].phy_config_index = pnf->phys[i].index; + req.pnf_phy_rf_config.phy_rf_config[i].rf_config_index = pnf->phys[i].rfs[0]; + } + + nfapi_vnf_pnf_config_req(config, p5_idx, &req); + + return 0; +} + +int pnf_config_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_config_response_t* resp) { + + printf("[VNF] pnf config response idx:%d resp[header[phy_id:%u message_id:%02x message_length:%u]]\n", p5_idx, resp->header.phy_id, resp->header.message_id, resp->header.message_length); + + if(1) { + nfapi_pnf_start_request_t req; + memset(&req, 0, sizeof(req)); + req.header.phy_id = resp->header.phy_id; + req.header.message_id = NFAPI_PNF_START_REQUEST; + nfapi_vnf_pnf_start_req(config, p5_idx, &req); + } else { + // Rather than send the pnf_start_request we will demonstrate + // sending a vendor extention message. The start request will be + // send when the vendor extension response is received + + //vnf_info* vnf = (vnf_info*)(config->user_data); + vendor_ext_p5_req req; + memset(&req, 0, sizeof(req)); + req.header.message_id = P5_VENDOR_EXT_REQ; + req.dummy1 = 45; + req.dummy2 = 1977; + nfapi_vnf_vendor_extension(config, p5_idx, &req.header); + } + return 0; +} + +int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) { + + eNB_proc_t *proc=&eNB->proc; + + eNB_rxtx_proc_t *proc_rxtx=&proc->proc_rxtx[sf&1]; + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + + //printf("%s(eNB:%p, sfn:%d, sf:%d)\n", __FUNCTION__, eNB, sfn, sf); + + //int i; + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + +#if 0 + /* accept some delay in processing - up to 5ms */ + for (i = 0; i < 10 && proc_rxtx->instance_cnt_rxtx == 0; i++) { + LOG_W( PHY,"[eNB] sfn/sf:%d:%d proc_rxtx[%d]:TXsfn:%d/%d eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", sfn, sf, sf&1, proc_rxtx->frame_tx, proc_rxtx->subframe_tx, proc_rxtx->instance_cnt_rxtx); + usleep(500); + } + if (proc_rxtx->instance_cnt_rxtx == 0) { + exit_fun( "TX thread busy" ); + return(-1); + } +#endif + + // wake up TX for subframe n+sf_ahead + // lock the TX mutex and make sure the thread is ready + if (pthread_mutex_timedlock(&proc_rxtx->mutex_rxtx,&wait) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", proc_rxtx->subframe_rx&1,proc_rxtx->instance_cnt_rxtx ); + exit_fun( "error locking mutex_rxtx" ); + return(-1); + } + + { + static uint16_t old_sf = 0; + static uint16_t old_sfn = 0; + + proc->subframe_rx = old_sf; + proc->frame_rx = old_sfn; + + // Try to be 1 frame back + old_sf = sf; + old_sfn = sfn; + + if (old_sf == 0 && old_sfn % 100==0) LOG_W( PHY,"[eNB] sfn/sf:%d%d old_sfn/sf:%d%d proc[rx:%d%d]\n", sfn, sf, old_sfn, old_sf, proc->frame_rx, proc->subframe_rx); + } + + ++proc_rxtx->instance_cnt_rxtx; + + //LOG_D( PHY,"[VNF-subframe_ind] sfn/sf:%d:%d proc[frame_rx:%d subframe_rx:%d] proc_rxtx->instance_cnt_rxtx:%d \n", sfn, sf, proc->frame_rx, proc->subframe_rx, proc_rxtx->instance_cnt_rxtx); + + // We have just received and processed the common part of a subframe, say n. + // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired + // transmitted timestamp of the next TX slot (first). + // The last (TS_rx mod samples_per_frame) was n*samples_per_tti, + // we want to generate subframe (n+N), so TS_tx = TX_rx+N*samples_per_tti, + // and proc->subframe_tx = proc->subframe_rx+sf_ahead + proc_rxtx->timestamp_tx = proc->timestamp_rx + (sf_ahead*fp->samples_per_tti); + proc_rxtx->frame_rx = proc->frame_rx; + proc_rxtx->subframe_rx = proc->subframe_rx; + proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > (9-sf_ahead)) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx; + proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + sf_ahead)%10; + + //LOG_D(PHY, "sfn/sf:%d%d proc[rx:%d%d] proc_rxtx[instance_cnt_rxtx:%d rx:%d%d] About to wake rxtx thread\n\n", sfn, sf, proc->frame_rx, proc->subframe_rx, proc_rxtx->instance_cnt_rxtx, proc_rxtx->frame_rx, proc_rxtx->subframe_rx); + + // the thread can now be woken up + if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return(-1); + } + + //LOG_D(PHY,"%s() About to attempt pthread_mutex_unlock\n", __FUNCTION__); + pthread_mutex_unlock( &proc_rxtx->mutex_rxtx ); + //LOG_D(PHY,"%s() UNLOCKED pthread_mutex_unlock\n", __FUNCTION__); + + return(0); +} + +extern pthread_cond_t nfapi_sync_cond; +extern pthread_mutex_t nfapi_sync_mutex; +extern int nfapi_sync_var; + +int phy_sync_indication(struct nfapi_vnf_p7_config* config, uint8_t sync) { + + printf("[VNF] SYNC %s\n", sync==1 ? "ACHIEVED" : "LOST"); + + if (sync==1 && nfapi_sync_var!=0) { + + printf("[VNF] Signal to OAI main code that it can go\n"); + pthread_mutex_lock(&nfapi_sync_mutex); + nfapi_sync_var=0; + pthread_cond_broadcast(&nfapi_sync_cond); + pthread_mutex_unlock(&nfapi_sync_mutex); + } + + return(0); +} + +int phy_subframe_indication(struct nfapi_vnf_p7_config* config, uint16_t phy_id, uint16_t sfn_sf) { + + static uint8_t first_time = 1; + if (first_time) { + printf("[VNF] subframe indication %d\n", NFAPI_SFNSF2DEC(sfn_sf)); + first_time = 0; + } + + if (RC.eNB && RC.eNB[0][0]->configured) { + uint16_t sfn = NFAPI_SFNSF2SFN(sfn_sf); + uint16_t sf = NFAPI_SFNSF2SF(sfn_sf); + + //LOG_D(PHY,"[VNF] subframe indication sfn_sf:%d sfn:%d sf:%d\n", sfn_sf, sfn, sf); + + wake_eNB_rxtx(RC.eNB[0][0], sfn, sf); + } else { + printf("[VNF] %s() RC.eNB:%p\n", __FUNCTION__, RC.eNB); + if (RC.eNB) printf("RC.eNB[0][0]->configured:%d\n", RC.eNB[0][0]->configured); + } + + return 0; +} + +int phy_rach_indication(struct nfapi_vnf_p7_config* config, nfapi_rach_indication_t* ind) { + + LOG_D(MAC, "%s() NFAPI SFN/SF:%d number_of_preambles:%u\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->rach_indication_body.number_of_preambles); + + struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; + + printf("[VNF] RACH_IND eNB:%p sfn_sf:%d number_of_preambles:%d\n", eNB, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->rach_indication_body.number_of_preambles); + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + + eNB->UL_INFO.rach_ind = *ind; + eNB->UL_INFO.rach_ind.rach_indication_body.preamble_list = eNB->preamble_list; + + for (int i=0;irach_indication_body.number_of_preambles;i++) { + if (ind->rach_indication_body.preamble_list[i].preamble_rel8.tl.tag == NFAPI_PREAMBLE_REL8_TAG) { + + printf("preamble[%d]: rnti:%02x preamble:%d timing_advance:%d\n", + i, + ind->rach_indication_body.preamble_list[i].preamble_rel8.rnti, + ind->rach_indication_body.preamble_list[i].preamble_rel8.preamble, + ind->rach_indication_body.preamble_list[i].preamble_rel8.timing_advance + ); + } + + if(ind->rach_indication_body.preamble_list[i].preamble_rel13.tl.tag == NFAPI_PREAMBLE_REL13_TAG) { + printf("RACH PREAMBLE REL13 present\n"); + } + + eNB->preamble_list[i] = ind->rach_indication_body.preamble_list[i]; + } + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + + // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + //mac_rach_ind(p7_vnf->mac, ind); + return 1; +} + +int phy_harq_indication(struct nfapi_vnf_p7_config* config, nfapi_harq_indication_t* ind) { + + struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; + + LOG_D(MAC, "%s() NFAPI SFN/SF:%d number_of_harqs:%u\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->harq_indication_body.number_of_harqs); + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + + eNB->UL_INFO.harq_ind = *ind; + eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list = eNB->harq_pdu_list; + + for (int i=0; iharq_indication_body.number_of_harqs; i++) { + memcpy(&eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list[i], &ind->harq_indication_body.harq_pdu_list[i], sizeof(eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list[i])); + } + + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + + // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + //mac_harq_ind(p7_vnf->mac, ind); + + return 1; +} + +int phy_crc_indication(struct nfapi_vnf_p7_config* config, nfapi_crc_indication_t* ind) { + + struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + + eNB->UL_INFO.crc_ind = *ind; + + nfapi_crc_indication_t *dest_ind = &eNB->UL_INFO.crc_ind; + nfapi_crc_indication_pdu_t *dest_pdu_list = eNB->crc_pdu_list; + + *dest_ind = *ind; + dest_ind->crc_indication_body.crc_pdu_list = dest_pdu_list; + + if (ind->crc_indication_body.number_of_crcs==0) + LOG_D(MAC, "%s() NFAPI SFN/SF:%d IND:number_of_crcs:%u UL_INFO:crcs:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->crc_indication_body.number_of_crcs, eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs); + + for (int i=0; icrc_indication_body.number_of_crcs; i++) { + memcpy(&dest_ind->crc_indication_body.crc_pdu_list[i], &ind->crc_indication_body.crc_pdu_list[i], sizeof(ind->crc_indication_body.crc_pdu_list[0])); + + LOG_D(MAC, "%s() NFAPI SFN/SF:%d CRC_IND:number_of_crcs:%u UL_INFO:crcs:%d PDU[%d] rnti:%04x UL_INFO:rnti:%04x\n", + __FUNCTION__, + NFAPI_SFNSF2DEC(ind->sfn_sf), ind->crc_indication_body.number_of_crcs, eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs, + i, + ind->crc_indication_body.crc_pdu_list[i].rx_ue_information.rnti, + eNB->UL_INFO.crc_ind.crc_indication_body.crc_pdu_list[i].rx_ue_information.rnti); + } + + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + + // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + //mac_crc_ind(p7_vnf->mac, ind); + + return 1; +} + +int phy_rx_indication(struct nfapi_vnf_p7_config* config, nfapi_rx_indication_t* ind) { + + struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; + + if (ind->rx_indication_body.number_of_pdus==0) { + LOG_D(MAC, "%s() NFAPI SFN/SF:%d number_of_pdus:%u\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->rx_indication_body.number_of_pdus); + } + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + + nfapi_rx_indication_t *dest_ind = &eNB->UL_INFO.rx_ind; + nfapi_rx_indication_pdu_t *dest_pdu_list = eNB->rx_pdu_list; + + *dest_ind = *ind; + dest_ind->rx_indication_body.rx_pdu_list = dest_pdu_list; + + for(int i=0; irx_indication_body.number_of_pdus; i++) { + nfapi_rx_indication_pdu_t *dest_pdu = &dest_ind->rx_indication_body.rx_pdu_list[i]; + nfapi_rx_indication_pdu_t *src_pdu = &ind->rx_indication_body.rx_pdu_list[i]; + + memcpy(dest_pdu, src_pdu, sizeof(*src_pdu)); + + // DJP - TODO FIXME - intentional memory leak + dest_pdu->data = malloc(dest_pdu->rx_indication_rel8.length); + + memcpy(dest_pdu->data, src_pdu->data, dest_pdu->rx_indication_rel8.length); + + LOG_D(PHY, "%s() NFAPI SFN/SF:%d PDUs:%d [PDU:%d] handle:%d rnti:%04x length:%d offset:%d ul_cqi:%d ta:%d data:%p\n", + __FUNCTION__, + NFAPI_SFNSF2DEC(ind->sfn_sf), ind->rx_indication_body.number_of_pdus, i, + dest_pdu->rx_ue_information.handle, + dest_pdu->rx_ue_information.rnti, + dest_pdu->rx_indication_rel8.length, + dest_pdu->rx_indication_rel8.offset, + dest_pdu->rx_indication_rel8.ul_cqi, + dest_pdu->rx_indication_rel8.timing_advance, + dest_pdu->data + ); + } + + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + + // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + //mac_rx_ind(p7_vnf->mac, ind); + return 1; +} +int phy_srs_indication(struct nfapi_vnf_p7_config* config, nfapi_srs_indication_t* ind) { + // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + //mac_srs_ind(p7_vnf->mac, ind); + return 1; +} + +int phy_sr_indication(struct nfapi_vnf_p7_config* config, nfapi_sr_indication_t* ind) { + + struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; + + LOG_D(MAC, "%s() NFAPI SFN/SF:%d srs:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->sr_indication_body.number_of_srs); + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + + nfapi_sr_indication_t *dest_ind = &eNB->UL_INFO.sr_ind; + nfapi_sr_indication_pdu_t *dest_pdu_list = eNB->sr_pdu_list; + + *dest_ind = *ind; + dest_ind->sr_indication_body.sr_pdu_list = dest_pdu_list; + + LOG_D(MAC,"%s() eNB->UL_INFO.sr_ind.sr_indication_body.number_of_srs:%d\n", __FUNCTION__, eNB->UL_INFO.sr_ind.sr_indication_body.number_of_srs); + + for (int i=0;iUL_INFO.sr_ind.sr_indication_body.number_of_srs;i++) { + nfapi_sr_indication_pdu_t *dest_pdu = &dest_ind->sr_indication_body.sr_pdu_list[i]; + nfapi_sr_indication_pdu_t *src_pdu = &ind->sr_indication_body.sr_pdu_list[i]; + + LOG_D(MAC, "SR_IND[PDU:%d][rnti:%x cqi:%d channel:%d]\n", i, src_pdu->rx_ue_information.rnti, src_pdu->ul_cqi_information.ul_cqi, src_pdu->ul_cqi_information.channel); + + memcpy(dest_pdu, src_pdu, sizeof(*src_pdu)); + } + + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + + // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + //mac_sr_ind(p7_vnf->mac, ind); + + return 1; +} + +int phy_cqi_indication(struct nfapi_vnf_p7_config* config, nfapi_cqi_indication_t* ind) { + + // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + //mac_cqi_ind(p7_vnf->mac, ind); + struct PHY_VARS_eNB_s *eNB = RC.eNB[0][0]; + + LOG_D(MAC, "%s() NFAPI SFN/SF:%d number_of_cqis:%u\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind->sfn_sf), ind->cqi_indication_body.number_of_cqis); + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + + eNB->UL_INFO.cqi_ind = ind->cqi_indication_body; + + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + + return 1; +} + +int phy_lbt_dl_indication(struct nfapi_vnf_p7_config* config, nfapi_lbt_dl_indication_t* ind) { + // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + //mac_lbt_dl_ind(p7_vnf->mac, ind); + return 1; +} + +int phy_nb_harq_indication(struct nfapi_vnf_p7_config* config, nfapi_nb_harq_indication_t* ind) { + // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + //mac_nb_harq_ind(p7_vnf->mac, ind); + return 1; +} + +int phy_nrach_indication(struct nfapi_vnf_p7_config* config, nfapi_nrach_indication_t* ind) { + // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + //mac_nrach_ind(p7_vnf->mac, ind); + return 1; +} + +void* vnf_allocate(size_t size) { + //return (void*)memory_pool::allocate(size); + return (void*)malloc(size); +} + +void vnf_deallocate(void* ptr) { + //memory_pool::deallocate((uint8_t*)ptr); + free(ptr); +} + +extern void nfapi_log(char *file, char *func, int line, int comp, int level, const char* format, va_list args); + +void vnf_trace(nfapi_trace_level_t nfapi_level, const char* message, ...) { + + va_list args; + int oai_level; + + if (nfapi_level==NFAPI_TRACE_ERROR) + { + oai_level = LOG_ERR; + } + else if (nfapi_level==NFAPI_TRACE_WARN) + { + oai_level = LOG_WARNING; + } + else if (nfapi_level==NFAPI_TRACE_NOTE) + { + oai_level = LOG_INFO; + } + else if (nfapi_level==NFAPI_TRACE_INFO) + { + oai_level = LOG_INFO; + } + else + { + oai_level = LOG_INFO; + } + + va_start(args, message); + nfapi_log("FILE>", "FUNC", 999, PHY, oai_level, message, args); + va_end(args); +} + +int phy_vendor_ext(struct nfapi_vnf_p7_config* config, nfapi_p7_message_header_t* msg) { + + if(msg->message_id == P7_VENDOR_EXT_IND) + { + //vendor_ext_p7_ind* ind = (vendor_ext_p7_ind*)msg; + //printf("[VNF] vendor_ext (error_code:%d)\n", ind->error_code); + } + else + { + printf("[VNF] unknown %02x\n", msg->message_id); + } + return 0; +} + +nfapi_p7_message_header_t* phy_allocate_p7_vendor_ext(uint16_t message_id, uint16_t* msg_size) { + if(message_id == P7_VENDOR_EXT_IND) + { + *msg_size = sizeof(vendor_ext_p7_ind); + return (nfapi_p7_message_header_t*)malloc(sizeof(vendor_ext_p7_ind)); + } + return 0; +} + +void phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t* header) { + free(header); +} + +int phy_unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMessage, uint8_t *end, void** ve, nfapi_p7_codec_config_t* codec) { + + (void)tl; + (void)ppReadPackedMessage; + (void)ve; + return -1; +} + +int phy_pack_vendor_extension_tlv(void* ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* codec) { + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "phy_pack_vendor_extension_tlv\n"); + + nfapi_tl_t* tlv = (nfapi_tl_t*)ve; + switch(tlv->tag) { + case VENDOR_EXT_TLV_1_TAG: + { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Packing VENDOR_EXT_TLV_1\n"); + vendor_ext_tlv_1* ve = (vendor_ext_tlv_1*)tlv; + if(!push32(ve->dummy, ppWritePackedMsg, end)) + return 0; + return 1; + } + break; + default: + return -1; + break; + } +} + +int phy_unpack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t** ppReadPackedMessage, uint8_t *end, nfapi_p7_codec_config_t* config) { + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P7_VENDOR_EXT_IND) { + vendor_ext_p7_ind* req = (vendor_ext_p7_ind*)(header); + if(!pull16(ppReadPackedMessage, &req->error_code, end)) + return 0; + } + + return 1; +} + +int phy_pack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t** ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P7_VENDOR_EXT_REQ) { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + vendor_ext_p7_req* req = (vendor_ext_p7_req*)(header); + if(!(push16(req->dummy1, ppWritePackedMsg, end) && + push16(req->dummy2, ppWritePackedMsg, end))) + return 0; + } + return 1; +} + +int vnf_pack_p4_p5_vendor_extension(nfapi_p4_p5_message_header_t* header, uint8_t** ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* codec) { + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P5_VENDOR_EXT_REQ) { + vendor_ext_p5_req* req = (vendor_ext_p5_req*)(header); + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s %d %d\n", __FUNCTION__, req->dummy1, req->dummy2); + return (!(push16(req->dummy1, ppWritePackedMsg, end) && + push16(req->dummy2, ppWritePackedMsg, end))); + } + return 0; +} + +static pthread_t vnf_start_pthread; +static pthread_t vnf_p7_start_pthread; + +void* vnf_p7_start_thread(void *ptr) { + + printf("%s()\n", __FUNCTION__); + + pthread_setname_np(pthread_self(), "VNF_P7"); + + nfapi_vnf_p7_config_t* config = (nfapi_vnf_p7_config_t*)ptr; + + nfapi_vnf_p7_start(config); + + return config; +} + +void set_thread_priority(int priority); + +void* vnf_p7_thread_start(void* ptr) { + + set_thread_priority(79); + + vnf_p7_info* p7_vnf = (vnf_p7_info*)ptr; + + p7_vnf->config->port = p7_vnf->local_port; + p7_vnf->config->sync_indication = &phy_sync_indication; + p7_vnf->config->subframe_indication = &phy_subframe_indication; + p7_vnf->config->harq_indication = &phy_harq_indication; + p7_vnf->config->crc_indication = &phy_crc_indication; + p7_vnf->config->rx_indication = &phy_rx_indication; + p7_vnf->config->rach_indication = &phy_rach_indication; + p7_vnf->config->srs_indication = &phy_srs_indication; + p7_vnf->config->sr_indication = &phy_sr_indication; + p7_vnf->config->cqi_indication = &phy_cqi_indication; + p7_vnf->config->lbt_dl_indication = &phy_lbt_dl_indication; + p7_vnf->config->nb_harq_indication = &phy_nb_harq_indication; + p7_vnf->config->nrach_indication = &phy_nrach_indication; + p7_vnf->config->malloc = &vnf_allocate; + p7_vnf->config->free = &vnf_deallocate; + + p7_vnf->config->trace = &vnf_trace; + + p7_vnf->config->vendor_ext = &phy_vendor_ext; + p7_vnf->config->user_data = p7_vnf; + + p7_vnf->mac->user_data = p7_vnf; + + p7_vnf->config->codec_config.unpack_p7_vendor_extension = &phy_unpack_p7_vendor_extension; + p7_vnf->config->codec_config.pack_p7_vendor_extension = &phy_pack_p7_vendor_extension; + p7_vnf->config->codec_config.unpack_vendor_extension_tlv = &phy_unpack_vendor_extension_tlv; + p7_vnf->config->codec_config.pack_vendor_extension_tlv = &phy_pack_vendor_extension_tlv; + p7_vnf->config->codec_config.allocate = &vnf_allocate; + p7_vnf->config->codec_config.deallocate = &vnf_deallocate; + + p7_vnf->config->allocate_p7_vendor_ext = &phy_allocate_p7_vendor_ext; + p7_vnf->config->deallocate_p7_vendor_ext = &phy_deallocate_p7_vendor_ext; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__); + pthread_create(&vnf_p7_start_pthread, NULL, &vnf_p7_start_thread, p7_vnf->config); + + return 0; +} + +int pnf_start_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_start_response_t* resp) { + + vnf_info* vnf = (vnf_info*)(config->user_data); + vnf_p7_info *p7_vnf = vnf->p7_vnfs; + pnf_info *pnf = vnf->pnfs; + nfapi_param_request_t req; + + printf("[VNF] pnf start response idx:%d config:%p user_data:%p p7_vnf[config:%p thread_started:%d]\n", p5_idx, config, config->user_data, vnf->p7_vnfs[0].config, vnf->p7_vnfs[0].thread_started); + + if(p7_vnf->thread_started == 0) { + + pthread_t vnf_p7_thread; + pthread_create(&vnf_p7_thread, NULL, &vnf_p7_thread_start, p7_vnf); + p7_vnf->thread_started = 1; + } + else + { + // P7 thread already running. + } + + // start all the phys in the pnf. + printf("[VNF] Sending NFAPI_PARAM_REQUEST phy_id:%d\n", pnf->phys[0].id); + + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PARAM_REQUEST; + req.header.phy_id = pnf->phys[0].id; + + nfapi_vnf_param_req(config, p5_idx, &req); + + return 0; +} + +extern uint32_t to_earfcn(int eutra_bandP,uint32_t dl_CarrierFreq,uint32_t bw); + +int param_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_response_t* resp) { + + printf("[VNF] Received NFAPI_PARAM_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id); + + vnf_info* vnf = (vnf_info*)(config->user_data); + vnf_p7_info *p7_vnf = vnf->p7_vnfs; + + pnf_info *pnf = vnf->pnfs; + phy_info *phy = pnf->phys; + struct sockaddr_in pnf_p7_sockaddr; + nfapi_config_request_t *req = &RC.mac[0]->config[0]; + + phy->remote_port = resp->nfapi_config.p7_pnf_port.value; + + memcpy(&pnf_p7_sockaddr.sin_addr.s_addr, &(resp->nfapi_config.p7_pnf_address_ipv4.address[0]), 4); + + phy->remote_addr = inet_ntoa(pnf_p7_sockaddr.sin_addr); + + // for now just 1 + + printf("[VNF] %d.%d pnf p7 %s:%d timing %d %d %d %d\n", p5_idx, phy->id, phy->remote_addr, phy->remote_port, p7_vnf->timing_window, p7_vnf->periodic_timing_period, p7_vnf->aperiodic_timing_enabled, p7_vnf->periodic_timing_period); + + req->header.message_id = NFAPI_CONFIG_REQUEST; + req->header.phy_id = phy->id; + + printf("[VNF] Send NFAPI_CONFIG_REQUEST\n"); + + req->nfapi_config.p7_vnf_port.tl.tag = NFAPI_NFAPI_P7_VNF_PORT_TAG; + req->nfapi_config.p7_vnf_port.value = p7_vnf->local_port; + req->num_tlv++; + + printf("[VNF] DJP local_port:%d\n", p7_vnf->local_port); + + req->nfapi_config.p7_vnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG; + struct sockaddr_in vnf_p7_sockaddr; + vnf_p7_sockaddr.sin_addr.s_addr = inet_addr(p7_vnf->local_addr); + memcpy(&(req->nfapi_config.p7_vnf_address_ipv4.address[0]), &vnf_p7_sockaddr.sin_addr.s_addr, 4); + req->num_tlv++; + printf("[VNF] DJP local_addr:%s\n", p7_vnf->local_addr); + + req->nfapi_config.timing_window.tl.tag = NFAPI_NFAPI_TIMING_WINDOW_TAG; + req->nfapi_config.timing_window.value = p7_vnf->timing_window; + printf("[VNF] Timing window:%d\n", p7_vnf->timing_window); + req->num_tlv++; + + if(p7_vnf->periodic_timing_enabled || p7_vnf->aperiodic_timing_enabled) { + + req->nfapi_config.timing_info_mode.tl.tag = NFAPI_NFAPI_TIMING_INFO_MODE_TAG; + req->nfapi_config.timing_info_mode.value = (p7_vnf->aperiodic_timing_enabled << 1) | (p7_vnf->periodic_timing_enabled); + req->num_tlv++; + + if(p7_vnf->periodic_timing_enabled) { + + req->nfapi_config.timing_info_period.tl.tag = NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG; + req->nfapi_config.timing_info_period.value = p7_vnf->periodic_timing_period; + req->num_tlv++; + } + } + + vendor_ext_tlv_2 ve2; + memset(&ve2, 0, sizeof(ve2)); + ve2.tl.tag = VENDOR_EXT_TLV_2_TAG; + ve2.dummy = 2016; + req->vendor_extension = &ve2.tl; + + nfapi_vnf_config_req(config, p5_idx, req); + printf("[VNF] Sent NFAPI_CONFIG_REQ num_tlv:%u\n",req->num_tlv); + + return 0; +} + +int config_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_response_t* resp) { + + nfapi_start_request_t req; + + printf("[VNF] Received NFAPI_CONFIG_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id); + + printf("[VNF] Calling oai_enb_init()\n"); + oai_enb_init(); + + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_START_REQUEST; + req.header.phy_id = resp->header.phy_id; + nfapi_vnf_start_req(config, p5_idx, &req); + + printf("[VNF] Send NFAPI_START_REQUEST idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id); + + return 0; +} + +int start_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_response_t* resp) { + + printf("[VNF] Received NFAPI_START_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id); + + vnf_info* vnf = (vnf_info*)(config->user_data); + + pnf_info *pnf = vnf->pnfs; + phy_info *phy = pnf->phys; + vnf_p7_info *p7_vnf = vnf->p7_vnfs; + nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, phy->remote_port, phy->id); + + return 0; +} + +int vendor_ext_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_p4_p5_message_header_t* msg) { + + printf("[VNF] %s\n", __FUNCTION__); + + switch(msg->message_id) { + case P5_VENDOR_EXT_RSP: + { + vendor_ext_p5_rsp* rsp = (vendor_ext_p5_rsp*)msg; + printf("[VNF] P5_VENDOR_EXT_RSP error_code:%d\n", rsp->error_code); + + // send the start request + + nfapi_pnf_start_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PNF_START_REQUEST; + nfapi_vnf_pnf_start_req(config, p5_idx, &req); + } + break; + } + + return 0; +} + +int vnf_unpack_p4_p5_vendor_extension(nfapi_p4_p5_message_header_t* header, uint8_t** ppReadPackedMessage, uint8_t *end, nfapi_p4_p5_codec_config_t* codec) { + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P5_VENDOR_EXT_RSP) + { + vendor_ext_p5_rsp* req = (vendor_ext_p5_rsp*)(header); + return(!pull16(ppReadPackedMessage, &req->error_code, end)); + } + return 0; +} + +nfapi_p4_p5_message_header_t* vnf_allocate_p4_p5_vendor_ext(uint16_t message_id, uint16_t* msg_size) { + + if(message_id == P5_VENDOR_EXT_RSP) { + *msg_size = sizeof(vendor_ext_p5_rsp); + return (nfapi_p4_p5_message_header_t*)malloc(sizeof(vendor_ext_p5_rsp)); + } + return 0; +} + +void vnf_deallocate_p4_p5_vendor_ext(nfapi_p4_p5_message_header_t* header) { + free(header); +} + +nfapi_vnf_config_t *config = 0; + +void vnf_start_thread(void* ptr) { + + NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] VNF NFAPI thread - nfapi_vnf_start()%s\n", __FUNCTION__); + + pthread_setname_np(pthread_self(), "VNF"); + + config = (nfapi_vnf_config_t*)ptr; + + nfapi_vnf_start(config); +} + +static vnf_info vnf; +extern uint8_t nfapi_mode; +/*------------------------------------------------------------------------------*/ +void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port) +{ + nfapi_mode = 2; + + memset(&vnf, 0, sizeof(vnf)); + + memset(vnf.p7_vnfs, 0, sizeof(vnf.p7_vnfs)); + + vnf.p7_vnfs[0].timing_window = 32; + vnf.p7_vnfs[0].periodic_timing_enabled = 1; + vnf.p7_vnfs[0].aperiodic_timing_enabled = 0; + vnf.p7_vnfs[0].periodic_timing_period = 10; + + vnf.p7_vnfs[0].config = nfapi_vnf_p7_config_create(); + NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s() vnf.p7_vnfs[0].config:%p VNF ADDRESS:%s:%d\n", __FUNCTION__, vnf.p7_vnfs[0].config, vnf_addr, vnf_p5_port); + + strcpy(vnf.p7_vnfs[0].local_addr, vnf_addr); + vnf.p7_vnfs[0].local_port = 50001; + vnf.p7_vnfs[0].mac = (mac_t*)malloc(sizeof(mac_t)); + + nfapi_vnf_config_t* config = nfapi_vnf_config_create(); + + config->malloc = malloc; + config->free = free; + config->trace = &vnf_trace; + + config->vnf_p5_port = vnf_p5_port; + config->vnf_ipv4 = 1; + config->vnf_ipv6 = 0; + + config->pnf_list = 0; + config->phy_list = 0; + + config->pnf_connection_indication = &pnf_connection_indication_cb; + config->pnf_disconnect_indication = &pnf_disconnection_indication_cb; + config->pnf_param_resp = &pnf_param_resp_cb; + config->pnf_config_resp = &pnf_config_resp_cb; + config->pnf_start_resp = &pnf_start_resp_cb; + config->param_resp = ¶m_resp_cb; + config->config_resp = &config_resp_cb; + config->start_resp = &start_resp_cb; + config->vendor_ext = &vendor_ext_cb; + + config->user_data = &vnf; + + // To allow custom vendor extentions to be added to nfapi + config->codec_config.unpack_vendor_extension_tlv = &vnf_unpack_vendor_extension_tlv; + config->codec_config.pack_vendor_extension_tlv = &vnf_pack_vendor_extension_tlv; + + config->codec_config.unpack_p4_p5_vendor_extension = &vnf_unpack_p4_p5_vendor_extension; + config->codec_config.pack_p4_p5_vendor_extension = &vnf_pack_p4_p5_vendor_extension; + config->allocate_p4_p5_vendor_ext = &vnf_allocate_p4_p5_vendor_ext; + config->deallocate_p4_p5_vendor_ext = &vnf_deallocate_p4_p5_vendor_ext; + config->codec_config.allocate = &vnf_allocate; + config->codec_config.deallocate = &vnf_deallocate; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__); + pthread_create(&vnf_start_pthread, NULL, (void*)&vnf_start_thread, config); + NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Created VNF NFAPI start thread %s\n", __FUNCTION__); +} + +int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) +{ + nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config; + + dl_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! + + int retval = nfapi_vnf_p7_dl_config_req(p7_config, dl_config_req); + + dl_config_req->dl_config_request_body.number_pdcch_ofdm_symbols = 1; + dl_config_req->dl_config_request_body.number_dci = 0; + dl_config_req->dl_config_request_body.number_pdu = 0; + dl_config_req->dl_config_request_body.number_pdsch_rnti = 0; + + if (retval!=0) { + LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval); + } + return retval; +} + +int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req) +{ + nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config; + + tx_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! + + //LOG_D(PHY, "[VNF] %s() TX_REQ sfn_sf:%d number_of_pdus:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(tx_req->sfn_sf), tx_req->tx_request_body.number_of_pdus); + + int retval = nfapi_vnf_p7_tx_req(p7_config, tx_req); + + + if (retval!=0) { + LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval); + } else { + tx_req->tx_request_body.number_of_pdus = 0; + } + return retval; +} + +int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) { + nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config; + + hi_dci0_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! + + //LOG_D(PHY, "[VNF] %s() HI_DCI0_REQ sfn_sf:%d dci:%d hi:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(hi_dci0_req->sfn_sf), hi_dci0_req->hi_dci0_request_body.number_of_dci, hi_dci0_req->hi_dci0_request_body.number_of_hi); + + int retval = nfapi_vnf_p7_hi_dci0_req(p7_config, hi_dci0_req); + + if (retval!=0) { + LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval); + } else { + hi_dci0_req->hi_dci0_request_body.number_of_hi = 0; + hi_dci0_req->hi_dci0_request_body.number_of_dci = 0; + } + return retval; +} + +int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) { + + nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config; + + ul_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!! + + //LOG_D(PHY, "[VNF] %s() header message_id:%02x\n", __FUNCTION__, ul_config_req->header.message_id); + + //LOG_D(PHY, "[VNF] %s() UL_CONFIG sfn_sf:%d PDUs:%d rach_prach_frequency_resources:%d srs_present:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ul_config_req->sfn_sf), ul_config_req->ul_config_request_body.number_of_pdus, ul_config_req->ul_config_request_body.rach_prach_frequency_resources, ul_config_req->ul_config_request_body.srs_present); + + int retval = nfapi_vnf_p7_ul_config_req(p7_config, ul_config_req); + + if (retval!=0) { + LOG_E(PHY, "%s() Problem sending retval:%d\n", __FUNCTION__, retval); + } else { + // Reset number of PDUs so that it is not resent + ul_config_req->ul_config_request_body.number_of_pdus = 0; + ul_config_req->ul_config_request_body.rach_prach_frequency_resources = 0; + ul_config_req->ul_config_request_body.srs_present = 0; + } + return retval; +} diff --git a/nfapi/oai_integration/nfapi_vnf.h b/nfapi/oai_integration/nfapi_vnf.h new file mode 100644 index 0000000000..4ea26eda12 --- /dev/null +++ b/nfapi/oai_integration/nfapi_vnf.h @@ -0,0 +1,27 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#if !defined(NFAPI_VNF_H__) +#define NFAPI_VNF_H__ + +void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port); + +#endif diff --git a/nfapi/oai_integration/vendor_ext.h b/nfapi/oai_integration/vendor_ext.h new file mode 100644 index 0000000000..0622432260 --- /dev/null +++ b/nfapi/oai_integration/vendor_ext.h @@ -0,0 +1,67 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _VENDOR_EXT_H_ +#define _VENDOR_EXT_H_ + +#include "nfapi_interface.h" + +typedef enum { + P5_VENDOR_EXT_REQ = NFAPI_VENDOR_EXT_MSG_MIN, + P5_VENDOR_EXT_RSP, + + P7_VENDOR_EXT_REQ, + P7_VENDOR_EXT_IND + +} vendor_ext_message_id_e; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint16_t dummy1; + uint16_t dummy2; +} vendor_ext_p5_req; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint16_t error_code; +} vendor_ext_p5_rsp; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t dummy1; + uint16_t dummy2; +} vendor_ext_p7_req; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t error_code; +} vendor_ext_p7_ind; + +typedef struct { + nfapi_tl_t tl; + uint32_t dummy; +} vendor_ext_tlv_1; + +#define VENDOR_EXT_TLV_1_TAG 0xF001 + +typedef struct { + nfapi_tl_t tl; + uint32_t dummy; +} vendor_ext_tlv_2; + +#define VENDOR_EXT_TLV_2_TAG 0xF002 + +#endif // _VENDOR_EXT_ diff --git a/nfapi/open-nFAPI/.travis.yml b/nfapi/open-nFAPI/.travis.yml new file mode 100644 index 0000000000..ce2faea923 --- /dev/null +++ b/nfapi/open-nFAPI/.travis.yml @@ -0,0 +1,36 @@ + +env: + global: + # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created + # via the "travis encrypt" command using the project repo's public key + - secure: "oNj8JhGBN/zjzrAU7y2Nn/wxSxA/MDp2Y8fVLLp6fhx+y2mWdlMZhgCjeKSpdbGtroUnxErX1P8t+8EPz2+mMoq+G809Q9t7eJjd1+6nkVhEEfDXN83BmJkvIylC0/IKJiT2wCa8LzbdhpQUFyZ1Gk1WKZozAW5HotfFjm6/NFi/GX4uA7S0tU5E4yC3r4yqH9cLZ+arWMOEY/X0lrx0n6tLjDe921kFwkZQGFzAzrbXN2fZXKQ3xFcpREWEgEWsY7H2n4T7oJI3nEPY4P/4kvCjeQMjnlATEwtcciBiUbHRew4WWSTndF54crRlqFlzFcEf/Ouz27U/d2xYHJWcWNi88l+/qsb+V0uobwhiGUJGbVhf9IkgEO3tr/zbwkPDFrXpa/1xuSoc6jDm8i61gKQkcBhQsRFXlciPvwLhiL07gzeAfZD1Yke3tE+0geHPbEA0czzwtHe35jorAKYWsFXOXmcoK9t9SpnvBRFz6JuEsHPooafze43sTJg3qkgBszkU+U38CneeAVwo/uTA3Zw1ZrtOQv56v0UvAHze/VAF5z3rFJPl1oJl60OI8V5UBg4yIa2bySKhO//zwd4MGmsBpcWwDuu2BHUVasfk0vaetVxVVtdXG/2BuBP+IXinpJtI48NSFs6PT82dHz4cDF/iLDs0hPC6sbV258PY8F0=" + +language: cpp + +dist: trusty +sudo: required + +compiler: + - g++ + +before_install: + - sudo apt-get install doxygen + - sudo apt-get install libcunit1-dev + - sudo apt-get install libz-dev + - sudo apt-get install libsctp-dev + - sudo apt-get install libboost-all-dev + - autoreconf -i + +addons: + coverity_scan: + project: + name: cisco-open-nFAPI + version: 1.0 + description: Build submitted via Travis CI + notification_email: xxx@cisco.com + build_command_prepend: ./configure + build_command: make + branch_pattern: coverity_scan + +script: + - ./configure && make && make check diff --git a/openair2/RRM_4_RRC_LITE/ChangeLog b/nfapi/open-nFAPI/CHANGELOG.md old mode 100755 new mode 100644 similarity index 100% rename from openair2/RRM_4_RRC_LITE/ChangeLog rename to nfapi/open-nFAPI/CHANGELOG.md diff --git a/nfapi/open-nFAPI/LICENSE.md b/nfapi/open-nFAPI/LICENSE.md new file mode 100644 index 0000000000..5e0fd33cbb --- /dev/null +++ b/nfapi/open-nFAPI/LICENSE.md @@ -0,0 +1,201 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all +other entities that control, are controlled by, or are under common +control with that entity. For the purposes of this definition, +"control" means (i) the power, direct or indirect, to cause the +direction or management of such entity, whether by contract or +otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation +source, and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or +Object form, made available under the License, as indicated by a +copyright notice that is included in or attached to the work +(an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object +form, that is based on (or derived from) the Work and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. For the purposes +of this License, Derivative Works shall not include works that remain +separable from, or merely link (or bind by name) to the interfaces of, +the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including +the original version of the Work and any modifications or additions +to that Work or Derivative Works thereof, that is intentionally +submitted to Licensor for inclusion in the Work by the copyright owner +or by an individual or Legal Entity authorized to submit on behalf of +the copyright owner. For the purposes of this definition, "submitted" +means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, +and issue tracking systems that are managed by, or on behalf of, the +Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise +designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work, +where such license applies only to those patent claims licensable +by such Contributor that are necessarily infringed by their +Contribution(s) alone or by combination of their Contribution(s) +with the Work to which such Contribution(s) was submitted. If You +institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work +or a Contribution incorporated within the Work constitutes direct +or contributory patent infringement, then any patent licenses +granted to You under this License for that Work shall terminate +as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You +meet the following conditions: + +(a) You must give any other recipients of the Work or +Derivative Works a copy of this License; and + +(b) You must cause any modified files to carry prominent notices +stating that You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works +that You distribute, all copyright, patent, trademark, and +attribution notices from the Source form of the Work, +excluding those notices that do not pertain to any part of +the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its +distribution, then any Derivative Works that You distribute must +include a readable copy of the attribution notices contained +within such NOTICE file, excluding those notices that do not +pertain to any part of the Derivative Works, in at least one +of the following places: within a NOTICE text file distributed +as part of the Derivative Works; within the Source form or +documentation, if provided along with the Derivative Works; or, +within a display generated by the Derivative Works, if and +wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and +do not modify the License. You may add Your own attribution +notices within Derivative Works that You distribute, alongside +or as an addendum to the NOTICE text from the Work, provided +that such additional attribution notices cannot be construed +as modifying the License. + +You may add Your own copyright statement to Your modifications and +may provide additional or different license terms and conditions +for use, reproduction, or distribution of Your modifications, or +for any such Derivative Works as a whole, provided Your use, +reproduction, and distribution of the Work otherwise complies with +the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "{}" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + +Copyright {yyyy} {name of copyright owner} + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/nfapi/open-nFAPI/Makefile.am b/nfapi/open-nFAPI/Makefile.am new file mode 100644 index 0000000000..900cf2bbcf --- /dev/null +++ b/nfapi/open-nFAPI/Makefile.am @@ -0,0 +1,15 @@ +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS =common/ \ + sim_common/ \ + nfapi/ \ + pnf/ \ + vnf/ \ + nfapi/tests \ + pnf/tests \ + vnf/tests \ + pnf_sim/ \ + vnf_sim/ \ + integration_tests/ \ + docs/ \ + $(NULL) diff --git a/nfapi/open-nFAPI/README.md b/nfapi/open-nFAPI/README.md new file mode 100644 index 0000000000..f3132c78d6 --- /dev/null +++ b/nfapi/open-nFAPI/README.md @@ -0,0 +1,138 @@ +[![Build Status](https://travis-ci.org/cisco/open-nFAPI.svg?branch=master)](https://travis-ci.org/cisco/open-nFAPI) +[![Coverity Status](https://scan.coverity.com/projects/11791/badge.svg)](https://scan.coverity.com/projects/cisco-open-nfapi) + +# open-nFAPI + +Open-nFAPI is implementation of the Small Cell Forum's network functional API or nFAPI for short. +nFAPI defines a network protocol that is used to connect a Physical Network Function (PNF) +running LTE Layer 1 to a Virtual Network Function (VNF) running LTE layer 2 and above. The specification +can be found at http://scf.io/documents/082. + +The aim of open-nFAPI is to provide an open interface between LTE layer 1 and layer 2 to allow for +interoperability between the PNF and VNF & also to facilitate the sharing of PNF's between +different VNF's + +Open-nFAPI implements the P4, P5 and P7 interfaces as defined by the nFAPI specification. +* The P5 interface allows the VNF to query and configure the 'resources' of the PNF; i.e slice it into + 1 or more PHY instances. +* The P7 interface is used to send the subframe information between the PNF and VNF for a PHY instance +* The P4 interface allows the VNF to request the PNF PHY instance to perform measurements of the surrounding network + +The remaining interfaces are currently outside of the scope of this project. + +Supports release 082.09.05 of the nFAPI specification + +**The Small Cell Forum cordially requests that any derivative work that looks to +extend the nFAPI libraries use the specified vendor extension techniques, +so ensuring the widest interoperability of the baseline nFAPI specification +in those derivative works.** + +## Awards + +The Open-nFAPI project has won the Small Cell Forum Judges Choice award 2017. (http://www.smallcellforum.org/awards-2/winners-2017/) + +## Licensing + +The open-nFAPI libraries are release by CISCO under an Apache 2 license. See `LICENSE.md` file for details + +## Downloading + +The open-nFAPI project can be pulled from git hub + +``` +git clone https://github.com/cisco/open-nFAPI.git nfapi +``` + +The following dependencies are required. These are based on a fresh ubuntu installation. + +``` +sudo apt-get install autoconf +sudo apt-get install gcc +sudo apt-get install g++ +sudo apt-get install libtool +sudo apt-get install make +sudo apt-get install doxygen +sudo apt-get install libcunit1-dev +sudo apt-get install libz-dev +sudo apt-get install libsctp-dev +sudo apt-get install libboost-all-dev +``` + + + +## Building + +To build the open-nFAPI project + +``` +autoreconf -i +./configure +make +``` + +To run the unit and integration tests + +``` +make check +``` + +You may notice in the console output of the final integration tests the following + +``` +*** Missing subframe 123 125 +``` + +Out of the box the machine on which you are running has not be configured for real time operation as a result +the vnf may not be scheduled at the correct times and hence it may risk 'missing' subframe opportunities. This +warning indicates this has happened. + +## Running the simulator + +The vnf and pnf simulator can be run using the following commands. The pnf and vnf simulator support sourcing and sinking +data over udp. Review the xml configuration files for the details of the port and address to configure. Console logging will show +which address:port is being used + +Note : Pinning the simulators to unused cores will produce more consistent behaviour. + +Note : You may have to run the processes with sudo to be able to set the real time scheduling and priority + +### vnf simulator + +To run the vnf simulator you need to specify the port the vnf will listen for p5 connection request upon and also the xml configuration file + +``` +vnfsim +``` + +### pnf simulator + +To run the vnf simulator you need to specify the addrss & port the pnf will connect to the vnf on and also the xml configuration file + +``` +pnfsim
+``` + + +## Directory structure + +``` +docs doxgen documentation +common common code used by the nfapi libraries +nfapi the nfapi library including message definitions & encode/decode functions +pnf the pnf library for p4, p5, & p7 interfaces +vnf the vnf library for p4, p5, & p7 interfaces +sim_common common simulation for used by the vnf and pnf sim +vnf_sim a vnf simulator including a stub mac implementation +pnf_sim a pnf simualtor including a fapi interface defintion and stub implementation +xml xml configuration files for the vnf and pnf simulator +wireshark code for a wireshark dissector for the nFAPI protocol +``` + +## Coverity + +Coverity runs on the coverity-scan branch. Changes must be merged to the coverity-scan branch to be checked. + + +## eNB Integration - Open Air Interface + +The open-nFAPI implementation has been integrated with the Open Air Interface solution here (https://gitlab.eurecom.fr/oai/openairinterface5g) and is (at the time of writing) here (https://gitlab.eurecom.fr/daveprice/openairinterface5g/tree/nfapi-ru-rau-split). The open-nFAPI implementation is integrated with the source eNB implementation with any changes required applied as a patch on top of the baseline open-nFAPI library. Any extensions required must be implemented through the vendor extensions as specified by the Small Cell Forum documentation. Any integration wrapping of functionality must be done within the target environment as shown in the Open Air Interface implementation nfapi directory which is defined by the $NFAPI_DIR location at the top level. diff --git a/nfapi/open-nFAPI/common/Makefile.am b/nfapi/open-nFAPI/common/Makefile.am new file mode 100644 index 0000000000..3e3326ea2c --- /dev/null +++ b/nfapi/open-nFAPI/common/Makefile.am @@ -0,0 +1,31 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +AM_CPPFLAGS = -I$(top_srcdir)/common/public_inc -g -Wall -Werror + +noinst_LIBRARIES =libnfapi_common.a + +libnfapi_common_a_SOURCES = src/debug.c + +libnfapi_common_a_CFLAGS =$(AM_CFLAGS) + +lib_LTLIBRARIES =libnfapi_common.la + +libnfapi_common_la_SOURCES = src/debug.c + + + + diff --git a/nfapi/open-nFAPI/common/public_inc/debug.h b/nfapi/open-nFAPI/common/public_inc/debug.h new file mode 100644 index 0000000000..14f97a17f6 --- /dev/null +++ b/nfapi/open-nFAPI/common/public_inc/debug.h @@ -0,0 +1,51 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _DEBUG_H_ +#define _DEBUG_H_ + +/*! The trace levels used by the nfapi libraries */ +typedef enum nfapi_trace_level +{ + NFAPI_TRACE_ERROR = 1, + NFAPI_TRACE_WARN, + NFAPI_TRACE_NOTE, + NFAPI_TRACE_INFO, + + NFAPI_TRACE_LEVEL_MAX +} nfapi_trace_level_t; + +/*! The trace function pointer */ +typedef void (*nfapi_trace_fn_t)(nfapi_trace_level_t level, const char* format, ...); + +/*! Global trace function */ +extern nfapi_trace_fn_t nfapi_trace_g; + +/*! Global trace level */ +extern nfapi_trace_level_t nfapi_trace_level_g; + +/*! NFAPI trace macro */ +//#define NFAPI_TRACE(level, format, ...) { if(nfapi_trace_g && ((nfapi_trace_level_t)level <= nfapi_trace_level_g)) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); } +#define NFAPI_TRACE(level, format, ...) { if (nfapi_trace_g) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); } + +/*! Function to change the trace level + * \param new_level The modified trace level + */ + +void nfapi_set_trace_level(nfapi_trace_level_t new_level); + +#endif /* _DEBUG_H_ */ diff --git a/nfapi/open-nFAPI/common/src/debug.c b/nfapi/open-nFAPI/common/src/debug.c new file mode 100644 index 0000000000..a45d41d7d7 --- /dev/null +++ b/nfapi/open-nFAPI/common/src/debug.c @@ -0,0 +1,76 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define MAX_MSG_LENGTH 2096 +#define TRACE_HEADER_LENGTH 44 + +void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...); + +// initialize the trace function to 0 +void (*nfapi_trace_g)(nfapi_trace_level_t level, const char* format, ...) = &nfapi_trace_dbg; + +nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_INFO; +//nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_WARN; + +void nfapi_set_trace_level(nfapi_trace_level_t new_level) +{ + nfapi_trace_level_g = new_level; +} + +void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...) +{ + char trace_buff[MAX_MSG_LENGTH + TRACE_HEADER_LENGTH]; + uint32_t num_chars; + va_list p_args; + struct timeval tv; + pthread_t tid = pthread_self(); + + (void)gettimeofday(&tv, NULL); + + num_chars = (uint32_t)snprintf(trace_buff, TRACE_HEADER_LENGTH, "%04u.%06u: 0x%02x: %10u: ", ((uint32_t)tv.tv_sec) & 0x1FFF, (uint32_t)tv.tv_usec, (uint32_t)level, (uint32_t)tid); + + if (num_chars > TRACE_HEADER_LENGTH) + { + printf("trace_dbg: Error, num_chars is too large: %d", num_chars); + return; + } + + va_start(p_args, format); + if ((num_chars = (uint32_t)vsnprintf(&trace_buff[num_chars], MAX_MSG_LENGTH, format, p_args))) + { + if (level <= NFAPI_TRACE_WARN) + { + printf("%s", trace_buff); + } + printf("%s", trace_buff); + } + va_end(p_args); +} diff --git a/nfapi/open-nFAPI/configure.ac b/nfapi/open-nFAPI/configure.ac new file mode 100644 index 0000000000..fd3b387ee5 --- /dev/null +++ b/nfapi/open-nFAPI/configure.ac @@ -0,0 +1,45 @@ +AC_INIT([open-nFAPI], [1.0]) + +AC_CONFIG_MACRO_DIR([m4]) + +AM_INIT_AUTOMAKE([subdir-objects -Wall -Werror foreign serial-tests]) +AM_PROG_AR + +LT_INIT([shared static]) + +# Dependencies +AC_PROG_CC +AC_PROG_CXX +AC_PROG_AWK +AC_CONFIG_HEADERS([config.h]) + +AC_PROG_LIBTOOL + +AC_CHECK_FILE([/usr/include/CUnit/CUnit.h], + [CFLAGS_CUNIT=-I/usr/include/CUnit AC_SUBST(CFLAGS_CUNIT)], + [AC_MSG_NOTICE([Have cunit *************])]) + +# Need doxygen +AC_CHECK_PROGS([DOXYGEN], [doxygen]) +if test -z "$DOXYGEN"; + then AC_MSG_WARN([Doxygen not found - continuing without Doxygen support]) +fi +AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"])AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([docs/Doxyfile])]) + +AC_REQUIRE_AUX_FILE([tap-driver.sh]) + +AC_CONFIG_FILES([Makefile + sim_common/Makefile + common/Makefile + nfapi/Makefile + pnf/Makefile + vnf/Makefile + nfapi/tests/Makefile + pnf/tests/Makefile + vnf/tests/Makefile + pnf_sim/Makefile + vnf_sim/Makefile + integration_tests/Makefile + docs/Makefile +]) +AC_OUTPUT diff --git a/nfapi/open-nFAPI/docs/Doxyfile b/nfapi/open-nFAPI/docs/Doxyfile new file mode 100644 index 0000000000..9491727d2b --- /dev/null +++ b/nfapi/open-nFAPI/docs/Doxyfile @@ -0,0 +1,1720 @@ +# Doxyfile 1.7.4 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = open-nFAPI + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ../nfapi/public_inc ../pnf/public_inc ../vnf/public_inc ../docs/doxygen.h + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is adviced to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# If the HTML_TIMESTAMP tag is set to YES then the generated HTML documentation will contain the timesstamp. + +HTML_TIMESTAMP = NO + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the stylesheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the +# mathjax.org site, so you can quickly see the result without installing +# MathJax, but it is strongly recommended to install a local copy of MathJax +# before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called Helvetica to the output +# directory and reference it in all dot files that doxygen generates. +# When you want a differently looking font you can specify the font name +# using DOT_FONTNAME. You need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/nfapi/open-nFAPI/docs/Doxyfile.in b/nfapi/open-nFAPI/docs/Doxyfile.in new file mode 100644 index 0000000000..74d405ad00 --- /dev/null +++ b/nfapi/open-nFAPI/docs/Doxyfile.in @@ -0,0 +1,1720 @@ +# Doxyfile 1.7.4 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = @PACKAGE_NAME@ + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = @PACKAGE_VERSION@ + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = @top_srcdir@/nfapi/public_inc @top_srcdir@/pnf/public_inc @top_srcdir@/vnf/public_inc @top_srcdir@/docs/doxygen.h + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is adviced to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# If the HTML_TIMESTAMP tag is set to YES then the generated HTML documentation will contain the timesstamp. + +HTML_TIMESTAMP = NO + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the stylesheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the +# mathjax.org site, so you can quickly see the result without installing +# MathJax, but it is strongly recommended to install a local copy of MathJax +# before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called Helvetica to the output +# directory and reference it in all dot files that doxygen generates. +# When you want a differently looking font you can specify the font name +# using DOT_FONTNAME. You need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/nfapi/open-nFAPI/docs/Makefile.am b/nfapi/open-nFAPI/docs/Makefile.am new file mode 100644 index 0000000000..9530fa844d --- /dev/null +++ b/nfapi/open-nFAPI/docs/Makefile.am @@ -0,0 +1,35 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +if HAVE_DOXYGEN +directory = $(top_srcdir)/docs/man/man3/ + +dist_man_MANS = $(directory)/man_page_1.3 $(directory)/man_page_2.3 +$(directory)/man_page_1.3: doxyfile.stamp +$(directory)/man_page_2.3: doxyfile.stamp + +doxyfile.stamp: + $(DOXYGEN) Doxyfile + echo Timestamp > doxyfile.stamp + +CLEANFILES = doxyfile.stamp + +all-local: doxyfile.stamp +clean-local: + rm -rf $(top_srcdir)/docs/man + rm -rf $(top_srcdir)/docs/html + rm -rf $(top_srcdir)/docs/latex +endif diff --git a/nfapi/open-nFAPI/docs/doxygen.h b/nfapi/open-nFAPI/docs/doxygen.h new file mode 100644 index 0000000000..ae815e68d6 --- /dev/null +++ b/nfapi/open-nFAPI/docs/doxygen.h @@ -0,0 +1,327 @@ +/*! \mainpage Open Network Function Application Platform Interface (Open-nFAPI) + * + * \section intro_sec Introduction + * + * Open-nFAPI is implementation of the Small Cell Forum's network femto API or nFAPI for short. + * nFAPI defines a network protocol that is used to connect a Physical Network Function (PNF) + * running LTE Layer 1 to a Virtual Network Function (VNF) running LTE Layer 2 and above. The specification + * can be found at http://scf.io/documents/082. + * + * The aim of Open-nFAPI is to provide an open interface between LTE Layer 1 and Layer 2 to allow for + * interoperability between the PNF and VNF & also to facilitate the sharing of PNF's between + * different VNF's + * + * Open-nFAPI implements the P4, P5 and P7 interfaces as defined by the nFAPI specification. + * - The P5 interface allows the VNF to query and configure the 'resources' of the PNF; slicing it into + * 1 or more phy instances. + * - The P7 interface is used to send the subframe information between the PNF and VNF for 1 or more phy instances + * - The P4 interface allows the VNF to request the PNF phy instances to perform measurements of the surrounding network + * + * The remaining interfaces are currently outside of the scope of this project. + * + * The best place to start is by reviewing the detailed nFAPI call flow which can be \ref nfapi_call_flow "here" + * + * \section contrib Contibuting + * + * The Small Cell Forum cordially requests that any derivative work that looks to extend + * the nFAPI libraries use the specified vendor extension techniques, so ensuring + *the widest interoperability of the baseline nFAPI specification in those derivative works. + * + * \section install_sec Installation + * + * \subsection step1 Step 1: Opening the box + * + * etc... + * + * \section dir_struct Directory Structure + * \code + + * nfapi + * |- common Common functions for the nfapi project + * | |- src + * | |- public-inc + * |- nfapi The NFAPI lib + * | |- inc + * | |- src + * | |- public-inc Public interface for the nfapi library + * | |- tests Unit test for the nfapi lib + * |- pnf The PNF lib + * | |- inc + * | |- src + * | |- public-inc Public interface for the pnf library + * | |- tests Unit test for the pnf lib + * |- vnf The VNF lib + * | |- inc + * | |- src + * | |- public-inc Public interface for the vnf library + * | |- tests Unit test for the vnf lib + * |- sim_common Common functions for the nfapi simulators + * | |- inc + * | |- src + * |- pnf_sim The PNF simulator + * | |- inc + * | |- src + * |- vnf_sim The VNF simulator + * | |- inc + * | |- src + * |- integration_tests Integration tests that run both VNF & PNF simulators + * | |- inc + * | |- src + * |- docs Documentation + * |- xml Xml configuration for the simulator + + * \endcode + * \section building Building + * To build the nfapi project and run the unit test you will need to + * \code + * autoreconf -i + * ./configure + * make + * make check + * \endcode + * The following dependencies will be required + * - Boost. Need to build the simulators + * - STCP. Need to run the simulators + * - + * \section simulators Running the simulators + * Once you have build the nfapi project you can run the PNF/VNF simulators on either the same + * of seperate linux machines. + * + * To run the VNF from the vnf_sim directory. + * \code + * ./vnfsim 4242 ../xml/vnf_A.xml + * [MAC] Rx Data from 8891 + * [MAC] Tx Data to 10.231.16.80.8892 + * Calling nfapi_vnf_start + * 2035.854438: 0x04: 773068608: nfapi_vnf_start() + * 2035.854450: 0x04: 773068608: Starting P5 VNF connection on port 4242 + * 2035.854472: 0x04: 773068608: P5 socket created... 3 + * 2035.854478: 0x03: 773068608: VNF Setting the SCTP_INITMSG + * 2035.854481: 0x04: 773068608: IPV4 binding to port 4242 + * 2035.854485: 0x04: 773068608: bind succeeded..3. + * 2035.854497: 0x04: 773068608: listen succeeded... + * \endcode + * + * + * To run the PNF from the pnf_sim directory + * \code + * ./pnfsim 127.0.01 4242 ../xml/pnf_phy_1_A.xml + * nfapi_pnf_start + * Starting P5 PNF connection to VNF at 127.0.0.1:4242 + * Host address info 0 Family:IPV4 Address:127.0.0.1 + * PNF Setting the SCTP_INITMSG + * P5 socket created... + * Socket CONNECTED + * PNF_PARAM.request received + * [PNF_SIM] pnf param request + * PNF_CONFIG.request received + * [PNF_SIM] pnf config request + * .... and so on + * \endcode + * + * You can Ctrl-C to exit the simulators. + * + + */ + +/*! \page nfapi_call_flow NFAPI Call Flow + * + * \section seq_diag Sequence diagram + * + * The follow sequence digram show how the nFAPI api will be used to bring up + * the PNF and then the PNF PHY and initiate subframe message exchange + * The names of the CLIENT callbacks are placeholders for the functions that + * the CLIENT will provide. + * + * \msc + * + * width="1750"; + * FAPI, PNF_P7_CLIENT, PNF_P7_LIB, PNF_P5_CLIENT, PNF_P5_LIB, VNF_P5_LIB, VNF_P5_CLIENT, VNF_P7_LIB, VNF_P7_CLIENT, MAC; + * VNF_P5_CLIENT=>VNF_P5_LIB [label="nfapi_vnf_config_create", URL="\ref nfapi_vnf_config_create"]; + * VNF_P5_CLIENT=>VNF_P5_LIB [label="nfapi_vnf_start", URL="\ref nfapi_vnf_start"]; + * VNF_P5_LIB note VNF_P5_LIB [label="Listening for PNF connection"]; + * PNF_P5_CLIENT note PNF_P5_CLIENT [label="P9 has provided the address of the VNF"]; + * PNF_P5_CLIENT=>PNF_P5_LIB [label="nfapi_pnf_config_create", URL="\ref nfapi_pnf_config_create"]; + * PNF_P5_CLIENT=>PNF_P5_LIB [label="nfapi_pnf_start", URL="\ref nfapi_pnf_start"]; + * PNF_P5_LIB note PNF_P5_LIB [label="PNF STATE : PNF IDLE"]; + * PNF_P5_LIB->VNF_P5_LIB [label=""]; + * VNF_P5_LIB=>VNF_P5_CLIENT [label="pnf_connection_indication", URL="\ref nfapi_vnf_config::pnf_connection_indication"]; + * + * VNF_P5_LIB<=VNF_P5_CLIENT [label="nfapi_vnf_pnf_param_req", URL="\ref nfapi_vnf_pnf_param_req"]; + * VNF_P5_LIB->PNF_P5_LIB [label="PNF_PARAM.request"]; + * PNF_P5_LIB=>PNF_P5_CLIENT [label="pnf_param_request", URL="\ref nfapi_pnf_config::pnf_param_req"]; + * PNF_P5_LIB<=PNF_P5_CLIENT [label="nfapi_pnf_pnf_param_response", URL="\ref nfapi_pnf_pnf_param_resp"]; + * VNF_P5_LIB<-PNF_P5_LIB [label="PNF_PARAM.response"]; + * VNF_P5_LIB=>VNF_P5_CLIENT [label="pnf_param_response", URL="\ref nfapi_vnf_config::pnf_param_resp"]; + * + * VNF_P5_LIB<=VNF_P5_CLIENT [label="nfapi_vnf_pnf_config_req", URL="\ref nfapi_vnf_pnf_config_req"]; + * VNF_P5_LIB->PNF_P5_LIB [label="PNF_CONFIG.request"]; + * PNF_P5_LIB=>PNF_P5_CLIENT [label="pnf_config_request", URL="\ref nfapi_pnf_config::pnf_config_req"]; + * PNF_P5_LIB<=PNF_P5_CLIENT [label="nfapi_pnf_pnf_config_response", URL="\ref nfapi_pnf_pnf_config_resp"]; + * PNF_P5_LIB note PNF_P5_LIB [label="PNF STATE : PNF CONFIGURED"]; + * VNF_P5_LIB<-PNF_P5_LIB [label="PNF_CONFIG.response"]; + * VNF_P5_LIB=>VNF_P5_CLIENT [label="pnf_config_response", URL="\ref nfapi_vnf_config::pnf_config_resp"]; + * + * VNF_P5_LIB<=VNF_P5_CLIENT [label="nfapi_vnf_pnf_start_req", URL="\ref nfapi_vnf_pnf_start_req"]; + * VNF_P5_LIB->PNF_P5_LIB [label="PNF_START.request"]; + * PNF_P5_LIB=>PNF_P5_CLIENT [label="pnf_start_request", URL="\ref nfapi_pnf_config::pnf_start_req"]; + * PNF_P5_CLIENT=>FAPI [label=""]; + * FAPI note FAPI [label="FAPI STATE : IDLE"]; + * PNF_P5_LIB<=PNF_P5_CLIENT [label="nfapi_pnf_pnf_start_response", URL="\ref nfapi_pnf_pnf_start_resp"]; + * PNF_P5_LIB note PNF_P5_LIB [label="PNF STATE : PNF RUNNING"]; + * VNF_P5_LIB<-PNF_P5_LIB [label="PNF_START.response"]; + * VNF_P5_LIB=>VNF_P5_CLIENT [label="pnf_start_response", URL="\ref nfapi_vnf_config::pnf_param_resp"]; + * + * --- [ label="If vnf p7 instance not already running"]; + * VNF_P5_CLIENT=>VNF_P5_LIB [label="nfapi_vnf_allocate_phy", URL="\ref nfapi_vnf_allocate_phy"]; + * VNF_P5_CLIENT=>VNF_P7_CLIENT [label=""]; + * VNF_P7_CLIENT=>VNF_P7_LIB [label="nfapi_vnf_p7_config_create", URL="\ref nfapi_vnf_p7_config_create"]; + * VNF_P7_CLIENT=>VNF_P7_LIB [label="nfapi_vnf_p7_start", URL="\ref nfapi_vnf_p7_start"]; + * ---; + * + * VNF_P5_LIB<=VNF_P5_CLIENT [label="nfapi_vnf_param_request", URL="\ref nfapi_vnf_param_req"]; + * VNF_P5_LIB->PNF_P5_LIB [label="PARAM.request"]; + * PNF_P5_LIB=>PNF_P5_CLIENT [label="param_request", URL="\ref nfapi_pnf_config::param_req"]; + * PNF_P5_CLIENT=>FAPI [label="fapi_param_request"]; + * PNF_P5_CLIENT<=FAPI [label="fapi_param_response"]; + * PNF_P5_CLIENT=>PNF_P7_CLIENT [label=""]; + * PNF_P7_CLIENT=>PNF_P7_LIB [label="nfapi_pnf_p7_create", URL="\ref nfapi_pnf_p7_config_create"]; + * PNF_P7_CLIENT=>PNF_P7_LIB [label="nfapi_pnf_p7_start", URL="\ref nfapi_pnf_p7_start"]; + * PNF_P5_LIB<=PNF_P5_CLIENT [label="nfapi_pnf_param_response", URL="\ref nfapi_pnf_param_resp"]; + * VNF_P5_LIB<-PNF_P5_LIB [label="PARAM.response"]; + * VNF_P5_LIB=>VNF_P5_CLIENT [label="param_response", URL="\ref nfapi_vnf_config::param_resp"]; + * + * VNF_P5_LIB<=VNF_P5_CLIENT [label="nfapi_vnf_config_request", URL="\ref nfapi_vnf_config_req"]; + * VNF_P5_LIB->PNF_P5_LIB [label="CONFIG.request"]; + * PNF_P5_LIB=>PNF_P5_CLIENT [label="config_request", URL="\ref nfapi_pnf_config::config_req"]; + * PNF_P5_CLIENT=>FAPI [label="fapi_config_request"]; + * FAPI note FAPI [label="FAPI STATE : CONFIGURED"]; + * PNF_P5_CLIENT<=FAPI [label="fapi_config_response"]; + * PNF_P5_LIB<=PNF_P5_CLIENT [label="nfapi_pnf_config_response", URL="\ref nfapi_pnf_param_resp"]; + * VNF_P5_LIB<-PNF_P5_LIB [label="CONFIG.response"]; + * VNF_P5_LIB=>VNF_P5_CLIENT [label="config_response", URL="\ref nfapi_vnf_config::config_resp"]; + * + * VNF_P5_LIB<=VNF_P5_CLIENT [label="nfapi_vnf_start_request", URL="\ref nfapi_vnf_start_req"]; + * VNF_P5_LIB->PNF_P5_LIB [label="START.request"]; + * PNF_P5_LIB=>PNF_P5_CLIENT [label="start_request", URL="\ref nfapi_pnf_config::start_req"]; + * PNF_P5_CLIENT=>FAPI [label="fapi_start_request"]; + * FAPI note FAPI [label="FAPI STATE : RUNNING"]; + * FAPI note FAPI [label="FAPI will start sending subframe indications"]; + * + * --- [ label="For each 'phy' subframe"]; + * FAPI=>PNF_P7_CLIENT [label="fapi_subframe_indication"]; + * PNF_P7_CLIENT=>PNF_P7_LIB [label="nfapi_pnf_p7_subframe_ind", URL="\ref nfapi_pnf_p7_subframe_ind"]; + * ---; + * PNF_P7_CLIENT=>PNF_P5_CLIENT [label=""]; + * + * PNF_P5_LIB<=PNF_P5_CLIENT [label="nfapi_pnf_start_response", URL="\ref nfapi_pnf_start_resp"]; + * VNF_P5_LIB<-PNF_P5_LIB [label="START.response"]; + * VNF_P5_LIB=>VNF_P5_CLIENT [label="start_response", URL="\ref nfapi_vnf_config::start_resp"]; + * VNF_P5_CLIENT=>VNF_P7_CLIENT [label=""]; + * VNF_P7_CLIENT=>VNF_P7_LIB [label="nfapi_vnf_p7_add_pnf", URL="\ref nfapi_vnf_p7_add_pnf"]; + * + * VNF_P7_LIB->PNF_P7_LIB [label="DL_NODE_SYNC"]; + * VNF_P7_LIB<-PNF_P7_LIB [label="UL_NODE_SYNC"]; + * VNF_P7_LIB<-PNF_P7_LIB [label="TIMING_INFO"]; + * VNF_P7_LIB note VNF_P7_LIB [label="When sync is achieved"]; + * + * VNF_P7_LIB=>VNF_P7_CLIENT [label="sync_indication", URL="\ref nfapi_vnf_p7_config::sync_indication"]; + * + * --- [ label="For each 'vnf phy' subframe"]; + * VNF_P7_LIB=>VNF_P7_CLIENT [label="subframe_indication(tti=x)", URL="\ref nfapi_vnf_p7_config::subframe_indication"]; + * VNF_P7_CLIENT=>MAC [label="subframe_indication"]; + * VNF_P7_CLIENT<=MAC [label="dl_config_req"]; + * VNF_P7_CLIENT=>VNF_P7_LIB [label="nfapi_vnf_p7_dl_config_req", URL="\ref nfapi_vnf_p7_dl_config_req"]; + * VNF_P7_LIB->PNF_P7_LIB [label="DL_CONFIG.request"]; + * PNF_P7_LIB note PNF_P7_LIB [label="Store in subframe buffer for tti x"]; + * VNF_P7_CLIENT<=MAC [label="ul_config_req"]; + * VNF_P7_CLIENT=>VNF_P7_LIB [label="nfapi_vnf_p7_ul_config_req", URL="\ref nfapi_vnf_p7_ul_config_req"]; + * VNF_P7_LIB->PNF_P7_LIB [label="UL_CONFIG.request"]; + * PNF_P7_LIB note PNF_P7_LIB [label="Store in subframe buffer for tti x"]; + * VNF_P7_CLIENT<=MAC [label="hi_dci0_req"]; + * VNF_P7_CLIENT=>VNF_P7_LIB [label="nfapi_vnf_p7_hi_dci0_req", URL="\ref nfapi_vnf_p7_hi_dci0_req"]; + * VNF_P7_LIB->PNF_P7_LIB [label="HI_DCI0.request"]; + * PNF_P7_LIB note PNF_P7_LIB [label="Store in subframe buffer for tti x"]; + * VNF_P7_CLIENT<=MAC [label="tx_req"]; + * VNF_P7_CLIENT=>VNF_P7_LIB [label="nfapi_vnf_p7_tx_req", URL="\ref nfapi_vnf_p7_tx_req"]; + * VNF_P7_LIB->PNF_P7_LIB [label="TX.request"]; + * PNF_P7_LIB note PNF_P7_LIB [label="Store in subframe buffer for tti x"]; + * ---; + * + * + * --- [ label="For each 'phy' subframe"]; + * + * FAPI=>PNF_P7_CLIENT [label="harq_indication"]; + * PNF_P7_CLIENT=>PNF_P7_LIB [label="nfapi_pnf_p7_harq_ind", URL="\ref nfapi_pnf_p7_harq_ind"]; + * PNF_P7_LIB->VNF_P7_LIB [label="HARQ.ind"]; + * VNF_P7_LIB=>VNF_P7_CLIENT [label="harq_ind", URL="\ref nfapi_vnf_p7_config::harq_indication"]; + * VNF_P7_CLIENT=>MAC [label="harq_ind"]; + * + * FAPI=>PNF_P7_CLIENT [label="subframe_indication(tti=x)"]; + * PNF_P7_CLIENT=>PNF_P7_LIB [label="nfapi_pnf_p7_subframe_ind", URL="\ref nfapi_pnf_p7_subframe_ind"]; + * PNF_P7_LIB note PNF_P7_LIB [label="Send data from subframe buffer for tti x"]; + * PNF_P7_LIB=>PNF_P7_CLIENT [label="dl_config_req", URL="\ref nfapi_pnf_p7_config::dl_config_req"]; + * PNF_P7_CLIENT=>FAPI [label="dl_config_req"]; + * PNF_P7_LIB=>PNF_P7_CLIENT [label="ul_config_req", URL="\ref nfapi_pnf_p7_config::ul_config_req"]; + * PNF_P7_CLIENT=>FAPI [label="ul_config_req"]; + * PNF_P7_LIB=>PNF_P7_CLIENT [label="hi_dci0_req", URL="\ref nfapi_pnf_p7_config::hi_dci0_req"]; + * PNF_P7_CLIENT=>FAPI [label="hi_dci0_req"]; + * PNF_P7_LIB=>PNF_P7_CLIENT [label="tx_req", URL="\ref nfapi_pnf_p7_config::tx_req"]; + * PNF_P7_CLIENT=>FAPI [label="tx_req"]; + * ---; + * + * \endmsc + * + * \section seq_diag_bca BCA + * + * -# The VNF_P5_CLIENT is created. If it left to the VRAN partner to define how that is done. The client is responsiable to creation of the thread with the correct priorities within the wider system. + * -# The VNF_P5_CLIENT creates and initializes the VNF_P5_LIB (nfapi_vnf_config_create & nfapi_vnf_start) providing the address that it should listen on for incoming SCTP connections. It is expected that this would be provided by some VNF management system. The VNF_P5_CLIENT also provides information on the callbacks that the VNF_P5_LIB will use to inform the VNF_P5_CLIENT of the received messages + * \code + * nfapi_vnf_config_t* vnf_config = nfapi_vnf_config_create(); + * vnf_config->pnf_connection_indication = &pnf_connection_indication; + * vnf_config->pnf_param_resp = &pnf_param_resp; + * nfapi_vnf_start(vnf_config); + * \endcode + * -# It is FFS how the address information of the VNF P5 is passed to the PNF over P9, but assuming that has been done + * -# The PNF_P5_CLIENT is created and then creates the PNF_P5_LIB (nfapi_pnf_init & nfapi_pnf_start) passing the address of the VNF to connect to. The PNF_P5_CLIENT also provides information on the callbacks that the PNF_P5_LIB will use to inform the PNF_P5_CLIENT of the received messages + * \code + * nfapi_pnf_config_t* pnf_config = nfapi_pnf_config_create(); + * pnf_config->pnf_param_req = &pnf_param_req; + * nfapi_pnf_start(pnf_config); + * \endcode + * -# The PNF_P5_LIB attempts to establish connection to the VNF_P5 endpoint + * -# The VNF_P5_LIB receives the STCP connection request and indicates this to the VNF_P5_CLIENT (pnf_connection_indication). The VNF_P5_CLIENT can decide to accept or reject the connection. + * \code + * int pnf_connection_indication(nfapi_vnf_config_t* config, int p5_idx) { + * // send the PNF_PARAM.request + * nfapi_pnf_param_request_t req; + * memset(&req, 0, sizeof(req)); + * req.header.message_id = NFAPI_PNF_PARAM_REQUEST; + * nfapi_vnf_pnf_param_req(config, p5_idx, req); + * return 0; + * } + * \endcode + + * -# The VNF and PNF then proceed to exchange the NFAPI PNF messages (PNF_PARAM, PNF_CONFIG and PNF_START). At each stage the LIB’s invoke callbacks on the CLIENT’s for them to handle message the return the appropriate response. + * -# Finally the VNF will send the PNF_START.req which will invoke the PNF_P5_CLIENT nfapi_pnf_start_request callback. This is the point at which it is expect that the PNF_CLIENT will create the FAPI module. The PNF_P5_CLIENT will need to perform the translation between NFAPI structures and vendor specific FAPI structures for messages sent between the PNF_P5_LIB and the FAPI interface. + * -# The PNF_START.response will sent back to the VNF and at this point the VNF_P5_CLIENT will need to decide which VNF_P7 instance will handle the P7 connection. i.e. it needs to determine the IP address and port number of the P7 VNF instance. + * -# A new VNF_P7_CLIENT & VNF_P7_LIB should be configured and started if necessary. + * -# The VNF_P5 will then send the PARAM.request to the PNF_P5 which will forward it onto the FAPI interface. This PARAM.request includes the VNF_P7 address. The PNF_P7_CLIENT must decide on the PNF P7 address. This information is used to create and initialize the PNF_P7_LIB. The PNF_P7 address is then returned by the PNF_P5 to the VNF_P5 in the PARAM.response. + * -# The VNF_P5 will then exchange with the PNF_P5 the CONFIG.request/response which will be used to configure the PNF FAPI instance. + * -# The VNF_P5 will then decide to start the PNF_P7 by sending the START.request. + * -# The PNF_P5_CLIENT need to send the start request to the FAPI instance. The response which is the start of subframe indications from the FAPI. In receipt of the first subframe indication the PNF_P5_CLIENT will send the START.response to the VNF_P5 via the PNF_P5_LIB + * -# The FAPI subframe indications should be forwarded to the PNF_P7_LIB by the PNF_P7_CLIENT. Until the VNF_P7 instance has sent the subframe configuration messages (dl_config, ul_config, etc) the PNF_P7_LIB will send ‘dummy’ subframe configuration messages. The contents of which are configurable by the PNF_P7_CLIENT. + * -# When the VNF_P5_CLIENT receives the START.response it will need to ‘communicate’ with the VNF_P7_CLIENT to inform it that the PNF_P7 instance has started. The VNF_P7_CLIENT will call the nfapi_vnf_P7_add_pnf function passing the address details of the PNF_P7 instance. + * -# The VNF_P7_LIB will then start the sync procedure to establish sub frame synchronization between the PNF_P7 and VNF_P7 instances. This involves sending the DL_NODE_SYNC and UL_NODE_SYNC to determine network latency and PNF processing latency to be able to request MAC generate sub frames in advance on when they are required by the FAPI interface. + * -# When sync is achieved the VNF_P7_LIB will send the nfapi_sync_indication to the VNF_P7_CLIENT. + * -# The VNF_P7_LIB will then start issuing sub frame indications to the VNF_P7_CLIENT. The logical intent is that they indications are sent every millisecond. However due to the scheduling jitter that may be seen by the VNF these subframe indications may be less than or more than 1ms apart. How this is handled is one of the critical functions of the VNF_P7_LIB and may require specialization or requirements on the VNF environment i.e. CPU pinning. + * -# The VNF_P7_LIB will send the subframe_indication to the VNF_P7_CLIENT for ‘x’ subframe’s inadvance of the current TTI at the PNF. The delta ‘x’ will be determined by the sync procedure and how far in advance the FAPI needs to receive messages before RF transmission. + * -# The VNF_P7_CLIENT is then responsible for communicating to the MAC layer to prepare the dl_config_request, ul_config_request, hi_dci0_request, tx_req in a timely manner and sending them to the VNF_P7_LIB + * -# The VNF_P7_LIB will send them to the VNF_P7_LIB. + * -# The PNF_P7_LIB will store these messages in a subframe buffer or playout buffer in advance of when they are required by FAPI. + * -# The PNF_P7_LIB will monitor to see if these messages arrive too late and if they do trigger a TIMING_INFO response to the VNF_P7_LIB to reassess if the sync is still valid. + * -# As some time in the future the FAPI will send a subframe indication for the TTI that the VNF_P7_LIB had previously requested. + * -# The PNF_P7_LIB will then use the messages in the subframe buffer and send them too the FAPI interface for transmission. The PNF_P7_CLIENT will need to perform the translation between NFAPI structure and vendor specific FAPI structures + * -# This subframe exchange will continue and allow high layer MAC and RRC function to bringup the cell and connect UE’s + + */ diff --git a/nfapi/open-nFAPI/integration_tests/Makefile.am b/nfapi/open-nFAPI/integration_tests/Makefile.am new file mode 100644 index 0000000000..2413590182 --- /dev/null +++ b/nfapi/open-nFAPI/integration_tests/Makefile.am @@ -0,0 +1,29 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +#vnf unit test +AM_CPPFLAGS = -I../nfapi/inc -I../nfapi/public_inc -I../common/public_inc -I../vnf/public_inc $(CFLAGS_CUNIT) -Wall -Werror + +export LD_LIBRARY_PATH=/opt/gcc-4.7.3/lib +check_PROGRAMS= nfapi_integration_tests +nfapi_integration_tests_SOURCES = main.cpp ../common/src/debug.c +nfapi_integration_tests_LDADD= -L$(libdir) -lpthread -lrt -lcunit + + + +LOG_DRIVER = $(top_srcdir)/tap-driver.sh +TESTS=nfapi_integration_tests +EXTRA_DIST=$(TESTS) diff --git a/nfapi/open-nFAPI/integration_tests/main.cpp b/nfapi/open-nFAPI/integration_tests/main.cpp new file mode 100644 index 0000000000..83c48afec3 --- /dev/null +++ b/nfapi/open-nFAPI/integration_tests/main.cpp @@ -0,0 +1,269 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CUnit.h" +#include "Basic.h" +#include "Automated.h" + +#include +#include +#include +#include + +int start_vnf_proc(int port) +{ + char port_str[10]; + sprintf(port_str, "%d", port); + + const char *argv[] = {"vnfsim", port_str, "../xml/vnf_A.xml", NULL}; + int pid = fork(); + + if(pid == 0) + { + int result = execv("../vnf_sim/vnfsim", (char* const*)argv); //, env_args); + if(result == -1) + { + printf("Failed to exec vnf process %d\n", errno); + } + exit(0); + } + else + { + return pid; + } +} + +int start_pnf_proc(const char* addr, int port, const char* file) +{ + char port_str[10]; + sprintf(port_str, "%d", port); + + char filename[256]; + sprintf(filename, "../xml/%s", file); + + const char * argv[] = {"pnfsim", addr, port_str, filename, NULL}; + int pid = fork(); + + if(pid == 0) + { + int result = execv("../pnf_sim/pnfsim", (char* const*)argv); //, env_args); + if(result == -1) + { + printf("Failed to exec pnf process %d\n", errno); + } + exit(0); + } + else + { + return pid; + } +} + +int kill_proc(int pid) +{ + kill(pid, SIGKILL); + + int status; + int waitpid_result = waitpid(pid, &status, 0); + + return waitpid_result; +} + + +void test_1() +{ + + int pnf_port = 5655; + const char* pnf_addr = "localhost"; + + printf("**** starting vnf *****\n"); + int vnf_pid = start_vnf_proc(pnf_port); + + printf("**** starting pnf *****\n"); + int pnf1_pid = start_pnf_proc(pnf_addr, pnf_port, "pnf_phy_1_A.xml"); + + + sleep(10); + + printf ("*** Terminating ****\n"); + kill_proc(vnf_pid); + kill_proc(pnf1_pid); +} +void test_1a() +{ + + int pnf_port = 5655; + const char* pnf_addr = "localhost"; + + printf("**** starting vnf *****\n"); + int vnf_pid = start_vnf_proc(pnf_port); + + printf("**** starting pnf *****\n"); + int pnf1_pid = start_pnf_proc(pnf_addr, pnf_port, "pnf_phy_2_A.xml"); + + + sleep(10); + + printf ("*** Terminating ****\n"); + kill_proc(vnf_pid); + kill_proc(pnf1_pid); +} + + +void test_2() +{ + int pnf_port = 5655; + const char* pnf_addr = "127.0.0.1"; + + int vnf_pid = start_vnf_proc(pnf_port); + sleep(2); + + int pnf1_pid = start_pnf_proc(pnf_addr, pnf_port, "pnf_phy_1_A.xml"); + int pnf2_pid = start_pnf_proc(pnf_addr, pnf_port, "pnf_phy_1_A.xml"); + + sleep(2); + + kill_proc(pnf2_pid); + kill_proc(pnf1_pid); + kill_proc(vnf_pid); +} + +void test_32() +{ + int pnf_count = 32; + int pnf_pid[pnf_count]; + + int pnf_port = 5655; + const char* pnf_addr = "127.0.0.1"; + + int vnf_pid = start_vnf_proc(pnf_port); + sleep(2); + + for(int i = 0; i < pnf_count; ++i) + { + pnf_pid[i] = start_pnf_proc(pnf_addr, pnf_port, "pnf_phy_1_A.xml"); + } + + sleep(5); + + printf ("*** Terminating pnfs\n"); + + for(int i = 0; i < pnf_count; ++i) + { + kill_proc(pnf_pid[i]); + } + printf ("*** Terminating vnf\n"); + kill_proc(vnf_pid); +} + + +int init_suite() +{ + return 0; +} + +int clean_suite() +{ + return 0; +} + +int main ( void ) +{ + CU_pSuite pSuite = NULL; + + /* initialize the CUnit test registry */ + if ( CUE_SUCCESS != CU_initialize_registry() ) + return CU_get_error(); + + /* add a suite to the registry */ + pSuite = CU_add_suite( "integration_test_suite", init_suite, clean_suite ); + if ( NULL == pSuite ) + { + CU_cleanup_registry(); + return CU_get_error(); + } + + //(NULL == CU_add_test(pSuite, "vnf_test_start_connect_2", vnf_test_start_connect_2)) + /* add the tests to the suite */ + if ( (NULL == CU_add_test(pSuite, "test_1a", test_1a)) +// (NULL == CU_add_test(pSuite, "test_2", test_2)) || +// (NULL == CU_add_test(pSuite, "test_32", test_32)) + ) + { + CU_cleanup_registry(); + return CU_get_error(); + } + + // Run all tests using the basic interface + CU_basic_set_mode(CU_BRM_VERBOSE); + CU_set_output_filename("vnf_unit_test_results.xml"); + CU_basic_run_tests(); + + CU_pSuite s = CU_get_registry()->pSuite; + int count = 0; + while(s) + { + CU_pTest t = s->pTest; + while(t) + { + count++; + t = t->pNext; + } + s = s->pNext; + } + + printf("%d..%d\n", 1, count); + + + + s = CU_get_registry()->pSuite; + count = 1; + while(s) + { + CU_pTest t = s->pTest; + while(t) + { + int pass = 1; + CU_FailureRecord* failures = CU_get_failure_list(); + while(failures) + { + if(strcmp(failures->pSuite->pName, s->pName) == 0 && + strcmp(failures->pTest->pName, t->pName) == 0) + { + pass = 0; + failures = 0; + } + else + { + failures = failures->pNext; + } + } + + if(pass) + printf("ok %d - %s:%s\n", count, s->pName, t->pName); + else + printf("not ok %d - %s:%s\n", count, s->pName, t->pName); + + count++; + t = t->pNext; + } + s = s->pNext; + } + + CU_cleanup_registry(); + return CU_get_error(); + +} diff --git a/nfapi/open-nFAPI/nfapi/Makefile.am b/nfapi/open-nFAPI/nfapi/Makefile.am new file mode 100644 index 0000000000..853ee9ff80 --- /dev/null +++ b/nfapi/open-nFAPI/nfapi/Makefile.am @@ -0,0 +1,30 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +AUTOMAKE_OPTIONS=subdir-objects +AM_CPPFLAGS = -I$(top_srcdir)/nfapi/inc -I$(top_srcdir)/nfapi/public_inc -I$(top_srcdir)/common/public_inc -I$(top_srcdir)/pnf/public_inc $(BOOST_CPPFLAGS) -Wall -Werror -g + +noinst_LIBRARIES = libnfapi.a + +libnfapi_a_SOURCES = src/nfapi.c src/nfapi_p5.c src/nfapi_p7.c src/nfapi_p4.c +libnfapi_a_CFLAGS =$(AM_CFLAGS) + +lib_LTLIBRARIES = libnfapi.la +libnfapi_la_SOURCES = src/nfapi.c src/nfapi_p5.c src/nfapi_p7.c src/nfapi_p4.c + + +LDADD= ../pnf/src/libnfapi_pnf.a ../vnf/src/libnfapi_vnf.a ../common/bin/libnfapi_common.a + diff --git a/nfapi/open-nFAPI/nfapi/inc/nfapi.h b/nfapi/open-nFAPI/nfapi/inc/nfapi.h new file mode 100644 index 0000000000..65ad4dd160 --- /dev/null +++ b/nfapi/open-nFAPI/nfapi/inc/nfapi.h @@ -0,0 +1,91 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _NFAPI_H_ +#define _NFAPI_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +// todo : move to public_inc so can be used by vendor extensions + +#define MAX_BAD_TAG 3 + +uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end); +uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end); +uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end); +uint8_t pushs16(int16_t in, uint8_t **out, uint8_t *end); +uint8_t push32(uint32_t in, uint8_t **out, uint8_t *end); +uint8_t pushs32(int32_t in, uint8_t **out, uint8_t *end); + +uint8_t pull8(uint8_t **in, uint8_t *out, uint8_t *end); +uint8_t pulls8(uint8_t **in, int8_t *out, uint8_t *end); +uint8_t pull16(uint8_t **in, uint16_t *out, uint8_t *end); +uint8_t pulls16(uint8_t **in, int16_t *out, uint8_t *end); +uint8_t pull32(uint8_t **in, uint32_t *out, uint8_t *end); +uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end); + + +uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end); +uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end); +uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end); + +uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end); +uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end); +uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end); + +typedef uint8_t (*pack_array_elem_fn)(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end); +uint8_t packarray(void* array, uint16_t elem_size, uint16_t max_count, uint16_t count, uint8_t **ppWritePackedMsg, uint8_t *end, pack_array_elem_fn fn); + +typedef uint8_t (*unpack_array_elem_fn)(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end); +uint8_t unpackarray(uint8_t **ppReadPackedMsg, void* array, uint16_t elem_size, uint16_t max_count, uint16_t count, uint8_t *end, unpack_array_elem_fn fn); + +uint8_t pack_tl(nfapi_tl_t *tl, uint8_t **ppWritePackedMsg, uint8_t *end); +uint8_t unpack_tl(uint8_t **ppReadPackedMsg, nfapi_tl_t *tl, uint8_t *end); + +typedef uint8_t (*pack_tlv_fn)(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end); +uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end, pack_tlv_fn fn); + +uint32_t pack_vendor_extension_tlv(nfapi_tl_t* ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config); +int unpack_vendor_extension(nfapi_tl_t* tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config, nfapi_tl_t** ve_tlv); + +typedef uint8_t (*unpack_tlv_fn)(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end); +typedef struct +{ + uint16_t tag; + void* tlv; + unpack_tlv_fn unpack_func; +} unpack_tlv_t; + +int unpack_tlv_list(unpack_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t* packedMsgEnd, nfapi_p4_p5_codec_config_t* config, nfapi_tl_t** ve); + +uint32_t pack_p7_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config); +typedef uint8_t (*unpack_p7_tlv_fn)(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t*); +typedef struct +{ + uint16_t tag; + void* tlv; + unpack_p7_tlv_fn unpack_func; +} unpack_p7_tlv_t; +int unpack_p7_tlv_list(unpack_p7_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t* packedMsgEnd, nfapi_p7_codec_config_t* config, nfapi_tl_t** ve); + +#if defined(__cplusplus) +} +#endif + +#endif /* _NFAPI_H_ */ diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h new file mode 100644 index 0000000000..f665d11c89 --- /dev/null +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h @@ -0,0 +1,3855 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _NFAPI_INTERFACE_H_ +#define _NFAPI_INTERFACE_H_ + +#include "stddef.h" + +// Constants - update based on implementation +#define NFAPI_MAX_PHY_RF_INSTANCES 2 +#define NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH 16 +#define NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH 3 +#define NFAPI_MAX_NUM_RF_BANDS 16 + +// The following definition control the size of arrays used in the interface. +// These may be changed if desired. They are used in the encoder to make sure +// that the user has not specified a 'count' larger than the max array, and also +// used by the decoder when decode an array. If the 'count' received is larger +// than the array it is to be stored in the decode fails. +#define NFAPI_MAX_NUM_ANTENNAS 8 +#define NFAPI_MAX_NUM_SUBBANDS 13 +#define NFAPI_MAX_BF_VECTORS 8 +#define NFAPI_MAX_CC 1 +#define NFAPI_MAX_NUM_PHYSICAL_ANTENNAS 8 +#define NFAPI_MAX_RSSI 8 +#define NFAPI_MAX_PSC_LIST 32 +#define NFAPI_MAX_PCI_LIST 32 +#define NFAPI_MAX_CARRIER_LIST 32 +#define NFAPI_MAX_ARFCN_LIST 128 +#define NFAPI_MAX_LTE_CELLS_FOUND 8 +#define NFAPI_MAX_UTRAN_CELLS_FOUND 8 +#define NFAPI_MAX_GSM_CELLS_FOUND 8 +#define NFAPI_MAX_NB_IOT_CELLS_FOUND 8 +#define NFAPI_MAX_SI_PERIODICITY 8 +#define NFAPI_MAX_SI_INDEX 8 +#define NFAPI_MAX_MIB_LENGTH 32 +#define NFAPI_MAX_SIB_LENGTH 256 +#define NFAPI_MAX_SI_LENGTH 256 +#define NFAPI_MAX_OPAQUE_DATA 64 +#define NFAPI_MAX_NUM_SCHEDULED_UES 8 // Used in the TPM structure +#define NFAPI_MAX_PNF_PHY 5 +#define NFAPI_MAX_PNF_PHY_RF_CONFIG 5 +#define NFAPI_MAX_PNF_RF 5 +#define NFAPI_MAX_NMM_FREQUENCY_BANDS 32 +#define NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS 100 +#define NFAPI_MAX_UL_DL_CONFIGURATIONS 5 +#define NFAPI_MAX_CSI_RS_RESOURCE_CONFIG 4 +#define NFAPI_MAX_ANTENNA_PORT_COUNT 8 +#define NFAPI_MAX_EPDCCH_PRB 8 +#define NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS 8 +#define NFAPI_MAX_NUMBER_ACK_NACK_TDD 8 +#define NFAPI_MAX_RO_DL 8 + +#define NFAPI_HEADER_LENGTH 8 +#define NFAPI_P7_HEADER_LENGTH 16 + +#define NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE 0xF000 +#define NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE 0xFFFF + +#define NFAPI_VERSION_3_0_11 0x000 +#define NFAPI_VERSION_3_0_12 0x001 + +// The IANA agreed port definition of the P5 SCTP VNF enpoint +// http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?search=7701 +#define NFAPI_P5_SCTP_PORT 7701 + +typedef unsigned int uint32_t; +typedef unsigned short uint16_t; +typedef unsigned char uint8_t; +typedef signed int int32_t; +typedef signed short int16_t; +typedef signed char int8_t; + +typedef struct { + uint16_t phy_id; + uint16_t message_id; + uint16_t message_length; + uint16_t spare; +} nfapi_p4_p5_message_header_t; + +typedef struct { + uint16_t phy_id; + uint16_t message_id; + uint16_t message_length; + uint16_t m_segment_sequence; /* This consists of 3 fields - namely, M, Segement & Sequence number*/ + uint32_t checksum; + uint32_t transmit_timestamp; +} nfapi_p7_message_header_t; + +#define NFAPI_PHY_ID_NA 0 + +//#define NFAPI_P7_GET_MORE(_mss) ( ((_mss) & 0x80) >> 7 ) +//#define NFAPI_P7_GET_SEGMENT(_mss) ( ((_mss) & 0x70) >> 4 ) +#define NFAPI_P7_GET_MORE(_mss) ( ((_mss) & 0x8000) >> 15 ) +#define NFAPI_P7_GET_SEGMENT(_mss) ( ((_mss) & 0x7F00) >> 8 ) +#define NFAPI_P7_GET_SEQUENCE(_mss) ( (_mss) & 0x00FF ) +#define NFAPI_P7_SET_MSS(_more, _segm, _sequ) ( (((_more) & 0x1) << 7) | (((_segm) & 0x7) << 4) | ((_sequ) & 0xF) ) + +typedef struct { + uint16_t tag; + uint16_t length; +} nfapi_tl_t; +#define NFAPI_TAG_LENGTH_PACKED_LEN 4 + +// Convenience methods to convert between SFN/SFN formats +#define NFAPI_SFNSF2DEC(_sfnsf) ((((_sfnsf) >> 4) * 10) + ((_sfnsf) & 0xF)) +#define NFAPI_SFNSFDEC2SFNSF(_sfnsf_dec) ((((_sfnsf_dec) / 10) << 4) | (((_sfnsf_dec) - (((_sfnsf_dec) / 10) * 10)) & 0xF)) + +#define NFAPI_SFNSF2SFN(_sfnsf) ((_sfnsf) >> 4) +#define NFAPI_SFNSF2SF(_sfnsf) ((_sfnsf) & 0xF) + +#define NFAPI_MAX_SFNSFDEC 10240 + +typedef nfapi_tl_t* nfapi_vendor_extension_tlv_t; + + +// nFAPI Message IDs +typedef enum { + NFAPI_DL_CONFIG_REQUEST = 0x0080, + NFAPI_UL_CONFIG_REQUEST, + NFAPI_SUBFRAME_INDICATION, + NFAPI_HI_DCI0_REQUEST, + NFAPI_TX_REQUEST, + NFAPI_HARQ_INDICATION, + NFAPI_CRC_INDICATION, + NFAPI_RX_ULSCH_INDICATION, + NFAPI_RACH_INDICATION, + NFAPI_SRS_INDICATION, + NFAPI_RX_SR_INDICATION, + NFAPI_RX_CQI_INDICATION, + NFAPI_LBT_DL_CONFIG_REQUEST, + NFAPI_LBT_DL_INDICATION, + NFAPI_NB_HARQ_INDICATION, + NFAPI_NRACH_INDICATION, + + NFAPI_PNF_PARAM_REQUEST = 0x0100, + NFAPI_PNF_PARAM_RESPONSE, + NFAPI_PNF_CONFIG_REQUEST, + NFAPI_PNF_CONFIG_RESPONSE, + NFAPI_PNF_START_REQUEST, + NFAPI_PNF_START_RESPONSE, + NFAPI_PNF_STOP_REQUEST, + NFAPI_PNF_STOP_RESPONSE, + NFAPI_PARAM_REQUEST, + NFAPI_PARAM_RESPONSE, + NFAPI_CONFIG_REQUEST, + NFAPI_CONFIG_RESPONSE, + NFAPI_START_REQUEST, + NFAPI_START_RESPONSE, + NFAPI_STOP_REQUEST, + NFAPI_STOP_RESPONSE, + NFAPI_MEASUREMENT_REQUEST, + NFAPI_MEASUREMENT_RESPONSE, + + NFAPI_UL_NODE_SYNC = 0x0180, + NFAPI_DL_NODE_SYNC, + NFAPI_TIMING_INFO, + + + NFAPI_RSSI_REQUEST = 0x0200, + NFAPI_RSSI_RESPONSE, + NFAPI_RSSI_INDICATION, + NFAPI_CELL_SEARCH_REQUEST, + NFAPI_CELL_SEARCH_RESPONSE, + NFAPI_CELL_SEARCH_INDICATION, + NFAPI_BROADCAST_DETECT_REQUEST, + NFAPI_BROADCAST_DETECT_RESPONSE, + NFAPI_BROADCAST_DETECT_INDICATION, + NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST, + NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE, + NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION, + NFAPI_SYSTEM_INFORMATION_REQUEST, + NFAPI_SYSTEM_INFORMATION_RESPONSE, + NFAPI_SYSTEM_INFORMATION_INDICATION, + NFAPI_NMM_STOP_REQUEST, + NFAPI_NMM_STOP_RESPONSE, + + NFAPI_VENDOR_EXT_MSG_MIN = 0x0300, + NFAPI_VENDOR_EXT_MSG_MAX = 0x03FF, + + + NFAPI_MAX_MESSAGE_ID, +} nfapi_message_id_e; + +// nFAPI Error Codes +typedef enum { + NFAPI_MSG_OK = 0, + NFAPI_MSG_INVALID_STATE, + NFAPI_MSG_INVALID_CONFIG, + NFAPI_SFN_OUT_OF_SYNC, + NFAPI_MSG_SUBFRAME_ERR, + NFAPI_MSG_BCH_MISSING, + NFAPI_MSG_INVALID_SFN, + NFAPI_MSG_HI_ERR, + NFAPI_MSG_TX_ERR, + + NFAPI_LBT_NO_PDU_IN_DL_REQ, + NFAPI_LBT_NO_VALID_CONFIG_REQ_RECEIVED, + NFAPI_FAPI_E_LBT_SF_SFN_PASSED_END_SF_SFN, + NFAPI_FAPI_E_LBT_OVERLAP, + NFAPI_MSG_BCH_PRESENT, + + NFAPI_NBIOT_UNEXPECTED_REQ, + + // This is special return code that indicates that a response has + // been send via P9 + NFAPI_MSG_P9_RESPONSE = 0xAA +} nfapi_error_code_e; + + +typedef enum { + NFAPI_P4_MSG_OK = 100, + NFAPI_P4_MSG_INVALID_STATE = 101, + NFAPI_P4_MSG_INVALID_CONFIG = 102, + NFAPI_P4_MSG_RAT_NOT_SUPPORTED = 103, + NFAPI_P4_MSG_NMM_STOP_OK = 200, + NFAPI_P4_MSG_NMM_STOP_IGNOREDED = 201, + NFAPI_P4_MSG_NMM_STOP_INVALID_STATE = 202, + NFAPI_P4_MSG_PROCEDURE_COMPLETE = 300, + NFAPI_P4_MSG_PROCEDURE_STOPPED = 301, + NFAPI_P4_MSG_PARTIAL_RESULTS = 302, + NFAPI_P4_MSG_TIMEOUT = 303 +} nfapi_p4_error_code_e; + +// nFAPI enums +typedef enum { + NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE = 0, + NFAPI_DL_CONFIG_BCH_PDU_TYPE, + NFAPI_DL_CONFIG_MCH_PDU_TYPE, + NFAPI_DL_CONFIG_DLSCH_PDU_TYPE, + NFAPI_DL_CONFIG_PCH_PDU_TYPE, + NFAPI_DL_CONFIG_PRS_PDU_TYPE, + NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE, + NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE, + NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE, + NFAPI_DL_CONFIG_NBCH_PDU_TYPE, + NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE, + NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE +} nfapi_dl_config_pdu_type_e; + +typedef enum { + NFAPI_DL_DCI_FORMAT_1 = 0, + NFAPI_DL_DCI_FORMAT_1A, + NFAPI_DL_DCI_FORMAT_1B, + NFAPI_DL_DCI_FORMAT_1C, + NFAPI_DL_DCI_FORMAT_1D, + NFAPI_DL_DCI_FORMAT_2, + NFAPI_DL_DCI_FORMAT_2A, + NFAPI_DL_DCI_FORMAT_2B, + NFAPI_DL_DCI_FORMAT_2C +} nfapi_dl_dci_format_e; + +typedef enum { + NFAPI_UL_DCI_FORMAT_0 = 0, + NFAPI_UL_DCI_FORMAT_3, + NFAPI_UL_DCI_FORMAT_3A, + NFAPI_UL_DCI_FORMAT_4 +} nfapi_ul_dci_format_e; + +typedef enum { + NFAPI_UL_CONFIG_ULSCH_PDU_TYPE = 0, + NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE, + NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE, + NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE, + NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE, + NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE, + NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE, + NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE, + NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE, + NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE, + NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE, + NFAPI_UL_CONFIG_SRS_PDU_TYPE, + NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE, + NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE, + NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE, + NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE, + NFAPI_UL_CONFIG_NULSCH_PDU_TYPE, + NFAPI_UL_CONFIG_NRACH_PDU_TYPE, +} nfapi_ul_config_pdu_type_e; + +typedef enum { + NFAPI_HI_DCI0_HI_PDU_TYPE = 0, + NFAPI_HI_DCI0_DCI_PDU_TYPE, + NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE, + NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE, + NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE, +} nfapi_hi_dci0_pdu_type_e; + +typedef enum { + NFAPI_HARQ_ACK = 1, + NFAPI_HARQ_NACK, + NFAPI_HARQ_ACK_OR_NACK, + NFAPI_HARQ_DTX, + NFAPI_HARQ_ACK_OR_DTX, + NFAPI_HARQ_NACK_OR_DTX, + NFAPI_HARQ_ACK_OR_NACK_OR_DTX +} nfapi_harq_type_e; + +typedef enum { + NFAPI_CSI_REPORT_TYPE_PERIODIC = 0, + NFAPI_CSI_REPORT_TYPE_APERIODIC +} nfapi_csi_report_type_e; + +typedef enum { + NFAPI_DL_BW_SUPPORTED_6 = 1, + NFAPI_DL_BW_SUPPORTED_15 = 2, + NFAPI_DL_BW_SUPPORTED_25 = 4, + NFAPI_DL_BW_SUPPORTED_50 = 8, + NFAPI_DL_BW_SUPPORTED_75 = 16, + NFAPI_DL_BW_SUPPORTED_100 = 32 +} nfapi_dl_bandwith_supported_e; + +typedef enum { + NFAPI_UL_BW_SUPPORTED_6 = 1, + NFAPI_UL_BW_SUPPORTED_15 = 2, + NFAPI_UL_BW_SUPPORTED_25 = 4, + NFAPI_UL_BW_SUPPORTED_50 = 8, + NFAPI_UL_BW_SUPPORTED_75 = 16, + NFAPI_UL_BW_SUPPORTED_100 = 32 +} nfapi_ul_bandwith_supported_e; + +typedef enum { + NFAPI_3GPP_REL_SUPPORTED_8 = 0, + NFAPI_3GPP_REL_SUPPORTED_9 = 1, + NFAPI_3GPP_REL_SUPPORTED_10 = 2, + NFAPI_3GPP_REL_SUPPORTED_11 = 4, + NFAPI_3GPP_REL_SUPPORTED_12 = 8 +} nfapi_3gpp_release_supported_e; + + +typedef enum { + NFAPI_DUPLEXING_MODE_TDD = 0, + NFAPI_DUPLEXING_MODE_FDD = 1, + NFAPI_DUPLEXING_MODE_HD_FDD = 2, +} nfapi_duplexing_mode_e; + +typedef enum { + NFAPI_CP_NORMAL = 0, + NFAPI_CP_EXTENDED = 1 +} nfapi_cyclic_prefix_type_e; + +typedef enum { + NFAPI_RAT_TYPE_LTE = 0, + NFAPI_RAT_TYPE_UTRAN = 1, + NFAPI_RAT_TYPE_GERAN = 2, + NFAPI_RAT_TYPE_NB_IOT = 3 +} nfapi_rat_type_e; + +typedef enum { + NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING, + NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING, + NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING, + NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION, + NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3, + NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4, + NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5 +} nfapi_harq_indication_tdd_ack_nackformat_e; + + +typedef enum { + NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE = 0, + NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE +} nfapi_lbt_dl_config_pdu_type_e; + +typedef enum { + NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE = 0, + NFAPI_LBT_DL_RSP_DRS_PDU_TYPE +} nfapi_lbt_dl_rsp_pdu_type_e; + +typedef struct { + nfapi_tl_t tl; + uint32_t length; + uint8_t value[NFAPI_MAX_OPAQUE_DATA]; +} nfapi_opaqaue_data_t; + +// Utility functions to turn enums into char* +const char* nfapi_error_code_to_str(nfapi_error_code_e value); + + +// P5 Sub Structures +typedef struct { + nfapi_tl_t tl; + uint8_t nfapi_sync_mode; + uint8_t location_mode; + uint16_t location_coordinates_length; + uint8_t location_coordinates[NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH]; + uint32_t dl_config_timing; + uint32_t tx_timing; + uint32_t ul_config_timing; + uint32_t hi_dci0_timing; + uint16_t maximum_number_phys; + uint16_t maximum_total_bandwidth; + uint8_t maximum_total_number_dl_layers; + uint8_t maximum_total_number_ul_layers; + uint8_t shared_bands; + uint8_t shared_pa; + int16_t maximum_total_power; + uint8_t oui[NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH]; +} nfapi_pnf_param_general_t; +#define NFAPI_PNF_PARAM_GENERAL_TAG 0x1000 + + + + + +typedef struct { + uint16_t rf_config_index; +} nfapi_rf_config_info_t; + +typedef struct { + uint16_t phy_config_index; + uint16_t number_of_rfs; + nfapi_rf_config_info_t rf_config[NFAPI_MAX_PNF_PHY_RF_CONFIG]; + uint16_t number_of_rf_exclusions; + nfapi_rf_config_info_t excluded_rf_config[NFAPI_MAX_PNF_PHY_RF_CONFIG]; + uint16_t downlink_channel_bandwidth_supported; + uint16_t uplink_channel_bandwidth_supported; + uint8_t number_of_dl_layers_supported; + uint8_t number_of_ul_layers_supported; + uint16_t maximum_3gpp_release_supported; + uint8_t nmm_modes_supported; +} nfapi_pnf_phy_info_t; + + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_phys; + nfapi_pnf_phy_info_t phy[NFAPI_MAX_PNF_PHY]; +} nfapi_pnf_phy_t; +#define NFAPI_PNF_PHY_TAG 0x1001 + +typedef struct { + uint16_t phy_config_index; + uint16_t transmission_mode_7_supported; + uint16_t transmission_mode_8_supported; + uint16_t two_antenna_ports_for_pucch; + uint16_t transmission_mode_9_supported; + uint16_t simultaneous_pucch_pusch; + uint16_t four_layer_tx_with_tm3_and_tm4; +} nfapi_pnf_phy_rel10_info_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_phys; + nfapi_pnf_phy_rel10_info_t phy[NFAPI_MAX_PNF_PHY]; +} nfapi_pnf_phy_rel10_t; +#define NFAPI_PNF_PHY_REL10_TAG 0x100A + +typedef struct { + uint16_t phy_config_index; + uint16_t edpcch_supported; + uint16_t multi_ack_csi_reporting; + uint16_t pucch_tx_diversity; + uint16_t ul_comp_supported; + uint16_t transmission_mode_5_supported; +} nfapi_pnf_phy_rel11_info_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_phys; + nfapi_pnf_phy_rel11_info_t phy[NFAPI_MAX_PNF_PHY]; +} nfapi_pnf_phy_rel11_t; +#define NFAPI_PNF_PHY_REL11_TAG 0x100B + + +typedef struct { + uint16_t phy_config_index; + uint16_t csi_subframe_set; + uint16_t enhanced_4tx_codebook; + uint16_t drs_supported; + uint16_t ul_64qam_supported; + uint16_t transmission_mode_10_supported; + uint16_t alternative_bts_indices; +} nfapi_pnf_phy_rel12_info_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_phys; + nfapi_pnf_phy_rel12_info_t phy[NFAPI_MAX_PNF_PHY]; +} nfapi_pnf_phy_rel12_t; +#define NFAPI_PNF_PHY_REL12_TAG 0x100C + +typedef struct { + uint16_t phy_config_index; + uint16_t pucch_format4_supported; + uint16_t pucch_format5_supported; + uint16_t more_than_5_ca_support; + uint16_t laa_supported; + uint16_t laa_ending_in_dwpts_supported; + uint16_t laa_starting_in_second_slot_supported; + uint16_t beamforming_supported; + uint16_t csi_rs_enhancement_supported; + uint16_t drms_enhancement_supported; + uint16_t srs_enhancement_supported; +} nfapi_pnf_phy_rel13_info_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_phys; + nfapi_pnf_phy_rel13_info_t phy[NFAPI_MAX_PNF_PHY]; +} nfapi_pnf_phy_rel13_t; +#define NFAPI_PNF_PHY_REL13_TAG 0x100D + +typedef struct { + uint16_t phy_config_index; + uint16_t number_of_rfs; + nfapi_rf_config_info_t rf_config[NFAPI_MAX_PNF_PHY_RF_CONFIG]; + uint16_t number_of_rf_exclusions; + nfapi_rf_config_info_t excluded_rf_config[NFAPI_MAX_PNF_PHY_RF_CONFIG]; + uint8_t number_of_dl_layers_supported; + uint8_t number_of_ul_layers_supported; + uint16_t maximum_3gpp_release_supported; + uint8_t nmm_modes_supported; +} nfapi_pnf_phy_rel13_nb_iot_info_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_phys; + nfapi_pnf_phy_rel13_nb_iot_info_t phy[NFAPI_MAX_PNF_PHY]; +} nfapi_pnf_phy_rel13_nb_iot_t; +#define NFAPI_PNF_PHY_REL13_NB_IOT_TAG 0x100E + + + +typedef struct { + uint16_t rf_config_index; + uint16_t band; + int16_t maximum_transmit_power; + int16_t minimum_transmit_power; + uint8_t number_of_antennas_suppported; + uint32_t minimum_downlink_frequency; + uint32_t maximum_downlink_frequency; + uint32_t minimum_uplink_frequency; + uint32_t maximum_uplink_frequency; +} nfapi_pnf_rf_info_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_rfs; + nfapi_pnf_rf_info_t rf[NFAPI_MAX_PNF_RF]; +} nfapi_pnf_rf_t; +#define NFAPI_PNF_RF_TAG 0x1002 + +typedef struct { + uint16_t phy_id; + uint16_t phy_config_index; + uint16_t rf_config_index; +} nfapi_phy_rf_config_info_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_phy_rf_config_info; + nfapi_phy_rf_config_info_t phy_rf_config[NFAPI_MAX_PHY_RF_INSTANCES]; +} nfapi_pnf_phy_rf_config_t; +#define NFAPI_PNF_PHY_RF_TAG 0x1003 + +// Generic strucutre for single tlv value. +typedef struct { + nfapi_tl_t tl; + uint16_t value; +} nfapi_uint16_tlv_t; + +typedef struct { + nfapi_tl_t tl; + int16_t value; +} nfapi_int16_tlv_t; + +typedef struct { + nfapi_tl_t tl; + uint8_t value; +} nfapi_uint8_tlv_t; + +typedef struct { + nfapi_uint16_tlv_t phy_state; +} nfapi_l1_status; + +#define NFAPI_L1_STATUS_PHY_STATE_TAG 0x00FA + +typedef struct { + nfapi_uint16_tlv_t dl_bandwidth_support; + nfapi_uint16_tlv_t ul_bandwidth_support; + nfapi_uint16_tlv_t dl_modulation_support; + nfapi_uint16_tlv_t ul_modulation_support; + nfapi_uint16_tlv_t phy_antenna_capability; + nfapi_uint16_tlv_t release_capability; + nfapi_uint16_tlv_t mbsfn_capability; +} nfapi_phy_capabilities_t; + +#define NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG 0x00C8 +#define NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG 0x00C9 +#define NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG 0x00CA +#define NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG 0x00CB +#define NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG 0x00CC +#define NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG 0x00CD +#define NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG 0x00CE + + +typedef struct { + nfapi_uint16_tlv_t data_report_mode; + nfapi_uint16_tlv_t sfnsf; +} nfapi_l23_config_t; + + +#define NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG 0x00F0 +#define NFAPI_L23_CONFIG_SFNSF_TAG 0x00F1 + +typedef struct { + nfapi_uint16_tlv_t duplex_mode; + nfapi_uint16_tlv_t pcfich_power_offset; + nfapi_uint16_tlv_t pb; + nfapi_uint16_tlv_t dl_cyclic_prefix_type; + nfapi_uint16_tlv_t ul_cyclic_prefix_type; +} nfapi_subframe_config_t; + +#define NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG 0x0001 +#define NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG 0x0002 +#define NFAPI_SUBFRAME_CONFIG_PB_TAG 0x0003 +#define NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG 0x0004 +#define NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG 0x0005 + +typedef struct { + nfapi_uint16_tlv_t dl_channel_bandwidth; + nfapi_uint16_tlv_t ul_channel_bandwidth; + nfapi_uint16_tlv_t reference_signal_power; + nfapi_uint16_tlv_t tx_antenna_ports; + nfapi_uint16_tlv_t rx_antenna_ports; +} nfapi_rf_config_t; + +#define NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG 0x000A +#define NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG 0x000B +#define NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG 0x000C +#define NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG 0x000D +#define NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG 0x000E + +typedef struct { + nfapi_uint16_tlv_t phich_resource; + nfapi_uint16_tlv_t phich_duration; + nfapi_uint16_tlv_t phich_power_offset; +} nfapi_phich_config_t; + +#define NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG 0x0014 +#define NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG 0x0015 +#define NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG 0x0016 + +typedef struct { + nfapi_uint16_tlv_t primary_synchronization_signal_epre_eprers; + nfapi_uint16_tlv_t secondary_synchronization_signal_epre_eprers; + nfapi_uint16_tlv_t physical_cell_id; +} nfapi_sch_config_t; + +#define NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG 0x001E +#define NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG 0x001F +#define NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG 0x0020 + +typedef struct { + nfapi_uint16_tlv_t configuration_index; + nfapi_uint16_tlv_t root_sequence_index; + nfapi_uint16_tlv_t zero_correlation_zone_configuration; + nfapi_uint16_tlv_t high_speed_flag; + nfapi_uint16_tlv_t frequency_offset; +} nfapi_prach_config_t; + +#define NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG 0x0028 +#define NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG 0x0029 +#define NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG 0x002A +#define NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG 0x002B +#define NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG 0x002C + +typedef struct { + nfapi_uint16_tlv_t hopping_mode; + nfapi_uint16_tlv_t hopping_offset; + nfapi_uint16_tlv_t number_of_subbands; +} nfapi_pusch_config_t; + +#define NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG 0x0032 +#define NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG 0x0033 +#define NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG 0x0034 + +typedef struct { + nfapi_uint16_tlv_t delta_pucch_shift; + nfapi_uint16_tlv_t n_cqi_rb; + nfapi_uint16_tlv_t n_an_cs; + nfapi_uint16_tlv_t n1_pucch_an; +} nfapi_pucch_config_t; + +#define NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG 0x003C +#define NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG 0x003D +#define NFAPI_PUCCH_CONFIG_N_AN_CS_TAG 0x003E +#define NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG 0x003F + +typedef struct { + nfapi_uint16_tlv_t bandwidth_configuration; + nfapi_uint16_tlv_t max_up_pts; + nfapi_uint16_tlv_t srs_subframe_configuration; + nfapi_uint16_tlv_t srs_acknack_srs_simultaneous_transmission; +} nfapi_srs_config_t; + +#define NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG 0x0046 +#define NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG 0x0047 +#define NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG 0x0048 +#define NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG 0x0049 + +typedef struct { + nfapi_uint16_tlv_t uplink_rs_hopping; + nfapi_uint16_tlv_t group_assignment; + nfapi_uint16_tlv_t cyclic_shift_1_for_drms; +} nfapi_uplink_reference_signal_config_t; + +#define NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG 0x0050 +#define NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG 0x0051 +#define NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG 0x0052 + + +typedef struct { + nfapi_uint16_tlv_t ed_threshold_lbt_pdsch; + nfapi_uint16_tlv_t ed_threshold_lbt_drs; + nfapi_uint16_tlv_t pd_threshold; + nfapi_uint16_tlv_t multi_carrier_type; + nfapi_uint16_tlv_t multi_carrier_tx; + nfapi_uint16_tlv_t multi_carrier_freeze; + nfapi_uint16_tlv_t tx_antenna_ports_drs; + nfapi_uint16_tlv_t tx_power_drs; +} nfapi_laa_config_t; + +#define NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG 0x0064 +#define NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG 0x0065 +#define NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG 0x0066 +#define NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG 0x0067 +#define NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG 0x0068 +#define NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG 0x0069 +#define NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG 0x006A +#define NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG 0x006B + +typedef struct { + + nfapi_uint16_tlv_t pbch_repetitions_enable_r13; + nfapi_uint16_tlv_t prach_catm_root_sequence_index; + nfapi_uint16_tlv_t prach_catm_zero_correlation_zone_configuration; + nfapi_uint16_tlv_t prach_catm_high_speed_flag; + nfapi_uint16_tlv_t prach_ce_level_0_enable; + nfapi_uint16_tlv_t prach_ce_level_0_configuration_index; + nfapi_uint16_tlv_t prach_ce_level_0_frequency_offset; + nfapi_uint16_tlv_t prach_ce_level_0_number_of_repetitions_per_attempt; + nfapi_uint16_tlv_t prach_ce_level_0_starting_subframe_periodicity; + nfapi_uint16_tlv_t prach_ce_level_0_hopping_enable; + nfapi_uint16_tlv_t prach_ce_level_0_hopping_offset; + nfapi_uint16_tlv_t prach_ce_level_1_enable; + nfapi_uint16_tlv_t prach_ce_level_1_configuration_index; + nfapi_uint16_tlv_t prach_ce_level_1_frequency_offset; + nfapi_uint16_tlv_t prach_ce_level_1_number_of_repetitions_per_attempt; + nfapi_uint16_tlv_t prach_ce_level_1_starting_subframe_periodicity; + nfapi_uint16_tlv_t prach_ce_level_1_hopping_enable; + nfapi_uint16_tlv_t prach_ce_level_1_hopping_offset; + nfapi_uint16_tlv_t prach_ce_level_2_enable; + nfapi_uint16_tlv_t prach_ce_level_2_configuration_index; + nfapi_uint16_tlv_t prach_ce_level_2_frequency_offset; + nfapi_uint16_tlv_t prach_ce_level_2_number_of_repetitions_per_attempt; + nfapi_uint16_tlv_t prach_ce_level_2_starting_subframe_periodicity; + nfapi_uint16_tlv_t prach_ce_level_2_hopping_enable; + nfapi_uint16_tlv_t prach_ce_level_2_hopping_offset; + nfapi_uint16_tlv_t prach_ce_level_3_enable; + nfapi_uint16_tlv_t prach_ce_level_3_configuration_index; + nfapi_uint16_tlv_t prach_ce_level_3_frequency_offset; + nfapi_uint16_tlv_t prach_ce_level_3_number_of_repetitions_per_attempt; + nfapi_uint16_tlv_t prach_ce_level_3_starting_subframe_periodicity; + nfapi_uint16_tlv_t prach_ce_level_3_hopping_enable; + nfapi_uint16_tlv_t prach_ce_level_3_hopping_offset; + nfapi_uint16_tlv_t pucch_interval_ulhoppingconfigcommonmodea; + nfapi_uint16_tlv_t pucch_interval_ulhoppingconfigcommonmodeb; +} nfapi_emtc_config_t; + +#define NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG 0x0078 +#define NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG 0x0079 +#define NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG 0x007A +#define NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG 0x007B +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG 0x007C +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG 0x007D +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG 0x007E +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0x007F +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG 0x0080 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG 0x0081 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG 0x0082 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG 0x0083 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG 0x0084 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG 0x0085 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0x0086 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG 0x0087 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG 0x0088 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG 0x0089 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG 0x008A +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG 0x008B +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG 0x008C +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0x008D +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG 0x008E +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG 0x008F +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG 0x0090 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG 0x0091 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG 0x0092 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG 0x0093 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0x0094 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG 0x0095 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG 0x0096 +#define NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG 0x0097 +#define NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG 0x0098 +#define NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG 0x0099 + +typedef struct { + nfapi_uint16_tlv_t operating_mode; + nfapi_uint16_tlv_t anchor; + nfapi_uint16_tlv_t prb_index; + nfapi_uint16_tlv_t control_region_size; + nfapi_uint16_tlv_t assumed_crs_aps; + nfapi_uint16_tlv_t nprach_config_0_enabled; + nfapi_uint16_tlv_t nprach_config_0_sf_periodicity; + nfapi_uint16_tlv_t nprach_config_0_start_time; + nfapi_uint16_tlv_t nprach_config_0_subcarrier_offset; + nfapi_uint16_tlv_t nprach_config_0_number_of_subcarriers; + nfapi_uint16_tlv_t nprach_config_0_cp_length; + nfapi_uint16_tlv_t nprach_config_0_number_of_repetitions_per_attempt; + nfapi_uint16_tlv_t nprach_config_1_enabled; + nfapi_uint16_tlv_t nprach_config_1_sf_periodicity; + nfapi_uint16_tlv_t nprach_config_1_start_time; + nfapi_uint16_tlv_t nprach_config_1_subcarrier_offset; + nfapi_uint16_tlv_t nprach_config_1_number_of_subcarriers; + nfapi_uint16_tlv_t nprach_config_1_cp_length; + nfapi_uint16_tlv_t nprach_config_1_number_of_repetitions_per_attempt; + nfapi_uint16_tlv_t nprach_config_2_enabled; + nfapi_uint16_tlv_t nprach_config_2_sf_periodicity; + nfapi_uint16_tlv_t nprach_config_2_start_time; + nfapi_uint16_tlv_t nprach_config_2_subcarrier_offset; + nfapi_uint16_tlv_t nprach_config_2_number_of_subcarriers; + nfapi_uint16_tlv_t nprach_config_2_cp_length; + nfapi_uint16_tlv_t nprach_config_2_number_of_repetitions_per_attempt; + nfapi_uint16_tlv_t three_tone_base_sequence; + nfapi_uint16_tlv_t six_tone_base_sequence; + nfapi_uint16_tlv_t twelve_tone_base_sequence; + nfapi_uint16_tlv_t three_tone_cyclic_shift; + nfapi_uint16_tlv_t six_tone_cyclic_shift; + nfapi_uint16_tlv_t dl_gap_config_enable; + nfapi_uint16_tlv_t dl_gap_threshold; + nfapi_uint16_tlv_t dl_gap_periodicity; + nfapi_uint16_tlv_t dl_gap_duration_coefficient; +} nfapi_nb_iot_config_t; + +#define NFAPI_NB_IOT_CONFIG_OPERATING_MODE_TAG 0x00A5 +#define NFAPI_NB_IOT_CONFIG_ANCHOR_TAG 0x00A6 +#define NFAPI_NB_IOT_CONFIG_PRB_INDEX_TAG 0x00A7 +#define NFAPI_NB_IOT_CONFIG_CONTROL_REGION_SIZE_TAG 0x00A8 +#define NFAPI_NB_IOT_CONFIG_ASSUMED_CRS_APS_TAG 0x00A9 +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_ENABLED_TAG 0x00AA +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_SF_PERIODICITY_TAG 0x00AB +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_START_TIME_TAG 0x00AC +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_SUBCARRIER_OFFSET_TAG 0x00AD +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_NUMBER_OF_SUBCARRIERS_TAG 0x00AE +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_CP_LENGTH_TAG 0x00AF +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0x00B0 +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_ENABLED_TAG 0x00B1 +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_SF_PERIODICITY_TAG 0x00B2 +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_START_TIME_TAG 0x00B3 +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_SUBCARRIER_OFFSET_TAG 0x00B4 +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_NUMBER_OF_SUBCARRIERS_TAG 0x00B5 +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_CP_LENGTH_TAG 0x00B6 +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0x00B7 +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_ENABLED_TAG 0x00B8 +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_SF_PERIODICITY_TAG 0x00B9 +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_START_TIME_TAG 0x00BA +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_SUBCARRIER_OFFSET_TAG 0x00BB +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_NUMBER_OF_SUBCARRIERS_TAG 0x00BC +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_CP_LENGTH_TAG 0x00BD +#define NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0x00BE +#define NFAPI_NB_IOT_CONFIG_THREE_TONE_BASE_SEQUENCE_TAG 0x00BF +#define NFAPI_NB_IOT_CONFIG_SIX_TONE_BASE_SEQUENCE_TAG 0x00C0 +#define NFAPI_NB_IOT_CONFIG_TWELVE_TONE_BASE_SEQUENCE_TAG 0x00C1 +#define NFAPI_NB_IOT_CONFIG_THREE_TONE_CYCLIC_SHIFT_TAG 0x00C2 +#define NFAPI_NB_IOT_CONFIG_SIX_TONE_CYCLIC_SHIFT_TAG 0x00C3 +#define NFAPI_NB_IOT_CONFIG_DL_GAP_CONFIG_ENABLE_TAG 0x00C4 +#define NFAPI_NB_IOT_CONFIG_DL_GAP_THRESHOLD_TAG 0x00C5 +#define NFAPI_NB_IOT_CONFIG_DL_GAP_PERIODICITY_TAG 0x00C6 +#define NFAPI_NB_IOT_CONFIG_DL_GAP_DURATION_COEFFICIENT_TAG 0x00C7 + +typedef struct { + nfapi_uint16_tlv_t laa_support; + nfapi_uint16_tlv_t pd_sensing_lbt_support; + nfapi_uint16_tlv_t multi_carrier_lbt_support; + nfapi_uint16_tlv_t partial_sf_support; +} nfapi_laa_capability_t; + +#define NFAPI_LAA_CAPABILITY_LAA_SUPPORT_TAG 0x00D1 +#define NFAPI_LAA_CAPABILITY_PD_SENSING_LBT_SUPPORT_TAG 0x00D2 +#define NFAPI_LAA_CAPABILITY_MULTI_CARRIER_LBT_SUPPORT_TAG 0x00D3 +#define NFAPI_LAA_CAPABILITY_PARTIAL_SF_SUPPORT_TAG 0x00D4 + +typedef struct { + nfapi_uint16_tlv_t nb_iot_support; + nfapi_uint16_tlv_t nb_iot_operating_mode_capability; +} nfapi_nb_iot_capability_t; + +#define NFAPI_LAA_CAPABILITY_NB_IOT_SUPPORT_TAG 0x00D5 +#define NFAPI_LAA_CAPABILITY_NB_IOT_OPERATING_MODE_CAPABILITY_TAG 0x00D6 + +typedef struct { + nfapi_uint16_tlv_t subframe_assignment; + nfapi_uint16_tlv_t special_subframe_patterns; +} nfapi_tdd_frame_structure_t; + +#define NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG 0x005A +#define NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG 0x005B + +typedef struct { + nfapi_tl_t tl; + uint16_t number_rf_bands; + uint16_t rf_band[NFAPI_MAX_NUM_RF_BANDS]; +} nfapi_rf_bands_t; +#define NFAPI_PHY_RF_BANDS_TAG 0x0114 + +#define NFAPI_IPV4_ADDRESS_LENGTH 4 +#define NFAPI_IPV6_ADDRESS_LENGTH 16 + +// Convience enum to allow the ip addres type to be distinguished +typedef enum { + NFAPI_IP_ADDRESS_IPV4 = 0, + NFAPI_IP_ADDRESS_IPV6 +} nfapi_ip_address_type_e; + +// The type could be infered from the length, but it is clearer in +// code to have a type variable set +typedef struct { + nfapi_tl_t tl; + uint8_t type; + union { + uint8_t ipv4_address[NFAPI_IPV4_ADDRESS_LENGTH]; + uint8_t ipv6_address[NFAPI_IPV6_ADDRESS_LENGTH]; + } u; +} nfapi_ip_address_t; + +typedef struct { + nfapi_tl_t tl; + uint8_t address[NFAPI_IPV4_ADDRESS_LENGTH]; +} nfapi_ipv4_address_t; + +typedef struct { + nfapi_tl_t tl; + uint8_t address[NFAPI_IPV6_ADDRESS_LENGTH]; +} nfapi_ipv6_address_t; + + + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_rf_bands; + uint16_t bands[NFAPI_MAX_NMM_FREQUENCY_BANDS]; +} nfapi_nmm_frequency_bands_t; + +//These TLVs are used exclusively by nFAPI +typedef struct +{ + // These TLVs are used to setup the transport connection between VNF and PNF + nfapi_ipv4_address_t p7_vnf_address_ipv4; + nfapi_ipv6_address_t p7_vnf_address_ipv6; + nfapi_uint16_tlv_t p7_vnf_port; + + nfapi_ipv4_address_t p7_pnf_address_ipv4; + nfapi_ipv6_address_t p7_pnf_address_ipv6; + nfapi_uint16_tlv_t p7_pnf_port; + + // These TLVs are used to setup the transport connection between VNF and PNF + nfapi_uint8_tlv_t dl_ue_per_sf; + nfapi_uint8_tlv_t ul_ue_per_sf; + + // These TLVs are used by PNF to report its RF capabilities to the VNF software + nfapi_rf_bands_t rf_bands; + + // These TLVs are used by the VNF to configure the synchronization with the PNF. + nfapi_uint8_tlv_t timing_window; + nfapi_uint8_tlv_t timing_info_mode; + nfapi_uint8_tlv_t timing_info_period; + + // These TLVs are used by the VNF to configure the RF in the PNF + nfapi_uint16_tlv_t max_transmit_power; + nfapi_uint16_tlv_t earfcn; + + nfapi_nmm_frequency_bands_t nmm_gsm_frequency_bands; + nfapi_nmm_frequency_bands_t nmm_umts_frequency_bands; + nfapi_nmm_frequency_bands_t nmm_lte_frequency_bands; + nfapi_uint8_tlv_t nmm_uplink_rssi_supported; + +} nfapi_nfapi_t; + +#define NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG 0x0100 +#define NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG 0x0101 +#define NFAPI_NFAPI_P7_VNF_PORT_TAG 0x0102 +#define NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG 0x0103 +#define NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG 0x0104 +#define NFAPI_NFAPI_P7_PNF_PORT_TAG 0x0105 + +#define NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG 0x010A +#define NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG 0x010B +#define NFAPI_NFAPI_RF_BANDS_TAG 0x0114 +#define NFAPI_NFAPI_TIMING_WINDOW_TAG 0x011E +#define NFAPI_NFAPI_TIMING_INFO_MODE_TAG 0x011F +#define NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG 0x0120 +#define NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG 0x0128 +#define NFAPI_NFAPI_EARFCN_TAG 0x0129 +#define NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG 0x0130 +#define NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG 0x0131 +#define NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG 0x0132 +#define NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG 0x0133 + + +// P5 Message Structures +typedef struct { + nfapi_p4_p5_message_header_t header; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_pnf_param_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_pnf_param_general_t pnf_param_general; + nfapi_pnf_phy_t pnf_phy; + nfapi_pnf_rf_t pnf_rf; + nfapi_pnf_phy_rel10_t pnf_phy_rel10; + nfapi_pnf_phy_rel11_t pnf_phy_rel11; + nfapi_pnf_phy_rel12_t pnf_phy_rel12; + nfapi_pnf_phy_rel13_t pnf_phy_rel13; + nfapi_pnf_phy_rel13_nb_iot_t pnf_phy_rel13_nb_iot; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_pnf_param_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + nfapi_pnf_phy_rf_config_t pnf_phy_rf_config; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_pnf_config_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_pnf_config_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_pnf_start_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_pnf_start_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_pnf_stop_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_pnf_stop_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_param_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint8_t error_code; + uint8_t num_tlv; + // fdd or tdd in idle or configured tlvs + nfapi_l1_status l1_status; + nfapi_phy_capabilities_t phy_capabilities; + nfapi_laa_capability_t laa_capability; + nfapi_nb_iot_capability_t nb_iot_capability; + + nfapi_subframe_config_t subframe_config; + nfapi_rf_config_t rf_config; + nfapi_phich_config_t phich_config; + nfapi_sch_config_t sch_config; + nfapi_prach_config_t prach_config; + nfapi_pusch_config_t pusch_config; + nfapi_pucch_config_t pucch_config; + nfapi_srs_config_t srs_config; + nfapi_uplink_reference_signal_config_t uplink_reference_signal_config; + nfapi_tdd_frame_structure_t tdd_frame_structure_config; + nfapi_l23_config_t l23_config; + nfapi_nb_iot_config_t nb_iot_config; + + // addition nfapi tlvs as per table 2-16 in idle or configure + nfapi_nfapi_t nfapi_config; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_param_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint8_t num_tlv; + nfapi_subframe_config_t subframe_config; + nfapi_rf_config_t rf_config; + nfapi_phich_config_t phich_config; + nfapi_sch_config_t sch_config; + nfapi_prach_config_t prach_config; + nfapi_pusch_config_t pusch_config; + nfapi_pucch_config_t pucch_config; + nfapi_srs_config_t srs_config; + nfapi_uplink_reference_signal_config_t uplink_reference_signal_config; + nfapi_laa_config_t laa_config; + nfapi_emtc_config_t emtc_config; + nfapi_tdd_frame_structure_t tdd_frame_structure_config; + nfapi_l23_config_t l23_config; + nfapi_nb_iot_config_t nb_iot_config; + + // addition nfapi tlvs as per table 2-16 in idle or configure + nfapi_nfapi_t nfapi_config; + + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_config_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_config_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_start_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_start_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_stop_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_stop_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + nfapi_uint16_tlv_t dl_rs_tx_power; + nfapi_uint16_tlv_t received_interference_power; + nfapi_uint16_tlv_t thermal_noise_power; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_measurement_request_t; + +#define NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG 0x1004 +#define NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG 0x1005 +#define NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG 0x1006 + + + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_resource_blocks; + int16_t received_interference_power[NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS]; +} nfapi_received_interference_power_measurement_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_int16_tlv_t dl_rs_tx_power_measurement; + nfapi_received_interference_power_measurement_t received_interference_power_measurement; + nfapi_int16_tlv_t thermal_noise_power_measurement; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_measurement_response_t; + +#define NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG 0x1007 +#define NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG 0x1008 +#define NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG 0x1009 + +// P7 Sub Structures +typedef struct { + nfapi_tl_t tl; + uint8_t dci_format; + uint8_t cce_idx; + uint8_t aggregation_level; + uint16_t rnti; + uint8_t resource_allocation_type; + uint8_t virtual_resource_block_assignment_flag; + uint32_t resource_block_coding; + uint8_t mcs_1; + uint8_t redundancy_version_1; + uint8_t new_data_indicator_1; + uint8_t transport_block_to_codeword_swap_flag; + uint8_t mcs_2; + uint8_t redundancy_version_2; + uint8_t new_data_indicator_2; + uint8_t harq_process; + uint8_t tpmi; + uint8_t pmi; + uint8_t precoding_information; + uint8_t tpc; + uint8_t downlink_assignment_index; + uint8_t ngap; + uint8_t transport_block_size_index; + uint8_t downlink_power_offset; + uint8_t allocate_prach_flag; + uint8_t preamble_index; + uint8_t prach_mask_index; + uint8_t rnti_type; + uint16_t transmission_power; +} nfapi_dl_config_dci_dl_pdu_rel8_t; +#define NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG 0x2001 + +typedef struct { + nfapi_tl_t tl; + uint8_t mcch_flag; + uint8_t mcch_change_notification; + uint8_t scrambling_identity; +} nfapi_dl_config_dci_dl_pdu_rel9_t; +#define NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG 0x2002 + +typedef struct { + nfapi_tl_t tl; + uint8_t cross_carrier_scheduling_flag; + uint8_t carrier_indicator; + uint8_t srs_flag; + uint8_t srs_request; + uint8_t antenna_ports_scrambling_and_layers; + uint8_t total_dci_length_including_padding; + uint8_t n_dl_rb; +} nfapi_dl_config_dci_dl_pdu_rel10_t; +#define NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG 0x2003 + + +typedef struct { + nfapi_tl_t tl; + uint8_t harq_ack_resource_offset; + uint8_t pdsch_re_mapping_quasi_co_location_indicator; +} nfapi_dl_config_dci_dl_pdu_rel11_t; + +#define NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG 0x2039 + + + +typedef struct { + nfapi_tl_t tl; + uint8_t primary_cell_type; + uint8_t ul_dl_configuration_flag; + uint8_t number_ul_dl_configurations; + uint8_t ul_dl_configuration_indication[NFAPI_MAX_UL_DL_CONFIGURATIONS]; +} nfapi_dl_config_dci_dl_pdu_rel12_t; + +#define NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG 0x203a + + + +typedef struct { + uint8_t subband_index; + uint8_t scheduled_ues; + uint16_t precoding_value[NFAPI_MAX_NUM_PHYSICAL_ANTENNAS][NFAPI_MAX_NUM_SCHEDULED_UES]; +} nfapi_dl_config_dci_dl_tpm_subband_info_t; + +typedef struct { + uint8_t num_prb_per_subband; + uint8_t number_of_subbands; + uint8_t num_antennas; + nfapi_dl_config_dci_dl_tpm_subband_info_t subband_info[NFAPI_MAX_NUM_SUBBANDS]; +} nfapi_dl_config_dci_dl_tpm_t; + +typedef struct { + nfapi_tl_t tl; + uint8_t laa_end_partial_sf_flag; + uint8_t laa_end_partial_sf_configuration; + uint8_t initial_lbt_sf; + uint8_t codebook_size_determination; + uint8_t drms_table_flag; + uint8_t tpm_struct_flag; + nfapi_dl_config_dci_dl_tpm_t tpm; +} nfapi_dl_config_dci_dl_pdu_rel13_t; + +#define NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG 0x203b + +typedef struct { + nfapi_dl_config_dci_dl_pdu_rel8_t dci_dl_pdu_rel8; + nfapi_dl_config_dci_dl_pdu_rel9_t dci_dl_pdu_rel9; + nfapi_dl_config_dci_dl_pdu_rel10_t dci_dl_pdu_rel10; + nfapi_dl_config_dci_dl_pdu_rel11_t dci_dl_pdu_rel11; + nfapi_dl_config_dci_dl_pdu_rel12_t dci_dl_pdu_rel12; + nfapi_dl_config_dci_dl_pdu_rel13_t dci_dl_pdu_rel13; +} nfapi_dl_config_dci_dl_pdu; + +typedef struct { + nfapi_tl_t tl; + uint16_t length; + uint16_t pdu_index; + uint16_t transmission_power; +} nfapi_dl_config_bch_pdu_rel8_t; +#define NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG 0x2004 + +typedef struct { + nfapi_dl_config_bch_pdu_rel8_t bch_pdu_rel8; +} nfapi_dl_config_bch_pdu; + +typedef struct { + nfapi_tl_t tl; + uint16_t length; + uint16_t pdu_index; + uint16_t rnti; + uint8_t resource_allocation_type; + uint32_t resource_block_coding; + uint8_t modulation; + uint16_t transmission_power; + uint16_t mbsfn_area_id; +} nfapi_dl_config_mch_pdu_rel8_t; +#define NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG 0x2005 + +typedef struct { + nfapi_dl_config_mch_pdu_rel8_t mch_pdu_rel8; +} nfapi_dl_config_mch_pdu; + + +typedef struct { + uint8_t subband_index; + uint8_t num_antennas; + uint16_t bf_value[NFAPI_MAX_NUM_ANTENNAS]; +} nfapi_bf_vector_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t length; + uint16_t pdu_index; + uint16_t rnti; + uint8_t resource_allocation_type; + uint8_t virtual_resource_block_assignment_flag; + uint32_t resource_block_coding; + uint8_t modulation; + uint8_t redundancy_version; + uint8_t transport_blocks; + uint8_t transport_block_to_codeword_swap_flag; + uint8_t transmission_scheme; + uint8_t number_of_layers; + uint8_t number_of_subbands; + uint8_t codebook_index[NFAPI_MAX_NUM_SUBBANDS]; + uint8_t ue_category_capacity; + uint8_t pa; + uint8_t delta_power_offset_index; + uint8_t ngap; + uint8_t nprb; + uint8_t transmission_mode; + uint8_t num_bf_prb_per_subband; + uint8_t num_bf_vector; + nfapi_bf_vector_t bf_vector[NFAPI_MAX_BF_VECTORS]; +} nfapi_dl_config_dlsch_pdu_rel8_t; +#define NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG 0x2006 + +typedef struct { + nfapi_tl_t tl; + uint8_t nscid; +} nfapi_dl_config_dlsch_pdu_rel9_t; +#define NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG 0x2007 + +typedef struct { + nfapi_tl_t tl; + uint8_t csi_rs_flag; + uint8_t csi_rs_resource_config_r10; + uint16_t csi_rs_zero_tx_power_resource_config_bitmap_r10; + uint8_t csi_rs_number_nzp_configuration; + uint8_t csi_rs_resource_config[NFAPI_MAX_CSI_RS_RESOURCE_CONFIG]; + uint8_t pdsch_start; +} nfapi_dl_config_dlsch_pdu_rel10_t; +#define NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG 0x2008 + +typedef struct { + nfapi_tl_t tl; + uint8_t drms_config_flag; + uint16_t drms_scrambling; + uint8_t csi_config_flag; + uint16_t csi_scrambling; + uint8_t pdsch_re_mapping_flag; + uint8_t pdsch_re_mapping_atenna_ports; + uint8_t pdsch_re_mapping_freq_shift; +} nfapi_dl_config_dlsch_pdu_rel11_t; +#define NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG 0x203C + +typedef struct { + nfapi_tl_t tl; + uint8_t altcqi_table_r12; + uint8_t maxlayers; + uint8_t n_dl_harq; +} nfapi_dl_config_dlsch_pdu_rel12_t; +#define NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG 0x203D + +typedef struct { + nfapi_tl_t tl; + uint8_t dwpts_symbols; + uint8_t initial_lbt_sf; + uint8_t ue_type; + uint8_t pdsch_payload_type; + uint16_t initial_transmission_sf_io; + uint8_t drms_table_flag; +} nfapi_dl_config_dlsch_pdu_rel13_t; +#define NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG 0x203E + +typedef struct { + nfapi_dl_config_dlsch_pdu_rel8_t dlsch_pdu_rel8; + nfapi_dl_config_dlsch_pdu_rel9_t dlsch_pdu_rel9; + nfapi_dl_config_dlsch_pdu_rel10_t dlsch_pdu_rel10; + nfapi_dl_config_dlsch_pdu_rel11_t dlsch_pdu_rel11; + nfapi_dl_config_dlsch_pdu_rel12_t dlsch_pdu_rel12; + nfapi_dl_config_dlsch_pdu_rel13_t dlsch_pdu_rel13; +} nfapi_dl_config_dlsch_pdu; + +typedef struct { + nfapi_tl_t tl; + uint16_t length; + uint16_t pdu_index; + uint16_t p_rnti; + uint8_t resource_allocation_type; + uint8_t virtual_resource_block_assignment_flag; + uint32_t resource_block_coding; + uint8_t mcs; + uint8_t redundancy_version; + uint8_t number_of_transport_blocks; + uint8_t transport_block_to_codeword_swap_flag; + uint8_t transmission_scheme; + uint8_t number_of_layers; + uint8_t codebook_index; + uint8_t ue_category_capacity; + uint8_t pa; + uint16_t transmission_power; + uint8_t nprb; + uint8_t ngap; +} nfapi_dl_config_pch_pdu_rel8_t; +#define NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG 0x2009 + +typedef struct { + nfapi_tl_t tl; + uint8_t ue_mode; + uint16_t initial_transmission_sf_io; +} nfapi_dl_config_pch_pdu_rel13_t; +#define NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG 0x203F + +typedef struct { + nfapi_dl_config_pch_pdu_rel8_t pch_pdu_rel8; + nfapi_dl_config_pch_pdu_rel13_t pch_pdu_rel13; +} nfapi_dl_config_pch_pdu; + +typedef struct { + nfapi_tl_t tl; + uint16_t transmission_power; + uint8_t prs_bandwidth; + uint8_t prs_cyclic_prefix_type; + uint8_t prs_muting; +} nfapi_dl_config_prs_pdu_rel9_t; +#define NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG 0x200A + +typedef struct { + nfapi_dl_config_prs_pdu_rel9_t prs_pdu_rel9; +} nfapi_dl_config_prs_pdu; + +typedef struct { + nfapi_tl_t tl; + uint8_t csi_rs_antenna_port_count_r10; + uint8_t csi_rs_resource_config_r10; + uint16_t transmission_power; + uint16_t csi_rs_zero_tx_power_resource_config_bitmap_r10; + uint8_t csi_rs_number_of_nzp_configuration; + uint8_t csi_rs_resource_config[NFAPI_MAX_CSI_RS_RESOURCE_CONFIG]; +} nfapi_dl_config_csi_rs_pdu_rel10_t; +#define NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG 0x200B + +typedef struct { + nfapi_tl_t tl; + uint8_t csi_rs_class; + uint8_t cdm_type; + uint8_t num_bf_vector; + struct { + uint8_t csi_rs_resource_index; + uint16_t bf_value[NFAPI_MAX_ANTENNA_PORT_COUNT]; + } bf_vector[NFAPI_MAX_BF_VECTORS]; + +}nfapi_dl_config_csi_rs_pdu_rel13_t; +#define NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG 0x2040 + +typedef struct { + nfapi_dl_config_csi_rs_pdu_rel10_t csi_rs_pdu_rel10; + nfapi_dl_config_csi_rs_pdu_rel13_t csi_rs_pdu_rel13; +} nfapi_dl_config_csi_rs_pdu; + +#define NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG 0x2001 +#define NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG 0x2002 +#define NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG 0x2003 +#define NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG 0x2039 +#define NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG 0x203a +#define NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG 0x203b + +typedef struct { + nfapi_tl_t tl; + uint8_t epdcch_resource_assignment_flag; + uint16_t epdcch_id; + uint8_t epdcch_start_symbol; + uint8_t epdcch_num_prb; + uint8_t epdcch_prb_index[NFAPI_MAX_EPDCCH_PRB]; + nfapi_bf_vector_t bf_vector; +} nfapi_dl_config_epdcch_parameters_rel11_t; +#define NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG 0x2041 + +typedef struct { + nfapi_tl_t tl; + uint8_t dwpts_symbols; + uint8_t initial_lbt_sf; +} nfapi_dl_config_epdcch_parameters_rel13_t; +#define NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG 0x2042 + +typedef struct { + nfapi_dl_config_dci_dl_pdu_rel8_t epdcch_pdu_rel8; + nfapi_dl_config_dci_dl_pdu_rel9_t epdcch_pdu_rel9; + nfapi_dl_config_dci_dl_pdu_rel10_t epdcch_pdu_rel10; + nfapi_dl_config_dci_dl_pdu_rel11_t epdcch_pdu_rel11; + nfapi_dl_config_dci_dl_pdu_rel12_t epdcch_pdu_rel12; + nfapi_dl_config_dci_dl_pdu_rel13_t epdcch_pdu_rel13; + nfapi_dl_config_epdcch_parameters_rel11_t epdcch_params_rel11; + nfapi_dl_config_epdcch_parameters_rel13_t epdcch_params_rel13; +} nfapi_dl_config_epdcch_pdu; + + +typedef struct { + nfapi_tl_t tl; + uint8_t mpdcch_narrow_band; + uint8_t number_of_prb_pairs; + uint8_t resource_block_assignment; + uint8_t mpdcch_tansmission_type; + uint8_t start_symbol; + uint8_t ecce_index; + uint8_t aggregation_level; + uint8_t rnti_type; + uint16_t rnti; + uint8_t ce_mode; + uint16_t drms_scrambling_init; + uint16_t initial_transmission_sf_io; + uint16_t transmission_power; + uint8_t dci_format; + uint16_t resource_block_coding; + uint8_t mcs; + uint8_t pdsch_reptition_levels; + uint8_t redundancy_version; + uint8_t new_data_indicator; + uint8_t harq_process; + uint8_t tpmi_length; + uint8_t tpmi; + uint8_t pmi_flag; + uint8_t pmi; + uint8_t harq_resource_offset; + uint8_t dci_subframe_repetition_number; + uint8_t tpc; + uint8_t downlink_assignment_index_length; + uint8_t downlink_assignment_index; + uint8_t allocate_prach_flag; + uint8_t preamble_index; + uint8_t prach_mask_index; + uint8_t starting_ce_level; + uint8_t srs_request; + uint8_t antenna_ports_and_scrambling_identity_flag; + uint8_t antenna_ports_and_scrambling_identity; + uint8_t frequency_hopping_enabled_flag; + uint8_t paging_direct_indication_differentiation_flag; + uint8_t direct_indication; + uint8_t total_dci_length_including_padding; + uint8_t number_of_tx_antenna_ports; + uint16_t precoding_value[NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS]; +} nfapi_dl_config_mpdcch_pdu_rel13_t; +#define NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG 0x205B + + +typedef struct { + nfapi_dl_config_mpdcch_pdu_rel13_t mpdcch_pdu_rel13; +} nfapi_dl_config_mpdcch_pdu; + +typedef struct { + nfapi_tl_t tl; + uint16_t length; + uint16_t pdu_index; + uint16_t transmission_power; + uint16_t hyper_sfn_2_lsbs; +} nfapi_dl_config_nbch_pdu_rel13_t; + +#define NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG 0x205C + +typedef struct { + nfapi_dl_config_nbch_pdu_rel13_t nbch_pdu_rel13; +} nfapi_dl_config_nbch_pdu; + +typedef struct { + nfapi_tl_t tl; + uint16_t length; + uint16_t pdu_index; + uint8_t ncce_index; + uint8_t aggregation_level; + uint8_t start_symbol; + uint8_t rnti_type; + uint16_t rnti; + uint8_t scrambling_reinitialization_batch_index; + uint8_t nrs_antenna_ports_assumed_by_the_ue; + uint8_t dci_format; + uint8_t scheduling_delay; + uint8_t resource_assignment; + uint8_t repetition_number; + uint8_t mcs; + uint8_t new_data_indicator; + uint8_t harq_ack_resource; + uint8_t npdcch_order_indication; + uint8_t starting_number_of_nprach_repetitions; + uint8_t subcarrier_indication_of_nprach; + uint8_t paging_direct_indication_differentation_flag; + uint8_t direct_indication; + uint8_t dci_subframe_repetition_number; + uint8_t total_dci_length_including_padding; +} nfapi_dl_config_npdcch_pdu_rel13_t; + +#define NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG 0x205D + +typedef struct { + nfapi_dl_config_npdcch_pdu_rel13_t npdcch_pdu_rel13; +} nfapi_dl_config_npdcch_pdu; + +typedef struct { + nfapi_tl_t tl; + uint16_t length; + uint16_t pdu_index; + uint8_t start_symbol; + uint8_t rnti_type; + uint16_t rnti; + uint16_t resource_assignment; + uint16_t repetition_number; + uint8_t modulation; + uint8_t number_of_subframes_for_resource_assignment; + uint8_t scrambling_sequence_initialization_cinit; + uint16_t sf_idx; + uint8_t nrs_antenna_ports_assumed_by_the_ue; +} nfapi_dl_config_ndlsch_pdu_rel13_t; + +#define NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG 0x205E + +typedef struct { + nfapi_dl_config_ndlsch_pdu_rel13_t ndlsch_pdu_rel13; +} nfapi_dl_config_ndlsch_pdu; + + +typedef struct { + uint8_t pdu_type; + uint8_t pdu_size; + union { + nfapi_dl_config_dci_dl_pdu dci_dl_pdu; + nfapi_dl_config_bch_pdu bch_pdu; + nfapi_dl_config_mch_pdu mch_pdu; + nfapi_dl_config_dlsch_pdu dlsch_pdu; + nfapi_dl_config_pch_pdu pch_pdu; + nfapi_dl_config_prs_pdu prs_pdu; + nfapi_dl_config_csi_rs_pdu csi_rs_pdu; + nfapi_dl_config_epdcch_pdu epdcch_pdu; + nfapi_dl_config_mpdcch_pdu mpdcch_pdu; + nfapi_dl_config_nbch_pdu nbch_pdu; + nfapi_dl_config_npdcch_pdu npdcch_pdu; + nfapi_dl_config_ndlsch_pdu ndlsch_pdu; + }; +} nfapi_dl_config_request_pdu_t; + +#define NFAPI_DL_CONFIG_MAX_PDU 100 +typedef struct { + nfapi_tl_t tl; + uint8_t number_pdcch_ofdm_symbols; + uint8_t number_dci; + uint16_t number_pdu; + uint8_t number_pdsch_rnti; + uint16_t transmission_power_pcfich; + nfapi_dl_config_request_pdu_t* dl_config_pdu_list; +} nfapi_dl_config_request_body_t; +#define NFAPI_DL_CONFIG_REQUEST_BODY_TAG 0x2000 + +typedef struct { + nfapi_tl_t tl; + uint32_t handle; + uint16_t size; + uint16_t rnti; + uint8_t resource_block_start; + uint8_t number_of_resource_blocks; + uint8_t modulation_type; + uint8_t cyclic_shift_2_for_drms; + uint8_t frequency_hopping_enabled_flag; + uint8_t frequency_hopping_bits; + uint8_t new_data_indication; + uint8_t redundancy_version; + uint8_t harq_process_number; + uint8_t ul_tx_mode; + uint8_t current_tx_nb; + uint8_t n_srs; +} nfapi_ul_config_ulsch_pdu_rel8_t; +#define NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG 0x200D + +typedef struct { + nfapi_tl_t tl; + uint8_t resource_allocation_type; + uint32_t resource_block_coding; + uint8_t transport_blocks; + uint8_t transmission_scheme; + uint8_t number_of_layers; + uint8_t codebook_index; + uint8_t disable_sequence_hopping_flag; +} nfapi_ul_config_ulsch_pdu_rel10_t; +#define NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG 0x200E + + +typedef struct { + nfapi_tl_t tl; + uint8_t virtual_cell_id_enabled_flag; + uint16_t npusch_identity; + uint8_t dmrs_config_flag; + uint16_t ndmrs_csh_identity; +} nfapi_ul_config_ulsch_pdu_rel11_t; + +#define NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG 0x2043 + +typedef struct { + nfapi_tl_t tl; + uint8_t ue_type; + uint16_t total_number_of_repetitions; + uint16_t repetition_number; + uint16_t initial_transmission_sf_io; + uint8_t empty_symbols_due_to_re_tunning; +} nfapi_ul_config_ulsch_pdu_rel13_t; +#define NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG 0x2044 + +typedef struct { + nfapi_ul_config_ulsch_pdu_rel8_t ulsch_pdu_rel8; + nfapi_ul_config_ulsch_pdu_rel10_t ulsch_pdu_rel10; + nfapi_ul_config_ulsch_pdu_rel11_t ulsch_pdu_rel11; + nfapi_ul_config_ulsch_pdu_rel13_t ulsch_pdu_rel13; +} nfapi_ul_config_ulsch_pdu; + +typedef struct { + nfapi_tl_t tl; + uint8_t dl_cqi_pmi_size_rank_1; + uint8_t dl_cqi_pmi_size_rank_greater_1; + uint8_t ri_size; + uint8_t delta_offset_cqi; + uint8_t delta_offset_ri; +} nfapi_ul_config_cqi_ri_information_rel8_t; +#define NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG 0x2010 + +typedef struct { + uint8_t dl_cqi_pmi_ri_size; + uint8_t control_type; +} nfapi_ul_config_periodic_cqi_pmi_ri_report_t; + +typedef struct { + uint8_t number_of_cc; + struct { + uint8_t ri_size; + uint8_t dl_cqi_pmi_size[8]; + } cc[NFAPI_MAX_CC]; +} nfapi_ul_config_aperiodic_cqi_pmi_ri_report_t; + +typedef struct { + nfapi_tl_t tl; + uint8_t report_type; + uint8_t delta_offset_cqi; + uint8_t delta_offset_ri; + union { + nfapi_ul_config_periodic_cqi_pmi_ri_report_t periodic_cqi_pmi_ri_report; + nfapi_ul_config_aperiodic_cqi_pmi_ri_report_t aperiodic_cqi_pmi_ri_report; + }; +} nfapi_ul_config_cqi_ri_information_rel9_t; +#define NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG 0x2011 + +typedef struct { + uint16_t dl_cqi_pmi_ri_size_2; +} nfapi_ul_config_periodic_cqi_pmi_ri_report_re13_t; + +typedef struct { +} nfapi_ul_config_aperiodic_cqi_pmi_ri_report_re13_t; + +typedef struct { + nfapi_tl_t tl; + uint8_t report_type; // Convience parameter, not sent on the wire + union { + nfapi_ul_config_periodic_cqi_pmi_ri_report_re13_t periodic_cqi_pmi_ri_report; + nfapi_ul_config_aperiodic_cqi_pmi_ri_report_re13_t aperiodic_cqi_pmi_ri_report; + }; +} nfapi_ul_config_cqi_ri_information_rel13_t; +#define NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG 0x2045 + +typedef struct { + nfapi_ul_config_cqi_ri_information_rel8_t cqi_ri_information_rel8; + nfapi_ul_config_cqi_ri_information_rel9_t cqi_ri_information_rel9; + nfapi_ul_config_cqi_ri_information_rel13_t cqi_ri_information_rel13; +} nfapi_ul_config_cqi_ri_information; + +typedef struct { + nfapi_tl_t tl; + uint8_t harq_size; + uint8_t delta_offset_harq; + uint8_t ack_nack_mode; +} nfapi_ul_config_ulsch_harq_information_rel10_t; +#define NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG 0x2012 + +typedef struct { + nfapi_tl_t tl; + uint16_t harq_size_2; + uint8_t delta_offset_harq_2; +} nfapi_ul_config_ulsch_harq_information_rel13_t; +#define NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG 0x2046 + +typedef struct { + nfapi_ul_config_ulsch_harq_information_rel10_t harq_information_rel10; + nfapi_ul_config_ulsch_harq_information_rel13_t harq_information_rel13; +} nfapi_ul_config_ulsch_harq_information; + +typedef struct { + nfapi_tl_t tl; + uint8_t n_srs_initial; + uint8_t initial_number_of_resource_blocks; +} nfapi_ul_config_initial_transmission_parameters_rel8_t; +#define NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG 0x200F + +typedef struct { + nfapi_ul_config_initial_transmission_parameters_rel8_t initial_transmission_parameters_rel8; +} nfapi_ul_config_initial_transmission_parameters; + +typedef struct { + nfapi_ul_config_ulsch_pdu ulsch_pdu; + nfapi_ul_config_cqi_ri_information cqi_ri_information; + nfapi_ul_config_initial_transmission_parameters initial_transmission_parameters; +} nfapi_ul_config_ulsch_cqi_ri_pdu; + +typedef struct { + nfapi_ul_config_ulsch_pdu ulsch_pdu; + nfapi_ul_config_ulsch_harq_information harq_information; + nfapi_ul_config_initial_transmission_parameters initial_transmission_parameters; +} nfapi_ul_config_ulsch_harq_pdu; + +typedef struct { + nfapi_ul_config_ulsch_pdu ulsch_pdu; + nfapi_ul_config_cqi_ri_information cqi_ri_information; + nfapi_ul_config_ulsch_harq_information harq_information; + nfapi_ul_config_initial_transmission_parameters initial_transmission_parameters; +} nfapi_ul_config_ulsch_cqi_harq_ri_pdu; + + +typedef struct { + nfapi_tl_t tl; + uint32_t handle; + uint16_t rnti; +} nfapi_ul_config_ue_information_rel8_t; +#define NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG 0x2013 + +typedef struct { + nfapi_tl_t tl; + uint8_t virtual_cell_id_enabled_flag; + uint16_t npusch_identity; +} nfapi_ul_config_ue_information_rel11_t; + +#define NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG 0x2047 + +typedef struct { + nfapi_tl_t tl; + uint8_t ue_type; + uint8_t empty_symbols; + uint16_t total_number_of_repetitions; + uint16_t repetition_number; +} nfapi_ul_config_ue_information_rel13_t; + +#define NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG 0x2048 + +typedef struct { + nfapi_ul_config_ue_information_rel8_t ue_information_rel8; + nfapi_ul_config_ue_information_rel11_t ue_information_rel11; + nfapi_ul_config_ue_information_rel13_t ue_information_rel13; +} nfapi_ul_config_ue_information; + +typedef struct { + nfapi_tl_t tl; + uint16_t pucch_index; + uint8_t dl_cqi_pmi_size; +} nfapi_ul_config_cqi_information_rel8_t; +#define NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG 0x2014 + +typedef struct { + nfapi_tl_t tl; + uint8_t number_of_pucch_resource; + uint16_t pucch_index_p1; +} nfapi_ul_config_cqi_information_rel10_t; +#define NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG 0x2015 + +typedef struct { + nfapi_tl_t tl; + uint8_t csi_mode; + uint16_t dl_cqi_pmi_size_2; + uint8_t starting_prb; + uint8_t n_prb; + uint8_t cdm_index; + uint8_t n_srs; +} nfapi_ul_config_cqi_information_rel13_t; +#define NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG 0x2049 + +typedef struct { + nfapi_ul_config_cqi_information_rel8_t cqi_information_rel8; + nfapi_ul_config_cqi_information_rel10_t cqi_information_rel10; + nfapi_ul_config_cqi_information_rel13_t cqi_information_rel13; +} nfapi_ul_config_cqi_information; + +typedef struct { + nfapi_tl_t tl; + uint16_t pucch_index; +} nfapi_ul_config_sr_information_rel8_t; +#define NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG 0x2016 + +typedef struct { + nfapi_tl_t tl; + uint8_t number_of_pucch_resources; + uint16_t pucch_index_p1; +} nfapi_ul_config_sr_information_rel10_t; +#define NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG 0x2017 + +typedef struct { + nfapi_ul_config_sr_information_rel8_t sr_information_rel8; + nfapi_ul_config_sr_information_rel10_t sr_information_rel10; +} nfapi_ul_config_sr_information; + +typedef struct { + nfapi_tl_t tl; + uint8_t harq_size; + uint8_t ack_nack_mode; + uint8_t number_of_pucch_resources; + uint16_t n_pucch_1_0; + uint16_t n_pucch_1_1; + uint16_t n_pucch_1_2; + uint16_t n_pucch_1_3; +} nfapi_ul_config_harq_information_rel10_tdd_t; +#define NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG 0x2018 + + +typedef struct { + nfapi_tl_t tl; + uint16_t n_pucch_1_0; + uint8_t harq_size; +} nfapi_ul_config_harq_information_rel8_fdd_t; +#define NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG 0x2019 + +typedef struct { + nfapi_tl_t tl; + uint8_t harq_size; + uint8_t ack_nack_mode; + uint8_t number_of_pucch_resources; + uint16_t n_pucch_1_0; + uint16_t n_pucch_1_1; + uint16_t n_pucch_1_2; + uint16_t n_pucch_1_3; +} nfapi_ul_config_harq_information_rel9_fdd_t; +#define NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG 0x201a + +typedef struct { + nfapi_tl_t tl; + uint8_t num_ant_ports; + uint16_t n_pucch_2_0; + uint16_t n_pucch_2_1; + uint16_t n_pucch_2_2; + uint16_t n_pucch_2_3; +} nfapi_ul_config_harq_information_rel11_t; +#define NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG 0x204A + +typedef struct { + nfapi_tl_t tl; + uint16_t harq_size_2; + uint8_t starting_prb; + uint8_t n_prb; + uint8_t cdm_index; + uint8_t n_srs; +} nfapi_ul_config_harq_information_rel13_t; +#define NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG 0x204B + +typedef struct { + nfapi_ul_config_harq_information_rel10_tdd_t harq_information_rel10_tdd; + nfapi_ul_config_harq_information_rel8_fdd_t harq_information_rel8_fdd; + nfapi_ul_config_harq_information_rel9_fdd_t harq_information_rel9_fdd; + nfapi_ul_config_harq_information_rel11_t harq_information_rel11; + nfapi_ul_config_harq_information_rel13_t harq_information_rel13; +} nfapi_ul_config_harq_information; + +typedef struct { + nfapi_tl_t tl; + uint32_t handle; + uint16_t size; + uint16_t rnti; + uint8_t srs_bandwidth; + uint8_t frequency_domain_position; + uint8_t srs_hopping_bandwidth; + uint8_t transmission_comb; + uint16_t i_srs; + uint8_t sounding_reference_cyclic_shift; +} nfapi_ul_config_srs_pdu_rel8_t; +#define NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG 0x201b + +typedef struct { + nfapi_tl_t tl; + uint8_t antenna_port; +} nfapi_ul_config_srs_pdu_rel10_t; +#define NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG 0x201c + +typedef struct { + nfapi_tl_t tl; + uint8_t number_of_combs; +} nfapi_ul_config_srs_pdu_rel13_t; +#define NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG 0x204c + +typedef struct { + nfapi_ul_config_srs_pdu_rel8_t srs_pdu_rel8; + nfapi_ul_config_srs_pdu_rel10_t srs_pdu_rel10; + nfapi_ul_config_srs_pdu_rel13_t srs_pdu_rel13; +} nfapi_ul_config_srs_pdu; + +typedef struct { + nfapi_ul_config_ue_information ue_information; + nfapi_ul_config_cqi_information cqi_information; +} nfapi_ul_config_uci_cqi_pdu; + +typedef struct { + nfapi_ul_config_ue_information ue_information; + nfapi_ul_config_sr_information sr_information; +} nfapi_ul_config_uci_sr_pdu; + +typedef struct { + nfapi_ul_config_ue_information ue_information; + nfapi_ul_config_harq_information harq_information; +} nfapi_ul_config_uci_harq_pdu; + +typedef struct { + nfapi_ul_config_ue_information ue_information; + nfapi_ul_config_sr_information sr_information; + nfapi_ul_config_harq_information harq_information; +} nfapi_ul_config_uci_sr_harq_pdu; + +typedef struct { + nfapi_ul_config_ue_information ue_information; + nfapi_ul_config_cqi_information cqi_information; + nfapi_ul_config_harq_information harq_information; +} nfapi_ul_config_uci_cqi_harq_pdu; + +typedef struct { + nfapi_ul_config_ue_information ue_information; + nfapi_ul_config_cqi_information cqi_information; + nfapi_ul_config_sr_information sr_information; +} nfapi_ul_config_uci_cqi_sr_pdu; + +typedef struct { + nfapi_ul_config_ue_information ue_information; + nfapi_ul_config_cqi_information cqi_information; + nfapi_ul_config_sr_information sr_information; + nfapi_ul_config_harq_information harq_information; +} nfapi_ul_config_uci_cqi_sr_harq_pdu; + +typedef struct { + nfapi_ul_config_ue_information ue_information; +} nfapi_ul_config_harq_buffer_pdu; + +typedef struct { + nfapi_ul_config_ulsch_pdu ulsch_pdu; + nfapi_ul_config_cqi_information csi_information; +} nfapi_ul_config_ulsch_uci_csi_pdu; + +typedef struct { + nfapi_ul_config_ulsch_pdu ulsch_pdu; + nfapi_ul_config_harq_information harq_information; +} nfapi_ul_config_ulsch_uci_harq_pdu; + +typedef struct { + nfapi_ul_config_ulsch_pdu ulsch_pdu; + nfapi_ul_config_cqi_information csi_information; + nfapi_ul_config_harq_information harq_information; +} nfapi_ul_config_ulsch_csi_uci_harq_pdu; + +typedef struct { + nfapi_tl_t tl; + uint8_t harq_ack_resource; +} nfapi_ul_config_nb_harq_information_rel13_fdd_t; +#define NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG 0x2061 + +typedef struct { + nfapi_ul_config_nb_harq_information_rel13_fdd_t nb_harq_information_rel13_fdd; +} nfapi_ul_config_nb_harq_information; + +typedef struct { + nfapi_tl_t tl; + uint8_t nulsch_format; + uint32_t handle; + uint16_t size; + uint16_t rnti; + uint8_t subcarrier_indication; + uint8_t resource_assignment; + uint8_t mcs; + uint8_t redudancy_version; + uint8_t repetition_number; + uint8_t new_data_indication; + uint8_t n_srs; + uint16_t scrambling_sequence_initialization_cinit; + uint16_t sf_idx; + nfapi_ul_config_ue_information ue_information; + nfapi_ul_config_nb_harq_information nb_harq_information; +} nfapi_ul_config_nulsch_pdu_rel13_t; +#define NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG 0x205F + +typedef struct { + nfapi_ul_config_nulsch_pdu_rel13_t nulsch_pdu_rel13; +} nfapi_ul_config_nulsch_pdu; + + +typedef struct { + nfapi_tl_t tl; + uint8_t nprach_config_0; + uint8_t nprach_config_1; + uint8_t nprach_config_2; +} nfapi_ul_config_nrach_pdu_rel13_t; +#define NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG 0x2067 + +typedef struct { + nfapi_ul_config_nrach_pdu_rel13_t nrach_pdu_rel13; +} nfapi_ul_config_nrach_pdu; + +typedef struct { + uint8_t pdu_type; + uint8_t pdu_size; + union { + nfapi_ul_config_ulsch_pdu ulsch_pdu; + nfapi_ul_config_ulsch_cqi_ri_pdu ulsch_cqi_ri_pdu; + nfapi_ul_config_ulsch_harq_pdu ulsch_harq_pdu; + nfapi_ul_config_ulsch_cqi_harq_ri_pdu ulsch_cqi_harq_ri_pdu; + nfapi_ul_config_uci_cqi_pdu uci_cqi_pdu; + nfapi_ul_config_uci_sr_pdu uci_sr_pdu; + nfapi_ul_config_uci_harq_pdu uci_harq_pdu; + nfapi_ul_config_uci_sr_harq_pdu uci_sr_harq_pdu; + nfapi_ul_config_uci_cqi_harq_pdu uci_cqi_harq_pdu; + nfapi_ul_config_uci_cqi_sr_pdu uci_cqi_sr_pdu; + nfapi_ul_config_uci_cqi_sr_harq_pdu uci_cqi_sr_harq_pdu; + nfapi_ul_config_srs_pdu srs_pdu; + nfapi_ul_config_harq_buffer_pdu harq_buffer_pdu; + nfapi_ul_config_ulsch_uci_csi_pdu ulsch_uci_csi_pdu; + nfapi_ul_config_ulsch_uci_harq_pdu ulsch_uci_harq_pdu; + nfapi_ul_config_ulsch_csi_uci_harq_pdu ulsch_csi_uci_harq_pdu; + nfapi_ul_config_nulsch_pdu nulsch_pdu; + nfapi_ul_config_nrach_pdu nrach_pdu; + }; +} nfapi_ul_config_request_pdu_t; + +#define NFAPI_UL_CONFIG_MAX_PDU 100 +typedef struct { + nfapi_tl_t tl; + uint8_t number_of_pdus; + uint8_t rach_prach_frequency_resources; + uint8_t srs_present; + nfapi_ul_config_request_pdu_t* ul_config_pdu_list; +} nfapi_ul_config_request_body_t; +#define NFAPI_UL_CONFIG_REQUEST_BODY_TAG 0x200C + +typedef struct { + nfapi_tl_t tl; + uint8_t resource_block_start; + uint8_t cyclic_shift_2_for_drms; + uint8_t hi_value; + uint8_t i_phich; + uint16_t transmission_power; +} nfapi_hi_dci0_hi_pdu_rel8_t; +#define NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG 0x201e + +typedef struct { + nfapi_tl_t tl; + uint8_t flag_tb2; + uint8_t hi_value_2; +} nfapi_hi_dci0_hi_pdu_rel10_t; +#define NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG 0x201f + +typedef struct { + nfapi_hi_dci0_hi_pdu_rel8_t hi_pdu_rel8; + nfapi_hi_dci0_hi_pdu_rel10_t hi_pdu_rel10; +} nfapi_hi_dci0_hi_pdu; + +typedef struct { + nfapi_tl_t tl; + uint8_t dci_format; + uint8_t cce_index; + uint8_t aggregation_level; + uint16_t rnti; + uint8_t resource_block_start; + uint8_t number_of_resource_block; + uint8_t mcs_1; + uint8_t cyclic_shift_2_for_drms; + uint8_t frequency_hopping_enabled_flag; + uint8_t frequency_hopping_bits; + uint8_t new_data_indication_1; + uint8_t ue_tx_antenna_seleciton; + uint8_t tpc; + uint8_t cqi_csi_request; + uint8_t ul_index; + uint8_t dl_assignment_index; + uint32_t tpc_bitmap; + uint16_t transmission_power; +} nfapi_hi_dci0_dci_pdu_rel8_t; +#define NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG 0x2020 + +typedef struct { + nfapi_tl_t tl; + uint8_t cross_carrier_scheduling_flag; + uint8_t carrier_indicator; + uint8_t size_of_cqi_csi_feild; + uint8_t srs_flag; + uint8_t srs_request; + uint8_t resource_allocation_flag; + uint8_t resource_allocation_type; + uint32_t resource_block_coding; + uint8_t mcs_2; + uint8_t new_data_indication_2; + uint8_t number_of_antenna_ports; + uint8_t tpmi; + uint8_t total_dci_length_including_padding; + uint8_t n_ul_rb; +} nfapi_hi_dci0_dci_pdu_rel10_t; +#define NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG 0x2021 + +typedef struct { + nfapi_tl_t tl; + uint8_t pscch_resource; + uint8_t time_resource_pattern; +} nfapi_hi_dci0_dci_pdu_rel12_t; + +#define NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG 0x204D + +typedef struct { + nfapi_hi_dci0_dci_pdu_rel8_t dci_pdu_rel8; + nfapi_hi_dci0_dci_pdu_rel10_t dci_pdu_rel10; + nfapi_hi_dci0_dci_pdu_rel12_t dci_pdu_rel12; +} nfapi_hi_dci0_dci_pdu; + +typedef nfapi_hi_dci0_dci_pdu_rel8_t nfapi_hi_dci0_epdcch_dci_pdu_rel8_t; +#define NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG 0x2020 + +typedef nfapi_hi_dci0_dci_pdu_rel10_t nfapi_hi_dci0_epdcch_dci_pdu_rel10_t; +#define NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG 0x2021 + +typedef nfapi_dl_config_epdcch_parameters_rel11_t nfapi_hi_dci0_epdcch_parameters_rel11_t; +#define NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG 0x2041 + +typedef struct { + nfapi_hi_dci0_epdcch_dci_pdu_rel8_t epdcch_dci_pdu_rel8; + nfapi_hi_dci0_epdcch_dci_pdu_rel10_t epdcch_dci_pdu_rel10; + nfapi_hi_dci0_epdcch_parameters_rel11_t epdcch_parameters_rel11; +} nfapi_hi_dci0_epdcch_dci_pdu; + + +typedef struct { + nfapi_tl_t tl; + uint8_t mpdcch_narrowband; + uint8_t number_of_prb_pairs; + uint8_t resource_block_assignment; + uint8_t mpdcch_transmission_type; + uint8_t start_symbol; + uint8_t ecce_index; + uint8_t aggreagation_level; + uint8_t rnti_type; + uint16_t rnti; + uint8_t ce_mode; + uint16_t drms_scrambling_init; + uint16_t initial_transmission_sf_io; + uint16_t transmission_power; + uint8_t dci_format; + uint8_t resource_block_start; + uint8_t number_of_resource_blocks; + uint8_t mcs; + uint8_t pusch_repetition_levels; + uint8_t frequency_hopping_flag; + uint8_t new_data_indication; + uint8_t harq_process; + uint8_t redudency_version; + uint8_t tpc; + uint8_t csi_request; + uint8_t ul_inex; + uint8_t dai_presence_flag; + uint8_t dl_assignment_index; + uint8_t srs_request; + uint8_t dci_subframe_repetition_number; + uint32_t tcp_bitmap; + uint8_t total_dci_length_include_padding; + uint8_t number_of_tx_antenna_ports; + uint16_t precoding_value[NFAPI_MAX_ANTENNA_PORT_COUNT]; +} nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t; +#define NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG 0x204E + +typedef struct { + nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t mpdcch_dci_pdu_rel13; +} nfapi_hi_dci0_mpdcch_dci_pdu; + +typedef struct { + nfapi_tl_t tl; + uint8_t ncce_index; + uint8_t aggregation_level; + uint8_t start_symbol; + uint16_t rnti; + uint8_t scrambling_reinitialization_batch_index; + uint8_t nrs_antenna_ports_assumed_by_the_ue; + uint8_t subcarrier_indication; + uint8_t resource_assignment; + uint8_t scheduling_delay; + uint8_t mcs; + uint8_t redudancy_version; + uint8_t repetition_number; + uint8_t new_data_indicator; + uint8_t dci_subframe_repetition_number; +} nfapi_hi_dci0_npdcch_dci_pdu_rel13_t; + +#define NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG 0x2062 + +typedef struct { + nfapi_hi_dci0_npdcch_dci_pdu_rel13_t npdcch_dci_pdu_rel13; +} nfapi_hi_dci0_npdcch_dci_pdu; + +typedef struct { + uint8_t pdu_type; + uint8_t pdu_size; + union { + nfapi_hi_dci0_hi_pdu hi_pdu; + nfapi_hi_dci0_dci_pdu dci_pdu; + nfapi_hi_dci0_epdcch_dci_pdu epdcch_dci_pdu; + nfapi_hi_dci0_mpdcch_dci_pdu mpdcch_dci_pdu; + nfapi_hi_dci0_npdcch_dci_pdu npdcch_dci_pdu; + }; +} nfapi_hi_dci0_request_pdu_t; + +#define NFAPI_HI_DCI0_MAX_PDU 100 +typedef struct { + nfapi_tl_t tl; + uint16_t sfnsf; + uint8_t number_of_dci; + uint8_t number_of_hi; + nfapi_hi_dci0_request_pdu_t* hi_dci0_pdu_list; +} nfapi_hi_dci0_request_body_t; +#define NFAPI_HI_DCI0_REQUEST_BODY_TAG 0x201D + +#define NFAPI_TX_MAX_SEGMENTS 32 +typedef struct { + uint16_t pdu_length; + uint16_t pdu_index; + uint8_t num_segments; + struct { + uint32_t segment_length; + uint8_t* segment_data; + } segments[NFAPI_TX_MAX_SEGMENTS]; +} nfapi_tx_request_pdu_t; + +#define NFAPI_TX_MAX_PDU 100 +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_pdus; + nfapi_tx_request_pdu_t* tx_pdu_list; +} nfapi_tx_request_body_t; +#define NFAPI_TX_REQUEST_BODY_TAG 0x2022 + +// P7 Message Structures +typedef struct { + nfapi_p7_message_header_t header; + uint32_t t1; + int32_t delta_sfn_sf; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_dl_node_sync_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint32_t t1; + uint32_t t2; + uint32_t t3; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_ul_node_sync_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint32_t last_sfn_sf; + uint32_t time_since_last_timing_info; + uint32_t dl_config_jitter; + uint32_t tx_request_jitter; + uint32_t ul_config_jitter; + uint32_t hi_dci0_jitter; + int32_t dl_config_latest_delay; + int32_t tx_request_latest_delay; + int32_t ul_config_latest_delay; + int32_t hi_dci0_latest_delay; + int32_t dl_config_earliest_arrival; + int32_t tx_request_earliest_arrival; + int32_t ul_config_earliest_arrival; + int32_t hi_dci0_earliest_arrival; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_timing_info_t; + +typedef struct { + nfapi_tl_t tl; + uint32_t handle; + uint16_t rnti; +} nfapi_rx_ue_information; +#define NFAPI_RX_UE_INFORMATION_TAG 0x2038 + +typedef struct { + uint8_t value_0; + uint8_t value_1; +} nfapi_harq_indication_tdd_harq_data_bundling_t; + +typedef struct { + uint8_t value_0; + uint8_t value_1; + uint8_t value_2; + uint8_t value_3; +} nfapi_harq_indication_tdd_harq_data_multiplexing_t; + +typedef struct { + uint8_t value_0; +} nfapi_harq_indication_tdd_harq_data_special_bundling_t; + +typedef struct { + uint8_t value_0; +} nfapi_harq_indication_tdd_harq_data_t; + +typedef struct { + nfapi_tl_t tl; + uint8_t mode; + uint8_t number_of_ack_nack; + union{ + nfapi_harq_indication_tdd_harq_data_bundling_t bundling; + nfapi_harq_indication_tdd_harq_data_multiplexing_t multiplex; + nfapi_harq_indication_tdd_harq_data_special_bundling_t special_bundling; + } harq_data; +} nfapi_harq_indication_tdd_rel8_t; +#define NFAPI_HARQ_INDICATION_TDD_REL8_TAG 0x2027 + +typedef struct { + nfapi_tl_t tl; + uint8_t mode; + uint8_t number_of_ack_nack; + union{ + nfapi_harq_indication_tdd_harq_data_t bundling; + nfapi_harq_indication_tdd_harq_data_t multiplex; + nfapi_harq_indication_tdd_harq_data_special_bundling_t special_bundling; + nfapi_harq_indication_tdd_harq_data_t channel_selection; + nfapi_harq_indication_tdd_harq_data_t format_3; + } harq_data[NFAPI_MAX_NUMBER_ACK_NACK_TDD]; +} nfapi_harq_indication_tdd_rel9_t; +#define NFAPI_HARQ_INDICATION_TDD_REL9_TAG 0x2028 + +typedef struct { + nfapi_tl_t tl; + uint8_t mode; + uint16_t number_of_ack_nack; + union{ + nfapi_harq_indication_tdd_harq_data_t bundling; + nfapi_harq_indication_tdd_harq_data_t multiplex; + nfapi_harq_indication_tdd_harq_data_special_bundling_t special_bundling; + nfapi_harq_indication_tdd_harq_data_t channel_selection; + nfapi_harq_indication_tdd_harq_data_t format_3; + nfapi_harq_indication_tdd_harq_data_t format_4; + nfapi_harq_indication_tdd_harq_data_t format_5; + } harq_data[NFAPI_MAX_NUMBER_ACK_NACK_TDD]; +} nfapi_harq_indication_tdd_rel13_t; +#define NFAPI_HARQ_INDICATION_TDD_REL13_TAG 0x204F + +typedef struct { + nfapi_tl_t tl; + uint8_t harq_tb1; + uint8_t harq_tb2; +} nfapi_harq_indication_fdd_rel8_t; +#define NFAPI_HARQ_INDICATION_FDD_REL8_TAG 0x2029 + +#define NFAPI_HARQ_ACK_NACK_REL9_MAX 10 +typedef struct { + nfapi_tl_t tl; + uint8_t mode; + uint8_t number_of_ack_nack; + uint8_t harq_tb_n[NFAPI_HARQ_ACK_NACK_REL9_MAX]; +} nfapi_harq_indication_fdd_rel9_t; +#define NFAPI_HARQ_INDICATION_FDD_REL9_TAG 0x202a + +#define NFAPI_HARQ_ACK_NACK_REL13_MAX 22 // Need to check this max? +typedef struct { + nfapi_tl_t tl; + uint8_t mode; + uint16_t number_of_ack_nack; + uint8_t harq_tb_n[NFAPI_HARQ_ACK_NACK_REL13_MAX]; +} nfapi_harq_indication_fdd_rel13_t; +#define NFAPI_HARQ_INDICATION_FDD_REL13_TAG 0x2050 + +typedef struct { + nfapi_tl_t tl; + uint8_t ul_cqi; + uint8_t channel; +} nfapi_ul_cqi_information_t; +#define NFAPI_UL_CQI_INFORMATION_TAG 0x2052 + +// Only expect 1 harq_indication TLV.tag to be set +// Would this be a better a an union, but not clear which combinations +// are valid +typedef struct { + uint16_t instance_length; + nfapi_rx_ue_information rx_ue_information; + nfapi_harq_indication_tdd_rel8_t harq_indication_tdd_rel8; + nfapi_harq_indication_tdd_rel9_t harq_indication_tdd_rel9; + nfapi_harq_indication_tdd_rel13_t harq_indication_tdd_rel13; + nfapi_harq_indication_fdd_rel8_t harq_indication_fdd_rel8; + nfapi_harq_indication_fdd_rel9_t harq_indication_fdd_rel9; + nfapi_harq_indication_fdd_rel13_t harq_indication_fdd_rel13; + nfapi_ul_cqi_information_t ul_cqi_information; +} nfapi_harq_indication_pdu_t; + +#define NFAPI_HARQ_IND_MAX_PDU 100 +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_harqs; + nfapi_harq_indication_pdu_t* harq_pdu_list; +} nfapi_harq_indication_body_t; +#define NFAPI_HARQ_INDICATION_BODY_TAG 0x2026 + +typedef struct { + nfapi_tl_t tl; + uint8_t crc_flag; +} nfapi_crc_indication_rel8_t; +#define NFAPI_CRC_INDICATION_REL8_TAG 0x202c + +typedef struct { + uint16_t instance_length; + nfapi_rx_ue_information rx_ue_information; + nfapi_crc_indication_rel8_t crc_indication_rel8; +} nfapi_crc_indication_pdu_t; + +#define NFAPI_CRC_IND_MAX_PDU 100 +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_crcs; + nfapi_crc_indication_pdu_t* crc_pdu_list; +} nfapi_crc_indication_body_t; +#define NFAPI_CRC_INDICATION_BODY_TAG 0x202b + +typedef struct { + uint16_t instance_length; + nfapi_rx_ue_information rx_ue_information; + nfapi_ul_cqi_information_t ul_cqi_information; +} nfapi_sr_indication_pdu_t; + +#define NFAPI_SR_IND_MAX_PDU 100 +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_srs; // Question : should this be srs + nfapi_sr_indication_pdu_t* sr_pdu_list; +} nfapi_sr_indication_body_t; +#define NFAPI_SR_INDICATION_BODY_TAG 0x202d + +// The data offset should be set to 0 or 1 before encoding +// If it is set to 1 the nfapi library will detemine the correct offset + +typedef struct { + nfapi_tl_t tl; + uint16_t length; + uint16_t data_offset; + uint8_t ul_cqi; + uint8_t ri; + uint16_t timing_advance; +} nfapi_cqi_indication_rel8_t; +#define NFAPI_CQI_INDICATION_REL8_TAG 0x202f + +#define NFAPI_CC_MAX 4 +typedef struct { + nfapi_tl_t tl; + uint16_t length; + uint16_t data_offset; + uint8_t ul_cqi; + uint8_t number_of_cc_reported; + uint8_t ri[NFAPI_CC_MAX]; + uint16_t timing_advance; + uint16_t timing_advance_r9; +} nfapi_cqi_indication_rel9_t; +#define NFAPI_CQI_INDICATION_REL9_TAG 0x2030 + +typedef struct { + uint16_t instance_length; + nfapi_rx_ue_information rx_ue_information; + nfapi_cqi_indication_rel8_t cqi_indication_rel8; + nfapi_cqi_indication_rel9_t cqi_indication_rel9; + nfapi_ul_cqi_information_t ul_cqi_information; +} nfapi_cqi_indication_pdu_t; + +#define NFAPI_CQI_RAW_MAX_LEN 12 +typedef struct { + uint8_t pdu[NFAPI_CQI_RAW_MAX_LEN]; +} nfapi_cqi_indication_raw_pdu_t; + +#define NFAPI_CQI_IND_MAX_PDU 100 +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_cqis; + nfapi_cqi_indication_pdu_t* cqi_pdu_list; + nfapi_cqi_indication_raw_pdu_t* cqi_raw_pdu_list; +} nfapi_cqi_indication_body_t; +#define NFAPI_CQI_INDICATION_BODY_TAG 0x202e + +typedef struct { + nfapi_tl_t tl; + uint16_t rnti; + uint8_t preamble; + uint16_t timing_advance; +} nfapi_preamble_pdu_rel8_t; +#define NFAPI_PREAMBLE_REL8_TAG 0x2032 + +typedef struct { + nfapi_tl_t tl; + uint16_t timing_advance_r9; +} nfapi_preamble_pdu_rel9_t; +#define NFAPI_PREAMBLE_REL9_TAG 0x2033 + +typedef struct { + nfapi_tl_t tl; + uint8_t rach_resource_type; +} nfapi_preamble_pdu_rel13_t; +#define NFAPI_PREAMBLE_REL13_TAG 0x2051 + +typedef struct { + uint16_t instance_length; + nfapi_preamble_pdu_rel8_t preamble_rel8; + nfapi_preamble_pdu_rel9_t preamble_rel9; + nfapi_preamble_pdu_rel13_t preamble_rel13; +} nfapi_preamble_pdu_t; + +#define NFAPI_PREAMBLE_MAX_PDU 100 +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_preambles; + nfapi_preamble_pdu_t* preamble_list; +} nfapi_rach_indication_body_t; +#define NFAPI_RACH_INDICATION_BODY_TAG 0x2031 + +#define NFAPI_NUM_RB_MAX 1000 +typedef struct { + nfapi_tl_t tl; + uint16_t doppler_estimation; + uint16_t timing_advance; + uint8_t number_of_resource_blocks; + uint8_t rb_start; + uint8_t snr[NFAPI_NUM_RB_MAX]; +} nfapi_srs_indication_fdd_rel8_t; +#define NFAPI_SRS_INDICATION_FDD_REL8_TAG 0x2035 + +typedef struct { + nfapi_tl_t tl; + uint16_t timing_advance_r9; +} nfapi_srs_indication_fdd_rel9_t; +#define NFAPI_SRS_INDICATION_FDD_REL9_TAG 0x2036 + +typedef struct { + nfapi_tl_t tl; + uint8_t uppts_symbol; +} nfapi_srs_indication_ttd_rel10_t; +#define NFAPI_SRS_INDICATION_TDD_REL10_TAG 0x2037 + +typedef struct { + nfapi_tl_t tl; + uint16_t ul_rtoa; +} nfapi_srs_indication_fdd_rel11_t; +#define NFAPI_SRS_INDICATION_FDD_REL11_TAG 0x2053 + + +typedef struct { + nfapi_tl_t tl; + uint8_t num_prb_per_subband; + uint8_t number_of_subbands; + uint8_t num_atennas; + struct { + uint8_t subband_index; + uint16_t channel[NFAPI_MAX_NUM_PHYSICAL_ANTENNAS]; + } subands[NFAPI_MAX_NUM_SUBBANDS]; +} nfapi_tdd_channel_measurement_t; +#define NFAPI_TDD_CHANNEL_MEASUREMENT_TAG 0x2054 + +typedef struct { + uint16_t instance_length; + nfapi_rx_ue_information rx_ue_information; + nfapi_srs_indication_fdd_rel8_t srs_indication_fdd_rel8; + nfapi_srs_indication_fdd_rel9_t srs_indication_fdd_rel9; + nfapi_srs_indication_ttd_rel10_t srs_indication_tdd_rel10; + nfapi_srs_indication_fdd_rel11_t srs_indication_fdd_rel11; + nfapi_tdd_channel_measurement_t tdd_channel_measurement; +} nfapi_srs_indication_pdu_t; + +#define NFAPI_SRS_IND_MAX_PDU 16 +typedef struct { + nfapi_tl_t tl; + uint8_t number_of_ues; + nfapi_srs_indication_pdu_t* srs_pdu_list; +} nfapi_srs_indication_body_t; +#define NFAPI_SRS_INDICATION_BODY_TAG 0x2034 + +typedef struct { + nfapi_tl_t tl; + uint16_t length; + uint16_t offset; + uint8_t ul_cqi; + uint16_t timing_advance; +} nfapi_rx_indication_rel8_t; +#define NFAPI_RX_INDICATION_REL8_TAG 0x2024 + +typedef struct { + nfapi_tl_t tl; + uint16_t timing_advance_r9; + } nfapi_rx_indication_rel9_t; +#define NFAPI_RX_INDICATION_REL9_TAG 0x2025 + +typedef struct { + nfapi_rx_ue_information rx_ue_information; + nfapi_rx_indication_rel8_t rx_indication_rel8; + nfapi_rx_indication_rel9_t rx_indication_rel9; + uint8_t* data; +} nfapi_rx_indication_pdu_t; + +#define NFAPI_RX_IND_MAX_PDU 100 +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_pdus; + nfapi_rx_indication_pdu_t* rx_pdu_list; +} nfapi_rx_indication_body_t; +#define NFAPI_RX_INDICATION_BODY_TAG 0x2023 + +typedef struct { + nfapi_tl_t tl; + uint8_t harq_tb1; +} nfapi_nb_harq_indication_fdd_rel13_t; +#define NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG 0x2064 + +typedef struct { + uint16_t instance_length; + nfapi_rx_ue_information rx_ue_information; + nfapi_nb_harq_indication_fdd_rel13_t nb_harq_indication_fdd_rel13; + nfapi_ul_cqi_information_t ul_cqi_information; +} nfapi_nb_harq_indication_pdu_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_harqs; + nfapi_nb_harq_indication_pdu_t* nb_harq_pdu_list; +} nfapi_nb_harq_indication_body_t; +#define NFAPI_NB_HARQ_INDICATION_BODY_TAG 0x2063 + +typedef struct { + nfapi_tl_t tl; + uint16_t rnti; + uint8_t initial_sc; + uint16_t timing_advance; + uint8_t nrach_ce_level; +} nfapi_nrach_indication_pdu_rel13_t; +#define NFAPI_NRACH_INDICATION_REL13_TAG 0x2066 + +typedef struct { + nfapi_nrach_indication_pdu_rel13_t nrach_indication_rel13; +} nfapi_nrach_indication_pdu_t; + +typedef struct { + nfapi_tl_t tl; + uint8_t number_of_initial_scs_detected; + nfapi_nrach_indication_pdu_t* nrach_pdu_list; +} nfapi_nrach_indication_body_t; +#define NFAPI_NRACH_INDICATION_BODY_TAG 0x2065 + +typedef struct { + nfapi_tl_t tl; + uint32_t handle; + uint32_t mp_cca; + uint32_t n_cca; + uint32_t offset; + uint32_t lte_txop_sf; + uint16_t txop_sfn_sf_end; + uint32_t lbt_mode; +} nfapi_lbt_pdsch_req_pdu_rel13_t; +#define NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG 0x2056 + +typedef struct { + nfapi_lbt_pdsch_req_pdu_rel13_t lbt_pdsch_req_pdu_rel13; +} nfapi_lbt_pdsch_req_pdu; + +typedef struct { + nfapi_tl_t tl; + uint32_t handle; + uint32_t offset; + uint16_t sfn_sf_end; + uint32_t lbt_mode; +} nfapi_lbt_drs_req_pdu_rel13_t; +#define NFAPI_LBT_DRS_REQ_PDU_REL13_TAG 0x2057 + +typedef struct { + nfapi_lbt_drs_req_pdu_rel13_t lbt_drs_req_pdu_rel13; +} nfapi_lbt_drs_req_pdu; + +typedef struct { + uint8_t pdu_type; + uint8_t pdu_size; + union { + nfapi_lbt_pdsch_req_pdu lbt_pdsch_req_pdu; + nfapi_lbt_drs_req_pdu lbt_drs_req_pdu; + }; +} nfapi_lbt_dl_config_request_pdu_t; + +#define NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU 16 +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_pdus; + nfapi_lbt_dl_config_request_pdu_t* lbt_dl_config_req_pdu_list; +} nfapi_lbt_dl_config_request_body_t; +#define NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG 0x2055 + + +typedef struct { + nfapi_tl_t tl; + uint32_t handle; + uint32_t result; + uint32_t lte_txop_symbols; + uint32_t initial_partial_sf; +} nfapi_lbt_pdsch_rsp_pdu_rel13_t; +#define NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG 0x2059 + +typedef struct { + nfapi_lbt_pdsch_rsp_pdu_rel13_t lbt_pdsch_rsp_pdu_rel13; +} nfapi_lbt_pdsch_rsp_pdu; + +typedef struct { + nfapi_tl_t tl; + uint32_t handle; + uint32_t result; +} nfapi_lbt_drs_rsp_pdu_rel13_t; +#define NFAPI_LBT_DRS_RSP_PDU_REL13_TAG 0x205A + +typedef struct { + nfapi_lbt_drs_rsp_pdu_rel13_t lbt_drs_rsp_pdu_rel13; +} nfapi_lbt_drs_rsp_pdu; + + +typedef struct { + uint8_t pdu_type; + uint8_t pdu_size; + union { + nfapi_lbt_pdsch_rsp_pdu lbt_pdsch_rsp_pdu; + nfapi_lbt_drs_rsp_pdu lbt_drs_rsp_pdu; + }; +} nfapi_lbt_dl_indication_pdu_t; + +#define NFAPI_LBT_IND_MAX_PDU 16 +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_pdus; + nfapi_lbt_dl_indication_pdu_t* lbt_indication_pdu_list; +} nfapi_lbt_dl_indication_body_t; +#define NFAPI_LBT_DL_INDICATION_BODY_TAG 0x2058 + +typedef struct { +} nfapi_error_indication_msg_invalid_state; + +typedef struct { +} nfapi_error_indication_msg_bch_missing; + +typedef struct { + uint16_t recieved_sfn_sf; + uint16_t expected_sfn_sf; +} nfapi_error_indication_sfn_out_of_sync; + +typedef struct { + uint8_t sub_error_code; + uint8_t direction; + uint16_t rnti; + uint8_t pdu_type; +} nfapi_error_indication_msg_pdu_err; + +typedef struct { + uint16_t recieved_sfn_sf; + uint16_t expected_sfn_sf; +} nfapi_error_indication_msg_invalid_sfn; + +typedef struct { + uint8_t sub_error_code; + uint8_t phich_lowest_ul_rb_index; +} nfapi_error_indication_msg_hi_err; + +typedef struct { + uint8_t sub_error_code; + uint16_t pdu_index; +} nfapi_error_indication_msg_tx_err; + +// +// P4 Message Structures +// + +typedef struct { + nfapi_tl_t tl; + uint8_t frequency_band_indicator; + uint16_t measurement_period; + uint8_t bandwidth; + uint32_t timeout; + uint8_t number_of_earfcns; + uint16_t earfcn[NFAPI_MAX_CARRIER_LIST]; +} nfapi_lte_rssi_request_t; + +#define NFAPI_LTE_RSSI_REQUEST_TAG 0x3000 + +#define NFAPI_P4_START_TAG NFAPI_LTE_RSSI_REQUEST_TAG + +typedef struct { + nfapi_tl_t tl; + uint8_t frequency_band_indicator; + uint16_t measurement_period; + uint32_t timeout; + uint8_t number_of_uarfcns; + uint16_t uarfcn[NFAPI_MAX_CARRIER_LIST]; +} nfapi_utran_rssi_request_t; + +#define NFAPI_UTRAN_RSSI_REQUEST_TAG 0x3001 + +typedef struct { + uint16_t arfcn; + uint8_t direction; +} nfapi_arfcn_t; + +typedef struct { + nfapi_tl_t tl; + uint8_t frequency_band_indicator; + uint16_t measurement_period; + uint32_t timeout; + uint8_t number_of_arfcns; + nfapi_arfcn_t arfcn[NFAPI_MAX_CARRIER_LIST]; +} nfapi_geran_rssi_request_t; + +#define NFAPI_GERAN_RSSI_REQUEST_TAG 0x3002 + + + +typedef struct { + uint16_t earfcn; + uint8_t number_of_ro_dl; + uint8_t ro_dl[NFAPI_MAX_RO_DL]; +} nfapi_earfcn_t; + +typedef struct { + nfapi_tl_t tl; + uint8_t frequency_band_indicator; + uint16_t measurement_period; + uint32_t timeout; + uint8_t number_of_earfcns; + nfapi_earfcn_t earfcn[NFAPI_MAX_CARRIER_LIST]; +} nfapi_nb_iot_rssi_request_t; + +#define NFAPI_NB_IOT_RSSI_REQUEST_TAG 0x3020 + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_rssi; + int16_t rssi[NFAPI_MAX_RSSI]; +} nfapi_rssi_indication_body_t; + +#define NFAPI_RSSI_INDICATION_TAG 0x3003 + +typedef struct { + nfapi_tl_t tl; + uint16_t earfcn; + uint8_t measurement_bandwidth; + uint8_t exhaustive_search; + uint32_t timeout; + uint8_t number_of_pci; + uint16_t pci[NFAPI_MAX_PCI_LIST]; +} nfapi_lte_cell_search_request_t; + +#define NFAPI_LTE_CELL_SEARCH_REQUEST_TAG 0x3004 + +typedef struct { + nfapi_tl_t tl; + uint16_t uarfcn; + uint8_t exhaustive_search; + uint32_t timeout; + uint8_t number_of_psc; + uint16_t psc[NFAPI_MAX_PSC_LIST]; +} nfapi_utran_cell_search_request_t; + +#define NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG 0x3005 + +typedef struct { + nfapi_tl_t tl; + uint32_t timeout; + uint8_t number_of_arfcn; + uint16_t arfcn[NFAPI_MAX_ARFCN_LIST]; +} nfapi_geran_cell_search_request_t; + +#define NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG 0x3006 + +typedef struct { + nfapi_tl_t tl; + uint16_t earfcn; + uint8_t ro_dl; + uint8_t exhaustive_search; + uint32_t timeout; + uint8_t number_of_pci; + uint16_t pci[NFAPI_MAX_PCI_LIST]; +} nfapi_nb_iot_cell_search_request_t; + +#define NFAPI_NB_IOT_CELL_SEARCH_REQUEST_TAG 0x3021 + +typedef struct { + uint16_t pci; + uint8_t rsrp; + uint8_t rsrq; + int16_t frequency_offset; +} nfapi_lte_found_cell_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_lte_cells_found; + nfapi_lte_found_cell_t lte_found_cells[NFAPI_MAX_LTE_CELLS_FOUND]; +} nfapi_lte_cell_search_indication_t; + +#define NFAPI_LTE_CELL_SEARCH_INDICATION_TAG 0x3007 + +typedef struct { + uint16_t psc; + uint8_t rscp; + uint8_t ecno; + int16_t frequency_offset; +} nfapi_utran_found_cell_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_utran_cells_found; + nfapi_utran_found_cell_t utran_found_cells[NFAPI_MAX_UTRAN_CELLS_FOUND]; +} nfapi_utran_cell_search_indication_t; + +#define NFAPI_UTRAN_CELL_SEARCH_INDICATION_TAG 0x3008 + +typedef struct { + uint16_t arfcn; + uint8_t bsic; + uint8_t rxlev; + uint8_t rxqual; + int16_t frequency_offset; + uint32_t sfn_offset; +} nfapi_gsm_found_cell_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_gsm_cells_found; + nfapi_gsm_found_cell_t gsm_found_cells[NFAPI_MAX_GSM_CELLS_FOUND]; +} nfapi_geran_cell_search_indication_t; + +#define NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG 0x3009 + +typedef struct { + uint16_t pci; + uint8_t rsrp; + uint8_t rsrq; + int16_t frequency_offset; +} nfapi_nb_iot_found_cell_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t number_of_nb_iot_cells_found; + nfapi_nb_iot_found_cell_t nb_iot_found_cells[NFAPI_MAX_NB_IOT_CELLS_FOUND]; +} nfapi_nb_iot_cell_search_indication_t; + +#define NFAPI_NB_IOT_CELL_SEARCH_INDICATION_TAG 0x3022 + +typedef nfapi_opaqaue_data_t nfapi_pnf_cell_search_state_t; + +#define NFAPI_PNF_CELL_SEARCH_STATE_TAG 0x300A + +typedef struct { + nfapi_tl_t tl; + uint16_t earfcn; + uint16_t pci; + uint32_t timeout; +} nfapi_lte_broadcast_detect_request_t; + +#define NFAPI_LTE_BROADCAST_DETECT_REQUEST_TAG 0x300B + +typedef struct { + nfapi_tl_t tl; + uint16_t uarfcn; + uint16_t psc; + uint32_t timeout; +} nfapi_utran_broadcast_detect_request_t; + +#define NFAPI_UTRAN_BROADCAST_DETECT_REQUEST_TAG 0x300C + +typedef struct { + nfapi_tl_t tl; + uint16_t earfcn; + uint8_t ro_dl; + uint16_t pci; + uint32_t timeout; +} nfapi_nb_iot_broadcast_detect_request_t; + +#define NFAPI_NB_IOT_BROADCAST_DETECT_REQUEST_TAG 0x3023 + +typedef struct { + nfapi_tl_t tl; + uint8_t number_of_tx_antenna; + uint16_t mib_length; + uint8_t mib[NFAPI_MAX_MIB_LENGTH]; + uint32_t sfn_offset; +} nfapi_lte_broadcast_detect_indication_t; + +#define NFAPI_LTE_BROADCAST_DETECT_INDICATION_TAG 0x300E + +typedef struct { + nfapi_tl_t tl; + uint16_t mib_length; + uint8_t mib[NFAPI_MAX_MIB_LENGTH]; + uint32_t sfn_offset; +} nfapi_utran_broadcast_detect_indication_t; + +#define NFAPI_UTRAN_BROADCAST_DETECT_INDICATION_TAG 0x300F + + +typedef struct { + nfapi_tl_t tl; + uint8_t number_of_tx_antenna; + uint16_t mib_length; + uint8_t mib[NFAPI_MAX_MIB_LENGTH]; + uint32_t sfn_offset; +} nfapi_nb_iot_broadcast_detect_indication_t; + +#define NFAPI_NB_IOT_BROADCAST_DETECT_INDICATION_TAG 0x3024 + +#define NFAPI_PNF_CELL_BROADCAST_STATE_TAG 0x3010 + +typedef struct { + nfapi_tl_t tl; + uint16_t earfcn; + uint16_t pci; + uint16_t downlink_channel_bandwidth; + uint8_t phich_configuration; + uint8_t number_of_tx_antenna; + uint8_t retry_count; + uint32_t timeout; +} nfapi_lte_system_information_schedule_request_t; + +#define NFAPI_LTE_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG 0x3011 + + +typedef struct { + nfapi_tl_t tl; + uint16_t earfcn; + uint8_t ro_dl; + uint16_t pci; + uint8_t scheduling_info_sib1_nb; + uint32_t timeout; +} nfapi_nb_iot_system_information_schedule_request_t; + +#define NFAPI_NB_IOT_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG 0x3025 + +typedef nfapi_opaqaue_data_t nfapi_pnf_cell_broadcast_state_t; + +typedef struct { + uint8_t si_periodicity; + uint8_t si_index; +} nfapi_lte_system_information_si_periodicity_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t earfcn; + uint16_t pci; + uint16_t downlink_channel_bandwidth; + uint8_t phich_configuration; + uint8_t number_of_tx_antenna; + uint8_t number_of_si_periodicity; + nfapi_lte_system_information_si_periodicity_t si_periodicity[NFAPI_MAX_SI_PERIODICITY]; + uint8_t si_window_length; + uint32_t timeout; +} nfapi_lte_system_information_request_t; + +#define NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG 0x3014 + +typedef struct { + nfapi_tl_t tl; + uint16_t uarfcn; + uint16_t psc; + uint32_t timeout; +} nfapi_utran_system_information_request_t; + +#define NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG 0x3015 + +typedef struct { + nfapi_tl_t tl; + uint16_t arfcn; + uint8_t bsic; + uint32_t timeout; +} nfapi_geran_system_information_request_t; + +#define NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG 0x3016 + +typedef struct { + uint8_t si_periodicity; + uint8_t si_repetition_pattern; + uint8_t si_tb_size; + uint8_t number_of_si_index; + uint8_t si_index[NFAPI_MAX_SI_INDEX]; +} nfapi_nb_iot_system_information_si_periodicity_t; + +typedef struct { + nfapi_tl_t tl; + uint16_t earfcn; + uint8_t ro_dl; + uint16_t pci; + uint8_t number_of_si_periodicity; + nfapi_nb_iot_system_information_si_periodicity_t si_periodicity[NFAPI_MAX_SI_PERIODICITY]; + uint8_t si_window_length; + uint32_t timeout; +} nfapi_nb_iot_system_information_request_t; + +#define NFAPI_NB_IOT_SYSTEM_INFORMATION_REQUEST_TAG 0x3027 + +typedef struct { + nfapi_tl_t tl; + uint8_t sib_type; + uint16_t sib_length; + uint8_t sib[NFAPI_MAX_SIB_LENGTH]; +} nfapi_lte_system_information_indication_t; + +#define NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG 0x3018 + +typedef struct { + nfapi_tl_t tl; + uint16_t sib_length; + uint8_t sib[NFAPI_MAX_SIB_LENGTH]; +} nfapi_utran_system_information_indication_t; + +#define NFAPI_UTRAN_SYSTEM_INFORMATION_INDICATION_TAG 0x3019 + +typedef struct { + nfapi_tl_t tl; + uint16_t si_length; + uint8_t si[NFAPI_MAX_SI_LENGTH]; +} nfapi_geran_system_information_indication_t; + +#define NFAPI_GERAN_SYSTEM_INFORMATION_INDICATION_TAG 0x301a + +typedef struct { + nfapi_tl_t tl; + uint8_t sib_type; + uint16_t sib_length; + uint8_t sib[NFAPI_MAX_SIB_LENGTH]; +} nfapi_nb_iot_system_information_indication_t; + +#define NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG 0x3026 + + +// +// Top level NFAP messages +// + +// +// P7 +// + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_dl_config_request_body_t dl_config_request_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_dl_config_request_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_ul_config_request_body_t ul_config_request_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_ul_config_request_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_hi_dci0_request_body_t hi_dci0_request_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_hi_dci0_request_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_tx_request_body_t tx_request_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_tx_request_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; +} nfapi_subframe_indication_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_harq_indication_body_t harq_indication_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_harq_indication_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_crc_indication_body_t crc_indication_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_crc_indication_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_sr_indication_body_t sr_indication_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_sr_indication_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_cqi_indication_body_t cqi_indication_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_cqi_indication_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_rach_indication_body_t rach_indication_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_rach_indication_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_srs_indication_body_t srs_indication_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_srs_indication_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_rx_indication_body_t rx_indication_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_rx_indication_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_nb_harq_indication_body_t nb_harq_indication_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_nb_harq_indication_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_nrach_indication_body_t nrach_indication_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_nrach_indication_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_lbt_dl_config_request_body_t lbt_dl_config_request_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_lbt_dl_config_request_t; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t sfn_sf; + nfapi_lbt_dl_indication_body_t lbt_dl_indication_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_lbt_dl_indication_t; + + +typedef struct { + nfapi_p7_message_header_t header; + uint8_t message_id; + uint8_t error_code; + union { + nfapi_error_indication_msg_invalid_state msg_invalid_state; + nfapi_error_indication_msg_bch_missing msg_bch_missing; + nfapi_error_indication_sfn_out_of_sync sfn_out_of_sync; + nfapi_error_indication_msg_pdu_err msg_pdu_err; + nfapi_error_indication_msg_invalid_sfn msg_invalid_sfn; + nfapi_error_indication_msg_hi_err msg_hi_err; + nfapi_error_indication_msg_tx_err msg_tx_err; + }; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_error_indication_t; + +// +// P4 Messages +// + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint8_t rat_type; + union { + nfapi_lte_rssi_request_t lte_rssi_request; + nfapi_utran_rssi_request_t utran_rssi_request; + nfapi_geran_rssi_request_t geran_rssi_request; + nfapi_nb_iot_rssi_request_t nb_iot_rssi_request; + }; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_rssi_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_rssi_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_rssi_indication_body_t rssi_indication_body; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_rssi_indication_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint8_t rat_type; + union { + nfapi_lte_cell_search_request_t lte_cell_search_request; + nfapi_utran_cell_search_request_t utran_cell_search_request; + nfapi_geran_cell_search_request_t geran_cell_search_request; + nfapi_nb_iot_cell_search_request_t nb_iot_cell_search_request; + }; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_cell_search_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_cell_search_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_lte_cell_search_indication_t lte_cell_search_indication; + nfapi_utran_cell_search_indication_t utran_cell_search_indication; + nfapi_geran_cell_search_indication_t geran_cell_search_indication; + nfapi_pnf_cell_search_state_t pnf_cell_search_state; + nfapi_nb_iot_cell_search_indication_t nb_iot_cell_search_indication; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_cell_search_indication_t; + + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint8_t rat_type; + union { + nfapi_lte_broadcast_detect_request_t lte_broadcast_detect_request; + nfapi_utran_broadcast_detect_request_t utran_broadcast_detect_request; + nfapi_nb_iot_broadcast_detect_request_t nb_iot_broadcast_detect_request; + }; + nfapi_pnf_cell_search_state_t pnf_cell_search_state; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_broadcast_detect_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_broadcast_detect_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_lte_broadcast_detect_indication_t lte_broadcast_detect_indication; + nfapi_utran_broadcast_detect_indication_t utran_broadcast_detect_indication; + nfapi_nb_iot_broadcast_detect_indication_t nb_iot_broadcast_detect_indication; + nfapi_pnf_cell_broadcast_state_t pnf_cell_broadcast_state; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_broadcast_detect_indication_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint8_t rat_type; + union { + nfapi_lte_system_information_schedule_request_t lte_system_information_schedule_request; + nfapi_nb_iot_system_information_schedule_request_t nb_iot_system_information_schedule_request; + }; + nfapi_pnf_cell_broadcast_state_t pnf_cell_broadcast_state; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_system_information_schedule_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_system_information_schedule_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_lte_system_information_indication_t lte_system_information_indication; + nfapi_nb_iot_system_information_indication_t nb_iot_system_information_indication; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_system_information_schedule_indication_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint8_t rat_type; + union { + nfapi_lte_system_information_request_t lte_system_information_request; + nfapi_utran_system_information_request_t utran_system_information_request; + nfapi_geran_system_information_request_t geran_system_information_request; + nfapi_nb_iot_system_information_request_t nb_iot_system_information_request; + }; + nfapi_pnf_cell_broadcast_state_t pnf_cell_broadcast_state; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_system_information_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_system_information_response_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_lte_system_information_indication_t lte_system_information_indication; + nfapi_utran_system_information_indication_t utran_system_information_indication; + nfapi_geran_system_information_indication_t geran_system_information_indication; + nfapi_nb_iot_system_information_indication_t nb_iot_system_information_indication; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_system_information_indication_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_nmm_stop_request_t; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint32_t error_code; + nfapi_vendor_extension_tlv_t vendor_extension; +} nfapi_nmm_stop_response_t; + +// +// Configuration options for the encode decode functions +// + +/*! Configuration options for the p7 pack unpack functions + * + */ +typedef struct nfapi_p7_codec_config { + + /*! Optional call back to allow the user to define the memory allocator. + * \param size The size of the memory to allocate + * \return a pointer to a valid memory block or 0 if it has failed. + * + * If not set the nfapi unpack functions will use malloc + */ + void* (*allocate)(size_t size); + + /*! Optional call back to allow the user to define the memory deallocator. + * \param ptr A poiner to a memory block allocated by the allocate callback + * + * If not set the client should use free + */ + void (*deallocate)(void* ptr); + + /*! Optional call back function to handle unpacking vendor extension tlv. + * \param tl A pointer to a decoded tag length structure + * \param ppReadPackedMsg A handle to the read buffer. + * \param end The end of the read buffer + * \param ve A handle to a vendor extention structure that the call back should allocate if the structure can be decoded + * \param config A pointer to the p7 codec configuration + * \return return 0 if packed successfully, -1 if failed. + * + * If not set the tlv will be skipped + * + * Client should use the help methods in nfapi.h to decode the vendor extention. + * + * \todo Add code example + */ + int (*unpack_vendor_extension_tlv)(nfapi_tl_t* tl, uint8_t **ppReadPackedMsg, uint8_t *end, void** ve, struct nfapi_p7_codec_config* config); + + /*! Optional call back function to handle packing vendor extension tlv. + * \param ve A pointer to a vendor extention structure. + * \param ppWritePackedMsg A handle to the write buffer + * \param end The end of the write buffer. The callee should make sure not to write beyond the end + * \param config A pointer to the p7 codec configuration + * \return return 0 if packed successfully, -1 if failed. + * + * If not set the the tlv will be skipped + * + * Client should use the help methods in nfapi.h to encode the vendor extention + * + * \todo Add code example + */ + int (*pack_vendor_extension_tlv)(void* ve, uint8_t **ppWritePackedMsg, uint8_t *end, struct nfapi_p7_codec_config* config); + + /*! Optional call back function to handle unpacking vendor extension messages. + * \param header A pointer to a decode P7 message header for the vendor extention message + * \param ppReadPackedMsg A handle to the encoded data buffer + * \param end A pointer to the end of the encoded data buffer + * \param config A pointer to the p7 codec configuration + * \return 0 if unpacked successfully, -1 if failed + * + * If not set the message will be ignored + * + * If the message if is unknown the function should return -1 + */ + int (*unpack_p7_vendor_extension)(nfapi_p7_message_header_t* header, uint8_t **ppReadPackedMsg, uint8_t *end, struct nfapi_p7_codec_config* config); + + /*! Optional call back function to handle packing vendor extension messages. + * \param header A poiner to a P7 message structure for the venfor extention message + * \param ppWritePackedmsg A handle to the buffer to write the encoded message into + * \param end A pointer to the end of the buffer + * \param cofig A pointer to the p7 codec configuration + * \return 0 if packed successfully, -1 if failed + * + * If not set the the message will be ingored + * + * If the message if is unknown the function should return -1 + */ + int (*pack_p7_vendor_extension)(nfapi_p7_message_header_t* header, uint8_t **ppWritePackedmsg, uint8_t *end, struct nfapi_p7_codec_config* config); + + /*! Optional user data that will be passed back with callbacks + */ + void* user_data; + +} nfapi_p7_codec_config_t; + +/*! Configuration options for the p4 & p5 pack unpack functions + * + */ +typedef struct nfapi_p4_p5_codec_config { + + /*! Optional call back to allow the user to define the memory allocator. + * \param size The size of the memory to allocate + * \return a pointer to a valid memory block or 0 if it has failed. + * + * If not set the nfapi unpack functions will use malloc + */ + void* (*allocate)(size_t size); + + /*! Optional call back to allow the user to define the memory deallocator. + * \param ptr A poiner to a memory block allocated by the allocate callback + * + * If not set free will be used + */ + void (*deallocate)(void* ptr); + + /*! Optional call back function to handle unpacking vendor extension tlv. + * \param tl A pointer to a decoded tag length structure + * \param ppReadPackedMsg A handle to the data buffer to decode + * \param end A pointer to the end of the buffer + * \param ve A handle to a vendor extention structure that will be allocated by this callback + * \param config A pointer to the P4/P5 codec configuration + * \return 0 if unpacked successfully, -1 if failed + * + * If not set the tlv will be skipped + */ + int (*unpack_vendor_extension_tlv)(nfapi_tl_t* tl, uint8_t **ppReadPackedMsg, uint8_t *end, void** ve, struct nfapi_p4_p5_codec_config* config); + + /*! Optional call back function to handle packing vendor extension tlv. + * \param ve + * \param ppWritePackedMsg A handle to the data buffer pack the tlv into + * \param end A pointer to the end of the buffer + * \param config A pointer to the P4/P5 codec configuration + * \return 0 if packed successfully, -1 if failed + * + * If not set the the tlv will be skipped + */ + int (*pack_vendor_extension_tlv)(void* ve, uint8_t **ppWritePackedMsg, uint8_t *end, struct nfapi_p4_p5_codec_config* config); + + /*! Optional call back function to handle unpacking vendor extension messages. + * \param header A pointer to a decode P4/P5 message header + * \param ppReadPackgedMsg A handle to the data buffer to decode + * \param end A pointer to the end of the buffer + * \param config A pointer to the P4/P5 codec configuration + * \return 0 if packed successfully, -1 if failed + * + * If not set the message will be ignored + */ + int (*unpack_p4_p5_vendor_extension)(nfapi_p4_p5_message_header_t* header, uint8_t **ppReadPackedMsg, uint8_t *end, struct nfapi_p4_p5_codec_config* config); + + /*! Optional call back function to handle packing vendor extension messages. + * \param header A pointer to the P4/P5 message header to be encoded + * \param ppWritePackedMsg A handle to the data buffer pack the message into + * \param end A pointer to the end of the buffer + * \param config A pointer to the P4/P5 codec configuration + * \return 0 if packed successfully, -1 if failed + * + * If not set the the message will be ingored + */ + int (*pack_p4_p5_vendor_extension)(nfapi_p4_p5_message_header_t* header, uint8_t **ppwritepackedmsg, uint8_t *end, struct nfapi_p4_p5_codec_config* config); + + /*! Optional user data that will be passed back with callbacks + */ + void* user_data; + +} nfapi_p4_p5_codec_config_t; + +// +// Functions +// + +/*! \brief Encodes an NFAPI P4 message to a buffer + * \param pMessageBuf A pointer to a nfapi p4 message structure + * \param messageBufLen The size of the p4 message structure + * \param pPackedBuf A pointer to the buffer that the p4 message will be packed into + * \param packedBufLen The size of the buffer + * \param config A pointer to the nfapi configuration structure + * \return 0 means success, -1 means failure. + * + * The function will encode a nFAPI P4 message structure pointed to be pMessageBuf into a byte stream pointed to by pPackedBuf. + * + */ +int nfapi_p4_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config); + +/*! \brief Decodes a NFAPI P4 message header + * \param pMessageBuf A pointer to an encoded P4 message header + * \param messageBufLen The size of the encoded P4 message header + * \param pUnpackedBuf A pointer to the nfapi_message_header + * \param unpackedBufLen The size of nfapi_message_header structure. + * \param config A pointer to the nfapi configuration structure + * \return 0 means success, -1 means failure. + * + * The function will decode a byte stream pointed to by pMessageBuf into a nfapi_p4_p5_message_header structure pointer to by pUnpackedBuf + */ +int nfapi_p4_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config); + +/*! \brief Decodes a NFAPI P4 message + * \param pMessageBuf A pointer to an encoded P4 message + * \param messageBufLen The size of the encoded P4 message + * \param pUnpackedBuf A pointer to the nfapi_message_header + * \param unpackedBufLen The size of nfapi_message_header structure. + * \param config A pointer to the nfapi configuration structure + * \return 0 means success, -1 means failure. + * + * The function will decode a byte stream pointed to by pMessageBuf into a nfapi p4 message structure pointer to by pUnpackedBuf + */ +int nfapi_p4_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config); + +/*! \brief Encodes an NFAPI P5 message to a buffer + * \param pMessageBuf A pointer to a nfapi p5 message structure + * \param messageBufLen The size of the p5 message structure + * \param pPackedBuf A pointer to the buffer that the p5 message will be packed into + * \param packedBufLen The size of the buffer + * \param config A pointer to the nfapi configuration structure + * \return 0 means success, -1 means failure. + * + * The function will encode a nFAPI P5 message structure pointed to be pMessageBuf into a byte stream pointed to by pPackedBuf. + * + */ +int nfapi_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config); + +/*! \brief Decodes an NFAPI P5 message header + * \param pMessageBuf A pointer to an encoded P5 message header + * \param messageBufLen The size of the encoded P5 message header + * \param pUnpackedBuf A pointer to the nfapi_message_header + * \param unpackedBufLen The size of nfapi_message_header structure. + * \param config A pointer to the nfapi configuration structure + * \return 0 means success, -1 means failure. + * + * The function will decode a byte stream pointed to by pMessageBuf into a nfapi_p4_p5_message_header structure pointer to by pUnpackedBuf + */ +int nfapi_p5_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config); + +/*! \brief Decodes a NFAPI P5 message + * \param pMessageBuf A pointer to an encoded P5 message + * \param messageBufLen The size of the encoded P5 message + * \param pUnpackedBuf A pointer to the nfapi_message_header + * \param unpackedBufLen The size of nfapi_message_header structure. + * \param config A pointer to the nfapi configuration structure + * \return 0 means success, -1 means failure. + * + * The function will decode a byte stream pointed to by pMessageBuf into a nfapi p5 message structure pointer to by pUnpackedBuf + */ +int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config); + +/*! \brief Encodes an NFAPI P7 message to a buffer + * \param pMessageBuf A pointer to a nfapi p7 message structure + * \param pPackedBuf A pointer to the buffer that the p7 message will be packed into + * \param packedBufLen The size of the buffer + * \param config A pointer to the nfapi configuration structure + * \return 0 means success, -1 means failure. + * + * The function will encode a nFAPI P7 message structure pointed to be pMessageBuf into a byte stream pointed to by pPackedBuf. + * + */ +int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config); + +/*! \brief Decodes an NFAPI P7 message header + * \param pMessageBuf A pointer to an encoded P7 message header + * \param messageBufLen The size of the encoded P7 message header + * \param pUnpackedBuf A pointer to the nfapi_message_header + * \param unpackedBufLen The size of nfapi_message_header structure. + * \param config A pointer to the nfapi configuration structure + * \return 0 means success, -1 means failure. + * + * The function will decode a byte stream pointed to by pMessageBuf into a nfapi_p7_message_header structure pointer to by pUnpackedBuf + + */ +int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config); + +/*! \brief Decodes a NFAPI P7 message + * \param pMessageBuf A pointer to an encoded P7 message + * \param messageBufLen The size of the encoded P7 message + * \param pUnpackedBuf A pointer to the nfapi_message_header + * \param unpackedBufLen The size of nfapi_message_header structure. + * \param config A pointer to the nfapi configuration structure + * \return 0 means success, -1 means failure. + * + * The function will decode a byte stream pointed to by pMessageBuf into a nfapi p7 message structure pointer to by pUnpackedBuf + */ +int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config); + +/*! \brief Calculates the checksum of a message + * + * \param buffer Pointer to the packed message + * \param len The length of the message + * \return The checksum. If there is an error the function with return -1 + */ +uint32_t nfapi_p7_calculate_checksum(uint8_t* buffer, uint32_t len); + +/*! \brief Calculates & updates the checksum in the message + * + * \param buffer Pointer to the packed message + * \param len The length of the message + * \return 0 means success, -1 means failure. + */ +int nfapi_p7_update_checksum(uint8_t* buffer, uint32_t len); + +/*! \brief Updates the transmition time stamp in the p7 message header + * + * \param buffer Pointer to the packed message + * \param timestamp The time stamp value + * \return 0 means success, -1 means failure. + */ +int nfapi_p7_update_transmit_timestamp(uint8_t* buffer, uint32_t timestamp); + +#endif /* _NFAPI_INTERFACE_H_ */ diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi.c b/nfapi/open-nFAPI/nfapi/src/nfapi.c new file mode 100644 index 0000000000..3f017bc9a4 --- /dev/null +++ b/nfapi/open-nFAPI/nfapi/src/nfapi.c @@ -0,0 +1,860 @@ +/* + * Copyright (c) 2001-2016, Cisco Systems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * Neither the name of the Cisco Systems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +// Fundamental routines + +uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end) +{ + uint8_t *pOut = *out; + + if((end - pOut) >= 1) + { + pOut[0] = in; + + (*out)+=1; + + return 1; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } + +} + +uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end) +{ + uint8_t *pOut = *out; + + if((end - pOut) >= 1) + { + pOut[0] = in; + + (*out)+=1; + + return 1; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end) +{ + uint8_t *pOut = *out; + + if((end - pOut) >= 2) + { + pOut[0] = (in & 0xFF00) >> 8; + pOut[1] = (in & 0xFF); + + (*out)+=2; + + return 2; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint8_t pushs16(int16_t in, uint8_t **out, uint8_t *end) +{ + uint8_t *pOut = *out; + + if((end - pOut) >= 2) + { + pOut[0] = (in & 0xFF00) >> 8; + pOut[1] = (in & 0xFF); + + (*out)+=2; + + return 2; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint8_t push32(uint32_t in, uint8_t **out, uint8_t *end) +{ + uint8_t *pOut = *out; + if((end - pOut) >= 4) + { + pOut[0] = (in & 0xFF000000) >> 24; + pOut[1] = (in & 0xFF0000) >> 16; + pOut[2] = (in & 0xFF00) >> 8; + pOut[3] = (in & 0xFF); + + (*out)+=4; + + return 4; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint8_t pushs32(int32_t in, uint8_t **out, uint8_t *end) +{ + uint8_t *pOut = *out; + + if((end - pOut) >= 4) + { + pOut[0] = (in & 0xFF000000) >> 24; + pOut[1] = (in & 0xFF0000) >> 16; + pOut[2] = (in & 0xFF00) >> 8; + pOut[3] = (in & 0xFF); + + (*out)+=4; + + return 4; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint8_t pull8(uint8_t **in, uint8_t *out, uint8_t *end) +{ + uint8_t *pIn = *in; + + if((end - pIn) >= 1 ) + { + *out = *pIn; + + (*in)+=1; + + return 1; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint8_t pulls8(uint8_t **in, int8_t *out, uint8_t *end) +{ + uint8_t *pIn = *in; + + if((end - pIn) >= 1 ) + { + *out = *pIn; + + (*in)+=1; + + return 1; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint8_t pull16(uint8_t **in, uint16_t *out, uint8_t *end) +{ + uint8_t *pIn = *in; + + if((end - pIn) >=2 ) + { + *out = ((pIn[0]) << 8) | pIn[1]; + (*in)+=2; + + return 2; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint8_t pulls16(uint8_t **in, int16_t *out, uint8_t *end) +{ + uint8_t *pIn = *in; + + if((end - pIn) >=2 ) + { + *out = ((pIn[0]) << 8) | pIn[1]; + + (*in)+=2; + + return 2; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint8_t pull32(uint8_t **in, uint32_t *out, uint8_t *end) +{ + uint8_t *pIn = *in; + + if((end - pIn) >=4 ) + { + *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3]; + + (*in)+=4; + + return 4; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end) +{ + uint8_t *pIn = *in; + + if((end - pIn) >=4 ) + { + *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3]; + + (*in)+=4; + + return 4; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +/* +inline void pusharray16(uint8_t **, uint16_t, uint32_t len) +{ +} +*/ + +uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) +{ + if(len == 0) + return 1; + + if(len > max_len) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + return 0; + } + + if((end - (*in)) >= sizeof(uint16_t) * len) + { + uint32_t idx; + for(idx = 0; idx < len; ++idx) + { + if(!pull16(in, &out[idx], end)) + return 0; + } + + return sizeof(uint16_t) * len; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) +{ + if(len == 0) + return 1; + + if(len > max_len) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + return 0; + } + + if((end - (*in)) >= sizeof(uint16_t) * len) + { + uint32_t idx; + for(idx = 0; idx < len; ++idx) + { + if(!pulls16(in, &out[idx], end)) + return 0; + } + + return sizeof(uint16_t) * len; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} +uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) +{ + if(len == 0) + return 1; + + if(len > max_len) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + return 0; + } + + if((end - (*out)) >= sizeof(uint16_t) * len) + { + uint32_t idx; + for(idx = 0; idx < len; ++idx) + { + if(!push16(in[idx], out, end)) + return 0; + } + return sizeof(uint16_t) * len; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} +uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) +{ + if(len == 0) + return 1; + + if(len > max_len) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + return 0; + } + + if((end - (*out)) >= sizeof(uint16_t) * len) + { + uint32_t idx; + for(idx = 0; idx < len; ++idx) + { + pushs16(in[idx], out, end); + } + return sizeof(uint16_t) * len; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end) +{ + if(len == 0) + return 1; + + if(len > max_len) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + return 0; + } + + if((end - out) >= sizeof(uint8_t) * len) + { + memcpy(out, (*in), len); + (*in)+=len; + + return sizeof(uint8_t) * len; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) +{ + if(len == 0) + return 1; + + if(len > max_len) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); + return 0; + } + + if((end - (*out)) >= sizeof(uint8_t) * len) + { + memcpy((*out), in, len); + (*out)+=len; + + return sizeof(uint8_t) * len; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); + return 0; + } +} + +uint8_t packarray(void* array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t **ppwritepackedmsg, uint8_t *end, pack_array_elem_fn fn) +{ + if(count > max_count) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count); + return 0; + } + + uint16_t i = 0; + for(i = 0; i < count; ++i) + { + if((fn)(array, ppwritepackedmsg, end) == 0) + return 0; + + array += array_element_size; + } + + return 1; +} + +uint8_t unpackarray(uint8_t **ppReadPackedMsg, void* array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t *end, unpack_array_elem_fn fn) +{ + if(count > max_count) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count); + return 0; + } + + uint16_t i = 0; + for(i = 0; i < count; ++i) + { + if((fn)(array, ppReadPackedMsg, end) == 0) + return 0; + + array += array_element_size; + } + + return 1; +} + + +uint32_t pack_vendor_extension_tlv(nfapi_tl_t* ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + if(ve != 0 && config != 0) + { + if(config->pack_vendor_extension_tlv) + { + + uint8_t* pStartOfTlv = *ppWritePackedMsg; + if(pack_tl(ve, ppWritePackedMsg, end) == 0) + return 0; + + uint8_t* pStartOfValue = *ppWritePackedMsg; + if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0) + return 0; + + ve->length = (*ppWritePackedMsg) - pStartOfValue; + + pack_tl(ve, &pStartOfTlv, end); + + return 1; + + } + } + return 1; +} + +uint32_t unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config, nfapi_tl_t** ve_tlv) +{ + if(ve_tlv != 0 && config != 0) + { + if(config->unpack_vendor_extension_tlv) + { + return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void**)ve_tlv, config); + } + } + return 1; +} + +uint32_t pack_p7_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end ,nfapi_p7_codec_config_t* config) +{ + if(ve != 0 && config != 0) + { + if(config->pack_vendor_extension_tlv) + { + uint8_t* pStartOfTlv = *ppWritePackedMsg; + if(pack_tl(ve, ppWritePackedMsg, end) == 0) + return 0; + + uint8_t* pStartOfValue = *ppWritePackedMsg; + if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0) + return 0; + + ve->length = (*ppWritePackedMsg) - pStartOfValue; + + pack_tl(ve, &pStartOfTlv, end); + + return 1; + + } + } + return 1; +} + +int unpack_p7_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config, nfapi_tl_t** ve_tlv) +{ + if(ve_tlv != 0 && config != 0) + { + if(config->unpack_vendor_extension_tlv) + { + return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void**)ve_tlv, config); + } + } + return 1; +} + + +uint8_t pack_tl(nfapi_tl_t *tl, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return (push16(tl->tag, ppWritePackedMsg, end) && + push16(tl->length, ppWritePackedMsg, end)); +} + +uint8_t unpack_tl(uint8_t **ppReadPackedMsg, nfapi_tl_t *tl, uint8_t *end) +{ + return (pull16(ppReadPackedMsg, &tl->tag, end) && + pull16(ppReadPackedMsg, &tl->length, end)); +} + +int unpack_tlv_list(unpack_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config, nfapi_tl_t** ve) +{ + nfapi_tl_t generic_tl; + uint8_t numBadTags = 0; + uint16_t idx = 0; + + while ((uint8_t*)(*ppReadPackedMsg) < end) + { + // unpack the tl and process the values accordingly + if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0) + return 0; + + uint8_t tagMatch = 0; + + uint8_t* pStartOfValue = *ppReadPackedMsg; + + for(idx = 0; idx < size; ++idx) + { + if(unpack_fns[idx].tag == generic_tl.tag) + { + tagMatch = 1; + nfapi_tl_t* tl = (nfapi_tl_t*)(unpack_fns[idx].tlv); + tl->tag = generic_tl.tag; + tl->length = generic_tl.length; + + int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end); + + if(result == 0) + { + return 0; + } + + // check if the length was right; + if(tl->length != (*ppReadPackedMsg - pStartOfValue)) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %d\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue)); + } + } + } + + if(tagMatch == 0) + { + + if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE && + generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) + { + int result = unpack_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve); + if(result == 0) + { + // got tot the end. + return 0; + } + else if(result < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown VE TAG value: 0x%04x\n", generic_tl.tag); + + if (++numBadTags > MAX_BAD_TAG) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); + return 0; + } + + if((end - *ppReadPackedMsg) >= generic_tl.length) + { + // Advance past the unknown TLV + (*ppReadPackedMsg) += generic_tl.length; + } + else + { + // go to the end + return 0; + } + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag); + + if (++numBadTags > MAX_BAD_TAG) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); + return 0; + } + + if((end - *ppReadPackedMsg) >= generic_tl.length) + { + // Advance past the unknown TLV + (*ppReadPackedMsg) += generic_tl.length; + } + else + { + // go to the end + return 0; + } + } + + } + } + + return 1; +} +int unpack_p7_tlv_list(unpack_p7_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t* end, nfapi_p7_codec_config_t* config, nfapi_tl_t** ve) +{ + nfapi_tl_t generic_tl; + uint8_t numBadTags = 0; + uint16_t idx = 0; + + while ((uint8_t*)(*ppReadPackedMsg) < end) + { + // unpack the tl and process the values accordingly + if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0) + return 0; + + uint8_t tagMatch = 0; + + uint8_t* pStartOfValue = *ppReadPackedMsg; + + for(idx = 0; idx < size; ++idx) + { + if(unpack_fns[idx].tag == generic_tl.tag) + { + tagMatch = 1; + nfapi_tl_t* tl = (nfapi_tl_t*)(unpack_fns[idx].tlv); + tl->tag = generic_tl.tag; + tl->length = generic_tl.length; + + int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end , config); + + if(result == 0) + { + return 0; + } + + // check if the length was right; + if(tl->length != (*ppReadPackedMsg - pStartOfValue)) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %d\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue)); + } + } + } + + if(tagMatch == 0) + { + + if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE && + generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) + { + int result = unpack_p7_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve); + if(result == 0) + { + // got to end + return 0; + } + else if(result < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag); + + if (++numBadTags > MAX_BAD_TAG) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); + return -1; + } + + if((end - *ppReadPackedMsg) >= generic_tl.length) + { + // Advance past the unknown TLV + (*ppReadPackedMsg) += generic_tl.length; + } + else + { + // got ot the dn + return 0; + } + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag); + + if (++numBadTags > MAX_BAD_TAG) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); + return -1; + } + + if((end - *ppReadPackedMsg) >= generic_tl.length) + { + // Advance past the unknown TLV + (*ppReadPackedMsg) += generic_tl.length; + } + else + { + // got ot the dn + return 0; + } + + } + + } + } + + return 1; +} + +// This intermediate function deals with calculating the length of the value +// and writing into the tlv header. +uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end, pack_tlv_fn fn) +{ + nfapi_tl_t* tl = (nfapi_tl_t*)tlv; + + // If the tag is defined + if(tl->tag == tag) + { + uint8_t* pStartOfTlv = *ppWritePackedMsg; + + // write a dumy tlv header + if(pack_tl(tl, ppWritePackedMsg, end) == 0) + return 0; + + // Record the start of the value + uint8_t* pStartOfValue = *ppWritePackedMsg; + + // pack the tlv value + if(fn(tlv, ppWritePackedMsg, end) == 0) + return 0; + + // calculate the length of the value and rewrite the tl header + tl->length = (*ppWritePackedMsg) - pStartOfValue; + + // rewrite the header with the correct length + pack_tl(tl, &pStartOfTlv, end); + } + else + { + if(tl->tag != 0) + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag); + } + else + { + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag); + } + } + + return 1; +} + +const char* nfapi_error_code_to_str(nfapi_error_code_e value) +{ + switch(value) + { + case NFAPI_MSG_OK: + return "NFAPI_MSG_OK"; + case NFAPI_MSG_INVALID_STATE: + return "NFAPI_MSG_INVALID_STATE"; + case NFAPI_MSG_INVALID_CONFIG: + return "NFAPI_MSG_INVALID_CONFIG"; + case NFAPI_SFN_OUT_OF_SYNC: + return "NFAPI_SFN_OUT_OF_SYNC"; + case NFAPI_MSG_SUBFRAME_ERR: + return "NFAPI_MSG_SUBFRAME_ERR"; + case NFAPI_MSG_BCH_MISSING: + return "NFAPI_MSG_BCH_MISSING"; + case NFAPI_MSG_INVALID_SFN: + return "NFAPI_MSG_INVALID_SFN"; + case NFAPI_MSG_HI_ERR: + return "NFAPI_MSG_HI_ERR"; + case NFAPI_MSG_TX_ERR: + return "NFAPI_MSG_TX_ERR"; + default: + return "UNKNOWN"; + } +} diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p4.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p4.c new file mode 100644 index 0000000000..b429e0a6ce --- /dev/null +++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p4.c @@ -0,0 +1,2085 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include // need for uintptr_t? + +#include +#include +#include +#include +#include + +#include +#include +#include + +static uint32_t get_packed_msg_len(uintptr_t msgHead, uintptr_t msgEnd) +{ + if (msgEnd < msgHead) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "get_packed_msg_len: Error in pointers supplied %d, %d\n", msgHead, msgEnd); + return 0; + } + + return (msgEnd - msgHead); +} + +static uint8_t pack_opaque_data_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_opaqaue_data_t* value = (nfapi_opaqaue_data_t*)tlv; + return pusharray8(value->value, NFAPI_MAX_OPAQUE_DATA, value->length, ppWritePackedMsg, end); +} + +static uint8_t unpack_opaque_data_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_opaqaue_data_t* value = (nfapi_opaqaue_data_t*)tlv; + value->length = value->tl.length; + if(value->length <= NFAPI_MAX_OPAQUE_DATA) + { + if(!pullarray8(ppReadPackedMsg, value->value, NFAPI_MAX_OPAQUE_DATA, value->length, end)) + return 0; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Opaque date to long %d \n", value->length); + return 0; + } + + return 1; + +} + +static uint8_t pack_lte_rssi_request_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lte_rssi_request_t* value = (nfapi_lte_rssi_request_t*)tlv; + + return (push8(value->frequency_band_indicator, ppWritePackedMsg, end) && + push16(value->measurement_period, ppWritePackedMsg, end) && + push8(value->bandwidth, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end) && + push8(value->number_of_earfcns, ppWritePackedMsg, end) && + pusharray16(value->earfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_earfcns, ppWritePackedMsg, end)); +} + +static uint8_t pack_utran_rssi_request_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_utran_rssi_request_t* value = (nfapi_utran_rssi_request_t*)tlv; + + return (push8(value->frequency_band_indicator, ppWritePackedMsg, end) && + push16(value->measurement_period, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end) && + push8(value->number_of_uarfcns, ppWritePackedMsg, end) && + pusharray16(value->uarfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_uarfcns, ppWritePackedMsg, end)); +} + +static uint8_t pack_geran_rssi_request_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_geran_rssi_request_t* value = (nfapi_geran_rssi_request_t*)tlv; + uint16_t idx = 0; + + if(!(push8(value->frequency_band_indicator, ppWritePackedMsg, end) && + push16(value->measurement_period, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end) && + push8(value->number_of_arfcns, ppWritePackedMsg, end))) + return 0; + + for(;idx < value->number_of_arfcns; ++idx) + { + if(!(push16(value->arfcn[idx].arfcn, ppWritePackedMsg, end) && + push8(value->arfcn[idx].direction, ppWritePackedMsg, end))) + return 0; + } + + return 1; +} + +static uint8_t pack_nb_iot_rssi_request_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nb_iot_rssi_request_t* value = (nfapi_nb_iot_rssi_request_t*)tlv; + uint16_t idx = 0; + + if(!(push8(value->frequency_band_indicator, ppWritePackedMsg, end) && + push16(value->measurement_period, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end) && + push8(value->number_of_earfcns, ppWritePackedMsg, end))) + return 0; + + for(;idx < value->number_of_earfcns; ++idx) + { + if(!(push16(value->earfcn[idx].earfcn, ppWritePackedMsg, end) && + push8(value->earfcn[idx].number_of_ro_dl, ppWritePackedMsg, end))) + return 0; + + uint8_t ro_dl_idx = 0; + for(ro_dl_idx = 0; ro_dl_idx < value->earfcn[idx].number_of_ro_dl; ++ro_dl_idx) + { + if(!push8(value->earfcn[idx].ro_dl[ro_dl_idx], ppWritePackedMsg, end)) + return 0; + } + } + + return 1; +} + + + +static uint8_t pack_rssi_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_rssi_request_t *pNfapiMsg = (nfapi_rssi_request_t*)msg; + + if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0) + return 0; + + switch(pNfapiMsg->rat_type) + { + case NFAPI_RAT_TYPE_LTE: + if(pack_tlv(NFAPI_LTE_RSSI_REQUEST_TAG, &pNfapiMsg->lte_rssi_request, ppWritePackedMsg, end, &pack_lte_rssi_request_value) == 0) + return 0; + break; + case NFAPI_RAT_TYPE_UTRAN: + if(pack_tlv(NFAPI_UTRAN_RSSI_REQUEST_TAG, &pNfapiMsg->utran_rssi_request, ppWritePackedMsg, end, &pack_utran_rssi_request_value) == 0) + return 0; + break; + case NFAPI_RAT_TYPE_GERAN: + if(pack_tlv(NFAPI_GERAN_RSSI_REQUEST_TAG, &pNfapiMsg->geran_rssi_request, ppWritePackedMsg, end, &pack_geran_rssi_request_value) == 0) + return 0; + break; + case NFAPI_RAT_TYPE_NB_IOT: + if(pack_tlv(NFAPI_NB_IOT_RSSI_REQUEST_TAG, &pNfapiMsg->nb_iot_rssi_request, ppWritePackedMsg, end, &pack_nb_iot_rssi_request_value) == 0) + return 0; + break; + } + + return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config); +} + +static uint8_t pack_rssi_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_rssi_response_t *pNfapiMsg = (nfapi_rssi_response_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_rssi_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_rssi_indication_body_t* value = (nfapi_rssi_indication_body_t*)tlv; + + return (push16(value->number_of_rssi, ppWritePackedMsg, end) && + pusharrays16(value->rssi, NFAPI_MAX_RSSI, value->number_of_rssi, ppWritePackedMsg, end)); +} + +static uint8_t pack_rssi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_rssi_indication_t *pNfapiMsg = (nfapi_rssi_indication_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_tlv(NFAPI_RSSI_INDICATION_TAG, &pNfapiMsg->rssi_indication_body, ppWritePackedMsg, end, &pack_rssi_indication_body_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + + +static uint8_t pack_lte_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lte_cell_search_request_t* value = (nfapi_lte_cell_search_request_t*)msg; + + return (push16(value->earfcn, ppWritePackedMsg, end) && + push8(value->measurement_bandwidth, ppWritePackedMsg, end) && + push8(value->exhaustive_search, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end) && + push8(value->number_of_pci, ppWritePackedMsg, end) && + pusharray16(value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, ppWritePackedMsg, end)); +} + +static uint8_t pack_utran_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_utran_cell_search_request_t* value = (nfapi_utran_cell_search_request_t*)msg; + + return (push16(value->uarfcn, ppWritePackedMsg, end) && + push8(value->exhaustive_search, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end) && + push8(value->number_of_psc, ppWritePackedMsg, end) && + pusharray16(value->psc, NFAPI_MAX_PSC_LIST, value->number_of_psc, ppWritePackedMsg, end)); +} + +static uint8_t pack_geran_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_geran_cell_search_request_t* value = (nfapi_geran_cell_search_request_t*)msg; + + return (push32(value->timeout, ppWritePackedMsg, end) && + push8(value->number_of_arfcn, ppWritePackedMsg, end) && + pusharray16(value->arfcn, NFAPI_MAX_ARFCN_LIST, value->number_of_arfcn, ppWritePackedMsg, end)); +} + +static uint8_t pack_nb_iot_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nb_iot_cell_search_request_t* value = (nfapi_nb_iot_cell_search_request_t*)msg; + + return (push16(value->earfcn, ppWritePackedMsg, end) && + push8(value->ro_dl, ppWritePackedMsg, end) && + push8(value->exhaustive_search, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end) && + push8(value->number_of_pci, ppWritePackedMsg, end) && + pusharray16(value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, ppWritePackedMsg, end)); +} + + +static uint8_t pack_cell_search_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_cell_search_request_t *pNfapiMsg = (nfapi_cell_search_request_t*)msg; + + if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0) + return 0; + + switch(pNfapiMsg->rat_type) + { + case NFAPI_RAT_TYPE_LTE: + { + if(pack_tlv(NFAPI_LTE_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->lte_cell_search_request, ppWritePackedMsg, end, &pack_lte_cell_search_request_value) == 0) + return 0; + } + break; + case NFAPI_RAT_TYPE_UTRAN: + { + if(pack_tlv(NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->utran_cell_search_request, ppWritePackedMsg, end, &pack_utran_cell_search_request_value) == 0) + return 0; + } + break; + case NFAPI_RAT_TYPE_GERAN: + { + if(pack_tlv(NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->geran_cell_search_request, ppWritePackedMsg, end, &pack_geran_cell_search_request_value) == 0) + return 0; + } + break; + case NFAPI_RAT_TYPE_NB_IOT: + { + if(pack_tlv(NFAPI_NB_IOT_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->nb_iot_cell_search_request, ppWritePackedMsg, end, &pack_nb_iot_cell_search_request_value) == 0) + return 0; + } + break; + }; + + return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_cell_search_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_cell_search_response_t *pNfapiMsg = (nfapi_cell_search_response_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_lte_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lte_cell_search_indication_t* value = (nfapi_lte_cell_search_indication_t*)msg; + uint16_t idx = 0; + + if(push16(value->number_of_lte_cells_found, ppWritePackedMsg, end) == 0) + return 0; + + for(idx = 0; idx < value->number_of_lte_cells_found; ++idx) + { + if(!(push16(value->lte_found_cells[idx].pci, ppWritePackedMsg, end) && + push8(value->lte_found_cells[idx].rsrp, ppWritePackedMsg, end) && + push8(value->lte_found_cells[idx].rsrq, ppWritePackedMsg, end) && + pushs16(value->lte_found_cells[idx].frequency_offset, ppWritePackedMsg, end))) + return 0; + } + return 1; +} + +static uint8_t pack_utran_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_utran_cell_search_indication_t* value = (nfapi_utran_cell_search_indication_t*)msg; + uint16_t idx = 0; + + if(push16(value->number_of_utran_cells_found, ppWritePackedMsg, end) == 0) + return 0; + + for(idx = 0; idx < value->number_of_utran_cells_found; ++idx) + { + if(!(push16(value->utran_found_cells[idx].psc, ppWritePackedMsg, end) && + push8(value->utran_found_cells[idx].rscp, ppWritePackedMsg, end) && + push8(value->utran_found_cells[idx].ecno, ppWritePackedMsg, end) && + pushs16(value->utran_found_cells[idx].frequency_offset, ppWritePackedMsg, end))) + return 0; + } + + return 1; +} + +static uint8_t pack_geran_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_geran_cell_search_indication_t* value = (nfapi_geran_cell_search_indication_t*)msg; + uint16_t idx = 0; + + if(push16(value->number_of_gsm_cells_found, ppWritePackedMsg, end) == 0) + return 0; + + for(idx = 0; idx < value->number_of_gsm_cells_found; ++idx) + { + if(!(push16(value->gsm_found_cells[idx].arfcn, ppWritePackedMsg, end) && + push8(value->gsm_found_cells[idx].bsic, ppWritePackedMsg, end) && + push8(value->gsm_found_cells[idx].rxlev, ppWritePackedMsg, end) && + push8(value->gsm_found_cells[idx].rxqual, ppWritePackedMsg, end) && + pushs16(value->gsm_found_cells[idx].frequency_offset, ppWritePackedMsg, end) && + push32(value->gsm_found_cells[idx].sfn_offset, ppWritePackedMsg, end))) + return 0; + } + + return 1; +} + +static uint8_t pack_nb_iot_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nb_iot_cell_search_indication_t* value = (nfapi_nb_iot_cell_search_indication_t*)msg; + uint16_t idx = 0; + + if(push16(value->number_of_nb_iot_cells_found, ppWritePackedMsg, end) == 0) + return 0; + + for(idx = 0; idx < value->number_of_nb_iot_cells_found; ++idx) + { + if(!(push16(value->nb_iot_found_cells[idx].pci, ppWritePackedMsg, end) && + push8(value->nb_iot_found_cells[idx].rsrp, ppWritePackedMsg, end) && + push8(value->nb_iot_found_cells[idx].rsrq, ppWritePackedMsg, end) && + pushs16(value->nb_iot_found_cells[idx].frequency_offset, ppWritePackedMsg, end))) + return 0; + } + + return 1; +} +static uint8_t pack_cell_search_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_cell_search_indication_t *pNfapiMsg = (nfapi_cell_search_indication_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_tlv(NFAPI_LTE_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->lte_cell_search_indication, ppWritePackedMsg, end, &pack_lte_cell_search_indication_value) && + pack_tlv(NFAPI_UTRAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->utran_cell_search_indication, ppWritePackedMsg, end, &pack_utran_cell_search_indication_value) && + pack_tlv(NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->geran_cell_search_indication, ppWritePackedMsg, end, &pack_geran_cell_search_indication_value) && + pack_tlv(NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, ppWritePackedMsg, end, &pack_opaque_data_value) && + pack_tlv(NFAPI_NB_IOT_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->nb_iot_cell_search_indication, ppWritePackedMsg, end, &pack_nb_iot_cell_search_indication_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); + +} + +static uint8_t pack_lte_broadcast_detect_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lte_broadcast_detect_request_t* value = (nfapi_lte_broadcast_detect_request_t*)msg; + + return (push16(value->earfcn, ppWritePackedMsg, end) && + push16(value->pci, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end)); +} + +static uint8_t pack_utran_broadcast_detect_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_utran_broadcast_detect_request_t* value = (nfapi_utran_broadcast_detect_request_t*)msg; + + return (push16(value->uarfcn, ppWritePackedMsg, end) && + push16(value->psc, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end)); +} + +static uint8_t pack_nb_iot_broadcast_detect_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nb_iot_broadcast_detect_request_t* value = (nfapi_nb_iot_broadcast_detect_request_t*)msg; + + return (push16(value->earfcn, ppWritePackedMsg, end) && + push8(value->ro_dl, ppWritePackedMsg, end) && + push16(value->pci, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end)); +} + +static uint8_t pack_broadcast_detect_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t * end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_broadcast_detect_request_t *pNfapiMsg = (nfapi_broadcast_detect_request_t*)msg; + + if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0) + return 0; + + switch(pNfapiMsg->rat_type) + { + case NFAPI_RAT_TYPE_LTE: + if(pack_tlv(NFAPI_LTE_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->lte_broadcast_detect_request, ppWritePackedMsg, end ,&pack_lte_broadcast_detect_request_value) == 0) + return 0; + break; + case NFAPI_RAT_TYPE_UTRAN: + if(pack_tlv(NFAPI_UTRAN_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->utran_broadcast_detect_request, ppWritePackedMsg, end, &pack_utran_broadcast_detect_request_value) == 0) + return 0; + break; + case NFAPI_RAT_TYPE_NB_IOT: + if(pack_tlv(NFAPI_NB_IOT_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->nb_iot_broadcast_detect_request, ppWritePackedMsg, end, &pack_nb_iot_broadcast_detect_request_value) == 0) + return 0; + break; + + } + + return (pack_tlv(NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, ppWritePackedMsg, end, &pack_opaque_data_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_broadcast_detect_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_broadcast_detect_response_t *pNfapiMsg = (nfapi_broadcast_detect_response_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_lte_broadcast_detect_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lte_broadcast_detect_indication_t* value = (nfapi_lte_broadcast_detect_indication_t*)msg; + + return (push8(value->number_of_tx_antenna, ppWritePackedMsg, end) && + push16(value->mib_length, ppWritePackedMsg, end) && + pusharray8(value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, ppWritePackedMsg, end) && + push32(value->sfn_offset, ppWritePackedMsg, end)); +} + +static uint8_t pack_utran_broadcast_detect_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_utran_broadcast_detect_indication_t* value = (nfapi_utran_broadcast_detect_indication_t*)msg; + + return (push16(value->mib_length, ppWritePackedMsg, end) && + pusharray8(value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, ppWritePackedMsg, end) && + push32(value->sfn_offset, ppWritePackedMsg, end)); +} + +static uint8_t pack_nb_iot_broadcast_detect_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nb_iot_broadcast_detect_indication_t* value = (nfapi_nb_iot_broadcast_detect_indication_t*)msg; + + return (push8(value->number_of_tx_antenna, ppWritePackedMsg, end) && + push16(value->mib_length, ppWritePackedMsg, end) && + pusharray8(value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, ppWritePackedMsg, end) && + push32(value->sfn_offset, ppWritePackedMsg, end)); +} + +static uint8_t pack_broadcast_detect_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_broadcast_detect_indication_t *pNfapiMsg = (nfapi_broadcast_detect_indication_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_tlv(NFAPI_LTE_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->lte_broadcast_detect_indication, ppWritePackedMsg, end, &pack_lte_broadcast_detect_indication_value) && + pack_tlv(NFAPI_UTRAN_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->utran_broadcast_detect_indication, ppWritePackedMsg, end, &pack_utran_broadcast_detect_indication_value) && + pack_tlv(NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, ppWritePackedMsg, end, &pack_opaque_data_value) && + pack_tlv(NFAPI_NB_IOT_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->nb_iot_broadcast_detect_indication, ppWritePackedMsg, end, &pack_nb_iot_broadcast_detect_indication_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_lte_system_information_schedule_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lte_system_information_schedule_request_t* value = (nfapi_lte_system_information_schedule_request_t*)msg; + + return (push16(value->earfcn, ppWritePackedMsg, end) && + push16(value->pci, ppWritePackedMsg, end) && + push16(value->downlink_channel_bandwidth, ppWritePackedMsg, end) && + push8(value->phich_configuration, ppWritePackedMsg, end) && + push8(value->number_of_tx_antenna, ppWritePackedMsg, end) && + push8(value->retry_count, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end)); +} + +static uint8_t pack_nb_iot_system_information_schedule_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nb_iot_system_information_schedule_request_t* value = (nfapi_nb_iot_system_information_schedule_request_t*)msg; + + return (push16(value->earfcn, ppWritePackedMsg, end) && + push8(value->ro_dl, ppWritePackedMsg, end) && + push16(value->pci, ppWritePackedMsg, end) && + push8(value->scheduling_info_sib1_nb, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end)); +} + + +static uint8_t pack_system_information_schedule_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_schedule_request_t *pNfapiMsg = (nfapi_system_information_schedule_request_t*)msg; + + if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0) + return 0; + + switch(pNfapiMsg->rat_type) + { + case NFAPI_RAT_TYPE_LTE: + if(pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->lte_system_information_schedule_request, ppWritePackedMsg, end, &pack_lte_system_information_schedule_request_value) == 0) + return 0; + break; + case NFAPI_RAT_TYPE_NB_IOT: + if(pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_schedule_request, ppWritePackedMsg, end, &pack_nb_iot_system_information_schedule_request_value) == 0) + return 0; + break; + } + + return (pack_tlv(NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, ppWritePackedMsg, end, &pack_opaque_data_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); + +} + +static uint8_t pack_system_information_schedule_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_schedule_response_t *pNfapiMsg = (nfapi_system_information_schedule_response_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_lte_system_information_indication_value(void* msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lte_system_information_indication_t* value = (nfapi_lte_system_information_indication_t*)msg; + + return (push8(value->sib_type, ppWritePackedMsg, end) && + push16(value->sib_length, ppWritePackedMsg, end) && + pusharray8(value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, ppWritePackedMsg, end)); +} + +static uint8_t pack_nb_iot_system_information_indication_value(void* msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nb_iot_system_information_indication_t* value = (nfapi_nb_iot_system_information_indication_t*)msg; + + return (push8(value->sib_type, ppWritePackedMsg, end) && + push16(value->sib_length, ppWritePackedMsg, end) && + pusharray8(value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, ppWritePackedMsg, end)); +} + +static uint8_t pack_system_information_schedule_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_schedule_indication_t *pNfapiMsg = (nfapi_system_information_schedule_indication_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, ppWritePackedMsg, end, &pack_lte_system_information_indication_value) && + pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, ppWritePackedMsg, end, &pack_nb_iot_system_information_indication_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_lte_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lte_system_information_request_t* value = (nfapi_lte_system_information_request_t*)msg; + uint16_t idx = 0; + + if(!(push16(value->earfcn, ppWritePackedMsg, end) && + push16(value->pci, ppWritePackedMsg, end) && + push16(value->downlink_channel_bandwidth, ppWritePackedMsg, end) && + push8(value->phich_configuration, ppWritePackedMsg, end) && + push8(value->number_of_tx_antenna, ppWritePackedMsg, end) && + push8(value->number_of_si_periodicity, ppWritePackedMsg, end))) + return 0; + + for(idx = 0; idx < value->number_of_si_periodicity; ++idx) + { + if(!(push8(value->si_periodicity[idx].si_periodicity, ppWritePackedMsg, end) && + push8(value->si_periodicity[idx].si_index, ppWritePackedMsg, end))) + return 0; + } + + return (push8(value->si_window_length, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end)); +} +static uint8_t pack_utran_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_utran_system_information_request_t* value = (nfapi_utran_system_information_request_t*)msg; + + return (push16(value->uarfcn, ppWritePackedMsg, end) && + push16(value->psc, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end)); +} +static uint8_t pack_geran_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_geran_system_information_request_t* value = (nfapi_geran_system_information_request_t*)msg; + + return (push16(value->arfcn, ppWritePackedMsg, end) && + push8(value->bsic, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end)); +} +static uint8_t pack_nb_iot_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nb_iot_system_information_request_t* value = (nfapi_nb_iot_system_information_request_t*)msg; + uint16_t idx = 0; + + if(!(push16(value->earfcn, ppWritePackedMsg, end) && + push8(value->ro_dl, ppWritePackedMsg, end) && + push16(value->pci, ppWritePackedMsg, end) && + push8(value->number_of_si_periodicity, ppWritePackedMsg, end))) + return 0; + + for(idx = 0; idx < value->number_of_si_periodicity; ++idx) + { + if(!(push8(value->si_periodicity[idx].si_periodicity, ppWritePackedMsg, end) && + push8(value->si_periodicity[idx].si_repetition_pattern, ppWritePackedMsg, end) && + push8(value->si_periodicity[idx].si_tb_size, ppWritePackedMsg, end) && + push8(value->si_periodicity[idx].number_of_si_index, ppWritePackedMsg, end))) + return 0; + + uint8_t si_idx; + for(si_idx = 0; si_idx < value->si_periodicity[idx].number_of_si_index; ++si_idx) + { + if(!(push8(value->si_periodicity[idx].si_index[si_idx], ppWritePackedMsg, end))) + return 0; + } + } + + return (push8(value->si_window_length, ppWritePackedMsg, end) && + push32(value->timeout, ppWritePackedMsg, end)); +} + + +static uint8_t pack_system_information_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_request_t *pNfapiMsg = (nfapi_system_information_request_t*)msg; + + if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0) + return 0; + + switch(pNfapiMsg->rat_type) + { + case NFAPI_RAT_TYPE_LTE: + if(pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->lte_system_information_request, ppWritePackedMsg, end, &pack_lte_system_information_request_value) == 0) + return 0; + break; + case NFAPI_RAT_TYPE_UTRAN: + if(pack_tlv(NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->utran_system_information_request, ppWritePackedMsg, end, &pack_utran_system_information_request_value) == 0) + return 0; + break; + case NFAPI_RAT_TYPE_GERAN: + if(pack_tlv(NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->geran_system_information_request, ppWritePackedMsg, end, &pack_geran_system_information_request_value) == 0) + return 0; + break; + case NFAPI_RAT_TYPE_NB_IOT: + if(pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_request, ppWritePackedMsg, end, &pack_nb_iot_system_information_request_value) == 0) + return 0; + break; + } + + return (pack_tlv(NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, ppWritePackedMsg, end, &pack_opaque_data_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_system_information_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_response_t *pNfapiMsg = (nfapi_system_information_response_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_utran_system_information_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_utran_system_information_indication_t* value = (nfapi_utran_system_information_indication_t*)msg; + + return (push16(value->sib_length, ppWritePackedMsg, end) && + pusharray8(value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, ppWritePackedMsg, end)); +} + +static uint8_t pack_geran_system_information_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_geran_system_information_indication_t* value = (nfapi_geran_system_information_indication_t*)msg; + + return (push16(value->si_length, ppWritePackedMsg, end) && + pusharray8(value->si, NFAPI_MAX_SIB_LENGTH, value->si_length, ppWritePackedMsg, end)); +} + +static uint8_t pack_system_information_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_indication_t *pNfapiMsg = (nfapi_system_information_indication_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, ppWritePackedMsg, end, &pack_lte_system_information_indication_value) && + pack_tlv(NFAPI_UTRAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->utran_system_information_indication, ppWritePackedMsg, end, &pack_utran_system_information_indication_value) && + pack_tlv(NFAPI_GERAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->geran_system_information_indication, ppWritePackedMsg, end, &pack_geran_system_information_indication_value) && + pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, ppWritePackedMsg, end, &pack_nb_iot_system_information_indication_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_nmm_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_nmm_stop_request_t *pNfapiMsg = (nfapi_nmm_stop_request_t*)msg; + + return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_nmm_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_nmm_stop_response_t *pNfapiMsg = (nfapi_nmm_stop_response_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t unpack_lte_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + //int result = 0; + nfapi_lte_rssi_request_t* value = (nfapi_lte_rssi_request_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) && + pull16(ppReadPackedMsg, &value->measurement_period, end) && + pull8(ppReadPackedMsg, &value->bandwidth, end) && + pull32(ppReadPackedMsg, &value->timeout, end) && + pull8(ppReadPackedMsg, &value->number_of_earfcns, end))) + return 0; + + if(value->number_of_earfcns <= NFAPI_MAX_CARRIER_LIST) + { + if(pullarray16(ppReadPackedMsg, value->earfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_earfcns, end) == 0) + return 0; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More EARFCN's than we can decode %d \n", value->number_of_earfcns); + return 0; + } + + return 1; + +} + +static uint8_t unpack_utran_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_utran_rssi_request_t* value = (nfapi_utran_rssi_request_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) && + pull16(ppReadPackedMsg, &value->measurement_period, end) && + pull32(ppReadPackedMsg, &value->timeout, end) && + pull8(ppReadPackedMsg, &value->number_of_uarfcns, end))) + return 0; + + if(value->number_of_uarfcns <= NFAPI_MAX_CARRIER_LIST) + { + if(pullarray16(ppReadPackedMsg, value->uarfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_uarfcns, end) == 0) + return 0; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More UARFCN's than we can decode %d \n", value->number_of_uarfcns); + return 0; + } + + return 1; +} + +static uint8_t unpack_geran_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_geran_rssi_request_t* value = (nfapi_geran_rssi_request_t*)tlv; + uint16_t idx = 0; + + if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) && + pull16(ppReadPackedMsg, &value->measurement_period, end) && + pull32(ppReadPackedMsg, &value->timeout, end) && + pull8(ppReadPackedMsg, &value->number_of_arfcns, end))) + return 0; + + if(value->number_of_arfcns <= NFAPI_MAX_CARRIER_LIST) + { + for(idx = 0; idx < value->number_of_arfcns; ++idx) + { + if(!(pull16(ppReadPackedMsg, &value->arfcn[idx].arfcn, end) && + pull8(ppReadPackedMsg, &value->arfcn[idx].direction, end))) + return 0; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More ARFCN's than we can decode %d \n", value->number_of_arfcns); + return 0; + } + + return 1; +} + +static uint8_t unpack_nb_iot_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_nb_iot_rssi_request_t* value = (nfapi_nb_iot_rssi_request_t*)tlv; + uint16_t idx = 0; + + if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) && + pull16(ppReadPackedMsg, &value->measurement_period, end) && + pull32(ppReadPackedMsg, &value->timeout, end) && + pull8(ppReadPackedMsg, &value->number_of_earfcns, end))) + return 0; + + if(value->number_of_earfcns <= NFAPI_MAX_CARRIER_LIST) + { + for(idx = 0; idx < value->number_of_earfcns; ++idx) + { + if(!(pull16(ppReadPackedMsg, &value->earfcn[idx].earfcn, end) && + pull8(ppReadPackedMsg, &value->earfcn[idx].number_of_ro_dl, end))) + return 0; + + if(value->earfcn[idx].number_of_ro_dl <= NFAPI_MAX_RO_DL) + { + uint8_t ro_dl_idx = 0; + for(ro_dl_idx = 0; ro_dl_idx < value->earfcn[idx].number_of_ro_dl; ++ro_dl_idx) + { + if(!pull8(ppReadPackedMsg, &value->earfcn[idx].ro_dl[ro_dl_idx], end)) + return 0; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More ROdl's than we can decode %d \n", value->earfcn[idx].number_of_ro_dl); + return 0; + } + + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More EARFCN's than we can decode %d \n", value->number_of_earfcns); + return 0; + } + + return 1; +} + +static uint8_t unpack_rssi_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_rssi_request_t *pNfapiMsg = (nfapi_rssi_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LTE_RSSI_REQUEST_TAG, &pNfapiMsg->lte_rssi_request, &unpack_lte_rssi_request_value}, + { NFAPI_UTRAN_RSSI_REQUEST_TAG, &pNfapiMsg->utran_rssi_request, &unpack_utran_rssi_request_value}, + { NFAPI_GERAN_RSSI_REQUEST_TAG, &pNfapiMsg->geran_rssi_request, &unpack_geran_rssi_request_value}, + { NFAPI_NB_IOT_RSSI_REQUEST_TAG, &pNfapiMsg->nb_iot_rssi_request, &unpack_nb_iot_rssi_request_value}, + }; + + int result = 0; + + result = (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension))); + + + // Verify that the rat type and the tlv match + if(result == 1 && + !((pNfapiMsg->rat_type == NFAPI_RAT_TYPE_LTE && pNfapiMsg->lte_rssi_request.tl.tag == NFAPI_LTE_RSSI_REQUEST_TAG) || + (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_UTRAN && pNfapiMsg->utran_rssi_request.tl.tag == NFAPI_UTRAN_RSSI_REQUEST_TAG) || + (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_GERAN && pNfapiMsg->geran_rssi_request.tl.tag == NFAPI_GERAN_RSSI_REQUEST_TAG) || + (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_NB_IOT && pNfapiMsg->nb_iot_rssi_request.tl.tag == NFAPI_NB_IOT_RSSI_REQUEST_TAG))) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Mismatch RAT Type: %d and TAG value: 0x%04x \n", pNfapiMsg->rat_type, pNfapiMsg->lte_rssi_request.tl.tag); + result = 0; + } + + return result; +} + +static uint8_t unpack_rssi_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_rssi_response_t *pNfapiMsg = (nfapi_rssi_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension))); +} + +static uint8_t unpack_rssi_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_rssi_indication_body_t* value = (nfapi_rssi_indication_body_t*)tlv; + + if(pull16(ppReadPackedMsg, &value->number_of_rssi, end) == 0) + return 0; + + if(value->number_of_rssi <= NFAPI_MAX_RSSI) + { + if(pullarrays16(ppReadPackedMsg, value->rssi, NFAPI_MAX_RSSI, value->number_of_rssi, end) == 0) + return 0; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More RSSI's than we can decode %d \n", value->number_of_rssi); + return 0; + } + + return 1; +} + +static uint8_t unpack_rssi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_rssi_indication_t *pNfapiMsg = (nfapi_rssi_indication_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_RSSI_INDICATION_TAG, &pNfapiMsg->rssi_indication_body, &unpack_rssi_indication_value}, + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_lte_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_lte_cell_search_request_t* value = (nfapi_lte_cell_search_request_t*)tlv; + + if(!(pull16(ppReadPackedMsg, &value->earfcn, end) && + pull8(ppReadPackedMsg, &value->measurement_bandwidth, end) && + pull8(ppReadPackedMsg, &value->exhaustive_search, end) && + pull32(ppReadPackedMsg, &value->timeout, end) && + pull8(ppReadPackedMsg, &value->number_of_pci, end))) + return 0; + + if(value->number_of_pci <= NFAPI_MAX_PCI_LIST) + { + if(pullarray16(ppReadPackedMsg, value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, end) == 0) + return 0; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More PCI's than we can decode %d \n", value->number_of_pci); + return 0; + } + return 1; +} + +static uint8_t unpack_utran_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_utran_cell_search_request_t* value = (nfapi_utran_cell_search_request_t*)tlv; + + if(!(pull16(ppReadPackedMsg, &value->uarfcn, end) && + pull8(ppReadPackedMsg, &value->exhaustive_search, end) && + pull32(ppReadPackedMsg, &value->timeout, end) && + pull8(ppReadPackedMsg, &value->number_of_psc, end))) + return 0; + + if(value->number_of_psc <= NFAPI_MAX_PSC_LIST) + { + if(pullarray16(ppReadPackedMsg, value->psc, NFAPI_MAX_PSC_LIST, value->number_of_psc, end) == 0) + return 0; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More PSC's than we can decode %d \n", value->number_of_psc); + return 0; + } + return 1; +} + +static uint8_t unpack_geran_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_geran_cell_search_request_t* value = (nfapi_geran_cell_search_request_t*)tlv; + + if(!(pull32(ppReadPackedMsg, &value->timeout, end) && + pull8(ppReadPackedMsg, &value->number_of_arfcn, end))) + return 0; + + if(value->number_of_arfcn <= NFAPI_MAX_ARFCN_LIST) + { + if(pullarray16(ppReadPackedMsg, value->arfcn, NFAPI_MAX_ARFCN_LIST, value->number_of_arfcn, end) == 0) + return 0; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More ARFCN's than we can decode %d \n", value->number_of_arfcn); + return 0; + } + return 1; +} + +static uint8_t unpack_nb_iot_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_nb_iot_cell_search_request_t* value = (nfapi_nb_iot_cell_search_request_t*)tlv; + + if(!(pull16(ppReadPackedMsg, &value->earfcn, end) && + pull8(ppReadPackedMsg, &value->ro_dl, end) && + pull8(ppReadPackedMsg, &value->exhaustive_search, end) && + pull32(ppReadPackedMsg, &value->timeout, end) && + pull8(ppReadPackedMsg, &value->number_of_pci, end))) + return 0; + + if(value->number_of_pci <= NFAPI_MAX_PCI_LIST) + { + if(pullarray16(ppReadPackedMsg, value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, end) == 0) + return 0; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More PCI's than we can decode %d \n", value->number_of_pci); + return 0; + } + return 1; +} + +static uint8_t unpack_cell_search_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_cell_search_request_t *pNfapiMsg = (nfapi_cell_search_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LTE_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->lte_cell_search_request, &unpack_lte_cell_search_request_value}, + { NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->utran_cell_search_request, &unpack_utran_cell_search_request_value}, + { NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->geran_cell_search_request, &unpack_geran_cell_search_request_value}, + { NFAPI_NB_IOT_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->nb_iot_cell_search_request, &unpack_nb_iot_cell_search_request_value}, + }; + + int result = (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); + + // Verify that the rat type and the tlv match + if(result == 1 && + !((pNfapiMsg->rat_type == NFAPI_RAT_TYPE_LTE && pNfapiMsg->lte_cell_search_request.tl.tag == NFAPI_LTE_CELL_SEARCH_REQUEST_TAG) || + (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_UTRAN && pNfapiMsg->utran_cell_search_request.tl.tag == NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG) || + (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_GERAN && pNfapiMsg->geran_cell_search_request.tl.tag == NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG) || + (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_NB_IOT && pNfapiMsg->nb_iot_cell_search_request.tl.tag == NFAPI_NB_IOT_CELL_SEARCH_REQUEST_TAG))) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Mismatch RAT Type: %d and TAG value: 0x%04x \n", pNfapiMsg->rat_type, pNfapiMsg->lte_cell_search_request.tl.tag); + result = 0; + } + + return result; +} + +static uint8_t unpack_cell_search_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_cell_search_response_t *pNfapiMsg = (nfapi_cell_search_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_lte_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_lte_cell_search_indication_t* value = (nfapi_lte_cell_search_indication_t*)tlv; + + uint16_t idx = 0; + if(pull16(ppReadPackedMsg, &value->number_of_lte_cells_found, end) == 0) + return 0; + + if(value->number_of_lte_cells_found <= NFAPI_MAX_LTE_CELLS_FOUND) + { + for(idx = 0; idx < value->number_of_lte_cells_found; ++idx) + { + if(!(pull16(ppReadPackedMsg, &value->lte_found_cells[idx].pci, end) && + pull8(ppReadPackedMsg, &value->lte_found_cells[idx].rsrp, end) && + pull8(ppReadPackedMsg, &value->lte_found_cells[idx].rsrq, end) && + pulls16(ppReadPackedMsg, &value->lte_found_cells[idx].frequency_offset, end))) + return 0; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found LTE cells than we can decode %d \n", value->number_of_lte_cells_found); + return 0; + } + return 1; +} + +static uint8_t unpack_utran_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_utran_cell_search_indication_t* value = (nfapi_utran_cell_search_indication_t*)tlv; + + uint16_t idx = 0; + if(pull16(ppReadPackedMsg, &value->number_of_utran_cells_found, end) == 0) + return 0; + + if(value->number_of_utran_cells_found <= NFAPI_MAX_UTRAN_CELLS_FOUND) + { + for(idx = 0; idx < value->number_of_utran_cells_found; ++idx) + { + if(!(pull16(ppReadPackedMsg, &value->utran_found_cells[idx].psc, end) && + pull8(ppReadPackedMsg, &value->utran_found_cells[idx].rscp, end) && + pull8(ppReadPackedMsg, &value->utran_found_cells[idx].ecno, end) && + pulls16(ppReadPackedMsg, &value->utran_found_cells[idx].frequency_offset, end))) + return 0; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found UTRAN cells than we can decode %d \n", value->number_of_utran_cells_found); + return 0; + } + return 1; +} + +static uint8_t unpack_geran_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_geran_cell_search_indication_t* value = (nfapi_geran_cell_search_indication_t*)tlv; + + uint16_t idx = 0; + if(pull16(ppReadPackedMsg, &value->number_of_gsm_cells_found, end) == 0) + return 0; + + if(value->number_of_gsm_cells_found <= NFAPI_MAX_GSM_CELLS_FOUND) + { + for(idx = 0; idx < value->number_of_gsm_cells_found; ++idx) + { + if(!(pull16(ppReadPackedMsg, &value->gsm_found_cells[idx].arfcn, end) && + pull8(ppReadPackedMsg, &value->gsm_found_cells[idx].bsic, end) && + pull8(ppReadPackedMsg, &value->gsm_found_cells[idx].rxlev, end) && + pull8(ppReadPackedMsg, &value->gsm_found_cells[idx].rxqual, end) && + pulls16(ppReadPackedMsg, &value->gsm_found_cells[idx].frequency_offset, end) && + pull32(ppReadPackedMsg, &value->gsm_found_cells[idx].sfn_offset, end))) + return 0; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found GSM cells than we can decode %d \n", value->number_of_gsm_cells_found); + return 0; + } + return 1; +} + +static uint8_t unpack_nb_iot_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_nb_iot_cell_search_indication_t* value = (nfapi_nb_iot_cell_search_indication_t*)tlv; + + uint16_t idx = 0; + if(pull16(ppReadPackedMsg, &value->number_of_nb_iot_cells_found, end) == 0) + return 0; + + if(value->number_of_nb_iot_cells_found <= NFAPI_MAX_NB_IOT_CELLS_FOUND) + { + for(idx = 0; idx < value->number_of_nb_iot_cells_found; ++idx) + { + if(!(pull16(ppReadPackedMsg, &value->nb_iot_found_cells[idx].pci, end) && + pull8(ppReadPackedMsg, &value->nb_iot_found_cells[idx].rsrp, end) && + pull8(ppReadPackedMsg, &value->nb_iot_found_cells[idx].rsrq, end) && + pulls16(ppReadPackedMsg, &value->nb_iot_found_cells[idx].frequency_offset, end))) + return 0; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found NB_IOT cells than we can decode %d \n", value->number_of_nb_iot_cells_found); + return 0; + } + return 1; +} + +static uint8_t unpack_cell_search_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_cell_search_indication_t *pNfapiMsg = (nfapi_cell_search_indication_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LTE_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->lte_cell_search_indication, &unpack_lte_cell_search_indication_value}, + { NFAPI_UTRAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->utran_cell_search_indication, &unpack_utran_cell_search_indication_value}, + { NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->geran_cell_search_indication, &unpack_geran_cell_search_indication_value}, + { NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, &unpack_opaque_data_value}, + { NFAPI_NB_IOT_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->nb_iot_cell_search_indication, &unpack_nb_iot_cell_search_indication_value}, + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); + +} + +static uint8_t unpack_lte_broadcast_detect_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_lte_broadcast_detect_request_t* value = (nfapi_lte_broadcast_detect_request_t*)tlv; + + return (pull16(ppReadPackedMsg, &value->earfcn, end) && + pull16(ppReadPackedMsg, &value->pci, end) && + pull32(ppReadPackedMsg, &value->timeout, end)); +} + +static uint8_t unpack_utran_broadcast_detect_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_utran_broadcast_detect_request_t* value = (nfapi_utran_broadcast_detect_request_t*)tlv; + + return (pull16(ppReadPackedMsg, &value->uarfcn, end) && + pull16(ppReadPackedMsg, &value->psc, end) && + pull32(ppReadPackedMsg, &value->timeout, end)); +} + +static uint8_t unpack_nb_iot_broadcast_detect_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_nb_iot_broadcast_detect_request_t* value = (nfapi_nb_iot_broadcast_detect_request_t*)tlv; + + return (pull16(ppReadPackedMsg, &value->earfcn, end) && + pull8(ppReadPackedMsg, &value->ro_dl, end) && + pull16(ppReadPackedMsg, &value->pci, end) && + pull32(ppReadPackedMsg, &value->timeout, end)); +} + +static uint8_t unpack_broadcast_detect_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_broadcast_detect_request_t *pNfapiMsg = (nfapi_broadcast_detect_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LTE_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->lte_broadcast_detect_request, &unpack_lte_broadcast_detect_request_value}, + { NFAPI_UTRAN_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->utran_broadcast_detect_request, &unpack_utran_broadcast_detect_request_value}, + { NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, &unpack_opaque_data_value}, + { NFAPI_NB_IOT_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->nb_iot_broadcast_detect_request, &unpack_nb_iot_broadcast_detect_request_value} + }; + + return (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_broadcast_detect_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_broadcast_detect_response_t *pNfapiMsg = (nfapi_broadcast_detect_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_lte_broadcast_detect_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_lte_broadcast_detect_indication_t* value = (nfapi_lte_broadcast_detect_indication_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) && + pull16(ppReadPackedMsg, &value->mib_length, end))) + return 0; + + if(value->mib_length > NFAPI_MAX_MIB_LENGTH) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "MIB too long %d \n", value->mib_length); + return 0; + } + + return (pullarray8(ppReadPackedMsg, value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, end) && + pull32(ppReadPackedMsg, &value->sfn_offset, end)); +} + +static uint8_t unpack_utran_broadcast_detect_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_utran_broadcast_detect_indication_t* value = (nfapi_utran_broadcast_detect_indication_t*)tlv; + + if(pull16(ppReadPackedMsg, &value->mib_length, end) == 0) + return 0; + + if(value->mib_length > NFAPI_MAX_MIB_LENGTH) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "MIB too long %d \n", value->mib_length); + return 0; + } + + return (pullarray8(ppReadPackedMsg, value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, end) && + pull32(ppReadPackedMsg, &value->sfn_offset, end)); +} + +static uint8_t unpack_nb_iot_broadcast_detect_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_nb_iot_broadcast_detect_indication_t* value = (nfapi_nb_iot_broadcast_detect_indication_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) && + pull16(ppReadPackedMsg, &value->mib_length, end))) + return 0; + + if(value->mib_length > NFAPI_MAX_MIB_LENGTH) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "MIB too long %d \n", value->mib_length); + return 0; + } + + return (pullarray8(ppReadPackedMsg, value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, end) && + pull32(ppReadPackedMsg, &value->sfn_offset, end)); +} + +static uint8_t unpack_broadcast_detect_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_broadcast_detect_indication_t *pNfapiMsg = (nfapi_broadcast_detect_indication_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LTE_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->lte_broadcast_detect_indication, &unpack_lte_broadcast_detect_indication_value}, + { NFAPI_UTRAN_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->utran_broadcast_detect_indication, &unpack_utran_broadcast_detect_indication_value}, + { NFAPI_NB_IOT_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->nb_iot_broadcast_detect_indication, &unpack_nb_iot_broadcast_detect_indication_value}, + { NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, &unpack_opaque_data_value} + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_lte_system_information_schedule_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_lte_system_information_schedule_request_t* value = (nfapi_lte_system_information_schedule_request_t*)tlv; + + return (pull16(ppReadPackedMsg, &value->earfcn, end) && + pull16(ppReadPackedMsg, &value->pci, end) && + pull16(ppReadPackedMsg, &value->downlink_channel_bandwidth, end) && + pull8(ppReadPackedMsg, &value->phich_configuration, end) && + pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) && + pull8(ppReadPackedMsg, &value->retry_count, end) && + pull32(ppReadPackedMsg, &value->timeout, end)); +} + +static uint8_t unpack_nb_iot_system_information_schedule_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_nb_iot_system_information_schedule_request_t* value = (nfapi_nb_iot_system_information_schedule_request_t*)tlv; + + return (pull16(ppReadPackedMsg, &value->earfcn, end) && + pull8(ppReadPackedMsg, &value->ro_dl, end) && + pull16(ppReadPackedMsg, &value->pci, end) && + pull8(ppReadPackedMsg, &value->scheduling_info_sib1_nb, end) && + pull32(ppReadPackedMsg, &value->timeout, end)); +} + +static uint8_t unpack_system_information_schedule_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_schedule_request_t *pNfapiMsg = (nfapi_system_information_schedule_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LTE_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->lte_system_information_schedule_request, &unpack_lte_system_information_schedule_request_value}, + { NFAPI_NB_IOT_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_schedule_request, &unpack_nb_iot_system_information_schedule_request_value}, + { NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, &unpack_opaque_data_value} + }; + + return (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_system_information_schedule_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_schedule_response_t *pNfapiMsg = (nfapi_system_information_schedule_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_lte_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_lte_system_information_indication_t* value = (nfapi_lte_system_information_indication_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->sib_type, end) && + pull16(ppReadPackedMsg, &value->sib_length, end))) + return 0; + + if(value->sib_length > NFAPI_MAX_SIB_LENGTH) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->sib_length); + return 0; + } + + if(pullarray8(ppReadPackedMsg, value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, end) == 0) + return 0; + + return 1; +} + +static uint8_t unpack_nb_iot_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_nb_iot_system_information_indication_t* value = (nfapi_nb_iot_system_information_indication_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->sib_type, end) && + pull16(ppReadPackedMsg, &value->sib_length, end))) + return 0; + + if(value->sib_length > NFAPI_MAX_SIB_LENGTH) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->sib_length); + return 0; + } + + if(pullarray8(ppReadPackedMsg, value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, end) == 0) + return 0; + + return 1; +} + +static uint8_t unpack_system_information_schedule_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_schedule_indication_t *pNfapiMsg = (nfapi_system_information_schedule_indication_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, &unpack_lte_system_information_indication_value}, + { NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, &unpack_nb_iot_system_information_indication_value}, + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_lte_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_lte_system_information_request_t* value = (nfapi_lte_system_information_request_t*)tlv; + uint16_t idx = 0; + + if(!(pull16(ppReadPackedMsg, &value->earfcn, end) && + pull16(ppReadPackedMsg, &value->pci, end) && + pull16(ppReadPackedMsg, &value->downlink_channel_bandwidth, end) && + pull8(ppReadPackedMsg, &value->phich_configuration, end) && + pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) && + pull8(ppReadPackedMsg, &value->number_of_si_periodicity, end))) + return 0; + + if(value->number_of_si_periodicity > NFAPI_MAX_SI_PERIODICITY) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found SI periodicity than we can decode %d \n", value->number_of_si_periodicity); + return 0; + } + + for(idx = 0; idx < value->number_of_si_periodicity; ++idx) + { + if(!(pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_periodicity, end) && + pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_index, end))) + return 0; + } + + if(!(pull8(ppReadPackedMsg, &value->si_window_length, end) && + pull32(ppReadPackedMsg, &value->timeout, end))) + return 0; + + return 1; +} + +static uint8_t unpack_utran_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_utran_system_information_request_t* value = (nfapi_utran_system_information_request_t*)tlv; + + return (pull16(ppReadPackedMsg, &value->uarfcn, end) && + pull16(ppReadPackedMsg, &value->psc, end) && + pull32(ppReadPackedMsg, &value->timeout, end)); +} + +static uint8_t unpack_geran_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_geran_system_information_request_t* value = (nfapi_geran_system_information_request_t*)tlv; + + return (pull16(ppReadPackedMsg, &value->arfcn, end) && + pull8(ppReadPackedMsg, &value->bsic, end) && + pull32(ppReadPackedMsg, &value->timeout, end)); +} + +static uint8_t unpack_nb_iot_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_nb_iot_system_information_request_t* value = (nfapi_nb_iot_system_information_request_t*)tlv; + uint16_t idx = 0; + + if(!(pull16(ppReadPackedMsg, &value->earfcn, end) && + pull8(ppReadPackedMsg, &value->ro_dl, end) && + pull16(ppReadPackedMsg, &value->pci, end) && + pull8(ppReadPackedMsg, &value->number_of_si_periodicity, end))) + return 0; + + if(value->number_of_si_periodicity > NFAPI_MAX_SI_PERIODICITY) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found SI periodicity than we can decode %d \n", value->number_of_si_periodicity); + return 0; + } + + for(idx = 0; idx < value->number_of_si_periodicity; ++idx) + { + if(!(pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_periodicity, end) && + pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_repetition_pattern, end) && + pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_tb_size, end) && + pull8(ppReadPackedMsg, &value->si_periodicity[idx].number_of_si_index, end))) + return 0; + + uint8_t si_idx; + for(si_idx = 0; si_idx < value->si_periodicity[idx].number_of_si_index; ++si_idx) + { + if(!(pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_index[si_idx], end))) + return 0; + + } + } + + if(!(pull8(ppReadPackedMsg, &value->si_window_length, end) && + pull32(ppReadPackedMsg, &value->timeout, end))) + return 0; + + return 1; +} + +static uint8_t unpack_system_information_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_request_t *pNfapiMsg = (nfapi_system_information_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->lte_system_information_request, &unpack_lte_system_information_request_value}, + { NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->utran_system_information_request, &unpack_utran_system_information_request_value}, + { NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->geran_system_information_request, &unpack_geran_system_information_request_value}, + { NFAPI_NB_IOT_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_request, &unpack_nb_iot_system_information_request_value}, + { NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, &unpack_opaque_data_value} + }; + + + int result = (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); + + // Verify that the rat type and the tlv match + if(result == 1 && + !((pNfapiMsg->rat_type == NFAPI_RAT_TYPE_LTE && pNfapiMsg->lte_system_information_request.tl.tag == NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG) || + (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_UTRAN && pNfapiMsg->utran_system_information_request.tl.tag == NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG) || + (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_GERAN && pNfapiMsg->geran_system_information_request.tl.tag == NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG))) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Mismatch RAT Type: %d and TAG value: 0x%04x \n", pNfapiMsg->rat_type, pNfapiMsg->lte_system_information_request.tl.tag); + result = 0; + } + + return result; +} + +static uint8_t unpack_system_information_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_response_t *pNfapiMsg = (nfapi_system_information_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_utran_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_utran_system_information_indication_t* value = (nfapi_utran_system_information_indication_t*)tlv; + + if(pull16(ppReadPackedMsg, &value->sib_length, end) == 0) + return 0; + + if(value->sib_length > NFAPI_MAX_SIB_LENGTH) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->sib_length); + return 0; + } + + if(pullarray8(ppReadPackedMsg, value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, end) == 0) + return 0; + + return 1; +} + +static uint8_t unpack_geran_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_geran_system_information_indication_t* value = (nfapi_geran_system_information_indication_t*)tlv; + + if(pull16(ppReadPackedMsg, &value->si_length, end) == 0) + return 0; + + if(value->si_length > NFAPI_MAX_SI_LENGTH) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->si_length); + return 0; + } + + if(pullarray8(ppReadPackedMsg, value->si, NFAPI_MAX_SI_LENGTH, value->si_length, end) == 0) + return 0; + + return 1; +} + +static uint8_t unpack_system_information_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_system_information_indication_t *pNfapiMsg = (nfapi_system_information_indication_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, &unpack_lte_system_information_indication_value}, + { NFAPI_UTRAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->utran_system_information_indication, &unpack_utran_system_information_indication_value}, + { NFAPI_GERAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->geran_system_information_indication, &unpack_geran_system_information_indication_value}, + { NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, &unpack_nb_iot_system_information_indication_value}, + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); + +} + +static uint8_t unpack_nmm_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_nmm_stop_request_t *pNfapiMsg = (nfapi_nmm_stop_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension); +} + +static uint8_t unpack_nmm_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_nmm_stop_response_t *pNfapiMsg = (nfapi_nmm_stop_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + + +static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) +{ + int retLen = 0; + + switch (msgId) + { + case NFAPI_RSSI_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_rssi_request_t)) + retLen = sizeof(nfapi_rssi_request_t); + break; + + case NFAPI_RSSI_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_rssi_response_t)) + retLen = sizeof(nfapi_rssi_response_t); + break; + + case NFAPI_RSSI_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_rssi_indication_t)) + retLen = sizeof(nfapi_rssi_indication_t); + break; + + case NFAPI_CELL_SEARCH_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_cell_search_request_t)) + retLen = sizeof(nfapi_cell_search_request_t); + break; + + case NFAPI_CELL_SEARCH_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_cell_search_response_t)) + retLen = sizeof(nfapi_cell_search_response_t); + break; + + case NFAPI_CELL_SEARCH_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_cell_search_indication_t)) + retLen = sizeof(nfapi_cell_search_indication_t); + break; + + case NFAPI_BROADCAST_DETECT_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_broadcast_detect_request_t)) + retLen = sizeof(nfapi_broadcast_detect_request_t); + break; + + case NFAPI_BROADCAST_DETECT_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_broadcast_detect_response_t)) + retLen = sizeof(nfapi_broadcast_detect_response_t); + break; + + case NFAPI_BROADCAST_DETECT_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_broadcast_detect_indication_t)) + retLen = sizeof(nfapi_broadcast_detect_indication_t); + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_system_information_schedule_request_t)) + retLen = sizeof(nfapi_system_information_schedule_request_t); + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_system_information_schedule_response_t)) + retLen = sizeof(nfapi_system_information_schedule_response_t); + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_system_information_schedule_indication_t)) + retLen = sizeof(nfapi_system_information_schedule_indication_t); + break; + + case NFAPI_SYSTEM_INFORMATION_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_system_information_request_t)) + retLen = sizeof(nfapi_system_information_request_t); + break; + + case NFAPI_SYSTEM_INFORMATION_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_system_information_response_t)) + retLen = sizeof(nfapi_system_information_response_t); + break; + + case NFAPI_SYSTEM_INFORMATION_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_system_information_indication_t)) + retLen = sizeof(nfapi_system_information_indication_t); + break; + + case NFAPI_NMM_STOP_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_nmm_stop_request_t)) + retLen = sizeof(nfapi_nmm_stop_request_t); + break; + + case NFAPI_NMM_STOP_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_nmm_stop_response_t)) + retLen = sizeof(nfapi_nmm_stop_response_t); + break; + + default: + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId); + break; + } + + return retLen; +} + +int nfapi_p4_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf; + uint8_t *end = pPackedBuf + packedBufLen; + uint8_t *pWritePackedMessage = pPackedBuf; + uint8_t *pPackedLengthField = &pWritePackedMessage[4]; + uint32_t packedMsgLen; + uint16_t packedMsgLen16; + + if (pMessageBuf == NULL || pPackedBuf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 Pack supplied pointers are null\n"); + return -1; + } + + // process the header + if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) && + push16(pMessageHeader->message_id, &pWritePackedMessage, end) && + push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) && + push16(pMessageHeader->spare, &pWritePackedMessage, end))) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to pack p4 message header\n"); + return -1; + } + + // look for the specific message + uint8_t result = 0; + switch (pMessageHeader->message_id) + { + case NFAPI_RSSI_REQUEST: + result = pack_rssi_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_RSSI_RESPONSE: + result = pack_rssi_response(pMessageHeader, &pWritePackedMessage, end,config); + break; + + case NFAPI_RSSI_INDICATION: + result = pack_rssi_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_CELL_SEARCH_REQUEST: + result = pack_cell_search_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_CELL_SEARCH_RESPONSE: + result = pack_cell_search_response(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_CELL_SEARCH_INDICATION: + result = pack_cell_search_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_BROADCAST_DETECT_REQUEST: + result = pack_broadcast_detect_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_BROADCAST_DETECT_RESPONSE: + result = pack_broadcast_detect_response(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_BROADCAST_DETECT_INDICATION: + result = pack_broadcast_detect_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST: + result = pack_system_information_schedule_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE: + result = pack_system_information_schedule_response(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION: + result = pack_system_information_schedule_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_SYSTEM_INFORMATION_REQUEST: + result = pack_system_information_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_SYSTEM_INFORMATION_RESPONSE: + result = pack_system_information_response(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_SYSTEM_INFORMATION_INDICATION: + result = pack_system_information_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_NMM_STOP_REQUEST: + result = pack_nmm_stop_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_NMM_STOP_RESPONSE: + result = pack_nmm_stop_response(pMessageHeader, &pWritePackedMessage, end, config); + break; + + default: + { + if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && + pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MIN) + { + if(config && config->pack_p4_p5_vendor_extension) + { + result =(config->pack_p4_p5_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve encoder provided\n", __FUNCTION__, pMessageHeader->message_id); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id); + } + } + break; + } + + // return the packed length + if(result == 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Result is 0\n"); + return -1; + } + + + // check for a valid message length + packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage); + if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen); + return -1; + } + else + { + packedMsgLen16 = (uint16_t)packedMsgLen; + } + + // Update the message length in the header + if(push16(packedMsgLen16, &pPackedLengthField, end) == 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to pack p4 message header lengt\n"); + return -1; + } + + return (packedMsgLen); + +} + +// Main unpack functions - public + +int nfapi_p4_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf; + uint8_t *pReadPackedMessage = pMessageBuf; + uint8_t *end = pMessageBuf + messageBufLen; + + if (pMessageBuf == NULL || pUnpackedBuf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 header unpack supplied pointers are null\n"); + return -1; + } + + if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen); + return -1; + } + + // process the headei + if (pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) && + pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) && + pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) && + pull16(&pReadPackedMessage, &pMessageHeader->spare, end)) + return -1; + + return 0; +} + +int nfapi_p4_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config) +{ + int result = 0; + nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf; + uint8_t *pReadPackedMessage = pMessageBuf; + uint8_t *end = pMessageBuf + messageBufLen; + + if (pMessageBuf == NULL || pUnpackedBuf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 unpack supplied pointers are null\n"); + return -1; + } + + if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen); + return -1; + } + + // clean the supplied buffer for - tag value blanking + (void)memset(pUnpackedBuf, 0, unpackedBufLen); + + // process the header + if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) && + pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) && + pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) && + pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) + return -1; + + // look for the specific message + switch (pMessageHeader->message_id) + { + case NFAPI_RSSI_REQUEST: + if (check_unpack_length(NFAPI_RSSI_REQUEST, unpackedBufLen)) + result = unpack_rssi_request(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_RSSI_RESPONSE: + if (check_unpack_length(NFAPI_RSSI_RESPONSE, unpackedBufLen)) + result = unpack_rssi_response(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_RSSI_INDICATION: + if (check_unpack_length(NFAPI_RSSI_INDICATION, unpackedBufLen)) + result = unpack_rssi_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_CELL_SEARCH_REQUEST: + if (check_unpack_length(NFAPI_CELL_SEARCH_REQUEST, unpackedBufLen)) + result = unpack_cell_search_request(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_CELL_SEARCH_RESPONSE: + if (check_unpack_length(NFAPI_CELL_SEARCH_RESPONSE, unpackedBufLen)) + result = unpack_cell_search_response(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_CELL_SEARCH_INDICATION: + if (check_unpack_length(NFAPI_CELL_SEARCH_INDICATION, unpackedBufLen)) + result = unpack_cell_search_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_BROADCAST_DETECT_REQUEST: + if (check_unpack_length(NFAPI_BROADCAST_DETECT_REQUEST, unpackedBufLen)) + result = unpack_broadcast_detect_request(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_BROADCAST_DETECT_RESPONSE: + if (check_unpack_length(NFAPI_BROADCAST_DETECT_RESPONSE, unpackedBufLen)) + result = unpack_broadcast_detect_response(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_BROADCAST_DETECT_INDICATION: + if (check_unpack_length(NFAPI_BROADCAST_DETECT_INDICATION, unpackedBufLen)) + result = unpack_broadcast_detect_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST: + if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST, unpackedBufLen)) + result = unpack_system_information_schedule_request(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE: + if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE, unpackedBufLen)) + result = unpack_system_information_schedule_response(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION: + if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION, unpackedBufLen)) + result = unpack_system_information_schedule_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_SYSTEM_INFORMATION_REQUEST: + if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_REQUEST, unpackedBufLen)) + result = unpack_system_information_request(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_SYSTEM_INFORMATION_RESPONSE: + if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_RESPONSE, unpackedBufLen)) + result = unpack_system_information_response(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_SYSTEM_INFORMATION_INDICATION: + if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_INDICATION, unpackedBufLen)) + result = unpack_system_information_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_NMM_STOP_REQUEST: + if (check_unpack_length(NFAPI_NMM_STOP_REQUEST, unpackedBufLen)) + result = unpack_nmm_stop_request(&pReadPackedMessage, end, pMessageHeader, config); + else + result = -1; + break; + + case NFAPI_NMM_STOP_RESPONSE: + if (check_unpack_length(NFAPI_NMM_STOP_RESPONSE, unpackedBufLen)) + result = unpack_nmm_stop_response(&pReadPackedMessage, end , pMessageHeader, config); + else + result = -1; + break; + + default: + if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && + pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) + { + if(config && config->unpack_p4_p5_vendor_extension) + { + result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P4 message ID %d\n", __FUNCTION__, pMessageHeader->message_id); + } + break; + } + + if(result == 0) + return -1; + + return result; +} diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c new file mode 100644 index 0000000000..c78b829135 --- /dev/null +++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c @@ -0,0 +1,1800 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +// Pack routines + +static uint8_t pack_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_param_request_t* request = (nfapi_pnf_param_request_t*)msg; + return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config); +} + +static uint8_t pack_pnf_param_general_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_param_general_t* value = (nfapi_pnf_param_general_t*)tlv; + + return ( push8(value->nfapi_sync_mode, ppWritePackedMsg, end) && + push8(value->location_mode, ppWritePackedMsg, end) && + push16(value->location_coordinates_length, ppWritePackedMsg, end) && + pusharray8(value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, ppWritePackedMsg, end) && + push32(value->dl_config_timing, ppWritePackedMsg, end) && + push32(value->tx_timing, ppWritePackedMsg, end) && + push32(value->ul_config_timing, ppWritePackedMsg, end) && + push32(value->hi_dci0_timing, ppWritePackedMsg, end) && + push16(value->maximum_number_phys, ppWritePackedMsg, end) && + push16(value->maximum_total_bandwidth, ppWritePackedMsg, end) && + push8(value->maximum_total_number_dl_layers, ppWritePackedMsg, end) && + push8(value->maximum_total_number_ul_layers, ppWritePackedMsg, end) && + push8(value->shared_bands, ppWritePackedMsg, end) && + push8(value->shared_pa, ppWritePackedMsg, end) && + pushs16(value->maximum_total_power, ppWritePackedMsg, end) && + pusharray8(value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, ppWritePackedMsg, end)); +} + +static uint8_t pack_rf_config_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_rf_config_info_t* rf = (nfapi_rf_config_info_t*)elem; + + return (push16(rf->rf_config_index, ppWritePackedMsg, end)); +} + + +static uint8_t pack_pnf_phy_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t* end) +{ + nfapi_pnf_phy_info_t* phy = (nfapi_pnf_phy_info_t*)elem; + + return ( push16(phy->phy_config_index, ppWritePackedMsg, end) && + push16(phy->number_of_rfs, ppWritePackedMsg, end) && + packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) && + push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) && + packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) && + push16(phy->downlink_channel_bandwidth_supported, ppWritePackedMsg, end) && + push16(phy->uplink_channel_bandwidth_supported, ppWritePackedMsg, end) && + push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) && + push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) && + push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) && + push8(phy->nmm_modes_supported, ppWritePackedMsg, end)); + + +} + +static uint8_t pack_pnf_phy_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_t* value = (nfapi_pnf_phy_t*)tlv; + + return ( push16(value->number_of_phys, ppWritePackedMsg, end) && + packarray(value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_info)); +} + +static uint8_t pack_pnf_rf_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_rf_t* value = (nfapi_pnf_rf_t*)tlv; + uint16_t rf_index = 0; + + if(push16(value->number_of_rfs, ppWritePackedMsg, end) == 0) + return 0; + + for(; rf_index < value->number_of_rfs; ++rf_index) + { + if( !(push16(value->rf[rf_index].rf_config_index, ppWritePackedMsg, end) && + push16(value->rf[rf_index].band, ppWritePackedMsg, end) && + pushs16(value->rf[rf_index].maximum_transmit_power, ppWritePackedMsg, end) && + pushs16(value->rf[rf_index].minimum_transmit_power, ppWritePackedMsg, end) && + push8(value->rf[rf_index].number_of_antennas_suppported, ppWritePackedMsg, end) && + push32(value->rf[rf_index].minimum_downlink_frequency, ppWritePackedMsg, end) && + push32(value->rf[rf_index].maximum_downlink_frequency, ppWritePackedMsg, end) && + push32(value->rf[rf_index].minimum_uplink_frequency, ppWritePackedMsg, end) && + push32(value->rf[rf_index].maximum_uplink_frequency, ppWritePackedMsg, end))) + return 0; + } + + return 1; +} +static uint8_t pack_pnf_phy_rel10_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel10_info_t* phy = (nfapi_pnf_phy_rel10_info_t*)elem; + + return(push16(phy->phy_config_index, ppWritePackedMsg, end) && + push16(phy->transmission_mode_7_supported, ppWritePackedMsg, end) && + push16(phy->transmission_mode_8_supported, ppWritePackedMsg, end) && + push16(phy->two_antenna_ports_for_pucch, ppWritePackedMsg, end) && + push16(phy->transmission_mode_9_supported, ppWritePackedMsg, end) && + push16(phy->simultaneous_pucch_pusch, ppWritePackedMsg, end) && + push16(phy->four_layer_tx_with_tm3_and_tm4, ppWritePackedMsg, end)); +} + +static uint8_t pack_pnf_phy_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel10_t* value = (nfapi_pnf_phy_rel10_t*)tlv; + + return (push16(value->number_of_phys, ppWritePackedMsg, end) && + packarray(value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel10_info)); + +} + +static uint8_t pack_pnf_phy_rel11_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel11_info_t* phy = (nfapi_pnf_phy_rel11_info_t*)elem; + + return (push16(phy->phy_config_index, ppWritePackedMsg, end) && + push16(phy->edpcch_supported, ppWritePackedMsg, end) && + push16(phy->multi_ack_csi_reporting, ppWritePackedMsg, end) && + push16(phy->pucch_tx_diversity, ppWritePackedMsg, end) && + push16(phy->ul_comp_supported, ppWritePackedMsg, end) && + push16(phy->transmission_mode_5_supported, ppWritePackedMsg, end )); +} +static uint8_t pack_pnf_phy_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel11_t* value = (nfapi_pnf_phy_rel11_t*)tlv; + + return (push16(value->number_of_phys, ppWritePackedMsg, end) && + packarray(value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel11_info)); +} +static uint8_t pack_pnf_phy_rel12_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel12_info_t* phy = (nfapi_pnf_phy_rel12_info_t*)elem; + + return( push16(phy->phy_config_index, ppWritePackedMsg, end) && + push16(phy->csi_subframe_set, ppWritePackedMsg, end) && + push16(phy->enhanced_4tx_codebook, ppWritePackedMsg, end) && + push16(phy->drs_supported, ppWritePackedMsg, end) && + push16(phy->ul_64qam_supported, ppWritePackedMsg, end) && + push16(phy->transmission_mode_10_supported, ppWritePackedMsg, end) && + push16(phy->alternative_bts_indices, ppWritePackedMsg, end)); +} +static uint8_t pack_pnf_phy_rel12_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel12_t* value = (nfapi_pnf_phy_rel12_t*)tlv; + + return (push16(value->number_of_phys, ppWritePackedMsg, end) && + packarray(value->phy, sizeof(nfapi_pnf_phy_rel12_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel12_info)); + +} + +static uint8_t pack_pnf_phy_rel13_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel13_info_t* phy = (nfapi_pnf_phy_rel13_info_t*)elem; + + return( push16(phy->phy_config_index, ppWritePackedMsg, end) && + push16(phy->pucch_format4_supported, ppWritePackedMsg, end) && + push16(phy->pucch_format5_supported, ppWritePackedMsg, end) && + push16(phy->more_than_5_ca_support, ppWritePackedMsg, end) && + push16(phy->laa_supported, ppWritePackedMsg, end) && + push16(phy->laa_ending_in_dwpts_supported, ppWritePackedMsg, end) && + push16(phy->laa_starting_in_second_slot_supported, ppWritePackedMsg, end) && + push16(phy->beamforming_supported, ppWritePackedMsg, end) && + push16(phy->csi_rs_enhancement_supported, ppWritePackedMsg, end) && + push16(phy->drms_enhancement_supported, ppWritePackedMsg, end) && + push16(phy->srs_enhancement_supported, ppWritePackedMsg, end) ); +} + +static uint8_t pack_pnf_phy_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel13_t* value = (nfapi_pnf_phy_rel13_t*)tlv; + + return (push16(value->number_of_phys, ppWritePackedMsg, end) && + packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_info)); +} + +static uint8_t pack_pnf_phy_rel13_nb_iot_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel13_nb_iot_info_t* phy = (nfapi_pnf_phy_rel13_nb_iot_info_t*)elem; + + return( push16(phy->phy_config_index, ppWritePackedMsg, end) && + push16(phy->number_of_rfs, ppWritePackedMsg, end) && + packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) && + push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) && + packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) && + push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) && + push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) && + push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) && + push8(phy->nmm_modes_supported, ppWritePackedMsg, end)); +} + +static uint8_t pack_pnf_phy_rel13_nb_iot_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel13_nb_iot_t* value = (nfapi_pnf_phy_rel13_nb_iot_t*)tlv; + + return (push16(value->number_of_phys, ppWritePackedMsg, end) && + packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_info)); +} + + +static uint8_t pack_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t*)msg; + + return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) && + pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) && + pack_tlv(NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, ppWritePackedMsg, end, &pack_pnf_rf_value) && + pack_tlv(NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, ppWritePackedMsg, end, &pack_pnf_phy_rel10_value) && + pack_tlv(NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, ppWritePackedMsg, end, &pack_pnf_phy_rel11_value) && + pack_tlv(NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, ppWritePackedMsg, end, &pack_pnf_phy_rel12_value) && + pack_tlv(NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, ppWritePackedMsg, end, &pack_pnf_phy_rel13_value) && + pack_tlv(NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_phy_rf_config_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_phy_rf_config_info_t* rf = (nfapi_phy_rf_config_info_t*)elem; + + return (push16(rf->phy_id, ppWritePackedMsg, end) && + push16(rf->phy_config_index, ppWritePackedMsg, end) && + push16(rf->rf_config_index, ppWritePackedMsg, end)); +} + + +static uint8_t pack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t*)tlv; + + return(push16(value->number_phy_rf_config_info, ppWritePackedMsg, end) && + packarray(value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, ppWritePackedMsg, end, &pack_phy_rf_config_info)); + +} + +static uint8_t pack_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t*)msg; + return ( pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end , config)); +} + + +static uint8_t pack_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t*)msg; + + return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t*)msg; + return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t*)msg; + + return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t*)msg; + return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) ); +} + +static uint8_t pack_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t*)msg; + + return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t*)msg; + return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_uint16_tlv_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_uint16_tlv_t* value = (nfapi_uint16_tlv_t*)tlv; + return push16(value->value, ppWritePackedMsg, end); +} + +static uint8_t unpack_uint16_tlv_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_uint16_tlv_t* value = (nfapi_uint16_tlv_t*)tlv; + return pull16(ppReadPackedMsg, &value->value, end); +} +static uint8_t pack_int16_tlv_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_int16_tlv_t* value = (nfapi_int16_tlv_t*)tlv; + return pushs16(value->value, ppWritePackedMsg, end); +} + +static uint8_t unpack_int16_tlv_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_int16_tlv_t* value = (nfapi_int16_tlv_t*)tlv; + return pulls16(ppReadPackedMsg, &value->value, end); +} + +static uint8_t pack_uint8_tlv_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_uint8_tlv_t* value = (nfapi_uint8_tlv_t*)tlv; + return push8(value->value, ppWritePackedMsg, end); +} +static uint8_t unpack_uint8_tlv_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_uint8_tlv_t* value = (nfapi_uint8_tlv_t*)tlv; + return pull8(ppReadPackedMsg, &value->value, end); +} + +static uint8_t pack_ipv4_address_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ipv4_address_t* value = (nfapi_ipv4_address_t*)tlv; + return pusharray8(value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, ppWritePackedMsg, end); +} +static uint8_t unpack_ipv4_address_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ipv4_address_t* value = (nfapi_ipv4_address_t*)tlv; + return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, end); +} +static uint8_t pack_ipv6_address_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ipv6_address_t* value = (nfapi_ipv6_address_t*)tlv; + return pusharray8(value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, ppWritePackedMsg, end); +} +static uint8_t unpack_ipv6_address_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ipv4_address_t* value = (nfapi_ipv4_address_t*)tlv; + return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, end); +} + +static uint8_t pack_rf_bands_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_rf_bands_t* value = (nfapi_rf_bands_t*)tlv; + + return ( push16(value->number_rf_bands, ppWritePackedMsg, end) && + pusharray16(value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, ppWritePackedMsg, end)); +} +static uint8_t unpack_rf_bands_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t* end) +{ + nfapi_rf_bands_t* value = (nfapi_rf_bands_t*)tlv; + + return ( pull16(ppReadPackedMsg, &value->number_rf_bands, end) && + pullarray16(ppReadPackedMsg, value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, end)); +} + +static uint8_t pack_nmm_frequency_bands_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nmm_frequency_bands_t* value = (nfapi_nmm_frequency_bands_t*)tlv; + + return( push16(value->number_of_rf_bands, ppWritePackedMsg, end) && + pusharray16(value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, ppWritePackedMsg, end)); +} +static uint8_t unpack_nmm_frequency_bands_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_nmm_frequency_bands_t* value = (nfapi_nmm_frequency_bands_t*)tlv; + + return ( pull16(ppReadPackedMsg, &value->number_of_rf_bands, end) && + pullarray16(ppReadPackedMsg, value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, end)); +} + +static uint8_t pack_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t*)msg; + + return( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) && + push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) && + pack_tlv(NFAPI_L1_STATUS_PHY_STATE_TAG, &pNfapiMsg->l1_status.phy_state, ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + // Do we check the phy state and then just fill those sepecified, however + // we do not know the duplex mode, so just attempt to pack all and assumme + // that the callee has set the right tlvs + + pack_tlv(NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.phy_antenna_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.mbsfn_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + // laa capability + + pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value)&& + pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end ,&pack_uint16_tlv_value) && + + pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) && + pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) && + + pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) && + pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) && + + pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + + pack_tlv(NFAPI_NFAPI_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) && + + pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + + pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + + pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) && + pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) && + pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) && + pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) ); + +} + +static uint8_t pack_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t*)msg; + + return ( push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) && + + // Do we check the phy state and then just fill those sepecified, however + // we do not know the duplex mode, so just attempt to pack all and assumme + // that the callee has set the right tlvs + + pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_pdsch), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &(pNfapiMsg->laa_config.pd_threshold), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &(pNfapiMsg->laa_config.multi_carrier_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &(pNfapiMsg->laa_config.multi_carrier_tx), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &(pNfapiMsg->laa_config.multi_carrier_freeze), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_antenna_ports_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_power_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &(pNfapiMsg->emtc_config.pbch_repetitions_enable_r13), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_catm_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &(pNfapiMsg->emtc_config.prach_catm_high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + + pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) && + pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) && + pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) && + pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) && + pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + + pack_tlv(NFAPI_PHY_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) && + + pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + + pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + + + pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) && + pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) && + pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) && + pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) && + + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) ); +} + +static uint8_t pack_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t*)msg; + + return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) ); +} + +static uint8_t pack_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_start_request_t *pNfapiMsg = (nfapi_start_request_t*)msg; + return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config); +} + +static uint8_t pack_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t*)msg; + + return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) ); +} + +static uint8_t pack_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t*)msg; + return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config); +} + +static uint8_t pack_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t*)msg; + + return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) ); +} + +static uint8_t pack_measurement_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t*)msg; + + return( pack_tlv(NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &(pNfapiMsg->dl_rs_tx_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &(pNfapiMsg->received_interference_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_tlv(NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &(pNfapiMsg->thermal_noise_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_recevied_interference_power_measurement_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_received_interference_power_measurement_t* value = (nfapi_received_interference_power_measurement_t*)tlv; + + return ( push16(value->number_of_resource_blocks, ppWritePackedMsg, end) && + pusharrays16(value->received_interference_power, NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, ppWritePackedMsg, end)); +} + +static uint8_t pack_measurement_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t*)msg; + + return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && + pack_tlv(NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &(pNfapiMsg->dl_rs_tx_power_measurement), ppWritePackedMsg, end, &pack_int16_tlv_value) && + pack_tlv(NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &(pNfapiMsg->received_interference_power_measurement), ppWritePackedMsg, end, &pack_recevied_interference_power_measurement_value) && + pack_tlv(NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &(pNfapiMsg->thermal_noise_power_measurement), ppWritePackedMsg, end, &pack_uint16_tlv_value) && + pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + uint8_t result = 0; + // look for the specific message + switch (header->message_id) + { + case NFAPI_PNF_PARAM_REQUEST: + result = pack_pnf_param_request(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_PNF_PARAM_RESPONSE: + result = pack_pnf_param_response(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_PNF_CONFIG_REQUEST: + result = pack_pnf_config_request(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_PNF_CONFIG_RESPONSE: + result = pack_pnf_config_response(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_PNF_START_REQUEST: + result = pack_pnf_start_request(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_PNF_START_RESPONSE: + result = pack_pnf_start_response(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_PNF_STOP_REQUEST: + result = pack_pnf_stop_request(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_PNF_STOP_RESPONSE: + result = pack_pnf_stop_response(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_PARAM_REQUEST: + result = pack_param_request(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_PARAM_RESPONSE: + result = pack_param_response(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_CONFIG_REQUEST: + result = pack_config_request(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_CONFIG_RESPONSE: + result = pack_config_response(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_START_REQUEST: + result = pack_start_request(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_START_RESPONSE: + result = pack_start_response(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_STOP_REQUEST: + result = pack_stop_request(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_STOP_RESPONSE: + result = pack_stop_response(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_MEASUREMENT_REQUEST: + result = pack_measurement_request(header, ppWritePackedMsg, end, config); + break; + + case NFAPI_MEASUREMENT_RESPONSE: + result = pack_measurement_response(header, ppWritePackedMsg, end, config); + break; + + default: + { + if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && + header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) + { + if(config && config->pack_p4_p5_vendor_extension) + { + result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id); + } + } + break; + } + + return result; +} + + +// helper function for message length calculation - +// takes the pointers to the start of message to end of message + +static uint32_t get_packed_msg_len(uintptr_t msgHead, uintptr_t msgEnd) +{ + if (msgEnd < msgHead) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "get_packed_msg_len: Error in pointers supplied %d, %d\n", msgHead, msgEnd); + return 0; + } + + return (msgEnd - msgHead); +} + +// Main pack function - public + +int nfapi_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf; + uint8_t *pWritePackedMessage = pPackedBuf; + uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen; + uint8_t *pPackedLengthField = &pWritePackedMessage[4]; + uint32_t packedMsgLen; + uint16_t packedMsgLen16; + + if (pMessageBuf == NULL || pPackedBuf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n"); + return -1; + } + + // pack the message + if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) && + push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) && + push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, pPackMessageEnd) && + push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) && + pack_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config)) + { + // check for a valid message length + packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage); + if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen); + return -1; + } + else + { + packedMsgLen16 = (uint16_t)packedMsgLen; + } + + // Update the message length in the header + if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd)) + return -1; + + // return the packed length + return (packedMsgLen); + } + else + { + // Failed to pack the meassage + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n"); + return -1; + } + +} + + + +// Unpack routines +static uint8_t unpack_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_param_request_t *pNfapiMsg = (nfapi_pnf_param_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_pnf_param_general_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_param_general_t* value = (nfapi_pnf_param_general_t*)tlv; + + return( pull8(ppReadPackedMsg, &value->nfapi_sync_mode, end) && + pull8(ppReadPackedMsg, &value->location_mode, end) && + pull16(ppReadPackedMsg, &value->location_coordinates_length, end) && + pullarray8(ppReadPackedMsg, value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, end) && + pull32(ppReadPackedMsg, &value->dl_config_timing, end) && + pull32(ppReadPackedMsg, &value->tx_timing, end) && + pull32(ppReadPackedMsg, &value->ul_config_timing, end) && + pull32(ppReadPackedMsg, &value->hi_dci0_timing, end) && + pull16(ppReadPackedMsg, &value->maximum_number_phys, end) && + pull16(ppReadPackedMsg, &value->maximum_total_bandwidth, end) && + pull8(ppReadPackedMsg, &value->maximum_total_number_dl_layers, end) && + pull8(ppReadPackedMsg, &value->maximum_total_number_ul_layers, end) && + pull8(ppReadPackedMsg, &value->shared_bands, end) && + pull8(ppReadPackedMsg, &value->shared_pa, end) && + pulls16(ppReadPackedMsg, &value->maximum_total_power, end) && + pullarray8(ppReadPackedMsg, value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, end)); +} + +static uint8_t unpack_rf_config_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_rf_config_info_t* info = (nfapi_rf_config_info_t*)elem; + return pull16(ppReadPackedMsg, &info->rf_config_index, end); +} + +static uint8_t unpack_pnf_phy_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_info_t* phy = (nfapi_pnf_phy_info_t*)elem; + + return ( pull16(ppReadPackedMsg, &phy->phy_config_index, end) && + pull16(ppReadPackedMsg, &phy->number_of_rfs, end) && + unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) && + pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) && + unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) && + pull16(ppReadPackedMsg, &phy->downlink_channel_bandwidth_supported, end) && + pull16(ppReadPackedMsg, &phy->uplink_channel_bandwidth_supported, end) && + pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) && + pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) && + pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) && + pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end)); +} + + +static uint8_t unpack_pnf_phy_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_t* value = (nfapi_pnf_phy_t*)tlv; + return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) && + unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_info)); +} + +static uint8_t unpack_pnf_rf_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_rf_info_t* rf = (nfapi_pnf_rf_info_t*)elem; + + return( pull16(ppReadPackedMsg, &rf->rf_config_index, end) && + pull16(ppReadPackedMsg, &rf->band, end) && + pulls16(ppReadPackedMsg, &rf->maximum_transmit_power, end) && + pulls16(ppReadPackedMsg, &rf->minimum_transmit_power, end) && + pull8(ppReadPackedMsg, &rf->number_of_antennas_suppported, end) && + pull32(ppReadPackedMsg, &rf->minimum_downlink_frequency, end) && + pull32(ppReadPackedMsg, &rf->maximum_downlink_frequency, end) && + pull32(ppReadPackedMsg, &rf->minimum_uplink_frequency, end) && + pull32(ppReadPackedMsg, &rf->maximum_uplink_frequency, end)); + +} +static uint8_t unpack_pnf_rf_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_rf_t* value = (nfapi_pnf_rf_t*)tlv; + + return ( pull16(ppReadPackedMsg, &value->number_of_rfs, end) && + unpackarray(ppReadPackedMsg, value->rf, sizeof(nfapi_pnf_rf_info_t), NFAPI_MAX_PNF_RF, value->number_of_rfs, end, &unpack_pnf_rf_info)); +} + +static uint8_t unpack_pnf_phy_rel10_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel10_info_t* phy = (nfapi_pnf_phy_rel10_info_t*)elem; + + return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) && + pull16(ppReadPackedMsg, &phy->transmission_mode_7_supported, end) && + pull16(ppReadPackedMsg, &phy->transmission_mode_8_supported, end) && + pull16(ppReadPackedMsg, &phy->two_antenna_ports_for_pucch, end) && + pull16(ppReadPackedMsg, &phy->transmission_mode_9_supported, end) && + pull16(ppReadPackedMsg, &phy->simultaneous_pucch_pusch, end) && + pull16(ppReadPackedMsg, &phy->four_layer_tx_with_tm3_and_tm4, end)); + + +} +static uint8_t unpack_pnf_phy_rel10_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel10_t* value = (nfapi_pnf_phy_rel10_t*)tlv; + + return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) && + unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel10_info)); + +} + + +static uint8_t unpack_pnf_phy_rel11_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel11_info_t* phy = (nfapi_pnf_phy_rel11_info_t*)elem; + + return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) && + pull16(ppReadPackedMsg, &phy->edpcch_supported, end) && + pull16(ppReadPackedMsg, &phy->multi_ack_csi_reporting, end ) && + pull16(ppReadPackedMsg, &phy->pucch_tx_diversity, end) && + pull16(ppReadPackedMsg, &phy->ul_comp_supported, end) && + pull16(ppReadPackedMsg, &phy->transmission_mode_5_supported, end)); +} + +static uint8_t unpack_pnf_phy_rel11_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel11_t* value = (nfapi_pnf_phy_rel11_t*)tlv; + + return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) && + unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel11_info)); + +} + +static uint8_t unpack_phy_phy_rel12_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel12_info_t* phy = (nfapi_pnf_phy_rel12_info_t*)elem; + + return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) && + pull16(ppReadPackedMsg, &phy->csi_subframe_set, end) && + pull16(ppReadPackedMsg, &phy->enhanced_4tx_codebook, end) && + pull16(ppReadPackedMsg, &phy->drs_supported, end) && + pull16(ppReadPackedMsg, &phy->ul_64qam_supported, end) && + pull16(ppReadPackedMsg, &phy->transmission_mode_10_supported, end) && + pull16(ppReadPackedMsg, &phy->alternative_bts_indices, end)); +} + +static uint8_t unpack_pnf_phy_rel12_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel12_t* value = (nfapi_pnf_phy_rel12_t*)tlv; + + return (pull16(ppReadPackedMsg, &value->number_of_phys, end) && + unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel12_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_phy_phy_rel12_info)); + +} + +static uint8_t unpack_pnf_phy_rel13_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel13_info_t* phy = (nfapi_pnf_phy_rel13_info_t*)elem; + + return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) && + pull16(ppReadPackedMsg, &phy->pucch_format4_supported, end) && + pull16(ppReadPackedMsg, &phy->pucch_format5_supported, end) && + pull16(ppReadPackedMsg, &phy->more_than_5_ca_support, end) && + pull16(ppReadPackedMsg, &phy->laa_supported, end) && + pull16(ppReadPackedMsg, &phy->laa_ending_in_dwpts_supported, end) && + pull16(ppReadPackedMsg, &phy->laa_starting_in_second_slot_supported, end) && + pull16(ppReadPackedMsg, &phy->beamforming_supported, end) && + pull16(ppReadPackedMsg, &phy->csi_rs_enhancement_supported, end) && + pull16(ppReadPackedMsg, &phy->drms_enhancement_supported, end) && + pull16(ppReadPackedMsg, &phy->srs_enhancement_supported, end)); +} + +static uint8_t unpack_pnf_phy_rel13_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel13_t* value = (nfapi_pnf_phy_rel13_t*)tlv; + + return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) && + unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_info)); +} + +static uint8_t unpack_pnf_phy_rel13_nb_info_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel13_nb_iot_info_t* phy = (nfapi_pnf_phy_rel13_nb_iot_info_t*)elem; + + return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) && + pull16(ppReadPackedMsg, &phy->number_of_rfs, end) && + unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) && + pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) && + unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) && + pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) && + pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) && + pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) && + pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end)); +} + +static uint8_t unpack_pnf_phy_rel13_nb_iot_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rel13_nb_iot_t* value = (nfapi_pnf_phy_rel13_nb_iot_t*)tlv; + + return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) && + unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_nb_info_info)); +} + + + +static uint8_t unpack_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value}, + { NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value}, + { NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, &unpack_pnf_rf_value}, + { NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, &unpack_pnf_phy_rel10_value}, + { NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, &unpack_pnf_phy_rel11_value}, + { NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, &unpack_pnf_phy_rel12_value}, + { NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, &unpack_pnf_phy_rel13_value}, + { NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, &unpack_pnf_phy_rel13_nb_iot_value}, + }; + + return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_phy_rf_config_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_phy_rf_config_info_t* rf = (nfapi_phy_rf_config_info_t*)elem; + + return( pull16(ppReadPackedMsg, &rf->phy_id, end) && + pull16(ppReadPackedMsg, &rf->phy_config_index, end) && + pull16(ppReadPackedMsg, &rf->rf_config_index, end)); + +} + +static uint8_t unpack_pnf_phy_rf_config_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_pnf_phy_rf_config_t* value = (nfapi_pnf_phy_rf_config_t*)tlv; + + return ( pull16(ppReadPackedMsg, &value->number_phy_rf_config_info, end) && + unpackarray(ppReadPackedMsg, value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, end, &unpack_phy_rf_config_info)); +} + +static uint8_t unpack_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value}, + }; + + return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension); +} + +static uint8_t unpack_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension))); + +} + +static uint8_t unpack_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension))); +} + +static uint8_t unpack_pnf_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_pnf_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension))); + +} + +static uint8_t unpack_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_L1_STATUS_PHY_STATE_TAG, &pNfapiMsg->l1_status.phy_state, &unpack_uint16_tlv_value}, + + { NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_bandwidth_support, &unpack_uint16_tlv_value}, + { NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_bandwidth_support, &unpack_uint16_tlv_value}, + { NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_modulation_support, &unpack_uint16_tlv_value}, + { NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_modulation_support, &unpack_uint16_tlv_value}, + { NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.phy_antenna_capability, &unpack_uint16_tlv_value}, + { NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.release_capability, &unpack_uint16_tlv_value}, + { NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.mbsfn_capability, &unpack_uint16_tlv_value}, + + { NFAPI_LAA_CAPABILITY_LAA_SUPPORT_TAG, &pNfapiMsg->laa_capability.laa_support, &unpack_uint16_tlv_value}, + { NFAPI_LAA_CAPABILITY_PD_SENSING_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.pd_sensing_lbt_support, &unpack_uint16_tlv_value}, + { NFAPI_LAA_CAPABILITY_MULTI_CARRIER_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.multi_carrier_lbt_support, &unpack_uint16_tlv_value}, + { NFAPI_LAA_CAPABILITY_PARTIAL_SF_SUPPORT_TAG, &pNfapiMsg->laa_capability.partial_sf_support, &unpack_uint16_tlv_value}, + + { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value}, + { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value}, + { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value}, + { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value}, + { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value}, + + { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value}, + { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value}, + { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value}, + { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value}, + { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value}, + + { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value}, + { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value}, + { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value}, + + { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value}, + { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value}, + { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value}, + + { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value}, + { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value}, + { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value}, + { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value}, + { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value}, + + { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value}, + { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value}, + { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value}, + + { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value}, + { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value}, + { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value}, + { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value}, + + { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value}, + { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value}, + { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value}, + { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value}, + + { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value}, + { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value}, + { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value}, + + { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value}, + { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value}, + + { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value}, + { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value}, + + { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value}, + { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value}, + { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value}, + { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value}, + { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value}, + { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value}, + { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value}, + { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value}, + { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value}, + { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value}, + { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value}, + { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value}, + { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value}, + { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value}, + { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value}, + { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value}, + { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value}, + { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value}, + + }; + + return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); + +} + +static uint8_t unpack_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value}, + { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value}, + { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value}, + { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value}, + { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value}, + + { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value}, + { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value}, + { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value}, + { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value}, + { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value}, + + { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value}, + { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value}, + { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value}, + + { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value}, + { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value}, + { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value}, + + { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value}, + { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value}, + { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value}, + { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value}, + { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value}, + + { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value}, + { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value}, + { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value}, + + { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value}, + { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value}, + { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value}, + { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value}, + + { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value}, + { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value}, + { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value}, + { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value}, + + { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value}, + { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value}, + { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value}, + + + { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_pdsch, &unpack_uint16_tlv_value}, + { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_drs, &unpack_uint16_tlv_value}, + { NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &pNfapiMsg->laa_config.pd_threshold, &unpack_uint16_tlv_value}, + { NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &pNfapiMsg->laa_config.multi_carrier_type, &unpack_uint16_tlv_value}, + { NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &pNfapiMsg->laa_config.multi_carrier_tx, &unpack_uint16_tlv_value}, + { NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &pNfapiMsg->laa_config.multi_carrier_freeze, &unpack_uint16_tlv_value}, + { NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_antenna_ports_drs, &unpack_uint16_tlv_value}, + { NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_power_drs, &unpack_uint16_tlv_value}, + + { NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &pNfapiMsg->emtc_config.pbch_repetitions_enable_r13, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->emtc_config.prach_catm_root_sequence_index, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &pNfapiMsg->emtc_config.prach_catm_high_speed_flag, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_enable, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_enable, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_enable, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_enable, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea, &unpack_uint16_tlv_value}, + { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb, &unpack_uint16_tlv_value}, + + { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value}, + { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value}, + + { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value}, + { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value}, + + { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value}, + { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value}, + { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value}, + { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value}, + { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value}, + { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value}, + { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value}, + { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value}, + { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value}, + { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value}, + { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value}, + { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value}, + { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value}, + { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value}, + { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value}, + { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value}, + { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value}, + { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value}, + + }; + + return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); + +} + +static uint8_t unpack_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension))); +} + +static uint8_t unpack_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_start_request_t *pNfapiMsg = (nfapi_start_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension))); + +} + +static uint8_t unpack_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + }; + + return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension))); + +} +static uint8_t unpack_measurement_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &pNfapiMsg->dl_rs_tx_power, &unpack_uint16_tlv_value}, + { NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &pNfapiMsg->received_interference_power, &unpack_uint16_tlv_value}, + { NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &pNfapiMsg->thermal_noise_power, &unpack_uint16_tlv_value}, + }; + + return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)); + +} + +static uint8_t unpack_received_interference_power_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_received_interference_power_measurement_t* value = (nfapi_received_interference_power_measurement_t*)tlv; + + return ( pull16(ppReadPackedMsg, &value->number_of_resource_blocks, end) && + pullarrays16(ppReadPackedMsg, value->received_interference_power, NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, end)); +} + + +static uint8_t unpack_measurement_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t*)msg; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &pNfapiMsg->dl_rs_tx_power_measurement, &unpack_int16_tlv_value}, + { NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &pNfapiMsg->received_interference_power_measurement, &unpack_received_interference_power_measurement_value}, + { NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &pNfapiMsg->thermal_noise_power_measurement, &unpack_int16_tlv_value}, + }; + + return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); + +} + +// unpack length check + +static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) +{ + int retLen = 0; + + switch (msgId) + { + case NFAPI_PNF_PARAM_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t)) + retLen = sizeof(nfapi_pnf_param_request_t); + break; + + case NFAPI_PNF_PARAM_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_pnf_param_response_t)) + retLen = sizeof(nfapi_pnf_param_response_t); + break; + + case NFAPI_PNF_CONFIG_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_pnf_config_request_t)) + retLen = sizeof(nfapi_pnf_config_request_t); + break; + + case NFAPI_PNF_CONFIG_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_pnf_config_response_t)) + retLen = sizeof(nfapi_pnf_config_response_t); + break; + + case NFAPI_PNF_START_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_pnf_start_request_t)) + retLen = sizeof(nfapi_pnf_start_request_t); + break; + + case NFAPI_PNF_START_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_pnf_start_response_t)) + retLen = sizeof(nfapi_pnf_start_response_t); + break; + + case NFAPI_PNF_STOP_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_pnf_stop_request_t)) + retLen = sizeof(nfapi_pnf_stop_request_t); + break; + + case NFAPI_PNF_STOP_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_pnf_stop_response_t)) + retLen = sizeof(nfapi_pnf_stop_response_t); + break; + + case NFAPI_PARAM_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_param_request_t)) + retLen = sizeof(nfapi_param_request_t); + break; + + case NFAPI_PARAM_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_param_response_t)) + retLen = sizeof(nfapi_param_response_t); + break; + + case NFAPI_CONFIG_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_config_request_t)) + retLen = sizeof(nfapi_config_request_t); + break; + + case NFAPI_CONFIG_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_config_response_t)) + retLen = sizeof(nfapi_config_response_t); + break; + + case NFAPI_START_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_start_request_t)) + retLen = sizeof(nfapi_start_request_t); + break; + + case NFAPI_START_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_start_response_t)) + retLen = sizeof(nfapi_start_response_t); + break; + + case NFAPI_STOP_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_stop_request_t)) + retLen = sizeof(nfapi_stop_request_t); + break; + + case NFAPI_STOP_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_stop_response_t)) + retLen = sizeof(nfapi_stop_response_t); + break; + + case NFAPI_MEASUREMENT_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_measurement_request_t)) + retLen = sizeof(nfapi_measurement_request_t); + break; + + case NFAPI_MEASUREMENT_RESPONSE: + if (unpackedBufLen >= sizeof(nfapi_measurement_response_t)) + retLen = sizeof(nfapi_measurement_response_t); + break; + + default: + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId); + break; + } + + return retLen; +} + + +// Main unpack functions - public + +int nfapi_p5_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf; + uint8_t *pReadPackedMessage = pMessageBuf; + uint8_t *end = pMessageBuf + messageBufLen; + + if (pMessageBuf == NULL || pUnpackedBuf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied pointers are null\n"); + return -1; + } + + if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen); + return -1; + } + + // process the header + return ( pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) && + pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) && + pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) && + pull16(&pReadPackedMessage, &pMessageHeader->spare, end) ); + +} + +int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config) +{ + nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf; + uint8_t *pReadPackedMessage = pMessageBuf; + uint8_t *end = pMessageBuf + messageBufLen; + + if (pMessageBuf == NULL || pUnpackedBuf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n"); + return -1; + } + + if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen); + return -1; + } + + // clean the supplied buffer for - tag value blanking + (void)memset(pUnpackedBuf, 0, unpackedBufLen); + + // process the header + if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) && + pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) && + pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) && + pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) + { + // failed to read the header + return -1; + } + + int result = -1; + + + if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) + { + // the unpack buffer is not big enough for the struct + return -1; + } + + // look for the specific message + switch (pMessageHeader->message_id) + { + case NFAPI_PNF_PARAM_REQUEST: + result = unpack_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_PNF_PARAM_RESPONSE: + result = unpack_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_PNF_CONFIG_REQUEST: + result = unpack_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_PNF_CONFIG_RESPONSE: + result = unpack_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_PNF_START_REQUEST: + result = unpack_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_PNF_START_RESPONSE: + result = unpack_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_PNF_STOP_REQUEST: + result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_PNF_STOP_RESPONSE: + result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_PARAM_REQUEST: + result = unpack_param_request(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_PARAM_RESPONSE: + result = unpack_param_response(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_CONFIG_REQUEST: + result = unpack_config_request(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_CONFIG_RESPONSE: + result = unpack_config_response(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_START_REQUEST: + result = unpack_start_request(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_START_RESPONSE: + result = unpack_start_response(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_STOP_REQUEST: + result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_STOP_RESPONSE: + result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_MEASUREMENT_REQUEST: + result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config); + break; + + case NFAPI_MEASUREMENT_RESPONSE: + result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config); + break; + + default: + if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && + pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) + { + if(config && config->unpack_p4_p5_vendor_extension) + { + result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id); + } + break; + } + + return result; +} + diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c new file mode 100644 index 0000000000..3754fe379f --- /dev/null +++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c @@ -0,0 +1,6185 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +extern int nfapi_unpack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t **ppReadPackedMsg, void* user_data); +extern int nfapi_pack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t **ppWritePackedMsg, void* user_data); + +uint32_t nfapi_calculate_checksum(uint8_t* buffer, uint16_t len) +{ + uint32_t chksum = 0; + // calcaulte upto the checksum + chksum = crc32(chksum, buffer, 8); + + // skip the checksum + uint8_t zeros[4] = {0, 0, 0, 0}; + chksum = crc32(chksum, zeros, 4); + + // continu with the rest of the mesage + chksum = crc32(chksum, &buffer[NFAPI_P7_HEADER_LENGTH], len - NFAPI_P7_HEADER_LENGTH); + + // return the inverse + return ~(chksum); +} + +int nfapi_p7_update_checksum(uint8_t* buffer, uint32_t len) +{ + uint32_t checksum = nfapi_calculate_checksum(buffer, len); + + uint8_t* p_write = &buffer[8]; + return (push32(checksum, &p_write, buffer + len) > 0 ? 0 : -1); +} + +int nfapi_p7_update_transmit_timestamp(uint8_t* buffer, uint32_t timestamp) +{ + uint8_t* p_write = &buffer[12]; + return (push32(timestamp, &p_write, buffer + 16) > 0 ? 0 : -1); +} + +uint32_t nfapi_p7_calculate_checksum(uint8_t* buffer, uint32_t len) +{ + return nfapi_calculate_checksum(buffer, len); +} + +void* nfapi_p7_allocate(size_t size, nfapi_p7_codec_config_t* config) +{ + if(size == 0) + return 0; + + if(config && config->allocate) + { + return (config->allocate)(size); + } + else + { + return calloc(1, size); + } +} + +void nfapi_p7_deallocate(void* ptr, nfapi_p7_codec_config_t* config) +{ + if(ptr == NULL) + return; + + if(config && config->deallocate) + { + return (config->deallocate)(ptr); + } + else + { + return free(ptr); + } +} +// Pack routines + + +static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel8_t* value = (nfapi_dl_config_dci_dl_pdu_rel8_t*)tlv; + + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci_format:%u\n", __FUNCTION__, value->dci_format); + + return ( push8(value->dci_format, ppWritePackedMsg, end) && + push8(value->cce_idx, ppWritePackedMsg, end) && + push8(value->aggregation_level, ppWritePackedMsg, end) && + push16(value->rnti, ppWritePackedMsg, end) && + push8(value->resource_allocation_type, ppWritePackedMsg, end) && + push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) && + push32(value->resource_block_coding, ppWritePackedMsg, end) && + push8(value->mcs_1, ppWritePackedMsg, end) && + push8(value->redundancy_version_1, ppWritePackedMsg, end) && + push8(value->new_data_indicator_1, ppWritePackedMsg, end) && + push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) && + push8(value->mcs_2, ppWritePackedMsg, end) && + push8(value->redundancy_version_2, ppWritePackedMsg, end) && + push8(value->new_data_indicator_2, ppWritePackedMsg, end) && + push8(value->harq_process, ppWritePackedMsg, end) && + push8(value->tpmi, ppWritePackedMsg, end) && + push8(value->pmi, ppWritePackedMsg, end) && + push8(value->precoding_information, ppWritePackedMsg, end) && + push8(value->tpc, ppWritePackedMsg, end) && + push8(value->downlink_assignment_index, ppWritePackedMsg, end) && + push8(value->ngap, ppWritePackedMsg, end) && + push8(value->transport_block_size_index, ppWritePackedMsg, end) && + push8(value->downlink_power_offset, ppWritePackedMsg, end) && + push8(value->allocate_prach_flag, ppWritePackedMsg, end) && + push8(value->preamble_index, ppWritePackedMsg, end) && + push8(value->prach_mask_index, ppWritePackedMsg, end) && + push8(value->rnti_type, ppWritePackedMsg, end) && + push16(value->transmission_power, ppWritePackedMsg, end)); +} + +static uint8_t pack_dl_config_dci_dl_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel9_t* value = (nfapi_dl_config_dci_dl_pdu_rel9_t*)tlv; + + return( push8(value->mcch_flag, ppWritePackedMsg, end) && + push8(value->mcch_change_notification, ppWritePackedMsg, end) && + push8(value->scrambling_identity, ppWritePackedMsg, end)); +} + +static uint8_t pack_dl_config_dci_dl_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel10_t* value = (nfapi_dl_config_dci_dl_pdu_rel10_t*)tlv; + + return ( push8(value->cross_carrier_scheduling_flag, ppWritePackedMsg, end) && + push8(value->carrier_indicator, ppWritePackedMsg, end) && + push8(value->srs_flag, ppWritePackedMsg, end) && + push8(value->srs_request, ppWritePackedMsg, end) && + push8(value->antenna_ports_scrambling_and_layers, ppWritePackedMsg, end) && + push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) && + push8(value->n_dl_rb, ppWritePackedMsg, end)); +} + +static uint8_t pack_dl_config_dci_dl_pdu_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel11_t* value = (nfapi_dl_config_dci_dl_pdu_rel11_t*)tlv; + + return ( push8(value->harq_ack_resource_offset, ppWritePackedMsg, end) && + push8(value->pdsch_re_mapping_quasi_co_location_indicator, ppWritePackedMsg, end)); +} + +static uint8_t pack_dl_config_dci_dl_pdu_rel12_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel12_t* value = (nfapi_dl_config_dci_dl_pdu_rel12_t*)tlv; + + return ( push8(value->primary_cell_type, ppWritePackedMsg, end) && + push8(value->ul_dl_configuration_flag, ppWritePackedMsg, end) && + push8(value->number_ul_dl_configurations, ppWritePackedMsg, end) && + pusharray8(value->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, value->number_ul_dl_configurations, ppWritePackedMsg, end)); +} + +static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t* value, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + if (!( push8(value->num_prb_per_subband, ppWritePackedMsg, end) && + push8(value->number_of_subbands, ppWritePackedMsg, end) && + push8(value->num_antennas, ppWritePackedMsg, end))) + return 0; + + uint8_t idx = 0; + for(idx = 0; idx < value->number_of_subbands; ++idx) + { + nfapi_dl_config_dci_dl_tpm_subband_info_t* subband_info = &(value->subband_info[idx]); + + if(!(push8(subband_info->subband_index, ppWritePackedMsg, end) && + push8(subband_info->scheduled_ues, ppWritePackedMsg, end))) + return 0; + + + uint8_t antenna_idx = 0; + uint8_t scheduled_ue_idx = 0; + + for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) + { + for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) + { + if(!push16(subband_info->precoding_value[antenna_idx][scheduled_ue_idx], ppWritePackedMsg, end)) + return 0; + } + } + + } + + + return 1; + +} + +static uint8_t pack_dl_config_dci_dl_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel13_t* value = (nfapi_dl_config_dci_dl_pdu_rel13_t*)tlv; + + return( push8(value->laa_end_partial_sf_flag, ppWritePackedMsg, end) && + push8(value->laa_end_partial_sf_configuration, ppWritePackedMsg, end) && + push8(value->initial_lbt_sf, ppWritePackedMsg, end) && + push8(value->codebook_size_determination, ppWritePackedMsg, end) && + push8(value->drms_table_flag, ppWritePackedMsg, end) && + push8(value->tpm_struct_flag, ppWritePackedMsg, end) && + (value->tpm_struct_flag == 1 ? pack_tpm_value(&(value->tpm), ppWritePackedMsg, end) : 1)); +} + +static uint8_t pack_dl_config_bch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_bch_pdu_rel8_t* value = (nfapi_dl_config_bch_pdu_rel8_t*)tlv; + + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s()\n", __FUNCTION__); + + return( push16(value->length, ppWritePackedMsg, end) && + push16(value->pdu_index, ppWritePackedMsg, end) && + push16(value->transmission_power, ppWritePackedMsg, end)); +} +static uint8_t pack_dl_config_mch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_mch_pdu_rel8_t* value = (nfapi_dl_config_mch_pdu_rel8_t*)tlv; + + return ( push16(value->length, ppWritePackedMsg, end) && + push16(value->pdu_index, ppWritePackedMsg, end) && + push16(value->rnti, ppWritePackedMsg, end) && + push8(value->resource_allocation_type, ppWritePackedMsg, end) && + push32(value->resource_block_coding, ppWritePackedMsg, end) && + push8(value->modulation, ppWritePackedMsg, end) && + push16(value->transmission_power, ppWritePackedMsg, end) && + push16(value->mbsfn_area_id, ppWritePackedMsg, end)); +} + +static uint8_t pack_bf_vector_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_bf_vector_t* bf = (nfapi_bf_vector_t*)elem; + + return ( push8(bf->subband_index, ppWritePackedMsg, end) && + push8(bf->num_antennas, ppWritePackedMsg, end) && + pusharray16(bf->bf_value, NFAPI_MAX_NUM_ANTENNAS, bf->num_antennas, ppWritePackedMsg, end)); + + +} +static uint8_t pack_dl_config_dlsch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel8_t* value = (nfapi_dl_config_dlsch_pdu_rel8_t*)tlv; + + return ( push16(value->length, ppWritePackedMsg, end) && + push16(value->pdu_index, ppWritePackedMsg, end) && + push16(value->rnti, ppWritePackedMsg, end) && + push8(value->resource_allocation_type, ppWritePackedMsg, end) && + push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) && + push32(value->resource_block_coding, ppWritePackedMsg, end) && + push8(value->modulation, ppWritePackedMsg, end) && + push8(value->redundancy_version, ppWritePackedMsg, end) && + push8(value->transport_blocks, ppWritePackedMsg, end) && + push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) && + push8(value->transmission_scheme, ppWritePackedMsg, end) && + push8(value->number_of_layers, ppWritePackedMsg, end) && + push8(value->number_of_subbands, ppWritePackedMsg, end) && + pusharray8(value->codebook_index, NFAPI_MAX_NUM_SUBBANDS, value->number_of_subbands, ppWritePackedMsg, end) && + push8(value->ue_category_capacity, ppWritePackedMsg, end) && + push8(value->pa, ppWritePackedMsg, end) && + push8(value->delta_power_offset_index, ppWritePackedMsg, end) && + push8(value->ngap, ppWritePackedMsg, end) && + push8(value->nprb, ppWritePackedMsg, end) && + push8(value->transmission_mode, ppWritePackedMsg, end) && + push8(value->num_bf_prb_per_subband, ppWritePackedMsg, end) && + push8(value->num_bf_vector, ppWritePackedMsg, end) && + packarray(value->bf_vector, sizeof(nfapi_bf_vector_t), NFAPI_MAX_BF_VECTORS, value->num_bf_vector, ppWritePackedMsg, end, &pack_bf_vector_info)); + +} +static uint8_t pack_dl_config_dlsch_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel9_t* value = (nfapi_dl_config_dlsch_pdu_rel9_t*)tlv; + return ( push8(value->nscid, ppWritePackedMsg, end) ); +} +static uint8_t pack_dl_config_dlsch_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel10_t* value = (nfapi_dl_config_dlsch_pdu_rel10_t*)tlv; + + return ( push8(value->csi_rs_flag, ppWritePackedMsg, end) && + push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) && + push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) && + push8(value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) && + pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) && + push8(value->pdsch_start, ppWritePackedMsg, end)); +} +static uint8_t pack_dl_config_dlsch_pdu_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel11_t* value = (nfapi_dl_config_dlsch_pdu_rel11_t*)tlv; + + return( push8(value->drms_config_flag, ppWritePackedMsg, end) && + push16(value->drms_scrambling, ppWritePackedMsg, end) && + push8(value->csi_config_flag, ppWritePackedMsg, end) && + push16(value->csi_scrambling, ppWritePackedMsg, end) && + push8(value->pdsch_re_mapping_flag, ppWritePackedMsg, end) && + push8(value->pdsch_re_mapping_atenna_ports, ppWritePackedMsg, end) && + push8(value->pdsch_re_mapping_freq_shift, ppWritePackedMsg, end)); +} +static uint8_t pack_dl_config_dlsch_pdu_rel12_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel12_t* value = (nfapi_dl_config_dlsch_pdu_rel12_t*)tlv; + + return( push8(value->altcqi_table_r12, ppWritePackedMsg, end) && + push8(value->maxlayers, ppWritePackedMsg, end) && + push8(value->n_dl_harq, ppWritePackedMsg, end)); +} +static uint8_t pack_dl_config_dlsch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel13_t* value = (nfapi_dl_config_dlsch_pdu_rel13_t*)tlv; + + return( push8(value->dwpts_symbols, ppWritePackedMsg, end) && + push8(value->initial_lbt_sf, ppWritePackedMsg, end) && + push8(value->ue_type, ppWritePackedMsg, end) && + push8(value->pdsch_payload_type, ppWritePackedMsg, end) && + push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) && + push8(value->drms_table_flag, ppWritePackedMsg, end)); +} +static uint8_t pack_dl_config_pch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_pch_pdu_rel8_t* value = (nfapi_dl_config_pch_pdu_rel8_t*)tlv; + + return( push16(value->length, ppWritePackedMsg, end) && + push16(value->pdu_index, ppWritePackedMsg, end) && + push16(value->p_rnti, ppWritePackedMsg, end) && + push8(value->resource_allocation_type, ppWritePackedMsg, end) && + push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) && + push32(value->resource_block_coding, ppWritePackedMsg, end) && + push8(value->mcs, ppWritePackedMsg, end) && + push8(value->redundancy_version, ppWritePackedMsg, end) && + push8(value->number_of_transport_blocks, ppWritePackedMsg, end) && + push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) && + push8(value->transmission_scheme, ppWritePackedMsg, end) && + push8(value->number_of_layers, ppWritePackedMsg, end) && + push8(value->codebook_index, ppWritePackedMsg, end) && + push8(value->ue_category_capacity, ppWritePackedMsg, end) && + push8(value->pa, ppWritePackedMsg, end) && + push16(value->transmission_power, ppWritePackedMsg, end) && + push8(value->nprb, ppWritePackedMsg, end) && + push8(value->ngap, ppWritePackedMsg, end)); +} +static uint8_t pack_dl_config_pch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_pch_pdu_rel13_t* value = (nfapi_dl_config_pch_pdu_rel13_t*)tlv; + + return ( push8(value->ue_mode, ppWritePackedMsg, end) && + push16(value->initial_transmission_sf_io, ppWritePackedMsg, end)); +} +static uint8_t pack_dl_config_prs_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_prs_pdu_rel9_t* value = (nfapi_dl_config_prs_pdu_rel9_t*)tlv; + + return( push16(value->transmission_power, ppWritePackedMsg, end) && + push8(value->prs_bandwidth, ppWritePackedMsg, end) && + push8(value->prs_cyclic_prefix_type, ppWritePackedMsg, end) && + push8(value->prs_muting, ppWritePackedMsg, end)); +} +static uint8_t pack_dl_config_csi_rs_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_csi_rs_pdu_rel10_t* value = (nfapi_dl_config_csi_rs_pdu_rel10_t*)tlv; + + return( push8(value->csi_rs_antenna_port_count_r10, ppWritePackedMsg, end) && + push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) && + push16(value->transmission_power, ppWritePackedMsg, end) && + push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) && + push8(value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end) && + pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end)); +} +static uint8_t pack_dl_config_csi_rs_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_csi_rs_pdu_rel13_t* value = (nfapi_dl_config_csi_rs_pdu_rel13_t*)tlv; + + if(!(push8(value->csi_rs_class, ppWritePackedMsg, end) && + push8(value->cdm_type, ppWritePackedMsg, end) && + push8(value->num_bf_vector, ppWritePackedMsg, end))) + { + return 0; + } + + uint16_t i; + for(i = 0; i < value->num_bf_vector; ++i) + { + if(!(push8(value->bf_vector[i].csi_rs_resource_index, ppWritePackedMsg, end) && + pusharray16(value->bf_vector[i].bf_value, NFAPI_MAX_ANTENNA_PORT_COUNT, NFAPI_MAX_ANTENNA_PORT_COUNT, ppWritePackedMsg, end))) + return 0; + } + + return 1; +} +static uint8_t pack_bf_vector(nfapi_bf_vector_t* vector, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return ( push8(vector->subband_index, ppWritePackedMsg, end) && + push8(vector->num_antennas, ppWritePackedMsg, end) && + pusharray16(vector->bf_value, NFAPI_MAX_NUM_ANTENNAS, vector->num_antennas, ppWritePackedMsg, end)); +} + +static uint8_t pack_dl_config_epdcch_parameters_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_epdcch_parameters_rel11_t* value = (nfapi_dl_config_epdcch_parameters_rel11_t*)tlv; + + return ( push8(value->epdcch_resource_assignment_flag, ppWritePackedMsg, end) && + push16(value->epdcch_id, ppWritePackedMsg, end) && + push8(value->epdcch_start_symbol, ppWritePackedMsg, end) && + push8(value->epdcch_num_prb, ppWritePackedMsg, end) && + pusharray8(value->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, value->epdcch_num_prb, ppWritePackedMsg, end) && + pack_bf_vector(&value->bf_vector, ppWritePackedMsg, end)); +} +static uint8_t pack_dl_config_epdcch_parameters_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_epdcch_parameters_rel13_t* value = (nfapi_dl_config_epdcch_parameters_rel13_t*)tlv; + + return (push8(value->dwpts_symbols, ppWritePackedMsg, end) && + push8(value->initial_lbt_sf, ppWritePackedMsg, end)); +} +static uint8_t pack_dl_config_mpdcch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_mpdcch_pdu_rel13_t* value = (nfapi_dl_config_mpdcch_pdu_rel13_t*)tlv; + + return ( push8(value->mpdcch_narrow_band, ppWritePackedMsg, end) && + push8(value->number_of_prb_pairs, ppWritePackedMsg, end) && + push8(value->resource_block_assignment, ppWritePackedMsg, end) && + push8(value->mpdcch_tansmission_type, ppWritePackedMsg, end) && + push8(value->start_symbol, ppWritePackedMsg, end) && + push8(value->ecce_index, ppWritePackedMsg, end) && + push8(value->aggregation_level, ppWritePackedMsg, end) && + push8(value->rnti_type, ppWritePackedMsg, end) && + push16(value->rnti, ppWritePackedMsg, end) && + push8(value->ce_mode, ppWritePackedMsg, end) && + push16(value->drms_scrambling_init, ppWritePackedMsg, end) && + push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) && + push16(value->transmission_power, ppWritePackedMsg, end) && + push8(value->dci_format, ppWritePackedMsg, end) && + push16(value->resource_block_coding, ppWritePackedMsg, end) && + push8(value->mcs, ppWritePackedMsg, end) && + push8(value->pdsch_reptition_levels, ppWritePackedMsg, end) && + push8(value->redundancy_version, ppWritePackedMsg, end) && + push8(value->new_data_indicator, ppWritePackedMsg, end) && + push8(value->harq_process, ppWritePackedMsg, end) && + push8(value->tpmi_length, ppWritePackedMsg, end) && + push8(value->tpmi, ppWritePackedMsg, end) && + push8(value->pmi_flag, ppWritePackedMsg, end) && + push8(value->pmi, ppWritePackedMsg, end) && + push8(value->harq_resource_offset, ppWritePackedMsg, end) && + push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) && + push8(value->tpc, ppWritePackedMsg, end) && + push8(value->downlink_assignment_index_length, ppWritePackedMsg, end) && + push8(value->downlink_assignment_index, ppWritePackedMsg, end) && + push8(value->allocate_prach_flag, ppWritePackedMsg, end) && + push8(value->preamble_index, ppWritePackedMsg, end) && + push8(value->prach_mask_index, ppWritePackedMsg, end) && + push8(value->starting_ce_level, ppWritePackedMsg, end) && + push8(value->srs_request, ppWritePackedMsg, end) && + push8(value->antenna_ports_and_scrambling_identity_flag, ppWritePackedMsg, end) && + push8(value->antenna_ports_and_scrambling_identity, ppWritePackedMsg, end) && + push8(value->frequency_hopping_enabled_flag, ppWritePackedMsg, end) && + push8(value->paging_direct_indication_differentiation_flag, ppWritePackedMsg, end) && + push8(value->direct_indication, ppWritePackedMsg, end) && + push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) && + push8(value->number_of_tx_antenna_ports, ppWritePackedMsg, end) && + pusharray16(value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, ppWritePackedMsg, end)); +} + + +static uint8_t pack_dl_config_nbch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_nbch_pdu_rel13_t* value = (nfapi_dl_config_nbch_pdu_rel13_t*)tlv; + + return (push16(value->length, ppWritePackedMsg, end) && + push16(value->pdu_index, ppWritePackedMsg, end) && + push16(value->transmission_power, ppWritePackedMsg, end) && + push16(value->hyper_sfn_2_lsbs, ppWritePackedMsg, end)); +} + + +static uint8_t pack_dl_config_npdcch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_npdcch_pdu_rel13_t* value = (nfapi_dl_config_npdcch_pdu_rel13_t*)tlv; + + return (push16(value->length, ppWritePackedMsg, end) && + push16(value->pdu_index, ppWritePackedMsg, end) && + push8(value->ncce_index, ppWritePackedMsg, end) && + push8(value->aggregation_level, ppWritePackedMsg, end) && + push8(value->start_symbol, ppWritePackedMsg, end) && + push8(value->rnti_type, ppWritePackedMsg, end) && + push16(value->rnti, ppWritePackedMsg, end) && + push8(value->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) && + push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) && + push8(value->dci_format, ppWritePackedMsg, end) && + push8(value->scheduling_delay, ppWritePackedMsg, end) && + push8(value->resource_assignment, ppWritePackedMsg, end) && + push8(value->repetition_number, ppWritePackedMsg, end) && + push8(value->mcs, ppWritePackedMsg, end) && + push8(value->new_data_indicator, ppWritePackedMsg, end) && + push8(value->harq_ack_resource, ppWritePackedMsg, end) && + push8(value->npdcch_order_indication, ppWritePackedMsg, end) && + push8(value->starting_number_of_nprach_repetitions, ppWritePackedMsg, end) && + push8(value->subcarrier_indication_of_nprach, ppWritePackedMsg, end) && + push8(value->paging_direct_indication_differentation_flag, ppWritePackedMsg, end) && + push8(value->direct_indication, ppWritePackedMsg, end) && + push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) && + push8(value->total_dci_length_including_padding, ppWritePackedMsg, end)); +} + +static uint8_t pack_dl_config_ndlsch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_ndlsch_pdu_rel13_t* value = (nfapi_dl_config_ndlsch_pdu_rel13_t*)tlv; + + return (push16(value->length, ppWritePackedMsg, end) && + push16(value->pdu_index, ppWritePackedMsg, end) && + push8(value->start_symbol, ppWritePackedMsg, end) && + push8(value->rnti_type, ppWritePackedMsg, end) && + push16(value->rnti, ppWritePackedMsg, end) && + push16(value->resource_assignment, ppWritePackedMsg, end) && + push16(value->repetition_number, ppWritePackedMsg, end) && + push8(value->modulation, ppWritePackedMsg, end) && + push8(value->number_of_subframes_for_resource_assignment, ppWritePackedMsg, end) && + push8(value->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) && + push16(value->sf_idx, ppWritePackedMsg, end) && + push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end)); +} + +static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_dl_config_request_body_t* value = (nfapi_dl_config_request_body_t*)tlv; + + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci:%u pdu:%u pdsch:%u rnti:%u pcfich:%u\n", __FUNCTION__, value->number_dci, value->number_pdu, value->number_pdsch_rnti, value->transmission_power_pcfich); + + if(!(push8(value->number_pdcch_ofdm_symbols, ppWritePackedMsg, end) && + push8(value->number_dci, ppWritePackedMsg, end) && + push16(value->number_pdu, ppWritePackedMsg, end) && + push8(value->number_pdsch_rnti, ppWritePackedMsg, end) && + push16(value->transmission_power_pcfich, ppWritePackedMsg, end))) + { + return 0; + } + + uint16_t i = 0; + uint16_t total_number_of_pdus = value->number_pdu; + for(; i < total_number_of_pdus; ++i) + { + nfapi_dl_config_request_pdu_t* pdu = &(value->dl_config_pdu_list[i]); + + if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0) + return 0; + + // Put a 0 size in and then determine the size after the pdu + // has been writen and write the calculated size + uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg; + pdu->pdu_size = 0; + if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0) + return 0; + + switch(pdu->pdu_type) + { + case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: + { + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE\n", __FUNCTION__); + + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value))) + { + return 0; + } + } + break; + case NFAPI_DL_CONFIG_BCH_PDU_TYPE: + { + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE\n", __FUNCTION__); + + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_bch_pdu_rel8_value))) + return 0; + } + break; + case NFAPI_DL_CONFIG_MCH_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_mch_pdu_rel8_value))) + return 0; + } + break; + case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel8_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel9_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel10_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel11_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel12_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel13_value))) + return 0; + } + break; + case NFAPI_DL_CONFIG_PCH_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel8_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel13_value))) + return 0; + } + break; + case NFAPI_DL_CONFIG_PRS_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_prs_pdu_rel9_value))) + return 0; + } + break; + case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_csi_rs_pdu_rel10_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_csi_rs_pdu_rel13_value))) + return 0; + } + break; + case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel11_value) & + pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel13_value))) + return 0; + } + break; + case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_mpdcch_pdu_rel13_value))) + return 0; + } + break; + case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_nbch_pdu_rel13_value))) + return 0; + } + break; + case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_npdcch_pdu_rel13_value))) + return 0; + } + break; + case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_ndlsch_pdu_rel13_value))) + return 0; + } + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type ); + } + break; + }; + + // add 1 for the pdu_type. The delta will include the pdu_size + pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize); + push8(pdu->pdu_size, &pWritePackedMsgPduSize, end); + } + + return 1; +} + +static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t*)msg; + + //return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + //pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) && + //pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); + { + uint8_t x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end); + uint8_t y = pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value); + uint8_t z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config); + + if (!x || !y || !z) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST x:%u y:%u z:%u \n", __FUNCTION__,x,y,z); + } + + return x && y && z; + } +} + +static uint8_t pack_ul_config_request_ulsch_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t * end) +{ + nfapi_ul_config_ulsch_pdu_rel8_t* ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t*)tlv; + + return( push32(ulsch_pdu_rel8->handle, ppWritePackedMsg, end) && + push16(ulsch_pdu_rel8->size, ppWritePackedMsg, end) && + push16(ulsch_pdu_rel8->rnti, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->resource_block_start, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->modulation_type, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->new_data_indication, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->redundancy_version, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->harq_process_number, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->ul_tx_mode, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->current_tx_nb, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel8->n_srs, ppWritePackedMsg, end)); +} +static uint8_t pack_ul_config_request_ulsch_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_ulsch_pdu_rel10_t* ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t*)tlv; + + return (push8(ulsch_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) && + push32(ulsch_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel10->transport_blocks, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel10->transmission_scheme, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel10->number_of_layers, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel10->codebook_index, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel10->disable_sequence_hopping_flag, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_ulsch_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_ulsch_pdu_rel11_t* ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t*)tlv; + + return (push8(ulsch_pdu_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) && + push16(ulsch_pdu_rel11->npusch_identity, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel11->dmrs_config_flag, ppWritePackedMsg, end) && + push16(ulsch_pdu_rel11->ndmrs_csh_identity, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_ulsch_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_ulsch_pdu_rel13_t* ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t*)tlv; + + return (push8(ulsch_pdu_rel13->ue_type, ppWritePackedMsg, end) && + push16(ulsch_pdu_rel13->total_number_of_repetitions, ppWritePackedMsg, end) && + push16(ulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) && + push16(ulsch_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) && + push8(ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_ulsch_pdu(nfapi_ul_config_ulsch_pdu* ulsch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &ulsch_pdu->ulsch_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel8_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &ulsch_pdu->ulsch_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel10_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &ulsch_pdu->ulsch_pdu_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel11_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &ulsch_pdu->ulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel13_value)); +} + +static uint8_t pack_ul_config_request_cqi_ri_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_ri_information_rel8_t* cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t*)tlv; + + return ( push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, ppWritePackedMsg, end) && + push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, ppWritePackedMsg, end) && + push8(cqi_ri_info_rel8->ri_size, ppWritePackedMsg, end) && + push8(cqi_ri_info_rel8->delta_offset_cqi, ppWritePackedMsg, end) && + push8(cqi_ri_info_rel8->delta_offset_ri, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_ri_information_rel9_t* cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t*)tlv; + + if(!(push8(cqi_ri_info_rel9->report_type, ppWritePackedMsg, end) && + push8(cqi_ri_info_rel9->delta_offset_cqi, ppWritePackedMsg, end) && + push8(cqi_ri_info_rel9->delta_offset_ri, ppWritePackedMsg, end))) + { + return 0; + } + + switch(cqi_ri_info_rel9->report_type) + { + case NFAPI_CSI_REPORT_TYPE_PERIODIC: + { + if(!(push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, ppWritePackedMsg, end) && + push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, ppWritePackedMsg, end))) + { + return 0; + } + } + break; + case NFAPI_CSI_REPORT_TYPE_APERIODIC: + { + if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, ppWritePackedMsg, end) == 0) + return 0; + + uint8_t i; + for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) + { + if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0) + return 0; + + uint8_t j; + for(j = 0; j < 8; ++j) + { + if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], ppWritePackedMsg, end) == 0) + return 0; + } + } + } + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type ); + } + break; + }; + + return 1; +} + +static uint8_t pack_ul_config_request_cqi_ri_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_ri_information_rel13_t* cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t*)tlv; + + switch(cqi_ri_info_rel13->report_type) + { + case NFAPI_CSI_REPORT_TYPE_PERIODIC: + { + if(push16(cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, ppWritePackedMsg, end) == 0) + return 0; + } + break; + case NFAPI_CSI_REPORT_TYPE_APERIODIC: + { + // No parameters + } + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel13->report_type ); + } + break; + }; + + return 1; +} + +static uint8_t pack_ul_config_request_cqi_ri_information(nfapi_ul_config_cqi_ri_information* cqi_ri_info, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return (pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &cqi_ri_info->cqi_ri_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel8_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &cqi_ri_info->cqi_ri_information_rel9, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel9_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &cqi_ri_info->cqi_ri_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel13_value)); + +} + +static uint8_t pack_ul_config_request_init_tx_params_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_initial_transmission_parameters_rel8_t* init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t*)tlv; + + return (push8(init_tx_params_rel8->n_srs_initial, ppWritePackedMsg, end) && + push8(init_tx_params_rel8->initial_number_of_resource_blocks, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_initial_transmission_parameters(nfapi_ul_config_initial_transmission_parameters* init_tx_params, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return pack_tlv(NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &init_tx_params->initial_transmission_parameters_rel8, ppWritePackedMsg, end, &pack_ul_config_request_init_tx_params_rel8_value); +} + +static uint8_t pack_ul_config_request_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_ulsch_harq_information_rel10_t* harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t*)tlv; + + return (push8(harq_info_rel10->harq_size, ppWritePackedMsg, end) && + push8(harq_info_rel10->delta_offset_harq, ppWritePackedMsg, end) && + push8(harq_info_rel10->ack_nack_mode, ppWritePackedMsg, end)); +} +static uint8_t pack_ul_config_request_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_ulsch_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t*)tlv; + + return (push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) && + push8(harq_info_rel13->delta_offset_harq_2, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_ulsch_harq_information(nfapi_ul_config_ulsch_harq_information* harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &harq_info->harq_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel10_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel13_value)); +} + +static uint8_t pack_ul_config_request_ue_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_ue_information_rel8_t* ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t*)tlv; + + return ( push32(ue_info_rel8->handle, ppWritePackedMsg, end) && + push16(ue_info_rel8->rnti, ppWritePackedMsg, end)); +} +static uint8_t pack_ul_config_request_ue_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_ue_information_rel11_t* ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t*)tlv; + + return ( push8(ue_info_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) && + push16(ue_info_rel11->npusch_identity, ppWritePackedMsg, end)); +} +static uint8_t pack_ul_config_request_ue_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_ue_information_rel13_t* ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t*)tlv; + + return ( push8(ue_info_rel13->ue_type, ppWritePackedMsg, end) && + push8(ue_info_rel13->empty_symbols, ppWritePackedMsg, end) && + push16(ue_info_rel13->total_number_of_repetitions, ppWritePackedMsg, end) && + push16(ue_info_rel13->repetition_number, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_ue_information(nfapi_ul_config_ue_information* ue_info, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &ue_info->ue_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel8_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &ue_info->ue_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel11_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &ue_info->ue_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel13_value)); +} + +static uint8_t pack_ul_config_request_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_harq_information_rel10_tdd_t* harq_info_rel10_tdd = (nfapi_ul_config_harq_information_rel10_tdd_t*)tlv; + + return ( push8(harq_info_rel10_tdd->harq_size, ppWritePackedMsg, end) && + push8(harq_info_rel10_tdd->ack_nack_mode, ppWritePackedMsg, end) && + push8(harq_info_rel10_tdd->number_of_pucch_resources, ppWritePackedMsg, end) && + push16(harq_info_rel10_tdd->n_pucch_1_0, ppWritePackedMsg, end) && + push16(harq_info_rel10_tdd->n_pucch_1_1, ppWritePackedMsg, end) && + push16(harq_info_rel10_tdd->n_pucch_1_2, ppWritePackedMsg, end) && + push16(harq_info_rel10_tdd->n_pucch_1_3, ppWritePackedMsg, end)); +} +static uint8_t pack_ul_config_request_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_harq_information_rel8_fdd_t* harq_info_rel8_fdd = (nfapi_ul_config_harq_information_rel8_fdd_t*)tlv; + + return ( push16(harq_info_rel8_fdd->n_pucch_1_0, ppWritePackedMsg, end) && + push8(harq_info_rel8_fdd->harq_size, ppWritePackedMsg, end)); +} +static uint8_t pack_ul_config_request_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_harq_information_rel9_fdd_t* harq_info_rel9_fdd = (nfapi_ul_config_harq_information_rel9_fdd_t*)tlv; + + return ( push8(harq_info_rel9_fdd->harq_size, ppWritePackedMsg, end) && + push8(harq_info_rel9_fdd->ack_nack_mode, ppWritePackedMsg, end) && + push8(harq_info_rel9_fdd->number_of_pucch_resources, ppWritePackedMsg, end) && + push16(harq_info_rel9_fdd->n_pucch_1_0, ppWritePackedMsg, end) && + push16(harq_info_rel9_fdd->n_pucch_1_1, ppWritePackedMsg, end) && + push16(harq_info_rel9_fdd->n_pucch_1_2, ppWritePackedMsg, end) && + push16(harq_info_rel9_fdd->n_pucch_1_3, ppWritePackedMsg, end)); +} +static uint8_t pack_ul_config_request_harq_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_harq_information_rel11_t* harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t*)tlv; + + return ( push8(harq_info_rel11->num_ant_ports, ppWritePackedMsg, end) && + push16(harq_info_rel11->n_pucch_2_0, ppWritePackedMsg, end) && + push16(harq_info_rel11->n_pucch_2_1, ppWritePackedMsg, end) && + push16(harq_info_rel11->n_pucch_2_2, ppWritePackedMsg, end) && + push16(harq_info_rel11->n_pucch_2_3, ppWritePackedMsg, end)); +} +static uint8_t pack_ul_config_request_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t*)tlv; + + return ( push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) && + push8(harq_info_rel13->starting_prb, ppWritePackedMsg, end) && + push8(harq_info_rel13->n_prb, ppWritePackedMsg, end) && + push8(harq_info_rel13->cdm_index, ppWritePackedMsg, end) && + push8(harq_info_rel13->n_srs, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_harq_information(nfapi_ul_config_harq_information* harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &harq_info->harq_information_rel10_tdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel10_tdd_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &harq_info->harq_information_rel8_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel8_fdd_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &harq_info->harq_information_rel9_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel9_fdd_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &harq_info->harq_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel11_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel13_value)); + +} + +static uint8_t pack_ul_config_request_cqi_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_information_rel8_t* cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t*)tlv; + + return ( push16(cqi_info_rel8->pucch_index, ppWritePackedMsg, end) && + push8(cqi_info_rel8->dl_cqi_pmi_size, ppWritePackedMsg, end)); +} +static uint8_t pack_ul_config_request_cqi_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_information_rel10_t* cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t*)tlv; + + return ( push8(cqi_info_rel10->number_of_pucch_resource, ppWritePackedMsg, end) && + push16(cqi_info_rel10->pucch_index_p1, ppWritePackedMsg, end)); +} +static uint8_t pack_ul_config_request_cqi_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_information_rel13_t* cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t*)tlv; + + return ( push8(cqi_info_rel13->csi_mode, ppWritePackedMsg, end) && + push16(cqi_info_rel13->dl_cqi_pmi_size_2, ppWritePackedMsg, end) && + push8(cqi_info_rel13->starting_prb, ppWritePackedMsg, end) && + push8(cqi_info_rel13->n_prb, ppWritePackedMsg, end) && + push8(cqi_info_rel13->cdm_index, ppWritePackedMsg, end) && + push8(cqi_info_rel13->n_srs, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_cqi_information(nfapi_ul_config_cqi_information* cqi_info, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &cqi_info->cqi_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel8_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &cqi_info->cqi_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel10_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &cqi_info->cqi_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel13_value)); + +} + +static uint8_t pack_ul_config_request_sr_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_sr_information_rel8_t* sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t*)tlv; + return push16(sr_info_rel8->pucch_index, ppWritePackedMsg, end); +} +static uint8_t pack_ul_config_request_sr_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_sr_information_rel10_t* sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t*)tlv; + + return ( push8(sr_info_rel10->number_of_pucch_resources, ppWritePackedMsg, end) && + push16(sr_info_rel10->pucch_index_p1, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_sr_information(nfapi_ul_config_sr_information* sr_info, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &sr_info->sr_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel8_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &sr_info->sr_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel10_value)); +} + +static uint8_t pack_ul_config_request_srs_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_srs_pdu_rel8_t* srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t*)tlv; + + return (push32(srs_pdu_rel8->handle, ppWritePackedMsg, end) && + push16(srs_pdu_rel8->size, ppWritePackedMsg, end) && + push16(srs_pdu_rel8->rnti, ppWritePackedMsg, end) && + push8(srs_pdu_rel8->srs_bandwidth, ppWritePackedMsg, end) && + push8(srs_pdu_rel8->frequency_domain_position, ppWritePackedMsg, end) && + push8(srs_pdu_rel8->srs_hopping_bandwidth, ppWritePackedMsg, end) && + push8(srs_pdu_rel8->transmission_comb, ppWritePackedMsg, end) && + push16(srs_pdu_rel8->i_srs, ppWritePackedMsg, end) && + push8(srs_pdu_rel8->sounding_reference_cyclic_shift, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_srs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_srs_pdu_rel10_t* srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t*)tlv; + return push8(srs_pdu_rel10->antenna_port, ppWritePackedMsg, end); +} + +static uint8_t pack_ul_config_request_srs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_srs_pdu_rel13_t* srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t*)tlv; + + return ( push8(srs_pdu_rel13->number_of_combs, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_nb_harq_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_nb_harq_information_rel13_fdd_t* nb_harq_pdu_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t*)tlv; + + return ( push8(nb_harq_pdu_rel13->harq_ack_resource, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_config_request_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_nulsch_pdu_rel13_t* nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t*)tlv; + + return (push8(nulsch_pdu_rel13->nulsch_format, ppWritePackedMsg, end) && + push32(nulsch_pdu_rel13->handle, ppWritePackedMsg, end) && + push16(nulsch_pdu_rel13->size, ppWritePackedMsg, end) && + push16(nulsch_pdu_rel13->rnti, ppWritePackedMsg, end) && + push8(nulsch_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) && + push8(nulsch_pdu_rel13->resource_assignment, ppWritePackedMsg, end) && + push8(nulsch_pdu_rel13->mcs, ppWritePackedMsg, end) && + push8(nulsch_pdu_rel13->redudancy_version, ppWritePackedMsg, end) && + push8(nulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) && + push8(nulsch_pdu_rel13->new_data_indication, ppWritePackedMsg, end) && + push8(nulsch_pdu_rel13->n_srs, ppWritePackedMsg, end) && + push16(nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) && + push16(nulsch_pdu_rel13->sf_idx, ppWritePackedMsg, end) && + pack_ul_config_request_ue_information(&(nulsch_pdu_rel13->ue_information), ppWritePackedMsg, end) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, ppWritePackedMsg, end, &pack_ul_config_request_nb_harq_rel13_value)); +} +static uint8_t pack_ul_config_request_nrach_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_nrach_pdu_rel13_t* nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t*)tlv; + + return ( push8(nrach_pdu_rel13->nprach_config_0, ppWritePackedMsg, end) && + push8(nrach_pdu_rel13->nprach_config_1, ppWritePackedMsg, end) && + push8(nrach_pdu_rel13->nprach_config_2, ppWritePackedMsg, end)); + +} + +static uint8_t pack_ul_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_config_request_body_t* value = (nfapi_ul_config_request_body_t*)tlv; + + if(!(push8(value->number_of_pdus, ppWritePackedMsg, end) && + push8(value->rach_prach_frequency_resources, ppWritePackedMsg, end) && + push8(value->srs_present, ppWritePackedMsg, end))) + return 0; + + uint16_t i = 0; + for(i = 0; i < value->number_of_pdus; ++i) + { + nfapi_ul_config_request_pdu_t* pdu = &(value->ul_config_pdu_list[i]); + + if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0) + return 0; + + // Put a 0 size in and then determine the size after the pdu + // has been writen and write the calculated size + uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg; + pdu->pdu_size = 0; + if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0) + return 0; + + switch(pdu->pdu_type) + { + case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: + { + if(!pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_pdu), ppWritePackedMsg, end)) + return 0; + } + break; + case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: + { + if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) && + pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) && + pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: + { + if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) && + pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_harq_pdu.harq_information), ppWritePackedMsg, end) && + pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_harq_pdu.initial_transmission_parameters), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: + { + if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) && + pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) && + pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_cqi_harq_ri_pdu.harq_information), ppWritePackedMsg, end) && + pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: + { + if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_pdu.ue_information), ppWritePackedMsg, end) && + pack_ul_config_request_cqi_information(&(pdu->uci_cqi_pdu.cqi_information), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: + { + if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_pdu.ue_information), ppWritePackedMsg, end) && + pack_ul_config_request_sr_information(&(pdu->uci_sr_pdu.sr_information), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: + { + if(!(pack_ul_config_request_ue_information(&(pdu->uci_harq_pdu.ue_information), ppWritePackedMsg, end) && + pack_ul_config_request_harq_information(&(pdu->uci_harq_pdu.harq_information), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: + { + if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_harq_pdu.ue_information), ppWritePackedMsg, end) && + pack_ul_config_request_sr_information(&(pdu->uci_sr_harq_pdu.sr_information), ppWritePackedMsg, end) && + pack_ul_config_request_harq_information(&(pdu->uci_sr_harq_pdu.harq_information), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: + { + if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_harq_pdu.ue_information), ppWritePackedMsg, end) && + pack_ul_config_request_cqi_information(&(pdu->uci_cqi_harq_pdu.cqi_information), ppWritePackedMsg, end) && + pack_ul_config_request_harq_information(&(pdu->uci_cqi_harq_pdu.harq_information), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: + { + if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_pdu.ue_information), ppWritePackedMsg, end) && + pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_pdu.cqi_information), ppWritePackedMsg, end) && + pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_pdu.sr_information), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: + { + if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_harq_pdu.ue_information), ppWritePackedMsg, end) && + pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_harq_pdu.cqi_information), ppWritePackedMsg, end) && + pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_harq_pdu.sr_information), ppWritePackedMsg, end) && + pack_ul_config_request_harq_information(&(pdu->uci_cqi_sr_harq_pdu.harq_information), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_SRS_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &pdu->srs_pdu.srs_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel8_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &pdu->srs_pdu.srs_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel10_value) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &pdu->srs_pdu.srs_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel13_value))) + return 0; + } + break; + case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: + { + if(!(pack_ul_config_request_ue_information(&(pdu->harq_buffer_pdu.ue_information), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: + { + if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_csi_pdu.ulsch_pdu), ppWritePackedMsg, end) && + pack_ul_config_request_cqi_information(&(pdu->ulsch_uci_csi_pdu.csi_information), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: + { + if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) && + pack_ul_config_request_harq_information(&(pdu->ulsch_uci_harq_pdu.harq_information), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: + { + if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) && + pack_ul_config_request_cqi_information(&(pdu->ulsch_csi_uci_harq_pdu.csi_information), ppWritePackedMsg, end) && + pack_ul_config_request_harq_information(&(pdu->ulsch_csi_uci_harq_pdu.harq_information), ppWritePackedMsg, end))) + return 0; + } + break; + case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &pdu->nulsch_pdu.nulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nulsch_pdu_rel13_value))) + return 0; + } + break; + case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &pdu->nrach_pdu.nrach_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nrach_pdu_rel13_value))) + return 0; + } + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type ); + } + break; + }; + + // add 1 for the pdu_type. The delta will include the pdu_size + pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize); + push8(pdu->pdu_size, &pWritePackedMsgPduSize, end); + + } + return 1; +} + +static uint8_t pack_ul_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, ppWritePackedMsg, end, &pack_ul_config_request_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)) ; +} + +static uint8_t pack_hi_dci0_hi_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_hi_pdu_rel8_t* hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t*)tlv; + + return ( push8(hi_pdu_rel8->resource_block_start, ppWritePackedMsg, end) && + push8(hi_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) && + push8(hi_pdu_rel8->hi_value, ppWritePackedMsg, end) && + push8(hi_pdu_rel8->i_phich, ppWritePackedMsg, end) && + push16(hi_pdu_rel8->transmission_power, ppWritePackedMsg, end)); +} + +static uint8_t pack_hi_dci0_hi_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_hi_pdu_rel10_t* hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t*)tlv; + + return ( push8(hi_pdu_rel10->flag_tb2, ppWritePackedMsg, end) && + push8(hi_pdu_rel10->hi_value_2, ppWritePackedMsg, end)); +} + +static uint8_t pack_hi_dci0_dci_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_dci_pdu_rel8_t* dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t*)tlv; + + return ( push8(dci_pdu_rel8->dci_format, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->cce_index, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->aggregation_level, ppWritePackedMsg, end) && + push16(dci_pdu_rel8->rnti, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->resource_block_start, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->number_of_resource_block, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->mcs_1, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->new_data_indication_1, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->ue_tx_antenna_seleciton, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->tpc, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->cqi_csi_request, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->ul_index, ppWritePackedMsg, end) && + push8(dci_pdu_rel8->dl_assignment_index, ppWritePackedMsg, end) && + push32(dci_pdu_rel8->tpc_bitmap, ppWritePackedMsg, end) && + push16(dci_pdu_rel8->transmission_power, ppWritePackedMsg, end)); +} + +static uint8_t pack_hi_dci0_dci_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_dci_pdu_rel10_t* dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t*)tlv; + + return ( push8(dci_pdu_rel10->cross_carrier_scheduling_flag, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->carrier_indicator, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->size_of_cqi_csi_feild, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->srs_flag, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->srs_request, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->resource_allocation_flag, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) && + push32(dci_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->mcs_2, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->new_data_indication_2, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->number_of_antenna_ports, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->tpmi, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->total_dci_length_including_padding, ppWritePackedMsg, end) && + push8(dci_pdu_rel10->n_ul_rb, ppWritePackedMsg, end)); +} + +static uint8_t pack_hi_dci0_dci_rel12_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_dci_pdu_rel12_t* dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t*)tlv; + + return ( push8(dci_pdu_rel12->pscch_resource, ppWritePackedMsg, end) && + push8(dci_pdu_rel12->time_resource_pattern, ppWritePackedMsg, end)); +} + +static uint8_t pack_hi_dci0_mpdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t* mpdcch_dci_pdu_rel13 = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t*)tlv; + + return ( push8(mpdcch_dci_pdu_rel13->mpdcch_narrowband, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->number_of_prb_pairs, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->resource_block_assignment, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->mpdcch_transmission_type, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->ecce_index, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->aggreagation_level, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->rnti_type, ppWritePackedMsg, end) && + push16(mpdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->ce_mode, ppWritePackedMsg, end) && + push16(mpdcch_dci_pdu_rel13->drms_scrambling_init, ppWritePackedMsg, end) && + push16(mpdcch_dci_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) && + push16(mpdcch_dci_pdu_rel13->transmission_power, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->dci_format, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->resource_block_start, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->number_of_resource_blocks, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->pusch_repetition_levels, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->frequency_hopping_flag, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->new_data_indication, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->harq_process, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->redudency_version, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->tpc, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->csi_request, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->ul_inex, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->dai_presence_flag, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->dl_assignment_index, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->srs_request, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end) && + push32(mpdcch_dci_pdu_rel13->tcp_bitmap, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->total_dci_length_include_padding, ppWritePackedMsg, end) && + push8(mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end) && + pusharray16(mpdcch_dci_pdu_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end)); + +} + +static uint8_t pack_hi_dci0_npdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_npdcch_dci_pdu_rel13_t* npdcch_dci_pdu_rel13 = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t*)tlv; + + return ( push8(npdcch_dci_pdu_rel13->ncce_index, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->aggregation_level, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) && + push16(npdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->resource_assignment, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->scheduling_delay, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->redudancy_version, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->repetition_number, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->new_data_indicator, ppWritePackedMsg, end) && + push8(npdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end)); +} + + +static uint8_t pack_hi_dci0_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_request_body_t* value = (nfapi_hi_dci0_request_body_t*)tlv; + + if(!(push16(value->sfnsf, ppWritePackedMsg, end) && + push8(value->number_of_dci, ppWritePackedMsg, end) && + push8(value->number_of_hi, ppWritePackedMsg, end))) + return 0; + + uint16_t i = 0; + uint16_t total_number_of_pdus = value->number_of_dci + value->number_of_hi; + for(i = 0; i < total_number_of_pdus; ++i) + { + nfapi_hi_dci0_request_pdu_t* pdu = &(value->hi_dci0_pdu_list[i]); + + if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0) + return 0; + + // Put a 0 size in and then determine the size after the pdu + // has been writen and write the calculated size + uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg; + pdu->pdu_size = 0; + if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0) + return 0; + + switch(pdu->pdu_type) + { + case NFAPI_HI_DCI0_HI_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_hi_rel8_pdu_value) && + pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_hi_rel10_pdu_value))) + return 0; + } + break; + case NFAPI_HI_DCI0_DCI_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) && + pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) && + pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, ppWritePackedMsg, end, pack_hi_dci0_dci_rel12_pdu_value))) + return 0; + } + break; + case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) && + pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) && + pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, ppWritePackedMsg, end, pack_dl_config_epdcch_parameters_rel11_value))) + return 0; + } + break; + case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_mpdcch_dci_rel13_pdu_value))) + return 0; + } + break; + case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: + { + if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_npdcch_dci_rel13_pdu_value))) + return 0; + } + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type ); + } + break; + }; + + // add 1 for the pdu_type. The delta will include the pdu_size + pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize); + push8(pdu->pdu_size, &pWritePackedMsgPduSize, end); + + } + + return 1; +} + +static uint8_t pack_hi_dci0_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, ppWritePackedMsg, end, &pack_hi_dci0_request_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_tx_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_tx_request_body_t* value = (nfapi_tx_request_body_t*)tlv; + + if(push16(value->number_of_pdus, ppWritePackedMsg, end) == 0) + return 0; + + uint16_t i = 0; + uint16_t total_number_of_pdus = value->number_of_pdus; + for(; i < total_number_of_pdus; ++i) + { + nfapi_tx_request_pdu_t* pdu = &(value->tx_pdu_list[i]); + + if(!(push16(pdu->pdu_length, ppWritePackedMsg, end) && + push16(pdu->pdu_index, ppWritePackedMsg, end))) + return 0; + + uint8_t j; + for(j = 0; j < pdu->num_segments; ++j) + { + // Use -1 as it is unbounded + // DJP - does not handle -1 + // DJP - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0) + int push_ret = pusharray8(pdu->segments[j].segment_data, 65535, pdu->segments[j].segment_length, ppWritePackedMsg, end); + + if (0 && pdu->segments[j].segment_length == 3) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, + pdu->segments[j].segment_data[0], + pdu->segments[j].segment_data[1], + pdu->segments[j].segment_data[2] + ); + } + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() segment_data:%p segment_length:%u pusharray8()=%d\n", __FUNCTION__, pdu->segments[j].segment_data, pdu->segments[j].segment_length, push_ret); + + if (push_ret == 0) + { + return 0; + } + } + } + + return 1; +} + +static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg; + + int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end); + int y = pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value); + int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config); + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() x:%d y:%d z:%d\n", __FUNCTION__, x, y, z); + + return x && y && z; +} + +static uint8_t pack_rx_ue_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_rx_ue_information* value = (nfapi_rx_ue_information*)tlv; + + return ( push32(value->handle, ppWritePackedMsg, end) && + push16(value->rnti, ppWritePackedMsg, end) ); +} + +static uint8_t unpack_rx_ue_information_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_rx_ue_information* value = (nfapi_rx_ue_information*)tlv; + + return ( pull32(ppReadPackedMsg, &value->handle, end) && + pull16(ppReadPackedMsg, &value->rnti, end)); +} + +static uint8_t pack_harq_indication_tdd_harq_data_bundling(nfapi_harq_indication_tdd_harq_data_bundling_t* data, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return ( push8(data->value_0, ppWritePackedMsg, end) && + push8(data->value_1, ppWritePackedMsg, end)); +} + +static uint8_t pack_harq_indication_tdd_harq_data_multiplexing(nfapi_harq_indication_tdd_harq_data_multiplexing_t* data, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return ( push8(data->value_0, ppWritePackedMsg, end) && + push8(data->value_1, ppWritePackedMsg, end) && + push8(data->value_2, ppWritePackedMsg, end) && + push8(data->value_3, ppWritePackedMsg, end)); +} + +static uint8_t pack_harq_indication_tdd_harq_data_special_bundling(nfapi_harq_indication_tdd_harq_data_special_bundling_t* data, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return ( push8(data->value_0, ppWritePackedMsg, end) ); +} + +static uint8_t pack_harq_indication_tdd_harq_data(nfapi_harq_indication_tdd_harq_data_t* data, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + return ( push8(data->value_0, ppWritePackedMsg, end) ); +} + +static uint8_t pack_harq_indication_tdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_harq_indication_tdd_rel8_t* harq_indication_tdd_rel8 = (nfapi_harq_indication_tdd_rel8_t*)tlv; + + if(!(push8(harq_indication_tdd_rel8->mode, ppWritePackedMsg, end) && + push8(harq_indication_tdd_rel8->number_of_ack_nack, ppWritePackedMsg, end))) + return 0; + + uint8_t result = 0; + switch(harq_indication_tdd_rel8->mode) + { + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING: + result = pack_harq_indication_tdd_harq_data_bundling(&harq_indication_tdd_rel8->harq_data.bundling, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING: + result = pack_harq_indication_tdd_harq_data_multiplexing(&harq_indication_tdd_rel8->harq_data.multiplex, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING: + result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel8->harq_data.special_bundling, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION: + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3: + result = 1; + break; + default: + // err.... + break; + } + + return result; + +} + +static uint8_t pack_harq_indication_tdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_harq_indication_tdd_rel9_t* harq_indication_tdd_rel9 = (nfapi_harq_indication_tdd_rel9_t*)tlv; + + if(!(push8(harq_indication_tdd_rel9->mode, ppWritePackedMsg, end) && + push8(harq_indication_tdd_rel9->number_of_ack_nack, ppWritePackedMsg, end))) + return 0; + + uint8_t idx; + for(idx = 0; idx < harq_indication_tdd_rel9->number_of_ack_nack; ++idx) + { + uint8_t result = 0; + + switch(harq_indication_tdd_rel9->mode) + { + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING: + result = pack_harq_indication_tdd_harq_data(&(harq_indication_tdd_rel9->harq_data[idx].bundling), ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING: + result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].multiplex, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING: + result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel9->harq_data[idx].special_bundling, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION: + result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].channel_selection, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3: + result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].format_3, ppWritePackedMsg, end); + break; + default: + // err.... + break; + } + + if(result == 0) + return 0; + } + + return 1; +} + +static uint8_t pack_harq_indication_tdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_harq_indication_tdd_rel13_t* harq_indication_tdd_rel13 = (nfapi_harq_indication_tdd_rel13_t*)tlv; + + if(!(push8(harq_indication_tdd_rel13->mode, ppWritePackedMsg, end) && + push16(harq_indication_tdd_rel13->number_of_ack_nack, ppWritePackedMsg, end))) + return 0; + + uint8_t idx; + for(idx = 0; idx < harq_indication_tdd_rel13->number_of_ack_nack; ++idx) + { + uint8_t result = 0; + switch(harq_indication_tdd_rel13->mode) + { + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING: + result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].bundling, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING: + result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].multiplex, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING: + result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel13->harq_data[idx].special_bundling, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION: + result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].channel_selection, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3: + result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_3, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4: + result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_4, ppWritePackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5: + result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_5, ppWritePackedMsg, end); + break; + default: + // err.... + break; + } + + if(result == 0) + return 0; + } + + return 1; +} + +static uint8_t pack_harq_indication_fdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_harq_indication_fdd_rel8_t* harq_indication_fdd_rel8 = (nfapi_harq_indication_fdd_rel8_t*)tlv; + + return ( push8(harq_indication_fdd_rel8->harq_tb1, ppWritePackedMsg, end) && + push8(harq_indication_fdd_rel8->harq_tb2, ppWritePackedMsg, end)); +} + +static uint8_t pack_harq_indication_fdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_harq_indication_fdd_rel9_t* harq_indication_fdd_rel9 = (nfapi_harq_indication_fdd_rel9_t*)tlv; + + return ( push8(harq_indication_fdd_rel9->mode, ppWritePackedMsg, end) && + push8(harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end) && + pusharray8(harq_indication_fdd_rel9->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end)); +} + +static uint8_t pack_harq_indication_fdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_harq_indication_fdd_rel13_t* harq_indication_fdd_rel13 = (nfapi_harq_indication_fdd_rel13_t*)tlv; + + return ( push8(harq_indication_fdd_rel13->mode, ppWritePackedMsg, end) && + push16(harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end) && + pusharray8(harq_indication_fdd_rel13->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end)); +} + +static uint8_t pack_ul_cqi_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_ul_cqi_information_t* value = (nfapi_ul_cqi_information_t*)tlv; + + return ( push8(value->ul_cqi, ppWritePackedMsg, end) && + push8(value->channel, ppWritePackedMsg, end)); + +} + +static uint8_t pack_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_harq_indication_body_t* value = (nfapi_harq_indication_body_t*)tlv; + + if(push16(value->number_of_harqs, ppWritePackedMsg, end) == 0) + return 0; + + uint16_t i = 0; + uint16_t total_number_of_pdus = value->number_of_harqs; + for(; i < total_number_of_pdus; ++i) + { + nfapi_harq_indication_pdu_t* pdu = &(value->harq_pdu_list[i]); + + uint8_t* instance_length_p = *ppWritePackedMsg; + if(!push16(pdu->instance_length, ppWritePackedMsg, end)) + return 0; + + if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) && + pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, ppWritePackedMsg, end, pack_harq_indication_tdd_rel8_value) && + pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, ppWritePackedMsg, end, pack_harq_indication_tdd_rel9_value) && + pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, ppWritePackedMsg, end, pack_harq_indication_tdd_rel13_value) && + pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, ppWritePackedMsg, end, pack_harq_indication_fdd_rel8_value) && + pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, ppWritePackedMsg, end, pack_harq_indication_fdd_rel9_value) && + pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_harq_indication_fdd_rel13_value) && + pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value))) + return 0; + + // calculate the instance length subtracting the size of the instance + // length feild + uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2; + push16(instance_length, &instance_length_p, end); + } + + return 1; +} + +static uint8_t pack_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, ppWritePackedMsg, end, pack_harq_indication_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_crc_indication_rel8_body(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_crc_indication_rel8_t* crc_indication_rel8 = (nfapi_crc_indication_rel8_t*)tlv; + + return ( push8(crc_indication_rel8->crc_flag, ppWritePackedMsg, end) ); +} + +static uint8_t pack_crc_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_crc_indication_body_t* value = (nfapi_crc_indication_body_t*)tlv; + + if(push16(value->number_of_crcs, ppWritePackedMsg, end) == 0) + return 0; + + uint16_t i = 0; + uint16_t total_number_of_pdus = value->number_of_crcs; + for(; i < total_number_of_pdus; ++i) + { + nfapi_crc_indication_pdu_t* pdu = &(value->crc_pdu_list[i]); + + uint8_t* instance_length_p = *ppWritePackedMsg; + if(!push16(pdu->instance_length, ppWritePackedMsg, end)) + return 0; + + if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) && + pack_tlv(NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, ppWritePackedMsg, end, pack_crc_indication_rel8_body))) + return 0; + + // calculate the instance length subtracting the size of the instance + // length feild + uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2; + push16(instance_length, &instance_length_p, end); + } + return 1; +} + +static uint8_t pack_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, ppWritePackedMsg, end, &pack_crc_indication_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); + +} +static uint8_t pack_rx_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_rx_indication_rel8_t* value = (nfapi_rx_indication_rel8_t*)tlv; + + return ( push16(value->length, ppWritePackedMsg, end) && + push16(value->offset, ppWritePackedMsg, end) && + push8(value->ul_cqi, ppWritePackedMsg, end) && + push16(value->timing_advance, ppWritePackedMsg, end)); +} +static uint8_t pack_rx_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_rx_indication_rel9_t* value = (nfapi_rx_indication_rel9_t*)tlv; + + return ( push16(value->timing_advance_r9, ppWritePackedMsg, end)); +} + +static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_rx_indication_body_t* value = (nfapi_rx_indication_body_t*)tlv; + + //printf("RX ULSCH BODY\n"); + + if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0) + return 0; + + // need to calculate the data offset's. + uint16_t i = 0; + uint16_t offset = 2; // taking into account the number_of_pdus + uint16_t total_number_of_pdus = value->number_of_pdus; + //printf("ULSCH:pdus:%d\n", total_number_of_pdus); + + for(i = 0; i < total_number_of_pdus; ++i) + { + nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]); + if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) + { + //printf("NFAPI_RX_UE_INFORMATION_TAG\n"); + offset += 4 + 6; + } + + if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) + { + //printf("NFAPI_RX_INDICATION_REL8_TAG\n"); + offset += 4 + 7; + } + + if(pdu->rx_indication_rel9.tl.tag == NFAPI_RX_INDICATION_REL9_TAG) + { + //printf("NFAPI_RX_INDICATION_REL9_TAG\n"); + offset += 4 + 2; + } + } + + // Now update the structure to include the offset + for(i =0; i < total_number_of_pdus; ++i) + { + nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]); + + if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) + { + if(pdu->rx_indication_rel8.offset == 1) + { + pdu->rx_indication_rel8.offset = offset; + offset += pdu->rx_indication_rel8.length; + } + } + } + + // Write out the pdu + for(i = 0; i < total_number_of_pdus; ++i) + { + nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]); + if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) && + pack_tlv(NFAPI_RX_INDICATION_REL8_TAG, &pdu->rx_indication_rel8, ppWritePackedMsg, end, pack_rx_indication_rel8_value) && + pack_tlv(NFAPI_RX_INDICATION_REL9_TAG, &pdu->rx_indication_rel9, ppWritePackedMsg, end, pack_rx_indication_rel9_value))) + return 0; + } + + // Write out the pdu data + for(i = 0; i < total_number_of_pdus; ++i) + { + uint16_t length = 0; + nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]); + + if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) + { + length = pdu->rx_indication_rel8.length; + } + + if( pusharray8(value->rx_pdu_list[i].data, length, length, ppWritePackedMsg, end) == 0) + return 0; + } + return 1; +} + + +static uint8_t pack_rx_ulsch_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, ppWritePackedMsg, end, pack_rx_ulsch_indication_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_preamble_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_preamble_pdu_rel8_t* preamble_rel8 = (nfapi_preamble_pdu_rel8_t*)tlv; + + return ( push16(preamble_rel8->rnti, ppWritePackedMsg, end) && + push8(preamble_rel8->preamble, ppWritePackedMsg, end) && + push16(preamble_rel8->timing_advance, ppWritePackedMsg, end)); +} +static uint8_t pack_preamble_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_preamble_pdu_rel9_t* preamble_rel9 = (nfapi_preamble_pdu_rel9_t*)tlv; + + return ( push16(preamble_rel9->timing_advance_r9, ppWritePackedMsg, end) ); +} +static uint8_t pack_preamble_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_preamble_pdu_rel13_t* preamble_rel13 = (nfapi_preamble_pdu_rel13_t*)tlv; + + return ( push8(preamble_rel13->rach_resource_type, ppWritePackedMsg, end) ); +} + +static uint8_t pack_rach_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_rach_indication_body_t* value = (nfapi_rach_indication_body_t*)tlv; + + if( push16(value->number_of_preambles, ppWritePackedMsg, end) == 0) + return 0; + + uint16_t i = 0; + uint16_t total_number_of_pdus = value->number_of_preambles; + for(; i < total_number_of_pdus; ++i) + { + nfapi_preamble_pdu_t* pdu = &(value->preamble_list[i]); + + uint8_t* instance_length_p = *ppWritePackedMsg; + if(!push16(pdu->instance_length, ppWritePackedMsg, end)) + return 0; + + if(!(pack_tlv(NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, ppWritePackedMsg, end, pack_preamble_pdu_rel8_value) && + pack_tlv(NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, ppWritePackedMsg, end, pack_preamble_pdu_rel9_value) && + pack_tlv(NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, ppWritePackedMsg, end, pack_preamble_pdu_rel13_value))) + return 0; + + // calculate the instance length subtracting the size of the instance + // length feild + uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2; + push16(instance_length, &instance_length_p, end); + } + + return 1; +} + +static uint8_t pack_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, ppWritePackedMsg, end, pack_rach_indication_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_srs_indication_fdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_srs_indication_fdd_rel8_t* srs_pdu_rel8 = (nfapi_srs_indication_fdd_rel8_t*)tlv; + + return ( push16(srs_pdu_rel8->doppler_estimation, ppWritePackedMsg, end) && + push16(srs_pdu_rel8->timing_advance, ppWritePackedMsg, end) && + push8(srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) && + push8(srs_pdu_rel8->rb_start, ppWritePackedMsg, end) && + pusharray8(srs_pdu_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end)); +} + +static uint8_t pack_srs_indication_fdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_srs_indication_fdd_rel9_t* srs_pdu_rel9 = (nfapi_srs_indication_fdd_rel9_t*)tlv; + + return ( push16(srs_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end) ); +} + +static uint8_t pack_srs_indication_tdd_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_srs_indication_ttd_rel10_t* srs_pdu_rel10 = (nfapi_srs_indication_ttd_rel10_t*)tlv; + + return ( push8(srs_pdu_rel10->uppts_symbol, ppWritePackedMsg, end) ); + +} + +static uint8_t pack_srs_indication_fdd_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_srs_indication_fdd_rel11_t* srs_pdu_rel11 = (nfapi_srs_indication_fdd_rel11_t*)tlv; + + return ( push16(srs_pdu_rel11->ul_rtoa, ppWritePackedMsg, end) ) ; +} + +static uint8_t pack_tdd_channel_measurement_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_tdd_channel_measurement_t* value = (nfapi_tdd_channel_measurement_t*)tlv; + + if(!(push8(value->num_prb_per_subband, ppWritePackedMsg, end) && + push8(value->number_of_subbands, ppWritePackedMsg, end) && + push8(value->num_atennas, ppWritePackedMsg, end))) + return 0; + + uint8_t idx = 0; + for(idx = 0; idx < value->number_of_subbands; ++idx) + { + if(!(push8(value->subands[idx].subband_index, ppWritePackedMsg, end) && + pusharray16(value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, ppWritePackedMsg, end))) + return 0; + } + + return 1; +} + +static uint8_t pack_srs_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t*)tlv; + + if( push8(value->number_of_ues, ppWritePackedMsg, end) == 0) + return 0; + + uint16_t i = 0; + uint16_t total_number_of_pdus = value->number_of_ues; + for(; i < total_number_of_pdus; ++i) + { + nfapi_srs_indication_pdu_t* pdu = &(value->srs_pdu_list[i]); + + uint8_t* instance_length_p = *ppWritePackedMsg; + if(!push16(pdu->instance_length, ppWritePackedMsg, end)) + return 0; + + if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, &pack_rx_ue_information_value) && + pack_tlv(NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel8_value) && + pack_tlv(NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel9_value) && + pack_tlv(NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, ppWritePackedMsg, end, &pack_srs_indication_tdd_rel10_value) && + pack_tlv(NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel11_value) && + pack_tlv(NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, ppWritePackedMsg, end, &pack_tdd_channel_measurement_value))) + return 0; + + // calculate the instance length subtracting the size of the instance + // length feild + uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2; + push16(instance_length, &instance_length_p, end); + } + + return 1; +} + +static uint8_t pack_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, ppWritePackedMsg, end, &pack_srs_indication_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); + +} + +static uint8_t pack_sr_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_sr_indication_body_t* value = (nfapi_sr_indication_body_t*)tlv; + + if(push16(value->number_of_srs, ppWritePackedMsg, end) == 0) + return 0; + + uint16_t i = 0; + uint16_t total_number_of_pdus = value->number_of_srs; + for(; i < total_number_of_pdus; ++i) + { + nfapi_sr_indication_pdu_t* pdu = &(value->sr_pdu_list[i]); + + uint8_t* instance_length_p = *ppWritePackedMsg; + if(!push16(pdu->instance_length, ppWritePackedMsg, end)) + return 0; + + if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) && + pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value))) + return 0; + + // calculate the instance length subtracting the size of the instance + // length feild + uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2; + push16(instance_length, &instance_length_p, end); + } + return 1; +} + +static uint8_t pack_sr_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, ppWritePackedMsg, end, &pack_sr_indication_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); + +} + +static uint8_t pack_cqi_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_cqi_indication_rel8_t* cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t*)tlv; + + return ( push16(cqi_pdu_rel8->length, ppWritePackedMsg, end) && + push16(cqi_pdu_rel8->data_offset, ppWritePackedMsg, end) && + push8(cqi_pdu_rel8->ul_cqi, ppWritePackedMsg, end) && + push8(cqi_pdu_rel8->ri, ppWritePackedMsg, end) && + push16(cqi_pdu_rel8->timing_advance, ppWritePackedMsg, end)); +} + +static uint8_t pack_cqi_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_cqi_indication_rel9_t* cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t*)tlv; + + return ( push16(cqi_pdu_rel9->length, ppWritePackedMsg, end) && + push16(cqi_pdu_rel9->data_offset, ppWritePackedMsg, end) && + push8(cqi_pdu_rel9->ul_cqi, ppWritePackedMsg, end) && + push8(cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) && + pusharray8(cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) && + push16(cqi_pdu_rel9->timing_advance, ppWritePackedMsg, end) && + push16(cqi_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end)); +} + +static uint8_t pack_cqi_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_cqi_indication_body_t* value = (nfapi_cqi_indication_body_t*)tlv; + + if( push16(value->number_of_cqis, ppWritePackedMsg, end) == 0) + return 0; + + // need to calculate the data offset's. This very bittle due the hardcoding + // of the sizes. can not use the sizeof as we have an array for the Rel9 + // info + uint16_t i = 0; + uint16_t offset = 2; // taking into account the number_of_cqis + uint16_t total_number_of_pdus = value->number_of_cqis; + for(i = 0; i < total_number_of_pdus; ++i) + { + nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]); + + offset += 2; // for the instance length + + if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) + { + offset += 4 + 6; // sizeof(nfapi_rx_ue_information) - sizeof(nfapi_tl_t) + } + + if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) + { + offset += 4 + 8; + } + + if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) + { + offset += 4 + 10 + pdu->cqi_indication_rel9.number_of_cc_reported; + } + + if(pdu->ul_cqi_information.tl.tag == NFAPI_UL_CQI_INFORMATION_TAG) + { + offset += 4 + 2; + } + } + + // Now update the structure to include the offset + for(i =0; i < total_number_of_pdus; ++i) + { + nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]); + + if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) + { + if(pdu->cqi_indication_rel8.data_offset == 1) + { + pdu->cqi_indication_rel8.data_offset = offset; + offset += pdu->cqi_indication_rel8.length; + } + } + + if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) + { + if(pdu->cqi_indication_rel9.data_offset == 1) + { + pdu->cqi_indication_rel9.data_offset = offset; + offset += pdu->cqi_indication_rel9.length; + } + } + + } + + // Write out the cqi information + for(i = 0; i < total_number_of_pdus; ++i) + { + nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]); + + uint8_t* instance_length_p = *ppWritePackedMsg; + if(!push16(pdu->instance_length, ppWritePackedMsg, end)) + return 0; + + if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end ,pack_rx_ue_information_value) && + pack_tlv(NFAPI_CQI_INDICATION_REL8_TAG, &pdu->cqi_indication_rel8, ppWritePackedMsg, end, pack_cqi_indication_rel8_value) && + pack_tlv(NFAPI_CQI_INDICATION_REL9_TAG, &pdu->cqi_indication_rel9, ppWritePackedMsg, end, pack_cqi_indication_rel9_value) && + pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value))) + return 0; + + // calculate the instance length subtracting the size of the instance + // length feild + uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2; + push16(instance_length, &instance_length_p, end); + + } + + // Write out the cqi raw data + for(i = 0; i < total_number_of_pdus; ++i) + { + uint16_t length = 0; + nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]); + + if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) + { + length = pdu->cqi_indication_rel8.length; + } + + if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) + { + length = pdu->cqi_indication_rel9.length; + } + + if( pusharray8(value->cqi_raw_pdu_list[i].pdu, NFAPI_CQI_RAW_MAX_LEN, length, ppWritePackedMsg, end) == 0) + return 0; + } + + return 1; +} + +static uint8_t pack_cqi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, ppWritePackedMsg, end, pack_cqi_indication_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); + +} + +static uint8_t pack_lbt_pdsch_req_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lbt_pdsch_req_pdu_rel13_t* value = (nfapi_lbt_pdsch_req_pdu_rel13_t*)tlv; + + return ( push32(value->handle, ppWritePackedMsg, end) && + push32(value->mp_cca, ppWritePackedMsg, end) && + push32(value->n_cca, ppWritePackedMsg, end) && + push32(value->offset, ppWritePackedMsg, end) && + push32(value->lte_txop_sf, ppWritePackedMsg, end) && + push16(value->txop_sfn_sf_end, ppWritePackedMsg, end) && + push32(value->lbt_mode, ppWritePackedMsg, end)); +} + +static uint8_t pack_lbt_drs_req_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lbt_drs_req_pdu_rel13_t* value = (nfapi_lbt_drs_req_pdu_rel13_t*)tlv; + + return ( push32(value->handle, ppWritePackedMsg, end) && + push32(value->offset, ppWritePackedMsg, end) && + push16(value->sfn_sf_end, ppWritePackedMsg, end) && + push32(value->lbt_mode, ppWritePackedMsg, end)); +} + +static uint8_t pack_lbt_dl_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lbt_dl_config_request_body_t* value = (nfapi_lbt_dl_config_request_body_t*)tlv; + + if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0) + return 0; + + uint16_t i = 0; + uint16_t total_number_of_pdus = value->number_of_pdus; + for(; i < total_number_of_pdus; ++i) + { + nfapi_lbt_dl_config_request_pdu_t* pdu = &(value->lbt_dl_config_req_pdu_list[i]); + + if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0) + return 0; + + // Put a 0 size in and then determine the size after the pdu + // has been writen and write the calculated size + uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg; + pdu->pdu_size = 0; + if( push8(pdu->pdu_size, ppWritePackedMsg, end) == 0) + return 0; + + switch(pdu->pdu_type) + { + case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: + { + if( pack_tlv(NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_req_pdu_rel13_value) == 0) + return 0; + } + break; + case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: + { + if(pack_tlv(NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_req_pdu_rel13_value) == 0) + return 0; + } + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request invalid pdu type %d \n", pdu->pdu_type ); + } + break; + }; + + // add 1 for the pdu_type. The delta will include the pdu_size + pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize); + push8(pdu->pdu_size, &pWritePackedMsgPduSize, end); + } + + return 1; +} + +static uint8_t pack_lbt_pdsch_rsp_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lbt_pdsch_rsp_pdu_rel13_t* value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t*)tlv; + + return ( push32(value->handle, ppWritePackedMsg, end) && + push32(value->result, ppWritePackedMsg, end) && + push32(value->lte_txop_symbols, ppWritePackedMsg, end) && + push32(value->initial_partial_sf, ppWritePackedMsg, end)); +} + +static uint8_t pack_lbt_drs_rsp_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lbt_drs_rsp_pdu_rel13_t* value = (nfapi_lbt_drs_rsp_pdu_rel13_t*)tlv; + + return ( push32(value->handle, ppWritePackedMsg, end) && + push32(value->result, ppWritePackedMsg, end)); +} + +static uint8_t pack_lbt_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, ppWritePackedMsg, end, &pack_lbt_dl_config_request_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_lbt_dl_config_indication_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_lbt_dl_indication_body_t* value = (nfapi_lbt_dl_indication_body_t*)tlv; + + if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0) + return 0; + + uint16_t i = 0; + uint16_t total_number_of_pdus = value->number_of_pdus; + for(; i < total_number_of_pdus; ++i) + { + nfapi_lbt_dl_indication_pdu_t* pdu = &(value->lbt_indication_pdu_list[i]); + + if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0) + return 0; + + // Put a 0 size in and then determine the size after the pdu + // has been writen and write the calculated size + uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg; + pdu->pdu_size = 0; + + if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0) + return 0; + + switch(pdu->pdu_type) + { + case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: + { + if( pack_tlv(NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_rsp_pdu_rel13_value) == 0) + return 0; + } + break; + case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: + { + if( pack_tlv(NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_rsp_pdu_rel13_value) == 0) + return 0; + } + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d \n", pdu->pdu_type ); + } + break; + }; + + // add 1 for the pdu_type. The delta will include the pdu_size + pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize); + push8(pdu->pdu_size, &pWritePackedMsgPduSize, end); + } + + return 1; +} + +static uint8_t pack_lbt_dl_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, ppWritePackedMsg, end, &pack_lbt_dl_config_indication_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_nb_harq_indication_fdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nb_harq_indication_fdd_rel13_t* nb_harq_indication_fdd_rel13 = (nfapi_nb_harq_indication_fdd_rel13_t*)tlv; + + return ( push8(nb_harq_indication_fdd_rel13->harq_tb1, ppWritePackedMsg, end) ); +} + +static uint8_t pack_nb_harq_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nb_harq_indication_body_t* value = (nfapi_nb_harq_indication_body_t*)tlv; + + if( push16(value->number_of_harqs, ppWritePackedMsg, end) == 0) + return 0; + + uint16_t i = 0; + uint16_t total_number_of_harqs = value->number_of_harqs; + for(; i < total_number_of_harqs; ++i) + { + nfapi_nb_harq_indication_pdu_t* pdu = &(value->nb_harq_pdu_list[i]); + + uint8_t* instance_length_p = *ppWritePackedMsg; + if(!push16(pdu->instance_length, ppWritePackedMsg, end)) + return 0; + + if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) && + pack_tlv(NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_nb_harq_indication_fdd_rel13_value) && + pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value))) + return 0; + + // calculate the instance length subtracting the size of the instance + // length feild + uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2; + push16(instance_length, &instance_length_p, end); + } + + return 1; +} + + +static uint8_t pack_nb_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, ppWritePackedMsg, end, &pack_nb_harq_indication_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_nrach_indication_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nrach_indication_pdu_rel13_t* nrach_indication_fdd_rel13 = (nfapi_nrach_indication_pdu_rel13_t*)tlv; + + return ( push16(nrach_indication_fdd_rel13->rnti, ppWritePackedMsg, end) && + push8(nrach_indication_fdd_rel13->initial_sc, ppWritePackedMsg, end) && + push16(nrach_indication_fdd_rel13->timing_advance, ppWritePackedMsg, end) && + push8(nrach_indication_fdd_rel13->nrach_ce_level, ppWritePackedMsg, end)); +} + + +static uint8_t pack_nrach_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +{ + nfapi_nrach_indication_body_t* value = (nfapi_nrach_indication_body_t*)tlv; + + if( push8(value->number_of_initial_scs_detected, ppWritePackedMsg, end) == 0) + return 0; + + uint16_t i = 0; + uint16_t total_number_of_initial_scs_detected = value->number_of_initial_scs_detected; + for(; i < total_number_of_initial_scs_detected; ++i) + { + nfapi_nrach_indication_pdu_t* pdu = &(value->nrach_pdu_list[i]); + + //uint8_t* instance_length_p = *ppWritePackedMsg; + //if(!push16(pdu->instance_length, ppWritePackedMsg, end)) + // return 0; + + if(!(pack_tlv(NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, ppWritePackedMsg, end, pack_nrach_indication_rel13_value))) + return 0; + + // calculate the instance length subtracting the size of the instance + // length feild + //uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2; + //push16(instance_length, &instance_length_p, end); + } + + return 1; +} + +static uint8_t pack_nrach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t*)msg; + + return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && + pack_tlv(NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, ppWritePackedMsg, end, &pack_nrach_indication_body_value) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t*)msg; + + return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) && + pushs32(pNfapiMsg->delta_sfn_sf, ppWritePackedMsg, end) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t*)msg; + + return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) && + push32(pNfapiMsg->t2, ppWritePackedMsg, end) && + push32(pNfapiMsg->t3, ppWritePackedMsg, end) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + +static uint8_t pack_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t*)msg; + + return (push32(pNfapiMsg->last_sfn_sf, ppWritePackedMsg, end) && + push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) && + push32(pNfapiMsg->dl_config_jitter, ppWritePackedMsg, end) && + push32(pNfapiMsg->tx_request_jitter, ppWritePackedMsg, end) && + push32(pNfapiMsg->ul_config_jitter, ppWritePackedMsg, end) && + push32(pNfapiMsg->hi_dci0_jitter, ppWritePackedMsg, end) && + pushs32(pNfapiMsg->dl_config_latest_delay, ppWritePackedMsg, end) && + pushs32(pNfapiMsg->tx_request_latest_delay, ppWritePackedMsg, end) && + pushs32(pNfapiMsg->ul_config_latest_delay, ppWritePackedMsg, end) && + pushs32(pNfapiMsg->hi_dci0_latest_delay, ppWritePackedMsg, end) && + pushs32(pNfapiMsg->dl_config_earliest_arrival, ppWritePackedMsg, end) && + pushs32(pNfapiMsg->tx_request_earliest_arrival, ppWritePackedMsg, end) && + pushs32(pNfapiMsg->ul_config_earliest_arrival, ppWritePackedMsg, end) && + pushs32(pNfapiMsg->hi_dci0_earliest_arrival, ppWritePackedMsg, end) && + pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); +} + + +// Main pack function - public + +int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config) +{ + nfapi_p7_message_header_t *pMessageHeader = pMessageBuf; + uint8_t *pWritePackedMessage = pPackedBuf; + uint8_t *pPackedLengthField = &pWritePackedMessage[4]; + uint8_t *end = pPackedBuf + packedBufLen; + + if (pMessageBuf == NULL || pPackedBuf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n"); + return -1; + } + + // process the header + if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) && + push16(pMessageHeader->message_id, &pWritePackedMessage, end) && + push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) && + push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) && + push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) && + push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end))) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n"); + return -1; + } + + if (pMessageHeader->message_id != NFAPI_TIMING_INFO) + { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp); + } + // look for the specific message + uint8_t result = 0; + switch (pMessageHeader->message_id) + { + case NFAPI_DL_CONFIG_REQUEST: + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST\n", __FUNCTION__); + result = pack_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_UL_CONFIG_REQUEST: + result = pack_ul_config_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_HI_DCI0_REQUEST: + result = pack_hi_dci0_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_TX_REQUEST: + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_TX_REQUEST\n", __FUNCTION__); + result = pack_tx_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_HARQ_INDICATION: + result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_CRC_INDICATION: + result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_RX_ULSCH_INDICATION: + //printf("RX ULSCH\n"); + result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_RACH_INDICATION: + result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_SRS_INDICATION: + result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_RX_SR_INDICATION: + result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_RX_CQI_INDICATION: + result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_LBT_DL_CONFIG_REQUEST: + result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_LBT_DL_INDICATION: + result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_NB_HARQ_INDICATION: + result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_NRACH_INDICATION: + result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_DL_NODE_SYNC: + result = pack_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_UL_NODE_SYNC: + result = pack_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config); + break; + + case NFAPI_TIMING_INFO: + result = pack_timing_info(pMessageHeader, &pWritePackedMessage, end, config); + break; + + default: + { + if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && + pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) + { + if(config && config->pack_p7_vendor_extension) + { + result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id); + } + } + break; + } + + if(result == 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n"); + return -1; + } + + // check for a valid message length + uintptr_t msgHead = (uintptr_t)pPackedBuf; + uintptr_t msgEnd = (uintptr_t)pWritePackedMessage; + uint32_t packedMsgLen = msgEnd - msgHead; + uint16_t packedMsgLen16; + if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen); + return -1; + } + else + { + packedMsgLen16 = (uint16_t)packedMsgLen; + } + + // Update the message length in the header + pMessageHeader->message_length = packedMsgLen16; + + if(!push16(packedMsgLen16, &pPackedLengthField, end)) + return -1; + + if(1) + { + //quick test + if(pMessageHeader->message_length != packedMsgLen) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id); + } + } + + return (packedMsgLen); +} + + + +// Unpack routines + +static uint8_t unpack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel8_t* dci_dl_pdu_rel8 = (nfapi_dl_config_dci_dl_pdu_rel8_t*)tlv; + + return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->dci_format, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->cce_idx, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->aggregation_level, end) && + pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_allocation_type, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->virtual_resource_block_assignment_flag, end) && + pull32(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_block_coding, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_1, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_1, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_1, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_to_codeword_swap_flag, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_2, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_2, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_2, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->harq_process, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpmi, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->pmi, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->precoding_information, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpc, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_assignment_index, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->ngap, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_size_index, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_power_offset, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->allocate_prach_flag, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->preamble_index, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->prach_mask_index, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti_type, end) && + pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->transmission_power, end)); + +} + +static uint8_t unpack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel9_t* dci_dl_pdu_rel9 = (nfapi_dl_config_dci_dl_pdu_rel9_t*)tlv; + + return ( pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_flag, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_change_notification, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->scrambling_identity, end)); +} + +static uint8_t unpack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel10_t* dci_dl_pdu_rel10 = (nfapi_dl_config_dci_dl_pdu_rel10_t*)tlv; + + return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->cross_carrier_scheduling_flag, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->carrier_indicator, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_flag, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_request, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->antenna_ports_scrambling_and_layers, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->total_dci_length_including_padding, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->n_dl_rb, end)); +} + +static uint8_t unpack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel11_t* dci_dl_pdu_rel11 = (nfapi_dl_config_dci_dl_pdu_rel11_t*)tlv; + + return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->harq_ack_resource_offset, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->pdsch_re_mapping_quasi_co_location_indicator, end)); +} + +static uint8_t unpack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel12_t* dci_dl_pdu_rel12 = (nfapi_dl_config_dci_dl_pdu_rel12_t*)tlv; + + return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->primary_cell_type, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->ul_dl_configuration_flag, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->number_ul_dl_configurations, end) && + pullarray8(ppReadPackedMsg, dci_dl_pdu_rel12->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, dci_dl_pdu_rel12->number_ul_dl_configurations, end)); +} + +static uint8_t unpack_tpm_value(uint8_t **ppReadPackedMsg, nfapi_dl_config_dci_dl_tpm_t *value, uint8_t *end) +{ + if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) && + pull8(ppReadPackedMsg, &value->number_of_subbands, end) && + pull8(ppReadPackedMsg, &value->num_antennas, end))) + return 0; + + + uint8_t idx = 0; + for(idx = 0; idx < value->number_of_subbands; ++idx) + { + nfapi_dl_config_dci_dl_tpm_subband_info_t* subband_info = &(value->subband_info[idx]); + + if(!(pull8(ppReadPackedMsg, &subband_info->subband_index, end) && + pull8(ppReadPackedMsg, &subband_info->scheduled_ues, end))) + return 0; + + uint8_t antenna_idx = 0; + uint8_t scheduled_ue_idx = 0; + + for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) + { + for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) + { + if(!pull16(ppReadPackedMsg, &(subband_info->precoding_value[antenna_idx][scheduled_ue_idx]), end)) + return 0; + } + } + + } + + + return 1; + +} + + +static uint8_t unpack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dci_dl_pdu_rel13_t* dci_dl_pdu_rel13 = (nfapi_dl_config_dci_dl_pdu_rel13_t*)tlv; + + // If the length is greater than 5 then the TPM struct flag and possiably the TPM structure have been + // added + uint8_t tpm_struct_flag_present = dci_dl_pdu_rel13->tl.length > 5; + dci_dl_pdu_rel13->tpm_struct_flag = 0; + + return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_flag, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_configuration, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->initial_lbt_sf, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->codebook_size_determination, end) && + pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->drms_table_flag, end) && + ( (tpm_struct_flag_present == 1) ? pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm_struct_flag, end) : 1) && + ( (tpm_struct_flag_present == 1 && dci_dl_pdu_rel13->tpm_struct_flag == 1) ? unpack_tpm_value(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm, end) : 1)); + +} + +static uint8_t unpack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_bch_pdu_rel8_t* bch_pdu_rel8 = (nfapi_dl_config_bch_pdu_rel8_t*)tlv; + + return ( pull16(ppReadPackedMsg, &bch_pdu_rel8->length, end) && + pull16(ppReadPackedMsg, &bch_pdu_rel8->pdu_index, end) && + pull16(ppReadPackedMsg, &bch_pdu_rel8->transmission_power, end)); +} + +static uint8_t unpack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_mch_pdu_rel8_t* mch_pdu_rel8 = (nfapi_dl_config_mch_pdu_rel8_t*)tlv; + + return (pull16(ppReadPackedMsg, &mch_pdu_rel8->length, end) && + pull16(ppReadPackedMsg, &mch_pdu_rel8->pdu_index, end) && + pull16(ppReadPackedMsg, &mch_pdu_rel8->rnti, end) && + pull8(ppReadPackedMsg, &mch_pdu_rel8->resource_allocation_type, end) && + pull32(ppReadPackedMsg, &mch_pdu_rel8->resource_block_coding, end) && + pull8(ppReadPackedMsg, &mch_pdu_rel8->modulation, end) && + pull16(ppReadPackedMsg, &mch_pdu_rel8->transmission_power, end) && + pull16(ppReadPackedMsg, &mch_pdu_rel8->mbsfn_area_id, end)); +} + +static uint8_t unpack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel8_t* dlsch_pdu_rel8 = (nfapi_dl_config_dlsch_pdu_rel8_t*)tlv; + + if (!(pull16(ppReadPackedMsg, &dlsch_pdu_rel8->length, end) && + pull16(ppReadPackedMsg, &dlsch_pdu_rel8->pdu_index, end) && + pull16(ppReadPackedMsg, &dlsch_pdu_rel8->rnti, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->resource_allocation_type, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->virtual_resource_block_assignment_flag, end) && + pull32(ppReadPackedMsg, &dlsch_pdu_rel8->resource_block_coding, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->modulation, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->redundancy_version, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_blocks, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_block_to_codeword_swap_flag, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_scheme, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_layers, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_subbands, end) && + pullarray8(ppReadPackedMsg, dlsch_pdu_rel8->codebook_index, NFAPI_MAX_NUM_SUBBANDS, dlsch_pdu_rel8->number_of_subbands, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ue_category_capacity, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->pa, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->delta_power_offset_index, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ngap, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->nprb, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_mode, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_prb_per_subband, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_vector, end))) + return 0; + + uint16_t j = 0; + for(j = 0; j < dlsch_pdu_rel8->num_bf_vector; ++j) + { + if(!(pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].subband_index, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].num_antennas, end) && + pullarray16(ppReadPackedMsg, dlsch_pdu_rel8->bf_vector[j].bf_value, NFAPI_MAX_NUM_ANTENNAS, dlsch_pdu_rel8->bf_vector[j].num_antennas, end))) + return 0; + } + return 1; +} +static uint8_t unpack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel9_t* dlsch_pdu_rel9 = (nfapi_dl_config_dlsch_pdu_rel9_t*)tlv; + return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel9->nscid, end) ); +} +static uint8_t unpack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel10_t* dlsch_pdu_rel10 = (nfapi_dl_config_dlsch_pdu_rel10_t*)tlv; + + return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_flag, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_resource_config_r10, end) && + pull16(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) && + pullarray8(ppReadPackedMsg, dlsch_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel10->pdsch_start, end)) ; +} +static uint8_t unpack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel11_t* dlsch_pdu_rel11 = (nfapi_dl_config_dlsch_pdu_rel11_t*)tlv; + + return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel11->drms_config_flag, end) && + pull16(ppReadPackedMsg, &dlsch_pdu_rel11->drms_scrambling, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel11->csi_config_flag, end) && + pull16(ppReadPackedMsg, &dlsch_pdu_rel11->csi_scrambling, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_flag, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_atenna_ports, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_freq_shift, end)); +} +static uint8_t unpack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel12_t* dlsch_pdu_rel12 = (nfapi_dl_config_dlsch_pdu_rel12_t*)tlv; + + return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel12->altcqi_table_r12, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel12->maxlayers, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel12->n_dl_harq, end)); +} +static uint8_t unpack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_dlsch_pdu_rel13_t* dlsch_pdu_rel13 = (nfapi_dl_config_dlsch_pdu_rel13_t*)tlv; + + return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel13->dwpts_symbols, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel13->initial_lbt_sf, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel13->ue_type, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel13->pdsch_payload_type, end) && + pull16(ppReadPackedMsg, &dlsch_pdu_rel13->initial_transmission_sf_io, end) && + pull8(ppReadPackedMsg, &dlsch_pdu_rel13->drms_table_flag, end)); +} + +static uint8_t unpack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_pch_pdu_rel8_t* pch_pdu_rel8 = (nfapi_dl_config_pch_pdu_rel8_t*)tlv; + + return ( pull16(ppReadPackedMsg, &pch_pdu_rel8->length, end) && + pull16(ppReadPackedMsg, &pch_pdu_rel8->pdu_index, end) && + pull16(ppReadPackedMsg, &pch_pdu_rel8->p_rnti, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->resource_allocation_type, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->virtual_resource_block_assignment_flag, end) && + pull32(ppReadPackedMsg, &pch_pdu_rel8->resource_block_coding, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->mcs, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->redundancy_version, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_transport_blocks, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->transport_block_to_codeword_swap_flag, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->transmission_scheme, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_layers, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->codebook_index, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->ue_category_capacity, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->pa, end) && + pull16(ppReadPackedMsg, &pch_pdu_rel8->transmission_power, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->nprb, end) && + pull8(ppReadPackedMsg, &pch_pdu_rel8->ngap, end)); +} +static uint8_t unpack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_pch_pdu_rel13_t* pch_pdu_rel13 = (nfapi_dl_config_pch_pdu_rel13_t*)tlv; + + return ( pull8(ppReadPackedMsg, &pch_pdu_rel13->ue_mode, end) && + pull16(ppReadPackedMsg, &pch_pdu_rel13->initial_transmission_sf_io, end)); +} + +static uint8_t unpack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_prs_pdu_rel9_t* prs_pdu_rel9 = (nfapi_dl_config_prs_pdu_rel9_t*)tlv; + + return ( pull16(ppReadPackedMsg, &prs_pdu_rel9->transmission_power, end) && + pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_bandwidth, end) && + pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_cyclic_prefix_type, end) && + pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_muting, end)); +} + +static uint8_t unpack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_csi_rs_pdu_rel10_t* csi_rs_pdu_rel10 = (nfapi_dl_config_csi_rs_pdu_rel10_t*)tlv; + + return ( pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_antenna_port_count_r10, end) && + pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_resource_config_r10, end) && + pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->transmission_power, end) && + pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) && + pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end) && + pullarray8(ppReadPackedMsg, csi_rs_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end)); +} + +static uint8_t unpack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_csi_rs_pdu_rel13_t* csi_rs_pdu_rel13 = (nfapi_dl_config_csi_rs_pdu_rel13_t*)tlv; + + if (!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->csi_rs_class, end) && + pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->cdm_type, end) && + pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->num_bf_vector, end))) + return 0; + + + uint16_t idx =0; + for(idx = 0; idx < csi_rs_pdu_rel13->num_bf_vector; ++idx) + { + if(!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].csi_rs_resource_index, end))) + return 0; + NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : HOW TO DECODE BF VALUE \n"); + //pullarray16(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].bf_vector, ??); + } + return 1; +} + +static uint8_t unpack_dl_config_epdcch_params_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_epdcch_parameters_rel11_t* epdcch_params_rel11 = (nfapi_dl_config_epdcch_parameters_rel11_t*)tlv; + + return (pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_resource_assignment_flag, end) && + pull16(ppReadPackedMsg, &epdcch_params_rel11->epdcch_id, end) && + pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_start_symbol, end) && + pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_num_prb, end) && + pullarray8(ppReadPackedMsg, epdcch_params_rel11->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, epdcch_params_rel11->epdcch_num_prb, end) && + pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.subband_index, end) && + pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.num_antennas, end) && + pullarray16(ppReadPackedMsg, epdcch_params_rel11->bf_vector.bf_value, NFAPI_MAX_NUM_ANTENNAS, epdcch_params_rel11->bf_vector.num_antennas, end)); +} + +static uint8_t unpack_dl_config_epdcch_params_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_epdcch_parameters_rel13_t* epdcch_params_rel13 = (nfapi_dl_config_epdcch_parameters_rel13_t*)tlv; + + return ( pull8(ppReadPackedMsg, &epdcch_params_rel13->dwpts_symbols, end) && + pull8(ppReadPackedMsg, &epdcch_params_rel13->initial_lbt_sf, end)); +} + +static uint8_t unpack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_mpdcch_pdu_rel13_t* mpdcch_params_rel13 = (nfapi_dl_config_mpdcch_pdu_rel13_t*)tlv; + + + return ( pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_narrow_band, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_prb_pairs, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_assignment, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_tansmission_type, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->start_symbol, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->ecce_index, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->aggregation_level, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->rnti_type, end) && + pull16(ppReadPackedMsg, &mpdcch_params_rel13->rnti, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->ce_mode, end) && + pull16(ppReadPackedMsg, &mpdcch_params_rel13->drms_scrambling_init, end) && + pull16(ppReadPackedMsg, &mpdcch_params_rel13->initial_transmission_sf_io, end) && + pull16(ppReadPackedMsg, &mpdcch_params_rel13->transmission_power, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_format, end) && + pull16(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_coding, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->mcs, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->pdsch_reptition_levels, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->redundancy_version, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->new_data_indicator, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_process, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi_length, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi_flag, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_resource_offset, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_subframe_repetition_number, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpc, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index_length, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->allocate_prach_flag, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->preamble_index, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->prach_mask_index, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->starting_ce_level, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->srs_request, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity_flag, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->frequency_hopping_enabled_flag, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->paging_direct_indication_differentiation_flag, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->direct_indication, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->total_dci_length_including_padding, end) && + pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_tx_antenna_ports, end) && + pullarray16(ppReadPackedMsg, mpdcch_params_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_params_rel13->number_of_tx_antenna_ports, end)); +} + + +static uint8_t unpack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_nbch_pdu_rel13_t* nbch_params_rel13 = (nfapi_dl_config_nbch_pdu_rel13_t*)tlv; + + return ( pull16(ppReadPackedMsg, &nbch_params_rel13->length, end) && + pull16(ppReadPackedMsg, &nbch_params_rel13->pdu_index, end) && + pull16(ppReadPackedMsg, &nbch_params_rel13->transmission_power, end) && + pull16(ppReadPackedMsg, &nbch_params_rel13->hyper_sfn_2_lsbs, end)); +} + +static uint8_t unpack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_npdcch_pdu_rel13_t* npdcch_params_rel13 = (nfapi_dl_config_npdcch_pdu_rel13_t*)tlv; + + return ( pull16(ppReadPackedMsg, &npdcch_params_rel13->length, end) && + pull16(ppReadPackedMsg, &npdcch_params_rel13->pdu_index, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->ncce_index, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->aggregation_level, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->start_symbol, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->rnti_type, end) && + pull16(ppReadPackedMsg, &npdcch_params_rel13->rnti, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->scrambling_reinitialization_batch_index, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_format, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->scheduling_delay, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->resource_assignment, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->repetition_number, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->mcs, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->new_data_indicator, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->harq_ack_resource, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->npdcch_order_indication, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->starting_number_of_nprach_repetitions, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->subcarrier_indication_of_nprach, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->paging_direct_indication_differentation_flag, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->direct_indication, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_subframe_repetition_number, end) && + pull8(ppReadPackedMsg, &npdcch_params_rel13->total_dci_length_including_padding, end)); +} + +static uint8_t unpack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_dl_config_ndlsch_pdu_rel13_t* ndlsch_params_rel13 = (nfapi_dl_config_ndlsch_pdu_rel13_t*)tlv; + + return ( pull16(ppReadPackedMsg, &ndlsch_params_rel13->length, end) && + pull16(ppReadPackedMsg, &ndlsch_params_rel13->pdu_index, end) && + pull8(ppReadPackedMsg, &ndlsch_params_rel13->start_symbol, end) && + pull8(ppReadPackedMsg, &ndlsch_params_rel13->rnti_type, end) && + pull16(ppReadPackedMsg, &ndlsch_params_rel13->rnti, end) && + pull16(ppReadPackedMsg, &ndlsch_params_rel13->resource_assignment, end) && + pull16(ppReadPackedMsg, &ndlsch_params_rel13->repetition_number, end) && + pull8(ppReadPackedMsg, &ndlsch_params_rel13->modulation, end) && + pull8(ppReadPackedMsg, &ndlsch_params_rel13->number_of_subframes_for_resource_assignment, end) && + pull8(ppReadPackedMsg, &ndlsch_params_rel13->scrambling_sequence_initialization_cinit, end) && + pull16(ppReadPackedMsg, &ndlsch_params_rel13->sf_idx, end) && + pull8(ppReadPackedMsg, &ndlsch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end)); +} + + +static uint8_t unpack_dl_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_dl_config_request_body_t* value = (nfapi_dl_config_request_body_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->number_pdcch_ofdm_symbols, end) && + pull8(ppReadPackedMsg, &value->number_dci, end) && + pull16(ppReadPackedMsg, &value->number_pdu, end) && + pull8(ppReadPackedMsg, &value->number_pdsch_rnti, end) && + pull16(ppReadPackedMsg, &value->transmission_power_pcfich, end))) + return 0; + + if(value->number_pdu > NFAPI_DL_CONFIG_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_pdu, NFAPI_DL_CONFIG_MAX_PDU); + return 0; + } + + if(value->number_pdu) + { + value->dl_config_pdu_list = (nfapi_dl_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_dl_config_request_pdu_t) * value->number_pdu, config); + if(value->dl_config_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate dl config pdu list (count:%d)\n", __FUNCTION__, value->number_pdu); + return 0; + } + } + else + { + value->dl_config_pdu_list = 0; + } + + uint16_t i; + uint16_t total_number_of_pdus = value->number_pdu; + for(i = 0; i < total_number_of_pdus; ++i) + { + nfapi_dl_config_request_pdu_t* pdu = &(value->dl_config_pdu_list[i]); + + if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) && + pull8(ppReadPackedMsg, &pdu->pdu_size, end))) + return 0; + + uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2; + + if(packedPduEnd > end) + { + // pdu end of beyond buffer end + return 0; + } + + switch(pdu->pdu_type) + { + case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value}, + { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value}, + { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value}, + { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value}, + { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value}, + { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_DL_CONFIG_BCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, &unpack_dl_config_bch_pdu_rel8_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_DL_CONFIG_MCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, &unpack_dl_config_mch_pdu_rel8_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, &unpack_dl_config_dlsch_pdu_rel8_value}, + { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, &unpack_dl_config_dlsch_pdu_rel9_value}, + { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, &unpack_dl_config_dlsch_pdu_rel10_value}, + { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, &unpack_dl_config_dlsch_pdu_rel11_value}, + { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, &unpack_dl_config_dlsch_pdu_rel12_value}, + { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, &unpack_dl_config_dlsch_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_DL_CONFIG_PCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, &unpack_dl_config_pch_pdu_rel8_value}, + { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, &unpack_dl_config_pch_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_DL_CONFIG_PRS_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, &unpack_dl_config_prs_pdu_rel9_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, &unpack_dl_config_csi_rs_pdu_rel10_value}, + { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, &unpack_dl_config_csi_rs_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value}, + { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value}, + { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value}, + { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value}, + { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value}, + { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value}, + { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, &unpack_dl_config_epdcch_params_rel11_value}, + { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, &unpack_dl_config_epdcch_params_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, &unpack_dl_config_mpdcch_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, &unpack_dl_config_nbch_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, &unpack_dl_config_npdcch_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + + } + break; + case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, &unpack_dl_config_ndlsch_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + + } + break; + default: + // Need to log an error + break; + } + } + + return 1; +} + +static uint8_t unpack_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, &unpack_dl_config_request_body_value}, + }; + + return ( pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_ul_config_ulsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_ulsch_pdu_rel8_t* ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t*)tlv; + + return (pull32(ppReadPackedMsg, &ulsch_pdu_rel8->handle, end) && + pull16(ppReadPackedMsg, &ulsch_pdu_rel8->size, end) && + pull16(ppReadPackedMsg, &ulsch_pdu_rel8->rnti, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->resource_block_start, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->number_of_resource_blocks, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->modulation_type, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->cyclic_shift_2_for_drms, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_enabled_flag, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_bits, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->new_data_indication, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->redundancy_version, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->harq_process_number, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->ul_tx_mode, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->current_tx_nb, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel8->n_srs, end )); +} +static uint8_t unpack_ul_config_ulsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_ulsch_pdu_rel10_t* ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t*)tlv; + + return (pull8(ppReadPackedMsg, &ulsch_pdu_rel10->resource_allocation_type, end) && + pull32(ppReadPackedMsg, &ulsch_pdu_rel10->resource_block_coding, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transport_blocks, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transmission_scheme, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel10->number_of_layers, end) & + pull8(ppReadPackedMsg, &ulsch_pdu_rel10->codebook_index, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel10->disable_sequence_hopping_flag, end)); +} +static uint8_t unpack_ul_config_ulsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_ulsch_pdu_rel11_t* ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t*)tlv; + + return ( pull8(ppReadPackedMsg, &ulsch_pdu_rel11->virtual_cell_id_enabled_flag, end) && + pull16(ppReadPackedMsg, &ulsch_pdu_rel11->npusch_identity, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel11->dmrs_config_flag, end) && + pull16(ppReadPackedMsg, &ulsch_pdu_rel11->ndmrs_csh_identity, end)); +} +static uint8_t unpack_ul_config_ulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_ulsch_pdu_rel13_t* ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t*)tlv; + + return (pull8(ppReadPackedMsg, &ulsch_pdu_rel13->ue_type, end) && + pull16(ppReadPackedMsg, &ulsch_pdu_rel13->total_number_of_repetitions, end) && + pull16(ppReadPackedMsg, &ulsch_pdu_rel13->repetition_number, end) && + pull16(ppReadPackedMsg, &ulsch_pdu_rel13->initial_transmission_sf_io, end) && + pull8(ppReadPackedMsg, &ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, end)); +} +static uint8_t unpack_ul_config_cqi_ri_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_ri_information_rel8_t* cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t*)tlv; + + return (pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, end) && + pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, end) && + pull8(ppReadPackedMsg, &cqi_ri_info_rel8->ri_size, end) && + pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_cqi, end) && + pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_ri, end)); +} + +static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_ri_information_rel9_t* cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->report_type, end) && + pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_cqi, end) && + pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_ri, end))) + return 0; + + switch(cqi_ri_info_rel9->report_type) + { + case NFAPI_CSI_REPORT_TYPE_PERIODIC: + { + if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, end) && + pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, end))) + return 0; + } + break; + case NFAPI_CSI_REPORT_TYPE_APERIODIC: + { + if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, end) ==0) + return 0; + + uint8_t i; + for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) + { + if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0) + return 0; + + uint8_t j; + for(j = 0; j < 8; ++j) + { + if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], end) == 0) + return 0; + } + } + } + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type ); + return 0; + } + break; + }; + return 1; +} + +// NOTE : This function is a little unconventional as we uese the side to +// determine the report type +static uint8_t unpack_ul_config_cqi_ri_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_ri_information_rel13_t* cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t*)tlv; + if(cqi_ri_info_rel13->tl.length == 0) + { + cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_APERIODIC; + } + else + { + cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_PERIODIC; + if(pull16(ppReadPackedMsg, &cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, end) == 0) + return 0; + } + return 1; +} +static uint8_t unpack_ul_config_cqi_init_tx_params_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_initial_transmission_parameters_rel8_t* init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t*)tlv; + + return (pull8(ppReadPackedMsg, &init_tx_params_rel8->n_srs_initial, end) && + pull8(ppReadPackedMsg, &init_tx_params_rel8->initial_number_of_resource_blocks, end)); +} +static uint8_t unpack_ul_config_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_ulsch_harq_information_rel10_t* harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t*)tlv; + + return (pull8(ppReadPackedMsg, &harq_info_rel10->harq_size, end) && + pull8(ppReadPackedMsg, &harq_info_rel10->delta_offset_harq, end) && + pull8(ppReadPackedMsg, &harq_info_rel10->ack_nack_mode, end)); +} + +static uint8_t unpack_ul_config_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_ulsch_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t*)tlv; + + return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) && + pull8(ppReadPackedMsg, &harq_info_rel13->delta_offset_harq_2, end)); +} + +static uint8_t unpack_ul_config_ue_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_ue_information_rel8_t* ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t*)tlv; + + return (pull32(ppReadPackedMsg, &ue_info_rel8->handle, end) && + pull16(ppReadPackedMsg, &ue_info_rel8->rnti, end)); +} +static uint8_t unpack_ul_config_ue_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_ue_information_rel11_t* ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t*)tlv; + + return (pull8(ppReadPackedMsg, &ue_info_rel11->virtual_cell_id_enabled_flag, end) && + pull16(ppReadPackedMsg, &ue_info_rel11->npusch_identity, end)); +} +static uint8_t unpack_ul_config_ue_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_ue_information_rel13_t* ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t*)tlv; + + return (pull8(ppReadPackedMsg, &ue_info_rel13->ue_type, end) && + pull8(ppReadPackedMsg, &ue_info_rel13->empty_symbols, end) && + pull16(ppReadPackedMsg, &ue_info_rel13->total_number_of_repetitions, end) && + pull16(ppReadPackedMsg, &ue_info_rel13->repetition_number, end)); +} + +static uint8_t unpack_ul_config_cqi_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_information_rel8_t* cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t*)tlv; + + return ( pull16(ppReadPackedMsg, &cqi_info_rel8->pucch_index, end) && + pull8(ppReadPackedMsg, &cqi_info_rel8->dl_cqi_pmi_size, end)); +} +static uint8_t unpack_ul_config_cqi_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_information_rel10_t* cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t*)tlv; + + return (pull8(ppReadPackedMsg, &cqi_info_rel10->number_of_pucch_resource, end) && + pull16(ppReadPackedMsg, &cqi_info_rel10->pucch_index_p1, end)); +} +static uint8_t unpack_ul_config_cqi_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_cqi_information_rel13_t* cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t*)tlv; + + return (pull8(ppReadPackedMsg, &cqi_info_rel13->csi_mode, end) && + pull16(ppReadPackedMsg, &cqi_info_rel13->dl_cqi_pmi_size_2, end) && + pull8(ppReadPackedMsg, &cqi_info_rel13->starting_prb, end) && + pull8(ppReadPackedMsg, &cqi_info_rel13->n_prb, end) && + pull8(ppReadPackedMsg, &cqi_info_rel13->cdm_index, end) && + pull8(ppReadPackedMsg, &cqi_info_rel13->n_srs, end)); +} + +static uint8_t unpack_ul_config_sr_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_sr_information_rel8_t* sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t*)tlv; + + return ( pull16(ppReadPackedMsg, &sr_info_rel8->pucch_index, end)); +} + +static uint8_t unpack_ul_config_sr_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_sr_information_rel10_t* sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t*)tlv; + + return (pull8(ppReadPackedMsg, &sr_info_rel10->number_of_pucch_resources, end) && + pull16(ppReadPackedMsg, &sr_info_rel10->pucch_index_p1, end)); +} + +static uint8_t unpack_ul_config_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_harq_information_rel10_tdd_t* harq_info_tdd_rel10 = (nfapi_ul_config_harq_information_rel10_tdd_t*)tlv; + + return (pull8(ppReadPackedMsg, &harq_info_tdd_rel10->harq_size, end) && + pull8(ppReadPackedMsg, &harq_info_tdd_rel10->ack_nack_mode, end) && + pull8(ppReadPackedMsg, &harq_info_tdd_rel10->number_of_pucch_resources, end) && + pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_0, end) && + pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_1, end) && + pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_2, end) && + pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_3, end)); +} + +static uint8_t unpack_ul_config_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_harq_information_rel8_fdd_t* harq_info_fdd_rel8 = (nfapi_ul_config_harq_information_rel8_fdd_t*)tlv; + + return (pull16(ppReadPackedMsg, &harq_info_fdd_rel8->n_pucch_1_0, end) && + pull8(ppReadPackedMsg, &harq_info_fdd_rel8->harq_size, end)); +} + +static uint8_t unpack_ul_config_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_harq_information_rel9_fdd_t* harq_info_fdd_rel9 = (nfapi_ul_config_harq_information_rel9_fdd_t*)tlv; + + return (pull8(ppReadPackedMsg, &harq_info_fdd_rel9->harq_size, end) && + pull8(ppReadPackedMsg, &harq_info_fdd_rel9->ack_nack_mode, end) && + pull8(ppReadPackedMsg, &harq_info_fdd_rel9->number_of_pucch_resources, end) && + pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_0, end) && + pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_1, end) && + pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_2, end) && + pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_3, end)); +} + +static uint8_t unpack_ul_config_harq_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_harq_information_rel11_t* harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t*)tlv; + + return (pull8(ppReadPackedMsg, &harq_info_rel11->num_ant_ports, end) && + pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_0, end) && + pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_1, end) && + pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_2, end) && + pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_3, end)); +} + +static uint8_t unpack_ul_config_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t*)tlv; + + return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) && + pull8(ppReadPackedMsg, &harq_info_rel13->starting_prb, end) && + pull8(ppReadPackedMsg, &harq_info_rel13->n_prb, end) && + pull8(ppReadPackedMsg, &harq_info_rel13->cdm_index, end) && + pull8(ppReadPackedMsg, &harq_info_rel13->n_srs, end)); +} + + +static uint8_t unpack_ul_config_srs_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_srs_pdu_rel8_t* srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t*)tlv; + + return (pull32(ppReadPackedMsg, &srs_pdu_rel8->handle, end) && + pull16(ppReadPackedMsg, &srs_pdu_rel8->size, end) && + pull16(ppReadPackedMsg, &srs_pdu_rel8->rnti, end) && + pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_bandwidth, end) && + pull8(ppReadPackedMsg, &srs_pdu_rel8->frequency_domain_position, end) && + pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_hopping_bandwidth, end) && + pull8(ppReadPackedMsg, &srs_pdu_rel8->transmission_comb, end) && + pull16(ppReadPackedMsg, &srs_pdu_rel8->i_srs, end) && + pull8(ppReadPackedMsg, &srs_pdu_rel8->sounding_reference_cyclic_shift, end)); +} + +static uint8_t unpack_ul_config_srs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_srs_pdu_rel10_t* srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t*)tlv; + return pull8(ppReadPackedMsg, &srs_pdu_rel10->antenna_port, end); +} + +static uint8_t unpack_ul_config_srs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_srs_pdu_rel13_t* srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t*)tlv; + + return (pull8(ppReadPackedMsg, &srs_pdu_rel13->number_of_combs, end)); +} + +static uint8_t unpack_ul_nb_harq_info_rel13_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_nb_harq_information_rel13_fdd_t* nb_harq_info_fdd_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t*)tlv; + + return (pull8(ppReadPackedMsg, &nb_harq_info_fdd_rel13->harq_ack_resource, end)); +} + +static uint8_t unpack_ul_config_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_nulsch_pdu_rel13_t* nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &nulsch_pdu_rel13->nulsch_format, end) && + pull32(ppReadPackedMsg, &nulsch_pdu_rel13->handle, end) && + pull16(ppReadPackedMsg, &nulsch_pdu_rel13->size, end) && + pull16(ppReadPackedMsg, &nulsch_pdu_rel13->rnti, end) && + pull8(ppReadPackedMsg, &nulsch_pdu_rel13->subcarrier_indication, end) && + pull8(ppReadPackedMsg, &nulsch_pdu_rel13->resource_assignment, end) && + pull8(ppReadPackedMsg, &nulsch_pdu_rel13->mcs, end) && + pull8(ppReadPackedMsg, &nulsch_pdu_rel13->redudancy_version, end) && + pull8(ppReadPackedMsg, &nulsch_pdu_rel13->repetition_number, end) && + pull8(ppReadPackedMsg, &nulsch_pdu_rel13->new_data_indication, end) && + pull8(ppReadPackedMsg, &nulsch_pdu_rel13->n_srs, end) && + pull16(ppReadPackedMsg, &nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, end) && + pull16(ppReadPackedMsg, &nulsch_pdu_rel13->sf_idx, end))) + return 0; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value}, + { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value}, + { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value}, + { NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, &unpack_ul_nb_harq_info_rel13_fdd_value}, + }; + + return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, 0, 0); +} + +static uint8_t unpack_ul_config_nrach_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_config_nrach_pdu_rel13_t* nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t*)tlv; + + return (pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_0, end) && + pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_1, end) && + pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_2, end)); +} + + +static uint8_t unpack_ul_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + #define UL_CONFIG_ULSCH_PDU_UNPACK_FNS(_pdu) \ + { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &_pdu.ulsch_pdu_rel8, &unpack_ul_config_ulsch_pdu_rel8_value}, \ + { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &_pdu.ulsch_pdu_rel10, &unpack_ul_config_ulsch_pdu_rel10_value}, \ + { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &_pdu.ulsch_pdu_rel11, &unpack_ul_config_ulsch_pdu_rel11_value}, \ + { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &_pdu.ulsch_pdu_rel13, &unpack_ul_config_ulsch_pdu_rel13_value}, + + #define UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(_pdu) \ + { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &_pdu.cqi_ri_information_rel8, &unpack_ul_config_cqi_ri_info_rel8_value}, \ + { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &_pdu.cqi_ri_information_rel9, &unpack_ul_config_cqi_ri_info_rel9_value}, \ + { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &_pdu.cqi_ri_information_rel13, &unpack_ul_config_cqi_ri_info_rel13_value}, + + #define UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(_pdu) \ + { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &_pdu.harq_information_rel10, &unpack_ul_config_ulsch_harq_info_rel10_value},\ + { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_ulsch_harq_info_rel13_value}, + + #define UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(_pdu) \ + { NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &_pdu.initial_transmission_parameters_rel8, &unpack_ul_config_cqi_init_tx_params_rel8_value}, + + #define UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(_pdu) \ + { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &_pdu.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value}, \ + { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &_pdu.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value}, \ + { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &_pdu.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value}, + + #define UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(_pdu) \ + { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &_pdu.cqi_information_rel8, &unpack_ul_config_cqi_info_rel8_value}, \ + { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &_pdu.cqi_information_rel10, &unpack_ul_config_cqi_info_rel10_value}, \ + { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &_pdu.cqi_information_rel13, &unpack_ul_config_cqi_info_rel13_value}, + + #define UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(_pdu) \ + { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &_pdu.sr_information_rel8, &unpack_ul_config_sr_info_rel8_value}, \ + { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &_pdu.sr_information_rel10, &unpack_ul_config_sr_info_rel10_value}, + + #define UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(_pdu) \ + { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &_pdu.harq_information_rel10_tdd, &unpack_ul_config_harq_info_rel10_tdd_value}, \ + { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &_pdu.harq_information_rel8_fdd, &unpack_ul_config_harq_info_rel8_fdd_value}, \ + { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &_pdu.harq_information_rel9_fdd, &unpack_ul_config_harq_info_rel9_fdd_value}, \ + { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &_pdu.harq_information_rel11, &unpack_ul_config_harq_info_rel11_value}, \ + { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_harq_info_rel13_value}, + + #define UL_CONFIG_SRS_PDU_UNPACK_FNS(_pdu) \ + { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &_pdu.srs_pdu_rel8, &unpack_ul_config_srs_pdu_rel8_value}, \ + { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &_pdu.srs_pdu_rel10, &unpack_ul_config_srs_pdu_rel10_value}, \ + { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &_pdu.srs_pdu_rel13, &unpack_ul_config_srs_pdu_rel13_value}, + + #define UL_CONFIG_NULSCH_PDU_UNPACK_FNS(_pdu) \ + { NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &_pdu.nulsch_pdu_rel13, &unpack_ul_config_nulsch_pdu_rel13_value}, + + #define UL_CONFIG_NRACH_PDU_UNPACK_FNS(_pdu) \ + { NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &_pdu.nrach_pdu_rel13, &unpack_ul_config_nrach_pdu_rel13_value}, + + + nfapi_ul_config_request_body_t* value = (nfapi_ul_config_request_body_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->number_of_pdus, end) && + pull8(ppReadPackedMsg, &value->rach_prach_frequency_resources, end) && + pull8(ppReadPackedMsg, &value->srs_present, end))) + return 0; + + if(value->number_of_pdus > NFAPI_UL_CONFIG_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of ul config pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_UL_CONFIG_MAX_PDU); + return 0; + } + + if(value->number_of_pdus > 0) + { + value->ul_config_pdu_list = (nfapi_ul_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_ul_config_request_pdu_t) * value->number_of_pdus, config); + + if(value->ul_config_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate ul config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus); + return 0; + } + } + else + { + value->ul_config_pdu_list = 0; + } + + + uint16_t i; + uint16_t total_number_of_pdus = value->number_of_pdus; + for(i = 0; i < total_number_of_pdus; ++i) + { + nfapi_ul_config_request_pdu_t* pdu = &(value->ul_config_pdu_list[i]); + + if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) && + pull8(ppReadPackedMsg, &pdu->pdu_size, end))) + return 0; + + uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2; + + if(packedPduEnd > end) + { + // pdu end is past buffer end + return 0; + } + + switch(pdu->pdu_type) + { + case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_pdu) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + + case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.ulsch_pdu) + UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.cqi_ri_information) + UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_harq_pdu.ulsch_pdu) + UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_harq_pdu.harq_information) + UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_harq_pdu.initial_transmission_parameters) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu) + UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information) + UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.harq_information) + UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.ue_information) + UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.cqi_information) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_pdu.ue_information) + UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_pdu.sr_information) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_harq_pdu.ue_information) + UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_harq_pdu.harq_information) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.ue_information) + UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.sr_information) + UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.harq_information) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.ue_information) + UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.cqi_information) + UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.harq_information) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.ue_information) + UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.cqi_information) + UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.sr_information) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.ue_information) + UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.cqi_information) + UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.sr_information) + UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.harq_information) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_SRS_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_SRS_PDU_UNPACK_FNS(pdu->srs_pdu) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->harq_buffer_pdu.ue_information) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.ulsch_pdu) + UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.csi_information) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.ulsch_pdu) + UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.harq_information) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu) + UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.csi_information) + UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.harq_information) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_NULSCH_PDU_UNPACK_FNS(pdu->nulsch_pdu) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + UL_CONFIG_NRACH_PDU_UNPACK_FNS(pdu->nrach_pdu) + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + } + } + return 1; +} + + +static uint8_t unpack_ul_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, &unpack_ul_config_request_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_hi_dci0_hi_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_hi_pdu_rel8_t* hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t*)tlv; + + return( pull8(ppReadPackedMsg, &hi_pdu_rel8->resource_block_start, end) && + pull8(ppReadPackedMsg, &hi_pdu_rel8->cyclic_shift_2_for_drms, end) && + pull8(ppReadPackedMsg, &hi_pdu_rel8->hi_value, end) && + pull8(ppReadPackedMsg, &hi_pdu_rel8->i_phich, end) && + pull16(ppReadPackedMsg, &hi_pdu_rel8->transmission_power, end)); +} + +static uint8_t unpack_hi_dci0_hi_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_hi_pdu_rel10_t* hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t*)tlv; + + return (pull8(ppReadPackedMsg, &hi_pdu_rel10->flag_tb2, end) && + pull8(ppReadPackedMsg, &hi_pdu_rel10->hi_value_2, end)); +} + +static uint8_t unpack_hi_dci0_dci_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_dci_pdu_rel8_t* dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t*)tlv; + + return (pull8(ppReadPackedMsg, &dci_pdu_rel8->dci_format, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->cce_index, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->aggregation_level, end) && + pull16(ppReadPackedMsg, &dci_pdu_rel8->rnti, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->resource_block_start, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->number_of_resource_block, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->mcs_1, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->cyclic_shift_2_for_drms, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_enabled_flag, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_bits, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->new_data_indication_1, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->ue_tx_antenna_seleciton, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->tpc, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->cqi_csi_request, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->ul_index, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel8->dl_assignment_index, end) && + pull32(ppReadPackedMsg, &dci_pdu_rel8->tpc_bitmap, end) && + pull16(ppReadPackedMsg, &dci_pdu_rel8->transmission_power, end)); +} + +static uint8_t unpack_hi_dci0_dci_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_dci_pdu_rel10_t* dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t*)tlv; + + return (pull8(ppReadPackedMsg, &dci_pdu_rel10->cross_carrier_scheduling_flag, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->carrier_indicator, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->size_of_cqi_csi_feild, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_flag, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_request, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_flag, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_type, end) && + pull32(ppReadPackedMsg, &dci_pdu_rel10->resource_block_coding, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->mcs_2, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->new_data_indication_2, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->number_of_antenna_ports, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->tpmi, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->total_dci_length_including_padding, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel10->n_ul_rb, end)); +} + +static uint8_t unpack_hi_dci0_dci_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_dci_pdu_rel12_t* dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t*)tlv; + + return ( pull8(ppReadPackedMsg, &dci_pdu_rel12->pscch_resource, end) && + pull8(ppReadPackedMsg, &dci_pdu_rel12->time_resource_pattern, end)); +} + +static uint8_t unpack_hi_dci0_mpdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t* value = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t*)tlv; + + return (pull8(ppReadPackedMsg, &value->mpdcch_narrowband, end) && + pull8(ppReadPackedMsg, &value->number_of_prb_pairs, end) && + pull8(ppReadPackedMsg, &value->resource_block_assignment, end) && + pull8(ppReadPackedMsg, &value->mpdcch_transmission_type, end) && + pull8(ppReadPackedMsg, &value->start_symbol, end) && + pull8(ppReadPackedMsg, &value->ecce_index, end) && + pull8(ppReadPackedMsg, &value->aggreagation_level, end) && + pull8(ppReadPackedMsg, &value->rnti_type, end) && + pull16(ppReadPackedMsg, &value->rnti, end) && + pull8(ppReadPackedMsg, &value->ce_mode, end) && + pull16(ppReadPackedMsg, &value->drms_scrambling_init, end) && + pull16(ppReadPackedMsg, &value->initial_transmission_sf_io, end) && + pull16(ppReadPackedMsg, &value->transmission_power, end) && + pull8(ppReadPackedMsg, &value->dci_format, end) && + pull8(ppReadPackedMsg, &value->resource_block_start, end) && + pull8(ppReadPackedMsg, &value->number_of_resource_blocks, end) && + pull8(ppReadPackedMsg, &value->mcs, end) && + pull8(ppReadPackedMsg, &value->pusch_repetition_levels, end) && + pull8(ppReadPackedMsg, &value->frequency_hopping_flag, end) && + pull8(ppReadPackedMsg, &value->new_data_indication, end) && + pull8(ppReadPackedMsg, &value->harq_process, end) && + pull8(ppReadPackedMsg, &value->redudency_version, end) && + pull8(ppReadPackedMsg, &value->tpc, end) && + pull8(ppReadPackedMsg, &value->csi_request, end) && + pull8(ppReadPackedMsg, &value->ul_inex, end) && + pull8(ppReadPackedMsg, &value->dai_presence_flag, end) && + pull8(ppReadPackedMsg, &value->dl_assignment_index, end) && + pull8(ppReadPackedMsg, &value->srs_request, end) && + pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end) && + pull32(ppReadPackedMsg, &value->tcp_bitmap, end) && + pull8(ppReadPackedMsg, &value->total_dci_length_include_padding, end) && + pull8(ppReadPackedMsg, &value->number_of_tx_antenna_ports, end) && + pullarray16(ppReadPackedMsg, value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, end)); +} + +static uint8_t unpack_hi_dci0_npdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_hi_dci0_npdcch_dci_pdu_rel13_t* value = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t*)tlv; + + return (pull8(ppReadPackedMsg, &value->ncce_index, end) && + pull8(ppReadPackedMsg, &value->aggregation_level, end) && + pull8(ppReadPackedMsg, &value->start_symbol, end) && + pull16(ppReadPackedMsg, &value->rnti, end) && + pull8(ppReadPackedMsg, &value->scrambling_reinitialization_batch_index, end) && + pull8(ppReadPackedMsg, &value->nrs_antenna_ports_assumed_by_the_ue, end) && + pull8(ppReadPackedMsg, &value->subcarrier_indication, end) && + pull8(ppReadPackedMsg, &value->resource_assignment, end) && + pull8(ppReadPackedMsg, &value->scheduling_delay, end) && + pull8(ppReadPackedMsg, &value->mcs, end) && + pull8(ppReadPackedMsg, &value->redudancy_version, end) && + pull8(ppReadPackedMsg, &value->repetition_number, end) && + pull8(ppReadPackedMsg, &value->new_data_indicator, end) && + pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end)); +} + +static uint8_t unpack_hi_dci0_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_hi_dci0_request_body_t* value = (nfapi_hi_dci0_request_body_t*)tlv; + + if(!(pull16(ppReadPackedMsg, &value->sfnsf, end) && + pull8(ppReadPackedMsg, &value->number_of_dci, end) && + pull8(ppReadPackedMsg, &value->number_of_hi, end))) + return 0; + + uint8_t totalNumPdus = value->number_of_hi + value->number_of_dci; + + if(totalNumPdus > NFAPI_HI_DCI0_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dci0 pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, totalNumPdus, NFAPI_HI_DCI0_MAX_PDU); + return 0; + } + + if(totalNumPdus > 0) + { + value->hi_dci0_pdu_list = (nfapi_hi_dci0_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_hi_dci0_request_pdu_t) * totalNumPdus, config); + if(value->hi_dci0_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate hi dci0 pdu list (count:%d)\n", __FUNCTION__, totalNumPdus); + return 0; + } + } + else + { + value->hi_dci0_pdu_list = 0; + } + + uint8_t i; + for(i = 0; i < totalNumPdus; ++i) + { + nfapi_hi_dci0_request_pdu_t* pdu = &(value->hi_dci0_pdu_list[i]); + + if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) && + pull8(ppReadPackedMsg, &pdu->pdu_size, end))) + return 0; + + uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2; + + if(packedPduEnd > end) + { + // pdu end if past buffer end + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pdu size to big %d %d\n", __FUNCTION__, packedPduEnd, end); + return 0; + } + + switch(pdu->pdu_type) + { + case NFAPI_HI_DCI0_HI_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, &unpack_hi_dci0_hi_pdu_rel8_value}, + { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, &unpack_hi_dci0_hi_pdu_rel10_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_HI_DCI0_DCI_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value}, + { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value}, + { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, &unpack_hi_dci0_dci_pdu_rel12_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value}, + { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value}, + { NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, &unpack_dl_config_epdcch_params_rel11_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, &unpack_hi_dci0_mpdcch_dci_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, &unpack_hi_dci0_npdcch_dci_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type ); + } + break; + }; + } + + return 1; +} + +static uint8_t unpack_hi_dci0_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, &unpack_hi_dci0_request_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); + +} + +static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + uint8_t proceed = 1; + nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg; + + if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0) + return 0; + + while (((uint8_t*)(*ppReadPackedMsg) < end) && proceed) + { + nfapi_tl_t generic_tl; + if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0) + return 0; + + switch(generic_tl.tag) + { + case NFAPI_TX_REQUEST_BODY_TAG: + { + pNfapiMsg->tx_request_body.tl = generic_tl; + + if( pull16(ppReadPackedMsg, &pNfapiMsg->tx_request_body.number_of_pdus, end) == 0) + return 0; + + if(pNfapiMsg->tx_request_body.number_of_pdus > NFAPI_TX_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of tx pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus, NFAPI_TX_MAX_PDU); + return 0; + } + + if(pNfapiMsg->tx_request_body.number_of_pdus > 0) + { + pNfapiMsg->tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_tx_request_pdu_t) * pNfapiMsg->tx_request_body.number_of_pdus, config); + if(pNfapiMsg->tx_request_body.tx_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate tx pdu list (count:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus); + return 0; + } + } + else + { + pNfapiMsg->tx_request_body.tx_pdu_list = 0; + } + + + uint16_t i; + uint16_t totalNumPdus = pNfapiMsg->tx_request_body.number_of_pdus; + for(i = 0; i < totalNumPdus; ++i) + { + nfapi_tx_request_pdu_t* pdu = &(pNfapiMsg->tx_request_body.tx_pdu_list[i]); + + uint16_t length = 0; + uint16_t index = 0; + + if(!(pull16(ppReadPackedMsg, &length, end) && + pull16(ppReadPackedMsg, &index, end))) + return 0; + + pdu->pdu_length = length; + pdu->pdu_index = index; + + + // TODO : May need to rethink this bit + pdu->num_segments = 1; + pdu->segments[0].segment_length = pdu->pdu_length; + pdu->segments[0].segment_data = nfapi_p7_allocate(pdu->pdu_length, config); + + if(pdu->segments[0].segment_data) + { + if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end)) + return 0; + if (0 && pdu->segments[0].segment_length == 3) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, + pdu->segments[0].segment_data[0], + pdu->segments[0].segment_data[1], + pdu->segments[0].segment_data[2] + ); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request: Failed to allocate pdu (len:%d) %d/%d %d\n", pdu->pdu_length, totalNumPdus, i, pdu->pdu_index); + } + } + } + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request FIXME : Invalid pdu type %d \n", generic_tl.tag ); + } + break; + }; + } + + return 1; +} + +static uint8_t unpack_harq_indication_tdd_harq_data_bundling(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_harq_indication_tdd_harq_data_bundling_t* value = (nfapi_harq_indication_tdd_harq_data_bundling_t*)tlv; + + return (pull8(ppReadPackedMsg, &value->value_0, end) && + pull8(ppReadPackedMsg, &value->value_1, end)); +} + +static uint8_t unpack_harq_indication_tdd_harq_data_multiplexing(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_harq_indication_tdd_harq_data_multiplexing_t* value = (nfapi_harq_indication_tdd_harq_data_multiplexing_t*)tlv; + + return (pull8(ppReadPackedMsg, &value->value_0, end) && + pull8(ppReadPackedMsg, &value->value_1, end) && + pull8(ppReadPackedMsg, &value->value_2, end) && + pull8(ppReadPackedMsg, &value->value_3, end)); +} +static uint8_t unpack_harq_indication_tdd_harq_data_special_bundling(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_harq_indication_tdd_harq_data_special_bundling_t* value = (nfapi_harq_indication_tdd_harq_data_special_bundling_t*)tlv; + return ( pull8(ppReadPackedMsg, &value->value_0, end)); +} +static uint8_t unpack_harq_indication_tdd_harq_data(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_harq_indication_tdd_harq_data_t* value = (nfapi_harq_indication_tdd_harq_data_t*)tlv; + return (pull8(ppReadPackedMsg, &value->value_0, end)); +} + +static uint8_t unpack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_harq_indication_tdd_rel8_t* value = (nfapi_harq_indication_tdd_rel8_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->mode, end) && + pull8(ppReadPackedMsg, &value->number_of_ack_nack, end))) + return 0; + + uint8_t result = 0; + switch(value->mode) + { + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING: + result = unpack_harq_indication_tdd_harq_data_bundling(&value->harq_data.bundling, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING: + result = unpack_harq_indication_tdd_harq_data_multiplexing(&value->harq_data.multiplex, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING: + result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data.special_bundling, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3: + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION: + result = 1; + break; + default: + // TODO add error message + return 0; + break; + } + return result; +} + +static uint8_t unpack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_harq_indication_tdd_rel9_t* value = (nfapi_harq_indication_tdd_rel9_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->mode, end) && + pull8(ppReadPackedMsg, &value->number_of_ack_nack, end))) + return 0; + + if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) + { + // TODO : add error message + return 0; + } + + uint16_t idx = 0; + for(idx = 0; idx < value->number_of_ack_nack; ++idx) + { + uint8_t result = 0; + switch(value->mode) + { + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING: + result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING: + result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING: + result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION: + result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3: + result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end); + break; + default: + // TODO add error message + return 0; + break; + } + + if(result == 0) + return 0; + } + return 1; +} + +static uint8_t unpack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_harq_indication_tdd_rel13_t* value = (nfapi_harq_indication_tdd_rel13_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->mode, end) && + pull16(ppReadPackedMsg, &value->number_of_ack_nack, end))) + return 0; + + if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) + { + // TODO : add error message + return 0; + } + + uint16_t idx = 0; + for(idx = 0; idx < value->number_of_ack_nack; ++idx) + { + uint8_t result = 0; + switch(value->mode) + { + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING: + result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING: + result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING: + result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION: + result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3: + result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4: + result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_4, ppReadPackedMsg, end); + break; + case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5: + result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_5, ppReadPackedMsg, end); + break; + default: + // TODO add error message + return 0; + break; + } + + if(result == 0) + return 0; + } + return 1; +} + +static uint8_t unpack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_harq_indication_fdd_rel8_t* value = (nfapi_harq_indication_fdd_rel8_t*)tlv; + return (pull8(ppReadPackedMsg, &value->harq_tb1, end) && + pull8(ppReadPackedMsg, &value->harq_tb2, end)); +} + +static uint8_t unpack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_harq_indication_fdd_rel9_t* value = (nfapi_harq_indication_fdd_rel9_t*)tlv; + + return (pull8(ppReadPackedMsg, &value->mode, end) && + pull8(ppReadPackedMsg, &value->number_of_ack_nack, end) && + pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, value->number_of_ack_nack, end)); +} + +static uint8_t unpack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_harq_indication_fdd_rel13_t* value = (nfapi_harq_indication_fdd_rel13_t*)tlv; + + return (pull8(ppReadPackedMsg, &value->mode, end) && + pull16(ppReadPackedMsg, &value->number_of_ack_nack, end) && + pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, value->number_of_ack_nack, end)); +} + +static uint8_t unpack_ul_cqi_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_ul_cqi_information_t* value = (nfapi_ul_cqi_information_t*)tlv; + + return (pull8(ppReadPackedMsg, &value->ul_cqi, end) && + pull8(ppReadPackedMsg, &value->channel, end)); +} + + + +static uint8_t unpack_harq_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_harq_indication_body_t* value = (nfapi_harq_indication_body_t*)tlv; + uint8_t* harqBodyEnd = *ppReadPackedMsg + value->tl.length; + + if(harqBodyEnd > end) + return 0; + + if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0) + return 0; + + if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU); + return 0; + } + + value->harq_pdu_list = (nfapi_harq_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_harq_indication_pdu_t) * value->number_of_harqs, config); + if(value->harq_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs); + return 0; + } + + uint8_t i = 0; + for(i = 0; i < value->number_of_harqs; ++i) + { + nfapi_harq_indication_pdu_t* pdu = &(value->harq_pdu_list[i]); + if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0) + return 0; + + uint8_t* harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value }, + { NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, &unpack_harq_indication_tdd_rel8_value}, + { NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, &unpack_harq_indication_tdd_rel9_value}, + { NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, &unpack_harq_indication_tdd_rel13_value}, + { NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, &unpack_harq_indication_fdd_rel8_value}, + { NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, &unpack_harq_indication_fdd_rel9_value}, + { NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, &unpack_harq_indication_fdd_rel13_value}, + { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value} + }; + + if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0) + return 0; + + } + + return 1; +} + +static uint8_t unpack_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, &unpack_harq_indication_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_crc_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_crc_indication_rel8_t* crc_pdu_rel8 = (nfapi_crc_indication_rel8_t*)tlv; + return ( pull8(ppReadPackedMsg, &crc_pdu_rel8->crc_flag, end) ); +} + +static uint8_t unpack_crc_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_crc_indication_body_t* value = (nfapi_crc_indication_body_t*)tlv; + uint8_t* crcBodyEnd = *ppReadPackedMsg + value->tl.length; + + if(crcBodyEnd > end) + return 0; + + if(pull16(ppReadPackedMsg, &value->number_of_crcs, end) == 0) + return 0; + + if(value->number_of_crcs > NFAPI_CRC_IND_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of crc ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_crcs, NFAPI_CRC_IND_MAX_PDU); + return 0; + } + + if(value->number_of_crcs > 0) + { + value->crc_pdu_list = (nfapi_crc_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_crc_indication_pdu_t) * value->number_of_crcs, config); + if(value->crc_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate crc ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_crcs); + return 0; + } + } + else + { + value->crc_pdu_list = 0; + } + + + uint8_t i = 0; + for(i = 0; i < value->number_of_crcs; ++i) + { + nfapi_crc_indication_pdu_t* pdu = &(value->crc_pdu_list[i]); + + if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0) + return 0; + + uint8_t* crcPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length; + + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value }, + { NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, unpack_crc_indication_rel8_value }, + }; + + if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, crcPduInstanceEnd, 0, 0) == 0) + return 0; + } + + return 1; +} + +static uint8_t unpack_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, &unpack_crc_indication_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_rx_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_rx_indication_rel8_t* value = (nfapi_rx_indication_rel8_t*)tlv; + + return (pull16(ppReadPackedMsg, &value->length, end) && + pull16(ppReadPackedMsg, &value->offset, end) && + pull8(ppReadPackedMsg, &value->ul_cqi, end) && + pull16(ppReadPackedMsg, &value->timing_advance, end)); +} +static uint8_t unpack_rx_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_rx_indication_rel9_t* value = (nfapi_rx_indication_rel9_t*)tlv; + return (pull16(ppReadPackedMsg, &value->timing_advance_r9, end)); +} + +static uint8_t unpack_rx_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_rx_indication_body_t* value = (nfapi_rx_indication_body_t*)tlv; + + // the rxBodyEnd points to the end of the cqi PDU's + uint8_t* rxBodyEnd = *ppReadPackedMsg + value->tl.length; + uint8_t* rxPduEnd = rxBodyEnd; + + uint8_t* numberOfPdusAddress = *ppReadPackedMsg; + + if(rxBodyEnd > end) + { + // pdu end is past buffer end + return 0; + } + + if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0) + return 0; + + if(value->number_of_pdus > NFAPI_RX_IND_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of rx ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_RX_IND_MAX_PDU); + return 0; + } + + if(value->number_of_pdus > 0) + { + value->rx_pdu_list = (nfapi_rx_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_rx_indication_pdu_t) * value->number_of_pdus, config); + if(value->rx_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate rx ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus); + return 0; + } + } + else + { + value->rx_pdu_list = 0; + } + + uint8_t i = 0; + nfapi_rx_indication_pdu_t* pdu = 0; + while((uint8_t*)(*ppReadPackedMsg) < rxBodyEnd && (uint8_t*)(*ppReadPackedMsg) < rxPduEnd) + { + nfapi_tl_t generic_tl; + if( unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0) + return 0; + + switch(generic_tl.tag) + { + case NFAPI_RX_UE_INFORMATION_TAG: + { + pdu = &(value->rx_pdu_list[i++]); + pdu->rx_ue_information.tl = generic_tl; + if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0) + return 0; + } + break; + case NFAPI_RX_INDICATION_REL8_TAG: + { + if(pdu != 0) + { + pdu->rx_indication_rel8.tl = generic_tl; + if(unpack_rx_indication_rel8_value(&pdu->rx_indication_rel8, ppReadPackedMsg, end) == 0) + return 0; + + if(pdu->rx_indication_rel8.offset > 0) + { + // Need to check that the data is within the tlv + if(numberOfPdusAddress + pdu->rx_indication_rel8.offset + pdu->rx_indication_rel8.length <= rxBodyEnd) + { + // If this the first pdu set the rxPduEnd + if(numberOfPdusAddress + pdu->rx_indication_rel8.offset < rxPduEnd) + { + rxPduEnd = numberOfPdusAddress + pdu->rx_indication_rel8.offset; + + if(rxPduEnd > end) + { + // pdu end is past buffer end + return 0; + } + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME: the rx data is outside of the tlv\n"); + } + } + } + } + break; + case NFAPI_RX_INDICATION_REL9_TAG: + { + if(pdu != 0) + { + pdu->rx_indication_rel9.tl = generic_tl; + if(unpack_rx_indication_rel9_value(&pdu->rx_indication_rel9, ppReadPackedMsg, end) == 0) + return 0; + } + } + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_ULSCH.indication Invalid pdu type %d \n", generic_tl.tag ); + } + break; + } + } + + uint8_t idx = 0; + for(idx = 0; idx < value->number_of_pdus; ++idx) + { + if(value->rx_pdu_list[idx].rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) + { + uint32_t length = value->rx_pdu_list[idx].rx_indication_rel8.length; + value->rx_pdu_list[idx].data = nfapi_p7_allocate(length, config); + if(pullarray8(ppReadPackedMsg, value->rx_pdu_list[idx].data, length, length, end) == 0) + { + return 0; + } + } + } + + return 1; +} + +static uint8_t unpack_rx_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, &unpack_rx_indication_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_preamble_pdu_rel8_t* preamble_pdu_rel8 = (nfapi_preamble_pdu_rel8_t*)tlv; + + return (pull16(ppReadPackedMsg, &preamble_pdu_rel8->rnti, end) && + pull8(ppReadPackedMsg, &preamble_pdu_rel8->preamble, end) && + pull16(ppReadPackedMsg, &preamble_pdu_rel8->timing_advance, end)); +} + +static uint8_t unpack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_preamble_pdu_rel9_t* preamble_pdu_rel9 = (nfapi_preamble_pdu_rel9_t*)tlv; + return pull16(ppReadPackedMsg, &preamble_pdu_rel9->timing_advance_r9, end); +} + +static uint8_t unpack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_preamble_pdu_rel13_t* preamble_pdu_rel13 = (nfapi_preamble_pdu_rel13_t*)tlv; + return pull8(ppReadPackedMsg, &preamble_pdu_rel13->rach_resource_type, end); +} + +static uint8_t unpack_rach_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_rach_indication_body_t* value = (nfapi_rach_indication_body_t*)tlv; + uint8_t* rachBodyEnd = *ppReadPackedMsg + value->tl.length; + + if(rachBodyEnd > end) + return 0; + + if(pull16(ppReadPackedMsg, &value->number_of_preambles, end) == 0) + return 0; + + if(value->number_of_preambles > NFAPI_PREAMBLE_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of preamble du's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_preambles, NFAPI_PREAMBLE_MAX_PDU); + return 0; + } + + if(value->number_of_preambles > 0) + { + value->preamble_list = (nfapi_preamble_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_preamble_pdu_t) * value->number_of_preambles, config); + if(value->preamble_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate preamble pdu list (count:%d)\n", __FUNCTION__, value->number_of_preambles); + return 0; + } + } + else + { + value->preamble_list = 0; + } + + + uint8_t i = 0; + for(i = 0; i < value->number_of_preambles; ++i) + { + nfapi_preamble_pdu_t* pdu = &(value->preamble_list[i]); + + if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0) + return 0; + + uint8_t* preamblePduInstanceEnd = *ppReadPackedMsg + pdu->instance_length; + + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, unpack_preamble_pdu_rel8_value }, + { NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, unpack_preamble_pdu_rel9_value }, + { NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, unpack_preamble_pdu_rel13_value }, + }; + + if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, preamblePduInstanceEnd, 0, 0) == 0) + return 0; + } + return 1; +} + +static uint8_t unpack_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, &unpack_rach_indication_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_srs_indication_fdd_rel8_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_srs_indication_fdd_rel8_t* srs_pdu_fdd_rel8 = (nfapi_srs_indication_fdd_rel8_t*)tlv; + + if(!(pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->doppler_estimation, end) && + pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->timing_advance, end) && + pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->number_of_resource_blocks, end) && + pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->rb_start, end) && + pullarray8(ppReadPackedMsg, srs_pdu_fdd_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_fdd_rel8->number_of_resource_blocks, end))) + return 0; + return 1; +} + +static uint8_t unpack_srs_indication_fdd_rel9_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_srs_indication_fdd_rel9_t* srs_pdu_fdd_rel9 = (nfapi_srs_indication_fdd_rel9_t*)tlv; + return (pull16(ppReadPackedMsg, &srs_pdu_fdd_rel9->timing_advance_r9, end)); +} + +static uint8_t unpack_srs_indication_tdd_rel10_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_srs_indication_ttd_rel10_t* srs_pdu_tdd_rel10 = (nfapi_srs_indication_ttd_rel10_t*)tlv; + return (pull8(ppReadPackedMsg, &srs_pdu_tdd_rel10->uppts_symbol, end)); +} + +static uint8_t unpack_srs_indication_fdd_rel11_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_srs_indication_fdd_rel11_t* srs_pdu_fdd_rel11 = (nfapi_srs_indication_fdd_rel11_t*)tlv; + return ( pull16(ppReadPackedMsg, &srs_pdu_fdd_rel11->ul_rtoa, end)); +} + +static uint8_t unpack_tdd_channel_measurement_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_tdd_channel_measurement_t* value = (nfapi_tdd_channel_measurement_t*)tlv; + + if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) && + pull8(ppReadPackedMsg, &value->number_of_subbands, end) && + pull8(ppReadPackedMsg, &value->num_atennas, end))) + return 0; + + if(value->number_of_subbands > NFAPI_MAX_NUM_SUBBANDS) + { + // todo : add error + return 0; + } + + if(value->num_atennas > NFAPI_MAX_NUM_PHYSICAL_ANTENNAS) + { + // todo : add error + return 0; + } + + uint8_t idx = 0; + for(idx = 0; idx < value->number_of_subbands; ++idx) + { + if(!(pull8(ppReadPackedMsg, &value->subands[idx].subband_index, end) && + pullarray16(ppReadPackedMsg, value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, end))) + return 0; + } + + return 1; +} + + +static uint8_t unpack_srs_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_srs_indication_body_t* value = (nfapi_srs_indication_body_t*)tlv; + uint8_t* srsBodyEnd = *ppReadPackedMsg + value->tl.length; + + if(srsBodyEnd > end) + return 0; + + if(pull8(ppReadPackedMsg, &value->number_of_ues, end) == 0) + return 0; + + if(value->number_of_ues > NFAPI_SRS_IND_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of srs ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_ues, NFAPI_SRS_IND_MAX_PDU); + return 0; + } + + if(value->number_of_ues > 0) + { + value->srs_pdu_list = (nfapi_srs_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_srs_indication_pdu_t) * value->number_of_ues, config); + if(value->srs_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate srs ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_ues); + return 0; + } + } + else + { + value->srs_pdu_list = 0; + } + + + + uint8_t i = 0; + for(i = 0; i < value->number_of_ues; ++i) + { + nfapi_srs_indication_pdu_t* pdu = &(value->srs_pdu_list[i]); + + + if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0) + return 0; + + uint8_t* srsPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length; + + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value }, + { NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, unpack_srs_indication_fdd_rel8_value}, + { NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, unpack_srs_indication_fdd_rel9_value}, + { NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, unpack_srs_indication_tdd_rel10_value}, + { NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, unpack_srs_indication_fdd_rel11_value}, + { NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, unpack_tdd_channel_measurement_value}, + }; + + if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srsPduInstanceEnd, 0, 0) == 0) + return 0; + } + return 1; +} + +static uint8_t unpack_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, &unpack_srs_indication_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + + +static uint8_t unpack_sr_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_sr_indication_body_t* value = (nfapi_sr_indication_body_t*)tlv; + uint8_t* srBodyEnd = *ppReadPackedMsg + value->tl.length; + + if(srBodyEnd > end) + return 0; + + if(pull16(ppReadPackedMsg, &value->number_of_srs, end) == 0) + return 0; + + if(value->number_of_srs > NFAPI_SR_IND_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of sr ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_srs, NFAPI_SR_IND_MAX_PDU); + return 0; + } + + if(value->number_of_srs > 0) + { + value->sr_pdu_list = (nfapi_sr_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_sr_indication_pdu_t) * value->number_of_srs, config); + if(value->sr_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate sr ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_srs); + return 0; + } + } + else + { + value->sr_pdu_list = 0; + } + + uint8_t i = 0; + for(i = 0; i < value->number_of_srs; ++i) + { + nfapi_sr_indication_pdu_t* pdu = &(value->sr_pdu_list[i]); + + if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0) + return 0; + + uint8_t* srPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length; + + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value }, + { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, unpack_ul_cqi_information_value }, + }; + + if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srPduInstanceEnd, 0, 0) == 0) + return 0; + } + + return 1; + +} + +static int unpack_sr_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, &unpack_sr_indication_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} +static uint8_t unpack_cqi_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_cqi_indication_rel8_t* cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t*)tlv; + + return (pull16(ppReadPackedMsg, &cqi_pdu_rel8->length, end) && + pull16(ppReadPackedMsg, &cqi_pdu_rel8->data_offset, end) && + pull8(ppReadPackedMsg, &cqi_pdu_rel8->ul_cqi, end) && + pull8(ppReadPackedMsg, &cqi_pdu_rel8->ri, end) && + pull16(ppReadPackedMsg, &cqi_pdu_rel8->timing_advance, end)); + +} + +static uint8_t unpack_cqi_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_cqi_indication_rel9_t* cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t*)tlv; + + if(!(pull16(ppReadPackedMsg, &cqi_pdu_rel9->length, end) && + pull16(ppReadPackedMsg, &cqi_pdu_rel9->data_offset, end) && + pull8(ppReadPackedMsg, &cqi_pdu_rel9->ul_cqi, end) && + pull8(ppReadPackedMsg, &cqi_pdu_rel9->number_of_cc_reported, end))) + return 0; + + if(cqi_pdu_rel9->number_of_cc_reported > NFAPI_CC_MAX) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : out of bound array\n"); + return 0; + } + + if(!(pullarray8(ppReadPackedMsg, cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, end) && + pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance, end) && + pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance_r9, end))) + return 0; + + return 1; +} + +static uint8_t unpack_cqi_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_cqi_indication_body_t* value = (nfapi_cqi_indication_body_t*)tlv; + + // the cqiBodyEnd points to the end of the cqi PDU's + uint8_t* cqiBodyEnd = *ppReadPackedMsg + value->tl.length; + + //uint8_t* cqiPduEnd = cqiBodyEnd; + //uint8_t* numberOfPdusAddress = *ppReadPackedMsg; + + if(cqiBodyEnd > end) + return 0; + + if(pull16(ppReadPackedMsg, &value->number_of_cqis, end) == 0) + return 0; + + if(value->number_of_cqis > NFAPI_CQI_IND_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of cqi ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_cqis, NFAPI_CQI_IND_MAX_PDU); + return -1; + } + + if(value->number_of_cqis > 0) + { + value->cqi_pdu_list = (nfapi_cqi_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_pdu_t) * value->number_of_cqis, config); + if(value->cqi_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis); + return 0; + } + } + else + { + value->cqi_pdu_list = 0; + } + + if(value->number_of_cqis > 0) + { + value->cqi_raw_pdu_list = (nfapi_cqi_indication_raw_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_raw_pdu_t) * value->number_of_cqis, config); + if(value->cqi_raw_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate raw cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis); + return 0; + } + } + else + { + value->cqi_raw_pdu_list = 0; + } + + uint8_t i = 0; + for(i = 0; i < value->number_of_cqis; ++i) + { + nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]); + memset(pdu, 0, sizeof(nfapi_cqi_indication_pdu_t)); + + if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0) + return 0; + + uint8_t* cqiPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length; + + + while((uint8_t*)(*ppReadPackedMsg) < cqiPduInstanceEnd) + { + nfapi_tl_t generic_tl; + if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0) + return 0; + + switch(generic_tl.tag) + { + case NFAPI_RX_UE_INFORMATION_TAG: + pdu->rx_ue_information.tl = generic_tl; + if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0) + return 0; + break; + case NFAPI_CQI_INDICATION_REL8_TAG: + pdu->cqi_indication_rel8.tl = generic_tl; + if(unpack_cqi_indication_rel8_value(&pdu->cqi_indication_rel8, ppReadPackedMsg, end) == 0) + return 0; + + break; + case NFAPI_CQI_INDICATION_REL9_TAG: + pdu->cqi_indication_rel9.tl = generic_tl; + if(unpack_cqi_indication_rel9_value(&pdu->cqi_indication_rel9, ppReadPackedMsg, end) == 0) + return 0; + + break; + case NFAPI_UL_CQI_INFORMATION_TAG: + pdu->ul_cqi_information.tl = generic_tl; + if(unpack_ul_cqi_information_value(&pdu->ul_cqi_information, ppReadPackedMsg, end) == 0) + return 0; + break; + default: + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_CQI.indication Invalid pdu type %d \n", generic_tl.tag ); + } + break; + + }; + } + } + + uint8_t idx = 0; + for(idx = 0; idx < value->number_of_cqis; ++idx) + { + if(value->cqi_pdu_list[idx].cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) + { + if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel8.length, end) == 0) + return 0; + } + else if(value->cqi_pdu_list[idx].cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) + { + if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel9.length, end) == 0) + return 0; + } + } + + + return 1; + +} + +static uint8_t unpack_cqi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, &unpack_cqi_indication_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} +static uint8_t unpack_lbt_pdsch_req_pdu_rel13_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_lbt_pdsch_req_pdu_rel13_t* value = (nfapi_lbt_pdsch_req_pdu_rel13_t*)tlv; + + return (pull32(ppReadPackedMsg, &value->handle, end) && + pull32(ppReadPackedMsg, &value->mp_cca, end) && + pull32(ppReadPackedMsg, &value->n_cca, end) && + pull32(ppReadPackedMsg, &value->offset, end) && + pull32(ppReadPackedMsg, &value->lte_txop_sf, end) && + pull16(ppReadPackedMsg, &value->txop_sfn_sf_end, end) && + pull32(ppReadPackedMsg, &value->lbt_mode, end)); +} + +static uint8_t unpack_lbt_drs_req_pdu_rel13_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_lbt_drs_req_pdu_rel13_t* value = (nfapi_lbt_drs_req_pdu_rel13_t*)tlv; + + return (pull32(ppReadPackedMsg, &value->handle, end) && + pull32(ppReadPackedMsg, &value->offset, end) && + pull16(ppReadPackedMsg, &value->sfn_sf_end, end) && + pull32(ppReadPackedMsg, &value->lbt_mode, end)); +} + + +static uint8_t unpack_lbt_config_request_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_lbt_dl_config_request_body_t* value = (nfapi_lbt_dl_config_request_body_t*)tlv; + + if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0) + return 0; + + if(value->number_of_pdus > NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU); + return 0; + } + + if(value->number_of_pdus) + { + value->lbt_dl_config_req_pdu_list = (nfapi_lbt_dl_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_config_request_pdu_t) * value->number_of_pdus, config); + if(value->lbt_dl_config_req_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus); + return 0; + } + } + else + { + value->lbt_dl_config_req_pdu_list = 0; + } + + + uint16_t i; + uint16_t total_number_of_pdus = value->number_of_pdus; + for(i = 0; i < total_number_of_pdus; ++i) + { + nfapi_lbt_dl_config_request_pdu_t* pdu = &(value->lbt_dl_config_req_pdu_list[i]); + + if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) && + pull8(ppReadPackedMsg, &pdu->pdu_size, end))) + return 0; + + uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2; + + if(packedPduEnd > end) + return 0; + + switch(pdu->pdu_type) + { + case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, &unpack_lbt_pdsch_req_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, &unpack_lbt_drs_req_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + default: + NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request body invalid pdu type %d\n", pdu->pdu_type); + return 0; + } + } + + return 1; +} +static uint8_t unpack_lbt_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, &unpack_lbt_config_request_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_lbt_pdsch_rsp_pdu_rel13_t* value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t*)tlv; + + return (pull32(ppReadPackedMsg, &value->handle, end) && + pull32(ppReadPackedMsg, &value->result, end) && + pull32(ppReadPackedMsg, &value->lte_txop_symbols, end) && + pull32(ppReadPackedMsg, &value->initial_partial_sf, end)); + +} +static uint8_t unpack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_lbt_drs_rsp_pdu_rel13_t* value = (nfapi_lbt_drs_rsp_pdu_rel13_t*)tlv; + + return (pull32(ppReadPackedMsg, &value->handle, end) && + pull32(ppReadPackedMsg, &value->result, end)); +} + +static uint8_t unpack_lbt_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_lbt_dl_indication_body_t* value = (nfapi_lbt_dl_indication_body_t*)tlv; + + if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0) + return 0; + + if(value->number_of_pdus > NFAPI_LBT_IND_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_IND_MAX_PDU); + return 0; + } + + if(value->number_of_pdus > 0) + { + value->lbt_indication_pdu_list = (nfapi_lbt_dl_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_indication_pdu_t) * value->number_of_pdus, config); + if(value->lbt_indication_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl ind config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus); + return 0; + } + } + else + { + value->lbt_indication_pdu_list = 0; + } + + uint16_t i; + uint16_t total_number_of_pdus = value->number_of_pdus; + for(i = 0; i < total_number_of_pdus; ++i) + { + nfapi_lbt_dl_indication_pdu_t* pdu = &(value->lbt_indication_pdu_list[i]); + + if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) && + pull8(ppReadPackedMsg, &pdu->pdu_size, end))) + return 0; + + uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2; + + if(packedPduEnd > end) + return 0; + + switch(pdu->pdu_type) + { + case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, &unpack_lbt_pdsch_rsp_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: + { + unpack_tlv_t unpack_fns[] = + { + { NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, &unpack_lbt_drs_rsp_pdu_rel13_value}, + }; + + unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0); + } + break; + default: + NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d\n", pdu->pdu_type); + return 0; + } + } + + return 1; +} +static uint8_t unpack_lbt_dl_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, &unpack_lbt_indication_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_nb_harq_indication_fdd_rel13_t* value = (nfapi_nb_harq_indication_fdd_rel13_t*)tlv; + return (pull8(ppReadPackedMsg, &value->harq_tb1, end)); +} + + +static uint8_t unpack_nb_harq_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_nb_harq_indication_body_t* value = (nfapi_nb_harq_indication_body_t*)tlv; + uint8_t* nbharqBodyEnd = *ppReadPackedMsg + value->tl.length; + + if(nbharqBodyEnd > end) + return 0; + + if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0) + return 0; + + if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU); + return 0; + } + + value->nb_harq_pdu_list = (nfapi_nb_harq_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_nb_harq_indication_pdu_t) * value->number_of_harqs, config); + if(value->nb_harq_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs); + return 0; + } + + uint8_t i = 0; + for(i = 0; i < value->number_of_harqs; ++i) + { + nfapi_nb_harq_indication_pdu_t* pdu = &(value->nb_harq_pdu_list[i]); + if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0) + return 0; + + uint8_t* harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value }, + { NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, &unpack_nb_harq_indication_fdd_rel13_value}, + { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value} + }; + + if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0) + return 0; + + } + + return 1; +} + +static uint8_t unpack_nb_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, &unpack_nb_harq_indication_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_nrach_indication_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) +{ + nfapi_nrach_indication_pdu_rel13_t* value = (nfapi_nrach_indication_pdu_rel13_t*)tlv; + + return (pull16(ppReadPackedMsg, &value->rnti, end) && + pull8(ppReadPackedMsg, &value->initial_sc, end) && + pull16(ppReadPackedMsg, &value->timing_advance, end) && + pull8(ppReadPackedMsg, &value->nrach_ce_level, end)); +} + + +static uint8_t unpack_nrach_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + nfapi_nrach_indication_body_t* value = (nfapi_nrach_indication_body_t*)tlv; + uint8_t* nrachBodyEnd = *ppReadPackedMsg + value->tl.length; + + if(nrachBodyEnd > end) + return 0; + + if(pull8(ppReadPackedMsg, &value->number_of_initial_scs_detected, end) == 0) + return 0; + + if(value->number_of_initial_scs_detected > NFAPI_PREAMBLE_MAX_PDU) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of detected scs ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected, NFAPI_PREAMBLE_MAX_PDU); + return 0; + } + + value->nrach_pdu_list = (nfapi_nrach_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_nrach_indication_pdu_t) * value->number_of_initial_scs_detected, config); + if(value->nrach_pdu_list == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate nrach ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected); + return 0; + } + + uint8_t i = 0; + for(i = 0; i < value->number_of_initial_scs_detected; ++i) + { + nfapi_nrach_indication_pdu_t* pdu = &(value->nrach_pdu_list[i]); + + uint8_t* nrachPduInstanceEnd = *ppReadPackedMsg + 4 + 6; + + unpack_tlv_t unpack_fns[] = + { + { NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, &unpack_nrach_indication_rel13_value}, + }; + + if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, nrachPduInstanceEnd, 0, 0) == 0) + return 0; + + } + + return 1; +} + +static uint8_t unpack_nrach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + { NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, &unpack_nrach_indication_body_value}, + }; + + return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) && + pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_sf, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) && + pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) && + pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + +static uint8_t unpack_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config) +{ + nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t*)msg; + + unpack_p7_tlv_t unpack_fns[] = + { + }; + + return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn_sf, end) && + pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) && + pull32(ppReadPackedMsg, &pNfapiMsg->dl_config_jitter, end) && + pull32(ppReadPackedMsg, &pNfapiMsg->tx_request_jitter, end) && + pull32(ppReadPackedMsg, &pNfapiMsg->ul_config_jitter, end) && + pull32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_jitter, end) && + pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_latest_delay, end) && + pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_latest_delay, end) && + pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_latest_delay, end) && + pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_latest_delay, end) && + pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_earliest_arrival, end) && + pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_earliest_arrival, end) && + pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_earliest_arrival, end) && + pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_earliest_arrival, end) && + unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension)); +} + + +// unpack length check + +static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) +{ + int retLen = 0; + + switch (msgId) + { + case NFAPI_DL_CONFIG_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_dl_config_request_t)) + retLen = sizeof(nfapi_dl_config_request_t); + break; + + case NFAPI_UL_CONFIG_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_ul_config_request_t)) + retLen = sizeof(nfapi_ul_config_request_t); + break; + + case NFAPI_SUBFRAME_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t)) + retLen = sizeof(nfapi_subframe_indication_t); + break; + + case NFAPI_HI_DCI0_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_hi_dci0_request_t)) + retLen = sizeof(nfapi_hi_dci0_request_t); + break; + + case NFAPI_TX_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_tx_request_t)) + retLen = sizeof(nfapi_tx_request_t); + break; + + case NFAPI_HARQ_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_harq_indication_t)) + retLen = sizeof(nfapi_harq_indication_t); + break; + + case NFAPI_CRC_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_crc_indication_t)) + retLen = sizeof(nfapi_crc_indication_t); + break; + + case NFAPI_RX_ULSCH_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_rx_indication_t)) + retLen = sizeof(nfapi_rx_indication_t); + break; + + case NFAPI_RACH_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_rach_indication_t)) + retLen = sizeof(nfapi_rach_indication_t); + break; + + case NFAPI_SRS_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_srs_indication_t)) + retLen = sizeof(nfapi_srs_indication_t); + break; + + case NFAPI_RX_SR_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_sr_indication_t)) + retLen = sizeof(nfapi_sr_indication_t); + break; + + case NFAPI_RX_CQI_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t)) + retLen = sizeof(nfapi_cqi_indication_t); + break; + + case NFAPI_LBT_DL_CONFIG_REQUEST: + if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t)) + retLen = sizeof(nfapi_lbt_dl_config_request_t); + break; + + case NFAPI_LBT_DL_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t)) + retLen = sizeof(nfapi_lbt_dl_indication_t); + break; + + case NFAPI_NB_HARQ_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t)) + retLen = sizeof(nfapi_nb_harq_indication_t); + break; + + case NFAPI_NRACH_INDICATION: + if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t)) + retLen = sizeof(nfapi_nrach_indication_t); + break; + + case NFAPI_DL_NODE_SYNC: + if (unpackedBufLen >= sizeof(nfapi_dl_node_sync_t)) + retLen = sizeof(nfapi_dl_node_sync_t); + break; + + case NFAPI_UL_NODE_SYNC: + if (unpackedBufLen >= sizeof(nfapi_ul_node_sync_t)) + retLen = sizeof(nfapi_ul_node_sync_t); + break; + + case NFAPI_TIMING_INFO: + if (unpackedBufLen >= sizeof(nfapi_timing_info_t)) + retLen = sizeof(nfapi_timing_info_t); + break; + + default: + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId); + break; + } + + return retLen; +} + + +// Main unpack functions - public + +int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config) +{ + nfapi_p7_message_header_t *pMessageHeader = pUnpackedBuf; + uint8_t *pReadPackedMessage = pMessageBuf; + uint8_t *end = pMessageBuf + messageBufLen; + + if (pMessageBuf == NULL || pUnpackedBuf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied pointers are null\n"); + return -1; + } + + if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen); + return -1; + } + + // process the header + if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) && + pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) && + pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) && + pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) && + pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) && + pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end))) + return -1; + + return 0; +} + +int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config) +{ + int result = 0; + nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf; + uint8_t *pReadPackedMessage = pMessageBuf; + uint8_t *end = pMessageBuf + messageBufLen; + + if (pMessageBuf == NULL || pUnpackedBuf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n"); + return -1; + } + + if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen); + return -1; + } + + // clean the supplied buffer for - tag value blanking + (void)memset(pUnpackedBuf, 0, unpackedBufLen); + + // process the header + if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) && + pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) && + pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) && + pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) && + pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) && + pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end))) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n"); + return -1; + } + + if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n"); + return -1; + } + + /* + if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n"); + return -1; + } + */ + + // look for the specific message + switch (pMessageHeader->message_id) + { + case NFAPI_DL_CONFIG_REQUEST: + if (check_unpack_length(NFAPI_DL_CONFIG_REQUEST, unpackedBufLen)) + result = unpack_dl_config_request(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_UL_CONFIG_REQUEST: + if (check_unpack_length(NFAPI_UL_CONFIG_REQUEST, unpackedBufLen)) + result = unpack_ul_config_request(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_HI_DCI0_REQUEST: + if (check_unpack_length(NFAPI_HI_DCI0_REQUEST, unpackedBufLen)) + result = unpack_hi_dci0_request(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_TX_REQUEST: + if (check_unpack_length(NFAPI_TX_REQUEST, unpackedBufLen)) + result = unpack_tx_request(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_HARQ_INDICATION: + if (check_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen)) + result = unpack_harq_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_CRC_INDICATION: + if (check_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen)) + result = unpack_crc_indication(&pReadPackedMessage,end , pMessageHeader, config); + else + return -1; + break; + + case NFAPI_RX_ULSCH_INDICATION: + if (check_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen)) + result = unpack_rx_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_RACH_INDICATION: + if (check_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen)) + result = unpack_rach_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_SRS_INDICATION: + if (check_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen)) + result = unpack_srs_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_RX_SR_INDICATION: + if (check_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen)) + result = unpack_sr_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_RX_CQI_INDICATION: + if (check_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen)) + result = unpack_cqi_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_LBT_DL_CONFIG_REQUEST: + if (check_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen)) + result = unpack_lbt_dl_config_request(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_LBT_DL_INDICATION: + if (check_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen)) + result = unpack_lbt_dl_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_NB_HARQ_INDICATION: + if (check_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen)) + result = unpack_nb_harq_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_NRACH_INDICATION: + if (check_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen)) + result = unpack_nrach_indication(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_DL_NODE_SYNC: + if (check_unpack_length(NFAPI_DL_NODE_SYNC, unpackedBufLen)) + result = unpack_dl_node_sync(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + case NFAPI_UL_NODE_SYNC: + if (check_unpack_length(NFAPI_UL_NODE_SYNC, unpackedBufLen)) + result = unpack_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config); + else + return -1; + break; + + case NFAPI_TIMING_INFO: + if (check_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen)) + result = unpack_timing_info(&pReadPackedMessage, end, pMessageHeader, config); + else + return -1; + break; + + default: + + if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && + pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) + { + if(config && config->unpack_p7_vendor_extension) + { + result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id); + } + break; + } + + if(result == 0) + return -1; + else + return 0; +} + diff --git a/nfapi/open-nFAPI/nfapi/tests/Makefile.am b/nfapi/open-nFAPI/nfapi/tests/Makefile.am new file mode 100644 index 0000000000..46785869b0 --- /dev/null +++ b/nfapi/open-nFAPI/nfapi/tests/Makefile.am @@ -0,0 +1,36 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +#nfapi unit test +AUTOMAKE_OPTIONS=subdir-objects + +AM_CPPFLAGS = -I$(top_srcdir)/nfapi/inc -I$(top_srcdir)/nfapi/public_inc -I$(top_srcdir)/common/public_inc -I$(top_srcdir)pnf/public_inc $(CFLAGS_CUNIT) -Wall -Werror +AM_CFLAGS = -I$(top_srcdir)/nfapi/inc -I$(top_srcdir)/nfapi/public_inc -I$(top_srcdir)/common/public_inc -I$(top_srcdir)/pnf/public_inc $(CFLAGS_CUNIT) -Wall -Werror + +check_PROGRAMS= test_nfapi +test_nfapi_SOURCES = nfapi_cunit_main.c ../src/nfapi.c ../src/nfapi_p7.c ../../common/src/debug.c ../src/nfapi_p5.c ../src/nfapi_p4.c +test_nfapi_LDADD=$(top_builddir)/pnf/libnfapi_pnf.a -L$(libdir) -lpthread -lrt -lsctp -lz -lcunit + + +#jTEST_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/tap-driver.sh --ingore-exit +#TEST_ENVIRONMENT = env AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/tap-driver.sh + +#AM_TESTS_ENVIRONMENT = env AM_TAP_AWK='$(AWK)' $(SHELL); +LOG_DRIVER = $(top_srcdir)/tap-driver.sh +#AM_LOG_FLAGS = -- test_nfapi + +TESTS=$(check_PROGRAMS) +EXTRA_DIST = $(TESTS) diff --git a/nfapi/open-nFAPI/nfapi/tests/nfapi_cunit_main.c b/nfapi/open-nFAPI/nfapi/tests/nfapi_cunit_main.c new file mode 100644 index 0000000000..daaf65a3ff --- /dev/null +++ b/nfapi/open-nFAPI/nfapi/tests/nfapi_cunit_main.c @@ -0,0 +1,5511 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CUnit.h" +#include "Basic.h" +#include "Automated.h" +//#include "CUnit/Console.h" + +#include "nfapi_interface.h" +#include "nfapi.h" +#include // for printf +#include +#include "debug.h" +#include "nfapi_interface.h" +/* Test Suite setup and cleanup functions: */ + +int init_suite(void) { return 0; } +int clean_suite(void) { return 0; } + +#define MAX_PACKED_MESSAGE_SIZE 8192 + +#define IN_OUT_ASSERT(_V) { CU_ASSERT_EQUAL(in._V, out._V); } + +typedef struct +{ + nfapi_tl_t tl; + uint16_t value1; + uint32_t value2; +} my_vendor_extention; + +extern void* nfapi_allocate_pdu(size_t size) +{ + return malloc(size); +} + +extern int nfapi_test_unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMsg, uint8_t *end, void** ve, nfapi_p4_p5_codec_config_t* config) +{ + printf("nfapi_unpack_vendor_extension_tlv\n"); + + if(tl->tag == NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE) + { + my_vendor_extention* mve = (my_vendor_extention*)malloc(sizeof(my_vendor_extention)); + mve->tl.tag = NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE; + + if(!(pull16(ppReadPackedMsg, &mve->value1, end) && + pull32(ppReadPackedMsg, &mve->value2, end))) + { + free(mve); + return 0; + } + + (*ve) = mve; + + } + + return 1; +} + +int nfapi_pack_vendor_extension_tlv_called = 0; +extern int nfapi_test_pack_vendor_extension_tlv(void* ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + printf("nfapi_pack_vendor_extension_tlv\n"); + nfapi_pack_vendor_extension_tlv_called++; + + my_vendor_extention* mve = (my_vendor_extention*)ve; + + return (push16(mve->value1, ppWritePackedMsg, end) && + push32(mve->value2, ppWritePackedMsg, end)); + +} + +uint8_t gTestNfapiMessageTx[MAX_PACKED_MESSAGE_SIZE]; + + +uint8_t rand8(uint8_t min, uint8_t max) +{ + return ((rand() % (max + 1 - min)) + min); +} + +/************* Test case functions ****************/ + +void test_case_sample(void) +{ + /*Sample assert function, use as per your test case scenario.*/ + CU_ASSERT(CU_TRUE); + CU_ASSERT_NOT_EQUAL(2, -1); + CU_ASSERT_STRING_EQUAL("string #1", "string #1"); + CU_ASSERT_STRING_NOT_EQUAL("string #1", "string #2"); + + CU_ASSERT(CU_FALSE); + CU_ASSERT_EQUAL(2, 3); + CU_ASSERT_STRING_NOT_EQUAL("string #1", "string #1"); + CU_ASSERT_STRING_EQUAL("string #1", "string #2"); +} + + +int nfapi_test_verify_configreq_params(nfapi_pnf_config_request_t pnfConfigRequest_in, nfapi_pnf_config_request_t pnfConfigRequest_out) +{ + int i=0; + if(memcmp(&pnfConfigRequest_in, &pnfConfigRequest_out, sizeof(nfapi_pnf_config_request_t)) == 0) + { + /*packed and unpacked phy config request are matched.*/ + + printf("Success: packed and unpacked phy config request are matched\n"); + return 1; + } + else + { + if (pnfConfigRequest_in.header.message_id != pnfConfigRequest_out.header.message_id) + { + printf("Mismatch: packed message id %d, unpacked message id %d\n", + pnfConfigRequest_in.header.message_id, pnfConfigRequest_out.header.message_id); + } + if (pnfConfigRequest_in.header.message_length != pnfConfigRequest_out.header.message_length) + { + printf("Mismatch: packed message_length %d, unpacked message_length %d\n", + pnfConfigRequest_in.header.message_length, pnfConfigRequest_out.header.message_length); + } + if (pnfConfigRequest_in.header.phy_id != pnfConfigRequest_out.header.phy_id) + { + printf("Mismatch: packed phy_id %d, unpacked phy_id %d\n", + pnfConfigRequest_in.header.phy_id, pnfConfigRequest_out.header.phy_id); + } + if (pnfConfigRequest_in.pnf_phy_rf_config.number_phy_rf_config_info != pnfConfigRequest_out.pnf_phy_rf_config.number_phy_rf_config_info) + { + printf("Mismatch: packed number_phy_rf_config_info %d, unpacked number_phy_rf_config_info %d\n", + pnfConfigRequest_in.pnf_phy_rf_config.number_phy_rf_config_info, pnfConfigRequest_out.pnf_phy_rf_config.number_phy_rf_config_info); + } + + for (i=0; i < NFAPI_MAX_PHY_RF_INSTANCES; i++) + { + if (pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[i].phy_id != pnfConfigRequest_out.pnf_phy_rf_config.phy_rf_config[i].phy_id) + { + printf("Mismatch: rf idx %d, packed phy id %d, unpacked phy id %d\n", + i, pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[i].phy_id, pnfConfigRequest_out.pnf_phy_rf_config.phy_rf_config[i].phy_id); + } + if (pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[i].phy_config_index!= pnfConfigRequest_out.pnf_phy_rf_config.phy_rf_config[i].phy_config_index) + { + printf("Mismatch: rf idx %d, packed phy_config_index %d, unpacked phy_config_index %d\n", + i, pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[i].phy_config_index, pnfConfigRequest_out.pnf_phy_rf_config.phy_rf_config[i].phy_config_index); + } + if (pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[i].rf_config_index != pnfConfigRequest_out.pnf_phy_rf_config.phy_rf_config[i].rf_config_index) + { + printf("Mismatch: rf idx %d, packed rf_config_index %d, unpacked rf_config_index %d\n", + i, pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[i].rf_config_index, pnfConfigRequest_out.pnf_phy_rf_config.phy_rf_config[i].rf_config_index); + } + } + return 0; + } + +} + + +void nfapi_test_pnf_config_req(void) +{ + + nfapi_pnf_config_request_t pnfConfigRequest_out; + nfapi_pnf_config_request_t pnfConfigRequest_in; + int packedMessageLength =0; + + printf(" nfapi_test_pnf_config_req run \n"); + + /* Build phy config req */ + pnfConfigRequest_in.header.phy_id = NFAPI_PHY_ID_NA; + pnfConfigRequest_in.header.message_id = NFAPI_PNF_CONFIG_REQUEST; + pnfConfigRequest_in.header.message_length = 22; + pnfConfigRequest_in.header.spare = 0; + + pnfConfigRequest_in.pnf_phy_rf_config.tl.tag = NFAPI_PNF_PHY_RF_TAG; + pnfConfigRequest_in.pnf_phy_rf_config.tl.length = 0; + pnfConfigRequest_in.pnf_phy_rf_config.number_phy_rf_config_info = 2; + pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[0].phy_id = 4; + pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[0].phy_config_index = 1; + pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[0].rf_config_index = 1; + pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[1].phy_id = 5; + pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[1].phy_config_index = 2; + pnfConfigRequest_in.pnf_phy_rf_config.phy_rf_config[1].rf_config_index = 2; + + /*Pack pnf config req*/ + packedMessageLength = nfapi_p5_message_pack(&pnfConfigRequest_in, sizeof(nfapi_pnf_config_request_t), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + /*Unpack pnf config request*/ + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &pnfConfigRequest_out, sizeof(nfapi_pnf_config_request_t), 0); + + /*Verify unpacked message*/ + CU_ASSERT_EQUAL(nfapi_test_verify_configreq_params(pnfConfigRequest_in, pnfConfigRequest_out), 1); + +} + +void nfapi_test_2(void) { + /*Sample test function*/ + CU_ASSERT_EQUAL( 0, 0); +} + +void nfapi_test_rssi_request_lte() +{ + uint16_t idx; + nfapi_rssi_request_t in; + nfapi_rssi_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_RSSI_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_LTE; + + in.lte_rssi_request.tl.tag = NFAPI_LTE_RSSI_REQUEST_TAG; + in.lte_rssi_request.frequency_band_indicator = 0; + in.lte_rssi_request.bandwidth = 0; + in.lte_rssi_request.timeout = 0; + in.lte_rssi_request.number_of_earfcns = 4; + in.lte_rssi_request.earfcn[0] = 42; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + int upack_result = nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_NOT_EQUAL(packedMessageLength, -1); + CU_ASSERT_NOT_EQUAL(packedMessageLength, 0); + CU_ASSERT_NOT_EQUAL(upack_result, 0); + CU_ASSERT_NOT_EQUAL(upack_result, -1); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.lte_rssi_request.frequency_band_indicator, out.lte_rssi_request.frequency_band_indicator); + CU_ASSERT_EQUAL(in.lte_rssi_request.bandwidth, out.lte_rssi_request.bandwidth); + CU_ASSERT_EQUAL(in.lte_rssi_request.timeout, out.lte_rssi_request.timeout); + CU_ASSERT_EQUAL(in.lte_rssi_request.number_of_earfcns, out.lte_rssi_request.number_of_earfcns); + + for(idx = 0; idx < out.lte_rssi_request.number_of_earfcns; ++idx) + { + CU_ASSERT_EQUAL(in.lte_rssi_request.earfcn[idx], out.lte_rssi_request.earfcn[idx]); + } +} + +void nfapi_test_rssi_request_lte2() +{ + uint16_t idx; + nfapi_rssi_request_t in; + nfapi_rssi_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_RSSI_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_LTE; + + in.lte_rssi_request.tl.tag = NFAPI_LTE_RSSI_REQUEST_TAG; + in.lte_rssi_request.frequency_band_indicator = 0; + in.lte_rssi_request.bandwidth = 0; + in.lte_rssi_request.timeout = 0; + in.lte_rssi_request.number_of_earfcns = 4; + in.lte_rssi_request.earfcn[0] = 42; + + // try and pak with a buffer that is too small + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, NFAPI_HEADER_LENGTH + 4, 0); + CU_ASSERT_EQUAL(packedMessageLength, -1); + + // pack correctly + packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + // unpack with a small bufer + int upack_result = nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength - 1, &out, sizeof(out), 0); + + upack_result = nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_NOT_EQUAL(packedMessageLength, -1); + CU_ASSERT_NOT_EQUAL(packedMessageLength, 0); + CU_ASSERT_NOT_EQUAL(upack_result, 0); + CU_ASSERT_NOT_EQUAL(upack_result, -1); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.lte_rssi_request.frequency_band_indicator, out.lte_rssi_request.frequency_band_indicator); + CU_ASSERT_EQUAL(in.lte_rssi_request.bandwidth, out.lte_rssi_request.bandwidth); + CU_ASSERT_EQUAL(in.lte_rssi_request.timeout, out.lte_rssi_request.timeout); + CU_ASSERT_EQUAL(in.lte_rssi_request.number_of_earfcns, out.lte_rssi_request.number_of_earfcns); + + for(idx = 0; idx < out.lte_rssi_request.number_of_earfcns; ++idx) + { + CU_ASSERT_EQUAL(in.lte_rssi_request.earfcn[idx], out.lte_rssi_request.earfcn[idx]); + } +} + + + +// Test decoding of message which has a large number if earfcn which could +// cause a buffer over run if not handled +void nfapi_test_rssi_request_lte_overrun() +{ + nfapi_rssi_request_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t* end = p + 1024; + push16(0, &p, end); + push16(NFAPI_RSSI_REQUEST, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push8(NFAPI_RAT_TYPE_LTE, &p, end); + push16(NFAPI_LTE_RSSI_REQUEST_TAG, &p, end); + push16(11, &p, end); + + push8(0, &p, end); + push16(0, &p, end); + push8(0, &p, end); + push32(0, &p, end); + push8(123, &p, end); // to many EARFCN's + push16(16, &p, end); + + int result = nfapi_p4_message_unpack(buffer, sizeof(buffer), &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} + +void nfapi_test_rssi_request_lte_rat_type_mismatch() +{ + nfapi_rssi_request_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_RSSI_REQUEST, &p, end); + push16(16, &p, end); + push16(0, &p, end); + + push8(NFAPI_RAT_TYPE_GERAN, &p, end); + + push16(NFAPI_LTE_RSSI_REQUEST_TAG, &p, end); + push16(11, &p, end); + + push8(0, &p, end); + push16(0, &p, end); + push8(0, &p, end); + push32(0, &p, end); + push8(1, &p, end); + push16(16, &p, end); + + int result = nfapi_p4_message_unpack(buffer, sizeof(buffer), &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} + +void nfapi_test_rssi_request_utran() +{ + uint16_t idx; + nfapi_rssi_request_t in; + nfapi_rssi_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_RSSI_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_UTRAN; + + + in.utran_rssi_request.tl.tag = NFAPI_UTRAN_RSSI_REQUEST_TAG; + in.utran_rssi_request.frequency_band_indicator = 0; + in.utran_rssi_request.measurement_period = 0; + in.utran_rssi_request.timeout = 0; + in.utran_rssi_request.number_of_uarfcns = 3; + in.utran_rssi_request.uarfcn[0] = 42; + in.utran_rssi_request.uarfcn[1] = 42; + in.utran_rssi_request.uarfcn[2] = 42; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.utran_rssi_request.frequency_band_indicator, out.utran_rssi_request.frequency_band_indicator); + CU_ASSERT_EQUAL(in.utran_rssi_request.measurement_period, out.utran_rssi_request.measurement_period); + CU_ASSERT_EQUAL(in.utran_rssi_request.timeout, out.utran_rssi_request.timeout); + CU_ASSERT_EQUAL(in.utran_rssi_request.number_of_uarfcns, out.utran_rssi_request.number_of_uarfcns); + + for(idx = 0; idx < out.utran_rssi_request.number_of_uarfcns; ++idx) + { + CU_ASSERT_EQUAL(in.utran_rssi_request.uarfcn[idx], out.utran_rssi_request.uarfcn[idx]); + } + +} + +void nfapi_test_rssi_request_geran() +{ + uint16_t idx; + nfapi_rssi_request_t in; + nfapi_rssi_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_RSSI_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_GERAN; + + in.geran_rssi_request.tl.tag = NFAPI_GERAN_RSSI_REQUEST_TAG; + in.geran_rssi_request.frequency_band_indicator = 0; + in.geran_rssi_request.measurement_period = 0; + in.geran_rssi_request.timeout = 0; + in.geran_rssi_request.number_of_arfcns = 3; + in.geran_rssi_request.arfcn[0].arfcn = 42; + in.geran_rssi_request.arfcn[0].direction = 0; + in.geran_rssi_request.arfcn[1].arfcn = 42; + in.geran_rssi_request.arfcn[1].direction = 1; + in.geran_rssi_request.arfcn[2].arfcn = 42; + in.geran_rssi_request.arfcn[2].direction = 1; + + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.geran_rssi_request.frequency_band_indicator, out.geran_rssi_request.frequency_band_indicator); + CU_ASSERT_EQUAL(in.geran_rssi_request.measurement_period, out.geran_rssi_request.measurement_period); + CU_ASSERT_EQUAL(in.geran_rssi_request.timeout, out.geran_rssi_request.timeout); + CU_ASSERT_EQUAL(in.geran_rssi_request.number_of_arfcns, out.geran_rssi_request.number_of_arfcns); + + for(idx = 0; idx < out.geran_rssi_request.number_of_arfcns; ++idx) + { + CU_ASSERT_EQUAL(in.geran_rssi_request.arfcn[idx].arfcn, out.geran_rssi_request.arfcn[idx].arfcn); + CU_ASSERT_EQUAL(in.geran_rssi_request.arfcn[idx].direction, out.geran_rssi_request.arfcn[idx].direction); + } +} + +void nfapi_test_rssi_request_nb_iot() +{ + uint16_t idx, idx2; + nfapi_rssi_request_t in; + nfapi_rssi_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_RSSI_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_NB_IOT; + + in.nb_iot_rssi_request.tl.tag = NFAPI_NB_IOT_RSSI_REQUEST_TAG; + in.nb_iot_rssi_request.frequency_band_indicator = 34; + in.nb_iot_rssi_request.measurement_period = 900; + in.nb_iot_rssi_request.timeout = 4321; + in.nb_iot_rssi_request.number_of_earfcns = 3; + in.nb_iot_rssi_request.earfcn[0].earfcn = 42; + in.nb_iot_rssi_request.earfcn[0].number_of_ro_dl = 1; + in.nb_iot_rssi_request.earfcn[0].ro_dl[0] = 2; + in.nb_iot_rssi_request.earfcn[1].earfcn = 43; + in.nb_iot_rssi_request.earfcn[1].number_of_ro_dl = 0; + in.nb_iot_rssi_request.earfcn[2].earfcn = 44; + in.nb_iot_rssi_request.earfcn[2].number_of_ro_dl = 2; + in.nb_iot_rssi_request.earfcn[2].ro_dl[0] = 0; + in.nb_iot_rssi_request.earfcn[2].ro_dl[1] = 4; + + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + IN_OUT_ASSERT(header.message_id); + IN_OUT_ASSERT(rat_type); + IN_OUT_ASSERT(nb_iot_rssi_request.frequency_band_indicator); + IN_OUT_ASSERT(nb_iot_rssi_request.measurement_period); + IN_OUT_ASSERT(nb_iot_rssi_request.timeout); + IN_OUT_ASSERT(nb_iot_rssi_request.number_of_earfcns); + + for(idx = 0; idx < out.nb_iot_rssi_request.number_of_earfcns; ++idx) + { + IN_OUT_ASSERT(nb_iot_rssi_request.earfcn[idx].earfcn); + IN_OUT_ASSERT(nb_iot_rssi_request.earfcn[idx].number_of_ro_dl); + + for(idx2 = 0; idx2 < out.nb_iot_rssi_request.earfcn[idx].number_of_ro_dl; ++idx2) + IN_OUT_ASSERT(nb_iot_rssi_request.earfcn[idx].ro_dl[idx2]); + } +} + + +void nfapi_test_rssi_response() +{ + nfapi_rssi_response_t in; + nfapi_rssi_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_RSSI_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + +} + +void nfapi_test_rssi_indication() +{ + uint16_t idx = 0; + nfapi_rssi_indication_t in; + nfapi_rssi_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_RSSI_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_OK; + in.rssi_indication_body.tl.tag = NFAPI_RSSI_INDICATION_TAG; + in.rssi_indication_body.tl.length = 0; + in.rssi_indication_body.number_of_rssi = 4; + in.rssi_indication_body.rssi[0] = 2; + in.rssi_indication_body.rssi[1] = 0; + in.rssi_indication_body.rssi[2] = -23; + in.rssi_indication_body.rssi[3] = -18000; + + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.rssi_indication_body.tl.tag, out.rssi_indication_body.tl.tag); + CU_ASSERT_EQUAL(in.rssi_indication_body.number_of_rssi, out.rssi_indication_body.number_of_rssi); + + for(idx = 0; idx < out.rssi_indication_body.number_of_rssi; ++idx) + { + CU_ASSERT_EQUAL(in.rssi_indication_body.rssi[idx], out.rssi_indication_body.rssi[idx]); + } + +} +void nfapi_test_rssi_indication_overrun() +{ + nfapi_rssi_indication_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_RSSI_INDICATION, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push32(0, &p, end); // error code + + push16(NFAPI_RSSI_INDICATION_TAG, &p, end); + push16(11, &p, end); + + push16(NFAPI_MAX_RSSI + 23, &p, end); // to many EARFCN's + push16(16, &p, end); + + int result = nfapi_p4_message_unpack(buffer, sizeof(buffer), &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} + +void nfapi_test_cell_search_request_lte() +{ + uint16_t idx; + nfapi_cell_search_request_t in; + nfapi_cell_search_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_CELL_SEARCH_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_LTE; + + in.lte_cell_search_request.tl.tag = NFAPI_LTE_CELL_SEARCH_REQUEST_TAG; + in.lte_cell_search_request.earfcn = 213; + in.lte_cell_search_request.measurement_bandwidth = 1; + in.lte_cell_search_request.exhaustive_search = 0; + in.lte_cell_search_request.timeout = 123; + in.lte_cell_search_request.number_of_pci = 3; + in.lte_cell_search_request.pci[0] = 3; + in.lte_cell_search_request.pci[1] = 6; + in.lte_cell_search_request.pci[2] = 9; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.lte_cell_search_request.earfcn, out.lte_cell_search_request.earfcn); + CU_ASSERT_EQUAL(in.lte_cell_search_request.measurement_bandwidth, out.lte_cell_search_request.measurement_bandwidth); + CU_ASSERT_EQUAL(in.lte_cell_search_request.exhaustive_search, out.lte_cell_search_request.exhaustive_search); + CU_ASSERT_EQUAL(in.lte_cell_search_request.timeout, out.lte_cell_search_request.timeout); + CU_ASSERT_EQUAL(in.lte_cell_search_request.number_of_pci, out.lte_cell_search_request.number_of_pci); + + for(idx = 0; idx < out.lte_cell_search_request.number_of_pci; ++idx) + { + CU_ASSERT_EQUAL(in.lte_cell_search_request.pci[idx], out.lte_cell_search_request.pci[idx]); + } +} + +void nfapi_test_cell_search_request_utran() +{ + uint16_t idx; + nfapi_cell_search_request_t in; + nfapi_cell_search_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_CELL_SEARCH_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_UTRAN; + + in.utran_cell_search_request.tl.tag = NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG; + in.utran_cell_search_request.uarfcn = 213; + in.utran_cell_search_request.exhaustive_search = 0; + in.utran_cell_search_request.timeout = 123; + in.utran_cell_search_request.number_of_psc = 3; + in.utran_cell_search_request.psc[0] = 3; + in.utran_cell_search_request.psc[1] = 6; + in.utran_cell_search_request.psc[2] = 9; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + int unpackResult = nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_NOT_EQUAL(unpackResult, -1); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.utran_cell_search_request.uarfcn, out.utran_cell_search_request.uarfcn); + CU_ASSERT_EQUAL(in.utran_cell_search_request.exhaustive_search, out.utran_cell_search_request.exhaustive_search); + CU_ASSERT_EQUAL(in.utran_cell_search_request.timeout, out.utran_cell_search_request.timeout); + CU_ASSERT_EQUAL(in.utran_cell_search_request.number_of_psc, out.utran_cell_search_request.number_of_psc); + + for(idx = 0; idx < out.utran_cell_search_request.number_of_psc; ++idx) + { + CU_ASSERT_EQUAL(in.utran_cell_search_request.psc[idx], out.utran_cell_search_request.psc[idx]); + } +} + +void nfapi_test_cell_search_request_geran() +{ + uint16_t idx; + nfapi_cell_search_request_t in; + nfapi_cell_search_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_CELL_SEARCH_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_GERAN; + + in.geran_cell_search_request.tl.tag = NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG; + in.geran_cell_search_request.timeout = 123; + in.geran_cell_search_request.number_of_arfcn = 3; + in.geran_cell_search_request.arfcn[0] = 3; + in.geran_cell_search_request.arfcn[1] = 6; + in.geran_cell_search_request.arfcn[2] = 9; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + int unpackResult = nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_NOT_EQUAL(unpackResult, -1); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.geran_cell_search_request.timeout, out.geran_cell_search_request.timeout); + CU_ASSERT_EQUAL(in.geran_cell_search_request.number_of_arfcn, out.geran_cell_search_request.number_of_arfcn); + + for(idx = 0; idx < out.geran_cell_search_request.number_of_arfcn; ++idx) + { + CU_ASSERT_EQUAL(in.geran_cell_search_request.arfcn[idx], out.geran_cell_search_request.arfcn[idx]); + } +} + +void nfapi_test_cell_search_request_nb_iot() +{ + uint16_t idx; + nfapi_cell_search_request_t in; + nfapi_cell_search_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_CELL_SEARCH_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_NB_IOT; + + in.nb_iot_cell_search_request.tl.tag = NFAPI_NB_IOT_CELL_SEARCH_REQUEST_TAG; + in.nb_iot_cell_search_request.earfcn = 54; + in.nb_iot_cell_search_request.ro_dl = 3; + in.nb_iot_cell_search_request.exhaustive_search = 1; + in.nb_iot_cell_search_request.timeout = 123; + in.nb_iot_cell_search_request.number_of_pci = 3; + in.nb_iot_cell_search_request.pci[0] = 3; + in.nb_iot_cell_search_request.pci[1] = 6; + in.nb_iot_cell_search_request.pci[2] = 9; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + int unpackResult = nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_NOT_EQUAL(unpackResult, -1); + + IN_OUT_ASSERT(header.message_id); + IN_OUT_ASSERT(rat_type); + IN_OUT_ASSERT(nb_iot_cell_search_request.earfcn); + IN_OUT_ASSERT(nb_iot_cell_search_request.ro_dl); + IN_OUT_ASSERT(nb_iot_cell_search_request.exhaustive_search); + IN_OUT_ASSERT(nb_iot_cell_search_request.timeout); + IN_OUT_ASSERT(nb_iot_cell_search_request.number_of_pci); + + for(idx = 0; idx < out.nb_iot_cell_search_request.number_of_pci; ++idx) + { + IN_OUT_ASSERT(nb_iot_cell_search_request.pci[idx]); + } +} + +void nfapi_test_cell_search_response() +{ + nfapi_cell_search_response_t in; + nfapi_cell_search_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_CELL_SEARCH_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); +} + +void nfapi_test_cell_search_indication_lte() +{ + uint16_t idx = 0; + nfapi_cell_search_indication_t in; + nfapi_cell_search_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_CELL_SEARCH_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_OK; + in.lte_cell_search_indication.tl.tag = NFAPI_LTE_CELL_SEARCH_INDICATION_TAG; + in.lte_cell_search_indication.number_of_lte_cells_found = 2; + in.lte_cell_search_indication.lte_found_cells[0].pci = 0; + in.lte_cell_search_indication.lte_found_cells[0].rsrp = 42; + in.lte_cell_search_indication.lte_found_cells[0].rsrq= 11; + in.lte_cell_search_indication.lte_found_cells[0].frequency_offset = -100; + + in.lte_cell_search_indication.lte_found_cells[1].pci = 123; + in.lte_cell_search_indication.lte_found_cells[1].rsrp = 2; + in.lte_cell_search_indication.lte_found_cells[1].rsrq= 17; + in.lte_cell_search_indication.lte_found_cells[1].frequency_offset = 123; + + in.utran_cell_search_indication.tl.tag = 0; + in.geran_cell_search_indication.tl.tag = 0; + in.nb_iot_cell_search_indication.tl.tag = 0; + in.pnf_cell_search_state.tl.tag = 0; + + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.lte_cell_search_indication.tl.tag, out.lte_cell_search_indication.tl.tag); + CU_ASSERT_EQUAL(in.lte_cell_search_indication.number_of_lte_cells_found, out.lte_cell_search_indication.number_of_lte_cells_found); + + for(idx = 0; idx < out.lte_cell_search_indication.number_of_lte_cells_found; ++idx) + { + CU_ASSERT_EQUAL(in.lte_cell_search_indication.lte_found_cells[idx].pci, out.lte_cell_search_indication.lte_found_cells[idx].pci); + CU_ASSERT_EQUAL(in.lte_cell_search_indication.lte_found_cells[idx].rsrp, out.lte_cell_search_indication.lte_found_cells[idx].rsrp); + CU_ASSERT_EQUAL(in.lte_cell_search_indication.lte_found_cells[idx].rsrq, out.lte_cell_search_indication.lte_found_cells[idx].rsrq); + CU_ASSERT_EQUAL(in.lte_cell_search_indication.lte_found_cells[idx].frequency_offset, out.lte_cell_search_indication.lte_found_cells[idx].frequency_offset); + } + + + CU_ASSERT_EQUAL(in.utran_cell_search_indication.tl.tag, out.utran_cell_search_indication.tl.tag); + CU_ASSERT_EQUAL(in.geran_cell_search_indication.tl.tag, out.geran_cell_search_indication.tl.tag); + CU_ASSERT_EQUAL(in.pnf_cell_search_state.tl.tag, out.pnf_cell_search_state.tl.tag); +} +void nfapi_test_cell_search_indication_utran() +{ + uint16_t idx = 0; + nfapi_cell_search_indication_t in; + nfapi_cell_search_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_CELL_SEARCH_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_OK; + in.utran_cell_search_indication.tl.tag = NFAPI_UTRAN_CELL_SEARCH_INDICATION_TAG; + in.utran_cell_search_indication.number_of_utran_cells_found = 1; + in.utran_cell_search_indication.utran_found_cells[0].psc = 123; + in.utran_cell_search_indication.utran_found_cells[0].rscp = 2; + in.utran_cell_search_indication.utran_found_cells[0].ecno = 89; + in.utran_cell_search_indication.utran_found_cells[0].frequency_offset = -1000; + + in.lte_cell_search_indication.tl.tag = 0; + in.geran_cell_search_indication.tl.tag = 0; + in.nb_iot_cell_search_indication.tl.tag = 0; + in.pnf_cell_search_state.tl.tag = NFAPI_PNF_CELL_SEARCH_STATE_TAG; + in.pnf_cell_search_state.length = 12; + in.pnf_cell_search_state.value[0] = 34; + in.pnf_cell_search_state.value[1] = 35; + in.pnf_cell_search_state.value[2] = 36; + in.pnf_cell_search_state.value[3] = 37; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.utran_cell_search_indication.tl.tag, out.utran_cell_search_indication.tl.tag); + CU_ASSERT_EQUAL(in.utran_cell_search_indication.number_of_utran_cells_found, out.utran_cell_search_indication.number_of_utran_cells_found); + + for(idx = 0; idx < out.utran_cell_search_indication.number_of_utran_cells_found; ++idx) + { + CU_ASSERT_EQUAL(in.utran_cell_search_indication.utran_found_cells[idx].psc, out.utran_cell_search_indication.utran_found_cells[idx].psc); + CU_ASSERT_EQUAL(in.utran_cell_search_indication.utran_found_cells[idx].rscp, out.utran_cell_search_indication.utran_found_cells[idx].rscp); + CU_ASSERT_EQUAL(in.utran_cell_search_indication.utran_found_cells[idx].ecno, out.utran_cell_search_indication.utran_found_cells[idx].ecno); + CU_ASSERT_EQUAL(in.utran_cell_search_indication.utran_found_cells[idx].frequency_offset, out.utran_cell_search_indication.utran_found_cells[idx].frequency_offset); + } + + CU_ASSERT_EQUAL(in.lte_cell_search_indication.tl.tag, out.lte_cell_search_indication.tl.tag); + CU_ASSERT_EQUAL(in.geran_cell_search_indication.tl.tag, out.geran_cell_search_indication.tl.tag); + CU_ASSERT_EQUAL(in.pnf_cell_search_state.tl.tag, out.pnf_cell_search_state.tl.tag); + CU_ASSERT_EQUAL(in.pnf_cell_search_state.length, out.pnf_cell_search_state.length); + + for(idx = 0; idx < out.pnf_cell_search_state.length; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_cell_search_state.value[idx], out.pnf_cell_search_state.value[idx]); + } +} +void nfapi_test_cell_search_indication_geran() +{ + uint16_t idx = 0; + nfapi_cell_search_indication_t in; + nfapi_cell_search_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_CELL_SEARCH_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_OK; + in.geran_cell_search_indication.tl.tag = NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG; + in.geran_cell_search_indication.number_of_gsm_cells_found = 1; + in.geran_cell_search_indication.gsm_found_cells[0].arfcn = 123; + in.geran_cell_search_indication.gsm_found_cells[0].bsic = 2; + in.geran_cell_search_indication.gsm_found_cells[0].rxlev = 89; + in.geran_cell_search_indication.gsm_found_cells[0].rxqual = 12; + in.geran_cell_search_indication.gsm_found_cells[0].frequency_offset = 2389; + in.geran_cell_search_indication.gsm_found_cells[0].sfn_offset = 23; + + in.lte_cell_search_indication.tl.tag = 0; + in.utran_cell_search_indication.tl.tag = 0; + in.nb_iot_cell_search_indication.tl.tag = 0; + in.pnf_cell_search_state.tl.tag = NFAPI_PNF_CELL_SEARCH_STATE_TAG; + in.pnf_cell_search_state.length = 63; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.geran_cell_search_indication.tl.tag, out.geran_cell_search_indication.tl.tag); + CU_ASSERT_EQUAL(in.geran_cell_search_indication.number_of_gsm_cells_found, out.geran_cell_search_indication.number_of_gsm_cells_found); + + for(idx = 0; idx < out.geran_cell_search_indication.number_of_gsm_cells_found; ++idx) + { + CU_ASSERT_EQUAL(in.geran_cell_search_indication.gsm_found_cells[idx].arfcn, out.geran_cell_search_indication.gsm_found_cells[idx].arfcn); + CU_ASSERT_EQUAL(in.geran_cell_search_indication.gsm_found_cells[idx].bsic, out.geran_cell_search_indication.gsm_found_cells[idx].bsic); + CU_ASSERT_EQUAL(in.geran_cell_search_indication.gsm_found_cells[idx].rxlev, out.geran_cell_search_indication.gsm_found_cells[idx].rxlev); + CU_ASSERT_EQUAL(in.geran_cell_search_indication.gsm_found_cells[idx].rxqual, out.geran_cell_search_indication.gsm_found_cells[idx].rxqual); + CU_ASSERT_EQUAL(in.geran_cell_search_indication.gsm_found_cells[idx].frequency_offset, out.geran_cell_search_indication.gsm_found_cells[idx].frequency_offset); + CU_ASSERT_EQUAL(in.geran_cell_search_indication.gsm_found_cells[idx].sfn_offset, out.geran_cell_search_indication.gsm_found_cells[idx].sfn_offset); + } + + CU_ASSERT_EQUAL(in.lte_cell_search_indication.tl.tag, out.lte_cell_search_indication.tl.tag); + CU_ASSERT_EQUAL(in.utran_cell_search_indication.tl.tag, out.utran_cell_search_indication.tl.tag); + CU_ASSERT_EQUAL(in.nb_iot_cell_search_indication.tl.tag, out.nb_iot_cell_search_indication.tl.tag); + CU_ASSERT_EQUAL(in.pnf_cell_search_state.tl.tag, out.pnf_cell_search_state.tl.tag); + CU_ASSERT_EQUAL(in.pnf_cell_search_state.length, out.pnf_cell_search_state.length); + + for(idx = 0; idx < out.pnf_cell_search_state.length; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_cell_search_state.value[idx], out.pnf_cell_search_state.value[idx]); + } +} + +void nfapi_test_cell_search_indication_nb_iot() +{ + uint16_t idx = 0; + nfapi_cell_search_indication_t in; + nfapi_cell_search_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_CELL_SEARCH_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_OK; + in.nb_iot_cell_search_indication.tl.tag = NFAPI_NB_IOT_CELL_SEARCH_INDICATION_TAG; + in.nb_iot_cell_search_indication.number_of_nb_iot_cells_found = 1; + in.nb_iot_cell_search_indication.nb_iot_found_cells[0].pci = 123; + in.nb_iot_cell_search_indication.nb_iot_found_cells[0].rsrp = 2; + in.nb_iot_cell_search_indication.nb_iot_found_cells[0].rsrq = 89; + in.nb_iot_cell_search_indication.nb_iot_found_cells[0].frequency_offset = 2389; + + in.lte_cell_search_indication.tl.tag = 0; + in.utran_cell_search_indication.tl.tag = 0; + in.geran_cell_search_indication.tl.tag = 0; + + in.pnf_cell_search_state.tl.tag = NFAPI_PNF_CELL_SEARCH_STATE_TAG; + in.pnf_cell_search_state.length = 63; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + IN_OUT_ASSERT(header.message_id); + IN_OUT_ASSERT(error_code); + IN_OUT_ASSERT(nb_iot_cell_search_indication.tl.tag); + IN_OUT_ASSERT(nb_iot_cell_search_indication.number_of_nb_iot_cells_found); + + for(idx = 0; idx < out.nb_iot_cell_search_indication.number_of_nb_iot_cells_found; ++idx) + { + IN_OUT_ASSERT(nb_iot_cell_search_indication.nb_iot_found_cells[idx].pci); + IN_OUT_ASSERT(nb_iot_cell_search_indication.nb_iot_found_cells[idx].rsrp); + IN_OUT_ASSERT(nb_iot_cell_search_indication.nb_iot_found_cells[idx].rsrq); + IN_OUT_ASSERT(nb_iot_cell_search_indication.nb_iot_found_cells[idx].frequency_offset); + } + + IN_OUT_ASSERT(lte_cell_search_indication.tl.tag); + IN_OUT_ASSERT(utran_cell_search_indication.tl.tag); + IN_OUT_ASSERT(geran_cell_search_indication.tl.tag); + IN_OUT_ASSERT(pnf_cell_search_state.tl.tag); + IN_OUT_ASSERT(pnf_cell_search_state.length); + + for(idx = 0; idx < out.pnf_cell_search_state.length; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_cell_search_state.value[idx], out.pnf_cell_search_state.value[idx]); + } +} + +void nfapi_test_cell_search_request_lte_overrun() +{ + nfapi_cell_search_request_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_CELL_SEARCH_REQUEST, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push8(0, &p, end); // rat_type + + push16(NFAPI_LTE_CELL_SEARCH_REQUEST_TAG, &p, end); + push16(8, &p, end); + + push16(11, &p, end); + push8(11, &p, end); + push8(11, &p, end); + push32(11, &p, end); + push8(NFAPI_MAX_PCI_LIST + 1, &p, end); + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); + +} +void nfapi_test_cell_search_request_utran_overrun() +{ + nfapi_cell_search_request_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_CELL_SEARCH_REQUEST, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push8(NFAPI_RAT_TYPE_UTRAN, &p, end); // rat_type + + push16(NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG, &p, end); + push16(8, &p, end); + + push16(11, &p, end); + push8(11, &p, end); + push32(11, &p, end); + push8(NFAPI_MAX_PSC_LIST + 1, &p, end); + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} +void nfapi_test_cell_search_request_geran_overrun() +{ + nfapi_cell_search_request_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_CELL_SEARCH_REQUEST, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push8(NFAPI_RAT_TYPE_GERAN, &p, end); // rat_type + + push16(NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG, &p, end); + push16(8, &p, end); + + push32(11, &p, end); + push8(NFAPI_MAX_ARFCN_LIST + 1, &p, end); + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} +void nfapi_test_cell_search_indication_lte_overrun() +{ + nfapi_cell_search_indication_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_CELL_SEARCH_INDICATION, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push32(0, &p, end); // error_code + + push16(NFAPI_LTE_CELL_SEARCH_INDICATION_TAG, &p, end); + push16(8, &p, end); + + push16(NFAPI_MAX_LTE_CELLS_FOUND + 1, &p, end); + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} +void nfapi_test_cell_search_indication_utran_overrun() +{ + nfapi_cell_search_indication_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_CELL_SEARCH_INDICATION, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push32(0, &p, end); // error_code + + push16(NFAPI_UTRAN_CELL_SEARCH_INDICATION_TAG, &p, end); + push16(8, &p, end); + + push16(NFAPI_MAX_UTRAN_CELLS_FOUND + 1, &p, end); + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} +void nfapi_test_cell_search_indication_geran_overrun() +{ + nfapi_cell_search_indication_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_CELL_SEARCH_INDICATION, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push32(0, &p, end); // error_code + + push16(NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG, &p, end); + push16(8, &p, end); + + push16(NFAPI_MAX_GSM_CELLS_FOUND + 1, &p, end); + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} +void nfapi_test_cell_search_indication_state_overrun() +{ + nfapi_cell_search_indication_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_CELL_SEARCH_INDICATION, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push32(0, &p, end); // error_code + + push16(NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG, &p, end); + push16(13, &p, end); + + push16(1, &p, end); + if(1) + { + push16(42, &p, end); + push8(42, &p, end); + push8(42, &p, end); + push8(42, &p, end); + pushs16(42, &p, end); + push32(42, &p, end); + } + + push16(NFAPI_PNF_CELL_SEARCH_STATE_TAG, &p, end); + push16(NFAPI_MAX_OPAQUE_DATA + 12, &p, end); + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} +void nfapi_test_broadcast_detect_request_lte() +{ + nfapi_broadcast_detect_request_t in; + nfapi_broadcast_detect_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_BROADCAST_DETECT_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_LTE; + + in.lte_broadcast_detect_request.tl.tag = NFAPI_LTE_BROADCAST_DETECT_REQUEST_TAG; + in.lte_broadcast_detect_request.earfcn = 123; + in.lte_broadcast_detect_request.pci = 12; + in.lte_broadcast_detect_request.timeout = 1246; + + in.pnf_cell_search_state.tl.tag = 0; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + int unpackResult = nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_NOT_EQUAL(unpackResult, -1); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.lte_broadcast_detect_request.earfcn, out.lte_broadcast_detect_request.earfcn); + CU_ASSERT_EQUAL(in.lte_broadcast_detect_request.pci, out.lte_broadcast_detect_request.pci); + CU_ASSERT_EQUAL(in.lte_broadcast_detect_request.timeout, out.lte_broadcast_detect_request.timeout); + +} +void nfapi_test_broadcast_detect_request_utran() +{ + uint16_t idx; + nfapi_broadcast_detect_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_broadcast_detect_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_BROADCAST_DETECT_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_UTRAN; + + in.utran_broadcast_detect_request.tl.tag = NFAPI_UTRAN_BROADCAST_DETECT_REQUEST_TAG; + in.utran_broadcast_detect_request.uarfcn = 123; + in.utran_broadcast_detect_request.psc = 12; + in.utran_broadcast_detect_request.timeout = 1246; + + in.pnf_cell_search_state.tl.tag = NFAPI_PNF_CELL_SEARCH_STATE_TAG; + in.pnf_cell_search_state.length = 60; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + CU_ASSERT_NOT_EQUAL(packedMessageLength, 0); + CU_ASSERT_NOT_EQUAL(packedMessageLength, -1); + + int unpackResult = nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_NOT_EQUAL(unpackResult, 0); + CU_ASSERT_NOT_EQUAL(unpackResult, -1); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.utran_broadcast_detect_request.uarfcn, out.utran_broadcast_detect_request.uarfcn); + CU_ASSERT_EQUAL(in.utran_broadcast_detect_request.psc, out.utran_broadcast_detect_request.psc); + CU_ASSERT_EQUAL(in.utran_broadcast_detect_request.timeout, out.utran_broadcast_detect_request.timeout); + + CU_ASSERT_EQUAL(in.pnf_cell_search_state.length, out.pnf_cell_search_state.length); + + for(idx = 0; idx < out.pnf_cell_search_state.length; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_cell_search_state.value[idx], out.pnf_cell_search_state.value[idx]); + } + +} + +void nfapi_test_broadcast_detect_request_nb_iot() +{ + uint16_t idx; + nfapi_broadcast_detect_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_broadcast_detect_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_BROADCAST_DETECT_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_NB_IOT; + + in.nb_iot_broadcast_detect_request.tl.tag = NFAPI_NB_IOT_BROADCAST_DETECT_REQUEST_TAG; + in.nb_iot_broadcast_detect_request.earfcn = 123; + in.nb_iot_broadcast_detect_request.ro_dl = 12; + in.nb_iot_broadcast_detect_request.pci = 12; + in.nb_iot_broadcast_detect_request.timeout = 1246; + + in.pnf_cell_search_state.tl.tag = NFAPI_PNF_CELL_SEARCH_STATE_TAG; + in.pnf_cell_search_state.length = 60; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + CU_ASSERT_NOT_EQUAL(packedMessageLength, 0); + CU_ASSERT_NOT_EQUAL(packedMessageLength, -1); + + int unpackResult = nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_NOT_EQUAL(unpackResult, 0); + CU_ASSERT_NOT_EQUAL(unpackResult, -1); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.nb_iot_broadcast_detect_request.earfcn, out.nb_iot_broadcast_detect_request.earfcn); + CU_ASSERT_EQUAL(in.nb_iot_broadcast_detect_request.ro_dl, out.nb_iot_broadcast_detect_request.ro_dl); + CU_ASSERT_EQUAL(in.nb_iot_broadcast_detect_request.pci, out.nb_iot_broadcast_detect_request.pci); + CU_ASSERT_EQUAL(in.nb_iot_broadcast_detect_request.timeout, out.nb_iot_broadcast_detect_request.timeout); + + CU_ASSERT_EQUAL(in.pnf_cell_search_state.length, out.pnf_cell_search_state.length); + + for(idx = 0; idx < out.pnf_cell_search_state.length; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_cell_search_state.value[idx], out.pnf_cell_search_state.value[idx]); + } + +} + + +void nfapi_test_broadcast_detect_request_state_overrun() +{ + nfapi_broadcast_detect_request_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_BROADCAST_DETECT_REQUEST, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push8(NFAPI_RAT_TYPE_UTRAN, &p, end); // error_code + + push16(NFAPI_UTRAN_BROADCAST_DETECT_REQUEST_TAG, &p, end); + push16(8, &p, end); + + push16(42, &p, end); + push16(42, &p, end); + push32(42, &p, end); + + push16(NFAPI_PNF_CELL_SEARCH_STATE_TAG, &p, end); + push16(NFAPI_MAX_OPAQUE_DATA + 12, &p, end); + + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} + +void nfapi_test_broadcast_detect_response() +{ + nfapi_broadcast_detect_response_t in; + nfapi_broadcast_detect_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_BROADCAST_DETECT_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + +} +void nfapi_test_broadcast_detect_indication_lte() +{ + uint16_t idx; + nfapi_broadcast_detect_indication_t in; + nfapi_broadcast_detect_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_BROADCAST_DETECT_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + + in.lte_broadcast_detect_indication.tl.tag = NFAPI_LTE_BROADCAST_DETECT_INDICATION_TAG; + in.lte_broadcast_detect_indication.number_of_tx_antenna = 1; + in.lte_broadcast_detect_indication.mib_length = 8; + in.lte_broadcast_detect_indication.sfn_offset = 4; + in.utran_broadcast_detect_indication.tl.tag = 0; + in.pnf_cell_broadcast_state.tl.tag = NFAPI_PNF_CELL_BROADCAST_STATE_TAG; + in.pnf_cell_broadcast_state.length = 23; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.lte_broadcast_detect_indication.tl.tag, out.lte_broadcast_detect_indication.tl.tag); + CU_ASSERT_EQUAL(in.lte_broadcast_detect_indication.number_of_tx_antenna, out.lte_broadcast_detect_indication.number_of_tx_antenna); + CU_ASSERT_EQUAL(in.lte_broadcast_detect_indication.mib_length, out.lte_broadcast_detect_indication.mib_length); + for(idx = 0; idx < out.lte_broadcast_detect_indication.mib_length; ++idx) + { + CU_ASSERT_EQUAL(in.lte_broadcast_detect_indication.mib[idx], out.lte_broadcast_detect_indication.mib[idx]); + } + CU_ASSERT_EQUAL(in.lte_broadcast_detect_indication.sfn_offset, out.lte_broadcast_detect_indication.sfn_offset); + + + CU_ASSERT_EQUAL(in.utran_broadcast_detect_indication.tl.tag, out.utran_broadcast_detect_indication.tl.tag); + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.tl.tag, out.pnf_cell_broadcast_state.tl.tag); + for(idx = 0; idx < out.pnf_cell_broadcast_state.length; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.value[idx], out.pnf_cell_broadcast_state.value[idx]); + } +} +void nfapi_test_broadcast_detect_indication_lte_overrun() +{ + nfapi_broadcast_detect_indication_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_BROADCAST_DETECT_INDICATION, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push32(0, &p, end); // error_code + + push16(NFAPI_LTE_BROADCAST_DETECT_INDICATION_TAG, &p, end); + push16(8, &p, end); + + push8(1, &p, end); + push16(NFAPI_MAX_MIB_LENGTH + 1, &p, end); + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out) ,0); + CU_ASSERT_EQUAL(result, -1); +} +void nfapi_test_broadcast_detect_indication_utran() +{ + uint16_t idx; + nfapi_broadcast_detect_indication_t in; + nfapi_broadcast_detect_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_BROADCAST_DETECT_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + + in.lte_broadcast_detect_indication.tl.tag = 0; + in.utran_broadcast_detect_indication.tl.tag = NFAPI_UTRAN_BROADCAST_DETECT_INDICATION_TAG; + in.utran_broadcast_detect_indication.mib_length = 16; + in.utran_broadcast_detect_indication.sfn_offset = 4; + in.pnf_cell_broadcast_state.tl.tag = 0; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.lte_broadcast_detect_indication.tl.tag, out.lte_broadcast_detect_indication.tl.tag); + CU_ASSERT_EQUAL(in.utran_broadcast_detect_indication.tl.tag, out.utran_broadcast_detect_indication.tl.tag); + CU_ASSERT_EQUAL(in.utran_broadcast_detect_indication.mib_length, out.utran_broadcast_detect_indication.mib_length); + for(idx = 0; idx < out.utran_broadcast_detect_indication.mib_length; ++idx) + { + CU_ASSERT_EQUAL(in.utran_broadcast_detect_indication.mib[idx], out.utran_broadcast_detect_indication.mib[idx]); + } + CU_ASSERT_EQUAL(in.utran_broadcast_detect_indication.sfn_offset, out.utran_broadcast_detect_indication.sfn_offset); + + + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.tl.tag, out.pnf_cell_broadcast_state.tl.tag); +} +void nfapi_test_broadcast_detect_indication_nb_iot() +{ + uint16_t idx; + nfapi_broadcast_detect_indication_t in; + nfapi_broadcast_detect_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_BROADCAST_DETECT_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + + in.lte_broadcast_detect_indication.tl.tag = 0; + in.utran_broadcast_detect_indication.tl.tag = 0; + in.nb_iot_broadcast_detect_indication.tl.tag = NFAPI_NB_IOT_BROADCAST_DETECT_INDICATION_TAG; + in.nb_iot_broadcast_detect_indication.number_of_tx_antenna = 2; + in.nb_iot_broadcast_detect_indication.mib_length = 16; + in.nb_iot_broadcast_detect_indication.sfn_offset = 4; + in.pnf_cell_broadcast_state.tl.tag = 0; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.lte_broadcast_detect_indication.tl.tag, out.lte_broadcast_detect_indication.tl.tag); + CU_ASSERT_EQUAL(in.utran_broadcast_detect_indication.tl.tag, out.utran_broadcast_detect_indication.tl.tag); + CU_ASSERT_EQUAL(in.nb_iot_broadcast_detect_indication.tl.tag, out.nb_iot_broadcast_detect_indication.tl.tag); + CU_ASSERT_EQUAL(in.nb_iot_broadcast_detect_indication.number_of_tx_antenna, out.nb_iot_broadcast_detect_indication.number_of_tx_antenna); + CU_ASSERT_EQUAL(in.nb_iot_broadcast_detect_indication.mib_length, out.nb_iot_broadcast_detect_indication.mib_length); + for(idx = 0; idx < out.nb_iot_broadcast_detect_indication.mib_length; ++idx) + { + CU_ASSERT_EQUAL(in.nb_iot_broadcast_detect_indication.mib[idx], out.nb_iot_broadcast_detect_indication.mib[idx]); + } + CU_ASSERT_EQUAL(in.nb_iot_broadcast_detect_indication.sfn_offset, out.nb_iot_broadcast_detect_indication.sfn_offset); + + + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.tl.tag, out.pnf_cell_broadcast_state.tl.tag); +} +void nfapi_test_broadcast_detect_indication_utran_overrun() +{ + nfapi_broadcast_detect_indication_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_BROADCAST_DETECT_INDICATION, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push32(0, &p, end); // error_code + + push16(NFAPI_UTRAN_BROADCAST_DETECT_INDICATION_TAG, &p, end); + push16(8, &p, end); + + push16(NFAPI_MAX_MIB_LENGTH + 1, &p, end); + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} +void nfapi_test_broadcast_detect_indication_state_overrun() +{ +} +void nfapi_test_system_information_schedule_request_lte() +{ + uint16_t idx; + nfapi_system_information_schedule_request_t in; + nfapi_system_information_schedule_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_LTE; + + in.nb_iot_system_information_schedule_request.tl.tag = 0; + + in.lte_system_information_schedule_request.tl.tag = NFAPI_LTE_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG; + in.lte_system_information_schedule_request.earfcn = 16; + in.lte_system_information_schedule_request.pci = 4; + in.lte_system_information_schedule_request.downlink_channel_bandwidth = 20; + in.lte_system_information_schedule_request.phich_configuration = 1; + in.lte_system_information_schedule_request.number_of_tx_antenna = 2; + in.lte_system_information_schedule_request.retry_count = 4; + in.lte_system_information_schedule_request.timeout = 0; + in.pnf_cell_broadcast_state.tl.tag = NFAPI_PNF_CELL_BROADCAST_STATE_TAG; + in.pnf_cell_broadcast_state.length = 7; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.lte_system_information_schedule_request.tl.tag, out.lte_system_information_schedule_request.tl.tag); + CU_ASSERT_EQUAL(in.lte_system_information_schedule_request.earfcn, out.lte_system_information_schedule_request.earfcn); + CU_ASSERT_EQUAL(in.lte_system_information_schedule_request.pci, out.lte_system_information_schedule_request.pci); + CU_ASSERT_EQUAL(in.lte_system_information_schedule_request.downlink_channel_bandwidth, out.lte_system_information_schedule_request.downlink_channel_bandwidth); + CU_ASSERT_EQUAL(in.lte_system_information_schedule_request.downlink_channel_bandwidth, out.lte_system_information_schedule_request.downlink_channel_bandwidth); + CU_ASSERT_EQUAL(in.lte_system_information_schedule_request.number_of_tx_antenna, out.lte_system_information_schedule_request.number_of_tx_antenna); + CU_ASSERT_EQUAL(in.lte_system_information_schedule_request.retry_count, out.lte_system_information_schedule_request.retry_count); + CU_ASSERT_EQUAL(in.lte_system_information_schedule_request.timeout, out.lte_system_information_schedule_request.timeout); + + + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.tl.tag, out.pnf_cell_broadcast_state.tl.tag); + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.length, out.pnf_cell_broadcast_state.length); + for(idx = 0; idx < out.pnf_cell_broadcast_state.length; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.value[idx], out.pnf_cell_broadcast_state.value[idx]); + } +} + +void nfapi_test_system_information_schedule_request_nb_iot() +{ + uint16_t idx; + nfapi_system_information_schedule_request_t in; + nfapi_system_information_schedule_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_NB_IOT; + + in.lte_system_information_schedule_request.tl.tag = 0; + in.nb_iot_system_information_schedule_request.tl.tag = NFAPI_NB_IOT_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG; + in.nb_iot_system_information_schedule_request.earfcn = 16; + in.nb_iot_system_information_schedule_request.ro_dl = 4; + in.nb_iot_system_information_schedule_request.pci = 4; + in.nb_iot_system_information_schedule_request.scheduling_info_sib1_nb = 4; + in.nb_iot_system_information_schedule_request.timeout = 0; + in.pnf_cell_broadcast_state.tl.tag = NFAPI_PNF_CELL_BROADCAST_STATE_TAG; + in.pnf_cell_broadcast_state.length = 7; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.lte_system_information_schedule_request.tl.tag, out.lte_system_information_schedule_request.tl.tag); + CU_ASSERT_EQUAL(in.nb_iot_system_information_schedule_request.tl.tag, out.nb_iot_system_information_schedule_request.tl.tag); + CU_ASSERT_EQUAL(in.nb_iot_system_information_schedule_request.earfcn, out.nb_iot_system_information_schedule_request.earfcn); + CU_ASSERT_EQUAL(in.nb_iot_system_information_schedule_request.ro_dl, out.nb_iot_system_information_schedule_request.ro_dl); + CU_ASSERT_EQUAL(in.nb_iot_system_information_schedule_request.pci, out.nb_iot_system_information_schedule_request.pci); + CU_ASSERT_EQUAL(in.nb_iot_system_information_schedule_request.scheduling_info_sib1_nb, out.nb_iot_system_information_schedule_request.scheduling_info_sib1_nb); + CU_ASSERT_EQUAL(in.nb_iot_system_information_schedule_request.timeout, out.nb_iot_system_information_schedule_request.timeout); + + + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.tl.tag, out.pnf_cell_broadcast_state.tl.tag); + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.length, out.pnf_cell_broadcast_state.length); + for(idx = 0; idx < out.pnf_cell_broadcast_state.length; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.value[idx], out.pnf_cell_broadcast_state.value[idx]); + } +} + +void nfapi_test_system_information_schedule_request_state_overrun() +{ + nfapi_system_information_schedule_request_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push8(0, &p, end); // rat type + + push16(NFAPI_LTE_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &p, end); + push16(13, &p, end); + + push16(1, &p, end); + push16(1, &p, end); + push16(1, &p, end); + push8(142, &p, end); + push8(142, &p, end); + push8(142, &p, end); + push32(42, &p, end); + + push16(NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &p, end); + push16(NFAPI_MAX_OPAQUE_DATA + 1, &p, end); + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); + +} +void nfapi_test_system_information_schedule_response() +{ + nfapi_system_information_schedule_response_t in; + nfapi_system_information_schedule_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); +} +void nfapi_test_system_information_schedule_indication_lte() +{ + uint16_t idx; + nfapi_system_information_schedule_indication_t in; + nfapi_system_information_schedule_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = 0; + + in.nb_iot_system_information_indication.tl.tag = 0; + in.lte_system_information_indication.tl.tag = NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG; + in.lte_system_information_indication.sib_type = 16; + in.lte_system_information_indication.sib_length = 4; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.lte_system_information_indication.tl.tag, out.lte_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.lte_system_information_indication.sib_type, out.lte_system_information_indication.sib_type); + CU_ASSERT_EQUAL(in.lte_system_information_indication.sib_length, out.lte_system_information_indication.sib_length); + + for(idx = 0; idx < out.lte_system_information_indication.sib_length; ++idx) + { + CU_ASSERT_EQUAL(in.lte_system_information_indication.sib[idx], out.lte_system_information_indication.sib[idx]); + } +} +void nfapi_test_system_information_schedule_indication_nb_iot() +{ + uint16_t idx; + nfapi_system_information_schedule_indication_t in; + nfapi_system_information_schedule_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = 0; + + in.lte_system_information_indication.tl.tag = 0; + in.nb_iot_system_information_indication.tl.tag = NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG; + in.nb_iot_system_information_indication.sib_type = 16; + in.nb_iot_system_information_indication.sib_length = 4; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.lte_system_information_indication.tl.tag, out.lte_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.nb_iot_system_information_indication.tl.tag, out.nb_iot_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.nb_iot_system_information_indication.sib_type, out.nb_iot_system_information_indication.sib_type); + CU_ASSERT_EQUAL(in.nb_iot_system_information_indication.sib_length, out.nb_iot_system_information_indication.sib_length); + + for(idx = 0; idx < out.nb_iot_system_information_indication.sib_length; ++idx) + { + CU_ASSERT_EQUAL(in.nb_iot_system_information_indication.sib[idx], out.nb_iot_system_information_indication.sib[idx]); + } +} +void nfapi_test_system_information_request_lte() +{ + uint16_t idx; + nfapi_system_information_request_t in; + nfapi_system_information_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_LTE; + + in.lte_system_information_request.tl.tag = NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG; + in.lte_system_information_request.earfcn = 16; + in.lte_system_information_request.pci = 4; + in.lte_system_information_request.downlink_channel_bandwidth = 20; + in.lte_system_information_request.phich_configuration = 1; + in.lte_system_information_request.number_of_tx_antenna = 2; + in.lte_system_information_request.number_of_si_periodicity = 1; + in.lte_system_information_request.si_periodicity[0].si_periodicity = 3; + in.lte_system_information_request.si_periodicity[0].si_index = 0; + in.lte_system_information_request.si_window_length = 0; + in.lte_system_information_request.timeout = 2000; + + in.pnf_cell_broadcast_state.tl.tag = NFAPI_PNF_CELL_BROADCAST_STATE_TAG; + in.pnf_cell_broadcast_state.length = 7; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.lte_system_information_request.tl.tag, out.lte_system_information_request.tl.tag); + CU_ASSERT_EQUAL(in.lte_system_information_request.earfcn, out.lte_system_information_request.earfcn); + CU_ASSERT_EQUAL(in.lte_system_information_request.pci, out.lte_system_information_request.pci); + CU_ASSERT_EQUAL(in.lte_system_information_request.downlink_channel_bandwidth, out.lte_system_information_request.downlink_channel_bandwidth); + CU_ASSERT_EQUAL(in.lte_system_information_request.downlink_channel_bandwidth, out.lte_system_information_request.downlink_channel_bandwidth); + CU_ASSERT_EQUAL(in.lte_system_information_request.number_of_tx_antenna, out.lte_system_information_request.number_of_tx_antenna); + CU_ASSERT_EQUAL(in.lte_system_information_request.number_of_si_periodicity, out.lte_system_information_request.number_of_si_periodicity); + for(idx = 0; idx < in.lte_system_information_request.number_of_si_periodicity; ++idx) + { + CU_ASSERT_EQUAL(in.lte_system_information_request.si_periodicity[idx].si_periodicity, out.lte_system_information_request.si_periodicity[idx].si_periodicity); + CU_ASSERT_EQUAL(in.lte_system_information_request.si_periodicity[idx].si_index, out.lte_system_information_request.si_periodicity[idx].si_index); + } + + CU_ASSERT_EQUAL(in.lte_system_information_request.si_window_length, out.lte_system_information_request.si_window_length); + CU_ASSERT_EQUAL(in.lte_system_information_request.timeout, out.lte_system_information_request.timeout); + + + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.tl.tag, out.pnf_cell_broadcast_state.tl.tag); + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.length, out.pnf_cell_broadcast_state.length); + for(idx = 0; idx < out.pnf_cell_broadcast_state.length; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.value[idx], out.pnf_cell_broadcast_state.value[idx]); + } +} +void nfapi_test_system_information_request_lte_overrun() +{ + nfapi_system_information_request_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_SYSTEM_INFORMATION_REQUEST, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push8(NFAPI_RAT_TYPE_LTE, &p, end); + + push16(NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG, &p, end); + push16(8, &p, end); + + push16(8, &p, end); + push16(8, &p, end); + push16(8, &p, end); + push8(8, &p, end); + push8(8, &p, end); + push8(NFAPI_MAX_SI_PERIODICITY + 1, &p, end); + + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} +void nfapi_test_system_information_request_utran() +{ + nfapi_system_information_request_t in; + nfapi_system_information_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_UTRAN; + + in.utran_system_information_request.tl.tag = NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG; + in.utran_system_information_request.uarfcn = 16; + in.utran_system_information_request.psc = 4; + in.utran_system_information_request.timeout = 2000; + + in.pnf_cell_broadcast_state.tl.tag = 0; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.utran_system_information_request.tl.tag, out.utran_system_information_request.tl.tag); + CU_ASSERT_EQUAL(in.utran_system_information_request.uarfcn, out.utran_system_information_request.uarfcn); + CU_ASSERT_EQUAL(in.utran_system_information_request.psc, out.utran_system_information_request.psc); + CU_ASSERT_EQUAL(in.utran_system_information_request.timeout, out.utran_system_information_request.timeout); + + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.tl.tag, out.pnf_cell_broadcast_state.tl.tag); +} +void nfapi_test_system_information_request_geran() +{ + nfapi_system_information_request_t in; + nfapi_system_information_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_GERAN; + + in.geran_system_information_request.tl.tag = NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG; + in.geran_system_information_request.arfcn = 16; + in.geran_system_information_request.bsic = 4; + in.geran_system_information_request.timeout = 2000; + + in.pnf_cell_broadcast_state.tl.tag = 0; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.rat_type, out.rat_type); + CU_ASSERT_EQUAL(in.geran_system_information_request.tl.tag, out.geran_system_information_request.tl.tag); + CU_ASSERT_EQUAL(in.geran_system_information_request.arfcn, out.geran_system_information_request.arfcn); + CU_ASSERT_EQUAL(in.geran_system_information_request.bsic, out.geran_system_information_request.bsic); + CU_ASSERT_EQUAL(in.geran_system_information_request.timeout, out.geran_system_information_request.timeout); + + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.tl.tag, out.pnf_cell_broadcast_state.tl.tag); +} +void nfapi_test_system_information_request_state_overrun() +{ + nfapi_system_information_request_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_SYSTEM_INFORMATION_REQUEST, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push8(NFAPI_RAT_TYPE_LTE, &p, end); + + push16(NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG, &p, end); + push16(16, &p, end); + + push16(8, &p, end); + push16(8, &p, end); + push16(8, &p, end); + push8(8, &p, end); + push8(8, &p, end); + push8(1, &p, end); + { + push8(1, &p, end); + push8(1, &p, end); + } + push8(1, &p, end); + push32(1, &p, end); + + push16(NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &p, end); + push16(NFAPI_MAX_OPAQUE_DATA + 1, &p, end); + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} + +void nfapi_test_system_information_request_nb_iot() +{ + uint16_t idx, idx2; + nfapi_system_information_request_t in; + nfapi_system_information_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.rat_type = NFAPI_RAT_TYPE_NB_IOT; + + in.nb_iot_system_information_request.tl.tag = NFAPI_NB_IOT_SYSTEM_INFORMATION_REQUEST_TAG; + in.nb_iot_system_information_request.earfcn = 16; + in.nb_iot_system_information_request.ro_dl = 1; + in.nb_iot_system_information_request.pci = 4; + in.nb_iot_system_information_request.number_of_si_periodicity = 1; + in.nb_iot_system_information_request.si_periodicity[0].si_periodicity = 3; + in.nb_iot_system_information_request.si_periodicity[0].si_repetition_pattern = 0; + in.nb_iot_system_information_request.si_periodicity[0].si_tb_size = 0; + in.nb_iot_system_information_request.si_periodicity[0].number_of_si_index = 2; + in.nb_iot_system_information_request.si_periodicity[0].si_index[0] = 2; + in.nb_iot_system_information_request.si_periodicity[0].si_index[1] = 20; + in.nb_iot_system_information_request.si_window_length = 0; + in.nb_iot_system_information_request.timeout = 2000; + + in.pnf_cell_broadcast_state.tl.tag = NFAPI_PNF_CELL_BROADCAST_STATE_TAG; + in.pnf_cell_broadcast_state.length = 7; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + IN_OUT_ASSERT(header.message_id); + IN_OUT_ASSERT(rat_type); + IN_OUT_ASSERT(nb_iot_system_information_request.tl.tag); + IN_OUT_ASSERT(nb_iot_system_information_request.earfcn); + IN_OUT_ASSERT(nb_iot_system_information_request.ro_dl); + IN_OUT_ASSERT(nb_iot_system_information_request.pci); + IN_OUT_ASSERT(nb_iot_system_information_request.number_of_si_periodicity); + + for(idx = 0; idx < in.nb_iot_system_information_request.number_of_si_periodicity; ++idx) + { + IN_OUT_ASSERT(nb_iot_system_information_request.si_periodicity[idx].si_periodicity); + IN_OUT_ASSERT(nb_iot_system_information_request.si_periodicity[idx].si_repetition_pattern); + IN_OUT_ASSERT(nb_iot_system_information_request.si_periodicity[idx].si_tb_size); + IN_OUT_ASSERT(nb_iot_system_information_request.si_periodicity[idx].number_of_si_index); + + for(idx2 = 0; idx2 < in.nb_iot_system_information_request.si_periodicity[idx].number_of_si_index; ++idx2) + IN_OUT_ASSERT(nb_iot_system_information_request.si_periodicity[idx].si_index[idx2]); + } + + IN_OUT_ASSERT(nb_iot_system_information_request.si_window_length); + IN_OUT_ASSERT(nb_iot_system_information_request.timeout); + + + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.tl.tag, out.pnf_cell_broadcast_state.tl.tag); + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.length, out.pnf_cell_broadcast_state.length); + for(idx = 0; idx < out.pnf_cell_broadcast_state.length; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_cell_broadcast_state.value[idx], out.pnf_cell_broadcast_state.value[idx]); + } +} + + +void nfapi_test_system_information_response() +{ + nfapi_system_information_response_t in; + nfapi_system_information_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); +} +void nfapi_test_system_information_indication_lte() +{ + uint16_t idx; + nfapi_system_information_indication_t in; + nfapi_system_information_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + in.lte_system_information_indication.tl.tag = NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG; + in.lte_system_information_indication.sib_type = 2; + in.lte_system_information_indication.sib_length = 15; + + in.utran_system_information_indication.tl.tag = 0; + in.geran_system_information_indication.tl.tag = 0; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.lte_system_information_indication.tl.tag, out.lte_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.lte_system_information_indication.sib_type, out.lte_system_information_indication.sib_type); + CU_ASSERT_EQUAL(in.lte_system_information_indication.sib_length, out.lte_system_information_indication.sib_length); + + for(idx = 0; idx < out.lte_system_information_indication.sib_length; ++idx) + { + CU_ASSERT_EQUAL(in.lte_system_information_indication.sib[idx], out.lte_system_information_indication.sib[idx]); + } + + CU_ASSERT_EQUAL(in.utran_system_information_indication.tl.tag, out.utran_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.geran_system_information_indication.tl.tag, out.geran_system_information_indication.tl.tag); + +} +void nfapi_test_system_information_indication_lte_overrun() +{ + nfapi_system_information_indication_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_SYSTEM_INFORMATION_INDICATION, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push32(0, &p, end); // error code + + push16(NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &p, end); + push16(8, &p, end); + + push8(1, &p, end); + push16(NFAPI_MAX_SIB_LENGTH + 1, &p, end); + + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} +void nfapi_test_system_information_indication_utran() +{ + uint16_t idx; + nfapi_system_information_indication_t in; + nfapi_system_information_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + in.lte_system_information_indication.tl.tag = 0; + + in.utran_system_information_indication.tl.tag = NFAPI_UTRAN_SYSTEM_INFORMATION_INDICATION_TAG; + in.utran_system_information_indication.sib_length = 25; + + in.geran_system_information_indication.tl.tag = 0; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.lte_system_information_indication.tl.tag, out.lte_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.utran_system_information_indication.tl.tag, out.utran_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.utran_system_information_indication.sib_length, out.utran_system_information_indication.sib_length); + + for(idx = 0; idx < out.utran_system_information_indication.sib_length; ++idx) + { + CU_ASSERT_EQUAL(in.utran_system_information_indication.sib[idx], out.utran_system_information_indication.sib[idx]); + } + + CU_ASSERT_EQUAL(in.geran_system_information_indication.tl.tag, out.geran_system_information_indication.tl.tag); + +} +void nfapi_test_system_information_indication_utran_overrun() +{ + nfapi_system_information_indication_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_SYSTEM_INFORMATION_INDICATION, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push32(0, &p, end); // error code + + push16(NFAPI_UTRAN_SYSTEM_INFORMATION_INDICATION_TAG, &p, end); + push16(8, &p, end); + + push16(NFAPI_MAX_SIB_LENGTH + 1, &p, end); + + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} +void nfapi_test_system_information_indication_geran() +{ + uint16_t idx; + nfapi_system_information_indication_t in; + nfapi_system_information_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + in.lte_system_information_indication.tl.tag = 0; + in.utran_system_information_indication.tl.tag = 0; + + in.geran_system_information_indication.tl.tag = NFAPI_GERAN_SYSTEM_INFORMATION_INDICATION_TAG; + in.geran_system_information_indication.si_length = 25; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.lte_system_information_indication.tl.tag, out.lte_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.utran_system_information_indication.tl.tag, out.utran_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.geran_system_information_indication.tl.tag, out.geran_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.geran_system_information_indication.si_length, out.geran_system_information_indication.si_length); + + for(idx = 0; idx < out.geran_system_information_indication.si_length; ++idx) + { + CU_ASSERT_EQUAL(in.geran_system_information_indication.si[idx], out.geran_system_information_indication.si[idx]); + } + +} +void nfapi_test_system_information_indication_geran_overrun() +{ + nfapi_system_information_indication_t out; + + uint8_t buffer[1024]; + uint8_t* p = &buffer[0]; + uint8_t *end = p + 1024; + push16(0, &p, end); + push16(NFAPI_SYSTEM_INFORMATION_INDICATION, &p, end); + push16(64, &p, end); + push16(0, &p, end); + + push32(0, &p, end); // error code + + push16(NFAPI_GERAN_SYSTEM_INFORMATION_INDICATION_TAG, &p, end); + push16(8, &p, end); + + push16(NFAPI_MAX_SI_LENGTH + 1, &p, end); + + + int result = nfapi_p4_message_unpack(buffer, 34, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(result, -1); +} + +void nfapi_test_system_information_indication_nb_iot() +{ + uint16_t idx; + nfapi_system_information_indication_t in; + nfapi_system_information_indication_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_SYSTEM_INFORMATION_INDICATION; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + in.nb_iot_system_information_indication.tl.tag = NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG; + in.nb_iot_system_information_indication.sib_type = 2; + in.nb_iot_system_information_indication.sib_length = 15; + + in.lte_system_information_indication.tl.tag = 0; + in.utran_system_information_indication.tl.tag = 0; + in.geran_system_information_indication.tl.tag = 0; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.nb_iot_system_information_indication.tl.tag, out.nb_iot_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.nb_iot_system_information_indication.sib_type, out.nb_iot_system_information_indication.sib_type); + CU_ASSERT_EQUAL(in.nb_iot_system_information_indication.sib_length, out.nb_iot_system_information_indication.sib_length); + + for(idx = 0; idx < out.nb_iot_system_information_indication.sib_length; ++idx) + { + CU_ASSERT_EQUAL(in.nb_iot_system_information_indication.sib[idx], out.nb_iot_system_information_indication.sib[idx]); + } + + CU_ASSERT_EQUAL(in.lte_system_information_indication.tl.tag, out.lte_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.utran_system_information_indication.tl.tag, out.utran_system_information_indication.tl.tag); + CU_ASSERT_EQUAL(in.geran_system_information_indication.tl.tag, out.geran_system_information_indication.tl.tag); + +} + +void nfapi_test_nmm_stop_request() +{ + nfapi_nmm_stop_request_t in; + nfapi_nmm_stop_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_NMM_STOP_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); +} +void nfapi_test_nmm_stop_response() +{ + nfapi_nmm_stop_response_t in; + nfapi_nmm_stop_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_NMM_STOP_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_P4_MSG_RAT_NOT_SUPPORTED; + + int packedMessageLength = nfapi_p4_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p4_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); +} + + +void nfapi_test_pnf_param_request() +{ + nfapi_pnf_param_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_pnf_param_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PNF_PARAM_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); +} +void nfapi_test_pnf_param_request_ve() +{ + nfapi_pnf_param_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_pnf_param_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PNF_PARAM_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + my_vendor_extention ve; + ve.tl.tag = NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE; + ve.value1 = 56; + ve.value2 = 1234; + in.vendor_extension = (void*)&ve; + + nfapi_p4_p5_codec_config_t codec; + memset(&codec, 0, sizeof(codec)); + codec.unpack_vendor_extension_tlv = &nfapi_test_unpack_vendor_extension_tlv; + codec.pack_vendor_extension_tlv = &nfapi_test_pack_vendor_extension_tlv; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, &codec); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), &codec); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + + CU_ASSERT_NOT_EQUAL(in.vendor_extension, 0); + CU_ASSERT_EQUAL(((my_vendor_extention*)(out.vendor_extension))->tl.tag, ve.tl.tag); + CU_ASSERT_EQUAL(((my_vendor_extention*)(out.vendor_extension))->value1, ve.value1); + CU_ASSERT_EQUAL(((my_vendor_extention*)(out.vendor_extension))->value2, ve.value2); + + free(out.vendor_extension); +} +void nfapi_test_pnf_param_response() +{ + uint16_t idx = 0; + uint16_t idx2 = 0; + nfapi_pnf_param_response_t in; + memset(&in, 0, sizeof(in)); + nfapi_pnf_param_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PNF_PARAM_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = 0; + in.pnf_param_general.tl.tag = NFAPI_PNF_PARAM_GENERAL_TAG; + in.pnf_param_general.nfapi_sync_mode = 2; + in.pnf_param_general.location_mode = 1; + in.pnf_param_general.location_coordinates_length = 1; + in.pnf_param_general.location_coordinates[0] = 123; + in.pnf_param_general.dl_config_timing = 12; + in.pnf_param_general.tx_timing = 12; + in.pnf_param_general.ul_config_timing = 12; + in.pnf_param_general.hi_dci0_timing = 12; + in.pnf_param_general.maximum_number_phys = 2; + in.pnf_param_general.maximum_total_bandwidth = 100; + in.pnf_param_general.maximum_total_number_dl_layers = 2; + in.pnf_param_general.maximum_total_number_ul_layers = 2; + in.pnf_param_general.shared_bands = 0; + in.pnf_param_general.shared_pa = 0; + in.pnf_param_general.maximum_total_power = -190; + in.pnf_param_general.oui[0] = 88; + + in.pnf_phy.tl.tag = NFAPI_PNF_PHY_TAG; + in.pnf_phy.number_of_phys = 2; + in.pnf_phy.phy[0].phy_config_index = 0; + in.pnf_phy.phy[0].number_of_rfs = 2; + in.pnf_phy.phy[0].rf_config[0].rf_config_index = 0; + in.pnf_phy.phy[0].number_of_rf_exclusions = 1; + in.pnf_phy.phy[0].rf_config[0].rf_config_index = 1; + in.pnf_phy.phy[0].downlink_channel_bandwidth_supported = 20; + in.pnf_phy.phy[0].uplink_channel_bandwidth_supported = 20; + in.pnf_phy.phy[0].number_of_dl_layers_supported = 2; + in.pnf_phy.phy[0].number_of_ul_layers_supported = 1; + in.pnf_phy.phy[0].maximum_3gpp_release_supported = 3; + in.pnf_phy.phy[0].nmm_modes_supported = 2; + + in.pnf_rf.tl.tag = NFAPI_PNF_RF_TAG; + in.pnf_rf.number_of_rfs = 2; + in.pnf_rf.rf[0].rf_config_index = 0; + in.pnf_rf.rf[0].band = 1; + in.pnf_rf.rf[0].maximum_transmit_power = -100; + in.pnf_rf.rf[0].minimum_transmit_power = -90; + in.pnf_rf.rf[0].number_of_antennas_suppported = 4; + in.pnf_rf.rf[0].minimum_downlink_frequency = 100; + in.pnf_rf.rf[0].maximum_downlink_frequency = 2132; + in.pnf_rf.rf[0].minimum_uplink_frequency = 1231; + in.pnf_rf.rf[0].maximum_uplink_frequency = 123; + + + in.pnf_phy_rel10.tl.tag = NFAPI_PNF_PHY_REL10_TAG; + in.pnf_phy_rel10.number_of_phys = 2; + in.pnf_phy_rel10.phy[0].phy_config_index = 0; + in.pnf_phy_rel10.phy[0].transmission_mode_7_supported = 1; + in.pnf_phy_rel10.phy[0].transmission_mode_8_supported = 2; + in.pnf_phy_rel10.phy[0].two_antenna_ports_for_pucch = 3; + in.pnf_phy_rel10.phy[0].transmission_mode_9_supported = 4; + in.pnf_phy_rel10.phy[0].simultaneous_pucch_pusch = 5; + in.pnf_phy_rel10.phy[0].four_layer_tx_with_tm3_and_tm4 = 6; + + in.pnf_phy_rel11.tl.tag = NFAPI_PNF_PHY_REL11_TAG; + in.pnf_phy_rel11.number_of_phys = 2; + in.pnf_phy_rel11.phy[0].phy_config_index = 0; + in.pnf_phy_rel11.phy[0].edpcch_supported = 1; + in.pnf_phy_rel11.phy[0].multi_ack_csi_reporting = 2; + in.pnf_phy_rel11.phy[0].pucch_tx_diversity = 3; + in.pnf_phy_rel11.phy[0].ul_comp_supported = 4; + in.pnf_phy_rel11.phy[0].transmission_mode_5_supported = 5; + + in.pnf_phy_rel12.tl.tag = NFAPI_PNF_PHY_REL12_TAG; + in.pnf_phy_rel12.number_of_phys = 2; + in.pnf_phy_rel12.phy[0].phy_config_index = 0; + in.pnf_phy_rel12.phy[0].csi_subframe_set = 1; + in.pnf_phy_rel12.phy[0].enhanced_4tx_codebook = 2; + in.pnf_phy_rel12.phy[0].drs_supported = 3; + in.pnf_phy_rel12.phy[0].ul_64qam_supported = 4; + in.pnf_phy_rel12.phy[0].transmission_mode_10_supported = 5; + in.pnf_phy_rel12.phy[0].alternative_bts_indices = 6; + + in.pnf_phy_rel13.tl.tag = NFAPI_PNF_PHY_REL13_TAG; + in.pnf_phy_rel13.number_of_phys = 2; + in.pnf_phy_rel13.phy[0].phy_config_index = 0; + in.pnf_phy_rel13.phy[0].pucch_format4_supported = 1; + in.pnf_phy_rel13.phy[0].pucch_format5_supported = 2; + in.pnf_phy_rel13.phy[0].more_than_5_ca_support = 3; + in.pnf_phy_rel13.phy[0].laa_supported = 4; + in.pnf_phy_rel13.phy[0].laa_ending_in_dwpts_supported = 5; + in.pnf_phy_rel13.phy[0].laa_starting_in_second_slot_supported = 6; + in.pnf_phy_rel13.phy[0].beamforming_supported = 7; + in.pnf_phy_rel13.phy[0].csi_rs_enhancement_supported = 8; + in.pnf_phy_rel13.phy[0].drms_enhancement_supported = 9; + in.pnf_phy_rel13.phy[0].srs_enhancement_supported = 10; + + in.pnf_phy_rel13_nb_iot.tl.tag = NFAPI_PNF_PHY_REL13_NB_IOT_TAG; + in.pnf_phy_rel13_nb_iot.number_of_phys = 2; + in.pnf_phy_rel13_nb_iot.phy[0].phy_config_index = 0; + in.pnf_phy_rel13_nb_iot.phy[0].number_of_rfs = 2; + in.pnf_phy_rel13_nb_iot.phy[0].rf_config[0].rf_config_index = 0; + in.pnf_phy_rel13_nb_iot.phy[0].number_of_rf_exclusions = 1; + in.pnf_phy_rel13_nb_iot.phy[0].rf_config[0].rf_config_index = 1; + in.pnf_phy_rel13_nb_iot.phy[0].number_of_dl_layers_supported = 2; + in.pnf_phy_rel13_nb_iot.phy[0].number_of_ul_layers_supported = 1; + in.pnf_phy_rel13_nb_iot.phy[0].maximum_3gpp_release_supported = 3; + in.pnf_phy_rel13_nb_iot.phy[0].nmm_modes_supported = 2; + + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + int unpack_result = nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(unpack_result, 1); + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.pnf_param_general.tl.tag, out.pnf_param_general.tl.tag); + CU_ASSERT_EQUAL(in.pnf_param_general.nfapi_sync_mode, out.pnf_param_general.nfapi_sync_mode); + CU_ASSERT_EQUAL(in.pnf_param_general.location_mode, out.pnf_param_general.location_mode); + + for(idx = 0; idx < NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH; ++idx) + CU_ASSERT_EQUAL(in.pnf_param_general.location_coordinates[idx], out.pnf_param_general.location_coordinates[idx]); + + CU_ASSERT_EQUAL(in.pnf_param_general.dl_config_timing, out.pnf_param_general.dl_config_timing); + CU_ASSERT_EQUAL(in.pnf_param_general.tx_timing, out.pnf_param_general.tx_timing); + CU_ASSERT_EQUAL(in.pnf_param_general.ul_config_timing, out.pnf_param_general.ul_config_timing); + CU_ASSERT_EQUAL(in.pnf_param_general.hi_dci0_timing, out.pnf_param_general.hi_dci0_timing); + CU_ASSERT_EQUAL(in.pnf_param_general.maximum_number_phys, out.pnf_param_general.maximum_number_phys); + CU_ASSERT_EQUAL(in.pnf_param_general.maximum_total_bandwidth, out.pnf_param_general.maximum_total_bandwidth); + CU_ASSERT_EQUAL(in.pnf_param_general.maximum_total_number_dl_layers, out.pnf_param_general.maximum_total_number_dl_layers); + CU_ASSERT_EQUAL(in.pnf_param_general.maximum_total_number_ul_layers, out.pnf_param_general.maximum_total_number_ul_layers); + CU_ASSERT_EQUAL(in.pnf_param_general.shared_bands, out.pnf_param_general.shared_bands); + CU_ASSERT_EQUAL(in.pnf_param_general.shared_pa, out.pnf_param_general.shared_pa); + CU_ASSERT_EQUAL(in.pnf_param_general.maximum_total_power, out.pnf_param_general.maximum_total_power); + for(idx = 0; idx < NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH; ++idx) + CU_ASSERT_EQUAL(in.pnf_param_general.oui[idx], out.pnf_param_general.oui[idx]); + + CU_ASSERT_EQUAL(in.pnf_phy.tl.tag, out.pnf_phy.tl.tag); + CU_ASSERT_EQUAL(in.pnf_phy.number_of_phys, out.pnf_phy.number_of_phys); + + for(idx = 0; idx < out.pnf_phy.number_of_phys; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_phy.phy[idx].phy_config_index, out.pnf_phy.phy[idx].phy_config_index); + CU_ASSERT_EQUAL(in.pnf_phy.phy[idx].number_of_rfs, out.pnf_phy.phy[idx].number_of_rfs); + + + for(idx2 = 0; idx2 < out.pnf_phy.phy[idx].number_of_rfs; ++idx2) + { + CU_ASSERT_EQUAL(in.pnf_phy.phy[idx].rf_config[idx2].rf_config_index, out.pnf_phy.phy[idx].rf_config[idx2].rf_config_index); + } + CU_ASSERT_EQUAL(in.pnf_phy.phy[idx].number_of_rf_exclusions, out.pnf_phy.phy[idx].number_of_rf_exclusions); + + for(idx2 = 0; idx2 < out.pnf_phy.phy[idx].number_of_rf_exclusions; ++idx2) + { + CU_ASSERT_EQUAL(in.pnf_phy.phy[idx].excluded_rf_config[idx2].rf_config_index, out.pnf_phy.phy[idx].excluded_rf_config[idx2].rf_config_index); + } + + + CU_ASSERT_EQUAL(in.pnf_phy.phy[idx].downlink_channel_bandwidth_supported, out.pnf_phy.phy[idx].downlink_channel_bandwidth_supported); + CU_ASSERT_EQUAL(in.pnf_phy.phy[idx].uplink_channel_bandwidth_supported, out.pnf_phy.phy[idx].uplink_channel_bandwidth_supported); + CU_ASSERT_EQUAL(in.pnf_phy.phy[idx].number_of_dl_layers_supported, out.pnf_phy.phy[idx].number_of_dl_layers_supported); + CU_ASSERT_EQUAL(in.pnf_phy.phy[idx].number_of_ul_layers_supported, out.pnf_phy.phy[idx].number_of_ul_layers_supported); + CU_ASSERT_EQUAL(in.pnf_phy.phy[idx].maximum_3gpp_release_supported, out.pnf_phy.phy[idx].maximum_3gpp_release_supported); + CU_ASSERT_EQUAL(in.pnf_phy.phy[idx].nmm_modes_supported, out.pnf_phy.phy[idx].nmm_modes_supported); + } + + CU_ASSERT_EQUAL(in.pnf_rf.tl.tag, out.pnf_rf.tl.tag); + CU_ASSERT_EQUAL(in.pnf_rf.number_of_rfs, out.pnf_rf.number_of_rfs); + for(idx = 0; idx < out.pnf_rf.number_of_rfs; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_rf.rf[idx].rf_config_index, out.pnf_rf.rf[idx].rf_config_index); + CU_ASSERT_EQUAL(in.pnf_rf.rf[idx].band, out.pnf_rf.rf[idx].band); + CU_ASSERT_EQUAL(in.pnf_rf.rf[idx].maximum_transmit_power, out.pnf_rf.rf[idx].maximum_transmit_power); + CU_ASSERT_EQUAL(in.pnf_rf.rf[idx].minimum_transmit_power, out.pnf_rf.rf[idx].minimum_transmit_power); + CU_ASSERT_EQUAL(in.pnf_rf.rf[idx].number_of_antennas_suppported, out.pnf_rf.rf[idx].number_of_antennas_suppported); + CU_ASSERT_EQUAL(in.pnf_rf.rf[idx].minimum_downlink_frequency, out.pnf_rf.rf[idx].minimum_downlink_frequency); + CU_ASSERT_EQUAL(in.pnf_rf.rf[idx].maximum_downlink_frequency, out.pnf_rf.rf[idx].maximum_downlink_frequency); + CU_ASSERT_EQUAL(in.pnf_rf.rf[idx].minimum_uplink_frequency, out.pnf_rf.rf[idx].minimum_uplink_frequency); + CU_ASSERT_EQUAL(in.pnf_rf.rf[idx].maximum_uplink_frequency, out.pnf_rf.rf[idx].maximum_uplink_frequency); + } + + + CU_ASSERT_EQUAL(in.pnf_phy_rel10.tl.tag, out.pnf_phy_rel10.tl.tag); + CU_ASSERT_EQUAL(in.pnf_phy_rel10.number_of_phys, out.pnf_phy_rel10.number_of_phys); + for(idx = 0; idx < out.pnf_phy_rel10.number_of_phys; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_phy_rel10.phy[idx].phy_config_index, out.pnf_phy_rel10.phy[idx].phy_config_index); + CU_ASSERT_EQUAL(in.pnf_phy_rel10.phy[idx].transmission_mode_7_supported, out.pnf_phy_rel10.phy[idx].transmission_mode_7_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel10.phy[idx].transmission_mode_8_supported, out.pnf_phy_rel10.phy[idx].transmission_mode_8_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel10.phy[idx].two_antenna_ports_for_pucch, out.pnf_phy_rel10.phy[idx].two_antenna_ports_for_pucch); + CU_ASSERT_EQUAL(in.pnf_phy_rel10.phy[idx].transmission_mode_9_supported, out.pnf_phy_rel10.phy[idx].transmission_mode_9_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel10.phy[idx].simultaneous_pucch_pusch, out.pnf_phy_rel10.phy[idx].simultaneous_pucch_pusch); + CU_ASSERT_EQUAL(in.pnf_phy_rel10.phy[idx].four_layer_tx_with_tm3_and_tm4, out.pnf_phy_rel10.phy[idx].four_layer_tx_with_tm3_and_tm4); + } + + CU_ASSERT_EQUAL(in.pnf_phy_rel11.tl.tag, out.pnf_phy_rel11.tl.tag); + CU_ASSERT_EQUAL(in.pnf_phy_rel11.number_of_phys, out.pnf_phy_rel11.number_of_phys); + for(idx = 0; idx < out.pnf_phy_rel11.number_of_phys; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_phy_rel11.phy[idx].phy_config_index, out.pnf_phy_rel11.phy[idx].phy_config_index); + CU_ASSERT_EQUAL(in.pnf_phy_rel11.phy[idx].edpcch_supported, out.pnf_phy_rel11.phy[idx].edpcch_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel11.phy[idx].multi_ack_csi_reporting, out.pnf_phy_rel11.phy[idx].multi_ack_csi_reporting); + CU_ASSERT_EQUAL(in.pnf_phy_rel11.phy[idx].pucch_tx_diversity, out.pnf_phy_rel11.phy[idx].pucch_tx_diversity); + CU_ASSERT_EQUAL(in.pnf_phy_rel11.phy[idx].ul_comp_supported, out.pnf_phy_rel11.phy[idx].ul_comp_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel11.phy[idx].transmission_mode_5_supported, out.pnf_phy_rel11.phy[idx].transmission_mode_5_supported); + } + + CU_ASSERT_EQUAL(in.pnf_phy_rel12.tl.tag, out.pnf_phy_rel12.tl.tag); + CU_ASSERT_EQUAL(in.pnf_phy_rel12.number_of_phys, out.pnf_phy_rel12.number_of_phys); + for(idx = 0; idx < out.pnf_phy_rel12.number_of_phys; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_phy_rel12.phy[idx].phy_config_index, out.pnf_phy_rel12.phy[idx].phy_config_index); + CU_ASSERT_EQUAL(in.pnf_phy_rel12.phy[idx].csi_subframe_set, out.pnf_phy_rel12.phy[idx].csi_subframe_set); + CU_ASSERT_EQUAL(in.pnf_phy_rel12.phy[idx].enhanced_4tx_codebook, out.pnf_phy_rel12.phy[idx].enhanced_4tx_codebook); + CU_ASSERT_EQUAL(in.pnf_phy_rel12.phy[idx].drs_supported, out.pnf_phy_rel12.phy[idx].drs_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel12.phy[idx].ul_64qam_supported, out.pnf_phy_rel12.phy[idx].ul_64qam_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel12.phy[idx].transmission_mode_10_supported, out.pnf_phy_rel12.phy[idx].transmission_mode_10_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel12.phy[idx].alternative_bts_indices, out.pnf_phy_rel12.phy[idx].alternative_bts_indices); + } + + CU_ASSERT_EQUAL(in.pnf_phy_rel13.tl.tag, out.pnf_phy_rel13.tl.tag); + CU_ASSERT_EQUAL(in.pnf_phy_rel13.number_of_phys, out.pnf_phy_rel13.number_of_phys); + for(idx = 0; idx < out.pnf_phy_rel13.number_of_phys; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_phy_rel13.phy[idx].phy_config_index, out.pnf_phy_rel13.phy[idx].phy_config_index); + CU_ASSERT_EQUAL(in.pnf_phy_rel13.phy[idx].pucch_format4_supported, out.pnf_phy_rel13.phy[idx].pucch_format4_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel13.phy[idx].pucch_format5_supported, out.pnf_phy_rel13.phy[idx].pucch_format5_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel13.phy[idx].more_than_5_ca_support, out.pnf_phy_rel13.phy[idx].more_than_5_ca_support); + CU_ASSERT_EQUAL(in.pnf_phy_rel13.phy[idx].laa_supported, out.pnf_phy_rel13.phy[idx].laa_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel13.phy[idx].laa_ending_in_dwpts_supported, out.pnf_phy_rel13.phy[idx].laa_ending_in_dwpts_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel13.phy[idx].laa_starting_in_second_slot_supported, out.pnf_phy_rel13.phy[idx].laa_starting_in_second_slot_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel13.phy[idx].beamforming_supported, out.pnf_phy_rel13.phy[idx].beamforming_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel13.phy[idx].csi_rs_enhancement_supported, out.pnf_phy_rel13.phy[idx].csi_rs_enhancement_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel13.phy[idx].drms_enhancement_supported, out.pnf_phy_rel13.phy[idx].drms_enhancement_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel13.phy[idx].srs_enhancement_supported, out.pnf_phy_rel13.phy[idx].srs_enhancement_supported); + } + + CU_ASSERT_EQUAL(in.pnf_phy_rel13_nb_iot.tl.tag, out.pnf_phy_rel13_nb_iot.tl.tag); + CU_ASSERT_EQUAL(in.pnf_phy_rel13_nb_iot.number_of_phys, out.pnf_phy_rel13_nb_iot.number_of_phys); + + for(idx = 0; idx < out.pnf_phy_rel13_nb_iot.number_of_phys; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_phy_rel13_nb_iot.phy[idx].phy_config_index, out.pnf_phy_rel13_nb_iot.phy[idx].phy_config_index); + CU_ASSERT_EQUAL(in.pnf_phy_rel13_nb_iot.phy[idx].number_of_rfs, out.pnf_phy_rel13_nb_iot.phy[idx].number_of_rfs); + + + for(idx2 = 0; idx2 < out.pnf_phy_rel13_nb_iot.phy[idx].number_of_rfs; ++idx2) + { + CU_ASSERT_EQUAL(in.pnf_phy_rel13_nb_iot.phy[idx].rf_config[idx2].rf_config_index, out.pnf_phy_rel13_nb_iot.phy[idx].rf_config[idx2].rf_config_index); + } + CU_ASSERT_EQUAL(in.pnf_phy_rel13_nb_iot.phy[idx].number_of_rf_exclusions, out.pnf_phy_rel13_nb_iot.phy[idx].number_of_rf_exclusions); + + for(idx2 = 0; idx2 < out.pnf_phy_rel13_nb_iot.phy[idx].number_of_rf_exclusions; ++idx2) + { + CU_ASSERT_EQUAL(in.pnf_phy_rel13_nb_iot.phy[idx].excluded_rf_config[idx2].rf_config_index, out.pnf_phy_rel13_nb_iot.phy[idx].excluded_rf_config[idx2].rf_config_index); + } + + + CU_ASSERT_EQUAL(in.pnf_phy_rel13_nb_iot.phy[idx].number_of_dl_layers_supported, out.pnf_phy_rel13_nb_iot.phy[idx].number_of_dl_layers_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel13_nb_iot.phy[idx].number_of_ul_layers_supported, out.pnf_phy_rel13_nb_iot.phy[idx].number_of_ul_layers_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel13_nb_iot.phy[idx].maximum_3gpp_release_supported, out.pnf_phy_rel13_nb_iot.phy[idx].maximum_3gpp_release_supported); + CU_ASSERT_EQUAL(in.pnf_phy_rel13_nb_iot.phy[idx].nmm_modes_supported, out.pnf_phy_rel13_nb_iot.phy[idx].nmm_modes_supported); + } + + +} + +void nfapi_test_pnf_config_request() +{ + uint16_t idx; + nfapi_pnf_config_request_t in; + nfapi_pnf_config_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PNF_CONFIG_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + in.pnf_phy_rf_config.tl.tag = NFAPI_PNF_PHY_RF_TAG; + in.pnf_phy_rf_config.number_phy_rf_config_info = 2; + in.pnf_phy_rf_config.phy_rf_config[0].phy_id = 0; + in.pnf_phy_rf_config.phy_rf_config[0].phy_config_index = 0; + in.pnf_phy_rf_config.phy_rf_config[0].rf_config_index = 0; + + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + int unpack_result = nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(unpack_result, 1); + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + //CU_ASSERT_EQUAL(in.error_code, out.error_code); + + CU_ASSERT_EQUAL(in.pnf_phy_rf_config.tl.tag, out.pnf_phy_rf_config.tl.tag); + CU_ASSERT_EQUAL(in.pnf_phy_rf_config.number_phy_rf_config_info, out.pnf_phy_rf_config.number_phy_rf_config_info); + + for(idx = 0; idx < out.pnf_phy_rf_config.number_phy_rf_config_info; ++idx) + { + CU_ASSERT_EQUAL(in.pnf_phy_rf_config.phy_rf_config[idx].phy_id, out.pnf_phy_rf_config.phy_rf_config[idx].phy_id); + CU_ASSERT_EQUAL(in.pnf_phy_rf_config.phy_rf_config[idx].phy_config_index, out.pnf_phy_rf_config.phy_rf_config[idx].phy_config_index); + CU_ASSERT_EQUAL(in.pnf_phy_rf_config.phy_rf_config[idx].rf_config_index, out.pnf_phy_rf_config.phy_rf_config[idx].rf_config_index); + } +} + + + +void nfapi_test_pnf_config_response() +{ + nfapi_pnf_config_response_t in; + memset(&in, 0, sizeof(in)); + nfapi_pnf_config_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PNF_CONFIG_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_MSG_OK; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); +} +void nfapi_test_pnf_config_response1() +{ + uint8_t buffer[NFAPI_HEADER_LENGTH + 1]; + + nfapi_pnf_config_response_t in; + memset(&in, 0, sizeof(in)); + //nfapi_pnf_config_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PNF_CONFIG_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_MSG_OK; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), buffer, sizeof(buffer), 0); + CU_ASSERT_EQUAL(packedMessageLength, -1); + + //nfapi_p5_message_unpack(buffer, sizeof(buffer), &out, sizeof(out), 0); + //CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + //CU_ASSERT_EQUAL(in.error_code, out.error_code); +} +void nfapi_test_pnf_start_request() +{ + nfapi_pnf_start_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_pnf_start_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PNF_START_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); +} + +void nfapi_test_pnf_start_response() +{ + nfapi_pnf_start_response_t in; + memset(&in, 0, sizeof(in)); + nfapi_pnf_start_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PNF_START_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_MSG_OK; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); +} +void nfapi_test_pnf_stop_request() +{ + nfapi_pnf_stop_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_pnf_stop_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PNF_STOP_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); +} +void nfapi_test_pnf_stop_response() +{ + nfapi_pnf_stop_response_t in; + memset(&in, 0, sizeof(in)); + nfapi_pnf_stop_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PNF_STOP_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_MSG_OK; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); +} + +void nfapi_test_param_request() +{ + nfapi_param_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_param_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PARAM_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); +} +void nfapi_test_param_response() +{ + #define SET_TLV(_TLV, _TAG, _VALUE) { _TLV.tl.tag = _TAG; _TLV.value = _VALUE; num_tlv++; } + #define ASSERT_TLV(IN_TLV, OUT_TLV) { CU_ASSERT_EQUAL(IN_TLV.tl.tag, OUT_TLV.tl.tag); CU_ASSERT_EQUAL(IN_TLV.value, OUT_TLV.value);} + + nfapi_param_response_t in; + memset(&in, 0, sizeof(in)); + nfapi_param_response_t out; + memset(&out, 0, sizeof(out)); + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_PARAM_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_MSG_OK; + + uint16_t idx = 0; + uint16_t num_tlv = 0; // Bit of a hack, it is incremented in the SET_UINT16_TLV macro + + SET_TLV(in.l1_status.phy_state, NFAPI_L1_STATUS_PHY_STATE_TAG, 1); + SET_TLV(in.phy_capabilities.dl_bandwidth_support, NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, 63); + SET_TLV(in.phy_capabilities.ul_bandwidth_support, NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, 63); + SET_TLV(in.phy_capabilities.dl_modulation_support, NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, 3); + SET_TLV(in.phy_capabilities.ul_modulation_support, NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, 3); + SET_TLV(in.phy_capabilities.phy_antenna_capability, NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, 8); + SET_TLV(in.phy_capabilities.release_capability, NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, 63); + SET_TLV(in.phy_capabilities.mbsfn_capability, NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, 0); + + SET_TLV(in.laa_capability.laa_support, NFAPI_LAA_CAPABILITY_LAA_SUPPORT_TAG, 1); + SET_TLV(in.laa_capability.pd_sensing_lbt_support, NFAPI_LAA_CAPABILITY_PD_SENSING_LBT_SUPPORT_TAG, 0); + SET_TLV(in.laa_capability.multi_carrier_lbt_support, NFAPI_LAA_CAPABILITY_MULTI_CARRIER_LBT_SUPPORT_TAG, 3); + SET_TLV(in.laa_capability.partial_sf_support, NFAPI_LAA_CAPABILITY_PARTIAL_SF_SUPPORT_TAG, 2); + + SET_TLV(in.subframe_config.duplex_mode, NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, 1); + SET_TLV(in.subframe_config.pcfich_power_offset, NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, 1000); + SET_TLV(in.subframe_config.pb, NFAPI_SUBFRAME_CONFIG_PB_TAG, 1); + SET_TLV(in.subframe_config.dl_cyclic_prefix_type, NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, 0); + SET_TLV(in.subframe_config.ul_cyclic_prefix_type, NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, 0); + + SET_TLV(in.rf_config.dl_channel_bandwidth, NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, 50); + SET_TLV(in.rf_config.ul_channel_bandwidth, NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, 50); + SET_TLV(in.rf_config.reference_signal_power, NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, 120); + SET_TLV(in.rf_config.tx_antenna_ports, NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, 2); + SET_TLV(in.rf_config.rx_antenna_ports, NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, 2); + + SET_TLV(in.phich_config.phich_resource, NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, 3); + SET_TLV(in.phich_config.phich_duration, NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, 0); + SET_TLV(in.phich_config.phich_power_offset, NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, 500); + + SET_TLV(in.sch_config.primary_synchronization_signal_epre_eprers, NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, 1000); + SET_TLV(in.sch_config.secondary_synchronization_signal_epre_eprers, NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, 2000); + SET_TLV(in.sch_config.physical_cell_id, NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, 12344); + + + SET_TLV(in.prach_config.configuration_index, NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, 63); + SET_TLV(in.prach_config.root_sequence_index, NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, 800); + SET_TLV(in.prach_config.zero_correlation_zone_configuration, NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, 14); + SET_TLV(in.prach_config.high_speed_flag, NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, 0); + SET_TLV(in.prach_config.frequency_offset, NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, 23); + + SET_TLV(in.pusch_config.hopping_mode, NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, 0); + SET_TLV(in.pusch_config.hopping_offset, NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, 55); + SET_TLV(in.pusch_config.number_of_subbands, NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, 1); + + SET_TLV(in.pucch_config.delta_pucch_shift, NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, 2); + SET_TLV(in.pucch_config.n_cqi_rb, NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, 88); + SET_TLV(in.pucch_config.n_an_cs, NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, 3); + SET_TLV(in.pucch_config.n1_pucch_an, NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, 2015); + + SET_TLV(in.srs_config.bandwidth_configuration, NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, 3); + SET_TLV(in.srs_config.max_up_pts, NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, 0); + SET_TLV(in.srs_config.srs_subframe_configuration, NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, 11); + SET_TLV(in.srs_config.srs_acknack_srs_simultaneous_transmission, NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, 1); + + SET_TLV(in.uplink_reference_signal_config.uplink_rs_hopping, NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, 2); + SET_TLV(in.uplink_reference_signal_config.group_assignment, NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, 22); + SET_TLV(in.uplink_reference_signal_config.cyclic_shift_1_for_drms, NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, 2); + + SET_TLV(in.tdd_frame_structure_config.subframe_assignment, NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, 5); + SET_TLV(in.tdd_frame_structure_config.special_subframe_patterns, NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, 3); + + SET_TLV(in.l23_config.data_report_mode, NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, 1); + SET_TLV(in.l23_config.sfnsf, NFAPI_L23_CONFIG_SFNSF_TAG, 12354); + + in.nfapi_config.p7_vnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG; + num_tlv++; + + in.nfapi_config.p7_vnf_address_ipv6.tl.tag = NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG; + num_tlv++; + + SET_TLV(in.nfapi_config.p7_vnf_port, NFAPI_NFAPI_P7_VNF_PORT_TAG, 1111); + + in.nfapi_config.p7_pnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG; + num_tlv++; + + in.nfapi_config.p7_pnf_address_ipv6.tl.tag = NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG; + num_tlv++; + + SET_TLV(in.nfapi_config.p7_pnf_port, NFAPI_NFAPI_P7_PNF_PORT_TAG, 9999); + SET_TLV(in.nfapi_config.dl_ue_per_sf, NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, 4); + SET_TLV(in.nfapi_config.ul_ue_per_sf, NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, 4); + + in.nfapi_config.rf_bands.tl.tag = NFAPI_PHY_RF_BANDS_TAG; + in.nfapi_config.rf_bands.number_rf_bands = 2; + in.nfapi_config.rf_bands.rf_band[0] = 783; + num_tlv++; + + SET_TLV(in.nfapi_config.timing_window, NFAPI_NFAPI_TIMING_WINDOW_TAG, 29); + SET_TLV(in.nfapi_config.timing_info_mode, NFAPI_NFAPI_TIMING_INFO_MODE_TAG, 2); + SET_TLV(in.nfapi_config.timing_info_period, NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, 23); + SET_TLV(in.nfapi_config.max_transmit_power, NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, 123); + SET_TLV(in.nfapi_config.earfcn, NFAPI_NFAPI_EARFCN_TAG, 1800); + + in.nfapi_config.nmm_gsm_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG; + in.nfapi_config.nmm_gsm_frequency_bands.number_of_rf_bands = 2; + num_tlv++; + + in.nfapi_config.nmm_umts_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG; + in.nfapi_config.nmm_umts_frequency_bands.number_of_rf_bands = 3; + num_tlv++; + + in.nfapi_config.nmm_lte_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG; + in.nfapi_config.nmm_lte_frequency_bands.number_of_rf_bands = 1; + num_tlv++; + + SET_TLV(in.nfapi_config.nmm_uplink_rssi_supported, NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, 1); + + + in.num_tlv = num_tlv; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + CU_ASSERT_EQUAL(in.num_tlv, out.num_tlv); + + ASSERT_TLV(in.l1_status.phy_state, out.l1_status.phy_state); + ASSERT_TLV(in.phy_capabilities.dl_bandwidth_support, out.phy_capabilities.dl_bandwidth_support); + ASSERT_TLV(in.phy_capabilities.ul_bandwidth_support, out.phy_capabilities.ul_bandwidth_support); + ASSERT_TLV(in.phy_capabilities.dl_modulation_support, out.phy_capabilities.dl_modulation_support); + ASSERT_TLV(in.phy_capabilities.ul_modulation_support, out.phy_capabilities.ul_modulation_support); + ASSERT_TLV(in.phy_capabilities.phy_antenna_capability, out.phy_capabilities.phy_antenna_capability); + ASSERT_TLV(in.phy_capabilities.release_capability, out.phy_capabilities.release_capability); + ASSERT_TLV(in.phy_capabilities.mbsfn_capability, out.phy_capabilities.mbsfn_capability); + + ASSERT_TLV(in.laa_capability.laa_support, in.laa_capability.laa_support); + ASSERT_TLV(in.laa_capability.pd_sensing_lbt_support, in.laa_capability.pd_sensing_lbt_support); + ASSERT_TLV(in.laa_capability.multi_carrier_lbt_support, in.laa_capability.multi_carrier_lbt_support); + ASSERT_TLV(in.laa_capability.partial_sf_support, in.laa_capability.partial_sf_support); + + ASSERT_TLV(in.subframe_config.duplex_mode, out.subframe_config.duplex_mode); + ASSERT_TLV(in.subframe_config.pcfich_power_offset, out.subframe_config.pcfich_power_offset); + ASSERT_TLV(in.subframe_config.pb, out.subframe_config.pb); + ASSERT_TLV(in.subframe_config.dl_cyclic_prefix_type, out.subframe_config.dl_cyclic_prefix_type); + ASSERT_TLV(in.subframe_config.ul_cyclic_prefix_type, out.subframe_config.ul_cyclic_prefix_type); + + ASSERT_TLV(in.rf_config.dl_channel_bandwidth, out.rf_config.dl_channel_bandwidth); + ASSERT_TLV(in.rf_config.ul_channel_bandwidth, out.rf_config.ul_channel_bandwidth); + ASSERT_TLV(in.rf_config.reference_signal_power, out.rf_config.reference_signal_power); + ASSERT_TLV(in.rf_config.tx_antenna_ports, out.rf_config.tx_antenna_ports); + ASSERT_TLV(in.rf_config.rx_antenna_ports, out.rf_config.rx_antenna_ports); + + ASSERT_TLV(in.phich_config.phich_resource, out.phich_config.phich_resource); + ASSERT_TLV(in.phich_config.phich_duration, out.phich_config.phich_duration); + ASSERT_TLV(in.phich_config.phich_power_offset, out.phich_config.phich_power_offset); + + ASSERT_TLV(in.sch_config.primary_synchronization_signal_epre_eprers, out.sch_config.primary_synchronization_signal_epre_eprers); + ASSERT_TLV(in.sch_config.secondary_synchronization_signal_epre_eprers, out.sch_config.secondary_synchronization_signal_epre_eprers); + ASSERT_TLV(in.sch_config.physical_cell_id, out.sch_config.physical_cell_id); + + + ASSERT_TLV(in.prach_config.configuration_index, out.prach_config.configuration_index); + ASSERT_TLV(in.prach_config.root_sequence_index, out.prach_config.root_sequence_index); + ASSERT_TLV(in.prach_config.zero_correlation_zone_configuration, out.prach_config.zero_correlation_zone_configuration); + ASSERT_TLV(in.prach_config.high_speed_flag, out.prach_config.high_speed_flag); + ASSERT_TLV(in.prach_config.frequency_offset, out.prach_config.frequency_offset); + + ASSERT_TLV(in.pusch_config.hopping_mode, in.pusch_config.hopping_mode); + ASSERT_TLV(in.pusch_config.hopping_offset, in.pusch_config.hopping_offset); + ASSERT_TLV(in.pusch_config.number_of_subbands, in.pusch_config.number_of_subbands); + + ASSERT_TLV(in.pucch_config.delta_pucch_shift, out.pucch_config.delta_pucch_shift); + ASSERT_TLV(in.pucch_config.n_cqi_rb, out.pucch_config.n_cqi_rb); + ASSERT_TLV(in.pucch_config.n_an_cs, out.pucch_config.n_an_cs); + ASSERT_TLV(in.pucch_config.n1_pucch_an, out.pucch_config.n1_pucch_an); + + ASSERT_TLV(in.srs_config.bandwidth_configuration, out.srs_config.bandwidth_configuration); + ASSERT_TLV(in.srs_config.max_up_pts, out.srs_config.max_up_pts); + ASSERT_TLV(in.srs_config.srs_subframe_configuration, out.srs_config.srs_subframe_configuration); + ASSERT_TLV(in.srs_config.srs_acknack_srs_simultaneous_transmission, out.srs_config.srs_acknack_srs_simultaneous_transmission); + + ASSERT_TLV(in.uplink_reference_signal_config.uplink_rs_hopping, out.uplink_reference_signal_config.uplink_rs_hopping); + ASSERT_TLV(in.uplink_reference_signal_config.group_assignment, out.uplink_reference_signal_config.group_assignment); + ASSERT_TLV(in.uplink_reference_signal_config.cyclic_shift_1_for_drms, out.uplink_reference_signal_config.cyclic_shift_1_for_drms); + + ASSERT_TLV(in.tdd_frame_structure_config.subframe_assignment, out.tdd_frame_structure_config.subframe_assignment); + ASSERT_TLV(in.tdd_frame_structure_config.special_subframe_patterns, out.tdd_frame_structure_config.special_subframe_patterns); + + ASSERT_TLV(in.l23_config.data_report_mode, out.l23_config.data_report_mode); + ASSERT_TLV(in.l23_config.sfnsf, out.l23_config.sfnsf); + + CU_ASSERT_EQUAL(in.nfapi_config.p7_vnf_address_ipv4.tl.tag, out.nfapi_config.p7_vnf_address_ipv4.tl.tag); + for(idx = 0; idx < NFAPI_IPV4_ADDRESS_LENGTH; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.p7_vnf_address_ipv4.address[idx], out.nfapi_config.p7_vnf_address_ipv4.address[idx]); + } + + CU_ASSERT_EQUAL(in.nfapi_config.p7_vnf_address_ipv6.tl.tag, out.nfapi_config.p7_vnf_address_ipv6.tl.tag); + for(idx = 0; idx < NFAPI_IPV6_ADDRESS_LENGTH; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.p7_vnf_address_ipv6.address[idx], out.nfapi_config.p7_vnf_address_ipv6.address[idx]); + } + + ASSERT_TLV(in.nfapi_config.p7_vnf_port, out.nfapi_config.p7_vnf_port); + + CU_ASSERT_EQUAL(in.nfapi_config.p7_pnf_address_ipv4.tl.tag, out.nfapi_config.p7_pnf_address_ipv4.tl.tag); + for(idx = 0; idx < NFAPI_IPV4_ADDRESS_LENGTH; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.p7_pnf_address_ipv4.address[idx], out.nfapi_config.p7_pnf_address_ipv4.address[idx]); + } + + CU_ASSERT_EQUAL(in.nfapi_config.p7_pnf_address_ipv6.tl.tag, out.nfapi_config.p7_pnf_address_ipv6.tl.tag); + for(idx = 0; idx < NFAPI_IPV6_ADDRESS_LENGTH; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.p7_pnf_address_ipv6.address[idx], out.nfapi_config.p7_pnf_address_ipv6.address[idx]); + } + + ASSERT_TLV(in.nfapi_config.p7_pnf_port, out.nfapi_config.p7_pnf_port); + ASSERT_TLV(in.nfapi_config.dl_ue_per_sf, out.nfapi_config.dl_ue_per_sf); + ASSERT_TLV(in.nfapi_config.ul_ue_per_sf, out.nfapi_config.ul_ue_per_sf); + + CU_ASSERT_EQUAL(in.nfapi_config.rf_bands.tl.tag, out.nfapi_config.rf_bands.tl.tag); + CU_ASSERT_EQUAL(in.nfapi_config.rf_bands.number_rf_bands, out.nfapi_config.rf_bands.number_rf_bands); + for(idx = 0; idx < out.nfapi_config.rf_bands.number_rf_bands; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.rf_bands.rf_band[idx], out.nfapi_config.rf_bands.rf_band[idx]); + } + + ASSERT_TLV(in.nfapi_config.timing_window, out.nfapi_config.timing_window); + ASSERT_TLV(in.nfapi_config.timing_info_mode, out.nfapi_config.timing_info_mode); + ASSERT_TLV(in.nfapi_config.timing_info_period, out.nfapi_config.timing_info_period); + ASSERT_TLV(in.nfapi_config.max_transmit_power, out.nfapi_config.max_transmit_power); + ASSERT_TLV(in.nfapi_config.earfcn, out.nfapi_config.earfcn); + + CU_ASSERT_EQUAL(in.nfapi_config.nmm_gsm_frequency_bands.tl.tag, out.nfapi_config.nmm_gsm_frequency_bands.tl.tag); + CU_ASSERT_EQUAL(in.nfapi_config.nmm_gsm_frequency_bands.number_of_rf_bands, out.nfapi_config.nmm_gsm_frequency_bands.number_of_rf_bands); + for(idx = 0; idx < out.nfapi_config.nmm_gsm_frequency_bands.number_of_rf_bands; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.nmm_gsm_frequency_bands.bands[idx], out.nfapi_config.nmm_gsm_frequency_bands.bands[idx]); + } + + CU_ASSERT_EQUAL(in.nfapi_config.nmm_umts_frequency_bands.tl.tag, out.nfapi_config.nmm_umts_frequency_bands.tl.tag); + CU_ASSERT_EQUAL(in.nfapi_config.nmm_umts_frequency_bands.number_of_rf_bands, out.nfapi_config.nmm_umts_frequency_bands.number_of_rf_bands); + for(idx = 0; idx < out.nfapi_config.nmm_umts_frequency_bands.number_of_rf_bands; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.nmm_umts_frequency_bands.bands[idx], out.nfapi_config.nmm_umts_frequency_bands.bands[idx]); + } + + CU_ASSERT_EQUAL(in.nfapi_config.nmm_lte_frequency_bands.tl.tag, out.nfapi_config.nmm_lte_frequency_bands.tl.tag); + CU_ASSERT_EQUAL(in.nfapi_config.nmm_lte_frequency_bands.number_of_rf_bands, out.nfapi_config.nmm_lte_frequency_bands.number_of_rf_bands); + for(idx = 0; idx < out.nfapi_config.nmm_lte_frequency_bands.number_of_rf_bands; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.nmm_lte_frequency_bands.bands[idx], out.nfapi_config.nmm_lte_frequency_bands.bands[idx]); + } + + ASSERT_TLV(in.nfapi_config.nmm_uplink_rssi_supported, out.nfapi_config.nmm_uplink_rssi_supported); +} +void nfapi_test_config_request() +{ + #define SET_TLV(_TLV, _TAG, _VALUE) { _TLV.tl.tag = _TAG; _TLV.value = _VALUE; num_tlv++; } + #define ASSERT_TLV(IN_TLV, OUT_TLV) { CU_ASSERT_EQUAL(IN_TLV.tl.tag, OUT_TLV.tl.tag); CU_ASSERT_EQUAL(IN_TLV.value, OUT_TLV.value);} + + nfapi_config_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_config_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_CONFIG_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + + uint16_t idx = 0; + uint16_t num_tlv = 0; // Bit of a hack, it is incremented in the SET_UINT16_TLV macro + + SET_TLV(in.subframe_config.duplex_mode, NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, 1); + SET_TLV(in.subframe_config.pcfich_power_offset, NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, 1000); + SET_TLV(in.subframe_config.pb, NFAPI_SUBFRAME_CONFIG_PB_TAG, 1); + SET_TLV(in.subframe_config.dl_cyclic_prefix_type, NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, 0); + SET_TLV(in.subframe_config.ul_cyclic_prefix_type, NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, 0); + + SET_TLV(in.rf_config.dl_channel_bandwidth, NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, 50); + SET_TLV(in.rf_config.ul_channel_bandwidth, NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, 50); + SET_TLV(in.rf_config.reference_signal_power, NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, 120); + SET_TLV(in.rf_config.tx_antenna_ports, NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, 2); + SET_TLV(in.rf_config.rx_antenna_ports, NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, 2); + + SET_TLV(in.phich_config.phich_resource, NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, 3); + SET_TLV(in.phich_config.phich_duration, NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, 0); + SET_TLV(in.phich_config.phich_power_offset, NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, 500); + + SET_TLV(in.sch_config.primary_synchronization_signal_epre_eprers, NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, 1000); + SET_TLV(in.sch_config.secondary_synchronization_signal_epre_eprers, NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, 2000); + SET_TLV(in.sch_config.physical_cell_id, NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, 12344); + + + SET_TLV(in.prach_config.configuration_index, NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, 63); + SET_TLV(in.prach_config.root_sequence_index, NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, 800); + SET_TLV(in.prach_config.zero_correlation_zone_configuration, NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, 14); + SET_TLV(in.prach_config.high_speed_flag, NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, 0); + SET_TLV(in.prach_config.frequency_offset, NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, 23); + + SET_TLV(in.pusch_config.hopping_mode, NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, 0); + SET_TLV(in.pusch_config.hopping_offset, NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, 55); + SET_TLV(in.pusch_config.number_of_subbands, NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, 1); + + SET_TLV(in.pucch_config.delta_pucch_shift, NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, 2); + SET_TLV(in.pucch_config.n_cqi_rb, NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, 88); + SET_TLV(in.pucch_config.n_an_cs, NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, 3); + SET_TLV(in.pucch_config.n1_pucch_an, NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, 2015); + + SET_TLV(in.srs_config.bandwidth_configuration, NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, 3); + SET_TLV(in.srs_config.max_up_pts, NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, 0); + SET_TLV(in.srs_config.srs_subframe_configuration, NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, 11); + SET_TLV(in.srs_config.srs_acknack_srs_simultaneous_transmission, NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, 1); + + SET_TLV(in.uplink_reference_signal_config.uplink_rs_hopping, NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, 2); + SET_TLV(in.uplink_reference_signal_config.group_assignment, NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, 22); + SET_TLV(in.uplink_reference_signal_config.cyclic_shift_1_for_drms, NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, 2); + + + // laa config + SET_TLV(in.laa_config.ed_threshold_lbt_pdsch, NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, 45); + SET_TLV(in.laa_config.ed_threshold_lbt_drs, NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, 69); + SET_TLV(in.laa_config.pd_threshold, NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, 65535); + SET_TLV(in.laa_config.multi_carrier_type, NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, 3); + SET_TLV(in.laa_config.multi_carrier_tx, NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, 1); + SET_TLV(in.laa_config.multi_carrier_freeze, NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, 0); + SET_TLV(in.laa_config.tx_antenna_ports_drs, NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, 4); + SET_TLV(in.laa_config.tx_power_drs, NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, 10000); + // + // emtc config + SET_TLV(in.emtc_config.pbch_repetitions_enable_r13, NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, 1); + SET_TLV(in.emtc_config.prach_catm_root_sequence_index, NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, 837); + SET_TLV(in.emtc_config.prach_catm_zero_correlation_zone_configuration, NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, 15); + SET_TLV(in.emtc_config.prach_catm_high_speed_flag, NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, 15); + SET_TLV(in.emtc_config.prach_ce_level_0_enable, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, 1); + SET_TLV(in.emtc_config.prach_ce_level_0_configuration_index, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, 60); + SET_TLV(in.emtc_config.prach_ce_level_0_frequency_offset, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, 90); + SET_TLV(in.emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, 128); + SET_TLV(in.emtc_config.prach_ce_level_0_starting_subframe_periodicity, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, 256); + SET_TLV(in.emtc_config.prach_ce_level_0_hopping_enable, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, 1); + SET_TLV(in.emtc_config.prach_ce_level_0_hopping_offset, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, 0); + SET_TLV(in.emtc_config.prach_ce_level_1_enable, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, 1); + SET_TLV(in.emtc_config.prach_ce_level_1_configuration_index, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, 45); + SET_TLV(in.emtc_config.prach_ce_level_1_frequency_offset, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, 88); + SET_TLV(in.emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, 64); + SET_TLV(in.emtc_config.prach_ce_level_1_starting_subframe_periodicity, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, 0xFFFF); + SET_TLV(in.emtc_config.prach_ce_level_1_hopping_enable, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, 1); + SET_TLV(in.emtc_config.prach_ce_level_1_hopping_offset, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, 22); + SET_TLV(in.emtc_config.prach_ce_level_2_enable, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, 1); + SET_TLV(in.emtc_config.prach_ce_level_2_configuration_index, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, 63); + SET_TLV(in.emtc_config.prach_ce_level_2_frequency_offset, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, 22); + SET_TLV(in.emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, 8); + SET_TLV(in.emtc_config.prach_ce_level_2_starting_subframe_periodicity, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, 64) + SET_TLV(in.emtc_config.prach_ce_level_2_hopping_enable, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, 1); + SET_TLV(in.emtc_config.prach_ce_level_2_hopping_offset, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, 45); + SET_TLV(in.emtc_config.prach_ce_level_3_enable, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, 0); + SET_TLV(in.emtc_config.prach_ce_level_3_configuration_index, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, 45); + SET_TLV(in.emtc_config.prach_ce_level_3_frequency_offset, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, 22); + SET_TLV(in.emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, 4); + SET_TLV(in.emtc_config.prach_ce_level_3_starting_subframe_periodicity, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, 4); + SET_TLV(in.emtc_config.prach_ce_level_3_hopping_enable, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, 0); + SET_TLV(in.emtc_config.prach_ce_level_3_hopping_offset, NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, 0); + SET_TLV(in.emtc_config.pucch_interval_ulhoppingconfigcommonmodea, NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, 8); + SET_TLV(in.emtc_config.pucch_interval_ulhoppingconfigcommonmodeb, NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, 8); + + + SET_TLV(in.tdd_frame_structure_config.subframe_assignment, NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, 5); + SET_TLV(in.tdd_frame_structure_config.special_subframe_patterns, NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, 3); + + SET_TLV(in.l23_config.data_report_mode, NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, 1); + SET_TLV(in.l23_config.sfnsf, NFAPI_L23_CONFIG_SFNSF_TAG, 12354); + + in.nfapi_config.p7_vnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG; + num_tlv++; + + in.nfapi_config.p7_vnf_address_ipv6.tl.tag = NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG; + num_tlv++; + + SET_TLV(in.nfapi_config.p7_vnf_port, NFAPI_NFAPI_P7_VNF_PORT_TAG, 1111); + + in.nfapi_config.p7_pnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG; + num_tlv++; + + in.nfapi_config.p7_pnf_address_ipv6.tl.tag = NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG; + for(idx = 0; idx < NFAPI_IPV6_ADDRESS_LENGTH; ++idx) + { + in.nfapi_config.p7_pnf_address_ipv6.address[idx] = idx; + } + num_tlv++; + + SET_TLV(in.nfapi_config.p7_pnf_port, NFAPI_NFAPI_P7_PNF_PORT_TAG, 9999); + SET_TLV(in.nfapi_config.dl_ue_per_sf, NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, 4); + SET_TLV(in.nfapi_config.ul_ue_per_sf, NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, 4); + + in.nfapi_config.rf_bands.tl.tag = NFAPI_PHY_RF_BANDS_TAG; + in.nfapi_config.rf_bands.number_rf_bands = 2; + in.nfapi_config.rf_bands.rf_band[0] = 783; + num_tlv++; + + SET_TLV(in.nfapi_config.timing_window, NFAPI_NFAPI_TIMING_WINDOW_TAG, 29); + SET_TLV(in.nfapi_config.timing_info_mode, NFAPI_NFAPI_TIMING_INFO_MODE_TAG, 2); + SET_TLV(in.nfapi_config.timing_info_period, NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, 23); + SET_TLV(in.nfapi_config.max_transmit_power, NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, 123); + SET_TLV(in.nfapi_config.earfcn, NFAPI_NFAPI_EARFCN_TAG, 1800); + + in.nfapi_config.nmm_gsm_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG; + in.nfapi_config.nmm_gsm_frequency_bands.number_of_rf_bands = 2; + num_tlv++; + + in.nfapi_config.nmm_umts_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG; + in.nfapi_config.nmm_umts_frequency_bands.number_of_rf_bands = 3; + num_tlv++; + + in.nfapi_config.nmm_lte_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG; + in.nfapi_config.nmm_lte_frequency_bands.number_of_rf_bands = 1; + num_tlv++; + + SET_TLV(in.nfapi_config.nmm_uplink_rssi_supported, NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, 1); + + + in.num_tlv = num_tlv; + + in.vendor_extension = 0; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.num_tlv, out.num_tlv); + + ASSERT_TLV(in.subframe_config.duplex_mode, out.subframe_config.duplex_mode); + ASSERT_TLV(in.subframe_config.pcfich_power_offset, out.subframe_config.pcfich_power_offset); + ASSERT_TLV(in.subframe_config.pb, out.subframe_config.pb); + ASSERT_TLV(in.subframe_config.dl_cyclic_prefix_type, out.subframe_config.dl_cyclic_prefix_type); + ASSERT_TLV(in.subframe_config.ul_cyclic_prefix_type, out.subframe_config.ul_cyclic_prefix_type); + + ASSERT_TLV(in.rf_config.dl_channel_bandwidth, out.rf_config.dl_channel_bandwidth); + ASSERT_TLV(in.rf_config.ul_channel_bandwidth, out.rf_config.ul_channel_bandwidth); + ASSERT_TLV(in.rf_config.reference_signal_power, out.rf_config.reference_signal_power); + ASSERT_TLV(in.rf_config.tx_antenna_ports, out.rf_config.tx_antenna_ports); + ASSERT_TLV(in.rf_config.rx_antenna_ports, out.rf_config.rx_antenna_ports); + + ASSERT_TLV(in.phich_config.phich_resource, out.phich_config.phich_resource); + ASSERT_TLV(in.phich_config.phich_duration, out.phich_config.phich_duration); + ASSERT_TLV(in.phich_config.phich_power_offset, out.phich_config.phich_power_offset); + + ASSERT_TLV(in.sch_config.primary_synchronization_signal_epre_eprers, out.sch_config.primary_synchronization_signal_epre_eprers); + ASSERT_TLV(in.sch_config.secondary_synchronization_signal_epre_eprers, out.sch_config.secondary_synchronization_signal_epre_eprers); + ASSERT_TLV(in.sch_config.physical_cell_id, out.sch_config.physical_cell_id); + + + ASSERT_TLV(in.prach_config.configuration_index, out.prach_config.configuration_index); + ASSERT_TLV(in.prach_config.root_sequence_index, out.prach_config.root_sequence_index); + ASSERT_TLV(in.prach_config.zero_correlation_zone_configuration, out.prach_config.zero_correlation_zone_configuration); + ASSERT_TLV(in.prach_config.high_speed_flag, out.prach_config.high_speed_flag); + ASSERT_TLV(in.prach_config.frequency_offset, out.prach_config.frequency_offset); + + ASSERT_TLV(in.pusch_config.hopping_mode, in.pusch_config.hopping_mode); + ASSERT_TLV(in.pusch_config.hopping_offset, in.pusch_config.hopping_offset); + ASSERT_TLV(in.pusch_config.number_of_subbands, in.pusch_config.number_of_subbands); + + ASSERT_TLV(in.pucch_config.delta_pucch_shift, out.pucch_config.delta_pucch_shift); + ASSERT_TLV(in.pucch_config.n_cqi_rb, out.pucch_config.n_cqi_rb); + ASSERT_TLV(in.pucch_config.n_an_cs, out.pucch_config.n_an_cs); + ASSERT_TLV(in.pucch_config.n1_pucch_an, out.pucch_config.n1_pucch_an); + + ASSERT_TLV(in.srs_config.bandwidth_configuration, out.srs_config.bandwidth_configuration); + ASSERT_TLV(in.srs_config.max_up_pts, out.srs_config.max_up_pts); + ASSERT_TLV(in.srs_config.srs_subframe_configuration, out.srs_config.srs_subframe_configuration); + ASSERT_TLV(in.srs_config.srs_acknack_srs_simultaneous_transmission, out.srs_config.srs_acknack_srs_simultaneous_transmission); + + ASSERT_TLV(in.uplink_reference_signal_config.uplink_rs_hopping, out.uplink_reference_signal_config.uplink_rs_hopping); + ASSERT_TLV(in.uplink_reference_signal_config.group_assignment, out.uplink_reference_signal_config.group_assignment); + ASSERT_TLV(in.uplink_reference_signal_config.cyclic_shift_1_for_drms, out.uplink_reference_signal_config.cyclic_shift_1_for_drms); + + ASSERT_TLV(in.tdd_frame_structure_config.subframe_assignment, out.tdd_frame_structure_config.subframe_assignment); + ASSERT_TLV(in.tdd_frame_structure_config.special_subframe_patterns, out.tdd_frame_structure_config.special_subframe_patterns); + + // laa config + ASSERT_TLV(in.laa_config.ed_threshold_lbt_pdsch, out.laa_config.ed_threshold_lbt_pdsch); + ASSERT_TLV(in.laa_config.ed_threshold_lbt_drs, out.laa_config.ed_threshold_lbt_drs); + ASSERT_TLV(in.laa_config.pd_threshold, out.laa_config.pd_threshold); + ASSERT_TLV(in.laa_config.multi_carrier_type, out.laa_config.multi_carrier_type); + ASSERT_TLV(in.laa_config.multi_carrier_tx, out.laa_config.multi_carrier_tx); + ASSERT_TLV(in.laa_config.multi_carrier_freeze, out.laa_config.multi_carrier_freeze); + ASSERT_TLV(in.laa_config.tx_antenna_ports_drs, out.laa_config.tx_antenna_ports_drs); + ASSERT_TLV(in.laa_config.tx_power_drs, out.laa_config.tx_power_drs); + // emtc config + ASSERT_TLV(in.emtc_config.pbch_repetitions_enable_r13, out.emtc_config.pbch_repetitions_enable_r13); + ASSERT_TLV(in.emtc_config.prach_catm_root_sequence_index, out.emtc_config.prach_catm_root_sequence_index); + ASSERT_TLV(in.emtc_config.prach_catm_zero_correlation_zone_configuration, out.emtc_config.prach_catm_zero_correlation_zone_configuration); + ASSERT_TLV(in.emtc_config.prach_catm_high_speed_flag, out.emtc_config.prach_catm_high_speed_flag); + ASSERT_TLV(in.emtc_config.prach_ce_level_0_enable, out.emtc_config.prach_ce_level_0_enable); + ASSERT_TLV(in.emtc_config.prach_ce_level_0_configuration_index, out.emtc_config.prach_ce_level_0_configuration_index); + ASSERT_TLV(in.emtc_config.prach_ce_level_0_frequency_offset, out.emtc_config.prach_ce_level_0_frequency_offset); + ASSERT_TLV(in.emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt, out.emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt); + ASSERT_TLV(in.emtc_config.prach_ce_level_0_starting_subframe_periodicity, out.emtc_config.prach_ce_level_0_starting_subframe_periodicity); + ASSERT_TLV(in.emtc_config.prach_ce_level_0_hopping_enable, out.emtc_config.prach_ce_level_0_hopping_enable); + ASSERT_TLV(in.emtc_config.prach_ce_level_0_hopping_offset, out.emtc_config.prach_ce_level_0_hopping_offset); + ASSERT_TLV(in.emtc_config.prach_ce_level_1_enable, out.emtc_config.prach_ce_level_1_enable); + ASSERT_TLV(in.emtc_config.prach_ce_level_1_configuration_index, out.emtc_config.prach_ce_level_1_configuration_index); + ASSERT_TLV(in.emtc_config.prach_ce_level_1_frequency_offset, out.emtc_config.prach_ce_level_1_frequency_offset); + ASSERT_TLV(in.emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt, out.emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt); + ASSERT_TLV(in.emtc_config.prach_ce_level_1_starting_subframe_periodicity, out.emtc_config.prach_ce_level_1_starting_subframe_periodicity); + ASSERT_TLV(in.emtc_config.prach_ce_level_1_hopping_enable, out.emtc_config.prach_ce_level_1_hopping_enable); + ASSERT_TLV(in.emtc_config.prach_ce_level_1_hopping_offset, out.emtc_config.prach_ce_level_1_hopping_offset); + ASSERT_TLV(in.emtc_config.prach_ce_level_2_enable, out.emtc_config.prach_ce_level_2_enable); + ASSERT_TLV(in.emtc_config.prach_ce_level_2_configuration_index, out.emtc_config.prach_ce_level_2_configuration_index); + ASSERT_TLV(in.emtc_config.prach_ce_level_2_frequency_offset, out.emtc_config.prach_ce_level_2_frequency_offset); + ASSERT_TLV(in.emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt, out.emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt); + ASSERT_TLV(in.emtc_config.prach_ce_level_2_starting_subframe_periodicity, out.emtc_config.prach_ce_level_2_starting_subframe_periodicity); + ASSERT_TLV(in.emtc_config.prach_ce_level_2_hopping_enable, out.emtc_config.prach_ce_level_2_hopping_enable); + ASSERT_TLV(in.emtc_config.prach_ce_level_2_hopping_offset, out.emtc_config.prach_ce_level_2_hopping_offset); + ASSERT_TLV(in.emtc_config.prach_ce_level_3_enable, out.emtc_config.prach_ce_level_3_enable); + ASSERT_TLV(in.emtc_config.prach_ce_level_3_configuration_index, out.emtc_config.prach_ce_level_3_configuration_index); + ASSERT_TLV(in.emtc_config.prach_ce_level_3_frequency_offset, out.emtc_config.prach_ce_level_3_frequency_offset); + ASSERT_TLV(in.emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt, out.emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt); + ASSERT_TLV(in.emtc_config.prach_ce_level_3_starting_subframe_periodicity, out.emtc_config.prach_ce_level_3_starting_subframe_periodicity); + ASSERT_TLV(in.emtc_config.prach_ce_level_3_hopping_enable, out.emtc_config.prach_ce_level_3_hopping_enable); + ASSERT_TLV(in.emtc_config.prach_ce_level_3_hopping_offset, out.emtc_config.prach_ce_level_3_hopping_offset); + ASSERT_TLV(in.emtc_config.pucch_interval_ulhoppingconfigcommonmodea, out.emtc_config.pucch_interval_ulhoppingconfigcommonmodea); + ASSERT_TLV(in.emtc_config.pucch_interval_ulhoppingconfigcommonmodeb, out.emtc_config.pucch_interval_ulhoppingconfigcommonmodeb); + + ASSERT_TLV(in.l23_config.data_report_mode, out.l23_config.data_report_mode); + ASSERT_TLV(in.l23_config.sfnsf, out.l23_config.sfnsf); + + CU_ASSERT_EQUAL(in.nfapi_config.p7_vnf_address_ipv4.tl.tag, out.nfapi_config.p7_vnf_address_ipv4.tl.tag); + for(idx = 0; idx < NFAPI_IPV4_ADDRESS_LENGTH; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.p7_vnf_address_ipv4.address[idx], out.nfapi_config.p7_vnf_address_ipv4.address[idx]); + } + + CU_ASSERT_EQUAL(in.nfapi_config.p7_vnf_address_ipv6.tl.tag, out.nfapi_config.p7_vnf_address_ipv6.tl.tag); + for(idx = 0; idx < NFAPI_IPV6_ADDRESS_LENGTH; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.p7_vnf_address_ipv6.address[idx], out.nfapi_config.p7_vnf_address_ipv6.address[idx]); + } + + ASSERT_TLV(in.nfapi_config.p7_vnf_port, out.nfapi_config.p7_vnf_port); + + CU_ASSERT_EQUAL(in.nfapi_config.p7_pnf_address_ipv4.tl.tag, out.nfapi_config.p7_pnf_address_ipv4.tl.tag); + for(idx = 0; idx < NFAPI_IPV4_ADDRESS_LENGTH; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.p7_pnf_address_ipv4.address[idx], out.nfapi_config.p7_pnf_address_ipv4.address[idx]); + } + + CU_ASSERT_EQUAL(in.nfapi_config.p7_pnf_address_ipv6.tl.tag, out.nfapi_config.p7_pnf_address_ipv6.tl.tag); + for(idx = 0; idx < NFAPI_IPV6_ADDRESS_LENGTH; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.p7_pnf_address_ipv6.address[idx], out.nfapi_config.p7_pnf_address_ipv6.address[idx]); + } + + ASSERT_TLV(in.nfapi_config.p7_pnf_port, out.nfapi_config.p7_pnf_port); + ASSERT_TLV(in.nfapi_config.dl_ue_per_sf, out.nfapi_config.dl_ue_per_sf); + ASSERT_TLV(in.nfapi_config.ul_ue_per_sf, out.nfapi_config.ul_ue_per_sf); + + CU_ASSERT_EQUAL(in.nfapi_config.rf_bands.tl.tag, out.nfapi_config.rf_bands.tl.tag); + CU_ASSERT_EQUAL(in.nfapi_config.rf_bands.number_rf_bands, out.nfapi_config.rf_bands.number_rf_bands); + for(idx = 0; idx < out.nfapi_config.rf_bands.number_rf_bands; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.rf_bands.rf_band[idx], out.nfapi_config.rf_bands.rf_band[idx]); + } + + ASSERT_TLV(in.nfapi_config.timing_window, out.nfapi_config.timing_window); + ASSERT_TLV(in.nfapi_config.timing_info_mode, out.nfapi_config.timing_info_mode); + ASSERT_TLV(in.nfapi_config.timing_info_period, out.nfapi_config.timing_info_period); + ASSERT_TLV(in.nfapi_config.max_transmit_power, out.nfapi_config.max_transmit_power); + ASSERT_TLV(in.nfapi_config.earfcn, out.nfapi_config.earfcn); + + CU_ASSERT_EQUAL(in.nfapi_config.nmm_gsm_frequency_bands.tl.tag, out.nfapi_config.nmm_gsm_frequency_bands.tl.tag); + CU_ASSERT_EQUAL(in.nfapi_config.nmm_gsm_frequency_bands.number_of_rf_bands, out.nfapi_config.nmm_gsm_frequency_bands.number_of_rf_bands); + for(idx = 0; idx < out.nfapi_config.nmm_gsm_frequency_bands.number_of_rf_bands; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.nmm_gsm_frequency_bands.bands[idx], out.nfapi_config.nmm_gsm_frequency_bands.bands[idx]); + } + + CU_ASSERT_EQUAL(in.nfapi_config.nmm_umts_frequency_bands.tl.tag, out.nfapi_config.nmm_umts_frequency_bands.tl.tag); + CU_ASSERT_EQUAL(in.nfapi_config.nmm_umts_frequency_bands.number_of_rf_bands, out.nfapi_config.nmm_umts_frequency_bands.number_of_rf_bands); + for(idx = 0; idx < out.nfapi_config.nmm_umts_frequency_bands.number_of_rf_bands; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.nmm_umts_frequency_bands.bands[idx], out.nfapi_config.nmm_umts_frequency_bands.bands[idx]); + } + + CU_ASSERT_EQUAL(in.nfapi_config.nmm_lte_frequency_bands.tl.tag, out.nfapi_config.nmm_lte_frequency_bands.tl.tag); + CU_ASSERT_EQUAL(in.nfapi_config.nmm_lte_frequency_bands.number_of_rf_bands, out.nfapi_config.nmm_lte_frequency_bands.number_of_rf_bands); + for(idx = 0; idx < out.nfapi_config.nmm_lte_frequency_bands.number_of_rf_bands; ++idx) + { + CU_ASSERT_EQUAL(in.nfapi_config.nmm_lte_frequency_bands.bands[idx], out.nfapi_config.nmm_lte_frequency_bands.bands[idx]); + } + + ASSERT_TLV(in.nfapi_config.nmm_uplink_rssi_supported, out.nfapi_config.nmm_uplink_rssi_supported); +} +void nfapi_test_config_response() +{ + nfapi_config_response_t in; + memset(&in, 0, sizeof(in)); + nfapi_config_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_CONFIG_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_MSG_OK; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); +} +void nfapi_test_start_request() +{ + nfapi_start_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_start_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_START_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); +} +void nfapi_test_start_response() +{ + nfapi_start_response_t in; + memset(&in, 0, sizeof(in)); + nfapi_start_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_START_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_MSG_OK; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); +} +void nfapi_test_stop_request() +{ + nfapi_stop_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_stop_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_STOP_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + +} +void nfapi_test_stop_response() +{ + nfapi_stop_response_t in; + memset(&in, 0, sizeof(in)); + nfapi_stop_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_STOP_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_MSG_OK; + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); +} +void nfapi_test_measurement_request() +{ +// #define SET_TLV(_TLV, _TAG, _VALUE) { _TLV.tl.tag = _TAG; _TLV.value = _VALUE; } +// #define ASSERT_TLV(IN_TLV, OUT_TLV) { CU_ASSERT_EQUAL(IN_TLV.tl.tag, OUT_TLV.tl.tag); CU_ASSERT_EQUAL(IN_TLV.value, OUT_TLV.value);} + uint16_t num_tlv = 0; + nfapi_measurement_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_measurement_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_MEASUREMENT_REQUEST; + in.header.message_length = 0; + in.header.spare = 0; + + SET_TLV(in.dl_rs_tx_power, NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, 1); + SET_TLV(in.received_interference_power, NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, 123); + SET_TLV(in.thermal_noise_power, NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, 255); + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + + + ASSERT_TLV(in.dl_rs_tx_power, out.dl_rs_tx_power); + ASSERT_TLV(in.received_interference_power, out.received_interference_power); + ASSERT_TLV(in.thermal_noise_power, out.thermal_noise_power); +} +void nfapi_test_measurement_response() +{ + uint16_t num_tlv = 0; + nfapi_measurement_response_t in; + memset(&in, 0, sizeof(in)); + nfapi_measurement_response_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_MEASUREMENT_RESPONSE; + in.header.message_length = 0; + in.header.spare = 0; + + in.error_code = NFAPI_MSG_OK; + + SET_TLV(in.dl_rs_tx_power_measurement, NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, -400); + + in.received_interference_power_measurement.tl.tag = NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG; + in.received_interference_power_measurement.number_of_resource_blocks = 100; + in.received_interference_power_measurement.received_interference_power[0] = -8767; + + SET_TLV(in.thermal_noise_power_measurement, NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, -8900); + + int packedMessageLength = nfapi_p5_message_pack(&in, sizeof(in), gTestNfapiMessageTx, MAX_PACKED_MESSAGE_SIZE, 0); + + nfapi_p5_message_unpack(gTestNfapiMessageTx, packedMessageLength, &out, sizeof(out), 0); + + CU_ASSERT_EQUAL(in.header.message_id, out.header.message_id); + CU_ASSERT_EQUAL(in.error_code, out.error_code); + + ASSERT_TLV(in.dl_rs_tx_power_measurement, out.dl_rs_tx_power_measurement); + CU_ASSERT_EQUAL(in.received_interference_power_measurement.tl.tag, out.received_interference_power_measurement.tl.tag); + CU_ASSERT_EQUAL(in.received_interference_power_measurement.number_of_resource_blocks, out.received_interference_power_measurement.number_of_resource_blocks); + // check array + ASSERT_TLV(in.thermal_noise_power_measurement, out.thermal_noise_power_measurement); +} + +void nfapi_test_dl_config_request() +{ + + + uint16_t idx = 0; + nfapi_dl_config_request_t in; + memset(&in, 0, sizeof(in)); + nfapi_dl_config_request_t out; + + in.header.phy_id = NFAPI_PHY_ID_NA; + in.header.message_id = NFAPI_DL_CONFIG_REQUEST; + in.header.message_length = 0; + in.header.m_segment_sequence = 0xDDDD; + in.header.checksum = 0xEEEEEEEE; + + in.sfn_sf = 0x3FFF; + + in.dl_config_request_body.tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + in.dl_config_request_body.number_pdcch_ofdm_symbols = 4; + in.dl_config_request_body.number_dci = 255; + in.dl_config_request_body.number_pdu = 0; + in.dl_config_request_body.number_pdsch_rnti = 0; + in.dl_config_request_body.transmission_power_pcfich = 10000; + + in.dl_config_request_body.dl_config_pdu_list = (nfapi_dl_config_request_pdu_t*)(malloc(sizeof(nfapi_dl_config_request_pdu_t) * 12)); + + in.dl_config_request_body.dl_config_pdu_list[0].pdu_type = 0; + in.dl_config_request_body.dl_config_pdu_list[0].pdu_size = 123; + in.dl_config_request_body.dl_config_pdu_list[0].dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; + in.dl_config_request_body.dl_config_pdu_list[0].dci_dl_pdu.dci_dl_pdu_rel9.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG; + in.dl_config_request_body.dl_config_pdu_list[0].dci_dl_pdu.dci_dl_pdu_rel10.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG; + in.dl_config_request_body.dl_config_pdu_list[0].dci_dl_pdu.dci_dl_pdu_rel11.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG; + in.dl_config_request_body.dl_config_pdu_list[0].dci_dl_pdu.dci_dl_pdu_rel12.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG; + in.dl_config_request_body.dl_config_pdu_list[0].dci_dl_pdu.dci_dl_pdu_rel12.primary_cell_type = rand8(0, 2); + in.dl_config_request_body.dl_config_pdu_list[0].dci_dl_pdu.dci_dl_pdu_rel12.ul_dl_configuration_flag = rand8(0, 1); + in.dl_config_request_body.dl_config_pdu_list[0].dci_dl_pdu.dci_dl_pdu_rel12.number_ul_dl_configurations = rand8(0, 5); + for(idx = 0; idx pSuite; + int count = 0; + while(s) + { + CU_pTest t = s->pTest; + while(t) + { + count++; + t = t->pNext; + } + s = s->pNext; + } + + printf("%d..%d\n", 1, count); + + + + s = CU_get_registry()->pSuite; + count = 1; + while(s) + { + CU_pTest t = s->pTest; + while(t) + { + int pass = 1; + CU_FailureRecord* failures = CU_get_failure_list(); + while(failures) + { + if(strcmp(failures->pSuite->pName, s->pName) == 0 && + strcmp(failures->pTest->pName, t->pName) == 0) + { + pass = 0; + failures = 0; + } + else + { + failures = failures->pNext; + } + } + + if(pass) + printf("ok %d - %s:%s\n", count, s->pName, t->pName); + else + printf("not ok %d - %s:%s\n", count, s->pName, t->pName); + + count++; + t = t->pNext; + } + s = s->pNext; + } + + /* + s = CU_get_registry()->pSuite; + while(s) + { + printf("Suite %s\n", s->pName); + CU_pTest t = s->pTest; + while(t) + { + printf(" Test %s\n", t->pName); + i//CU_ErrorCode e = CU_basic_run_test(s, t); + + t = t->pNext; + } + s = s->pNext; + } + */ + + + + //printf("CU_basic_run_tests completed \n"); + //CU_basic_show_failures(CU_get_failure_list()); + //printf("CU_basic_show_failures completed\n\n"); + /* + // Run all tests using the automated interface + CU_automated_run_tests(); + CU_list_tests_to_file(); + + // Run all tests using the console interface + CU_console_run_tests(); + */ + /* Clean up registry and return */ + + + CU_cleanup_registry(); + return CU_get_error(); + +} diff --git a/nfapi/open-nFAPI/pnf/Makefile.am b/nfapi/open-nFAPI/pnf/Makefile.am new file mode 100644 index 0000000000..663d96b6dd --- /dev/null +++ b/nfapi/open-nFAPI/pnf/Makefile.am @@ -0,0 +1,32 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +AUTOMAKE_OPTIONS=subdir-objects + +AM_CPPFLAGS = -I$(top_srcdir)/pnf/inc -I$(top_srcdir)/pnf/public_inc -I$(top_srcdir)/nfapi/public_inc -I$(top_srcdir)/common/public_inc -g -Wall -Werror + + +noinst_LIBRARIES = libnfapi_pnf.a + +libnfapi_pnf_a_SOURCES = src/pnf.c\ + src/pnf_interface.c\ + src/pnf_p7.c\ + src/pnf_p7_interface.c + +LDADD = -lsctp + + + diff --git a/nfapi/open-nFAPI/pnf/inc/pnf.h b/nfapi/open-nFAPI/pnf/inc/pnf.h new file mode 100644 index 0000000000..ab38c66e09 --- /dev/null +++ b/nfapi/open-nFAPI/pnf/inc/pnf.h @@ -0,0 +1,49 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _PNF_H_ +#define _PNF_H_ + +#include "nfapi_pnf_interface.h" + +#define NFAPI_MAX_PACKED_MESSAGE_SIZE 8192 + +typedef struct { + + nfapi_pnf_config_t _public; + + int p5_sock; + uint8_t tx_message_buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; + + uint8_t sctp; + + uint8_t terminate; + +} pnf_t; + + +int pnf_connect(pnf_t *pnf); +int pnf_message_pump(pnf_t *pnf); + +int pnf_pack_and_send_p5_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len); +int pnf_pack_and_send_p4_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len); +int pnf_send_message(pnf_t* pnf, uint8_t* msg, uint32_t msg_len, uint16_t stream_id); + +nfapi_pnf_phy_config_t* nfapi_pnf_phy_config_find(nfapi_pnf_config_t* config, uint16_t phy_id); + +#endif // _PNF_H_ + diff --git a/nfapi/open-nFAPI/pnf/inc/pnf_p7.h b/nfapi/open-nFAPI/pnf/inc/pnf_p7.h new file mode 100644 index 0000000000..3f08d85e6b --- /dev/null +++ b/nfapi/open-nFAPI/pnf/inc/pnf_p7.h @@ -0,0 +1,126 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef _PNF_P7_H_ +#define _PNF_P7_H_ + +#define TIMEHR_SEC(_time_hr) ((uint32_t)(_time_hr) >> 20) +#define TIMEHR_USEC(_time_hr) ((uint32_t)(_time_hr) & 0xFFFFF) +#define TIME2TIMEHR(_time) (((uint32_t)(_time.tv_sec) & 0xFFF) << 20 | ((uint32_t)(_time.tv_usec) & 0xFFFFF)) + +#include "nfapi_pnf_interface.h" + +#define NFAPI_MAX_PACKED_MESSAGE_SIZE 8192 + +typedef struct { + uint16_t dl_conf_ontime; + uint16_t dl_conf_late; + uint16_t ul_conf_ontime; + uint16_t ul_conf_late; + uint16_t hi_dci0_ontime; + uint16_t hi_dci0_late; + uint16_t tx_ontime; + uint16_t tx_late; +} pnf_p7_stats_t; + +typedef struct { + uint8_t* buffer; + uint16_t length; +} pnf_p7_rx_message_segment_t; + +typedef struct pnf_p7_rx_message pnf_p7_rx_message_t; + +typedef struct pnf_p7_rx_message { + uint8_t sequence_number; + uint8_t num_segments_received; + uint8_t num_segments_expected; + + // the spec allows of upto 128 segments, this does seem excessive + pnf_p7_rx_message_segment_t segments[128]; + + uint32_t rx_hr_time; + + pnf_p7_rx_message_t* next; +} pnf_p7_rx_message_t; + +typedef struct { + + pnf_p7_rx_message_t* msg_queue; + +} pnf_p7_rx_reassembly_queue_t; + + +typedef struct { + + nfapi_pnf_p7_config_t _public; + + //private data + int p7_sock; + + uint8_t terminate; + + uint8_t tx_message_buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; + uint8_t* rx_message_buffer; + uint16_t rx_message_buffer_size; + + pthread_mutex_t mutex; // should we allow the client to specifiy + pthread_mutex_t pack_mutex; // should we allow the client to specifiy + + nfapi_pnf_p7_subframe_buffer_t subframe_buffer[30/*NFAPI_MAX_TIMING_WINDOW_SIZE*/]; + + uint32_t sequence_number; + uint16_t max_num_segments; + + pnf_p7_rx_reassembly_queue_t reassembly_queue; + + uint8_t* reassemby_buffer; + uint32_t reassemby_buffer_size; + + uint16_t sfn_sf; + uint32_t sf_start_time_hr; + int32_t sfn_sf_shift; + + uint8_t timing_info_period_counter; + uint8_t timing_info_aperiodic_send; // 0:false 1:true + + uint32_t timing_info_ms_counter; // number of ms since last timing info + + uint32_t dl_config_jitter; + uint32_t ul_config_jitter; + uint32_t hi_dci0_jitter; + uint32_t tx_jitter; + + uint32_t tick; + pnf_p7_stats_t stats; + +} pnf_p7_t; + +int pnf_p7_message_pump(pnf_p7_t* pnf_p7); + +int pnf_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_p7_message_header_t* msg, uint32_t msg_len); +int pnf_p7_send_message(pnf_p7_t* pnf_p7, uint8_t* msg, uint32_t msg_len); + + +int pnf_p7_subframe_ind(pnf_p7_t* config, uint16_t phy_id, uint16_t sfn_sf); + +pnf_p7_rx_message_t* pnf_p7_rx_reassembly_queue_add_segment(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, uint32_t rx_hr_time, uint16_t sequence_number, uint16_t segment_number, uint8_t m, uint8_t* data, uint16_t data_len); +void pnf_p7_rx_reassembly_queue_remove_msg(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, pnf_p7_rx_message_t* msg); +void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, uint32_t rx_hr_time, uint32_t delta); + +#endif /* _PNF_P7_H_ */ + diff --git a/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h b/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h new file mode 100644 index 0000000000..b25caf2876 --- /dev/null +++ b/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h @@ -0,0 +1,803 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _NFAPI_PNF_INTERFACE_H_ +#define _NFAPI_PNF_INTERFACE_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +#include "nfapi_interface.h" +#include "debug.h" + +#include + +/*! This enum is used to describe the states of the pnf + */ +typedef enum +{ + NFAPI_PNF_IDLE = 0, + NFAPI_PNF_CONFIGURED, + NFAPI_PNF_RUNNING +} nfapi_pnf_state_e; + +/*! This enum is used to describe the states of a phy instance of a pnf + */ +typedef enum +{ + NFAPI_PNF_PHY_IDLE = 0, + NFAPI_PNF_PHY_CONFIGURED = 1, + NFAPI_PNF_PHY_RUNNING = 2 +} nfapi_pnf_phy_state_e; + +typedef struct nfapi_pnf_phy_config nfapi_pnf_phy_config_t; + +/*! Configuration information for a pnf phy instance + */ +typedef struct nfapi_pnf_phy_config +{ + /*! The PHY id*/ + uint16_t phy_id; + + /*! The state of the PNF PHY instance*/ + nfapi_pnf_phy_state_e state; + + /*! Optional user defined data that will be passed back in the callbacks*/ + void* user_data; + + /*! Pointer for use in a linked list */ + struct nfapi_pnf_phy_config* next; +} nfapi_pnf_phy_config_t; + +typedef struct nfapi_pnf_config nfapi_pnf_config_t; + +/*! Configuration information for the pnf created by calling nfapi_pnf_create + */ +typedef struct nfapi_pnf_config +{ + /*! A user define callback to override the default memory allocation + * \param size The size of the data buffer to allocate + * \return A pointer to a data buffer + */ + void* (*malloc)(size_t size); + + /*! A user define callback to override the default memory deallocation + * \param ptr Pointer to a data buffer to be deallocated + */ + void (*free)(void* ptr); + + /*! A user define callback to handle trace from the pnf + * \param level The trace level + * \param message The trace string + * + * This is a vardic function. + */ + void (*trace)(nfapi_trace_level_t level, const char* message, ...); + + /*! The ip address of the VNF + * + */ + char* vnf_ip_addr; + + /*! The ip port of the VNF + */ + int vnf_p5_port; + + /*! The state of the PNF */ + nfapi_pnf_state_e state; + + /*! List of PHY instances configured for this PNF */ + nfapi_pnf_phy_config_t* phys; + + /*! Configuation option of the p4 p5 encode decode functions */ + nfapi_p4_p5_codec_config_t codec_config; + + /*! Optional user defined data that will be passed back in the callbacks*/ + void* user_data; + + + /*! A callback for the PNF_PARAM.request + * \param config A pointer to the pnf configuration + * \param req A data structure for the decoded PNF_PARAM.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the PNF_PARAM.response after receiving the + * PNF_PARAM.request. This can be done in the call back. + */ + int (*pnf_param_req)(nfapi_pnf_config_t* config, nfapi_pnf_param_request_t* req); + + /*! A callback for the PNF_CONFIG.request + * \param config A pointer to the pnf configuration + * \param req A data structure for the decoded PNF_CONFIG.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the PNF_CONFIG.response after receiving the + * PNF_CONFIG.request. This can be done in the call back. + */ + int (*pnf_config_req)(nfapi_pnf_config_t* config, nfapi_pnf_config_request_t* req); + + /*! A callback for the PNF_START.request + * \param config A pointer to the pnf configuration + * \param req A data structure for the decoded PNF_CONFIG.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the PNF_START.response after receiving the + * PNF_START.request. This can be done in the call back. + */ + int (*pnf_start_req)(nfapi_pnf_config_t* config, nfapi_pnf_start_request_t* req); + + /*! A callback for the PNF_STOP.request + * \param config A pointer to the pnf configuration + * \param req A data structure for the decoded PNF_STOP.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the PNF_STOP.response after receiving the + * PNF_STOP.request. This can be done in the call back. + */ + int (*pnf_stop_req)(nfapi_pnf_config_t* config, nfapi_pnf_stop_request_t* req); + + /*! A callback for the PARAM.request + * \param config A pointer to the pnf configuration + * \param phy A pointer to the pnf phy configuration + * \param req A data structure for the decoded PARAM.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the PARAM.response after receiving the + * PARAM.request. This can be done in the call back. + */ + int (*param_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_param_request_t* req); + + /*! A callback for the CONFIG.request + * \param config A pointer to the pnf configuration + * \param phy A pointer to the pnf phy configuration + * \param req A data structure for the decoded CONFIG.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the CONFIG.response after receiving the + * CONFIG.request. This can be done in the call back. + */ + int (*config_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_config_request_t* req); + + /*! A callback for the START.request + * \param config A pointer to the pnf configuration + * \param phy A pointer to the pnf phy configuration + * \param req A data structure for the decoded START.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the START.response after the client has received the + * first subframe indication from FAPI. + */ + int (*start_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_start_request_t* req); + + /*! A callback for the STOP.request + * \param config A pointer to the pnf configuration + * \param phy A pointer to the pnf phy configuration + * \param req A data structure for the decoded STOP.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the STOP.response after receiving the + * STOP.request. This can be done in the call back. + */ + int (*stop_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_stop_request_t* req); + + /*! A callback for the MEASUREMENT.request + * \param config A pointer to the pnf configuration + * \param phy A pointer to the pnf phy configuration + * \param req A data structure for the decoded MEASUREMENT.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the MEASUREMENT.response after receiving the + * MEASUREMENT.request. This can be done in the call back. + */ + int (*measurement_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_measurement_request_t* req); + + /*! A callback for the RSSI.request + * \param config A pointer to the pnf configuration + * \param phy A pointer to the pnf phy configuration + * \param req A data structure for the decoded RSSI.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the RSSI.response after receiving the + * RSSI.request. This can be done in the call back. + */ + int (*rssi_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_rssi_request_t* req); + + /*! A callback for the CELL_SEARCH.request + * \param config A pointer to the pnf configuration + * \param phy A pointer to the pnf phy configuration + * \param req A data structure for the decoded CELL_SEARCH.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the CELL_SEARCH.response after receiving the + * CELL_SEARCH.request. This can be done in the call back. + */ + int (*cell_search_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_cell_search_request_t* req); + + /*! A callback for the BROADCAST_DETECT.request + * \param config A pointer to the pnf configuration + * \param phy A pointer to the pnf phy configuration + * \param req A data structure for the decoded BROADCAST_DETECT.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the BROADCAST_DETECT.response after receiving the + * BROADCAST_DETECT.request. This can be done in the call back. + */ + int (*broadcast_detect_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_broadcast_detect_request_t* req); + + /*! A callback for the SYSTEM_INFORMATION_SCHEDULE.request + * \param config A pointer to the pnf configuration + * \param phy A pointer to the pnf phy configuration + * \param req A data structure for the decoded SYSTEM_INFORMATION_SCHEDULE.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the SYSTEM_INFORMATION_SCHEDULE.response after receiving the + * SYSTEM_INFORMATION_SCHEDULE.request. This can be done in the call back. + */ + int (*system_information_schedule_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_system_information_schedule_request_t* req); + + /*! A callback for the SYSTEM_INFORMATION.request + * \param config A pointer to the pnf configuration + * \param phy A pointer to the pnf phy configuration + * \param req A data structure for the decoded SYSTEM_INFORMATION.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the SYSTEM_INFORMATION.response after receiving the + * SYSTEM_INFORMATION.request. This can be done in the call back. + */ + int (*system_information_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_system_information_request_t* req); + + /*! A callback for the NMM_STOP.request + * \param config A pointer to the pnf configuration + * \param phy A pointer to the pnf phy configuration + * \param req A data structure for the decoded NMM_STOP.request. This will have + * been allocated on the stack + * \return not currently used + * + * The client is expected to send the NMM_STOP.response after receiving the + * NMM_STOP.request. This can be done in the call back. + */ + int (*nmm_stop_req)(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_nmm_stop_request_t* req); + + /*! A callback for any vendor extension messages recevied + * \param config A pointer to the pnf configuration + * \param msg A pointer to the decode P4/P5 message + * \return not current used + */ + int (*vendor_ext)(nfapi_pnf_config_t* config, nfapi_p4_p5_message_header_t* msg); + + /*! A callback to allocate vendor extension message + * \param message_id The message id from the decode P4/P5 message header + * \param msg_size A pointer a the size of the allocated message structure. The callee should set this + * \return A pointer to a allocated P4/P5 message structure + */ + nfapi_p4_p5_message_header_t* (*allocate_p4_p5_vendor_ext)(uint16_t message_id, uint16_t* msg_size); + + /*! A callback to deallocate vendor extension message + * \param header A pointer to an P4/P5 message structure + */ + void (*deallocate_p4_p5_vendor_ext)(nfapi_p4_p5_message_header_t* header); + + + +} nfapi_pnf_config_t; + +/*! Create a pnf configuration + * \return A pointer to a pnf configuration struture + * + * This function will create and initialize a pnf instance. It is expected that + * the client will set the callback and parameters need before calling nfapi_pnf_start + * + * 0 will be returned if it fails. + * + * \code + * nfapi_pnf_config_t* config = nfapi_pnf_config_create(void); + * \endcode + */ +nfapi_pnf_config_t* nfapi_pnf_config_create(void); + +/*! Delete a pnf configuration + * \param config A pointer to a pnf configuraiton + * \return 0 is success, -1 for failure + */ +int nfapi_pnf_config_destroy(nfapi_pnf_config_t* config); + +/*! Start the PNF library. + * \param config A pointer to the pnf configuration + * \return 0 is success, -1 for failure + * + * This function will not return until nfapi_pnf_stop is called + * + * \code + * // Create the pnf config + * nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + * + * // Assumed that the vnf_address and vnf_port are provided over the P9 interface + * config->vnf_ip_addr = vnf_address; + * config->vnf_p5_port = vnf_port; + * + * // Set the required callbacks + * config->pnf_param_req = &pnf_param_request; + * ... + * + * // Call start for the PNF to initiate a connection to the VNF + * nfai_pnf_start(config); + * + * \endcode + */ +int nfapi_pnf_start(nfapi_pnf_config_t* config); + +/*! Stop the PNF library. + * \param config A pointer to the pnf configuration + * \return 0 is success, -1 for failure + * + * This function will cause the nfapi_pnf_start function to return + */ +int nfapi_pnf_stop(nfapi_pnf_config_t* config); + +/*! Send the PNF_PARAM.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_pnf_param_response_t* resp); + +/*! Send the PNF_CONFIG.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_pnf_config_response_t* resp); + +/*! Send the PNF_START.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_pnf_start_response_t* resp); + +/*! Send the PNF_STOP.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_pnf_stop_response_t* resp); + +/*! Send the PARAM.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_param_response_t* resp); + +/*! Send the CONFIG.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_config_response_t* resp); + +/*! Send the START.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_start_response_t* resp); + +/*! Send the STOP.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_stop_response_t* resp); + +/*! Send the MEASUREMENT.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_measurement_resp(nfapi_pnf_config_t* config, nfapi_measurement_response_t* resp); + +/*! Send the RSSI.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_rssi_resp(nfapi_pnf_config_t* config, nfapi_rssi_response_t* resp); + +/*! Send the RSSI.indication + * \param config A pointer to a pnf configuraiton + * \param ind A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_rssi_ind(nfapi_pnf_config_t* config, nfapi_rssi_indication_t* ind); + +/*! Send the CELL_SEARCH.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_cell_search_resp(nfapi_pnf_config_t* config, nfapi_cell_search_response_t* resp); + +/*! Send the CELL_SEARCH.indication + * \param config A pointer to a pnf configuraiton + * \param ind A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_cell_search_ind(nfapi_pnf_config_t* config, nfapi_cell_search_indication_t* ind); + +/*! Send the BROADCAST_DETECT.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_broadcast_detect_resp(nfapi_pnf_config_t* config, nfapi_broadcast_detect_response_t* resp); + +/*! Send the BROADCAST_DETECT.indication + * \param config A pointer to a pnf configuraiton + * \param ind A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_broadcast_detect_ind(nfapi_pnf_config_t* config, nfapi_broadcast_detect_indication_t* ind); + +/*! Send the SYSTEM_INFORMATION_SCHEDULE.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_system_information_schedule_resp(nfapi_pnf_config_t* config, nfapi_system_information_schedule_response_t* resp); + +/*! Send the SYSTEM_INFORMATION_SCHEDULE.indication + * \param config A pointer to a pnf configuraiton + * \param ind A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_system_information_schedule_ind(nfapi_pnf_config_t* config, nfapi_system_information_schedule_indication_t* ind); + +/*! Send the SYSTEM_INFORMATION.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_system_information_resp(nfapi_pnf_config_t* config, nfapi_system_information_response_t* resp); + +/*! Send the SYSTEM_INFORMATION.indication + * \param config A pointer to a pnf configuraiton + * \param ind A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_system_information_ind(nfapi_pnf_config_t* config, nfapi_system_information_indication_t* ind); + +/*! Send the NMM_STOP.response + * \param config A pointer to a pnf configuraiton + * \param resp A pointer to the message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_nmm_stop_resp(nfapi_pnf_config_t* config, nfapi_nmm_stop_response_t* resp); + +/*! Send a vendor extension message + * \param config A pointer to a pnf configuraiton + * \param msg A pointer to the vendor extention message structure + * \param msg_len The size of the vendor extention message structure + * \return 0 for success, -1 for failure + * + */ +int nfapi_pnf_vendor_extension(nfapi_pnf_config_t* config, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len); + +//-------------------------- + +/*! A subframe buffer structure which can be used by the client to + * to configure the dummy information + */ +typedef struct +{ + uint16_t sfn_sf; + + nfapi_dl_config_request_t* dl_config_req; + nfapi_ul_config_request_t* ul_config_req; + nfapi_hi_dci0_request_t* hi_dci0_req; + nfapi_tx_request_t* tx_req; + nfapi_lbt_dl_config_request_t* lbt_dl_config_req; + +} nfapi_pnf_p7_subframe_buffer_t; + +typedef struct nfapi_pnf_p7_config nfapi_pnf_p7_config_t; + +/*! The nfapi PNF PHY P7 configuration information created using the nfapi_pnf_p7_create function + */ +typedef struct nfapi_pnf_p7_config +{ + /*! A user define callback to override the default memory allocation + * \param size The size of the buffer to allocate + * \return An allocated buffer. 0 in the case of failure + * + * If not set malloc will be used + */ + void* (*malloc)(size_t size); + + /*! A user define callback to override the default memory deallocation + * \param ptr Pointer to a buffer to dellocate + * + * If not set free will be used + */ + void (*free)(void* ptr); + + /*! A user define callback to handle trace from the pnf + * \param level The trace level + * \param message The message string + */ + void (*trace)(nfapi_trace_level_t level, const char* message, ...); + + /*! The PHY id*/ + uint16_t phy_id; + + // remote + /*! The VNF P7 UDP port */ + int remote_p7_port; + /*! The VNF P7 UDP address */ + char* remote_p7_addr; + + // local + /*! The PNF P7 UDP port */ + int local_p7_port; + /*! The PNF P7 UDP address */ + char* local_p7_addr; + + /*! Flag to indicate of the pnf should use the P7 checksum */ + uint8_t checksum_enabled; + + /*! The maxium size of a P7 segement. If a message is large that this it + * will be segemented */ + uint16_t segment_size; + + /*! The dummy subframe buffer structure that should be used in case there + * are no 'valid' subframe messages */ + nfapi_pnf_p7_subframe_buffer_t dummy_subframe; + + /*! Configuration options for the p7 pack unpack functions*/ + nfapi_p7_codec_config_t codec_config; + + /*! Optional userdata that will be passed back in the callbacks*/ + void* user_data; + + // tdb : if these should be public + uint16_t subframe_buffer_size; + uint8_t timing_info_mode_periodic; // 0:false 1:true + uint8_t timing_info_mode_aperiodic; // 0:false 1:true + uint8_t timing_info_period; // 1..225 in subframes + + /*! A callback for the DL_CONFIG.request + * \param config A poiner to the PNF P7 config + * \param req A pointer to the dl config request message structure + * \return not currently used + */ + int (*dl_config_req)(nfapi_pnf_p7_config_t* config, nfapi_dl_config_request_t* req); + + /*! A callback for the UL_CONFIG.request + * \param config A poiner to the PNF P7 config + * \param req A pointer to the ul config request message structure + * \return not currently used + */ + int (*ul_config_req)(nfapi_pnf_p7_config_t* config, nfapi_ul_config_request_t* req); + + /*! A callback for the HI_DCI0.request + * \param config A poiner to the PNF P7 config + * \param req A pointer to the hi dci0 request message structure + * \return not currently used + */ + int (*hi_dci0_req)(nfapi_pnf_p7_config_t* config, nfapi_hi_dci0_request_t* req); + + /*! A callback for the TX_REQ.request + * \param config A poiner to the PNF P7 config + * \param req A pointer to the tx request message structure + * \return not currently used + * + * The TX request contains pointers to the downlink PDUs to be sent. In the case that the FAPI interface + * will 'keep' the pointers until they are transmitted the callee should set the pointers in the req to 0 + * and then use the p7 codec config free function to release the pdu's when appropriate. + */ + int (*tx_req)(nfapi_pnf_p7_config_t* config, nfapi_tx_request_t* req); + + /*! A callback for the LBT_DL_CONFIG.request + * \param config A poiner to the PNF P7 config + * \param req A pointer to the lbt dl request message structure + * \return not currently used + */ + int (*lbt_dl_config_req)(nfapi_pnf_p7_config_t* config, nfapi_lbt_dl_config_request_t* req); + + /*! A callback for vendor extension messages + * \param config A poiner to the PNF P7 config + * \param msg A pointer to a decode vendor extention message + * \return not currently used + */ + int (*vendor_ext)(nfapi_pnf_p7_config_t* config, nfapi_p7_message_header_t* msg); + + /*! A callback to allocate vendor extension message + * \param message_id The vendor extention message id from the decode message header + * \param msg_size A pointer to size of the allocate vendor extention message. Set by the callee + * \return A pointer to an allocated vendor extention message structure. 0 if failed + * + * + */ + nfapi_p7_message_header_t* (*allocate_p7_vendor_ext)(uint16_t message_id, uint16_t* msg_size); + + /*! A callback to deallocate vendor extension message + * \param header A pointer to a p7 vendor extention message + */ + void (*deallocate_p7_vendor_ext)(nfapi_p7_message_header_t* header); + + + +} nfapi_pnf_p7_config_t; + +/*! Create and initialise a nfapi_pnf_p7_config structure + * \return A pointer to a PNF P7 config structure + */ +nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create(void); + +/*! Delete an nfapi_pnf_p7_config structure + * \param config + */ +int nfapi_pnf_p7_config_destroy(nfapi_pnf_p7_config_t* config); + + +/*! Start the PNF P7 library. + * \param config A pointer to a PNF P7 config + * \return 0 means success, -1 means failure + * + * This function will not return until nfapi_pnf_p7_stop is called. + */ +int nfapi_pnf_p7_start(nfapi_pnf_p7_config_t* config); + +/*! Stop the PNF P7 library. + * \param config A pointer to a PNF P7 config + * \return 0 means success, -1 means failure + * + * This function will cause the nfapi_pnf_p7_start to return + */ +int nfapi_pnf_p7_stop(nfapi_pnf_p7_config_t* config); + +/*! Subframe indication + * \param config A pointer to a PNF P7 config + * \param phy_id The phy_id for the phy instance + * \param sfn_sf The SFN and SF in the format of FAPI + * \return 0 means success, -1 means failure + * + * The client should call the subframe indication every 1ms. The PNF will + * respond by invoking the pnf p7 subframe callbacks with the messages from the subframe buffer + * + * If messages are not in the subframe buffer, they dummy subframe messages will be sent + */ +int nfapi_pnf_p7_subframe_ind(nfapi_pnf_p7_config_t* config, uint16_t phy_id, uint16_t sfn_sf); + +/*! Send the HARQ.indication + * \param config A pointer to a PNF P7 config + * \param ind A pointer to the harq indication message structure + * \return 0 means success, -1 means failure + */ +int nfapi_pnf_p7_harq_ind(nfapi_pnf_p7_config_t* config, nfapi_harq_indication_t* ind); + +/*! Send the CRC.indication + * \param config A pointer to a PNF P7 config + * \param ind A pointer to the crc indication message structure + * \return 0 means success, -1 means failure + */ +int nfapi_pnf_p7_crc_ind(nfapi_pnf_p7_config_t* config, nfapi_crc_indication_t* ind); + +/*! Send the RX.indication + * \param config A pointer to a PNF P7 config + * \param ind A pointer to the rx indication message structure + * \return 0 means success, -1 means failure + */ +int nfapi_pnf_p7_rx_ind(nfapi_pnf_p7_config_t* config, nfapi_rx_indication_t* ind); + +/*! Send the RACH.indication + * \param config A pointer to a PNF P7 config + * \param ind A pointer to the rach indication message structure + * \return 0 means success, -1 means failure + */ +int nfapi_pnf_p7_rach_ind(nfapi_pnf_p7_config_t* config, nfapi_rach_indication_t* ind); + +/*! Send the SRS.indication + * \param config A pointer to a PNF P7 config + * \param ind A pointer to the srs indication message structure + * \return 0 means success, -1 means failure + */ +int nfapi_pnf_p7_srs_ind(nfapi_pnf_p7_config_t* config, nfapi_srs_indication_t* ind); + +/*! Send the SR.indication + * \param config A pointer to a PNF P7 config + * \param ind A pointer to the sr indication message structure + * \return 0 means success, -1 means failure + */ +int nfapi_pnf_p7_sr_ind(nfapi_pnf_p7_config_t* config, nfapi_sr_indication_t* ind); + +/*! Send the CQI.indication + * \param config A pointer to a PNF P7 config + * \param ind A pointer to the cqi indication message structure + * \return 0 means success, -1 means failure + */ +int nfapi_pnf_p7_cqi_ind(nfapi_pnf_p7_config_t* config, nfapi_cqi_indication_t* ind); + +/*! Send the LBT_DL.indication + * \param config A pointer to a PNF P7 config + * \param ind A pointer to the lbt dl indication message structure + * \return 0 means success, -1 means failure + */ +int nfapi_pnf_p7_lbt_dl_ind(nfapi_pnf_p7_config_t* config, nfapi_lbt_dl_indication_t* ind); + +/*! Send the NB_HARQ.indication + * \param config A pointer to a PNF P7 config + * \param ind A pointer to the lbt dl indication message structure + * \return 0 means success, -1 means failure + */ +int nfapi_pnf_p7_nb_harq_ind(nfapi_pnf_p7_config_t* config, nfapi_nb_harq_indication_t* ind); + +/*! Send the NRACH.indication + * \param config A pointer to a PNF P7 config + * \param ind A pointer to the lbt dl indication message structure + * \return 0 means success, -1 means failure + */ +int nfapi_pnf_p7_nrach_ind(nfapi_pnf_p7_config_t* config, nfapi_nrach_indication_t* ind); + + +/*! Send a vendor exntesion message + * \param config A pointer to a PNF P7 config + * \param msg A pointer to the lbt dl indication message structure + * \return 0 means success, -1 means failure + */ +int nfapi_pnf_p7_vendor_extension(nfapi_pnf_p7_config_t* config, nfapi_p7_message_header_t* msg); + +#if defined(__cplusplus) +} +#endif + +#endif // _NFAPI_PNF_INTERFACE_H_ diff --git a/nfapi/open-nFAPI/pnf/src/pnf.c b/nfapi/open-nFAPI/pnf/src/pnf.c new file mode 100644 index 0000000000..d0a7fa6fd1 --- /dev/null +++ b/nfapi/open-nFAPI/pnf/src/pnf.c @@ -0,0 +1,1598 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pnf.h" + +#define MAX_SCTP_STREAMS 16 + +void nfapi_pnf_phy_config_delete_all(nfapi_pnf_config_t* config) +{ + nfapi_pnf_phy_config_t* curr = config->phys; + while(curr != 0) + { + nfapi_pnf_phy_config_t* to_delete = curr; + curr = curr->next; + free(to_delete); + } + + config->phys = 0; +} + +void nfapi_pnf_phy_config_add(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy) +{ + phy->next = config->phys; + config->phys = phy; +} + +nfapi_pnf_phy_config_t* nfapi_pnf_phy_config_find(nfapi_pnf_config_t* config, uint16_t phy_id) +{ + nfapi_pnf_phy_config_t* curr = config->phys; + while(curr != 0) + { + if(curr->phy_id == phy_id) + return curr; + + curr = curr->next; + } + return 0; +} + +void pnf_handle_pnf_param_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + // ensure it's valid + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_pnf_param_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF_PARAM.request received\n"); + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(nfapi_pnf_param_request_t), &pnf->_public.codec_config) >= 0) + { + if(pnf->_public.state == NFAPI_PNF_IDLE) + { + if(pnf->_public.pnf_param_req) + { + (pnf->_public.pnf_param_req)(&pnf->_public, &req); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: PNF not in IDLE state\n", __FUNCTION__); + + nfapi_pnf_param_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_PARAM_RESPONSE; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_pnf_param_resp(&pnf->_public, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + } +} + +void pnf_handle_pnf_config_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + + + // ensure it's valid + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_pnf_config_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF_CONFIG.request received\n"); + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &pnf->_public.codec_config) >= 0) + { + // ensure correct state + if(pnf->_public.state != NFAPI_PNF_RUNNING) + { + // delete the phy records + nfapi_pnf_phy_config_delete_all(&pnf->_public); + + // create the phy records + if (req.pnf_phy_rf_config.tl.tag == NFAPI_PNF_PHY_RF_TAG) + { + int i = 0; + for(i = 0; i < req.pnf_phy_rf_config.number_phy_rf_config_info; ++i) + { + nfapi_pnf_phy_config_t* phy = (nfapi_pnf_phy_config_t*)malloc(sizeof(nfapi_pnf_phy_config_t)); + memset(phy, 0, sizeof(nfapi_pnf_phy_config_t)); + + phy->state = NFAPI_PNF_PHY_IDLE; + phy->phy_id = req.pnf_phy_rf_config.phy_rf_config[i].phy_id; + + nfapi_pnf_phy_config_add(&(pnf->_public), phy); + } + } + + if(pnf->_public.pnf_config_req) + { + (pnf->_public.pnf_config_req)(&(pnf->_public), &req); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: PNF not in correct state: %d\n", __FUNCTION__, pnf->_public.state); + + nfapi_pnf_config_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_CONFIG_RESPONSE; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_pnf_config_resp(&(pnf->_public), &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + } +} + +void pnf_handle_pnf_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + // ensure it's valid + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_pnf_start_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF_START.request Received\n"); + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &pnf->_public.codec_config) >= 0) + { + if(pnf->_public.state == NFAPI_PNF_CONFIGURED) + { + if(pnf->_public.pnf_start_req) + { + (pnf->_public.pnf_start_req)(&(pnf->_public), &req); + } + } + else + { + nfapi_pnf_start_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_START_RESPONSE; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_pnf_start_resp(&(pnf->_public), &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + } +} + +void pnf_handle_pnf_stop_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + // ensure it's valid + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_pnf_stop_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF_STOP.request Received\n"); + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &pnf->_public.codec_config) >= 0) + { + if(pnf->_public.state == NFAPI_PNF_RUNNING) + { + if(pnf->_public.pnf_stop_req) + { + (pnf->_public.pnf_stop_req)(&(pnf->_public), &req); + } + } + else + { + nfapi_pnf_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_STOP_RESPONSE; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_pnf_stop_resp(&(pnf->_public), &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + } +} + +void pnf_handle_param_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + // ensure it's valid + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_param_request_t req; + + nfapi_pnf_config_t* config = &(pnf->_public); + + NFAPI_TRACE(NFAPI_TRACE_INFO, "PARAM.request received\n"); + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { + if(config->state == NFAPI_PNF_RUNNING) + { + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id); + if(phy) + { + if(phy->state == NFAPI_PNF_PHY_IDLE) + { + if(config->param_req) + { + (config->param_req)(config, phy, &req); + } + } + else + { + nfapi_param_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PARAM_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_param_resp(config, &resp); + } + } + else + { + nfapi_param_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PARAM_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_CONFIG; + nfapi_pnf_param_resp(config, &resp); + } + + } + else + { + nfapi_param_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PARAM_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_param_resp(config, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + + } +} + +void pnf_handle_config_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + + // ensure it's valid + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_config_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "CONFIG.request received\n"); + + nfapi_pnf_config_t* config = &(pnf->_public); + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { + if(config->state == NFAPI_PNF_RUNNING) + { + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id); + if(phy) + { + if(phy->state != NFAPI_PNF_PHY_RUNNING) + { + if(config->config_req) + { + (config->config_req)(config, phy, &req); + } + } + else + { + nfapi_config_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_CONFIG_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_config_resp(config, &resp); + } + } + else + { + nfapi_config_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_CONFIG_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_CONFIG; + nfapi_pnf_config_resp(config, &resp); + } + } + else + { + nfapi_config_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_CONFIG_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_config_resp(config, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + } +} + +void pnf_handle_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + // ensure it's valid + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_start_request_t req; + + nfapi_pnf_config_t* config = &(pnf->_public); + + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() START.request received state:%d\n", __FUNCTION__, config->state); + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { + if(config->state == NFAPI_PNF_RUNNING) + { + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id); + if(phy) + { + if(phy->state != NFAPI_PNF_PHY_RUNNING) + { + if(config->start_req) + { + (config->start_req)(config, phy, &req); + } + } + else + { + nfapi_start_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_START_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_start_resp(config, &resp); + } + } + else + { + nfapi_start_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_START_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_CONFIG; + nfapi_pnf_start_resp(config, &resp); + } + } + else + { + nfapi_start_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_START_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_start_resp(config, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + + } +} + +void pnf_handle_stop_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + // ensure it's valid + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_stop_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "STOP.request received\n"); + + nfapi_pnf_config_t* config = &(pnf->_public); + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { + if(config->state == NFAPI_PNF_RUNNING) + { + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id); + if(phy) + { + if(phy->state != NFAPI_PNF_PHY_RUNNING) + { + if(config->stop_req) + { + (config->stop_req)(config, phy, &req); + } + } + else + { + nfapi_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_STOP_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_stop_resp(config, &resp); + } + } + else + { + nfapi_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_STOP_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_CONFIG; + nfapi_pnf_stop_resp(config, &resp); + } + } + else + { + nfapi_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_STOP_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_stop_resp(config, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + + } +} + +void pnf_handle_measurement_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + // ensure it's valid + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_measurement_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "MEASUREMENT.request received\n"); + + nfapi_pnf_config_t* config = &(pnf->_public); + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { + if(config->state == NFAPI_PNF_RUNNING) + { + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id); + if(phy) + { + if(phy->state != NFAPI_PNF_PHY_RUNNING) + { + if(config->measurement_req) + { + (config->measurement_req)(config, phy, &req); + } + } + else + { + nfapi_measurement_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_MEASUREMENT_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_measurement_resp(config, &resp); + } + } + else + { + nfapi_measurement_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_MEASUREMENT_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_CONFIG; + nfapi_pnf_measurement_resp(config, &resp); + } + } + else + { + nfapi_measurement_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_MEASUREMENT_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_measurement_resp(config, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + } +} + +void pnf_handle_rssi_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + + + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_rssi_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "RSSI.request received\n"); + + nfapi_pnf_config_t* config = &(pnf->_public); + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { + if(config->state == NFAPI_PNF_RUNNING) + { + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id); + if(phy) + { + if(phy->state == NFAPI_PNF_PHY_RUNNING) + { + if(config->rssi_req) + { + (config->rssi_req)(config, phy, &req); + } + } + else + { + nfapi_rssi_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_RSSI_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_rssi_resp(config, &resp); + } + } + else + { + nfapi_rssi_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_RSSI_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_CONFIG; + nfapi_pnf_rssi_resp(config, &resp); + } + } + else + { + nfapi_rssi_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_RSSI_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_rssi_resp(config, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + + } +} + +void pnf_handle_cell_search_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_cell_search_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "CELL_SEARCH.request received\n"); + + nfapi_pnf_config_t* config = &(pnf->_public); + + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { + if(config->state == NFAPI_PNF_RUNNING) + { + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id); + if(phy) + { + if(phy->state == NFAPI_PNF_PHY_RUNNING) + { + if(config->cell_search_req) + { + (config->cell_search_req)(config, phy, &req); + } + } + else + { + nfapi_cell_search_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_CELL_SEARCH_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_cell_search_resp(config, &resp); + } + } + else + { + nfapi_cell_search_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_CELL_SEARCH_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_CONFIG; + nfapi_pnf_cell_search_resp(config, &resp); + } + } + else + { + nfapi_cell_search_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_CELL_SEARCH_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_cell_search_resp(config, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + } + +} + +void pnf_handle_broadcast_detect_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_broadcast_detect_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "BROADCAST_DETECT.request received\n"); + + nfapi_pnf_config_t* config = &(pnf->_public); + + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { + if(config->state == NFAPI_PNF_RUNNING) + { + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id); + if(phy) + { + if(phy->state == NFAPI_PNF_PHY_RUNNING) + { + if(config->broadcast_detect_req) + { + (config->broadcast_detect_req)(config, phy, &req); + } + } + else + { + nfapi_broadcast_detect_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_BROADCAST_DETECT_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_broadcast_detect_resp(config, &resp); + } + } + else + { + nfapi_broadcast_detect_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_BROADCAST_DETECT_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_CONFIG; + nfapi_pnf_broadcast_detect_resp(config, &resp); + } + } + else + { + nfapi_broadcast_detect_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_BROADCAST_DETECT_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_broadcast_detect_resp(config, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + + } +} + +void pnf_handle_system_information_schedule_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_system_information_schedule_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "SYSTEM_INFORMATION_SCHEDULE.request received\n"); + + nfapi_pnf_config_t* config = &(pnf->_public); + + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { + if(config->state == NFAPI_PNF_RUNNING) + { + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id); + if(phy) + { + if(phy->state == NFAPI_PNF_PHY_RUNNING) + { + if(config->system_information_schedule_req) + { + (config->system_information_schedule_req)(config, phy, &req); + } + } + else + { + nfapi_system_information_schedule_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_system_information_schedule_resp(config, &resp); + } + } + else + { + nfapi_system_information_schedule_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_CONFIG; + nfapi_pnf_system_information_schedule_resp(config, &resp); + } + } + else + { + nfapi_system_information_schedule_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_system_information_schedule_resp(config, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + } +} + +void pnf_handle_system_information_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_system_information_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "SYSTEM_INFORMATION.request received\n"); + + nfapi_pnf_config_t* config = &(pnf->_public); + + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { + if(config->state == NFAPI_PNF_RUNNING) + { + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id); + if(phy) + { + if(phy->state == NFAPI_PNF_PHY_RUNNING) + { + if(config->system_information_req) + { + (config->system_information_req)(config, phy, &req); + } + } + else + { + nfapi_system_information_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_SYSTEM_INFORMATION_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_system_information_resp(config, &resp); + } + } + else + { + nfapi_system_information_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_SYSTEM_INFORMATION_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_CONFIG; + nfapi_pnf_system_information_resp(config, &resp); + } + } + else + { + nfapi_system_information_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_SYSTEM_INFORMATION_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_system_information_resp(config, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + } + +} + +void pnf_handle_nmm_stop_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_nmm_stop_request_t req; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "NMM_STOP.request received\n"); + + nfapi_pnf_config_t* config = &(pnf->_public); + + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { + if(config->state == NFAPI_PNF_RUNNING) + { + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, req.header.phy_id); + if(phy) + { + if(phy->state != NFAPI_PNF_PHY_RUNNING) + { + if(config->nmm_stop_req) + { + (config->nmm_stop_req)(config, phy, &req); + } + } + else + { + nfapi_nmm_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_NMM_STOP_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_nmm_stop_resp(config, &resp); + } + } + else + { + nfapi_nmm_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_NMM_STOP_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_CONFIG; + nfapi_pnf_nmm_stop_resp(config, &resp); + } + } + else + { + nfapi_nmm_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_NMM_STOP_RESPONSE; + resp.header.phy_id = req.header.phy_id; + resp.error_code = NFAPI_MSG_INVALID_STATE; + nfapi_pnf_nmm_stop_resp(config, &resp); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(req.vendor_extension) + pnf->_public.codec_config.deallocate(req.vendor_extension); + } +} + + +void pnf_handle_vendor_extension(void* pRecvMsg, int recvMsgLen, pnf_t* pnf, uint16_t message_id) +{ + if (pRecvMsg == NULL || pnf == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_pnf_config_t* config = &(pnf->_public); + + if(config->allocate_p4_p5_vendor_ext) + { + uint16_t msg_size; + nfapi_p4_p5_message_header_t* msg = config->allocate_p4_p5_vendor_ext(message_id, &msg_size); + + if(msg == 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to allocate vendor extention structure\n"); + return; + } + + + int unpack_result = nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, msg, msg_size, &config->codec_config); + + if(unpack_result == 0) + { + if(config->vendor_ext) + config->vendor_ext(config, msg); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + if(config->deallocate_p4_p5_vendor_ext) + config->deallocate_p4_p5_vendor_ext(msg); + + } + } +} + + + +void pnf_handle_p5_message(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) +{ + nfapi_p4_p5_message_header_t messageHeader; + + // validate the input params + if(pRecvMsg == NULL || recvMsgLen < NFAPI_HEADER_LENGTH) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return; + } + + // unpack the message header + if (nfapi_p5_message_header_unpack(pRecvMsg, recvMsgLen, &messageHeader, sizeof(nfapi_p4_p5_message_header_t), &pnf->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unpack message header failed, ignoring\n"); + return; + } + + switch (messageHeader.message_id) + { + case NFAPI_PNF_PARAM_REQUEST: + pnf_handle_pnf_param_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_PNF_CONFIG_REQUEST: + pnf_handle_pnf_config_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_PNF_START_REQUEST: + pnf_handle_pnf_start_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_PNF_STOP_REQUEST: + pnf_handle_pnf_stop_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_PARAM_REQUEST: + pnf_handle_param_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_CONFIG_REQUEST: + pnf_handle_config_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_START_REQUEST: + pnf_handle_start_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_STOP_REQUEST: + pnf_handle_stop_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_MEASUREMENT_REQUEST: + pnf_handle_measurement_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_RSSI_REQUEST: + pnf_handle_rssi_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_CELL_SEARCH_REQUEST: + pnf_handle_cell_search_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_BROADCAST_DETECT_REQUEST: + pnf_handle_broadcast_detect_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST: + pnf_handle_system_information_schedule_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_SYSTEM_INFORMATION_REQUEST: + pnf_handle_system_information_request(pnf, pRecvMsg, recvMsgLen); + break; + + case NFAPI_NMM_STOP_REQUEST: + pnf_handle_nmm_stop_request(pnf, pRecvMsg, recvMsgLen); + break; + + default: + { + if(messageHeader.message_id >= NFAPI_VENDOR_EXT_MSG_MIN && + messageHeader.message_id <= NFAPI_VENDOR_EXT_MSG_MAX) + { + pnf_handle_vendor_extension(pRecvMsg, recvMsgLen, pnf, messageHeader.message_id); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s P5 Unknown message ID %d\n", __FUNCTION__, messageHeader.message_id); + } + } + break; + } +} + +int pnf_pack_and_send_p5_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len) +{ + int packed_len = nfapi_p5_message_pack(msg, msg_len, + pnf->tx_message_buffer, + sizeof(pnf->tx_message_buffer), + &pnf->_public.codec_config); + + if (packed_len < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi_p5_message_pack failed (%d)\n", packed_len); + return -1; + } + + return pnf_send_message(pnf, pnf->tx_message_buffer, packed_len, 0/*msg->stream_id*/); +} + +int pnf_pack_and_send_p4_message(pnf_t* pnf, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len) +{ + int packed_len = nfapi_p4_message_pack(msg, msg_len, + pnf->tx_message_buffer, + sizeof(pnf->tx_message_buffer), + &pnf->_public.codec_config); + + if (packed_len < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi_p4_message_pack failed (%d)\n", packed_len); + return -1; + } + + return pnf_send_message(pnf, pnf->tx_message_buffer, packed_len, 0/*msg->stream_id*/); +} + + + +int pnf_connect(pnf_t* pnf) +{ + struct sockaddr_in servaddr; + uint8_t socketConnected = 0; + + if(pnf->_public.vnf_ip_addr == 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "vnfIpAddress is null\n"); + return -1; + } + + + (void)memset(&servaddr, 0, sizeof(struct sockaddr_in)); + + NFAPI_TRACE(NFAPI_TRACE_INFO, "Starting P5 PNF connection to VNF at %s:%u\n", pnf->_public.vnf_ip_addr, pnf->_public.vnf_p5_port); + + // todo split the vnf address list. currently only supporting 1 + + struct addrinfo hints, *servinfo; + memset(&hints, 0, sizeof(hints)); + + hints.ai_socktype = SOCK_STREAM; // For SCTP we are only interested in SOCK_STREAM + // todo : allow the client to restrict IPV4 or IPV6 + // todo : randomize which address to connect to? + + char port_str[8]; + snprintf(port_str, sizeof(port_str), "%d", pnf->_public.vnf_p5_port); + if(getaddrinfo(pnf->_public.vnf_ip_addr, port_str, &hints, &servinfo) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to get host (%s) addr info h_errno:%d \n", pnf->_public.vnf_ip_addr, h_errno); + return -1; + } + + struct addrinfo *p = servinfo; + int i = 0; + int connected = 0; + + while(p != NULL && connected == 0) + { + char* family = "Unknown"; + char* address = "Unknown"; + char _addr[128]; + + if(p->ai_family == AF_INET6) + { + family = "IPV6"; + struct sockaddr_in6* addr = (struct sockaddr_in6*)p->ai_addr; + inet_ntop(AF_INET6, &addr->sin6_addr, _addr, sizeof(_addr)); + address = &_addr[0]; + } + else if(p->ai_family == AF_INET) + { + family = "IPV4"; + struct sockaddr_in* addr = (struct sockaddr_in*)p->ai_addr; + address = inet_ntoa(addr->sin_addr); + } + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "Host address info %d Family:%s Address:%s\n", i++, family, address); + + if (pnf->sctp) + { + // open the SCTP socket + if ((pnf->p5_sock = socket(p->ai_family, SOCK_STREAM, IPPROTO_SCTP)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After P5 socket errno: %d\n", errno); + freeaddrinfo(servinfo); + return -1; + } + int noDelay; + struct sctp_initmsg initMsg; + + (void)memset(&initMsg, 0, sizeof(struct sctp_initmsg)); + + // configure the socket options + NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF Setting the SCTP_INITMSG\n"); + initMsg.sinit_num_ostreams = 5; //MAX_SCTP_STREAMS; // number of output streams can be greater + initMsg.sinit_max_instreams = 5; //MAX_SCTP_STREAMS; // number of output streams can be greater + if (setsockopt(pnf->p5_sock, IPPROTO_SCTP, SCTP_INITMSG, &initMsg, sizeof(initMsg)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt errno: %d\n", errno); + freeaddrinfo(servinfo); + return -1; + } + noDelay = 1; + if (setsockopt(pnf->p5_sock, IPPROTO_SCTP, SCTP_NODELAY, &noDelay, sizeof(noDelay)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt errno: %d\n", errno); + freeaddrinfo(servinfo); + return -1; + + } + + struct sctp_event_subscribe events; + memset( (void *)&events, 0, sizeof(events) ); + events.sctp_data_io_event = 1; + + if(setsockopt(pnf->p5_sock, SOL_SCTP, SCTP_EVENTS, (const void *)&events, sizeof(events)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt errno: %d\n", errno); + freeaddrinfo(servinfo); + return -1; + } + } + else + { + // Create an IP socket point + if ((pnf->p5_sock = socket(p->ai_family, SOCK_STREAM, IPPROTO_IP)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After P5 socket errno: %d\n", errno); + freeaddrinfo(servinfo); + return -1; + } + } + + NFAPI_TRACE(NFAPI_TRACE_INFO, "P5 socket created...\n"); + + if (connect(pnf->p5_sock, p->ai_addr, p->ai_addrlen ) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After connect (address:%s port:%d) errno: %d\n", + pnf->_public.vnf_ip_addr, pnf->_public.vnf_p5_port, errno); + + if(errno == EINVAL) + { + freeaddrinfo(servinfo); + return -1; + } + else + { + if(pnf->terminate != 0) + { + freeaddrinfo(servinfo); + return 0; + } + else + { + close(pnf->p5_sock); + sleep(1); + } + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "connect succeeded...\n"); + + connected = 1; + } + + p = p->ai_next; + } + + freeaddrinfo(servinfo); + + // If we have failed to connect return 0 and it is retry + if(connected == 0) + return 0; + + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "After connect loop\n"); + if (pnf->sctp) + { + socklen_t optLen; + struct sctp_status status; + + (void)memset(&status, 0, sizeof(struct sctp_status)); + + // check the connection status + optLen = (socklen_t) sizeof(struct sctp_status); + if (getsockopt(pnf->p5_sock, IPPROTO_SCTP, SCTP_STATUS, &status, &optLen) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After getsockopt errno: %d\n", errno); + return -1; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Association ID = %d\n", status.sstat_assoc_id); + NFAPI_TRACE(NFAPI_TRACE_INFO, "Receiver window size = %d\n", status.sstat_rwnd); + NFAPI_TRACE(NFAPI_TRACE_INFO, "In Streams = %d\n", status.sstat_instrms); + NFAPI_TRACE(NFAPI_TRACE_INFO, "Out Streams = %d\n", status.sstat_outstrms); + + socketConnected = 1; + } + } + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "Socket %s\n", socketConnected ? "CONNECTED" : "NOT_CONNECTED"); + return socketConnected; +} + +int pnf_send_message(pnf_t* pnf, uint8_t *msg, uint32_t len, uint16_t stream) +{ + if (pnf->sctp) + { + if (sctp_sendmsg(pnf->p5_sock, msg, len, NULL, 0, 42/*config->sctp_stream_number*/, 0, stream/*P5_STREAM_ID*/, 0, 0) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "sctp_sendmsg failed errno: %d\n", errno); + return -1; + } + } + else + { + if (write(pnf->p5_sock, msg, len) != len) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "read failed errno: %d\n", errno); + return -1; + } + } + return 0; +} + + +int pnf_read_dispatch_message(pnf_t* pnf) +{ + int socket_connected = 1; + + // 1. Peek the message header + // 2. If the message is larger than the stack buffer then create a dynamic buffer + // 3. Read the buffer + // 4. Handle the p5 message + + uint32_t header_buffer_size = NFAPI_HEADER_LENGTH; + uint8_t header_buffer[header_buffer_size]; + + uint32_t stack_buffer_size = 32; //should it be the size of then sctp_notificatoin structure + uint8_t stack_buffer[stack_buffer_size]; + + uint8_t* dynamic_buffer = 0; + + uint8_t* read_buffer = &stack_buffer[0]; + uint32_t message_size = 0; + + struct sockaddr_in addr; + socklen_t addr_len = sizeof(addr); + + struct sctp_sndrcvinfo sndrcvinfo; + (void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo)); + + { + int flags = MSG_PEEK; + message_size = sctp_recvmsg(pnf->p5_sock, header_buffer, header_buffer_size, /*(struct sockaddr*)&addr, &addr_len*/ 0, 0, &sndrcvinfo, &flags); + + if(message_size == -1) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF Failed to peek sctp message size errno:%d\n", errno); + return 0; + } + + nfapi_p4_p5_message_header_t header; + int unpack_result = nfapi_p5_message_header_unpack(header_buffer, header_buffer_size, &header, sizeof(header), 0); + if(unpack_result < 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF Failed to unpack p5 message header\n"); + return 0; + } + message_size = header.message_length; + + // now have the size of the mesage + } + + if(message_size > stack_buffer_size) + { + dynamic_buffer = (uint8_t*)malloc(message_size); + + if(dynamic_buffer == NULL) + { + // todo : add error mesage + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF Failed to allocate dynamic buffer for sctp_recvmsg size:%d\n", message_size); + return -1; + } + + read_buffer = dynamic_buffer; + } + + { + int flags = 0; + (void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo)); + + int recvmsg_result = sctp_recvmsg(pnf->p5_sock, read_buffer, message_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags); + if(recvmsg_result == -1) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Failed to read sctp message size errno:%d\n", errno); + } + else + { + if (flags & MSG_NOTIFICATION) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Notification received from %s:%u\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); + + // todo - handle the events + } + else + { + /* + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received message fd:%d from %s:%u assoc:%d on stream %d, PPID %d, length %d, flags 0x%x\n", + pnf->p5_sock, + inet_ntoa(addr.sin_addr), + ntohs(addr.sin_port), + sndrcvinfo.sinfo_assoc_id, + sndrcvinfo.sinfo_stream, + ntohl(sndrcvinfo.sinfo_ppid), + message_size, + flags); + */ + + // handle now if complete message in one or more segments + if ((flags & 0x80) == 0x80) + { + pnf_handle_p5_message(pnf, read_buffer, message_size); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "sctp_recvmsg: unhandled mode with flags 0x%x\n", flags); + + // assume socket disconnected + NFAPI_TRACE(NFAPI_TRACE_WARN, "Disconnected socket\n"); + socket_connected = 0; + } + + + } + } + } + + if(dynamic_buffer) + { + free(dynamic_buffer); + } + + return socket_connected; + + +} + + +int pnf_message_pump(pnf_t* pnf) +{ + uint8_t socketConnected = 1; + + while(socketConnected && pnf->terminate == 0) + { + fd_set rfds; + int selectRetval = 0; + + // select on a timeout and then get the message + FD_ZERO(&rfds); + FD_SET(pnf->p5_sock, &rfds); + + struct timeval timeout; + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + selectRetval = select(pnf->p5_sock+1, &rfds, NULL, NULL, &timeout); + + if(selectRetval == 0) + { + // timeout + continue; + } + else if (selectRetval == -1 && (errno == EINTR)) + { + // interrupted by signal + NFAPI_TRACE(NFAPI_TRACE_WARN, "P5 Signal Interrupt %d\n", errno); + continue; + } + else if (selectRetval == -1) + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "P5 select() failed\n"); + sleep(1); + continue; + } + + if(FD_ISSET(pnf->p5_sock, &rfds)) + { + socketConnected = pnf_read_dispatch_message(pnf); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "Why are we here\n"); + } + } + + // Drop back to idle if we have lost connection + pnf->_public.state = NFAPI_PNF_PHY_IDLE; + + + // close the connection and socket + if (close(pnf->p5_sock) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "close(sctpSock) failed errno: %d\n", errno); + } + + return 0; + +} + diff --git a/nfapi/open-nFAPI/pnf/src/pnf_interface.c b/nfapi/open-nFAPI/pnf/src/pnf_interface.c new file mode 100644 index 0000000000..7310fc0c66 --- /dev/null +++ b/nfapi/open-nFAPI/pnf/src/pnf_interface.c @@ -0,0 +1,432 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "pnf.h" +#include +#include +#include + +nfapi_pnf_config_t* nfapi_pnf_config_create() +{ + pnf_t* _this = (pnf_t*)malloc(sizeof(pnf_t)); + + if(_this == 0) + return 0; + + memset(_this, 0, sizeof(pnf_t)); + + _this->sctp = 1; // enable sctp + + _this->_public.vnf_p5_port = NFAPI_P5_SCTP_PORT; + + _this->_public.malloc = &malloc; + _this->_public.free = &free; + + _this->_public.codec_config.allocate = &malloc; + _this->_public.codec_config.deallocate = &free; + + return &(_this->_public); +} + +void nfapi_pnf_config_destory(nfapi_pnf_config_t* config) +{ + free(config); +} + +int nfapi_pnf_start(nfapi_pnf_config_t* config) +{ + // Verify that config is not null + if(config == 0) + return -1; + + // Make sure to set the defined trace function before using NFAPI_TRACE + if(config->trace) + nfapi_trace_g = config->trace; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + + pnf_t* _this = (pnf_t*)(config); + + while (_this->terminate == 0) + { + int connect_result = pnf_connect(_this); + + if(connect_result > 0) + { + pnf_message_pump(_this); + } + else if(connect_result < 0) + { + return connect_result; + } + + sleep(1); + } + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() terminate=1 - EXITTING............\n", __FUNCTION__); + + return 0; +} + +int nfapi_pnf_stop(nfapi_pnf_config_t* config) +{ + // Verify that config is not null + if(config == 0) + return -1; + + + pnf_t* _this = (pnf_t*)(config); + _this->terminate = 1; + + // todo wait for the pnf to stop before returning + + return 0; +} + +int nfapi_pnf_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_pnf_param_response_t* resp) +{ + // ensure it's valid + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_pnf_param_response_t)); +} + +int nfapi_pnf_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_pnf_config_response_t* resp) +{ + // ensure it's valid + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + if(resp->error_code == NFAPI_MSG_OK) + { + config->state = NFAPI_PNF_CONFIGURED; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_pnf_config_response_t)); +} + +int nfapi_pnf_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_pnf_start_response_t* resp) +{ + // ensure it's valid + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + if(resp->error_code == NFAPI_MSG_OK) + { + config->state = NFAPI_PNF_RUNNING; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_pnf_start_response_t)); +} + +int nfapi_pnf_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_pnf_stop_response_t* resp) +{ + // ensure it's valid + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + if(resp->error_code == NFAPI_MSG_OK) + { + config->state = NFAPI_PNF_CONFIGURED; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_pnf_stop_response_t)); +} + +int nfapi_pnf_param_resp(nfapi_pnf_config_t* config, nfapi_param_response_t* resp) +{ + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_param_response_t)); +} + +int nfapi_pnf_config_resp(nfapi_pnf_config_t* config, nfapi_config_response_t* resp) +{ + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, resp->header.phy_id); + + if(phy) + { + if(resp->error_code == NFAPI_MSG_OK) + { + phy->state = NFAPI_PNF_PHY_CONFIGURED; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknow phy id %d\n", __FUNCTION__, resp->header.phy_id); + return -1; + } + + return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_config_response_t)); +} + +int nfapi_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_start_response_t* resp) +{ + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, resp->header.phy_id); + if(phy) + { + if(resp->error_code == NFAPI_MSG_OK) + { + phy->state = NFAPI_PNF_PHY_RUNNING; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknown phy id %d\n", __FUNCTION__, resp->header.phy_id); + return -1; + } + + return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_start_response_t)); +} + +int nfapi_pnf_stop_resp(nfapi_pnf_config_t* config, nfapi_stop_response_t* resp) +{ + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + nfapi_pnf_phy_config_t* phy = nfapi_pnf_phy_config_find(config, resp->header.phy_id); + if(phy) + { + if(resp->error_code == NFAPI_MSG_OK) + { + phy->state = NFAPI_PNF_PHY_CONFIGURED; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknow phy id %d\n", __FUNCTION__, resp->header.phy_id); + return -1; + } + + + return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_stop_response_t)); +} + +int nfapi_pnf_measurement_resp(nfapi_pnf_config_t* config, nfapi_measurement_response_t* resp) +{ + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p5_message(_this, &(resp->header), sizeof(nfapi_measurement_response_t)); +} + + +int nfapi_pnf_rssi_resp(nfapi_pnf_config_t* config, nfapi_rssi_response_t* resp) +{ + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p4_message(_this, &(resp->header), sizeof(nfapi_rssi_response_t)); +} + +int nfapi_pnf_rssi_ind(nfapi_pnf_config_t* config, nfapi_rssi_indication_t* ind) +{ + if (config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p4_message(_this, &(ind->header), sizeof(nfapi_rssi_indication_t)); +} +int nfapi_pnf_cell_search_resp(nfapi_pnf_config_t* config, nfapi_cell_search_response_t* resp) +{ + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + NFAPI_TRACE(NFAPI_TRACE_INFO, "Send CELL_SEARCH.response\n"); + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p4_message(_this, &(resp->header), sizeof(nfapi_cell_search_response_t)); +} +int nfapi_pnf_cell_search_ind(nfapi_pnf_config_t* config, nfapi_cell_search_indication_t* ind) +{ + if (config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p4_message(_this, &(ind->header), sizeof(nfapi_cell_search_indication_t)); +} +int nfapi_pnf_broadcast_detect_resp(nfapi_pnf_config_t* config, nfapi_broadcast_detect_response_t* resp) +{ + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p4_message(_this, &(resp->header), sizeof(nfapi_broadcast_detect_response_t)); +} +int nfapi_pnf_broadcast_detect_ind(nfapi_pnf_config_t* config, nfapi_broadcast_detect_indication_t* ind) +{ + if (config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p4_message(_this, &(ind->header), sizeof(nfapi_broadcast_detect_indication_t)); +} +int nfapi_pnf_system_information_schedule_resp(nfapi_pnf_config_t* config, nfapi_system_information_schedule_response_t* resp) +{ + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1;; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p4_message(_this, &(resp->header), sizeof(nfapi_system_information_schedule_response_t)); +} + +int nfapi_pnf_system_information_schedule_ind(nfapi_pnf_config_t* config, nfapi_system_information_schedule_indication_t* ind) +{ + if (config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p4_message(_this, &(ind->header), sizeof(nfapi_system_information_schedule_indication_t)); +} +int nfapi_pnf_system_information_resp(nfapi_pnf_config_t* config, nfapi_system_information_response_t* resp) +{ + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p4_message(_this, &(resp->header), sizeof(nfapi_system_information_response_t)); +} + +int nfapi_pnf_system_information_ind(nfapi_pnf_config_t* config, nfapi_system_information_indication_t* ind) +{ + if (config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p4_message(_this, &(ind->header), sizeof(nfapi_system_information_indication_t)); +} +int nfapi_pnf_nmm_stop_resp(nfapi_pnf_config_t* config, nfapi_nmm_stop_response_t* resp) +{ + // ensure it's valid + if (config == NULL || resp == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p4_message(_this, &(resp->header), sizeof(nfapi_nmm_stop_request_t)); +} + +int nfapi_pnf_vendor_extension(nfapi_pnf_config_t* config, nfapi_p4_p5_message_header_t* msg, uint32_t msg_len) +{ + // ensure it's valid + if (config == NULL || msg == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return -1; + } + + pnf_t* _this = (pnf_t*)(config); + + return pnf_pack_and_send_p5_message(_this, msg, msg_len); +} + diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7.c b/nfapi/open-nFAPI/pnf/src/pnf_p7.c new file mode 100644 index 0000000000..02b828d382 --- /dev/null +++ b/nfapi/open-nFAPI/pnf/src/pnf_p7.c @@ -0,0 +1,1769 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pnf_p7.h" + +#define FAPI2_IP_DSCP 0 + +extern uint16_t sf_ahead; +//uint16_t sf_ahead=4; + +void add_sf(uint16_t *frameP, uint16_t *subframeP, int offset) +{ + *frameP = *frameP + ((*subframeP + offset) / 10); + + *subframeP = ((*subframeP + offset) % 10); +} + +void subtract_sf(uint16_t *frameP, uint16_t *subframeP, int offset) +{ + if (*subframeP < offset) + { + *frameP = (*frameP+1024-1)%1024; + } + *subframeP = (*subframeP+10-offset)%10; +} + +uint16_t sfnsf_add_sf(uint16_t sfnsf, int offset) +{ + uint16_t new_sfnsf; + uint16_t sfn = NFAPI_SFNSF2SFN(sfnsf); + uint16_t sf = NFAPI_SFNSF2SF(sfnsf); + + //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf); + add_sf(&sfn, &sf, offset); + + new_sfnsf = sfn<<4|sf; + + //printf("%s() sfn:%u sf:%u offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, sfn, sf, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf)); + + return new_sfnsf; +} + +uint16_t sfnsf_subtract_sf(uint16_t sfnsf, int offset) +{ + uint16_t new_sfnsf; + uint16_t sfn = NFAPI_SFNSF2SFN(sfnsf); + uint16_t sf = NFAPI_SFNSF2SF(sfnsf); + + //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf); + subtract_sf(&sfn, &sf, offset); + + new_sfnsf = sfn<<4|sf; + + //printf("%s() offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf)); + + return new_sfnsf; +} + +uint32_t pnf_get_current_time_hr(void) +{ + struct timeval now; + (void)gettimeofday(&now, NULL); + uint32_t time_hr = TIME2TIMEHR(now); + return time_hr; +} + +void* pnf_p7_malloc(pnf_p7_t* pnf_p7, size_t size) +{ + if(pnf_p7->_public.malloc) + { + return (pnf_p7->_public.malloc)(size); + } + else + { + return calloc(1, size); + } +} +void pnf_p7_free(pnf_p7_t* pnf_p7, void* ptr) +{ + if(pnf_p7->_public.free) + { + return (pnf_p7->_public.free)(ptr); + } + else + { + return free(ptr); + } +} + +// todo : for now these just malloc/free need to move to a memory cache +nfapi_dl_config_request_t* allocate_nfapi_dl_config_request(pnf_p7_t* pnf_p7) +{ + void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t)); + //printf("%s() ptr:%p\n", __FUNCTION__, ptr); + return ptr; +} + +void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t* pnf_p7) +{ + //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->dl_config_request_body.dl_config_pdu_list); + if(pnf_p7->_public.codec_config.deallocate) + { + (pnf_p7->_public.codec_config.deallocate)(req->dl_config_request_body.dl_config_pdu_list); + } + else + { + free(req->dl_config_request_body.dl_config_pdu_list); + } + req->dl_config_request_body.dl_config_pdu_list=0; + + pnf_p7_free(pnf_p7, req); +} + +nfapi_ul_config_request_t* allocate_nfapi_ul_config_request(pnf_p7_t* pnf_p7) +{ + void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t)); + //printf("%s() ptr:%p\n", __FUNCTION__, ptr); + return ptr; +} + +void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t* pnf_p7) +{ + //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->ul_config_request_body.ul_config_pdu_list); + if(pnf_p7->_public.codec_config.deallocate) + { + (pnf_p7->_public.codec_config.deallocate)(req->ul_config_request_body.ul_config_pdu_list); + } + else + { + free(req->ul_config_request_body.ul_config_pdu_list); + } + req->ul_config_request_body.ul_config_pdu_list=0; + + pnf_p7_free(pnf_p7, req); +} + +nfapi_hi_dci0_request_t* allocate_nfapi_hi_dci0_request(pnf_p7_t* pnf_p7) +{ + return pnf_p7_malloc(pnf_p7, sizeof(nfapi_hi_dci0_request_t)); +} + +void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pnf_p7) +{ + //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->hi_dci0_request_body.hi_dci0_pdu_list); + if(pnf_p7->_public.codec_config.deallocate) + { + (pnf_p7->_public.codec_config.deallocate)(req->hi_dci0_request_body.hi_dci0_pdu_list); + } + else + { + free(req->hi_dci0_request_body.hi_dci0_pdu_list); + } + req->hi_dci0_request_body.hi_dci0_pdu_list=0; + + pnf_p7_free(pnf_p7, req); +} + +nfapi_tx_request_t* allocate_nfapi_tx_request(pnf_p7_t* pnf_p7) +{ + return pnf_p7_malloc(pnf_p7, sizeof(nfapi_tx_request_t)); +} + +void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) +{ + int i = 0; + + //printf("%s() SFN/SF:%d %s req:%p pdu[0]:data:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->tx_request_body.tx_pdu_list[i].segments[0].segment_data); + + for(i = 0; i < req->tx_request_body.number_of_pdus; ++i) + { + void* data = req->tx_request_body.tx_pdu_list[i].segments[0].segment_data; + + if(pnf_p7->_public.codec_config.deallocate) + { + (pnf_p7->_public.codec_config.deallocate)(data); + } + else + { + free(data); + } + data=0; + } + + + if(pnf_p7->_public.codec_config.deallocate) + { + (pnf_p7->_public.codec_config.deallocate)(req->tx_request_body.tx_pdu_list); + } + else + { + free(req->tx_request_body.tx_pdu_list); + } + req->tx_request_body.tx_pdu_list=0; + + pnf_p7_free(pnf_p7, req); +} + +nfapi_lbt_dl_config_request_t* allocate_nfapi_lbt_dl_config_request(pnf_p7_t* pnf_p7) +{ + return pnf_p7_malloc(pnf_p7, sizeof(nfapi_lbt_dl_config_request_t)); +} + +void deallocate_nfapi_lbt_dl_config_request(nfapi_lbt_dl_config_request_t* req, pnf_p7_t* pnf_p7) +{ + if(pnf_p7->_public.codec_config.deallocate) + { + (pnf_p7->_public.codec_config.deallocate)(req->lbt_dl_config_request_body.lbt_dl_config_req_pdu_list); + } + else + { + free(req->lbt_dl_config_request_body.lbt_dl_config_req_pdu_list); + } + req->lbt_dl_config_request_body.lbt_dl_config_req_pdu_list=0; + + pnf_p7_free(pnf_p7, req); +} + +pnf_p7_rx_message_t* pnf_p7_rx_reassembly_queue_add_segment(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, uint32_t rx_hr_time, uint16_t sequence_number, uint16_t segment_number, uint8_t m, uint8_t* data, uint16_t data_len) +{ + pnf_p7_rx_message_t* msg = 0; + // attempt to find a entry for this segment + pnf_p7_rx_message_t* iterator = queue->msg_queue; + while(iterator != 0) + { + if(iterator->sequence_number == sequence_number) + { + msg = iterator; + break; + } + + iterator = iterator->next; + } + + // if found then copy data to message + if(msg != 0) + { + + msg->segments[segment_number].buffer = (uint8_t*)pnf_p7_malloc(pnf_p7, data_len); + memcpy(msg->segments[segment_number].buffer, data, data_len); + msg->segments[segment_number].length = data_len; + + msg->num_segments_received++; + + // set the segement number if we have the last segment + if(m == 0) + msg->num_segments_expected = segment_number + 1; + } + // else add new rx message entry + else + { + // create a new message + msg = (pnf_p7_rx_message_t*)(pnf_p7_malloc(pnf_p7, sizeof(pnf_p7_rx_message_t))); + memset(msg, 0, sizeof(pnf_p7_rx_message_t)); + + msg->sequence_number = sequence_number; + msg->num_segments_expected = m ? 255 : segment_number + 1; + msg->num_segments_received = 1; + msg->rx_hr_time = rx_hr_time; + + msg->segments[segment_number].buffer = (uint8_t*)pnf_p7_malloc(pnf_p7, data_len); + memcpy(msg->segments[segment_number].buffer, data, data_len); + msg->segments[segment_number].length = data_len; + + // place the message at the head of the queue + msg->next = queue->msg_queue; + queue->msg_queue = msg; + } + + return msg; +} + +void pnf_p7_rx_reassembly_queue_remove_msg(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, pnf_p7_rx_message_t* msg) +{ + // remove message if it has the same sequence number + pnf_p7_rx_message_t* iterator = queue->msg_queue; + pnf_p7_rx_message_t* previous = 0; + + while(iterator != 0) + { + if(iterator->sequence_number == msg->sequence_number) + { + if(previous == 0) + { + queue->msg_queue = iterator->next; + } + else + { + previous->next = iterator->next; + } + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Deleting reassembly message\n"); + // delete the message + uint16_t i; + for(i = 0; i < 128; ++i) + { + if(iterator->segments[i].buffer) + pnf_p7_free(pnf_p7, iterator->segments[i].buffer); + } + pnf_p7_free(pnf_p7, iterator); + + break; + } + + previous = iterator; + iterator = iterator->next; + } +} + +void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, uint32_t rx_hr_time, uint32_t delta) +{ + // remove all messages that are too old + pnf_p7_rx_message_t* iterator = queue->msg_queue; + pnf_p7_rx_message_t* previous = 0; + + while(iterator != 0) + { + if(rx_hr_time - iterator->rx_hr_time > delta) + { + if(previous == 0) + { + queue->msg_queue = iterator->next; + } + else + { + previous->next = iterator->next; + } + + NFAPI_TRACE(NFAPI_TRACE_INFO, "Deleting stale reassembly message (%u %u %d)\n", iterator->rx_hr_time, rx_hr_time, delta); + + pnf_p7_rx_message_t* to_delete = iterator; + iterator = iterator->next; + + // delete the message + uint16_t i; + for(i = 0; i < 128; ++i) + { + if(to_delete->segments[i].buffer) + pnf_p7_free(pnf_p7, to_delete->segments[i].buffer); + } + pnf_p7_free(pnf_p7, to_delete); + + } + else + { + previous = iterator; + iterator = iterator->next; + } + } +} + + +static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) +{ + if(now_hr < sf_start_hr) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "now is earlier than start of subframe now_hr:%u sf_start_hr:%u\n", now_hr, sf_start_hr); + return 0; + } + else + { + uint32_t now_us = TIMEHR_USEC(now_hr); + uint32_t sf_start_us = TIMEHR_USEC(sf_start_hr); + + // if the us have wrapped adjust for it + if(now_hr < sf_start_us) + { + now_us += 1000000; + } + + return now_us - sf_start_us; + } +} + +int pnf_p7_send_message(pnf_p7_t* pnf_p7, uint8_t* msg, uint32_t len) +{ + // todo : consider how to do this only once + struct sockaddr_in remote_addr; + memset((char*)&remote_addr, 0, sizeof(struct sockaddr_in)); + remote_addr.sin_family = AF_INET; + remote_addr.sin_port = htons(pnf_p7->_public.remote_p7_port); + //remote_addr.sin_addr.s_addr = inet_addr(pnf_p7->_public.remote_p7_addr); + if(inet_aton(pnf_p7->_public.remote_p7_addr, &remote_addr.sin_addr) == -1) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "inet_aton failed %d\n", errno); + return -1; + } + + socklen_t remote_addr_len = sizeof(struct sockaddr_in); + + int sendto_result; + if ((sendto_result = sendto((int)pnf_p7->p7_sock, (const char*)msg, len, 0, (const struct sockaddr*)&remote_addr, remote_addr_len)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s %s:%d sendto(%d, %p, %d) %d failed errno: %d\n", __FUNCTION__, pnf_p7->_public.remote_p7_addr, pnf_p7->_public.remote_p7_port, (int)pnf_p7->p7_sock, (const char*)msg, len, remote_addr_len, errno); + return -1; + } + + if(sendto_result != len) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s sendto failed to send the entire message %d %d\n", __FUNCTION__, sendto_result, len); + } + return 0; +} + +int pnf_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_p7_message_header_t* header, uint32_t msg_len) +{ + header->m_segment_sequence = NFAPI_P7_SET_MSS(0, 0, pnf_p7->sequence_number); + + // Need to guard against different threads calling the encode function at the same time + if(pthread_mutex_lock(&(pnf_p7->pack_mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return -1; + } + + int len = nfapi_p7_message_pack(header, pnf_p7->tx_message_buffer, sizeof(pnf_p7->tx_message_buffer), &pnf_p7->_public.codec_config); + + if (len < 0) + { + if(pthread_mutex_unlock(&(pnf_p7->pack_mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return -1; + } + + NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi_p7_message_pack failed with return %d\n", len ); + return -1; + } + + if(len > pnf_p7->_public.segment_size) + { + int msg_body_len = len - NFAPI_P7_HEADER_LENGTH ; + int seg_body_len = pnf_p7->_public.segment_size - NFAPI_P7_HEADER_LENGTH ; + int segment_count = (msg_body_len / (seg_body_len)) + ((msg_body_len % seg_body_len) ? 1 : 0); + + int segment = 0; + int offset = NFAPI_P7_HEADER_LENGTH; + uint8_t buffer[pnf_p7->_public.segment_size]; + for(segment = 0; segment < segment_count; ++segment) + { + uint8_t last = 0; + uint16_t size = pnf_p7->_public.segment_size - NFAPI_P7_HEADER_LENGTH; + if(segment + 1 == segment_count) + { + last = 1; + size = (msg_body_len) - (seg_body_len * segment); + } + + uint16_t segment_size = size + NFAPI_P7_HEADER_LENGTH; + + // Update the header with the m and segement + memcpy(&buffer[0], pnf_p7->tx_message_buffer, NFAPI_P7_HEADER_LENGTH); + + // set the segment length + buffer[4] = (segment_size & 0xFF00) >> 8; + buffer[5] = (segment_size & 0xFF); + + // set the m & segment number + buffer[6] = ((!last) << 7) + segment; + + memcpy(&buffer[NFAPI_P7_HEADER_LENGTH], pnf_p7->tx_message_buffer + offset, size); + offset += size; + + if(pnf_p7->_public.checksum_enabled) + { + nfapi_p7_update_checksum(buffer, segment_size); + } + + + pnf_p7_send_message(pnf_p7, &buffer[0], segment_size); + } + } + else + { + if(pnf_p7->_public.checksum_enabled) + { + nfapi_p7_update_checksum(pnf_p7->tx_message_buffer, len); + } + + // simple case that the message fits in a single segment + pnf_p7_send_message(pnf_p7, pnf_p7->tx_message_buffer, len); + } + + pnf_p7->sequence_number++; + + if(pthread_mutex_unlock(&(pnf_p7->pack_mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return -1; + } + + return 0; +} + +void pnf_pack_and_send_timing_info(pnf_p7_t* pnf_p7) +{ + nfapi_timing_info_t timing_info; + memset(&timing_info, 0, sizeof(timing_info)); + timing_info.header.message_id = NFAPI_TIMING_INFO; + timing_info.header.phy_id = pnf_p7->_public.phy_id; + + timing_info.last_sfn_sf = pnf_p7->sfn_sf; + timing_info.time_since_last_timing_info = pnf_p7->timing_info_ms_counter; + + timing_info.dl_config_jitter = pnf_p7->dl_config_jitter; + timing_info.tx_request_jitter = pnf_p7->tx_jitter; + timing_info.ul_config_jitter = pnf_p7->ul_config_jitter; + timing_info.hi_dci0_jitter = pnf_p7->hi_dci0_jitter; + + timing_info.dl_config_latest_delay = 0; + timing_info.tx_request_latest_delay = 0; + timing_info.ul_config_latest_delay = 0; + timing_info.hi_dci0_latest_delay = 0; + + timing_info.dl_config_earliest_arrival = 0; + timing_info.tx_request_earliest_arrival = 0; + timing_info.ul_config_earliest_arrival = 0; + timing_info.hi_dci0_earliest_arrival = 0; + + + pnf_p7_pack_and_send_p7_message(pnf_p7, &(timing_info.header), sizeof(timing_info)); + + pnf_p7->timing_info_ms_counter = 0; +} + +void send_dummy_subframe(pnf_p7_t* pnf_p7, uint16_t sfn_sf) +{ + struct timespec t; + clock_gettime( CLOCK_MONOTONIC, &t); + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(sfn_sf:%d) t:%ld.%09ld\n", __FUNCTION__, NFAPI_SFNSF2DEC(sfn_sf), t.tv_sec, t.tv_nsec); + + if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) + { + pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf; + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - enter\n"); + (pnf_p7->_public.tx_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.tx_req); + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - exit\n"); + } + if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req) + { + pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf; + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - enter\n"); + (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req); + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - exit\n"); + } + if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req) + { + pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf; + NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy ul_config_req - enter\n"); + (pnf_p7->_public.ul_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.ul_config_req); + } + if(pnf_p7->_public.hi_dci0_req && pnf_p7->_public.dummy_subframe.hi_dci0_req) + { + pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf; + NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy hi_dci0 - enter\n"); + (pnf_p7->_public.hi_dci0_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.hi_dci0_req); + } + if(pnf_p7->_public.lbt_dl_config_req && pnf_p7->_public.dummy_subframe.lbt_dl_config_req) + { + pnf_p7->_public.dummy_subframe.lbt_dl_config_req->sfn_sf = sfn_sf; + NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy lbt - enter\n"); + (pnf_p7->_public.lbt_dl_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.lbt_dl_config_req); + } +} + +int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) +{ + // We could either send an event to the p7 thread have have it run the + // subframe or we could handle it here and lock access to the subframe + // buffers. If we do it on the p7 thread then we run the risk of blocking + // on the udp send. + // + // todo : start a timer to give us more of the 1 ms tick before send back + // the frame + + // todo : consider a more efficent lock mechasium + if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return -1; + } + +#if 1 + // save the curren time and sfn_sf + pnf_p7->sf_start_time_hr = pnf_get_current_time_hr(); + pnf_p7->sfn_sf = sfn_sf; + + uint32_t sfn_sf_tx = sfnsf_add_sf(sfn_sf, sf_ahead); + uint32_t tx_sfn_sf_dec = NFAPI_SFNSF2DEC(sfn_sf_tx); + + // If the subframe_buffer has been configured + if(pnf_p7->_public.subframe_buffer_size != 0) + { + + // apply the shift to the incoming sfn_sf + if(pnf_p7->sfn_sf_shift != 0) + { + int32_t sfn_sf_dec = NFAPI_SFNSF2DEC(sfn_sf); + + int32_t shifted_sfn_sf = sfn_sf_dec += pnf_p7->sfn_sf_shift; + + // adjust for wrap-around + if(shifted_sfn_sf < 0) + shifted_sfn_sf += NFAPI_MAX_SFNSFDEC; + else if(shifted_sfn_sf > NFAPI_MAX_SFNSFDEC) + shifted_sfn_sf -= NFAPI_MAX_SFNSFDEC; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "Applying shift %d to sfn/sf (%d -> %d)\n", pnf_p7->sfn_sf_shift, NFAPI_SFNSF2DEC(sfn_sf), shifted_sfn_sf); + sfn_sf = shifted_sfn_sf; + + // + // DJP - why does the shift not apply to pnf_p7->sfn_sf??? + // + + pnf_p7->sfn_sf_shift = 0; + } + + uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(sfn_sf); + uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + + nfapi_pnf_p7_subframe_buffer_t* subframe_buffer = &(pnf_p7->subframe_buffer[buffer_index]); + + uint8_t tx_buffer_index = tx_sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + nfapi_pnf_p7_subframe_buffer_t* tx_subframe_buffer = &(pnf_p7->subframe_buffer[tx_buffer_index]); + + //printf("sfn_sf_dec:%d tx_sfn_sf_dec:%d\n", sfn_sf_dec, tx_sfn_sf_dec); + + if (0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() shift:%d subframe_buffer->sfn_sf:%d tx_subframe_buffer->sfn_sf:%d sfn_sf:%d subframe_buffer[buffer_index:%u dl_config_req:%p tx_req:%p] " + "TX:sfn_sf:%d:tx_buffer_index:%d[dl_config_req:%p tx_req:%p]\n", + __FUNCTION__, + pnf_p7->sfn_sf_shift, + NFAPI_SFNSF2DEC(subframe_buffer->sfn_sf), + NFAPI_SFNSF2DEC(tx_subframe_buffer->sfn_sf), + sfn_sf_dec, buffer_index, subframe_buffer->dl_config_req, subframe_buffer->tx_req, + tx_sfn_sf_dec, tx_buffer_index, tx_subframe_buffer->dl_config_req, tx_subframe_buffer->tx_req); + + // if the subframe buffer sfn sf is set then we have atlease 1 message + // from the vnf. + // todo : how to handle the messages we don't have, send dummies for + // now + + //printf("tx_subframe_buffer->sfn_sf:%d sfn_sf_tx:%d\n", tx_subframe_buffer->sfn_sf, sfn_sf_tx); + //printf("subframe_buffer->sfn_sf:%d sfn_sf:%d\n", subframe_buffer->sfn_sf, sfn_sf); + if(tx_subframe_buffer->sfn_sf == sfn_sf_tx) + { + if(tx_subframe_buffer->tx_req != 0) + { + if(pnf_p7->_public.tx_req) + (pnf_p7->_public.tx_req)(&(pnf_p7->_public), tx_subframe_buffer->tx_req); + + //deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7); + } + else + { + // send dummy + if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) + { + pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf_tx; + (pnf_p7->_public.tx_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.tx_req); + } + } + + if(tx_subframe_buffer->dl_config_req != 0) + { + if(pnf_p7->_public.dl_config_req) + (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), tx_subframe_buffer->dl_config_req); + + //deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7); + } + else + { + // send dummy + if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req) + { + pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf_tx; + (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req); + } + } + + if(tx_subframe_buffer->hi_dci0_req != 0) + { + if(pnf_p7->_public.hi_dci0_req) + (pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), tx_subframe_buffer->hi_dci0_req); + + //deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7); + } + else + { + //send dummy + if(pnf_p7->_public.hi_dci0_req && pnf_p7->_public.dummy_subframe.hi_dci0_req) + { + pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf_tx; + (pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.hi_dci0_req); + } + } + + if(tx_subframe_buffer->dl_config_req != 0) + { + deallocate_nfapi_dl_config_request(tx_subframe_buffer->dl_config_req, pnf_p7); + tx_subframe_buffer->dl_config_req = 0; + } + if(tx_subframe_buffer->tx_req != 0) + { + deallocate_nfapi_tx_request(tx_subframe_buffer->tx_req, pnf_p7); + tx_subframe_buffer->tx_req = 0; + } + if(tx_subframe_buffer->hi_dci0_req != 0) + { + deallocate_nfapi_hi_dci0_request(tx_subframe_buffer->hi_dci0_req, pnf_p7); + tx_subframe_buffer->hi_dci0_req = 0; + } + } + else + { + // If we ever need to "send" a dummy ul_config this won't work!!! + send_dummy_subframe(pnf_p7, sfn_sf_tx); + } + + if(subframe_buffer->sfn_sf == sfn_sf) + { + + if(subframe_buffer->ul_config_req != 0) + { + if(pnf_p7->_public.ul_config_req) + (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), subframe_buffer->ul_config_req); + + //deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7); + } + else + { + // send dummy + if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req) + { + pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf; + (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.ul_config_req); + } + } + + if(subframe_buffer->lbt_dl_config_req != 0) + { + if(pnf_p7->_public.lbt_dl_config_req) + (pnf_p7->_public.lbt_dl_config_req)(&(pnf_p7->_public), subframe_buffer->lbt_dl_config_req); + + //deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7); + } + else + { + // send dummy + if(pnf_p7->_public.lbt_dl_config_req && pnf_p7->_public.dummy_subframe.lbt_dl_config_req) + { + pnf_p7->_public.dummy_subframe.lbt_dl_config_req->sfn_sf = sfn_sf; + (pnf_p7->_public.lbt_dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.lbt_dl_config_req); + } + + } + + //if(subframe_buffer->dl_config_req != 0) + //deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7); + //if(subframe_buffer->tx_req != 0) + //deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7); + if(subframe_buffer->ul_config_req != 0) + { + deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7); + subframe_buffer->ul_config_req = 0; + + } + //if(subframe_buffer->hi_dci0_req != 0) + //deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7); + if(subframe_buffer->lbt_dl_config_req != 0) + { + deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7); + subframe_buffer->lbt_dl_config_req = 0; + } + } // sfn_sf match + + if (subframe_buffer->dl_config_req == 0 && subframe_buffer->tx_req == 0 && subframe_buffer->ul_config_req == 0 && subframe_buffer->lbt_dl_config_req == 0) + { + memset(&(pnf_p7->subframe_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_subframe_buffer_t)); + pnf_p7->subframe_buffer[buffer_index].sfn_sf = -1; + } + + //printf("pnf_p7->_public.timing_info_mode_periodic:%d pnf_p7->timing_info_period_counter:%d pnf_p7->_public.timing_info_period:%d\n", pnf_p7->_public.timing_info_mode_periodic, pnf_p7->timing_info_period_counter, pnf_p7->_public.timing_info_period); + //printf("pnf_p7->_public.timing_info_mode_aperiodic:%d pnf_p7->timing_info_aperiodic_send:%d\n", pnf_p7->_public.timing_info_mode_aperiodic, pnf_p7->timing_info_aperiodic_send); + //printf("pnf_p7->timing_info_ms_counter:%d\n", pnf_p7->timing_info_ms_counter); + + // send the periodic timing info if configured + if(pnf_p7->_public.timing_info_mode_periodic && (pnf_p7->timing_info_period_counter++) == pnf_p7->_public.timing_info_period) + { + pnf_pack_and_send_timing_info(pnf_p7); + + pnf_p7->timing_info_period_counter = 0; + } + else if(pnf_p7->_public.timing_info_mode_aperiodic && pnf_p7->timing_info_aperiodic_send) + { + pnf_pack_and_send_timing_info(pnf_p7); + + pnf_p7->timing_info_aperiodic_send = 0; + } + else + { + pnf_p7->timing_info_ms_counter++; + } + } + else + { + //send_dummy_subframe(pnf_p7, sfn_sf_tx); + } + + + //printf("pnf_p7->tick:%d\n", pnf_p7->tick); + if(pnf_p7->tick == 1000) + { + + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF P7:%d] (ONTIME/LATE) DL:(%d/%d) UL:(%d/%d) HI:(%d/%d) TX:(%d/%d)\n", pnf_p7->_public.phy_id, + pnf_p7->stats.dl_conf_ontime, pnf_p7->stats.dl_conf_late, + pnf_p7->stats.ul_conf_ontime, pnf_p7->stats.ul_conf_late, + pnf_p7->stats.hi_dci0_ontime, pnf_p7->stats.hi_dci0_late, + pnf_p7->stats.tx_ontime, pnf_p7->stats.tx_late); + pnf_p7->tick = 0; + memset(&pnf_p7->stats, 0, sizeof(pnf_p7->stats)); + } + pnf_p7->tick++; +#endif + + if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return -1; + } + + return 0; +} + + + +// return 1 if in window +// return 0 if out of window +uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) +{ + uint32_t recv_sfn_sf_dec = NFAPI_SFNSF2DEC(sfnsf); + uint32_t current_sfn_sf_dec = NFAPI_SFNSF2DEC(phy->sfn_sf); + + uint8_t in_window = 0; + uint8_t timing_window = phy->_public.subframe_buffer_size; + + if(recv_sfn_sf_dec <= current_sfn_sf_dec) + { + // Need to check for wrap in window + if(((current_sfn_sf_dec + timing_window) % NFAPI_MAX_SFNSFDEC) < current_sfn_sf_dec) + { + if(recv_sfn_sf_dec > ((current_sfn_sf_dec + timing_window) % NFAPI_MAX_SFNSFDEC)) + { + // out of window + NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is late %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec); + } + else + { + // ok + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec); + in_window = 1; + } + } + else + { + // too late + NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in late %d (delta:%d)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (current_sfn_sf_dec - recv_sfn_sf_dec)); + } + + } + else + { + // Need to check it is in window + if((recv_sfn_sf_dec - current_sfn_sf_dec) <= timing_window) + { + // in window + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_sf_dec, name, recv_sfn_sf_dec); + in_window = 1; + } + else + { + // too far in the future + NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (delta:%d) [max:%d]\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (recv_sfn_sf_dec - current_sfn_sf_dec), timing_window); + } + + } + + return in_window; +} + + +// P7 messages +// +void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req Received\n"); + + nfapi_dl_config_request_t* req = allocate_nfapi_dl_config_request(pnf_p7); + + if(req == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to alloced nfapi_dl_config_request structure\n"); + return; + } + + int unpack_result = nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_dl_config_request_t), &(pnf_p7->_public.codec_config)); + + if(unpack_result == 0) + { + if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return; + } + + if ( + 0 && + (NFAPI_SFNSF2DEC(req->sfn_sf) % 100 ==0 || + NFAPI_SFNSF2DEC(req->sfn_sf) % 105 ==0 + ) + ) + NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req sfn_sf:%d pdcch:%u dci:%u pdu:%u pdsch_rnti:%u pcfich:%u\n", + NFAPI_SFNSF2DEC(req->sfn_sf), + req->dl_config_request_body.number_pdcch_ofdm_symbols, + req->dl_config_request_body.number_dci, + req->dl_config_request_body.number_pdu, + req->dl_config_request_body.number_pdsch_rnti, + req->dl_config_request_body.transmission_power_pcfich + ); + + if(is_p7_request_in_window(req->sfn_sf, "dl_config_request", pnf_p7)) + { + uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); + uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + + NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE DL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); + + // if there is already an dl_config_req make sure we free it. + if(pnf_p7->subframe_buffer[buffer_index].dl_config_req != 0) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "%s() is_p7_request_in_window()=TRUE buffer_index occupied - free it first sfn_sf:%d buffer_index:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), buffer_index); + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing dl_config_req at index %d (%d/%d)", + // pMyPhyInfo->sfnSf, bufferIdx, + // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); + deallocate_nfapi_dl_config_request(pnf_p7->subframe_buffer[buffer_index].dl_config_req, pnf_p7); + } + + // saving dl_config_request in subframe buffer + pnf_p7->subframe_buffer[buffer_index].sfn_sf = req->sfn_sf; + pnf_p7->subframe_buffer[buffer_index].dl_config_req = req; + + pnf_p7->stats.dl_conf_ontime++; + + } + else + { + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "NOT storing dl_config_req SFN/SF %d\n", req->sfn_sf); + deallocate_nfapi_dl_config_request(req, pnf_p7); + + if(pnf_p7->_public.timing_info_mode_aperiodic) + { + pnf_p7->timing_info_aperiodic_send = 1; + } + + pnf_p7->stats.dl_conf_late++; + } + + if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack dl_config_req"); + deallocate_nfapi_dl_config_request(req, pnf_p7); + } +} + +void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "UL_CONFIG.req Received\n"); + + nfapi_ul_config_request_t* req = allocate_nfapi_ul_config_request(pnf_p7); + + if(req == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to alloced nfapi_ul_config_request structure\n"); + return; + } + + int unpack_result = nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_ul_config_request_t), &(pnf_p7->_public.codec_config)); + + if(unpack_result == 0) + { + if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return; + } + + if(is_p7_request_in_window(req->sfn_sf, "ul_config_request", pnf_p7)) + { + uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); + uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + + NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE UL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); + + if(pnf_p7->subframe_buffer[buffer_index].ul_config_req != 0) + { + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing ul_config_req at index %d (%d/%d)", + // pMyPhyInfo->sfnSf, bufferIdx, + // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); + + deallocate_nfapi_ul_config_request(pnf_p7->subframe_buffer[buffer_index].ul_config_req, pnf_p7); + } + + pnf_p7->subframe_buffer[buffer_index].sfn_sf = req->sfn_sf; + pnf_p7->subframe_buffer[buffer_index].ul_config_req = req; + + pnf_p7->stats.ul_conf_ontime++; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing ul_config_req OUTSIDE OF TRANSMIT BUFFER WINDOW SFN/SF %d\n", NFAPI_SFNSF2DEC(pnf_p7->sfn_sf), NFAPI_SFNSF2DEC(req->sfn_sf)); + deallocate_nfapi_ul_config_request(req, pnf_p7); + + if(pnf_p7->_public.timing_info_mode_aperiodic) + { + pnf_p7->timing_info_aperiodic_send = 1; + } + + pnf_p7->stats.ul_conf_late++; + } + + if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack ul_config_req\n"); + deallocate_nfapi_ul_config_request(req, pnf_p7); + } +} + +void pnf_handle_hi_dci0_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "HI_DCI0.req Received\n"); + + nfapi_hi_dci0_request_t* req = allocate_nfapi_hi_dci0_request(pnf_p7); + + if(req == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to alloced nfapi_hi_dci0_request structure\n"); + return; + } + + int unpack_result = nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_hi_dci0_request_t), &pnf_p7->_public.codec_config); + + if(unpack_result == 0) + { + if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return; + } + + if(is_p7_request_in_window(req->sfn_sf, "hi_dci0_request", pnf_p7)) + { + uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); + uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + + if(pnf_p7->subframe_buffer[buffer_index].hi_dci0_req!= 0) + { + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing hi_dci0_req at index %d (%d/%d)", + // pMyPhyInfo->sfnSf, bufferIdx, + // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); + + deallocate_nfapi_hi_dci0_request(pnf_p7->subframe_buffer[buffer_index].hi_dci0_req, pnf_p7); + } + + pnf_p7->subframe_buffer[buffer_index].sfn_sf = req->sfn_sf; + pnf_p7->subframe_buffer[buffer_index].hi_dci0_req = req; + + pnf_p7->stats.hi_dci0_ontime++; + + } + else + { + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing hi_dci0_req SFN/SF %d/%d\n", pMyPhyInfo->sfnSf, SFNSF2SFN(req->sfn_sf), SFNSF2SF(req->sfn_sf)); + deallocate_nfapi_hi_dci0_request(req, pnf_p7); + + if(pnf_p7->_public.timing_info_mode_aperiodic) + { + pnf_p7->timing_info_aperiodic_send = 1; + } + + pnf_p7->stats.hi_dci0_late++; + } + + if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return; + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack hi_dci0_req\n"); + deallocate_nfapi_hi_dci0_request(req, pnf_p7); + } +} + +void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "TX.req Received\n"); + + nfapi_tx_request_t* req = allocate_nfapi_tx_request(pnf_p7); + + if(req == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to alloced nfapi_tx_request structure\n"); + return; + } + + int unpack_result = nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_tx_request_t), &pnf_p7->_public.codec_config); + if(unpack_result == 0) + { + if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return; + } + + if(is_p7_request_in_window(req->sfn_sf, "tx_request", pnf_p7)) + { + uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); + uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + + NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE TX_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); + + if (0 && NFAPI_SFNSF2DEC(req->sfn_sf)%100==0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX_REQ.req sfn_sf:%d pdus:%d - TX_REQ is within window\n", + __FUNCTION__, + NFAPI_SFNSF2DEC(req->sfn_sf), + req->tx_request_body.number_of_pdus); + + if(pnf_p7->subframe_buffer[buffer_index].tx_req != 0) + { + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing tx_req at index %d (%d/%d)", + // pMyPhyInfo->sfnSf, bufferIdx, + // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); + + deallocate_nfapi_tx_request(pnf_p7->subframe_buffer[buffer_index].tx_req, pnf_p7); + } + + pnf_p7->subframe_buffer[buffer_index].sfn_sf = req->sfn_sf; + pnf_p7->subframe_buffer[buffer_index].tx_req = req; + + pnf_p7->stats.tx_ontime++; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() TX_REQUEST Request is outside of window REQ:SFN_SF:%d CURR:SFN_SF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), NFAPI_SFNSF2DEC(pnf_p7->sfn_sf)); + + deallocate_nfapi_tx_request(req, pnf_p7); + + if(pnf_p7->_public.timing_info_mode_aperiodic) + { + pnf_p7->timing_info_aperiodic_send = 1; + } + + pnf_p7->stats.tx_late++; + } + + if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return; + } + } + else + { + deallocate_nfapi_tx_request(req, pnf_p7); + } +} + +void pnf_handle_lbt_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) +{ + nfapi_lbt_dl_config_request_t* req = allocate_nfapi_lbt_dl_config_request(pnf_p7); + + if(req == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to alloced nfapi_lbt_dl_config_request structure\n"); + return; + } + + int unpack_result = nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_lbt_dl_config_request_t), &pnf_p7->_public.codec_config); + + if(unpack_result == 0) + { + if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return; + } + + if(is_p7_request_in_window(req->sfn_sf, "lbt_dl_request", pnf_p7)) + { + uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); + uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + + if(pnf_p7->subframe_buffer[buffer_index].lbt_dl_config_req != 0) + { + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing tx_req at index %d (%d/%d)", + // pMyPhyInfo->sfnSf, bufferIdx, + // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); + + deallocate_nfapi_lbt_dl_config_request(pnf_p7->subframe_buffer[buffer_index].lbt_dl_config_req, pnf_p7); + } + + pnf_p7->subframe_buffer[buffer_index].sfn_sf = req->sfn_sf; + pnf_p7->subframe_buffer[buffer_index].lbt_dl_config_req = req; + } + else + { + deallocate_nfapi_lbt_dl_config_request(req, pnf_p7); + + if(pnf_p7->_public.timing_info_mode_aperiodic) + { + pnf_p7->timing_info_aperiodic_send = 1; + } + } + + if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return; + } + } + else + { + deallocate_nfapi_lbt_dl_config_request(req, pnf_p7); + } + +} + +void pnf_handle_p7_vendor_extension(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7, uint16_t message_id) +{ + if(pnf_p7->_public.allocate_p7_vendor_ext) + { + uint16_t msg_size; + nfapi_p7_message_header_t* msg = pnf_p7->_public.allocate_p7_vendor_ext(message_id, &msg_size); + + if(msg == 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to allocate vendor extention structure\n"); + return; + } + + int unpack_result = nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, msg, msg_size, &pnf_p7->_public.codec_config); + + if(unpack_result == 0) + { + if(pnf_p7->_public.vendor_ext) + pnf_p7->_public.vendor_ext(&(pnf_p7->_public), msg); + } + + if(pnf_p7->_public.deallocate_p7_vendor_ext) + pnf_p7->_public.deallocate_p7_vendor_ext(msg); + + } + +} + + +uint32_t calculate_t2(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_time_hr) +{ + uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); + uint32_t t2 = (NFAPI_SFNSF2DEC(sfn_sf) * 1000) + sf_time_us; + + if (0) + { + static uint32_t prev_t2 = 0; + + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(now_time_hr:%u sfn_sf:%d sf_start_time_Hr:%u) sf_time_us:%u t2:%u prev_t2:%u diff:%u\n", + __FUNCTION__, + now_time_hr, NFAPI_SFNSF2DEC(sfn_sf), sf_start_time_hr, + sf_time_us, + t2, + prev_t2, + t2-prev_t2); + + prev_t2 = t2; + } + + return t2; +} + +uint32_t calculate_t3(uint16_t sfn_sf, uint32_t sf_start_time_hr) +{ + uint32_t now_time_hr = pnf_get_current_time_hr(); + + uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); + + uint32_t t3 = (NFAPI_SFNSF2DEC(sfn_sf) * 1000) + sf_time_us; + + return t3; +} + +void pnf_handle_dl_node_sync(void *pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7, uint32_t rx_hr_time) +{ + nfapi_dl_node_sync_t dl_node_sync; + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_NODE_SYNC Received\n"); + + if (pRecvMsg == NULL || pnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + return; + } + + // unpack the message + if (nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &dl_node_sync, sizeof(dl_node_sync), &pnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + return; + } + + if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n"); + return; + } + + + if (dl_node_sync.delta_sfn_sf != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Will shift SF timing by %d on next subframe\n", dl_node_sync.delta_sfn_sf); + + pnf_p7->sfn_sf_shift = dl_node_sync.delta_sfn_sf; + } + + nfapi_ul_node_sync_t ul_node_sync; + memset(&ul_node_sync, 0, sizeof(ul_node_sync)); + ul_node_sync.header.message_id = NFAPI_UL_NODE_SYNC; + ul_node_sync.header.phy_id = dl_node_sync.header.phy_id; + ul_node_sync.t1 = dl_node_sync.t1; + ul_node_sync.t2 = calculate_t2(rx_hr_time, pnf_p7->sfn_sf, pnf_p7->sf_start_time_hr); + ul_node_sync.t3 = calculate_t3(pnf_p7->sfn_sf, pnf_p7->sf_start_time_hr); + + if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n"); + return; + } + + pnf_p7_pack_and_send_p7_message(pnf_p7, &(ul_node_sync.header), sizeof(ul_node_sync)); +} + +void pnf_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7, uint32_t rx_hr_time) +{ + nfapi_p7_message_header_t header; + + // validate the input params + if(pRecvMsg == NULL || recvMsgLen < 4 || pnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return; + } + + // unpack the message header + if (nfapi_p7_message_header_unpack(pRecvMsg, recvMsgLen, &header, sizeof(header), &pnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unpack message header failed, ignoring\n"); + return; + } + + // ensure the message is sensible + if (recvMsgLen < 8 || pRecvMsg == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "Invalid message size: %d, ignoring\n", recvMsgLen); + return; + } + + switch (header.message_id) + { + case NFAPI_DL_NODE_SYNC: + pnf_handle_dl_node_sync(pRecvMsg, recvMsgLen, pnf_p7, rx_hr_time); + break; + + case NFAPI_DL_CONFIG_REQUEST: + pnf_handle_dl_config_request(pRecvMsg, recvMsgLen, pnf_p7); + break; + + case NFAPI_UL_CONFIG_REQUEST: + pnf_handle_ul_config_request(pRecvMsg, recvMsgLen, pnf_p7); + break; + + case NFAPI_HI_DCI0_REQUEST: + pnf_handle_hi_dci0_request(pRecvMsg, recvMsgLen, pnf_p7); + break; + + case NFAPI_TX_REQUEST: + pnf_handle_tx_request(pRecvMsg, recvMsgLen, pnf_p7); + break; + + case NFAPI_LBT_DL_CONFIG_REQUEST: + pnf_handle_lbt_dl_config_request(pRecvMsg, recvMsgLen, pnf_p7); + break; + + default: + { + if(header.message_id >= NFAPI_VENDOR_EXT_MSG_MIN && + header.message_id <= NFAPI_VENDOR_EXT_MSG_MAX) + { + pnf_handle_p7_vendor_extension(pRecvMsg, recvMsgLen, pnf_p7, header.message_id); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s P7 Unknown message ID %d\n", __FUNCTION__, header.message_id); + } + } + break; + } +} + +void pnf_handle_p7_message(void *pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7, uint32_t rx_hr_time) +{ + nfapi_p7_message_header_t messageHeader; + + // validate the input params + if(pRecvMsg == NULL || recvMsgLen < 4 || pnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "pnf_handle_p7_message: invalid input params (%d %d %d)\n", pRecvMsg, recvMsgLen, pnf_p7); + return; + } + + // unpack the message header + if (nfapi_p7_message_header_unpack(pRecvMsg, recvMsgLen, &messageHeader, sizeof(nfapi_p7_message_header_t), &pnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unpack message header failed, ignoring\n"); + return; + } + + uint8_t m = NFAPI_P7_GET_MORE(messageHeader.m_segment_sequence); + uint8_t sequence_num = NFAPI_P7_GET_SEQUENCE(messageHeader.m_segment_sequence); + uint8_t segment_num = NFAPI_P7_GET_SEGMENT(messageHeader.m_segment_sequence); + + if(pnf_p7->_public.checksum_enabled) + { + uint32_t checksum = nfapi_p7_calculate_checksum(pRecvMsg, recvMsgLen); + if(checksum != messageHeader.checksum) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Checksum verification failed %d %d\n", checksum, messageHeader.checksum); + return; + } + } + + if(m == 0 && segment_num == 0) + { + // we have a complete message + // ensure the message is sensible + if (recvMsgLen < 8 || pRecvMsg == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "Invalid message size: %d, ignoring\n", recvMsgLen); + return; + } + + pnf_dispatch_p7_message(pRecvMsg, recvMsgLen, pnf_p7, rx_hr_time); + } + else + { + pnf_p7_rx_message_t* rx_msg = pnf_p7_rx_reassembly_queue_add_segment(pnf_p7, &(pnf_p7->reassembly_queue), rx_hr_time, sequence_num, segment_num, m, pRecvMsg, recvMsgLen); + + if(rx_msg->num_segments_received == rx_msg->num_segments_expected) + { + // send the buffer on + uint16_t i = 0; + uint16_t length = 0; + for(i = 0; i < rx_msg->num_segments_expected; ++i) + { + length += rx_msg->segments[i].length - (i > 0 ? NFAPI_P7_HEADER_LENGTH : 0); + } + + if(pnf_p7->reassemby_buffer_size < length) + { + pnf_p7_free(pnf_p7, pnf_p7->reassemby_buffer); + pnf_p7->reassemby_buffer = 0; + } + + if(pnf_p7->reassemby_buffer == 0) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "Resizing PNF_P7 Reassembly buffer %d->%d\n", pnf_p7->reassemby_buffer_size, length); + pnf_p7->reassemby_buffer = (uint8_t*)pnf_p7_malloc(pnf_p7, length); + + if(pnf_p7->reassemby_buffer == 0) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "Failed to allocate PNF_P7 reassemby buffer len:%d\n", length); + return; + } + + pnf_p7->reassemby_buffer_size = length; + } + + uint16_t offset = 0; + for(i = 0; i < rx_msg->num_segments_expected; ++i) + { + if(i == 0) + { + memcpy(pnf_p7->reassemby_buffer, rx_msg->segments[i].buffer, rx_msg->segments[i].length); + offset += rx_msg->segments[i].length; + } + else + { + memcpy(pnf_p7->reassemby_buffer + offset, rx_msg->segments[i].buffer + NFAPI_P7_HEADER_LENGTH, rx_msg->segments[i].length - NFAPI_P7_HEADER_LENGTH); + offset += rx_msg->segments[i].length - NFAPI_P7_HEADER_LENGTH; + } + } + + + pnf_dispatch_p7_message(pnf_p7->reassemby_buffer, length, pnf_p7, rx_msg->rx_hr_time); + + + // delete the structure + pnf_p7_rx_reassembly_queue_remove_msg(pnf_p7, &(pnf_p7->reassembly_queue), rx_msg); + } + } + + pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7, &(pnf_p7->reassembly_queue), rx_hr_time, 1000); + +} +void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time) +{ + int recvfrom_result = 0; + struct sockaddr_in remote_addr; + socklen_t remote_addr_size = sizeof(remote_addr); + + do + { + // peek the header + uint8_t header_buffer[NFAPI_P7_HEADER_LENGTH]; + recvfrom_result = recvfrom(pnf_p7->p7_sock, header_buffer, NFAPI_P7_HEADER_LENGTH, MSG_DONTWAIT | MSG_PEEK, (struct sockaddr*)&remote_addr, &remote_addr_size); + + if(recvfrom_result > 0) + { + // get the segment size + nfapi_p7_message_header_t header; + nfapi_p7_message_header_unpack(header_buffer, NFAPI_P7_HEADER_LENGTH, &header, 34, 0); + + // resize the buffer if we have a large segment + if(header.message_length > pnf_p7->rx_message_buffer_size) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "reallocing rx buffer %d\n", header.message_length); + pnf_p7->rx_message_buffer = realloc(pnf_p7->rx_message_buffer, header.message_length); + pnf_p7->rx_message_buffer_size = header.message_length; + } + + // read the segment + recvfrom_result = recvfrom(pnf_p7->p7_sock, pnf_p7->rx_message_buffer, header.message_length, MSG_DONTWAIT, (struct sockaddr*)&remote_addr, &remote_addr_size); + + now_hr_time = pnf_get_current_time_hr(); //DJP - moved to here - get closer timestamp??? + + if(recvfrom_result > 0) + { + pnf_handle_p7_message(pnf_p7->rx_message_buffer, recvfrom_result, pnf_p7, now_hr_time); + } + } + else if(recvfrom_result == 0) + { + // recv zero length message + recvfrom_result = recvfrom(pnf_p7->p7_sock, header_buffer, 0, MSG_DONTWAIT, (struct sockaddr*)&remote_addr, &remote_addr_size); + } + + if(recvfrom_result == -1) + { + if(errno == EAGAIN || errno == EWOULDBLOCK) + { + // return to the select + //NFAPI_TRACE(NFAPI_TRACE_WARN, "%s recvfrom would block :%d\n", __FUNCTION__, errno); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "%s recvfrom failed errno:%d\n", __FUNCTION__, errno); + } + } + + // need to update the time as we would only use the value from the + // select +#if 0 +// DJP - why do this here and not on return from recv??? + now_hr_time = pnf_get_current_time_hr(); +#endif + } + while(recvfrom_result > 0); +} + +int pnf_p7_message_pump(pnf_p7_t* pnf_p7) +{ + + // initialize the mutex lock + if(pthread_mutex_init(&(pnf_p7->mutex), NULL) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After P7 mutex init: %d\n", errno); + return -1; + } + + if(pthread_mutex_init(&(pnf_p7->pack_mutex), NULL) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After P7 mutex init: %d\n", errno); + return -1; + } + + // create the pnf p7 socket + if ((pnf_p7->p7_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After P7 socket errno: %d\n", errno); + return -1; + } + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 socket created (%d)...\n", pnf_p7->p7_sock); + + // configure the UDP socket options + int reuseaddr_enable = 1; + if (setsockopt(pnf_p7->p7_sock, SOL_SOCKET, SO_REUSEADDR, &reuseaddr_enable, sizeof(int)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "PNF P7 setsockopt (SOL_SOCKET, SO_REUSEADDR) failed errno: %d\n", errno); + return -1; + } + +/* + int reuseport_enable = 1; + if (setsockopt(pnf_p7->p7_sock, SOL_SOCKET, SO_REUSEPORT, &reuseport_enable, sizeof(int)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "PNF P7 setsockopt (SOL_SOCKET, SO_REUSEPORT) failed errno: %d\n", errno); + return -1; + } +*/ + + int iptos_value = FAPI2_IP_DSCP << 2; + if (setsockopt(pnf_p7->p7_sock, IPPROTO_IP, IP_TOS, &iptos_value, sizeof(iptos_value)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "PNF P7 setsockopt (IPPROTO_IP, IP_TOS) failed errno: %d\n", errno); + return -1; + } + + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(pnf_p7->_public.local_p7_port); + + if(pnf_p7->_public.local_p7_addr == 0) + { + addr.sin_addr.s_addr = INADDR_ANY; + } + else + { + //addr.sin_addr.s_addr = inet_addr(pnf_p7->_public.local_p7_addr); + if(inet_aton(pnf_p7->_public.local_p7_addr, &addr.sin_addr) == -1) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "inet_aton failed\n"); + } + } + + + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 binding %d too %s:%d\n", pnf_p7->p7_sock, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); + if (bind(pnf_p7->p7_sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "PNF_P7 bind error fd:%d errno: %d\n", pnf_p7->p7_sock, errno); + return -1; + } + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 bind succeeded...\n"); + + while(pnf_p7->terminate == 0) + { + fd_set rfds; + int selectRetval = 0; + + // select on a timeout and then get the message + FD_ZERO(&rfds); + FD_SET(pnf_p7->p7_sock, &rfds); + + struct timeval timeout; + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + selectRetval = select(pnf_p7->p7_sock+1, &rfds, NULL, NULL, &timeout); + + uint32_t now_hr_time = pnf_get_current_time_hr(); + + if(selectRetval == 0) + { + // timeout + continue; + } + else if (selectRetval == -1 && (errno == EINTR)) + { + // interrupted by signal + NFAPI_TRACE(NFAPI_TRACE_WARN, "PNF P7 Signal Interrupt %d\n", errno); + continue; + } + else if (selectRetval == -1) + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "PNF P7 select() failed\n"); + sleep(1); + continue; + } + + if(FD_ISSET(pnf_p7->p7_sock, &rfds)) + { + pnf_nfapi_p7_read_dispatch_message(pnf_p7, now_hr_time); + } + } + NFAPI_TRACE(NFAPI_TRACE_ERROR, "PNF_P7 Terminating..\n"); + + // close the connection and socket + if (close(pnf_p7->p7_sock) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "close failed errno: %d\n", errno); + } + + if(pthread_mutex_destroy(&(pnf_p7->pack_mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "mutex destroy failed errno: %d\n", errno); + } + + if(pthread_mutex_destroy(&(pnf_p7->mutex)) != 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "mutex destroy failed errno: %d\n", errno); + } + + return 0; +} diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c new file mode 100644 index 0000000000..74de5e5d78 --- /dev/null +++ b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c @@ -0,0 +1,225 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "pnf_p7.h" +#include +#include + +nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create() +{ + pnf_p7_t* _this = (pnf_p7_t*)calloc(1, sizeof(pnf_p7_t)); + + if(_this == 0) + return 0; + + + // set the default parameters + _this->_public.segment_size = 1400; + _this->max_num_segments = 8; + + _this->_public.subframe_buffer_size = 8; + _this->_public.timing_info_mode_periodic = 1; + _this->_public.timing_info_period = 32; + _this->_public.timing_info_mode_aperiodic = 1; + + _this->_public.checksum_enabled = 1; + + _this->_public.malloc = &malloc; + _this->_public.free = &free; + + _this->_public.codec_config.allocate = &malloc; + _this->_public.codec_config.deallocate = &free; + + return &(_this->_public); +} + +void nfapi_pnf_p7_config_destory(nfapi_pnf_p7_config_t* config) +{ + if(config == 0) + return ; + + free(config); +} + + + +int nfapi_pnf_p7_start(nfapi_pnf_p7_config_t* config) +{ + // Verify that config is not null + if(config == 0) + return -1; + + // Make sure to set the defined trace function before using NFAPI_TRACE + if(config->trace) + nfapi_trace_g = config->trace; + + pnf_p7_t* _this = (pnf_p7_t*)(config); + + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + + pnf_p7_message_pump(_this); + + return 0; +} + +int nfapi_pnf_p7_stop(nfapi_pnf_p7_config_t* config) +{ + // Verify that config is not null + if(config == 0) + return -1; + + pnf_p7_t* _this = (pnf_p7_t*)(config); + _this->terminate = 1; + + return 0; +} + + +int nfapi_pnf_p7_subframe_ind(nfapi_pnf_p7_config_t* config, uint16_t phy_id, uint16_t sfn_sf) +{ + // Verify that config is not null + if(config == 0) + return -1; + + pnf_p7_t* _this = (pnf_p7_t*)(config); + + return pnf_p7_subframe_ind(_this, phy_id, sfn_sf); +} + +int nfapi_pnf_p7_harq_ind(nfapi_pnf_p7_config_t* config, nfapi_harq_indication_t* ind) +{ + if(config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return -1; + } + + pnf_p7_t* _this = (pnf_p7_t*)(config); + + return pnf_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_harq_indication_t)); +} +int nfapi_pnf_p7_crc_ind(nfapi_pnf_p7_config_t* config, nfapi_crc_indication_t* ind) +{ + if(config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return -1; + } + + pnf_p7_t* _this = (pnf_p7_t*)(config); + return pnf_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_crc_indication_t)); +} +int nfapi_pnf_p7_rx_ind(nfapi_pnf_p7_config_t* config, nfapi_rx_indication_t* ind) +{ + if(config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return -1; + } + + pnf_p7_t* _this = (pnf_p7_t*)(config); + return pnf_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_rx_indication_t)); +} +int nfapi_pnf_p7_rach_ind(nfapi_pnf_p7_config_t* config, nfapi_rach_indication_t* ind) +{ + if(config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return -1; + } + + pnf_p7_t* _this = (pnf_p7_t*)(config); + return pnf_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_rach_indication_t)); +} +int nfapi_pnf_p7_srs_ind(nfapi_pnf_p7_config_t* config, nfapi_srs_indication_t* ind) +{ + if(config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return -1; + } + + pnf_p7_t* _this = (pnf_p7_t*)(config); + return pnf_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_srs_indication_t)); +} +int nfapi_pnf_p7_sr_ind(nfapi_pnf_p7_config_t* config, nfapi_sr_indication_t* ind) +{ + if(config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return -1; + } + + pnf_p7_t* _this = (pnf_p7_t*)(config); + return pnf_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_sr_indication_t)); +} +int nfapi_pnf_p7_cqi_ind(nfapi_pnf_p7_config_t* config, nfapi_cqi_indication_t* ind) +{ + if(config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return -1; + } + + pnf_p7_t* _this = (pnf_p7_t*)(config); + return pnf_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_cqi_indication_t)); +} +int nfapi_pnf_p7_lbt_dl_ind(nfapi_pnf_p7_config_t* config, nfapi_lbt_dl_indication_t* ind) +{ + if(config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return -1; + } + + pnf_p7_t* _this = (pnf_p7_t*)(config); + return pnf_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_lbt_dl_indication_t)); +} +int nfapi_pnf_p7_nb_harq_ind(nfapi_pnf_p7_config_t* config, nfapi_nb_harq_indication_t* ind) +{ + if(config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return -1; + } + + pnf_p7_t* _this = (pnf_p7_t*)(config); + return pnf_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nb_harq_indication_t)); +} +int nfapi_pnf_p7_nrach_ind(nfapi_pnf_p7_config_t* config, nfapi_nrach_indication_t* ind) +{ + if(config == NULL || ind == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return -1; + } + + pnf_p7_t* _this = (pnf_p7_t*)(config); + return pnf_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nrach_indication_t)); +} +int nfapi_pnf_p7_vendor_extension(nfapi_pnf_p7_config_t* config, nfapi_p7_message_header_t* msg) +{ + if(config == NULL || msg == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return -1; + } + + pnf_p7_t* _this = (pnf_p7_t*)(config); + return pnf_p7_pack_and_send_p7_message(_this, msg, 0); +} + diff --git a/nfapi/open-nFAPI/pnf/tests/Makefile.am b/nfapi/open-nFAPI/pnf/tests/Makefile.am new file mode 100644 index 0000000000..4dcdea0511 --- /dev/null +++ b/nfapi/open-nFAPI/pnf/tests/Makefile.am @@ -0,0 +1,28 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +#nfapi unit test +AUTOMAKE_OPTIONS=subdir-objects +AM_CPPFLAGS = -I$(top_srcdir)/nfapi/inc -I$(top_srcdir)/nfapi/public_inc -I$(top_srcdir)/common/public_inc -I$(top_srcdir)/pnf/public_inc $(CFLAGS_CUNIT) -Wall -Werror + +check_PROGRAMS= test_pnf + +test_pnf_SOURCES = pnf_cunit_main.c ../../common/src/debug.c +test_pnf_LDADD=$(top_builddir)/pnf/libnfapi_pnf.a $(top_builddir)/nfapi/libnfapi.a -L$(libdir) -lpthread -lrt -lsctp -lz -lcunit + +LOG_DRIVER = $(top_srcdir)/tap-driver.sh +TESTS=$(check_PROGRAMS) +EXTRA_DIST = $(TESTS) diff --git a/nfapi/open-nFAPI/pnf/tests/pnf_cunit_main.c b/nfapi/open-nFAPI/pnf/tests/pnf_cunit_main.c new file mode 100644 index 0000000000..d2ab031ad4 --- /dev/null +++ b/nfapi/open-nFAPI/pnf/tests/pnf_cunit_main.c @@ -0,0 +1,2365 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CUnit.h" + +#include "Basic.h" +#include "Automated.h" +//#include "CUnit/Console.h" + +#include "nfapi_interface.h" +#include "nfapi_pnf_interface.h" +#include "nfapi.h" +#include // for printf +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "debug.h" + +/* Test Suite setup and cleanup functions: */ + +int init_suite(void) { return 0; } +int clean_suite(void) { return 0; } + +#define MAX_PACKED_MESSAGE_SIZE 8192 + +typedef struct phy_info +{ + uint8_t enabled; + uint16_t phy_id; + uint16_t sfn_sf; + + pthread_t thread; + + int pnf_p7_port; + char* pnf_p7_addr; + + int vnf_p7_port; + char* vnf_p7_addr; + + nfapi_pnf_p7_config_t* config; + +} phy_info_t; + +typedef struct pnf_info +{ + uint8_t num_phys; + phy_info_t phys[8]; + +} pnf_info_t; + +phy_info_t* find_phy_info(pnf_info_t* pnf, uint16_t phy_id) +{ + int i = 0; + for(i = 0; i < 8; ++i) + { + if(pnf->phys[i].enabled == 1 && pnf->phys[i].phy_id == phy_id) + { + return &(pnf->phys[i]); + } + } + return 0; +} + + + +/************* Test case functions ****************/ + +void pnf_test_start_no_config(void) +{ + int result = nfapi_pnf_start(0); + CU_ASSERT_EQUAL(result, -1); +} + +void test_trace(nfapi_trace_level_t level, const char* message, ...) +{ + printf("%s", message); +} + + +void* pnf_test_start_thread(void* ptr) +{ + int result = nfapi_pnf_start((nfapi_pnf_config_t*)ptr); + return (void*)(intptr_t)result; +} + +void* pnf_test_start_p7_thread(void* ptr) +{ + int result = nfapi_pnf_p7_start((nfapi_pnf_p7_config_t*)ptr); + return (void*)(intptr_t)result; +} + +void pnf_test_start_no_connection(void) +{ + char* vnf_addr = "127.127.0.1"; + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + config->vnf_ip_addr = vnf_addr; + + pthread_t thread; + pthread_create(&thread, NULL, &pnf_test_start_thread, config); + + sleep(1); + + nfapi_pnf_stop(config); + + int* result; + pthread_join(thread, (void**)&result); + CU_ASSERT_EQUAL(result, 0); +} + +void pnf_test_start_no_ip(void) +{ + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + + pthread_t thread; + pthread_create(&thread, NULL, &pnf_test_start_thread, config); + + sleep(2); + + nfapi_pnf_stop(config); + + intptr_t result; + pthread_join(thread, (void**)&result); + CU_ASSERT_EQUAL((int)result, -1); +} + +void pnf_test_start_invalid_ip(void) +{ + char* vnf_addr = "not.an.ip.address"; + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + config->vnf_ip_addr = vnf_addr; + + pthread_t thread; + pthread_create(&thread, NULL, &pnf_test_start_thread, config); + + sleep(2); + + nfapi_pnf_stop(config); + + intptr_t result; + pthread_join(thread, (void**)&result); + CU_ASSERT_EQUAL((int)result, -1); +} + +int create_p5_listen_socket(char* ip, int port) +{ + int p5ListenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); + + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + addr.sin_addr.s_addr = INADDR_ANY; + + // bind to the configured address and port + bind(p5ListenSock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); + + return p5ListenSock; +} +int create_p5_ipv6_listen_socket(char* ip, int port) +{ + struct addrinfo hints, *servinfo; + memset(&hints, 0, sizeof(hints)); + hints.ai_socktype = SOCK_STREAM; // For SCTP we are only interested in SOCK_STREAM + hints.ai_family= AF_INET6; + + char port_str[8]; + snprintf(port_str, sizeof(port_str), "%d", port); + getaddrinfo(ip, port_str, &hints, &servinfo); + + + int p5ListenSock = socket(AF_INET6, SOCK_STREAM, IPPROTO_SCTP); + //printf("Socket result %d\n", p5ListenSock); + + // bind to the configured address and port + /*int bind_result = */ + bind(p5ListenSock, servinfo->ai_addr, servinfo->ai_addrlen); + //printf("Bind result %d (errno:%d)\n", bind_result, errno); + + freeaddrinfo(servinfo); + + return p5ListenSock; +} + +/* +int wait_for_pnf_connection(int p5ListenSock) +{ + listen(p5ListenSock, 2); + socklen_t addrSize; + int p5Sock = accept(p5ListenSock, (struct sockaddr *)&addr, &addrSize); + + return p5Sock; +} +*/ + +int test_param_request_called = 0; +int test_pnf_param_request(nfapi_pnf_config_t* config, nfapi_pnf_param_request_t* req) +{ + printf("test_pnf_param_request called.... ;-)\n"); + + nfapi_pnf_param_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_PARAM_RESPONSE; + + resp.pnf_param_general.tl.tag = NFAPI_PNF_PARAM_GENERAL_TAG; + resp.pnf_param_general.nfapi_sync_mode = 2; + resp.pnf_param_general.location_mode = 1; + resp.pnf_param_general.location_coordinates[0] = 123; + resp.pnf_param_general.dl_config_timing = 12; + resp.pnf_param_general.tx_timing = 12; + resp.pnf_param_general.ul_config_timing = 12; + resp.pnf_param_general.hi_dci0_timing = 12; + resp.pnf_param_general.maximum_number_phys = 2; + resp.pnf_param_general.maximum_total_bandwidth = 100; + resp.pnf_param_general.maximum_total_number_dl_layers = 2; + resp.pnf_param_general.maximum_total_number_ul_layers = 2; + resp.pnf_param_general.shared_bands = 0; + resp.pnf_param_general.shared_pa = 0; + resp.pnf_param_general.maximum_total_power = -190; + resp.pnf_param_general.oui[0] = 88; +/* + in.pnf_phy.tl.tag = NFAPI_PNF_PHY_TAG; + in.pnf_phy.number_of_phys = 2; + in.pnf_phy.phy[0].phy_config_index = 0; + in.pnf_phy.phy[0].number_of_rfs = 2; + in.pnf_phy.phy[0].rf_config[0].rf_config_index = 0; + in.pnf_phy.phy[0].number_of_rf_exclusions = 1; + in.pnf_phy.phy[0].rf_config[0].rf_config_index = 1; + in.pnf_phy.phy[0].downlink_channel_bandwidth_supported = 20; + in.pnf_phy.phy[0].uplink_channel_bandwidth_supported = 20; + in.pnf_phy.phy[0].number_of_dl_layers_supported = 2; + in.pnf_phy.phy[0].number_of_ul_layers_supported = 1; + in.pnf_phy.phy[0].maximum_3gpp_release_supported = 3; + in.pnf_phy.phy[0].nmm_modes_supported = 2; + + in.pnf_rf.tl.tag = NFAPI_PNF_RF_TAG; + in.pnf_rf.number_of_rfs = 2; + in.pnf_rf.rf[0].rf_config_index = 0; + in.pnf_rf.rf[0].band = 1; + in.pnf_rf.rf[0].maximum_transmit_power = -100; + in.pnf_rf.rf[0].minimum_transmit_power = -90; + in.pnf_rf.rf[0].number_of_antennas_suppported = 4; + in.pnf_rf.rf[0].minimum_downlink_frequency = 100; + in.pnf_rf.rf[0].maximum_downlink_frequency = 2132; + in.pnf_rf.rf[0].minimum_uplink_frequency = 1231; + in.pnf_rf.rf[0].maximum_uplink_frequency = 123; + + + in.pnf_phy_rel10.tl.tag = NFAPI_PNF_PHY_REL10_TAG; + in.pnf_phy_rel10.number_of_phys = 2; + in.pnf_phy_rel10.phy[0].phy_config_index = 0; + in.pnf_phy_rel10.phy[0].transmission_mode_7_supported = 1; + in.pnf_phy_rel10.phy[0].transmission_mode_8_supported = 2; + in.pnf_phy_rel10.phy[0].two_antenna_ports_for_pucch = 3; + in.pnf_phy_rel10.phy[0].transmission_mode_9_supported = 4; + in.pnf_phy_rel10.phy[0].simultaneous_pucch_pusch = 5; + in.pnf_phy_rel10.phy[0].four_layer_tx_with_tm3_and_tm4 = 6; + + in.pnf_phy_rel11.tl.tag = NFAPI_PNF_PHY_REL11_TAG; + in.pnf_phy_rel11.number_of_phys = 2; + in.pnf_phy_rel11.phy[0].phy_config_index = 0; + in.pnf_phy_rel11.phy[0].edpcch_supported = 1; + in.pnf_phy_rel11.phy[0].multi_ack_csi_reporting = 2; + in.pnf_phy_rel11.phy[0].pucch_tx_diversity = 3; + in.pnf_phy_rel11.phy[0].ul_comp_supported = 4; + in.pnf_phy_rel11.phy[0].transmission_mode_5_supported = 5; + + in.pnf_phy_rel12.tl.tag = NFAPI_PNF_PHY_REL12_TAG; + in.pnf_phy_rel12.number_of_phys = 2; + in.pnf_phy_rel12.phy[0].phy_config_index = 0; + in.pnf_phy_rel12.phy[0].csi_subframe_set = 1; + in.pnf_phy_rel12.phy[0].enhanced_4tx_codebook = 2; + in.pnf_phy_rel12.phy[0].drs_supported = 3; + in.pnf_phy_rel12.phy[0].ul_64qam_supported = 4; + in.pnf_phy_rel12.phy[0].transmission_mode_10_supported = 5; + in.pnf_phy_rel12.phy[0].alternative_bts_indices = 6; + + in.pnf_phy_rel13.tl.tag = NFAPI_PNF_PHY_REL13_TAG; + in.pnf_phy_rel13.number_of_phys = 2; + in.pnf_phy_rel13.phy[0].phy_config_index = 0; + in.pnf_phy_rel13.phy[0].pucch_format4_supported = 1; + in.pnf_phy_rel13.phy[0].pucch_format5_supported = 2; + in.pnf_phy_rel13.phy[0].more_than_5_ca_support = 3; + in.pnf_phy_rel13.phy[0].laa_supported = 4; + in.pnf_phy_rel13.phy[0].laa_ending_in_dwpts_supported = 5; + in.pnf_phy_rel13.phy[0].laa_starting_in_second_slot_supported = 6; + in.pnf_phy_rel13.phy[0].beamforming_supported = 7; + in.pnf_phy_rel13.phy[0].csi_rs_enhancement_supported = 8; + in.pnf_phy_rel13.phy[0].drms_enhancement_supported = 9; + in.pnf_phy_rel13.phy[0].srs_enhancement_supported = 10; +*/ + test_param_request_called++; + + nfapi_pnf_pnf_param_resp(config, &resp); + return 0; +} + +int test_config_request_called = 0; +int test_pnf_config_request(nfapi_pnf_config_t* config, nfapi_pnf_config_request_t* req) +{ + printf("test_pnf_config_request called.... ;-)\n"); + + CU_ASSERT_EQUAL(req->pnf_phy_rf_config.tl.tag, NFAPI_PNF_PHY_RF_TAG); + + if(config->user_data != 0) + { + pnf_info_t* pnf = (pnf_info_t*)(config->user_data); + int i = 0; + for(i = 0; i < req->pnf_phy_rf_config.number_phy_rf_config_info; ++i) + { + pnf->phys[i].enabled = 1; + pnf->phys[i].phy_id = req->pnf_phy_rf_config.phy_rf_config[i].phy_id; + printf("test_pnf_config_request creating phy %d\n", pnf->phys[i].phy_id); + + } + } + + nfapi_pnf_config_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_CONFIG_RESPONSE; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_pnf_config_resp(config, &resp); + + test_config_request_called++; + return 0; +} +int test_pnf_start_request(nfapi_pnf_config_t* config, nfapi_pnf_start_request_t* req) +{ + printf("test_pnf_start_request called.... ;-)\n"); + + nfapi_pnf_start_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_START_RESPONSE; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_pnf_start_resp(config, &resp); + return 0; +} +int test_pnf_stop_request(nfapi_pnf_config_t* config, nfapi_pnf_stop_request_t* req) +{ + printf("test_pnf_stop_request called.... ;-)\n"); + + nfapi_pnf_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_STOP_RESPONSE; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_pnf_stop_resp(config, &resp); + return 0; +} +int test_param_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_param_request_t* req) +{ + printf("test_param_request called.... ;-)\n"); + + nfapi_param_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PARAM_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_MSG_OK; + + if(config->user_data != 0) + { + phy_info_t* phy_info = find_phy_info((pnf_info_t*)(config->user_data), req->header.phy_id); + + resp.nfapi_config.p7_pnf_port.tl.tag = NFAPI_NFAPI_P7_PNF_PORT_TAG; + resp.nfapi_config.p7_pnf_port.value = phy_info->pnf_p7_port; + resp.num_tlv++; + + resp.nfapi_config.p7_pnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_PNF_PORT_TAG; + struct sockaddr_in pnf_p7_sockaddr; + pnf_p7_sockaddr.sin_addr.s_addr = inet_addr(phy_info->pnf_p7_addr); + memcpy(&(resp.nfapi_config.p7_pnf_address_ipv4.address[0]), &pnf_p7_sockaddr.sin_addr.s_addr, 4); + resp.num_tlv++; + } + + + + + nfapi_pnf_param_resp(config, &resp); + return 0; +} +int test_config_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_config_request_t* req) +{ + printf("test_config_request called.... ;-)\n"); + + if(config->user_data != 0) + { + phy_info_t* phy_info = find_phy_info((pnf_info_t*)(config->user_data), req->header.phy_id); + + if(req->nfapi_config.p7_vnf_port.tl.tag == NFAPI_NFAPI_P7_VNF_PORT_TAG) + { + phy_info->vnf_p7_port = req->nfapi_config.p7_vnf_port.value; + printf("vnf_p7_port %d\n", phy_info->vnf_p7_port); + } + + if(req->nfapi_config.p7_vnf_address_ipv4.tl.tag == NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG) + { + struct sockaddr_in addr; + memcpy(&addr.sin_addr.s_addr, req->nfapi_config.p7_vnf_address_ipv4.address, 4); + char* ip = inet_ntoa(addr.sin_addr); + phy_info->vnf_p7_addr = ip; + printf("vnf_p7_addr %s\n", phy_info->vnf_p7_addr); + } + + + } + + nfapi_config_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_CONFIG_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_config_resp(config, &resp); + return 0; +} +int test_dl_config_req(nfapi_pnf_p7_config_t* config, nfapi_dl_config_request_t* req) +{ + printf("test_dl_config_req called.... ;-)\n"); + return 0; +} + +int test_ul_config_req(nfapi_pnf_p7_config_t* config, nfapi_ul_config_request_t* req) +{ + printf("test_ul_config_req called.... ;-)\n"); + return 0; +} +int test_hi_dci0_req(nfapi_pnf_p7_config_t* config, nfapi_hi_dci0_request_t* req) +{ + printf("test_hi_dci0_req called.... ;-)\n"); + return 0; +} +int test_tx_req(nfapi_pnf_p7_config_t* config, nfapi_tx_request_t* req) +{ + printf("test_tx_req called.... ;-)\n"); + return 0; +} +int test_lbt_dl_config_req(nfapi_pnf_p7_config_t* config, nfapi_lbt_dl_config_request_t* req) +{ + printf("test_lbt_dl_req called.... ;-)\n"); + return 0; +} +int test_start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_start_request_t* req) +{ + printf("test_start_request called.... ;-)\n"); + + + if(config->user_data != 0) + { + phy_info_t* phy_info = find_phy_info((pnf_info_t*)(config->user_data), req->header.phy_id); + + phy_info->config = nfapi_pnf_p7_config_create(); + phy_info->config->local_p7_port = phy_info->pnf_p7_port; + + phy_info->config->remote_p7_port = phy_info->vnf_p7_port; + phy_info->config->remote_p7_addr = phy_info->vnf_p7_addr; + + phy_info->config->dl_config_req = &test_dl_config_req; + phy_info->config->ul_config_req = &test_ul_config_req; + phy_info->config->hi_dci0_req = &test_hi_dci0_req; + phy_info->config->tx_req = &test_tx_req; + phy_info->config->lbt_dl_config_req = &test_lbt_dl_config_req; + + //phy_info->config->subframe_buffer_size = 8; + //phy_info->config->timing_info_mode_periodic = 1; + //phy_info->config->timing_info_period = 32; + //phy_info->config->timing_info_mode_aperiodic = 1; + + phy_info->config->segment_size = 1400; + phy_info->config->checksum_enabled = 0; + + + pthread_create(&phy_info->thread, NULL, &pnf_test_start_p7_thread, phy_info->config); + } + + nfapi_start_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_START_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_start_resp(config, &resp); + return 0; +} +int test_stop_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_stop_request_t* req) +{ + printf("test_stop_request called.... ;-)\n"); + + nfapi_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_STOP_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_stop_resp(config, &resp); + return 0; +} + +int send_p5_message(int p5Sock, nfapi_p4_p5_message_header_t* msg, unsigned msg_size, struct sockaddr* addr, socklen_t addr_size) +{ + char buffer[256]; + int encoded_size = nfapi_p5_message_pack(msg, msg_size, buffer, sizeof(buffer), 0); + int result = sendto(p5Sock, buffer, encoded_size, 0, addr, addr_size); + return result; +} + +int send_p7_message(int p7Sock, nfapi_p7_message_header_t* msg, unsigned msg_size, struct sockaddr_in* addr, socklen_t addr_size) +{ + char buffer[256]; + int encoded_size = nfapi_p7_message_pack(msg, buffer, sizeof(buffer), 0); + int result = sendto(p7Sock, buffer, encoded_size, 0, (struct sockaddr*)addr, addr_size); + + printf("send_p7_message result %d\n", result); + return result; +} +int send_p7_segmented_message(int p7Sock, nfapi_p7_message_header_t* msg, unsigned msg_size, struct sockaddr_in* addr, socklen_t addr_size) +{ + char buffer[1024 * 10]; + int encoded_size = nfapi_p7_message_pack(msg, buffer, sizeof(buffer), 0); + + uint16_t segment_size = 256; + + if(encoded_size < segment_size) + { + int result = sendto(p7Sock, buffer, encoded_size, 0, (struct sockaddr*)addr, addr_size); + return result; + } + else + { + // printf("Segmenting p7 message %d\n", encoded_size); + + uint8_t segment_count = 0; + uint8_t buffer2[segment_size]; + uint32_t offset = 0; + uint16_t msg_size; + //uint8_t m = 1; + + do{ + + if(segment_count == 0) + { + msg_size = segment_size; + memcpy(&buffer2[0], &buffer[0], msg_size); + // M = 1 + buffer2[6] = (1 << 7) | (segment_count & 0x7F); + + offset = msg_size; + } + else + { + memcpy(&buffer2[0], &buffer[0], NFAPI_P7_HEADER_LENGTH); + + if(encoded_size - offset > segment_size) + { + // M = 1 + buffer2[6] = (1 << 7) | (segment_count & 0x7F); + msg_size = segment_size; + } + else + { + // M = 0 + buffer2[6] = (0 << 7) | (segment_count & 0x7F); + msg_size = encoded_size - offset + NFAPI_P7_HEADER_LENGTH; + } + + + memcpy(&buffer2[NFAPI_P7_HEADER_LENGTH], &buffer[offset], msg_size - NFAPI_P7_HEADER_LENGTH); + + offset += msg_size - NFAPI_P7_HEADER_LENGTH; + } + + uint8_t* p = &buffer2[4]; + push16(msg_size, &p, &buffer2[segment_size]); + + //printf("Segmenting p7 message %d %di %d\n", segment_count, msg_size, offset); + /*int result = */sendto(p7Sock, buffer2, msg_size, 0, (struct sockaddr*)addr, addr_size); + + segment_count++; + + }while(offset < encoded_size); + + } + + return 0; +} +int send_p7_segmented_message_outoforder(int p7Sock, nfapi_p7_message_header_t* msg, unsigned msg_size, struct sockaddr_in* addr, socklen_t addr_size) +{ + char buffer[1024 * 10]; + int encoded_size = nfapi_p7_message_pack(msg, buffer, sizeof(buffer), 0); + + uint16_t segment_size = 256; + + if(encoded_size < segment_size) + { + int result = sendto(p7Sock, buffer, encoded_size, 0, (struct sockaddr*)addr, addr_size); + return result; + } + else + { + // printf("Segmenting p7 message %d\n", encoded_size); + + uint8_t segment_count = 0; + uint8_t buffer2[128][segment_size]; + uint32_t offset = 0; + uint16_t msg_size[128]; + uint8_t i = 0; + + do{ + + if(segment_count == 0) + { + msg_size[i] = segment_size; + memcpy(&buffer2[i][0], &buffer[0], msg_size[i]); + // M = 1 + buffer2[i][6] = (1 << 7) | (segment_count & 0x7F); + + offset = msg_size[i]; + } + else + { + memcpy(&buffer2[i][0], &buffer[0], NFAPI_P7_HEADER_LENGTH); + + if(encoded_size - offset > segment_size) + { + // M = 1 + buffer2[i][6] = (1 << 7) | (segment_count & 0x7F); + msg_size[i] = segment_size; + } + else + { + // M = 0 + buffer2[i][6] = (0 << 7) | (segment_count & 0x7F); + msg_size[i] = encoded_size - offset + NFAPI_P7_HEADER_LENGTH; + } + + + memcpy(&buffer2[i][NFAPI_P7_HEADER_LENGTH], &buffer[offset], msg_size[i] - NFAPI_P7_HEADER_LENGTH); + + offset += msg_size[i] - NFAPI_P7_HEADER_LENGTH; + } + + uint8_t* p = &buffer2[i][4]; + push16(msg_size[i], &p, &buffer2[i][segment_size]); + + + segment_count++; + i++; + + }while(offset < encoded_size); + + // send all odd then send event + uint8_t e = 0; + uint8_t o = 1; + while(o <= i) + { + sendto(p7Sock, &buffer2[o][0], msg_size[o], 0, (struct sockaddr*)addr, addr_size); + o += 2; + } + while(e <= i) + { + sendto(p7Sock, &buffer2[e][0], msg_size[e], 0, (struct sockaddr*)addr, addr_size); + e += 2; + } + + } + + return 0; +} + +int get_p7_segmented_message(int p7Sock, nfapi_p7_message_header_t* msg, unsigned _msg_size, struct sockaddr_in* addr, socklen_t addr_size, uint8_t (buffer2)[][256], uint16_t msg_size[256], uint8_t i) +{ + char buffer[1024 * 10]; + int encoded_size = nfapi_p7_message_pack(msg, buffer, sizeof(buffer), 0); + + uint16_t segment_size = 256; + + printf("get_p7_segmented_message size %d\n", encoded_size); + + if(encoded_size < segment_size) + { + msg_size[i] = encoded_size; + memcpy(&buffer2[i][0], &buffer[0], msg_size[i]); + i++; + } + else + { + uint8_t segment_count = 0; + uint32_t offset = 0; + + do{ + + if(segment_count == 0) + { + msg_size[i] = segment_size; + memcpy(&buffer2[i][0], &buffer[0], msg_size[i]); + // M = 1 + (buffer2[i][6]) = (1 << 7) | (segment_count & 0x7F); + + offset = msg_size[i]; + } + else + { + memcpy(&buffer2[i][0], &buffer[0], NFAPI_P7_HEADER_LENGTH); + + if(encoded_size - offset > segment_size) + { + // M = 1 + (buffer2[i][6]) = (1 << 7) | (segment_count & 0x7F); + msg_size[i] = segment_size; + } + else + { + // M = 0 + (buffer2[i][6]) = (0 << 7) | (segment_count & 0x7F); + msg_size[i] = encoded_size - offset + NFAPI_P7_HEADER_LENGTH; + } + + + memcpy(&buffer2[i][NFAPI_P7_HEADER_LENGTH], &buffer[offset], msg_size[i] - NFAPI_P7_HEADER_LENGTH); + + offset += msg_size[i] - NFAPI_P7_HEADER_LENGTH; + } + + uint8_t* p = &buffer2[i][4]; + push16(msg_size[i], &p, &buffer2[i][segment_size]); + + + segment_count++; + i++; + + }while(offset < encoded_size); + + } + + return i; +} + + +int recv_p5_message(int p5Sock, nfapi_p4_p5_message_header_t* msg, unsigned msg_size) +{ + //struct sockaddr_in addr2; + //socklen_t addr2len; + char buffer2[1024]; + int result2 = recv(p5Sock, buffer2, sizeof(buffer2), 0); //, (struct sockaddr*)&addr2, &addr2len); + + if(result2 == -1) + { + printf("%s recvfrom failed errno:%d\n", __FUNCTION__, errno); + } + else + { + /*int unpack_result =*/ nfapi_p5_message_unpack(buffer2, result2, msg, msg_size, 0); //, sizeof(resp)); + } + return 0; +} + +int recv_p7_message(int p7Sock, nfapi_p7_message_header_t* msg, unsigned msg_size) +{ + char buffer2[2560]; + int result2 = recvfrom(p7Sock, buffer2, sizeof(buffer2), 0, 0, 0); + + if(result2 == -1) + { + printf("%s recvfrom failed errno:%d\n", __FUNCTION__, errno); + } + else + { + /*int unpack_result =*/ nfapi_p7_message_unpack(buffer2, result2, msg, msg_size, 0); //, sizeof(resp)); + } + return 0; +} + +int send_pnf_param_request(int p5Sock, struct sockaddr* addr, socklen_t addr_size) +{ + printf("%s\n", __FUNCTION__); + nfapi_pnf_param_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PNF_PARAM_REQUEST; + req.header.message_length = 0; + + send_p5_message(p5Sock, &(req.header), sizeof(req), addr, addr_size); + return 0; +} + +int receive_pnf_param_response(int p5Sock, uint8_t error_code) +{ + nfapi_pnf_param_response_t resp; + recv_p5_message(p5Sock, &(resp.header), sizeof(resp)); + + printf("0x%x\n", resp.header.message_id); + CU_ASSERT_EQUAL(resp.header.message_id, NFAPI_PNF_PARAM_RESPONSE); + if(resp.header.message_id == NFAPI_PNF_PARAM_RESPONSE) + { + printf("decoded nfapi_pnf_param_response\n"); + CU_ASSERT_EQUAL(resp.error_code, error_code); + if(error_code == NFAPI_MSG_OK) + { + CU_ASSERT_EQUAL(resp.pnf_param_general.tl.tag, NFAPI_PNF_PARAM_GENERAL_TAG); + CU_ASSERT_EQUAL(resp.pnf_param_general.nfapi_sync_mode, 2); + CU_ASSERT_EQUAL(resp.pnf_param_general.location_mode, 1); + } + } + return 0; +} + +int send_pnf_config_request(int p5Sock, struct sockaddr* addr, socklen_t addr_size) +{ + nfapi_pnf_config_request_t req; + req.header.message_id = NFAPI_PNF_CONFIG_REQUEST; + req.header.message_length = 0; + + req.pnf_phy_rf_config.tl.tag = NFAPI_PNF_PHY_RF_TAG; + req.pnf_phy_rf_config.number_phy_rf_config_info = 1; + req.pnf_phy_rf_config.phy_rf_config[0].phy_id = 0; + + send_p5_message(p5Sock, &(req.header), sizeof(req), addr, addr_size); + return 0; +} + +int receive_pnf_config_response(int p5Sock) +{ + nfapi_pnf_config_response_t resp; + recv_p5_message(p5Sock, &(resp.header), sizeof(resp)); + + CU_ASSERT_EQUAL(resp.header.message_id, NFAPI_PNF_CONFIG_RESPONSE); + if(resp.header.message_id == NFAPI_PNF_CONFIG_RESPONSE) + { + printf("decoded nfapi_pnf_config_response\n"); + } + return 0; +} + +void send_pnf_start_request(int p5Sock, struct sockaddr* addr, socklen_t addr_size) +{ + nfapi_pnf_start_request_t req; + req.header.message_id = NFAPI_PNF_START_REQUEST; + req.header.message_length = 0; + + send_p5_message(p5Sock, &(req.header), sizeof(req), addr, addr_size); +} + +void receive_pnf_start_response(int p5Sock) +{ + nfapi_pnf_start_response_t resp; + recv_p5_message(p5Sock, &(resp.header), sizeof(resp)); + + CU_ASSERT_EQUAL(resp.header.message_id, NFAPI_PNF_START_RESPONSE); + if(resp.header.message_id == NFAPI_PNF_START_RESPONSE) + { + printf("decoded nfapi_pnf_start_response\n"); + } +} + +void send_pnf_stop_request(int p5Sock, struct sockaddr* addr, socklen_t addr_size) +{ + nfapi_pnf_stop_request_t req; + req.header.message_id = NFAPI_PNF_STOP_REQUEST; + req.header.message_length = 0; + + send_p5_message(p5Sock, &(req.header), sizeof(req), addr, addr_size); +} + +void receive_pnf_stop_response(int p5Sock) +{ + nfapi_pnf_stop_response_t resp; + recv_p5_message(p5Sock, &(resp.header), sizeof(resp)); + + CU_ASSERT_EQUAL(resp.header.message_id, NFAPI_PNF_STOP_RESPONSE); + if(resp.header.message_id == NFAPI_PNF_STOP_RESPONSE) + { + printf("decoded nfapi_pnf_stop_response\n"); + } +} + +void send_param_request(int p5Sock, int phy_id, struct sockaddr* addr, socklen_t addr_size) +{ + nfapi_param_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PARAM_REQUEST; + req.header.phy_id = phy_id; + + send_p5_message(p5Sock, &(req.header), sizeof(req), addr, addr_size); +} +void receive_param_response(int p5Sock) +{ + nfapi_pnf_stop_response_t resp; + recv_p5_message(p5Sock, &(resp.header), sizeof(resp)); + + CU_ASSERT_EQUAL(resp.header.message_id, NFAPI_PARAM_RESPONSE); + if(resp.header.message_id == NFAPI_PARAM_RESPONSE) + { + printf("decoded nfapi_param_response\n"); + } +} +void send_config_request(int p5Sock, int phy_id, struct sockaddr* addr, socklen_t addr_size, pnf_info_t* pnf_info) +{ + nfapi_config_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_CONFIG_REQUEST; + req.header.phy_id = phy_id; + + phy_info_t* phy_info = find_phy_info(pnf_info, phy_id); + + req.nfapi_config.p7_vnf_port.tl.tag = NFAPI_NFAPI_P7_VNF_PORT_TAG; + req.nfapi_config.p7_vnf_port.value = phy_info->vnf_p7_port; + req.num_tlv++; + + //req.nfapi_config.p7_vnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG; + //req.num_tlv++; + + send_p5_message(p5Sock, &(req.header), sizeof(req), addr, addr_size); +} +void receive_config_response(int p5Sock) +{ + nfapi_pnf_stop_response_t resp; + recv_p5_message(p5Sock, &(resp.header), sizeof(resp)); + + CU_ASSERT_EQUAL(resp.header.message_id, NFAPI_CONFIG_RESPONSE); + if(resp.header.message_id == NFAPI_CONFIG_RESPONSE) + { + printf("decoded nfapi_config_response\n"); + } +} +void send_start_request(int p5Sock, int phy_id, struct sockaddr* addr, socklen_t addr_size) +{ + nfapi_start_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_START_REQUEST; + req.header.phy_id = phy_id; + + send_p5_message(p5Sock, &(req.header), sizeof(req), addr, addr_size); +} +void receive_start_response(int p5Sock) +{ + nfapi_pnf_start_response_t resp; + recv_p5_message(p5Sock, &(resp.header), sizeof(resp)); + + CU_ASSERT_EQUAL(resp.header.message_id, NFAPI_START_RESPONSE); + if(resp.header.message_id == NFAPI_START_RESPONSE) + { + printf("decoded nfapi_start_response\n"); + } +} +void send_stop_request(int p5Sock, int phy_id, struct sockaddr* addr, socklen_t addr_size) +{ + nfapi_start_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_STOP_REQUEST; + req.header.phy_id = phy_id; + + send_p5_message(p5Sock, &(req.header), sizeof(req), addr, addr_size); +} + +void receive_stop_response(int p5Sock) +{ + nfapi_pnf_stop_response_t resp; + recv_p5_message(p5Sock, &(resp.header), sizeof(resp)); + + CU_ASSERT_EQUAL(resp.header.message_id, NFAPI_STOP_RESPONSE); + if(resp.header.message_id == NFAPI_STOP_RESPONSE) + { + printf("decoded nfapi_stop_response\n"); + } +} + +void send_dl_node_sync(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_dl_node_sync_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_DL_NODE_SYNC; + req.header.phy_id = phy_id; + req.t1 = 1977; + req.delta_sfn_sf = 5000; + + send_p7_message(p7Sock, &(req.header), sizeof(req), addr, addr_size); +} +void receive_ul_node_sync(int p7Sock) +{ + nfapi_ul_node_sync_t sync; + recv_p7_message(p7Sock, &(sync.header), sizeof(sync)); + + CU_ASSERT_EQUAL(sync.header.message_id, NFAPI_UL_NODE_SYNC); + if(sync.header.message_id == NFAPI_UL_NODE_SYNC) + { + printf("decoded nfapi_ul_node_sync t1:%d t2:%d t3:%d\n", + sync.t1, sync.t2, sync.t3); + } +} + +void receive_timing_info(int p7Sock) +{ + nfapi_timing_info_t timing_info; + recv_p7_message(p7Sock, &(timing_info.header), sizeof(timing_info)); + + CU_ASSERT_EQUAL(timing_info.header.message_id, NFAPI_TIMING_INFO); + if(timing_info.header.message_id == NFAPI_TIMING_INFO) + { + printf("decoded nfapi_timing_info\n"); + } + else + { + printf("decoded ?? 0x%x\n", timing_info.header.message_id); + } +} +void send_dl_config_req(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size, uint16_t sfn_sf) +{ + nfapi_dl_config_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_DL_CONFIG_REQUEST; + req.header.phy_id = phy_id; + req.sfn_sf = sfn_sf; + + send_p7_message(p7Sock, &(req.header), sizeof(req), addr, addr_size); +} +void send_ul_config_req(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size, uint16_t sfn_sf) +{ + nfapi_ul_config_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_UL_CONFIG_REQUEST; + req.header.phy_id = phy_id; + req.sfn_sf = sfn_sf; + + send_p7_message(p7Sock, &(req.header), sizeof(req), addr, addr_size); +} +void send_hi_dci0_req(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size, uint16_t sfn_sf) +{ + nfapi_hi_dci0_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_HI_DCI0_REQUEST; + req.header.phy_id = phy_id; + req.sfn_sf = sfn_sf; + + send_p7_message(p7Sock, &(req.header), sizeof(req), addr, addr_size); +} +void send_tx_req(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size, uint16_t sfn_sf) +{ + nfapi_tx_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_TX_REQUEST; + req.header.phy_id = phy_id; + req.sfn_sf = sfn_sf; + send_p7_message(p7Sock, &(req.header), sizeof(req), addr, addr_size); +} + +void send_tx_req_1(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size, uint16_t sfn_sf) +{ + nfapi_tx_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_TX_REQUEST; + req.header.phy_id = phy_id; + req.sfn_sf = sfn_sf; + req.tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + req.tx_request_body.number_of_pdus = 8; + req.tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t*)(malloc(sizeof(nfapi_tx_request_t) * 8)); + uint8_t i = 0; + uint8_t test_pdu[1200]; + + for(i = 0; i < 8; i++) + { + req.tx_request_body.tx_pdu_list[i].pdu_length = sizeof(test_pdu); + req.tx_request_body.tx_pdu_list[i].pdu_index = i; + req.tx_request_body.tx_pdu_list[i].num_segments =1; + req.tx_request_body.tx_pdu_list[i].segments[0].segment_length = sizeof(test_pdu); + req.tx_request_body.tx_pdu_list[i].segments[0].segment_data = (void*)&test_pdu; + } + + send_p7_segmented_message(p7Sock, &(req.header), sizeof(req), addr, addr_size); + + free(req.tx_request_body.tx_pdu_list); + +} + +void send_tx_req_2(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size, uint16_t sfn_sf) +{ + nfapi_tx_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_TX_REQUEST; + req.header.phy_id = phy_id; + req.sfn_sf = sfn_sf; + req.tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + req.tx_request_body.number_of_pdus = 8; + req.tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t*)(malloc(sizeof(nfapi_tx_request_t) * 8)); + uint8_t i = 0; + uint8_t test_pdu[1200]; + + for(i = 0; i < 8; i++) + { + req.tx_request_body.tx_pdu_list[i].pdu_length = sizeof(test_pdu); + req.tx_request_body.tx_pdu_list[i].pdu_index = i; + req.tx_request_body.tx_pdu_list[i].num_segments =1; + req.tx_request_body.tx_pdu_list[i].segments[0].segment_length = sizeof(test_pdu); + req.tx_request_body.tx_pdu_list[i].segments[0].segment_data = (void*)&test_pdu; + } + + send_p7_segmented_message_outoforder(p7Sock, &(req.header), sizeof(req), addr, addr_size); + + free(req.tx_request_body.tx_pdu_list); + +} +void send_dl_subframe_msgs_interleaved(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size, uint16_t sfn_sf) +{ + + uint8_t buffer[256][256]; + uint16_t msg_size[256]; + uint16_t count = 0; + + { + nfapi_dl_config_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_DL_CONFIG_REQUEST; + req.header.phy_id = phy_id; + req.header.m_segment_sequence = 34; + req.sfn_sf = sfn_sf; + req.dl_config_request_body.tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + req.dl_config_request_body.number_pdu = 8; + req.dl_config_request_body.dl_config_pdu_list = (nfapi_dl_config_request_pdu_t*)malloc(sizeof(nfapi_dl_config_request_pdu_t) * 8); + + uint8_t i = 0; + for(i = 0; i < 8; i++) + { + nfapi_dl_config_request_pdu_t* pdu = &(req.dl_config_request_body.dl_config_pdu_list[i]); + pdu->pdu_type = NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; + pdu->dlsch_pdu.dlsch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG; + } + + + count = get_p7_segmented_message(p7Sock, &(req.header), sizeof(req), addr, addr_size, buffer, msg_size, count); + } + + { + nfapi_ul_config_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_UL_CONFIG_REQUEST; + req.header.phy_id = phy_id; + req.header.m_segment_sequence = 35; + req.sfn_sf = sfn_sf; + + count = get_p7_segmented_message(p7Sock, &(req.header), sizeof(req), addr, addr_size, buffer, msg_size, count); + } + + { + nfapi_hi_dci0_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_HI_DCI0_REQUEST; + req.header.phy_id = phy_id; + req.header.m_segment_sequence = 36; + req.sfn_sf = sfn_sf; + count = get_p7_segmented_message(p7Sock, &(req.header), sizeof(req), addr, addr_size, buffer, msg_size, count); + } + + { + nfapi_tx_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_TX_REQUEST; + req.header.phy_id = phy_id; + req.header.m_segment_sequence = 37; + req.sfn_sf = sfn_sf; + req.tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + req.tx_request_body.number_of_pdus = 8; + req.tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t*)(malloc(sizeof(nfapi_tx_request_t) * 8)); + uint8_t i = 0; + uint8_t test_pdu[1200]; + + for(i = 0; i < 8; i++) + { + req.tx_request_body.tx_pdu_list[i].pdu_length = sizeof(test_pdu); + req.tx_request_body.tx_pdu_list[i].pdu_index = i; + req.tx_request_body.tx_pdu_list[i].num_segments =1; + req.tx_request_body.tx_pdu_list[i].segments[0].segment_length = sizeof(test_pdu); + req.tx_request_body.tx_pdu_list[i].segments[0].segment_data = (void*)&test_pdu; + } + + count = get_p7_segmented_message(p7Sock, &(req.header), sizeof(req), addr, addr_size, buffer, msg_size, count); + } + + // send all odd then send event + uint8_t e = 0; + uint8_t o = 1; + while(o <= count) + { + if(msg_size[o] == 0) + printf("**** Sending a zero length msg %d\n", o); + sendto(p7Sock, &buffer[o][0], msg_size[o], 0, (struct sockaddr*)addr, addr_size); + o += 2; + } + while(e <= count) + { + if(msg_size[e] == 0) + printf("**** Sending a zero length msg %d\n", e); + + sendto(p7Sock, &buffer[e][0], msg_size[e], 0, (struct sockaddr*)addr, addr_size); + e += 2; + } + //free(req.tx_request_body.tx_pdu_list); +} + +void send_subframe_indication(phy_info_t* phy_info) +{ + nfapi_pnf_p7_subframe_ind(phy_info->config, phy_info->phy_id, phy_info->sfn_sf); +} + +void send_harq_ind(phy_info_t* phy_info, uint16_t sfn_sf) +{ + nfapi_harq_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_HARQ_INDICATION; + ind.header.phy_id = phy_info->phy_id; + ind.sfn_sf = sfn_sf; + + nfapi_pnf_p7_harq_ind((phy_info->config), &ind); +} +void recieve_harq_ind(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_harq_indication_t ind; + recv_p7_message(p7Sock, &(ind.header), sizeof(ind)); + + CU_ASSERT_EQUAL(ind.header.message_id, NFAPI_HARQ_INDICATION); + if(ind.header.message_id == NFAPI_HARQ_INDICATION) + { + printf("decoded nfapi_harq_indication\n"); + } + else + { + printf("decoded ?? 0x%x\n", ind.header.message_id); + } +} + +void send_crc_ind(phy_info_t* phy_info, uint16_t sfn_sf) +{ + nfapi_crc_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_CRC_INDICATION; + ind.header.phy_id = phy_info->phy_id; + ind.sfn_sf = sfn_sf; + + nfapi_pnf_p7_crc_ind((phy_info->config), &ind); + +} +void recieve_crc_ind(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_crc_indication_t ind; + recv_p7_message(p7Sock, &(ind.header), sizeof(ind)); + + CU_ASSERT_EQUAL(ind.header.message_id, NFAPI_CRC_INDICATION); + if(ind.header.message_id == NFAPI_CRC_INDICATION) + { + printf("decoded nfapi_crc_indication\n"); + } +} + +void send_rx_ind(phy_info_t* phy_info, uint16_t sfn_sf) +{ + nfapi_rx_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_RX_ULSCH_INDICATION; + ind.header.phy_id = phy_info->phy_id; + ind.sfn_sf = sfn_sf; + + nfapi_pnf_p7_rx_ind((phy_info->config), &ind); +} +void recieve_rx_ind(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_rx_indication_t ind; + recv_p7_message(p7Sock, &(ind.header), sizeof(ind)); + + CU_ASSERT_EQUAL(ind.header.message_id, NFAPI_RX_ULSCH_INDICATION); + if(ind.header.message_id == NFAPI_RX_ULSCH_INDICATION) + { + printf("decoded nfapi_rx_indication\n"); + } +} + +void send_rach_ind(phy_info_t* phy_info, uint16_t sfn_sf) +{ + nfapi_rach_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_RACH_INDICATION; + ind.header.phy_id = phy_info->phy_id; + ind.sfn_sf = sfn_sf; + + nfapi_pnf_p7_rach_ind((phy_info->config), &ind); +} +void recieve_rach_ind(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_rach_indication_t ind; + recv_p7_message(p7Sock, &(ind.header), sizeof(ind)); + + CU_ASSERT_EQUAL(ind.header.message_id, NFAPI_RACH_INDICATION); + if(ind.header.message_id == NFAPI_RACH_INDICATION) + { + printf("decoded nfapi_rach_indication\n"); + } +} + +void send_srs_ind(phy_info_t* phy_info, uint16_t sfn_sf) +{ + nfapi_srs_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_SRS_INDICATION; + ind.header.phy_id = phy_info->phy_id; + ind.sfn_sf = sfn_sf; + + nfapi_pnf_p7_srs_ind((phy_info->config), &ind); +} +void recieve_srs_ind(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_srs_indication_t ind; + recv_p7_message(p7Sock, &(ind.header), sizeof(ind)); + + CU_ASSERT_EQUAL(ind.header.message_id, NFAPI_SRS_INDICATION); + if(ind.header.message_id == NFAPI_SRS_INDICATION) + { + printf("decoded nfapi_srs_indication\n"); + } +} + +void send_sr_ind(phy_info_t* phy_info, uint16_t sfn_sf) +{ + nfapi_sr_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_RX_SR_INDICATION; + ind.header.phy_id = phy_info->phy_id; + ind.sfn_sf = sfn_sf; + + nfapi_pnf_p7_sr_ind((phy_info->config), &ind); +} +void recieve_sr_ind(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_sr_indication_t ind; + recv_p7_message(p7Sock, &(ind.header), sizeof(ind)); + + CU_ASSERT_EQUAL(ind.header.message_id, NFAPI_RX_SR_INDICATION); + if(ind.header.message_id == NFAPI_RX_SR_INDICATION) + { + printf("decoded nfapi_sr_indication\n"); + } +} + +void send_cqi_ind(phy_info_t* phy_info, uint16_t sfn_sf) +{ + nfapi_cqi_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_RX_CQI_INDICATION; + ind.header.phy_id = phy_info->phy_id; + ind.sfn_sf = sfn_sf; + + nfapi_pnf_p7_cqi_ind((phy_info->config), &ind); +} +void recieve_cqi_ind(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_cqi_indication_t ind; + recv_p7_message(p7Sock, &(ind.header), sizeof(ind)); + + CU_ASSERT_EQUAL(ind.header.message_id, NFAPI_RX_CQI_INDICATION); + if(ind.header.message_id == NFAPI_RX_CQI_INDICATION) + { + printf("decoded nfapi_cqi_indication\n"); + } +} + +void send_lbt_dl_ind(phy_info_t* phy_info, uint16_t sfn_sf) +{ + nfapi_lbt_dl_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_LBT_DL_INDICATION; + ind.header.phy_id = phy_info->phy_id; + ind.sfn_sf = sfn_sf; + + nfapi_pnf_p7_lbt_dl_ind((phy_info->config), &ind); +} +void recieve_lbt_dl_ind(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_lbt_dl_indication_t ind; + recv_p7_message(p7Sock, &(ind.header), sizeof(ind)); + + CU_ASSERT_EQUAL(ind.header.message_id, NFAPI_LBT_DL_INDICATION); + if(ind.header.message_id == NFAPI_LBT_DL_INDICATION) + { + printf("decoded nfapi_lbt_dl_indication\n"); + } +} + +void send_nb_harq_ind(phy_info_t* phy_info, uint16_t sfn_sf) +{ + nfapi_nb_harq_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_NB_HARQ_INDICATION; + ind.header.phy_id = phy_info->phy_id; + ind.sfn_sf = sfn_sf; + + nfapi_pnf_p7_nb_harq_ind((phy_info->config), &ind); +} +void recieve_nb_harq_ind(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_nb_harq_indication_t ind; + recv_p7_message(p7Sock, &(ind.header), sizeof(ind)); + + CU_ASSERT_EQUAL(ind.header.message_id, NFAPI_NB_HARQ_INDICATION); + if(ind.header.message_id == NFAPI_NB_HARQ_INDICATION) + { + printf("decoded nfapi_nb_harq_indication\n"); + } +} + +void send_nrach_ind(phy_info_t* phy_info, uint16_t sfn_sf) +{ + nfapi_nrach_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_NRACH_INDICATION; + ind.header.phy_id = phy_info->phy_id; + ind.sfn_sf = sfn_sf; + + nfapi_pnf_p7_nrach_ind((phy_info->config), &ind); +} +void recieve_nrach_ind(int p7Sock, int phy_id, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_nrach_indication_t ind; + recv_p7_message(p7Sock, &(ind.header), sizeof(ind)); + + CU_ASSERT_EQUAL(ind.header.message_id, NFAPI_NRACH_INDICATION); + if(ind.header.message_id == NFAPI_NRACH_INDICATION) + { + printf("decoded nfapi_nrach_indication\n"); + } +} + +void pnf_test_start_connect(void) +{ + pnf_info_t pnf_info; + pnf_info.num_phys = 1; + pnf_info.phys[0].pnf_p7_port = 9345; + pnf_info.phys[0].pnf_p7_addr = "127.0.0.1"; + pnf_info.phys[0].vnf_p7_port = 8875; + pnf_info.phys[0].vnf_p7_addr = "127.0.0.1"; + + char* vnf_addr = "127.0.0.1"; + int vnf_port = 6699; + + int p5ListenSock = create_p5_listen_socket(vnf_addr, vnf_port); + printf("p5ListenSock %d %d\n", p5ListenSock, errno); + listen(p5ListenSock, 2); + + test_param_request_called = 0; + test_config_request_called = 0; + + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + config->vnf_ip_addr = vnf_addr; + config->vnf_p5_port = vnf_port; + config->pnf_param_req = &test_pnf_param_request; + config->pnf_config_req = &test_pnf_config_request; + config->pnf_start_req = &test_pnf_start_request; + config->pnf_stop_req = &test_pnf_stop_request; + config->param_req = &test_param_request; + config->config_req = &test_config_request; + config->start_req = &test_start_request; + config->stop_req = &test_stop_request; + + config->user_data = &pnf_info; + + pthread_t thread; + pthread_create(&thread, NULL, &pnf_test_start_thread, config); + + struct sockaddr_in addr; + socklen_t addrSize = sizeof(addr);; + int p5Sock = accept(p5ListenSock, (struct sockaddr *)&addr, &addrSize); + printf("p5 connection accepted %d %d\n", p5Sock, errno); + + send_pnf_param_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_param_response(p5Sock, NFAPI_MSG_OK); + + send_pnf_config_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_config_response(p5Sock); + + send_pnf_start_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_start_response(p5Sock); + + send_param_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_param_response(p5Sock); + + + send_config_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize, &pnf_info); + receive_config_response(p5Sock); + + send_start_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_start_response(p5Sock); + + sleep(2); + + int p7Sock = socket(AF_INET, SOCK_DGRAM, 0); + + { + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(pnf_info.phys[0].vnf_p7_port); + addr.sin_addr.s_addr = INADDR_ANY; + + bind(p7Sock, (struct sockaddr*)&addr, sizeof(addr)); + } + + printf("Sending p7 messages too %s:%d\n", pnf_info.phys[0].pnf_p7_addr, pnf_info.phys[0].pnf_p7_port); + + struct sockaddr_in p7_addr; + p7_addr.sin_family = AF_INET; + p7_addr.sin_port = htons(pnf_info.phys[0].pnf_p7_port); + p7_addr.sin_addr.s_addr = inet_addr(pnf_info.phys[0].pnf_p7_addr); + socklen_t p7_addrSize = sizeof(p7_addr); + + send_dl_node_sync(p7Sock, 0, &p7_addr, p7_addrSize); + receive_ul_node_sync(p7Sock); + + +#define SFNSF(_sfn, _sf) ((_sfn << 4) + _sf) + + uint16_t sfn_sf = SFNSF(500, 3); // sfn:500 sf:3 + pnf_info.phys[0].sfn_sf = sfn_sf; + send_subframe_indication(&(pnf_info.phys[0])); + + // should generate dummy messages + + usleep(500); + + sfn_sf = SFNSF(500, 4); // sfn:500 sf:4 + pnf_info.phys[0].sfn_sf = sfn_sf; + + send_dl_config_req(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + send_ul_config_req(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + send_hi_dci0_req(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + send_tx_req(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + + + usleep(500); + + send_subframe_indication(&(pnf_info.phys[0])); + // should send the cached messages + + send_harq_ind(&pnf_info.phys[0], sfn_sf); + recieve_harq_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_crc_ind(&pnf_info.phys[0], sfn_sf); + recieve_crc_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_rx_ind(&pnf_info.phys[0], sfn_sf); + recieve_rx_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_rach_ind(&pnf_info.phys[0], sfn_sf); + recieve_rach_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_srs_ind(&pnf_info.phys[0], sfn_sf); + recieve_srs_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_sr_ind(&pnf_info.phys[0], sfn_sf); + recieve_sr_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_cqi_ind(&pnf_info.phys[0], sfn_sf); + recieve_cqi_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_lbt_dl_ind(&pnf_info.phys[0], sfn_sf); + recieve_lbt_dl_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_nb_harq_ind(&pnf_info.phys[0], sfn_sf); + recieve_nb_harq_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_nrach_ind(&pnf_info.phys[0], sfn_sf); + recieve_nrach_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + + // send out of window dl_config, should expect the timing info + send_dl_config_req(p7Sock, 0, &p7_addr, p7_addrSize, SFNSF(600, 0)); + + sfn_sf = SFNSF(500, 5); // sfn:500 sf:4 + pnf_info.phys[0].sfn_sf = sfn_sf; + usleep(500); + + send_subframe_indication(&(pnf_info.phys[0])); + receive_timing_info(p7Sock); + + send_stop_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_stop_response(p5Sock); + + + + send_pnf_stop_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_stop_response(p5Sock); + + nfapi_pnf_stop(config); + + int* result; + pthread_join(thread, (void**)&result); + //CU_ASSERT_NOT_EQUAL(*result, -1); + CU_ASSERT_EQUAL(test_param_request_called, 1); + CU_ASSERT_EQUAL(test_config_request_called, 1); + + close(p5Sock); + close(p5ListenSock); + +} +void pnf_test_start_connect_ipv6(void) +{ + pnf_info_t pnf_info; + pnf_info.num_phys = 1; + pnf_info.phys[0].pnf_p7_port = 9345; + pnf_info.phys[0].pnf_p7_addr = "::1"; + pnf_info.phys[0].vnf_p7_port = 8875; + pnf_info.phys[0].vnf_p7_addr = "::1"; + + char* vnf_addr = "::1"; + int vnf_port = 6698; + + int p5ListenSock = create_p5_ipv6_listen_socket(vnf_addr, vnf_port); + printf("p5ListenSock ipv6 %d %d\n", p5ListenSock, errno); + int listen_result = listen(p5ListenSock, 2); + printf("Listen result %d\n", listen_result); + + test_param_request_called = 0; + test_config_request_called = 0; + + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + config->vnf_ip_addr = vnf_addr; + config->vnf_p5_port = vnf_port; + config->pnf_param_req = &test_pnf_param_request; + config->pnf_config_req = &test_pnf_config_request; + config->pnf_start_req = &test_pnf_start_request; + config->pnf_stop_req = &test_pnf_stop_request; + config->param_req = &test_param_request; + config->config_req = &test_config_request; + config->start_req = &test_start_request; + config->stop_req = &test_stop_request; + + config->user_data = &pnf_info; + + pthread_t thread; + pthread_create(&thread, NULL, &pnf_test_start_thread, config); + + struct sockaddr_in6 addr; + socklen_t addrSize = sizeof(addr);; + int p5Sock = accept(p5ListenSock, (struct sockaddr *)&addr, &addrSize); + printf("p5 connection accepted %d %d\n", p5Sock, errno); + + send_pnf_param_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_param_response(p5Sock, NFAPI_MSG_OK); + + send_pnf_config_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_config_response(p5Sock); + + send_pnf_start_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_start_response(p5Sock); + + send_param_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_param_response(p5Sock); +} + +void pnf_test_state_pnf_config_invalid_state() +{ + char* vnf_addr = "127.0.0.1"; + int vnf_port = 4546; + + int p5ListenSock = create_p5_listen_socket(vnf_addr, vnf_port); + + test_param_request_called = 0; + test_config_request_called = 0; + + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + config->vnf_ip_addr = vnf_addr; + config->vnf_p5_port = vnf_port; + config->pnf_param_req = &test_pnf_param_request; + config->pnf_config_req = &test_pnf_config_request; + + pthread_t thread; + pthread_create(&thread, NULL, &pnf_test_start_thread, config); + + listen(p5ListenSock, 2); + struct sockaddr_in addr; + socklen_t addrSize = sizeof(addr); + int p5Sock = accept(p5ListenSock, (struct sockaddr *)&addr, &addrSize); + printf("%s p5Sock %d errno %d\n", __FUNCTION__, p5Sock, errno); + + send_pnf_param_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_param_response(p5Sock, NFAPI_MSG_OK); + + send_pnf_config_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_config_response(p5Sock); + + send_pnf_param_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_param_response(p5Sock, NFAPI_MSG_INVALID_STATE); + + nfapi_pnf_stop(config); + + int* result; + pthread_join(thread, (void**)&result); + CU_ASSERT_EQUAL(result, 0); + CU_ASSERT_EQUAL(test_param_request_called, 1); + CU_ASSERT_EQUAL(test_config_request_called, 1); + + close(p5Sock); + close(p5ListenSock); + +} + +void pnf_test_state_pnf_param_invalid_state() +{ + pnf_info_t pnf_info; + + char* vnf_addr = "127.0.0.1"; + int vnf_port = 4547; + + int p5ListenSock = create_p5_listen_socket(vnf_addr, vnf_port); + + test_param_request_called = 0; + test_config_request_called = 0; + + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + config->vnf_ip_addr = vnf_addr; + config->vnf_p5_port = vnf_port; + config->pnf_param_req = &test_pnf_param_request; + config->pnf_config_req = &test_pnf_config_request; + + config->user_data = &pnf_info; + + pthread_t thread; + pthread_create(&thread, NULL, &pnf_test_start_thread, config); + + listen(p5ListenSock, 2); + struct sockaddr_in addr; + socklen_t addrSize = sizeof(addr); + int p5Sock = accept(p5ListenSock, (struct sockaddr *)&addr, &addrSize); + + send_pnf_param_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_param_response(p5Sock, NFAPI_MSG_OK); + + send_pnf_config_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_config_response(p5Sock); + + send_pnf_config_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_config_response(p5Sock); + + nfapi_pnf_stop(config); + + int* result; + pthread_join(thread, (void**)&result); + CU_ASSERT_EQUAL(result, 0); + CU_ASSERT_EQUAL(test_param_request_called, 1); + CU_ASSERT_EQUAL(test_config_request_called, 2); + + close(p5Sock); + close(p5ListenSock); + +} +void pnf_test_p7_segmentation_test_1(void) +{ + pnf_info_t pnf_info; + pnf_info.num_phys = 1; + pnf_info.phys[0].pnf_p7_port = 9348; + pnf_info.phys[0].pnf_p7_addr = "127.0.0.1"; + pnf_info.phys[0].vnf_p7_port = 8878; + pnf_info.phys[0].vnf_p7_addr = "127.0.0.1"; + + char* vnf_addr = "127.0.0.1"; + int vnf_port = 6699; + + int p5ListenSock = create_p5_listen_socket(vnf_addr, vnf_port); + printf("p5ListenSock %d %d\n", p5ListenSock, errno); + listen(p5ListenSock, 2); + + test_param_request_called = 0; + test_config_request_called = 0; + + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + config->vnf_ip_addr = vnf_addr; + config->vnf_p5_port = vnf_port; + config->pnf_param_req = &test_pnf_param_request; + config->pnf_config_req = &test_pnf_config_request; + config->pnf_start_req = &test_pnf_start_request; + config->pnf_stop_req = &test_pnf_stop_request; + config->param_req = &test_param_request; + config->config_req = &test_config_request; + config->start_req = &test_start_request; + config->stop_req = &test_stop_request; + + config->user_data = &pnf_info; + + pthread_t thread; + pthread_create(&thread, NULL, &pnf_test_start_thread, config); + + struct sockaddr_in addr; + socklen_t addrSize = sizeof(addr);; + int p5Sock = accept(p5ListenSock, (struct sockaddr *)&addr, &addrSize); + printf("p5 connection accepted %d %d\n", p5Sock, errno); + + send_pnf_param_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_param_response(p5Sock, NFAPI_MSG_OK); + + send_pnf_config_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_config_response(p5Sock); + + send_pnf_start_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_start_response(p5Sock); + + send_param_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_param_response(p5Sock); + + + send_config_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize, &pnf_info); + receive_config_response(p5Sock); + + send_start_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_start_response(p5Sock); + + sleep(2); + + int p7Sock = socket(AF_INET, SOCK_DGRAM, 0); + + { + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(pnf_info.phys[0].vnf_p7_port); + addr.sin_addr.s_addr = INADDR_ANY; + + bind(p7Sock, (struct sockaddr*)&addr, sizeof(addr)); + } + + printf("Sending p7 messages too %s:%d\n", pnf_info.phys[0].pnf_p7_addr, pnf_info.phys[0].pnf_p7_port); + + struct sockaddr_in p7_addr; + p7_addr.sin_family = AF_INET; + p7_addr.sin_port = htons(pnf_info.phys[0].pnf_p7_port); + p7_addr.sin_addr.s_addr = inet_addr(pnf_info.phys[0].pnf_p7_addr); + socklen_t p7_addrSize = sizeof(p7_addr); + + send_dl_node_sync(p7Sock, 0, &p7_addr, p7_addrSize); + receive_ul_node_sync(p7Sock); + + +#define SFNSF(_sfn, _sf) ((_sfn << 4) + _sf) + + uint16_t sfn_sf = SFNSF(500, 3); // sfn:500 sf:3 + pnf_info.phys[0].sfn_sf = sfn_sf; + send_subframe_indication(&(pnf_info.phys[0])); + + // should generate dummy messages + + usleep(500); + + sfn_sf = SFNSF(500, 4); // sfn:500 sf:4 + pnf_info.phys[0].sfn_sf = sfn_sf; + + send_dl_config_req(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + send_ul_config_req(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + send_hi_dci0_req(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + send_tx_req_1(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + + + usleep(500); + + send_subframe_indication(&(pnf_info.phys[0])); + // should send the cached messages + + send_harq_ind(&pnf_info.phys[0], sfn_sf); + recieve_harq_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_crc_ind(&pnf_info.phys[0], sfn_sf); + recieve_crc_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_rx_ind(&pnf_info.phys[0], sfn_sf); + recieve_rx_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_rach_ind(&pnf_info.phys[0], sfn_sf); + recieve_rach_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_srs_ind(&pnf_info.phys[0], sfn_sf); + recieve_srs_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_sr_ind(&pnf_info.phys[0], sfn_sf); + recieve_sr_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_cqi_ind(&pnf_info.phys[0], sfn_sf); + recieve_cqi_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_lbt_dl_ind(&pnf_info.phys[0], sfn_sf); + recieve_lbt_dl_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_nb_harq_ind(&pnf_info.phys[0], sfn_sf); + recieve_nb_harq_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_nrach_ind(&pnf_info.phys[0], sfn_sf); + recieve_nrach_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + + // send out of window dl_config, should expect the timing info + send_dl_config_req(p7Sock, 0, &p7_addr, p7_addrSize, SFNSF(600, 0)); + + sfn_sf = SFNSF(500, 5); // sfn:500 sf:4 + pnf_info.phys[0].sfn_sf = sfn_sf; + usleep(500); + + send_subframe_indication(&(pnf_info.phys[0])); + receive_timing_info(p7Sock); + + nfapi_pnf_p7_stop(pnf_info.phys[0].config); + int* result; + pthread_join(pnf_info.phys[0].thread, (void**)&result); + close(p7Sock); + + send_stop_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_stop_response(p5Sock); + + send_pnf_stop_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_stop_response(p5Sock); + + nfapi_pnf_stop(config); + + pthread_join(thread, (void**)&result); + //CU_ASSERT_NOT_EQUAL(*result, -1); + CU_ASSERT_EQUAL(test_param_request_called, 1); + CU_ASSERT_EQUAL(test_config_request_called, 1); + + close(p5Sock); + close(p5ListenSock); + +} +void pnf_test_p7_segmentation_test_2(void) +{ + pnf_info_t pnf_info; + pnf_info.num_phys = 1; + pnf_info.phys[0].pnf_p7_port = 9348; + pnf_info.phys[0].pnf_p7_addr = "127.0.0.1"; + pnf_info.phys[0].vnf_p7_port = 8878; + pnf_info.phys[0].vnf_p7_addr = "127.0.0.1"; + + char* vnf_addr = "127.0.0.1"; + int vnf_port = 6699; + + int p5ListenSock = create_p5_listen_socket(vnf_addr, vnf_port); + printf("p5ListenSock %d %d\n", p5ListenSock, errno); + listen(p5ListenSock, 2); + + test_param_request_called = 0; + test_config_request_called = 0; + + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + config->vnf_ip_addr = vnf_addr; + config->vnf_p5_port = vnf_port; + config->pnf_param_req = &test_pnf_param_request; + config->pnf_config_req = &test_pnf_config_request; + config->pnf_start_req = &test_pnf_start_request; + config->pnf_stop_req = &test_pnf_stop_request; + config->param_req = &test_param_request; + config->config_req = &test_config_request; + config->start_req = &test_start_request; + config->stop_req = &test_stop_request; + + config->user_data = &pnf_info; + + pthread_t thread; + pthread_create(&thread, NULL, &pnf_test_start_thread, config); + + struct sockaddr_in addr; + socklen_t addrSize = sizeof(addr);; + int p5Sock = accept(p5ListenSock, (struct sockaddr *)&addr, &addrSize); + printf("p5 connection accepted %d %d\n", p5Sock, errno); + + send_pnf_param_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_param_response(p5Sock, NFAPI_MSG_OK); + + send_pnf_config_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_config_response(p5Sock); + + send_pnf_start_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_start_response(p5Sock); + + send_param_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_param_response(p5Sock); + + + send_config_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize, &pnf_info); + receive_config_response(p5Sock); + + send_start_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_start_response(p5Sock); + + sleep(2); + + int p7Sock = socket(AF_INET, SOCK_DGRAM, 0); + + { + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(pnf_info.phys[0].vnf_p7_port); + addr.sin_addr.s_addr = INADDR_ANY; + + bind(p7Sock, (struct sockaddr*)&addr, sizeof(addr)); + } + + printf("Sending p7 messages too %s:%d\n", pnf_info.phys[0].pnf_p7_addr, pnf_info.phys[0].pnf_p7_port); + + struct sockaddr_in p7_addr; + p7_addr.sin_family = AF_INET; + p7_addr.sin_port = htons(pnf_info.phys[0].pnf_p7_port); + p7_addr.sin_addr.s_addr = inet_addr(pnf_info.phys[0].pnf_p7_addr); + socklen_t p7_addrSize = sizeof(p7_addr); + + send_dl_node_sync(p7Sock, 0, &p7_addr, p7_addrSize); + receive_ul_node_sync(p7Sock); + + +#define SFNSF(_sfn, _sf) ((_sfn << 4) + _sf) + + uint16_t sfn_sf = SFNSF(500, 3); // sfn:500 sf:3 + pnf_info.phys[0].sfn_sf = sfn_sf; + send_subframe_indication(&(pnf_info.phys[0])); + + // should generate dummy messages + + usleep(500); + + sfn_sf = SFNSF(500, 4); // sfn:500 sf:4 + pnf_info.phys[0].sfn_sf = sfn_sf; + + send_dl_config_req(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + send_ul_config_req(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + send_hi_dci0_req(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + send_tx_req_2(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + + + usleep(500); + + send_subframe_indication(&(pnf_info.phys[0])); + // should send the cached messages + + send_harq_ind(&pnf_info.phys[0], sfn_sf); + recieve_harq_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_crc_ind(&pnf_info.phys[0], sfn_sf); + recieve_crc_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_rx_ind(&pnf_info.phys[0], sfn_sf); + recieve_rx_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_rach_ind(&pnf_info.phys[0], sfn_sf); + recieve_rach_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_srs_ind(&pnf_info.phys[0], sfn_sf); + recieve_srs_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_sr_ind(&pnf_info.phys[0], sfn_sf); + recieve_sr_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_cqi_ind(&pnf_info.phys[0], sfn_sf); + recieve_cqi_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_lbt_dl_ind(&pnf_info.phys[0], sfn_sf); + recieve_lbt_dl_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + // send out of window dl_config, should expect the timing info + send_dl_config_req(p7Sock, 0, &p7_addr, p7_addrSize, SFNSF(600, 0)); + + sfn_sf = SFNSF(500, 5); // sfn:500 sf:4 + pnf_info.phys[0].sfn_sf = sfn_sf; + usleep(500); + + send_subframe_indication(&(pnf_info.phys[0])); + receive_timing_info(p7Sock); + + send_stop_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_stop_response(p5Sock); + + nfapi_pnf_p7_stop(pnf_info.phys[0].config); + int* result; + pthread_join(pnf_info.phys[0].thread, (void**)&result); + close(p7Sock); + + + send_pnf_stop_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_stop_response(p5Sock); + + nfapi_pnf_stop(config); + + pthread_join(thread, (void**)&result); + //CU_ASSERT_NOT_EQUAL(*result, -1); + CU_ASSERT_EQUAL(test_param_request_called, 1); + CU_ASSERT_EQUAL(test_config_request_called, 1); + + close(p5Sock); + close(p5ListenSock); + +} +void pnf_test_p7_segmentation_test_3(void) +{ + pnf_info_t pnf_info; + pnf_info.num_phys = 1; + pnf_info.phys[0].pnf_p7_port = 9348; + pnf_info.phys[0].pnf_p7_addr = "127.0.0.1"; + pnf_info.phys[0].vnf_p7_port = 8878; + pnf_info.phys[0].vnf_p7_addr = "127.0.0.1"; + + char* vnf_addr = "127.0.0.1"; + int vnf_port = 6699; + + int p5ListenSock = create_p5_listen_socket(vnf_addr, vnf_port); + printf("p5ListenSock %d %d\n", p5ListenSock, errno); + listen(p5ListenSock, 2); + + test_param_request_called = 0; + test_config_request_called = 0; + + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + config->vnf_ip_addr = vnf_addr; + config->vnf_p5_port = vnf_port; + config->pnf_param_req = &test_pnf_param_request; + config->pnf_config_req = &test_pnf_config_request; + config->pnf_start_req = &test_pnf_start_request; + config->pnf_stop_req = &test_pnf_stop_request; + config->param_req = &test_param_request; + config->config_req = &test_config_request; + config->start_req = &test_start_request; + config->stop_req = &test_stop_request; + + config->user_data = &pnf_info; + + pthread_t thread; + pthread_create(&thread, NULL, &pnf_test_start_thread, config); + + struct sockaddr_in addr; + socklen_t addrSize = sizeof(addr);; + int p5Sock = accept(p5ListenSock, (struct sockaddr *)&addr, &addrSize); + printf("p5 connection accepted %d %d\n", p5Sock, errno); + + send_pnf_param_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_param_response(p5Sock, NFAPI_MSG_OK); + + send_pnf_config_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_config_response(p5Sock); + + send_pnf_start_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_start_response(p5Sock); + + send_param_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_param_response(p5Sock); + + + send_config_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize, &pnf_info); + receive_config_response(p5Sock); + + send_start_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_start_response(p5Sock); + + sleep(2); + + int p7Sock = socket(AF_INET, SOCK_DGRAM, 0); + + { + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(pnf_info.phys[0].vnf_p7_port); + addr.sin_addr.s_addr = INADDR_ANY; + + bind(p7Sock, (struct sockaddr*)&addr, sizeof(addr)); + } + + printf("Sending p7 messages too %s:%d\n", pnf_info.phys[0].pnf_p7_addr, pnf_info.phys[0].pnf_p7_port); + + struct sockaddr_in p7_addr; + p7_addr.sin_family = AF_INET; + p7_addr.sin_port = htons(pnf_info.phys[0].pnf_p7_port); + p7_addr.sin_addr.s_addr = inet_addr(pnf_info.phys[0].pnf_p7_addr); + socklen_t p7_addrSize = sizeof(p7_addr); + + send_dl_node_sync(p7Sock, 0, &p7_addr, p7_addrSize); + receive_ul_node_sync(p7Sock); + + +#define SFNSF(_sfn, _sf) ((_sfn << 4) + _sf) + + uint16_t sfn_sf = SFNSF(500, 3); // sfn:500 sf:3 + pnf_info.phys[0].sfn_sf = sfn_sf; + send_subframe_indication(&(pnf_info.phys[0])); + + // should generate dummy messages + + usleep(500); + + sfn_sf = SFNSF(500, 4); // sfn:500 sf:4 + pnf_info.phys[0].sfn_sf = sfn_sf; + + + send_dl_subframe_msgs_interleaved(p7Sock, 0, &p7_addr, p7_addrSize, sfn_sf); + + + usleep(500); + + send_subframe_indication(&(pnf_info.phys[0])); + // should send the cached messages + + send_harq_ind(&pnf_info.phys[0], sfn_sf); + recieve_harq_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_crc_ind(&pnf_info.phys[0], sfn_sf); + recieve_crc_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_rx_ind(&pnf_info.phys[0], sfn_sf); + recieve_rx_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_rach_ind(&pnf_info.phys[0], sfn_sf); + recieve_rach_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_srs_ind(&pnf_info.phys[0], sfn_sf); + recieve_srs_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_sr_ind(&pnf_info.phys[0], sfn_sf); + recieve_sr_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_cqi_ind(&pnf_info.phys[0], sfn_sf); + recieve_cqi_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + send_lbt_dl_ind(&pnf_info.phys[0], sfn_sf); + recieve_lbt_dl_ind(p7Sock, 0, &p7_addr, p7_addrSize); + + // send out of window dl_config, should expect the timing info + printf("Sending late dl config req\n"); + send_dl_config_req(p7Sock, 0, &p7_addr, p7_addrSize, SFNSF(600, 0)); + + sfn_sf = SFNSF(500, 5); // sfn:500 sf:4 + pnf_info.phys[0].sfn_sf = sfn_sf; + sleep(2); + + printf("Sending subframe indication\n"); + send_subframe_indication(&(pnf_info.phys[0])); + printf("Waitning for timing info\n"); + receive_timing_info(p7Sock); + + printf("Sending stop request\n"); + send_stop_request(p5Sock, 0, (struct sockaddr*)&addr, addrSize); + receive_stop_response(p5Sock); + + printf("Waiting for P7 thread to stop\n"); + nfapi_pnf_p7_stop(pnf_info.phys[0].config); + int* result; + pthread_join(pnf_info.phys[0].thread, (void**)&result); + close(p7Sock); + + + send_pnf_stop_request(p5Sock, (struct sockaddr*)&addr, addrSize); + receive_pnf_stop_response(p5Sock); + + nfapi_pnf_stop(config); + + pthread_join(thread, (void**)&result); + //CU_ASSERT_NOT_EQUAL(*result, -1); + CU_ASSERT_EQUAL(test_param_request_called, 1); + CU_ASSERT_EQUAL(test_config_request_called, 1); + + close(p5Sock); + close(p5ListenSock); + +} + +/************* Test Runner Code goes here **************/ + +int main ( void ) +{ + CU_pSuite pSuite = NULL; + + /* initialize the CUnit test registry */ + if ( CUE_SUCCESS != CU_initialize_registry() ) + return CU_get_error(); + + /* add a suite to the registry */ + pSuite = CU_add_suite( "pnf_test_suite", init_suite, clean_suite ); + if ( NULL == pSuite ) { + CU_cleanup_registry(); + return CU_get_error(); + } + + /* add the tests to the suite */ + if ( (NULL == CU_add_test(pSuite, "pnf_test_start_no_config", pnf_test_start_no_config)) || + (NULL == CU_add_test(pSuite, "pnf_test_start_no_ip", pnf_test_start_no_ip)) || + (NULL == CU_add_test(pSuite, "pnf_test_start_invalid_ip", pnf_test_start_invalid_ip)) || + (NULL == CU_add_test(pSuite, "pnf_test_start_no_connection", pnf_test_start_no_connection)) || + (NULL == CU_add_test(pSuite, "pnf_test_start_connect", pnf_test_start_connect)) || + (NULL == CU_add_test(pSuite, "pnf_test_start_pnf_config_invalid_state", pnf_test_state_pnf_config_invalid_state)) || + (NULL == CU_add_test(pSuite, "pnf_test_start_pnf_param_invalid_state", pnf_test_state_pnf_param_invalid_state)) || + (NULL == CU_add_test(pSuite, "pnf_test_p7_segmentation_test_1", pnf_test_p7_segmentation_test_1)) || + (NULL == CU_add_test(pSuite, "pnf_test_p7_segmentation_test_2", pnf_test_p7_segmentation_test_2)) || + (NULL == CU_add_test(pSuite, "pnf_test_p7_segmentation_test_3", pnf_test_p7_segmentation_test_3)) + ) + { + CU_cleanup_registry(); + return CU_get_error(); + } + + //(NULL == CU_add_test(pSuite, "pnf_test_start_connect_ipv6", pnf_test_start_connect_ipv6)) || + + // Run all tests using the basic interface + CU_basic_set_mode(CU_BRM_VERBOSE); + CU_set_output_filename("pnf_unit_test_results.xml"); + CU_basic_run_tests(); + + CU_pSuite s = CU_get_registry()->pSuite; + int count = 0; + while(s) + { + CU_pTest t = s->pTest; + while(t) + { + count++; + t = t->pNext; + } + s = s->pNext; + } + + printf("%d..%d\n", 1, count); + + + + s = CU_get_registry()->pSuite; + count = 1; + while(s) + { + CU_pTest t = s->pTest; + while(t) + { + int pass = 1; + CU_FailureRecord* failures = CU_get_failure_list(); + while(failures) + { + if(strcmp(failures->pSuite->pName, s->pName) == 0 && + strcmp(failures->pTest->pName, t->pName) == 0) + { + pass = 0; + failures = 0; + } + else + { + failures = failures->pNext; + } + } + + if(pass) + printf("ok %d - %s:%s\n", count, s->pName, t->pName); + else + printf("not ok %d - %s:%s\n", count, s->pName, t->pName); + + count++; + t = t->pNext; + } + s = s->pNext; + } + + // Clean up registry and return + CU_cleanup_registry(); + return CU_get_error(); + +} diff --git a/nfapi/open-nFAPI/pnf_sim/Makefile.am b/nfapi/open-nFAPI/pnf_sim/Makefile.am new file mode 100644 index 0000000000..c8d9d8ddd4 --- /dev/null +++ b/nfapi/open-nFAPI/pnf_sim/Makefile.am @@ -0,0 +1,22 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +AUTOMAKE_OPTIONS=subdir-objects +AM_CPPFLAGS = -I$(top_srcdir)/pnf_sim/inc -I$(top_srcdir)/sim_common/inc -I$(top_srcdir)/pnf/public_inc -I$(top_srcdir)/common/inc -I$(top_srcdir)/common/public_inc -I$(top_srcdir)/nfapi/public_inc -I$(top_srcdir)/nfapi/inc $(XML_CFLAGS) -g +AM_CXXFLAGS = -I$(top_srcdir)/pnf_sim/inc -I$(top_srcdir)/sim_common/inc -I$(top_srcdir)/pnf/public_inc -I$(top_srcdir)/common/inc -I$(top_srcdir)/common/public_inc -I$(top_srcdir)/nfapi/public_inc -I$(top_srcdir)/nfapi/inc $(XML_CFLAGS) -std=c++11 $(BOOST_CPPFLAGS) -g +bin_PROGRAMS = pnfsim +pnfsim_SOURCES = src/main.cpp src/fapi_stub.cpp +LDADD= $(top_builddir)/pnf/libnfapi_pnf.a $(top_builddir)/common/libnfapi_common.a $(top_builddir)/nfapi/libnfapi.a $(top_builddir)/sim_common/libnfapi_sim_common.a -L$(libdir) -lpthread -lrt -lsctp -lz diff --git a/nfapi/open-nFAPI/pnf_sim/inc/fapi_interface.h b/nfapi/open-nFAPI/pnf_sim/inc/fapi_interface.h new file mode 100644 index 0000000000..b1d44eab8b --- /dev/null +++ b/nfapi/open-nFAPI/pnf_sim/inc/fapi_interface.h @@ -0,0 +1,1800 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _FAPI_INTERFACE_H_ +#define _FAPI_INTERFACE_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; + +#define FAPI_PARAM_REQUEST 0x00 +#define FAPI_PARAM_RESPONSE 0x01 +#define FAPI_CONFIG_REQUEST 0x02 +#define FAPI_CONFIG_RESPONSE 0x03 +#define FAPI_START_REQUEST 0x04 +#define FAPI_STOP_REQUEST 0x05 +#define FAPI_STOP_INDICATION 0x06 +#define FAPI_UE_CONFIG_REQUEST 0x07 +#define FAPI_UE_CONFIG_RESPONSE 0x08 +#define FAPI_ERROR_INDICATION 0x09 +#define FAPI_UE_RELEASE_REQUEST 0x0A +#define FAPI_UE_RELEASE_RESPONSE 0x0B +#define FAPI_DL_CONFIG_REQUEST 0x80 +#define FAPI_UL_CONFIG_REQUEST 0x81 +#define FAPI_SUBFRAME_INDICATION 0x82 +#define FAPI_HI_DCI0_REQUEST 0x83 +#define FAPI_TX_REQUEST 0x84 +#define FAPI_HARQ_INDICATION 0x85 +#define FAPI_CRC_INDICATION 0x86 +#define FAPI_RX_ULSCH_INDICATION 0x87 +#define FAPI_RACH_INDICATION 0x88 +#define FAPI_SRS_INDICATION 0x89 +#define FAPI_RX_SR_INDICATION 0x8A +#define FAPI_RX_CQI_INDICATION 0x8B +#define FAPI_LBT_DL_CONFIG_REQUEST 0x8C +#define FAPI_LBT_DL_INDICATION 0x8D +#define FAPI_NB_HARQ_INDICATION 0x8E +#define FAPI_NRACH_INDICATION 0x8F + + + + +#define FAPI_SUBFRAME_DUPLEX_MODE_TAG 0x01 +#define FAPI_SUBFRAME_PCFICH_POWER_OFFSET_TAG 0x02 +#define FAPI_SUBFRAME_PB_TAG 0x03 +#define FAPI_SUBFRAME_DL_CYCLIC_PREFIX_TYPE_TAG 0x04 +#define FAPI_SUBFRAME_UL_CYCLIC_PREFIX_TYPE_TAG 0x05 +#define FAPI_RF_DL_CHANNEL_BANDWIDTH_TAG 0x0A +#define FAPI_RF_UL_CHANNEL_BANDWIDTH_TAG 0x0B +#define FAPI_RF_REFERENCE_SIGNAL_POWER_TAG 0x0C +#define FAPI_RF_TX_ANTENNA_PORTS_TAG 0x0D +#define FAPI_RF_RX_ANTENNA_PORTS_TAG 0x0E +#define FAPI_PHICH_RESOURCE_TAG 0x14 +#define FAPI_PHICH_DURATION_TAG 0x15 +#define FAPI_PHICH_POWER_OFFSET_TAG 0x16 +#define FAPI_SCH_PRIMARY_SYNC_SIGNAL_TAG 0x1E +#define FAPI_SCH_SECONDARY_SYNC_SIGNAL_TAG 0x1F +#define FAPI_SCH_PHYSICAL_CELL_ID_TAG 0x20 +#define FAPI_PRACH_CONFIGURATION_INDEX_TAG 0x28 +#define FAPI_PRACH_ROOT_SEQUENCE_INDEX_TAG 0x29 +#define FAPI_PRACH_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG 0x2A +#define FAPI_PRACH_HIGH_SPEED_FLAG_TAG 0x2B +#define FAPI_PRACH_FREQUENCY_OFFSET_TAG 0x2C +#define FAPI_PUSCH_HOPPING_MODE_TAG 0x32 +#define FAPI_PUSCH_HOPPING_OFFSET_TAG 0x33 +#define FAPI_PUSCH_NUMBER_OF_SUBBANDS_TAG 0x34 +#define FAPI_PUCCH_DELTA_PUCCH_SHIFT_TAG 0x3C +#define FAPI_PUCCH_N_CQI_RB_TAG 0x3D +#define FAPI_PUCCH_N_AN_CS_TAG 0x3E +#define FAPI_PUCCH_N1_PUCCH_AN_TAG 0x3F +#define FAPI_SRS_BANDWIDTH_CONFIGURATION_TAG 0x46 +#define FAPI_SRS_MAX_UP_PTS_TAG 0x47 +#define FAPI_SRS_SUBFRAME_CONFIGURATION_TAG 0x48 +#define FAPI_SRS_ACK_NACK_SRS_SIMULTANEOUS_TX_TAG 0x49 +#define FAPI_UL_REF_SIG_UPLINK_RS_HOPPING_TAG 0x50 +#define FAPI_UL_REF_SIG_GROUP_ASSIGNMENT_TAG 0x51 +#define FAPI_UL_REF_SIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG 0x52 +#define FAPI_TDD_SUBFRAME_ASSIGNMENT_TAG 0x5A +#define FAPI_TDD_SPECIAL_SUBFRAME_PATTERNS_TAG 0x5B + +#define FAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG 0x64 +#define FAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG 0x65 +#define FAPI_LAA_CONFIG_PD_THRESHOLD_TAG 0x66 +#define FAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG 0x67 +#define FAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG 0x68 +#define FAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG 0x69 +#define FAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG 0x6A +#define FAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG 0x6B + +#define FAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLED_R13_TAG 0x78 +#define FAPI_EMTC_CONFIG_PRACH_CAT_M_ROOT_SEQUENCY_INDEX_TAG 0x79 +#define FAPI_EMTC_CONFIG_PRACH_CAT_M_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG 0x7A +#define FAPI_EMTC_CONFIG_PRACH_CAT_M_HIGH_SPEED_FLAG_TAG 0x7B +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG 0x7C +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG 0x7D +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG 0x7E +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0x7F +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG 0x80 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG 0x81 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG 0x82 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG 0x83 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG 0x84 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG 0x85 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0x86 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG 0x87 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG 0x88 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG 0x89 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG 0x8A +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG 0x8B +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG 0x8C +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0x8D +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG 0x8E +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG 0x8F +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG 0x90 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG 0x91 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG 0x92 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG 0x93 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0x94 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG 0x95 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG 0x96 +#define FAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG 0x97 +#define FAPI_EMTC_CONFIG_PRACH_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG 0x98 +#define FAPI_EMTC_CONFIG_PRACH_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG 0x99 + +#define FAPI_NB_IOT_OPERATING_MODE_TAG 0xA5 +#define FAPI_NB_IOT_ANCHOR_TAG 0xA6 +#define FAPI_NB_IOT_PRB_INDEX_TAG 0xA7 +#define FAPI_NB_IOT_CONTROL_REGION_SIZE_TAG 0xA8 +#define FAPI_NB_IOT_ASSUMED_CRS_APS_TAG 0xA9 +#define FAPI_NB_IOT_NPRACH_CONFIG_0_ENABLE_TAG 0xAA +#define FAPI_NB_IOT_NPRACH_CONFIG_0_SF_PERIODCITY_TAG 0xAB +#define FAPI_NB_IOT_NPRACH_CONFIG_0_START_TIME_TAG 0xAC +#define FAPI_NB_IOT_NPRACH_CONFIG_0_SUBCARRIER_OFFSET_TAG 0xAD +#define FAPI_NB_IOT_NPRACH_CONFIG_0_NUMBER_OF_SUBCARRIERS_TAG 0xAE +#define FAPI_NB_IOT_NPRACH_CONFIG_0_CP_LENGTH_TAG 0xAD +#define FAPI_NB_IOT_NPRACH_CONFIG_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0xB0 +#define FAPI_NB_IOT_NPRACH_CONFIG_1_ENABLE_TAG 0xB1 +#define FAPI_NB_IOT_NPRACH_CONFIG_1_SF_PERIODCITY_TAG 0xB2 +#define FAPI_NB_IOT_NPRACH_CONFIG_1_START_TIME_TAG 0xB3 +#define FAPI_NB_IOT_NPRACH_CONFIG_1_SUBCARRIER_OFFSET_TAG 0xB4 +#define FAPI_NB_IOT_NPRACH_CONFIG_1_NUMBER_OF_SUBCARRIERS_TAG 0xB5 +#define FAPI_NB_IOT_NPRACH_CONFIG_1_CP_LENGTH_TAG 0xB6 +#define FAPI_NB_IOT_NPRACH_CONFIG_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0xB7 +#define FAPI_NB_IOT_NPRACH_CONFIG_2_ENABLE_TAG 0xB8 +#define FAPI_NB_IOT_NPRACH_CONFIG_2_SF_PERIODCITY_TAG 0xB9 +#define FAPI_NB_IOT_NPRACH_CONFIG_2_START_TIME_TAG 0xBA +#define FAPI_NB_IOT_NPRACH_CONFIG_2_SUBCARRIER_OFFSET_TAG 0xBB +#define FAPI_NB_IOT_NPRACH_CONFIG_2_NUMBER_OF_SUBCARRIERS_TAG 0xBC +#define FAPI_NB_IOT_NPRACH_CONFIG_2_CP_LENGTH_TAG 0xBD +#define FAPI_NB_IOT_NPRACH_CONFIG_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG 0xBE + +#define FAPI_NB_IOT_THREE_TONE_BASE_SEQUENCE_TAG 0xBF +#define FAPI_NB_IOT_SIX_TONE_BASE_SEQUENCE_TAG 0xC0 +#define FAPI_NB_IOT_TWELVE_TONE_BASE_SEQUENCE_TAG 0xC1 +#define FAPI_NB_IOT_THREE_TONE_CYCLIC_SHIFT_TAG 0xC2 +#define FAPI_NB_IOT_SIX_TONE_CYCLIC_SHIFT_TAG 0xC3 +#define FAPI_NB_IOT_DL_GAP_CONFIG_ENABLE_TAG 0xC4 +#define FAPI_NB_IOT_DL_GAP_THRESHOLD_TAG 0xC5 +#define FAPI_NB_IOT_DL_GAP_PERIODICITY_TAG 0xC6 +#define FAPI_NB_IOT_DL_GAP_DURATION_COEFFICIENT_TAG 0xC7 + +//... +#define FAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG 0xC8 +#define FAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG 0xC9 +#define FAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG 0xCA +#define FAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG 0xCB +#define FAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG 0xCC +#define FAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG 0xCD +#define FAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG 0xCE +#define FAPI_PHY_CAPABILITIES_LAA_SUPPORT_TAG 0xD1 +#define FAPI_PHY_CAPABILITIES_LAA_PD_SENSING_LBT_SUPPORT_TAG 0xD2 +#define FAPI_PHY_CAPABILITIES_LAA_MULTI_CARRIER_LBT_SUPPORT_TAG 0xD3 +#define FAPI_PHY_CAPABILITIES_LAA_PARTIAL_SF_SUPPORT_TAG 0xD4 +#define FAPI_PHY_CAPABILITIES_NB_IOT_SUPPORT_TAG 0xD5 +#define FAPI_PHY_CAPABILITIES_NB_IOT_OPERATING_MODE_CAPABILITY_TAG 0xD6 + +#define FAPI_PHY_CAPABILITIES_DATA_REPORT_MODE_TAG 0xF0 +#define FAPI_PHY_SFN_SF_TAG 0xF1 +#define FAPI_PHY_STATE_TAG 0xFA + +#define FAPI_MSG_OK 0x0 +#define FAPI_MSG_INVALID_STATE 0x1 +#define FAPI_MSG_INVALID_CONFIG 0x2 +#define FAPI_MSG_SFN_OUT_OF_SYNC 0x3 +#define FAPI_MSG_SUBFRAME_ERR 0x4 +#define FAPI_MSG_BCH_MISSING 0x5 +#define FAPI_MSG_INVALID_SFN 0x6 +#define FAPI_MSG_HI_ERR 0x7 +#define FAPI_MSG_TX_ERR 0x8 + +#define FAPI_MSG_LBT_NO_PDU_IN_DL_REQ 0x9 +#define FAPI_MSG_LBT_NO_VALID_CONFIG_REQ_RECIEVED 0xA +#define FAPI_MSG_FAPI_E_LBT_SF_SFN_PASSED_END_SF_SFN 0xB +#define FAPI_MSG_FAPI_E_LBT_OVERLAP 0xC +#define FAPI_MSG_BCH_PRESENT 0xD +#define FAPI_MSG_NBIOT_UNEXPECTED_REQ 0xE + + +// TODO : Work out what the correct maximums should be + +// Number of UL/DL configurations, I, as defined by 36.212 section 5.3.3.1.4 +// todo : work out what the max is +#define FAPI_MAX_UL_DL_CONFIGURATIONS 4 +#define FAPI_MAX_NUM_PHYSICAL_ANTENNAS 4 +#define FAPI_MAX_NUM_SCHEDULED_UES 8 +#define FAPI_MAX_NUM_SUBBANDS 8 +#define FAPI_MAX_ANTENNA_PORT_COUNT 2 + + +typedef struct { + uint8_t message_id; + uint16_t length; +} fapi_header_t; + +typedef struct { + uint8_t tag; + uint8_t length; + uint16_t value; +} fapi_tlv_t; + +typedef struct { + fapi_header_t header; +} fapi_param_req_t; + +typedef struct { + fapi_header_t header; + uint8_t error_code; + uint8_t number_of_tlvs; + fapi_tlv_t tlvs[255]; +} fapi_param_resp_t; + +typedef struct { + fapi_header_t header; + uint8_t number_of_tlvs; + fapi_tlv_t tlvs[255]; +} fapi_config_req_t; + +typedef struct { + fapi_header_t header; + uint8_t error_code; + uint8_t number_of_invalid_tlvs; + uint8_t number_of_missing_tlvs; + fapi_tlv_t tlvs[255]; +} fapi_config_resp_t; + +typedef struct { + fapi_header_t header; +} fapi_start_req_t; + +typedef struct { + fapi_header_t header; +} fapi_stop_req_t; + +typedef struct { + fapi_header_t header; +} fapi_stop_ind_t; + +typedef struct { + uint16_t received_sfn_sf; + uint16_t expected_sfn_sf; +} fapi_sfn_out_of_sync_error_ind_t; + +typedef struct { + uint16_t received_sfn_sf; + uint16_t expected_sfn_sf; +} fapi_invalid_sfn_error_ind_t; + +typedef struct { + uint8_t sub_error_code; + uint8_t direction; + uint16_t rnti; + uint8_t pdu_type; +} fapi_pdu_error_ind_t; + +typedef struct { + uint8_t sub_error_code; + uint8_t phich_lowest_ul_rb_index; +} fapi_hi_error_ind_t; + +typedef struct { + uint8_t sub_error_code; + uint8_t pdu_index; +} fapi_tx_error_ind_t; + +typedef struct { + fapi_header_t header; + uint8_t message_id; + uint8_t error_code; + union + { + fapi_sfn_out_of_sync_error_ind_t out_of_sync_err; + fapi_invalid_sfn_error_ind_t invalid_sfn_err; + fapi_pdu_error_ind_t pdu_err; + fapi_hi_error_ind_t hi_err; + fapi_tx_error_ind_t tx_err; + }; +} fapi_error_ind_t; + +typedef struct { + uint32_t handle; + uint16_t rnti; +} fapi_rx_ue_information_t; + +typedef struct { + uint8_t ul_cqi; + uint8_t channel; +} fapi_ul_cqi_information_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; +} fapi_subframe_ind_t; + +typedef struct { + uint8_t value_0; + uint8_t value_1; +} fapi_harq_ind_rel8_tdd_harq_data_bundling_t; + +typedef struct { + uint8_t value_0; + uint8_t value_1; + uint8_t value_2; + uint8_t value_3; +} fapi_harq_ind_rel8_tdd_harq_data_multiplexing_t; + +typedef struct { + uint8_t value_0; +} fapi_harq_ind_rel8_tdd_harq_data_special_bundling_t; + +typedef struct { + uint8_t mode; + uint8_t number_of_ack_nack; + union{ + fapi_harq_ind_rel8_tdd_harq_data_bundling_t bundling; + fapi_harq_ind_rel8_tdd_harq_data_multiplexing_t multiplex; + fapi_harq_ind_rel8_tdd_harq_data_special_bundling_t special_bundling; + } harq_data; +} fapi_harq_ind_rel8_tdd_pdu_t; + +typedef struct { + uint8_t value_0; +} fapi_harq_ind_rel8_tdd_harq_data_t; + + +typedef struct { + uint8_t mode; + uint8_t number_of_ack_nack; + union{ + fapi_harq_ind_rel8_tdd_harq_data_t bundling; + fapi_harq_ind_rel8_tdd_harq_data_t multiplex; + fapi_harq_ind_rel8_tdd_harq_data_special_bundling_t special_bundling; + fapi_harq_ind_rel8_tdd_harq_data_t channel_selection; + fapi_harq_ind_rel8_tdd_harq_data_t format_3; + } harq_data[21]; +} fapi_harq_ind_rel9_tdd_pdu_t; + +typedef struct { + uint8_t mode; + uint16_t number_of_ack_nack; + union{ + fapi_harq_ind_rel8_tdd_harq_data_t bundling; + fapi_harq_ind_rel8_tdd_harq_data_t multiplex; + fapi_harq_ind_rel8_tdd_harq_data_special_bundling_t special_bundling; + fapi_harq_ind_rel8_tdd_harq_data_t channel_selection; + fapi_harq_ind_rel8_tdd_harq_data_t format_3; + fapi_harq_ind_rel8_tdd_harq_data_t format_4; + fapi_harq_ind_rel8_tdd_harq_data_t format_5; + } harq_data[22]; +} fapi_harq_ind_rel13_tdd_pdu_t; + +typedef struct { + uint8_t harq_tb_1; + uint8_t harq_tb_2; +} fapi_harq_ind_rel8_fdd_pdu_t; + +typedef struct { + uint8_t mode; + uint8_t number_of_ack_nack; + uint8_t harq_tb_n[10]; +} fapi_harq_ind_rel9_fdd_pdu_t; + +typedef struct { + uint8_t mode; + uint16_t number_of_ack_nack; + uint8_t harq_tb_n[22]; +} fapi_harq_ind_rel13_fdd_pdu_t; + +typedef struct { + fapi_rx_ue_information_t rx_ue_info; + union { + fapi_harq_ind_rel8_tdd_pdu_t rel8_tdd_pdu; + fapi_harq_ind_rel9_tdd_pdu_t rel9_tdd_pdu; + fapi_harq_ind_rel13_tdd_pdu_t rel13_tdd_pdu; + fapi_harq_ind_rel8_fdd_pdu_t rel8_fdd_pdu; + fapi_harq_ind_rel9_fdd_pdu_t rel9_fdd_pdu; + fapi_harq_ind_rel13_fdd_pdu_t rel13_fdd_pdu; + }; + fapi_ul_cqi_information_t ul_cqi_info; +} fapi_harq_ind_pdu_t; + +typedef struct { + uint16_t number_of_harqs; + fapi_harq_ind_pdu_t pdus[32]; +} fapi_harq_ind_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_harq_ind_body_t body; +} fapi_harq_ind_t; + +typedef struct { + uint8_t crc_flag; +} fapi_crc_ind_rel8_pdu_t; + +typedef struct { + fapi_rx_ue_information_t rx_ue_info; + fapi_crc_ind_rel8_pdu_t rel8_pdu; +} fapi_crc_ind_pdu_t; + +typedef struct { + uint16_t number_of_crcs; + fapi_crc_ind_pdu_t pdus[32]; +} fapi_crc_ind_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_crc_ind_body_t body; +} fapi_crc_ind_t; + +typedef struct { + uint16_t length; + uint16_t data_offset; + uint8_t ul_cqi; + uint16_t timing_advance; +} fapi_rx_ulsch_ind_rel8_pdu_t; + +typedef struct { + uint16_t timing_advance_r9; +} fapi_rx_ulsch_ind_rel9_pdu_t; + +typedef struct { + fapi_rx_ue_information_t rx_ue_info; + fapi_rx_ulsch_ind_rel8_pdu_t rel8_pdu; + fapi_rx_ulsch_ind_rel9_pdu_t rel9_pdu; +} fapi_rx_ulsch_ind_pdu_t; + +typedef struct { + uint16_t number_of_pdus; + fapi_rx_ulsch_ind_pdu_t pdus[32]; + void* data[32]; +} fapi_rx_ulsch_ind_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_rx_ulsch_ind_body_t body; +} fapi_rx_ulsch_ind_t; + +typedef struct { + uint16_t length; + uint16_t data_offset; + uint8_t ul_cqi; + uint8_t ri; + uint16_t timing_advance; +} fapi_rx_cqi_ind_rel8_pdu_t; + +typedef struct { + uint16_t length; + uint16_t data_offset; + uint8_t ul_cqi; + uint8_t number_of_cc_reported; + uint8_t ri[5]; + uint16_t timing_advance; + uint16_t timing_advance_r9; +} fapi_rx_cqi_ind_rel9_pdu_t; + +typedef struct { + fapi_rx_ue_information_t rx_ue_info; + fapi_rx_cqi_ind_rel8_pdu_t rel8_pdu; + fapi_rx_cqi_ind_rel9_pdu_t rel9_pdu; + fapi_ul_cqi_information_t ul_cqi_info; +} fapi_rx_cqi_ind_pdu_t; + +typedef struct { + uint16_t number_of_pdus; + fapi_rx_cqi_ind_pdu_t pdus[32]; + uint8_t* data[32]; +} fapi_rx_cqi_ind_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_rx_cqi_ind_body_t body; +} fapi_rx_cqi_ind_t; + +typedef struct { + fapi_rx_ue_information_t rx_ue_info; + fapi_ul_cqi_information_t ul_cqi_info; +} fapi_rx_sr_ind_pdu_t; + +typedef struct { + uint16_t number_of_srs; + fapi_rx_sr_ind_pdu_t pdus[32]; +} fapi_rx_sr_ind_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_rx_sr_ind_body_t body; +} fapi_rx_sr_ind_t; + +typedef struct { + uint16_t rnti; + uint8_t preamble; + uint16_t timing_advance; +} fapi_rach_ind_pdu_rel8_t; + +typedef struct { + uint16_t timing_advance_r9; +} fapi_rach_ind_pdu_rel9_t; + +typedef struct { + uint8_t rach_resource_type; +} fapi_rach_ind_pdu_rel13_t; + +typedef struct { + fapi_rach_ind_pdu_rel8_t rel8_pdu; + fapi_rach_ind_pdu_rel9_t rel9_pdu; + fapi_rach_ind_pdu_rel13_t rel13_pdu; +} fapi_rach_ind_pdu_t; + +typedef struct { + uint8_t number_of_preambles; + fapi_rach_ind_pdu_t pdus[32]; +} fapi_rach_ind_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_rach_ind_body_t body; +} fapi_rach_ind_t; + + +typedef struct { + uint16_t doppler_estimation; + uint16_t timing_advance; + uint8_t number_of_resource_blocks; + uint8_t rb_start; + uint8_t snr[100]; +} fapi_srs_ind_rel8_pdu_t; + +typedef struct { + uint16_t timing_advance_r9; +} fapi_srs_ind_rel9_pdu_t; + +typedef struct { + uint8_t uppts_symbol; +} fapi_srs_ind_rel10_tdd_pdu_t; + +typedef struct { + uint16_t ul_rtoa; +} fapi_srs_ind_rel11_pdu_t; + +typedef struct { + uint8_t num_prb_per_subband; + uint8_t number_of_subbands; + uint8_t num_atennas; + struct { + uint8_t subband_index; + uint16_t channel[FAPI_MAX_NUM_PHYSICAL_ANTENNAS]; + } subands[FAPI_MAX_NUM_SUBBANDS]; +} fapi_ttd_channel_measurement_t; + +typedef struct { + fapi_rx_ue_information_t rx_ue_info; + fapi_srs_ind_rel8_pdu_t rel8_pdu; + fapi_srs_ind_rel9_pdu_t rel9_pdu; + fapi_srs_ind_rel10_tdd_pdu_t rel10_tdd_pdu; + fapi_srs_ind_rel11_pdu_t rel11_pdu; + fapi_ttd_channel_measurement_t tdd_channel_measurement; +} fapi_srs_ind_pdu_t; + +typedef struct { + uint8_t number_of_ues; + fapi_srs_ind_pdu_t pdus[32]; +} fapi_srs_ind_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_srs_ind_body_t body; +} fapi_srs_ind_t; + + +typedef struct { + uint32_t handle; + uint32_t result; + uint32_t lte_txop_symbols; + uint32_t initial_partial_sf; +} fapi_lbt_dl_pdsch_rsp_rel13_pdu_t; + +typedef struct { + fapi_lbt_dl_pdsch_rsp_rel13_pdu_t rel13_pdu; +} fapi_lbt_dl_pdsch_rsp_pdu_t; + +typedef struct { + uint32_t handle; + uint32_t result; +} fapi_lbt_dl_drs_rsp_rel13_pdu_t; + +typedef struct { + fapi_lbt_dl_drs_rsp_rel13_pdu_t rel13_pdu; +} fapi_lbt_dl_drs_rsp_pdu_t; + +typedef struct { + uint8_t pdu_type; + uint8_t pdu_size; + union { + fapi_lbt_dl_pdsch_rsp_pdu_t lbt_pdsch_rsp_pdu; + fapi_lbt_dl_drs_rsp_pdu_t lbt_drs_rsp_pdu; + }; +} fapi_lbt_dl_ind_pdu_t; + +typedef struct { + uint16_t number_of_pdus; + fapi_lbt_dl_ind_pdu_t pdus[32]; +} fapi_lbt_dl_ind_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_lbt_dl_ind_body_t body; +} fapi_lbt_dl_ind_t; + +typedef struct { + uint8_t harq_tb1; +} fapi_nb_harq_ind_rel13_pdu_t; + +typedef struct { + fapi_rx_ue_information_t rx_ue_info; + union { + fapi_nb_harq_ind_rel13_pdu_t rel13_pdu; + }; + fapi_ul_cqi_information_t ul_cqi_info; +} fapi_nb_harq_ind_pdu_t; + +typedef struct { + uint16_t number_of_harqs; + fapi_nb_harq_ind_pdu_t pdus[32]; +} fapi_nb_harq_ind_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_nb_harq_ind_body_t body; +} fapi_nb_harq_ind_t; + +typedef struct { + uint16_t rnti; + uint8_t initial_sc; + uint16_t timing_advance; + uint8_t nrach_cs_level; +} fapi_nrach_ind_rel13_pdu_t; + +typedef struct { + fapi_rx_ue_information_t rx_ue_info; + union { + fapi_nrach_ind_rel13_pdu_t rel13_pdu; + }; + fapi_ul_cqi_information_t ul_cqi_info; +} fapi_nrach_ind_pdu_t; + +typedef struct { + uint16_t number_of_initial_scs_detected; + fapi_nrach_ind_pdu_t pdus[32]; +} fapi_nrach_ind_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_nrach_ind_body_t body; +} fapi_nrach_ind_t; + +//------------------------------------------------------------------------------ + +typedef struct { + uint8_t dci_format; + uint8_t cce_index; + uint8_t aggregation_level; + uint16_t rnti; + uint8_t resource_allocation_type; + uint8_t virtual_resource_block_assignment_flag; + uint32_t resource_block_coding; + uint8_t mcs_1; + uint8_t redundancy_version_1; + uint8_t new_data_indicator_1; + uint8_t transport_block_to_codeword_swap_flag; + uint8_t mcs_2; + uint8_t redundancy_version_2; + uint8_t new_data_indictor_2; + uint8_t harq_process; + uint8_t tpmi; + uint8_t pmi; + uint8_t precoding_information; + uint8_t tpc; + uint8_t downlink_assignment_index; + uint8_t n_gap; + uint8_t transport_block_size_index; + uint8_t downlink_power_offset; + uint8_t allocate_prach_flag; + uint8_t preamble_index; + uint8_t prach_mask_index; + uint8_t rnti_type; + uint16_t transmission_power; +} fapi_dl_config_dci_rel8_pdu_t; + +typedef struct { + uint8_t mcch_flag; + uint8_t mcch_change_notification; + uint8_t scrambling_identity; +} fapi_dl_config_dci_rel9_pdu_t; + +typedef struct { + uint8_t cross_carrier_scheduling_flag; + uint8_t carrier_indicator; + uint8_t srs_flag; + uint8_t srs_request; + uint8_t antenna_ports_scrambling_and_layers; + uint8_t total_dci_length_including_padding; + uint8_t n_dl_rb; +} fapi_dl_config_dci_rel10_pdu_t; + +typedef struct { + uint8_t harq_ack_resource_offset; + uint8_t pdsch_re_mapping_quasi_co_location_indicator; +} fapi_dl_config_dci_rel11_pdu_t; + +typedef struct { + uint8_t primary_cell_type; + uint8_t ul_dl_configuration_flag; + uint8_t number_ul_dl_configurations; + uint8_t ul_dl_configuration_indication[FAPI_MAX_UL_DL_CONFIGURATIONS]; +} fapi_dl_config_dci_rel12_pdu_t; + + +typedef struct { + uint8_t subband_index; + uint8_t scheduled_ues; + uint16_t precoding_value[FAPI_MAX_NUM_PHYSICAL_ANTENNAS][FAPI_MAX_NUM_SCHEDULED_UES]; +} fapi_dl_config_dci_dl_tpm_subband_info_t; + +typedef struct { + uint8_t num_prb_per_subband; + uint8_t number_of_subbands; + uint8_t num_antennas; + fapi_dl_config_dci_dl_tpm_subband_info_t subband_info[FAPI_MAX_NUM_SUBBANDS]; +} fapi_dl_config_dci_dl_tpm_t; + +typedef struct { + uint8_t laa_end_partial_sf_flag; + uint8_t laa_end_partial_sf_configuration; + uint8_t initial_lbt_sf; + uint8_t codebook_size_determination; + uint8_t drms_table_flag; + uint8_t tpm_struct_flag; + fapi_dl_config_dci_dl_tpm_t tpm; +} fapi_dl_config_dci_rel13_pdu_t; + +typedef struct { + fapi_dl_config_dci_rel8_pdu_t rel8_pdu; + fapi_dl_config_dci_rel9_pdu_t rel9_pdu; + fapi_dl_config_dci_rel10_pdu_t rel10_pdu; + fapi_dl_config_dci_rel11_pdu_t rel11_pdu; + fapi_dl_config_dci_rel12_pdu_t rel12_pdu; + fapi_dl_config_dci_rel13_pdu_t rel13_pdu; +} fapi_dl_config_dci_pdu_t; + +typedef struct { + uint16_t length; + uint16_t pdu_index; + uint16_t transmission_power; +} fapi_dl_config_bch_rel8_pdu_t; + +typedef struct { + fapi_dl_config_bch_rel8_pdu_t rel8_pdu; +} fapi_dl_config_bch_pdu_t; + +typedef struct { + uint16_t length; + uint16_t pdu_index; + uint16_t rnti; + uint8_t resource_allocation_type; + uint32_t resource_block_coding; + uint8_t modulation; + uint16_t transmission_power; + uint16_t mbsfn_area_id; +} fapi_dl_config_mch_rel8_pdu_t; + +typedef struct { + fapi_dl_config_mch_rel8_pdu_t rel8_pdu; +} fapi_dl_config_mch_pdu_t; + +typedef struct { + uint8_t subband_index; + uint8_t num_atennas; + uint16_t bf_value[8]; +} fapi_dl_config_bf_vector_t; + +typedef struct { + uint16_t length; + uint16_t pdu_index; + uint16_t rnti; + uint8_t resource_allocation_type; + uint8_t virtual_resource_block_assignment_flag; + uint32_t resource_block_coding; + uint8_t modulation; + uint8_t redundacy_version; + uint8_t transport_blocks; + uint8_t transport_block_codeword_swap_flag; + uint8_t transmission_scheme; + uint8_t number_of_layers; + uint8_t nunber_of_subands; + uint8_t codebook_index[13]; + uint8_t ue_category_capacity; + uint8_t p_a; + uint8_t delta_power_offset_index; + uint8_t n_gap; + uint8_t n_prb; + uint8_t transmission_mode; + uint8_t num_bf_prb_per_subband; + uint8_t num_bf_vecitor; + fapi_dl_config_bf_vector_t bf_vector[8]; +} fapi_dl_config_dlsch_rel8_pdu_t; + +typedef struct { + uint8_t nscid; +} fapi_dl_config_dlsch_rel9_pdu_t; + +typedef struct { + uint8_t csi_rs_flag; + uint8_t csi_rs_resource_config_r10; + uint16_t csi_rs_zero_tx_power_resource_config_bitmap_r10; + uint8_t csi_rs_number_nzp_configuration; + uint8_t csi_rs_resource_config[4]; + uint8_t pdsch_start; +} fapi_dl_config_dlsch_rel10_pdu_t; + +typedef struct { + uint8_t drms_config_flag; + uint16_t drms_scrambling; + uint8_t csi_config_flag; + uint16_t csi_scrambling; + uint8_t pdsch_re_mapping_flag; + uint8_t pdsch_re_mapping_atenna_ports; + uint8_t pdsch_re_mapping_freq_shift; +} fapi_dl_config_dlsch_rel11_pdu_t; + +typedef struct { + uint8_t altcqi_table_r12; + uint8_t maxlayers; + uint8_t n_dl_harq; +} fapi_dl_config_dlsch_rel12_pdu_t; + +typedef struct { + uint8_t dwpts_symbols; + uint8_t initial_lbt_sf; + uint8_t ue_type; + uint8_t pdsch_payload_type; + uint16_t initial_transmission_sf_io; + uint8_t drms_table_flag; +} fapi_dl_config_dlsch_rel13_pdu_t; + +typedef struct { + fapi_dl_config_dlsch_rel8_pdu_t rel8_pdu; + fapi_dl_config_dlsch_rel9_pdu_t rel9_pdu; + fapi_dl_config_dlsch_rel10_pdu_t rel10_pdu; + fapi_dl_config_dlsch_rel11_pdu_t rel11_pdu; + fapi_dl_config_dlsch_rel12_pdu_t rel12_pdu; + fapi_dl_config_dlsch_rel13_pdu_t rel13_pdu; +} fapi_dl_config_dlsch_pdu_t; + +typedef struct { + uint16_t length; + uint16_t pdu_index; + uint16_t p_rnti; + uint8_t resource_allocation_type; + uint8_t virtual_resource_block_assignment_flag; + uint32_t resource_block_coding; + uint8_t mcs; + uint8_t redudancy_version; + uint8_t number_of_transport_blocks; + uint8_t transport_block_to_codeword_swap_flag; + uint8_t transmission_scheme; + uint8_t number_of_layers; + uint8_t codebook_index; + uint8_t ue_category_capacity; + uint8_t p_a; + uint16_t transmission_power; + uint8_t n_prb; + uint8_t n_gap; +} fapi_dl_config_pch_rel8_pdu_t; + +typedef struct { + uint8_t ue_mode; + uint16_t initial_transmission_sf_io; +} fapi_dl_config_pch_rel13_pdu_t; + +typedef struct { + fapi_dl_config_pch_rel8_pdu_t rel8_pdu; + fapi_dl_config_pch_rel13_pdu_t rel13_pdu; +} fapi_dl_config_pch_pdu_t; + +typedef struct { + uint16_t transmission_power; + uint8_t prs_bandwidth; + uint8_t prs_cyclic_prefix_type; + uint8_t prs_muting; +} fapi_dl_config_prs_rel9_pdu_t; + +typedef struct { + fapi_dl_config_prs_rel9_pdu_t rel9_pdu; +} fapi_dl_config_prs_pdu_t; + +typedef struct { + uint8_t csi_rs_antenna_port_count_r10; + uint8_t csi_rs_resource_config_r10; + uint16_t transmission_power; + uint16_t csi_rs_zero_tx_power_resource_config_bitmap_r10; + uint8_t csi_rs_number_of_nzp_configuration; + uint8_t csi_rs_resource_config[8]; +} fapi_dl_config_csi_rs_rel10_pdu_t; + +typedef struct { + uint8_t csi_rs_class; + uint8_t cdm_type; + uint8_t num_bf_vector; + struct { + uint8_t csi_rs_resource_index; + uint16_t bf_value[FAPI_MAX_ANTENNA_PORT_COUNT]; + } bf_vector[8]; +}fapi_dl_config_csi_rs_rel13_pdu_t; + +typedef struct { + fapi_dl_config_csi_rs_rel10_pdu_t rel10_pdu; + fapi_dl_config_csi_rs_rel13_pdu_t rel13_pdu; +} fapi_dl_config_csi_rs_pdu_t; + +typedef struct { + uint8_t edpcch_resource_assigenment_flag; + uint16_t edpcch_id; + uint8_t epdcch_start_symbol; + uint8_t epdcch_num_prb; + uint8_t epdcch_prb_index[8]; + fapi_dl_config_bf_vector_t bf_vector; +} fapi_dl_config_edpcch_rel11_params_t; + +typedef struct { + uint8_t dwpts_symbols; + uint8_t initial_lbt_sf; +} fapi_dl_config_edpcch_rel13_params_t; + +typedef struct { + fapi_dl_config_dci_rel8_pdu_t rel8_pdu; + fapi_dl_config_dci_rel9_pdu_t rel9_pdu; + fapi_dl_config_dci_rel10_pdu_t rel10_pdu; + fapi_dl_config_dci_rel11_pdu_t rel11_pdu; + fapi_dl_config_dci_rel12_pdu_t rel12_pdu; + fapi_dl_config_dci_rel13_pdu_t rel13_pdu; + fapi_dl_config_edpcch_rel11_params_t rel8_params; + fapi_dl_config_edpcch_rel13_params_t rel13_params; +} fapi_dl_config_edpcch_pdu_t; + +typedef struct { + uint8_t mpdcch_narrow_band; + uint8_t number_of_prb_pairs; + uint8_t resource_block_assignment; + uint8_t mpdcch_tansmission_type; + uint8_t start_symbol; + uint8_t ecce_index; + uint8_t aggregation_level; + uint8_t rnti_type; + uint16_t rnti; + uint8_t ce_mode; + uint16_t drms_scrambling_init; + uint16_t initial_transmission_sf_io; + uint16_t transmission_power; + uint8_t dci_format; + uint16_t resource_block_coding; + uint8_t mcs; + uint8_t pdsch_reptition_levels; + uint8_t redundancy_version; + uint8_t new_data_indicator; + uint8_t harq_process; + uint8_t tpmi_length; + uint8_t tpmi; + uint8_t pmi_flag; + uint8_t pmi; + uint8_t harq_resource_offset; + uint8_t dci_subframe_repetition_number; + uint8_t tpc; + uint8_t downlink_assignment_index_length; + uint8_t downlink_assignment_index; + uint8_t allocate_prach_flag; + uint8_t preamble_index; + uint8_t prach_mask_index; + uint8_t starting_ce_level; + uint8_t srs_request; + uint8_t antenna_ports_and_scrambling_identity_flag; + uint8_t antenna_ports_and_scrambling_identity; + uint8_t frequency_hopping_enabled_flag; + uint8_t paging_direct_indication_differentiation_flag; + uint8_t direct_indication; + uint8_t total_dci_length_including_padding; + uint8_t number_of_tx_antenna_ports; + uint16_t precoding_value[8]; +} fapi_dl_config_mdpcch_rel13_pdu_t; + +typedef struct { + fapi_dl_config_mdpcch_rel13_pdu_t rel13_pdu; +} fapi_dl_config_mdpcch_pdu_t; + +typedef struct { + uint16_t length; + uint16_t pdu_index; + uint16_t transmission_power; + uint16_t hyper_sfn_2_lsbs; +} fapi_dl_config_nbch_rel13_pdu_t; + +typedef struct { + fapi_dl_config_nbch_rel13_pdu_t rel13_pdu; +} fapi_dl_config_nbch_pdu_t; + +typedef struct { + uint16_t length; + uint16_t pdu_index; + uint8_t ncce_index; + uint8_t aggregation_level; + uint8_t start_symbol; + uint8_t rnti_type; + uint16_t rnti; + uint8_t scrambling_reinitialization_batch_index; + uint8_t nrs_antenna_ports_assumed_by_the_ue; + uint8_t dci_format; + uint8_t scheduling_delay; + uint8_t resource_assignment; + uint8_t repetition_number; + uint8_t mcs; + uint8_t new_data_indicator; + uint8_t harq_ack_resource; + uint8_t npdcch_order_indication; + uint8_t starting_number_of_nprach_repetitions; + uint8_t subcarrier_indication_of_nprach; + uint8_t paging_direct_indication_differentation_flag; + uint8_t direct_indication; + uint8_t dci_subframe_repetition_number; + uint8_t total_dci_length_including_padding; +} fapi_dl_config_npdcch_rel13_pdu_t; + +typedef struct { + fapi_dl_config_npdcch_rel13_pdu_t rel13_pdu; +} fapi_dl_config_npdcch_pdu_t; + +typedef struct { + uint16_t length; + uint16_t pdu_index; + uint8_t start_symbol; + uint8_t rnti_type; + uint16_t rnti; + uint16_t resource_assignment; + uint16_t repetition_number; + uint8_t modulation; + uint8_t number_of_subframes_for_resource_assignment; + uint8_t scrambling_sequence_initialization_cinit; + uint16_t sf_idx; + uint8_t nrs_antenna_ports_assumed_by_the_ue; +} fapi_dl_config_ndlsch_rel13_pdu_t; + +typedef struct { + fapi_dl_config_ndlsch_rel13_pdu_t rel13_pdu; +} fapi_dl_config_ndlsch_pdu_t; + +typedef struct { + uint8_t pdu_type; + uint8_t pdu_size; + union + { + fapi_dl_config_dci_pdu_t dci_dl_pdu; + fapi_dl_config_bch_pdu_t bch_pdu; + fapi_dl_config_mch_pdu_t mch_pdu; + fapi_dl_config_dlsch_pdu_t dlsch_pdu; + fapi_dl_config_pch_pdu_t pch_pdu; + fapi_dl_config_prs_pdu_t prs_pdu; + fapi_dl_config_csi_rs_pdu_t csirs_pdu; + fapi_dl_config_edpcch_pdu_t edpcch_pdu; + fapi_dl_config_mdpcch_pdu_t mdpcch_pdu; + fapi_dl_config_nbch_pdu_t nbch_pdu; + fapi_dl_config_npdcch_pdu_t npdcch_pdu; + fapi_dl_config_ndlsch_pdu_t ndlsch_pdu; + }; +} fapi_dl_config_req_pdu_t; + +typedef struct { + uint8_t number_of_pdcch_ofdm_symbols; + uint8_t number_of_dcis; + uint16_t number_of_pdus; + uint8_t number_of_pdsch_rntis; + uint16_t transmission_power_for_pcfich; + fapi_dl_config_req_pdu_t pdus[32]; +} fapi_dl_config_req_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + uint16_t length; + fapi_dl_config_req_body_t body; +} fapi_dl_config_req_t; + +typedef struct { + uint32_t handle; + uint16_t size; + uint16_t rnti; + uint8_t resource_block_start; + uint8_t number_of_resource_blocks; + uint8_t modulation_type; + uint8_t cyclic_shift_2_for_drms; + uint8_t frequency_hopping_enabled_flag; + uint8_t frequency_hopping_bits; + uint8_t new_data_indication; + uint8_t redundancy_version; + uint8_t harq_process_number; + uint8_t ul_tx_mode; + uint8_t current_tx_nb; + uint8_t n_srs; +} fapi_ul_config_req_ulsch_rel8_pdu_t; + +typedef struct { + uint8_t resource_allocation_type; + uint32_t resource_block_coding; + uint8_t transport_blocks; + uint8_t transmission_scheme; + uint8_t number_of_layers; + uint8_t codebook_index; + uint8_t disable_sequence_hopping_flag; +} fapi_ul_config_req_ulsch_rel10_pdu_t; + +typedef struct { + uint8_t virtual_cell_id_enabled_flag; + uint16_t npusch_identity; + uint8_t dmrs_config_flag; + uint16_t ndmrs_csh_identity; +} fapi_ul_config_req_ulsch_rel11_pdu_t; + +typedef struct { + uint8_t ue_type; + uint16_t total_number_of_repetitions; + uint16_t repetition_number; + uint16_t initial_transmission_sf_io; + uint8_t empty_symbols_due_to_re_tunning; +} fapi_ul_config_req_ulsch_rel13_pdu_t; + +typedef struct { + fapi_ul_config_req_ulsch_rel8_pdu_t rel8_pdu; + fapi_ul_config_req_ulsch_rel10_pdu_t rel10_pdu; + fapi_ul_config_req_ulsch_rel11_pdu_t rel11_pdu; + fapi_ul_config_req_ulsch_rel13_pdu_t rel13_pdu; +} fapi_ul_config_req_ulsch_pdu_t; + +typedef struct { + uint8_t dl_cqi_pmi_size_rank_1; + uint8_t dl_cqi_pmi_size_rank_greater_1; + uint8_t ri_size; + uint8_t delta_offset_cqi; + uint8_t delta_offset_ri; +} fapi_ul_config_cqi_ri_rel8_information_t; + +typedef struct { + uint8_t dl_cqi_pmi_ri_size; + uint8_t control_type; +} fapi_ul_config_periodic_cqi_pmi_ri_report_t; + +typedef struct { + uint8_t number_of_cc; + struct { + uint8_t ri_size; + uint8_t dl_cqi_pmi_size; + } cc[5]; +} fapi_ul_config_aperiodic_cqi_pmi_ri_report_t; + +typedef struct { + uint8_t report_type; + uint8_t delta_offset_cqi; + uint8_t delta_offset_ri; + union { + fapi_ul_config_periodic_cqi_pmi_ri_report_t periodic_cqi_pmi_ri_report; + fapi_ul_config_aperiodic_cqi_pmi_ri_report_t aperiodic_cqi_pmi_ri_report; + }; +} fapi_ul_config_cqi_ri_rel9_information_t; + +typedef struct { + uint16_t dl_cqi_pmi_ri_size_2; +} fapi_ul_config_periodic_cqi_pmi_ri_report_re13_t; + +typedef struct { +} fapi_ul_config_aperiodic_cqi_pmi_ri_report_re13_t; + + +typedef struct { + union { + fapi_ul_config_periodic_cqi_pmi_ri_report_re13_t periodic_cqi_pmi_ri_report; + fapi_ul_config_aperiodic_cqi_pmi_ri_report_re13_t aperiodic_cqi_pmi_ri_report; + }; +} fapi_ul_config_cqi_ri_rel13_information_t; + +typedef struct { + fapi_ul_config_cqi_ri_rel8_information_t rel8_info; + fapi_ul_config_cqi_ri_rel9_information_t rel9_cqi_ri_info; + fapi_ul_config_cqi_ri_rel13_information_t rel13_cqi_ri_info; +} fapi_ul_config_cqi_ri_information_t; + +typedef struct { + uint8_t n_srs_initial; + uint8_t initial_number_of_resource_blocks; +} fapi_ul_config_init_tx_rel8_params_t; + +typedef struct { + fapi_ul_config_init_tx_rel8_params_t rel8_params; +} fapi_ul_config_init_tx_params_t; + +typedef struct { + uint8_t harq_size; + uint8_t delta_offset_harq; + uint8_t ack_nack_mode; +} fapi_ul_config_harq_rel10_information_t; + +typedef struct { + uint16_t harq_size_2; + uint8_t delta_offset_harq_2; +} fapi_ul_config_harq_rel13_information_t; + +typedef struct { + fapi_ul_config_harq_rel10_information_t rel10_info; + fapi_ul_config_harq_rel13_information_t rel13_info; +} fapi_ul_config_harq_information_t; + +typedef struct { + uint32_t handle; + uint16_t rnti; +} fapi_ul_config_req_ue_rel8_info_t; + +typedef struct { + uint8_t virtual_cell_id_enabled_flag; + uint16_t npusch_identity; +} fapi_ul_config_req_ue_rel11_info_t; + +typedef struct { + uint8_t ue_type; + uint8_t empty_symbols; + uint16_t total_number_of_repetitions; + uint16_t repetition_number; +} fapi_ul_config_req_ue_rel13_info_t; + +typedef struct { + fapi_ul_config_req_ue_rel8_info_t rel8_info; + fapi_ul_config_req_ue_rel11_info_t rel11_info; + fapi_ul_config_req_ue_rel13_info_t rel13_info; +} fapi_ul_config_req_ue_info_t; + +typedef struct { + uint16_t pucch_index; + uint8_t dl_cqi_pmi_size; +} fapi_ul_config_req_cqi_rel8_info_t; + +typedef struct { + uint8_t number_of_pucch_resource; + uint16_t pucch_index_p1; +} fapi_ul_config_req_cqi_rel10_info_t; + +typedef struct { + uint8_t csi_mode; + uint16_t dl_cqi_pmi_size_2; + uint8_t starting_prb; + uint8_t n_prb; + uint8_t cdm_index; + uint8_t n_srs; +} fapi_ul_config_req_cqi_rel13_info_t; + +typedef struct { + fapi_ul_config_req_cqi_rel8_info_t rel8_info; + fapi_ul_config_req_cqi_rel10_info_t rel10_info; + fapi_ul_config_req_cqi_rel13_info_t rel13_info; +} fapi_ul_config_req_cqi_info_t; + +typedef struct { + uint16_t pucch_index; +} fapi_ul_config_req_sr_rel8_info_t; + +typedef struct { + uint8_t number_of_pucch_resources; + uint16_t pucch_index_p1; +} fapi_ul_config_req_sr_rel10_info_t; + +typedef struct { + fapi_ul_config_req_sr_rel8_info_t rel8_info; + fapi_ul_config_req_sr_rel10_info_t rel10_info; +} fapi_ul_config_req_sr_info_t; + +typedef struct { + uint8_t harq_size; + uint8_t ack_nack_mode; + uint8_t number_of_pucch_resources; + uint16_t n_pucch_1_0; + uint16_t n_pucch_1_1; + uint16_t n_pucch_1_2; + uint16_t n_pucch_1_3; +} fapi_ul_config_req_harq_rel10_tdd_info_t; + +typedef struct { + uint16_t n_pucch_1_0; + uint8_t harq_size; +} fapi_ul_config_req_harq_rel8_fdd_info_t; + +typedef struct { + uint8_t harq_size; + uint8_t ack_nack_mode; + uint8_t number_of_pucch_resources; + uint16_t n_pucch_1_0; + uint16_t n_pucch_1_1; + uint16_t n_pucch_1_2; + uint16_t n_pucch_1_3; +} fapi_ul_config_req_harq_rel9_fdd_info_t; + +typedef struct { + uint8_t num_ant_ports; + uint16_t n_pucch_2_0; + uint16_t n_pucch_2_1; + uint16_t n_pucch_2_2; + uint16_t n_pucch_2_3; +} fapi_ul_config_req_harq_rel11_fdd_tdd_info_t; + +typedef struct { + uint16_t harq_size_2; + uint8_t starting_prb; + uint8_t n_prb; + uint8_t cdm_index; + uint8_t n_srs; +} fapi_ul_config_req_harq_rel13_fdd_tdd_info_t; + +typedef struct { + fapi_ul_config_req_harq_rel10_tdd_info_t rel10_tdd_info; + fapi_ul_config_req_harq_rel8_fdd_info_t rel8_fdd_info; + fapi_ul_config_req_harq_rel9_fdd_info_t rel9_fdd_info; + fapi_ul_config_req_harq_rel11_fdd_tdd_info_t rel11_fdd_tdd_info; + fapi_ul_config_req_harq_rel13_fdd_tdd_info_t rel13_fdd_tdd_info; +} fapi_ul_config_req_harq_info_t; + +typedef struct { + fapi_ul_config_req_ulsch_pdu_t ulsch_pdu; + fapi_ul_config_cqi_ri_information_t cqi_ri_info; + fapi_ul_config_init_tx_params_t init_tx_params; +} fapi_ul_config_req_ulsch_cqi_ri_pdu_t; + +typedef struct { + fapi_ul_config_req_ulsch_pdu_t ulsch_pdu; + fapi_ul_config_harq_information_t harq_info; + fapi_ul_config_init_tx_params_t init_tx_params; +} fapi_ul_config_req_ulsch_harq_pdu_t; + +typedef struct { + fapi_ul_config_req_ulsch_pdu_t ulsch_pdu; + fapi_ul_config_cqi_ri_information_t cqi_ri_info; + fapi_ul_config_harq_information_t harq_info; + fapi_ul_config_init_tx_params_t init_tx_params; +} fapi_ul_config_req_ulsch_cqi_harq_pdu_t; + +typedef struct { + fapi_ul_config_req_ue_info_t ue_info; + fapi_ul_config_req_cqi_info_t cqi_info; +} fapi_ul_config_req_uci_cqi_pdu_t; + +typedef struct { + fapi_ul_config_req_ue_info_t ue_info; + fapi_ul_config_req_sr_info_t sr_info; +} fapi_ul_config_req_uci_sr_pdu_t; + +typedef struct { + fapi_ul_config_req_ue_info_t ue_info; + fapi_ul_config_req_harq_info_t harq_info; +} fapi_ul_config_req_uci_harq_pdu_t; + +typedef struct { + fapi_ul_config_req_ue_info_t ue_info; + fapi_ul_config_req_sr_info_t sr_info; + fapi_ul_config_req_harq_info_t harq_info; +} fapi_ul_config_req_uci_sr_harq_pdu_t; + +typedef struct { + fapi_ul_config_req_ue_info_t ue_info; + fapi_ul_config_req_cqi_info_t cqi_info; + fapi_ul_config_req_harq_info_t harq_info; +} fapi_ul_config_req_uci_cqi_harq_pdu_t; + +typedef struct { + fapi_ul_config_req_ue_info_t ue_info; + fapi_ul_config_req_cqi_info_t cqi_info; + fapi_ul_config_req_sr_info_t sr_info; +} fapi_ul_config_req_uci_cqi_sr_pdu_t; + +typedef struct { + fapi_ul_config_req_ue_info_t ue_info; + fapi_ul_config_req_cqi_info_t cqi_info; + fapi_ul_config_req_sr_info_t sr_info; + fapi_ul_config_req_harq_info_t harq_info; +} fapi_ul_config_req_uci_cqi_sr_harq_pdu_t; + +typedef struct { + uint32_t handle; + uint16_t size; + uint16_t rnti; + uint8_t srs_bandwidth; + uint8_t frqeuency_domain_position; + uint8_t srs_hopping_bandwidth; + uint8_t transmission_comb; + uint16_t srs_config_index; + uint8_t sounding_reference_cyclic_shift; +} fapi_ul_config_req_srs_rel8_pdu_t; + +typedef struct { + uint8_t antenna_port; +} fapi_ul_config_req_srs_rel10_pdu_t; + +typedef struct { + uint8_t number_of_combs; +} fapi_ul_config_req_srs_rel13_pdu_t; + +typedef struct { + fapi_ul_config_req_srs_rel8_pdu_t rel8_pdu; + fapi_ul_config_req_srs_rel10_pdu_t rel10_pdu; + fapi_ul_config_req_srs_rel13_pdu_t rel13_pdu; +} fapi_ul_config_req_srs_pdu_t; + +typedef struct { + fapi_ul_config_req_ue_info_t ue_info; +} fapi_ul_config_req_harq_buffer_pdu_t; + +typedef struct { + fapi_ul_config_req_ulsch_pdu_t ulsch_pdu; + fapi_ul_config_req_cqi_info_t csi_information; +} fapi_ul_config_req_ulsch_uci_csi_pdu_t; + +typedef struct { + fapi_ul_config_req_ulsch_pdu_t ulsch_pdu; + fapi_ul_config_req_harq_info_t harq_information; +} fapi_ul_config_req_ulsch_uci_harq_pdu_t; + +typedef struct { + fapi_ul_config_req_ulsch_pdu_t ulsch_pdu; + fapi_ul_config_req_cqi_info_t csi_information; + fapi_ul_config_req_harq_info_t harq_information; +} fapi_ul_config_req_ulsch_csi_uci_harq_pdu_t; + +typedef struct { + uint8_t harq_ack_resource; +} fapi_ul_config_req_nb_harq_rel13_info_t; + +typedef struct { + fapi_ul_config_req_nb_harq_rel13_info_t nb_harq_pdu_rel13; +} fapi_ul_config_req_nb_harq_info_t; + +typedef struct { + uint8_t nulsch_format; + uint32_t handle; + uint16_t size; + uint16_t rnti; + uint8_t subcarrier_indication; + uint8_t resource_assignment; + uint8_t mcs; + uint8_t redudancy_version; + uint8_t repetition_number; + uint8_t new_data_indication; + uint8_t n_srs; + uint16_t scrambling_sequence_initialization_cinit; + uint16_t sf_idx; + fapi_ul_config_req_ue_info_t ue_information; + fapi_ul_config_req_nb_harq_info_t nb_harq_information; +} fapi_ul_config_req_nulsch_rel13_pdu_t; + +typedef struct { + fapi_ul_config_req_nulsch_rel13_pdu_t nulsch_pdu_rel13; +} fapi_ul_config_req_nulsch_pdu_t; + +typedef struct { + uint8_t nprach_config_0; + uint8_t nprach_config_1; + uint8_t nprach_config_2; +} fapi_ul_config_req_nrach_rel13_pdu_t; + +typedef struct { + fapi_ul_config_req_nrach_rel13_pdu_t nrach_pdu_rel13; +} fapi_ul_config_req_nrach_pdu_t; + +typedef struct { + uint8_t pdu_type; + uint8_t pdu_size; + union + { + fapi_ul_config_req_ulsch_pdu_t ulsch_pdu; + fapi_ul_config_req_ulsch_cqi_ri_pdu_t ulsch_cqi_ri_pdu; + fapi_ul_config_req_ulsch_harq_pdu_t ulsch_harq_pdu; + fapi_ul_config_req_ulsch_cqi_harq_pdu_t ulsch_cqi_harq_pdu; + fapi_ul_config_req_uci_cqi_pdu_t uci_cqi_pdu; + fapi_ul_config_req_uci_sr_pdu_t uci_sr_pdu; + fapi_ul_config_req_uci_harq_pdu_t uci_harq_pdu; + fapi_ul_config_req_uci_sr_harq_pdu_t uci_sr_harq_pdu; + fapi_ul_config_req_uci_cqi_harq_pdu_t uci_cqi_harq_pdu; + fapi_ul_config_req_uci_cqi_sr_pdu_t uci_cqi_sr_pdu; + fapi_ul_config_req_uci_cqi_sr_harq_pdu_t uci_cqi_sr_harq_pdu; + fapi_ul_config_req_srs_pdu_t srs_pdu; + fapi_ul_config_req_harq_buffer_pdu_t harq_buffer_pdu; + fapi_ul_config_req_ulsch_uci_csi_pdu_t ulsch_uci_csi_pdu; + fapi_ul_config_req_ulsch_uci_harq_pdu_t ulsch_uci_harq_pdu; + fapi_ul_config_req_ulsch_csi_uci_harq_pdu_t ulsch_csi_uci_harq_pdu; + fapi_ul_config_req_nulsch_pdu_t nulsch_pdu; + fapi_ul_config_req_nrach_pdu_t nrach_pdu; + }; +} fapi_ul_config_req_pdu_t; + +typedef struct { + uint8_t number_of_pdus; + uint8_t rach_prach_frequency_resources; + uint8_t srs_present; + fapi_ul_config_req_pdu_t* pdus; +} fapi_ul_config_req_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + uint16_t length; + fapi_ul_config_req_body_t body; +} fapi_ul_config_req_t; + +typedef struct { + uint8_t dci_format; + uint8_t cce_index; + uint8_t aggregation_level; + uint8_t rnti; + uint8_t resource_block_start; + uint8_t number_of_resource_blocks; + uint8_t mcs_1; + uint8_t cyclic_shift_2_for_drms; + uint8_t frequency_hopping_enabled_flag; + uint8_t frequency_hopping_flags; + uint8_t new_data_indication_1; + uint8_t ue_tx_antenna_selection; + uint8_t tpc; + uint8_t cqi_csi_request; + uint8_t ul_index; + uint8_t dl_assignment_index; + uint32_t tpc_bitmap; + uint16_t transmission_power; +} fapi_hi_dci0_req_dci0_rel8_pdu_t; + +typedef struct { + uint8_t cross_carrier_scheduling_flag; + uint8_t carrier_indicator; + uint8_t size_of_cqi_csi_feild; + uint8_t srs_flag; + uint8_t srs_request; + uint8_t resource_allocation_flag; + uint8_t resource_allocation_type; + uint32_t resource_block_coding; + uint8_t mcs_2; + uint8_t new_data_indication_2; + uint8_t number_of_antenna_ports; + uint8_t tpmi; + uint8_t total_dci_length_including_padding; + uint8_t n_ul_rb; +} fapi_hi_dci0_req_dci0_rel10_pdu_t; + +typedef struct { + uint8_t pscch_resource; + uint8_t time_resource_pattern; +} fapi_hi_dci0_req_dci0_rel12_pdu_t; + +typedef struct { + fapi_hi_dci0_req_dci0_rel8_pdu_t rel8_pdu; + fapi_hi_dci0_req_dci0_rel10_pdu_t rel10_pdu; + fapi_hi_dci0_req_dci0_rel12_pdu_t rel12_pdu; +} fapi_hi_dci0_req_dci0_pdu_t; + +typedef struct { + uint8_t resource_block_start; + uint8_t cyclic_shift_2_for_drms; + uint8_t hi_value; + uint8_t i_phich; + uint16_t transmission_power; +} fapi_hi_dci0_req_hi_rel8_pdu_t; + +typedef struct { + uint8_t flag_tb2; + uint8_t hi_value_2; +} fapi_hi_dci0_req_hi_rel10_pdu_t; + +typedef struct { + fapi_hi_dci0_req_hi_rel8_pdu_t rel8_pdu; + fapi_hi_dci0_req_hi_rel10_pdu_t rel10_pdu; +} fapi_hi_dci0_req_hi_pdu_t; + +typedef struct { + fapi_dl_config_dci_rel8_pdu_t edpcch_dci_pdu_rel8; + fapi_dl_config_dci_rel10_pdu_t edpcch_dci_pdu_rel10; + fapi_dl_config_edpcch_rel11_params_t edpcch_parameters_rel11; +} fapi_hi_dci0_req_epdcch_dci_ul_pdu_t; + +typedef struct { + uint8_t mpdcch_narrowband; + uint8_t number_of_prb_pairs; + uint8_t resource_block_assignment; + uint8_t mpdcch_transmission_type; + uint8_t start_symbol; + uint8_t ecce_index; + uint8_t aggreagation_level; + uint8_t rnti_type; + uint16_t rnti; + uint8_t ce_mode; + uint16_t drms_scrambling_init; + uint16_t initial_transmission_sf_io; + uint16_t transmission_power; + uint8_t dci_format; + uint8_t resource_block_start; + uint8_t number_of_resource_blocks; + uint8_t mcs; + uint8_t pusch_repetition_levels; + uint8_t frequency_hopping_flag; + uint8_t new_data_indication; + uint8_t harq_process; + uint8_t redudency_version; + uint8_t tpc; + uint8_t csi_request; + uint8_t ul_inex; + uint8_t dai_presence_flag; + uint8_t dl_assignment_index; + uint8_t srs_request; + uint8_t dci_subframe_repetition_number; + uint32_t tcp_bitmap; + uint8_t total_dci_length_include_padding; + uint8_t number_of_tx_antenna_ports; + uint16_t precoding_value[FAPI_MAX_ANTENNA_PORT_COUNT]; +} fapi_hi_dci0_req_mpdcch_dci_ul_rel13_pdu_t; + +typedef struct { + fapi_hi_dci0_req_mpdcch_dci_ul_rel13_pdu_t mpdcch_dci_pdu_rel13; +} fapi_hi_dci0_req_mpdcch_dci_ul_pdu_t; + +typedef struct { + uint8_t ncce_index; + uint8_t aggregation_level; + uint8_t start_symbol; + uint16_t rnti; + uint8_t scrambling_reinitialization_batch_index; + uint8_t nrs_antenna_ports_assumed_by_the_ue; + uint8_t subcarrier_indication; + uint8_t resource_assignment; + uint8_t scheduling_delay; + uint8_t mcs; + uint8_t redudancy_version; + uint8_t repetition_number; + uint8_t new_data_indicator; + uint8_t dci_subframe_repetition_number; +} fapi_hi_dci0_req_npdcch_dci_ul_rel13_pdu_t; + +typedef struct { + fapi_hi_dci0_req_npdcch_dci_ul_rel13_pdu_t npdcch_dci_pdu_rel13; +} fapi_hi_dci0_req_npdcch_dci_ul_pdu_t; + +typedef struct { + uint8_t pdu_type; + uint8_t pdu_size; + union + { + fapi_hi_dci0_req_hi_pdu_t hi_pdu; + fapi_hi_dci0_req_dci0_pdu_t dci0_pdu; + fapi_hi_dci0_req_epdcch_dci_ul_pdu_t edpcch_dci_ul_pdu; + fapi_hi_dci0_req_mpdcch_dci_ul_pdu_t mdpcch_dci_ul_pdu; + fapi_hi_dci0_req_npdcch_dci_ul_pdu_t ndpcch_dci_ul_pdu; + }; +} fapi_hi_dci0_req_pdu_t; + +typedef struct { + uint16_t sfn_sf; + uint8_t number_of_dci; + uint8_t number_of_hi; + fapi_hi_dci0_req_pdu_t* pdus; +} fapi_hi_dci0_req_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_hi_dci0_req_body_t body; +} fapi_hi_dci0_req_t; + +typedef struct { + uint16_t tag; + uint16_t length; + uint32_t* value; +} fapi_tx_req_pdu_tlv_t; + +typedef struct { + uint16_t pdu_length; + uint16_t pdu_index; + uint32_t num_tlv; + fapi_tx_req_pdu_tlv_t tlvs[32]; +} fapi_tx_req_pdu_t; + +typedef struct { + uint16_t number_of_pdus; + fapi_tx_req_pdu_t* pdus; +} fapi_tx_req_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + fapi_tx_req_body_t body; +} fapi_tx_req_t; + +typedef struct { + uint32_t handle; + uint32_t mp_cca; + uint32_t n_cca; + uint32_t offset; + uint32_t lte_txop_sf; + uint16_t txop_sfn_sf_end; + uint32_t lbt_mode; +} fapi_lbt_pdsch_req_rel13_pdu_t; + +typedef struct { + fapi_lbt_pdsch_req_rel13_pdu_t rel13_pdu; +} fapi_lbt_pdsch_req_pdu_t; + +typedef struct { + uint32_t handle; + uint32_t offset; + uint16_t sfn_sf_end; + uint32_t lbt_mode; +} fapi_lbt_drs_req_rel13_pdu_t; + +typedef struct { + fapi_lbt_drs_req_rel13_pdu_t rel13_pdu; +} fapi_lbt_drs_req_pdu_t; + +typedef struct { + uint8_t pdu_type; + uint8_t pdu_size; + union { + fapi_lbt_pdsch_req_pdu_t lbt_pdsch_req_pdu; + fapi_lbt_drs_req_pdu_t lbt_drs_req_pdu; + }; +} fapi_lbt_dl_config_req_pdu_t; + +typedef struct { + uint16_t number_of_pdus; + fapi_lbt_dl_config_req_pdu_t pdus[32]; +} fapi_lbt_dl_config_req_body_t; + +typedef struct { + fapi_header_t header; + uint16_t sfn_sf; + uint16_t length; + fapi_lbt_dl_config_req_body_t body; +} fapi_lbt_dl_config_req_t; + +//------------------------------------------------------------------------------ + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/nfapi/open-nFAPI/pnf_sim/inc/fapi_stub.h b/nfapi/open-nFAPI/pnf_sim/inc/fapi_stub.h new file mode 100644 index 0000000000..10df46e7ab --- /dev/null +++ b/nfapi/open-nFAPI/pnf_sim/inc/fapi_stub.h @@ -0,0 +1,76 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _FAPI_STUB_H_ +#define _FAPI_STUB_H_ + +#include "fapi_interface.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef struct fapi fapi_t; + +typedef struct fapi { + void* user_data; +} fapi_t; + +typedef struct { + int (*fapi_param_response)(fapi_t* fapi, fapi_param_resp_t* resp); + int (*fapi_config_response)(fapi_t* fapi, fapi_config_resp_t* resp); + + int (*fapi_subframe_ind)(fapi_t* fapi, fapi_subframe_ind_t* ind); + + int (*fapi_harq_ind)(fapi_t* fapi, fapi_harq_ind_t* ind); + int (*fapi_crc_ind)(fapi_t* fapi, fapi_crc_ind_t* ind); + int (*fapi_rx_ulsch_ind)(fapi_t* fapi, fapi_rx_ulsch_ind_t* ind); + int (*fapi_rx_cqi_ind)(fapi_t* fapi, fapi_rx_cqi_ind_t* ind); + int (*fapi_rx_sr_ind)(fapi_t* fapi, fapi_rx_sr_ind_t* ind); + int (*fapi_rach_ind)(fapi_t* fapi, fapi_rach_ind_t* ind); + int (*fapi_srs_ind)(fapi_t* fapi, fapi_srs_ind_t* ind); + + int (*fapi_lbt_dl_ind)(fapi_t* fapi, fapi_lbt_dl_ind_t* ind); + int (*fapi_nb_harq_ind)(fapi_t* fapi, fapi_nb_harq_ind_t* ind); + int (*fapi_nrach_ind)(fapi_t* fapi, fapi_nrach_ind_t* ind); + +} fapi_cb_t; + +typedef struct { + + uint16_t duplex_mode; + uint16_t dl_channel_bw_support; + uint16_t ul_channel_bw_support; +} fapi_config_t; + +fapi_t* fapi_create(fapi_cb_t* callbacks, fapi_config_t* config); + +void fapi_start_data(fapi_t* fapi, unsigned rx_port, const char* tx_address, unsigned tx_port); + +int fapi_param_request(fapi_t* fapi, fapi_param_req_t* req); +int fapi_config_request(fapi_t* fapi, fapi_config_req_t* req); +int fapi_start_request(fapi_t* fapi, fapi_start_req_t* req); + +int fapi_dl_config_request(fapi_t* fapi, fapi_dl_config_req_t* req); +int fapi_ul_config_request(fapi_t* fapi, fapi_ul_config_req_t* req); +int fapi_hi_dci0_request(fapi_t* fapi, fapi_hi_dci0_req_t* req); +int fapi_tx_request(fapi_t* fapi, fapi_tx_req_t* req); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp b/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp new file mode 100644 index 0000000000..df0ca12305 --- /dev/null +++ b/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp @@ -0,0 +1,642 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "fapi_stub.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +struct phy_pdu +{ + phy_pdu() : buffer_len(1500), buffer(0), len(0) + { + buffer = (char*) malloc(buffer_len); + } + + virtual ~phy_pdu() + { + free(buffer); + } + + + unsigned buffer_len; + char* buffer; + unsigned len; +}; + +class fapi_private +{ + std::mutex mutex; + std::queue rx_buffer; + + std::queue free_store; + public: + + fapi_private() + : byte_count(0), tick(0), first_dl_config(false) + { + } + + phy_pdu* allocate_phy_pdu() + { + phy_pdu* pdu = 0; + mutex.lock(); + if(free_store.empty()) + { + pdu = new phy_pdu(); + } + else + { + pdu = free_store.front(); + free_store.pop(); + } + mutex.unlock(); + return pdu; + } + + void release_phy_pdu(phy_pdu* pdu) + { + mutex.lock(); + free_store.push(pdu); + mutex.unlock(); + } + + bool rx_buffer_empty() + { + bool empty; + mutex.lock(); + empty = rx_buffer.empty(); + mutex.unlock(); + + return empty; + } + + + void push_rx_buffer(phy_pdu* buff) + { + mutex.lock(); + rx_buffer.push(buff); + mutex.unlock(); + } + + phy_pdu* pop_rx_buffer() + { + phy_pdu* buff = 0; + mutex.lock(); + if(!rx_buffer.empty()) + { + buff = rx_buffer.front(); + rx_buffer.pop(); + } + mutex.unlock(); + return buff; + } + + uint32_t byte_count; + uint32_t tick; + bool first_dl_config; + +}; + +extern "C" +{ + typedef struct fapi_internal + { + fapi_t _public; + + fapi_cb_t callbacks; + + uint8_t state; + fapi_config_t config; + + int rx_sock; + int tx_sock; + struct sockaddr_in tx_addr; + + uint32_t tx_byte_count; + uint32_t tick; + + fapi_private* fapi; + + } fapi_internal_t; +} + +extern void set_thread_priority(int); +/* +{ + pthread_attr_t ptAttr; + + struct sched_param schedParam; + schedParam.__sched_priority = 79; + sched_setscheduler(0, SCHED_RR, &schedParam); + + pthread_attr_setschedpolicy(&ptAttr, SCHED_RR); + + pthread_attr_setinheritsched(&ptAttr, PTHREAD_EXPLICIT_SCHED); + + struct sched_param thread_params; + thread_params.sched_priority = 20; + pthread_attr_setschedparam(&ptAttr, &thread_params); +} +*/ + +void send_uplink_indications(fapi_internal_t* instance, uint16_t sfn_sf) +{ + fapi_harq_ind_t harq_ind; + (instance->callbacks.fapi_harq_ind)(&(instance->_public), &harq_ind); + + fapi_crc_ind_t crc_ind; + crc_ind.header.message_id = FAPI_CRC_INDICATION; + crc_ind.header.length = 0; //??; + crc_ind.sfn_sf = sfn_sf; + crc_ind.body.number_of_crcs = 1; + crc_ind.body.pdus[0].rx_ue_info.handle = 0; //?? + crc_ind.body.pdus[0].rx_ue_info.rnti = 0; //?? + crc_ind.body.pdus[0].rel8_pdu.crc_flag = 1; + + (instance->callbacks.fapi_crc_ind)(&(instance->_public), &crc_ind); + + if(!instance->fapi->rx_buffer_empty()) + { + fapi_rx_ulsch_ind_t rx_ind; + memset(&rx_ind, 0, sizeof(rx_ind)); + rx_ind.header.message_id = FAPI_RX_ULSCH_INDICATION; + rx_ind.sfn_sf = sfn_sf; + + + phy_pdu* buff = 0; + int i = 0; + std::list free_list; + do + { + buff = instance->fapi->pop_rx_buffer(); + if(buff != 0) + { + if(buff->len == 0) + { + printf("[FAPI] Buffer length = 0\n"); + } + + rx_ind.body.pdus[i].rx_ue_info.handle = 0xDEADBEEF; + rx_ind.body.pdus[i].rx_ue_info.rnti = 0x4242; + + rx_ind.body.pdus[i].rel8_pdu.length = buff->len; + //rx_ind.pdus[i].rel8_pdu.data_offset; + //rx_ind.pdus[i].rel8_pdu.ul_cqi; + //rx_ind.pdus[i].rel8_pdu.timing_advance; + + rx_ind.body.data[i] = buff->buffer; + + rx_ind.body.number_of_pdus++; + i++; + + instance->fapi->byte_count += buff->len; + + free_list.push_back(buff); + } + }while(buff != 0 && i < 8); + + (instance->callbacks.fapi_rx_ulsch_ind)(&(instance->_public), &rx_ind); + + for(phy_pdu* pdu : free_list) + { + instance->fapi->release_phy_pdu(pdu); + //free(tx_req.tx_request_body.tx_pdu_list[j].segments[0].segment_data); + } + } + else + { + fapi_rx_ulsch_ind_t rx_ind; + memset(&rx_ind, 0, sizeof(rx_ind)); + rx_ind.header.message_id = FAPI_RX_ULSCH_INDICATION; + rx_ind.sfn_sf = sfn_sf; + (instance->callbacks.fapi_rx_ulsch_ind)(&(instance->_public), &rx_ind); + } + + + fapi_rx_cqi_ind_t cqi_ind; + cqi_ind.sfn_sf = sfn_sf; + (instance->callbacks.fapi_rx_cqi_ind)(&(instance->_public), &cqi_ind); + + fapi_rx_sr_ind_t sr_ind; + sr_ind.sfn_sf = sfn_sf; + (instance->callbacks.fapi_rx_sr_ind)(&(instance->_public), &sr_ind); + + fapi_rach_ind_t rach_ind; + rach_ind.sfn_sf = sfn_sf; + (instance->callbacks.fapi_rach_ind)(&(instance->_public), &rach_ind); + + fapi_srs_ind_t srs_ind; + srs_ind.sfn_sf = sfn_sf; + (instance->callbacks.fapi_srs_ind)(&(instance->_public), &srs_ind); + /* + nfapi_lbt_dl_indication_t lbt_ind; + memset(&lbt_ind, 0, sizeof(lbt_ind)); + lbt_ind.header.message_id = NFAPI_LBT_DL_INDICATION; + lbt_ind.header.phy_id = config->phy_id; + lbt_ind.sfn_sf = sfn_sf; + nfapi_pnf_p7_lbt_dl_ind(config, &lbt_ind); + + vendor_ext_p7_ind ve_p7_ind; + memset(&ve_p7_ind, 0, sizeof(ve_p7_ind)); + ve_p7_ind.header.message_id = P7_VENDOR_EXT_IND; + ve_p7_ind.header.phy_id = config->phy_id; + ve_p7_ind.error_code = NFAPI_MSG_OK; + nfapi_pnf_p7_vendor_extension(config, &(ve_p7_ind.header)); + */ + + fapi_nb_harq_ind_t nb_harq_ind; + nb_harq_ind.sfn_sf = sfn_sf; + (instance->callbacks.fapi_nb_harq_ind)(&(instance->_public), &nb_harq_ind); + + fapi_nrach_ind_t nrach_ind; + nrach_ind.sfn_sf = sfn_sf; + (instance->callbacks.fapi_nrach_ind)(&(instance->_public), &nrach_ind); + +} + +void* fapi_thread_start(void* ptr) +{ + set_thread_priority(81); + + fapi_internal_t* instance = (fapi_internal_t*)ptr; + uint16_t sfn_sf_dec = 0; + uint32_t last_tv_usec = 0; + uint32_t last_tv_sec = 0; + + uint32_t millisec; + uint32_t last_millisec = -1; + uint16_t catchup = 0; + + while(1) + { + // get the time + struct timeval sf_start; + (void)gettimeofday(&sf_start, NULL); + + uint16_t sfn_sf = ((((sfn_sf_dec) / 10) << 4) | (((sfn_sf_dec) - (((sfn_sf_dec) / 10) * 10)) & 0xF)); + // increment the sfn/sf - for the next subframe + sfn_sf_dec++; + if(sfn_sf_dec > 10239) + sfn_sf_dec = 0; + + + fapi_subframe_ind_t ind; + ind.sfn_sf = sfn_sf; + + if(instance->fapi->first_dl_config) + send_uplink_indications(instance, sfn_sf); + + if(instance->tick == 1000) + { + if(instance->tx_byte_count > 0) + { + printf("[FAPI] Tx rate %d bytes/sec\n", instance->tx_byte_count); + instance->tx_byte_count = 0; + } + + instance->tick = 0; + } + + instance->tick++; + + (instance->callbacks.fapi_subframe_ind)(&(instance->_public), &ind); + + { + phy_pdu* pdu = instance->fapi->allocate_phy_pdu(); + int len = recvfrom(instance->rx_sock, pdu->buffer, pdu->buffer_len, MSG_DONTWAIT, 0, 0); + if(len > 0) + { + pdu->len = len; + instance->fapi->push_rx_buffer(pdu); + } + else + { + instance->fapi->release_phy_pdu(pdu); + } + } + + + if(catchup) + { + catchup--; + } + else + { + struct timespec now_ts; + struct timespec sleep_ts; + struct timespec sleep_rem_ts; + + // get the current time + clock_gettime(CLOCK_MONOTONIC, &now_ts); + + + // determine how long to sleep before the start of the next 1ms + sleep_ts.tv_sec = 0; + sleep_ts.tv_nsec = 1e6 - (now_ts.tv_nsec % 1000000); + + int nanosleep_result = nanosleep(&sleep_ts, &sleep_rem_ts); + + if(nanosleep_result != 0) + printf("*** nanosleep failed or was interrupted\n"); + + + clock_gettime(CLOCK_MONOTONIC, &now_ts); + millisec = now_ts.tv_nsec / 1e6; + + if(last_millisec != -1 && ((last_millisec + 1 ) % 1000) != millisec) + { + printf("*** missing millisec %d %d\n", last_millisec, millisec); + catchup = millisec - last_millisec - 1; + } + + last_millisec = millisec; + } + } +} + +extern "C" +{ + fapi_t* fapi_create(fapi_cb_t* callbacks, fapi_config_t* config) + { + fapi_internal_t* instance = (fapi_internal*)calloc(1, sizeof(fapi_internal_t)); + instance->callbacks = *callbacks; + instance->config = *config; + instance->state = 0; + + instance->fapi = new fapi_private(); + + return (fapi_t*)instance; + } + + void fapi_destroy(fapi_t* fapi) + { + fapi_internal_t* instance = (fapi_internal_t*)fapi; + + delete instance->fapi; + free(instance); + } + + void* fapi_rx_thread_start(void* ptr) + { + set_thread_priority(60); + + fapi_internal_t* instance = (fapi_internal_t*)ptr; + + while(1) + { + phy_pdu* pdu = instance->fapi->allocate_phy_pdu(); + int len = recvfrom(instance->rx_sock, pdu->buffer, pdu->buffer_len, 0, 0, 0); + if(len > 0) + { + pdu->len = len; + instance->fapi->push_rx_buffer(pdu); + } + else + { + instance->fapi->release_phy_pdu(pdu); + } + + } + } + + void fapi_start_data(fapi_t* fapi, unsigned rx_port, const char* tx_address, unsigned tx_port) + { + fapi_internal_t* instance = (fapi_internal_t*)fapi; + + printf("[FAPI] Rx Data from %d\n", rx_port); + printf("[FAPI] Tx Data to %s:%d\n", tx_address, tx_port); + + instance->rx_sock = socket(AF_INET, SOCK_DGRAM, 0); + + if(instance->rx_sock < 0) + { + printf("[FAPI] Failed to create socket\n"); + return; + } + + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(rx_port); + addr.sin_addr.s_addr = INADDR_ANY; + + int bind_result = bind(instance->rx_sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); + + if(bind_result == -1) + { + printf("[FAPI] Failed to bind to port %d\n", rx_port); + close(instance->rx_sock); + return ; + } + + instance->tx_sock = socket(AF_INET, SOCK_DGRAM, 0); + instance->tx_addr.sin_family = AF_INET; + instance->tx_addr.sin_port = htons(tx_port); + instance->tx_addr.sin_addr.s_addr = inet_addr(tx_address); + + } + + + void fill_tlv(fapi_tlv_t tlvs[], uint8_t count, uint8_t tag, uint8_t len, uint16_t value) + { + tlvs[count].tag = tag; + tlvs[count].value = value; + tlvs[count].length = len; + + } + + int fapi_param_request(fapi_t* fapi, fapi_param_req_t* req) + { + fapi_internal_t* instance = (fapi_internal_t*)fapi; + + fapi_param_resp_t resp; + resp.header.message_id = FAPI_PARAM_RESPONSE; + + resp.error_code = FAPI_MSG_OK; + + resp.number_of_tlvs = 0; + fill_tlv(resp.tlvs, resp.number_of_tlvs++, FAPI_PHY_STATE_TAG, 2, instance->state); + + + if(instance->state == 0) + { + if(instance->config.duplex_mode == 0) + { + // -- TDD + // Downlink Bandwidth Support + // Uplink Bandwidth Support + // Downlink Modulation Support + // Uplink Modulation Support + // PHY Antenna Capability + // Release Capability + // MBSFN Capability + } + else if(instance->config.duplex_mode == 1) + { + // -- FDD + // Downlink Bandwidth Support + fill_tlv(resp.tlvs, resp.number_of_tlvs++, FAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, 2, instance->config.dl_channel_bw_support); + // Uplink Bandwidth Support + fill_tlv(resp.tlvs, resp.number_of_tlvs++, FAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, 2, instance->config.ul_channel_bw_support); + // Downlink Modulation Support + // Uplink Modulation Support + // PHY Antenna Capability + // Release Capability + // MBSFN Capability + // LAA Capability + } + } + else + { + if(instance->config.duplex_mode == 0) + { + // -- TDD + // Downlink Bandwidth Support + // Uplink Bandwidth Support + // Downlink Modulation Support + // Uplink Modulation Support + // PHY Antenna Capability + // Release Capability + // MBSFN Capability + // Duplexing Mode + // PCFICH Power Offset + // P-B + // DL Cyclic Prefix Type + // UL Cyclic Prefix Type + // RF Config + // PHICH Config + // SCH Config + // PRACH Config + // PUSCH Config + // PUCCH Config + // SRS Config + // Uplink Reference Signal Config + // TDD Frame Structure Config + // Data Report Mode + } + else if(instance->config.duplex_mode == 1) + { + // FDD + // Downlink Bandwidth Support + // Uplink Bandwidth Support + // Downlink Modulation Support + // Uplink Modulation Support + // PHY Antenna Capability + // Release Capability + // MBSFN Capability + // LAA Capability + // Duplexing Mode + // PCFICH Power Offset + // P-B + // DL Cyclic Prefix Type + // UL Cyclic Prefix Type + // RF Config + // PHICH Config + // SCH Config + // PRACH Config + // PUSCH Config + // PUCCH Config + // SRS Config + // Uplink Reference Signal Config + // Data Report Mode + } + } + + + //todo fill + (instance->callbacks.fapi_param_response)(fapi, &resp); + + return 0; + } + + int fapi_config_request(fapi_t* fapi, fapi_config_req_t* req) + { + fapi_internal_t* instance = (fapi_internal_t*)fapi; + + fapi_config_resp_t resp; + resp.header.message_id = FAPI_CONFIG_RESPONSE; + resp.error_code = FAPI_MSG_OK; + + (instance->callbacks.fapi_config_response)(fapi, &resp); + return 0; + } + + int fapi_start_request(fapi_t* fapi, fapi_start_req_t* req) + { + fapi_internal_t* instance = (fapi_internal_t*)fapi; + + pthread_t fapi_thread; + pthread_create(&fapi_thread, NULL, &fapi_thread_start, instance); + + return 0; + } + + int fapi_dl_config_request(fapi_t* fapi, fapi_dl_config_req_t* req) + { + fapi_internal_t* instance = (fapi_internal_t*)fapi; + instance->fapi->first_dl_config = true; + return 0; + } + int fapi_ul_config_request(fapi_t* fapi, fapi_ul_config_req_t* req) + { + fapi_internal_t* instance = (fapi_internal_t*)fapi; + return 0; + } + int fapi_hi_dci0_request(fapi_t* fapi, fapi_hi_dci0_req_t* req) + { + fapi_internal_t* instance = (fapi_internal_t*)fapi; + return 0; + } + int fapi_tx_request(fapi_t* fapi, fapi_tx_req_t* req) + { + fapi_internal_t* instance = (fapi_internal_t*)fapi; + + for(int i = 0; i < req->body.number_of_pdus; ++i) + { + uint16_t len = req->body.pdus[i].pdu_length; + uint32_t* data = req->body.pdus[i].tlvs[0].value; + //printf("[FAPI] sfnsf:%d len:%d\n", req->sfn_sf,len); + // + instance->tx_byte_count += len; + + int sendto_result = sendto(instance->tx_sock, data, len, 0, (struct sockaddr*)&(instance->tx_addr), sizeof(instance->tx_addr)); + + if(sendto_result == -1) + { + // error + } + } + + return 0; + } +} + diff --git a/nfapi/open-nFAPI/pnf_sim/src/main.cpp b/nfapi/open-nFAPI/pnf_sim/src/main.cpp new file mode 100644 index 0000000000..e2622cf3c3 --- /dev/null +++ b/nfapi/open-nFAPI/pnf_sim/src/main.cpp @@ -0,0 +1,2285 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include "debug.h" +#include "nfapi_pnf_interface.h" +#include "nfapi.h" +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +#include + +#include "fapi_stub.h" +#include "pool.h" + + +#include +#include +#include +#include +#include +#include +#include + +#define NUM_P5_PHY 2 + +uint16_t phy_antenna_capability_values[] = { 1, 2, 4, 8, 16 }; + +static uint32_t rand_range(uint32_t min, uint32_t max) +{ + return ((rand() % (max + 1 - min)) + min); +} + + + +extern "C" nfapi_pnf_param_response_t g_pnf_param_resp; + +extern "C" { + + +void* pnf_allocate(size_t size) +{ + return (void*)memory_pool::allocate(size); +} + +void pnf_deallocate(void* ptr) +{ + memory_pool::deallocate((uint8_t*)ptr); +} + + +int read_xml(const char *xml_file); + +}; + +class udp_data +{ + public: + bool enabled; + uint32_t rx_port; + uint32_t tx_port; + std::string tx_addr; +}; + +class phy_info +{ + public: + + phy_info() + : first_subframe_ind(0), fapi(0), + dl_ues_per_subframe(0), ul_ues_per_subframe(0), + timing_window(0), timing_info_mode(0), timing_info_period(0) + { + index = 0; + id = 0; + + local_port = 0; + remote_addr = 0; + remote_port = 0; + + duplex_mode = 0; + dl_channel_bw_support = 0; + ul_channel_bw_support = 0; + num_dl_layers_supported = 0; + num_ul_layers_supported = 0; + release_supported = 0; + nmm_modes_supported = 0; + } + + uint16_t index; + uint16_t id; + std::vector rfs; + std::vector excluded_rfs; + + udp_data udp; + + std::string local_addr; + int local_port; + + char* remote_addr; + int remote_port; + + uint8_t duplex_mode; + uint16_t dl_channel_bw_support; + uint16_t ul_channel_bw_support; + uint8_t num_dl_layers_supported; + uint8_t num_ul_layers_supported; + uint16_t release_supported; + uint8_t nmm_modes_supported; + + uint8_t dl_ues_per_subframe; + uint8_t ul_ues_per_subframe; + + uint8_t first_subframe_ind; + + // timing information recevied from the vnf + uint8_t timing_window; + uint8_t timing_info_mode; + uint8_t timing_info_period; + + fapi_t* fapi; + +}; + +class rf_info +{ + public: + uint16_t index; + uint16_t band; + int16_t max_transmit_power; + int16_t min_transmit_power; + uint8_t num_antennas_supported; + uint32_t min_downlink_frequency; + uint32_t max_downlink_frequency; + uint32_t max_uplink_frequency; + uint32_t min_uplink_frequency; +}; + + +class pnf_info +{ + public: + + pnf_info() + : release(13), wireshark_test_mode(0), + max_total_power(0), oui(0) + + { + release = 0; + + sync_mode = 0; + location_mode = 0; + dl_config_timing = 0; + ul_config_timing = 0; + tx_timing = 0; + hi_dci0_timing = 0; + + max_phys = 0; + max_total_bw = 0; + max_total_dl_layers = 0; + max_total_ul_layers = 0; + shared_bands = 0; + shared_pa = 0; + + } + + int release; + std::vector phys; + std::vector rfs; + + uint8_t sync_mode; + uint8_t location_mode; + uint8_t location_coordinates[6]; + uint32_t dl_config_timing; + uint32_t ul_config_timing; + uint32_t tx_timing; + uint32_t hi_dci0_timing; + + uint16_t max_phys; + uint16_t max_total_bw; + uint16_t max_total_dl_layers; + uint16_t max_total_ul_layers; + uint8_t shared_bands; + uint8_t shared_pa; + int16_t max_total_power; + uint8_t oui; + + uint8_t wireshark_test_mode; + +}; + +struct pnf_phy_user_data_t +{ + uint16_t phy_id; + nfapi_pnf_config_t* config; + phy_info* phy; + nfapi_pnf_p7_config_t* p7_config; +}; + +int read_pnf_xml(pnf_info& pnf, const char* xml_file) +{ + try + { + std::ifstream input(xml_file); + + using boost::property_tree::ptree; + ptree pt; + + read_xml(input, pt); + + pnf.wireshark_test_mode = pt.get("pnf.wireshark_test_mode", 0); + + + pnf.sync_mode = pt.get("pnf.sync_mode"); + pnf.location_mode= pt.get("pnf.location_mode"); + //pnf.sync_mode = pt.get("pnf.location_coordinates"); + + pnf.dl_config_timing= pt.get("pnf.dl_config_timing"); + pnf.ul_config_timing = pt.get("pnf.ul_config_timing"); + pnf.tx_timing = pt.get("pnf.tx_timing"); + pnf.hi_dci0_timing = pt.get("pnf.hi_dci0_timing"); + + pnf.max_phys = pt.get("pnf.max_phys"); + pnf.max_total_bw = pt.get("pnf.max_total_bandwidth"); + pnf.max_total_dl_layers = pt.get("pnf.max_total_num_dl_layers"); + pnf.max_total_ul_layers = pt.get("pnf.max_total_num_ul_layers"); + + pnf.shared_bands = pt.get("pnf.shared_bands"); + pnf.shared_pa = pt.get("pnf.shared_pas"); + + pnf.max_total_power = pt.get("pnf.maximum_total_power"); + + //"oui"); + + for(const auto& v : pt.get_child("pnf.phys")) + { + if(v.first == "phy") + { + phy_info phy; + + + + phy.index = v.second.get("index"); + phy.local_port = v.second.get("port"); + phy.local_addr = v.second.get("address"); + phy.duplex_mode = v.second.get("duplex_mode"); + + phy.dl_channel_bw_support = v.second.get("downlink_channel_bandwidth_support"); + phy.ul_channel_bw_support = v.second.get("uplink_channel_bandwidth_support"); + phy.num_dl_layers_supported = v.second.get("number_of_dl_layers"); + phy.num_ul_layers_supported = v.second.get("number_of_ul_layers"); + phy.release_supported = v.second.get("3gpp_release_supported"); + phy.nmm_modes_supported = v.second.get("nmm_modes_supported"); + + for(const auto& v2 : v.second.get_child("rfs")) + { + if(v2.first == "index") + phy.rfs.push_back(v2.second.get_value()); + } + for(const auto& v2 : v.second.get_child("excluded_rfs")) + { + if(v2.first == "index") + phy.excluded_rfs.push_back(v2.second.get_value()); + } + + boost::optional d = v.second.get_child_optional("data.udp"); + if(d.is_initialized()) + { + phy.udp.enabled = true; + phy.udp.rx_port = d.get().get("rx_port"); + phy.udp.tx_port = d.get().get("tx_port"); + phy.udp.tx_addr = d.get().get("tx_addr"); + } + else + { + phy.udp.enabled = false; + } + + phy.dl_ues_per_subframe = v.second.get("dl_ues_per_subframe"); + phy.ul_ues_per_subframe = v.second.get("ul_ues_per_subframe"); + + pnf.phys.push_back(phy); + } + } + for(const auto& v : pt.get_child("pnf.rfs")) + { + if(v.first == "rf") + { + rf_info rf; + + rf.index = v.second.get("index"); + rf.band = v.second.get("band"); + rf.max_transmit_power = v.second.get("max_transmit_power"); + rf.min_transmit_power = v.second.get("min_transmit_power"); + rf.num_antennas_supported = v.second.get("num_antennas_supported"); + rf.min_downlink_frequency = v.second.get("min_downlink_frequency"); + rf.max_downlink_frequency = v.second.get("max_downlink_frequency"); + rf.min_uplink_frequency = v.second.get("max_uplink_frequency"); + rf.max_uplink_frequency = v.second.get("min_uplink_frequency"); + + pnf.rfs.push_back(rf); + } + } + } + catch(std::exception& e) + { + printf("%s", e.what()); + return -1; + } + catch(boost::exception& e) + { + printf("%s", boost::diagnostic_information(e).c_str()); + return -1; + } + + return 0; +} + + + +void pnf_sim_trace(nfapi_trace_level_t level, const char* message, ...) +{ + va_list args; + va_start(args, message); + vprintf(message, args); + va_end(args); +} + +void set_thread_priority(int priority) +{ + //printf("%s(priority:%d)\n", __FUNCTION__, priority); + + pthread_attr_t ptAttr; + + struct sched_param schedParam; + schedParam.__sched_priority = priority; //79; + if(sched_setscheduler(0, SCHED_RR, &schedParam) != 0) + { + printf("failed to set SCHED_RR\n"); + } + + if(pthread_attr_setschedpolicy(&ptAttr, SCHED_RR) != 0) + { + printf("failed to set pthread SCHED_RR %d\n", errno); + } + + pthread_attr_setinheritsched(&ptAttr, PTHREAD_EXPLICIT_SCHED); + + struct sched_param thread_params; + thread_params.sched_priority = 20; + if(pthread_attr_setschedparam(&ptAttr, &thread_params) != 0) + { + printf("failed to set sched param\n"); + } +} + + +void* pnf_p7_thread_start(void* ptr) +{ + set_thread_priority(79); + + nfapi_pnf_p7_config_t* config = (nfapi_pnf_p7_config_t*)ptr; + nfapi_pnf_p7_start(config); + + return 0; +} + + + +int pnf_param_request(nfapi_pnf_config_t* config, nfapi_pnf_param_request_t* req) +{ + printf("[PNF_SIM] pnf param request\n"); + + nfapi_pnf_param_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_PARAM_RESPONSE; + resp.error_code = NFAPI_MSG_OK; + + pnf_info* pnf = (pnf_info*)(config->user_data); + + resp.pnf_param_general.tl.tag = NFAPI_PNF_PARAM_GENERAL_TAG; + resp.pnf_param_general.nfapi_sync_mode = pnf->sync_mode; + resp.pnf_param_general.location_mode = pnf->location_mode; + //uint8_t location_coordinates[NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH]; + resp.pnf_param_general.dl_config_timing = pnf->dl_config_timing; + resp.pnf_param_general.tx_timing = pnf->tx_timing; + resp.pnf_param_general.ul_config_timing = pnf->ul_config_timing; + resp.pnf_param_general.hi_dci0_timing = pnf->hi_dci0_timing; + resp.pnf_param_general.maximum_number_phys = pnf->max_phys; + resp.pnf_param_general.maximum_total_bandwidth = pnf->max_total_bw; + resp.pnf_param_general.maximum_total_number_dl_layers = pnf->max_total_dl_layers; + resp.pnf_param_general.maximum_total_number_ul_layers = pnf->max_total_ul_layers; + resp.pnf_param_general.shared_bands = pnf->shared_bands; + resp.pnf_param_general.shared_pa = pnf->shared_pa; + resp.pnf_param_general.maximum_total_power = pnf->max_total_power; + //uint8_t oui[NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH]; + + resp.pnf_phy.tl.tag = NFAPI_PNF_PHY_TAG; + resp.pnf_phy.number_of_phys = pnf->phys.size(); + + for(int i = 0; i < pnf->phys.size(); ++i) + { + resp.pnf_phy.phy[i].phy_config_index = pnf->phys[i].index; + resp.pnf_phy.phy[i].downlink_channel_bandwidth_supported = pnf->phys[i].dl_channel_bw_support; + resp.pnf_phy.phy[i].uplink_channel_bandwidth_supported = pnf->phys[i].ul_channel_bw_support; + resp.pnf_phy.phy[i].number_of_dl_layers_supported = pnf->phys[i].num_dl_layers_supported; + resp.pnf_phy.phy[i].number_of_ul_layers_supported = pnf->phys[i].num_ul_layers_supported; + resp.pnf_phy.phy[i].maximum_3gpp_release_supported = pnf->phys[i].release_supported; + resp.pnf_phy.phy[i].nmm_modes_supported = pnf->phys[i].nmm_modes_supported; + + resp.pnf_phy.phy[i].number_of_rfs = pnf->phys[i].rfs.size(); + for(int j = 0; j < pnf->phys[i].rfs.size(); ++j) + { + resp.pnf_phy.phy[i].rf_config[j].rf_config_index = pnf->phys[i].rfs[j]; + } + + resp.pnf_phy.phy[i].number_of_rf_exclusions = pnf->phys[i].excluded_rfs.size(); + for(int j = 0; j < pnf->phys[i].excluded_rfs.size(); ++j) + { + resp.pnf_phy.phy[i].excluded_rf_config[j].rf_config_index = pnf->phys[i].excluded_rfs[j]; + } + } + + + resp.pnf_rf.tl.tag = NFAPI_PNF_RF_TAG; + resp.pnf_rf.number_of_rfs = pnf->rfs.size(); + + for(int i = 0; i < pnf->rfs.size(); ++i) + { + resp.pnf_rf.rf[i].rf_config_index = pnf->rfs[i].index; + resp.pnf_rf.rf[i].band = pnf->rfs[i].band; + resp.pnf_rf.rf[i].maximum_transmit_power = pnf->rfs[i].max_transmit_power; + resp.pnf_rf.rf[i].minimum_transmit_power = pnf->rfs[i].min_transmit_power; + resp.pnf_rf.rf[i].number_of_antennas_suppported = pnf->rfs[i].num_antennas_supported; + resp.pnf_rf.rf[i].minimum_downlink_frequency = pnf->rfs[i].min_downlink_frequency; + resp.pnf_rf.rf[i].maximum_downlink_frequency = pnf->rfs[i].max_downlink_frequency; + resp.pnf_rf.rf[i].minimum_uplink_frequency = pnf->rfs[i].min_uplink_frequency; + resp.pnf_rf.rf[i].maximum_uplink_frequency = pnf->rfs[i].max_uplink_frequency; + } + + if(pnf->release >= 10) + { + resp.pnf_phy_rel10.tl.tag = NFAPI_PNF_PHY_REL10_TAG; + resp.pnf_phy_rel10.number_of_phys = pnf->phys.size(); + + for(int i = 0; i < pnf->phys.size(); ++i) + { + resp.pnf_phy_rel10.phy[i].phy_config_index = pnf->phys[i].index; + resp.pnf_phy_rel10.phy[i].transmission_mode_7_supported = 0; + resp.pnf_phy_rel10.phy[i].transmission_mode_8_supported = 1; + resp.pnf_phy_rel10.phy[i].two_antenna_ports_for_pucch = 0; + resp.pnf_phy_rel10.phy[i].transmission_mode_9_supported = 1; + resp.pnf_phy_rel10.phy[i].simultaneous_pucch_pusch = 0; + resp.pnf_phy_rel10.phy[i].four_layer_tx_with_tm3_and_tm4 = 1; + + } + } + + if(pnf->release >= 11) + { + resp.pnf_phy_rel11.tl.tag = NFAPI_PNF_PHY_REL11_TAG; + resp.pnf_phy_rel11.number_of_phys = pnf->phys.size(); + + for(int i = 0; i < pnf->phys.size(); ++i) + { + resp.pnf_phy_rel11.phy[i].phy_config_index = pnf->phys[i].index; + resp.pnf_phy_rel11.phy[i].edpcch_supported = 0; + resp.pnf_phy_rel11.phy[i].multi_ack_csi_reporting = 1; + resp.pnf_phy_rel11.phy[i].pucch_tx_diversity = 0; + resp.pnf_phy_rel11.phy[i].ul_comp_supported = 1; + resp.pnf_phy_rel11.phy[i].transmission_mode_5_supported = 0; + } + } + + if(pnf->release >= 12) + { + resp.pnf_phy_rel12.tl.tag = NFAPI_PNF_PHY_REL12_TAG; + resp.pnf_phy_rel12.number_of_phys = pnf->phys.size(); + + for(int i = 0; i < pnf->phys.size(); ++i) + { + resp.pnf_phy_rel12.phy[i].phy_config_index = pnf->phys[i].index; + resp.pnf_phy_rel12.phy[i].csi_subframe_set = 0; + resp.pnf_phy_rel12.phy[i].enhanced_4tx_codebook = 2; // yes this is invalid + resp.pnf_phy_rel12.phy[i].drs_supported = 0; + resp.pnf_phy_rel12.phy[i].ul_64qam_supported = 1; + resp.pnf_phy_rel12.phy[i].transmission_mode_10_supported = 0; + resp.pnf_phy_rel12.phy[i].alternative_bts_indices = 1; + } + } + + if(pnf->release >= 13) + { + resp.pnf_phy_rel13.tl.tag = NFAPI_PNF_PHY_REL13_TAG; + resp.pnf_phy_rel13.number_of_phys = pnf->phys.size(); + + for(int i = 0; i < pnf->phys.size(); ++i) + { + resp.pnf_phy_rel13.phy[i].phy_config_index = pnf->phys[i].index; + resp.pnf_phy_rel13.phy[i].pucch_format4_supported = 0; + resp.pnf_phy_rel13.phy[i].pucch_format5_supported = 1; + resp.pnf_phy_rel13.phy[i].more_than_5_ca_support = 0; + resp.pnf_phy_rel13.phy[i].laa_supported = 1; + resp.pnf_phy_rel13.phy[i].laa_ending_in_dwpts_supported = 0; + resp.pnf_phy_rel13.phy[i].laa_starting_in_second_slot_supported = 1; + resp.pnf_phy_rel13.phy[i].beamforming_supported = 0; + resp.pnf_phy_rel13.phy[i].csi_rs_enhancement_supported = 1; + resp.pnf_phy_rel13.phy[i].drms_enhancement_supported = 0; + resp.pnf_phy_rel13.phy[i].srs_enhancement_supported = 1; + } + + resp.pnf_phy_rel13_nb_iot.tl.tag = NFAPI_PNF_PHY_REL13_NB_IOT_TAG; + resp.pnf_phy_rel13_nb_iot.number_of_phys = pnf->phys.size(); + + for(int i = 0; i < pnf->phys.size(); ++i) + { + resp.pnf_phy_rel13_nb_iot.phy[i].phy_config_index = pnf->phys[i].index; + + resp.pnf_phy_rel13_nb_iot.phy[i].number_of_rfs = pnf->phys[i].rfs.size(); + for(int j = 0; j < pnf->phys[i].rfs.size(); ++j) + { + resp.pnf_phy_rel13_nb_iot.phy[i].rf_config[j].rf_config_index = pnf->phys[i].rfs[j]; + } + + resp.pnf_phy_rel13_nb_iot.phy[i].number_of_rf_exclusions = pnf->phys[i].excluded_rfs.size(); + for(int j = 0; j < pnf->phys[i].excluded_rfs.size(); ++j) + { + resp.pnf_phy_rel13_nb_iot.phy[i].excluded_rf_config[j].rf_config_index = pnf->phys[i].excluded_rfs[j]; + } + + resp.pnf_phy_rel13_nb_iot.phy[i].number_of_dl_layers_supported = pnf->phys[i].num_dl_layers_supported; + resp.pnf_phy_rel13_nb_iot.phy[i].number_of_ul_layers_supported = pnf->phys[i].num_ul_layers_supported; + resp.pnf_phy_rel13_nb_iot.phy[i].maximum_3gpp_release_supported = pnf->phys[i].release_supported; + resp.pnf_phy_rel13_nb_iot.phy[i].nmm_modes_supported = pnf->phys[i].nmm_modes_supported; + + } + } + + + nfapi_pnf_pnf_param_resp(config, &resp); + + return 0; +} + +int pnf_config_request(nfapi_pnf_config_t* config, nfapi_pnf_config_request_t* req) +{ + printf("[PNF_SIM] pnf config request\n"); + + pnf_info* pnf = (pnf_info*)(config->user_data); + + for(int i = 0; i < req->pnf_phy_rf_config.number_phy_rf_config_info; ++i) + { + auto found = std::find_if(pnf->phys.begin(), pnf->phys.end(), [&](phy_info& item) + { return item.index == req->pnf_phy_rf_config.phy_rf_config[i].phy_config_index; }); + + if(found != pnf->phys.end()) + { + phy_info& phy = (*found); + phy.id = req->pnf_phy_rf_config.phy_rf_config[i].phy_id; + printf("[PNF_SIM] pnf config request assigned phy_id %d to phy_config_index %d\n", phy.id, req->pnf_phy_rf_config.phy_rf_config[i].phy_config_index); + } + else + { + // did not find the phy + printf("[PNF_SIM] pnf config request did not find phy_config_index %d\n", req->pnf_phy_rf_config.phy_rf_config[i].phy_config_index); + } + + } + + nfapi_pnf_config_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_CONFIG_RESPONSE; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_pnf_config_resp(config, &resp); + + return 0; +} + +int fapi_param_response(fapi_t* fapi, fapi_param_resp_t* resp) +{ + printf("[PNF_SIM] fapi param response\n"); + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_param_response_t nfapi_resp; + + memset(&nfapi_resp, 0, sizeof(nfapi_resp)); + nfapi_resp.header.message_id = NFAPI_PARAM_RESPONSE; + nfapi_resp.header.phy_id = data->phy_id; + nfapi_resp.error_code = resp->error_code; + + for(int i = 0; i < resp->number_of_tlvs; ++i) + { + switch(resp->tlvs[i].tag) + { + case FAPI_PHY_STATE_TAG: + nfapi_resp.l1_status.phy_state.tl.tag = NFAPI_L1_STATUS_PHY_STATE_TAG; + nfapi_resp.l1_status.phy_state.value = resp->tlvs[i].value; + nfapi_resp.num_tlv++; + break; + + case FAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG: + nfapi_resp.phy_capabilities.dl_bandwidth_support.tl.tag = NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG; + nfapi_resp.phy_capabilities.dl_bandwidth_support.value = resp->tlvs[i].value; + nfapi_resp.num_tlv++; + break; + + case FAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG: + nfapi_resp.phy_capabilities.ul_bandwidth_support.tl.tag = NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG; + nfapi_resp.phy_capabilities.ul_bandwidth_support.value = resp->tlvs[i].value; + nfapi_resp.num_tlv++; + break; + } + } + + if(1) + { + // just code to populate all the tlv for testing with wireshark + // todo : these should be move up so that they are populated by fapi + + nfapi_resp.phy_capabilities.dl_modulation_support.tl.tag = NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG; + nfapi_resp.phy_capabilities.dl_modulation_support.value = rand_range(0, 0x0F); + nfapi_resp.num_tlv++; + nfapi_resp.phy_capabilities.ul_modulation_support.tl.tag = NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG; + nfapi_resp.phy_capabilities.ul_modulation_support.value = rand_range(0, 0x07); + nfapi_resp.num_tlv++; + nfapi_resp.phy_capabilities.phy_antenna_capability.tl.tag = NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG; + nfapi_resp.phy_capabilities.phy_antenna_capability.value = phy_antenna_capability_values[rand_range(0, 4)]; + nfapi_resp.num_tlv++; + nfapi_resp.phy_capabilities.release_capability.tl.tag = NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG; + nfapi_resp.phy_capabilities.release_capability.value = rand_range(0, 0x3F); + nfapi_resp.num_tlv++; + nfapi_resp.phy_capabilities.mbsfn_capability.tl.tag = NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG; + nfapi_resp.phy_capabilities.mbsfn_capability.value = rand_range(0, 1); + nfapi_resp.num_tlv++; + + + nfapi_resp.laa_capability.laa_support.tl.tag = NFAPI_LAA_CAPABILITY_LAA_SUPPORT_TAG; + nfapi_resp.laa_capability.laa_support.value = rand_range(0, 1); + nfapi_resp.num_tlv++; + nfapi_resp.laa_capability.pd_sensing_lbt_support.tl.tag = NFAPI_LAA_CAPABILITY_PD_SENSING_LBT_SUPPORT_TAG; + nfapi_resp.laa_capability.pd_sensing_lbt_support.value = rand_range(0, 1); + nfapi_resp.num_tlv++; + nfapi_resp.laa_capability.multi_carrier_lbt_support.tl.tag = NFAPI_LAA_CAPABILITY_MULTI_CARRIER_LBT_SUPPORT_TAG; + nfapi_resp.laa_capability.multi_carrier_lbt_support.value = rand_range(0, 0x0F); + nfapi_resp.num_tlv++; + nfapi_resp.laa_capability.partial_sf_support.tl.tag = NFAPI_LAA_CAPABILITY_PARTIAL_SF_SUPPORT_TAG; + nfapi_resp.laa_capability.partial_sf_support.value = rand_range(0, 1); + nfapi_resp.num_tlv++; + + nfapi_resp.nb_iot_capability.nb_iot_support.tl.tag = NFAPI_LAA_CAPABILITY_NB_IOT_SUPPORT_TAG; + nfapi_resp.nb_iot_capability.nb_iot_support.value = rand_range(0, 2); + nfapi_resp.num_tlv++; + nfapi_resp.nb_iot_capability.nb_iot_operating_mode_capability.tl.tag = NFAPI_LAA_CAPABILITY_NB_IOT_OPERATING_MODE_CAPABILITY_TAG; + nfapi_resp.nb_iot_capability.nb_iot_operating_mode_capability.value = rand_range(0, 1); + nfapi_resp.num_tlv++; + + nfapi_resp.subframe_config.duplex_mode.tl.tag = NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.subframe_config.pcfich_power_offset.tl.tag = NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.subframe_config.pb.tl.tag = NFAPI_SUBFRAME_CONFIG_PB_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.subframe_config.dl_cyclic_prefix_type.tl.tag = NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.subframe_config.ul_cyclic_prefix_type.tl.tag = NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG; + nfapi_resp.num_tlv++; + + nfapi_resp.rf_config.dl_channel_bandwidth.tl.tag = NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.rf_config.ul_channel_bandwidth.tl.tag = NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.rf_config.reference_signal_power.tl.tag = NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.rf_config.tx_antenna_ports.tl.tag = NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.rf_config.rx_antenna_ports.tl.tag = NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG; + nfapi_resp.num_tlv++; + + nfapi_resp.phich_config.phich_resource.tl.tag = NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.phich_config.phich_duration.tl.tag = NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.phich_config.phich_power_offset.tl.tag = NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG; + nfapi_resp.num_tlv++; + + nfapi_resp.sch_config.primary_synchronization_signal_epre_eprers.tl.tag = NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.sch_config.secondary_synchronization_signal_epre_eprers.tl.tag = NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.sch_config.physical_cell_id.tl.tag = NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG; + nfapi_resp.num_tlv++; + + nfapi_resp.prach_config.configuration_index.tl.tag = NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.prach_config.root_sequence_index.tl.tag = NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.prach_config.zero_correlation_zone_configuration.tl.tag = NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.prach_config.high_speed_flag.tl.tag = NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.prach_config.frequency_offset.tl.tag = NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG; + nfapi_resp.num_tlv++; + + nfapi_resp.pusch_config.hopping_mode.tl.tag = NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.pusch_config.hopping_offset.tl.tag = NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.pusch_config.number_of_subbands.tl.tag = NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG; + nfapi_resp.num_tlv++; + + nfapi_resp.pucch_config.delta_pucch_shift.tl.tag = NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.pucch_config.n_cqi_rb.tl.tag = NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.pucch_config.n_an_cs.tl.tag = NFAPI_PUCCH_CONFIG_N_AN_CS_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.pucch_config.n1_pucch_an.tl.tag = NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG; + nfapi_resp.num_tlv++; + + nfapi_resp.srs_config.bandwidth_configuration.tl.tag = NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.srs_config.max_up_pts.tl.tag = NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.srs_config.srs_subframe_configuration.tl.tag = NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.srs_config.srs_acknack_srs_simultaneous_transmission.tl.tag = NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG; + nfapi_resp.num_tlv++; + + nfapi_resp.uplink_reference_signal_config.uplink_rs_hopping.tl.tag = NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.uplink_reference_signal_config.group_assignment.tl.tag = NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.uplink_reference_signal_config.cyclic_shift_1_for_drms.tl.tag = NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG; + nfapi_resp.num_tlv++; + + nfapi_resp.tdd_frame_structure_config.subframe_assignment.tl.tag = NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.tdd_frame_structure_config.special_subframe_patterns.tl.tag = NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG; + nfapi_resp.num_tlv++; + + nfapi_resp.l23_config.data_report_mode.tl.tag = NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG; + nfapi_resp.num_tlv++; + nfapi_resp.l23_config.sfnsf.tl.tag = NFAPI_L23_CONFIG_SFNSF_TAG; + nfapi_resp.num_tlv++; + } + + + { + //if(phy->state == NFAPI_PNF_PHY_IDLE) + //if(nfapi_resp.l1_status.phy_state.value == NFAPI_PNF_PHY_IDLE) + { + // -- NFAPI + // Downlink UEs per Subframe + nfapi_resp.nfapi_config.dl_ue_per_sf.tl.tag = NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG; + nfapi_resp.nfapi_config.dl_ue_per_sf.value = data->phy->dl_ues_per_subframe; + nfapi_resp.num_tlv++; + // Uplink UEs per Subframe + nfapi_resp.nfapi_config.ul_ue_per_sf.tl.tag = NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG; + nfapi_resp.nfapi_config.ul_ue_per_sf.value = data->phy->ul_ues_per_subframe; + nfapi_resp.num_tlv++; + // nFAPI RF Bands + nfapi_resp.nfapi_config.rf_bands.tl.tag = NFAPI_PHY_RF_BANDS_TAG; + nfapi_resp.nfapi_config.rf_bands.number_rf_bands = 2; + nfapi_resp.nfapi_config.rf_bands.rf_band[0] = 23; + nfapi_resp.nfapi_config.rf_bands.rf_band[1] = 7; + + // P7 PNF Address IPv4 + nfapi_resp.nfapi_config.p7_pnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG; + struct sockaddr_in pnf_p7_sockaddr; + pnf_p7_sockaddr.sin_addr.s_addr = inet_addr(data->phy->local_addr.c_str()); + memcpy(&(nfapi_resp.nfapi_config.p7_pnf_address_ipv4.address[0]), &pnf_p7_sockaddr.sin_addr.s_addr, 4); + nfapi_resp.num_tlv++; + // P7 PNF Address IPv6 + // P7 PNF Port + nfapi_resp.nfapi_config.p7_pnf_port.tl.tag = NFAPI_NFAPI_P7_PNF_PORT_TAG; + nfapi_resp.nfapi_config.p7_pnf_port.value = data->phy->local_port; + nfapi_resp.num_tlv++; + // NMM GSM Frequency Bands + nfapi_resp.nfapi_config.nmm_gsm_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG; + nfapi_resp.nfapi_config.nmm_gsm_frequency_bands.number_of_rf_bands = 1; + nfapi_resp.nfapi_config.nmm_gsm_frequency_bands.bands[0] = 23; + nfapi_resp.num_tlv++; + // NMM UMTS Frequency Bands + nfapi_resp.nfapi_config.nmm_umts_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG; + nfapi_resp.nfapi_config.nmm_umts_frequency_bands.number_of_rf_bands = 1; + nfapi_resp.nfapi_config.nmm_umts_frequency_bands.bands[0] = 23; + nfapi_resp.num_tlv++; + // NMM LTE Frequency Bands + nfapi_resp.nfapi_config.nmm_lte_frequency_bands.tl.tag = NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG; + nfapi_resp.nfapi_config.nmm_lte_frequency_bands.number_of_rf_bands = 1; + nfapi_resp.nfapi_config.nmm_lte_frequency_bands.bands[0] = 23; + nfapi_resp.num_tlv++; + // NMM Uplink RSSI supported + nfapi_resp.nfapi_config.nmm_uplink_rssi_supported.tl.tag = NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG; + nfapi_resp.nfapi_config.nmm_uplink_rssi_supported.value = 1; + nfapi_resp.num_tlv++; + + } + } + + + + nfapi_pnf_param_resp(data->config, &nfapi_resp); + + return 0; +} + +int fapi_config_response(fapi_t* fapi, fapi_config_resp_t* resp) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_config_response_t nfapi_resp; + memset(&nfapi_resp, 0, sizeof(nfapi_resp)); + nfapi_resp.header.message_id = NFAPI_CONFIG_RESPONSE; + nfapi_resp.header.phy_id = data->phy_id; + nfapi_resp.error_code = resp->error_code; + nfapi_pnf_config_resp(data->config, &nfapi_resp); + + return 0; +} + +int fapi_subframe_ind(fapi_t* fapi, fapi_subframe_ind_t* resp) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + if(data->phy->first_subframe_ind == 0) + { + printf("Sending nfapi_pnf_start_resp phy_id:%d\n", data->phy_id); + nfapi_start_response_t start_resp; + memset(&start_resp, 0, sizeof(start_resp)); + start_resp.header.message_id = NFAPI_START_RESPONSE; + start_resp.header.phy_id = data->phy_id; + start_resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_start_resp(data->config, &start_resp); + + data->phy->first_subframe_ind = 1; + + if(data->phy->udp.enabled) + { + fapi_start_data(fapi, + data->phy->udp.rx_port, + data->phy->udp.tx_addr.c_str(), + data->phy->udp.tx_port); + } + + } + + + nfapi_pnf_p7_subframe_ind(data->p7_config, data->phy_id, resp->sfn_sf); + + return 0; + +} + +int fapi_harq_ind(fapi_t* fapi, fapi_harq_ind_t* ind) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_harq_indication_t harq_ind; + memset(&harq_ind, 0, sizeof(harq_ind)); + harq_ind.header.message_id = NFAPI_HARQ_INDICATION; + harq_ind.header.phy_id = data->p7_config->phy_id; + harq_ind.sfn_sf = ind->sfn_sf; + + if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) + { + harq_ind.harq_indication_body.tl.tag = NFAPI_HARQ_INDICATION_BODY_TAG; + harq_ind.harq_indication_body.number_of_harqs = 1; + + nfapi_harq_indication_pdu_t pdus[harq_ind.harq_indication_body.number_of_harqs]; + memset(&pdus, 0, sizeof(pdus)); + + pdus[0].rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdus[0].rx_ue_information.handle = rand_range(0, 9999); + pdus[0].rx_ue_information.rnti = rand_range(1, 65535); + + + + pdus[0].harq_indication_tdd_rel8.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL8_TAG; + pdus[0].harq_indication_tdd_rel8.mode = rand_range(0, 4); + pdus[0].harq_indication_tdd_rel8.number_of_ack_nack = rand_range(1, 4); + + switch(pdus[0].harq_indication_tdd_rel8.mode) + { + case 0: + { + pdus[0].harq_indication_tdd_rel8.harq_data.bundling.value_0 = rand_range(1, 7); + pdus[0].harq_indication_tdd_rel8.harq_data.bundling.value_1 = rand_range(1, 7); + } + break; + case 1: + { + pdus[0].harq_indication_tdd_rel8.harq_data.multiplex.value_0 = rand_range(1, 7); + pdus[0].harq_indication_tdd_rel8.harq_data.multiplex.value_1 = rand_range(1, 7); + pdus[0].harq_indication_tdd_rel8.harq_data.multiplex.value_2 = rand_range(1, 7); + pdus[0].harq_indication_tdd_rel8.harq_data.multiplex.value_3 = rand_range(1, 7); + } + break; + case 2: + { + pdus[0].harq_indication_tdd_rel8.harq_data.special_bundling.value_0 = rand_range(1, 7); + } + break; + }; + + + pdus[0].harq_indication_tdd_rel9.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL9_TAG; + pdus[0].harq_indication_tdd_rel9.mode = rand_range(0, 4); + pdus[0].harq_indication_tdd_rel9.number_of_ack_nack = 1; + + switch(pdus[0].harq_indication_tdd_rel9.mode) + { + case 0: + { + pdus[0].harq_indication_tdd_rel9.harq_data[0].bundling.value_0 = rand_range(1, 7); + } + break; + case 1: + { + pdus[0].harq_indication_tdd_rel9.harq_data[0].multiplex.value_0 = rand_range(1, 7); + } + break; + case 2: + { + pdus[0].harq_indication_tdd_rel9.harq_data[0].special_bundling.value_0 = rand_range(1, 7); + } + break; + case 3: + { + pdus[0].harq_indication_tdd_rel9.harq_data[0].channel_selection.value_0 = rand_range(1, 7); + } + break; + case 4: + { + pdus[0].harq_indication_tdd_rel9.harq_data[0].format_3.value_0 = rand_range(1, 7); + } + break; + }; + + + + pdus[0].harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdus[0].harq_indication_tdd_rel13.mode = rand_range(0, 6); + pdus[0].harq_indication_tdd_rel13.number_of_ack_nack = 1; + + switch(pdus[0].harq_indication_tdd_rel13.mode) + { + case 0: + { + pdus[0].harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = rand_range(1, 7); + } + break; + case 1: + { + pdus[0].harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = rand_range(1, 7); + } + break; + case 2: + { + pdus[0].harq_indication_tdd_rel13.harq_data[0].special_bundling.value_0 = rand_range(1, 7); + } + break; + case 3: + { + pdus[0].harq_indication_tdd_rel13.harq_data[0].channel_selection.value_0 = rand_range(1, 7); + } + break; + case 4: + { + pdus[0].harq_indication_tdd_rel13.harq_data[0].format_3.value_0 = rand_range(1, 7); + } + break; + case 5: + { + pdus[0].harq_indication_tdd_rel13.harq_data[0].format_4.value_0 = rand_range(1, 7); + } + break; + case 6: + { + pdus[0].harq_indication_tdd_rel13.harq_data[0].format_5.value_0 = rand_range(1, 7); + } + break; + }; + + pdus[0].harq_indication_fdd_rel8.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL8_TAG; + pdus[0].harq_indication_fdd_rel8.harq_tb1 = rand_range(1, 7); + pdus[0].harq_indication_fdd_rel8.harq_tb2 = rand_range(1, 7); + + pdus[0].harq_indication_fdd_rel9.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL9_TAG; + pdus[0].harq_indication_fdd_rel9.mode = rand_range(0, 2); + pdus[0].harq_indication_fdd_rel9.number_of_ack_nack = 2; + pdus[0].harq_indication_fdd_rel9.harq_tb_n[0] = rand_range(1, 7); + pdus[0].harq_indication_fdd_rel9.harq_tb_n[1] = rand_range(1, 7); + + pdus[0].harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL13_TAG; + pdus[0].harq_indication_fdd_rel13.mode = rand_range(0, 2); + pdus[0].harq_indication_fdd_rel13.number_of_ack_nack = 2; + pdus[0].harq_indication_fdd_rel13.harq_tb_n[0] = rand_range(1, 7); + pdus[0].harq_indication_fdd_rel13.harq_tb_n[1] = rand_range(1, 7); + + pdus[0].ul_cqi_information.tl.tag = NFAPI_UL_CQI_INFORMATION_TAG; + pdus[0].ul_cqi_information.ul_cqi = rand_range(0,255); + pdus[0].ul_cqi_information.channel = rand_range(0, 1); + + harq_ind.harq_indication_body.harq_pdu_list = pdus; + + nfapi_pnf_p7_harq_ind(data->p7_config, &harq_ind); + } + else + { + + harq_ind.harq_indication_body.tl.tag = NFAPI_HARQ_INDICATION_BODY_TAG; + harq_ind.harq_indication_body.number_of_harqs = 8; + + nfapi_harq_indication_pdu_t pdus[8]; + memset(&pdus, 0, sizeof(pdus)); + + for(int i = 0; i < 8; ++i) + { + pdus[i].rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdus[i].rx_ue_information.handle = 0xFF; + pdus[i].rx_ue_information.rnti = i; + + pdus[i].harq_indication_fdd_rel8.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL8_TAG; + pdus[i].harq_indication_fdd_rel8.harq_tb1 = 1; + pdus[i].harq_indication_fdd_rel8.harq_tb2 = 2; + } + + harq_ind.harq_indication_body.harq_pdu_list = pdus; + + nfapi_pnf_p7_harq_ind(data->p7_config, &harq_ind); + } + + return 0; +} + +int fapi_crc_ind(fapi_t* fapi, fapi_crc_ind_t* ind) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_crc_indication_t crc_ind; + memset(&crc_ind, 0, sizeof(crc_ind)); + crc_ind.header.message_id = NFAPI_CRC_INDICATION; + crc_ind.header.phy_id = data->p7_config->phy_id; + crc_ind.sfn_sf = ind->sfn_sf; + + + if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) + { + crc_ind.crc_indication_body.tl.tag = NFAPI_CRC_INDICATION_BODY_TAG; + crc_ind.crc_indication_body.number_of_crcs = 1; + + nfapi_crc_indication_pdu_t pdus[crc_ind.crc_indication_body.number_of_crcs]; + memset(&pdus, 0, sizeof(pdus)); + + pdus[0].rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdus[0].rx_ue_information.handle = rand_range(0, 9999); + pdus[0].rx_ue_information.rnti = rand_range(1, 65535); + + pdus[0].crc_indication_rel8.tl.tag = NFAPI_CRC_INDICATION_REL8_TAG; + pdus[0].crc_indication_rel8.crc_flag = rand_range(0, 1); + + crc_ind.crc_indication_body.crc_pdu_list = pdus; + nfapi_pnf_p7_crc_ind(data->p7_config, &crc_ind); + } + else + { + crc_ind.crc_indication_body.tl.tag = NFAPI_CRC_INDICATION_BODY_TAG; + crc_ind.crc_indication_body.number_of_crcs = ind->body.number_of_crcs; + + crc_ind.crc_indication_body.crc_pdu_list = (nfapi_crc_indication_pdu_t*)malloc(sizeof(nfapi_crc_indication_pdu_t) * ind->body.number_of_crcs); + + for(int i = 0; i < ind->body.number_of_crcs; ++i) + { + crc_ind.crc_indication_body.crc_pdu_list[i].rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + crc_ind.crc_indication_body.crc_pdu_list[i].rx_ue_information.handle = ind->body.pdus[i].rx_ue_info.handle; + crc_ind.crc_indication_body.crc_pdu_list[i].rx_ue_information.rnti = ind->body.pdus[i].rx_ue_info.rnti; + crc_ind.crc_indication_body.crc_pdu_list[i].crc_indication_rel8.tl.tag = NFAPI_CRC_INDICATION_REL8_TAG; + crc_ind.crc_indication_body.crc_pdu_list[i].crc_indication_rel8.crc_flag = ind->body.pdus[i].rel8_pdu.crc_flag; + } + + nfapi_pnf_p7_crc_ind(data->p7_config, &crc_ind); + + free(crc_ind.crc_indication_body.crc_pdu_list); + } + + return 0; +} +int fapi_rx_ulsch_ind(fapi_t* fapi, fapi_rx_ulsch_ind_t* ind) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_rx_indication_t rx_ind; + memset(&rx_ind, 0, sizeof(rx_ind)); + rx_ind.header.message_id = NFAPI_RX_ULSCH_INDICATION; + rx_ind.header.phy_id = data->p7_config->phy_id; + rx_ind.sfn_sf = ind->sfn_sf; + + if(1)//((pnf_info*)(data->config->user_data))->wireshark_test_mode) + { + rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG; + rx_ind.rx_indication_body.number_of_pdus = 1; + + uint8_t rx_data[1024]; + + nfapi_rx_indication_pdu_t pdus[rx_ind.rx_indication_body.number_of_pdus]; + memset(&pdus, 0, sizeof(pdus)); + + strcpy((char*)rx_data, (char*)"123456789"); + + for(int i = 0; i < rx_ind.rx_indication_body.number_of_pdus;++i) + { + + pdus[i].rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdus[i].rx_ue_information.handle = rand_range(0, 9999); + pdus[i].rx_ue_information.rnti = rand_range(1, 65535); + + pdus[i].rx_indication_rel8.tl.tag = NFAPI_RX_INDICATION_REL8_TAG; + pdus[i].rx_indication_rel8.length = 10;//rand_range(0, 1024); + pdus[i].rx_indication_rel8.offset = 0;//djp - 1; + pdus[i].rx_indication_rel8.ul_cqi = rand_range(0, 255); + pdus[i].rx_indication_rel8.timing_advance = rand_range(0, 63); + + //pdus[i].rx_indication_rel9.tl.tag = NFAPI_RX_INDICATION_REL9_TAG; + //pdus[i].rx_indication_rel9.timing_advance_r9 = rand_range(0, 7690); + + pdus[i].data = &rx_data[0]; + } + + rx_ind.rx_indication_body.rx_pdu_list = pdus; + + nfapi_pnf_p7_rx_ind(data->p7_config, &rx_ind); + } + else + { + + rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG; + rx_ind.rx_indication_body.number_of_pdus = ind->body.number_of_pdus; + + rx_ind.rx_indication_body.rx_pdu_list = (nfapi_rx_indication_pdu_t*)malloc(sizeof(nfapi_rx_indication_pdu_t) * ind->body.number_of_pdus); + + for(int i = 0; i < ind->body.number_of_pdus; ++i) + { + rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.handle = ind->body.pdus[i].rx_ue_info.handle; + rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.tl.tag = NFAPI_RX_INDICATION_REL8_TAG; + rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.length = ind->body.pdus[i].rel8_pdu.length; + rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.offset = 1; + rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel9.tl.tag = 0; + rx_ind.rx_indication_body.rx_pdu_list[i].data = (uint8_t*)ind->body.data[i]; + + } + + nfapi_pnf_p7_rx_ind(data->p7_config, &rx_ind); + + free(rx_ind.rx_indication_body.rx_pdu_list); + } + + return 0; + +} +int fapi_rx_cqi_ind(fapi_t* fapi, fapi_rx_cqi_ind_t* ind) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_cqi_indication_t cqi_ind; + memset(&cqi_ind, 0, sizeof(cqi_ind)); + cqi_ind.header.message_id = NFAPI_RX_CQI_INDICATION; + cqi_ind.header.phy_id = data->p7_config->phy_id; + cqi_ind.sfn_sf = ind->sfn_sf; + + if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) + { + cqi_ind.cqi_indication_body.tl.tag = NFAPI_CQI_INDICATION_BODY_TAG; + cqi_ind.cqi_indication_body.number_of_cqis = 3; + + nfapi_cqi_indication_pdu_t cqi_pdu_list[cqi_ind.cqi_indication_body.number_of_cqis]; + memset(&cqi_pdu_list, 0, sizeof(cqi_pdu_list)); + nfapi_cqi_indication_raw_pdu_t cqi_raw_pdu_list[cqi_ind.cqi_indication_body.number_of_cqis]; + //memset(&cqi_raw_pdu_list, 0, sizeof(cqi_raw_pdu_list)); + + + for(int i = 0; i < cqi_ind.cqi_indication_body.number_of_cqis; ++i) + { + cqi_pdu_list[i].rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + cqi_pdu_list[i].rx_ue_information.handle = rand_range(0, 9999); + cqi_pdu_list[i].rx_ue_information.rnti = rand_range(1, 65535); + + uint8_t rel8_or_9 = rand_range(0, 1); + + if(rel8_or_9) + { + cqi_pdu_list[i].cqi_indication_rel8.tl.tag = NFAPI_CQI_INDICATION_REL8_TAG; + cqi_pdu_list[i].cqi_indication_rel8.length = 8; //rand_range(1, 12); + cqi_pdu_list[i].cqi_indication_rel8.data_offset = 1; //rand_range(0, 1); + cqi_pdu_list[i].cqi_indication_rel8.ul_cqi = 0; + cqi_pdu_list[i].cqi_indication_rel8.ri = rand_range(0, 4); + cqi_pdu_list[i].cqi_indication_rel8.timing_advance = rand_range(0, 63); + } + else + { + cqi_pdu_list[i].cqi_indication_rel9.tl.tag = NFAPI_CQI_INDICATION_REL9_TAG; + cqi_pdu_list[i].cqi_indication_rel9.length = 8; //rand_range(1, 12); + cqi_pdu_list[i].cqi_indication_rel9.data_offset = 1; //rand_range(0, 1); + cqi_pdu_list[i].cqi_indication_rel9.ul_cqi = 0; //rand_range(0, 1); + cqi_pdu_list[i].cqi_indication_rel9.number_of_cc_reported = 1; + cqi_pdu_list[i].cqi_indication_rel9.ri[0] = rand_range(0, 8); + cqi_pdu_list[i].cqi_indication_rel9.timing_advance = rand_range(0, 63); + cqi_pdu_list[i].cqi_indication_rel9.timing_advance_r9 = rand_range(0, 7690); + } + + cqi_pdu_list[i].ul_cqi_information.tl.tag = NFAPI_UL_CQI_INFORMATION_TAG; + cqi_pdu_list[i].ul_cqi_information.ul_cqi = rand_range(0,255); + cqi_pdu_list[i].ul_cqi_information.channel = rand_range(0, 1); + } + + cqi_ind.cqi_indication_body.cqi_pdu_list = cqi_pdu_list; + cqi_ind.cqi_indication_body.cqi_raw_pdu_list = cqi_raw_pdu_list; + + nfapi_pnf_p7_cqi_ind(data->p7_config, &cqi_ind); + } + else + { + nfapi_pnf_p7_cqi_ind(data->p7_config, &cqi_ind); + } + + return 0; +} +int fapi_rx_sr_ind(fapi_t* fapi, fapi_rx_sr_ind_t* ind) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_sr_indication_t sr_ind; + memset(&sr_ind, 0, sizeof(sr_ind)); + sr_ind.header.message_id = NFAPI_RX_SR_INDICATION; + sr_ind.header.phy_id = data->p7_config->phy_id; + sr_ind.sfn_sf = ind->sfn_sf; + + if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) + { + sr_ind.sr_indication_body.tl.tag = NFAPI_SR_INDICATION_BODY_TAG; + sr_ind.sr_indication_body.number_of_srs = 1; + + nfapi_sr_indication_pdu_t pdus[sr_ind.sr_indication_body.number_of_srs]; + memset(&pdus, 0, sizeof(pdus)); + + pdus[0].rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdus[0].rx_ue_information.handle = rand_range(0, 9999); + pdus[0].rx_ue_information.rnti = rand_range(1, 65535); + + pdus[0].ul_cqi_information.tl.tag = NFAPI_UL_CQI_INFORMATION_TAG; + pdus[0].ul_cqi_information.ul_cqi = rand_range(0,255); + pdus[0].ul_cqi_information.channel = rand_range(0, 1); + + sr_ind.sr_indication_body.sr_pdu_list = pdus; + + nfapi_pnf_p7_sr_ind(data->p7_config, &sr_ind); + } + else + { + nfapi_pnf_p7_sr_ind(data->p7_config, &sr_ind); + } + + return 0; +} + +int fapi_rach_ind(fapi_t* fapi, fapi_rach_ind_t* ind) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_rach_indication_t rach_ind; + memset(&rach_ind, 0, sizeof(rach_ind)); + rach_ind.header.message_id = NFAPI_RACH_INDICATION; + rach_ind.header.phy_id = data->p7_config->phy_id; + rach_ind.sfn_sf = ind->sfn_sf; + + if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) + { + rach_ind.rach_indication_body.tl.tag = NFAPI_RACH_INDICATION_BODY_TAG; + rach_ind.rach_indication_body.number_of_preambles = 1; + + nfapi_preamble_pdu_t pdus[rach_ind.rach_indication_body.number_of_preambles]; + memset(&pdus, 0, sizeof(pdus)); + + pdus[0].preamble_rel8.tl.tag = NFAPI_PREAMBLE_REL8_TAG; + pdus[0].preamble_rel8.rnti = rand_range(1, 65535); + pdus[0].preamble_rel8.preamble = rand_range(0, 63); + pdus[0].preamble_rel8.timing_advance = rand_range(0, 1282); + pdus[0].preamble_rel9.tl.tag = NFAPI_PREAMBLE_REL9_TAG; + pdus[0].preamble_rel9.timing_advance_r9 = rand_range(0, 7690); + pdus[0].preamble_rel13.tl.tag = NFAPI_PREAMBLE_REL13_TAG; + pdus[0].preamble_rel13.rach_resource_type = rand_range(0, 4); + + rach_ind.rach_indication_body.preamble_list = pdus; + nfapi_pnf_p7_rach_ind(data->p7_config, &rach_ind); + } + else + { + nfapi_pnf_p7_rach_ind(data->p7_config, &rach_ind); + } + + return 0; +} + +int fapi_srs_ind(fapi_t* fapi, fapi_srs_ind_t* ind) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_srs_indication_t srs_ind; + memset(&srs_ind, 0, sizeof(srs_ind)); + srs_ind.header.message_id = NFAPI_SRS_INDICATION; + srs_ind.header.phy_id = data->p7_config->phy_id; + srs_ind.sfn_sf = ind->sfn_sf; + + if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) + { + srs_ind.srs_indication_body.tl.tag = NFAPI_SRS_INDICATION_BODY_TAG; + srs_ind.srs_indication_body.number_of_ues = 1; + + nfapi_srs_indication_pdu_t pdus[srs_ind.srs_indication_body.number_of_ues]; + memset(&pdus, 0, sizeof(pdus)); + + pdus[0].rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdus[0].rx_ue_information.handle = rand_range(0, 9999); + pdus[0].rx_ue_information.rnti = rand_range(1, 65535); + + pdus[0].srs_indication_fdd_rel8.tl.tag = NFAPI_SRS_INDICATION_FDD_REL8_TAG; + pdus[0].srs_indication_fdd_rel8.doppler_estimation = rand_range(0, 255); + pdus[0].srs_indication_fdd_rel8.timing_advance = rand_range(0, 63); + pdus[0].srs_indication_fdd_rel8.number_of_resource_blocks = 2; //rand_range(0, 255); + pdus[0].srs_indication_fdd_rel8.rb_start = rand_range(0, 245); + pdus[0].srs_indication_fdd_rel8.snr[0] = rand_range(0, 255); + pdus[0].srs_indication_fdd_rel8.snr[1] = rand_range(0, 255); + + pdus[0].srs_indication_fdd_rel9.tl.tag = NFAPI_SRS_INDICATION_FDD_REL9_TAG; + pdus[0].srs_indication_fdd_rel9.timing_advance_r9 = rand_range(0, 7690); + + pdus[0].srs_indication_tdd_rel10.tl.tag = NFAPI_SRS_INDICATION_TDD_REL10_TAG; + pdus[0].srs_indication_tdd_rel10.uppts_symbol = rand_range(0, 1); + + pdus[0].srs_indication_fdd_rel11.tl.tag = NFAPI_SRS_INDICATION_FDD_REL11_TAG; + pdus[0].srs_indication_fdd_rel11.ul_rtoa; + + pdus[0].tdd_channel_measurement.tl.tag = NFAPI_TDD_CHANNEL_MEASUREMENT_TAG; + pdus[0].tdd_channel_measurement.num_prb_per_subband = rand_range(0, 255); + pdus[0].tdd_channel_measurement.number_of_subbands = 1; + pdus[0].tdd_channel_measurement.num_atennas = 2; + pdus[0].tdd_channel_measurement.subands[0].subband_index = rand_range(0, 255); + pdus[0].tdd_channel_measurement.subands[0].channel[0] = rand_range(0, 9999); + pdus[0].tdd_channel_measurement.subands[0].channel[1] = rand_range(0, 9999); + + srs_ind.srs_indication_body.srs_pdu_list = pdus; + nfapi_pnf_p7_srs_ind(data->p7_config, &srs_ind); + } + else + { + nfapi_pnf_p7_srs_ind(data->p7_config, &srs_ind); + } + + return 0; +} + +int fapi_lbt_dl_ind(fapi_t* fapi, fapi_lbt_dl_ind_t* ind) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_lbt_dl_indication_t lbt_dl_ind; + memset(&lbt_dl_ind, 0, sizeof(lbt_dl_ind)); + lbt_dl_ind.header.message_id = NFAPI_LBT_DL_INDICATION; + lbt_dl_ind.header.phy_id = data->p7_config->phy_id; + lbt_dl_ind.sfn_sf = ind->sfn_sf; + + if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) + { + lbt_dl_ind.lbt_dl_indication_body.tl.tag = NFAPI_LBT_DL_INDICATION_BODY_TAG; + lbt_dl_ind.lbt_dl_indication_body.number_of_pdus = 2; + + nfapi_lbt_dl_indication_pdu_t pdus[lbt_dl_ind.lbt_dl_indication_body.number_of_pdus]; + memset(&pdus, 0, sizeof(pdus)); + + pdus[0].pdu_type = 0; // LBT_PDSCH_RSP PDU + pdus[0].pdu_size = 0; + pdus[0].lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13.tl.tag = NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG; + pdus[0].lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13.handle = 0xABCD; + pdus[0].lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13.result = rand_range(0, 1); + pdus[0].lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13.lte_txop_symbols = rand_range(0, 0xFFFF); + pdus[0].lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13.initial_partial_sf = rand_range(0, 1); + + pdus[1].pdu_type = 1; // LBT_DRS_RSP PDU + pdus[1].pdu_size = 0; + pdus[1].lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13.tl.tag = NFAPI_LBT_DRS_RSP_PDU_REL13_TAG; + pdus[1].lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13.handle = 0xABCD; + pdus[1].lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13.result = rand_range(0, 1); + + lbt_dl_ind.lbt_dl_indication_body.lbt_indication_pdu_list = pdus; + nfapi_pnf_p7_lbt_dl_ind(data->p7_config, &lbt_dl_ind); + } + else + { + nfapi_pnf_p7_lbt_dl_ind(data->p7_config, &lbt_dl_ind); + } + + return 0; +} + +int fapi_nb_harq_ind(fapi_t* fapi, fapi_nb_harq_ind_t* ind) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_nb_harq_indication_t nb_harq_ind; + memset(&nb_harq_ind, 0, sizeof(nb_harq_ind)); + nb_harq_ind.header.message_id = NFAPI_NB_HARQ_INDICATION; + nb_harq_ind.header.phy_id = data->p7_config->phy_id; + nb_harq_ind.sfn_sf = ind->sfn_sf; + + if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) + { + + nb_harq_ind.nb_harq_indication_body.tl.tag = NFAPI_NB_HARQ_INDICATION_BODY_TAG; + nb_harq_ind.nb_harq_indication_body.number_of_harqs = 1; + + nfapi_nb_harq_indication_pdu_t pdus[nb_harq_ind.nb_harq_indication_body.number_of_harqs]; + memset(&pdus, 0, sizeof(pdus)); + + pdus[0].rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdus[0].rx_ue_information.handle = rand_range(0, 0xFFFF); + pdus[0].rx_ue_information.rnti = rand_range(0, 65535); + + pdus[0].nb_harq_indication_fdd_rel13.tl.tag = NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG; + pdus[0].nb_harq_indication_fdd_rel13.harq_tb1 = rand_range(1, 7); + + pdus[0].ul_cqi_information.tl.tag = NFAPI_UL_CQI_INFORMATION_TAG; + pdus[0].ul_cqi_information.ul_cqi = rand_range(0, 255); + pdus[0].ul_cqi_information.channel = rand_range(0, 1); + + nb_harq_ind.nb_harq_indication_body.nb_harq_pdu_list = pdus; + nfapi_pnf_p7_nb_harq_ind(data->p7_config, &nb_harq_ind); + } + else + { + nfapi_pnf_p7_nb_harq_ind(data->p7_config, &nb_harq_ind); + } + + return 0; +} + +int fapi_nrach_ind(fapi_t* fapi, fapi_nrach_ind_t* ind) +{ + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)(fapi->user_data); + + nfapi_nrach_indication_t nrach_ind; + memset(&nrach_ind, 0, sizeof(nrach_ind)); + nrach_ind.header.message_id = NFAPI_NRACH_INDICATION; + nrach_ind.header.phy_id = data->p7_config->phy_id; + nrach_ind.sfn_sf = ind->sfn_sf; + + if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) + { + nrach_ind.nrach_indication_body.tl.tag = NFAPI_NRACH_INDICATION_BODY_TAG; + nrach_ind.nrach_indication_body.number_of_initial_scs_detected = 1; + + nfapi_nrach_indication_pdu_t pdus[nrach_ind.nrach_indication_body.number_of_initial_scs_detected]; + memset(&pdus, 0, sizeof(pdus)); + + pdus[0].nrach_indication_rel13.tl.tag = NFAPI_NRACH_INDICATION_REL13_TAG; + pdus[0].nrach_indication_rel13.rnti = rand_range(1, 65535); + pdus[0].nrach_indication_rel13.initial_sc = rand_range(0, 47); + pdus[0].nrach_indication_rel13.timing_advance = rand_range(0, 3840); + pdus[0].nrach_indication_rel13.nrach_ce_level = rand_range(0, 2); + + nrach_ind.nrach_indication_body.nrach_pdu_list = pdus; + + nfapi_pnf_p7_nrach_ind(data->p7_config, &nrach_ind); + } + else + { + nfapi_pnf_p7_nrach_ind(data->p7_config, &nrach_ind); + } + + return 0; +} + +int pnf_start_request(nfapi_pnf_config_t* config, nfapi_pnf_start_request_t* req) +{ + + pnf_info* pnf = (pnf_info*)(config->user_data); + + // start all phys that have been configured + for(phy_info& phy : pnf->phys) + { + if(phy.id != 0) + { + //auto found = std::find_if(pnf->phys.begin(), pnf->phys.end(), [&](phy_info& item) + // { return item.id == req->header.phy_id; }); +// +// if(found != pnf->phys.end()) +// { +// phy_info& phy = (*found); + + fapi_cb_t cb; + cb.fapi_param_response = &fapi_param_response; + cb.fapi_config_response = &fapi_config_response; + cb.fapi_subframe_ind = &fapi_subframe_ind; + cb.fapi_harq_ind = fapi_harq_ind; + cb.fapi_crc_ind = fapi_crc_ind; + cb.fapi_rx_ulsch_ind = fapi_rx_ulsch_ind; + cb.fapi_rx_cqi_ind = fapi_rx_cqi_ind; + cb.fapi_rx_sr_ind = fapi_rx_sr_ind; + cb.fapi_rach_ind = fapi_rach_ind; + cb.fapi_srs_ind = fapi_srs_ind; + + cb.fapi_lbt_dl_ind = fapi_lbt_dl_ind; + cb.fapi_nb_harq_ind = fapi_nb_harq_ind; + cb.fapi_nrach_ind = fapi_nrach_ind; + + + + fapi_config_t c; + c.duplex_mode = phy.duplex_mode; + c.dl_channel_bw_support = phy.dl_channel_bw_support; + c.ul_channel_bw_support = phy.ul_channel_bw_support; + + phy.fapi = fapi_create(&cb, &c); + printf("[PNF_SIM] staring fapi %p phy_id:%d\n", phy.fapi, phy.id); + + pnf_phy_user_data_t* data = (pnf_phy_user_data_t*)malloc(sizeof(pnf_phy_user_data_t)); + data->phy_id = phy.id; + data->config = config; + data->phy = &phy; + + phy.fapi->user_data = data; + } + + } + + nfapi_pnf_start_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_START_RESPONSE; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_pnf_start_resp(config, &resp); + + return 0; +} + +int pnf_stop_request(nfapi_pnf_config_t* config, nfapi_pnf_stop_request_t* req) +{ + printf("[PNF_SIM] pnf stop request\n"); + + nfapi_pnf_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_STOP_RESPONSE; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_pnf_stop_resp(config, &resp); + + return 0; +} + +int param_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_param_request_t* req) +{ + printf("[PNF_SIM] param request phy_id:%d\n", req->header.phy_id); + + pnf_info* pnf = (pnf_info*)(config->user_data); + + auto found = std::find_if(pnf->phys.begin(), pnf->phys.end(), [&](phy_info& item) + { return item.id == req->header.phy_id; }); + + if(found != pnf->phys.end()) + { + phy_info& phy_info = (*found); + + fapi_param_req_t fapi_req; + fapi_req.header.message_id = req->header.message_id; + fapi_req.header.length = 0; + + // convert nfapi to fapi + + fapi_param_request(phy_info.fapi, &fapi_req); + + } + else + { + // did not find the phy + } + + + printf("[PNF_SIM] param request .. exit\n"); + + + return 0; +} + +int config_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_config_request_t* req) +{ + printf("[PNF_SIM] config request phy_id:%d\n", req->header.phy_id); + + pnf_info* pnf = (pnf_info*)(config->user_data); + + auto found = std::find_if(pnf->phys.begin(), pnf->phys.end(), [&](phy_info& item) + { return item.id == req->header.phy_id; }); + + if(found != pnf->phys.end()) + { + phy_info& phy_info = (*found); + + + if(req->nfapi_config.timing_window.tl.tag == NFAPI_NFAPI_TIMING_WINDOW_TAG) + { + phy_info.timing_window = req->nfapi_config.timing_window.value; + } + + if(req->nfapi_config.timing_info_mode.tl.tag == NFAPI_NFAPI_TIMING_INFO_MODE_TAG) + { + printf("timing info mode provided\n"); + phy_info.timing_info_mode = req->nfapi_config.timing_info_mode.value; + } + else + { + phy_info.timing_info_mode = 0; + printf("NO timing info mode provided\n"); + } + + if(req->nfapi_config.timing_info_period.tl.tag == NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG) + { + printf("timing info period provided\n"); + phy_info.timing_info_period = req->nfapi_config.timing_info_period.value; + } + else + { + phy_info.timing_info_period = 0; + } + + phy_info.remote_port = req->nfapi_config.p7_vnf_port.value; + + struct sockaddr_in vnf_p7_sockaddr; + memcpy(&vnf_p7_sockaddr.sin_addr.s_addr, &(req->nfapi_config.p7_vnf_address_ipv4.address[0]), 4); + phy_info.remote_addr = inet_ntoa(vnf_p7_sockaddr.sin_addr); + + printf("[PNF_SIM] %d vnf p7 %s:%d timing %d %d %d\n", phy_info.id, phy_info.remote_addr, phy_info.remote_port, + phy_info.timing_window, phy_info.timing_info_mode, phy_info.timing_info_period); + + fapi_config_req_t fapi_req; + fapi_config_request(phy_info.fapi, &fapi_req); + } + + return 0; +} + +nfapi_p7_message_header_t* phy_allocate_p7_vendor_ext(uint16_t message_id, uint16_t* msg_size) +{ + if(message_id == P7_VENDOR_EXT_REQ) + { + (*msg_size) = sizeof(vendor_ext_p7_req); + return (nfapi_p7_message_header_t*)malloc(sizeof(vendor_ext_p7_req)); + } + + return 0; +} + +void phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t* header) +{ + free(header); +} + +int phy_dl_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_dl_config_request_t* req) +{ + //printf("[PNF_SIM] dl config request\n"); + + if(req->vendor_extension) + free(req->vendor_extension); + + phy_info* phy = (phy_info*)(pnf_p7->user_data); + + fapi_dl_config_req_t fapi_req; + // convert + fapi_dl_config_request(phy->fapi, &fapi_req); + + return 0; +} +int phy_ul_config_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_ul_config_request_t* req) +{ + //printf("[PNF_SIM] ul config request\n"); + phy_info* phy = (phy_info*)(pnf_p7->user_data); + + fapi_ul_config_req_t fapi_req; + // convert + fapi_ul_config_request(phy->fapi, &fapi_req); + + return 0; +} +int phy_hi_dci0_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_hi_dci0_request_t* req) +{ + //printf("[PNF_SIM] hi dci0 request\n"); + phy_info* phy = (phy_info*)(pnf_p7->user_data); + + fapi_hi_dci0_req_t fapi_req; + // convert + fapi_hi_dci0_request(phy->fapi, &fapi_req); + return 0; +} +int phy_tx_req(nfapi_pnf_p7_config_t* pnf_p7, nfapi_tx_request_t* req) +{ + //printf("[PNF_SIM] tx request\n"); + phy_info* phy = (phy_info*)(pnf_p7->user_data); + + fapi_tx_req_t fapi_req; + fapi_req.header.message_id = FAPI_TX_REQUEST; + fapi_req.sfn_sf = req->sfn_sf; + fapi_req.body.number_of_pdus = req->tx_request_body.number_of_pdus; + + fapi_tx_req_pdu_t pdus[8]; + fapi_req.body.pdus = &pdus[0]; + + for(int i = 0; i < fapi_req.body.number_of_pdus; ++i) + { + fapi_req.body.pdus[i].pdu_length = req->tx_request_body.tx_pdu_list[i].pdu_length; + fapi_req.body.pdus[i].pdu_index = req->tx_request_body.tx_pdu_list[i].pdu_index; + fapi_req.body.pdus[i].num_tlv = 1; + fapi_req.body.pdus[i].tlvs[0].value = (uint32_t*)req->tx_request_body.tx_pdu_list[i].segments[0].segment_data; + + //if the pnf wants to retain the pointer then req->tx_request_body.tx_pdu_list[i].segments[0].segment_data should be set to 0 + + + } + + fapi_tx_request(phy->fapi, &fapi_req); +/* + if(fapi_req.body.number_of_pdus > 0) + { + for(int i = 0; i < fapi_req.body.number_of_pdus; ++i) + { + //printf("freeing tx pdu %p\n", fapi_req.body.pdus[i].tlvs[0].value); + if(0) + { + free(fapi_req.body.pdus[i].tlvs[0].value); + } + else + { + pnf_deallocate(fapi_req.body.pdus[i].tlvs[0].value); + } + } + } +*/ + + return 0; +} +int phy_lbt_dl_config_req(nfapi_pnf_p7_config_t*, nfapi_lbt_dl_config_request_t* req) +{ + //printf("[PNF_SIM] lbt dl config request\n"); + return 0; +} + +int phy_vendor_ext(nfapi_pnf_p7_config_t* config, nfapi_p7_message_header_t* msg) +{ + if(msg->message_id == P7_VENDOR_EXT_REQ) + { + vendor_ext_p7_req* req = (vendor_ext_p7_req*)msg; + //printf("[PNF_SIM] vendor request (1:%d 2:%d)\n", req->dummy1, req->dummy2); + } + else + { + printf("[PNF_SIM] unknown vendor ext\n"); + } + return 0; +} + + + +int phy_pack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t** ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* codex) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P7_VENDOR_EXT_IND) + { + vendor_ext_p7_ind* ind = (vendor_ext_p7_ind*)(header); + if(!push16(ind->error_code, ppWritePackedMsg, end)) + return 0; + + return 1; + } + return -1; +} + +int phy_unpack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t** ppReadPackedMessage, uint8_t *end, nfapi_p7_codec_config_t* codec) +{ + if(header->message_id == P7_VENDOR_EXT_REQ) + { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + vendor_ext_p7_req* req = (vendor_ext_p7_req*)(header); + if(!(pull16(ppReadPackedMessage, &req->dummy1, end) && + pull16(ppReadPackedMessage, &req->dummy2, end))) + return 0; + return 1; + } + return -1; +} + +int phy_unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMessage, uint8_t* end, void** ve, nfapi_p7_codec_config_t* config) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "phy_unpack_vendor_extension_tlv\n"); + + switch(tl->tag) + { + case VENDOR_EXT_TLV_1_TAG: + *ve = malloc(sizeof(vendor_ext_tlv_1)); + if(!pull32(ppReadPackedMessage, &((vendor_ext_tlv_1*)(*ve))->dummy, end)) + return 0; + + return 1; + break; + } + + return -1; +} + +int phy_pack_vendor_extention_tlv(void* ve, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p7_codec_config_t* config) +{ + //printf("%s\n", __FUNCTION__); + (void)ve; + (void)ppWritePackedMsg; + return -1; +} + +int pnf_sim_unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMessage, uint8_t *end, void** ve, nfapi_p4_p5_codec_config_t* config) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "pnf_sim_unpack_vendor_extension_tlv\n"); + + switch(tl->tag) + { + case VENDOR_EXT_TLV_2_TAG: + *ve = malloc(sizeof(vendor_ext_tlv_2)); + if(!pull32(ppReadPackedMessage, &((vendor_ext_tlv_2*)(*ve))->dummy, end)) + return 0; + + return 1; + break; + } + + return -1; +} + +int pnf_sim_pack_vendor_extention_tlv(void* ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + //printf("%s\n", __FUNCTION__); + (void)ve; + (void)ppWritePackedMsg; + return -1; +} +int start_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_start_request_t* req) +{ + printf("[PNF_SIM] start request phy_id:%d\n", req->header.phy_id); + + pnf_info* pnf = (pnf_info*)(config->user_data); + + auto found = std::find_if(pnf->phys.begin(), pnf->phys.end(), [&](phy_info& item) + { return item.id == req->header.phy_id; }); + + if(found != pnf->phys.end()) + { + phy_info& phy_info = (*found); + + + nfapi_pnf_p7_config_t* p7_config = nfapi_pnf_p7_config_create(); + + p7_config->phy_id = phy->phy_id; + + p7_config->remote_p7_port = phy_info.remote_port; + p7_config->remote_p7_addr = phy_info.remote_addr; + p7_config->local_p7_port = phy_info.local_port; + p7_config->local_p7_addr = (char*)phy_info.local_addr.c_str(); + p7_config->user_data = &phy_info; + + p7_config->malloc = &pnf_allocate; + p7_config->free = &pnf_deallocate; + p7_config->codec_config.allocate = &pnf_allocate; + p7_config->codec_config.deallocate = &pnf_deallocate; + + p7_config->trace = &pnf_sim_trace; + + phy->user_data = p7_config; + + p7_config->subframe_buffer_size = phy_info.timing_window; + if(phy_info.timing_info_mode & 0x1) + { + p7_config->timing_info_mode_periodic = 1; + p7_config->timing_info_period = phy_info.timing_info_period; + } + + if(phy_info.timing_info_mode & 0x2) + { + p7_config->timing_info_mode_aperiodic = 1; + } + + p7_config->dl_config_req = &phy_dl_config_req; + p7_config->ul_config_req = &phy_ul_config_req; + p7_config->hi_dci0_req = &phy_hi_dci0_req; + p7_config->tx_req = &phy_tx_req; + p7_config->lbt_dl_config_req = &phy_lbt_dl_config_req; + + p7_config->vendor_ext = &phy_vendor_ext; + + p7_config->allocate_p7_vendor_ext = &phy_allocate_p7_vendor_ext; + p7_config->deallocate_p7_vendor_ext = &phy_deallocate_p7_vendor_ext; + + p7_config->codec_config.unpack_p7_vendor_extension = &phy_unpack_p7_vendor_extension; + p7_config->codec_config.pack_p7_vendor_extension = &phy_pack_p7_vendor_extension; + p7_config->codec_config.unpack_vendor_extension_tlv = &phy_unpack_vendor_extension_tlv; + p7_config->codec_config.pack_vendor_extension_tlv = &phy_pack_vendor_extention_tlv; + + pthread_t p7_thread; + pthread_create(&p7_thread, NULL, &pnf_p7_thread_start, p7_config); + + + ((pnf_phy_user_data_t*)(phy_info.fapi->user_data))->p7_config = p7_config; + + fapi_start_req_t fapi_req; + fapi_start_request(phy_info.fapi, &fapi_req); + + } + + return 0; +} + +int measurement_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_measurement_request_t* req) +{ + nfapi_measurement_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_MEASUREMENT_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_MSG_OK; + nfapi_pnf_measurement_resp(config, &resp); + return 0; +} +int rssi_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_rssi_request_t* req) +{ + nfapi_rssi_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_RSSI_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_rssi_resp(config, &resp); + + nfapi_rssi_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_RSSI_INDICATION; + ind.header.phy_id = req->header.phy_id; + ind.error_code = NFAPI_P4_MSG_OK; + ind.rssi_indication_body.tl.tag = NFAPI_RSSI_INDICATION_TAG; + ind.rssi_indication_body.number_of_rssi = 1; + ind.rssi_indication_body.rssi[0] = -42; + nfapi_pnf_rssi_ind(config, &ind); + return 0; +} +int cell_search_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_cell_search_request_t* req) +{ + nfapi_cell_search_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_CELL_SEARCH_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_cell_search_resp(config, &resp); + + nfapi_cell_search_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_CELL_SEARCH_INDICATION; + ind.header.phy_id = req->header.phy_id; + ind.error_code = NFAPI_P4_MSG_OK; + + switch(req->rat_type) + { + case NFAPI_RAT_TYPE_LTE: + { + ind.lte_cell_search_indication.tl.tag = NFAPI_LTE_CELL_SEARCH_INDICATION_TAG; + ind.lte_cell_search_indication.number_of_lte_cells_found = 1; + ind.lte_cell_search_indication.lte_found_cells[0].pci = 123; + ind.lte_cell_search_indication.lte_found_cells[0].rsrp = 123; + ind.lte_cell_search_indication.lte_found_cells[0].rsrq = 123; + ind.lte_cell_search_indication.lte_found_cells[0].frequency_offset = 123; + } + break; + case NFAPI_RAT_TYPE_UTRAN: + { + ind.utran_cell_search_indication.tl.tag = NFAPI_UTRAN_CELL_SEARCH_INDICATION_TAG; + ind.utran_cell_search_indication.number_of_utran_cells_found = 1; + ind.utran_cell_search_indication.utran_found_cells[0].psc = 89; + ind.utran_cell_search_indication.utran_found_cells[0].rscp = 89; + ind.utran_cell_search_indication.utran_found_cells[0].ecno = 89; + ind.utran_cell_search_indication.utran_found_cells[0].frequency_offset = -89; + + } + break; + case NFAPI_RAT_TYPE_GERAN: + { + ind.geran_cell_search_indication.tl.tag = NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG; + ind.geran_cell_search_indication.number_of_gsm_cells_found = 1; + ind.geran_cell_search_indication.gsm_found_cells[0].bsic = 23; + ind.geran_cell_search_indication.gsm_found_cells[0].rxlev = 23; + ind.geran_cell_search_indication.gsm_found_cells[0].rxqual = 23; + ind.geran_cell_search_indication.gsm_found_cells[0].frequency_offset = -23; + ind.geran_cell_search_indication.gsm_found_cells[0].sfn_offset = 230; + + } + break; + } + + ind.pnf_cell_search_state.tl.tag = NFAPI_PNF_CELL_SEARCH_STATE_TAG; + ind.pnf_cell_search_state.length = 3; + + nfapi_pnf_cell_search_ind(config, &ind); + return 0; +} +int broadcast_detect_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_broadcast_detect_request_t* req) +{ + nfapi_broadcast_detect_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_BROADCAST_DETECT_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_broadcast_detect_resp(config, &resp); + + nfapi_broadcast_detect_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_BROADCAST_DETECT_INDICATION; + ind.header.phy_id = req->header.phy_id; + ind.error_code = NFAPI_P4_MSG_OK; + + switch(req->rat_type) + { + case NFAPI_RAT_TYPE_LTE: + { + ind.lte_broadcast_detect_indication.tl.tag = NFAPI_LTE_BROADCAST_DETECT_INDICATION_TAG; + ind.lte_broadcast_detect_indication.number_of_tx_antenna = 1; + ind.lte_broadcast_detect_indication.mib_length = 4; + //ind.lte_broadcast_detect_indication.mib... + ind.lte_broadcast_detect_indication.sfn_offset = 77; + + } + break; + case NFAPI_RAT_TYPE_UTRAN: + { + ind.utran_broadcast_detect_indication.tl.tag = NFAPI_UTRAN_BROADCAST_DETECT_INDICATION_TAG; + ind.utran_broadcast_detect_indication.mib_length = 4; + //ind.utran_broadcast_detect_indication.mib... + ind.utran_broadcast_detect_indication.sfn_offset; + + } + break; + } + + ind.pnf_cell_broadcast_state.tl.tag = NFAPI_PNF_CELL_BROADCAST_STATE_TAG; + ind.pnf_cell_broadcast_state.length = 3; + + nfapi_pnf_broadcast_detect_ind(config, &ind); + return 0; +} +int system_information_schedule_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_system_information_schedule_request_t* req) +{ + nfapi_system_information_schedule_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_system_information_schedule_resp(config, &resp); + + nfapi_system_information_schedule_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION; + ind.header.phy_id = req->header.phy_id; + ind.error_code = NFAPI_P4_MSG_OK; + + ind.lte_system_information_indication.tl.tag = NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG; + ind.lte_system_information_indication.sib_type = 3; + ind.lte_system_information_indication.sib_length = 5; + //ind.lte_system_information_indication.sib... + + nfapi_pnf_system_information_schedule_ind(config, &ind); + return 0; +} +int system_information_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_system_information_request_t* req) +{ + nfapi_system_information_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_SYSTEM_INFORMATION_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_system_information_resp(config, &resp); + + nfapi_system_information_indication_t ind; + memset(&ind, 0, sizeof(ind)); + ind.header.message_id = NFAPI_SYSTEM_INFORMATION_INDICATION; + ind.header.phy_id = req->header.phy_id; + ind.error_code = NFAPI_P4_MSG_OK; + + switch(req->rat_type) + { + case NFAPI_RAT_TYPE_LTE: + { + ind.lte_system_information_indication.tl.tag = NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG; + ind.lte_system_information_indication.sib_type = 1; + ind.lte_system_information_indication.sib_length = 3; + //ind.lte_system_information_indication.sib... + } + break; + case NFAPI_RAT_TYPE_UTRAN: + { + ind.utran_system_information_indication.tl.tag = NFAPI_UTRAN_SYSTEM_INFORMATION_INDICATION_TAG; + ind.utran_system_information_indication.sib_length = 3; + //ind.utran_system_information_indication.sib... + + } + break; + case NFAPI_RAT_TYPE_GERAN: + { + ind.geran_system_information_indication.tl.tag = NFAPI_GERAN_SYSTEM_INFORMATION_INDICATION_TAG; + ind.geran_system_information_indication.si_length = 3; + //ind.geran_system_information_indication.si... + + } + break; + } + + + nfapi_pnf_system_information_ind(config, &ind); + + return 0; +} +int nmm_stop_request(nfapi_pnf_config_t* config, nfapi_pnf_phy_config_t* phy, nfapi_nmm_stop_request_t* req) +{ + nfapi_nmm_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_NMM_STOP_RESPONSE; + resp.header.phy_id = req->header.phy_id; + resp.error_code = NFAPI_P4_MSG_OK; + nfapi_pnf_nmm_stop_resp(config, &resp); + return 0; +} + +int vendor_ext(nfapi_pnf_config_t* config, nfapi_p4_p5_message_header_t* msg) +{ + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF_SIM] P5 %s %p\n", __FUNCTION__, msg); + + switch(msg->message_id) + { + case P5_VENDOR_EXT_REQ: + { + vendor_ext_p5_req* req = (vendor_ext_p5_req*)msg; + NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF_SIM] P5 Vendor Ext Req (%d %d)\n", req->dummy1, req->dummy2); + // send back the P5_VENDOR_EXT_RSP + vendor_ext_p5_rsp rsp; + memset(&rsp, 0, sizeof(rsp)); + rsp.header.message_id = P5_VENDOR_EXT_RSP; + rsp.error_code = NFAPI_MSG_OK; + nfapi_pnf_vendor_extension(config, &rsp.header, sizeof(vendor_ext_p5_rsp)); + } + break; + } + + return 0; +} + +nfapi_p4_p5_message_header_t* pnf_sim_allocate_p4_p5_vendor_ext(uint16_t message_id, uint16_t* msg_size) +{ + if(message_id == P5_VENDOR_EXT_REQ) + { + (*msg_size) = sizeof(vendor_ext_p5_req); + return (nfapi_p4_p5_message_header_t*)malloc(sizeof(vendor_ext_p5_req)); + } + + return 0; +} + +void pnf_sim_deallocate_p4_p5_vendor_ext(nfapi_p4_p5_message_header_t* header) +{ + free(header); +} + + +int pnf_sim_pack_p4_p5_vendor_extension(nfapi_p4_p5_message_header_t* header, uint8_t** ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P5_VENDOR_EXT_RSP) + { + vendor_ext_p5_rsp* rsp = (vendor_ext_p5_rsp*)(header); + return (!push16(rsp->error_code, ppWritePackedMsg, end)); + } + return 0; +} + +int pnf_sim_unpack_p4_p5_vendor_extension(nfapi_p4_p5_message_header_t* header, uint8_t** ppReadPackedMessage, uint8_t *end, nfapi_p4_p5_codec_config_t* codec) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P5_VENDOR_EXT_REQ) + { + vendor_ext_p5_req* req = (vendor_ext_p5_req*)(header); + return (!(pull16(ppReadPackedMessage, &req->dummy1, end) && + pull16(ppReadPackedMessage, &req->dummy2, end))); + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s (%d %d)\n", __FUNCTION__, req->dummy1, req->dummy2); + } + return 0; +} +int main(int argc, char *argv[]) +{ + if (argc < 3) + { + printf("Use parameters: \n"); + return 0; + } + + set_thread_priority(50); + + pnf_info pnf; + if(read_pnf_xml(pnf, argv[3]) < 0) + { + printf("Failed to read xml file>\n"); + return 0; + } + + + nfapi_pnf_config_t* config = nfapi_pnf_config_create(); + + config->vnf_ip_addr = argv[1]; + config->vnf_p5_port = atoi(argv[2]); + + config->pnf_param_req = &pnf_param_request; + config->pnf_config_req = &pnf_config_request; + config->pnf_start_req = &pnf_start_request; + config->pnf_stop_req = &pnf_stop_request; + config->param_req = ¶m_request; + config->config_req = &config_request; + config->start_req = &start_request; + + config->measurement_req = &measurement_request; + config->rssi_req = &rssi_request; + config->cell_search_req = &cell_search_request; + config->broadcast_detect_req = &broadcast_detect_request; + config->system_information_schedule_req = &system_information_schedule_request; + config->system_information_req = &system_information_request; + config->nmm_stop_req = &nmm_stop_request; + + config->vendor_ext = &vendor_ext; + + config->trace = &pnf_sim_trace; + + config->user_data = &pnf; + + // To allow custom vendor extentions to be added to nfapi + config->codec_config.unpack_vendor_extension_tlv = &pnf_sim_unpack_vendor_extension_tlv; + config->codec_config.pack_vendor_extension_tlv = &pnf_sim_pack_vendor_extention_tlv; + + config->allocate_p4_p5_vendor_ext = &pnf_sim_allocate_p4_p5_vendor_ext; + config->deallocate_p4_p5_vendor_ext = &pnf_sim_deallocate_p4_p5_vendor_ext; + + config->codec_config.unpack_p4_p5_vendor_extension = &pnf_sim_unpack_p4_p5_vendor_extension; + config->codec_config.pack_p4_p5_vendor_extension = &pnf_sim_pack_p4_p5_vendor_extension; + + return nfapi_pnf_start(config); + +} diff --git a/nfapi/open-nFAPI/sim_common/Makefile.am b/nfapi/open-nFAPI/sim_common/Makefile.am new file mode 100644 index 0000000000..771b768a16 --- /dev/null +++ b/nfapi/open-nFAPI/sim_common/Makefile.am @@ -0,0 +1,31 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +AUTOMAKE_OPTIONS=subdir-objects + +AM_CFLAGS = -I$(top_srcdir)/sim_common/public_inc -I$(top_srcdir)/common/public_inc -I$(top_srcdir)/nfapi/public_inc -g -Wall -Werror + +AM_CXXFLAGS = -I$(top_srcdir)/sim_common/public_inc -I$(top_srcdir)/common/public_inc -std=c++11 -I$(top_srcdir)/nfapi/public_inc $(BOOST_CPPFLAGS) -g -Wall -Werror +noinst_LIBRARIES =libnfapi_sim_common.a +#libnfapi_sim_common_a_SOURCES = src/xml_property_tree.cpp src/pool.cpp +libnfapi_sim_common_a_SOURCES = src/pool.cpp + +libnfapi_sim_common_a_CFLAGS =$(AM_CFLAGS) +libnfapi_sim_common_a_CXXFLAGS =$(AM_CXXFLAGS) + +lib_LTLIBRARIES =libnfapi_sim_common.la +#libnfapi_sim_common_la_SOURCES = src/xml_property_tree.cpp +libnfapi_sim_common_la_SOURCES = src/pool.cpp diff --git a/nfapi/open-nFAPI/sim_common/inc/pool.h b/nfapi/open-nFAPI/sim_common/inc/pool.h new file mode 100644 index 0000000000..8591d939f9 --- /dev/null +++ b/nfapi/open-nFAPI/sim_common/inc/pool.h @@ -0,0 +1,186 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _POOL_H_ +#define _POOL_H_ + +#include +#include +#include +#include + + +class pool_config +{ + public: + + size_t size; + uint16_t initial_count; +}; + +class memory_pool +{ + std::mutex mutex; + std::map> free_store; + std::map allocated_store; + + void init(std::vector config) + { + printf("memory_pool::init\n"); + + for(pool_config c : config) + { + // todo : use the initial count to allocate initial pool memory + free_store.insert(std::pair> + (c.size, std::queue())); + allocated_store.insert(std::pair(c.size, 0)); + } + } + + memory_pool() + { + std::vector config + { + {8, 0}, {32, 0}, {64, 0}, {128, 0}, {256, 0}, + {1024, 0}, {4096, 0}, {8912, 0} + + }; + + init(config); + } + + + uint16_t determine_pool_size(size_t size) + { + for(auto pool : free_store) + { + if(pool.first >= size) + return pool.first; + } + + return 0; + } + + uint8_t* alloc(size_t size) + { + if(size == 0) + return 0; + + uint8_t* ptr = 0; + size_t psize = determine_pool_size(size + 4); + + if(psize == 0) + { + ptr = (uint8_t*)malloc(size + 4); + memset(ptr, 0, size + 4); + } + else + { + mutex.lock(); + + auto it = free_store.find(psize); + + if(it == free_store.end()) + { + // Unknown pool size + ptr = (uint8_t*)malloc(psize + 4); + memcpy(ptr, &psize, 4); + } + else + { + if(it->second.size() > 0) + { + // Take from the pool + ptr = (uint8_t*)(it->second.front()); + it->second.pop(); + } + else + { + // No memory left in pool + ptr = (uint8_t*)malloc(psize + 4); + memcpy(ptr, &psize, 4); + } + } + + mutex.unlock(); + } + + return (ptr + 4); + } + + void dealloc(uint8_t* ptr) + { + if(ptr == 0) + return; + + uint8_t* _ptr = (uint8_t*)ptr; + + size_t psize; + memcpy(&psize, _ptr - 4, 4); + + if(psize == 0) + { + free(_ptr - 4); + } + else + { + mutex.lock(); + + auto it = free_store.find(psize); + if(it == free_store.end()) + { + free(_ptr - 4); + } + else + { + assert((_ptr - 4) != 0); + it->second.push(_ptr - 4); + } + + mutex.unlock(); + } + + } + + public: + + memory_pool(memory_pool const&) = delete; + void operator=(memory_pool const&) = delete; + + /*! Get the memory_pool instance */ + static memory_pool& instance() + { + static memory_pool instance; + return instance; + } + + /*! Allocate a buffer from the memory_pool is at least size */ + static uint8_t* allocate(size_t size) + { + return instance().alloc(size); + } + + /*! Return the buffer to the memory_pool */ + static void deallocate(uint8_t* ptr) + { + return instance().dealloc(ptr); + } + + +}; + +#endif // _POOL_H_ diff --git a/nfapi/open-nFAPI/sim_common/inc/vendor_ext.h b/nfapi/open-nFAPI/sim_common/inc/vendor_ext.h new file mode 100644 index 0000000000..d0fd57837d --- /dev/null +++ b/nfapi/open-nFAPI/sim_common/inc/vendor_ext.h @@ -0,0 +1,71 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _VENDOR_EXT_H_ +#define _VENDOR_EXT_H_ + +#include "nfapi_interface.h" + +typedef enum +{ + P5_VENDOR_EXT_REQ = NFAPI_VENDOR_EXT_MSG_MIN, + P5_VENDOR_EXT_RSP, + + P7_VENDOR_EXT_REQ, + P7_VENDOR_EXT_IND + +} vendor_ext_message_id_e; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint16_t dummy1; + uint16_t dummy2; +} vendor_ext_p5_req; + +typedef struct { + nfapi_p4_p5_message_header_t header; + uint16_t error_code; +} vendor_ext_p5_rsp; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t dummy1; + uint16_t dummy2; +} vendor_ext_p7_req; + +typedef struct { + nfapi_p7_message_header_t header; + uint16_t error_code; +} vendor_ext_p7_ind; + +typedef struct { + nfapi_tl_t tl; + uint32_t dummy; +} vendor_ext_tlv_1; + +#define VENDOR_EXT_TLV_1_TAG 0xF001 + +typedef struct { + nfapi_tl_t tl; + uint32_t dummy; +} vendor_ext_tlv_2; + +#define VENDOR_EXT_TLV_2_TAG 0xF002 + + + + +#endif // _VENDOR_EXT_ diff --git a/nfapi/open-nFAPI/sim_common/src/pool.cpp b/nfapi/open-nFAPI/sim_common/src/pool.cpp new file mode 100644 index 0000000000..47d9cfa992 --- /dev/null +++ b/nfapi/open-nFAPI/sim_common/src/pool.cpp @@ -0,0 +1,15 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/nfapi/open-nFAPI/vnf/Makefile.am b/nfapi/open-nFAPI/vnf/Makefile.am new file mode 100644 index 0000000000..ae8d2bb3d6 --- /dev/null +++ b/nfapi/open-nFAPI/vnf/Makefile.am @@ -0,0 +1,43 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +AUTOMAKE_OPTIONS=subdir-objects + +AM_CPPFLAGS = -I$(top_srcdir)/vnf/inc\ + -I$(top_srcdir)/vnf/public_inc\ + -I$(top_srcdir)/nfapi/public_inc\ + -I$(top_srcdir)/common/public_inc\ + -Wall -Werror -g + + +noinst_LIBRARIES = libnfapi_vnf.a + +libnfapi_vnf_a_SOURCES = src/vnf.c\ + src/vnf_p7.c\ + src/vnf_interface.c\ + src/vnf_p7_interface.c + +LDADD = -lsctp ../common/bin/libnfapi_common.a + +libnfapi_vnf_a_CFLAGS =$(AM_CFLAGS) + +lib_LTLIBRARIES = libnfapi_vnf.la + +libnfapi_vnf_la_SOURCES = src/vnf.c\ + src/vnf_p7.c\ + src/vnf_interface.c\ + src/vnf_p7_interface.c diff --git a/nfapi/open-nFAPI/vnf/inc/vnf.h b/nfapi/open-nFAPI/vnf/inc/vnf.h new file mode 100644 index 0000000000..4fd8d2b91d --- /dev/null +++ b/nfapi/open-nFAPI/vnf/inc/vnf.h @@ -0,0 +1,46 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VNF_H_ +#define _VNF_H_ + +#include "nfapi_vnf_interface.h" + +typedef struct +{ + + nfapi_vnf_config_t _public; + + uint8_t terminate; + uint8_t sctp; + + uint8_t tx_message_buffer[NFAPI_MAX_PACKED_MESSAGE_SIZE]; + uint16_t next_phy_id; + +} vnf_t; + + +int vnf_pack_and_send_p5_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len); +int vnf_pack_and_send_p4_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len); + +int vnf_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* pnf); + +void nfapi_vnf_phy_info_list_add(nfapi_vnf_config_t* config, nfapi_vnf_phy_info_t* info); +nfapi_vnf_phy_info_t* nfapi_vnf_phy_info_list_find(nfapi_vnf_config_t* config, uint16_t phy_id); +void nfapi_vnf_pnf_list_add(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* node); +nfapi_vnf_pnf_info_t* nfapi_vnf_pnf_list_find(nfapi_vnf_config_t* config, int p5_idx); +#endif // _VNF_H_ diff --git a/nfapi/open-nFAPI/vnf/inc/vnf_p7.h b/nfapi/open-nFAPI/vnf/inc/vnf_p7.h new file mode 100644 index 0000000000..fc2ab4e6b5 --- /dev/null +++ b/nfapi/open-nFAPI/vnf/inc/vnf_p7.h @@ -0,0 +1,136 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _VNF_P7_H_ +#define _VNF_P7_H_ + +#include "nfapi_vnf_interface.h" + +#define TIMEHR_SEC(_time_hr) ((uint32_t)(_time_hr) >> 20) +#define TIMEHR_USEC(_time_hr) ((uint32_t)(_time_hr) & 0xFFFFF) +#define TIME2TIMEHR(_time) (((uint32_t)(_time.tv_sec) & 0xFFF) << 20 | ((uint32_t)(_time.tv_usec) & 0xFFFFF)) + + + +typedef struct { + uint8_t* buffer; + uint16_t length; +} vnf_p7_rx_message_segment_t; + +typedef struct vnf_p7_rx_message vnf_p7_rx_message_t; + +typedef struct vnf_p7_rx_message { + uint8_t sequence_number; + uint8_t num_segments_received; + uint8_t num_segments_expected; + + // the spec allows of upto 128 segments, this does seem excessive + vnf_p7_rx_message_segment_t segments[128]; + + uint32_t rx_hr_time; + + vnf_p7_rx_message_t* next; +} vnf_p7_rx_message_t; + +typedef struct { + + vnf_p7_rx_message_t* msg_queue; + +} vnf_p7_rx_reassembly_queue_t; + +typedef struct nfapi_vnf_p7_connection_info { + + /*! The PHY id */ + int phy_id; + + + // this does not belong here... + uint8_t stream_id; + + /*! Flag indicating the sync state of the P7 conenction */ + uint8_t in_sync; + + int dl_out_sync_offset; + int dl_out_sync_period; // ms (as a pow2) + + int dl_in_sync_offset; + int dl_in_sync_period; // ms (as a pow2) + + uint8_t filtered_adjust; + uint16_t min_sync_cycle_count; + uint32_t latency[8]; + uint32_t average_latency; + int32_t sf_offset_filtered; + int32_t sf_offset_trend; + int32_t sf_offset; + uint16_t zero_count; + int32_t adjustment; + int32_t insync_minor_adjustment; + int32_t insync_minor_adjustment_duration; + + uint32_t previous_t1; + uint32_t previous_t2; + int32_t previous_sf_offset_filtered; + + int sfn_sf; + + int socket; + struct sockaddr_in local_addr; + struct sockaddr_in remote_addr; + + vnf_p7_rx_reassembly_queue_t reassembly_queue; + uint8_t* reassembly_buffer; + uint32_t reassembly_buffer_size; + + uint32_t sequence_number; + + struct nfapi_vnf_p7_connection_info* next; + +} nfapi_vnf_p7_connection_info_t; + +typedef struct { + + nfapi_vnf_p7_config_t _public; + + // private data + uint8_t terminate; + nfapi_vnf_p7_connection_info_t* p7_connections; + int socket; + uint32_t sf_start_time_hr; + uint8_t* rx_message_buffer; // would this be better put in the p7 conenction info? + uint16_t rx_message_buffer_size; + +} vnf_p7_t; + +uint32_t vnf_get_current_time_hr(void); + +uint16_t increment_sfn_sf(uint16_t sfn_sf); +int vnf_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info); +int send_mac_subframe_indications(vnf_p7_t* config); +int vnf_p7_read_dispatch_message(vnf_p7_t* vnf_p7 ); + +void vnf_p7_connection_info_list_add(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* node); +nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_find(vnf_p7_t* vnf_p7, uint16_t phy_id); +nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_delete(vnf_p7_t* vnf_p7, uint16_t phy_id); + +int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* header); + +void vnf_p7_release_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* header); +void vnf_p7_release_pdu(vnf_p7_t* vnf_p7, void* pdu); + + +#endif // _VNF_P7_H_ diff --git a/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h b/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h new file mode 100644 index 0000000000..462901391a --- /dev/null +++ b/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h @@ -0,0 +1,995 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _NFAPI_VNF_INTERFACE_H_ +#define _NFAPI_VNF_INTERFACE_H_ + +#include "nfapi_interface.h" +#include "debug.h" + +#include "netinet/in.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +#define NFAPI_MAX_PACKED_MESSAGE_SIZE 8192 + +/*! The nfapi VNF phy configuration information + */ +typedef struct nfapi_vnf_phy_info +{ + /*! The P5 Index */ + int p5_idx; //which p5 connection + /*! The PHY ID */ + int phy_id; //phy_id + + /*! Timing window */ + uint8_t timing_window; + /*! Timing info mode */ + uint8_t timing_info_mode; + /*! Timing info period */ + uint8_t timing_info_period; + + /*! P7 UDP socket information for the pnf */ + struct sockaddr_in p7_pnf_address; + /*! P7 UDP socket information for the vnf */ + struct sockaddr_in p7_vnf_address; + + struct nfapi_vnf_phy_info* next; +} nfapi_vnf_phy_info_t; + +/*! The nfapi VNF pnf configuration information + */ +typedef struct nfapi_vnf_pnf_info +{ + /*! The P5 Index */ + int p5_idx; + /*! The P5 socket */ + int p5_sock; + /*! Flag indicating if the pnf is connected */ + uint8_t connected; + + /*! P5 SCTP socket information for the pnf */ + struct sockaddr_in p5_pnf_sockaddr; + + /*! Flag indicating if this pnf should be deleted */ + uint8_t to_delete; + + struct nfapi_vnf_pnf_info* next; + +} nfapi_vnf_pnf_info_t; + +typedef struct nfapi_vnf_config nfapi_vnf_config_t; + +/*! The nfapi VNF configuration information + */ +typedef struct nfapi_vnf_config +{ + /*! A user define callback to override the default memory allocation */ + void* (*malloc)(size_t size); + /*! A user define callback to override the default memory deallocation */ + void (*free)(void*); + /*! A user define callback to handle trace from the pnf */ + void (*trace)(nfapi_trace_level_t level, const char* message, ...); + + /*! The port the VNF P5 SCTP connection listens on + * + * By default this will be set to 7701. However this can be changed if + * required. + */ + int vnf_p5_port; + + // todo : for enabling ipv4/ipv6 + int vnf_ipv4; + int vnf_ipv6; + + /*! List of connected pnfs */ + nfapi_vnf_pnf_info_t* pnf_list; + + /*! List of configured phys */ + nfapi_vnf_phy_info_t* phy_list; + + /*! Configuration options for the p4 p5 pack unpack functions */ + nfapi_p4_p5_codec_config_t codec_config; + + /*! Optional user defined data that will be avaliable in the callbacks*/ + void* user_data; + + /*! \brief Callback indicating that a pnf has established connection + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 used to indicate this pnf p5 connection + * + * The client is expected to send the PNF_PARAM.request in response to + * the connection indication + * + * \todo Do we need to send the address information of the PNF? + */ + int (*pnf_connection_indication)(nfapi_vnf_config_t* config, int p5_idx); + + /*! \brief Callback indicating that a pnf has lost connection + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 used to indicate this pnf p5 connection + * + * The p5_idx may be used for future new p5 connections + * + * The client is responsiable for communicating to the p7 instance(s) that + * may be associated with this p5 that they should be deleted using the + * nfapi_vnf_p7_del_pnf functon + * + */ + int (*pnf_disconnect_indication)(nfapi_vnf_config_t* config, int p5_idx); + + // p5 interface functions + + /*! \brief A callback to handle the PNF_PARAM.resp + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded PNF_PARAM.response. This will + * have been allocated on the stack. + * \return not currently used. + * + * The PNF_PARAM.resp contains the capability of the PNF identified by the + * p5_idx. + * + * The client is expected to send the PNF_CONFIG.request after receiving the + * PNF_PARAM.resp. This can be done in the call back. + * + * It is expected that the client when building the PNF_CONFIG.request will + * used the nfapi_vnf_allocate_phy() to allocate unique phy id for each FAPI + * instance the client wishes to create. + * + * The resp may contain pointers to dyanmically allocated sub structures + * such as the vendor_extention. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*pnf_param_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_param_response_t* resp); + + /*! A callback for the PNF_CONFIG.resp + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded PNF_CONFIG.response. This will + * have been allocated on the stack. + * \return not currently used. + * + * The PNF_CONFIG.resp contains the result of the PNF_CONFIG.request for the + * PNF identified by the p5_idx. + * + * The client is expected to send the PNF_START.request after receiving the + * PNF_PARAM.resp. This can be done in the call back. + * + * The resp may contain pointers to dyanmically allocated sub structures + * such as the vendor_extention. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*pnf_config_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_config_response_t* resp); + + /*! A callback for the PNF_START.resp + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded PNF_START.response. This will + * have been allocated on the stack. + * \return not currently used. + * + * The PNF_START.resp contains the result of the PNF_START.request for the + * PNF identified by the p5_idx. + * + * The client is expected to send the PARAM.request for each FAPI instance + * that has been created in the PNF. + * + * The resp may contain pointers to dyanmically allocated sub structures + * such as the vendor_extention. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*pnf_start_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_start_response_t* resp); + + /*! A callback for the PNF_STOP.resp + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded PNF_STOP.response. This will + * have been allocated on the stack. + * \return not currently used. + * + * The PNF_STOP.response contains the result of the PNF_STOP.request for the + * PNF identified by the p5_idx. + * + * The resp may contain pointers to dyanmically allocated sub structures + * such as the vendor_extention. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*pnf_stop_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_stop_response_t* resp); + + /*! A callback for the PARAM.resp + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded PARAM.resposne. This will + * have been allocated on the stack. + * \return not currently used. + * + * The PARAM.request contains the capabilities of the FAPI instance identified + * by the phy_id + * + * The client is expected to send the CONFIG.request after receiving the + * PARAM.response. This can be done in the call back. The PARAM.response + * contains the PNF P7 address (ipv4 or ipv6) and port. This information + * is used when calling the nfapi_vnf_p7_add_pnf() + * + * The client is responsible for identifing the VNF P7 ip address + * (ipv4 or ipv6) and port for the VNF P7 entity which will be sent to the + * PNF P7 entity. That endpoint should be valid before send the + * CONFIG.request. + * + * The resp may contain pointers to dyanmically allocated sub structures + * such as the vendor_extention. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*param_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_response_t* resp); + + /*! A callback for the CONFIG.response + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded CONFIG.response This will + * have been allocated on the stack. + * \return not currently used. + * + * The CONFIG.response contains the result of the CONFIG.request + * + * + * The resp may contain pointers to dyanmically allocated sub structures + * such as the vendor_extention. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*config_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_response_t* resp); + + /*! A callback for the START.resp + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded START.response This will + * have been allocated on the stack. + * \return not currently used. + * + * The START.response contains the result of the START.request + * + * + * The resp may contain pointers to dyanmically allocated sub structures + * such as the vendor_extention. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*start_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_response_t* resp); + + /*! A callback for the STOP.resp + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded STOP.response This will + * have been allocated on the stack. + * \return not currently used. + * + * The STOP.response contains the result of the STOP.request + * + * + * The resp may contain pointers to dyanmically allocated sub structures + * such as the vendor_extention. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*stop_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_stop_response_t* resp); + + /*! A callback for the MEASUREMENT.resp + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded MEASUREMENT.response This will + * have been allocated on the stack. + * \return not currently used. + * + * The MEASUREMENT.response contains the result of the MEASUREMENT.request + * + * The resp may contain pointers to dyanmically allocated sub structures + * such as the vendor_extention. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*measurement_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_measurement_response_t* resp); + + // p4 interface functions + /*! A callback for the RSSI.resp + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded RSSI.response This will + * have been allocated on the stack. + * \return not currently used. + */ + int (*rssi_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_rssi_response_t* resp); + + /*! A callback for the RSSI.indication + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded RSSI.indication This will + * have been allocated on the stack. + * \return not currently used. + */ + int (*rssi_ind)(nfapi_vnf_config_t* config, int p5_idx, nfapi_rssi_indication_t* ind); + + /*! A callback for the CELL_SEARCH.response + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded CELL_SEARCH.response This will + * have been allocated on the stack. + * \return not currently used. + */ + int (*cell_search_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_cell_search_response_t* resp); + + /*! A callback for the CELL_SEARCH.indication + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded CELL_SEARCH.indication This will + * have been allocated on the stack. + * \return not currently used. + */ + int (*cell_search_ind)(nfapi_vnf_config_t* config, int p5_idx, nfapi_cell_search_indication_t* ind); + + /*! A callback for the BROADCAST_DETECT.response + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded BROADCAST_DETECT.response This will + * have been allocated on the stack. + * \return not currently used. */ + int (*broadcast_detect_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_broadcast_detect_response_t* resp); + + /*! A callback for the BROADCAST_DETECT.indication + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded BROADCAST_DETECT.indication This will + * have been allocated on the stack. + * \return not currently used. + */ + int (*broadcast_detect_ind)(nfapi_vnf_config_t* config, int p5_idx, nfapi_broadcast_detect_indication_t* ind); + + /*! A callback for the SYSTEM_INFORMATION_SCHEUDLE.response + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded SYSTEM_INFORMATION_SCHEUDLE.response This will + * have been allocated on the stack. + * \return not currently used. + */ + int (*system_information_schedule_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_system_information_schedule_response_t* resp); + + /*! A callback for the SYSTEM_INFORMATION_SCHEUDLE.indication + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded SYSTEM_INFORMATION_SCHEUDLE.indication This will + * have been allocated on the stack. + * \return not currently used. + */ + int (*system_information_schedule_ind)(nfapi_vnf_config_t* config, int p5_idx, nfapi_system_information_schedule_indication_t* ind); + + /*! A callback for the SYSTEM_INFORMATION.response + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded SYSTEM_INFORMATION.response This will + * have been allocated on the stack. + * \return not currently used. + */ + int (*system_information_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_system_information_response_t* resp); + + /*! A callback for the SYSTEM_INFORMATION.indication + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded SYSTEM_INFORMATION.indication This will + * have been allocated on the stack. + * \return not currently used. + */ + int (*system_information_ind)(nfapi_vnf_config_t* config, int p5_idx, nfapi_system_information_indication_t* ind); + + /*! A callback for the NMM_STOP.response + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded NMM_STOP.response This will + * have been allocated on the stack. + * \return not currently used. + */ + int (*nmm_stop_resp)(nfapi_vnf_config_t* config, int p5_idx, nfapi_nmm_stop_response_t* resp); + + + /*! A callback for any vendor extension message received + * \param config A pointer to the vnf configuration + * \param p5_idx The p5 index used to indicate a particular pnf p5 connection + * \param resp A data structure for the decoded vendor extention message + * \return not currently used. + */ + int (*vendor_ext)(nfapi_vnf_config_t* config, int p5_idx, nfapi_p4_p5_message_header_t* msg); + + /*! A callback to allocate vendor extension messages + * \param message_id The message is taken from the message header + * \param msg_size The is the vendor extention message that has been allocated. + * The callee must set this value + * \return A pointer to an allocated vendor extention message + */ + nfapi_p4_p5_message_header_t* (*allocate_p4_p5_vendor_ext)(uint16_t message_id, uint16_t* msg_size); + + /*! A callback to deallocate vendor extension messages + * \param header A pointer to an allocated vendor extention message + */ + void (*deallocate_p4_p5_vendor_ext)(nfapi_p4_p5_message_header_t* header); + + + + + + +} nfapi_vnf_config_t; + +/*! Creates and initialise the vnf config structure before use + * \return A pointer to a vnf config structure + */ +nfapi_vnf_config_t* nfapi_vnf_config_create(void); + +/*! Delete an vnf config + */ +void nfapi_vnf_config_destory(nfapi_vnf_config_t* config); + + +/*! Start the VNF library. + * \param config A pointer to a vnf config + * \return 0 means success, -1 failure + * + * The config should be initailize with port the vnf should listen on and + * the callback set to functions that will be called when a nFAPI message is + * recevied before calling nfapi_vnf_start. + * + * This function will not return untill nfapi_vnf_stop is called + */ +int nfapi_vnf_start(nfapi_vnf_config_t* config); + +/*! Stop the VNF library. + * \param config A pointer to a vnf config + * \return 0 means success, -1 failure + * + * This function will cause the nfapi_vnf_start function to return + */ +int nfapi_vnf_stop(nfapi_vnf_config_t* config); + +/*! Allocates a PHY ID for the PNF PHY instance managed by this VNF + * \param config A pointer to a vnf config + * \param p5_idx The P5 index return by the callbacks + * \param phy_id A pointer to a phy_id that will be set by this function + * \return 0 means success, -1 failure + * + * Called before nfapi_vnf_config_req to allocate a vnf phy instance. This + * function will return unqiue phy_id to be used for this identify the phy + * + */ +int nfapi_vnf_allocate_phy(nfapi_vnf_config_t* config, int p5_idx, uint16_t* phy_id); + +// P5 Request functions +// +/*! Send the PNF_PARAM.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a PNF_PARAM.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_pnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_param_request_t* req); + +/*! Send the PNF_CONFIG.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a PNF_CONFIG.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_pnf_config_req(nfapi_vnf_config_t* config,int p5_idx, nfapi_pnf_config_request_t* req); + +/*! Send the PNF_START.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a PNF_START.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_pnf_start_req(nfapi_vnf_config_t* config,int p5_idx, nfapi_pnf_start_request_t* req); + +/*! Send the PNF_STOP.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a PNF_STOP.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_pnf_stop_req(nfapi_vnf_config_t* config,int p5_idx, nfapi_pnf_stop_request_t* req); + +/*! Send the PARAM.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a PARAM.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_request_t* req); + +/*! Send the CONFIG.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a CONFIG.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_request_t* req); + +/*! Send the START.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a START.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_request_t* req); + +/*! Send the STOP.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a STOP.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_stop_request_t* req); + +/*! Send the MEASUREMENT.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a MEASUREMENT.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_measurement_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_measurement_request_t* req); + +// P4 Request functions +/*! Send the RSSI.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a RSSI.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_rssi_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_rssi_request_t* req); + +/*! Send the CELL_SEARCH.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a CELL_SEARCH.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_cell_search_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_cell_search_request_t* req); + +/*! Send the BROADCAST_DETECT.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a BROADCAST_DETECT.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_broadcast_detect_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_broadcast_detect_request_t* req); + +/*! Send the SYSTEM_INFORMATION_SCHEDULE.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a SYSTEM_INFORMATION_SCHEDULE.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_system_information_schedule_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_system_information_schedule_request_t* req); + +/*! Send the SYSTEM_INFORMATION.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a SYSTEM_INFORMATION.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_system_information_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_system_information_request_t* req); + +/*! Send the NMM_STOP.request + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param req A pointer to a NMM_STOP.request message structure + * \return 0 means success, -1 failure + */ +int nfapi_vnf_nmm_stop_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_nmm_stop_request_t* req); + +/*! Send a vendor extension message + * \param config A pointer to a vnf config + * \param p5_idx The P5 index + * \param msg A poiner to a vendor extention message + * \return 0 means success, -1 failure + */ +int nfapi_vnf_vendor_extension(nfapi_vnf_config_t* config, int p5_idx, nfapi_p4_p5_message_header_t* msg); + +//----------------------------------------------------------------------------- + +/*! The nfapi VNF P7 connection information + */ +typedef struct nfapi_vnf_p7_config nfapi_vnf_p7_config_t; + +/*! The nfapi VNF P7 configuration information + */ +typedef struct nfapi_vnf_p7_config +{ + /*! A user define callback to override the default memory allocation + * \param size Size of the memory block to allocate + * \return a pointer to a memory block + * + * If not set the vnf p7 library will use malloc + */ + void* (*malloc)(size_t size); + + /*! A user define callback to override the default memory deallocation + * \param ptr Pointer to a memory block to deallocate + * + * If not set the vnf p7 library will use free + */ + void (*free)(void*); + + /*! A user define callback to handle trace from the pnf + * \param level The trace level + * \param message The trace string + */ + void (*trace)(nfapi_trace_level_t level, const char* message, ...); + + /*! The port the vnf p7 will receive on */ + int port; + + /*! Flag to indicate of the pnf should use the P7 checksum */ + uint8_t checksum_enabled; + + /*! The maxium size of a P7 segement. If a message is large that this it + * will be segemented */ + uint16_t segment_size; + uint16_t max_num_segments; + + /*! Configuration option for the p7 pack unpack functions*/ + nfapi_p7_codec_config_t codec_config; + + /* ! Call back to indicate the sync state with the PNF PHY + * \param config A pointer to the vnf p7 configuration + * \param sync Indicating if the pnf is in sync or not + * \return not currently used + * + * sync = 0 : in sync + * sync != 0 : out of sync + */ + int (*sync_indication)(struct nfapi_vnf_p7_config* config, uint8_t sync); + + /*! A callback for the subframe indication + * \param config A pointer to the vnf p7 configuration + * \param phy_id The ID for the PNF PHY instance + * \param sfn_sf The SFN SF number formated as per the FAPI specification + * \return not currently used + * + * This callback is an indication for the VNF to generate the downlink subframe messages + * for sfn/sf. This indicatoin is called every millisecond + * + * The VNF P7 Lib will adjust the subframe timing to 'catch-up' or 'slow-down' with the PNF PHY's + * + * \todo Need some way the tell the VNF how long it has + */ + + int (*subframe_indication)(struct nfapi_vnf_p7_config* config, uint16_t phy_id, uint16_t sfn_sf); + + /*! A callback for the HARQ.indication + * \param config A pointer to the vnf p7 configuration + * \param ind A data structure for the decoded HARQ.indication This will + * have been allocated on the stack. + * \return not currently used. + * + * The ind may contain pointers to dyanmically allocated sub structures + * such as the pdu. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*harq_indication)(struct nfapi_vnf_p7_config* config, nfapi_harq_indication_t* ind); + + /*! A callback for the CRC.ind + * \param config A pointer to the vnf p7 configuration + * \param ind A data structure for the decoded CRC.indication This will + * have been allocated on the stack. + * \return not currently used. + * + * The ind may contain pointers to dyanmically allocated sub structures + * such as the pdu. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*crc_indication)(struct nfapi_vnf_p7_config* config, nfapi_crc_indication_t* ind); + + /*! A callback for the RX_ULSCH.indication + * \param config A pointer to the vnf p7 configuration + * \param ind A data structure for the decoded RX_ULSCH.indication This will + * have been allocated on the stack. + * \return not currently used. + * + * The ind may contain pointers to dyanmically allocated sub structures + * such as the pdu. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + * + * Note that the rx_indication may hold one or many uplink pdus in the + * ind.rx_indication_body.rx_pdu_list + */ + int (*rx_indication)(struct nfapi_vnf_p7_config* config, nfapi_rx_indication_t* ind); + + /*! A callback for the RACH.indication + * \param config A pointer to the vnf p7 configuration + * \param ind A data structure for the decoded RACH.indication This will + * have been allocated on the stack. + * \return not currently used. + * + * The ind may contain pointers to dyanmically allocated sub structures + * such as the pdu. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*rach_indication)(struct nfapi_vnf_p7_config* config, nfapi_rach_indication_t* ind); + + /*! A callback for the SRS.indication + * \param config A pointer to the vnf p7 configuration + * \param ind A data structure for the decoded SRS.indication This will + * have been allocated on the stack. + * \return not currently used. + * + * The ind may contain pointers to dyanmically allocated sub structures + * such as the pdu. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*srs_indication)(struct nfapi_vnf_p7_config* config, nfapi_srs_indication_t* ind); + + /*! A callback for the RX_SR.indication + * \param config A pointer to the vnf p7 configuration + * \param ind A data structure for the decoded RX_SR.indication This will + * have been allocated on the stack. + * \return not currently used. + * + * The ind may contain pointers to dyanmically allocated sub structures + * such as the pdu. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*sr_indication)(struct nfapi_vnf_p7_config* config, nfapi_sr_indication_t* ind); + + /*! A callback for the RX_CQI.indication + * \param config A pointer to the vnf p7 configuration + * \param ind A data structure for the decoded RX_CQI.indication This will + * have been allocated on the stack. + * \return not currently used. + * + * The ind may contain pointers to dyanmically allocated sub structures + * such as the pdu. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*cqi_indication)(struct nfapi_vnf_p7_config* config, nfapi_cqi_indication_t* ind); + + /*! A callback for the LBT_DL.indication + * \param config A pointer to the vnf p7 configuration + * \param ind A data structure for the decoded LBT_DL.indication This will + * have been allocated on the stack. + * \return not currently used. + * + * The ind may contain pointers to dyanmically allocated sub structures + * such as the pdu. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*lbt_dl_indication)(struct nfapi_vnf_p7_config* config, nfapi_lbt_dl_indication_t* ind); + + /*! A callback for the NB_HARQ.indication + * \param config A pointer to the vnf p7 configuration + * \param ind A data structure for the decoded LBT_DL.indication This will + * have been allocated on the stack. + * \return not currently used. + * + * The ind may contain pointers to dyanmically allocated sub structures + * such as the pdu. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*nb_harq_indication)(struct nfapi_vnf_p7_config* config, nfapi_nb_harq_indication_t* ind); + + /*! A callback for the NRACH.indication + * \param config A pointer to the vnf p7 configuration + * \param ind A data structure for the decoded LBT_DL.indication This will + * have been allocated on the stack. + * \return not currently used. + * + * The ind may contain pointers to dyanmically allocated sub structures + * such as the pdu. The dyanmically allocated structure will + * be deallocated on return. If the client wishes to 'keep' the structures + * then the substructure pointers should be set to 0 and then the client should + * use the codec_config.deallocate function to release it at a future point + */ + int (*nrach_indication)(struct nfapi_vnf_p7_config* config, nfapi_nrach_indication_t* ind); + + /*! A callback for any vendor extension messages + * \param config A pointer to the vnf p7 configuration + * \param msg A data structure for the decoded vendor extention message allocated + * using the allocate_p7_vendor_ext callback + * \return not currently used. + */ + int (*vendor_ext)(struct nfapi_vnf_p7_config* config, nfapi_p7_message_header_t* msg); + + /*! Optional userdata that will be passed back in the callbacks*/ + void* user_data; + + /*! A callback to allocate a memory for a vendor extension message + * \param message_id The message is taken from the p7 message header + * \param msg_size The is the vendor extention message that has been allocated. + * The callee must set this value + * \return A pointer to an allocated vendor extention message + */ + nfapi_p7_message_header_t* (*allocate_p7_vendor_ext)(uint16_t message_id, uint16_t* msg_size); + + /*! A callback to deallocate a vendor extension message + * \param header A pointer to an allocated vendor extention message + */ + void (*deallocate_p7_vendor_ext)(nfapi_p7_message_header_t* header); + + +} nfapi_vnf_p7_config_t; + +/*! Creates and initializes the nfapi_vnf_p7_config structure before use + * \return A pointer to an allocated vnf p7 configuration + */ +nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create(void); + +/*! Cleanup and delete nfapi_vnf_p7_config structure + * \param config A pointer to an vnf p7 configuration structure + * + * The pointer to the config will not long be valid after this call + */ + +void nfapi_vnf_p7_config_destory(nfapi_vnf_p7_config_t* config); + +/*! Start the VNF P7 library. + * \param config A pointer to an vnf p7 configuration structure + * \return A status value. 0 equal success, -1 indicates failure + * + * This function is blocking and will not return until the nfapi_vnf_p7_stop + * function is called. + */ + +int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config); + +/*! Stop the VNF P7 library. + * \param config A pointer to an vnf p7 configuration structure + * \return A status value. 0 equal success, -1 indicates failure + * + * This function will cause the nfapi_vnf_p7_start function to return + */ +int nfapi_vnf_p7_stop(nfapi_vnf_p7_config_t* config); + +/*! Release a P7 message back to the vnf_p7 library. This should be used if the + * callback return 0 in the case where MAC wants to keep the message for + * futher processing. + * This function will release any pdu's is they are non-null. If the uplink + * PDU need to be kept then they pdu pointer should be set to 0 in the message + * and then the nfapi_vnf_p7_release_pdu message can be used to release the + * pdu later. + */ +int nfapi_vnf_p7_release_msg(nfapi_vnf_p7_config_t* config, nfapi_p7_message_header_t*); + +/*! Release a P7 pdu's back to the vnf_p7 library. + */ +int nfapi_vnf_p7_release_pdu(nfapi_vnf_p7_config_t* config, void*); + +/*! Add a vnf p7 instance to the vnf p7 module + * \param config A pointer to the vnf p7 configuration + * \param pnf_p7_addr The udp address the pnf p7 entity has chosen + * \param pnf_p7_port The udp port the pnf p7 entity has chosen + * \param phy_id The unique phy id for the pnf p7 entity + * \return A status value. 0 equal success, -1 indicates failure + * + * This function should be used to each pnf p7 entity that is to be added to this + * vnf p7 entity. Once added the vnf p7 entity will start establish sync with the + * pnf p7 entity and that has been sucessfull will generate subframe indications for it + */ +int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id); + +/*! Delete a vnf p7 instance to the vnf p7 module + * \param config A pointer to the vnf p7 configuration + * \param phy_id The unique phy id for the pnf p7 entity + * \return A status value. 0 equal success, -1 indicates failure + * + * This function should be used to remove a pnf p7 entity from the vnf p7 entity + */ +int nfapi_vnf_p7_del_pnf(nfapi_vnf_p7_config_t* config, int phy_id); + +/*! Send the DL_CONFIG.request + * \param config A pointer to the vnf p7 configuration + * \param req A data structure for the decoded DL_CONFIG.request. + * \return A status value. 0 equal success, -1 indicates failure + * + * The caller is responsiable for memory management of any pointers set in the req, which + * may be released after this function call has returned or at a later pointer + */ +int nfapi_vnf_p7_dl_config_req(nfapi_vnf_p7_config_t* config, nfapi_dl_config_request_t* req); + +/*! Send the UL_CONFIG.request + * \param config A pointer to the vnf p7 configuration + * \param req A data structure for the decoded UL_CONFIG.request. + * \return A status value. 0 equal success, -1 indicates failure + * + * The caller is responsiable for memory management of any pointers set in the req, which + * may be released after this function call has returned or at a later pointer + */ +int nfapi_vnf_p7_ul_config_req(nfapi_vnf_p7_config_t* config, nfapi_ul_config_request_t* req); + +/*! Send the HI_DCI0.request + * \param config A pointer to the vnf p7 configuration + * \param req A data structure for the decoded HI_DCI0.request. + * \return A status value. 0 equal success, -1 indicates failure + * + * The caller is responsiable for memory management of any pointers set in the req, which + * may be released after this function call has returned or at a later pointer + */ +int nfapi_vnf_p7_hi_dci0_req(nfapi_vnf_p7_config_t* config, nfapi_hi_dci0_request_t* req); + +/*! Send the TX.req + * \param config A pointer to the vnf p7 configuration + * \param req A data structure for the decoded HI_DCI0.request. + * \return A status value. 0 equal success, -1 indicates failure + * + * The caller is responsiable for memory management of any pointers set in the req, which + * may be released after this function call has returned or at a later pointer + */ +int nfapi_vnf_p7_tx_req(nfapi_vnf_p7_config_t* config, nfapi_tx_request_t* req); + +/*! Send the LBT_DL_CONFIG.requst + * \param config A pointer to the vnf p7 configuration + * \param req A data structure for the decoded LBT_DL_CONFIG.request. + * \return A status value. 0 equal success, -1 indicates failure + * + * The caller is responsiable for memory management of any pointers set in the req, which + * may be released after this function call has returned or at a later pointer + */ +int nfapi_vnf_p7_lbt_dl_config_req(nfapi_vnf_p7_config_t* config, nfapi_lbt_dl_config_request_t* req); + +/*! Send a vendor extension message + * \param config A pointer to the vnf p7 configuration + * \param msg A data structure for the decoded vendor extention message + * \return A status value. 0 equal success, -1 indicates failure + * + * The caller is responsiable for memory management of any pointers set in the req, which + * may be released after this function call has returned or at a later pointer + */ +int nfapi_vnf_p7_vendor_extension(nfapi_vnf_p7_config_t* config, nfapi_p7_message_header_t* msg); + +#if defined(__cplusplus) +} +#endif + +#endif // _NFAPI_PNF_INTERFACE_H_ diff --git a/nfapi/open-nFAPI/vnf/src/vnf.c b/nfapi/open-nFAPI/vnf/src/vnf.c new file mode 100644 index 0000000000..6800ee21d2 --- /dev/null +++ b/nfapi/open-nFAPI/vnf/src/vnf.c @@ -0,0 +1,1123 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include + +#include "vnf.h" + + +void* vnf_malloc(nfapi_vnf_config_t* config, size_t size) +{ + if(config->malloc) + { + return (config->malloc)(size); + } + else + { + return calloc(1, size); + } +} +void vnf_free(nfapi_vnf_config_t* config, void* ptr) +{ + if(config->free) + { + return (config->free)(ptr); + } + else + { + return free(ptr); + } +} + +void nfapi_vnf_phy_info_list_add(nfapi_vnf_config_t* config, nfapi_vnf_phy_info_t* info) +{ + NFAPI_TRACE(NFAPI_TRACE_INFO, "Adding phy p5_idx:%d phy_id:%d\n", info->p5_idx, info->phy_id); + info->next = config->phy_list; + config->phy_list = info; +} + +nfapi_vnf_phy_info_t* nfapi_vnf_phy_info_list_find(nfapi_vnf_config_t* config, uint16_t phy_id) +{ + nfapi_vnf_phy_info_t* curr = config->phy_list; + while(curr != 0) + { + if(curr->phy_id == phy_id) + return curr; + + curr = curr->next; + } + + return 0; +} + + + + +void nfapi_vnf_pnf_list_add(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* node) +{ + node->next = config->pnf_list; + config->pnf_list = node; +} + + +nfapi_vnf_pnf_info_t* nfapi_vnf_pnf_list_find(nfapi_vnf_config_t* config, int p5_idx) +{ + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : config->pnf_list:%p\n", __FUNCTION__, config->pnf_list); + + nfapi_vnf_pnf_info_t* curr = config->pnf_list; + while(curr != 0) + { + if(curr->p5_idx == p5_idx) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->p5_idx:%d p5_idx:%d\n", __FUNCTION__, curr->p5_idx, p5_idx); + return curr; + } + + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->next:%p\n", __FUNCTION__, curr->next); + + curr = curr->next; + } + + return 0; +} + +void vnf_handle_pnf_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received PNF_PARAM.reponse\n"); + + nfapi_pnf_param_response_t msg; + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + // Invoke the call back + if(config->pnf_param_resp) + { + (config->pnf_param_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_pnf_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received PNF_CONFIG_RESPONSE\n"); + + nfapi_pnf_config_response_t msg; + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + // Invoke the call back + if(config->pnf_config_resp) + { + (config->pnf_config_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_pnf_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received PNF_START_RESPONSE\n"); + + nfapi_pnf_start_response_t msg; + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->pnf_start_resp) + { + (config->pnf_start_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_pnf_stop_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received PNF_STOP_RESPONSE\n"); + + nfapi_pnf_stop_response_t msg; + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->pnf_stop_resp) + { + (config->pnf_stop_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + + } +} + +void vnf_handle_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received PARAM_RESPONSE\n"); + + nfapi_param_response_t msg; + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + + if (msg.error_code == NFAPI_MSG_OK) + { + nfapi_vnf_phy_info_t* phy_info = nfapi_vnf_phy_info_list_find(config, msg.header.phy_id); + + if(msg.nfapi_config.p7_pnf_address_ipv4.tl.tag) + { + struct sockaddr_in sockAddr; + + (void)memcpy(&sockAddr.sin_addr.s_addr, msg.nfapi_config.p7_pnf_address_ipv4.address, NFAPI_IPV4_ADDRESS_LENGTH); + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 IPv4 address: %s\n", inet_ntoa(sockAddr.sin_addr)); + + // store address + phy_info->p7_pnf_address.sin_addr = sockAddr.sin_addr; + } + + if(msg.nfapi_config.p7_pnf_address_ipv6.tl.tag) + { + struct sockaddr_in6 sockAddr6; + char addr6[64]; + (void)memcpy(&sockAddr6.sin6_addr, msg.nfapi_config.p7_pnf_address_ipv6.address, NFAPI_IPV6_ADDRESS_LENGTH); + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 IPv6 address: %s\n", inet_ntop(AF_INET6, &sockAddr6.sin6_addr, addr6, sizeof(addr6))); + } + + if (msg.nfapi_config.p7_pnf_port.tl.tag) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF P7 Port: %d\n", msg.nfapi_config.p7_pnf_port.value); + + // store port + phy_info->p7_pnf_address.sin_port = htons(msg.nfapi_config.p7_pnf_port.value); + } + } + + if(config->param_resp) + { + (config->param_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received CONFIG_RESPONSE\n"); + + nfapi_config_response_t msg; + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >=0 ) + { + if(config->config_resp) + { + (config->config_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received START_RESPONSE\n"); + + nfapi_start_response_t msg; + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->start_resp) + { + (config->start_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_stop_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received STOP.response\n"); + + nfapi_stop_response_t msg; + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->stop_resp) + { + (config->stop_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_measurement_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received MEASUREMENT.response\n"); + + nfapi_measurement_response_t msg; + + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->measurement_resp) + { + (config->measurement_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_rssi_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received RSSI.response\n"); + + nfapi_rssi_response_t msg; + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->rssi_resp) + { + (config->rssi_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_rssi_indication(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received RSSI.indication\n"); + + nfapi_rssi_indication_t msg; + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->rssi_ind) + { + (config->rssi_ind)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_cell_search_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received CELL_SEARCH.response\n"); + + nfapi_cell_search_response_t msg; + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->cell_search_resp) + { + (config->cell_search_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_cell_search_indication(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "vnf_handle_cell_search_indication: NULL parameters\n"); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received CELL_SEARCH.indication\n"); + + nfapi_cell_search_indication_t msg; + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->cell_search_ind) + { + (config->cell_search_ind)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "vnf_handle_cell_search_response: Unpack message failed, ignoring\n"); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_broadcast_detect_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received BROADCAST_DETECT.response\n"); + + nfapi_broadcast_detect_response_t msg; + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->broadcast_detect_resp) + { + (config->broadcast_detect_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_broadcast_detect_indication(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received BROADCAST_DETECT.indication\n"); + + nfapi_broadcast_detect_indication_t msg; + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->broadcast_detect_ind) + { + (config->broadcast_detect_ind)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + return; + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_system_information_schedule_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received SYSTEM_INFORMATION_SCHEDULE.response\n"); + + nfapi_system_information_schedule_response_t msg; + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->system_information_schedule_resp) + { + (config->system_information_schedule_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_system_information_schedule_indication(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received SYSTEM_INFORMATION_SCHEDULE.indication\n"); + + nfapi_system_information_schedule_indication_t msg; + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->system_information_schedule_ind) + { + (config->system_information_schedule_ind)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_system_information_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received SYSTEM_INFORMATION.response\n"); + + nfapi_system_information_response_t msg; + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) >= 0) + { + if(config->system_information_resp) + { + (config->system_information_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_system_information_indication(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received SYSTEM_INFORMATION.indication\n"); + + nfapi_system_information_indication_t msg; + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(msg), &config->codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + return; + } + + if(config->system_information_ind) + { + (config->system_information_ind)(config, p5_idx, &msg); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } +} + +void vnf_handle_nmm_stop_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx) +{ + // ensure it's valid + if (pRecvMsg == NULL || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received NMM_STOP.response\n"); + + nfapi_nmm_stop_response_t msg; + + // unpack the message + if (nfapi_p4_message_unpack(pRecvMsg, recvMsgLen, &msg, sizeof(nfapi_nmm_stop_response_t), &config->codec_config) >= 0) + { + if(config->nmm_stop_resp) + { + (config->nmm_stop_resp)(config, p5_idx, &msg); + } + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + // make sure to release any dyanmic part of the message + if(msg.vendor_extension) + config->codec_config.deallocate(msg.vendor_extension); + } + +} + +void vnf_handle_vendor_extension(void* pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx, uint16_t message_id) +{ + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + + if(config->allocate_p4_p5_vendor_ext && config->deallocate_p4_p5_vendor_ext) + { + uint16_t msg_size; + + nfapi_p4_p5_message_header_t* msg = config->allocate_p4_p5_vendor_ext(message_id, &msg_size); + + if(msg) + { + if(nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, msg, msg_size, &config->codec_config) >= 0) + { + if(config->vendor_ext) + config->vendor_ext(config, p5_idx, msg); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Unpack message failed, ignoring\n", __FUNCTION__); + } + + config->deallocate_p4_p5_vendor_ext(msg); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to allocate vendor extention structure\n"); + } + } +} + +void vnf_handle_p4_p5_message(void *pRecvMsg, int recvMsgLen, int p5_idx, nfapi_vnf_config_t* config) +{ + nfapi_p4_p5_message_header_t messageHeader; + + // validate the input params + if(pRecvMsg == NULL || recvMsgLen < NFAPI_HEADER_LENGTH || config == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "vnf_handle_p4_p5_message: invalid input params\n"); + return; + } + + // unpack the message header + if (nfapi_p5_message_header_unpack(pRecvMsg, recvMsgLen, &messageHeader, sizeof(nfapi_p4_p5_message_header_t), &config->codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unpack message header failed, ignoring\n"); + return; + } + + switch (messageHeader.message_id) + { + case NFAPI_PNF_PARAM_RESPONSE: + vnf_handle_pnf_param_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_PNF_CONFIG_RESPONSE: + vnf_handle_pnf_config_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_PNF_START_RESPONSE: + vnf_handle_pnf_start_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_PNF_STOP_RESPONSE: + vnf_handle_pnf_stop_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_PARAM_RESPONSE: + vnf_handle_param_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_CONFIG_RESPONSE: + vnf_handle_config_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_START_RESPONSE: + vnf_handle_start_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_STOP_RESPONSE: + vnf_handle_stop_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_MEASUREMENT_RESPONSE: + vnf_handle_measurement_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_RSSI_RESPONSE: + vnf_handle_rssi_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_RSSI_INDICATION: + vnf_handle_rssi_indication(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_CELL_SEARCH_RESPONSE: + vnf_handle_cell_search_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_CELL_SEARCH_INDICATION: + vnf_handle_cell_search_indication(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_BROADCAST_DETECT_RESPONSE: + vnf_handle_broadcast_detect_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_BROADCAST_DETECT_INDICATION: + vnf_handle_broadcast_detect_indication(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE: + vnf_handle_system_information_schedule_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION: + vnf_handle_system_information_schedule_indication(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_SYSTEM_INFORMATION_RESPONSE: + vnf_handle_system_information_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_SYSTEM_INFORMATION_INDICATION: + vnf_handle_system_information_indication(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + case NFAPI_NMM_STOP_RESPONSE: + vnf_handle_nmm_stop_response(pRecvMsg, recvMsgLen, config, p5_idx); + break; + + default: + { + if(messageHeader.message_id >= NFAPI_VENDOR_EXT_MSG_MIN && + messageHeader.message_id <= NFAPI_VENDOR_EXT_MSG_MAX) + { + vnf_handle_vendor_extension(pRecvMsg, recvMsgLen, config, p5_idx, messageHeader.message_id); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s P5 Unknown message ID %d\n", __FUNCTION__, messageHeader.message_id); + } + } + break; + } +} +int vnf_read_dispatch_message(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* pnf) +{ + if(1) + { + int socket_connected = 1; + + // 1. Peek the message header + // 2. If the message is larger than the stack buffer then create a dynamic buffer + // 3. Read the buffer + // 4. Handle the p5 message + + uint32_t header_buffer_size = NFAPI_HEADER_LENGTH; + uint8_t header_buffer[header_buffer_size]; + + uint32_t stack_buffer_size = 32; //should it be the size of then sctp_notificatoin structure + uint8_t stack_buffer[stack_buffer_size]; + + uint8_t* dynamic_buffer = 0; + + uint8_t* read_buffer = &stack_buffer[0]; + uint32_t message_size = 0; + + struct sockaddr_in addr; + socklen_t addr_len = sizeof(addr); + + struct sctp_sndrcvinfo sndrcvinfo; + (void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo)); + + { + int flags = MSG_PEEK; + message_size = sctp_recvmsg(pnf->p5_sock, header_buffer, header_buffer_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags); + + if(message_size == -1) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Failed to peek sctp message size errno:%d\n", errno); + return 0; + } + + nfapi_p4_p5_message_header_t header; + int unpack_result = nfapi_p5_message_header_unpack(header_buffer, header_buffer_size, &header, sizeof(header), 0); + if(unpack_result < 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Failed to decode message header %d\n", unpack_result); + return 0; + } + message_size = header.message_length; + + // now have the size of the mesage + } + + if(message_size > stack_buffer_size) + { + dynamic_buffer = (uint8_t*)malloc(message_size); + + if(dynamic_buffer == NULL) + { + // todo : add error mesage + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Failed to allocate dynamic buffer for sctp_recvmsg size:%d\n", message_size); + return -1; + } + + read_buffer = dynamic_buffer; + } + + { + int flags = 0; + (void)memset(&sndrcvinfo, 0, sizeof(struct sctp_sndrcvinfo)); + + int recvmsg_result = sctp_recvmsg(pnf->p5_sock, read_buffer, message_size, (struct sockaddr*)&addr, &addr_len, &sndrcvinfo, &flags); + if(recvmsg_result == -1) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Failed to read sctp message size errno:%d\n", errno); + } + else + { + if (flags & MSG_NOTIFICATION) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "Notification received from %s:%u\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); + + // todo - handle the events + } + else + { + /* + NFAPI_TRACE(NFAPI_TRACE_INFO, "Received message fd:%d from %s:%u assoc:%d on stream %d, PPID %d, length %d, flags 0x%x\n", + pnf->p5_sock, + inet_ntoa(addr.sin_addr), + ntohs(addr.sin_port), + sndrcvinfo.sinfo_assoc_id, + sndrcvinfo.sinfo_stream, + ntohl(sndrcvinfo.sinfo_ppid), + message_size, + flags); + */ + + // handle now if complete message in one or more segments + if ((flags & 0x80) == 0x80) + { + vnf_handle_p4_p5_message(read_buffer, message_size, pnf->p5_idx, config); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "sctp_recvmsg: unhandled mode with flags 0x%x\n", flags); + + // assume socket disconnected + NFAPI_TRACE(NFAPI_TRACE_WARN, "Disconnected socket\n"); + socket_connected = 0; + } + + + } + } + } + + if(dynamic_buffer) + { + free(dynamic_buffer); + } + + return socket_connected; + } +} + +static int vnf_send_p5_msg(nfapi_vnf_pnf_info_t* pnf, const void *msg, int len, uint8_t stream) +{ + //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s len:%d stream:%d\n", __FUNCTION__, len, stream); + + int result = sctp_sendmsg(pnf->p5_sock, msg, len, (struct sockaddr*)&pnf->p5_pnf_sockaddr, sizeof(pnf->p5_pnf_sockaddr),1, 0, stream, 0, 4); + + if(result != len) + { + if(result < 0) + { + // error + NFAPI_TRACE(NFAPI_TRACE_ERROR, "sctp sendto failed errno: %d\n", errno); + } + else + { + // did not send all the message + } + } + + return 0; +} + + +int vnf_pack_and_send_p5_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len) +{ + nfapi_vnf_pnf_info_t* pnf = nfapi_vnf_pnf_list_find(&(vnf->_public), p5_idx); + + if(pnf) + { + // pack the message for transmission + int packedMessageLength = nfapi_p5_message_pack(msg, msg_len, vnf->tx_message_buffer, sizeof(vnf->tx_message_buffer), &vnf->_public.codec_config); + + if (packedMessageLength < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi_p5_message_pack failed with return %d\n", packedMessageLength); + return -1; + } + + return vnf_send_p5_msg(pnf, vnf->tx_message_buffer, packedMessageLength, 0/*msg->phy_id*/); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() cannot find pnf info for p5_idx:%d\n", __FUNCTION__, p5_idx); + return -1; + } +} + + +int vnf_pack_and_send_p4_message(vnf_t* vnf, uint16_t p5_idx, nfapi_p4_p5_message_header_t* msg, uint16_t msg_len) +{ + nfapi_vnf_pnf_info_t* pnf = nfapi_vnf_pnf_list_find(&(vnf->_public), p5_idx); + + if(pnf) + { + // pack the message for transmission + int packedMessageLength = nfapi_p4_message_pack(msg, msg_len, vnf->tx_message_buffer, sizeof(vnf->tx_message_buffer), &vnf->_public.codec_config); + + if (packedMessageLength < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi_p4_message_pack failed with return %d\n", packedMessageLength); + return -1; + } + + return vnf_send_p5_msg(pnf, vnf->tx_message_buffer, packedMessageLength, 0/*msg->phy_id*/); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() cannot find pnf info for p5_idx:%d\n", __FUNCTION__, p5_idx); + return -1; + } +} + diff --git a/nfapi/open-nFAPI/vnf/src/vnf_interface.c b/nfapi/open-nFAPI/vnf/src/vnf_interface.c new file mode 100644 index 0000000000..0aba0a29f5 --- /dev/null +++ b/nfapi/open-nFAPI/vnf/src/vnf_interface.c @@ -0,0 +1,676 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "vnf.h" + + + +nfapi_vnf_config_t* nfapi_vnf_config_create() +{ + vnf_t* _this = (vnf_t*)calloc(1, sizeof(vnf_t)); + + if(_this == 0) + return 0; + + _this->sctp = 1; + + _this->next_phy_id = 1; + + // Set the default P5 port + _this->_public.vnf_p5_port = NFAPI_P5_SCTP_PORT; + + // set the default memory allocation + _this->_public.malloc = &malloc; + _this->_public.free = &free; + + // set the default memory allocation + _this->_public.codec_config.allocate = &malloc; + _this->_public.codec_config.deallocate = &free; + + + return &(_this->_public); +} + +void nfapi_vnf_config_destory(nfapi_vnf_config_t* config) +{ + free(config); +} + +int nfapi_vnf_start(nfapi_vnf_config_t* config) +{ + // Verify that config is not null + if(config == 0) + return -1; + + // Make sure to set the defined trace function before using NFAPI_TRACE + if(config->trace) + nfapi_trace_g = (nfapi_trace_fn_t)config->trace; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s()\n", __FUNCTION__); + + int p5ListenSock, p5Sock; + + struct sockaddr_in addr; + socklen_t addrSize; + + struct sockaddr_in6 addr6; + + struct sctp_event_subscribe events; + struct sctp_initmsg initMsg; + int noDelay; + + (void)memset(&addr, 0, sizeof(struct sockaddr_in)); + (void)memset(&addr6, 0, sizeof(struct sockaddr_in6)); + (void)memset(&events, 0, sizeof(struct sctp_event_subscribe)); + (void)memset(&initMsg, 0, sizeof(struct sctp_initmsg)); + + vnf_t* vnf = (vnf_t*)(config); + + NFAPI_TRACE(NFAPI_TRACE_INFO, "Starting P5 VNF connection on port %u\n", config->vnf_p5_port); + + /* + char * host = 0; + char * port = "4242"; + struct addrinfo hints; + bzero(&hints, sizeof(struct addrinfo)); + //hints.ai_flags=AI_PASSIVE; + //hints.ai_flags=AI_DEFAULT; + hints.ai_family=AF_UNSPEC; + //hints.ai_family=AF_INET6; + hints.ai_socktype=SOCK_STREAM; + //hints.ai_protocol=IPPROTO_SCTP + + struct addrinfo *aiHead = 0; + + + + int result = getaddrinfo(host, port, &hints, &aiHead); + NFAPI_TRACE(NFAPI_TRACE_INFO, "getaddrinfo return %d %d\n", result, errno); + + while(aiHead->ai_next != NULL) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "addr info %d (IP %d UDP %d SCTP %d)\n %d (%d)\n", + aiHead->ai_protocol, IPPROTO_IP, IPPROTO_UDP, IPPROTO_SCTP, + aiHead->ai_flags, AI_PASSIVE); + + char hostBfr[ NI_MAXHOST ]; + char servBfr[ NI_MAXSERV ]; + + getnameinfo(aiHead->ai_addr, + aiHead->ai_addrlen, + hostBfr, + sizeof( hostBfr ), + servBfr, + sizeof( servBfr ), + NI_NUMERICHOST | NI_NUMERICSERV ); + + switch(aiHead->ai_family) + { + case PF_INET: + { + struct sockaddr_in *pSadrIn = (struct sockaddr_in*) aiHead->ai_addr; + printf( + " ai_addr = sin_family: %d (AF_INET = %d, " + "AF_INET6 = %d)\n" + " sin_addr: %s\n" + " sin_port: %s\n", + pSadrIn->sin_family, + AF_INET, + AF_INET6, + hostBfr, + servBfr ); + } + break; + case PF_INET6: + { + struct sockaddr_in6 *pSadrIn6 = (struct sockaddr_in6*) aiHead->ai_addr; + fprintf( stderr, + " ai_addr = sin6_family: %d (AF_INET = %d, " + "AF_INET6 = %d) \n" + " sin6_addr: %s\n" + " sin6_port: %s\n" + " sin6_flowinfo: %d\n" + " sin6_scope_id: %d\n", + pSadrIn6->sin6_family, + AF_INET, + AF_INET6, + hostBfr, + servBfr, + pSadrIn6->sin6_flowinfo, + pSadrIn6->sin6_scope_id); + } + break; + default: + NFAPI_TRACE(NFAPI_TRACE_INFO, "Not ment to be here\n"); + break; + } + + aiHead = aiHead->ai_next; + } + */ + + { + int protocol; + int domain; + + if (vnf->sctp) + protocol = IPPROTO_SCTP; + else + protocol = IPPROTO_IP; + + if(config->vnf_ipv6) + { + domain = PF_INET6; + } + else + { + domain = AF_INET; + } + + // open the SCTP socket + if ((p5ListenSock = socket(domain, SOCK_STREAM, protocol)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After P5 socket errno: %d\n", errno); + return 0; + } + NFAPI_TRACE(NFAPI_TRACE_INFO, "P5 socket created... %d\n", p5ListenSock); + } + + if (vnf->sctp) + { + // configure for MSG_NOTIFICATION + if (setsockopt(p5ListenSock, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof(struct sctp_event_subscribe)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt (SCTP_EVENTS) errno: %d\n", errno); + close(p5ListenSock); + return 0; + } + NFAPI_TRACE(NFAPI_TRACE_NOTE, "VNF Setting the SCTP_INITMSG\n"); + // configure the SCTP socket options + initMsg.sinit_num_ostreams = 5; //MAX_SCTP_STREAMS; // number of output streams can be greater + initMsg.sinit_max_instreams = 5; //MAX_SCTP_STREAMS; // number of output streams can be greater + if (setsockopt(p5ListenSock, IPPROTO_SCTP, SCTP_INITMSG, &initMsg, sizeof(initMsg)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt (SCTP_INITMSG) errno: %d\n", errno) + close(p5ListenSock); + return 0; + } + noDelay = 1; + if (setsockopt(p5ListenSock, IPPROTO_SCTP, SCTP_NODELAY, &noDelay, sizeof(noDelay)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt (STCP_NODELAY) errno: %d\n", errno); + close(p5ListenSock); + return 0; + } + struct sctp_event_subscribe events; + memset( (void *)&events, 0, sizeof(events) ); + events.sctp_data_io_event = 1; + + if(setsockopt(p5ListenSock, SOL_SCTP, SCTP_EVENTS, (const void *)&events, sizeof(events)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt errno: %d\n", errno); + close(p5ListenSock); + return -1; + } + + } + + + if(config->vnf_ipv6) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "IPV6 binding to port %d %d\n", config->vnf_p5_port, p5ListenSock); + addr6.sin6_family = AF_INET6; + addr6.sin6_port = htons(config->vnf_p5_port); + addr6.sin6_addr = in6addr_any; + + // bind to the configured address and port + if (bind(p5ListenSock, (struct sockaddr *)&addr6, sizeof(struct sockaddr_in6)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After bind errno: %d\n", errno); + close(p5ListenSock); + return 0; + } + } + else if(config->vnf_ipv4) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "IPV4 binding to port %d\n", config->vnf_p5_port); + addr.sin_family = AF_INET; + addr.sin_port = htons(config->vnf_p5_port); + addr.sin_addr.s_addr = INADDR_ANY; + + // bind to the configured address and port + if (bind(p5ListenSock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) + //if (sctp_bindx(p5ListenSock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in), SCTP_BINDX_ADD_ADDR) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After bind errno: %d\n", errno); + close(p5ListenSock); + return 0; + } + } + + NFAPI_TRACE(NFAPI_TRACE_INFO, "bind succeeded..%d.\n", p5ListenSock); + + // put the socket into listen mode + if (listen(p5ListenSock, 2) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After listen errno: %d\n", errno); + close(p5ListenSock); + return 0; + } + + NFAPI_TRACE(NFAPI_TRACE_INFO, "listen succeeded...\n"); + + struct timeval tv; + fd_set read_fd_set; + + + int p5_idx = 0; + while(vnf->terminate == 0) + { + FD_ZERO(&read_fd_set); + + FD_SET(p5ListenSock, &read_fd_set); + int max_fd = p5ListenSock; + + tv.tv_sec = 5; + tv.tv_usec = 0; + + nfapi_vnf_pnf_info_t* pnf = config->pnf_list; + while(pnf != 0) + { + if(pnf->connected) + { + FD_SET(pnf->p5_sock, &read_fd_set); + if (pnf->p5_sock > max_fd) + { + max_fd = pnf->p5_sock; + } + } + + pnf = pnf->next; + } + + int select_result = select(max_fd + 1, &read_fd_set, 0, 0, &tv); + + if(select_result == -1) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "select result %d errno %d\n", select_result, errno); + close(p5ListenSock); + return 0; + } + else if(select_result) + { + if(FD_ISSET(p5ListenSock, &read_fd_set)) + { + addrSize = sizeof(struct sockaddr_in); + NFAPI_TRACE(NFAPI_TRACE_INFO, "Accepting connection from PNF...\n"); + + p5Sock = accept(p5ListenSock, (struct sockaddr *)&addr, &addrSize); + + if (p5Sock < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to accept PNF connection reason:%d\n", errno); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF connection (fd:%d) accepted from %s:%d \n", p5Sock, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); + nfapi_vnf_pnf_info_t* pnf = (nfapi_vnf_pnf_info_t*)malloc(sizeof(nfapi_vnf_pnf_info_t)); + NFAPI_TRACE(NFAPI_TRACE_INFO, "MALLOC nfapi_vnf_pnf_info_t for pnf_list pnf:%p\n", pnf); + memset(pnf, 0, sizeof(nfapi_vnf_pnf_info_t)); + pnf->p5_sock = p5Sock; + pnf->p5_idx = p5_idx++; + pnf->p5_pnf_sockaddr = addr; + pnf->connected = 1; + + nfapi_vnf_pnf_list_add(config, pnf); + + // Inform mac that a pnf connection has been established + // todo : allow mac to 'accept' the connection. i.e. to + // reject it. + if(config->pnf_connection_indication != 0) + { + (config->pnf_connection_indication)(config, pnf->p5_idx); + } + + + // check the connection status + { + struct sctp_status status; + (void)memset(&status, 0, sizeof(struct sctp_status)); + socklen_t optLen = (socklen_t) sizeof(struct sctp_status); + if (getsockopt(p5Sock, IPPROTO_SCTP, SCTP_STATUS, &status, &optLen) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After getsockopt errno: %d\n", errno); + return -1; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Association ID = %d\n", status.sstat_assoc_id); + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Receiver window size = %d\n", status.sstat_rwnd); + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF In Streams = %d\n", status.sstat_instrms); + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF Out Streams = %d\n", status.sstat_outstrms); + + } + } + } + } + else + { + uint8_t delete_pnfs = 0; + + nfapi_vnf_pnf_info_t* pnf = config->pnf_list; + while(pnf != 0) + { + if(FD_ISSET(pnf->p5_sock, &read_fd_set)) + { + if(vnf_read_dispatch_message(config, pnf) == 0) + { + if(config->pnf_disconnect_indication != 0) + { + (config->pnf_disconnect_indication)(config, pnf->p5_idx); + } + + close(pnf->p5_sock); + + pnf->to_delete = 1; + delete_pnfs = 1; + } + } + + pnf = pnf->next; + } + + if(delete_pnfs) + { + nfapi_vnf_pnf_info_t* pnf = config->pnf_list; + nfapi_vnf_pnf_info_t* prev = 0; + while(pnf != 0) + { + nfapi_vnf_pnf_info_t* curr = pnf; + + if(pnf->to_delete == 1) + { + if(prev == 0) + { + config->pnf_list = pnf->next; + } + else + { + prev->next = pnf->next; + } + + pnf = pnf->next; + + free(curr); + } + else + { + prev = pnf; + pnf = pnf->next; + } + + } + + } + } + + continue; + } + else + { + // timeout + + // Should we test for socket closure here every second? + + continue; + } + } + + NFAPI_TRACE(NFAPI_TRACE_INFO, "Closing p5Sock socket's\n"); + { + nfapi_vnf_pnf_info_t* curr = config->pnf_list; + while(curr != NULL) + { + if(config->pnf_disconnect_indication) + { + (config->pnf_disconnect_indication)(config, curr->p5_idx); + } + + close(curr->p5_sock); + curr = curr->next; + } + } + + NFAPI_TRACE(NFAPI_TRACE_INFO, "Closing p5Listen socket\n"); + close(p5ListenSock); + + return 0; + +} + +int nfapi_vnf_stop(nfapi_vnf_config_t* config) +{ + // Verify that config is not null + if(config == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + _this->terminate = 1; + return 0; +} + +int nfapi_vnf_pnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_param_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_pnf_param_request_t)); +} + +int nfapi_vnf_pnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_config_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_pnf_config_request_t)); +} + +int nfapi_vnf_pnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_start_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_pnf_start_request_t)); +} + +int nfapi_vnf_pnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_stop_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_pnf_stop_request_t)); +} + +int nfapi_vnf_param_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_param_request_t)); +} +int nfapi_vnf_config_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + nfapi_vnf_phy_info_t* phy = nfapi_vnf_phy_info_list_find(config, req->header.phy_id); + + if(phy == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "%s failed to find phy inforation phy_id:%d\n", __FUNCTION__, req->header.phy_id); + return -1; + } + + // set the timing parameters + req->nfapi_config.timing_window.tl.tag = NFAPI_NFAPI_TIMING_WINDOW_TAG; + req->nfapi_config.timing_window.value = phy->timing_window; + req->num_tlv++; + + req->nfapi_config.timing_info_mode.tl.tag = NFAPI_NFAPI_TIMING_INFO_MODE_TAG; + req->nfapi_config.timing_info_mode.value = phy->timing_info_mode; + req->num_tlv++; + + req->nfapi_config.timing_info_period.tl.tag = NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG; + req->nfapi_config.timing_info_period.value = phy->timing_info_period; + req->num_tlv++; + + return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_config_request_t)); +} +int nfapi_vnf_start_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_start_request_t)); +} +int nfapi_vnf_stop_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_stop_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_stop_request_t)); +} +int nfapi_vnf_measurement_req(nfapi_vnf_config_t* config, int p5_idx, nfapi_measurement_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p5_message(_this, p5_idx, &req->header, sizeof(nfapi_measurement_request_t)); +} +int nfapi_vnf_rssi_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_rssi_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p4_message(_this, p5_idx, &req->header, sizeof(nfapi_rssi_request_t)); +} +int nfapi_vnf_cell_search_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_cell_search_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p4_message(_this, p5_idx, &req->header, sizeof(nfapi_cell_search_request_t)); +} +int nfapi_vnf_broadcast_detect_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_broadcast_detect_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p4_message(_this, p5_idx, &req->header, sizeof(nfapi_broadcast_detect_request_t)); +} +int nfapi_vnf_system_information_schedule_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_system_information_schedule_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p4_message(_this, p5_idx, &req->header, sizeof(nfapi_system_information_schedule_request_t)); +} +int nfapi_vnf_system_information_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_system_information_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p4_message(_this, p5_idx, &req->header, sizeof(nfapi_system_information_request_t)); +} +int nfapi_vnf_nmm_stop_request(nfapi_vnf_config_t* config, int p5_idx, nfapi_nmm_stop_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p4_message(_this, p5_idx, &req->header, sizeof(nfapi_nmm_stop_request_t)); +} +int nfapi_vnf_vendor_extension(nfapi_vnf_config_t* config, int p5_idx, nfapi_p4_p5_message_header_t* msg) +{ + if(config == 0 || msg == 0) + return -1; + + vnf_t* _this = (vnf_t*)(config); + + return vnf_pack_and_send_p5_message(_this, p5_idx, msg, sizeof(nfapi_p4_p5_message_header_t)); +} + +int nfapi_vnf_allocate_phy(nfapi_vnf_config_t* config, int p5_idx, uint16_t* phy_id) +{ + vnf_t* vnf = (vnf_t*)config; + + nfapi_vnf_phy_info_t* info = (nfapi_vnf_phy_info_t*)calloc(1, sizeof(nfapi_vnf_phy_info_t)); + info->p5_idx = p5_idx; + info->phy_id = vnf->next_phy_id++; + + info->timing_window = 30; // This seems to override what gets set by the user - why??? + info->timing_info_mode = 0x03; + info->timing_info_period = 128; + + nfapi_vnf_phy_info_list_add(config, info); + + (*phy_id) = info->phy_id; + + return 0; +} diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7.c b/nfapi/open-nFAPI/vnf/src/vnf_p7.c new file mode 100644 index 0000000000..1304176752 --- /dev/null +++ b/nfapi/open-nFAPI/vnf/src/vnf_p7.c @@ -0,0 +1,1599 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include + +#include +#include +#include +#include +#include + +#include "vnf_p7.h" + +#define SYNC_CYCLE_COUNT 2 + +void* vnf_p7_malloc(vnf_p7_t* vnf_p7, size_t size) +{ + if(vnf_p7->_public.malloc) + { + return (vnf_p7->_public.malloc)(size); + } + else + { + return calloc(1, size); + } +} +void vnf_p7_free(vnf_p7_t* vnf_p7, void* ptr) +{ + if(ptr == 0) + return; + + if(vnf_p7->_public.free) + { + (vnf_p7->_public.free)(ptr); + } + else + { + free(ptr); + } +} + +void vnf_p7_codec_free(vnf_p7_t* vnf_p7, void* ptr) +{ + if(ptr == 0) + return; + + if(vnf_p7->_public.codec_config.deallocate) + { + (vnf_p7->_public.codec_config.deallocate)(ptr); + } + else + { + free(ptr); + } +} + +void vnf_p7_connection_info_list_add(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* node) +{ + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s()\n", __FUNCTION__); + // todo : add mutex + node->next = vnf_p7->p7_connections; + vnf_p7->p7_connections = node; +} + +nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_find(vnf_p7_t* vnf_p7, uint16_t phy_id) +{ + nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections; + while(curr != 0) + { + if(curr->phy_id == phy_id) + { + return curr; + } + curr = curr->next; + } + + return 0; +} + +nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_delete(vnf_p7_t* vnf_p7, uint16_t phy_id) +{ + nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections; + nfapi_vnf_p7_connection_info_t* prev = 0; + + while(curr != 0) + { + if(curr->phy_id == phy_id) + { + if(prev == 0) + { + vnf_p7->p7_connections = curr->next; + } + else + { + prev->next = curr->next; + } + + return curr; + } + else + { + prev = curr; + curr = curr->next; + } + } + + return 0; +} + +vnf_p7_rx_message_t* vnf_p7_rx_reassembly_queue_add_segment(vnf_p7_t* vnf_p7, vnf_p7_rx_reassembly_queue_t* queue, uint16_t sequence_number, uint16_t segment_number, uint8_t m, uint8_t* data, uint16_t data_len) +{ + vnf_p7_rx_message_t* msg = 0; + // attempt to find a entry for this segment + vnf_p7_rx_message_t* iterator = queue->msg_queue; + while(iterator != 0) + { + if(iterator->sequence_number == sequence_number) + { + msg = iterator; + break; + } + + iterator = iterator->next; + } + + // if found then copy data to message + if(msg != 0) + { + + msg->segments[segment_number].buffer = (uint8_t*)vnf_p7_malloc(vnf_p7, data_len); + memcpy(msg->segments[segment_number].buffer, data, data_len); + msg->segments[segment_number].length = data_len; + + msg->num_segments_received++; + + // set the segement number if we have the last segment + if(m == 0) + msg->num_segments_expected = segment_number + 1; + } + // else add new rx message entry + else + { + // create a new message + msg = (vnf_p7_rx_message_t*)(vnf_p7_malloc(vnf_p7, sizeof(vnf_p7_rx_message_t))); + memset(msg, 0, sizeof(vnf_p7_rx_message_t)); + + msg->sequence_number = sequence_number; + msg->num_segments_expected = m ? 255 : segment_number + 1; + msg->num_segments_received = 1; + msg->rx_hr_time = vnf_get_current_time_hr(); + + msg->segments[segment_number].buffer = (uint8_t*)vnf_p7_malloc(vnf_p7, data_len); + memcpy(msg->segments[segment_number].buffer, data, data_len); + msg->segments[segment_number].length = data_len; + + // place the message at the head of the queue + msg->next = queue->msg_queue; + queue->msg_queue = msg; + } + + return msg; +} + +void vnf_p7_rx_reassembly_queue_remove_msg(vnf_p7_t* vnf_p7, vnf_p7_rx_reassembly_queue_t* queue, vnf_p7_rx_message_t* msg) +{ + // remove message if it has the same sequence number + vnf_p7_rx_message_t* iterator = queue->msg_queue; + vnf_p7_rx_message_t* previous = 0; + + while(iterator != 0) + { + if(iterator->sequence_number == msg->sequence_number) + { + if(previous == 0) + { + queue->msg_queue = iterator->next; + } + else + { + previous->next = iterator->next; + } + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Deleting reassembly message\n"); + // delete the message + uint16_t i; + for(i = 0; i < 128; ++i) + { + if(iterator->segments[i].buffer) + vnf_p7_free(vnf_p7, iterator->segments[i].buffer); + } + vnf_p7_free(vnf_p7, iterator); + + break; + } + + previous = iterator; + iterator = iterator->next; + } +} + +void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reassembly_queue_t* queue, uint32_t delta) +{ + // remove all messages that are too old + vnf_p7_rx_message_t* iterator = queue->msg_queue; + vnf_p7_rx_message_t* previous = 0; + + uint32_t rx_hr_time = vnf_get_current_time_hr(); + + while(iterator != 0) + { + if(rx_hr_time - iterator->rx_hr_time > delta) + { + if(previous == 0) + { + queue->msg_queue = iterator->next; + } + else + { + previous->next = iterator->next; + } + + NFAPI_TRACE(NFAPI_TRACE_INFO, "Deleting stale reassembly message (%u %u %d)\n", iterator->rx_hr_time, rx_hr_time, delta); + + vnf_p7_rx_message_t* to_delete = iterator; + iterator = iterator->next; + + // delete the message + uint16_t i; + for(i = 0; i < 128; ++i) + { + if(to_delete->segments[i].buffer) + vnf_p7_free(vnf_p7, to_delete->segments[i].buffer); + } + vnf_p7_free(vnf_p7, to_delete); + + } + else + { + previous = iterator; + iterator = iterator->next; + } + } +} + +uint32_t vnf_get_current_time_hr() +{ + struct timeval now; + (void)gettimeofday(&now, NULL); + uint32_t time_hr = TIME2TIMEHR(now); + return time_hr; +} + +uint16_t increment_sfn_sf(uint16_t sfn_sf) +{ + if((sfn_sf & 0xF) == 9) + { + sfn_sf += 0x0010; + sfn_sf &= 0x3FF0; + } + else if((sfn_sf & 0xF) > 9) + { + // error should not happen + } + else + { + sfn_sf++; + } + + return sfn_sf; +} + +struct timespec timespec_delta(struct timespec start, struct timespec end) +{ + struct timespec temp; + if ((end.tv_nsec-start.tv_nsec)<0) + { + temp.tv_sec = end.tv_sec-start.tv_sec-1; + temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; + } + else + { + temp.tv_sec = end.tv_sec-start.tv_sec; + temp.tv_nsec = end.tv_nsec-start.tv_nsec; + } + return temp; +} + +static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) +{ + if(now_hr < sf_start_hr) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "now is earlier that start of subframe\n"); + return 0; + } + else + { + uint32_t now_us = TIMEHR_USEC(now_hr); + uint32_t sf_start_us = TIMEHR_USEC(sf_start_hr); + + // if the us have wrapped adjust for it + if(now_hr < sf_start_us) + { + now_us += 1000000; + } + + return now_us - sf_start_us; + } +} + +uint32_t calculate_t1(uint16_t sfn_sf, uint32_t sf_start_time_hr) +{ + uint32_t now_time_hr = vnf_get_current_time_hr(); + + uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); + + uint32_t t1 = (NFAPI_SFNSF2DEC(sfn_sf) * 1000) + sf_time_us; + + return t1; +} + + +uint32_t calculate_t4(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_time_hr) +{ + uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); + + uint32_t t4 = (NFAPI_SFNSF2DEC(sfn_sf) * 1000) + sf_time_us; + + return t4; + +} + + +uint32_t calculate_transmit_timestamp(uint16_t sfn_sf, uint32_t sf_start_time_hr) +{ + uint32_t now_time_hr = vnf_get_current_time_hr(); + + uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); + + uint32_t tt = (NFAPI_SFNSF2DEC(sfn_sf) * 1000) + sf_time_us; + + return tt; +} + + +uint16_t increment_sfn_sf_by(uint16_t sfn_sf, uint8_t increment) +{ + while(increment > 0) + { + sfn_sf = increment_sfn_sf(sfn_sf); + --increment; + } + + return sfn_sf; +} + + +int send_mac_subframe_indications(vnf_p7_t* vnf_p7) +{ + nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections; + while(curr != 0) + { + if(curr->in_sync == 1) + { + // ask for subframes in the future + uint16_t sfn_sf_adv = increment_sfn_sf_by(curr->sfn_sf, 2); + + vnf_p7->_public.subframe_indication(&(vnf_p7->_public), curr->phy_id, sfn_sf_adv); + } + + curr = curr->next; + } + + return 0; +} + +int vnf_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info, uint8_t* msg, const uint32_t len) +{ + int sendto_result = sendto(vnf_p7->socket, msg, len, 0, (struct sockaddr*)&(p7_info->remote_addr), sizeof(p7_info->remote_addr)); + + if(sendto_result != len) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sendto_result %d %d\n", __FUNCTION__, sendto_result, errno); + } + + return 0; +} + +int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* header) +{ + + nfapi_vnf_p7_connection_info_t* p7_connection = vnf_p7_connection_info_list_find(vnf_p7, header->phy_id); + if(p7_connection) + { + int send_result = 0; + uint8_t buffer[1024 * 32]; + + header->m_segment_sequence = NFAPI_P7_SET_MSS(0, 0, p7_connection->sequence_number); + + int len = nfapi_p7_message_pack(header, buffer, sizeof(buffer), &vnf_p7->_public.codec_config); + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size); + + if(len < 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() failed to pack p7 message phy_id:%d\n", __FUNCTION__, header->phy_id); + return -1; + } + + if(len > vnf_p7->_public.segment_size) + { + // todo : consider replacing with the sendmmsg call + // todo : worry about blocking writes? + + // segmenting the transmit + int msg_body_len = len - NFAPI_P7_HEADER_LENGTH ; + int seg_body_len = vnf_p7->_public.segment_size - NFAPI_P7_HEADER_LENGTH ; + int segment_count = (msg_body_len / (seg_body_len)) + ((msg_body_len % seg_body_len) ? 1 : 0); + + int segment = 0; + int offset = NFAPI_P7_HEADER_LENGTH; + uint8_t tx_buffer[vnf_p7->_public.segment_size]; + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() MORE THAN ONE SEGMENT phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size); + for(segment = 0; segment < segment_count; ++segment) + { + uint8_t last = 0; + uint16_t size = vnf_p7->_public.segment_size - NFAPI_P7_HEADER_LENGTH; + if(segment + 1 == segment_count) + { + last = 1; + size = (msg_body_len) - (seg_body_len * segment); + } + + uint16_t segment_size = size + NFAPI_P7_HEADER_LENGTH; + + // Update the header with the m and segement + memcpy(&tx_buffer[0], buffer, NFAPI_P7_HEADER_LENGTH); + + // set the segment length + tx_buffer[4] = (segment_size & 0xFF00) >> 8; + tx_buffer[5] = (segment_size & 0xFF); + + // set the m & segment number + tx_buffer[6] = ((!last) << 7) + segment; + + memcpy(&tx_buffer[NFAPI_P7_HEADER_LENGTH], &buffer[0] + offset, size); + offset += size; + + if(vnf_p7->_public.checksum_enabled) + { + nfapi_p7_update_checksum(tx_buffer, segment_size); + } + + nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn_sf, vnf_p7->sf_start_time_hr)); + + send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &tx_buffer[0], segment_size); + } + } + else + { + if(vnf_p7->_public.checksum_enabled) + { + nfapi_p7_update_checksum(buffer, len); + } + + nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn_sf, vnf_p7->sf_start_time_hr)); + + // simple case that the message fits in a single segement + send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &buffer[0], len); + } + + p7_connection->sequence_number++; + + return send_result; + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() cannot find p7 connection info for phy_id:%d\n", __FUNCTION__, header->phy_id); + return -1; + } +} + +int vnf_build_send_dl_node_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info) +{ + nfapi_dl_node_sync_t dl_node_sync; + memset(&dl_node_sync, 0, sizeof(dl_node_sync)); + + dl_node_sync.header.phy_id = p7_info->phy_id; + dl_node_sync.header.message_id = NFAPI_DL_NODE_SYNC; + dl_node_sync.t1 = calculate_t1(p7_info->sfn_sf, vnf_p7->sf_start_time_hr); + dl_node_sync.delta_sfn_sf = 0; + + return vnf_p7_pack_and_send_p7_msg(vnf_p7, &dl_node_sync.header); +} + +int vnf_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info) +{ + + if(p7_info->in_sync == 1) + { + uint16_t dl_sync_period_mask = p7_info->dl_in_sync_period-1; + uint16_t sfn_sf_dec = NFAPI_SFNSF2DEC(p7_info->sfn_sf); + + if ((((sfn_sf_dec + p7_info->dl_in_sync_offset) % NFAPI_MAX_SFNSFDEC) & dl_sync_period_mask) == 0) + { + vnf_build_send_dl_node_sync(vnf_p7, p7_info); + } + } + else + { + uint16_t dl_sync_period_mask = p7_info->dl_out_sync_period-1; + uint16_t sfn_sf_dec = NFAPI_SFNSF2DEC(p7_info->sfn_sf); + + if ((((sfn_sf_dec + p7_info->dl_out_sync_offset) % NFAPI_MAX_SFNSFDEC) & dl_sync_period_mask) == 0) + { + vnf_build_send_dl_node_sync(vnf_p7, p7_info); + } + } + return 0; +} + + +void vnf_handle_harq_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + // ensure it's valid + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_harq_indication_t ind; + + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__); + } + else + { + if(vnf_p7->_public.harq_indication) + { + (vnf_p7->_public.harq_indication)(&(vnf_p7->_public), &ind); + } + } + + vnf_p7_codec_free(vnf_p7, ind.harq_indication_body.harq_pdu_list); + vnf_p7_codec_free(vnf_p7, ind.vendor_extension); + } +} + +void vnf_handle_crc_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + // ensure it's valid + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_crc_indication_t ind; + + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to message\n", __FUNCTION__); + } + else + { + if(vnf_p7->_public.crc_indication) + { + (vnf_p7->_public.crc_indication)(&(vnf_p7->_public), &ind); + } + } + + vnf_p7_codec_free(vnf_p7, ind.crc_indication_body.crc_pdu_list); + vnf_p7_codec_free(vnf_p7, ind.vendor_extension); + } +} + +void vnf_handle_rx_ulsch_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + // ensure it's valid + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_rx_indication_t ind; + + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__); + } + else + { + if(vnf_p7->_public.rx_indication) + { + (vnf_p7->_public.rx_indication)(&(vnf_p7->_public), &ind); + } + } + + uint16_t i = 0; + for(i = 0; i < ind.rx_indication_body.number_of_pdus; ++i) + { + vnf_p7_codec_free(vnf_p7, ind.rx_indication_body.rx_pdu_list[i].data); + } + vnf_p7_codec_free(vnf_p7, ind.rx_indication_body.rx_pdu_list); + vnf_p7_codec_free(vnf_p7, ind.vendor_extension); + } + +} + +void vnf_handle_rach_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + // ensure it's valid + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_rach_indication_t ind; + + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to message\n", __FUNCTION__); + } + else + { + if(vnf_p7->_public.rach_indication) + { + (vnf_p7->_public.rach_indication)(&vnf_p7->_public, &ind); + } + } + + vnf_p7_codec_free(vnf_p7, ind.rach_indication_body.preamble_list); + vnf_p7_codec_free(vnf_p7, ind.vendor_extension); + + } +} + +void vnf_handle_srs_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + // ensure it's valid + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_srs_indication_t ind; + + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__); + } + else + { + if(vnf_p7->_public.srs_indication) + { + (vnf_p7->_public.srs_indication)(&(vnf_p7->_public), &ind); + } + } + + vnf_p7_codec_free(vnf_p7, ind.srs_indication_body.srs_pdu_list); + vnf_p7_codec_free(vnf_p7, ind.vendor_extension); + } +} + +void vnf_handle_rx_sr_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + // ensure it's valid + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_sr_indication_t ind; + + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__); + } + else + { + if(vnf_p7->_public.sr_indication) + { + (vnf_p7->_public.sr_indication)(&(vnf_p7->_public), &ind); + } + } + + vnf_p7_codec_free(vnf_p7, ind.sr_indication_body.sr_pdu_list); + vnf_p7_codec_free(vnf_p7, ind.vendor_extension); + } +} +void vnf_handle_rx_cqi_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + // ensure it's valid + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_cqi_indication_t ind; + + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__); + } + else + { + if(vnf_p7->_public.cqi_indication) + { + (vnf_p7->_public.cqi_indication)(&(vnf_p7->_public), &ind); + } + } + + vnf_p7_codec_free(vnf_p7, ind.cqi_indication_body.cqi_pdu_list); + vnf_p7_codec_free(vnf_p7, ind.cqi_indication_body.cqi_raw_pdu_list); + vnf_p7_codec_free(vnf_p7, ind.vendor_extension); + + } + +} + +void vnf_handle_lbt_dl_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + // ensure it's valid + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_lbt_dl_indication_t ind; + + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__); + } + else + { + if(vnf_p7->_public.lbt_dl_indication) + { + (vnf_p7->_public.lbt_dl_indication)(&(vnf_p7->_public), &ind); + } + } + + vnf_p7_codec_free(vnf_p7, ind.lbt_dl_indication_body.lbt_indication_pdu_list); + vnf_p7_codec_free(vnf_p7, ind.vendor_extension); + } +} + +void vnf_handle_nb_harq_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + // ensure it's valid + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_nb_harq_indication_t ind; + + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__); + } + else + { + if(vnf_p7->_public.nb_harq_indication) + { + (vnf_p7->_public.nb_harq_indication)(&(vnf_p7->_public), &ind); + } + } + + vnf_p7_codec_free(vnf_p7, ind.nb_harq_indication_body.nb_harq_pdu_list); + vnf_p7_codec_free(vnf_p7, ind.vendor_extension); + } +} + +void vnf_handle_nrach_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + // ensure it's valid + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else + { + nfapi_nrach_indication_t ind; + + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__); + } + else + { + if(vnf_p7->_public.nrach_indication) + { + (vnf_p7->_public.nrach_indication)(&(vnf_p7->_public), &ind); + } + } + + vnf_p7_codec_free(vnf_p7, ind.nrach_indication_body.nrach_pdu_list); + vnf_p7_codec_free(vnf_p7, ind.vendor_extension); + } +} + +void vnf_handle_p7_vendor_extension(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7, uint16_t message_id) +{ + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__); + } + else if(vnf_p7->_public.allocate_p7_vendor_ext) + { + uint16_t msg_size; + nfapi_p7_message_header_t* msg = vnf_p7->_public.allocate_p7_vendor_ext(message_id, &msg_size); + + if(msg == 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to allocate vendor extention structure\n", __FUNCTION__); + return; + } + + int unpack_result = nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, msg, msg_size, &vnf_p7->_public.codec_config); + + if(unpack_result == 0) + { + if(vnf_p7->_public.vendor_ext) + vnf_p7->_public.vendor_ext(&(vnf_p7->_public), msg); + } + + if(vnf_p7->_public.deallocate_p7_vendor_ext) + vnf_p7->_public.deallocate_p7_vendor_ext(msg); + + } +} + + +void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + uint32_t now_time_hr = vnf_get_current_time_hr(); + + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "vnf_handle_ul_node_sync: NULL parameters\n"); + return; + } + + nfapi_ul_node_sync_t ind; + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(nfapi_ul_node_sync_t), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack ul_node_sync\n"); + return; + } + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Received UL_NODE_SYNC phy_id:%d t1:%d t2:%d t3:%d\n", ind.header.phy_id, ind.t1, ind.t2, ind.t3); + + nfapi_vnf_p7_connection_info_t* phy = vnf_p7_connection_info_list_find(vnf_p7, ind.header.phy_id); + uint32_t t4 = calculate_t4(now_time_hr, phy->sfn_sf, vnf_p7->sf_start_time_hr); + + uint32_t tx_2_rx = t4>ind.t1 ? t4 - ind.t1 : t4 + NFAPI_MAX_SFNSFDEC - ind.t1 ; + uint32_t pnf_proc_time = ind.t3 - ind.t2; + + // divide by 2 using shift operator + uint32_t latency = (tx_2_rx - pnf_proc_time) >> 1; + + if(!(phy->filtered_adjust)) + { + phy->latency[phy->min_sync_cycle_count] = latency; + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) PNF to VNF !sync phy_id:%d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d\n", + NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, ind.t1, ind.t2, ind.t3, t4, + tx_2_rx, pnf_proc_time, latency); + } + else + { + phy->latency[phy->min_sync_cycle_count] = latency; + + //if(phy->min_sync_cycle_count != SYNC_CYCLE_COUNT) + { + if (ind.t2 < phy->previous_t2 && ind.t1 > phy->previous_t1) + { + // Only t2 wrap has occurred!!! + phy->sf_offset = (NFAPI_MAX_SFNSFDEC + ind.t2) - ind.t1 - latency; + } + else if (ind.t2 > phy->previous_t2 && ind.t1 < phy->previous_t1) + { + // Only t1 wrap has occurred + phy->sf_offset = ind.t2 - ( ind.t1 + NFAPI_MAX_SFNSFDEC) - latency; + } + else + { + // Either no wrap or both have wrapped + phy->sf_offset = ind.t2 - ind.t1 - latency; + } + + if (phy->sf_offset_filtered == 0) + { + phy->sf_offset_filtered = phy->sf_offset; + } + else + { + int32_t oldFilteredValueShifted = phy->sf_offset_filtered << 5; + int32_t newOffsetShifted = phy->sf_offset << 5; + + // 1/8 of new and 7/8 of old + phy->sf_offset_filtered = ((newOffsetShifted >> 3) + ((oldFilteredValueShifted * 7) >> 3)) >> 5; + } + } + + if(1) + { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", + NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ts.tv_sec, ts.tv_nsec, ind.header.phy_id, + ind.t1, ind.t2, ind.t3, t4, + tx_2_rx, pnf_proc_time, latency, phy->average_latency, phy->sf_offset, phy->sf_offset_filtered, + (ind.t1previous_t1), (ind.t2previous_t2)); + } + + } + + if (phy->filtered_adjust && (phy->sf_offset_filtered > 1e6 || phy->sf_offset_filtered < -1e6)) + { + phy->filtered_adjust = 0; + phy->zero_count=0; + phy->min_sync_cycle_count = 2; + phy->in_sync = 0; + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s - ADJUST TOO BAD - go out of filtered phy->sf_offset_filtered:%d\n", __FUNCTION__, phy->sf_offset_filtered); + } + + if(phy->min_sync_cycle_count) + phy->min_sync_cycle_count--; + + if(phy->min_sync_cycle_count == 0) + { + uint32_t curr_sfn_sf = phy->sfn_sf; + int32_t sfn_sf_dec = NFAPI_SFNSF2DEC(phy->sfn_sf); + + if(!phy->filtered_adjust) + { + int i = 0; + //phy->average_latency = 0; + for(i = 0; i < SYNC_CYCLE_COUNT; ++i) + { + phy->average_latency += phy->latency[i]; + + } + phy->average_latency /= SYNC_CYCLE_COUNT; + + phy->sf_offset = ind.t2 - (ind.t1 - phy->average_latency); + + sfn_sf_dec += (phy->sf_offset / 1000); + } + else + { + sfn_sf_dec += ((phy->sf_offset_filtered + 500) / 1000); //Round up go from microsecond to subframe(1ms) + } + + if(sfn_sf_dec < 0) + { + sfn_sf_dec += NFAPI_MAX_SFNSFDEC; + } + else if( sfn_sf_dec >= NFAPI_MAX_SFNSFDEC) + { + sfn_sf_dec -= NFAPI_MAX_SFNSFDEC; + } + + uint16_t new_sfn_sf = NFAPI_SFNSFDEC2SFNSF(sfn_sf_dec); + + + { + phy->adjustment = NFAPI_SFNSF2DEC(new_sfn_sf) - NFAPI_SFNSF2DEC(curr_sfn_sf); + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF phy_id:%d adjustment%d phy->previous_sf_offset_filtered:%d phy->previous_sf_offset_filtered:%d phy->sf_offset_trend:%d\n", ind.header.phy_id, phy->adjustment, phy->previous_sf_offset_filtered, phy->previous_sf_offset_filtered, phy->sf_offset_trend); + + phy->previous_t1 = 0; + phy->previous_t2 = 0; + + if(phy->previous_sf_offset_filtered > 0) + { + if( phy->sf_offset_filtered > phy->previous_sf_offset_filtered) + { + // pnf is getting futher ahead of vnf + //phy->sf_offset_trend = phy->sf_offset_filtered - phy->previous_sf_offset_filtered; + phy->sf_offset_trend = (phy->sf_offset_filtered + phy->previous_sf_offset_filtered)/2; + } + else + { + // pnf is getting back in sync + } + } + else if(phy->previous_sf_offset_filtered < 0) + { + if(phy->sf_offset_filtered < phy->previous_sf_offset_filtered) + { + // vnf is getting future ahead of pnf + //phy->sf_offset_trend = -(phy->sf_offset_filtered - phy->previous_sf_offset_filtered); + phy->sf_offset_trend = (-(phy->sf_offset_filtered + phy->previous_sf_offset_filtered)) /2; + } + else + { + // vnf is getting back in sync + } + } + + + int insync_minor_adjustment_1 = phy->sf_offset_trend / 6; + int insync_minor_adjustment_2 = phy->sf_offset_trend / 2; + + + if(insync_minor_adjustment_1 == 0) + insync_minor_adjustment_1 = 2; + + if(insync_minor_adjustment_2 == 0) + insync_minor_adjustment_2 = 10; + + if(!phy->filtered_adjust) + { + if(phy->adjustment < 10) + { + phy->zero_count++; + + if(phy->zero_count >= 10) + { + phy->filtered_adjust = 1; + phy->zero_count = 0; + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "***** Adjusting VNF SFN/SF switching to filtered mode\n"); + } + } + else + { + phy->zero_count = 0; + } + } + else + { + // Fine level of adjustment + if (phy->adjustment == 0) + { + if (phy->zero_count >= 10) + { + if(phy->in_sync == 0) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "VNF P7 In Sync with phy (phy_id:%d)\n", phy->phy_id); + + if(vnf_p7->_public.sync_indication) + (vnf_p7->_public.sync_indication)(&(vnf_p7->_public), 1); + } + + phy->in_sync = 1; + } + else + { + phy->zero_count++; + } + + if(phy->in_sync) + { + // in sync + if(phy->sf_offset_filtered > 250) + { + // VNF is slow + phy->insync_minor_adjustment = insync_minor_adjustment_1; //25; + phy->insync_minor_adjustment_duration = ((phy->sf_offset_filtered) / insync_minor_adjustment_1); + } + else if(phy->sf_offset_filtered < -250) + { + // VNF is fast + phy->insync_minor_adjustment = -(insync_minor_adjustment_1); //25; + phy->insync_minor_adjustment_duration = (((phy->sf_offset_filtered) / -(insync_minor_adjustment_1))); + } + else + { + phy->insync_minor_adjustment = 0; + } + + if(phy->insync_minor_adjustment != 0) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adjustment:%d\n", + NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, + phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, + phy->sf_offset_filtered, + insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend, + NFAPI_SFNSF2DEC(new_sfn_sf), + NFAPI_SFNSF2DEC(curr_sfn_sf), + phy->adjustment); + } + } + } + else + { + if (phy->in_sync) + { + if(phy->adjustment == 0) + { + } + else if(phy->adjustment > 0) + { + // VNF is slow + //if(phy->adjustment == 1) + { + // + if(phy->sf_offset_filtered > 250) + { + // VNF is slow + phy->insync_minor_adjustment = insync_minor_adjustment_2; + phy->insync_minor_adjustment_duration = 2 * ((phy->sf_offset_filtered - 250) / insync_minor_adjustment_2); + } + else if(phy->sf_offset_filtered < -250) + { + // VNF is fast + phy->insync_minor_adjustment = -(insync_minor_adjustment_2); + phy->insync_minor_adjustment_duration = 2 * ((phy->sf_offset_filtered + 250) / -(insync_minor_adjustment_2)); + } + + } + //else + { + // out of sync? + } + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adj:%d\n", + NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, + phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered, + insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend, + NFAPI_SFNSF2DEC(new_sfn_sf), + NFAPI_SFNSF2DEC(curr_sfn_sf), + phy->adjustment); + + } + else if(phy->adjustment < 0) + { + // VNF is fast + //if(phy->adjustment == -1) + { + // + if(phy->sf_offset_filtered > 250) + { + // VNF is slow + phy->insync_minor_adjustment = insync_minor_adjustment_2; + phy->insync_minor_adjustment_duration = 2 * ((phy->sf_offset_filtered - 250) / insync_minor_adjustment_2); + } + else if(phy->sf_offset_filtered < -250) + { + // VNF is fast + phy->insync_minor_adjustment = -(insync_minor_adjustment_2); + phy->insync_minor_adjustment_duration = 2 * ((phy->sf_offset_filtered + 250) / -(insync_minor_adjustment_2)); + } + } + //else + { + // out of sync? + } + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d\n", + NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, + phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered, + insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); + } + + /* + if (phy->adjustment > 10 || phy->adjustment < -10) + { + phy->zero_count++; // Add one to the getting out of sync counter + } + else + { + phy->zero_count = 0; // Small error - zero the out of sync counter + } + + if (phy->zero_count >= 10) // If we have had 10 consecutive large errors - drop out of sync + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "we have fallen out of sync...\n"); + //pP7SockInfo->syncAchieved = 0; + } + */ + } + } + } + + + if(phy->in_sync == 0) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "***** Adjusting VNF phy_id:%d SFN/SF (%s) from %d to %d (%d) mode:%s zeroCount:%u sync:%s\n", + ind.header.phy_id, (phy->in_sync ? "via sfn" : "now"), + NFAPI_SFNSF2DEC(curr_sfn_sf), NFAPI_SFNSF2DEC(new_sfn_sf), phy->adjustment, + phy->filtered_adjust ? "FILTERED" : "ABSOLUTE", + phy->zero_count, + phy->in_sync ? "IN_SYNC" : "OUT_OF_SYNC"); + + phy->sfn_sf = new_sfn_sf; + } + } + + // reset for next cycle + phy->previous_sf_offset_filtered = phy->sf_offset_filtered; + phy->min_sync_cycle_count = 2; + phy->sf_offset_filtered = 0; + phy->sf_offset = 0; + } + else + { + phy->previous_t1 = ind.t1; + phy->previous_t2 = ind.t2; + } +} + +void vnf_handle_timing_info(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + if (pRecvMsg == NULL || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "vnf_handle_timing_info: NULL parameters\n"); + return; + } + + nfapi_timing_info_t ind; + if(nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(nfapi_timing_info_t), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack timing_info\n"); + return; + } + + if (vnf_p7 && vnf_p7->p7_connections) + { + int16_t vnf_pnf_sfnsf_delta = NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf) - NFAPI_SFNSF2DEC(ind.last_sfn_sf); + + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PNF:SFN/SF:%d VNF:SFN/SF:%d deltaSFNSF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind.last_sfn_sf), NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), vnf_pnf_sfnsf_delta); + if (vnf_pnf_sfnsf_delta>1 || vnf_pnf_sfnsf_delta < -1) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() LARGE SFN/SF DELTA between PNF and VNF delta:%d VNF:%d PNF:%d\n\n\n\n\n\n\n\n\n", __FUNCTION__, vnf_pnf_sfnsf_delta, NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), NFAPI_SFNSF2DEC(ind.last_sfn_sf)); + } + } +} + +void vnf_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + nfapi_p7_message_header_t header; + + // validate the input params + if(pRecvMsg == NULL || recvMsgLen < 4 || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__); + return; + } + + // unpack the message header + if (nfapi_p7_message_header_unpack(pRecvMsg, recvMsgLen, &header, sizeof(header), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unpack message header failed, ignoring\n"); + return; + } + + // ensure the message is sensible + if (recvMsgLen < 8 || pRecvMsg == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "Invalid message size: %d, ignoring\n", recvMsgLen); + return; + } + + switch (header.message_id) + { + case NFAPI_UL_NODE_SYNC: + vnf_handle_ul_node_sync(pRecvMsg, recvMsgLen, vnf_p7); + break; + + case NFAPI_TIMING_INFO: + vnf_handle_timing_info(pRecvMsg, recvMsgLen, vnf_p7); + break; + + case NFAPI_HARQ_INDICATION: + vnf_handle_harq_indication(pRecvMsg, recvMsgLen, vnf_p7); + break; + + case NFAPI_CRC_INDICATION: + vnf_handle_crc_indication(pRecvMsg, recvMsgLen, vnf_p7); + break; + + case NFAPI_RX_ULSCH_INDICATION: + vnf_handle_rx_ulsch_indication(pRecvMsg, recvMsgLen, vnf_p7); + break; + + case NFAPI_RACH_INDICATION: + vnf_handle_rach_indication(pRecvMsg, recvMsgLen, vnf_p7); + break; + + case NFAPI_SRS_INDICATION: + vnf_handle_srs_indication(pRecvMsg, recvMsgLen, vnf_p7); + break; + + case NFAPI_RX_SR_INDICATION: + vnf_handle_rx_sr_indication(pRecvMsg, recvMsgLen, vnf_p7); + break; + + case NFAPI_RX_CQI_INDICATION: + vnf_handle_rx_cqi_indication(pRecvMsg, recvMsgLen, vnf_p7); + break; + + case NFAPI_LBT_DL_INDICATION: + vnf_handle_lbt_dl_indication(pRecvMsg, recvMsgLen, vnf_p7); + break; + + case NFAPI_NB_HARQ_INDICATION: + vnf_handle_nb_harq_indication(pRecvMsg, recvMsgLen, vnf_p7); + break; + + case NFAPI_NRACH_INDICATION: + vnf_handle_nrach_indication(pRecvMsg, recvMsgLen, vnf_p7); + break; + + default: + { + if(header.message_id >= NFAPI_VENDOR_EXT_MSG_MIN && + header.message_id <= NFAPI_VENDOR_EXT_MSG_MAX) + { + vnf_handle_p7_vendor_extension(pRecvMsg, recvMsgLen, vnf_p7, header.message_id); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Unknown message ID %d\n", header.message_id); + } + } + break; + } +} + +void vnf_handle_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +{ + nfapi_p7_message_header_t messageHeader; + + // validate the input params + if(pRecvMsg == NULL || recvMsgLen < 4 || vnf_p7 == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "vnf_handle_p7_message: invalid input params (%d %d %d)\n", pRecvMsg, recvMsgLen, vnf_p7); + return; + } + + // unpack the message header + if (nfapi_p7_message_header_unpack(pRecvMsg, recvMsgLen, &messageHeader, sizeof(nfapi_p7_message_header_t), &vnf_p7->_public.codec_config) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unpack message header failed, ignoring\n"); + return; + } + + if(vnf_p7->_public.checksum_enabled) + { + uint32_t checksum = nfapi_p7_calculate_checksum(pRecvMsg, recvMsgLen); + if(checksum != messageHeader.checksum) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Checksum verification failed %d %d msg:%d len:%d\n", checksum, messageHeader.checksum, messageHeader.message_id, recvMsgLen); + return; + } + } + + uint8_t m = NFAPI_P7_GET_MORE(messageHeader.m_segment_sequence); + uint8_t segment_num = NFAPI_P7_GET_SEGMENT(messageHeader.m_segment_sequence); + uint8_t sequence_num = NFAPI_P7_GET_SEQUENCE(messageHeader.m_segment_sequence); + + + if(m == 0 && segment_num == 0) + { + // we have a complete message + // ensure the message is sensible + if (recvMsgLen < 8 || pRecvMsg == NULL) + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "Invalid message size: %d, ignoring\n", recvMsgLen); + return; + } + + //vnf_dispatch_p7_message(&messageHeader, pRecvMsg, recvMsgLen, vnf_p7); + vnf_dispatch_p7_message(pRecvMsg, recvMsgLen, vnf_p7); + } + else + { + nfapi_vnf_p7_connection_info_t* phy = vnf_p7_connection_info_list_find(vnf_p7, messageHeader.phy_id); + + if(phy) + { + vnf_p7_rx_message_t* rx_msg = vnf_p7_rx_reassembly_queue_add_segment(vnf_p7, &(phy->reassembly_queue), sequence_num, segment_num, m, pRecvMsg, recvMsgLen); + + if(rx_msg->num_segments_received == rx_msg->num_segments_expected) + { + // send the buffer on + uint16_t i = 0; + uint16_t length = 0; + for(i = 0; i < rx_msg->num_segments_expected; ++i) + { + length += rx_msg->segments[i].length - (i > 0 ? NFAPI_P7_HEADER_LENGTH : 0); + } + + if(phy->reassembly_buffer_size < length) + { + vnf_p7_free(vnf_p7, phy->reassembly_buffer); + phy->reassembly_buffer = 0; + } + + if(phy->reassembly_buffer == 0) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "Resizing VNF_P7 Reassembly buffer %d->%d\n", phy->reassembly_buffer_size, length); + phy->reassembly_buffer = (uint8_t*)vnf_p7_malloc(vnf_p7, length); + + if(phy->reassembly_buffer == 0) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "Failed to allocate VNF_P7 reassemby buffer len:%d\n", length); + return; + } + + phy->reassembly_buffer_size = length; + } + + uint16_t offset = 0; + for(i = 0; i < rx_msg->num_segments_expected; ++i) + { + if(i == 0) + { + memcpy(phy->reassembly_buffer, rx_msg->segments[i].buffer, rx_msg->segments[i].length); + offset += rx_msg->segments[i].length; + } + else + { + memcpy(phy->reassembly_buffer + offset, rx_msg->segments[i].buffer + NFAPI_P7_HEADER_LENGTH, rx_msg->segments[i].length - NFAPI_P7_HEADER_LENGTH); + offset += rx_msg->segments[i].length - NFAPI_P7_HEADER_LENGTH; + } + } + + + //pnf_dispatch_p7_message(pnf_p7->reassemby_buffer, length, pnf_p7, rx_msg->rx_hr_time); + vnf_dispatch_p7_message(phy->reassembly_buffer, length , vnf_p7); + + + // delete the structure + vnf_p7_rx_reassembly_queue_remove_msg(vnf_p7, &(phy->reassembly_queue), rx_msg); + } + + vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7, &(phy->reassembly_queue), 1000); + } + else + { + + NFAPI_TRACE(NFAPI_TRACE_INFO, "Unknown phy id %d\n", messageHeader.phy_id); + } + } +} + +int vnf_p7_read_dispatch_message(vnf_p7_t* vnf_p7) +{ + int recvfrom_result = 0; + struct sockaddr_in remote_addr; + socklen_t remote_addr_size = sizeof(remote_addr); + + do + { + // peek the header + uint8_t header_buffer[NFAPI_P7_HEADER_LENGTH]; + recvfrom_result = recvfrom(vnf_p7->socket, header_buffer, NFAPI_P7_HEADER_LENGTH, MSG_DONTWAIT | MSG_PEEK, (struct sockaddr*)&remote_addr, &remote_addr_size); + + if(recvfrom_result > 0) + { + // get the segment size + nfapi_p7_message_header_t header; + if(nfapi_p7_message_header_unpack(header_buffer, NFAPI_P7_HEADER_LENGTH, &header, sizeof(header), 0) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unpack message header failed, ignoring\n"); + return -1; + } + + // resize the buffer if we have a large segment + if(header.message_length > vnf_p7->rx_message_buffer_size) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "reallocing rx buffer %d\n", header.message_length); + vnf_p7->rx_message_buffer = realloc(vnf_p7->rx_message_buffer, header.message_length); + vnf_p7->rx_message_buffer_size = header.message_length; + } + + // read the segment + recvfrom_result = recvfrom(vnf_p7->socket, vnf_p7->rx_message_buffer, header.message_length, MSG_WAITALL, (struct sockaddr*)&remote_addr, &remote_addr_size); + + // todo : how to handle incomplete readfroms, need some sort of buffer/select + + if(recvfrom_result == 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "recvfrom returned 0\n"); + } + else if(recvfrom_result != header.message_length) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "did not receive the entire message %d %d\n", recvfrom_result, header.message_length); + + recvfrom_result += recvfrom(vnf_p7->socket, &vnf_p7->rx_message_buffer[recvfrom_result], header.message_length - recvfrom_result, MSG_WAITALL, (struct sockaddr*)&remote_addr, &remote_addr_size); + + } + + + if(recvfrom_result > 0) + { + vnf_handle_p7_message(vnf_p7->rx_message_buffer, recvfrom_result, vnf_p7); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "recvfrom failed %d %d\n", recvfrom_result, errno); + } + } + + if(recvfrom_result == -1) + { + if(errno == EAGAIN || errno == EWOULDBLOCK) + { + // return to the select + //NFAPI_TRACE(NFAPI_TRACE_WARN, "%s recvfrom would block :%d\n", __FUNCTION__, errno); + } + else + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "%s recvfrom failed errno:%d\n", __FUNCTION__, errno); + } + } + } + while(recvfrom_result > 0); + + return 0; +} + +void vnf_p7_release_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* header) +{ + switch(header->message_id) + { + case NFAPI_HARQ_INDICATION: + { + vnf_p7_codec_free(vnf_p7, ((nfapi_harq_indication_t*)(header))->harq_indication_body.harq_pdu_list); + } + break; + case NFAPI_CRC_INDICATION: + { + vnf_p7_codec_free(vnf_p7, ((nfapi_crc_indication_t*)(header))->crc_indication_body.crc_pdu_list); + } + break; + case NFAPI_RX_ULSCH_INDICATION: + { + nfapi_rx_indication_t* rx_ind = (nfapi_rx_indication_t*)(header); + uint16_t i = 0; + for(i = 0; i < rx_ind->rx_indication_body.number_of_pdus; ++i) + { + vnf_p7_codec_free(vnf_p7, rx_ind->rx_indication_body.rx_pdu_list[i].data); + } + + vnf_p7_codec_free(vnf_p7, rx_ind->rx_indication_body.rx_pdu_list); + } + break; + case NFAPI_RACH_INDICATION: + { + vnf_p7_codec_free(vnf_p7, ((nfapi_rach_indication_t*)(header))->rach_indication_body.preamble_list); + } + break; + case NFAPI_SRS_INDICATION: + { + vnf_p7_codec_free(vnf_p7, ((nfapi_srs_indication_t*)(header))->srs_indication_body.srs_pdu_list); + } + break; + case NFAPI_RX_SR_INDICATION: + { + vnf_p7_codec_free(vnf_p7, ((nfapi_sr_indication_t*)(header))->sr_indication_body.sr_pdu_list); + } + break; + case NFAPI_RX_CQI_INDICATION: + { + vnf_p7_codec_free(vnf_p7, ((nfapi_cqi_indication_t*)(header))->cqi_indication_body.cqi_pdu_list); + vnf_p7_codec_free(vnf_p7, ((nfapi_cqi_indication_t*)(header))->cqi_indication_body.cqi_raw_pdu_list); + } + break; + } + + vnf_p7_free(vnf_p7, header); + +} + +void vnf_p7_release_pdu(vnf_p7_t* vnf_p7, void* pdu) +{ + vnf_p7_free(vnf_p7, pdu); +} + diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c new file mode 100644 index 0000000000..a35d8e3c1d --- /dev/null +++ b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c @@ -0,0 +1,562 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "vnf_p7.h" + +#define FAPI2_IP_DSCP 0 + +nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create() +{ + vnf_p7_t* _this = (vnf_p7_t*)calloc(1, sizeof(vnf_p7_t)); + + if(_this == 0) + return 0; + + // todo : initialize + _this->_public.segment_size = 1400; + _this->_public.max_num_segments = 8; + _this->_public.checksum_enabled = 1; + + _this->_public.malloc = &malloc; + _this->_public.free = &free; + + _this->_public.codec_config.allocate = &malloc; + _this->_public.codec_config.deallocate = &free; + + + return &(_this->_public); +} + +void nfapi_vnf_p7_config_destory(nfapi_vnf_p7_config_t* config) +{ + free(config); +} + + +struct timespec timespec_add(struct timespec lhs, struct timespec rhs) +{ + struct timespec result; + + result.tv_sec = lhs.tv_sec + rhs.tv_sec; + result.tv_nsec = lhs.tv_nsec + rhs.tv_nsec; + + if(result.tv_nsec > 1e9) + { + result.tv_sec++; + result.tv_nsec-= 1e9; + } + + return result; +} + +struct timespec timespec_sub(struct timespec lhs, struct timespec rhs) +{ + struct timespec result; + if ((lhs.tv_nsec-rhs.tv_nsec)<0) + { + result.tv_sec = lhs.tv_sec-rhs.tv_sec-1; + result.tv_nsec = 1000000000+lhs.tv_nsec-rhs.tv_nsec; + } + else + { + result.tv_sec = lhs.tv_sec-rhs.tv_sec; + result.tv_nsec = lhs.tv_nsec-rhs.tv_nsec; + } + return result; +} + +// monitor the p7 endpoints and the timing loop and +// send indications to mac +int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) +{ + if(config == 0) + return -1; + + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s()\n", __FUNCTION__); + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + + // Create p7 receive udp port + // todo : this needs updating for Ipv6 + + NFAPI_TRACE(NFAPI_TRACE_INFO, "Initialising VNF P7 port:%u\n", config->port); + + // open the UDP socket + if ((vnf_p7->socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After P7 socket errno: %d\n", errno); + return -1; + } + + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 socket created...\n"); + + // configure the UDP socket options + int iptos_value = FAPI2_IP_DSCP << 2; + if (setsockopt(vnf_p7->socket, IPPROTO_IP, IP_TOS, &iptos_value, sizeof(iptos_value)) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After setsockopt (IP_TOS) errno: %d\n", errno); + return -1; + } + + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 setsockopt succeeded...\n"); + + // Create the address structure + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(config->port); + addr.sin_addr.s_addr = INADDR_ANY; + + // bind to the configured port + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 binding too %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); + if (bind(vnf_p7->socket, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) + //if (sctp_bindx(config->socket, (struct sockaddr *)&addr, sizeof(struct sockaddr_in), 0) < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "After bind errno: %d\n", errno); + return -1; + } + + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 bind succeeded...\n"); + + + //struct timespec original_pselect_timeout; + struct timespec pselect_timeout; + pselect_timeout.tv_sec = 0; + pselect_timeout.tv_nsec = 1000000; // ns in a 1 us + + + struct timespec pselect_start; + struct timespec pselect_stop; + + //struct timespec sf_end; + + long last_millisecond = -1; + + + struct timespec sf_duration; + sf_duration.tv_sec = 0; + sf_duration.tv_nsec = 1e6; // We want 1ms pause + + struct timespec sf_start; + clock_gettime(CLOCK_MONOTONIC, &sf_start); + long millisecond = sf_start.tv_nsec / 1e6; + sf_start = timespec_add(sf_start, sf_duration); + NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec); + + while(vnf_p7->terminate == 0) + { + fd_set rfds; + int maxSock = 0; + FD_ZERO(&rfds); + int selectRetval = 0; + + // Add the p7 socket + FD_SET(vnf_p7->socket, &rfds); + maxSock = vnf_p7->socket; + + clock_gettime(CLOCK_MONOTONIC, &pselect_start); + //long millisecond = pselect_start.tv_nsec / 1e6; + + if((last_millisecond == -1) || (millisecond == last_millisecond) || (millisecond == (last_millisecond + 1) % 1000) ) + { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "pselect_start:%d.%d sf_start:%d.%d\n", pselect_start.tv_sec, pselect_start.tv_nsec, sf_start.tv_sec, sf_start.tv_nsec); + + + if((pselect_start.tv_sec > sf_start.tv_sec) || + ((pselect_start.tv_sec == sf_start.tv_sec) && (pselect_start.tv_nsec > sf_start.tv_nsec))) + { + // overran the end of the subframe we do not want to wait + pselect_timeout.tv_sec = 0; + pselect_timeout.tv_nsec = 0; + + //struct timespec overrun = timespec_sub(pselect_start, sf_start); + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Subframe overrun detected of %d.%d running to catchup\n", overrun.tv_sec, overrun.tv_nsec); + } + else + { + // still time before the end of the subframe wait + pselect_timeout = timespec_sub(sf_start, pselect_start); + +#if 0 + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sf_start:%d.%ld pselect_start:%d.%ld pseclect_timeout:%d.%ld\n", + __FUNCTION__, + sf_start.tv_sec, sf_start.tv_nsec, + pselect_start.tv_sec, pselect_start.tv_nsec, + pselect_timeout.tv_sec, pselect_timeout.tv_nsec); +#endif + } + +//original_pselect_timeout = pselect_timeout; + + // detemine how long to sleep in ns before the start of the next 1ms + //pselect_timeout.tv_nsec = 1e6 - (pselect_start.tv_nsec % 1000000); + + //uint8_t underrun_possible =0; + + // if we are not sleeping until the next milisecond due to the + // insycn minor adjment flag it so we don't consider it an error + //uint8_t underrun_possible =0; + /* + { + nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections; + if(phy && phy->in_sync && phy->insync_minor_adjustment != 0 && phy->insync_minor_adjustment_duration > 0 && pselect_start.tv_nsec != 0) + { + NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] Subframe minor adjustment %d (%d->%d)\n", phy->insync_minor_adjustment, + pselect_timeout.tv_nsec, pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000)) + if(phy->insync_minor_adjustment > 0) + { + // todo check we don't go below 0 + if((phy->insync_minor_adjustment * 1000) > pselect_timeout.tv_nsec) + pselect_timeout.tv_nsec = 0; + else + pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000); + + + //underrun_possible = 1; + } + else if(phy->insync_minor_adjustment < 0) + { + // todo check we don't go below 0 + pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000); + } + + //phy->insync_minor_adjustment = 0; + phy->insync_minor_adjustment_duration--; + } + } + */ + + +//long wraps = pselect_timeout.tv_nsec % 1e9; + + + selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL); + + clock_gettime(CLOCK_MONOTONIC, &pselect_stop); + + nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections; + +if (selectRetval==-1 && errno == 22) +{ + NFAPI_TRACE(NFAPI_TRACE_ERROR, "INVAL: pselect_timeout:%d.%ld adj[dur:%d adj:%d], sf_dur:%d.%ld\n", + pselect_timeout.tv_sec, pselect_timeout.tv_nsec, + phy->insync_minor_adjustment_duration, phy->insync_minor_adjustment, + sf_duration.tv_sec, sf_duration.tv_nsec); +} +#if 0 + if (selectRetval != 0 || phy->insync_minor_adjustment_duration != 0) + NFAPI_TRACE(NFAPI_TRACE_NOTE, "pselect()=%d maxSock:%d vnf_p7->socket:%d pselect_timeout:%u.%u original_pselect_timeout:%u.%u\n", + selectRetval, maxSock, vnf_p7->socket, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, + original_pselect_timeout.tv_sec, original_pselect_timeout.tv_nsec); +#endif + + if(selectRetval == 0) + { + // calculate the start of the next subframe + sf_start = timespec_add(sf_start, sf_duration); + //NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec); + + if(phy && phy->in_sync && phy->insync_minor_adjustment != 0 && phy->insync_minor_adjustment_duration > 0) + { + long insync_minor_adjustment_ns = (phy->insync_minor_adjustment * 1000); + + sf_start.tv_nsec -= insync_minor_adjustment_ns; + +#if 1 + if (sf_start.tv_nsec > 1e9) + { + sf_start.tv_sec++; + sf_start.tv_nsec-=1e9; + } + else if (sf_start.tv_nsec < 0) + { + sf_start.tv_sec--; + sf_start.tv_nsec+=1e9; + } +#else + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] BEFORE adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d\n", phy->insync_minor_adjustment, sf_start.tv_nsec); + if(phy->insync_minor_adjustment > 0) + { + // decrease the subframe duration a little + if (sf_start.tv_nsec > insync_minor_adjustment_ns) + sf_start.tv_nsec -= insync_minor_adjustment_ns; + else + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] Adjustment would make it negative sf:%d.%ld adjust:%ld\n\n\n", sf_start.tv_sec, sf_start.tv_nsec, insync_minor_adjustment_ns); + sf_start.tv_sec--; + sf_start.tv_nsec += 1e9 - insync_minor_adjustment_ns; + } + } + else if(phy->insync_minor_adjustment < 0) + { + // todo check we don't go below 0 + // increase the subframe duration a little + sf_start.tv_nsec += insync_minor_adjustment_ns; + + if (sf_start.tv_nsec < 0) + { + NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] OVERFLOW %d.%ld\n\n\n\n", sf_start.tv_sec, sf_start.tv_nsec); + sf_start.tv_sec++; + sf_start.tv_nsec += 1e9; + } + } +#endif + + //phy->insync_minor_adjustment = 0; + phy->insync_minor_adjustment_duration--; + + NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d duration:%u\n", + phy->insync_minor_adjustment, sf_start.tv_nsec, phy->insync_minor_adjustment_duration); + + if (phy->insync_minor_adjustment_duration==0) + { + phy->insync_minor_adjustment = 0; + } + } + /* + long pselect_stop_millisecond = pselect_stop.tv_nsec / 1e6; + if(millisecond == pselect_stop_millisecond) + { + // we have woke up in the same subframe + if(underrun_possible == 0) + NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe pselect underrun %ld (%d.%d)\n", millisecond, pselect_stop.tv_sec, pselect_stop.tv_nsec); + } + else if(((millisecond + 1) % 1000) != pselect_stop_millisecond) + { + // we have overrun the subframe + NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe pselect overrun %ld %ld\n", millisecond, pselect_stop_millisecond); + NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe underrun %ld\n", millisecond); + } + last_millisecond = millisecond; + */ + + millisecond ++; + } + } + else + { + // we have overrun the subframe advance to go and collect $200 + if((millisecond - last_millisecond) > 3) + NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe overrun %ld %ld (%ld)\n", millisecond, last_millisecond, millisecond - last_millisecond + 1); + + last_millisecond = ( last_millisecond + 1 ) % 1000; + selectRetval = 0; + } + + if(selectRetval == 0) + { + vnf_p7->sf_start_time_hr = vnf_get_current_time_hr(); + + // pselect timed out + nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections; + + while(curr != 0) + { + curr->sfn_sf = increment_sfn_sf(curr->sfn_sf); + + vnf_sync(vnf_p7, curr); + + curr = curr->next; + } + + send_mac_subframe_indications(vnf_p7); + + } + else if(selectRetval > 0) + { + // have a p7 message + if(FD_ISSET(vnf_p7->socket, &rfds)) + { + vnf_p7_read_dispatch_message(vnf_p7); + } + } + else + { + // pselect error + if(selectRetval == -1 && errno == EINTR) + { + // a sigal was received. + } + else + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d orginal:%d.%d last_ms:%ld ms:%ld\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, last_millisecond, millisecond); + // should we exit now? + if (selectRetval == -1 && errno == 22) // invalid argument??? not sure about timeout duration + { + usleep(100000); + } + } + } + + } + + + NFAPI_TRACE(NFAPI_TRACE_INFO, "Closing p7 socket\n"); + close(vnf_p7->socket); + + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() returning\n", __FUNCTION__); + + return 0; +} + +int nfapi_vnf_p7_stop(nfapi_vnf_p7_config_t* config) +{ + if(config == 0) + return -1; + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + vnf_p7->terminate =1; + return 0; +} + +int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id) +{ + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p phy_id:%d pnf_addr:%s pnf_p7_port:%d)\n", __FUNCTION__, config, phy_id, pnf_p7_addr, pnf_p7_port); + + if(config == 0) + { + return -1; + } + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + + nfapi_vnf_p7_connection_info_t* node = (nfapi_vnf_p7_connection_info_t*)malloc(sizeof(nfapi_vnf_p7_connection_info_t)); + + memset(node, 0, sizeof(nfapi_vnf_p7_connection_info_t)); + node->phy_id = phy_id; + node->in_sync = 0; + node->dl_out_sync_offset = 30; + node->dl_out_sync_period = 10; + node->dl_in_sync_offset = 30; + node->dl_in_sync_period = 512; + node->sfn_sf = 0; + + node->min_sync_cycle_count = 8; + + // save the remote endpoint information + node->remote_addr.sin_family = AF_INET; + node->remote_addr.sin_port = htons(pnf_p7_port); + node->remote_addr.sin_addr.s_addr = inet_addr(pnf_p7_addr); + + vnf_p7_connection_info_list_add(vnf_p7, node); + + return 0; +} + +int nfapi_vnf_p7_del_pnf(nfapi_vnf_p7_config_t* config, int phy_id) +{ + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(phy_id:%d)\n", __FUNCTION__, phy_id); + + if(config == 0) + return -1; + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + + nfapi_vnf_p7_connection_info_t* to_delete = vnf_p7_connection_info_list_delete(vnf_p7, phy_id); + + if(to_delete) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(phy_id:%d) deleting connection info\n", __FUNCTION__, phy_id); + free(to_delete); + } + + return 0; +} +int nfapi_vnf_p7_dl_config_req(nfapi_vnf_p7_config_t* config, nfapi_dl_config_request_t* req) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p req:%p)\n", __FUNCTION__, config, req); + + if(config == 0 || req == 0) + return -1; + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + return vnf_p7_pack_and_send_p7_msg(vnf_p7, &req->header); +} + +int nfapi_vnf_p7_ul_config_req(nfapi_vnf_p7_config_t* config, nfapi_ul_config_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + return vnf_p7_pack_and_send_p7_msg(vnf_p7, &req->header); +} +int nfapi_vnf_p7_hi_dci0_req(nfapi_vnf_p7_config_t* config, nfapi_hi_dci0_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + return vnf_p7_pack_and_send_p7_msg(vnf_p7, &req->header); +} +int nfapi_vnf_p7_tx_req(nfapi_vnf_p7_config_t* config, nfapi_tx_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + return vnf_p7_pack_and_send_p7_msg(vnf_p7, &req->header); +} +int nfapi_vnf_p7_lbt_dl_config_req(nfapi_vnf_p7_config_t* config, nfapi_lbt_dl_config_request_t* req) +{ + if(config == 0 || req == 0) + return -1; + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + return vnf_p7_pack_and_send_p7_msg(vnf_p7, &req->header); +} +int nfapi_vnf_p7_vendor_extension(nfapi_vnf_p7_config_t* config, nfapi_p7_message_header_t* header) +{ + if(config == 0 || header == 0) + return -1; + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + return vnf_p7_pack_and_send_p7_msg(vnf_p7, header); +} + + +int nfapi_vnf_p7_release_msg(nfapi_vnf_p7_config_t* config, nfapi_p7_message_header_t* header) +{ + if(config == 0 || header == 0) + return -1; + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + vnf_p7_release_msg(vnf_p7, header); + + return 0; + +} + +int nfapi_vnf_p7_release_pdu(nfapi_vnf_p7_config_t* config, void* pdu) +{ + if(config == 0 || pdu == 0) + return -1; + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + vnf_p7_release_pdu(vnf_p7, pdu); + + return 0; +} diff --git a/nfapi/open-nFAPI/vnf/tests/Makefile.am b/nfapi/open-nFAPI/vnf/tests/Makefile.am new file mode 100644 index 0000000000..0c8163102c --- /dev/null +++ b/nfapi/open-nFAPI/vnf/tests/Makefile.am @@ -0,0 +1,30 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +#vnf unit test +#AUTOMAKE_OPTIONS=subdir-objects + +AM_CPPFLAGS = -I$(top_srcdir)/nfapi/inc -I$(top_srcdir)/nfapi/public_inc -I$(top_srcdir)/common/public_inc -I$(top_srcdir)/vnf/public_inc $(CFLAGS_CUNIT) -Wall -Werror + +check_PROGRAMS= test_vnf + +test_vnf_SOURCES = vnf_cunit_main.c ../..//common/src/debug.c +test_vnf_LDADD=$(top_builddir)/vnf/libnfapi_vnf.a $(top_builddir)/nfapi/libnfapi.a -L$(libdir) -lpthread -lrt -lsctp -lz -lcunit + +LOG_DRIVER = $(top_srcdir)/tap-driver.sh +TESTS=test_vnf +EXTRA_DIST = $(TESTS) + diff --git a/nfapi/open-nFAPI/vnf/tests/vnf_cunit_main.c b/nfapi/open-nFAPI/vnf/tests/vnf_cunit_main.c new file mode 100644 index 0000000000..4df5da7c26 --- /dev/null +++ b/nfapi/open-nFAPI/vnf/tests/vnf_cunit_main.c @@ -0,0 +1,1497 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "CUnit.h" +#include "Basic.h" +#include "Automated.h" +//#include "CUnit/Console.h" + +#include "nfapi_interface.h" +#include "nfapi_vnf_interface.h" +#include "nfapi.h" +#include // for printf +#include +#include +#include +#include +#include +#include +#include +#include "debug.h" +#include +#include + +/* Test Suite setup and cleanup functions: */ + +int init_suite(void) { return 0; } +int clean_suite(void) { return 0; } + +#define MAX_PACKED_MESSAGE_SIZE 8192 + +#define SFNSF2SFN(_sfnsf) ((_sfnsf) >> 4) +#define SFNSF2SF(_sfnsf) ((_sfnsf) & 0xF) + +typedef struct +{ + uint8_t enabled; + uint8_t started; + uint16_t phy_id; + + int p7_rx_port; + char* p7_rx_addr; + + struct sockaddr_in p7_rx_sockaddr; + int p7_rx_sock; + + struct sockaddr_in p7_tx_sockaddr; + int p7_tx_sock; +} pnf_test_config_phy_t; + +typedef struct +{ + uint8_t enabled; + + char* vnf_p5_addr; + int vnf_p5_port; + + struct sockaddr_in p5_tx_sockaddr; + int p5_sock; + + int p7_rx_port_base; + + pnf_test_config_phy_t phys[4]; + +} pnf_test_config_t; + +pnf_test_config_t pnf_test_config[5]; + +typedef struct +{ + uint8_t enabled; + uint8_t state; + uint16_t p5_idx; + uint16_t phy_id; + + uint8_t vnf_idx; + //struct sockaddr_in p7_rx_sockaddr; + struct sockaddr_in p7_tx_sockaddr; + +} vnf_test_config_phy_t; + +typedef struct +{ + uint8_t enabled; + pthread_t thread; + + char* vnf_p7_addr; + int vnf_p7_port; + + struct sockaddr_in p7_rx_sockaddr; + + nfapi_vnf_p7_config_t* config; + + uint8_t max_phys; + uint8_t phy_count; + //uint8_t phy_ids[4]; + +} vnf_test_config_vnf_t; + +typedef struct +{ + char* p5_addr; + int p5_port; + + pthread_t thread; + + vnf_test_config_vnf_t vnfs[2]; + + uint8_t phy_count; + vnf_test_config_phy_t phys[5]; + + nfapi_vnf_config_t* p5_vnf_config; + +} vnf_test_config_t; + +vnf_test_config_t vnf_test_config[5]; + +void reset_test_configs() +{ + memset(&pnf_test_config, 0, sizeof(pnf_test_config)); + memset(&vnf_test_config, 0, sizeof(vnf_test_config)); +} + +void pnf_create_p5_sock(pnf_test_config_t* config) +{ + config->p5_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); + + config->p5_tx_sockaddr.sin_family = AF_INET; + config->p5_tx_sockaddr.sin_port = htons(config->vnf_p5_port); + config->p5_tx_sockaddr.sin_addr.s_addr = inet_addr(config->vnf_p5_addr); +} + +void pnf_p5_connect(pnf_test_config_t* config) +{ + int connect_result = connect(config->p5_sock, (struct sockaddr *)&config->p5_tx_sockaddr, sizeof(config->p5_tx_sockaddr) ); + + printf("connect_result %d %d\n", connect_result, errno); +} + +pnf_test_config_phy_t* find_pnf_phy_config(pnf_test_config_t* config, uint16_t phy_id) +{ + int i = 0; + for(i = 0; i < 4; ++i) + { + if(config->phys[i].phy_id == phy_id) + return &(config->phys[i]); + } + + return 0; +} + +vnf_test_config_phy_t* find_vnf_phy_config(vnf_test_config_t* config, uint16_t phy_id) +{ + int i = 0; + for(i = 0; i < 4; ++i) + { + if(config->phys[i].phy_id == phy_id) + return &(config->phys[i]); + } + + return 0; +} + + + + +/************* Test case functions ****************/ + + +void vnf_test_start_no_config(void) +{ + int result = nfapi_vnf_start(0); + CU_ASSERT_EQUAL(result, -1); +} + +void* vnf_test_start_thread(void* ptr) +{ + int result = nfapi_vnf_start((nfapi_vnf_config_t*)ptr); + return (void*)(intptr_t)result; +} + +int pnf_connection_indication_called = 0; +int pnf_connection_indication(nfapi_vnf_config_t* config, int p5_idx) +{ + printf("[VNF] pnf_connection_indication p5_idx:%d\n", p5_idx); + pnf_connection_indication_called++; + + nfapi_pnf_param_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PNF_PARAM_REQUEST; + req.header.message_length = 0; + + nfapi_vnf_pnf_param_req(config, p5_idx, &req); + + return 1; +} + +int pnf_disconnect_indication(nfapi_vnf_config_t* config, int p5_idx) +{ + printf("[VNF] pnf_disconnect_indication p5_idx:%d\n", p5_idx); + pnf_connection_indication_called++; + + vnf_test_config_t* test_config = (vnf_test_config_t*)(config->user_data); + printf("[VNF] pnf_disconnect_indication user_data %p\n", config->user_data); + + int i = 0; + for(i = 0; i < test_config->phy_count; ++i) + { + vnf_test_config_phy_t* phy = &test_config->phys[i]; + vnf_test_config_vnf_t* vnf = &test_config->vnfs[phy->p5_idx]; + + // need to send stop request/response + + nfapi_vnf_p7_del_pnf((vnf->config), phy->phy_id); + vnf->phy_count--; + } + + + for(i = 0; i < 2; ++i) + { + vnf_test_config_vnf_t* vnf = &test_config->vnfs[i]; + printf("[VNF] pnf_disconnect_indication phy_count:%d\n", vnf->phy_count); + if(vnf->enabled == 1) + { + nfapi_vnf_p7_stop(vnf->config); + //vnf->config->terminate = 1; + + int* result; + printf("[VNF] waiting for vnf p7 thread to exit\n"); + pthread_join((vnf->thread), (void**)&result); + CU_ASSERT_EQUAL(result, 0); + + vnf->enabled = 0; + } + } + + return 1; +} + +int send_p5_message(int p5Sock, nfapi_p4_p5_message_header_t* msg, unsigned msg_size, struct sockaddr_in* addr, socklen_t addr_size) +{ + char buffer[256]; + int encoded_size = nfapi_p5_message_pack(msg, msg_size, buffer, sizeof(buffer), 0); + int result = sendto(p5Sock, buffer, encoded_size, 0, (struct sockaddr*)addr, addr_size); + (void)result; + return 0; +} + +int recv_p5_message(int p5Sock, nfapi_p4_p5_message_header_t* msg, unsigned msg_size) +{ + struct sockaddr_in addr2; + socklen_t addr2len; + char buffer2[256]; + int result2 = recvfrom(p5Sock, buffer2, sizeof(buffer2), 0, (struct sockaddr*)&addr2, &addr2len); + + int unpack_result = nfapi_p5_message_unpack(buffer2, result2, msg, msg_size, 0); //, sizeof(resp)); + (void)unpack_result; + return 0; +} + +int send_pnf_param_response(pnf_test_config_t* config) //int p5Sock, struct sockaddr_in* addr, socklen_t addr_size) +{ + nfapi_pnf_param_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_PARAM_RESPONSE; + + resp.header.message_length = 0; + resp.error_code = NFAPI_MSG_OK; + + //send_p5_message(p5Sock, &resp, sizeof(resp), addr, addr_size); + send_p5_message(config->p5_sock, &resp.header, sizeof(resp), &(config->p5_tx_sockaddr), sizeof(config->p5_tx_sockaddr)); + return 0; +} + +int create_p7_rx_socket(const char* addr, int port) +{ + int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + + struct sockaddr_in sock_addr; + sock_addr.sin_family = AF_INET; + sock_addr.sin_port = htons(port); + + if(addr == 0) + sock_addr.sin_addr.s_addr = INADDR_ANY; + else + sock_addr.sin_addr.s_addr = inet_addr(addr); + + int bind_result = bind(fd, (struct sockaddr*)&sock_addr, sizeof(sock_addr)); + if(bind_result != 0) + { + printf("Failed to bind p7 rx socket %d(%d) to %s:%d\n", bind_result, errno, addr, port); + } + + + return fd; +} + +int create_p7_tx_socket() +{ + int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + return fd; +} + +int send_param_response(pnf_test_config_t* config, uint16_t phy_id) +{ + nfapi_param_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PARAM_RESPONSE; + resp.header.phy_id = phy_id; + + pnf_test_config_phy_t* phy = find_pnf_phy_config(config, phy_id); + + resp.error_code = NFAPI_MSG_OK; + + resp.nfapi_config.p7_pnf_port.tl.tag = NFAPI_NFAPI_P7_PNF_PORT_TAG; + resp.nfapi_config.p7_pnf_port.value = phy->p7_rx_port; + + struct sockaddr_in pnf_p7_sockaddr; + pnf_p7_sockaddr.sin_addr.s_addr = inet_addr(phy->p7_rx_addr); + + resp.nfapi_config.p7_pnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG; + memcpy(&resp.nfapi_config.p7_pnf_address_ipv4.address[0], &pnf_p7_sockaddr.sin_addr.s_addr, 4); + + send_p5_message(config->p5_sock, &resp.header, sizeof(resp), &(config->p5_tx_sockaddr), sizeof(config->p5_tx_sockaddr)); + return 0; +} + +int receive_pnf_param_request(pnf_test_config_t* config) +{ + nfapi_pnf_param_request_t req; + recv_p5_message(config->p5_sock, &req.header, sizeof(req)); + + CU_ASSERT_EQUAL(req.header.message_id, NFAPI_PNF_PARAM_REQUEST); + if(req.header.message_id == NFAPI_PNF_PARAM_REQUEST) + { + printf("[PNF] nfapi_pnf_param_request\n"); + } + return 0; +} + +int receive_param_request(pnf_test_config_t* config) +{ + nfapi_param_request_t req; + recv_p5_message(config->p5_sock, &req.header, sizeof(req)); + + CU_ASSERT_EQUAL(req.header.message_id, NFAPI_PARAM_REQUEST); + if(req.header.message_id == NFAPI_PARAM_REQUEST) + { + printf("[PNF] nfapi_param_request phy_id:%d\n", req.header.phy_id); + } + else + { + printf("[PNF] ERROR, unexpected message %d phy_id:%d\n", req.header.message_id, req.header.phy_id); + } + return req.header.phy_id; +} + +int send_pnf_config_response(pnf_test_config_t* config) +{ + nfapi_pnf_config_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_CONFIG_RESPONSE; + resp.header.message_length = 0; + resp.error_code = NFAPI_MSG_OK; + + send_p5_message(config->p5_sock, &resp.header, sizeof(resp), &(config->p5_tx_sockaddr), sizeof(config->p5_tx_sockaddr)); + return 0; +} + +int send_config_response(pnf_test_config_t* config, uint16_t phy_id) +{ + nfapi_config_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_CONFIG_RESPONSE; + resp.header.message_length = 0; + resp.header.phy_id = phy_id; + resp.error_code = NFAPI_MSG_OK; + + send_p5_message(config->p5_sock, &resp.header, sizeof(resp), &(config->p5_tx_sockaddr), sizeof(config->p5_tx_sockaddr)); + return 0; +} + + +int receive_pnf_config_request(pnf_test_config_t* config) +{ + nfapi_pnf_config_request_t req; + recv_p5_message(config->p5_sock, &req.header, sizeof(req)); + + CU_ASSERT_EQUAL(req.header.message_id, NFAPI_PNF_CONFIG_REQUEST); + if(req.header.message_id == NFAPI_PNF_CONFIG_REQUEST) + { + printf("decoded nfapi_pnf_config_request\n"); + + int i = 0; + for(i = 0; i < req.pnf_phy_rf_config.number_phy_rf_config_info; ++i) + { + nfapi_phy_rf_config_info_t* info = &(req.pnf_phy_rf_config.phy_rf_config[i]); + printf("adding pnf phy %d id %d\n", i, info->phy_id); + + config->phys[i].enabled = 1; + config->phys[i].phy_id = info->phy_id; + } + } + return 0; +} + +int receive_config_request(pnf_test_config_t* config) +{ + nfapi_config_request_t req; + recv_p5_message(config->p5_sock, &req.header, sizeof(req)); + + CU_ASSERT_EQUAL(req.header.message_id, NFAPI_CONFIG_REQUEST); + if(req.header.message_id == NFAPI_CONFIG_REQUEST) + { + printf("[PNF] nfapi_config_request phy_id:%d\n", req.header.phy_id); + + pnf_test_config_phy_t* phy = find_pnf_phy_config(config, req.header.phy_id); + + // todo verify that this is the same as a vnf config? + phy->p7_tx_sockaddr.sin_family = AF_INET; + phy->p7_tx_sockaddr.sin_port = htons(req.nfapi_config.p7_vnf_port.value); + memcpy(&phy->p7_tx_sockaddr.sin_addr.s_addr, &req.nfapi_config.p7_vnf_address_ipv4.address, 4); + phy->p7_tx_sock = create_p7_tx_socket(); + + + printf("[PNF] vnf p7 address %s:%d\n", inet_ntoa(phy->p7_tx_sockaddr.sin_addr), ntohs(phy->p7_tx_sockaddr.sin_port)); + + return req.header.phy_id; + } + + return NFAPI_PHY_ID_NA; +} + +int send_pnf_start_response(pnf_test_config_t* config) +{ + nfapi_pnf_start_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_START_RESPONSE; + resp.header.message_length = 0; + resp.error_code = NFAPI_MSG_OK; + + send_p5_message(config->p5_sock, &resp.header, sizeof(resp), &(config->p5_tx_sockaddr), sizeof(config->p5_tx_sockaddr)); + return 0; +} + +int send_start_response(pnf_test_config_t* config, uint16_t phy_id) +{ + nfapi_start_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_START_RESPONSE; + resp.header.message_length = 0; + resp.header.phy_id = phy_id; + resp.error_code = NFAPI_MSG_OK; + + send_p5_message(config->p5_sock, &resp.header, sizeof(resp), &(config->p5_tx_sockaddr), sizeof(config->p5_tx_sockaddr)); + return 0; +} + +int receive_pnf_start_request(pnf_test_config_t* config) +{ + nfapi_pnf_start_request_t req; + recv_p5_message(config->p5_sock, &req.header, sizeof(req)); + + CU_ASSERT_EQUAL(req.header.message_id, NFAPI_PNF_START_REQUEST); + if(req.header.message_id == NFAPI_PNF_START_REQUEST) + { + printf("decoded nfapi_pnf_start_request\n"); + + int phy_idx = 0; + for(phy_idx = 0; phy_idx < 4; ++phy_idx) + { + if(config->phys[phy_idx].enabled) + { + pnf_test_config_phy_t* phy = &(config->phys[phy_idx]); + phy->p7_rx_port = config->p7_rx_port_base + phy_idx; + phy->p7_rx_addr = "127.0.0.1"; + } + } + } + return 0; +} + +int receive_start_request(pnf_test_config_t* config) +{ + nfapi_start_request_t req; + recv_p5_message(config->p5_sock, &req.header, sizeof(req)); + + CU_ASSERT_EQUAL(req.header.message_id, NFAPI_START_REQUEST); + if(req.header.message_id == NFAPI_START_REQUEST) + { + printf("[PNF] nfapi_start_request\n"); + + pnf_test_config_phy_t* phy = find_pnf_phy_config(config, req.header.phy_id); + printf("[PNF] creating p7 rx socket %s:%d\n", phy->p7_rx_addr, phy->p7_rx_port); + phy->p7_rx_sock = create_p7_rx_socket(phy->p7_rx_addr, phy->p7_rx_port); + phy->started = 1; + + } + + return req.header.phy_id; +} + +int send_pnf_stop_response(pnf_test_config_t* config, uint16_t phy_id) +{ + printf("pnf_stop_response\n"); + nfapi_pnf_stop_response_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_PNF_STOP_RESPONSE; + resp.header.message_length = 0; + resp.error_code = NFAPI_MSG_OK; + + send_p5_message(config->p5_sock, &resp.header, sizeof(resp), &(config->p5_tx_sockaddr), sizeof(config->p5_tx_sockaddr)); + return 0; +} + +int receive_pnf_stop_request(pnf_test_config_t* config) +{ + printf("pnf_stop_request\n"); + nfapi_pnf_stop_request_t req; + recv_p5_message(config->p5_sock, &req.header, sizeof(req)); + + CU_ASSERT_EQUAL(req.header.message_id, NFAPI_PNF_STOP_REQUEST); + if(req.header.message_id == NFAPI_PNF_STOP_REQUEST) + { + printf("decoded nfapi_pnf_stop_request\n"); + } + return 0; +} +int pnf_param_response(nfapi_vnf_config_t* config, int p5_idx,nfapi_pnf_param_response_t* response) +{ + printf("[VNF] pnf_param_response p5_idx:%d\n", p5_idx); + CU_ASSERT_EQUAL(response->error_code, NFAPI_MSG_OK); + + uint16_t phy_id; + nfapi_vnf_allocate_phy(config, p5_idx, &phy_id); + + nfapi_pnf_config_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PNF_CONFIG_REQUEST; + req.header.message_length = 0; + req.header.phy_id = NFAPI_PHY_ID_NA; + + req.pnf_phy_rf_config.tl.tag = NFAPI_PNF_PHY_RF_TAG; + req.pnf_phy_rf_config.number_phy_rf_config_info = 2; + nfapi_vnf_allocate_phy(config, p5_idx, &req.pnf_phy_rf_config.phy_rf_config[0].phy_id); + nfapi_vnf_allocate_phy(config, p5_idx, &req.pnf_phy_rf_config.phy_rf_config[1].phy_id); + + uint16_t i = vnf_test_config[0].phy_count; + + vnf_test_config[0].phys[i].enabled = 1; + vnf_test_config[0].phys[i].p5_idx = p5_idx; + vnf_test_config[0].phys[i].phy_id = req.pnf_phy_rf_config.phy_rf_config[0].phy_id; + + i++; + + vnf_test_config[0].phys[i].enabled = 1; + vnf_test_config[0].phys[i].p5_idx = p5_idx; + vnf_test_config[0].phys[i].phy_id = req.pnf_phy_rf_config.phy_rf_config[1].phy_id; + + i++; + + vnf_test_config[0].phy_count = i; + + nfapi_vnf_pnf_config_req(config, p5_idx, &req); + + return 0; +} + +int pnf_config_response(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_config_response_t* response) +{ + printf("pnf_config_response\n"); + CU_ASSERT_EQUAL(response->error_code, NFAPI_MSG_OK); + + nfapi_pnf_start_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PNF_START_REQUEST; + req.header.message_length = 0; + req.header.phy_id = response->header.phy_id; + + nfapi_vnf_pnf_start_req(config, p5_idx, &req); + + return 0; +} + + +void* vnf_test_start_p7_thread(void* ptr) +{ + int result = nfapi_vnf_p7_start((nfapi_vnf_p7_config_t*)ptr); + (void)result; + return 0; +} + +int test_subframe_indication(nfapi_vnf_p7_config_t* config, uint16_t phy_id, uint16_t sfn_sf) +{ + //printf("[VNF:%d] (%d:%d) SUBFRAME_IND\n", phy_id, SFNSF2SFN(sfn_sf), SFNSF2SF(sfn_sf)); + + nfapi_dl_config_request_t dl_config_req; + memset(&dl_config_req, 0, sizeof(dl_config_req)); + dl_config_req.header.message_id = NFAPI_DL_CONFIG_REQUEST; + dl_config_req.header.phy_id = phy_id; + dl_config_req.sfn_sf = sfn_sf; + nfapi_vnf_p7_dl_config_req(config, &dl_config_req); + + nfapi_ul_config_request_t ul_config_req; + memset(&ul_config_req, 0, sizeof(ul_config_req)); + ul_config_req.header.message_id = NFAPI_UL_CONFIG_REQUEST; + ul_config_req.header.phy_id = phy_id; + ul_config_req.sfn_sf = sfn_sf; + nfapi_vnf_p7_ul_config_req(config, &ul_config_req); + + nfapi_hi_dci0_request_t hi_dci0_req; + memset(&hi_dci0_req, 0, sizeof(hi_dci0_req)); + hi_dci0_req.header.message_id = NFAPI_HI_DCI0_REQUEST; + hi_dci0_req.header.phy_id = phy_id; + hi_dci0_req.sfn_sf = sfn_sf; + nfapi_vnf_p7_hi_dci0_req(config, &hi_dci0_req); + + + nfapi_tx_request_t tx_req; + memset(&tx_req, 0, sizeof(tx_req)); + tx_req.header.message_id = NFAPI_TX_REQUEST; + tx_req.header.phy_id = phy_id; + tx_req.sfn_sf = sfn_sf; + nfapi_vnf_p7_tx_req(config, &tx_req); + return 0; +} + +int test_harq_indication(nfapi_vnf_p7_config_t* config, nfapi_harq_indication_t* ind) +{ + //printf("[VNF:%d] (%d:%d) HARQ_IND\n", ind->header.phy_id, SFNSF2SFN(ind->sfn_sf), SFNSF2SF(ind->sfn_sf)); + return 0; +} + +int test_nb_harq_indication(nfapi_vnf_p7_config_t* config, nfapi_nb_harq_indication_t* ind) +{ + //printf("[VNF:%d] (%d:%d) HARQ_IND\n", ind->header.phy_id, SFNSF2SFN(ind->sfn_sf), SFNSF2SF(ind->sfn_sf)); + return 0; +} + + +int test_crc_indication(nfapi_vnf_p7_config_t* config, nfapi_crc_indication_t* ind) +{ + //printf("[VNF:%d] (%d:%d) CRC_IND\n", ind->header.phy_id, SFNSF2SFN(ind->sfn_sf), SFNSF2SF(ind->sfn_sf)); + return 0; +} +int test_rx_indication(nfapi_vnf_p7_config_t* config, nfapi_rx_indication_t* ind) +{ + //printf("[VNF:%d] (%d:%d) RX_IND\n", ind->header.phy_id, SFNSF2SFN(ind->sfn_sf), SFNSF2SF(ind->sfn_sf)); + return 0; +} +int test_rach_indication(nfapi_vnf_p7_config_t* config, nfapi_rach_indication_t* ind) +{ + //printf("[VNF:%d] (%d:%d) RACH_IND\n", ind->header.phy_id, SFNSF2SFN(ind->sfn_sf), SFNSF2SF(ind->sfn_sf)); + return 0; +} +int test_nrach_indication(nfapi_vnf_p7_config_t* config, nfapi_nrach_indication_t* ind) +{ + //printf("[VNF:%d] (%d:%d) RACH_IND\n", ind->header.phy_id, SFNSF2SFN(ind->sfn_sf), SFNSF2SF(ind->sfn_sf)); + return 0; +} +int test_srs_indication(nfapi_vnf_p7_config_t* config, nfapi_srs_indication_t* ind) +{ + //printf("[VNF:%d] (%d:%d) SRS_IND\n", ind->header.phy_id, SFNSF2SFN(ind->sfn_sf), SFNSF2SF(ind->sfn_sf)); + return 0; +} +int test_sr_indication(nfapi_vnf_p7_config_t* config, nfapi_sr_indication_t* ind) +{ + //printf("[VNF:%d] (%d:%d) SR_IND\n", ind->header.phy_id, SFNSF2SFN(ind->sfn_sf), SFNSF2SF(ind->sfn_sf)); + return 0; +} +int test_cqi_indication(nfapi_vnf_p7_config_t* config, nfapi_cqi_indication_t* ind) +{ + //printf("[VNF:%d] (%d:%d) CQI_IND\n", ind->header.phy_id, SFNSF2SFN(ind->sfn_sf), SFNSF2SF(ind->sfn_sf)); + return 0; +} + +int pnf_start_response(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_start_response_t* response) +{ + printf("[VNF] pnf_start_response p5_idx:%d\n", p5_idx); + CU_ASSERT_EQUAL(response->error_code, NFAPI_MSG_OK); + + return 0; +} + +int pnf_stop_response(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_stop_response_t* response) +{ + printf("pnf_stop_response\n"); + CU_ASSERT_EQUAL(response->error_code, NFAPI_MSG_OK); + + nfapi_vnf_p7_stop(vnf_test_config[0].vnfs[0].config); + return 0; +} + +int param_response(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_response_t* response) +{ + printf("[VNF] param_response p5_idx:%d phy_id:%d\n", p5_idx, response->header.phy_id); + CU_ASSERT_EQUAL(response->error_code, NFAPI_MSG_OK); + + struct sockaddr_in addr; + memcpy(&addr.sin_addr.s_addr, &response->nfapi_config.p7_pnf_address_ipv4.address, 4); + printf("[VNF] param_response pnf p7 %s:%d\n", inet_ntoa(addr.sin_addr), response->nfapi_config.p7_pnf_port.value); + + // find the vnf phy configuration + vnf_test_config_phy_t* phy = find_vnf_phy_config(&(vnf_test_config[0]), response->header.phy_id); + + // save the pnf p7 connection information + phy->p7_tx_sockaddr.sin_port = response->nfapi_config.p7_pnf_port.value; + memcpy(&phy->p7_tx_sockaddr.sin_addr.s_addr, &response->nfapi_config.p7_pnf_address_ipv4.address, 4); + + nfapi_config_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_CONFIG_REQUEST; + req.header.phy_id = response->header.phy_id; + + vnf_test_config_vnf_t* vnf = &(vnf_test_config[0].vnfs[phy->vnf_idx]); + req.nfapi_config.p7_vnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG; + memcpy(&req.nfapi_config.p7_vnf_address_ipv4.address, &vnf->p7_rx_sockaddr.sin_addr.s_addr, 4); + + req.nfapi_config.p7_vnf_port.tl.tag = NFAPI_NFAPI_P7_VNF_PORT_TAG; + req.nfapi_config.p7_vnf_port.value = vnf->p7_rx_sockaddr.sin_port; + + nfapi_vnf_config_req(config, p5_idx, &req); + return 0; +} + +int config_response(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_response_t* response) +{ + printf("[VNF] config_response p5_idx:%d phy_id:%d\n", p5_idx, response->header.phy_id); + return 0; + CU_ASSERT_EQUAL(response->error_code, NFAPI_MSG_OK); + +} + +int send_vnf_start_req(vnf_test_config_t* config, vnf_test_config_phy_t* phy) +{ + nfapi_start_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_START_REQUEST; + req.header.phy_id = phy->phy_id; + + nfapi_vnf_start_req(config->p5_vnf_config, phy->p5_idx, &req); + return 0; +} + +int start_response(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_response_t* response) +{ + printf("[VNF] start_response p5_idx:%d phy_id:%d\n", p5_idx, response->header.phy_id); + CU_ASSERT_EQUAL(response->error_code, NFAPI_MSG_OK); + + sleep(1); + + vnf_test_config_phy_t* phy = find_vnf_phy_config(&(vnf_test_config[0]), response->header.phy_id); + + char* addr = inet_ntoa(phy->p7_tx_sockaddr.sin_addr); + int port = phy->p7_tx_sockaddr.sin_port; + + vnf_test_config_vnf_t* vnf = &(vnf_test_config[0].vnfs[phy->vnf_idx]); + + nfapi_vnf_p7_add_pnf(vnf->config, addr, port, response->header.phy_id); + return 0; +} + +int stop_response(nfapi_vnf_config_t* config, int p5_idx, nfapi_stop_response_t* response) +{ + printf("stop_response p5_idx:%d phy_id:%d\n", p5_idx, response->header.phy_id); + CU_ASSERT_EQUAL(response->error_code, NFAPI_MSG_OK); + return 0; +} + +void start_vnf_p5(vnf_test_config_t* test_config) +{ + test_config->p5_vnf_config = nfapi_vnf_config_create(); + + test_config->p5_vnf_config->vnf_p5_port = test_config->p5_port; + test_config->p5_vnf_config->vnf_ipv4 = 1; + test_config->p5_vnf_config->pnf_connection_indication = &pnf_connection_indication; + test_config->p5_vnf_config->pnf_disconnect_indication = &pnf_disconnect_indication; + test_config->p5_vnf_config->pnf_param_resp = &pnf_param_response; + test_config->p5_vnf_config->pnf_config_resp = &pnf_config_response; + test_config->p5_vnf_config->pnf_start_resp = &pnf_start_response; + test_config->p5_vnf_config->pnf_stop_resp = &pnf_stop_response; + test_config->p5_vnf_config->param_resp = ¶m_response; + test_config->p5_vnf_config->config_resp = &config_response; + test_config->p5_vnf_config->start_resp = &start_response; + test_config->p5_vnf_config->stop_resp = &stop_response; + + test_config->p5_vnf_config->user_data = test_config; + + pthread_create(&test_config->thread, NULL, &vnf_test_start_thread, test_config->p5_vnf_config); + + sleep(1); + +} + +void start_vnf_p7(vnf_test_config_vnf_t* vnf) +{ + + // todo : select which vnf to use for these phy's + vnf->enabled = 1; + + vnf->p7_rx_sockaddr.sin_addr.s_addr = inet_addr(vnf->vnf_p7_addr); + vnf->p7_rx_sockaddr.sin_port = vnf->vnf_p7_port; + + + vnf->config = nfapi_vnf_p7_config_create(); + vnf->config->checksum_enabled = 0; + vnf->config->port = vnf->vnf_p7_port; + vnf->config->subframe_indication = &test_subframe_indication; + vnf->config->harq_indication = &test_harq_indication; + vnf->config->crc_indication = &test_crc_indication; + vnf->config->rx_indication = &test_rx_indication; + vnf->config->rach_indication = &test_rach_indication; + vnf->config->srs_indication = &test_srs_indication; + vnf->config->sr_indication = &test_sr_indication; + vnf->config->cqi_indication = &test_cqi_indication; + + vnf->config->nb_harq_indication = &test_nb_harq_indication; + vnf->config->nrach_indication = &test_nrach_indication; + + + vnf->config->segment_size = 1400; + vnf->config->max_num_segments = 6; + + pthread_create(&(vnf->thread), NULL, &vnf_test_start_p7_thread, vnf->config); + + vnf->enabled = 1; + + //vnf->phy_count++; + + sleep(1); +} + +void send_p7_segmented_msg(int sock, char* msg, int len, int segment_size, struct sockaddr* addr, socklen_t addr_len) +{ + static uint8_t sequence_num = 0; + if(len < segment_size) + { + msg[7] = sequence_num; + sendto(sock, msg, len, 0, addr, addr_len); + } + else + { + int msg_body_len = len - 12 ; + int seg_body_len = segment_size - 12 ; + int segments = (msg_body_len / (seg_body_len)) + ((msg_body_len % seg_body_len) ? 1 : 0); + + //printf("sending segmented message len:%d seg_size:%d count:%d\n", len, segment_size, segments); + + int segment = 0; + int offset = 12; + for(segment = 0; segment < segments; ++segment) + { + uint8_t last = 0; + uint16_t size = segment_size - 12; + if(segment + 1 == segments) + { + last = 1; + size = (msg_body_len) - (seg_body_len * segment); + } + + char buffer[segment_size]; + + memcpy(&buffer[0], msg, 12); + buffer[6] = ((!last) << 7) + segment; + buffer[7] = sequence_num; + + // msg length + uint8_t* p = (uint8_t*)&buffer[4]; + push16(size + 12, &p, (uint8_t*)&buffer[size + 12]); + + memcpy(&buffer[12], msg + offset, size); + offset += size; + + sendto(sock, &buffer[0], size + 12, 0, addr, addr_len); + + } + + + } + + sequence_num++; +} + +void start_phy(vnf_test_config_phy_t* phy) +{ + + nfapi_param_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PARAM_REQUEST; + req.header.phy_id = phy->phy_id; + + nfapi_vnf_config_t* p5_vnf_config = (vnf_test_config[0].p5_vnf_config); + + + nfapi_vnf_param_req(p5_vnf_config, phy->p5_idx, &req); + +} + + +void vnf_test_start_connect(void) +{ + reset_test_configs(); + + int segment_size = 256; + + vnf_test_config[0].p5_addr = "127.0.0.1"; + vnf_test_config[0].p5_port = 4242; + + vnf_test_config[0].vnfs[0].enabled = 0; + vnf_test_config[0].vnfs[0].vnf_p7_addr = "127.0.0.1"; + vnf_test_config[0].vnfs[0].vnf_p7_port = 7878; + vnf_test_config[0].vnfs[0].max_phys = 1; + + vnf_test_config[0].vnfs[1].enabled = 0; + vnf_test_config[0].vnfs[1].vnf_p7_addr = "127.0.0.1"; + vnf_test_config[0].vnfs[1].vnf_p7_port = 7879; + vnf_test_config[0].vnfs[1].max_phys = 1; + + + // this is the action that p9 would take to set the vnf p5 address/port + pnf_test_config[0].enabled = 1; + pnf_test_config[0].vnf_p5_port = vnf_test_config[0].p5_port; + pnf_test_config[0].vnf_p5_addr = vnf_test_config[0].p5_addr; + pnf_test_config[0].p7_rx_port_base = 8000; + + pnf_test_config[1].enabled = 1; + pnf_test_config[1].vnf_p5_port = vnf_test_config[0].p5_port; + pnf_test_config[1].vnf_p5_addr = vnf_test_config[0].p5_addr; + pnf_test_config[1].p7_rx_port_base = 8100; + + pnf_connection_indication_called = 0; + + start_vnf_p5(&vnf_test_config[0]); + + + pnf_create_p5_sock(&pnf_test_config[0]); + pnf_p5_connect(&pnf_test_config[0]); + + receive_pnf_param_request(&pnf_test_config[0]); + send_pnf_param_response(&pnf_test_config[0]); + + receive_pnf_config_request(&pnf_test_config[0]); + send_pnf_config_response(&pnf_test_config[0]); + + receive_pnf_start_request(&pnf_test_config[0]); + send_pnf_start_response(&pnf_test_config[0]); + + pnf_create_p5_sock(&pnf_test_config[1]); + + pnf_p5_connect(&pnf_test_config[1]); + + receive_pnf_param_request(&pnf_test_config[1]); + send_pnf_param_response(&pnf_test_config[1]); + + receive_pnf_config_request(&pnf_test_config[1]); + send_pnf_config_response(&pnf_test_config[1]); + + receive_pnf_start_request(&pnf_test_config[1]); + send_pnf_start_response(&pnf_test_config[1]); + + // start the vnf_p7 thread and assign by phys to that instance + + start_vnf_p7(&vnf_test_config[0].vnfs[0]); + //start_vnf_p7(&vnf_test_config[0].vnfs[1]); + + printf("---- configuring phy %d -----\n", vnf_test_config[0].phys[0].phy_id); + vnf_test_config[0].phys[0].vnf_idx = 0; + start_phy(&vnf_test_config[0].phys[0]); + + int phy_id = receive_param_request(&pnf_test_config[0]); + send_param_response(&pnf_test_config[0], phy_id); + + phy_id = receive_config_request(&pnf_test_config[0]); + send_config_response(&pnf_test_config[0], phy_id); + + printf("---- configuring phy %d -----\n", vnf_test_config[0].phys[2].phy_id); + vnf_test_config[0].phys[2].vnf_idx = 0; + start_phy(&vnf_test_config[0].phys[2]); + + phy_id = receive_param_request(&pnf_test_config[1]); + send_param_response(&pnf_test_config[1], phy_id); + + phy_id = receive_config_request(&pnf_test_config[1]); + send_config_response(&pnf_test_config[1], phy_id); + + printf("---- configuring phy %d -----\n", vnf_test_config[0].phys[1].phy_id); + + vnf_test_config[0].phys[1].vnf_idx = 0; + start_phy(&vnf_test_config[0].phys[1]); + + phy_id = receive_param_request(&pnf_test_config[0]); + send_param_response(&pnf_test_config[0], phy_id); + + phy_id = receive_config_request(&pnf_test_config[0]); + send_config_response(&pnf_test_config[0], phy_id); + + //------------- + printf("---- starting phy %d -----\n", vnf_test_config[0].phys[0].phy_id); + + send_vnf_start_req(&vnf_test_config[0], &vnf_test_config[0].phys[0]); + phy_id = receive_start_request(&pnf_test_config[0]); + send_start_response(&pnf_test_config[0], phy_id); +/* + printf("---- starting phy %d -----\n", vnf_test_config[0].phys[2].phy_id); + + send_vnf_start_req(&vnf_test_config[0], &vnf_test_config[0].phys[2]); + phy_id = receive_start_request(&pnf_test_config[1]); + send_start_response(&pnf_test_config[1], phy_id); + + printf("---- starting phy %d -----\n", vnf_test_config[0].phys[1].phy_id); + + send_vnf_start_req(&vnf_test_config[0], &vnf_test_config[0].phys[1]); + phy_id = receive_start_request(&pnf_test_config[0]); + send_start_response(&pnf_test_config[0], phy_id); +*/ + //close(pnf_test_config[0].p5_sock); + + char buffer[2048]; + int buffer_size = sizeof(buffer); + + + fd_set rdfs; + int exit = 0; + while(exit != 1) + { + int pnf_idx, phy_idx; + int max_fd = 0; + FD_ZERO(&rdfs); + + for(pnf_idx = 0; pnf_idx < 4; ++pnf_idx) + { + if(pnf_test_config[pnf_idx].enabled) + { + FD_SET(pnf_test_config[pnf_idx].p5_sock, &rdfs); + if(pnf_test_config[pnf_idx].p5_sock > max_fd) + max_fd = pnf_test_config[pnf_idx].p5_sock; + } + + for(phy_idx = 0; phy_idx < 4; ++phy_idx) + { + pnf_test_config_phy_t* phy_info = &(pnf_test_config[pnf_idx].phys[phy_idx]); + + if(phy_info->started == 1 && phy_info->enabled == 1) + { + //////////////////printf("adding %d/%d %d %d\n", pnf_idx, phy_idx, phy_info->phy_id, phy_info->p7_rx_sock); + FD_SET(phy_info->p7_rx_sock, &rdfs); + if(phy_info->p7_rx_sock > max_fd) + max_fd = phy_info->p7_rx_sock; + } + } + } + + + // changed to select, + int select_result = select(max_fd + 1, &rdfs, NULL, NULL, NULL); + (void)select_result; + + for(pnf_idx = 0; pnf_idx < 4; ++pnf_idx) + { + if(pnf_test_config[pnf_idx].enabled) + { + //pnf_test_config_t* pnf_config = &(pnf_test_config[pnf_idx]); + } + + for(phy_idx = 0; phy_idx < 4; ++phy_idx) + { + pnf_test_config_phy_t* phy_info = &(pnf_test_config[pnf_idx].phys[phy_idx]); + + if(phy_info->enabled) + { + if(FD_ISSET(phy_info->p7_rx_sock, &rdfs)) + { + //struct sockaddr_in recv_addr; + //memset(&recv_addr, 0, sizeof(recv_addr)); + //socklen_t recv_addr_size; + int len = recvfrom(phy_info->p7_rx_sock, &buffer[0], buffer_size, 0, 0, 0);// (struct sockaddr*)&recv_addr, &recv_addr_size); + + if(len == -1) + { + printf("recvfrom %d failed %d\n", phy_info->p7_rx_sock, errno); + continue; + } + + nfapi_p7_message_header_t header; + nfapi_p7_message_header_unpack(buffer, len, &header, sizeof(header), 0); + + switch(header.message_id) + { + case NFAPI_DL_NODE_SYNC: + { + nfapi_dl_node_sync_t msg; + nfapi_p7_message_unpack(buffer, len, &msg, sizeof(msg), 0); + printf("[PNF:%d] NFAPI_DL_NODE_SYNC t1:%d\n", msg.header.phy_id, msg.t1); + + nfapi_ul_node_sync_t resp; + memset(&resp, 0, sizeof(resp)); + resp.header.message_id = NFAPI_UL_NODE_SYNC; + resp.header.phy_id = msg.header.phy_id; + resp.t1 = msg.t1; + usleep(50); + resp.t2 = msg.t1 + 50; // 50 us rx latency + resp.t3 = msg.t1 + 10; // 10 us pnf proc + + usleep(50); + + len = nfapi_p7_message_pack(&resp, buffer, buffer_size, 0); + // send ul node sycn + send_p7_segmented_msg(phy_info->p7_tx_sock, &buffer[0], len, segment_size, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + } + break; + case NFAPI_DL_CONFIG_REQUEST: + { + nfapi_dl_config_request_t msg; + nfapi_p7_message_unpack(buffer, len, &msg, sizeof(msg), 0); + //printf("[PNF:%d] (%d/%d) NFAPI_DL_CONFIG_REQUEST\n", header.phy_id, SFNSF2SFN(msg.sfn_sf), SFNSF2SF(msg.sfn_sf)); + + if(SFNSF2SFN(msg.sfn_sf) == 500) + exit = 1; + // simulate the uplink messages + + nfapi_harq_indication_t harq_ind; + memset(&harq_ind, 0, sizeof(harq_ind)); + harq_ind.header.message_id = NFAPI_HARQ_INDICATION; + harq_ind.header.phy_id = msg.header.phy_id; + harq_ind.sfn_sf = msg.sfn_sf; + harq_ind.harq_indication_body.tl.tag = NFAPI_HARQ_INDICATION_BODY_TAG; + harq_ind.harq_indication_body.number_of_harqs = 2; + + harq_ind.harq_indication_body.harq_pdu_list = (nfapi_harq_indication_pdu_t*)(malloc(sizeof(nfapi_harq_indication_pdu_t) * harq_ind.harq_indication_body.number_of_harqs)); + + int i = 0; + for(i = 0; i < harq_ind.harq_indication_body.number_of_harqs; ++i) + { + harq_ind.harq_indication_body.harq_pdu_list[i].rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + } + len = nfapi_p7_message_pack(&harq_ind, buffer, buffer_size, 0); + //sendto(phy_info->p7_tx_sock, &buffer[0], len, 0, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + send_p7_segmented_msg(phy_info->p7_tx_sock, &buffer[0], len, segment_size, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + + + + //sendto(phy_info->p7_tx_sock, &buffer[0], len, 0, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + + free(harq_ind.harq_indication_body.harq_pdu_list); + + nfapi_crc_indication_t crc_ind; + memset(&crc_ind, 0, sizeof(crc_ind)); + crc_ind.header.message_id = NFAPI_CRC_INDICATION; + crc_ind.header.phy_id = msg.header.phy_id; + crc_ind.sfn_sf = msg.sfn_sf; + len = nfapi_p7_message_pack(&crc_ind, buffer, buffer_size, 0); + send_p7_segmented_msg(phy_info->p7_tx_sock, &buffer[0], len, segment_size, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + + nfapi_sr_indication_t sr_ind; + memset(&sr_ind, 0, sizeof(sr_ind)); + sr_ind.header.message_id = NFAPI_RX_SR_INDICATION; + sr_ind.header.phy_id = msg.header.phy_id; + sr_ind.sfn_sf = msg.sfn_sf; + len = nfapi_p7_message_pack(&sr_ind, buffer, buffer_size, 0); + send_p7_segmented_msg(phy_info->p7_tx_sock, &buffer[0], len, segment_size, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + + nfapi_cqi_indication_t cqi_ind; + memset(&cqi_ind, 0, sizeof(cqi_ind)); + cqi_ind.header.message_id = NFAPI_RX_CQI_INDICATION; + cqi_ind.header.phy_id = msg.header.phy_id; + cqi_ind.sfn_sf = msg.sfn_sf; + len = nfapi_p7_message_pack(&cqi_ind, buffer, buffer_size, 0); + send_p7_segmented_msg(phy_info->p7_tx_sock, &buffer[0], len, segment_size, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + + nfapi_rach_indication_t rach_ind; + memset(&rach_ind, 0, sizeof(rach_ind)); + rach_ind.header.message_id = NFAPI_RACH_INDICATION; + rach_ind.header.phy_id = msg.header.phy_id; + rach_ind.sfn_sf = msg.sfn_sf; + len = nfapi_p7_message_pack(&rach_ind, buffer, buffer_size, 0); + send_p7_segmented_msg(phy_info->p7_tx_sock, &buffer[0], len, segment_size, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + + nfapi_srs_indication_t srs_ind; + memset(&srs_ind, 0, sizeof(srs_ind)); + srs_ind.header.message_id = NFAPI_SRS_INDICATION; + srs_ind.header.phy_id = msg.header.phy_id; + srs_ind.sfn_sf = msg.sfn_sf; + len = nfapi_p7_message_pack(&srs_ind, buffer, buffer_size, 0); + send_p7_segmented_msg(phy_info->p7_tx_sock, &buffer[0], len, segment_size, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + + nfapi_rx_indication_t rx_ind; + memset(&rx_ind, 0, sizeof(rx_ind)); + rx_ind.header.message_id = NFAPI_RX_ULSCH_INDICATION; + rx_ind.header.phy_id = msg.header.phy_id; + rx_ind.sfn_sf = msg.sfn_sf; + len = nfapi_p7_message_pack(&rx_ind, buffer, buffer_size, 0); + send_p7_segmented_msg(phy_info->p7_tx_sock, &buffer[0], len, segment_size, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + + if(msg.sfn_sf % 5 == 0) + { + // periodically send the timing info + nfapi_timing_info_t timing_info; + memset(&timing_info, 0, sizeof(timing_info)); + timing_info.header.message_id = NFAPI_TIMING_INFO; + timing_info.header.phy_id = msg.header.phy_id; + len = nfapi_p7_message_pack(&timing_info, buffer, buffer_size, 0); + send_p7_segmented_msg(phy_info->p7_tx_sock, &buffer[0], len, segment_size, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + } + + nfapi_nb_harq_indication_t nb_harq_ind; + memset(&nb_harq_ind, 0, sizeof(nb_harq_ind)); + nb_harq_ind.header.message_id = NFAPI_NB_HARQ_INDICATION; + nb_harq_ind.header.phy_id = msg.header.phy_id; + nb_harq_ind.sfn_sf = msg.sfn_sf; + len = nfapi_p7_message_pack(&nb_harq_ind, buffer, buffer_size, 0); + send_p7_segmented_msg(phy_info->p7_tx_sock, &buffer[0], len, segment_size, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + + nfapi_nrach_indication_t nrach_ind; + memset(&nrach_ind, 0, sizeof(nrach_ind)); + nrach_ind.header.message_id = NFAPI_NRACH_INDICATION; + nrach_ind.header.phy_id = msg.header.phy_id; + nrach_ind.sfn_sf = msg.sfn_sf; + len = nfapi_p7_message_pack(&nrach_ind, buffer, buffer_size, 0); + send_p7_segmented_msg(phy_info->p7_tx_sock, &buffer[0], len, segment_size, (struct sockaddr*)&phy_info->p7_tx_sockaddr, sizeof(phy_info->p7_tx_sockaddr)); + + } + break; + case NFAPI_UL_CONFIG_REQUEST: + { + nfapi_ul_config_request_t msg; + nfapi_p7_message_unpack(buffer, len, &msg, sizeof(msg), 0); + //printf("[PNF:%d] (%d/%d) NFAPI_UL_CONFIG_REQUEST\n", header.phy_id, SFNSF2SFN(msg.sfn_sf), SFNSF2SF(msg.sfn_sf)); + } + break; + case NFAPI_HI_DCI0_REQUEST: + { + nfapi_hi_dci0_request_t msg; + nfapi_p7_message_unpack(buffer, len, &msg, sizeof(msg), 0); + //printf("[PNF:%d] (%d/%d) NFAPI_HI_DCI0_REQUEST\n", header.phy_id, SFNSF2SFN(msg.sfn_sf), SFNSF2SF(msg.sfn_sf)); + } + break; + case NFAPI_TX_REQUEST: + { + nfapi_tx_request_t msg; + nfapi_p7_message_unpack(buffer, len, &msg, sizeof(msg), 0); + //printf("[PNF:%d] (%d/%d) NFAPI_TX_REQUEST\n", header.phy_id, SFNSF2SFN(msg.sfn_sf), SFNSF2SF(msg.sfn_sf)); + } + break; + } + + } + } + } + } + } + + printf("Triggering p5 shutdown\n"); + + // vnf p5 trigger shutdown + nfapi_pnf_stop_request_t stop_req; + memset(&stop_req, 0, sizeof(stop_req)); + stop_req.header.message_id = NFAPI_PNF_STOP_REQUEST; + nfapi_vnf_pnf_stop_req(vnf_test_config[0].p5_vnf_config, 0, &stop_req); + + phy_id = receive_pnf_stop_request(&pnf_test_config[0]); + send_pnf_stop_response(&pnf_test_config[0], phy_id); + + + nfapi_vnf_stop(vnf_test_config[0].p5_vnf_config); + + + + int* result; + pthread_join((vnf_test_config[0].thread), (void**)&result); + CU_ASSERT_EQUAL(result, 0); + //CU_ASSERT_EQUAL(pnf_connection_indication_called, 1); + + + close(pnf_test_config[0].p5_sock); +} + +void vnf_test_start_connect_ipv6(void) +{ + char* vnf_addr = "::1"; + int vnf_port = 4242; + pnf_connection_indication_called = 0; + + nfapi_vnf_config_t* config = nfapi_vnf_config_create(); + config->vnf_p5_port = vnf_port; + config->vnf_ipv4 = 0; + config->vnf_ipv6 = 1; + config->pnf_connection_indication = &pnf_connection_indication; + config->pnf_disconnect_indication = &pnf_disconnect_indication; + config->pnf_param_resp = &pnf_param_response; + config->pnf_config_resp = &pnf_config_response; + config->pnf_start_resp = &pnf_start_response; + + pthread_t thread; + pthread_create(&thread, NULL, &vnf_test_start_thread, config); + + sleep(1); + + + int p5Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); + + struct sockaddr_in6 addr; + addr.sin6_family = AF_INET6; + addr.sin6_port = htons(vnf_port); + //addr.sin6_addr = inet_addr(vnf_addr); + inet_pton(AF_INET6, vnf_addr, &addr.sin6_addr); + + + /* + int connect_result = connect(p5Sock, (struct sockaddr *)&addr, sizeof(addr) ); + + printf("connect_result %d %d\n", connect_result, errno); + + receive_pnf_param_request(p5Sock); + send_pnf_param_response(p5Sock, &addr, sizeof(addr)); + + receive_pnf_config_request(p5Sock); + send_pnf_config_response(p5Sock, &addr, sizeof(addr)); + + receive_pnf_start_request(p5Sock); + send_pnf_start_response(p5Sock, &addr, sizeof(addr)); + */ + sleep(4); + nfapi_vnf_stop(config); + + int* result; + pthread_join(thread, (void**)&result); + CU_ASSERT_EQUAL(result, 0); + CU_ASSERT_EQUAL(pnf_connection_indication_called, 1); + + + close(p5Sock); +} +void vnf_test_start_connect_2(void) +{ + char* vnf_addr = "127.0.0.1"; + int vnf_port = 4242; + pnf_connection_indication_called = 0; + + nfapi_vnf_config_t * config = nfapi_vnf_config_create(); + config->vnf_p5_port = vnf_port; + config->pnf_connection_indication = &pnf_connection_indication; + + pthread_t thread; + pthread_create(&thread, NULL, &vnf_test_start_thread, config); + + sleep(1); + + + + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(vnf_port); + addr.sin_addr.s_addr = inet_addr(vnf_addr); + + + int p5Sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); + + int connect_result_1 = connect(p5Sock1, (struct sockaddr *)&addr, sizeof(addr) ); + + printf("connect_result_1 %d %d\n", connect_result_1, errno); + + int p5Sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP); + + int connect_result_2 = connect(p5Sock2, (struct sockaddr *)&addr, sizeof(addr) ); + + printf("connect_result_2 %d %d\n", connect_result_2, errno); + + sleep(1); + + close(p5Sock1); + + sleep(1); + + close(p5Sock2); + + sleep(1); + + nfapi_vnf_stop(config); + + int* result; + pthread_join(thread, (void**)&result); + CU_ASSERT_EQUAL(result, 0); + CU_ASSERT_EQUAL(pnf_connection_indication_called, 2); + + + close(p5Sock1); + close(p5Sock2); +} + +void vnf_test_p7_segmentation_test1(void) +{ + +} + + +/************* Test Runner Code goes here **************/ + +int main ( void ) +{ + CU_pSuite pSuite = NULL; + + /* initialize the CUnit test registry */ + if ( CUE_SUCCESS != CU_initialize_registry() ) + return CU_get_error(); + + /* add a suite to the registry */ + pSuite = CU_add_suite( "vnf_test_suite", init_suite, clean_suite ); + if ( NULL == pSuite ) + { + CU_cleanup_registry(); + return CU_get_error(); + } + + //(NULL == CU_add_test(pSuite, "vnf_test_start_connect_2", vnf_test_start_connect_2)) + /* add the tests to the suite */ + if ( (NULL == CU_add_test(pSuite, "vnf_test_start_no_config", vnf_test_start_no_config)) || + (NULL == CU_add_test(pSuite, "vnf_test_start_connect", vnf_test_start_connect)) || + (NULL == CU_add_test(pSuite, "vnf_test_p7_segmentation_test1", vnf_test_p7_segmentation_test1)) + ) + { + CU_cleanup_registry(); + return CU_get_error(); + } + + // Run all tests using the basic interface + CU_basic_set_mode(CU_BRM_VERBOSE); + CU_set_output_filename("vnf_unit_test_results.xml"); + CU_basic_run_tests(); + + CU_pSuite s = CU_get_registry()->pSuite; + int count = 0; + while(s) + { + CU_pTest t = s->pTest; + while(t) + { + count++; + t = t->pNext; + } + s = s->pNext; + } + + printf("%d..%d\n", 1, count); + + + + s = CU_get_registry()->pSuite; + count = 1; + while(s) + { + CU_pTest t = s->pTest; + while(t) + { + int pass = 1; + CU_FailureRecord* failures = CU_get_failure_list(); + while(failures) + { + if(strcmp(failures->pSuite->pName, s->pName) == 0 && + strcmp(failures->pTest->pName, t->pName) == 0) + { + pass = 0; + failures = 0; + } + else + { + failures = failures->pNext; + } + } + + if(pass) + printf("ok %d - %s:%s\n", count, s->pName, t->pName); + else + printf("not ok %d - %s:%s\n", count, s->pName, t->pName); + + count++; + t = t->pNext; + } + s = s->pNext; + } + + CU_cleanup_registry(); + return CU_get_error(); + +} diff --git a/nfapi/open-nFAPI/vnf_sim/Makefile.am b/nfapi/open-nFAPI/vnf_sim/Makefile.am new file mode 100644 index 0000000000..c3e42cebf3 --- /dev/null +++ b/nfapi/open-nFAPI/vnf_sim/Makefile.am @@ -0,0 +1,22 @@ +# +# Copyright 2017 Cisco Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +AUTOMAKE_OPTIONS=subdir-objects +AM_CPPFLAGS = -I$(top_srcdir)/vnf_sim/inc -I$(top_srcdir)/sim_common/inc -I$(top_srcdir)/common/public_inc -I$(top_srcdir)/nfapi/inc -I$(top_srcdir)/nfapi/public_inc -I$(top_srcdir)/vnf/inc -I$(top_srcdir)/vnf/public_inc $(XML_CFLAGS) -Wall -Werror -g +AM_CXXFLAGS = -I$(top_srcidr)/vnf_sim/inc -I$(top_srcdir)/sim_common/inc -I$(top_srcdir)/common/public_inc -I$(top_srcdir)/nfapi/inc -I$(top_srcdir)/nfapi/public_inc -I$(top_srcdir)/vnf/inc -I$(top_srcdir)/vnf/public_inc $(XML_CFLAGS) -std=c++11 $(BOOST_CPPFLAGS) -g +bin_PROGRAMS = vnfsim +vnfsim_SOURCES = src/main.cpp src/mac.cpp +LDADD= $(top_builddir)/vnf/libnfapi_vnf.a $(top_builddir)/common/libnfapi_common.a $(top_builddir)/nfapi/libnfapi.a $(top_builddir)/sim_common/libnfapi_sim_common.a -L$(libdir) -lpthread -lrt -lsctp -lz diff --git a/nfapi/open-nFAPI/vnf_sim/inc/mac.h b/nfapi/open-nFAPI/vnf_sim/inc/mac.h new file mode 100644 index 0000000000..eac5b3b2ac --- /dev/null +++ b/nfapi/open-nFAPI/vnf_sim/inc/mac.h @@ -0,0 +1,60 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _MAC_H_ +#define _MAC_H_ + +#include "nfapi_interface.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef struct mac mac_t; + +typedef struct mac +{ + void* user_data; + + void (*dl_config_req)(mac_t* mac, nfapi_dl_config_request_t* req); + void (*ul_config_req)(mac_t* mac, nfapi_ul_config_request_t* req); + void (*hi_dci0_req)(mac_t* mac, nfapi_hi_dci0_request_t* req); + void (*tx_req)(mac_t* mac, nfapi_tx_request_t* req); +} mac_t; + +mac_t* mac_create(uint8_t wireshark_test_mode); +void mac_destroy(mac_t* mac); + +void mac_start_data(mac_t* mac, unsigned rx_port, const char* tx_addres, unsigned tx_port); + +void mac_subframe_ind(mac_t* mac, uint16_t phy_id, uint16_t sfn_sf); +void mac_harq_ind(mac_t* mac, nfapi_harq_indication_t* ind); +void mac_crc_ind(mac_t* mac, nfapi_crc_indication_t* ind); +void mac_rx_ind(mac_t* mac, nfapi_rx_indication_t* ind); +void mac_rach_ind(mac_t* mac, nfapi_rach_indication_t* ind); +void mac_srs_ind(mac_t* mac, nfapi_srs_indication_t* ind); +void mac_sr_ind(mac_t* mac, nfapi_sr_indication_t* ind); +void mac_cqi_ind(mac_t* mac, nfapi_cqi_indication_t* ind); +void mac_lbt_dl_ind(mac_t* mac, nfapi_lbt_dl_indication_t* ind); +void mac_nb_harq_ind(mac_t* mac, nfapi_nb_harq_indication_t* ind); +void mac_nrach_ind(mac_t* mac, nfapi_nrach_indication_t* ind); + + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/nfapi/open-nFAPI/vnf_sim/src/mac.cpp b/nfapi/open-nFAPI/vnf_sim/src/mac.cpp new file mode 100644 index 0000000000..fa6f487be8 --- /dev/null +++ b/nfapi/open-nFAPI/vnf_sim/src/mac.cpp @@ -0,0 +1,1327 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "mac.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +uint32_t rand_range(uint32_t min, uint32_t max) +{ + return ((rand() % (max + 1 - min)) + min); +} + +struct mac_pdu +{ + mac_pdu() : buffer_len(1500), buffer(0), len(0) + { + buffer = (char*) malloc(buffer_len); + } + + virtual ~mac_pdu() + { + free(buffer); + } + + unsigned buffer_len; + char* buffer; + unsigned len; +}; + +class mac_private +{ + std::mutex mutex; + std::queue rx_buffer; + + std::queue free_store; + public: + + mac_private(bool _wireshark_test_mode) + : byte_count(0), tick(0), wireshark_test_mode(_wireshark_test_mode) + { + + } + + mac_pdu* allocate_mac_pdu() + { + mac_pdu* pdu = 0; + mutex.lock(); + if(free_store.empty()) + { + pdu = new mac_pdu(); + } + else + { + pdu = free_store.front(); + free_store.pop(); + } + mutex.unlock(); + return pdu; + } + + void release_mac_pdu(mac_pdu* pdu) + { + mutex.lock(); + free_store.push(pdu); + mutex.unlock(); + } + + + + void push_rx_buffer(mac_pdu* buff) + { + mutex.lock(); + rx_buffer.push(buff); + mutex.unlock(); + } + + mac_pdu* pop_rx_buffer() + { + mac_pdu* buff = 0; + mutex.lock(); + if(!rx_buffer.empty()) + { + buff = rx_buffer.front(); + rx_buffer.pop(); + } + mutex.unlock(); + return buff; + } + + uint32_t byte_count; + uint32_t tick; + + bool wireshark_test_mode; + +}; + +extern "C" +{ + typedef struct { + mac_t _public; + + int rx_sock; + int tx_sock; + struct sockaddr_in tx_addr; + + uint32_t tx_byte_count; + + mac_private* mac; + + } mac_internal_t; + + mac_t* mac_create(uint8_t wireshark_test_mode) + { + mac_internal_t* instance = (mac_internal_t*)malloc(sizeof(mac_internal_t)); + instance->mac = new mac_private((wireshark_test_mode >= 1)); + return (mac_t*)instance; + } + + void mac_destroy(mac_t* mac) + { + mac_internal_t* instance = (mac_internal_t*)mac; + delete instance->mac; + free(instance); + } + + void* mac_rx_thread_start(void* ptr) + { + mac_internal_t* instance = (mac_internal_t*)ptr; + + while(1) + { + mac_pdu* pdu = instance->mac->allocate_mac_pdu(); + int len = recvfrom(instance->rx_sock, pdu->buffer, pdu->buffer_len, 0, 0, 0); + if(len > 0) + { + pdu->len = len; + instance->mac->push_rx_buffer(pdu); + } + else + { + instance->mac->release_mac_pdu(pdu); + } + } + return 0; + } + + void mac_start_data(mac_t* mac, unsigned rx_port, const char* tx_address, unsigned tx_port) + { + mac_internal_t* instance = (mac_internal_t*)mac; + + printf("[MAC] Rx Data from %d\n", rx_port); + printf("[MAC] Tx Data to %s.%d\n", tx_address, tx_port); + + instance->rx_sock = socket(AF_INET, SOCK_DGRAM, 0); + + if(instance->rx_sock < 0) + { + printf("[MAC] Failed to create socket\n"); + return; + } + + struct sockaddr_in addr; + memset(&addr, 0, sizeof(0)); + addr.sin_family = AF_INET; + addr.sin_port = htons(rx_port); + addr.sin_addr.s_addr = INADDR_ANY; + + if(bind(instance->rx_sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) + { + printf("[MAC] Failed to bind to %d\n", rx_port); + close(instance->rx_sock); + return; + } + + pthread_t mac_rx_thread; + pthread_create(&mac_rx_thread, NULL, &mac_rx_thread_start, instance); + + instance->tx_sock = socket(AF_INET, SOCK_DGRAM, 0); + instance->tx_addr.sin_family = AF_INET; + instance->tx_addr.sin_port = htons(tx_port); + instance->tx_addr.sin_addr.s_addr = inet_addr(tx_address); + } + + + + void generate_test_subframe(mac_t *mac, uint16_t phy_id, uint16_t sfn_sf) + { + //mac_internal_t* instance = (mac_internal_t*)mac; + + uint8_t max_num_dl_pdus = 50; + nfapi_dl_config_request_pdu_t dl_config_pdus[max_num_dl_pdus]; + memset(&dl_config_pdus, 0, sizeof(dl_config_pdus)); + + nfapi_dl_config_request_t dl_config_req; + memset(&dl_config_req, 0, sizeof(dl_config_req)); + dl_config_req.header.message_id = NFAPI_DL_CONFIG_REQUEST; + dl_config_req.header.phy_id = phy_id; + dl_config_req.sfn_sf = sfn_sf; + dl_config_req.dl_config_request_body.tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + + dl_config_req.dl_config_request_body.number_pdu = rand_range(4, max_num_dl_pdus); + + uint16_t i = 0; + for(i = 0; i < dl_config_req.dl_config_request_body.number_pdu; ++i) + { + dl_config_pdus[i].pdu_type = rand_range(0, 11); + + switch(dl_config_pdus[i].pdu_type) + { + case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: + { + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.dci_format = rand_range(0, 9); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.cce_idx = rand_range(0, 255); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = rand_range(0, 32); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.rnti = rand_range(0, (uint16_t)-1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.resource_allocation_type = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.virtual_resource_block_assignment_flag = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = rand_range(0, 320000); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = rand_range(0, 31); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = rand_range(0, 3); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.transport_block_to_codeword_swap_flag = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.mcs_2 = rand_range(0, 31); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_2 = rand_range(0, 31); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_2 = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.harq_process = rand_range(0, 31); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.tpmi = rand_range(0, 15); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.pmi = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.precoding_information = rand_range(0, 63); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.tpc = rand_range(0, 3); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.downlink_assignment_index = rand_range(0, 15); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.ngap = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.transport_block_size_index = rand_range(0, 31); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.downlink_power_offset = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.allocate_prach_flag = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.preamble_index = rand_range(0, 63); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.prach_mask_index = rand_range(0, 15); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = rand_range(0, 3); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = rand_range(0, 10000); + + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel9.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG; + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel9.mcch_flag = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel9.mcch_change_notification = rand_range(0, 255); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel9.scrambling_identity = rand_range(0, 1); + + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel10.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG; + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel10.cross_carrier_scheduling_flag = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel10.carrier_indicator = rand_range(0, 7); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel10.srs_flag = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel10.srs_request = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel10.antenna_ports_scrambling_and_layers = rand_range(0, 15); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel10.total_dci_length_including_padding = rand_range(0, 255); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel10.n_dl_rb = rand_range(0, 100); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel11.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG; + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel11.harq_ack_resource_offset = rand_range(0, 3); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel11.pdsch_re_mapping_quasi_co_location_indicator = rand_range(0, 3); + + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel12.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG; + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel12.primary_cell_type = rand_range(0, 2); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel12.ul_dl_configuration_flag = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel12.number_ul_dl_configurations = 2; + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel12.ul_dl_configuration_indication[0] = rand_range(1, 5); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel12.ul_dl_configuration_indication[1] = rand_range(1, 5); + + + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG; + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.laa_end_partial_sf_flag = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.laa_end_partial_sf_configuration = rand_range(0, 255); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.initial_lbt_sf = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.codebook_size_determination = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.drms_table_flag = rand_range(0, 1); + + // if the tpm extention is present of not. + if(rand_range(0, 1)) + { + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tpm_struct_flag = rand_range(0, 1); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tpm.num_prb_per_subband = rand_range(0, 8); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tpm.number_of_subbands = rand_range(0, 13); + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tpm.num_antennas = 1; // rand_range(0, 8); + + for(int j = 0; j < dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tpm.number_of_subbands; ++j) + { + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tpm.subband_info[j].subband_index = j; + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tpm.subband_info[j].scheduled_ues = 1; //rand_range(1, 4); + + for(int k = 0; k < dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tpm.num_antennas; ++k) + for(int l = 0; l < dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tpm.subband_info[j].scheduled_ues; ++l) + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tpm.subband_info[j].precoding_value[k][l] = rand_range(0, 65535); + } + } + else + { + dl_config_pdus[i].dci_dl_pdu.dci_dl_pdu_rel13.tpm_struct_flag = 0; + } + + } + break; + + case NFAPI_DL_CONFIG_BCH_PDU_TYPE: + { + dl_config_pdus[i].bch_pdu.bch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG; + dl_config_pdus[i].bch_pdu.bch_pdu_rel8.length = rand_range(0, 42); + dl_config_pdus[i].bch_pdu.bch_pdu_rel8.pdu_index = rand_range(0, 65535); + dl_config_pdus[i].bch_pdu.bch_pdu_rel8.transmission_power = rand_range(0, 10000); + } + break; + + case NFAPI_DL_CONFIG_MCH_PDU_TYPE: + { + dl_config_pdus[i].mch_pdu.mch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG; + dl_config_pdus[i].mch_pdu.mch_pdu_rel8.length = rand_range(0, 42); + dl_config_pdus[i].mch_pdu.mch_pdu_rel8.pdu_index = rand_range(0, 65535); + dl_config_pdus[i].mch_pdu.mch_pdu_rel8.rnti = 0xFFFD; + dl_config_pdus[i].mch_pdu.mch_pdu_rel8.resource_allocation_type = 0; + dl_config_pdus[i].mch_pdu.mch_pdu_rel8.resource_block_coding = 0; + dl_config_pdus[i].mch_pdu.mch_pdu_rel8.modulation = rand_range(0, 8); + dl_config_pdus[i].mch_pdu.mch_pdu_rel8.transmission_power = rand_range(0, 10000); + dl_config_pdus[i].mch_pdu.mch_pdu_rel8.mbsfn_area_id = rand_range(0, 255); + } + break; + + case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: + { + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG; + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.length = rand_range(0, 42); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.pdu_index = rand_range(0, 65535); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.rnti = rand_range(1, 65535); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = rand_range(0, 5); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.virtual_resource_block_assignment_flag = rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = rand_range(0, 32000); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.modulation = rand_range(2, 8); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.redundancy_version = rand_range(0, 3); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.transport_blocks = rand_range(1, 2); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.transport_block_to_codeword_swap_flag = rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.transmission_scheme = rand_range(0, 13); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.number_of_layers = rand_range(1, 8); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.number_of_subbands = 2; //rand_range(0, 13); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.codebook_index[0] = rand_range(0, 15); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.codebook_index[1] = rand_range(0, 15); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.ue_category_capacity = rand_range(0, 14); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.pa = rand_range(0, 7); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.delta_power_offset_index = rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.ngap = rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.nprb = rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.transmission_mode = rand_range(1, 10); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.num_bf_prb_per_subband = 2; //rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.num_bf_vector = 2; //rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.bf_vector[0].subband_index = rand_range(0, 4); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.bf_vector[0].num_antennas = 1; + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.bf_vector[0].bf_value[0] = rand_range(0, 128); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.bf_vector[1].subband_index = rand_range(0, 4); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.bf_vector[1].num_antennas = 1; + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel8.bf_vector[1].bf_value[0] = rand_range(0, 128); + + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel9.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG; + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel9.nscid = rand_range(0, 1); + + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel10.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG; + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel10.csi_rs_flag = rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel10.csi_rs_resource_config_r10 = 0; + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel10.csi_rs_zero_tx_power_resource_config_bitmap_r10 = rand_range(0, 65535); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel10.csi_rs_number_nzp_configuration = 1; + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel10.csi_rs_resource_config[0] = rand_range(0, 31); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel10.pdsch_start = rand_range(0, 4); + + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel11.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG; + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel11.drms_config_flag = rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel11.drms_scrambling = rand_range(0, 503); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel11.csi_config_flag = rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel11.csi_scrambling = rand_range(0, 503); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel11.pdsch_re_mapping_flag = rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel11.pdsch_re_mapping_atenna_ports = rand_range(1,4); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel11.pdsch_re_mapping_freq_shift = rand_range(0, 5); + + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel12.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG; + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel12.altcqi_table_r12 = rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel12.maxlayers = rand_range(1, 8); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel12.n_dl_harq = rand_range(0, 255); + + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel13.dwpts_symbols = rand_range(3, 14); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel13.initial_lbt_sf = rand_range(0, 1); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel13.ue_type = rand_range(0, 2); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel13.pdsch_payload_type = rand_range(0, 2); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel13.initial_transmission_sf_io = rand_range(0, 10239); + dl_config_pdus[i].dlsch_pdu.dlsch_pdu_rel13.drms_table_flag = rand_range(0, 1); + } + break; + + case NFAPI_DL_CONFIG_PCH_PDU_TYPE: + { + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG; + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.length = rand_range(0, 42); + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.pdu_index = rand_range(0, 65535); + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.p_rnti = 0xFFFE; + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.resource_allocation_type = rand_range(2, 6); + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.virtual_resource_block_assignment_flag = rand_range(0, 1); + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.resource_block_coding = rand_range(0, 34000); + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.mcs = 0; + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.redundancy_version = 0; + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.number_of_transport_blocks = 1; + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.transport_block_to_codeword_swap_flag = 0; + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.transmission_scheme = rand_range(1, 6); + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.number_of_layers = rand_range(1, 4); + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.codebook_index = 0; + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.ue_category_capacity = rand_range(0, 14); + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.pa = rand_range(0, 7); + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.transmission_power = rand_range(0, 10000); + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.nprb = rand_range(0, 1); + dl_config_pdus[i].pch_pdu.pch_pdu_rel8.ngap = rand_range(0, 1); + dl_config_pdus[i].pch_pdu.pch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG; + dl_config_pdus[i].pch_pdu.pch_pdu_rel13.ue_mode = rand_range(0, 1); + dl_config_pdus[i].pch_pdu.pch_pdu_rel13.initial_transmission_sf_io = rand_range(0, 10239); + } + break; + + case NFAPI_DL_CONFIG_PRS_PDU_TYPE: + { + dl_config_pdus[i].prs_pdu.prs_pdu_rel9.tl.tag = NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG; + dl_config_pdus[i].prs_pdu.prs_pdu_rel9.transmission_power = rand_range(0, 10000); + dl_config_pdus[i].prs_pdu.prs_pdu_rel9.prs_bandwidth = rand_range(6, 100); + dl_config_pdus[i].prs_pdu.prs_pdu_rel9.prs_cyclic_prefix_type = rand_range(0, 1); + dl_config_pdus[i].prs_pdu.prs_pdu_rel9.prs_muting = rand_range(0, 1); + } + break; + + case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: + { + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel10.tl.tag = NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG; + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel10.csi_rs_antenna_port_count_r10 = rand_range(1, 16); + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel10.csi_rs_resource_config_r10 = 0; + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel10.transmission_power = rand_range(0, 10000); + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel10.csi_rs_zero_tx_power_resource_config_bitmap_r10 = rand_range(0, 8); + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel10.csi_rs_number_of_nzp_configuration = 2; + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel10.csi_rs_resource_config[0] = rand_range(0, 31); + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel10.csi_rs_resource_config[1] = rand_range(0, 31); + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG; + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel13.csi_rs_class = rand_range(0, 2); + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel13.cdm_type = rand_range(0, 1); + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel13.num_bf_vector = 0; // set to zero as not clear how to handle bf value array + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel13.bf_vector[0].csi_rs_resource_index = rand_range(0, 7); + dl_config_pdus[i].csi_rs_pdu.csi_rs_pdu_rel13.bf_vector[0].bf_value[0] = 42; + } + break; + + case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: + { + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG; + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.dci_format = rand_range(0, 9); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.cce_idx = rand_range(0, 255); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.aggregation_level = rand_range(0, 32); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.rnti = rand_range(0, (uint16_t)-1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.resource_allocation_type = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.virtual_resource_block_assignment_flag = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.resource_block_coding = rand_range(0, 320000); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.mcs_1 = rand_range(0, 31); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.redundancy_version_1 = rand_range(0, 3); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.new_data_indicator_1 = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.transport_block_to_codeword_swap_flag = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.mcs_2 = rand_range(0, 31); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.redundancy_version_2 = rand_range(0, 31); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.new_data_indicator_2 = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.harq_process = rand_range(0, 31); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.tpmi = rand_range(0, 15); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.pmi = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.precoding_information = rand_range(0, 63); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.tpc = rand_range(0, 3); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.downlink_assignment_index = rand_range(0, 15); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.ngap = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.transport_block_size_index = rand_range(0, 31); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.downlink_power_offset = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.allocate_prach_flag = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.preamble_index = rand_range(0, 63); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.prach_mask_index = rand_range(0, 15); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.rnti_type = rand_range(0, 3); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel8.transmission_power = rand_range(0, 10000); + + + + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel9.tl.tag = NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG; + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel9.mcch_flag = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel9.mcch_change_notification = rand_range(0, 255); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel9.scrambling_identity = rand_range(0, 1); + + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel10.tl.tag = NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG; + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel10.cross_carrier_scheduling_flag = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel10.carrier_indicator = rand_range(0, 7); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel10.srs_flag = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel10.srs_request = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel10.antenna_ports_scrambling_and_layers = rand_range(0, 15); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel10.total_dci_length_including_padding = rand_range(0, 255); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel10.n_dl_rb = rand_range(0, 100); + + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel11.tl.tag = NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG; + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel11.harq_ack_resource_offset = rand_range(0, 3); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel11.pdsch_re_mapping_quasi_co_location_indicator = rand_range(0, 3); + + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel12.tl.tag = NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG; + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel12.primary_cell_type = rand_range(0, 2); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel12.ul_dl_configuration_flag = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel12.number_ul_dl_configurations = 2; + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel12.ul_dl_configuration_indication[0] = rand_range(1, 5); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel12.ul_dl_configuration_indication[1] = rand_range(1, 5); + + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG; + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel13.laa_end_partial_sf_flag = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel13.laa_end_partial_sf_configuration = rand_range(0, 255); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel13.initial_lbt_sf = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel13.codebook_size_determination = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_pdu_rel13.drms_table_flag = rand_range(0, 1); + + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel11.tl.tag = NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG; + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel11.epdcch_resource_assignment_flag = rand_range(0, 1); + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel11.epdcch_id = rand_range(0, 503); + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel11.epdcch_start_symbol = rand_range(1, 4); + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel11.epdcch_num_prb = rand_range(2, 8); + for(int j = 0; j < dl_config_pdus[i].epdcch_pdu.epdcch_params_rel11.epdcch_num_prb; ++j) + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel11.epdcch_prb_index[j] = rand_range(0, 99); + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel11.bf_vector.subband_index = rand_range(0, 25); + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel11.bf_vector.num_antennas= rand_range(1, 4); + for(int j = 0; j < dl_config_pdus[i].epdcch_pdu.epdcch_params_rel11.epdcch_num_prb; ++j) + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel11.bf_vector.bf_value[j] = rand_range(0, 65535); + + + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG; + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel13.dwpts_symbols = rand_range(3, 14); + dl_config_pdus[i].epdcch_pdu.epdcch_params_rel13.initial_lbt_sf = rand_range(0, 1); + } + break; + + case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: + { + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG; + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.mpdcch_narrow_band = rand_range(0, 15); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.number_of_prb_pairs = rand_range(2, 6); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.resource_block_assignment = rand_range(0, 14); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.mpdcch_tansmission_type = rand_range(0, 1); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.start_symbol = rand_range(1, 4); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.ecce_index = rand_range(0, 22); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.aggregation_level = rand_range(2, 24); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.rnti_type = rand_range(0, 4); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.rnti = rand_range(1, 65535); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.ce_mode = rand_range(1, 2); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.drms_scrambling_init = rand_range(0, 503); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.initial_transmission_sf_io = rand_range(0, 10239); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.transmission_power = rand_range(0, 10000); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.dci_format = rand_range(10, 12); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.resource_block_coding = rand_range(0, 0xFFFF); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.mcs = rand_range(0, 15); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.pdsch_reptition_levels = rand_range(1, 8); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.redundancy_version = rand_range(0, 3); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.new_data_indicator = rand_range(0, 1); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.harq_process = rand_range(0, 15); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.tpmi_length = rand_range(0, 4); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.tpmi = rand_range(0, 15); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.pmi_flag = rand_range(0, 1); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.pmi = rand_range(0, 1); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.harq_resource_offset = rand_range(0, 3); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.dci_subframe_repetition_number = rand_range(1, 4); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.tpc = rand_range(0, 3); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.downlink_assignment_index_length = rand_range(0, 4); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.downlink_assignment_index = rand_range(0, 15); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.allocate_prach_flag = rand_range(0, 63); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.preamble_index = rand_range(0, 15); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.prach_mask_index = rand_range(0, 3); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.starting_ce_level = rand_range(0, 1); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.srs_request = rand_range(0, 1); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.antenna_ports_and_scrambling_identity_flag = rand_range(0, 1); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.antenna_ports_and_scrambling_identity = rand_range(0, 3); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.frequency_hopping_enabled_flag = rand_range(0, 1); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.paging_direct_indication_differentiation_flag = rand_range(0, 1); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.direct_indication = rand_range(0, 255); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.total_dci_length_including_padding = rand_range(0, 1); + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.number_of_tx_antenna_ports = rand_range(0, 8); + for(int j = 0 ; j < dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.number_of_tx_antenna_ports; ++j) + dl_config_pdus[i].mpdcch_pdu.mpdcch_pdu_rel13.precoding_value[j] = rand_range(0, 65535); + } + break; + + case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: + { + dl_config_pdus[i].nbch_pdu.nbch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG; + dl_config_pdus[i].nbch_pdu.nbch_pdu_rel13.length = rand_range(0, 5555); + dl_config_pdus[i].nbch_pdu.nbch_pdu_rel13.pdu_index = rand_range(0, 65535); + dl_config_pdus[i].nbch_pdu.nbch_pdu_rel13.transmission_power = rand_range(0, 10000); + dl_config_pdus[i].nbch_pdu.nbch_pdu_rel13.hyper_sfn_2_lsbs = rand_range(0, 3); + } + break; + + case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: + { + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG; + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.length = rand_range(0, 5555); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.pdu_index = rand_range(0, 65535); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.ncce_index = rand_range(0, 1); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.aggregation_level = rand_range(1, 2); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.start_symbol = rand_range(0, 4); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.rnti_type = rand_range(0, 3); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.rnti = rand_range(1, 65535); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.scrambling_reinitialization_batch_index = rand_range(1, 4); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.nrs_antenna_ports_assumed_by_the_ue = rand_range(1, 2); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.dci_format = rand_range(0, 1); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.scheduling_delay = rand_range(0, 7); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.resource_assignment = rand_range(0, 7); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.repetition_number = rand_range(0, 15); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.mcs = rand_range(0, 13); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.new_data_indicator = rand_range(0, 1); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.harq_ack_resource = rand_range(0, 15); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.npdcch_order_indication = rand_range(0, 1); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.starting_number_of_nprach_repetitions = rand_range(0, 3); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.subcarrier_indication_of_nprach = rand_range(0, 63); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.paging_direct_indication_differentation_flag = rand_range(0, 1); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.direct_indication = rand_range(0, 255); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.dci_subframe_repetition_number = rand_range(0, 7); + dl_config_pdus[i].npdcch_pdu.npdcch_pdu_rel13.total_dci_length_including_padding = rand_range(0, 255); + } + break; + + case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: + { + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG; + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.length = rand_range(0, 5555); + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.pdu_index = rand_range(0, 65535); + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.start_symbol = rand_range(0, 4); + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.rnti_type = rand_range(0, 1); + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.rnti = rand_range(1, 65535); + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.resource_assignment = rand_range(0, 7); + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.repetition_number = rand_range(0, 15); + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.modulation = 2; + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.number_of_subframes_for_resource_assignment = rand_range(1, 10); + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.scrambling_sequence_initialization_cinit = rand_range(0, 65535); + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.sf_idx = rand_range(1, 10240); + dl_config_pdus[i].ndlsch_pdu.ndlsch_pdu_rel13.nrs_antenna_ports_assumed_by_the_ue = rand_range(1, 2); + } + break; + + }; + } + + + dl_config_req.dl_config_request_body.dl_config_pdu_list = dl_config_pdus; + mac->dl_config_req(mac, &dl_config_req); + + uint8_t num_ul_pdus = 18; + nfapi_ul_config_request_pdu_t ul_config_pdus[num_ul_pdus]; + memset(&ul_config_pdus, 0, sizeof(ul_config_pdus)); + + nfapi_ul_config_request_t ul_config_req; + memset(&ul_config_req, 0, sizeof(ul_config_req)); + ul_config_req.header.message_id = NFAPI_UL_CONFIG_REQUEST; + ul_config_req.header.phy_id = phy_id; + ul_config_req.sfn_sf = sfn_sf; + ul_config_req.ul_config_request_body.tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + ul_config_req.ul_config_request_body.number_of_pdus = num_ul_pdus; + ul_config_req.ul_config_request_body.rach_prach_frequency_resources = rand_range(0, 255); + ul_config_req.ul_config_request_body.srs_present = rand_range(0, 1); + + auto ul_config_ulsch_pdu_test_gen = [](nfapi_ul_config_ulsch_pdu& ulsch_pdu) + { + ulsch_pdu.ulsch_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG; + ulsch_pdu.ulsch_pdu_rel8.handle = rand_range(0, 50000); + ulsch_pdu.ulsch_pdu_rel8.size = rand_range(0, 32000); + ulsch_pdu.ulsch_pdu_rel8.rnti = rand_range(1, 65535); + ulsch_pdu.ulsch_pdu_rel8.resource_block_start = rand_range(0, 99); + ulsch_pdu.ulsch_pdu_rel8.number_of_resource_blocks = rand_range(1, 100); + ulsch_pdu.ulsch_pdu_rel8.modulation_type = rand_range(2, 6); + ulsch_pdu.ulsch_pdu_rel8.cyclic_shift_2_for_drms = rand_range(0, 7); + ulsch_pdu.ulsch_pdu_rel8.frequency_hopping_enabled_flag = rand_range(0, 1); + ulsch_pdu.ulsch_pdu_rel8.frequency_hopping_bits = rand_range(0, 3); + ulsch_pdu.ulsch_pdu_rel8.new_data_indication = rand_range(0, 1); + ulsch_pdu.ulsch_pdu_rel8.redundancy_version = rand_range(0, 3); + ulsch_pdu.ulsch_pdu_rel8.harq_process_number = rand_range(0, 15); + ulsch_pdu.ulsch_pdu_rel8.ul_tx_mode = rand_range(0, 1); + ulsch_pdu.ulsch_pdu_rel8.current_tx_nb = rand_range(0, 5); + ulsch_pdu.ulsch_pdu_rel8.n_srs = rand_range(0, 1); + ulsch_pdu.ulsch_pdu_rel10.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG; + ulsch_pdu.ulsch_pdu_rel10.resource_allocation_type = rand_range(0, 1); + ulsch_pdu.ulsch_pdu_rel10.resource_block_coding = rand_range(0, 35000); + ulsch_pdu.ulsch_pdu_rel10.transport_blocks = rand_range(1, 2); + ulsch_pdu.ulsch_pdu_rel10.transmission_scheme = rand_range(0, 1); + ulsch_pdu.ulsch_pdu_rel10.number_of_layers = rand_range(1, 4); + ulsch_pdu.ulsch_pdu_rel10.codebook_index = rand_range(0, 23); + ulsch_pdu.ulsch_pdu_rel10.disable_sequence_hopping_flag = rand_range(0, 1); + ulsch_pdu.ulsch_pdu_rel11.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG; + ulsch_pdu.ulsch_pdu_rel11.virtual_cell_id_enabled_flag = rand_range(0, 1); + ulsch_pdu.ulsch_pdu_rel11.npusch_identity = rand_range(0, 509); + ulsch_pdu.ulsch_pdu_rel11.dmrs_config_flag = rand_range(0, 1); + ulsch_pdu.ulsch_pdu_rel11.ndmrs_csh_identity = rand_range(0, 509); + ulsch_pdu.ulsch_pdu_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG; + ulsch_pdu.ulsch_pdu_rel13.ue_type = rand_range(0, 2); + ulsch_pdu.ulsch_pdu_rel13.total_number_of_repetitions = rand_range(1, 2048); + ulsch_pdu.ulsch_pdu_rel13.repetition_number = rand_range(1, 2048); + ulsch_pdu.ulsch_pdu_rel13.initial_transmission_sf_io = rand_range(0, 10239); + ulsch_pdu.ulsch_pdu_rel13.empty_symbols_due_to_re_tunning = rand_range(0, 8); + }; + + auto ul_config_cqi_ri_info_test_gen = [](nfapi_ul_config_cqi_ri_information& cqi_ri_information) + { + cqi_ri_information.cqi_ri_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG; + cqi_ri_information.cqi_ri_information_rel8.dl_cqi_pmi_size_rank_1 = rand_range(0, 255); + cqi_ri_information.cqi_ri_information_rel8.dl_cqi_pmi_size_rank_greater_1 = rand_range(0, 255); + cqi_ri_information.cqi_ri_information_rel8.ri_size = rand_range(0, 3); + cqi_ri_information.cqi_ri_information_rel8.delta_offset_cqi = rand_range(0, 15); + cqi_ri_information.cqi_ri_information_rel8.delta_offset_ri = rand_range(0, 15); + + cqi_ri_information.cqi_ri_information_rel9.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG; + cqi_ri_information.cqi_ri_information_rel9.report_type = 1; // rand_range(0, 1); + cqi_ri_information.cqi_ri_information_rel9.delta_offset_cqi = rand_range(0, 15); + cqi_ri_information.cqi_ri_information_rel9.delta_offset_ri = rand_range(0, 15); + + if(cqi_ri_information.cqi_ri_information_rel9.report_type == 0) + { + cqi_ri_information.cqi_ri_information_rel9.periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size = rand_range(0, 255); + cqi_ri_information.cqi_ri_information_rel9.periodic_cqi_pmi_ri_report.control_type = rand_range(0, 1); + } + else + { + cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.number_of_cc = 1; + cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].ri_size = rand_range(0, 3); + cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0] = rand_range(0, 255); + } + + cqi_ri_information.cqi_ri_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG; + cqi_ri_information.cqi_ri_information_rel13.report_type = rand_range(0, 1); + + if(cqi_ri_information.cqi_ri_information_rel13.report_type == 0) + { + cqi_ri_information.cqi_ri_information_rel13.periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2 = rand_range(255, 10000); + } + }; + + auto ul_config_init_tx_params_test_gen = [](nfapi_ul_config_initial_transmission_parameters& initial_transmission_parameters) + { + initial_transmission_parameters.initial_transmission_parameters_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG; + initial_transmission_parameters.initial_transmission_parameters_rel8.n_srs_initial = rand_range(0, 1); + initial_transmission_parameters.initial_transmission_parameters_rel8.initial_number_of_resource_blocks = rand_range(1, 100); + }; + + auto ul_config_harqinfo_test_gen = [](nfapi_ul_config_ulsch_harq_information& harq_information) + { + harq_information.harq_information_rel10.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG; + harq_information.harq_information_rel10.harq_size = rand_range(0, 21); + harq_information.harq_information_rel10.delta_offset_harq = rand_range(0, 15); + harq_information.harq_information_rel10.ack_nack_mode = rand_range(0, 5); + harq_information.harq_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG; + harq_information.harq_information_rel13.harq_size_2 = rand_range(0, 21); + harq_information.harq_information_rel13.delta_offset_harq_2 = rand_range(0, 15); + }; + + auto ul_config_sr_info_test_gen = [](nfapi_ul_config_sr_information& sr_info) + { + sr_info.sr_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG; + sr_info.sr_information_rel8.pucch_index = rand_range(0, 2047); + sr_info.sr_information_rel10.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG; + sr_info.sr_information_rel10.number_of_pucch_resources = rand_range(1, 2); + sr_info.sr_information_rel10.pucch_index_p1 = rand_range(0, 2047); + }; + + auto ul_config_ue_info_test_gen = [](nfapi_ul_config_ue_information& ue_information) + { + ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; + ue_information.ue_information_rel8.handle = rand_range(0, 99999); + ue_information.ue_information_rel8.rnti = rand_range(1, 65535); + ue_information.ue_information_rel11.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG; + ue_information.ue_information_rel11.virtual_cell_id_enabled_flag = rand_range(0, 1); + ue_information.ue_information_rel11.npusch_identity = rand_range(0, 503); + ue_information.ue_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG; + ue_information.ue_information_rel13.ue_type = rand_range(0, 2); + ue_information.ue_information_rel13.empty_symbols = rand_range(0, 2); + ue_information.ue_information_rel13.total_number_of_repetitions = rand_range(1, 32); + ue_information.ue_information_rel13.repetition_number = rand_range(1, 32); + }; + + auto ul_config_cqi_info_test_gen = [](nfapi_ul_config_cqi_information& cqi_information) + { + cqi_information.cqi_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG; + cqi_information.cqi_information_rel8.pucch_index = rand_range(0, 1184); + cqi_information.cqi_information_rel8.dl_cqi_pmi_size = rand_range(0, 255); + cqi_information.cqi_information_rel10.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG; + cqi_information.cqi_information_rel10.number_of_pucch_resource = rand_range(1, 2); + cqi_information.cqi_information_rel10.pucch_index_p1 = rand_range(0, 1184); + cqi_information.cqi_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG; + cqi_information.cqi_information_rel13.csi_mode = rand_range(0, 2); + cqi_information.cqi_information_rel13.dl_cqi_pmi_size_2 = rand_range(0, 999); + cqi_information.cqi_information_rel13.starting_prb = rand_range(0, 109); + cqi_information.cqi_information_rel13.n_prb = rand_range(0, 7); + cqi_information.cqi_information_rel13.cdm_index = rand_range(0, 1); + cqi_information.cqi_information_rel13.n_srs = rand_range(0, 1); + }; + + auto ul_config_harq_info_test_gen = [](nfapi_ul_config_harq_information& harq_information) + { + harq_information.harq_information_rel10_tdd.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG; + harq_information.harq_information_rel10_tdd.harq_size = rand_range(0, 21); + harq_information.harq_information_rel10_tdd.ack_nack_mode = rand_range(0, 5); + harq_information.harq_information_rel10_tdd.number_of_pucch_resources = rand_range(0, 4); + harq_information.harq_information_rel10_tdd.n_pucch_1_0 = rand_range(0, 2047); + harq_information.harq_information_rel10_tdd.n_pucch_1_1 = rand_range(0, 2047); + harq_information.harq_information_rel10_tdd.n_pucch_1_2 = rand_range(0, 2047); + harq_information.harq_information_rel10_tdd.n_pucch_1_3 = rand_range(0, 2047); + harq_information.harq_information_rel8_fdd.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG; + harq_information.harq_information_rel8_fdd.n_pucch_1_0 = rand_range(0, 2047); + harq_information.harq_information_rel8_fdd.harq_size = rand_range(1, 2); + harq_information.harq_information_rel9_fdd.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG; + harq_information.harq_information_rel9_fdd.harq_size = rand_range(1, 10); + harq_information.harq_information_rel9_fdd.ack_nack_mode = rand_range(0, 4); + harq_information.harq_information_rel9_fdd.number_of_pucch_resources = rand_range(0, 4); + harq_information.harq_information_rel9_fdd.n_pucch_1_0 = rand_range(0, 2047); + harq_information.harq_information_rel9_fdd.n_pucch_1_1 = rand_range(0, 2047); + harq_information.harq_information_rel9_fdd.n_pucch_1_2 = rand_range(0, 2047); + harq_information.harq_information_rel9_fdd.n_pucch_1_3 = rand_range(0, 2047); + harq_information.harq_information_rel11.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG; + harq_information.harq_information_rel11.num_ant_ports = rand_range(1, 2); + harq_information.harq_information_rel11.n_pucch_2_0 = rand_range(0, 2047); + harq_information.harq_information_rel11.n_pucch_2_1 = rand_range(0, 2047); + harq_information.harq_information_rel11.n_pucch_2_2 = rand_range(0, 2047); + harq_information.harq_information_rel11.n_pucch_2_3 = rand_range(0, 2047); + harq_information.harq_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG; + harq_information.harq_information_rel13.harq_size_2 = rand_range(0, 999); + harq_information.harq_information_rel13.starting_prb = rand_range(0, 109); + harq_information.harq_information_rel13.n_prb = rand_range(0, 7); + harq_information.harq_information_rel13.cdm_index = rand_range(0, 1); + harq_information.harq_information_rel13.n_srs = rand_range(0, 1); + }; + + + ul_config_pdus[0].pdu_type = NFAPI_UL_CONFIG_ULSCH_PDU_TYPE; + ul_config_ulsch_pdu_test_gen(ul_config_pdus[0].ulsch_pdu); + + ul_config_pdus[1].pdu_type = NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE; + ul_config_ulsch_pdu_test_gen(ul_config_pdus[1].ulsch_cqi_ri_pdu.ulsch_pdu); + ul_config_cqi_ri_info_test_gen(ul_config_pdus[1].ulsch_cqi_ri_pdu.cqi_ri_information); + ul_config_init_tx_params_test_gen(ul_config_pdus[1].ulsch_cqi_ri_pdu.initial_transmission_parameters); + + ul_config_pdus[2].pdu_type = NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE; + ul_config_ulsch_pdu_test_gen(ul_config_pdus[2].ulsch_harq_pdu.ulsch_pdu); + ul_config_harqinfo_test_gen(ul_config_pdus[2].ulsch_harq_pdu.harq_information); + ul_config_init_tx_params_test_gen(ul_config_pdus[2].ulsch_harq_pdu.initial_transmission_parameters); + + ul_config_pdus[3].pdu_type = NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE; + ul_config_ulsch_pdu_test_gen(ul_config_pdus[3].ulsch_cqi_harq_ri_pdu.ulsch_pdu); + ul_config_cqi_ri_info_test_gen(ul_config_pdus[3].ulsch_cqi_harq_ri_pdu.cqi_ri_information); + ul_config_harqinfo_test_gen(ul_config_pdus[3].ulsch_cqi_harq_ri_pdu.harq_information); + ul_config_init_tx_params_test_gen(ul_config_pdus[3].ulsch_cqi_harq_ri_pdu.initial_transmission_parameters); + + + ul_config_pdus[4].pdu_type = NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE; + ul_config_ue_info_test_gen(ul_config_pdus[4].uci_cqi_pdu.ue_information); + ul_config_cqi_info_test_gen(ul_config_pdus[4].uci_cqi_pdu.cqi_information); + + ul_config_pdus[5].pdu_type = NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE; + ul_config_ue_info_test_gen(ul_config_pdus[5].uci_sr_pdu.ue_information); + ul_config_sr_info_test_gen(ul_config_pdus[5].uci_sr_pdu.sr_information); + + + ul_config_pdus[6].pdu_type = NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE; + ul_config_ue_info_test_gen(ul_config_pdus[6].uci_harq_pdu.ue_information); + ul_config_harq_info_test_gen(ul_config_pdus[6].uci_harq_pdu.harq_information); + + + ul_config_pdus[7].pdu_type = NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE; + ul_config_ue_info_test_gen(ul_config_pdus[7].uci_sr_harq_pdu.ue_information); + ul_config_sr_info_test_gen(ul_config_pdus[7].uci_sr_harq_pdu.sr_information); + ul_config_harq_info_test_gen(ul_config_pdus[7].uci_sr_harq_pdu.harq_information); + + ul_config_pdus[8].pdu_type = NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE; + ul_config_ue_info_test_gen(ul_config_pdus[8].uci_cqi_harq_pdu.ue_information); + ul_config_cqi_info_test_gen(ul_config_pdus[8].uci_cqi_harq_pdu.cqi_information); + ul_config_harq_info_test_gen(ul_config_pdus[8].uci_cqi_harq_pdu.harq_information); + + ul_config_pdus[9].pdu_type = NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE; + ul_config_ue_info_test_gen(ul_config_pdus[9].uci_cqi_sr_pdu.ue_information); + ul_config_cqi_info_test_gen(ul_config_pdus[9].uci_cqi_sr_pdu.cqi_information); + ul_config_sr_info_test_gen(ul_config_pdus[9].uci_cqi_sr_pdu.sr_information); + + ul_config_pdus[10].pdu_type = NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE; + ul_config_ue_info_test_gen(ul_config_pdus[10].uci_cqi_sr_harq_pdu.ue_information); + ul_config_cqi_info_test_gen(ul_config_pdus[10].uci_cqi_sr_harq_pdu.cqi_information); + ul_config_sr_info_test_gen(ul_config_pdus[10].uci_cqi_sr_harq_pdu.sr_information); + ul_config_harq_info_test_gen(ul_config_pdus[10].uci_cqi_sr_harq_pdu.harq_information); + + ul_config_pdus[11].pdu_type = NFAPI_UL_CONFIG_SRS_PDU_TYPE; + ul_config_pdus[11].srs_pdu.srs_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG; + ul_config_pdus[11].srs_pdu.srs_pdu_rel8.handle = rand_range(0, 9999); + ul_config_pdus[11].srs_pdu.srs_pdu_rel8.size = rand_range(1, 999); + ul_config_pdus[11].srs_pdu.srs_pdu_rel8.rnti = rand_range(1, 65535); + ul_config_pdus[11].srs_pdu.srs_pdu_rel8.srs_bandwidth = rand_range(0, 3); + ul_config_pdus[11].srs_pdu.srs_pdu_rel8.frequency_domain_position = rand_range(0, 23); + ul_config_pdus[11].srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth = rand_range(0, 3); + ul_config_pdus[11].srs_pdu.srs_pdu_rel8.transmission_comb = rand_range(0, 3); + ul_config_pdus[11].srs_pdu.srs_pdu_rel8.i_srs = rand_range(0, 1023); + ul_config_pdus[11].srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift = rand_range(0, 11); + ul_config_pdus[11].srs_pdu.srs_pdu_rel10.tl.tag = NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG; + ul_config_pdus[11].srs_pdu.srs_pdu_rel10.antenna_port = rand_range(0, 2); + ul_config_pdus[11].srs_pdu.srs_pdu_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG; + ul_config_pdus[11].srs_pdu.srs_pdu_rel13.number_of_combs = rand_range(0, 1); + + ul_config_pdus[12].pdu_type = NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE; + ul_config_ue_info_test_gen(ul_config_pdus[12].harq_buffer_pdu.ue_information); + + ul_config_pdus[13].pdu_type = NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE; + ul_config_ulsch_pdu_test_gen(ul_config_pdus[13].ulsch_uci_csi_pdu.ulsch_pdu); + ul_config_cqi_info_test_gen(ul_config_pdus[13].ulsch_uci_csi_pdu.csi_information); + + ul_config_pdus[14].pdu_type = NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE; + ul_config_ulsch_pdu_test_gen(ul_config_pdus[14].ulsch_uci_harq_pdu.ulsch_pdu); + ul_config_harq_info_test_gen(ul_config_pdus[14].ulsch_uci_harq_pdu.harq_information); + + ul_config_pdus[15].pdu_type = NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE; + ul_config_ulsch_pdu_test_gen(ul_config_pdus[15].ulsch_csi_uci_harq_pdu.ulsch_pdu); + ul_config_cqi_info_test_gen(ul_config_pdus[15].ulsch_csi_uci_harq_pdu.csi_information); + ul_config_harq_info_test_gen(ul_config_pdus[15].ulsch_csi_uci_harq_pdu.harq_information); + + ul_config_pdus[16].pdu_type = NFAPI_UL_CONFIG_NULSCH_PDU_TYPE; + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG; + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.nulsch_format = rand_range(0, 1); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.handle = rand_range(0, 0xFFFF); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.size = rand_range(0, 65535); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.rnti = rand_range(1, 65535); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.subcarrier_indication = rand_range(0, 47); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.resource_assignment = rand_range(0, 7); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.mcs = rand_range(0, 12); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.redudancy_version = rand_range(0, 1); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.repetition_number = rand_range(0, 7); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.new_data_indication = rand_range(0, 1); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.n_srs = rand_range(0, 1); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.scrambling_sequence_initialization_cinit = rand_range(0, 65535); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.sf_idx = rand_range(0, 40960); + + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.ue_information.ue_information_rel8.handle = rand_range(0, 0xFF); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.ue_information.ue_information_rel8.rnti = rand_range(1, 65535); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.ue_information.ue_information_rel11.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG; + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.ue_information.ue_information_rel11.virtual_cell_id_enabled_flag = rand_range(0, 1); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.ue_information.ue_information_rel11.npusch_identity = rand_range(0, 503); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.ue_information.ue_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG; + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.ue_information.ue_information_rel13.ue_type = rand_range(0, 2); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.ue_information.ue_information_rel13.empty_symbols = rand_range(0, 0x3); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.ue_information.ue_information_rel13.total_number_of_repetitions = rand_range(1, 32); + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.ue_information.ue_information_rel13.repetition_number = rand_range(1, 32); + + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.nb_harq_information.nb_harq_information_rel13_fdd.tl.tag = NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG; + ul_config_pdus[16].nulsch_pdu.nulsch_pdu_rel13.nb_harq_information.nb_harq_information_rel13_fdd.harq_ack_resource = rand_range(0, 15); + + ul_config_pdus[17].pdu_type = NFAPI_UL_CONFIG_NRACH_PDU_TYPE; + ul_config_pdus[17].nrach_pdu.nrach_pdu_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG; + ul_config_pdus[17].nrach_pdu.nrach_pdu_rel13.nprach_config_0 = rand_range(0, 1); + ul_config_pdus[17].nrach_pdu.nrach_pdu_rel13.nprach_config_1 = rand_range(0, 1); + ul_config_pdus[17].nrach_pdu.nrach_pdu_rel13.nprach_config_2 = rand_range(0, 1); + + ul_config_req.ul_config_request_body.ul_config_pdu_list = ul_config_pdus; + mac->ul_config_req(mac, &ul_config_req); + + + uint8_t num_dci_pdus = 4; + uint8_t num_hi_pdus = 1; + nfapi_hi_dci0_request_pdu_t hi_dci0_pdus[num_dci_pdus + num_hi_pdus]; + memset(&hi_dci0_pdus, 0, sizeof(hi_dci0_pdus)); + + nfapi_hi_dci0_request_t hi_dci0_req; + memset(&hi_dci0_req, 0, sizeof(hi_dci0_req)); + hi_dci0_req.header.message_id = NFAPI_HI_DCI0_REQUEST; + hi_dci0_req.header.phy_id = phy_id; + hi_dci0_req.sfn_sf = sfn_sf; + + hi_dci0_req.hi_dci0_request_body.tl.tag = NFAPI_HI_DCI0_REQUEST_BODY_TAG; + hi_dci0_req.hi_dci0_request_body.sfnsf = sfn_sf; + hi_dci0_req.hi_dci0_request_body.number_of_dci = num_dci_pdus; + hi_dci0_req.hi_dci0_request_body.number_of_hi = num_hi_pdus; + + hi_dci0_pdus[0].pdu_type = NFAPI_HI_DCI0_HI_PDU_TYPE; + hi_dci0_pdus[0].hi_pdu.hi_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG; + hi_dci0_pdus[0].hi_pdu.hi_pdu_rel8.resource_block_start = rand_range(0, 100); + hi_dci0_pdus[0].hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms = rand_range(0, 7); + hi_dci0_pdus[0].hi_pdu.hi_pdu_rel8.hi_value = rand_range(0, 1); + hi_dci0_pdus[0].hi_pdu.hi_pdu_rel8.i_phich = rand_range(0, 1); + hi_dci0_pdus[0].hi_pdu.hi_pdu_rel8.transmission_power = rand_range(0, 10000); + hi_dci0_pdus[0].hi_pdu.hi_pdu_rel10.tl.tag = NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG; + hi_dci0_pdus[0].hi_pdu.hi_pdu_rel10.flag_tb2 = rand_range(0, 1); + hi_dci0_pdus[0].hi_pdu.hi_pdu_rel10.hi_value_2 = rand_range(0, 1); + + hi_dci0_pdus[1].pdu_type = NFAPI_HI_DCI0_DCI_PDU_TYPE; + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG; + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.dci_format = rand_range(0, 4); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.cce_index = rand_range(0, 88); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.aggregation_level = rand_range(1, 8); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.rnti = rand_range(1, 65535); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.resource_block_start = rand_range(0, 100); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.number_of_resource_block = rand_range(0, 100); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.mcs_1 = rand_range(0, 31); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.cyclic_shift_2_for_drms = rand_range(0, 7); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.frequency_hopping_enabled_flag = rand_range(0, 1); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.frequency_hopping_bits = rand_range(0, 3); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.new_data_indication_1 = rand_range(0, 1); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.ue_tx_antenna_seleciton = rand_range(0, 2); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.tpc = rand_range(0, 3); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.cqi_csi_request = rand_range(0, 7); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.ul_index = rand_range(0, 3); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.dl_assignment_index = rand_range(1, 4); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.tpc_bitmap = rand_range(0, 9999); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel8.transmission_power = rand_range(0, 10000); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.tl.tag = NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG; + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.cross_carrier_scheduling_flag = rand_range(0, 1); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.carrier_indicator = rand_range(0, 7); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.size_of_cqi_csi_feild = rand_range(0, 2); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.srs_flag = rand_range(0, 1); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.srs_request = rand_range(0, 1); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.resource_allocation_flag = rand_range(0, 1); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.resource_allocation_type = rand_range(0, 1); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.resource_block_coding = rand_range(0, 9999); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.mcs_2 = rand_range(0, 31); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.new_data_indication_2 = rand_range(0, 1); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.number_of_antenna_ports = rand_range(0, 2); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.tpmi = rand_range(0, 63); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.total_dci_length_including_padding = rand_range(0, 255); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel10.n_ul_rb = rand_range(6, 100); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel12.tl.tag = NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG; + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel12.pscch_resource = rand_range(0, 16); + hi_dci0_pdus[1].dci_pdu.dci_pdu_rel12.time_resource_pattern = rand_range(0, 32); + + + hi_dci0_pdus[2].pdu_type = NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE; + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG; + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.dci_format = rand_range(0, 4); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.cce_index = rand_range(0, 88); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.aggregation_level = rand_range(1, 8); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.rnti = rand_range(1, 65535); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.resource_block_start = rand_range(0, 100); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.number_of_resource_block = rand_range(0, 100); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.mcs_1 = rand_range(0, 31); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.cyclic_shift_2_for_drms = rand_range(0, 7); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.frequency_hopping_enabled_flag = rand_range(0, 1); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.frequency_hopping_bits = rand_range(0, 3); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.new_data_indication_1 = rand_range(0, 1); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.ue_tx_antenna_seleciton = rand_range(0, 2); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.tpc = rand_range(0, 3); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.cqi_csi_request = rand_range(0, 7); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.ul_index = rand_range(0, 3); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.dl_assignment_index = rand_range(1, 4); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.tpc_bitmap = rand_range(0, 9999); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel8.transmission_power = rand_range(0, 10000); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.tl.tag = NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG; + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.cross_carrier_scheduling_flag = rand_range(0, 1); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.carrier_indicator = rand_range(0, 7); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.size_of_cqi_csi_feild = rand_range(0, 2); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.srs_flag = rand_range(0, 1); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.srs_request = rand_range(0, 1); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.resource_allocation_flag = rand_range(0, 1); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.resource_allocation_type = rand_range(0, 1); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.resource_block_coding = rand_range(0, 9999); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.mcs_2 = rand_range(0, 31); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.new_data_indication_2 = rand_range(0, 1); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.number_of_antenna_ports = rand_range(0, 2); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.tpmi = rand_range(0, 63); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.total_dci_length_including_padding = rand_range(0, 255); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_dci_pdu_rel10.n_ul_rb = rand_range(6, 100); + hi_dci0_pdus[2].epdcch_dci_pdu.epdcch_parameters_rel11.tl.tag = NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG; + + hi_dci0_pdus[3].pdu_type = NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE; + hi_dci0_pdus[3].mpdcch_dci_pdu.mpdcch_dci_pdu_rel13.tl.tag = NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG; + + hi_dci0_pdus[4].pdu_type = NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE; + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.tl.tag = NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG; + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.ncce_index = rand_range(0, 1); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.aggregation_level = rand_range(1, 2); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.start_symbol = rand_range(0, 4); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.rnti = rand_range(1, 65535); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.scrambling_reinitialization_batch_index = rand_range(1, 4); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.nrs_antenna_ports_assumed_by_the_ue = rand_range(1, 2); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.subcarrier_indication = rand_range(0, 63); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.resource_assignment = rand_range(0, 7); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.scheduling_delay = rand_range(0, 3); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.mcs = rand_range(0, 12); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.redudancy_version = rand_range(0, 1); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.repetition_number = rand_range(0, 7); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.new_data_indicator = rand_range(0, 1); + hi_dci0_pdus[4].npdcch_dci_pdu.npdcch_dci_pdu_rel13.dci_subframe_repetition_number = rand_range(0, 3); + + hi_dci0_req.hi_dci0_request_body.hi_dci0_pdu_list = hi_dci0_pdus; + mac->hi_dci0_req(mac, &hi_dci0_req); + + uint8_t num_tx_pdus = 2; + nfapi_tx_request_pdu_t tx_pdus[num_tx_pdus]; + memset(&tx_pdus, 0, sizeof(tx_pdus)); + + nfapi_tx_request_t tx_req; + memset(&tx_req, 0, sizeof(tx_req)); + tx_req.header.message_id = NFAPI_TX_REQUEST; + tx_req.header.phy_id = phy_id; + tx_req.sfn_sf = sfn_sf; + + tx_req.tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + tx_req.tx_request_body.number_of_pdus = num_tx_pdus; + + uint32_t data[2]; + data[0] = 0x11223344; + data[1] = 0x55667788; + + tx_pdus[0].pdu_length = 8; + tx_pdus[0].pdu_index = 1; + tx_pdus[0].num_segments = 2; + tx_pdus[0].segments[0].segment_length = 4; + tx_pdus[0].segments[0].segment_data = (uint8_t*)&data[0]; + tx_pdus[0].segments[1].segment_length = 4; + tx_pdus[0].segments[1].segment_data = (uint8_t*)&data[1]; + + tx_pdus[1].pdu_length = 8; + tx_pdus[1].pdu_index = 2; + tx_pdus[1].num_segments = 2; + tx_pdus[1].segments[0].segment_length = 4; + tx_pdus[1].segments[0].segment_data = (uint8_t*)&data[0]; + tx_pdus[1].segments[1].segment_length = 4; + tx_pdus[1].segments[1].segment_data = (uint8_t*)&data[1]; + + + tx_req.tx_request_body.tx_pdu_list = tx_pdus; + mac->tx_req(mac, &tx_req); + } + + void generate_subframe(mac_t *mac, uint16_t phy_id, uint16_t sfn_sf) + { + mac_internal_t* instance = (mac_internal_t*)mac; + + nfapi_dl_config_request_t dl_config_req; + memset(&dl_config_req, 0, sizeof(dl_config_req)); + dl_config_req.header.message_id = NFAPI_DL_CONFIG_REQUEST; + dl_config_req.header.phy_id = phy_id; + dl_config_req.sfn_sf = sfn_sf; + + dl_config_req.dl_config_request_body.tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + dl_config_req.dl_config_request_body.number_pdu = 8; + + nfapi_dl_config_request_pdu_t pdus[8]; + memset(&pdus, 0, sizeof(pdus)); + for(int i = 0; i < 8; i++) + { + pdus[i].pdu_type = NFAPI_DL_CONFIG_BCH_PDU_TYPE; + + pdus[i].bch_pdu.bch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG; + pdus[i].bch_pdu.bch_pdu_rel8.length = 42; + pdus[i].bch_pdu.bch_pdu_rel8.pdu_index = i; + pdus[i].bch_pdu.bch_pdu_rel8.transmission_power = 56; + + } + + dl_config_req.dl_config_request_body.dl_config_pdu_list = pdus; + + /* + vendor_ext_tlv_1 ve; + ve.tl.tag = VENDOR_EXT_TLV_1_TAG; + ve.dummy = 999; + dl_config_req.vendor_extension = &ve.tl; + */ + + mac->dl_config_req(mac, &dl_config_req); + + + nfapi_ul_config_request_t ul_config_req; + memset(&ul_config_req, 0, sizeof(ul_config_req)); + ul_config_req.header.message_id = NFAPI_UL_CONFIG_REQUEST; + ul_config_req.header.phy_id = phy_id; + ul_config_req.sfn_sf = sfn_sf; + mac->ul_config_req(mac, &ul_config_req); + + nfapi_hi_dci0_request_t hi_dci0_req; + memset(&hi_dci0_req, 0, sizeof(hi_dci0_req)); + hi_dci0_req.header.message_id = NFAPI_HI_DCI0_REQUEST; + hi_dci0_req.header.phy_id = phy_id; + hi_dci0_req.sfn_sf = sfn_sf; + mac->hi_dci0_req(mac, &hi_dci0_req); + + + + nfapi_tx_request_t tx_req; + memset(&tx_req, 0, sizeof(tx_req)); + tx_req.header.message_id = NFAPI_TX_REQUEST; + tx_req.header.phy_id = phy_id; + tx_req.sfn_sf = sfn_sf; + + nfapi_tx_request_pdu_t tx_pdus[8]; + + tx_req.tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + tx_req.tx_request_body.number_of_pdus = 0; + tx_req.tx_request_body.tx_pdu_list = &tx_pdus[0]; + + mac_pdu* buff = 0; + int i = 0; + std::list free_list; + do + { + buff = instance->mac->pop_rx_buffer(); + if(buff != 0) + { + if(buff->len == 0) + { + printf("[MAC] Buffer length = 0\n"); + } + + tx_req.tx_request_body.tx_pdu_list[i].pdu_length = buff->len; + tx_req.tx_request_body.tx_pdu_list[i].pdu_index = i; + tx_req.tx_request_body.tx_pdu_list[i].num_segments = 1; + tx_req.tx_request_body.tx_pdu_list[i].segments[0].segment_length = buff->len; + tx_req.tx_request_body.tx_pdu_list[i].segments[0].segment_data = (uint8_t*)buff->buffer; + + tx_req.tx_request_body.number_of_pdus++; + i++; + + instance->mac->byte_count += buff->len; + + free_list.push_back(buff); + } + }while(buff != 0 && i < 8); + + mac->tx_req(mac, &tx_req); + + //for(int j = 0; j < tx_req.tx_request_body.number_of_pdus; ++j) + for(mac_pdu* pdu : free_list) + { + instance->mac->release_mac_pdu(pdu); + //free(tx_req.tx_request_body.tx_pdu_list[j].segments[0].segment_data); + } + } + + void mac_subframe_ind(mac_t *mac, uint16_t phy_id, uint16_t sfn_sf) + { + + + //printf("[MAC] subframe indication phyid:%d sfnsf:%d\n", phy_id, sfn_sf); + mac_internal_t* instance = (mac_internal_t*)mac; + + if(instance->mac->tick == 1000) + { + if(instance->mac->byte_count > 0) + { + printf("[MAC] Rx rate %d bytes/sec\n", instance->mac->byte_count); + instance->mac->byte_count = 0; + } + instance->mac->tick = 0; + } + instance->mac->tick++; + + if(instance->mac->wireshark_test_mode) + { + generate_test_subframe(mac, phy_id, sfn_sf); + } + else + { + generate_subframe(mac, phy_id, sfn_sf); + } + } + + void mac_harq_ind(mac_t* mac, nfapi_harq_indication_t* ind) + { + } + void mac_crc_ind(mac_t* mac, nfapi_crc_indication_t* ind) + { + } + void mac_rx_ind(mac_t* mac, nfapi_rx_indication_t* ind) + { + mac_internal_t* instance = (mac_internal_t*)mac; + + for(int i = 0; i < ind->rx_indication_body.number_of_pdus; ++i) + { + uint16_t len = ind->rx_indication_body.rx_pdu_list[i].rx_indication_rel8.length; + uint8_t* data = ind->rx_indication_body.rx_pdu_list[i].data; + //printf("[MAC] sfnsf:%d len:%d\n", ind->sfn_sf,len); + // + instance->tx_byte_count += len; + + int sendto_result = sendto(instance->tx_sock, data, len, 0, (struct sockaddr*)&(instance->tx_addr), sizeof(instance->tx_addr)); + + if(sendto_result < 0) + { + // error + } + } + + } + void mac_rach_ind(mac_t* mac, nfapi_rach_indication_t* ind) + { + } + void mac_srs_ind(mac_t* mac, nfapi_srs_indication_t* ind) + { + } + void mac_sr_ind(mac_t* mac, nfapi_sr_indication_t* ind) + { + } + void mac_cqi_ind(mac_t* mac, nfapi_cqi_indication_t* ind) + { + } + void mac_lbt_dl_ind(mac_t* mac, nfapi_lbt_dl_indication_t* ind) + { + } + void mac_nb_harq_ind(mac_t* mac, nfapi_nb_harq_indication_t* ind) + { + } + void mac_nrach_ind(mac_t* mac, nfapi_nrach_indication_t* ind) + { + } +} + diff --git a/nfapi/open-nFAPI/vnf_sim/src/main.cpp b/nfapi/open-nFAPI/vnf_sim/src/main.cpp new file mode 100644 index 0000000000..5dc7161157 --- /dev/null +++ b/nfapi/open-nFAPI/vnf_sim/src/main.cpp @@ -0,0 +1,1525 @@ +/* + * Copyright 2017 Cisco Systems, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include + +#include +#include "debug.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pool.h" + +#include +#include +#include +#include +#include + +extern "C" { +#include +#include +#include "mac.h" + +#include + +//int vnf_main(int iPortP5, int, int); +int start_simulated_mac(int*, int*); +int read_xml(const char *xml_file); + +} + +static uint32_t rand_range(uint32_t min, uint32_t max) +{ + return ((rand() % (max + 1 - min)) + min); +} + + +void* vnf_allocate(size_t size) +{ + return (void*)memory_pool::allocate(size); +} + +void vnf_deallocate(void* ptr) +{ + memory_pool::deallocate((uint8_t*)ptr); +} + + + +class udp_data +{ + public: + bool enabled; + uint32_t rx_port; + uint32_t tx_port; + std::string tx_addr; +}; + + +class phy_info +{ + public: + + uint16_t index; + uint16_t id; + + std::vector rfs; + std::vector excluded_rfs; + + int remote_port; + std::string remote_addr; + + uint16_t earfcn; + +}; + +class rf_info +{ + public: + + uint16_t index; + uint16_t band; +}; + +class pnf_info +{ + public: + + std::vector phys; + std::vector rfs; +}; + +class vnf_p7_info +{ + public: + + vnf_p7_info() + : thread_started(false), + config(nfapi_vnf_p7_config_create(), + [] (nfapi_vnf_p7_config_t* f) { nfapi_vnf_p7_config_destory(f); }), + mac(0) + { + local_port = 0; + + timing_window = 0; + periodic_timing_enabled = 0; + aperiodic_timing_enabled = 0; + periodic_timing_period = 0; + + //config = nfapi_vnf_p7_config_create(); + } + + vnf_p7_info(const vnf_p7_info& other) = default; + + vnf_p7_info(vnf_p7_info&& other) = default; + + vnf_p7_info& operator=(const vnf_p7_info&) = default; + + vnf_p7_info& operator=(vnf_p7_info&&) = default; + + + + virtual ~vnf_p7_info() + { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "*** vnf_p7_info delete ***\n"); + + //nfapi_vnf_p7_config_destory(config); + + // should we delete the mac? + } + + + int local_port; + std::string local_addr; + + unsigned timing_window; + unsigned periodic_timing_enabled; + unsigned aperiodic_timing_enabled; + unsigned periodic_timing_period; + + // This is not really the right place if we have multiple PHY, + // should be part of the phy struct + udp_data udp; + + bool thread_started; + + //nfapi_vnf_p7_config_t* config; + std::shared_ptr config; + + mac_t* mac; + + +}; + +class vnf_info +{ + public: + + uint8_t wireshark_test_mode; + + std::map pnfs; + + std::vector p7_vnfs; + +}; + + +/// maybe these should be in the mac file... +int phy_unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMessage, uint8_t *end, void** ve, nfapi_p7_codec_config_t* codec) +{ + (void)tl; + (void)ppReadPackedMessage; + (void)ve; + return -1; +} + +int phy_pack_vendor_extension_tlv(void* ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* codec) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "phy_pack_vendor_extension_tlv\n"); + + nfapi_tl_t* tlv = (nfapi_tl_t*)ve; + switch(tlv->tag) + { + case VENDOR_EXT_TLV_1_TAG: + { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Packing VENDOR_EXT_TLV_1\n"); + vendor_ext_tlv_1* ve = (vendor_ext_tlv_1*)tlv; + if(!push32(ve->dummy, ppWritePackedMsg, end)) + return 0; + return 1; + } + break; + default: + return -1; + break; + } +} + +int vnf_sim_pack_vendor_extension_tlv(void* ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* codec) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "pnf_sim_pack_vendor_extension_tlv\n"); + nfapi_tl_t* tlv = (nfapi_tl_t*)ve; + switch(tlv->tag) + { + case VENDOR_EXT_TLV_2_TAG: + { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "Packing VENDOR_EXT_TLV_2\n"); + vendor_ext_tlv_2* ve = (vendor_ext_tlv_2*)tlv; + if(!push32(ve->dummy, ppWritePackedMsg, end)) + return 0; + return 1; + } + break; + } + return -1; +} + +int vnf_sim_unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMessage, uint8_t *end, void** ve, nfapi_p4_p5_codec_config_t* codec) +{ + return -1; +} + + + + +int phy_unpack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t** ppReadPackedMessage, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P7_VENDOR_EXT_IND) + { + vendor_ext_p7_ind* req = (vendor_ext_p7_ind*)(header); + if(!pull16(ppReadPackedMessage, &req->error_code, end)) + return 0; + } + return 1; +} + +int phy_pack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t** ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P7_VENDOR_EXT_REQ) + { + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + vendor_ext_p7_req* req = (vendor_ext_p7_req*)(header); + if(!(push16(req->dummy1, ppWritePackedMsg, end) && + push16(req->dummy2, ppWritePackedMsg, end))) + return 0; + } + return 1; +} + +int vnf_sim_unpack_p4_p5_vendor_extension(nfapi_p4_p5_message_header_t* header, uint8_t** ppReadPackedMessage, uint8_t *end, nfapi_p4_p5_codec_config_t* codec) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P5_VENDOR_EXT_RSP) + { + vendor_ext_p5_rsp* req = (vendor_ext_p5_rsp*)(header); + return(!pull16(ppReadPackedMessage, &req->error_code, end)); + } + return 0; +} + +int vnf_sim_pack_p4_p5_vendor_extension(nfapi_p4_p5_message_header_t* header, uint8_t** ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* codec) +{ + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s\n", __FUNCTION__); + if(header->message_id == P5_VENDOR_EXT_REQ) + { + vendor_ext_p5_req* req = (vendor_ext_p5_req*)(header); + //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s %d %d\n", __FUNCTION__, req->dummy1, req->dummy2); + return (!(push16(req->dummy1, ppWritePackedMsg, end) && + push16(req->dummy2, ppWritePackedMsg, end))); + } + return 0; +} + +void vnf_sim_trace(nfapi_trace_level_t level, const char* message, ...) +{ + va_list args; + va_start(args, message); + vprintf(message, args); + va_end(args); +} + +void mac_dl_config_req(mac_t* mac, nfapi_dl_config_request_t* req) +{ + vnf_p7_info* info = (vnf_p7_info*)(mac->user_data); + + nfapi_vnf_p7_dl_config_req(info->config.get(), req); +} + +void mac_ul_config_req(mac_t* mac, nfapi_ul_config_request_t* req) +{ + vnf_p7_info* info = (vnf_p7_info*)(mac->user_data); + + nfapi_vnf_p7_ul_config_req(info->config.get(), req); +} + +void mac_hi_dci0_req(mac_t* mac, nfapi_hi_dci0_request_t* req) +{ + vnf_p7_info* info = (vnf_p7_info*)(mac->user_data); + + nfapi_vnf_p7_hi_dci0_req(info->config.get(), req); +} + +void mac_tx_req(mac_t* mac, nfapi_tx_request_t* req) +{ + vnf_p7_info* info = (vnf_p7_info*)(mac->user_data); + + nfapi_vnf_p7_tx_req(info->config.get(), req); +} + +int phy_subframe_indication(struct nfapi_vnf_p7_config* config, uint16_t phy_id, uint16_t sfn_sf) +{ + //printf("[VNF_SIM] subframe indication %d\n", sfn_sf); + vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + mac_subframe_ind(p7_vnf->mac, phy_id, sfn_sf); + return 0; +} +int phy_harq_indication(struct nfapi_vnf_p7_config* config, nfapi_harq_indication_t* ind) +{ + vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + mac_harq_ind(p7_vnf->mac, ind); + return 1; +} +int phy_crc_indication(struct nfapi_vnf_p7_config* config, nfapi_crc_indication_t* ind) +{ + vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + mac_crc_ind(p7_vnf->mac, ind); + return 1; +} +int phy_rx_indication(struct nfapi_vnf_p7_config* config, nfapi_rx_indication_t* ind) +{ + vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + mac_rx_ind(p7_vnf->mac, ind); + return 1; +} +int phy_rach_indication(struct nfapi_vnf_p7_config* config, nfapi_rach_indication_t* ind) +{ + vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + mac_rach_ind(p7_vnf->mac, ind); + return 1; +} +int phy_srs_indication(struct nfapi_vnf_p7_config* config, nfapi_srs_indication_t* ind) +{ + vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + mac_srs_ind(p7_vnf->mac, ind); + return 1; +} +int phy_sr_indication(struct nfapi_vnf_p7_config* config, nfapi_sr_indication_t* ind) +{ + vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + mac_sr_ind(p7_vnf->mac, ind); + return 1; +} +int phy_cqi_indication(struct nfapi_vnf_p7_config* config, nfapi_cqi_indication_t* ind) +{ + vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + mac_cqi_ind(p7_vnf->mac, ind); + return 1; +} +int phy_lbt_dl_indication(struct nfapi_vnf_p7_config* config, nfapi_lbt_dl_indication_t* ind) +{ + vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + mac_lbt_dl_ind(p7_vnf->mac, ind); + return 1; +} +int phy_nb_harq_indication(struct nfapi_vnf_p7_config* config, nfapi_nb_harq_indication_t* ind) +{ + vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + mac_nb_harq_ind(p7_vnf->mac, ind); + return 1; +} +int phy_nrach_indication(struct nfapi_vnf_p7_config* config, nfapi_nrach_indication_t* ind) +{ + vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data); + mac_nrach_ind(p7_vnf->mac, ind); + return 1; +} +int phy_vendor_ext(struct nfapi_vnf_p7_config* config, nfapi_p7_message_header_t* msg) +{ + if(msg->message_id == P7_VENDOR_EXT_IND) + { + //vendor_ext_p7_ind* ind = (vendor_ext_p7_ind*)msg; + //printf("[VNF_SIM] vendor_ext (error_code:%d)\n", ind->error_code); + } + else + { + printf("[VNF_SIM] unknown %d\n", msg->message_id); + } + return 0; +} +nfapi_p7_message_header_t* phy_allocate_p7_vendor_ext(uint16_t message_id, uint16_t* msg_size) +{ + if(message_id == P7_VENDOR_EXT_IND) + { + *msg_size = sizeof(vendor_ext_p7_ind); + return (nfapi_p7_message_header_t*)malloc(sizeof(vendor_ext_p7_ind)); + } + return 0; +} +void phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t* header) +{ + free(header); +} + +//static pthread_t vnf_start_pthread; +static pthread_t vnf_p7_start_pthread; +void* vnf_p7_start_thread(void *ptr) +{ + printf("%s()\n", __FUNCTION__); + + //std::shared_ptr config = std::shared_ptr(ptr); + nfapi_vnf_p7_config_t *config = (nfapi_vnf_p7_config_t *)ptr; + + nfapi_vnf_p7_start(config); + + return 0; +} + +void set_thread_priority(int priority) +{ + //printf("%s(priority:%d)\n", __FUNCTION__, priority); + + pthread_attr_t ptAttr; + + struct sched_param schedParam; + schedParam.__sched_priority = priority; //79; + if(sched_setscheduler(0, SCHED_RR, &schedParam) != 0) + { + printf("Failed to set scheduler to SCHED_RR\n"); + } + + if(pthread_attr_setschedpolicy(&ptAttr, SCHED_RR) != 0) + { + printf("Failed to set pthread sched policy SCHED_RR\n"); + } + + pthread_attr_setinheritsched(&ptAttr, PTHREAD_EXPLICIT_SCHED); + + struct sched_param thread_params; + thread_params.sched_priority = 20; + if(pthread_attr_setschedparam(&ptAttr, &thread_params) != 0) + { + printf("failed to set sched param\n"); + } +} + +void* vnf_p7_thread_start(void* ptr) +{ + printf("%s()\n", __FUNCTION__); + + set_thread_priority(79); + + vnf_p7_info* p7_vnf = (vnf_p7_info*)ptr; + + p7_vnf->config->port = p7_vnf->local_port; + p7_vnf->config->subframe_indication = &phy_subframe_indication; + p7_vnf->config->harq_indication = &phy_harq_indication; + p7_vnf->config->crc_indication = &phy_crc_indication; + p7_vnf->config->rx_indication = &phy_rx_indication; + p7_vnf->config->rach_indication = &phy_rach_indication; + p7_vnf->config->srs_indication = &phy_srs_indication; + p7_vnf->config->sr_indication = &phy_sr_indication; + p7_vnf->config->cqi_indication = &phy_cqi_indication; + p7_vnf->config->lbt_dl_indication = &phy_lbt_dl_indication; + p7_vnf->config->nb_harq_indication = &phy_nb_harq_indication; + p7_vnf->config->nrach_indication = &phy_nrach_indication; + p7_vnf->config->malloc = &vnf_allocate; + p7_vnf->config->free = &vnf_deallocate; + + p7_vnf->config->trace = &vnf_sim_trace; + + p7_vnf->config->vendor_ext = &phy_vendor_ext; + p7_vnf->config->user_data = p7_vnf; + + p7_vnf->mac->user_data = p7_vnf; + + p7_vnf->config->codec_config.unpack_p7_vendor_extension = &phy_unpack_p7_vendor_extension; + p7_vnf->config->codec_config.pack_p7_vendor_extension = &phy_pack_p7_vendor_extension; + p7_vnf->config->codec_config.unpack_vendor_extension_tlv = &phy_unpack_vendor_extension_tlv; + p7_vnf->config->codec_config.pack_vendor_extension_tlv = &phy_pack_vendor_extension_tlv; + p7_vnf->config->codec_config.allocate = &vnf_allocate; + p7_vnf->config->codec_config.deallocate = &vnf_deallocate; + + p7_vnf->config->allocate_p7_vendor_ext = &phy_allocate_p7_vendor_ext; + p7_vnf->config->deallocate_p7_vendor_ext = &phy_deallocate_p7_vendor_ext; + + printf("[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__); + pthread_create(&vnf_p7_start_pthread, NULL, &vnf_p7_start_thread, p7_vnf->config.get()); + + return 0; +} + +int pnf_connection_indication_cb(nfapi_vnf_config_t* config, int p5_idx) +{ + printf("[VNF_SIM] pnf connection indication idx:%d\n", p5_idx); + + pnf_info pnf; + vnf_info* vnf = (vnf_info*)(config->user_data); + vnf->pnfs.insert(std::pair(p5_idx, pnf)); + + nfapi_pnf_param_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PNF_PARAM_REQUEST; + nfapi_vnf_pnf_param_req(config, p5_idx, &req); + return 0; +} +int pnf_disconnection_indication_cb(nfapi_vnf_config_t* config, int p5_idx) +{ + printf("[VNF_SIM] pnf disconnection indication idx:%d\n", p5_idx); + + + vnf_info* vnf = (vnf_info*)(config->user_data); + auto find_result = vnf->pnfs.find(p5_idx); + + if(find_result != vnf->pnfs.end()) + { + pnf_info& pnf = find_result->second; + + for(phy_info& phy : pnf.phys) + { + vnf_p7_info& p7_vnf = vnf->p7_vnfs[0]; + nfapi_vnf_p7_del_pnf((p7_vnf.config.get()), phy.id); + } + } + + return 0; +} + +int pnf_param_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_param_response_t* resp) +{ + printf("[VNF_SIM] pnf param response idx:%d error:%d\n", p5_idx, resp->error_code); + + vnf_info* vnf = (vnf_info*)(config->user_data); + + auto find_result = vnf->pnfs.find(p5_idx); + if(find_result != vnf->pnfs.end()) + { + pnf_info& pnf = find_result->second; + + for(int i = 0; i < resp->pnf_phy.number_of_phys; ++i) + { + phy_info phy; + phy.index = resp->pnf_phy.phy[i].phy_config_index; + + printf("[VNF_SIM] (PHY:%d) phy_config_idx:%d\n", i, resp->pnf_phy.phy[i].phy_config_index); + + nfapi_vnf_allocate_phy(config, p5_idx, &(phy.id)); + + + + for(int j = 0; j < resp->pnf_phy.phy[i].number_of_rfs; ++j) + { + printf("[VNF_SIM] (PHY:%d) (RF%d) %d\n", i, j, resp->pnf_phy.phy[i].rf_config[j].rf_config_index); + phy.rfs.push_back(resp->pnf_phy.phy[i].rf_config[j].rf_config_index); + } + + + pnf.phys.push_back(phy); + } + for(int i = 0; i < resp->pnf_rf.number_of_rfs; ++i) + { + rf_info rf; + rf.index = resp->pnf_rf.rf[i].rf_config_index; + + printf("[VNF_SIM] (RF:%d) rf_config_idx:%d\n", i, resp->pnf_rf.rf[i].rf_config_index); + + pnf.rfs.push_back(rf); + } + + nfapi_pnf_config_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PNF_CONFIG_REQUEST; + + req.pnf_phy_rf_config.tl.tag = NFAPI_PNF_PHY_RF_TAG; + req.pnf_phy_rf_config.number_phy_rf_config_info = pnf.phys.size(); + + for(unsigned i = 0; i < pnf.phys.size(); ++i) + { + req.pnf_phy_rf_config.phy_rf_config[i].phy_id = pnf.phys[i].id; + req.pnf_phy_rf_config.phy_rf_config[i].phy_config_index = pnf.phys[i].index; + req.pnf_phy_rf_config.phy_rf_config[i].rf_config_index = pnf.phys[i].rfs[0]; + } + + + nfapi_vnf_pnf_config_req(config, p5_idx, &req); + } + return 0; +} + +int pnf_config_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_config_response_t* resp) +{ + printf("[VNF_SIM] pnf config response idx:%d\n", p5_idx); + + if(1) + { + vnf_info* vnf = (vnf_info*)(config->user_data); + auto find_result = vnf->pnfs.find(p5_idx); + if(find_result != vnf->pnfs.end()) + { + //pnf_info& pnf = find_result->second; + + nfapi_pnf_start_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PNF_START_REQUEST; + nfapi_vnf_pnf_start_req(config, p5_idx, &req); + } + } + else + { + // Rather than send the pnf_start_request we will demonstrate + // sending a vendor extention message. The start request will be + // send when the vendor extension response is received + + //vnf_info* vnf = (vnf_info*)(config->user_data); + vendor_ext_p5_req req; + memset(&req, 0, sizeof(req)); + req.header.message_id = P5_VENDOR_EXT_REQ; + req.dummy1 = 45; + req.dummy2 = 1977; + nfapi_vnf_vendor_extension(config, p5_idx, &req.header); + } + return 0; +} + +int pnf_start_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_pnf_start_response_t* resp) +{ + printf("[VNF_SIM] pnf start response idx:%d\n", p5_idx); + + vnf_info* vnf = (vnf_info*)(config->user_data); + vnf_p7_info& p7_vnf = vnf->p7_vnfs[0]; + + if(p7_vnf.thread_started == false) + { + pthread_t vnf_p7_thread; + pthread_create(&vnf_p7_thread, NULL, &vnf_p7_thread_start, &p7_vnf); + p7_vnf.thread_started = true; + } + else + { + // P7 thread already running. + } + + // start all the phys in the pnf. + + auto find_result = vnf->pnfs.find(p5_idx); + if(find_result != vnf->pnfs.end()) + { + pnf_info& pnf = find_result->second; + + for(unsigned i = 0; i < pnf.phys.size(); ++i) + { + pnf_info& pnf = find_result->second; + + nfapi_param_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PARAM_REQUEST; + req.header.phy_id = pnf.phys[i].id; + nfapi_vnf_param_req(config, p5_idx, &req); + } + } + + return 0; +} +int param_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_param_response_t* resp) +{ + printf("[VNF_SIM] param response idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id); + + vnf_info* vnf = (vnf_info*)(config->user_data); + + auto find_result = vnf->pnfs.find(p5_idx); + if(find_result != vnf->pnfs.end()) + { + pnf_info& pnf = find_result->second; + + + auto found = std::find_if(pnf.phys.begin(), pnf.phys.end(), [&](phy_info& item) + { return item.id == resp->header.phy_id; }); + + if(found != pnf.phys.end()) + { + phy_info& phy = (*found); + + phy.remote_port = resp->nfapi_config.p7_pnf_port.value; + + struct sockaddr_in pnf_p7_sockaddr; + memcpy(&pnf_p7_sockaddr.sin_addr.s_addr, &(resp->nfapi_config.p7_pnf_address_ipv4.address[0]), 4); + + phy.remote_addr = inet_ntoa(pnf_p7_sockaddr.sin_addr); + + // for now just 1 + vnf_p7_info& p7_vnf = vnf->p7_vnfs[0]; + + printf("[VNF_SIM] %d.%d pnf p7 %s:%d timing %d %d %d %d\n", p5_idx, phy.id, phy.remote_addr.c_str(), phy.remote_port, p7_vnf.timing_window, p7_vnf.periodic_timing_period, p7_vnf.aperiodic_timing_enabled, p7_vnf.periodic_timing_period); + + + nfapi_config_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_CONFIG_REQUEST; + req.header.phy_id = phy.id; + + + req.nfapi_config.p7_vnf_port.tl.tag = NFAPI_NFAPI_P7_VNF_PORT_TAG; + req.nfapi_config.p7_vnf_port.value = p7_vnf.local_port; + req.num_tlv++; + + req.nfapi_config.p7_vnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG; + struct sockaddr_in vnf_p7_sockaddr; + vnf_p7_sockaddr.sin_addr.s_addr = inet_addr(p7_vnf.local_addr.c_str()); + memcpy(&(req.nfapi_config.p7_vnf_address_ipv4.address[0]), &vnf_p7_sockaddr.sin_addr.s_addr, 4); + req.num_tlv++; + + req.nfapi_config.timing_window.tl.tag = NFAPI_NFAPI_TIMING_WINDOW_TAG; + req.nfapi_config.timing_window.value = p7_vnf.timing_window; + req.num_tlv++; + + if(p7_vnf.periodic_timing_enabled || p7_vnf.aperiodic_timing_enabled) + { + req.nfapi_config.timing_info_mode.tl.tag = NFAPI_NFAPI_TIMING_INFO_MODE_TAG; + req.nfapi_config.timing_info_mode.value = (p7_vnf.aperiodic_timing_enabled << 1) | (p7_vnf.periodic_timing_enabled); + req.num_tlv++; + + if(p7_vnf.periodic_timing_enabled) + { + req.nfapi_config.timing_info_period.tl.tag = NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG; + req.nfapi_config.timing_info_period.value = p7_vnf.periodic_timing_period; + req.num_tlv++; + } + } + + req.nfapi_config.earfcn.tl.tag = NFAPI_NFAPI_EARFCN_TAG; + req.nfapi_config.earfcn.value = phy.earfcn; + req.num_tlv++; + + + if(1) + { + // Poplate all tlv for wireshark testing + req.subframe_config.duplex_mode.tl.tag = NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG; + req.num_tlv++; + + req.subframe_config.pcfich_power_offset.tl.tag = NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG; + req.num_tlv++; + req.subframe_config.pb.tl.tag = NFAPI_SUBFRAME_CONFIG_PB_TAG; + req.num_tlv++; + req.subframe_config.dl_cyclic_prefix_type.tl.tag = NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG; + req.num_tlv++; + req.subframe_config.ul_cyclic_prefix_type.tl.tag = NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG; + req.num_tlv++; + + req.rf_config.dl_channel_bandwidth.tl.tag = NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG; + req.num_tlv++; + req.rf_config.ul_channel_bandwidth.tl.tag = NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG; + req.num_tlv++; + req.rf_config.reference_signal_power.tl.tag = NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG; + req.num_tlv++; + req.rf_config.tx_antenna_ports.tl.tag = NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG; + req.num_tlv++; + req.rf_config.rx_antenna_ports.tl.tag = NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG; + req.num_tlv++; + + req.phich_config.phich_resource.tl.tag = NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG; + req.num_tlv++; + req.phich_config.phich_duration.tl.tag = NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG; + req.num_tlv++; + req.phich_config.phich_power_offset.tl.tag = NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG; + req.num_tlv++; + + req.sch_config.primary_synchronization_signal_epre_eprers.tl.tag = NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG; + req.num_tlv++; + req.sch_config.secondary_synchronization_signal_epre_eprers.tl.tag = NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG; + req.num_tlv++; + req.sch_config.physical_cell_id.tl.tag = NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG; + req.num_tlv++; + + req.prach_config.configuration_index.tl.tag = NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG; + req.num_tlv++; + req.prach_config.root_sequence_index.tl.tag = NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG; + req.num_tlv++; + req.prach_config.zero_correlation_zone_configuration.tl.tag = NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG; + req.num_tlv++; + req.prach_config.high_speed_flag.tl.tag = NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG; + req.num_tlv++; + req.prach_config.frequency_offset.tl.tag = NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG; + req.num_tlv++; + + req.pusch_config.hopping_mode.tl.tag = NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG; + req.num_tlv++; + req.pusch_config.hopping_offset.tl.tag = NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG; + req.num_tlv++; + req.pusch_config.number_of_subbands.tl.tag = NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG; + req.num_tlv++; + + req.pucch_config.delta_pucch_shift.tl.tag = NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG; + req.num_tlv++; + req.pucch_config.n_cqi_rb.tl.tag = NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG; + req.num_tlv++; + req.pucch_config.n_an_cs.tl.tag = NFAPI_PUCCH_CONFIG_N_AN_CS_TAG; + req.num_tlv++; + req.pucch_config.n1_pucch_an.tl.tag = NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG; + req.num_tlv++; + + req.srs_config.bandwidth_configuration.tl.tag = NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG; + req.num_tlv++; + req.srs_config.max_up_pts.tl.tag = NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG; + req.num_tlv++; + req.srs_config.srs_subframe_configuration.tl.tag = NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG; + req.num_tlv++; + req.srs_config.srs_acknack_srs_simultaneous_transmission.tl.tag = NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG; + req.num_tlv++; + + req.uplink_reference_signal_config.uplink_rs_hopping.tl.tag = NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG; + req.num_tlv++; + req.uplink_reference_signal_config.group_assignment.tl.tag = NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG; + req.num_tlv++; + req.uplink_reference_signal_config.cyclic_shift_1_for_drms.tl.tag = NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG; + req.num_tlv++; + + req.laa_config.ed_threshold_lbt_pdsch.tl.tag = NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG; + req.num_tlv++; + req.laa_config.ed_threshold_lbt_drs.tl.tag = NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG; + req.num_tlv++; + req.laa_config.pd_threshold.tl.tag = NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG; + req.num_tlv++; + req.laa_config.multi_carrier_type.tl.tag = NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG; + req.num_tlv++; + req.laa_config.multi_carrier_tx.tl.tag = NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG; + req.num_tlv++; + req.laa_config.multi_carrier_freeze.tl.tag = NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG; + req.num_tlv++; + req.laa_config.tx_antenna_ports_drs.tl.tag = NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG; + req.num_tlv++; + req.laa_config.tx_power_drs.tl.tag = NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG; + req.num_tlv++; + + req.emtc_config.pbch_repetitions_enable_r13.tl.tag = NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG; + req.num_tlv++; + req.emtc_config.prach_catm_root_sequence_index.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG; + req.num_tlv++; + req.emtc_config.prach_catm_zero_correlation_zone_configuration.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG; + req.num_tlv++; + req.emtc_config.prach_catm_high_speed_flag.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_0_enable.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_0_configuration_index.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_0_frequency_offset.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_0_starting_subframe_periodicity.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_0_hopping_enable.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_0_hopping_offset.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_1_enable.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_1_configuration_index.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_1_frequency_offset.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_1_starting_subframe_periodicity.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_1_hopping_enable.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_1_hopping_offset.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_2_enable.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_2_configuration_index.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_2_frequency_offset.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_2_starting_subframe_periodicity.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_2_hopping_enable.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_2_hopping_offset.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_3_enable.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_3_configuration_index.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_3_frequency_offset.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_3_starting_subframe_periodicity.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_3_hopping_enable.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG; + req.num_tlv++; + req.emtc_config.prach_ce_level_3_hopping_offset.tl.tag = NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG; + req.num_tlv++; + req.emtc_config.pucch_interval_ulhoppingconfigcommonmodea.tl.tag = NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG; + req.num_tlv++; + req.emtc_config.pucch_interval_ulhoppingconfigcommonmodeb.tl.tag = NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG; + req.num_tlv++; + + req.nb_iot_config.operating_mode.tl.tag = NFAPI_NB_IOT_CONFIG_OPERATING_MODE_TAG; + req.nb_iot_config.operating_mode.value = rand_range(0, 3); + req.num_tlv++; + req.nb_iot_config.anchor.tl.tag = NFAPI_NB_IOT_CONFIG_ANCHOR_TAG; + req.nb_iot_config.anchor.value = rand_range(0, 1); + req.num_tlv++; + req.nb_iot_config.prb_index.tl.tag = NFAPI_NB_IOT_CONFIG_PRB_INDEX_TAG; + req.nb_iot_config.prb_index.value = rand_range(0, 0x1F); + req.num_tlv++; + req.nb_iot_config.control_region_size.tl.tag = NFAPI_NB_IOT_CONFIG_CONTROL_REGION_SIZE_TAG; + req.nb_iot_config.control_region_size.value = rand_range(1, 4); + req.num_tlv++; + req.nb_iot_config.assumed_crs_aps.tl.tag = NFAPI_NB_IOT_CONFIG_ASSUMED_CRS_APS_TAG; + req.nb_iot_config.assumed_crs_aps.value = rand_range(0, 1); + req.num_tlv++; + req.nb_iot_config.nprach_config_0_enabled.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_ENABLED_TAG; + req.nb_iot_config.nprach_config_0_enabled.value = rand_range(0, 1); + req.num_tlv++; + req.nb_iot_config.nprach_config_0_sf_periodicity.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_SF_PERIODICITY_TAG; + req.nb_iot_config.nprach_config_0_sf_periodicity.value = rand_range(0, 7); + req.num_tlv++; + req.nb_iot_config.nprach_config_0_start_time.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_START_TIME_TAG; + req.nb_iot_config.nprach_config_0_start_time.value = rand_range(0, 7); + req.num_tlv++; + req.nb_iot_config.nprach_config_0_subcarrier_offset.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_SUBCARRIER_OFFSET_TAG; + req.nb_iot_config.nprach_config_0_subcarrier_offset.value = rand_range(0, 6); + req.num_tlv++; + req.nb_iot_config.nprach_config_0_number_of_subcarriers.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_NUMBER_OF_SUBCARRIERS_TAG; + req.nb_iot_config.nprach_config_0_number_of_subcarriers.value = rand_range(0, 3); + req.num_tlv++; + req.nb_iot_config.nprach_config_0_cp_length.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_CP_LENGTH_TAG; + req.nb_iot_config.nprach_config_0_cp_length.value = rand_range(0, 1); + req.num_tlv++; + req.nb_iot_config.nprach_config_0_number_of_repetitions_per_attempt.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG; + req.nb_iot_config.nprach_config_0_number_of_repetitions_per_attempt.value = rand_range(0, 7); + req.num_tlv++; + req.nb_iot_config.nprach_config_1_enabled.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_ENABLED_TAG; + req.nb_iot_config.nprach_config_1_enabled.value = rand_range(0, 1); + req.num_tlv++; + req.nb_iot_config.nprach_config_1_sf_periodicity.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_SF_PERIODICITY_TAG; + req.nb_iot_config.nprach_config_1_sf_periodicity.value = rand_range(0, 7); + req.num_tlv++; + req.nb_iot_config.nprach_config_1_start_time.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_START_TIME_TAG; + req.nb_iot_config.nprach_config_1_start_time.value = rand_range(0, 7); + req.num_tlv++; + req.nb_iot_config.nprach_config_1_subcarrier_offset.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_SUBCARRIER_OFFSET_TAG; + req.nb_iot_config.nprach_config_1_subcarrier_offset.value = rand_range(0, 6); + req.num_tlv++; + req.nb_iot_config.nprach_config_1_number_of_subcarriers.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_NUMBER_OF_SUBCARRIERS_TAG; + req.nb_iot_config.nprach_config_1_number_of_subcarriers.value = rand_range(0, 3); + req.num_tlv++; + req.nb_iot_config.nprach_config_1_cp_length.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_CP_LENGTH_TAG; + req.nb_iot_config.nprach_config_1_cp_length.value = rand_range(0, 1); + req.num_tlv++; + req.nb_iot_config.nprach_config_1_number_of_repetitions_per_attempt.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG; + req.nb_iot_config.nprach_config_1_number_of_repetitions_per_attempt.value = rand_range(0, 7); + req.num_tlv++; + req.nb_iot_config.nprach_config_2_enabled.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_ENABLED_TAG; + req.nb_iot_config.nprach_config_2_enabled.value = rand_range(0, 1); + req.num_tlv++; + req.nb_iot_config.nprach_config_2_sf_periodicity.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_SF_PERIODICITY_TAG; + req.nb_iot_config.nprach_config_2_sf_periodicity.value = rand_range(0, 7); + req.num_tlv++; + req.nb_iot_config.nprach_config_2_start_time.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_START_TIME_TAG; + req.nb_iot_config.nprach_config_2_start_time.value = rand_range(0, 7); + req.num_tlv++; + req.nb_iot_config.nprach_config_2_subcarrier_offset.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_SUBCARRIER_OFFSET_TAG; + req.nb_iot_config.nprach_config_2_subcarrier_offset.value = rand_range(0, 6); + req.num_tlv++; + req.nb_iot_config.nprach_config_2_number_of_subcarriers.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_NUMBER_OF_SUBCARRIERS_TAG; + req.nb_iot_config.nprach_config_2_number_of_subcarriers.value = rand_range(0, 3); + req.num_tlv++; + req.nb_iot_config.nprach_config_2_cp_length.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_CP_LENGTH_TAG; + req.nb_iot_config.nprach_config_2_cp_length.value = rand_range(0, 1); + req.num_tlv++; + req.nb_iot_config.nprach_config_2_number_of_repetitions_per_attempt.tl.tag = NFAPI_NB_IOT_CONFIG_NPRACH_CONFIG_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG; + req.nb_iot_config.nprach_config_2_number_of_repetitions_per_attempt.value = rand_range(0, 7); + req.num_tlv++; + req.nb_iot_config.three_tone_base_sequence.tl.tag = NFAPI_NB_IOT_CONFIG_THREE_TONE_BASE_SEQUENCE_TAG; + req.nb_iot_config.three_tone_base_sequence.value = rand_range(0, 0x0F); + req.num_tlv++; + req.nb_iot_config.six_tone_base_sequence.tl.tag = NFAPI_NB_IOT_CONFIG_SIX_TONE_BASE_SEQUENCE_TAG; + req.nb_iot_config.six_tone_base_sequence.value = rand_range(0, 0x03); + req.num_tlv++; + req.nb_iot_config.twelve_tone_base_sequence.tl.tag = NFAPI_NB_IOT_CONFIG_TWELVE_TONE_BASE_SEQUENCE_TAG; + req.nb_iot_config.twelve_tone_base_sequence.value = rand_range(0, 0x1F); + req.num_tlv++; + req.nb_iot_config.three_tone_cyclic_shift.tl.tag = NFAPI_NB_IOT_CONFIG_THREE_TONE_CYCLIC_SHIFT_TAG; + req.nb_iot_config.three_tone_cyclic_shift.value = rand_range(0, 5); // what is the max + req.num_tlv++; + req.nb_iot_config.six_tone_cyclic_shift.tl.tag = NFAPI_NB_IOT_CONFIG_SIX_TONE_CYCLIC_SHIFT_TAG; + req.nb_iot_config.six_tone_cyclic_shift.value = rand_range(0, 5); // what is the max + req.num_tlv++; + req.nb_iot_config.dl_gap_config_enable.tl.tag = NFAPI_NB_IOT_CONFIG_DL_GAP_CONFIG_ENABLE_TAG; + req.nb_iot_config.dl_gap_config_enable.value = rand_range(0, 1); + req.num_tlv++; + req.nb_iot_config.dl_gap_threshold.tl.tag = NFAPI_NB_IOT_CONFIG_DL_GAP_THRESHOLD_TAG; + req.nb_iot_config.dl_gap_threshold.value = rand_range(0, 3); + req.num_tlv++; + req.nb_iot_config.dl_gap_periodicity.tl.tag = NFAPI_NB_IOT_CONFIG_DL_GAP_PERIODICITY_TAG; + req.nb_iot_config.dl_gap_periodicity.value = rand_range(0, 3); + req.num_tlv++; + req.nb_iot_config.dl_gap_duration_coefficient.tl.tag = NFAPI_NB_IOT_CONFIG_DL_GAP_DURATION_COEFFICIENT_TAG; + req.nb_iot_config.dl_gap_duration_coefficient.value = rand_range(0, 3); + req.num_tlv++; + + req.tdd_frame_structure_config.subframe_assignment.tl.tag = NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG; + req.num_tlv++; + req.tdd_frame_structure_config.special_subframe_patterns.tl.tag = NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG; + req.num_tlv++; + + req.l23_config.data_report_mode.tl.tag = NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG; + req.num_tlv++; + req.l23_config.sfnsf.tl.tag = NFAPI_L23_CONFIG_SFNSF_TAG; + req.num_tlv++; + } + + vendor_ext_tlv_2 ve2; + memset(&ve2, 0, sizeof(ve2)); + ve2.tl.tag = VENDOR_EXT_TLV_2_TAG; + ve2.dummy = 2016; + req.vendor_extension = &ve2.tl; + + nfapi_vnf_config_req(config, p5_idx, &req); + } + else + { + printf("[VNF_SIM] param response failed to find pnf %d phy %d\n", p5_idx, resp->header.phy_id); + } + } + else + { + printf("[VNF_SIM] param response failed to find pnf %d\n", p5_idx); + } + + return 0; +} + +int config_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_config_response_t* resp) +{ + printf("[VNF_SIM] config response idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id); + + + nfapi_start_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_START_REQUEST; + req.header.phy_id = resp->header.phy_id; + nfapi_vnf_start_req(config, p5_idx, &req); + + return 0; +} + +void test_p4_requests(nfapi_vnf_config_t* config, int p5_idx, int phy_id) +{ + { + nfapi_measurement_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_MEASUREMENT_REQUEST; + req.header.phy_id = phy_id; + + req.dl_rs_tx_power.tl.tag = NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG; + req.dl_rs_tx_power.value = 42; + req.received_interference_power.tl.tag = NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG; + req.received_interference_power.value = 42; + req.thermal_noise_power.tl.tag = NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG; + req.thermal_noise_power.value = 42; + + nfapi_vnf_measurement_req(config, p5_idx, &req); + } + { + nfapi_rssi_request_t lte_req; + memset(<e_req, 0, sizeof(lte_req)); + lte_req.header.message_id = NFAPI_RSSI_REQUEST; + lte_req.header.phy_id = phy_id; + + lte_req.rat_type = NFAPI_RAT_TYPE_LTE; + lte_req.lte_rssi_request.tl.tag = NFAPI_LTE_RSSI_REQUEST_TAG; + lte_req.lte_rssi_request.frequency_band_indicator = 2; + lte_req.lte_rssi_request.measurement_period = 1000; + lte_req.lte_rssi_request.bandwidth = 50; + lte_req.lte_rssi_request.timeout = 0; + lte_req.lte_rssi_request.number_of_earfcns = 2; + lte_req.lte_rssi_request.earfcn[0] = 389; + lte_req.lte_rssi_request.earfcn[1] = 123; + + nfapi_vnf_rssi_request(config, p5_idx, <e_req); + + nfapi_rssi_request_t utran_req; + memset(&utran_req, 0, sizeof(utran_req)); + utran_req.header.message_id = NFAPI_RSSI_REQUEST; + utran_req.header.phy_id = phy_id; + + utran_req.rat_type = NFAPI_RAT_TYPE_UTRAN; + utran_req.utran_rssi_request.tl.tag = NFAPI_UTRAN_RSSI_REQUEST_TAG; + utran_req.utran_rssi_request.frequency_band_indicator = 2; + utran_req.utran_rssi_request.measurement_period = 1000; + utran_req.utran_rssi_request.timeout = 0; + utran_req.utran_rssi_request.number_of_uarfcns = 2; + utran_req.utran_rssi_request.uarfcn[0] = 2348; + utran_req.utran_rssi_request.uarfcn[1] = 52; + + nfapi_vnf_rssi_request(config, p5_idx, &utran_req); + + + nfapi_rssi_request_t geran_req; + memset(&geran_req, 0, sizeof(geran_req)); + geran_req.header.message_id = NFAPI_RSSI_REQUEST; + geran_req.header.phy_id = phy_id; + + geran_req.rat_type = NFAPI_RAT_TYPE_GERAN; + geran_req.geran_rssi_request.tl.tag = NFAPI_GERAN_RSSI_REQUEST_TAG; + geran_req.geran_rssi_request.frequency_band_indicator = 2; + geran_req.geran_rssi_request.measurement_period = 1000; + geran_req.geran_rssi_request.timeout = 0; + geran_req.geran_rssi_request.number_of_arfcns = 1; + geran_req.geran_rssi_request.arfcn[0].arfcn = 34; + geran_req.geran_rssi_request.arfcn[0].direction = 0; + + nfapi_vnf_rssi_request(config, p5_idx, &geran_req); + } + { + nfapi_cell_search_request_t lte_req; + memset(<e_req, 0, sizeof(lte_req)); + lte_req.header.message_id = NFAPI_CELL_SEARCH_REQUEST; + lte_req.header.phy_id = phy_id; + + lte_req.rat_type = NFAPI_RAT_TYPE_LTE; + lte_req.lte_cell_search_request.tl.tag = NFAPI_LTE_CELL_SEARCH_REQUEST_TAG; + lte_req.lte_cell_search_request.earfcn = 1234; + lte_req.lte_cell_search_request.measurement_bandwidth = 50; + lte_req.lte_cell_search_request.exhaustive_search = 1; + lte_req.lte_cell_search_request.timeout = 1000; + lte_req.lte_cell_search_request.number_of_pci = 1; + lte_req.lte_cell_search_request.pci[0] = 234; + + nfapi_vnf_cell_search_request(config, p5_idx, <e_req); + + nfapi_cell_search_request_t utran_req; + memset(&utran_req, 0, sizeof(utran_req)); + utran_req.header.message_id = NFAPI_CELL_SEARCH_REQUEST; + utran_req.header.phy_id = phy_id; + + utran_req.rat_type = NFAPI_RAT_TYPE_UTRAN; + utran_req.utran_cell_search_request.tl.tag = NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG; + utran_req.utran_cell_search_request.uarfcn = 1234; + utran_req.utran_cell_search_request.exhaustive_search = 0; + utran_req.utran_cell_search_request.timeout = 1000; + utran_req.utran_cell_search_request.number_of_psc = 1; + utran_req.utran_cell_search_request.psc[0] = 234; + + nfapi_vnf_cell_search_request(config, p5_idx, &utran_req); + + nfapi_cell_search_request_t geran_req; + memset(&geran_req, 0, sizeof(geran_req)); + geran_req.header.message_id = NFAPI_CELL_SEARCH_REQUEST; + geran_req.header.phy_id = phy_id; + + geran_req.rat_type = NFAPI_RAT_TYPE_GERAN; + geran_req.geran_cell_search_request.tl.tag = NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG; + geran_req.geran_cell_search_request.timeout = 1000; + geran_req.geran_cell_search_request.number_of_arfcn = 1; + geran_req.geran_cell_search_request.arfcn[0] = 8765; + + nfapi_vnf_cell_search_request(config, p5_idx, &geran_req); + } + { + nfapi_broadcast_detect_request_t lte_req; + memset(<e_req, 0, sizeof(lte_req)); + lte_req.header.message_id = NFAPI_BROADCAST_DETECT_REQUEST; + lte_req.header.phy_id = phy_id; + + lte_req.rat_type = NFAPI_RAT_TYPE_LTE; + lte_req.lte_broadcast_detect_request.tl.tag = NFAPI_LTE_BROADCAST_DETECT_REQUEST_TAG; + lte_req.lte_broadcast_detect_request.earfcn = 1234; + lte_req.lte_broadcast_detect_request.pci = 50; + lte_req.lte_broadcast_detect_request.timeout = 1000; + + lte_req.pnf_cell_search_state.tl.tag = NFAPI_PNF_CELL_SEARCH_STATE_TAG; + lte_req.pnf_cell_search_state.length = 3; + + nfapi_vnf_broadcast_detect_request(config, p5_idx, <e_req); + + nfapi_broadcast_detect_request_t utran_req; + memset(&utran_req, 0, sizeof(utran_req)); + utran_req.header.message_id = NFAPI_BROADCAST_DETECT_REQUEST; + utran_req.header.phy_id = phy_id; + + utran_req.rat_type = NFAPI_RAT_TYPE_LTE; + utran_req.utran_broadcast_detect_request.tl.tag = NFAPI_UTRAN_BROADCAST_DETECT_REQUEST_TAG; + utran_req.utran_broadcast_detect_request.uarfcn = 1234; + utran_req.utran_broadcast_detect_request.psc = 50; + utran_req.utran_broadcast_detect_request.timeout = 1000; + + utran_req.pnf_cell_search_state.tl.tag = NFAPI_PNF_CELL_SEARCH_STATE_TAG; + utran_req.pnf_cell_search_state.length = 3; + + nfapi_vnf_broadcast_detect_request(config, p5_idx, &utran_req); + } + { + nfapi_system_information_schedule_request_t lte_req; + memset(<e_req, 0, sizeof(lte_req)); + lte_req.header.message_id = NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST; + lte_req.header.phy_id = phy_id; + + lte_req.rat_type = NFAPI_RAT_TYPE_LTE; + lte_req.lte_system_information_schedule_request.tl.tag = NFAPI_LTE_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG; + lte_req.lte_system_information_schedule_request.earfcn = 1234; + lte_req.lte_system_information_schedule_request.pci = 50; + lte_req.lte_system_information_schedule_request.downlink_channel_bandwidth = 100; + lte_req.lte_system_information_schedule_request.phich_configuration = 3; + lte_req.lte_system_information_schedule_request.number_of_tx_antenna = 2; + lte_req.lte_system_information_schedule_request.retry_count = 4; + lte_req.lte_system_information_schedule_request.timeout = 1000; + + lte_req.pnf_cell_broadcast_state.tl.tag = NFAPI_PNF_CELL_BROADCAST_STATE_TAG; + lte_req.pnf_cell_broadcast_state.length = 3; + + nfapi_vnf_system_information_schedule_request(config, p5_idx, <e_req); + } + { + nfapi_system_information_request_t lte_req; + memset(<e_req, 0, sizeof(lte_req)); + lte_req.header.message_id = NFAPI_SYSTEM_INFORMATION_REQUEST; + lte_req.header.phy_id = phy_id; + + lte_req.rat_type = NFAPI_RAT_TYPE_LTE; + lte_req.lte_system_information_request.tl.tag = NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG; + lte_req.lte_system_information_request.earfcn = 1234; + lte_req.lte_system_information_request.pci= 456; + lte_req.lte_system_information_request.downlink_channel_bandwidth = 5; + lte_req.lte_system_information_request.phich_configuration = 2; + lte_req.lte_system_information_request.number_of_tx_antenna = 2; + lte_req.lte_system_information_request.number_of_si_periodicity = 1; + lte_req.lte_system_information_request.si_periodicity[0].si_periodicity = 3; + lte_req.lte_system_information_request.si_periodicity[0].si_index = 3; + lte_req.lte_system_information_request.si_window_length = 15; + lte_req.lte_system_information_request.timeout = 1000; + + nfapi_vnf_system_information_request(config, p5_idx, <e_req); + + nfapi_system_information_request_t utran_req; + memset(&utran_req, 0, sizeof(utran_req)); + utran_req.header.message_id = NFAPI_SYSTEM_INFORMATION_REQUEST; + utran_req.header.phy_id = phy_id; + + utran_req.rat_type = NFAPI_RAT_TYPE_UTRAN; + utran_req.utran_system_information_request.tl.tag = NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG; + utran_req.utran_system_information_request.uarfcn = 1234; + utran_req.utran_system_information_request.psc = 456; + utran_req.utran_system_information_request.timeout = 1000; + + nfapi_vnf_system_information_request(config, p5_idx, &utran_req); + + nfapi_system_information_request_t geran_req; + memset(&geran_req, 0, sizeof(geran_req)); + geran_req.header.message_id = NFAPI_SYSTEM_INFORMATION_REQUEST; + geran_req.header.phy_id = phy_id; + + geran_req.rat_type = NFAPI_RAT_TYPE_GERAN; + geran_req.geran_system_information_request.tl.tag = NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG; + geran_req.geran_system_information_request.arfcn = 1234; + geran_req.geran_system_information_request.bsic = 21; + geran_req.geran_system_information_request.timeout = 1000; + + nfapi_vnf_system_information_request(config, p5_idx, &geran_req); + } + { + nfapi_nmm_stop_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_NMM_STOP_REQUEST; + req.header.phy_id = phy_id; + nfapi_vnf_nmm_stop_request(config, p5_idx, &req); + } +} + + +int start_resp_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_response_t* resp) +{ + printf("[VNF_SIM] start response idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id); + + vnf_info* vnf = (vnf_info*)(config->user_data); + + if(vnf->wireshark_test_mode) + test_p4_requests(config, p5_idx, resp->header.phy_id); + + auto find_result = vnf->pnfs.find(p5_idx); + if(find_result != vnf->pnfs.end()) + { + pnf_info& pnf = find_result->second; + + + auto found = std::find_if(pnf.phys.begin(), pnf.phys.end(), [&](phy_info& item) + { return item.id == resp->header.phy_id; }); + + if(found != pnf.phys.end()) + { + phy_info& phy = (*found); + + vnf_p7_info& p7_vnf = vnf->p7_vnfs[0]; + + nfapi_vnf_p7_add_pnf((p7_vnf.config.get()), phy.remote_addr.c_str(), phy.remote_port, phy.id); + + + } + + + } + return 0; +} + + +nfapi_p4_p5_message_header_t* vnf_sim_allocate_p4_p5_vendor_ext(uint16_t message_id, uint16_t* msg_size) +{ + if(message_id == P5_VENDOR_EXT_RSP) + { + *msg_size = sizeof(vendor_ext_p5_rsp); + return (nfapi_p4_p5_message_header_t*)malloc(sizeof(vendor_ext_p5_rsp)); + } + return 0; +} +void vnf_sim_deallocate_p4_p5_vendor_ext(nfapi_p4_p5_message_header_t* header) +{ + free(header); +} +int vendor_ext_cb(nfapi_vnf_config_t* config, int p5_idx, nfapi_p4_p5_message_header_t* msg) +{ + printf("[VNF_SIM] %s\n", __FUNCTION__); + + switch(msg->message_id) + { + case P5_VENDOR_EXT_RSP: + { + vendor_ext_p5_rsp* rsp = (vendor_ext_p5_rsp*)msg; + printf("[VNF_SIM] P5_VENDOR_EXT_RSP error_code:%d\n", rsp->error_code); + + // send the start request + + nfapi_pnf_start_request_t req; + memset(&req, 0, sizeof(req)); + req.header.message_id = NFAPI_PNF_START_REQUEST; + nfapi_vnf_pnf_start_req(config, p5_idx, &req); + } + break; + + } + + return 0; +} + +int read_vnf_xml(vnf_info& vnf, const char* xml_file) +{ + try + { + + std::ifstream input(xml_file); + + using boost::property_tree::ptree; + ptree pt; + + read_xml(input, pt); + + + + for(const auto& v : pt.get_child("vnf.vnf_p7_list")) + { + if(v.first == "vnf_p7") + { + vnf_p7_info vnf_p7; + vnf_p7.local_port = v.second.get("port"); + vnf_p7.local_addr = v.second.get("address"); + + vnf_p7.timing_window = v.second.get("timing_window"); + vnf_p7.periodic_timing_enabled = v.second.get("periodic_timing_enabled"); + vnf_p7.aperiodic_timing_enabled = v.second.get("aperiodic_timing_enabled"); + vnf_p7.periodic_timing_period = v.second.get("periodic_timing_window"); + + + boost::optional d = v.second.get_child_optional("data.udp"); + if(d.is_initialized()) + { + vnf_p7.udp.enabled = true; + vnf_p7.udp.rx_port = d.get().get("rx_port"); + vnf_p7.udp.tx_port = d.get().get("tx_port"); + vnf_p7.udp.tx_addr = d.get().get("tx_addr"); + } + else + { + vnf_p7.udp.enabled = false; + } + + vnf.wireshark_test_mode = v.second.get("wireshark_test_mode", 0); + + vnf_p7.mac = mac_create(vnf.wireshark_test_mode); + vnf_p7.mac->dl_config_req = &mac_dl_config_req; + vnf_p7.mac->ul_config_req = &mac_ul_config_req; + vnf_p7.mac->hi_dci0_req = &mac_hi_dci0_req; + vnf_p7.mac->tx_req = &mac_tx_req; + + if(vnf_p7.udp.enabled) + { + mac_start_data(vnf_p7.mac, + vnf_p7.udp.rx_port, + vnf_p7.udp.tx_addr.c_str(), + vnf_p7.udp.tx_port); + } + + vnf.p7_vnfs.push_back(vnf_p7); + } + } + } + catch(std::exception& e) + { + printf("%s", e.what()); + return -1; + } + catch(boost::exception& e) + { + printf("%s", boost::diagnostic_information(e).c_str()); + } + + struct ifaddrs *ifaddr; + getifaddrs(&ifaddr); + + + while(ifaddr) + { + int family = ifaddr->ifa_addr->sa_family; + if(family == AF_INET) + { + char host[128]; + getnameinfo(ifaddr->ifa_addr, sizeof(sockaddr_in), host, sizeof(host), NULL, 0, 0); + printf("%s\n", host); + } + ifaddr = ifaddr->ifa_next; + } + + return 0; + +} + + +int main(int argc, char *argv[]) +{ + if (argc < 3) + { + printf("Use parameters: \n"); + return 0; + } + + set_thread_priority(50); + + vnf_info vnf; + + if(read_vnf_xml(vnf, argv[2]) < 0) + { + printf("Failed to read xml file>\n"); + return 0; + } + + nfapi_vnf_config_t* config = nfapi_vnf_config_create(); + + config->vnf_ipv4 = 1; + config->vnf_p5_port = atoi(argv[1]); + config->pnf_connection_indication = &pnf_connection_indication_cb; + config->pnf_disconnect_indication = &pnf_disconnection_indication_cb; + config->pnf_param_resp = &pnf_param_resp_cb; + config->pnf_config_resp = &pnf_config_resp_cb; + config->pnf_start_resp = &pnf_start_resp_cb; + config->param_resp = ¶m_resp_cb; + config->config_resp = &config_resp_cb; + config->start_resp = &start_resp_cb; + config->vendor_ext = &vendor_ext_cb; + + + + config->trace = &vnf_sim_trace; + + config->malloc = &vnf_allocate; + config->free = &vnf_deallocate; + + config->user_data = &vnf; + + config->codec_config.unpack_vendor_extension_tlv = &vnf_sim_unpack_vendor_extension_tlv; + config->codec_config.pack_vendor_extension_tlv = &vnf_sim_pack_vendor_extension_tlv; + + config->codec_config.unpack_p4_p5_vendor_extension = &vnf_sim_unpack_p4_p5_vendor_extension; + config->codec_config.pack_p4_p5_vendor_extension = &vnf_sim_pack_p4_p5_vendor_extension; + config->allocate_p4_p5_vendor_ext = &vnf_sim_allocate_p4_p5_vendor_ext; + config->deallocate_p4_p5_vendor_ext = &vnf_sim_deallocate_p4_p5_vendor_ext; + config->codec_config.allocate = &vnf_allocate; + config->codec_config.deallocate = &vnf_deallocate; + + + printf("Calling nfapi_vnf_start\n"); + return nfapi_vnf_start(config); +} diff --git a/nfapi/open-nFAPI/xml/pnf_phy_1_A.xml b/nfapi/open-nFAPI/xml/pnf_phy_1_A.xml new file mode 100644 index 0000000000..45f8f46831 --- /dev/null +++ b/nfapi/open-nFAPI/xml/pnf_phy_1_A.xml @@ -0,0 +1,88 @@ + + + 0 + 0 + + + 500 + 500 + 500 + 500 + + 1 + 30 + 1 + 1 + + 0 + 0 + + 0 + + ALPHA + + + + + 88 + 2500 +
192.168.1.74
+ + 1 + + 22 + 22 + + 1 + 1 + + <3gpp_release_supported>31 + + 0 + + 8 + 8 + + + + + 0 + + + 1 + + + + + 5201 + 192.168.1.28 + 5200 + + +
+
+ + + 0 + 2 + -30 + -230 + 2 + 1890 + 1890 + 1890 + 1890 + + + 1 + 3 + -30 + -230 + 2 + 1890 + 1890 + 1890 + 1890 + + +
diff --git a/nfapi/open-nFAPI/xml/pnf_phy_1_A_ws.xml b/nfapi/open-nFAPI/xml/pnf_phy_1_A_ws.xml new file mode 100644 index 0000000000..5eb0284148 --- /dev/null +++ b/nfapi/open-nFAPI/xml/pnf_phy_1_A_ws.xml @@ -0,0 +1,90 @@ + + + 1 + + 0 + 0 + + + 500 + 500 + 500 + 500 + + 1 + 30 + 1 + 1 + + 0 + 0 + + 0 + + ALPHA + + + + + 88 + 2500 +
127.0.0.1
+ + 1 + + 22 + 22 + + 1 + 1 + + <3gpp_release_supported>31 + + 0 + + 8 + 8 + + + + + 0 + + + 1 + + + + + 7722 + 127.0.0.1 + 7733 + + +
+
+ + + 0 + 2 + -30 + -230 + 2 + 1890 + 1890 + 1890 + 1890 + + + 1 + 3 + -30 + -230 + 2 + 1890 + 1890 + 1890 + 1890 + + +
diff --git a/nfapi/open-nFAPI/xml/pnf_phy_1_B.xml b/nfapi/open-nFAPI/xml/pnf_phy_1_B.xml new file mode 100644 index 0000000000..302e1e19c5 --- /dev/null +++ b/nfapi/open-nFAPI/xml/pnf_phy_1_B.xml @@ -0,0 +1,88 @@ + + + 0 + 0 + + + 500 + 500 + 500 + 500 + + 1 + 30 + 1 + 1 + + 0 + 0 + + 0 + + ALPHA + + + + + 89 + 2510 +
127.0.0.1
+ + 1 + + 22 + 22 + + 1 + 1 + + <3gpp_release_supported>31 + + 0 + + 8 + 8 + + + + + 0 + + + 1 + + + + + 7744 + 127.0.0.1 + 7755 + + +
+
+ + + 0 + 2 + -30 + -230 + 2 + 1890 + 1890 + 1890 + 1890 + + + 1 + 3 + -30 + -230 + 2 + 1890 + 1890 + 1890 + 1890 + + +
diff --git a/nfapi/open-nFAPI/xml/pnf_phy_2_A.xml b/nfapi/open-nFAPI/xml/pnf_phy_2_A.xml new file mode 100644 index 0000000000..b820fa135e --- /dev/null +++ b/nfapi/open-nFAPI/xml/pnf_phy_2_A.xml @@ -0,0 +1,90 @@ + + + 0 + 0 + + + 500 + 500 + 500 + 500 + + 1 + 30 + 1 + 1 + + 0 + 0 + + 0 + + ALPHA + + + + 88 + 2500 +
127.0.0.1
+ + 1 + 22 + 22 + 1 + 1 + <3gpp_release_supported>31 + 0 + 8 + 8 + + + 0 + + +
+ + 44 + 2600 +
127.0.0.1
+ + 1 + 22 + 22 + 1 + 1 + <3gpp_release_supported>31 + 0 + 8 + 8 + + + 1 + + +
+
+ + + 0 + 2 + -30 + -230 + 2 + 1890 + 1890 + 1890 + 1890 + + + 1 + 4 + -30 + -230 + 2 + 1890 + 1890 + 1890 + 1890 + + +
diff --git a/nfapi/open-nFAPI/xml/vnf_A.xml b/nfapi/open-nFAPI/xml/vnf_A.xml new file mode 100644 index 0000000000..3791239ce7 --- /dev/null +++ b/nfapi/open-nFAPI/xml/vnf_A.xml @@ -0,0 +1,21 @@ + + + + + 5201 +
192.168.1.28
+ 10 + 0 + 0 + 0 + + + + 8891 + 192.168.1.28 + 8892 + + +
+
+
diff --git a/nfapi/open-nFAPI/xml/vnf_A_ws.xml b/nfapi/open-nFAPI/xml/vnf_A_ws.xml new file mode 100644 index 0000000000..c26adc3cfa --- /dev/null +++ b/nfapi/open-nFAPI/xml/vnf_A_ws.xml @@ -0,0 +1,23 @@ + + + + + + 1 + 5200 +
127.0.0.1
+ 10 + 0 + 0 + 0 + + + + 8891 + 127.0.0.1 + 8892 + + +
+
+
diff --git a/nfapi/open-nfapi.oai.patch b/nfapi/open-nfapi.oai.patch new file mode 100644 index 0000000000..5b91e3675b --- /dev/null +++ b/nfapi/open-nfapi.oai.patch @@ -0,0 +1,20010 @@ +diff --git a/common/public_inc/debug.h b/common/public_inc/debug.h +index 05e9870..14f97a1 100644 +--- a/common/public_inc/debug.h ++++ b/common/public_inc/debug.h +@@ -39,7 +39,8 @@ extern nfapi_trace_fn_t nfapi_trace_g; + extern nfapi_trace_level_t nfapi_trace_level_g; + + /*! NFAPI trace macro */ +-#define NFAPI_TRACE(level, format, ...) { if(nfapi_trace_g && ((nfapi_trace_level_t)level <= nfapi_trace_level_g)) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); } ++//#define NFAPI_TRACE(level, format, ...) { if(nfapi_trace_g && ((nfapi_trace_level_t)level <= nfapi_trace_level_g)) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); } ++#define NFAPI_TRACE(level, format, ...) { if (nfapi_trace_g) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); } + + /*! Function to change the trace level + * \param new_level The modified trace level +diff --git a/nfapi/public_inc/nfapi_interface.h b/nfapi/public_inc/nfapi_interface.h +index 2d58c2a..f665d11 100644 +--- a/nfapi/public_inc/nfapi_interface.h ++++ b/nfapi/public_inc/nfapi_interface.h +@@ -1772,7 +1772,7 @@ typedef struct { + uint8_t number_of_cc; + struct { + uint8_t ri_size; +- uint8_t dl_cqi_pmi_size; ++ uint8_t dl_cqi_pmi_size[8]; + } cc[NFAPI_MAX_CC]; + } nfapi_ul_config_aperiodic_cqi_pmi_ri_report_t; + +diff --git a/nfapi/src/nfapi.c b/nfapi/src/nfapi.c +index 0e06963..3f017bc 100644 +--- a/nfapi/src/nfapi.c ++++ b/nfapi/src/nfapi.c +@@ -823,6 +823,10 @@ uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *e + { + NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag); + } ++ else ++ { ++ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag); ++ } + } + + return 1; +diff --git a/nfapi/src/nfapi_p7.c b/nfapi/src/nfapi_p7.c +index a3b0141..69ff860 100644 +--- a/nfapi/src/nfapi_p7.c ++++ b/nfapi/src/nfapi_p7.c +@@ -111,6 +111,8 @@ static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void* tlv, uint8_t **ppWrite + { + nfapi_dl_config_dci_dl_pdu_rel8_t* value = (nfapi_dl_config_dci_dl_pdu_rel8_t*)tlv; + ++ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci_format:%u\n", __FUNCTION__, value->dci_format); ++ + return ( push8(value->dci_format, ppWritePackedMsg, end) && + push8(value->cce_idx, ppWritePackedMsg, end) && + push8(value->aggregation_level, ppWritePackedMsg, end) && +@@ -234,6 +236,8 @@ static uint8_t pack_dl_config_bch_pdu_rel8_value(void* tlv, uint8_t **ppWritePac + { + nfapi_dl_config_bch_pdu_rel8_t* value = (nfapi_dl_config_bch_pdu_rel8_t*)tlv; + ++ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s()\n", __FUNCTION__); ++ + return( push16(value->length, ppWritePackedMsg, end) && + push16(value->pdu_index, ppWritePackedMsg, end) && + push16(value->transmission_power, ppWritePackedMsg, end)); +@@ -545,6 +549,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac + { + nfapi_dl_config_request_body_t* value = (nfapi_dl_config_request_body_t*)tlv; + ++ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci:%u pdu:%u pdsch:%u rnti:%u pcfich:%u\n", __FUNCTION__, value->number_dci, value->number_pdu, value->number_pdsch_rnti, value->transmission_power_pcfich); ++ + if(!(push8(value->number_pdcch_ofdm_symbols, ppWritePackedMsg, end) && + push8(value->number_dci, ppWritePackedMsg, end) && + push16(value->number_pdu, ppWritePackedMsg, end) && +@@ -574,6 +580,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac + { + case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: + { ++ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE\n", __FUNCTION__); ++ + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) && + pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) && +@@ -587,6 +595,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac + break; + case NFAPI_DL_CONFIG_BCH_PDU_TYPE: + { ++ //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE\n", __FUNCTION__); ++ + if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_bch_pdu_rel8_value))) + return 0; + } +@@ -684,10 +694,21 @@ static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uin + { + nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t*)msg; + +- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && +- pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) && +- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); ++ //return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && ++ //pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) && ++ //pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); ++ { ++ uint8_t x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end); ++ uint8_t y = pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value); ++ uint8_t z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config); + ++ if (!x || !y || !z) ++ { ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST x:%u y:%u z:%u \n", __FUNCTION__,x,y,z); ++ } ++ ++ return x && y && z; ++ } + } + + static uint8_t pack_ul_config_request_ulsch_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t * end) +@@ -796,9 +817,10 @@ static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppW + if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0) + return 0; + +- if(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size > 0) ++ uint8_t j; ++ for(j = 0; j < 8; ++j) + { +- if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size, ppWritePackedMsg, end) == 0) ++ if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], ppWritePackedMsg, end) == 0) + return 0; + } + } +@@ -1518,7 +1540,21 @@ static uint8_t pack_tx_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, + for(j = 0; j < pdu->num_segments; ++j) + { + // Use -1 as it is unbounded +- if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0) ++ // DJP - does not handle -1 ++ // DJP - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0) ++ int push_ret = pusharray8(pdu->segments[j].segment_data, 65535, pdu->segments[j].segment_length, ppWritePackedMsg, end); ++ ++ if (0 && pdu->segments[j].segment_length == 3) ++ { ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, ++ pdu->segments[j].segment_data[0], ++ pdu->segments[j].segment_data[1], ++ pdu->segments[j].segment_data[2] ++ ); ++ } ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() segment_data:%p segment_length:%u pusharray8()=%d\n", __FUNCTION__, pdu->segments[j].segment_data, pdu->segments[j].segment_length, push_ret); ++ ++ if (push_ret == 0) + { + return 0; + } +@@ -1532,9 +1568,13 @@ static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e + { + nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg; + +- return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) && +- pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value) && +- pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)); ++ int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end); ++ int y = pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value); ++ int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config); ++ ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() x:%d y:%d z:%d\n", __FUNCTION__, x, y, z); ++ ++ return x && y && z; + } + + static uint8_t pack_rx_ue_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) +@@ -1844,6 +1884,8 @@ static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWriteP + { + nfapi_rx_indication_body_t* value = (nfapi_rx_indication_body_t*)tlv; + ++ //printf("RX ULSCH BODY\n"); ++ + if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0) + return 0; + +@@ -1851,21 +1893,26 @@ static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWriteP + uint16_t i = 0; + uint16_t offset = 2; // taking into account the number_of_pdus + uint16_t total_number_of_pdus = value->number_of_pdus; ++ //printf("ULSCH:pdus:%d\n", total_number_of_pdus); ++ + for(i = 0; i < total_number_of_pdus; ++i) + { + nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]); + if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) + { ++ //printf("NFAPI_RX_UE_INFORMATION_TAG\n"); + offset += 4 + 6; + } + + if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) + { ++ //printf("NFAPI_RX_INDICATION_REL8_TAG\n"); + offset += 4 + 7; + } + + if(pdu->rx_indication_rel9.tl.tag == NFAPI_RX_INDICATION_REL9_TAG) + { ++ //printf("NFAPI_RX_INDICATION_REL9_TAG\n"); + offset += 4 + 2; + } + } +@@ -2592,11 +2639,16 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu + return -1; + } + ++ if (pMessageHeader->message_id != NFAPI_TIMING_INFO) ++ { ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp); ++ } + // look for the specific message + uint8_t result = 0; + switch (pMessageHeader->message_id) + { + case NFAPI_DL_CONFIG_REQUEST: ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST\n", __FUNCTION__); + result = pack_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + +@@ -2609,6 +2661,7 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu + break; + + case NFAPI_TX_REQUEST: ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_TX_REQUEST\n", __FUNCTION__); + result = pack_tx_request(pMessageHeader, &pWritePackedMessage, end, config); + break; + +@@ -2621,6 +2674,7 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu + break; + + case NFAPI_RX_ULSCH_INDICATION: ++ //printf("RX ULSCH\n"); + result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config); + break; + +@@ -3482,9 +3536,10 @@ static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppRe + if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0) + return 0; + +- if(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size > 0) ++ uint8_t j; ++ for(j = 0; j < 8; ++j) + { +- if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size, end) == 0) ++ if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], end) == 0) + return 0; + } + } +@@ -4394,6 +4449,14 @@ static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void * + { + if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end)) + return 0; ++ if (0 && pdu->segments[0].segment_length == 3) ++ { ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, ++ pdu->segments[0].segment_data[0], ++ pdu->segments[0].segment_data[1], ++ pdu->segments[0].segment_data[2] ++ ); ++ } + } + else + { +diff --git a/pnf/public_inc/nfapi_pnf_interface.h b/pnf/public_inc/nfapi_pnf_interface.h +index f93624d..b25caf2 100644 +--- a/pnf/public_inc/nfapi_pnf_interface.h ++++ b/pnf/public_inc/nfapi_pnf_interface.h +@@ -319,10 +319,10 @@ typedef struct nfapi_pnf_config + * 0 will be returned if it fails. + * + * \code +- * nfapi_pnf_config_t* config = nfapi_pnf_config_create(); ++ * nfapi_pnf_config_t* config = nfapi_pnf_config_create(void); + * \endcode + */ +-nfapi_pnf_config_t* nfapi_pnf_config_create(); ++nfapi_pnf_config_t* nfapi_pnf_config_create(void); + + /*! Delete a pnf configuration + * \param config A pointer to a pnf configuraiton +@@ -681,7 +681,7 @@ typedef struct nfapi_pnf_p7_config + /*! Create and initialise a nfapi_pnf_p7_config structure + * \return A pointer to a PNF P7 config structure + */ +-nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create(); ++nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create(void); + + /*! Delete an nfapi_pnf_p7_config structure + * \param config +diff --git a/pnf/src/pnf.c b/pnf/src/pnf.c +index d6cf364..d0a7fa6 100644 +--- a/pnf/src/pnf.c ++++ b/pnf/src/pnf.c +@@ -412,10 +412,10 @@ void pnf_handle_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen) + { + nfapi_start_request_t req; + +- NFAPI_TRACE(NFAPI_TRACE_INFO, "START.request received\n"); +- + nfapi_pnf_config_t* config = &(pnf->_public); + ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() START.request received state:%d\n", __FUNCTION__, config->state); ++ + // unpack the message + if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0) + { +diff --git a/pnf/src/pnf_interface.c b/pnf/src/pnf_interface.c +index 74f29a0..7310fc0 100644 +--- a/pnf/src/pnf_interface.c ++++ b/pnf/src/pnf_interface.c +@@ -76,6 +76,7 @@ int nfapi_pnf_start(nfapi_pnf_config_t* config) + + sleep(1); + } ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() terminate=1 - EXITTING............\n", __FUNCTION__); + + return 0; + } +@@ -227,7 +228,7 @@ int nfapi_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_start_response_t* res + } + else + { +- NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknow phy id %d\n", __FUNCTION__, resp->header.phy_id); ++ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknown phy id %d\n", __FUNCTION__, resp->header.phy_id); + return -1; + } + +diff --git a/pnf/src/pnf_p7.c b/pnf/src/pnf_p7.c +index 0fd7828..02b828d 100644 +--- a/pnf/src/pnf_p7.c ++++ b/pnf/src/pnf_p7.c +@@ -25,12 +25,64 @@ + #include + #include + #include ++#include + + #include "pnf_p7.h" + + #define FAPI2_IP_DSCP 0 + +-uint32_t get_current_time_hr() ++extern uint16_t sf_ahead; ++//uint16_t sf_ahead=4; ++ ++void add_sf(uint16_t *frameP, uint16_t *subframeP, int offset) ++{ ++ *frameP = *frameP + ((*subframeP + offset) / 10); ++ ++ *subframeP = ((*subframeP + offset) % 10); ++} ++ ++void subtract_sf(uint16_t *frameP, uint16_t *subframeP, int offset) ++{ ++ if (*subframeP < offset) ++ { ++ *frameP = (*frameP+1024-1)%1024; ++ } ++ *subframeP = (*subframeP+10-offset)%10; ++} ++ ++uint16_t sfnsf_add_sf(uint16_t sfnsf, int offset) ++{ ++ uint16_t new_sfnsf; ++ uint16_t sfn = NFAPI_SFNSF2SFN(sfnsf); ++ uint16_t sf = NFAPI_SFNSF2SF(sfnsf); ++ ++ //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf); ++ add_sf(&sfn, &sf, offset); ++ ++ new_sfnsf = sfn<<4|sf; ++ ++ //printf("%s() sfn:%u sf:%u offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, sfn, sf, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf)); ++ ++ return new_sfnsf; ++} ++ ++uint16_t sfnsf_subtract_sf(uint16_t sfnsf, int offset) ++{ ++ uint16_t new_sfnsf; ++ uint16_t sfn = NFAPI_SFNSF2SFN(sfnsf); ++ uint16_t sf = NFAPI_SFNSF2SF(sfnsf); ++ ++ //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf); ++ subtract_sf(&sfn, &sf, offset); ++ ++ new_sfnsf = sfn<<4|sf; ++ ++ //printf("%s() offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf)); ++ ++ return new_sfnsf; ++} ++ ++uint32_t pnf_get_current_time_hr(void) + { + struct timeval now; + (void)gettimeofday(&now, NULL); +@@ -64,11 +116,14 @@ void pnf_p7_free(pnf_p7_t* pnf_p7, void* ptr) + // todo : for now these just malloc/free need to move to a memory cache + nfapi_dl_config_request_t* allocate_nfapi_dl_config_request(pnf_p7_t* pnf_p7) + { +- return pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t)); ++ void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t)); ++ //printf("%s() ptr:%p\n", __FUNCTION__, ptr); ++ return ptr; + } + + void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t* pnf_p7) + { ++ //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->dl_config_request_body.dl_config_pdu_list); + if(pnf_p7->_public.codec_config.deallocate) + { + (pnf_p7->_public.codec_config.deallocate)(req->dl_config_request_body.dl_config_pdu_list); +@@ -77,17 +132,21 @@ void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t + { + free(req->dl_config_request_body.dl_config_pdu_list); + } ++ req->dl_config_request_body.dl_config_pdu_list=0; + + pnf_p7_free(pnf_p7, req); + } + + nfapi_ul_config_request_t* allocate_nfapi_ul_config_request(pnf_p7_t* pnf_p7) + { +- return pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t)); ++ void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t)); ++ //printf("%s() ptr:%p\n", __FUNCTION__, ptr); ++ return ptr; + } + + void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t* pnf_p7) + { ++ //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->ul_config_request_body.ul_config_pdu_list); + if(pnf_p7->_public.codec_config.deallocate) + { + (pnf_p7->_public.codec_config.deallocate)(req->ul_config_request_body.ul_config_pdu_list); +@@ -96,6 +155,7 @@ void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t + { + free(req->ul_config_request_body.ul_config_pdu_list); + } ++ req->ul_config_request_body.ul_config_pdu_list=0; + + pnf_p7_free(pnf_p7, req); + } +@@ -107,6 +167,7 @@ nfapi_hi_dci0_request_t* allocate_nfapi_hi_dci0_request(pnf_p7_t* pnf_p7) + + void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pnf_p7) + { ++ //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->hi_dci0_request_body.hi_dci0_pdu_list); + if(pnf_p7->_public.codec_config.deallocate) + { + (pnf_p7->_public.codec_config.deallocate)(req->hi_dci0_request_body.hi_dci0_pdu_list); +@@ -115,6 +176,7 @@ void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pn + { + free(req->hi_dci0_request_body.hi_dci0_pdu_list); + } ++ req->hi_dci0_request_body.hi_dci0_pdu_list=0; + + pnf_p7_free(pnf_p7, req); + } +@@ -127,6 +189,9 @@ nfapi_tx_request_t* allocate_nfapi_tx_request(pnf_p7_t* pnf_p7) + void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) + { + int i = 0; ++ ++ //printf("%s() SFN/SF:%d %s req:%p pdu[0]:data:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->tx_request_body.tx_pdu_list[i].segments[0].segment_data); ++ + for(i = 0; i < req->tx_request_body.number_of_pdus; ++i) + { + void* data = req->tx_request_body.tx_pdu_list[i].segments[0].segment_data; +@@ -139,6 +204,7 @@ void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) + { + free(data); + } ++ data=0; + } + + +@@ -150,6 +216,7 @@ void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) + { + free(req->tx_request_body.tx_pdu_list); + } ++ req->tx_request_body.tx_pdu_list=0; + + pnf_p7_free(pnf_p7, req); + } +@@ -169,6 +236,7 @@ void deallocate_nfapi_lbt_dl_config_request(nfapi_lbt_dl_config_request_t* req, + { + free(req->lbt_dl_config_request_body.lbt_dl_config_req_pdu_list); + } ++ req->lbt_dl_config_request_body.lbt_dl_config_req_pdu_list=0; + + pnf_p7_free(pnf_p7, req); + } +@@ -307,11 +375,11 @@ void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reas + } + + +-uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) ++static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) + { + if(now_hr < sf_start_hr) + { +- NFAPI_TRACE(NFAPI_TRACE_INFO, "now is earlier that start of subframe\n"); ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "now is earlier than start of subframe now_hr:%u sf_start_hr:%u\n", now_hr, sf_start_hr); + return 0; + } + else +@@ -482,29 +550,41 @@ void pnf_pack_and_send_timing_info(pnf_p7_t* pnf_p7) + + void send_dummy_subframe(pnf_p7_t* pnf_p7, uint16_t sfn_sf) + { ++ struct timespec t; ++ clock_gettime( CLOCK_MONOTONIC, &t); ++ ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(sfn_sf:%d) t:%ld.%09ld\n", __FUNCTION__, NFAPI_SFNSF2DEC(sfn_sf), t.tv_sec, t.tv_nsec); ++ ++ if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) ++ { ++ pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf; ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - enter\n"); ++ (pnf_p7->_public.tx_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.tx_req); ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - exit\n"); ++ } + if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req) + { + pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf; ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - enter\n"); + (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req); ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - exit\n"); + } + if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req) + { + pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf; ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy ul_config_req - enter\n"); + (pnf_p7->_public.ul_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.ul_config_req); + } + if(pnf_p7->_public.hi_dci0_req && pnf_p7->_public.dummy_subframe.hi_dci0_req) + { + pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf; ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy hi_dci0 - enter\n"); + (pnf_p7->_public.hi_dci0_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.hi_dci0_req); + } +- if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) +- { +- pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf; +- (pnf_p7->_public.tx_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.tx_req); +- } + if(pnf_p7->_public.lbt_dl_config_req && pnf_p7->_public.dummy_subframe.lbt_dl_config_req) + { + pnf_p7->_public.dummy_subframe.lbt_dl_config_req->sfn_sf = sfn_sf; ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy lbt - enter\n"); + (pnf_p7->_public.lbt_dl_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.lbt_dl_config_req); + } + } +@@ -526,10 +606,14 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) + return -1; + } + ++#if 1 + // save the curren time and sfn_sf +- pnf_p7->sf_start_time_hr = get_current_time_hr(); ++ pnf_p7->sf_start_time_hr = pnf_get_current_time_hr(); + pnf_p7->sfn_sf = sfn_sf; + ++ uint32_t sfn_sf_tx = sfnsf_add_sf(sfn_sf, sf_ahead); ++ uint32_t tx_sfn_sf_dec = NFAPI_SFNSF2DEC(sfn_sf_tx); ++ + // If the subframe_buffer has been configured + if(pnf_p7->_public.subframe_buffer_size != 0) + { +@@ -550,6 +634,10 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) + NFAPI_TRACE(NFAPI_TRACE_INFO, "Applying shift %d to sfn/sf (%d -> %d)\n", pnf_p7->sfn_sf_shift, NFAPI_SFNSF2DEC(sfn_sf), shifted_sfn_sf); + sfn_sf = shifted_sfn_sf; + ++ // ++ // DJP - why does the shift not apply to pnf_p7->sfn_sf??? ++ // ++ + pnf_p7->sfn_sf_shift = 0; + } + +@@ -558,77 +646,119 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) + + nfapi_pnf_p7_subframe_buffer_t* subframe_buffer = &(pnf_p7->subframe_buffer[buffer_index]); + ++ uint8_t tx_buffer_index = tx_sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; ++ nfapi_pnf_p7_subframe_buffer_t* tx_subframe_buffer = &(pnf_p7->subframe_buffer[tx_buffer_index]); ++ ++ //printf("sfn_sf_dec:%d tx_sfn_sf_dec:%d\n", sfn_sf_dec, tx_sfn_sf_dec); ++ ++ if (0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() shift:%d subframe_buffer->sfn_sf:%d tx_subframe_buffer->sfn_sf:%d sfn_sf:%d subframe_buffer[buffer_index:%u dl_config_req:%p tx_req:%p] " ++ "TX:sfn_sf:%d:tx_buffer_index:%d[dl_config_req:%p tx_req:%p]\n", ++ __FUNCTION__, ++ pnf_p7->sfn_sf_shift, ++ NFAPI_SFNSF2DEC(subframe_buffer->sfn_sf), ++ NFAPI_SFNSF2DEC(tx_subframe_buffer->sfn_sf), ++ sfn_sf_dec, buffer_index, subframe_buffer->dl_config_req, subframe_buffer->tx_req, ++ tx_sfn_sf_dec, tx_buffer_index, tx_subframe_buffer->dl_config_req, tx_subframe_buffer->tx_req); ++ + // if the subframe buffer sfn sf is set then we have atlease 1 message + // from the vnf. + // todo : how to handle the messages we don't have, send dummies for + // now +- if(subframe_buffer->sfn_sf == sfn_sf) ++ ++ //printf("tx_subframe_buffer->sfn_sf:%d sfn_sf_tx:%d\n", tx_subframe_buffer->sfn_sf, sfn_sf_tx); ++ //printf("subframe_buffer->sfn_sf:%d sfn_sf:%d\n", subframe_buffer->sfn_sf, sfn_sf); ++ if(tx_subframe_buffer->sfn_sf == sfn_sf_tx) + { +- if(subframe_buffer->dl_config_req != 0) ++ if(tx_subframe_buffer->tx_req != 0) + { +- if(pnf_p7->_public.dl_config_req) +- (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), subframe_buffer->dl_config_req); ++ if(pnf_p7->_public.tx_req) ++ (pnf_p7->_public.tx_req)(&(pnf_p7->_public), tx_subframe_buffer->tx_req); + +- deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7); ++ //deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7); + } + else + { + // send dummy +- if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req) ++ if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) + { +- pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf; +- (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req); ++ pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf_tx; ++ (pnf_p7->_public.tx_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.tx_req); + } + } + +- if(subframe_buffer->ul_config_req != 0) ++ if(tx_subframe_buffer->dl_config_req != 0) + { +- if(pnf_p7->_public.ul_config_req) +- (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), subframe_buffer->ul_config_req); ++ if(pnf_p7->_public.dl_config_req) ++ (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), tx_subframe_buffer->dl_config_req); + +- deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7); ++ //deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7); + } + else + { + // send dummy +- if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req) ++ if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req) + { +- pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf; +- (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.ul_config_req); ++ pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf_tx; ++ (pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req); + } + } + +- if(subframe_buffer->hi_dci0_req != 0) ++ if(tx_subframe_buffer->hi_dci0_req != 0) + { + if(pnf_p7->_public.hi_dci0_req) +- (pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), subframe_buffer->hi_dci0_req); ++ (pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), tx_subframe_buffer->hi_dci0_req); + +- deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7); ++ //deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7); + } + else + { + //send dummy + if(pnf_p7->_public.hi_dci0_req && pnf_p7->_public.dummy_subframe.hi_dci0_req) + { +- pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf; ++ pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf_tx; + (pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.hi_dci0_req); + } + } + +- if(subframe_buffer->tx_req != 0) ++ if(tx_subframe_buffer->dl_config_req != 0) ++ { ++ deallocate_nfapi_dl_config_request(tx_subframe_buffer->dl_config_req, pnf_p7); ++ tx_subframe_buffer->dl_config_req = 0; ++ } ++ if(tx_subframe_buffer->tx_req != 0) ++ { ++ deallocate_nfapi_tx_request(tx_subframe_buffer->tx_req, pnf_p7); ++ tx_subframe_buffer->tx_req = 0; ++ } ++ if(tx_subframe_buffer->hi_dci0_req != 0) ++ { ++ deallocate_nfapi_hi_dci0_request(tx_subframe_buffer->hi_dci0_req, pnf_p7); ++ tx_subframe_buffer->hi_dci0_req = 0; ++ } ++ } ++ else ++ { ++ // If we ever need to "send" a dummy ul_config this won't work!!! ++ send_dummy_subframe(pnf_p7, sfn_sf_tx); ++ } ++ ++ if(subframe_buffer->sfn_sf == sfn_sf) ++ { ++ ++ if(subframe_buffer->ul_config_req != 0) + { +- if(pnf_p7->_public.tx_req) +- (pnf_p7->_public.tx_req)(&(pnf_p7->_public), subframe_buffer->tx_req); ++ if(pnf_p7->_public.ul_config_req) ++ (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), subframe_buffer->ul_config_req); + +- deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7); ++ //deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7); + } + else + { + // send dummy +- if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req) ++ if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req) + { +- pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf; +- (pnf_p7->_public.tx_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.tx_req); ++ pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf; ++ (pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.ul_config_req); + } + } + +@@ -637,7 +767,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) + if(pnf_p7->_public.lbt_dl_config_req) + (pnf_p7->_public.lbt_dl_config_req)(&(pnf_p7->_public), subframe_buffer->lbt_dl_config_req); + +- deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7); ++ //deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7); + } + else + { +@@ -650,14 +780,35 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) + + } + +- memset(&(pnf_p7->subframe_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_subframe_buffer_t)); +- pnf_p7->subframe_buffer[buffer_index].sfn_sf = -1; +- } +- else +- { +- send_dummy_subframe(pnf_p7, sfn_sf); ++ //if(subframe_buffer->dl_config_req != 0) ++ //deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7); ++ //if(subframe_buffer->tx_req != 0) ++ //deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7); ++ if(subframe_buffer->ul_config_req != 0) ++ { ++ deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7); ++ subframe_buffer->ul_config_req = 0; ++ ++ } ++ //if(subframe_buffer->hi_dci0_req != 0) ++ //deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7); ++ if(subframe_buffer->lbt_dl_config_req != 0) ++ { ++ deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7); ++ subframe_buffer->lbt_dl_config_req = 0; ++ } ++ } // sfn_sf match ++ ++ if (subframe_buffer->dl_config_req == 0 && subframe_buffer->tx_req == 0 && subframe_buffer->ul_config_req == 0 && subframe_buffer->lbt_dl_config_req == 0) ++ { ++ memset(&(pnf_p7->subframe_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_subframe_buffer_t)); ++ pnf_p7->subframe_buffer[buffer_index].sfn_sf = -1; + } + ++ //printf("pnf_p7->_public.timing_info_mode_periodic:%d pnf_p7->timing_info_period_counter:%d pnf_p7->_public.timing_info_period:%d\n", pnf_p7->_public.timing_info_mode_periodic, pnf_p7->timing_info_period_counter, pnf_p7->_public.timing_info_period); ++ //printf("pnf_p7->_public.timing_info_mode_aperiodic:%d pnf_p7->timing_info_aperiodic_send:%d\n", pnf_p7->_public.timing_info_mode_aperiodic, pnf_p7->timing_info_aperiodic_send); ++ //printf("pnf_p7->timing_info_ms_counter:%d\n", pnf_p7->timing_info_ms_counter); ++ + // send the periodic timing info if configured + if(pnf_p7->_public.timing_info_mode_periodic && (pnf_p7->timing_info_period_counter++) == pnf_p7->_public.timing_info_period) + { +@@ -678,14 +829,15 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) + } + else + { +- send_dummy_subframe(pnf_p7, sfn_sf); ++ //send_dummy_subframe(pnf_p7, sfn_sf_tx); + } + + ++ //printf("pnf_p7->tick:%d\n", pnf_p7->tick); + if(pnf_p7->tick == 1000) + { + +- NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF P7:%d] DL:(%d/%d) UL:(%d/%d) HI:(%d/%d) TX:(%d/%d)\n", pnf_p7->_public.phy_id, ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF P7:%d] (ONTIME/LATE) DL:(%d/%d) UL:(%d/%d) HI:(%d/%d) TX:(%d/%d)\n", pnf_p7->_public.phy_id, + pnf_p7->stats.dl_conf_ontime, pnf_p7->stats.dl_conf_late, + pnf_p7->stats.ul_conf_ontime, pnf_p7->stats.ul_conf_late, + pnf_p7->stats.hi_dci0_ontime, pnf_p7->stats.hi_dci0_late, +@@ -694,6 +846,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf) + memset(&pnf_p7->stats, 0, sizeof(pnf_p7->stats)); + } + pnf_p7->tick++; ++#endif + + if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) + { +@@ -724,7 +877,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) + if(recv_sfn_sf_dec > ((current_sfn_sf_dec + timing_window) % NFAPI_MAX_SFNSFDEC)) + { + // out of window +- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is late %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec); ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is late %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec); + } + else + { +@@ -736,7 +889,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) + else + { + // too late +- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in late %d (%d)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (current_sfn_sf_dec - recv_sfn_sf_dec)); ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in late %d (delta:%d)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (current_sfn_sf_dec - recv_sfn_sf_dec)); + } + + } +@@ -751,8 +904,8 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy) + } + else + { +- // to far in the future +- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (%d) [%d]\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (recv_sfn_sf_dec - current_sfn_sf_dec), timing_window); ++ // too far in the future ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (delta:%d) [max:%d]\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (recv_sfn_sf_dec - current_sfn_sf_dec), timing_window); + } + + } +@@ -785,15 +938,35 @@ void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_ + return; + } + +- if(is_p7_request_in_window(req->sfn_sf, "dl_config_request", pnf_p7)) +- { +- uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); +- uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; ++ if ( ++ 0 && ++ (NFAPI_SFNSF2DEC(req->sfn_sf) % 100 ==0 || ++ NFAPI_SFNSF2DEC(req->sfn_sf) % 105 ==0 ++ ) ++ ) ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req sfn_sf:%d pdcch:%u dci:%u pdu:%u pdsch_rnti:%u pcfich:%u\n", ++ NFAPI_SFNSF2DEC(req->sfn_sf), ++ req->dl_config_request_body.number_pdcch_ofdm_symbols, ++ req->dl_config_request_body.number_dci, ++ req->dl_config_request_body.number_pdu, ++ req->dl_config_request_body.number_pdsch_rnti, ++ req->dl_config_request_body.transmission_power_pcfich ++ ); ++ ++ if(is_p7_request_in_window(req->sfn_sf, "dl_config_request", pnf_p7)) ++ { ++ uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); ++ uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; ++ ++ struct timespec t; ++ clock_gettime(CLOCK_MONOTONIC, &t); ++ ++ NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE DL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); + + // if there is already an dl_config_req make sure we free it. + if(pnf_p7->subframe_buffer[buffer_index].dl_config_req != 0) + { +- NFAPI_TRACE(NFAPI_TRACE_NOTE, "HERE HERE HERE\n"); ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "%s() is_p7_request_in_window()=TRUE buffer_index occupied - free it first sfn_sf:%d buffer_index:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), buffer_index); + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing dl_config_req at index %d (%d/%d)", + // pMyPhyInfo->sfnSf, bufferIdx, + // SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf)); +@@ -860,6 +1033,11 @@ void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_ + uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); + uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + ++ struct timespec t; ++ clock_gettime(CLOCK_MONOTONIC, &t); ++ ++ NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE UL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); ++ + if(pnf_p7->subframe_buffer[buffer_index].ul_config_req != 0) + { + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing ul_config_req at index %d (%d/%d)", +@@ -876,7 +1054,7 @@ void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_ + } + else + { +- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing ul_config_req SFN/SF %d/%d\n", pMyPhyInfo->sfnSf, SFNSF2SFN(req->sfn_sf), SFNSF2SF(req->sfn_sf)); ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing ul_config_req OUTSIDE OF TRANSMIT BUFFER WINDOW SFN/SF %d\n", NFAPI_SFNSF2DEC(pnf_p7->sfn_sf), NFAPI_SFNSF2DEC(req->sfn_sf)); + deallocate_nfapi_ul_config_request(req, pnf_p7); + + if(pnf_p7->_public.timing_info_mode_aperiodic) +@@ -994,6 +1172,16 @@ void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) + uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf); + uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size; + ++ struct timespec t; ++ clock_gettime(CLOCK_MONOTONIC, &t); ++ ++ NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE TX_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index); ++ ++ if (0 && NFAPI_SFNSF2DEC(req->sfn_sf)%100==0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX_REQ.req sfn_sf:%d pdus:%d - TX_REQ is within window\n", ++ __FUNCTION__, ++ NFAPI_SFNSF2DEC(req->sfn_sf), ++ req->tx_request_body.number_of_pdus); ++ + if(pnf_p7->subframe_buffer[buffer_index].tx_req != 0) + { + //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing tx_req at index %d (%d/%d)", +@@ -1010,6 +1198,8 @@ void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7) + } + else + { ++ NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() TX_REQUEST Request is outside of window REQ:SFN_SF:%d CURR:SFN_SF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), NFAPI_SFNSF2DEC(pnf_p7->sfn_sf)); ++ + deallocate_nfapi_tx_request(req, pnf_p7); + + if(pnf_p7->_public.timing_info_mode_aperiodic) +@@ -1126,12 +1316,27 @@ uint32_t calculate_t2(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t + uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); + uint32_t t2 = (NFAPI_SFNSF2DEC(sfn_sf) * 1000) + sf_time_us; + ++ if (0) ++ { ++ static uint32_t prev_t2 = 0; ++ ++ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(now_time_hr:%u sfn_sf:%d sf_start_time_Hr:%u) sf_time_us:%u t2:%u prev_t2:%u diff:%u\n", ++ __FUNCTION__, ++ now_time_hr, NFAPI_SFNSF2DEC(sfn_sf), sf_start_time_hr, ++ sf_time_us, ++ t2, ++ prev_t2, ++ t2-prev_t2); ++ ++ prev_t2 = t2; ++ } ++ + return t2; + } + + uint32_t calculate_t3(uint16_t sfn_sf, uint32_t sf_start_time_hr) + { +- uint32_t now_time_hr = get_current_time_hr(); ++ uint32_t now_time_hr = pnf_get_current_time_hr(); + + uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); + +@@ -1391,6 +1596,8 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time) + // read the segment + recvfrom_result = recvfrom(pnf_p7->p7_sock, pnf_p7->rx_message_buffer, header.message_length, MSG_DONTWAIT, (struct sockaddr*)&remote_addr, &remote_addr_size); + ++ now_hr_time = pnf_get_current_time_hr(); //DJP - moved to here - get closer timestamp??? ++ + if(recvfrom_result > 0) + { + pnf_handle_p7_message(pnf_p7->rx_message_buffer, recvfrom_result, pnf_p7, now_hr_time); +@@ -1417,7 +1624,10 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time) + + // need to update the time as we would only use the value from the + // select +- now_hr_time = get_current_time_hr(); ++#if 0 ++// DJP - why do this here and not on return from recv??? ++ now_hr_time = pnf_get_current_time_hr(); ++#endif + } + while(recvfrom_result > 0); + } +@@ -1512,7 +1722,7 @@ int pnf_p7_message_pump(pnf_p7_t* pnf_p7) + + selectRetval = select(pnf_p7->p7_sock+1, &rfds, NULL, NULL, &timeout); + +- uint32_t now_hr_time = get_current_time_hr(); ++ uint32_t now_hr_time = pnf_get_current_time_hr(); + + if(selectRetval == 0) + { +diff --git a/pnf_sim/src/main.cpp b/pnf_sim/src/main.cpp +index 38767d8..e2622cf 100644 +--- a/pnf_sim/src/main.cpp ++++ b/pnf_sim/src/main.cpp +@@ -1124,16 +1124,18 @@ int fapi_rx_ulsch_ind(fapi_t* fapi, fapi_rx_ulsch_ind_t* ind) + rx_ind.header.phy_id = data->p7_config->phy_id; + rx_ind.sfn_sf = ind->sfn_sf; + +- if(((pnf_info*)(data->config->user_data))->wireshark_test_mode) ++ if(1)//((pnf_info*)(data->config->user_data))->wireshark_test_mode) + { + rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG; +- rx_ind.rx_indication_body.number_of_pdus = 8; ++ rx_ind.rx_indication_body.number_of_pdus = 1; + + uint8_t rx_data[1024]; + + nfapi_rx_indication_pdu_t pdus[rx_ind.rx_indication_body.number_of_pdus]; + memset(&pdus, 0, sizeof(pdus)); + ++ strcpy((char*)rx_data, (char*)"123456789"); ++ + for(int i = 0; i < rx_ind.rx_indication_body.number_of_pdus;++i) + { + +@@ -1142,13 +1144,13 @@ int fapi_rx_ulsch_ind(fapi_t* fapi, fapi_rx_ulsch_ind_t* ind) + pdus[i].rx_ue_information.rnti = rand_range(1, 65535); + + pdus[i].rx_indication_rel8.tl.tag = NFAPI_RX_INDICATION_REL8_TAG; +- pdus[i].rx_indication_rel8.length = rand_range(0, 1024); +- pdus[i].rx_indication_rel8.offset = 1; ++ pdus[i].rx_indication_rel8.length = 10;//rand_range(0, 1024); ++ pdus[i].rx_indication_rel8.offset = 0;//djp - 1; + pdus[i].rx_indication_rel8.ul_cqi = rand_range(0, 255); + pdus[i].rx_indication_rel8.timing_advance = rand_range(0, 63); + +- pdus[i].rx_indication_rel9.tl.tag = NFAPI_RX_INDICATION_REL9_TAG; +- pdus[i].rx_indication_rel9.timing_advance_r9 = rand_range(0, 7690); ++ //pdus[i].rx_indication_rel9.tl.tag = NFAPI_RX_INDICATION_REL9_TAG; ++ //pdus[i].rx_indication_rel9.timing_advance_r9 = rand_range(0, 7690); + + pdus[i].data = &rx_data[0]; + } +diff --git a/vnf/inc/vnf_p7.h b/vnf/inc/vnf_p7.h +index ab9a335..fc2ab4e 100644 +--- a/vnf/inc/vnf_p7.h ++++ b/vnf/inc/vnf_p7.h +@@ -116,7 +116,8 @@ typedef struct { + + } vnf_p7_t; + +-uint32_t get_current_time_hr(); ++uint32_t vnf_get_current_time_hr(void); ++ + uint16_t increment_sfn_sf(uint16_t sfn_sf); + int vnf_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info); + int send_mac_subframe_indications(vnf_p7_t* config); +diff --git a/vnf/public_inc/nfapi_vnf_interface.h b/vnf/public_inc/nfapi_vnf_interface.h +index 6659e5d..4629013 100644 +--- a/vnf/public_inc/nfapi_vnf_interface.h ++++ b/vnf/public_inc/nfapi_vnf_interface.h +@@ -450,7 +450,7 @@ typedef struct nfapi_vnf_config + /*! Creates and initialise the vnf config structure before use + * \return A pointer to a vnf config structure + */ +-nfapi_vnf_config_t* nfapi_vnf_config_create(); ++nfapi_vnf_config_t* nfapi_vnf_config_create(void); + + /*! Delete an vnf config + */ +@@ -864,7 +864,7 @@ typedef struct nfapi_vnf_p7_config + /*! Creates and initializes the nfapi_vnf_p7_config structure before use + * \return A pointer to an allocated vnf p7 configuration + */ +-nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create(); ++nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create(void); + + /*! Cleanup and delete nfapi_vnf_p7_config structure + * \param config A pointer to an vnf p7 configuration structure +diff --git a/vnf/src/vnf.c b/vnf/src/vnf.c +index fea3cf7..6800ee2 100644 +--- a/vnf/src/vnf.c ++++ b/vnf/src/vnf.c +@@ -82,11 +82,18 @@ void nfapi_vnf_pnf_list_add(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* no + + nfapi_vnf_pnf_info_t* nfapi_vnf_pnf_list_find(nfapi_vnf_config_t* config, int p5_idx) + { ++ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : config->pnf_list:%p\n", __FUNCTION__, config->pnf_list); ++ + nfapi_vnf_pnf_info_t* curr = config->pnf_list; + while(curr != 0) + { + if(curr->p5_idx == p5_idx) ++ { ++ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->p5_idx:%d p5_idx:%d\n", __FUNCTION__, curr->p5_idx, p5_idx); + return curr; ++ } ++ ++ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->next:%p\n", __FUNCTION__, curr->next); + + curr = curr->next; + } +diff --git a/vnf/src/vnf_interface.c b/vnf/src/vnf_interface.c +index e559730..0aba0a2 100644 +--- a/vnf/src/vnf_interface.c ++++ b/vnf/src/vnf_interface.c +@@ -342,6 +342,7 @@ int nfapi_vnf_start(nfapi_vnf_config_t* config) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF connection (fd:%d) accepted from %s:%d \n", p5Sock, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); + nfapi_vnf_pnf_info_t* pnf = (nfapi_vnf_pnf_info_t*)malloc(sizeof(nfapi_vnf_pnf_info_t)); ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "MALLOC nfapi_vnf_pnf_info_t for pnf_list pnf:%p\n", pnf); + memset(pnf, 0, sizeof(nfapi_vnf_pnf_info_t)); + pnf->p5_sock = p5Sock; + pnf->p5_idx = p5_idx++; +@@ -663,7 +664,7 @@ int nfapi_vnf_allocate_phy(nfapi_vnf_config_t* config, int p5_idx, uint16_t* phy + info->p5_idx = p5_idx; + info->phy_id = vnf->next_phy_id++; + +- info->timing_window = 10; ++ info->timing_window = 30; // This seems to override what gets set by the user - why??? + info->timing_info_mode = 0x03; + info->timing_info_period = 128; + +diff --git a/vnf/src/vnf_p7.c b/vnf/src/vnf_p7.c +index 8630385..1304176 100644 +--- a/vnf/src/vnf_p7.c ++++ b/vnf/src/vnf_p7.c +@@ -15,6 +15,8 @@ + */ + + ++#include ++ + #include + #include + #include +@@ -159,7 +161,7 @@ vnf_p7_rx_message_t* vnf_p7_rx_reassembly_queue_add_segment(vnf_p7_t* vnf_p7, vn + msg->sequence_number = sequence_number; + msg->num_segments_expected = m ? 255 : segment_number + 1; + msg->num_segments_received = 1; +- msg->rx_hr_time = get_current_time_hr(); ++ msg->rx_hr_time = vnf_get_current_time_hr(); + + msg->segments[segment_number].buffer = (uint8_t*)vnf_p7_malloc(vnf_p7, data_len); + memcpy(msg->segments[segment_number].buffer, data, data_len); +@@ -216,7 +218,7 @@ void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reas + vnf_p7_rx_message_t* iterator = queue->msg_queue; + vnf_p7_rx_message_t* previous = 0; + +- uint32_t rx_hr_time = get_current_time_hr(); ++ uint32_t rx_hr_time = vnf_get_current_time_hr(); + + while(iterator != 0) + { +@@ -254,7 +256,7 @@ void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reas + } + } + +-uint32_t get_current_time_hr() ++uint32_t vnf_get_current_time_hr() + { + struct timeval now; + (void)gettimeofday(&now, NULL); +@@ -297,7 +299,7 @@ struct timespec timespec_delta(struct timespec start, struct timespec end) + return temp; + } + +-uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) ++static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) + { + if(now_hr < sf_start_hr) + { +@@ -321,7 +323,7 @@ uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr) + + uint32_t calculate_t1(uint16_t sfn_sf, uint32_t sf_start_time_hr) + { +- uint32_t now_time_hr = get_current_time_hr(); ++ uint32_t now_time_hr = vnf_get_current_time_hr(); + + uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); + +@@ -344,7 +346,7 @@ uint32_t calculate_t4(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t + + uint32_t calculate_transmit_timestamp(uint16_t sfn_sf, uint32_t sf_start_time_hr) + { +- uint32_t now_time_hr = get_current_time_hr(); ++ uint32_t now_time_hr = vnf_get_current_time_hr(); + + uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr); + +@@ -410,6 +412,8 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea + + int len = nfapi_p7_message_pack(header, buffer, sizeof(buffer), &vnf_p7->_public.codec_config); + ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size); ++ + if(len < 0) + { + NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() failed to pack p7 message phy_id:%d\n", __FUNCTION__, header->phy_id); +@@ -429,6 +433,7 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea + int segment = 0; + int offset = NFAPI_P7_HEADER_LENGTH; + uint8_t tx_buffer[vnf_p7->_public.segment_size]; ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() MORE THAN ONE SEGMENT phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size); + for(segment = 0; segment < segment_count; ++segment) + { + uint8_t last = 0; +@@ -851,7 +856,7 @@ void vnf_handle_p7_vendor_extension(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vn + + void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) + { +- uint32_t now_time_hr = get_current_time_hr(); ++ uint32_t now_time_hr = vnf_get_current_time_hr(); + + if (pRecvMsg == NULL || vnf_p7 == NULL) + { +@@ -871,7 +876,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) + nfapi_vnf_p7_connection_info_t* phy = vnf_p7_connection_info_list_find(vnf_p7, ind.header.phy_id); + uint32_t t4 = calculate_t4(now_time_hr, phy->sfn_sf, vnf_p7->sf_start_time_hr); + +- uint32_t tx_2_rx = t4 - ind.t1; ++ uint32_t tx_2_rx = t4>ind.t1 ? t4 - ind.t1 : t4 + NFAPI_MAX_SFNSFDEC - ind.t1 ; + uint32_t pnf_proc_time = ind.t3 - ind.t2; + + // divide by 2 using shift operator +@@ -881,7 +886,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) + { + phy->latency[phy->min_sync_cycle_count] = latency; + +- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) PNF to VNF !sync phy_id:%d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d\n", ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) PNF to VNF !sync phy_id:%d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d\n", + NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, ind.t1, ind.t2, ind.t3, t4, + tx_2_rx, pnf_proc_time, latency); + } +@@ -923,15 +928,27 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) + + if(1) + { +- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", +- NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, ++ struct timespec ts; ++ clock_gettime(CLOCK_MONOTONIC, &ts); ++ ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", ++ NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ts.tv_sec, ts.tv_nsec, ind.header.phy_id, + ind.t1, ind.t2, ind.t3, t4, +- tx_2_rx, pnf_proc_time, latency, phy->sf_offset, phy->sf_offset_filtered, ++ tx_2_rx, pnf_proc_time, latency, phy->average_latency, phy->sf_offset, phy->sf_offset_filtered, + (ind.t1previous_t1), (ind.t2previous_t2)); + } + + } + ++ if (phy->filtered_adjust && (phy->sf_offset_filtered > 1e6 || phy->sf_offset_filtered < -1e6)) ++ { ++ phy->filtered_adjust = 0; ++ phy->zero_count=0; ++ phy->min_sync_cycle_count = 2; ++ phy->in_sync = 0; ++ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s - ADJUST TOO BAD - go out of filtered phy->sf_offset_filtered:%d\n", __FUNCTION__, phy->sf_offset_filtered); ++ } ++ + if(phy->min_sync_cycle_count) + phy->min_sync_cycle_count--; + +@@ -954,7 +971,6 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) + phy->sf_offset = ind.t2 - (ind.t1 - phy->average_latency); + + sfn_sf_dec += (phy->sf_offset / 1000); +- + } + else + { +@@ -976,12 +992,11 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) + { + phy->adjustment = NFAPI_SFNSF2DEC(new_sfn_sf) - NFAPI_SFNSF2DEC(curr_sfn_sf); + +- //NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF phy_id:%d adjustment%d\n", ind.header.phy_id, phy->adjustment); ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF phy_id:%d adjustment%d phy->previous_sf_offset_filtered:%d phy->previous_sf_offset_filtered:%d phy->sf_offset_trend:%d\n", ind.header.phy_id, phy->adjustment, phy->previous_sf_offset_filtered, phy->previous_sf_offset_filtered, phy->sf_offset_trend); + + phy->previous_t1 = 0; + phy->previous_t2 = 0; + +- + if(phy->previous_sf_offset_filtered > 0) + { + if( phy->sf_offset_filtered > phy->previous_sf_offset_filtered) +@@ -1083,9 +1098,14 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) + + if(phy->insync_minor_adjustment != 0) + { +- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (sf_offset_filtered:%d) %d %d %d\n", ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adjustment:%d\n", + NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, +- phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->sf_offset_filtered, insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); ++ phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, ++ phy->sf_offset_filtered, ++ insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend, ++ NFAPI_SFNSF2DEC(new_sfn_sf), ++ NFAPI_SFNSF2DEC(curr_sfn_sf), ++ phy->adjustment); + } + } + } +@@ -1121,10 +1141,13 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) + // out of sync? + } + +- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (adjusment:%d sf_offset_filtered:%d) %d %d %d\n", ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adj:%d\n", + NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, + phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered, +- insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); ++ insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend, ++ NFAPI_SFNSF2DEC(new_sfn_sf), ++ NFAPI_SFNSF2DEC(curr_sfn_sf), ++ phy->adjustment); + + } + else if(phy->adjustment < 0) +@@ -1151,7 +1174,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) + // out of sync? + } + +- NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (adjusment:%d sf_offset_filtered:%d) %d %d %d\n", ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d\n", + NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, + phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered, + insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); +@@ -1219,7 +1242,16 @@ void vnf_handle_timing_info(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) + return; + } + +- // todo : how to use this? ++ if (vnf_p7 && vnf_p7->p7_connections) ++ { ++ int16_t vnf_pnf_sfnsf_delta = NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf) - NFAPI_SFNSF2DEC(ind.last_sfn_sf); ++ ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PNF:SFN/SF:%d VNF:SFN/SF:%d deltaSFNSF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind.last_sfn_sf), NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), vnf_pnf_sfnsf_delta); ++ if (vnf_pnf_sfnsf_delta>1 || vnf_pnf_sfnsf_delta < -1) ++ { ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() LARGE SFN/SF DELTA between PNF and VNF delta:%d VNF:%d PNF:%d\n\n\n\n\n\n\n\n\n", __FUNCTION__, vnf_pnf_sfnsf_delta, NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), NFAPI_SFNSF2DEC(ind.last_sfn_sf)); ++ } ++ } + } + + void vnf_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7) +diff --git a/vnf/src/vnf_p7_interface.c b/vnf/src/vnf_p7_interface.c +index ab4f00c..a35d8e3 100644 +--- a/vnf/src/vnf_p7_interface.c ++++ b/vnf/src/vnf_p7_interface.c +@@ -142,6 +142,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) + NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 bind succeeded...\n"); + + ++ //struct timespec original_pselect_timeout; + struct timespec pselect_timeout; + pselect_timeout.tv_sec = 0; + pselect_timeout.tv_nsec = 1000000; // ns in a 1 us +@@ -157,13 +158,13 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) + + struct timespec sf_duration; + sf_duration.tv_sec = 0; +- sf_duration.tv_nsec = 1000000; // ns in a 1 us ++ sf_duration.tv_nsec = 1e6; // We want 1ms pause + + struct timespec sf_start; + clock_gettime(CLOCK_MONOTONIC, &sf_start); + long millisecond = sf_start.tv_nsec / 1e6; + sf_start = timespec_add(sf_start, sf_duration); +- //NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec); ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec); + + while(vnf_p7->terminate == 0) + { +@@ -181,6 +182,8 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) + + if((last_millisecond == -1) || (millisecond == last_millisecond) || (millisecond == (last_millisecond + 1) % 1000) ) + { ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "pselect_start:%d.%d sf_start:%d.%d\n", pselect_start.tv_sec, pselect_start.tv_nsec, sf_start.tv_sec, sf_start.tv_nsec); ++ + + if((pselect_start.tv_sec > sf_start.tv_sec) || + ((pselect_start.tv_sec == sf_start.tv_sec) && (pselect_start.tv_nsec > sf_start.tv_nsec))) +@@ -196,16 +199,26 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) + { + // still time before the end of the subframe wait + pselect_timeout = timespec_sub(sf_start, pselect_start); ++ ++#if 0 ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sf_start:%d.%ld pselect_start:%d.%ld pseclect_timeout:%d.%ld\n", ++ __FUNCTION__, ++ sf_start.tv_sec, sf_start.tv_nsec, ++ pselect_start.tv_sec, pselect_start.tv_nsec, ++ pselect_timeout.tv_sec, pselect_timeout.tv_nsec); ++#endif + } + ++//original_pselect_timeout = pselect_timeout; ++ + // detemine how long to sleep in ns before the start of the next 1ms + //pselect_timeout.tv_nsec = 1e6 - (pselect_start.tv_nsec % 1000000); + +- //uint8_t underun_possiable =0; ++ //uint8_t underrun_possible =0; + + // if we are not sleeping until the next milisecond due to the + // insycn minor adjment flag it so we don't consider it an error +- //uint8_t underun_possiable =0; ++ //uint8_t underrun_possible =0; + /* + { + nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections; +@@ -222,7 +235,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) + pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000); + + +- //underun_possiable = 1; ++ //underrun_possible = 1; + } + else if(phy->insync_minor_adjustment < 0) + { +@@ -237,41 +250,98 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) + */ + + ++//long wraps = pselect_timeout.tv_nsec % 1e9; ++ ++ + selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL); + + clock_gettime(CLOCK_MONOTONIC, &pselect_stop); + ++ nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections; ++ ++if (selectRetval==-1 && errno == 22) ++{ ++ NFAPI_TRACE(NFAPI_TRACE_ERROR, "INVAL: pselect_timeout:%d.%ld adj[dur:%d adj:%d], sf_dur:%d.%ld\n", ++ pselect_timeout.tv_sec, pselect_timeout.tv_nsec, ++ phy->insync_minor_adjustment_duration, phy->insync_minor_adjustment, ++ sf_duration.tv_sec, sf_duration.tv_nsec); ++} ++#if 0 ++ if (selectRetval != 0 || phy->insync_minor_adjustment_duration != 0) ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "pselect()=%d maxSock:%d vnf_p7->socket:%d pselect_timeout:%u.%u original_pselect_timeout:%u.%u\n", ++ selectRetval, maxSock, vnf_p7->socket, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, ++ original_pselect_timeout.tv_sec, original_pselect_timeout.tv_nsec); ++#endif ++ + if(selectRetval == 0) + { +- // calcualte the start of the next subframe ++ // calculate the start of the next subframe + sf_start = timespec_add(sf_start, sf_duration); + //NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec); + +- nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections; + if(phy && phy->in_sync && phy->insync_minor_adjustment != 0 && phy->insync_minor_adjustment_duration > 0) + { +- NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] Subframe minor adjustment %dus\n", phy->insync_minor_adjustment); ++ long insync_minor_adjustment_ns = (phy->insync_minor_adjustment * 1000); ++ ++ sf_start.tv_nsec -= insync_minor_adjustment_ns; ++ ++#if 1 ++ if (sf_start.tv_nsec > 1e9) ++ { ++ sf_start.tv_sec++; ++ sf_start.tv_nsec-=1e9; ++ } ++ else if (sf_start.tv_nsec < 0) ++ { ++ sf_start.tv_sec--; ++ sf_start.tv_nsec+=1e9; ++ } ++#else ++ //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] BEFORE adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d\n", phy->insync_minor_adjustment, sf_start.tv_nsec); + if(phy->insync_minor_adjustment > 0) + { + // decrease the subframe duration a little +- sf_start.tv_nsec = sf_start.tv_nsec - (phy->insync_minor_adjustment * 1000); ++ if (sf_start.tv_nsec > insync_minor_adjustment_ns) ++ sf_start.tv_nsec -= insync_minor_adjustment_ns; ++ else ++ { ++ NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] Adjustment would make it negative sf:%d.%ld adjust:%ld\n\n\n", sf_start.tv_sec, sf_start.tv_nsec, insync_minor_adjustment_ns); ++ sf_start.tv_sec--; ++ sf_start.tv_nsec += 1e9 - insync_minor_adjustment_ns; ++ } + } + else if(phy->insync_minor_adjustment < 0) + { + // todo check we don't go below 0 + // increase the subframe duration a little +- sf_start.tv_nsec = sf_start.tv_nsec - (phy->insync_minor_adjustment * 1000); ++ sf_start.tv_nsec += insync_minor_adjustment_ns; ++ ++ if (sf_start.tv_nsec < 0) ++ { ++ NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] OVERFLOW %d.%ld\n\n\n\n", sf_start.tv_sec, sf_start.tv_nsec); ++ sf_start.tv_sec++; ++ sf_start.tv_nsec += 1e9; ++ } + } ++#endif + + //phy->insync_minor_adjustment = 0; +- phy->insync_minor_adjustment_duration--; ++ phy->insync_minor_adjustment_duration--; ++ ++ NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d duration:%u\n", ++ phy->insync_minor_adjustment, sf_start.tv_nsec, phy->insync_minor_adjustment_duration); ++ ++ if (phy->insync_minor_adjustment_duration==0) ++ { ++ phy->insync_minor_adjustment = 0; ++ } + } + /* + long pselect_stop_millisecond = pselect_stop.tv_nsec / 1e6; + if(millisecond == pselect_stop_millisecond) + { + // we have woke up in the same subframe +- if(underun_possiable == 0) ++ if(underrun_possible == 0) + NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe pselect underrun %ld (%d.%d)\n", millisecond, pselect_stop.tv_sec, pselect_stop.tv_nsec); + } + else if(((millisecond + 1) % 1000) != pselect_stop_millisecond) +@@ -298,7 +368,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) + + if(selectRetval == 0) + { +- vnf_p7->sf_start_time_hr = get_current_time_hr(); ++ vnf_p7->sf_start_time_hr = vnf_get_current_time_hr(); + + // pselect timed out + nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections; +@@ -326,14 +396,18 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config) + else + { + // pselect error +- if(selectRetval == EINTR) ++ if(selectRetval == -1 && errno == EINTR) + { + // a sigal was received. + } + else + { +- NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec); ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d orginal:%d.%d last_ms:%ld ms:%ld\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, last_millisecond, millisecond); + // should we exit now? ++ if (selectRetval == -1 && errno == 22) // invalid argument??? not sure about timeout duration ++ { ++ usleep(100000); ++ } + } + } + +@@ -360,10 +434,12 @@ int nfapi_vnf_p7_stop(nfapi_vnf_p7_config_t* config) + + int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id) + { +- NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(phy_id:%d pnf_addr:%s:%d)\n", __FUNCTION__, phy_id, pnf_p7_addr, pnf_p7_port); ++ NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p phy_id:%d pnf_addr:%s pnf_p7_port:%d)\n", __FUNCTION__, config, phy_id, pnf_p7_addr, pnf_p7_port); + + if(config == 0) +- return -1; ++ { ++ return -1; ++ } + + vnf_p7_t* vnf_p7 = (vnf_p7_t*)config; + +@@ -411,6 +487,8 @@ int nfapi_vnf_p7_del_pnf(nfapi_vnf_p7_config_t* config, int phy_id) + } + int nfapi_vnf_p7_dl_config_req(nfapi_vnf_p7_config_t* config, nfapi_dl_config_request_t* req) + { ++ //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p req:%p)\n", __FUNCTION__, config, req); ++ + if(config == 0 || req == 0) + return -1; + +diff --git a/vnf_sim/src/mac.cpp b/vnf_sim/src/mac.cpp +index aa97f72..fa6f487 100644 +--- a/vnf_sim/src/mac.cpp ++++ b/vnf_sim/src/mac.cpp +@@ -743,7 +743,7 @@ extern "C" + { + cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.number_of_cc = 1; + cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].ri_size = rand_range(0, 3); +- cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size = rand_range(0, 255); ++ cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0] = rand_range(0, 255); + } + + cqi_ri_information.cqi_ri_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG; +diff --git a/vnf_sim/src/main.cpp b/vnf_sim/src/main.cpp +index b79ac40..5dc7161 100644 +--- a/vnf_sim/src/main.cpp ++++ b/vnf_sim/src/main.cpp +@@ -428,6 +428,20 @@ void phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t* header) + free(header); + } + ++//static pthread_t vnf_start_pthread; ++static pthread_t vnf_p7_start_pthread; ++void* vnf_p7_start_thread(void *ptr) ++{ ++ printf("%s()\n", __FUNCTION__); ++ ++ //std::shared_ptr config = std::shared_ptr(ptr); ++ nfapi_vnf_p7_config_t *config = (nfapi_vnf_p7_config_t *)ptr; ++ ++ nfapi_vnf_p7_start(config); ++ ++ return 0; ++} ++ + void set_thread_priority(int priority) + { + //printf("%s(priority:%d)\n", __FUNCTION__, priority); +@@ -458,6 +472,8 @@ void set_thread_priority(int priority) + + void* vnf_p7_thread_start(void* ptr) + { ++ printf("%s()\n", __FUNCTION__); ++ + set_thread_priority(79); + + vnf_p7_info* p7_vnf = (vnf_p7_info*)ptr; +@@ -494,10 +510,10 @@ void* vnf_p7_thread_start(void* ptr) + p7_vnf->config->allocate_p7_vendor_ext = &phy_allocate_p7_vendor_ext; + p7_vnf->config->deallocate_p7_vendor_ext = &phy_deallocate_p7_vendor_ext; + +- nfapi_vnf_p7_start(p7_vnf->config.get()); ++ printf("[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__); ++ pthread_create(&vnf_p7_start_pthread, NULL, &vnf_p7_start_thread, p7_vnf->config.get()); + + return 0; +- + } + + int pnf_connection_indication_cb(nfapi_vnf_config_t* config, int p5_idx) +diff --git a/wireshark/packet-nfapi.c b/wireshark/packet-nfapi.c +index da0edb0..7e0f23f 100755 +--- a/wireshark/packet-nfapi.c ++++ b/wireshark/packet-nfapi.c +@@ -1,6069 +1,12284 @@ +-/* ++/* packet-nfapi.c ++* Routines for Network Function Application Platform Interface (nFAPI) dissection + * Copyright 2017 Cisco Systems, Inc. + * +-* Licensed under the Apache License, Version 2.0 (the "License"); +-* you may not use this file except in compliance with the License. +-* You may obtain a copy of the License at ++* Wireshark - Network traffic analyzer ++* By Gerald Combs ++* Copyright 1998 Gerald Combs ++* ++* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +-* http://www.apache.org/licenses/LICENSE-2.0 ++* References: ++* SCF082.09.04 http://scf.io/en/documents/082_-_nFAPI_and_FAPI_specifications.php + * +-* Unless required by applicable law or agreed to in writing, software +-* distributed under the License is distributed on an "AS IS" BASIS, +-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-* See the License for the specific language governing permissions and +-* limitations under the License. + */ +- +- +-#include "config.h" +- +-#include +-#include +-#include +- +-#include +-#include +-#include +-#include +-#include +- ++ ++#include "config.h" ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++void proto_register_nfapi(void); ++void proto_reg_handoff_nfapi(void); ++ + #define NFAPI_HEADER_LENGTH 8 +-#define NFAPI_P7_HEADER_LENGTH 16 +- +-typedef int(*Decode_operation)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset); +- +-static const value_string nfapi_error_vals[] = { +- { 0x0, "MSG_OK" }, +- { 0x1, "MSG_INVALID_STATE" }, +- { 0x2, "MSG_INVALID_CONFIG" }, +- { 0x3, "SFN_OUT_OF_SYNC" }, +- { 0x4, "MSG_SUBFRAME_ERR" }, +- { 0x5, "MSG_BCH_MISSING" }, +- { 0x6, "MSG_BCH_MISSING" }, +- { 0x7, "MSG_HI_ERR" }, +- { 0x8, "MSG_TX_ERR" }, +- { 0, NULL }, +-}; +- +-static const value_string nfapi_p4_error_vals[] = { +- { 100, "MSG_OK" }, +- { 101, "MSG_INVALID_STATE" }, +- { 102, "MSG_INVALID_CONFIG" }, +- { 103, "MSG_RAT_NOT_SUPPORTED" }, +- { 200, "MSG_NMM_STOP_OK" }, +- { 201, "MSG_NMM_STOP_IGNORED" }, +- { 202, "MSG_NMM_STOP_INVALID_STATE" }, +- { 300, "MSG_PROCEDURE_COMPLETE" }, +- { 301, "MSG_PROCEDURE_STOPPED" }, +- { 302, "MSG_PARTIAL_RESULTS" }, +- { 303, "MSG_TIMEOUT" }, +- { 0, NULL }, +-}; +- +-static const value_string nfapi_rat_type_vals[] = { +- { 0, "LTE" }, +- { 1, "UTRAN" }, +- { 2, "GERAN" }, +- { 0, NULL }, +-}; +- +-typedef enum{ +- UN_ALIGNED_SYNCHRONIZATION = 0, +- INTERNAL_PNF_FRAME_ALIGNMENT, +- ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION +-} nfapi_sync_mode_e; +- +-static const value_string nfapi_sync_mode_vals[] = { +- { UN_ALIGNED_SYNCHRONIZATION, "UN-ALIGNED SYNCHRONIZATION" }, +- { INTERNAL_PNF_FRAME_ALIGNMENT, "INTERNAL PNF FRAME ALIGNMENT" }, +- { ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION, "ABSOLUTE TIME ALIGNED SYNCHRONIZATION" } +-}; +- +-typedef enum { +- NONE = 0, +- GPS, +- GLONASS, +- BEIDOU +-} location_mode_e; +- +-static const value_string location_mode_vals[] = { +- { NONE, "NONE" }, +- { GPS, "GPS" }, +- { GLONASS, "GLONASS" }, +- { BEIDOU, "BeiDou" }, +- { 0, NULL } +-}; +- +-static const value_string nfapi_uplink_rs_hopping_vals[] = { +- { 0, "RS_NO_HOPPING" }, +- { 1, "RS_GROUP_HOPPING" }, +- { 2, "RS_SEQUENCE_HOPPING" }, +- { 0, NULL } +-}; +- +-static const value_string nfapi_laa_carrier_type_vals[] = { +- { 0, "No multi carrier support" }, +- { 1, "Mode A1" }, +- { 2, "Mode A12" }, +- { 3, "Mode B1" }, +- { 4, "Mode B2" }, +- { 0, NULL } +-}; +- +-static const value_string nfapi_mutli_carrier_lbt_support_vals[] = { +- { 0, "Multi carrier Mode A1" }, +- { 1, "Multi carrier Mode A2" }, +- { 2, "Multi carrier Mode B1" }, +- { 3, "Multi carrier Mode B2" }, +- { 0, NULL } +-}; +- +-static const value_string nfapi_lbt_dl_req_pdu_type[] = { +- { 0, "LBT_PDSCH_REQ PDU" }, +- { 1, "LBT_DRS_REQ PDU" }, +- { 0, NULL } +-}; +- +- +-static const value_string nfapi_lbt_dl_ind_pdu_type[] = { +- { 0, "LBT_PDSCH_RSP PDU" }, +- { 1, "LBT_DRS_RSP PDU" }, +- +- { 0, NULL } +-}; +- +- +- +- +-/* These are definitions where data 0 & 1 represent/provide a string name*/ +- +-static const true_false_string true_false_strname = { +- "TRUE", +- "FALSE" +-}; +- +-static const true_false_string nfapi_csi_report_type_strname = { +- "Periodic", +- "Aperiodic", +-}; +- +-static const true_false_string nfapi_control_type_string_name = { +- "CQI/PMI", +- "RI", +-}; +- +-static const true_false_string transport_block_to_codeword_swap_flag = { +- "NO_SWAPPING", +- "SWAPPED" +-}; +- +-static const true_false_string virtual_resource_block_assignment_flag = { +- "LOCALIZED", +- "DISTRIBUTED" +-}; +- +-static const true_false_string ngap_string_name = { +- "N-GAP 1", +- "N-GAP 2" +-}; +- +-static const true_false_string nprb_strname = { +- "= 2", +- "= 3", +-}; +- +-static const true_false_string cyclic_prefix_type_strname = { +- "CP_NORMAL", +- "CP_EXTENDED" +-}; +- +-static const true_false_string support_strname = { +- "No Support", +- "Support" +-}; +- +-static const true_false_string partial_sf_support_strname = +-{ +- "Start partial SF support", +- "End partial SF support" +-}; +- +-static const true_false_string phich_duration_strname = { +- "PHICH_D_NORMAL", +- "PHICH_D_EXTENDED" +-}; +- +-static const true_false_string high_speed_flag_strname = { +- "HS_UNRESTRICTED_SET", +- "HS_RESTRICTED_SET" +-}; +- +-static const true_false_string hopping_mode_strname = { +- "HM_INTER_SF", +- "HM_INTRA_INTER_SF" +-}; +- +-static const true_false_string enabled_disabled_strname = { +- "Enabled", +- "Disabled" +-}; +- +-static const true_false_string srs_simult_tx_strname = { +- "No Simultaneous Transmission", +- "Simultaneous Transmission" +-}; +- +-static const true_false_string crc_flag_strname = { +- "CRC_CORRECT", +- "CRC_ERROR" +-}; +- +-static const true_false_string hi_value_strname = { +- "HI_NACK", +- "HI_ACK" +-}; +- +-static const true_false_string flag_tb2_strname = { +- "HI_NOT_PRESENT", +- "HI_PRESENT" +-}; +- +-static const true_false_string nfapi_multi_carrier_tx_strname = { +- "Mutual transmission (self-deferral support for current carrier)", +- "Transmit on channel access win (no self-deferral)" +-}; +- +-static const true_false_string nfapi_multi_carrier_freeze_strname = { +- "Absence of other technology isn’t guaranteed", +- "Absence of other technology is guaranteed" +-}; +- +-static const value_string nfapi_dl_config_pdu_type_vals[] = { +- { 0, "DL_CONFIG_DCI_DL_PDU" }, +- { 1, "DL_CONFIG_BCH_PDU" }, +- { 2, "DL_CONFIG_MCH_PDU" }, +- { 3, "DL_CONFIG_DLSCH_PDU" }, +- { 4, "DL_CONFIG_PCH_PDU" }, +- { 5, "DL_CONFIG_PRS_PDU" }, +- { 6, "DL_CONFIG_CSI_RS_PDU" }, +- { 7, "DL_CONFIG_EPDCCH_DL_PDU" }, +- { 8, "DL_CONFIG_EPDCCH_DL_PDU" }, +- { 0, NULL } +-}; +- +-static const value_string nfapi_duplex_mode_vals[] = { +- { 0, "TDD" }, +- { 1, "FDD" }, +- { 2, "HD-FDD" }, +- { 0, NULL } +-}; +- +-static const value_string modulation_vals[] = { +- { 2, "QPSK" }, +- { 4, "16QAM" }, +- { 6, "64QAM" }, +- { 8, "256QAM" }, +- { 0, NULL } +-}; +- +-static const value_string pch_modulation_vals[] = { +- { 0, "QPSK" }, +- { 0, NULL } +-}; +- +-static const value_string ue_mode_vals[] = { +- { 0, "non LC/CE UE" }, +- { 1, "LC/CE UE" }, +- { 0, NULL } +-}; +- +-static const value_string csi_rs_class_vals[] = { +- { 0, "not used" }, +- { 1, "Class A" }, +- { 1, "Class B" }, +- { 0, NULL } +-}; +- +-static const value_string csi_rs_cdm_type_vals[] = { +- { 0, "cdm 2" }, +- { 1, "cdm 4" }, +- { 0, NULL } +-}; +- +-static const value_string antenna_ports_vals[] = { +- { 0, "1 antenna ports" }, +- { 1, "2 antenna ports" }, +- { 2, "4 antenna ports" }, +- { 0, NULL } +-}; +- +-static const value_string combs_vals[] = { +- { 0, "2 TC" }, +- { 1, "4 TC" }, +- { 0, NULL } +-}; +- +-static const value_string resource_allocation_type_vals[] = { +- { 0, "type 0" }, +- { 1, "type 1" }, +- { 2, "type 2 1A/1B/1D" }, +- { 3, "type 2 1C" }, +- { 4, "type 2 6-1A" }, +- { 5, "type UEModeB" }, +- { 0, NULL } +-}; +- +-static const value_string transmission_scheme_vals[] = { +- { 0, "SINGLE_ANTENNA_PORT_0" }, +- { 1, "TX_DIVERSITY" }, +- { 2, "LARGE_DELAY_CDD" }, +- { 3, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, +- { 4, "MULTI_USER_MIMO" }, +- { 5, "CLOSED_LOOP_RANK_1_PRECODING" }, +- { 6, "SINGLE_ANTENNA_PORT_5" }, +- { 7, "SINGLE_ANTENNA_PORT_7" }, +- { 8, "SINGLE_ANTENNA_PORT_8" }, +- { 9, "DUAL_LAYER_TX_PORT_7_AND_8" }, +- { 10, "UP_TO_8_LAYER_TX" }, +- { 11, "SINGLE_ANTENNA_PORT_11" }, +- { 12, "SINGLE_ANTENNA_PORT_13" }, +- { 13, "SINGLE_ANTENNA_PORT_11_13" }, +- { 0, NULL } +-}; +- +-static const value_string ul_transmission_scheme_vals[] = { +- { 0, "SINGLE_ANTENNA_PORT_10" }, +- { 1, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, +-}; +- +-static const value_string dci_format_vals[] = { +- { 0, "1" }, +- { 1, "1A" }, +- { 2, "1B" }, +- { 3, "1C" }, +- { 4, "1D" }, +- { 5, "2" }, +- { 6, "2A" }, +- { 7, "2B" }, +- { 8, "2C" }, +- { 9, "2D" }, +- { 0, NULL } +-}; +- +-static const value_string pa_vals[] = { +- { 0, "-6dB" }, +- { 1, "-4.77dB" }, +- { 2, "-3dB" }, +- { 3, "-1.77dB" }, +- { 4, "0dB" }, +- { 5, "1dB" }, +- { 6, "2dB" }, +- { 7, "3dB" }, +- { 0, NULL } +-}; +- +-static const value_string transmission_mode_vals[] = { +- { 1, "Mode 1" }, +- { 2, "Mode 2" }, +- { 3, "Mode 3" }, +- { 4, "Mode 4" }, +- { 5, "Mode 5" }, +- { 6, "Mode 6" }, +- { 7, "Mode 7" }, +- { 8, "Mode 8" }, +- { 9, "Mode 9" }, +- { 10, "Mode 10" }, +- { 0, NULL } +-}; +- +-static const value_string nfapi_ul_config_pdu_type_vals[] = { +- { 0, "ULSCH" }, +- { 1, "ULSCH_CQI_RI" }, +- { 2, "ULSCH_HARQ" }, +- { 3, "ULSCH_CQI_HARQ_RI" }, +- { 4, "UCI_CQI" }, +- { 5, "UCI_SR" }, +- { 6, "UCI_HARQ" }, +- { 7, "UCI_SR_HARQ" }, +- { 8, "UCI_CQI_HARQ" }, +- { 9, "UCI_CQI_SR" }, +- { 10, "UCI_CQI_SR_HARQ" }, +- { 11, "SRS" }, +- { 12, "HARQ_BUFFER" }, +- { 13, "ULSCH_UCI_CSI" }, +- { 14, "ULSCH_UCI_HARQ" }, +- { 15, "ULSCH_CSI_UCI_HARQ" }, +- { 0, NULL } +-}; +- +-typedef enum { +- NFAPI_ACK_NACK_MODE_BUNDLING = 0, +- NFAPI_ACK_NACK_MODE_MULTIPLEXING, +- NFAPI_ACK_NACK_MODE_FORMAT_1B_WITH_CHAN_SEL, +- NFAPI_ACK_NACK_MODE_FORMAT_3, +-} nfapi_ack_nack_mode_e; +- +-static const value_string nfapi_ack_nack_mode_vals[] = { +- { NFAPI_ACK_NACK_MODE_BUNDLING, "Bundling" }, +- { NFAPI_ACK_NACK_MODE_MULTIPLEXING, "Multiplexing" }, +- { NFAPI_ACK_NACK_MODE_FORMAT_1B_WITH_CHAN_SEL, "Format 1b with channel selection" }, +- { NFAPI_ACK_NACK_MODE_FORMAT_3, "Format 3" }, +- { 0, NULL } +-}; +- +-typedef enum { +- NFAPI_ANTENNA_PORT1 = 0, +- NFAPI_ANTENNA_PORT2, +- NFAPI_ANTENNA_PORT4, +-} nfapi_ack_nack_mode_e; +- +-static const value_string nfapi_antenna_port_vals[] = { +- { NFAPI_ANTENNA_PORT1, "1 " }, +- { NFAPI_ANTENNA_PORT2, "2 " }, +- { NFAPI_ANTENNA_PORT4, "4 " }, +- { 0, NULL } +-}; +- +-typedef enum{ +- PHICH_R_ONE_SIXTH = 0, +- PHICH_R_HALF, +- PHICH_R_ONE, +- PHICH_R_TWO +-} nfapi_phich_resource_e; +- +-static const value_string nfapi_phich_resource_vals[] = { +- { PHICH_R_ONE_SIXTH, "PHICH_R_ONE_SIXTH " }, +- { PHICH_R_HALF, "PHICH_R_HALF" }, +- { PHICH_R_ONE, "PHICH_R_ONE" }, +- { PHICH_R_TWO, "PHICH_R_TWO" }, +- { 0, NULL } +-}; +- +-static const value_string local_distributed_vals[] = { +- { 0, "localized" }, +- { 1, "distributed" }, +- { 0, NULL } +-}; +- +-static const value_string transport_block_to_codeword_swap_flag_vals[] = { +- { 0, "no swapping" }, +- { 1, "swapped" }, +- { 0, NULL } +-}; +- +-static const value_string ngap_vals[] = { +- { 0, "Ngap1" }, +- { 1, "Ngap2" }, +- { 0, NULL } +-}; +- +-static const value_string true_false_vals[] = { +- { 0, "false" }, +- { 1, "true" }, +- { 0, NULL } +-}; +- +-static const value_string exhustive_search_vals[] = { +- { 0, "non-exhaustive search" }, +- { 1, "exhaustive search" }, +- { 0, NULL } +-}; +- +-static const value_string not_used_enabled_vals[] = { +- { 0, "not used" }, +- { 1, "enabled" }, +- { 0, NULL } +-}; +- +-static const value_string hopping_vals[] = { +- { 0, "no hopping" }, +- { 1, "hopping enabled" }, +- { 0, NULL } +-}; +- +- +-static const value_string rnti_type_vals[] = { +- { 1, "C-RNTI" }, +- { 2, "RA-RNTI, P-RNTI, SI-RNTI, SC-RNTI, G-RNTI" }, +- { 3, "SPS-CRNTI" }, +- { 0, NULL } +-}; +- +-static const value_string primary_cells_type_vals[] = { +- { 1, "TDD" }, +- { 2, "FDD" }, +- { 3, "HD_FDD" }, +- { 0, NULL } +-}; +- +-static const value_string ul_rssi_supported_vals[] = { +- { 0, "Uplink RSSI not supported" }, +- { 1, "Uplink RSSI supported" }, +- { 0, NULL} +-}; +- +- +-typedef enum +-{ +- NMM_NONE = 0, +- NMM_ONLY, +- NMM_IN_CONFIGURED_STATE, +- NMM_IN_RUNNING_STATE, +- NMM_IN_CONFIGURED_AND_RUNNING_STATE +-} nmm_modes_supported_e; +- +-static const value_string nmm_modes_supported_vals[] = +-{ +- { NMM_NONE, "NONE" }, +- { NMM_ONLY, "NMM_ONLY" }, +- { NMM_IN_CONFIGURED_STATE, "NMM_IN_CONFIGURED_STATE" }, +- { NMM_IN_RUNNING_STATE, "NMM_IN_RUNNING_STATE" }, +- { NMM_IN_CONFIGURED_AND_RUNNING_STATE, "NMM_IN_CONFIGURED_AND_RUNNING_STAT" }, +- { 0, NULL } +-}; +- +- +- +- +- +-static int proto_nfapi = -1; +- +-/* These are for the subtrees */ +-static gint ett_nfapi_message_tree = -1; +-static gint ett_nfapi_p4_p5_message_header = -1; +-static gint ett_nfapi_p7_message_header = -1; +-static gint ett_nfapi_tlv_tree = -1; +-static gint ett_nfapi_tl = -1; +-static gint ett_nfapi_pnf_param_response = -1; +-static gint ett_nfapi_pnf_phy = -1; +-static gint ett_nfapi_pnf_phy_rel10 = -1; +-static gint ett_nfapi_pnf_phy_rel11 = -1; +-static gint ett_nfapi_pnf_phy_rel12 = -1; +-static gint ett_nfapi_pnf_phy_rel13 = -1; +-static gint ett_nfapi_pnf_rf = -1; +-static gint ett_nfapi_phy_rf_config_info = -1; +-static gint ett_nfapi_pnf_phy_rf_config = -1; +-static gint ett_nfapi_pnf_phy_rf_config_instance = -1; +-static gint ett_nfapi_phy_state = -1; +-static gint ett_nfapi_l1_status = -1; +-static gint ett_nfapi_rf_bands = -1; +-static gint ett_nfapi_tx_antenna_ports = -1; +-static gint ett_nfapi_harq_ack_nack_data = -1; +-static gint ett_nfapi_harq_data = -1; +-static gint ett_nfapi_cc = -1; +-static gint ett_nfapi_rbs = -1; +-static gint ett_nfapi_antennas = -1; +-static gint ett_nfapi_dl_config_dci_dl_pdu_rel8 = -1; +-static gint ett_nfapi_dl_config_dci_dl_pdu_rel9 = -1; +-static gint ett_nfapi_dl_config_dci_dl_pdu_rel10 = -1; +-static gint ett_nfapi_dl_config_dci_dl_pdu = -1; +-static gint ett_nfapi_dl_config_request_pdu = -1; +-static gint ett_nfapi_dl_config_request_body = -1; +-static gint ett_nfapi_dl_config_request_pdu_list = -1; +-static gint ett_nfapi_ul_config_request_pdu_list = -1; +-static gint ett_nfapi_hi_dci0_request_pdu_list = -1; +-static gint ett_nfapi_tx_request_pdu_list = -1; +-static gint ett_nfapi_rx_indication_pdu_list = -1; +-static gint ett_nfapi_harq_indication_pdu_list = -1; +-static gint ett_nfapi_crc_indication_pdu_list = -1; +-static gint ett_nfapi_sr_indication_pdu_list = -1; +-static gint ett_nfapi_cqi_indication_pdu_list = -1; +-static gint ett_nfapi_preamble_indication_pdu_list = -1; +-static gint ett_nfapi_srs_indication_pdu_list = -1; +-static gint ett_nfapi_lbt_dl_config_pdu_list = -1; +-static gint ett_nfapi_lbt_dl_indication_pdu_list = -1; +-static gint ett_nfapi_dl_node_sync = -1; +-static gint ett_nfapi_ul_node_sync = -1; +-static gint ett_nfapi_timing_info = -1; +-static gint ett_nfapi_dl_config_request_dlsch_pdu_rel8 = -1; +-static gint ett_nfapi_subbands = -1; +-static gint ett_nfapi_dl_config_request_dlsch_pdu_rel9 = -1; +-static gint ett_nfapi_dl_config_request_dlsch_pdu_rel10 = -1; +-static gint ett_nfapi_dl_config_bch_pdu_rel8 = -1; +-static gint ett_nfapi_dl_config_mch_pdu_rel8 = -1; +-static gint ett_nfapi_dl_config_pch_pdu_rel8 = -1; +-static gint ett_nfapi_dl_config_prs_pdu_rel9 = -1; +-static gint ett_nfapi_dl_config_csi_rs_pdu_rel10 = -1; +-static gint ett_nfapi_ul_config_request_body = -1; +-static gint ett_nfapi_ul_config_harq_buffer_pdu = -1; +-static gint ett_nfapi_ul_config_ue_information_rel8 = -1; +-static gint ett_nfapi_ul_config_sr_information_pdu_rel8 = -1; +-static gint ett_nfapi_ul_config_ulsch_pdu_rel8 = -1; +-static gint ett_nfapi_ul_config_ulsch_pdu_rel10 = -1; +-static gint ett_nfapi_ul_config_cqi_ri_information_rel8 = -1; +-static gint ett_nfapi_ul_config_cqi_ri_information_rel9 = -1; +-static gint ett_nfapi_ul_config_ulsch_harq_information_rel10 = -1; +-static gint ett_nfapi_ul_config_initial_transmission_parameters_rel8 = -1; +-static gint ett_nfapi_ul_config_cqi_information_rel8 = -1; +-static gint ett_nfapi_ul_config_cqi_information_rel10 = -1; +-static gint ett_nfapi_ul_config_sr_information_rel8 = -1; +-static gint ett_nfapi_ul_config_sr_information_rel10 = -1; +-static gint ett_nfapi_ul_config_harq_information_rel10_tdd = -1; +-static gint ett_nfapi_ul_config_harq_information_rel8_fdd = -1; +-static gint ett_nfapi_ul_config_harq_information_rel9_fdd = -1; +-static gint ett_nfapi_ul_config_srs_pdu_rel8 = -1; +-static gint ett_nfapi_ul_config_srs_pdu_rel10 = -1; +-static gint ett_nfapi_crc_indication_body = -1; +-static gint ett_nfapi_bf_vector_antennas = -1; +-static gint ett_nfapi_bf_vectors = -1; +-static gint ett_nfapi_csi_rs_resource_configs = -1; +-static gint ett_nfapi_csi_rs_bf_vector = -1; +-static gint ett_nfapi_epdcch_prbs = -1; +-static gint ett_nfapi_precoding = -1; +-static gint ett_nfapi_earfcn_list = -1; +-static gint ett_nfapi_uarfcn_list = -1; +-static gint ett_nfapi_arfcn_list = -1; +-static gint ett_nfapi_rssi_list = -1; +-static gint ett_nfapi_pci_list = -1; +-static gint ett_nfapi_psc_list = -1; +-static gint ett_nfapi_lte_cells_found_list = -1; +-static gint ett_nfapi_utran_cells_found_list = -1; +-static gint ett_nfapi_geran_cells_found_list = -1; +-static gint ett_nfapi_si_periodicity_list = -1; +- +-static expert_field ei_invalid_range = EI_INIT; +-static expert_field ei_power_invalid = EI_INIT; +-static expert_field ei_ref_sig_power_invalid = EI_INIT; +- +- +-static int hf_nfapi_message_tree = -1; +- +-static int hf_nfapi_p4_p5_message_header = -1; +-static int hf_nfapi_p4_p5_message_header_phy_id = -1; +-static int hf_nfapi_p4_p5_message_header_message_id = -1; +-static int hf_nfapi_p4_p5_message_header_message_length = -1; +-static int hf_nfapi_p4_p5_message_header_spare = -1; +- +-static int hf_nfapi_p7_message_header = -1; +-static int hf_nfapi_p7_message_header_phy_id = -1; +-static int hf_nfapi_p7_message_header_message_id = -1; +-static int hf_nfapi_p7_message_header_message_length = -1; +-static int hf_nfapi_p7_message_header_m = -1; +-static int hf_nfapi_p7_message_header_segment = -1; +-static int hf_nfapi_p7_message_header_sequence_number = -1; +-static int hf_nfapi_p7_message_header_checksum = -1; +-static int hf_nfapi_p7_message_header_transmit_timestamp = -1; +- +-static int hf_nfapi_tlv_tree = -1; +- +-static int hf_nfapi_tl = -1; +-static int hf_nfapi_tl_tag = -1; +-static int hf_nfapi_tl_length = -1; +-static int hf_nfapi_tag_uint8_value = -1; +-static int hf_nfapi_tag_uint16_value = -1; +- +-static int hf_nfapi_pnf_param_general = -1; +-static int hf_nfapi_sync_mode = -1; +-static int hf_nfapi_location_mode = -1; +-static int hf_nfapi_location_coordinates = -1; +-static int hf_nfapi_location_coordinates_length = -1; +-static int hf_nfapi_dl_config_timing = -1; +-static int hf_nfapi_tx_timing = -1; +-static int hf_nfapi_ul_config_timing = -1; +-static int hf_nfapi_hi_dci0_timing = -1; +-static int hf_nfapi_maximum_number_phys = -1; +-static int hf_nfapi_maximum_total_bandwidth = -1; +-static int hf_nfapi_maximum_total_number_dl_layers = -1; +-static int hf_nfapi_maximum_total_number_ul_layers = -1; +-static int hf_nfapi_shared_bands = -1; +-static int hf_nfapi_shared_pa = -1; +-static int hf_nfapi_maximum_total_power = -1; +-static int hf_nfapi_oui= -1; +- +-static int hf_nfapi_pdu = -1; +- +-static int hf_nfapi_pnf_phy = -1; +-static int hf_nfapi_pnf_phy_nfapi_tl = -1; /* structure hf_nfapi_tl*/ +-static int hf_nfapi_pnf_phy_number_phy = -1; +-static int hf_nfapi_pnf_phy_config_index = -1; +-static int hf_nfapi_number_of_rf_exclusions = -1; +-static int hf_nfapi_dl_bandwidth_support = -1; +-static int hf_nfapi_ul_bandwidth_support = -1; +-static int hf_nfapi_downlink_channel_bandwidth_supported = -1; +-static int hf_nfapi_uplink_channel_bandwidth_supported = -1; +-static int hf_nfapi_number_of_dl_layers_supported = -1; +-static int hf_nfapi_number_of_ul_layers_supported = -1; +-static int hf_nfapi_maximum_3gpp_release_supported = -1; +-static int hf_nfapi_nmm_modes_supported = -1; +- +- +-static int hf_nfapi_pnf_rf = -1; +-static int hf_nfapi_pnf_rf_nfapi_tl = -1; +-static int hf_nfapi_number_of_rfs = -1; +-static int hf_nfapi_rf_config_index = -1; +-static int hf_nfapi_band = -1; +-static int hf_nfapi_maximum_transmit_power = -1; +-static int hf_nfapi_earfcn = -1; +-static int hf_nfapi_minimum_transmit_power = -1; +-static int hf_nfapi_number_of_antennas_suppported = -1; +-static int hf_nfapi_minimum_downlink_frequency = -1; +-static int hf_nfapi_maximum_downlink_frequency = -1; +-static int hf_nfapi_minimum_uplink_frequency = -1; +-static int hf_nfapi_maximum_uplink_frequency = -1; +- +-static int hf_nfapi_number_of_rf_bands = -1; +-static int hf_nfapi_nmm_uplink_rssi_supported = -1; +- +-static int hf_nfapi_phy_rf_config_info = -1; +-static int hf_nfapi_phy_rf_config_info_phy_id = -1; +-static int hf_nfapi_phy_rf_config_info_band = -1; +- +-static int hf_nfapi_pnf_phy_rf_config = -1; +-static int hf_nfapi_pnf_phy_rf_config_number_phy_rf_config_info = -1; +-static int hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info = -1; +- +-static int hf_nfapi_pnf_phy_rel10 = -1; +-static int hf_nfapi_transmission_mode7_supported = -1; +-static int hi_nfapi_transmission_mode8_supported = -1; +-static int hi_nfapi_two_antennas_ports_for_pucch = -1; +-static int hi_nfapi_transmission_mode_9_supported = -1; +-static int hi_nfapi_simultaneous_pucch_pusch = -1; +-static int hi_nfapi_for_layer_tx_with_tm3_and_tm4 = -1; +- +-static int hf_nfapi_pnf_phy_rel11 = -1; +-static int hf_nfapi_epdcch_supported = -1; +-static int hi_nfapi_multi_ack_csi_reporting = -1; +-static int hi_nfapi_pucch_tx_diversity_with_channel_selection = -1; +-static int hi_nfapi_ul_comp_supported = -1; +-static int hi_nfapi_transmission_mode_5_supported = -1; +- +-static int hf_nfapi_pnf_phy_rel12 = -1; +-static int hf_nfapi_csi_subframe_set = -1; +-static int hi_nfapi_enhanced_4tx_codebook = -1; +-static int hi_nfapi_drs_supported = -1; +-static int hi_nfapi_ul_64qam_supported = -1; +-static int hi_nfapi_transmission_mode_10_supported = -1; +-static int hi_nfapi_alternative_tbs_indices = -1; +- +-static int hf_nfapi_pnf_phy_rel13 = -1; +-static int hf_nfapi_pucch_format_4_supported = -1; +-static int hf_nfapi_pucch_format_5_supported = -1; +-static int hf_nfapi_more_than_5_ca_supported = -1; +-static int hf_nfapi_laa_supported = -1; +-static int hf_nfapi_laa_ending_in_dwpts_supported = -1; +-static int hf_nfapi_laa_starting_in_second_slot_supported = -1; +-static int hf_nfapi_beamforming_supported = -1; +-static int hf_nfapi_csi_rs_enhancements_supported = -1; +-static int hf_nfapi_drms_enhancements_supported = -1; +-static int hf_nfapi_srs_enhancements_supported = -1; +- +- +-// P5 Message Structures +-static int hf_nfapi_pnf_param_response_pnf_param_general = -1; +-static int hf_nfapi_pnf_param_response_pnf_phy = -1; +-static int hf_nfapi_pnf_param_response_pnf_rf = -1; +- +-static int hf_nfapi_pnf_param_request = -1; +-static int hf_nfapi_pnf_param_response = -1; +-static int hf_nfapi_pnf_config_request = -1; +-static int hf_nfapi_pnf_config_response = -1; +-static int hf_nfapi_pnf_start_request = -1; +-static int hf_nfapi_pnf_start_response = -1; +-static int hf_nfapi_pnf_stop_request = -1; +-static int hf_nfapi_pnf_stop_response = -1; +-static int hf_nfapi_param_response = -1; +-static int hf_nfapi_start_request = -1; +-static int hf_nfapi_start_response = -1; +-static int hf_nfapi_stop_request = -1; +-static int hf_nfapi_stop_response = -1; +- +-static int hf_nfapi_uint8_tag = -1; +-static int hf_nfapi_uint16_tag = -1; +- +-static int hf_nfapi_error_code = -1; +-static int hf_nfapi_p4_error_code = -1; +-static int hf_nfapi_rat_type = -1; +-static int hf_nfapi_num_tlv = -1; +-static int hf_nfapi_phy_state = -1; +-// static int hf_nfapi_bandwidth_support = -1; +- +-static int hf_nfapi_modulation_support = -1; +-static int hf_nfapi_phy_antenna_capability = -1; +-static int hf_nfapi_release_capability = -1; +-static int hf_nfapi_mbsfn_capability = -1; +- +-static int hf_nfapi_laa_capability = -1; +-static int hf_nfapi_pd_sensing_lbt_support = -1; +-static int hf_nfapi_multi_carrier_lbt_support = -1; +-static int hf_nfapi_partial_sf_support = -1; +- +-/* nfapi nfapi */ +-static int hf_nfapi_pnf_address = -1; +-static int hf_nfapi_pnf_address_ipv4 = -1; +-static int hf_nfapi_pnf_address_ipv6 = -1; +- +-static int hf_nfapi_vnf_address = -1; +-static int hf_nfapi_vnf_address_ipv4 = -1; +-static int hf_nfapi_vnf_address_ipv6 = -1; +- +-static int hf_nfapi_pnf_port = -1; +-static int hf_nfapi_vnf_port = -1; +-static int hf_nfapi_dl_ue_per_sf = -1; +-static int hf_nfapi_ul_ue_per_sf = -1; +- +-static int hf_nfapi_rf_bands = -1; +-static int hf_nfapi_rf_bands_nfapi_tl = -1; +-static int hf_nfapi_rf_bands_count = -1; +-static int hf_nfapi_rf_bands_value = -1; +- +-static int hf_nfapi_timing_window = -1; +-static int hf_nfapi_timing_info_mode = -1; +-static int hf_nfapi_timing_info_period = -1; +-static int hf_nfapi_max_transmit_power = -1; +- +-/* subframe config */ +-static int hf_nfapi_duplex_mode = -1; +-static int hf_nfapi_pcfich_power_offset = -1; +-static int hf_nfapi_pb = -1; +-static int hf_nfapi_dl_cyclic_prefix_type = -1; +-static int hf_nfapi_ul_cyclic_prefix_type = -1; +- +-static int hf_nfapi_tx_antenna_ports = -1; +-static int hf_nfapi_rx_antenna_ports = -1; +- +- +- +-/* RF Config */ +-static int hf_nfapi_downlink_channel_bandwidth = -1; +-static int hf_nfapi_uplink_channel_bandwidth = -1; +-static int hf_nfapi_reference_signal_power = -1; +- +-/* PHICH config*/ +-static int hf_nfapi_phich_resource = -1; +-static int hf_nfapi_phich_duration = -1; +-static int hf_nfapi_phich_power_offset = -1; +- +-static int hf_nfapi_value_float = -1; +- +-/* SCH Config */ +-static int hf_nfapi_primary_synchronization_signal_epre_eprers = -1; +-static int hf_nfapi_secondary_synchronization_signal_epre_eprers = -1; +-static int hf_nfapi_physical_cell_id = -1; +- +-/* PRACH config */ +-static int hf_nfapi_configuration_index = -1; +-static int hf_nfapi_root_sequence_index = -1; +-static int hf_nfapi_zero_correlation_zone_configuration = -1; +-static int hf_nfapi_high_speed_flag = -1; +-static int hf_nfapi_frequency_offset = -1; +- +-/* PUSCH config */ +-static int hf_nfapi_hopping_mode = -1; +-static int hf_nfapi_hopping_offset = -1; +- +-/* PUCCH config */ +-static int hf_nfapi_delta_pucch_shift = -1; +-static int hf_nfapi_n_cqi_rb = -1; +-static int hf_nfapi_n_an_cs = -1; +-static int hf_nfapi_n1_pucch_an = -1; +- +-/* SRS config */ +-static int hf_nfapi_bandwidth_configuration = -1; +-static int hf_nfapi_max_up_pts = -1; +-static int hf_nfapi_srs_subframe_configuration = -1; +-static int hf_nfapi_srs_acknack_srs_simultaneous_transmission = -1; +- +-/* uplink reference signal config */ +-static int hf_nfapi_uplink_rs_hopping = -1; +-static int hf_nfapi_group_assignment = -1; +-static int hf_nfapi_cyclic_shift_1_for_drms = -1; +- +-/* tdd frame structure */ +-static int hf_nfapi_subframe_assignment = -1; +-static int hf_nfapi_special_subframe_patterns = -1; +- +-/* laa config */ +-static int hf_nfapi_ed_threshold_for_lbt_for_pdsch = -1; +-static int hf_nfapi_ed_threshold_for_lbt_for_drs = -1; +-static int hf_nfapi_pd_threshold = -1; +-static int hf_nfapi_multi_carrier_type = -1; +-static int hf_nfapi_multi_carrier_tx = -1; +-static int hf_nfapi_multi_carrier_freeze = -1; +-static int hf_nfapi_tx_antenna_ports_for_drs = -1; +-static int hf_nfapi_transmission_power_for_drs = -1; +- +-/* eMTC config */ +-static int hf_nfapi_pbch_repetitions_enabled_r13 = -1; +-static int hf_nfapi_prach_cat_m_root_sequence_index = -1; +-static int hf_nfapi_prach_cat_m_zero_correlation_zone_configuration = -1; +-static int hf_nfapi_prach_cat_m_high_speed_flag = -1; +- +-static int hf_nfapi_prach_ce_level_0_enable = -1; +-static int hf_nfapi_prach_ce_level_0_configuration_index = -1; +-static int hf_nfapi_prach_ce_level_0_frequency_offset = -1; +-static int hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt = -1; +-static int hf_nfapi_prach_ce_level_0_starting_subframe_periodicity = -1; +-static int hf_nfapi_prach_ce_level_0_hopping_enabled = -1; +-static int hf_nfapi_prach_ce_level_0_hopping_offset = -1; +- +-static int hf_nfapi_prach_ce_level_1_enable = -1; +-static int hf_nfapi_prach_ce_level_1_configuration_index = -1; +-static int hf_nfapi_prach_ce_level_1_frequency_offset = -1; +-static int hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt = -1; +-static int hf_nfapi_prach_ce_level_1_starting_subframe_periodicity = -1; +-static int hf_nfapi_prach_ce_level_1_hopping_enabled = -1; +-static int hf_nfapi_prach_ce_level_1_hopping_offset = -1; +- +-static int hf_nfapi_prach_ce_level_2_enable = -1; +-static int hf_nfapi_prach_ce_level_2_configuration_index = -1; +-static int hf_nfapi_prach_ce_level_2_frequency_offset = -1; +-static int hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt = -1; +-static int hf_nfapi_prach_ce_level_2_starting_subframe_periodicity = -1; +-static int hf_nfapi_prach_ce_level_2_hopping_enabled = -1; +-static int hf_nfapi_prach_ce_level_2_hopping_offset = -1; +- +-static int hf_nfapi_prach_ce_level_3_enable = -1; +-static int hf_nfapi_prach_ce_level_3_configuration_index = -1; +-static int hf_nfapi_prach_ce_level_3_frequency_offset = -1; +-static int hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt = -1; +-static int hf_nfapi_prach_ce_level_3_starting_subframe_periodicity = -1; +-static int hf_nfapi_prach_ce_level_3_hopping_enabled = -1; +-static int hf_nfapi_prach_ce_level_3_hopping_offset = -1; +-static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b = -1; +-static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a = -1; +- +-static int hf_nfapi_dl_modulation_support = -1; +-static int hf_nfapi_ul_modulation_support = -1; +- +-/* 123 config */ +-static int hf_nfapi_data_report_mode = -1; +-static int hf_nfapi_sfnsf = -1; +- +-// P7 Sub Structures +-static int hf_nfapi_dl_config_dci_dl_pdu_rel8 = -1; +-static int hf_nfapi_dci_format = -1; +-static int hf_nfapi_cce_idx = -1; +-static int hf_nfapi_aggregation_level = -1; +-static int hf_nfapi_mcs_1 = -1; +-static int hf_nfapi_redundancy_version_1 = -1; +-static int hf_nfapi_new_data_indicator_1 = -1; +-static int hf_nfapi_mcs_2 = -1; +-static int hf_nfapi_redundancy_version_2 = -1; +-static int hf_nfapi_new_data_indicator_2 = -1; +-static int hf_nfapi_harq_process = -1; +-static int hf_nfapi_tpmi = -1; +-static int hf_nfapi_pmi = -1; +-static int hf_nfapi_precoding_information = -1; +-static int hf_nfapi_tpc = -1; +-static int hf_nfapi_downlink_assignment_index = -1; +-static int hf_nfapi_transport_block_size_index = -1; +-static int hf_nfapi_downlink_power_offset = -1; +-static int hf_nfapi_allocate_prach_flag = -1; +-static int hf_nfapi_preamble_index = -1; +-static int hf_nfapi_prach_mask_index = -1; +-static int hf_nfapi_rnti_type = -1; +- +-static int hf_nfapi_dl_config_dci_dl_pdu_rel9 = -1; +-static int hf_nfapi_mcch_flag = -1; +-static int hf_nfapi_mcch_change_notification = -1; +-static int hf_nfapi_scrambling_identity = -1; +- +-static int hf_nfapi_dl_config_dci_dl_pdu_rel10 = -1; +-static int hf_nfapi_cross_carrier_scheduling_flag = -1; +-static int hf_nfapi_carrier_indicator = -1; +-static int hf_nfapi_srs_flag = -1; +-static int hf_nfapi_srs_request = -1; +-static int hf_nfapi_antenna_ports_scrambling_and_layers = -1; +-static int hf_nfapi_total_dci_length_including_padding = -1; +-static int hf_nfapi_n_dl_rb = -1; +- +-static int hf_nfapi_dl_config_dci_dl_pdu_rel11 = -1; +-static int hf_nfapi_harq_ack_resource_offset = -1; +-static int hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator = -1; +-static int hf_nfapi_dl_config_dci_dl_pdu_rel12 = -1; +-static int hf_nfapi_primary_cell_type = -1; +-static int hf_nfapi_ul_dl_configuration_flag = -1; +-static int hf_nfapi_number_of_ul_dl_configurations = -1; +-static int hf_nfapi_ul_dl_configuration_index = -1; +-static int hf_nfapi_dl_config_dci_dl_pdu_rel13 = -1; +-static int hf_nfapi_laa_end_partial_sf_flag = -1; +-static int hf_nfapi_laa_end_partial_sf_configuration = -1; +-static int hf_nfapi_initial_lbt_sf = -1; +-static int hf_nfapi_codebooksize_determination_r13 = -1; +-static int hf_nfapi_rel13_drms_table_flag = -1; +- +- +-static int hf_nfapi_dl_config_dci_dl_pdu = -1; +-static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel8 = -1; +-static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel9 = -1; +-static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel10 = -1; +- +-static int hf_nfapi_bf_vector_antennas = -1; +-static int hf_nfapi_subbands = -1; +-static int hf_nfapi_bf_vectors = -1; +-static int hf_nfapi_csi_rs_resource_config = -1; +-static int hf_nfapi_csi_rs_number_if_nzp_configurations = -1; +-static int hf_nfapi_csi_rs_resource_configs = -1; +-static int hf_nfapi_pdsch_start = -1; +-static int hf_nfapi_drms_config_flag = -1; +-static int hf_nfapi_drms_scrambling = -1; +-static int hf_nfapi_csi_config_flag = -1; +-static int hf_nfapi_csi_scrambling = -1; +-static int hf_nfapi_pdsch_re_mapping_flag = -1; +-static int hf_nfapi_pdsch_re_mapping_antenna_ports = -1; +-static int hf_nfapi_pdsch_re_mapping_freq_shift = -1; +-static int hf_nfapi_alt_cqi_table_r12 = -1; +-static int hf_nfapi_max_layers = -1; +-static int hf_nfapi_n_dl_harq = -1; +-static int hf_nfapi_dwpts_symbols = -1; +-static int hf_nfapi_ue_type = -1; +-static int hf_nfapi_pdsch_payload_type = -1; +-static int hf_nfapi_initial_transmission_sf = -1; +-static int hf_nfapi_req13_drms_table_flag = -1; +-static int hf_nfapi_prnti = -1; +-static int hf_nfapi_mcs = -1; +-static int hf_nfapi_number_of_transport_blocks = -1; +-static int hf_nfapi_ue_mode = -1; +-static int hf_prs_bandwidth = -1; +-static int hf_prs_cyclic_prefix_type = -1; +-static int hf_prs_muting = -1; +-static int hf_nfapi_csi_rs_number_of_nzp_configuration = -1; +-static int hf_nfapi_csi_rs_resource_index = -1; +-static int hf_nfapi_csi_rs_class = -1; +-static int hf_nfapi_cdm_type = -1; +-static int hf_nfapi_csi_rs_bf_vector = -1; +-static int hf_nfapi_edpcch_prb_index = -1; +-static int hf_nfapi_epdcch_resource_assignment_flag = -1; +-static int hf_nfapi_epdcch_id = -1; +-static int hf_nfapi_epdcch_start_symbol = -1; +-static int hf_nfapi_epdcch_num_prb = -1; +-static int hf_nfapi_epdcch_prbs = -1; +-static int hf_nfapi_precoding_value = -1; +-static int hf_nfapi_mpdcch_narrowband = -1; +-static int hf_nfapi_number_of_prb_pairs = -1; +-static int hf_nfapi_resource_block_assignment = -1; +-static int hf_nfapi_start_symbol = -1; +-static int hf_nfapi_ecce_index = -1; +-static int hf_nfapi_ce_mode = -1; +-static int hf_nfapi_drms_scrabmling_init = -1; +-static int hf_nfapi_pdsch_reception_levels = -1; +-static int hf_nfapi_new_data_indicator = -1; +-static int hf_nfapi_tpmi_length = -1; +-static int hf_nfapi_pmi_flag = -1; +-static int hf_nfapi_harq_resource_offset = -1; +-static int hf_nfapi_dci_subframe_repetition_number = -1; +-static int hf_nfapi_downlink_assignment_index_length = -1; +-static int hf_nfapi_starting_ce_level = -1; +-static int hf_nfapi_antenna_ports_and_scrambling_identity_flag = -1; +-static int hf_nfapi_antenna_ports_and_scrambling_identity = -1; +-static int hf_nfapi_paging_direct_indication_differentiation_flag = -1; +-static int hf_nfapi_direct_indication = -1; +-static int hf_nfapi_number_of_tx_antenna_ports = -1; +-static int hf_nfapi_precoding = -1; +- +- +- +-// P7 Message Structures +-static int hf_nfapi_dl_node_sync = -1; +-static int hf_nfapi_dl_node_sync_nfapi_p7_message_header = -1; +-static int hf_nfapi_dl_node_sync_t1 = -1; +-static int hf_nfapi_dl_node_sync_delta_sfn_sf = -1; +- +-static int hf_nfapi_ul_node_sync = -1; +-static int hf_nfapi_ul_node_sync_nfapi_p7_message_header = -1; +-static int hf_nfapi_ul_node_sync_t1 = -1; +-static int hf_nfapi_ul_node_sync_t2 = -1; +-static int hf_nfapi_ul_node_sync_t3 = -1; +- +-static int hf_nfapi_timing_info = -1; +-static int hf_nfapi_timing_info_nfapi_p7_message_header = -1; +-static int hf_nfapi_timing_info_last_sfn_sf = -1; +-static int hf_nfapi_timing_info_time_since_last_timing_info = -1; +-static int hf_nfapi_timing_info_dl_config_jitter = -1; +-static int hf_nfapi_timing_info_tx_request_jitter = -1; +-static int hf_nfapi_timing_info_ul_config_jitter = -1; +-static int hf_nfapi_timing_info_hi_dci0_jitter = -1; +-static int hf_nfapi_timing_info_dl_config_latest_delay = -1; +-static int hf_nfapi_timing_info_tx_request_latest_delay = -1; +-static int hf_nfapi_timing_info_ul_config_latest_delay = -1; +-static int hf_nfapi_timing_info_hi_dci0_latest_delay = -1; +-static int hf_nfapi_timing_info_dl_config_earliest_arrival = -1; +-static int hf_nfapi_timing_info_tx_request_earliest_arrival = -1; +-static int hf_nfapi_timing_info_ul_config_earliest_arrival = -1; +-static int hf_nfapi_timing_info_hi_dci0_earliest_arrival = -1; +- +-static int hf_nfapi_dl_config_request = -1; +-static int hf_nfapi_sfn_sf = -1; +- +-static int hf_nfapi_dl_config_request_body = -1; +-static int hf_nfapi_number_pdcch_ofdm_symbols = -1; +-static int hf_nfapi_number_dci = -1; +-static int hf_nfapi_number_pdus = -1; +-static int hf_nfapi_number_pdsch_rnti = -1; +-static int hf_nfapi_transmission_power_pcfich = -1; +- +-static int hf_nfapi_number_of_harqs = -1; +-static int hf_nfapi_number_of_crcs = -1; +-static int hf_nfapi_number_of_srs = -1; +-static int hf_nfapi_number_of_cqi = -1; +-static int hf_nfapi_number_of_preambles = -1; +-static int hf_nfapi_number_of_srss = -1; +-static int hf_nfapi_lbt_dl_req_pdu_type = -1; +-static int hf_nfapi_lbt_dl_ind_pdu_type = -1; +- +-static int hf_nfapi_dl_config_request_pdu_list = -1; +-static int hf_nfapi_ul_config_request_pdu_list = -1; +-static int hf_nfapi_hi_dci0_request_pdu_list = -1; +-static int hf_nfapi_tx_request_pdu_list = -1; +-static int hf_nfapi_rx_indication_pdu_list = -1; +-static int hf_nfapi_harq_indication_pdu_list = -1; +-static int hf_nfapi_crc_indication_pdu_list = -1; +-static int hf_nfapi_sr_indication_pdu_list = -1; +-static int hf_nfapi_cqi_indication_pdu_list = -1; +-static int hf_nfapi_preamble_indication_pdu_list = -1; +-static int hf_nfapi_srs_indication_pdu_list = -1; +-static int hf_nfapi_lbt_dl_config_pdu_list = -1; +-static int hf_nfapi_lbt_dl_indication_pdu_list = -1; +- +- +-static int hf_nfapi_dl_config_pdu_type = -1; +-static int hf_nfapi_pdu_size = -1; +-static int hf_nfapi_instance_length = -1; +- +-static int hf_nfapi_dl_config_dlsch_pdu_rel8 = -1; +-static int hf_nfapi_length; +-static int hf_nfapi_pdu_index = -1; +-static int hf_nfapi_rnti = -1; +-static int hf_nfapi_resource_allocation_type = -1; +-static int hf_nfapi_virtual_resource_block_assignment_flag = -1; +-static int hf_nfapi_resource_block_coding = -1; +-static int hf_nfapi_modulation = -1; +-static int hf_nfapi_redundancy_version = -1; +-static int hf_nfapi_transport_blocks = -1; +-static int hf_nfapi_transport_block_to_codeword_swap_flag = -1; +-static int hf_nfapi_transmission_scheme = -1; +-static int hf_nfapi_ul_transmission_scheme = -1; +-static int hf_nfapi_number_of_layers = -1; +-static int hf_nfapi_number_of_subbands = -1; +-static int hf_nfapi_codebook_index = -1; +-static int hf_nfapi_ue_category_capacity = -1; +-static int hf_nfapi_pa = -1; +-static int hf_nfapi_delta_power_offset_index = -1; +-static int hf_nfapi_ngap = -1; +-static int hf_nfapi_nprb = -1; +-static int hf_nfapi_transmission_mode = -1; +-static int hf_nfapi_num_bf_prb_per_subband = -1; +- +-static int hf_nfapi_num_bf_vector = -1; +-static int hf_nfapi_bf_vector_subband_index = -1; +-static int hf_nfapi_bf_vector_num_antennas = -1; +-static int hf_nfapi_bf_vector_bf_value = -1; +- +-static int hf_nfapi_dl_config_dlsch_pdu_rel9 = -1; +-static int hf_nfapi_nscid = -1; +- +-static int hf_nfapi_dl_config_dlsch_pdu_rel10 = -1; +-static int hf_nfapi_csi_rs_flag = -1; +-static int hf_nfapi_csi_rs_resource_config_r10 = -1; +-static int hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10 = -1; +- +-static int hf_nfapi_dl_config_bch_pdu_rel8 = -1; +-static int hf_nfapi_transmission_power = -1; +- +-static int hf_nfapi_dl_config_mch_pdu_rel8 = -1; +-static int hf_nfapi_mbsfn_area_id = -1; +- +-static int hf_nfapi_dl_config_pch_pdu_rel8 = -1; +- +-static int hf_nfapi_dl_config_prs_pdu_rel9 = -1; +-static int hf_nfapi_prs_bandwidth = -1; +-static int hf_nfapi_prs_cyclic_prefix_type = -1; +- +-static int hf_nfapi_dl_config_csi_rs_pdu_rel10 = -1; +-static int hf_nfapi_csi_rs_antenna_port_count_r10 = -1; +- +-static int hf_nfapi_ul_config_request = -1; +-static int hf_nfapi_ul_config_request_body = -1; +-static int hf_nfapi_ul_config_pdu_type = -1; +- +-static int hf_nfapi_rach_prach_frequency_resources = -1; +-static int hf_nfapi_srs_present = -1; +-static int hf_nfapi_ul_config_harq_buffer_pdu = -1; +- +-static int hf_nfapi_ul_config_ue_information_rel8 = -1; +-static int hf_nfapi_handle = -1; +-static int hf_nfapi_ul_config_sr_information_pdu_rel8 = -1; +-static int hf_nfapi_pucch_index = -1; +-static int hf_nfapi_size = -1; +-static int hf_nfapi_resource_block_start = -1; +-static int hf_nfapi_number_of_resource_blocks = -1; +-static int hf_nfapi_cyclic_shift_2_for_drms = -1; +-static int hf_nfapi_frequency_hopping_enabled_flag = -1; +-static int hf_nfapi_frequency_hopping_bits = -1; +-static int hf_nfapi_new_data_indication = -1; +-static int hf_nfapi_harq_process_number = -1; +-static int hf_nfapi_ul_tx_mode = -1; +-static int hf_nfapi_current_tx_nb = -1; +-static int hf_nfapi_n_srs = -1; +-static int hf_nfapi_disable_sequence_hopping_flag = -1; +-static int hf_nfapi_dl_cqi_pmi_size_rank_1 = -1; +-static int hf_nfapi_dl_cqi_pmi_size_rank_greater_1 = -1; +-static int hf_nfapi_ri_size = -1; +-static int hf_nfapi_delta_offset_cqi = -1; +-static int hf_nfapi_delta_offset_ri = -1; +-static int hf_nfapi_harq_size = -1; +-static int hf_nfapi_delta_offset_harq = -1; +-static int hf_nfapi_ack_nack_mode = -1; +-static int hf_nfapi_n_srs_initial = -1; +-static int hf_nfapi_initial_number_of_resource_blocks = -1; +-static int hf_nfapi_dl_cqi_pmi_size = -1; +-static int hf_nfapi_report_type = -1; +-static int hf_nfapi_dl_cqi_ri_pmi_size = -1; +-static int hf_nfapi_control_type = -1; +-static int hf_nfapi_number_of_cc = -1; +-static int hf_nfapi_virtual_cell_id_enabled_flag = -1; +-static int hf_nfapi_npusch_identity = -1; +-static int hf_nfapi_ndrms_csh_identity = -1; +-static int hf_nfapi_total_number_of_repetitions = -1; +-static int hf_nfapi_repetition_number = -1; +-static int hf_nfapi_initial_sf_io = -1; +-static int hf_nfapi_empty_symbols_due_to_retunning = -1; +-static int hf_nfapi_dl_cqi_ri_pmi_size_2 = -1; +-static int hf_nfapi_npucch_identity = -1; +-static int hf_nfapi_harq_size_2 = -1; +-static int hf_nfapi_delta_offset_harq_2 = -1; +-static int hf_nfapi_empty_symbols = -1; +-static int hf_nfapi_total_number_of_repetitons = -1; +-static int hf_nfapi_csi_mode = -1; +-static int hf_nfapi_dl_cqi_pmi_size_2 = -1; +-static int hf_nfapi_statring_prb = -1; +-static int hf_nfapi_cdm_index = -1; +-static int hf_nfapi_nsrs = -1; +-static int hf_nfapi_num_ant_ports = -1; +-static int hf_nfapi_n_pucch_2_0 = -1; +-static int hf_nfapi_n_pucch_2_1 = -1; +-static int hf_nfapi_n_pucch_2_2 = -1; +-static int hf_nfapi_n_pucch_2_3 = -1; +-static int hf_nfapi_starting_prb = -1; +-static int hf_nfapi_antenna_port = -1; +-static int hf_nfapi_number_of_combs = -1; +- +- +- +-static int hf_nfapi_number_of_pucch_resource = -1; +-static int hf_nfapi_pucch_index_p1 = -1; +-static int hf_nfapi_n_pucch_1_0 = -1; +-static int hf_nfapi_n_pucch_1_1 = -1; +-static int hf_nfapi_n_pucch_1_2 = -1; +-static int hf_nfapi_n_pucch_1_3 = -1; +-static int hf_nfapi_srs_bandwidth = -1; +-static int hf_nfapi_frequency_domain_position = -1; +-static int hf_nfapi_srs_hopping_bandwidth = -1; +-static int hf_nfapi_transmission_comb = -1; +-static int hf_nfapi_i_srs = -1; +-static int hf_nfapi_sounding_reference_cyclic_shift = -1; +-static int hf_nfapi_antenna_ports = -1; +-static int hf_nfapi_ul_config_srs_pdu_rel10 = -1; +-static int hf_nfapi_ul_config_srs_pdu_rel8 = -1; +-static int hf_nfapi_ul_config_harq_information_rel9_fdd = -1; +-static int hf_nfapi_ul_config_harq_information_rel8_fdd = -1; +-static int hf_nfapi_ul_config_harq_information_rel10_tdd = -1; +-static int hf_nfapi_ul_config_sr_information_rel10 = -1; +-static int hf_nfapi_ul_config_sr_information_rel8 = -1; +-static int hf_nfapi_ul_config_cqi_information_rel10 = -1; +-static int hf_nfapi_ul_config_cqi_information_rel8 = -1; +-static int hf_nfapi_ul_config_initial_transmission_parameters_rel8 = -1; +-static int hf_nfapi_ul_config_ulsch_harq_information_rel10 = -1; +- +-/* Tx request */ +-static int hf_nfapi_pdu_length = -1; +-static int hf_nfapi_num_segments = -1; +-static int hf_nfapi_segment_length = -1; +-static int hf_nfapi_segment_data = -1; +- +-/* CRC Indication */ +-static int hf_nfapi_crc_indication_body = -1; +-static int hf_nfapi_crc_flag = -1; +- +-static int hf_nfapi_number_of_hi_pdus = -1; +-static int hf_nfapi_number_of_dci_pdus = -1; +-static int hf_nfapi_pdu_type = -1; +-static int hf_nfapi_hi_value = -1; +-static int hf_nfapi_i_phich = -1; +-static int hf_nfapi_flag_tb2 = -1; +-static int hf_nfapi_hi_value_2 = -1; +-static int hf_nfapi_ue_tx_antenna_selection = -1; +-static int hf_nfapi_cqi_csi_request = -1; +-static int hf_nfapi_ul_index = -1; +-static int hf_nfapi_dl_assignment_index = -1; +-static int hf_nfapi_tpc_bitmap = -1; +-static int hf_nfapi_new_data_indication_two = -1; +-static int hf_nfapi_size_of_cqi_csi_feild = -1; +-static int hf_nfapi_resource_allocation_flag = -1; +-static int hf_nfapi_number_of_antenna_ports =-1 ; +- +-static int hf_nfapi_n_ul_rb = -1; +-static int hf_nfapi_pscch_resource = -1; +-static int hf_nfapi_time_resource_pattern = -1; +-static int hf_nfapi_mpdcch_transmission_type = -1; +-static int hf_nfapi_drms_scrambling_init = -1; +-static int hf_nfapi_pusch_repetition_levels = -1; +-static int hf_nfapi_frequency_hopping_flag = -1; +-static int hf_nfapi_csi_request = -1; +-static int hf_nfapi_dai_presence_flag = -1; +-static int hf_nfapi_total_dci_length_include_padding = -1; +-static int hf_nfapi_data_offset = -1; +-static int hf_nfapi_ul_cqi = -1; +-static int hf_nfapi_timing_advance_r9 = -1; +-static int hf_nfapi_timing_advance = -1; +-static int hf_nfapi_harq_data_value_0 = -1; +-static int hf_nfapi_harq_data_value_1 = -1; +-static int hf_nfapi_harq_data_value_2 = -1; +-static int hf_nfapi_harq_data_value_3 = -1; +-static int hf_nfapi_harq_mode = -1; +-static int hf_nfapi_number_of_ack_nack = -1; +-static int hf_nfapi_harq_ack_nack_data = -1; +-static int hf_nfapi_harq_tb_1 = -1; +-static int hf_nfapi_harq_tb_2 = -1; +-static int hf_nfapi_harq_tb_n = -1; +-static int hf_nfapi_harq_data = -1; +-static int hf_nfapi_channel = -1; +-static int hf_nfapi_ri = -1; +-static int hf_nfapi_number_of_cc_reported = -1; +-static int hf_nfapi_cc = -1; +-static int hf_nfapi_preamble = -1; +-static int hf_nfapi_rach_resource_type = -1; +-static int hf_nfapi_snr = -1; +-static int hf_nfapi_doppler_estimation = -1; +-static int hf_nfapi_rb_start = -1; +-static int hf_nfapi_rbs = -1; +-static int hf_nfapi_up_pts_symbol = -1; +-static int hf_nfapi_number_prb_per_subband = -1; +-static int hf_nfapi_number_antennas = -1; +-static int hf_nfapi_subband_index = -1; +-static int hf_nfapi_antennas = -1; +-static int hf_nfapi_channel_coefficient = -1; +-static int hf_nfapi_ul_rtoa = -1; +-static int hf_nfapi_mp_cca = -1; +-static int hf_nfapi_n_cca = -1; +-static int hf_nfapi_offset = -1; +-static int hf_nfapi_lte_txop_sf = -1; +-static int hf_nfapi_txop_sfn_sf_end = -1; +-static int hf_nfapi_lbt_mode = -1; +-static int hf_nfapi_sfn_sf_end = -1; +-static int hf_nfapi_result = -1; +-static int hf_nfapi_txop_symbols = -1; +-static int hf_nfapi_initial_partial_sf = -1; +- +- +-static int hf_nfapi_frequency_band_indicator = -1; +-static int hf_nfapi_measurement_period = -1; +-static int hf_nfapi_bandwidth = -1; +-static int hf_nfapi_timeout = -1; +-static int hf_nfapi_number_of_earfcns = -1; +-static int hf_nfapi_earfcn_list = -1; +-static int hf_nfapi_uarfcn = -1; +-static int hf_nfapi_number_of_uarfcns = -1; +-static int hf_nfapi_uarfcn_list = -1; +-static int hf_nfapi_arfcn = -1; +-static int hf_nfapi_arfcn_direction = -1; +-static int hf_nfapi_number_of_arfcns = -1; +-static int hf_nfapi_arfcn_list = -1; +-static int hf_nfapi_rssi = -1; +-static int hf_nfapi_number_of_rssi = -1; +-static int hf_nfapi_rssi_list = -1; +-static int hf_nfapi_pci = -1; +-static int hf_nfapi_measurement_bandwidth = -1; +-static int hf_nfapi_exhaustive_search = -1; +-static int hf_nfapi_number_of_pci = -1; +-static int hf_nfapi_pci_list = -1; +-static int hf_nfapi_psc = -1; +-static int hf_nfapi_number_of_psc = -1; +-static int hf_nfapi_psc_list = -1; +-static int hf_nfapi_rsrp = -1; +-static int hf_nfapi_rsrq = -1; +-static int hf_nfapi_number_of_lte_cells_found = -1; +-static int hf_nfapi_lte_cells_found_list = -1; +-static int hf_nfapi_rscp = -1; +-static int hf_nfapi_enco = -1; +-static int hf_nfapi_number_of_utran_cells_found = -1; +-static int hf_nfapi_utran_cells_found_list = -1; +-static int hf_nfapi_bsic = -1; +-static int hf_nfapi_rxlev = -1; +-static int hf_nfapi_rxqual = -1; +-static int hf_nfapi_sfn_offset = -1; +-static int hf_nfapi_number_of_geran_cells_found = -1; +-static int hf_nfapi_geran_cells_found_list = -1; +-static int hf_nfapi_number_of_tx_antenna = -1; +-static int hf_nfapi_mib_length = -1; +-static int hf_nfapi_mib = -1; +-static int hf_nfapi_phich_configuration = -1; +-static int hf_nfapi_retry_count = -1; +-static int hf_nfapi_sib1 = -1; +-static int hf_nfapi_si_periodicity = -1; +-static int hf_nfapi_si_index = -1; +-static int hf_nfapi_number_of_si_periodicity = -1; +-static int hf_nfapi_si_periodicity_list = -1; +-static int hf_nfapi_si_window_length = -1; +-static int hf_nfapi_sib_type = -1; +-static int hf_nfapi_sib_len = -1; +-static int hf_nfapi_sib = -1; +-static int hf_nfapi_si_len = -1; +-static int hf_nfapi_si = -1; +- +-static int hf_nfapi_pnf_search_state = -1; +-static int hf_nfapi_pnf_broadcast_state = -1; +- +-static const value_string message_id_vals[] = { { 0x80, "DL_CONFIG.request"}, +- { 0x81, "UL_CONFIG.request"}, +- { 0x82, "SUBFRAME_INDICATION"}, +- { 0x83, "HI_DCI0.request"}, +- { 0x84, "TX.request"}, +- { 0x85, "HARQ.indication"}, +- { 0x86, "CRC.indication"}, +- { 0x87, "RX_ULSCH.indication"}, +- { 0x88, "RACH.indication" }, +- { 0x89, "SRS.indication" }, +- { 0x8A, "RX_SR.indication" }, +- { 0x8B, "RX_CQI.indication" }, +- { 0x8C, "LBT_DL_CONFIG.request" } , +- { 0x8D, "LBT_DL.indication" } , +- +- { 0x0100, "PNF_PARAM.request" }, +- { 0x0101, "PNF_PARAM.response" }, +- { 0x0102, "PNF_CONFIG.request" }, +- { 0x0103, "PNF_CONFIG.response" }, +- { 0x0104, "PNF_START.request" }, +- { 0x0105, "PNF_START.response" }, +- { 0x0106, "PNF_STOP.request" }, +- { 0x0107, "PNF_STOP.response" }, +- { 0x0108, "PARAM.request" }, +- { 0x0109, "PARAM.response" }, +- { 0x010A, "CONFIG.request" }, +- { 0x010B, "CONFIG.response" }, +- { 0x010C, "START.request" }, +- { 0x010D, "START.response" }, +- { 0x010E, "STOP.request" }, +- { 0x010F, "STOP.response" }, +- { 0x0110, "MEASUREMENT.request" }, +- { 0x0111, "MEASUREMENT.response" }, +- +- { 0x0180, "UL_NODE_SYNC" }, +- { 0x0181, "DL_NODE_SYNC" }, +- { 0x0182, "TIMING_INFO" }, +- +- { 0x0200, "RSSI.request" }, +- { 0x0201, "RSSI.response" }, +- { 0x0202, "RSSI.indication" }, +- { 0x0203, "CELL_SEARCH.request" }, +- { 0x0204, "CELL_SEARCH.response" }, +- { 0x0205, "CELL_SEARCH.indication" }, +- { 0x0206, "BROADCAST_DETECT.request" }, +- { 0x0207, "BROADCAST_DETECT.response" }, +- { 0x0208, "BROADCAST_DETECT.indication" }, +- { 0x0209, "SYSTEM_INFORMATION_SCHEDULE.request" }, +- { 0x020A, "SYSTEM_INFORMATION_SCHEDULE.response" }, +- { 0x020B, "SYSTEM_INFORMATION_SCHEDULE.indication" }, +- { 0x020C, "SYSTEM_INFORMATION.request" }, +- { 0x020D, "SYSTEM_INFORMATION.response" }, +- { 0x020E, "SYSTEM_INFORMATION.indication" }, +- { 0x020F, "NMM_STOP.request" }, +- { 0x0210, "NMM_STOP.response" }, +- +- { 0 , NULL }, +-}; +- +- +-typedef int(*tlv_decode)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end); +- +-typedef struct +-{ +- uint16_t tag_id; +- char* name; +- tlv_decode decode; +-} tlv_t; +- +-static int dissect_tlv_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint end); +- +- +- +- +-static guint8 proto_tree_add_uint8(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) +-{ +- guint8 value = tvb_get_guint8(tvb, *offset); +- proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 1, ENC_NA); +- +- if (units != NULL) +- { +- proto_item_append_text(item, " "); +- proto_item_append_text(item, units); +- } +- +- *offset += 1; +- +- return value; +-} +- +-static guint8 proto_tree_add_uint8_with_range(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, packet_info *pinfo, guint8 min, guint8 max, char* units) +-{ +- guint8 value = tvb_get_guint8(tvb, *offset); +- proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 1, ENC_NA); +- +- if (units != NULL) +- { +- proto_item_append_text(item, " "); +- proto_item_append_text(item, units); +- } +- +- *offset += 1; +- +- if (value < min || value > max) +- { +- expert_add_info(pinfo, tree, &ei_invalid_range); +- } +- +- +- return value; +-} +- +-static guint16 proto_tree_add_uint16(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) +-{ +- guint16 value = tvb_get_guint16(tvb, *offset, ENC_NA); +- proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 2, ENC_NA); +- +- if (units != NULL) +- { +- proto_item_append_text(item, " "); +- proto_item_append_text(item, units); +- } +- +- *offset += 2; +- +- return value; +-} +- +-static void proto_tree_add_int16(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) +-{ +- proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 2, ENC_NA); +- +- if (units != NULL) +- { +- proto_item_append_text(item, " "); +- proto_item_append_text(item, units); +- } +- +- *offset += 2; +-} +- +-typedef int(*uint8_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint8 value); +- +-static guint8 proto_tree_add_uint8_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, uint8_value_conversion conversion) +-{ +- guint8 value = tvb_get_guint8(tvb, *offset); +- +- conversion(tree, hfindex, tvb, offset, value); +- +- *offset += 1; +- +- return value; +-} +- +-typedef int(*uint16_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value); +- +-static guint16 proto_tree_add_uint16_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, uint16_value_conversion conversion) +-{ +- guint16 value = tvb_get_guint16(tvb, *offset, ENC_NA); +- +- conversion(tree, hfindex, tvb, offset, value); +- +- *offset += 2; +- +- return value; +-} +- +-typedef int(*int16_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, gint16 value); +- +-static gint16 proto_tree_add_int16_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, int16_value_conversion conversion) +-{ +- gint16 value = (gint16)(tvb_get_guint16(tvb, *offset, ENC_NA)); +- +- conversion(tree, hfindex, tvb, offset, value); +- +- *offset += 2; +- +- return value; +-} +- +- +-static void proto_tree_add_uint32(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units) +-{ +- proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 4, ENC_NA); +- +- if (units != NULL) +- { +- proto_item_append_text(item, " "); +- proto_item_append_text(item, units); +- } +- +- *offset += 4; +-} +- +-static void proto_tree_add_uint8_array(proto_tree *tree, int hfindex, guint len, tvbuff_t *tvb, guint* offset) +-{ +- proto_tree_add_item(tree, hfindex, tvb, *offset, len, ENC_NA); +- +- *offset += len; +-} +- +- +- +- +- +-int dissect_array_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end, const char* name, guint32 hf_idx, guint32 ett_idx, guint32 count, tlv_decode decode) +-{ +- guint16 i = 0; +- +- if (count > 0) +- { +- proto_item *list_ti = proto_tree_add_string_format(tree, hf_idx, tvb, *offset, 2, "", name); +- proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_idx); +- +- gint start_of_list = *offset; +- +- for (i = 0; i < count; ++i) +- { +- proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_idx, tvb, *offset, 2, "", "[%d]", i); +- proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_idx); +- +- gint start_of_item = *offset; +- +- decode(tvb, pinfo, item_tree, data, offset, end); +- +- if (item_ti != NULL) +- item_ti->finfo->length = *offset - start_of_item; +- } +- +- if (list_ti != NULL) +- list_ti->finfo->length = *offset - start_of_list; +- } +- +- return 0; +-} +- +-int dissect_pnf_param_general_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_sync_mode, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_location_mode, tvb, offset, 0); +- guint16 len = proto_tree_add_uint16(tree, hf_nfapi_location_coordinates_length, tvb, offset, 0); +- if (len > 0) +- proto_tree_add_uint8_array(tree, hf_nfapi_location_coordinates, len, tvb, offset); +- proto_tree_add_uint32(tree, hf_nfapi_dl_config_timing, tvb, offset, "milliseconds"); +- proto_tree_add_uint32(tree, hf_nfapi_tx_timing, tvb, offset, "milliseconds"); +- proto_tree_add_uint32(tree, hf_nfapi_ul_config_timing, tvb, offset, "milliseconds"); +- proto_tree_add_uint32(tree, hf_nfapi_hi_dci0_timing, tvb, offset, "milliseconds"); +- proto_tree_add_uint16(tree, hf_nfapi_maximum_number_phys, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_maximum_total_bandwidth, tvb, offset, "(100 khz)"); +- proto_tree_add_uint8(tree, hf_nfapi_maximum_total_number_dl_layers, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_maximum_total_number_ul_layers, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_shared_bands, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_shared_pa, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_maximum_total_power, tvb, offset, 0); +- proto_tree_add_uint8_array(tree, hf_nfapi_oui, 3, tvb, offset); +- +- return 0; +-} +- +-int dissect_pnf_rf_config_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0); +- return 0; +-} +- +-int dissect_pnf_phy_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); +- guint16 num_rf_configs = proto_tree_add_uint16(tree, hf_nfapi_number_of_rfs, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Config List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_rf_configs, dissect_pnf_rf_config_instance_value); +- guint16 num_rf_exclusions = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_exclusions, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Exclustion List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_rf_exclusions, dissect_pnf_rf_config_instance_value); +- proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_uplink_channel_bandwidth_supported, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_dl_layers_supported, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_ul_layers_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_maximum_3gpp_release_supported, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_nmm_modes_supported, tvb, offset, 0); +- return 0; +-} +- +-int dissect_pnf_phy_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_phy, dissect_pnf_phy_instance_value); +- +- +- return 0; +- +-} +- +- +-int dissect_pnf_rf_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_band, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_maximum_transmit_power, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_minimum_transmit_power, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_antennas_suppported, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_minimum_downlink_frequency, tvb, offset, "(100 khz)"); +- proto_tree_add_uint32(tree, hf_nfapi_maximum_downlink_frequency, tvb, offset, "(100 khz)"); +- proto_tree_add_uint32(tree, hf_nfapi_minimum_uplink_frequency, tvb, offset, "(100 khz)"); +- proto_tree_add_uint32(tree, hf_nfapi_maximum_uplink_frequency, tvb, offset, "(100 khz)"); +- +- return 0; +-} +- +- +-int dissect_pnf_rf_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_rf = proto_tree_add_uint16(tree, hf_nfapi_number_of_rfs, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF List", hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info, ett_nfapi_pnf_phy_rf_config, num_rf, dissect_pnf_rf_config_value); +- +- return 0; +- +-} +- +-int dissect_pnf_phy_rel10_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_transmission_mode7_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_transmission_mode8_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_two_antennas_ports_for_pucch, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_9_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_simultaneous_pucch_pusch, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_for_layer_tx_with_tm3_and_tm4, tvb, offset, 0); +- +- return 0; +-} +- +-int dissect_pnf_phy_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 10 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel10, num_phy, dissect_pnf_phy_rel10_instance_value); +- +- return 0; +-} +- +-int dissect_pnf_phy_rel11_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_epdcch_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_multi_ack_csi_reporting, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_pucch_tx_diversity_with_channel_selection, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_ul_comp_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_5_supported, tvb, offset, 0); +- return 0; +-} +- +-int dissect_pnf_phy_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 11 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel11, num_phy, dissect_pnf_phy_rel11_instance_value); +- return 0; +-} +- +-int dissect_pnf_phy_rel12_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_csi_subframe_set, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_enhanced_4tx_codebook, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_drs_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_ul_64qam_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_10_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hi_nfapi_alternative_tbs_indices, tvb, offset, 0); +- return 0; +-} +- +-int dissect_pnf_phy_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 12 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel12, num_phy, dissect_pnf_phy_rel12_instance_value); +- return 0; +-} +- +-int dissect_pnf_phy_rel13_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pucch_format_4_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pucch_format_5_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_more_than_5_ca_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_laa_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_laa_ending_in_dwpts_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_laa_starting_in_second_slot_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_beamforming_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_csi_rs_enhancements_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_drms_enhancements_supported, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_srs_enhancements_supported, tvb, offset, 0); +- return 0; +-} +- +-int dissect_pnf_phy_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 13 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel13, num_phy, dissect_pnf_phy_rel13_instance_value); +- return 0; +-} +- +-int dissect_pnf_phy_rf_config_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_phy_rf_config_info_phy_id, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0); +- return 0; +-} +- +- +-int dissect_pnf_phy_rf_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_configs = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY RF Config List", hf_nfapi_pnf_phy_rf_config, ett_nfapi_pnf_phy_rf_config, num_configs, dissect_pnf_phy_rf_config_instance_value); +- return 0; +-} +- +-int bandwidth_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) +-{ +- /* +- guint8 comma = 0; +- +- proto_item_append_text(item, "("); +- +- if (value & 0x1) +- { +- proto_item_append_text(item, "6 Mhz"); +- comma = 1; +- } +- +- if (comma) +- proto_item_append_text(item, ", "); +- +- if (value & 0x2) +- { +- proto_item_append_text(item, "15 Mhz"); +- comma = 1; +- } +- +- if (comma) +- proto_item_append_text(item, ", "); +- +- if (value & 0x4) +- { +- proto_item_append_text(item, "25 Mhz"); +- comma = 1; +- } +- +- if (comma) +- proto_item_append_text(item, ", "); +- +- if (value & 0x8) +- { +- proto_item_append_text(item, "50 Mhz"); +- comma = 1; +- } +- +- if (comma) +- proto_item_append_text(item, ", "); +- +- if (value & 0x10) +- { +- proto_item_append_text(item, "75 Mhz"); +- comma = 1; +- } +- +- if (comma) +- proto_item_append_text(item, ", "); +- +- if (value & 0x20) +- { +- proto_item_append_text(item, "100 Mhz"); +- comma = 1; +- } +- +- proto_item_append_text(item, ")"); +- */ +- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); +- return 0; +- +-} +- +-int sfn_sf_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) +-{ +- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%d/%d (%d)", value >> 3, value & 0x0007, value); +- return 0; +-} +- +- +-int dissect_duplex_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_duplex_mode, tvb, offset, 0); +- return 0; +-} +- +-int power_offset_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) +-{ +- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (((float)value * 0.001) - 6.0), value); +- return 0; +-} +- +-int dissect_pcfich_power_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 value = proto_tree_add_uint16_with_conversion(tree, hf_nfapi_pcfich_power_offset, tvb, offset, power_offset_conversion); +- +- if (value > 10000) +- { +- expert_add_info(pinfo, tree, &ei_power_invalid); +- } +- +- return 0; +-} +- +-int dissect_pb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 value = proto_tree_add_uint16(tree, hf_nfapi_pb, tvb, offset, 0); +- +- if (value > 3) +- { +- expert_add_info(pinfo, tree, &ei_power_invalid); +- } +- return 0; +-} +- +-int dissect_dl_cyclic_prefix_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_dl_cyclic_prefix_type, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_cyclic_prefix_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_ul_cyclic_prefix_type, tvb, offset, 0); +- return 0; +-} +-int dissect_dl_channel_bandwidth_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, bandwidth_conversion); +- return 0; +-} +-int dissect_ul_channel_bandwidth_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_uplink_channel_bandwidth, tvb, offset, bandwidth_conversion); +- return 0; +-} +- +- +-int reference_signal_power_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) +-{ +- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (((float)value * 0.25) - 63.75), value); +- return 0; +-} +- +-int dissect_reference_signal_power_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_reference_signal_power, tvb, offset, reference_signal_power_conversion); +- return 0; +-} +-int dissect_tx_antenna_ports_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_tx_antenna_ports, tvb, offset, 0); +- return 0; +-} +-int dissect_rx_antenna_ports_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_rx_antenna_ports, tvb, offset, 0); +- return 0; +-} +-int dissect_phich_resource_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_phich_resource, tvb, offset, 0); +- return 0; +-} +-int dissect_phich_duration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_phich_duration, tvb, offset, 0); +- return 0; +-} +-int dissect_phich_power_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_phich_power_offset, tvb, offset, power_offset_conversion); +- return 0; +-} +-int dissect_psch_synch_signal_epre_eprers_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_primary_synchronization_signal_epre_eprers, tvb, offset, power_offset_conversion); +- return 0; +-} +-int dissect_physical_cell_id_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_physical_cell_id, tvb, offset, 0); +- return 0; +-} +-int dissect_ssch_synch_signal_epre_eprers_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_secondary_synchronization_signal_epre_eprers, tvb, offset, power_offset_conversion); +- return 0; +-} +-int dissect_prach_configuration_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_configuration_index, tvb, offset, 0); +- return 0; +-} +-int dissect_prach_root_sequence_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_root_sequence_index, tvb, offset, 0); +- return 0; +-} +-int dissect_prach_zero_correlation_zone_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_zero_correlation_zone_configuration, tvb, offset, 0); +- return 0; +-} +-int dissect_prach_high_speed_flag_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_high_speed_flag, tvb, offset, 0); +- return 0; +-} +-int dissect_prach_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); +- return 0; +-} +-int dissect_pusch_hopping_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_hopping_mode, tvb, offset, 0); +- return 0; +-} +-int dissect_pusch_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_hopping_offset, tvb, offset, 0); +- return 0; +-} +-int dissect_pusch_number_of_subbands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_number_of_subbands, tvb, offset, 0); +- return 0; +-} +-int dissect_pucch_delta_pucch_shift_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_delta_pucch_shift, tvb, offset, 0); +- return 0; +-} +-int dissect_pucch_n_cqi_rb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_n_cqi_rb, tvb, offset, 0); +- return 0; +-} +-int dissect_pucch_n_an_cs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_n_an_cs, tvb, offset, 0); +- return 0; +-} +-int dissect_pucch_n1_pucch_an_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_n1_pucch_an, tvb, offset, 0); +- return 0; +-} +-int dissect_srs_bandwidth_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_bandwidth_configuration, tvb, offset, 0); +- return 0; +-} +-int dissect_srs_max_uppts_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_max_up_pts, tvb, offset, 0); +- return 0; +-} +-int dissect_srs_subframe_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_srs_subframe_configuration, tvb, offset, 0); +- return 0; +-} +-int dissect_srs_acknack_srs_sim_tx_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_srs_acknack_srs_simultaneous_transmission, tvb, offset, 0); +- return 0; +-} +-int dissect_uplink_rs_hopping_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_uplink_rs_hopping, tvb, offset, 0); +- return 0; +-} +-int dissect_group_assignment_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_group_assignment, tvb, offset, 0); +- return 0; +-} +-int dissect_cyclic_shift_1_for_drms_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_cyclic_shift_1_for_drms, tvb, offset, 0); +- return 0; +-} +-int dissect_tdd_subframe_assignement_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_subframe_assignment, tvb, offset, 0); +- return 0; +-} +-int dissect_tdd_subframe_patterns_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_special_subframe_patterns, tvb, offset, 0); +- return 0; +-} +- +-int laa_threshold_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) +-{ +- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (float)(value * -100.00), value); +- return 0; +-} +- +-int dissect_laa_ed_threashold_for_lbt_for_pdsch_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ed_threshold_for_lbt_for_pdsch, tvb, offset, laa_threshold_conversion); +- return 0; +-} +-int dissect_laa_ed_threashold_for_lbt_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ed_threshold_for_lbt_for_drs, tvb, offset, laa_threshold_conversion); +- return 0; +-} +-int dissect_laa_pd_threshold_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_pd_threshold, tvb, offset, laa_threshold_conversion); +- return 0; +-} +-int dissect_laa_multi_carrier_type_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_type, tvb, offset, 0); +- return 0; +-} +-int dissect_laa_multi_carrier_tx_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_tx, tvb, offset, 0); +- return 0; +-} +-int dissect_laa_multi_carrier_freeze_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_freeze, tvb, offset, 0); +- return 0; +-} +-int dissect_laa_tx_antenna_port_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_tx_antenna_ports_for_drs, tvb, offset, 0); +- return 0; +-} +-int dissect_laa_transmission_power_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power_for_drs, tvb, offset, power_offset_conversion); +- return 0; +-} +- +-int dissect_emtc_pbch_repeitions_enabled_r13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pbch_repetitions_enabled_r13, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_prach_cat_m_root_sequence_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_root_sequence_index, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_prach_cat_m_high_speed_flag_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_high_speed_flag, tvb, offset, 0); +- return 0; +-} +- +-int dissect_emtc_prach_ce_level_0_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_enable, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_prach_ce_level_0_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_configuration_index, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_prach_ce_level_0_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_frequency_offset, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_ce_level_0_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_0_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_hopping_enabled, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_0_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_hopping_offset, tvb, offset, 0); +- return 0; +-} +- +-int dissect_emtc_prach_ce_level_1_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_enable, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_prach_ce_level_1_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_configuration_index, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_prach_ce_level_1_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_frequency_offset, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_ce_level_1_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_1_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_hopping_enabled, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_1_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_hopping_offset, tvb, offset, 0); +- return 0; +-} +- +-int dissect_emtc_prach_ce_level_2_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_enable, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_prach_ce_level_2_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_configuration_index, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_prach_ce_level_2_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_frequency_offset, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_ce_level_2_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_2_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_hopping_enabled, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_2_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_hopping_offset, tvb, offset, 0); +- return 0; +-} +- +-int dissect_emtc_prach_ce_level_3_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_enable, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_prach_ce_level_3_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_configuration_index, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_prach_ce_level_3_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_frequency_offset, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_ce_level_3_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_3_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_hopping_enabled, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_preach_ce_level_3_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_hopping_offset, tvb, offset, 0); +- return 0; +-} +- +-int dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, tvb, offset, 0); +- return 0; +-} +-int dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, tvb, offset, 0); +- return 0; +-} +- +- +-int dissect_dl_bandwidth_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_dl_bandwidth_support, tvb, offset, bandwidth_conversion); +- return 0; +-} +- +-int dissect_ul_bandwidth_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ul_bandwidth_support, tvb, offset, bandwidth_conversion); +- return 0; +-} +- +-int dl_modulation_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) +-{ +- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); +- return 0; +-} +- +-int dissect_dl_modulation_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_dl_modulation_support, tvb, offset, dl_modulation_conversion); +- return 0; +-} +- +-int ul_modulation_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) +-{ +- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); +- return 0; +-} +-int dissect_ul_modulation_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ul_modulation_support, tvb, offset, ul_modulation_conversion); +- return 0; +-} +-int dissect_phy_antenna_capability_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_phy_antenna_capability, tvb, offset, 0); +- return 0; +-} +- +-int release_capability_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value) +-{ +- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value); +- return 0; +-} +-int dissect_release_capability_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_release_capability, tvb, offset, release_capability_conversion); +- return 0; +-} +-int dissect_mbsfn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_mbsfn_capability, tvb, offset, 0); +- return 0; +-} +- +-int dissect_laa_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_laa_capability, tvb, offset, 0); +- return 0; +-} +-int dissect_laa_pd_sensing_lbt_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pd_sensing_lbt_support, tvb, offset, 0); +- return 0; +-} +-int dissect_laa_multi_carrier_lbt_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_lbt_support, tvb, offset, 0); +- return 0; +-} +-int dissect_laa_partial_sf_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_partial_sf_support, tvb, offset, 0); +- return 0; +-} +- +-int dissect_data_report_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_data_report_mode, tvb, offset, 0); +- return 0; +-} +-int dissect_sfn_sf_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_sfnsf, tvb, offset, 0); +- return 0; +-} +-int dissect_phy_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_phy_state, tvb, offset, 0); +- return 0; +-} +- +- +- +-int dissect_p7_vnf_address_ipv4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8_array(tree, hf_nfapi_vnf_address_ipv4, 4, tvb, offset); +- return 0; +-} +-int dissect_p7_vnf_address_ipv6_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8_array(tree, hf_nfapi_vnf_address_ipv4, 16, tvb, offset); +- return 0; +-} +-int dissect_p7_vnf_port_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_vnf_port, tvb, offset, 0); +- return 0; +-} +- +-int dissect_p7_pnf_address_ipv4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8_array(tree, hf_nfapi_pnf_address_ipv4, 4, tvb, offset); +- return 0; +-} +-int dissect_p7_pnf_address_ipv6_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8_array(tree, hf_nfapi_pnf_address_ipv4, 16, tvb, offset); +- return 0; +-} +-int dissect_p7_pnf_port_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pnf_port, tvb, offset, 0); +- return 0; +-} +- +-int dissect_downlink_ues_per_subframe_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_dl_ue_per_sf, tvb, offset, 0); +- return 0; +-} +- +-int dissect_uplink_ues_per_subframe_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_ul_ue_per_sf, tvb, offset, 0); +- return 0; +-} +- +-int dissect_rf_band_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_band, tvb, offset, 0); +- return 0; +-} +- +-int dissect_rf_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); +- return 0; +-} +- +-int dissect_timing_window_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_timing_window, tvb, offset, 0); +- return 0; +-} +-int dissect_timing_info_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_timing_info_mode, tvb, offset, 0); +- return 0; +-} +-int dissect_timing_info_period_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_timing_info_period, tvb, offset, 0); +- return 0; +-} +- +-int dissect_maximum_transmit_power_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_maximum_transmit_power, tvb, offset, 0); +- return 0; +-} +-int dissect_earfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); +- return 0; +-} +- +-int dissect_nmm_gsm_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); +- return 0; +-} +-int dissect_nmm_umts_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); +- return 0; +-} +-int dissect_nmm_lte_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value); +- return 0; +-} +-int dissect_nmm_uplink_rssi_supported_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_nmm_uplink_rssi_supported, tvb, offset, 0); +- return 0; +-} +- +-int dissect_dl_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_dl_config_pdu_type, tvb, offset, 0); +- guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); +- +- guint pdu_end = (*offset + size - 2); +- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); +- +- return 0; +-} +- +- +-static int dissect_dl_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_number_pdcch_ofdm_symbols, tvb, offset, 0); +- guint16 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_dci, tvb, offset, 0); +- num_pdu += proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_pdsch_rnti, tvb, offset, 0); +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power_pcfich, tvb, offset, power_offset_conversion); +- +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "DL Config PDU List", hf_nfapi_dl_config_request_pdu_list, ett_nfapi_dl_config_request_pdu_list, num_pdu, dissect_dl_config_pdu); +- +- +- return 0; +-} +- +-static int dissect_dl_config_request_bch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); +- return 0; +-} +- +-static int dissect_dl_config_request_dl_dci_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_cce_idx, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_mcs_1, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version_1, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator_1, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_mcs_2, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version_2, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator_2, tvb, offset, 0); +- proto_tree_add_uint8_with_range(tree, hf_nfapi_harq_process, tvb, offset, pinfo, 0, 15, 0); +- proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_precoding_information, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_transport_block_size_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_downlink_power_offset, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_allocate_prach_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_preamble_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_prach_mask_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0); +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); +- return 0; +-} +-static int dissect_dl_config_request_dl_dci_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_mcch_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_mcch_change_notification, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_scrambling_identity, tvb, offset, 0); +- return 0; +-} +-static int dissect_dl_config_request_dl_dci_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_cross_carrier_scheduling_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_carrier_indicator, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_size_of_cqi_csi_feild, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_srs_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_scrambling_and_layers, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_n_dl_rb, tvb, offset, 0); +- return 0; +-} +-static int dissect_dl_config_request_dl_dci_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_ack_resource_offset, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, tvb, offset, 0); +- return 0; +-} +- +-int dissect_ul_dl_configuration_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_ul_dl_configuration_index, tvb, offset, 0); +- return 0; +-} +- +- +-static int dissect_dl_config_request_dl_dci_pdu_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_primary_cell_type, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ul_dl_configuration_flag, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ul_dl_configurations, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "UL/DL Configurations", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, count, dissect_ul_dl_configuration_index_value); +- +- return 0; +-} +-static int dissect_dl_config_request_dl_dci_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_laa_end_partial_sf_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_laa_end_partial_sf_configuration, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_codebooksize_determination_r13, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_rel13_drms_table_flag, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_dl_config_request_mch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0); +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); +- proto_tree_add_uint16(tree, hf_nfapi_mbsfn_area_id, tvb, offset, 0); +- +- return 0; +-} +- +-int dissect_codebook_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0); +- return 0; +-} +- +-int dissect_bf_vector_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_bf_vector_bf_value, tvb, offset, 0); +- return 0; +-} +- +-int dissect_bf_vector_type_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_bf_vector_subband_index, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_bf_vector_num_antennas, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Antennas", hf_nfapi_bf_vector_antennas, ett_nfapi_bf_vector_antennas, count, dissect_bf_vector_value); +- return 0; +-} +- +-static int dissect_dl_config_request_dlsch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_transport_blocks, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_transmission_scheme, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0); +- guint8 num_subbands = proto_tree_add_uint8(tree, hf_nfapi_number_of_subbands, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Subbands", hf_nfapi_subbands, ett_nfapi_subbands, num_subbands, dissect_codebook_index_value); +- proto_tree_add_uint8(tree, hf_nfapi_ue_category_capacity, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_pa, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_delta_power_offset_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_transmission_mode, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_num_bf_prb_per_subband, tvb, offset, 0); +- guint8 num_vectors = proto_tree_add_uint8(tree, hf_nfapi_num_bf_vector, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Beamforming Vectors", hf_nfapi_bf_vectors, ett_nfapi_bf_vectors, num_vectors, dissect_bf_vector_type_value); +- +- +- return 0; +-} +- +-int dissect_csi_rs_resource_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_dl_config_request_dlsch_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_nscid, tvb, offset, 0); +- +- return 0; +-} +-static int dissect_dl_config_request_dlsch_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config_r10, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_csi_rs_number_if_nzp_configurations, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "CSI-RS Resource Configs", hf_nfapi_csi_rs_resource_configs, ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); +- proto_tree_add_uint8(tree, hf_nfapi_pdsch_start, tvb, offset, 0); +- +- return 0; +-} +-static int dissect_dl_config_request_dlsch_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_drms_config_flag, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_drms_scrambling, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_csi_config_flag, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_csi_scrambling, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_antenna_ports, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_freq_shift, tvb, offset, 0); +- return 0; +-} +-static int dissect_dl_config_request_dlsch_pdu_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_alt_cqi_table_r12, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_max_layers, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_n_dl_harq, tvb, offset, 0); +- return 0; +-} +-static int dissect_dl_config_request_dlsch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_dwpts_symbols, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_pdsch_payload_type, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_req13_drms_table_flag, tvb, offset, 0); +- return 0; +-} +-static int dissect_dl_config_request_pch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_prnti, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_transport_blocks, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_transmission_scheme, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ue_category_capacity, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_pa, tvb, offset, 0); +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); +- proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0); +- return 0; +-} +-static int dissect_dl_config_request_pch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_ue_mode, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0); +- return 0; +-} +-static int dissect_dl_config_request_prs_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); +- proto_tree_add_uint8(tree, hf_prs_bandwidth, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_prs_cyclic_prefix_type, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_prs_muting, tvb, offset, 0); +- return 0; +-} +-static int dissect_dl_config_request_csi_rs_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_antenna_port_count_r10, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config_r10, tvb, offset, 0); +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); +- proto_tree_add_uint16(tree, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_csi_rs_number_if_nzp_configurations, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "CSI-RS Resource Configs", hf_nfapi_csi_rs_resource_configs, ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); +- return 0; +-} +- +- +-int dissect_csi_rs_bf_vector_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_index, tvb, offset, 0); +- //proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_dl_config_request_csi_rs_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_csi_rs_class, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_cdm_type, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_num_bf_vector, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Beamforming Vector", hf_nfapi_csi_rs_bf_vector, ett_nfapi_csi_rs_bf_vector, count, dissect_csi_rs_bf_vector_value); +- return 0; +-} +- +-int dissect_epdcch_prb_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_edpcch_prb_index, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_dl_config_request_edpcch_params_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_epdcch_resource_assignment_flag, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_epdcch_id, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_epdcch_start_symbol, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_epdcch_num_prb, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PRBs", hf_nfapi_epdcch_prbs, ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value); +- dissect_bf_vector_type_value(tvb, pinfo, tree, data, offset, end); +- +- return 0; +-} +-static int dissect_dl_config_request_edpcch_params_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_dwpts_symbols, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0); +- return 0; +-} +- +-int dissect_precoding_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_precoding_value, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_dl_config_request_mpdpcch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_mpdcch_narrowband, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_prb_pairs, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_resource_block_assignment, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_start_symbol, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ecce_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ce_mode, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_drms_scrabmling_init, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_transmission_power, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_resource_block_coding , tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_pdsch_reception_levels , tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_harq_process, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_tpmi_length, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_pmi_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_harq_resource_offset, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_dci_subframe_repetition_number, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index_length, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_allocate_prach_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_preamble_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_prach_mask_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_starting_ce_level, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_and_scrambling_identity_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_and_scrambling_identity, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag , tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_paging_direct_indication_differentiation_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_direct_indication, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna_ports, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Precoding", hf_nfapi_precoding, ett_nfapi_precoding, count, dissect_precoding_value); +- +- return 0; +-} +- +-int dissect_ul_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_ul_config_pdu_type, tvb, offset, 0); +- guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); +- +- guint pdu_end = (*offset + size - 2); +- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); +- +- return 0; +-} +- +-static int dissect_ul_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_rach_prach_frequency_resources, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_srs_present, tvb, offset, 0); +- +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "UL Config PDU List", hf_nfapi_ul_config_request_pdu_list, ett_nfapi_ul_config_request_pdu_list, num_pdu, dissect_ul_config_pdu); +- +- return 0; +-} +- +- +-int dissect_ul_config_ulsch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_size, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_bits, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_harq_process_number, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ul_tx_mode, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_current_tx_nb, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_n_srs, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_ulsch_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_transport_blocks, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ul_transmission_scheme, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_disable_sequence_hopping_flag, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_ulsch_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_virtual_cell_id_enabled_flag, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_npusch_identity, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_drms_config_flag, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_ndrms_csh_identity, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_ulsch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_total_number_of_repetitions, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_repetition_number, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_initial_sf_io, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_empty_symbols_due_to_retunning, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_init_tx_params_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_n_srs_initial, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_initial_number_of_resource_blocks, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_cqi_ri_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size_rank_1, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size_rank_greater_1, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ri_size, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_cqi, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_ri, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_cqi_ri_info_rel9_later_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint8 type = proto_tree_add_uint8(tree, hf_nfapi_report_type, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_cqi, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_ri, tvb, offset, 0); +- +- switch (type) +- { +- case 0: +- { +- proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_ri_pmi_size, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_control_type, tvb, offset, 0); +- break; +- } +- case 1: +- { +- /*guint8 num_cc = */proto_tree_add_uint8(tree, hf_nfapi_number_of_cc, tvb, offset, 0); +- +- // todo ... +- +- break; +- } +- } +- return 0; +-} +-int dissect_ul_config_cqi_ri_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_dl_cqi_ri_pmi_size_2, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_harq_info_ulsch_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_harq, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0); +- +- return 0; +-} +-int dissect_ul_config_harq_info_ulsch_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_harq_size_2, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_delta_offset_harq_2, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_ue_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_ue_info_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_virtual_cell_id_enabled_flag, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_npucch_identity, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_ue_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_empty_symbols, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_total_number_of_repetitions, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_repetition_number, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_cqi_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pucch_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_cqi_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pucch_index_p1, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_cqi_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_csi_mode, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_dl_cqi_pmi_size_2, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_statring_prb, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_cdm_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_nsrs, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_sr_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_pucch_index, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_sr_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pucch_index_p1, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_harq_info_uci_rel10_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_1, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_2, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_3, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_harq_info_uci_rel8_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_harq_info_uci_rel9_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_1, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_2, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_3, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_num_ant_ports, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_0, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_1, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_2, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_3, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_harq_size_2, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_starting_prb, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_cdm_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_nsrs, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_srs_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_size, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_srs_bandwidth, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_frequency_domain_position, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_srs_hopping_bandwidth, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_transmission_comb, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_i_srs, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_sounding_reference_cyclic_shift, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_srs_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_antenna_port, tvb, offset, 0); +- return 0; +-} +-int dissect_ul_config_srs_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_number_of_combs, tvb, offset, 0); +- return 0; +-} +- +-int dissect_hi_dci0_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_pdu_type, tvb, offset, 0); +- guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); +- +- guint pdu_end = (*offset + size - 2); +- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); +- +- return 0; +-} +- +-static int dissect_hi_dci0_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_sfn_sf, tvb, offset, 0); +- guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_of_dci_pdus, tvb, offset, 0); +- num_pdu += proto_tree_add_uint8(tree, hf_nfapi_number_of_hi_pdus, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "HI DCI0 PDU List", hf_nfapi_hi_dci0_request_pdu_list, ett_nfapi_hi_dci0_request_pdu_list, num_pdu, dissect_hi_dci0_pdu); +- return 0; +-} +- +-static int dissect_hi_dci0_hi_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_hi_value, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_i_phich, tvb, offset, 0); +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); +- return 0; +-} +-static int dissect_hi_dci0_hi_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_flag_tb2, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_hi_value_2, tvb, offset, 0); +- return 0; +-} +-static int dissect_hi_dci0_dci_ul_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_cce_idx, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_mcs_1, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_bits, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ue_tx_antenna_selection, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_cqi_csi_request, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ul_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_dl_assignment_index, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_tpc_bitmap, tvb, offset, 0); +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); +- return 0; +-} +-static int dissect_hi_dci0_dci_ul_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_cross_carrier_scheduling_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_carrier_indicator, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_size_of_cqi_csi_feild, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_srs_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_mcs_2, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_new_data_indication_two, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_antenna_ports, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_n_ul_rb, tvb, offset, 0); +- return 0; +-} +-static int dissect_hi_dci0_dci_ul_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_pscch_resource, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_time_resource_pattern, tvb, offset, 0); +- return 0; +-} +-static int dissect_hi_dci0_edpcch_dci_ul_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_epdcch_resource_assignment_flag, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_epdcch_id, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_epdcch_start_symbol, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_epdcch_num_prb, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PRBs", hf_nfapi_epdcch_prbs, ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value); +- dissect_bf_vector_type_value(tvb, pinfo, tree, data, offset, end); +- return 0; +-} +- +-static int dissect_hi_dci0_mdpcch_dci_ul_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_mpdcch_narrowband, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_prb_pairs, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_resource_block_assignment, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_mpdcch_transmission_type, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_start_symbol, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ecce_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ce_mode, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_drms_scrambling_init, tvb, offset, 0); +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion); +- proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_pusch_repetition_levels, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_harq_process, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_csi_request, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ul_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_dai_presence_flag, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_dl_assignment_index, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_dci_subframe_repetition_number, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_tpc_bitmap, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_include_padding, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna_ports, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "TX Antenna Ports", hf_nfapi_tx_antenna_ports, ett_nfapi_tx_antenna_ports, count, dissect_precoding_value); +- +- +- return 0; +-} +-static int dissect_rx_ue_info_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); +- return 0; +-} +-static int dissect_rx_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); +- int data_offset = proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); +- return data_offset; +-} +-static int dissect_rx_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_harq_indication_data_bundling_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_1, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_harq_indication_data_multplexing_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_1, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_2, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_3, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_harq_indication_data_special_bundling_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_harq_indication_data_channel_selection_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_harq_indication_data_format_3_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_harq_indication_data_format_4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); +- return 0; +-} +- +- +-static int dissect_harq_indication_data_format_5_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0); +- return 0; +-} +- +- +- +-static int dissect_harq_indication_rel8_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); +- +- switch (mode) +- { +- case 0: +- { +- dissect_harq_indication_data_bundling_value(tvb, pinfo, tree, data, offset, end); +- break; +- } +- case 1: +- { +- dissect_harq_indication_data_multplexing_value(tvb, pinfo, tree, data, offset, end); +- break; +- } +- case 2: +- { +- dissect_harq_indication_data_special_bundling_value(tvb, pinfo, tree, data, offset, end); +- break; +- } +- }; +- +- return 0; +-} +-static int dissect_harq_indication_rel9_later_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); +- +- // Have to do this as the mode value is need to decode the value +- guint16 i = 0; +- +- proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "ACK/NACK Data"); +- proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_harq_ack_nack_data); +- +- for (i = 0; i < count; ++i) +- { +- +- proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "[%d]", i); +- proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_nfapi_harq_ack_nack_data); +- +- switch (mode) +- { +- case 0: +- { +- dissect_harq_indication_data_bundling_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- case 1: +- { +- dissect_harq_indication_data_multplexing_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- case 2: +- { +- dissect_harq_indication_data_special_bundling_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- case 3: +- { +- dissect_harq_indication_data_channel_selection_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- case 4: +- { +- dissect_harq_indication_data_format_3_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- }; +- } +- +- return 0; +-} +-static int dissect_harq_indication_rel13_later_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); +- +- // Have to do this as the mode value is need to decode the value +- guint16 i = 0; +- +- proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "ACK/NACK Data"); +- proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_harq_ack_nack_data); +- +- for (i = 0; i < count; ++i) +- { +- proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "[%d]", i); +- proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_nfapi_harq_ack_nack_data); +- +- switch (mode) +- { +- case 0: +- { +- dissect_harq_indication_data_bundling_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- case 1: +- { +- dissect_harq_indication_data_multplexing_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- case 2: +- { +- dissect_harq_indication_data_special_bundling_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- case 3: +- { +- dissect_harq_indication_data_channel_selection_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- case 4: +- { +- dissect_harq_indication_data_format_3_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- case 5: +- { +- dissect_harq_indication_data_format_4_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- case 6: +- { +- dissect_harq_indication_data_format_5_value(tvb, pinfo, item_tree, data, offset, end); +- break; +- } +- }; +- } +- +- return 0; +-} +-static int dissect_harq_indication_rel8_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_tb_1, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_harq_tb_2, tvb, offset, 0); +- return 0; +-} +- +-int dissect_harq_tb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_harq_tb_n, tvb, offset, 0); +- return 0; +-} +- +- +-static int dissect_harq_indication_rel9_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ TB List", hf_nfapi_harq_data, ett_nfapi_harq_data, count, dissect_harq_tb_value); +- return 0; +-} +-static int dissect_harq_indication_rel13_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ TB List", hf_nfapi_harq_data, ett_nfapi_harq_data, count, dissect_harq_tb_value); +- return 0; +-} +-static int dissect_ul_cqi_information_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_channel, tvb, offset, 0); +- return 0; +-} +-static int dissect_crc_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_crc_flag, tvb, offset, 0); +- return 0; +-} +-static int dissect_rx_cqi_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ri, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); +- return 0; +-} +- +-int dissect_ri_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_ri, tvb, offset, 0); +- return 0; +-} +-static int dissect_rx_cqi_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_cc_reported, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "CC List", hf_nfapi_cc, ett_nfapi_cc, count, dissect_ri_value); +- proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); +- +- return 0; +-} +-static int dissect_rach_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_preamble, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); +- return 0; +-} +-static int dissect_rach_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); +- return 0; +-} +-static int dissect_rach_indication_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_rach_resource_type, tvb, offset, 0); +- return 0; +-} +- +-int dissect_snr_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_snr, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_srs_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_doppler_estimation, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0); +- guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_rb_start, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "RB List", hf_nfapi_rbs, ett_nfapi_rbs, count, dissect_snr_value); +- +- +- return 0; +-} +-static int dissect_srs_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0); +- return 0; +-} +-static int dissect_srs_indication_rel10_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_up_pts_symbol, tvb, offset, 0); +- return 0; +-} +-static int dissect_tdd_channel_measuerment_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_number_prb_per_subband, tvb, offset, 0); +- guint8 num_subbands = proto_tree_add_uint8(tree, hf_nfapi_number_of_subbands, tvb, offset, 0); +- guint8 num_phy_ant = proto_tree_add_uint8(tree, hf_nfapi_number_antennas, tvb, offset, 0); +- +- guint16 i = 0; +- guint16 j = 0; +- +- proto_item *sb_list_ti = proto_tree_add_string_format(tree, hf_nfapi_subbands, tvb, *offset, 2, "", "Subbands"); +- proto_tree *sb_list_tree = proto_item_add_subtree(sb_list_ti, ett_nfapi_subbands); +- +- for (i = 0; i < num_subbands; ++i) +- { +- proto_item *sb_item_ti = proto_tree_add_string_format(sb_list_tree, hf_nfapi_subbands, tvb, *offset, 2, "", "[%d]", i); +- proto_tree *sb_item_tree = proto_item_add_subtree(sb_item_ti, ett_nfapi_subbands); +- +- proto_tree_add_uint8(sb_item_ti, hf_nfapi_subband_index, tvb, offset, 0); +- +- +- proto_item *ant_list_ti = proto_tree_add_string_format(sb_item_tree, hf_nfapi_antennas, tvb, *offset, 2, "", "Physical Antennas"); +- proto_tree *ant_list_tree = proto_item_add_subtree(ant_list_ti, ett_nfapi_antennas); +- +- for (j = 0; j < num_phy_ant; ++j) +- { +- proto_item *ant_item_ti = proto_tree_add_string_format(ant_list_tree, hf_nfapi_antennas, tvb, *offset, 2, "", "[%d]", j); +- proto_tree *ant_item_tree = proto_item_add_subtree(ant_item_ti, ett_nfapi_antennas); +- +- proto_tree_add_uint16(ant_item_tree, hf_nfapi_channel_coefficient, tvb, offset, 0); +- } +- } +- +- return 0; +-} +- +-static int dissect_srs_indication_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_ul_rtoa, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_lbt_dl_config_request_pdsch_req_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_mp_cca, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_n_cca, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_offset, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_lte_txop_sf, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_txop_sfn_sf_end, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_lbt_mode, tvb, offset, 0); +- return 0; +-} +-static int dissect_lbt_dl_config_request_drs_req_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_offset, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_sfn_sf_end, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_lbt_mode, tvb, offset, 0); +- return 0; +-} +-static int dissect_lbt_dl_config_request_pdsch_resp_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_result, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_txop_symbols, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_initial_partial_sf, tvb, offset, 0); +- return 0; +-} +-static int dissect_lbt_dl_config_request_drs_resp_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_result, tvb, offset, 0); +- return 0; +-} +- +-int dissect_tx_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 len = proto_tree_add_uint16(tree, hf_nfapi_pdu_length, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0); +- +- proto_tree_add_uint8_array(tree, hf_nfapi_pdu, len, tvb, offset); +- +- return 0; +-} +- +-static int dissect_tx_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "TX PDU List", hf_nfapi_tx_request_pdu_list, ett_nfapi_tx_request_pdu_list, num_pdu, dissect_tx_pdu); +- return 0; +- +-} +- +-int dissect_rx_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- //guint end = (*offset + size - 2); +- //dissect_tlv_list(tvb, pinfo, tree, data, offset, end); +- return 0; +-} +- +- +- +-int dissect_harq_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); +- guint pdu_end = (*offset + pdu_len - 2); +- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); +- return 0; +-} +- +-static int dissect_harq_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_harqs, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ PDU List", hf_nfapi_harq_indication_pdu_list, ett_nfapi_harq_indication_pdu_list, num_pdu, dissect_harq_indication_pdu); +- return 0; +-} +- +-int dissect_crc_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); +- guint pdu_end = (*offset + pdu_len - 2); +- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); +- return 0; +-} +- +- +-static int dissect_crc_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_crcs, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "CRC PDU List", hf_nfapi_crc_indication_pdu_list, ett_nfapi_crc_indication_pdu_list, num_pdu, dissect_crc_indication_pdu); +- return 0; +-} +-int dissect_sr_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); +- guint pdu_end = (*offset + pdu_len - 2); +- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); +- return 0; +-} +- +-static int dissect_rx_sr_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_srs, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "SR PDU List", hf_nfapi_sr_indication_pdu_list, ett_nfapi_sr_indication_pdu_list, num_pdu, dissect_sr_indication_pdu); +- return 0; +-} +-int dissect_cqi_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); +- guint pdu_end = (*offset + pdu_len - 2); +- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); +- return 0; +-} +-static int dissect_rx_cqi_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_cqi, tvb, offset, 0); +- +- guint16* lengths = malloc(num_pdu * 2); +- memset(lengths, 0, num_pdu * 2); +- +- guint8 tmp_offset = *offset; +- +- int i = 0; +- for (i = 0; i < num_pdu; ++i) +- { +- guint16 instance_len = tvb_get_guint16(tvb, tmp_offset, ENC_NA); +- tmp_offset += 2; +- guint8 pdu_end = tmp_offset + instance_len; +- +- while (tmp_offset < pdu_end) +- { +- guint16 tlv_id = tvb_get_guint16(tvb, tmp_offset, ENC_NA); +- tmp_offset += 2; +- guint16 tlv_len = tvb_get_guint16(tvb, tmp_offset, ENC_NA); +- tmp_offset += 2; +- +- if (tlv_id == 0x202F) +- { +- lengths[i] = tvb_get_guint16(tvb, tmp_offset, ENC_NA); +- } +- else if (tlv_id == 0x2030) +- { +- lengths[i] = tvb_get_guint16(tvb, tmp_offset, ENC_NA); +- } +- +- tmp_offset += tlv_len; +- } +- +- } +- +- +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "CQI PDU List", hf_nfapi_cqi_indication_pdu_list, ett_nfapi_cqi_indication_pdu_list, num_pdu, dissect_cqi_indication_pdu); +- +- +- for (i = 0; i < num_pdu; ++i) +- { +- proto_tree_add_uint8_array(tree, hf_nfapi_pdu, lengths[i], tvb, offset); +- } +- +- free(lengths); +- +- return 0; +-} +-int dissect_preamble_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); +- guint pdu_end = (*offset + pdu_len - 2); +- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); +- return 0; +-} +-static int dissect_rach_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_preambles, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Preamble PDU List", hf_nfapi_preamble_indication_pdu_list, ett_nfapi_preamble_indication_pdu_list, num_pdu, dissect_preamble_indication_pdu); +- return 0; +-} +-int dissect_srs_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0); +- guint pdu_end = (*offset + pdu_len - 2); +- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); +- return 0; +-} +-static int dissect_srs_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- +- guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_of_srss, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "SRS PDU List", hf_nfapi_srs_indication_pdu_list, ett_nfapi_srs_indication_pdu_list, num_pdu, dissect_srs_indication_pdu); +- return 0; +-} +-int dissect_lbt_dl_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_lbt_dl_req_pdu_type, tvb, offset, 0); +- guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); +- guint pdu_end = (*offset + size - 2); +- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); +- return 0; +-} +-static int dissect_lbt_dl_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "LBT DL PDU List", hf_nfapi_lbt_dl_config_pdu_list, ett_nfapi_lbt_dl_config_pdu_list, num_pdu, dissect_lbt_dl_config_pdu); +- +- return 0; +-} +-int dissect_lbt_dl_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_lbt_dl_ind_pdu_type, tvb, offset, 0); +- guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0); +- guint pdu_end = (*offset + size - 2); +- dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end); +- return 0; +-} +-static int dissect_lbt_indication_message_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "LBT DL PDU List", hf_nfapi_lbt_dl_indication_pdu_list, ett_nfapi_lbt_dl_indication_pdu_list, num_pdu, dissect_lbt_dl_indication_pdu); +- return 0; +-} +- +-static int dissect_lte_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms"); +- proto_tree_add_uint8(tree, hf_nfapi_bandwidth, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); +- guint8 num_earfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_earfcns, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "EARFCNs", hf_nfapi_earfcn_list, ett_nfapi_earfcn_list, num_earfcns, dissect_earfcn_value); +- return 0; +-} +- +-int dissect_uarfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); +- return 0; +-} +-static int dissect_utran_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms"); +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); +- guint8 num_uarfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_uarfcns, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "UARFCNs", hf_nfapi_uarfcn_list, ett_nfapi_uarfcn_list, num_uarfcns, dissect_uarfcn_value); +- return 0; +-} +- +-int dissect_arfcn_dir_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_arfcn_direction, tvb, offset, 0); +- return 0; +-} +-static int dissect_geran_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms"); +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); +- guint8 num_arfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_arfcns, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_arfcn_list, ett_nfapi_arfcn_list, num_arfcns, dissect_arfcn_dir_value); +- return 0; +-} +- +- +-int rssi_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, gint16 value) +-{ +- proto_tree_add_int_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", ((float)value * 0.1), value); +- return 0; +-} +-int dissect_rssi_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_int16_with_conversion(tree, hf_nfapi_rssi, tvb, offset, rssi_conversion); +- return 0; +-} +-static int dissect_rssi_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_rssi = proto_tree_add_uint16(tree, hf_nfapi_number_of_rssi, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_rssi_list, ett_nfapi_rssi_list, num_rssi, dissect_rssi_value); +- return 0; +-} +- +-int dissect_pci_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); +- return 0; +-} +-static int dissect_lte_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_measurement_bandwidth, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_exhaustive_search, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); +- guint8 num_pci = proto_tree_add_uint8(tree, hf_nfapi_number_of_pci, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PCIs", hf_nfapi_pci_list, ett_nfapi_pci_list, num_pci, dissect_pci_value); +- return 0; +-} +- +-int dissect_psc_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); +- return 0; +-} +-static int dissect_utran_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_exhaustive_search, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); +- guint8 num_psc = proto_tree_add_uint8(tree, hf_nfapi_number_of_psc, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "PSCs", hf_nfapi_psc_list, ett_nfapi_psc_list, num_psc, dissect_psc_value); +- return 0; +-} +- +-int dissect_arfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_geran_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); +- guint8 num_arfcn = proto_tree_add_uint8(tree, hf_nfapi_number_of_arfcns, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_arfcn_list, ett_nfapi_arfcn_list, num_arfcn, dissect_arfcn_value); +- return 0; +-} +- +-int neg_pow_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint8 value) +-{ +- proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 1, value, "%d dB (%d)", ((gint16)value * (-1)), value); +- return 0; +-} +- +-int dissect_lte_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); +- proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rsrp, tvb, offset, neg_pow_conversion); +- proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rsrq, tvb, offset, neg_pow_conversion); +- proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); +- return 0; +-} +-static int dissect_lte_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_lte_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_lte_cells_found, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "LTE Cells Found", hf_nfapi_lte_cells_found_list, ett_nfapi_lte_cells_found_list, num_lte_cells, dissect_lte_cell_found_value); +- return 0; +-} +-int dissect_utran_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); +- proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rscp, tvb, offset, neg_pow_conversion); +- proto_tree_add_uint8_with_conversion(tree, hf_nfapi_enco, tvb, offset, neg_pow_conversion); +- proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); +- return 0; +-} +-static int dissect_utran_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_utran_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_utran_cells_found, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "UTRAN Cells Found", hf_nfapi_utran_cells_found_list, ett_nfapi_utran_cells_found_list, num_utran_cells, dissect_utran_cell_found_value); +- return 0; +-} +- +-int dissect_geran_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_bsic, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_rxlev, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_rxqual, tvb, offset, 0); +- proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0); +- return 0; +-} +-static int dissect_geran_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 num_geran_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_geran_cells_found, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "GERAN Cells Found", hf_nfapi_geran_cells_found_list, ett_nfapi_geran_cells_found_list, num_geran_cells, dissect_geran_cell_found_value); +- +- return 0; +-} +-static int dissect_pnf_cell_search_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8_array(tree, hf_nfapi_pnf_search_state, *end - *offset, tvb, offset); +- return 0; +-} +- +-static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8_array(tree, hf_nfapi_pnf_broadcast_state, *end - *offset, tvb, offset); +- return 0; +-} +-static int dissect_lte_broadcast_detect_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); +- return 0; +-} +-static int dissect_utran_broadcast_detect_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms"); +- return 0; +-} +- +-static int dissect_lte_broadcast_detect_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0); +- guint16 mib_len = proto_tree_add_uint16(tree, hf_nfapi_mib_length, tvb, offset, 0); +- proto_tree_add_uint8_array(tree, hf_nfapi_mib, mib_len, tvb, offset); +- proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0); +- return 0; +-} +-static int dissect_utran_broadcast_detect_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 mib_len = proto_tree_add_uint16(tree, hf_nfapi_mib_length, tvb, offset, 0); +- proto_tree_add_uint8_array(tree, hf_nfapi_mib, mib_len, tvb, offset); +- proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_lte_system_information_schedule_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_phich_configuration, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_retry_count, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); +- return 0; +-} +-//static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-//{ +-// return 0; +-//} +-static int dissect_lte_system_information_schedule_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- // this needs to be SIB 1 +- proto_tree_add_uint8_array(tree, hf_nfapi_sib1, (*end - *offset), tvb, offset); +- return 0; +-} +- +-int dissect_si_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_si_periodicity, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_si_index, tvb, offset, 0); +- return 0; +-} +- +-static int dissect_lte_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_phich_configuration, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0); +- guint8 si_priodicity = proto_tree_add_uint8(tree, hf_nfapi_number_of_si_periodicity, tvb, offset, 0); +- dissect_array_value(tvb, pinfo, tree, data, offset, end, "Number SI Periodicity", hf_nfapi_si_periodicity_list, ett_nfapi_si_periodicity_list, si_priodicity, dissect_si_periodicity_value); +- proto_tree_add_uint8(tree, hf_nfapi_si_window_length, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); +- +- return 0; +-} +-static int dissect_utran_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0); +- proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); +- return 0; +-} +-static int dissect_geran_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0); +- proto_tree_add_uint8(tree, hf_nfapi_bsic, tvb, offset, 0); +- proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0); +- return 0; +-} +-//static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-//{ +-// return 0; +-//} +-static int dissect_lte_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- proto_tree_add_uint8(tree, hf_nfapi_sib_type, tvb, offset, 0); +- guint16 sib_len = proto_tree_add_uint16(tree, hf_nfapi_sib_len, tvb, offset, 0); +- proto_tree_add_uint8_array(tree, hf_nfapi_sib, sib_len, tvb, offset); +- return 0; +-} +-static int dissect_utran_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 sib_len = proto_tree_add_uint16(tree, hf_nfapi_sib_len, tvb, offset, 0); +- proto_tree_add_uint8_array(tree, hf_nfapi_sib, sib_len, tvb, offset); +- return 0; +-} +-static int dissect_geran_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint16 si_len = proto_tree_add_uint16(tree, hf_nfapi_si_len, tvb, offset, 0); +- proto_tree_add_uint8_array(tree, hf_nfapi_si, si_len, tvb, offset); +- return 0; +-} +- +-static int dissect_rx_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end); +- +-const tlv_t tags[] = +-{ +- { 0x1000, "PNF Param General", dissect_pnf_param_general_value }, +- { 0x1001, "PNF PHY", dissect_pnf_phy_value }, +- { 0x1002, "PNF RF", dissect_pnf_rf_value }, +- { 0x100A, "PNF PHY Rel 10", dissect_pnf_phy_rel10_value }, +- { 0x100B, "PNF PHY Rel 11", dissect_pnf_phy_rel11_value }, +- { 0x100C, "PNF PHY Rel 12", dissect_pnf_phy_rel12_value }, +- { 0x100D, "PNF PHY Rel 13", dissect_pnf_phy_rel13_value }, +- { 0x1003, "PNF PHY RF Config", dissect_pnf_phy_rf_config_value }, +- +- { 0x0001, "Subframe config - Duplex Mode", dissect_duplex_mode_value }, +- { 0x0002, "Subframe config - PCFICH power offset TLV", dissect_pcfich_power_offset_value }, +- { 0x0003, "Subframe config - P-B", dissect_pb_value }, +- { 0x0004, "Subframe config - DL cyclic prefix type", dissect_dl_cyclic_prefix_value }, +- { 0x0005, "Subframe config - UL cyclic prefix type", dissect_ul_cyclic_prefix_value }, +- { 0x000A, "RF config - Downlink channel bandwidth", dissect_dl_channel_bandwidth_value }, +- { 0x000B, "RF config - Uplink channel bandwidth", dissect_ul_channel_bandwidth_value }, +- { 0x000C, "RF config - Reference signal power", dissect_reference_signal_power_value }, +- { 0x000D, "RF config - Tx antenna ports", dissect_tx_antenna_ports_value }, +- { 0x000E, "RF config - Rx Antenna ports", dissect_rx_antenna_ports_value }, +- { 0x0014, "PHICH config - PHICH resource", dissect_phich_resource_value }, +- { 0x0015, "PHICH config - PHICH duration", dissect_phich_duration_value }, +- { 0x0016, "PHICH config - PHICH power offset", dissect_phich_power_offset_value }, +- { 0x001E, "SCH config - Primary synchronization signal EPRE/EPRERS", dissect_psch_synch_signal_epre_eprers_value }, +- { 0x001F, "SCH config - Secondary synchronization signal EPRE/EPRERS", dissect_ssch_synch_signal_epre_eprers_value }, +- { 0x0020, "SCH config - Physical Cell Id", dissect_physical_cell_id_value }, +- { 0x0028, "PRACH config - Configuration index", dissect_prach_configuration_index_value }, +- { 0x0029, "PRACH config - Root sequence index", dissect_prach_root_sequence_index_value }, +- { 0x002A, "PRACH config - Zero correlation zone configuration", dissect_prach_zero_correlation_zone_configuration_value }, +- { 0x002B, "PRACH config - High speed flag", dissect_prach_high_speed_flag_value }, +- { 0x002C, "PRACH config - Frequency offset", dissect_prach_frequency_offset_value }, +- { 0x0032, "PUSCH config - Hopping mode", dissect_pusch_hopping_mode_value }, +- { 0x0033, "PUSCH config - Hopping offset", dissect_pusch_hopping_offset_value }, +- { 0x0034, "PUSCH config - Number of sub-bands", dissect_pusch_number_of_subbands_value }, +- { 0x003C, "PUCCH config - Delta PUCCH Shift", dissect_pucch_delta_pucch_shift_value }, +- { 0x003D, "PUCCH config - N_CQI RB", dissect_pucch_n_cqi_rb_value }, +- { 0x003E, "PUCCH config - N_AN CS", dissect_pucch_n_an_cs_value }, +- { 0x003F, "PUCCH config - N1Pucch-AN", dissect_pucch_n1_pucch_an_value }, +- { 0x0046, "SRS config - Bandwidth configuration", dissect_srs_bandwidth_configuration_value }, +- { 0x0047, "SRS config - MaxUpPTS", dissect_srs_max_uppts_value }, +- { 0x0048, "SRS config - SRS subframe configuration", dissect_srs_subframe_configuration_value }, +- { 0x0049, "SRS config - SRS AckNack SRS simultaneous transmission", dissect_srs_acknack_srs_sim_tx_value }, +- { 0x0050, "Uplink reference signal config - Uplink RS hopping", dissect_uplink_rs_hopping_value }, +- { 0x0051, "Uplink reference signal config - Group assignment (delta sequence-shift pattern)", dissect_group_assignment_value }, +- { 0x0052, "Uplink reference signal config - Cyclic Shift 1 for DMRS", dissect_cyclic_shift_1_for_drms_value }, +- { 0x005A, "TDD frame structure config - Subframe assignment", dissect_tdd_subframe_assignement_value }, +- { 0x005B, "TDD frame structure config - Special sub-frame patterns", dissect_tdd_subframe_patterns_value }, +- { 0x0064, "LAA config - ED Threshold for LBT for PDSCH", dissect_laa_ed_threashold_for_lbt_for_pdsch_value }, +- { 0x0065, "LAA config - ED Threshold for LBT for DRS", dissect_laa_ed_threashold_for_lbt_for_drs_value }, +- { 0x0066, "LAA config - PD Threshold", dissect_laa_pd_threshold_value }, +- { 0x0067, "LAA config - Multi carrier type", dissect_laa_multi_carrier_type_value }, +- { 0x0068, "LAA config - Multi carrier TX", dissect_laa_multi_carrier_tx_value }, +- { 0x0069, "LAA config - Multi carrier freeze ", dissect_laa_multi_carrier_freeze_value }, +- { 0x006A, "LAA config - Tx antenna ports for DRS", dissect_laa_tx_antenna_port_for_drs_value }, +- { 0x006B, "LAA config - Transmission power for DRS", dissect_laa_transmission_power_for_drs_value }, +- +- { 0x0078, "eMTC config - PBCH Repetitions enable R13", dissect_emtc_pbch_repeitions_enabled_r13_value }, +- { 0x0079, "eMTC config - PRACH CAT-M Root sequence index", dissect_emtc_prach_cat_m_root_sequence_index_value }, +- { 0x007A, "eMTC config - PRACH CAT-M Zero correlation zone configuration", dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value }, +- { 0x007B, "eMTC config - PRACH CAT-M High speed flag", dissect_emtc_prach_cat_m_high_speed_flag_value }, +- { 0x007C, "eMTC config - PRACH CE level #0 Enable", dissect_emtc_prach_ce_level_0_enabled_value }, +- { 0x007D, "eMTC config - PRACH CE level #0 Configuration index", dissect_emtc_prach_ce_level_0_configuration_offset_value }, +- { 0x007E, "eMTC config - PRACH CE level #0 Frequency offset", dissect_emtc_prach_ce_level_0_frequency_offset_value }, +- { 0x007F, "eMTC config - PRACH CE level #0 Number of repetitions per attempt", dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value }, +- { 0x0080, "eMTC config - CE level #0 Starting subframe periodicity", dissect_emtc_ce_level_0_starting_subframe_periodicity_value }, +- { 0x0081, "eMTC config - PRACH CE level #0 Hopping Enable", dissect_emtc_preach_ce_level_0_hopping_enabled_value }, +- { 0x0082, "eMTC config - PRACH CE level #0 Hopping Offset", dissect_emtc_preach_ce_level_0_hopping_offset_value }, +- { 0x0083, "eMTC config - PRACH CE level #1 Enable", dissect_emtc_prach_ce_level_1_enabled_value }, +- { 0x0084, "eMTC config - PRACH CE level #1 Configuration index", dissect_emtc_prach_ce_level_1_configuration_offset_value }, +- { 0x0085, "eMTC config - PRACH CE level #1 Frequency offset", dissect_emtc_prach_ce_level_1_frequency_offset_value }, +- { 0x0086, "eMTC config - PRACH CE level #1 Number of repetitions per attempt", dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value }, +- { 0x0087, "eMTC config - CE level #1 Starting subframe periodicity", dissect_emtc_ce_level_1_starting_subframe_periodicity_value }, +- { 0x0088, "eMTC config - PRACH CE level #1 Hopping Enable", dissect_emtc_preach_ce_level_1_hopping_enabled_value }, +- { 0x0089, "eMTC config - PRACH CE level #1 Hopping Offset", dissect_emtc_preach_ce_level_1_hopping_offset_value }, +- { 0x008A, "eMTC config - PRACH CE level #2 Enable", dissect_emtc_prach_ce_level_2_enabled_value }, +- { 0x008B, "eMTC config - PRACH CE level #2 Configuration index", dissect_emtc_prach_ce_level_2_configuration_offset_value }, +- { 0x008C, "eMTC config - PRACH CE level #2 Frequency offset", dissect_emtc_prach_ce_level_2_frequency_offset_value }, +- { 0x008D, "eMTC config - PRACH CE level #2 Number of repetitions per attempt", dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value }, +- { 0x008E, "eMTC config - CE level #2 Starting subframe periodicity", dissect_emtc_ce_level_2_starting_subframe_periodicity_value }, +- { 0x008F, "eMTC config - PRACH CE level #2 Hopping Enable", dissect_emtc_preach_ce_level_2_hopping_enabled_value }, +- { 0x0090, "eMTC config - PRACH CE level #2 Hopping Offset", dissect_emtc_preach_ce_level_2_hopping_offset_value }, +- { 0x0091, "eMTC config - PRACH CE level #3 Enable", dissect_emtc_prach_ce_level_3_enabled_value }, +- { 0x0092, "eMTC config - PRACH CE level #3 Configuration index", dissect_emtc_prach_ce_level_3_configuration_offset_value }, +- { 0x0093, "eMTC config - PRACH CE level #3 Frequency offset", dissect_emtc_prach_ce_level_3_frequency_offset_value }, +- { 0x0094, "eMTC config - PRACH CE level #3 Number of repetitions per attempt", dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value }, +- { 0x0095, "eMTC config - CE level #3 Starting subframe periodicity", dissect_emtc_ce_level_3_starting_subframe_periodicity_value }, +- { 0x0096, "eMTC config - PRACH CE level #3 Hopping Enable", dissect_emtc_preach_ce_level_3_hopping_enabled_value }, +- { 0x0097, "eMTC config - PRACH CE level #3 Hopping Offset", dissect_emtc_preach_ce_level_3_hopping_offset_value }, +- { 0x0098, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeA", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value }, +- { 0x0099, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeB", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value }, +- +- { 0x00C8, "Layer 2/3 - Downlink Bandwidth Support", dissect_dl_bandwidth_support_value }, +- { 0x00C9, "Layer 2/3 - Uplink Bandwidth Support", dissect_ul_bandwidth_support_value }, +- { 0x00CA, "Layer 2/3 - Downlink modulation support", dissect_dl_modulation_value }, +- { 0x00CB, "Layer 2/3 - Uplink modulation support", dissect_ul_modulation_value }, +- { 0x00CC, "Layer 2/3 - PHY antenna capability", dissect_phy_antenna_capability_value }, +- { 0x00CD, "Layer 2/3 - Release capability", dissect_release_capability_value }, +- { 0x00CE, "Layer 2/3 - MBSFN capability", dissect_mbsfn_value }, +- +- { 0x00D1, "LAA Capability - LAA support", dissect_laa_support_value }, +- { 0x00D1, "LAA Capability - PD sensing LBT support", dissect_laa_pd_sensing_lbt_support_value }, +- { 0x00D1, "LAA Capability - Multi carrier LBT support", dissect_laa_multi_carrier_lbt_support_value }, +- { 0x00D1, "LAA Capability - Partial SF support", dissect_laa_partial_sf_support_value }, +- +- { 0x00F0, "Layer 2/3 - Data report mode", dissect_data_report_mode_value }, +- { 0x00F1, "Layer 2/3 - SFN/SF", dissect_sfn_sf_value }, +- { 0x00FA, "Layer 1 - PHY state", dissect_phy_state_value }, +- +- { 0x0100, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv4_value }, +- { 0x0101, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv6_value }, +- { 0x0102, "NFAPI - P7 Port", dissect_p7_vnf_port_value }, +- { 0x0103, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv4_value }, +- { 0x0104, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv6_value }, +- { 0x0105, "NFAPI - P7 Port", dissect_p7_pnf_port_value }, +- { 0x010A, "NFAPI - Downlink UEs per Subframe", dissect_downlink_ues_per_subframe_value }, +- { 0x010B, "NFAPI - Uplink UEs per Subframe", dissect_uplink_ues_per_subframe_value }, +- +- { 0x0114, "NFAPI - nFAPI RF Bands", dissect_rf_bands_value }, +- +- { 0x011E, "NFAPI - Timing window", dissect_timing_window_value }, +- { 0x011F, "NFAPI - Timing info mode", dissect_timing_info_mode_value }, +- { 0x0120, "NFAPI - Timing info period", dissect_timing_info_period_value }, +- { 0x0128, "NFAPI - Maximum Transmit Power", dissect_maximum_transmit_power_value }, +- { 0x0129, "NFAPI - EARFCN", dissect_earfcn_value }, +- { 0x0130, "NFAPI - NMM GSM Frequency Bands", dissect_nmm_gsm_frequency_bands_value }, +- { 0x0131, "NFAPI - NMM UMTS Frequency Bands", dissect_nmm_umts_frequency_bands_value }, +- { 0x0132, "NFAPI - NMM LTE Frequency Bands", dissect_nmm_lte_frequency_bands_value }, +- { 0x0133, "NFAPI - NMM Uplink RSSI supported", dissect_nmm_uplink_rssi_supported_value }, +- +- { 0x2000, "DL Config Request Body", dissect_dl_config_request_body_value }, +- +- { 0x2001, "DL DCI PDU Release 8", dissect_dl_config_request_dl_dci_pdu_rel8_value }, +- { 0x2002, "DL DCI PDU Release 9", dissect_dl_config_request_dl_dci_pdu_rel9_value }, +- { 0x2003, "DL DCI PDU Release 10", dissect_dl_config_request_dl_dci_pdu_rel10_value }, +- { 0x2039, "DL DCI PDU Release 11", dissect_dl_config_request_dl_dci_pdu_rel11_value }, +- { 0x203A, "DL DCI PDU Release 12", dissect_dl_config_request_dl_dci_pdu_rel12_value }, +- { 0x203B, "DL DCI PDU Release 13", dissect_dl_config_request_dl_dci_pdu_rel13_value }, +- +- +- { 0x2004, "BCH PDU Release 8", dissect_dl_config_request_bch_pdu_rel8_value }, +- +- { 0x2005, "MCH PDU Release 8", dissect_dl_config_request_mch_pdu_rel8_value }, +- +- { 0x2006, "DLSCH PDU Release 8", dissect_dl_config_request_dlsch_pdu_rel8_value }, +- { 0x2007, "DLSCH PDU Release 9", dissect_dl_config_request_dlsch_pdu_rel9_value }, +- { 0x2008, "DLSCH PDU Release 10", dissect_dl_config_request_dlsch_pdu_rel10_value }, +- { 0x203C, "DLSCH PDU Release 11", dissect_dl_config_request_dlsch_pdu_rel11_value }, +- { 0x203D, "DLSCH PDU Release 12", dissect_dl_config_request_dlsch_pdu_rel12_value }, +- { 0x203E, "DLSCH PDU Release 13", dissect_dl_config_request_dlsch_pdu_rel13_value }, +- +- { 0x2009, "PCH PDU Release 8", dissect_dl_config_request_pch_pdu_rel8_value }, +- { 0x203F, "PCH PDU Release 13", dissect_dl_config_request_pch_pdu_rel13_value }, +- +- { 0x200A, "PRS PDU Release 9", dissect_dl_config_request_prs_pdu_rel9_value }, +- +- { 0x200B, "CSI-RS PDU Release 10", dissect_dl_config_request_csi_rs_pdu_rel10_value }, +- { 0x2040, "CSI-RS PDU Release 13", dissect_dl_config_request_csi_rs_pdu_rel13_value }, +- +- //{ 0x2001, "EDPCCH PDU Release 8", ?? }, +- //{ 0x2002, "EDPCCH PDU Release 8", ?? }, +- //{ 0x2003, "EDPCCH PDU Release 8", ?? }, +- //{ 0x2039, "EDPCCH PDU Release 11", ?? }, +- //{ 0x203A, "EDPCCH PDU Release 12", ?? }, +- //{ 0x203B, "EDPCCH PDU Release 13", ?? }, +- { 0x2041, "EDPCCH PDU Release 11 Parameters", dissect_dl_config_request_edpcch_params_rel11_value }, +- { 0x2042, "EDPCCH PDU Release 13 Parameters", dissect_dl_config_request_edpcch_params_rel13_value }, +- +- { 0x205B, "MPDCCH PDU Release 13", dissect_dl_config_request_mpdpcch_pdu_rel13_value }, +- +- +- { 0x200C, "UL Config Request Body", dissect_ul_config_request_body_value }, +- { 0x200D, "ULSCH PDU Release 8", dissect_ul_config_ulsch_pdu_rel8_value }, +- { 0x200E, "ULSCH PDU Release 10", dissect_ul_config_ulsch_pdu_rel10_value }, +- { 0x2043, "ULSCH PDU Release 11", dissect_ul_config_ulsch_pdu_rel11_value }, +- { 0x2044, "ULSCH PDU Release 13", dissect_ul_config_ulsch_pdu_rel13_value }, +- { 0x200F, "Initial Transmission Paramters Release 8", dissect_ul_config_init_tx_params_rel8_value }, +- { 0x2010, "CQI RI Information Release 8", dissect_ul_config_cqi_ri_info_rel8_value }, +- { 0x2011, "CQI RI Information Release 9 or later", dissect_ul_config_cqi_ri_info_rel9_later_value }, +- { 0x2045, "CQI RI Information Release 13", dissect_ul_config_cqi_ri_info_rel13_value }, +- { 0x2012, "HARQ Information (ULSCH) Release 10", dissect_ul_config_harq_info_ulsch_rel10_value }, +- { 0x2046, "HARQ Information (ULSCH) Release 13", dissect_ul_config_harq_info_ulsch_rel13_value }, +- { 0x2013, "UE Information Release 8", dissect_ul_config_ue_info_rel8_value }, +- { 0x2047, "UE Information Release 11", dissect_ul_config_ue_info_rel11_value }, +- { 0x2048, "UE Information Release 13", dissect_ul_config_ue_info_rel13_value }, +- { 0x2014, "CQI Information Release 8", dissect_ul_config_cqi_info_rel8_value }, +- { 0x2015, "CQI Information Release 10", dissect_ul_config_cqi_info_rel10_value }, +- { 0x2049, "CQI Information Release 13", dissect_ul_config_cqi_info_rel13_value }, +- { 0x2016, "SR Information Release 8", dissect_ul_config_sr_info_rel8_value }, +- { 0x2017, "SR Information Release 10", dissect_ul_config_sr_info_rel10_value }, +- { 0x2018, "HARQ Information (UCI) Release 10 TDD", dissect_ul_config_harq_info_uci_rel10_tdd_value }, +- { 0x2019, "HARQ Information (UCI) Release 8 FDD", dissect_ul_config_harq_info_uci_rel8_fdd_value }, +- { 0x201A, "HARQ Information (UCI) Release 9 or later FDD", dissect_ul_config_harq_info_uci_rel9_later_fdd_value }, +- { 0x204A, "HARQ Information (UCI) Release 11 FDD/TDD", dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value }, +- { 0x204B, "HARQ Information (UCI) Release 13 FDD/TDD", dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value }, +- { 0x201B, "SRS Information Release 8", dissect_ul_config_srs_info_rel8_value }, +- { 0x201C, "SRS Information Release 10", dissect_ul_config_srs_info_rel10_value }, +- { 0x204C, "SRS Information Release 13", dissect_ul_config_srs_info_rel13_value }, +- +- { 0x201D, "HI DCI0 Request Body", dissect_hi_dci0_request_body_value }, +- { 0x201E, "HI PDU Release 8", dissect_hi_dci0_hi_rel8_value }, +- { 0x201F, "HI PDU Release 10", dissect_hi_dci0_hi_rel10_value }, +- { 0x2020, "DCI UL PDU Release 8", dissect_hi_dci0_dci_ul_rel8_value }, +- { 0x2021, "DCI UL PDU Release 10", dissect_hi_dci0_dci_ul_rel10_value }, +- { 0x204D, "DCI UL PDU Release 12", dissect_hi_dci0_dci_ul_rel12_value }, +- //{ 0x2041, "EDPCCH DCI UL PDU Release 11", dissect_hi_dci0_edpcch_dci_ul_rel11_value }, +- { 0x204E, "MDPCCH DCI UL PDU Release 13", dissect_hi_dci0_mdpcch_dci_ul_rel13_value }, +- +- { 0x2022, "Tx Request Body", dissect_tx_request_body_value }, +- +- { 0x2038, "RX UE Information", dissect_rx_ue_info_value }, +- +- { 0x2023, "RX Indication Body", dissect_rx_indication_body_value }, +- { 0x2024, "RX PDU Release 8", dissect_rx_indication_rel8_value }, +- { 0x2025, "RX PDU Release 9", dissect_rx_indication_rel9_value }, +- +- { 0x2026, "HARQ Indication Body", dissect_harq_indication_body_value }, +- { 0x2027, "HARQ PDU Release 8 TDD", dissect_harq_indication_rel8_tdd_value }, +- { 0x2028, "HARQ PDU Release 9 or later TDD", dissect_harq_indication_rel9_later_tdd_value }, +- { 0x204F, "HARQ PDU Release 13 or later TDD", dissect_harq_indication_rel13_later_tdd_value }, +- { 0x2029, "HARQ PDU Release 8 FDD", dissect_harq_indication_rel8_fdd_value }, +- { 0x202A, "HARQ PDU Release 9 or later FDD", dissect_harq_indication_rel9_later_fdd_value }, +- { 0x2050, "HARQ PDU Release 13 or later FDD", dissect_harq_indication_rel13_later_fdd_value }, +- { 0x2052, "UL CQI Information", dissect_ul_cqi_information_value }, +- +- { 0x202B, "CRC Indication Body", dissect_crc_indication_body_value }, +- { 0x202C, "CRC PDU Release 8", dissect_crc_indication_rel8_value }, +- +- { 0x202D, "RX SR Indication Body", dissect_rx_sr_indication_body_value }, +- +- { 0x202E, "RX CQI Indication Body", dissect_rx_cqi_indication_body_value }, +- { 0x202F, "CQI PDU Release 8", dissect_rx_cqi_indication_rel8_value }, +- { 0x2030, "CQI PDU Release 9", dissect_rx_cqi_indication_rel9_value }, +- +- { 0x2031, "RACH Indication Body", dissect_rach_indication_body_value }, +- { 0x2032, "Preamable PDU Release 8", dissect_rach_indication_rel8_value }, +- { 0x2033, "Preamable PDU Release 9", dissect_rach_indication_rel9_value }, +- { 0x2051, "Preamable PDU Release 13", dissect_rach_indication_rel13_value }, +- +- { 0x2034, "SRS Indication Body", dissect_srs_indication_body_value }, +- { 0x2035, "SRS PDU Release 8", dissect_srs_indication_rel8_value }, +- { 0x2036, "SRS PDU Release 9", dissect_srs_indication_rel9_value }, +- { 0x2037, "SRS PDU Release 10 TDD", dissect_srs_indication_rel10_tdd_value }, +- { 0x2054, "TDD Channel Measurement", dissect_tdd_channel_measuerment_value }, +- { 0x2053, "SRS PDU Release 11", dissect_srs_indication_rel11_value }, +- +- +- { 0x2055, "LBT DL Config Request Body", dissect_lbt_dl_config_request_body_value }, +- { 0x2056, "LBT PDSCH Req PDU Release 13", dissect_lbt_dl_config_request_pdsch_req_rel13_value }, +- { 0x2057, "LBT DRS req PDU Release 13", dissect_lbt_dl_config_request_drs_req_rel13_value }, +- +- { 0x2058, "LBT DL Indication Message Body", dissect_lbt_indication_message_body_value }, +- { 0x2056, "LBT PDSCH Resp PDU Release 13", dissect_lbt_dl_config_request_pdsch_resp_rel13_value }, +- { 0x2057, "LBT DRS Resp PDU Release 13", dissect_lbt_dl_config_request_drs_resp_rel13_value }, +- +- { 0x3000, "LTE RSSI Request", dissect_lte_rssi_request_value }, +- { 0x3001, "UTRAN RSSI Request", dissect_utran_rssi_request_value }, +- { 0x3002, "GERAN RSSI Request", dissect_geran_rssi_request_value }, +- { 0x3003, "RSSI Indication", dissect_rssi_indication_value }, +- { 0x3004, "LTE CELL SEARCH Request", dissect_lte_cell_search_value }, +- { 0x3005, "UTRAN CELL SEARCH Request", dissect_utran_cell_search_value }, +- { 0x3006, "GERAN CELL SEARCH Request", dissect_geran_cell_search_value }, +- { 0x3007, "LTE CELL SEARCH Indication", dissect_lte_cell_search_indication_value }, +- { 0x3008, "UTRAN CELL SEARCH Indication", dissect_utran_cell_search_indication_value }, +- { 0x3009, "GERAN CELL SEARCH Indication", dissect_geran_cell_search_indication_value }, +- { 0x300a, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, +- { 0x300b, "LTE BROADCAST DETECT Request", dissect_lte_broadcast_detect_request_value }, +- { 0x300c, "UTRAN BROADCAST DETECT Request", dissect_utran_broadcast_detect_request_value }, +- { 0x300d, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, +- { 0x300e, "LTE BROADCAST DETECT Indication", dissect_lte_broadcast_detect_indication_value }, +- { 0x300f, "UTRAN BROADCAST DETECT Indication", dissect_utran_broadcast_detect_indication_value }, +- { 0x3010, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, +- { 0x3011, "LTE SYSTEM INFORMATION SCHEDULE Request", dissect_lte_system_information_schedule_request_value }, +- { 0x3012, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, +- { 0x3013, "LTE SYSTEM INFORMATION SCHEDULE Indication", dissect_lte_system_information_schedule_indication_value }, +- { 0x3014, "LTE SYSTEM INFORMATION Request", dissect_lte_system_information_request_value }, +- { 0x3015, "UTRAN SYSTEM INFORMATION Request", dissect_utran_system_information_request_value }, +- { 0x3016, "GERAN SYSTEM INFORMATION Request", dissect_geran_system_information_request_value }, +- { 0x3017, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, +- { 0x3018, "LTE SYSTEM INFORMATION Indication", dissect_lte_system_information_indication_value }, +- { 0x3019, "UTRAN SYSTEM INFORMATION Indication", dissect_utran_system_information_indication_value }, +- { 0x301a, "GERAN SYSTEM INFORMATION Indication", dissect_geran_system_information_indication_value }, +- +- +- +- +-}; +- +-int look_up_tlv(int tag_id) +-{ +- int i; +- int num_tags = sizeof(tags) / sizeof(tlv_t); +- +- for (i = 0; i < num_tags; i++) +- { +- if (tag_id == tags[i].tag_id) +- return i; +- } +- return -1; +-} +- +-static int dissect_tl_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset) +-{ +- proto_item *tl_ti = proto_tree_add_string_format(tree, hf_nfapi_tl, tvb, *offset, 4, "", "TL"); +- proto_tree *tl_tree = proto_item_add_subtree(tl_ti, ett_nfapi_tl); +- +- proto_tree_add_uint16(tl_tree, hf_nfapi_tl_tag, tvb, offset, 0); +- proto_tree_add_uint16(tl_tree, hf_nfapi_tl_length, tvb, offset, "bytes"); +- +- return 0; +- +-} +- +-static int dissect_tlv_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint len) +-{ +- while (*offset < len) +- { +- guint16 tlv_id = tvb_get_guint16(tvb, *offset, ENC_NA); +- guint16 tlv_len = tvb_get_guint16(tvb, *offset + 2, ENC_NA); +- +- int tlv_index = look_up_tlv(tlv_id); +- +- char* tlv_name = tlv_index != -1 ? tags[tlv_index].name : "Unknown"; +- +- proto_item *tlv_ti = proto_tree_add_string_format(tree, hf_nfapi_tlv_tree, tvb, *offset, tlv_len + 4, "", tlv_name); +- proto_tree *tlv_tree = proto_item_add_subtree(tlv_ti, ett_nfapi_tlv_tree); +- +- dissect_tl_header(tvb, pinfo, tlv_tree, data, offset); +- +- if (tags[tlv_index].decode != NULL) +- { +- guint tmp = *offset; +- guint end = *offset + tlv_len; +- tags[tlv_index].decode(tvb, pinfo, tlv_tree, data, &tmp, &end); +- *offset += tlv_len; +- } +- else +- { +- *offset += tlv_len; +- } +- } +- +- return 0; +-} +- +-static int dissect_rx_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end) +-{ +- guint number_of_pdu_addr = *offset; +- guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0); +- //dissect_array_value(tvb, pinfo, tree, data, offset, "RX PDU List", hf_nfapi_rx_indication_pdu_list, ett_nfapi_rx_indication_pdu_list, num_pdu, dissect_rx_pdu); +- +- guint16* lengths = malloc(count * 2); +- memset(lengths, 0, count * 2); +- +- guint16 i = 0; +- +- if (count > 0) +- { +- proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_rx_indication_pdu_list, tvb, *offset, 2, "", "RX PDU List"); +- proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_rx_indication_pdu_list); +- +- //for (i = 0; i < count; ++i) +- proto_tree *item_tree = 0; +- +- guint pdu_end = *end; +- while (*offset < *end && *offset < pdu_end) +- { +- +- guint16 tlv_id = tvb_get_guint16(tvb, *offset, ENC_NA); +- guint16 tlv_len = tvb_get_guint16(tvb, *offset + 2, ENC_NA); +- +- if (tlv_id == 0x2038) +- { +- proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_rx_indication_pdu_list, tvb, *offset, 2, "", "[%d]", i); +- item_tree = proto_item_add_subtree(item_ti, ett_nfapi_rx_indication_pdu_list); +- +- i++; +- } +- +- int tlv_index = look_up_tlv(tlv_id); +- +- char* tlv_name = tlv_index != -1 ? tags[tlv_index].name : "Unknown"; +- +- proto_item *tlv_ti = proto_tree_add_string_format(item_tree, hf_nfapi_tlv_tree, tvb, *offset, tlv_len + 4, "", tlv_name); +- proto_tree *tlv_tree = proto_item_add_subtree(tlv_ti, ett_nfapi_tlv_tree); +- +- +- +- +- dissect_tl_header(tvb, pinfo, tlv_tree, data, offset); +- +- guint tmp_offset = *offset; +- +- if (tlv_id == 0x2038) +- { +- dissect_rx_ue_info_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end); +- } +- +- else if (tlv_id == 0x2024) +- { +- //int data_offset = dissect_rx_indication_rel8_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end); +- +- lengths[i-1] = proto_tree_add_uint16(tlv_tree, hf_nfapi_length, tvb, &tmp_offset, 0); +- int data_offset = proto_tree_add_uint16(tlv_tree, hf_nfapi_data_offset, tvb, &tmp_offset, 0); +- proto_tree_add_uint8(tlv_tree, hf_nfapi_ul_cqi, tvb, &tmp_offset, 0); +- proto_tree_add_uint16(tlv_tree, hf_nfapi_timing_advance, tvb, &tmp_offset, 0); +- +- if ((data_offset > 0) && (pdu_end == *end)) +- { +- pdu_end = number_of_pdu_addr + data_offset; +- } +- +- } +- else if (tlv_id == 0x2025) +- { +- dissect_rx_indication_rel9_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end); +- } +- +- +- *offset += tlv_len; +- } +- +- } +- +- for (i = 0; i < count; ++i) +- { +- proto_tree_add_uint8_array(tree, hf_nfapi_pdu, lengths[i], tvb, offset); +- } +- +- free(lengths); +- +- // more to follow here ?? +- return 0; +- +-} +- +- +-// ----------------------------------------------------------------------------| +- +- +-static int dissect_p45_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset) +-{ +- proto_item *p4_p5_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p4_p5_message_header, tvb, *offset, NFAPI_HEADER_LENGTH, "", "P4 P5 Header"); +- proto_tree *p4_p5_header_tree = proto_item_add_subtree(p4_p5_header_ti, ett_nfapi_p4_p5_message_header); +- +- proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_phy_id, tvb, offset, 0); +- proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_message_id, tvb, offset, 0); +- proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_message_length, tvb, offset, 0); +- proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_spare, tvb, offset, 0); +- +- return 0; +-} +- +-static int dissect_p7_header_new(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint8* m, guint8* seg, guint8* seq) +-{ +- proto_item *p7_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p7_message_header, tvb, *offset, NFAPI_P7_HEADER_LENGTH, "", "P7 Header"); +- proto_tree *p7_header_tree = proto_item_add_subtree(p7_header_ti, ett_nfapi_p7_message_header); +- +- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_phy_id, tvb, offset, 0); +- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_id, tvb, offset, 0); +- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_length, tvb, offset, "bytes"); +- +- // decoding bits for p7 header +- +- guint8 m_seg = tvb_get_guint8(tvb, *offset); +- *m = (m_seg & 0x80) >> 7; +- *seg = m_seg & 0x7F; +- +- +- proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_m, tvb, (*offset) * 8, 1, ENC_NA); +- proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_segment, tvb, ((*offset) * 8) + 1, 7, ENC_NA); +- *offset += 1; +- +- *seq = tvb_get_guint8(tvb, *offset); +- proto_tree_add_uint8(p7_header_tree, hf_nfapi_p7_message_header_sequence_number, tvb, offset, 0); +- +- +- proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_checksum, tvb, offset, 0); +- proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_transmit_timestamp, tvb, offset, "microseconds"); +- +- return 0; +- +-} +- +- +- +- +-static int dissect_p7_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset) +-{ +- proto_item *p7_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p7_message_header, tvb, *offset, NFAPI_P7_HEADER_LENGTH, "", "P7 Header"); +- proto_tree *p7_header_tree = proto_item_add_subtree(p7_header_ti, ett_nfapi_p7_message_header); +- +- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_phy_id, tvb, offset, 0); +- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_id, tvb, offset, 0); +- proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_length, tvb, offset, "bytes"); +- +- +- proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_m, tvb, (*offset) * 8, 1, ENC_NA); +- proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_segment, tvb, ((*offset) * 8) + 1, 7, ENC_NA); +- *offset += 1; +- +- proto_tree_add_uint8(p7_header_tree, hf_nfapi_p7_message_header_sequence_number, tvb, offset, 0); +- +- +- proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_checksum, tvb, offset, 0); +- proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_transmit_timestamp, tvb, offset, "microseconds"); +- +- return 0; +- +-} +- +-static reassembly_table ul_p7_reassemble_table; +-static reassembly_table dl_p7_reassemble_table; +- +- +- +-static int hf_msg_fragments = -1; +-static int hf_msg_fragment = -1; +-static int hf_msg_fragment_overlap = -1; +-static int hf_msg_fragment_overlap_conflicts = -1; +-static int hf_msg_fragment_multiple_tails = -1; +-static int hf_msg_fragment_too_long_fragment = -1; +-static int hf_msg_fragment_error = -1; +-static int hf_msg_fragment_count = -1; +-static int hf_msg_reassembled_in = -1; +-static int hf_msg_reassembled_length = -1; +-static int hf_msg_reassembled_data = -1; +-static gint ett_msg_fragment = -1; +-static gint ett_msg_fragments = -1; +- +-static const fragment_items msg_frag_items = { +- /* Fragment subtrees */ +- &ett_msg_fragment, +- &ett_msg_fragments, +- /* Fragment fields */ +- &hf_msg_fragments, +- &hf_msg_fragment, +- &hf_msg_fragment_overlap, +- &hf_msg_fragment_overlap_conflicts, +- &hf_msg_fragment_multiple_tails, +- &hf_msg_fragment_too_long_fragment, +- &hf_msg_fragment_error, +- &hf_msg_fragment_count, +- /* Reassembled in field */ +- &hf_msg_reassembled_in, +- /* Reassembled length field */ +- &hf_msg_reassembled_length, +- NULL, +- /* Tag */ +- "Message fragments" +-}; +- +-static int dissect_nfapi_ul_p7(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) +-{ +- guint8 m; +- guint8 seg; +- guint8 seq; +- guint offset = 0; +- +- guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA); +- guint16 msg_len = tvb_get_guint16(tvb, 4, ENC_NA); +- +- dissect_p7_header_new(tvb, pinfo, tree, data, &offset, &m, &seg, &seq); +- +- guint8 save_fragmented = pinfo->fragmented; +- +- // not sure why I need to do this, but if I don't it does not reasses the protocol +- pinfo->fd->flags.visited = 0; +- +- if (m == 1 || (m == 0 && seg > 0)) +- { +- pinfo->fragmented = TRUE; +- +- fragment_head *fd_head = fragment_add_seq_check(&ul_p7_reassemble_table, tvb, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); +- +- guint8 reassembled = 0; +- if (fd_head) +- { +- tvbuff_t * new_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled UL P7", fd_head, &msg_frag_items, NULL, tree); +- +- if (new_tvb) +- { +- // set the tvb to the new reassembled buffer. +- tvb = new_tvb; +- reassembled = 1; +- col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); +- +- // reset the offset for the new tvb +- offset = 0; +- } +- else +- { +- // Is this a failure to reassemble the data +- return 0; +- } +- } +- else +- { +- // this is a segement skip the body +- col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); +- return 0; +- } +- } +- +- pinfo->fragmented = save_fragmented; +- +- { +- switch (msg_id) +- { +- //HARQ.indication +- case 0x85: +- { +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); +- } +- break; +- //CRC.indication +- case 0x86: +- { +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); +- } +- break; +- //RX_ULSCH.indication +- case 0x87: +- { +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); +- } +- break; +- //RACH.indication +- case 0x88: +- { +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); +- } +- break; +- //SRS.indication +- case 0x89: +- { +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); +- } +- break; +- //RX_SR.indication +- case 0x8A: +- { +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); +- } +- break; +- //RX_CQI.indication +- case 0x8B: +- { +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); +- } +- break; +- }; +- } +- +- return 0; +-} +- +-static int dissect_nfapi_dl_p7(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) +-{ +- guint8 m; +- guint8 seg; +- guint8 seq; +- guint offset = 0; +- +- guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA); +- guint16 msg_len = tvb_get_guint16(tvb, 4, ENC_NA); +- +- dissect_p7_header_new(tvb, pinfo, tree, data, &offset, &m, &seg, &seq); +- +- guint8 save_fragmented = pinfo->fragmented; +- +- // not sure why I need to do this, but if I don't it does not reasses the protocol +- pinfo->fd->flags.visited = 0; +- +- if (m == 1 || (m == 0 && seg > 0)) +- { +- pinfo->fragmented = TRUE; +- +- fragment_head *fd_head = fragment_add_seq_check(&dl_p7_reassemble_table, tvb, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); +- +- guint8 reassembled = 0; +- if (fd_head) +- { +- tvbuff_t * new_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled DL P7", fd_head, &msg_frag_items, NULL, tree); +- +- if (new_tvb) +- { +- // set the tvb to the new reassembled buffer. +- tvb = new_tvb; +- reassembled = 1; +- col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); +- +- // reset the offset for the new tvb +- offset = 0; +- } +- else +- { +- // Is this a failure to reassemble the data +- return 0; +- } +- } +- else +- { +- // this is a segement skip the body +- col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); +- return 0; +- } +- } +- +- pinfo->fragmented = save_fragmented; +- +- { +- switch (msg_id) +- { +- // DL_CONFIG.request +- case 0x80: +- { +- //dissect_p7_header(tvb, pinfo, tree, data, &offset); +- proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb)); +- break; +- } +- +- }; +- } +- +- return 0; +-} +- +- +-static int dissect_nfapi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) +-{ +- col_set_str(pinfo->cinfo, COL_PROTOCOL, "NFAPI"); +- +- guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA); +- guint16 msg_len = tvb_get_guint16(tvb, 4, ENC_NA); +- +- const gchar* message_str = val_to_str_const(msg_id, message_id_vals, "Unknown"); +- +- col_clear(pinfo->cinfo,COL_INFO); +- col_append_fstr(pinfo->cinfo, COL_INFO, " %s ", message_str); +- +- proto_item *msg_tree_ti = proto_tree_add_string_format(tree, hf_nfapi_message_tree, +- tvb, 0, msg_len, +- "", message_str); +- +- proto_tree *msg_tree = proto_item_add_subtree(msg_tree_ti, ett_nfapi_message_tree); +- +- guint offset = 0; +- +- +- switch (msg_id) +- { +- // HARQ.indication +- case 0x85: +- // CRC.indication +- case 0x86: +- // RX_ULSCH.indicatoin +- case 0x87: +- // RACH.indication +- case 0x88: +- // SRS.indication +- case 0x89: +- // RX_SR.indication +- case 0x8A: +- // RX_CQI.indication +- case 0x8B: +- { +- dissect_nfapi_ul_p7(tvb, pinfo, msg_tree, data); +- } +- break; +- +- // DL_CONFIG.request +- case 0x80: +- { +- dissect_nfapi_dl_p7(tvb, pinfo, msg_tree, data); +- //dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); +- //proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- //dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; +- } +- +- // UL_CONFIG.request +- case 0x81: +- { +- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- } +- break; +- // HI_DCI0.request +- case 0x83: +- { +- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- } +- break; +- // TX.request +- case 0x84: +- { +- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- } +- break; +- +- // LBT_DL_CONFIG.request +- case 0x8C: +- { +- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- } ++#define NFAPI_P7_HEADER_LENGTH 16 ++ ++static const unit_name_string khz_100_units_db = { " (100)khz", NULL }; ++ ++typedef enum{ ++ NFAPI_DL_CONFIG_REQUEST_MSG_ID = 0x0080, ++ NFAPI_UL_CONFIG_REQUEST_MSG_ID, ++ NFAPI_SUBFRAME_INDICATION_MSG_ID, ++ NFAPI_HI_DCI0_REQUEST_MSG_ID, ++ NFAPI_TX_REQUEST_MSG_ID, ++ NFAPI_HARQ_INDICATION_MSG_ID, ++ NFAPI_CRC_INDICATION_MSG_ID, ++ NFAPI_RX_ULSCH_INDICATION_MSG_ID, ++ NFAPI_RACH_INDICATION_MSG_ID, ++ NFAPI_SRS_INDICATION_MSG_ID, ++ NFAPI_RX_SR_INDICATION_MSG_ID, ++ NFAPI_RX_CQI_INDICATION_MSG_ID, ++ NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID, ++ NFAPI_LBT_DL_INDICATION_MSG_ID, ++ ++ NFAPI_PNF_PARAM_REQUEST_MSG_ID = 0x0100, ++ NFAPI_PNF_PARAM_RESPONSE_MSG_ID, ++ NFAPI_PNF_CONFIG_REQUEST_MSG_ID, ++ NFAPI_PNF_CONFIG_RESPONSE_MSG_ID, ++ NFAPI_PNF_START_REQUEST_MSG_ID, ++ NFAPI_PNF_START_RESPONSE_MSG_ID, ++ NFAPI_PNF_STOP_REQUEST_MSG_ID, ++ NFAPI_PNF_STOP_RESPONSE_MSG_ID, ++ NFAPI_PARAM_REQUEST_MSG_ID, ++ NFAPI_PARAM_RESPONSE_MSG_ID, ++ NFAPI_CONFIG_REQUEST_MSG_ID, ++ NFAPI_CONFIG_RESPONSE_MSG_ID, ++ NFAPI_START_REQUEST_MSG_ID, ++ NFAPI_START_RESPONSE_MSG_ID, ++ NFAPI_STOP_REQUEST_MSG_ID, ++ NFAPI_STOP_RESPONSE_MSG_ID, ++ NFAPI_MEASUREMENT_REQUEST_MSG_ID, ++ NFAPI_MEASUREMENT_RESPONSE_MSG_ID, ++ ++ NFAPI_DL_NODE_SYNC_MSG_ID = 0x0180, ++ NFAPI_UL_NODE_SYNC_MSG_ID, ++ NFAPI_TIMING_INFO_MSG_ID, ++ ++ NFAPI_RSSI_REQUEST_MSG_ID = 0x0200, ++ NFAPI_RSSI_RESPONSE_MSG_ID, ++ NFAPI_RSSI_INDICATION_MSG_ID, ++ NFAPI_CELL_SEARCH_REQUEST_MSG_ID, ++ NFAPI_CELL_SEARCH_RESPONSE_MSG_ID, ++ NFAPI_CELL_SEARCH_INDICATION_MSG_ID, ++ NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID, ++ NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID, ++ NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID, ++ NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID, ++ NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID, ++ NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID, ++ NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID, ++ NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID, ++ NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID, ++ NFAPI_NMM_STOP_REQUEST_MSG_ID, ++ NFAPI_NMM_STOP_RESPONSE_MSG_ID, ++} nfapi_message_id_e; ++ ++static const value_string nfapi_error_vals[] = { ++ { 0x0, "MSG_OK" }, ++ { 0x1, "MSG_INVALID_STATE" }, ++ { 0x2, "MSG_INVALID_CONFIG" }, ++ { 0x3, "SFN_OUT_OF_SYNC" }, ++ { 0x4, "MSG_SUBFRAME_ERR" }, ++ { 0x5, "MSG_BCH_MISSING" }, ++ { 0x6, "MSG_BCH_MISSING" }, ++ { 0x7, "MSG_HI_ERR" }, ++ { 0x8, "MSG_TX_ERR" }, ++ { 0, NULL }, ++}; ++ ++static const value_string nfapi_p4_error_vals[] = { ++ { 100, "MSG_OK" }, ++ { 101, "MSG_INVALID_STATE" }, ++ { 102, "MSG_INVALID_CONFIG" }, ++ { 103, "MSG_RAT_NOT_SUPPORTED" }, ++ { 200, "MSG_NMM_STOP_OK" }, ++ { 201, "MSG_NMM_STOP_IGNORED" }, ++ { 202, "MSG_NMM_STOP_INVALID_STATE" }, ++ { 300, "MSG_PROCEDURE_COMPLETE" }, ++ { 301, "MSG_PROCEDURE_STOPPED" }, ++ { 302, "MSG_PARTIAL_RESULTS" }, ++ { 303, "MSG_TIMEOUT" }, ++ { 0, NULL }, ++}; ++ ++static const value_string nfapi_rat_type_vals[] = { ++ { 0, "LTE" }, ++ { 1, "UTRAN" }, ++ { 2, "GERAN" }, ++ { 0, NULL }, ++}; ++ ++typedef enum{ ++ UN_ALIGNED_SYNCHRONIZATION = 0, ++ INTERNAL_PNF_FRAME_ALIGNMENT, ++ ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION ++} nfapi_sync_mode_e; ++ ++static const value_string nfapi_sync_mode_vals[] = { ++ { UN_ALIGNED_SYNCHRONIZATION, "UN-ALIGNED SYNCHRONIZATION" }, ++ { INTERNAL_PNF_FRAME_ALIGNMENT, "INTERNAL PNF FRAME ALIGNMENT" }, ++ { ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION, "ABSOLUTE TIME ALIGNED SYNCHRONIZATION" }, ++ { 0, NULL }, ++}; ++ ++typedef enum { ++ NONE = 0, ++ GPS, ++ GLONASS, ++ BEIDOU ++} location_mode_e; ++ ++static const value_string location_mode_vals[] = { ++ { NONE, "NONE" }, ++ { GPS, "GPS" }, ++ { GLONASS, "GLONASS" }, ++ { BEIDOU, "BeiDou" }, ++ { 0, NULL } ++}; ++ ++static const value_string nfapi_uplink_rs_hopping_vals[] = { ++ { 0, "RS_NO_HOPPING" }, ++ { 1, "RS_GROUP_HOPPING" }, ++ { 2, "RS_SEQUENCE_HOPPING" }, ++ { 0, NULL } ++}; ++ ++static const value_string nfapi_laa_carrier_type_vals[] = { ++ { 0, "No multi carrier support" }, ++ { 1, "Mode A1" }, ++ { 2, "Mode A12" }, ++ { 3, "Mode B1" }, ++ { 4, "Mode B2" }, ++ { 0, NULL } ++}; ++ ++static const value_string nfapi_mutli_carrier_lbt_support_vals[] = { ++ { 0, "Multi carrier Mode A1" }, ++ { 1, "Multi carrier Mode A2" }, ++ { 2, "Multi carrier Mode B1" }, ++ { 3, "Multi carrier Mode B2" }, ++ { 0, NULL } ++}; ++ ++static const value_string nfapi_lbt_dl_req_pdu_type[] = { ++ { 0, "LBT_PDSCH_REQ PDU" }, ++ { 1, "LBT_DRS_REQ PDU" }, ++ { 0, NULL } ++}; ++ ++ ++static const value_string nfapi_lbt_dl_ind_pdu_type[] = { ++ { 0, "LBT_PDSCH_RSP PDU" }, ++ { 1, "LBT_DRS_RSP PDU" }, ++ { 0, NULL } ++}; ++ ++static const value_string nfapi_phy_state_vals[] = { ++ { 0, "IDLE" }, ++ { 1, "CONFIGURED" }, ++ { 2, "RUNNING" }, ++ { 0, NULL }, ++}; ++ ++ ++/* These are definitions where data 0 & 1 represent/provide a string name*/ ++static const true_false_string nfapi_csi_report_type_strname = { ++ "Periodic", ++ "Aperiodic", ++}; ++ ++static const true_false_string nfapi_control_type_string_name = { ++ "CQI/PMI", ++ "RI", ++}; ++ ++static const true_false_string cyclic_prefix_type_strname = { ++ "CP_NORMAL", ++ "CP_EXTENDED" ++}; ++ ++static const true_false_string support_strname = { ++ "No Support", ++ "Support" ++}; ++ ++static const true_false_string partial_sf_support_strname = ++{ ++ "Start partial SF support", ++ "End partial SF support" ++}; ++ ++static const true_false_string phich_duration_strname = { ++ "PHICH_D_NORMAL", ++ "PHICH_D_EXTENDED" ++}; ++ ++static const true_false_string high_speed_flag_strname = { ++ "HS_UNRESTRICTED_SET", ++ "HS_RESTRICTED_SET" ++}; ++ ++static const true_false_string hopping_mode_strname = { ++ "HM_INTER_SF", ++ "HM_INTRA_INTER_SF" ++}; ++ ++static const true_false_string srs_simult_tx_strname = { ++ "No Simultaneous Transmission", ++ "Simultaneous Transmission" ++}; ++ ++static const true_false_string crc_flag_strname = { ++ "CRC_ERROR", ++ "CRC_CORRECT" ++}; ++ ++static const true_false_string hi_value_strname = { ++ "HI_ACK", ++ "HI_NACK" ++}; ++ ++static const true_false_string flag_tb2_strname = { ++ "HI_NOT_PRESENT", ++ "HI_PRESENT" ++}; ++ ++static const true_false_string nfapi_multi_carrier_tx_strname = { ++ "Mutual transmission (self-deferral support for current carrier)", ++ "Transmit on channel access win (no self-deferral)" ++}; ++ ++static const true_false_string nfapi_multi_carrier_freeze_strname = { ++ "Absence of other technology is not guaranteed", ++ "Absence of other technology is guaranteed" ++}; ++ ++static const true_false_string initial_partial_sf_strname = { ++ "Full SF", ++ "Partial SF" ++}; ++ ++static const true_false_string lbt_mode_strname = { ++ "Full LBT", ++ "Partial LBT" ++}; ++ ++static const true_false_string data_report_mode_vals = { ++ "Crc reported in CRC.indication", ++ "Crc reported in RX.indication" ++}; ++ ++static const true_false_string mcch_flag_string_name = { ++ "MCCH or SC-MCCH change notification field is not valid", ++ "MCCH or SC-MCCH change notification field is valid" ++}; ++ ++static const true_false_string cross_carrier_scheduling_flag_strname = { ++ "Carrier indicator field is not valid", ++ "Carrier indicator field is valid" ++}; ++ ++static const true_false_string srs_flag_strname = { ++ "SRS request field is not valid", ++ "SRS request field is valid" ++}; ++static const true_false_string srs_request_strname = { ++ "SRS not requested", ++ "SRS requested" ++}; ++ ++static const true_false_string ul_dl_configuration_flag_strname = { ++ "UL/DL configuration field is not valid", ++ "UL/DL configuration field is valid" ++}; ++ ++static const true_false_string prs_cyclic_prefix_type_strname = { ++ "normal cyclic prefix", ++ "extended cyclic prefix" ++}; ++ ++static const true_false_string prs_muting_strname = { ++ "no muting", ++ "muting" ++}; ++ ++ ++static const value_string nfapi_dl_config_pdu_type_vals[] = { ++ { 0, "DL_CONFIG_DCI_DL_PDU" }, ++ { 1, "DL_CONFIG_BCH_PDU" }, ++ { 2, "DL_CONFIG_MCH_PDU" }, ++ { 3, "DL_CONFIG_DLSCH_PDU" }, ++ { 4, "DL_CONFIG_PCH_PDU" }, ++ { 5, "DL_CONFIG_PRS_PDU" }, ++ { 6, "DL_CONFIG_CSI_RS_PDU" }, ++ { 7, "DL_CONFIG_EPDCCH_DL_PDU" }, ++ { 8, "DL_CONFIG_EPDCCH_DL_PDU" }, ++ { 0, NULL } ++}; ++ ++static const value_string nfapi_duplex_mode_vals[] = { ++ { 0, "TDD" }, ++ { 1, "FDD" }, ++ { 2, "HD-FDD" }, ++ { 0, NULL } ++}; ++ ++static const value_string modulation_vals[] = { ++ { 2, "QPSK" }, ++ { 4, "16QAM" }, ++ { 6, "64QAM" }, ++ { 8, "256QAM" }, ++ { 0, NULL } ++}; ++ ++static const value_string pch_modulation_vals[] = { ++ { 0, "QPSK" }, ++ { 0, NULL } ++}; ++ ++static const value_string ue_mode_vals[] = { ++ { 0, "non LC/CE UE" }, ++ { 1, "LC/CE UE" }, ++ { 0, NULL } ++}; ++ ++static const value_string csi_rs_class_vals[] = { ++ { 0, "not used" }, ++ { 1, "Class A" }, ++ { 1, "Class B" }, ++ { 0, NULL } ++}; ++ ++static const value_string csi_rs_cdm_type_vals[] = { ++ { 0, "cdm 2" }, ++ { 1, "cdm 4" }, ++ { 0, NULL } ++}; ++ ++static const value_string antenna_ports_vals[] = { ++ { 0, "1 antenna ports" }, ++ { 1, "2 antenna ports" }, ++ { 2, "4 antenna ports" }, ++ { 0, NULL } ++}; ++ ++static const value_string combs_vals[] = { ++ { 0, "2 TC" }, ++ { 1, "4 TC" }, ++ { 0, NULL } ++}; ++ ++static const value_string resource_allocation_type_vals[] = { ++ { 0, "type 0" }, ++ { 1, "type 1" }, ++ { 2, "type 2 1A/1B/1D" }, ++ { 3, "type 2 1C" }, ++ { 4, "type 2 6-1A" }, ++ { 5, "type UEModeB" }, ++ { 6, "NB index" }, ++ { 0, NULL } ++}; ++ ++static const value_string transmission_scheme_vals[] = { ++ { 0, "SINGLE_ANTENNA_PORT_0" }, ++ { 1, "TX_DIVERSITY" }, ++ { 2, "LARGE_DELAY_CDD" }, ++ { 3, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, ++ { 4, "MULTI_USER_MIMO" }, ++ { 5, "CLOSED_LOOP_RANK_1_PRECODING" }, ++ { 6, "SINGLE_ANTENNA_PORT_5" }, ++ { 7, "SINGLE_ANTENNA_PORT_7" }, ++ { 8, "SINGLE_ANTENNA_PORT_8" }, ++ { 9, "DUAL_LAYER_TX_PORT_7_AND_8" }, ++ { 10, "UP_TO_8_LAYER_TX" }, ++ { 11, "SINGLE_ANTENNA_PORT_11" }, ++ { 12, "SINGLE_ANTENNA_PORT_13" }, ++ { 13, "DUAL_LAYER_TX_PORT_11_13" }, ++ { 0, NULL } ++}; ++ ++static const value_string ul_transmission_scheme_vals[] = { ++ { 0, "SINGLE_ANTENNA_PORT_10" }, ++ { 1, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" }, ++ { 0, NULL }, ++}; ++ ++static const value_string dl_dci_format_vals[] = { ++ { 0, "1" }, ++ { 1, "1A" }, ++ { 2, "1B" }, ++ { 3, "1C" }, ++ { 4, "1D" }, ++ { 5, "2" }, ++ { 6, "2A" }, ++ { 7, "2B" }, ++ { 8, "2C" }, ++ { 9, "2D" }, ++ { 10, "6-1A" }, ++ { 11, "6-1B" }, ++ { 12, "6-2" }, ++ { 0, NULL } ++}; ++ ++static const value_string ul_dci_format_vals[] = { ++ { 0, "0" }, ++ { 1, "3" }, ++ { 2, "3A" }, ++ { 3, "4" }, ++ { 4, "5" }, ++ { 0, NULL } ++}; ++ ++static const value_string mpdcch_ul_dci_format_vals[] = { ++ { 1, "3" }, ++ { 2, "3A" }, ++ { 4, "6-0A" }, ++ { 5, "6-0B" }, ++ { 0, NULL } ++}; ++ ++ ++static const value_string pa_vals[] = { ++ { 0, "-6dB" }, ++ { 1, "-4.77dB" }, ++ { 2, "-3dB" }, ++ { 3, "-1.77dB" }, ++ { 4, "0dB" }, ++ { 5, "1dB" }, ++ { 6, "2dB" }, ++ { 7, "3dB" }, ++ { 0, NULL } ++}; ++ ++static const value_string transmission_mode_vals[] = { ++ { 1, "Mode 1" }, ++ { 2, "Mode 2" }, ++ { 3, "Mode 3" }, ++ { 4, "Mode 4" }, ++ { 5, "Mode 5" }, ++ { 6, "Mode 6" }, ++ { 7, "Mode 7" }, ++ { 8, "Mode 8" }, ++ { 9, "Mode 9" }, ++ { 10, "Mode 10" }, ++ { 0, NULL } ++}; ++ ++static const value_string nfapi_ul_config_pdu_type_vals[] = { ++ { 0, "ULSCH" }, ++ { 1, "ULSCH_CQI_RI" }, ++ { 2, "ULSCH_HARQ" }, ++ { 3, "ULSCH_CQI_HARQ_RI" }, ++ { 4, "UCI_CQI" }, ++ { 5, "UCI_SR" }, ++ { 6, "UCI_HARQ" }, ++ { 7, "UCI_SR_HARQ" }, ++ { 8, "UCI_CQI_HARQ" }, ++ { 9, "UCI_CQI_SR" }, ++ { 10, "UCI_CQI_SR_HARQ" }, ++ { 11, "SRS" }, ++ { 12, "HARQ_BUFFER" }, ++ { 13, "ULSCH_UCI_CSI" }, ++ { 14, "ULSCH_UCI_HARQ" }, ++ { 15, "ULSCH_CSI_UCI_HARQ" }, ++ { 0, NULL } ++}; ++ ++static const value_string nfapi_tdd_ack_nack_mode_vals[] = { ++ { 0, "Bundling" }, ++ { 1, "Multiplexing" }, ++ { 2, "Format 1b with channel selection" }, ++ { 3, "Format 3" }, ++ { 4, "Format 4" }, ++ { 5, "Format 5" }, ++ { 0, NULL } ++}; ++static const value_string nfapi_fdd_ack_nack_mode_vals[] = { ++ { 0, "Format 1a/1b" }, ++ { 1, "Channel selection" }, ++ { 2, "Format 3" }, ++ { 3, "Format 4" }, ++ { 4, "Format 5" }, ++ { 0, NULL } ++}; ++ ++static const value_string nfapi_phich_resource_vals[] = { ++ { 0, "PHICH_R_ONE_SIXTH " }, ++ { 1, "PHICH_R_HALF" }, ++ { 2, "PHICH_R_ONE" }, ++ { 3, "PHICH_R_TWO" }, ++ { 0, NULL } ++}; ++ ++static const value_string local_distributed_vals[] = { ++ { 0, "localized" }, ++ { 1, "distributed" }, ++ { 0, NULL } ++}; ++ ++static const value_string transport_block_to_codeword_swap_flag_vals[] = { ++ { 0, "no swapping" }, ++ { 1, "swapped" }, ++ { 0, NULL } ++}; ++ ++static const value_string ngap_vals[] = { ++ { 0, "Ngap1" }, ++ { 1, "Ngap2" }, ++ { 0, NULL } ++}; ++ ++static const value_string pmi_vals[] = { ++ { 0, "Use precoding indicated in TPMI field" }, ++ { 1, "Use precoding indicated in last PMI report on PUSCH" }, ++ { 2, "use precoding indicated in TPM field" }, ++ { 0, NULL } ++}; ++ ++static const value_string true_false_vals[] = { ++ { 0, "false" }, ++ { 1, "true" }, ++ { 0, NULL } ++}; ++ ++static const value_string exhustive_search_vals[] = { ++ { 0, "non-exhaustive search" }, ++ { 1, "exhaustive search" }, ++ { 0, NULL } ++}; ++ ++static const value_string not_used_enabled_vals[] = { ++ { 0, "not used" }, ++ { 1, "enabled" }, ++ { 0, NULL } ++}; ++ ++static const value_string hopping_vals[] = { ++ { 0, "no hopping" }, ++ { 1, "hopping enabled" }, ++ { 0, NULL } ++}; ++ ++ ++static const value_string mpdcch_rnti_type_vals[] = { ++ { 1, "Temporary C-RNTI" }, ++ { 2, "RA-RNTI" }, ++ { 3, "P-RNTI" }, ++ { 4, "other" }, ++ { 0, NULL } ++}; ++ ++static const value_string rnti_type_vals[] = { ++ { 1, "C-RNTI" }, ++ { 2, "RA-RNTI, P-RNTI, SI-RNTI, SC-RNTI, G-RNTI" }, ++ { 3, "SPS-CRNTI" }, ++ { 0, NULL } ++}; ++ ++static const value_string primary_cells_type_vals[] = { ++ { 1, "TDD" }, ++ { 2, "FDD" }, ++ { 3, "HD_FDD" }, ++ { 0, NULL } ++}; ++ ++static const value_string ul_rssi_supported_vals[] = { ++ { 0, "Uplink RSSI not supported" }, ++ { 1, "Uplink RSSI supported" }, ++ { 0, NULL } ++}; ++ ++static const value_string nprb_vals[] = { ++ { 0, "2" }, ++ { 1, "3" }, ++ { 0, NULL } ++}; ++ ++static const value_string nmm_modes_supported_vals[] = ++{ ++ { 0, "NONE" }, ++ { 1, "NMM_ONLY" }, ++ { 2, "NMM_IN_CONFIGURED_STATE" }, ++ { 3, "NMM_IN_RUNNING_STATE" }, ++ { 4, "NMM_IN_CONFIGURED_AND_RUNNING_STATE" }, ++ { 0, NULL } ++}; ++ ++static const value_string dlsch_re13_ue_type_vals[] = { ++ { 0, "non LC/CE UE" }, ++ { 1, "LC/CE CEModeA UE" }, ++ { 2, "LC/CE CEModeB UE" }, ++ { 0, NULL } ++}; ++ ++static const value_string dlsch_re13_pdsch_payload_type_vals[] = { ++ { 0, "PDSCH carrying SIB1-BR " }, ++ { 1, "PDSCH carrying SI message (except for SIB1-BR or PCH)" }, ++ { 2, "PDSCH carrying other" }, ++ { 0, NULL } ++}; ++ ++static const value_string csi_rs_flags_strname[] = { ++ { 0, "CSI - RS parameters are not valid" }, ++ { 1, "CSI - RS parameters are valid" }, ++ { 0, NULL} ++}; ++ ++ ++static const value_string paging_direct_indication_differtiation_flag_vals[] = { ++ { 0, "Direct Information" }, ++ { 1, "Paging" }, ++ { 0, NULL } ++}; ++ ++static const value_string ul_tx_mode_vals[] = { ++ { 0, "SISO/MIMO" }, ++ { 1, "MIMO" }, ++ { 0, NULL } ++}; ++ ++static const value_string n_srs_vals[] = { ++ { 0, "No overlap" }, ++ { 1, "Overlap" }, ++ { 0, NULL } ++}; ++ ++static const value_string n_srs_initial_vals[] = { ++ { 0, "Last OFDM symbol is not punctured" }, ++ { 1, "Last OFDM symbol is punctured." }, ++ { 0, NULL } ++}; ++ ++ ++static const value_string csi_mode_vals[] = { ++ { 0, "PUCCH format 2/2a/2b/3" }, ++ { 1, "PUCCH format 4" }, ++ { 2, "PUCCH format 5" }, ++ { 0, NULL } ++}; ++ ++static const value_string hi_dci0_pdu_type_vals[] = { ++ { 0, "HI" }, ++ { 1, "DCI UL" }, ++ { 2, "EDPCCH DCI UL" }, ++ { 3, "MDPCCH DCI UL" }, ++ { 0, NULL } ++}; ++ ++static const value_string ue_tx_antenna_selection_vals[] = { ++ { 0, "Not Configured" }, ++ { 1, "Configured and using UE port 0" }, ++ { 2, "Configured and using UE port 1" }, ++ { 0, NULL } ++}; ++ ++static const value_string size_of_cqi_csi_feild_vals[] = { ++ { 0, "1 bit" }, ++ { 1, "2 bits" }, ++ { 2, "3 bits" }, ++ { 0, NULL } ++}; ++ ++static const value_string number_of_antenna_port_vals[] = { ++ { 0, "1 antenna port" }, ++ { 1, "2 antenna ports" }, ++ { 2, "4 antenna ports" }, ++ { 0, NULL } ++}; ++ ++static const value_string ce_mode_vals[] = { ++ { 1, "CEModeA" }, ++ { 2, "CEModeB" }, ++ { 0, NULL } ++}; ++ ++ ++static const value_string csi_request_vals[] = { ++ { 0, "Aperiodic CSI not requested" }, ++ { 1, "Aperiodic CSI requested" }, ++ { 0, NULL } ++}; ++ ++static const value_string tdd_harq_mode_vals[] = { ++ { 0, "Format 1a/1b BUNDLING" }, ++ { 1, "Format 1a/1b MULTIPLEXING" }, ++ { 2, "Format 1a/1b SPECIAL BUNDLING" }, ++ { 3, "Channel Selection" }, ++ { 4, "Format 3" }, ++ { 5, "Format 4" }, ++ { 6, "Format 5" }, ++ { 0, NULL } ++}; ++ ++static const value_string fdd_harq_mode_vals[] = { ++ { 0, "Format 1a/1b" }, ++ { 1, "Channel Selection" }, ++ { 2, "Format 3" }, ++ { 3, "Format 4" }, ++ { 4, "Format 5" }, ++ { 0, NULL } ++}; ++ ++static const value_string harq_value_vals[] = { ++ { 1, "ACK" }, ++ { 2, "NACK" }, ++ { 3, "ACK or NACK" }, ++ { 4, "DTX" }, ++ { 5, "ACK or DTX" }, ++ { 6, "NACK or DTX" }, ++ { 7, "ACK or NACK or DTX" }, ++ { 0, NULL } ++}; ++ ++ ++static const value_string harq_special_value_vals[] = { ++ { 0, "0 or None" }, ++ { 1, "1 or 4 or 7 ACKs reported" }, ++ { 2, "2 or 5 or 8 ACKs reported" }, ++ { 3, "3 or 6 or 9 ACKs reported" }, ++ { 4, "DTX (UE did not transmit anything)" }, ++ { 0, NULL } ++}; ++ ++static const value_string channel_vals[] = { ++ { 0, "PUCCH" }, ++ { 1, "PUSCH" }, ++ { 0, NULL } ++}; ++ ++static const value_string rach_resource_type_vals[] = { ++ { 0, "Non LC / CE RACH" }, ++ { 1, "LC / CE RACH CE level 0" }, ++ { 2, "LC / CE RACH CE level 1" }, ++ { 3, "LC / CE RACH CE level 2" }, ++ { 4, "LC / CE RACH CE level 3" }, ++ { 0, NULL } ++}; ++ ++static const value_string up_pts_symbol_vals[] = { ++ { 0, "Symbol 0" }, ++ { 1, "Symbol 1" }, ++ { 0, NULL } ++}; ++ ++static const value_string arfcn_direction_vals[] = { ++ { 0, "DL" }, ++ { 1, "UL" }, ++ { 0, NULL } ++}; ++ ++static int proto_nfapi = -1; ++ ++/* These are for the subtrees */ ++static gint ett_nfapi_message_tree = -1; ++static gint ett_nfapi_p4_p5_message_header = -1; ++static gint ett_nfapi_p7_message_header = -1; ++static gint ett_nfapi_tlv_tree = -1; ++static gint ett_nfapi_tl = -1; ++static gint ett_nfapi_pnf_phy = -1; ++static gint ett_nfapi_pnf_phy_rel10 = -1; ++static gint ett_nfapi_pnf_phy_rel11 = -1; ++static gint ett_nfapi_pnf_phy_rel12 = -1; ++static gint ett_nfapi_pnf_phy_rel13 = -1; ++static gint ett_nfapi_pnf_phy_rf_config = -1; ++static gint ett_nfapi_rf_bands = -1; ++static gint ett_nfapi_tx_antenna_ports = -1; ++static gint ett_nfapi_harq_ack_nack_data = -1; ++static gint ett_nfapi_harq_data = -1; ++static gint ett_nfapi_cqi_pmi_size = -1; ++static gint ett_nfapi_cc = -1; ++static gint ett_nfapi_rbs = -1; ++static gint ett_nfapi_antennas = -1; ++static gint ett_nfapi_dl_config_request_pdu_list = -1; ++static gint ett_nfapi_ul_config_request_pdu_list = -1; ++static gint ett_nfapi_hi_dci0_request_pdu_list = -1; ++static gint ett_nfapi_tx_request_pdu_list = -1; ++static gint ett_nfapi_rx_indication_pdu_list = -1; ++static gint ett_nfapi_harq_indication_pdu_list = -1; ++static gint ett_nfapi_crc_indication_pdu_list = -1; ++static gint ett_nfapi_sr_indication_pdu_list = -1; ++static gint ett_nfapi_cqi_indication_pdu_list = -1; ++static gint ett_nfapi_preamble_indication_pdu_list = -1; ++static gint ett_nfapi_srs_indication_pdu_list = -1; ++static gint ett_nfapi_lbt_dl_config_pdu_list = -1; ++static gint ett_nfapi_lbt_dl_indication_pdu_list = -1; ++static gint ett_nfapi_subbands = -1; ++static gint ett_nfapi_bf_vector_antennas = -1; ++static gint ett_nfapi_bf_vectors = -1; ++static gint ett_nfapi_csi_rs_resource_configs = -1; ++static gint ett_nfapi_csi_rs_bf_vector = -1; ++static gint ett_nfapi_epdcch_prbs = -1; ++static gint ett_nfapi_precoding = -1; ++static gint ett_nfapi_earfcn_list = -1; ++static gint ett_nfapi_uarfcn_list = -1; ++static gint ett_nfapi_arfcn_list = -1; ++static gint ett_nfapi_rssi_list = -1; ++static gint ett_nfapi_pci_list = -1; ++static gint ett_nfapi_psc_list = -1; ++static gint ett_nfapi_lte_cells_found_list = -1; ++static gint ett_nfapi_utran_cells_found_list = -1; ++static gint ett_nfapi_geran_cells_found_list = -1; ++static gint ett_nfapi_si_periodicity_list = -1; ++static gint ett_nfapi_downlink_bandwidth_support = -1; ++static gint ett_nfapi_uplink_bandwidth_support = -1; ++static gint ett_nfapi_downlink_modulation_support = -1; ++static gint ett_nfapi_uplink_modulation_support = -1; ++static gint ett_nfapi_received_interference_power_mesurement_results = -1; ++static gint ett_nfapi_release_support = -1; ++static expert_field ei_invalid_range = EI_INIT; ++static expert_field ei_invalid_tlv_length = EI_INIT; ++ ++static int hf_nfapi_p4_p5_message_header_phy_id = -1; ++static int hf_nfapi_p4_p5_message_header_message_id = -1; ++static int hf_nfapi_p4_p5_message_header_message_length = -1; ++static int hf_nfapi_p4_p5_message_header_spare = -1; ++static int hf_nfapi_p7_message_header_phy_id = -1; ++static int hf_nfapi_p7_message_header_message_id = -1; ++static int hf_nfapi_p7_message_header_message_length = -1; ++static int hf_nfapi_p7_message_header_m = -1; ++static int hf_nfapi_p7_message_header_segment = -1; ++static int hf_nfapi_p7_message_header_sequence_number = -1; ++static int hf_nfapi_p7_message_header_checksum = -1; ++static int hf_nfapi_p7_message_header_transmit_timestamp = -1; ++static int hf_nfapi_tl_tag = -1; ++static int hf_nfapi_tl_length = -1; ++static int hf_nfapi_sync_mode = -1; ++static int hf_nfapi_location_mode = -1; ++static int hf_nfapi_location_coordinates = -1; ++static int hf_nfapi_location_coordinates_length = -1; ++static int hf_nfapi_dl_config_timing = -1; ++static int hf_nfapi_tx_timing = -1; ++static int hf_nfapi_ul_config_timing = -1; ++static int hf_nfapi_hi_dci0_timing = -1; ++static int hf_nfapi_maximum_number_phys = -1; ++static int hf_nfapi_maximum_total_bandwidth = -1; ++static int hf_nfapi_maximum_total_number_dl_layers = -1; ++static int hf_nfapi_maximum_total_number_ul_layers = -1; ++static int hf_nfapi_shared_bands = -1; ++static int hf_nfapi_shared_pa = -1; ++static int hf_nfapi_maximum_total_power = -1; ++static int hf_nfapi_oui = -1; ++static int hf_nfapi_pdu = -1; ++static int hf_nfapi_pnf_phy_number_phy = -1; ++static int hf_nfapi_pnf_phy_config_index = -1; ++static int hf_nfapi_number_of_rf_exclusions = -1; ++static int hf_nfapi_dl_bandwidth_support = -1; ++static int hf_nfapi_dl_bandwidth_support_6 = -1; ++static int hf_nfapi_dl_bandwidth_support_15 = -1; ++static int hf_nfapi_dl_bandwidth_support_25 = -1; ++static int hf_nfapi_dl_bandwidth_support_50 = -1; ++static int hf_nfapi_dl_bandwidth_support_75 = -1; ++static int hf_nfapi_dl_bandwidth_support_100 = -1; ++static int hf_nfapi_ul_bandwidth_support = -1; ++static int hf_nfapi_ul_bandwidth_support_6 = -1; ++static int hf_nfapi_ul_bandwidth_support_15= -1; ++static int hf_nfapi_ul_bandwidth_support_25 = -1; ++static int hf_nfapi_ul_bandwidth_support_50 = -1; ++static int hf_nfapi_ul_bandwidth_support_75 = -1; ++static int hf_nfapi_ul_bandwidth_support_100 = -1; ++static int hf_nfapi_downlink_channel_bandwidth_supported = -1; ++static int hf_nfapi_uplink_channel_bandwidth_supported = -1; ++static int hf_nfapi_number_of_dl_layers_supported = -1; ++static int hf_nfapi_number_of_ul_layers_supported = -1; ++static int hf_nfapi_maximum_3gpp_release_supported = -1; ++static int hf_nfapi_maximum_3gpp_release_supported_rel8 = -1; ++static int hf_nfapi_maximum_3gpp_release_supported_rel9 = -1; ++static int hf_nfapi_maximum_3gpp_release_supported_rel10 = -1; ++static int hf_nfapi_maximum_3gpp_release_supported_rel11 = -1; ++static int hf_nfapi_maximum_3gpp_release_supported_rel12 = -1; ++static int hf_nfapi_maximum_3gpp_release_supported_rel13 = -1; ++static int hf_nfapi_nmm_modes_supported = -1; ++static int hf_nfapi_number_of_rfs = -1; ++static int hf_nfapi_rf_config_index = -1; ++static int hf_nfapi_band = -1; ++static int hf_nfapi_maximum_transmit_power = -1; ++static int hf_nfapi_maximum_transmit_power_2 = -1; ++static int hf_nfapi_earfcn = -1; ++static int hf_nfapi_minimum_transmit_power = -1; ++static int hf_nfapi_number_of_antennas_suppported = -1; ++static int hf_nfapi_minimum_downlink_frequency = -1; ++static int hf_nfapi_maximum_downlink_frequency = -1; ++static int hf_nfapi_minimum_uplink_frequency = -1; ++static int hf_nfapi_maximum_uplink_frequency = -1; ++static int hf_nfapi_number_of_rf_bands = -1; ++static int hf_nfapi_nmm_uplink_rssi_supported = -1; ++static int hf_nfapi_phy_rf_config_info_phy_id = -1; ++static int hf_nfapi_transmission_mode7_supported = -1; ++static int hi_nfapi_transmission_mode8_supported = -1; ++static int hi_nfapi_two_antennas_ports_for_pucch = -1; ++static int hi_nfapi_transmission_mode_9_supported = -1; ++static int hi_nfapi_simultaneous_pucch_pusch = -1; ++static int hi_nfapi_four_layer_tx_with_tm3_and_tm4 = -1; ++static int hf_nfapi_epdcch_supported = -1; ++static int hi_nfapi_multi_ack_csi_reporting = -1; ++static int hi_nfapi_pucch_tx_diversity_with_channel_selection = -1; ++static int hi_nfapi_ul_comp_supported = -1; ++static int hi_nfapi_transmission_mode_5_supported = -1; ++static int hf_nfapi_csi_subframe_set = -1; ++static int hi_nfapi_enhanced_4tx_codebook = -1; ++static int hi_nfapi_drs_supported = -1; ++static int hi_nfapi_ul_64qam_supported = -1; ++static int hi_nfapi_transmission_mode_10_supported = -1; ++static int hi_nfapi_alternative_tbs_indices = -1; ++static int hf_nfapi_pucch_format_4_supported = -1; ++static int hf_nfapi_pucch_format_5_supported = -1; ++static int hf_nfapi_more_than_5_ca_supported = -1; ++static int hf_nfapi_laa_supported = -1; ++static int hf_nfapi_laa_ending_in_dwpts_supported = -1; ++static int hf_nfapi_laa_starting_in_second_slot_supported = -1; ++static int hf_nfapi_beamforming_supported = -1; ++static int hf_nfapi_csi_rs_enhancements_supported = -1; ++static int hf_nfapi_drms_enhancements_supported = -1; ++static int hf_nfapi_srs_enhancements_supported = -1; ++static int hf_nfapi_dl_rs_tx_power = -1; ++static int hf_nfapi_received_interference_power = -1; ++static int hf_nfapi_thermal_noise_power = -1; ++static int hf_nfapi_dl_rs_tx_power_measurement = -1; ++static int hf_nfapi_received_interference_power_measurement = -1; ++static int hf_nfapi_thermal_noise_power_measurement = -1; ++ ++// P5 Message Structures ++static int hf_nfapi_error_code = -1; ++static int hf_nfapi_p4_error_code = -1; ++static int hf_nfapi_rat_type = -1; ++static int hf_nfapi_num_tlv = -1; ++static int hf_nfapi_phy_state = -1; ++static int hf_nfapi_phy_antenna_capability = -1; ++static int hf_nfapi_release_capability = -1; ++static int hf_nfapi_mbsfn_capability = -1; ++static int hf_nfapi_laa_capability = -1; ++static int hf_nfapi_pd_sensing_lbt_support = -1; ++static int hf_nfapi_multi_carrier_lbt_support = -1; ++static int hf_nfapi_partial_sf_support = -1; ++ ++static int hf_nfapi_pnf_address_ipv4 = -1; ++static int hf_nfapi_pnf_address_ipv6 = -1; ++static int hf_nfapi_vnf_address_ipv4 = -1; ++static int hf_nfapi_vnf_address_ipv6 = -1; ++static int hf_nfapi_pnf_port = -1; ++static int hf_nfapi_vnf_port = -1; ++static int hf_nfapi_dl_ue_per_sf = -1; ++static int hf_nfapi_ul_ue_per_sf = -1; ++static int hf_nfapi_timing_window = -1; ++static int hf_nfapi_timing_info_mode = -1; ++static int hf_nfapi_timing_info_period = -1; ++static int hf_nfapi_duplex_mode = -1; ++static int hf_nfapi_pcfich_power_offset = -1; ++static int hf_nfapi_pb = -1; ++static int hf_nfapi_dl_cyclic_prefix_type = -1; ++static int hf_nfapi_ul_cyclic_prefix_type = -1; ++static int hf_nfapi_tx_antenna_ports = -1; ++static int hf_nfapi_rx_antenna_ports = -1; ++static int hf_nfapi_downlink_channel_bandwidth = -1; ++static int hf_nfapi_uplink_channel_bandwidth = -1; ++static int hf_nfapi_reference_signal_power = -1; ++static int hf_nfapi_phich_resource = -1; ++static int hf_nfapi_phich_duration = -1; ++static int hf_nfapi_phich_power_offset = -1; ++static int hf_nfapi_primary_synchronization_signal_epre_eprers = -1; ++static int hf_nfapi_secondary_synchronization_signal_epre_eprers = -1; ++static int hf_nfapi_physical_cell_id = -1; ++static int hf_nfapi_configuration_index = -1; ++static int hf_nfapi_root_sequence_index = -1; ++static int hf_nfapi_zero_correlation_zone_configuration = -1; ++static int hf_nfapi_high_speed_flag = -1; ++static int hf_nfapi_frequency_offset = -1; ++static int hf_nfapi_hopping_mode = -1; ++static int hf_nfapi_hopping_offset = -1; ++static int hf_nfapi_delta_pucch_shift = -1; ++static int hf_nfapi_n_cqi_rb = -1; ++static int hf_nfapi_n_an_cs = -1; ++static int hf_nfapi_n1_pucch_an = -1; ++static int hf_nfapi_bandwidth_configuration = -1; ++static int hf_nfapi_max_up_pts = -1; ++static int hf_nfapi_srs_subframe_configuration = -1; ++static int hf_nfapi_srs_acknack_srs_simultaneous_transmission = -1; ++static int hf_nfapi_uplink_rs_hopping = -1; ++static int hf_nfapi_group_assignment = -1; ++static int hf_nfapi_cyclic_shift_1_for_drms = -1; ++static int hf_nfapi_subframe_assignment = -1; ++static int hf_nfapi_special_subframe_patterns = -1; ++static int hf_nfapi_ed_threshold_for_lbt_for_pdsch = -1; ++static int hf_nfapi_ed_threshold_for_lbt_for_drs = -1; ++static int hf_nfapi_pd_threshold = -1; ++static int hf_nfapi_multi_carrier_type = -1; ++static int hf_nfapi_multi_carrier_tx = -1; ++static int hf_nfapi_multi_carrier_freeze = -1; ++static int hf_nfapi_tx_antenna_ports_for_drs = -1; ++static int hf_nfapi_transmission_power_for_drs = -1; ++static int hf_nfapi_pbch_repetitions_enabled_r13 = -1; ++static int hf_nfapi_prach_cat_m_root_sequence_index = -1; ++static int hf_nfapi_prach_cat_m_zero_correlation_zone_configuration = -1; ++static int hf_nfapi_prach_cat_m_high_speed_flag = -1; ++static int hf_nfapi_prach_ce_level_0_enable = -1; ++static int hf_nfapi_prach_ce_level_0_configuration_index = -1; ++static int hf_nfapi_prach_ce_level_0_frequency_offset = -1; ++static int hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt = -1; ++static int hf_nfapi_prach_ce_level_0_starting_subframe_periodicity = -1; ++static int hf_nfapi_prach_ce_level_0_hopping_enabled = -1; ++static int hf_nfapi_prach_ce_level_0_hopping_offset = -1; ++static int hf_nfapi_prach_ce_level_1_enable = -1; ++static int hf_nfapi_prach_ce_level_1_configuration_index = -1; ++static int hf_nfapi_prach_ce_level_1_frequency_offset = -1; ++static int hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt = -1; ++static int hf_nfapi_prach_ce_level_1_starting_subframe_periodicity = -1; ++static int hf_nfapi_prach_ce_level_1_hopping_enabled = -1; ++static int hf_nfapi_prach_ce_level_1_hopping_offset = -1; ++static int hf_nfapi_prach_ce_level_2_enable = -1; ++static int hf_nfapi_prach_ce_level_2_configuration_index = -1; ++static int hf_nfapi_prach_ce_level_2_frequency_offset = -1; ++static int hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt = -1; ++static int hf_nfapi_prach_ce_level_2_starting_subframe_periodicity = -1; ++static int hf_nfapi_prach_ce_level_2_hopping_enabled = -1; ++static int hf_nfapi_prach_ce_level_2_hopping_offset = -1; ++static int hf_nfapi_prach_ce_level_3_enable = -1; ++static int hf_nfapi_prach_ce_level_3_configuration_index = -1; ++static int hf_nfapi_prach_ce_level_3_frequency_offset = -1; ++static int hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt = -1; ++static int hf_nfapi_prach_ce_level_3_starting_subframe_periodicity = -1; ++static int hf_nfapi_prach_ce_level_3_hopping_enabled = -1; ++static int hf_nfapi_prach_ce_level_3_hopping_offset = -1; ++static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b = -1; ++static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a = -1; ++static int hf_nfapi_dl_modulation_support = -1; ++static int hf_nfapi_dl_modulation_support_qpsk = -1; ++static int hf_nfapi_dl_modulation_support_16qam = -1; ++static int hf_nfapi_dl_modulation_support_64qam = -1; ++static int hf_nfapi_dl_modulation_support_256qam = -1; ++static int hf_nfapi_ul_modulation_support = -1; ++static int hf_nfapi_ul_modulation_support_qpsk = -1; ++static int hf_nfapi_ul_modulation_support_16qam = -1; ++static int hf_nfapi_ul_modulation_support_64qam = -1; ++static int hf_nfapi_data_report_mode = -1; ++static int hf_nfapi_sfnsf = -1; ++ ++// P7 Sub Structures ++static int hf_nfapi_dl_dci_format = -1; ++static int hf_nfapi_ul_dci_format = -1; ++static int hf_nfapi_mpdcch_ul_dci_format = -1; ++static int hf_nfapi_cce_idx = -1; ++static int hf_nfapi_aggregation_level = -1; ++static int hf_nfapi_mcs_1 = -1; ++static int hf_nfapi_redundancy_version_1 = -1; ++static int hf_nfapi_new_data_indicator_1 = -1; ++static int hf_nfapi_mcs_2 = -1; ++static int hf_nfapi_redundancy_version_2 = -1; ++static int hf_nfapi_new_data_indicator_2 = -1; ++static int hf_nfapi_harq_process = -1; ++static int hf_nfapi_tpmi = -1; ++static int hf_nfapi_pmi = -1; ++static int hf_nfapi_precoding_information = -1; ++static int hf_nfapi_tpc = -1; ++static int hf_nfapi_downlink_assignment_index = -1; ++static int hf_nfapi_transport_block_size_index = -1; ++static int hf_nfapi_downlink_power_offset = -1; ++static int hf_nfapi_allocate_prach_flag = -1; ++static int hf_nfapi_preamble_index = -1; ++static int hf_nfapi_prach_mask_index = -1; ++static int hf_nfapi_rnti_type = -1; ++static int hf_nfapi_mpdcch_rnti_type = -1; ++static int hf_nfapi_mcch_flag = -1; ++static int hf_nfapi_mcch_change_notification = -1; ++static int hf_nfapi_scrambling_identity = -1; ++static int hf_nfapi_cross_carrier_scheduling_flag = -1; ++static int hf_nfapi_carrier_indicator = -1; ++static int hf_nfapi_srs_flag = -1; ++static int hf_nfapi_srs_request = -1; ++static int hf_nfapi_antenna_ports_scrambling_and_layers = -1; ++static int hf_nfapi_total_dci_length_including_padding = -1; ++static int hf_nfapi_harq_ack_resource_offset = -1; ++static int hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator = -1; ++static int hf_nfapi_primary_cell_type = -1; ++static int hf_nfapi_ul_dl_configuration_flag = -1; ++static int hf_nfapi_number_of_ul_dl_configurations = -1; ++static int hf_nfapi_ul_dl_configuration_index = -1; ++static int hf_nfapi_laa_end_partial_sf_flag = -1; ++static int hf_nfapi_laa_end_partial_sf_configuration = -1; ++static int hf_nfapi_initial_lbt_sf = -1; ++static int hf_nfapi_codebooksize_determination_r13 = -1; ++static int hf_nfapi_rel13_drms_table_flag = -1; ++static int hf_nfapi_csi_rs_resource_config = -1; ++static int hf_nfapi_csi_rs_number_of_nzp_configurations = -1; ++static int hf_nfapi_pdsch_start = -1; ++static int hf_nfapi_drms_config_flag = -1; ++static int hf_nfapi_drms_scrambling = -1; ++static int hf_nfapi_csi_config_flag = -1; ++static int hf_nfapi_csi_scrambling = -1; ++static int hf_nfapi_pdsch_re_mapping_flag = -1; ++static int hf_nfapi_pdsch_re_mapping_antenna_ports = -1; ++static int hf_nfapi_pdsch_re_mapping_freq_shift = -1; ++static int hf_nfapi_alt_cqi_table_r12 = -1; ++static int hf_nfapi_max_layers = -1; ++static int hf_nfapi_n_dl_harq = -1; ++static int hf_nfapi_dwpts_symbols = -1; ++static int hf_nfapi_ue_type = -1; ++static int hf_nfapi_pdsch_payload_type = -1; ++static int hf_nfapi_initial_transmission_sf = -1; ++static int hf_nfapi_req13_drms_table_flag = -1; ++static int hf_nfapi_prnti = -1; ++static int hf_nfapi_mcs = -1; ++static int hf_nfapi_number_of_transport_blocks = -1; ++static int hf_nfapi_ue_mode = -1; ++static int hf_prs_bandwidth = -1; ++static int hf_prs_cyclic_prefix_type = -1; ++static int hf_prs_muting = -1; ++static int hf_nfapi_csi_rs_resource_index = -1; ++static int hf_nfapi_csi_rs_class = -1; ++static int hf_nfapi_cdm_type = -1; ++static int hf_nfapi_edpcch_prb_index = -1; ++static int hf_nfapi_epdcch_resource_assignment_flag = -1; ++static int hf_nfapi_epdcch_id = -1; ++static int hf_nfapi_epdcch_start_symbol = -1; ++static int hf_nfapi_epdcch_num_prb = -1; ++static int hf_nfapi_precoding_value = -1; ++static int hf_nfapi_mpdcch_narrowband = -1; ++static int hf_nfapi_number_of_prb_pairs = -1; ++static int hf_nfapi_resource_block_assignment = -1; ++static int hf_nfapi_start_symbol = -1; ++static int hf_nfapi_ecce_index = -1; ++static int hf_nfapi_ce_mode = -1; ++static int hf_nfapi_drms_scrabmling_init = -1; ++static int hf_nfapi_pdsch_reception_levels = -1; ++static int hf_nfapi_new_data_indicator = -1; ++static int hf_nfapi_tpmi_length = -1; ++static int hf_nfapi_pmi_flag = -1; ++static int hf_nfapi_harq_resource_offset = -1; ++static int hf_nfapi_dci_subframe_repetition_number = -1; ++static int hf_nfapi_downlink_assignment_index_length = -1; ++static int hf_nfapi_starting_ce_level = -1; ++static int hf_nfapi_antenna_ports_and_scrambling_identity_flag = -1; ++static int hf_nfapi_antenna_ports_and_scrambling_identity = -1; ++static int hf_nfapi_paging_direct_indication_differentiation_flag = -1; ++static int hf_nfapi_direct_indication = -1; ++static int hf_nfapi_number_of_tx_antenna_ports = -1; ++ ++// P7 Message Structures ++static int hf_nfapi_dl_node_sync_t1 = -1; ++static int hf_nfapi_dl_node_sync_delta_sfn_sf = -1; ++static int hf_nfapi_ul_node_sync_t1 = -1; ++static int hf_nfapi_ul_node_sync_t2 = -1; ++static int hf_nfapi_ul_node_sync_t3 = -1; ++static int hf_nfapi_timing_info_last_sfn_sf = -1; ++static int hf_nfapi_timing_info_time_since_last_timing_info = -1; ++static int hf_nfapi_timing_info_dl_config_jitter = -1; ++static int hf_nfapi_timing_info_tx_request_jitter = -1; ++static int hf_nfapi_timing_info_ul_config_jitter = -1; ++static int hf_nfapi_timing_info_hi_dci0_jitter = -1; ++static int hf_nfapi_timing_info_dl_config_latest_delay = -1; ++static int hf_nfapi_timing_info_tx_request_latest_delay = -1; ++static int hf_nfapi_timing_info_ul_config_latest_delay = -1; ++static int hf_nfapi_timing_info_hi_dci0_latest_delay = -1; ++static int hf_nfapi_timing_info_dl_config_earliest_arrival = -1; ++static int hf_nfapi_timing_info_tx_request_earliest_arrival = -1; ++static int hf_nfapi_timing_info_ul_config_earliest_arrival = -1; ++static int hf_nfapi_timing_info_hi_dci0_earliest_arrival = -1; ++static int hf_nfapi_sfn_sf = -1; ++static int hf_nfapi_number_pdcch_ofdm_symbols = -1; ++static int hf_nfapi_number_dci = -1; ++static int hf_nfapi_number_pdus = -1; ++static int hf_nfapi_number_pdsch_rnti = -1; ++static int hf_nfapi_transmission_power_pcfich = -1; ++static int hf_nfapi_number_of_harqs = -1; ++static int hf_nfapi_number_of_crcs = -1; ++static int hf_nfapi_number_of_srs = -1; ++static int hf_nfapi_number_of_cqi = -1; ++static int hf_nfapi_number_of_preambles = -1; ++static int hf_nfapi_number_of_srss = -1; ++static int hf_nfapi_lbt_dl_req_pdu_type = -1; ++static int hf_nfapi_lbt_dl_ind_pdu_type = -1; ++static int hf_nfapi_dl_config_pdu_type = -1; ++static int hf_nfapi_pdu_size = -1; ++static int hf_nfapi_instance_length = -1; ++static int hf_nfapi_length; ++static int hf_nfapi_pdu_index = -1; ++static int hf_nfapi_rnti = -1; ++static int hf_nfapi_resource_allocation_type = -1; ++static int hf_nfapi_virtual_resource_block_assignment_flag = -1; ++static int hf_nfapi_resource_block_coding = -1; ++static int hf_nfapi_modulation = -1; ++static int hf_nfapi_redundancy_version = -1; ++static int hf_nfapi_transport_blocks = -1; ++static int hf_nfapi_transport_block_to_codeword_swap_flag = -1; ++static int hf_nfapi_transmission_scheme = -1; ++static int hf_nfapi_ul_transmission_scheme = -1; ++static int hf_nfapi_number_of_layers = -1; ++static int hf_nfapi_number_of_subbands = -1; ++static int hf_nfapi_codebook_index = -1; ++static int hf_nfapi_ue_category_capacity = -1; ++static int hf_nfapi_pa = -1; ++static int hf_nfapi_delta_power_offset_index = -1; ++static int hf_nfapi_ngap = -1; ++static int hf_nfapi_nprb = -1; ++static int hf_nfapi_transmission_mode = -1; ++static int hf_nfapi_num_bf_prb_per_subband = -1; ++static int hf_nfapi_num_bf_vector = -1; ++static int hf_nfapi_bf_vector_subband_index = -1; ++static int hf_nfapi_bf_vector_num_antennas = -1; ++static int hf_nfapi_bf_vector_bf_value = -1; ++static int hf_nfapi_nscid = -1; ++static int hf_nfapi_csi_rs_flag = -1; ++static int hf_nfapi_csi_rs_resource_config_r10 = -1; ++static int hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10 = -1; ++static int hf_nfapi_transmission_power = -1; ++static int hf_nfapi_mbsfn_area_id = -1; ++static int hf_nfapi_csi_rs_antenna_port_count_r10 = -1; ++static int hf_nfapi_ul_config_pdu_type = -1; ++static int hf_nfapi_rach_prach_frequency_resources = -1; ++static int hf_nfapi_srs_present = -1; ++static int hf_nfapi_handle = -1; ++static int hf_nfapi_pucch_index = -1; ++static int hf_nfapi_size = -1; ++static int hf_nfapi_resource_block_start = -1; ++static int hf_nfapi_number_of_resource_blocks = -1; ++static int hf_nfapi_cyclic_shift_2_for_drms = -1; ++static int hf_nfapi_frequency_hopping_enabled_flag = -1; ++static int hf_nfapi_frequency_hopping_bits = -1; ++static int hf_nfapi_new_data_indication = -1; ++static int hf_nfapi_harq_process_number = -1; ++static int hf_nfapi_ul_tx_mode = -1; ++static int hf_nfapi_current_tx_nb = -1; ++static int hf_nfapi_n_srs = -1; ++static int hf_nfapi_disable_sequence_hopping_flag = -1; ++static int hf_nfapi_dl_cqi_pmi_size_rank_1 = -1; ++static int hf_nfapi_dl_cqi_pmi_size_rank_greater_1 = -1; ++static int hf_nfapi_ri_size = -1; ++static int hf_nfapi_delta_offset_cqi = -1; ++static int hf_nfapi_delta_offset_ri = -1; ++static int hf_nfapi_harq_size = -1; ++static int hf_nfapi_delta_offset_harq = -1; ++static int hf_nfapi_tdd_ack_nack_mode = -1; ++static int hf_nfapi_fdd_ack_nack_mode = -1; ++static int hf_nfapi_n_srs_initial = -1; ++static int hf_nfapi_initial_number_of_resource_blocks = -1; ++static int hf_nfapi_dl_cqi_pmi_size = -1; ++static int hf_nfapi_report_type = -1; ++static int hf_nfapi_dl_cqi_ri_pmi_size = -1; ++static int hf_nfapi_control_type = -1; ++static int hf_nfapi_number_of_cc = -1; ++static int hf_nfapi_virtual_cell_id_enabled_flag = -1; ++static int hf_nfapi_npusch_identity = -1; ++static int hf_nfapi_ndrms_csh_identity = -1; ++static int hf_nfapi_total_number_of_repetitions = -1; ++static int hf_nfapi_repetition_number = -1; ++static int hf_nfapi_initial_sf_io = -1; ++static int hf_nfapi_empty_symbols_due_to_retunning = -1; ++static int hf_nfapi_dl_cqi_ri_pmi_size_2 = -1; ++static int hf_nfapi_npucch_identity = -1; ++static int hf_nfapi_harq_size_2 = -1; ++static int hf_nfapi_delta_offset_harq_2 = -1; ++static int hf_nfapi_empty_symbols = -1; ++static int hf_nfapi_csi_mode = -1; ++static int hf_nfapi_dl_cqi_pmi_size_2 = -1; ++static int hf_nfapi_statring_prb = -1; ++static int hf_nfapi_cdm_index = -1; ++static int hf_nfapi_nsrs = -1; ++static int hf_nfapi_num_ant_ports = -1; ++static int hf_nfapi_n_pucch_2_0 = -1; ++static int hf_nfapi_n_pucch_2_1 = -1; ++static int hf_nfapi_n_pucch_2_2 = -1; ++static int hf_nfapi_n_pucch_2_3 = -1; ++static int hf_nfapi_starting_prb = -1; ++static int hf_nfapi_antenna_port = -1; ++static int hf_nfapi_number_of_combs = -1; ++static int hf_nfapi_number_of_pucch_resource = -1; ++static int hf_nfapi_pucch_index_p1 = -1; ++static int hf_nfapi_n_pucch_1_0 = -1; ++static int hf_nfapi_n_pucch_1_1 = -1; ++static int hf_nfapi_n_pucch_1_2 = -1; ++static int hf_nfapi_n_pucch_1_3 = -1; ++static int hf_nfapi_srs_bandwidth = -1; ++static int hf_nfapi_frequency_domain_position = -1; ++static int hf_nfapi_srs_hopping_bandwidth = -1; ++static int hf_nfapi_transmission_comb = -1; ++static int hf_nfapi_i_srs = -1; ++static int hf_nfapi_sounding_reference_cyclic_shift = -1; ++static int hf_nfapi_pdu_length = -1; ++static int hf_nfapi_crc_flag = -1; ++static int hf_nfapi_number_of_hi_pdus = -1; ++static int hf_nfapi_number_of_dci_pdus = -1; ++static int hf_nfapi_hi_dci0_pdu_type = -1; ++static int hf_nfapi_hi_value = -1; ++static int hf_nfapi_i_phich = -1; ++static int hf_nfapi_flag_tb2 = -1; ++static int hf_nfapi_hi_value_2 = -1; ++static int hf_nfapi_ue_tx_antenna_selection = -1; ++static int hf_nfapi_cqi_csi_request = -1; ++static int hf_nfapi_ul_index = -1; ++static int hf_nfapi_dl_assignment_index = -1; ++static int hf_nfapi_tpc_bitmap = -1; ++static int hf_nfapi_new_data_indication_two = -1; ++static int hf_nfapi_size_of_cqi_csi_feild = -1; ++static int hf_nfapi_resource_allocation_flag = -1; ++static int hf_nfapi_number_of_antenna_ports = -1; ++static int hf_nfapi_n_ul_rb = -1; ++static int hf_nfapi_pscch_resource = -1; ++static int hf_nfapi_time_resource_pattern = -1; ++static int hf_nfapi_mpdcch_transmission_type = -1; ++static int hf_nfapi_drms_scrambling_init = -1; ++static int hf_nfapi_pusch_repetition_levels = -1; ++static int hf_nfapi_frequency_hopping_flag = -1; ++static int hf_nfapi_csi_request = -1; ++static int hf_nfapi_dai_presence_flag = -1; ++static int hf_nfapi_total_dci_length_include_padding = -1; ++static int hf_nfapi_data_offset = -1; ++static int hf_nfapi_ul_cqi = -1; ++static int hf_nfapi_timing_advance_r9 = -1; ++static int hf_nfapi_timing_advance = -1; ++static int hf_nfapi_harq_data_value_0 = -1; ++static int hf_nfapi_harq_data_value_0_special = -1; ++static int hf_nfapi_harq_data_value_1 = -1; ++static int hf_nfapi_harq_data_value_2 = -1; ++static int hf_nfapi_harq_data_value_3 = -1; ++static int hf_nfapi_tdd_harq_mode = -1; ++static int hf_nfapi_fdd_harq_mode = -1; ++static int hf_nfapi_number_of_ack_nack = -1; ++static int hf_nfapi_harq_tb_1 = -1; ++static int hf_nfapi_harq_tb_2 = -1; ++static int hf_nfapi_harq_tb_n = -1; ++static int hf_nfapi_channel = -1; ++static int hf_nfapi_ri = -1; ++static int hf_nfapi_number_of_cc_reported = -1; ++static int hf_nfapi_preamble = -1; ++static int hf_nfapi_rach_resource_type = -1; ++static int hf_nfapi_snr = -1; ++static int hf_nfapi_doppler_estimation = -1; ++static int hf_nfapi_rb_start = -1; ++static int hf_nfapi_up_pts_symbol = -1; ++static int hf_nfapi_number_prb_per_subband = -1; ++static int hf_nfapi_number_antennas = -1; ++static int hf_nfapi_subband_index = -1; ++static int hf_nfapi_channel_coefficient = -1; ++static int hf_nfapi_ul_rtoa = -1; ++static int hf_nfapi_mp_cca = -1; ++static int hf_nfapi_n_cca = -1; ++static int hf_nfapi_offset = -1; ++static int hf_nfapi_lte_txop_sf = -1; ++static int hf_nfapi_txop_sfn_sf_end = -1; ++static int hf_nfapi_lbt_mode = -1; ++static int hf_nfapi_sfn_sf_end = -1; ++static int hf_nfapi_result = -1; ++static int hf_nfapi_txop_symbols = -1; ++static int hf_nfapi_initial_partial_sf = -1; ++static int hf_nfapi_frequency_band_indicator = -1; ++static int hf_nfapi_measurement_period = -1; ++static int hf_nfapi_bandwidth = -1; ++static int hf_nfapi_timeout = -1; ++static int hf_nfapi_number_of_earfcns = -1; ++static int hf_nfapi_uarfcn = -1; ++static int hf_nfapi_number_of_uarfcns = -1; ++static int hf_nfapi_arfcn = -1; ++static int hf_nfapi_arfcn_direction = -1; ++static int hf_nfapi_number_of_arfcns = -1; ++static int hf_nfapi_rssi = -1; ++static int hf_nfapi_number_of_rssi = -1; ++static int hf_nfapi_pci = -1; ++static int hf_nfapi_measurement_bandwidth = -1; ++static int hf_nfapi_exhaustive_search = -1; ++static int hf_nfapi_number_of_pci = -1; ++static int hf_nfapi_psc = -1; ++static int hf_nfapi_number_of_psc = -1; ++static int hf_nfapi_rsrp = -1; ++static int hf_nfapi_rsrq = -1; ++static int hf_nfapi_number_of_lte_cells_found = -1; ++static int hf_nfapi_rscp = -1; ++static int hf_nfapi_enco = -1; ++static int hf_nfapi_number_of_utran_cells_found = -1; ++static int hf_nfapi_bsic = -1; ++static int hf_nfapi_rxlev = -1; ++static int hf_nfapi_rxqual = -1; ++static int hf_nfapi_sfn_offset = -1; ++static int hf_nfapi_number_of_geran_cells_found = -1; ++static int hf_nfapi_number_of_tx_antenna = -1; ++static int hf_nfapi_mib_length = -1; ++static int hf_nfapi_mib = -1; ++static int hf_nfapi_phich_configuration = -1; ++static int hf_nfapi_retry_count = -1; ++static int hf_nfapi_sib1 = -1; ++static int hf_nfapi_si_periodicity = -1; ++static int hf_nfapi_si_index = -1; ++static int hf_nfapi_number_of_si_periodicity = -1; ++static int hf_nfapi_si_window_length = -1; ++static int hf_nfapi_sib_type = -1; ++static int hf_nfapi_sib_len = -1; ++static int hf_nfapi_sib = -1; ++static int hf_nfapi_si_len = -1; ++static int hf_nfapi_si = -1; ++static int hf_nfapi_pnf_search_state = -1; ++static int hf_nfapi_pnf_broadcast_state = -1; ++ ++static const value_string message_id_vals[] = ++{ ++ { NFAPI_DL_CONFIG_REQUEST_MSG_ID, "DL_CONFIG.request" }, ++ { NFAPI_UL_CONFIG_REQUEST_MSG_ID, "UL_CONFIG.request" }, ++ { NFAPI_SUBFRAME_INDICATION_MSG_ID, "SUBFRAME_INDICATION" }, ++ { NFAPI_HI_DCI0_REQUEST_MSG_ID, "HI_DCI0.request" }, ++ { NFAPI_TX_REQUEST_MSG_ID, "TX.request" }, ++ { NFAPI_HARQ_INDICATION_MSG_ID, "HARQ.indication" }, ++ { NFAPI_CRC_INDICATION_MSG_ID, "CRC.indication" }, ++ { NFAPI_RX_ULSCH_INDICATION_MSG_ID, "RX_ULSCH.indication" }, ++ { NFAPI_RACH_INDICATION_MSG_ID, "RACH.indication" }, ++ { NFAPI_SRS_INDICATION_MSG_ID, "SRS.indication" }, ++ { NFAPI_RX_SR_INDICATION_MSG_ID, "RX_SR.indication" }, ++ { NFAPI_RX_CQI_INDICATION_MSG_ID, "RX_CQI.indication" }, ++ { NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID, "LBT_DL_CONFIG.request" }, ++ { NFAPI_LBT_DL_INDICATION_MSG_ID, "LBT_DL.indication" }, ++ ++ { NFAPI_PNF_PARAM_REQUEST_MSG_ID, "PNF_PARAM.request" }, ++ { NFAPI_PNF_PARAM_RESPONSE_MSG_ID, "PNF_PARAM.response" }, ++ { NFAPI_PNF_CONFIG_REQUEST_MSG_ID, "PNF_CONFIG.request" }, ++ { NFAPI_PNF_CONFIG_RESPONSE_MSG_ID, "PNF_CONFIG.response" }, ++ { NFAPI_PNF_START_REQUEST_MSG_ID, "PNF_START.request" }, ++ { NFAPI_PNF_START_RESPONSE_MSG_ID, "PNF_START.response" }, ++ { NFAPI_PNF_STOP_REQUEST_MSG_ID, "PNF_STOP.request" }, ++ { NFAPI_PNF_STOP_RESPONSE_MSG_ID, "PNF_STOP.response" }, ++ { NFAPI_PARAM_REQUEST_MSG_ID, "PARAM.request" }, ++ { NFAPI_PARAM_RESPONSE_MSG_ID, "PARAM.response" }, ++ { NFAPI_CONFIG_REQUEST_MSG_ID, "CONFIG.request" }, ++ { NFAPI_CONFIG_RESPONSE_MSG_ID, "CONFIG.response" }, ++ { NFAPI_START_REQUEST_MSG_ID, "START.request" }, ++ { NFAPI_START_RESPONSE_MSG_ID, "START.response" }, ++ { NFAPI_STOP_REQUEST_MSG_ID, "STOP.request" }, ++ { NFAPI_STOP_RESPONSE_MSG_ID, "STOP.response" }, ++ { NFAPI_MEASUREMENT_REQUEST_MSG_ID, "MEASUREMENT.request" }, ++ { NFAPI_MEASUREMENT_RESPONSE_MSG_ID, "MEASUREMENT.response" }, ++ ++ { NFAPI_DL_NODE_SYNC_MSG_ID, "UL_NODE_SYNC" }, ++ { NFAPI_UL_NODE_SYNC_MSG_ID, "DL_NODE_SYNC" }, ++ { NFAPI_TIMING_INFO_MSG_ID, "TIMING_INFO" }, ++ ++ { NFAPI_RSSI_REQUEST_MSG_ID, "RSSI.request" }, ++ { NFAPI_RSSI_RESPONSE_MSG_ID, "RSSI.response" }, ++ { NFAPI_RSSI_INDICATION_MSG_ID, "RSSI.indication" }, ++ { NFAPI_CELL_SEARCH_REQUEST_MSG_ID, "CELL_SEARCH.request" }, ++ { NFAPI_CELL_SEARCH_RESPONSE_MSG_ID, "CELL_SEARCH.response" }, ++ { NFAPI_CELL_SEARCH_INDICATION_MSG_ID, "CELL_SEARCH.indication" }, ++ { NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID, "BROADCAST_DETECT.request" }, ++ { NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID, "BROADCAST_DETECT.response" }, ++ { NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID, "BROADCAST_DETECT.indication" }, ++ { NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.request" }, ++ { NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.response" }, ++ { NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.indication" }, ++ { NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID, "SYSTEM_INFORMATION.request" }, ++ { NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID, "SYSTEM_INFORMATION.response" }, ++ { NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID, "SYSTEM_INFORMATION.indication" }, ++ { NFAPI_NMM_STOP_REQUEST_MSG_ID, "NMM_STOP.request" }, ++ { NFAPI_NMM_STOP_RESPONSE_MSG_ID, "NMM_STOP.response" }, ++ ++ { 0, NULL }, ++}; ++ ++typedef void(*tlv_decode)(ptvcursor_t * ptvc, packet_info* pinfo); ++ ++typedef struct ++{ ++ guint16 tag_id; ++ char* name; ++ tlv_decode decode; ++} tlv_t; ++ ++static void dissect_tlv_list(ptvcursor_t * ptvc, packet_info* pinfo, gint len); ++ ++static void dissect_array_value(ptvcursor_t * ptvc, packet_info* pinfo, const char* name, guint32 ett_idx, guint32 count, tlv_decode decode) ++{ ++ guint16 i = 0; ++ ++ if (count > 0) ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_idx, "%s", name); ++ ++ for (i = 0; i < count; ++i) ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_idx, "[%d]", i); ++ decode(ptvc, pinfo); ++ ptvcursor_pop_subtree(ptvc); ++ } ++ ++ ptvcursor_pop_subtree(ptvc); ++ } ++} ++ ++static void dissect_pnf_param_general_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // nFAPI Sync Mode ++ guint8 nfapi_sync_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_sync_mode, 1, ENC_BIG_ENDIAN); ++ if (nfapi_sync_mode_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nfapi sync mode value [0..2]"); ++ } ++ ++ // Location Mode ++ guint8 location_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_location_mode, 1, ENC_BIG_ENDIAN); ++ if (location_mode_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid location mode value [0..3]"); ++ } ++ ++ guint16 len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_location_coordinates_length, 2, ENC_BIG_ENDIAN); ++ if (len > 0) ++ ptvcursor_add(ptvc, hf_nfapi_location_coordinates, len, ENC_NA); ++ ptvcursor_add(ptvc, hf_nfapi_dl_config_timing, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_tx_timing, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_ul_config_timing, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_hi_dci0_timing, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_maximum_number_phys, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_maximum_total_bandwidth, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_maximum_total_number_dl_layers, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_maximum_total_number_ul_layers, 1, ENC_BIG_ENDIAN); ++ ++ // Shared Bands ++ guint8 shared_bands_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_shared_bands, 1, ENC_BIG_ENDIAN); ++ if (shared_bands_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid shared bands value [0..1]"); ++ } ++ ++ // Shared PA ++ guint8 shared_pa_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_shared_pa, 1, ENC_BIG_ENDIAN); ++ if (shared_pa_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid shared pa value [0..1]"); ++ } ++ ++ ptvcursor_add(ptvc, hf_nfapi_maximum_total_power, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_oui, 3, ENC_HOST_ENDIAN); ++} ++static void dissect_pnf_rf_config_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_pnf_phy_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); ++ ++ guint16 num_rf_configs = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_rfs, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "RF Config List", ett_nfapi_pnf_phy, num_rf_configs, dissect_pnf_rf_config_instance_value); ++ ++ guint16 num_rf_exclusions = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_rf_exclusions, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "RF Exclustion List", ett_nfapi_pnf_phy, num_rf_exclusions, dissect_pnf_rf_config_instance_value); ++ ++ // Downlink Channel Bandwidth Supported ++ guint16 downlink_channel_bandwidth_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add_no_advance(ptvc, hf_nfapi_downlink_channel_bandwidth_supported, 2, ENC_BIG_ENDIAN); ++ if (downlink_channel_bandwidth_supported_value > 0x3F) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink channel bandwidht supported bits [0..0x3F]"); ++ } ++ ++ proto_tree* dl_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_bandwidth_support); ++ ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); ++ ++ ptvcursor_advance(ptvc, 2); ++ ++ ++ ++ // Uplink Channel Bandwidth Supported ++ guint16 uplink_channel_bandwidth_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add_no_advance(ptvc, hf_nfapi_uplink_channel_bandwidth_supported, 2, ENC_BIG_ENDIAN); ++ if (uplink_channel_bandwidth_supported_value > 0x3F) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink channel bandwidht supported bits [0..0x3F]"); ++ } ++ ++ proto_tree* ul_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_bandwidth_support); ++ ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); ++ ++ ptvcursor_advance(ptvc, 2); ++ ++ // Number of DL layers supported ++ guint8 number_of_dl_layer_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_dl_layers_supported, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_dl_layer_supported_value == 1 || number_of_dl_layer_supported_value == 2 || ++ number_of_dl_layer_supported_value == 4 || number_of_dl_layer_supported_value == 8)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of dl layers supported value [1, 2, 4, 8]"); ++ } ++ ++ // Number of DL layers supported ++ guint8 number_of_ul_layer_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ul_layers_supported, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_ul_layer_supported_value == 1 || number_of_ul_layer_supported_value == 2 || ++ number_of_ul_layer_supported_value == 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ul layers supported value [1, 2, 4]"); ++ } ++ ++ // Maximum 3GPP Release Supported ++ guint16 maximum_3gpp_release_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add_no_advance(ptvc, hf_nfapi_maximum_3gpp_release_supported, 2, ENC_BIG_ENDIAN); ++ if (maximum_3gpp_release_supported_value > 0x3F) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid maximum 3GPP release supported value [0..0x3F]"); ++ } ++ ++ proto_tree* release_support_tree = proto_item_add_subtree(item, ett_nfapi_release_support); ++ ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel8, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel9, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel10, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel11, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel12, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel13, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); ++ ++ ptvcursor_advance(ptvc, 2); ++ ++ ++ // NMM Modes Supported ++ guint8 nmm_modes_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_nmm_modes_supported, 1, ENC_BIG_ENDIAN); ++ if (nmm_modes_supported_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nmm modes supported value [0..3]"); ++ } ++} ++ ++static void dissect_pnf_phy_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "PHY List", ett_nfapi_pnf_phy, num_phy, dissect_pnf_phy_instance_value); ++} ++ ++static void dissect_pnf_rf_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_band, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_maximum_transmit_power, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_minimum_transmit_power, 2, ENC_BIG_ENDIAN); ++ ++ guint8 number_of_antennas_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_antennas_suppported, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_antennas_supported_value == 1 || number_of_antennas_supported_value == 2 || ++ number_of_antennas_supported_value == 4 || number_of_antennas_supported_value == 8)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of supported antennas [1, 2, 4, 8]"); ++ } ++ ++ ptvcursor_add(ptvc, hf_nfapi_minimum_downlink_frequency, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_maximum_downlink_frequency, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_minimum_uplink_frequency, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_maximum_uplink_frequency, 4, ENC_BIG_ENDIAN); ++} ++ ++ ++static void dissect_pnf_rf_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 num_rf = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_rfs, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "RF List", ett_nfapi_pnf_phy_rf_config, num_rf, dissect_pnf_rf_config_value); ++} ++ ++static void dissect_pnf_phy_rel10_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // PHY Config Index ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); ++ ++ // Transmission mode 7 supported ++ guint16 transmission_mode7_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_mode7_supported, 2, ENC_BIG_ENDIAN); ++ if (transmission_mode7_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 7 supported value [0..1]"); ++ } ++ ++ // Two antennas ports for PUCCH ++ guint16 transmission_mode8_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode8_supported, 2, ENC_BIG_ENDIAN); ++ if (transmission_mode8_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 8 supported value [0..1]"); ++ } ++ ++ // Transmission mode 8 supported ++ guint16 two_antennas_port_for_pucch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_two_antennas_ports_for_pucch, 2, ENC_BIG_ENDIAN); ++ if (two_antennas_port_for_pucch_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid two antennas ports for pucch value [0..1]"); ++ } ++ ++ // Transmission mode 9 supported ++ guint16 transmission_mode9_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_9_supported, 2, ENC_BIG_ENDIAN); ++ if (transmission_mode9_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 9 supported value [0..1]"); ++ } ++ ++ // Simultaneous PUCCH PUSCH ++ guint16 simultaenous_pucch_pusch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_simultaneous_pucch_pusch, 2, ENC_BIG_ENDIAN); ++ if (simultaenous_pucch_pusch_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid simultaneous pucch pusch supported value [0..1]"); ++ } ++ ++ // Four layer Tx with TM3 and TM4 ++ guint16 four_layer_tx_with_tm3_and_tm4_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_four_layer_tx_with_tm3_and_tm4, 2, ENC_BIG_ENDIAN); ++ if (four_layer_tx_with_tm3_and_tm4_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid four layer tx with tm3 and tm4 value [0..1]"); ++ } ++} ++ ++static void dissect_pnf_phy_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "PHY Rel 10 List", ett_nfapi_pnf_phy_rel10, num_phy, dissect_pnf_phy_rel10_instance_value); ++} ++ ++static void dissect_pnf_phy_rel11_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // PHY Config Index ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); ++ ++ // ePDCCH supported ++ guint16 epdcch_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_epdcch_supported, 2, ENC_BIG_ENDIAN); ++ if (epdcch_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid edpcch supported value [0..1]"); ++ } ++ ++ // Multi ACK CSI reporting ++ guint16 multi_ack_csi_reporting_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_multi_ack_csi_reporting, 2, ENC_BIG_ENDIAN); ++ if (multi_ack_csi_reporting_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi ack csi reporting value [0..1]"); ++ } ++ ++ // PUCCH Tx diversity with channel selection ++ guint16 pucch_tx_diversity_with_channel_selection_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_pucch_tx_diversity_with_channel_selection, 2, ENC_BIG_ENDIAN); ++ if (pucch_tx_diversity_with_channel_selection_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch tx diversity with channel selection value [0..1]"); ++ } ++ ++ // UL CoMP supported ++ guint16 ul_comp_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_ul_comp_supported, 2, ENC_BIG_ENDIAN); ++ if (ul_comp_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul comp supported value [0..1]"); ++ } ++ ++ // Transmission mode 5 supported ++ guint16 transmission_mode_5_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_5_supported, 2, ENC_BIG_ENDIAN); ++ if (transmission_mode_5_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 5 supported value [0..1]"); ++ } ++} ++ ++static void dissect_pnf_phy_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "PHY Rel 11 List", ett_nfapi_pnf_phy_rel11, num_phy, dissect_pnf_phy_rel11_instance_value); ++} ++ ++static void dissect_pnf_phy_rel12_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // PHY Config Index ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); ++ ++ // CSI subframe set ++ guint16 csi_subframe_set_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_csi_subframe_set, 2, ENC_BIG_ENDIAN); ++ if (csi_subframe_set_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi subframe set value [0..1]"); ++ } ++ ++ // Enhanced 4TX codebook ++ guint16 enhanced_4tx_codebook_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_enhanced_4tx_codebook, 2, ENC_BIG_ENDIAN); ++ if (enhanced_4tx_codebook_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid enhanced 4TX codebook value [0..1]"); ++ } ++ ++ // DRS supported ++ guint16 drs_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_drs_supported, 2, ENC_BIG_ENDIAN); ++ if (drs_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drs supported value [0..1]"); ++ } ++ ++ // UL 64QAM supported ++ guint16 ul_64qam_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_ul_64qam_supported, 2, ENC_BIG_ENDIAN); ++ if (ul_64qam_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul 64 QAM supported value [0..1]"); ++ } ++ ++ // Transmission mode 10 supported ++ guint16 transmission_mode_10_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_10_supported, 2, ENC_BIG_ENDIAN); ++ if (transmission_mode_10_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 10 supported value [0..1]"); ++ } ++ ++ // Alternative TBS indices ++ guint16 alternative_tbs_indices_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hi_nfapi_alternative_tbs_indices, 2, ENC_BIG_ENDIAN); ++ if (alternative_tbs_indices_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid alternative tbs indicies supported value [0..1]"); ++ } ++} ++ ++static void dissect_pnf_phy_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "PHY Rel 12 List", ett_nfapi_pnf_phy_rel12, num_phy, dissect_pnf_phy_rel12_instance_value); ++} ++ ++static void dissect_pnf_phy_rel13_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // PHY Config Index ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); ++ ++ // PUCCH format 4 supported ++ guint16 pucch_format_4_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pucch_format_4_supported, 2, ENC_BIG_ENDIAN); ++ if (pucch_format_4_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch format 4 supported value [0..1]"); ++ } ++ ++ // PUCCH format 5 supported ++ guint16 pucch_format_5_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pucch_format_5_supported, 2, ENC_BIG_ENDIAN); ++ if (pucch_format_5_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch format 5 supported value [0..1]"); ++ } ++ ++ // More than 5 CA support ++ guint16 more_than_5_ca_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_more_than_5_ca_supported, 2, ENC_BIG_ENDIAN); ++ if (more_than_5_ca_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid more than 5 ca supported value [0..1]"); ++ } ++ ++ // LAA supported ++ guint16 laa_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_laa_supported, 2, ENC_BIG_ENDIAN); ++ if (laa_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa supported value [0..1]"); ++ } ++ ++ // LAA ending in DwPTS supported ++ guint16 laa_ending_in_dwpts_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_laa_ending_in_dwpts_supported, 2, ENC_BIG_ENDIAN); ++ if (laa_ending_in_dwpts_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa ending in dwpts supported value [0..1]"); ++ } ++ ++ // LAA starting in second slot Supported ++ guint16 laa_starting_in_second_slot_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_laa_starting_in_second_slot_supported, 2, ENC_BIG_ENDIAN); ++ if (laa_starting_in_second_slot_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa starting in second slot supported value [0..1]"); ++ } ++ ++ // Beamforming Supported ++ guint16 beamingforming_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_beamforming_supported, 2, ENC_BIG_ENDIAN); ++ if (beamingforming_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid beamforming supported value [0..1]"); ++ } ++ ++ // CSI-RS enhancements supported ++ guint16 csi_rs_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_enhancements_supported, 2, ENC_BIG_ENDIAN); ++ if (csi_rs_enhancements_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi rs enhancements supported value [0..1]"); ++ } ++ ++ // DMRS enhancements supported ++ guint16 drms_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_drms_enhancements_supported, 2, ENC_BIG_ENDIAN); ++ if (drms_enhancements_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms enhancements supported value [0..1]"); ++ } ++ ++ // SRS enhancements supported ++ guint16 srs_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_srs_enhancements_supported, 2, ENC_BIG_ENDIAN); ++ if (srs_enhancements_supported_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs enhancements supported value [0..1]"); ++ } ++ ++} ++ ++static void dissect_pnf_phy_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "PHY Rel 13 List", ett_nfapi_pnf_phy_rel13, num_phy, dissect_pnf_phy_rel13_instance_value); ++} ++ ++static void dissect_pnf_phy_rf_config_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_phy_rf_config_info_phy_id, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_pnf_phy_rf_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 num_configs = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "PHY RF Config List", ett_nfapi_pnf_phy_rf_config, num_configs, dissect_pnf_phy_rf_config_instance_value); ++} ++ ++static void dissect_dl_rs_tx_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_rs_tx_power, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value >= 1 && value <= 255)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value [1..255]"); ++ } ++} ++static void dissect_received_interference_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_received_interference_power, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value >= 1 && value <= 255)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value [1..255]"); ++ } ++} ++static void dissect_thermal_noise_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_thermal_noise_power, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_dl_rs_tx_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_dl_rs_tx_power_measurement, 2, ENC_BIG_ENDIAN); ++} ++ ++static void dissect_received_interference_power_result_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_received_interference_power_measurement, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_received_interference_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 num_resource_block = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "Results", ett_nfapi_received_interference_power_mesurement_results, num_resource_block, dissect_received_interference_power_result_value); ++} ++static void dissect_thermal_noise_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_thermal_noise_power_measurement, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_duplex_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_duplex_mode, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid duplex mode [0..2]"); ++ } ++} ++static void dissect_pcfich_power_offset_value(ptvcursor_t* ptvc, packet_info *pinfo) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pcfich_power_offset, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid power level [0..10000]"); ++ } ++} ++static void dissect_pb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pb, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink power allocation index [0..3]"); ++ } ++} ++ ++static void dissect_dl_cyclic_prefix_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_cyclic_prefix_type, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl cyclic prefix type [0..1]"); ++ } ++} ++static void dissect_ul_cyclic_prefix_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_cyclic_prefix_type, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul cyclic prefix type [0..1]"); ++ } ++} ++static void dissect_dl_channel_bandwidth_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_downlink_channel_bandwidth, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 6 || value == 15 || value == 25 || value == 50 || value == 75 || value == 100)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink bandwidth value [6, 15, 25, 50, 75, 100]"); ++ } ++} ++static void dissect_ul_channel_bandwidth_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_uplink_channel_bandwidth, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 6 || value == 15 || value == 25 || value == 50 || value == 75 || value == 100)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink bandwidth value [6, 15, 25, 50, 75, 100]"); ++ } ++} ++static void dissect_reference_signal_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_reference_signal_power, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid reference signal power [0..255]"); ++ } ++ ++} ++static void dissect_tx_antenna_ports_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tx_antenna_ports, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tx antenna ports value [1, 2, 4, 8, 16]"); ++ } ++} ++static void dissect_rx_antenna_ports_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rx_antenna_ports, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rx antenna ports value [1, 2, 4, 8, 16]"); ++ } ++} ++static void dissect_phich_resource_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_resource, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich resource value [0..3]"); ++ } ++} ++static void dissect_phich_duration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_duration, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich duration value [0..1]"); ++ } ++} ++static void dissect_phich_power_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_power_offset, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich power offset value [0..10000]"); ++ } ++} ++static void dissect_psch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_primary_synchronization_signal_epre_eprers, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid primary synchronization signal epre/eprers value [0..10000]"); ++ } ++} ++static void dissect_physical_cell_id_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_physical_cell_id, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 503) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid physical cell id [0..503]"); ++ } ++} ++static void dissect_ssch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_secondary_synchronization_signal_epre_eprers, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid secondary synchronization signal epre/eprers value [0..10000]"); ++ } ++} ++static void dissect_prach_configuration_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_configuration_index, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 63) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach configuration index [0..63]"); ++ } ++} ++static void dissect_prach_root_sequence_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_root_sequence_index, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 837) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach root sequency index [0..837]"); ++ } ++} ++static void dissect_prach_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_zero_correlation_zone_configuration, 2, ENC_BIG_ENDIAN); ++ ++ // How do differentiate between fdd 0..6 and tdd 0..15 ranges? ++ if (value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid zero correlation zone configuration [0..15]"); ++ } ++} ++static void dissect_prach_high_speed_flag_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_high_speed_flag, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid high speed flag value [0..1]"); ++ } ++} ++static void dissect_prach_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); ++ ++ // How to determine the ul channel bandiwdth? ++ if (value > (100 -6)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach frequency offset value [0..94]"); ++ } ++} ++static void dissect_pusch_hopping_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hopping_mode, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch hopping mode value [0..1]"); ++ } ++} ++static void dissect_pusch_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hopping_offset, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 98) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch hopping offset value [0..98]"); ++ } ++} ++static void dissect_pusch_number_of_subbands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value >= 1 && value <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of sub-bands [1..4]"); ++ } ++} ++static void dissect_pucch_delta_pucch_shift_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_delta_pucch_shift, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value >= 1 && value <= 3)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta pucch shift [1..3]"); ++ } ++} ++static void dissect_pucch_n_cqi_rb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n_cqi_rb, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 98) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n cqi rb value [0..98]"); ++ } ++} ++static void dissect_pucch_n_an_cs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n_an_cs, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n an cs value [0..7]"); ++ } ++} ++static void dissect_pucch_n1_pucch_an_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n1_pucch_an, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n1pucch an value [0..2047]"); ++ } ++} ++static void dissect_srs_bandwidth_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth_configuration, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs bandwidth configuration value [0..7]"); ++ } ++} ++static void dissect_srs_max_uppts_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_max_up_pts, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid max up pts value [0..1]"); ++ } ++} ++static void dissect_srs_subframe_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_srs_subframe_configuration, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs subframe configuration value [0..15]"); ++ } ++} ++static void dissect_srs_acknack_srs_sim_tx_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_srs_acknack_srs_simultaneous_transmission, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs ack nack srs simultaneous transmission value [0..1]"); ++ } ++} ++static void dissect_uplink_rs_hopping_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_uplink_rs_hopping, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink rs hopping value [0..2]"); ++ } ++} ++static void dissect_group_assignment_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_group_assignment, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 29) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid group assignment value [0..29]"); ++ } ++} ++static void dissect_cyclic_shift_1_for_drms_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_1_for_drms, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 1 for drms value [0..7]"); ++ } ++} ++static void dissect_tdd_subframe_assignement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_subframe_assignment, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 6) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tdd subframe assignment value [0..6]"); ++ } ++} ++static void dissect_tdd_subframe_patterns_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_special_subframe_patterns, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 9) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid special subframe pattern value [0..9]"); ++ } ++} ++static void dissect_laa_ed_threashold_for_lbt_for_pdsch_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ed_threshold_for_lbt_for_pdsch, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 70) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ed threshold for ltb for pdsch value [0..70]"); ++ } ++} ++static void dissect_laa_ed_threashold_for_lbt_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ed_threshold_for_lbt_for_drs, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 70) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ed threshold for ltb for drs value [0..70]"); ++ } ++} ++static void dissect_laa_pd_threshold_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pd_threshold, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 70 && value != 65535) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pd threshold value [0..70, 65536]"); ++ } ++} ++static void dissect_laa_multi_carrier_type_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_type, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier type [0..4]"); ++ } ++} ++static void dissect_laa_multi_carrier_tx_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_tx, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier tx value [0..1]"); ++ } ++} ++static void dissect_laa_multi_carrier_freeze_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_freeze, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier freeze value [0..1]"); ++ } ++} ++static void dissect_laa_tx_antenna_port_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tx_antenna_ports_for_drs, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 1 || value == 2 || value == 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tx antenna ports for drs value [1, 2, 4]"); ++ } ++} ++static void dissect_laa_transmission_power_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_transmission_power_for_drs, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power for drs [0..10000]"); ++ } ++} ++static void dissect_emtc_pbch_repeitions_enabled_r13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pbch_repetitions_enabled_r13, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pbch repetitions enabled r13 value [0..1]"); ++ } ++} ++static void dissect_emtc_prach_cat_m_root_sequence_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_root_sequence_index, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 837) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m root sequence index value [0..837]"); ++ } ++} ++static void dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m zero correlation zone configuration value [0..15]"); ++ } ++} ++static void dissect_emtc_prach_cat_m_high_speed_flag_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_high_speed_flag, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m high speed flag value [0..1]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_0_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_enable, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 enable value [0..1]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_0_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_configuration_index, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 63) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 configuration index value [0..63]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_0_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_frequency_offset, 2, ENC_BIG_ENDIAN); ++ ++ if (value > (100 - 6)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 frequency offset value [0..94]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); ++ ++ if (!( value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || ++ value == 64 || value == 128)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]"); ++ } ++} ++static void dissect_emtc_ce_level_0_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || ++ value == 64 || value == 128 || value == 256)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_0_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_hopping_enabled, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 hopping enabled value [0..1]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_0_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_hopping_offset, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 94) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 hopping offset value [0..94]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_1_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_enable, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 enable value [0..1]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_1_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_configuration_index, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 63) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 configuration index value [0..63]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_1_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_frequency_offset, 2, ENC_BIG_ENDIAN); ++ ++ if (value > (100 - 6)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 frequency offset value [0..94]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || ++ value == 64 || value == 128)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]"); ++ } ++} ++static void dissect_emtc_ce_level_1_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || ++ value == 64 || value == 128 || value == 256)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_1_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_hopping_enabled, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 hopping enabled value [0..1]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_1_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_hopping_offset, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 94) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 hopping offset value [0..94]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_2_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_enable, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 enable value [0..1]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_2_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_configuration_index, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 63) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 configuration index value [0..63]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_2_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_frequency_offset, 2, ENC_BIG_ENDIAN); ++ ++ if (value > (100 - 6)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 frequency offset value [0..94]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || ++ value == 64 || value == 128)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]"); ++ } ++} ++static void dissect_emtc_ce_level_2_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || ++ value == 64 || value == 128 || value == 256)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_2_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_hopping_enabled, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 hopping enabled value [0..1]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_2_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_hopping_offset, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 94) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 hopping offset value [0..94]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_3_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_enable, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 enable value [0..1]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_3_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_configuration_index, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 63) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 configuration index value [0..63]"); ++ } ++} ++static void dissect_emtc_prach_ce_level_3_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_frequency_offset, 2, ENC_BIG_ENDIAN); ++ ++ if (value > (100 - 6)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 frequency offset value [0..94]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || ++ value == 64 || value == 128)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]"); ++ } ++} ++static void dissect_emtc_ce_level_3_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 || ++ value == 64 || value == 128 || value == 256)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_3_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_hopping_enabled, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 hopping enabled value [0..1]"); ++ } ++} ++static void dissect_emtc_preach_ce_level_3_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_hopping_offset, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 94) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 hopping offset value [0..94]"); ++ } ++} ++static void dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 5 || value == 10 || value == 20)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch internal ul hopping config common mode a value [1, 2, 4, 8] or [1, 5, 10, 20]"); ++ } ++} ++static void dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 2 || value == 4 || value == 8 || value == 16 || value == 5 || value == 10 || value == 20 || value == 40)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch internal ul hopping config common mode a value [2, 4, 8, 16] or [5, 10, 20, 40]"); ++ } ++} ++static void dissect_dl_bandwidth_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_dl_bandwidth_support, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 0x1F) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink bandwidth support bit [0..0x1F]"); ++ } ++ ++ proto_tree* dl_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_bandwidth_support); ++ ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); ++ ++ ptvcursor_advance(ptvc, 2); ++} ++static void dissect_ul_bandwidth_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_ul_bandwidth_support, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 0x1F) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink bandwidth support bit [0..0x1F]"); ++ } ++ ++ proto_tree* ul_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_bandwidth_support); ++ ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); ++ ++ ptvcursor_advance(ptvc, 2); ++ ++} ++static void dissect_dl_modulation_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_dl_modulation_support, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 0x7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink modulation support bit [0..0x7]"); ++ } ++ ++ proto_tree* dl_mod_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_modulation_support); ++ ++ proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_qpsk, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_16qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_64qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); ++ proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_256qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); ++ ++ ptvcursor_advance(ptvc, 2); ++} ++static void dissect_ul_modulation_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_ul_modulation_support, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 0x7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink modulation support bit [0..0x7]"); ++ } ++ ++ proto_tree* ul_mod_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_modulation_support); ++ ++ proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_qpsk, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_16qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); ++ proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_64qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); ++ ++ ptvcursor_advance(ptvc, 2); ++} ++static void dissect_phy_antenna_capability_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phy_antenna_capability, 2, ENC_BIG_ENDIAN); ++ ++ if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phy antenna capability [1, 2, 4, 8, 16]"); ++ } ++} ++static void dissect_release_capability_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_release_capability, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 0x3F) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid release capability value [0..0x3F]"); ++ } ++ ++ proto_tree* release_support_tree = proto_item_add_subtree(item, ett_nfapi_release_support); ++ ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel8, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA); ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel9, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA); ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel10, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA); ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel11, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA); ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel12, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA); ++ proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel13, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA); ++ ++ ptvcursor_advance(ptvc, 2); ++} ++static void dissect_mbsfn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_mbsfn_capability, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mbsfn capability bit [0..0x1]"); ++ } ++} ++static void dissect_laa_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_laa_capability, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa support bit [0..0x1]"); ++ } ++} ++static void dissect_laa_pd_sensing_lbt_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pd_sensing_lbt_support, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pd sensing lbt support bit [0..0x1]"); ++ } ++} ++static void dissect_laa_multi_carrier_lbt_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_lbt_support, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 0xF) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi carrier LBT support bit [0..0xF]"); ++ } ++} ++static void dissect_laa_partial_sf_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_partial_sf_support, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 0x1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid partial SF support bit [0..0x1]"); ++ } ++} ++static void dissect_data_report_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_data_report_mode, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid data report mode value [0..1]"); ++ } ++} ++static void dissect_sfn_sf_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_sfnsf, 2, ENC_BIG_ENDIAN); ++ ++ guint16 sfn = value >> 0x4; ++ guint16 sf = value & 0x000F; ++ if (sfn > 1023 || sf > 9) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid sfn/sf value sfn:%d [0..1023] sf:%d [0..9]", sfn, sf); ++ } ++} ++static void dissect_phy_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phy_state, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phy state [0..2]"); ++ } ++} ++static void dissect_p7_vnf_address_ipv4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_vnf_address_ipv4, 4, ENC_NA); ++} ++static void dissect_p7_vnf_address_ipv6_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_vnf_address_ipv6, 16, ENC_NA); ++} ++static void dissect_p7_vnf_port_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_vnf_port, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_p7_pnf_address_ipv4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_pnf_address_ipv4, 4, ENC_NA); ++} ++static void dissect_p7_pnf_address_ipv6_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_pnf_address_ipv6, 16, ENC_NA); ++} ++static void dissect_p7_pnf_port_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_pnf_port, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_downlink_ues_per_subframe_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_dl_ue_per_sf, 1, ENC_BIG_ENDIAN); ++} ++static void dissect_uplink_ues_per_subframe_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_ul_ue_per_sf, 1, ENC_BIG_ENDIAN); ++} ++static void dissect_rf_band_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_band, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_rf_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); ++} ++static void dissect_timing_window_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_window, 1, ENC_BIG_ENDIAN); ++ ++ if (value > 30) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing window value [0..30]"); ++ } ++} ++static void dissect_timing_info_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_info_mode, 1, ENC_BIG_ENDIAN); ++ ++ if (value > 0x3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing info mode [0..0x3]"); ++ } ++} ++static void dissect_timing_info_period_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_info_period, 1, ENC_BIG_ENDIAN); ++ ++ // Compiler throws an hissy fit that value <= 255 is always true... Yes, but I am trying to ++ // follow the specification... ++ if (!(value >= 1 /* && value <= 255*/)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing info period [1..255]"); ++ } ++} ++static void dissect_maximum_transmit_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_maximum_transmit_power_2, 2, ENC_BIG_ENDIAN); ++ ++ if (value > 700) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid maxiumum transmit power [0..700]"); ++ } ++} ++static void dissect_earfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_nmm_gsm_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); ++} ++static void dissect_nmm_umts_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); ++} ++static void dissect_nmm_lte_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value); ++} ++static void dissect_nmm_uplink_rssi_supported_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_nmm_uplink_rssi_supported, 1, ENC_BIG_ENDIAN); ++ ++ if (value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nmm uplink rssi supported value [0..1]"); ++ } ++} ++static void dissect_dl_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_dl_config_pdu_type, 1, ENC_BIG_ENDIAN); ++ guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); ++ ++ guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); ++ dissect_tlv_list(ptvc, pinfo, pdu_end); ++} ++static void dissect_dl_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Number of PDCCH OFDM symbols ++ guint8 number_of_pdcch_ofdm_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_pdcch_ofdm_symbols, 1, ENC_BIG_ENDIAN); ++ if (number_of_pdcch_ofdm_symbols_value > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdcch ofdm symbols value [0..4]"); ++ } ++ ++ // Number of DCIs ++ guint8 number_of_dcis_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_dci, 1, ENC_BIG_ENDIAN); ++ ++ // Number of PDUs ++ guint16 number_of_pdus_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); ++ if (number_of_pdus_value > 514) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [0..514]"); ++ } ++ ++ // Number of PDSCH RNTIs ++ ptvcursor_add(ptvc, hf_nfapi_number_pdsch_rnti, 1, ENC_BIG_ENDIAN); ++ ++ // Transmission power for PCFICH ++ guint16 transmission_power_for_pdsch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power_pcfich, 2, ENC_BIG_ENDIAN); ++ if (transmission_power_for_pdsch_value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power for pcfich value [0..10000]"); ++ } ++ ++ dissect_array_value(ptvc, pinfo, "DL Config PDU List", ett_nfapi_dl_config_request_pdu_list, number_of_dcis_value + number_of_pdus_value, dissect_dl_config_pdu); ++} ++static void dissect_dl_config_request_bch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Length ++ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); ++ ++ // PDU index ++ ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); ++ ++ // Transmission power ++ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); ++ if (transmission_power_value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); ++ } ++ ++} ++static void dissect_dl_config_request_dl_dci_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // DCI format ++ guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_dl_dci_format, 1, ENC_BIG_ENDIAN); ++ if (dci_format_value > 9) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [0..9]"); ++ } ++ ++ // CCE index ++ guint8 cce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_cce_idx, 1, ENC_BIG_ENDIAN); ++ if (cce_index_value > 88) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cce index value [0..88]"); ++ } ++ ++ // Aggregation level ++ guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); ++ if (!(aggregation_level_value == 1 || aggregation_level_value == 2 || aggregation_level_value == 4 || ++ aggregation_level_value == 8 || aggregation_level_value == 16 || aggregation_level_value == 32)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [1, 2, 4, 8, 16, 32]"); ++ } ++ ++ // RNTI ++ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); ++ if (rnti_value < 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); ++ } ++ ++ // Resource allocation type ++ guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); ++ if (resource_allocation_type_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]"); ++ } ++ ++ // Virtual resource block assignment flag ++ guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN); ++ if (virtual_resource_block_assignment_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block assignment flag value [0..1]"); ++ } ++ ++ // Resource block coding ++ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); ++ ++ // MCS_1 ++ guint8 mcs_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mcs_1, 1, ENC_BIG_ENDIAN); ++ if (mcs_1_value > 31) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 1 value [0..31]"); ++ } ++ ++ // Redundancy version_1 ++ guint8 redundancy_version_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version_1, 1, ENC_BIG_ENDIAN); ++ if (redundancy_version_1_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version 1 value [0..3]"); ++ } ++ ++ // New data indicator_1 ++ guint8 new_data_indicator_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator_1, 1, ENC_BIG_ENDIAN); ++ if (new_data_indicator_1_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator 1 value [0..1]"); ++ } ++ ++ // Transport block to codeword swap flag ++ guint8 transport_block_to_codeword_swap_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN); ++ if (transport_block_to_codeword_swap_flag_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block to codeword swap flag value [0..1]"); ++ } ++ ++ // MCS_2 ++ guint8 mcs_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mcs_2, 1, ENC_BIG_ENDIAN); ++ if (mcs_2_value > 31) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 2 value [0..31]"); ++ } ++ ++ // Redundancy version_2 ++ guint8 redundancy_version_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version_2, 1, ENC_BIG_ENDIAN); ++ if (redundancy_version_2_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version 2 value [0..3]"); ++ } ++ ++ // New Data indicator_2 ++ guint8 new_data_indicator_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator_2, 1, ENC_BIG_ENDIAN); ++ if (new_data_indicator_2_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator 2 value [0..1]"); ++ } ++ ++ // HARQ process ++ guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN); ++ if (harq_process_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..15]"); ++ } ++ ++ // TPMI ++ guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN); ++ if (tpmi_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..3]"); ++ } ++ ++ // PMI ++ guint8 pmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pmi, 1, ENC_BIG_ENDIAN); ++ if (pmi_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..2]"); ++ } ++ ++ // Precoding information ++ guint8 precoding_information_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_precoding_information, 1, ENC_BIG_ENDIAN); ++ if (precoding_information_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid precoding information value [0..15]"); ++ } ++ ++ // TPC ++ guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); ++ if (tpc_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]"); ++ } ++ ++ // Downlink assignment index ++ guint8 downlink_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index, 1, ENC_BIG_ENDIAN); ++ if (downlink_assignment_index_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignment value [0..15]"); ++ } ++ ++ // NGAP ++ guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN); ++ if (ngap_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]"); ++ } ++ ++ // Transport block size index ++ guint8 transport_block_size_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transport_block_size_index, 1, ENC_BIG_ENDIAN); ++ if (transport_block_size_index_value > 31) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block size index value [0..31]"); ++ } ++ ++ // Downlink power offset ++ guint8 downlink_power_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_downlink_power_offset, 1, ENC_BIG_ENDIAN); ++ if (downlink_power_offset_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink power offset value [0..1]"); ++ } ++ ++ // Allocate PRACH flag ++ guint8 allocate_prach_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_allocate_prach_flag, 1, ENC_BIG_ENDIAN); ++ if (allocate_prach_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid allocate prach flag value [0..1]"); ++ } ++ ++ // Preamble index ++ guint8 preamble_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_preamble_index, 1, ENC_BIG_ENDIAN); ++ if (preamble_index_value > 63) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble index value [0..63]"); ++ } ++ ++ // PRACH mask index ++ guint8 prach_mask_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_prach_mask_index, 1, ENC_BIG_ENDIAN); ++ if (prach_mask_index_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach mask index value [0..15]"); ++ } ++ ++ // RNTI type ++ guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_rnti_type, 1, ENC_BIG_ENDIAN); ++ if (!(rnti_type_value >= 1 && rnti_type_value <= 3)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [1..3]"); ++ } ++ ++ // Transmission power ++ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); ++ if (transmission_power_value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value value [0..10000]"); ++ } ++ ++} ++static void dissect_dl_config_request_dl_dci_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // MCCH flag ++ guint8 mcch_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mcch_flag, 1, ENC_BIG_ENDIAN); ++ if (mcch_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcch flag value [0..1]"); ++ } ++ ++ // MCCH change notification ++ ptvcursor_add(ptvc, hf_nfapi_mcch_change_notification, 1, ENC_BIG_ENDIAN); ++ ++ // Scrambling identity ++ guint8 scrambling_identity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_scrambling_identity, 1, ENC_BIG_ENDIAN); ++ if (scrambling_identity_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid scrambling identity value [0..1]"); ++ } ++ ++} ++static void dissect_dl_config_request_dl_dci_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Cross carrier scheduling flag ++ guint8 cross_carrier_scheduling_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_cross_carrier_scheduling_flag, 1, ENC_BIG_ENDIAN); ++ if (cross_carrier_scheduling_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cross carrier scheduling flag value [0..1]"); ++ } ++ ++ // Carrier indicator ++ guint8 carrier_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_carrier_indicator, 1, ENC_BIG_ENDIAN); ++ if (carrier_indicator_value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid carrier indicator value [0..7]"); ++ } ++ ++ // SRS flag ++ guint8 srs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_srs_flag, 1, ENC_BIG_ENDIAN); ++ if (srs_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs flag value [0..1]"); ++ } ++ ++ // SRS request ++ guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); ++ if (srs_request_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]"); ++ } ++ ++ // Antenna ports, scrambling and layers ++ guint8 antenna_ports_scrambling_and_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_scrambling_and_layers, 1, ENC_BIG_ENDIAN); ++ if (antenna_ports_scrambling_and_layers_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports scrambling and layers value [0..15]"); ++ } ++ ++ // Total DCI length including padding ++ ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN); ++ ++ // N_DL_RB ++ // TODO : This is missing from the encoder.... ++ //ptvcursor_add(ptvc, hf_nfapi_n_dl_rb, 1, ENC_BIG_ENDIAN); ++} ++static void dissect_dl_config_request_dl_dci_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // HARQ-ACK resource offset ++ guint8 harq_ack_resource_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_ack_resource_offset, 1, ENC_BIG_ENDIAN); ++ if (harq_ack_resource_offset_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hack ack resource offset value [0..3]"); ++ } ++ ++ // PDSCH RE Mapping and Quasi-Co-Location Indicator ++ guint8 pdsch_re_mapping_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, 1, ENC_BIG_ENDIAN); ++ if (pdsch_re_mapping_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping value [0..3]"); ++ } ++ ++} ++static void dissect_ul_dl_configuration_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // UL/DL configuration indication ++ guint8 ul_dl_configuration_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_dl_configuration_index, 1, ENC_BIG_ENDIAN); ++ if (!(ul_dl_configuration_indication_value >= 1 && ul_dl_configuration_indication_value <= 5)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul/dl configuration indication value [1..5]"); ++ } ++} ++static void dissect_dl_config_request_dl_dci_pdu_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Primary cell type ++ guint8 primary_cell_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_primary_cell_type, 1, ENC_BIG_ENDIAN); ++ if (primary_cell_type_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid primary cell type value [0..2]"); ++ } ++ ++ // UL/DL configuration flag ++ guint8 ul_dl_configuration_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ul_dl_configuration_flag, 1, ENC_BIG_ENDIAN); ++ if (ul_dl_configuration_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul/dl configuration flag value [0..1]"); ++ } ++ ++ // Number of UL / DL configurations ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ul_dl_configurations, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "UL/DL Configurations", ett_nfapi_pnf_phy, count, dissect_ul_dl_configuration_index_value); ++} ++static void dissect_dl_config_request_dl_dci_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_laa_end_partial_sf_flag, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_laa_end_partial_sf_configuration, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_codebooksize_determination_r13, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_rel13_drms_table_flag, 1, ENC_BIG_ENDIAN); ++} ++static void dissect_dl_config_request_mch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_mbsfn_area_id, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_codebook_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 codebook_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN); ++ if (codebook_index_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [0..15]"); ++ } ++} ++static void dissect_bf_vector_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_bf_vector_bf_value, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_bf_vector_type_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_bf_vector_subband_index, 1, ENC_BIG_ENDIAN); ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_bf_vector_num_antennas, 1, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "Antennas", ett_nfapi_bf_vector_antennas, count, dissect_bf_vector_value); ++} ++static void dissect_dl_config_request_dlsch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Length ++ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); ++ ++ // PDU index ++ ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); ++ ++ // RNTI ++ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); ++ if (!(rnti_value >= 1 /* && rnti_value <= 65535)*/)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [1..65535]"); ++ } ++ ++ // Resource allocation type ++ guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); ++ if (resource_allocation_type_value > 5) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..5]"); ++ } ++ ++ // Virtual resource block assignment flag ++ guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN); ++ if (virtual_resource_block_assignment_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block allocation assignment value [0..1]"); ++ } ++ ++ // Resource block coding ++ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); ++ ++ // Modulation ++ guint8 modulation_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN); ++ if (!(modulation_value == 2 || modulation_value == 4 || modulation_value == 6 || modulation_value == 8)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid modulation value [2, 4, 6, 8]"); ++ } ++ ++ // Redundancy version ++ guint8 redundancy_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); ++ if (redundancy_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy value [0..3]"); ++ } ++ ++ // Transport blocks ++ guint8 transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transport_blocks, 1, ENC_BIG_ENDIAN); ++ if (!(transport_blocks_value >= 1 && transport_blocks_value <= 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1..2]"); ++ } ++ ++ // Transport block to codeword swap flag ++ guint8 transport_blocks_to_codeword_swap_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN); ++ if (transport_blocks_to_codeword_swap_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block to codeword swap flag value [0..1]"); ++ } ++ ++ // Transmission scheme ++ guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_scheme, 1, ENC_BIG_ENDIAN); ++ if (transmission_scheme_value > 13) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission scheme value [0..13]"); ++ } ++ ++ // Number of layers ++ guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_layers_value >= 1 && number_of_layers_value <= 8)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..8]"); ++ } ++ ++ // Number of subbands ++ guint8 num_subbands = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 1, ENC_BIG_ENDIAN); ++ if (num_subbands > 13) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of subbands value [0..13]"); ++ } ++ ++ dissect_array_value(ptvc, pinfo, "Subbands", ett_nfapi_subbands, num_subbands, dissect_codebook_index_value); ++ ++ // UE category capacity ++ guint8 ue_category_capacity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ue_category_capacity, 1, ENC_BIG_ENDIAN); ++ if (ue_category_capacity_value > 14) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue category capacity value [0..14]"); ++ } ++ ++ // P-A ++ guint8 pa_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pa, 1, ENC_BIG_ENDIAN); ++ if (pa_value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid p-a value [0..7]"); ++ } ++ ++ // Delta power offset index ++ guint8 delta_power_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_delta_power_offset_index, 1, ENC_BIG_ENDIAN); ++ if (delta_power_offset_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta power offset value [0..1]"); ++ } ++ ++ // NGAP ++ guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN); ++ if (ngap_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]"); ++ } ++ ++ // NPRB ++ guint8 nrpb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); ++ if (nrpb_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nprb value [0..1]"); ++ } ++ ++ // Transmission mode ++ guint8 transmission_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_mode, 1, ENC_BIG_ENDIAN); ++ if (!(transmission_mode_value >= 1 && transmission_mode_value <= 10)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode value [1..10]"); ++ } ++ ++ // numBfPRBperSubband ++ ptvcursor_add(ptvc, hf_nfapi_num_bf_prb_per_subband, 1, ENC_BIG_ENDIAN); ++ ++ // numBfVector ++ guint8 num_vectors = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_num_bf_vector, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "Beamforming Vectors", ett_nfapi_bf_vectors, num_vectors, dissect_bf_vector_type_value); ++} ++static void dissect_csi_rs_resource_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 csi_rs_resource_config_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config, 1, ENC_BIG_ENDIAN); ++ if (csi_rs_resource_config_value > 31) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs resource config value [0..31]"); ++ } ++} ++static void dissect_dl_config_request_dlsch_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 nscid_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_nscid, 1, ENC_BIG_ENDIAN); ++ if (nscid_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nscid value [0..1]"); ++ } ++} ++static void dissect_dl_config_request_dlsch_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // CSI-RS flag ++ guint8 csi_rs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_flag, 1, ENC_BIG_ENDIAN); ++ if (csi_rs_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs flag value [0..1]"); ++ } ++ ++ // CSI-RS resource config R10 ++ ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config_r10, 1, ENC_BIG_ENDIAN); ++ ++ // CSI-RS zero Tx power resource config bitmap R10 ++ ptvcursor_add(ptvc, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, 2, ENC_BIG_ENDIAN); ++ ++ // CSI-RS Number of NZP configuration ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_number_of_nzp_configurations, 1, ENC_BIG_ENDIAN); ++ if (count > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs number of nzp configuration value [0..3]"); ++ } ++ ++ // CSI-RS configuration ++ dissect_array_value(ptvc, pinfo, "CSI-RS Resource Configs", ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); ++ ++ // PDSCH start ++ guint8 pdsch_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pdsch_start, 1, ENC_BIG_ENDIAN); ++ if (pdsch_start_value > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch start value [0..4]"); ++ } ++ ++} ++static void dissect_dl_config_request_dlsch_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // DMRS Config flag ++ guint8 drms_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_drms_config_flag, 1, ENC_BIG_ENDIAN); ++ if (drms_config_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms config flag value [0..1]"); ++ } ++ ++ // DMRS-Scrambling ++ guint16 drms_scrambling_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_drms_scrambling, 2, ENC_BIG_ENDIAN); ++ if (drms_scrambling_value > 503) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling value [0..503]"); ++ } ++ ++ // CSI Config flag ++ guint8 csi_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_csi_config_flag, 1, ENC_BIG_ENDIAN); ++ if (csi_config_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi config flag value [0..1]"); ++ } ++ ++ // CSI- Scrambling ++ guint16 csi_scrambling_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_csi_scrambling, 2, ENC_BIG_ENDIAN); ++ if (csi_scrambling_value > 503) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi scrambling value [0..503]"); ++ } ++ ++ // PDSCH RE mapping flag ++ guint8 pdsch_re_mapping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_flag, 1, ENC_BIG_ENDIAN); ++ if (pdsch_re_mapping_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping flag value [0..1]"); ++ } ++ ++ // PDSCH RE mapping antenna ports ++ guint8 pdsch_re_mapping_antenna_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_antenna_ports, 1, ENC_BIG_ENDIAN); ++ if (!(pdsch_re_mapping_antenna_ports_value == 1 || pdsch_re_mapping_antenna_ports_value == 2 || ++ pdsch_re_mapping_antenna_ports_value == 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping antenna ports value [1, 2, 4]"); ++ } ++ ++ // PDSCH RE mapping freq shift ++ guint8 pdsch_re_mapping_freq_shift_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_freq_shift, 1, ENC_BIG_ENDIAN); ++ if (pdsch_re_mapping_freq_shift_value > 5) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping freq shift value [0..5]"); ++ } ++} ++static void dissect_dl_config_request_dlsch_pdu_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // altCQI-Table-r12 ++ guint8 alt_cqi_table_r12_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_alt_cqi_table_r12, 1, ENC_BIG_ENDIAN); ++ if (alt_cqi_table_r12_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid alt cqi table r12 value [0..1]"); ++ } ++ ++ // MaxLayers ++ guint8 max_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_max_layers, 1, ENC_BIG_ENDIAN); ++ if (!(max_layers_value >= 1 && max_layers_value <= 8)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid max layers value [1..8]"); ++ } ++ ++ ptvcursor_add(ptvc, hf_nfapi_n_dl_harq, 1, ENC_BIG_ENDIAN); ++} ++static void dissect_dl_config_request_dlsch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // DwPTS Symbols ++ guint8 dwpts_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_dwpts_symbols, 1, ENC_BIG_ENDIAN); ++ if (!(dwpts_symbols_value == 3 || dwpts_symbols_value == 6 || dwpts_symbols_value == 9 || ++ dwpts_symbols_value == 10 || dwpts_symbols_value == 11 || dwpts_symbols_value == 12 || ++ dwpts_symbols_value == 14)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dwpts symbols value [3, 6, 9, 10, 11, 12, 14]"); ++ } ++ ++ // Initial LBT SF ++ guint8 initial_lbt_sf_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN); ++ if (initial_lbt_sf_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial lbt sf value [0..1]"); ++ } ++ ++ // UE Type ++ guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN); ++ if (ue_type_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]"); ++ } ++ ++ // PDSCH Payload Type ++ guint8 pdsch_payload_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_payload_type, 1, ENC_BIG_ENDIAN); ++ if (pdsch_payload_type_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch payload type value [0..2]"); ++ } ++ ++ // Initial transmission SF (io) ++ guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); ++ if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); ++ } ++ ++ // Rel-13-DMRS-tabe flag ++ guint8 rel13_drms_table_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_req13_drms_table_flag, 1, ENC_BIG_ENDIAN); ++ if (rel13_drms_table_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rel13 drms table flag value [0..1]"); ++ } ++} ++static void dissect_dl_config_request_pch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Length ++ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); ++ ++ // PDU index ++ ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); ++ ++ // P-RNTI ++ guint16 prnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_prnti, 2, ENC_BIG_ENDIAN); ++ if (prnti_value != 0xFFFE) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prnti value [0xFFFE]"); ++ } ++ ++ // Resource allocation type ++ guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); ++ if (!(resource_allocation_type_value == 2 || resource_allocation_type_value == 3 || resource_allocation_type_value == 6)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocate type value [2, 3, 6]"); ++ } ++ ++ // Virtual resource block assignment flag ++ guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN); ++ if (virtual_resource_block_assignment_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block assignment flag value [0..1]"); ++ } ++ ++ // Resource block coding ++ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); ++ ++ // MCS ++ guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN); ++ if (mcs_value != 0) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs value [0]"); ++ } ++ ++ // Redundancy version ++ guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); ++ if (redundancy_version_value != 0) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy value [0]"); ++ } ++ ++ // Number of transport blocks ++ guint8 number_of_transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_transport_blocks, 1, ENC_BIG_ENDIAN); ++ if (number_of_transport_blocks_value != 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1]"); ++ } ++ ++ // Transport block to codeword swap flag ++ ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN); ++ ++ // Transmission scheme ++ guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_scheme, 1, ENC_BIG_ENDIAN); ++ if (!(transmission_scheme_value == 0 || transmission_scheme_value == 1 || transmission_scheme_value == 6)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission schemes value [0, 1, 6]"); ++ } ++ ++ // Number of layers ++ guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_layers_value >= 1 && number_of_layers_value <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..4]"); ++ } ++ ++ // Codebook index ++ ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN); ++ ++ // UE category capacity ++ guint8 ue_category_capacity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ue_category_capacity, 1, ENC_BIG_ENDIAN); ++ if (ue_category_capacity_value > 14) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue category capacity value [0..14]"); ++ } ++ ++ // P-A ++ guint8 p_a_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pa, 1, ENC_BIG_ENDIAN); ++ if (p_a_value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid p-a value value [0..7]"); ++ } ++ ++ // Transmission power ++ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); ++ if (transmission_power_value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); ++ } ++ ++ // NPRB ++ guint8 nprb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); ++ if (nprb_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nprb value [0..1]"); ++ } ++ ++ // NGAP ++ guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN); ++ if (ngap_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]"); ++ } ++ ++} ++static void dissect_dl_config_request_pch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // UE mode ++ guint8 ue_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ue_mode, 1, ENC_BIG_ENDIAN); ++ if (ue_mode_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue mode value [0..1]"); ++ } ++ ++ // Initial transmission SF (io) ++ guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); ++ if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); ++ } ++} ++static void dissect_dl_config_request_prs_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Transmission power ++ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); ++ if (transmission_power_value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); ++ } ++ ++ // PRS bandwidth ++ guint8 prs_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_prs_bandwidth, 1, ENC_BIG_ENDIAN); ++ if (!(prs_bandwidth_value == 6 || prs_bandwidth_value == 15 || prs_bandwidth_value == 25 || ++ prs_bandwidth_value == 50 || prs_bandwidth_value == 75 || prs_bandwidth_value == 100)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs bandwidth value [6, 15, 25, 50, 75, 100]"); ++ } ++ ++ // PRS cyclic prefix type ++ guint8 prs_cyclic_prefix_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_prs_cyclic_prefix_type, 1, ENC_BIG_ENDIAN); ++ if (prs_cyclic_prefix_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs cyclic prefix value [0..1]"); ++ } ++ ++ // PRS muting ++ guint8 prs_muting_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_prs_muting, 1, ENC_BIG_ENDIAN); ++ if (prs_muting_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs muting value [0..1]"); ++ } ++} ++static void dissect_dl_config_request_csi_rs_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // CSI-RS antenna port count R10 ++ guint8 csi_rs_antenna_port_count_r10_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_antenna_port_count_r10, 1, ENC_BIG_ENDIAN); ++ if (!(csi_rs_antenna_port_count_r10_value == 1 || csi_rs_antenna_port_count_r10_value == 2 || ++ csi_rs_antenna_port_count_r10_value == 4 || csi_rs_antenna_port_count_r10_value == 8 || ++ csi_rs_antenna_port_count_r10_value == 12 || csi_rs_antenna_port_count_r10_value == 16)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi rs antenna port count r10 value [1, 2, 4, 6, 8, 10]"); ++ } ++ ++ // CSI-RS resource config R10 ++ ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config_r10, 1, ENC_BIG_ENDIAN); ++ ++ // Transmission power ++ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); ++ if (transmission_power_value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); ++ } ++ ++ // CSI-RS zero Tx power resource config bitmap R10 ++ ptvcursor_add(ptvc, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, 2, ENC_BIG_ENDIAN); ++ ++ // CSI-RS Number of NZP configuration ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_number_of_nzp_configurations, 1, ENC_BIG_ENDIAN); ++ if (count > 8) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs number of nzp configuration value [0..8]"); ++ } ++ ++ // CSI-RS configuration ++ dissect_array_value(ptvc, pinfo, "CSI-RS Resource Configs", ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value); ++} ++static void dissect_csi_rs_bf_vector_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_index, 1, ENC_BIG_ENDIAN); ++ if (count > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs resource index value [0..7]"); ++ } ++ ++ // todo : how to work out the antenna port count for the bfValue ++} ++static void dissect_dl_config_request_csi_rs_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Class ++ guint8 class_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_class, 1, ENC_BIG_ENDIAN); ++ if (class_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid class value [0..2]"); ++ } ++ ++ // cdmType ++ guint8 cdm_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_cdm_type, 1, ENC_BIG_ENDIAN); ++ if (cdm_type_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm type value [0..1]"); ++ } ++ ++ // numBfVector ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_num_bf_vector, 1, ENC_BIG_ENDIAN); ++ if (!((class_value == 1 && count == 0) || (class_value == 2 && count <= 8))) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid num bf vector value [0] or [0..8]"); ++ } ++ ++ dissect_array_value(ptvc, pinfo, "Beamforming Vector", ett_nfapi_csi_rs_bf_vector, count, dissect_csi_rs_bf_vector_value); ++} ++static void dissect_epdcch_prb_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // EPDCCH PRB index ++ guint8 epdcch_prb_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_edpcch_prb_index, 1, ENC_BIG_ENDIAN); ++ if (epdcch_prb_index_value > 99) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch prb_index value [0..99]"); ++ } ++} ++static void dissect_dl_config_request_edpcch_params_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // EPDCCH Resource assignment flag ++ guint8 epdcch_resource_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_epdcch_resource_assignment_flag, 1, ENC_BIG_ENDIAN); ++ if (epdcch_resource_assignment_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch resource assignment flag value [0..1]"); ++ } ++ ++ // EPDCCH ID ++ guint16 epdcch_id_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_epdcch_id, 2, ENC_BIG_ENDIAN); ++ if (epdcch_id_value > 503) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch id value [0..503]"); ++ } ++ ++ // EPDCCH Start Symbol ++ guint8 epdcch_start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_epdcch_start_symbol, 1, ENC_BIG_ENDIAN); ++ if (!(epdcch_start_symbol_value >= 1 && epdcch_start_symbol_value <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch start symbol value [1..4]"); ++ } ++ ++ // EPDCCH NumPRB ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_epdcch_num_prb, 1, ENC_BIG_ENDIAN); ++ if (!(count == 2 || count == 4 || count == 8)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch num prb value [2, 4, 8]"); ++ } ++ ++ dissect_array_value(ptvc, pinfo, "PRBs", ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value); ++ ++ dissect_bf_vector_type_value(ptvc, pinfo); ++} ++static void dissect_dl_config_request_edpcch_params_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // DwPTS Symbols ++ guint8 dwtps_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN); ++ if (!(dwtps_symbols_value == 3 || dwtps_symbols_value == 6 || dwtps_symbols_value == 9 || ++ dwtps_symbols_value == 10 || dwtps_symbols_value == 11 || dwtps_symbols_value == 12 || ++ dwtps_symbols_value == 14)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dwpts symbols value [3, 6, 9, 10, 11, 12, 14]"); ++ } ++ ++ // Initial LBT SF ++ guint8 initial_lbt_sf_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_dwpts_symbols, 1, ENC_BIG_ENDIAN); ++ if (initial_lbt_sf_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial lbt sf value [0..1]"); ++ } ++ ++} ++static void dissect_precoding_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add(ptvc, hf_nfapi_precoding_value, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_dl_config_request_mpdpcch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // MPDCCH Narrowband ++ guint8 mpdcch_narrowband_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_narrowband, 1, ENC_BIG_ENDIAN); ++ if (mpdcch_narrowband_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch narrowband value [0..15]"); ++ } ++ ++ // Number of PRB pairs ++ guint8 number_of_prb_pair_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_prb_pairs, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_prb_pair_value == 2 || number_of_prb_pair_value == 4 || number_of_prb_pair_value == 6)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of prb pair value [2, 4, 6]"); ++ } ++ ++ // Resource Block Assignment ++ guint8 resource_block_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_assignment, 1, ENC_BIG_ENDIAN); ++ if (resource_block_assignment_value > 14) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block assignment value [0..14]"); ++ } ++ ++ // MPDCCH transmission type ++ guint8 mpdcch_transmission_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_transmission_type, 1, ENC_BIG_ENDIAN); ++ if (mpdcch_transmission_type_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch transmission type value [0..1]"); ++ } ++ ++ // Start symbol ++ guint8 start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_start_symbol, 1, ENC_BIG_ENDIAN); ++ if (!(start_symbol_value >= 1 && start_symbol_value <=4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid start symbol value [1..4]"); ++ } ++ ++ // ECCE index ++ guint8 ecce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ecce_index, 1, ENC_BIG_ENDIAN); ++ if (ecce_index_value > 22) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ecce index value [0..22]"); ++ } ++ ++ // Aggregation level ++ guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); ++ if (!(aggregation_level_value == 2 || aggregation_level_value == 4 || aggregation_level_value == 8 || ++ aggregation_level_value == 16 || aggregation_level_value == 24)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [2, 4, 8, 16, 24]"); ++ } ++ ++ // RNTI type ++ guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_rnti_type, 1, ENC_BIG_ENDIAN); ++ if (rnti_type_value > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [0..4]"); ++ } ++ ++ // RNTI ++ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); ++ if (!(rnti_value >= 1)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); ++ } ++ ++ // CEMode ++ guint8 cemode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ce_mode, 1, ENC_BIG_ENDIAN); ++ if (!(cemode_value >= 1 && cemode_value <= 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cemode value [1..2]"); ++ } ++ ++ // DMRS scrambling init ++ guint16 drms_scrambling_init_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_drms_scrabmling_init, 2, ENC_BIG_ENDIAN); ++ if (drms_scrambling_init_value > 503) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling init value [0..503]"); ++ } ++ ++ // Initial transmission SF (io) ++ guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); ++ if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); ++ } ++ ++ // Transmission power ++ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); ++ if (transmission_power_value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); ++ } ++ ++ // DCI format ++ guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_dl_dci_format, 1, ENC_BIG_ENDIAN); ++ if (!(dci_format_value == 10 || dci_format_value == 11 || dci_format_value == 12)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [10, 11, 12]"); ++ } ++ ++ // Resource block coding ++ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 2, ENC_BIG_ENDIAN); ++ ++ // MCS ++ guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN); ++ if (mcs_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..15]"); ++ } ++ ++ // PDSCH repetition levels ++ guint8 pdsch_repetition_levels_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pdsch_reception_levels, 1, ENC_BIG_ENDIAN); ++ if (!(pdsch_repetition_levels_value >= 1 && pdsch_repetition_levels_value <= 8)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch repetition levels value [1..8]"); ++ } ++ ++ // Redundancy version ++ guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); ++ if (redundancy_version_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]"); ++ } ++ ++ // New data indicator ++ guint8 new_data_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator, 1, ENC_BIG_ENDIAN); ++ if (new_data_indicator_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator value [0..1]"); ++ } ++ ++ // HARQ process ++ guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN); ++ if (harq_process_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..15]"); ++ } ++ ++ // TPMI length ++ guint8 tpmi_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tpmi_length, 1, ENC_BIG_ENDIAN); ++ if (!(tpmi_length_value == 0 || tpmi_length_value == 2 || tpmi_length_value == 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi length value [0, 2, 4]"); ++ } ++ ++ // TPMI ++ guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN); ++ if (tpmi_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..15]"); ++ } ++ ++ // PMI flag ++ guint8 pmi_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pmi_flag, 1, ENC_BIG_ENDIAN); ++ if (pmi_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pmi flag value [0..1]"); ++ } ++ ++ // PMI ++ guint8 pmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pmi, 1, ENC_BIG_ENDIAN); ++ if (pmi_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pmi value [0..1]"); ++ } ++ ++ // HARQ resource offset ++ guint8 harq_resource_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_resource_offset, 1, ENC_BIG_ENDIAN); ++ if (harq_resource_offset_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq resource offset value [0..3]"); ++ } ++ ++ // DCI subframe repetition number ++ guint8 dci_subframe_reptition_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_dci_subframe_repetition_number, 1, ENC_BIG_ENDIAN); ++ if (!(dci_subframe_reptition_number_value >= 1 && dci_subframe_reptition_number_value <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci subframe repetition number value [1..4]"); ++ } ++ ++ // TPC ++ guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); ++ if (tpc_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]"); ++ } ++ ++ // Downlink assignment index Length ++ guint8 downlink_assignment_index_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index_length, 1, ENC_BIG_ENDIAN); ++ if (!(downlink_assignment_index_length_value == 0 || downlink_assignment_index_length_value == 2 || ++ downlink_assignment_index_length_value == 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignmnet index value [0, 2, 4]"); ++ } ++ ++ // Downlink assignment index ++ guint8 downlink_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index, 1, ENC_BIG_ENDIAN); ++ if (downlink_assignment_index_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignment index value [0..15]"); ++ } ++ ++ // Allocate PRACH flag ++ guint8 allocate_prach_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_allocate_prach_flag, 1, ENC_BIG_ENDIAN); ++ if (allocate_prach_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid allocate prach flag value [0..1]"); ++ } ++ ++ // Preamble index ++ guint8 preamble_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_preamble_index, 1, ENC_BIG_ENDIAN); ++ if (preamble_index_value > 63) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble index value [0..63]"); ++ } ++ ++ // PRACH mask index ++ guint8 prach_mask_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_prach_mask_index, 1, ENC_BIG_ENDIAN); ++ if (prach_mask_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach mask index value [0..15]"); ++ } ++ ++ // Starting CE Level ++ guint8 starting_ce_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_starting_ce_level, 1, ENC_BIG_ENDIAN); ++ if (starting_ce_level_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting ce level value [0..3]"); ++ } ++ ++ // SRS request ++ guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); ++ if (srs_request_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]"); ++ } ++ ++ // Antenna ports and scrambling identity flag ++ guint8 antenna_ports_and_scrambling_identity_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_and_scrambling_identity_flag, 1, ENC_BIG_ENDIAN); ++ if (antenna_ports_and_scrambling_identity_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports and scrambling identity flag value [0..1]"); ++ } ++ ++ // Antenna ports and scrambling identity ++ guint8 antenna_ports_and_scrambling_identity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_and_scrambling_identity, 1, ENC_BIG_ENDIAN); ++ if (antenna_ports_and_scrambling_identity_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports and scrambling identity value [0..3]"); ++ } ++ ++ // Frequency hopping enabled flag ++ guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN); ++ if (frequency_hopping_enabled_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]"); ++ } ++ ++ // Paging/Direct indication differentiation flag ++ guint8 paging_direct_indicaton_differentiation_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_paging_direct_indication_differentiation_flag, 1, ENC_BIG_ENDIAN); ++ if (paging_direct_indicaton_differentiation_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid paging/direct indication differentiation flag value [0..1]"); ++ } ++ ++ // Direct indication ++ ptvcursor_add(ptvc, hf_nfapi_direct_indication, 1, ENC_BIG_ENDIAN); ++ ++ // Total DCI length including padding ++ item = ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN); ++ ++ // Number of TX Antenna ports ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna_ports, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "Precoding", ett_nfapi_precoding, count, dissect_precoding_value); ++} ++static void dissect_ul_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // PDU Type ++ guint8 ul_pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ul_config_pdu_type, 1, ENC_BIG_ENDIAN); ++ if (ul_pdu_type_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul pdu type value [0..15]"); ++ } ++ ++ guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); ++ ++ guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); ++ dissect_tlv_list(ptvc, pinfo, pdu_end); ++} ++static void dissect_ul_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Number of PDUs ++ guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_pdus, 1, ENC_BIG_ENDIAN); ++ ++ // RACH/PRACH frequency resources ++ guint8 rach_prach_frequency_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_rach_prach_frequency_resources, 1, ENC_BIG_ENDIAN); ++ if (rach_prach_frequency_resources_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rach prach frequency resources value [0..1]"); ++ } ++ ++ // SRS present ++ guint8 srs_present_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_srs_present, 1, ENC_BIG_ENDIAN); ++ if (srs_present_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs present value [0..1]"); ++ } ++ ++ dissect_array_value(ptvc, pinfo, "UL Config PDU List", ett_nfapi_ul_config_request_pdu_list, num_pdu, dissect_ul_config_pdu); ++} ++static void dissect_ul_config_ulsch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Handle ++ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); ++ ++ // Size ++ ptvcursor_add(ptvc, hf_nfapi_size, 2, ENC_BIG_ENDIAN); ++ ++ // RNTI ++ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); ++ if (!(rnti_value >= 1)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); ++ } ++ ++ // Resource block start ++ guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); ++ if (resource_block_start_value > 99) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..99]"); ++ } ++ ++ // Number of resource blocks ++ guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_resource_blocks_value >= 1 && number_of_resource_blocks_value <= 100)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [1..100]"); ++ } ++ ++ // Modulation type ++ guint8 modulation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN); ++ if (!(modulation_type_value == 2 || modulation_type_value == 4 || modulation_type_value == 6)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid modulation type value [2, 4, 6]"); ++ } ++ ++ // Cyclic Shift 2 for DMRS ++ guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN); ++ if (cyclic_shift_2_for_drms_value > 99) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]"); ++ } ++ ++ // Frequency hopping enabled flag ++ guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN); ++ if (frequency_hopping_enabled_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]"); ++ } ++ ++ // Frequency hopping bits ++ guint8 frequency_hopping_bits_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_bits, 1, ENC_BIG_ENDIAN); ++ if (frequency_hopping_bits_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping bits value [0..3]"); ++ } ++ ++ // New data indication ++ guint8 new_data_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN); ++ if (new_data_indication_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator value [0..1]"); ++ } ++ ++ // Redundancy version ++ guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); ++ if (redundancy_version_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]"); ++ } ++ ++ // HARQ process number ++ guint8 harq_process_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_process_number, 1, ENC_BIG_ENDIAN); ++ if (harq_process_number_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process number value [0..15]"); ++ } ++ ++ // UL Tx mode ++ guint8 ul_tx_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ul_tx_mode, 1, ENC_BIG_ENDIAN); ++ if (ul_tx_mode_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul tx mode value [0..1]"); ++ } ++ ++ // Current TX NB ++ ptvcursor_add(ptvc, hf_nfapi_current_tx_nb, 1, ENC_BIG_ENDIAN); ++ ++ // N srs ++ guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_srs, 1, ENC_BIG_ENDIAN); ++ if (n_srs_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n_srs value [0..1]"); ++ } ++} ++static void dissect_ul_config_ulsch_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Resource allocation type ++ guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); ++ if (resource_allocation_type_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]"); ++ } ++ ++ // Resource block coding ++ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); ++ ++ // Transport blocks ++ guint8 transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transport_blocks, 1, ENC_BIG_ENDIAN); ++ if (!(transport_blocks_value >= 1 && transport_blocks_value <= 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1..2]"); ++ } ++ ++ // Transmission scheme ++ guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ul_transmission_scheme, 1, ENC_BIG_ENDIAN); ++ if (transmission_scheme_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission scheme value [0..1]"); ++ } ++ ++ // Number Of layers ++ guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_layers_value >= 1 && number_of_layers_value <=4 )) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..4]"); ++ } ++ ++ // Codebook Index ++ guint8 codebook_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN); ++ if (codebook_index_value > 23) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [0..23]"); ++ } ++ ++ // Disable sequence hopping flag ++ guint8 disable_sequence_hopping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_disable_sequence_hopping_flag, 1, ENC_BIG_ENDIAN); ++ if (disable_sequence_hopping_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid disable sequence hopping flag value [0..1]"); ++ } ++} ++static void dissect_ul_config_ulsch_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Virtual cell ID enabled flag ++ guint8 virtual_cell_id_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_virtual_cell_id_enabled_flag, 1, ENC_BIG_ENDIAN); ++ if (virtual_cell_id_enabled_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual cell id enabled flag value [0..1]"); ++ } ++ ++ // nPUSCH Identity ++ guint16 npusch_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_npusch_identity, 2, ENC_BIG_ENDIAN); ++ if (npusch_identity_value > 509) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npusch identity value [0..509]"); ++ } ++ ++ // DMRS Config flag ++ guint8 drms_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_drms_config_flag, 1, ENC_BIG_ENDIAN); ++ if (drms_config_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms config flag value [0..1]"); ++ } ++ ++ // nDMRS-CSH Identity ++ guint16 ndrms_csh_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ndrms_csh_identity, 2, ENC_BIG_ENDIAN); ++ if (ndrms_csh_identity_value > 509) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ndrms-csh identity value [0..509]"); ++ } ++ ++} ++static void dissect_ul_config_ulsch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // UE Type ++ guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN); ++ if (ue_type_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]"); ++ } ++ ++ // Total Number of repetitions ++ guint16 total_number_of_repetitions_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_total_number_of_repetitions, 2, ENC_BIG_ENDIAN); ++ if (!(total_number_of_repetitions_value >= 1 && total_number_of_repetitions_value <= 2048)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid total number of repetitions value [1..2048]"); ++ } ++ ++ // Repetition Number ++ guint16 repetition_number_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_repetition_number, 2, ENC_BIG_ENDIAN); ++ if (!(repetition_number_value >= 1 && repetition_number_value <= 2048)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [1..2048]"); ++ } ++ ++ // Initial transmission SF (io) ++ guint16 intial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_initial_sf_io, 2, ENC_BIG_ENDIAN); ++ if (!(intial_transmission_sf_io_value <= 10239 || intial_transmission_sf_io_value == 0xFFFF)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [0..10239, 0xFFFF]"); ++ } ++ ++ // Empy symbols due to re-tunning ++ // todo : decode as a bitmap ++ ptvcursor_add(ptvc, hf_nfapi_empty_symbols_due_to_retunning, 1, ENC_BIG_ENDIAN); ++} ++static void dissect_ul_config_init_tx_params_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // N srs initial ++ guint8 n_srs_initial_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_srs_initial, 1, ENC_BIG_ENDIAN); ++ if (n_srs_initial_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs initial value [0..1]"); ++ } ++ ++ // Initial number of resource blocks ++ guint8 initial_number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_initial_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); ++ if (!(initial_number_of_resource_blocks_value >= 1 && initial_number_of_resource_blocks_value <= 100)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial number of reosurce blocks value [1..100]"); ++ } ++ ++} ++static void dissect_ul_config_cqi_ri_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // DL CQI/PMI Size Rank = 1 ++ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_rank_1, 1, ENC_BIG_ENDIAN); ++ ++ // DL CQI/PMI Size Rank>1 ++ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_rank_greater_1, 1, ENC_BIG_ENDIAN); ++ ++ // RI Size ++ guint8 ri_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ri_size, 1, ENC_BIG_ENDIAN); ++ if (ri_size_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri size value [0..3]"); ++ } ++ ++ // Delta Offset CQI ++ guint8 delta_offset_cqi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_cqi, 1, ENC_BIG_ENDIAN); ++ if (delta_offset_cqi_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset cqi value [0..15]"); ++ } ++ ++ // Delta Offset RI ++ guint8 delta_offset_ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN); ++ if (delta_offset_ri_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..15]"); ++ } ++} ++static void dissect_ul_cqi_pmi_size(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Delta Offset RI ++ guint8 dl_cqi_pmi_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN); ++ if (dl_cqi_pmi_size_value > 255) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..255]"); ++ } ++} ++ ++static void dissect_ul_config_cqi_ri_info_rel9_later_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ // Report type ++ guint8 type = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_report_type, 1, ENC_BIG_ENDIAN); ++ if (type > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid report type value [0..1]"); ++ } ++ ++ // Delta offset CQI ++ guint8 delta_offset_cqi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_cqi, 1, ENC_BIG_ENDIAN); ++ if (delta_offset_cqi_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset cqi value [0..15]"); ++ } ++ ++ // Delta offset RI ++ guint8 delta_offset_ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN); ++ if (delta_offset_ri_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..15]"); ++ } ++ ++ switch (type) ++ { ++ case 0: ++ { ++ // DL CQI/PMI/RI size ++ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_ri_pmi_size, 1, ENC_BIG_ENDIAN); ++ ++ // Control Type ++ guint8 control_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_control_type, 1, ENC_BIG_ENDIAN); ++ if (control_type_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid control type value [0..1]"); ++ } ++ break; ++ } ++ case 1: ++ { ++ // todo : encoder not right for this case. ++ gint8 num_cc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_cc, 1, ENC_BIG_ENDIAN); ++ ++ if (!(num_cc_value >= 1 && num_cc_value <= 32)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of cc value [1..32]"); ++ } ++ ++ // UL CONFIG CQI PMI SIZE ++ dissect_array_value(ptvc, pinfo, "CQI PMI SIZE", ett_nfapi_cqi_pmi_size, 8, dissect_ul_cqi_pmi_size); ++ ++ /* ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "CCs"); ++ ++ for (int i = 0; i < num_cc; ++i) ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "[%d]", i); ++ ++ guint8 ri_size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_ri_size, 1, ENC_BIG_ENDIAN); ++ ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Rank"); ++ ++ for (int j = 0; j < ri_size; ++j) ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "[%d]", j); ++ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size, 1, ENC_BIG_ENDIAN); ++ ptvcursor_pop_subtree(ptvc); ++ } ++ ++ ptvcursor_pop_subtree(ptvc); ++ ++ ptvcursor_pop_subtree(ptvc); ++ } ++ ++ ptvcursor_pop_subtree(ptvc); ++ */ ++ ++ break; ++ } ++ } ++} ++static void dissect_ul_config_cqi_ri_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // DL CQI/PMI/RI size 2 ++ guint16 dl_cqi_ri_pmi_size_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_cqi_ri_pmi_size_2, 2, ENC_BIG_ENDIAN); ++ if (dl_cqi_ri_pmi_size_2_value < 255) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl cqi ri pmi size 2 value [>= 255]"); ++ } ++} ++static void dissect_ul_config_harq_info_ulsch_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // HARQ Size ++ guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); ++ if (harq_size_value > 21) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0..21]"); ++ } ++ ++ // Delta Offset HARQ ++ guint8 delta_offset_harq_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_harq, 1, ENC_BIG_ENDIAN); ++ if (delta_offset_harq_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset harq value [0..15]"); ++ } ++ ++ // ACK_NACK mode ++ guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tdd_ack_nack_mode, 1, ENC_BIG_ENDIAN); ++ if (ack_nack_mode_value > 5) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..5]"); ++ } ++} ++static void dissect_ul_config_harq_info_ulsch_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // HARQ Size 2 ++ ptvcursor_add(ptvc, hf_nfapi_harq_size_2, 2, ENC_BIG_ENDIAN); ++ ++ // Delta Offset HARQ 2 ++ guint8 delta_offset_harq_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_harq_2, 1, ENC_BIG_ENDIAN); ++ if (delta_offset_harq_2_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset harq 2 value [0..15]"); ++ } ++} ++static void dissect_ul_config_ue_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Handle ++ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); ++ ++ // RNTI ++ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); ++ if (rnti_value < 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); ++ } ++} ++static void dissect_ul_config_ue_info_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Virtual cell ID enabled flag ++ guint8 virtual_cell_id_enabled_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_virtual_cell_id_enabled_flag, 1, ENC_BIG_ENDIAN); ++ if (virtual_cell_id_enabled_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual cell id enabled flag value [0..1]"); ++ } ++ ++ // nPUCCH Identity ++ guint16 npucch_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_npucch_identity, 2, ENC_BIG_ENDIAN); ++ if (npucch_identity_value > 503) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch identity value [0..503]"); ++ } ++ ++} ++static void dissect_ul_config_ue_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // UE Type ++ guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN); ++ if (ue_type_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]"); ++ } ++ ++ // Empty symbols ++ // todo : use bit map decoding ++ ptvcursor_add(ptvc, hf_nfapi_empty_symbols, 1, ENC_BIG_ENDIAN); ++ ++ // Total Number of repetitions ++ guint16 total_number_of_repetitions_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_total_number_of_repetitions, 2, ENC_BIG_ENDIAN); ++ if (!(total_number_of_repetitions_value >= 1 && total_number_of_repetitions_value <= 32)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid total number of repetitions value [1..32]"); ++ } ++ ++ // Repetition Number ++ guint16 repetition_number_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_repetition_number, 2, ENC_BIG_ENDIAN); ++ if (!(repetition_number_value >= 1 && repetition_number_value <= 32)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [1..32]"); ++ } ++ ++} ++static void dissect_ul_config_cqi_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // PUCCH index ++ guint16 pucch_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pucch_index, 2, ENC_BIG_ENDIAN); ++ if (pucch_index_value > 1184) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index value [0..1184]"); ++ } ++ ++ // DL CQI/PMI Size ++ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size, 1, ENC_BIG_ENDIAN); ++} ++static void dissect_ul_config_cqi_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Number of PUCCH Resources ++ guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [1..2]"); ++ } ++ ++ //PUCCH Index P1 ++ guint16 pucch_index_p1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pucch_index_p1, 2, ENC_BIG_ENDIAN); ++ if (pucch_index_p1_value > 1184) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index p1 value [0..1184]"); ++ } ++} ++static void dissect_ul_config_cqi_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // CSI_mode ++ guint8 csi_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_csi_mode, 1, ENC_BIG_ENDIAN); ++ if (csi_mode_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi mode value [0..2]"); ++ } ++ ++ // DL CQI/PMI Size 2 ++ ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_2, 2, ENC_BIG_ENDIAN); ++ ++ // Starting PRB ++ guint8 starting_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_statring_prb, 1, ENC_BIG_ENDIAN); ++ if (starting_prb_value > 109) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting prb value [0..109]"); ++ } ++ ++ // n_PRB ++ guint8 n_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); ++ if (n_prb_value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n prb value [0..7]"); ++ } ++ ++ // cdm_Index ++ guint8 cdm_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_cdm_index, 1, ENC_BIG_ENDIAN); ++ if (cdm_index_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm index value [0..1]"); ++ } ++ ++ // N srs ++ guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_nsrs, 1, ENC_BIG_ENDIAN); ++ if (n_srs_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs value [0..1]"); ++ } ++ ++} ++static void dissect_ul_config_sr_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 pucch_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_index, 2, ENC_BIG_ENDIAN); ++ if (pucch_index_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index value [0..2047]"); ++ } ++} ++static void dissect_ul_config_sr_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Number of PUCCH Resources ++ guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [0..2047]"); ++ } ++ ++ // PUCCH Index P1 ++ guint16 pucch_index_p1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pucch_index_p1, 2, ENC_BIG_ENDIAN); ++ if (pucch_index_p1_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index p1 value [0..2047]"); ++ } ++} ++static void dissect_ul_config_harq_info_uci_rel10_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // HARQ size ++ guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); ++ if (harq_size_value > 21) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0..21]"); ++ } ++ ++ // ACK_NACK mode ++ guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tdd_ack_nack_mode, 1, ENC_BIG_ENDIAN); ++ if (ack_nack_mode_value > 5) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..5]"); ++ } ++ ++ // Number of PUCCH resources ++ guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); ++ if (number_of_pucch_resources_value > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [0..4]"); ++ } ++ ++ // n_PUCCH_1_0 ++ guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN); ++ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1 || ack_nack_mode_value == 2) ++ { ++ if (npucch_1_0_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..2047] (All Format 1a/1b)"); ++ } ++ } ++ else if (ack_nack_mode_value == 3) ++ { ++ if (npucch_1_0_value > 549) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..549] (Format 3)"); ++ } ++ } ++ ++ // n_PUCCH_1_1 ++ guint16 npucch_1_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_1, 2, ENC_BIG_ENDIAN); ++ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1 || ack_nack_mode_value == 2) ++ { ++ if (npucch_1_1_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 1 value [0..2047] (All Format 1a/1b)"); ++ } ++ } ++ ++ // n_PUCCH_1_2 ++ guint16 npucch_1_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_2, 2, ENC_BIG_ENDIAN); ++ if (ack_nack_mode_value == 2) ++ { ++ if (npucch_1_2_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 2 value [0..2047] (All Format 1a/1b)"); ++ } ++ } ++ ++ // n_PUCCH_1_3 ++ guint16 npucch_1_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_3, 2, ENC_BIG_ENDIAN); ++ if (ack_nack_mode_value == 2) ++ { ++ if (npucch_1_3_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 3 value [0..2047] (All Format 1a/1b)"); ++ } ++ } ++} ++static void dissect_ul_config_harq_info_uci_rel8_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // n_PUCCH_1_0 ++ // todo : how to work out the ack_nack mode? ++ guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN); ++ if (npucch_1_0_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..2047]"); ++ } ++ ++ // HARQ Size ++ guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); ++ if (!(harq_size_value >= 1 && harq_size_value <= 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [1..2]"); ++ } ++} ++static void dissect_ul_config_harq_info_uci_rel9_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // HARQ Size ++ guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* harq_size_item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN); ++ ++ // ACK_NAK mode ++ guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_fdd_ack_nack_mode, 1, ENC_BIG_ENDIAN); ++ if (ack_nack_mode_value > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..4]"); ++ } ++ ++ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 2) ++ { ++ if (!(harq_size_value >= 1 && harq_size_value <= 10)) ++ { ++ expert_add_info_format(pinfo, harq_size_item, &ei_invalid_range, "Invalid harq size value [1..10] (Format 1a/1b/3)"); ++ } ++ } ++ else if (ack_nack_mode_value == 3 || ack_nack_mode_value == 4) ++ { ++ if (harq_size_value != 0) ++ { ++ expert_add_info_format(pinfo, harq_size_item, &ei_invalid_range, "Invalid harq size value [0] (Format 4/5)"); ++ } ++ } ++ ++ // Number of PUCCH Resources ++ guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN); ++ if (number_of_pucch_resources_value == 0 || number_of_pucch_resources_value == 2) ++ { ++ if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [1..4] (Format 1a/1b/3)"); ++ } ++ } ++ else if (number_of_pucch_resources_value == 3 || number_of_pucch_resources_value == 4) ++ { ++ if (number_of_pucch_resources_value != 0) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0] (Format 4/5)"); ++ } ++ } ++ ++ // n_PUCCH_1_0 ++ guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN); ++ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) ++ { ++ if (npucch_1_0_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 0 value [0..2047] (Format 1a/1b/channel selection)"); ++ } ++ } ++ else if (ack_nack_mode_value == 2) ++ { ++ if (npucch_1_0_value > 549) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 0 value [0..549] (Format 3)"); ++ } ++ } ++ ++ // n_PUCCH_1_1 ++ guint16 npucch_1_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_1, 2, ENC_BIG_ENDIAN); ++ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) ++ { ++ if (npucch_1_1_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 1 value [0..2047] (Format 1a/1b/channel selection)"); ++ } ++ } ++ ++ // n_PUCCH_1_2 ++ guint16 npucch_1_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_2, 2, ENC_BIG_ENDIAN); ++ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) ++ { ++ if (npucch_1_2_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 2 value [0..2047] (Format 1a/1b/channel selection)"); ++ } ++ } ++ ++ // n_PUCCH_1_3 ++ guint16 npucch_1_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_3, 2, ENC_BIG_ENDIAN); ++ if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1) ++ { ++ if (npucch_1_3_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 3 value [0..2047] (Format 1a/1b/channel selection)"); ++ } ++ } ++} ++static void dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Num_ant_ports ++ guint8 num_ant_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_num_ant_ports, 1, ENC_BIG_ENDIAN); ++ if (!(num_ant_ports_value >= 1 && num_ant_ports_value <= 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid num ant ports value [1..2]"); ++ } ++ ++ // n_PUCCH_2_0 ++ // todo : how to work out the ack nack mode ++ guint16 npucch_2_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_0, 2, ENC_BIG_ENDIAN); ++ if (npucch_2_0_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 0 value [0..2047]"); ++ } ++ ++ // n_PUCCH_2_1 ++ guint16 npucch_2_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_1, 2, ENC_BIG_ENDIAN); ++ if (npucch_2_1_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 1 value [0..2047]"); ++ } ++ ++ // n_PUCCH_2_2 ++ guint16 npucch_2_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_2, 2, ENC_BIG_ENDIAN); ++ if (npucch_2_2_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 2 value [0..2047]"); ++ } ++ ++ // n_PUCCH_2_3 ++ guint16 npucch_2_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_3, 2, ENC_BIG_ENDIAN); ++ if (npucch_2_3_value > 2047) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 3 value [0..2047]"); ++ } ++ ++} ++static void dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // HARQ Size 2 ++ ptvcursor_add(ptvc, hf_nfapi_harq_size_2, 2, ENC_BIG_ENDIAN); ++ ++ // Starting PRB ++ guint8 starting_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_starting_prb, 1, ENC_BIG_ENDIAN); ++ if (starting_prb_value > 109) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting prb value [0..109]"); ++ } ++ ++ // n_PRB ++ guint8 n_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN); ++ if (n_prb_value > 109) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n prb value [0..7]"); ++ } ++ ++ // cdm_Index ++ guint8 cdm_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_cdm_index, 1, ENC_BIG_ENDIAN); ++ if (cdm_index_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm index value [0..1]"); ++ } ++ ++ // N srs ++ guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_nsrs, 1, ENC_BIG_ENDIAN); ++ if (n_srs_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs value [0..1]"); ++ } ++} ++static void dissect_ul_config_srs_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Handle ++ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); ++ ++ // Size ++ ptvcursor_add(ptvc, hf_nfapi_size, 2, ENC_BIG_ENDIAN); ++ ++ // RNTI ++ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); ++ if (rnti_value < 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); ++ } ++ ++ // SRS Bandwidth ++ guint8 srs_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_srs_bandwidth, 1, ENC_BIG_ENDIAN); ++ if (srs_bandwidth_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs bandwidth value [0..3]"); ++ } ++ ++ // Frequency Domain Position ++ guint8 frequency_domain_position_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_frequency_domain_position, 1, ENC_BIG_ENDIAN); ++ if (frequency_domain_position_value > 23) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency domain bandwidth value [0..23]"); ++ } ++ ++ // SRS Hopping Bandwidth ++ guint8 srs_hopping_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_srs_hopping_bandwidth, 1, ENC_BIG_ENDIAN); ++ if (srs_hopping_bandwidth_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs hopping bandwidth value [0..3]"); ++ } ++ ++ // Transmission Comb ++ guint8 transmission_comb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_comb, 1, ENC_BIG_ENDIAN); ++ if (transmission_comb_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission comb value [0..3]"); ++ } ++ ++ // ISRS / SRS-ConfigIndex ++ guint16 srs_config_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_i_srs, 2, ENC_BIG_ENDIAN); ++ if (srs_config_index_value > 1023) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid isrs/srs-configindex value [0..1023]"); ++ } ++ ++ // Sounding Reference Cyclic Shift ++ guint8 sounding_reference_cyclic_shift_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_sounding_reference_cyclic_shift, 1, ENC_BIG_ENDIAN); ++ if (sounding_reference_cyclic_shift_value > 11) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid sounding reference cyclic shift value [0..11]"); ++ } ++} ++static void dissect_ul_config_srs_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 antenna_port_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_antenna_port, 1, ENC_BIG_ENDIAN); ++ if (antenna_port_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna port value [0..2]"); ++ } ++} ++static void dissect_ul_config_srs_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 number_of_combs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_combs, 1, ENC_BIG_ENDIAN); ++ if (number_of_combs_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of combs value [0..1]"); ++ } ++} ++static void dissect_hi_dci0_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ++ // PDU Type ++ guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hi_dci0_pdu_type, 1, ENC_BIG_ENDIAN); ++ if (pdu_type_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..3]"); ++ } ++ ++ // PDU Size ++ guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); ++ ++ guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); ++ dissect_tlv_list(ptvc, pinfo, pdu_end); ++} ++static void dissect_hi_dci0_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // SFN/SF ++ ptvcursor_add(ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ ++ // Number of DCI ++ guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_dci_pdus, 1, ENC_BIG_ENDIAN); ++ ++ // Number of HI ++ num_pdu += tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_hi_pdus, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "HI DCI0 PDU List", ett_nfapi_hi_dci0_request_pdu_list, num_pdu, dissect_hi_dci0_pdu); ++} ++static void dissect_hi_dci0_hi_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Resource block start ++ guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); ++ if (resource_block_start_value > 100) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..100]"); ++ } ++ ++ // Cyclic Shift 2 for DMRS ++ guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN); ++ if (cyclic_shift_2_for_drms_value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]"); ++ } ++ ++ // HI value ++ guint8 hi_value_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_hi_value, 1, ENC_BIG_ENDIAN); ++ if (hi_value_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hi value [0..1]"); ++ } ++ ++ // I_PHICH ++ guint8 i_pich_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_i_phich, 1, ENC_BIG_ENDIAN); ++ if (i_pich_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid i phich value [0..1]"); ++ } ++ ++ // Transmission power ++ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); ++ if (transmission_power_value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); ++ } ++ ++} ++static void dissect_hi_dci0_hi_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Flag TB2 ++ guint8 flag_tb2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_flag_tb2, 1, ENC_BIG_ENDIAN); ++ if (flag_tb2_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid flag tb2 value [0..1]"); ++ } ++ ++ // HI Value 2 ++ guint8 hi2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_hi_value_2, 1, ENC_BIG_ENDIAN); ++ if (hi2_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hi2 value [0..1]"); ++ } ++ ++} ++static void dissect_hi_dci0_dci_ul_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // DCI format ++ guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ul_dci_format, 1, ENC_BIG_ENDIAN); ++ if (dci_format_value > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [0..4]"); ++ } ++ ++ // CCE index ++ guint8 cce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_cce_idx, 1, ENC_BIG_ENDIAN); ++ if (cce_index_value > 88) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cce index value [0..88]"); ++ } ++ ++ // Aggregation level ++ guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); ++ if (!(aggregation_level_value == 1 || aggregation_level_value == 2 || aggregation_level_value == 4 || ++ aggregation_level_value == 8)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [1, 2, 4, 8]"); ++ } ++ ++ // RNTI ++ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); ++ if (rnti_value < 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); ++ } ++ ++ // Resource block start ++ guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); ++ if (resource_block_start_value > 100) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..100]"); ++ } ++ ++ // Number of resource blocks ++ guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); ++ if (number_of_resource_blocks_value > 100) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [0..100]"); ++ } ++ ++ // MCS_1 ++ guint8 mcs_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mcs_1, 1, ENC_BIG_ENDIAN); ++ if (mcs_1_value > 31) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 1 value [0..31]"); ++ } ++ ++ // Cyclic Shift 2 for DMRS ++ guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN); ++ if (cyclic_shift_2_for_drms_value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]"); ++ } ++ ++ // Frequency hopping enabled flag ++ guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN); ++ if (frequency_hopping_enabled_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]"); ++ } ++ ++ // Frequency hopping bits ++ guint8 frequency_hopping_bit_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_bits, 1, ENC_BIG_ENDIAN); ++ if (frequency_hopping_bit_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping bits value [0..3]"); ++ } ++ ++ // New Data indication_1 ++ guint8 new_data_indication_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN); ++ if (new_data_indication_1_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication value [0..1]"); ++ } ++ ++ // UE TX antenna selection ++ guint8 ue_tx_antenna_selection_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ue_tx_antenna_selection, 1, ENC_BIG_ENDIAN); ++ if (ue_tx_antenna_selection_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue tx antenna selection value [0..2]"); ++ } ++ ++ // TPC ++ guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); ++ if (tpc_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value value [0..3]"); ++ } ++ ++ // CQI/CSI request ++ guint8 cqi_csi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_cqi_csi_request, 1, ENC_BIG_ENDIAN); ++ if (cqi_csi_value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cqi csi value [0..7]"); ++ } ++ ++ // UL index ++ guint8 ul_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ul_index, 1, ENC_BIG_ENDIAN); ++ if (ul_index_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul index value [0..3]"); ++ } ++ ++ // DL assignment index ++ guint8 dl_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_dl_assignment_index, 1, ENC_BIG_ENDIAN); ++ if (!(dl_assignment_index_value >= 1 && dl_assignment_index_value <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl assignment index value [1..4]"); ++ } ++ ++ // TPC bitmap ++ ptvcursor_add(ptvc, hf_nfapi_tpc_bitmap, 4, ENC_BIG_ENDIAN); ++ ++ // Transmission power ++ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); ++ if (transmission_power_value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); ++ } ++} ++static void dissect_hi_dci0_dci_ul_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Cross carrier scheduling flag ++ guint8 cross_carrier_scheduling_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_cross_carrier_scheduling_flag, 1, ENC_BIG_ENDIAN); ++ if (cross_carrier_scheduling_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cross carrier scheduling flag value [0..1]"); ++ } ++ ++ // Carrier indicator ++ guint8 carrier_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_carrier_indicator, 1, ENC_BIG_ENDIAN); ++ if (carrier_indicator_value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid carrier indicator value [0..7]"); ++ } ++ ++ // Size of CQI/CSI field ++ guint8 size_of_cqi_csi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_size_of_cqi_csi_feild, 1, ENC_BIG_ENDIAN); ++ if (size_of_cqi_csi_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid size of cqi/csi field value [0..2]"); ++ } ++ ++ // SRS flag ++ guint8 srs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_srs_flag, 1, ENC_BIG_ENDIAN); ++ if (srs_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs field value [0..1]"); ++ } ++ ++ // SRS request ++ //guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ //item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); ++ ++ // Resource allocation flag ++ guint8 resource_allocation_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_flag, 1, ENC_BIG_ENDIAN); ++ if (resource_allocation_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation flag value [0..1]"); ++ } ++ ++ // Resource allocation type ++ guint8 resource_alloction_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN); ++ if (resource_alloction_type_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]"); ++ } ++ ++ // Resource block coding ++ ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN); ++ ++ // MCS_2 ++ guint8 mcs_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mcs_2, 1, ENC_BIG_ENDIAN); ++ if (mcs_2_value > 31) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 2 value [0..31]"); ++ } ++ ++ // New data indication_2 ++ guint8 new_data_indication_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication_two, 1, ENC_BIG_ENDIAN); ++ if (new_data_indication_2_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication 2 value [0..1]"); ++ } ++ ++ // Number of antenna ports ++ guint8 number_of_antenna_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_antenna_ports, 1, ENC_BIG_ENDIAN); ++ if (number_of_antenna_ports_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of antenna ports value [0..2]"); ++ } ++ ++ // TPMI ++ guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN); ++ if (number_of_antenna_ports_value == 2) ++ { ++ if (tpmi_value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..7]"); ++ } ++ } ++ else if (number_of_antenna_ports_value == 4) ++ { ++ if (tpmi_value > 63) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..63]"); ++ } ++ } ++ ++ // Total DCI length including padding ++ ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN); ++ ++ // N_UL_RB ++ guint8 n_ul_rb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_n_ul_rb, 1, ENC_BIG_ENDIAN); ++ if (!(n_ul_rb_value == 6 || n_ul_rb_value == 15 || n_ul_rb_value == 25 || n_ul_rb_value == 50 || ++ n_ul_rb_value == 75 || n_ul_rb_value == 100)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n ul rb value [6, 15, 25, 50, 75, 100]"); ++ } ++} ++static void dissect_hi_dci0_dci_ul_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // PSCCH Resource ++ guint8 pscch_resource_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pscch_resource, 1, ENC_BIG_ENDIAN); ++ if (pscch_resource_value > 0x3F) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pscch resource value [0..0x3F]"); ++ } ++ ++ // Time resource pattern ++ guint8 time_resource_pattern_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_time_resource_pattern, 1, ENC_BIG_ENDIAN); ++ if (time_resource_pattern_value > 0x7F) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid time resource pattern value [0..0x7F]"); ++ } ++ ++} ++static void dissect_hi_dci0_mdpcch_dci_ul_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // MPDCCH Narrowband ++ guint8 mpdcch_narrowband_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_narrowband, 1, ENC_BIG_ENDIAN); ++ if (mpdcch_narrowband_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch narrowband value [0..15]"); ++ } ++ ++ // Number of PRB pairs ++ guint8 number_of_prb_pairs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_prb_pairs, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_prb_pairs_value == 2 || number_of_prb_pairs_value == 4 || number_of_prb_pairs_value == 6)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of prb pairs value [2, 4, 6]"); ++ } ++ ++ // Resource Block Assignment ++ guint8 resource_block_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_assignment, 1, ENC_BIG_ENDIAN); ++ if (resource_block_assignment_value > 14) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block assignment value [0..14]"); ++ } ++ ++ // MPDCCH transmission type ++ guint8 mpdcch_transmission_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_transmission_type, 1, ENC_BIG_ENDIAN); ++ if (mpdcch_transmission_type_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch transmission type value [0..1]"); ++ } ++ ++ // Start symbol ++ guint8 start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_start_symbol, 1, ENC_BIG_ENDIAN); ++ if (!(start_symbol_value >= 1 && start_symbol_value <=4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid start symbol value [0..1]"); ++ } ++ ++ // ECCE index ++ guint8 ecce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ecce_index, 1, ENC_BIG_ENDIAN); ++ if (ecce_index_value > 22) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ecce index value [0..22]"); ++ } ++ ++ // Aggregation level ++ guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN); ++ if (!(aggregation_level_value == 2 || aggregation_level_value == 4 || aggregation_level_value == 8 || ++ aggregation_level_value == 16 || aggregation_level_value == 24)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [2, 4, 8, 16, 24]"); ++ } ++ ++ // RNTI type ++ guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_rnti_type, 1, ENC_BIG_ENDIAN); ++ if (!(rnti_type_value == 0 || rnti_type_value == 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [0, 4]"); ++ } ++ ++ // RNTI ++ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); ++ if (rnti_value < 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); ++ } ++ ++ // CEMode ++ guint8 cemode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ce_mode, 1, ENC_BIG_ENDIAN); ++ if (!(cemode_value == 1 || cemode_value == 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cemode value [1,2]"); ++ } ++ ++ // DMRS scrambling init ++ guint16 drms_scrambling_init_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_drms_scrambling_init, 2, ENC_BIG_ENDIAN); ++ if (drms_scrambling_init_value < 503) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling init value [0..503]"); ++ } ++ ++ // Initial transmission SF (io) ++ guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN); ++ if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]"); ++ } ++ ++ // Transmission power ++ guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN); ++ if (transmission_power_value > 10000) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]"); ++ } ++ ++ // DCI format ++ guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_ul_dci_format, 1, ENC_BIG_ENDIAN); ++ if (!(dci_format_value == 1 || dci_format_value == 2 || dci_format_value == 4 || dci_format_value == 5)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [1, 2, 4, 5]"); ++ } ++ ++ // Resource block start ++ guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN); ++ if (resource_block_start_value > 99) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..99]"); ++ } ++ ++ // Number of resource blocks ++ guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_resource_blocks_value >= 1 && number_of_resource_blocks_value <= 6)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [1..6]"); ++ } ++ ++ // MCS ++ guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN); ++ if (mcs_value > 15) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs value [0..15]"); ++ } ++ ++ // PUSCH repetition levels ++ guint8 pusch_repetition_levels_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_pusch_repetition_levels, 1, ENC_BIG_ENDIAN); ++ if (dci_format_value == 4) ++ { ++ if (!(pusch_repetition_levels_value >= 1 && pusch_repetition_levels_value <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch repetition levels value [1..4]"); ++ } ++ } ++ else if (dci_format_value == 5) ++ { ++ if (!(pusch_repetition_levels_value >= 1 && pusch_repetition_levels_value <= 8)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch repetition levels value [1..8]"); ++ } ++ } ++ ++ // Frequency hopping flag ++ guint8 frequency_hopping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_flag, 1, ENC_BIG_ENDIAN); ++ if (frequency_hopping_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping flag value [0..1]"); ++ } ++ ++ // New Data indication ++ guint8 new_data_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN); ++ if (new_data_indication_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication value [0..1]"); ++ } ++ ++ // HARQ process ++ guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN); ++ if (harq_process_value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..7]"); ++ } ++ ++ // Redundancy version ++ guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN); ++ if (redundancy_version_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]"); ++ } ++ ++ // TPC ++ guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN); ++ if (tpc_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]"); ++ } ++ ++ // CSI request ++ guint8 csi_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_csi_request, 1, ENC_BIG_ENDIAN); ++ if (csi_request_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi request value [0..1]"); ++ } ++ ++ // UL index ++ guint8 ul_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ul_index, 1, ENC_BIG_ENDIAN); ++ if (ul_index_value > 3) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul index value [0..3]"); ++ } ++ ++ // DAI presence flag ++ guint8 dai_presence_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_dai_presence_flag, 1, ENC_BIG_ENDIAN); ++ if (dai_presence_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dai presence value [0..1]"); ++ } ++ ++ // DL assignment index ++ guint8 dl_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_dl_assignment_index, 1, ENC_BIG_ENDIAN); ++ if (!(dl_assignment_value >=1 && dl_assignment_value <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl assignment value [1, 2, 3, 4]"); ++ } ++ ++ // SRS request ++ guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN); ++ if (srs_request_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]"); ++ } ++ ++ // DCI subframe repetition number ++ guint8 dci_subframe_repetition_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_dci_subframe_repetition_number, 1, ENC_BIG_ENDIAN); ++ if (!(dci_subframe_repetition_number_value >= 1 && dci_subframe_repetition_number_value <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci subframe repetition number value [1..4]"); ++ } ++ ++ //TPC bitmap ++ ptvcursor_add(ptvc, hf_nfapi_tpc_bitmap, 4, ENC_BIG_ENDIAN); ++ ++ // Total DCI length including padding ++ ptvcursor_add(ptvc, hf_nfapi_total_dci_length_include_padding, 1, ENC_BIG_ENDIAN); ++ ++ // Number of TX Antenna ports ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna_ports, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "TX Antenna Ports", ett_nfapi_tx_antenna_ports, count, dissect_precoding_value); ++} ++static void dissect_rx_ue_info_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Handle ++ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); ++ ++ // RNTI ++ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); ++ if (rnti_value < 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); ++ } ++} ++static void dissect_rx_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Length ++ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); ++ ++ // Data offset ++ ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); ++ ++ // UL_CQI ++ ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); ++ ++ // Timing advance ++ guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); ++ if (timing_advance_value > 63) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]"); ++ } ++} ++static void dissect_rx_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Timing advance R9 ++ guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); ++ if (timing_advance_r9_value > 7690) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance r9 value [0..7690]"); ++ } ++ ++} ++static void dissect_harq_indication_data_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); ++ if (!(value_0 >= 1 && value_0 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); ++ } ++ ++ guint8 value_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_1, 1, ENC_BIG_ENDIAN); ++ if (!(value_1 >= 1 && value_1 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 1 [1..7]"); ++ } ++} ++static void dissect_harq_indication_data_format_1a_1b_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); ++ if (!(value_0 >= 1 && value_0 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); ++ } ++} ++static void dissect_harq_indication_data_multplexing_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); ++ if (!(value_0 >= 1 && value_0 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); ++ } ++ ++ guint8 value_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_1, 1, ENC_BIG_ENDIAN); ++ if (!(value_1 >= 1 && value_1 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 1 [1..7]"); ++ } ++ ++ guint8 value_2 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_2, 1, ENC_BIG_ENDIAN); ++ if (!(value_2 >= 1 && value_2 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 2 [1..7]"); ++ } ++ ++ guint8 value_3 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_3, 1, ENC_BIG_ENDIAN); ++ if (!(value_3 >= 1 && value_3 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 3 [1..7]"); ++ } ++ ++} ++static void dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); ++ if (!(value_0 >= 1 && value_0 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); ++ } ++} ++static void dissect_harq_indication_data_special_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0_special, 1, ENC_BIG_ENDIAN); ++ if (value_0 > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [0..4]"); ++ } ++} ++static void dissect_harq_indication_data_format_1a_1b_special_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0_special, 1, ENC_BIG_ENDIAN); ++ if (value_0 > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [0..4]"); ++ } ++} ++static void dissect_harq_indication_data_channel_selection_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); ++ if (!(value_0 >= 1 && value_0 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); ++ } ++} ++static void dissect_harq_indication_data_format_3_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); ++ if (!(value_0 >= 1 && value_0 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); ++ } ++} ++static void dissect_harq_indication_data_format_4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); ++ if (!(value_0 >= 1 && value_0 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); ++ } ++} ++static void dissect_harq_indication_data_format_5_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN); ++ if (!(value_0 >= 1 && value_0 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]"); ++ } ++} ++static void dissect_harq_indication_rel8_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN); ++ if (mode > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..4]"); ++ } ++ ++ guint8 number_of_ack_nack_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_ack_nack_value >= 1 && number_of_ack_nack_value <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]"); ++ } ++ ++ switch (mode) ++ { ++ case 0: ++ { ++ dissect_harq_indication_data_bundling_value(ptvc, pinfo); ++ break; ++ } ++ case 1: ++ { ++ dissect_harq_indication_data_multplexing_value(ptvc, pinfo); ++ break; ++ } ++ case 2: ++ { ++ dissect_harq_indication_data_special_bundling_value(ptvc, pinfo); ++ break; ++ } ++ }; ++} ++static void dissect_harq_indication_rel9_later_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 i; ++ proto_item* item; ++ ++ guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN); ++ if (mode > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..4]"); ++ } ++ ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN); ++ if (mode == 0 || mode == 1) ++ { ++ if (!(count >= 1 && count <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]"); ++ } ++ } ++ else if (mode == 3) ++ { ++ if (!(count >= 1 && count <= 8)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..8]"); ++ } ++ } ++ else if (mode == 4) ++ { ++ if (!(count >= 1 && count <= 21)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..21]"); ++ } ++ } ++ ++ ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "ACK/NACK Data"); ++ ++ for (i = 0; i < count; ++i) ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "[%d]", i); ++ ++ switch (mode) ++ { ++ case 0: ++ { ++ dissect_harq_indication_data_format_1a_1b_bundling_value(ptvc, pinfo); ++ break; ++ } ++ case 1: ++ { ++ dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvc, pinfo); ++ break; ++ } ++ case 2: ++ { ++ dissect_harq_indication_data_format_1a_1b_special_bundling_value(ptvc, pinfo); ++ break; ++ } ++ case 3: ++ { ++ dissect_harq_indication_data_channel_selection_value(ptvc, pinfo); ++ break; ++ } ++ case 4: ++ { ++ dissect_harq_indication_data_format_3_value(ptvc, pinfo); ++ break; ++ } ++ }; ++ ++ ptvcursor_pop_subtree(ptvc); ++ } ++ ++ ptvcursor_pop_subtree(ptvc); ++} ++static void dissect_harq_indication_rel13_later_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 i = 0; ++ proto_item* item; ++ ++ guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN); ++ if (mode > 6) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..6]"); ++ } ++ ++ ++ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 2, ENC_BIG_ENDIAN); ++ if (mode == 0 || mode == 1) ++ { ++ if (!(count >= 1 && count <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]"); ++ } ++ } ++ else if (mode == 3) ++ { ++ if (!(count >= 1 && count <= 8)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..8]"); ++ } ++ } ++ else if (mode == 4) ++ { ++ if (!(count >= 1 && count <= 21)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..21]"); ++ } ++ } ++ else if (mode == 5 || mode == 6) ++ { ++ if (count < 22) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [>= 22]"); ++ } ++ ++ } ++ ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "ACK/NACK Data"); ++ ++ for (i = 0; i < count; ++i) ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "[%d]", i); ++ ++ switch (mode) ++ { ++ case 0: ++ { ++ dissect_harq_indication_data_format_1a_1b_bundling_value(ptvc, pinfo); ++ break; ++ } ++ case 1: ++ { ++ dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvc, pinfo); ++ break; ++ } ++ case 2: ++ { ++ dissect_harq_indication_data_special_bundling_value(ptvc, pinfo); ++ break; ++ } ++ case 3: ++ { ++ dissect_harq_indication_data_channel_selection_value(ptvc, pinfo); ++ break; ++ } ++ case 4: ++ { ++ dissect_harq_indication_data_format_3_value(ptvc, pinfo); ++ break; ++ } ++ case 5: ++ { ++ dissect_harq_indication_data_format_4_value(ptvc, pinfo); ++ break; ++ } ++ case 6: ++ { ++ dissect_harq_indication_data_format_5_value(ptvc, pinfo); ++ break; ++ } ++ }; ++ ++ ptvcursor_pop_subtree(ptvc); ++ } ++ ++ ptvcursor_pop_subtree(ptvc); ++} ++static void dissect_harq_indication_rel8_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ guint8 harq_tb_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_1, 1, ENC_BIG_ENDIAN); ++ if (!(harq_tb_1 >= 1 && harq_tb_1 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb 1 [1..7]"); ++ } ++ ++ guint8 harq_tb_2 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_2, 1, ENC_BIG_ENDIAN); ++ if (!(harq_tb_2 >= 1 && harq_tb_2 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb 2 [1..7]"); ++ } ++ ++} ++static void dissect_harq_tb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint8 harq_tb_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_n, 1, ENC_BIG_ENDIAN); ++ if (!(harq_tb_1 >= 1 && harq_tb_1 <= 7)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb n [1..7]"); ++ } ++} ++static void dissect_harq_indication_rel9_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Mode ++ guint8 harq_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_fdd_harq_mode, 1, ENC_BIG_ENDIAN); ++ if (harq_mode_value > 2) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq mode value [0..2]"); ++ } ++ ++ // Number of ACK/NACK ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN); ++ ++ if (harq_mode_value == 0) ++ { ++ if (!(count >=1 && count <= 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..2]"); ++ } ++ } ++ else if (harq_mode_value == 1) ++ { ++ if (!(count >= 1 && count <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..4]"); ++ } ++ ++ } ++ else if (harq_mode_value == 2) ++ { ++ if (!(count >= 1 && count <= 10)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..10]"); ++ } ++ ++ } ++ ++ dissect_array_value(ptvc, pinfo, "HARQ TB List", ett_nfapi_harq_data, count, dissect_harq_tb_value); ++} ++static void dissect_harq_indication_rel13_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Mode ++ guint8 harq_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_fdd_harq_mode, 1, ENC_BIG_ENDIAN); ++ if (harq_mode_value > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq mode value [0..4]"); ++ } ++ ++ // Number of ACK/NACK ++ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 2, ENC_BIG_ENDIAN); ++ ++ if (harq_mode_value == 0) ++ { ++ if (!(count >= 1 && count <= 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..2]"); ++ } ++ } ++ else if (harq_mode_value == 1) ++ { ++ if (!(count >= 1 && count <= 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..4]"); ++ } ++ ++ } ++ else if (harq_mode_value == 2) ++ { ++ if (!(count >= 1 && count <= 10)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..10]"); ++ } ++ } ++ else if (harq_mode_value == 3 || harq_mode_value == 4) ++ { ++ if (count < 22) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [>= 22]"); ++ } ++ } ++ ++ dissect_array_value(ptvc, pinfo, "HARQ TB List", ett_nfapi_harq_data, count, dissect_harq_tb_value); ++} ++static void dissect_ul_cqi_information_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // UL_CQI ++ ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); ++ ++ // Channel ++ guint8 channel_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_channel, 1, ENC_BIG_ENDIAN); ++ if (channel_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid channel value [0..1]"); ++ } ++} ++static void dissect_crc_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // CRC Flag ++ guint8 crc_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_crc_flag, 1, ENC_BIG_ENDIAN); ++ if (crc_flag_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid crc flag value [0..1]"); ++ } ++} ++static void dissect_rx_cqi_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ //Length ++ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); ++ ++ // Data Offset ++ ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); ++ ++ // UL_CQI ++ ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); ++ ++ // RI ++ guint8 ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_ri, 1, ENC_BIG_ENDIAN); ++ if (ri_value > 8) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri value [0..8]"); ++ } ++ ++ // Timing Advance ++ guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); ++ if (timing_advance_value > 8) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]"); ++ } ++} ++static void dissect_ri_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // RI ++ guint8 ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ri, 1, ENC_BIG_ENDIAN); ++ if (ri_value > 8) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri value [0..8]"); ++ } ++} ++static void dissect_rx_cqi_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Length ++ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); ++ ++ // Data Offset ++ ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); ++ ++ // UL_CQI ++ ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); ++ ++ // Number of CC reported ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_cc_reported, 1, ENC_BIG_ENDIAN); ++ if (!(count >= 1 && count <= 5)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of CC reported value [1..5]"); ++ } ++ ++ dissect_array_value(ptvc, pinfo, "CC List", ett_nfapi_cc, count, dissect_ri_value); ++ ++ // Timing Advance ++ guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); ++ if (timing_advance_value > 63) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]"); ++ } ++ ++ // Timing Advance R9 ++ guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); ++ if (timing_advance_r9_value > 7690) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]"); ++ } ++} ++static void dissect_rach_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // RNTI ++ guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN); ++ if (rnti_value < 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]"); ++ } ++ ++ // Preamble ++ guint8 preamble_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_preamble, 1, ENC_BIG_ENDIAN); ++ if (preamble_value > 63) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble value [0..63]"); ++ } ++ ++ // Timing Advance ++ guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); ++ if (timing_advance_value > 1282) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..1282]"); ++ } ++ ++} ++static void dissect_rach_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Timing Advance R9 ++ guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); ++ if (timing_advance_r9_value > 7690) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]"); ++ } ++} ++static void dissect_rach_indication_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // RACH resource type ++ guint8 rach_resource_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rach_resource_type, 1, ENC_BIG_ENDIAN); ++ if (rach_resource_type_value > 4) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rach resource type value [0..4]"); ++ } ++} ++static void dissect_snr_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // SNR ++ ptvcursor_add(ptvc, hf_nfapi_snr, 1, ENC_BIG_ENDIAN); ++} ++static void dissect_srs_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Doppler estimation ++ ptvcursor_add(ptvc, hf_nfapi_doppler_estimation, 2, ENC_BIG_ENDIAN); ++ ++ // Timing Advance ++ guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); ++ if (timing_advance_value > 1282) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..1282]"); ++ } ++ ++ // Number of resource blocks ++ guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN); ++ ++ // RB start ++ ptvcursor_add(ptvc, hf_nfapi_rb_start, 1, ENC_BIG_ENDIAN); ++ ++ ++ dissect_array_value(ptvc, pinfo, "RB List", ett_nfapi_rbs, count, dissect_snr_value); ++} ++static void dissect_srs_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Timing Advance R9 ++ guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN); ++ if (timing_advance_r9_value > 7690) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]"); ++ } ++} ++static void dissect_srs_indication_rel10_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // UpPTS Symbol ++ guint8 uppts_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_up_pts_symbol, 1, ENC_BIG_ENDIAN); ++ if (uppts_symbol_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid up pts symbol value [0..1]"); ++ } ++ ++} ++static void dissect_tdd_channel_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint16 i = 0; ++ guint16 j = 0; ++ ++ // numPRBperSubband ++ ptvcursor_add(ptvc, hf_nfapi_number_prb_per_subband, 1, ENC_BIG_ENDIAN); ++ ++ // Number of subbands ++ guint8 num_subbands = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 1, ENC_BIG_ENDIAN); ++ ++ // numAntennas ++ guint8 num_phy_ant = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_antennas, 1, ENC_BIG_ENDIAN); ++ ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_subbands, "Subbands"); ++ ++ for (i = 0; i < num_subbands; ++i) ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_subbands, "[%d]", i); ++ ++ // subbandIndex ++ ptvcursor_add(ptvc, hf_nfapi_subband_index, 1, ENC_BIG_ENDIAN); ++ ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_antennas, "Physical Antennas"); ++ ++ for (j = 0; j < num_phy_ant; ++j) ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_antennas, "[%d]", j); ++ ++ // Channel ++ ptvcursor_add(ptvc, hf_nfapi_channel_coefficient, 2, ENC_BIG_ENDIAN); ++ ++ ptvcursor_pop_subtree(ptvc); ++ } ++ ++ ptvcursor_pop_subtree(ptvc); ++ ++ ptvcursor_pop_subtree(ptvc); ++ } ++ ++ ptvcursor_pop_subtree(ptvc); ++} ++static void dissect_srs_indication_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ //UL_RTOA ++ guint16 ul_rtoa_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_rtoa, 2, ENC_BIG_ENDIAN); ++ if (ul_rtoa_value > 4800) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul rtoa value [0..4800]"); ++ } ++} ++static void dissect_lbt_dl_config_request_pdsch_req_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Handle ++ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); ++ ++ // nCCA ++ ptvcursor_add(ptvc, hf_nfapi_mp_cca, 4, ENC_BIG_ENDIAN); ++ ++ // NCCA ++ ptvcursor_add(ptvc, hf_nfapi_n_cca, 4, ENC_BIG_ENDIAN); ++ ++ // Offset ++ guint32 ul_rtoa_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); ++ item = ptvcursor_add(ptvc, hf_nfapi_offset, 4, ENC_BIG_ENDIAN); ++ if (ul_rtoa_value > 999) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..999]"); ++ } ++ ++ // LTE TXOP SF ++ ptvcursor_add(ptvc, hf_nfapi_lte_txop_sf, 4, ENC_BIG_ENDIAN); ++ ++ // TXOP SFN/SF End ++ ptvcursor_add(ptvc, hf_nfapi_txop_sfn_sf_end, 2, ENC_BIG_ENDIAN); ++ ++ // LBT mode ++ guint32 lbt_mode = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); ++ item = ptvcursor_add(ptvc, hf_nfapi_lbt_mode, 4, ENC_BIG_ENDIAN); ++ if (lbt_mode > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..1]"); ++ } ++} ++static void dissect_lbt_dl_config_request_drs_req_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Handle ++ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); ++ ++ // Offset ++ guint32 ul_rtoa_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); ++ item = ptvcursor_add(ptvc, hf_nfapi_offset, 4, ENC_BIG_ENDIAN); ++ if (ul_rtoa_value > 999) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..999]"); ++ } ++ ++ // SFN/SF End ++ ptvcursor_add(ptvc, hf_nfapi_sfn_sf_end, 2, ENC_BIG_ENDIAN); ++ ++ // LBT mode ++ guint32 lbt_mode = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); ++ item = ptvcursor_add(ptvc, hf_nfapi_lbt_mode, 4, ENC_BIG_ENDIAN); ++ if (lbt_mode > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..1]"); ++ } ++} ++static void dissect_lbt_dl_config_request_pdsch_resp_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Handle ++ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); ++ ++ // result ++ guint32 result_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); ++ item = ptvcursor_add(ptvc, hf_nfapi_result, 4, ENC_BIG_ENDIAN); ++ if (result_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid result value [0..1]"); ++ } ++ ++ // LTE TXOP symbols ++ ptvcursor_add(ptvc, hf_nfapi_txop_symbols, 4, ENC_BIG_ENDIAN); ++ ++ // Initial Partial SF ++ guint32 initial_partial_sf_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); ++ item = ptvcursor_add(ptvc, hf_nfapi_initial_partial_sf, 4, ENC_BIG_ENDIAN); ++ if (initial_partial_sf_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial partial sf value [0..1]"); ++ } ++} ++static void dissect_lbt_dl_config_request_drs_resp_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // Handle ++ ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN); ++ ++ // result ++ guint32 result_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN); ++ item = ptvcursor_add(ptvc, hf_nfapi_result, 4, ENC_BIG_ENDIAN); ++ if (result_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid result value [0..1]"); ++ } ++} ++static void dissect_tx_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // PDU length ++ guint16 len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pdu_length, 2, ENC_BIG_ENDIAN); ++ ++ // PDU index ++ ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN); ++ ++ // PDU#N ++ ptvcursor_add(ptvc, hf_nfapi_pdu, len, ENC_NA); ++} ++static void dissect_tx_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of PDUs ++ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "TX PDU List", ett_nfapi_tx_request_pdu_list, num_pdu, dissect_tx_pdu); ++} ++static void dissect_harq_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Instance Length ++ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); ++ ++ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); ++ dissect_tlv_list(ptvc, pinfo, instance_end); ++} ++static void dissect_harq_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of HARQs ++ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_harqs, 2, ENC_BIG_ENDIAN); ++ ++ ++ dissect_array_value(ptvc, pinfo, "HARQ PDU List", ett_nfapi_harq_indication_pdu_list, num_pdu, dissect_harq_indication_pdu); ++} ++static void dissect_crc_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Instance Length ++ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); ++ ++ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); ++ dissect_tlv_list(ptvc, pinfo, instance_end); ++} ++static void dissect_crc_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of CRCs ++ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_crcs, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "CRC PDU List", ett_nfapi_crc_indication_pdu_list, num_pdu, dissect_crc_indication_pdu); ++} ++static void dissect_sr_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Instance Length ++ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); ++ ++ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); ++ dissect_tlv_list(ptvc, pinfo, instance_end); ++} ++static void dissect_rx_sr_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of SRs ++ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_srs, 2, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "SR PDU List", ett_nfapi_sr_indication_pdu_list, num_pdu, dissect_sr_indication_pdu); ++} ++static void dissect_cqi_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Instance Length ++ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); ++ ++ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); ++ dissect_tlv_list(ptvc, pinfo, instance_end); ++} ++static void dissect_rx_cqi_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of PDUs ++ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_cqi, 2, ENC_BIG_ENDIAN); ++ ++ guint16* lengths = (guint16*)wmem_alloc0(wmem_packet_scope(), num_pdu * 2); ++ memset(lengths, 0, num_pdu * 2); ++ ++ tvbuff_t* tvb = ptvcursor_tvbuff(ptvc); ++ guint8 tmp_offset = ptvcursor_current_offset(ptvc); ++ ++ int i = 0; ++ for (i = 0; i < num_pdu; ++i) ++ { ++ guint16 instance_len = tvb_get_ntohs(tvb, tmp_offset); ++ tmp_offset += 2; ++ guint8 pdu_end = tmp_offset + instance_len; ++ ++ while (tmp_offset < pdu_end) ++ { ++ guint16 tlv_id = tvb_get_ntohs(tvb, tmp_offset); ++ tmp_offset += 2; ++ guint16 tlv_len = tvb_get_ntohs(tvb, tmp_offset); ++ tmp_offset += 2; ++ ++ if (tlv_id == 0x202F) ++ { ++ lengths[i] = tvb_get_ntohs(tvb, tmp_offset); ++ } ++ else if (tlv_id == 0x2030) ++ { ++ lengths[i] = tvb_get_ntohs(tvb, tmp_offset); ++ } ++ ++ tmp_offset += tlv_len; ++ } ++ } ++ ++ dissect_array_value(ptvc, pinfo, "CQI PDU List", ett_nfapi_cqi_indication_pdu_list, num_pdu, dissect_cqi_indication_pdu); ++ ++ for (i = 0; i < num_pdu; ++i) ++ { ++ ptvcursor_add(ptvc, hf_nfapi_pdu, lengths[i], ENC_NA); ++ } ++} ++static void dissect_preamble_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Instance Length ++ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); ++ ++ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); ++ dissect_tlv_list(ptvc, pinfo, instance_end); ++} ++static void dissect_rach_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of Preambles ++ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_preambles, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "Preamble PDU List", ett_nfapi_preamble_indication_pdu_list, num_pdu, dissect_preamble_indication_pdu); ++} ++static void dissect_srs_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Instance Length ++ guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN); ++ guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2); ++ dissect_tlv_list(ptvc, pinfo, instance_end); ++} ++static void dissect_srs_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of UEs ++ guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_srss, 1, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "SRS PDU List", ett_nfapi_srs_indication_pdu_list, num_pdu, dissect_srs_indication_pdu); ++} ++static void dissect_lbt_dl_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // PDU Type ++ guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_lbt_dl_req_pdu_type, 1, ENC_BIG_ENDIAN); ++ if (pdu_type_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..1]"); ++ } ++ ++ guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); ++ guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); ++ ++ dissect_tlv_list(ptvc, pinfo, pdu_end); ++} ++static void dissect_lbt_dl_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of PDUs ++ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); ++ if (!(num_pdu >= 1 && num_pdu <= 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [1..2]"); ++ } ++ ++ dissect_array_value(ptvc, pinfo, "LBT DL PDU List", ett_nfapi_lbt_dl_config_pdu_list, num_pdu, dissect_lbt_dl_config_pdu); ++} ++static void dissect_lbt_dl_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // PDU Type ++ guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_lbt_dl_ind_pdu_type, 1, ENC_BIG_ENDIAN); ++ if (pdu_type_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..1]"); ++ } ++ ++ // PDU Size ++ guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN); ++ guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2); ++ dissect_tlv_list(ptvc, pinfo, pdu_end); ++} ++static void dissect_lbt_indication_message_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of PDUs ++ guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); ++ if (!(num_pdu >= 1 && num_pdu <= 2)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [1..2]"); ++ } ++ ++ dissect_array_value(ptvc, pinfo, "LBT DL PDU List", ett_nfapi_lbt_dl_indication_pdu_list, num_pdu, dissect_lbt_dl_indication_pdu); ++} ++static void dissect_lte_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Frequency Band Indicator ++ ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN); ++ ++ // Measurement Period ++ ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN); ++ ++ // Bandwidth ++ guint8 bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth, 1, ENC_BIG_ENDIAN); ++ if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 || ++ bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]"); ++ } ++ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++ ++ // Number of EARFCNs ++ guint8 num_earfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_earfcns, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "EARFCNs", ett_nfapi_earfcn_list, num_earfcns, dissect_earfcn_value); ++} ++static void dissect_uarfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // UARFCN ++ ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_utran_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Frequency Band Indicator ++ ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN); ++ ++ // Measurement Period ++ ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN); ++ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++ ++ // Number of UARFCNs ++ guint8 num_uarfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_uarfcns, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "UARFCNs", ett_nfapi_uarfcn_list, num_uarfcns, dissect_uarfcn_value); ++} ++static void dissect_arfcn_dir_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // ARFCN ++ ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); ++ ++ // Direction ++ guint8 direction_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_arfcn_direction, 1, ENC_BIG_ENDIAN); ++ if (direction_value > 1) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid direction value [0..1]"); ++ } ++ ++} ++static void dissect_geran_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Frequency Band Indicator ++ ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN); ++ ++ // Measurement Period ++ ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN); ++ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++ ++ // Number of ARFCNs ++ guint8 num_arfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_arfcns, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_arfcn_list, num_arfcns, dissect_arfcn_dir_value); ++} ++static void dissect_rssi_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // RSSI ++ ptvcursor_add(ptvc, hf_nfapi_rssi, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_rssi_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of RSSI ++ guint16 num_rssi = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_rssi, 2, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_rssi_list, num_rssi, dissect_rssi_value); ++} ++static void dissect_pci_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // PCI ++ ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_lte_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // EARFCN ++ ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); ++ ++ // Measurement Bandwidth ++ ptvcursor_add(ptvc, hf_nfapi_measurement_bandwidth, 1, ENC_BIG_ENDIAN); ++ ++ // Exhaustive Search ++ ptvcursor_add(ptvc, hf_nfapi_exhaustive_search, 1, ENC_BIG_ENDIAN); ++ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++ ++ // Number of PCI ++ guint8 num_pci = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_pci, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "PCIs", ett_nfapi_pci_list, num_pci, dissect_pci_value); ++} ++static void dissect_psc_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // PSC ++ ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_utran_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // UARFCN ++ ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); ++ ++ // Exhaustive Search ++ ptvcursor_add(ptvc, hf_nfapi_exhaustive_search, 1, ENC_BIG_ENDIAN); ++ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++ ++ // Number of PSC ++ guint8 num_psc = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_psc, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "PSCs", ett_nfapi_psc_list, num_psc, dissect_psc_value); ++} ++static void dissect_arfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // ARFCN ++ ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_geran_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++ ++ // Number of ARFCN ++ guint8 num_arfcn = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_arfcns, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_arfcn_list, num_arfcn, dissect_arfcn_value); ++} ++ ++static void dissect_lte_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // PCI ++ ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); ++ ++ // RSRP ++ ptvcursor_add(ptvc, hf_nfapi_rsrp, 1, ENC_BIG_ENDIAN); ++ ++ // RSRQ ++ ptvcursor_add(ptvc, hf_nfapi_rsrq, 1, ENC_BIG_ENDIAN); ++ ++ // Frequency Offset ++ ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_lte_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of LTE Cells Found ++ guint16 num_lte_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_lte_cells_found, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "LTE Cells Found", ett_nfapi_lte_cells_found_list, num_lte_cells, dissect_lte_cell_found_value); ++} ++static void dissect_utran_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // PSC ++ ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); ++ ++ // RSCP ++ ptvcursor_add(ptvc, hf_nfapi_rscp, 1, ENC_BIG_ENDIAN); ++ ++ // EcN0 ++ ptvcursor_add(ptvc, hf_nfapi_enco, 1, ENC_BIG_ENDIAN); ++ ++ // Frequency Offset ++ ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); ++} ++static void dissect_utran_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of UTRAN Cells Found ++ guint16 num_utran_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_utran_cells_found, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "UTRAN Cells Found", ett_nfapi_utran_cells_found_list, num_utran_cells, dissect_utran_cell_found_value); ++} ++static void dissect_geran_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // ARFCN ++ ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); ++ ++ // BSIC ++ ptvcursor_add(ptvc, hf_nfapi_bsic, 1, ENC_BIG_ENDIAN); ++ ++ // RxLev ++ ptvcursor_add(ptvc, hf_nfapi_rxlev, 1, ENC_BIG_ENDIAN); ++ ++ // RxQual ++ ptvcursor_add(ptvc, hf_nfapi_rxqual, 1, ENC_BIG_ENDIAN); ++ ++ // Frequency Offset ++ ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN); ++ ++ // SFN Offset ++ ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN); ++} ++static void dissect_geran_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of GSM Cells Found ++ guint16 num_geran_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_geran_cells_found, 2, ENC_BIG_ENDIAN); ++ dissect_array_value(ptvc, pinfo, "GERAN Cells Found", ett_nfapi_geran_cells_found_list, num_geran_cells, dissect_geran_cell_found_value); ++} ++static void dissect_pnf_cell_search_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pnf_search_state, len, ENC_NA); ++} ++static void dissect_pnf_cell_broadcast_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_pnf_broadcast_state, len, ENC_NA); ++} ++static void dissect_lte_broadcast_detect_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // EARFCN ++ ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); ++ ++ // PCI ++ ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); ++ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++} ++static void dissect_utran_broadcast_detect_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // UARFCN ++ ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); ++ ++ // PSC ++ ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); ++ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++} ++static void dissect_lte_broadcast_detect_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // Number of Tx Antenna ++ guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]"); ++ } ++ ++ ++ // MIB Length ++ guint16 mib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_mib_length, 2, ENC_BIG_ENDIAN); ++ ++ // MIB[MIB Length] ++ ptvcursor_add(ptvc, hf_nfapi_mib, mib_len, ENC_NA); ++ ++ // SFN Offset ++ ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN); ++} ++static void dissect_utran_broadcast_detect_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // MIB Length ++ guint16 mib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_mib_length, 2, ENC_BIG_ENDIAN); ++ ++ // MIB[MIB Length] ++ ptvcursor_add(ptvc, hf_nfapi_mib, mib_len, ENC_NA); ++ ++ // SFN Offset ++ ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN); ++} ++static void dissect_lte_system_information_schedule_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // EARFCN ++ ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); ++ ++ // PCI ++ ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); ++ ++ // Bandwidth ++ guint16 bandwidth_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth, 2, ENC_BIG_ENDIAN); ++ if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 || ++ bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]"); ++ } ++ ++ // PHICH Configuration ++ // todo : phich bit decode ++ ptvcursor_add(ptvc, hf_nfapi_phich_configuration, 1, ENC_BIG_ENDIAN); ++ ++ // Number of Tx Antenna ++ guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]"); ++ } ++ ++ // retryCount ++ ptvcursor_add(ptvc, hf_nfapi_retry_count, 1, ENC_BIG_ENDIAN); ++ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++} ++static void dissect_lte_system_information_schedule_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // this needs to be SIB 1 ++ guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_sib1, len, ENC_NA); ++} ++static void dissect_si_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ proto_item* item; ++ ++ // SI Periodicity ++ guint8 si_periodicity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_si_periodicity, 1, ENC_BIG_ENDIAN); ++ if (si_periodicity_value > 7) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si periodicity value [0..7]"); ++ } ++ ++ // SI Index ++ guint8 si_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_si_index, 1, ENC_BIG_ENDIAN); ++ if (si_index_value > 32) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si index value [0..32]"); ++ } ++} ++ ++static void dissect_lte_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // EARFCN ++ ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN); ++ ++ // PCI ++ ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN); ++ ++ // Downlink channel bandwidth ++ guint16 bandwidth_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_downlink_channel_bandwidth, 2, ENC_BIG_ENDIAN); ++ if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 || ++ bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]"); ++ } ++ ++ // PHICH Configuration ++ ptvcursor_add(ptvc, hf_nfapi_phich_configuration, 1, ENC_BIG_ENDIAN); ++ ++ // Number of Tx Antenna ++ guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN); ++ if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]"); ++ } ++ ++ // Number of SI Periodicity ++ guint8 si_priodicity = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_of_si_periodicity, 1, ENC_BIG_ENDIAN); ++ ++ dissect_array_value(ptvc, pinfo, "Number SI Periodicity", ett_nfapi_si_periodicity_list, si_priodicity, dissect_si_periodicity_value); ++ ++ // SI Window Length ++ guint8 si_window_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ item = ptvcursor_add(ptvc, hf_nfapi_si_window_length, 1, ENC_BIG_ENDIAN); ++ if (!(si_window_length_value == 1 || si_window_length_value == 2 || si_window_length_value == 5 || si_window_length_value == 10 || ++ si_window_length_value == 15 || si_window_length_value == 20 || si_window_length_value == 40)) ++ { ++ expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si window length value [1, 2, 5, 10, 15, 20, 40]"); ++ } ++ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++} ++static void dissect_utran_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // UARFCN ++ ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN); ++ ++ // PSC ++ ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN); ++ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++} ++static void dissect_geran_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // ARFCN ++ ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN); ++ ++ // BSIC ++ ptvcursor_add(ptvc, hf_nfapi_bsic, 1, ENC_BIG_ENDIAN); ++ ++ // Timeout ++ ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN); ++} ++static void dissect_lte_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // SIB Type ++ ptvcursor_add(ptvc, hf_nfapi_sib_type, 1, ENC_BIG_ENDIAN); ++ ++ // SIB Length ++ guint16 sib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_sib_len, 2, ENC_BIG_ENDIAN); ++ ++ // SIB[SIB Length] ++ ptvcursor_add(ptvc, hf_nfapi_sib, sib_len, ENC_NA); ++} ++static void dissect_utran_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // SIB Length ++ guint16 sib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_sib_len, 2, ENC_BIG_ENDIAN); ++ ++ // SIB[SIB Length] ++ ptvcursor_add(ptvc, hf_nfapi_sib, sib_len, ENC_NA); ++} ++static void dissect_geran_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ // SI Length ++ guint16 si_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_si_len, 2, ENC_BIG_ENDIAN); ++ ++ // SI[SI Length] ++ ptvcursor_add(ptvc, hf_nfapi_si, si_len, ENC_NA); ++} ++ ++static void dissect_rx_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_); ++ ++// Important the tags must be in numerical order so that they can be indexed correctly ++const tlv_t nfapi_tags[] = ++{ ++ { 0x1000, "PNF Param General", dissect_pnf_param_general_value }, ++ { 0x1001, "PNF PHY", dissect_pnf_phy_value }, ++ { 0x1002, "PNF RF", dissect_pnf_rf_value }, ++ { 0x1003, "PNF PHY RF Config", dissect_pnf_phy_rf_config_value }, ++ { 0x1004, "DL RS Tx power", dissect_dl_rs_tx_power_value }, ++ { 0x1005, "Received interference power", dissect_received_interference_power_value }, ++ { 0x1006, "Thermal noise power", dissect_thermal_noise_power_value }, ++ { 0x1007, "DL RS TX Power measurement", dissect_dl_rs_tx_power_measurement_value }, ++ { 0x1008, "Received Interference power measurement", dissect_received_interference_power_measurement_value }, ++ { 0x1009, "Thermal noise power measurement", dissect_thermal_noise_power_measurement_value }, ++ { 0x100A, "PNF PHY Rel 10", dissect_pnf_phy_rel10_value }, ++ { 0x100B, "PNF PHY Rel 11", dissect_pnf_phy_rel11_value }, ++ { 0x100C, "PNF PHY Rel 12", dissect_pnf_phy_rel12_value }, ++ { 0x100D, "PNF PHY Rel 13", dissect_pnf_phy_rel13_value }, ++}; ++ ++const tlv_t configuration_tags[] = ++{ ++ { 0x0000, NULL, NULL }, ++ { 0x0001, "Subframe config - Duplex Mode", dissect_duplex_mode_value }, ++ { 0x0002, "Subframe config - PCFICH power offset TLV", dissect_pcfich_power_offset_value }, ++ { 0x0003, "Subframe config - P-B", dissect_pb_value }, ++ { 0x0004, "Subframe config - DL cyclic prefix type", dissect_dl_cyclic_prefix_value }, ++ { 0x0005, "Subframe config - UL cyclic prefix type", dissect_ul_cyclic_prefix_value }, ++ { 0x0006, NULL, NULL }, ++ { 0x0007, NULL, NULL }, ++ { 0x0008, NULL, NULL }, ++ { 0x0009, NULL, NULL }, ++ { 0x000A, "RF config - Downlink channel bandwidth", dissect_dl_channel_bandwidth_value }, ++ { 0x000B, "RF config - Uplink channel bandwidth", dissect_ul_channel_bandwidth_value }, ++ { 0x000C, "RF config - Reference signal power", dissect_reference_signal_power_value }, ++ { 0x000D, "RF config - Tx antenna ports", dissect_tx_antenna_ports_value }, ++ { 0x000E, "RF config - Rx Antenna ports", dissect_rx_antenna_ports_value }, ++ { 0x000F, NULL, NULL }, ++ { 0x0010, NULL, NULL }, ++ { 0x0011, NULL, NULL }, ++ { 0x0012, NULL, NULL }, ++ { 0x0013, NULL, NULL }, ++ { 0x0014, "PHICH config - PHICH resource", dissect_phich_resource_value }, ++ { 0x0015, "PHICH config - PHICH duration", dissect_phich_duration_value }, ++ { 0x0016, "PHICH config - PHICH power offset", dissect_phich_power_offset_value }, ++ { 0x0017, NULL, NULL }, ++ { 0x0018, NULL, NULL }, ++ { 0x0019, NULL, NULL }, ++ { 0x001A, NULL, NULL }, ++ { 0x001B, NULL, NULL }, ++ { 0x001C, NULL, NULL }, ++ { 0x001D, NULL, NULL }, ++ { 0x001E, "SCH config - Primary synchronization signal EPRE/EPRERS", dissect_psch_synch_signal_epre_eprers_value }, ++ { 0x001F, "SCH config - Secondary synchronization signal EPRE/EPRERS", dissect_ssch_synch_signal_epre_eprers_value }, ++ { 0x0020, "SCH config - Physical Cell Id", dissect_physical_cell_id_value }, ++ { 0x0021, NULL, NULL }, ++ { 0x0022, NULL, NULL }, ++ { 0x0023, NULL, NULL }, ++ { 0x0024, NULL, NULL }, ++ { 0x0025, NULL, NULL }, ++ { 0x0026, NULL, NULL }, ++ { 0x0027, NULL, NULL }, ++ { 0x0028, "PRACH config - Configuration index", dissect_prach_configuration_index_value }, ++ { 0x0029, "PRACH config - Root sequence index", dissect_prach_root_sequence_index_value }, ++ { 0x002A, "PRACH config - Zero correlation zone configuration", dissect_prach_zero_correlation_zone_configuration_value }, ++ { 0x002B, "PRACH config - High speed flag", dissect_prach_high_speed_flag_value }, ++ { 0x002C, "PRACH config - Frequency offset", dissect_prach_frequency_offset_value }, ++ { 0x002D, NULL, NULL }, ++ { 0x002E, NULL, NULL }, ++ { 0x002F, NULL, NULL }, ++ { 0x0030, NULL, NULL }, ++ { 0x0031, NULL, NULL }, ++ { 0x0032, "PUSCH config - Hopping mode", dissect_pusch_hopping_mode_value }, ++ { 0x0033, "PUSCH config - Hopping offset", dissect_pusch_hopping_offset_value }, ++ { 0x0034, "PUSCH config - Number of sub-bands", dissect_pusch_number_of_subbands_value }, ++ { 0x0035, NULL, NULL }, ++ { 0x0036, NULL, NULL }, ++ { 0x0037, NULL, NULL }, ++ { 0x0038, NULL, NULL }, ++ { 0x0039, NULL, NULL }, ++ { 0x003A, NULL, NULL }, ++ { 0x003B, NULL, NULL }, ++ { 0x003C, "PUCCH config - Delta PUCCH Shift", dissect_pucch_delta_pucch_shift_value }, ++ { 0x003D, "PUCCH config - N_CQI RB", dissect_pucch_n_cqi_rb_value }, ++ { 0x003E, "PUCCH config - N_AN CS", dissect_pucch_n_an_cs_value }, ++ { 0x003F, "PUCCH config - N1Pucch-AN", dissect_pucch_n1_pucch_an_value }, ++ { 0x0040, NULL, NULL }, ++ { 0x0041, NULL, NULL }, ++ { 0x0042, NULL, NULL }, ++ { 0x0043, NULL, NULL }, ++ { 0x0044, NULL, NULL }, ++ { 0x0045, NULL, NULL }, ++ { 0x0046, "SRS config - Bandwidth configuration", dissect_srs_bandwidth_configuration_value }, ++ { 0x0047, "SRS config - MaxUpPTS", dissect_srs_max_uppts_value }, ++ { 0x0048, "SRS config - SRS subframe configuration", dissect_srs_subframe_configuration_value }, ++ { 0x0049, "SRS config - SRS AckNack SRS simultaneous transmission", dissect_srs_acknack_srs_sim_tx_value }, ++ { 0x004A, NULL, NULL }, ++ { 0x004B, NULL, NULL }, ++ { 0x004C, NULL, NULL }, ++ { 0x004D, NULL, NULL }, ++ { 0x004E, NULL, NULL }, ++ { 0x004F, NULL, NULL }, ++ { 0x0050, "Uplink reference signal config - Uplink RS hopping", dissect_uplink_rs_hopping_value }, ++ { 0x0051, "Uplink reference signal config - Group assignment (delta sequence-shift pattern)", dissect_group_assignment_value }, ++ { 0x0052, "Uplink reference signal config - Cyclic Shift 1 for DMRS", dissect_cyclic_shift_1_for_drms_value }, ++ { 0x0053, NULL, NULL }, ++ { 0x0054, NULL, NULL }, ++ { 0x0055, NULL, NULL }, ++ { 0x0056, NULL, NULL }, ++ { 0x0057, NULL, NULL }, ++ { 0x0058, NULL, NULL }, ++ { 0x0059, NULL, NULL }, ++ { 0x005A, "TDD frame structure config - Subframe assignment", dissect_tdd_subframe_assignement_value }, ++ { 0x005B, "TDD frame structure config - Special sub-frame patterns", dissect_tdd_subframe_patterns_value }, ++ { 0x005C, NULL, NULL }, ++ { 0x005D, NULL, NULL }, ++ { 0x005E, NULL, NULL }, ++ { 0x005F, NULL, NULL }, ++ { 0x0060, NULL, NULL }, ++ { 0x0061, NULL, NULL }, ++ { 0x0062, NULL, NULL }, ++ { 0x0063, NULL, NULL }, ++ { 0x0064, "LAA config - ED Threshold for LBT for PDSCH", dissect_laa_ed_threashold_for_lbt_for_pdsch_value }, ++ { 0x0065, "LAA config - ED Threshold for LBT for DRS", dissect_laa_ed_threashold_for_lbt_for_drs_value }, ++ { 0x0066, "LAA config - PD Threshold", dissect_laa_pd_threshold_value }, ++ { 0x0067, "LAA config - Multi carrier type", dissect_laa_multi_carrier_type_value }, ++ { 0x0068, "LAA config - Multi carrier TX", dissect_laa_multi_carrier_tx_value }, ++ { 0x0069, "LAA config - Multi carrier freeze", dissect_laa_multi_carrier_freeze_value }, ++ { 0x006A, "LAA config - Tx antenna ports for DRS", dissect_laa_tx_antenna_port_for_drs_value }, ++ { 0x006B, "LAA config - Transmission power for DRS", dissect_laa_transmission_power_for_drs_value }, ++ { 0x006C, NULL, NULL }, ++ { 0x006D, NULL, NULL }, ++ { 0x006E, NULL, NULL }, ++ { 0x006F, NULL, NULL }, ++ { 0x0070, NULL, NULL }, ++ { 0x0071, NULL, NULL }, ++ { 0x0072, NULL, NULL }, ++ { 0x0073, NULL, NULL }, ++ { 0x0074, NULL, NULL }, ++ { 0x0075, NULL, NULL }, ++ { 0x0076, NULL, NULL }, ++ { 0x0077, NULL, NULL }, ++ { 0x0078, "eMTC config - PBCH Repetitions enable R13", dissect_emtc_pbch_repeitions_enabled_r13_value }, ++ { 0x0079, "eMTC config - PRACH CAT-M Root sequence index", dissect_emtc_prach_cat_m_root_sequence_index_value }, ++ { 0x007A, "eMTC config - PRACH CAT-M Zero correlation zone configuration", dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value }, ++ { 0x007B, "eMTC config - PRACH CAT-M High speed flag", dissect_emtc_prach_cat_m_high_speed_flag_value }, ++ { 0x007C, "eMTC config - PRACH CE level #0 Enable", dissect_emtc_prach_ce_level_0_enabled_value }, ++ { 0x007D, "eMTC config - PRACH CE level #0 Configuration index", dissect_emtc_prach_ce_level_0_configuration_offset_value }, ++ { 0x007E, "eMTC config - PRACH CE level #0 Frequency offset", dissect_emtc_prach_ce_level_0_frequency_offset_value }, ++ { 0x007F, "eMTC config - PRACH CE level #0 Number of repetitions per attempt", dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value }, ++ { 0x0080, "eMTC config - CE level #0 Starting subframe periodicity", dissect_emtc_ce_level_0_starting_subframe_periodicity_value }, ++ { 0x0081, "eMTC config - PRACH CE level #0 Hopping Enable", dissect_emtc_preach_ce_level_0_hopping_enabled_value }, ++ { 0x0082, "eMTC config - PRACH CE level #0 Hopping Offset", dissect_emtc_preach_ce_level_0_hopping_offset_value }, ++ { 0x0083, "eMTC config - PRACH CE level #1 Enable", dissect_emtc_prach_ce_level_1_enabled_value }, ++ { 0x0084, "eMTC config - PRACH CE level #1 Configuration index", dissect_emtc_prach_ce_level_1_configuration_offset_value }, ++ { 0x0085, "eMTC config - PRACH CE level #1 Frequency offset", dissect_emtc_prach_ce_level_1_frequency_offset_value }, ++ { 0x0086, "eMTC config - PRACH CE level #1 Number of repetitions per attempt", dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value }, ++ { 0x0087, "eMTC config - CE level #1 Starting subframe periodicity", dissect_emtc_ce_level_1_starting_subframe_periodicity_value }, ++ { 0x0088, "eMTC config - PRACH CE level #1 Hopping Enable", dissect_emtc_preach_ce_level_1_hopping_enabled_value }, ++ { 0x0089, "eMTC config - PRACH CE level #1 Hopping Offset", dissect_emtc_preach_ce_level_1_hopping_offset_value }, ++ { 0x008A, "eMTC config - PRACH CE level #2 Enable", dissect_emtc_prach_ce_level_2_enabled_value }, ++ { 0x008B, "eMTC config - PRACH CE level #2 Configuration index", dissect_emtc_prach_ce_level_2_configuration_offset_value }, ++ { 0x008C, "eMTC config - PRACH CE level #2 Frequency offset", dissect_emtc_prach_ce_level_2_frequency_offset_value }, ++ { 0x008D, "eMTC config - PRACH CE level #2 Number of repetitions per attempt", dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value }, ++ { 0x008E, "eMTC config - CE level #2 Starting subframe periodicity", dissect_emtc_ce_level_2_starting_subframe_periodicity_value }, ++ { 0x008F, "eMTC config - PRACH CE level #2 Hopping Enable", dissect_emtc_preach_ce_level_2_hopping_enabled_value }, ++ { 0x0090, "eMTC config - PRACH CE level #2 Hopping Offset", dissect_emtc_preach_ce_level_2_hopping_offset_value }, ++ { 0x0091, "eMTC config - PRACH CE level #3 Enable", dissect_emtc_prach_ce_level_3_enabled_value }, ++ { 0x0092, "eMTC config - PRACH CE level #3 Configuration index", dissect_emtc_prach_ce_level_3_configuration_offset_value }, ++ { 0x0093, "eMTC config - PRACH CE level #3 Frequency offset", dissect_emtc_prach_ce_level_3_frequency_offset_value }, ++ { 0x0094, "eMTC config - PRACH CE level #3 Number of repetitions per attempt", dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value }, ++ { 0x0095, "eMTC config - CE level #3 Starting subframe periodicity", dissect_emtc_ce_level_3_starting_subframe_periodicity_value }, ++ { 0x0096, "eMTC config - PRACH CE level #3 Hopping Enable", dissect_emtc_preach_ce_level_3_hopping_enabled_value }, ++ { 0x0097, "eMTC config - PRACH CE level #3 Hopping Offset", dissect_emtc_preach_ce_level_3_hopping_offset_value }, ++ { 0x0098, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeA", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value }, ++ { 0x0099, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeB", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value }, ++ { 0x009A, NULL, NULL }, ++ { 0x009B, NULL, NULL }, ++ { 0x009C, NULL, NULL }, ++ { 0x009D, NULL, NULL }, ++ { 0x009E, NULL, NULL }, ++ { 0x009F, NULL, NULL }, ++ { 0x00A0, NULL, NULL }, ++ { 0x00A1, NULL, NULL }, ++ { 0x00A2, NULL, NULL }, ++ { 0x00A3, NULL, NULL }, ++ { 0x00A4, NULL, NULL }, ++ { 0x00A5, NULL, NULL }, ++ { 0x00A6, NULL, NULL }, ++ { 0x00A7, NULL, NULL }, ++ { 0x00A8, NULL, NULL }, ++ { 0x00A9, NULL, NULL }, ++ { 0x00AA, NULL, NULL }, ++ { 0x00AB, NULL, NULL }, ++ { 0x00AC, NULL, NULL }, ++ { 0x00AD, NULL, NULL }, ++ { 0x00AE, NULL, NULL }, ++ { 0x00AF, NULL, NULL }, ++ { 0x00B0, NULL, NULL }, ++ { 0x00B1, NULL, NULL }, ++ { 0x00B2, NULL, NULL }, ++ { 0x00B3, NULL, NULL }, ++ { 0x00B4, NULL, NULL }, ++ { 0x00B5, NULL, NULL }, ++ { 0x00B6, NULL, NULL }, ++ { 0x00B7, NULL, NULL }, ++ { 0x00B8, NULL, NULL }, ++ { 0x00B9, NULL, NULL }, ++ { 0x00BA, NULL, NULL }, ++ { 0x00BB, NULL, NULL }, ++ { 0x00BC, NULL, NULL }, ++ { 0x00BD, NULL, NULL }, ++ { 0x00BE, NULL, NULL }, ++ { 0x00BF, NULL, NULL }, ++ { 0x00C0, NULL, NULL }, ++ { 0x00C1, NULL, NULL }, ++ { 0x00C2, NULL, NULL }, ++ { 0x00C3, NULL, NULL }, ++ { 0x00C4, NULL, NULL }, ++ { 0x00C5, NULL, NULL }, ++ { 0x00C6, NULL, NULL }, ++ { 0x00C7, NULL, NULL }, ++ { 0x00C8, "Layer 2/3 - Downlink Bandwidth Support", dissect_dl_bandwidth_support_value }, ++ { 0x00C9, "Layer 2/3 - Uplink Bandwidth Support", dissect_ul_bandwidth_support_value }, ++ { 0x00CA, "Layer 2/3 - Downlink modulation support", dissect_dl_modulation_value }, ++ { 0x00CB, "Layer 2/3 - Uplink modulation support", dissect_ul_modulation_value }, ++ { 0x00CC, "Layer 2/3 - PHY antenna capability", dissect_phy_antenna_capability_value }, ++ { 0x00CD, "Layer 2/3 - Release capability", dissect_release_capability_value }, ++ { 0x00CE, "Layer 2/3 - MBSFN capability", dissect_mbsfn_value }, ++ { 0x00CF, NULL, NULL }, ++ { 0x00D0, NULL, NULL }, ++ { 0x00D1, "LAA Capability - LAA support", dissect_laa_support_value }, ++ { 0x00D2, "LAA Capability - PD sensing LBT support", dissect_laa_pd_sensing_lbt_support_value }, ++ { 0x00D3, "LAA Capability - Multi carrier LBT support", dissect_laa_multi_carrier_lbt_support_value }, ++ { 0x00D4, "LAA Capability - Partial SF support", dissect_laa_partial_sf_support_value }, ++ { 0x00D5, NULL, NULL }, ++ { 0x00D6, NULL, NULL }, ++ { 0x00D7, NULL, NULL }, ++ { 0x00D8, NULL, NULL }, ++ { 0x00D9, NULL, NULL }, ++ { 0x00DA, NULL, NULL }, ++ { 0x00DB, NULL, NULL }, ++ { 0x00DC, NULL, NULL }, ++ { 0x00DD, NULL, NULL }, ++ { 0x00DE, NULL, NULL }, ++ { 0x00DF, NULL, NULL }, ++ { 0x00E0, NULL, NULL }, ++ { 0x00E1, NULL, NULL }, ++ { 0x00E2, NULL, NULL }, ++ { 0x00E3, NULL, NULL }, ++ { 0x00E4, NULL, NULL }, ++ { 0x00E5, NULL, NULL }, ++ { 0x00E6, NULL, NULL }, ++ { 0x00E7, NULL, NULL }, ++ { 0x00E8, NULL, NULL }, ++ { 0x00E9, NULL, NULL }, ++ { 0x00EA, NULL, NULL }, ++ { 0x00EB, NULL, NULL }, ++ { 0x00EC, NULL, NULL }, ++ { 0x00ED, NULL, NULL }, ++ { 0x00EE, NULL, NULL }, ++ { 0x00EF, NULL, NULL }, ++ { 0x00F0, "Layer 2/3 - Data report mode", dissect_data_report_mode_value }, ++ { 0x00F1, "Layer 2/3 - SFN/SF", dissect_sfn_sf_value }, ++ { 0x00F2, NULL, NULL }, ++ { 0x00F3, NULL, NULL }, ++ { 0x00F4, NULL, NULL }, ++ { 0x00F5, NULL, NULL }, ++ { 0x00F6, NULL, NULL }, ++ { 0x00F7, NULL, NULL }, ++ { 0x00F8, NULL, NULL }, ++ { 0x00F9, NULL, NULL }, ++ { 0x00FA, "Layer 1 - PHY state", dissect_phy_state_value }, ++ { 0x00FB, NULL, NULL }, ++ { 0x00FC, NULL, NULL }, ++ { 0x00FD, NULL, NULL }, ++ { 0x00FE, NULL, NULL }, ++ { 0x00FF, NULL, NULL }, ++ { 0x0100, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv4_value }, ++ { 0x0101, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv6_value }, ++ { 0x0102, "NFAPI - P7 Port", dissect_p7_vnf_port_value }, ++ { 0x0103, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv4_value }, ++ { 0x0104, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv6_value }, ++ { 0x0105, "NFAPI - P7 Port", dissect_p7_pnf_port_value }, ++ { 0x0106, NULL, NULL }, ++ { 0x0107, NULL, NULL }, ++ { 0x0108, NULL, NULL }, ++ { 0x0109, NULL, NULL }, ++ { 0x010A, "NFAPI - Downlink UEs per Subframe", dissect_downlink_ues_per_subframe_value }, ++ { 0x010B, "NFAPI - Uplink UEs per Subframe", dissect_uplink_ues_per_subframe_value }, ++ { 0x010C, NULL, NULL }, ++ { 0x010D, NULL, NULL }, ++ { 0x010E, NULL, NULL }, ++ { 0x010F, NULL, NULL }, ++ { 0x0110, NULL, NULL }, ++ { 0x0111, NULL, NULL }, ++ { 0x0112, NULL, NULL }, ++ { 0x0113, NULL, NULL }, ++ { 0x0114, "NFAPI - nFAPI RF Bands", dissect_rf_bands_value }, ++ { 0x0115, NULL, NULL }, ++ { 0x0116, NULL, NULL }, ++ { 0x0117, NULL, NULL }, ++ { 0x0118, NULL, NULL }, ++ { 0x0119, NULL, NULL }, ++ { 0x011A, NULL, NULL }, ++ { 0x011B, NULL, NULL }, ++ { 0x011C, NULL, NULL }, ++ { 0x011D, NULL, NULL }, ++ { 0x011E, "NFAPI - Timing window", dissect_timing_window_value }, ++ { 0x011F, "NFAPI - Timing info mode", dissect_timing_info_mode_value }, ++ { 0x0120, "NFAPI - Timing info period", dissect_timing_info_period_value }, ++ { 0x0121, NULL, NULL }, ++ { 0x0122, NULL, NULL }, ++ { 0x0123, NULL, NULL }, ++ { 0x0124, NULL, NULL }, ++ { 0x0125, NULL, NULL }, ++ { 0x0126, NULL, NULL }, ++ { 0x0127, NULL, NULL }, ++ { 0x0128, "NFAPI - Maximum Transmit Power", dissect_maximum_transmit_power_value }, ++ { 0x0129, "NFAPI - EARFCN", dissect_earfcn_value }, ++ { 0x012A, NULL, NULL }, ++ { 0x012B, NULL, NULL }, ++ { 0x012C, NULL, NULL }, ++ { 0x012D, NULL, NULL }, ++ { 0x012E, NULL, NULL }, ++ { 0x012F, NULL, NULL }, ++ { 0x0130, "NFAPI - NMM GSM Frequency Bands", dissect_nmm_gsm_frequency_bands_value }, ++ { 0x0131, "NFAPI - NMM UMTS Frequency Bands", dissect_nmm_umts_frequency_bands_value }, ++ { 0x0132, "NFAPI - NMM LTE Frequency Bands", dissect_nmm_lte_frequency_bands_value }, ++ { 0x0133, "NFAPI - NMM Uplink RSSI supported", dissect_nmm_uplink_rssi_supported_value }, ++}; ++ ++const tlv_t p7_tags[] = ++{ ++ { 0x2000, "DL Config Request Body", dissect_dl_config_request_body_value }, ++ { 0x2001, "DL DCI PDU Release 8", dissect_dl_config_request_dl_dci_pdu_rel8_value }, ++ { 0x2002, "DL DCI PDU Release 9", dissect_dl_config_request_dl_dci_pdu_rel9_value }, ++ { 0x2003, "DL DCI PDU Release 10", dissect_dl_config_request_dl_dci_pdu_rel10_value }, ++ { 0x2004, "BCH PDU Release 8", dissect_dl_config_request_bch_pdu_rel8_value }, ++ { 0x2005, "MCH PDU Release 8", dissect_dl_config_request_mch_pdu_rel8_value }, ++ { 0x2006, "DLSCH PDU Release 8", dissect_dl_config_request_dlsch_pdu_rel8_value }, ++ { 0x2007, "DLSCH PDU Release 9", dissect_dl_config_request_dlsch_pdu_rel9_value }, ++ { 0x2008, "DLSCH PDU Release 10", dissect_dl_config_request_dlsch_pdu_rel10_value }, ++ { 0x2009, "PCH PDU Release 8", dissect_dl_config_request_pch_pdu_rel8_value }, ++ { 0x200A, "PRS PDU Release 9", dissect_dl_config_request_prs_pdu_rel9_value }, ++ { 0x200B, "CSI-RS PDU Release 10", dissect_dl_config_request_csi_rs_pdu_rel10_value }, ++ { 0x200C, "UL Config Request Body", dissect_ul_config_request_body_value }, ++ { 0x200D, "ULSCH PDU Release 8", dissect_ul_config_ulsch_pdu_rel8_value }, ++ { 0x200E, "ULSCH PDU Release 10", dissect_ul_config_ulsch_pdu_rel10_value }, ++ { 0x200F, "Initial Transmission Parameters Release 8", dissect_ul_config_init_tx_params_rel8_value }, ++ { 0x2010, "CQI RI Information Release 8", dissect_ul_config_cqi_ri_info_rel8_value }, ++ { 0x2011, "CQI RI Information Release 9 or later", dissect_ul_config_cqi_ri_info_rel9_later_value }, ++ { 0x2012, "HARQ Information (ULSCH) Release 10", dissect_ul_config_harq_info_ulsch_rel10_value }, ++ { 0x2013, "UE Information Release 8", dissect_ul_config_ue_info_rel8_value }, ++ { 0x2014, "CQI Information Release 8", dissect_ul_config_cqi_info_rel8_value }, ++ { 0x2015, "CQI Information Release 10", dissect_ul_config_cqi_info_rel10_value }, ++ { 0x2016, "SR Information Release 8", dissect_ul_config_sr_info_rel8_value }, ++ { 0x2017, "SR Information Release 10", dissect_ul_config_sr_info_rel10_value }, ++ { 0x2018, "HARQ Information (UCI) Release 10 TDD", dissect_ul_config_harq_info_uci_rel10_tdd_value }, ++ { 0x2019, "HARQ Information (UCI) Release 8 FDD", dissect_ul_config_harq_info_uci_rel8_fdd_value }, ++ { 0x201A, "HARQ Information (UCI) Release 9 or later FDD", dissect_ul_config_harq_info_uci_rel9_later_fdd_value }, ++ { 0x201B, "SRS Information Release 8", dissect_ul_config_srs_info_rel8_value }, ++ { 0x201C, "SRS Information Release 10", dissect_ul_config_srs_info_rel10_value }, ++ { 0x201D, "HI DCI0 Request Body", dissect_hi_dci0_request_body_value }, ++ { 0x201E, "HI PDU Release 8", dissect_hi_dci0_hi_rel8_value }, ++ { 0x201F, "HI PDU Release 10", dissect_hi_dci0_hi_rel10_value }, ++ { 0x2020, "DCI UL PDU Release 8", dissect_hi_dci0_dci_ul_rel8_value }, ++ { 0x2021, "DCI UL PDU Release 10", dissect_hi_dci0_dci_ul_rel10_value }, ++ { 0x2022, "Tx Request Body", dissect_tx_request_body_value }, ++ { 0x2023, "RX Indication Body", dissect_rx_indication_body_value }, ++ { 0x2024, "RX PDU Release 8", dissect_rx_indication_rel8_value }, ++ { 0x2025, "RX PDU Release 9", dissect_rx_indication_rel9_value }, ++ { 0x2026, "HARQ Indication Body", dissect_harq_indication_body_value }, ++ { 0x2027, "HARQ PDU Release 8 TDD", dissect_harq_indication_rel8_tdd_value }, ++ { 0x2028, "HARQ PDU Release 9 or later TDD", dissect_harq_indication_rel9_later_tdd_value }, ++ { 0x2029, "HARQ PDU Release 8 FDD", dissect_harq_indication_rel8_fdd_value }, ++ { 0x202A, "HARQ PDU Release 9 or later FDD", dissect_harq_indication_rel9_later_fdd_value }, ++ { 0x202B, "CRC Indication Body", dissect_crc_indication_body_value }, ++ { 0x202C, "CRC PDU Release 8", dissect_crc_indication_rel8_value }, ++ { 0x202D, "RX SR Indication Body", dissect_rx_sr_indication_body_value }, ++ { 0x202E, "RX CQI Indication Body", dissect_rx_cqi_indication_body_value }, ++ { 0x202F, "CQI PDU Release 8", dissect_rx_cqi_indication_rel8_value }, ++ { 0x2030, "CQI PDU Release 9", dissect_rx_cqi_indication_rel9_value }, ++ { 0x2031, "RACH Indication Body", dissect_rach_indication_body_value }, ++ { 0x2032, "Preamable PDU Release 8", dissect_rach_indication_rel8_value }, ++ { 0x2033, "Preamable PDU Release 9", dissect_rach_indication_rel9_value }, ++ { 0x2034, "SRS Indication Body", dissect_srs_indication_body_value }, ++ { 0x2035, "SRS PDU Release 8", dissect_srs_indication_rel8_value }, ++ { 0x2036, "SRS PDU Release 9", dissect_srs_indication_rel9_value }, ++ { 0x2037, "SRS PDU Release 10 TDD", dissect_srs_indication_rel10_tdd_value }, ++ { 0x2038, "RX UE Information", dissect_rx_ue_info_value }, ++ { 0x2039, "DL DCI PDU Release 11", dissect_dl_config_request_dl_dci_pdu_rel11_value }, ++ { 0x203A, "DL DCI PDU Release 12", dissect_dl_config_request_dl_dci_pdu_rel12_value }, ++ { 0x203B, "DL DCI PDU Release 13", dissect_dl_config_request_dl_dci_pdu_rel13_value }, ++ { 0x203C, "DLSCH PDU Release 11", dissect_dl_config_request_dlsch_pdu_rel11_value }, ++ { 0x203D, "DLSCH PDU Release 12", dissect_dl_config_request_dlsch_pdu_rel12_value }, ++ { 0x203E, "DLSCH PDU Release 13", dissect_dl_config_request_dlsch_pdu_rel13_value }, ++ { 0x203F, "PCH PDU Release 13", dissect_dl_config_request_pch_pdu_rel13_value }, ++ { 0x2040, "CSI-RS PDU Release 13", dissect_dl_config_request_csi_rs_pdu_rel13_value }, ++ { 0x2041, "EDPCCH PDU Release 11 Parameters", dissect_dl_config_request_edpcch_params_rel11_value }, ++ { 0x2042, "EDPCCH PDU Release 13 Parameters", dissect_dl_config_request_edpcch_params_rel13_value }, ++ { 0x2043, "ULSCH PDU Release 11", dissect_ul_config_ulsch_pdu_rel11_value }, ++ { 0x2044, "ULSCH PDU Release 13", dissect_ul_config_ulsch_pdu_rel13_value }, ++ { 0x2045, "CQI RI Information Release 13", dissect_ul_config_cqi_ri_info_rel13_value }, ++ { 0x2046, "HARQ Information (ULSCH) Release 13", dissect_ul_config_harq_info_ulsch_rel13_value }, ++ { 0x2047, "UE Information Release 11", dissect_ul_config_ue_info_rel11_value }, ++ { 0x2048, "UE Information Release 13", dissect_ul_config_ue_info_rel13_value }, ++ { 0x2049, "CQI Information Release 13", dissect_ul_config_cqi_info_rel13_value }, ++ { 0x204A, "HARQ Information (UCI) Release 11 FDD/TDD", dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value }, ++ { 0x204B, "HARQ Information (UCI) Release 13 FDD/TDD", dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value }, ++ { 0x204C, "SRS Information Release 13", dissect_ul_config_srs_info_rel13_value }, ++ { 0x204D, "DCI UL PDU Release 12", dissect_hi_dci0_dci_ul_rel12_value }, ++ { 0x204E, "MDPCCH DCI UL PDU Release 13", dissect_hi_dci0_mdpcch_dci_ul_rel13_value }, ++ { 0x204F, "HARQ PDU Release 13 or later TDD", dissect_harq_indication_rel13_later_tdd_value }, ++ { 0x2050, "HARQ PDU Release 13 or later FDD", dissect_harq_indication_rel13_later_fdd_value }, ++ { 0x2051, "Preamable PDU Release 13", dissect_rach_indication_rel13_value }, ++ { 0x2052, "UL CQI Information", dissect_ul_cqi_information_value }, ++ { 0x2053, "SRS PDU Release 11", dissect_srs_indication_rel11_value }, ++ { 0x2054, "TDD Channel Measurement", dissect_tdd_channel_measurement_value }, ++ { 0x2055, "LBT DL Config Request Body", dissect_lbt_dl_config_request_body_value }, ++ { 0x2056, "LBT PDSCH Req PDU Release 13", dissect_lbt_dl_config_request_pdsch_req_rel13_value }, ++ { 0x2057, "LBT DRS req PDU Release 13", dissect_lbt_dl_config_request_drs_req_rel13_value }, ++ { 0x2058, "LBT DL Indication Message Body", dissect_lbt_indication_message_body_value }, ++ { 0x2059, "LBT PDSCH Resp PDU Release 13", dissect_lbt_dl_config_request_pdsch_resp_rel13_value }, ++ { 0x205A, "LBT DRS Resp PDU Release 13", dissect_lbt_dl_config_request_drs_resp_rel13_value }, ++ { 0x205B, "MPDCCH PDU Release 13", dissect_dl_config_request_mpdpcch_pdu_rel13_value }, ++}; ++ ++const tlv_t p4_tags[] = ++{ ++ { 0x3000, "LTE RSSI Request", dissect_lte_rssi_request_value }, ++ { 0x3001, "UTRAN RSSI Request", dissect_utran_rssi_request_value }, ++ { 0x3002, "GERAN RSSI Request", dissect_geran_rssi_request_value }, ++ { 0x3003, "RSSI Indication", dissect_rssi_indication_value }, ++ { 0x3004, "LTE CELL SEARCH Request", dissect_lte_cell_search_value }, ++ { 0x3005, "UTRAN CELL SEARCH Request", dissect_utran_cell_search_value }, ++ { 0x3006, "GERAN CELL SEARCH Request", dissect_geran_cell_search_value }, ++ { 0x3007, "LTE CELL SEARCH Indication", dissect_lte_cell_search_indication_value }, ++ { 0x3008, "UTRAN CELL SEARCH Indication", dissect_utran_cell_search_indication_value }, ++ { 0x3009, "GERAN CELL SEARCH Indication", dissect_geran_cell_search_indication_value }, ++ { 0x300A, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, ++ { 0x300B, "LTE BROADCAST DETECT Request", dissect_lte_broadcast_detect_request_value }, ++ { 0x300C, "UTRAN BROADCAST DETECT Request", dissect_utran_broadcast_detect_request_value }, ++ { 0x300D, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value }, ++ { 0x300E, "LTE BROADCAST DETECT Indication", dissect_lte_broadcast_detect_indication_value }, ++ { 0x300F, "UTRAN BROADCAST DETECT Indication", dissect_utran_broadcast_detect_indication_value }, ++ { 0x3010, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, ++ { 0x3011, "LTE SYSTEM INFORMATION SCHEDULE Request", dissect_lte_system_information_schedule_request_value }, ++ { 0x3012, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, ++ { 0x3013, "LTE SYSTEM INFORMATION SCHEDULE Indication", dissect_lte_system_information_schedule_indication_value }, ++ { 0x3014, "LTE SYSTEM INFORMATION Request", dissect_lte_system_information_request_value }, ++ { 0x3015, "UTRAN SYSTEM INFORMATION Request", dissect_utran_system_information_request_value }, ++ { 0x3016, "GERAN SYSTEM INFORMATION Request", dissect_geran_system_information_request_value }, ++ { 0x3017, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value }, ++ { 0x3018, "LTE SYSTEM INFORMATION Indication", dissect_lte_system_information_indication_value }, ++ { 0x3019, "UTRAN SYSTEM INFORMATION Indication", dissect_utran_system_information_indication_value }, ++ { 0x301A, "GERAN SYSTEM INFORMATION Indication", dissect_geran_system_information_indication_value }, ++}; ++ ++ ++static const tlv_t* look_up_tlv(int tag_id) ++{ ++ const tlv_t* tlv = NULL; ++ ++ static const gint num_configuration_tags = sizeof(configuration_tags) / sizeof(tlv_t); ++ static const gint num_nfapi_tags = sizeof(nfapi_tags) / sizeof(tlv_t); ++ static const gint num_p7_tags = sizeof(p7_tags) / sizeof(tlv_t); ++ static const gint num_p4_tags = sizeof(p4_tags) / sizeof(tlv_t); ++ ++ if (tag_id >= 0x0000 && tag_id <= (0x0000 + num_configuration_tags - 1)) // 0x0133) ++ { ++ tlv = &configuration_tags[tag_id]; ++ } ++ else if (tag_id >= 0x1000 && tag_id <= (0x1000 + num_nfapi_tags - 1)) // 0x100D) ++ { ++ tlv = &nfapi_tags[tag_id - 0x1000]; ++ } ++ else if (tag_id >= 0x2000 && tag_id <= (0x2000 + num_p7_tags - 1)) //0x205B) ++ { ++ tlv = &p7_tags[tag_id - 0x2000]; ++ } ++ else if (tag_id >= 0x3000 && tag_id <= (0x3000 + num_p4_tags - 1)) // 0x301A) ++ { ++ tlv = &p4_tags[tag_id - 0x3000]; ++ } ++ return tlv; ++} ++ ++ ++static proto_item* dissect_tl_header(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tl, "TL"); ++ ptvcursor_add(ptvc, hf_nfapi_tl_tag, 2, ENC_BIG_ENDIAN); ++ proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tl_length, 2, ENC_BIG_ENDIAN); ++ ptvcursor_pop_subtree(ptvc); ++ ++ return item; ++} ++ ++static void dissect_tlv_list(ptvcursor_t* ptvc, packet_info* pinfo, gint len) ++{ ++ while (ptvcursor_current_offset(ptvc) < len) ++ { ++ guint16 tlv_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ guint16 tlv_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc) + 2); ++ ++ const tlv_t* tlv = look_up_tlv(tlv_id); ++ ++ if (tlv != NULL && tlv->name != NULL && tlv->tag_id == tlv_id) ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "%s", tlv->name); ++ proto_item* tlv_length_item = dissect_tl_header(ptvc, pinfo); ++ ++ // There are rare cases where the len of the tlv is 0. ++ if (tlv_len > 0) ++ { ++ ++ if (tlv->decode != NULL) ++ { ++ // Create a sub buff with the correct length, so we can detect reading off the end ++ tvbuff_t* sub_tvbuff = tvb_new_subset_length(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), tlv_len); ++ ptvcursor_t* sub_ptvc = ptvcursor_new(ptvcursor_tree(ptvc), sub_tvbuff, 0); ++ ++ tlv->decode(sub_ptvc, pinfo); ++ ++ if (ptvcursor_current_offset(sub_ptvc) != tlv_len) ++ { ++ // error in the tlv length ++ expert_add_info_format(pinfo, tlv_length_item, &ei_invalid_tlv_length, "TLV length does not match decoded length"); ++ } ++ ++ ptvcursor_free(sub_ptvc); ++ } ++ ++ ptvcursor_advance(ptvc, tlv_len); ++ } ++ ++ ptvcursor_pop_subtree(ptvc); ++ } ++ else ++ { ++ if (tlv_id >= 0xF000 /* && tlv_id <= 0xFFFF*/) ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Unknown Vendor Extension Tag"); ++ } ++ else ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Unknown"); ++ } ++ ++ dissect_tl_header(ptvc, pinfo); ++ ptvcursor_advance(ptvc, tlv_len); ++ ptvcursor_pop_subtree(ptvc); ++ } ++ } ++} ++ ++ ++static void dissect_rx_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ guint number_of_pdu_addr = ptvcursor_current_offset(ptvc); // *offset; ++ guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN); ++ ++ guint16* lengths = (guint16*)wmem_alloc0(wmem_packet_scope(), count * 2); ++ memset(lengths, 0, count * 2); ++ ++ guint16 i = 0; ++ ++ if (count > 0) ++ { ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "RX PDU List"); ++ gint pdu_end = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) + ptvcursor_current_offset(ptvc); ++ ++ while (tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) > 0 && ++ ptvcursor_current_offset(ptvc) < pdu_end ) ++ { ++ guint16 tlv_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ //guint16 tlv_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc) + 2); ++ ++ if (tlv_id == 0x2038) ++ { ++ if (i != 0) ++ ptvcursor_pop_subtree(ptvc); ++ ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "[%d]", i); ++ ++ i++; ++ } ++ ++ char* tlv_name = "Unknown"; ++ const tlv_t* tlv = look_up_tlv(tlv_id); ++ ++ if (tlv != NULL && tlv->name != NULL && tlv->tag_id == tlv_id) ++ { ++ tlv_name = tlv->name; ++ } ++ ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "%s", tlv_name); ++ ++ dissect_tl_header(ptvc, pinfo); ++ ++ ++ if (tlv_id == 0x2038) ++ { ++ dissect_rx_ue_info_value(ptvc, pinfo); ++ } ++ else if (tlv_id == 0x2024) ++ { ++ lengths[i - 1] = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN); ++ int data_offset = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN); ++ ++ if ((data_offset > 0) && (pdu_end == (tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) + ptvcursor_current_offset(ptvc)))) ++ { ++ pdu_end = number_of_pdu_addr + data_offset; ++ } ++ ++ } ++ else if (tlv_id == 0x2025) ++ { ++ dissect_rx_indication_rel9_value(ptvc, pinfo); ++ } ++ ++ ptvcursor_pop_subtree(ptvc); ++ ++ } ++ ++ // pop the last pdu index. ++ ptvcursor_pop_subtree(ptvc); ++ ++ ptvcursor_pop_subtree(ptvc); ++ } ++ ++ for (i = 0; i < count; ++i) ++ { ++ ptvcursor_add(ptvc, hf_nfapi_pdu, lengths[i], ENC_NA); ++ } ++} ++ ++ ++// ----------------------------------------------------------------------------| ++ ++static void dissect_p45_header(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p4_p5_message_header, "P4 P5 Header"); ++ ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_phy_id, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_message_id, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_message_length, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_spare, 2, ENC_BIG_ENDIAN); ++ ptvcursor_pop_subtree(ptvc); ++ ++} ++ ++static void dissect_p7_header_new(ptvcursor_t* ptvc, guint8* m, guint8* seg, guint8* seq) ++{ ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p7_message_header, "P7 Header"); ++ ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_phy_id, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_id, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_length, 2, ENC_BIG_ENDIAN); ++ ++ guint8 m_seg = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ *m = (m_seg & 0x80) >> 7; ++ *seg = m_seg & 0x7F; ++ ++ proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_m, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8, 1, ENC_NA); ++ proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_segment, ptvcursor_tvbuff(ptvc), ((ptvcursor_current_offset(ptvc)) * 8) + 1, 7, ENC_NA); ++ ptvcursor_advance(ptvc, 1); ++ ++ ++ *seq = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)); ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_sequence_number, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_checksum, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_transmit_timestamp, 4, ENC_BIG_ENDIAN); ++ ++ ptvcursor_pop_subtree(ptvc); ++} ++ ++ ++static void dissect_p7_header(ptvcursor_t * ptvc, packet_info* pinfo _U_) ++{ ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p7_message_header, "P7 Header"); ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_phy_id, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_id, 2, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_length, 2, ENC_BIG_ENDIAN); ++ ++ proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_m, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8, 1, ENC_NA); ++ proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_segment, ptvcursor_tvbuff(ptvc), ((ptvcursor_current_offset(ptvc)) * 8) + 1, 7, ENC_NA); ++ ptvcursor_advance(ptvc, 1); ++ ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_sequence_number, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_checksum, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_p7_message_header_transmit_timestamp, 4, ENC_BIG_ENDIAN); ++ ++ ptvcursor_pop_subtree(ptvc); ++} ++ ++static reassembly_table ul_p7_reassemble_table; ++static reassembly_table dl_p7_reassemble_table; ++ ++static int hf_msg_fragments = -1; ++static int hf_msg_fragment = -1; ++static int hf_msg_fragment_overlap = -1; ++static int hf_msg_fragment_overlap_conflicts = -1; ++static int hf_msg_fragment_multiple_tails = -1; ++static int hf_msg_fragment_too_long_fragment = -1; ++static int hf_msg_fragment_error = -1; ++static int hf_msg_fragment_count = -1; ++static int hf_msg_reassembled_in = -1; ++static int hf_msg_reassembled_length = -1; ++static gint ett_msg_fragment = -1; ++static gint ett_msg_fragments = -1; ++ ++static const fragment_items msg_frag_items = { ++ /* Fragment subtrees */ ++ &ett_msg_fragment, ++ &ett_msg_fragments, ++ /* Fragment fields */ ++ &hf_msg_fragments, ++ &hf_msg_fragment, ++ &hf_msg_fragment_overlap, ++ &hf_msg_fragment_overlap_conflicts, ++ &hf_msg_fragment_multiple_tails, ++ &hf_msg_fragment_too_long_fragment, ++ &hf_msg_fragment_error, ++ &hf_msg_fragment_count, ++ /* Reassembled in field */ ++ &hf_msg_reassembled_in, ++ /* Reassembled length field */ ++ &hf_msg_reassembled_length, ++ NULL, ++ /* Tag */ ++ "Message fragments" ++}; ++ ++static void dissect_nfapi_ul_p7(ptvcursor_t *ptvc, packet_info *pinfo) ++{ ++ guint8 m; ++ guint8 seg; ++ guint8 seq; ++ ++ guint8 save_fragmented; ++ ptvcursor_t* sub_ptvc = 0; ++ ++ guint16 msg_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 2); ++ guint16 msg_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 4); ++ ++ dissect_p7_header_new(ptvc, &m, &seg, &seq); ++ save_fragmented = pinfo->fragmented; ++ ++ if (m == 1 || (m == 0 && seg > 0)) ++ { ++ tvbuff_t* tvbuff = ptvcursor_tvbuff(ptvc); ++ guint offset = ptvcursor_current_offset(ptvc); ++ proto_tree* tree = ptvcursor_tree(ptvc); ++ ++ pinfo->fragmented = TRUE; ++ ++ fragment_head *fd_head = fragment_add_seq_check(&ul_p7_reassemble_table, tvbuff, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); ++ ++ if (fd_head) ++ { ++ tvbuff_t * new_tvb = process_reassembled_data(tvbuff, offset, pinfo, "Reassembled UL P7", fd_head, &msg_frag_items, NULL, tree); ++ if (new_tvb) ++ { ++ sub_ptvc = ptvcursor_new(tree, new_tvb, 0); ++ ++ col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); ++ } ++ else ++ { ++ col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); ++ return; ++ } ++ } ++ else ++ { ++ return; ++ } ++ } ++ ++ pinfo->fragmented = save_fragmented; ++ ++ { ++ switch (msg_id) ++ { ++ case NFAPI_HARQ_INDICATION_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ } ++ break; ++ case NFAPI_CRC_INDICATION_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ } ++ break; ++ case NFAPI_RX_ULSCH_INDICATION_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ } ++ break; ++ case NFAPI_RACH_INDICATION_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ } ++ break; ++ case NFAPI_SRS_INDICATION_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ } ++ break; ++ case NFAPI_RX_SR_INDICATION_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ } ++ break; ++ case NFAPI_RX_CQI_INDICATION_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ } ++ break; ++ ++ }; ++ } ++ ++ if (sub_ptvc) ++ ptvcursor_free(sub_ptvc); ++} ++ ++static void dissect_nfapi_dl_p7(ptvcursor_t *ptvc, packet_info *pinfo) ++{ ++ guint8 m; ++ guint8 seg; ++ guint8 seq; ++ ++ guint8 save_fragmented; ++ ptvcursor_t* sub_ptvc = 0; ++ ++ guint16 msg_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 2); ++ guint16 msg_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 4); ++ ++ dissect_p7_header_new(ptvc, &m, &seg, &seq); ++ save_fragmented = pinfo->fragmented; ++ ++ if (m == 1 || (m == 0 && seg > 0)) ++ { ++ tvbuff_t* tvbuff = ptvcursor_tvbuff(ptvc); ++ guint offset = ptvcursor_current_offset(ptvc); ++ proto_tree* tree = ptvcursor_tree(ptvc); ++ ++ pinfo->fragmented = TRUE; ++ ++ fragment_head *fd_head = fragment_add_seq_check(&dl_p7_reassemble_table, tvbuff, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1)); ++ ++ if (fd_head) ++ { ++ tvbuff_t * new_tvb = process_reassembled_data(tvbuff, offset, pinfo, "Reassembled DL P7", fd_head, &msg_frag_items, NULL, tree); ++ if (new_tvb) ++ { ++ sub_ptvc = ptvcursor_new(tree, new_tvb, 0); ++ col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg); ++ } ++ else ++ { ++ col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg); ++ return; ++ } ++ } ++ else ++ { ++ return; ++ } ++ } ++ ++ pinfo->fragmented = save_fragmented; ++ ++ switch (msg_id) ++ { ++ case NFAPI_DL_CONFIG_REQUEST_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ break; ++ } ++ case NFAPI_UL_CONFIG_REQUEST_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ } ++ break; ++ case NFAPI_HI_DCI0_REQUEST_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ } ++ break; ++ case NFAPI_TX_REQUEST_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ } ++ break; ++ case NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ } ++ break; ++ case NFAPI_LBT_DL_INDICATION_MSG_ID: ++ { ++ ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN); ++ dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len); ++ break; ++ } ++ } ++ ++ if (sub_ptvc) ++ ptvcursor_free(sub_ptvc); ++} ++ ++ ++static int dissect_nfapi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) ++{ ++ col_set_str(pinfo->cinfo, COL_PROTOCOL, "NFAPI"); ++ ++ ptvcursor_t* ptvc = ptvcursor_new(tree, tvb, 0); ++ ++ guint16 msg_id = tvb_get_ntohs(tvb, 2); ++ ++ // Get the name of the message ++ const gchar* message_str = val_to_str_const(msg_id, message_id_vals, "Unknown"); ++ ++ // Append to the Info string the nFAPI messages ++ col_clear(pinfo->cinfo, COL_INFO); ++ col_append_fstr(pinfo->cinfo, COL_INFO, " %s ", message_str); ++ ++ // Flag if this is a vendor extention message, could do it for P4, 5, 7 ++ if (msg_id >= 0x0300 && msg_id <= 0x03FF) ++ { ++ col_append_fstr(pinfo->cinfo, COL_INFO, " Vendor Extension"); ++ } ++ ++ // Create the top level tree ++ ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_message_tree, "%s", message_str); ++ ++ switch (msg_id) ++ { ++ case NFAPI_HARQ_INDICATION_MSG_ID: ++ case NFAPI_CRC_INDICATION_MSG_ID: ++ case NFAPI_RX_ULSCH_INDICATION_MSG_ID: ++ case NFAPI_RACH_INDICATION_MSG_ID: ++ case NFAPI_SRS_INDICATION_MSG_ID: ++ case NFAPI_RX_SR_INDICATION_MSG_ID: ++ case NFAPI_RX_CQI_INDICATION_MSG_ID: ++ { ++ dissect_nfapi_ul_p7(ptvc, pinfo); ++ } + break; +- // LBT_DL.indication +- case 0x8D: +- { +- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; +- } +- // PNF_PARAM.request +- case 0x100: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; +- } +- // PNF_PARAM.response +- case 0x101: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; +- } +- // PNF_CONFIG.request +- case 0x102: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; +- } +- // PNF_CONFIG.response +- case 0x103: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); +- break; +- } +- // PNF_START.request +- case 0x104: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- break; +- } +- // PNF_START.response +- case 0x105: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); +- break; +- } +- // PNF_STOP.response +- case 0x106: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- break; +- } +- // PNF_STOP.request +- case 0x107: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); +- break; +- } +- // PARAM.request +- case 0x108: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- break; +- } +- // PARAM.response +- case 0x109: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; +- } +- // CONFIG.request +- case 0x10A: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint8(msg_tree, hf_nfapi_num_tlv, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; +- } +- // CONFIG.response +- case 0x10B: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); +- break; +- } +- // START.request +- case 0x10C: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- break; +- } +- // START.response +- case 0x10D: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); +- break; +- } +- // STOP.request +- case 0x10E: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- break; +- } +- // STOP.response +- case 0x10F: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); +- break; +- } +- // MEASUREMENT.request +- case 0x110: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; ++ ++ case NFAPI_DL_CONFIG_REQUEST_MSG_ID: ++ case NFAPI_UL_CONFIG_REQUEST_MSG_ID: ++ case NFAPI_HI_DCI0_REQUEST_MSG_ID: ++ case NFAPI_TX_REQUEST_MSG_ID: ++ case NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID: ++ case NFAPI_LBT_DL_INDICATION_MSG_ID: ++ { ++ dissect_nfapi_dl_p7(ptvc, pinfo); ++ break; ++ } ++ ++ case NFAPI_PNF_PARAM_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; ++ } ++ case NFAPI_PNF_PARAM_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ ++ break; ++ } ++ case NFAPI_PNF_CONFIG_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; ++ } ++ case NFAPI_PNF_CONFIG_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); ++ break; ++ } ++ case NFAPI_PNF_START_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ break; ++ } ++ case NFAPI_PNF_START_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); ++ break; ++ } ++ case NFAPI_PNF_STOP_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ break; ++ } ++ case NFAPI_PNF_STOP_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); ++ break; ++ } ++ case NFAPI_PARAM_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ break; ++ } ++ case NFAPI_PARAM_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_error_code, 1, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_num_tlv, 1, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; ++ } ++ case NFAPI_CONFIG_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_error_code, 1, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; ++ } ++ case NFAPI_CONFIG_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); ++ break; ++ } ++ case NFAPI_START_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ break; ++ } ++ case NFAPI_START_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); ++ break; ++ } ++ case NFAPI_STOP_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ break; ++ } ++ case NFAPI_STOP_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); ++ break; ++ } ++ case NFAPI_MEASUREMENT_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; ++ } ++ case NFAPI_MEASUREMENT_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; ++ } ++ ++ // P4 ++ case NFAPI_RSSI_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; ++ } ++ case NFAPI_RSSI_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); ++ break; ++ } ++ case NFAPI_RSSI_INDICATION_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; ++ } ++ case NFAPI_CELL_SEARCH_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; + } +- // MEASUREMENT.response +- case 0x111: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; +- } +- +- // P4 +- // RSSI.request +- case 0x200: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; ++ case NFAPI_CELL_SEARCH_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); ++ break; + } +- // RSSI.response +- case 0x201: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); +- break; ++ case NFAPI_CELL_SEARCH_INDICATION_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; + } +- // RSSI.indication +- case 0x202: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; ++ case NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; + } +- // CELL_SEARCH.request +- case 0x203: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; ++ case NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); ++ break; + } +- // CELL_SEARCH.response +- case 0x204: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); +- break; ++ case NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; + } +- // CELL_SEARCH.indication +- case 0x205: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; ++ case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; + } +- // BROADCAST_DETECT.request +- case 0x206: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; ++ case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); ++ break; + } +- // BROADCAST_DETECT.response +- case 0x207: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); +- break; ++ case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; + } +- // BROADCAST_DETECT.indication +- case 0x208: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; ++ case NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; + } +- // SYSTEM_INFORMATION_SCHEDULE.request +- case 0x209: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; ++ case NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); ++ break; + } +- // SYSTEM_INFORMATOIN_SCHEDULE.response +- case 0x20A: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); +- break; ++ case NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); ++ dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb)); ++ break; + } +- // SYSTEM_INFORMATION_SCHEDULE.indication +- case 0x20B: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; ++ case NFAPI_NMM_STOP_REQUEST_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ break; + } +- // SYSTEM_INFORMATION.request +- case 0x20C: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; ++ case NFAPI_NMM_STOP_RESPONSE_MSG_ID: ++ { ++ dissect_p45_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN); ++ break; + } +- // SYSTEM_INFORMATION.response +- case 0x20D: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); +- break; ++ case NFAPI_DL_NODE_SYNC_MSG_ID: ++ { ++ dissect_p7_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t1, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t2, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t3, 4, ENC_BIG_ENDIAN); ++ break; + } +- // SYSTEM_INFORMATION.indication +- case 0x20E: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); +- dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb)); +- break; ++ case NFAPI_UL_NODE_SYNC_MSG_ID: ++ { ++ dissect_p7_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_dl_node_sync_t1, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_dl_node_sync_delta_sfn_sf, 4, ENC_BIG_ENDIAN); ++ break; + } +- // NMM_STOP.request +- case 0x20F: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- break; ++ case NFAPI_TIMING_INFO_MSG_ID: ++ { ++ dissect_p7_header(ptvc, pinfo); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_last_sfn_sf, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_time_since_last_timing_info, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_jitter, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_jitter, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_jitter, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_jitter, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_latest_delay, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_latest_delay, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_latest_delay, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_latest_delay, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_earliest_arrival, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_earliest_arrival, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_earliest_arrival, 4, ENC_BIG_ENDIAN); ++ ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_earliest_arrival, 4, ENC_BIG_ENDIAN); ++ break; + } +- // NMM_STOP_response +- case 0x210: +- { +- dissect_p45_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0); +- break; +- } +- +- // DL_NODE.sync +- case 0x0180: +- { +- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t1, tvb, &offset, "microseconds"); +- proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t2, tvb, &offset, "microseconds"); +- proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t3, tvb, &offset, "microseconds"); +- break; +- } +- // UL_NODE.sync +- case 0x0181: +- { +- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_dl_node_sync_t1, tvb, &offset, "microseconds"); +- proto_tree_add_uint32(msg_tree, hf_nfapi_dl_node_sync_delta_sfn_sf, tvb, &offset, 0); +- break; +- } +- // TIMING_INFO +- case 0x0182: +- { +- dissect_p7_header(tvb, pinfo, msg_tree, data, &offset); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_last_sfn_sf, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_time_since_last_timing_info, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_jitter, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_jitter, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_jitter, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_jitter, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_latest_delay, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_latest_delay, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_latest_delay, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_latest_delay, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_earliest_arrival, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_earliest_arrival, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_earliest_arrival, tvb, &offset, 0); +- proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_earliest_arrival, tvb, &offset, 0); +- break; +- } +- default: +- { +- // todo : is this vendor extention? +- break; +- } +- }; +- +- return tvb_captured_length(tvb); +-} +- +-static void nfapi_tag_vals_fn(gchar* s, guint32 v) +-{ +- int index = look_up_tlv(v); +- if (v >= 0) +- { +- g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", tags[index].name, v); +- } +- else +- { +- g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", "Unknown", v); +- } +-} +- +-// ----------------------------------------------------------------------------| +- +-void proto_register_nfapi(void) +-{ +- +- static hf_register_info hf[] = +- { +- { &hf_msg_fragments, { "Message fragments", "afs.fragments", FT_NONE, BASE_NONE, NULL, 0x00, NULL, HFILL } }, +- { &hf_msg_fragment, { "Message fragment", "afs.fragment", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, +- { &hf_msg_fragment_overlap, { "Message fragment overlap", "afs.fragment.overlap", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, +- { &hf_msg_fragment_overlap_conflicts, { "Message fragment overlapping with conflicting data", "afs.fragment.overlap.conflicts", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, +- { &hf_msg_fragment_multiple_tails, { "Message has multiple tail fragments", "afs.fragment.multiple_tails", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, +- { &hf_msg_fragment_too_long_fragment, { "Message fragment too long", "afs.fragment.too_long_fragment", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } }, +- { &hf_msg_fragment_error, { "Message defragmentation error", "afs.fragment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, +- { &hf_msg_fragment_count, { "Message fragment count", "afs.fragment.count", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } }, +- { &hf_msg_reassembled_in, { "Reassembled in", "afs.reassembled.in", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }, +- { &hf_msg_reassembled_length, { "Reassembled length", "afs.reassembled.length", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } }, +- { &hf_msg_reassembled_data, { "Reassembled data", "afs.reassembled.data", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } }, +- { &hf_nfapi_message_tree, { "Message tree", "nfapi.message_tree", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p4_p5_message_header, { "P4 P5 Header", "nfapi.p4_p5_message_header", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p4_p5_message_header_phy_id, { "PHY ID", "nfapi.p4_p5_message_header.phy_id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p4_p5_message_header_message_id, { "Message ID", "nfapi.p4_p5_message_header.message_id", FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_p4_p5_message_header_message_length, { "Message Length", "nfapi.p4_p5_message_header.message_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p4_p5_message_header_spare, { "Spare", "nfapi.p4_p5_message_header.spare", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p7_message_header, { "P7 Header", "nfapi.p7_message_header", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p7_message_header_phy_id, { "Phy ID", "nfapi.p7_message_header.phy_id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p7_message_header_message_id, { "Message ID", "nfapi.p7.message_header.message_id", FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_p7_message_header_message_length, { "Message Length", "nfapi.p7_message_header.message_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p7_message_header_m, { "M", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p7_message_header_segment, { "Segment Number", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p7_message_header_sequence_number, { "Sequence Number", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p7_message_header_checksum, { "Checksum", "nfapi.p7_message_header.checksum", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_p7_message_header_transmit_timestamp, { "Transmit Timestamp", "nfapi.p7_message_header.timestamp", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tlv_tree, { "TAG", "nfapi.tlv.tree", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tl, { "TL", "nfapi.tl", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tl_tag, { "TL Tag", "nfapi.tl_tag", FT_UINT16, BASE_CUSTOM, CF_FUNC(nfapi_tag_vals_fn), 0x0, NULL, HFILL } }, +- { &hf_nfapi_tl_length, { "TL Length", "nfapi.tl_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tag_uint8_value, { "Value", "nfapi.tag.uint8.value", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tag_uint16_value, { "Value", "nfapi.tag.uint16.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_param_response, { "Param Request", "nfapi.param.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_error_code, { "Error Code", "nfapi.error.code", FT_UINT8, BASE_DEC, VALS(nfapi_error_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_p4_error_code, { "Error Code", "nfapi.p4_error.code", FT_UINT8, BASE_DEC, VALS(nfapi_p4_error_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_rat_type, { "RAT Type", "nfapi.rat_type", FT_UINT8, BASE_DEC, VALS(nfapi_rat_type_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_num_tlv, { "Number of TLV", "nfapi.param.response.num_tlv", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_phy_state, { "Phy state value", "nfapi.phy.state", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_modulation_support, { "Modulation value", "nfapi.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_ue_per_sf, { "Downlink UEs per Subframe", "nfapi.dl.ue.per.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_ue_per_sf, { "Uplink UEs per Subframe", "nfapi.ul.ue.per.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_duplex_mode, { "Duplex Mode", "nfapi.duplex.mode", FT_UINT16, BASE_DEC, VALS(nfapi_duplex_mode_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_bandwidth_support, { "Downlink bandwidth support", "nfapi.dl.bandwidth.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_bandwidth_support, { "Uplink bandwidth support", "nfapi.ul.bandwidth.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_modulation_support, { "Downlink modulation support", "nfapi.dl.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_modulation_support, { "Uplink modulation support", "nfapi.ul.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_phy_antenna_capability, { "Phy Antenna capability", "nfapi.phy.antenna.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_release_capability, { "Release capability", "nfapi.release.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_mbsfn_capability, { "MBSFN capability", "nfapi.mbsfn.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_laa_capability, { "LAA Support", "nfapi.laa.support", FT_BOOLEAN, 8, TFS(&support_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_pd_sensing_lbt_support, { "PD sensing LBT support", "nfapi.pd.sensing.lbt.support", FT_BOOLEAN, 8, TFS(&support_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_multi_carrier_lbt_support, { "Multi carrier LBT support", "nfapi.multi.carrier.lbt.support", FT_UINT16, BASE_DEC, VALS(nfapi_mutli_carrier_lbt_support_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_partial_sf_support, { "Partial SF support", "nfapi.partial.sf.support", FT_BOOLEAN, 8, TFS(&partial_sf_support_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_reference_signal_power, { "Reference signal power", "nfapi.ref_sig_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_primary_synchronization_signal_epre_eprers, { "Primary synchronization signal EPRE/EPRERS", "nfapi.primary.sync.signal", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_secondary_synchronization_signal_epre_eprers, { "Secondary synchronization signal EPRE/EPRERS", "nfapi.secondary.sync.signal", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_physical_cell_id, { "Physical Cell ID", "nfapi.physical.cell.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_phich_resource, { "PHICH Resource", "nfapi.phich.resource", FT_UINT16, BASE_DEC, VALS(nfapi_phich_resource_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_phich_duration, { "PHICH Duration", "nfapi.phich.duration", FT_BOOLEAN, 8, TFS(&phich_duration_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_phich_power_offset, { "PHICH Power Offset", "nfapi.phich.power.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_configuration_index, { "Configuration Index", "nfapi.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_root_sequence_index, { "Root sequence Index", "nfapi.root.sequence.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_zero_correlation_zone_configuration, { "Zero correlation zone configuration", "nfapi.zero.correlation.zone.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_high_speed_flag, { "High Speed Flag", "nfapi.high.speed.flag", FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_frequency_offset, { "Frequency offset", "nfapi.frequency.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_hopping_mode, { "Hopping Mode", "nfapi.hopping.mode", FT_BOOLEAN, 8, TFS(&hopping_mode_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_hopping_offset, { "Hopping offset", "nfapi.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_delta_pucch_shift, { "Delta PUCCH Shift", "nfapi.delta.pucch.shift", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_cqi_rb, { "N CQI RB", "nfapi.n.cqi.rb", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_an_cs, { "N AN CS", "nfapi.n.an.cs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n1_pucch_an, { "N1 PUCCH AN", "nfapi.n1.pucch.an", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_bandwidth_configuration, { "Bandwidth configuration", "nfapi.bw.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_srs_subframe_configuration, { "SRS subframe configuration", "nfapi.srs.subframe.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_uplink_rs_hopping, { "Uplink RS hopping", "nfapi.uplink.rs.hopping", FT_UINT16, BASE_DEC, VALS(nfapi_uplink_rs_hopping_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_group_assignment, { "Group assigment", "nfapi.group.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_cyclic_shift_1_for_drms, { "Cyclic Shift 1 for DRMS", "nfapi.cyclic.shift.1.for.drms", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_subframe_assignment, { "Subframe_assignment", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_special_subframe_patterns, { "Special Subframe patterns", "nfapi.special.subframe.patterns", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ed_threshold_for_lbt_for_pdsch, { "ED Threshold for LBT for PDSCH", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ed_threshold_for_lbt_for_drs, { "ED Threshold for LBT for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pd_threshold, { "PD Threshold", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_multi_carrier_type, { "Multi carrier type", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, VALS(nfapi_laa_carrier_type_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_multi_carrier_tx, { "Multi carrier TX", "nfapi.subframe.assignment", FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_tx_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_multi_carrier_freeze, { "Multi carrier freeze ", "nfapi.subframe.assignment", FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_freeze_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_tx_antenna_ports_for_drs, { "Tx antenna ports for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_transmission_power_for_drs, { "Transmission power for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pbch_repetitions_enabled_r13, { "PBCH Repetitions enable R13", "nfapi.pbch.repetitions.enabled_r13", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_cat_m_root_sequence_index, { "PRACH CAT-M Root sequence index", "nfapi.prach.cat_m.root.squence.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, { "PRACH CAT-M Zero correlation zone configuration", "nfapi.prach.cat_m.zero.correlation.zone.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_cat_m_high_speed_flag, { "PRACH CAT-M High speed flag", "nfapi.prach.cat_m.high.speed.flag", FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_0_enable, { "PRACH CE level #0 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_0_configuration_index, { "PRACH CE level #0 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_0_frequency_offset, { "PRACH CE level #0 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, { "PRACH CE level #0 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, { "CE level #0 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_0_hopping_enabled, { "PRACH CE level #0 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_0_hopping_offset, { "PRACH CE level #0 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_1_enable, { "PRACH CE level #1 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_1_configuration_index, { "PRACH CE level #1 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_1_frequency_offset, { "PRACH CE level #1 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, { "PRACH CE level #1 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, { "CE level #1 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_1_hopping_enabled, { "PRACH CE level #1 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_1_hopping_offset, { "PRACH CE level #1 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_2_enable, { "PRACH CE level #2 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_2_configuration_index, { "PRACH CE level #2 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_2_frequency_offset, { "PRACH CE level #2 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, { "PRACH CE level #2 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, { "CE level #2 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_2_hopping_enabled, { "PRACH CE level #2 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_2_hopping_offset, { "PRACH CE level #2 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_3_enable, { "PRACH CE level #3 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_3_configuration_index, { "PRACH CE level #3 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_3_frequency_offset, { "PRACH CE level #3 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, { "PRACH CE level #3 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, { "CE level #3 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_3_hopping_enabled, { "PRACH CE level #3 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_ce_level_3_hopping_offset, { "PRACH CE level #3 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, { "PUCCH Interval-ULHoppingConfigCommonModeA", "nfapi.pucch.interval.ulhopping.config.common.mode.a", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, { "PUCCH Interval-ULHoppingConfigCommonModeB", "nfapi.pucch.interval.ulhopping.config.common.mode.b", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_data_report_mode, { "Data Report Mode", "nfapi.data.report.mode", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_sfnsf, { "SFN/SF", "nfapi.sfn.sf", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_max_up_pts, { "Max UpPTS frames", "nfapi.max.uppts.frame", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_srs_acknack_srs_simultaneous_transmission, { "SRS AckNack Simultaneous transmission", "nfapi.srs.acknack.simult.tx", FT_BOOLEAN, 8, TFS(&srs_simult_tx_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_address, { "PNF address", "nfapi.p7.pnf.address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_address_ipv4, { "PNF IPV4", "nfapi.pnf.address.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_address_ipv6, { "PNF IPV6", "nfapi.pnf.address.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_vnf_address, { "VNF address", "nfapi.vnf.address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_vnf_address_ipv4, { "VNF IPV4 Address", "nfapi.vnf.address.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_vnf_address_ipv6, { "VNF IPV6 Address", "nfapi.vnf.address.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_port, { "PNF PORT value", "nfapi.config.pnf.port.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_vnf_port, { "VNF PORT value", "nfapi.config.vnf.port.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rf_bands, { "RF Bands", "nfapi.rf.bands", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rf_bands_count, { "Number of RF Bands", "nfapi.rf.bands.count", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rf_bands_value, { "Band value", "nfapi.rf.bands.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_param_request, { "PNF Param Request", "nfapi.pnf.param.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_param_response, { "PNF Param Response", "nfapi.pnf.param.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_config_request, { "PNF Config Request", "nfapi.pnf.config.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_config_response, { "PNF Config Response", "nfapi.pnf.config.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_start_request, { "PNF Start Request", "nfapi.pnf.start.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_start_response, { "PNF Start Response", "nfapi.pnf.start.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_start_request, { "PNF Start Request", "nfapi.start.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_start_response, { "PNF Start Response", "nfapi.start.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_param_general, { "PNF Param General ", "nfapi.pnf.param.general", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_sync_mode, { "Sync Mode", "nfapi.sync.mode", FT_UINT8, BASE_DEC, VALS(nfapi_sync_mode_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_location_mode, { "Location Mode", "nfapi.location.mode", FT_UINT8, BASE_DEC, VALS(location_mode_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_location_coordinates_length, { "Location Coordinates Length", "nfapi.location.coordinates.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_location_coordinates, { "Location Coordinates", "nfapi.location.coordinates", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdu, { "PDU", "nfapi.pdu", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_timing, { "DL config Timing", "nfapi.dl.config.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tx_timing, { "Tx Timing", "nfapi.general.tx.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_timing, { "UL Config Timing", "nfapi.ul.config.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_hi_dci0_timing, { "HI DCi0 Timing", "nfapi.hi.dci0.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_maximum_number_phys, { "Maximum number of Phys", "nfapi.maximum.number.phys", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_maximum_total_bandwidth, { "Maximum Total Bandwidth", "nfapi.maximum.total.bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_maximum_total_number_dl_layers, { "Maximum Total Number DL Layers", "nfapi.maximum.total.number.dl.layers", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_maximum_total_number_ul_layers, { "Maximum Total Number UL Layers", "nfapi.maximum.total.number.ul.layers", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_shared_bands, { "Shared bands", "nfapi.shared.bands", FT_BOOLEAN, 8, TFS(&true_false_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_shared_pa, { "Shared pa", "nfapi.shared.pa", FT_BOOLEAN, 8, TFS(&true_false_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_maximum_total_power, { "Maximum total power", "nfapi.maximum.total.power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_oui, { "OUI", "nfapi.oui", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_phy, { "PNF Phy", "nfapi.pnf.phy", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_phy_number_phy, { "PNF Phy Number of Phy", "nfapi.pnf.phy.number.phy", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_phy_config_index, { "PNF Phy Config Index", "nfapi.pnf.phy.config.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_rf, { "PNF Phy RF", "nfapi.pnf.rf", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_rfs, { "Number of RFs", "nfapi.pnf.rf.number.rf", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_phy_rf_config_info, { "Phy RF Config Info", "nfapi.phy.rf.config.info", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_phy_rf_config_info_phy_id, { "Phy ID", "nfapi.pnf.phy.rf.config.phy.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_phy_rf_config_info_band, { "RF Band", "nfapi.pnf.phy.rf.config.phy.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_phy_rf_config, { "PNF Phy RF Config", "nfapi.pnf.phy.rf.config", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_phy_rf_config_number_phy_rf_config_info, { "Number of RF Config Info(s)", "nfapi.pnf.phy.rf.config.number.phy.rf.config.info", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info, { "PNF Phy RF Config array phy rf config info ", "nfapi.pnf.phy.rf.config.array.phy.rf.config.info", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rf_config_index, { "RF Config Index", "nfapi.rf_config_index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_rf_exclusions, { "Number of RF exclusions", "nfapi.hf_nfapi_number_of_rf_exclusions", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_maximum_3gpp_release_supported, { "Maximum 3gpp Release Supported", "nfapi.maximum_3gpp_release_supported", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_downlink_channel_bandwidth_supported, { "Maximum Channel Downlink Bandwidth Supported", "nfapi.downlink_channel_bandwidth_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_uplink_channel_bandwidth_supported, { "Maximum Channel Uplink Bandwidth Supported", "nfapi.uplink_channel_bandwidth_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_dl_layers_supported, { "Number of DL Layers Supported", "nfapi.number_of_dl_layer_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_ul_layers_supported, { "Number of UL Layers Supported", "nfapi.number_of_ul_layer_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_nmm_modes_supported, { "NMM modes supported", "nfapi.nmm_modes_supported", FT_UINT8, BASE_DEC, VALS(nmm_modes_supported_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_band, { "Band", "nfapi.band", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_maximum_transmit_power, { "Maximum transmit power", "nfapi.maximum_transmit_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_earfcn, { "EARFCN", "nfapi.earfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_rf_bands, { "Number of RF Bands", "nfapi.num.rf_bands", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_nmm_uplink_rssi_supported, { "NMM Uplink RSSI supported", "nfapi.nmm.uplink.rssi.supported", FT_UINT16, BASE_DEC, VALS(ul_rssi_supported_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_minimum_transmit_power, { "Minimum transmit power", "nfapi.minimum_transmit_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_antennas_suppported, { "Number of Supported Antennas", "nfapi.number_of_antennas_suppported", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_minimum_downlink_frequency, { "Minimum downlink frequency", "nfapi.minimum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_maximum_downlink_frequency, { "Maximum downlink frequency", "nfapi.maximum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_minimum_uplink_frequency, { "Minimum uplink frequency", "nfapi.minimum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_maximum_uplink_frequency, { "Maximum uplink frequency", "nfapi.maximum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_transmission_mode7_supported, { "Transmission Mode 7 Supported", "nfapi.pnf.phy_rel10.tx_mode7_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_transmission_mode8_supported, { "Transmission Mode 8 Supported", "nfapi.pnf.phy_rel10.tx_mode8_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_two_antennas_ports_for_pucch, { "Two antennas ports for PUCCH", "nfapi.pnf.phy_rel10.two_antennas_ports_for_pucch", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_transmission_mode_9_supported, { "Transmission Mode 9 Supported", "nfapi.pnf.phy_rel10.tx_mode9_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_simultaneous_pucch_pusch, { "Simultaneous PUCCH PUSCH", "nfapi.pnf.simultaneous_pucch_pusch", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_for_layer_tx_with_tm3_and_tm4, { "Four layer Tx with TM3 and TM4", "nfapi.pnf.phy_rel10.layer_tx_with_tm3_and_tm4", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_epdcch_supported, { "ePDCCH supported", "nfapi.pnf.phy_rel11.epdcch_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_multi_ack_csi_reporting, { "Multi ACK CSI reporting", "nfapi.pnf.phy_rel11.mutli_ack_csi_reporting", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_pucch_tx_diversity_with_channel_selection, { "PUCCH Tx diversity with channel selection", "nfapi.pnf.phy_rel11.tx_div_with_channel_selection", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_ul_comp_supported, { "UL CoMP supported", "nfapi.pnf.phy_rel11.ul_comp_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_transmission_mode_5_supported, { "Transmission mode 5 supported", "nfapi.pnf.phy_rel11.tx_mode5_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_subframe_set, { "CSI subframe set", "nfapi.pnf.phy_rel12.csi_subframe_set", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_enhanced_4tx_codebook, { "Enhanced 4TX codebook", "nfapi.pnf.phy_rel12.exhanced_t4x_codebook", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_drs_supported, { "DRS supported", "nfapi.pnf.phy_rel12.drs_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_ul_64qam_supported, { "UL 64QAM supported", "nfapi.pnf.phy_rel12.ul_64qam_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_transmission_mode_10_supported, { "Transmission mode 10 supported", "nfapi.pnf.phy_rel12.tx_mode10_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hi_nfapi_alternative_tbs_indices, { "Alternative TBS indices", "nfapi.pnf.phy_rel12.alternative_tbs_indices", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pucch_format_4_supported, { "PUCCH format 4 supported", "nfapi.pnf.phy_rel13.pucch_format4_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pucch_format_5_supported, { "PUCCH format 5 supported", "nfapi.pnf.phy_rel13.pucch_format5_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_more_than_5_ca_supported, { "More than 5 CA support", "nfapi.pnf.phy_rel13.mode_than_5_ca_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_laa_supported, { "LAA supported", "nfapi.pnf.phy_rel13.laa_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_laa_ending_in_dwpts_supported, { "LAA ending in DwPTS supported", "nfapi.pnf.phy_rel13.laa_ending_in_dwpts_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_laa_starting_in_second_slot_supported, { "LAA starting in second slot Supported", "nfapi.pnf.phy_rel13.laa_starting_in_second_slot_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_beamforming_supported, { "Beamforming Supported", "nfapi.pnf.phy_rel13.beamingforming_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_rs_enhancements_supported, { "CSI-RS enhancements supported", "nfapi.pnf.phy_rel13.csi_rs_enchancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_drms_enhancements_supported, { "DMRS enhancements supported", "nfapi.pnf.phy_rel13.drms_enhancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_srs_enhancements_supported, { "SRS enhancements supported", "nfapi.pnf.phy_rel13.srs_enhancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_sfn_sf, { "SFN_SF", "nfapi.sfn_sf", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_request_body, { "DL Config Request body", "nfapi.dl.config.request.body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_pdcch_ofdm_symbols, { "Number of PDCCH OFDM Symbols", "nfapi.number_pdcch_ofdm_symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_dci, { "Number of DCI", "nfapi.number_dci", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_pdus, { "Number of PDUs", "nfapi.number_pdu", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_harqs, { "Number of HARQs", "nfapi.number_harqs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_crcs, { "Number of CRCs", "nfapi.number_crcs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_srs, { "Number of SRs", "nfapi.number_srs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_cqi, { "Number of CQIs", "nfapi.number_cqi", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_preambles, { "Number of Preambles", "nfapi.number_preambles", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_srss, { "Number of SRSs", "nfapi.number_srss", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_lbt_dl_req_pdu_type, { "LBT DL Request PDU Type", "nfapi.number_srss", FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_req_pdu_type), 0x0, NULL, HFILL } }, +- { &hf_nfapi_lbt_dl_ind_pdu_type, { "LBT DL Indication PDU Type", "nfapi.number_srss", FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_ind_pdu_type), 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_pdsch_rnti, { "Number of PDSCH RNTI", "nfapi.number_pdsch_rnti", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_transmission_power_pcfich, { "Transmission Power PCFICH", "nfapi.transmission_power_pcfich", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_request_pdu_list, { "DL Config Request body", "nfapi.dl.config.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_request_pdu_list, { "UL Config Request body", "nfapi.ul.config.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_hi_dci0_request_pdu_list, { "HI DCI0 Request body", "nfapi.hi.dci0.config.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tx_request_pdu_list, { "Tx Request body", "nfapi.tx.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rx_indication_pdu_list, { "Rx Indication body", "nfapi.rx.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_indication_pdu_list, { "Harq Indication body", "nfapi.harq.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_crc_indication_pdu_list, { "CRC Indication body", "nfapi.crc.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_sr_indication_pdu_list, { "SR Indication body", "nfapi.sr.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_cqi_indication_pdu_list, { "CQI Indication body", "nfapi.cqi.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_preamble_indication_pdu_list, { "Preamble Indication body", "nfapi.preamble.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_srs_indication_pdu_list, { "SRS Indication body", "nfapi.srs.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_lbt_dl_config_pdu_list, { "LBT DL Config Request body", "nfapi.lbt.dl.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_lbt_dl_indication_pdu_list, { "LBT DL Indicatoin body", "nfapi.lbt.dl.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_pdu_type, { "PDU Type", "nfapi.pdu.type", FT_UINT8, BASE_DEC, VALS(nfapi_dl_config_pdu_type_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdu_size, { "PDU size", "nfapi.pdu.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_instance_length, { "Instance length", "nfapi.instance.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_dlsch_pdu_rel8, { "DL CONFIG DLSCH PDU REL8", "nfapi.dl.config.dlsch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_length, { "PDU length", "nfapi.pdu.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdu_index, { "PDU Index", "nfapi.pdu.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rnti, { "RNTI", "nfapi.rnti", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_resource_allocation_type, { "Resource Allocation Type", "nfapi.resource.allocation.type", FT_UINT8, BASE_DEC, VALS(resource_allocation_type_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_virtual_resource_block_assignment_flag, { "Virtual resource block assignment flag", "nfapi.resource.block.assignment.flag", FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_resource_block_coding, { "Resource block coding", "nfapi.resource.block.coding", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_modulation, { "Modulation", "nfapi.modulation", FT_UINT8, BASE_DEC, VALS(modulation_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_redundancy_version, { "Redundancy version", "nfapi.redundancy.version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_transport_blocks, { "Transport blocks", "nfapi.transport.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_transport_block_to_codeword_swap_flag, { "Transport block to codeword swap flag", "nfapi.transport.block.to.codeword.swap.flag", FT_UINT8, BASE_DEC, VALS(transport_block_to_codeword_swap_flag_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_transmission_scheme, { "Transmission scheme", "nfapi.transmission.scheme", FT_UINT8, BASE_DEC, VALS(transmission_scheme_vals), 0x0, "The MIMO mode used in the PDU", HFILL } }, +- { &hf_nfapi_ul_transmission_scheme, { "Transmission scheme", "nfapi.transmission.scheme", FT_UINT8, BASE_DEC, VALS(ul_transmission_scheme_vals), 0x0, "The MIMO mode used in the PDU", HFILL } }, +- { &hf_nfapi_number_of_layers, { "Number of layers", "nfapi.number.of.layers", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_subbands, { "Number of subbands", "nfapi.number.of.subbands", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_codebook_index, { "Codebook index", "nfapi.number.of.codebook.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ue_category_capacity, { "UE category capacity", "nfapi.ue.category.capacity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pa, { "P-A", "nfapi.pa", FT_UINT8, BASE_DEC, VALS(pa_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_delta_power_offset_index, { "Delta Power offset index", "nfapi.delta.power.offset.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_nprb, { "Nprb", "nfapi.nprb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_transmission_mode, { "Transmission Mode", "nfapi.transmission_nprb", FT_UINT8, BASE_DEC, VALS(transmission_mode_vals), 0x0, "Transmission mode associated with the UE", HFILL } }, +- { &hf_nfapi_prnti, { "P-RNTI", "nfapi.prnti", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_mcs, { "MCS", "nfapi.mcs", FT_UINT8, BASE_DEC, VALS(pch_modulation_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_transport_blocks, { "Number of transport blocks", "nfapi.number_of_transport_blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ue_mode, { "UE Mode", "nfapi.ue.mode", FT_UINT8, BASE_DEC, VALS(ue_mode_vals), 0x0, NULL, HFILL } }, +- { &hf_prs_bandwidth, { "PRS bandwidth", "nfapi.prs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_prs_cyclic_prefix_type, { "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_prs_muting, { "PRS muting", "nfapi.prs.muting", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_num_bf_prb_per_subband, { "Num of BF PRB per Subband", "nfapi.num.bf.prb.per.subband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_num_bf_vector, { "Num of BF Vector", "nfapi.num.bf.vector", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_rs_resource_config, { "CSI-RS resource config", "nfapi.csi.rs.resource.config", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_bf_vector_subband_index, { "BF Subband Index", "nfapi.num.bf.vector.subband.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_bf_vector_num_antennas, { "BF Num of Antennas", "nfapi.num.bf.vector.bf.value", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_bf_vector_bf_value, { "BF Value per Antenna", "nfapi.num.bf.vector.bf.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_dlsch_pdu_rel9, { "DL CONFIG DLSCH PDU REL9", "nfapi.dl.config.dlsch.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_nscid, { "NSC id", "nfapi.nscid", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_dlsch_pdu_rel10, { "DL CONFIG DLSCH PDU REL10", "nfapi.dl.config.dlsch.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_rs_flag, { "CSI RS Flag", "nfapi.csi.rs.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_subbands, { "Subbands", "nfapi.subbands", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_bf_vectors, { "BF Vectors", "nfapi.bf.vectors", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_bf_vector_antennas, { "Antennas", "nfapi.antennas", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_rs_resource_config_r10, { "CSI RS resource config R10", "nfapi.csi.rs.resource_config_r10", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, { "CSI-RS Number of NZP configuration", "nfapi.csi.rs.num.of.nzp.configurations", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_rs_number_if_nzp_configurations, { "CSI RS zero Tx Power Resource config bitmap R10", "nfapi.csi.rs.zero.tx.power.resource.config.bitmap.r10", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_rs_resource_configs, { "CSR/RS Resource Configs", "nfapi.csi.rs.resource.configs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdsch_start, { "PDSCH_start", "nfapi.pdsch.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_drms_config_flag, { "DMRS Config flag", "nfapi.drms.config.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_drms_scrambling, { "DMRS Scrambling", "nfapi.drms.scrambling", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_config_flag, { "CSI Config flag", "nfapi.csi.config.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_scrambling, { "CSI Scrambling", "nfapi.csi.scrambling", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdsch_re_mapping_flag, { "PDSCH RE mapping flag", "nfapi.pdsch.remapping.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdsch_re_mapping_antenna_ports, { "PDSCH RE mapping antenna ports", "nfapi.pdsch.remapping.antenna.ports", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdsch_re_mapping_freq_shift, { "PDSCH RE mapping freq shift", "nfapi.pdsch.remapping.freq.shift", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_alt_cqi_table_r12, { "altCQI-Table-r12", "nfapi.alt.cqi.table.r12", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_max_layers, { "MaxLayers", "nfapi.max.layers", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_dl_harq, { "N_DL_HARQ", "nfapi.n.dl.harq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dwpts_symbols, { "DwPTS Symbols", "nfapi.dwpts.symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_initial_lbt_sf, { "Initial LBT SF", "nfapi.initial.lbt.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ue_type, { "UE Type", "nfapi.ue.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdsch_payload_type, { "PDSCH Payload Type", "nfapi.pdsch.payload.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_initial_transmission_sf, { "Initial transmission SF (io) ", "nfapi.init.tx.sf.io", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_req13_drms_table_flag, { "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_rs_resource_index, { "CSI-RS resource index", "nfapi.csi.rs.resource.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_rs_class, { "Class", "nfapi.csi.rs.class", FT_UINT8, BASE_DEC, VALS(csi_rs_class_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_cdm_type, { "CDM Type", "nfapi.cdm.type", FT_UINT8, BASE_DEC, VALS(csi_rs_cdm_type_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_rs_bf_vector, { "BF Vector", "nfapi.bf.vector", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_edpcch_prb_index, { "EPDCCH PRB index", "nfapi.edpcch.prb.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_epdcch_resource_assignment_flag, { "EPDCCH Resource assignment flag", "nfapi.epdcch.resource.assignment.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_epdcch_id, { "EPDCCH ID", "nfapi.epdcch.id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_epdcch_start_symbol, { "EPDCCH Start Symbol", "nfapi.epdcch.start.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_epdcch_num_prb, { "EPDCCH NumPRB", "nfapi.epdcch.num.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_epdcch_prbs, { "EPDCCH PRBs", "nfapi.epdcch.prbs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_precoding_value, { "Precoding value", "nfapi.precoding.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_mpdcch_narrowband, { "MPDCCH Narrowband", "nfapi.mpdcch.narrowband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_prb_pairs, { "Number of PRB pairs", "nfapi.number.prb.pairs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_resource_block_assignment, { "Resource Block Assignment", "nfapi.resource.block.assignement", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_start_symbol, { "Start symbol", "nfapi.start.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ecce_index, { "ECCE index", "nfapi.ecce.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ce_mode, { "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_drms_scrabmling_init, { "DMRS scrambling init", "nfapi.drms.scrambling.init", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdsch_reception_levels, { "PDSCH repetition levels", "nfapi.pdsch.repetition.levels", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_new_data_indicator, { "New data indicator", "nfapi.new.data.indicator", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tpmi_length, { "TPMI length", "nfapi.tpmi.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pmi_flag, { "PMI flag", "nfapi.pmi.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_resource_offset, { "HARQ resource offset", "nfapi.harq.resource.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dci_subframe_repetition_number, { "DCI subframe repetition number", "nfapi.dci.subframe.repetition.number", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_downlink_assignment_index_length, { "Downlink assignment index Length", "nfapi.dl.assignement.index.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_starting_ce_level, { "Starting CE Level", "nfapi.starting.ce.level", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_antenna_ports_and_scrambling_identity_flag, { "Antenna ports and scrambling identity flag", "nfapi.antenna.ports.and.scrambling.identity.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_antenna_ports_and_scrambling_identity, { "Antenna ports and scrambling identity", "nfapi.antenna.ports.and.scrambling.identit", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_paging_direct_indication_differentiation_flag, { "Paging/Direct indication differentiation flag", "nfapi.paging.direct.indictation.differentiation.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_direct_indication, { "Direct indication", "nfapi.direct.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_tx_antenna_ports, { "Number of TX Antenna ports", "nfapi.num.of.tx.antenna.ports.", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_precoding, { "Precoding", "nfapi.precodiing", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_bch_pdu_rel8, { "DL CONFIG BCH PDU Rel8", "nfapi.dl.config.bch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_value_float, { "Value", "nfapi.value.float", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_transmission_power, { "Transmission Power", "nfapi.transmission_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_mch_pdu_rel8, { "DL CONFIG MCH PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_mbsfn_area_id, { "MBSFN Area id", "nfapi.mbsfn.area.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_pch_pdu_rel8, { "DL CONFIG MCH PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_dci_dl_pdu_rel8, { "DL CONFIG DCI DL PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dci_format, { "DCI format", "nfapi.dci.format", FT_UINT8, BASE_DEC, VALS(dci_format_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_cce_idx, { "CCE index", "nfapi.cce.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_aggregation_level, { "Aggregation level", "nfapi.aggregation.level", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_mcs_1, { "MCS_1", "nfapi.mcs_1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_mcs_2, { "MCS_2", "nfapi.mcs_2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_redundancy_version_1, { "Redundancy version_1", "nfapi.redundancy.version.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_redundancy_version_2, { "Redundancy version_2", "nfapi.redundancy.version.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_new_data_indicator_1, { "New data indicator_1", "nfapi.new.data.indicator.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_new_data_indicator_2 ,{ "New data indicator_2", "nfapi.new.data.indicator.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_process, { "HARQ process", "nfapi.harq.process", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tpmi, { "TPMI", "nfapi.tpmi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pmi, { "PMI", "nfapi.pmi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_precoding_information, { "Precoding information", "nfapi.precoding.information", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tpc, { "TPC", "nfapi.tpc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_downlink_assignment_index, { "Downlink assignment index", "nfapi.downlink.assignment.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ngap, { "Ngap", "nfapi.ngap", FT_UINT8, BASE_DEC, VALS(ngap_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_transport_block_size_index, { "Transport block size index", "nfapi.transport.block.size.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_downlink_power_offset, { "Downlink power offset", "nfapi.downlink.power.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_allocate_prach_flag, { "Allocation PRACH flag", "nfapi.allocation.prach.flag", FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_preamble_index, { "Preamble index", "nfapi.preamable.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prach_mask_index, { "PRACH mask index", "nfapi.prach.mask.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rnti_type, { "RNTI type", "nfapi.rnti.type", FT_UINT8, BASE_DEC, VALS(rnti_type_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_dci_dl_pdu_rel9, { "DL CONFIG DCI DL PDU Rel9", "nfapi.dl.config.mch.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_mcch_flag, { "MCCH flag", "nfapi.mcch.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_mcch_change_notification, { "MCCH change notification", "nfapi.mcch.change.notification", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_scrambling_identity, { "Scrambling identity", "nfapi.scrambling.identity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_dci_dl_pdu_rel10, { "DL CONFIG DCI DL PDU Rel10", "nfapi.dl.config.mch.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_cross_carrier_scheduling_flag, { "Cross Carrier scheduling flag", "nfapi.cross.carrier.scheduling.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_carrier_indicator, { "Carrier Indicator", "nfapi.carrier.indicator", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_srs_flag, { "SRS flag", "nfapi.srs.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_srs_request, { "SRS request", "nfapi.srs.request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_antenna_ports_scrambling_and_layers, { "Antenna ports scrambling and layers", "nfapi.antenna.ports.scrambling.and.layers", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_total_dci_length_including_padding, { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_dl_rb, { "N_DL_RB", "nfapi.n.dl.rb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_ul_rb, { "N_UL_RB", "nfapi.n.dl.rb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_ack_resource_offset, { "HARQ-ACK resource offset", "nfapi.harq.ack.resource.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, { "PDSCH RE Mapping and Quasi-Co-Location Indicator", "nfapi.pdsch.re.mapping", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_primary_cell_type, { "Primary cell type", "nfapi.primary.cell.type", FT_UINT8, BASE_DEC, VALS(primary_cells_type_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_dl_configuration_flag, { "UL/DL configuration flag", "nfapi.ul.dl.configuration.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_ul_dl_configurations, { "Number of UL/DL configurations", "nfapi.number.ul.dl.configurations", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_dl_configuration_index, { "UL/DL configuration indication", "nfapi.ul.dl.configuration.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_laa_end_partial_sf_flag, { "LAA end partial SF flag", "nfapi.laa.end.partial.sf.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_laa_end_partial_sf_configuration, { "LAA end partial SF configuration", "nfapi.laa.end.partial.sf.configuration", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_codebooksize_determination_r13, { "Codebook Size Determination R13", "nfapi.codebook.size.determination.r13", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rel13_drms_table_flag, { "Rel-13-DMRS-tabe flag", "nfapi.drms.table.flag.r13", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pscch_resource, { "PSCCH Resource", "nfapi.pscch.resource", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_time_resource_pattern, { "Time resource pattern", "nfapi.time.resource.pattern", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_mpdcch_transmission_type, { "MPDCCH transmission type", "nfapi.mpdcch.transmission.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_drms_scrambling_init, { "DMRS scrambling init", "nfapi.drms.scrambling.init", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pusch_repetition_levels, { "PUSCH repetition levels", "nfapi.pusch.repetition.levels", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_frequency_hopping_flag, { "Frequency hopping flag", "nfapi.frequency.hopping.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_request, { "CSI request", "nfapi.csi.request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dai_presence_flag, { "DAI presence flag", "nfapi.dia.presence.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_total_dci_length_include_padding, { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_prs_pdu_rel9, { "DL CONFIG PRS PDU Rel9", "nfapi.dl.config.prs.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prs_bandwidth, { "PRS Bandwidth", "nfapi.prs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_prs_cyclic_prefix_type, { "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_config_csi_rs_pdu_rel10, { "DL CONFIG CSI RS PDU Rel10", "nfapi.dl.config.csi.rs.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_rs_antenna_port_count_r10, { "Antenna port count r10", "nfapi.csi.rs.antenna.port.count.r10", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_request_body, { "UL Config Request body", "nfapi.ul.config.request.body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_pdu_type, { "UL Config PDU Type", "nfapi.ul.config.pdu.type", FT_UINT8, BASE_DEC, VALS(nfapi_ul_config_pdu_type_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_rach_prach_frequency_resources, { "RACH PRACH Frequency resources", "nfapi.rach.prach.frequency.resources", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_srs_present, { "SRS present", "nfapi.srs.present", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_harq_buffer_pdu, { "HARQ Buffer PDU", "nfapi.ul.config.harq.buffer.pdu", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_ue_information_rel8, { "UE Information Rel 8", "nfapi.ul.config.ue.information.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_handle, { "Handle", "nfapi.handle", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_sr_information_pdu_rel8, { "SR Information Rel 8", "nfapi.ul.config.sr.information.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pucch_index, { "PUCCH Index", "nfapi.pucch.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_size, { "Size", "nfapi.size", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_resource_block_start, { "Resource block start", "nfapi.resource.block.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_resource_blocks, { "Number of resource blocks", "nfapi.resource.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_cyclic_shift_2_for_drms, { "Cyclic Shift 2 for DRMS", "nfapi.cyclic.shift.2.for.drms", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_frequency_hopping_enabled_flag, { "Frequency hopping enabled flag", "nfapi.frequency.hopping.enabled.flag", FT_UINT8, BASE_DEC, VALS(hopping_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_frequency_hopping_bits, { "Frequency hopping bits", "nfapi.frequency.hopping.bits", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_new_data_indication, { "New Data inidication", "nfapi.new.data.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_process_number, { "HARQ Process number", "nfapi.harq.process.number", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_tx_mode, { "UL Tx Mode", "nfapi.ul.tx.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_current_tx_nb, { "Current Tx nb", "nfapi.current.tx.nb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_srs, { "N SRS", "nfapi.n.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_disable_sequence_hopping_flag, { "Disable seqeunce hopping flag", "nfapi.disable.sequence.hopping.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_virtual_cell_id_enabled_flag, { "Virtual cell ID enabled flag", "nfapi.virtual.cell.id.enabled.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_npusch_identity, { "nPUSCH Identity", "nfapi.npusch.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ndrms_csh_identity, { "nDMRS-CSH Identity", "nfapi.ndrms.csh.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_total_number_of_repetitions, { "Total Number of repetitions", "nfapi.total.number.of.repetitions", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_repetition_number, { "Repetition Number", "nfapi.repetition.number", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_initial_sf_io, { "Initial transmission SF (io) ", "nfapi.initial.sf.io", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_empty_symbols_due_to_retunning, { "Empy symbols due to re-tunning", "nfapi.empty.symbols.due.to.retunning", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_cqi_ri_pmi_size_2, { "DL CQI/PMI/RI size 2", "nfapi.dl.cqi.ri.pmi.size.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_size_2, { "HARQ Size 2", "nfapi.harq.size2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_delta_offset_harq_2, { "Delta Offset HARQ 2", "nfapi.delta.offset.harq.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_starting_prb, { "Starting PRB", "nfapi.starting.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_antenna_port, { "Antenna Port", "nfapi.antenna.port", FT_UINT8, BASE_DEC, VALS(antenna_ports_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_combs, { "Number of Combs", "nfapi.num.of.combs", FT_UINT8, BASE_DEC, VALS(combs_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_npucch_identity, { "nPUCCH Identity", "nfapi.npucch.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_empty_symbols, { "Empty symbols", "nfapi.empty.symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_csi_mode, { "CSI_mode", "nfapi.csi.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_cqi_pmi_size_2, { "DL CQI/PMI Size 2", "nfapi.dl.cqi.pmi.size.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_statring_prb, { "Starting PRB", "nfapi.starting.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_cdm_index, { "cdm_Index", "nfapi.cdm.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_nsrs, { "N srs", "nfapi.n.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_num_ant_ports, { "Num_ant_ports", "nfapi.num.ant.port", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_pucch_2_0, { "n_PUCCH_2_0", "nfapi.n.pucch.2.0", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_pucch_2_1, { "n_PUCCH_2_1", "nfapi.n.pucch.2.1", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_pucch_2_2, { "n_PUCCH_2_2", "nfapi.n.pucch.2.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_pucch_2_3, { "n_PUCCH_2_3", "nfapi.n.pucch.2.3", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_cqi_pmi_size_rank_1, { "DL CQI PMI size rank 1", "nfapi.dl.cqi.pmi.size.rank.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_cqi_pmi_size_rank_greater_1, { "DL CQI PMI size rank greater 1", "nfapi.dl.cqi.pmi.size.rank.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ri_size, { "RI size", "nfapi.ri.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_delta_offset_cqi, { "Delta offset cqi", "nfapi.delta.offset.cqi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_delta_offset_ri, { "Delta offset ri", "nfapi.delta.offset.ri", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_size, { "HARQ size", "nfapi.harq_size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_delta_offset_harq, { "Delta offset HARQ", "nfapi.delta.offset.harq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ack_nack_mode, { "ACK NACK mode", "nfapi.ack.nack.mode", FT_UINT8, BASE_DEC, VALS(nfapi_ack_nack_mode_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_srs_initial, { "N srs initial", "nfapi.n.srs.initial", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_initial_number_of_resource_blocks, { "Initial number of resource blocks", "nfapi.initial.number.of.resource.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_cqi_pmi_size, { "DL cqi pmi size", "nfapi.dl.cqi.pmi.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_report_type, { "Report type", "nfapi.report.type", FT_BOOLEAN, 8, TFS(&nfapi_csi_report_type_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_cqi_ri_pmi_size, { "DL CQI RI PMI size", "nfapi.dl.cqi.ri.pmi.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_control_type, { "Control type", "nfapi.control.type", FT_BOOLEAN, 8, TFS(&nfapi_control_type_string_name), 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_cc, { "Number of cc", "nfapi.number.of.cc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_pucch_resource, { "Number of PUCCH Resource", "nfapi.number.of.pucch.resource", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pucch_index_p1, { "PUCCH Index P1", "nfapi.pucch.index.p1", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_pucch_1_0, { "N PUCCH 1 0", "nfapi.n.pucch.1.0", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_pucch_1_1, { "N PUCCH 1 1", "nfapi.n.pucch.1.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_pucch_1_2, { "N PUCCH 1 2", "nfapi.n.pucch.1.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_n_pucch_1_3, { "N PUCCH 1 3", "nfapi.n.pucch.1.3", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_srs_bandwidth, { "SRS Bandwidth", "nfapi.srs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_frequency_domain_position, { "Frequency Domain position", "nfapi.frequency.domain.position", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_srs_hopping_bandwidth, { "SRS hopping bandwidth", "nfapi.srs.hopping.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_transmission_comb, { "Transmission comb", "nfapi.transmission.comb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_i_srs, { "I SRS", "nfapi.i.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_sounding_reference_cyclic_shift, { "Sounding reference cyclic shift", "nfapi.sounding.reference.cyclic.shift", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_antenna_ports, { "Antenna port(s)", "nfapi.antenna.port", FT_UINT8, BASE_DEC, VALS(nfapi_antenna_port_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_srs_pdu_rel10, { "SRS PDU Rel 10", "nfapi.srs.pdu.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_srs_pdu_rel8, { "SRS PDU Rel 8", "nfapi.srs.pdu.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_harq_information_rel9_fdd, { "HARQ information Rel 9 FDD", "nfapi.harq.information.rel.9.fdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_harq_information_rel8_fdd, { "HARQ information Rel 8 FDD", "nfapi.harq.information.rel.8.fdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_harq_information_rel10_tdd, { "HARQ information Rel 10 TDD", "nfapi.harq.information.rel.10.tdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_sr_information_rel10, { "SR information Rel 10", "nfapi.sr.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_sr_information_rel8, { "SR information Rel 8", "nfapi.sr.information.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_cqi_information_rel10, { "CQI information Rel 10", "nfapi.cqi.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_cqi_information_rel8, { "CQI information Rel 8", "nfapi.cqi.information.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_initial_transmission_parameters_rel8, { "Initial transmission parameters Rel 8", "nfapi.initial.transmission.parameters.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_config_ulsch_harq_information_rel10, { "HARQ Information Rel 10", "nfapi.harq.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdu_length, { "PDU length", "nfapi.pdu.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_num_segments, { "Num segments", "nfapi.num.segments", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_segment_length, { "Segment length", "nfapi.segment.length", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_segment_data, { "Segment data", "nfapi.segment.data", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_crc_indication_body, { "CRC Indication Body", "nfapi.crc_indication_body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_crc_flag, { "CRC flag", "nfapi.crc.flag", FT_BOOLEAN, 8, TFS(&crc_flag_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_hi_pdus, { "Number of HI Pdu's", "nfapi.number_of_hi_pdus", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_dci_pdus, { "Number of DCI Pdu's", "nfapi.number_of_dci_pdus", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pdu_type, { "PDU Type", "nfapi.pdu_type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_hi_value, { "HI Value", "nfapi.hi_value", FT_BOOLEAN, 8, TFS(&hi_value_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_i_phich, { "i phich", "nfapi.i_phich", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_flag_tb2, { "Flag TB2", "nfapi.flag_tb2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_hi_value_2, { "HI Value 2", "nfapi.hi_value_2", FT_BOOLEAN, BASE_NONE, TFS(&hi_value_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_ue_tx_antenna_selection, { "UE Tx Antenna selection", "nfapi.ue_tx_antenna_selection", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_cqi_csi_request, { "cqi csi request", "nfapi.cqi_csi_request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_index, { "UL index", "nfapi.ul_index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_assignment_index, { "DL Assignment index", "nfapi.dl_assignment_index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tpc_bitmap, { "TPC bitmap", "nfapi.tpc_bitmap", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_antenna_ports, { "Number of antenna ports", "nfapi.number.of.antenna.ports", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_size_of_cqi_csi_feild, { "Size of cqi csi feild", "nfapi.size.of.cqi.csi.feild", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_new_data_indication_two, { "New data indicatipon 2", "nfapi.new.data.indication.two", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_resource_allocation_flag, { "Resource allocation flag", "nfapi.resource.allocation.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_node_sync, { "DL Node Sync", "nfapi.dl.node.sync", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_node_sync_t1, { "DL Node Sync t1", "nfapi.dl.node.sync.t1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_node_sync_delta_sfn_sf, { "DL Node Sync Delta SFN SF", "nfapi.dl.node.sync.delta_sfn_sf", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_dl_cyclic_prefix_type, { "DL Cyclic Prefix type", "nfapi.dl.cyclic.prefix.type", FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_cyclic_prefix_type, { "UL Cyclic Prefix type", "nfapi.ul.cyclic.prefix.type", FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, NULL, HFILL } }, +- { &hf_nfapi_downlink_channel_bandwidth, { "Downlink Channel Bandwidth", "nfapi.dl.channel.bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_uplink_channel_bandwidth, { "Uplink Channel Bandwidth", "nfapi.ul.channel_bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_tx_antenna_ports, { "Tx Antenna Ports", "nfapi.tx.antenna.ports", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rx_antenna_ports, { "Tx Antenna Ports", "nfapi.rx.antenna.ports", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_node_sync, { "UL Node Sync", "nfapi.ul.node.sync", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_node_sync_t1, { "UL Node Sync t1", "nfapi.ul.node.sync.t1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_node_sync_t2, { "UL Node Sync t2", "nfapi.ul.node.sync.t2", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_node_sync_t3, { "UL Node Sync t3", "nfapi.ul.node.sync.t3", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pb, { "P-B", "nfapi.pb.allocation", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_last_sfn_sf, { "Last SFN/SF", "nfapi.timing.info.last.sfn.sf", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_time_since_last_timing_info, { "Time since last Timing Info", "nfapi.timing.info.time.since.last.timing.info", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_dl_config_jitter, { "DL Config Jitter", "nfapi.timing.info.dl.config.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_tx_request_jitter, { "Tx Request Jitter", "nfapi.timing.info.tx.req.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_ul_config_jitter, { "UL Config Jitter", "nfapi.timing.info.ul.config.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_hi_dci0_jitter, { "HI_DCI0 Jitter", "nfapi.timing.info.hi.dci0.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_dl_config_latest_delay, { "DL Config Latest Delay", "nfapi.timing.info.dl.config.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_tx_request_latest_delay, { "Tx Request Latest Delay", "nfapi.timing.info.tx.request.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_ul_config_latest_delay, { "UL Config Latest Delay", "nfapi.timing.info.ul.config.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_hi_dci0_latest_delay, { "HI_DCI0 Latest Delay", "nfapi.timing.info.hi.dci0.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_dl_config_earliest_arrival, { "DL Config Earliest Arrival", "nfapi.timing.info.dl.config.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_tx_request_earliest_arrival, { "Tx Request Earliest Arrival", "nfapi.timing.info.tx.request.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_ul_config_earliest_arrival, { "UL Config Earliest Arrival", "nfapi.timing.info.ul.config.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_hi_dci0_earliest_arrival, { "HI_DCI0 Earliest Arrival", "nfapi.timing.info.hi.dci0.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pcfich_power_offset, { "PCFICH Power Offset", "nfapi.pcfich.power.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_window, { "NFAPI Timing window", "nfapi.timing.window", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_mode, { "Timing Info mode", "nfapi.timing.info.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_info_period, { "Timing info period", "nfapi.timing.info.period", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_max_transmit_power, { "Max transmit power", "nfapi.max.transmit.power", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_uint8_tag, { "uint8 tag", "nfapi.uint8.tag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_uint16_tag, { "uint16 tag", "nfapi.uint16.tag", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_mode, { "Mode", "nfapi.harq.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_ack_nack, { "Number of ACK/NACK", "nfapi.uint16.tag", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_data_value_0, { "Value 0", "nfapi.harq.value.0", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_data_value_1, { "Value 1", "nfapi.harq.value.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_data_value_2, { "Value 2", "nfapi.harq.value.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_data_value_3, { "Value 3", "nfapi.harq.value.3", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_tb_1, { "HARQ TB1", "nfapi.harq.tb.", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_tb_2, { "HARQ TB2", "nfapi.harq.tb.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_tb_n, { "HARQ TB_N", "nfapi.harq.tb.n", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_cqi, { "UL_CQI", "nfapi.ul.cqi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_channel, { "Channel", "nfapi.channel", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_data_offset, { "Data Offset", "nfapi.data.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ri, { "RI", "nfapi.ri", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_ack_nack_data, { "HARQ Ack/Nack Data", "nfapi.harq.ack.nack.data", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_harq_data, { "HARQ TB Data", "nfapi.harq.tb.data", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_cc, { "CC", "nfapi.cc", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rbs, { "RBs", "nfapi.rbs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_antennas, { "Physical Antennas", "nfapi.physical.antennas", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_advance, { "Timing Advance", "nfapi.timing.advance", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timing_advance_r9, { "Timing Advance R9", "nfapi.timing.advance.r9", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_cc_reported, { "Number of CC reported", "nfapi.number.of.cc.reported", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_preamble, { "Preamble", "nfapi.preamble", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rach_resource_type, { "RACH resource type", "nfapi.rach.resource.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_doppler_estimation, { "Doppler estimation", "nfapi.doppler.estimation", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rb_start, { "RB Start", "nfapi.rb.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_snr, { "SNR", "nfapi.snr", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_up_pts_symbol, { "UpPTS Symbol", "nfapi.uppts.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_prb_per_subband, { "numPRBperSubband", "nfapi.num.prb.per.subband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_antennas, { "numAntennas", "nfapi.num.antennas", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_subband_index, { "subbandIndex", "nfapi.subband.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_channel_coefficient, { "Channel", "nfapi.channel.coefficient", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_ul_rtoa, { "UL_RTOA", "nfapi.ul.rtoa", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_frequency_band_indicator, { "Frequency Band Indicator", "nfapi.frequency.band.indicator", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_measurement_period, { "Measurement Period", "nfapi.measurement.period", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_bandwidth, { "Bandwidth", "nfapi.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_timeout, { "Timeout", "nfapi.timeout", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_earfcns, { "Number of EARFCNs", "nfapi.number.of.earfcns", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_earfcn_list, { "EARFCN List", "nfapi.earfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_uarfcn, { "UARFCN", "nfapi.uarfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_uarfcns, { "Number of UARFCNs", "nfapi.number.of.uarfcn", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_uarfcn_list, { "UARFCN List", "nfapi.uarfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_arfcn, { "ARFCN", "nfapi.arfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_arfcn_direction, { "Direction", "nfapi.arfcn.direction", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_arfcns, { "Number of ARFCNs", "nfapi.number.of.arfcn", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_arfcn_list, { "ARFCN List", "nfapi.arfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rssi, { "RSSI", "nfapi.rssi", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_rssi, { "Number of RSSI", "nfapi.number.of.rssi", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rssi_list, { "RSSI List", "nfapi.rssi.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pci, { "PCI", "nfapi.pci", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_measurement_bandwidth, { "Measurement Bandwidth", "nfapi.measurement.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_exhaustive_search, { "Exhaustive Search", "nfapi.exhaustive.search", FT_UINT8, BASE_DEC, VALS(exhustive_search_vals), 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_pci, { "Number of PCI", "nfapi.number.of.pci", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pci_list, { "PCI List", "nfapi.pci.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_psc, { "PSC", "nfapi.psc", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_psc, { "Number of PSC", "nfapi.number.of.psc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_psc_list, { "PCS List", "nfapi.psc.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rsrp, { "RSRP", "nfapi.rsrp", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rsrq, { "RSRQ", "nfapi.rsrq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_lte_cells_found, { "Number of LTE Cells Found", "nfapi.number.of.lte.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_lte_cells_found_list, { "LTE Cells Found List", "nfapi.lte.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rscp, { "RSCP", "nfapi.rscp", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_enco, { "EcNo", "nfapi.ecno", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_utran_cells_found, { "Number of UTRAN Cells Found", "nfapi.number.of.utran.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_utran_cells_found_list, { "UTRAN Cells Found List", "nfapi.utran.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_bsic, { "BSIC", "nfapi.bsic", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rxlev, { "RxLev", "nfapi.rxlev", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_rxqual, { "RxQual", "nfapi.rxqual", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_sfn_offset, { "SFN Offset", "nfapi.sfn.offset", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_geran_cells_found, { "Number of GSM Cells Found", "nfapi.number.of.geran.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_geran_cells_found_list, { "GERAN Cells Found List", "nfapi.geran.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_tx_antenna, { "Number of Tx Antenna", "nfapi.number.of.tx.antenna", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_mib_length, { "MIB Length", "nfapi.mib.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_mib, { "MIB", "nfapi.mib", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_phich_configuration, { "PHICH Configuration", "nfapi.phich.configuration", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_retry_count, { "retryCount", "nfapi.retry.count", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_sib1, { "SIB1", "nfapi.sib1", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_si_periodicity, { "SI Periodicity", "nfapi.si.periodicity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_si_index, { "SI Index", "nfapi.si.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_number_of_si_periodicity, { "Number of SI Periodicity", "nfapi.number.of.si.periodicity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_si_periodicity_list, { "SI Periodicity List", "nfapi.si.periodicity.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_si_window_length, { "SI Window Length", "nfapi.si.window.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_sib_type, { "SIB Type", "nfapi.sib.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_sib_len, { "SIB Length", "nfapi.sib.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_sib, { "SIB", "nfapi.sib", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_si_len, { "SI Length", "nfapi.si.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_si, { "SI", "nfapi.si", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_search_state, { "State", "nfapi.state", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- { &hf_nfapi_pnf_broadcast_state, { "State", "nfapi.state", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, +- +- }; +- +- /* Setup protocol subtree array */ +- static gint *ett[] = { +- &ett_nfapi_message_tree, +- &ett_nfapi_p4_p5_message_header, +- &ett_nfapi_p7_message_header, +- &ett_nfapi_tlv_tree, +- &ett_nfapi_tl, +- &ett_nfapi_pnf_param_response, +- &ett_nfapi_pnf_phy_rf_config, +- &ett_nfapi_pnf_phy_rf_config_instance, +- &ett_nfapi_pnf_phy, +- &ett_nfapi_pnf_phy_rel10, +- &ett_nfapi_pnf_phy_rel11, +- &ett_nfapi_pnf_phy_rel12, +- &ett_nfapi_pnf_phy_rel13, +- &ett_nfapi_pnf_rf, +- &ett_nfapi_phy_state, +- &ett_nfapi_rf_bands, +- &ett_nfapi_bf_vectors, +- &ett_nfapi_csi_rs_bf_vector, +- &ett_nfapi_csi_rs_resource_configs, +- &ett_nfapi_tx_antenna_ports, +- &ett_nfapi_harq_ack_nack_data, +- &ett_nfapi_harq_data, +- &ett_nfapi_cc, +- &ett_nfapi_rbs, +- &ett_nfapi_antennas, +- &ett_nfapi_epdcch_prbs, +- &ett_nfapi_dl_config_request_body, +- &ett_nfapi_dl_config_request_pdu_list, +- &ett_nfapi_ul_config_request_pdu_list, +- &ett_nfapi_hi_dci0_request_pdu_list, +- &ett_nfapi_tx_request_pdu_list, +- &ett_nfapi_rx_indication_pdu_list, +- &ett_nfapi_harq_indication_pdu_list, +- &ett_nfapi_crc_indication_pdu_list, +- &ett_nfapi_sr_indication_pdu_list, +- &ett_nfapi_cqi_indication_pdu_list, +- &ett_nfapi_preamble_indication_pdu_list, +- &ett_nfapi_srs_indication_pdu_list, +- &ett_nfapi_lbt_dl_config_pdu_list, +- &ett_nfapi_lbt_dl_indication_pdu_list, +- &ett_nfapi_dl_config_request_dlsch_pdu_rel8, +- &ett_nfapi_dl_config_request_dlsch_pdu_rel9, +- &ett_nfapi_dl_config_request_dlsch_pdu_rel10, +- &ett_nfapi_dl_config_bch_pdu_rel8, +- &ett_nfapi_dl_config_mch_pdu_rel8, +- &ett_nfapi_dl_config_pch_pdu_rel8, +- &ett_nfapi_dl_config_dci_dl_pdu_rel8, +- &ett_nfapi_dl_config_dci_dl_pdu_rel9, +- &ett_nfapi_dl_config_dci_dl_pdu_rel10, +- &ett_nfapi_dl_config_prs_pdu_rel9, +- &ett_nfapi_dl_config_csi_rs_pdu_rel10, +- &ett_nfapi_subbands, +- &ett_nfapi_precoding, +- &ett_nfapi_bf_vector_antennas, +- &ett_nfapi_ul_config_request_body, +- &ett_nfapi_ul_config_harq_buffer_pdu, +- &ett_nfapi_ul_config_ue_information_rel8, +- &ett_nfapi_ul_config_sr_information_pdu_rel8, +- &ett_nfapi_ul_config_ulsch_pdu_rel8, +- &ett_nfapi_ul_config_ulsch_pdu_rel10, +- &ett_nfapi_ul_config_cqi_ri_information_rel8, +- &ett_nfapi_ul_config_cqi_ri_information_rel9, +- &ett_nfapi_ul_config_ulsch_harq_information_rel10, +- &ett_nfapi_ul_config_initial_transmission_parameters_rel8, +- &ett_nfapi_ul_config_cqi_information_rel8, +- &ett_nfapi_ul_config_cqi_information_rel10, +- &ett_nfapi_ul_config_sr_information_rel8, +- &ett_nfapi_ul_config_sr_information_rel10, +- &ett_nfapi_ul_config_harq_information_rel10_tdd, +- &ett_nfapi_ul_config_harq_information_rel8_fdd, +- &ett_nfapi_ul_config_harq_information_rel9_fdd, +- &ett_nfapi_ul_config_srs_pdu_rel8, +- &ett_nfapi_ul_config_srs_pdu_rel10, +- &ett_nfapi_crc_indication_body, +- +- &ett_nfapi_earfcn_list, +- &ett_nfapi_uarfcn_list, +- &ett_nfapi_arfcn_list, +- &ett_nfapi_rssi_list, +- &ett_nfapi_pci_list, +- &ett_nfapi_psc_list, +- &ett_nfapi_lte_cells_found_list, +- &ett_nfapi_utran_cells_found_list, +- &ett_nfapi_geran_cells_found_list, +- &ett_nfapi_si_periodicity_list, +- +- /* for fragmentation support*/ +- &ett_msg_fragment, +- &ett_msg_fragments +- }; +- +- static ei_register_info ei[] = +- { +- { &ei_power_invalid, { "nfapi.power.invalid", PI_PROTOCOL, PI_ERROR, "Tx Power range invalid [0 - 10000]", EXPFILL } }, +- { &ei_ref_sig_power_invalid, { "nfapi.ref_sig_power.invalid", PI_PROTOCOL, PI_ERROR, "Ref Sig Power range invalid [0 - 255]", EXPFILL }}, +- { &ei_invalid_range, { "nfapi.invalid.range", PI_PROTOCOL, PI_ERROR, "Out of valid range. Todo create more specific error", EXPFILL } }, +- }; +- +- +- +- expert_module_t* expert_nfapi; +- +- /* Register protocol */ +- proto_nfapi = proto_register_protocol("Nfapi", "NFAPI", "nfapi"); +- +- expert_nfapi = expert_register_protocol(proto_nfapi); +- +- expert_register_field_array(expert_nfapi, ei, array_length(ei)); +- +- proto_register_field_array(proto_nfapi, hf, array_length(hf)); +- proto_register_subtree_array(ett, array_length(ett)); +- +- reassembly_table_register(&ul_p7_reassemble_table, &addresses_ports_reassembly_table_functions); +- reassembly_table_register(&dl_p7_reassemble_table, &addresses_ports_reassembly_table_functions); +- +- register_dissector("nfapi", dissect_nfapi, proto_nfapi); +- +-} +- +-// ----------------------------------------------------------------------------| +- +-void proto_reg_handoff_nfapi(void) +-{ +- static dissector_handle_t nfapi_handle; +- +- nfapi_handle = create_dissector_handle(dissect_nfapi, proto_nfapi); +- +- dissector_add_for_decode_as("sctp.port", nfapi_handle); +- +- dissector_add_uint("udp.port", 41700, nfapi_handle); +- +-} ++ ++ default: ++ { ++ if (msg_id >= 0x112 && msg_id <= 0x017f) ++ { ++ // reserved P5 message ++ } ++ else if (msg_id >= 0x183 && msg_id <= 0x01ff) ++ { ++ // reserved P7 message ++ } ++ else if (msg_id >= 0x0200 && msg_id <= 0x02ff) ++ { ++ // reserved P4 message ++ } ++ else if (msg_id >= 0x0300 && msg_id <= 0x03ff) ++ { ++ // reserved vendor extentions ++ } ++ ++ break; ++ } ++ }; ++ ++ ptvcursor_pop_subtree(ptvc); ++ ptvcursor_free(ptvc); ++ ++ return tvb_captured_length(tvb); ++} ++ ++static void nfapi_tag_vals_fn(gchar* s, guint32 v) ++{ ++ const tlv_t* tlv = look_up_tlv(v); ++ if (tlv != 0) ++ { ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", tlv->name, v); ++ } ++ else ++ { ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", "Unknown", v); ++ } ++} ++static void neg_pow_conversion_fn(gchar* s, guint8 v) ++{ ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%d dB (%d)", ((gint16)v * (-1)), v); ++} ++static void power_offset_conversion_fn(gchar* s, guint16 v) ++{ ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v * 0.001) - 6.0), v); ++} ++static void reference_signal_power_conversion_fn(gchar* s, guint16 v) ++{ ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v * 0.25) - 63.75), v); ++} ++static void laa_threshold_conversion_fn(gchar* s, guint16 v) ++{ ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (float)(v * -100.00), v); ++} ++static void max_transmit_power_2_conversion_fn(gchar* s, guint16 v) ++{ ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1) - 10.0, v); ++} ++static void max_transmit_power_conversion_fn(gchar* s, guint16 v) ++{ ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v); ++} ++static void sfn_sf_conversion_fn(gchar* s, guint16 v) ++{ ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%d/%d (%d)", v >> 0x4, v & 0x000F, v); ++} ++static void rssi_conversion_fn(gchar* s, guint16 v) ++{ ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v); ++} ++static void dl_rs_tx_pow_measment_conversion_fn(gchar* s, guint16 v) ++{ ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v); ++} ++ ++static void ul_cqi_conversion_fn(gchar* s, guint16 v) ++{ ++ g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v / 2 ) - 64.0), v); ++} ++ ++// ----------------------------------------------------------------------------| ++ ++void proto_register_nfapi(void) ++{ ++ static hf_register_info hf[] = ++ { ++ { &hf_msg_fragments, ++ { "Message fragments", "nfapi.fragments", ++ FT_NONE, BASE_NONE, NULL, 0x00, ++ NULL, HFILL } ++ }, ++ { &hf_msg_fragment, ++ { "Message fragment", "nfapi.fragment", ++ FT_FRAMENUM, BASE_NONE, NULL, 0x00, ++ NULL, HFILL } ++ }, ++ { &hf_msg_fragment_overlap, ++ { "Message fragment overlap", "nfapi.fragment.overlap", ++ FT_BOOLEAN, 0, NULL, 0x00, ++ NULL, HFILL } ++ }, ++ { &hf_msg_fragment_overlap_conflicts, ++ { "Message fragment overlapping with conflicting data", "nfapi.fragment.overlap.conflicts", ++ FT_BOOLEAN, 0, NULL, 0x00, ++ NULL, HFILL } ++ }, ++ { &hf_msg_fragment_multiple_tails, ++ { "Message has multiple tail fragments", "nfapi.fragment.multiple_tails", ++ FT_BOOLEAN, 0, NULL, 0x00, ++ NULL, HFILL } ++ }, ++ { &hf_msg_fragment_too_long_fragment, ++ { "Message fragment too long", "nfapi.fragment.too_long_fragment", ++ FT_BOOLEAN, 0, NULL, 0x00, ++ NULL, HFILL } ++ }, ++ { &hf_msg_fragment_error, ++ { "Message defragmentation error", "nfapi.fragment.error", ++ FT_FRAMENUM, BASE_NONE, NULL, 0x00, ++ NULL, HFILL } ++ }, ++ { &hf_msg_fragment_count, ++ { "Message fragment count", "nfapi.fragment.count", ++ FT_UINT32, BASE_DEC, NULL, 0x00, ++ NULL, HFILL } ++ }, ++ { &hf_msg_reassembled_in, ++ { "Reassembled in", "nfapi.reassembled.in", ++ FT_FRAMENUM, BASE_NONE, NULL, 0x00, ++ NULL, HFILL } ++ }, ++ { &hf_msg_reassembled_length, ++ { "Reassembled length", "nfapi.reassembled.length", ++ FT_UINT32, BASE_DEC, NULL, 0x00, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_p4_p5_message_header_phy_id, ++ { "PHY ID", "nfapi.p4_p5_message_header.phy_id", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Within the PNF Device, the unique identity of the PHY instance as assigned through the PNF_CONFIG.request", HFILL } ++ }, ++ { &hf_nfapi_p4_p5_message_header_message_id, ++ { "Message ID", "nfapi.p4_p5_message_header.message_id", ++ FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, ++ "The nFAPI message identity", HFILL } ++ }, ++ { &hf_nfapi_p4_p5_message_header_message_length, ++ { "Message Length", "nfapi.p4_p5_message_header.message_length", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The length in bytes of the message including the header", HFILL } ++ }, ++ { &hf_nfapi_p4_p5_message_header_spare, ++ { "Spare", "nfapi.p4_p5_message_header.spare", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Reserved field to be populated with zeros on transmission and ignored on reception", HFILL } ++ }, ++ { &hf_nfapi_p7_message_header_phy_id, ++ { "Phy ID", "nfapi.p7_message_header.phy_id", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Within the PNF Device, the unique identity of the PHY instance as assigned through the PNF_CONFIG.request", HFILL } ++ }, ++ { &hf_nfapi_p7_message_header_message_id, ++ { "Message ID", "nfapi.p7.message_header.message_id", ++ FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, ++ "The nFAPI message identity", HFILL } ++ }, ++ { &hf_nfapi_p7_message_header_message_length, ++ { "Message Length", "nfapi.p7_message_header.message_length", ++ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_byte_bytes, 0x0, ++ "The length in bytes of the message segment including the header", HFILL } ++ }, ++ { &hf_nfapi_p7_message_header_m, ++ { "M", "nfapi.p7_message_header.m_segment_sequence", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "A More flag indicating there are more segments to follow to complete the entire message", HFILL } ++ }, ++ { &hf_nfapi_p7_message_header_segment, ++ { "Segment Number", "nfapi.p7_message_header.m_segment_sequence", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The segment number starting at zero and incrementing by one between each segment", HFILL } ++ }, ++ { &hf_nfapi_p7_message_header_sequence_number, ++ { "Sequence Number", "nfapi.p7_message_header.m_segment_sequence", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The incrementing sequence number for all complete messages over the P7 nFAPI interface per PHY instance", HFILL } ++ }, ++ { &hf_nfapi_p7_message_header_checksum, ++ { "Checksum", "nfapi.p7_message_header.checksum", ++ FT_UINT32, BASE_HEX_DEC, NULL, 0x0, ++ "The checksum of the whole message segment (including header) as calculated using " ++ "the CRC32c algorithm following the same method as the SCTP protocol defined in IETF RFC 4960 " ++ "The Checksum is optional to populate and must be filled with zero's when not used", HFILL } ++ }, ++ { &hf_nfapi_p7_message_header_transmit_timestamp, ++ { "Transmit Timestamp", "nfapi.p7_message_header.timestamp", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "The offset from VNF SFN/SF 0/0 time reference of the message transmission at the transport layer, in microseconds, with a range of 0 to 10239999", HFILL } ++ }, ++ { &hf_nfapi_tl_tag, ++ { "TLV Tag", "nfapi.tl_tag", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(nfapi_tag_vals_fn), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_tl_length, ++ { "TLV Length", "nfapi.tl_length", ++ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_byte_bytes, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_error_code, ++ { "Error Code", "nfapi.error.code", ++ FT_UINT8, BASE_DEC, VALS(nfapi_error_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_p4_error_code, ++ { "Error Code", "nfapi.p4_error.code", ++ FT_UINT8, BASE_DEC, VALS(nfapi_p4_error_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_rat_type, ++ { "RAT Type", "nfapi.rat_type", ++ FT_UINT8, BASE_DEC, VALS(nfapi_rat_type_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_num_tlv, ++ { "Number of TLV", "nfapi.param.response.num_tlv", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_phy_state, ++ { "Phy state value", "nfapi.phy.state", ++ FT_UINT16, BASE_DEC, VALS(nfapi_phy_state_vals), 0x0, ++ "Indicates the current operational state of the PHY", HFILL } ++ }, ++ { &hf_nfapi_dl_ue_per_sf, ++ { "Downlink UEs per Subframe", "nfapi.dl.ue.per.sf", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The maximum number of downlink UEs per subframe supported." ++ "This is the maximum number of downlink UEs that can be scheduled per " ++ "subframe, non-inclusive of broadcast, paging and common channels.", HFILL } ++ }, ++ { &hf_nfapi_ul_ue_per_sf, ++ { "Uplink UEs per Subframe", "nfapi.ul.ue.per.sf", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The maximum number of uplink UEs per subframe supported." ++ "This is the maximum number of uplink UEs that can be scheduled per " ++ "subframe, non-inclusive of common channels.", HFILL } ++ }, ++ { &hf_nfapi_duplex_mode, ++ { "Duplex Mode", "nfapi.duplex.mode", ++ FT_UINT16, BASE_DEC, VALS(nfapi_duplex_mode_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_bandwidth_support, ++ { "Downlink bandwidth support", "nfapi.dl.bandwidth.support", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The PHY downlink channel bandwidth capability (in resource blocks)", HFILL } ++ }, ++ { &hf_nfapi_dl_bandwidth_support_6, ++ { "6Mhz", "nfapi.dl.bandwidth.support.6", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_bandwidth_support_15, ++ { "15Mhz", "nfapi.dl.bandwidth.support.15", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_bandwidth_support_25, ++ { "25Mhz", "nfapi.dl.bandwidth.support.25", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_bandwidth_support_50, ++ { "50Mhz", "nfapi.dl.bandwidth.support.50", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_bandwidth_support_75, ++ { "75Mhz", "nfapi.dl.bandwidth.support.75", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_bandwidth_support_100, ++ { "100Mhz", "nfapi.dl.bandwidth.support.100", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ul_bandwidth_support, ++ { "Uplink bandwidth support", "nfapi.ul.bandwidth.support", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The PHY uplink channel bandwidth capability (in resource blocks)", HFILL } ++ }, ++ { &hf_nfapi_ul_bandwidth_support_6, ++ { "6Mhz", "nfapi.ul.bandwidth.support.6", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ul_bandwidth_support_15, ++ { "15Mhz", "nfapi.ul.bandwidth.support.15", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ul_bandwidth_support_25, ++ { "25Mhz", "nfapi.ul.bandwidth.support.25", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ul_bandwidth_support_50, ++ { "50Mhz", "nfapi.ul.bandwidth.support.50", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ul_bandwidth_support_75, ++ { "75Mhz", "nfapi.ul.bandwidth.support.75", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ul_bandwidth_support_100, ++ { "100Mhz", "nfapi.ul.bandwidth.support.100", ++ FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_modulation_support, ++ { "Downlink modulation support", "nfapi.dl.modulation.support", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The PHY downlink modulation capability", HFILL } ++ }, ++ { &hf_nfapi_dl_modulation_support_qpsk, ++ { "QPSK", "nfapi.dl.modulation.support.qpsk", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_modulation_support_16qam, ++ { "16QAM", "nfapi.dl.modulation.support.16qam", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_modulation_support_64qam, ++ { "64QAM", "nfapi.dl.modulation.support.64qam", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_modulation_support_256qam, ++ { "256QAM", "nfapi.dl.modulation.support.256qam", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ul_modulation_support, ++ { "Uplink modulation support", "nfapi.ul.modulation.support", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The PHY uplink modulation capability", HFILL } ++ }, ++ { &hf_nfapi_ul_modulation_support_qpsk, ++ { "QPSK", "nfapi.ul.modulation.support.qpsk", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ul_modulation_support_16qam, ++ { "16QAM", "nfapi.ul.modulation.support.16qam", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ul_modulation_support_64qam, ++ { "64QAM", "nfapi.ul.modulation.support.64qam", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_phy_antenna_capability, ++ { "Phy Antenna capability", "nfapi.phy.antenna.capability", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of antennas supported", HFILL } ++ }, ++ { &hf_nfapi_release_capability, ++ { "Release capability", "nfapi.release.capability", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates which release the PHY supports", HFILL } ++ }, ++ { &hf_nfapi_mbsfn_capability, ++ { "MBSFN capability", "nfapi.mbsfn.capability", ++ FT_BOOLEAN, 8, TFS(&support_strname), 0x0, ++ "Indicates support for MBSFN features", HFILL } ++ }, ++ { &hf_nfapi_laa_capability, ++ { "LAA Support", "nfapi.laa.support", ++ FT_BOOLEAN, 8, TFS(&support_strname), 0x0, ++ "Indicates support for LAA features", HFILL } ++ }, ++ { &hf_nfapi_pd_sensing_lbt_support, ++ { "PD sensing LBT support", "nfapi.pd.sensing.lbt.support", ++ FT_BOOLEAN, 8, TFS(&support_strname), 0x0, ++ "Indicates support for PD sensing in L1", HFILL } ++ }, ++ { &hf_nfapi_multi_carrier_lbt_support, ++ { "Multi carrier LBT support", "nfapi.multi.carrier.lbt.support", ++ FT_UINT16, BASE_DEC, VALS(nfapi_mutli_carrier_lbt_support_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_partial_sf_support, ++ { "Partial SF support", "nfapi.partial.sf.support", ++ FT_BOOLEAN, 8, TFS(&partial_sf_support_strname), 0x0, ++ "Indicates support for Partial SF in L1", HFILL } ++ }, ++ { &hf_nfapi_reference_signal_power, ++ { "Reference signal power", "nfapi.ref_sig_power", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(reference_signal_power_conversion_fn), 0x0, ++ "Normalized value levels (relative) to accommodate different absolute Tx Power used by eNb", HFILL } ++ }, ++ { &hf_nfapi_primary_synchronization_signal_epre_eprers, ++ { "Primary synchronization signal EPRE/EPRERS", "nfapi.primary.sync.signal", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, ++ "The power of synchronization signal with respect to the reference signal, (PSS for LTE cell, NPSS for NB-IOT cell)", HFILL } ++ }, ++ { &hf_nfapi_secondary_synchronization_signal_epre_eprers, ++ { "Secondary synchronization signal EPRE/EPRERS", "nfapi.secondary.sync.signal", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, ++ "The power of synchronization signal with respect to the reference signal, (SSS for LTE cell, NSSS for NB-IOT cell)", HFILL } ++ }, ++ { &hf_nfapi_physical_cell_id, ++ { "Physical Cell ID", "nfapi.physical.cell.id", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The Cell ID sent with the synchronization signal", HFILL } ++ }, ++ { &hf_nfapi_phich_resource, ++ { "PHICH Resource", "nfapi.phich.resource", ++ FT_UINT16, BASE_DEC, VALS(nfapi_phich_resource_vals), 0x0, ++ "The number of resource element groups used for PHICH", HFILL } ++ }, ++ { &hf_nfapi_phich_duration, ++ { "PHICH Duration", "nfapi.phich.duration", ++ FT_BOOLEAN, 8, TFS(&phich_duration_strname), 0x0, ++ "The PHICH duration for MBSFN and non-MBSFN sub-frames", HFILL } ++ }, ++ { &hf_nfapi_phich_power_offset, ++ { "PHICH Power Offset", "nfapi.phich.power.offset", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, ++ "The power per antenna of the PHICH with respect to the reference signal", HFILL } ++ }, ++ { &hf_nfapi_configuration_index, ++ { "Configuration Index", "nfapi.configuration.index", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Provides information about the location and format of the PRACH.", HFILL } ++ }, ++ { &hf_nfapi_root_sequence_index, ++ { "Root sequence Index", "nfapi.root.sequence.index", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "PRACH Root sequence index", HFILL } ++ }, ++ { &hf_nfapi_zero_correlation_zone_configuration, ++ { "Zero correlation zone configuration", "nfapi.zero.correlation.zone.configuration", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Equivalent to Ncs", HFILL } ++ }, ++ { &hf_nfapi_high_speed_flag, ++ { "High Speed Flag", "nfapi.high.speed.flag", ++ FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, ++ "Indicates if unrestricted, or restricted, set of preambles is used", HFILL } ++ }, ++ { &hf_nfapi_frequency_offset, ++ { "Frequency offset", "nfapi.frequency.offset", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The first physical resource block available for PRACH", HFILL } ++ }, ++ { &hf_nfapi_hopping_mode, ++ { "Hopping Mode", "nfapi.hopping.mode", ++ FT_BOOLEAN, 8, TFS(&hopping_mode_strname), 0x0, ++ "If hopping is enabled indicates the type of hopping used", HFILL } ++ }, ++ { &hf_nfapi_hopping_offset, ++ { "Hopping offset", "nfapi.hopping.offset", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The offset used if hopping is enabled", HFILL } ++ }, ++ { &hf_nfapi_delta_pucch_shift, ++ { "Delta PUCCH Shift", "nfapi.delta.pucch.shift", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The cyclic shift difference", HFILL } ++ }, ++ { &hf_nfapi_n_cqi_rb, ++ { "N CQI RB", "nfapi.n.cqi.rb", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The bandwidth, in units of resource blocks, that is available for use by PUCCH formats 2/2a/2b transmission in each slot", HFILL } ++ }, ++ { &hf_nfapi_n_an_cs, ++ { "N AN CS", "nfapi.n.an.cs", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of cyclic shifts used for PUCCH formats 1/1a/1b in a resource block with a mix of formats 1/a/1/ab and 2/2a/2b.", HFILL } ++ }, ++ { &hf_nfapi_n1_pucch_an, ++ { "N1 PUCCH AN", "nfapi.n1.pucch.an", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "N1 PUCCH", HFILL } ++ }, ++ { &hf_nfapi_bandwidth_configuration, ++ { "Bandwidth configuration", "nfapi.bw.configuration", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The available SRS bandwidth of the cell", HFILL } ++ }, ++ { &hf_nfapi_srs_subframe_configuration, ++ { "SRS subframe configuration", "nfapi.srs.subframe.configuration", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The subframe configuration. Needed if semi-static configuration is held in PHY", HFILL } ++ }, ++ { &hf_nfapi_uplink_rs_hopping, ++ { "Uplink RS hopping", "nfapi.uplink.rs.hopping", ++ FT_UINT16, BASE_DEC, VALS(nfapi_uplink_rs_hopping_vals), 0x0, ++ "Indicates the type of hopping to use", HFILL } ++ }, ++ { &hf_nfapi_group_assignment, ++ { "Group assignment", "nfapi.group.assignment", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The sequence shift pattern used if group hopping is enabled", HFILL } ++ }, ++ { &hf_nfapi_cyclic_shift_1_for_drms, ++ { "Cyclic Shift 1 for DRMS", "nfapi.cyclic.shift.1.for.drms", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Specifies the cyclic shift for the reference signal used in the cell.", HFILL } ++ }, ++ { &hf_nfapi_subframe_assignment, ++ { "Subframe_assignment", "nfapi.subframe.assignment", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "For TDD mode only, indicates the DL/UL subframe structure", HFILL } ++ }, ++ { &hf_nfapi_special_subframe_patterns, ++ { "Special Subframe patterns", "nfapi.special.subframe.patterns", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "For TDD mode only. Length of fields DwPTS, GP and UpPTS", HFILL } ++ }, ++ { &hf_nfapi_ed_threshold_for_lbt_for_pdsch, ++ { "ED Threshold for LBT for PDSCH", "nfapi.ed.threshold.for.lbt.pdsch", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0, ++ "Indicates the energy detection threshold in dBm for LBT for PDSCH", HFILL } ++ }, ++ { &hf_nfapi_ed_threshold_for_lbt_for_drs, ++ { "ED Threshold for LBT for DRS", "nfapi.ed.threshold.for.lbt.for.drs", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0, ++ "Indicates the energy detection threshold in dBm for LBT for DRS", HFILL } ++ }, ++ { &hf_nfapi_pd_threshold, ++ { "PD Threshold", "nfapi.pd.threshold", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0, ++ "Indicates the preamble detection threshold in dBm, if the L1 capabilities support PD", HFILL } ++ }, ++ { &hf_nfapi_multi_carrier_type, ++ { "Multi carrier type", "nfapi.multi.carrier.type", ++ FT_UINT16, BASE_DEC, VALS(nfapi_laa_carrier_type_vals), 0x0, ++ "Indicates multi carrier type configuration of L1 (according to L1 capabilities and L2 scheduler requirements", HFILL } ++ }, ++ { &hf_nfapi_multi_carrier_tx, ++ { "Multi carrier TX", "nfapi.multi.carrier.tx", ++ FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_tx_strname), 0x0, ++ "Indicates multi carrier transmission configuration of L1 (according to type if supporting multi carrier)", HFILL } ++ }, ++ { &hf_nfapi_multi_carrier_freeze, ++ { "Multi carrier freeze", "nfapi.multi.carrier.freeze", ++ FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_freeze_strname), 0x0, ++ "Indicates multi carrier freeze, configuration of L1 (applicable only to type A type if supporting multi carrier)", HFILL } ++ }, ++ { &hf_nfapi_tx_antenna_ports_for_drs, ++ { "Tx antenna ports for DRS", "nfapi.tx.antenna.ports.for.drs", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of cell specific transmit antenna ports within the DRS occasions", HFILL } ++ }, ++ { &hf_nfapi_transmission_power_for_drs, ++ { "Transmission power for DRS", "nfapi.transmission.power.for.drs.", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, ++ "Offset of cell specific Reference signals power within DRS occasions to the reference signal power", HFILL } ++ }, ++ { &hf_nfapi_pbch_repetitions_enabled_r13, ++ { "PBCH Repetitions enable R13", "nfapi.pbch.repetitions.enabled_r13", ++ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, ++ "Enable / Disable PBCH repetitions", HFILL } ++ }, ++ { &hf_nfapi_prach_cat_m_root_sequence_index, ++ { "PRACH CAT-M Root sequence index", "nfapi.prach.cat_m.root.squence.index", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "PRACH Root sequence index", HFILL } ++ }, ++ { &hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, ++ { "PRACH CAT-M Zero correlation zone configuration", "nfapi.prach.cat_m.zero.correlation.zone.configuration", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Equivalent to Ncs", HFILL } ++ }, ++ { &hf_nfapi_prach_cat_m_high_speed_flag, ++ { "PRACH CAT-M High speed flag", "nfapi.prach.cat_m.high.speed.flag", ++ FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, ++ "Indicates if unrestricted, or restricted, set of preambles is used", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_0_enable, ++ { "PRACH CE level #0 Enable", "nfapi.prach.ce.level.0.enable", ++ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, ++ "Enable \\ Disable CE level #0.", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_0_configuration_index, ++ { "PRACH CE level #0 Configuration index", "nfapi.prach.ce.level.0.configuration.index", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Provides information about the location and format of the PRACH", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_0_frequency_offset, ++ { "PRACH CE level #0 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The first physical resource block available for PRACH for each CE", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, ++ { "PRACH CE level #0 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of PRACH repetitions per attempt for each CE level", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, ++ { "CE level #0 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_0_hopping_enabled, ++ { "PRACH CE level #0 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", ++ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, ++ "Enable \\ Disable PRACH frequency hopping for each CE level", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_0_hopping_offset, ++ { "PRACH CE level #0 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Valid in case 'PRACH Hopping Enable' is enabled", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_1_enable, ++ { "PRACH CE level #1 Enable", "nfapi.prach.ce.level.0.enable", ++ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, ++ "Enable \\ Disable CE level #1", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_1_configuration_index, ++ { "PRACH CE level #1 Configuration index", "nfapi.prach.ce.level.1.configuration.index", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Provides information about the location and format of the PRACH", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_1_frequency_offset, ++ { "PRACH CE level #1 Frequency offset", "nfapi.prach.ce.level.1.frequency_offset", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The first physical resource block available for PRACH for each CE", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, ++ { "PRACH CE level #1 Number of repetitions per attempt", "nfapi.prach.ce.level.1.number.of.repetitions.per_attempt", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of PRACH repetitions per attempt for each CE level", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, ++ { "CE level #1 Starting subframe periodicity", "nfapi.prach.ce.level.1.starting.subframe_periodicity", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Optional.PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities),", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_1_hopping_enabled, ++ { "PRACH CE level #1 Hopping Enable", "nfapi.prach.ce.level.1.hopping_enable", ++ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, ++ "Enable \\ Disable PRACH frequency hopping for each CE level.", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_1_hopping_offset, ++ { "PRACH CE level #1 Hopping Offset", "nfapi.prach.ce.level.1.hopping.offset", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Valid in case 'PRACH Hopping Enable' is enabled.", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_2_enable, ++ { "PRACH CE level #2 Enable", "nfapi.prach.ce.level.2.enable", ++ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, ++ "Enable \\ Disable CE level #2", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_2_configuration_index, ++ { "PRACH CE level #2 Configuration index", "nfapi.prach.ce.level.2.configuration.index", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Provides information about the location and format of the PRACH", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_2_frequency_offset, ++ { "PRACH CE level #2 Frequency offset", "nfapi.prach.ce.level.2.frequency_offset", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The first physical resource block available for PRACH for each CE", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, ++ { "PRACH CE level #2 Number of repetitions per attempt", "nfapi.prach.ce.level.2.number.of.repetitions.per_attempt", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of PRACH repetitions per attempt for each CE level", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, ++ { "CE level #2 Starting subframe periodicity", "nfapi.prach.ce.level.2.starting.subframe_periodicity", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_2_hopping_enabled, ++ { "PRACH CE level #2 Hopping Enable", "nfapi.prach.ce.level.2.hopping_enable", ++ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, ++ "Enable \\ Disable PRACH frequency hopping for each CE level", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_2_hopping_offset, ++ { "PRACH CE level #2 Hopping Offset", "nfapi.prach.ce.level.2.hopping.offset", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Valid in case 'PRACH Hopping Enable' is enabled.", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_3_enable, ++ { "PRACH CE level #3 Enable", "nfapi.prach.ce.level.3.enable", ++ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, ++ "Enable \\ Disable CE level #3.", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_3_configuration_index, ++ { "PRACH CE level #3 Configuration index", "nfapi.prach.ce.level.3.configuration.index", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Provides information about the location and format of the PRACH.", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_3_frequency_offset, ++ { "PRACH CE level #3 Frequency offset", "nfapi.prach.ce.level.3.frequency_offset", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The first physical resource block available for PRACH for each CE", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, ++ { "PRACH CE level #3 Number of repetitions per attempt", "nfapi.prach.ce.level.3.number.of.repetitions.per_attempt", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of PRACH repetitions per attempt for each CE level", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, ++ { "CE level #3 Starting subframe periodicity", "nfapi.prach.ce.level.3.starting.subframe_periodicity", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_3_hopping_enabled, ++ { "PRACH CE level #3 Hopping Enable", "nfapi.prach.ce.level.3.hopping_enable", ++ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, ++ "Enable \\ Disable PRACH frequency hopping for each CE level.", HFILL } ++ }, ++ { &hf_nfapi_prach_ce_level_3_hopping_offset, ++ { "PRACH CE level #3 Hopping Offset", "nfapi.prach.ce.level.3.hopping.offset", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Valid in case 'PRACH Hopping Enable' is enabled.", HFILL } ++ }, ++ { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, ++ { "PUCCH Interval-ULHoppingConfigCommonModeA", "nfapi.pucch.interval.ulhopping.config.common.mode.a", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "NthULNB for UEModeA", HFILL } ++ }, ++ { &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, ++ { "PUCCH Interval-ULHoppingConfigCommonModeB", "nfapi.pucch.interval.ulhopping.config.common.mode.b", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "NthULNB for UEModeB", HFILL } ++ }, ++ { &hf_nfapi_data_report_mode, ++ { "Data Report Mode", "nfapi.data.report.mode", ++ FT_BOOLEAN, 8, TFS(&data_report_mode_vals), 0x0, ++ "The data report mode for the uplink data", HFILL } ++ }, ++ { &hf_nfapi_sfnsf, ++ { "SFN/SF", "nfapi.sfn.sf", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(sfn_sf_conversion_fn), 0x0, ++ "The future SFN/SF subframe where the TLVs included in the message should be applied", HFILL } ++ }, ++ { &hf_nfapi_max_up_pts, ++ { "Max UpPTS frames", "nfapi.max.uppts.frame", ++ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0, ++ "Used for TDD only and indicates how SRS operates in UpPTS subframes", HFILL } ++ }, ++ { &hf_nfapi_srs_acknack_srs_simultaneous_transmission, ++ { "SRS AckNack Simultaneous transmission", "nfapi.srs.acknack.simult.tx", ++ FT_BOOLEAN, 8, TFS(&srs_simult_tx_strname), 0x0, ++ "Indicates if SRS and ACK/NACK can be received in the same subframe. Needed if semi-static configuration is held in PHY.", HFILL } ++ }, ++ { &hf_nfapi_pnf_address_ipv4, ++ { "PNF IPV4", "nfapi.pnf.address.ipv4", ++ FT_IPv4, BASE_NONE, NULL, 0x0, ++ "The IPv4 address of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL } ++ }, ++ { &hf_nfapi_pnf_address_ipv6, ++ { "PNF IPV6", "nfapi.pnf.address.ipv6", ++ FT_IPv6, BASE_NONE, NULL, 0x0, ++ "The IPv6 address of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL } ++ }, ++ { &hf_nfapi_vnf_address_ipv4, ++ { "VNF IPV4 Address", "nfapi.vnf.address.ipv4", ++ FT_IPv4, BASE_NONE, NULL, 0x0, ++ "The IPv4 address of the VNF to be used by the PNF for this P7 PHY instance", HFILL } ++ }, ++ { &hf_nfapi_vnf_address_ipv6, ++ { "VNF IPV6 Address", "nfapi.vnf.address.ipv6", ++ FT_IPv6, BASE_NONE, NULL, 0x0, ++ "The IPv6 address of the VNF to be used by the PNF for this P7 PHY instance", HFILL } ++ }, ++ { &hf_nfapi_pnf_port, ++ { "PNF PORT value", "nfapi.config.pnf.port.value", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The port of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL } ++ }, ++ { &hf_nfapi_vnf_port, ++ { "VNF PORT value", "nfapi.config.vnf.port.value", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The port of the VNF to be used by the PNF for this P7 PHY instance", HFILL } }, ++ { &hf_nfapi_sync_mode, ++ { "Sync Mode", "nfapi.sync.mode", ++ FT_UINT8, BASE_DEC, VALS(nfapi_sync_mode_vals), 0x0, ++ "The method of nFAPI Synchronization supported by the PNF", HFILL } ++ }, ++ { &hf_nfapi_location_mode, ++ { "Location Mode", "nfapi.location.mode", ++ FT_UINT8, BASE_DEC, VALS(location_mode_vals), 0x0, ++ "The method of location derivation supported by the PNF", HFILL } ++ }, ++ { &hf_nfapi_location_coordinates_length, ++ { "Location Coordinates Length", "nfapi.location.coordinates.length", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Length in bytes of the Location Coordinates Array field", HFILL } ++ }, ++ { &hf_nfapi_location_coordinates, ++ { "Location Coordinates", "nfapi.location.coordinates", ++ FT_BYTES, BASE_NONE, NULL, 0x0, ++ "The Location of the PNF. The value is formatted as the LocationCoordinates IE using BASIC-PER encoding as defined in " ++ "TS36.355 section 6.4.2. The first bit of the LocationCoordinates IE is in the LSB of the first byte of the array." ++ "The MSBs of the last element of the array may be padded with zeros if the ASN.1 element is not an integer number of bytes", HFILL } ++ }, ++ { &hf_nfapi_pdu, ++ { "PDU", "nfapi.pdu", ++ FT_BYTES, BASE_NONE, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_config_timing, ++ { "DL config Timing", "nfapi.dl.config.timing", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "The timing offset before the air interface subframe start that the DL_Config.request must be received at the PNF.", HFILL } ++ }, ++ { &hf_nfapi_tx_timing, ++ { "Tx Timing", "nfapi.general.tx.timing", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "The timing offset before the air interface subframe start that the TX.request must be received at the PNF.", HFILL } ++ }, ++ { &hf_nfapi_ul_config_timing, ++ { "UL Config Timing", "nfapi.ul.config.timing", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "The timing offset before the air interface subframe start that the UL_CONFIG.request must be received at the PNF.", HFILL } ++ }, ++ { &hf_nfapi_hi_dci0_timing, ++ { "HI DCi0 Timing", "nfapi.hi.dci0.timing", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "The timing offset before the air interface subframe start that the HI_DCI0.request must be received at the PNF.", HFILL } ++ }, ++ { &hf_nfapi_maximum_number_phys, ++ { "Maximum number of Phys", "nfapi.maximum.number.phys", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The maximum number of operational PHYs supported by the PNF device.", HFILL } ++ }, ++ { &hf_nfapi_maximum_total_bandwidth, ++ { "Maximum Total Bandwidth", "nfapi.maximum.total.bandwidth", ++ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, ++ "The total maximum bandwidth (in units of 100kHz) supported by the PNF device.", HFILL } ++ }, ++ { &hf_nfapi_maximum_total_number_dl_layers, ++ { "Maximum Total Number DL Layers", "nfapi.maximum.total.number.dl.layers", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The maximum total number of downlink layers supported.", HFILL } ++ }, ++ { &hf_nfapi_maximum_total_number_ul_layers, ++ { "Maximum Total Number UL Layers", "nfapi.maximum.total.number.ul.layers", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The maximum total number of uplink layers supported across all available PHYs.", HFILL } ++ }, ++ { &hf_nfapi_shared_bands, ++ { "Shared bands", "nfapi.shared.bands", ++ FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x0, ++ "Indication that the PNF device shares the list of RF band options available across all available PHYs, so each may only be used with a single PHY.", HFILL } ++ }, ++ { &hf_nfapi_shared_pa, ++ { "Shared pa", "nfapi.shared.pa", ++ FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x0, ++ "Indication that the PNF device shares a single RF PA across all available PHYs, so that the maximum Total Power is shared across all available PHYs.", HFILL } ++ }, ++ { &hf_nfapi_maximum_total_power, ++ { "Maximum total power", "nfapi.maximum.total.power", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, ++ "The maximum transmit power of the PNF device summed across all PHYs.", HFILL } ++ }, ++ { &hf_nfapi_oui, ++ { "OUI", "nfapi.oui", ++ FT_STRING, BASE_NONE, NULL, 0x0, ++ "The PNF OUI in the format as specified by IEEE", HFILL } ++ }, ++ { &hf_nfapi_pnf_phy_number_phy, ++ { "PNF Phy Number of Phy", "nfapi.pnf.phy.number.phy", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of PHY instances", HFILL } ++ }, ++ { &hf_nfapi_pnf_phy_config_index, ++ { "PNF Phy Config Index", "nfapi.pnf.phy.config.index", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The unique index number of the PHY to permit the PNF to identify the PHY in the PNF_CONFIG.Request", HFILL } ++ }, ++ { &hf_nfapi_number_of_rfs, ++ { "Number of RFs", "nfapi.pnf.rf.number.rf", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of RF configurations", HFILL } ++ }, ++ { &hf_nfapi_phy_rf_config_info_phy_id, ++ { "Phy ID", "nfapi.pnf.phy.rf.config.phy.id", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_rf_config_index, ++ { "RF Config Index", "nfapi.rf_config_index", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The index number defined in the PNF RF struct that the PHY can support", ++ HFILL } ++ }, ++ { &hf_nfapi_number_of_rf_exclusions, ++ { "Number of RF exclusions", "nfapi.hf_nfapi_number_of_rf_exclusions", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of RF configurations excluded from use by this PHY", HFILL } ++ }, ++ { &hf_nfapi_maximum_3gpp_release_supported, ++ { "Maximum 3gpp Release Supported", "nfapi.maximum_3gpp_release_supported", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The major 3GPP releases supported", HFILL } ++ }, ++ { &hf_nfapi_maximum_3gpp_release_supported_rel8, ++ { "Release 8", "nfapi.maximum_3gpp_release_supported.rel8", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_maximum_3gpp_release_supported_rel9, ++ { "Release 9", "nfapi.maximum_3gpp_release_supported.rel9", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_maximum_3gpp_release_supported_rel10, ++ { "Release 10", "nfapi.maximum_3gpp_release_supported.rel10", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_maximum_3gpp_release_supported_rel11, ++ { "Release 11", "nfapi.maximum_3gpp_release_supported.rel11", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_maximum_3gpp_release_supported_rel12, ++ { "Release 12", "nfapi.maximum_3gpp_release_supported.rel12", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_maximum_3gpp_release_supported_rel13, ++ { "Release 13", "nfapi.maximum_3gpp_release_supported.rel13", ++ FT_BOOLEAN, 1, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_downlink_channel_bandwidth_supported, ++ { "Maximum Channel Downlink Bandwidth Supported", "nfapi.downlink_channel_bandwidth_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The downlink channel bandwidth supported in resource blocks as specified in 3GPP TS 36.104", HFILL } ++ }, ++ { &hf_nfapi_uplink_channel_bandwidth_supported, ++ { "Maximum Channel Uplink Bandwidth Supported", "nfapi.uplink_channel_bandwidth_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The uplink channel bandwidth supported in resource blocks as specified in 3GPP TS 36.104.", HFILL } ++ }, ++ { &hf_nfapi_number_of_dl_layers_supported, ++ { "Number of DL Layers Supported", "nfapi.number_of_dl_layer_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The maximum number of downlink layers supported", HFILL } ++ }, ++ { &hf_nfapi_number_of_ul_layers_supported, ++ { "Number of UL Layers Supported", "nfapi.number_of_ul_layer_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The maximum number of uplink layers supported", HFILL } ++ }, ++ { &hf_nfapi_nmm_modes_supported, ++ { "NMM modes supported", "nfapi.nmm_modes_supported", ++ FT_UINT8, BASE_DEC, VALS(nmm_modes_supported_vals), 0x0, ++ "Network Monitor Modes Supported.", HFILL } ++ }, ++ { &hf_nfapi_band, ++ { "Band", "nfapi.band", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Band number as specified in 3GPP TS36.101", HFILL } ++ }, ++ { &hf_nfapi_maximum_transmit_power_2, ++ { "Maximum transmit power", "nfapi.maximum_transmit_power", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_2_conversion_fn), 0x0, ++ "The maximum transmit power for the PHY and RF operating at the configured bandwidth as defined in 3GPP TS 36.104.", HFILL } ++ }, ++ { &hf_nfapi_maximum_transmit_power, ++ { "Maximum transmit power", "nfapi.maximum_transmit_power", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_conversion_fn), 0x0, ++ "The maximum transmit power for the RF chain operating at the maximum supported bandwidth as defined in 3GPP TS 36.104.", HFILL } ++ }, ++ { &hf_nfapi_earfcn, ++ { "EARFCN", "nfapi.earfcn", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The EARFCN to be measured.", HFILL } ++ }, ++ { &hf_nfapi_number_of_rf_bands, ++ { "Number of RF Bands", "nfapi.num.rf_bands", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of RF Band instances", HFILL } ++ }, ++ { &hf_nfapi_nmm_uplink_rssi_supported, ++ { "NMM Uplink RSSI supported", "nfapi.nmm.uplink.rssi.supported", ++ FT_UINT8, BASE_DEC, VALS(ul_rssi_supported_vals), 0x0, ++ "Indicates if the uplink RSSI meausremnts are supported by NMM.", HFILL } ++ }, ++ { &hf_nfapi_minimum_transmit_power, ++ { "Minimum transmit power", "nfapi.minimum_transmit_power", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_conversion_fn), 0x0, ++ "The minimum transmit power for the RF chain operating at the maximum supported bandwidth as defined in 3GPP TS 36.104.", HFILL } ++ }, ++ { &hf_nfapi_number_of_antennas_suppported, ++ { "Number of Supported Antennas", "nfapi.number_of_antennas_suppported", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The maximum number of antennas supported.", HFILL } ++ }, ++ { &hf_nfapi_minimum_downlink_frequency, ++ { "Minimum downlink frequency", "nfapi.minimum_downlink_frequency", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, ++ "The minimum supported downlink frequency in 100kHz units", HFILL } ++ }, ++ { &hf_nfapi_maximum_downlink_frequency, ++ { "Maximum downlink frequency", "nfapi.maximum_downlink_frequency", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, ++ "The maximum supported downlink frequency in 100kHz units", HFILL } ++ }, ++ { &hf_nfapi_minimum_uplink_frequency, ++ { "Minimum uplink frequency", "nfapi.minimum_downlink_frequency", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, ++ "The minimum supported uplink frequency in 100kHz units", HFILL } ++ }, ++ { &hf_nfapi_maximum_uplink_frequency, ++ { "Maximum uplink frequency", "nfapi.maximum_downlink_frequency", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0, ++ "The maximum supported uplink frequency in 100kHz units", HFILL } ++ }, ++ { &hf_nfapi_transmission_mode7_supported, ++ { "Transmission Mode 7 Supported", "nfapi.pnf.phy_rel10.tx_mode7_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports TM7 for PDSCH", HFILL } ++ }, ++ { &hi_nfapi_transmission_mode8_supported, ++ { "Transmission Mode 8 Supported", "nfapi.pnf.phy_rel10.tx_mode8_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports TM8 for PDSCH", HFILL } ++ }, ++ { &hi_nfapi_two_antennas_ports_for_pucch, ++ { "Two antennas ports for PUCCH", "nfapi.pnf.phy_rel10.two_antennas_ports_for_pucch", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports PUCCH transmit diversity introduced in Release 10. Equivalent to two-AntennaPortsForPUCCH-r10 in TS36.306", HFILL } ++ }, ++ { &hi_nfapi_transmission_mode_9_supported, ++ { "Transmission Mode 9 Supported", "nfapi.pnf.phy_rel10.tx_mode9_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports TM9 for PDSCH with 8 antennas and 8 CSI. Equivalent to tm9-With-8Tx-FDD-r10 in TS36.306", HFILL } ++ }, ++ { &hi_nfapi_simultaneous_pucch_pusch, ++ { "Simultaneous PUCCH PUSCH", "nfapi.pnf.simultaneous_pucch_pusch", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports UE sending simultaneous PUCCH and PUSCH introduced in Release 10. Equivalent to simultaneousPUCCH-PUSCH-r10 in TS36.306", HFILL } ++ }, ++ { &hi_nfapi_four_layer_tx_with_tm3_and_tm4, ++ { "Four layer Tx with TM3 and TM4", "nfapi.pnf.phy_rel10.layer_tx_with_tm3_and_tm4", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports four layer transmission for TM3 and TM4. Equivalent to fourLayerTM3-TM4-r10 in TS36.306", HFILL } ++ }, ++ { &hf_nfapi_epdcch_supported, ++ { "ePDCCH supported", "nfapi.pnf.phy_rel11.epdcch_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports Enhanced PDCCH", HFILL } ++ }, ++ { &hi_nfapi_multi_ack_csi_reporting, ++ { "Multi ACK CSI reporting", "nfapi.pnf.phy_rel11.mutli_ack_csi_reporting", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports the multi ACK and CSI reporting required with CA and mixed FDD/TDD carriers. Equivalent to multiACK-CSI-Reporting-r11 in TS36.306", HFILL } ++ }, ++ { &hi_nfapi_pucch_tx_diversity_with_channel_selection, ++ { "PUCCH Tx diversity with channel selection", "nfapi.pnf.phy_rel11.tx_div_with_channel_selection", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports transmit diversity for PUCCH format 1b with channel selection. Equivalent to txDiv-PUCCH1b-ChSelect in TS36.306", HFILL } ++ }, ++ { &hi_nfapi_ul_comp_supported, ++ { "UL CoMP supported", "nfapi.pnf.phy_rel11.ul_comp_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports UL CoMP", HFILL } ++ }, ++ { &hi_nfapi_transmission_mode_5_supported, ++ { "Transmission mode 5 supported", "nfapi.pnf.phy_rel11.tx_mode5_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports TM5 for PDSCH", HFILL } ++ }, ++ { &hf_nfapi_csi_subframe_set, ++ { "CSI subframe set", "nfapi.pnf.phy_rel12.csi_subframe_set", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Equivalent to csi-SubframeSet-r12 in TS36.306", HFILL } ++ }, ++ { &hi_nfapi_enhanced_4tx_codebook, ++ { "Enhanced 4TX codebook", "nfapi.pnf.phy_rel12.exhanced_t4x_codebook", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports the enhanced 4TX codebook. Equivalent to enhanced-4TxCodebook-r12 in TS36.306", HFILL } ++ }, ++ { &hi_nfapi_drs_supported, ++ { "DRS supported", "nfapi.pnf.phy_rel12.drs_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports the Discovery Reference Signal", HFILL } ++ }, ++ { &hi_nfapi_ul_64qam_supported, ++ { "UL 64QAM supported", "nfapi.pnf.phy_rel12.ul_64qam_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY support 64 QAM in the uplink", HFILL } ++ }, ++ { &hi_nfapi_transmission_mode_10_supported, ++ { "Transmission mode 10 supported", "nfapi.pnf.phy_rel12.tx_mode10_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports TM10 for PDSCH (DL CoMP)", HFILL } ++ }, ++ { &hi_nfapi_alternative_tbs_indices, ++ { "Alternative TBS indices", "nfapi.pnf.phy_rel12.alternative_tbs_indices", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports the alternate TBS indices (256 QAM). Equivalent to alternativeTBS-Indices-r12 in TS36.306", HFILL } ++ }, ++ { &hf_nfapi_pucch_format_4_supported, ++ { "PUCCH format 4 supported", "nfapi.pnf.phy_rel13.pucch_format4_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports PUCCH format 4", HFILL } ++ }, ++ { &hf_nfapi_pucch_format_5_supported, ++ { "PUCCH format 5 supported", "nfapi.pnf.phy_rel13.pucch_format5_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports PUCCH format 5", HFILL } ++ }, ++ { &hf_nfapi_more_than_5_ca_supported, ++ { "More than 5 CA support", "nfapi.pnf.phy_rel13.mode_than_5_ca_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports features required for more than 5 CA support on PUSCH. Equivalent to uci-PUSCH-Ext-r13 in TS36.306", HFILL } ++ }, ++ { &hf_nfapi_laa_supported, ++ { "LAA supported", "nfapi.pnf.phy_rel13.laa_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports DL LAA (subframe format 3)", HFILL } ++ }, ++ { &hf_nfapi_laa_ending_in_dwpts_supported, ++ { "LAA ending in DwPTS supported", "nfapi.pnf.phy_rel13.laa_ending_in_dwpts_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports DL LAA ending in a DwPTS subframe. Equivalent to endingDwPTS-r13i n TS36.306", HFILL } ++ }, ++ { &hf_nfapi_laa_starting_in_second_slot_supported, ++ { "LAA starting in second slot Supported", "nfapi.pnf.phy_rel13.laa_starting_in_second_slot_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports DL LAA starting in the second slot in a subframe. Equivalent to secondSlotStartingPosition-r13 in TS36.306", HFILL } ++ }, ++ { &hf_nfapi_beamforming_supported, ++ { "Beamforming Supported", "nfapi.pnf.phy_rel13.beamingforming_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports beamforming (FD-MIMO Class B). Equivalent to beamformed-r13 in TS36.306", HFILL } ++ }, ++ { &hf_nfapi_csi_rs_enhancements_supported, ++ { "CSI-RS enhancements supported", "nfapi.pnf.phy_rel13.csi_rs_enchancements_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports CSI-RS enhancements (FD-MIMO Class A). Equivalent to csi-RS-EnhancementsTDD-r13 in TS36.306", HFILL } ++ }, ++ { &hf_nfapi_drms_enhancements_supported, ++ { "DMRS enhancements supported", "nfapi.pnf.phy_rel13.drms_enhancements_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports DMRS enhancements added in Release 13. Equivalent to dmrs-Enhancements-r13 in TS36.306", HFILL } ++ }, ++ { &hf_nfapi_srs_enhancements_supported, ++ { "SRS enhancements supported", "nfapi.pnf.phy_rel13.srs_enhancements_supported", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates if PHY supports SRS enhancements added in Release 13. Equivalent to srs-Enhancements-r13in TS36.306", HFILL } ++ }, ++ { &hf_nfapi_sfn_sf, ++ { "SFN_SF", "nfapi.sfn_sf", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(sfn_sf_conversion_fn), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_number_pdcch_ofdm_symbols, ++ { "Number of PDCCH OFDM Symbols", "nfapi.number_pdcch_ofdm_symbols", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of OFDM symbols for the PDCCH", HFILL } ++ }, ++ { &hf_nfapi_number_dci, ++ { "Number of DCI", "nfapi.number_dci", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of DCI PDUs included in this message", HFILL } ++ }, ++ { &hf_nfapi_number_pdus, ++ { "Number of PDUs", "nfapi.number_pdu", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of PDUs that are included in this message", HFILL } ++ }, ++ { &hf_nfapi_number_of_harqs, ++ { "Number of HARQs", "nfapi.number_harqs", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of HARQs included in this message", HFILL } ++ }, ++ { &hf_nfapi_number_of_crcs, ++ { "Number of CRCs", "nfapi.number_crcs", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of CRCs included in this message", HFILL } ++ }, ++ { &hf_nfapi_number_of_srs, ++ { "Number of SRs", "nfapi.number_srs", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of SRs included in this message", HFILL } ++ }, ++ { &hf_nfapi_number_of_cqi, ++ { "Number of CQIs", "nfapi.number_cqi", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of CQIs included in this message", HFILL } ++ }, ++ { &hf_nfapi_number_of_preambles, ++ { "Number of Preambles", "nfapi.number_preambles", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of RACH preambles", HFILL } ++ }, ++ { &hf_nfapi_number_of_srss, ++ { "Number of SRSs", "nfapi.number_srss", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Number of UEs contributing to the uplink SRS", HFILL } ++ }, ++ { &hf_nfapi_lbt_dl_req_pdu_type, ++ { "LBT DL Request PDU Type", "nfapi.number_srss", ++ FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_req_pdu_type), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_lbt_dl_ind_pdu_type, ++ { "LBT DL Indication PDU Type", "nfapi.number_srss", ++ FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_ind_pdu_type), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_number_pdsch_rnti, ++ { "Number of PDSCH RNTI", "nfapi.number_pdsch_rnti", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Number of unique RNTIs sent on the PDSCH", HFILL } ++ }, ++ { &hf_nfapi_transmission_power_pcfich, ++ { "Transmission Power PCFICH", "nfapi.transmission_power_pcfich", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, ++ "Offset to the reference signal power.", HFILL } ++ }, ++ { &hf_nfapi_dl_config_pdu_type, ++ { "PDU Type", "nfapi.pdu.type", ++ FT_UINT8, BASE_DEC, VALS(nfapi_dl_config_pdu_type_vals), 0x0, ++ "DL_CONFIG.request PDU Type", HFILL } ++ }, ++ { &hf_nfapi_pdu_size, ++ { "PDU size", "nfapi.pdu.size", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Size of the PDU control information (in bytes). This length value includes the 2 bytes required for the PDU type and PDU size parameters", HFILL } ++ }, ++ { &hf_nfapi_instance_length, ++ { "Instance length", "nfapi.instance.length", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The Length in bytes of all TLVs within this instance", HFILL } ++ }, ++ { &hf_nfapi_length, ++ { "PDU length", "nfapi.pdu.length", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Length of PDU in bytes.", HFILL } ++ }, ++ { &hf_nfapi_pdu_index, ++ { "PDU Index", "nfapi.pdu.index", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The PDU index parameter specified for each PDU", HFILL } ++ }, ++ { &hf_nfapi_rnti, ++ { "RNTI", "nfapi.rnti", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The RNTI used for identifying the UE when receiving the PDU", HFILL } ++ }, ++ { &hf_nfapi_resource_allocation_type, ++ { "Resource Allocation Type", "nfapi.resource.allocation.type", ++ FT_UINT8, BASE_DEC, VALS(resource_allocation_type_vals), 0x0, ++ "Resource allocation type/header Valid for DCI formats : 1, 2, 2A, 2B, 2C, 2D", HFILL } ++ }, ++ { &hf_nfapi_virtual_resource_block_assignment_flag, ++ { "Virtual resource block assignment flag", "nfapi.resource.block.assignment.flag", ++ FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, ++ "Type of virtual resource block used Valid for DCI formats : 1A, 1B, 1D", HFILL } ++ }, ++ { &hf_nfapi_resource_block_coding, ++ { "Resource block coding", "nfapi.resource.block.coding", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "The encoding for the resource blocks. The coding is dependent on whether resource allocation type 0, 1, 2 is in use", HFILL } ++ }, ++ { &hf_nfapi_modulation, ++ { "Modulation", "nfapi.modulation", ++ FT_UINT8, BASE_DEC, VALS(modulation_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_redundancy_version, ++ { "Redundancy version", "nfapi.redundancy.version", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "HARQ redundancy version", HFILL } ++ }, ++ { &hf_nfapi_transport_blocks, ++ { "Transport blocks", "nfapi.transport.blocks", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The transport block transmitted to this RNTI", HFILL } ++ }, ++ { &hf_nfapi_transport_block_to_codeword_swap_flag, ++ { "Transport block to codeword swap flag", "nfapi.transport.block.to.codeword.swap.flag", ++ FT_UINT8, BASE_DEC, VALS(transport_block_to_codeword_swap_flag_vals), 0x0, ++ "Indicates the mapping of transport block to codewords.", HFILL } ++ }, ++ { &hf_nfapi_transmission_scheme, ++ { "Transmission scheme", "nfapi.transmission.scheme", ++ FT_UINT8, BASE_DEC, VALS(transmission_scheme_vals), 0x0, ++ "The MIMO mode used in the PDU", HFILL } ++ }, ++ { &hf_nfapi_ul_transmission_scheme, ++ { "Transmission scheme", "nfapi.transmission.scheme", ++ FT_UINT8, BASE_DEC, VALS(ul_transmission_scheme_vals), 0x0, ++ "The MIMO mode used in the PDU", HFILL } ++ }, ++ { &hf_nfapi_number_of_layers, ++ { "Number of layers", "nfapi.number.of.layers", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of layers used in transmission", HFILL } ++ }, ++ { &hf_nfapi_number_of_subbands, ++ { "Number of subbands", "nfapi.number.of.subbands", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Only valid when transmission scheme = 3, 4, 5. Defines the number of subbands and " ++ "codebooks used for PMI.If value = 1 then a single PMI value is supplied which should be used over all RB", HFILL } ++ }, ++ { &hf_nfapi_codebook_index, ++ { "Codebook index", "nfapi.number.of.codebook.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Only valid when transmission scheme = 3, 4, 5. Defines the codebook used.", HFILL } ++ }, ++ { &hf_nfapi_ue_category_capacity, ++ { "UE category capacity", "nfapi.ue.category.capacity", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The UE capabilities category", HFILL } ++ }, ++ { &hf_nfapi_pa, ++ { "P-A", "nfapi.pa", ++ FT_UINT8, BASE_DEC, VALS(pa_vals), 0x0, ++ "The ratio of PDSCH EPRE to cell-specific RS EPRE among PDSCH REs in all the OFDM symbols not containing cell-specific RS in dB.", HFILL } ++ }, ++ { &hf_nfapi_delta_power_offset_index, ++ { "Delta Power offset index", "nfapi.delta.power.offset.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Delta power offset, value: 0..1", HFILL } ++ }, ++ { &hf_nfapi_nprb, ++ { "Nprb", "nfapi.nprb", ++ FT_UINT8, BASE_DEC, VALS(nprb_vals), 0x0, ++ "Used with DCI format 1A and RNTI=SI-RNTI or RA-RNTI. This should match the value sent in the TPC field of the DCI 1A PDU which allocated this grant.", HFILL } ++ }, ++ { &hf_nfapi_transmission_mode, ++ { "Transmission Mode", "nfapi.transmission_nprb", ++ FT_UINT8, BASE_DEC, VALS(transmission_mode_vals), 0x0, ++ "Transmission mode associated with the UE", HFILL } ++ }, ++ { &hf_nfapi_prnti, ++ { "P-RNTI", "nfapi.prnti", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The P-RNTI associated with the paging", HFILL } ++ }, ++ { &hf_nfapi_mcs, ++ { "MCS", "nfapi.mcs", ++ FT_UINT8, BASE_DEC, VALS(pch_modulation_vals), 0x0, ++ "The modulation and coding scheme for the transport block", HFILL } ++ }, ++ { &hf_nfapi_number_of_transport_blocks, ++ { "Number of transport blocks", "nfapi.number_of_transport_blocks", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of transport blocks transmitted to this RNTI", HFILL } ++ }, ++ { &hf_nfapi_ue_mode, ++ { "UE Mode", "nfapi.ue.mode", ++ FT_UINT8, BASE_DEC, VALS(ue_mode_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_prs_bandwidth, ++ { "PRS bandwidth", "nfapi.prs.bandwidth", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "PRS bandwidth in resource blocks.", HFILL } ++ }, ++ { &hf_prs_cyclic_prefix_type, ++ { "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type", ++ FT_BOOLEAN, 8, TFS(&prs_cyclic_prefix_type_strname), 0x0, ++ "The cyclic prefix used for PRS transmission", HFILL } ++ }, ++ { &hf_prs_muting, ++ { "PRS muting", "nfapi.prs.muting", ++ FT_BOOLEAN, 8, TFS(&prs_muting_strname), 0x0, ++ "PRS muting dictates if PRS REs are vacant (prsMutingInfo-r9 indicates the SF occasions)", HFILL } ++ }, ++ { &hf_nfapi_num_bf_prb_per_subband, ++ { "Num of BF PRB per Subband", "nfapi.num.bf.prb.per.subband", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Number of PRBs that are treated as one subband", HFILL } ++ }, ++ { &hf_nfapi_num_bf_vector, ++ { "Num of BF Vector", "nfapi.num.bf.vector", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Number of beam forming vectors. One beam forming vector is specified for each subband", HFILL } ++ }, ++ { &hf_nfapi_csi_rs_resource_config, ++ { "CSI-RS resource config", "nfapi.csi.rs.resource.config", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates reference signal configuration for CSI-RS", HFILL } ++ }, ++ { &hf_nfapi_bf_vector_subband_index, ++ { "BF Subband Index", "nfapi.num.bf.vector.subband.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Index of subband for which the following beam forming vector is applied", HFILL } ++ }, ++ { &hf_nfapi_bf_vector_num_antennas, ++ { "BF Num of Antennas", "nfapi.num.bf.vector.bf.value", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Number of physical antennas", HFILL } ++ }, ++ { &hf_nfapi_bf_vector_bf_value, ++ { "BF Value per Antenna", "nfapi.num.bf.vector.bf.value", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Beam forming vector element for physical antenna #i real 8 bits followed by imaginary 8 bits", HFILL } ++ }, ++ { &hf_nfapi_nscid, ++ { "NSC id", "nfapi.nscid", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Used with DCI format 2B and 2C.", HFILL } ++ }, ++ { &hf_nfapi_csi_rs_flag, ++ { "CSI RS Flag", "nfapi.csi.rs.flag", ++ FT_BOOLEAN, 8, TFS(&csi_rs_flags_strname), 0x0, ++ "Indicates if parameters related to CSI-RS are valid or not.", HFILL } ++ }, ++ { &hf_nfapi_csi_rs_resource_config_r10, ++ { "CSI RS resource config R10", "nfapi.csi.rs.resource_config_r10", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "This value is deprecated", HFILL } ++ }, ++ { &hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, ++ { "CSI-RS Number of NZP configuration", "nfapi.csi.rs.num.of.nzp.configurations", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Bitmap of 16 bits. Encoding format of bitmap follows section 6.10.5.2 of 36.211", HFILL } ++ }, ++ { &hf_nfapi_csi_rs_number_of_nzp_configurations, ++ { "CSI RS zero Tx Power Resource config bitmap R10", "nfapi.csi.rs.zero.tx.power.resource.config.bitmap.r10", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates the number of Non-Zero power CSI-RS configurations.", HFILL } ++ }, ++ { &hf_nfapi_pdsch_start, ++ { "PDSCH_start", "nfapi.pdsch.start", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Per UE starting OFDM symbol for the PDSCH, impacts the mapping of PDSCH to REs", HFILL } ++ }, ++ { &hf_nfapi_drms_config_flag, ++ { "DMRS Config flag", "nfapi.drms.config.flag", ++ FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, ++ "Indicates if the DMRS Config parameter is valid", HFILL } ++ }, ++ { &hf_nfapi_drms_scrambling, ++ { "DMRS Scrambling", "nfapi.drms.scrambling", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The scrambling identity for UE specific reference signals.", HFILL } ++ }, ++ { &hf_nfapi_csi_config_flag, ++ { "CSI Config flag", "nfapi.csi.config.flag", ++ FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, ++ "Indicates if the CSI Config parameter is valid", HFILL } ++ }, ++ { &hf_nfapi_csi_scrambling, ++ { "CSI Scrambling", "nfapi.csi.scrambling", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The scrambling identity for CSI.", HFILL } ++ }, ++ { &hf_nfapi_pdsch_re_mapping_flag, ++ { "PDSCH RE mapping flag", "nfapi.pdsch.remapping.flag", ++ FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, ++ "Indicates if the PDSCH RE parameters are valid.", HFILL } ++ }, ++ { &hf_nfapi_pdsch_re_mapping_antenna_ports, ++ { "PDSCH RE mapping antenna ports", "nfapi.pdsch.remapping.antenna.ports", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates number of antennas used for PDSCH RE mapping", HFILL } ++ }, ++ { &hf_nfapi_pdsch_re_mapping_freq_shift, ++ { "PDSCH RE mapping freq shift", "nfapi.pdsch.remapping.freq.shift", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates the frequency shift used for PDSCH RE mapping.", HFILL } ++ }, ++ { &hf_nfapi_alt_cqi_table_r12, ++ { "altCQI-Table-r12", "nfapi.alt.cqi.table.r12", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "altCQI-Table-r12 is indicative of using an alternative MCS table for UEs supporting 256QAM." ++ "This is taken into account for calculation of soft buffer size for the transport block", HFILL } ++ }, ++ { &hf_nfapi_max_layers, ++ { "MaxLayers", "nfapi.max.layers", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Maximal number of negotiated / configured layers for a UE, used for the calculation of soft buffer size for the transport block", HFILL } ++ }, ++ { &hf_nfapi_n_dl_harq, ++ { "N_DL_HARQ", "nfapi.n.dl.harq", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dwpts_symbols, ++ { "DwPTS Symbols", "nfapi.dwpts.symbols", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Valid if DCI format 1C is being used to signal LAA end partial SF. Indicates the number of starting symbols according to 36.213 Table 13-A-1", HFILL } ++ }, ++ { &hf_nfapi_initial_lbt_sf, ++ { "Initial LBT SF", "nfapi.initial.lbt.sf", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates if the DCI PDU is prepared for full SF (regular) or for initial partial SF (2nd slot) according to [11] section 6.2.4 (if PDCCH) or 6.2.4A (if ePDCCH)", HFILL } ++ }, ++ { &hf_nfapi_ue_type, ++ { "UE Type", "nfapi.ue.type", ++ FT_UINT8, BASE_DEC, VALS(dlsch_re13_ue_type_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_pdsch_payload_type, ++ { "PDSCH Payload Type", "nfapi.pdsch.payload.type", ++ FT_UINT8, BASE_DEC, VALS(dlsch_re13_pdsch_payload_type_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_initial_transmission_sf, ++ { "Initial transmission SF (io)", "nfapi.init.tx.sf.io", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Absolute Sub-Frame of the initial transmission", HFILL } ++ }, ++ { &hf_nfapi_req13_drms_table_flag, ++ { "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates if Release 13 DMRS table is used.", HFILL } ++ }, ++ { &hf_nfapi_csi_rs_resource_index, ++ { "CSI-RS resource index", "nfapi.csi.rs.resource.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Index of the CSI-RS resource. This is included to link bfValues to CSI-RS resources included in Release 10 parameters.", HFILL } ++ }, ++ { &hf_nfapi_csi_rs_class, ++ { "Class", "nfapi.csi.rs.class", ++ FT_UINT8, BASE_DEC, VALS(csi_rs_class_vals), 0x0, ++ "Indicates CSI-RS class", HFILL } ++ }, ++ { &hf_nfapi_cdm_type, ++ { "CDM Type", "nfapi.cdm.type", ++ FT_UINT8, BASE_DEC, VALS(csi_rs_cdm_type_vals), 0x0, ++ "Indicates CDM type for CSI-RS. See [36.211] section 6.10.5.2. Valid for Class A", HFILL } ++ }, ++ { &hf_nfapi_edpcch_prb_index, ++ { "EPDCCH PRB index", "nfapi.edpcch.prb.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "PRB index", HFILL } ++ }, ++ { &hf_nfapi_epdcch_resource_assignment_flag, ++ { "EPDCCH Resource assignment flag", "nfapi.epdcch.resource.assignment.flag", ++ FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, ++ "Type of virtual resource block used", HFILL } ++ }, ++ { &hf_nfapi_epdcch_id, ++ { "EPDCCH ID", "nfapi.epdcch.id", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "EPDCCH index- used for the scrambler initiation The DMRS scrambling sequence initialization parameter defined in[11] section 6.10.3A.1", HFILL } ++ }, ++ { &hf_nfapi_epdcch_start_symbol, ++ { "EPDCCH Start Symbol", "nfapi.epdcch.start.symbol", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates the OFDM starting symbol for any EPDCCH and PDSCH", HFILL } ++ }, ++ { &hf_nfapi_epdcch_num_prb, ++ { "EPDCCH NumPRB", "nfapi.epdcch.num.prb", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Number of PRBs allocated for EPDCCH", HFILL } ++ }, ++ { &hf_nfapi_precoding_value, ++ { "Precoding value", "nfapi.precoding.value", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Precoding element for physical antenna #i real 8 bits followed by imaginary 8 bits", HFILL } ++ }, ++ { &hf_nfapi_mpdcch_narrowband, ++ { "MPDCCH Narrowband", "nfapi.mpdcch.narrowband", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Narrowband for MPDCCH", HFILL } ++ }, ++ { &hf_nfapi_number_of_prb_pairs, ++ { "Number of PRB pairs", "nfapi.number.prb.pairs", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Number of PRB-pairs constituting the MPDCCH-PRB-pair set", HFILL } ++ }, ++ { &hf_nfapi_resource_block_assignment, ++ { "Resource Block Assignment", "nfapi.resource.block.assignement", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Combinational index r", HFILL } ++ }, ++ { &hf_nfapi_start_symbol, ++ { "Start symbol", "nfapi.start.symbol", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ecce_index, ++ { "ECCE index", "nfapi.ecce.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "CCE index used to send the DCI", HFILL } ++ }, ++ { &hf_nfapi_ce_mode, ++ { "CE Mode", "nfapi.ce.mode", ++ FT_UINT8, BASE_DEC, VALS(ce_mode_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_drms_scrabmling_init, ++ { "DMRS scrambling init", "nfapi.drms.scrambling.init", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The DMRS scrambling sequence initialization parameter defined in [11] section 6.10.3A.1", HFILL } ++ }, ++ { &hf_nfapi_pdsch_reception_levels, ++ { "PDSCH repetition levels", "nfapi.pdsch.repetition.levels", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Valid for DCI formats: 6-0A, 6-0B", HFILL } ++ }, ++ { &hf_nfapi_new_data_indicator, ++ { "New data indicator", "nfapi.new.data.indicator", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The new data indicator for the transport block", HFILL } ++ }, ++ { &hf_nfapi_tpmi_length, ++ { "TPMI length", "nfapi.tpmi.length", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Length of 'TPMI' field in units of bits", HFILL } ++ }, ++ { &hf_nfapi_pmi_flag, ++ { "PMI flag", "nfapi.pmi.flag", ++ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, ++ "Indicates if 'PMI' field is present", HFILL } ++ }, ++ { &hf_nfapi_harq_resource_offset, ++ { "HARQ resource offset", "nfapi.harq.resource.offset", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "HARQ-ACK resource offset used", HFILL } ++ }, ++ { &hf_nfapi_dci_subframe_repetition_number, ++ { "DCI subframe repetition number", "nfapi.dci.subframe.repetition.number", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates the number of MPDCCH repetitions", HFILL } ++ }, ++ { &hf_nfapi_downlink_assignment_index_length, ++ { "Downlink assignment index Length", "nfapi.dl.assignement.index.length", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Length of Downlink assignment index field in units of bits.", HFILL } ++ }, ++ { &hf_nfapi_starting_ce_level, ++ { "Starting CE Level", "nfapi.starting.ce.level", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "2 bits provide the PRACH starting CE level", HFILL } ++ }, ++ { &hf_nfapi_antenna_ports_and_scrambling_identity_flag, ++ { "Antenna ports and scrambling identity flag", "nfapi.antenna.ports.and.scrambling.identity.flag", ++ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, ++ "Indicates if 'Antenna ports and scrambling identity' field is present.", HFILL } ++ }, ++ { &hf_nfapi_antenna_ports_and_scrambling_identity, ++ { "Antenna ports and scrambling identity", "nfapi.antenna.ports.and.scrambling.identit", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates the Antenna port and, scrambling identity value", HFILL } ++ }, ++ { &hf_nfapi_paging_direct_indication_differentiation_flag, ++ { "Paging/Direct indication differentiation flag", "nfapi.paging.direct.indictation.differentiation.flag", ++ FT_UINT8, BASE_DEC, VALS(paging_direct_indication_differtiation_flag_vals), 0x0, ++ "Valid for DCI format 6-2", HFILL } ++ }, ++ { &hf_nfapi_direct_indication, ++ { "Direct indication", "nfapi.direct.indication", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Valid for DCI format 6-2", HFILL } ++ }, ++ { &hf_nfapi_number_of_tx_antenna_ports, ++ { "Number of TX Antenna ports", "nfapi.num.of.tx.antenna.ports.", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Number of TX physical antenna ports", HFILL } ++ }, ++ { &hf_nfapi_transmission_power, ++ { "Transmission Power", "nfapi.transmission_power", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, ++ "Offset to the reference signal power.", HFILL } ++ }, ++ { &hf_nfapi_mbsfn_area_id, ++ { "MBSFN Area id", "nfapi.mbsfn.area.id", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates MBSFN area ID", HFILL } ++ }, ++ { &hf_nfapi_dl_dci_format, ++ { "DL DCI format", "nfapi.dl.dci.format", ++ FT_UINT8, BASE_DEC, VALS(dl_dci_format_vals), 0x0, ++ "Format of the DL DCI", HFILL } ++ }, ++ { &hf_nfapi_ul_dci_format, ++ { "UL DCI format", "nfapi.ul_dci.format", ++ FT_UINT8, BASE_DEC, VALS(ul_dci_format_vals), 0x0, ++ "Format of the UL DCI", HFILL } ++ }, ++ { &hf_nfapi_mpdcch_ul_dci_format, ++ { "UL DCI format", "nfapi.mpdcch.ul_dci.format", ++ FT_UINT8, BASE_DEC, VALS(mpdcch_ul_dci_format_vals), 0x0, ++ "Format of the UL DCI", HFILL } ++ }, ++ { &hf_nfapi_cce_idx, ++ { "CCE index", "nfapi.cce.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "CCE index used to send the DCI", HFILL } ++ }, ++ { &hf_nfapi_aggregation_level, ++ { "Aggregation level", "nfapi.aggregation.level", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The aggregation level used", HFILL } ++ }, ++ { &hf_nfapi_mcs_1, ++ { "MCS_1", "nfapi.mcs_1", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The modulation and coding scheme for 1st transport block", HFILL } ++ }, ++ { &hf_nfapi_mcs_2, ++ { "MCS_2", "nfapi.mcs_2", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The modulation and coding scheme for 2nd transport block", HFILL } ++ }, ++ { &hf_nfapi_redundancy_version_1, ++ { "Redundancy version_1", "nfapi.redundancy.version.1", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The redundancy version for 1st transport block.", HFILL } ++ }, ++ { &hf_nfapi_redundancy_version_2, ++ { "Redundancy version_2", "nfapi.redundancy.version.2", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The redundancy version for 2nd transport block", HFILL } ++ }, ++ { &hf_nfapi_new_data_indicator_1, ++ { "New data indicator_1", "nfapi.new.data.indicator.1", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The new data indicator for 1st transport block.", HFILL } ++ }, ++ { &hf_nfapi_new_data_indicator_2, ++ { "New data indicator_2", "nfapi.new.data.indicator.2", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The new data indicator for 2nd transport block.", HFILL } ++ }, ++ { &hf_nfapi_harq_process, ++ { "HARQ process", "nfapi.harq.process", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "HARQ process number", HFILL } ++ }, ++ { &hf_nfapi_tpmi, ++ { "TPMI", "nfapi.tpmi", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The codebook index to be used for precoding", HFILL } ++ }, ++ { &hf_nfapi_pmi, ++ { "PMI", "nfapi.pmi", ++ FT_UINT8, BASE_DEC, VALS(pmi_vals), 0x0, ++ "Confirmation for precoding", HFILL } ++ }, ++ { &hf_nfapi_precoding_information, ++ { "Precoding information", "nfapi.precoding.information", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_tpc, ++ { "TPC", "nfapi.tpc", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Tx power control command for PUCCH", HFILL } ++ }, ++ { &hf_nfapi_downlink_assignment_index, ++ { "Downlink assignment index", "nfapi.downlink.assignment.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The downlink assignment index. In release 8-11 this is only used in TDD mode, " ++ "value ignored for FDD. In release 12 or later a field indicating the structure " ++ "type of the primary cell is used to determine if this is valid with size 2 bits." ++ "In release 13 or later a field indicating codebooksizeDetermination - r13 = 0 is " ++ "used to determine is this field is valid with size 4 bits", HFILL } ++ }, ++ { &hf_nfapi_ngap, ++ { "Ngap", "nfapi.ngap", ++ FT_UINT8, BASE_DEC, VALS(ngap_vals), 0x0, ++ "Used in virtual resource block distribution", HFILL } ++ }, ++ { &hf_nfapi_transport_block_size_index, ++ { "Transport block size index", "nfapi.transport.block.size.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The transport block size", HFILL } ++ }, ++ { &hf_nfapi_downlink_power_offset, ++ { "Downlink power offset", "nfapi.downlink.power.offset", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates the DL power offset type for multi-user MIMO transmission", HFILL } ++ }, ++ { &hf_nfapi_allocate_prach_flag, ++ { "Allocation PRACH flag", "nfapi.allocation.prach.flag", ++ FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, ++ "Indicates that PRACH procedure is initiated", HFILL } ++ }, ++ { &hf_nfapi_preamble_index, ++ { "Preamble index", "nfapi.preamable.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The preamble index to be used on the PRACH", HFILL } ++ }, ++ { &hf_nfapi_prach_mask_index, ++ { "PRACH mask index", "nfapi.prach.mask.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The mask index to be used on the PRACH", HFILL } ++ }, ++ { &hf_nfapi_rnti_type, ++ { "RNTI type", "nfapi.rnti.type", ++ FT_UINT8, BASE_DEC, VALS(rnti_type_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_mpdcch_rnti_type, ++ { "RNTI type", "nfapi.mpdcch.rnti.type", ++ FT_UINT8, BASE_DEC, VALS(mpdcch_rnti_type_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_mcch_flag, ++ { "MCCH flag", "nfapi.mcch.flag", ++ FT_BOOLEAN, BASE_NONE, TFS(&mcch_flag_string_name), 0x0, ++ "Indicates if format 1C is being used to signal a MCCH or SC-MCCH change notification", HFILL } ++ }, ++ { &hf_nfapi_mcch_change_notification, ++ { "MCCH change notification", "nfapi.mcch.change.notification", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "MCCH or SC-MCCH Change Notification", HFILL } ++ }, ++ { &hf_nfapi_scrambling_identity, ++ { "Scrambling identity", "nfapi.scrambling.identity", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates the scrambling identity value NSCID", HFILL } ++ }, ++ { &hf_nfapi_cross_carrier_scheduling_flag, ++ { "Cross Carrier scheduling flag", "nfapi.cross.carrier.scheduling.flag", ++ FT_BOOLEAN, 8, TFS(&cross_carrier_scheduling_flag_strname), 0x0, ++ "Indicates if cross carrier scheduling has been enabled for the UE receiving this DCI", HFILL } ++ }, ++ { &hf_nfapi_carrier_indicator, ++ { "Carrier Indicator", "nfapi.carrier.indicator", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Serving Cell Index", HFILL } ++ }, ++ { &hf_nfapi_srs_flag, ++ { "SRS flag", "nfapi.srs.flag", ++ FT_BOOLEAN, 8, TFS(&srs_flag_strname), 0x0, ++ "Indicates if the SRS request parameter is valid", HFILL } ++ }, ++ { &hf_nfapi_srs_request, ++ { "SRS request", "nfapi.srs.request", ++ FT_BOOLEAN, 8, TFS(&srs_request_strname), 0x0, ++ "SRS request flag", HFILL } ++ }, ++ { &hf_nfapi_antenna_ports_scrambling_and_layers, ++ { "Antenna ports scrambling and layers", "nfapi.antenna.ports.scrambling.and.layers", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates the Antenna port, scrambling identity value NSCID and number of layers", HFILL } ++ }, ++ { &hf_nfapi_total_dci_length_including_padding, ++ { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The total DCI length including padding bits", HFILL } ++ }, ++ { &hf_nfapi_n_ul_rb, ++ { "N_UL_RB", "nfapi.n.dl.rb", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "BW of serving cell for which the DCI was scheduled for. This is valid for " ++ "the case of cross carrier scheduling, for the case of a self - " ++ "scheduling(cross carrier scheduling is not valid or Carrier indicator has value '0', " ++ "the BW is the 'DL BW support' as configured in configuration phase(params) " ++ "Uplink channel bandwidth in resource blocks", HFILL } ++ }, ++ { &hf_nfapi_harq_ack_resource_offset, ++ { "HARQ-ACK resource offset", "nfapi.harq.ack.resource.offset", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "HARQ-ACK resource offset field is present only when this format is carried by EPDCCH.", HFILL } ++ }, ++ { &hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, ++ { "PDSCH RE Mapping and Quasi-Co-Location Indicator", "nfapi.pdsch.re.mapping", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates the parameter set configured by the higher layers which the UE should use.", HFILL } ++ }, ++ { &hf_nfapi_primary_cell_type, ++ { "Primary cell type", "nfapi.primary.cell.type", ++ FT_UINT8, BASE_DEC, VALS(primary_cells_type_vals), 0x0, ++ "Indicates the type of the primary cell.", HFILL } ++ }, ++ { &hf_nfapi_ul_dl_configuration_flag, ++ { "UL/DL configuration flag", "nfapi.ul.dl.configuration.flag", ++ FT_BOOLEAN, 8, TFS(&ul_dl_configuration_flag_strname), 0x0, ++ "Indicates if format 1C is being used to signal UL/DL configuration", HFILL } ++ }, ++ { &hf_nfapi_number_of_ul_dl_configurations, ++ { "Number of UL/DL configurations", "nfapi.number.ul.dl.configurations", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ul_dl_configuration_index, ++ { "UL/DL configuration indication", "nfapi.ul.dl.configuration.indication", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "UL/DL configuration index", HFILL } ++ }, ++ { &hf_nfapi_laa_end_partial_sf_flag, ++ { "LAA end partial SF flag", "nfapi.laa.end.partial.sf.flag", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates if DCI format 1C is being used to signal LAA end partial SF (valid if end partial SF support configuraton is set)", HFILL } ++ }, ++ { &hf_nfapi_laa_end_partial_sf_configuration, ++ { "LAA end partial SF configuration", "nfapi.laa.end.partial.sf.configuration", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "If DCI format 1C scrambled by CC - RNTI is used to signal end partial SF, this field " ++ "contains LAA common information (4 bits used in [9] Table 13A-1 for configuration of " ++ "occupied OFDM symbols for current and next SF)", HFILL } ++ }, ++ { &hf_nfapi_codebooksize_determination_r13, ++ { "Codebook Size Determination R13", "nfapi.codebook.size.determination.r13", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates if the downlink assignment index parameter (DAI) is 4 bits", HFILL } ++ }, ++ { &hf_nfapi_rel13_drms_table_flag, ++ { "Rel-13-DMRS-tabe flag", "nfapi.drms.table.flag.r13", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates if Release 13 DMRS table for be used", HFILL } ++ }, ++ { &hf_nfapi_pscch_resource, ++ { "PSCCH Resource", "nfapi.pscch.resource", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "6-bits describing the resource blocks for transmitting PSCCH", HFILL } ++ }, ++ { &hf_nfapi_time_resource_pattern, ++ { "Time resource pattern", "nfapi.time.resource.pattern", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "7-bits describing the time resource pattern index", HFILL } ++ }, ++ { &hf_nfapi_mpdcch_transmission_type, ++ { "MPDCCH transmission type", "nfapi.mpdcch.transmission.type", ++ FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_drms_scrambling_init, ++ { "DMRS scrambling init", "nfapi.drms.scrambling.init", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The DMRS scrambling sequence initialization", HFILL } ++ }, ++ { &hf_nfapi_pusch_repetition_levels, ++ { "PUSCH repetition levels", "nfapi.pusch.repetition.levels", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Valid for DCI formats: 6-0A, 6-0B", HFILL } ++ }, ++ { &hf_nfapi_frequency_hopping_flag, ++ { "Frequency hopping flag", "nfapi.frequency.hopping.flag", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates if hopping is being used.", HFILL } ++ }, ++ { &hf_nfapi_csi_request, ++ { "CSI request", "nfapi.csi.request", ++ FT_UINT8, BASE_DEC, VALS(csi_request_vals), 0x0, ++ "Aperiodic CSI request flag", HFILL } ++ }, ++ { &hf_nfapi_dai_presence_flag, ++ { "DAI presence flag", "nfapi.dia.presence.flag", ++ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, ++ "Indicates if DL assignment index field is present in the DCI", HFILL } ++ }, ++ { &hf_nfapi_total_dci_length_include_padding, ++ { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The total DCI length including padding bits", HFILL } ++ }, ++ { &hf_nfapi_csi_rs_antenna_port_count_r10, ++ { "CSI-RS antenna port count r10", "nfapi.csi.rs.antenna.port.count.r10", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates number of antennas used for transmission of CSI reference signal.", HFILL } ++ }, ++ { &hf_nfapi_ul_config_pdu_type, ++ { "UL Config PDU Type", "nfapi.ul.config.pdu.type", ++ FT_UINT8, BASE_DEC, VALS(nfapi_ul_config_pdu_type_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_rach_prach_frequency_resources, ++ { "RACH PRACH Frequency resources", "nfapi.rach.prach.frequency.resources", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "If semi-static information is held in the MAC", HFILL } ++ }, ++ { &hf_nfapi_srs_present, ++ { "SRS present", "nfapi.srs.present", ++ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0, ++ "If semi-static information is held in the MAC", HFILL } ++ }, ++ { &hf_nfapi_handle, ++ { "Handle", "nfapi.handle", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "An opaque handle", HFILL } ++ }, ++ { &hf_nfapi_pucch_index, ++ { "PUCCH Index", "nfapi.pucch.index", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The PUCCH index value", HFILL } ++ }, ++ { &hf_nfapi_size, ++ { "Size", "nfapi.size", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The size of the ULSCH PDU in bytes as defined by the relevant UL grant", HFILL } ++ }, ++ { &hf_nfapi_resource_block_start, ++ { "Resource block start", "nfapi.resource.block.start", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The starting resource block for this ULSCH allocation", HFILL } ++ }, ++ { &hf_nfapi_number_of_resource_blocks, ++ { "Number of resource blocks", "nfapi.resource.blocks", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of resource blocks allocated to this ULSCH grant", HFILL } ++ }, ++ { &hf_nfapi_cyclic_shift_2_for_drms, ++ { "Cyclic Shift 2 for DRMS", "nfapi.cyclic.shift.2.for.drms", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The 2nd cyclic shift for DMRS assigned to the UE in the ULSCH grant", HFILL } ++ }, ++ { &hf_nfapi_frequency_hopping_enabled_flag, ++ { "Frequency hopping enabled flag", "nfapi.frequency.hopping.enabled.flag", ++ FT_UINT8, BASE_DEC, VALS(hopping_vals), 0x0, ++ "Indicates if hopping is being used", HFILL } ++ }, ++ { &hf_nfapi_frequency_hopping_bits, ++ { "Frequency hopping bits", "nfapi.frequency.hopping.bits", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_new_data_indication, ++ { "New Data inidication", "nfapi.new.data.indication", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Specify whether this received transport block is a new transmission from UE", HFILL } ++ }, ++ { &hf_nfapi_harq_process_number, ++ { "HARQ Process number", "nfapi.harq.process.number", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_ul_tx_mode, ++ { "UL Tx Mode", "nfapi.ul.tx.mode", ++ FT_UINT8, BASE_DEC, VALS(ul_tx_mode_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_current_tx_nb, ++ { "Current Tx nb", "nfapi.current.tx.nb", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The current HARQ transmission count of this transport block. Valid if frequency hopping enabled.", HFILL } ++ }, ++ { &hf_nfapi_n_srs, ++ { "N SRS", "nfapi.n.srs", ++ FT_UINT8, BASE_DEC, VALS(n_srs_vals), 0x0, ++ "Indicates if the resource blocks allocated for this grant overlap with the SRS configuration.", HFILL } ++ }, ++ { &hf_nfapi_disable_sequence_hopping_flag, ++ { "Disable seqeunce hopping flag", "nfapi.disable.sequence.hopping.flag", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates if any configured group hopping should be disabled for this UE.", HFILL } ++ }, ++ { &hf_nfapi_virtual_cell_id_enabled_flag, ++ { "Virtual cell ID enabled flag", "nfapi.virtual.cell.id.enabled.flag", ++ FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, ++ "Indicates if virtual cell is being used and nPUSCH identity is valid.", HFILL } ++ }, ++ { &hf_nfapi_npusch_identity, ++ { "nPUSCH Identity", "nfapi.npusch.identity", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Virtual cell ID for initialization of group hopping, sequence hopping and sequence shift pattern of PUSCH DMRS.", HFILL } ++ }, ++ { &hf_nfapi_ndrms_csh_identity, ++ { "nDMRS-CSH Identity", "nfapi.ndrms.csh.identity", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Virtual cell ID for initialization of cyclic shift hopping of PUSCH DMRS.", HFILL } ++ }, ++ { &hf_nfapi_total_number_of_repetitions, ++ { "Total Number of repetitions", "nfapi.total.number.of.repetitions", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_repetition_number, ++ { "Repetition Number", "nfapi.repetition.number", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Current transmission number", HFILL } ++ }, ++ { &hf_nfapi_initial_sf_io, ++ { "Initial transmission SF (io)", "nfapi.initial.sf.io", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Absolute Sub-Frame of the initial transmission", HFILL } ++ }, ++ { &hf_nfapi_empty_symbols_due_to_retunning, ++ { "Empy symbols due to re-tunning", "nfapi.empty.symbols.due.to.retunning", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates the symbols that are left empty due to eMTC retuning.", HFILL } ++ }, ++ { &hf_nfapi_dl_cqi_ri_pmi_size_2, ++ { "DL CQI/PMI/RI size 2", "nfapi.dl.cqi.ri.pmi.size.2", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The size of the DL CQI/PMI/RI in bits. If the CQI/PMI/RI size exceeds 255 (8-bits) then the Release 9 size value = 0, and this field is used instead.", HFILL } ++ }, ++ { &hf_nfapi_harq_size_2, ++ { "HARQ Size 2", "nfapi.harq.size2", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The size of the ACK/NACK in bits.", HFILL } ++ }, ++ { &hf_nfapi_delta_offset_harq_2, ++ { "Delta Offset HARQ 2", "nfapi.delta.offset.harq.2", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Delta offset 2 for HARQ. This value is fixed for a UE, allocated in RRC connection setup and used for ACK_NACK mode = 4 or 5", HFILL } ++ }, ++ { &hf_nfapi_starting_prb, ++ { "Starting PRB", "nfapi.starting.prb", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The starting PRB for the PUCCH", HFILL } ++ }, ++ { &hf_nfapi_antenna_port, ++ { "Antenna Port", "nfapi.antenna.port", ++ FT_UINT8, BASE_DEC, VALS(antenna_ports_vals), 0x0, ++ "Defines the number of antenna ports used by the UE for the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } ++ }, ++ { &hf_nfapi_number_of_combs, ++ { "Number of Combs", "nfapi.num.of.combs", ++ FT_UINT8, BASE_DEC, VALS(combs_vals), 0x0, ++ "Defines the maximum number of transmission combs (TC).", HFILL } ++ }, ++ { &hf_nfapi_npucch_identity, ++ { "nPUCCH Identity", "nfapi.npucch.identity", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Virtual cell ID for initialization of base sequence and cyclic shift hopping of PUCCH.", HFILL } ++ }, ++ { &hf_nfapi_empty_symbols, ++ { "Empty symbols", "nfapi.empty.symbols", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates the symbols that are left empty due to eMTC retuning.", HFILL } ++ }, ++ { &hf_nfapi_csi_mode, ++ { "CSI_mode", "nfapi.csi.mode", ++ FT_UINT8, BASE_DEC, VALS(csi_mode_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_dl_cqi_pmi_size_2, ++ { "DL CQI/PMI Size 2", "nfapi.dl.cqi.pmi.size.2", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The size of the DL CQI/PMI in bits", HFILL } ++ }, ++ { &hf_nfapi_statring_prb, ++ { "Starting PRB", "nfapi.starting.prb", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The starting PRB for the PUCCH", HFILL } ++ }, ++ { &hf_nfapi_cdm_index, ++ { "cdm_Index", "nfapi.cdm.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Selected CDM option", HFILL } ++ }, ++ { &hf_nfapi_nsrs, ++ { "N srs", "nfapi.n.srs", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates if the resource blocks allocated for this grant overlap with the SRS configuration.", HFILL } ++ }, ++ { &hf_nfapi_num_ant_ports, ++ { "Num_ant_ports", "nfapi.num.ant.port", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of antenna ports used by the UE transmit", HFILL } ++ }, ++ { &hf_nfapi_n_pucch_2_0, ++ { "n_PUCCH_2_0", "nfapi.n.pucch.2.0", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The PUCCH Index value for ACK/NACK HARQ resource 4 on antenna port", HFILL } ++ }, ++ { &hf_nfapi_n_pucch_2_1, ++ { "n_PUCCH_2_1", "nfapi.n.pucch.2.1", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "HARQ resource 5", HFILL } ++ }, ++ { &hf_nfapi_n_pucch_2_2, ++ { "n_PUCCH_2_2", "nfapi.n.pucch.2.2", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "HARQ resource 6", HFILL } ++ }, ++ { &hf_nfapi_n_pucch_2_3, ++ { "n_PUCCH_2_3", "nfapi.n.pucch.2.3", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "HARQ resource 7", HFILL } ++ }, ++ { &hf_nfapi_dl_cqi_pmi_size_rank_1, ++ { "DL CQI PMI size rank 1", "nfapi.dl.cqi.pmi.size.rank.1", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The size of the DL CQI/PMI in bits in case of rank 1 report.", HFILL } ++ }, ++ { &hf_nfapi_dl_cqi_pmi_size_rank_greater_1, ++ { "DL CQI PMI size rank greater 1", "nfapi.dl.cqi.pmi.size.rank.1", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The size of the DL CQI/PMI in bits in case of rank>1 report.", HFILL } ++ }, ++ { &hf_nfapi_ri_size, ++ { "RI size", "nfapi.ri.size", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The size of RI in bits", HFILL } ++ }, ++ { &hf_nfapi_delta_offset_cqi, ++ { "Delta offset cqi", "nfapi.delta.offset.cqi", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Delta offset for CQI. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } ++ }, ++ { &hf_nfapi_delta_offset_ri, ++ { "Delta offset ri", "nfapi.delta.offset.ri", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Delta offset for RI. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } ++ }, ++ { &hf_nfapi_harq_size, ++ { "HARQ size", "nfapi.harq_size", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The size of the ACK/NACK in bits", HFILL } ++ }, ++ { &hf_nfapi_delta_offset_harq, ++ { "Delta offset HARQ", "nfapi.delta.offset.harq", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Delta offset for HARQ. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } ++ }, ++ { &hf_nfapi_tdd_ack_nack_mode, ++ { "ACK NACK mode", "nfapi.tdd.ack.nack.mode", ++ FT_UINT8, BASE_DEC, VALS(nfapi_tdd_ack_nack_mode_vals), 0x0, ++ "The format of the ACK/NACK response expected. For TDD only.", HFILL } ++ }, ++ { &hf_nfapi_fdd_ack_nack_mode, ++ { "ACK NACK mode", "nfapi.fdd.ack.nack.mode", ++ FT_UINT8, BASE_DEC, VALS(nfapi_fdd_ack_nack_mode_vals), 0x0, ++ "The format of the ACK/NACK response expected. For TDD only.", HFILL } ++ }, ++ { &hf_nfapi_n_srs_initial, ++ { "N srs initial", "nfapi.n.srs.initial", ++ FT_UINT8, BASE_DEC, VALS(n_srs_initial_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_initial_number_of_resource_blocks, ++ { "Initial number of resource blocks", "nfapi.initial.number.of.resource.blocks", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of resource blocks used in the initial transmission of this transport block.", HFILL } ++ }, ++ { &hf_nfapi_dl_cqi_pmi_size, ++ { "DL cqi pmi size", "nfapi.dl.cqi.pmi.size", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The size of the DL CQI/PMI in bits in case of this RI value. The size of the DL CQI / PMI / RI in bits in case of this CRI value", HFILL } ++ }, ++ { &hf_nfapi_report_type, ++ { "Report type", "nfapi.report.type", ++ FT_BOOLEAN, 8, TFS(&nfapi_csi_report_type_strname), 0x0, ++ "Type of CSI report", HFILL } ++ }, ++ { &hf_nfapi_dl_cqi_ri_pmi_size, ++ { "DL CQI/PMI/RI size", "nfapi.dl.cqi.ri.pmi.size", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The size of the DL CQI/PMI/RI/CRI in bits", HFILL } ++ }, ++ { &hf_nfapi_control_type, ++ { "Control type", "nfapi.control.type", ++ FT_BOOLEAN, 8, TFS(&nfapi_control_type_string_name), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_number_of_cc, ++ { "Number of cc", "nfapi.number.of.cc", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of CC in the aperiodic report", HFILL } ++ }, ++ { &hf_nfapi_number_of_pucch_resource, ++ { "Number of PUCCH Resource", "nfapi.number.of.pucch.resource", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "A value of 2 indicates that the UE is configured to transmit on two antenna ports", HFILL } ++ }, ++ { &hf_nfapi_pucch_index_p1, ++ { "PUCCH Index P1", "nfapi.pucch.index.p1", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The PUCCH index value for antenna port P1", HFILL } ++ }, ++ { &hf_nfapi_n_pucch_1_0, ++ { "N PUCCH 1 0", "nfapi.n.pucch.1.0", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "HARQ resource 0", HFILL } ++ }, ++ { &hf_nfapi_n_pucch_1_1, ++ { "N PUCCH 1 1", "nfapi.n.pucch.1.1", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "HARQ resource 1", HFILL } ++ }, ++ { &hf_nfapi_n_pucch_1_2, ++ { "N PUCCH 1 2", "nfapi.n.pucch.1.2", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "HARQ resource 2", HFILL } ++ }, ++ { &hf_nfapi_n_pucch_1_3, ++ { "N PUCCH 1 3", "nfapi.n.pucch.1.3", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "HARQ resource 3", HFILL } ++ }, ++ { &hf_nfapi_srs_bandwidth, ++ { "SRS Bandwidth", "nfapi.srs.bandwidth", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "SRS Bandwidth. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } ++ }, ++ { &hf_nfapi_frequency_domain_position, ++ { "Frequency Domain position", "nfapi.frequency.domain.position", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Frequency-domain position, NRRC This value is fixed for a UE and allocated in RRC connection setup.", HFILL } ++ }, ++ { &hf_nfapi_srs_hopping_bandwidth, ++ { "SRS hopping bandwidth", "nfapi.srs.hopping.bandwidth", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Configures the frequency hopping on the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } ++ }, ++ { &hf_nfapi_transmission_comb, ++ { "Transmission comb", "nfapi.transmission.comb", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Configures the frequency location of the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } ++ }, ++ { &hf_nfapi_i_srs, ++ { "I SRS", "nfapi.i.srs", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Defines the periodicity and subframe location of the SRS. SRS Configuration Index. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } ++ }, ++ { &hf_nfapi_sounding_reference_cyclic_shift, ++ { "Sounding reference cyclic shift", "nfapi.sounding.reference.cyclic.shift", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Configures the SRS sequence generation. This value is fixed for a UE and allocated in RRC connection setup.", HFILL } ++ }, ++ { &hf_nfapi_pdu_length, ++ { "PDU length", "nfapi.pdu.length", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The total length (in bytes) of the PDU description and PDU data, without the padding bytes", HFILL } ++ }, ++ { &hf_nfapi_crc_flag, ++ { "CRC flag", "nfapi.crc.flag", ++ FT_BOOLEAN, 8, TFS(&crc_flag_strname), 0x0, ++ "A flag indicating if a CRC error was detected", HFILL } ++ }, ++ { &hf_nfapi_number_of_hi_pdus, ++ { "Number of HI Pdu's", "nfapi.number_of_hi_pdus", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Number of HI PDUs included in this message", HFILL } ++ }, ++ { &hf_nfapi_number_of_dci_pdus, ++ { "Number of DCI Pdu's", "nfapi.number_of_dci_pdus", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Number of DCI PDUs included in this message", HFILL } ++ }, ++ { &hf_nfapi_hi_dci0_pdu_type, ++ { "PDU Type", "nfapi.pdu_type", ++ FT_UINT8, BASE_DEC, VALS(hi_dci0_pdu_type_vals), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_hi_value, ++ { "HI Value", "nfapi.hi_value", ++ FT_BOOLEAN, 8, TFS(&hi_value_strname), 0x0, ++ "The PHICH value which is sent on the resource", HFILL } ++ }, ++ { &hf_nfapi_i_phich, ++ { "i phich", "nfapi.i_phich", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Is used in the calculation of the PHICH location. For TDD only", HFILL } ++ }, ++ { &hf_nfapi_flag_tb2, ++ { "Flag TB2", "nfapi.flag_tb2", ++ FT_BOOLEAN, BASE_NONE, TFS(&flag_tb2_strname), 0x0, ++ "Indicates is HI is present for a second transport block", HFILL } ++ }, ++ { &hf_nfapi_hi_value_2, ++ { "HI Value 2", "nfapi.hi_value_2", ++ FT_BOOLEAN, BASE_NONE, TFS(&hi_value_strname), 0x0, ++ "The PHICH value for a second transport block.", HFILL } ++ }, ++ { &hf_nfapi_ue_tx_antenna_selection, ++ { "UE Tx Antenna selection", "nfapi.ue_tx_antenna_selection", ++ FT_UINT8, BASE_DEC, VALS(ue_tx_antenna_selection_vals), 0x0, ++ "Indicates how the CRC is calculated on the PDCCH.", HFILL } ++ }, ++ { &hf_nfapi_cqi_csi_request, ++ { "cqi csi request", "nfapi.cqi_csi_request", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Aperiodic CQI request flag", HFILL } ++ }, ++ { &hf_nfapi_ul_index, ++ { "UL index", "nfapi.ul_index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Valid for TDD mode only", HFILL } ++ }, ++ { &hf_nfapi_dl_assignment_index, ++ { "DL Assignment index", "nfapi.dl_assignment_index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Valid for TDD mode only.", HFILL } ++ }, ++ { &hf_nfapi_tpc_bitmap, ++ { "TPC bitmap", "nfapi.tpc_bitmap", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "TPC commands for PUCCH and PUSCH", HFILL } ++ }, ++ { &hf_nfapi_number_of_antenna_ports, ++ { "Number of antenna ports", "nfapi.number.of.antenna.ports", ++ FT_UINT8, BASE_DEC, VALS(number_of_antenna_port_vals), 0x0, ++ "Defines number of antenna ports for this ULSCH allocation", HFILL } ++ }, ++ { &hf_nfapi_size_of_cqi_csi_feild, ++ { "Size of cqi csi feild", "nfapi.size.of.cqi.csi.feild", ++ FT_UINT8, BASE_DEC, VALS(size_of_cqi_csi_feild_vals), 0x0, ++ "Indicates the size of the CQI/CSI request field", HFILL } ++ }, ++ { &hf_nfapi_new_data_indication_two, ++ { "New data indication 2", "nfapi.new.data.indication.two", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The new data indicator for the second transport block", HFILL } ++ }, ++ { &hf_nfapi_resource_allocation_flag, ++ { "Resource allocation flag", "nfapi.resource.allocation.flag", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Indicates if the Resource Allocation Type parameter is valid.", HFILL } ++ }, ++ { &hf_nfapi_dl_node_sync_t1, ++ { "DL Node Sync t1", "nfapi.dl.node.sync.t1", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "Offset from VNF SFN/SF 0/0 time reference of the DL Node Sync message transmission at the transport layer, in microseconds.", HFILL } ++ }, ++ { &hf_nfapi_dl_node_sync_delta_sfn_sf, ++ { "DL Node Sync Delta SFN SF", "nfapi.dl.node.sync.delta_sfn_sf", ++ FT_INT32, BASE_DEC, NULL, 0x0, ++ "The delta shift in subframes that the PNF PHY instance must update to on the next subframe boundary", HFILL } ++ }, ++ { &hf_nfapi_dl_cyclic_prefix_type, ++ { "DL Cyclic Prefix type", "nfapi.dl.cyclic.prefix.type", ++ FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, ++ "Cyclic prefix type, used for DL", HFILL } ++ }, ++ { &hf_nfapi_ul_cyclic_prefix_type, ++ { "UL Cyclic Prefix type", "nfapi.ul.cyclic.prefix.type", ++ FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, ++ "Cyclic prefix type, used for UL", HFILL } ++ }, ++ { &hf_nfapi_downlink_channel_bandwidth, ++ { "Downlink Channel Bandwidth", "nfapi.dl.channel.bandwidth", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Downlink channel bandwidth in resource blocks.", HFILL } ++ }, ++ { &hf_nfapi_uplink_channel_bandwidth, ++ { "Uplink Channel Bandwidth", "nfapi.ul.channel_bandwidth", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Uplink channel bandwidth in resource blocks.", HFILL } ++ }, ++ { &hf_nfapi_tx_antenna_ports, ++ { "Tx Antenna Ports", "nfapi.tx.antenna.ports", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of cell specific or NB transmit antenna ports.", HFILL } ++ }, ++ { &hf_nfapi_rx_antenna_ports, ++ { "Tx Antenna Ports", "nfapi.rx.antenna.ports", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of cell specific or NB receive antenna ports.", HFILL } ++ }, ++ { &hf_nfapi_ul_node_sync_t1, ++ { "UL Node Sync t1", "nfapi.ul.node.sync.t1", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "The supplied t1 field in the DL Node Sync", HFILL } ++ }, ++ { &hf_nfapi_ul_node_sync_t2, ++ { "UL Node Sync t2", "nfapi.ul.node.sync.t2", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "Offset from PNF SFN/SF 0/0 time reference of the DL Node Sync message reception at the transport layer, in microseconds.", HFILL } ++ }, ++ { &hf_nfapi_ul_node_sync_t3, ++ { "UL Node Sync t3", "nfapi.ul.node.sync.t3", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "Offset from PNF SFN/SF 0/0 time reference of the UL Node Sync message transmission at the transport layer, in microseconds.", HFILL } ++ }, ++ { &hf_nfapi_pb, ++ { "P-B", "nfapi.pb.allocation", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Refers to downlink power allocation. Value is an index into the referenced table.", HFILL } ++ }, ++ { &hf_nfapi_timing_info_last_sfn_sf, ++ { "Last SFN/SF", "nfapi.timing.info.last.sfn.sf", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "The completed SFN/SF at the PNF PHY instance that triggered the Timing Info message", HFILL } ++ }, ++ { &hf_nfapi_timing_info_time_since_last_timing_info, ++ { "Time since last Timing Info", "nfapi.timing.info.time.since.last.timing.info", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "The number of ms since the last Timing Info was sent from this PNF PHY instance.", HFILL } ++ }, ++ { &hf_nfapi_timing_info_dl_config_jitter, ++ { "DL Config Jitter", "nfapi.timing.info.dl.config.jitter", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "The inter message jitter of the DL Config message reception in microseconds", HFILL } ++ }, ++ { &hf_nfapi_timing_info_tx_request_jitter, ++ { "Tx Request Jitter", "nfapi.timing.info.tx.req.jitter", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "The inter message jitter of the Tx Request message reception in microseconds", HFILL } ++ }, ++ { &hf_nfapi_timing_info_ul_config_jitter, ++ { "UL Config Jitter", "nfapi.timing.info.ul.config.jitter", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "The inter message jitter of the UL Config message reception in microseconds", HFILL } ++ }, ++ { &hf_nfapi_timing_info_hi_dci0_jitter, ++ { "HI_DCI0 Jitter", "nfapi.timing.info.hi.dci0.jitter", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "The inter message jitter of the HI_DCI0 message reception in microseconds", HFILL } ++ }, ++ { &hf_nfapi_timing_info_dl_config_latest_delay, ++ { "DL Config Latest Delay", "nfapi.timing.info.dl.config.latest.delay", ++ FT_INT32, BASE_DEC, NULL, 0x0, ++ "The latest delay offset in microseconds from the latest acceptable time for the DL Config as defined in the DL Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } ++ }, ++ { &hf_nfapi_timing_info_tx_request_latest_delay, ++ { "Tx Request Latest Delay", "nfapi.timing.info.tx.request.latest.delay", ++ FT_INT32, BASE_DEC, NULL, 0x0, ++ "The latest delay offset in microseconds from the latest acceptable time for the Tx Request as defined in the Tx Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } ++ }, ++ { &hf_nfapi_timing_info_ul_config_latest_delay, ++ { "UL Config Latest Delay", "nfapi.timing.info.ul.config.latest.delay", ++ FT_INT32, BASE_DEC, NULL, 0x0, ++ "The latest delay offset in microseconds from the latest acceptable time for the UL Config as defined in the UL Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } ++ }, ++ { &hf_nfapi_timing_info_hi_dci0_latest_delay, ++ { "HI_DCI0 Latest Delay", "nfapi.timing.info.hi.dci0.latest.delay", ++ FT_INT32, BASE_DEC, NULL, 0x0, ++ "The latest delay offset in microseconds from the latest acceptable time for the HI_DCI0 as defined in the HI_DCI0 Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL } ++ }, ++ { &hf_nfapi_timing_info_dl_config_earliest_arrival, ++ { "DL Config Earliest Arrival", "nfapi.timing.info.dl.config.earliest.arrival", ++ FT_INT32, BASE_DEC, NULL, 0x0, ++ "The earlierst arrival offset in microseconds from the latest time acceptable for the DL Config as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } ++ }, ++ { &hf_nfapi_timing_info_tx_request_earliest_arrival, ++ { "Tx Request Earliest Arrival", "nfapi.timing.info.tx.request.earliest.arrival", ++ FT_INT32, BASE_DEC, NULL, 0x0, ++ "The earlierst arrival offset in microseconds from the latest time acceptable for the Tx Request as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } ++ }, ++ { &hf_nfapi_timing_info_ul_config_earliest_arrival, ++ { "UL Config Earliest Arrival", "nfapi.timing.info.ul.config.earliest.arrival", ++ FT_INT32, BASE_DEC, NULL, 0x0, ++ "The earlierst arrival offset in microseconds from the latest time acceptable for the UL Config as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } ++ }, ++ { &hf_nfapi_timing_info_hi_dci0_earliest_arrival, ++ { "HI_DCI0 Earliest Arrival", "nfapi.timing.info.hi.dci0.earliest.arrival", ++ FT_INT32, BASE_DEC, NULL, 0x0, ++ "The earlierst arrival offset in microseconds from the latest time acceptable for the HI_DCI0 as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL } ++ }, ++ { &hf_nfapi_pcfich_power_offset, ++ { "PCFICH Power Offset", "nfapi.pcfich.power.offset", ++ FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0, ++ "The power per antenna of the PCFICH with respect to the reference signal.", HFILL } ++ }, ++ { &hf_nfapi_timing_window, ++ { "NFAPI Timing window", "nfapi.timing.window", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The window in milliseconds that the PHY must receive and queue the P7 messages.", HFILL } ++ }, ++ { &hf_nfapi_timing_info_mode, ++ { "Timing Info mode", "nfapi.timing.info.mode", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The configured mode of operation for the timing info message to be sent to the VNF from the PHY", HFILL } ++ }, ++ { &hf_nfapi_timing_info_period, ++ { "Timing info period", "nfapi.timing.info.period", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "If Periodic timing mode is enabled, this defines the periodicity in subframes. This field is ignored if periodic timing mode is disabled.", HFILL } ++ }, ++ { &hf_nfapi_tdd_harq_mode, ++ { "Mode", "nfapi.tdd.harq.mode", ++ FT_UINT8, BASE_DEC, VALS(tdd_harq_mode_vals), 0x0, ++ "The format of the ACK/NACK response expected", HFILL } ++ }, ++ { &hf_nfapi_fdd_harq_mode, ++ { "Mode", "nfapi.fdd.harq.mode", ++ FT_UINT8, BASE_DEC, VALS(fdd_harq_mode_vals), 0x0, ++ "The format of the ACK/NACK response expected", HFILL } ++ }, ++ { &hf_nfapi_number_of_ack_nack, ++ { "Number of ACK/NACK", "nfapi.uint16.tag", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of ACK/NACK results reported for this UE", HFILL } ++ }, ++ { &hf_nfapi_harq_data_value_0, ++ { "Value 0", "nfapi.harq.value.0", ++ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, ++ "Indicates HARQ results", HFILL } ++ }, ++ { &hf_nfapi_harq_data_value_0_special, ++ { "Value 0", "nfapi.harq.value.0.special", ++ FT_UINT8, BASE_DEC, VALS(harq_special_value_vals), 0x0, ++ "Indicates HARQ results", HFILL } ++ }, ++ { &hf_nfapi_harq_data_value_1, ++ { "Value 1", "nfapi.harq.value.1", ++ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, ++ "Indicates HARQ results", HFILL } ++ }, ++ { &hf_nfapi_harq_data_value_2, ++ { "Value 2", "nfapi.harq.value.2", ++ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, ++ "Indicates HARQ results", HFILL } ++ }, ++ { &hf_nfapi_harq_data_value_3, ++ { "Value 3", "nfapi.harq.value.3", ++ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, ++ "Indicates HARQ results", HFILL } ++ }, ++ { &hf_nfapi_harq_tb_1, ++ { "HARQ TB1", "nfapi.harq.tb.", ++ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, ++ "HARQ feedback of 1st TB.", HFILL } ++ }, ++ { &hf_nfapi_harq_tb_2, ++ { "HARQ TB2", "nfapi.harq.tb.2", ++ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, ++ "HARQ feedback of 2nd TB.", HFILL } ++ }, ++ { &hf_nfapi_harq_tb_n, ++ { "HARQ TB_N", "nfapi.harq.tb.n", ++ FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0, ++ "HARQ feedback of Nth TB.", HFILL } ++ }, ++ { &hf_nfapi_ul_cqi, ++ { "UL_CQI", "nfapi.ul.cqi", ++ FT_UINT8, BASE_CUSTOM, CF_FUNC(ul_cqi_conversion_fn), 0x0, ++ "SNR", HFILL } ++ }, ++ { &hf_nfapi_channel, ++ { "Channel", "nfapi.channel", ++ FT_UINT8, BASE_DEC, VALS(channel_vals), 0x0, ++ "The channel to which this measurement refers", HFILL } ++ }, ++ { &hf_nfapi_data_offset, ++ { "Data Offset", "nfapi.data.offset", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Gives the PDU#i data address offset from the beginning of the 'Number of PDUs' field. An offset of 0 indicates a CRC or decoding error", HFILL } ++ }, ++ { &hf_nfapi_ri, ++ { "RI", "nfapi.ri", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The rank indication reported by the UE on PUSCH for aperiodic CSI.", HFILL } ++ }, ++ { &hf_nfapi_timing_advance, ++ { "Timing Advance", "nfapi.timing.advance", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The timing advance measured for this PDU and UE.", HFILL } ++ }, ++ { &hf_nfapi_timing_advance_r9, ++ { "Timing Advance R9", "nfapi.timing.advance.r9", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Timing advance used for positioning", HFILL } ++ }, ++ { &hf_nfapi_number_of_cc_reported, ++ { "Number of CC reported", "nfapi.number.of.cc.reported", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_preamble, ++ { "Preamble", "nfapi.preamble", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The detected preamble", HFILL } ++ }, ++ { &hf_nfapi_rach_resource_type, ++ { "RACH resource type", "nfapi.rach.resource.type", ++ FT_UINT8, BASE_DEC, VALS(rach_resource_type_vals), 0x0, ++ "Indicates if this indication is related to Cat-M UE and in which CE level", HFILL } ++ }, ++ { &hf_nfapi_doppler_estimation, ++ { "Doppler estimation", "nfapi.doppler.estimation", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "FFS", HFILL } ++ }, ++ { &hf_nfapi_rb_start, ++ { "RB Start", "nfapi.rb.start", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The starting point of the RBs to be reported", HFILL } ++ }, ++ { &hf_nfapi_snr, ++ { "SNR", "nfapi.snr", ++ FT_UINT8, BASE_CUSTOM, CF_FUNC(ul_cqi_conversion_fn), 0x0, ++ "Field size dependent on configured bandwidth SNR for RBs, each RBs report one SNR.", HFILL } ++ }, ++ { &hf_nfapi_up_pts_symbol, ++ { "UpPTS Symbol", "nfapi.uppts.symbol", ++ FT_UINT8, BASE_DEC, VALS(up_pts_symbol_vals), 0x0, ++ "Indicates symbol where SRS was received. Only valid if the SRS was received in subframe 1 or 6.", HFILL } ++ }, ++ { &hf_nfapi_number_prb_per_subband, ++ { "numPRBperSubband", "nfapi.num.prb.per.subband", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Number of PRBs that are treated as one subband", HFILL } ++ }, ++ { &hf_nfapi_number_antennas, ++ { "numAntennas", "nfapi.num.antennas", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Number of physical antennas", HFILL } ++ }, ++ { &hf_nfapi_subband_index, ++ { "subbandIndex", "nfapi.subband.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Index of subband for which the following channel coefficient is applied", HFILL } ++ }, ++ { &hf_nfapi_channel_coefficient, ++ { "Channel", "nfapi.channel.coefficient", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Averaged channel coefficient in a subband for physical antenna #i, real 8 bits followed by imaginary 8 bits", HFILL } ++ }, ++ { &hf_nfapi_ul_rtoa, ++ { "UL_RTOA", "nfapi.ul.rtoa", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "UL relative time of arrival used for network based positioning", HFILL } ++ }, ++ { &hf_nfapi_frequency_band_indicator, ++ { "Frequency Band Indicator", "nfapi.frequency.band.indicator", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The E-UTRA band for which the carrierList applies.", HFILL } ++ }, ++ { &hf_nfapi_measurement_period, ++ { "Measurement Period", "nfapi.measurement.period", ++ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "The length of time to measure RSSI over, in units of 1ms.", HFILL } ++ }, ++ { &hf_nfapi_bandwidth, ++ { "Bandwidth", "nfapi.bandwidth", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The bandwidth (in resource blocks) over which the RSSI is measured.", HFILL } ++ }, ++ { &hf_nfapi_timeout, ++ { "Timeout", "nfapi.timeout", ++ FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "The timeout value after which the PNF should abort the procedure in units of 1ms. The value of 0 indicates that the PNF should attempt to complete the procedure without any VNF-imposed timeout.", HFILL } ++ }, ++ { &hf_nfapi_number_of_earfcns, ++ { "Number of EARFCNs", "nfapi.number.of.earfcns", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of EARFCNs which should be measured. In the case that no EARFCN (value 0) is specified, all valid EARFCNs for the specified bandwidth in the band shall be measured, in order of ascending EARCFN.", HFILL } ++ }, ++ { &hf_nfapi_uarfcn, ++ { "UARFCN", "nfapi.uarfcn", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "UARFCN to be measured.", HFILL } ++ }, ++ { &hf_nfapi_number_of_uarfcns, ++ { "Number of UARFCNs", "nfapi.number.of.uarfcn", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of UARFCNs which should be measured. In the case that no UARFCN (value 0) is specified, all UARFCNs in the band shall be measured, in order of ascending UARCFN.", HFILL } ++ }, ++ { &hf_nfapi_arfcn, ++ { "ARFCN", "nfapi.arfcn", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The ARFCN to be measured", HFILL } ++ }, ++ { &hf_nfapi_arfcn_direction, ++ { "Direction", "nfapi.arfcn.direction", ++ FT_UINT8, BASE_DEC, VALS(arfcn_direction_vals), 0x0, ++ "The link direction to be measured", HFILL } ++ }, ++ { &hf_nfapi_number_of_arfcns, ++ { "Number of ARFCNs", "nfapi.number.of.arfcn", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of ARFCNs which should be measured. In the case that no ARFCN (value 0) is specified, all ARFCNs in the band shall be measured, in order of ascending ARCFN.", HFILL } ++ }, ++ { &hf_nfapi_rssi, ++ { "RSSI", "nfapi.rssi", ++ FT_INT16, BASE_CUSTOM, CF_FUNC(rssi_conversion_fn), 0x0, ++ "The list of RSSI values of the carriers measured, in the order of the list of the original request.", HFILL } ++ }, ++ { &hf_nfapi_number_of_rssi, ++ { "Number of RSSI", "nfapi.number.of.rssi", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of RSSI results returned in the following array.", HFILL } ++ }, ++ { &hf_nfapi_pci, ++ { "PCI", "nfapi.pci", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The PCI for cell which should be searched", HFILL } ++ }, ++ { &hf_nfapi_measurement_bandwidth, ++ { "Measurement Bandwidth", "nfapi.measurement.bandwidth", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of resource blocks which should be used for measuring RSRP", HFILL } ++ }, ++ { &hf_nfapi_exhaustive_search, ++ { "Exhaustive Search", "nfapi.exhaustive.search", ++ FT_UINT8, BASE_DEC, VALS(exhustive_search_vals), 0x0, ++ "NMM should try to find all cells on the carrier", HFILL } ++ }, ++ { &hf_nfapi_number_of_pci, ++ { "Number of PCI", "nfapi.number.of.pci", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of cells in the PCI list. If 0 all cells on the carrier should be found. Otherwise, depending on exhaustiveSearch flag, only the given pciList is searched or the pciList is used for indicating a priority list. Range: 0 to MAX_PCI_LIST.", HFILL } ++ }, ++ { &hf_nfapi_psc, ++ { "PSC", "nfapi.psc", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The PSC for cells which should be searched.", HFILL } ++ }, ++ { &hf_nfapi_number_of_psc, ++ { "Number of PSC", "nfapi.number.of.psc", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of cells in the PSC list. If 0 all cells on the carrier should be found. Otherwise, depending on Exhaustive Search flag, only the given PSC list is searched or the PSC list is used for indicating a priority list. Range: 0 to MAX_PSC_LIST.", HFILL } ++ }, ++ { &hf_nfapi_rsrp, ++ { "RSRP", "nfapi.rsrp", ++ FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, ++ "The measured RSRP value in units of -1dB", HFILL } ++ }, ++ { &hf_nfapi_rsrq, ++ { "RSRQ", "nfapi.rsrq", ++ FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, ++ "The measured RSRQ value in units of -1dB", HFILL } ++ }, ++ { &hf_nfapi_number_of_lte_cells_found, ++ { "Number of LTE Cells Found", "nfapi.number.of.lte.cells.found", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of LTE cells indicated in this message.", HFILL } ++ }, ++ { &hf_nfapi_rscp, ++ { "RSCP", "nfapi.rscp", ++ FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, ++ "The measured RSCP value in units of -1dB", HFILL } ++ }, ++ { &hf_nfapi_enco, ++ { "EcNo", "nfapi.ecno", ++ FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0, ++ "The measured RSCP value in units of -1dB", HFILL } ++ }, ++ { &hf_nfapi_number_of_utran_cells_found, ++ { "Number of UTRAN Cells Found", "nfapi.number.of.utran.cells.found", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of LTE cells indicated in this message", HFILL } ++ }, ++ { &hf_nfapi_bsic, ++ { "BSIC", "nfapi.bsic", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The BSIC of the cell which the NMM synchronized to", HFILL } ++ }, ++ { &hf_nfapi_rxlev, ++ { "RxLev", "nfapi.rxlev", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The measured RxLev value", HFILL } ++ }, ++ { &hf_nfapi_rxqual, ++ { "RxQual", "nfapi.rxqual", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The measured RxQual value", HFILL } ++ }, ++ { &hf_nfapi_sfn_offset, ++ { "SFN Offset", "nfapi.sfn.offset", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "The offset in us of the start of the current GSM Radio HyperFrame (i.e. FN=0) from the start of the preceding LTE Radio Frame of the PNF for SFN=0", HFILL } ++ }, ++ { &hf_nfapi_number_of_geran_cells_found, ++ { "Number of GSM Cells Found", "nfapi.number.of.geran.cells.found", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The number of GSM cells indicated in this message", HFILL } ++ }, ++ { &hf_nfapi_number_of_tx_antenna, ++ { "Number of Tx Antenna", "nfapi.number.of.tx.antenna", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of Tx Antenna detected for the cell", HFILL } ++ }, ++ { &hf_nfapi_mib_length, ++ { "MIB Length", "nfapi.mib.length", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Length in bytes of the following MIB array", HFILL } ++ }, ++ { &hf_nfapi_mib, ++ { "MIB", "nfapi.mib", ++ FT_BYTES, BASE_NONE, NULL, 0x0, ++ "The MIB read from the specified cell.", HFILL } ++ }, ++ { &hf_nfapi_phich_configuration, ++ { "PHICH Configuration", "nfapi.phich.configuration", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The PHICH-Config of the cell", HFILL } ++ }, ++ { &hf_nfapi_retry_count, ++ { "retryCount", "nfapi.retry.count", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of SIB1 repetition periods for which decoding of SIB1 should be retried.", HFILL } ++ }, ++ { &hf_nfapi_sib1, ++ { "SIB1", "nfapi.sib1", ++ FT_BYTES, BASE_NONE, NULL, 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_si_periodicity, ++ { "SI Periodicity", "nfapi.si.periodicity", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The SI Periodicity of the requested SIBs, with the first element being for SIB2, the next for SIB3, etc, encoded as follows", HFILL } ++ }, ++ { &hf_nfapi_si_index, ++ { "SI Index", "nfapi.si.index", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The index of this SIB in the SIB1 SchedulingInfoList:", HFILL } ++ }, ++ { &hf_nfapi_number_of_si_periodicity, ++ { "Number of SI Periodicity", "nfapi.number.of.si.periodicity", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The number of System Information periodicity values in the following array", HFILL } ++ }, ++ { &hf_nfapi_si_window_length, ++ { "SI Window Length", "nfapi.si.window.length", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The SI window in units of 1ms", HFILL } ++ }, ++ { &hf_nfapi_sib_type, ++ { "SIB Type", "nfapi.sib.type", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "The SIB type", HFILL } ++ }, ++ { &hf_nfapi_sib_len, ++ { "SIB Length", "nfapi.sib.length", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The length in bytes of the following SIB array", HFILL } ++ }, ++ { &hf_nfapi_sib, ++ { "SIB", "nfapi.sib", ++ FT_BYTES, BASE_NONE, NULL, 0x0, ++ "The SIB element read from the specified cell.", HFILL } ++ }, ++ { &hf_nfapi_si_len, ++ { "SI Length", "nfapi.si.length", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The length in bytes of the following SI array", HFILL } ++ }, ++ { &hf_nfapi_si, ++ { "SI", "nfapi.si", ++ FT_BYTES, BASE_NONE, NULL, 0x0, ++ "The SI element read from the specified cell.", HFILL } ++ }, ++ { &hf_nfapi_pnf_search_state, ++ { "State", "nfapi.state", ++ FT_BYTES, BASE_NONE, NULL, 0x0, ++ "A structure of opaque data optionally sent by the PNF to the VNF", HFILL } ++ }, ++ { &hf_nfapi_pnf_broadcast_state, ++ { "State", "nfapi.state", ++ FT_BYTES, BASE_NONE, NULL, 0x0, ++ "A structure of opaque data optionally sent by the PNF to the VNF", HFILL } ++ }, ++ { &hf_nfapi_dl_rs_tx_power, ++ { "DL RS Tx power", "nfapi.dl.rs.tx.power", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "The DL RS Tx power measurement", HFILL } ++ }, ++ { &hf_nfapi_received_interference_power, ++ { "Received interference power", "nfapi.received.interference.power", ++ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "The Received interference power measurement", HFILL } ++ }, ++ { &hf_nfapi_thermal_noise_power, ++ { "Thermal noise power", "nfapi.thermal.noise.power", ++ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0, ++ "The Thermal noise power measurement", HFILL } ++ }, ++ { &hf_nfapi_dl_rs_tx_power_measurement, ++ { "DL RS TX Power measurement", "nfapi.dl.rs.tx.power.measurement", ++ FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, ++ "The DL RS Tx power measurement defined", HFILL } ++ }, ++ { &hf_nfapi_received_interference_power_measurement, ++ { "Received interference power measurement", "nfapi.received.interference.power.measurement", ++ FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, ++ NULL, HFILL } ++ }, ++ { &hf_nfapi_thermal_noise_power_measurement, ++ { "Thermal noise power measurement", "nfapi.thermal.noise.power.measurement", ++ FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0, ++ "The Thermal noise power measurement", HFILL } ++ }, ++ { &hf_nfapi_initial_partial_sf, ++ { "Initial Partial SF", "nfapi.initial.partial.sf", ++ FT_BOOLEAN, 32, TFS(&initial_partial_sf_strname), 0x0, ++ "Indicates whether the initial SF in the LBT process is full or partial", HFILL } ++ }, ++ { &hf_nfapi_lbt_mode, ++ { "LBT Mode", "nfapi.lbt.mode", ++ FT_BOOLEAN, 32, TFS(&lbt_mode_strname), 0x0, ++ "Part of multi-carrier support. Indicates whether full LBT process is carried or partial LBT process is carried (multi carrier mode B according to [9] section 15.1.5.2)", HFILL } ++ }, ++ { &hf_nfapi_lte_txop_sf, ++ { "LTE TXOP SF", "nfapi.txop.sf", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "Indicates the LTE TXOP (TMCOT,P in [9] section 15.1.1) duration in subframes.", HFILL } ++ }, ++ { &hf_nfapi_mp_cca, ++ { "mp cca", "nfapi.mp.cca", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "Indicates the value of the defer factor", HFILL } ++ }, ++ { &hf_nfapi_n_cca, ++ { "n cca", "nfapi.n.cca", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "Indicates the value of LBT backoff counter", HFILL } ++ }, ++ { &hf_nfapi_offset, ++ { "offset", "nfapi.offset", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "Indicates the LBT start time in microseconds from the beginning of the subframe scheduled by this message.", HFILL } ++ }, ++ { &hf_nfapi_result, ++ { "result", "nfapi.result", ++ FT_BOOLEAN, 32, TFS(&tfs_fail_success), 0x0, ++ "Indicates the LBT procedure result of SFN/SF:", HFILL } ++ }, ++ { &hf_nfapi_sfn_sf_end, ++ { "SFN/SF End", "nfapi.sfn.sf.end", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates the SFN/SF by which the DRS window (Discovery signal occasion as described in [9] section 6.11A) must end. In worst case, this would be the last TXOP subframe.", HFILL } ++ }, ++ { &hf_nfapi_txop_sfn_sf_end, ++ { "TXOP SFN/SF End", "nfapi.txop.sfn.sf.end", ++ FT_UINT16, BASE_DEC, NULL, 0x0, ++ "Indicates the SFN/SF by which the TXOP must end. In worst case, this would be the last TXOP subframe.", HFILL } ++ }, ++ { &hf_nfapi_txop_symbols, ++ { "LTE TXOP symbols", "nfapi.lte.txop.symbols", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "Actual LTE TXOP in symbols", HFILL } ++ }, ++ }; ++ ++ /* Setup protocol subtree array */ ++ static gint *ett[] = ++ { ++ &ett_nfapi_message_tree, ++ &ett_nfapi_p4_p5_message_header, ++ &ett_nfapi_p7_message_header, ++ &ett_nfapi_tlv_tree, ++ &ett_nfapi_tl, ++ &ett_nfapi_pnf_phy_rf_config, ++ &ett_nfapi_pnf_phy, ++ &ett_nfapi_pnf_phy_rel10, ++ &ett_nfapi_pnf_phy_rel11, ++ &ett_nfapi_pnf_phy_rel12, ++ &ett_nfapi_pnf_phy_rel13, ++ &ett_nfapi_rf_bands, ++ &ett_nfapi_bf_vectors, ++ &ett_nfapi_csi_rs_bf_vector, ++ &ett_nfapi_csi_rs_resource_configs, ++ &ett_nfapi_tx_antenna_ports, ++ &ett_nfapi_harq_ack_nack_data, ++ &ett_nfapi_harq_data, ++ &ett_nfapi_cqi_pmi_size, ++ &ett_nfapi_cc, ++ &ett_nfapi_rbs, ++ &ett_nfapi_antennas, ++ &ett_nfapi_epdcch_prbs, ++ &ett_nfapi_dl_config_request_pdu_list, ++ &ett_nfapi_ul_config_request_pdu_list, ++ &ett_nfapi_hi_dci0_request_pdu_list, ++ &ett_nfapi_tx_request_pdu_list, ++ &ett_nfapi_rx_indication_pdu_list, ++ &ett_nfapi_harq_indication_pdu_list, ++ &ett_nfapi_crc_indication_pdu_list, ++ &ett_nfapi_sr_indication_pdu_list, ++ &ett_nfapi_cqi_indication_pdu_list, ++ &ett_nfapi_preamble_indication_pdu_list, ++ &ett_nfapi_srs_indication_pdu_list, ++ &ett_nfapi_lbt_dl_config_pdu_list, ++ &ett_nfapi_lbt_dl_indication_pdu_list, ++ &ett_nfapi_subbands, ++ &ett_nfapi_precoding, ++ &ett_nfapi_bf_vector_antennas, ++ &ett_nfapi_received_interference_power_mesurement_results, ++ &ett_nfapi_downlink_bandwidth_support, ++ &ett_nfapi_uplink_bandwidth_support, ++ &ett_nfapi_release_support, ++ &ett_nfapi_downlink_modulation_support, ++ &ett_nfapi_uplink_modulation_support, ++ ++ &ett_nfapi_earfcn_list, ++ &ett_nfapi_uarfcn_list, ++ &ett_nfapi_arfcn_list, ++ &ett_nfapi_rssi_list, ++ &ett_nfapi_pci_list, ++ &ett_nfapi_psc_list, ++ &ett_nfapi_lte_cells_found_list, ++ &ett_nfapi_utran_cells_found_list, ++ &ett_nfapi_geran_cells_found_list, ++ &ett_nfapi_si_periodicity_list, ++ ++ /* for fragmentation support*/ ++ &ett_msg_fragment, ++ &ett_msg_fragments ++ }; ++ ++ static ei_register_info ei[] = ++ { ++ { &ei_invalid_range, { "nfapi.invalid.range", PI_PROTOCOL, PI_WARN, NULL, EXPFILL } }, ++ { &ei_invalid_tlv_length, { "nfapi.invalid.tlv.length", PI_PROTOCOL, PI_ERROR, NULL, EXPFILL } }, ++ }; ++ ++ expert_module_t* expert_nfapi; ++ /* Register protocol */ ++ proto_nfapi = proto_register_protocol("Nfapi", "NFAPI", "nfapi"); ++ ++ expert_nfapi = expert_register_protocol(proto_nfapi); ++ expert_register_field_array(expert_nfapi, ei, array_length(ei)); ++ ++ ++ proto_register_field_array(proto_nfapi, hf, array_length(hf)); ++ proto_register_subtree_array(ett, array_length(ett)); ++ ++ reassembly_table_register(&ul_p7_reassemble_table, &addresses_ports_reassembly_table_functions); ++ reassembly_table_register(&dl_p7_reassemble_table, &addresses_ports_reassembly_table_functions); ++ ++ register_dissector("nfapi", dissect_nfapi, proto_nfapi); ++ ++} ++ ++// ----------------------------------------------------------------------------| ++ ++void proto_reg_handoff_nfapi(void) ++{ ++ static dissector_handle_t nfapi_handle; ++ ++ nfapi_handle = create_dissector_handle(dissect_nfapi, proto_nfapi); ++ ++ dissector_add_for_decode_as("sctp.port", nfapi_handle); ++ ++ dissector_add_uint("udp.port", 41700, nfapi_handle); ++ ++} ++ ++ ++/* ++* Editor modelines - http://www.wireshark.org/tools/modelines.html ++* ++* Local variables: ++* c-basic-offset: 8 ++* tab-width: 8 ++* indent-tabs-mode: t ++* End: ++* ++* vi: set shiftwidth=8 tabstop=8 noexpandtab: ++* :indentSize=8:tabSize=8:noTabs=false: ++*/ +diff --git a/xml/pnf_phy_1_A.xml b/xml/pnf_phy_1_A.xml +index da6cc26..45f8f46 100644 +--- a/xml/pnf_phy_1_A.xml ++++ b/xml/pnf_phy_1_A.xml +@@ -26,7 +26,7 @@ + + 88 + 2500 +-
127.0.0.1
++
192.168.1.74
+ + 1 + +@@ -54,9 +54,9 @@ + + + +- 7722 +- 127.0.0.1 +- 7733 ++ 5201 ++ 192.168.1.28 ++ 5200 + + +
+diff --git a/xml/vnf_A.xml b/xml/vnf_A.xml +index e609c93..3791239 100644 +--- a/xml/vnf_A.xml ++++ b/xml/vnf_A.xml +@@ -2,8 +2,8 @@ + + + +- 5200 +-
127.0.0.1
++ 5201 ++
192.168.1.28
+ 10 + 0 + 0 +@@ -12,7 +12,7 @@ + + + 8891 +- 127.0.0.1 ++ 192.168.1.28 + 8892 + + diff --git a/openair1/COPYING b/openair1/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/Makefile b/openair1/Makefile deleted file mode 100644 index 04be9ff8b0..0000000000 --- a/openair1/Makefile +++ /dev/null @@ -1,121 +0,0 @@ -# command line flags are automatically exported and thus passed down to any sub-make. -# here we set the default flags in case on command line flags are provided -# these flags have to be explicitely exported so that the sub-make is aware of them - - -include $(OPENAIR_DIR)/common/utils/Makefile.inc -ifndef OPENAIR_LTE -export OPENAIR_LTE=1 -endif - -ifndef OPENAIR1 -export OPENAIR1=1 -endif - -ifndef OPENAIR2 -export OPENAIR2=0 -endif - -ifndef EMOS -export EMOS=0 -endif - -ifndef FIRMWARE2010 -export FIRMWARE2010=0 -endif - -all: openair_rf_cbmimo1_softmodem.ko asn1_msg_kern.ko - -openair_rf_cbmimo1_softmodem.ko: - (cd ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 && mv openair_rf.ko openair_rf_softmodem.ko) - -oai_user_cbmimo1.ko: - (cd ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 BIT8_TX=1 OPENAIR1=0 OPENAIR2=0 && mv openair_rf.ko openair_rf_softmodem.ko) - -oai_user_exmimo.ko: - (cd ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 OPENAIR1=0 OPENAIR2=0 && mv openair_rf.ko openair_rf_softmodem.ko) - -asn1_msg_kern.ko: - (cd ../openair2/RRC/LITE/MESSAGES && $(MAKE) -C $(KERNEL_DIR) V=0 M=`pwd` RTAI=1 -j2) - -#Remove all but source files -cleanall: - find -name '*.o' -delete -print; \ - find -name '*.ko' -delete -print; \ - find -name '*.bak' -delete -print; \ - find -name '*.cmd' -delete -print; \ - find -name '*~' -delete -print; \ - find -name octave-core -delete -print; \ - -#Remove files created by SVN, dangerous!!! DO NOT RUN ON YOUR WORKING REPOSITORY! -#FK: Don't do this! Use svn export instead. -#cleansvn: -# rm -rf `find -name *.svn* -print`; \ -# find -name *.svn* -delete -print - -tgz: - mkdir /tmp/openair1_tmp; \ - $(MAKE) cleanall; \ - cp -r . /tmp/openair1_tmp; \ - (cd /tmp/openair1_tmp && $(MAKE) cleansvn && cd .. && tar czfv openair1.tgz openair1_tmp) ; \ - cp /tmp/openair1.tgz . ;\ - rm -rf /tmp/openair1_tmp - -fifos: - @for i in `seq 0 64`;\ - do \ - have_rtfX=`ls /dev/ |grep -c rtf$$i`;\ - if [ "$$have_rtfX" -eq 0 ] ;then \ - mknod -m 666 /dev/rtf$$i c 150 $$i; \ - fi;\ - done - -openair0: - mknod /dev/openair0 c 127 0 - chmod a+rw /dev/openair0 - -install_oai_user: - make fifos - insmod ARCH/CBMIMO1/DEVICE_DRIVER/openair_rf_softmodem.ko - -updatefw: - USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr_exmimo2/main -s 0x43fffff0 - -boot_exmimo: - sudo make install_oai_user - USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0 - sudo rmmod openair_rf - sudo make install_oai_user - -reboot_exmimo: - USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0 -b - rmmod openair_rf - make install_oai_user - USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0 - rmmod openair_rf - make install_oai_user - -install_softmodem: - make fifos -ifeq ($(OPENAIR2),1) - insmod ../openair2/RRC/LITE/MESSAGES/asn1_msg_kern.ko -endif - insmod ARCH/CBMIMO1/DEVICE_DRIVER/openair_rf_softmodem.ko ; \ - -remove: - rmmod openair_rf -ifeq ($(OPENAIR2),1) - rmmod asn1_msg_kern -endif - -test: - (cd ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) test RTAI=1 CBMIMO1=1) - (cd ../openair2/RRC/LITE/MESSAGES && $(MAKE) test) - -clean: clean_l1 - -clean_l1: - (cd ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) clean RTAI=1 CBMIMO1=1) - -clean_asn1: - (cd ../openair2/RRC/LITE/MESSAGES && $(MAKE) clean) diff --git a/openair1/PHY/CODING/3gpplte.c b/openair1/PHY/CODING/3gpplte.c index c1a862ebb3..ca63857d72 100644 --- a/openair1/PHY/CODING/3gpplte.c +++ b/openair1/PHY/CODING/3gpplte.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte.c purpose: Encoding routines for implementing Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c old mode 100755 new mode 100644 index 34fcbef6d6..5d87a60477 --- a/openair1/PHY/CODING/3gpplte_sse.c +++ b/openair1/PHY/CODING/3gpplte_sse.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_sse.c purpose: Encoding routines for implementing Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 author: Laurent Thomas @@ -52,7 +45,7 @@ #define print_bytes2(s,x) printf("%s %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7],(x)[8],(x)[9],(x)[10],(x)[11],(x)[12],(x)[13],(x)[14],(x)[15],(x)[16],(x)[17],(x)[18],(x)[19],(x)[20],(x)[21],(x)[22],(x)[23],(x)[24],(x)[25],(x)[26],(x)[27],(x)[28],(x)[29],(x)[30],(x)[31]) //#define DEBUG_TURBO_ENCODER 1 -#define CALLGRIND 1 +//#define CALLGRIND 1 unsigned short threegpplte_interleaver_output; unsigned long long threegpplte_interleaver_tmp; @@ -233,7 +226,7 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns loop++; #endif - + for (i=0; i>1); #else int input_length_words=1+((n-1)>>2); -#endif +#endif + for ( i=0; i< input_length_words ; i ++ ) { + #if defined(__x86_64__) || defined(__i386__) #ifndef __AVX2__ tmp=_mm_insert_epi8(tmp,expandInput[*ptr_intl++],7); @@ -571,6 +566,7 @@ void threegpplte_turbo_encoder(unsigned char *input, unsigned char systematic2[768] __attribute__((aligned(32))); + interleave_compact_byte(base_interleaver,input,systematic2,input_length_bytes); #if defined(__x86_64__) || defined(__i386__) @@ -584,7 +580,7 @@ void threegpplte_turbo_encoder(unsigned char *input, for ( state0=state1=i=0 ; i. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_turbo_decoder.c purpose: Fixed-point routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 Modified from TI C6x reference design. @@ -1065,7 +1058,7 @@ unsigned char phy_threegpplte_turbo_decoder_scalar(llr_t *y, break; } - if ((crc == oldcrc) && (crc!=0)) { + if (crc == oldcrc) { return(iteration_cnt); } diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c index 24f399a2b2..616eed7446 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_turbo_decoder_sse_16bit.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) @@ -1382,7 +1375,7 @@ unsigned char phy_threegpplte_turbo_decoder16avx2(int16_t *y, fprintf(fdavx2b,"oldcrc %x, crc %x, oldcrc_cw2 %x, crc_cw2 %x\n",oldcrc,crc,oldcrc_cw2,crc_cw2); #endif - if ((crc == oldcrc) && (crc!=0) && (crc_cw2 == oldcrc_cw2) && (crc_cw2!=0)) { + if (crc == oldcrc && crc_cw2 == oldcrc_cw2) { return(iteration_cnt); } } diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c index 67df01c437..9ec25367d9 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_turbo_decoder_sse.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) @@ -2563,7 +2556,7 @@ unsigned char phy_threegpplte_turbo_decoder(short *y, stop_meas(intl2_stats); - if ((crc == oldcrc) && (crc!=0)) { + if (crc == oldcrc) { return(iteration_cnt); } } diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c index ab7d19407e..cb4a4e1f84 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_turbo_decoder_sse_16bit.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) @@ -44,6 +37,7 @@ /// /// +#undef __AVX2__ #include "PHY/sse_intrin.h" #ifndef TEST_DEBUG @@ -1618,7 +1612,7 @@ unsigned char phy_threegpplte_turbo_decoder16(short *y, fprintf(fdsse4,"oldcrc %x, crc %x\n",oldcrc,crc); #endif - if ((crc == oldcrc) && (crc!=0)) { + if (crc == oldcrc) { return(iteration_cnt); } } diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c index 0227a45a3d..d6ef84b218 100644 --- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c +++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: 3gpplte_turbo_decoder_sse.c purpose: Routines for implementing max-logmap decoding of Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 authors: raymond.knopp@eurecom.fr, Laurent Thomas (Alcatel-Lucent) @@ -62,6 +55,8 @@ #include "mex.h" #endif +#include "common/ran_context.h" + #define SHUFFLE16(a,b,c,d,e,f,g,h) _mm_set_epi8(h==-1?-1:h*2+1, \ h==-1?-1:h*2, \ g==-1?-1:g*2+1, \ @@ -129,21 +124,21 @@ void log_map8(llr_t* systematic, { #ifdef DEBUG_LOGMAP - msg("log_map, frame_length %d\n",frame_length); + printf("log_map, frame_length %d\n",frame_length); #endif - start_meas(gamma_stats) ; + if (gamma_stats) start_meas(gamma_stats) ; compute_gamma8(m11,m10,systematic,y_parity,frame_length,term_flag) ; - stop_meas(gamma_stats); - start_meas(alpha_stats) ; + if (gamma_stats) stop_meas(gamma_stats); + if (alpha_stats) start_meas(alpha_stats) ; compute_alpha8(alpha,beta,m11,m10,frame_length,F) ; - stop_meas(alpha_stats); - start_meas(beta_stats) ; + if (alpha_stats) stop_meas(alpha_stats); + if (beta_stats) start_meas(beta_stats) ; compute_beta8(alpha,beta,m11,m10,frame_length,F,offset8_flag) ; - stop_meas(beta_stats); - start_meas(ext_stats) ; + if (beta_stats) stop_meas(beta_stats); + if (ext_stats) start_meas(ext_stats) ; compute_ext8(alpha,beta,m11,m10,ext,systematic,frame_length) ; - stop_meas(ext_stats); + if (ext_stats) stop_meas(ext_stats); } @@ -165,7 +160,7 @@ void compute_gamma8(llr_t* m11,llr_t* m10,llr_t* systematic,channel_t* y_parity, #endif #ifdef DEBUG_LOGMAP - msg("compute_gamma, %p,%p,%p,%p,framelength %d\n",m11,m10,systematic,y_parity,frame_length); + printf("compute_gamma, %p,%p,%p,%p,framelength %d\n",m11,m10,systematic,y_parity,frame_length); #endif #if defined(__x86_64__) || defined(__i386__) @@ -493,6 +488,11 @@ void compute_beta8(llr_t* alpha,llr_t* beta,llr_t *m_11,llr_t* m_10,unsigned sho #endif + if (frame_length > 6144) { + LOG_E(PHY,"compute_beta: frame_length %d\n",frame_length); + return; + } + // we are supposed to run compute_alpha just before compute_beta // so the initial states of backward computation can be set from last value of alpha states (forward computation) @@ -512,9 +512,11 @@ void compute_beta8(llr_t* alpha,llr_t* beta,llr_t *m_11,llr_t* m_10,unsigned sho beta_ptr[6] = alpha128[6+(frame_length>>1)]; beta_ptr[7] = alpha128[7+(frame_length>>1)]; + int overlap = (frame_length>>4)> L ? (frame_length>>4)-L : 0 ; + for (rerun_flag=0, loopval=0; rerun_flag<2 ; - loopval=(frame_length>>4)-L,rerun_flag++) { + loopval=overlap,rerun_flag++) { if (offset8_flag==0) { // FIXME! beta0-beta7 are used uninitialized. FIXME! @@ -708,7 +710,7 @@ void compute_ext8(llr_t* alpha,llr_t* beta,llr_t* m_11,llr_t* m_10,llr_t* ext, l // #ifdef DEBUG_LOGMAP - msg("compute_ext, %p, %p, %p, %p, %p, %p ,framelength %d\n",alpha,beta,m_11,m_10,ext,systematic,frame_length); + printf("compute_ext, %p, %p, %p, %p, %p, %p ,framelength %d\n",alpha,beta,m_11,m_10,ext,systematic,frame_length); #endif alpha_ptr = alpha128; @@ -843,6 +845,10 @@ void free_td8(void) } } + + +extern RAN_CONTEXT_t RC; + void init_td8() { @@ -879,14 +885,14 @@ void init_td8() pi2tab8[ind][i] = j; // printf("pi2[%d] = %d\n",i,j); } - + for (i=0; i 3) { - msg("Illegal crc length!\n"); + printf("Illegal crc length!\n"); return 255; } - start_meas(init_stats); + if (init_stats) start_meas(init_stats); if ((n&15)>0) { @@ -976,7 +982,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y, for (iind=0; iind < 188 && f1f2mat[iind].nb_bits != n; iind++); if ( iind == 188 ) { - msg("Illegal frame length!\n"); + printf("Illegal frame length!\n"); return 255; } @@ -1306,7 +1312,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y, yp1[i] = *yp; yp++; #ifdef DEBUG_LOGMAP - msg("Term 1 (%d): %d %d\n",i,s[i],yp1[i]); + printf("Term 1 (%d): %d %d\n",i,s[i],yp1[i]); #endif //DEBUG_LOGMAP } @@ -1318,15 +1324,15 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y, yp2[i-16] = *yp; yp++; #ifdef DEBUG_LOGMAP - msg("Term 2 (%d): %d %d\n",i-16,s[i],yp2[i-16]); + printf("Term 2 (%d): %d %d\n",i-16,s[i],yp2[i-16]); #endif //DEBUG_LOGMAP } #ifdef DEBUG_LOGMAP - msg("\n"); + printf("\n"); #endif //DEBUG_LOGMAP - stop_meas(init_stats); + if (init_stats) stop_meas(init_stats); // do log_map from first parity bit @@ -1338,7 +1344,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y, printf("\n*******************ITERATION %d (n %d, n2 %d), ext %p\n\n",iteration_cnt,n,n2,ext); #endif //DEBUG_LOGMAP - start_meas(intl1_stats); + if (intl1_stats) start_meas(intl1_stats); pi4_p=pi4tab8[iind]; for (i=0; i<(n2>>4); i++) { // steady-state portion @@ -1379,7 +1385,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y, #endif } - stop_meas(intl1_stats); + if (intl1_stats) stop_meas(intl1_stats); // do log_map from second parity bit @@ -1484,7 +1490,7 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y, // Check if we decoded the block if (iteration_cnt>1) { - start_meas(intl2_stats); + if (intl2_stats) start_meas(intl2_stats); if ((n2&0x7f) == 0) { // n2 is a multiple of 128 bits @@ -1623,9 +1629,9 @@ unsigned char phy_threegpplte_turbo_decoder8(short *y, break; } - stop_meas(intl2_stats); + if (intl2_stats) stop_meas(intl2_stats); - if ((crc == oldcrc) && (crc!=0)) { + if (crc == oldcrc) { return(iteration_cnt); } } diff --git a/openair1/PHY/CODING/COPYING b/openair1/PHY/CODING/COPYING deleted file mode 100644 index 623b6258a1..0000000000 --- a/openair1/PHY/CODING/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - 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) - - 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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) year 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. diff --git a/openair1/PHY/CODING/Makefile.arm b/openair1/PHY/CODING/Makefile.arm index 07dbf55909..04598075e3 100644 --- a/openair1/PHY/CODING/Makefile.arm +++ b/openair1/PHY/CODING/Makefile.arm @@ -5,7 +5,7 @@ RATE12CC_SRC = ccoding_byte.c viterbi.c crc_byte.c all: 3gpplte_sse 3gpplte_sse: $(TURBO_SRC) - gcc -O3 -gdwarf-2 -mfloat-abi=hard -mfpu=neon -lm -lgcc -lrt ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DTC_MAIN -DNB_ANTENNAS_RX=1 -o 3gpplte_sse 3gpplte_sse.c -Wall -g -ggdb -DTC_MAIN + gcc -O3 -gdwarf-2 -mfloat-abi=hard -mfpu=neon -lm -lgcc -lrt ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DTC_MAIN -DNB_ANTENNAS_RX=1 -o 3gpplte_sse 3gpplte_sse.c -Wall -g -ggdb -DTC_MAIN diff --git a/openair1/PHY/CODING/TESTBENCH/COPYING b/openair1/PHY/CODING/TESTBENCH/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/CODING/TESTBENCH/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/CODING/TESTBENCH/Makefile b/openair1/PHY/CODING/TESTBENCH/Makefile index a8ddd1fcb5..030f19b47b 100644 --- a/openair1/PHY/CODING/TESTBENCH/Makefile +++ b/openair1/PHY/CODING/TESTBENCH/Makefile @@ -7,7 +7,7 @@ OPENAIR2_TOP = $(OPENAIR2_DIR) OPENAIR3 = $(OPENAIR3_DIR) -CFLAGS += -DNODE_RG -DUSER_MODE -DPC_TARGET -DNO_UL_REF -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DOPENAIR_LTE -DMAX_NUM_CCs=1 +CFLAGS += -DNODE_RG -DNO_UL_REF -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DOPENAIR_LTE -DMAX_NUM_CCs=1 ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES diff --git a/openair1/PHY/CODING/TESTBENCH/ltetest.c b/openair1/PHY/CODING/TESTBENCH/ltetest.c index b7b9fb4aab..77e1f3f14f 100644 --- a/openair1/PHY/CODING/TESTBENCH/ltetest.c +++ b/openair1/PHY/CODING/TESTBENCH/ltetest.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include @@ -263,6 +256,7 @@ int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, &PHY_vars_UE->lte_frame_parms, PHY_vars_UE->dlsch_ue[0][0], PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid], + frame, subframe, PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid, num_pdcch_symbols,1); diff --git a/openair1/PHY/CODING/TESTBENCH/pdcch_test.c b/openair1/PHY/CODING/TESTBENCH/pdcch_test.c index 84ed605411..9e055412f0 100644 --- a/openair1/PHY/CODING/TESTBENCH/pdcch_test.c +++ b/openair1/PHY/CODING/TESTBENCH/pdcch_test.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/PHY/CODING/TESTBENCH/viterbi_test.c b/openair1/PHY/CODING/TESTBENCH/viterbi_test.c index efc07820f3..385910f680 100644 --- a/openair1/PHY/CODING/TESTBENCH/viterbi_test.c +++ b/openair1/PHY/CODING/TESTBENCH/viterbi_test.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/PHY/CODING/ccoding_byte.c b/openair1/PHY/CODING/ccoding_byte.c old mode 100755 new mode 100644 index cd626a8553..8511a5ea0f --- a/openair1/PHY/CODING/ccoding_byte.c +++ b/openair1/PHY/CODING/ccoding_byte.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: ccoding_byte.c purpose: Encoding routines for implementing 802.11 convolutionally-coded waveforms author: raymond.knopp@eurecom.fr, based on similar code for 3GPP convolutional code (UMTS) by P. Humblet (2000) diff --git a/openair1/PHY/CODING/ccoding_byte_lte.c b/openair1/PHY/CODING/ccoding_byte_lte.c index 12271fdceb..6eb654827b 100644 --- a/openair1/PHY/CODING/ccoding_byte_lte.c +++ b/openair1/PHY/CODING/ccoding_byte_lte.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: ccoding_byte_lte.c purpose: Tail-biting convolutional code from 36-212, V8.6 2009-03. Includes CRC (8-UCI,16-DCI)and RNTI scrambling (DCI) author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c old mode 100755 new mode 100644 index e7ed05f411..5ec4fcaaa4 --- a/openair1/PHY/CODING/crc_byte.c +++ b/openair1/PHY/CODING/crc_byte.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: crc_byte.c purpose: generate 3GPP LTE CRCs. Byte-oriented implementation of CRC's author: raymond.knopp@eurecom.fr @@ -38,13 +31,6 @@ */ -#ifndef USER_MODE -#define __NO_VERSION__ - -#endif - -//#include "PHY/types.h" - #include "defs.h" diff --git a/openair1/PHY/CODING/defs.h b/openair1/PHY/CODING/defs.h index c0f6091dfd..80e28b1586 100644 --- a/openair1/PHY/CODING/defs.h +++ b/openair1/PHY/CODING/defs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: PHY/CODING/defs.h purpose: Top-level definitions, data types and function prototypes for openairinterface coding blocks author: raymond.knopp@eurecom.fr @@ -36,11 +29,7 @@ #include -#ifndef NO_OPENAIR1 #include "PHY/defs.h" -#else -#include "PHY/TOOLS/time_meas.h" -#endif #define CRC24_A 0 #define CRC24_B 1 @@ -185,6 +174,7 @@ uint32_t generate_dummy_w_cc(uint32_t D, uint8_t *w); \param Qm modulation order (2,4,6) \param Nl number of layers (1,2) \param r segment number +\param nb_rb Number of PRBs \returns \f$E\f$, the number of coded bits per segment */ @@ -200,8 +190,7 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC, uint8_t Qm, uint8_t Nl, uint8_t r, - uint8_t nb_rb, - uint8_t m); + uint8_t nb_rb); /** \brief This is the LTE rate matching algorithm for Convolutionally-coded channels (e.g. BCH,DCI,UCI). It is taken directly from 36-212 (Rel 8 8.6, 2009-03), pages 16-18 ) diff --git a/openair1/PHY/CODING/extern.h b/openair1/PHY/CODING/extern.h index 0108dab386..9c58920a10 100644 --- a/openair1/PHY/CODING/extern.h +++ b/openair1/PHY/CODING/extern.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ extern unsigned short f1f2mat_old[2*188]; diff --git a/openair1/PHY/CODING/extern_3GPPinterleaver.h b/openair1/PHY/CODING/extern_3GPPinterleaver.h old mode 100755 new mode 100644 index bc521a59a3..007c1fecc3 --- a/openair1/PHY/CODING/extern_3GPPinterleaver.h +++ b/openair1/PHY/CODING/extern_3GPPinterleaver.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ typedef struct interleaver_codebook { unsigned long nb_bits; unsigned short f1; diff --git a/openair1/PHY/CODING/lte_interleaver.h b/openair1/PHY/CODING/lte_interleaver.h index 1199933a53..fbf26a8e1f 100644 --- a/openair1/PHY/CODING/lte_interleaver.h +++ b/openair1/PHY/CODING/lte_interleaver.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __LTE_INTERLEAVER_H #define __LTE_INTERLEAVER_H #define INCL_INTERLEAVE diff --git a/openair1/PHY/CODING/lte_interleaver2.h b/openair1/PHY/CODING/lte_interleaver2.h index 67b696a15f..60b2fa6d1f 100644 --- a/openair1/PHY/CODING/lte_interleaver2.h +++ b/openair1/PHY/CODING/lte_interleaver2.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ unsigned short f1f2mat_old[2*188] = {3, 10, 7, 12, 19, 42, diff --git a/openair1/PHY/CODING/lte_interleaver_inline.h b/openair1/PHY/CODING/lte_interleaver_inline.h index 5e71bd7081..bf560128f0 100644 --- a/openair1/PHY/CODING/lte_interleaver_inline.h +++ b/openair1/PHY/CODING/lte_interleaver_inline.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ extern unsigned int threegpplte_interleaver_output; extern unsigned int threegpplte_interleaver_tmp; diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c index 2dbf92d751..13870e3303 100644 --- a/openair1/PHY/CODING/lte_rate_matching.c +++ b/openair1/PHY/CODING/lte_rate_matching.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: lte_rate_matching.c purpose: Procedures for rate matching/interleaving for LTE (turbo-coded transport channels) (TX/RX) author: raymond.knopp@eurecom.fr @@ -53,7 +46,7 @@ uint32_t sub_block_interleaving_turbo(uint32_t D, uint8_t *d,uint8_t *w) { uint32_t RTC = (D>>5), ND, ND3; - uint32_t row,col,Kpi,index; + uint32_t row,col,Kpi; uint32_t index3,k,k2; #ifdef RM_DEBUG uint32_t nulled=0; @@ -84,7 +77,6 @@ uint32_t sub_block_interleaving_turbo(uint32_t D, uint8_t *d,uint8_t *w) #ifdef RM_DEBUG printf("Col %d\n",col); #endif - index = bitrev[col]; index3 = bitrev_x3[col];//3*index; for (row=0; row=(3*RTC<<5),"Exiting, RM condition (Ncb %d, Nir/C %d, Nsoft %d, Kw %d\n",Ncb,Nir/C,Nsoft,3*(RTC<<5)); + if (Ncb>(3*(RTC<<5))) + AssertFatal(1==0,"Exiting, RM condition (Ncb %d, RTC %d, Nir/C %d, Nsoft %d, Kw %d)\n",Ncb,RTC,Nir/C,Nsoft,3*(RTC<<5)); - + AssertFatal(Nl>0,"Nl is 0\n"); + AssertFatal(Qm>0,"Qm is 0\n"); Gp = G/Nl/Qm; GpmodC = Gp%C; @@ -730,6 +721,8 @@ int lte_rate_matching_turbo_rx(uint32_t RTC, Ncb = 3*(RTC<<5); } + AssertFatal(Nl>0,"Nl is 0\n"); + AssertFatal(Qm>0,"Qm is 0\n"); Gp = G/Nl/Qm; GpmodC = Gp%C; diff --git a/openair1/PHY/CODING/lte_segmentation.c b/openair1/PHY/CODING/lte_segmentation.c index a4409ee414..3ae65e2090 100644 --- a/openair1/PHY/CODING/lte_segmentation.c +++ b/openair1/PHY/CODING/lte_segmentation.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: lte_segmentation.c purpose: Procedures for transport block segmentation for LTE (turbo-coded transport channels) author: raymond.knopp@eurecom.fr @@ -67,7 +60,7 @@ int lte_segmentation(unsigned char *input_buffer, } if ((*C)>MAX_NUM_DLSCH_SEGMENTS) { - msg("lte_segmentation.c: too many segments %d\n",*C); + LOG_E(PHY,"lte_segmentation.c: too many segments %d, B %d, L %d, Bprime %d\n",*C,B,L,Bprime); return(-1); } @@ -113,7 +106,7 @@ int lte_segmentation(unsigned char *input_buffer, #endif *Kminus = (*Kplus - 64); } else { - msg("lte_segmentation.c: Illegal codeword size !!!\n"); + printf("lte_segmentation.c: Illegal codeword size !!!\n"); return(-1); } @@ -130,6 +123,9 @@ int lte_segmentation(unsigned char *input_buffer, } + AssertFatal(Bprime <= (*Cplus)*(*Kplus) + (*Cminus)*(*Kminus), + "Bprime %d < (*Cplus %d)*(*Kplus %d) + (*Cminus %d)*(*Kminus %d)\n", + Bprime,*Cplus,*Kplus,*Cminus,*Kminus); *F = ((*Cplus)*(*Kplus) + (*Cminus)*(*Kminus) - (Bprime)); #ifdef DEBUG_SEGMENTATION @@ -153,7 +149,7 @@ int lte_segmentation(unsigned char *input_buffer, while (k<((Kr - L)>>3)) { output_buffers[r][k] = input_buffer[s]; - // printf("encoding segment %d : byte %d => %d\n",r,k,input_buffer[s]); + // printf("encoding segment %d : byte %d (%d) => %d\n",r,k,Kr>>3,input_buffer[s]); k++; s++; } diff --git a/openair1/PHY/CODING/rate_matching.c b/openair1/PHY/CODING/rate_matching.c deleted file mode 100644 index c14f22e2ac..0000000000 --- a/openair1/PHY/CODING/rate_matching.c +++ /dev/null @@ -1,254 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifdef DEBUG -#include -#include -#include -#include -#endif - -#include "PHY/defs.h" - -//#define DEBUG_PHY 1 - -unsigned int ps0, ps1, ps2, pb; - -//---------------------------------------------- -// -/*!\brief Tausworthe Uniform Random Generator. This is based on the hardware implementation described in - Lee et al, "A Hardware Gaussian Noise Generator Usign the Box-Muller Method and its Error Analysis," IEEE Trans. on Computers, 2006. -*/ -// - -static inline void pset_taus_seed(unsigned int off) -{ - - - ps0 = (unsigned int)0x1e23d852 + (off<<4); - ps1 = (unsigned int)0x81f38a1c + (off<<4); - ps2 = (unsigned int)0xfe1a133e + (off<<4); - -} - -static inline unsigned int ptaus(void) -{ - - pb = (((ps0 << 13) ^ ps0) >> 19); - ps0 = (((ps0 & 0xFFFFFFFE) << 12)^ pb); - pb = (((ps1 << 2) ^ ps1) >> 25); - ps1 = (((ps1 & 0xFFFFFFF8) << 4)^ pb); - pb = (((ps2 << 3) ^ ps2) >> 11); - ps2 = (((ps2 & 0xFFFFFFF0) << 17)^ pb); - return ps0 ^ ps1 ^ ps2; -} - - -int rate_matching(unsigned int N_coded, - unsigned int N_input, - unsigned char *inPtr, - unsigned char N_bps, - unsigned int off) -{ - - - unsigned int i,j,U,Umod,rep_flag=0; - unsigned int N_coded2,N_input2,Mod_input2; - int N_punctured; - - if ((9*N_coded<(N_input<<2)) || (N_input<(N_coded>>1))) { - // check validity of parameters - // the first condition represents the case where the rate is greater than 2/3 - // the second condition represents the case where the rate is less than 1/4 - msg("[PHY][CODING] Rate matching parameter error (N_coded %d, N_input %d, N_bps %d), exiting\n",N_coded,N_input,N_bps); - return(-1); - } - - //initialize all bits as transmitted - for (i=0; i=N_input2); - - for (j=0; j>1))) { - // check validity of parameters - // the first condition represents the case where the rate is greater than 2/3 - // the second condition represents the case where the rate is less than 1/4 - msg("[PHY][CODING] Rate matching parameter error (N_coded %d, N_input %d), exiting\n",N_coded,N_input); - return(-1); - } - - //initialize all bits as transmitted - for (i=0; i=N_input); - - if (rep_flag == 0) - inPtr[Umod] &= 0x7f; // clear MSB to indicate bit is punctured - else - inPtr[Umod] |= 0xc0; // set MSB-1 to indicate bit is repeated - - - /* - #ifdef USER_MODE - #ifdef DEBUG_PHY - printf("rate_matching : i= %d, U = %d\n",i,Umod); - #endif - #endif - */ - i++; - } - - return(0); -} - - - -#ifdef MAIN -void main(int argc,char **argv) -{ - - unsigned char input[1024]; - - if (argc == 1) { - printf("Provide an input\n"); - exit(-1); - } - - memset(input,0,1024); - - rate_matching(4*157,4*256,input,atoi(argv[1]),0); -} -#endif diff --git a/openair1/PHY/CODING/scrambler.h b/openair1/PHY/CODING/scrambler.h old mode 100755 new mode 100644 index 3718d8b456..3c1b1de0a7 --- a/openair1/PHY/CODING/scrambler.h +++ b/openair1/PHY/CODING/scrambler.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ unsigned char scrambling_sequence[1024] = { 208, 127, diff --git a/openair1/PHY/CODING/vars.h b/openair1/PHY/CODING/vars.h index 98e63a43dc..944ea08d0c 100644 --- a/openair1/PHY/CODING/vars.h +++ b/openair1/PHY/CODING/vars.h @@ -1,30 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "lte_interleaver.h" #include "lte_interleaver2.h" diff --git a/openair1/PHY/CODING/viterbi.c b/openair1/PHY/CODING/viterbi.c old mode 100755 new mode 100644 index cacc9ab2ff..f44e2ebf8f --- a/openair1/PHY/CODING/viterbi.c +++ b/openair1/PHY/CODING/viterbi.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: viterbi.c purpose: SIMD Optimized 802.11/802.16 Viterbi Decoder author: raymond.knopp@eurecom.fr diff --git a/openair1/PHY/CODING/viterbi_lte.c b/openair1/PHY/CODING/viterbi_lte.c index f5a174e53e..5e11cb3453 100644 --- a/openair1/PHY/CODING/viterbi_lte.c +++ b/openair1/PHY/CODING/viterbi_lte.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: viterbit_lte.c purpose: SIMD optimized LTE Viterbi Decoder for rate 1/3 Tail-biting convolutional code. Performs two iterations of code. First pass does Viterbi with all initial partial metrics set to zero. Second pass does Viterbi @@ -35,10 +28,6 @@ date: 21.10.2009 */ -#ifdef USER_MODE -#include -#endif - #ifndef TEST_DEBUG #include "PHY/defs.h" #include "PHY/extern.h" @@ -133,7 +122,7 @@ void print_shorts(__m128i x,char *s) { } */ -#endif // USER_MODE +#endif // DEBUG_VITERBI diff --git a/openair1/PHY/COPYING b/openair1/PHY/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/INIT/COPYING b/openair1/PHY/INIT/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/INIT/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/INIT/README.txt b/openair1/PHY/INIT/README.txt index d40d0feecd..520e0acd4f 100644 --- a/openair1/PHY/INIT/README.txt +++ b/openair1/PHY/INIT/README.txt @@ -2,4 +2,6 @@ This directory contains files related to initialization of variables/structures init_top.c : initialize top-level variables and signal buffers, FFT twiddle factors, etc. lte_init.c : LTE specific initlization routines (DLSCH/ULSCH signal buffers for RX, data buffers for TX, etc.) -init.c : non-LTE initialization routines (to be removed) +lte_param_init.c: used only in unitary simulations. initializes the global variables eNB and UE. +lte_parms.c: contains init_frame_parms to initialize frame parameters structure + diff --git a/openair1/PHY/INIT/defs.h b/openair1/PHY/INIT/defs.h index f08ca678db..744fb3d3ce 100644 --- a/openair1/PHY/INIT/defs.h +++ b/openair1/PHY/INIT/defs.h @@ -1,62 +1,51 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __INIT_DEFS__H__ #define __INIT_DEFS__H__ #include "PHY/defs.h" -#ifdef OPENAIR_LTE + #include "SystemInformationBlockType2.h" //#include "RadioResourceConfigCommonSIB.h" #include "RadioResourceConfigDedicated.h" #include "TDD-Config.h" +#include "PHICH-Config.h" #include "MBSFN-SubframeConfigList.h" #include "MobilityControlInfo.h" -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) #include "SCellToAddMod-r10.h" #endif -#else - -/** -\fn int phy_init(unsigned char nb_antennas_tx) -\brief Allocate and Initialize the PHY variables after receiving static configuration -@param nb_antennas_tx Number of TX antennas -*/ -int phy_init(unsigned char nb_antennas_tx); -#endif - -#ifdef OPENAIR_LTE - /** @addtogroup _PHY_STRUCTURES_ * @{ */ +/*! +\fn int l1_top_init_eNB(void) +\brief Initialize north interface for L1 +@returns 0 on success + */ +int l1_north_init_eNB(void); + /*! \fn int phy_init_top(LTE_DL_FRAME_PARMS *frame_parms) \brief Allocate and Initialize the PHY variables after receiving static configuration @@ -67,7 +56,7 @@ int phy_init_top(LTE_DL_FRAME_PARMS *frame_parms); /*! -\brief Allocate and Initialize the PHY variables relevant to the LTE implementation. +\brief Allocate and Initialize the PHY variables relevant to the LTE ue signal buffers. \details Only a subset of phy_vars_ue is initialized. @param[out] phy_vars_ue Pointer to UE Variables @param nb_connected_eNB Number of eNB that UE can process in one PDSCH demodulation subframe @@ -76,16 +65,22 @@ int phy_init_top(LTE_DL_FRAME_PARMS *frame_parms); @returns -1 if any memory allocation failed @note The current implementation will never return -1, but segfault. */ -int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, - int nb_connected_eNB, - uint8_t abstraction_flag); +int init_lte_ue_signal(PHY_VARS_UE *phy_vars_ue, + int nb_connected_eNB, + uint8_t abstraction_flag); + +/*! +\brief Allocate and initialize the PHY variables releated to the transport channel buffers (UL/DL) +@param ue Pointer to UE L1 context +@param abstraction flag Indicates that abstraction is used in L1 +*/ +void init_lte_ue_transport(PHY_VARS_UE *ue,int absraction_flag); /*! \brief Allocate and initialize the PHY variables relevant to the LTE implementation (eNB). \details Only a subset of phy_vars_eNb is initialized. @param[out] phy_vars_eNb Pointer to eNB Variables @param is_secondary_eNb Flag to indicate this eNB gets synch from another -@param cooperation_flag 0 for no cooperation, 1 for Delay Diversity and 2 for Distributed Alamouti @param abstraction_flag 1 indicates memory should be allocated for abstracted MODEM @returns 0 on success @returns -1 if any memory allocation failed @@ -93,7 +88,6 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, */ int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNb, unsigned char is_secondary_eNb, - unsigned char cooperation_flag, unsigned char abstraction_flag); /** \brief Configure LTE_DL_FRAME_PARMS with components derived after initial synchronization (MIB decoding + primary/secondary synch). @@ -102,17 +96,20 @@ int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNb, @param N_RB_DL Number of DL resource blocks @param Nid_cell Cell ID @param Ncp Normal/Extended Prefix flag -@param frame_type FDD/TDD framing @param p_eNB Number of eNB TX antennas @param phich_config Pointer to PHICH_CONFIG_COMMON */ -void phy_config_mib(LTE_DL_FRAME_PARMS *lte_frame_parms, - uint8_t N_RB_DL, - uint8_t Nid_cell, - uint8_t Ncp, - uint8_t frame_type, - uint8_t p_eNB, - PHICH_CONFIG_COMMON *phich_config); +void phy_config_mib_eNB(int Mod_id, + int CC_id, + int eutra_band, + int N_RB_DL, + PHICH_Config_t *phich_config, + int Nid_cell, + int Ncp, + int p_eNB, + uint32_t dl_CarrierFreq, + uint32_t ul_CarrierFreq); + /** \brief Configure LTE_DL_FRAME_PARMS with components derived after reception of SIB1. @@ -227,7 +224,19 @@ void phy_config_dedicated_ue(module_id_t Mod_id, uint8_t CH_index, struct PhysicalConfigDedicated *physicalConfigDedicated); +/*! +\fn void phy_config_harq_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t CH_index, + uint16_t max_harq_tx) +\brief Configure UE UL max harq Tx. +\details Invoked upon reception of RRCConnectionSetup or RRCConnectionReconfiguration from eNB. +@param Mod_id Instance ID for eNB +@param CC_id Component Carrier index +@param CH_index Index of eNB for this configuration +@param max_harq_tx max harq tx information + */ +void phy_config_harq_ue(module_id_t Mod_id,int CC_id,uint8_t CH_index, + uint16_t max_harq_tx); /** \brief Configure UE MBSFN common parameters. \details Invoked upon reception of SIB13 from eNB. @@ -309,11 +318,24 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *phy_vars_eNB); int phy_init_secsys_eNB(PHY_VARS_eNB *phy_vars_eNb); -void phy_init_lte_top(LTE_DL_FRAME_PARMS *lte_frame_parms); +void init_lte_top(LTE_DL_FRAME_PARMS *lte_frame_parms); //void copy_lte_parms_to_phy_framing(LTE_DL_FRAME_PARMS *frame_parm, PHY_FRAMING *phy_framing); -#ifdef Rel10 +void lte_param_init(unsigned char N_tx_port_eNB, + unsigned char N_tx, + unsigned char N_rx, + unsigned char transmission_mode, + uint8_t extended_prefix_flag, + frame_t frame_type, + uint16_t Nid_cell, + uint8_t tdd_config, + uint8_t N_RB_DL, + uint8_t threequarter_fs, + uint8_t osf, + uint32_t perfect_ce); + +#if defined(Rel10) || defined(Rel14) void phy_config_dedicated_scell_ue(uint8_t Mod_id, uint8_t eNB_index, SCellToAddMod_r10_t *sCellToAddMod_r10, @@ -325,18 +347,30 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id, int CC_id); #endif -#endif + /*! !\fn void phy_cleanup(void) \brief Cleanup the PHY variables*/ void phy_cleanup(void); -#ifdef OPENAIR_LTE +void phy_config_request(PHY_Config_t *phy_config); + int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf); void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms); -#endif +void lte_param_init(unsigned char N_tx_port_eNB, + unsigned char N_tx_phy, + unsigned char N_rx, + unsigned char transmission_mode, + uint8_t extended_prefix_flag, + frame_t frame_type, + uint16_t Nid_cell, + uint8_t tdd_config, + uint8_t N_RB_DL, + uint8_t threequarter_fs, + uint8_t osf, + uint32_t perfect_ce); /** @} */ #endif diff --git a/openair1/PHY/INIT/extern.h b/openair1/PHY/INIT/extern.h index 5c046434e6..4690bba42e 100644 --- a/openair1/PHY/INIT/extern.h +++ b/openair1/PHY/INIT/extern.h @@ -1,28 +1,21 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ \ No newline at end of file diff --git a/openair1/PHY/INIT/init_top.c b/openair1/PHY/INIT/init_top.c old mode 100755 new mode 100644 index e0de14bbb8..fc2cebb79a --- a/openair1/PHY/INIT/init_top.c +++ b/openair1/PHY/INIT/init_top.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*!\brief Initilization and reconfiguration routines for LTE PHY */ #ifndef USER_MODE #define __NO_VERSION__ @@ -33,20 +26,44 @@ #include "defs.h" #include "PHY/extern.h" -#include "MAC_INTERFACE/extern.h" -//#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h" -/*! -* @addtogroup _PHY_STRUCTURES_ -* Memory Initializaion and Cleanup for LTE MODEM. -* @{ -\section _Memory_init_ Memory Initialization for LTE MODEM +void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms) +{ -*/ + crcTableInit(); -//#define DEBUG_PHY + ccodedot11_init(); + ccodedot11_init_inv(); + ccodelte_init(); + ccodelte_init_inv(); + + treillis_table_init(); + + phy_generate_viterbi_tables(); + phy_generate_viterbi_tables_lte(); + init_td8(); + init_td16(); +#ifdef __AVX2__ + init_td16avx2(); +#endif + lte_sync_time_init(frame_parms); + + generate_ul_ref_sigs(); + generate_ul_ref_sigs_rx(); + + generate_64qam_table(); + generate_16qam_table(); + generate_RIV_tables(); + + init_unscrambling_lut(); + init_scrambling_lut(); + //set_taus_seed(1328); + + +} /* * @}*/ + diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index 6a50c2d113..026bf95e76 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1,34 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifdef EXMIMO -#include "openair0_lib.h" -#endif #include "defs.h" #include "SCHED/defs.h" #include "PHY/extern.h" @@ -39,74 +29,303 @@ #include "LAYER2/MAC/extern.h" #include "MBSFN-SubframeConfigList.h" #include "UTIL/LOG/vcd_signal_dumper.h" -//#define DEBUG_PHY #include "assertions.h" #include -#ifdef EXMIMO -extern openair0_rf_map rf_map[MAX_NUM_CCs]; -#endif +extern uint32_t from_earfcn(int eutra_bandP,uint32_t dl_earfcn); +extern int32_t get_uldl_offset(int eutra_bandP); extern uint16_t prach_root_sequence_map0_3[838]; extern uint16_t prach_root_sequence_map4[138]; uint8_t dmrs1_tab[8] = {0,2,3,4,6,8,9,10}; -// FIXME not used anywhere -void phy_config_mib(LTE_DL_FRAME_PARMS *lte_frame_parms, - uint8_t N_RB_DL, - uint8_t Nid_cell, - uint8_t Ncp, - uint8_t frame_type, - uint8_t p_eNB, - PHICH_CONFIG_COMMON *phich_config) -{ - lte_frame_parms->N_RB_DL = N_RB_DL; - lte_frame_parms->Nid_cell = Nid_cell; - lte_frame_parms->nushift = Nid_cell%6; - lte_frame_parms->Ncp = Ncp; - lte_frame_parms->frame_type = frame_type; - lte_frame_parms->nb_antennas_tx_eNB = p_eNB; - lte_frame_parms->phich_config_common.phich_resource = phich_config->phich_resource; - lte_frame_parms->phich_config_common.phich_duration = phich_config->phich_duration; +int N_RB_DL_array[6] = {6,15,25,50,75,100}; + +int l1_north_init_eNB() { + + int i,j; + + if (RC.nb_L1_inst > 0 && RC.nb_L1_CC != NULL && RC.eNB != NULL) + { + AssertFatal(RC.nb_L1_inst>0,"nb_L1_inst=%d\n",RC.nb_L1_inst); + AssertFatal(RC.nb_L1_CC!=NULL,"nb_L1_CC is null\n"); + AssertFatal(RC.eNB!=NULL,"RC.eNB is null\n"); + + LOG_I(PHY,"%s() RC.nb_L1_inst:%d\n", __FUNCTION__, RC.nb_L1_inst); + + for (i=0;i0,"RC.nb_L1_CC[%d]=%d\n",i,RC.nb_L1_CC[i]); + + LOG_I(PHY,"%s() RC.nb_L1_CC[%d]:%d\n", __FUNCTION__, i, RC.nb_L1_CC[i]); + + for (j=0;jif_inst = IF_Module_init(i))<0) return(-1); + + LOG_I(PHY,"%s() RC.eNB[%d][%d] installing callbacks\n", __FUNCTION__, i, j); + + RC.eNB[i][j]->if_inst->PHY_config_req = phy_config_request; + RC.eNB[i][j]->if_inst->schedule_response = schedule_response; + } + } + } + else + { + LOG_I(PHY,"%s() Not installing PHY callbacks - RC.nb_L1_inst:%d RC.nb_L1_CC:%p RC.eNB:%p\n", __FUNCTION__, RC.nb_L1_inst, RC.nb_L1_CC, RC.eNB); + } + return(0); } -void phy_config_sib1_eNB(uint8_t Mod_id, - int CC_id, - TDD_Config_t *tdd_Config, - uint8_t SIwindowsize, - uint16_t SIPeriod) -{ - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms; +void phy_config_request(PHY_Config_t *phy_config) { - if (tdd_Config) { - lte_frame_parms->tdd_config = tdd_Config->subframeAssignment; - lte_frame_parms->tdd_config_S = tdd_Config->specialSubframePatterns; + uint8_t Mod_id = phy_config->Mod_id; + int CC_id = phy_config->CC_id; + nfapi_config_request_t *cfg = phy_config->cfg; + + + LTE_DL_FRAME_PARMS *fp; + PHICH_RESOURCE_t phich_resource_table[4]={oneSixth,half,one,two}; + int eutra_band = cfg->nfapi_config.rf_bands.rf_band[0]; + int dl_Bandwidth = cfg->rf_config.dl_channel_bandwidth.value; + int ul_Bandwidth = cfg->rf_config.ul_channel_bandwidth.value; + int Nid_cell = cfg->sch_config.physical_cell_id.value; + int Ncp = cfg->subframe_config.dl_cyclic_prefix_type.value; + int p_eNB = cfg->rf_config.tx_antenna_ports.value; + uint32_t dl_CarrierFreq = cfg->nfapi_config.earfcn.value; + + LOG_I(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d, N_RB_UL %d, Nid_cell %d,eNB_tx_antenna_ports %d,Ncp %d,DL freq %u,phich_config.resource %d, phich_config.duration %d)\n", + Mod_id, CC_id, eutra_band, dl_Bandwidth, ul_Bandwidth, Nid_cell, p_eNB,Ncp,dl_CarrierFreq, + cfg->phich_config.phich_resource.value, + cfg->phich_config.phich_duration.value); + + AssertFatal(RC.eNB != NULL, "PHY instance pointer doesn't exist\n"); + AssertFatal(RC.eNB[Mod_id] != NULL, "PHY instance %d doesn't exist\n",Mod_id); + AssertFatal(RC.eNB[Mod_id][CC_id] != NULL, "PHY instance %d, CCid %d doesn't exist\n",Mod_id,CC_id); + + + if (RC.eNB[Mod_id][CC_id]->configured == 1) + { + LOG_E(PHY,"Already eNB already configured, do nothing\n"); + return; } - lte_frame_parms->SIwindowsize = SIwindowsize; - lte_frame_parms->SIPeriod = SIPeriod; -} + RC.eNB[Mod_id][CC_id]->mac_enabled = 1; -void phy_config_sib1_ue(uint8_t Mod_id,int CC_id, - uint8_t CH_index, - TDD_Config_t *tdd_Config, - uint8_t SIwindowsize, - uint16_t SIperiod) -{ + fp = &RC.eNB[Mod_id][CC_id]->frame_parms; - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms; + fp->N_RB_DL = dl_Bandwidth; + fp->N_RB_UL = ul_Bandwidth; + fp->Nid_cell = Nid_cell; + fp->nushift = fp->Nid_cell%6; + fp->eutra_band = eutra_band; + fp->Ncp = Ncp; + fp->Ncp_UL = Ncp; + fp->nb_antenna_ports_eNB = p_eNB; - if (tdd_Config) { - lte_frame_parms->tdd_config = tdd_Config->subframeAssignment; - lte_frame_parms->tdd_config_S = tdd_Config->specialSubframePatterns; + fp->threequarter_fs = 0; + + AssertFatal(cfg->phich_config.phich_resource.value<4, "Illegal phich_Resource\n"); + + fp->phich_config_common.phich_resource = phich_resource_table[cfg->phich_config.phich_resource.value]; + fp->phich_config_common.phich_duration = cfg->phich_config.phich_duration.value; + // Note: "from_earfcn" has to be in a common library with MACRLC + fp->dl_CarrierFreq = from_earfcn(eutra_band,dl_CarrierFreq); + fp->ul_CarrierFreq = fp->dl_CarrierFreq - (get_uldl_offset(eutra_band)*100000); + + fp->tdd_config = 0; + fp->tdd_config_S = 0; + + if (fp->dl_CarrierFreq==fp->ul_CarrierFreq) + fp->frame_type = TDD; + else + fp->frame_type = FDD; + + init_frame_parms(fp,1); + init_lte_top(fp); + + if (cfg->subframe_config.duplex_mode.value == 0) { + fp->tdd_config = cfg->tdd_frame_structure_config.subframe_assignment.value; + fp->tdd_config_S = cfg->tdd_frame_structure_config.special_subframe_patterns.value; + fp->frame_type = TDD; + } + else { + fp->frame_type = FDD; } - lte_frame_parms->SIwindowsize = SIwindowsize; - lte_frame_parms->SIPeriod = SIperiod; + fp->prach_config_common.rootSequenceIndex = cfg->prach_config.root_sequence_index.value; + LOG_I(PHY,"prach_config_common.rootSequenceIndex = %d\n",cfg->prach_config.root_sequence_index.value); + + fp->prach_config_common.prach_Config_enabled=1; + + fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =cfg->prach_config.configuration_index.value; + LOG_I(PHY,"prach_config_common.prach_ConfigInfo.prach_ConfigIndex = %d\n",cfg->prach_config.configuration_index.value); + + fp->prach_config_common.prach_ConfigInfo.highSpeedFlag =cfg->prach_config.high_speed_flag.value; + LOG_I(PHY,"prach_config_common.prach_ConfigInfo.highSpeedFlag = %d\n",cfg->prach_config.high_speed_flag.value); + fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =cfg->prach_config.zero_correlation_zone_configuration.value; + LOG_I(PHY,"prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = %d\n",cfg->prach_config.zero_correlation_zone_configuration.value); + fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =cfg->prach_config.frequency_offset.value; + LOG_I(PHY,"prach_config_common.prach_ConfigInfo.prach_FreqOffset = %d\n",cfg->prach_config.frequency_offset.value); + + init_prach_tables(839); + compute_prach_seq(fp->prach_config_common.rootSequenceIndex, + fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, + fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig, + fp->prach_config_common.prach_ConfigInfo.highSpeedFlag, + fp->frame_type, + RC.eNB[Mod_id][CC_id]->X_u); + +#ifdef Rel14 + fp->prach_emtc_config_common.prach_Config_enabled=1; + + fp->prach_emtc_config_common.rootSequenceIndex = cfg->emtc_config.prach_catm_root_sequence_index.value; + + fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag = cfg->emtc_config.prach_catm_high_speed_flag.value; + fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = cfg->emtc_config.prach_catm_zero_correlation_zone_configuration.value; + + // CE Level 3 parameters + fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[3] = cfg->emtc_config.prach_ce_level_3_enable.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[3] = cfg->emtc_config.prach_ce_level_3_starting_subframe_periodicity.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[3] = cfg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt.value; + AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[3]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[3], + "prach_starting_subframe_periodicity[3] < prach_numPetitionPerPreambleAttempt[3]\n"); + + + fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3] = cfg->emtc_config.prach_ce_level_3_configuration_index.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[3] = cfg->emtc_config.prach_ce_level_3_frequency_offset.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[3] = cfg->emtc_config.prach_ce_level_3_hopping_enable.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[3] = cfg->emtc_config.prach_ce_level_3_hopping_offset.value; + if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[3] == 1) + compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex, + fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3], + fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig, + fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag, + fp->frame_type, + RC.eNB[Mod_id][CC_id]->X_u_br[3]); + + // CE Level 2 parameters + fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[2] = cfg->emtc_config.prach_ce_level_2_enable.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[2] = cfg->emtc_config.prach_ce_level_2_starting_subframe_periodicity.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[2] = cfg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt.value; + AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[2]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[2], + "prach_starting_subframe_periodicity[2] < prach_numPetitionPerPreambleAttempt[2]\n"); + fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[2] = cfg->emtc_config.prach_ce_level_2_configuration_index.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[2] = cfg->emtc_config.prach_ce_level_2_frequency_offset.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[2] = cfg->emtc_config.prach_ce_level_2_hopping_enable.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[2] = cfg->emtc_config.prach_ce_level_2_hopping_offset.value; + if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[2] == 1) + compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex, + fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3], + fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig, + fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag, + fp->frame_type, + RC.eNB[Mod_id][CC_id]->X_u_br[2]); + + // CE Level 1 parameters + fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[1] = cfg->emtc_config.prach_ce_level_1_enable.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[1] = cfg->emtc_config.prach_ce_level_1_starting_subframe_periodicity.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[1] = cfg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt.value; + AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[1]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[1], + "prach_starting_subframe_periodicity[1] < prach_numPetitionPerPreambleAttempt[1]\n"); + + fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[1] = cfg->emtc_config.prach_ce_level_1_configuration_index.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[1] = cfg->emtc_config.prach_ce_level_1_frequency_offset.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[1] = cfg->emtc_config.prach_ce_level_1_hopping_enable.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[1] = cfg->emtc_config.prach_ce_level_1_hopping_offset.value; + if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[1] == 1) + compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex, + fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3], + fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig, + fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag, + fp->frame_type, + RC.eNB[Mod_id][CC_id]->X_u_br[1]); + + // CE Level 0 parameters + fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[0] = cfg->emtc_config.prach_ce_level_0_enable.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[0] = cfg->emtc_config.prach_ce_level_0_starting_subframe_periodicity.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0] = cfg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt.value; + AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[0]>=fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0], + "prach_starting_subframe_periodicity[0] %d < prach_numPetitionPerPreambleAttempt[0] %d\n", + fp->prach_emtc_config_common.prach_ConfigInfo.prach_starting_subframe_periodicity[0], + fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0]); +#if 0 + AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0] > 0, + "prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0]==0\n"); +#else + LOG_E(PHY,"***DJP*** removed assert on preamble fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0]:%d expecting >0 %s:%d\n\n\n", fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[0], __FILE__, __LINE__); +#endif + fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[0] = cfg->emtc_config.prach_ce_level_0_configuration_index.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[0] = cfg->emtc_config.prach_ce_level_0_frequency_offset.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_enable[0] = cfg->emtc_config.prach_ce_level_0_hopping_enable.value; + fp->prach_emtc_config_common.prach_ConfigInfo.prach_hopping_offset[0] = cfg->emtc_config.prach_ce_level_0_hopping_offset.value; + if (fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[0] == 1) + compute_prach_seq(fp->prach_emtc_config_common.rootSequenceIndex, + fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[3], + fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig, + fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag, + fp->frame_type, + RC.eNB[Mod_id][CC_id]->X_u_br[0]); +#endif + + + + fp->pucch_config_common.deltaPUCCH_Shift = 1+cfg->pucch_config.delta_pucch_shift.value; + fp->pucch_config_common.nRB_CQI = cfg->pucch_config.n_cqi_rb.value; + fp->pucch_config_common.nCS_AN = cfg->pucch_config.n_an_cs.value; + fp->pucch_config_common.n1PUCCH_AN = cfg->pucch_config.n1_pucch_an.value; + + fp->pdsch_config_common.referenceSignalPower = cfg->rf_config.reference_signal_power.value; + fp->pdsch_config_common.p_b = cfg->subframe_config.pb.value; + + fp->pusch_config_common.n_SB = cfg->pusch_config.number_of_subbands.value; + LOG_I(PHY,"pusch_config_common.n_SB = %d\n",fp->pusch_config_common.n_SB ); + + fp->pusch_config_common.hoppingMode = cfg->pusch_config.hopping_mode.value; + LOG_I(PHY,"pusch_config_common.hoppingMode = %d\n",fp->pusch_config_common.hoppingMode); + + fp->pusch_config_common.pusch_HoppingOffset = cfg->pusch_config.hopping_offset.value; + LOG_I(PHY,"pusch_config_common.pusch_HoppingOffset = %d\n",fp->pusch_config_common.pusch_HoppingOffset); + + fp->pusch_config_common.enable64QAM = 0;//radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; + LOG_I(PHY,"pusch_config_common.enable64QAM = %d\n",fp->pusch_config_common.enable64QAM ); + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 0; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; + if (cfg->uplink_reference_signal_config.uplink_rs_hopping.value == 1) + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1; + if (cfg->uplink_reference_signal_config.uplink_rs_hopping.value == 2) + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 1; + LOG_I(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = cfg->uplink_reference_signal_config.group_assignment.value; + LOG_I(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); + + LOG_I(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); + + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[cfg->uplink_reference_signal_config.cyclic_shift_1_for_drms.value]; + LOG_I(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift); + + init_ul_hopping(fp); + + fp->soundingrs_ul_config_common.enabled_flag = 0;// 1; Don't know how to turn this off in NFAPI + fp->soundingrs_ul_config_common.srs_BandwidthConfig = cfg->srs_config.bandwidth_configuration.value; + fp->soundingrs_ul_config_common.srs_SubframeConfig = cfg->srs_config.srs_subframe_configuration.value; + fp->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = cfg->srs_config.srs_acknack_srs_simultaneous_transmission.value; + fp->soundingrs_ul_config_common.srs_MaxUpPts = cfg->srs_config.max_up_pts.value; + + fp->num_MBSFN_config = 0; + + init_ncs_cell(fp,RC.eNB[Mod_id][CC_id]->ncs_cell); + + + init_ul_hopping(fp); + RC.eNB[Mod_id][CC_id]->configured = 1; + LOG_I(PHY,"eNB %d/%d configured\n",Mod_id,CC_id); } +/* void phy_config_sib2_eNB(uint8_t Mod_id, int CC_id, RadioResourceConfigCommonSIB_t *radioResourceConfigCommon, @@ -116,325 +335,194 @@ void phy_config_sib2_eNB(uint8_t Mod_id, struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList) { - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms; - //LTE_eNB_UE_stats *eNB_UE_stats = PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats; - //int32_t rx_total_gain_eNB_dB = PHY_vars_eNB_g[Mod_id][CC_id]->rx_total_gain_eNB_dB; + LTE_DL_FRAME_PARMS *fp = &RC.eNB[Mod_id][CC_id]->frame_parms; + //LTE_eNB_UE_stats *eNB_UE_stats = RC.eNB[Mod_id][CC_id].eNB_UE_stats; + //int32_t rx_total_gain_eNB_dB = RC.eNB[Mod_id][CC_id].rx_total_gain_eNB_dB; int i; - LOG_D(PHY,"[eNB%d] CCid %d Frame %d: Applying radioResourceConfigCommon\n",Mod_id,CC_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc[8].frame_tx); + LOG_I(PHY,"[eNB%d] CCid %d: Applying radioResourceConfigCommon\n",Mod_id,CC_id); - lte_frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; - LOG_D(PHY,"prach_config_common.rootSequenceIndex = %d\n",lte_frame_parms->prach_config_common.rootSequenceIndex ); - lte_frame_parms->prach_config_common.prach_Config_enabled=1; + fp->prach_config_common.rootSequenceIndex = radioResourceConfigCommon->prach_Config.rootSequenceIndex; + LOG_D(PHY,"prach_config_common.rootSequenceIndex = %d\n",fp->prach_config_common.rootSequenceIndex ); - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_ConfigIndex = %d\n",lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex); + fp->prach_config_common.prach_Config_enabled=1; - lte_frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.highSpeedFlag = %d\n",lte_frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag); - lte_frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = %d\n",lte_frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig); - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; - LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_FreqOffset = %d\n",lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset); - compute_prach_seq(<e_frame_parms->prach_config_common,lte_frame_parms->frame_type, - PHY_vars_eNB_g[Mod_id][CC_id]->X_u); + fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_ConfigIndex = %d\n",fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex); - lte_frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; - lte_frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; - lte_frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; - lte_frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; + fp->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.highSpeedFlag = %d\n",fp->prach_config_common.prach_ConfigInfo.highSpeedFlag); + fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = %d\n",fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig); + fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; + LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_FreqOffset = %d\n",fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset); + + init_prach_tables(839); + compute_prach_seq(&fp->prach_config_common,fp->frame_type, + RC.eNB[Mod_id][CC_id]->X_u); + + fp->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; + fp->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; + fp->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; + fp->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; - lte_frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; - lte_frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; + fp->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; + fp->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; - lte_frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; - LOG_D(PHY,"pusch_config_common.n_SB = %d\n",lte_frame_parms->pusch_config_common.n_SB ); + fp->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; + LOG_D(PHY,"pusch_config_common.n_SB = %d\n",fp->pusch_config_common.n_SB ); - lte_frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; - LOG_D(PHY,"pusch_config_common.hoppingMode = %d\n",lte_frame_parms->pusch_config_common.hoppingMode); + fp->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; + LOG_D(PHY,"pusch_config_common.hoppingMode = %d\n",fp->pusch_config_common.hoppingMode); - lte_frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; - LOG_D(PHY,"pusch_config_common.pusch_HoppingOffset = %d\n",lte_frame_parms->pusch_config_common.pusch_HoppingOffset); + fp->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; + LOG_D(PHY,"pusch_config_common.pusch_HoppingOffset = %d\n",fp->pusch_config_common.pusch_HoppingOffset); - lte_frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; - LOG_D(PHY,"pusch_config_common.enable64QAM = %d\n",lte_frame_parms->pusch_config_common.enable64QAM ); + fp->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; + LOG_D(PHY,"pusch_config_common.enable64QAM = %d\n",fp->pusch_config_common.enable64QAM ); - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = %d\n",lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = %d\n",lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = %d\n",lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; - LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = %d\n",lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift); + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; + LOG_D(PHY,"pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = %d\n",fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift); - init_ul_hopping(lte_frame_parms); + init_ul_hopping(fp); - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 0; + fp->soundingrs_ul_config_common.enabled_flag = 0; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.present==SoundingRS_UL_ConfigCommon_PR_setup) { - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 1; - lte_frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; - lte_frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; - lte_frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; + fp->soundingrs_ul_config_common.enabled_flag = 1; + fp->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; + fp->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; + fp->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts) - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; + fp->soundingrs_ul_config_common.srs_MaxUpPts = 1; else - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; + fp->soundingrs_ul_config_common.srs_MaxUpPts = 0; } - lte_frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; - lte_frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; - lte_frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; - lte_frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; + fp->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; + fp->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; + fp->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; + fp->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; - lte_frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; + fp->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; // Now configure some of the Physical Channels // PUCCH - init_ncs_cell(lte_frame_parms,PHY_vars_eNB_g[Mod_id][CC_id]->ncs_cell); - - init_ul_hopping(lte_frame_parms); + init_ncs_cell(fp,RC.eNB[Mod_id][CC_id]->ncs_cell); + init_ul_hopping(fp); // MBSFN if (mbsfn_SubframeConfigList != NULL) { - lte_frame_parms->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; + fp->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; for (i=0; ilist.count; i++) { - lte_frame_parms->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; - lte_frame_parms->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; + fp->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; + fp->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { - lte_frame_parms->MBSFN_config[i].fourFrames_flag = 0; - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration - LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); + fp->MBSFN_config[i].fourFrames_flag = 0; + fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration + LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i, + fp->MBSFN_config[i].mbsfn_SubframeConfig); } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration - lte_frame_parms->MBSFN_config[i].fourFrames_flag = 1; - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = + fp->MBSFN_config[i].fourFrames_flag = 1; + fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)| (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16); - LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); + LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i, + fp->MBSFN_config[i].mbsfn_SubframeConfig); } } } else - lte_frame_parms->num_MBSFN_config = 0; + fp->num_MBSFN_config = 0; + + // } - - -void phy_config_sib2_ue(uint8_t Mod_id,int CC_id, - uint8_t CH_index, - RadioResourceConfigCommonSIB_t *radioResourceConfigCommon, - ARFCN_ValueEUTRA_t *ul_CarrierFreq, - long *ul_Bandwidth, - AdditionalSpectrumEmission_t *additionalSpectrumEmission, - struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList) -{ - - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms; - int i; - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_IN); - - LOG_I(PHY,"[UE%d] Frame %d: Applying radioResourceConfigCommon from eNB%d\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,CH_index); - - lte_frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; - - lte_frame_parms->prach_config_common.prach_Config_enabled=1; - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; - lte_frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; - lte_frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; - - compute_prach_seq(<e_frame_parms->prach_config_common,lte_frame_parms->frame_type,PHY_vars_UE_g[Mod_id][CC_id]->X_u); - - - - lte_frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; - lte_frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; - lte_frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; - lte_frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; - - - - lte_frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; - lte_frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; - - - lte_frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; - lte_frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; - lte_frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; - lte_frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; - - - init_ul_hopping(lte_frame_parms); - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 0; - - if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.present==SoundingRS_UL_ConfigCommon_PR_setup) { - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 1; - lte_frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; - lte_frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; - lte_frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; - - if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts) - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; - else - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; - } - - - - lte_frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; - lte_frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; - lte_frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; - lte_frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; - - lte_frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; - - // Now configure some of the Physical Channels - - // PUCCH - init_ncs_cell(lte_frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell); - - init_ul_hopping(lte_frame_parms); - - - // MBSFN - - if (mbsfn_SubframeConfigList != NULL) { - lte_frame_parms->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; - - for (i=0; ilist.count; i++) { - lte_frame_parms->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; - lte_frame_parms->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; - - if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { - lte_frame_parms->MBSFN_config[i].fourFrames_flag = 0; - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration - LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); - } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration - lte_frame_parms->MBSFN_config[i].fourFrames_flag = 1; - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig = - mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]| - (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)| - (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16); - - LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %ld\n", i, - lte_frame_parms->MBSFN_config[i].mbsfn_SubframeConfig); - } - } - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_OUT); - -} - -void phy_config_sib13_ue(uint8_t Mod_id,int CC_id,uint8_t CH_index,int mbsfn_Area_idx, - long mbsfn_AreaId_r9) -{ - - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms; - - - LOG_I(PHY,"[UE%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,mbsfn_AreaId_r9,mbsfn_Area_idx); - - if (mbsfn_Area_idx == 0) { - lte_frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; - LOG_N(PHY,"Fix me: only called when mbsfn_Area_idx == 0)\n"); - } - - lte_gold_mbsfn(lte_frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_mbsfn_table,lte_frame_parms->Nid_cell_mbsfn); - -} - +*/ void phy_config_sib13_eNB(uint8_t Mod_id,int CC_id,int mbsfn_Area_idx, long mbsfn_AreaId_r9) { - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms; + LTE_DL_FRAME_PARMS *fp = &RC.eNB[Mod_id][CC_id]->frame_parms; - LOG_I(PHY,"[eNB%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc[8].frame_tx,mbsfn_AreaId_r9,mbsfn_Area_idx); + LOG_I(PHY,"[eNB%d] Applying MBSFN_Area_id %ld for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx); if (mbsfn_Area_idx == 0) { - lte_frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; + fp->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; LOG_N(PHY,"Fix me: only called when mbsfn_Area_idx == 0)\n"); } - lte_gold_mbsfn(lte_frame_parms,PHY_vars_eNB_g[Mod_id][CC_id]->lte_gold_mbsfn_table,lte_frame_parms->Nid_cell_mbsfn); + lte_gold_mbsfn(fp,RC.eNB[Mod_id][CC_id]->lte_gold_mbsfn_table,fp->Nid_cell_mbsfn); } -void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *phy_vars_eNB) +void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *eNB) { uint8_t UE_id; struct PhysicalConfigDedicated *physicalConfigDedicated; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; for (UE_id=0; UE_idphysicalConfigDedicated[UE_id]; + physicalConfigDedicated = eNB->physicalConfigDedicated[UE_id]; if (physicalConfigDedicated != NULL) { - LOG_I(PHY,"[eNB %d] Frame %d: Sent physicalConfigDedicated=%p for UE %d\n",phy_vars_eNB->Mod_id, phy_vars_eNB->proc[8].frame_tx,physicalConfigDedicated,UE_id); + LOG_I(PHY,"[eNB %d] Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id,physicalConfigDedicated,UE_id); LOG_D(PHY,"------------------------------------------------------------------------\n"); if (physicalConfigDedicated->pdsch_ConfigDedicated) { - phy_vars_eNB->pdsch_config_dedicated[UE_id].p_a=physicalConfigDedicated->pdsch_ConfigDedicated->p_a; - LOG_D(PHY,"pdsch_config_dedicated.p_a %d\n",phy_vars_eNB->pdsch_config_dedicated[UE_id].p_a); + eNB->pdsch_config_dedicated[UE_id].p_a=physicalConfigDedicated->pdsch_ConfigDedicated->p_a; + LOG_D(PHY,"pdsch_config_dedicated.p_a %d\n",eNB->pdsch_config_dedicated[UE_id].p_a); LOG_D(PHY,"\n"); } if (physicalConfigDedicated->pucch_ConfigDedicated) { if (physicalConfigDedicated->pucch_ConfigDedicated->ackNackRepetition.present==PUCCH_ConfigDedicated__ackNackRepetition_PR_release) - phy_vars_eNB->pucch_config_dedicated[UE_id].ackNackRepetition=0; + eNB->pucch_config_dedicated[UE_id].ackNackRepetition=0; else { - phy_vars_eNB->pucch_config_dedicated[UE_id].ackNackRepetition=1; + eNB->pucch_config_dedicated[UE_id].ackNackRepetition=1; } - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = multiplexing; + if (fp->frame_type == FDD) { + eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = multiplexing; } else { if (physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode) - phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = *physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode; + eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = *physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode; else - phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = bundling; + eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode = bundling; } - if ( phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == multiplexing) + if ( eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == multiplexing) LOG_D(PHY,"pucch_config_dedicated.tdd_AckNackFeedbackMode = multiplexing\n"); else LOG_D(PHY,"pucch_config_dedicated.tdd_AckNackFeedbackMode = bundling\n"); @@ -442,13 +530,13 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *phy_vars_eNB) } if (physicalConfigDedicated->pusch_ConfigDedicated) { - phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_ACK_Index; - phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index; - phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index; + eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_ACK_Index; + eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index; + eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index; - LOG_D(PHY,"pusch_config_dedicated.betaOffset_ACK_Index %d\n",phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index); - LOG_D(PHY,"pusch_config_dedicated.betaOffset_RI_Index %d\n",phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index); - LOG_D(PHY,"pusch_config_dedicated.betaOffset_CQI_Index %d\n",phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index); + LOG_E(PHY,"pusch_config_dedicated.betaOffset_ACK_Index %d\n",eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index); + LOG_E(PHY,"pusch_config_dedicated.betaOffset_RI_Index %d\n",eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index); + LOG_E(PHY,"pusch_config_dedicated.betaOffset_CQI_Index %d\n",eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index); LOG_D(PHY,"\n"); @@ -456,1018 +544,371 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *phy_vars_eNB) if (physicalConfigDedicated->uplinkPowerControlDedicated) { - phy_vars_eNB->ul_power_control_dedicated[UE_id].p0_UE_PUSCH = physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUSCH; - phy_vars_eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled= physicalConfigDedicated->uplinkPowerControlDedicated->deltaMCS_Enabled; - phy_vars_eNB->ul_power_control_dedicated[UE_id].accumulationEnabled= physicalConfigDedicated->uplinkPowerControlDedicated->accumulationEnabled; - phy_vars_eNB->ul_power_control_dedicated[UE_id].p0_UE_PUCCH= physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUCCH; - phy_vars_eNB->ul_power_control_dedicated[UE_id].pSRS_Offset= physicalConfigDedicated->uplinkPowerControlDedicated->pSRS_Offset; - phy_vars_eNB->ul_power_control_dedicated[UE_id].filterCoefficient= *physicalConfigDedicated->uplinkPowerControlDedicated->filterCoefficient; - LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUSCH %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].p0_UE_PUSCH); - LOG_D(PHY,"ul_power_control_dedicated.deltaMCS_Enabled %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled); - LOG_D(PHY,"ul_power_control_dedicated.accumulationEnabled %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].accumulationEnabled); - LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUCCH %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].p0_UE_PUCCH); - LOG_D(PHY,"ul_power_control_dedicated.pSRS_Offset %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].pSRS_Offset); - LOG_D(PHY,"ul_power_control_dedicated.filterCoefficient %d\n",phy_vars_eNB->ul_power_control_dedicated[UE_id].filterCoefficient); + eNB->ul_power_control_dedicated[UE_id].p0_UE_PUSCH = physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUSCH; + eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled= physicalConfigDedicated->uplinkPowerControlDedicated->deltaMCS_Enabled; + eNB->ul_power_control_dedicated[UE_id].accumulationEnabled= physicalConfigDedicated->uplinkPowerControlDedicated->accumulationEnabled; + eNB->ul_power_control_dedicated[UE_id].p0_UE_PUCCH= physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUCCH; + eNB->ul_power_control_dedicated[UE_id].pSRS_Offset= physicalConfigDedicated->uplinkPowerControlDedicated->pSRS_Offset; + eNB->ul_power_control_dedicated[UE_id].filterCoefficient= *physicalConfigDedicated->uplinkPowerControlDedicated->filterCoefficient; + LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUSCH %d\n",eNB->ul_power_control_dedicated[UE_id].p0_UE_PUSCH); + LOG_D(PHY,"ul_power_control_dedicated.deltaMCS_Enabled %d\n",eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled); + LOG_D(PHY,"ul_power_control_dedicated.accumulationEnabled %d\n",eNB->ul_power_control_dedicated[UE_id].accumulationEnabled); + LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUCCH %d\n",eNB->ul_power_control_dedicated[UE_id].p0_UE_PUCCH); + LOG_D(PHY,"ul_power_control_dedicated.pSRS_Offset %d\n",eNB->ul_power_control_dedicated[UE_id].pSRS_Offset); + LOG_D(PHY,"ul_power_control_dedicated.filterCoefficient %d\n",eNB->ul_power_control_dedicated[UE_id].filterCoefficient); LOG_D(PHY,"\n"); } if (physicalConfigDedicated->antennaInfo) { - phy_vars_eNB->transmission_mode[UE_id] = 1+(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode); - LOG_D(PHY,"Transmission Mode %d\n",phy_vars_eNB->transmission_mode[UE_id]); + eNB->transmission_mode[UE_id] = 1+(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode); + LOG_D(PHY,"Transmission Mode (phy_config_dedicated_eNB_step2) %d\n",eNB->transmission_mode[UE_id]); LOG_D(PHY,"\n"); } if (physicalConfigDedicated->schedulingRequestConfig) { if (physicalConfigDedicated->schedulingRequestConfig->present == SchedulingRequestConfig_PR_setup) { - phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex = physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex; - phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex=physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_ConfigIndex; - phy_vars_eNB->scheduling_request_config[UE_id].dsr_TransMax=physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax; + eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex = physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex; + eNB->scheduling_request_config[UE_id].sr_ConfigIndex=physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_ConfigIndex; + eNB->scheduling_request_config[UE_id].dsr_TransMax=physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax; - LOG_D(PHY,"scheduling_request_config.sr_PUCCH_ResourceIndex %d\n",phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); - LOG_D(PHY,"scheduling_request_config.sr_ConfigIndex %d\n",phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex); - LOG_D(PHY,"scheduling_request_config.dsr_TransMax %d\n",phy_vars_eNB->scheduling_request_config[UE_id].dsr_TransMax); + LOG_D(PHY,"scheduling_request_config.sr_PUCCH_ResourceIndex %d\n",eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); + LOG_D(PHY,"scheduling_request_config.sr_ConfigIndex %d\n",eNB->scheduling_request_config[UE_id].sr_ConfigIndex); + LOG_D(PHY,"scheduling_request_config.dsr_TransMax %d\n",eNB->scheduling_request_config[UE_id].dsr_TransMax); } LOG_D(PHY,"------------------------------------------------------------\n"); } - phy_vars_eNB->physicalConfigDedicated[UE_id] = NULL; + if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated) { + if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) { + + eNB->soundingrs_ul_config_dedicated[UE_id].srsConfigDedicatedSetup = 1; + eNB->soundingrs_ul_config_dedicated[UE_id].duration = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.duration; + eNB->soundingrs_ul_config_dedicated[UE_id].cyclicShift = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift; + eNB->soundingrs_ul_config_dedicated[UE_id].freqDomainPosition = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition; + eNB->soundingrs_ul_config_dedicated[UE_id].srs_Bandwidth = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth; + eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex; + eNB->soundingrs_ul_config_dedicated[UE_id].srs_HoppingBandwidth = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth; + eNB->soundingrs_ul_config_dedicated[UE_id].transmissionComb = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb; + + + LOG_D(PHY,"soundingrs_ul_config_dedicated.srs_ConfigIndex %d\n",eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex); + + } + + LOG_D(PHY,"------------------------------------------------------------\n"); + + } + + eNB->physicalConfigDedicated[UE_id] = NULL; } } } /* - * Configures UE MAC and PHY with radioResourceCommon received in mobilityControlInfo IE during Handover - */ -void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, MobilityControlInfo_t *mobilityControlInfo, uint8_t ho_failed) -{ - - if(mobilityControlInfo!=NULL) { - RadioResourceConfigCommon_t *radioResourceConfigCommon = &mobilityControlInfo->radioResourceConfigCommon; - LOG_I(PHY,"radioResourceConfigCommon %p\n", radioResourceConfigCommon); - memcpy((void *)&PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms_before_ho, - (void *)&PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms, - sizeof(LTE_DL_FRAME_PARMS)); - PHY_vars_UE_g[Mod_id][CC_id]->ho_triggered = 1; - //PHY_vars_UE_g[UE_id]->UE_mode[0] = PRACH; - - LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms; - // int N_ZC; - // uint8_t prach_fmt; - // int u; - - LOG_I(PHY,"[UE%d] Frame %d: Handover triggered: Applying radioResourceConfigCommon from eNB %d\n", - Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,eNB_id); - - lte_frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; - lte_frame_parms->prach_config_common.prach_Config_enabled=1; - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex; - lte_frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->highSpeedFlag; - lte_frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->zeroCorrelationZoneConfig; - lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_FreqOffset; - - // prach_fmt = get_prach_fmt(radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex,lte_frame_parms->frame_type); - // N_ZC = (prach_fmt <4)?839:139; - // u = (prach_fmt < 4) ? prach_root_sequence_map0_3[lte_frame_parms->prach_config_common.rootSequenceIndex] : - // prach_root_sequence_map4[lte_frame_parms->prach_config_common.rootSequenceIndex]; - - //compute_prach_seq(u,N_ZC, PHY_vars_UE_g[Mod_id]->X_u); - compute_prach_seq(&PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms.prach_config_common, - lte_frame_parms->frame_type, - PHY_vars_UE_g[Mod_id][CC_id]->X_u); - - - lte_frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon->deltaPUCCH_Shift; - lte_frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon->nRB_CQI; - lte_frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon->nCS_AN; - lte_frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon->n1PUCCH_AN; - lte_frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon->referenceSignalPower; - lte_frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon->p_b; - - - lte_frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; - lte_frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; - lte_frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; - lte_frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; - lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift; - - init_ul_hopping(lte_frame_parms); - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 0; - - if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon->present==SoundingRS_UL_ConfigCommon_PR_setup) { - lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 1; - lte_frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_BandwidthConfig; - lte_frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig; - lte_frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.ackNackSRS_SimultaneousTransmission; - - if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_MaxUpPts) - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1; - else - lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0; - } - - lte_frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUSCH; - lte_frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon->alpha; - lte_frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUCCH; - lte_frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaPreambleMsg3; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1b; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2a; - lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2b; - - lte_frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon->maxHARQ_Msg3Tx; - - // Now configure some of the Physical Channels - if (radioResourceConfigCommon->antennaInfoCommon) - lte_frame_parms->nb_antennas_tx = (1<antennaInfoCommon->antennaPortsCount); - else - lte_frame_parms->nb_antennas_tx = 1; - - //PHICH - if (radioResourceConfigCommon->antennaInfoCommon) { - lte_frame_parms->phich_config_common.phich_resource = radioResourceConfigCommon->phich_Config->phich_Resource; - lte_frame_parms->phich_config_common.phich_duration = radioResourceConfigCommon->phich_Config->phich_Duration; - } - - //Target CellId - lte_frame_parms->Nid_cell = mobilityControlInfo->targetPhysCellId; - lte_frame_parms->nushift = lte_frame_parms->Nid_cell%6; - - // PUCCH - init_ncs_cell(lte_frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell); - - init_ul_hopping(lte_frame_parms); - - // RNTI - - PHY_vars_UE_g[Mod_id][CC_id]->lte_ue_pdcch_vars[eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8); - - } - - if(ho_failed) { - LOG_D(PHY,"[UE%d] Handover failed, triggering RACH procedure\n",Mod_id); - memcpy((void *)&PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms,(void *)&PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms_before_ho, sizeof(LTE_DL_FRAME_PARMS)); - PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_id] = PRACH; - } -} - -void phy_config_meas_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,uint8_t n_adj_cells,unsigned int *adj_cell_id) -{ - - PHY_MEASUREMENTS *phy_meas = &PHY_vars_UE_g[Mod_id][CC_id]->PHY_measurements; - int i; - - LOG_I(PHY,"Configuring inter-cell measurements for %d cells, ids: \n",n_adj_cells); - - for (i=0; ilte_frame_parms,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_table[i+1],adj_cell_id[i]); - } - - phy_meas->n_adj_cells = n_adj_cells; - memcpy((void*)phy_meas->adj_cell_id,(void *)adj_cell_id,n_adj_cells*sizeof(unsigned int)); - -} - void phy_config_dedicated_eNB(uint8_t Mod_id, int CC_id, uint16_t rnti, struct PhysicalConfigDedicated *physicalConfigDedicated) { - PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[Mod_id][CC_id]; - int8_t UE_id = find_ue(rnti,phy_vars_eNB); + PHY_VARS_eNB *eNB = RC.eNB[Mod_id][CC_id]; + int8_t UE_id = find_ue(rnti,eNB); + int i; if (UE_id == -1) { - LOG_E( PHY, "[eNB %"PRIu8"] Frame %d: find_ue() returns -1\n", Mod_id, phy_vars_eNB->proc[8].frame_tx ); + LOG_E( PHY, "[eNB %"PRIu8"] find_ue() returns -1\n", Mod_id); return; } if (physicalConfigDedicated) { - phy_vars_eNB->physicalConfigDedicated[UE_id] = physicalConfigDedicated; + eNB->physicalConfigDedicated[UE_id] = physicalConfigDedicated; LOG_I(PHY,"phy_config_dedicated_eNB: physicalConfigDedicated=%p\n",physicalConfigDedicated); + + if (physicalConfigDedicated->antennaInfo) { + switch(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode) { + case AntennaInfoDedicated__transmissionMode_tm1: + eNB->transmission_mode[UE_id] = 1; + break; + case AntennaInfoDedicated__transmissionMode_tm2: + eNB->transmission_mode[UE_id] = 2; + break; + case AntennaInfoDedicated__transmissionMode_tm3: + eNB->transmission_mode[UE_id] = 3; + break; + case AntennaInfoDedicated__transmissionMode_tm4: + eNB->transmission_mode[UE_id] = 4; + break; + case AntennaInfoDedicated__transmissionMode_tm5: + eNB->transmission_mode[UE_id] = 5; + break; + case AntennaInfoDedicated__transmissionMode_tm6: + eNB->transmission_mode[UE_id] = 6; + break; + case AntennaInfoDedicated__transmissionMode_tm7: + lte_gold_ue_spec_port5(eNB->lte_gold_uespec_port5_table[0],eNB->frame_parms.Nid_cell,rnti); + + for (i=0;inum_RU;i++) eNB->RU_list[i]->do_precoding=1; + eNB->transmission_mode[UE_id] = 7; + break; + default: + LOG_E(PHY,"Unknown transmission mode!\n"); + break; + } + LOG_I(PHY,"Transmission Mode (phy_config_dedicated_eNB) %d\n",eNB->transmission_mode[UE_id]); + + } else { + LOG_D(PHY,"[eNB %d] : Received NULL radioResourceConfigDedicated->antennaInfo from eNB %d\n",Mod_id,UE_id); + } } else { - LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, phy_vars_eNB->proc[8].frame_tx,UE_id); + LOG_E(PHY,"[eNB %d] Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, UE_id); return; } } -#ifdef Rel10 -void phy_config_dedicated_scell_ue(uint8_t Mod_id, - uint8_t eNB_index, - SCellToAddMod_r10_t *sCellToAddMod_r10, - int CC_id) -{ +*/ -} +/* void phy_config_dedicated_scell_eNB(uint8_t Mod_id, uint16_t rnti, SCellToAddMod_r10_t *sCellToAddMod_r10, int CC_id) { - //PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[Mod_id][CC_id]; - uint8_t UE_id = find_ue(rnti,PHY_vars_eNB_g[Mod_id][0]); + + uint8_t UE_id = find_ue(rnti,RC.eNB[Mod_id][0]); struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10 = sCellToAddMod_r10->radioResourceConfigDedicatedSCell_r10->physicalConfigDedicatedSCell_r10; //struct RadioResourceConfigCommonSCell_r10 *physicalConfigCommonSCell_r10 = sCellToAddMod_r10->radioResourceConfigCommonSCell_r10; //PhysCellId_t physCellId_r10 = sCellToAddMod_r10->cellIdentification_r10->physCellId_r10; ARFCN_ValueEUTRA_t dl_CarrierFreq_r10 = sCellToAddMod_r10->cellIdentification_r10->dl_CarrierFreq_r10; uint32_t carrier_freq_local; -#ifdef EXMIMO -#ifdef DRIVER2013 - exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[rf_map[CC_id].card].exmimo_config_ptr; -#endif -#endif - if ((dl_CarrierFreq_r10>=36000) && (dl_CarrierFreq_r10<=36199)) { carrier_freq_local = 1900000000 + (dl_CarrierFreq_r10-36000)*100000; //band 33 from 3GPP 36.101 v 10.9 Table 5.7.3-1 - LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*phy_vars_eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); -#ifdef EXMIMO -#ifdef DRIVER2013 - //carrier_freq[CC_id] = carrier_freq_local; - //openair_daq_vars.freq_offset = -6540; - p_exmimo_config->rf.rf_freq_rx[rf_map[CC_id].chain] = carrier_freq_local;//+openair_daq_vars.freq_offset2; - p_exmimo_config->rf.rf_freq_tx[rf_map[CC_id].chain] = carrier_freq_local;//+openair_daq_vars.freq_offset2; - p_exmimo_config->rf.tx_gain[rf_map[CC_id].chain][0] = 25; - p_exmimo_config->rf.rf_vcocal[rf_map[CC_id].chain] = 910; - p_exmimo_config->rf.rf_local[rf_map[CC_id].chain] = 8255063; //this should be taken form calibration file - p_exmimo_config->rf.rffe_band_mode[rf_map[CC_id].chain] = B19G_TDD; -#endif -#endif + LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %ld) for UE %d\n",Mod_id, + //eNB->frame + 0, + CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); } else if ((dl_CarrierFreq_r10>=6150) && (dl_CarrierFreq_r10<=6449)) { carrier_freq_local = 832000000 + (dl_CarrierFreq_r10-6150)*100000; //band 20 from 3GPP 36.101 v 10.9 Table 5.7.3-1 // this is actually for the UL only, but we use it for DL too, since there is no TDD mode for this band - LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %d) for UE %d\n",Mod_id,/*phy_vars_eNB->frame*/0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); -#ifdef EXMIMO -#ifdef DRIVER2013 - //carrier_freq[CC_id] = carrier_freq_local; - //openair_daq_vars.freq_offset = -2000; - p_exmimo_config->rf.rf_freq_rx[rf_map[CC_id].chain] = carrier_freq_local;//+openair_daq_vars.freq_offset2; - p_exmimo_config->rf.rf_freq_tx[rf_map[CC_id].chain] = carrier_freq_local;//+openair_daq_vars.freq_offset2; - p_exmimo_config->rf.tx_gain[rf_map[CC_id].chain][0] = 10; - p_exmimo_config->rf.rf_vcocal[rf_map[CC_id].chain] = 2015; - p_exmimo_config->rf.rf_local[rf_map[CC_id].chain] = 8254992; //this should be taken form calibration file - p_exmimo_config->rf.rffe_band_mode[rf_map[CC_id].chain] = DD_TDD; -#endif -#endif + LOG_I(PHY,"[eNB %d] Frame %d: Configured SCell %d to frequency %d (ARFCN %ld) for UE %d\n",Mod_id, + //eNB->frame + 0,CC_id,carrier_freq_local,dl_CarrierFreq_r10,UE_id); } else { - LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %d of SCell %d for UE %d not supported\n",Mod_id,/*phy_vars_eNB->frame*/0,dl_CarrierFreq_r10,CC_id,UE_id); + LOG_E(PHY,"[eNB %d] Frame %d: ARFCN %ld of SCell %d for UE %d not supported\n",Mod_id, + //eNB->frame + 0,dl_CarrierFreq_r10,CC_id,UE_id); } if (physicalConfigDedicatedSCell_r10) { -//#warning " phy_vars_eNB->physicalConfigDedicatedSCell_r10 does not exist in phy_vars_eNB" - // phy_vars_eNB->physicalConfigDedicatedSCell_r10[UE_id] = physicalConfigDedicatedSCell_r10; - LOG_I(PHY,"[eNB %d] Frame %d: Configured phyConfigDedicatedSCell with CC_id %d for UE %d\n",Mod_id,/*phy_vars_eNB->frame*/0,CC_id,UE_id); +//#warning " eNB->physicalConfigDedicatedSCell_r10 does not exist in eNB" + // eNB->physicalConfigDedicatedSCell_r10[UE_id] = physicalConfigDedicatedSCell_r10; + LOG_I(PHY,"[eNB %d] Frame %d: Configured phyConfigDedicatedSCell with CC_id %d for UE %d\n",Mod_id, + //eNB->frame + 0,CC_id,UE_id); } else { - LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated (CC_id %d, UE %d)\n",Mod_id, /*phy_vars_eNB->frame*/0,CC_id,UE_id); + LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated (CC_id %d, UE %d)\n",Mod_id, + //eNB->frame + 0,CC_id,UE_id); return; } } -#endif - -void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t CH_index, - struct PhysicalConfigDedicated *physicalConfigDedicated ) -{ - - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; - - phy_vars_ue->total_TBS[CH_index]=0; - phy_vars_ue->total_TBS_last[CH_index]=0; - phy_vars_ue->bitrate[CH_index]=0; - phy_vars_ue->total_received_bits[CH_index]=0; - phy_vars_ue->dlsch_errors[CH_index]=0; - phy_vars_ue->dlsch_errors_last[CH_index]=0; - phy_vars_ue->dlsch_received[CH_index]=0; - phy_vars_ue->dlsch_received_last[CH_index]=0; - phy_vars_ue->dlsch_fer[CH_index]=0; +*/ - if (physicalConfigDedicated) { - LOG_D(PHY,"[UE %d] Frame %d: Received physicalConfigDedicated from eNB %d\n",Mod_id, phy_vars_ue->frame_rx,CH_index); - LOG_D(PHY,"------------------------------------------------------------------------\n"); - - if (physicalConfigDedicated->pdsch_ConfigDedicated) { - phy_vars_ue->pdsch_config_dedicated[CH_index].p_a=physicalConfigDedicated->pdsch_ConfigDedicated->p_a; - LOG_D(PHY,"pdsch_config_dedicated.p_a %d\n",phy_vars_ue->pdsch_config_dedicated[CH_index].p_a); - LOG_D(PHY,"\n"); - } - - if (physicalConfigDedicated->pucch_ConfigDedicated) { - if (physicalConfigDedicated->pucch_ConfigDedicated->ackNackRepetition.present==PUCCH_ConfigDedicated__ackNackRepetition_PR_release) - phy_vars_ue->pucch_config_dedicated[CH_index].ackNackRepetition=0; - else { - phy_vars_ue->pucch_config_dedicated[CH_index].ackNackRepetition=1; - } - - if (physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode) - phy_vars_ue->pucch_config_dedicated[CH_index].tdd_AckNackFeedbackMode = *physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode; - else - phy_vars_ue->pucch_config_dedicated[CH_index].tdd_AckNackFeedbackMode = bundling; - - if ( phy_vars_ue->pucch_config_dedicated[CH_index].tdd_AckNackFeedbackMode == multiplexing) - LOG_D(PHY,"pucch_config_dedicated.tdd_AckNackFeedbackMode = multiplexing\n"); - else - LOG_D(PHY,"pucch_config_dedicated.tdd_AckNackFeedbackMode = bundling\n"); - } - - if (physicalConfigDedicated->pusch_ConfigDedicated) { - phy_vars_ue->pusch_config_dedicated[CH_index].betaOffset_ACK_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_ACK_Index; - phy_vars_ue->pusch_config_dedicated[CH_index].betaOffset_RI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index; - phy_vars_ue->pusch_config_dedicated[CH_index].betaOffset_CQI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index; - - - LOG_D(PHY,"pusch_config_dedicated.betaOffset_ACK_Index %d\n",phy_vars_ue->pusch_config_dedicated[CH_index].betaOffset_ACK_Index); - LOG_D(PHY,"pusch_config_dedicated.betaOffset_RI_Index %d\n",phy_vars_ue->pusch_config_dedicated[CH_index].betaOffset_RI_Index); - LOG_D(PHY,"pusch_config_dedicated.betaOffset_CQI_Index %d\n",phy_vars_ue->pusch_config_dedicated[CH_index].betaOffset_CQI_Index); - LOG_D(PHY,"\n"); - - - } - - if (physicalConfigDedicated->uplinkPowerControlDedicated) { - - phy_vars_ue->ul_power_control_dedicated[CH_index].p0_UE_PUSCH = physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUSCH; - phy_vars_ue->ul_power_control_dedicated[CH_index].deltaMCS_Enabled= physicalConfigDedicated->uplinkPowerControlDedicated->deltaMCS_Enabled; - phy_vars_ue->ul_power_control_dedicated[CH_index].accumulationEnabled= physicalConfigDedicated->uplinkPowerControlDedicated->accumulationEnabled; - phy_vars_ue->ul_power_control_dedicated[CH_index].p0_UE_PUCCH= physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUCCH; - phy_vars_ue->ul_power_control_dedicated[CH_index].pSRS_Offset= physicalConfigDedicated->uplinkPowerControlDedicated->pSRS_Offset; - phy_vars_ue->ul_power_control_dedicated[CH_index].filterCoefficient= *physicalConfigDedicated->uplinkPowerControlDedicated->filterCoefficient; - LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUSCH %d\n",phy_vars_ue->ul_power_control_dedicated[CH_index].p0_UE_PUSCH); - LOG_D(PHY,"ul_power_control_dedicated.deltaMCS_Enabled %d\n",phy_vars_ue->ul_power_control_dedicated[CH_index].deltaMCS_Enabled); - LOG_D(PHY,"ul_power_control_dedicated.accumulationEnabled %d\n",phy_vars_ue->ul_power_control_dedicated[CH_index].accumulationEnabled); - LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUCCH %d\n",phy_vars_ue->ul_power_control_dedicated[CH_index].p0_UE_PUCCH); - LOG_D(PHY,"ul_power_control_dedicated.pSRS_Offset %d\n",phy_vars_ue->ul_power_control_dedicated[CH_index].pSRS_Offset); - LOG_D(PHY,"ul_power_control_dedicated.filterCoefficient %d\n",phy_vars_ue->ul_power_control_dedicated[CH_index].filterCoefficient); - LOG_D(PHY,"\n"); - } - - if (physicalConfigDedicated->antennaInfo) { - phy_vars_ue->transmission_mode[CH_index] = 1+(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode); - LOG_D(PHY,"Transmission Mode %d\n",phy_vars_ue->transmission_mode[CH_index]); - LOG_D(PHY,"\n"); - } - - if (physicalConfigDedicated->schedulingRequestConfig) { - if (physicalConfigDedicated->schedulingRequestConfig->present == SchedulingRequestConfig_PR_setup) { - phy_vars_ue->scheduling_request_config[CH_index].sr_PUCCH_ResourceIndex = physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex; - phy_vars_ue->scheduling_request_config[CH_index].sr_ConfigIndex=physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_ConfigIndex; - phy_vars_ue->scheduling_request_config[CH_index].dsr_TransMax=physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax; - - LOG_D(PHY,"scheduling_request_config.sr_PUCCH_ResourceIndex %d\n",phy_vars_ue->scheduling_request_config[CH_index].sr_PUCCH_ResourceIndex); - LOG_D(PHY,"scheduling_request_config.sr_ConfigIndex %d\n",phy_vars_ue->scheduling_request_config[CH_index].sr_ConfigIndex); - LOG_D(PHY,"scheduling_request_config.dsr_TransMax %d\n",phy_vars_ue->scheduling_request_config[CH_index].dsr_TransMax); - } - - LOG_D(PHY,"------------------------------------------------------------\n"); - - } - -#ifdef CBA - - if (physicalConfigDedicated->pusch_CBAConfigDedicated_vlola) { - phy_vars_ue->pusch_ca_config_dedicated[CH_index].betaOffset_CA_Index = (uint16_t) *physicalConfigDedicated->pusch_CBAConfigDedicated_vlola->betaOffset_CBA_Index; - phy_vars_ue->pusch_ca_config_dedicated[CH_index].cShift = (uint16_t) *physicalConfigDedicated->pusch_CBAConfigDedicated_vlola->cShift_CBA; - LOG_D(PHY,"[UE %d ] physicalConfigDedicated pusch CBA config dedicated: beta offset %d cshift %d \n",Mod_id, - phy_vars_ue->pusch_ca_config_dedicated[CH_index].betaOffset_CA_Index, - phy_vars_ue->pusch_ca_config_dedicated[CH_index].cShift); - } - -#endif - } else { - LOG_D(PHY,"[PHY][UE %d] Frame %d: Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, phy_vars_ue->frame_rx,CH_index); - return; - } - -} - void phy_config_cba_rnti (module_id_t Mod_id,int CC_id,eNB_flag_t eNB_flag, uint8_t index, rnti_t cba_rnti, uint8_t cba_group_id, uint8_t num_active_cba_groups) { // uint8_t i; if (eNB_flag == 0 ) { //LOG_D(PHY,"[UE %d] configure cba group %d with rnti %x, num active cba grp %d\n", index, index, cba_rnti, num_active_cba_groups); - PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[index]->num_active_cba_groups=num_active_cba_groups; - PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[index]->cba_rnti[cba_group_id]=cba_rnti; + PHY_vars_UE_g[Mod_id][CC_id]->ulsch[index]->num_active_cba_groups=num_active_cba_groups; + PHY_vars_UE_g[Mod_id][CC_id]->ulsch[index]->cba_rnti[cba_group_id]=cba_rnti; } else { //for (i=index; i < NUMBER_OF_UE_MAX; i+=num_active_cba_groups){ // LOG_D(PHY,"[eNB %d] configure cba group %d with rnti %x for UE %d, num active cba grp %d\n",Mod_id, i%num_active_cba_groups, cba_rnti, i, num_active_cba_groups); - PHY_vars_eNB_g[Mod_id][CC_id]->ulsch_eNB[index]->num_active_cba_groups=num_active_cba_groups; - PHY_vars_eNB_g[Mod_id][CC_id]->ulsch_eNB[index]->cba_rnti[cba_group_id] = cba_rnti; + RC.eNB[Mod_id][CC_id]->ulsch[index]->num_active_cba_groups=num_active_cba_groups; + RC.eNB[Mod_id][CC_id]->ulsch[index]->cba_rnti[cba_group_id] = cba_rnti; //} } } -void phy_init_lte_top(LTE_DL_FRAME_PARMS *lte_frame_parms) -{ - - crcTableInit(); - - ccodedot11_init(); - ccodedot11_init_inv(); - - ccodelte_init(); - ccodelte_init_inv(); - - treillis_table_init(); - - phy_generate_viterbi_tables(); - phy_generate_viterbi_tables_lte(); - - init_td8(); - init_td16(); -#ifdef __AVX2__ - init_td16avx2(); -#endif - - lte_sync_time_init(lte_frame_parms); - - generate_ul_ref_sigs(); - generate_ul_ref_sigs_rx(); - - generate_64qam_table(); - generate_16qam_table(); - generate_RIV_tables(); - - - //set_taus_seed(1328); - -} - -/*! \brief Helper function to allocate memory for DLSCH data structures. - * \param[out] pdsch Pointer to the LTE_UE_PDSCH structure to initialize. - * \param[in] frame_parms LTE_DL_FRAME_PARMS structure. - * \note This function is optimistic in that it expects malloc() to succeed. - */ -void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS* const frame_parms ) -{ - AssertFatal( pdsch, "pdsch==0" ); - - pdsch->pmi_ext = (uint8_t*)malloc16_clear( frame_parms->N_RB_DL ); - pdsch->llr[0] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); - pdsch->llr128 = (int16_t**)malloc16_clear( sizeof(int16_t*) ); - pdsch->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) ); - // FIXME! no further allocation for (int16_t*)pdsch->llr128 !!! expect SIGSEGV - - pdsch->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch->rxdataF_comp0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch->rho = (int32_t**)malloc16_clear( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - pdsch->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch->dl_ch_mag0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch->dl_ch_magb0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - - // the allocated memory size is fixed: - AssertFatal( frame_parms->nb_antennas_rx <= 2, "nb_antennas_rx > 2" ); - - for (int i=0; inb_antennas_rx; i++) { - pdsch->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->N_RB_DL*12*7*2) ); - - for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++) - const int idx = (j<<1)+i; - const size_t num = 7*2*frame_parms->N_RB_DL*12; - pdsch->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - pdsch->rxdataF_comp0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - pdsch->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - pdsch->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - pdsch->dl_ch_mag0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - pdsch->dl_ch_magb0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - } - } -} - -/*! \brief Helper function to allocate memory for DLSCH_FLP data structures. - * \param[out] pdsch_flp Pointer to the LTE_UE_PDSCH_FLP structure to initialize. - * \param[in] frame_parms LTE_DL_FRAME_PARMS structure. - * \note This function is optimistic in that it expects malloc() to succeed. - */ -void phy_init_lte_ue__PDSCH_FLP( LTE_UE_PDSCH_FLP* const pdsch_flp, const LTE_DL_FRAME_PARMS* const frame_parms ) -{ - AssertFatal( pdsch_flp, "pdsch==0" ); - - pdsch_flp->llr[0] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); - pdsch_flp->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); - pdsch_flp->llr128 = (int16_t**)malloc16_clear( sizeof(int16_t*) ); - // FIXME! no further allocation for (int16_t*)pdsch_flp->llr128 !!! expect SIGSEGV - - pdsch_flp->pmi_ext = (uint8_t*)malloc16_clear( frame_parms->N_RB_DL ); - pdsch_flp->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch_flp->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - pdsch_flp->rxdataF_comp = (double**)malloc16_clear( 8*sizeof(double*) ); - pdsch_flp->dl_ch_rho_ext = (double**)malloc16_clear( 8*sizeof(double*) ); - pdsch_flp->dl_ch_mag = (double**)malloc16_clear( 8*sizeof(double*) ); - pdsch_flp->dl_ch_magb = (double**)malloc16_clear( 8*sizeof(double*) ); - pdsch_flp->rho = (double**)malloc16_clear( frame_parms->nb_antennas_rx*sizeof(double*) ); - - // the allocated memory size is fixed: - AssertFatal( frame_parms->nb_antennas_rx <= 2, "nb_antennas_rx > 2" ); - - for (int i=0; inb_antennas_rx; i++) { - pdsch_flp->rho[i] = (double*)malloc16_clear( sizeof(double)*(frame_parms->N_RB_DL*12*7*2) ); - - for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++) - const int idx = (j<<1)+i; - const size_t num = 7*2*frame_parms->N_RB_DL*12; - pdsch_flp->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - pdsch_flp->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - pdsch_flp->rxdataF_comp[idx] = (double*)malloc16_clear( sizeof(double) * num ); - pdsch_flp->dl_ch_rho_ext[idx] = (double*)malloc16_clear( sizeof(double) * num ); - pdsch_flp->dl_ch_mag[idx] = (double*)malloc16_clear( sizeof(double) * num ); - pdsch_flp->dl_ch_magb[idx] = (double*)malloc16_clear( sizeof(double) * num ); - } - } -} - -int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue, - int nb_connected_eNB, - uint8_t abstraction_flag) -{ - - // create shortcuts - LTE_DL_FRAME_PARMS* const frame_parms = &phy_vars_ue->lte_frame_parms; - LTE_UE_COMMON* const ue_common_vars = &phy_vars_ue->lte_ue_common_vars; - LTE_UE_PDSCH** const ue_pdsch_vars = phy_vars_ue->lte_ue_pdsch_vars; - LTE_UE_PDSCH_FLP** const ue_pdsch_vars_flp = phy_vars_ue->lte_ue_pdsch_vars_flp; - LTE_UE_PDSCH** const ue_pdsch_vars_SI = phy_vars_ue->lte_ue_pdsch_vars_SI; - LTE_UE_PDSCH** const ue_pdsch_vars_ra = phy_vars_ue->lte_ue_pdsch_vars_ra; - LTE_UE_PDSCH** const ue_pdsch_vars_mch = phy_vars_ue->lte_ue_pdsch_vars_MCH; - LTE_UE_PBCH** const ue_pbch_vars = phy_vars_ue->lte_ue_pbch_vars; - LTE_UE_PDCCH** const ue_pdcch_vars = phy_vars_ue->lte_ue_pdcch_vars; - LTE_UE_PRACH** const ue_prach_vars = phy_vars_ue->lte_ue_prach_vars; - - int i,j,k; - int eNB_id; - - msg("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx); - LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", phy_vars_ue->Mod_id+NB_eNB_INST); - - // many memory allocation sizes are hard coded - AssertFatal( frame_parms->nb_antennas_rx <= 2, "hard coded allocation for ue_common_vars->dl_ch_estimates[eNB_id]" ); - AssertFatal( phy_vars_ue->n_connected_eNB <= NUMBER_OF_CONNECTED_eNB_MAX, "n_connected_eNB is too large" ); -#ifndef USER_MODE - AssertFatal( frame_parms->nb_antennas_tx <= NB_ANTENNAS_TX, "nb_antennas_tx too large" ); - AssertFatal( frame_parms->nb_antennas_rx <= NB_ANTENNAS_RX, "nb_antennas_rx too large" ); -#endif - // init phy_vars_ue - - for (i=0; i<4; i++) { - phy_vars_ue->rx_gain_max[i] = 135; - phy_vars_ue->rx_gain_med[i] = 128; - phy_vars_ue->rx_gain_byp[i] = 120; - } - - phy_vars_ue->n_connected_eNB = nb_connected_eNB; - - for(eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) { - phy_vars_ue->total_TBS[eNB_id] = 0; - phy_vars_ue->total_TBS_last[eNB_id] = 0; - phy_vars_ue->bitrate[eNB_id] = 0; - phy_vars_ue->total_received_bits[eNB_id] = 0; - } - - phy_vars_ue->tx_power_dBm=-127; - - if (abstraction_flag == 0) { - - // init TX buffers - - ue_common_vars->txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - ue_common_vars->txdataF = (int32_t **)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_tx; i++) { -#ifdef USER_MODE - ue_common_vars->txdata[i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); -#else //USER_MODE - ue_common_vars->txdata[i] = TX_DMA_BUFFER[0][i]; -#endif //USER_MODE - ue_common_vars->txdataF[i] = (int32_t *)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); - } - - // init RX buffers - - ue_common_vars->rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - ue_common_vars->rxdataF = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - ue_common_vars->rxdataF2 = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { -#ifndef USER_MODE - ue_common_vars->rxdata[i] = (int32_t*) RX_DMA_BUFFER[0][i]; -#else //USER_MODE - ue_common_vars->rxdata[i] = (int32_t*) malloc16_clear( (FRAME_LENGTH_COMPLEX_SAMPLES+2048)*sizeof(int32_t) ); -#endif //USER_MODE - // RK 2 times because of output format of FFT! - // FIXME We should get rid of this - ue_common_vars->rxdataF[i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*(frame_parms->ofdm_symbol_size*14) ); - // RK 2 times because of output format of FFT! We should get rid of this - // FIXME We should get rid of this - ue_common_vars->rxdataF2[i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*10) ); - } - } - - // Channel estimates - for (eNB_id=0; eNB_id<7; eNB_id++) { - ue_common_vars->dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); - ue_common_vars->dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); - - for (i=0; inb_antennas_rx; i++) - for (j=0; j<4; j++) { - int idx = (j<<1) + i; - ue_common_vars->dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->symbols_per_tti*(frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) ); - ue_common_vars->dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size*2 ); - } - } - - // DLSCH - for (eNB_id=0; eNB_idn_connected_eNB; eNB_id++) { - ue_pdsch_vars[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); -#ifdef ENABLE_FULL_FLP - ue_pdsch_vars_flp[eNB_id] = (LTE_UE_PDSCH_FLP *)malloc16_clear(sizeof(LTE_UE_PDSCH_FLP)); -#else - ue_pdsch_vars_flp[eNB_id] = 0; -#endif - ue_pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); - ue_pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); - ue_pdsch_vars_mch[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear(sizeof(LTE_UE_PDSCH)); - ue_pdcch_vars[eNB_id] = (LTE_UE_PDCCH *)malloc16_clear(sizeof(LTE_UE_PDCCH)); - ue_prach_vars[eNB_id] = (LTE_UE_PRACH *)malloc16_clear(sizeof(LTE_UE_PRACH)); - ue_pbch_vars[eNB_id] = (LTE_UE_PBCH *)malloc16_clear(sizeof(LTE_UE_PBCH)); - - if (abstraction_flag == 0) { - phy_init_lte_ue__PDSCH( ue_pdsch_vars[eNB_id], frame_parms ); - - ue_pdsch_vars[eNB_id]->llr_shifts = (uint8_t*)malloc16_clear(7*2*frame_parms->N_RB_DL*12); - ue_pdsch_vars[eNB_id]->llr_shifts_p = ue_pdsch_vars[eNB_id]->llr_shifts; - ue_pdsch_vars[eNB_id]->dl_ch_mag1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pdsch_vars[eNB_id]->dl_ch_magb1 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pdsch_vars[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); - - for (k=0; k<8; k++) - ue_pdsch_vars[eNB_id]->rxdataF_comp1[k] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) - for (j=0; j<4; j++) { - int idx = (j<<1)+i; - ue_pdsch_vars[eNB_id]->dl_ch_mag1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(frame_parms->N_RB_DL*12) ); - ue_pdsch_vars[eNB_id]->dl_ch_magb1[idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(frame_parms->N_RB_DL*12) ); - - for (k=0; k<8; k++) - ue_pdsch_vars[eNB_id]->rxdataF_comp1[idx][k] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->N_RB_DL*12*14) ); - } - -#ifdef ENABLE_FULL_FLP - phy_init_lte_ue__PDSCH_FLP( ue_pdsch_vars_flp[eNB_id], frame_parms ); -#endif - - phy_init_lte_ue__PDSCH( ue_pdsch_vars_SI[eNB_id], frame_parms ); - phy_init_lte_ue__PDSCH( ue_pdsch_vars_ra[eNB_id], frame_parms ); - phy_init_lte_ue__PDSCH( ue_pdsch_vars_mch[eNB_id], frame_parms ); - // 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE - ue_pdcch_vars[eNB_id]->llr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); - ue_pdcch_vars[eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); - ue_pdcch_vars[eNB_id]->wbar = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); - ue_pdcch_vars[eNB_id]->e_rx = (int8_t*)malloc16_clear( 4*2*100*12 ); - - ue_pdcch_vars[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pdcch_vars[eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pdcch_vars[eNB_id]->rho = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - ue_pdcch_vars[eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - //ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(frame_parms->N_RB_DL*12*7*2) ); - ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) ); - - for (j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++) - int idx = (j<<1)+i; - // size_t num = 7*2*frame_parms->N_RB_DL*12; - size_t num = 4*100*12; // 4 symbols, 100 PRBs, 12 REs per PRB - ue_pdcch_vars[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - ue_pdcch_vars[eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - ue_pdcch_vars[eNB_id]->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); - } - } - - // PBCH - ue_pbch_vars[eNB_id]->rxdataF_ext = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - ue_pbch_vars[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pbch_vars[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); - ue_pbch_vars[eNB_id]->llr = (int8_t*)malloc16_clear( 1920 ); - ue_prach_vars[eNB_id]->prachF = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(frame_parms->ofdm_symbol_size*12)) ); - ue_prach_vars[eNB_id]->prach = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(frame_parms->ofdm_symbol_size*12)) ); - - for (i=0; inb_antennas_rx; i++) { - ue_pbch_vars[eNB_id]->rxdataF_ext[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); - - for (j=0; j<4; j++) {//frame_parms->nb_antennas_tx;j++) { - int idx = (j<<1)+i; - ue_pbch_vars[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); - ue_pbch_vars[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); - } - } - } - - ue_pbch_vars[eNB_id]->decoded_output = (uint8_t*)malloc16_clear( 64 ); - } - - // initialization for the last instance of ue_pdsch_vars (used for MU-MIMO) - - ue_pdsch_vars[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); - ue_pdsch_vars_SI[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); - ue_pdsch_vars_ra[eNB_id] = (LTE_UE_PDSCH *)malloc16_clear( sizeof(LTE_UE_PDSCH) ); - ue_pdsch_vars_flp[eNB_id] = (LTE_UE_PDSCH_FLP *)malloc16_clear( sizeof(LTE_UE_PDSCH_FLP) ); - - if (abstraction_flag == 0) { - phy_init_lte_ue__PDSCH( ue_pdsch_vars[eNB_id], frame_parms ); - ue_pdsch_vars[eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); - - phy_init_lte_ue__PDSCH_FLP( ue_pdsch_vars_flp[eNB_id], frame_parms ); - } else { //abstraction == 1 - phy_vars_ue->sinr_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); - } - - phy_vars_ue->sinr_CQI_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); - - phy_vars_ue->init_averaging = 1; - phy_vars_ue->pdsch_config_dedicated->p_a = dB0; // default value until overwritten by RRCConnectionReconfiguration - - // set channel estimation to do linear interpolation in time - phy_vars_ue->high_speed_flag = 1; - phy_vars_ue->ch_est_alpha = 24576; - - init_prach_tables(839); - - return 0; -} - -int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNB, +int phy_init_lte_eNB(PHY_VARS_eNB *eNB, unsigned char is_secondary_eNB, - uint8_t cooperation_flag, unsigned char abstraction_flag) { // shortcuts - LTE_DL_FRAME_PARMS* const frame_parms = &phy_vars_eNB->lte_frame_parms; - LTE_eNB_COMMON* const eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars; - LTE_eNB_PUSCH** const eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars; - LTE_eNB_SRS* const eNB_srs_vars = phy_vars_eNB->lte_eNB_srs_vars; - LTE_eNB_PRACH* const eNB_prach_vars = &phy_vars_eNB->lte_eNB_prach_vars; - int i, j, eNB_id, UE_id; + LTE_DL_FRAME_PARMS* const fp = &eNB->frame_parms; + LTE_eNB_COMMON* const common_vars = &eNB->common_vars; + LTE_eNB_PUSCH** const pusch_vars = eNB->pusch_vars; + LTE_eNB_SRS* const srs_vars = eNB->srs_vars; + LTE_eNB_PRACH* const prach_vars = &eNB->prach_vars; +#ifdef Rel14 + LTE_eNB_PRACH* const prach_vars_br = &eNB->prach_vars_br; +#endif + int i, UE_id; - phy_vars_eNB->total_dlsch_bitrate = 0; - phy_vars_eNB->total_transmitted_bits = 0; - phy_vars_eNB->total_system_throughput = 0; - phy_vars_eNB->check_for_MUMIMO_transmissions=0; + LOG_I(PHY,"[eNB %d] %s() About to wait for eNB to be configured", eNB->Mod_id, __FUNCTION__); - LOG_I(PHY,"[eNB %"PRIu8"] Initializing DL_FRAME_PARMS : N_RB_DL %"PRIu8", PHICH Resource %d, PHICH Duration %d\n", - phy_vars_eNB->Mod_id, - frame_parms->N_RB_DL,frame_parms->phich_config_common.phich_resource, - frame_parms->phich_config_common.phich_duration); - LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_eNB][MOD %02"PRIu8"][]\n", phy_vars_eNB->Mod_id); + eNB->total_dlsch_bitrate = 0; + eNB->total_transmitted_bits = 0; + eNB->total_system_throughput = 0; + eNB->check_for_MUMIMO_transmissions=0; + + while(eNB->configured == 0) usleep(10000); - lte_gold(frame_parms,phy_vars_eNB->lte_gold_table,frame_parms->Nid_cell); - generate_pcfich_reg_mapping(frame_parms); - generate_phich_reg_mapping(frame_parms); + LOG_I(PHY,"[eNB %"PRIu8"] Initializing DL_FRAME_PARMS : N_RB_DL %"PRIu8", PHICH Resource %d, PHICH Duration %d nb_antennas_tx:%u nb_antennas_rx:%u nb_antenna_ports_eNB:%u PRACH[rootSequenceIndex:%u prach_Config_enabled:%u configIndex:%u highSpeed:%u zeroCorrelationZoneConfig:%u freqOffset:%u]\n", + eNB->Mod_id, + fp->N_RB_DL,fp->phich_config_common.phich_resource, + fp->phich_config_common.phich_duration, + fp->nb_antennas_tx, fp->nb_antennas_rx, fp->nb_antenna_ports_eNB, + fp->prach_config_common.rootSequenceIndex, + fp->prach_config_common.prach_Config_enabled, + fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, + fp->prach_config_common.prach_ConfigInfo.highSpeedFlag, + fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig, + fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset + ); + LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_eNB][MOD %02"PRIu8"][]\n", eNB->Mod_id); + + + lte_gold(fp,eNB->lte_gold_table,fp->Nid_cell); + generate_pcfich_reg_mapping(fp); + generate_phich_reg_mapping(fp); for (UE_id=0; UE_idfirst_run_timing_advance[UE_id] = + eNB->first_run_timing_advance[UE_id] = 1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here. - + // clear whole structure - bzero( &phy_vars_eNB->eNB_UE_stats[UE_id], sizeof(LTE_eNB_UE_stats) ); - - phy_vars_eNB->physicalConfigDedicated[UE_id] = NULL; + bzero( &eNB->UE_stats[UE_id], sizeof(LTE_eNB_UE_stats) ); + + eNB->physicalConfigDedicated[UE_id] = NULL; } + + eNB->first_run_I0_measurements = 1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here. + - phy_vars_eNB->first_run_I0_measurements = - 1; ///This flag used to be static. With multiple eNBs this does no longer work, hence we put it in the structure. However it has to be initialized with 1, which is performed here. -#ifndef USER_MODE - AssertFatal( frame_parms->nb_antennas_tx <= NB_ANTENNAS_TX, "nb_antennas_tx too large" ); - AssertFatal( frame_parms->nb_antennas_rx <= NB_ANTENNAS_RX, "nb_antennas_rx too large" ); -#endif + + common_vars->rxdata = (int32_t **)NULL; + common_vars->txdataF = (int32_t **)malloc16(NB_ANTENNA_PORTS_ENB*sizeof(int32_t*)); + common_vars->rxdataF = (int32_t **)malloc16(64*sizeof(int32_t*)); + + LOG_D(PHY,"[INIT] NB_ANTENNA_PORTS_ENB:%d fp->nb_antenna_ports_eNB:%d\n", NB_ANTENNA_PORTS_ENB, fp->nb_antenna_ports_eNB); - for (eNB_id=0; eNB_id<3; eNB_id++) { - - if (abstraction_flag==0) { - - // TX vars - eNB_common_vars->txdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - eNB_common_vars->txdataF[eNB_id] = (int32_t **)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_tx; i++) { -#ifdef USER_MODE - eNB_common_vars->txdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); - eNB_common_vars->txdataF[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); -#else // USER_MODE - eNB_common_vars->txdata[eNB_id][i] = TX_DMA_BUFFER[eNB_id][i]; - eNB_common_vars->txdataF[eNB_id][i] = (int32_t *)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t) ); -#endif //USER_MODE -#ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] lte_eNB_common_vars->txdata[%d][%d] = %p\n",eNB_id,i,eNB_common_vars->txdata[eNB_id][i]); - msg("[openair][LTE_PHY][INIT] lte_eNB_common_vars->txdataF[%d][%d] = %p (%d bytes)\n", - eNB_id,i,eNB_common_vars->txdataF[eNB_id][i], - FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); -#endif - } - - // RX vars - eNB_common_vars->rxdata[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_common_vars->rxdata_7_5kHz[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_common_vars->rxdataF[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { -#ifndef USER_MODE - eNB_common_vars->rxdata[eNB_id][i] = (int32_t*)RX_DMA_BUFFER[eNB_id][i]; -#else //USER_MODE - eNB_common_vars->rxdata[eNB_id][i] = (int32_t*)malloc16_clear( FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(int32_t) ); -#endif //USER_MODE - eNB_common_vars->rxdata_7_5kHz[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->samples_per_tti*sizeof(int32_t) ); - // RK 2 times because of output format of FFT! - // FIXME We should get rid of this - eNB_common_vars->rxdataF[eNB_id][i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*(frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti) ); -#ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] lte_eNB_common_vars->rxdata[%d][%d] = %p\n",eNB_id,i,eNB_common_vars->rxdata[eNB_id][i]); - msg("[openair][LTE_PHY][INIT] lte_eNB_common_vars->rxdata_7_5kHz[%d][%d] = %p\n",eNB_id,i,eNB_common_vars->rxdata_7_5kHz[eNB_id][i]); -#endif - } - - // Channel estimates for SRS - for (UE_id=0; UE_idnb_antennas_rx*sizeof(int32_t*) ); - eNB_srs_vars[UE_id].srs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - eNB_srs_vars[UE_id].srs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size ); - eNB_srs_vars[UE_id].srs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->ofdm_symbol_size*2 ); - } - } //UE_id - - eNB_common_vars->sync_corr[eNB_id] = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*frame_parms->samples_per_tti ); - } else { //UPLINK abstraction = 1 - phy_vars_eNB->sinr_dB = (double*) malloc16_clear( frame_parms->N_RB_DL*12*sizeof(double) ); + for (i=0; inb_antenna_ports_eNB || i==5) { + common_vars->txdataF[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) ); + + LOG_D(PHY,"[INIT] common_vars->txdataF[%d] = %p (%lu bytes)\n", + i,common_vars->txdataF[i], + fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t)); } - } //eNB_id - -#ifndef NO_UL_REF - - if (abstraction_flag==0) { - generate_ul_ref_sigs_rx(); - - // SRS - for (UE_id=0; UE_idofdm_symbol_size*sizeof(int32_t)); - } - } - -#endif - - // ULSCH VARS - - eNB_prach_vars->prachF = (int16_t*)malloc16_clear( 2*1024 /*FIXME what is the correct number?*/ *sizeof(int16_t) ); - - /* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */ - AssertFatal(frame_parms->nb_antennas_rx <= sizeof(eNB_prach_vars->rxsigF) / sizeof(eNB_prach_vars->rxsigF[0]), - "nb_antennas_rx too large"); - for (i=0; inb_antennas_rx; i++) { - eNB_prach_vars->rxsigF[i] = (int16_t*)malloc16_clear( frame_parms->ofdm_symbol_size*12*2*sizeof(int16_t) ); -#ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] prach_vars->rxsigF[%d] = %p\n",i,eNB_prach_vars->rxsigF[i]); -#endif - } - - AssertFatal(frame_parms->nb_antennas_rx <= sizeof(eNB_prach_vars->prach_ifft) / sizeof(eNB_prach_vars->prach_ifft[0]), - "nb_antennas_rx too large"); - for (i=0; inb_antennas_rx; i++) { - eNB_prach_vars->prach_ifft[i] = (int16_t*)malloc16_clear(1024*2*sizeof(int16_t)); -#ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] prach_vars->prach_ifft[%d] = %p\n",i,eNB_prach_vars->prach_ifft[i]); -#endif - } - + } + + + // Channel estimates for SRS for (UE_id=0; UE_idrxdataF_ext[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->rxdataF_ext2[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->drs_ch_estimates[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->rxdataF_comp[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->ul_ch_mag[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->ul_ch_magb[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - // RK 2 times because of output format of FFT! - // FIXME We should get rid of this - eNB_pusch_vars[UE_id]->rxdataF_ext[eNB_id][i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - eNB_pusch_vars[UE_id]->rxdataF_ext2[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - eNB_pusch_vars[UE_id]->drs_ch_estimates[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - eNB_pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id][i] = (int32_t*)malloc16_clear( 2*2*sizeof(int32_t)*frame_parms->ofdm_symbol_size ); - eNB_pusch_vars[UE_id]->rxdataF_comp[eNB_id][i] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->N_RB_UL*12*frame_parms->symbols_per_tti ); - eNB_pusch_vars[UE_id]->ul_ch_mag[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - eNB_pusch_vars[UE_id]->ul_ch_magb[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - } - - // In case of Distributed Alamouti Collabrative scheme separate channel estimates are required for both the UEs - if (cooperation_flag == 2) { - eNB_pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // UE 0 DRS estimates - eNB_pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // UE 1 DRS estimates - - for (i=0; inb_antennas_rx; i++) { - eNB_pusch_vars[UE_id]->drs_ch_estimates_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - eNB_pusch_vars[UE_id]->drs_ch_estimates_1[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - } - - // Compensated data for the case of Distributed Alamouti Scheme - eNB_pusch_vars[UE_id]->rxdataF_comp_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y)*(h0*) - eNB_pusch_vars[UE_id]->rxdataF_comp_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); // it will contain(y*)*(h1) - - for (i=0; inb_antennas_rx; i++) { - eNB_pusch_vars[UE_id]->rxdataF_comp_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - eNB_pusch_vars[UE_id]->rxdataF_comp_1[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - } - - // UE 0 - eNB_pusch_vars[UE_id]->ul_ch_mag_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->ul_ch_magb_0[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - eNB_pusch_vars[UE_id]->ul_ch_mag_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - eNB_pusch_vars[UE_id]->ul_ch_magb_0[eNB_id][i] = (int32_t*)malloc16_clear( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - } - - // UE 1 - eNB_pusch_vars[UE_id]->ul_ch_mag_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - eNB_pusch_vars[UE_id]->ul_ch_magb_1[eNB_id] = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - eNB_pusch_vars[UE_id]->ul_ch_mag_1[eNB_id][i] = (int32_t*)malloc16( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - eNB_pusch_vars[UE_id]->ul_ch_magb_1[eNB_id][i] = (int32_t*)malloc16( frame_parms->symbols_per_tti*sizeof(int32_t)*frame_parms->N_RB_UL*12 ); - } - }//cooperation_flag - } //eNB_id - - eNB_pusch_vars[UE_id]->llr = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); - } // abstraction_flag + + srs_vars[UE_id].srs_ch_estimates = (int32_t**)malloc16( 64*sizeof(int32_t*) ); + srs_vars[UE_id].srs_ch_estimates_time = (int32_t**)malloc16( 64*sizeof(int32_t*) ); + + for (i=0; i<64; i++) { + srs_vars[UE_id].srs_ch_estimates[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size ); + srs_vars[UE_id].srs_ch_estimates_time[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 ); + } } //UE_id - if (abstraction_flag==0) { - if (is_secondary_eNB) { - for (eNB_id=0; eNB_id<3; eNB_id++) { - phy_vars_eNB->dl_precoder_SeNB[eNB_id] = (int **)malloc16(4*sizeof(int*)); - if (phy_vars_eNB->dl_precoder_SeNB[eNB_id]) { -#ifdef DEBUG_PHY - msg("[openair][SECSYS_PHY][INIT] phy_vars_eNB->dl_precoder_SeNB[%d] allocated at %p\n",eNB_id, - phy_vars_eNB->dl_precoder_SeNB[eNB_id]); -#endif - } else { - msg("[openair][SECSYS_PHY][INIT] phy_vars_eNB->dl_precoder_SeNB[%d] not allocated\n",eNB_id); - return(-1); - } + generate_ul_ref_sigs_rx(); + + init_ulsch_power_LUT(); - for (j=0; jlte_frame_parms.nb_antennas_tx; j++) { - phy_vars_eNB->dl_precoder_SeNB[eNB_id][j] = (int *)malloc16(2*sizeof(int)*(phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)); // repeated format (hence the '2*') - - if (phy_vars_eNB->dl_precoder_SeNB[eNB_id][j]) { -#ifdef DEBUG_PHY - msg("[openair][LTE_PHY][INIT] phy_vars_eNB->dl_precoder_SeNB[%d][%d] allocated at %p\n",eNB_id,j, - phy_vars_eNB->dl_precoder_SeNB[eNB_id][j]); -#endif - memset(phy_vars_eNB->dl_precoder_SeNB[eNB_id][j],0,2*sizeof(int)*(phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)); - } else { - msg("[openair][LTE_PHY][INIT] phy_vars_eNB->dl_precoder_SeNB[%d][%d] not allocated\n",eNB_id,j); - return(-1); - } - } //for(j=...nb_antennas_tx - - } //for(eNB_id... - } + // SRS + for (UE_id=0; UE_idofdm_symbol_size*sizeof(int32_t)); } + // PRACH + prach_vars->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int16_t) ); + + // assume maximum of 64 RX antennas for PRACH receiver + prach_vars->prach_ifft[0] = (int32_t**)malloc16_clear(64*sizeof(int32_t*)); + for (i=0;i<64;i++) prach_vars->prach_ifft[0][i] = (int32_t*)malloc16_clear(1024*2*sizeof(int32_t)); + + prach_vars->rxsigF[0] = (int16_t**)malloc16_clear(64*sizeof(int16_t*)); + // PRACH BR +#ifdef Rel14 + prach_vars_br->prachF = (int16_t*)malloc16_clear( 1024*2*sizeof(int32_t) ); + + // assume maximum of 64 RX antennas for PRACH receiver + for (int ce_level=0;ce_level<4;ce_level++) { + prach_vars_br->prach_ifft[ce_level] = (int32_t**)malloc16_clear(64*sizeof(int32_t*)); + for (i=0;i<64;i++) prach_vars_br->prach_ifft[ce_level][i] = (int32_t*)malloc16_clear(1024*2*sizeof(int32_t)); + prach_vars->rxsigF[ce_level] = (int16_t**)malloc16_clear(64*sizeof(int16_t*)); + } +#endif + + /* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) + AssertFatal(fp->nb_antennas_rx <= sizeof(prach_vars->rxsigF) / sizeof(prach_vars->rxsigF[0]), + "nb_antennas_rx too large"); + for (i=0; inb_antennas_rx; i++) { + prach_vars->rxsigF[i] = (int16_t*)malloc16_clear( fp->ofdm_symbol_size*12*2*sizeof(int16_t) ); + LOG_D(PHY,"[INIT] prach_vars->rxsigF[%d] = %p\n",i,prach_vars->rxsigF[i]); + }*/ + + for (UE_id=0; UE_idrxdataF_ext = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->rxdataF_ext2 = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->drs_ch_estimates = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->drs_ch_estimates_time = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->rxdataF_comp = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_mag = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_magb = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + + AssertFatal(fp->ofdm_symbol_size > 127, "fp->ofdm_symbol_size %d<128\n",fp->ofdm_symbol_size); + AssertFatal(fp->symbols_per_tti > 11, "fp->symbols_per_tti %d < 12\n",fp->symbols_per_tti); + AssertFatal(fp->N_RB_UL > 5, "fp->N_RB_UL %d < 6\n",fp->N_RB_UL); + for (i=0; i<2; i++) { + // RK 2 times because of output format of FFT! + // FIXME We should get rid of this + pusch_vars[UE_id]->rxdataF_ext[i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti ); + pusch_vars[UE_id]->rxdataF_ext2[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti ); + pusch_vars[UE_id]->drs_ch_estimates[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti ); + pusch_vars[UE_id]->drs_ch_estimates_time[i] = (int32_t*)malloc16_clear( 2*2*sizeof(int32_t)*fp->ofdm_symbol_size ); + pusch_vars[UE_id]->rxdataF_comp[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti ); + pusch_vars[UE_id]->ul_ch_mag[i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); + pusch_vars[UE_id]->ul_ch_magb[i] = (int32_t*)malloc16_clear( fp->symbols_per_tti*sizeof(int32_t)*fp->N_RB_UL*12 ); + } + + pusch_vars[UE_id]->llr = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); + } //UE_id + + for (UE_id=0; UE_ideNB_UE_stats_ptr[UE_id] = &phy_vars_eNB->eNB_UE_stats[UE_id]; - - phy_vars_eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration - - init_prach_tables(839); + eNB->UE_stats_ptr[UE_id] = &eNB->UE_stats[UE_id]; + + eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration + return (0); + +} + +void install_schedule_handlers(IF_Module_t *if_inst) +{ + if_inst->PHY_config_req = phy_config_request; + if_inst->schedule_response = schedule_response; } diff --git a/openair1/PHY/INIT/lte_init_ru.c b/openair1/PHY/INIT/lte_init_ru.c new file mode 100644 index 0000000000..5a8940d518 --- /dev/null +++ b/openair1/PHY/INIT/lte_init_ru.c @@ -0,0 +1,151 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "defs.h" +#include "SCHED/defs.h" +#include "PHY/extern.h" +#include "SIMULATION/TOOLS/defs.h" +#include "RadioResourceConfigCommonSIB.h" +#include "RadioResourceConfigDedicated.h" +#include "TDD-Config.h" +#include "LAYER2/MAC/extern.h" +#include "MBSFN-SubframeConfigList.h" +#include "UTIL/LOG/vcd_signal_dumper.h" +#include "assertions.h" +#include + +int phy_init_RU(RU_t *ru) { + + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + int i,j; + int p; + int re; + + LOG_I(PHY,"Initializing RU signal buffers (if_south %s) nb_tx %d\n",ru_if_types[ru->if_south],ru->nb_tx); + + if (ru->if_south <= REMOTE_IF5) { // this means REMOTE_IF5 or LOCAL_RF, so allocate memory for time-domain signals + // Time-domain signals + ru->common.txdata = (int32_t**)malloc16(ru->nb_tx*sizeof(int32_t*)); + ru->common.rxdata = (int32_t**)malloc16(ru->nb_rx*sizeof(int32_t*) ); + + + for (i=0; inb_tx; i++) { + // Allocate 10 subframes of I/Q TX signal data (time) if not + ru->common.txdata[i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) ); + + LOG_I(PHY,"[INIT] common.txdata[%d] = %p (%lu bytes)\n",i,ru->common.txdata[i], + fp->samples_per_tti*10*sizeof(int32_t)); + + } + for (i=0;inb_rx;i++) { + ru->common.rxdata[i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) ); + } + } // IF5 or local RF + else { + LOG_I(PHY,"No rxdata/txdata for RU\n"); + ru->common.txdata = (int32_t**)NULL; + ru->common.rxdata = (int32_t**)NULL; + + } + if (ru->function != NGFI_RRU_IF5) { // we need to do RX/TX RU processing + LOG_I(PHY,"nb_tx %d\n",ru->nb_tx); + ru->common.rxdata_7_5kHz = (int32_t**)malloc16(ru->nb_rx*sizeof(int32_t*) ); + for (i=0;inb_rx;i++) { + ru->common.rxdata_7_5kHz[i] = (int32_t*)malloc16_clear( 2*fp->samples_per_tti*2*sizeof(int32_t) ); + LOG_I(PHY,"rxdata_7_5kHz[%d] %p for RU %d\n",i,ru->common.rxdata_7_5kHz[i],ru->idx); + } + + + // allocate IFFT input buffers (TX) + ru->common.txdataF_BF = (int32_t **)malloc16(ru->nb_tx*sizeof(int32_t*)); + LOG_I(PHY,"[INIT] common.txdata_BF= %p (%lu bytes)\n",ru->common.txdataF_BF, + ru->nb_tx*sizeof(int32_t*)); + for (i=0; inb_tx; i++) { + ru->common.txdataF_BF[i] = (int32_t*)malloc16_clear(fp->symbols_per_tti*fp->ofdm_symbol_size*sizeof(int32_t) ); + LOG_I(PHY,"txdataF_BF[%d] %p for RU %d\n",i,ru->common.txdataF_BF[i],ru->idx); + } + // allocate FFT output buffers (RX) + ru->common.rxdataF = (int32_t**)malloc16(ru->nb_rx*sizeof(int32_t*) ); + for (i=0; inb_rx; i++) { + // allocate 2 subframes of I/Q signal data (frequency) + ru->common.rxdataF[i] = (int32_t*)malloc16_clear(sizeof(int32_t)*(2*fp->ofdm_symbol_size*fp->symbols_per_tti) ); + LOG_I(PHY,"rxdataF[%d] %p for RU %d\n",i,ru->common.rxdataF[i],ru->idx); + } + + /* number of elements of an array X is computed as sizeof(X) / sizeof(X[0]) */ + AssertFatal(ru->nb_rx <= sizeof(ru->prach_rxsigF) / sizeof(ru->prach_rxsigF[0]), + "nb_antennas_rx too large"); + ru->prach_rxsigF = (int16_t**)malloc(ru->nb_rx * sizeof(int16_t*)); + for (j=0;j<4;j++) ru->prach_rxsigF_br[j] = (int16_t**)malloc(ru->nb_rx * sizeof(int16_t*)); + + for (i=0; inb_rx; i++) { + ru->prach_rxsigF[i] = (int16_t*)malloc16_clear( fp->ofdm_symbol_size*12*2*sizeof(int16_t) ); + LOG_D(PHY,"[INIT] prach_vars->rxsigF[%d] = %p\n",i,ru->prach_rxsigF[i]); +#ifdef Rel14 + for (j=0;j<4;j++) { + ru->prach_rxsigF_br[j][i] = (int16_t*)malloc16_clear( fp->ofdm_symbol_size*12*2*sizeof(int16_t) ); + LOG_D(PHY,"[INIT] prach_vars_br->rxsigF[%d] = %p\n",i,ru->prach_rxsigF_br[j][i]); + } +#endif + } + + AssertFatal(RC.nb_L1_inst <= NUMBER_OF_eNB_MAX,"eNB instances %d > %d\n", + RC.nb_L1_inst,NUMBER_OF_eNB_MAX); + + LOG_E(PHY,"[INIT] %s() RC.nb_L1_inst:%d \n", __FUNCTION__, RC.nb_L1_inst); + + for (i=0; ieNB_list[i]->frame_parms.nb_antenna_ports_eNB); + if (peNB_list[i]->frame_parms.nb_antenna_ports_eNB || p==5) { + LOG_D(PHY,"[INIT] %s() DO BEAM WEIGHTS nb_antenna_ports_eNB:%d nb_tx:%d\n", __FUNCTION__, ru->eNB_list[i]->frame_parms.nb_antenna_ports_eNB, ru->nb_tx); + ru->beam_weights[i][p] = (int32_t **)malloc16_clear(ru->nb_tx*sizeof(int32_t*)); + for (j=0; jnb_tx; j++) { + ru->beam_weights[i][p][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); + // antenna ports 0-3 are mapped on antennas 0-3 + // antenna port 4 is mapped on antenna 0 + // antenna ports 5-14 are mapped on all antennas + if (((p<4) && (p==j)) || ((p==4) && (j==0))) { + for (re=0; reofdm_symbol_size; re++) + { + ru->beam_weights[i][p][j][re] = 0x00007fff; + + //LOG_D(PHY,"[INIT] lte_common_vars->beam_weights[%d][%d][%d][%d] = %d\n", i,p,j,re,ru->beam_weights[i][p][j][re]); + } + } + else if (p>4) { + for (re=0; reofdm_symbol_size; re++) + { + ru->beam_weights[i][p][j][re] = 0x00007fff/ru->nb_tx; + //LOG_D(PHY,"[INIT] lte_common_vars->beam_weights[%d][%d][%d][%d] = %d\n", i,p,j,re,ru->beam_weights[i][p][j][re]); + } + } + //LOG_D(PHY,"[INIT] lte_common_vars->beam_weights[%d][%d] = %p (%lu bytes)\n", i,j,ru->beam_weights[i][p][j], fp->ofdm_symbol_size*sizeof(int32_t)); + } // for (j=0 + } // if (pcommon.sync_corr = (uint32_t*)malloc16_clear( LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(uint32_t)*fp->samples_per_tti ); + + return(0); +} + diff --git a/openair1/PHY/INIT/lte_init_ue.c b/openair1/PHY/INIT/lte_init_ue.c new file mode 100644 index 0000000000..f3628bfe19 --- /dev/null +++ b/openair1/PHY/INIT/lte_init_ue.c @@ -0,0 +1,964 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "defs.h" +#include "SCHED/defs.h" +#include "PHY/extern.h" +#include "SIMULATION/TOOLS/defs.h" +#include "RadioResourceConfigCommonSIB.h" +#include "RadioResourceConfigDedicated.h" +#include "TDD-Config.h" +#include "LAYER2/MAC/extern.h" +#include "MBSFN-SubframeConfigList.h" +#include "UTIL/LOG/vcd_signal_dumper.h" +#include "assertions.h" +#include + + +uint8_t dmrs1_tab_ue[8] = {0,2,3,4,6,8,9,10}; + +void phy_config_sib1_ue(uint8_t Mod_id,int CC_id, + uint8_t eNB_id, + TDD_Config_t *tdd_Config, + uint8_t SIwindowsize, + uint16_t SIperiod) +{ + + LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; + + if (tdd_Config) { + fp->tdd_config = tdd_Config->subframeAssignment; + fp->tdd_config_S = tdd_Config->specialSubframePatterns; + } + + fp->SIwindowsize = SIwindowsize; + fp->SIPeriod = SIperiod; +} + +void phy_config_sib2_ue(uint8_t Mod_id,int CC_id, + uint8_t eNB_id, + RadioResourceConfigCommonSIB_t *radioResourceConfigCommon, + ARFCN_ValueEUTRA_t *ul_CarrierFreq, + long *ul_Bandwidth, + AdditionalSpectrumEmission_t *additionalSpectrumEmission, + struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList) +{ + + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; + LTE_DL_FRAME_PARMS *fp = &ue->frame_parms; + int i; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_IN); + + LOG_I(PHY,"[UE%d] Applying radioResourceConfigCommon from eNB%d\n",Mod_id,eNB_id); + + fp->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; + + fp->prach_config_common.prach_Config_enabled=1; + fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; + fp->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.highSpeedFlag; + fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; + fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; + + compute_prach_seq(fp->prach_config_common.rootSequenceIndex, + fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, + fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig, + fp->prach_config_common.prach_ConfigInfo.highSpeedFlag, + fp->frame_type,ue->X_u); + + + + fp->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon.deltaPUCCH_Shift; + fp->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon.nRB_CQI; + fp->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon.nCS_AN; + fp->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon.n1PUCCH_AN; + + + + fp->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon.referenceSignalPower; + fp->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon.p_b; + + + fp->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; + fp->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; + fp->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; + fp->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = dmrs1_tab_ue[radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift]; + + + init_ul_hopping(fp); + fp->soundingrs_ul_config_common.enabled_flag = 0; + + if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.present==SoundingRS_UL_ConfigCommon_PR_setup) { + fp->soundingrs_ul_config_common.enabled_flag = 1; + fp->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; + fp->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; + fp->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; + + if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts) + fp->soundingrs_ul_config_common.srs_MaxUpPts = 1; + else + fp->soundingrs_ul_config_common.srs_MaxUpPts = 0; + } + + + + fp->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUSCH; + fp->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon.alpha; + fp->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon.p0_NominalPUCCH; + fp->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaPreambleMsg3; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b; + + fp->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon.maxHARQ_Msg3Tx; + + // Now configure some of the Physical Channels + + // PUCCH + init_ncs_cell(fp,ue->ncs_cell); + + init_ul_hopping(fp); + + // PCH + init_ue_paging_info(ue,radioResourceConfigCommon->pcch_Config.defaultPagingCycle,radioResourceConfigCommon->pcch_Config.nB); + + // MBSFN + + if (mbsfn_SubframeConfigList != NULL) { + fp->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; + + for (i=0; ilist.count; i++) { + fp->MBSFN_config[i].radioframeAllocationPeriod = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod; + fp->MBSFN_config[i].radioframeAllocationOffset = mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset; + + if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { + fp->MBSFN_config[i].fourFrames_flag = 0; + fp->MBSFN_config[i].mbsfn_SubframeConfig = mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]; // 6-bit subframe configuration + LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i, + fp->MBSFN_config[i].mbsfn_SubframeConfig); + } else if (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_fourFrames) { // 24-bit subframe configuration + fp->MBSFN_config[i].fourFrames_flag = 1; + fp->MBSFN_config[i].mbsfn_SubframeConfig = + mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0]| + (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[1]<<8)| + (mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[2]<<16); + + LOG_I(PHY, "[CONFIG] MBSFN_SubframeConfig[%d] pattern is %d\n", i, + fp->MBSFN_config[i].mbsfn_SubframeConfig); + } + } + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_OUT); + +} + +void phy_config_sib13_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id,int mbsfn_Area_idx, + long mbsfn_AreaId_r9) +{ + + LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; + + + LOG_I(PHY,"[UE%d] Applying MBSFN_Area_id %ld for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx); + + if (mbsfn_Area_idx == 0) { + fp->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9; + LOG_N(PHY,"Fix me: only called when mbsfn_Area_idx == 0)\n"); + } + + lte_gold_mbsfn(fp,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_mbsfn_table,fp->Nid_cell_mbsfn); + +} + + +/* + * Configures UE MAC and PHY with radioResourceCommon received in mobilityControlInfo IE during Handover + */ +void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, MobilityControlInfo_t *mobilityControlInfo, uint8_t ho_failed) +{ + + if(mobilityControlInfo!=NULL) { + RadioResourceConfigCommon_t *radioResourceConfigCommon = &mobilityControlInfo->radioResourceConfigCommon; + LOG_I(PHY,"radioResourceConfigCommon %p\n", radioResourceConfigCommon); + memcpy((void *)&PHY_vars_UE_g[Mod_id][CC_id]->frame_parms_before_ho, + (void *)&PHY_vars_UE_g[Mod_id][CC_id]->frame_parms, + sizeof(LTE_DL_FRAME_PARMS)); + PHY_vars_UE_g[Mod_id][CC_id]->ho_triggered = 1; + //PHY_vars_UE_g[UE_id]->UE_mode[0] = PRACH; + + LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms; + // int N_ZC; + // uint8_t prach_fmt; + // int u; + + LOG_I(PHY,"[UE%d] Handover triggered: Applying radioResourceConfigCommon from eNB %d\n", + Mod_id,eNB_id); + + fp->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex; + fp->prach_config_common.prach_Config_enabled=1; + fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex; + fp->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->highSpeedFlag; + fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->zeroCorrelationZoneConfig; + fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_FreqOffset; + + // prach_fmt = get_prach_fmt(radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex,fp->frame_type); + // N_ZC = (prach_fmt <4)?839:139; + // u = (prach_fmt < 4) ? prach_root_sequence_map0_3[fp->prach_config_common.rootSequenceIndex] : + // prach_root_sequence_map4[fp->prach_config_common.rootSequenceIndex]; + + //compute_prach_seq(u,N_ZC, PHY_vars_UE_g[Mod_id]->X_u); + compute_prach_seq(PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.rootSequenceIndex, + PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, + PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig, + PHY_vars_UE_g[Mod_id][CC_id]->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag, + fp->frame_type, + PHY_vars_UE_g[Mod_id][CC_id]->X_u); + + + fp->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon->deltaPUCCH_Shift; + fp->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon->nRB_CQI; + fp->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon->nCS_AN; + fp->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon->n1PUCCH_AN; + fp->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon->referenceSignalPower; + fp->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon->p_b; + + + fp->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; + fp->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; + fp->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; + fp->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled; + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift; + + init_ul_hopping(fp); + fp->soundingrs_ul_config_common.enabled_flag = 0; + + if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon->present==SoundingRS_UL_ConfigCommon_PR_setup) { + fp->soundingrs_ul_config_common.enabled_flag = 1; + fp->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_BandwidthConfig; + fp->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig; + fp->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.ackNackSRS_SimultaneousTransmission; + + if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_MaxUpPts) + fp->soundingrs_ul_config_common.srs_MaxUpPts = 1; + else + fp->soundingrs_ul_config_common.srs_MaxUpPts = 0; + } + + fp->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUSCH; + fp->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon->alpha; + fp->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUCCH; + fp->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaPreambleMsg3; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1; + fp->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1b; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2a; + fp->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2b; + + fp->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon->maxHARQ_Msg3Tx; + + // Now configure some of the Physical Channels + if (radioResourceConfigCommon->antennaInfoCommon) + fp->nb_antennas_tx = (1<antennaInfoCommon->antennaPortsCount); + else + fp->nb_antennas_tx = 1; + + //PHICH + if (radioResourceConfigCommon->antennaInfoCommon) { + fp->phich_config_common.phich_resource = radioResourceConfigCommon->phich_Config->phich_Resource; + fp->phich_config_common.phich_duration = radioResourceConfigCommon->phich_Config->phich_Duration; + } + + //Target CellId + fp->Nid_cell = mobilityControlInfo->targetPhysCellId; + fp->nushift = fp->Nid_cell%6; + + // PUCCH + init_ncs_cell(fp,PHY_vars_UE_g[Mod_id][CC_id]->ncs_cell); + + init_ul_hopping(fp); + + // RNTI + + + PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[0][eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8); + PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8); + + LOG_I(PHY,"SET C-RNTI %x %x\n",PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[0][eNB_id]->crnti, + PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_id]->crnti); + } + + if(ho_failed) { + LOG_D(PHY,"[UE%d] Handover failed, triggering RACH procedure\n",Mod_id); + memcpy((void *)&PHY_vars_UE_g[Mod_id][CC_id]->frame_parms,(void *)&PHY_vars_UE_g[Mod_id][CC_id]->frame_parms_before_ho, sizeof(LTE_DL_FRAME_PARMS)); + PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_id] = PRACH; + } +} + +void phy_config_meas_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,uint8_t n_adj_cells,unsigned int *adj_cell_id) +{ + + PHY_MEASUREMENTS *phy_meas = &PHY_vars_UE_g[Mod_id][CC_id]->measurements; + int i; + + LOG_I(PHY,"Configuring inter-cell measurements for %d cells, ids: \n",n_adj_cells); + + for (i=0; iframe_parms,PHY_vars_UE_g[Mod_id][CC_id]->lte_gold_table[i+1],adj_cell_id[i]); + } + + phy_meas->n_adj_cells = n_adj_cells; + memcpy((void*)phy_meas->adj_cell_id,(void *)adj_cell_id,n_adj_cells*sizeof(unsigned int)); + +} + +#if defined(Rel10) || defined(Rel14) +void phy_config_dedicated_scell_ue(uint8_t Mod_id, + uint8_t eNB_index, + SCellToAddMod_r10_t *sCellToAddMod_r10, + int CC_id) +{ + +} +#endif + + +void phy_config_harq_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id, + uint16_t max_harq_tx ) +{ + + PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + phy_vars_ue->ulsch[eNB_id]->Mlimit = max_harq_tx; +} + +extern uint16_t beta_cqi[16]; + +void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t eNB_id, + struct PhysicalConfigDedicated *physicalConfigDedicated ) +{ + + static uint8_t first_dedicated_configuration = 0; + PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + + phy_vars_ue->total_TBS[eNB_id]=0; + phy_vars_ue->total_TBS_last[eNB_id]=0; + phy_vars_ue->bitrate[eNB_id]=0; + phy_vars_ue->total_received_bits[eNB_id]=0; + phy_vars_ue->dlsch_errors[eNB_id]=0; + phy_vars_ue->dlsch_errors_last[eNB_id]=0; + phy_vars_ue->dlsch_received[eNB_id]=0; + phy_vars_ue->dlsch_received_last[eNB_id]=0; + phy_vars_ue->dlsch_fer[eNB_id]=0; + + phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1; + phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1; + + if (physicalConfigDedicated) { + LOG_D(PHY,"[UE %d] Received physicalConfigDedicated from eNB %d\n",Mod_id, eNB_id); + LOG_D(PHY,"------------------------------------------------------------------------\n"); + + if (physicalConfigDedicated->pdsch_ConfigDedicated) { + phy_vars_ue->pdsch_config_dedicated[eNB_id].p_a=physicalConfigDedicated->pdsch_ConfigDedicated->p_a; + LOG_D(PHY,"pdsch_config_dedicated.p_a %d\n",phy_vars_ue->pdsch_config_dedicated[eNB_id].p_a); + LOG_D(PHY,"\n"); + } + + if (physicalConfigDedicated->pucch_ConfigDedicated) { + if (physicalConfigDedicated->pucch_ConfigDedicated->ackNackRepetition.present==PUCCH_ConfigDedicated__ackNackRepetition_PR_release) + phy_vars_ue->pucch_config_dedicated[eNB_id].ackNackRepetition=0; + else { + phy_vars_ue->pucch_config_dedicated[eNB_id].ackNackRepetition=1; + } + + if (physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode) + phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode = *physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode; + else + phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode = bundling; + + if ( phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode == multiplexing) + LOG_D(PHY,"pucch_config_dedicated.tdd_AckNackFeedbackMode = multiplexing\n"); + else + LOG_D(PHY,"pucch_config_dedicated.tdd_AckNackFeedbackMode = bundling\n"); + } + + if (physicalConfigDedicated->pusch_ConfigDedicated) { + phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_ACK_Index; + phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index; + phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index; + + + LOG_D(PHY,"pusch_config_dedicated.betaOffset_ACK_Index %d\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index); + LOG_D(PHY,"pusch_config_dedicated.betaOffset_RI_Index %d\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index); + LOG_D(PHY,"pusch_config_dedicated.betaOffset_CQI_Index %d => %d)\n",phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index,beta_cqi[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index]); + LOG_D(PHY,"\n"); + + + } + + if (physicalConfigDedicated->uplinkPowerControlDedicated) { + + phy_vars_ue->ul_power_control_dedicated[eNB_id].p0_UE_PUSCH = physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUSCH; + phy_vars_ue->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled= physicalConfigDedicated->uplinkPowerControlDedicated->deltaMCS_Enabled; + phy_vars_ue->ul_power_control_dedicated[eNB_id].accumulationEnabled= physicalConfigDedicated->uplinkPowerControlDedicated->accumulationEnabled; + phy_vars_ue->ul_power_control_dedicated[eNB_id].p0_UE_PUCCH= physicalConfigDedicated->uplinkPowerControlDedicated->p0_UE_PUCCH; + phy_vars_ue->ul_power_control_dedicated[eNB_id].pSRS_Offset= physicalConfigDedicated->uplinkPowerControlDedicated->pSRS_Offset; + phy_vars_ue->ul_power_control_dedicated[eNB_id].filterCoefficient= *physicalConfigDedicated->uplinkPowerControlDedicated->filterCoefficient; + LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUSCH %d\n",phy_vars_ue->ul_power_control_dedicated[eNB_id].p0_UE_PUSCH); + LOG_D(PHY,"ul_power_control_dedicated.deltaMCS_Enabled %d\n",phy_vars_ue->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled); + LOG_D(PHY,"ul_power_control_dedicated.accumulationEnabled %d\n",phy_vars_ue->ul_power_control_dedicated[eNB_id].accumulationEnabled); + LOG_D(PHY,"ul_power_control_dedicated.p0_UE_PUCCH %d\n",phy_vars_ue->ul_power_control_dedicated[eNB_id].p0_UE_PUCCH); + LOG_D(PHY,"ul_power_control_dedicated.pSRS_Offset %d\n",phy_vars_ue->ul_power_control_dedicated[eNB_id].pSRS_Offset); + LOG_D(PHY,"ul_power_control_dedicated.filterCoefficient %d\n",phy_vars_ue->ul_power_control_dedicated[eNB_id].filterCoefficient); + LOG_D(PHY,"\n"); + } + + if (physicalConfigDedicated->antennaInfo) { + phy_vars_ue->transmission_mode[eNB_id] = 1+(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode); + LOG_I(PHY,"Transmission Mode %d\n",phy_vars_ue->transmission_mode[eNB_id]); + switch(physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode) { + case AntennaInfoDedicated__transmissionMode_tm1: + phy_vars_ue->transmission_mode[eNB_id] = 1; + break; + case AntennaInfoDedicated__transmissionMode_tm2: + phy_vars_ue->transmission_mode[eNB_id] = 2; + break; + case AntennaInfoDedicated__transmissionMode_tm3: + phy_vars_ue->transmission_mode[eNB_id] = 3; + break; + case AntennaInfoDedicated__transmissionMode_tm4: + phy_vars_ue->transmission_mode[eNB_id] = 4; + break; + case AntennaInfoDedicated__transmissionMode_tm5: + phy_vars_ue->transmission_mode[eNB_id] = 5; + break; + case AntennaInfoDedicated__transmissionMode_tm6: + phy_vars_ue->transmission_mode[eNB_id] = 6; + break; + case AntennaInfoDedicated__transmissionMode_tm7: + lte_gold_ue_spec_port5(phy_vars_ue->lte_gold_uespec_port5_table, phy_vars_ue->frame_parms.Nid_cell, phy_vars_ue->pdcch_vars[0][eNB_id]->crnti); + phy_vars_ue->transmission_mode[eNB_id] = 7; + break; + default: + LOG_E(PHY,"Unknown transmission mode!\n"); + break; + } + } else { + LOG_D(PHY,"[UE %d] Received NULL physicalConfigDedicated->antennaInfo from eNB %d\n",Mod_id, eNB_id); + } + + if (physicalConfigDedicated->schedulingRequestConfig) { + if (physicalConfigDedicated->schedulingRequestConfig->present == SchedulingRequestConfig_PR_setup) { + phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex = physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex; + phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex=physicalConfigDedicated->schedulingRequestConfig->choice.setup.sr_ConfigIndex; + phy_vars_ue->scheduling_request_config[eNB_id].dsr_TransMax=physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax; + + LOG_D(PHY,"scheduling_request_config.sr_PUCCH_ResourceIndex %d\n",phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + LOG_D(PHY,"scheduling_request_config.sr_ConfigIndex %d\n",phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex); + LOG_D(PHY,"scheduling_request_config.dsr_TransMax %d\n",phy_vars_ue->scheduling_request_config[eNB_id].dsr_TransMax); + } + + LOG_D(PHY,"------------------------------------------------------------\n"); + + } + + if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated) { + + phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = 0; + if (physicalConfigDedicated->soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) { + phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = 1; + phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].duration = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.duration; + phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].cyclicShift = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift; + phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].freqDomainPosition = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition; + phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_Bandwidth = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth; + phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_ConfigIndex = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex; + phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_HoppingBandwidth = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth; + phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].transmissionComb = physicalConfigDedicated->soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb; + + + LOG_D(PHY,"soundingrs_ul_config_dedicated.srs_ConfigIndex %d\n",phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id].srs_ConfigIndex); + } + + LOG_D(PHY,"------------------------------------------------------------\n"); + + } + + + if (physicalConfigDedicated->cqi_ReportConfig) { + if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic) { + // configure PUSCH CQI reporting + phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic; + if ((phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm12) && + (phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm30) && + (phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic != rm31)) + LOG_E(PHY,"Unsupported Aperiodic CQI Feedback Mode : %d\n",phy_vars_ue->cqi_report_config[eNB_id].cqi_ReportModeAperiodic); + } + if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic) { + if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_setup) { + // configure PUCCH CQI reporting + phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex; + phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex; + if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex) + phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = *physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.ri_ConfigIndex; + } + else if (physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_release) { + // handle release + phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1; + phy_vars_ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1; + } + } + } + +#ifdef CBA + + if (physicalConfigDedicated->pusch_CBAConfigDedicated_vlola) { + phy_vars_ue->pusch_ca_config_dedicated[eNB_id].betaOffset_CA_Index = (uint16_t) *physicalConfigDedicated->pusch_CBAConfigDedicated_vlola->betaOffset_CBA_Index; + phy_vars_ue->pusch_ca_config_dedicated[eNB_id].cShift = (uint16_t) *physicalConfigDedicated->pusch_CBAConfigDedicated_vlola->cShift_CBA; + LOG_D(PHY,"[UE %d ] physicalConfigDedicated pusch CBA config dedicated: beta offset %d cshift %d \n",Mod_id, + phy_vars_ue->pusch_ca_config_dedicated[eNB_id].betaOffset_CA_Index, + phy_vars_ue->pusch_ca_config_dedicated[eNB_id].cShift); + } + +#endif + } else { + LOG_D(PHY,"[PHY][UE %d] Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id,eNB_id); + return; + } + + // fill cqi parameters for periodic CQI reporting + get_cqipmiri_params(phy_vars_ue,eNB_id); + + // disable MIB SIB decoding once we are on connected mode + first_dedicated_configuration ++; + if(first_dedicated_configuration > 1) + { + LOG_I(PHY,"Disable SIB MIB decoding \n"); + phy_vars_ue->decode_SIB = 0; + phy_vars_ue->decode_MIB = 0; + } + //phy_vars_ue->pdcch_vars[1][eNB_id]->crnti = phy_vars_ue->pdcch_vars[0][eNB_id]->crnti; + if(phy_vars_ue->pdcch_vars[0][eNB_id]->crnti == 0x1234) + phy_vars_ue->pdcch_vars[0][eNB_id]->crnti = phy_vars_ue->pdcch_vars[1][eNB_id]->crnti; + else + phy_vars_ue->pdcch_vars[1][eNB_id]->crnti = phy_vars_ue->pdcch_vars[0][eNB_id]->crnti; + + LOG_I(PHY,"C-RNTI %x %x \n", phy_vars_ue->pdcch_vars[0][eNB_id]->crnti, + phy_vars_ue->pdcch_vars[1][eNB_id]->crnti); + + +} + +/*! \brief Helper function to allocate memory for DLSCH data structures. + * \param[out] pdsch Pointer to the LTE_UE_PDSCH structure to initialize. + * \param[in] frame_parms LTE_DL_FRAME_PARMS structure. + * \note This function is optimistic in that it expects malloc() to succeed. + */ +void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS* const fp ) +{ + AssertFatal( pdsch, "pdsch==0" ); + + pdsch->pmi_ext = (uint8_t*)malloc16_clear( fp->N_RB_DL ); + pdsch->llr[0] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); + pdsch->llr128 = (int16_t**)malloc16_clear( sizeof(int16_t*) ); + // FIXME! no further allocation for (int16_t*)pdsch->llr128 !!! expect SIGSEGV + // FK, 11-3-2015: this is only as a temporary pointer, no memory is stored there + + + pdsch->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch->rxdataF_uespec_pilots = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch->rxdataF_comp0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) ); + pdsch->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch->dl_bf_ch_estimates = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch->dl_bf_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + //pdsch->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + //pdsch->dl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch->dl_ch_mag0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pdsch->dl_ch_magb0 = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + + + // the allocated memory size is fixed: + AssertFatal( fp->nb_antennas_rx <= 2, "nb_antennas_rx > 2" ); + + for (int i=0; inb_antennas_rx; i++) { + pdsch->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) ); + + for (int j=0; j<4; j++) { //fp->nb_antennas_tx; j++) + const int idx = (j<<1)+i; + const size_t num = 7*2*fp->N_RB_DL*12; + pdsch->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + pdsch->rxdataF_uespec_pilots[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * fp->N_RB_DL*12); + pdsch->rxdataF_comp0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + pdsch->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + pdsch->dl_bf_ch_estimates[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * fp->ofdm_symbol_size*7*2); + pdsch->dl_bf_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + //pdsch->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + //pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + pdsch->dl_ch_mag0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + pdsch->dl_ch_magb0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + } + } +} + +int init_lte_ue_signal(PHY_VARS_UE *ue, + int nb_connected_eNB, + uint8_t abstraction_flag) +{ + + // create shortcuts + LTE_DL_FRAME_PARMS* const fp = &ue->frame_parms; + LTE_UE_COMMON* const common_vars = &ue->common_vars; + LTE_UE_PDSCH** const pdsch_vars_SI = ue->pdsch_vars_SI; + LTE_UE_PDSCH** const pdsch_vars_ra = ue->pdsch_vars_ra; + LTE_UE_PDSCH** const pdsch_vars_p = ue->pdsch_vars_p; + LTE_UE_PDSCH** const pdsch_vars_mch = ue->pdsch_vars_MCH; + LTE_UE_PDSCH* (*pdsch_vars_th)[][NUMBER_OF_CONNECTED_eNB_MAX+1] = &ue->pdsch_vars; + LTE_UE_PDCCH* (*pdcch_vars_th)[][NUMBER_OF_CONNECTED_eNB_MAX] = &ue->pdcch_vars; + LTE_UE_PBCH** const pbch_vars = ue->pbch_vars; + LTE_UE_PRACH** const prach_vars = ue->prach_vars; + + + + int i,j,k,l; + int eNB_id; + int th_id; + + LOG_D(PHY,"Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx); + LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST); + + + + init_frame_parms(&ue->frame_parms,1); + init_lte_top(&ue->frame_parms); + init_ul_hopping(&ue->frame_parms); + + + // many memory allocation sizes are hard coded + AssertFatal( fp->nb_antennas_rx <= 2, "hard coded allocation for ue_common_vars->dl_ch_estimates[eNB_id]" ); + AssertFatal( ue->n_connected_eNB <= NUMBER_OF_CONNECTED_eNB_MAX, "n_connected_eNB is too large" ); + // init phy_vars_ue + + for (i=0; i<4; i++) { + ue->rx_gain_max[i] = 135; + ue->rx_gain_med[i] = 128; + ue->rx_gain_byp[i] = 120; + } + + ue->n_connected_eNB = nb_connected_eNB; + + for(eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) { + ue->total_TBS[eNB_id] = 0; + ue->total_TBS_last[eNB_id] = 0; + ue->bitrate[eNB_id] = 0; + ue->total_received_bits[eNB_id] = 0; + } + + for (i=0;i<10;i++) + ue->tx_power_dBm[i]=-127; + + + + // init TX buffers + + common_vars->txdata = (int32_t**)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) ); + common_vars->txdataF = (int32_t **)malloc16( fp->nb_antennas_tx*sizeof(int32_t*) ); + + for (i=0; inb_antennas_tx; i++) { + + common_vars->txdata[i] = (int32_t*)malloc16_clear( fp->samples_per_tti*10*sizeof(int32_t) ); + common_vars->txdataF[i] = (int32_t *)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_tti*10*sizeof(int32_t) ); + } + + // init RX buffers + + common_vars->rxdata = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->common_vars_rx_data_per_thread[0].rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + common_vars->common_vars_rx_data_per_thread[1].rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + + for (i=0; inb_antennas_rx; i++) { + common_vars->rxdata[i] = (int32_t*) malloc16_clear( (fp->samples_per_tti*10+2048)*sizeof(int32_t) ); + common_vars->common_vars_rx_data_per_thread[0].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) ); + common_vars->common_vars_rx_data_per_thread[1].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) ); + } + + + // Channel estimates + for (eNB_id=0; eNB_id<7; eNB_id++) { + for (th_id=0; th_idcommon_vars_rx_data_per_thread[th_id].dl_ch_estimates[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); + common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates_time[eNB_id] = (int32_t**)malloc16_clear(8*sizeof(int32_t*)); + } + + for (i=0; inb_antennas_rx; i++) + for (j=0; j<4; j++) { + int idx = (j<<1) + i; + for (th_id=0; th_idcommon_vars_rx_data_per_thread[th_id].dl_ch_estimates[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) ); + common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates_time[eNB_id][idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 ); + } + } + } + + // DLSCH + for (eNB_id=0; eNB_idn_connected_eNB; eNB_id++) { + for (th_id=0; th_idllr_shifts = (uint8_t*)malloc16_clear(7*2*fp->N_RB_DL*12); + (*pdsch_vars_th)[th_id][eNB_id]->llr_shifts_p = (*pdsch_vars_th)[0][eNB_id]->llr_shifts; + (*pdsch_vars_th)[th_id][eNB_id]->llr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); + (*pdsch_vars_th)[th_id][eNB_id]->llr128_2ndstream = (int16_t**)malloc16_clear( sizeof(int16_t*) ); + (*pdsch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t*) ); + } + + for (int i=0; inb_antennas_rx; i++){ + for (th_id=0; th_idrho[i] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); + } + + } + for (th_id=0; th_iddl_ch_rho2_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + } + + for (i=0; inb_antennas_rx; i++) + for (j=0; j<4; j++) { + const int idx = (j<<1)+i; + const size_t num = 7*2*fp->N_RB_DL*12+4; + for (th_id=0; th_iddl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + } + + } + + //const size_t num = 7*2*fp->N_RB_DL*12+4; + for (k=0;k<8;k++) { //harq_pid + for (l=0;l<8;l++) { //round + for (th_id=0; th_idrxdataF_comp1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + (*pdsch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + (*pdsch_vars_th)[th_id][eNB_id]->dl_ch_mag1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + (*pdsch_vars_th)[th_id][eNB_id]->dl_ch_magb1[k][l] = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + } + + + for (int i=0; inb_antennas_rx; i++) + for (int j=0; j<4; j++) { //frame_parms->nb_antennas_tx; j++) + const int idx = (j<<1)+i; + for (th_id=0; th_iddl_ch_rho_ext[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); + (*pdsch_vars_th)[th_id][eNB_id]->rxdataF_comp1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); + (*pdsch_vars_th)[th_id][eNB_id]->dl_ch_mag1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); + (*pdsch_vars_th)[th_id][eNB_id]->dl_ch_magb1[k][l][idx] = (int32_t*)malloc16_clear( 7*2*sizeof(int32_t)*(fp->N_RB_DL*12) ); + } + + } + } + } + phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp ); + phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp ); + phy_init_lte_ue__PDSCH( pdsch_vars_p[eNB_id], fp ); + phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp ); + + // 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE + for (th_id=0; th_idllr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); + (*pdcch_vars_th)[th_id][eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); + (*pdcch_vars_th)[th_id][eNB_id]->wbar = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); + (*pdcch_vars_th)[th_id][eNB_id]->e_rx = (int8_t*)malloc16_clear( 4*2*100*12 ); + + (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + (*pdcch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + } + + for (i=0; inb_antennas_rx; i++) { + //ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) ); + for (th_id=0; th_idrho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) ); + } + + for (j=0; j<4; j++) { //fp->nb_antennas_tx; j++) + int idx = (j<<1)+i; + // size_t num = 7*2*fp->N_RB_DL*12; + size_t num = 4*100*12; // 4 symbols, 100 PRBs, 12 REs per PRB + for (th_id=0; th_idrxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + } + } + } + phy_init_lte_ue__PDSCH( pdsch_vars_SI[eNB_id], fp ); + phy_init_lte_ue__PDSCH( pdsch_vars_ra[eNB_id], fp ); + phy_init_lte_ue__PDSCH( pdsch_vars_p[eNB_id], fp ); + phy_init_lte_ue__PDSCH( pdsch_vars_mch[eNB_id], fp ); + + // 100 PRBs * 12 REs/PRB * 4 PDCCH SYMBOLS * 2 LLRs/RE + for (th_id=0; th_idllr = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); + (*pdcch_vars_th)[th_id][eNB_id]->llr16 = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); + (*pdcch_vars_th)[th_id][eNB_id]->wbar = (uint16_t*)malloc16_clear( 2*4*100*12*sizeof(uint16_t) ); + (*pdcch_vars_th)[th_id][eNB_id]->e_rx = (int8_t*)malloc16_clear( 4*2*100*12 ); + + (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + (*pdcch_vars_th)[th_id][eNB_id]->rho = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + } + + for (i=0; inb_antennas_rx; i++) { + //ue_pdcch_vars[eNB_id]->rho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->N_RB_DL*12*7*2) ); + + for (th_id=0; th_idrho[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(100*12*4) ); + } + + for (j=0; j<4; j++) { //fp->nb_antennas_tx; j++) + int idx = (j<<1)+i; + // size_t num = 7*2*fp->N_RB_DL*12; + size_t num = 4*100*12; // 4 symbols, 100 PRBs, 12 REs per PRB + for (th_id=0; th_idrxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + (*pdcch_vars_th)[th_id][eNB_id]->rxdataF_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + (*pdcch_vars_th)[th_id][eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); + } + } + } + + // PBCH + pbch_vars[eNB_id]->rxdataF_ext = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + pbch_vars[eNB_id]->rxdataF_comp = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pbch_vars[eNB_id]->dl_ch_estimates_ext = (int32_t**)malloc16_clear( 8*sizeof(int32_t*) ); + pbch_vars[eNB_id]->llr = (int8_t*)malloc16_clear( 1920 ); + prach_vars[eNB_id]->prachF = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); + prach_vars[eNB_id]->prach = (int16_t*)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); + + for (i=0; inb_antennas_rx; i++) { + pbch_vars[eNB_id]->rxdataF_ext[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); + + for (j=0; j<4; j++) {//fp->nb_antennas_tx;j++) { + int idx = (j<<1)+i; + pbch_vars[eNB_id]->rxdataF_comp[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); + pbch_vars[eNB_id]->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*6*12*4 ); + } + } + + + pbch_vars[eNB_id]->decoded_output = (uint8_t*)malloc16_clear( 64 ); + } + + // initialization for the last instance of pdsch_vars (used for MU-MIMO) + for (th_id=0; th_idllr[1] = (int16_t*)malloc16_clear( (8*((3*8*6144)+12))*sizeof(int16_t) ); + } + + + ue->sinr_CQI_dB = (double*) malloc16_clear( fp->N_RB_DL*12*sizeof(double) ); + + ue->init_averaging = 1; + // default value until overwritten by RRCConnectionReconfiguration + if (fp->nb_antenna_ports_eNB==2) + ue->pdsch_config_dedicated->p_a = dBm3; + else + ue->pdsch_config_dedicated->p_a = dB0; + + // set channel estimation to do linear interpolation in time + ue->high_speed_flag = 1; + ue->ch_est_alpha = 24576; + + // enable MIB/SIB decoding by default + ue->decode_MIB = 1; + ue->decode_SIB = 1; + + init_prach_tables(839); + + + return 0; +} + +void init_lte_ue_transport(PHY_VARS_UE *ue,int abstraction_flag) { + + int i,j,k; + + for (i=0; idlsch[k][i][j] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag))!=NULL,"Can't get ue dlsch structures\n"); + + LOG_D(PHY,"dlsch[%d][%d][%d] => %p\n",k,i,j,ue->dlsch[i][j]); + } + } + + AssertFatal((ue->ulsch[i] = new_ue_ulsch(ue->frame_parms.N_RB_UL, abstraction_flag))!=NULL,"Can't get ue ulsch structures\n"); + + ue->dlsch_SI[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag); + ue->dlsch_ra[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,ue->frame_parms.N_RB_DL, abstraction_flag); + + ue->transmission_mode[i] = ue->frame_parms.nb_antenna_ports_eNB==1 ? 1 : 2; + } + + ue->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; + + ue->dlsch_MCH[0] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS_MBSFN,ue->frame_parms.N_RB_DL,0); + +} + diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c index 0db51e8b17..d510fc7261 100644 --- a/openair1/PHY/INIT/lte_param_init.c +++ b/openair1/PHY/INIT/lte_param_init.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include @@ -9,10 +30,11 @@ #include "PHY/defs.h" #include "PHY/extern.h" -extern PHY_VARS_eNB *PHY_vars_eNB; -extern PHY_VARS_UE *PHY_vars_UE; +extern PHY_VARS_eNB *eNB; +extern PHY_VARS_UE *UE; -void lte_param_init(unsigned char N_tx, +void lte_param_init(unsigned char N_tx_port_eNB, + unsigned char N_tx_phy, unsigned char N_rx, unsigned char transmission_mode, uint8_t extended_prefix_flag, @@ -25,81 +47,88 @@ void lte_param_init(unsigned char N_tx, uint32_t perfect_ce) { - LTE_DL_FRAME_PARMS *lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms; int i; - printf("Start lte_param_init\n"); - PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB)); - PHY_vars_UE = malloc(sizeof(PHY_VARS_UE)); - //PHY_config = malloc(sizeof(PHY_CONFIG)); - mac_xface = malloc(sizeof(MAC_xface)); + eNB = malloc(sizeof(PHY_VARS_eNB)); + UE = malloc(sizeof(PHY_VARS_UE)); + memset((void*)eNB,0,sizeof(PHY_VARS_eNB)); + memset((void*)UE,0,sizeof(PHY_VARS_UE)); + srand(0); randominit(0); set_taus_seed(0); - lte_frame_parms = &(PHY_vars_eNB->lte_frame_parms); + frame_parms = &(eNB->frame_parms); - lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz - lte_frame_parms->N_RB_UL = N_RB_DL; - lte_frame_parms->threequarter_fs = threequarter_fs; - lte_frame_parms->Ncp = extended_prefix_flag; - lte_frame_parms->Ncp_UL = extended_prefix_flag; - lte_frame_parms->Nid_cell = Nid_cell; - lte_frame_parms->nushift = Nid_cell%6; - lte_frame_parms->nb_antennas_tx = N_tx; - lte_frame_parms->nb_antennas_rx = N_rx; - lte_frame_parms->nb_antennas_tx_eNB = N_tx; - lte_frame_parms->phich_config_common.phich_resource = one; - lte_frame_parms->tdd_config = tdd_config; - lte_frame_parms->frame_type = frame_type; - // lte_frame_parms->Csrs = 2; - // lte_frame_parms->Bsrs = 0; - // lte_frame_parms->kTC = 0;44 - // lte_frame_parms->n_RRC = 0; - lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0; + frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz + frame_parms->N_RB_UL = N_RB_DL; + frame_parms->threequarter_fs = threequarter_fs; + frame_parms->Ncp = extended_prefix_flag; + frame_parms->Ncp_UL = extended_prefix_flag; + frame_parms->Nid_cell = Nid_cell; + frame_parms->nushift = Nid_cell%6; + frame_parms->nb_antennas_tx = N_tx_phy; + frame_parms->nb_antennas_rx = N_rx; + frame_parms->nb_antenna_ports_eNB = N_tx_port_eNB; + frame_parms->phich_config_common.phich_resource = oneSixth; + frame_parms->phich_config_common.phich_duration = normal; + frame_parms->tdd_config = tdd_config; + frame_parms->frame_type = frame_type; + // frame_parms->Csrs = 2; + // frame_parms->Bsrs = 0; + // frame_parms->kTC = 0;44 + // frame_parms->n_RRC = 0; - init_frame_parms(lte_frame_parms,osf); + init_frame_parms(frame_parms,osf); - //copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing)); + //copy_lte_parms_to_phy_framing(frame_parms, &(PHY_config->PHY_framing)); - // phy_init_top(lte_frame_parms); //allocation + // phy_init_top(frame_parms); //allocation - PHY_vars_UE->is_secondary_ue = 0; - PHY_vars_UE->lte_frame_parms = *lte_frame_parms; - PHY_vars_eNB->lte_frame_parms = *lte_frame_parms; + UE->is_secondary_ue = 0; + UE->frame_parms = *frame_parms; + eNB->frame_parms = *frame_parms; - phy_init_lte_top(lte_frame_parms); - dump_frame_parms(lte_frame_parms); + eNB->transmission_mode[0] = transmission_mode; + UE->transmission_mode[0] = transmission_mode; - PHY_vars_UE->PHY_measurements.n_adj_cells=0; - PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1; - PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2; + init_lte_top(frame_parms); + dump_frame_parms(frame_parms); + + UE->measurements.n_adj_cells=0; + UE->measurements.adj_cell_id[0] = Nid_cell+1; + UE->measurements.adj_cell_id[1] = Nid_cell+2; for (i=0; i<3; i++) - lte_gold(lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i); + lte_gold(frame_parms,UE->lte_gold_table[i],Nid_cell+i); - phy_init_lte_ue(PHY_vars_UE,1,0); - phy_init_lte_eNB(PHY_vars_eNB,0,0,0); + init_lte_ue(UE,1,0); + phy_init_lte_eNB(eNB,0,0); - generate_pcfich_reg_mapping(&PHY_vars_UE->lte_frame_parms); - generate_phich_reg_mapping(&PHY_vars_UE->lte_frame_parms); + generate_pcfich_reg_mapping(&UE->frame_parms); + generate_phich_reg_mapping(&UE->frame_parms); // DL power control init - if (transmission_mode == 1) { - PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 0; - PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 0; + //if (transmission_mode == 1) { + if (transmission_mode == 1 || transmission_mode ==7) { + eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB + ((eNB->frame_parms).pdsch_config_common).p_b = 0; + UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB + ((UE->frame_parms).pdsch_config_common).p_b = 0; } else { // rho_a = rhob - PHY_vars_eNB->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 1; - PHY_vars_UE->pdsch_config_dedicated->p_a = dB0; // 4 = 0dB - ((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 1; + eNB->pdsch_config_dedicated->p_a = dBm3; // 4 = 0dB + ((eNB->frame_parms).pdsch_config_common).p_b = 1; + UE->pdsch_config_dedicated->p_a = dBm3; // 4 = 0dB + ((UE->frame_parms).pdsch_config_common).p_b = 1; } - PHY_vars_UE->perfect_ce = perfect_ce; + UE->perfect_ce = perfect_ce; + + /* the UE code is multi-thread "aware", we need to setup this array */ + for (i = 0; i < 10; i++) UE->current_thread_id[i] = i % 2; printf("Done lte_param_init\n"); diff --git a/openair1/PHY/INIT/lte_parms.c b/openair1/PHY/INIT/lte_parms.c index fa0e731af9..2f2bd95617 100644 --- a/openair1/PHY/INIT/lte_parms.c +++ b/openair1/PHY/INIT/lte_parms.c @@ -1,42 +1,56 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" #include "log.h" +uint16_t dl_S_table_normal[10]={3,9,10,11,12,3,9,10,11,6}; +uint16_t dl_S_table_extended[10]={3,8,9,10,3,8,9,5,0,0}; + +void set_S_config(LTE_DL_FRAME_PARMS *fp) { + + int X = fp->srsX; + + fp->ul_symbols_in_S_subframe=(1+X); + + if ((fp->Ncp==EXTENDED) && (fp->tdd_config_S>7)) + AssertFatal(1==0,"Illegal S subframe configuration for Extended Prefix mode\n"); + + fp->dl_symbols_in_S_subframe = (fp->Ncp==NORMAL)?dl_S_table_normal[fp->tdd_config_S] : dl_S_table_extended[fp->tdd_config_S]; + + +} + int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) { uint8_t log2_osf; +#if DISABLE_LOG_X + printf("Initializing frame parms for N_RB_DL %d, Ncp %d, osf %d\n",frame_parms->N_RB_DL,frame_parms->Ncp,osf); +#else LOG_I(PHY,"Initializing frame parms for N_RB_DL %d, Ncp %d, osf %d\n",frame_parms->N_RB_DL,frame_parms->Ncp,osf); +#endif - if (frame_parms->Ncp==1) { + if (frame_parms->Ncp==EXTENDED) { frame_parms->nb_prefix_samples0=512; frame_parms->nb_prefix_samples = 512; frame_parms->symbols_per_tti = 12; @@ -44,8 +58,10 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) frame_parms->nb_prefix_samples0 = 160; frame_parms->nb_prefix_samples = 144; frame_parms->symbols_per_tti = 14; + } + switch(osf) { case 1: log2_osf = 0; @@ -68,17 +84,15 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) break; default: - printf("Illegal oversampling %d\n",osf); - return(-1); + AssertFatal(1==0,"Illegal oversampling %d\n",osf); + } switch (frame_parms->N_RB_DL) { case 100: - if (osf>1) { - printf("Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL); - return(-1); - } + AssertFatal(osf==1,"Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL); + if (frame_parms->threequarter_fs) { frame_parms->ofdm_symbol_size = 1536; @@ -97,11 +111,7 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) break; case 75: - if (osf>1) { - printf("Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL); - return(-1); - } - + AssertFatal(osf==1,"Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL); frame_parms->ofdm_symbol_size = 1536; frame_parms->samples_per_tti = 23040; @@ -113,10 +123,7 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) break; case 50: - if (osf>1) { - printf("Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL); - return(-1); - } + AssertFatal(osf==1,"Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL); frame_parms->ofdm_symbol_size = 1024*osf; frame_parms->samples_per_tti = 15360*osf; @@ -128,10 +135,8 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) break; case 25: - if (osf>2) { - printf("Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL); - return(-1); - } + AssertFatal(osf<=2,"Illegal oversampling %d for N_RB_DL %d\n",osf,frame_parms->N_RB_DL); + frame_parms->ofdm_symbol_size = 512*osf; @@ -167,12 +172,14 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) break; default: - printf("init_frame_parms: Error: Number of resource blocks (N_RB_DL %d) undefined, frame_parms = %p \n",frame_parms->N_RB_DL, frame_parms); - return(-1); + AssertFatal(1==0,"Number of resource blocks (N_RB_DL %d) undefined, frame_parms = %p \n",frame_parms->N_RB_DL, frame_parms); + break; } - printf("lte_parms.c: Setting N_RB_DL to %d, ofdm_symbol_size %d\n",frame_parms->N_RB_DL, frame_parms->ofdm_symbol_size); + LOG_I(PHY,"lte_parms.c: Setting N_RB_DL to %d, ofdm_symbol_size %d\n",frame_parms->N_RB_DL, frame_parms->ofdm_symbol_size); + + if (frame_parms->frame_type == TDD) set_S_config(frame_parms); // frame_parms->tdd_config=3; return(0); @@ -181,22 +188,22 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf) void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms) { - printf("frame_parms->N_RB_DL=%d\n",frame_parms->N_RB_DL); - printf("frame_parms->N_RB_UL=%d\n",frame_parms->N_RB_UL); - printf("frame_parms->Nid_cell=%d\n",frame_parms->Nid_cell); - printf("frame_parms->Ncp=%d\n",frame_parms->Ncp); - printf("frame_parms->Ncp_UL=%d\n",frame_parms->Ncp_UL); - printf("frame_parms->nushift=%d\n",frame_parms->nushift); - printf("frame_parms->frame_type=%d\n",frame_parms->frame_type); - printf("frame_parms->tdd_config=%d\n",frame_parms->tdd_config); - printf("frame_parms->tdd_config_S=%d\n",frame_parms->tdd_config_S); - printf("frame_parms->mode1_flag=%d\n",frame_parms->mode1_flag); - printf("frame_parms->nb_antennas_tx=%d\n",frame_parms->nb_antennas_tx); - printf("frame_parms->nb_antennas_rx=%d\n",frame_parms->nb_antennas_rx); - printf("frame_parms->ofdm_symbol_size=%d\n",frame_parms->ofdm_symbol_size); - printf("frame_parms->nb_prefix_samples=%d\n",frame_parms->nb_prefix_samples); - printf("frame_parms->nb_prefix_samples0=%d\n",frame_parms->nb_prefix_samples0); - printf("frame_parms->first_carrier_offset=%d\n",frame_parms->first_carrier_offset); - printf("frame_parms->samples_per_tti=%d\n",frame_parms->samples_per_tti); - printf("frame_parms->symbols_per_tti=%d\n",frame_parms->symbols_per_tti); + LOG_I(PHY,"frame_parms->N_RB_DL=%d\n",frame_parms->N_RB_DL); + LOG_I(PHY,"frame_parms->N_RB_UL=%d\n",frame_parms->N_RB_UL); + LOG_I(PHY,"frame_parms->Nid_cell=%d\n",frame_parms->Nid_cell); + LOG_I(PHY,"frame_parms->Ncp=%d\n",frame_parms->Ncp); + LOG_I(PHY,"frame_parms->Ncp_UL=%d\n",frame_parms->Ncp_UL); + LOG_I(PHY,"frame_parms->nushift=%d\n",frame_parms->nushift); + LOG_I(PHY,"frame_parms->frame_type=%d\n",frame_parms->frame_type); + LOG_I(PHY,"frame_parms->tdd_config=%d\n",frame_parms->tdd_config); + LOG_I(PHY,"frame_parms->tdd_config_S=%d\n",frame_parms->tdd_config_S); + LOG_I(PHY,"frame_parms->nb_antenna_ports_eNB=%d\n",frame_parms->nb_antenna_ports_eNB); + LOG_I(PHY,"frame_parms->nb_antennas_tx=%d\n",frame_parms->nb_antennas_tx); + LOG_I(PHY,"frame_parms->nb_antennas_rx=%d\n",frame_parms->nb_antennas_rx); + LOG_I(PHY,"frame_parms->ofdm_symbol_size=%d\n",frame_parms->ofdm_symbol_size); + LOG_I(PHY,"frame_parms->nb_prefix_samples=%d\n",frame_parms->nb_prefix_samples); + LOG_I(PHY,"frame_parms->nb_prefix_samples0=%d\n",frame_parms->nb_prefix_samples0); + LOG_I(PHY,"frame_parms->first_carrier_offset=%d\n",frame_parms->first_carrier_offset); + LOG_I(PHY,"frame_parms->samples_per_tti=%d\n",frame_parms->samples_per_tti); + LOG_I(PHY,"frame_parms->symbols_per_tti=%d\n",frame_parms->symbols_per_tti); } diff --git a/openair1/PHY/INIT/vars.h b/openair1/PHY/INIT/vars.h index 5c046434e6..4690bba42e 100644 --- a/openair1/PHY/INIT/vars.h +++ b/openair1/PHY/INIT/vars.h @@ -1,28 +1,21 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ \ No newline at end of file diff --git a/openair1/PHY/LTE_ESTIMATION/COPYING b/openair1/PHY/LTE_ESTIMATION/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/LTE_ESTIMATION/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c index af72bce967..7272b7247d 100644 --- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c +++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c @@ -1,160 +1,72 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" -#ifdef EXMIMO -#include "openair0_lib.h" -extern int card; -#endif - void -phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, uint32_t rx_power_fil_dB, uint8_t eNB_id) +phy_adjust_gain (PHY_VARS_UE *ue, uint32_t rx_power_fil_dB, uint8_t eNB_id) { -#ifdef EXMIMO - exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr; - uint16_t i; -#endif - LOG_D(PHY,"Gain control: rssi %d (%d,%d)\n", - rx_power_fil_dB, - phy_vars_ue->PHY_measurements.rssi, - phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] + rx_power_fil_dB, + ue->measurements.rssi, + ue->measurements.rx_power_avg_dB[eNB_id] ); // Gain control with hysterisis - // Adjust gain in phy_vars_ue->rx_vars[0].rx_total_gain_dB + // Adjust gain in ue->rx_vars[0].rx_total_gain_dB - if (rx_power_fil_dB < TARGET_RX_POWER - 5) //&& (phy_vars_ue->rx_total_gain_dB < MAX_RF_GAIN) ) - phy_vars_ue->rx_total_gain_dB+=5; - else if (rx_power_fil_dB > TARGET_RX_POWER + 5) //&& (phy_vars_ue->rx_total_gain_dB > MIN_RF_GAIN) ) - phy_vars_ue->rx_total_gain_dB-=5; + if (rx_power_fil_dB < TARGET_RX_POWER - 5) //&& (ue->rx_total_gain_dB < MAX_RF_GAIN) ) + ue->rx_total_gain_dB+=5; + else if (rx_power_fil_dB > TARGET_RX_POWER + 5) //&& (ue->rx_total_gain_dB > MIN_RF_GAIN) ) + ue->rx_total_gain_dB-=5; - if (phy_vars_ue->rx_total_gain_dB>MAX_RF_GAIN) { + if (ue->rx_total_gain_dB>MAX_RF_GAIN) { /* if ((openair_daq_vars.rx_rf_mode==0) && (openair_daq_vars.mode == openair_NOT_SYNCHED)) { openair_daq_vars.rx_rf_mode=1; - phy_vars_ue->rx_total_gain_dB = max(MIN_RF_GAIN,MAX_RF_GAIN-25); + ue->rx_total_gain_dB = max(MIN_RF_GAIN,MAX_RF_GAIN-25); } else { */ - phy_vars_ue->rx_total_gain_dB = MAX_RF_GAIN; - } else if (phy_vars_ue->rx_total_gain_dBrx_total_gain_dB = MAX_RF_GAIN; + } else if (ue->rx_total_gain_dBrx_total_gain_dB = min(MAX_RF_GAIN,MIN_RF_GAIN+25); + ue->rx_total_gain_dB = min(MAX_RF_GAIN,MIN_RF_GAIN+25); } else { */ - phy_vars_ue->rx_total_gain_dB = MIN_RF_GAIN; + ue->rx_total_gain_dB = MIN_RF_GAIN; } - LOG_D(PHY,"Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",phy_vars_ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB); - -#ifdef EXMIMO - - if (phy_vars_ue->rx_total_gain_dB>phy_vars_ue->rx_gain_max[0]) { - phy_vars_ue->rx_total_gain_dB = phy_vars_ue->rx_gain_max[0]; - - for (i=0; ilte_frame_parms.nb_antennas_rx; i++) { - p_exmimo_config->rf.rx_gain[i][0] = 30; - } - - } else if (phy_vars_ue->rx_total_gain_dB<(phy_vars_ue->rx_gain_max[0]-30)) { - // for the moment we stay in max gain mode - phy_vars_ue->rx_total_gain_dB = phy_vars_ue->rx_gain_max[0] - 30; - - for (i=0; ilte_frame_parms.nb_antennas_rx; i++) { - p_exmimo_config->rf.rx_gain[i][0] = 0; - } - - /* - phy_vars_ue->rx_gain_mode[0] = byp; - phy_vars_ue->rx_gain_mode[1] = byp; - exmimo_pci_interface->rf.rf_mode0 = 22991; //bypass - exmimo_pci_interface->rf.rf_mode1 = 22991; //bypass - - if (phy_vars_ue->rx_total_gain_dB<(phy_vars_ue->rx_gain_byp[0]-50)) { - exmimo_pci_interface->rf.rx_gain00 = 0; - exmimo_pci_interface->rf.rx_gain10 = 0; - } - */ - } else { - - for (i=0; ilte_frame_parms.nb_antennas_rx; i++) { - p_exmimo_config->rf.rx_gain[i][0] = 30 - phy_vars_ue->rx_gain_max[0] + phy_vars_ue->rx_total_gain_dB; - } - } - - /* - break; - case med_gain: - case byp_gain: - if (phy_vars_ue->rx_total_gain_dB>phy_vars_ue->rx_gain_byp[0]) { - phy_vars_ue->rx_gain_mode[0] = max_gain; - phy_vars_ue->rx_gain_mode[1] = max_gain; - exmimo_pci_interface->rf.rf_mode0 = 55759; //max gain - exmimo_pci_interface->rf.rf_mode1 = 55759; //max gain - - if (phy_vars_ue->rx_total_gain_dB>phy_vars_ue->rx_gain_max[0]) { - exmimo_pci_interface->rf.rx_gain00 = 50; - exmimo_pci_interface->rf.rx_gain10 = 50; - } - else { - exmimo_pci_interface->rf.rx_gain00 = 50 - phy_vars_ue->rx_gain_max[0] + phy_vars_ue->rx_total_gain_dB; - exmimo_pci_interface->rf.rx_gain10 = 50 - phy_vars_ue->rx_gain_max[1] + phy_vars_ue->rx_total_gain_dB; - } - } - else if (phy_vars_ue->rx_total_gain_dB<(phy_vars_ue->rx_gain_byp[0]-50)) { - exmimo_pci_interface->rf.rx_gain00 = 0; - exmimo_pci_interface->rf.rx_gain10 = 0; - } - else { - exmimo_pci_interface->rf.rx_gain00 = 50 - phy_vars_ue->rx_gain_byp[0] + phy_vars_ue->rx_total_gain_dB; - exmimo_pci_interface->rf.rx_gain10 = 50 - phy_vars_ue->rx_gain_byp[1] + phy_vars_ue->rx_total_gain_dB; - } - break; - default: - exmimo_pci_interface->rf.rx_gain00 = 50; - exmimo_pci_interface->rf.rx_gain10 = 50; - break; - } - */ -#endif + LOG_D(PHY,"Gain control: rx_total_gain_dB = %d (max %d,rxpf %d)\n",ue->rx_total_gain_dB,MAX_RF_GAIN,rx_power_fil_dB); #ifdef DEBUG_PHY - /* if ((phy_vars_ue->frame%100==0) || (phy_vars_ue->frame < 10)) + /* if ((ue->frame%100==0) || (ue->frame < 10)) msg("[PHY][ADJUST_GAIN] frame %d, rx_power = %d, rx_power_fil = %d, rx_power_fil_dB = %d, coef=%d, ncoef=%d, rx_total_gain_dB = %d (%d,%d,%d)\n", - phy_vars_ue->frame,rx_power,rx_power_fil,rx_power_fil_dB,coef,ncoef,phy_vars_ue->rx_total_gain_dB, + ue->frame,rx_power,rx_power_fil,rx_power_fil_dB,coef,ncoef,ue->rx_total_gain_dB, TARGET_RX_POWER,MAX_RF_GAIN,MIN_RF_GAIN); */ #endif //DEBUG_PHY diff --git a/openair1/PHY/LTE_ESTIMATION/bf_freq_domain_filters.m b/openair1/PHY/LTE_ESTIMATION/bf_freq_domain_filters.m new file mode 100644 index 0000000000..e0c0a0f18f --- /dev/null +++ b/openair1/PHY/LTE_ESTIMATION/bf_freq_domain_filters.m @@ -0,0 +1,59 @@ +filt_len = 16; + +F = -3/4:1/4:7/4; +F_l = zeros(8,filt_len); +F_r = zeros(8,filt_len); +F_m = zeros(8,filt_len); + +F2 =-3/5:1/5:8/5; + +for i=0:3 + F_l(i+1,:) = floor(16384*[F(8+i:-1:4) zeros(1,7-i) zeros(1,4)]); + F_r(i+1,:) = floor(16384*[zeros(1,4+i) F(4:end-i) zeros(1,4)]); + F_m(i+1,:) = floor(16384*[F(4-i:8) F(7:-1:1+i) zeros(1,4)]); +end + +for i=0:1 + F_l(i+5,:) = floor(16384*[F(8:-1:4-i) zeros(1,7-i) zeros(1,4)]); + F_r(i+5,:) = floor(16384*[zeros(1,5+i) F2(5+i) F2(7:end-i) zeros(1,4)]); + F_m(i+5,:) = floor(16384*[F(4-i:8) F2(8-i) F2(6:-1:1+i) zeros(1,4)]); +end + +for i=2:3 + F_l(i+5,:) = floor(16384*[F2(end:-1:7) F2(8-i) zeros(1,5) zeros(1,4)]); + F_r(i+5,:) = floor(16384*[zeros(1,4+i) F(4:end-i) zeros(1,4)]); + F_m(i+5,:) = floor(16384*[F2(4-i:6) F2(4+i) F(8:-1:1+i) zeros(1,4)]); +end + + +fd = fopen("filt16_32.h","w"); + +for i=0:3 + fprintf(fd,"short filt%d_l%d[%d] = {\n",filt_len,i,filt_len); + fprintf(fd,"%d,",F_l(i+1,1:end-1)); + fprintf(fd,"%d};\n\n",F_l(i+1,end)); + + fprintf(fd,"short filt%d_r%d[%d] = {\n",filt_len,i,filt_len); + fprintf(fd,"%d,",F_r(i+1,1:end-1)); + fprintf(fd,"%d};\n\n",F_r(i+1,end)); + + fprintf(fd,"short filt%d_m%d[%d] = {\n",filt_len,i,filt_len); + fprintf(fd,"%d,",F_m(i+1,1:end-1)); + fprintf(fd,"%d};\n\n",F_m(i+1,end)); +end + +for i=0:3 + fprintf(fd,"short filt%d_l%d_dc[%d] = {\n",filt_len,i,filt_len); + fprintf(fd,"%d,",F_l(i+5,1:end-1)); + fprintf(fd,"%d};\n\n",F_l(i+5,end)); + + fprintf(fd,"short filt%d_r%d_dc[%d] = {\n",filt_len,i,filt_len); + fprintf(fd,"%d,",F_r(i+5,1:end-1)); + fprintf(fd,"%d};\n\n",F_r(i+5,end)); + + fprintf(fd,"short filt%d_m%d_dc[%d] = {\n",filt_len,i,filt_len); + fprintf(fd,"%d,",F_m(i+5,1:end-1)); + fprintf(fd,"%d};\n\n",F_m(i+5,end)); +end + +fclose(fd); diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h index c20d24e34f..a7b5d14701 100644 --- a/openair1/PHY/LTE_ESTIMATION/defs.h +++ b/openair1/PHY/LTE_ESTIMATION/defs.h @@ -1,47 +1,34 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __LTE_ESTIMATION_DEFS__H__ #define __LTE_ESTIMATION_DEFS__H__ #include "PHY/defs.h" -/* -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif - */ - /** @addtogroup _PHY_PARAMETER_ESTIMATION_BLOCKS_ * @{ */ /*!\brief Timing drift hysterisis in samples*/ -#define SYNCH_HYST 1 +#define SYNCH_HYST 2 /*! \brief This function is used for time-frequency scanning prior to complete cell search. It scans @@ -123,6 +110,12 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, uint8_t l, uint8_t symbol); +int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue, + module_id_t eNB_id, + uint8_t eNB_offset, + uint8_t Ns, + uint8_t p, + uint8_t symbol); int lte_dl_msbfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, module_id_t eNB_id, @@ -137,18 +130,6 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, int subframe, unsigned char l); -/* -#ifdef EMOS -int lte_dl_channel_estimation_emos(int dl_ch_estimates_emos[NB_ANTENNAS_RX*NB_ANTENNAS_TX][N_RB_DL_EMOS*N_PILOTS_PER_RB*N_SLOTS_EMOS], - int **rxdataF, - LTE_DL_FRAME_PARMS *frame_parms, - unsigned char Ns, - unsigned char p, - unsigned char l, - unsigned char sector); -#endif - */ - /*! \brief Frequency offset estimation for LTE We estimate the frequency offset by calculating the phase difference between channel estimates for symbols carrying pilots (l==0 or l==3/4). We take a moving average of the phase difference. @@ -162,7 +143,7 @@ int lte_est_freq_offset(int **dl_ch_estimates, LTE_DL_FRAME_PARMS *frame_parms, int l, int* freq_offset, - int reset); + int reset); int lte_mbsfn_est_freq_offset(int **dl_ch_estimates, LTE_DL_FRAME_PARMS *frame_parms, @@ -181,6 +162,7 @@ This function computes the time domain channel response, finds the peak and adju void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, PHY_VARS_UE *phy_vars_ue, module_id_t eNb_id, + uint8_t subframe, unsigned char clear, short coef); @@ -188,7 +170,9 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue, unsigned int subframe_offset, unsigned char N0_symbol, - unsigned char abstraction_flag); + unsigned char abstraction_flag, + unsigned char rank_adaptation, + uint8_t subframe); //! \brief This function performance RSRP/RSCP measurements void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, @@ -203,7 +187,7 @@ void lte_ue_measurements_emul(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_t @returns Path loss in dB */ int16_t get_PL(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index); -uint32_t get_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index); +double get_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index); uint32_t get_RSRQ(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index); uint8_t get_n_adj_cells(module_id_t Mod_id,uint8_t CC_id); uint32_t get_rx_total_gain_dB(module_id_t Mod_id,uint8_t CC_id); @@ -213,27 +197,26 @@ int8_t set_RSRQ_filtered(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index,floa //! Automatic gain control void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, - uint32_t rx_power_fil_dB, + uint32_t rx_power_fil_dB, unsigned char eNB_id); int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, - module_id_t eNB_id, + eNB_rxtx_proc_t *proc, module_id_t UE_id, - uint8_t subframe, uint8_t l, - uint8_t Ns, - uint8_t cooperation_flag); + uint8_t Ns); + int16_t lte_ul_freq_offset_estimation(LTE_DL_FRAME_PARMS *frame_parms, int32_t *ul_ch_estimates, uint16_t nb_rb); int lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, - LTE_eNB_COMMON *eNb_common_vars, - LTE_eNB_SRS *eNb_srs_vars, + LTE_eNB_COMMON *eNB_common_vars, + LTE_eNB_SRS *eNB_srs_vars, SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated, unsigned char sub_frame_number, - unsigned char eNb_id); + unsigned char eNB_id); int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, LTE_eNB_SRS *lte_eNb_srs, @@ -242,10 +225,10 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, unsigned char number_of_cards, short coef); -int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id,uint8_t subframe); +int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id); void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB, - int subframe, + int subframe, module_id_t eNB_id, unsigned char clear); diff --git a/openair1/PHY/LTE_ESTIMATION/extern.h b/openair1/PHY/LTE_ESTIMATION/extern.h index 7f3cc6e31f..4690bba42e 100644 --- a/openair1/PHY/LTE_ESTIMATION/extern.h +++ b/openair1/PHY/LTE_ESTIMATION/extern.h @@ -1,28 +1,21 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ diff --git a/openair1/PHY/LTE_ESTIMATION/filt16_32.h b/openair1/PHY/LTE_ESTIMATION/filt16_32.h new file mode 100644 index 0000000000..3487fd3466 --- /dev/null +++ b/openair1/PHY/LTE_ESTIMATION/filt16_32.h @@ -0,0 +1,86 @@ +short filt16_l0[16] = { +16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0,0}; + +short filt16_r0[16] = { +0,0,0,0,0,4096,8192,12288,16384,20480,24576,28672,0,0,0,0}; + +short filt16_m0[16] = { +0,4096,8192,12288,16384,12288,8192,4096,0,-4096,-8192,-12288,0,0,0,0}; + +short filt16_l1[16] = { +20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0}; + +short filt16_r1[16] = { +0,0,0,0,0,0,4096,8192,12288,16384,20480,24576,0,0,0,0}; + +short filt16_m1[16] = { +-4096,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,-8192,0,0,0,0}; + +short filt16_l2[16] = { +24576,20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0}; + +short filt16_r2[16] = { +0,0,0,0,0,0,0,4096,8192,12288,16384,20480,0,0,0,0}; + +short filt16_m2[16] = { +-8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,0,0,0,0}; + +short filt16_l3[16] = { +28672,24576,20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0}; + +short filt16_r3[16] = { +0,0,0,0,0,0,0,0,4096,8192,12288,16384,0,0,0,0}; + +short filt16_m3[16] = { +-12288,-8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0}; + +short filt16_l0_dc[16] = { +16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0,0}; + +short filt16_r0_dc[16] = { +0,0,0,0,0,3276,9830,13107,16384,19660,22937,26214,0,0,0,0}; + +short filt16_m0_dc[16] = { +0,4096,8192,12288,16384,13107,6553,3276,0,-3277,-6554,-9831,0,0,0,0}; + +short filt16_l1_dc[16] = { +16384,12288,8192,4096,0,-4096,0,0,0,0,0,0,0,0,0,0}; + +short filt16_r1_dc[16] = { +0,0,0,0,0,0,6553,9830,13107,16384,19660,22937,0,0,0,0}; + +short filt16_m1_dc[16] = { +-4096,0,4096,8192,12288,16384,9830,6553,3276,0,-3277,-6554,0,0,0,0}; + +short filt16_l2_dc[16] = { +26214,22937,19660,16384,13107,9830,6553,0,0,0,0,0,0,0,0,0}; + +short filt16_r2_dc[16] = { +0,0,0,0,0,0,0,4096,8192,12288,16384,20480,0,0,0,0}; + +short filt16_m2_dc[16] = { +-6554,-3277,0,3276,6553,6553,16384,12288,8192,4096,0,-4096,0,0,0,0}; + +short filt16_l3_dc[16] = { +26214,22937,19660,16384,13107,9830,3276,0,0,0,0,0,0,0,0,0}; + +short filt16_r3_dc[16] = { +0,0,0,0,0,0,0,0,4096,8192,12288,16384,0,0,0,0}; + +short filt16_m3_dc[16] = { +-9831,-6554,-3277,0,3276,6553,9830,16384,12288,8192,4096,0,0,0,0,0}; + +short filt16_1[16] = { +16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384}; + +short filt16_2l0[16] = { +16384,12288,8192,4096,-4096,0,0,0,0,0,0,0,0,0,0,0}; + +short filt16_2r0[16] = { +0,4096,8192,12288,16384,20480,0,0,0,0,0,0,0,0,0,0}; + +short filt16_2l1[16] = { +20480,16384,12288,8192,4096,0,0,0,0,0,0,0,0,0,0,0}; + +short filt16_2r1[16] = { +-4096,0,4096,8192,12288,16384,0,0,0,0,0,0,0,0,0,0}; diff --git a/openair1/PHY/LTE_ESTIMATION/filt96_32.h b/openair1/PHY/LTE_ESTIMATION/filt96_32.h index 61225974bc..929dfd4d85 100644 --- a/openair1/PHY/LTE_ESTIMATION/filt96_32.h +++ b/openair1/PHY/LTE_ESTIMATION/filt96_32.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ short filt24_0[24] __attribute__((aligned(32))) ={ 2730,5461,8192,10922,13653,16384,13653,10922,8192,5461,2730,0,0,0,0,0,0,0,0,0,0,0,0,0 }; diff --git a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c old mode 100755 new mode 100644 index 8f1ffe0441..74a844da8a --- a/openair1/PHY/LTE_ESTIMATION/freq_equalization.c +++ b/openair1/PHY/LTE_ESTIMATION/freq_equalization.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" #include "PHY/sse_intrin.h" @@ -311,6 +304,11 @@ void freq_equalization(LTE_DL_FRAME_PARMS *frame_parms, ul_ch_magb128 = (int16x8_t*)&ul_ch_magb[0][symbol*frame_parms->N_RB_DL*12]; #endif + AssertFatal(symbolsymbols_per_tti,"symbol %d >= %d\n", + symbol,frame_parms->symbols_per_tti); + AssertFatal(Msc_RSN_RB_UL*12,"Msc_RS %d >= %d\n", + Msc_RS,frame_parms->N_RB_UL*12); + for (re=0; re<(Msc_RS>>2); re++) { amp=(*((int16_t*)&ul_ch_mag128[re])); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index 059119c605..18444076f3 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -1,35 +1,30 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" +#include "UTIL/LOG/vcd_signal_dumper.h" + #define DEBUG_PHY // Adjust location synchronization point to account for drift @@ -37,21 +32,26 @@ // last channel estimate of the receiver void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, - PHY_VARS_UE *phy_vars_ue, + PHY_VARS_UE *ue, unsigned char eNB_id, + uint8_t subframe, unsigned char clear, short coef) { static int max_pos_fil = 0; + static int count_max_pos_ok = 0; + static int first_time = 1; int temp = 0, i, aa, max_val = 0, max_pos = 0; int diff; short Re,Im,ncoef; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN); + ncoef = 32767 - coef; #ifdef DEBUG_PHY - LOG_D(PHY,"frame %d, slot %d: rx_offset (before) = %d\n",phy_vars_ue->frame_rx,phy_vars_ue->slot_rx,phy_vars_ue->rx_offset); + LOG_D(PHY,"AbsSubframe %d.%d: rx_offset (before) = %d\n",ue->proc.proc_rxtx[0].frame_rx%1024,subframe,ue->rx_offset); #endif //DEBUG_PHY @@ -60,8 +60,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, temp = 0; for (aa=0; aanb_antennas_rx; aa++) { - Re = ((int16_t*)phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_id][aa])[(i<<2)]; - Im = ((int16_t*)phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)]; + Re = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[(i<<2)]; + Im = ((int16_t*)ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id][aa])[1+(i<<2)]; temp += (Re*Re/2) + (Im*Im/2); } @@ -77,33 +77,67 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms, else max_pos_fil = ((max_pos_fil * coef) + (max_pos * ncoef)) >> 15; + // do not filter to have proactive timing adjustment + max_pos_fil = max_pos; - diff = max_pos_fil - frame_parms->nb_prefix_samples/8; + if(subframe == 6) + { + diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3); - if ( diff > SYNCH_HYST ) - phy_vars_ue->rx_offset++; - else if (diff < -SYNCH_HYST) - phy_vars_ue->rx_offset--; + if ( abs(diff) < SYNCH_HYST ) + ue->rx_offset = 0; + else + ue->rx_offset = diff; - if ( phy_vars_ue->rx_offset < 0 ) - phy_vars_ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES; + if(abs(diff)<5) + count_max_pos_ok ++; + else + count_max_pos_ok = 0; - if ( phy_vars_ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES ) - phy_vars_ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES; + if(count_max_pos_ok > 10 && first_time == 1) + { + first_time = 0; + ue->time_sync_cell = 1; + if (ue->mac_enabled==1) { + LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id); + //mac_resynch(); + dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id); + ue->UE_mode[0] = PRACH; + } + else { + ue->UE_mode[0] = PUSCH; + } + } + + if ( ue->rx_offset < 0 ) + ue->rx_offset += FRAME_LENGTH_COMPLEX_SAMPLES; + + if ( ue->rx_offset >= FRAME_LENGTH_COMPLEX_SAMPLES ) + ue->rx_offset -= FRAME_LENGTH_COMPLEX_SAMPLES; -#ifdef DEBUG_PHY - LOG_D(PHY,"frame %d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d)\n", - phy_vars_ue->frame_rx,phy_vars_ue->rx_offset,max_pos,max_pos_fil,temp); -#endif //DEBUG_PHY - + #ifdef DEBUG_PHY + LOG_D(PHY,"AbsSubframe %d.%d: ThreadId %d diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n", + ue->proc.proc_rxtx[ue->current_thread_id[subframe]].frame_rx, + subframe, + ue->current_thread_id[subframe], + diff, + ue->rx_offset, + clear, + max_pos, + max_pos_fil, + temp,max_val, + (frame_parms->nb_prefix_samples>>3)); + #endif //DEBUG_PHY + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT); + } } int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, - LTE_eNB_SRS *lte_eNb_srs, + LTE_eNB_SRS *lte_eNB_srs, unsigned int *eNB_id, unsigned char clear, unsigned char number_of_cards, @@ -115,10 +149,8 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, int temp, i, aa, max_pos = 0,ind; int max_val=0; short Re,Im,ncoef; -#ifdef USER_MODE #ifdef DEBUG_PHY char fname[100],vname[100]; -#endif #endif ncoef = 32768 - coef; @@ -133,32 +165,30 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, // do ifft of channel estimate switch(frame_parms->N_RB_DL) { case 6: - dft128((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0], - (int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa], + dft128((int16_t*) <e_eNB_srs->srs_ch_estimates[aa][0], + (int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa], 1); break; case 25: - dft512((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0], - (int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa], + dft512((int16_t*) <e_eNB_srs->srs_ch_estimates[aa][0], + (int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa], 1); break; case 50: - dft1024((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0], - (int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa], + dft1024((int16_t*) <e_eNB_srs->srs_ch_estimates[aa][0], + (int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa], 1); break; case 100: - dft2048((int16_t*) <e_eNb_srs->srs_ch_estimates[ind][aa][0], - (int16_t*) lte_eNb_srs->srs_ch_estimates_time[ind][aa], + dft2048((int16_t*) <e_eNB_srs->srs_ch_estimates[aa][0], + (int16_t*) lte_eNB_srs->srs_ch_estimates_time[aa], 1); break; } -#ifdef USER_MODE #ifdef DEBUG_PHY sprintf(fname,"srs_ch_estimates_time_%d%d.m",ind,aa); sprintf(vname,"srs_time_%d%d",ind,aa); - write_output(fname,vname,lte_eNb_srs->srs_ch_estimates_time[ind][aa],frame_parms->ofdm_symbol_size*2,2,1); -#endif + write_output(fname,vname,lte_eNB_srs->srs_ch_estimates_time[aa],frame_parms->ofdm_symbol_size*2,2,1); #endif } @@ -168,8 +198,8 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, temp = 0; for (aa=0; aanb_antennas_rx; aa++) { - Re = ((int16_t*)lte_eNb_srs->srs_ch_estimates_time[ind][aa])[(i<<1)]; - Im = ((int16_t*)lte_eNb_srs->srs_ch_estimates_time[ind][aa])[1+(i<<1)]; + Re = ((int16_t*)lte_eNB_srs->srs_ch_estimates_time[aa])[(i<<1)]; + Im = ((int16_t*)lte_eNB_srs->srs_ch_estimates_time[aa])[1+(i<<1)]; temp += (Re*Re/2) + (Im*Im/2); } @@ -187,29 +217,24 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, else max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15; -#ifdef DEBUG_PHY - //LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d\n",mac_xface->frame,max_pos,max_pos_fil2); -#endif //DEBUG_PHY - return(max_pos_fil2); } -int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_t sched_subframe) +int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id) { - static int first_run=1; - static int max_pos_fil2=0; int temp, i, aa, max_pos=0, max_val=0; - short Re,Im,coef=24576; - short ncoef = 32768 - coef; + short Re,Im; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - LTE_eNB_PUSCH *eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars[UE_id]; - int32_t **ul_ch_estimates_time= eNB_pusch_vars->drs_ch_estimates_time[0]; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + LTE_eNB_PUSCH *eNB_pusch_vars = eNB->pusch_vars[UE_id]; + int32_t **ul_ch_estimates_time= eNB_pusch_vars->drs_ch_estimates_time; uint8_t cyclic_shift = 0; int sync_pos = (frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size); - + AssertFatal(frame_parms->ofdm_symbol_size > 127,"frame_parms->ofdm_symbol_size %d<128\n",frame_parms->ofdm_symbol_size); + AssertFatal(frame_parms->nb_antennas_rx >0 && frame_parms->nb_antennas_rx<3,"frame_parms->nb_antennas_rx %d not in [0,1]\n", + frame_parms->nb_antennas_rx); for (i = 0; i < frame_parms->ofdm_symbol_size; i++) { temp = 0; @@ -228,16 +253,9 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,uint8_t UE_id,uint8_ if (max_pos>frame_parms->ofdm_symbol_size/2) max_pos = max_pos-frame_parms->ofdm_symbol_size; - // filter position to reduce jitter - if (first_run == 1) { - first_run=0; - max_pos_fil2 = max_pos; - } else - max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15; + //#ifdef DEBUG_PHY + LOG_D(PHY,"frame %d: max_pos = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,sync_pos); + //#endif //DEBUG_PHY -#ifdef DEBUG_PHY - LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",phy_vars_eNB->proc[sched_subframe].frame_rx,max_pos,max_pos_fil2,sync_pos); -#endif //DEBUG_PHY - - return(max_pos_fil2-sync_pos); + return max_pos - sync_pos; } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c new file mode 100644 index 0000000000..55d2cf6c5c --- /dev/null +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.c @@ -0,0 +1,741 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include +#include "defs.h" +#include "PHY/defs.h" +#include "filt16_32.h" +//#define DEBUG_BF_CH + +int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue, + uint8_t eNB_id, + uint8_t eNB_offset, + unsigned char Ns, + unsigned char p, + unsigned char symbol) +{ + + unsigned short rb,nb_rb=0; + unsigned char aarx,l,lprime,nsymb,skip_half=0,sss_symb,pss_symb=0,rb_alloc_ind,harq_pid,uespec_pilots=0; + int beamforming_mode, ch_offset; + uint8_t subframe; + int8_t uespec_nushift, uespec_poffset=0, pil_offset=0; + uint8_t pilot0,pilot1,pilot2,pilot3; + + short ch[2], *pil, *rxF, *dl_bf_ch, *dl_bf_ch_prev; + short *fl, *fm, *fr, *fl_dc, *fm_dc, *fr_dc, *f1, *f2l, *f2r; + + unsigned int *rballoc; + int **rxdataF; + int32_t **dl_bf_ch_estimates; + int uespec_pilot[300]; + + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms; + LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[Ns>>1]][eNB_id]; + LTE_DL_UE_HARQ_t *dlsch0_harq; + + harq_pid = dlsch_ue[0]->current_harq_pid; + dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; + + if (((frame_parms->Ncp == NORMAL) && (symbol>=7)) || + ((frame_parms->Ncp == EXTENDED) && (symbol>=6))) + rballoc = dlsch0_harq->rb_alloc_odd; + else + rballoc = dlsch0_harq->rb_alloc_even; + + rxdataF = phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[Ns>>1]].rxdataF; + + dl_bf_ch_estimates = phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[Ns>>1]][eNB_id]->dl_bf_ch_estimates; + beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0; + + if (phy_vars_ue->high_speed_flag == 0) // use second channel estimate position for temporary storage + ch_offset = frame_parms->ofdm_symbol_size; + else + ch_offset = frame_parms->ofdm_symbol_size*symbol; + + + uespec_nushift = frame_parms->Nid_cell%3; + subframe = Ns>>1; + + + //generate ue specific pilots + lprime = symbol/3-1; + lte_dl_ue_spec_rx(phy_vars_ue,uespec_pilot,Ns,5,lprime,0,dlsch0_harq->nb_rb); + //write_output("uespec_pilot_rx.m","uespec_pilot",uespec_pilot,300,1,1); + + if (frame_parms->Ncp==0){ + if (symbol==3 || symbol==6 || symbol==9 || symbol==12) + uespec_pilots = 1; + } else{ + if (symbol==4 || symbol==7 || symbol==10) + uespec_pilots = 1; + } + + if ((frame_parms->Ncp==0 && (symbol==6 ||symbol ==12)) || (frame_parms->Ncp==1 && symbol==7)) + uespec_poffset = 2; + + if (phy_vars_ue->frame_parms.Ncp == 0) { // normal prefix + pilot0 = 3; + pilot1 = 6; + pilot2 = 9; + pilot3 = 12; + } else { // extended prefix + pilot0 = 4; + pilot1 = 7; + pilot2 = 10; + } + + //define the filter + pil_offset = (uespec_nushift+uespec_poffset)%3; + // printf("symbol=%d,pil_offset=%d\n",symbol,pil_offset); + switch (pil_offset) { + case 0: + fl = filt16_l0; + fm = filt16_m0; + fr = filt16_r0; + fl_dc = filt16_l0; + fm_dc = filt16_m0; + fr_dc = filt16_r0; + f1 = filt16_1; + f2l = filt16_2l0; + f2r = filt16_2r0; + break; + + case 1: + fl = filt16_l1; + fm = filt16_m1; + fr = filt16_r1; + fl_dc = filt16_l1; + fm_dc = filt16_m1; + fr_dc = filt16_r1; + f1 = filt16_1; + f2l = filt16_2l1; + f2r = filt16_2r1; + break; + + case 2: + fl = filt16_l2; + fm = filt16_m2; + fr = filt16_r2; + fl_dc = filt16_l2; + fm_dc = filt16_m2; + fr_dc = filt16_r2; + f1 = filt16_1; + f2l = filt16_2l0; + f2r = filt16_2r0; + break; + + case 3: + fl = filt16_l3; + fm = filt16_m3; + fr = filt16_r3; + fl_dc = filt16_l3; + fm_dc = filt16_m3; + fr_dc = filt16_r3; + f1 = filt16_1; + f2l = filt16_2l1; + f2r = filt16_2r1; + break; + } + // beamforming mode extension + /* } + else if (beamforming_mode==0) + msg("lte_dl_bf_channel_estimation:No beamforming is performed.\n"); + else + msg("lte_dl_bf_channel_estimation:Beamforming mode not supported yet.\n");*/ + + + l=symbol; + nsymb = (frame_parms->Ncp==NORMAL) ? 14:12; + + if (frame_parms->frame_type == TDD) { //TDD + sss_symb = nsymb-1; + pss_symb = 2; + } else { + sss_symb = (nsymb>>1)-2; + pss_symb = (nsymb>>1)-1; + } + + + for (aarx=0; aarxnb_antennas_rx; aarx++) { + + rxF = (short *)&rxdataF[aarx][pil_offset + frame_parms->first_carrier_offset + symbol*frame_parms->ofdm_symbol_size]; + pil = (short *)uespec_pilot; + dl_bf_ch = (short *)&dl_bf_ch_estimates[aarx][ch_offset]; + + memset(dl_bf_ch,0,4*(frame_parms->ofdm_symbol_size)); + //memset(dl_bf_ch,0,2*(frame_parms->ofdm_symbol_size)); + + if (phy_vars_ue->high_speed_flag==0) { + // multiply previous channel estimate by ch_est_alpha + if (frame_parms->Ncp==0){ + multadd_complex_vector_real_scalar(dl_bf_ch-(frame_parms->ofdm_symbol_size<<1), + phy_vars_ue->ch_est_alpha,dl_bf_ch-(frame_parms->ofdm_symbol_size<<1), + 1,frame_parms->ofdm_symbol_size); + } else { + LOG_E(PHY,"lte_dl_bf_channel_estimation: beamforming channel estimation not supported for TM7 Extended CP.\n"); // phy_vars_ue->ch_est_beta should be defined equaling 1/3 + } + } + //estimation and interpolation + + if ((frame_parms->N_RB_DL&1) == 0) { // even number of RBs + for (rb=0; rbN_RB_DL; rb++) { + + if (rb < 32) + rb_alloc_ind = (rballoc[0]>>rb) & 1; + else if (rb < 64) + rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1; + else if (rb < 96) + rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1; + else if (rb < 100) + rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1; + else + rb_alloc_ind = 0; + + // For second half of RBs skip DC carrier + if (rb==(frame_parms->N_RB_DL>>1)) { + rxF = (short *)&rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))]; + } + + if (rb_alloc_ind==1) { + if (uespec_pilots==1) { + if (beamforming_mode==7) { + if (frame_parms->Ncp==0) { + + ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15); + ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15); + multadd_real_vector_complex_scalar(fl,ch,dl_bf_ch,16); + + ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15); + ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15); + multadd_real_vector_complex_scalar(fm,ch,dl_bf_ch,16); + + ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15); + ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15); + multadd_real_vector_complex_scalar(fr,ch,dl_bf_ch,16); + } else { + LOG_E(PHY,"lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):TM7 beamgforming channel estimation not supported for extented CP\n"); + exit(-1); + } + } else { + LOG_E(PHY,"lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c): transmission mode not supported.\n"); + } + } + nb_rb++; + } + + rxF+=24; + dl_bf_ch+=24; + } + } else { // Odd number of RBs + for (rb=0; rbN_RB_DL>>1; rb++) { + skip_half=0; + + if (rb < 32) + rb_alloc_ind = (rballoc[0]>>rb) & 1; + else if (rb < 64) + rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1; + else if (rb < 96) + rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1; + else if (rb < 100) + rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1; + else + rb_alloc_ind = 0; + + // PBCH + if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) { + rb_alloc_ind = 0; + } + + //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 + if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + skip_half=1; + else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + skip_half=2; + + //SSS + if (((subframe==0)||(subframe==5)) && + (rb>((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l==sss_symb) ) { + rb_alloc_ind = 0; + } + + //SSS + if (((subframe==0)||(subframe==5)) && + (rb==((frame_parms->N_RB_DL>>1)-3)) && + (l==sss_symb)) + skip_half=1; + else if (((subframe==0)||(subframe==5)) && + (rb==((frame_parms->N_RB_DL>>1)+3)) && + (l==sss_symb)) + skip_half=2; + + //PSS in subframe 0/5 if FDD + if (frame_parms->frame_type == FDD) { //FDD + if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + + if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) + skip_half=1; + else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) + skip_half=2; + } + + if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6 + if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + + if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) + skip_half=1; + else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) + skip_half=2; + } + + //printf("symbol=%d,pil_offset=%d\ni,rb_alloc_ind=%d,uespec_pilots=%d,beamforming_mode=%d,Ncp=%d,skip_half=%d\n",symbol,pil_offset,rb_alloc_ind,uespec_pilots,beamforming_mode,frame_parms->Ncp,skip_half); + if (rb_alloc_ind==1) { + if (uespec_pilots==1) { + if (beamforming_mode==7) { + if (frame_parms->Ncp==0) { + if (skip_half==1) { + if (pil_offset<2) { + + ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15); + ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15); + multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16); + pil+=2; + + ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15); + ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15); + multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16); + pil+=2; + + } else { + + ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15); + ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15); + multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16); + pil+=2; + } + } else if (skip_half==2) { + if (pil_offset<2) { + + ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15); + ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15); + multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16); + pil+=2; + + } else { + + ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15); + ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15); + multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16); + pil+=2; + + ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15); + ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15); + multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16); + pil+=2; + + } + } else { + + ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15); + ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15); + multadd_real_vector_complex_scalar(fl,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2; + + ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15); + ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15); + multadd_real_vector_complex_scalar(fm,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + printf("symbol=%d,rxF[4]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[8],rxF[9],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2; + + ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15); + ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15); + multadd_real_vector_complex_scalar(fr,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + printf("symbol=%d,rxF[8]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[16],rxF[17],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2; + + } + } else { + LOG_E(PHY,"lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):TM7 beamgforming channel estimation not supported for extented CP\n"); + exit(-1); + } + + } else { + LOG_E(PHY,"lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):transmission mode not supported.\n"); + } + } + nb_rb++; + } + + rxF+=24; + dl_bf_ch+=24; + } // first half loop + + // Do middle RB (around DC) + if (rb < 32) + rb_alloc_ind = (rballoc[0]>>rb) & 1; + else if (rb < 64) + rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1; + else if (rb < 96) + rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1; + else if (rb < 100) + rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1; + else + rb_alloc_ind = 0; + + // PBCH + if ((subframe==0) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) { + rb_alloc_ind = 0; + } + + //SSS + if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { + rb_alloc_ind = 0; + } + + if (frame_parms->frame_type == FDD) { + //PSS + if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + } + + if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { + //PSS + if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + } + + //printf("DC rb %d (%p)\n",rb,rxF); + if (rb_alloc_ind==1) { + if (pil_offset<2) { + ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15); + ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15); + multadd_real_vector_complex_scalar(fl_dc,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + //printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2;; + + ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15); + ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15); + multadd_real_vector_complex_scalar(fm_dc,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + //printf("symbol=%d,rxF[4]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[8],rxF[9],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2;; + + rxF = (short *)&rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)]; + + ch[0] = (short)(((int)pil[0]*rxF[6] - (int)pil[1]*rxF[7])>>15); + ch[1] = (short)(((int)pil[0]*rxF[7] + (int)pil[1]*rxF[6])>>15); + multadd_real_vector_complex_scalar(fr_dc,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + //printf("symbol=%d,rxF[3]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[6],rxF[7],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2;; + } else { + ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15); + ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15); + multadd_real_vector_complex_scalar(fl_dc,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + //printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2;; + + rxF = (short *)&rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)]; + + ch[0] = (short)(((int)pil[0]*rxF[2] - (int)pil[1]*rxF[3])>>15); + ch[1] = (short)(((int)pil[0]*rxF[3] + (int)pil[1]*rxF[2])>>15); + multadd_real_vector_complex_scalar(fm_dc,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + //printf("symbol=%d,rxF[1]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[2],rxF[3],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2;; + + ch[0] = (short)(((int)pil[0]*rxF[10] - (int)pil[1]*rxF[11])>>15); + ch[1] = (short)(((int)pil[0]*rxF[11] + (int)pil[1]*rxF[10])>>15); + multadd_real_vector_complex_scalar(fr_dc,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + //printf("symbol=%d,rxF[5]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[10],rxF[11],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2;; + } + } // rballoc==1 + else { + rxF = (short *)&rxdataF[aarx][pil_offset+((symbol*(frame_parms->ofdm_symbol_size)))]; + } + + rxF+=14+2*pil_offset; + dl_bf_ch+=24; + rb++; + + for (; rbN_RB_DL; rb++) { + skip_half=0; + + if (rb < 32) + rb_alloc_ind = (rballoc[0]>>rb) & 1; + else if (rb < 64) + rb_alloc_ind = (rballoc[1]>>(rb-32)) & 1; + else if (rb < 96) + rb_alloc_ind = (rballoc[2]>>(rb-64)) & 1; + else if (rb < 100) + rb_alloc_ind = (rballoc[3]>>(rb-96)) & 1; + else + rb_alloc_ind = 0; + + // PBCH + if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) { + rb_alloc_ind = 0; + } + + //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 + if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + skip_half=1; + else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + skip_half=2; + + //SSS + if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { + rb_alloc_ind = 0; + } + + //SSS + if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==sss_symb)) + skip_half=1; + else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb)) + skip_half=2; + + if (frame_parms->frame_type == FDD) { + //PSS + if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + + //PSS + if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) + skip_half=1; + else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) + skip_half=2; + } + + if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6 + if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + + if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) + skip_half=1; + else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) + skip_half=2; + } + + if (rb_alloc_ind==1) { + if (uespec_pilots==1) { + if (beamforming_mode==7) { + if (frame_parms->Ncp==0) { + if (skip_half==1) { + if (pil_offset<2) { + + ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15); + ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15); + multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16); + pil+=2; + + ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15); + ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15); + multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16); + pil+=2; + + + } else { + + ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15); + ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15); + multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16); + pil+=2; + } + } else if (skip_half==2) { + if (pil_offset<2) { + + ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15); + ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15); + multadd_real_vector_complex_scalar(f1,ch,dl_bf_ch,16); + pil+=2; + + } else { + + ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15); + ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15); + multadd_real_vector_complex_scalar(f2l,ch,dl_bf_ch,16); + pil+=2; + + ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15); + ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15); + multadd_real_vector_complex_scalar(f2r,ch,dl_bf_ch,16); + pil+=2; + + } + } else { + + ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15); + ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15); + multadd_real_vector_complex_scalar(fl,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + printf("symbol=%d,rxF[0]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[0],rxF[1],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2; + + ch[0] = (short)(((int)pil[0]*rxF[8] - (int)pil[1]*rxF[9])>>15); + ch[1] = (short)(((int)pil[0]*rxF[9] + (int)pil[1]*rxF[8])>>15); + multadd_real_vector_complex_scalar(fm,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + printf("symbol=%d,rxF[4]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[8],rxF[9],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2; + + ch[0] = (short)(((int)pil[0]*rxF[16] - (int)pil[1]*rxF[17])>>15); + ch[1] = (short)(((int)pil[0]*rxF[17] + (int)pil[1]*rxF[16])>>15); + multadd_real_vector_complex_scalar(fr,ch,dl_bf_ch,16); +#ifdef DEBUG_BF_CH + printf("symbol=%d,rxF[8]=(%d,%d),pil=(%d,%d),ch=(%d,%d)\n",symbol,rxF[16],rxF[17],pil[0],pil[1],ch[0],ch[1]); +#endif + pil+=2; + + } + } else { + LOG_E(PHY,"lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):TM7 beamgforming channel estimation not supported for extented CP\n"); + exit(-1); + } + + } else { + LOG_E(PHY,"lte_dl_bf_channel_estimation(lte_dl_bf_channel_estimation.c):transmission mode not supported.\n"); + } + } + nb_rb++; + } + + rxF+=24; + dl_bf_ch+=24; + } // second half of RBs + } // odd number of RBs + + // Temporal Interpolation + if (phy_vars_ue->perfect_ce == 0) { + + dl_bf_ch = (short *)&dl_bf_ch_estimates[aarx][ch_offset]; +#ifdef DEBUG_BF_CH + printf("[dlsch_bf_ch_est.c]:symbol %d, dl_bf_ch (%d,%d)\n",symbol,dl_bf_ch[0],dl_bf_ch[1]); +#endif + + if (phy_vars_ue->high_speed_flag == 0) { + multadd_complex_vector_real_scalar(dl_bf_ch, + 32767-phy_vars_ue->ch_est_alpha, + dl_bf_ch-(frame_parms->ofdm_symbol_size<<1),0,frame_parms->ofdm_symbol_size); + //printf("dlsch_bf_ch_est.c:symbol %d,dl_bf_ch (%d,%d)\n",symbol,*(dl_bf_ch-512*2),*(dl_bf_ch-512*2+1)); + } else { // high_speed_flag == 1 + if (beamforming_mode==7) { + if (frame_parms->Ncp==0) { + if (symbol == pilot0) { + // printf("Interpolating %d->0\n",4-phy_vars_ue->lte_frame_parms.Ncp); + // dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][(4-phy_vars_ue->lte_frame_parms.Ncp)*(frame_parms->ofdm_symbol_size)]; + dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot3*(frame_parms->ofdm_symbol_size)]; +#ifdef DEBUG_BF_CH + printf("[dlsch_bf_ch_est.c] symbol=%d, dl_bf_ch_prev=(%d,%d), dl_bf_ch=(%d,%d)\n", symbol, dl_bf_ch_prev[0], dl_bf_ch_prev[1], dl_bf_ch[0], dl_bf_ch[1]); +#endif + // pilot spacing 5 symbols (1/5,2/5,3/5,4/5 combination) + multadd_complex_vector_real_scalar(dl_bf_ch_prev,26214,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_bf_ch,6554,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_bf_ch_prev,19661,dl_bf_ch-(3*2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_bf_ch,13107,dl_bf_ch-(3*2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_bf_ch_prev,13107,dl_bf_ch-(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_bf_ch,19661,dl_bf_ch-(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_bf_ch_prev,6554,dl_bf_ch-(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_bf_ch,26214,dl_bf_ch-(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size); + } else if (symbol == pilot1) { + dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot0*(frame_parms->ofdm_symbol_size)]; +#ifdef DEBUG_BF_CH + printf("[dlsch_bf_ch_est.c] symbol=%d, dl_bf_ch_prev=(%d,%d), dl_bf_ch=(%d,%d)\n", symbol, dl_bf_ch_prev[0], dl_bf_ch_prev[1], dl_bf_ch[0], dl_bf_ch[1]); +#endif + + // pilot spacing 3 symbols (1/3,2/3 combination) + multadd_complex_vector_real_scalar(dl_bf_ch_prev,21845,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_bf_ch,10923,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_bf_ch_prev,10923,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_bf_ch,21845,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size); + + } else if (symbol == pilot2) { + dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot1*(frame_parms->ofdm_symbol_size)]; +#ifdef DEBUG_BF_CH + printf("[dlsch_bf_ch_est.c] symbol=%d, dl_bf_ch_prev=(%d,%d), dl_bf_ch=(%d,%d)\n", symbol, dl_bf_ch_prev[0], dl_bf_ch_prev[1], dl_bf_ch[0], dl_bf_ch[1]); +#endif + + multadd_complex_vector_real_scalar(dl_bf_ch_prev,21845,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_bf_ch,10923,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_bf_ch_prev,10923,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_bf_ch,21845,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size); + } else { // symbol == pilot3 + // printf("Interpolating 0->%d\n",4-phy_vars_ue->lte_frame_parms.Ncp); + dl_bf_ch_prev = (short *)&dl_bf_ch_estimates[aarx][pilot2*(frame_parms->ofdm_symbol_size)]; + + // pilot spacing 3 symbols (1/3,2/3 combination) + multadd_complex_vector_real_scalar(dl_bf_ch_prev,21845,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),1,frame_parms->ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_bf_ch,10923,dl_bf_ch_prev+(2*(frame_parms->ofdm_symbol_size)),0,frame_parms->ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_bf_ch_prev,10923,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),1,frame_parms->ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_bf_ch,21845,dl_bf_ch_prev+(2*((frame_parms->ofdm_symbol_size)<<1)),0,frame_parms->ofdm_symbol_size); + } + + } else { + LOG_E(PHY,"lte_dl_bf_channel_estimation:temporal interpolation not supported for TM7 extented CP.\n"); + } + } else { + LOG_E(PHY,"lte_dl_bf_channel_estimation:temporal interpolation not supported for this beamforming mode.\n"); + } + } + } + } //aarx + +#ifdef DEBUG_BF_CH + printf("[dlsch_bf_ch_est.c]: dl_bf_estimates[0][600] %d, %d \n",*(short *)&dl_bf_ch_estimates[0][600],*(short*)&phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_bf_ch_estimates[0][600]); +#endif + + return(0); + +} diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c index bfbe94bb61..a4b29bb25e 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c @@ -1,40 +1,33 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifdef USER_MODE #include -#endif #include "defs.h" +#include "SCHED/defs.h" #include "PHY/defs.h" #include "filt96_32.h" +#include "T.h" //#define DEBUG_CH -int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, +int lte_dl_channel_estimation(PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, @@ -42,9 +35,6 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, unsigned char l, unsigned char symbol) { - - - int pilot[2][200] __attribute__((aligned(16))); unsigned char nu,aarx; unsigned short k; @@ -53,14 +43,18 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, int ch_offset,symbol_offset; // unsigned int n; // int i; + static int interpolateS11S12 = 1; - uint16_t Nid_cell = (eNB_offset == 0) ? phy_vars_ue->lte_frame_parms.Nid_cell : phy_vars_ue->PHY_measurements.adj_cell_id[eNB_offset-1]; + uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; - uint8_t nushift,pilot1,pilot2,pilot3; - int **dl_ch_estimates=phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset]; - int **rxdataF=phy_vars_ue->lte_ue_common_vars.rxdataF; + uint8_t nushift,pilot0,pilot1,pilot2,pilot3; + uint8_t previous_thread_id = ue->current_thread_id[Ns>>1]==0 ? (RX_NB_TH-1):(ue->current_thread_id[Ns>>1]-1); + int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset]; + int **dl_ch_estimates_previous=ue->common_vars.common_vars_rx_data_per_thread[previous_thread_id].dl_ch_estimates[eNB_offset]; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; - if (phy_vars_ue->lte_frame_parms.Ncp == 0) { // normal prefix + pilot0 = 0; + if (ue->frame_parms.Ncp == 0) { // normal prefix pilot1 = 4; pilot2 = 7; pilot3 = 11; @@ -82,24 +76,24 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, else if ((p==1) && (l>0)) nu = 0; else { - msg("lte_dl_channel_estimation: p %d, l %d -> ERROR\n",p,l); + LOG_E(PHY,"lte_dl_channel_estimation: p %d, l %d -> ERROR\n",p,l); return(-1); } - //ch_offset = (l*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)); - if (phy_vars_ue->high_speed_flag == 0) // use second channel estimate position for temporary storage - ch_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size ; + //ch_offset = (l*(ue->frame_parms.ofdm_symbol_size)); + if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage + ch_offset = ue->frame_parms.ofdm_symbol_size ; else - ch_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol; + ch_offset = ue->frame_parms.ofdm_symbol_size*symbol; - symbol_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol; + symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol; k = (nu + nushift)%6; #ifdef DEBUG_CH - printf("Channel Estimation : eNB_offset %d cell_id %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d\n",eNB_offset,Nid_cell,ch_offset,phy_vars_ue->lte_frame_parms.ofdm_symbol_size, - phy_vars_ue->lte_frame_parms.Ncp,l,Ns,k); + printf("Channel Estimation : ThreadId %d, eNB_offset %d cell_id %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d\n",ue->current_thread_id[Ns>>1], eNB_offset,Nid_cell,ch_offset,ue->frame_parms.ofdm_symbol_size, + ue->frame_parms.Ncp,l,Ns,k); #endif switch (k) { @@ -174,7 +168,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, break; default: - msg("lte_dl_channel_estimation: k=%d -> ERROR\n",k); + LOG_E(PHY,"lte_dl_channel_estimation: k=%d -> ERROR\n",k); return(-1); break; } @@ -182,7 +176,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, // generate pilot - lte_dl_cell_spec_rx(phy_vars_ue, + lte_dl_cell_spec_rx(ue, eNB_offset, &pilot[p][0], Ns, @@ -190,25 +184,25 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, p); - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { pil = (int16_t *)&pilot[p][0]; - rxF = (int16_t *)&rxdataF[aarx][((symbol_offset+k+phy_vars_ue->lte_frame_parms.first_carrier_offset))]; + rxF = (int16_t *)&rxdataF[aarx][((symbol_offset+k+ue->frame_parms.first_carrier_offset))]; dl_ch = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][ch_offset]; // if (eNb_id==0) - memset(dl_ch,0,4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)); - if (phy_vars_ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha - multadd_complex_vector_real_scalar(dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1), - phy_vars_ue->ch_est_alpha,dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1), - 1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size)); + if (ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha + multadd_complex_vector_real_scalar(dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), + ue->ch_est_alpha,dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), + 1,ue->frame_parms.ofdm_symbol_size); #ifdef DEBUG_CH - printf("k %d, first_carrier %d\n",k,phy_vars_ue->lte_frame_parms.first_carrier_offset); + printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset); #endif - if ((phy_vars_ue->lte_frame_parms.N_RB_DL==6) || - (phy_vars_ue->lte_frame_parms.N_RB_DL==50) || - (phy_vars_ue->lte_frame_parms.N_RB_DL==100)) { + if ((ue->frame_parms.N_RB_DL==6) || + (ue->frame_parms.N_RB_DL==50) || + (ue->frame_parms.N_RB_DL==100)) { //First half of pilots // Treat first 2 pilots specially (left edge) @@ -238,7 +232,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, rxF+=12; dl_ch+=16; - for (pilot_cnt=2; pilot_cnt<((phy_vars_ue->lte_frame_parms.N_RB_DL)-1); pilot_cnt+=2) { + for (pilot_cnt=2; pilot_cnt<((ue->frame_parms.N_RB_DL)-1); pilot_cnt+=2) { @@ -285,7 +279,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, #ifdef DEBUG_CH printf("second half k %d\n",k); #endif - for (pilot_cnt=0; pilot_cnt<((phy_vars_ue->lte_frame_parms.N_RB_DL)-3); pilot_cnt+=2) { + for (pilot_cnt=0; pilot_cnt<((ue->frame_parms.N_RB_DL)-3); pilot_cnt+=2) { ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -342,7 +336,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, } - else if (phy_vars_ue->lte_frame_parms.N_RB_DL==25) { + else if (ue->frame_parms.N_RB_DL==25) { //printf("Channel estimation\n"); // Treat first 2 pilots specially (left edge) @@ -385,7 +379,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, for (pilot_cnt=2; pilot_cnt<24; pilot_cnt+=2) { // printf("pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]); - // printf("rx[%d][%d] -> (%d,%d)\n",p,phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]); + // printf("rx[%d][%d] -> (%d,%d)\n",p,ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); @@ -466,7 +460,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, for (pilot_cnt=0; pilot_cnt<22; pilot_cnt+=2) { // printf("* pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]); - // printf("rx[%d][%d] -> (%d,%d)\n",p,phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]); + // printf("rx[%d][%d] -> (%d,%d)\n",p,ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p),rxF[0],rxF[1]); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); @@ -539,7 +533,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, dl_ch, 24); - } else if (phy_vars_ue->lte_frame_parms.N_RB_DL==15) { + } else if (ue->frame_parms.N_RB_DL==15) { //printf("First Half\n"); for (rb=0; rb<28; rb+=4) { @@ -547,7 +541,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, //printf("aarx=%d\n",aarx); //printf("pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]); //printf("rx[%d][%d] -> (%d,%d)\n",p, - // phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p), + // ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p), // rxF[0], // rxF[1]); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -602,7 +596,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, //printf("aarx=%d\n",aarx); //printf("pilot[%d][%d] (%d,%d)\n",p,rb,pil[0],pil[1]); //printf("rx[%d][%d] -> (%d,%d)\n",p, - // phy_vars_ue->lte_frame_parms.first_carrier_offset + phy_vars_ue->lte_frame_parms.nushift + 6*rb+(3*p), + // ue->frame_parms.first_carrier_offset + ue->frame_parms.nushift + 6*rb+(3*p), // rxF[0], // rxF[1]); ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -629,88 +623,150 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, } } else { - msg("channel estimation not implemented for phy_vars_ue->lte_frame_parms.N_RB_DL = %d\n",phy_vars_ue->lte_frame_parms.N_RB_DL); + LOG_E(PHY,"channel estimation not implemented for ue->frame_parms.N_RB_DL = %d\n",ue->frame_parms.N_RB_DL); } - if (phy_vars_ue->perfect_ce == 0) { + if (ue->perfect_ce == 0) { // Temporal Interpolation // printf("ch_offset %d\n",ch_offset); dl_ch = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][ch_offset]; - if (phy_vars_ue->high_speed_flag == 0) { + if (ue->high_speed_flag == 0) { multadd_complex_vector_real_scalar(dl_ch, - 32767-phy_vars_ue->ch_est_alpha, - dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + 32767-ue->ch_est_alpha, + dl_ch-(ue->frame_parms.ofdm_symbol_size<<1),0,ue->frame_parms.ofdm_symbol_size); } else { // high_speed_flag == 1 - if (symbol == 0) { - // printf("Interpolating %d->0\n",4-phy_vars_ue->lte_frame_parms.Ncp); - // dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][(4-phy_vars_ue->lte_frame_parms.Ncp)*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + if ((symbol == 0)) { + // printf("Interpolating %d->0\n",4-ue->frame_parms.Ncp); + // dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][(4-ue->frame_parms.Ncp)*(ue->frame_parms.ofdm_symbol_size)]; + if(((Ns>>1)!=0) || ( ((Ns>>1)==0) && interpolateS11S12)) + { + //LOG_I(PHY,"Interpolate s11-->s0 to get s12 and s13 Ns %d \n", Ns); + dl_ch_prev = (int16_t *)&dl_ch_estimates_previous[(p<<1)+aarx][pilot3*(ue->frame_parms.ofdm_symbol_size)]; - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - } // this is 1/3,2/3 combination for pilots spaced by 3 symbols - else if (symbol == pilot1) { - dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][0]; + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); + } - if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) - multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + interpolateS11S12 = 1; + } // this is 1/3,2/3 combination for pilots spaced by 3 symbols + else if (symbol == pilot1) { + dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][0]; - multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + //LOG_I(PHY,"Interpolate s0-->s4 to get s1 s2 and s3 Ns %d \n", Ns); + if (ue->frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) - multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - } else { - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + uint8_t previous_subframe; + if(Ns>>1 == 0) + previous_subframe = 9; + else + previous_subframe = ((Ns>>1) - 1 )%9; - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - } // pilot spacing 3 symbols (1/3,2/3 combination) - } else if (symbol == pilot2) { - dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot1*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + if((subframe_select(&ue->frame_parms,previous_subframe) == SF_UL)) + { - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,328,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,32440,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - } else { // symbol == pilot3 - // printf("Interpolating 0->%d\n",4-phy_vars_ue->lte_frame_parms.Ncp); - dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + multadd_complex_vector_real_scalar(dl_ch_prev,328,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,32440,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); - if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) - multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,32440,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); + } + else + { + multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - } else { - multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - } // pilot spacing 3 symbols (1/3,2/3 combination) + } + } else { + multadd_complex_vector_real_scalar(dl_ch_prev,328,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)<<1),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); + } // pilot spacing 3 symbols (1/3,2/3 combination) + } else if (symbol == pilot2) { + dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot1*(ue->frame_parms.ofdm_symbol_size)]; + + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); + } else { // symbol == pilot3 + // printf("Interpolating 0->%d\n",4-ue->frame_parms.Ncp); + dl_ch_prev = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(ue->frame_parms.ofdm_symbol_size)]; + + if (ue->frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination) + multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); + } else { + multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); + + multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)<<1),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((ue->frame_parms.ofdm_symbol_size)<<1)),0,ue->frame_parms.ofdm_symbol_size); + } // pilot spacing 3 symbols (1/3,2/3 combination) + + if((ue->rx_offset_diff !=0) && ((Ns>>1) == 9)) + { + //LOG_I(PHY,"Extrapolate s7-->s11 to get s12 and s13 Ns %d\n", Ns); + interpolateS11S12 = 0; + //LOG_E(PHY,"Interpolate s7--s11 s12 s13 pilot 3 Ns %d l %d symbol %d \n", Ns, l, symbol); + int16_t *dlChEst_ofdm11 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(ue->frame_parms.ofdm_symbol_size)]; + int16_t *dlChEst_ofdm7 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(ue->frame_parms.ofdm_symbol_size)]; + + // interpolate ofdm s12: 5/4*ofdms11 + -1/4*ofdms7 5/4 q1.15 40960 -1/4 q1.15 8192 + int16_t *dlChEst_ofdm12 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][12*ue->frame_parms.ofdm_symbol_size]; + for(int i=0; i<(2*ue->frame_parms.ofdm_symbol_size); i++) + { + int64_t tmp_mult = 0; + tmp_mult = ((int64_t)dlChEst_ofdm11[i] * 40960 - (int64_t)dlChEst_ofdm7[i] * 8192); + + tmp_mult = tmp_mult >> 15; + dlChEst_ofdm12[i] = tmp_mult; + } + + // interpolate ofdm s13: 3/2*ofdms11 + -1/2*ofdms7 3/2 q1.15 49152 1/2 q1.15 16384 + int16_t *dlChEst_ofdm13 = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][13*ue->frame_parms.ofdm_symbol_size]; + for(int i=0; i<(2*ue->frame_parms.ofdm_symbol_size); i++) + { + int64_t tmp_mult = 0; + tmp_mult = ((int64_t)dlChEst_ofdm11[i] * 49152 - (int64_t)dlChEst_ofdm7[i] * 16384); + + tmp_mult = tmp_mult >> 15; + dlChEst_ofdm13[i] = tmp_mult; + } + } + + } } - } } } void (*idft)(int16_t *,int16_t *, int); - switch (phy_vars_ue->lte_frame_parms.ofdm_symbol_size) { + switch (ue->frame_parms.ofdm_symbol_size) { case 128: idft = idft128; break; @@ -740,13 +796,23 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, break; } - // do ifft of channel estimate - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) - for (p=0; plte_frame_parms.nb_antennas_tx_eNB; p++) { - if (phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx]) - idft((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); - } + if( ((Ns%2) == 0) && (l == pilot0)) + { + // do ifft of channel estimate + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) + for (p=0; pframe_parms.nb_antenna_ports_eNB; p++) { + if (ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset][(p<<1)+aarx]) + { + //LOG_I(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d \n", Ns, ue->current_thread_id[Ns>>1], l); + idft((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset][(p<<1)+aarx][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1); + } + } + } + + T(T_UE_PHY_DL_CHANNEL_ESTIMATE, T_INT(eNB_id), + T_INT(ue->proc.proc_rxtx[ue->current_thread_id[Ns>>1]].frame_rx%1024), T_INT(ue->proc.proc_rxtx[ue->current_thread_id[Ns>>1]].subframe_rx), + T_INT(0), T_BUFFER(&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates_time[eNB_offset][0][0], 512 * 4)); return(0); } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c deleted file mode 100644 index 63223e5ff5..0000000000 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation_emos.c +++ /dev/null @@ -1,158 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifdef USER_MODE -#include -#endif -#include "defs.h" -#include "PHY/defs.h" -#include "SCHED/phy_procedures_emos.h" - -// TODO: make channel estimation possible for multiple sectors (Gold sequences for pilots) - -//#define DEBUG_CH -int lte_dl_channel_estimation_emos(int dl_ch_estimates_emos[NB_ANTENNAS_RX*NB_ANTENNAS_TX][N_RB_DL_EMOS*N_PILOTS_PER_RB*N_SLOTS_EMOS], - int **rxdataF, - LTE_DL_FRAME_PARMS *frame_parms, - unsigned char Ns, - unsigned char p, - unsigned char l, - unsigned char sector) -{ - - int pilot[2][200] __attribute__((aligned(16))); - unsigned char nu,aarx; - unsigned short k; - unsigned int rb,pilot_cnt; - short ch[2],*pil,*rxF,*dl_ch,*dl_ch_prev; //*f,*f2,*fl,*f2l2,*fr,*f2r2; - int ch_offset,symbol_offset; - unsigned int n; - int i; - - unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame - - if ((p==0) && (l==0) ) - nu = 0; - else if ((p==0) && (l>0)) - nu = 3; - else if ((p==1) && (l==0)) - nu = 3; - else if ((p==1) && (l>0)) - nu = 0; - else { - msg("lte_dl_channel_estimation_emos: p %d, l %d -> ERROR\n",p,l); - return(-1); - } - - if (sector > 2) { - msg("lte_dl_channel_estimation_emos: sector must be 0,1, or 2\n"); - return(-1); - } - - switch (Ns) { - case 0: - ch_offset = ((l==0)?0:1)*2*frame_parms->N_RB_DL; - break; - - case 1: - ch_offset = ((l==0)?2:3)*2*frame_parms->N_RB_DL; - break; - - case 12: - ch_offset = ((l==0)?4:5)*2*frame_parms->N_RB_DL; - break; - - case 13: - ch_offset = ((l==0)?6:7)*2*frame_parms->N_RB_DL; - break; - - default: - msg("lte_dl_channel_estimation_emos: Ns must be 0, 1, 12, or 13\n"); - return(-1); - break; - - } - - symbol_offset = symbol*frame_parms->ofdm_symbol_size; // offset within rxdataF - - k = nu + sector; - - if (k > 6) - k -=6; - -#ifdef DEBUG_CH - printf("Channel Estimation : ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d, symbol=%d\n",ch_offset,frame_parms->ofdm_symbol_size,frame_parms->Ncp,l,Ns,k,symbol); -#endif - - // generate pilot - lte_dl_cell_spec_rx(&pilot[p][0], - frame_parms, - Ns, - (l==0)?0:1, - p); - - - for (aarx=0; aarxnb_antennas_rx; aarx++) { - - pil = (short *)&pilot[p][0]; - rxF = (short *)&rxdataF[aarx][((symbol_offset+k+frame_parms->first_carrier_offset)<<1)]; - dl_ch = (short *)&dl_ch_estimates_emos[(p<<1)+aarx][ch_offset]; - memset(dl_ch,0,frame_parms->N_RB_DL); - - for (pilot_cnt=0; pilot_cntN_RB_DL; pilot_cnt++) { - - dl_ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15); - dl_ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15); - - pil+=2; // Re Im - rxF+=24; // remember replicated format (Re0 Im0 Re0 Im0) !!! - dl_ch+=2; - - } - - // printf("Second half\n"); - // Second half of RBs - rxF = (short *)&rxdataF[aarx][((symbol_offset+1+k)<<1)]; - - for (pilot_cnt=0; pilot_cntN_RB_DL; pilot_cnt++) { - - - dl_ch[0] = (short)(((int)pil[0]*rxF[0] - (int)pil[1]*rxF[1])>>15); - dl_ch[1] = (short)(((int)pil[0]*rxF[1] + (int)pil[1]*rxF[0])>>15); - - pil+=2; - rxF+=24; - dl_ch+=2; - - } - - } - - return(0); -} - diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c index 1dbafdb911..17d44b22f8 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.c @@ -1,39 +1,30 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifdef USER_MODE #include -#endif #include "defs.h" #include "PHY/defs.h" //#define DEBUG_CH -int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, +int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t eNB_offset, int subframe, @@ -51,28 +42,16 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, // unsigned int n; // int i; - int **dl_ch_estimates=phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[0]; - int **rxdataF=phy_vars_ue->lte_ue_common_vars.rxdataF; + int **dl_ch_estimates=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[0]; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF; - ch_offset = (l*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)); + ch_offset = (l*(ue->frame_parms.ofdm_symbol_size)); symbol_offset = ch_offset;//phy_vars_ue->lte_frame_parms.ofdm_symbol_size*l; - // printf("dl_mbsfn_channel_estimation.c: symbol %d (%d)\n",l,ch_offset); - // m=phy_vars_ue->lte_frame_parms.N_RB_DL*6; - /* - if ((l==2) || (l==10)) - k = 0;//m<<1; - else if (l==6) - k = 1;//+(m<<1); - else { - msg("lte_dl_mbsfn: l %d -> ERROR\n",l); - return(-1); - } - */ - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { // generate pilot if ((l==2)||(l==6)||(l==10)) { - lte_dl_mbsfn_rx(phy_vars_ue, + lte_dl_mbsfn_rx(ue, &pilot[0], subframe, l>>2); @@ -81,16 +60,16 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, pil = (short *)&pilot[0]; - rxF = (short *)&rxdataF[aarx][((symbol_offset+phy_vars_ue->lte_frame_parms.first_carrier_offset))]; + rxF = (short *)&rxdataF[aarx][((symbol_offset+ue->frame_parms.first_carrier_offset))]; ch = (short *)&dl_ch_estimates[aarx][ch_offset]; // if (eNb_id==0) - memset(ch,0,4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)); + memset(ch,0,4*(ue->frame_parms.ofdm_symbol_size)); //*********************************************************************** - if ((phy_vars_ue->lte_frame_parms.N_RB_DL==6) || - (phy_vars_ue->lte_frame_parms.N_RB_DL==50) || - (phy_vars_ue->lte_frame_parms.N_RB_DL==100)) { + if ((ue->frame_parms.N_RB_DL==6) || + (ue->frame_parms.N_RB_DL==50) || + (ue->frame_parms.N_RB_DL==100)) { // Interpolation and extrapolation; if (l==6) { @@ -99,10 +78,10 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, rxF+=2; } - for (rb=0; rblte_frame_parms.N_RB_DL; rb++) { + for (rb=0; rbframe_parms.N_RB_DL; rb++) { // ------------------------1st pilot------------------------ - if (rb==(phy_vars_ue->lte_frame_parms.N_RB_DL>>1)) { + if (rb==(ue->frame_parms.N_RB_DL>>1)) { rxF = (short *)&rxdataF[aarx][symbol_offset+1]; if (l==6) @@ -117,7 +96,7 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, /* printf("rb %d: pil0 (%d,%d) x (%d,%d) = (%d,%d)\n", rb,pil[0],pil[1],rxF[0],rxF[1],ch[0],ch[1]);*/ - if ((rb>0)&&(rb!=(phy_vars_ue->lte_frame_parms.N_RB_DL>>1))) { + if ((rb>0)&&(rb!=(ue->frame_parms.N_RB_DL>>1))) { ch[-2] += ch[2]; ch[-1] += ch[3]; } else { @@ -165,8 +144,8 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, ch[20] = (short)(((int)pil[10]*rxF[20] - (int)pil[11]*rxF[21])>>15); ch[21] = (short)(((int)pil[10]*rxF[21] + (int)pil[11]*rxF[20])>>15); - if ((rb<(phy_vars_ue->lte_frame_parms.N_RB_DL-1))&& - (rb!=((phy_vars_ue->lte_frame_parms.N_RB_DL>>1)-1))) { + if ((rb<(ue->frame_parms.N_RB_DL-1))&& + (rb!=((ue->frame_parms.N_RB_DL>>1)-1))) { ch[22] = ch[20]>>1; ch[23] = ch[21]>>1; ch[18] += ch[22]; @@ -188,7 +167,7 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, } //********************************************************************* - else if (phy_vars_ue->lte_frame_parms.N_RB_DL==25) { + else if (ue->frame_parms.N_RB_DL==25) { //printf("Channel estimation\n"); //------------------------ loop over first 12 RBs------------------------ if (l==6) { @@ -711,72 +690,73 @@ int lte_dl_mbsfn_channel_estimation(PHY_VARS_UE *phy_vars_ue, //------------------------Temporal Interpolation ------------------------------ if (l==6) { ch = (short *)&dl_ch_estimates[aarx][ch_offset]; - // printf("Interpolating ch 2,6 => %d\n",ch_offset); - ch_prev = (short *)&dl_ch_estimates[aarx][2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - ch0 = (short *)&dl_ch_estimates[aarx][0*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - memcpy(ch0,ch_prev,4*phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + // printf("Interpolating ch 2,6 => %d\n",ch_offset); + ch_prev = (short *)&dl_ch_estimates[aarx][2*(ue->frame_parms.ofdm_symbol_size)]; + ch0 = (short *)&dl_ch_estimates[aarx][0*(ue->frame_parms.ofdm_symbol_size)]; + memcpy(ch0,ch_prev,4*ue->frame_parms.ofdm_symbol_size); - ch1 = (short *)&dl_ch_estimates[aarx][1*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - memcpy(ch1,ch_prev,4*phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + ch1 = (short *)&dl_ch_estimates[aarx][1*(ue->frame_parms.ofdm_symbol_size)]; + memcpy(ch1,ch_prev,4*ue->frame_parms.ofdm_symbol_size); // 3/4 ch2 + 1/4 ch6 => ch3 - multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); + // 1/2 ch2 + 1/2 ch6 => ch4 - multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); // 1/4 ch2 + 3/4 ch6 => ch5 - multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),0,ue->frame_parms.ofdm_symbol_size); } if (l==10) { ch = (short *)&dl_ch_estimates[aarx][ch_offset]; - ch_prev = (short *)&dl_ch_estimates[aarx][6*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; + ch_prev = (short *)&dl_ch_estimates[aarx][6*(ue->frame_parms.ofdm_symbol_size)]; // 3/4 ch6 + 1/4 ch10 => ch7 - multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,24576,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,8192,ch_prev+(2*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); // 1/2 ch6 + 1/2 ch10 => ch8 - multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,16384,ch_prev+(4*(ue->frame_parms.ofdm_symbol_size)),0,ue->frame_parms.ofdm_symbol_size); // 1/4 ch6 + 3/4 ch10 => ch9 - multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size))),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch_prev,8192,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),1,ue->frame_parms.ofdm_symbol_size); + multadd_complex_vector_real_scalar(ch,24576,ch_prev+(6*((ue->frame_parms.ofdm_symbol_size))),0,ue->frame_parms.ofdm_symbol_size); // 5/4 ch10 - 1/4 ch6 => ch11 // Ch11 - ch_prev = (short *)&dl_ch_estimates[aarx][10*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - ch11 = (short *)&dl_ch_estimates[aarx][11*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - memcpy(ch11,ch_prev,4*phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + ch_prev = (short *)&dl_ch_estimates[aarx][10*(ue->frame_parms.ofdm_symbol_size)]; + ch11 = (short *)&dl_ch_estimates[aarx][11*(ue->frame_parms.ofdm_symbol_size)]; + memcpy(ch11,ch_prev,4*ue->frame_parms.ofdm_symbol_size); } } // do ifft of channel estimate - for (aa=0; aalte_frame_parms.nb_antennas_rx*phy_vars_ue->lte_frame_parms.nb_antennas_tx; aa++) { - if (phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa]) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + for (aa=0; aaframe_parms.nb_antennas_rx*ue->frame_parms.nb_antennas_tx; aa++) { + if (ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa]) { + switch (ue->frame_parms.N_RB_DL) { case 6: - idft128((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft128((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa], 1); break; case 25: - idft512((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft512((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa], 1); break; case 50: - idft1024((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft1024((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa], 1); break; case 75: - idft1536((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft1536((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa], 1); break; case 100: - idft2048((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][aa][8], - (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][aa], + idft2048((int16_t*) &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_offset][aa][8], + (int16_t*) ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_offset][aa], 1); break; default: diff --git a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c index 8b5c1a1806..42409cbaae 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" @@ -36,19 +29,19 @@ #define k1 1024 #define k2 (1024-k1) -int32_t rx_power_avg_eNB[3][3]; +int32_t rx_power_avg_eNB[3]; -void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB, +void lte_eNB_I0_measurements(PHY_VARS_eNB *eNB, int subframe, unsigned char eNB_id, unsigned char clear) { - LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - PHY_MEASUREMENTS_eNB *phy_measurements = &phy_vars_eNB->PHY_measurements_eNB[eNB_id]; - uint32_t *rb_mask = phy_vars_eNB->rb_mask_ul; + LTE_eNB_COMMON *common_vars = &eNB->common_vars; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + PHY_MEASUREMENTS_eNB *measurements = &eNB->measurements; + uint32_t *rb_mask = eNB->rb_mask_ul; uint32_t aarx /* ,rx_power_correction */; uint32_t rb; @@ -59,26 +52,29 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB, // noise measurements // for the moment we measure the noise on the 7th OFDM symbol (in S subframe) - phy_measurements->n0_power_tot = 0; + measurements->n0_power_tot = 0; - for (aarx=0; aarxnb_antennas_rx; aarx++) { - if (clear == 1) - phy_measurements->n0_power[aarx]=0; + if (common_vars->rxdata!=NULL) { + for (aarx=0; aarxnb_antennas_rx; aarx++) { + if (clear == 1) + measurements->n0_power[aarx]=0; + + + measurements->n0_power[aarx] = ((k1*signal_energy(&common_vars->rxdata[aarx][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size], + frame_parms->ofdm_symbol_size)) + k2*measurements->n0_power[aarx])>>10; + //measurements->n0_power[aarx] = (measurements->n0_power[aarx]) * 12*frame_parms->N_RB_DL)/(frame_parms->ofdm_symbol_size); + measurements->n0_power_dB[aarx] = (unsigned short) dB_fixed(measurements->n0_power[aarx]); + measurements->n0_power_tot += measurements->n0_power[aarx]; + } + + measurements->n0_power_tot_dB = (unsigned short) dB_fixed(measurements->n0_power_tot); + + measurements->n0_power_tot_dBm = measurements->n0_power_tot_dB - eNB->rx_total_gain_dB; + // printf("n0_power %d\n",measurements->n0_power_tot_dB); - phy_measurements->n0_power[aarx] = ((k1*signal_energy(&eNB_common_vars->rxdata[eNB_id][aarx][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size], - frame_parms->ofdm_symbol_size)) + k2*phy_measurements->n0_power[aarx])>>10; - //phy_measurements->n0_power[aarx] = (phy_measurements->n0_power[aarx]) * 12*frame_parms->N_RB_DL)/(frame_parms->ofdm_symbol_size); - phy_measurements->n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_measurements->n0_power[aarx]); - phy_measurements->n0_power_tot += phy_measurements->n0_power[aarx]; } - phy_measurements->n0_power_tot_dB = (unsigned short) dB_fixed(phy_measurements->n0_power_tot); - - phy_measurements->n0_power_tot_dBm = phy_measurements->n0_power_tot_dB - phy_vars_eNB->rx_total_gain_eNB_dB; - // printf("n0_power %d\n",phy_measurements->n0_power_tot_dB); - - for (rb=0; rbN_RB_UL; rb++) { n0_power_tot=0; @@ -88,7 +84,7 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB, // select the 7th symbol in an uplink subframe offset = (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size; offset += (7*frame_parms->ofdm_symbol_size); - ul_ch = &eNB_common_vars->rxdataF[eNB_id][aarx][offset]; + ul_ch = &common_vars->rxdataF[aarx][offset]; len = 12; // just do first half of middle PRB for odd number of PRBs if (((frame_parms->N_RB_UL&1) == 1) && @@ -96,36 +92,36 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB, len=6; } if (clear == 1) - phy_measurements->n0_subband_power[aarx][rb]=0; + measurements->n0_subband_power[aarx][rb]=0; AssertFatal(ul_ch, "RX signal buffer (freq) problem"); - phy_measurements->n0_subband_power[aarx][rb] = signal_energy_nodc(ul_ch,len); + measurements->n0_subband_power[aarx][rb] = signal_energy_nodc(ul_ch,len); //((k1*(signal_energy_nodc(ul_ch,len))) - // + (k2*phy_measurements->n0_subband_power[aarx][rb])); + // + (k2*measurements->n0_subband_power[aarx][rb])); - phy_measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(phy_measurements->n0_subband_power[aarx][rb]); - // printf("subframe %d (%d): eNb %d, aarx %d, rb %d len %d: energy %d (%d dB)\n",subframe,offset,eNB_id,aarx,rb,len,signal_energy_nodc(ul_ch,len), - // phy_measurements->n0_subband_power_dB[aarx][rb]); - n0_power_tot += phy_measurements->n0_subband_power[aarx][rb]; + measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(measurements->n0_subband_power[aarx][rb]); + // printf("subframe %d (%d): eNB %d, aarx %d, rb %d len %d: energy %d (%d dB)\n",subframe,offset,eNB_id,aarx,rb,len,signal_energy_nodc(ul_ch,len), + // measurements->n0_subband_power_dB[aarx][rb]); + n0_power_tot += measurements->n0_subband_power[aarx][rb]; } - phy_measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot); - phy_measurements->n0_subband_power_tot_dBm[rb] = phy_measurements->n0_subband_power_tot_dB[rb] - phy_vars_eNB->rx_total_gain_eNB_dB - dB_fixed(frame_parms->N_RB_UL); + measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_power_tot); + measurements->n0_subband_power_tot_dBm[rb] = measurements->n0_subband_power_tot_dB[rb] - eNB->rx_total_gain_dB - dB_fixed(frame_parms->N_RB_UL); } } } -void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb, +void lte_eNB_srs_measurements(PHY_VARS_eNB *eNB, unsigned char eNB_id, unsigned char UE_id, unsigned char init_averaging) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNb->lte_frame_parms; - PHY_MEASUREMENTS_eNB *phy_measurements = &phy_vars_eNb->PHY_measurements_eNB[eNB_id]; - LTE_eNB_SRS *eNB_srs_vars = &phy_vars_eNb->lte_eNB_srs_vars[UE_id]; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + PHY_MEASUREMENTS_eNB *measurements = &eNB->measurements; + LTE_eNB_SRS *srs_vars = &eNB->srs_vars[UE_id]; int32_t aarx,rx_power_correction; int32_t rx_power; @@ -135,7 +131,7 @@ void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb, //printf("Running eNB_srs_measurements for eNB_id %d\n",eNB_id); if (init_averaging == 1) - rx_power_avg_eNB[eNB_id][UE_id] = 0; + rx_power_avg_eNB[UE_id] = 0; rx_power = 0; @@ -151,39 +147,39 @@ void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb, for (aarx=0; aarxnb_antennas_rx; aarx++) { - phy_measurements->rx_spatial_power[UE_id][0][aarx] = - ((signal_energy_nodc(&eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][frame_parms->first_carrier_offset], + measurements->rx_spatial_power[UE_id][0][aarx] = + ((signal_energy_nodc(&srs_vars->srs_ch_estimates[aarx][frame_parms->first_carrier_offset], (frame_parms->N_RB_DL*6)) + - signal_energy_nodc(&eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][1], + signal_energy_nodc(&srs_vars->srs_ch_estimates[aarx][1], (frame_parms->N_RB_DL*6)))*rx_power_correction) - - phy_measurements->n0_power[aarx]; + measurements->n0_power[aarx]; - phy_measurements->rx_spatial_power[UE_id][0][aarx]<<=1; // because of noise only in odd samples + measurements->rx_spatial_power[UE_id][0][aarx]<<=1; // because of noise only in odd samples - phy_measurements->rx_spatial_power_dB[UE_id][0][aarx] = (unsigned short) dB_fixed(phy_measurements->rx_spatial_power[UE_id][0][aarx]); + measurements->rx_spatial_power_dB[UE_id][0][aarx] = (unsigned short) dB_fixed(measurements->rx_spatial_power[UE_id][0][aarx]); - phy_measurements->wideband_cqi[UE_id][aarx] = phy_measurements->rx_spatial_power[UE_id][0][aarx]; + measurements->wideband_cqi[UE_id][aarx] = measurements->rx_spatial_power[UE_id][0][aarx]; - // phy_measurements->rx_power[UE_id][aarx]/=frame_parms->nb_antennas_tx; - phy_measurements->wideband_cqi_dB[UE_id][aarx] = (unsigned short) dB_fixed(phy_measurements->wideband_cqi[UE_id][aarx]); - rx_power += phy_measurements->wideband_cqi[UE_id][aarx]; - // phy_measurements->rx_avg_power_dB[UE_id] += phy_measurements->rx_power_dB[UE_id][aarx]; + // measurements->rx_power[UE_id][aarx]/=frame_parms->nb_antennas_tx; + measurements->wideband_cqi_dB[UE_id][aarx] = (unsigned short) dB_fixed(measurements->wideband_cqi[UE_id][aarx]); + rx_power += measurements->wideband_cqi[UE_id][aarx]; + // measurements->rx_avg_power_dB[UE_id] += measurements->rx_power_dB[UE_id][aarx]; } - // phy_measurements->rx_avg_power_dB[UE_id]/=frame_parms->nb_antennas_rx; + // measurements->rx_avg_power_dB[UE_id]/=frame_parms->nb_antennas_rx; if (init_averaging == 0) - rx_power_avg_eNB[UE_id][eNB_id] = ((k1*rx_power_avg_eNB[UE_id][eNB_id]) + (k2*rx_power))>>10; + rx_power_avg_eNB[UE_id] = ((k1*rx_power_avg_eNB[UE_id]) + (k2*rx_power))>>10; else - rx_power_avg_eNB[UE_id][eNB_id] = rx_power; + rx_power_avg_eNB[UE_id] = rx_power; - phy_measurements->wideband_cqi_tot[UE_id] = dB_fixed2(rx_power,2*phy_measurements->n0_power_tot); + measurements->wideband_cqi_tot[UE_id] = dB_fixed2(rx_power,2*measurements->n0_power_tot); // times 2 since we have noise only in the odd carriers of the srs comb - phy_measurements->rx_rssi_dBm[UE_id] = (int32_t)dB_fixed(rx_power_avg_eNB[UE_id][eNB_id])-phy_vars_eNb->rx_total_gain_eNB_dB; + measurements->rx_rssi_dBm[UE_id] = (int32_t)dB_fixed(rx_power_avg_eNB[UE_id])-eNB->rx_total_gain_dB; @@ -193,52 +189,52 @@ void lte_eNB_srs_measurements(PHY_VARS_eNB *phy_vars_eNb, for (rb=0; rbN_RB_DL; rb++) { - // printf("eNB_common_vars->srs_ch_estimates[0] => %x\n",eNB_common_vars->srs_ch_estimates[0]); + // printf("common_vars->srs_ch_estimates[0] => %x\n",common_vars->srs_ch_estimates[0]); if (rb < 12) - ul_ch = &eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][frame_parms->first_carrier_offset + (rb*12)]; + ul_ch = &srs_vars->srs_ch_estimates[aarx][frame_parms->first_carrier_offset + (rb*12)]; else if (rb>12) - ul_ch = &eNB_srs_vars->srs_ch_estimates[eNB_id][aarx][6 + (rb-13)*12]; + ul_ch = &srs_vars->srs_ch_estimates[aarx][6 + (rb-13)*12]; else { - phy_measurements->subband_cqi_dB[UE_id][aarx][rb] = 0; + measurements->subband_cqi_dB[UE_id][aarx][rb] = 0; continue; } // cqi if (aarx==0) - phy_measurements->subband_cqi_tot[UE_id][rb]=0; + measurements->subband_cqi_tot[UE_id][rb]=0; - phy_measurements->subband_cqi[UE_id][aarx][rb] = (signal_energy_nodc(ul_ch,12))*rx_power_correction - phy_measurements->n0_power[aarx]; + measurements->subband_cqi[UE_id][aarx][rb] = (signal_energy_nodc(ul_ch,12))*rx_power_correction - measurements->n0_power[aarx]; - if (phy_measurements->subband_cqi[UE_id][aarx][rb] < 0) - phy_measurements->subband_cqi[UE_id][aarx][rb]=0; + if (measurements->subband_cqi[UE_id][aarx][rb] < 0) + measurements->subband_cqi[UE_id][aarx][rb]=0; - phy_measurements->subband_cqi_tot[UE_id][rb] += phy_measurements->subband_cqi[UE_id][aarx][rb]; - phy_measurements->subband_cqi_dB[UE_id][aarx][rb] = dB_fixed2(phy_measurements->subband_cqi[UE_id][aarx][rb], - 2*phy_measurements->n0_power[aarx]); + measurements->subband_cqi_tot[UE_id][rb] += measurements->subband_cqi[UE_id][aarx][rb]; + measurements->subband_cqi_dB[UE_id][aarx][rb] = dB_fixed2(measurements->subband_cqi[UE_id][aarx][rb], + 2*measurements->n0_power[aarx]); // 2*n0_power since we have noise from the odd carriers in the comb of the srs - // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,rb,phy_measurements->subband_cqi[eNB_id][aarx][rb],phy_measurements->subband_cqi_dB[eNB_id][aarx][rb]); + // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,rb,measurements->subband_cqi[aarx][rb],measurements->subband_cqi_dB[aarx][rb]); } } for (rb=0; rbN_RB_DL; rb++) { - phy_measurements->subband_cqi_tot_dB[UE_id][rb] = dB_fixed2(phy_measurements->subband_cqi_tot[UE_id][rb], - phy_measurements->n0_power_tot); + measurements->subband_cqi_tot_dB[UE_id][rb] = dB_fixed2(measurements->subband_cqi_tot[UE_id][rb], + measurements->n0_power_tot); /* - if (phy_measurements->subband_cqi_tot_dB[UE_id][rb] == 65) - msg("eNB meas error *****subband_cqi_tot[%d][%d] %d => %d dB (n0 %d)\n",UE_id,rb,phy_measurements->subband_cqi_tot[UE_id][rb],phy_measurements->subband_cqi_tot_dB[UE_id][rb],phy_measurements->n0_power_tot); + if (measurements->subband_cqi_tot_dB[UE_id][rb] == 65) + msg("eNB meas error *****subband_cqi_tot[%d][%d] %d => %d dB (n0 %d)\n",UE_id,rb,measurements->subband_cqi_tot[UE_id][rb],measurements->subband_cqi_tot_dB[UE_id][rb],measurements->n0_power_tot); */ } } -void lte_eNB_I0_measurements_emul(PHY_VARS_eNB *phy_vars_eNb, +void lte_eNB_I0_measurements_emul(PHY_VARS_eNB *eNB, uint8_t sect_id) { - LOG_D(PHY,"EMUL lte_eNB_IO_measurements_emul: eNB %d, sect %d\n",phy_vars_eNb->Mod_id,sect_id); + LOG_D(PHY,"EMUL lte_eNB_IO_measurements_emul: eNB %d, sect %d\n",eNB->Mod_id,sect_id); } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c b/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c index 6f1279b5b8..cce1e06df4 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_est_freq_offset.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: lte_est_freq_offset.c author (c): florian.kaltenberger@eurecom.fr @@ -109,7 +102,7 @@ int lte_est_freq_offset(int **dl_ch_estimates, { int ch_offset, omega, dl_ch_shift; - struct complex16 *omega_cpx; + struct complex16 omega_cpx; double phase_offset; int freq_offset_est; unsigned char aa; @@ -125,7 +118,7 @@ int lte_est_freq_offset(int **dl_ch_estimates, ch_offset = (l*(frame_parms->ofdm_symbol_size)); if ((l!=0) && (l!=(4-frame_parms->Ncp))) { - msg("lte_est_freq_offset: l (%d) must be 0 or %d\n",l,4-frame_parms->Ncp); + LOG_D(PHY,"lte_est_freq_offset: l (%d) must be 0 or %d\n",l,4-frame_parms->Ncp); return(-1); } @@ -149,9 +142,8 @@ int lte_est_freq_offset(int **dl_ch_estimates, // printf("Computing freq_offset\n"); omega = dot_product(dl_ch,dl_ch_prev,(frame_parms->N_RB_DL/2 - 1)*12,dl_ch_shift); //omega = dot_product(dl_ch,dl_ch_prev,frame_parms->ofdm_symbol_size,15); - omega_cpx = (struct complex16*) ω - - // printf("omega (%d,%d)\n",omega_cpx->r,omega_cpx->i); + omega_cpx.r = ((struct complex16*) &omega)->r; + omega_cpx.i = ((struct complex16*) &omega)->i; dl_ch = (int16_t *)&dl_ch_estimates[aa][(((frame_parms->N_RB_DL/2) + 1)*12) + ch_offset]; @@ -162,10 +154,12 @@ int lte_est_freq_offset(int **dl_ch_estimates, // calculate omega = angle(conj(dl_ch)*dl_ch_prev)) omega = dot_product(dl_ch,dl_ch_prev,((frame_parms->N_RB_DL/2) - 1)*12,dl_ch_shift); - omega_cpx->r += ((struct complex16*) &omega)->r; - omega_cpx->i += ((struct complex16*) &omega)->i; + + omega_cpx.r += ((struct complex16*) &omega)->r; + omega_cpx.i += ((struct complex16*) &omega)->i; + // phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r); - phase_offset += atan2((double)omega_cpx->i,(double)omega_cpx->r); + phase_offset += atan2((double)omega_cpx.i,(double)omega_cpx.r); // LOG_I(PHY,"omega (%d,%d) -> %f\n",omega_cpx->r,omega_cpx->i,phase_offset); } @@ -214,7 +208,7 @@ int lte_mbsfn_est_freq_offset(int **dl_ch_estimates, ch_offset = (l*(frame_parms->ofdm_symbol_size)); if ((l!=2) && (l!=6) && (l!=10)) { - msg("lte_est_freq_offset: l (%d) must be 2 or 6 or 10", l); + LOG_D(PHY,"lte_est_freq_offset: l (%d) must be 2 or 6 or 10", l); return(-1); } diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c index dfb39a510f..39a877f47b 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_time.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* file: lte_sync_time.c purpose: coarse timing synchronization for LTE (using PSS) author: florian.kaltenberger@eurecom.fr, oscar.tonelli@yahoo.it @@ -66,31 +59,31 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com if (sync_corr_ue0) { #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue0); + LOG_D(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue0); #endif //common_vars->sync_corr = sync_corr; } else { - msg("[openair][LTE_PHY][SYNC] sync_corr_ue0 not allocated\n"); + LOG_E(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue0 not allocated\n"); return(-1); } if (sync_corr_ue1) { #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue1); + LOG_D(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue1); #endif //common_vars->sync_corr = sync_corr; } else { - msg("[openair][LTE_PHY][SYNC] sync_corr_ue1 not allocated\n"); + LOG_E(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue1 not allocated\n"); return(-1); } if (sync_corr_ue2) { #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue2); + LOG_D(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue allocated at %p\n", sync_corr_ue2); #endif //common_vars->sync_corr = sync_corr; } else { - msg("[openair][LTE_PHY][SYNC] sync_corr_ue2 not allocated\n"); + LOG_E(PHY,"[openair][LTE_PHY][SYNC] sync_corr_ue2 not allocated\n"); return(-1); } @@ -101,10 +94,10 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com // bzero(primary_synch0_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int)); bzero(primary_synch0_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][SYNC] primary_synch0_time allocated at %p\n", primary_synch0_time); + LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch0_time allocated at %p\n", primary_synch0_time); #endif } else { - msg("[openair][LTE_PHY][SYNC] primary_synch0_time not allocated\n"); + LOG_E(PHY,"[openair][LTE_PHY][SYNC] primary_synch0_time not allocated\n"); return(-1); } @@ -115,10 +108,10 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com // bzero(primary_synch1_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int)); bzero(primary_synch1_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][SYNC] primary_synch1_time allocated at %p\n", primary_synch1_time); + LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch1_time allocated at %p\n", primary_synch1_time); #endif } else { - msg("[openair][LTE_PHY][SYNC] primary_synch1_time not allocated\n"); + LOG_E(PHY,"[openair][LTE_PHY][SYNC] primary_synch1_time not allocated\n"); return(-1); } @@ -129,10 +122,10 @@ int lte_sync_time_init(LTE_DL_FRAME_PARMS *frame_parms ) // LTE_UE_COMMON *com // bzero(primary_synch2_time,(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples)*sizeof(int)); bzero(primary_synch2_time,(frame_parms->ofdm_symbol_size)*sizeof(int16_t)*2); #ifdef DEBUG_PHY - msg("[openair][LTE_PHY][SYNC] primary_synch2_time allocated at %p\n", primary_synch2_time); + LOG_D(PHY,"[openair][LTE_PHY][SYNC] primary_synch2_time allocated at %p\n", primary_synch2_time); #endif } else { - msg("[openair][LTE_PHY][SYNC] primary_synch2_time not allocated\n"); + LOG_E(PHY,"[openair][LTE_PHY][SYNC] primary_synch2_time not allocated\n"); return(-1); } @@ -299,32 +292,32 @@ void lte_sync_time_free(void) if (sync_corr_ue0) { - msg("Freeing sync_corr_ue (%p)...\n",sync_corr_ue0); + LOG_D(PHY,"Freeing sync_corr_ue (%p)...\n",sync_corr_ue0); free(sync_corr_ue0); } if (sync_corr_ue1) { - msg("Freeing sync_corr_ue (%p)...\n",sync_corr_ue1); + LOG_D(PHY,"Freeing sync_corr_ue (%p)...\n",sync_corr_ue1); free(sync_corr_ue1); } if (sync_corr_ue2) { - msg("Freeing sync_corr_ue (%p)...\n",sync_corr_ue2); + LOG_D(PHY,"Freeing sync_corr_ue (%p)...\n",sync_corr_ue2); free(sync_corr_ue2); } if (primary_synch0_time) { - msg("Freeing primary_sync0_time ...\n"); + LOG_D(PHY,"Freeing primary_sync0_time ...\n"); free(primary_synch0_time); } if (primary_synch1_time) { - msg("Freeing primary_sync1_time ...\n"); + LOG_D(PHY,"Freeing primary_sync1_time ...\n"); free(primary_synch1_time); } if (primary_synch2_time) { - msg("Freeing primary_sync2_time ...\n"); + LOG_D(PHY,"Freeing primary_sync2_time ...\n"); free(primary_synch2_time); } @@ -362,19 +355,19 @@ int lte_sync_time(int **rxdata, ///rx data in time domain int tmp[3] = {0,0,0}; int length = LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti>>1; - //msg("[SYNC TIME] Calling sync_time.\n"); + //LOG_D(PHY,"[SYNC TIME] Calling sync_time.\n"); if (sync_corr_ue0 == NULL) { - msg("[SYNC TIME] sync_corr_ue0 not yet allocated! Exiting.\n"); + LOG_E(PHY,"[SYNC TIME] sync_corr_ue0 not yet allocated! Exiting.\n"); return(-1); } if (sync_corr_ue1 == NULL) { - msg("[SYNC TIME] sync_corr_ue1 not yet allocated! Exiting.\n"); + LOG_E(PHY,"[SYNC TIME] sync_corr_ue1 not yet allocated! Exiting.\n"); return(-1); } if (sync_corr_ue2 == NULL) { - msg("[SYNC TIME] sync_corr_ue2 not yet allocated! Exiting.\n"); + LOG_E(PHY,"[SYNC TIME] sync_corr_ue2 not yet allocated! Exiting.\n"); return(-1); } @@ -385,18 +378,6 @@ int lte_sync_time(int **rxdata, ///rx data in time domain for (n=0; nsamples_per_tti == 0) && (n>0) && (openair_daq_vars.sync_state==0)) { -#ifdef DEBUG_PHY - msg("[SYNC TIME] pausing for 1000ns, n=%d\n",n); -#endif - rt_sleep(nano2count(1000)); - } - -#endif - sync_corr_ue0[n] = 0; sync_corr_ue0[n+length] = 0; sync_corr_ue1[n] = 0; @@ -484,7 +465,7 @@ int lte_sync_time(int **rxdata, ///rx data in time domain *eNB_id = sync_source; - LOG_D(PHY,"[UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d (%d dB)\n",sync_source,peak_pos,peak_val,dB_fixed(peak_val)/2); + LOG_I(PHY,"[UE] lte_sync_time: Sync source = %d, Peak found at pos %d, val = %d (%d dB)\n",sync_source,peak_pos,peak_val,dB_fixed(peak_val)/2); #ifdef DEBUG_PHY @@ -517,14 +498,15 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain // perform a time domain correlation using the oversampled sync sequence - unsigned int n, ar, peak_val, peak_pos, mean_val; + unsigned int n, ar, peak_val, peak_pos; + uint64_t mean_val; int result; short *primary_synch_time; int eNB_id = frame_parms->Nid_cell%3; - // msg("[SYNC TIME] Calling sync_time_eNB(%p,%p,%d,%d)\n",rxdata,frame_parms,eNB_id,length); + // LOG_E(PHY,"[SYNC TIME] Calling sync_time_eNB(%p,%p,%d,%d)\n",rxdata,frame_parms,eNB_id,length); if (sync_corr_eNB == NULL) { - msg("[SYNC TIME] sync_corr_eNB not yet allocated! Exiting.\n"); + LOG_E(PHY,"[SYNC TIME] sync_corr_eNB not yet allocated! Exiting.\n"); return(-1); } @@ -542,7 +524,7 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain break; default: - msg("[SYNC TIME] Illegal eNB_id!\n"); + LOG_E(PHY,"[SYNC TIME] Illegal eNB_id!\n"); return (-1); } @@ -574,7 +556,7 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain peak_val); } */ - mean_val += (sync_corr_eNB[n]>>10); + mean_val += sync_corr_eNB[n]; if (sync_corr_eNB[n]>peak_val) { peak_val = sync_corr_eNB[n]; @@ -582,17 +564,15 @@ int lte_sync_time_eNB(int32_t **rxdata, ///rx data in time domain } } + mean_val/=length; + *peak_val_out = peak_val; - if (peak_val <= (40*mean_val)) { -#ifdef DEBUG_PHY - msg("[SYNC TIME] No peak found (%u,%u,%u,%u)\n",peak_pos,peak_val,mean_val,40*mean_val); -#endif + if (peak_val <= (40*(uint32_t)mean_val)) { + LOG_D(PHY,"[SYNC TIME] No peak found (%u,%u,%"PRIu64",%"PRIu64")\n",peak_pos,peak_val,mean_val,40*mean_val); return(-1); } else { -#ifdef DEBUG_PHY - msg("[SYNC TIME] Peak found at pos %u, val = %u, mean_val = %u\n",peak_pos,peak_val,mean_val); -#endif + LOG_D(PHY,"[SYNC TIME] Peak found at pos %u, val = %u, mean_val = %"PRIu64"\n",peak_pos,peak_val,mean_val); return(peak_pos); } @@ -611,11 +591,11 @@ int lte_sync_time_eNB_emul(PHY_VARS_eNB *phy_vars_eNB, uint8_t UE_id; uint8_t CC_id = phy_vars_eNB->CC_id; - msg("[PHY] EMUL lte_sync_time_eNB_emul eNB %d, sect_id %d\n",phy_vars_eNB->Mod_id,sect_id); + LOG_E(PHY,"[PHY] EMUL lte_sync_time_eNB_emul eNB %d, sect_id %d\n",phy_vars_eNB->Mod_id,sect_id); *sync_val = 0; for (UE_id=0; UE_idMod_id,UE_id,PHY_vars_UE_g[UE_id]->generate_prach,UE2eNB[UE_id][phy_vars_eNB->Mod_id]->path_loss_dB); + //LOG_E(PHY,"[PHY] EMUL : eNB %d checking UE %d (PRACH %d) PL %d dB\n",phy_vars_eNB->Mod_id,UE_id,PHY_vars_UE_g[UE_id]->generate_prach,UE2eNB[UE_id][phy_vars_eNB->Mod_id]->path_loss_dB); if ((PHY_vars_UE_g[UE_id][CC_id]->generate_prach == 1) && (phy_vars_eNB->Mod_id == (UE_id % NB_eNB_INST))) { *sync_val = 1; return(0); @@ -625,3 +605,4 @@ int lte_sync_time_eNB_emul(PHY_VARS_eNB *phy_vars_eNB, return(-1); } #endif + diff --git a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c index 74b46c5eb6..d428f8e6e6 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_sync_timefreq.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_ESTIMATION/lte_sync_timefreq.c * \brief Initial time frequency scan of entire LTE band @@ -82,7 +74,7 @@ void lte_sync_timefreq(PHY_VARS_UE *ue,int band,unsigned int DL_freq) //compute frequency-domain representation of 6144-sample chunk - rxp = &ue->lte_ue_common_vars.rxdata[0][i]; + rxp = &ue->common_vars.rxdata[0][i]; sp=spectrum; while (1) { @@ -341,8 +333,8 @@ void lte_sync_timefreq(PHY_VARS_UE *ue,int band,unsigned int DL_freq) } // loop on pss index } - if (rxp == &ue->lte_ue_common_vars.rxdata[0][i+38400*4]) { - rxp = &ue->lte_ue_common_vars.rxdata[0][i+38400*4]; + if (rxp == &ue->common_vars.rxdata[0][i+38400*4]) { + rxp = &ue->common_vars.rxdata[0][i+38400*4]; sp=spectrum_p5ms; } else { break; diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index 3bc26ad7e8..c4df34638b 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ // this function fills the PHY_vars->PHY_measurement structure #include "PHY/defs.h" @@ -39,9 +32,12 @@ #define k1 ((long long int) 1000) #define k2 ((long long int) (1024-k1)) -//#define DEBUG_MEAS +//#define DEBUG_MEAS_RRC +//#define DEBUG_MEAS_UE +//#define DEBUG_RANK_EST + +int16_t cond_num_threshold = 0; -#ifdef USER_MODE void print_shorts(char *s,short *x) { @@ -60,42 +56,40 @@ void print_ints(char *s,int *x) ); } -#endif - int16_t get_PL(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; /* int RSoffset; - if (phy_vars_ue->lte_frame_parms.mode1_flag == 1) + if (ue->frame_parms.mode1_flag == 1) RSoffset = 6; else RSoffset = 3; */ - LOG_D(PHY,"get_PL : Frame %d : rsrp %f dBm/RE (%f), eNB power %d dBm/RE\n", phy_vars_ue->frame_rx, - (1.0*dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_index])-(10.0*phy_vars_ue->rx_total_gain_dB))/10.0, - 10*log10((double)phy_vars_ue->PHY_measurements.rsrp[eNB_index]), - phy_vars_ue->lte_frame_parms.pdsch_config_common.referenceSignalPower); + LOG_D(PHY,"get_PL : Frame %d : rsrp %f dBm/RE (%f), eNB power %d dBm/RE\n", ue->proc.proc_rxtx[0].frame_rx, + (1.0*dB_fixed_times10(ue->measurements.rsrp[eNB_index])-(10.0*ue->rx_total_gain_dB))/10.0, + 10*log10((double)ue->measurements.rsrp[eNB_index]), + ue->frame_parms.pdsch_config_common.referenceSignalPower); - return((int16_t)(((10*phy_vars_ue->rx_total_gain_dB) - - dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_index])+ - // dB_fixed_times10(RSoffset*12*PHY_vars_UE_g[Mod_id][CC_id]->lte_frame_parms.N_RB_DL) + - (phy_vars_ue->lte_frame_parms.pdsch_config_common.referenceSignalPower*10))/10)); + return((int16_t)(((10*ue->rx_total_gain_dB) - + dB_fixed_times10(ue->measurements.rsrp[eNB_index])+ + // dB_fixed_times10(RSoffset*12*ue_g[Mod_id][CC_id]->frame_parms.N_RB_DL) + + (ue->frame_parms.pdsch_config_common.referenceSignalPower*10))/10)); } uint8_t get_n_adj_cells (uint8_t Mod_id,uint8_t CC_id) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) - return phy_vars_ue->PHY_measurements.n_adj_cells; + if (ue) + return ue->measurements.n_adj_cells; else return 0; } @@ -103,41 +97,46 @@ uint8_t get_n_adj_cells (uint8_t Mod_id,uint8_t CC_id) uint32_t get_rx_total_gain_dB (uint8_t Mod_id,uint8_t CC_id) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) - return phy_vars_ue->rx_total_gain_dB; + if (ue) + return ue->rx_total_gain_dB; return 0xFFFFFFFF; } uint32_t get_RSSI (uint8_t Mod_id,uint8_t CC_id) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) - return phy_vars_ue->PHY_measurements.rssi; + if (ue) + return ue->measurements.rssi; return 0xFFFFFFFF; } -uint32_t get_RSRP(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) +double get_RSRP(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + AssertFatal(PHY_vars_UE_g!=NULL,"PHY_vars_UE_g is null\n"); + AssertFatal(PHY_vars_UE_g[Mod_id]!=NULL,"PHY_vars_UE_g[%d] is null\n",Mod_id); + AssertFatal(PHY_vars_UE_g[Mod_id][CC_id]!=NULL,"PHY_vars_UE_g[%d][%d] is null\n",Mod_id,CC_id); - if (phy_vars_ue) - return phy_vars_ue->PHY_measurements.rsrp[eNB_index]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - return 0xFFFFFFFF; + if (ue) + return ((dB_fixed_times10(ue->measurements.rsrp[eNB_index]))/10.0- + get_rx_total_gain_dB(Mod_id,0) - + 10*log10(ue->frame_parms.N_RB_DL*12)); + return -140.0; } uint32_t get_RSRQ(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) - return phy_vars_ue->PHY_measurements.rsrq[eNB_index]; + if (ue) + return ue->measurements.rsrq[eNB_index]; return 0xFFFFFFFF; } @@ -145,10 +144,10 @@ uint32_t get_RSRQ(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) int8_t set_RSRP_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rsrp) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) { - phy_vars_ue->PHY_measurements.rsrp_filtered[eNB_index]=rsrp; + if (ue) { + ue->measurements.rsrp_filtered[eNB_index]=rsrp; return 0; } @@ -159,10 +158,10 @@ int8_t set_RSRP_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rs int8_t set_RSRQ_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rsrq) { - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - if (phy_vars_ue) { - phy_vars_ue->PHY_measurements.rsrq_filtered[eNB_index]=rsrq; + if (ue) { + ue->measurements.rsrq_filtered[eNB_index]=rsrq; return 0; } @@ -171,162 +170,216 @@ int8_t set_RSRQ_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rs } -void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, - uint8_t slot, - uint8_t abstraction_flag) +void ue_rrc_measurements(PHY_VARS_UE *ue, + uint8_t slot, + uint8_t abstraction_flag) { + uint8_t subframe = slot>>1; int aarx,rb; + uint8_t pss_symb; + uint8_t sss_symb; + + int32_t **rxdataF; int16_t *rxF,*rxF_pss,*rxF_sss; - uint16_t Nid_cell = phy_vars_ue->lte_frame_parms.Nid_cell; + uint16_t Nid_cell = ue->frame_parms.Nid_cell; uint8_t eNB_offset,nu,l,nushift,k; uint16_t off; + uint8_t previous_thread_id = ue->current_thread_id[subframe]==0 ? (RX_NB_TH-1):(ue->current_thread_id[subframe]-1); + //uint8_t isPss; // indicate if this is a slot for extracting PSS + //uint8_t isSss; // indicate if this is a slot for extracting SSS + //int32_t pss_ext[4][72]; // contain the extracted 6*12 REs for mapping the PSS + //int32_t sss_ext[4][72]; // contain the extracted 6*12 REs for mapping the SSS + //int32_t (*xss_ext)[72]; // point to either pss_ext or sss_ext for common calculation + //int16_t *re,*im; // real and imag part of each 32-bit xss_ext[][] value - for (eNB_offset = 0; eNB_offset<1+phy_vars_ue->PHY_measurements.n_adj_cells; eNB_offset++) { + //LOG_I(PHY,"UE RRC MEAS Start Subframe %d Frame Type %d slot %d \n",subframe,ue->frame_parms.frame_type,slot); + for (eNB_offset = 0; eNB_offset<1+ue->measurements.n_adj_cells; eNB_offset++) { if (eNB_offset==0) { - phy_vars_ue->PHY_measurements.rssi = 0; - phy_vars_ue->PHY_measurements.n0_power_tot = 0; + ue->measurements.rssi = 0; + //ue->measurements.n0_power_tot = 0; if (abstraction_flag == 0) { - if ((phy_vars_ue->lte_frame_parms.frame_type == FDD) && - ((slot == 0) || (slot == 10))) { // FDD PSS/SSS, compute noise in DTX REs + if ( ((ue->frame_parms.frame_type == FDD) && ((subframe == 0) || (subframe == 5))) || + ((ue->frame_parms.frame_type == TDD) && ((subframe == 1) || (subframe == 6))) + ) + { // FDD PSS/SSS, compute noise in DTX REs - if (phy_vars_ue->lte_frame_parms.Ncp==NORMAL) { - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { - - rxF_sss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(5*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - rxF_pss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(6*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - + if (ue->frame_parms.Ncp==NORMAL) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + if(ue->frame_parms.frame_type == FDD) + { + rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(5*ue->frame_parms.ofdm_symbol_size)]; + rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)]; + } + else + { + rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[previous_thread_id].rxdataF[aarx][(13*ue->frame_parms.ofdm_symbol_size)]; + rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(2*ue->frame_parms.ofdm_symbol_size)]; + } //-ve spectrum from SSS - // printf("slot %d: SSS DTX: %d,%d, non-DTX %d,%d\n",slot,rxF_pss[-72],rxF_pss[-71],rxF_pss[-36],rxF_pss[-35]); - // phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); - // printf("sssn36 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); - phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); - // printf("sssm32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); //+ve spectrum from SSS - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63])); - // printf("sssp32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63])); + // printf("sssp32 %d\n",ue->measurements.n0_power[aarx]); //+ve spectrum from PSS - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+70]*rxF_pss[2+70])+((int32_t)rxF_pss[2+69]*rxF_pss[2+69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+68]*rxF_pss[2+68])+((int32_t)rxF_pss[2+67]*rxF_pss[2+67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63])); - // printf("pss32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); //-ve spectrum from PSS - rxF_pss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(7*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); - // printf("pssm36 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); - // printf("pssm32 %d\n",phy_vars_ue->PHY_measurements.n0_power[aarx]); - phy_vars_ue->PHY_measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power[aarx]/12); - phy_vars_ue->PHY_measurements.n0_power_tot += phy_vars_ue->PHY_measurements.n0_power[aarx]; - } + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+70]*rxF_pss[2+70])+((int32_t)rxF_pss[2+69]*rxF_pss[2+69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+68]*rxF_pss[2+68])+((int32_t)rxF_pss[2+67]*rxF_pss[2+67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63])); + // printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS + if(ue->frame_parms.frame_type == FDD) + { + rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(6*ue->frame_parms.ofdm_symbol_size)]; + rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)]; + } + else + { + rxF_sss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[previous_thread_id].rxdataF[aarx][(14*ue->frame_parms.ofdm_symbol_size)]; + rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(3*ue->frame_parms.ofdm_symbol_size)]; + } + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); + // printf("pssm36 %d\n",ue->measurements.n0_power[aarx]); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); - phy_vars_ue->PHY_measurements.n0_power_tot_dB = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power_tot/(12*aarx)); - phy_vars_ue->PHY_measurements.n0_power_tot_dBm = phy_vars_ue->PHY_measurements.n0_power_tot_dB - phy_vars_ue->rx_total_gain_dB - dB_fixed(phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - } + ue->measurements.n0_power[aarx] = (((int32_t)rxF_sss[-70]*rxF_sss[-70])+((int32_t)rxF_sss[-69]*rxF_sss[-69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[-68]*rxF_sss[-68])+((int32_t)rxF_sss[-67]*rxF_sss[-67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[-66]*rxF_sss[-66])+((int32_t)rxF_sss[-65]*rxF_sss[-65])); + + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); + // printf("pssm32 %d\n",ue->measurements.n0_power[aarx]); + ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/12); + ue->measurements.n0_power_tot /*+=*/ = ue->measurements.n0_power[aarx]; } - else if ((phy_vars_ue->lte_frame_parms.frame_type == TDD) && - (slot == 1)) { // TDD SSS, compute noise in DTX REs - if (phy_vars_ue->lte_frame_parms.Ncp==NORMAL) { - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + //LOG_I(PHY,"Subframe %d RRC UE MEAS Noise Level %d \n", subframe, ue->measurements.n0_power_tot); - rxF_sss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(6*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - // note this is a dummy pointer, the pss is not really there! - // in FDD the pss is in the symbol after the sss, but not in TDD - rxF_pss = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(7*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - - //-ve spectrum from SSS - // phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); - phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); - //+ve spectrum from SSS - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+72]*rxF_sss[2+72])+((int32_t)rxF_sss[2+71]*rxF_sss[2+71])); - phy_vars_ue->PHY_measurements.n0_power[aarx] = (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67])); - phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65])); - // phy_vars_ue->PHY_measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63])); - - phy_vars_ue->PHY_measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power[aarx]/(6)); - phy_vars_ue->PHY_measurements.n0_power_tot += phy_vars_ue->PHY_measurements.n0_power[aarx]; - } - phy_vars_ue->PHY_measurements.n0_power_tot_dB = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.n0_power_tot/(6*aarx)); - phy_vars_ue->PHY_measurements.n0_power_tot_dBm = phy_vars_ue->PHY_measurements.n0_power_tot_dB - phy_vars_ue->rx_total_gain_dB - dB_fixed(phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - - - } - } + ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(12*aarx)); + ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size); + } else { + LOG_E(PHY, "Not yet implemented: noise power calculation when prefix length = EXTENDED\n"); + } + } + else if ((ue->frame_parms.frame_type == TDD) && + ((subframe == 1) || (subframe == 6))) { // TDD PSS/SSS, compute noise in DTX REs // 2016-09-29 wilson fix incorrect noise power calculation + + + pss_symb = 2; + sss_symb = ue->frame_parms.symbols_per_tti-1; + if (ue->frame_parms.Ncp==NORMAL) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[(ue->current_thread_id[subframe])].rxdataF; + rxF_pss = (int16_t *) &rxdataF[aarx][((pss_symb*(ue->frame_parms.ofdm_symbol_size)))]; + + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[previous_thread_id].rxdataF; + rxF_sss = (int16_t *) &rxdataF[aarx][((sss_symb*(ue->frame_parms.ofdm_symbol_size)))]; + + //-ve spectrum from SSS + // printf("slot %d: SSS DTX: %d,%d, non-DTX %d,%d\n",slot,rxF_pss[-72],rxF_pss[-71],rxF_pss[-36],rxF_pss[-35]); + + // ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); + // printf("sssn36 %d\n",ue->measurements.n0_power[aarx]); + ue->measurements.n0_power[aarx] = (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); + // printf("sssm32 %d\n",ue->measurements.n0_power[aarx]); + //+ve spectrum from SSS + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+70]*rxF_sss[2+70])+((int32_t)rxF_sss[2+69]*rxF_sss[2+69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+68]*rxF_sss[2+68])+((int32_t)rxF_sss[2+67]*rxF_sss[2+67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+66]*rxF_sss[2+66])+((int32_t)rxF_sss[2+65]*rxF_sss[2+65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_sss[2+64]*rxF_sss[2+64])+((int32_t)rxF_sss[2+63]*rxF_sss[2+63])); + // printf("sssp32 %d\n",ue->measurements.n0_power[aarx]); + //+ve spectrum from PSS + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+70]*rxF_pss[2+70])+((int32_t)rxF_pss[2+69]*rxF_pss[2+69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+68]*rxF_pss[2+68])+((int32_t)rxF_pss[2+67]*rxF_pss[2+67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+66]*rxF_pss[2+66])+((int32_t)rxF_pss[2+65]*rxF_pss[2+65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[2+64]*rxF_pss[2+64])+((int32_t)rxF_pss[2+63]*rxF_pss[2+63])); + // printf("pss32 %d\n",ue->measurements.n0_power[aarx]); //-ve spectrum from PSS + rxF_pss = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(7*ue->frame_parms.ofdm_symbol_size)]; + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-72]*rxF_pss[-72])+((int32_t)rxF_pss[-71]*rxF_pss[-71])); + // printf("pssm36 %d\n",ue->measurements.n0_power[aarx]); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-70]*rxF_pss[-70])+((int32_t)rxF_pss[-69]*rxF_pss[-69])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-68]*rxF_pss[-68])+((int32_t)rxF_pss[-67]*rxF_pss[-67])); + ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-66]*rxF_pss[-66])+((int32_t)rxF_pss[-65]*rxF_pss[-65])); + // ue->measurements.n0_power[aarx] += (((int32_t)rxF_pss[-64]*rxF_pss[-64])+((int32_t)rxF_pss[-63]*rxF_pss[-63])); + // printf("pssm32 %d\n",ue->measurements.n0_power[aarx]); + ue->measurements.n0_power_dB[aarx] = (unsigned short) dB_fixed(ue->measurements.n0_power[aarx]/12); + ue->measurements.n0_power_tot /*+=*/ = ue->measurements.n0_power[aarx]; + } + + ue->measurements.n0_power_tot_dB = (unsigned short) dB_fixed(ue->measurements.n0_power_tot/(12*aarx)); + ue->measurements.n0_power_tot_dBm = ue->measurements.n0_power_tot_dB - ue->rx_total_gain_dB - dB_fixed(ue->frame_parms.ofdm_symbol_size); + + //LOG_I(PHY,"Subframe %d RRC UE MEAS Noise Level %d \n", subframe, ue->measurements.n0_power_tot); + + } + } } } // recompute nushift with eNB_offset corresponding to adjacent eNB on which to perform channel estimation - // printf("[PHY][UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, Nid2 %d, nushift %d, eNB_offset %d)\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,slot,Nid_cell,Nid2,nushift,eNB_offset); + // printf("[PHY][UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, Nid2 %d, nushift %d, eNB_offset %d)\n",ue->Mod_id,ue->frame,slot,Nid_cell,Nid2,nushift,eNB_offset); if (eNB_offset > 0) - Nid_cell = phy_vars_ue->PHY_measurements.adj_cell_id[eNB_offset-1]; + Nid_cell = ue->measurements.adj_cell_id[eNB_offset-1]; nushift = Nid_cell%6; - phy_vars_ue->PHY_measurements.rsrp[eNB_offset] = 0; + ue->measurements.rsrp[eNB_offset] = 0; if (abstraction_flag == 0) { // compute RSRP using symbols 0 and 4-frame_parms->Ncp - for (l=0,nu=0; l<=(4-phy_vars_ue->lte_frame_parms.Ncp); l+=(4-phy_vars_ue->lte_frame_parms.Ncp),nu=3) { + for (l=0,nu=0; l<=(4-ue->frame_parms.Ncp); l+=(4-ue->frame_parms.Ncp),nu=3) { k = (nu + nushift)%6; -#ifdef DEBUG_MEAS - LOG_I(PHY,"[UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,slot,Nid_cell,nushift, + //#ifdef DEBUG_MEAS_RRC + LOG_D(PHY,"[UE %d] Frame %d subframe %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,Nid_cell,nushift, eNB_offset,k,l); -#endif + //#endif - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { - rxF = (int16_t *)&phy_vars_ue->lte_ue_common_vars.rxdataF[aarx][(l*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)]; - off = (phy_vars_ue->lte_frame_parms.first_carrier_offset+k)<<1; + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + rxF = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)]; + off = (ue->frame_parms.first_carrier_offset+k)<<1; - if (l==(4-phy_vars_ue->lte_frame_parms.Ncp)) { - for (rb=0; rblte_frame_parms.N_RB_DL; rb++) { + if (l==(4-ue->frame_parms.Ncp)) { + for (rb=0; rbframe_parms.N_RB_DL; rb++) { // printf("rb %d, off %d, off2 %d\n",rb,off,off2); - phy_vars_ue->PHY_measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])); + ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])); // printf("rb %d, off %d : %d\n",rb,off,((((int32_t)rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]))); - // if ((phy_vars_ue->frame_rx&0x3ff) == 0) - // printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1]))); + // if ((ue->frame_rx&0x3ff) == 0) + // printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1]))); + - off+=12; - if (off>=(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1)) + if (off>=(ue->frame_parms.ofdm_symbol_size<<1)) off = (1+k)<<1; - phy_vars_ue->PHY_measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])); + ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])); // printf("rb %d, off %d : %d\n",rb,off,(((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]))); /* - if ((phy_vars_ue->frame_rx&0x3ff) == 0) + if ((ue->frame_rx&0x3ff) == 0) printf("rb %d, off %d : %d\n",rb,off,((rxF[off]*rxF[off])+(rxF[off+1]*rxF[off+1]))); */ off+=12; - if (off>=(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1)) + if (off>=(ue->frame_parms.ofdm_symbol_size<<1)) off = (1+k)<<1; } @@ -334,78 +387,81 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue, /* if ((eNB_offset==0)&&(l==0)) { for (i=0;i<6;i++,off2+=4) - phy_vars_ue->PHY_measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1])); - if (off2==(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<2)) + ue->measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1])); + if (off2==(ue->frame_parms.ofdm_symbol_size<<2)) off2=4; for (i=0;i<6;i++,off2+=4) - phy_vars_ue->PHY_measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1])); + ue->measurements.rssi += ((rxF[off2]*rxF[off2])+(rxF[off2+1]*rxF[off2+1])); } */ - // printf("slot %d, rb %d => rsrp %d, rssi %d\n",slot,rb,phy_vars_ue->PHY_measurements.rsrp[eNB_offset],phy_vars_ue->PHY_measurements.rssi); + // printf("slot %d, rb %d => rsrp %d, rssi %d\n",slot,rb,ue->measurements.rsrp[eNB_offset],ue->measurements.rssi); } } } // 2 RE per PRB - // phy_vars_ue->PHY_measurements.rsrp[eNB_offset]/=(24*phy_vars_ue->lte_frame_parms.N_RB_DL); - phy_vars_ue->PHY_measurements.rsrp[eNB_offset]/=(2*phy_vars_ue->lte_frame_parms.N_RB_DL*phy_vars_ue->lte_frame_parms.ofdm_symbol_size); - // LOG_I(PHY,"eNB: %d, RSRP: %d \n",eNB_offset,phy_vars_ue->PHY_measurements.rsrp[eNB_offset]); + // ue->measurements.rsrp[eNB_offset]/=(24*ue->frame_parms.N_RB_DL); + ue->measurements.rsrp[eNB_offset]/=(2*ue->frame_parms.N_RB_DL*ue->frame_parms.ofdm_symbol_size); + // LOG_I(PHY,"eNB: %d, RSRP: %d \n",eNB_offset,ue->measurements.rsrp[eNB_offset]); if (eNB_offset == 0) { - // phy_vars_ue->PHY_measurements.rssi/=(24*phy_vars_ue->lte_frame_parms.N_RB_DL); - // phy_vars_ue->PHY_measurements.rssi*=rx_power_correction; - // phy_vars_ue->PHY_measurements.rssi=phy_vars_ue->PHY_measurements.rsrp[0]*24/2; - phy_vars_ue->PHY_measurements.rssi=phy_vars_ue->PHY_measurements.rsrp[0]*(12*phy_vars_ue->lte_frame_parms.N_RB_DL); + // ue->measurements.rssi/=(24*ue->frame_parms.N_RB_DL); + // ue->measurements.rssi*=rx_power_correction; + // ue->measurements.rssi=ue->measurements.rsrp[0]*24/2; + ue->measurements.rssi=ue->measurements.rsrp[0]*(12*ue->frame_parms.N_RB_DL); } - if (phy_vars_ue->PHY_measurements.rssi>0) - phy_vars_ue->PHY_measurements.rsrq[eNB_offset] = 100*phy_vars_ue->PHY_measurements.rsrp[eNB_offset]*phy_vars_ue->lte_frame_parms.N_RB_DL/phy_vars_ue->PHY_measurements.rssi; + if (ue->measurements.rssi>0) + ue->measurements.rsrq[eNB_offset] = 100*ue->measurements.rsrp[eNB_offset]*ue->frame_parms.N_RB_DL/ue->measurements.rssi; else - phy_vars_ue->PHY_measurements.rsrq[eNB_offset] = -12000; + ue->measurements.rsrq[eNB_offset] = -12000; - //((200*phy_vars_ue->PHY_measurements.rsrq[eNB_offset]) + ((1024-200)*100*phy_vars_ue->PHY_measurements.rsrp[eNB_offset]*phy_vars_ue->lte_frame_parms.N_RB_DL/phy_vars_ue->PHY_measurements.rssi))>>10; + //((200*ue->measurements.rsrq[eNB_offset]) + ((1024-200)*100*ue->measurements.rsrp[eNB_offset]*ue->frame_parms.N_RB_DL/ue->measurements.rssi))>>10; } else { // Do abstraction of RSRP and RSRQ - phy_vars_ue->PHY_measurements.rssi = phy_vars_ue->PHY_measurements.rx_power_avg[0]; + ue->measurements.rssi = ue->measurements.rx_power_avg[0]; // dummay value for the moment - phy_vars_ue->PHY_measurements.rsrp[eNB_offset] = -93 ; - phy_vars_ue->PHY_measurements.rsrq[eNB_offset] = 3; + ue->measurements.rsrp[eNB_offset] = -93 ; + ue->measurements.rsrq[eNB_offset] = 3; } -#ifdef DEBUG_MEAS + //#ifdef DEBUG_MEAS_RRC // if (slot == 0) { if (eNB_offset == 0) - LOG_I(PHY,"[UE %d] Frame %d, slot %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx,slot,10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB, - 10*log10(phy_vars_ue->PHY_measurements.rssi), - phy_vars_ue->rx_total_gain_dB, - phy_vars_ue->PHY_measurements.n0_power_tot_dBm); + + LOG_D(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id, + ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB, + 10*log10(ue->measurements.rssi), + ue->rx_total_gain_dB, + ue->measurements.n0_power_tot_dBm); - LOG_I(PHY,"[UE %d] Frame %d, slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n", - phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx,slot,eNB_offset, - (eNB_offset>0) ? phy_vars_ue->PHY_measurements.adj_cell_id[eNB_offset-1] : phy_vars_ue->lte_frame_parms.Nid_cell, - 10*log10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])-phy_vars_ue->rx_total_gain_dB, - phy_vars_ue->PHY_measurements.rsrp[eNB_offset], - (10*log10(phy_vars_ue->PHY_measurements.rsrq[eNB_offset]))); - //LOG_D(PHY,"RSRP_total_dB: %3.2f \n",(dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])/10.0)-phy_vars_ue->rx_total_gain_dB-dB_fixed(phy_vars_ue->lte_frame_parms.N_RB_DL*12)); + LOG_D(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n", + ue->Mod_id, + ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,eNB_offset, + (eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell, + 10*log10(ue->measurements.rsrp[eNB_offset])-ue->rx_total_gain_dB, + ue->measurements.rsrp[eNB_offset], + (10*log10(ue->measurements.rsrq[eNB_offset]))); + //LOG_D(PHY,"RSRP_total_dB: %3.2f \n",(dB_fixed_times10(ue->measurements.rsrp[eNB_offset])/10.0)-ue->rx_total_gain_dB-dB_fixed(ue->frame_parms.N_RB_DL*12)); - //LOG_D(PHY,"RSRP_dB: %3.2f \n",(dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])/10.0)); - //LOG_D(PHY,"gain_loss_dB: %d \n",phy_vars_ue->rx_total_gain_dB); - //LOG_D(PHY,"gain_fixed_dB: %d \n",dB_fixed(phy_vars_ue->lte_frame_parms.N_RB_DL*12)); + //LOG_D(PHY,"RSRP_dB: %3.2f \n",(dB_fixed_times10(ue->measurements.rsrp[eNB_offset])/10.0)); + //LOG_D(PHY,"gain_loss_dB: %d \n",ue->rx_total_gain_dB); + //LOG_D(PHY,"gain_fixed_dB: %d \n",dB_fixed(ue->frame_parms.N_RB_DL*12)); // } -#endif + //#endif } } -void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue, +void lte_ue_measurements(PHY_VARS_UE *ue, unsigned int subframe_offset, unsigned char N0_symbol, - unsigned char abstraction_flag) + unsigned char abstraction_flag, + unsigned char rank_adaptation, + uint8_t subframe) { @@ -419,10 +475,18 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue, int16x8_t *dl_ch0_128, *dl_ch1_128; #endif int *dl_ch0,*dl_ch1; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; + + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; int nb_subbands,subband_size,last_subband_size; int N_RB_DL = frame_parms->N_RB_DL; + + int rank_tm3_tm4; + + + ue->measurements.nb_antennas_rx = frame_parms->nb_antennas_rx; + + switch (N_RB_DL) { case 6: nb_subbands = 6; @@ -451,136 +515,166 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue, } // signal measurements - for (eNB_id=0; eNB_idn_connected_eNB; eNB_id++) { + for (eNB_id=0; eNB_idn_connected_eNB; eNB_id++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) { - phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx] = - (signal_energy_nodc(&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0], + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) { + ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = + (signal_energy_nodc(&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0], (N_RB_DL*12))); - //- phy_vars_ue->PHY_measurements.n0_power[aarx]; + //- ue->measurements.n0_power[aarx]; - if (phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx]<0) - phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx] = 0; //phy_vars_ue->PHY_measurements.n0_power[aarx]; + if (ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]<0) + ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = 0; //ue->measurements.n0_power[aarx]; - phy_vars_ue->PHY_measurements.rx_spatial_power_dB[eNB_id][aatx][aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx]); + ue->measurements.rx_spatial_power_dB[eNB_id][aatx][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]); if (aatx==0) - phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx] = phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx]; + ue->measurements.rx_power[eNB_id][aarx] = ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]; else - phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx] += phy_vars_ue->PHY_measurements.rx_spatial_power[eNB_id][aatx][aarx]; + ue->measurements.rx_power[eNB_id][aarx] += ue->measurements.rx_spatial_power[eNB_id][aatx][aarx]; } //aatx - phy_vars_ue->PHY_measurements.rx_power_dB[eNB_id][aarx] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx]); + ue->measurements.rx_power_dB[eNB_id][aarx] = (unsigned short) dB_fixed(ue->measurements.rx_power[eNB_id][aarx]); if (aarx==0) - phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id] = phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx]; + ue->measurements.rx_power_tot[eNB_id] = ue->measurements.rx_power[eNB_id][aarx]; else - phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id] += phy_vars_ue->PHY_measurements.rx_power[eNB_id][aarx]; + ue->measurements.rx_power_tot[eNB_id] += ue->measurements.rx_power[eNB_id][aarx]; } //aarx - phy_vars_ue->PHY_measurements.rx_power_tot_dB[eNB_id] = (unsigned short) dB_fixed(phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id]); + ue->measurements.rx_power_tot_dB[eNB_id] = (unsigned short) dB_fixed(ue->measurements.rx_power_tot[eNB_id]); } //eNB_id - // filter to remove jitter - if (phy_vars_ue->init_averaging == 0) { - for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) - phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id] = (int) - (((k1*((long long int)(phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id]))) + - (k2*((long long int)(phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id]))))>>10); - - phy_vars_ue->PHY_measurements.n0_power_avg = (int) - (((k1*((long long int) (phy_vars_ue->PHY_measurements.n0_power_avg))) + - (k2*((long long int) (phy_vars_ue->PHY_measurements.n0_power_tot))))>>10); - } else { - for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) - phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id] = phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id]; - - phy_vars_ue->PHY_measurements.n0_power_avg = phy_vars_ue->PHY_measurements.n0_power_tot; - phy_vars_ue->init_averaging = 0; - } - - for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) { - phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] = dB_fixed( phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id]); - phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(phy_vars_ue->PHY_measurements.rx_power_tot[eNB_id],phy_vars_ue->PHY_measurements.n0_power_tot); - phy_vars_ue->PHY_measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(phy_vars_ue->PHY_measurements.rx_power_avg[eNB_id],phy_vars_ue->PHY_measurements.n0_power_avg); - phy_vars_ue->PHY_measurements.rx_rssi_dBm[eNB_id] = phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id] - phy_vars_ue->rx_total_gain_dB; -#ifdef DEBUG_MEAS - LOG_I(PHY,"[eNB %d] lte_ue_measurements: RSSI %d dBm, RSSI (digital) %d dB\n", - eNB_id,phy_vars_ue->PHY_measurements.rx_rssi_dBm[eNB_id], - phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB_id]); + eNB_id=0; + if (ue->transmission_mode[0]==4 || ue->transmission_mode[0]==3){ + if (rank_adaptation == 1) + rank_tm3_tm4 = rank_estimation_tm3_tm4(&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][0][4], + &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][2][4], + &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][1][4], + &ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[eNB_id][3][4], + N_RB_DL); + else + rank_tm3_tm4=1; +#ifdef DEBUG_RANK_EST + printf("rank tm3 or tm4 %d\n", rank_tm3_tm4); #endif } - phy_vars_ue->PHY_measurements.n0_power_avg_dB = dB_fixed( phy_vars_ue->PHY_measurements.n0_power_avg); + if (ue->transmission_mode[eNB_id]!=4 && ue->transmission_mode[eNB_id]!=3) + ue->measurements.rank[eNB_id] = 0; + else + ue->measurements.rank[eNB_id] = rank_tm3_tm4; + // printf ("tx mode %d\n", ue->transmission_mode[eNB_id]); + // printf ("rank %d\n", ue->PHY_measurements.rank[eNB_id]); - for (eNB_id = 0; eNB_id < phy_vars_ue->n_connected_eNB; eNB_id++) { - if (frame_parms->mode1_flag==0) { + // filter to remove jitter + if (ue->init_averaging == 0) { + for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) + ue->measurements.rx_power_avg[eNB_id] = (int) + (((k1*((long long int)(ue->measurements.rx_power_avg[eNB_id]))) + + (k2*((long long int)(ue->measurements.rx_power_tot[eNB_id]))))>>10); + + //LOG_I(PHY,"Noise Power Computation: k1 %d k2 %d n0 avg %d n0 tot %d\n", k1, k2, ue->measurements.n0_power_avg, + // ue->measurements.n0_power_tot); + ue->measurements.n0_power_avg = (int) + (((k1*((long long int) (ue->measurements.n0_power_avg))) + + (k2*((long long int) (ue->measurements.n0_power_tot))))>>10); + } else { + for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) + ue->measurements.rx_power_avg[eNB_id] = ue->measurements.rx_power_tot[eNB_id]; + + ue->measurements.n0_power_avg = ue->measurements.n0_power_tot; + ue->init_averaging = 0; + } + + for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) { + ue->measurements.rx_power_avg_dB[eNB_id] = dB_fixed( ue->measurements.rx_power_avg[eNB_id]); + ue->measurements.wideband_cqi_tot[eNB_id] = dB_fixed2(ue->measurements.rx_power_tot[eNB_id],ue->measurements.n0_power_tot); + ue->measurements.wideband_cqi_avg[eNB_id] = dB_fixed2(ue->measurements.rx_power_avg[eNB_id],ue->measurements.n0_power_avg); + ue->measurements.rx_rssi_dBm[eNB_id] = ue->measurements.rx_power_avg_dB[eNB_id] - ue->rx_total_gain_dB; +#ifdef DEBUG_MEAS_UE + LOG_I(PHY,"[eNB %d] Subframe %d, RSSI %d dBm, RSSI (digital) %d dB, WBandCQI %d dB, rxPwrAvg %d, n0PwrAvg %d\n", + eNB_id, + subframe, + ue->measurements.rx_rssi_dBm[eNB_id], + ue->measurements.rx_power_avg_dB[eNB_id], + ue->measurements.wideband_cqi_avg[eNB_id], + ue->measurements.rx_power_avg[eNB_id], + ue->measurements.n0_power_tot); +#endif + } + + ue->measurements.n0_power_avg_dB = dB_fixed( ue->measurements.n0_power_avg); + + for (eNB_id = 0; eNB_id < ue->n_connected_eNB; eNB_id++) { + if (frame_parms->nb_antenna_ports_eNB!=1) { // cqi/pmi information for (aarx=0; aarxnb_antennas_rx; aarx++) { - dl_ch0 = &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4]; - dl_ch1 = &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; + dl_ch0 = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4]; + dl_ch1 = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4]; for (subband=0; subbandPHY_measurements.subband_cqi_tot[eNB_id][subband]=0; + ue->measurements.subband_cqi_tot[eNB_id][subband]=0; if ((subband<(nb_subbands-1))||(N_RB_DL==6)) { /*for (i=0;i<48;i++) msg("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); */ - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = + ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,subband_size) + signal_energy_nodc(dl_ch1,subband_size)); - if ( phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] < 0) - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]=0; + if ( ue->measurements.subband_cqi[eNB_id][aarx][subband] < 0) + ue->measurements.subband_cqi[eNB_id][aarx][subband]=0; /* else - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]-=phy_vars_ue->PHY_measurements.n0_power[aarx]; + ue->measurements.subband_cqi[eNB_id][aarx][subband]-=ue->measurements.n0_power[aarx]; */ - phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]; - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband], - phy_vars_ue->PHY_measurements.n0_power[aarx]); + ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband]; + ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband], + ue->measurements.n0_power[aarx]); } else { // this is for the last subband which is smaller in size // for (i=0;i<12;i++) // printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,last_subband_size) + - signal_energy_nodc(dl_ch1,last_subband_size)); // - phy_vars_ue->PHY_measurements.n0_power[aarx]; - phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]; - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband], - phy_vars_ue->PHY_measurements.n0_power[aarx]); + ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,last_subband_size) + + signal_energy_nodc(dl_ch1,last_subband_size)); // - ue->measurements.n0_power[aarx]; + ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband]; + ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband], + ue->measurements.n0_power[aarx]); } dl_ch1+=subband_size; dl_ch0+=subband_size; - // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband]); + // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,ue->measurements.subband_cqi[eNB_id][aarx][subband],ue->measurements.subband_cqi_dB[eNB_id][aarx][subband]); } } for (subband=0; subbandPHY_measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband],phy_vars_ue->PHY_measurements.n0_power_tot); - // msg("subband_cqi_tot[%d][%d] => %d dB (n0 %d)\n",eNB_id,subband,phy_vars_ue->PHY_measurements.subband_cqi_tot_dB[eNB_id][subband],phy_vars_ue->PHY_measurements.n0_power_tot); + ue->measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(ue->measurements.subband_cqi_tot[eNB_id][subband],ue->measurements.n0_power_tot); + // msg("subband_cqi_tot[%d][%d] => %d dB (n0 %d)\n",eNB_id,subband,ue->measurements.subband_cqi_tot_dB[eNB_id][subband],ue->measurements.n0_power_tot); } for (aarx=0; aarxnb_antennas_rx; aarx++) { + //printf("aarx=%d", aarx); // skip the first 4 RE due to interpolation filter length of 5 (not possible to skip 5 due to 128i alignment, must be multiple of 128bit) #if defined(__x86_64__) || defined(__i386__) __m128i pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1 /* ,mmtmpPMI2,mmtmpPMI3 */ ; - dl_ch0_128 = (__m128i *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4]; - dl_ch1_128 = (__m128i *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; + dl_ch0_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4]; + dl_ch1_128 = (__m128i *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4]; #elif defined(__arm__) int32x4_t pmi128_re,pmi128_im,mmtmpPMI0,mmtmpPMI1,mmtmpPMI0b,mmtmpPMI1b; - dl_ch0_128 = (int16x8_t *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4]; - dl_ch1_128 = (int16x8_t *)&phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][2+aarx][4]; + dl_ch0_128 = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4]; + dl_ch1_128 = (int16x8_t *)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2+aarx][4]; #endif for (subband=0; subbandPHY_measurements.subband_pmi_re[eNB_id][subband][aarx] = (((int *)&pmi128_re)[0] + ((int *)&pmi128_re)[1] + ((int *)&pmi128_re)[2] + ((int *)&pmi128_re)[3])>>2; - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB_id][subband][aarx] = (((int *)&pmi128_im)[0] + ((int *)&pmi128_im)[1] + ((int *)&pmi128_im)[2] + ((int *)&pmi128_im)[3])>>2; - phy_vars_ue->PHY_measurements.wideband_pmi_re[eNB_id][aarx] += phy_vars_ue->PHY_measurements.subband_pmi_re[eNB_id][subband][aarx]; - phy_vars_ue->PHY_measurements.wideband_pmi_im[eNB_id][aarx] += phy_vars_ue->PHY_measurements.subband_pmi_im[eNB_id][subband][aarx]; + ue->measurements.subband_pmi_re[eNB_id][subband][aarx] = (((int *)&pmi128_re)[0] + ((int *)&pmi128_re)[1] + ((int *)&pmi128_re)[2] + ((int *)&pmi128_re)[3])>>2; + ue->measurements.subband_pmi_im[eNB_id][subband][aarx] = (((int *)&pmi128_im)[0] + ((int *)&pmi128_im)[1] + ((int *)&pmi128_im)[2] + ((int *)&pmi128_im)[3])>>2; + ue->measurements.wideband_pmi_re[eNB_id][aarx] += ue->measurements.subband_pmi_re[eNB_id][subband][aarx]; + ue->measurements.wideband_pmi_im[eNB_id][aarx] += ue->measurements.subband_pmi_im[eNB_id][subband][aarx]; } // subband loop } // rx antenna loop } // if frame_parms->mode1_flag == 0 else { // cqi information only for mode 1 for (aarx=0; aarxnb_antennas_rx; aarx++) { - dl_ch0 = &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][aarx][4]; + dl_ch0 = &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][aarx][4]; for (subband=0; subband<7; subband++) { // cqi if (aarx==0) - phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband]=0; + ue->measurements.subband_cqi_tot[eNB_id][subband]=0; if (subband<6) { // for (i=0;i<48;i++) // printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = - (signal_energy_nodc(dl_ch0,48) ) - phy_vars_ue->PHY_measurements.n0_power[aarx]; + ue->measurements.subband_cqi[eNB_id][aarx][subband] = + (signal_energy_nodc(dl_ch0,48) ) - ue->measurements.n0_power[aarx]; - phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]; - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband], - phy_vars_ue->PHY_measurements.n0_power[aarx]); + ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband]; + ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband], + ue->measurements.n0_power[aarx]); } else { // for (i=0;i<12;i++) // printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); - phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) ) - phy_vars_ue->PHY_measurements.n0_power[aarx]; - phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband] += phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband]; - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband], - phy_vars_ue->PHY_measurements.n0_power[aarx]); + ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) ) - ue->measurements.n0_power[aarx]; + ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband]; + ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband], + ue->measurements.n0_power[aarx]); } dl_ch1+=48; - // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,phy_vars_ue->PHY_measurements.subband_cqi[eNB_id][aarx][subband],phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][aarx][subband]); + // msg("subband_cqi[%d][%d][%d] => %d (%d dB)\n",eNB_id,aarx,subband,ue->measurements.subband_cqi[eNB_id][aarx][subband],ue->measurements.subband_cqi_dB[eNB_id][aarx][subband]); } } for (subband=0; subbandPHY_measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(phy_vars_ue->PHY_measurements.subband_cqi_tot[eNB_id][subband],phy_vars_ue->PHY_measurements.n0_power_tot); + ue->measurements.subband_cqi_tot_dB[eNB_id][subband] = dB_fixed2(ue->measurements.subband_cqi_tot[eNB_id][subband],ue->measurements.n0_power_tot); } } - phy_vars_ue->PHY_measurements.rank[eNB_id] = 0; + //ue->measurements.rank[eNB_id] = 0; for (i=0; iPHY_measurements.selected_rx_antennas[eNB_id][i] = 0; + ue->measurements.selected_rx_antennas[eNB_id][i] = 0; if (frame_parms->nb_antennas_rx>1) { - if (phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][0][i] >= phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB_id][1][i]) - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i] = 0; + if (ue->measurements.subband_cqi_dB[eNB_id][0][i] >= ue->measurements.subband_cqi_dB[eNB_id][1][i]) + ue->measurements.selected_rx_antennas[eNB_id][i] = 0; else - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i] = 1; + ue->measurements.selected_rx_antennas[eNB_id][i] = 1; } else - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i] = 0; + ue->measurements.selected_rx_antennas[eNB_id][i] = 0; } // if(eNB_id==0) - // printf("in lte_ue_measurements: selected rx_antenna[eNB_id==0]:%u\n", phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB_id][i]); + // printf("in lte_ue_measurements: selected rx_antenna[eNB_id==0]:%u\n", ue->measurements.selected_rx_antennas[eNB_id][i]); } // eNB_id loop #if defined(__x86_64__) || defined(__i386__) @@ -699,9 +829,559 @@ void lte_ue_measurements(PHY_VARS_UE *phy_vars_ue, } -void lte_ue_measurements_emul(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_t eNB_id) +void lte_ue_measurements_emul(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id) { - msg("[PHY] EMUL UE lte_ue_measurements_emul last slot %d, eNB_id %d\n",last_slot,eNB_id); + LOG_D(PHY,"EMUL UE lte_ue_measurements_emul subframe %d, eNB_id %d\n",subframe,eNB_id); } + +uint8_t rank_estimation_tm3_tm4 (int *dl_ch_estimates_00, // please respect the order of channel estimates + int *dl_ch_estimates_01, + int *dl_ch_estimates_10, + int *dl_ch_estimates_11, + unsigned short nb_rb) +{ + + int i=0; + int rank=0; + int N_RB=nb_rb; + int *ch00_rank, *ch01_rank, *ch10_rank, *ch11_rank; + + int32_t shift; + int avg_0[2]; + int avg_1[2]; + + int count=0; + + /* we need at least alignment to 16 bytes, let's put 32 to be sure + * (maybe not necessary but doesn't hurt) + */ + int32_t conjch00_ch01[12*N_RB] __attribute__((aligned(32))); + int32_t conjch01_ch00[12*N_RB] __attribute__((aligned(32))); + int32_t conjch10_ch11[12*N_RB] __attribute__((aligned(32))); + int32_t conjch11_ch10[12*N_RB] __attribute__((aligned(32))); + int32_t conjch00_ch00[12*N_RB] __attribute__((aligned(32))); + int32_t conjch01_ch01[12*N_RB] __attribute__((aligned(32))); + int32_t conjch10_ch10[12*N_RB] __attribute__((aligned(32))); + int32_t conjch11_ch11[12*N_RB] __attribute__((aligned(32))); + int32_t af_mf_00[12*N_RB] __attribute__((aligned(32))); + int32_t af_mf_00_sq[12*N_RB] __attribute__((aligned(32))); + int32_t af_mf_01_sq[12*N_RB] __attribute__((aligned(32))); + int32_t af_mf_10_sq[12*N_RB] __attribute__((aligned(32))); + int32_t af_mf_11_sq[12*N_RB] __attribute__((aligned(32))); + int32_t af_mf_01[12*N_RB] __attribute__((aligned(32))); + int32_t af_mf_10[12*N_RB] __attribute__((aligned(32))); + int32_t af_mf_11[12*N_RB] __attribute__((aligned(32))); + int32_t determ_fin[12*N_RB] __attribute__((aligned(32))); + int32_t denum_db[12*N_RB] __attribute__((aligned(32))); + int32_t numer_fin[12*N_RB] __attribute__((aligned(32))); + int32_t numer_db[12*N_RB] __attribute__((aligned(32))); + int32_t cond_db[12*N_RB] __attribute__((aligned(32))); + + ch00_rank = dl_ch_estimates_00; + ch01_rank = dl_ch_estimates_01; + ch10_rank = dl_ch_estimates_10; + ch11_rank = dl_ch_estimates_11; + + dlsch_channel_level_TM34_meas(ch00_rank, + ch01_rank, + ch10_rank, + ch11_rank, + avg_0, + avg_1, + N_RB); + + avg_0[0] = (log2_approx(avg_0[0])/2); + shift = cmax(avg_0[0],0); + +#ifdef DEBUG_RANK_EST + printf("\n shift %d \n" , shift); + printf("\n conj(ch00)ch01 \n"); +#endif + + conjch0_mult_ch1(ch00_rank, + ch01_rank, + conjch00_ch01, + N_RB, + shift); // this is an arbitrary shift to avoid overflow. can be changed. + +#ifdef DEBUG_RANK_EST + printf("\n conj(ch01)ch00 \n"); +#endif + + conjch0_mult_ch1(ch01_rank, + ch00_rank, + conjch01_ch00, + N_RB, + shift); + +#ifdef DEBUG_RANK_EST + printf("\n conj(ch10)ch11 \n"); +#endif + + + conjch0_mult_ch1(ch10_rank, + ch11_rank, + conjch10_ch11, + N_RB, + shift); + +#ifdef DEBUG_RANK_EST + printf("\n conj(ch11)ch10 \n"); +#endif + + conjch0_mult_ch1(ch11_rank, + ch10_rank, + conjch11_ch10, + N_RB, + shift); + +#ifdef DEBUG_RANK_EST + printf("\n conj(ch00)ch00 \n"); +#endif + + conjch0_mult_ch1(ch00_rank, + ch00_rank, + conjch00_ch00, + N_RB, + shift); + +#ifdef DEBUG_RANK_EST + printf("\n conj(ch01)ch01 \n"); +#endif + + conjch0_mult_ch1(ch01_rank, + ch01_rank, + conjch01_ch01, + N_RB, + shift); + +#ifdef DEBUG_RANK_EST + printf("\n conj(ch10)ch10 \n"); +#endif + + conjch0_mult_ch1(ch10_rank, + ch10_rank, + conjch10_ch10, + N_RB, + shift); +#ifdef DEBUG_RANK_EST + printf("\n conj(ch11)ch11 \n"); +#endif + + conjch0_mult_ch1(ch11_rank, + ch11_rank, + conjch11_ch11, + N_RB, + shift); + + construct_HhH_elements(conjch00_ch00, + conjch01_ch01, + conjch11_ch11, + conjch10_ch10, + conjch00_ch01, + conjch01_ch00, + conjch10_ch11, + conjch11_ch10, + af_mf_00, + af_mf_01, + af_mf_10, + af_mf_11, + N_RB); +#ifdef DEBUG_RANK_EST + printf("\n |HhH00|^2 \n"); +#endif + + squared_matrix_element(af_mf_00, + af_mf_00_sq, + N_RB); + +#ifdef DEBUG_RANK_EST + printf("\n |HhH01|^2 \n"); +#endif + + squared_matrix_element(af_mf_01, + af_mf_01_sq, + N_RB); + +#ifdef DEBUG_RANK_EST + printf("\n |HhH10|^2 \n"); +#endif + + squared_matrix_element(af_mf_10, + af_mf_10_sq, + N_RB); + +#ifdef DEBUG_RANK_EST + printf("\n |HhH11|^2 \n"); +#endif + + squared_matrix_element(af_mf_11, + af_mf_11_sq, + N_RB); + + det_HhH(af_mf_00, + af_mf_01, + af_mf_10, + af_mf_11, + determ_fin, + N_RB); + + numer(af_mf_00_sq, + af_mf_01_sq, + af_mf_10_sq, + af_mf_11_sq, + numer_fin, + N_RB); + + for (i=1; i<12*N_RB; i++) + { + denum_db[i]=dB_fixed(determ_fin[i]); + numer_db[i]=dB_fixed(numer_fin[i]); + cond_db[i]=(numer_db[i]-denum_db[i]); + if (cond_db[i] < cond_num_threshold) + count++; +#ifdef DEBUG_RANK_EST + printf("cond_num_threshold =%d \n", cond_num_threshold); + printf("i %d numer_db[i] = %d \n", i, numer_db[i]); + printf("i %d denum_db[i] = %d \n", i, denum_db[i]); + printf("i %d cond_db[i] = %d \n", i, cond_db[i]); + printf("i %d counter = %d \n", i, count); +#endif + } + + if (count >= 6*N_RB) // conditional number is lower 10dB in half on more Res Blocks + rank=1; + +#ifdef DEBUG_RANK_EST + printf(" rank = %d \n", rank); +#endif + return(rank); +} + +void conjch0_mult_ch1(int *ch0, + int *ch1, + int32_t *ch0conj_ch1, + unsigned short nb_rb, + unsigned char output_shift0) +{ + //This function is used to compute multiplications in Hhermitian * H matrix + unsigned short rb; + __m128i *dl_ch0_128,*dl_ch1_128, *ch0conj_ch1_128, mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3; + + dl_ch0_128 = (__m128i *)ch0; + dl_ch1_128 = (__m128i *)ch1; + + ch0conj_ch1_128 = (__m128i *)ch0conj_ch1; + + for (rb=0; rb<3*nb_rb; rb++) { + + mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch1_128[0]); + mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); + mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); + mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch1_128[0]); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0); + mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); + mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); + + ch0conj_ch1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); + +#ifdef DEBUG_RANK_EST + printf("\n Computing conjugates \n"); + print_shorts("ch0:",(int16_t*)&dl_ch0_128[0]); + print_shorts("ch1:",(int16_t*)&dl_ch1_128[0]); + print_shorts("pack:",(int16_t*)&ch0conj_ch1_128[0]); +#endif + + dl_ch0_128+=1; + dl_ch1_128+=1; + ch0conj_ch1_128+=1; + } + _mm_empty(); + _m_empty(); +} + +void construct_HhH_elements(int *ch0conj_ch0, //00_00 + int *ch1conj_ch1,//01_01 + int *ch2conj_ch2,//11_11 + int *ch3conj_ch3,//10_10 + int *ch0conj_ch1,//00_01 + int *ch1conj_ch0,//01_00 + int *ch2conj_ch3,//10_11 + int *ch3conj_ch2,//11_10 + int32_t *after_mf_00, + int32_t *after_mf_01, + int32_t *after_mf_10, + int32_t *after_mf_11, + unsigned short nb_rb) +{ + unsigned short rb; + __m128i *ch0conj_ch0_128, *ch1conj_ch1_128, *ch2conj_ch2_128, *ch3conj_ch3_128; + __m128i *ch0conj_ch1_128, *ch1conj_ch0_128, *ch2conj_ch3_128, *ch3conj_ch2_128; + __m128i *after_mf_00_128, *after_mf_01_128, *after_mf_10_128, *after_mf_11_128; + + ch0conj_ch0_128 = (__m128i *)ch0conj_ch0; + ch1conj_ch1_128 = (__m128i *)ch1conj_ch1; + ch2conj_ch2_128 = (__m128i *)ch2conj_ch2; + ch3conj_ch3_128 = (__m128i *)ch3conj_ch3; + ch0conj_ch1_128 = (__m128i *)ch0conj_ch1; + ch1conj_ch0_128 = (__m128i *)ch1conj_ch0; + ch2conj_ch3_128 = (__m128i *)ch2conj_ch3; + ch3conj_ch2_128 = (__m128i *)ch3conj_ch2; + after_mf_00_128 = (__m128i *)after_mf_00; + after_mf_01_128 = (__m128i *)after_mf_01; + after_mf_10_128 = (__m128i *)after_mf_10; + after_mf_11_128 = (__m128i *)after_mf_11; + + for (rb=0; rb<3*nb_rb; rb++) { + + after_mf_00_128[0] =_mm_adds_epi16(ch0conj_ch0_128[0],ch3conj_ch3_128[0]);// _mm_adds_epi32(ch0conj_ch0_128[0], ch3conj_ch3_128[0]); //00_00 + 10_10 + after_mf_11_128[0] =_mm_adds_epi16(ch1conj_ch1_128[0], ch2conj_ch2_128[0]); //01_01 + 11_11 + after_mf_01_128[0] =_mm_adds_epi16(ch0conj_ch1_128[0], ch2conj_ch3_128[0]);//00_01 + 10_11 + after_mf_10_128[0] =_mm_adds_epi16(ch1conj_ch0_128[0], ch3conj_ch2_128[0]);//01_00 + 11_10 + +#ifdef DEBUG_RANK_EST + printf(" \n construct_HhH_elements \n"); + print_shorts("ch0conj_ch0_128:",(int16_t*)&ch0conj_ch0_128[0]); + print_shorts("ch1conj_ch1_128:",(int16_t*)&ch1conj_ch1_128[0]); + print_shorts("ch2conj_ch2_128:",(int16_t*)&ch2conj_ch2_128[0]); + print_shorts("ch3conj_ch3_128:",(int16_t*)&ch3conj_ch3_128[0]); + print_shorts("ch0conj_ch1_128:",(int16_t*)&ch0conj_ch1_128[0]); + print_shorts("ch1conj_ch0_128:",(int16_t*)&ch1conj_ch0_128[0]); + print_shorts("ch2conj_ch3_128:",(int16_t*)&ch2conj_ch3_128[0]); + print_shorts("ch3conj_ch2_128:",(int16_t*)&ch3conj_ch2_128[0]); + print_shorts("after_mf_00_128:",(int16_t*)&after_mf_00_128[0]); + print_shorts("after_mf_01_128:",(int16_t*)&after_mf_01_128[0]); + print_shorts("after_mf_10_128:",(int16_t*)&after_mf_10_128[0]); + print_shorts("after_mf_11_128:",(int16_t*)&after_mf_11_128[0]); +#endif + + ch0conj_ch0_128+=1; + ch1conj_ch1_128+=1; + ch2conj_ch2_128+=1; + ch3conj_ch3_128+=1; + ch0conj_ch1_128+=1; + ch1conj_ch0_128+=1; + ch2conj_ch3_128+=1; + ch3conj_ch2_128+=1; + + after_mf_00_128+=1; + after_mf_01_128+=1; + after_mf_10_128+=1; + after_mf_11_128+=1; + } + _mm_empty(); + _m_empty(); +} + + +void squared_matrix_element(int32_t *Hh_h_00, + int32_t *Hh_h_00_sq, + unsigned short nb_rb) +{ + unsigned short rb; + __m128i *Hh_h_00_128,*Hh_h_00_sq_128; + + Hh_h_00_128 = (__m128i *)Hh_h_00; + Hh_h_00_sq_128 = (__m128i *)Hh_h_00_sq; + + for (rb=0; rb<3*nb_rb; rb++) { + + Hh_h_00_sq_128[0] = _mm_madd_epi16(Hh_h_00_128[0],Hh_h_00_128[0]); + +#ifdef DEBUG_RANK_EST + printf("\n Computing squared_matrix_element \n"); + print_shorts("Hh_h_00_128:",(int16_t*)&Hh_h_00_128[0]); + print_ints("Hh_h_00_sq_128:",(int32_t*)&Hh_h_00_sq_128[0]); +#endif + + Hh_h_00_sq_128+=1; + Hh_h_00_128+=1; + } + _mm_empty(); + _m_empty(); +} + + + +void det_HhH(int32_t *after_mf_00, + int32_t *after_mf_01, + int32_t *after_mf_10, + int32_t *after_mf_11, + int32_t *det_fin, + unsigned short nb_rb) + +{ + unsigned short rb; + __m128i *after_mf_00_128,*after_mf_01_128, *after_mf_10_128, *after_mf_11_128, ad_re_128, bc_re_128; + __m128i *det_fin_128, det_128; + + after_mf_00_128 = (__m128i *)after_mf_00; + after_mf_01_128 = (__m128i *)after_mf_01; + after_mf_10_128 = (__m128i *)after_mf_10; + after_mf_11_128 = (__m128i *)after_mf_11; + + det_fin_128 = (__m128i *)det_fin; + + for (rb=0; rb<3*nb_rb; rb++) { + + ad_re_128 = _mm_madd_epi16(after_mf_00_128[0],after_mf_11_128[0]); + bc_re_128 = _mm_madd_epi16(after_mf_01_128[0],after_mf_01_128[0]); + det_128 = _mm_sub_epi32(ad_re_128, bc_re_128); + det_fin_128[0] = _mm_abs_epi32(det_128); + +#ifdef DEBUG_RANK_EST + printf("\n Computing denominator \n"); + print_shorts("after_mf_00_128:",(int16_t*)&after_mf_00_128[0]); + print_shorts("after_mf_01_128:",(int16_t*)&after_mf_01_128[0]); + print_shorts("after_mf_10_128:",(int16_t*)&after_mf_10_128[0]); + print_shorts("after_mf_11_128:",(int16_t*)&after_mf_11_128[0]); + print_ints("ad_re_128:",(int32_t*)&ad_re_128); + print_ints("bc_re_128:",(int32_t*)&bc_re_128); + print_ints("det_fin_128:",(int32_t*)&det_fin_128[0]); +#endif + + det_fin_128+=1; + after_mf_00_128+=1; + after_mf_01_128+=1; + after_mf_10_128+=1; + after_mf_11_128+=1; + } + _mm_empty(); + _m_empty(); +} + +void numer(int32_t *Hh_h_00_sq, + int32_t *Hh_h_01_sq, + int32_t *Hh_h_10_sq, + int32_t *Hh_h_11_sq, + int32_t *num_fin, + unsigned short nb_rb) + +{ + unsigned short rb; + __m128i *h_h_00_sq_128, *h_h_01_sq_128, *h_h_10_sq_128, *h_h_11_sq_128; + __m128i *num_fin_128, sq_a_plus_sq_d_128, sq_b_plus_sq_c_128; + + h_h_00_sq_128 = (__m128i *)Hh_h_00_sq; + h_h_01_sq_128 = (__m128i *)Hh_h_01_sq; + h_h_10_sq_128 = (__m128i *)Hh_h_10_sq; + h_h_11_sq_128 = (__m128i *)Hh_h_11_sq; + + num_fin_128 = (__m128i *)num_fin; + + for (rb=0; rb<3*nb_rb; rb++) { + + sq_a_plus_sq_d_128 = _mm_add_epi32(h_h_00_sq_128[0],h_h_11_sq_128[0]); + sq_b_plus_sq_c_128 = _mm_add_epi32(h_h_01_sq_128[0],h_h_10_sq_128[0]); + num_fin_128[0] = _mm_add_epi32(sq_a_plus_sq_d_128, sq_b_plus_sq_c_128); + +#ifdef DEBUG_RANK_EST + printf("\n Computing numerator \n"); + print_ints("h_h_00_sq_128:",(int32_t*)&h_h_00_sq_128[0]); + print_ints("h_h_01_sq_128:",(int32_t*)&h_h_01_sq_128[0]); + print_ints("h_h_10_sq_128:",(int32_t*)&h_h_10_sq_128[0]); + print_ints("h_h_11_sq_128:",(int32_t*)&h_h_11_sq_128[0]); + print_shorts("sq_a_plus_sq_d_128:",(int16_t*)&sq_a_plus_sq_d_128); + print_shorts("sq_b_plus_sq_c_128:",(int16_t*)&sq_b_plus_sq_c_128); + print_shorts("num_fin_128:",(int16_t*)&num_fin_128[0]); +#endif + + num_fin_128+=1; + h_h_00_sq_128+=1; + h_h_01_sq_128+=1; + h_h_10_sq_128+=1; + h_h_11_sq_128+=1; + } + _mm_empty(); + _m_empty(); +} + + + + + +void dlsch_channel_level_TM34_meas(int *ch00, + int *ch01, + int *ch10, + int *ch11, + int *avg_0, + int *avg_1, + unsigned short nb_rb) +{ + +#if defined(__x86_64__)||defined(__i386__) + + short rb; + unsigned char nre=12; + __m128i *ch00_128, *ch01_128, *ch10_128, *ch11_128; + __m128i avg_0_row0_128D, avg_1_row0_128D, avg_0_row1_128D, avg_1_row1_128D; + __m128i ch00_128_tmp, ch01_128_tmp, ch10_128_tmp, ch11_128_tmp; + + avg_0[0] = 0; + avg_0[1] = 0; + avg_1[0] = 0; + avg_1[1] = 0; + + ch00_128 = (__m128i *)ch00; + ch01_128 = (__m128i *)ch01; + ch10_128 = (__m128i *)ch10; + ch11_128 = (__m128i *)ch11; + + avg_0_row0_128D = _mm_setzero_si128(); + avg_1_row0_128D = _mm_setzero_si128(); + avg_0_row1_128D = _mm_setzero_si128(); + avg_1_row1_128D = _mm_setzero_si128(); + + for (rb=0; rb<3*nb_rb; rb++) { + ch00_128_tmp = _mm_load_si128(&ch00_128[0]); + ch01_128_tmp = _mm_load_si128(&ch01_128[0]); + ch10_128_tmp = _mm_load_si128(&ch10_128[0]); + ch11_128_tmp = _mm_load_si128(&ch11_128[0]); + + avg_0_row0_128D = _mm_add_epi32(avg_0_row0_128D,_mm_madd_epi16(ch00_128_tmp,ch00_128_tmp)); + avg_1_row0_128D = _mm_add_epi32(avg_1_row0_128D,_mm_madd_epi16(ch01_128_tmp,ch01_128_tmp)); + avg_0_row1_128D = _mm_add_epi32(avg_0_row1_128D,_mm_madd_epi16(ch10_128_tmp,ch10_128_tmp)); + avg_1_row1_128D = _mm_add_epi32(avg_1_row1_128D,_mm_madd_epi16(ch11_128_tmp,ch11_128_tmp)); + + ch00_128+=1; + ch01_128+=1; + ch10_128+=1; + ch11_128+=1; + } + + avg_0[0] = (((int*)&avg_0_row0_128D)[0])/(nb_rb*nre) + + (((int*)&avg_0_row0_128D)[1])/(nb_rb*nre) + + (((int*)&avg_0_row0_128D)[2])/(nb_rb*nre) + + (((int*)&avg_0_row0_128D)[3])/(nb_rb*nre); + + avg_1[0] = (((int*)&avg_1_row0_128D)[0])/(nb_rb*nre) + + (((int*)&avg_1_row0_128D)[1])/(nb_rb*nre) + + (((int*)&avg_1_row0_128D)[2])/(nb_rb*nre) + + (((int*)&avg_1_row0_128D)[3])/(nb_rb*nre); + + avg_0[1] = (((int*)&avg_0_row1_128D)[0])/(nb_rb*nre) + + (((int*)&avg_0_row1_128D)[1])/(nb_rb*nre) + + (((int*)&avg_0_row1_128D)[2])/(nb_rb*nre) + + (((int*)&avg_0_row1_128D)[3])/(nb_rb*nre); + + avg_1[1] = (((int*)&avg_1_row1_128D)[0])/(nb_rb*nre) + + (((int*)&avg_1_row1_128D)[1])/(nb_rb*nre) + + (((int*)&avg_1_row1_128D)[2])/(nb_rb*nre) + + (((int*)&avg_1_row1_128D)[3])/(nb_rb*nre); + + avg_0[0] = avg_0[0] + avg_0[1]; + avg_1[0] = avg_1[0] + avg_1[1]; + avg_0[0] = min (avg_0[0], avg_1[0]); + avg_1[0] = avg_0[0]; + + _mm_empty(); + _m_empty(); + +#elif defined(__arm__) + +#endif +} diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c index 1de23f6412..18069f9759 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c @@ -1,51 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" #include "PHY/sse_intrin.h" //#define DEBUG_CH +#include "UTIL/LOG/log.h" #include "T.h" -// For Channel Estimation in Distributed Alamouti Scheme -//static int16_t temp_out_ifft[2048*4] __attribute__((aligned(16))); -static int16_t temp_out_fft_0[2048*4] __attribute__((aligned(16))); -static int16_t temp_out_fft_1[2048*4] __attribute__((aligned(16))); -static int16_t temp_out_ifft_0[2048*4] __attribute__((aligned(16))); -static int16_t temp_out_ifft_1[2048*4] __attribute__((aligned(16))); - - -static int32_t temp_in_ifft_0[2048*2] __attribute__((aligned(32))); -static int32_t temp_in_ifft_1[2048*2] __attribute__((aligned(32))); -static int32_t temp_in_fft_0[2048*2] __attribute__((aligned(16))); -static int32_t temp_in_fft_1[2048*2] __attribute__((aligned(16))); - // round(exp(sqrt(-1)*(pi/2)*[0:1:N-1]/N)*pow2(15)) static int16_t ru_90[2*128] = {32767, 0,32766, 402,32758, 804,32746, 1206,32729, 1608,32706, 2009,32679, 2411,32647, 2811,32610, 3212,32568, 3612,32522, 4011,32470, 4410,32413, 4808,32352, 5205,32286, 5602,32214, 5998,32138, 6393,32058, 6787,31972, 7180,31881, 7571,31786, 7962,31686, 8351,31581, 8740,31471, 9127,31357, 9512,31238, 9896,31114, 10279,30986, 10660,30853, 11039,30715, 11417,30572, 11793,30425, 12167,30274, 12540,30118, 12910,29957, 13279,29792, 13646,29622, 14010,29448, 14373,29269, 14733,29086, 15091,28899, 15447,28707, 15800,28511, 16151,28311, 16500,28106, 16846,27897, 17190,27684, 17531,27467, 17869,27246, 18205,27020, 18538,26791, 18868,26557, 19195,26320, 19520,26078, 19841,25833, 20160,25583, 20475,25330, 20788,25073, 21097,24812, 21403,24548, 21706,24279, 22006,24008, 22302,23732, 22595,23453, 22884,23170, 23170,22884, 23453,22595, 23732,22302, 24008,22006, 24279,21706, 24548,21403, 24812,21097, 25073,20788, 25330,20475, 25583,20160, 25833,19841, 26078,19520, 26320,19195, 26557,18868, 26791,18538, 27020,18205, 27246,17869, 27467,17531, 27684,17190, 27897,16846, 28106,16500, 28311,16151, 28511,15800, 28707,15447, 28899,15091, 29086,14733, 29269,14373, 29448,14010, 29622,13646, 29792,13279, 29957,12910, 30118,12540, 30274,12167, 30425,11793, 30572,11417, 30715,11039, 30853,10660, 30986,10279, 31114,9896, 31238,9512, 31357,9127, 31471,8740, 31581,8351, 31686,7962, 31786,7571, 31881,7180, 31972,6787, 32058,6393, 32138,5998, 32214,5602, 32286,5205, 32352,4808, 32413,4410, 32470,4011, 32522,3612, 32568,3212, 32610,2811, 32647,2411, 32679,2009, 32706,1608, 32729,1206, 32746,804, 32758,402, 32766}; @@ -53,39 +34,31 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32 #define SCALE 0x3FFF -int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, - uint8_t eNB_id, +int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, uint8_t UE_id, - uint8_t sched_subframe, unsigned char l, - unsigned char Ns, - uint8_t cooperation_flag) -{ + unsigned char Ns) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - LTE_eNB_PUSCH *eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars[UE_id]; - int32_t **ul_ch_estimates=eNB_pusch_vars->drs_ch_estimates[eNB_id]; - int32_t **ul_ch_estimates_time= eNB_pusch_vars->drs_ch_estimates_time[eNB_id]; - int32_t **ul_ch_estimates_0= eNB_pusch_vars->drs_ch_estimates_0[eNB_id]; - int32_t **ul_ch_estimates_1= eNB_pusch_vars->drs_ch_estimates_1[eNB_id]; - int32_t **rxdataF_ext= eNB_pusch_vars->rxdataF_ext[eNB_id]; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe); + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + LTE_eNB_PUSCH *pusch_vars = eNB->pusch_vars[UE_id]; + int32_t **ul_ch_estimates=pusch_vars->drs_ch_estimates; + int32_t **ul_ch_estimates_time= pusch_vars->drs_ch_estimates_time; + int32_t **rxdataF_ext= pusch_vars->rxdataF_ext; + int subframe = proc->subframe_rx; + uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe); int16_t delta_phase = 0; int16_t *ru1 = ru_90; int16_t *ru2 = ru_90; int16_t current_phase1,current_phase2; - uint16_t N_rb_alloc = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb; + uint16_t N_rb_alloc = eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb; uint16_t aa,Msc_RS,Msc_RS_idx; uint16_t * Msc_idx_ptr; int k,pilot_pos1 = 3 - frame_parms->Ncp, pilot_pos2 = 10 - 2*frame_parms->Ncp; - int16_t alpha, beta; int32_t *ul_ch1=NULL, *ul_ch2=NULL; - int32_t *ul_ch1_0=NULL,*ul_ch2_0=NULL,*ul_ch1_1=NULL,*ul_ch2_1=NULL; int16_t ul_ch_estimates_re,ul_ch_estimates_im; - int32_t rx_power_correction; - //uint8_t nb_antennas_rx = frame_parms->nb_antennas_tx_eNB; + //uint8_t nb_antennas_rx = frame_parms->nb_antenna_ports_eNB; uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx; uint8_t cyclic_shift; @@ -94,7 +67,7 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, uint32_t v=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[Ns+(subframe<<1)]; int32_t tmp_estimates[N_rb_alloc*12] __attribute__((aligned(16))); - int symbol_offset,i,j; + int symbol_offset,i; //debug_msg("lte_ul_channel_estimation: cyclic shift %d\n",cyclicShift); @@ -102,11 +75,6 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, int16_t alpha_re[12] = {32767, 28377, 16383, 0,-16384, -28378,-32768,-28378,-16384, -1, 16383, 28377}; int16_t alpha_im[12] = {0, 16383, 28377, 32767, 28377, 16383, 0,-16384,-28378,-32768,-28378,-16384}; - int32_t *in_fft_ptr_0 = (int32_t*)0,*in_fft_ptr_1 = (int32_t*)0, - *temp_out_fft_0_ptr = (int32_t*)0,*out_fft_ptr_0 = (int32_t*)0, - *temp_out_fft_1_ptr = (int32_t*)0,*out_fft_ptr_1 = (int32_t*)0, - *temp_in_ifft_ptr = (int32_t*)0; - #if defined(__x86_64__) || defined(__i386__) __m128i *rxdataF128,*ul_ref128,*ul_ch128; __m128i mmtmpU0,mmtmpU1,mmtmpU2,mmtmpU3; @@ -114,45 +82,34 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, int16x8_t *rxdataF128,*ul_ref128,*ul_ch128; int32x4_t mmtmp0,mmtmp1,mmtmp_re,mmtmp_im; #endif + +int32_t temp_in_ifft_0[2048*2] __attribute__((aligned(32))); + Msc_RS = N_rb_alloc*12; cyclic_shift = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS2 + + eNB->ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS2 + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+Ns]) % 12; -#if defined(USER_MODE) Msc_idx_ptr = (uint16_t*) bsearch(&Msc_RS, dftsizes, 33, sizeof(uint16_t), compareints); if (Msc_idx_ptr) Msc_RS_idx = Msc_idx_ptr - dftsizes; else { - msg("lte_ul_channel_estimation: index for Msc_RS=%d not found\n",Msc_RS); + LOG_E(PHY,"lte_ul_channel_estimation: index for Msc_RS=%d not found\n",Msc_RS); return(-1); } -#else - uint8_t b; - - for (b=0; b<33; b++) - if (Msc_RS==dftsizes[b]) - Msc_RS_idx = b; - -#endif - // LOG_I(PHY,"subframe %d, Ns %d, l %d, Msc_RS = %d, Msc_RS_idx = %d, u %d, v %d, cyclic_shift %d\n",subframe,Ns,l,Msc_RS, Msc_RS_idx,u,v,cyclic_shift); #ifdef DEBUG_CH -#ifdef USER_MODE - if (Ns==0) write_output("drs_seq0.m","drsseq0",ul_ref_sigs_rx[u][v][Msc_RS_idx],2*Msc_RS,2,1); else write_output("drs_seq1.m","drsseq1",ul_ref_sigs_rx[u][v][Msc_RS_idx],2*Msc_RS,2,1); -#endif #endif - rx_power_correction = 1; if (l == (3 - frame_parms->Ncp)) { @@ -297,35 +254,28 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, #endif } - //copy MIMO channel estimates to temporary buffer for EMOS - //memcpy(&ul_ch_estimates_0[aa][symbol_offset],&ul_ch_estimates[aa][symbol_offset],frame_parms->ofdm_symbol_size*sizeof(int32_t)*2); - - memset(temp_in_ifft_0,0,frame_parms->ofdm_symbol_size*sizeof(int32_t)); - // Convert to time domain for visualization + memset(temp_in_ifft_0,0,frame_parms->ofdm_symbol_size*sizeof(int32_t)); for(i=0; iN_RB_DL) { case 6: - idft128((int16_t*) temp_in_ifft_0, (int16_t*) ul_ch_estimates_time[aa], 1); break; case 25: - idft512((int16_t*) temp_in_ifft_0, (int16_t*) ul_ch_estimates_time[aa], 1); break; case 50: - idft1024((int16_t*) temp_in_ifft_0, (int16_t*) ul_ch_estimates_time[aa], 1); break; case 100: - idft2048((int16_t*) temp_in_ifft_0, (int16_t*) ul_ch_estimates_time[aa], 1); @@ -334,8 +284,8 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, #if T_TRACER if (aa == 0) - T(T_ENB_PHY_UL_CHANNEL_ESTIMATE, T_INT(eNB_id), T_INT(UE_id), - T_INT(phy_vars_eNB->proc[sched_subframe].frame_rx), T_INT(subframe), + T(T_ENB_PHY_UL_CHANNEL_ESTIMATE, T_INT(0), T_INT(eNB->ulsch[UE_id]->rnti), + T_INT(proc->frame_rx), T_INT(subframe), T_INT(0), T_BUFFER(ul_ch_estimates_time[0], 512 * 4)); #endif @@ -353,316 +303,106 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, #endif - if(cooperation_flag == 2) { - memset(temp_in_ifft_0,0,frame_parms->ofdm_symbol_size*sizeof(int32_t*)*2); - memset(temp_in_ifft_1,0,frame_parms->ofdm_symbol_size*sizeof(int32_t*)*2); - memset(temp_in_fft_0,0,frame_parms->ofdm_symbol_size*sizeof(int32_t*)*2); - memset(temp_in_fft_1,0,frame_parms->ofdm_symbol_size*sizeof(int32_t*)*2); - - temp_in_ifft_ptr = &temp_in_ifft_0[0]; - - i = symbol_offset; - - for(j=0; j<(frame_parms->N_RB_UL*12); j++) { - temp_in_ifft_ptr[j] = ul_ch_estimates[aa][i]; - i++; - } - - alpha_ind = 0; - - // Compensating for the phase shift introduced at the transmitter - for(i=symbol_offset; i>15); - - //((int16_t*) ul_ch_estimates[aa])[(i<<1)+1] = (i%2 == 1? 1:-1) * ul_ch_estimates_im; - ((int16_t*) ul_ch_estimates[aa])[(i<<1)+1] = - (int16_t) (((int32_t) (alpha_re[alpha_ind]) * (int32_t) (ul_ch_estimates_im) - - (int32_t) (alpha_im[alpha_ind]) * (int32_t) (ul_ch_estimates_re))>>15); - - alpha_ind+=10; - - if (alpha_ind>11) - alpha_ind-=12; - } - - //Extracting Channel Estimates for Distributed Alamouti Receiver Combining - - temp_in_ifft_ptr = &temp_in_ifft_1[0]; - - i = symbol_offset; - - for(j=0; j<(frame_parms->N_RB_UL*12); j++) { - temp_in_ifft_ptr[j] = ul_ch_estimates[aa][i]; - i++; - } - - switch (frame_parms->N_RB_DL) { - case 6: - idft128((int16_t*) &temp_in_ifft_0[0], // Performing IFFT on Combined Channel Estimates - temp_out_ifft_0, - 1); - idft128((int16_t*) &temp_in_ifft_1[0], // Performing IFFT on Combined Channel Estimates - temp_out_ifft_1, - 1); - break; - case 25: - idft512((int16_t*) &temp_in_ifft_0[0], // Performing IFFT on Combined Channel Estimates - temp_out_ifft_0, - 1); - idft512((int16_t*) &temp_in_ifft_1[0], // Performing IFFT on Combined Channel Estimates - temp_out_ifft_1, - 1); - break; - case 50: - idft1024((int16_t*) &temp_in_ifft_0[0], // Performing IFFT on Combined Channel Estimates - temp_out_ifft_0, - 1); - idft1024((int16_t*) &temp_in_ifft_1[0], // Performing IFFT on Combined Channel Estimates - temp_out_ifft_1, - 1); - break; - case 100: - idft2048((int16_t*) &temp_in_ifft_0[0], // Performing IFFT on Combined Channel Estimates - temp_out_ifft_0, - 1); - idft2048((int16_t*) &temp_in_ifft_1[0], // Performing IFFT on Combined Channel Estimates - temp_out_ifft_1, - 1); - break; - } - - // because the ifft is not power preserving, we should apply the factor sqrt(power_correction) here, but we rather apply power_correction here and nothing after the next fft - in_fft_ptr_0 = &temp_in_fft_0[0]; - in_fft_ptr_1 = &temp_in_fft_1[0]; - - for(j=0; j<(frame_parms->ofdm_symbol_size)/12; j++) { - if (j>19) { - ((int16_t*)in_fft_ptr_0)[-40+(2*j)] = ((int16_t*)temp_out_ifft_0)[-80+(2*j)]*rx_power_correction; - ((int16_t*)in_fft_ptr_0)[-40+(2*j)+1] = ((int16_t*)temp_out_ifft_0)[-80+(2*j+1)]*rx_power_correction; - ((int16_t*)in_fft_ptr_1)[-40+(2*j)] = ((int16_t*)temp_out_ifft_1)[-80+(2*j)]*rx_power_correction; - ((int16_t*)in_fft_ptr_1)[-40+(2*j)+1] = ((int16_t*)temp_out_ifft_1)[-80+(2*j)+1]*rx_power_correction; - } else { - ((int16_t*)in_fft_ptr_0)[2*(frame_parms->ofdm_symbol_size-20+j)] = ((int16_t*)temp_out_ifft_0)[2*(frame_parms->ofdm_symbol_size-20+j)]*rx_power_correction; - ((int16_t*)in_fft_ptr_0)[2*(frame_parms->ofdm_symbol_size-20+j)+1] = ((int16_t*)temp_out_ifft_0)[2*(frame_parms->ofdm_symbol_size-20+j)+1]*rx_power_correction; - ((int16_t*)in_fft_ptr_1)[2*(frame_parms->ofdm_symbol_size-20+j)] = ((int16_t*)temp_out_ifft_1)[2*(frame_parms->ofdm_symbol_size-20+j)]*rx_power_correction; - ((int16_t*)in_fft_ptr_1)[2*(frame_parms->ofdm_symbol_size-20+j)+1] = ((int16_t*)temp_out_ifft_1)[2*(frame_parms->ofdm_symbol_size-20+j)+1]*rx_power_correction; - } - } - - switch (frame_parms->N_RB_DL) { - case 6: - dft128((int16_t*) &temp_in_fft_0[0], - // Performing FFT to obtain the Channel Estimates for UE0 to eNB1 - temp_out_fft_0, - 1); - break; - case 25: - dft512((int16_t*) &temp_in_fft_0[0], - // Performing FFT to obtain the Channel Estimates for UE0 to eNB1 - temp_out_fft_0, - 1); - break; - case 50: - dft1024((int16_t*) &temp_in_fft_0[0], - // Performing FFT to obtain the Channel Estimates for UE0 to eNB1 - temp_out_fft_0, - 1); - break; - case 100: - dft2048((int16_t*) &temp_in_fft_0[0], - // Performing FFT to obtain the Channel Estimates for UE0 to eNB1 - temp_out_fft_0, - 1); - break; - } - - out_fft_ptr_0 = &ul_ch_estimates_0[aa][symbol_offset]; // CHANNEL ESTIMATES FOR UE0 TO eNB1 - temp_out_fft_0_ptr = (int32_t*) temp_out_fft_0; - - i=0; - - for(j=0; jN_RB_UL*12; j++) { - out_fft_ptr_0[i] = temp_out_fft_0_ptr[j]; - i++; - } - switch (frame_parms->N_RB_DL) { - case 6: - dft128((int16_t*) &temp_in_fft_1[0], // Performing FFT to obtain the Channel Estimates for UE1 to eNB1 - temp_out_fft_1, - 1); - break; - case 25: - dft512((int16_t*) &temp_in_fft_1[0], // Performing FFT to obtain the Channel Estimates for UE1 to eNB1 - temp_out_fft_1, - 1); - break; - case 50: - dft1024((int16_t*) &temp_in_fft_1[0], // Performing FFT to obtain the Channel Estimates for UE1 to eNB1 - temp_out_fft_1, - 1); - break; - case 100: - dft2048((int16_t*) &temp_in_fft_1[0], // Performing FFT to obtain the Channel Estimates for UE1 to eNB1 - temp_out_fft_1, - 1); - break; - } - - out_fft_ptr_1 = &ul_ch_estimates_1[aa][symbol_offset]; // CHANNEL ESTIMATES FOR UE1 TO eNB1 - temp_out_fft_1_ptr = (int32_t*) temp_out_fft_1; - - i=0; - - for(j=0; jN_RB_UL*12; j++) { - out_fft_ptr_1[i] = temp_out_fft_1_ptr[j]; - i++; - } + + + if (Ns&1) {//we are in the second slot of the sub-frame, so do the interpolation + ul_ch1 = &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*pilot_pos1]; + ul_ch2 = &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*pilot_pos2]; + + + // Estimation of phase difference between the 2 channel estimates + delta_phase = lte_ul_freq_offset_estimation(frame_parms, + ul_ch_estimates[aa], + N_rb_alloc); + // negative phase index indicates negative Im of ru + // msg("delta_phase: %d\n",delta_phase); + #ifdef DEBUG_CH -#ifdef USER_MODE - - if((aa == 0)&& (cooperation_flag == 2)) { - write_output("test1.m","t1",temp_in_ifft_0,512,1,1); - write_output("test2.m","t2",temp_out_ifft_0,512*2,2,1); - write_output("test3.m","t3",temp_in_fft_0,512,1,1); - write_output("test4.m","t4",temp_out_fft_0,512,1,1); - write_output("test5.m","t5",temp_in_fft_1,512,1,1); - write_output("test6.m","t6",temp_out_fft_1,512,1,1); - } - -#endif + LOG_D(PHY,"lte_ul_channel_estimation: ul_ch1 = %p, ul_ch2 = %p, pilot_pos1=%d, pilot_pos2=%d\n",ul_ch1, ul_ch2, pilot_pos1,pilot_pos2); #endif + + for (k=0; ksymbols_per_tti; k++) { + + // we scale alpha and beta by SCALE (instead of 0x7FFF) to avoid overflows + // alpha = (int16_t) (((int32_t) SCALE * (int32_t) (pilot_pos2-k))/(pilot_pos2-pilot_pos1)); + // beta = (int16_t) (((int32_t) SCALE * (int32_t) (k-pilot_pos1))/(pilot_pos2-pilot_pos1)); - }//cooperation_flag == 2 - - if (Ns&1) {//we are in the second slot of the sub-frame, so do the interpolation - - ul_ch1 = &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*pilot_pos1]; - ul_ch2 = &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*pilot_pos2]; - - - if(cooperation_flag == 2) { // For Distributed Alamouti - ul_ch1_0 = &ul_ch_estimates_0[aa][frame_parms->N_RB_UL*12*pilot_pos1]; - ul_ch2_0 = &ul_ch_estimates_0[aa][frame_parms->N_RB_UL*12*pilot_pos2]; - - ul_ch1_1 = &ul_ch_estimates_1[aa][frame_parms->N_RB_UL*12*pilot_pos1]; - ul_ch2_1 = &ul_ch_estimates_1[aa][frame_parms->N_RB_UL*12*pilot_pos2]; - } - - // Estimation of phase difference between the 2 channel estimates - delta_phase = lte_ul_freq_offset_estimation(frame_parms, - ul_ch_estimates[aa], - N_rb_alloc); - // negative phase index indicates negative Im of ru - // msg("delta_phase: %d\n",delta_phase); - + #ifdef DEBUG_CH - msg("lte_ul_channel_estimation: ul_ch1 = %p, ul_ch2 = %p, pilot_pos1=%d, pilot_pos2=%d\n",ul_ch1, ul_ch2, pilot_pos1,pilot_pos2); -#endif - - for (k=0; ksymbols_per_tti; k++) { - - // we scale alpha and beta by SCALE (instead of 0x7FFF) to avoid overflows - alpha = (int16_t) (((int32_t) SCALE * (int32_t) (pilot_pos2-k))/(pilot_pos2-pilot_pos1)); - beta = (int16_t) (((int32_t) SCALE * (int32_t) (k-pilot_pos1))/(pilot_pos2-pilot_pos1)); - - -#ifdef DEBUG_CH - msg("lte_ul_channel_estimation: k=%d, alpha = %d, beta = %d\n",k,alpha,beta); + LOG_D(PHY,"lte_ul_channel_estimation: k=%d, alpha = %d, beta = %d\n",k,alpha,beta); #endif //symbol_offset_subframe = frame_parms->N_RB_UL*12*k; - + // interpolate between estimates - if ((k != pilot_pos1) && (k != pilot_pos2)) { - // multadd_complex_vector_real_scalar((int16_t*) ul_ch1,alpha,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],1,Msc_RS); - // multadd_complex_vector_real_scalar((int16_t*) ul_ch2,beta ,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],0,Msc_RS); - - // multadd_complex_vector_real_scalar((int16_t*) ul_ch1,SCALE,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],1,Msc_RS); - // multadd_complex_vector_real_scalar((int16_t*) ul_ch2,SCALE,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],0,Msc_RS); - // msg("phase = %d\n",ru[2*cmax(((delta_phase/7)*(k-3)),0)]); - - // the phase is linearly interpolated - current_phase1 = (delta_phase/7)*(k-pilot_pos1); - current_phase2 = (delta_phase/7)*(k-pilot_pos2); - // msg("sym: %d, current_phase1: %d, current_phase2: %d\n",k,current_phase1,current_phase2); - // set the right quadrant - (current_phase1 > 0) ? (ru1 = ru_90) : (ru1 = ru_90c); - (current_phase2 > 0) ? (ru2 = ru_90) : (ru2 = ru_90c); - // take absolute value and clip - current_phase1 = cmin(abs(current_phase1),127); - current_phase2 = cmin(abs(current_phase2),127); - - // msg("sym: %d, current_phase1: %d, ru: %d + j%d, current_phase2: %d, ru: %d + j%d\n",k,current_phase1,ru1[2*current_phase1],ru1[2*current_phase1+1],current_phase2,ru2[2*current_phase2],ru2[2*current_phase2+1]); - - // rotate channel estimates by estimated phase - rotate_cpx_vector((int16_t*) ul_ch1, - &ru1[2*current_phase1], - (int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k], - Msc_RS, - 15); - - rotate_cpx_vector((int16_t*) ul_ch2, - &ru2[2*current_phase2], - (int16_t*) &tmp_estimates[0], - Msc_RS, - 15); - - // Combine the two rotated estimates - multadd_complex_vector_real_scalar((int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],SCALE,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],1,Msc_RS); - multadd_complex_vector_real_scalar((int16_t*) &tmp_estimates[0],SCALE,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],0,Msc_RS); - - /* - if ((kpilot_pos2))) { - + if ((k != pilot_pos1) && (k != pilot_pos2)) { + // multadd_complex_vector_real_scalar((int16_t*) ul_ch1,alpha,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],1,Msc_RS); + // multadd_complex_vector_real_scalar((int16_t*) ul_ch2,beta ,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],0,Msc_RS); + + // multadd_complex_vector_real_scalar((int16_t*) ul_ch1,SCALE,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],1,Msc_RS); + // multadd_complex_vector_real_scalar((int16_t*) ul_ch2,SCALE,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],0,Msc_RS); + // msg("phase = %d\n",ru[2*cmax(((delta_phase/7)*(k-3)),0)]); + + // the phase is linearly interpolated + current_phase1 = (delta_phase/7)*(k-pilot_pos1); + current_phase2 = (delta_phase/7)*(k-pilot_pos2); + // msg("sym: %d, current_phase1: %d, current_phase2: %d\n",k,current_phase1,current_phase2); + // set the right quadrant + (current_phase1 > 0) ? (ru1 = ru_90) : (ru1 = ru_90c); + (current_phase2 > 0) ? (ru2 = ru_90) : (ru2 = ru_90c); + // take absolute value and clip + current_phase1 = cmin(abs(current_phase1),127); + current_phase2 = cmin(abs(current_phase2),127); + + // msg("sym: %d, current_phase1: %d, ru: %d + j%d, current_phase2: %d, ru: %d + j%d\n",k,current_phase1,ru1[2*current_phase1],ru1[2*current_phase1+1],current_phase2,ru2[2*current_phase2],ru2[2*current_phase2+1]); + + // rotate channel estimates by estimated phase + rotate_cpx_vector((int16_t*) ul_ch1, + &ru1[2*current_phase1], + (int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k], + Msc_RS, + 15); + + rotate_cpx_vector((int16_t*) ul_ch2, + &ru2[2*current_phase2], + (int16_t*) &tmp_estimates[0], + Msc_RS, + 15); + + // Combine the two rotated estimates + multadd_complex_vector_real_scalar((int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],SCALE,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],1,Msc_RS); + multadd_complex_vector_real_scalar((int16_t*) &tmp_estimates[0],SCALE,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],0,Msc_RS); + + /* + if ((kpilot_pos2))) { + multadd_complex_vector_real_scalar((int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],SCALE>>1,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],1,Msc_RS); - + multadd_complex_vector_real_scalar((int16_t*) &tmp_estimates[0],SCALE>>1,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],0,Msc_RS); - - } else { - + + } else { + multadd_complex_vector_real_scalar((int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],SCALE>>1,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],1,Msc_RS); - + multadd_complex_vector_real_scalar((int16_t*) &tmp_estimates[0],SCALE>>1,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],0,Msc_RS); - + // multadd_complex_vector_real_scalar((int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],alpha,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],1,Msc_RS); - + // multadd_complex_vector_real_scalar((int16_t*) &tmp_estimates[0],beta ,(int16_t*) &ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],0,Msc_RS); + + } + */ + + // memcpy(&ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],ul_ch1,Msc_RS*sizeof(int32_t)); + } + } //for(k=... - } - */ + // because of the scaling of alpha and beta we also need to scale the final channel estimate at the pilot positions + + // multadd_complex_vector_real_scalar((int16_t*) ul_ch1,SCALE,(int16_t*) ul_ch1,1,Msc_RS); + // multadd_complex_vector_real_scalar((int16_t*) ul_ch2,SCALE,(int16_t*) ul_ch2,1,Msc_RS); - // memcpy(&ul_ch_estimates[aa][frame_parms->N_RB_UL*12*k],ul_ch1,Msc_RS*sizeof(int32_t)); - if(cooperation_flag == 2) { // For Distributed Alamouti - multadd_complex_vector_real_scalar((int16_t*) ul_ch1_0,beta ,(int16_t*) &ul_ch_estimates_0[aa][frame_parms->N_RB_UL*12*k],1,Msc_RS); - multadd_complex_vector_real_scalar((int16_t*) ul_ch2_0,alpha,(int16_t*) &ul_ch_estimates_0[aa][frame_parms->N_RB_UL*12*k],0,Msc_RS); - - multadd_complex_vector_real_scalar((int16_t*) ul_ch1_1,beta ,(int16_t*) &ul_ch_estimates_1[aa][frame_parms->N_RB_UL*12*k],1,Msc_RS); - multadd_complex_vector_real_scalar((int16_t*) ul_ch2_1,alpha,(int16_t*) &ul_ch_estimates_1[aa][frame_parms->N_RB_UL*12*k],0,Msc_RS); - } - - } - } //for(k=... - - // because of the scaling of alpha and beta we also need to scale the final channel estimate at the pilot positions - - // multadd_complex_vector_real_scalar((int16_t*) ul_ch1,SCALE,(int16_t*) ul_ch1,1,Msc_RS); - // multadd_complex_vector_real_scalar((int16_t*) ul_ch2,SCALE,(int16_t*) ul_ch2,1,Msc_RS); - - if(cooperation_flag == 2) { // For Distributed Alamouti - multadd_complex_vector_real_scalar((int16_t*) ul_ch1_0,SCALE,(int16_t*) ul_ch1_0,1,Msc_RS); - multadd_complex_vector_real_scalar((int16_t*) ul_ch2_0,SCALE,(int16_t*) ul_ch2_0,1,Msc_RS); - - multadd_complex_vector_real_scalar((int16_t*) ul_ch1_1,SCALE,(int16_t*) ul_ch1_1,1,Msc_RS); - multadd_complex_vector_real_scalar((int16_t*) ul_ch2_1,SCALE,(int16_t*) ul_ch2_1,1,Msc_RS); - } - - - } //if (Ns&1) + } //if (Ns&1) } //for(aa=... @@ -674,31 +414,31 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB, } extern uint16_t transmission_offset_tdd[16]; -#define DEBUG_SRS +//#define DEBUG_SRS int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, - LTE_eNB_COMMON *eNb_common_vars, - LTE_eNB_SRS *eNb_srs_vars, + LTE_eNB_COMMON *common_vars, + LTE_eNB_SRS *srs_vars, SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated, - unsigned char sub_frame_number, - unsigned char eNb_id) + unsigned char subframe, + unsigned char eNB_id) { - int T_SFC,aa; + int aa; int N_symb,symbol; - uint8_t nb_antennas_rx = frame_parms->nb_antennas_tx_eNB; + uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx; #ifdef DEBUG_SRS char fname[40], vname[40]; #endif - uint8_t Ssrs = frame_parms->soundingrs_ul_config_common.srs_SubframeConfig; + //uint8_t Ssrs = frame_parms->soundingrs_ul_config_common.srs_SubframeConfig; + //uint8_t T_SFC = (Ssrs<=7 ? 5 : 10); N_symb = 2*7-frame_parms->Ncp; - symbol = (sub_frame_number+1)*N_symb-1; //SRS is always in last symbol of subframe - T_SFC = (Ssrs<=7 ? 5 : 10); + symbol = N_symb-1; //SRS is always in last symbol of subframe /* - msg("SRS channel estimation eNb %d, subframs %d, %d %d %d %d %d\n",eNb_id,sub_frame_number, + msg("SRS channel estimation eNB %d, subframs %d, %d %d %d %d %d\n",eNB_id,sub_frame_number, SRS_parms->Csrs, SRS_parms->Bsrs, SRS_parms->kTC, @@ -706,47 +446,47 @@ int32_t lte_srs_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms, SRS_parms->Ssrs); */ - if ((1<<(sub_frame_number%T_SFC))&transmission_offset_tdd[Ssrs]) { + //if ((1<<(sub_frame_number%T_SFC))&transmission_offset_tdd[Ssrs]) { - if (generate_srs_rx(frame_parms, - soundingrs_ul_config_dedicated, - eNb_srs_vars->srs)==-1) { - msg("lte_srs_channel_estimation: Error in generate_srs_rx\n"); + if (generate_srs(frame_parms, + soundingrs_ul_config_dedicated, + &srs_vars->srs[eNB_id], + 0x7FFF, + subframe)==-1) { + LOG_E(PHY,"lte_srs_channel_estimation: Error in generate_srs_rx\n"); return(-1); } for (aa=0; aarxdataF[eNb_id][aa][2*frame_parms->ofdm_symbol_size*symbol], - eNb_srs_vars->srs, - eNb_srs_vars->srs_ch_estimates[eNb_id][aa]); + LOG_E(PHY,"SRS channel estimation eNB %d, subframs %d, aarx %d, %p, %p, %p\n",eNB_id,sub_frame_number,aa, + &common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + srs_vars->srs, + srs_vars->srs_ch_estimates[aa]); #endif + + //write_output("eNB_rxF.m","rxF",&common_vars->rxdataF[0][aa][2*frame_parms->ofdm_symbol_size*symbol],2*(frame_parms->ofdm_symbol_size),2,1); + //write_output("eNB_srs.m","srs_eNB",common_vars->srs,(frame_parms->ofdm_symbol_size),1,1); - //write_output("eNb_rxF.m","rxF",&eNb_common_vars->rxdataF[0][aa][2*frame_parms->ofdm_symbol_size*symbol],2*(frame_parms->ofdm_symbol_size),2,1); - //write_output("eNb_srs.m","srs_eNb",eNb_common_vars->srs,(frame_parms->ofdm_symbol_size),1,1); - mult_cpx_conj_vector((int16_t*) &eNb_common_vars->rxdataF[eNb_id][aa][2*frame_parms->ofdm_symbol_size*symbol], - (int16_t*) eNb_srs_vars->srs, - (int16_t*) eNb_srs_vars->srs_ch_estimates[eNb_id][aa], - frame_parms->ofdm_symbol_size, - 15); + mult_cpx_conj_vector((int16_t*) &common_vars->rxdataF[aa][2*frame_parms->ofdm_symbol_size*symbol], + (int16_t*) srs_vars->srs, + (int16_t*) srs_vars->srs_ch_estimates[aa], + frame_parms->ofdm_symbol_size, + 15, + 0); - //msg("SRS channel estimation cmult out\n"); -#ifdef USER_MODE #ifdef DEBUG_SRS - sprintf(fname,"eNB_id%d_an%d_srs_ch_est.m",eNb_id,aa); - sprintf(vname,"eNB%d_%d_srs_ch_est",eNb_id,aa); - write_output(fname,vname,eNb_srs_vars->srs_ch_estimates[eNb_id][aa],frame_parms->ofdm_symbol_size,1,1); -#endif + sprintf(fname,"srs_ch_est%d.m",aa); + sprintf(vname,"srs_est%d",aa); + write_output(fname,vname,srs_vars->srs_ch_estimates[aa],frame_parms->ofdm_symbol_size,1,1); #endif } - } /* else { for (aa=0;aasrs_ch_estimates[eNb_id][aa],frame_parms->ofdm_symbol_size*sizeof(int)); + bzero(srs_vars->srs_ch_estimates[eNB_id][aa],frame_parms->ofdm_symbol_size*sizeof(int)); } */ return(0); diff --git a/openair1/PHY/LTE_ESTIMATION/pss6144.h b/openair1/PHY/LTE_ESTIMATION/pss6144.h index 4903c84d62..d3d5ee0100 100644 --- a/openair1/PHY/LTE_ESTIMATION/pss6144.h +++ b/openair1/PHY/LTE_ESTIMATION/pss6144.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_ESTIMATION/lte_sync_timefreq.c * \brief Initial time frequency scan of entire LTE band diff --git a/openair1/PHY/LTE_ESTIMATION/vars.h b/openair1/PHY/LTE_ESTIMATION/vars.h index 7f3cc6e31f..4690bba42e 100644 --- a/openair1/PHY/LTE_ESTIMATION/vars.h +++ b/openair1/PHY/LTE_ESTIMATION/vars.h @@ -1,28 +1,21 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ diff --git a/openair1/PHY/LTE_REFSIG/COPYING b/openair1/PHY/LTE_REFSIG/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/LTE_REFSIG/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/LTE_REFSIG/defs.h b/openair1/PHY/LTE_REFSIG/defs.h index f8701a63a8..838406b444 100644 --- a/openair1/PHY/LTE_REFSIG/defs.h +++ b/openair1/PHY/LTE_REFSIG/defs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Definitions for LTE Reference signals */ /* Author R. Knopp / EURECOM / OpenAirInterface.org */ #ifndef __LTE_REFSIG_DEFS__H__ @@ -52,12 +45,15 @@ unsigned int lte_gold_generic(unsigned int *x1, unsigned int *x2, unsigned char void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14],uint16_t Nid_cell); +void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_cell, uint16_t *n_idDMRS); + +void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_t Nid_cell, uint16_t n_rnti); + /*!\brief This function generates the LTE Gold sequence (36-211, Sec 7.2), specifically for DL UE-specific reference signals for antenna ports 7..14. @param frame_parms LTE DL Frame parameters @param lte_gold_uespec_table pointer to table where sequences are stored @param Nid_cell Cell Id (to compute sequences for local and adjacent cells) @param n_idDMRS Scrambling identity for TM10*/ -void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_cell, uint16_t *n_idDMRS); void lte_gold_mbsfn(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_mbsfn_table[10][3][42],uint16_t Nid_MBSFN); @@ -84,16 +80,18 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, @param output Output vector for OFDM symbol (Frequency Domain) @param amp Q15 amplitude @param Ns Slot number (0..19) +@param lprime symbol (0,1) @param p antenna index @param SS_flag Flag to indicate special subframe */ -int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, +/*int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, uint8_t UE_id, int32_t *output, short amp, uint8_t Ns, + uint8_t lprime, uint8_t p, - int SS_flag ); + int SS_flag);*/ /*! \brief This function generates the MBSFN reference signal sequence (36-211, Sec 6.10.1.2) @param phy_vars_eNB Pointer to eNB variables @@ -123,6 +121,24 @@ int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue, unsigned char l, unsigned char p); +/*!\brief This function generates the ue-specific reference signal + * sequence (36-211, Sec 6.10.3.1) for beamforming channel estimation upon reception +@param phy_vars_ue Pointer to UE variables +@param output Output vector for OFDM symbol (Frequency Domain) +@param Ns Slot number (0..19) +@param p antenna port intex +@param lprime symbol (0,1) +@param SS_flag Flag to indicate special subframe +@param nRB_PDSCH number of allocated PDSCH RBs +*/ +int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue, + int32_t *output, + unsigned char Ns, + unsigned char p, + int lprime, + int SS_flag, + uint16_t nRB_PDSCH); + int lte_dl_mbsfn_rx(PHY_VARS_UE *phy_vars_ue, int *output, int subframe, diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c index 9ffda3a83d..5bf69578d1 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_cell_spec.c @@ -1,35 +1,26 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifdef USER_MODE #include #include -#endif #include "defs.h" #include "PHY/defs.h" @@ -40,7 +31,7 @@ //Calibration -int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB, +int lte_dl_cell_spec_SS(PHY_VARS_eNB *eNB, int32_t *output, short amp, unsigned char Ns, @@ -76,27 +67,27 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB, return(-1); } - mprime = 110 - phy_vars_eNB->lte_frame_parms.N_RB_DL; + mprime = 110 - eNB->frame_parms.N_RB_DL; - k = (nu + phy_vars_eNB->lte_frame_parms.nushift); + k = (nu + eNB->frame_parms.nushift); if (k > 6)//b k -=6;//b - k+=phy_vars_eNB->lte_frame_parms.first_carrier_offset; + k+=eNB->frame_parms.first_carrier_offset; - for (m=0; mlte_frame_parms.N_RB_DL<<1; m++) { // loop over pilots in one slot/symbol, 2*N_RB_DL pilots + for (m=0; mframe_parms.N_RB_DL<<1; m++) { // loop over pilots in one slot/symbol, 2*N_RB_DL pilots mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; // this is r_mprime from 3GPP 36-211 6.10.1.2 - output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + output[k] = qpsk[(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; //output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3; #ifdef DEBUG_DL_CELL_SPEC printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d)\n",(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); + printf("index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); #endif mprime++; @@ -108,9 +99,9 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB, #endif k+=6;//b - if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) { + if (k >= eNB->frame_parms.ofdm_symbol_size) { k++; // skip DC carrier - k-=phy_vars_eNB->lte_frame_parms.ofdm_symbol_size; + k-=eNB->frame_parms.ofdm_symbol_size; } // printf("** k %d\n",k); @@ -120,7 +111,7 @@ int lte_dl_cell_spec_SS(PHY_VARS_eNB *phy_vars_eNB, } -int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, +int lte_dl_cell_spec(PHY_VARS_eNB *eNB, int32_t *output, short amp, unsigned char Ns, @@ -155,31 +146,31 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, return(-1); } - mprime = 110 - phy_vars_eNB->lte_frame_parms.N_RB_DL; + mprime = 110 - eNB->frame_parms.N_RB_DL; - k = (nu + phy_vars_eNB->lte_frame_parms.nushift); + k = (nu + eNB->frame_parms.nushift); if (k > 5) k -=6; - k+=phy_vars_eNB->lte_frame_parms.first_carrier_offset; + k+=eNB->frame_parms.first_carrier_offset; DevAssert( Ns < 20 ); DevAssert( l < 2 ); DevAssert( mprime>>4 < 14 ); - for (m=0; mlte_frame_parms.N_RB_DL<<1; m++) { + for (m=0; mframe_parms.N_RB_DL<<1; m++) { mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; // this is r_mprime from 3GPP 36-211 6.10.1.2 - output[k] = qpsk[(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + output[k] = qpsk[(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; //output[k] = (lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3; #ifdef DEBUG_DL_CELL_SPEC printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d)\n",(phy_vars_eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); + printf("index = %d (k %d)\n",(eNB->lte_gold_table[Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); #endif mprime++; @@ -191,9 +182,9 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, #endif k+=6; - if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) { + if (k >= eNB->frame_parms.ofdm_symbol_size) { k++; // skip DC carrier - k-=phy_vars_eNB->lte_frame_parms.ofdm_symbol_size; + k-=eNB->frame_parms.ofdm_symbol_size; } // printf("** k %d\n",k); @@ -202,7 +193,7 @@ int lte_dl_cell_spec(PHY_VARS_eNB *phy_vars_eNB, return(0); } -int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue, +int lte_dl_cell_spec_rx(PHY_VARS_UE *ue, uint8_t eNB_offset, int *output, unsigned char Ns, @@ -230,19 +221,19 @@ int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue, ((short *)&qpsk[3])[0] = -pamp; ((short *)&qpsk[3])[1] = pamp; - mprime = 110 - phy_vars_ue->lte_frame_parms.N_RB_DL; + mprime = 110 - ue->frame_parms.N_RB_DL; - for (m=0; mlte_frame_parms.N_RB_DL<<1; m++) { + for (m=0; mframe_parms.N_RB_DL<<1; m++) { mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; // this is r_mprime from 3GPP 36-211 6.10.1.2 - output[k] = qpsk[(phy_vars_ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + output[k] = qpsk[(ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; #ifdef DEBUG_DL_CELL_SPEC printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", Ns,l,m,mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d)\n",(phy_vars_ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); + printf("index = %d (k %d)\n",(ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); #endif mprime++; diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c index 9c3269b863..35e5fe6aff 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_mbsfn.c @@ -1,37 +1,28 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ // 6.10.2.2 MBSFN reference signals Mapping to resource elements -#ifdef USER_MODE #include #include -#endif #include "defs.h" #include "PHY/defs.h" @@ -39,7 +30,7 @@ //extern unsigned int lte_gold_table[10][3][42]; //#define DEBUG_DL_MBSFN -int lte_dl_mbsfn(PHY_VARS_eNB *phy_vars_eNB, int32_t *output, +int lte_dl_mbsfn(PHY_VARS_eNB *eNB, int32_t *output, short amp, int subframe, unsigned char l) @@ -62,37 +53,37 @@ int lte_dl_mbsfn(PHY_VARS_eNB *phy_vars_eNB, int32_t *output, ((short *)&qpsk[3])[1] = -a; - mprime = 3*(110 - phy_vars_eNB->lte_frame_parms.N_RB_DL); + mprime = 3*(110 - eNB->frame_parms.N_RB_DL); - for (m=0; mlte_frame_parms.N_RB_DL*6; m++) { + for (m=0; mframe_parms.N_RB_DL*6; m++) { if ((l==0) || (l==2)) k = m<<1; else if (l==1) k = 1+(m<<1); else { - msg("lte_dl_mbsfn: l %d -> ERROR\n",l); + LOG_E(PHY,"lte_dl_mbsfn: l %d -> ERROR\n",l); return(-1); } - k+=phy_vars_eNB->lte_frame_parms.first_carrier_offset; + k+=eNB->frame_parms.first_carrier_offset; mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; - if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) { + if (k >= eNB->frame_parms.ofdm_symbol_size) { k++; // skip DC carrier - k-=phy_vars_eNB->lte_frame_parms.ofdm_symbol_size; + k-=eNB->frame_parms.ofdm_symbol_size; } - output[k] = qpsk[(phy_vars_eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + output[k] = qpsk[(eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; //output[k] = (lte_gold_table[eNB_offset][subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3; #ifdef DEBUG_DL_MBSFN - msg("subframe %d, l %d, m %d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d\n", + LOG_D(PHY,"subframe %d, l %d, m %d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d\n", subframe,l,m,mprime,mprime_dword,mprime_qpsk_symb); - msg("index = %d (k %d)(%x)\n",(phy_vars_eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,phy_vars_eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]); + LOG_D(PHY,"index = %d (k %d)(%x)\n",(eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,eNB->lte_gold_mbsfn_table[subframe][l][mprime_dword]); #endif mprime++; @@ -110,7 +101,7 @@ int lte_dl_mbsfn(PHY_VARS_eNB *phy_vars_eNB, int32_t *output, -int lte_dl_mbsfn_rx(PHY_VARS_UE *phy_vars_ue, +int lte_dl_mbsfn_rx(PHY_VARS_UE *ue, int *output, int subframe, unsigned char l) @@ -131,20 +122,20 @@ int lte_dl_mbsfn_rx(PHY_VARS_UE *phy_vars_ue, ((short *)&qpsk[3])[0] = -ONE_OVER_SQRT2_Q15; ((short *)&qpsk[3])[1] = ONE_OVER_SQRT2_Q15; - mprime = 3*(110 - phy_vars_ue->lte_frame_parms.N_RB_DL); + mprime = 3*(110 - ue->frame_parms.N_RB_DL); - for (m=0; mlte_frame_parms.N_RB_DL*6; m++) { + for (m=0; mframe_parms.N_RB_DL*6; m++) { mprime_dword = mprime>>4; mprime_qpsk_symb = mprime&0xf; // this is r_mprime from 3GPP 36-211 6.10.1.2 - output[k] = qpsk[(phy_vars_ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; + output[k] = qpsk[(ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; #ifdef DEBUG_DL_MBSFN printf("subframe %d, l %d, m %d, mprime %d, mprime_dword %d, mprime_qpsk_symbol %d\n", subframe,l,m,mprime, mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d) (%x)\n",(phy_vars_ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,phy_vars_ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]); + printf("index = %d (k %d) (%x)\n",(ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k,ue->lte_gold_mbsfn_table[subframe][l][mprime_dword]); #endif mprime++; diff --git a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c index 9b094393c7..a7db8fd5aa 100644 --- a/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c +++ b/openair1/PHY/LTE_REFSIG/lte_dl_uespec.c @@ -1,47 +1,37 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file PHY/LTE_REFSIG/lte_dl_uespec.c +/*! \file PHY/LTE_REFSIG/lte_dl_ue_spec.c * \brief Top-level routines for generating UE-specific Reference signals from 36-211, V11.3.0 2013-06 -* \author R. Knopp -* \date 2014 +* \author R. Knopp X. Jiang +* \date 2015 * \version 0.1 * \company Eurecom -* \email: knopp@eurecom.fr +* \email: knopp@eurecom.fr xiwen.jiang@eurecom.fr * \note * \warning */ -#ifdef USER_MODE #include #include -#endif #include "defs.h" #include "PHY/defs.h" @@ -52,19 +42,22 @@ int Wbar_NCP[8][4] = {{1,1,1,1},{1,-1,1,-1},{1,1,1,1},{1,-1,1,-1},{1,1,-1,-1},{-1,-1,1,1},{1,-1,-1,1},{-1,1,1,-1}}; -int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, +/* +int lte_dl_ue_spec(PHY_VARS_eNB *eNB, uint8_t UE_id, int32_t *output, short amp, uint8_t Ns, + uint8_t lprime, uint8_t p, - int SS_flag ) + int SS_flag) { - int32_t qpsk[4],nqpsk[4],*qpsk_p,*output_p; - int16_t a; - int w,lprime,ind,l,ind_dword,ind_qpsk_symb,nPRB; - // LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB[UE_id][0]; + int32_t qpsk[4],nqpsk[4]; + int16_t k=0,a; + int mprime,ind,ind_dword,ind_qpsk_symb; + unsigned nushift,kprime; + // LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_eNB[UE_id][0]; a = (amp*ONE_OVER_SQRT2_Q15)>>15; ((short *)&qpsk[0])[0] = a; @@ -85,172 +78,66 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, ((short *)&nqpsk[3])[0] = a; ((short *)&nqpsk[3])[1] = a; - if (p>=7) { + if (p==5) { if (SS_flag==0) { - if (phy_vars_eNB->lte_frame_parms.Ncp == NORMAL) { - // this is 3GPP 36-211 6.10.3.2, NORMAL CP, p>=7 + if (eNB->frame_parms.Ncp == NORMAL) { + // this is 3GPP 36-211 6.10.3.2, NORMAL CP, p=5 + + nushift = eNB->frame_parms.Nid_cell%3; + if(lprime==0){ + kprime=nushift; + }else{ + kprime=(nushift+2*lprime)%4; + } + k = kprime+eNB->frame_parms.first_carrier_offset; + printf("lte_dl_ue_spec:k=%d\n",k); + + for (mprime=0;mprime<3*nRB_PDSCH-1;mprime++) { + ind = 3*lprime*nRB_PDSCH+mprime; + ind_dword = ind>>4; + ind_qpsk_symb = ind&0xf; - // position output pointer to 5th symbol in slot - output_p = output+(60*phy_vars_eNB->lte_frame_parms.N_RB_DL); + output[k] = qpsk[(phy_vars_UE->lte_gold_uespec_port5_table[Ns][ind_dword]>>(2*ind_qpsk_symb))&3]; + //output[k] = 0xffffffff; - // shift to 2nd RE in PRB for p=7,8,11,13 - if ((p==7) || (p==8) || (p==11) || (p==13)) output_p++; - - - for (lprime=0; lprime<2; lprime++) { - - ind = 3*lprime*phy_vars_eNB->lte_frame_parms.N_RB_DL; - l = lprime + ((Ns&1)<<1); - - // loop over pairs of PRBs, this is the periodicity of the W_bar_NCP sequence - // unroll the computations for the 6 pilots, select qpsk or nqpsk as function of W_bar_NCP - for (nPRB=0; nPRBlte_frame_parms.N_RB_DL; nPRB+=2) { - - // First pilot - w = Wbar_NCP[p-7][l]; - qpsk_p = (w==1) ? qpsk : nqpsk; - - - ind_dword = ind>>4; - ind_qpsk_symb = ind&0xf; - - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; - - -#ifdef DEBUG_DL_UESPEC - LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", - Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); -#endif - - output_p+=5; - ind++; - - w = Wbar_NCP[p-7][3-l]; - qpsk_p = (w==1) ? qpsk : nqpsk; - - // Second pilot - ind_dword = ind>>4; - ind_qpsk_symb = ind&0xf; - - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; - -#ifdef DEBUG_DL_UESPEC - LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", - Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); -#endif - - output_p+=5; - ind++; - - w = Wbar_NCP[p-7][l]; - qpsk_p = (w==1) ? qpsk : nqpsk; - // Third pilot - ind_dword = ind>>4; - ind_qpsk_symb = ind&0xf; - - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; - -#ifdef DEBUG_DL_UESPEC - LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", - Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); -#endif - - output_p+=2; - ind++; - - // Fourth pilot - w = Wbar_NCP[p-7][3-l]; - qpsk_p = (w==1) ? qpsk : nqpsk; - - - ind_dword = ind>>4; - ind_qpsk_symb = ind&0xf; - - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; - - -#ifdef DEBUG_DL_UESPEC - LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", - Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); -#endif - - output_p+=5; - ind++; - - w = Wbar_NCP[p-7][l]; - qpsk_p = (w==1) ? qpsk : nqpsk; - - // Fifth pilot - ind_dword = ind>>4; - ind_qpsk_symb = ind&0xf; - - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; - -#ifdef DEBUG_DL_UESPEC - LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", - Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); -#endif - - output_p+=5; - ind++; - - w = Wbar_NCP[p-7][3-l]; - qpsk_p = (w==1) ? qpsk : nqpsk; - // Sixth pilot - ind_dword = ind>>4; - ind_qpsk_symb = ind&0xf; - - *output_p = qpsk_p[(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; - -#ifdef DEBUG_DL_UESPEC - LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", - Ns,l,m,mprime_dword,mprime_qpsk_symb); - LOG_D(PHY,"index = %d\n",(phy_vars_eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); -#endif - - output_p+=2; - ind++; - } + k += 4; + if (k >= eNB->frame_parms.ofdm_symbol_size) { + k++; // skip DC carrier + k-=eNB->frame_parms.ofdm_symbol_size; } - } else { - LOG_E(PHY,"Special subframe not supported for UE specific pilots yet\n"); + + } } } - } else if (p==5) { - LOG_E(PHY,"p=5 not supported for UE specific pilots yet\n"); + } else if (p>=7) { + printf("lte_dl_ue_spec:antenna ports >=7 not supported yet!\n"); } else { LOG_E(PHY,"Illegal p %d UE specific pilots\n",p); } return(0); } - -/* -int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue, - uint8_t eNB_offset, - int *output, - unsigned char Ns, - unsigned char l, - unsigned char p) { +*/ - unsigned char mprime,mprime_dword,mprime_qpsk_symb,m; - unsigned short k=0; - unsigned int qpsk[4]; +int lte_dl_ue_spec_rx(PHY_VARS_UE *ue, + int32_t *output, + unsigned char Ns, + unsigned char p, + int lprime, + int SS_flag, + uint16_t nRB_PDSCH) +{ + int32_t qpsk[4],nqpsk[4],*qpsk_p,*output_p; + int w,mprime,ind,l,ind_dword,ind_qpsk_symb,nPRB; short pamp; // Compute the correct pilot amplitude, sqrt_rho_b = Q3.13 pamp = ONE_OVER_SQRT2_Q15; // This includes complex conjugate for channel estimation - ((short *)&qpsk[0])[0] = pamp; ((short *)&qpsk[0])[1] = -pamp; ((short *)&qpsk[1])[0] = -pamp; @@ -260,32 +147,169 @@ int lte_dl_cell_spec_rx(PHY_VARS_UE *phy_vars_ue, ((short *)&qpsk[3])[0] = -pamp; ((short *)&qpsk[3])[1] = pamp; - mprime = 110 - phy_vars_ue->lte_frame_parms.N_RB_DL; + ((short *)&nqpsk[0])[0] = -pamp; + ((short *)&nqpsk[0])[1] = pamp; + ((short *)&nqpsk[1])[0] = pamp; + ((short *)&nqpsk[1])[1] = pamp; + ((short *)&nqpsk[2])[0] = -pamp; + ((short *)&nqpsk[2])[1] = -pamp; + ((short *)&nqpsk[3])[0] = pamp; + ((short *)&nqpsk[3])[1] = -pamp; - for (m=0;mlte_frame_parms.N_RB_DL<<1;m++) { + if (p>=7) { + if (SS_flag==0) { + if (ue->frame_parms.Ncp == NORMAL) { + // this is 3GPP 36-211 6.10.3.2, NORMAL CP, p>=7 - mprime_dword = mprime>>4; - mprime_qpsk_symb = mprime&0xf; + output_p = output; - // this is r_mprime from 3GPP 36-211 6.10.1.2 - output[k] = qpsk[(phy_vars_ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3]; -#ifdef DEBUG_DL_CELL_SPEC - printf("Ns %d, l %d, m %d,mprime_dword %d, mprime_qpsk_symbol %d\n", - Ns,l,m,mprime_dword,mprime_qpsk_symb); - printf("index = %d (k %d)\n",(phy_vars_ue->lte_gold_table[eNB_offset][Ns][l][mprime_dword]>>(2*mprime_qpsk_symb))&3,k); + ind = 3*lprime*ue->frame_parms.N_RB_DL; + l = lprime + ((Ns&1)<<1); + + // loop over pairs of PRBs, this is the periodicity of the W_bar_NCP sequence + // unroll the computations for the 6 pilots, select qpsk or nqpsk as function of W_bar_NCP + for (nPRB=0; nPRBframe_parms.N_RB_DL; nPRB+=2) { + + // First pilot + w = Wbar_NCP[p-7][l]; + qpsk_p = (w==1) ? qpsk : nqpsk; + + + ind_dword = ind>>4; + ind_qpsk_symb = ind&0xf; + + *output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + + +#ifdef DEBUG_DL_UESPEC + LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", + Ns,l,m,ind_dword,ind_qpsk_symb); + LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); #endif - mprime++; -#ifdef DEBUG_DL_CELL_SPEC - if (m<4) - printf("Ns %d l %d output[%d] = (%d,%d)\n",Ns,l,k,((short *)&output[k])[0],((short *)&output[k])[1]); + output_p++; + ind++; + + w = Wbar_NCP[p-7][3-l]; + qpsk_p = (w==1) ? qpsk : nqpsk; + + // Second pilot + ind_dword = ind>>4; + ind_qpsk_symb = ind&0xf; + + *output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + +#ifdef DEBUG_DL_UESPEC + LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", + Ns,l,m,ind_dword,ind_qpsk_symb); + LOG_D(PHY,"index = %d\n",(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); #endif - k++; + + output_p++; + ind++; + + w = Wbar_NCP[p-7][l]; + qpsk_p = (w==1) ? qpsk : nqpsk; + // Third pilot + ind_dword = ind>>4; + ind_qpsk_symb = ind&0xf; + + *output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + +#ifdef DEBUG_DL_UESPEC + LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", + Ns,l,m,ind_dword,ind_qpsk_symb); + LOG_D(PHY,"index = %d\n",(eNB->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); +#endif + + output_p++; + ind++; + + // Fourth pilot + w = Wbar_NCP[p-7][3-l]; + qpsk_p = (w==1) ? qpsk : nqpsk; + + + ind_dword = ind>>4; + ind_qpsk_symb = ind&0xf; + + *output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + + +#ifdef DEBUG_DL_UESPEC + LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", + Ns,l,m,ind_dword,ind_qpsk_symb); + LOG_D(PHY,"index = %d\n",(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); +#endif + + output_p++; + ind++; + + w = Wbar_NCP[p-7][l]; + qpsk_p = (w==1) ? qpsk : nqpsk; + + // Fifth pilot + ind_dword = ind>>4; + ind_qpsk_symb = ind&0xf; + + *output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + +#ifdef DEBUG_DL_UESPEC + LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", + Ns,l,m,ind_dword,ind_qpsk_symb); + LOG_D(PHY,"index = %d\n",(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); +#endif + + output_p++; + ind++; + + w = Wbar_NCP[p-7][3-l]; + qpsk_p = (w==1) ? qpsk : nqpsk; + // Sixth pilot + ind_dword = ind>>4; + ind_qpsk_symb = ind&0xf; + + *output_p = qpsk_p[(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; + +#ifdef DEBUG_DL_UESPEC + LOG_D(PHY,"Ns %d, l %d, m %d,ind_dword %d, ind_qpsk_symbol %d\n", + Ns,l,m,ind_dword,ind_qpsk_symb); + LOG_D(PHY,"index = %d\n",(ue->lte_gold_uespec_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3); +#endif + + output_p++; + ind++; + } + } else { + LOG_E(PHY,"Special subframe not supported for UE specific pilots yet\n"); + } + } + } else if (p==5) { + if (SS_flag==0) { + output_p = output; + + if (ue->frame_parms.Ncp == NORMAL) { + for (mprime=0;mprime<3*nRB_PDSCH;mprime++) { + + ind = 3*lprime*nRB_PDSCH+mprime; + ind_dword = ind>>4; + ind_qpsk_symb = ind&0xf; + + *output_p = qpsk[(ue->lte_gold_uespec_port5_table[Ns][ind_dword]>>(2*ind_qpsk_symb))&3]; + //printf("lprime=%d,ind=%d,Ns=%d,output_p=(%d,%d)\n",lprime,ind,Ns,((short *)&output_p[0])[0],((short *)&output_p[0])[1]); + output_p++; + + } + } + } + } else { + LOG_E(PHY,"Illegal p %d UE specific pilots\n",p); } + return(0); } -*/ + #ifdef LTE_DL_CELL_SPEC_MAIN @@ -311,51 +335,51 @@ main() lte_gold(Nid_cell,Ncp); - lte_dl_cell_spec(output00, - ONE_OVER_SQRT2_Q15, - 50, - Nid_cell, - Ncp, - 0, - 0, - 0, - 0); + lte_dl_ue_spec(output00, + ONE_OVER_SQRT2_Q15, + 50, + Nid_cell, + Ncp, + 0, + 0, + 0, + 0); - lte_dl_cell_spec(output10, - ONE_OVER_SQRT2_Q15, - 50, - Nid_cell, - Ncp, - 0, - 1, - 0, - 0); + lte_dl_ue_spec(output10, + ONE_OVER_SQRT2_Q15, + 50, + Nid_cell, + Ncp, + 0, + 1, + 0, + 0); - lte_dl_cell_spec(output01, - ONE_OVER_SQRT2_Q15, - 50, - Nid_cell, - Ncp, - 0, - 0, - 1, - 0); + lte_dl_ue_spec(output01, + ONE_OVER_SQRT2_Q15, + 50, + Nid_cell, + Ncp, + 0, + 0, + 1, + 0); - lte_dl_cell_spec(output11, - ONE_OVER_SQRT2_Q15, - 50, - Nid_cell, - Ncp, - 0, - 1, - 1, - 0); + lte_dl_ue_spec(output11, + ONE_OVER_SQRT2_Q15, + 50, + Nid_cell, + Ncp, + 0, + 1, + 1, + 0); - write_output("dl_cell_spec00.m","dl_cs00",output00,1024,1,1); - write_output("dl_cell_spec01.m","dl_cs01",output01,1024,1,1); - write_output("dl_cell_spec10.m","dl_cs10",output10,1024,1,1); - write_output("dl_cell_spec11.m","dl_cs11",output11,1024,1,1); + write_output("dl_ue_spec00.m","dl_cs00",output00,1024,1,1); + write_output("dl_ue_spec01.m","dl_cs01",output01,1024,1,1); + write_output("dl_ue_spec10.m","dl_cs10",output10,1024,1,1); + write_output("dl_ue_spec11.m","dl_cs11",output11,1024,1,1); } diff --git a/openair1/PHY/LTE_REFSIG/lte_gold.c b/openair1/PHY/LTE_REFSIG/lte_gold.c index bfd6716640..c3a3f42456 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" @@ -138,6 +131,44 @@ void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_t } } +void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_t Nid_cell, uint16_t n_rnti) +{ + + unsigned char ns; + unsigned int n,x1,x2; + + + for (ns=0; ns<20; ns++) { + + x2 = ((((ns>>1)+1)*((Nid_cell<<1)+1))<<16) + n_rnti; + //x2 = frame_parms->Ncp + (Nid_cell<<1) + (1+(Nid_cell<<1))*(1 + (3*l) + (7*(1+ns))); //cinit + //n = 0 + //printf("cinit (ns %d, l %d) => %d\n",ns,l,x2); + x1 = 1+ (1<<31); + x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31); + + //skip first 50 double words (1600 bits) + //printf("n=0 : x1 %x, x2 %x\n",x1,x2); + for (n=1; n<50; n++) { + x1 = (x1>>1) ^ (x1>>4); + x1 = x1 ^ (x1<<31) ^ (x1<<28); + x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4); + x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28); + //printf("x1 : %x, x2 : %x\n",x1,x2); + } + + for (n=0; n<38; n++) { + x1 = (x1>>1) ^ (x1>>4); + x1 = x1 ^ (x1<<31) ^ (x1<<28); + x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4); + x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28); + lte_gold_uespec_port5_table[ns][n] = x1^x2; + //printf("n=%d : c %x\n",n,x1^x2); + } + + } +} + /*! \brief gold sequenquence generator \param x1 \param x2 this should be set to c_init if reset=1 diff --git a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c index 0d14515776..66d7fa8fb2 100644 --- a/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c +++ b/openair1/PHY/LTE_REFSIG/lte_gold_mbsfn.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ // 7.2 Pseudo-random sequence generation by a length-31 Gold sequence // for MBSFN reference signals diff --git a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c index 4020abe361..cddb642b2b 100644 --- a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c +++ b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifdef MAIN #include #include diff --git a/openair1/PHY/LTE_REFSIG/mod_table.h b/openair1/PHY/LTE_REFSIG/mod_table.h index 5ae3efdea2..7bdc1f518f 100644 --- a/openair1/PHY/LTE_REFSIG/mod_table.h +++ b/openair1/PHY/LTE_REFSIG/mod_table.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define MOD_TABLE_SIZE_SHORT 304 #define MOD_TABLE_QPSK_OFFSET 1 #define MOD_TABLE_16QAM_OFFSET 5 diff --git a/openair1/PHY/LTE_REFSIG/primary_synch.h b/openair1/PHY/LTE_REFSIG/primary_synch.h index 717f2e552c..8152722df3 100644 --- a/openair1/PHY/LTE_REFSIG/primary_synch.h +++ b/openair1/PHY/LTE_REFSIG/primary_synch.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + short primary_synch0[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-26120,-19785,11971,-30502,-24020,-22288,32117,6492,31311,9658,-16384,-28378,25100,-21063,-7292,-31946,20429,25618,14948,29158,11971,-30502,31311,9658,25100,-21063,-16384,28377,-24020,22287,32117,6492,-7292,31945,20429,25618,-26120,-19785,-16384,-28378,-16384,28377,-26120,-19785,-32402,4883,31311,-9659,32117,6492,-7292,-31946,32767,-1,25100,-21063,-24020,22287,-32402,4883,-32402,4883,-24020,22287,25100,-21063,32767,-1,-7292,-31946,32117,6492,31311,-9659,-32402,4883,-26120,-19785,-16384,28377,-16384,-28378,-26120,-19785,20429,25618,-7292,31945,32117,6492,-24020,22287,-16384,28377,25100,-21063,31311,9658,11971,-30502,14948,29158,20429,25618,-7292,-31946,25100,-21063,-16384,-28378,31311,9658,32117,6492,-24020,-22288,11971,-30502,-26120,-19785,32767,0,0,0,0,0,0,0,0,0,0,0}; short primary_synch1[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,-8086,-24020,-22288,2448,32675,-26120,19784,27073,18458,-16384,28377,25100,21062,-29523,14217,-7292,31945,-13477,-29868,-24020,-22288,27073,18458,25100,21062,-16384,-28378,2448,-32676,-26120,19784,-29523,-14218,-7292,31945,-31754,-8086,-16384,28377,-16384,-28378,-31754,-8086,31311,-9659,27073,-18459,-26120,19784,-29523,14217,32767,-1,25100,21062,2448,-32676,31311,-9659,31311,-9659,2448,-32676,25100,21062,32767,0,-29523,14217,-26120,19784,27073,-18459,31311,-9659,-31754,-8086,-16384,-28378,-16384,28377,-31754,-8086,-7292,31945,-29523,-14218,-26120,19784,2448,-32676,-16384,-28378,25100,21062,27073,18458,-24020,-22288,-13477,-29868,-7292,31945,-29523,14217,25100,21062,-16384,28377,27073,18458,-26120,19784,2448,32675,-24020,-22288,-31754,-8086,32767,0,0,0,0,0,0,0,0,0,0,0}; short primary_synch2[144] = {0,0,0,0,0,0,0,0,0,0,32767,0,-31754,8085,-24020,22287,2448,-32676,-26120,-19785,27073,-18459,-16384,-28378,25100,-21063,-29523,-14218,-7292,-31946,-13477,29867,-24020,22287,27073,-18459,25100,-21063,-16384,28377,2448,32675,-26120,-19785,-29523,14217,-7292,-31946,-31754,8085,-16384,-28378,-16384,28377,-31754,8085,31311,9658,27073,18458,-26120,-19785,-29523,-14218,32767,0,25100,-21063,2448,32675,31311,9658,31311,9658,2448,32675,25100,-21063,32767,0,-29523,-14218,-26120,-19785,27073,18458,31311,9658,-31754,8085,-16384,28377,-16384,-28378,-31754,8085,-7292,-31946,-29523,14217,-26120,-19785,2448,32675,-16384,28377,25100,-21063,27073,-18459,-24020,22287,-13477,29867,-7292,-31946,-29523,-14218,25100,-21063,-16384,-28378,27073,-18459,-26120,-19785,2448,-32676,-24020,22287,-31754,8085,32767,-1,0,0,0,0,0,0,0,0,0,0}; diff --git a/openair1/PHY/LTE_TRANSPORT/COPYING b/openair1/PHY/LTE_TRANSPORT/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/LTE_TRANSPORT/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c old mode 100644 new mode 100755 index e79f603a49..39e61c601d --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/dci.c * \brief Implements PDCCH physical channel TX/RX procedures (36.211) and DCI encoding/decoding (36.212/36.213). Current LTE compliance V8.6 2009-03. @@ -37,18 +29,19 @@ * \note * \warning */ -#ifdef USER_MODE #include #include #include -#endif #include "PHY/defs.h" #include "PHY/extern.h" #include "SCHED/defs.h" #include "SIMULATION/TOOLS/defs.h" // for taus #include "PHY/sse_intrin.h" -#include "assertions.h" +#include "assertions.h" +#include "T.h" +#include "UTIL/LOG/log.h" +#include "UTIL/LOG/vcd_signal_dumper.h" //#define DEBUG_DCI_ENCODING 1 //#define DEBUG_DCI_DECODING 1 @@ -74,7 +67,7 @@ uint32_t check_phich_reg(LTE_DL_FRAME_PARMS *frame_parms,uint32_t kprime,uint8_t // compute REG based on symbol if ((lprime == 0)|| - ((lprime==1)&&(frame_parms->nb_antennas_tx_eNB == 4))) + ((lprime==1)&&(frame_parms->nb_antenna_ports_eNB == 4))) mprime = kprime/6; else mprime = kprime>>2; @@ -159,7 +152,7 @@ uint16_t extract_crc(uint8_t *dci,uint8_t dci_len) // dci[(dci_len>>3)+1] = 0; // dci[(dci_len>>3)+2] = 0; return((uint16_t)crc16); - + } @@ -222,12 +215,21 @@ uint8_t *generate_dci0(uint8_t *dci, uint16_t coded_bits; uint8_t dci_flip[8]; - if (aggregation_level>3) { - printf("dci.c: generate_dci FATAL, illegal aggregation_level %d\n",aggregation_level); - return NULL; - } + AssertFatal((aggregation_level==1) || + (aggregation_level==2) || + (aggregation_level==4) || + (aggregation_level==8) +#ifdef Rel14 // Added for EPDCCH/MPDCCH + || + (aggregation_level==16) || + (aggregation_level==24) || + (aggregation_level==32) +#endif + , + "generate_dci FATAL, illegal aggregation_level %d\n",aggregation_level); + - coded_bits = 72 * (1<=ND) { - for (a=0; anb_antennas_tx_eNB; a++) { + for (a=0; anb_antenna_ports_eNB; a++) { //printf("a %d k %d\n",a,k); wptr = &wtemp[a][k<<2]; @@ -325,7 +327,7 @@ void pdcch_interleaving(LTE_DL_FRAME_PARMS *frame_parms,int32_t **z, int32_t **w // permutation for (i=0; inb_antennas_tx_eNB; a++) { + for (a=0; anb_antenna_ports_eNB; a++) { //wptr = &wtemp[a][i<<2]; //wptr2 = &wbar[a][((i+frame_parms->Nid_cell)%Mquad)<<2]; @@ -411,13 +413,13 @@ void pdcch_demapping(uint16_t *llr,uint16_t *wbar,LTE_DL_FRAME_PARMS *frame_parm for (i=0; i<4; i++) { wbar[mprime] = llr[tti_offset0+i]; #ifdef DEBUG_DCI_DECODING - LOG_I(PHY,"PDCCH demapping mprime %d.%d <= llr %d (symbol %d re %d) -> (%d,%d)\n",mprime/4,i,tti_offset0+i,symbol_offset,re_offset0,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime])); +// LOG_I(PHY,"PDCCH demapping mprime %d.%d <= llr %d (symbol %d re %d) -> (%d,%d)\n",mprime/4,i,tti_offset0+i,symbol_offset,re_offset0,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime])); #endif mprime++; re_offset0++; } } - } else if ((lprime==1)&&(frame_parms->nb_antennas_tx_eNB == 4)) { + } else if ((lprime==1)&&(frame_parms->nb_antenna_ports_eNB == 4)) { // LATER!!!! } else { // no pilots in this symbol kprime_mod12 = kprime%12; @@ -427,7 +429,7 @@ void pdcch_demapping(uint16_t *llr,uint16_t *wbar,LTE_DL_FRAME_PARMS *frame_parm for (i=0; i<4; i++) { wbar[mprime] = llr[tti_offset+i]; #ifdef DEBUG_DCI_DECODING - LOG_I(PHY,"PDCCH demapping mprime %d.%d <= llr %d (symbol %d re %d) -> (%d,%d)\n",mprime/4,i,tti_offset+i,symbol_offset,re_offset+i,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime])); +// LOG_I(PHY,"PDCCH demapping mprime %d.%d <= llr %d (symbol %d re %d) -> (%d,%d)\n",mprime/4,i,tti_offset+i,symbol_offset,re_offset+i,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime])); #endif mprime++; } @@ -459,10 +461,7 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t // printf("Mquad %d, RCC %d\n",Mquad,RCC); - if (!z) { - printf("dci.c: pdcch_deinterleaving: FATAL z is Null\n"); - return; - } + AssertFatal(z!=NULL,"dci.c: pdcch_deinterleaving: FATAL z is Null\n"); // undo permutation for (i=0; inb_antennas_tx_eNB; aatx++) + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) for (aarx=0; aarxnb_antennas_rx; aarx++) { //clear average level #if defined(__x86_64__) || defined(__i386__) avg128P = _mm_setzero_si128(); - dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][frame_parms->N_RB_DL*12]; + dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][0]; #elif defined(__arm__) #endif @@ -833,7 +832,7 @@ void pdcch_detection_mrc_i(LTE_DL_FRAME_PARMS *frame_parms, int32_t i; if (frame_parms->nb_antennas_rx>1) { - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) { + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) { //if (frame_parms->mode1_flag && (aatx>0)) break; #if defined(__x86_64__) || defined(__i386__) @@ -1134,6 +1133,9 @@ void pdcch_extract_rbs_dual(int32_t **rxdataF, int nushiftmod3 = frame_parms->nushift%3; symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; +#ifdef DEBUG_DCI_DECODING + LOG_I(PHY, "extract_rbs_dual: symbol_mod %d\n",symbol_mod); +#endif for (aarx=0; aarxnb_antennas_rx; aarx++) { @@ -1396,8 +1398,8 @@ void pdcch_channel_compensation(int32_t **rxdataF_ext, if (symbol==0) pilots=1; - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) { - //if (frame_parms->mode1_flag && aatx>0) break; //if mode1_flag is set then there is only one stream to extract, independent of nb_antennas_tx_eNB + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) { + //if (frame_parms->mode1_flag && aatx>0) break; //if mode1_flag is set then there is only one stream to extract, independent of nb_antenna_ports_eNB for (aarx=0; aarxnb_antennas_rx; aarx++) { @@ -1603,7 +1605,7 @@ void pdcch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms, int32_t i; if (frame_parms->nb_antennas_rx>1) { - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) { + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) { #if defined(__x86_64__) || defined(__i386__) rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[(aatx<<1)][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12]; @@ -1686,9 +1688,8 @@ void pdcch_alamouti(LTE_DL_FRAME_PARMS *frame_parms, int32_t avgP[4]; -int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, - LTE_UE_PDCCH **lte_ue_pdcch_vars, - LTE_DL_FRAME_PARMS *frame_parms, +int32_t rx_pdcch(PHY_VARS_UE *ue, + uint32_t frame, uint8_t subframe, uint8_t eNB_id, MIMO_mode_t mimo_mode, @@ -1696,207 +1697,359 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, uint8_t is_secondary_ue) { + LTE_UE_COMMON *common_vars = &ue->common_vars; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[subframe]]; + uint8_t log2_maxh,aatx,aarx; #ifdef MU_RECEIVER uint8_t eNB_id_i=eNB_id+1;//add 1 to eNB_id to separate from wanted signal, chosen as the B/F'd pilots from the SeNB are shifted by 1 #endif - int32_t avgs,s; - uint8_t n_pdcch_symbols = 3; //lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols; + int32_t avgs; + uint8_t n_pdcch_symbols; uint8_t mi = get_mi(frame_parms,subframe); - // printf("In rx_pdcch, subframe %d, eNB_id %d\n",subframe,eNB_id); - - for (s=0; srxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id+1], //add 1 to eNB_id to compensate for the shifted B/F'd pilots from the SeNB - lte_ue_pdcch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, - s, + pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id+1], //add 1 to eNB_id to compensate for the shifted B/F'd pilots from the SeNB + pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + 0, high_speed_flag, frame_parms); #ifdef MU_RECEIVER - pdcch_extract_rbs_single(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB - lte_ue_pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna - lte_ue_pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna - s, + pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB + pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna + pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna + 0, high_speed_flag, frame_parms); #endif //MU_RECEIVER - } else if (frame_parms->nb_antennas_tx_eNB>1) { - pdcch_extract_rbs_dual(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdcch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, - s, + } else if (frame_parms->nb_antenna_ports_eNB>1) { + pdcch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], + pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + 0, high_speed_flag, frame_parms); } else { - pdcch_extract_rbs_single(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdcch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, - s, + pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], + pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + 0, high_speed_flag, frame_parms); } - } - pdcch_channel_level(lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, + + // compute channel level based on ofdm symbol 0 + pdcch_channel_level(pdcch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, avgP, frame_parms->N_RB_DL); avgs = 0; - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) for (aarx=0; aarxnb_antennas_rx; aarx++) avgs = cmax(avgs,avgP[(aarx<<1)+aatx]); - log2_maxh = (log2_approx(avgs)/2) + 6 + frame_parms->nb_antennas_rx - 1; -#ifdef DEBUG_PHY - LOG_I(PHY,"subframe %d: pdcch log2_maxh = %d (%d,%d)\n",subframe,log2_maxh,avgP[0],avgs); + log2_maxh = (log2_approx(avgs)/2) + 5; //+frame_parms->nb_antennas_rx; +#ifdef UE_DEBUG_TRACE + LOG_D(PHY,"subframe %d: pdcch log2_maxh = %d (%d,%d)\n",subframe,log2_maxh,avgP[0],avgs); #endif + T(T_UE_PHY_PDCCH_ENERGY, T_INT(eNB_id), T_INT(frame%1024), T_INT(subframe), + T_INT(avgP[0]), T_INT(avgP[1]), T_INT(avgP[2]), T_INT(avgP[3])); - for (s=0; srxdataF_ext, - lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdcch_vars[eNB_id]->rxdataF_comp, - (aatx>1) ? lte_ue_pdcch_vars[eNB_id]->rho : NULL, - frame_parms, - s, - log2_maxh); // log2_maxh+I0_shift + // compute LLRs for ofdm symbol 0 only + pdcch_channel_compensation(pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + pdcch_vars[eNB_id]->rxdataF_comp, + (aatx>1) ? pdcch_vars[eNB_id]->rho : NULL, + frame_parms, + 0, + log2_maxh); // log2_maxh+I0_shift #ifdef DEBUG_PHY - if (subframe==5) - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + if (subframe==5) + write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); #endif #ifdef MU_RECEIVER - if (is_secondary_ue) { + if (is_secondary_ue) { //get MF output for interfering stream - pdcch_channel_compensation(lte_ue_pdcch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdcch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdcch_vars[eNB_id_i]->rxdataF_comp, - (aatx>1) ? lte_ue_pdcch_vars[eNB_id_i]->rho : NULL, - frame_parms, - s, - log2_maxh); // log2_maxh+I0_shift + pdcch_channel_compensation(pdcch_vars[eNB_id_i]->rxdataF_ext, + pdcch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdcch_vars[eNB_id_i]->rxdataF_comp, + (aatx>1) ? pdcch_vars[eNB_id_i]->rho : NULL, + frame_parms, + 0, + log2_maxh); // log2_maxh+I0_shift #ifdef DEBUG_PHY - write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); #endif pdcch_dual_stream_correlation(frame_parms, - s, - lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdcch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdcch_vars[eNB_id]->dl_ch_rho_ext, - log2_maxh); - } + 0, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + pdcch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdcch_vars[eNB_id]->dl_ch_rho_ext, + log2_maxh); + } #endif //MU_RECEIVER - if (frame_parms->nb_antennas_rx > 1) { + if (frame_parms->nb_antennas_rx > 1) { #ifdef MU_RECEIVER if (is_secondary_ue) { - pdcch_detection_mrc_i(frame_parms, - lte_ue_pdcch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdcch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdcch_vars[eNB_id]->rho, - lte_ue_pdcch_vars[eNB_id]->dl_ch_rho_ext, - s); + pdcch_detection_mrc_i(frame_parms, + pdcch_vars[eNB_id]->rxdataF_comp, + pdcch_vars[eNB_id_i]->rxdataF_comp, + pdcch_vars[eNB_id]->rho, + pdcch_vars[eNB_id]->dl_ch_rho_ext, + 0); #ifdef DEBUG_PHY - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); #endif } else #endif //MU_RECEIVER - pdcch_detection_mrc(frame_parms, - lte_ue_pdcch_vars[eNB_id]->rxdataF_comp, - s); + pdcch_detection_mrc(frame_parms, + pdcch_vars[eNB_id]->rxdataF_comp, + 0); + } - } - - if (mimo_mode == SISO) - pdcch_siso(frame_parms,lte_ue_pdcch_vars[eNB_id]->rxdataF_comp,s); - else - pdcch_alamouti(frame_parms,lte_ue_pdcch_vars[eNB_id]->rxdataF_comp,s); + if (mimo_mode == SISO) + pdcch_siso(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,0); + else + pdcch_alamouti(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,0); #ifdef MU_RECEIVER - if (is_secondary_ue) { + if (is_secondary_ue) { pdcch_qpsk_qpsk_llr(frame_parms, - lte_ue_pdcch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdcch_vars[eNB_id_i]->rxdataF_comp, - lte_ue_pdcch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdcch_vars[eNB_id]->llr16, //subsequent function require 16 bit llr, but output must be 8 bit (actually clipped to 4, because of the Viterbi decoder) - lte_ue_pdcch_vars[eNB_id]->llr, - s); + pdcch_vars[eNB_id]->rxdataF_comp, + pdcch_vars[eNB_id_i]->rxdataF_comp, + pdcch_vars[eNB_id]->dl_ch_rho_ext, + pdcch_vars[eNB_id]->llr16, //subsequent function require 16 bit llr, but output must be 8 bit (actually clipped to 4, because of the Viterbi decoder) + pdcch_vars[eNB_id]->llr, + 0); /* #ifdef DEBUG_PHY if (subframe==5) { - write_output("llr8_seq.m","llr8",<e_ue_pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); - write_output("llr16_seq.m","llr16",<e_ue_pdcch_vars[eNB_id]->llr16[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); + write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); + write_output("llr16_seq.m","llr16",&pdcch_vars[eNB_id]->llr16[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); } #endif*/ - } else { + } else { #endif //MU_RECEIVER pdcch_llr(frame_parms, - lte_ue_pdcch_vars[eNB_id]->rxdataF_comp, - (char *)lte_ue_pdcch_vars[eNB_id]->llr, - s); + pdcch_vars[eNB_id]->rxdataF_comp, + (char *)pdcch_vars[eNB_id]->llr, + 0); /*#ifdef DEBUG_PHY - write_output("llr8_seq.m","llr8",<e_ue_pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); + write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); #endif*/ + #ifdef MU_RECEIVER - } + } #endif //MU_RECEIVER - } - // decode pcfich here +#if T_TRACER + T(T_UE_PHY_PDCCH_IQ, T_INT(frame_parms->N_RB_DL), T_INT(frame_parms->N_RB_DL), + T_INT(n_pdcch_symbols), + T_BUFFER(pdcch_vars[eNB_id]->rxdataF_comp, frame_parms->N_RB_DL*12*n_pdcch_symbols* 4)); +#endif + + // decode pcfich here and find out pdcch ofdm symbol number n_pdcch_symbols = rx_pcfich(frame_parms, subframe, - lte_ue_pdcch_vars[eNB_id], + pdcch_vars[eNB_id], mimo_mode); + if (n_pdcch_symbols>3) n_pdcch_symbols=1; #ifdef DEBUG_DCI_DECODING - printf("[PDCCH] subframe %d n_pdcch_symbols from PCFICH =%d\n",subframe,n_pdcch_symbols); - printf("demapping: subframe %d, mi %d, tdd_config %d\n",subframe,get_mi(frame_parms,subframe),frame_parms->tdd_config); + LOG_I(PHY,"demapping: subframe %d, mi %d, tdd_config %d\n",subframe,get_mi(frame_parms,subframe),frame_parms->tdd_config); #endif - pdcch_demapping(lte_ue_pdcch_vars[eNB_id]->llr, - lte_ue_pdcch_vars[eNB_id]->wbar, + // process pdcch ofdm symbol 1 and 2 if necessary + for (int s=1; scommon_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id+1], //add 1 to eNB_id to compensate for the shifted B/F'd pilots from the SeNB + pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + s, + high_speed_flag, + frame_parms); +#ifdef MU_RECEIVER +pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i - 1],//subtract 1 to eNB_id_i to compensate for the non-shifted pilots from the PeNB + pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna + pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna + s, + high_speed_flag, + frame_parms); +#endif //MU_RECEIVER + } else if (frame_parms->nb_antenna_ports_eNB>1) { + pdcch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], + pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + s, + high_speed_flag, + frame_parms); + } else { + pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], + pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + s, + high_speed_flag, + frame_parms); + } + + + pdcch_channel_compensation(pdcch_vars[eNB_id]->rxdataF_ext, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + pdcch_vars[eNB_id]->rxdataF_comp, + (aatx>1) ? pdcch_vars[eNB_id]->rho : NULL, + frame_parms, + s, + log2_maxh); // log2_maxh+I0_shift + + +#ifdef DEBUG_PHY + +if (subframe==5) + write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + +#endif + +#ifdef MU_RECEIVER + +if (is_secondary_ue) { + //get MF output for interfering stream + pdcch_channel_compensation(pdcch_vars[eNB_id_i]->rxdataF_ext, + pdcch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdcch_vars[eNB_id_i]->rxdataF_comp, + (aatx>1) ? pdcch_vars[eNB_id_i]->rho : NULL, + frame_parms, + s, + log2_maxh); // log2_maxh+I0_shift +#ifdef DEBUG_PHY +write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); +#endif +pdcch_dual_stream_correlation(frame_parms, + s, + pdcch_vars[eNB_id]->dl_ch_estimates_ext, + pdcch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdcch_vars[eNB_id]->dl_ch_rho_ext, + log2_maxh); +} + +#endif //MU_RECEIVER + + +if (frame_parms->nb_antennas_rx > 1) { +#ifdef MU_RECEIVER + + if (is_secondary_ue) { + pdcch_detection_mrc_i(frame_parms, + pdcch_vars[eNB_id]->rxdataF_comp, + pdcch_vars[eNB_id_i]->rxdataF_comp, + pdcch_vars[eNB_id]->rho, + pdcch_vars[eNB_id]->dl_ch_rho_ext, + s); +#ifdef DEBUG_PHY +write_output("rxF_comp_d.m","rxF_c_d",&pdcch_vars[eNB_id]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); +write_output("rxF_comp_i.m","rxF_c_i",&pdcch_vars[eNB_id_i]->rxdataF_comp[0][s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); +#endif + } else +#endif //MU_RECEIVER + pdcch_detection_mrc(frame_parms, + pdcch_vars[eNB_id]->rxdataF_comp, + s); + +} + +if (mimo_mode == SISO) + pdcch_siso(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s); +else + pdcch_alamouti(frame_parms,pdcch_vars[eNB_id]->rxdataF_comp,s); + + +#ifdef MU_RECEIVER + +if (is_secondary_ue) { + pdcch_qpsk_qpsk_llr(frame_parms, + pdcch_vars[eNB_id]->rxdataF_comp, + pdcch_vars[eNB_id_i]->rxdataF_comp, + pdcch_vars[eNB_id]->dl_ch_rho_ext, + pdcch_vars[eNB_id]->llr16, //subsequent function require 16 bit llr, but output must be 8 bit (actually clipped to 4, because of the Viterbi decoder) + pdcch_vars[eNB_id]->llr, + s); + /* + #ifdef DEBUG_PHY + if (subframe==5) { + write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); + write_output("llr16_seq.m","llr16",&pdcch_vars[eNB_id]->llr16[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); + } + #endif*/ +} else { +#endif //MU_RECEIVER + pdcch_llr(frame_parms, + pdcch_vars[eNB_id]->rxdataF_comp, + (char *)pdcch_vars[eNB_id]->llr, + s); + /*#ifdef DEBUG_PHY + write_output("llr8_seq.m","llr8",&pdcch_vars[eNB_id]->llr[s*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,4); + #endif*/ + +#ifdef MU_RECEIVER +} + +#endif //MU_RECEIVER + + } + + pdcch_demapping(pdcch_vars[eNB_id]->llr, + pdcch_vars[eNB_id]->wbar, frame_parms, n_pdcch_symbols, get_mi(frame_parms,subframe)); pdcch_deinterleaving(frame_parms, - (uint16_t*)lte_ue_pdcch_vars[eNB_id]->e_rx, - lte_ue_pdcch_vars[eNB_id]->wbar, + (uint16_t*)pdcch_vars[eNB_id]->e_rx, + pdcch_vars[eNB_id]->wbar, n_pdcch_symbols, mi); pdcch_unscrambling(frame_parms, subframe, - lte_ue_pdcch_vars[eNB_id]->e_rx, + pdcch_vars[eNB_id]->e_rx, get_nCCE(n_pdcch_symbols,frame_parms,mi)*72); - lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols = n_pdcch_symbols; + pdcch_vars[eNB_id]->num_pdcch_symbols = n_pdcch_symbols; return(0); } @@ -1911,6 +2064,8 @@ void pdcch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, uint8_t reset; uint32_t x1, x2, s=0; + //LOG_D(PHY, "%s(fp, subframe:%d, e, length:%d)\n", __FUNCTION__, subframe, length); + reset = 1; // x1 is set in lte_gold_generic @@ -1960,7 +2115,7 @@ void pdcch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, } } - +/* uint8_t get_num_pdcch_symbols(uint8_t num_dci, DCI_ALLOC_t *dci_alloc, LTE_DL_FRAME_PARMS *frame_parms, @@ -1970,6 +2125,9 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci, uint16_t numCCE = 0; uint8_t i; uint8_t nCCEmin = 0; + uint16_t CCE_max_used_index = 0; + uint16_t firstCCE_max = dci_alloc[0].firstCCE; + uint8_t L = dci_alloc[0].L; // check pdcch duration imposed by PHICH duration (Section 6.9 of 36-211) if (frame_parms->Ncp==1) { // extended prefix @@ -1986,16 +2144,22 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci, for (i=0; i %d\n",i,dci_alloc[i].L); numCCE += (1<<(dci_alloc[i].L)); + + if(firstCCE_max < dci_alloc[i].firstCCE) { + firstCCE_max = dci_alloc[i].firstCCE; + L = dci_alloc[i].L; + } } + CCE_max_used_index = firstCCE_max + (1<N_RB_DL*2)) - if (numCCE <= get_nCCE(1, frame_parms, get_mi(frame_parms, subframe))) + if (CCE_max_used_index < get_nCCE(1, frame_parms, get_mi(frame_parms, subframe))) return(cmax(1,nCCEmin)); - //else if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antennas_tx_eNB==4) ? 4 : 5))) - else if (numCCE <= get_nCCE(2, frame_parms, get_mi(frame_parms, subframe))) + //else if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antenna_ports_eNB==4) ? 4 : 5))) + else if (CCE_max_used_index < get_nCCE(2, frame_parms, get_mi(frame_parms, subframe))) return(cmax(2,nCCEmin)); - //else if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antennas_tx_eNB==4) ? 7 : 8))) - else if (numCCE <= get_nCCE(3, frame_parms, get_mi(frame_parms, subframe))) + //else if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antenna_ports_eNB==4) ? 7 : 8))) + else if (CCE_max_used_index < get_nCCE(3, frame_parms, get_mi(frame_parms, subframe))) return(cmax(3,nCCEmin)); else if (frame_parms->N_RB_DL<=10) { if (frame_parms->Ncp == 0) { // normal CP @@ -2004,25 +2168,29 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci, get_nCCE(2, frame_parms, get_mi(frame_parms, subframe)), get_nCCE(3, frame_parms, get_mi(frame_parms, subframe))); - if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antennas_tx_eNB==4) ? 10 : 11))) + if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antenna_ports_eNB==4) ? 10 : 11))) return(4); } else { // extended CP - if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antennas_tx_eNB==4) ? 9 : 10))) + if ((9*numCCE) <= (frame_parms->N_RB_DL*((frame_parms->nb_antenna_ports_eNB==4) ? 9 : 10))) return(4); } } - LOG_I(PHY," dci.c: get_num_pdcch_symbols subframe %d FATAL, illegal numCCE %d (num_dci %d)\n",subframe,numCCE,num_dci); + + // LOG_I(PHY," dci.c: get_num_pdcch_symbols subframe %d FATAL, illegal numCCE %d (num_dci %d)\n",subframe,numCCE,num_dci); //for (i=0;i, here we set elements as 2 - memset(e, 2, DCI_BITS_MAX); - // // here we interpret NIL as a random QPSK sequence. That makes power estimation easier. - // for (i=0; i=0; L--) { - for (i=0; i=1; L>>=1) { + for (i=0; i=0) { e_ptr = generate_dci0(dci_alloc[i].dci_pdu, @@ -2122,53 +2301,46 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci, } } } - - for (; i= 0) { - e_ptr = generate_dci0(dci_alloc[i].dci_pdu, - e+(72*dci_alloc[i].firstCCE), - dci_alloc[i].dci_length, - dci_alloc[i].L, - dci_alloc[i].rnti); - } - } - } } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DCI0,0); // Scrambling - // printf("pdcch scrambling\n"); +#ifdef DEBUG_DCI_ENCODING + printf("pdcch scrambling\n"); +#endif + //LOG_D(PHY, "num_pdcch_symbols:%d mi:%d nquad:%d\n", num_pdcch_symbols, mi, get_nquad(num_pdcch_symbols, frame_parms, mi)); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCCH_SCRAMBLING,1); pdcch_scrambling(frame_parms, subframe, e, 8*get_nquad(num_pdcch_symbols, frame_parms, mi)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCCH_SCRAMBLING,0); //72*get_nCCE(num_pdcch_symbols,frame_parms,mi)); -#ifdef DEBUG_DCI_ENCODING - LOG_I(PHY," PDCCH Modulation, Msymb %d\n",Msymb); -#endif + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCCH_MODULATION,1); // Now do modulation - if (frame_parms->mode1_flag==1) + if (frame_parms->nb_antenna_ports_eNB==1) gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15); else gain_lin_QPSK = amp/2; e_ptr = e; - if (frame_parms->mode1_flag) { //SISO +#ifdef DEBUG_DCI_ENCODING + printf(" PDCCH Modulation, Msymb %d, Msymb2 %d,gain_lin_QPSK %d\n",Msymb,Msymb2,gain_lin_QPSK); +#endif + + //LOG_D(PHY,"%s() Msymb2:%d\n", __FUNCTION__, Msymb2); + + if (frame_parms->nb_antenna_ports_eNB==1) { //SISO for (i=0; i>2); + printf(" PDCCH Modulation (TX diversity): REG %d\n",i>>2); #endif // first antenna position n -> x0 - ((int16_t*)&y[0][i])[0] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; + ((int16_t*)&y[0][i])[0] = (*e_ptr==2) ? 0 : (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; e_ptr++; - ((int16_t*)&y[0][i])[1] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; + ((int16_t*)&y[0][i])[1] = (*e_ptr==2) ? 0 : (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; e_ptr++; // second antenna position n -> -x1* - ((int16_t*)&y[1][i])[0] = (*e_ptr == 1) ? gain_lin_QPSK : -gain_lin_QPSK; + ((int16_t*)&y[1][i])[0] = (*e_ptr==2) ? 0 : (*e_ptr == 1) ? gain_lin_QPSK : -gain_lin_QPSK; e_ptr++; - ((int16_t*)&y[1][i])[1] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; + ((int16_t*)&y[1][i])[1] = (*e_ptr==2) ? 0 : (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; e_ptr++; // fill in the rest of the ALAMOUTI precoding @@ -2209,22 +2381,38 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci, } } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCCH_MODULATION,0); #ifdef DEBUG_DCI_ENCODING - LOG_I(PHY," PDCCH Interleaving\n"); + printf(" PDCCH Interleaving\n"); #endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCCH_INTERLEAVING,1); // printf("y %p (%p,%p), wbar %p (%p,%p)\n",y,y[0],y[1],wbar,wbar[0],wbar[1]); // This is the interleaving procedure defined in 36-211, first part of Section 6.8.5 pdcch_interleaving(frame_parms,&y[0],&wbar[0],num_pdcch_symbols,mi); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCCH_INTERLEAVING,0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCCH_TX,1); mprime=0; nsymb = (frame_parms->Ncp==0) ? 14:12; re_offset = frame_parms->first_carrier_offset; // This is the REG allocation algorithm from 36-211, second part of Section 6.8.5 // printf("DCI (SF %d) : txdataF %p (0 %p)\n",subframe,&txdataF[0][512*14*subframe],&txdataF[0][0]); +#ifdef DEBUG_DCI_ENCODING + printf("kprime loop - N_RB_DL:%d lprime:num_pdcch_symbols:%d Ncp:%d pcfich:%02x,%02x,%02x,%02x ofdm_symbol_size:%d first_carrier_offset:%d nb_antenna_ports_eNB:%d\n", + frame_parms->N_RB_DL, num_pdcch_symbols,frame_parms->Ncp, + frame_parms->pcfich_reg[0], + frame_parms->pcfich_reg[1], + frame_parms->pcfich_reg[2], + frame_parms->pcfich_reg[3], + frame_parms->ofdm_symbol_size, + frame_parms->first_carrier_offset, + frame_parms->nb_antenna_ports_eNB + ); +#endif for (kprime=0; kprimeN_RB_DL*12; kprime++) { for (lprime=0; lprimenb_antennas_tx_eNB == 4))) { + ((lprime==1)&&(frame_parms->nb_antenna_ports_eNB == 4))) { // first symbol, or second symbol+4 TX antennas skip pilots kprime_mod12 = kprime%12; @@ -2258,12 +2446,13 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci, if ((i!=(nushiftmod3))&&(i!=(nushiftmod3+3))) { txdataF[0][tti_offset+i] = wbar[0][mprime]; - if (frame_parms->nb_antennas_tx_eNB > 1) + if (frame_parms->nb_antenna_ports_eNB > 1) txdataF[1][tti_offset+i] = wbar[1][mprime]; #ifdef DEBUG_DCI_ENCODING - LOG_I(PHY," PDCCH mapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset,symbol_offset,re_offset+i,*(short*)&wbar[0][mprime],*(1+(short*)&wbar[0][mprime])); + printf(" PDCCH mapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset,symbol_offset,re_offset+i,*(short*)&wbar[0][mprime],*(1+(short*)&wbar[0][mprime])); #endif + mprime++; } } @@ -2277,7 +2466,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci, for (i=0; i<4; i++) { txdataF[0][tti_offset+i] = wbar[0][mprime]; - if (frame_parms->nb_antennas_tx_eNB > 1) + if (frame_parms->nb_antenna_ports_eNB > 1) txdataF[1][tti_offset+i] = wbar[1][mprime]; #ifdef DEBUG_DCI_ENCODING @@ -2288,39 +2477,39 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci, } else { txdataF[0][tti_offset+0] = wbar[0][mprime]; - if (frame_parms->nb_antennas_tx_eNB > 1) + if (frame_parms->nb_antenna_ports_eNB > 1) txdataF[1][tti_offset+0] = wbar[1][mprime]; #ifdef DEBUG_DCI_ENCODING - LOG_I(PHY," PDCCH mapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset,symbol_offset,re_offset,*(short*)&wbar[0][mprime],*(1+(short*)&wbar[0][mprime])); + printf(" PDCCH mapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset,symbol_offset,re_offset,*(short*)&wbar[0][mprime],*(1+(short*)&wbar[0][mprime])); #endif mprime++; txdataF[0][tti_offset+1] = wbar[0][mprime]; - if (frame_parms->nb_antennas_tx_eNB > 1) + if (frame_parms->nb_antenna_ports_eNB > 1) txdataF[1][tti_offset+1] = wbar[1][mprime]; #ifdef DEBUG_DCI_ENCODING - LOG_I(PHY," PDCCH mapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset,symbol_offset,re_offset+1,*(short*)&wbar[0][mprime],*(1+(short*)&wbar[0][mprime])); + printf("PDCCH mapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset,symbol_offset,re_offset+1,*(short*)&wbar[0][mprime],*(1+(short*)&wbar[0][mprime])); #endif mprime++; txdataF[0][tti_offset-frame_parms->ofdm_symbol_size+3] = wbar[0][mprime]; - if (frame_parms->nb_antennas_tx_eNB > 1) + if (frame_parms->nb_antenna_ports_eNB > 1) txdataF[1][tti_offset-frame_parms->ofdm_symbol_size+3] = wbar[1][mprime]; #ifdef DEBUG_DCI_ENCODING - LOG_I(PHY," PDCCH mapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset,symbol_offset,re_offset-frame_parms->ofdm_symbol_size+3,*(short*)&wbar[0][mprime], + printf(" PDCCH mapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset,symbol_offset,re_offset-frame_parms->ofdm_symbol_size+3,*(short*)&wbar[0][mprime], *(1+(short*)&wbar[0][mprime])); #endif mprime++; txdataF[0][tti_offset-frame_parms->ofdm_symbol_size+4] = wbar[0][mprime]; - if (frame_parms->nb_antennas_tx_eNB > 1) + if (frame_parms->nb_antenna_ports_eNB > 1) txdataF[1][tti_offset-frame_parms->ofdm_symbol_size+4] = wbar[1][mprime]; #ifdef DEBUG_DCI_ENCODING - LOG_I(PHY," PDCCH mapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset,symbol_offset,re_offset-frame_parms->ofdm_symbol_size+4,*(short*)&wbar[0][mprime], + printf(" PDCCH mapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset,symbol_offset,re_offset-frame_parms->ofdm_symbol_size+4,*(short*)&wbar[0][mprime], *(1+(short*)&wbar[0][mprime])); #endif mprime++; @@ -2340,87 +2529,11 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci, if (re_offset == (frame_parms->ofdm_symbol_size)) re_offset = 1; } // kprime loop + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCCH_TX,0); return(num_pdcch_symbols); } -#ifdef PHY_ABSTRACTION -uint8_t generate_dci_top_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t num_ue_spec_dci, - uint8_t num_common_dci, - DCI_ALLOC_t *dci_alloc, - uint8_t subframe) -{ - int n_dci, n_dci_dl; - uint8_t ue_id; - LTE_eNB_DLSCH_t *dlsch_eNB; - uint8_t num_pdcch_symbols = get_num_pdcch_symbols(num_ue_spec_dci+num_common_dci, - dci_alloc, - &phy_vars_eNB->lte_frame_parms, - subframe); - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].cntl.cfi=num_pdcch_symbols; - - memcpy(phy_vars_eNB->dci_alloc[subframe&1],dci_alloc,sizeof(DCI_ALLOC_t)*(num_ue_spec_dci+num_common_dci)); - phy_vars_eNB->num_ue_spec_dci[subframe&1]=num_ue_spec_dci; - phy_vars_eNB->num_common_dci[subframe&1]=num_common_dci; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_ue_spec_dci = num_ue_spec_dci; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_common_dci = num_common_dci; - - LOG_D(PHY,"[eNB %d][DCI][EMUL] CC id %d: num spec dci %d num comm dci %d num PMCH %d \n", - phy_vars_eNB->Mod_id, phy_vars_eNB->CC_id, num_ue_spec_dci,num_common_dci, - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_pmch); - - if (eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].cntl.pmch_flag == 1 ) - n_dci_dl = eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_pmch; - else - n_dci_dl = 0; - - for (n_dci =0 ; - n_dci < (eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_ue_spec_dci+ eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_common_dci); - n_dci++) { - - if (dci_alloc[n_dci].format > 0) { // exclude the uplink dci - - if (dci_alloc[n_dci].rnti == SI_RNTI) { - dlsch_eNB = PHY_vars_eNB_g[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]->dlsch_eNB_SI; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].dlsch_type[n_dci_dl] = 0;//SI; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[n_dci_dl] = 0; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[n_dci_dl] = dlsch_eNB->harq_processes[0]->TBS>>3; - LOG_D(PHY,"[DCI][EMUL]SI tbs is %d and dci index %d harq pid is %d \n",eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[n_dci_dl],n_dci_dl, - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[n_dci_dl]); - } else if (dci_alloc[n_dci_dl].ra_flag == 1) { - dlsch_eNB = PHY_vars_eNB_g[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]->dlsch_eNB_ra; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].dlsch_type[n_dci_dl] = 1;//RA; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[n_dci_dl] = 0; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[n_dci_dl] = dlsch_eNB->harq_processes[0]->TBS>>3; - LOG_D(PHY,"[DCI][EMUL] RA tbs is %d and dci index %d harq pid is %d \n",eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[n_dci_dl],n_dci_dl, - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[n_dci_dl]); - } else { - ue_id = find_ue(dci_alloc[n_dci_dl].rnti,PHY_vars_eNB_g[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]); - DevAssert( ue_id != (uint8_t)-1 ); - dlsch_eNB = PHY_vars_eNB_g[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]->dlsch_eNB[ue_id][0]; - - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].dlsch_type[n_dci_dl] = 2;//TB0; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[n_dci_dl] = dlsch_eNB->current_harq_pid; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].ue_id[n_dci_dl] = ue_id; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[n_dci_dl] = dlsch_eNB->harq_processes[dlsch_eNB->current_harq_pid]->TBS>>3; - LOG_D(PHY,"[DCI][EMUL] TB1 tbs is %d and dci index %d harq pid is %d \n",eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[n_dci_dl],n_dci_dl, - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[n_dci_dl]); - // check for TB1 later - - } - } - - n_dci_dl++; - } - - memcpy((void *)&eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].dci_alloc, - (void *)dci_alloc, - n_dci*sizeof(DCI_ALLOC_t)); - - return(num_pdcch_symbols); -} -#endif void dci_decoding(uint8_t DCI_LENGTH, @@ -2440,10 +2553,8 @@ void dci_decoding(uint8_t DCI_LENGTH, int32_t i; #endif - if (aggregation_level>3) { - LOG_I(PHY," dci.c: dci_decoding FATAL, illegal aggregation_level %d\n",aggregation_level); - return; - } + AssertFatal(aggregation_level<4, + "dci_decoding FATAL, illegal aggregation_level %d\n",aggregation_level); coded_bits = 72 * (1<lte_frame_parms, - get_mi(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,subframe))); + &RC.eNB[Mod_id][CC_id]->frame_parms, + get_mi(&RC.eNB[Mod_id][CC_id]->frame_parms,subframe))); } @@ -2628,7 +2739,8 @@ int get_nCCE_offset_l1(int *CCE_table, search_space_free = 1; for (l=0; l= nCCE || CCE_table[cce] == 1) { search_space_free = 0; break; } @@ -2647,17 +2759,21 @@ int get_nCCE_offset_l1(int *CCE_table, } -void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, +void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars, int do_common, + dci_detect_mode_t mode, uint8_t subframe, DCI_ALLOC_t *dci_alloc, int16_t eNB_id, + uint8_t current_thread_id, LTE_DL_FRAME_PARMS *frame_parms, uint8_t mi, uint16_t si_rnti, uint16_t ra_rnti, + uint16_t p_rnti, uint8_t L, uint8_t format_si, + uint8_t format_p, uint8_t format_ra, uint8_t format_c, uint8_t sizeof_bits, @@ -2676,13 +2792,22 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, unsigned int Yk,nb_candidates = 0,i,m; unsigned int CCEmap_cand; - nCCE = get_nCCE(lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,frame_parms,mi); + nCCE = get_nCCE(pdcch_vars[eNB_id]->num_pdcch_symbols,frame_parms,mi); - if (nCCE > get_nCCE(3,frame_parms,1)) + if (nCCE > get_nCCE(3,frame_parms,1)) { + LOG_D(PHY,"skip DCI decoding: nCCE=%d > get_nCCE(3,frame_parms,1)=%d\n", nCCE, get_nCCE(3,frame_parms,1)); return; + } - if (nCCEcrnti; + Yk = (unsigned int)pdcch_vars[eNB_id]->crnti; for (i=0; i<=subframe; i++) Yk = (Yk*39827)%65537; @@ -2733,9 +2858,8 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, else if (CCEind<96) CCEmap = CCEmap2; else { - LOG_E(PHY,"Illegal CCEind %d (Yk %d, m %d, nCCE %d, L2 %d\n",CCEind,Yk,m,nCCE,L2); - mac_xface->macphy_exit("Illegal CCEind\n"); - return; // not reached + AssertFatal(1==0, + "Illegal CCEind %d (Yk %d, m %d, nCCE %d, L2 %d\n",CCEind,Yk,m,nCCE,L2); } switch (L2) { @@ -2756,9 +2880,8 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, break; default: - LOG_E( PHY, "Illegal L2 value %d\n", L2 ); - mac_xface->macphy_exit( "Illegal L2\n" ); - return; // not reached + AssertFatal(1==0, + "Illegal L2 value %d\n", L2 ); } CCEmap_cand = (*CCEmap)&CCEmap_mask; @@ -2766,92 +2889,101 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, // CCE is not allocated yet if (CCEmap_cand == 0) { -#ifdef DEBUG_DCI_DECODING if (do_common == 1) - LOG_I(PHY,"[DCI search - common] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask); + LOG_D(PHY,"[DCI search nPdcch %d - common] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n", + pdcch_vars[eNB_id]->num_pdcch_symbols,m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask); else - LOG_I(PHY,"[DCI search - ue spec] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask); + LOG_D(PHY,"[DCI search nPdcch %d - ue spec] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x) format %d\n", + pdcch_vars[eNB_id]->num_pdcch_symbols,m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask,format_c); -#endif - - dci_decoding(sizeof_bits, + dci_decoding(sizeof_bits, L, - <e_ue_pdcch_vars[eNB_id]->e_rx[CCEind*72], - dci_decoded_output); + &pdcch_vars[eNB_id]->e_rx[CCEind*72], + &dci_decoded_output[current_thread_id][0]); /* for (i=0;i<3+(sizeof_bits>>3);i++) printf("dci_decoded_output[%d] => %x\n",i,dci_decoded_output[i]); */ - crc = (crc16(dci_decoded_output,sizeof_bits)>>16) ^ extract_crc(dci_decoded_output,sizeof_bits); + + crc = (crc16(&dci_decoded_output[current_thread_id][0],sizeof_bits)>>16) ^ extract_crc(&dci_decoded_output[current_thread_id][0],sizeof_bits); #ifdef DEBUG_DCI_DECODING printf("crc =>%x\n",crc); #endif if (((L>1) && ((crc == si_rnti)|| + (crc == p_rnti)|| (crc == ra_rnti)))|| - (crc == lte_ue_pdcch_vars[eNB_id]->crnti)) { + (crc == pdcch_vars[eNB_id]->crnti)) { dci_alloc[*dci_cnt].dci_length = sizeof_bits; dci_alloc[*dci_cnt].rnti = crc; dci_alloc[*dci_cnt].L = L; dci_alloc[*dci_cnt].firstCCE = CCEind; + //printf("DCI FOUND !!! crc =>%x, sizeof_bits %d, sizeof_bytes %d \n",crc, sizeof_bits, sizeof_bytes); if (sizeof_bytes<=4) { - dci_alloc[*dci_cnt].dci_pdu[3] = dci_decoded_output[0]; - dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[1]; - dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[2]; - dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[3]; + dci_alloc[*dci_cnt].dci_pdu[3] = dci_decoded_output[current_thread_id][0]; + dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[current_thread_id][1]; + dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[current_thread_id][2]; + dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[current_thread_id][3]; #ifdef DEBUG_DCI_DECODING - printf("DCI => %x,%x,%x,%x\n",dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3]); + printf("DCI => %x,%x,%x,%x\n",dci_decoded_output[current_thread_id][0], + dci_decoded_output[current_thread_id][1], + dci_decoded_output[current_thread_id][2], + dci_decoded_output[current_thread_id][3]); #endif } else { - dci_alloc[*dci_cnt].dci_pdu[7] = dci_decoded_output[0]; - dci_alloc[*dci_cnt].dci_pdu[6] = dci_decoded_output[1]; - dci_alloc[*dci_cnt].dci_pdu[5] = dci_decoded_output[2]; - dci_alloc[*dci_cnt].dci_pdu[4] = dci_decoded_output[3]; - dci_alloc[*dci_cnt].dci_pdu[3] = dci_decoded_output[4]; - dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[5]; - dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[6]; - dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[7]; + dci_alloc[*dci_cnt].dci_pdu[7] = dci_decoded_output[current_thread_id][0]; + dci_alloc[*dci_cnt].dci_pdu[6] = dci_decoded_output[current_thread_id][1]; + dci_alloc[*dci_cnt].dci_pdu[5] = dci_decoded_output[current_thread_id][2]; + dci_alloc[*dci_cnt].dci_pdu[4] = dci_decoded_output[current_thread_id][3]; + dci_alloc[*dci_cnt].dci_pdu[3] = dci_decoded_output[current_thread_id][4]; + dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[current_thread_id][5]; + dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[current_thread_id][6]; + dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[current_thread_id][7]; #ifdef DEBUG_DCI_DECODING printf("DCI => %x,%x,%x,%x,%x,%x,%x,%x\n", - dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3], - dci_decoded_output[4],dci_decoded_output[5],dci_decoded_output[6],dci_decoded_output[7]); + dci_decoded_output[current_thread_id][0],dci_decoded_output[current_thread_id][1],dci_decoded_output[current_thread_id][2],dci_decoded_output[current_thread_id][3], + dci_decoded_output[current_thread_id][4],dci_decoded_output[current_thread_id][5],dci_decoded_output[current_thread_id][6],dci_decoded_output[current_thread_id][7]); #endif } if (crc==si_rnti) { dci_alloc[*dci_cnt].format = format_si; *dci_cnt = *dci_cnt+1; + } else if (crc==p_rnti) { + dci_alloc[*dci_cnt].format = format_p; + *dci_cnt = *dci_cnt+1; } else if (crc==ra_rnti) { dci_alloc[*dci_cnt].format = format_ra; // store first nCCE of group for PUCCH transmission of ACK/NAK - lte_ue_pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; + pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; *dci_cnt = *dci_cnt+1; - } else if (crc==lte_ue_pdcch_vars[eNB_id]->crnti) { + } else if (crc==pdcch_vars[eNB_id]->crnti) { - if ((format_c == format0)&&((dci_decoded_output[0]&0x80)==0)) {// check if pdu is format 0 or 1A + if ((mode&UL_DCI)&&(format_c == format0)&&((dci_decoded_output[current_thread_id][0]&0x80)==0)) {// check if pdu is format 0 or 1A if (*format0_found == 0) { dci_alloc[*dci_cnt].format = format0; *format0_found = 1; *dci_cnt = *dci_cnt+1; - lte_ue_pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; + pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; } } else if (format_c == format0) { // this is a format 1A DCI dci_alloc[*dci_cnt].format = format1A; *dci_cnt = *dci_cnt+1; - lte_ue_pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; + pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; } else { // store first nCCE of group for PUCCH transmission of ACK/NAK if (*format_c_found == 0) { dci_alloc[*dci_cnt].format = format_c; *dci_cnt = *dci_cnt+1; *format_c_found = 1; - lte_ue_pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; + pdcch_vars[eNB_id]->nCCE[subframe]=CCEind; } } } + //LOG_I(PHY,"DCI decoding CRNTI [format: %d, nCCE[subframe: %d]: %d ], AggregationLevel %d \n",format_c, subframe, pdcch_vars[eNB_id]->nCCE[subframe],L2); // memcpy(&dci_alloc[*dci_cnt].dci_pdu[0],dci_decoded_output,sizeof_bytes); @@ -2862,33 +2994,214 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars, break; case 2: - *CCEmap|=(0x03<<(CCEind&0x1f)); + *CCEmap|=(1<<(CCEind&0x1f)); break; case 4: - *CCEmap|=(0x0f<<(CCEind&0x1f)); + *CCEmap|=(1<<(CCEind&0x1f)); break; case 8: - *CCEmap|=(0xff<<(CCEind&0x1f)); + *CCEmap|=(1<<(CCEind&0x1f)); break; } #ifdef DEBUG_DCI_DECODING - LOG_I(PHY,"[DCI search] Found DCI %d rnti %x Aggregation %d length %d format %s in CCE %d (CCEmap %x)\n", - *dci_cnt,crc,1<crnti) - // return; + return; } // rnti match } // CCEmap_cand == 0 +/* + if ( agregationLevel != 0xFF && + (format_c == format0 && m==0 && si_rnti != SI_RNTI)) + { + //Only valid for OAI : Save some processing time when looking for DCI format0. From the log we see the DCI only on candidate 0. + return; + } +*/ } // candidate loop } -uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, +uint16_t dci_CRNTI_decoding_procedure(PHY_VARS_UE *ue, + DCI_ALLOC_t *dci_alloc, + uint8_t DCIFormat, + uint8_t agregationLevel, + int16_t eNB_id, + uint8_t subframe) +{ + + uint8_t dci_cnt=0,old_dci_cnt=0; + uint32_t CCEmap0=0,CCEmap1=0,CCEmap2=0; + LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[subframe]]; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + uint8_t mi = get_mi(&ue->frame_parms,subframe); + uint16_t ra_rnti=99; + uint8_t format0_found=0,format_c_found=0; + uint8_t tmode = ue->transmission_mode[eNB_id]; + uint8_t frame_type = frame_parms->frame_type; + uint8_t format0_size_bits=0,format0_size_bytes=0; + uint8_t format1_size_bits=0,format1_size_bytes=0; + dci_detect_mode_t mode = dci_detect_mode_select(&ue->frame_parms,subframe); + + switch (frame_parms->N_RB_DL) { + case 6: + if (frame_type == TDD) { + format0_size_bits = sizeof_DCI0_1_5MHz_TDD_1_6_t; + format0_size_bytes = sizeof(DCI0_1_5MHz_TDD_1_6_t); + format1_size_bits = sizeof_DCI1_1_5MHz_TDD_t; + format1_size_bytes = sizeof(DCI1_1_5MHz_TDD_t); + + } else { + format0_size_bits = sizeof_DCI0_1_5MHz_FDD_t; + format0_size_bytes = sizeof(DCI0_1_5MHz_FDD_t); + format1_size_bits = sizeof_DCI1_1_5MHz_FDD_t; + format1_size_bytes = sizeof(DCI1_1_5MHz_FDD_t); + } + + break; + + case 25: + default: + if (frame_type == TDD) { + format0_size_bits = sizeof_DCI0_5MHz_TDD_1_6_t; + format0_size_bytes = sizeof(DCI0_5MHz_TDD_1_6_t); + format1_size_bits = sizeof_DCI1_5MHz_TDD_t; + format1_size_bytes = sizeof(DCI1_5MHz_TDD_t); + } else { + format0_size_bits = sizeof_DCI0_5MHz_FDD_t; + format0_size_bytes = sizeof(DCI0_5MHz_FDD_t); + format1_size_bits = sizeof_DCI1_5MHz_FDD_t; + format1_size_bytes = sizeof(DCI1_5MHz_FDD_t); + } + + break; + + case 50: + if (frame_type == TDD) { + format0_size_bits = sizeof_DCI0_10MHz_TDD_1_6_t; + format0_size_bytes = sizeof(DCI0_10MHz_TDD_1_6_t); + format1_size_bits = sizeof_DCI1_10MHz_TDD_t; + format1_size_bytes = sizeof(DCI1_10MHz_TDD_t); + + } else { + format0_size_bits = sizeof_DCI0_10MHz_FDD_t; + format0_size_bytes = sizeof(DCI0_10MHz_FDD_t); + format1_size_bits = sizeof_DCI1_10MHz_FDD_t; + format1_size_bytes = sizeof(DCI1_10MHz_FDD_t); + } + + break; + + case 100: + if (frame_type == TDD) { + format0_size_bits = sizeof_DCI0_20MHz_TDD_1_6_t; + format0_size_bytes = sizeof(DCI0_20MHz_TDD_1_6_t); + format1_size_bits = sizeof_DCI1_20MHz_TDD_t; + format1_size_bytes = sizeof(DCI1_20MHz_TDD_t); + } else { + format0_size_bits = sizeof_DCI0_20MHz_FDD_t; + format0_size_bytes = sizeof(DCI0_20MHz_FDD_t); + format1_size_bits = sizeof_DCI1_20MHz_FDD_t; + format1_size_bytes = sizeof(DCI1_20MHz_FDD_t); + } + + break; + } + + if (ue->prach_resources[eNB_id]) + ra_rnti = ue->prach_resources[eNB_id]->ra_RNTI; + + // Now check UE_SPEC format0/1A ue_spec search spaces at aggregation 8 + dci_decoding_procedure0(pdcch_vars,0,mode, + subframe, + dci_alloc, + eNB_id, + ue->current_thread_id[subframe], + frame_parms, + mi, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), + ra_rnti, + P_RNTI, + agregationLevel, + format1A, + format1A, + format1A, + format0, + format0_size_bits, + format0_size_bytes, + &dci_cnt, + &format0_found, + &format_c_found, + &CCEmap0, + &CCEmap1, + &CCEmap2); + + if ((CCEmap0==0xffff)|| + ((format0_found==1)&&(format_c_found==1))) + return(dci_cnt); + + if (DCIFormat == 1) + { + if ((tmode < 3) || (tmode == 7)) { + //printf("Crnti decoding frame param agregation %d DCI %d \n",agregationLevel,DCIFormat); + + // Now check UE_SPEC format 1 search spaces at aggregation 1 + + //printf("[DCI search] Format 1/1A aggregation 1\n"); + + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode,subframe, + dci_alloc, + eNB_id, + ue->current_thread_id[subframe], + frame_parms, + mi, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), + ra_rnti, + P_RNTI, + 0, + format1A, + format1A, + format1A, + format1, + format1_size_bits, + format1_size_bytes, + &dci_cnt, + &format0_found, + &format_c_found, + &CCEmap0, + &CCEmap1, + &CCEmap2); + + if ((CCEmap0==0xffff) || + (format_c_found==1)) + return(dci_cnt); + + if (dci_cnt>old_dci_cnt) + return(dci_cnt); + + //printf("Crnti 1 decoding frame param agregation %d DCI %d \n",agregationLevel,DCIFormat); + + } + else + { + AssertFatal(0,"Other Transmission mode not yet coded\n"); + } + } + else + { + AssertFatal(0,"DCI format %d not yet implemented \n",DCIFormat); + } + + return(dci_cnt); + +} + +uint16_t dci_decoding_procedure(PHY_VARS_UE *ue, DCI_ALLOC_t *dci_alloc, int do_common, int16_t eNB_id, @@ -2897,12 +3210,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, uint8_t dci_cnt=0,old_dci_cnt=0; uint32_t CCEmap0=0,CCEmap1=0,CCEmap2=0; - LTE_UE_PDCCH **lte_ue_pdcch_vars = phy_vars_ue->lte_ue_pdcch_vars; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - uint8_t mi = get_mi(&phy_vars_ue->lte_frame_parms,subframe); + LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars[ue->current_thread_id[subframe]]; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + uint8_t mi = get_mi(&ue->frame_parms,subframe); uint16_t ra_rnti=99; uint8_t format0_found=0,format_c_found=0; - uint8_t tmode = phy_vars_ue->transmission_mode[eNB_id]; + uint8_t tmode = ue->transmission_mode[eNB_id]; uint8_t frame_type = frame_parms->frame_type; uint8_t format1A_size_bits=0,format1A_size_bytes=0; uint8_t format1C_size_bits=0,format1C_size_bytes=0; @@ -2910,6 +3223,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, uint8_t format1_size_bits=0,format1_size_bytes=0; uint8_t format2_size_bits=0,format2_size_bytes=0; uint8_t format2A_size_bits=0,format2A_size_bytes=0; + dci_detect_mode_t mode = dci_detect_mode_select(&ue->frame_parms,subframe); switch (frame_parms->N_RB_DL) { case 6: @@ -2923,12 +3237,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format1_size_bits = sizeof_DCI1_1_5MHz_TDD_t; format1_size_bytes = sizeof(DCI1_1_5MHz_TDD_t); - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { format2_size_bits = sizeof_DCI2_1_5MHz_2A_TDD_t; format2_size_bytes = sizeof(DCI2_1_5MHz_2A_TDD_t); format2A_size_bits = sizeof_DCI2A_1_5MHz_2A_TDD_t; format2A_size_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t); - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { format2_size_bits = sizeof_DCI2_1_5MHz_4A_TDD_t; format2_size_bytes = sizeof(DCI2_1_5MHz_4A_TDD_t); format2A_size_bits = sizeof_DCI2A_1_5MHz_4A_TDD_t; @@ -2944,12 +3258,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format1_size_bits = sizeof_DCI1_1_5MHz_FDD_t; format1_size_bytes = sizeof(DCI1_1_5MHz_FDD_t); - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { format2_size_bits = sizeof_DCI2_1_5MHz_2A_FDD_t; format2_size_bytes = sizeof(DCI2_1_5MHz_2A_FDD_t); format2A_size_bits = sizeof_DCI2A_1_5MHz_2A_FDD_t; format2A_size_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t); - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { format2_size_bits = sizeof_DCI2_1_5MHz_4A_FDD_t; format2_size_bytes = sizeof(DCI2_1_5MHz_4A_FDD_t); format2A_size_bits = sizeof_DCI2A_1_5MHz_4A_FDD_t; @@ -2971,12 +3285,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format1_size_bits = sizeof_DCI1_5MHz_TDD_t; format1_size_bytes = sizeof(DCI1_5MHz_TDD_t); - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { format2_size_bits = sizeof_DCI2_5MHz_2A_TDD_t; format2_size_bytes = sizeof(DCI2_5MHz_2A_TDD_t); format2A_size_bits = sizeof_DCI2A_5MHz_2A_TDD_t; format2A_size_bytes = sizeof(DCI2A_5MHz_2A_TDD_t); - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { format2_size_bits = sizeof_DCI2_5MHz_4A_TDD_t; format2_size_bytes = sizeof(DCI2_5MHz_4A_TDD_t); format2A_size_bits = sizeof_DCI2A_5MHz_4A_TDD_t; @@ -2992,12 +3306,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format1_size_bits = sizeof_DCI1_5MHz_FDD_t; format1_size_bytes = sizeof(DCI1_5MHz_FDD_t); - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { format2_size_bits = sizeof_DCI2_5MHz_2A_FDD_t; format2_size_bytes = sizeof(DCI2_5MHz_2A_FDD_t); format2A_size_bits = sizeof_DCI2A_5MHz_2A_FDD_t; format2A_size_bytes = sizeof(DCI2A_5MHz_2A_FDD_t); - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { format2_size_bits = sizeof_DCI2_5MHz_4A_FDD_t; format2_size_bytes = sizeof(DCI2_5MHz_4A_FDD_t); format2A_size_bits = sizeof_DCI2A_5MHz_4A_FDD_t; @@ -3018,12 +3332,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format1_size_bits = sizeof_DCI1_10MHz_TDD_t; format1_size_bytes = sizeof(DCI1_10MHz_TDD_t); - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { format2_size_bits = sizeof_DCI2_10MHz_2A_TDD_t; format2_size_bytes = sizeof(DCI2_10MHz_2A_TDD_t); format2A_size_bits = sizeof_DCI2A_10MHz_2A_TDD_t; format2A_size_bytes = sizeof(DCI2A_10MHz_2A_TDD_t); - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { format2_size_bits = sizeof_DCI2_10MHz_4A_TDD_t; format2_size_bytes = sizeof(DCI2_10MHz_4A_TDD_t); format2A_size_bits = sizeof_DCI2A_10MHz_4A_TDD_t; @@ -3039,12 +3353,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format1_size_bits = sizeof_DCI1_10MHz_FDD_t; format1_size_bytes = sizeof(DCI1_10MHz_FDD_t); - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { format2_size_bits = sizeof_DCI2_10MHz_2A_FDD_t; format2_size_bytes = sizeof(DCI2_10MHz_2A_FDD_t); format2A_size_bits = sizeof_DCI2A_10MHz_2A_FDD_t; format2A_size_bytes = sizeof(DCI2A_10MHz_2A_FDD_t); - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { format2_size_bits = sizeof_DCI2_10MHz_4A_FDD_t; format2_size_bytes = sizeof(DCI2_10MHz_4A_FDD_t); format2A_size_bits = sizeof_DCI2A_10MHz_4A_FDD_t; @@ -3065,12 +3379,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format1_size_bits = sizeof_DCI1_20MHz_TDD_t; format1_size_bytes = sizeof(DCI1_20MHz_TDD_t); - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { format2_size_bits = sizeof_DCI2_20MHz_2A_TDD_t; format2_size_bytes = sizeof(DCI2_20MHz_2A_TDD_t); format2A_size_bits = sizeof_DCI2A_20MHz_2A_TDD_t; format2A_size_bytes = sizeof(DCI2A_20MHz_2A_TDD_t); - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { format2_size_bits = sizeof_DCI2_20MHz_4A_TDD_t; format2_size_bytes = sizeof(DCI2_20MHz_4A_TDD_t); format2A_size_bits = sizeof_DCI2A_20MHz_4A_TDD_t; @@ -3086,12 +3400,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, format1_size_bits = sizeof_DCI1_20MHz_FDD_t; format1_size_bytes = sizeof(DCI1_20MHz_FDD_t); - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { format2_size_bits = sizeof_DCI2_20MHz_2A_FDD_t; format2_size_bytes = sizeof(DCI2_20MHz_2A_FDD_t); format2A_size_bits = sizeof_DCI2A_20MHz_2A_FDD_t; format2A_size_bytes = sizeof(DCI2A_20MHz_2A_FDD_t); - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { format2_size_bits = sizeof_DCI2_20MHz_4A_FDD_t; format2_size_bytes = sizeof(DCI2_20MHz_4A_FDD_t); format2A_size_bits = sizeof_DCI2A_20MHz_4A_FDD_t; @@ -3107,21 +3421,24 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, printf("[DCI search] doing common search/format0 aggregation 4\n"); #endif - if (phy_vars_ue->prach_resources[eNB_id]) - ra_rnti = phy_vars_ue->prach_resources[eNB_id]->ra_RNTI; + if (ue->prach_resources[eNB_id]) + ra_rnti = ue->prach_resources[eNB_id]->ra_RNTI; - // First check common search spaces at aggregation 4 (SI_RNTI and RA_RNTI format 0/1A), + // First check common search spaces at aggregation 4 (SI_RNTI, P_RNTI and RA_RNTI format 0/1A), // and UE_SPEC format0 (PUSCH) too while we're at it - dci_decoding_procedure0(lte_ue_pdcch_vars,1,subframe, + dci_decoding_procedure0(pdcch_vars,1,mode,subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0) , ra_rnti, + P_RNTI, 2, format1A, format1A, + format1A, format0, format1A_size_bits, format1A_size_bytes, @@ -3136,19 +3453,22 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, ((format0_found==1)&&(format_c_found==1))) return(dci_cnt); - // Now check common search spaces at aggregation 4 (SI_RNTI and RA_RNTI and C-RNTI format 1C), + // Now check common search spaces at aggregation 4 (SI_RNTI,P_RNTI and RA_RNTI and C-RNTI format 1C), // and UE_SPEC format0 (PUSCH) too while we're at it - dci_decoding_procedure0(lte_ue_pdcch_vars,1,subframe, + dci_decoding_procedure0(pdcch_vars,1,mode,subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 2, format1C, format1C, format1C, + format1C, format1C_size_bits, format1C_size_bytes, &dci_cnt, @@ -3162,22 +3482,25 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, ((format0_found==1)&&(format_c_found==1))) return(dci_cnt); - // Now check common search spaces at aggregation 8 (SI_RNTI and RA_RNTI format 1A), + // Now check common search spaces at aggregation 8 (SI_RNTI,P_RNTI and RA_RNTI format 1A), // and UE_SPEC format0 (PUSCH) too while we're at it // printf("[DCI search] doing common search/format0 aggregation 3\n"); #ifdef DEBUG_DCI_DECODING printf("[DCI search] doing common search/format0 aggregation 8\n"); #endif - dci_decoding_procedure0(lte_ue_pdcch_vars,1,subframe, + dci_decoding_procedure0(pdcch_vars,1,mode,subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), + P_RNTI, ra_rnti, 3, format1A, format1A, + format1A, format0, format1A_size_bits, format1A_size_bytes, @@ -3194,14 +3517,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, // Now check common search spaces at aggregation 8 (SI_RNTI and RA_RNTI and C-RNTI format 1C), // and UE_SPEC format0 (PUSCH) too while we're at it - dci_decoding_procedure0(lte_ue_pdcch_vars,1,subframe, + dci_decoding_procedure0(pdcch_vars,1,mode,subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, - 3, + P_RNTI, + 3, + format1C, format1C, format1C, format1C, @@ -3217,23 +3543,26 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, } - if (phy_vars_ue->UE_mode[eNB_id] <= PRACH) + if (ue->UE_mode[eNB_id] <= PRACH) return(dci_cnt); - if (phy_vars_ue->prach_resources[eNB_id]) - ra_rnti = phy_vars_ue->prach_resources[eNB_id]->ra_RNTI; + if (ue->prach_resources[eNB_id]) + ra_rnti = ue->prach_resources[eNB_id]->ra_RNTI; // Now check UE_SPEC format0/1A ue_spec search spaces at aggregation 8 // printf("[DCI search] Format 0/1A aggregation 8\n"); - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, - 3, + P_RNTI, + 0, + format1A, format1A, format1A, format0, @@ -3250,49 +3579,59 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, ((format0_found==1)&&(format_c_found==1))) return(dci_cnt); - // printf("[DCI search] Format 0 aggregation 4\n"); + //printf("[DCI search] Format 0 aggregation 1 dci_cnt %d\n",dci_cnt); + + if (dci_cnt == 0) + { // Now check UE_SPEC format 0 search spaces at aggregation 4 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, + 1, + format1A, + format1A, + format1A, + format0, + format0_size_bits, + format0_size_bytes, + &dci_cnt, + &format0_found, + &format_c_found, + &CCEmap0, + &CCEmap1, + &CCEmap2); + + if ((CCEmap0==0xffff)|| + ((format0_found==1)&&(format_c_found==1))) + return(dci_cnt); + + + //printf("[DCI search] Format 0 aggregation 2 dci_cnt %d\n",dci_cnt); + } + + if (dci_cnt == 0) + { + // Now check UE_SPEC format 0 search spaces at aggregation 2 + dci_decoding_procedure0(pdcch_vars,0,mode, + subframe, + dci_alloc, + eNB_id, + ue->current_thread_id[subframe], + frame_parms, + mi, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), + ra_rnti, + P_RNTI, 2, format1A, format1A, - format0, - format0_size_bits, - format0_size_bytes, - &dci_cnt, - &format0_found, - &format_c_found, - &CCEmap0, - &CCEmap1, - &CCEmap2); - - if ((CCEmap0==0xffff)|| - ((format0_found==1)&&(format_c_found==1))) - return(dci_cnt); - - if ((CCEmap0==0xffff)|| - ((format0_found==1)&&(format_c_found==1))) - return(dci_cnt); - - // printf("[DCI search] Format 0 aggregation 2\n"); - // Now check UE_SPEC format 0 search spaces at aggregation 2 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, - subframe, - dci_alloc, - eNB_id, - frame_parms, - mi, - SI_RNTI, - ra_rnti, - 1, - format1A, format1A, format0, format0_size_bits, @@ -3308,17 +3647,24 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, ((format0_found==1)&&(format_c_found==1))) return(dci_cnt); - // printf("[DCI search] Format 0 aggregation 4\n"); + //printf("[DCI search] Format 0 aggregation 4 dci_cnt %d\n",dci_cnt); + } + + if (dci_cnt == 0) + { // Now check UE_SPEC format 0 search spaces at aggregation 1 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, - 0, + P_RNTI, + 3, + format1A, format1A, format1A, format0, @@ -3335,23 +3681,26 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, ((format0_found==1)&&(format_c_found==1))) return(dci_cnt); + //printf("[DCI search] Format 0 aggregation 8 dci_cnt %d\n",dci_cnt); - - + } // These are for CRNTI based on transmission mode - if (tmode < 3) { + if ((tmode < 3) || (tmode == 7)) { // Now check UE_SPEC format 1 search spaces at aggregation 1 old_dci_cnt=dci_cnt; - dci_decoding_procedure0(lte_ue_pdcch_vars,0,subframe, + dci_decoding_procedure0(pdcch_vars,0,mode,subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 0, format1A, format1A, + format1A, format1, format1_size_bits, format1_size_bytes, @@ -3361,6 +3710,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, &CCEmap0, &CCEmap1, &CCEmap2); + //printf("[DCI search] Format 1 aggregation 1 dci_cnt %d\n",dci_cnt); if ((CCEmap0==0xffff) || (format_c_found==1)) @@ -3371,16 +3721,19 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, // Now check UE_SPEC format 1 search spaces at aggregation 2 old_dci_cnt=dci_cnt; - dci_decoding_procedure0(lte_ue_pdcch_vars,0,subframe, + dci_decoding_procedure0(pdcch_vars,0,mode,subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 1, format1A, format1A, + format1A, format1, format1_size_bits, format1_size_bytes, @@ -3390,7 +3743,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, &CCEmap0, &CCEmap1, &CCEmap2); - + //printf("[DCI search] Format 1 aggregation 2 dci_cnt %d\n",dci_cnt); if ((CCEmap0==0xffff)|| (format_c_found==1)) @@ -3401,14 +3754,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, // Now check UE_SPEC format 1 search spaces at aggregation 4 old_dci_cnt=dci_cnt; - dci_decoding_procedure0(lte_ue_pdcch_vars,0,subframe, + dci_decoding_procedure0(pdcch_vars,0,mode,subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, - 2, + P_RNTI, + 2, + format1A, format1A, format1A, format1, @@ -3420,6 +3776,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, &CCEmap0, &CCEmap1, &CCEmap2); + //printf("[DCI search] Format 1 aggregation 4 dci_cnt %d\n",dci_cnt); if ((CCEmap0==0xffff)|| ((format0_found==1)&&(format_c_found==1))) @@ -3431,16 +3788,19 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, //#ifdef ALL_AGGREGATION // Now check UE_SPEC format 1 search spaces at aggregation 8 old_dci_cnt=dci_cnt; - dci_decoding_procedure0(lte_ue_pdcch_vars,0,subframe, + dci_decoding_procedure0(pdcch_vars,0,mode,subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 3, format1A, format1A, + format1A, format1, format1_size_bits, format1_size_bytes, @@ -3450,6 +3810,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, &CCEmap0, &CCEmap1, &CCEmap2); + //printf("[DCI search] Format 1 aggregation 8 dci_cnt %d\n",dci_cnt); if ((CCEmap0==0xffff)|| ((format0_found==1)&&(format_c_found==1))) @@ -3462,18 +3823,23 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, } else if (tmode == 3) { + LOG_D(PHY," Now check UE_SPEC format 2A_2A search aggregation 1 dci length: %d[bits] %d[bytes]\n",format2A_size_bits,format2A_size_bytes); // Now check UE_SPEC format 2A_2A search spaces at aggregation 1 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 0, format1A, format1A, + format1A, format2A, format2A_size_bits, format2A_size_bytes, @@ -3484,25 +3850,32 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, &CCEmap1, &CCEmap2); + LOG_D(PHY," format 2A_2A search CCEmap0 %x, format0_found %d, format_c_found %d \n", CCEmap0, format0_found, format_c_found); if ((CCEmap0==0xffff)|| ((format0_found==1)&&(format_c_found==1))) return(dci_cnt); + LOG_D(PHY," format 2A_2A search dci_cnt %d, old_dci_cn t%d \n", dci_cnt, old_dci_cnt); if (dci_cnt>old_dci_cnt) return(dci_cnt); // Now check UE_SPEC format 2 search spaces at aggregation 2 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + LOG_D(PHY," Now check UE_SPEC format 2A_2A search aggregation 2 dci length: %d[bits] %d[bytes]\n",format2A_size_bits,format2A_size_bytes); + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 1, format1A, format1A, + format1A, format2A, format2A_size_bits, format2A_size_bytes, @@ -3517,21 +3890,27 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, ((format0_found==1)&&(format_c_found==1))) return(dci_cnt); + LOG_D(PHY," format 2A_2A search dci_cnt %d, old_dci_cn t%d \n", dci_cnt, old_dci_cnt); if (dci_cnt>old_dci_cnt) return(dci_cnt); // Now check UE_SPEC format 2_2A search spaces at aggregation 4 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + LOG_D(PHY," Now check UE_SPEC format 2_2A search spaces at aggregation 4 \n"); + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 2, format1A, format1A, + format1A, format2A, format2A_size_bits, format2A_size_bytes, @@ -3546,22 +3925,28 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, ((format0_found==1)&&(format_c_found==1))) return(dci_cnt); + LOG_D(PHY," format 2A_2A search dci_cnt %d, old_dci_cn t%d \n", dci_cnt, old_dci_cnt); if (dci_cnt>old_dci_cnt) return(dci_cnt); //#ifdef ALL_AGGREGATION // Now check UE_SPEC format 2_2A search spaces at aggregation 8 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + LOG_D(PHY," Now check UE_SPEC format 2_2A search spaces at aggregation 8 dci length: %d[bits] %d[bytes]\n",format2A_size_bits,format2A_size_bytes); + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 3, format1A, format1A, + format1A, format2A, format2A_size_bits, format2A_size_bytes, @@ -3572,20 +3957,31 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, &CCEmap1, &CCEmap2); //#endif + if ((CCEmap0==0xffff)|| + ((format0_found==1)&&(format_c_found==1))) + return(dci_cnt); + + LOG_D(PHY," format 2A_2A search dci_cnt %d, old_dci_cn t%d \n", dci_cnt, old_dci_cnt); + if (dci_cnt>old_dci_cnt) + return(dci_cnt); } else if (tmode == 4) { // Now check UE_SPEC format 2_2A search spaces at aggregation 1 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 0, format1A, format1A, + format1A, format2, format2_size_bits, format2_size_bytes, @@ -3604,17 +4000,21 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); // Now check UE_SPEC format 2 search spaces at aggregation 2 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 1, format1A, format1A, + format1A, format2, format2_size_bits, format2_size_bytes, @@ -3633,17 +4033,21 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); // Now check UE_SPEC format 2_2A search spaces at aggregation 4 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 2, format1A, format1A, + format1A, format2, format2_size_bits, format2_size_bytes, @@ -3663,17 +4067,21 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, //#ifdef ALL_AGGREGATION // Now check UE_SPEC format 2_2A search spaces at aggregation 8 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 3, format1A, format1A, + format1A, format2, format2_size_bits, format2_size_bytes, @@ -3684,23 +4092,27 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, &CCEmap1, &CCEmap2); //#endif - } else if (tmode >=5) { // This is MU-MIMO + } else if ((tmode==5) || (tmode==6)) { // This is MU-MIMO // Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 1 #ifdef DEBUG_DCI_DECODING LOG_I(PHY," MU-MIMO check UE_SPEC format 1E_2A_M10PRB\n"); #endif - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 0, format1A, format1A, + format1A, format1E_2A_M10PRB, sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), @@ -3720,17 +4132,21 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); // Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 2 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 1, format1A, format1A, + format1A, format1E_2A_M10PRB, sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), @@ -3749,17 +4165,21 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); // Now check UE_SPEC format 1E_2A_M10PRB search spaces aggregation 4 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 2, format1A, format1A, + format1A, format1E_2A_M10PRB, sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), @@ -3780,17 +4200,21 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, //#ifdef ALL_AGGREGATION // Now check UE_SPEC format 1E_2A_M10PRB search spaces at aggregation 8 - dci_decoding_procedure0(lte_ue_pdcch_vars,0, + old_dci_cnt=dci_cnt; + dci_decoding_procedure0(pdcch_vars,0,mode, subframe, dci_alloc, eNB_id, + ue->current_thread_id[subframe], frame_parms, mi, - SI_RNTI, + ((ue->decode_SIB == 1) ? SI_RNTI : 0), ra_rnti, + P_RNTI, 3, format1A, format1A, + format1A, format1E_2A_M10PRB, sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), @@ -3814,33 +4238,3 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, return(dci_cnt); } - -#ifdef PHY_ABSTRACTION -uint16_t dci_decoding_procedure_emul(LTE_UE_PDCCH **lte_ue_pdcch_vars, - uint8_t num_ue_spec_dci, - uint8_t num_common_dci, - DCI_ALLOC_t *dci_alloc_tx, - DCI_ALLOC_t *dci_alloc_rx, - int16_t eNB_id) -{ - - uint8_t dci_cnt=0,i; - - memcpy(dci_alloc_rx,dci_alloc_tx,num_common_dci*sizeof(DCI_ALLOC_t)); - dci_cnt = num_common_dci; - LOG_D(PHY,"[DCI][EMUL] : num_common_dci %d\n",num_common_dci); - - for (i=num_common_dci; i<(num_ue_spec_dci+num_common_dci); i++) { - LOG_D(PHY,"[DCI][EMUL] Checking dci %d => %x format %d (bit 0 %d)\n",i,lte_ue_pdcch_vars[eNB_id]->crnti,dci_alloc_tx[i].format, - dci_alloc_tx[i].dci_pdu[0]&0x80); - - if (dci_alloc_tx[i].rnti == lte_ue_pdcch_vars[eNB_id]->crnti) { - memcpy(dci_alloc_rx+dci_cnt,dci_alloc_tx+i,sizeof(DCI_ALLOC_t)); - dci_cnt++; - } - } - - - return(dci_cnt); -} -#endif diff --git a/openair1/PHY/LTE_TRANSPORT/dci.h b/openair1/PHY/LTE_TRANSPORT/dci.h index e65352f5a0..9381dd63fd 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.h +++ b/openair1/PHY/LTE_TRANSPORT/dci.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/dci.h * \brief typedefs for LTE DCI structures from 36-212, V8.6 2009-03. Limited to 5 MHz formats for the moment.Current LTE compliance V8.6 2009-03. @@ -37,11 +29,8 @@ * \note * \warning */ -#ifndef USER_MODE -#include "PHY/types.h" -#else + #include -#endif /// DCI Format Type 0 (5 MHz,TDD0, 27 bits) struct DCI0_5MHz_TDD0 { @@ -238,7 +227,7 @@ typedef struct DCI1A_10MHz_TDD_1_6 DCI1A_10MHz_TDD_1_6_t; /// DCI Format Type 0 (20 MHz,TDD1-6, 27 bits) struct DCI0_20MHz_TDD_1_6 { /// Padding - uint32_t padding:2; + uint32_t padding:3; /// CQI request uint32_t cqi_req:1; /// DAI @@ -493,8 +482,8 @@ typedef struct DCI1A_20MHz_FDD DCI1A_20MHz_FDD_t; /// DCI Format Type 1 (1.5 MHz, TDD, 23 bits) struct DCI1_1_5MHz_TDD { - /// Dummy bits to align to 32-bits - uint32_t dummy:9; + /// padding bits to align to 32-bits + uint32_t padding:9; /// DAI (TDD) uint32_t dai:2; /// Power Control @@ -518,8 +507,8 @@ typedef struct DCI1_1_5MHz_TDD DCI1_1_5MHz_TDD_t; /// DCI Format Type 1 (5 MHz, TDD, 30 bits) struct DCI1_5MHz_TDD { - /// Dummy bits to align to 32-bits - uint32_t dummy:2; + /// padding bits to align to 32-bits + uint32_t padding:2; /// DAI (TDD) uint32_t dai:2; /// Power Control @@ -543,8 +532,8 @@ typedef struct DCI1_5MHz_TDD DCI1_5MHz_TDD_t; /// DCI Format Type 1 (10 MHz, TDD, 34 bits) struct DCI1_10MHz_TDD { - /// Dummy bits to align to 64-bits - uint64_t dummy:30; + /// padding bits to align to 64-bits + uint64_t padding:30; /// DAI (TDD) uint64_t dai:2; /// Power Control @@ -568,8 +557,8 @@ typedef struct DCI1_10MHz_TDD DCI1_10MHz_TDD_t; /// DCI Format Type 1 (20 MHz, TDD, 42 bits) struct DCI1_20MHz_TDD { - /// Dummy bits to align to 64-bits - uint64_t dummy:22; + /// padding bits to align to 64-bits + uint64_t padding:22; /// DAI (TDD) uint64_t dai:2; /// Power Control @@ -593,8 +582,8 @@ typedef struct DCI1_20MHz_TDD DCI1_20MHz_TDD_t; /// DCI Format Type 1 (1.5 MHz, FDD, 21 bits) struct DCI1_1_5MHz_FDD { - /// Dummy bits to align to 32-bits - uint32_t dummy:11; + /// padding bits to align to 32-bits + uint32_t padding:11; /// Power Control uint32_t TPC:2; /// Redundancy version @@ -616,8 +605,8 @@ typedef struct DCI1_1_5MHz_FDD DCI1_1_5MHz_FDD_t; /// DCI Format Type 1 (5 MHz, FDD, 27 bits) struct DCI1_5MHz_FDD { - /// dummy bits (not transmitted) - uint32_t dummy:5; + /// padding its (not transmitted) + uint32_t padding:5; /// Power Control uint32_t TPC:2; /// Redundancy version @@ -639,8 +628,8 @@ typedef struct DCI1_5MHz_FDD DCI1_5MHz_FDD_t; /// DCI Format Type 1 (10 MHz, FDD, 31 bits) struct DCI1_10MHz_FDD { - /// dummy bits (not transmitted) - uint32_t dummy:1; + /// padding bits (not transmitted) + uint32_t padding:1; /// Power Control uint32_t TPC:2; /// Redundancy version @@ -662,8 +651,8 @@ typedef struct DCI1_10MHz_FDD DCI1_10MHz_FDD_t; /// DCI Format Type 1 (20 MHz, FDD, 39 bits) struct DCI1_20MHz_FDD { - /// dummy bits (not transmitted) - uint64_t dummy:25; + /// padding bits (not transmitted) + uint64_t padding:25; /// Power Control uint64_t TPC:2; /// Redundancy version @@ -685,10 +674,8 @@ typedef struct DCI1_20MHz_FDD DCI1_20MHz_FDD_t; /// DCI Format Type 1A (5 MHz, TDD, frame 1-6, 27 bits) struct DCI1A_RA_5MHz_TDD_1_6 { - /// Dummy bits to align to 32-bits - uint32_t dummy:5; - /// Padding - uint32_t padding:6; + /// padding bits to align to 32-bits + uint32_t padding:11; /// PRACH mask index uint32_t prach_mask_index:4; /// Preamble Index @@ -833,7 +820,7 @@ typedef struct DCI1B_5MHz_4A_TDD DCI1B_5MHz_4A_TDD_t; struct DCI1C_1_5MHz { /// padding to 32bits - uint32_t padding32:24; + uint32_t padding:24; uint32_t mcs:5; uint32_t rballoc:3; // N_RB_step = 2, Ngap=Ngap1=3, NDLVRBGap = 6, ceil(log2((3*4)/2)) = 3 } __attribute__ ((__packed__)); @@ -847,7 +834,7 @@ typedef struct DCI1C_1_5MHz DCI1C_1_5MHz_t; struct DCI1C_5MHz { /// padding to 32bits - uint32_t padding32:20; + uint32_t padding:20; uint32_t mcs:5; uint32_t rballoc:7; // N_RB_step = 2, Ngap1=Ngap2=12, NDLVRBGap = 24, ceil(log2((12*13)/2)) = 7 } __attribute__ ((__packed__)); @@ -859,7 +846,7 @@ typedef struct DCI1C_5MHz DCI1C_5MHz_t; struct DCI1C_10MHz { /// padding to 32bits - uint32_t padding32:19; + uint32_t padding:19; uint32_t mcs:5; uint32_t rballoc:7; // N_RB_step = 4, Ngap1=27, NDLVRBGap = 46, ceil(log2(((11*12)/2)) = 7 uint32_t Ngap:1; @@ -872,7 +859,7 @@ typedef struct DCI1C_10MHz DCI1C_10MHz_t; struct DCI1C_15MHz { /// padding to 32bits - uint32_t padding32:18; + uint32_t padding:18; uint32_t mcs:5; uint32_t rballoc:8; // N_RB_step = 4, Ngap1=64, ceil(log2((16*17)/2)) = 8 uint32_t Ngap:1; @@ -885,7 +872,7 @@ typedef struct DCI1C_15MHz DCI1C_15MHz_t; struct DCI1C_20MHz { /// padding to 32bits - uint32_t padding32:17; + uint32_t padding:17; uint32_t mcs:5; uint32_t rballoc:9; // N_RB_step = 4, Ngap1=48, ceil(log2((24*25)/2)) = 9 uint32_t Ngap:1; @@ -1017,7 +1004,7 @@ typedef struct DCI1D_5MHz_4A_TDD DCI1D_5MHz_4A_TDD_t; /// DCI Format Type 1E (5 MHz, TDD, 2 Antenna Ports, more than 10 PRBs, 34 bits) struct DCI1E_5MHz_2A_M10PRB_TDD { /// padding to 64bits - uint64_t padding64:30; + uint64_t padding:30; /// Redundancy version 2 ///uint64_t rv2:2; /// New Data Indicator 2 @@ -1056,7 +1043,7 @@ typedef struct DCI1E_5MHz_2A_M10PRB_TDD DCI1E_5MHz_2A_M10PRB_TDD_t; /// DCI Format Type 2 (1.5 MHz, TDD, 2 Antenna Ports, 34 bits) struct DCI2_1_5MHz_2A_TDD { /// padding to 64bits - uint64_t padding64:30; + uint64_t padding:30; /// TPMI information for precoding uint64_t tpmi:3; /// Redundancy version 2 @@ -1089,7 +1076,7 @@ typedef struct DCI2_1_5MHz_2A_TDD DCI2_1_5MHz_2A_TDD_t; /// DCI Format Type 2 (1.5 MHz, TDD, 4 Antenna Ports, 37 bits) struct DCI2_1_5MHz_4A_TDD { /// padding for 64-bit - uint64_t padding64:27; + uint64_t padding:27; /// TPMI information for precoding uint64_t tpmi:6; /// Redundancy version 2 @@ -1122,7 +1109,7 @@ typedef struct DCI2_1_5MHz_4A_TDD DCI2_1_5MHz_4A_TDD_t; /// DCI Format Type 2 (5 MHz, TDD, 2 Antenna Ports, 42 bits) struct DCI2_5MHz_2A_TDD { /// padding to 64bits - uint64_t padding64:22; + uint64_t padding:22; /// TPMI information for precoding uint64_t tpmi:3; /// Redundancy version 2 @@ -1157,7 +1144,7 @@ typedef struct DCI2_5MHz_2A_TDD DCI2_5MHz_2A_TDD_t; /// DCI Format Type 2 (5 MHz, TDD, 4 Antenna Ports, 45 bits) struct DCI2_5MHz_4A_TDD { /// padding for 64-bit - uint64_t padding64:19; + uint64_t padding:19; /// TPMI information for precoding uint64_t tpmi:6; /// Redundancy version 2 @@ -1192,7 +1179,7 @@ typedef struct DCI2_5MHz_4A_TDD DCI2_5MHz_4A_TDD_t; /// DCI Format Type 2 (10 MHz, TDD, 2 Antenna Ports, 46 bits) struct DCI2_10MHz_2A_TDD { /// padding to 64bits - uint64_t padding64:18; + uint64_t padding:18; /// TPMI information for precoding uint64_t tpmi:3; /// Redundancy version 2 @@ -1227,7 +1214,7 @@ typedef struct DCI2_10MHz_2A_TDD DCI2_10MHz_2A_TDD_t; /// DCI Format Type 2 (10 MHz, TDD, 4 Antenna Ports, 49 bits) struct DCI2_10MHz_4A_TDD { /// padding for 64-bit - uint64_t padding64:15; + uint64_t padding:15; /// TPMI information for precoding uint64_t tpmi:6; /// Redundancy version 2 @@ -1262,7 +1249,7 @@ typedef struct DCI2_10MHz_4A_TDD DCI2_10MHz_4A_TDD_t; /// DCI Format Type 2 (20 MHz, TDD, 2 Antenna Ports, 54 bits) struct DCI2_20MHz_2A_TDD { /// padding to 64bits - uint64_t padding64:10; + uint64_t padding:10; /// TPMI information for precoding uint64_t tpmi:3; /// Redundancy version 2 @@ -1297,7 +1284,7 @@ typedef struct DCI2_20MHz_2A_TDD DCI2_20MHz_2A_TDD_t; /// DCI Format Type 2 (20 MHz, TDD, 4 Antenna Ports, 57 bits) struct DCI2_20MHz_4A_TDD { /// padding for 64-bit - uint64_t padding64:7; + uint64_t padding:7; /// TPMI information for precoding uint64_t tpmi:6; /// Redundancy version 2 @@ -1332,7 +1319,7 @@ typedef struct DCI2_20MHz_4A_TDD DCI2_20MHz_4A_TDD_t; /// DCI Format Type 2 (1.5 MHz, FDD, 2 Antenna Ports, 31 bits) struct DCI2_1_5MHz_2A_FDD { //padding for 32 bits - uint32_t padding32:1; + uint32_t padding:1; /// precoding bits uint32_t tpmi:3; /// Redundancy version 2 @@ -1363,7 +1350,7 @@ typedef struct DCI2_1_5MHz_2A_FDD DCI2_1_5MHz_2A_FDD_t; /// DCI Format Type 2 (1.5 MHz, FDD, 4 Antenna Ports, 34 bits) struct DCI2_1_5MHz_4A_FDD { /// padding for 32 bits - uint64_t padding64:30; + uint64_t padding:30; /// precoding bits uint64_t tpmi:6; /// Redundancy version 2 @@ -1394,7 +1381,7 @@ typedef struct DCI2_1_5MHz_4A_FDD DCI2_1_5MHz_4A_FDD_t; /// DCI Format Type 2 (5 MHz, FDD, 2 Antenna Ports, 39 bits) struct DCI2_5MHz_2A_FDD { /// padding for 64-bit - uint64_t padding64:25; + uint64_t padding:25; /// TPMI information for precoding uint64_t tpmi:3; /// Redundancy version 2 @@ -1427,7 +1414,7 @@ typedef struct DCI2_5MHz_2A_FDD DCI2_5MHz_2A_FDD_t; /// DCI Format Type 2 (5 MHz, TDD, 4 Antenna Ports, 42 bits) struct DCI2_5MHz_4A_FDD { /// padding for 64-bit - uint64_t padding64:21; + uint64_t padding:21; /// TPMI information for precoding uint64_t tpmi:6; /// Redundancy version 2 @@ -1459,7 +1446,7 @@ typedef struct DCI2_5MHz_4A_FDD DCI2_5MHz_4A_FDD_t; /// DCI Format Type 2 (10 MHz, FDD, 2 Antenna Ports, 43 bits) struct DCI2_10MHz_2A_FDD { /// padding for 64-bit - uint64_t padding64:21; + uint64_t padding:21; /// TPMI information for precoding uint64_t tpmi:3; /// Redundancy version 2 @@ -1492,7 +1479,7 @@ typedef struct DCI2_10MHz_2A_FDD DCI2_10MHz_2A_FDD_t; /// DCI Format Type 2 (5 MHz, TDD, 4 Antenna Ports, 46 bits) struct DCI2_10MHz_4A_FDD { /// padding for 64-bit - uint64_t padding64:18; + uint64_t padding:18; /// TPMI information for precoding uint64_t tpmi:6; /// Redundancy version 2 @@ -1524,7 +1511,7 @@ typedef struct DCI2_10MHz_4A_FDD DCI2_10MHz_4A_FDD_t; /// DCI Format Type 2 (20 MHz, FDD, 2 Antenna Ports, 51 bits) struct DCI2_20MHz_2A_FDD { /// padding for 64-bit - uint64_t padding64:13; + uint64_t padding:13; /// TPMI information for precoding uint64_t tpmi:3; /// Redundancy version 2 @@ -1557,7 +1544,7 @@ typedef struct DCI2_20MHz_2A_FDD DCI2_20MHz_2A_FDD_t; /// DCI Format Type 2 (20 MHz, FDD, 4 Antenna Ports, 54 bits) struct DCI2_20MHz_4A_FDD { /// padding for 64-bit - uint64_t padding64:10; + uint64_t padding:10; /// TPMI information for precoding uint64_t tpmi:6; /// Redundancy version 2 @@ -1905,9 +1892,9 @@ struct DCI2A_10MHz_4A_TDD { #define sizeof_DCI2A_10MHz_4A_TDD_t 41 typedef struct DCI2A_10MHz_4A_TDD DCI2A_10MHz_4A_TDD_t; -/// DCI Format Type 2A (10 MHz, FDD, 2 Antenna Ports, 36 bits) +/// DCI Format Type 2A (10 MHz, FDD, 2 Antenna Ports, 40 bits) struct DCI2A_10MHz_2A_FDD { - uint64_t padding:28; + uint64_t padding:24; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -1931,7 +1918,7 @@ struct DCI2A_10MHz_2A_FDD { /// Resource Allocation Header uint64_t rah:1; } __attribute__ ((__packed__)); -#define sizeof_DCI2A_10MHz_2A_FDD_t 36 +#define sizeof_DCI2A_10MHz_2A_FDD_t 41 typedef struct DCI2A_10MHz_2A_FDD DCI2A_10MHz_2A_FDD_t; /// DCI Format Type 2A (10 MHz, FDD, 4 Antenna Ports, 38 bits) @@ -2094,7 +2081,7 @@ typedef struct DCI2A_20MHz_4A_FDD DCI2A_20MHz_4A_FDD_t; // ******************************************************************* /// DCI Format Type 2B (1.5 MHz, TDD, 33 bits) struct DCI2B_1_5MHz_TDD { - uint64_t padding64:31; + uint64_t padding:31; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2120,7 +2107,7 @@ struct DCI2B_1_5MHz_TDD { /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) uint64_t rballoc:6; /// Padding for ambiguity - uint64_t padding:1; + uint64_t padding0:1; } __attribute__ ((__packed__)); typedef struct DCI2B_1_5MHz_TDD DCI2B_1_5MHz_TDD_t; @@ -2129,7 +2116,7 @@ typedef struct DCI2B_1_5MHz_TDD DCI2B_1_5MHz_TDD_t; /// DCI Format Type 2B (5 MHz, TDD, 39 bits) struct DCI2B_5MHz_TDD { /// padding to 64bits - uint64_t padding64:25; + uint64_t padding:25; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2164,7 +2151,7 @@ typedef struct DCI2B_5MHz_TDD DCI2B_5MHz_TDD_t; /// DCI Format Type 2B (10 MHz, TDD, 43 bits) struct DCI2B_10MHz_TDD { /// padding to 64bits - uint64_t padding64:21; + uint64_t padding:21; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2199,7 +2186,7 @@ typedef struct DCI2B_10MHz_TDD DCI2B_10MHz_TDD_t; /// DCI Format Type 2B (20 MHz, TDD, 51 bits) struct DCI2B_20MHz_TDD { /// padding to 64bits - uint64_t padding64:13; + uint64_t padding:13; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2234,7 +2221,7 @@ typedef struct DCI2B_20MHz_TDD DCI2B_20MHz_TDD_t; /// DCI Format Type 2B (1.5 MHz, FDD, 28 bits) struct DCI2B_1_5MHz_FDD { //padding for 32 bits - uint32_t padding32:4; + uint32_t padding:4; /// Redundancy version 2 uint32_t rv2:2; /// New Data Indicator 2 @@ -2263,7 +2250,7 @@ typedef struct DCI2B_1_5MHz_FDD DCI2B_1_5MHz_FDD_t; /// DCI Format Type 2B (5 MHz, FDD, 36 bits) struct DCI2B_5MHz_FDD { /// padding for 64-bit - uint64_t padding64:28; + uint64_t padding:28; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2294,7 +2281,7 @@ typedef struct DCI2B_5MHz_FDD DCI2B_5MHz_FDD_t; /// DCI Format Type 2B (10 MHz, FDD, 41 bits) struct DCI2B_10MHz_FDD { /// padding for 64-bit - uint64_t padding64:23; + uint64_t padding:23; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2318,7 +2305,7 @@ struct DCI2B_10MHz_FDD { /// Resource Allocation Header uint64_t rah:1; /// Padding for ambiguity - uint64_t padding:1; + uint64_t padding0:1; } __attribute__ ((__packed__)); #define sizeof_DCI2B_10MHz_FDD_t 41 @@ -2327,7 +2314,7 @@ typedef struct DCI2B_10MHz_FDD DCI2B_10MHz_FDD_t; /// DCI Format Type 2B (20 MHz, FDD, 48 bits) struct DCI2B_20MHz_FDD { /// padding for 64-bit - uint64_t padding64:16; + uint64_t padding:16; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2361,7 +2348,7 @@ typedef struct DCI2B_20MHz_FDD DCI2B_20MHz_FDD_t; /// DCI Format Type 2C (1.5 MHz, TDD, 34 bits) struct DCI2C_1_5MHz_TDD { - uint64_t padding64:30; + uint64_t padding:30; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2394,7 +2381,7 @@ typedef struct DCI2C_1_5MHz_TDD DCI2C_1_5MHz_TDD_t; /// DCI Format Type 2C (5 MHz, TDD, 41 bits) struct DCI2C_5MHz_TDD { /// padding to 64bits - uint64_t padding64:23; + uint64_t padding:23; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2429,7 +2416,7 @@ typedef struct DCI2C_5MHz_TDD DCI2C_5MHz_TDD_t; /// DCI Format Type 2C (10 MHz, TDD, 45 bits) struct DCI2C_10MHz_TDD { /// padding to 64bits - uint64_t padding64:19; + uint64_t padding:19; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2464,7 +2451,7 @@ typedef struct DCI2C_10MHz_TDD DCI2C_10MHz_TDD_t; /// DCI Format Type 2C (20 MHz, TDD, 53 bits) struct DCI2C_20MHz_TDD { /// padding to 64bits - uint64_t padding64:11; + uint64_t padding:11; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2499,7 +2486,7 @@ typedef struct DCI2C_20MHz_TDD DCI2C_20MHz_TDD_t; /// DCI Format Type 2C (1.5 MHz, FDD, 30 bits) struct DCI2C_1_5MHz_FDD { //padding for 32 bits - uint32_t padding32:2; + uint32_t padding:2; /// Redundancy version 2 uint32_t rv2:2; /// New Data Indicator 2 @@ -2528,7 +2515,7 @@ typedef struct DCI2C_1_5MHz_FDD DCI2C_1_5MHz_FDD_t; /// DCI Format Type 2C (5 MHz, FDD, 38 bits) struct DCI2C_5MHz_FDD { /// padding for 64-bit - uint64_t padding64:26; + uint64_t padding:26; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2559,7 +2546,7 @@ typedef struct DCI2C_5MHz_FDD DCI2C_5MHz_FDD_t; /// DCI Format Type 2C (10 MHz, FDD, 42 bits) struct DCI2C_10MHz_FDD { /// padding for 64-bit - uint64_t padding64:22; + uint64_t padding:22; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2590,7 +2577,7 @@ typedef struct DCI2C_10MHz_FDD DCI2C_10MHz_FDD_t; /// DCI Format Type 2C (20 MHz, FDD, 50 bits) struct DCI2C_20MHz_FDD { /// padding for 64-bit - uint64_t padding64:14; + uint64_t padding:14; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2624,7 +2611,7 @@ typedef struct DCI2C_20MHz_FDD DCI2C_20MHz_FDD_t; /// DCI Format Type 2D (1.5 MHz, TDD, 36 bits) struct DCI2D_1_5MHz_TDD { - uint64_t padding64:28; + uint64_t padding:28; /// PDSCH REsource Mapping and Quasi-Co-Location Indicator uint64_t REMQCL:2; /// Redundancy version 2 @@ -2659,7 +2646,7 @@ typedef struct DCI2D_1_5MHz_TDD DCI2D_1_5MHz_TDD_t; /// DCI Format Type 2D (5 MHz, TDD, 43 bits) struct DCI2D_5MHz_TDD { /// padding to 64bits - uint64_t padding64:21; + uint64_t padding:21; /// PDSCH REsource Mapping and Quasi-Co-Location Indicator uint64_t REMQCL:2; /// Redundancy version 2 @@ -2696,7 +2683,7 @@ typedef struct DCI2D_5MHz_TDD DCI2D_5MHz_TDD_t; /// DCI Format Type 2D (10 MHz, TDD, 47 bits) struct DCI2D_10MHz_TDD { /// padding to 64bits - uint64_t padding64:17; + uint64_t padding:17; /// PDSCH REsource Mapping and Quasi-Co-Location Indicator uint64_t REMQCL:2; /// Redundancy version 2 @@ -2733,7 +2720,7 @@ typedef struct DCI2D_10MHz_TDD DCI2D_10MHz_TDD_t; /// DCI Format Type 2D (20 MHz, TDD, 55 bits) struct DCI2D_20MHz_TDD { /// padding to 64bits - uint64_t padding64:9; + uint64_t padding:9; /// PDSCH REsource Mapping and Quasi-Co-Location Indicator uint64_t REMQCL:2; /// Redundancy version 2 @@ -2770,7 +2757,7 @@ typedef struct DCI2D_20MHz_TDD DCI2D_20MHz_TDD_t; /// DCI Format Type 2D (1.5 MHz, FDD, 33 bits) struct DCI2D_1_5MHz_FDD { //padding for 33 bits - uint64_t padding64:31; + uint64_t padding:31; /// PDSCH REsource Mapping and Quasi-Co-Location Indicator uint64_t REMQCL:2; /// Redundancy version 2 @@ -2794,7 +2781,7 @@ struct DCI2D_1_5MHz_FDD { /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) uint64_t rballoc:6; /// padding for ambiguity - uint64_t padding; + uint64_t padding0; } __attribute__ ((__packed__)); typedef struct DCI2D_1_5MHz_FDD DCI2D_1_5MHz_FDD_t; @@ -2803,7 +2790,7 @@ typedef struct DCI2D_1_5MHz_FDD DCI2D_1_5MHz_FDD_t; /// DCI Format Type 2D (5 MHz, FDD, 41 bits) struct DCI2D_5MHz_FDD { /// padding for 64-bit - uint64_t padding64:23; + uint64_t padding:23; /// PDSCH REsource Mapping and Quasi-Co-Location Indicator uint64_t REMQCL:2; /// Redundancy version 2 @@ -2829,7 +2816,7 @@ struct DCI2D_5MHz_FDD { /// Resource Allocation Header uint64_t rah:1; /// padding for ambiguity - uint64_t padding:1; + uint64_t padding0:1; } __attribute__ ((__packed__)); #define sizeof_DCI2D_5MHz_FDD_t 41 @@ -2838,7 +2825,7 @@ typedef struct DCI2D_5MHz_FDD DCI2D_5MHz_FDD_t; /// DCI Format Type 2D (10 MHz, FDD, 45 bits) struct DCI2D_10MHz_FDD { /// padding for 64-bit - uint64_t padding64:19; + uint64_t padding:19; /// PDSCH REsource Mapping and Quasi-Co-Location Indicator uint64_t REMQCL:2; /// Redundancy version 2 @@ -2864,7 +2851,7 @@ struct DCI2D_10MHz_FDD { /// Resource Allocation Header uint64_t rah:1; /// padding for ambiguity - uint64_t padding:1; + uint64_t padding0:1; } __attribute__ ((__packed__)); #define sizeof_DCI2D_10MHz_FDD_t 45 @@ -2873,7 +2860,7 @@ typedef struct DCI2D_10MHz_FDD DCI2D_10MHz_FDD_t; /// DCI Format Type 2D (20 MHz, FDD, 52 bits) struct DCI2D_20MHz_FDD { /// padding for 64-bit - uint64_t padding64:12; + uint64_t padding:12; /// Redundancy version 2 uint64_t rv2:2; /// New Data Indicator 2 @@ -2977,3 +2964,53 @@ struct DCI0A_20_MHz { #define sizeof_DCI0A_20MHz 17 #define MAX_DCI_SIZE_BITS 45 + +struct DCI_INFO_EXTRACTED { + /// type = 0 => DCI Format 0, type = 1 => DCI Format 1A + uint8_t type; + /// Resource Allocation Header + uint8_t rah; + /// HARQ Process + uint8_t harq_pid; + /// CQI Request + uint8_t cqi_req; + /// SRS Request + uint8_t srs_req; + /// Power Control + uint8_t TPC; + /// Localized/Distributed VRB + uint8_t vrb_type; + /// RB Assignment (ceil(log2(N_RB_DL/P)) bits) + uint32_t rballoc; + // Applicable only when vrb_type = 1 + uint8_t Ngap; + /// Cyclic shift + uint8_t cshift; + /// Hopping flag + uint8_t hopping; + /// Downlink Assignment Index + uint8_t dai; + /// DAI (TDD) + uint8_t ulindex; + + /// TB swap + uint8_t tb_swap; + /// TPMI information for precoding + uint8_t tpmi; + /// Redundancy version 2 + uint8_t rv2; + /// New Data Indicator 2 + uint8_t ndi2; + /// Modulation and Coding Scheme and Redundancy Version 2 + uint8_t mcs2; + /// Redundancy version 1 + uint8_t rv1; + /// New Data Indicator 1 + uint8_t ndi1; + /// Modulation and Coding Scheme and Redundancy Version 1 + uint8_t mcs1; + + /// Scrambling ID + uint64_t ap_si_nl_id:3; +}; +typedef struct DCI_INFO_EXTRACTED DCI_INFO_EXTRACTED_t; diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 1bd7db46a0..bf63d5abbe 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/dci_tools.c * \brief PHY Support routines (eNB/UE) for filling PDSCH/PUSCH/DLSCH/ULSCH data structures based on DCI PDUs generated by eNB MAC scheduler. @@ -37,6 +29,7 @@ * \note * \warning */ + #include "PHY/defs.h" #include "PHY/extern.h" #include "SCHED/defs.h" @@ -44,6 +37,12 @@ #include "PHY/vars.h" #endif #include "assertions.h" +#include "nfapi_interface.h" + +//#define DEBUG_HARQ + +#include "LAYER2/MAC/extern.h" +#include "LAYER2/MAC/defs.h" //#define DEBUG_DCI @@ -164,6 +163,29 @@ int8_t delta_PUSCH_acc[4] = {-1,0,1,3}; int8_t *delta_PUCCH_lut = delta_PUSCH_acc; +void conv_eMTC_rballoc(uint16_t resource_block_coding, + uint32_t N_RB_DL, + uint32_t *rb_alloc) { + + + int narrowband = resource_block_coding>>5; + int RIV = resource_block_coding&31; + int N_NB_DL = N_RB_DL/6; + int i0 = (N_RB_DL>>1) - (3*N_NB_DL); + int first_rb = (6*narrowband)+i0; + int alloc = localRIV2alloc_LUT6[RIV]; + int ind = first_rb>>5; + int ind_mod = first_rb&31; + + if (((N_RB_DL&1) > 0) && (narrowband>=(N_NB_DL>>1))) first_rb++; + rb_alloc[0] = 0; + rb_alloc[1] = 0; + rb_alloc[2] = 0; + rb_alloc[3] = 0; + rb_alloc[ind] = alloc< 26) rb_alloc[ind+1] = alloc>>(6-(ind_mod-26)); +} + void conv_rballoc(uint8_t ra_header,uint32_t rb_alloc,uint32_t N_RB_DL,uint32_t *rb_alloc2) { @@ -215,89 +237,28 @@ void conv_rballoc(uint8_t ra_header,uint32_t rb_alloc,uint32_t N_RB_DL,uint32_t break; case 50: - if (ra_header == 0) {// Type 0 Allocation + AssertFatal(ra_header==0,"resource type 1 not supported for N_RB_DL=50\n"); - for (i=16; i>0; i--) { - if ((rb_alloc&(1<>5] |= (7<<((3*(16-i))%32)); - } - - /* - for (i=1;i<=16;i++) { - if ((rb_alloc&(1<<(16-i))) != 0) - rb_alloc2[(3*i)>>5] |= (7<<((3*i)%32)); - } - */ - // bit mask across - if ((rb_alloc2[0]>>31)==1) - rb_alloc2[1] |= 1; - - if ((rb_alloc&1) != 0) - rb_alloc2[1] |= (3<<16); - - /* - for (i=0;i<16;i++) { - if (((rb_alloc>>(16-i))&1) != 0) - rb_alloc2[(3*i)>>5] |= (7<<((3*i)%32)); - if ((i==10)&&((rb_alloc&(1<<6))!=0)) - rb_alloc2[1] = 1; - // printf("rb_alloc2[%d] (type 0) %x ((%x>>%d)&1=%d)\n",(3*i)>>5,rb_alloc2[(3*i)>>5],rb_alloc,i,(rb_alloc>>i)&1); - - } - // fill in 2 from last bit instead of 3 - if ((rb_alloc&1) != 0) - rb_alloc2[1] |= (3<>%d)&1=%d)\n",(3*i)>>5,rb_alloc2[(3*i)>>5],rb_alloc,i,(rb_alloc>>i)&1); - */ - // printf("rb_alloc[1]=%x,rb_alloc[0]=%x\n",rb_alloc2[1],rb_alloc2[0]); - } else { - LOG_E(PHY,"resource type 1 not supported for N_RB_DL=50\n"); - // mac_xface->macphy_exit("resource type 1 not supported for N_RB_DL=100\n"); - /* - subset = rb_alloc&1; - shift = (rb_alloc>>1)&1; - for (i=0;i<11;i++) { - if ((rb_alloc&(1<<(i+2))) != 0) - rb_alloc2 |= (1<<(2*i)); - // printf("rb_alloc2 (type 1) %x\n",rb_alloc2); - } - if ((shift == 0) && (subset == 1)) - rb_alloc2<<=1; - else if ((shift == 1) && (subset == 0)) - rb_alloc2<<=4; - else if ((shift == 1) && (subset == 1)) - rb_alloc2<<=3; - */ + for (i=16; i>0; i--) { + if ((rb_alloc&(1<>5] |= (7<<((3*(16-i))%32)); } + // bit mask across + if ((rb_alloc2[0]>>31)==1) + rb_alloc2[1] |= 1; + + if ((rb_alloc&1) != 0) + rb_alloc2[1] |= (3<<16); break; case 100: - if (ra_header == 0) {// Type 0 Allocation - for (i=0; i<25; i++) { - if ((rb_alloc&(1<<(24-i))) != 0) - rb_alloc2[(4*i)>>5] |= (0xf<<((4*i)%32)); - - // printf("rb_alloc2[%d] (type 0) %x (%d)\n",(4*i)>>5,rb_alloc2[(4*i)>>5],rb_alloc&(1<macphy_exit("resource type 1 not supported for N_RB_DL=100\n"); - /* - subset = rb_alloc&1; - shift = (rb_alloc>>1)&1; - for (i=0;i<11;i++) { - if ((rb_alloc&(1<<(i+2))) != 0) - rb_alloc2 |= (1<<(2*i)); - // printf("rb_alloc2 (type 1) %x\n",rb_alloc2); - } - if ((shift == 0) && (subset == 1)) - rb_alloc2<<=1; - else if ((shift == 1) && (subset == 0)) - rb_alloc2<<=4; - else if ((shift == 1) && (subset == 1)) - rb_alloc2<<=3; - */ + AssertFatal(ra_header==0,"resource type 1 not supported for N_RB_DL=100\n"); + for (i=0; i<25; i++) { + if ((rb_alloc&(1<<(24-i))) != 0) + rb_alloc2[(4*i)>>5] |= (0xf<<((4*i)%32)); + + // printf("rb_alloc2[%d] (type 0) %x (%d)\n",(4*i)>>5,rb_alloc2[(4*i)>>5],rb_alloc&(1<0, 1->2, odd: 0->3, 1->5 case 1: @@ -471,19 +432,19 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) { return ((3*odd_slot) + 2*(vrb&3) + 5)%6; break; case 4: // even: 4->1, odd: 4->4 - return ((3*odd_slot) + 1)%6; + return ((3*odd_slot) + 1)%6; case 5: // even: 5->4, odd: 5->1 return ((3*odd_slot) + 4)%6; break; } break; - + case 15: if (vrb<12) { if ((vrb&3) < 2) // even: 0->0, 1->4, 4->1, 5->5, 8->2, 9->6 odd: 0->7, 1->11 - return(((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14); + return(((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14); else if (vrb < 12) // even: 2->7, 3->11, 6->8, 7->12, 10->9, 11->13 - return (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14); + return (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14); } if (vrb==12) return (3+(7*odd_slot)) % 14; @@ -491,71 +452,71 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) { return (10+(7*odd_slot)) % 14; return 14; break; - + case 25: return (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24); break; - + case 50: // P=3 if (Ngap==0) { // Nrow=12,Nnull=2,NVRBDL=46,Ngap1= 27 if (vrb>=23) - offset=4; + offset=4; else - offset=0; + offset=0; if (vrb<44) { - if ((vrb&3)>=2) - return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46; - else - return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46; + if ((vrb&3)>=2) + return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46; + else + return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46; } if (vrb==44) // even: 44->11, odd: 45->34 - return offset+((23*odd_slot) + 22-12+1); + return offset+((23*odd_slot) + 22-12+1); if (vrb==45) // even: 45->10, odd: 45->33 - return offset+((23*odd_slot) + 22+12); + return offset+((23*odd_slot) + 22+12); if (vrb==46) - return offset+46+((23*odd_slot) + 23-12+1) % 46; + return offset+46+((23*odd_slot) + 23-12+1) % 46; if (vrb==47) - return offset+46+((23*odd_slot) + 23+12) % 46; + return offset+46+((23*odd_slot) + 23+12) % 46; if (vrb==48) - return offset+46+((23*odd_slot) + 23-12+1) % 46; + return offset+46+((23*odd_slot) + 23-12+1) % 46; if (vrb==49) - return offset+46+((23*odd_slot) + 23+12) % 46; + return offset+46+((23*odd_slot) + 23+12) % 46; } else { // Nrow=6,Nnull=6,NVRBDL=18,Ngap1= 27 if (vrb>=9) - offset=18; + offset=18; else - offset=0; - + offset=0; + if (vrb<12) { - if ((vrb&3)>=2) - return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18; - else - return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18; + if ((vrb&3)>=2) + return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18; + else + return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18; } else { - return offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18); + return offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18); } } break; case 75: // Ngap1 = 32, NVRBRL=64, P=4, Nrow= 16, Nnull=0 if (Ngap ==0) { - return ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64); + return ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64); } else { // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0 - return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32); + return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32); } break; case 100: // Ngap1 = 48, NVRBDL=96, Nrow=24, Nnull=0 if (Ngap ==0) { - return ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96); + return ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96); } else { // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0 - return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32); + return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32); } break; default: @@ -563,7 +524,7 @@ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) { return 0; } return 0; - + } @@ -742,7 +703,7 @@ void generate_RIV_tables() nVRB_even_dist = get_prb(100,0,nVRB,0); // if ((RBstart==0) && (Lcrbs<=8)) -// printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist); +// printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist); if (nVRB_even_dist<32) @@ -750,16 +711,16 @@ void generate_RIV_tables() else if (nVRB_even_dist<64) allocdist1_0_even |= (1<<(nVRB_even_dist-32)); else if (nVRB_even_dist<96) - allocdist2_0_even |= (1<<(nVRB_even_dist-64)); + allocdist2_0_even |= (1<<(nVRB_even_dist-64)); else - allocdist3_0_even |= (1<<(nVRB_even_dist-96)); + allocdist3_0_even |= (1<<(nVRB_even_dist-96)); /* if ((RBstart==0) && (Lcrbs<=8)) - printf("rballoc =>(%08x.%08x.%08x.%08x)\n", - allocdist0_0_even, - allocdist1_0_even, - allocdist2_0_even, - allocdist3_0_even - ); + printf("rballoc =>(%08x.%08x.%08x.%08x)\n", + allocdist0_0_even, + allocdist1_0_even, + allocdist2_0_even, + allocdist3_0_even + ); */ // Distributed Gap1, odd slot nVRB_odd_dist = get_prb(100,1,nVRB,0); @@ -768,9 +729,9 @@ void generate_RIV_tables() else if (nVRB_odd_dist<64) allocdist1_0_odd |= (1<<(nVRB_odd_dist-32)); else if (nVRB_odd_dist<96) - allocdist2_0_odd |= (1<<(nVRB_odd_dist-64)); + allocdist2_0_odd |= (1<<(nVRB_odd_dist-64)); else - allocdist3_0_odd |= (1<<(nVRB_odd_dist-96)); + allocdist3_0_odd |= (1<<(nVRB_odd_dist-96)); // Distributed Gap2, even slot @@ -780,9 +741,9 @@ void generate_RIV_tables() else if (nVRB_even_dist<64) allocdist1_1_even |= (1<<(nVRB_even_dist-32)); else if (nVRB_even_dist<96) - allocdist2_1_even |= (1<<(nVRB_even_dist-64)); + allocdist2_1_even |= (1<<(nVRB_even_dist-64)); else - allocdist3_1_even |= (1<<(nVRB_even_dist-96)); + allocdist3_1_even |= (1<<(nVRB_even_dist-96)); // Distributed Gap2, odd slot @@ -792,9 +753,9 @@ void generate_RIV_tables() else if (nVRB_odd_dist<64) allocdist1_1_odd |= (1<<(nVRB_odd_dist-32)); else if (nVRB_odd_dist<96) - allocdist2_1_odd |= (1<<(nVRB_odd_dist-64)); + allocdist2_1_odd |= (1<<(nVRB_odd_dist-64)); else - allocdist3_1_odd |= (1<<(nVRB_odd_dist-96)); + allocdist3_1_odd |= (1<<(nVRB_odd_dist-96)); RIV=computeRIV(100,RBstart,Lcrbs); @@ -840,6 +801,44 @@ void generate_RIV_tables() // n_tilde_PRB(0,1) = (0,2) +int8_t find_dlsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type) +{ + uint8_t i; + int8_t first_free_index=-1; + + AssertFatal(eNB!=NULL,"eNB is null\n"); + for (i=0; idlsch[i]!=NULL,"eNB->dlsch[%d] is null\n",i); + AssertFatal(eNB->dlsch[i]!=NULL,"eNB->dlsch[%d][0] is null\n",i); + LOG_D(PHY,"searching for rnti %x : UE index %d=> harq_mask %x, rnti %x, first_free_index %d\n", rnti,i,eNB->dlsch[i][0]->harq_mask,eNB->dlsch[i][0]->rnti,first_free_index); + if ((eNB->dlsch[i][0]->harq_mask >0) && + (eNB->dlsch[i][0]->rnti==rnti)) return i; + else if ((eNB->dlsch[i][0]->harq_mask == 0) && (first_free_index==-1)) first_free_index=i; + } + if (type == SEARCH_EXIST) return -1; + if (first_free_index != -1) + eNB->dlsch[first_free_index][0]->rnti = 0; + return first_free_index; +} + +int8_t find_ulsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type) +{ + uint8_t i; + int8_t first_free_index=-1; + + AssertFatal(eNB!=NULL,"eNB is null\n"); + for (i=0; iulsch[i]!=NULL,"eNB->ulsch[%d] is null\n",i); + if ((eNB->ulsch[i]->harq_mask >0) && + (eNB->ulsch[i]->rnti==rnti)) return i; + else if ((eNB->ulsch[i]->harq_mask == 0) && (first_free_index==-1)) first_free_index=i; + } + if (type == SEARCH_EXIST) return -1; + if (first_free_index != -1) + eNB->ulsch[first_free_index]->rnti = 0; + return first_free_index; +} + uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci) { @@ -848,1070 +847,801 @@ uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci) } +/* uint8_t get_transmission_mode(module_id_t Mod_id, uint8_t CC_id, rnti_t rnti) { unsigned char UE_id; // find the UE_index corresponding to rnti - UE_id = find_ue(rnti,PHY_vars_eNB_g[Mod_id][CC_id]); + UE_id = find_ue(rnti,RC.eNB[Mod_id][CC_id]); DevAssert( UE_id != (unsigned char)-1 ); - return(PHY_vars_eNB_g[Mod_id][CC_id]->transmission_mode[UE_id]); + return(RC.eNB[Mod_id][CC_id]->transmission_mode[UE_id]); +} +*/ + +void fill_pdcch_order(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu) +{ + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + uint8_t *dci_pdu = &dci_alloc->dci_pdu[0]; + nfapi_dl_config_dci_dl_pdu_rel8_t *rel8 = &pdu->dci_dl_pdu_rel8; + + dci_alloc->firstCCE = rel8->cce_idx; + dci_alloc->L = rel8->aggregation_level; + dci_alloc->rnti = rel8->rnti; + dci_alloc->harq_pid = rel8->harq_process; + dci_alloc->ra_flag = 0; + dci_alloc->format = format1A; + + LOG_D(PHY,"NFAPI: DCI format %d, nCCE %d, L %d, rnti %x,harq_pid %d\n", + rel8->dci_format,rel8->cce_idx,rel8->aggregation_level,rel8->rnti,rel8->harq_process); + + switch (fp->N_RB_DL) { + case 6: + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->padding = 0; + } else { + dci_alloc->dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->type = 1; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + } + break; + case 25: + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->padding = 0; + // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + } else { + dci_alloc->dci_length = sizeof_DCI1A_5MHz_FDD_t; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->type = 1; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + } + break; + case 50: + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->padding = 0; + // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + } else { + dci_alloc->dci_length = sizeof_DCI1A_10MHz_FDD_t; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->type = 1; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + } + break; + case 100: + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->padding = 0; + // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + } else { + dci_alloc->dci_length = sizeof_DCI1A_20MHz_FDD_t; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->type = 1; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + } + break; + } + + LOG_I(PHY,"%d.%d: DCI 1A: rnti %x, PDCCH order to do PRACH\n", + proc->frame_tx, proc->subframe_tx, rel8->rnti); } -int generate_eNB_dlsch_params_from_dci(int frame, - uint8_t subframe, - void *dci_pdu, - uint16_t rnti, - DCI_format_t dci_format, - LTE_eNB_DLSCH_t **dlsch, - LTE_DL_FRAME_PARMS *frame_parms, - PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, - uint16_t si_rnti, - uint16_t ra_rnti, - uint16_t p_rnti, - uint16_t DL_pmi_single) +void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc,nfapi_dl_config_dci_dl_pdu *pdu) { + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + uint8_t *dci_pdu = &dci_alloc->dci_pdu[0]; + nfapi_dl_config_dci_dl_pdu_rel8_t *rel8 = &pdu->dci_dl_pdu_rel8; - uint8_t harq_pid = UINT8_MAX; - uint32_t rballoc = UINT32_MAX; - uint32_t RIV_max = 0; - uint8_t NPRB,tbswap,tpmi=0; - LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1; - uint8_t frame_type=frame_parms->frame_type; - uint8_t vrb_type=0; - uint8_t mcs=0,mcs1=0,mcs2=0; - uint8_t I_mcs = 0; - uint8_t rv=0,rv1=0,rv2=0; - uint8_t rah=0; - uint8_t TPC=0; + /* check if this is a DCI 1A PDCCH order for RAPROC */ + if (rel8->dci_format == NFAPI_DL_DCI_FORMAT_1A && rel8->rnti_type == 1) { + int full_rb; + switch (fp->N_RB_DL) { + case 6: full_rb = 63; break; + case 25: full_rb = 511; break; + case 50: full_rb = 2047; break; + case 100: full_rb = 8191; break; + default: abort(); + } + if (rel8->resource_block_coding == full_rb) + return fill_pdcch_order(eNB, proc, dci_alloc, pdu); + } + + LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL; LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL; + int beamforming_mode = 0; + int UE_id=-1; + int NPRB; + int TB0_active; + int TB1_active; + uint16_t DL_pmi_single=0; // This should be taken from DLSCH parameters for PUSCH precoding + uint8_t I_mcs = 0; + + dci_alloc->firstCCE = rel8->cce_idx; + dci_alloc->L = rel8->aggregation_level; + dci_alloc->rnti = rel8->rnti; + dci_alloc->harq_pid = rel8->harq_process; + dci_alloc->ra_flag = 0; - // printf("Generate eNB DCI, format %d, rnti %x (pdu %p)\n",dci_format,rnti,dci_pdu); + LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[SFN/SF:%04d%d] DCI format %d, nCCE %d, L %d, rnti %x, harq_pid %d\n", + frame,subframe,proc->frame_tx,proc->subframe_tx,rel8->dci_format,rel8->cce_idx,rel8->aggregation_level,rel8->rnti,rel8->harq_process); + if ((rel8->rnti_type == 2 ) && (rel8->rnti != SI_RNTI) && (rel8->rnti != P_RNTI)) dci_alloc->ra_flag = 1; - switch (dci_format) { + UE_id = find_dlsch(rel8->rnti,eNB,SEARCH_EXIST_OR_FREE); + AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n"); + AssertFatal(UE_id= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX); + dlsch0 = eNB->dlsch[UE_id][0]; + dlsch1 = eNB->dlsch[UE_id][1]; - case format0: - return(-1); - break; + + beamforming_mode = eNB->transmission_mode[(uint8_t)UE_id]<7?0:eNB->transmission_mode[(uint8_t)UE_id]; + dlsch0_harq = dlsch0->harq_processes[rel8->harq_process]; + dlsch0_harq->codeword = 0; + dlsch1_harq = dlsch1->harq_processes[rel8->harq_process]; + dlsch1_harq->codeword = 1; + dlsch0->subframe_tx[subframe] = 1; - case format1A: // This is DLSCH allocation for control traffic + LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:SFN/SF:%04d%d dlsch0[rnti:%x harq_mask:%04x] dci_pdu[rnti:%x rnti_type:%d harq_process:%d ndi1:%d] dlsch0_harq[round:%d harq_mask:%x ndi:%d]\n", + frame,subframe, + proc->frame_tx,proc->subframe_tx, + dlsch0->rnti,dlsch0->harq_mask, + rel8->rnti, rel8->rnti_type, rel8->harq_process, rel8->new_data_indicator_1, + dlsch0_harq->round, dlsch0->harq_mask, dlsch0_harq->ndi); + if (dlsch0->rnti != rel8->rnti) { // if rnti of dlsch is not the same as in the config, this is a new entry + dlsch0_harq->round=0; + dlsch0->harq_mask=0; + } + if ((dlsch0->harq_mask & (1<harq_process)) > 0 ) { + if (rel8->new_data_indicator_1 != dlsch0_harq->ndi) + dlsch0_harq->round=0; + } + else { // process is inactive, so activate and set round to 0 + dlsch0_harq->round=0; + } + dlsch0_harq->ndi = rel8->new_data_indicator_1; + dlsch0->active = 1; + if (rel8->rnti_type == 2) + dlsch0_harq->round = 0; - dlsch[0]->subframe_tx[subframe] = 1; + LOG_D(PHY,"NFAPI: rel8[rnti %x dci_format %d harq_process %d ndi1 %d rnti type %d] dlsch0[rnti %x harq_mask %x] dlsch0_harq[round %d ndi %d]\n", + rel8->rnti,rel8->dci_format,rel8->harq_process, rel8->new_data_indicator_1, rel8->rnti_type, + dlsch0->rnti,dlsch0->harq_mask, + dlsch0_harq->round,dlsch0_harq->ndi + ); + switch (rel8->dci_format) { - switch (frame_parms->N_RB_DL) { + case NFAPI_DL_DCI_FORMAT_1A: + + AssertFatal(rel8->resource_block_coding < 8192, "SFN/SF:%04d%d proc:TX:SFN/SF:%04d%d: rel8->resource_block_coding (%p) %u >= 8192 (rnti %x, rnti_type %d, format %d, harq_id %d\n", + frame,subframe,proc->frame_tx,subframe, + &rel8->resource_block_coding,rel8->resource_block_coding,rel8->rnti,rel8->rnti_type,rel8->dci_format,rel8->harq_process); + + + dci_alloc->format = format1A; + + switch (fp->N_RB_DL) { case 6: - if (frame_type == TDD) { - vrb_type = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv; - TPC = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->padding = 0; + + } else { + dci_alloc->dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->type = 1; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + } + AssertFatal(rel8->virtual_resource_block_assignment_flag==LOCALIZED,"Distributed RB allocation not done yet\n"); + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rel8->resource_block_coding]; + dlsch0_harq->vrb_type = rel8->virtual_resource_block_assignment_flag; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rel8->resource_block_coding];//NPRB; + break; + case 25: + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->padding = 0; + // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + } else { + dci_alloc->dci_length = sizeof_DCI1A_5MHz_FDD_t; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->type = 1; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_5MHz_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + } + AssertFatal(rel8->virtual_resource_block_assignment_flag==LOCALIZED,"Distributed RB allocation not done yet\n"); + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rel8->resource_block_coding]; + dlsch0_harq->vrb_type = rel8->virtual_resource_block_assignment_flag; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rel8->resource_block_coding];//NPRB; + break; + case 50: + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->padding = 0; // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - vrb_type = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv; - TPC = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid; - - // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + dci_alloc->dci_length = sizeof_DCI1A_10MHz_FDD_t; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->type = 1; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_10MHz_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } - - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - - if (vrb_type==LOCALIZED) { - dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc]; - } - else { - LOG_E(PHY,"Distributed RB allocation not done yet\n"); - mac_xface->macphy_exit("exiting"); - } - dlsch0_harq->vrb_type = vrb_type; - dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB; - RIV_max = RIV_max6; - - + AssertFatal(rel8->virtual_resource_block_assignment_flag==LOCALIZED,"Distributed RB allocation not done yet\n"); + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rel8->resource_block_coding]; + dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rel8->resource_block_coding]; + dlsch0_harq->vrb_type = rel8->virtual_resource_block_assignment_flag; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rel8->resource_block_coding];//NPRB; break; - - case 25: - if (frame_type == TDD) { - vrb_type = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv; - TPC = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - - // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); - } else { - vrb_type = ((DCI1A_5MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv; - TPC = ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid; - - // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); - } - - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - - - if (vrb_type==LOCALIZED) { - dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rballoc]; - } - else { - LOG_E(PHY,"Distributed RB allocation not done yet\n"); - mac_xface->macphy_exit("exiting"); - } - dlsch0_harq->vrb_type = vrb_type; - dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB; - RIV_max = RIV_max25; - break; - - case 50: - if (frame_type == TDD) { - vrb_type = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv; - TPC = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - - // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); - } else { - vrb_type = ((DCI1A_10MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv; - TPC = ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid; - //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } - - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - if (vrb_type==LOCALIZED) { - dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc]; - } - else { - LOG_E(PHY,"Distributed RB allocation not done yet\n"); - mac_xface->macphy_exit("exiting"); - } - - - dlsch0_harq->vrb_type = vrb_type; - dlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB; - RIV_max = RIV_max50; - break; - case 100: - if (frame_type == TDD) { - vrb_type = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv; - TPC = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->padding = 0; + // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - vrb_type = ((DCI1A_20MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv; - TPC = ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid; - // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); + dci_alloc->dci_length = sizeof_DCI1A_20MHz_FDD_t; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->type = 1; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->vrb_type = rel8->virtual_resource_block_assignment_flag; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1A_20MHz_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } - - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - - dlsch0_harq->vrb_type = vrb_type; - if (vrb_type==LOCALIZED) { - dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc]; - dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc]; - dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc]; - dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc]; - } - else { - LOG_E(PHY,"Distributed RB allocation not done yet\n"); - mac_xface->macphy_exit("exiting"); - } - - - - dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB; - RIV_max = RIV_max100; - break; - - default: - LOG_E(PHY,"Invalid N_RB_D %dL\n", frame_parms->N_RB_DL); - DevParam (frame_parms->N_RB_DL, 0, 0); + AssertFatal(rel8->virtual_resource_block_assignment_flag==LOCALIZED,"Distributed RB allocation not done yet\n"); + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rel8->resource_block_coding]; + dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rel8->resource_block_coding]; + dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rel8->resource_block_coding]; + dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rel8->resource_block_coding]; + dlsch0_harq->vrb_type = rel8->virtual_resource_block_assignment_flag; + dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rel8->resource_block_coding];//NPRB; break; } - // harq_pid field is reserved - if ((rnti==si_rnti) || (rnti==ra_rnti) || (rnti==p_rnti)) { // - harq_pid=0; + if (rel8->rnti_type == 2 ) { // see 36-212 V8.6.0 p. 45 - NPRB = (TPC&1)+2; + NPRB = (rel8->tpc&1)+2; // 36-213 sec.7.1.7.2 p.26 - I_mcs = mcs; - } else { - if (harq_pid>1) { - LOG_E(PHY,"ERROR: Format 1A: harq_pid > 1\n"); - return(-1); - } - - if (rballoc>RIV_max) { - LOG_E(PHY,"ERROR: Format 1A: rb_alloc (%x) > RIV_max (%x)\n",rballoc,RIV_max); - return(-1); - } - + I_mcs = rel8->mcs_1; + } + else { NPRB = dlsch0_harq->nb_rb; - I_mcs = get_I_TBS(mcs); + I_mcs = get_I_TBS(rel8->mcs_1); } + AssertFatal(NPRB>0,"DCI 1A: NPRB = 0 (rnti %x, rnti type %d, tpc %d, round %d, resource_block_coding %d, harq process %d)\n",rel8->rnti,rel8->rnti_type,rel8->tpc,dlsch0_harq->round,rel8->resource_block_coding,rel8->harq_process); + dlsch0_harq->rvidx = rel8->redundancy_version_1; + dlsch0_harq->Nl = 1; + dlsch0_harq->mimo_mode = (fp->nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI; + dlsch0_harq->dl_power_off = 1; + + - if (NPRB==0) - return(-1); - - //printf("NPRB %d, nb_rb %d, ndi %d\n",NPRB,dlsch0_harq->nb_rb,ndi); - dlsch0_harq->rvidx = rv; - - dlsch0_harq->Nl = 1; - //dlsch0_harq->layer_index = 0; - - dlsch0_harq->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; - /* - if ((rnti!=si_rnti)&&(rnti!=ra_rnti)&&(rnti!=p_rnti)) { //handle toggling for C-RNTI - if (dlsch0_harq->first_tx == 1) { - LOG_D(PHY,"First TX for TC-RNTI %x, clearing first_tx flag\n",rnti); - dlsch0_harq->first_tx=0; - dlsch0_harq->Ndi = 1; - } - else { - if (ndi == dlsch0_harq->DCINdi) - dlsch0_harq->Ndi = 0; - else - dlsch0_harq->Ndi = 1; - } - - dlsch0_harq->DCINdi=ndi; - } - else { - dlsch0_harq->Ndi = 1; - } - */ - dlsch0_harq->dl_power_off = 1; - - - - dlsch0_harq->mcs = mcs; - dlsch0_harq->TBS = TBStable[I_mcs][NPRB-1]; - - dlsch[0]->current_harq_pid = harq_pid; - dlsch[0]->harq_ids[subframe] = harq_pid; - - dlsch[0]->active = 1; - dlsch0 = dlsch[0]; - - dlsch[0]->rnti = rnti; - - dlsch[0]->harq_ids[subframe] = harq_pid; - + dlsch0_harq->mcs = rel8->mcs_1; + dlsch0_harq->Qm = 2; + dlsch0_harq->TBS = TBStable[I_mcs][NPRB-1]; + dlsch0->harq_ids[subframe] = rel8->harq_process; + dlsch0->active = 1; + dlsch0->rnti = rel8->rnti; + dlsch0->harq_ids[subframe] = rel8->harq_process; if (dlsch0_harq->round == 0) dlsch0_harq->status = ACTIVE; + dlsch0->harq_mask |= (1<harq_process); + + if (rel8->rnti_type == 1) LOG_I(PHY,"DCI 1A: round %d, mcs %d, rballoc %x, rv %d, rnti %x, harq process %d\n",dlsch0_harq->round,rel8->mcs_1,rel8->resource_block_coding,rel8->redundancy_version_1,rel8->rnti,rel8->harq_process); + break; + case NFAPI_DL_DCI_FORMAT_1: - case format1: + dci_alloc->format = format1; + dlsch0->active = 1; - switch (frame_parms->N_RB_DL) { + LOG_D(PHY,"SFN/SF:%04d%d proc:TX:SFN/SF:%04d%d: Programming DLSCH for Format 1 DCI, harq_pid %d\n",frame,subframe,proc->frame_tx,subframe,rel8->harq_process); + switch (fp->N_RB_DL) { case 6: - if (frame_type == TDD) { - mcs = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rah; - rv = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rv; - harq_pid = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->harq_pid; + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1_1_5MHz_TDD_t; + ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI1_1_5MHz_TDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1_1_5MHz_TDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1_1_5MHz_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1_1_5MHz_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1_1_5MHz_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1_1_5MHz_TDD_t *)dci_pdu)->padding = 0; + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - mcs = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->mcs; - rah = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rah; - rballoc = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rv; - harq_pid = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->harq_pid; + dci_alloc->dci_length = sizeof_DCI1_1_5MHz_FDD_t; + ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI1_1_5MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1_1_5MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1_1_5MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1_1_5MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1_1_5MHz_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } - break; - case 25: - - if (frame_type == TDD) { - mcs = ((DCI1_5MHz_TDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1_5MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI1_5MHz_TDD_t *)dci_pdu)->rah; - rv = ((DCI1_5MHz_TDD_t *)dci_pdu)->rv; - harq_pid = ((DCI1_5MHz_TDD_t *)dci_pdu)->harq_pid; - LOG_D(PHY,"eNB: subframe %d UE %x, Format1 DCI: ndi %d, harq_pid %d\n",subframe,rnti,((DCI1_5MHz_TDD_t *)dci_pdu)->ndi,harq_pid); + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1_5MHz_TDD_t; + ((DCI1_5MHz_TDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI1_5MHz_TDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1_5MHz_TDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1_5MHz_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1_5MHz_TDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1_5MHz_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1_5MHz_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1_5MHz_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1_5MHz_TDD_t *)dci_pdu)->padding = 0; + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - mcs = ((DCI1_5MHz_FDD_t *)dci_pdu)->mcs; - rah = ((DCI1_5MHz_FDD_t *)dci_pdu)->rah; - rballoc = ((DCI1_5MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1_5MHz_FDD_t *)dci_pdu)->rv; - harq_pid = ((DCI1_5MHz_FDD_t *)dci_pdu)->harq_pid; - LOG_D(PHY,"eNB: subframe %d UE %x, Format1 DCI: ndi %d, harq_pid %d\n",subframe,rnti,((DCI1_5MHz_FDD_t *)dci_pdu)->ndi,harq_pid); - + dci_alloc->dci_length = sizeof_DCI1_5MHz_FDD_t; + ((DCI1_5MHz_FDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI1_5MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1_5MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1_5MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1_5MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1_5MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1_5MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1_5MHz_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } - break; - case 50: - if (frame_type == TDD) { - mcs = ((DCI1_10MHz_TDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1_10MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI1_10MHz_TDD_t *)dci_pdu)->rah; - rv = ((DCI1_10MHz_TDD_t *)dci_pdu)->rv; - harq_pid = ((DCI1_10MHz_TDD_t *)dci_pdu)->harq_pid; + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1_10MHz_TDD_t; + ((DCI1_10MHz_TDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI1_10MHz_TDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1_10MHz_TDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1_10MHz_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1_10MHz_TDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1_10MHz_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1_10MHz_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1_10MHz_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1_10MHz_TDD_t *)dci_pdu)->padding = 0; + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - mcs = ((DCI1_10MHz_FDD_t *)dci_pdu)->mcs; - rah = ((DCI1_10MHz_FDD_t *)dci_pdu)->rah; - rballoc = ((DCI1_10MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1_10MHz_FDD_t *)dci_pdu)->rv; - harq_pid = ((DCI1_10MHz_FDD_t *)dci_pdu)->harq_pid; + dci_alloc->dci_length = sizeof_DCI1_10MHz_FDD_t; + ((DCI1_10MHz_FDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI1_10MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1_10MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1_10MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1_10MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1_10MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1_10MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1_10MHz_FDD_t *)dci_pdu)->padding = 0; } - break; - case 100: - if (frame_type == TDD) { - mcs = ((DCI1_20MHz_TDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1_20MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI1_20MHz_TDD_t *)dci_pdu)->rah; - rv = ((DCI1_20MHz_TDD_t *)dci_pdu)->rv; - harq_pid = ((DCI1_20MHz_TDD_t *)dci_pdu)->harq_pid; + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI1_20MHz_TDD_t; + ((DCI1_20MHz_TDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI1_20MHz_TDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1_20MHz_TDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1_20MHz_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1_20MHz_TDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1_20MHz_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1_20MHz_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1_20MHz_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI1_20MHz_TDD_t *)dci_pdu)->padding = 0; + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - mcs = ((DCI1_20MHz_FDD_t *)dci_pdu)->mcs; - rah = ((DCI1_20MHz_FDD_t *)dci_pdu)->rah; - rballoc = ((DCI1_20MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1_20MHz_FDD_t *)dci_pdu)->rv; - harq_pid = ((DCI1_20MHz_FDD_t *)dci_pdu)->harq_pid; + dci_alloc->dci_length = sizeof_DCI1_20MHz_FDD_t; + ((DCI1_20MHz_FDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI1_20MHz_FDD_t *)dci_pdu)->mcs = rel8->mcs_1; + ((DCI1_20MHz_FDD_t *)dci_pdu)->ndi = rel8->new_data_indicator_1; + ((DCI1_20MHz_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI1_20MHz_FDD_t *)dci_pdu)->rv = rel8->redundancy_version_1; + ((DCI1_20MHz_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI1_20MHz_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI1_20MHz_FDD_t *)dci_pdu)->padding = 0; } - break; - } - if (harq_pid>=8) { - LOG_E(PHY,"ERROR: Format 1: harq_pid >= 8\n"); - return(-1); - } + AssertFatal(rel8->harq_process<8,"Format 1: harq_pid=%d >= 8\n", rel8->harq_process); - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - // msg("DCI: Setting subframe_tx for subframe %d\n",subframe); - dlsch[0]->subframe_tx[subframe] = 1; + dlsch0_harq = dlsch0->harq_processes[rel8->harq_process]; + dlsch0_harq->codeword=0; - conv_rballoc(rah, - rballoc,frame_parms->N_RB_DL, + // printf("DCI: Setting subframe_tx for subframe %d\n",subframe); + dlsch0->subframe_tx[subframe] = 1; + + conv_rballoc(rel8->resource_allocation_type, + rel8->resource_block_coding, + fp->N_RB_DL, dlsch0_harq->rb_alloc); - dlsch0_harq->nb_rb = conv_nprb(rah, - rballoc, - frame_parms->N_RB_DL); + dlsch0_harq->nb_rb = conv_nprb(rel8->resource_allocation_type, + rel8->resource_block_coding, + fp->N_RB_DL); NPRB = dlsch0_harq->nb_rb; - if (NPRB==0) - return(-1); + AssertFatal(NPRB>0,"NPRB == 0\n"); - - dlsch0_harq->rvidx = rv; + dlsch0_harq->rvidx = rel8->redundancy_version_1; dlsch0_harq->Nl = 1; // dlsch[0]->layer_index = 0; - dlsch0_harq->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; - dlsch0_harq->dl_power_off = 1; - /* - if (dlsch[0]->harq_processes[harq_pid]->first_tx == 1) { - LOG_D(PHY,"First TX for C-RNTI %x, clearing first_tx flag, shouldn't happen!\n",rnti); - dlsch[0]->harq_processes[harq_pid]->first_tx=0; - dlsch[0]->harq_processes[harq_pid]->Ndi = 1; - } - else { - LOG_D(PHY,"Checking for Toggled Ndi for C-RNTI %x, old value %d, DCINdi %d\n",rnti,dlsch[0]->harq_processes[harq_pid]->DCINdi,ndi); - if (ndi == dlsch[0]->harq_processes[harq_pid]->DCINdi) - dlsch[0]->harq_processes[harq_pid]->Ndi = 0; - else - dlsch[0]->harq_processes[harq_pid]->Ndi = 1; - } - dlsch[0]->harq_processes[harq_pid]->DCINdi=ndi; - */ + if (beamforming_mode == 0) + dlsch0_harq->mimo_mode = (fp->nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI; + else if (beamforming_mode == 7) + dlsch0_harq->mimo_mode = TM7; + else + LOG_E(PHY,"Invalid beamforming mode %dL\n", beamforming_mode); - dlsch[0]->active = 1; + dlsch0_harq->dl_power_off = 1; + + dlsch0->active = 1; if (dlsch0_harq->round == 0) { dlsch0_harq->status = ACTIVE; - // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); + + // printf("Setting DLSCH process %d to ACTIVE\n",rel8->harq_process); // MCS and TBS don't change across HARQ rounds - dlsch0_harq->mcs = mcs; + dlsch0_harq->mcs = rel8->mcs_1; + dlsch0_harq->Qm = get_Qm(rel8->mcs_1); dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][NPRB-1]; } + LOG_D(PHY,"DCI: Set harq_ids[%d] to %d (%p)\n",subframe,rel8->harq_process,dlsch0); + dlsch0->harq_ids[subframe] = rel8->harq_process; - dlsch[0]->current_harq_pid = harq_pid; - dlsch[0]->harq_ids[subframe] = harq_pid; + dlsch0->harq_mask |= (1<harq_process); - - dlsch0 = dlsch[0]; - - dlsch[0]->rnti = rnti; + dlsch0->rnti = rel8->rnti; break; + case NFAPI_DL_DCI_FORMAT_2A: - case format2: - - switch (frame_parms->N_RB_DL) { - + dci_alloc->format = format2A; + switch (fp->N_RB_DL) { case 6: - if (frame_parms->nb_antennas_tx == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tpmi; - } - } else if (frame_parms->nb_antennas_tx == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi; - } + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI2A_1_5MHz_2A_TDD_t; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + /* there is no padding in this structure, it is exactly 32 bits */ + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + dci_alloc->dci_length = sizeof_DCI2A_1_5MHz_2A_FDD_t; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } - break; - case 25: - if (frame_parms->nb_antennas_tx == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi; - } - } else if (frame_parms->nb_antennas_tx == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tpmi; - } + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI2A_5MHz_2A_TDD_t; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->padding = 0; + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + dci_alloc->dci_length = sizeof_DCI2A_5MHz_2A_FDD_t; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } - break; - case 50: - if (frame_parms->nb_antennas_tx == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tpmi; - } - } else if (frame_parms->nb_antennas_tx == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tpmi; - } + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI2A_10MHz_2A_TDD_t; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->padding = 0; + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + dci_alloc->dci_length = sizeof_DCI2A_10MHz_2A_FDD_t; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->padding = 0; } - break; - case 100: - if (frame_parms->nb_antennas_tx == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tpmi; - } - } else if (frame_parms->nb_antennas_tx == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tpmi; - } + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI2A_20MHz_2A_TDD_t; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->padding = 0; + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); + dci_alloc->dci_length = sizeof_DCI2A_20MHz_2A_FDD_t; + ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->padding = 0; } - break; + } - - if (harq_pid>=8) { - LOG_E(PHY,"ERROR: Format 2_2A: harq_pid >= 8\n"); - return(-1); - } + AssertFatal(rel8->harq_process<8,"Format 2_2A: harq_pid=%d >= 8\n", rel8->harq_process); // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0 // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated - if (tbswap == 0) { - dlsch0 = dlsch[0]; - dlsch1 = dlsch[1]; - } else { - dlsch0 = dlsch[1]; - dlsch1 = dlsch[0]; + + // This must be set as in TM4, does not work properly now. + if (rel8->transport_block_to_codeword_swap_flag == 1) { + dlsch0 = eNB->dlsch[UE_id][1]; + dlsch1 = eNB->dlsch[UE_id][0]; } - dlsch0_harq = dlsch0->harq_processes[harq_pid]; - dlsch1_harq = dlsch1->harq_processes[harq_pid]; + dlsch0_harq = dlsch0->harq_processes[rel8->harq_process]; + dlsch1_harq = dlsch1->harq_processes[rel8->harq_process]; dlsch0->subframe_tx[subframe] = 1; - dlsch0->current_harq_pid = harq_pid; - dlsch1->current_harq_pid = harq_pid; - dlsch0->harq_ids[subframe] = harq_pid; - dlsch1->harq_ids[subframe] = harq_pid; + dlsch0->harq_ids[subframe] = rel8->harq_process; + dlsch1->harq_ids[subframe] = rel8->harq_process; // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); - conv_rballoc(rah, - rballoc, - frame_parms->N_RB_DL, + conv_rballoc(rel8->resource_allocation_type, + rel8->resource_block_coding, + fp->N_RB_DL, dlsch0_harq->rb_alloc); dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; - dlsch0_harq->nb_rb = conv_nprb(rah, - rballoc, - frame_parms->N_RB_DL); + dlsch0_harq->nb_rb = conv_nprb(rel8->resource_allocation_type, + rel8->resource_block_coding, + fp->N_RB_DL); dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - if (dlsch0_harq->nb_rb == 0) - return(-1); + AssertFatal(dlsch0_harq->nb_rb > 0,"nb_rb=0\n"); - dlsch0_harq->mcs = mcs1; - dlsch1_harq->mcs = mcs2; - dlsch0_harq->rvidx = rv1; - dlsch1_harq->rvidx = rv2; + dlsch0_harq->mcs = rel8->mcs_1; + dlsch1_harq->mcs = rel8->mcs_2; + dlsch0_harq->Qm = get_Qm(rel8->mcs_1); + dlsch1_harq->Qm = get_Qm(rel8->mcs_2); + dlsch0_harq->rvidx = rel8->redundancy_version_1; + dlsch1_harq->rvidx = rel8->redundancy_version_2; // assume both TBs are active dlsch0_harq->Nl = 1; dlsch1_harq->Nl = 1; dlsch0->active = 1; dlsch1->active = 1; - + dlsch0->harq_mask |= (1<harq_process); + dlsch1->harq_mask |= (1<harq_process); // check if either TB is disabled (see 36-213 V11.3 Section ) if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { dlsch0->active = 0; + dlsch0->harq_mask &= ~(1<harq_process); } if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { dlsch1->active = 0; + dlsch1->harq_mask &= ~(1<harq_process); } - if (frame_parms->nb_antennas_tx == 2) { - if (dlsch1->active == 1) { // both TBs are active - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1]; - - switch (tpmi) { - case 0: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; - dlsch1_harq->mimo_mode = UNIFORM_PRECODING1m1; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0); - dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,1); - break; - - case 1: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; - dlsch1_harq->mimo_mode = UNIFORM_PRECODING1mj; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2); - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3); - break; - - case 2: // PUSCH precoding - dlsch0_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING; - dlsch0_harq->pmi_alloc = DL_pmi_single; - dlsch1_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING; - dlsch1_harq->pmi_alloc = DL_pmi_single; - break; - - default: - break; - } - - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; - } else { // only one is active - switch (tpmi) { - case 0 : - dlsch0_harq->mimo_mode = ALAMOUTI; - break; - - case 1: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0); - break; - - case 2: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1); - break; - - case 3: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2); - break; - - case 4: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3); - break; - - case 5: - dlsch0_harq->mimo_mode = PUSCH_PRECODING0; - dlsch0_harq->pmi_alloc = DL_pmi_single; - break; - - case 6: - dlsch0_harq->mimo_mode = PUSCH_PRECODING1; - dlsch0_harq->pmi_alloc = DL_pmi_single; - break; - } - - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - } - } else if (frame_parms->nb_antennas_tx == 4) { - // fill in later - } - - // reset HARQ process if this is the first transmission - if (dlsch0_harq->round == 0) - dlsch0_harq->status = ACTIVE; - - if (dlsch1_harq->round == 0) - dlsch1_harq->status = ACTIVE; - - dlsch0->rnti = rnti; - dlsch1->rnti = rnti; - - dlsch0_harq->dl_power_off = 0; - dlsch1_harq->dl_power_off = 0; - - break; - - case format2A: - - switch (frame_parms->N_RB_DL) { - - case 6: - if (frame_parms->nb_antennas_tx == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; - } else { - mcs1 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; - } - } else if (frame_parms->nb_antennas_tx == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi; - } - } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); - } - - break; - - case 25: - if (frame_parms->nb_antennas_tx == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; - } else { - mcs1 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; - } - } else if (frame_parms->nb_antennas_tx == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tpmi; - } - } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); - } - - break; - - case 50: - if (frame_parms->nb_antennas_tx == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->tb_swap; - } else { - mcs1 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->tb_swap; - } - } else if (frame_parms->nb_antennas_tx == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tpmi; - } - } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); - } - - break; - - case 100: - if (frame_parms->nb_antennas_tx == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap; - } else { - mcs1 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->tb_swap; - } - } else if (frame_parms->nb_antennas_tx == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tpmi; - } - } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx); - } - - break; - } + // dlsch0_harq->dl_power_off = 0; + // dlsch1_harq->dl_power_off = 0; - if (harq_pid>=8) { - LOG_E(PHY,"ERROR: Format 2_2A: harq_pid >= 8\n"); - return(-1); - } - - - // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0 - // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated - if (tbswap == 0) { - dlsch0 = dlsch[0]; - dlsch1 = dlsch[1]; - } else { - dlsch0 = dlsch[1]; - dlsch1 = dlsch[0]; - } - - dlsch0_harq = dlsch0->harq_processes[harq_pid]; - dlsch1_harq = dlsch1->harq_processes[harq_pid]; - - dlsch0->subframe_tx[subframe] = 1; - - dlsch0->current_harq_pid = harq_pid; - dlsch1->current_harq_pid = harq_pid; - dlsch0->harq_ids[subframe] = harq_pid; - dlsch1->harq_ids[subframe] = harq_pid; - // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); - - - conv_rballoc(rah, - rballoc, - frame_parms->N_RB_DL, - dlsch0_harq->rb_alloc); - - dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; - dlsch0_harq->nb_rb = conv_nprb(rah, - rballoc, - frame_parms->N_RB_DL); - dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - - if (dlsch0_harq->nb_rb == 0) - return(-1); - - dlsch0_harq->mcs = mcs1; - dlsch1_harq->mcs = mcs2; - dlsch0_harq->rvidx = rv1; - dlsch1_harq->rvidx = rv2; - - // assume both TBs are active - dlsch0_harq->Nl = 1; - dlsch1_harq->Nl = 1; - dlsch0->active = 1; - dlsch1->active = 1; - - - // check if either TB is disabled (see 36-213 V11.3 Section ) - if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { - dlsch0->active = 0; - } - - if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { - dlsch1->active = 0; - } - - dlsch0_harq->dl_power_off = 0; - dlsch1_harq->dl_power_off = 0; - - - if (frame_parms->nb_antennas_tx == 2) { + if (fp->nb_antenna_ports_eNB == 2) { dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1]; if ((dlsch0->active==1) && (dlsch1->active==1)) { + dlsch0_harq->mimo_mode = LARGE_CDD; dlsch1_harq->mimo_mode = LARGE_CDD; dlsch0_harq->dl_power_off = 1; @@ -1920,9 +1650,9 @@ int generate_eNB_dlsch_params_from_dci(int frame, dlsch0_harq->mimo_mode = ALAMOUTI; dlsch1_harq->mimo_mode = ALAMOUTI; } - } else if (frame_parms->nb_antennas_tx == 4) { // 4 antenna case + } else if (fp->nb_antenna_ports_eNB == 4) { // 4 antenna case if ((dlsch0->active==1) && (dlsch1->active==1)) { - switch (tpmi) { + switch (rel8->precoding_information) { case 0: // one layer per transport block dlsch0_harq->mimo_mode = LARGE_CDD; dlsch1_harq->mimo_mode = LARGE_CDD; @@ -1948,7 +1678,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, dlsch0_harq->dl_power_off = 1; dlsch1_harq->dl_power_off = 1; - if (frame_parms->N_RB_DL <= 56) { + if (fp->N_RB_DL <= 56) { dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1]; dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1]; } else { @@ -1962,7 +1692,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, break; } } else if (dlsch0->active == 1) { - switch (tpmi) { + switch (rel8->precoding_information) { case 0: // one layer per transport block dlsch0_harq->mimo_mode = ALAMOUTI; dlsch1_harq->mimo_mode = ALAMOUTI; @@ -1978,11 +1708,11 @@ int generate_eNB_dlsch_params_from_dci(int frame, case 2: // two-layers on TB 0, two on TB 1 case 3: // - LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); + LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",rel8->precoding_information); break; } } else if (dlsch1->active == 1) { - switch (tpmi) { + switch (rel8->precoding_information) { case 0: // one layer per transport block dlsch0_harq->mimo_mode = ALAMOUTI; dlsch1_harq->mimo_mode = ALAMOUTI; @@ -1998,12 +1728,12 @@ int generate_eNB_dlsch_params_from_dci(int frame, case 2: // two-layers on TB 0, two on TB 1 case 3: // - LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); + LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",rel8->precoding_information); break; } } } else { - LOG_E(PHY,"Illegal number of antennas for eNB %d\n",frame_parms->nb_antennas_tx); + LOG_E(PHY,"Illegal number of antennas for eNB %d\n",fp->nb_antenna_ports_eNB); } // reset HARQ process if this is the first transmission @@ -2013,651 +1743,411 @@ int generate_eNB_dlsch_params_from_dci(int frame, if ((dlsch1->active==1) && (dlsch1_harq->round == 0)) dlsch1_harq->status = ACTIVE; - dlsch0->rnti = rnti; - dlsch1->rnti = rnti; + dlsch0->rnti = rel8->rnti; + dlsch1->rnti = rel8->rnti; - // printf("eNB: Format 2A TBS0 %d, TBS1 %d\n",dlsch0_harq->TBS,dlsch1_harq->TBS); - break; + + case NFAPI_DL_DCI_FORMAT_2: - case format2B: - - switch (frame_parms->N_RB_DL) { - + dci_alloc->format = format2; + switch (fp->N_RB_DL) { case 6: - if (frame_type == TDD) { - mcs1 = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2B_1_5MHz_TDD_t *)dci_pdu)->harq_pid; + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI2_1_5MHz_2A_TDD_t; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tpmi = rel8->precoding_information; + ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->padding = 0; + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - mcs1 = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2B_1_5MHz_FDD_t *)dci_pdu)->harq_pid; + dci_alloc->dci_length = sizeof_DCI2_1_5MHz_2A_FDD_t; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tpmi = rel8->precoding_information; + ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } - break; - case 25: - if (frame_type == TDD) { - mcs1 = ((DCI2B_5MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2B_5MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2B_5MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2B_5MHz_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2B_5MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2B_5MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2B_5MHz_TDD_t *)dci_pdu)->harq_pid; + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI2_5MHz_2A_TDD_t; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tpmi = rel8->precoding_information; + ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->padding = 0; + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - mcs1 = ((DCI2B_5MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2B_5MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2B_5MHz_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2B_5MHz_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2B_5MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2B_5MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2B_5MHz_FDD_t *)dci_pdu)->harq_pid; + dci_alloc->dci_length = sizeof_DCI2_5MHz_2A_FDD_t; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi = rel8->precoding_information; + ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->padding = 0; + // printf("FDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } - break; - case 50: - if (frame_type == TDD) { - mcs1 = ((DCI2B_10MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2B_10MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2B_10MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2B_10MHz_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2B_10MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2B_10MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2B_10MHz_TDD_t *)dci_pdu)->harq_pid; + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI2_10MHz_2A_TDD_t; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tpmi = rel8->precoding_information; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->padding = 0; + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - mcs1 = ((DCI2B_10MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2B_10MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2B_10MHz_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2B_10MHz_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2B_10MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2B_10MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2B_10MHz_FDD_t *)dci_pdu)->harq_pid; + dci_alloc->dci_length = sizeof_DCI2_10MHz_2A_FDD_t; + ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tpmi = rel8->precoding_information; + ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->padding = 0; } - break; - case 100: - if (frame_type == TDD) { - mcs1 = ((DCI2B_20MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2B_20MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2B_20MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2B_20MHz_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2B_20MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2B_20MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2B_20MHz_TDD_t *)dci_pdu)->harq_pid; + if (fp->frame_type == TDD) { + dci_alloc->dci_length = sizeof_DCI2_20MHz_2A_TDD_t; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->dai = rel8->downlink_assignment_index; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tpmi = rel8->precoding_information; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->padding = 0; + // printf("TDD 1: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); } else { - mcs1 = ((DCI2B_20MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2B_20MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2B_20MHz_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2B_20MHz_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2B_20MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2B_20MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2B_20MHz_FDD_t *)dci_pdu)->harq_pid; + dci_alloc->dci_length = sizeof_DCI2_20MHz_2A_FDD_t; + ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rah = rel8->resource_allocation_type; + ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs1 = rel8->mcs_1; + ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs2 = rel8->mcs_2; + ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->ndi1 = rel8->new_data_indicator_1; + ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->ndi2 = rel8->new_data_indicator_2; + ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rballoc = rel8->resource_block_coding; + ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv1 = rel8->redundancy_version_1; + ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv2 = rel8->redundancy_version_2; + ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->TPC = rel8->tpc; + ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->harq_pid = rel8->harq_process; + ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tb_swap = rel8->transport_block_to_codeword_swap_flag; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tpmi = rel8->precoding_information; + ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->padding = 0; } - break; + } + AssertFatal(rel8->harq_process>=8, "Format 2_2A: harq_pid=%d >= 8\n", rel8->harq_process); - if (harq_pid>=8) { - LOG_E(PHY,"ERROR: Format 2_2A: harq_pid >= 8\n"); - return(-1); + + // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0 + // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated + TB0_active = 1; + TB1_active = 1; + + if ((rel8->redundancy_version_1 == 1) && (rel8->mcs_1 == 0)) { + TB0_active=0; } - - - - dlsch0 = dlsch[0]; - dlsch1 = dlsch[1]; - - - dlsch0->subframe_tx[subframe] = 1; - - dlsch0->current_harq_pid = harq_pid; - dlsch1->current_harq_pid = harq_pid; - dlsch0->harq_ids[subframe] = harq_pid; - dlsch1->harq_ids[subframe] = harq_pid; - // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); - - - dlsch0_harq = dlsch0->harq_processes[harq_pid]; - dlsch1_harq = dlsch1->harq_processes[harq_pid]; - - conv_rballoc(rah, - rballoc, - frame_parms->N_RB_DL, - dlsch0_harq->rb_alloc); - dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; - - dlsch0_harq->nb_rb = conv_nprb(rah, - rballoc, - frame_parms->N_RB_DL); - dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - - dlsch0_harq->mcs = mcs1; - dlsch1_harq->mcs = mcs2; - dlsch0_harq->rvidx = rv1; - dlsch1_harq->rvidx = rv2; - - // check if either TB is disabled (see 36-213 V8.6 p. 26) - - - if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) - dlsch0_harq->status = DISABLED; - - if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) - dlsch1_harq->status = DISABLED; - - dlsch0_harq->Nl = 1; - - - if (dlsch0_harq->round == 0) { + if ((rel8->redundancy_version_2 == 1) && (rel8->mcs_2 == 0)) { + TB1_active=0; + } +#ifdef DEBUG_HARQ + printf("RV0 = %d, RV1 = %d. MCS0 = %d, MCS1=%d\n", rel8->redundancy_version_1, rel8->redundancy_version_2, rel8->mcs_1, rel8->mcs_2); +#endif + if (TB0_active && TB1_active && rel8->transport_block_to_codeword_swap_flag==0) { + dlsch0->active = 1; + dlsch1->active = 1; + dlsch0->harq_mask |= (1<harq_process); + dlsch1->harq_mask |= (1<harq_process); + dlsch0_harq = dlsch0->harq_processes[rel8->harq_process]; + dlsch1_harq = dlsch1->harq_processes[rel8->harq_process]; + dlsch0_harq->mcs = rel8->mcs_1; + dlsch1_harq->mcs = rel8->mcs_2; + dlsch0_harq->Qm = get_Qm(rel8->mcs_1); + dlsch1_harq->Qm = get_Qm(rel8->mcs_2); + dlsch0_harq->rvidx = rel8->redundancy_version_1; + dlsch1_harq->rvidx = rel8->redundancy_version_2; dlsch0_harq->status = ACTIVE; - // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); + dlsch1_harq->status = ACTIVE; + dlsch0_harq->codeword=0; + dlsch1_harq->codeword=1; +#ifdef DEBUG_HARQ + printf("\n ENB: BOTH ACTIVE\n"); +#endif } - - dlsch0_harq->mcs = mcs1; - - if (dlsch0_harq->nb_rb > 0) { - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - } else { - dlsch0_harq->TBS = 0; - } - - dlsch0->active = 1; - - dlsch0->rnti = rnti; - dlsch1->rnti = rnti; - - dlsch0_harq->dl_power_off = 1; - dlsch1_harq->dl_power_off = 1; - - break; - - case format2C: - - switch (frame_parms->N_RB_DL) { - - case 6: - if (frame_type == TDD) { - mcs1 = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2C_1_5MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs1 = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2C_1_5MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - - case 25: - if (frame_type == TDD) { - mcs1 = ((DCI2C_5MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2C_5MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2C_5MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2C_5MHz_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2C_5MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2C_5MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2C_5MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs1 = ((DCI2C_5MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2C_5MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2C_5MHz_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2C_5MHz_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2C_5MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2C_5MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2C_5MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - - case 50: - if (frame_type == TDD) { - mcs1 = ((DCI2C_10MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2C_10MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2C_10MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2C_10MHz_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2C_10MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2C_10MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2C_10MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs1 = ((DCI2C_10MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2C_10MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2C_10MHz_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2C_10MHz_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2C_10MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2C_10MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2C_10MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - - case 100: - if (frame_type == TDD) { - mcs1 = ((DCI2C_20MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2C_20MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2C_20MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2C_20MHz_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2C_20MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2C_20MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2C_20MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs1 = ((DCI2C_20MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2C_20MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2C_20MHz_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2C_20MHz_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2C_20MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2C_20MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2C_20MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - } - - - if (harq_pid>=8) { - LOG_E(PHY,"ERROR: Format 2_2A: harq_pid >= 8\n"); - return(-1); - } - - - - dlsch0 = dlsch[0]; - dlsch1 = dlsch[1]; - - dlsch0->subframe_tx[subframe] = 1; - - dlsch0->current_harq_pid = harq_pid; - dlsch1->current_harq_pid = harq_pid; - dlsch0->harq_ids[subframe] = harq_pid; - dlsch1->harq_ids[subframe] = harq_pid; - // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); - - dlsch0_harq = dlsch0->harq_processes[harq_pid]; - dlsch1_harq = dlsch1->harq_processes[harq_pid]; - - conv_rballoc(rah, - rballoc, - frame_parms->N_RB_DL, - dlsch0_harq->rb_alloc); - dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; - - dlsch0_harq->nb_rb = conv_nprb(rah, - rballoc, - frame_parms->N_RB_DL); - dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - - if (dlsch0_harq->nb_rb == 0) - return(-1); - - dlsch0_harq->mcs = mcs1; - dlsch1_harq->mcs = mcs2; - dlsch0_harq->rvidx = rv1; - dlsch1_harq->rvidx = rv2; - - // check if either TB is disabled (see 36-213 V8.6 p. 26) - - - if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { - dlsch0->active = 0; - } - - if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { - dlsch1->active = 0; - } - - - - if ((dlsch0_harq->round == 0) && (dlsch0->active == 1) ) { - dlsch0_harq->status = ACTIVE; - dlsch0_harq->mcs = mcs1; - } - - if ((dlsch1_harq->round == 0) && (dlsch1->active == 1) ) { - dlsch1_harq->status = ACTIVE; - dlsch1_harq->mcs = mcs2; - } - - // check TPMI information to compute TBS - if (frame_parms->nb_antennas_tx == 2) { - if (dlsch1->active == 1) { // both TBs are active - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1]; - } else { - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - } - } else if (frame_parms->nb_antennas_tx == 4) { - - } - - dlsch0->rnti = rnti; - dlsch1->rnti = rnti; - - dlsch0_harq->dl_power_off = 1; - dlsch1_harq->dl_power_off = 1; - - break; - - case format2D: - - switch (frame_parms->N_RB_DL) { - - case 6: - if (frame_type == TDD) { - mcs1 = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2D_1_5MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs1 = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2D_1_5MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - - case 25: - if (frame_type == TDD) { - mcs1 = ((DCI2D_5MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2D_5MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2D_5MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2D_5MHz_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2D_5MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2D_5MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2D_5MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs1 = ((DCI2D_5MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2D_5MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2D_5MHz_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2D_5MHz_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2D_5MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2D_5MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2D_5MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - - case 50: - if (frame_type == TDD) { - mcs1 = ((DCI2D_10MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2D_10MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2D_10MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2D_10MHz_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2D_10MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2D_10MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2D_10MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs1 = ((DCI2D_10MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2D_10MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2D_10MHz_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2D_10MHz_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2D_10MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2D_10MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2D_10MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - - case 100: - if (frame_type == TDD) { - mcs1 = ((DCI2D_20MHz_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2D_20MHz_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2D_20MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2D_20MHz_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2D_20MHz_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2D_20MHz_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2D_20MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs1 = ((DCI2D_20MHz_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2D_20MHz_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2D_20MHz_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2D_20MHz_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2D_20MHz_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2D_20MHz_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2D_20MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - } - - - if (harq_pid>=8) { - LOG_E(PHY,"ERROR: Format 2_2A: harq_pid >= 8\n"); - return(-1); - } - - - - dlsch0 = dlsch[0]; - dlsch1 = dlsch[1]; - - dlsch0->subframe_tx[subframe] = 1; - - dlsch0->current_harq_pid = harq_pid; - dlsch1->current_harq_pid = harq_pid; - dlsch0->harq_ids[subframe] = harq_pid; - dlsch1->harq_ids[subframe] = harq_pid; - // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); - - - dlsch0_harq = dlsch0->harq_processes[harq_pid]; - dlsch1_harq = dlsch1->harq_processes[harq_pid]; - - conv_rballoc(rah, - rballoc, - frame_parms->N_RB_DL, - dlsch0_harq->rb_alloc); - dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; - - dlsch0_harq->nb_rb = conv_nprb(rah, - rballoc, - frame_parms->N_RB_DL); - dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - - dlsch0_harq->mcs = mcs1; - dlsch1_harq->mcs = mcs2; - dlsch0_harq->rvidx = rv1; - dlsch1_harq->rvidx = rv2; - - // check if either TB is disabled (see 36-213 V8.6 p. 26) - - - if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) - dlsch0_harq->status = DISABLED; - - if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) - dlsch1_harq->status = DISABLED; - - dlsch0_harq->Nl = 1; - - - if (dlsch0_harq->round == 0) { + else if (TB0_active && TB1_active && rel8->transport_block_to_codeword_swap_flag==1) { + dlsch0 = eNB->dlsch[UE_id][1]; + dlsch1 = eNB->dlsch[UE_id][0]; + dlsch0->active = 1; + dlsch1->active = 1; + + dlsch0->harq_mask |= (1<harq_process); + dlsch1->harq_mask |= (1<harq_process); + + dlsch1_harq = dlsch1->harq_processes[rel8->harq_process]; + dlsch0_harq->mcs = rel8->mcs_1; + dlsch1_harq->mcs = rel8->mcs_2; + dlsch0_harq->Qm = get_Qm(rel8->mcs_1); + dlsch1_harq->Qm = get_Qm(rel8->mcs_2); + dlsch0_harq->rvidx = rel8->redundancy_version_1; + dlsch1_harq->rvidx = rel8->redundancy_version_2; dlsch0_harq->status = ACTIVE; - // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); + dlsch1_harq->status = ACTIVE; + dlsch0_harq->codeword=1; + dlsch1_harq->codeword=0; } - - dlsch0_harq->mcs = mcs1; - - if (dlsch0_harq->nb_rb > 0) { - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - } else { - dlsch0_harq->TBS = 0; - } - - dlsch0->active = 1; - - dlsch0->rnti = rnti; - dlsch1->rnti = rnti; - - dlsch0_harq->dl_power_off = 1; - dlsch1_harq->dl_power_off = 1; - - break; - - - case format1E_2A_M10PRB: - - harq_pid = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->harq_pid; - - if (harq_pid>=8) { - LOG_E(PHY,"ERROR: Format 1E_2A_M10PRB: harq_pid >= 8\n"); - return(-1); - } - - /* - tbswap = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tb_swap; - if (tbswap == 0) { - dlsch0 = dlsch[0]; - dlsch1 = dlsch[1]; - } - else{ - dlsch0 = dlsch[1]; - dlsch1 = dlsch[0]; - } - */ - dlsch0 = dlsch[0]; - dlsch0->subframe_tx[subframe] = 1; - - dlsch0->current_harq_pid = harq_pid; - //dlsch1->current_harq_pid = harq_pid; - dlsch0->harq_ids[subframe] = harq_pid; - //dlsch1->harq_ids[subframe] = harq_pid; - // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); - dlsch0_harq = dlsch0->harq_processes[harq_pid]; - - conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, - ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL, - dlsch0_harq->rb_alloc); - - //dlsch1->rb_alloc[0] = dlsch0->rb_alloc[0]; - - dlsch0_harq->nb_rb = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, - ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc, - frame_parms->N_RB_DL); - //dlsch1->nb_rb = dlsch0->nb_rb; - - dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; - //dlsch1_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2; - dlsch0_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv; - //dlsch1_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2; - - // check if either TB is disabled (see 36-213 V8.6 p. 26) --> only for format 2 and 2A - - //if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) - // dlsch0_harq->status = DISABLED; - - //if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) - // dlsch1_harq->status = DISABLED; - - dlsch0_harq->Nl = 1; - - //dlsch0->layer_index = tbswap; - //dlsch1->layer_index = 1-tbswap; - - // Fix this - tpmi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tpmi; - - switch (tpmi) { - case 0 : - dlsch0_harq->mimo_mode = ALAMOUTI; - break; - - case 1: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0); - break; - - case 2: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1); - break; - - case 3: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2); - break; - - case 4: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3); - break; - - case 5: - dlsch0_harq->mimo_mode = PUSCH_PRECODING0; - dlsch0_harq->pmi_alloc = DL_pmi_single; - break; - - case 6: - dlsch0_harq->mimo_mode = PUSCH_PRECODING1; - return(-1); - break; - } - - // printf("Set pmi %x (tpmi %d)\n",dlsch0->pmi_alloc,tpmi); - - - if (frame_parms->mode1_flag == 1) - dlsch0_harq->mimo_mode = SISO; - - // dlsch0_harq->Ndi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi; - if (dlsch0_harq->round == 0) { + else if (TB0_active && (TB1_active==0)) { + dlsch0->active = 1; + dlsch0->harq_mask |= (1<harq_process); + dlsch0_harq = dlsch0->harq_processes[rel8->harq_process]; + dlsch0_harq->mcs = rel8->mcs_1; + dlsch0_harq->Qm = get_Qm(rel8->mcs_1); + dlsch0_harq->rvidx = rel8->redundancy_version_1; dlsch0_harq->status = ACTIVE; - // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); + dlsch0_harq->codeword = 0; + dlsch1=NULL; + dlsch1_harq = NULL; +#ifdef DEBUG_HARQ + printf("\n ENB: TB1 is deactivated, retransmit TB0 transmit in TM6\n"); +#endif + } + else if ((TB0_active==0) && TB1_active) { + dlsch1->active = 1; + dlsch1->harq_mask |= (1<harq_process); + dlsch1_harq = dlsch1->harq_processes[rel8->harq_process]; + dlsch1_harq->mcs = rel8->mcs_2; + dlsch1_harq->Qm = get_Qm(rel8->mcs_2); + dlsch1_harq->rvidx = rel8->redundancy_version_2; + dlsch1_harq->status = ACTIVE; + dlsch1_harq->codeword = 0; + dlsch0=NULL; + dlsch0_harq = NULL; +#ifdef DEBUG_HARQ + printf("\n ENB: TB0 is deactivated, retransmit TB1 transmit in TM6\n"); +#endif } - dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; + if (dlsch0 != NULL){ + dlsch0->subframe_tx[subframe] = 1; - if (dlsch0_harq->nb_rb > 0) { - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - } else { - dlsch0_harq->TBS = 0; + dlsch0->harq_ids[subframe] = rel8->harq_process; } - dlsch0->active = 1; + if (dlsch1_harq != NULL){ + dlsch1->harq_ids[subframe] = rel8->harq_process; + } - dlsch0->rnti = rnti; - //dlsch1->rnti = rnti; - // dlsch0->dl_power_off = 1; - dlsch0_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off; - //dlsch1->dl_power_off = 1; + if (dlsch0 != NULL ){ + conv_rballoc(rel8->resource_allocation_type, + rel8->resource_block_coding, + fp->N_RB_DL, + dlsch0_harq->rb_alloc); - break; + dlsch0_harq->nb_rb = conv_nprb(rel8->resource_allocation_type, rel8->resource_block_coding, fp->N_RB_DL); + + if (dlsch1 != NULL){ + dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0]; + dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; + } + } else if ((dlsch0 == NULL ) && (dlsch1 != NULL )){ + conv_rballoc(rel8->resource_allocation_type, + rel8->resource_block_coding, + fp->N_RB_DL, + dlsch1_harq->rb_alloc); + + dlsch1_harq->nb_rb = conv_nprb(rel8->resource_allocation_type, rel8->resource_block_coding, fp->N_RB_DL); + } + + + // assume both TBs are active + if (dlsch0_harq != NULL) + dlsch0_harq->Nl = 1; + if (dlsch1_harq != NULL) + dlsch1_harq->Nl = 1; + + + // check if either TB is disabled (see 36-213 V11.3 Section ) + + if (fp->nb_antenna_ports_eNB == 2) { + if ((dlsch0 != NULL) && (dlsch1 != NULL)) { //two CW active + + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; + switch (rel8->precoding_information) { + case 0: + dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1; + dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1; + dlsch0_harq->pmi_alloc = pmi_extend(fp,0,1); + dlsch1_harq->pmi_alloc = pmi_extend(fp,0,1); + break; + case 1: + dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj; + dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj; + dlsch0_harq->pmi_alloc = pmi_extend(fp,1,1); + dlsch0_harq->pmi_alloc = pmi_extend(fp,1,1); + + break; + case 2: // PUSCH precoding + dlsch0_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING; + dlsch0_harq->pmi_alloc = DL_pmi_single; + dlsch1_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING; + dlsch1_harq->pmi_alloc = DL_pmi_single; + break; + default: + break; + } + } else if ((dlsch0 != NULL) && (dlsch1 == NULL)) { // only CW 0 active + dlsch0_harq->dl_power_off = 1; + dlsch0_harq->TBS= TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + switch (rel8->precoding_information) { + case 0 : + dlsch0_harq->mimo_mode = ALAMOUTI; + break; + case 1: + dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; + dlsch0_harq->pmi_alloc = pmi_extend(fp,0,0); + break; + case 2: + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1; + dlsch0_harq->pmi_alloc = pmi_extend(fp,1,0); + break; + case 3: + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; + dlsch0_harq->pmi_alloc = pmi_extend(fp,2,0); + break; + case 4: + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj; + dlsch0_harq->pmi_alloc = pmi_extend(fp,3,0); + break; + case 5: + dlsch0_harq->mimo_mode = PUSCH_PRECODING0; + dlsch0_harq->pmi_alloc = DL_pmi_single; + break; + case 6: + dlsch0_harq->mimo_mode = PUSCH_PRECODING1; + dlsch0_harq->pmi_alloc = DL_pmi_single; + break; + } + } else if ((dlsch0 == NULL) && (dlsch1 != NULL)) { + dlsch1_harq->dl_power_off = 1; + dlsch1_harq->TBS= TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; + switch (rel8->precoding_information) { + case 0 : + dlsch1_harq->mimo_mode = ALAMOUTI; + break; + case 1: + dlsch1_harq->mimo_mode = UNIFORM_PRECODING11; + dlsch1_harq->pmi_alloc = pmi_extend(fp,0,0); + break; + case 2: + dlsch1_harq->mimo_mode = UNIFORM_PRECODING1m1; + dlsch1_harq->pmi_alloc = pmi_extend(fp,1,0); + break; + case 3: + dlsch1_harq->mimo_mode = UNIFORM_PRECODING1j; + dlsch1_harq->pmi_alloc = pmi_extend(fp,2,0); + break; + case 4: + dlsch1_harq->mimo_mode = UNIFORM_PRECODING1mj; + dlsch1_harq->pmi_alloc = pmi_extend(fp,3,0); + break; + case 5: + dlsch1_harq->mimo_mode = PUSCH_PRECODING0; + dlsch1_harq->pmi_alloc = DL_pmi_single; + break; + case 6: + dlsch1_harq->mimo_mode = PUSCH_PRECODING1; + dlsch1_harq->pmi_alloc = DL_pmi_single; + break; + } + } + + } else if (fp->nb_antenna_ports_eNB == 4) { + // fill in later + } + + // reset HARQ process if this is the first transmission + /* if (dlsch0_harq->round == 0) + dlsch0_harq->status = ACTIVE; + + if (dlsch1_harq->round == 0) + dlsch1_harq->status = ACTIVE;*/ + if (dlsch0_harq != NULL) + dlsch0->rnti = rel8->rnti; + if (dlsch1 != NULL) + dlsch1->rnti = rel8->rnti; - default: - LOG_E(PHY,"Unknown DCI format\n"); - return(-1); break; } - if (dlsch0_harq) { - dlsch0_harq->frame = frame; + dlsch0_harq->frame = frame; dlsch0_harq->subframe = subframe; } if (dlsch1_harq) { - dlsch1_harq->frame = frame; + dlsch1_harq->frame = frame; dlsch1_harq->subframe = subframe; } @@ -2673,25 +2163,553 @@ int generate_eNB_dlsch_params_from_dci(int frame, printf("dlsch0 eNB: rvidx %d\n",dlsch0_harq->rvidx); printf("dlsch0 eNB: TBS %d (NPRB %d)\n",dlsch0_harq->TBS,NPRB); printf("dlsch0 eNB: mcs %d\n",dlsch0_harq->mcs); - printf("dlsch0 eNB: tpmi %d\n",tpmi); + printf("dlsch0 eNB: tpmi %d\n",rel8->precoding_information); printf("dlsch0 eNB: mimo_mode %d\n",dlsch0_harq->mimo_mode); } + if (dlsch1) { + printf("dlsch1 eNB: dlsch1 %p\n",dlsch1); + printf("dlsch1 eNB: rnti %x\n",dlsch1->rnti); + printf("dlsch1 eNB: NBRB %d\n",dlsch1_harq->nb_rb); + printf("dlsch1 eNB: rballoc %x\n",dlsch1_harq->rb_alloc[0]); + printf("dlsch1 eNB: harq_pid %d\n",harq_pid); + printf("dlsch1 eNB: round %d\n",dlsch1_harq->round); + printf("dlsch1 eNB: rvidx %d\n",dlsch1_harq->rvidx); + printf("dlsch1 eNB: TBS %d (NPRB %d)\n",dlsch1_harq->TBS,NPRB); + printf("dlsch1 eNB: mcs %d\n",dlsch1_harq->mcs); + printf("dlsch1 eNB: tpmi %d\n",rel8->precoding_information); + printf("dlsch1 eNB: mimo_mode %d\n",dlsch1_harq->mimo_mode); + } + +#endif + +#if T_TRACER + if (dlsch0->active) + T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame), T_INT(subframe), + T_INT(rel8->rnti), T_INT(rel8->dci_format), T_INT(rel8->harq_process), + T_INT(rel8->mcs_1), T_INT(dlsch0_harq->TBS)); #endif - // compute DL power control parameters - computeRhoA_eNB(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off); - - computeRhoB_eNB(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0],dlsch0_harq->dl_power_off); - - return(0); } +void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,mDCI_ALLOC_t *dci_alloc,nfapi_dl_config_mpdcch_pdu *pdu) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + + uint8_t *dci_pdu = &dci_alloc->dci_pdu[0]; + nfapi_dl_config_mpdcch_pdu_rel13_t *rel13 = &pdu->mpdcch_pdu_rel13; + + LTE_eNB_DLSCH_t *dlsch0=NULL; + LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL; + int UE_id; + int subframe = proc->subframe_tx; + + dci_alloc->firstCCE = rel13->ecce_index; + dci_alloc->L = rel13->aggregation_level; + dci_alloc->rnti = rel13->rnti; + dci_alloc->harq_pid = rel13->harq_process; + dci_alloc->narrowband = rel13->mpdcch_narrow_band; + dci_alloc->number_of_prb_pairs = rel13->number_of_prb_pairs; + dci_alloc->resource_block_assignment = rel13->resource_block_assignment; + dci_alloc->transmission_type = rel13->mpdcch_tansmission_type; + dci_alloc->start_symbol = rel13->start_symbol; + dci_alloc->ce_mode = rel13->ce_mode; + dci_alloc->dmrs_scrambling_init = rel13->drms_scrambling_init; + dci_alloc->i0 = rel13->initial_transmission_sf_io; + + dci_alloc->ra_flag = 0; + if (rel13->rnti_type == 2 ) dci_alloc->ra_flag = 1; + + UE_id = find_dlsch(rel13->rnti,eNB,SEARCH_EXIST_OR_FREE); + AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n"); + AssertFatal(UE_id= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX); + dlsch0 = eNB->dlsch[UE_id][0]; + dlsch0_harq = dlsch0->harq_processes[rel13->harq_process]; + + AssertFatal(fp->frame_type==FDD,"TDD is not supported yet for eMTC\n"); + AssertFatal(fp->N_RB_DL==25 || fp->N_RB_DL==50 ||fp->N_RB_DL==100, + "eMTC only with N_RB_DL = 25,50,100\n"); + + switch (rel13->dci_format) { + + case 10: // Format 6-1A + dci_alloc->format = format6_1A; + dlsch0->active = 1; + switch (fp->N_RB_DL) { + + case 25: + dci_alloc->dci_length = sizeof_DCI6_1A_5MHz_t; + ((DCI6_1A_5MHz_t *)dci_pdu)->type = 1; + ((DCI6_1A_5MHz_t *)dci_pdu)->hopping = rel13->frequency_hopping_enabled_flag; + ((DCI6_1A_5MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding; + ((DCI6_1A_5MHz_t *)dci_pdu)->mcs = rel13->mcs; + ((DCI6_1A_5MHz_t *)dci_pdu)->rep = (rel13->pdsch_reptition_levels-1); + ((DCI6_1A_5MHz_t *)dci_pdu)->harq_pid = rel13->harq_process; + ((DCI6_1A_5MHz_t *)dci_pdu)->ndi = rel13->new_data_indicator; + ((DCI6_1A_5MHz_t *)dci_pdu)->rv = rel13->redundancy_version; + ((DCI6_1A_5MHz_t *)dci_pdu)->TPC = rel13->tpc; + ((DCI6_1A_5MHz_t *)dci_pdu)->srs_req = rel13->srs_request; + ((DCI6_1A_5MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset; + ((DCI6_1A_5MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1; + ((DCI6_1A_5MHz_t *)dci_pdu)->padding = 0; + + break; + case 50: + dci_alloc->dci_length = sizeof_DCI6_1A_10MHz_t; + ((DCI6_1A_10MHz_t *)dci_pdu)->type = 1; + ((DCI6_1A_10MHz_t *)dci_pdu)->hopping = rel13->frequency_hopping_enabled_flag; + ((DCI6_1A_10MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding; + ((DCI6_1A_10MHz_t *)dci_pdu)->mcs = rel13->mcs; + ((DCI6_1A_10MHz_t *)dci_pdu)->rep = (rel13->pdsch_reptition_levels-1); + ((DCI6_1A_10MHz_t *)dci_pdu)->harq_pid = rel13->harq_process; + ((DCI6_1A_10MHz_t *)dci_pdu)->ndi = rel13->new_data_indicator; + ((DCI6_1A_10MHz_t *)dci_pdu)->rv = rel13->redundancy_version; + ((DCI6_1A_10MHz_t *)dci_pdu)->TPC = rel13->tpc; + ((DCI6_1A_10MHz_t *)dci_pdu)->srs_req = rel13->srs_request; + ((DCI6_1A_10MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset; + ((DCI6_1A_10MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1; + ((DCI6_1A_10MHz_t *)dci_pdu)->padding = 0; + break; + case 100: + dci_alloc->dci_length = sizeof_DCI6_1A_20MHz_t; + ((DCI6_1A_20MHz_t *)dci_pdu)->type = 1; + ((DCI6_1A_20MHz_t *)dci_pdu)->hopping = rel13->frequency_hopping_enabled_flag; + ((DCI6_1A_20MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding; + ((DCI6_1A_20MHz_t *)dci_pdu)->mcs = rel13->mcs; + ((DCI6_1A_20MHz_t *)dci_pdu)->rep = (rel13->pdsch_reptition_levels-1); + ((DCI6_1A_20MHz_t *)dci_pdu)->harq_pid = rel13->harq_process; + ((DCI6_1A_20MHz_t *)dci_pdu)->ndi = rel13->new_data_indicator; + ((DCI6_1A_20MHz_t *)dci_pdu)->rv = rel13->redundancy_version; + ((DCI6_1A_20MHz_t *)dci_pdu)->TPC = rel13->tpc; + ((DCI6_1A_20MHz_t *)dci_pdu)->srs_req = rel13->srs_request; + ((DCI6_1A_20MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset; + ((DCI6_1A_20MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1; + ((DCI6_1A_20MHz_t *)dci_pdu)->padding = 0; + break; + } + break; + case 11: // Format 6-1B + dci_alloc->format = format6_1B; + dlsch0->active = 1; + switch (fp->N_RB_DL) { + + case 25: + dci_alloc->dci_length = sizeof_DCI6_1B_5MHz_t; + ((DCI6_1B_5MHz_t *)dci_pdu)->type = 1; + ((DCI6_1B_5MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding; + ((DCI6_1B_5MHz_t *)dci_pdu)->mcs = rel13->mcs; + ((DCI6_1B_5MHz_t *)dci_pdu)->rep = (rel13->pdsch_reptition_levels-1); + ((DCI6_1B_5MHz_t *)dci_pdu)->harq_pid = rel13->harq_process; + ((DCI6_1B_5MHz_t *)dci_pdu)->ndi = rel13->new_data_indicator; + ((DCI6_1B_5MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset; + ((DCI6_1B_5MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1; + ((DCI6_1B_5MHz_t *)dci_pdu)->padding = 0; + + break; + case 50: + dci_alloc->dci_length = sizeof_DCI6_1B_10MHz_t; + ((DCI6_1B_10MHz_t *)dci_pdu)->type = 1; + ((DCI6_1B_10MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding; + ((DCI6_1B_10MHz_t *)dci_pdu)->mcs = rel13->mcs; + ((DCI6_1B_10MHz_t *)dci_pdu)->rep = (rel13->pdsch_reptition_levels-1); + ((DCI6_1B_10MHz_t *)dci_pdu)->harq_pid = rel13->harq_process; + ((DCI6_1B_10MHz_t *)dci_pdu)->ndi = rel13->new_data_indicator; + ((DCI6_1B_10MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset; + ((DCI6_1B_10MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1; + ((DCI6_1B_10MHz_t *)dci_pdu)->padding = 0; + break; + case 100: + dci_alloc->dci_length = sizeof_DCI6_1B_20MHz_t; + ((DCI6_1B_20MHz_t *)dci_pdu)->type = 1; + ((DCI6_1B_20MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding; + ((DCI6_1B_20MHz_t *)dci_pdu)->mcs = rel13->mcs; + ((DCI6_1B_20MHz_t *)dci_pdu)->rep = (rel13->pdsch_reptition_levels-1); + ((DCI6_1B_20MHz_t *)dci_pdu)->harq_pid = rel13->harq_process; + ((DCI6_1B_20MHz_t *)dci_pdu)->ndi = rel13->new_data_indicator; + ((DCI6_1B_20MHz_t *)dci_pdu)->harq_ack_off = rel13->harq_resource_offset; + ((DCI6_1B_20MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1; + ((DCI6_1B_20MHz_t *)dci_pdu)->padding = 0; + break; + } + case 12: // Format 6-2 + dci_alloc->format = format6_2; + dlsch0->active = 1; + switch (fp->N_RB_DL) { + case 25: + dci_alloc->dci_length = sizeof_DCI6_2_5MHz_t; + if (rel13->paging_direct_indication_differentiation_flag==0) { + ((DCI6_2_di_5MHz_t *)dci_pdu)->type = 0; + ((DCI6_2_di_5MHz_t *)dci_pdu)->di_info = rel13->direct_indication; + ((DCI6_2_di_5MHz_t *)dci_pdu)->padding = 0; + } + else { + ((DCI6_2_paging_5MHz_t *)dci_pdu)->type = 1; + ((DCI6_2_paging_5MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding; + ((DCI6_2_paging_5MHz_t *)dci_pdu)->mcs = rel13->mcs; + ((DCI6_2_paging_5MHz_t *)dci_pdu)->rep = (rel13->pdsch_reptition_levels-1); + ((DCI6_2_paging_5MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1; + ((DCI6_2_paging_5MHz_t *)dci_pdu)->padding = 0; + } + + break; + case 50: + dci_alloc->dci_length = sizeof_DCI6_2_10MHz_t; + if (rel13->paging_direct_indication_differentiation_flag==0) { + ((DCI6_2_di_10MHz_t *)dci_pdu)->type = 0; + ((DCI6_2_di_10MHz_t *)dci_pdu)->di_info = rel13->direct_indication; + ((DCI6_2_di_10MHz_t *)dci_pdu)->padding = 0; + } + else { + ((DCI6_2_paging_10MHz_t *)dci_pdu)->type = 1; + ((DCI6_2_paging_10MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding; + ((DCI6_2_paging_10MHz_t *)dci_pdu)->mcs = rel13->mcs; + ((DCI6_2_paging_10MHz_t *)dci_pdu)->rep = (rel13->pdsch_reptition_levels-1); + ((DCI6_2_paging_10MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1; + ((DCI6_2_paging_10MHz_t *)dci_pdu)->padding = 0; + } + + break; + case 100: + dci_alloc->dci_length = sizeof_DCI6_2_20MHz_t; + if (rel13->paging_direct_indication_differentiation_flag==0) { + ((DCI6_2_di_20MHz_t *)dci_pdu)->type = 0; + ((DCI6_2_di_20MHz_t *)dci_pdu)->di_info = rel13->direct_indication; + ((DCI6_2_di_20MHz_t *)dci_pdu)->padding = 0; + } + else { + ((DCI6_2_paging_20MHz_t *)dci_pdu)->type = 1; + ((DCI6_2_paging_20MHz_t *)dci_pdu)->rballoc = rel13->resource_block_coding; + ((DCI6_2_paging_20MHz_t *)dci_pdu)->mcs = rel13->mcs; + ((DCI6_2_paging_20MHz_t *)dci_pdu)->rep = (rel13->pdsch_reptition_levels-1); + ((DCI6_2_paging_20MHz_t *)dci_pdu)->dci_rep = rel13->dci_subframe_repetition_number-1; + ((DCI6_2_paging_20MHz_t *)dci_pdu)->padding = 0; + } + + break; + } + } + AssertFatal(rel13->harq_process<8, + "ERROR: Format 6_1A: harq_pid=%d >= 8\n", rel13->harq_process); + + dlsch0_harq = dlsch0->harq_processes[rel13->harq_process]; + dlsch0_harq->codeword=0; + + // printf("DCI: Setting subframe_tx for subframe %d\n",subframe); + dlsch0->subframe_tx[subframe] = 1; + + conv_eMTC_rballoc(rel13->resource_block_coding, + fp->N_RB_DL, + dlsch0_harq->rb_alloc); + + dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rel13->resource_block_coding&31]; // this is the 6PRB RIV + + + dlsch0_harq->rvidx = rel13->redundancy_version; + + dlsch0_harq->Nl = 1; + // dlsch[0]->layer_index = 0; + // if (beamforming_mode == 0) + dlsch0_harq->mimo_mode = (fp->nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI; + //else if (beamforming_mode == 7) + // dlsch0_harq->mimo_mode = TM7; + //else + //LOG_E(PHY,"Invalid beamforming mode %dL\n", beamforming_mode); + + dlsch0_harq->dl_power_off = 1; + + dlsch0->active = 1; + dlsch0->harq_mask |= (1<harq_process); + + + if (dlsch0_harq->round == 0) { + dlsch0_harq->status = ACTIVE; + // printf("Setting DLSCH process %d to ACTIVE\n",rel8->harq_process); + // MCS and TBS don't change across HARQ rounds + dlsch0_harq->mcs = rel13->mcs; + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + + } + + dlsch0->harq_ids[subframe] = rel13->harq_process; + + + + dlsch0->rnti = rel13->rnti; + + + + + + + +} + +void fill_dci0(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc, + DCI_ALLOC_t *dci_alloc,nfapi_hi_dci0_dci_pdu *pdu) +{ + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + + uint32_t cqi_req = pdu->dci_pdu_rel8.cqi_csi_request; + uint32_t dai = pdu->dci_pdu_rel8.dl_assignment_index; + uint32_t cshift = pdu->dci_pdu_rel8.cyclic_shift_2_for_drms; + uint32_t TPC = pdu->dci_pdu_rel8.tpc; + uint32_t mcs = pdu->dci_pdu_rel8.mcs_1; + uint32_t hopping = pdu->dci_pdu_rel8.frequency_hopping_enabled_flag; + uint32_t rballoc = computeRIV(frame_parms->N_RB_DL, + pdu->dci_pdu_rel8.resource_block_start, + pdu->dci_pdu_rel8.number_of_resource_block); + + uint32_t ndi = pdu->dci_pdu_rel8.new_data_indication_1; + +#ifdef T_TRACER + T(T_ENB_PHY_ULSCH_UE_DCI, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), + T_INT(pdu->dci_pdu_rel8.rnti), T_INT(((frame*10+subframe+4) % 8) /* TODO: correct harq pid */), + T_INT(mcs), T_INT(-1 /* TODO: remove round? */), + T_INT(pdu->dci_pdu_rel8.resource_block_start), + T_INT(pdu->dci_pdu_rel8.number_of_resource_block), + T_INT(get_TBS_UL(mcs, pdu->dci_pdu_rel8.number_of_resource_block) * 8), + T_INT(pdu->dci_pdu_rel8.aggregation_level), + T_INT(pdu->dci_pdu_rel8.cce_index)); +#endif + + void *dci_pdu = (void*)dci_alloc->dci_pdu; + + LOG_D(PHY,"SFN/SF:%04d%d DCI0[rnti %x cqi %d mcs %d hopping %d rballoc %x (%d,%d) ndi %d TPC %d cshift %d]\n", + frame,subframe, + pdu->dci_pdu_rel8.rnti,cqi_req, mcs,hopping,rballoc, + pdu->dci_pdu_rel8.resource_block_start, + pdu->dci_pdu_rel8.number_of_resource_block, ndi,TPC,cshift); + + dci_alloc->format = format0; + dci_alloc->firstCCE = pdu->dci_pdu_rel8.cce_index; + dci_alloc->L = pdu->dci_pdu_rel8.aggregation_level; + dci_alloc->rnti = pdu->dci_pdu_rel8.rnti; + dci_alloc->ra_flag = 0; + + switch (frame_parms->N_RB_DL) { + case 6: + if (frame_parms->frame_type == TDD) { + ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req; + ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->dai = dai; + ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->cshift = cshift; + ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC = TPC; + ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs = mcs; + ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi = ndi; + ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc; + ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping; + ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->type = 0; + ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->padding = 0; + dci_alloc->dci_length = sizeof_DCI0_1_5MHz_TDD_1_6_t; + } else { + ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cqi_req = cqi_req; + ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cshift = cshift; + ((DCI0_1_5MHz_FDD_t *)dci_pdu)->TPC = TPC; + ((DCI0_1_5MHz_FDD_t *)dci_pdu)->mcs = mcs; + ((DCI0_1_5MHz_FDD_t *)dci_pdu)->ndi = ndi; + ((DCI0_1_5MHz_FDD_t *)dci_pdu)->rballoc = rballoc; + ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping = hopping; + ((DCI0_1_5MHz_FDD_t *)dci_pdu)->type = 0; + ((DCI0_1_5MHz_FDD_t *)dci_pdu)->padding = 0; + dci_alloc->dci_length = sizeof_DCI0_1_5MHz_FDD_t; + } + + break; + + case 25: + if (frame_parms->frame_type == TDD) { + ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req; + ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->dai = dai; + ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift = cshift; + ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->TPC = TPC; + ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->mcs = mcs; + ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->ndi = ndi; + ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc; + ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping; + ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->type = 0; + ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->padding = 0; + dci_alloc->dci_length = sizeof_DCI0_5MHz_TDD_1_6_t; + } else { + ((DCI0_5MHz_FDD_t *)dci_pdu)->cqi_req = cqi_req; + ((DCI0_5MHz_FDD_t *)dci_pdu)->cshift = cshift; + ((DCI0_5MHz_FDD_t *)dci_pdu)->TPC = TPC; + ((DCI0_5MHz_FDD_t *)dci_pdu)->mcs = mcs; + ((DCI0_5MHz_FDD_t *)dci_pdu)->ndi = ndi; + ((DCI0_5MHz_FDD_t *)dci_pdu)->rballoc = rballoc; + ((DCI0_5MHz_FDD_t *)dci_pdu)->hopping = hopping; + ((DCI0_5MHz_FDD_t *)dci_pdu)->type = 0; + ((DCI0_5MHz_FDD_t *)dci_pdu)->padding = 0; + dci_alloc->dci_length = sizeof_DCI0_5MHz_FDD_t; + } + + break; + + case 50: + if (frame_parms->frame_type == TDD) { + ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req; + ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->dai = dai; + ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->cshift = cshift; + ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->TPC = TPC; + ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->mcs = mcs; + ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->ndi = ndi; + ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc; + ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping; + ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->type = 0; + ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->padding = 0; + dci_alloc->dci_length = sizeof_DCI0_10MHz_TDD_1_6_t; + } else { + ((DCI0_10MHz_FDD_t *)dci_pdu)->cqi_req = cqi_req; + ((DCI0_10MHz_FDD_t *)dci_pdu)->cshift = cshift; + ((DCI0_10MHz_FDD_t *)dci_pdu)->TPC = TPC; + ((DCI0_10MHz_FDD_t *)dci_pdu)->mcs = mcs; + ((DCI0_10MHz_FDD_t *)dci_pdu)->ndi = ndi; + ((DCI0_10MHz_FDD_t *)dci_pdu)->rballoc = rballoc; + ((DCI0_10MHz_FDD_t *)dci_pdu)->hopping = hopping; + ((DCI0_10MHz_FDD_t *)dci_pdu)->type = 0; + ((DCI0_10MHz_FDD_t *)dci_pdu)->padding = 0; + dci_alloc->dci_length = sizeof_DCI0_10MHz_FDD_t; + } + + break; + + case 100: + if (frame_parms->frame_type == TDD) { + ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->cqi_req = cqi_req; + ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->dai = dai; + ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->cshift = cshift; + ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->TPC = TPC; + ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->mcs = mcs; + ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->ndi = ndi; + ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->rballoc = rballoc; + ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->hopping = hopping; + ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->type = 0; + ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->padding = 0; + + dci_alloc->dci_length = sizeof_DCI0_20MHz_TDD_1_6_t; + } else { + ((DCI0_20MHz_FDD_t *)dci_pdu)->cqi_req = cqi_req; + ((DCI0_20MHz_FDD_t *)dci_pdu)->cshift = cshift; + ((DCI0_20MHz_FDD_t *)dci_pdu)->TPC = TPC; + ((DCI0_20MHz_FDD_t *)dci_pdu)->mcs = mcs; + ((DCI0_20MHz_FDD_t *)dci_pdu)->ndi = ndi; + ((DCI0_20MHz_FDD_t *)dci_pdu)->rballoc = rballoc; + ((DCI0_20MHz_FDD_t *)dci_pdu)->hopping = hopping; + ((DCI0_20MHz_FDD_t *)dci_pdu)->type = 0; + ((DCI0_20MHz_FDD_t *)dci_pdu)->padding = 0; + dci_alloc->dci_length = sizeof_DCI0_20MHz_FDD_t; + } + + //printf("eNB: rb_alloc (20 MHz dci) %d\n",rballoc); + break; + + default: + LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL); + DevParam (frame_parms->N_RB_DL, 0, 0); + break; + } +} + +void fill_ulsch(PHY_VARS_eNB *eNB,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame,int subframe) +{ + uint8_t harq_pid; + uint8_t UE_id; + boolean_t new_ulsch = (find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST)==-1) ? TRUE : FALSE; + + AssertFatal((UE_id=find_ulsch(ulsch_pdu->ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0, + "No existing/free UE ULSCH for rnti %x\n",ulsch_pdu->ulsch_pdu_rel8.rnti); + + LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id]; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + + int use_srs = 0; + + harq_pid = ulsch_pdu->ulsch_pdu_rel8.harq_process_number; + + ulsch->harq_mask |= 1 << harq_pid; + + ulsch->harq_processes[harq_pid]->frame = frame; + ulsch->harq_processes[harq_pid]->subframe = subframe; + ulsch->harq_processes[harq_pid]->handled = 0; + + ulsch->harq_processes[harq_pid]->first_rb = ulsch_pdu->ulsch_pdu_rel8.resource_block_start; + ulsch->harq_processes[harq_pid]->nb_rb = ulsch_pdu->ulsch_pdu_rel8.number_of_resource_blocks; + + AssertFatal(ulsch->harq_processes[harq_pid]->nb_rb>0,"nb_rb = 0\n"); + + ulsch->harq_processes[harq_pid]->dci_alloc = 1; + ulsch->harq_processes[harq_pid]->rar_alloc = 0; + ulsch->harq_processes[harq_pid]->n_DMRS = ulsch_pdu->ulsch_pdu_rel8.cyclic_shift_2_for_drms; + + ulsch->harq_processes[harq_pid]->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1); + ulsch->harq_processes[harq_pid]->srs_active = use_srs; + + //Mapping of cyclic shift field in DCI format0 to n_DMRS2 (3GPP 36.211, Table 5.5.2.1.1-1) + if(ulsch->harq_processes[harq_pid]->n_DMRS == 0) + ulsch->harq_processes[harq_pid]->n_DMRS2 = 0; + else if(ulsch->harq_processes[harq_pid]->n_DMRS == 1) + ulsch->harq_processes[harq_pid]->n_DMRS2 = 6; + else if(ulsch->harq_processes[harq_pid]->n_DMRS == 2) + ulsch->harq_processes[harq_pid]->n_DMRS2 = 3; + else if(ulsch->harq_processes[harq_pid]->n_DMRS == 3) + ulsch->harq_processes[harq_pid]->n_DMRS2 = 4; + else if(ulsch->harq_processes[harq_pid]->n_DMRS == 4) + ulsch->harq_processes[harq_pid]->n_DMRS2 = 2; + else if(ulsch->harq_processes[harq_pid]->n_DMRS == 5) + ulsch->harq_processes[harq_pid]->n_DMRS2 = 8; + else if(ulsch->harq_processes[harq_pid]->n_DMRS == 6) + ulsch->harq_processes[harq_pid]->n_DMRS2 = 10; + else if(ulsch->harq_processes[harq_pid]->n_DMRS == 7) + ulsch->harq_processes[harq_pid]->n_DMRS2 = 9; + + LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d, Subframe %d Programming PUSCH with n_DMRS2 %d (cshift %d) ulsch:ndi:%d ulsch_pdu:ndi:%d new_ulsch:%d status:%d\n", + eNB->Mod_id,harq_pid,frame,subframe, + ulsch->harq_processes[harq_pid]->n_DMRS2, + ulsch->harq_processes[harq_pid]->n_DMRS, + ulsch->harq_processes[harq_pid]->ndi, ulsch_pdu->ulsch_pdu_rel8.new_data_indication, new_ulsch, ulsch->harq_processes[harq_pid]->status); + + ulsch->harq_processes[harq_pid]->rvidx = ulsch_pdu->ulsch_pdu_rel8.redundancy_version; + ulsch->harq_processes[harq_pid]->Qm = ulsch_pdu->ulsch_pdu_rel8.modulation_type; + // Set O_ACK to 0 by default, will be set of DLSCH is scheduled and needs to be + ulsch->harq_processes[harq_pid]->O_ACK = 0; + + if ((ulsch->harq_processes[harq_pid]->status == SCH_IDLE) || + (ulsch->harq_processes[harq_pid]->ndi != ulsch_pdu->ulsch_pdu_rel8.new_data_indication) || + (new_ulsch == TRUE)){ + ulsch->harq_processes[harq_pid]->status = ACTIVE; + + ulsch->harq_processes[harq_pid]->TBS = ulsch_pdu->ulsch_pdu_rel8.size<<3; + + ulsch->harq_processes[harq_pid]->Msc_initial = 12*ulsch_pdu->ulsch_pdu_rel8.number_of_resource_blocks; + ulsch->harq_processes[harq_pid]->Nsymb_initial = ulsch->harq_processes[harq_pid]->Nsymb_pusch; + ulsch->harq_processes[harq_pid]->round = 0; + ulsch->harq_processes[harq_pid]->ndi = ulsch_pdu->ulsch_pdu_rel8.new_data_indication; + // note here, the CQI bits need to be kept constant as in initial transmission + // set to 0 in initial transmission, and don't touch them during retransmissions + // will be set if MAC has activated ULSCH_CQI_RI_PDU or ULSCH_CQI_HARQ_RI_PDU + ulsch->harq_processes[harq_pid]->Or1 = 0; + ulsch->harq_processes[harq_pid]->Or2 = 0; + } + else ulsch->harq_processes[harq_pid]->round++; + + ulsch->rnti = ulsch_pdu->ulsch_pdu_rel8.rnti; + LOG_D(PHY,"Filling ULSCH %x (UE_id %d) (new_ulsch %d) for Frame %d, Subframe %d : harq_pid %d, status %d, handled %d, first_rb %d, nb_rb %d, rvidx %d, Qm %d, TBS %d, round %d \n", + ulsch->rnti, + UE_id, + new_ulsch, + frame, + subframe, + harq_pid, + ulsch->harq_processes[harq_pid]->status, + ulsch->harq_processes[harq_pid]->handled, + ulsch->harq_processes[harq_pid]->first_rb, + ulsch->harq_processes[harq_pid]->nb_rb, + ulsch->harq_processes[harq_pid]->rvidx, + ulsch->harq_processes[harq_pid]->Qm, + ulsch->harq_processes[harq_pid]->TBS, + ulsch->harq_processes[harq_pid]->round); +} int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) { - - switch (dci->format) { case format0: // This is an UL SCH allocation so nothing here, inform MAC @@ -3073,48 +3091,48 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) case 6: LOG_D(PHY,"DCI format1C (1.5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]); LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n", - ((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT6[conv_1C_RIV(((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,6)]); + ((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT6[conv_1C_RIV(((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,6)]); LOG_D(PHY,"MCS %d\n",((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->mcs); break; - + case 25: LOG_D(PHY,"DCI format1C (5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]); LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[conv_1C_RIV(((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,25)]); LOG_D(PHY,"MCS %d\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->mcs); break; - + case 50: LOG_D(PHY,"DCI format1C (10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]); LOG_D(PHY,"Ngap %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->Ngap); LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,50)]); LOG_D(PHY,"MCS %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->mcs); break; - + case 100: LOG_D(PHY,"DCI format1C (20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]); LOG_D(PHY,"Ngap %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->Ngap); LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,100)]); LOG_D(PHY,"MCS %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->mcs); break; - - + + default: LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL); DevParam (frame_parms->N_RB_DL, 0, 0); break; } - + break; - + case format2: if ((frame_parms->frame_type == TDD) && (frame_parms->tdd_config>0)) { - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { switch(frame_parms->N_RB_DL) { case 6: - LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc, @@ -3133,7 +3151,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3152,7 +3170,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3171,7 +3189,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3194,10 +3212,10 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) DevParam (frame_parms->N_RB_DL, 0, 0); break; } - } else if (frame_parms->nb_antennas_tx == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { switch(frame_parms->N_RB_DL) { case 6: - LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc, @@ -3216,7 +3234,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3235,7 +3253,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3254,7 +3272,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2 2 antennas (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, TPC %d, dai %d, tb_swap %d, tpmi %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3279,7 +3297,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) } } } else if (frame_parms->frame_type == FDD) { - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { switch(frame_parms->N_RB_DL) { case 6: LOG_D(PHY,"DCI format2 2 antennas (FDD, 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", @@ -3299,7 +3317,9 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2 2 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + + LOG_D(PHY,"DCI format2 2 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, swap %d, TPMI %d, TPC %d\n", + dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3317,7 +3337,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2 2 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + LOG_D(PHY,"DCI format2 2 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3335,7 +3355,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2 2 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + LOG_D(PHY,"DCI format2 2 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3357,7 +3377,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) DevParam (frame_parms->N_RB_DL, 0, 0); break; } - } else if (frame_parms->nb_antennas_tx == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { switch(frame_parms->N_RB_DL) { case 6: @@ -3378,7 +3398,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2 4 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + LOG_D(PHY,"DCI format2 4 antennas (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3396,7 +3416,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2 4 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + LOG_D(PHY,"DCI format2 4 antennas (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3414,7 +3434,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2 4 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", + LOG_D(PHY,"DCI format2 4 antennas (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d|%d, harq_pid %d, ndi %d|%d, RV %d|%d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint32_t*)&dci->dci_pdu)[0], ((DCI2_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3448,7 +3468,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) if ((frame_parms->frame_type == TDD) && (frame_parms->tdd_config>0)) { - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { switch(frame_parms->N_RB_DL) { case 6: LOG_D(PHY,"DCI format2A 2 antennas (FDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", @@ -3469,7 +3489,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2A 2 antennas (FDD 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3487,7 +3507,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2A 2 antennas (FDD 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3505,7 +3525,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2A 2 antennas (FDD 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3527,10 +3547,10 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) DevParam (frame_parms->N_RB_DL, 0, 0); break; } - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { switch(frame_parms->N_RB_DL) { case 6: - LOG_D(PHY,"DCI format2A 4 antennas (TDD 1.5 MHz), rnti %x (%llx): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (TDD 1.5 MHz), rnti %x (%"PRIu64"): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc, @@ -3549,7 +3569,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2A 4 antennas (TDD 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (TDD 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3568,7 +3588,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2A 4 antennas (TDD 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (TDD 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3587,7 +3607,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2A 4 antennas (TDD 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (TDD 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah, @@ -3612,7 +3632,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) } } } else if (frame_parms->frame_type == FDD) { - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { switch(frame_parms->N_RB_DL) { case 6: LOG_D(PHY,"DCI format2A 2 antennas (FDD, 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", @@ -3631,7 +3651,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2A 2 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3648,7 +3668,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2A 2 antennas (FDD, 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD, 10 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3665,7 +3685,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2A 2 antennas (FDD, 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 2 antennas (FDD, 20 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3686,11 +3706,11 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) DevParam (frame_parms->N_RB_DL, 0, 0); break; } - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (frame_parms->nb_antenna_ports_eNB == 4) { switch(frame_parms->N_RB_DL) { case 6: - LOG_D(PHY,"DCI format2A 4 antennas (FDD, 1.5 MHz), rnti %x (%llx): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 1.5 MHz), rnti %x (%"PRIu64"): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc, @@ -3707,7 +3727,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 25: - LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3725,7 +3745,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3743,7 +3763,7 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 100: - LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", + LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%"PRIu64"): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n", dci->rnti, ((uint64_t*)&dci->dci_pdu)[0], ((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah, @@ -3799,1084 +3819,577 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) return(0); } +void extract_dci1A_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted) +{ + uint8_t harq_pid=0; + uint32_t rballoc=0; + uint8_t vrb_type=0; + uint8_t mcs=0; + uint8_t rv=0; + uint8_t ndi=0; + uint8_t TPC=0; -int generate_ue_dlsch_params_from_dci(int frame, - uint8_t subframe, - void *dci_pdu, - uint16_t rnti, - DCI_format_t dci_format, - LTE_UE_DLSCH_t **dlsch, - LTE_DL_FRAME_PARMS *frame_parms, - PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, - uint16_t si_rnti, - uint16_t ra_rnti, - uint16_t p_rnti) + uint8_t dai=0; + + switch (N_RB_DL) { + case 6: + if (frame_type == TDD) { + vrb_type = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; + rv = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv; + ndi = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi; + TPC = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; + dai = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->dai; + // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } else { + vrb_type = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv; + ndi = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->ndi; + TPC = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid; + //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } + break; + + case 25: + + if (frame_type == TDD) { + vrb_type = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; + rv = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv; + ndi = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->ndi; + TPC = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; + dai = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->dai; + //printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } else { + vrb_type = ((DCI1A_5MHz_FDD_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv; + ndi = ((DCI1A_5MHz_FDD_t *)dci_pdu)->ndi; + TPC = ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid; + //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } + + break; + + case 50: + if (frame_type == TDD) { + vrb_type = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc; + rv = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv; + ndi = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->ndi; + TPC = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid; + dai = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->dai; + // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } else { + vrb_type = ((DCI1A_10MHz_FDD_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv; + ndi = ((DCI1A_10MHz_FDD_t *)dci_pdu)->ndi; + TPC = ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid; + //printf("FDD 1A: mcs %d, vrb_type %d, rballoc %x,ndi %d, rv %d, TPC %d\n",mcs,vrb_type,rballoc,ndi,rv,TPC); + } + break; + + case 100: + if (frame_type == TDD) { + vrb_type = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc; + rv = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv; + ndi = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->ndi; + TPC = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid; + dai = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->dai; + // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } else { + vrb_type = ((DCI1A_20MHz_FDD_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv; + ndi = ((DCI1A_20MHz_FDD_t *)dci_pdu)->ndi; + TPC = ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid; + //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } + break; + } + + pdci_info_extarcted->vrb_type = vrb_type; + pdci_info_extarcted->mcs1 = mcs; + pdci_info_extarcted->rballoc = rballoc; + pdci_info_extarcted->rv1 = rv; + pdci_info_extarcted->ndi1 = ndi; + pdci_info_extarcted->TPC = TPC; + pdci_info_extarcted->harq_pid = harq_pid; + pdci_info_extarcted->dai = dai; +} + +void extract_dci1C_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted) { - uint8_t harq_pid=0; - uint32_t rballoc=0,RIV_max=0; - uint8_t frame_type=frame_parms->frame_type; - uint8_t vrb_type=0; - uint8_t mcs=0,mcs1=0,mcs2=0; - uint8_t rv=0,rv1=0,rv2=0; - uint8_t ndi=0,ndi1=0,ndi2=0; - uint8_t rah=0; - uint8_t TPC=0; - uint8_t NPRB=0,tbswap=0,tpmi=0; - uint8_t Ngap; - LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL; - LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq; + uint32_t rballoc=0; + uint8_t mcs=0; -#ifdef DEBUG_DCI - LOG_D(PHY,"dci_tools.c: Filling ue dlsch params -> rnti %x, dci_format %d\n",rnti,dci_format); -#endif + switch (N_RB_DL) { + case 6: + mcs = ((DCI1C_5MHz_t *)dci_pdu)->mcs; + rballoc = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc,6); - switch (dci_format) { + break; - case format0: // This is an ULSCH allocation so nothing here, inform MAC - LOG_E(PHY,"format0 not possible\n"); - return(-1); - break; + case 25: + mcs = ((DCI1C_5MHz_t *)dci_pdu)->mcs; + rballoc = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc,6); - case format1A: + break; - switch (frame_parms->N_RB_DL) { - case 6: - if (frame_type == TDD) { - vrb_type = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi; - TPC = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } else { - vrb_type = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->ndi; - TPC = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid; - //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } + case 50: + mcs = ((DCI1C_10MHz_t *)dci_pdu)->mcs; + rballoc = conv_1C_RIV(((DCI1C_10MHz_t *)dci_pdu)->rballoc,6); - if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) { // - harq_pid = 0; - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - // see 36-212 V8.6.0 p. 45 - NPRB = (TPC&1) + 2; - } else { + break; - if (harq_pid>1) { - LOG_E(PHY,"Format 1A: harq_pid > 1\n"); - return(-1); + case 100: + mcs = ((DCI1C_20MHz_t *)dci_pdu)->mcs; + rballoc = conv_1C_RIV(((DCI1C_20MHz_t *)dci_pdu)->rballoc,6); + break; + + default: + AssertFatal(0,"Format 1C: Unknown N_RB_DL %d\n",N_RB_DL); + break; } - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - NPRB = RIV2nb_rb_LUT6[rballoc]; - dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3]; - } + pdci_info_extarcted->mcs1 = mcs; + pdci_info_extarcted->rballoc = rballoc; +} - if (vrb_type == LOCALIZED) { - dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT6[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT6[rballoc]; - } - else { - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT6[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT6[rballoc]; - } - dlsch0_harq->vrb_type = vrb_type; +void extract_dci1_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted) +{ + uint32_t rballoc=0; + uint8_t mcs=0; + uint8_t rah=0; + uint8_t rv=0; + uint8_t TPC=0; + uint8_t ndi=0; + uint8_t harq_pid=0; - dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB; - RIV_max = RIV_max6; + switch (N_RB_DL) { + case 6: + if (frame_type == TDD) { + mcs = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rah; + rv = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rv; + TPC = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->TPC; + ndi = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->ndi; + harq_pid = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->harq_pid; + } else { + mcs = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->mcs; + rah = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rah; + rballoc = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rv; + TPC = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->TPC; + ndi = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->ndi; + harq_pid = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->harq_pid; + } - break; + break; case 25: - - if (frame_type == TDD) { - vrb_type = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->ndi; - TPC = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - //printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } else { - vrb_type = ((DCI1A_5MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_5MHz_FDD_t *)dci_pdu)->ndi; - TPC = ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid; - //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } - - if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) { // - harq_pid = 0; - // see 36-212 V8.6.0 p. 45 - NPRB = (TPC&1) + 2; - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - } else { - - if (harq_pid>1) { - LOG_E(PHY,"Format 1A: harq_pid > 1\n"); - return(-1); + if (frame_type == TDD) { + mcs = ((DCI1_5MHz_TDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1_5MHz_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI1_5MHz_TDD_t *)dci_pdu)->rah; + rv = ((DCI1_5MHz_TDD_t *)dci_pdu)->rv; + TPC = ((DCI1_5MHz_TDD_t *)dci_pdu)->TPC; + ndi = ((DCI1_5MHz_TDD_t *)dci_pdu)->ndi; + harq_pid = ((DCI1_5MHz_TDD_t *)dci_pdu)->harq_pid; + } else { + mcs = ((DCI1_5MHz_FDD_t *)dci_pdu)->mcs; + rah = ((DCI1_5MHz_FDD_t *)dci_pdu)->rah; + rballoc = ((DCI1_5MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1_5MHz_FDD_t *)dci_pdu)->rv; + TPC = ((DCI1_5MHz_FDD_t *)dci_pdu)->TPC; + ndi = ((DCI1_5MHz_FDD_t *)dci_pdu)->ndi; + harq_pid = ((DCI1_5MHz_FDD_t *)dci_pdu)->harq_pid; } - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - NPRB = RIV2nb_rb_LUT25[rballoc]; - dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3]; - } - - if (vrb_type == LOCALIZED) { - dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT25[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT25[rballoc]; - } - else { - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT25[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT25[rballoc]; - } - dlsch0_harq->vrb_type = vrb_type; - dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc]; - RIV_max = RIV_max25; - - break; + break; case 50: - if (frame_type == TDD) { - vrb_type = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->ndi; - TPC = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } else { - vrb_type = ((DCI1A_10MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_10MHz_FDD_t *)dci_pdu)->ndi; - TPC = ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid; - //printf("FDD 1A: mcs %d, vrb_type %d, rballoc %x,ndi %d, rv %d, TPC %d\n",mcs,vrb_type,rballoc,ndi,rv,TPC); - } - - if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) { // - harq_pid = 0; - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - // see 36-212 V8.6.0 p. 45 - NPRB = (TPC&1) + 2; - } else { - - if (harq_pid>1) { - LOG_E(PHY,"Format 1A: harq_pid > 1\n"); - return(-1); + if (frame_type == TDD) { + mcs = ((DCI1_10MHz_TDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1_10MHz_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI1_10MHz_TDD_t *)dci_pdu)->rah; + rv = ((DCI1_10MHz_TDD_t *)dci_pdu)->rv; + TPC = ((DCI1_10MHz_TDD_t *)dci_pdu)->TPC; + ndi = ((DCI1_10MHz_TDD_t *)dci_pdu)->ndi; + harq_pid = ((DCI1_10MHz_TDD_t *)dci_pdu)->harq_pid; + } else { + mcs = ((DCI1_10MHz_FDD_t *)dci_pdu)->mcs; + rah = ((DCI1_10MHz_FDD_t *)dci_pdu)->rah; + rballoc = ((DCI1_10MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1_10MHz_FDD_t *)dci_pdu)->rv; + TPC = ((DCI1_10MHz_FDD_t *)dci_pdu)->TPC; + ndi = ((DCI1_10MHz_FDD_t *)dci_pdu)->ndi; + harq_pid = ((DCI1_10MHz_FDD_t *)dci_pdu)->harq_pid; } - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - NPRB = RIV2nb_rb_LUT50[rballoc]; - dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3]; - } - - if (vrb_type == LOCALIZED) { - dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT50_1[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_odd[1] = localRIV2alloc_LUT50_1[rballoc]; - // printf("rballoc: %08x.%08x\n",dlsch0_harq->rb_alloc_even[0],dlsch0_harq->rb_alloc_even[1]); - } else { // DISTRIBUTED - if ((rballoc&(1<<10)) == 0) { - rballoc = rballoc&(~(1<<10)); - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc]; - } - else { - rballoc = rballoc&(~(1<<10)); - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc]; - } - } - dlsch0_harq->vrb_type = vrb_type; - - dlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB; - RIV_max = RIV_max50; - break; + break; case 100: - if (frame_type == TDD) { - vrb_type = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->ndi; - TPC = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } else { - vrb_type = ((DCI1A_20MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_20MHz_FDD_t *)dci_pdu)->ndi; - TPC = ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid; - //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } - - if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) { // - harq_pid = 0; - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - // see 36-212 V8.6.0 p. 45 - NPRB = (TPC&1) + 2; - } else { - - if (harq_pid>1) { - LOG_E(PHY,"Format 1A: harq_pid > 1\n"); - return(-1); + if (frame_type == TDD) { + mcs = ((DCI1_20MHz_TDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1_20MHz_TDD_t *)dci_pdu)->rballoc; + rah = ((DCI1_20MHz_TDD_t *)dci_pdu)->rah; + rv = ((DCI1_20MHz_TDD_t *)dci_pdu)->rv; + TPC = ((DCI1_20MHz_TDD_t *)dci_pdu)->TPC; + ndi = ((DCI1_20MHz_TDD_t *)dci_pdu)->ndi; + harq_pid = ((DCI1_20MHz_TDD_t *)dci_pdu)->harq_pid; + } else { + mcs = ((DCI1_20MHz_FDD_t *)dci_pdu)->mcs; + rah = ((DCI1_20MHz_FDD_t *)dci_pdu)->rah; + rballoc = ((DCI1_20MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1_20MHz_FDD_t *)dci_pdu)->rv; + TPC = ((DCI1_20MHz_FDD_t *)dci_pdu)->TPC; + ndi = ((DCI1_20MHz_FDD_t *)dci_pdu)->ndi; + harq_pid = ((DCI1_20MHz_FDD_t *)dci_pdu)->harq_pid; } - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - NPRB = RIV2nb_rb_LUT100[rballoc]; - dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3]; - } - - if (vrb_type == LOCALIZED) { - dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT50_1[rballoc]; - dlsch0_harq->rb_alloc_even[2] = localRIV2alloc_LUT100_2[rballoc]; - dlsch0_harq->rb_alloc_even[3] = localRIV2alloc_LUT100_3[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_odd[1] = localRIV2alloc_LUT50_1[rballoc]; - dlsch0_harq->rb_alloc_odd[2] = localRIV2alloc_LUT100_2[rballoc]; - dlsch0_harq->rb_alloc_odd[3] = localRIV2alloc_LUT100_3[rballoc]; - } else { - if ((rballoc&(1<<10)) == 0) { //Gap 1 - rballoc = rballoc&(~(1<<12)); - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc]; - dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc]; - dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc]; - dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap0_odd_LUT100_2[rballoc]; - dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap0_odd_LUT100_3[rballoc]; - } - else { //Gap 2 - rballoc = rballoc&(~(1<<12)); - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT50_1[rballoc]; - dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc]; - dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT50_1[rballoc]; - dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap1_odd_LUT100_2[rballoc]; - dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap1_odd_LUT100_3[rballoc]; - } - } - dlsch0_harq->vrb_type = vrb_type; - - dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB; - RIV_max = RIV_max100; - break; + break; } - if (rballoc>RIV_max) { - LOG_E(PHY,"Format 1A: rb_alloc > RIV_max\n"); - return(-1); - } + pdci_info_extarcted->mcs1 = mcs; + pdci_info_extarcted->rah = rah; + pdci_info_extarcted->rballoc = rballoc; + pdci_info_extarcted->rv1 = rv; + pdci_info_extarcted->TPC = TPC; + pdci_info_extarcted->ndi1 = ndi; + pdci_info_extarcted->harq_pid = harq_pid; - if (NPRB==0) { - LOG_E(PHY,"Format 1A: NPRB=0\n"); - return(-1); - } +} - // change the mcs limit from 7 to 8, supported by MAC - /* if (mcs > 10) { - LOG_E(PHY,"Format 1A: subframe %d unlikely mcs for format 1A (%d), TPC %d rv %d\n",subframe,mcs,TPC,rv); - return(-1); - }*/ +void extract_dci2_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, uint8_t nb_antenna_ports_eNB, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted) +{ - if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) { // - // if ((dlsch0_harq->round == 4) || ( { - dlsch0_harq->round = 0; - dlsch0_harq->first_tx = 1; - // } + uint32_t rballoc=0; + uint8_t rah=0; + uint8_t mcs1=0; + uint8_t mcs2=0; + uint8_t rv1=0; + uint8_t rv2=0; + uint8_t ndi1=0; + uint8_t ndi2=0; + uint8_t tbswap=0; + uint8_t tpmi=0; + uint8_t harq_pid=0; + uint8_t TPC=0; - // if (dlsch0_harq->round == 0) - // ndi = 1-dlsch0_harq->DCINdi; - } + switch (N_RB_DL) { - dlsch[0]->current_harq_pid = harq_pid; - - dlsch0_harq->rvidx = rv; - dlsch0_harq->Nl = 1; - // dlsch[0]->layer_index = 0; - dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI; - dlsch0_harq->dl_power_off = 1; //no power offset - - LOG_D(PHY,"UE (%x/%d): Subframe %d Format1A DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d, round %d\n", - dlsch[0]->rnti, - harq_pid, - subframe, - ndi, - dlsch0_harq->DCINdi, - dlsch0_harq->first_tx, - dlsch0_harq->status, - dlsch0_harq->round); - if ((ndi!=dlsch0_harq->DCINdi)|| // DCI has been toggled or this is the first transmission - (dlsch0_harq->first_tx==1)) { - dlsch0_harq->round = 0; - - if (dlsch0_harq->first_tx==1) { - //LOG_I(PHY,"[PDSCH %x/%d] Format 1A DCI First TX: Clearing flag\n"); - dlsch0_harq->first_tx = 0; - } - } - - dlsch0_harq->DCINdi = ndi; - - dlsch0_harq->mcs = mcs; - if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) { - dlsch0_harq->TBS = TBStable[mcs][NPRB-1]; - dlsch0_harq->Qm = 2; - } - else { - dlsch0_harq->TBS = TBStable[get_I_TBS(mcs)][NPRB-1]; - dlsch0_harq->Qm = get_Qm(mcs); - } - dlsch[0]->rnti = rnti; - dlsch[0]->active = 1; - dlsch0 = dlsch[0]; - //printf("Format 1A: harq_pid %d, nb_rb %d, round %d\n",harq_pid,dlsch0_harq->nb_rb,dlsch0_harq->round); - break; - - case format1C: - - harq_pid = 0; - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - - switch (frame_parms->N_RB_DL) { case 6: - mcs = ((DCI1C_1_5MHz_t *)dci_pdu)->mcs; - rballoc = conv_1C_RIV(((DCI1C_1_5MHz_t *)dci_pdu)->rballoc,6); - dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc]; - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT6[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT6[rballoc]; - RIV_max = RIV_max6; + if (nb_antenna_ports_eNB == 2) { + if (frame_type == TDD) { + rah = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi2; + } else { + rah = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi2; + } + } else if (nb_antenna_ports_eNB == 4) { + if (frame_type == TDD) { + rah = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->ndi2; + } else { + rah = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->ndi2; + } + } else { + LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",nb_antenna_ports_eNB); + } - break; + break; case 25: - mcs = ((DCI1C_5MHz_t *)dci_pdu)->mcs; - rballoc = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc,25); - dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc]; - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT25[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT25[rballoc]; - RIV_max = RIV_max25; + if (nb_antenna_ports_eNB == 2) { + if (frame_type == TDD) { + rah = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi2; + } else { + rah = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->ndi2; + } + } else if (nb_antenna_ports_eNB == 4) { + if (frame_type == TDD) { + rah = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->ndi2; + } else { + rah = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->ndi2; + } + } else { + LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",nb_antenna_ports_eNB); + } - // printf("Format1C : %x : mcs %d, rballoc %d=>%d=>%x\n",((uint32_t*)dci_pdu)[0], - // mcs,((DCI1C_5MHz_t *)dci_pdu)->rballoc,rballoc,dlsch0_harq->rb_alloc_even[0]); - break; + break; case 50: - mcs = ((DCI1C_10MHz_t *)dci_pdu)->mcs; - rballoc = conv_1C_RIV(((DCI1C_10MHz_t *)dci_pdu)->rballoc,50); - Ngap = ((DCI1C_10MHz_t *)dci_pdu)->Ngap; - dlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rballoc]; - if (Ngap == 0) { - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc]; - dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc]; - } - else { - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT50_0[rballoc]; - dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT50_1[rballoc]; - dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT50_1[rballoc]; - } - RIV_max = RIV_max50; + if (nb_antenna_ports_eNB == 2) { + if (frame_type == TDD) { + rah = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->ndi2; + } else { + rah = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->ndi2; + } + } else if (nb_antenna_ports_eNB == 4) { + if (frame_type == TDD) { + rah = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->ndi2; + } else { + rah = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->ndi2; + } + } else { + LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",nb_antenna_ports_eNB); + } - break; + break; case 100: - mcs = ((DCI1C_20MHz_t *)dci_pdu)->mcs; - rballoc = conv_1C_RIV(((DCI1C_20MHz_t *)dci_pdu)->rballoc,100); - Ngap = ((DCI1C_20MHz_t *)dci_pdu)->Ngap; - dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc]; - if (Ngap==0) { - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT100_0[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT100_0[rballoc]; - dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT100_1[rballoc]; - dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT100_1[rballoc]; - dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc]; - dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap0_odd_LUT100_2[rballoc]; - dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc]; - dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap0_odd_LUT100_3[rballoc]; - } - else { - dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT100_0[rballoc]; - dlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT100_0[rballoc]; - dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT100_1[rballoc]; - dlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT100_1[rballoc]; - dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc]; - dlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap1_odd_LUT100_2[rballoc]; - dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc]; - dlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap1_odd_LUT100_3[rballoc]; - } - RIV_max = RIV_max100; - /* - printf("Format1C : %x : mcs %d, rballoc %d=>%d=>(%08x.%08x.%08x.%08x), Ngap %d\n",((uint32_t*)dci_pdu)[0], - mcs,((DCI1C_20MHz_t *)dci_pdu)->rballoc,rballoc, - dlsch0_harq->rb_alloc_even[0], - dlsch0_harq->rb_alloc_even[1], - dlsch0_harq->rb_alloc_even[2], - dlsch0_harq->rb_alloc_even[3], - Ngap - ); - */ - break; - - default: - LOG_E(PHY,"Format 1C: Unknown N_RB_DL %d\n",frame_parms->N_RB_DL); - return(-1); - break; - } - if (rballoc>RIV_max) { - LOG_E(PHY,"Format 1C: rb_alloc > RIV_max\n"); - return(-1); + if (nb_antenna_ports_eNB == 2) { + if (frame_type == TDD) { + rah = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->ndi2; + } else { + rah = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->ndi2; + } + } else if (nb_antenna_ports_eNB == 4) { + if (frame_type == TDD) { + rah = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->ndi2; + } else { + rah = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rah; + mcs1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs1; + mcs2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs2; + rballoc = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rballoc; + rv1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv1; + rv2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv2; + harq_pid = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->harq_pid; + tbswap = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tb_swap; + tpmi = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->TPC; + ndi1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->ndi1; + ndi2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->ndi2; + } + } else { + LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",nb_antenna_ports_eNB); + } + + break; } - dlsch0_harq->round = 0; - dlsch0_harq->first_tx = 1; - dlsch0_harq->vrb_type = DISTRIBUTED; - dlsch[0]->current_harq_pid = harq_pid; + pdci_info_extarcted->rah = rah; + pdci_info_extarcted->mcs1 = mcs1; + pdci_info_extarcted->mcs2 = mcs2; + pdci_info_extarcted->rv1 = rv1; + pdci_info_extarcted->rv2 = rv2; + pdci_info_extarcted->harq_pid = harq_pid; + pdci_info_extarcted->rballoc = rballoc; + pdci_info_extarcted->tb_swap = tbswap; + pdci_info_extarcted->tpmi = tpmi; + pdci_info_extarcted->TPC = TPC; + pdci_info_extarcted->ndi1 = ndi1; + pdci_info_extarcted->ndi2 = ndi2; - if (rnti==si_rnti) { // rule from Section 5.3.1 of 36.321 - if (((frame&1) == 0) && (subframe == 5)) - dlsch0_harq->rvidx = (((3*((frame>>1)&3))+1)>>1)&3; // SIB1 - else - dlsch0_harq->rvidx = (((3*(subframe&3))+1)>>1)&3; // other SIBs - } - else if ((rnti==p_rnti) || (rnti==ra_rnti)) { // Section 7.1.7.3 - dlsch0_harq->rvidx = 0; - } +} +void extract_dci2A_info(uint8_t N_RB_DL, lte_frame_type_t frame_type, uint8_t nb_antenna_ports_eNB, void *dci_pdu, DCI_INFO_EXTRACTED_t *pdci_info_extarcted) +{ - dlsch0_harq->Nl = 1; - dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI; - dlsch0_harq->dl_power_off = 1; //no power offset + uint32_t rballoc=0; + uint8_t rah=0; + uint8_t mcs1=0; + uint8_t mcs2=0; + uint8_t rv1=0; + uint8_t rv2=0; + uint8_t ndi1=0; + uint8_t ndi2=0; + uint8_t tbswap=0; + uint8_t tpmi=0; + uint8_t harq_pid=0; + uint8_t TPC=0; - LOG_D(PHY,"UE (%x/%d): Subframe %d Format1C DCI: harq_status %d, round %d\n", - dlsch[0]->rnti, - harq_pid, - subframe, - dlsch0_harq->status, - dlsch0_harq->round); - - dlsch0_harq->mcs = mcs; - - dlsch0_harq->TBS = TBStable1C[mcs]; - dlsch0_harq->Qm = 2; - dlsch[0]->rnti = rnti; - dlsch[0]->active = 1; - dlsch0 = dlsch[0]; - break; - - case format1: - - switch (frame_parms->N_RB_DL) { - case 6: - if (frame_type == TDD) { - mcs = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rah; - rv = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rv; - TPC = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->TPC; - ndi = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->ndi; - harq_pid = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->mcs; - rah = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rah; - rballoc = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rv; - TPC = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->TPC; - ndi = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->ndi; - harq_pid = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - - case 25: - if (frame_type == TDD) { - mcs = ((DCI1_5MHz_TDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1_5MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI1_5MHz_TDD_t *)dci_pdu)->rah; - rv = ((DCI1_5MHz_TDD_t *)dci_pdu)->rv; - TPC = ((DCI1_5MHz_TDD_t *)dci_pdu)->TPC; - ndi = ((DCI1_5MHz_TDD_t *)dci_pdu)->ndi; - harq_pid = ((DCI1_5MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs = ((DCI1_5MHz_FDD_t *)dci_pdu)->mcs; - rah = ((DCI1_5MHz_FDD_t *)dci_pdu)->rah; - rballoc = ((DCI1_5MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1_5MHz_FDD_t *)dci_pdu)->rv; - TPC = ((DCI1_5MHz_FDD_t *)dci_pdu)->TPC; - ndi = ((DCI1_5MHz_FDD_t *)dci_pdu)->ndi; - harq_pid = ((DCI1_5MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - - case 50: - if (frame_type == TDD) { - mcs = ((DCI1_10MHz_TDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1_10MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI1_10MHz_TDD_t *)dci_pdu)->rah; - rv = ((DCI1_10MHz_TDD_t *)dci_pdu)->rv; - TPC = ((DCI1_10MHz_TDD_t *)dci_pdu)->TPC; - ndi = ((DCI1_10MHz_TDD_t *)dci_pdu)->ndi; - harq_pid = ((DCI1_10MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs = ((DCI1_10MHz_FDD_t *)dci_pdu)->mcs; - rah = ((DCI1_10MHz_FDD_t *)dci_pdu)->rah; - rballoc = ((DCI1_10MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1_10MHz_FDD_t *)dci_pdu)->rv; - TPC = ((DCI1_10MHz_FDD_t *)dci_pdu)->TPC; - ndi = ((DCI1_10MHz_FDD_t *)dci_pdu)->ndi; - harq_pid = ((DCI1_10MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - - case 100: - if (frame_type == TDD) { - mcs = ((DCI1_20MHz_TDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1_20MHz_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI1_20MHz_TDD_t *)dci_pdu)->rah; - rv = ((DCI1_20MHz_TDD_t *)dci_pdu)->rv; - TPC = ((DCI1_20MHz_TDD_t *)dci_pdu)->TPC; - ndi = ((DCI1_20MHz_TDD_t *)dci_pdu)->ndi; - harq_pid = ((DCI1_20MHz_TDD_t *)dci_pdu)->harq_pid; - } else { - mcs = ((DCI1_20MHz_FDD_t *)dci_pdu)->mcs; - rah = ((DCI1_20MHz_FDD_t *)dci_pdu)->rah; - rballoc = ((DCI1_20MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1_20MHz_FDD_t *)dci_pdu)->rv; - TPC = ((DCI1_20MHz_FDD_t *)dci_pdu)->TPC; - ndi = ((DCI1_20MHz_FDD_t *)dci_pdu)->ndi; - harq_pid = ((DCI1_20MHz_FDD_t *)dci_pdu)->harq_pid; - } - - break; - } - - if (harq_pid>=8) { - LOG_E(PHY,"Format 1: harq_pid >= 8\n"); - return(-1); - } - - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3]; - - dlsch[0]->current_harq_pid = harq_pid; - dlsch[0]->harq_ack[subframe].harq_id = harq_pid; - - conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch0_harq->rb_alloc_even); - dlsch0_harq->rb_alloc_odd[0]= dlsch0_harq->rb_alloc_even[0]; - dlsch0_harq->rb_alloc_odd[1]= dlsch0_harq->rb_alloc_even[1]; - dlsch0_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_even[2]; - dlsch0_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_even[3]; - - dlsch0_harq->nb_rb = conv_nprb(rah, - rballoc, - frame_parms->N_RB_DL); - - NPRB = dlsch0_harq->nb_rb; - - // printf("test PDSCH NPRB %d, rah %d, rballoc %x, rballoc2 %x\n",NPRB,rah,rballoc,dlsch0_harq->rb_alloc[0]); - - if (NPRB==0) { - LOG_E(PHY,"Format 1: NPRB=0 (rballoc %x,mcs %d, frame_type %d N_RB_DL %d)\n",rballoc,mcs,frame_parms->frame_type,frame_parms->N_RB_DL); - return(-1); - } - - // printf("NPRB %d\n",NPRB); - dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3]; - - if (TPC!=1) - LOG_D(PHY,"format1 TPC %d, dlsch0_harq->delta_PUCCH %d\n",TPC,dlsch0_harq->delta_PUCCH); - - dlsch0_harq->rvidx = rv; - - dlsch0_harq->Nl = 1; - // dlsch[0]->layer_index = 0; - - dlsch0_harq->dl_power_off = 1; //no power offset - - LOG_D(PHY,"UE (%x/%d): Subframe %d Format1 DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi, - dlsch0_harq->first_tx,dlsch0_harq->status); - - // printf("Format2 DCI (UE, hard pid %d): ndi %d, old_ndi %d (first tx %d)\n",harq_pid,ndi,dlsch0_harq->DCINdi, - // dlsch0_harq->first_tx); - - if ((ndi!=dlsch0_harq->DCINdi)|| - (dlsch0_harq->first_tx==1)) { - // printf("Rate: setting round to zero (ndi %d, DCINdi %d,first_tx %d)\n",ndi,dlsch0_harq->DCINdi,dlsch0_harq->first_tx); - dlsch0_harq->round=0; - dlsch0_harq->status = ACTIVE; - dlsch0_harq->DCINdi = ndi; - - if (dlsch0_harq->first_tx==1) { - LOG_D(PHY,"[PDSCH %x/%d] Format 1 DCI First TX: Clearing flag\n"); - dlsch0_harq->first_tx = 0; - } - } else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, - // this happens if either another harq process in the same - // is NAK or an ACK was not received - - dlsch[0]->harq_ack[subframe].ack = 1; - dlsch[0]->harq_ack[subframe].harq_id = harq_pid; - dlsch[0]->harq_ack[subframe].send_harq_status = 1; - dlsch[0]->active = 0; - // printf("Got NDI=0 for correctly decoded SDU (harq_pid %d) subframe %d\n",harq_pid,subframe); - return(0); - } - - dlsch0_harq->mcs = mcs; - - dlsch0_harq->TBS = TBStable[get_I_TBS(mcs)][NPRB-1]; - if (mcs <= 28) - dlsch0_harq->Qm = get_Qm(mcs); - else if (mcs<=31) - dlsch0_harq->Qm = (mcs-28)<<1; - else - LOG_E(PHY,"invalid mcs %d\n",mcs); - // msg("test: MCS %d, NPRB %d, TBS %d\n",mcs,NPRB,dlsch0_harq->TBS); - dlsch[0]->current_harq_pid = harq_pid; - - dlsch[0]->active = 1; - - dlsch[0]->rnti = rnti; - - dlsch0_harq->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; - - dlsch0 = dlsch[0]; - - break; - - case format2: - switch (frame_parms->N_RB_DL) { + AssertFatal( (nb_antenna_ports_eNB == 2) || (nb_antenna_ports_eNB == 4), "unsupported nb_antenna_ports_eNB %d\n", nb_antenna_ports_eNB); + switch (N_RB_DL) { case 6: - if (frame_parms->nb_antennas_tx_eNB == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tpmi; - } - } else if (frame_parms->nb_antennas_tx_eNB == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc; - rv1 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi; - } - } else { - LOG_E(PHY,"UE: subframe %d Format2 DCI: unsupported number of TX antennas %d\n",subframe,frame_parms->nb_antennas_tx_eNB); - } - - break; - - case 25: - if (frame_parms->nb_antennas_tx_eNB == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi; - } - } else if (frame_parms->nb_antennas_tx_eNB == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_5MHz_4A_FDD_t *)dci_pdu)->tpmi; - } - } else { - LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB); - } - - break; - - case 50: - if (frame_parms->nb_antennas_tx_eNB == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tpmi; - } - } else if (frame_parms->nb_antennas_tx_eNB == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_10MHz_4A_FDD_t *)dci_pdu)->tpmi; - } - } else { - LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB); - } - - break; - - case 100: - if (frame_parms->nb_antennas_tx_eNB == 2) { - if (frame_type == TDD) { - mcs1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tpmi; - } - } else if (frame_parms->nb_antennas_tx_eNB == 4) { - if (frame_type == TDD) { - mcs1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->tpmi; - } else { - mcs1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs1; - mcs2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->mcs2; - rballoc = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rballoc; - rah = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rah; - rv1 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv1; - rv2 = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->rv2; - harq_pid = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->harq_pid; - tbswap = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tb_swap; - tpmi = ((DCI2_20MHz_4A_FDD_t *)dci_pdu)->tpmi; - } - } else { - LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB); - } - - break; - } - - if (harq_pid>=8) { - LOG_E(PHY,"Format 2_2A: harq_pid >= 8\n"); - return(-1); - } - - - dlsch[0]->current_harq_pid = harq_pid; - dlsch[0]->harq_ack[subframe].harq_id = harq_pid; - - tbswap = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; - - if (tbswap == 0) { - dlsch0 = dlsch[0]; - dlsch1 = dlsch[1]; - } else { - dlsch0 = dlsch[1]; - dlsch1 = dlsch[0]; - } - - dlsch0_harq = dlsch0->harq_processes[harq_pid]; - dlsch1_harq = dlsch1->harq_processes[harq_pid]; - conv_rballoc(rah, - rballoc, - frame_parms->N_RB_DL, - dlsch0_harq->rb_alloc_even); - - dlsch0_harq->rb_alloc_odd[0]= dlsch0_harq->rb_alloc_even[0]; - dlsch0_harq->rb_alloc_odd[1]= dlsch0_harq->rb_alloc_even[1]; - dlsch0_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_even[2]; - dlsch0_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_even[3]; - - dlsch1_harq->rb_alloc_even[0] = dlsch0_harq->rb_alloc_even[0]; - dlsch1_harq->rb_alloc_even[1] = dlsch0_harq->rb_alloc_even[1]; - dlsch1_harq->rb_alloc_even[2] = dlsch0_harq->rb_alloc_even[2]; - dlsch1_harq->rb_alloc_even[3] = dlsch0_harq->rb_alloc_even[3]; - dlsch1_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_odd[0]; - dlsch1_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_odd[1]; - dlsch1_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_odd[2]; - dlsch1_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_odd[3]; - - dlsch0_harq->nb_rb = conv_nprb(rah, - rballoc, - frame_parms->N_RB_DL); - dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - - dlsch0_harq->mcs = mcs1; - - dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3]; - /* - if (dlsch0_harq->mcs>20) { - msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs); - return(-1); - } - */ - - dlsch1_harq->mcs = mcs2; - dlsch0_harq->rvidx = rv1; - dlsch1_harq->rvidx = rv2; - - // check if either TB is disabled (see 36-213 V8.6 p. 26) - - if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { - dlsch0_harq->status = DISABLED; - } - - if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { - dlsch1_harq->status = DISABLED; - } - - dlsch0_harq->Nl = 1; - - // dlsch0->layer_index = tbswap; - // dlsch1->layer_index = 1-tbswap; - - switch (tpmi) { - case 0 : - dlsch0_harq->mimo_mode = ALAMOUTI; - break; - - case 1: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0); - break; - - case 2: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1); - break; - - case 3: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2); - break; - - case 4: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3); - break; - - case 5: - dlsch0_harq->mimo_mode = PUSCH_PRECODING0; - // pmi stored from ulsch allocation routine - dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc; - //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc)); - break; - - case 6: - dlsch0_harq->mimo_mode = PUSCH_PRECODING1; - LOG_E(PHY,"Unsupported TPMI\n"); - return(-1); - break; - } - - - if (frame_parms->mode1_flag == 1) - dlsch0_harq->mimo_mode = SISO; - - if (ndi1!=dlsch0_harq->DCINdi) { - dlsch0_harq->round = 0; - dlsch0_harq->status = ACTIVE; - dlsch0_harq->DCINdi = ndi1; - } else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, - // this happens if either another harq process in the same - // is NAK or an ACK was not received - - dlsch0->harq_ack[subframe].ack = 1; - dlsch0->harq_ack[subframe].harq_id = harq_pid; - dlsch0->harq_ack[subframe].send_harq_status = 1; - dlsch0->active = 0; - return(0); - } - - dlsch0_harq->mcs = mcs1; - - if (dlsch0_harq->nb_rb>1) { - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - if (mcs1 <= 28) - dlsch0_harq->Qm = get_Qm(mcs1); - else if (mcs1<=31) - dlsch0_harq->Qm = (mcs1-28)<<1; - else - LOG_E(PHY,"invalid mcs1 %d\n",mcs1); - - } else - dlsch0_harq->TBS =0; - - - /* - if (dlsch0_harq->mcs > 18) - printf("mcs %d, TBS %d\n",dlsch0_harq->mcs,dlsch0_harq->TBS); - */ - - if (dlsch1_harq->DCINdi != ndi2) { - dlsch1_harq->round=0; - dlsch1_harq->status = ACTIVE; - } - - dlsch1_harq->DCINdi = ndi2; - dlsch1_harq->mcs = mcs2; - - if (dlsch1_harq->nb_rb>1) { - dlsch1_harq->TBS = TBStable[dlsch1_harq->mcs][dlsch1_harq->nb_rb-1]; - if (mcs2 <= 28) - dlsch1_harq->Qm = get_Qm(mcs2); - else if (mcs1<=31) - dlsch1_harq->Qm = (mcs2-28)<<1; - else - LOG_E(PHY,"invalid mcs2 %d\n",mcs2); - } else - dlsch1_harq->TBS = 0; - - - dlsch0->rnti = rnti; - dlsch1->rnti = rnti; - - dlsch0_harq->dl_power_off = 0; //no power offset - dlsch1_harq->dl_power_off = 0; //no power offset - - dlsch0->active = 1; - dlsch1->active = 1; - - break; - - case format2A: - - switch (frame_parms->N_RB_DL) { - - case 6: - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (nb_antenna_ports_eNB == 2) { if (frame_type == TDD) { mcs1 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2; @@ -4887,6 +4400,7 @@ int generate_ue_dlsch_params_from_dci(int frame, ndi2 = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->ndi2; harq_pid = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; + TPC = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->TPC; } else { mcs1 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2; @@ -4897,8 +4411,9 @@ int generate_ue_dlsch_params_from_dci(int frame, ndi2 = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->ndi2; harq_pid = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; + TPC = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->TPC; } - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (nb_antenna_ports_eNB == 4) { if (frame_type == TDD) { mcs1 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2; @@ -4910,6 +4425,7 @@ int generate_ue_dlsch_params_from_dci(int frame, harq_pid = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; tpmi = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->TPC; } else { mcs1 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2; @@ -4921,15 +4437,14 @@ int generate_ue_dlsch_params_from_dci(int frame, harq_pid = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; tpmi = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->TPC; } - } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB); } break; case 25: - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (nb_antenna_ports_eNB == 2) { if (frame_type == TDD) { mcs1 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs2; @@ -4941,6 +4456,7 @@ int generate_ue_dlsch_params_from_dci(int frame, ndi2 = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->ndi2; harq_pid = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; + TPC = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->TPC; } else { mcs1 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs2; @@ -4952,8 +4468,9 @@ int generate_ue_dlsch_params_from_dci(int frame, ndi2 = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->ndi2; harq_pid = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->tb_swap; + TPC = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->TPC; } - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (nb_antenna_ports_eNB == 4) { if (frame_type == TDD) { mcs1 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs2; @@ -4966,6 +4483,7 @@ int generate_ue_dlsch_params_from_dci(int frame, harq_pid = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tb_swap; tpmi = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->TPC; } else { mcs1 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs2; @@ -4978,15 +4496,13 @@ int generate_ue_dlsch_params_from_dci(int frame, harq_pid = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tb_swap; tpmi = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->TPC; } - } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB); } - break; case 50: - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (nb_antenna_ports_eNB == 2) { if (frame_type == TDD) { mcs1 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs2; @@ -4998,6 +4514,7 @@ int generate_ue_dlsch_params_from_dci(int frame, ndi2 = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->ndi2; harq_pid = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->tb_swap; + TPC = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->TPC; } else { mcs1 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs2; @@ -5009,8 +4526,9 @@ int generate_ue_dlsch_params_from_dci(int frame, ndi2 = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->ndi2; harq_pid = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->tb_swap; + TPC = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->TPC; } - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (nb_antenna_ports_eNB == 4) { if (frame_type == TDD) { mcs1 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs2; @@ -5023,6 +4541,7 @@ int generate_ue_dlsch_params_from_dci(int frame, harq_pid = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tb_swap; tpmi = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->TPC; } else { mcs1 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs2; @@ -5035,15 +4554,14 @@ int generate_ue_dlsch_params_from_dci(int frame, harq_pid = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tb_swap; tpmi = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->TPC; } - } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB); } break; case 100: - if (frame_parms->nb_antennas_tx_eNB == 2) { + if (nb_antenna_ports_eNB == 2) { if (frame_type == TDD) { mcs1 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs2; @@ -5055,6 +4573,7 @@ int generate_ue_dlsch_params_from_dci(int frame, ndi2 = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->ndi2; harq_pid = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap; + TPC = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->TPC; } else { mcs1 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs2; @@ -5066,8 +4585,9 @@ int generate_ue_dlsch_params_from_dci(int frame, ndi2 = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->ndi2; harq_pid = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->tb_swap; + TPC = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->TPC; } - } else if (frame_parms->nb_antennas_tx_eNB == 4) { + } else if (nb_antenna_ports_eNB == 4) { if (frame_type == TDD) { mcs1 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs2; @@ -5080,6 +4600,7 @@ int generate_ue_dlsch_params_from_dci(int frame, harq_pid = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tb_swap; tpmi = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->TPC; } else { mcs1 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs1; mcs2 = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs2; @@ -5092,116 +4613,1774 @@ int generate_ue_dlsch_params_from_dci(int frame, harq_pid = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->harq_pid; tbswap = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tb_swap; tpmi = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tpmi; + TPC = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->TPC; } - } else { - LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB); } break; } + pdci_info_extarcted->mcs1 = mcs1; + pdci_info_extarcted->mcs2 = mcs2; + pdci_info_extarcted->rballoc = rballoc; + pdci_info_extarcted->rah = rah; + pdci_info_extarcted->rv1 = rv1; + pdci_info_extarcted->rv2 = rv2; + pdci_info_extarcted->ndi1 = ndi1; + pdci_info_extarcted->ndi2 = ndi2; + pdci_info_extarcted->harq_pid = harq_pid; + pdci_info_extarcted->tb_swap = tbswap; + pdci_info_extarcted->TPC = TPC; + pdci_info_extarcted->tpmi = tpmi; +} - if (harq_pid>=8) { - LOG_E(PHY,"ERROR: Format 2_2A: harq_pid >= 8\n"); - return(-1); +int check_dci_format1_1a_coherency(DCI_format_t dci_format, + uint8_t N_RB_DL, + uint16_t rnti, + uint16_t tc_rnti, + uint16_t si_rnti, + uint16_t ra_rnti, + uint16_t p_rnti, + uint32_t frame, + uint8_t subframe, + DCI_INFO_EXTRACTED_t *pdci_info_extarcted, + LTE_DL_UE_HARQ_t *pdlsch0_harq) +{ + uint8_t harq_pid = pdci_info_extarcted->harq_pid; + uint32_t rballoc = pdci_info_extarcted->rballoc; + uint8_t mcs1 = pdci_info_extarcted->mcs1; + uint8_t TPC = pdci_info_extarcted->TPC; + uint8_t rah = pdci_info_extarcted->rah; +#ifdef DEBUG_DCI + uint8_t rv1 = pdci_info_extarcted->rv1; + uint8_t ndi1 = pdci_info_extarcted->ndi1; +#endif + + uint8_t NPRB = 0; + long long int RIV_max = 0; + +#ifdef DEBUG_DCI + LOG_I(PHY,"[DCI-FORMAT-1-1A] AbsSubframe %d.%d dci_format %d\n", frame, subframe, dci_format); + LOG_I(PHY,"[DCI-FORMAT-1-1A] rnti %x\n", rnti); + LOG_I(PHY,"[DCI-FORMAT-1-1A] harq_pid %d\n", harq_pid); + LOG_I(PHY,"[DCI-FORMAT-1-1A] rah %d\n", rah); + LOG_I(PHY,"[DCI-FORMAT-1-1A] rballoc %x\n", rballoc); + LOG_I(PHY,"[DCI-FORMAT-1-1A] mcs1 %d\n", mcs1); + LOG_I(PHY,"[DCI-FORMAT-1-1A] rv1 %d\n", rv1); + LOG_I(PHY,"[DCI-FORMAT-1-1A] ndi1 %d\n", ndi1); + LOG_I(PHY,"[DCI-FORMAT-1-1A] TPC %d\n", TPC); +#endif + + + // I- check dci content minimum coherency + if( ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) && harq_pid > 0) + { + return(0); } - // printf("UE: format 2A, rballoc=%x, harq_pid= %d, mcs1=%d,mcs2=%d, rv1=%d, rv2=%d, ndi1=%d, ndi2=%d\n",rballoc, harq_pid, mcs1,mcs2,rv1,rv2,ndi1,ndi2); + if(harq_pid>=8) + { + LOG_I(PHY,"bad harq id \n"); + return(0); + } - // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0 - // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated - if (tbswap == 0) { + if(dci_format == format1 && ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) ) + { + LOG_I(PHY,"bad dci format \n"); + return(0); + } + + + if( mcs1 > 28) + { + if(pdlsch0_harq->round == 0) + { + LOG_I(PHY,"bad dci mcs + round \n"); + return(0); + } + + if((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) + { + LOG_I(PHY,"bad dci mcs + rnti \n"); + return(0); + } + } + + if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) + { + NPRB = (TPC&1) + 2; + switch (N_RB_DL) { + case 6: + RIV_max = RIV_max6; + break; + case 25: + RIV_max = RIV_max25; + break; + case 50: + RIV_max = RIV_max50; + break; + case 100: + RIV_max = RIV_max100; + break; + } + } + else + { + switch (N_RB_DL) { + case 6: + NPRB = RIV2nb_rb_LUT6[rballoc];//NPRB; + if(rah) + RIV_max = RIV_max6; + else + RIV_max = 0x3F; + break; + case 25: + NPRB = RIV2nb_rb_LUT25[rballoc];//NPRB; + if(rah) + RIV_max = RIV_max25; + else + RIV_max = 0x1FFF; + break; + case 50: + NPRB = RIV2nb_rb_LUT50[rballoc];//NPRB; + if(rah) + RIV_max = RIV_max50; + else + RIV_max = 0x1FFFF; + break; + case 100: + NPRB = RIV2nb_rb_LUT100[rballoc];//NPRB; + if(rah) + RIV_max = RIV_max100; + else + RIV_max = 0x1FFFFFF; + break; + } + } + + + if(dci_format == format1) + { + NPRB = conv_nprb(rah, rballoc, N_RB_DL); + } + + + if(rballoc > RIV_max) + { + LOG_I(PHY,"bad dci rballoc rballoc %d RIV_max %lld \n",rballoc, RIV_max); + // DCI false detection + return(0); + } + + if(NPRB == 0) + { + // DCI false detection + LOG_I(PHY,"bad NPRB = 0 \n"); + return(0); + } + + // this a retransmission + if(pdlsch0_harq->round>0) + { + // compare old TBS to new TBS + if((mcs1<29) && (pdlsch0_harq->TBS != TBStable[get_I_TBS(mcs1)][NPRB-1])) + { + // this is an eNB issue + // retransmisison but old and new TBS are different !!! + // work around, consider it as a new transmission + LOG_E(PHY,"Format1A Retransmission but TBS are different: consider it as new transmission !!! \n"); + pdlsch0_harq->round = 0; + //return(0); // ?? to cross check + } + } + + return(1); +} + +int check_dci_format1c_coherency(uint8_t N_RB_DL, + DCI_INFO_EXTRACTED_t *pdci_info_extarcted, + uint16_t rnti, + uint16_t si_rnti, + uint16_t ra_rnti, + uint16_t p_rnti, + LTE_DL_UE_HARQ_t *pdlsch0_harq) +{ + uint32_t rballoc = pdci_info_extarcted->rballoc; + + uint8_t NPRB = 0; + uint32_t RIV_max = 0; + + // I- check dci content minimum coherency + + if((rnti!=si_rnti) && (rnti!=p_rnti) && (rnti!=ra_rnti)) + return(0); + + switch (N_RB_DL) { + case 6: + NPRB = RIV2nb_rb_LUT6[rballoc];//NPRB; + RIV_max = RIV_max6; + break; + case 25: + NPRB = RIV2nb_rb_LUT25[rballoc];//NPRB; + RIV_max = RIV_max25; + break; + case 50: + NPRB = RIV2nb_rb_LUT50[rballoc];//NPRB; + RIV_max = RIV_max50; + break; + case 100: + NPRB = RIV2nb_rb_LUT100[rballoc];//NPRB; + RIV_max = RIV_max100; + break; + } + + if(rballoc > RIV_max) + { + // DCI false detection + return(0); + } + + if(NPRB == 0) + { + // DCI false detection + return(0); + } + + return(1); +} + +int check_dci_format2_2a_coherency(DCI_format_t dci_format, + uint8_t N_RB_DL, + DCI_INFO_EXTRACTED_t *pdci_info_extarcted, + uint16_t rnti, + uint16_t si_rnti, + uint16_t ra_rnti, + uint16_t p_rnti, + LTE_DL_UE_HARQ_t *pdlsch0_harq, + LTE_DL_UE_HARQ_t *pdlsch1_harq) +{ + uint8_t rah = pdci_info_extarcted->rah; + uint8_t mcs1 = pdci_info_extarcted->mcs1; + uint8_t mcs2 = pdci_info_extarcted->mcs2; + uint8_t rv1 = pdci_info_extarcted->rv1; + uint8_t rv2 = pdci_info_extarcted->rv2; + uint8_t harq_pid = pdci_info_extarcted->harq_pid; + uint32_t rballoc = pdci_info_extarcted->rballoc; + +#ifdef DEBUG_DCI + uint8_t ndi1 = pdci_info_extarcted->ndi1; + uint8_t ndi2 = pdci_info_extarcted->ndi2; +#endif + + uint8_t NPRB = 0; + long long RIV_max = 0; + +#ifdef DEBUG_DCI + LOG_I(PHY, "extarcted dci - dci_format %d \n", dci_format); + LOG_I(PHY, "extarcted dci - rnti %d \n", rnti); + LOG_I(PHY, "extarcted dci - rah %d \n", rah); + LOG_I(PHY, "extarcted dci - mcs1 %d \n", mcs1); + LOG_I(PHY, "extarcted dci - mcs2 %d \n", mcs2); + LOG_I(PHY, "extarcted dci - rv1 %d \n", rv1); + LOG_I(PHY, "extarcted dci - rv2 %d \n", rv2); + //LOG_I(PHY, "extarcted dci - ndi1 %d \n", ndi1); + //LOG_I(PHY, "extarcted dci - ndi2 %d \n", ndi2); + LOG_I(PHY, "extarcted dci - rballoc %x \n", rballoc); + LOG_I(PHY, "extarcted dci - harq pid %d \n", harq_pid); + LOG_I(PHY, "extarcted dci - round0 %d \n", pdlsch0_harq->round); + LOG_I(PHY, "extarcted dci - round1 %d \n", pdlsch1_harq->round); +#endif + + // I- check dci content minimum coherency + if(harq_pid>=8) + { + LOG_I(PHY,"bad harq pid\n"); + return(0); + } + + if( (rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti) ) + { + LOG_I(PHY,"bad rnti\n"); + return(0); + } + + + if( mcs1 > 28) + { + if(pdlsch0_harq->round == 0) + { + LOG_I(PHY,"bad mcs1\n"); + return(0); + } + } + + if( mcs2 > 28) + { + if(pdlsch1_harq->round == 0) + { + LOG_I(PHY,"bad mcs2\n"); + return(0); + } + } + + + if((pdlsch0_harq->round == 0) && (rv1 > 0) && (mcs1 != 0)) + { + // DCI false detection + LOG_I(PHY,"bad rv1\n"); + return(0); + } + + if((pdlsch1_harq->round == 0) && (rv2 > 0) && (mcs2 != 0)) + { + // DCI false detection + LOG_I(PHY,"bad rv2\n"); + return(0); + } + + + switch (N_RB_DL) { + case 6: + if (rah == 0) + { + //RBG = 1; + RIV_max = 0x3F; + } + else + { + RIV_max = RIV_max6; + } + break; + case 25: + if (rah == 0) + { + //RBG = 2; + RIV_max = 0x1FFF; + } + else + { + RIV_max = RIV_max25; + } + break; + case 50: + if (rah == 0) + { + //RBG = 3; + RIV_max = 0x1FFFF; + } + else + { + RIV_max = RIV_max50; + } + break; + case 100: + if (rah == 0) + { + //RBG = 4; + RIV_max = 0x1FFFFFF; + } + else + { + RIV_max = RIV_max100; + } + break; + } + + NPRB = conv_nprb(rah, + rballoc, + N_RB_DL); + + + + if( (rballoc > RIV_max) && (rah == 1) ) + { + // DCI false detection + LOG_I(PHY,"bad rballoc %d RIV_max %lld\n", rballoc, RIV_max); + return(0); + } + + if(NPRB == 0) + { + // DCI false detection + LOG_I(PHY,"bad NPRB\n"); + return(0); + } + + return(1); +} + +void compute_llr_offset(LTE_DL_FRAME_PARMS *frame_parms, + LTE_UE_PDCCH *pdcch_vars, + LTE_UE_PDSCH *pdsch_vars, + LTE_DL_UE_HARQ_t *dlsch0_harq, + uint8_t nb_rb_alloc, + uint8_t subframe) +{ + uint32_t pbch_pss_sss_re; + uint32_t crs_re; + uint32_t granted_re; + uint32_t data_re; + uint32_t llr_offset; + uint8_t symbol; + uint8_t symbol_mod; + + pdsch_vars->llr_offset[pdcch_vars->num_pdcch_symbols] = 0; + + //LOG_I(PHY,"compute_llr_offset: nb RB %d - Qm %d \n", nb_rb_alloc, dlsch0_harq->Qm); + + //dlsch0_harq->rb_alloc_even; + //dlsch0_harq->rb_alloc_odd; + + for(symbol=pdcch_vars->num_pdcch_symbols; symbolsymbols_per_tti; symbol++) + { + symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + if((symbol_mod == 0) || symbol_mod == (4-frame_parms->Ncp)) + { + if (frame_parms->nb_antennas_tx == 2) + crs_re = 4; + else + crs_re = 2; + } + else + { + crs_re = 0; + } + + granted_re = nb_rb_alloc * (12-crs_re); + pbch_pss_sss_re = adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,dlsch0_harq->Qm,subframe,symbol); + pbch_pss_sss_re = (double)pbch_pss_sss_re * ((double)(12-crs_re)/12); + data_re = granted_re - pbch_pss_sss_re; + llr_offset = data_re * dlsch0_harq->Qm * 2; + + pdsch_vars->llr_length[symbol] = data_re; + if(symbol < (frame_parms->symbols_per_tti-1)) + pdsch_vars->llr_offset[symbol+1] = pdsch_vars->llr_offset[symbol] + llr_offset; + + //LOG_I(PHY,"Granted Re subframe %d / symbol %d => %d (%d RBs)\n", subframe, symbol_mod, granted_re,dlsch0_harq->nb_rb); + //LOG_I(PHY,"Pbch/PSS/SSS Re subframe %d / symbol %d => %d \n", subframe, symbol_mod, pbch_pss_sss_re); + //LOG_I(PHY,"CRS Re Per PRB subframe %d / symbol %d => %d \n", subframe, symbol_mod, crs_re); + //LOG_I(PHY,"Data Re subframe %d / symbol %d => %d \n", subframe, symbol_mod, data_re); + + + + //LOG_I(PHY,"Data Re subframe %d-symbol %d => llr length %d, llr offset %d \n", subframe, symbol, + // pdsch_vars->llr_length[symbol], pdsch_vars->llr_offset[symbol]); + } +} +void prepare_dl_decoding_format1_1A(DCI_format_t dci_format, + uint8_t N_RB_DL, + DCI_INFO_EXTRACTED_t *pdci_info_extarcted, + LTE_DL_FRAME_PARMS *frame_parms, + LTE_UE_PDCCH *pdcch_vars, + LTE_UE_PDSCH *pdsch_vars, + uint8_t subframe, + uint16_t rnti, + uint16_t tc_rnti, + uint16_t si_rnti, + uint16_t ra_rnti, + uint16_t p_rnti, + LTE_DL_UE_HARQ_t *pdlsch0_harq, + LTE_UE_DLSCH_t *pdlsch0) +{ + + uint8_t harq_pid = pdci_info_extarcted->harq_pid; + uint8_t vrb_type = pdci_info_extarcted->vrb_type; + uint32_t rballoc = pdci_info_extarcted->rballoc; + uint8_t mcs1 = pdci_info_extarcted->mcs1; + uint8_t rv1 = pdci_info_extarcted->rv1; + uint8_t ndi1 = pdci_info_extarcted->ndi1; + uint8_t TPC = pdci_info_extarcted->TPC; + uint8_t rah = pdci_info_extarcted->rah; + uint8_t dai = pdci_info_extarcted->dai; + + + uint8_t NPRB = 0; + uint8_t NPRB4TBS = 0; + uint8_t nb_rb_alloc = 0; + + if(dci_format == format1A) + { + switch (N_RB_DL) { + case 6: + NPRB = RIV2nb_rb_LUT6[rballoc]; + break; + case 25: + NPRB = RIV2nb_rb_LUT25[rballoc]; + break; + case 50: + NPRB = RIV2nb_rb_LUT50[rballoc]; + break; + case 100: + NPRB = RIV2nb_rb_LUT100[rballoc]; + break; + } + if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) + { + NPRB4TBS = (TPC&1) + 2; + } + else + { + NPRB4TBS = NPRB; + /* + switch (N_RB_DL) { + case 6: + NPRB = RIV2nb_rb_LUT6[rballoc];//NPRB; + break; + case 25: + NPRB = RIV2nb_rb_LUT25[rballoc];//NPRB; + break; + case 50: + NPRB = RIV2nb_rb_LUT50[rballoc];//NPRB; + break; + case 100: + NPRB = RIV2nb_rb_LUT100[rballoc];//NPRB; + break; + } + + */ + nb_rb_alloc = NPRB; + } + } + else // format1 + { + NPRB = conv_nprb(rah, rballoc, N_RB_DL); + NPRB4TBS=NPRB; + nb_rb_alloc = NPRB; + } + + pdlsch0->current_harq_pid = harq_pid; + pdlsch0->active = 1; + pdlsch0->rnti = rnti; + if(dci_format == format1A) + pdlsch0->harq_ack[subframe].vDAI_DL = dai+1; + + if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) + { + pdlsch0_harq->round = 0; + pdlsch0_harq->status = ACTIVE; + } + else //CRNTI + { + if (rnti == tc_rnti) { + //fix for standalone Contention Resolution Id + pdlsch0_harq->DCINdi = (uint8_t)-1; + LOG_D(PHY,"UE (%x/%d): Format1A DCI: C-RNTI is temporary. Set NDI = %d and to be ignored\n", + rnti,harq_pid,pdlsch0_harq->DCINdi); + } + + // NDI has been toggled or this is the first transmission + if ((ndi1!=pdlsch0_harq->DCINdi) || (pdlsch0_harq->first_tx==1)) + { + pdlsch0_harq->round = 0; + pdlsch0_harq->first_tx = 0; + pdlsch0_harq->status = ACTIVE; + + }else if (rv1 != 0 ) + //NDI has not been toggled but rv was increased by eNB: retransmission + { + if (pdlsch0_harq->status == SCH_IDLE) + //packet was actually decoded in previous transmission (ACK was missed by eNB) + //However, the round is not a good check as it might have been decoded in a retransmission prior to this one. + { + LOG_D(PHY,"skip pdsch decoding and report ack\n"); + // skip pdsch decoding and report ack + //pdlsch0_harq->status = SCH_IDLE; + pdlsch0->active = 0; + pdlsch0->harq_ack[subframe].ack = 1; + pdlsch0->harq_ack[subframe].harq_id = harq_pid; + pdlsch0->harq_ack[subframe].send_harq_status = 1; + + //pdlsch0_harq->first_tx = 0; + } + else //normal retransmission + { + // nothing special to do + } + } + else + { + pdlsch0_harq->status = ACTIVE; + } + } + + pdlsch0_harq->DCINdi = ndi1; + pdlsch0_harq->mcs = mcs1; + pdlsch0_harq->rvidx = rv1; + pdlsch0_harq->nb_rb = NPRB; + + pdlsch0_harq->codeword = 0; + pdlsch0_harq->Nl = 1; + pdlsch0_harq->mimo_mode = frame_parms->nb_antenna_ports_eNB == 1 ?SISO : ALAMOUTI; + pdlsch0_harq->dl_power_off = 1; //no power offset + pdlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC &3]; + + // compute resource allocation + if(dci_format == format1A) + { + switch (N_RB_DL) { + case 6: + if (vrb_type == LOCALIZED) { + pdlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT6[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT6[rballoc]; + } + else { + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT6[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT6[rballoc]; + } + break; + + case 25: + if (vrb_type == LOCALIZED) { + pdlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT25[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT25[rballoc]; + } + else { + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT25[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT25[rballoc]; + } + break; + + case 50: + if (vrb_type == LOCALIZED) { + pdlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT50_0[rballoc]; + pdlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT50_1[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT50_0[rballoc]; + pdlsch0_harq->rb_alloc_odd[1] = localRIV2alloc_LUT50_1[rballoc]; + printf("rballoc: %08x.%08x\n",pdlsch0_harq->rb_alloc_even[0],pdlsch0_harq->rb_alloc_even[1]); + } else { // DISTRIBUTED + if ((rballoc&(1<<10)) == 0) { + rballoc = rballoc&(~(1<<10)); + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc]; + pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc]; + pdlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc]; + } + else { + rballoc = rballoc&(~(1<<10)); + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc]; + pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc]; + pdlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc]; + } + } + break; + + case 100: + if (vrb_type == LOCALIZED) { + pdlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT100_0[rballoc]; + pdlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT100_1[rballoc]; + pdlsch0_harq->rb_alloc_even[2] = localRIV2alloc_LUT100_2[rballoc]; + pdlsch0_harq->rb_alloc_even[3] = localRIV2alloc_LUT100_3[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = localRIV2alloc_LUT100_0[rballoc]; + pdlsch0_harq->rb_alloc_odd[1] = localRIV2alloc_LUT100_1[rballoc]; + pdlsch0_harq->rb_alloc_odd[2] = localRIV2alloc_LUT100_2[rballoc]; + pdlsch0_harq->rb_alloc_odd[3] = localRIV2alloc_LUT100_3[rballoc]; + } else { + if ((rballoc&(1<<10)) == 0) { //Gap 1 + rballoc = rballoc&(~(1<<12)); + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT100_0[rballoc]; + pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT100_1[rballoc]; + pdlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc]; + pdlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT100_0[rballoc]; + pdlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT100_1[rballoc]; + pdlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap0_odd_LUT100_2[rballoc]; + pdlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap0_odd_LUT100_3[rballoc]; + } + else { //Gap 2 + rballoc = rballoc&(~(1<<12)); + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT100_0[rballoc]; + pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT100_1[rballoc]; + pdlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc]; + pdlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT100_0[rballoc]; + pdlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT100_1[rballoc]; + pdlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap1_odd_LUT100_2[rballoc]; + pdlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap1_odd_LUT100_3[rballoc]; + } + } + break; + } + } + else // format1 + { + conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,pdlsch0_harq->rb_alloc_even); + pdlsch0_harq->rb_alloc_odd[0]= pdlsch0_harq->rb_alloc_even[0]; + pdlsch0_harq->rb_alloc_odd[1]= pdlsch0_harq->rb_alloc_even[1]; + pdlsch0_harq->rb_alloc_odd[2]= pdlsch0_harq->rb_alloc_even[2]; + pdlsch0_harq->rb_alloc_odd[3]= pdlsch0_harq->rb_alloc_even[3]; + } + if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)) + { + pdlsch0_harq->TBS = TBStable[mcs1][NPRB4TBS-1]; + pdlsch0_harq->Qm = 2; + } + else + { + if(mcs1 < 29) + { + pdlsch0_harq->TBS = TBStable[get_I_TBS(mcs1)][NPRB4TBS-1]; + pdlsch0_harq->Qm = get_Qm(mcs1); + } + } + + compute_llr_offset(frame_parms, + pdcch_vars, + pdsch_vars, + pdlsch0_harq, + nb_rb_alloc, + subframe); +} + +void prepare_dl_decoding_format1C(uint8_t N_RB_DL, + DCI_INFO_EXTRACTED_t *pdci_info_extarcted, + LTE_DL_FRAME_PARMS *frame_parms, + LTE_UE_PDCCH *pdcch_vars, + LTE_UE_PDSCH *pdsch_vars, + uint32_t rnti, + uint32_t si_rnti, + uint32_t ra_rnti, + uint32_t p_rnti, + uint32_t frame, + uint8_t subframe, + LTE_DL_UE_HARQ_t *pdlsch0_harq, + LTE_UE_DLSCH_t *pdlsch0) +{ + + uint8_t harq_pid = pdci_info_extarcted->harq_pid; + uint32_t rballoc = pdci_info_extarcted->rballoc; + uint8_t mcs1 = pdci_info_extarcted->mcs1; + uint8_t Ngap = pdci_info_extarcted->Ngap; + + pdlsch0_harq->round = 0; + pdlsch0_harq->first_tx = 1; + pdlsch0_harq->vrb_type = DISTRIBUTED; + + if (rnti==si_rnti) { // rule from Section 5.3.1 of 36.321 + if (((frame&1) == 0) && (subframe == 5)) + pdlsch0_harq->rvidx = (((3*((frame>>1)&3))+1)>>1)&3; // SIB1 + else + pdlsch0_harq->rvidx = (((3*(subframe&3))+1)>>1)&3; // other SIBs + } + else if ((rnti==p_rnti) || (rnti==ra_rnti)) { // Section 7.1.7.3 + pdlsch0_harq->rvidx = 0; + } + + + pdlsch0_harq->Nl = 1; + pdlsch0_harq->mimo_mode = frame_parms->nb_antenna_ports_eNB == 1 ?SISO : ALAMOUTI; + pdlsch0_harq->dl_power_off = 1; //no power offset + + pdlsch0_harq->codeword = 0; + pdlsch0_harq->mcs = mcs1; + pdlsch0_harq->TBS = TBStable1C[mcs1]; + pdlsch0_harq->Qm = 2; + + + pdlsch0->current_harq_pid = harq_pid; + pdlsch0->active = 1; + pdlsch0->rnti = rnti; + + switch (N_RB_DL) { + case 6: + pdlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc]; + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT6[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT6[rballoc]; + + break; + + case 25: + pdlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc]; + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT25[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_odd_LUT25[rballoc]; + break; + + case 50: + pdlsch0_harq->nb_rb = RIV2nb_rb_LUT50[rballoc]; + if (Ngap == 0) { + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT50_0[rballoc]; + pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc]; + pdlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT50_1[rballoc]; + } + else { + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT50_0[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT50_0[rballoc]; + pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT50_1[rballoc]; + pdlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT50_1[rballoc]; + } + break; + + case 100: + pdlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc]; + if (Ngap==0) { + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT100_0[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap0_odd_LUT100_0[rballoc]; + pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT100_1[rballoc]; + pdlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap0_odd_LUT100_1[rballoc]; + pdlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc]; + pdlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap0_odd_LUT100_2[rballoc]; + pdlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc]; + pdlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap0_odd_LUT100_3[rballoc]; + } + else { + pdlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT100_0[rballoc]; + pdlsch0_harq->rb_alloc_odd[0] = distRIV2alloc_gap1_odd_LUT100_0[rballoc]; + pdlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT100_1[rballoc]; + pdlsch0_harq->rb_alloc_odd[1] = distRIV2alloc_gap1_odd_LUT100_1[rballoc]; + pdlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc]; + pdlsch0_harq->rb_alloc_odd[2] = distRIV2alloc_gap1_odd_LUT100_2[rballoc]; + pdlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc]; + pdlsch0_harq->rb_alloc_odd[3] = distRIV2alloc_gap1_odd_LUT100_3[rballoc]; + } + break; + + default: + AssertFatal(0,"Format 1C: Unknown N_RB_DL %d\n",frame_parms->N_RB_DL); + break; + } + + compute_llr_offset(frame_parms, + pdcch_vars, + pdsch_vars, + pdlsch0_harq, + pdlsch0_harq->nb_rb, + subframe); + +} + +void compute_precoding_info_2cw(uint8_t tpmi, uint8_t tbswap, uint16_t pmi_alloc, LTE_DL_FRAME_PARMS *frame_parms, LTE_DL_UE_HARQ_t *dlsch0_harq, LTE_DL_UE_HARQ_t *dlsch1_harq) +{ + +switch (tpmi) { + case 0: + dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1; + dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0, 1); + dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,0, 1); + break; + case 1: + dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj; + dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1, 1); + dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,1, 1); + break; + case 2: // PUSCH precoding + dlsch0_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING; + dlsch1_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING; + if (tbswap==0){ + dlsch0_harq->pmi_alloc = pmi_alloc; + dlsch1_harq->pmi_alloc = pmi_alloc^0x1555; + } else { + dlsch1_harq->pmi_alloc = pmi_alloc; + dlsch0_harq->pmi_alloc = pmi_alloc^0x1555; + } +#ifdef DEBUG_HARQ + printf ("\n \n compute_precoding_info_2cw pmi_alloc_new = %d\n", dlsch0_harq->pmi_alloc); + #endif + break; + default: + break; + } +} + +void compute_precoding_info_1cw(uint8_t tpmi, uint16_t pmi_alloc, LTE_DL_FRAME_PARMS *frame_parms, LTE_DL_UE_HARQ_t *dlsch_harq) +{ + +switch (tpmi) { + case 0 : + dlsch_harq->mimo_mode = ALAMOUTI; + break; + case 1: + dlsch_harq->mimo_mode = UNIFORM_PRECODING11; + dlsch_harq->pmi_alloc = pmi_extend(frame_parms,0, 0); + break; + case 2: + dlsch_harq->mimo_mode = UNIFORM_PRECODING1m1; + dlsch_harq->pmi_alloc = pmi_extend(frame_parms,1, 0); + break; + case 3: + dlsch_harq->mimo_mode = UNIFORM_PRECODING1j; + dlsch_harq->pmi_alloc = pmi_extend(frame_parms,2, 0); + break; + case 4: + dlsch_harq->mimo_mode = UNIFORM_PRECODING1mj; + dlsch_harq->pmi_alloc = pmi_extend(frame_parms,3, 0); + break; + case 5: + dlsch_harq->mimo_mode = PUSCH_PRECODING0; + dlsch_harq->pmi_alloc = pmi_alloc;//pmi_convert(frame_parms,dlsch0->pmi_alloc,0); + break; + case 6: + dlsch_harq->mimo_mode = PUSCH_PRECODING1; + dlsch_harq->pmi_alloc = pmi_alloc;//pmi_convert(frame_parms,dlsch0->pmi_alloc,1); + break; + } + #ifdef DEBUG_HARQ + printf ("[DCI UE] I am calling from the UE side pmi_alloc_new = %d with tpmi %d\n", dlsch_harq->pmi_alloc, tpmi); + #endif + } + +void compute_precoding_info_format2A(uint8_t tpmi, + uint8_t nb_antenna_ports_eNB, + uint8_t tb0_active, + uint8_t tb1_active, + LTE_DL_UE_HARQ_t *dlsch0_harq, + LTE_DL_UE_HARQ_t *dlsch1_harq) +{ + + dlsch0_harq->dl_power_off = 0; + dlsch1_harq->dl_power_off = 0; + + if (nb_antenna_ports_eNB == 2) { + if ((tb0_active==1) && (tb1_active==1)) { + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; + } else { + dlsch0_harq->mimo_mode = ALAMOUTI; + dlsch1_harq->mimo_mode = ALAMOUTI; + } + } else if (nb_antenna_ports_eNB == 4) { // 4 antenna case + if ((tb0_active==1) && (tb1_active==1)) { + switch (tpmi) { + case 0: // one layer per transport block + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; + break; + + case 1: // one-layers on TB 0, two on TB 1 + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->Nl = 2; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; + break; + + case 2: // two-layers on TB 0, two on TB 1 + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->Nl = 2; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; + break; + + case 3: // + LOG_E(PHY,"Illegal value (3) for TPMI in Format 2A DCI\n"); + break; + } + } else if (tb0_active == 1) { + switch (tpmi) { + case 0: // one layer per transport block + dlsch0_harq->mimo_mode = ALAMOUTI; + dlsch1_harq->mimo_mode = ALAMOUTI; + break; + + case 1: // two-layers on TB 0 + dlsch0_harq->mimo_mode = LARGE_CDD; + dlsch0_harq->Nl = 2; + dlsch0_harq->dl_power_off = 1; + break; + + case 2: // two-layers on TB 0, two on TB 1 + case 3: // + LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); + break; + } + } else if (tb1_active == 1) { + switch (tpmi) { + case 0: // one layer per transport block + dlsch0_harq->mimo_mode = ALAMOUTI; + dlsch1_harq->mimo_mode = ALAMOUTI; + break; + + case 1: // two-layers on TB 0 + dlsch1_harq->mimo_mode = LARGE_CDD; + dlsch1_harq->Nl = 2; + dlsch0_harq->dl_power_off = 1; + break; + + case 2: // two-layers on TB 0, two on TB 1 + case 3: // + LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); + break; + } + } + } + // printf("Format 2A: NPRB=%d (rballoc %x,mcs1 %d, mcs2 %d, frame_type %d N_RB_DL %d,active %d/%d)\n",NPRB,rballoc,mcs1,mcs2,frame_parms->frame_type,frame_parms->N_RB_DL,dlsch0->active,dlsch1->active); + //printf("UE (%x/%d): Subframe %d Format2A DCI: ndi1 %d, old_ndi1 %d, ndi2 %d, old_ndi2 %d (first tx1 %d, first tx2 %d) harq_status1 %d, harq_status2 %d\n",dlsch0->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi, + // dlsch0_harq->first_tx,dlsch1_harq->first_tx,dlsch0_harq->status,dlsch1_harq->status); + //printf("TBS0 %d, TBS1 %d\n",dlsch0_harq->TBS,dlsch1_harq->TBS); + +} + +void prepare_dl_decoding_format2_2A(DCI_format_t dci_format, + DCI_INFO_EXTRACTED_t *pdci_info_extarcted, + LTE_DL_FRAME_PARMS *frame_parms, + LTE_UE_PDCCH *pdcch_vars, + LTE_UE_PDSCH *pdsch_vars, + uint16_t rnti, + uint8_t subframe, + LTE_DL_UE_HARQ_t *dlsch0_harq, + LTE_DL_UE_HARQ_t *dlsch1_harq, + LTE_UE_DLSCH_t *pdlsch0, + LTE_UE_DLSCH_t *pdlsch1) +{ + + uint8_t rah = pdci_info_extarcted->rah; + uint8_t mcs1 = pdci_info_extarcted->mcs1; + uint8_t mcs2 = pdci_info_extarcted->mcs2; + uint8_t rv1 = pdci_info_extarcted->rv1; + uint8_t rv2 = pdci_info_extarcted->rv2; + uint8_t harq_pid = pdci_info_extarcted->harq_pid; + uint32_t rballoc = pdci_info_extarcted->rballoc; + uint8_t tbswap = pdci_info_extarcted->tb_swap; + uint8_t tpmi = pdci_info_extarcted->tpmi; + uint8_t TPC = pdci_info_extarcted->TPC; + uint8_t ndi1 = pdci_info_extarcted->ndi1; + uint8_t ndi2 = pdci_info_extarcted->ndi2; + + uint8_t TB0_active = 1; + uint8_t TB1_active = 1; + + // printf("inside prepare pdlsch1->pmi_alloc %d \n",pdlsch1->pmi_alloc); + + + if ((rv1 == 1) && (mcs1 == 0)) { + TB0_active=0; + } + if ((rv2 == 1) && (mcs2 == 0)) { + TB1_active=0; + } + +#ifdef DEBUG_HARQ + printf("[DCI UE]: TB0 status %d , TB1 status %d\n", TB0_active, TB1_active); +#endif + + dlsch0_harq->mcs = mcs1; + dlsch1_harq->mcs = mcs2; + dlsch0_harq->rvidx = rv1; + dlsch1_harq->rvidx = rv2; + dlsch0_harq->DCINdi = ndi1; + dlsch1_harq->DCINdi = ndi2; + + dlsch0_harq->codeword = 0; + dlsch1_harq->codeword = 1; + dlsch0_harq->Nl = 1; + dlsch1_harq->Nl = 1; + dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + dlsch1_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + dlsch0_harq->dl_power_off = 1; + dlsch1_harq->dl_power_off = 1; + + pdlsch0->current_harq_pid = harq_pid; + pdlsch0->harq_ack[subframe].harq_id = harq_pid; + pdlsch1->current_harq_pid = harq_pid; + pdlsch1->harq_ack[subframe].harq_id = harq_pid; + + // assume two CW are active + dlsch0_harq->status = ACTIVE; + dlsch1_harq->status = ACTIVE; + pdlsch0->active = 1; + pdlsch1->active = 1; + pdlsch0->rnti = rnti; + pdlsch1->rnti = rnti; + + + if (TB0_active && TB1_active && tbswap==1) { + dlsch0_harq->codeword = 1; + dlsch1_harq->codeword = 0; + } + + + if (!TB0_active && TB1_active){ + dlsch1_harq->codeword = 0; + } + + if (TB0_active && !TB1_active){ + dlsch0_harq->codeword = 0; + } + + + if (TB0_active==0) { + dlsch0_harq->status = SCH_IDLE; + pdlsch0->active = 0; + #ifdef DEBUG_HARQ + printf("[DCI UE]: TB0 is deactivated, retransmit TB1 transmit in TM6\n"); + #endif + } + + if (TB1_active==0) { + dlsch1_harq->status = SCH_IDLE; + pdlsch1->active = 0; + } + +#ifdef DEBUG_HARQ + printf("[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status); +#endif + + // compute resource allocation + if (TB0_active == 1){ + + dlsch0_harq->nb_rb = conv_nprb(rah, + rballoc, + frame_parms->N_RB_DL); + conv_rballoc(rah, + rballoc, + frame_parms->N_RB_DL, + dlsch0_harq->rb_alloc_even); + + dlsch0_harq->rb_alloc_odd[0]= dlsch0_harq->rb_alloc_even[0]; + dlsch0_harq->rb_alloc_odd[1]= dlsch0_harq->rb_alloc_even[1]; + dlsch0_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_even[2]; + dlsch0_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_even[3]; + + if (TB1_active == 1){ + dlsch1_harq->rb_alloc_even[0]= dlsch0_harq->rb_alloc_even[0]; + dlsch1_harq->rb_alloc_even[1]= dlsch0_harq->rb_alloc_even[1]; + dlsch1_harq->rb_alloc_even[2]= dlsch0_harq->rb_alloc_even[2]; + dlsch1_harq->rb_alloc_even[3]= dlsch0_harq->rb_alloc_even[3]; + dlsch1_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_odd[0]; + dlsch1_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_odd[1]; + dlsch1_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_odd[2]; + dlsch1_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_odd[3]; + + dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; + + //dlsch0_harq->Nl = 1; + //dlsch1_harq->Nl = 1; + } + } else if ((TB0_active == 0) && (TB1_active == 1)){ + + conv_rballoc(rah, + rballoc, + frame_parms->N_RB_DL, + dlsch1_harq->rb_alloc_even); + + dlsch1_harq->rb_alloc_odd[0]= dlsch1_harq->rb_alloc_even[0]; + dlsch1_harq->rb_alloc_odd[1]= dlsch1_harq->rb_alloc_even[1]; + dlsch1_harq->rb_alloc_odd[2]= dlsch1_harq->rb_alloc_even[2]; + dlsch1_harq->rb_alloc_odd[3]= dlsch1_harq->rb_alloc_even[3]; + dlsch1_harq->nb_rb = conv_nprb(rah, + rballoc, + frame_parms->N_RB_DL); + } + + + // compute precoding matrix + mimo mode + if(dci_format == format2) + { + if ((TB0_active) && (TB1_active)){ //two CW active + compute_precoding_info_2cw(tpmi, tbswap, pdlsch0->pmi_alloc,frame_parms, dlsch0_harq, dlsch1_harq); + + // printf("[DCI UE 1]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status); + } else if ((TB0_active) && (!TB1_active)) { // only CW 0 active + compute_precoding_info_1cw(tpmi, pdlsch0->pmi_alloc, frame_parms, dlsch0_harq); + } else { + compute_precoding_info_1cw(tpmi, pdlsch1->pmi_alloc, frame_parms, dlsch1_harq); + // printf("I am doing compute_precoding_info_1cw with tpmi %d \n", tpmi); + } + //printf(" UE DCI harq0 MIMO mode = %d\n", dlsch0_harq->mimo_mode); + if ((frame_parms->nb_antenna_ports_eNB == 1) && (TB0_active)) + dlsch0_harq->mimo_mode = SISO; + } + else + { + compute_precoding_info_format2A( tpmi, + frame_parms->nb_antenna_ports_eNB, + TB0_active, + TB1_active, + dlsch0_harq, + dlsch1_harq); + } + // printf("[DCI UE 2]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status); + // reset round + compute Qm + if (TB0_active) { + // printf("TB0 ndi1 =%d, dlsch0_harq->DCINdi =%d, dlsch0_harq->first_tx = %d\n", ndi1, dlsch0_harq->DCINdi, dlsch0_harq->first_tx); + if ((ndi1!=dlsch0_harq->DCINdi) || (dlsch0_harq->first_tx==1)) { + dlsch0_harq->round = 0; + dlsch0_harq->status = ACTIVE; + dlsch0_harq->DCINdi = ndi1; + + //LOG_I(PHY,"[UE] DLSCH: New Data Indicator CW0 subframe %d (pid %d, round %d)\n", + // subframe,harq_pid,dlsch0_harq->round); + if ( dlsch0_harq->first_tx==1) { + LOG_D(PHY,"Format 2 DCI First TX0: Clearing flag\n"); + dlsch0_harq->first_tx = 0; + } + } + /*else if (rv1 != 0 ) + //NDI has not been toggled but rv was increased by eNB: retransmission + { + if(dlsch0_harq->status == SCH_IDLE) { + // skip pdsch decoding and report ack + //dlsch0_harq->status = SCH_IDLE; + pdlsch0->active = 0; + pdlsch0->harq_ack[subframe].ack = 1; + pdlsch0->harq_ack[subframe].harq_id = harq_pid; + pdlsch0->harq_ack[subframe].send_harq_status = 1; + }*/ + + // if Imcs in [29..31] TBS is assumed to be as determined from DCI transported in the latest + // PDCCH for the same trasport block using Imcs in [0 .. 28] + if(dlsch0_harq->mcs <= 28) + { + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + LOG_D(PHY,"[UE] DLSCH: New TBS CW0 subframe %d (pid %d, round %d) TBS %d \n", + subframe,harq_pid,dlsch0_harq->round, dlsch0_harq->TBS); + } + else + { + LOG_D(PHY,"[UE] DLSCH: Keep the same TBS CW0 subframe %d (pid %d, round %d) TBS %d \n", + subframe,harq_pid,dlsch0_harq->round, dlsch0_harq->TBS); + } + //if(dlsch0_harq->Nl == 2) + //dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1]; + if (mcs1 <= 28) + dlsch0_harq->Qm = get_Qm(mcs1); + else if (mcs1<=31) + dlsch0_harq->Qm = (mcs1-28)<<1; + } + + // printf("[DCI UE 3]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status); + + if (TB1_active) { + // printf("TB1 ndi2 =%d, dlsch1_harq->DCINdi =%d, dlsch1_harq->first_tx = %d\n", ndi2, dlsch1_harq->DCINdi, dlsch1_harq->first_tx); + if ((ndi2!=dlsch1_harq->DCINdi) || (dlsch1_harq->first_tx==1)) { + dlsch1_harq->round = 0; + dlsch1_harq->status = ACTIVE; + dlsch1_harq->DCINdi = ndi2; + //LOG_I(PHY,"[UE] DLSCH: New Data Indicator CW1 subframe %d (pid %d, round %d)\n", + // subframe,harq_pid,dlsch0_harq->round); + if (dlsch1_harq->first_tx==1) { + LOG_D(PHY,"Format 2 DCI First TX1: Clearing flag\n"); + dlsch1_harq->first_tx = 0; + } + } + /*else if (rv1 != 0 ) + //NDI has not been toggled but rv was increased by eNB: retransmission + { + if(dlsch1_harq->status == SCH_IDLE) { + // skip pdsch decoding and report ack + //dlsch1_harq->status = SCH_IDLE; + pdlsch1->active = 0; + pdlsch1->harq_ack[subframe].ack = 1; + pdlsch1->harq_ack[subframe].harq_id = harq_pid; + pdlsch1->harq_ack[subframe].send_harq_status = 1; + } + }*/ + + // if Imcs in [29..31] TBS is assumed to be as determined from DCI transported in the latest + // PDCCH for the same trasport block using Imcs in [0 .. 28] + if(dlsch1_harq->mcs <= 28) + { + dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; + LOG_D(PHY,"[UE] DLSCH: New TBS CW1 subframe %d (pid %d, round %d) TBS %d \n", + subframe,harq_pid,dlsch1_harq->round, dlsch1_harq->TBS); + } + else + { + LOG_D(PHY,"[UE] DLSCH: Keep the same TBS CW1 subframe %d (pid %d, round %d) TBS %d \n", + subframe,harq_pid,dlsch1_harq->round, dlsch1_harq->TBS); + } + if (mcs2 <= 28) + dlsch1_harq->Qm = get_Qm(mcs2); + else if (mcs1<=31) + dlsch1_harq->Qm = (mcs2-28)<<1; + } + + + compute_llr_offset(frame_parms, + pdcch_vars, + pdsch_vars, + dlsch0_harq, + dlsch0_harq->nb_rb, + subframe); + + + /* #ifdef DEBUG_HARQ + printf("[DCI UE]: dlsch0_harq status %d , dlsch1_harq status %d\n", dlsch0_harq->status, dlsch1_harq->status); + printf("[DCI UE]: TB0_active %d , TB1_active %d\n", TB0_active, TB1_active); + if (dlsch0 != NULL && dlsch1 != NULL) + printf("[DCI UE] dlsch0_harq status = %d, dlsch1_harq status = %d\n", dlsch0_harq->status, dlsch1_harq->status); + else if (dlsch0 == NULL && dlsch1 != NULL) + printf("[DCI UE] dlsch0_harq NULL dlsch1_harq status = %d\n", dlsch1_harq->status); + else if (dlsch0 != NULL && dlsch1 == NULL) + printf("[DCI UE] dlsch1_harq NULL dlsch0_harq status = %d\n", dlsch0_harq->status); + #endif*/ +} + +int generate_ue_dlsch_params_from_dci(int frame, + uint8_t subframe, + void *dci_pdu, + uint16_t rnti, + DCI_format_t dci_format, + LTE_UE_PDCCH *pdcch_vars, + LTE_UE_PDSCH *pdsch_vars, + LTE_UE_DLSCH_t **dlsch, + LTE_DL_FRAME_PARMS *frame_parms, + PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, + uint16_t si_rnti, + uint16_t ra_rnti, + uint16_t p_rnti, + uint8_t beamforming_mode, + uint16_t tc_rnti) +{ + + uint8_t harq_pid=0; + uint8_t frame_type=frame_parms->frame_type; + uint8_t tpmi=0; + LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL; + LTE_DL_UE_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL; + + DCI_INFO_EXTRACTED_t dci_info_extarcted; + uint8_t status=0; + + if (!dlsch[0]) return -1; + + #ifdef DEBUG_DCI + LOG_D(PHY,"dci_tools.c: Filling ue dlsch params -> rnti %x, SFN/SF %d/%d, dci_format %s\n", + rnti, + frame%1024, + subframe, + (dci_format==format0? "Format 0":( + dci_format==format1? "format 1":( + dci_format==format1A? "format 1A":( + dci_format==format1B? "format 1B":( + dci_format==format1C? "format 1C":( + dci_format==format1D? "format 1D":( + dci_format==format1E_2A_M10PRB? "format 1E_2A_M10PRB":( + dci_format==format2? "format 2":( + dci_format==format2A? "format 2A":( + dci_format==format2B? "format 2B":( + dci_format==format2C? "format 2C":( + dci_format==format2D? "format 2D":( + dci_format==format3? "format 3": "UNKNOWN" + )))))))))))))); + #endif + + memset(&dci_info_extarcted,0,sizeof(dci_info_extarcted)); + switch (dci_format) { + + case format0: // This is an ULSCH allocation so nothing here, inform MAC + LOG_E(PHY,"format0 not possible\n"); + return(-1); + break; + + case format1A: + { + // extract dci infomation +#ifdef DEBUG_DCI + LOG_I(PHY,"[DCI-FORMAT-1A] AbsSubframe %d.%d extarct dci info \n", frame, subframe); +#endif + extract_dci1A_info(frame_parms->N_RB_DL, + frame_type, + dci_pdu, + &dci_info_extarcted); + + + // check dci content + dlsch0 = dlsch[0]; + dlsch0->active = 0; + dlsch0_harq = dlsch[0]->harq_processes[dci_info_extarcted.harq_pid]; +#ifdef DEBUG_DCI + LOG_I(PHY,"[DCI-FORMAT-1A] AbsSubframe %d.%d check dci coherency \n", frame, subframe); +#endif + status = check_dci_format1_1a_coherency(format1A, + frame_parms->N_RB_DL, + rnti, + tc_rnti, + si_rnti, + ra_rnti, + p_rnti,frame,subframe, + &dci_info_extarcted, + dlsch0_harq); + if(status == 0) + { + printf("bad DCI 1A !!! \n"); + return(-1); + } + + // dci is correct ==> update internal structure and prepare dl decoding +#ifdef DEBUG_DCI + LOG_I(PHY,"[DCI-FORMAT-1A] AbsSubframe %d.%d prepare dl decoding \n", frame, subframe); +#endif + prepare_dl_decoding_format1_1A(format1A, + frame_parms->N_RB_DL, + &dci_info_extarcted, + frame_parms, + pdcch_vars, + pdsch_vars, + subframe, + rnti, + tc_rnti, + si_rnti, + ra_rnti, + p_rnti, + dlsch0_harq, + dlsch0); + + + + break; + } + case format1C: + { + // extract dci infomation +#ifdef DEBUG_DL_DECODING + LOG_I(PHY,"[DCI Format-1C] extact dci information \n"); +#endif + extract_dci1C_info(frame_parms->N_RB_DL, + frame_type, + dci_pdu, + &dci_info_extarcted); + + + // check dci content +#ifdef DEBUG_DL_DECODING + LOG_I(PHY,"[DCI Format-1C] check dci content \n"); +#endif + dlsch0 = dlsch[0]; + dlsch0->active = 0; + dlsch0_harq = dlsch[0]->harq_processes[dci_info_extarcted.harq_pid]; + + status = check_dci_format1c_coherency(frame_parms->N_RB_DL, + &dci_info_extarcted, + rnti, + si_rnti, + ra_rnti, + p_rnti, + dlsch0_harq); + if(status == 0) + return(-1); + + // dci is correct ==> update internal structure and prepare dl decoding +#ifdef DEBUG_DL_DECODING + LOG_I(PHY,"[DCI Format-1C] prepare downlink decoding \n"); +#endif + prepare_dl_decoding_format1C(frame_parms->N_RB_DL, + &dci_info_extarcted, + frame_parms, + pdcch_vars, + pdsch_vars, + rnti, + si_rnti, + ra_rnti, + p_rnti, + frame, + subframe, + dlsch0_harq, + dlsch0); + + break; + } + + case format1: + { + // extract dci infomation +#ifdef DEBUG_DCI + LOG_I(PHY,"[DCI-FORMAT-1] AbsSubframe %d.%d extarct dci info \n", frame, subframe); +#endif + extract_dci1_info(frame_parms->N_RB_DL, + frame_type, + dci_pdu, + &dci_info_extarcted); + + // check dci content + dlsch0 = dlsch[0]; + dlsch0->active = 0; + dlsch0_harq = dlsch[0]->harq_processes[dci_info_extarcted.harq_pid]; + +#ifdef DEBUG_DCI + LOG_I(PHY,"[DCI-FORMAT-1] AbsSubframe %d.%d check dci coherency \n", frame, subframe); +#endif + status = check_dci_format1_1a_coherency(format1, + frame_parms->N_RB_DL, + rnti, + tc_rnti, + si_rnti, + ra_rnti, + p_rnti,frame,subframe, + &dci_info_extarcted, + dlsch0_harq); + if(status == 0) + { + printf("bad DCI 1 !!! \n"); + return(-1); + } + + + // dci is correct ==> update internal structure and prepare dl decoding +#ifdef DEBUG_DCI + LOG_I(PHY,"[DCI-FORMAT-1] AbsSubframe %d.%d prepare dl decoding \n", frame, subframe); +#endif + prepare_dl_decoding_format1_1A(format1, + frame_parms->N_RB_DL, + &dci_info_extarcted, + frame_parms, + pdcch_vars, + pdsch_vars, + subframe, + rnti, + tc_rnti, + si_rnti, + ra_rnti, + p_rnti, + dlsch0_harq, + dlsch0); + break; + } + + case format2: + { + // extract dci infomation + //LOG_I(PHY,"[DCI-format2] AbsSubframe %d.%d extract dci infomation \n", frame, subframe); + extract_dci2_info(frame_parms->N_RB_DL, + frame_type, + frame_parms->nb_antenna_ports_eNB, + dci_pdu, + &dci_info_extarcted); + + + // check dci content + dlsch[0]->active = 1; + dlsch[1]->active = 1; + + dlsch0 = dlsch[0]; + dlsch1 = dlsch[1]; + + dlsch0_harq = dlsch0->harq_processes[dci_info_extarcted.harq_pid]; + dlsch1_harq = dlsch1->harq_processes[dci_info_extarcted.harq_pid]; + // printf("before coherency dlsch[1]->pmi_alloc %d\n",dlsch[1]->pmi_alloc); + // printf("before coherency dlsch1->pmi_alloc %d\n",dlsch1->pmi_alloc); + // printf("before coherency dlsch1_harq->pmi_alloc %d\n",dlsch1_harq->pmi_alloc); + + //LOG_I(PHY,"[DCI-format2] check dci content \n"); + status = check_dci_format2_2a_coherency(format2, + frame_parms->N_RB_DL, + &dci_info_extarcted, + rnti, + si_rnti, + ra_rnti, + p_rnti, + dlsch0_harq, + dlsch1_harq); + if(status == 0) + return(-1); + + + // dci is correct ==> update internal structure and prepare dl decoding + //LOG_I(PHY,"[DCI-format2] update internal structure and prepare dl decoding \n"); + prepare_dl_decoding_format2_2A(format2, + &dci_info_extarcted, + frame_parms, + pdcch_vars, + pdsch_vars, + rnti, + subframe, + dlsch0_harq, + dlsch1_harq, + dlsch0, + dlsch1); + } + break; + + case format2A: + { + // extract dci infomation + LOG_I(PHY,"[DCI-format2] AbsSubframe %d.%d extract dci infomation \n", frame%1024, subframe); + extract_dci2A_info(frame_parms->N_RB_DL, + frame_type, + frame_parms->nb_antenna_ports_eNB, + dci_pdu, + &dci_info_extarcted); + + // check dci content + //LOG_I(PHY,"[DCI-format2A] check dci content \n"); + //LOG_I(PHY,"[DCI-format2A] tb_swap %d harq_pid %d\n", dci_info_extarcted.tb_swap, dci_info_extarcted.harq_pid); + //dlsch[0]->active = 0; + //dlsch[1]->active = 0; + + if (dci_info_extarcted.tb_swap == 0) { dlsch0 = dlsch[0]; dlsch1 = dlsch[1]; } else { dlsch0 = dlsch[1]; dlsch1 = dlsch[0]; } + dlsch0_harq = dlsch0->harq_processes[dci_info_extarcted.harq_pid]; + dlsch1_harq = dlsch1->harq_processes[dci_info_extarcted.harq_pid]; - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - dlsch1_harq = dlsch[1]->harq_processes[harq_pid]; - dlsch0->current_harq_pid = harq_pid; - dlsch1->current_harq_pid = harq_pid; - dlsch0->harq_ack[subframe].harq_id = harq_pid; - dlsch1->harq_ack[subframe].harq_id = harq_pid; - - conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch0_harq->rb_alloc_even); - dlsch0_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_even[0]; - dlsch0_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_even[1]; - dlsch0_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_even[2]; - dlsch0_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_even[3]; - dlsch1_harq->rb_alloc_even[0] = dlsch0_harq->rb_alloc_even[0]; - dlsch1_harq->rb_alloc_even[1] = dlsch0_harq->rb_alloc_even[1]; - dlsch1_harq->rb_alloc_even[2] = dlsch0_harq->rb_alloc_even[2]; - dlsch1_harq->rb_alloc_even[3] = dlsch0_harq->rb_alloc_even[3]; - dlsch1_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_odd[0]; - dlsch1_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_odd[1]; - dlsch1_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_odd[2]; - dlsch1_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_odd[3]; - - dlsch0_harq->nb_rb = conv_nprb(rah, - rballoc, - frame_parms->N_RB_DL); - - dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - - NPRB = dlsch0_harq->nb_rb; - - - if (NPRB==0) { - LOG_E(PHY,"Format 2A: NPRB=0 (rballoc %x,mcs %d, frame_type %d N_RB_DL %d)\n",rballoc,mcs,frame_parms->frame_type,frame_parms->N_RB_DL); + //LOG_I(PHY,"[DCI-format2A] check dci content \n"); + status = check_dci_format2_2a_coherency(format2A, + frame_parms->N_RB_DL, + &dci_info_extarcted, + rnti, + si_rnti, + ra_rnti, + p_rnti, + dlsch0_harq, + dlsch1_harq); + if(status == 0) return(-1); + + // dci is correct ==> update internal structure and prepare dl decoding + //LOG_I(PHY,"[DCI-format2A] update internal structure and prepare dl decoding \n"); + prepare_dl_decoding_format2_2A(format2A, + &dci_info_extarcted, + frame_parms, + pdcch_vars, + pdsch_vars, + rnti, + subframe, + dlsch0_harq, + dlsch1_harq, + dlsch0, + dlsch1); } + break; - // printf("NPRB %d\n",NPRB); - dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - dlsch0->g_pucch += delta_PUCCH_lut[TPC&3]; - dlsch1_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - dlsch1->g_pucch += delta_PUCCH_lut[TPC&3]; + case format1E_2A_M10PRB: + if (!dlsch[0]) return -1; - dlsch0_harq->mcs = mcs1; - dlsch1_harq->mcs = mcs2; + harq_pid = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->harq_pid; - dlsch0_harq->rvidx = rv1; - dlsch1_harq->rvidx = rv2; + if (harq_pid>=8) { + LOG_E(PHY,"Format 1E_2A_M10PRB: harq_pid=%d >= 8\n", harq_pid); + return(-1); + } + dlsch[0]->current_harq_pid = harq_pid; + dlsch[0]->harq_ack[subframe].harq_id = harq_pid; - - dlsch0_harq->Nl = 1; - dlsch1_harq->Nl = 1; - // dlsch[0]->layer_index = 0; - - dlsch0_harq->dl_power_off = 1; //no power offset - dlsch1_harq->dl_power_off = 1; //no power offset - - dlsch0->active = dlsch1->active = 1; - - // check if either TB is disabled (see 36-213 V11.3 Section ) - if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { - dlsch0->active = 0; - } - - if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { - dlsch1->active = 0; - } - - - // printf("Format2A DCI (UE, hard pid %d): ndi %d, old_ndi %d (first tx %d)\n",harq_pid,ndi,dlsch0_harq->DCINdi, - // dlsch0_harq->first_tx); - - if (dlsch0->active == 1) { - if ((ndi1!=dlsch0_harq->DCINdi)|| - (dlsch0_harq->first_tx==1)) { - // printf("Rate: setting round to zero (ndi %d, DCINdi %d,first_tx %d)\n",ndi,dlsch0_harq->DCINdi,dlsch0_harq->first_tx); - dlsch0_harq->round=0; - dlsch0_harq->status = ACTIVE; - dlsch0_harq->DCINdi = ndi1; - - if (dlsch0_harq->first_tx==1) { - LOG_D(PHY,"[PDSCH %x/%d] Format 2A DCI First TX0: Clearing flag\n"); - dlsch0_harq->first_tx = 0; + /* + tbswap = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tb_swap; + if (tbswap == 0) { + dlsch0 = dlsch[0]; + dlsch1 = dlsch[1]; } - } else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, + else{ + dlsch0 = dlsch[1]; + dlsch1 = dlsch[0]; + } + */ + dlsch0 = dlsch[0]; + + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; + // Needs to be checked + dlsch0_harq->codeword=0; + conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, + ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL, + dlsch0_harq->rb_alloc_even); + + dlsch0_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_even[0]; + dlsch0_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_even[1]; + dlsch0_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_even[2]; + dlsch0_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_even[3]; + /* + dlsch1_harq->rb_alloc_even[0] = dlsch0_harq->rb_alloc_even[0]; + dlsch1_harq->rb_alloc_even[1] = dlsch0_harq->rb_alloc_even[1]; + dlsch1_harq->rb_alloc_even[2] = dlsch0_harq->rb_alloc_even[2]; + dlsch1_harq->rb_alloc_even[3] = dlsch0_harq->rb_alloc_even[3]; + */ + dlsch0_harq->nb_rb = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, + ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc, + frame_parms->N_RB_DL); + //dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; + + dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; + dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->TPC&3]; + + + + /* + if (dlsch0_harq->mcs>20) { + printf("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs); + return(-1); + } + */ + + //dlsch1_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2; + dlsch0_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv; + //dlsch1_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2; + + // check if either TB is disabled (see 36-213 V8.6 p. 26) + + if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { + dlsch0_harq->status = DISABLED; + } + + //if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { + //dlsch1_harq->status = DISABLED; + //} + dlsch0_harq->Nl = 1; + + //dlsch0->layer_index = tbswap; + //dlsch1->layer_index = 1-tbswap; + + + // Fix this + tpmi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tpmi; + // printf("ue: tpmi %d\n",tpmi); + + switch (tpmi) { + case 0 : + dlsch0_harq->mimo_mode = ALAMOUTI; + break; + + case 1: + dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0,0); + break; + + case 2: + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1, 0); + break; + + case 3: + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2, 0); + + break; + + case 4: + dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj; + dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3, 0); + break; + + case 5: + dlsch0_harq->mimo_mode = PUSCH_PRECODING0; + // pmi stored from ulsch allocation routine + dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc; + //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc)); + break; + + + case 6: + dlsch0_harq->mimo_mode = PUSCH_PRECODING1; + LOG_E(PHY,"Unsupported TPMI\n"); + return(-1); + break; + } + + + if (frame_parms->nb_antenna_ports_eNB == 1) + dlsch0_harq->mimo_mode = SISO; + + + if ((dlsch0_harq->DCINdi != ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi) || + (dlsch0_harq->first_tx==1)) { + + dlsch0_harq->round = 0; + dlsch0_harq->first_tx = 0; + dlsch0_harq->status = ACTIVE; + } + /* + else if (dlsch0_harq->status == SCH_IDLE) { // we got same ndi for a previously decoded process, // this happens if either another harq process in the same // is NAK or an ACK was not received @@ -5209,363 +6388,88 @@ int generate_ue_dlsch_params_from_dci(int frame, dlsch0->harq_ack[subframe].harq_id = harq_pid; dlsch0->harq_ack[subframe].send_harq_status = 1; dlsch0->active = 0; - // printf("Got NDI=0 for correctly decoded SDU (harq_pid %d) subframe %d\n",harq_pid,subframe); + return(0); } - } + */ - if (dlsch1->active == 1) { - if ((ndi2!=dlsch1_harq->DCINdi)|| - (dlsch1_harq->first_tx==1)) { - dlsch1_harq->round=0; - dlsch1_harq->status = ACTIVE; - dlsch1_harq->DCINdi = ndi2; + dlsch0_harq->DCINdi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi; + dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; - if (dlsch1_harq->first_tx==1) { - LOG_D(PHY,"[PDSCH %x/%d] Format 2A DCI First TX1: Clearing flag\n",rnti,harq_pid); - dlsch1_harq->first_tx = 0; - } + if (dlsch0_harq->nb_rb>1) { + dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; + } else + dlsch0_harq->TBS =0; - } else if (dlsch1_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, - // this happens if either another harq process in the same - // is NAK or an ACK was not received + dlsch0->rnti = rnti; + //dlsch1->rnti = rnti; - dlsch1->harq_ack[subframe].ack = 1; - dlsch1->harq_ack[subframe].harq_id = harq_pid; - dlsch1->harq_ack[subframe].send_harq_status = 1; - dlsch1->active = 0; - // printf("Got NDI=0 for correctly decoded SDU (harq_pid %d) subframe %d\n",harq_pid,subframe); - } - } + dlsch0->active = 1; + //dlsch1->active = 1; - if (frame_parms->nb_antennas_tx_eNB == 2) { - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1]; + dlsch0_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off; + //dlsch1_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off; - - if ((dlsch0->active==1) && (dlsch1->active==1)) { - dlsch0_harq->mimo_mode = LARGE_CDD; - dlsch1_harq->mimo_mode = LARGE_CDD; - dlsch0_harq->dl_power_off = 0; //apply power offset - dlsch1_harq->dl_power_off = 0; //apply power offset - } else { - dlsch0_harq->mimo_mode = ALAMOUTI; - dlsch1_harq->mimo_mode = ALAMOUTI; - } - } else if (frame_parms->nb_antennas_tx_eNB == 4) { // 4 antenna case - if ((dlsch0->active==1) && (dlsch1->active==1)) { - switch (tpmi) { - case 0: // one layer per transport block - dlsch0_harq->mimo_mode = LARGE_CDD; - dlsch1_harq->mimo_mode = LARGE_CDD; - dlsch0_harq->dl_power_off = 0; //apply power offset - dlsch1_harq->dl_power_off = 0; //apply power offset - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; - - break; - - case 1: // one-layers on TB 0, two on TB 1 - dlsch0_harq->mimo_mode = LARGE_CDD; - dlsch1_harq->mimo_mode = LARGE_CDD; - dlsch0_harq->dl_power_off = 0; //apply power offset - dlsch1_harq->dl_power_off = 0; //apply power offset - dlsch1_harq->Nl = 2; - dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1]; - break; - - case 2: // two-layers on TB 0, two on TB 1 - dlsch0_harq->mimo_mode = LARGE_CDD; - dlsch1_harq->mimo_mode = LARGE_CDD; - dlsch0_harq->Nl = 2; - dlsch0_harq->dl_power_off = 0; //apply power offset - dlsch1_harq->dl_power_off = 0; //apply power offset - - if (frame_parms->N_RB_DL <= 56) { - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1]; - dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1]; - } else { - LOG_E(PHY,"Add implementation of Table 7.1.7.2.2-1 for two-layer TBS conversion with N_RB_DL > 56\n"); - } - - break; - - case 3: // - LOG_E(PHY,"Illegal value (3) for TPMI in Format 2A DCI\n"); - break; - } - } else if (dlsch0->active == 1) { - switch (tpmi) { - case 0: // one layer per transport block - dlsch0_harq->mimo_mode = ALAMOUTI; - dlsch1_harq->mimo_mode = ALAMOUTI; - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - break; - - case 1: // two-layers on TB 0 - dlsch0_harq->mimo_mode = LARGE_CDD; - dlsch0_harq->Nl = 2; - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1]; - break; - - case 2: // two-layers on TB 0, two on TB 1 - case 3: // - LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); - break; - } - } else if (dlsch1->active == 1) { - switch (tpmi) { - case 0: // one layer per transport block - dlsch0_harq->mimo_mode = ALAMOUTI; - dlsch1_harq->mimo_mode = ALAMOUTI; - dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; - break; - - case 1: // two-layers on TB 0 - dlsch1_harq->mimo_mode = LARGE_CDD; - dlsch1_harq->Nl = 2; - dlsch0_harq->dl_power_off = 1; //apply power offset - dlsch1_harq->dl_power_off = 0; //apply power offset - dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1]; - break; - - case 2: // two-layers on TB 0, two on TB 1 - case 3: // - LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); - break; - } - } - } else { - LOG_E(PHY,"Illegal number of antennas for eNB %d\n",frame_parms->nb_antennas_tx_eNB); - } - - if (mcs1 <= 28) - dlsch0_harq->Qm = get_Qm(mcs1); - else if (mcs1<=31) - dlsch0_harq->Qm = (mcs1-28)<<1; - else - LOG_E(PHY,"invalid mcs1 %d\n",mcs1); - - if (mcs2 <= 28) - dlsch1_harq->Qm = get_Qm(mcs2); - else if (mcs2<=31) - dlsch1_harq->Qm = (mcs2-28)<<1; - else - LOG_E(PHY,"invalid mcs2 %d\n",mcs2); - - // printf("Format 2A: NPRB=%d (rballoc %x,mcs1 %d, mcs2 %d, frame_type %d N_RB_DL %d,active %d/%d)\n",NPRB,rballoc,mcs1,mcs2,frame_parms->frame_type,frame_parms->N_RB_DL,dlsch0->active,dlsch1->active); - //printf("UE (%x/%d): Subframe %d Format2A DCI: ndi1 %d, old_ndi1 %d, ndi2 %d, old_ndi2 %d (first tx1 %d, first tx2 %d) harq_status1 %d, harq_status2 %d\n",dlsch0->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi, - // dlsch0_harq->first_tx,dlsch1_harq->first_tx,dlsch0_harq->status,dlsch1_harq->status); - //printf("TBS0 %d, TBS1 %d\n",dlsch0_harq->TBS,dlsch1_harq->TBS); - - - break; - - case format1E_2A_M10PRB: - - harq_pid = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->harq_pid; - - if (harq_pid>=8) { - LOG_E(PHY,"Format 1E_2A_M10PRB: harq_pid >= 8\n"); - return(-1); - } - - dlsch[0]->current_harq_pid = harq_pid; - dlsch[0]->harq_ack[subframe].harq_id = harq_pid; - - /* - tbswap = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tb_swap; - if (tbswap == 0) { - dlsch0 = dlsch[0]; - dlsch1 = dlsch[1]; - } - else{ - dlsch0 = dlsch[1]; - dlsch1 = dlsch[0]; - } - */ - dlsch0 = dlsch[0]; - - dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; - conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, - ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL, - dlsch0_harq->rb_alloc_even); - - dlsch0_harq->rb_alloc_odd[0] = dlsch0_harq->rb_alloc_even[0]; - dlsch0_harq->rb_alloc_odd[1] = dlsch0_harq->rb_alloc_even[1]; - dlsch0_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_even[2]; - dlsch0_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_even[3]; - /* - dlsch1_harq->rb_alloc_even[0] = dlsch0_harq->rb_alloc_even[0]; - dlsch1_harq->rb_alloc_even[1] = dlsch0_harq->rb_alloc_even[1]; - dlsch1_harq->rb_alloc_even[2] = dlsch0_harq->rb_alloc_even[2]; - dlsch1_harq->rb_alloc_even[3] = dlsch0_harq->rb_alloc_even[3]; - */ - dlsch0_harq->nb_rb = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, - ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc, - frame_parms->N_RB_DL); - //dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; - - dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; - dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->TPC&3]; - dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3]; - - - - /* - if (dlsch0_harq->mcs>20) { - msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs); - return(-1); - } - */ - - //dlsch1_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2; - dlsch0_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv; - //dlsch1_harq->rvidx = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2; - - // check if either TB is disabled (see 36-213 V8.6 p. 26) - - if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) { - dlsch0_harq->status = DISABLED; - } - - //if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { - //dlsch1_harq->status = DISABLED; - //} - dlsch0_harq->Nl = 1; - - //dlsch0->layer_index = tbswap; - //dlsch1->layer_index = 1-tbswap; - - - // Fix this - tpmi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->tpmi; - // msg("ue: tpmi %d\n",tpmi); - - switch (tpmi) { - case 0 : - dlsch0_harq->mimo_mode = ALAMOUTI; break; - case 1: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING11; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,0); - break; - - case 2: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1m1; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1); - break; - - case 3: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1j; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,2); - break; - - case 4: - dlsch0_harq->mimo_mode = UNIFORM_PRECODING1mj; - dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,3); - break; - - case 5: - dlsch0_harq->mimo_mode = PUSCH_PRECODING0; - // pmi stored from ulsch allocation routine - dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc; - //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc)); - break; - - case 6: - dlsch0_harq->mimo_mode = PUSCH_PRECODING1; - LOG_E(PHY,"Unsupported TPMI\n"); + default: + LOG_E(PHY,"format %d not yet implemented\n",dci_format); return(-1); break; } +#ifdef UE_DEBUG_TRACE - if (frame_parms->mode1_flag == 1) - dlsch0_harq->mimo_mode = SISO; - - - if (dlsch0_harq->DCINdi != ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi) { - - dlsch0_harq->round = 0; - dlsch0_harq->status = ACTIVE; - } else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, - // this happens if either another harq process in the same - // is NAK or an ACK was not received - - dlsch0->harq_ack[subframe].ack = 1; - dlsch0->harq_ack[subframe].harq_id = harq_pid; - dlsch0->harq_ack[subframe].send_harq_status = 1; - dlsch0->active = 0; - return(0); + if (dlsch[0] && (dlsch[0]->rnti != 0xffff)) { + LOG_I(PHY,"dci_format:%d Abssubframe: %d.%d \n",dci_format,frame%1024,subframe); + LOG_I(PHY,"PDSCH dlsch0 UE: rnti %x\n",dlsch[0]->rnti); + LOG_D(PHY,"PDSCH dlsch0 UE: NBRB %d\n",dlsch0_harq->nb_rb); + LOG_D(PHY,"PDSCH dlsch0 UE: rballoc %x\n",dlsch0_harq->rb_alloc_even[0]); + LOG_I(PHY,"PDSCH dlsch0 UE: harq_pid %d\n",dci_info_extarcted.harq_pid); + LOG_I(PHY,"PDSCH dlsch0 UE: g %d\n",dlsch[0]->g_pucch); + LOG_D(PHY,"PDSCH dlsch0 UE: round %d\n",dlsch0_harq->round); + LOG_D(PHY,"PDSCH dlsch0 UE: DCINdi %d\n",dlsch0_harq->DCINdi); + LOG_D(PHY,"PDSCH dlsch0 UE: rvidx %d\n",dlsch0_harq->rvidx); + LOG_D(PHY,"PDSCH dlsch0 UE: TBS %d\n",dlsch0_harq->TBS); + LOG_D(PHY,"PDSCH dlsch0 UE: mcs %d\n",dlsch0_harq->mcs); + LOG_D(PHY,"PDSCH dlsch0 UE: pwr_off %d\n",dlsch0_harq->dl_power_off); } - - dlsch0_harq->DCINdi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi; - dlsch0_harq->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; - - if (dlsch0_harq->nb_rb>1) { - dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; - } else - dlsch0_harq->TBS =0; - - dlsch0->rnti = rnti; - //dlsch1->rnti = rnti; - - dlsch0->active = 1; - //dlsch1->active = 1; - - dlsch0_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off; - //dlsch1_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off; - - - break; - - default: - LOG_E(PHY,"format %d not yet implemented\n",dci_format); - return(-1); - break; - } - - -#ifdef DEBUG_DCI - - if (dlsch[0]) { - printf("PDSCH dlsch0 UE: rnti %x\n",dlsch[0]->rnti); - printf("PDSCH dlsch0 UE: NBRB %d\n",dlsch0_harq->nb_rb); - printf("PDSCH dlsch0 UE: rballoc %x\n",dlsch0_harq->rb_alloc_even[0]); - printf("PDSCH dlsch0 UE: harq_pid %d\n",harq_pid); - printf("PDSCH dlsch0 UE: DCINdi %d\n",dlsch0_harq->DCINdi); - printf("PDSCH dlsch0 UE: rvidx %d\n",dlsch0_harq->rvidx); - printf("PDSCH dlsch0 UE: TBS %d\n",dlsch0_harq->TBS); - printf("PDSCH dlsch0 UE: mcs %d\n",dlsch0_harq->mcs); - printf("PDSCH dlsch0 UE: pwr_off %d\n",dlsch0_harq->dl_power_off); - } - #endif - dlsch[0]->active=1; - // compute DL power control parameters - computeRhoA_UE(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off); +#if T_TRACER + if( (dlsch[0]->rnti != si_rnti) && (dlsch[0]->rnti != ra_rnti) && (dlsch[0]->rnti != p_rnti)) + { + T(T_UE_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame%1024), T_INT(subframe), + T_INT(dlsch[0]->rnti), T_INT(dci_format), + T_INT(harq_pid), + T_INT(dlsch0_harq->mcs), + T_INT(dlsch0_harq->TBS)); + } +#endif - computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0],dlsch0_harq->dl_power_off); - return(0); + // compute DL power control parameters + if (dlsch0_harq != NULL){ + computeRhoA_UE(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off, frame_parms->nb_antenna_ports_eNB); + computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antenna_ports_eNB,dlsch[0],dlsch0_harq->dl_power_off); + } + + if (dlsch1_harq != NULL) { + computeRhoA_UE(pdsch_config_dedicated, dlsch[1],dlsch1_harq->dl_power_off, frame_parms->nb_antenna_ports_eNB); + computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antenna_ports_eNB,dlsch[1],dlsch1_harq->dl_power_off); + } + + + return(0); } uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t subframe) { - /* - #ifdef DEBUG_DCI - if (frame_parms->frame_type == TDD) - msg("dci_tools.c: subframe2_harq_pid, subframe %d for TDD configuration %d\n",subframe,frame_parms->tdd_config); - else - msg("dci_tools.c: subframe2_harq_pid, subframe %d for FDD \n",subframe); - #endif - */ + uint8_t ret = 255; + if (frame_parms->frame_type == FDD) { - return(((frame<<1)+subframe)&7); + ret = (((frame*10)+subframe)&7); } else { switch (frame_parms->tdd_config) { @@ -5578,17 +6482,17 @@ uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t switch (subframe) { case 2: case 3: - return(subframe-2); + ret = (subframe-2); break; case 7: case 8: - return(subframe-5); + ret = (subframe-5); break; default: LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config); - return(255); + ret = (255); break; } @@ -5596,74 +6500,74 @@ uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t case 2: if ((subframe!=2) && (subframe!=7)) { - LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config); - mac_xface->macphy_exit("subframe2_harq_pid, Illegal subframe"); - return(255); + LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config); + ret=255; } - - return(subframe/7); + else ret = (subframe/7); break; case 3: if ((subframe<2) || (subframe>4)) { LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config); - return(255); + ret = (255); } - - return(subframe-2); + else ret = (subframe-2); break; case 4: if ((subframe<2) || (subframe>3)) { LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config); - return(255); + ret = (255); } - - return(subframe-2); + else ret = (subframe-2); break; case 5: if (subframe!=2) { LOG_E(PHY,"subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n",subframe,frame_parms->tdd_config); - return(255); + ret = (255); } - - return(subframe-2); + else ret = (subframe-2); break; default: LOG_E(PHY,"subframe2_harq_pid, Unsupported TDD mode %d\n",frame_parms->tdd_config); - return(255); - + ret = (255); } } - return(255); + AssertFatal(ret!=255, + "invalid harq_pid(%d) at SFN/SF = %d/%d\n", (int8_t)ret, frame, subframe); + return ret; } uint8_t pdcch_alloc2ul_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n) { + uint8_t ul_subframe = 255; if ((frame_parms->frame_type == TDD) && (frame_parms->tdd_config == 1) && ((n==1)||(n==6))) // tdd_config 0,1 SF 1,5 - return((n+6)%10); + ul_subframe = ((n+6)%10); else if ((frame_parms->frame_type == TDD) && (frame_parms->tdd_config == 6) && ((n==0)||(n==1)||(n==5)||(n==6))) - return((n+7)%10); + ul_subframe = ((n+7)%10); else if ((frame_parms->frame_type == TDD) && (frame_parms->tdd_config == 6) && (n==9)) // tdd_config 6 SF 9 - return((n+5)%10); + ul_subframe = ((n+5)%10); else - return((n+4)%10); + ul_subframe = ((n+4)%10); + if ((subframe_select(frame_parms,ul_subframe) != SF_UL) && (frame_parms->frame_type == TDD)) return(255); + + LOG_D(PHY, "subframe %d: PUSCH subframe = %d\n", n, ul_subframe); + return ul_subframe; } uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n) { - if ((frame_parms->frame_type == TDD) && (frame_parms->tdd_config == 1) && ((n==7)||(n==2))) // tdd_config 0,1 SF 1,5 @@ -5678,37 +6582,104 @@ uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t return(9); else return((n+6)%10); - } uint32_t pdcch_alloc2ul_frame(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t n) { + uint32_t ul_frame; if ((frame_parms->frame_type == TDD) && (frame_parms->tdd_config == 1) && ((n==1)||(n==6))) // tdd_config 0,1 SF 1,5 - return(frame + (n==1 ? 0 : 1)); + ul_frame = (frame + (n==1 ? 0 : 1)); else if ((frame_parms->frame_type == TDD) && (frame_parms->tdd_config == 6) && ((n==0)||(n==1)||(n==5)||(n==6))) - return(frame + (n>=5 ? 1 : 0)); + ul_frame = (frame + (n>=5 ? 1 : 0)); else if ((frame_parms->frame_type == TDD) && (frame_parms->tdd_config == 6) && (n==9)) // tdd_config 6 SF 9 - return(frame+1); + ul_frame = (frame+1); else - return(frame+(n>=6 ? 1 : 0)); + ul_frame = (frame+(n>=6 ? 1 : 0)); + + LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", frame, n, ul_frame); + return ul_frame % 1024; +} + +int32_t pmi_convert_rank1_from_rank2(uint16_t pmi_alloc, int tpmi, int nb_rb) +{ + int nb_subbands = 0; + int32_t pmi_alloc_new = 0, pmi_new = 0, pmi_old = 0; + int i; + + switch (nb_rb) { + case 6: + nb_subbands = 6; + break; + default: + case 25: + nb_subbands = 7; + break; + case 50: + nb_subbands = 9; + break; + case 100: + nb_subbands = 13; + break; + } + + for (i = 0; i < nb_subbands; i++) { + pmi_old = (pmi_alloc >> i)&1; + + if (pmi_old == 0) + if (tpmi == 5) + pmi_new = 0; + else + pmi_new = 1; + else + if (tpmi == 5) + pmi_new = 2; + else + pmi_new = 3; + + pmi_alloc_new|=pmi_new<<(2*i); + + } +#ifdef DEBUG_HARQ +printf(" [DCI UE] pmi_alloc_old %d, pmi_alloc_new %d pmi_old %d , pmi_new %d\n", pmi_alloc, pmi_alloc_new,pmi_old, pmi_new ); +#endif +return(pmi_alloc_new); } -uint16_t quantize_subband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,int nb_subbands) +uint16_t quantize_subband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,int nb_rb) { int i, aarx; uint16_t pmiq=0; - uint16_t pmivect = 0; + uint32_t pmivect = 0; uint8_t rank = meas->rank[eNB_id]; int pmi_re,pmi_im; + int nb_subbands=0; + + + switch (nb_rb) { + case 6: + nb_subbands = 6; + break; + default: + case 25: + nb_subbands = 7; + break; + case 50: + nb_subbands = 9; + break; + case 100: + nb_subbands = 13; + break; + } + for (i=0; i1 not supported!\n"); + } + + else if (rank==1) { + for (aarx=0; aarxnb_antennas_rx; aarx++) { + pmi_re += meas->subband_pmi_re[eNB_id][i][aarx]; + //printf("meas->subband_pmi_re[eNB_id][i][%d]=%d\n", aarx, meas->subband_pmi_re[eNB_id][i][aarx]); + pmi_im += meas->subband_pmi_im[eNB_id][i][aarx]; + //printf("meas->subband_pmi_im[eNB_id][i][%d]=%d\n",aarx, meas->subband_pmi_im[eNB_id][i][aarx]); + } + if (pmi_re >= pmi_im) // this is not orthogonal + // this is orthogonal + //if (((pmi_re >= pmi_im) && (pmi_re >= -pmi_im)) || ((pmi_re <= pmi_im) && (pmi_re >= -pmi_im))) + pmiq = PMI_2A_R1_11; + else + pmiq = PMI_2A_R1_1j; + + // printf("subband %d, pmi_re %d, pmi_im %d, pmiq %d \n",i,pmi_re,pmi_im,pmiq); + // printf("subband %d, pmi%d \n",i,pmiq); + //According to Section 7.2.4 of 36.213 + + pmivect |= ((pmiq-1)<<(i)); //shift 1 since only one bit + } + else { + LOG_E(PHY,"PMI feedback for rank>1 not supported!\n"); pmivect = 0; } - } + } +#ifdef DEBUG_HARQ + printf( "quantize_subband_pmi pmivect %d \n", pmivect); +#endif return(pmivect); } @@ -5824,36 +6819,38 @@ uint8_t sinr2cqi(double sinr,uint8_t trans_mode) { // int flag_LA=0; + uint8_t retValue = 0; + if(flag_LA==0) { // Ideal Channel Estimation if (sinr<=-4.89) - return(0); + retValue = (0); else if (sinr < -3.53) - return(3); + retValue = (3); else if (sinr <= -1.93) - return(4); + retValue = (4); else if (sinr <= -0.43) - return(5); + retValue = (5); else if (sinr <= 1.11) - return(6); + retValue = (6); else if (sinr <= 3.26) - return(7); - else if (sinr <= 5) - return(8); - else if (sinr <= 7) - return(9); - else if (sinr <= 9) - return(10); - else if (sinr <= 11) - return(11); - else if (sinr <= 13) - return(12); + retValue = (7); + else if (sinr <= 5.0) + retValue = (8); + else if (sinr <= 7.0) + retValue = (9); + else if (sinr <= 9.0) + retValue = (10); + else if (sinr <= 11.0) + retValue = (11); + else if (sinr <= 13.0) + retValue = (12); else if (sinr <= 15.5) - return(13); + retValue = (13); else if (sinr <= 17.5) - return(14); - else if (sinr > 19.5) - return(15); + retValue = (14); + else + retValue = (15); } else { int h=0; int trans_mode_tmp; @@ -5867,11 +6864,12 @@ uint8_t sinr2cqi(double sinr,uint8_t trans_mode) for(h=0; h<16; h++) { if(sinr<=sinr_to_cqi[trans_mode_tmp][h]) - return(h); + retValue = (h); } } - return(0); + LOG_D(PHY, "sinr=%f trans_mode=%d cqi=%d\n", sinr, trans_mode, retValue); + return retValue; } //uint32_t fill_subband_cqi(PHY_MEASUREMENTS *meas,uint8_t eNB_id) { // @@ -5931,7 +6929,7 @@ uint32_t fill_subband_cqi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t trans_mo void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t harq_pid,int N_RB_DL,uint16_t rnti, uint8_t trans_mode, double sinr_eff) { - // msg("[PHY][UE] Filling CQI for eNB %d, meas->wideband_cqi_tot[%d] %d\n", + // printf("[PHY][UE] Filling CQI for eNB %d, meas->wideband_cqi_tot[%d] %d\n", // eNB_id,eNB_id,meas->wideband_cqi_tot[eNB_id]); double sinr_tmp; uint8_t *o = ulsch->o; @@ -5990,12 +6988,12 @@ void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_ case ue_selected: LOG_E(PHY,"fill_CQI ue_selected CQI not supported yet!!!\n"); - mac_xface->macphy_exit("fill_CQI ue_selected CQI not supported yet!!!"); + AssertFatal(1==0,"fill_CQI ue_selected CQI not supported yet!!!"); break; default: LOG_E(PHY,"unsupported CQI mode (%d)!!!\n",uci_format); - mac_xface->macphy_exit("unsupported CQI mode !!!"); + AssertFatal(1==0,"unsupported CQI mode !!!"); break; } @@ -6044,12 +7042,12 @@ void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_ case ue_selected: LOG_E(PHY,"fill_CQI ue_selected CQI not supported yet!!!\n"); - mac_xface->macphy_exit("fill_CQI ue_selected CQI not supported yet!!!"); + AssertFatal(1==0,"fill_CQI ue_selected CQI not supported yet!!!"); break; default: LOG_E(PHY,"unsupported CQI mode (%d)!!!\n",uci_format); - mac_xface->macphy_exit("unsupported CQI mode !!!"); + AssertFatal(1==0,"unsupported CQI mode !!!"); break; } @@ -6098,12 +7096,12 @@ void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_ case ue_selected: LOG_E(PHY,"fill_CQI ue_selected CQI not supported yet!!!\n"); - mac_xface->macphy_exit("fill_CQI ue_selected CQI not supported yet!!!"); + AssertFatal(1==0,"fill_CQI ue_selected CQI not supported yet!!!"); break; default: LOG_E(PHY,"unsupported CQI mode (%d)!!!\n",uci_format); - mac_xface->macphy_exit("unsupported CQI mode !!!"); + AssertFatal(1==0,"unsupported CQI mode !!!"); break; } @@ -6152,12 +7150,12 @@ void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_ case ue_selected: LOG_E(PHY,"fill_CQI ue_selected CQI not supported yet!!!\n"); - mac_xface->macphy_exit("fill_CQI ue_selected CQI not supported yet!!!"); + AssertFatal(1==0,"fill_CQI ue_selected CQI not supported yet!!!"); break; default: LOG_E(PHY,"unsupported CQI mode (%d)!!!\n",uci_format); - mac_xface->macphy_exit("unsupported CQI mode !!!"); + AssertFatal(1==0,"unsupported CQI mode !!!"); break; } @@ -6176,14 +7174,32 @@ void reset_cba_uci(void *o) ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti = 0x0; } -uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi) + +uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi, uint8_t rank) { - uint8_t i,wideband_pmi2=wideband_pmi&3; + uint8_t i,wideband_pmi2; uint32_t pmi_ex = 0; - for (i=0; i<14; i+=2) - pmi_ex|=(wideband_pmi2<N_RB_DL!=25) { + LOG_E(PHY,"pmi_extend not yet implemented for anything else than 25PRB\n"); + return(-1); + } + + if (rank==0) { + wideband_pmi2=wideband_pmi&3; + for (i=0; i<14; i+=2) + pmi_ex|=(wideband_pmi2<transmission_mode[eNB_id]; - ANFBmode_t AckNackFBMode = phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; - LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id]; - // LTE_UE_DLSCH_t **dlsch = phy_vars_ue->dlsch_ue[0]; - PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - // uint32_t current_dlsch_cqi = phy_vars_ue->current_dlsch_cqi[eNB_id]; + uint8_t transmission_mode = ue->transmission_mode[eNB_id]; + ANFBmode_t AckNackFBMode; + LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; + LTE_UE_DLSCH_t **dlsch = ue->dlsch[ue->current_thread_id[subframe]][0]; + PHY_MEASUREMENTS *meas = &ue->measurements; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + // uint32_t current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id]; + + if(frame_parms->frame_type == TDD) + { + AckNackFBMode = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; + } + else + { + AckNackFBMode = 1; // 1: multiplexing for FDD + } uint32_t cqi_req; - uint32_t dai=0; + uint32_t dai=3; uint32_t cshift; uint32_t TPC; uint32_t ndi; uint32_t mcs; uint32_t rballoc,RIV_max; + uint16_t* RIV2first_rb_LUT; + uint16_t* RIV2nb_rb_LUT; + // uint32_t hopping; // uint32_t type; if (dci_format == format0) { + if (!ulsch) + return -1; + if (rnti == ra_rnti) harq_pid = 0; else harq_pid = subframe2harq_pid(frame_parms, - pdcch_alloc2ul_frame(frame_parms,phy_vars_ue->frame_rx,subframe), + pdcch_alloc2ul_frame(frame_parms,proc->frame_rx,subframe), pdcch_alloc2ul_subframe(frame_parms,subframe)); if (harq_pid == 255) { LOG_E(PHY, "frame %d, subframe %d, rnti %x, format %d: illegal harq_pid!\n", - phy_vars_ue->frame_rx, subframe, rnti, dci_format); + proc->frame_rx, subframe, rnti, dci_format); return(-1); } @@ -6246,7 +7278,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ndi = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi; mcs = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs; rballoc = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; - // hopping = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping; + // hopping = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping; // type = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->type; } else { cqi_req = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cqi_req; @@ -6255,13 +7287,13 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ndi = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->ndi; mcs = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->mcs; rballoc = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->rballoc; - // hopping = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping; + // hopping = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping=hopping; // type = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->type; } RIV_max = RIV_max6; - ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT6[rballoc]; - ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT6[rballoc]; + RIV2first_rb_LUT = RIV2first_rb_LUT6; + RIV2nb_rb_LUT = RIV2nb_rb_LUT6; break; @@ -6274,7 +7306,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ndi = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->ndi; mcs = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->mcs; rballoc = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; - // hopping = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->hopping; + // hopping = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping; // type = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->type; } else { cqi_req = ((DCI0_5MHz_FDD_t *)dci_pdu)->cqi_req; @@ -6283,14 +7315,14 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ndi = ((DCI0_5MHz_FDD_t *)dci_pdu)->ndi; mcs = ((DCI0_5MHz_FDD_t *)dci_pdu)->mcs; rballoc = ((DCI0_5MHz_FDD_t *)dci_pdu)->rballoc; - // hopping = ((DCI0_5MHz_FDD_t *)dci_pdu)->hopping; + // hopping = ((DCI0_5MHz_FDD_t *)dci_pdu)->hopping=hopping; // type = ((DCI0_5MHz_FDD_t *)dci_pdu)->type; } RIV_max = RIV_max25; - ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT25[rballoc]; - ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT25[rballoc]; - // printf("***********rballoc %d, first_rb %d, nb_rb %d\n",rballoc,ulsch->harq_processes[harq_pid]->first_rb,ulsch->harq_processes[harq_pid]->nb_rb); + RIV2first_rb_LUT = RIV2first_rb_LUT25; + RIV2nb_rb_LUT = RIV2nb_rb_LUT25; + // printf("***********rballoc %d, first_rb %d, nb_rb %d (dci %p)\n",rballoc,ulsch->harq_processes[harq_pid]->first_rb,ulsch->harq_processes[harq_pid]->nb_rb,dci_pdu); break; case 50: @@ -6302,7 +7334,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ndi = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->ndi; mcs = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->mcs; rballoc = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->rballoc; - // hopping = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->hopping; + // hopping = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping; // type = ((DCI0_10MHz_TDD_1_6_t *)dci_pdu)->type; } else { cqi_req = ((DCI0_10MHz_FDD_t *)dci_pdu)->cqi_req; @@ -6311,13 +7343,13 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ndi = ((DCI0_10MHz_FDD_t *)dci_pdu)->ndi; mcs = ((DCI0_10MHz_FDD_t *)dci_pdu)->mcs; rballoc = ((DCI0_10MHz_FDD_t *)dci_pdu)->rballoc; - // hopping = ((DCI0_10MHz_FDD_t *)dci_pdu)->hopping; + // hopping = ((DCI0_10MHz_FDD_t *)dci_pdu)->hopping=hopping; // type = ((DCI0_10MHz_FDD_t *)dci_pdu)->type; } RIV_max = RIV_max50; - ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT50[rballoc]; - ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT50[rballoc]; + RIV2first_rb_LUT = RIV2first_rb_LUT50; + RIV2nb_rb_LUT = RIV2nb_rb_LUT50; break; @@ -6330,7 +7362,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ndi = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->ndi; mcs = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->mcs; rballoc = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->rballoc; - // hopping = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->hopping; + // hopping = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping; // type = ((DCI0_20MHz_TDD_1_6_t *)dci_pdu)->type; } else { cqi_req = ((DCI0_20MHz_FDD_t *)dci_pdu)->cqi_req; @@ -6339,13 +7371,13 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ndi = ((DCI0_20MHz_FDD_t *)dci_pdu)->ndi; mcs = ((DCI0_20MHz_FDD_t *)dci_pdu)->mcs; rballoc = ((DCI0_20MHz_FDD_t *)dci_pdu)->rballoc; - // hopping = ((DCI0_20MHz_FDD_t *)dci_pdu)->hopping; + // hopping = ((DCI0_20MHz_FDD_t *)dci_pdu)->hopping=hopping; // type = ((DCI0_20MHz_FDD_t *)dci_pdu)->type; } RIV_max = RIV_max100; - ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT100[rballoc]; - ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT100[rballoc]; + RIV2first_rb_LUT = RIV2first_rb_LUT100; + RIV2nb_rb_LUT = RIV2nb_rb_LUT100; // printf("rb_alloc (20 MHz dci) %d\n",rballoc); break; @@ -6358,8 +7390,10 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, if (rballoc > RIV_max) { - LOG_E(PHY,"frame %d, subframe %d, rnti %x, format %d: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc > RIV_max\n", - phy_vars_ue->frame_rx, subframe, rnti, dci_format); + LOG_E(PHY,"frame %d, subframe %d, rnti %x, format %d: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc[%d] > RIV_max[%d]\n", + proc->frame_rx, subframe, rnti, dci_format,rballoc,RIV_max); + LOG_E(PHY,"Wrong DCI0 detection, do not transmit PUSCH for HARQID: %d\n",harq_pid); + ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0; return(-1); } @@ -6368,22 +7402,28 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, if ((rnti >= cba_rnti) && (rnti < p_rnti)) ulsch->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; //+=1 this indicates the number of dci / cba group: not supported in the data struct else - ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + { + ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + //LOG_I(PHY,"[HARQ-UL harqId: %d] DCI0 ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, ulsch->harq_processes[harq_pid]->round); + + } ulsch->harq_processes[harq_pid]->TPC = TPC; + ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT[rballoc]; + ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT[rballoc]; - if (phy_vars_ue->ul_power_control_dedicated[eNB_id].accumulationEnabled == 1) { + if (ue->ul_power_control_dedicated[eNB_id].accumulationEnabled == 1) { LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ACC) %d, adjusting by %d (TPC %d)\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe,ulsch->f_pusch, - delta_PUSCH_acc[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC], - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC); - ulsch->f_pusch += delta_PUSCH_acc[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC]; + ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->f_pusch, + delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC], + ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC); + ulsch->f_pusch += delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC]; } else { LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ABS) %d, adjusting to %d (TPC %d)\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe,ulsch->f_pusch, - delta_PUSCH_abs[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC], - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC); - ulsch->f_pusch = delta_PUSCH_abs[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC]; + ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->f_pusch, + delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC], + ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC); + ulsch->f_pusch = delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC]; } if (ulsch->harq_processes[harq_pid]->first_tx==1) { @@ -6398,7 +7438,42 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->harq_processes[harq_pid]->round = 0; } else { // ulsch->harq_processes[harq_pid]->Ndi = 0; - // ulsch->harq_processes[harq_pid]->round++; // This is done in phich RX + //ulsch->harq_processes[harq_pid]->round++; // This is done in phich RX + + //#ifdef DEBUG_PHICH + //LOG_I(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d Adaptative Retrans, NDI not toggled => Nack. maxHARQ_Tx %d \n", + // ue->Mod_id,harq_pid, + // proc->frame_rx, + // subframe, + // ulsch->Mlimit); + //#endif +/* + if (ulsch->harq_processes[harq_pid]->round > 0) // NACK detected on phich + { + // ulsch->harq_processes[harq_pid]->round++; already done on phich_rx + // ulsch->harq_processes[harq_pid] = ulsch->harq_processes[8]; + // LOG_I(PHY," Adaptative retransmission - copy temporary harq Process to current harq process. [harqId %d round %d] \n",harq_pid, ulsch->harq_processes[8]->round); + + if (ulsch->harq_processes[harq_pid]->round >= ulsch->Mlimit) //UE_mac_inst[eNB_id].scheduling_info.maxHARQ_Tx) + { + ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0; + ulsch->harq_processes[harq_pid]->round = 0; + ulsch->harq_processes[harq_pid]->status = IDLE; + //LOG_I(PHY," PUSCH MAX Retransmission acheived ==> flush harq buff (%d) \n",harq_pid); + //LOG_I(PHY," [HARQ-UL harqId: %d] Adaptative retransmission NACK MAX RETRANS(%d) ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, UE_mac_inst[eNB_id].scheduling_info.maxHARQ_Tx, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, ulsch->harq_processes[harq_pid]->round); + } + else + { + // ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + uint8_t rv_table[4] = {0, 2, 3, 1}; + ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3]; + ulsch->O_RI = 0; + ulsch->O = 0; + ulsch->uci_format = HLC_subband_cqi_nopmi; + //LOG_I(PHY," [HARQ-UL harqId: %d] Adaptative retransmission NACK ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag,ulsch->harq_processes[harq_pid]->round); + } + } +*/ } } @@ -6411,7 +7486,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->rnti = rnti; } - // msg("[PHY][UE] DCI format 0: harq_pid %d nb_rb %d, rballoc %d\n",harq_pid,ulsch->harq_processes[harq_pid]->nb_rb, + // printf("[PHY][UE] DCI format 0: harq_pid %d nb_rb %d, rballoc %d\n",harq_pid,ulsch->harq_processes[harq_pid]->nb_rb, // ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->rballoc); //Mapping of cyclic shift field in DCI format0 to n_DMRS2 (3GPP 36.211, Table 5.5.2.1.1-1) if(cshift == 0) @@ -6448,13 +7523,22 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, if (cqi_req == 1) { - ulsch->O_RI = 1; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table + + if( (AntennaInfoDedicated__transmissionMode_tm3 == transmission_mode) || (AntennaInfoDedicated__transmissionMode_tm4 == transmission_mode) ) + { + ulsch->O_RI = 1; + } + else + { + ulsch->O_RI = 0; + } + //ulsch->O_RI = 0; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table switch(transmission_mode) { // The aperiodic CQI reporting mode is fixed for every transmission mode instead of being configured by higher layer signaling case 1: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6475,7 +7559,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6496,7 +7580,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_nopmi; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6522,7 +7606,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 2: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6543,7 +7627,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6564,7 +7648,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_nopmi; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6590,7 +7674,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 3: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6611,7 +7695,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6632,7 +7716,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_nopmi; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6658,7 +7742,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 4: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6679,7 +7763,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank1_2A_1_5MHz; break; @@ -6700,7 +7784,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = wideband_cqi_rank1_2A; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank2_2A_1_5MHz; break; @@ -6726,7 +7810,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 5: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6747,7 +7831,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank1_2A_1_5MHz; break; @@ -6768,7 +7852,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = wideband_cqi_rank1_2A; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank2_2A_1_5MHz; break; @@ -6794,7 +7878,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 6: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6815,7 +7899,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank1_2A_1_5MHz; break; @@ -6836,7 +7920,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = wideband_cqi_rank1_2A; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_wideband_cqi_rank2_2A_1_5MHz; break; @@ -6862,7 +7946,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, case 7: if ((rnti >= cba_rnti) && (rnti < p_rnti)) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_mcs_CBA_1_5MHz; break; @@ -6883,7 +7967,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_mcs_CBA; ulsch->o_RI[0] = 0; } else if(meas->rank[eNB_id] == 0) { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6904,7 +7988,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_nopmi; ulsch->o_RI[0] = 0; } else { - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: ulsch->O = sizeof_HLC_subband_cqi_nopmi_1_5MHz; break; @@ -6938,120 +8022,141 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->uci_format = HLC_subband_cqi_nopmi; } - print_CQI(ulsch->o,ulsch->uci_format,eNB_id,phy_vars_ue->lte_frame_parms.N_RB_DL); + print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL); - //FK: moved this part to ulsch_coding to be more recent - /* - fill_CQI(ulsch->o,ulsch->uci_format,meas,eNB_id,transmission_mode); - print_CQI(ulsch->o,ulsch->uci_format,eNB_id); + ulsch->bundling = 1-AckNackFBMode; - // save PUSCH pmi for later (transmission modes 4,5,6) - // msg("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi)); - dlsch[0]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi; - */ - - // check this (see comment in generate_ue_ulsch_params_from_dci) if (frame_parms->frame_type == FDD) { - int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4); + //int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4); + int dl_subframe = subframe; - if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[dl_subframe].send_harq_status>0) { // we have downlink transmission + if (ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_ack[dl_subframe].send_harq_status>0) { // we have downlink transmission ulsch->harq_processes[harq_pid]->O_ACK = 1; } else { ulsch->harq_processes[harq_pid]->O_ACK = 0; } + /*LOG_I(PHY,"DCI 0 Processing: dl_subframe %d send_harq_status Odd %d send_harq_status Even %d harq_pid %d O_ACK %d\n", dl_subframe, + ue->dlsch[0][eNB_id][0]->harq_ack[dl_subframe].send_harq_status, + ue->dlsch[1][eNB_id][0]->harq_ack[dl_subframe].send_harq_status, + harq_pid, + ulsch->harq_processes[harq_pid]->O_ACK);*/ + } else { if (ulsch->bundling) ulsch->harq_processes[harq_pid]->O_ACK = (dai == 3)? 0 : 1; else - ulsch->harq_processes[harq_pid]->O_ACK = (dai+1)&3; + ulsch->harq_processes[harq_pid]->O_ACK = (dai >= 2)? 2 : (dai+1)&3; //(dai+1)&3; // ulsch->harq_processes[harq_pid]->V_UL_DAI = dai+1; } - ulsch->beta_offset_cqi_times8 = beta_cqi[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index];//18; - ulsch->beta_offset_ri_times8 = beta_ri[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index];//10; - ulsch->beta_offset_harqack_times8 = beta_ack[phy_vars_ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index];//16; + dlsch[0]->harq_ack[subframe].vDAI_UL = dai+1; + + + /*LOG_I(PHY, "[PUSCH %d] Format0 DCI %s, CQI_req=%d, cshift=%d, TPC=%d, DAI=%d, vDAI_UL[sf#%d]=%d, NDI=%d, MCS=%d, RBalloc=%d, first_rb=%d, harq_pid=%d, nb_rb=%d, subframe_scheduling_flag=%d" + " ulsch->bundling %d, O_ACK %d \n", + harq_pid, + (frame_parms->frame_type == TDD? "TDD" : "FDD"), + cqi_req, cshift, TPC, dai, subframe, dlsch[0]->harq_ack[subframe].vDAI_UL, ndi, mcs, rballoc, + ulsch->harq_processes[harq_pid]->first_rb, harq_pid, ulsch->harq_processes[harq_pid]->nb_rb, + ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, + ulsch->bundling, + ulsch->harq_processes[harq_pid]->O_ACK);*/ + LOG_D(PHY,"Setting beta_offset_cqi_times8 to %d, index %d\n", + beta_cqi[ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index], + ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index); + + ulsch->beta_offset_cqi_times8 = beta_cqi[ue->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index];//18; + ulsch->beta_offset_ri_times8 = beta_ri[ue->pusch_config_dedicated[eNB_id].betaOffset_RI_Index];//10; + ulsch->beta_offset_harqack_times8 = beta_ack[ue->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index];//16; ulsch->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1); ulsch->srs_active = use_srs; - ulsch->bundling = 1-AckNackFBMode; - if (ulsch->harq_processes[harq_pid]->round == 0) { - if ((rnti >= cba_rnti) && (rnti < p_rnti)) - ulsch->harq_processes[harq_pid]->status = CBA_ACTIVE; - else - ulsch->harq_processes[harq_pid]->status = ACTIVE; - - ulsch->harq_processes[harq_pid]->rvidx = 0; - ulsch->harq_processes[harq_pid]->mcs = mcs; - - // ulsch->harq_processes[harq_pid]->calibration_flag =0; - if (ulsch->harq_processes[harq_pid]->mcs < 29) - ulsch->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1]; - else - LOG_E(PHY,"Fatal: mcs > 28!!! and round == 0\n"); - - /* - else if (ulsch->harq_processes[harq_pid]->mcs == 29) { - ulsch->harq_processes[harq_pid]->mcs = 4; - ulsch->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1]; - // ulsch->harq_processes[harq_pid]->calibration_flag =1; - // printf("Auto-Calibration (UE): mcs %d, TBS %d, nb_rb %d\n",ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->TBS,ulsch->harq_processes[harq_pid]->nb_rb); - }*/ - ulsch->harq_processes[harq_pid]->Msc_initial = 12*ulsch->harq_processes[harq_pid]->nb_rb; - ulsch->harq_processes[harq_pid]->Nsymb_initial = ulsch->Nsymb_pusch; - ulsch->harq_processes[harq_pid]->round = 0; - - // a Ndi=1 automatically acknowledges previous PUSCH transmission - if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0; - } else { - // printf("Ndi = 0 : Setting RVidx from mcs %d\n",((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->mcs); - if (mcs>28) ulsch->harq_processes[harq_pid]->rvidx = mcs - 28; - - // ulsch->harq_processes[harq_pid]->round++; - } - - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d), nb_rb %d, first_rb %d, mcs %d, round %d, rv %d\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb, - ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->round,ulsch->harq_processes[harq_pid]->rvidx); - - // ulsch->n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift; - -#ifdef DEBUG_DCI - msg("Format 0 DCI : ulsch (ue): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); - msg("Format 0 DCI :ulsch (ue): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb); - msg("Format 0 DCI :ulsch (ue): harq_pid %d\n",harq_pid); - msg("Format 0 DCI :ulsch (ue): round %d\n",ulsch->harq_processes[harq_pid]->round); - msg("Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); - msg("Format 0 DCI :ulsch (ue): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); - msg("Format 0 DCI :ulsch (ue): O %d\n",ulsch->O); - - if (frame_parms->frame_type == TDD) - msg("Format 0 DCI :ulsch (ue): O_ACK/DAI %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai); + if ((rnti >= cba_rnti) && (rnti < p_rnti)) + ulsch->harq_processes[harq_pid]->status = CBA_ACTIVE; else - msg("Format 0 DCI :ulsch (ue): O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK); + ulsch->harq_processes[harq_pid]->status = ACTIVE; - msg("Format 0 DCI :ulsch (ue): Nsymb_pusch %d\n",ulsch->Nsymb_pusch); - msg("Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2); + ulsch->harq_processes[harq_pid]->rvidx = 0; + + // ulsch->harq_processes[harq_pid]->calibration_flag =0; + if (mcs < 29) { + ulsch->harq_processes[harq_pid]->mcs = mcs; + // ulsch->harq_processes[harq_pid]->round = 0; + } else { + ulsch->harq_processes[harq_pid]->rvidx = mcs - 28; + if (ulsch->harq_processes[harq_pid]->round == 0) { + LOG_W(PHY,"PUSCH::mcs = %d and DCI0::mcs(%d) > 28 and round == %d\n", ulsch->harq_processes[harq_pid]->mcs, mcs, ulsch->harq_processes[harq_pid]->round); + } else { + LOG_D(PHY,"PUSCH::mcs = %d and DCI0::mcs(%d) > 28 and round == %d\n", ulsch->harq_processes[harq_pid]->mcs, mcs, ulsch->harq_processes[harq_pid]->round); + } + //LOG_E(PHY,"Fatal: mcs(%d) > 28!!! and round == 0\n", mcs); + } + ulsch->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1]; + + /* + else if (ulsch->harq_processes[harq_pid]->mcs == 29) { + ulsch->harq_processes[harq_pid]->mcs = 4; + ulsch->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1]; + // ulsch->harq_processes[harq_pid]->calibration_flag =1; + // printf("Auto-Calibration (UE): mcs %d, TBS %d, nb_rb %d\n",ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->TBS,ulsch->harq_processes[harq_pid]->nb_rb); + }*/ + ulsch->harq_processes[harq_pid]->Msc_initial = 12*ulsch->harq_processes[harq_pid]->nb_rb; + ulsch->harq_processes[harq_pid]->Nsymb_initial = ulsch->Nsymb_pusch; + + // a Ndi=1 automatically acknowledges previous PUSCH transmission + if (ue->ulsch_Msg3_active[eNB_id] == 1) + ue->ulsch_Msg3_active[eNB_id] = 0; + + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d), nb_rb %d, first_rb %d, mcs %d, round %d, rv %d, ulsch_ue_Msg3_active %d, cqi_req %d => O %d\n", + ue->Mod_id,harq_pid, + proc->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb, + ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->round,ulsch->harq_processes[harq_pid]->rvidx, ue->ulsch_Msg3_active[eNB_id],cqi_req,ulsch->O); + + // ulsch->n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift; + +#ifdef UE_DEBUG_TRACE + + LOG_I(PHY,"Format 0 DCI : ulsch (ue): AbsSubframe %d.%d\n",proc->frame_rx%1024,subframe); + LOG_D(PHY,"Format 0 DCI : ulsch (ue): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); + LOG_D(PHY,"Format 0 DCI :ulsch (ue): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb); + LOG_D(PHY,"Format 0 DCI :ulsch (ue): rballoc %d\n",rballoc); + LOG_D(PHY,"Format 0 DCI :ulsch (ue): harq_pid %d\n",harq_pid); + LOG_D(PHY,"Format 0 DCI :ulsch (ue): first_tx %d\n",ulsch->harq_processes[harq_pid]->first_tx); + LOG_D(PHY,"Format 0 DCI :ulsch (ue): DCINdi %d\n",ulsch->harq_processes[harq_pid]->DCINdi); + LOG_D(PHY,"Format 0 DCI :ulsch (ue): round %d\n",ulsch->harq_processes[harq_pid]->round); + //LOG_I(PHY,"Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); + LOG_D(PHY,"Format 0 DCI :ulsch (ue): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); + //LOG_I(PHY,"Format 0 DCI :ulsch (ue): O %d\n",ulsch->O); + //LOG_I(PHY,"Format 0 DCI :ulsch (ue): cqiReq %d\n",cqi_req); + //if (frame_parms->frame_type == TDD) + // LOG_I(PHY,"Format 0 DCI :ulsch (ue): O_ACK/DAI %d/%d\n",ulsch->harq_processes[harq_pid]->O_ACK,dai); + //else + // LOG_I(PHY,"Format 0 DCI :ulsch (ue): O_ACK %d\n",ulsch->harq_processes[harq_pid]->O_ACK); + + LOG_D(PHY,"Format 0 DCI :ulsch (ue): Nsymb_pusch %d\n",ulsch->Nsymb_pusch); + LOG_D(PHY,"Format 0 DCI :ulsch (ue): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2); + LOG_D(PHY,"Format 0 DCI :ulsch (ue): phich status %d\n",ulsch->harq_processes[harq_pid]->status); #else UNUSED_VARIABLE(dai); #endif return(0); } else { LOG_E(PHY,"frame %d, subframe %d: FATAL ERROR, generate_ue_ulsch_params_from_dci, Illegal dci_format %d\n", - phy_vars_ue->frame_rx, subframe,dci_format); + proc->frame_rx, subframe,dci_format); return(-1); } } -int generate_eNB_ulsch_params_from_dci(void *dci_pdu, +/* +int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + void *dci_pdu, uint16_t rnti, - uint8_t sched_subframe, DCI_format_t dci_format, uint8_t UE_id, - PHY_VARS_eNB *phy_vars_eNB, uint16_t si_rnti, uint16_t ra_rnti, uint16_t p_rnti, @@ -7061,11 +8166,11 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, uint8_t harq_pid; uint32_t rb_alloc; - uint8_t transmission_mode=phy_vars_eNB->transmission_mode[UE_id]; - ANFBmode_t AckNackFBMode = phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; - LTE_eNB_ULSCH_t *ulsch=phy_vars_eNB->ulsch_eNB[UE_id]; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; + uint8_t transmission_mode=eNB->transmission_mode[UE_id]; + ANFBmode_t AckNackFBMode = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; + LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id]; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + int subframe = proc->subframe_tx; uint32_t cqi_req = 0; uint32_t dai = 0; @@ -7078,7 +8183,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, // uint32_t type; #ifdef DEBUG_DCI - LOG_D(PHY,"filling eNB ulsch params for rnti %x, dci format %d, dci %x, subframe %d\n", + printf("filling eNB ulsch params for rnti %x, dci format %d, dci %x, subframe %d\n", rnti,dci_format,*(uint32_t*)dci_pdu,subframe); #endif @@ -7086,12 +8191,9 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, harq_pid = subframe2harq_pid(frame_parms, pdcch_alloc2ul_frame(frame_parms, - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe), + proc->frame_tx, + subframe), pdcch_alloc2ul_subframe(frame_parms,subframe)); - - // printf("eNB: sched_subframe %d, subframe %d, frame_tx %d\n",sched_subframe,subframe,phy_vars_eNB->proc[sched_subframe].frame_tx); - switch (frame_parms->N_RB_DL) { case 6: if (frame_parms->frame_type == TDD) { @@ -7101,7 +8203,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, TPC = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC; mcs = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs; rballoc = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; - // hopping = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping; + // hopping = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->hopping=hopping; // type = ((DCI0_1_5MHz_TDD_1_6_t *)dci_pdu)->type; } else { cqi_req = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->cqi_req; @@ -7109,10 +8211,10 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, TPC = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->TPC; mcs = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->mcs; rballoc = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->rballoc; - // hopping = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping; + // hopping = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->hopping=hopping; // type = ((DCI0_1_5MHz_FDD_t *)dci_pdu)->type; } - + RIV_max = RIV_max6; ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT6[rballoc]; ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT6[rballoc]; @@ -7204,16 +8306,12 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, break; } + rb_alloc = rballoc; - - if (rb_alloc>RIV_max) { - LOG_E(PHY,"Format 0: rb_alloc > RIV_max\n"); - mac_xface->macphy_exit("Format 0: rb_alloc > RIV_max\n"); - return(-1); - } - + AssertFatal(rb_alloc>RIV_max, + "Format 0: rb_alloc (%d) > RIV_max (%d)\n",rb_alloc,RIV_max); #ifdef DEBUG_DCI - LOG_D(PHY,"generate_eNB_ulsch_params_from_dci: subframe %d, rnti %x,harq_pid %d,cqi_req %d\n",subframe,rnti,harq_pid,cqi_req); + printf("generate_eNB_ulsch_params_from_dci: subframe %d, rnti %x,harq_pid %d,cqi_req %d\n",subframe,rnti,harq_pid,cqi_req); #endif ulsch->harq_processes[harq_pid]->dci_alloc = 1; @@ -7223,7 +8321,17 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, if (cqi_req == 1) { - ulsch->harq_processes[harq_pid]->O_RI = 1; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table + // 36.213 7.2.1 (release 10) says: + // "RI is only reported for transmission modes 3 and 4, + // as well as transmission modes 8 and 9 with PMI/RI reporting" + // This is for aperiodic reporting. + // TODO: deal with TM 8&9 correctly when they are implemented. + // TODO: deal with periodic reporting if we implement it. + // + if (transmission_mode == 3 || transmission_mode == 4) + ulsch->harq_processes[harq_pid]->O_RI = 1; //we only support 2 antenna ports, so this is always 1 according to 3GPP 36.213 Table + else + ulsch->harq_processes[harq_pid]->O_RI = 0; switch(transmission_mode) { // The aperiodic CQI reporting mode is fixed for every transmission mode instead of being configured by higher layer signaling @@ -7563,10 +8671,12 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, ulsch->harq_processes[harq_pid]->uci_format = HLC_subband_cqi_nopmi; } + ulsch->bundling = 1-AckNackFBMode; + if (frame_parms->frame_type == FDD) { int dl_subframe = (subframe<4) ? (subframe+6) : (subframe-4); - if (phy_vars_eNB->dlsch_eNB[UE_id][0]->subframe_tx[dl_subframe]>0) { // we have downlink transmission + if (eNB->dlsch[UE_id][0]->subframe_tx[dl_subframe]>0) { // we have downlink transmission ulsch->harq_processes[harq_pid]->O_ACK = 1; } else { ulsch->harq_processes[harq_pid]->O_ACK = 0; @@ -7580,13 +8690,12 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, ulsch->harq_processes[harq_pid]->V_UL_DAI = dai+1; } - ulsch->beta_offset_cqi_times8 = beta_cqi[phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index];//18; - ulsch->beta_offset_ri_times8 = beta_ri[phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index];//10; - ulsch->beta_offset_harqack_times8 = beta_ack[phy_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index];//16; + ulsch->beta_offset_cqi_times8 = beta_cqi[eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index];//18; + ulsch->beta_offset_ri_times8 = beta_ri[eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index];//10; + ulsch->beta_offset_harqack_times8 = beta_ack[eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index];//16; ulsch->harq_processes[harq_pid]->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1); ulsch->harq_processes[harq_pid]->srs_active = use_srs; - ulsch->bundling = 1-AckNackFBMode; //Mapping of cyclic shift field in DCI format0 to n_DMRS2 (3GPP 36.211, Table 5.5.2.1.1-1) if(cshift == 0) @@ -7608,7 +8717,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d)\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift); + eNB->Mod_id,harq_pid,proc->frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift); @@ -7622,13 +8731,13 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, ulsch->harq_processes[harq_pid]->mcs = mcs; // ulsch->harq_processes[harq_pid]->calibration_flag = 0; //if (ulsch->harq_processes[harq_pid]->mcs) - /* - if (ulsch->harq_processes[harq_pid]->mcs == 29) { - ulsch->harq_processes[harq_pid]->mcs = 4; + // + //if (ulsch->harq_processes[harq_pid]->mcs == 29) { + //ulsch->harq_processes[harq_pid]->mcs = 4; // ulsch->harq_processes[harq_pid]->calibration_flag = 1; // printf("Auto-Calibration (eNB): mcs %d, nb_rb %d\n",ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->nb_rb); - } - */ + //} + ulsch->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1]; ulsch->harq_processes[harq_pid]->Msc_initial = 12*ulsch->harq_processes[harq_pid]->nb_rb; @@ -7654,15 +8763,15 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, //ulsch->n_DMRS2 = cshift; #ifdef DEBUG_DCI - msg("ulsch (eNB): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); - msg("ulsch (eNB): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb); - msg("ulsch (eNB): harq_pid %d\n",harq_pid); - msg("ulsch (eNB): round %d\n",ulsch->harq_processes[harq_pid]->round); - msg("ulsch (eNB): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); - msg("ulsch (eNB): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); - msg("ulsch (eNB): Or1 %d\n",ulsch->harq_processes[harq_pid]->Or1); - msg("ulsch (eNB): Nsymb_pusch %d\n",ulsch->harq_processes[harq_pid]->Nsymb_pusch); - msg("ulsch (eNB): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2); + printf("ulsch (eNB): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); + printf("ulsch (eNB): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb); + printf("ulsch (eNB): harq_pid %d\n",harq_pid); + printf("ulsch (eNB): round %d\n",ulsch->harq_processes[harq_pid]->round); + printf("ulsch (eNB): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); + printf("ulsch (eNB): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); + printf("ulsch (eNB): Or1 %d\n",ulsch->harq_processes[harq_pid]->Or1); + printf("ulsch (eNB): Nsymb_pusch %d\n",ulsch->harq_processes[harq_pid]->Nsymb_pusch); + printf("ulsch (eNB): cshift %d\n",ulsch->harq_processes[harq_pid]->n_DMRS2); #else UNUSED_VARIABLE(dai); #endif @@ -7673,17 +8782,17 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, } } +*/ - -double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) +double sinr_eff_cqi_calc(PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe) { - uint8_t transmission_mode = phy_vars_ue->transmission_mode[eNB_id]; - PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - int32_t **dl_channel_est = phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id]; + uint8_t transmission_mode = ue->transmission_mode[eNB_id]; + PHY_MEASUREMENTS *meas = &ue->measurements; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + int32_t **dl_channel_est = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id]; double *s_dB; - s_dB = phy_vars_ue->sinr_CQI_dB; - // LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id]; + s_dB = ue->sinr_CQI_dB; + // LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; //for the calculation of SINR_eff for CQI calculation int count,a_rx,a_tx; double abs_channel=0; @@ -7697,7 +8806,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) switch(transmission_mode) { case 1: for (count=0; countN_RB_DL*12; count++) { - for(a_tx=0; a_txnb_antennas_tx_eNB; a_tx++) { + for(a_tx=0; a_txnb_antenna_ports_eNB; a_tx++) { for (a_rx=0; a_rxnb_antennas_rx; a_rx++) { s_dB[count] = 10*log10(pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2],2) + pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2], 2)) - meas->n0_power_avg_dB; @@ -7711,7 +8820,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) for (count=0; countN_RB_DL*12; count++) { abs_channel=0; - for(a_tx=0; a_txnb_antennas_tx_eNB; a_tx++) { + for(a_tx=0; a_txnb_antenna_ports_eNB; a_tx++) { for (a_rx=0; a_rxnb_antennas_rx; a_rx++) { abs_channel += (pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2],2) + pow(((int16_t *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2],2)); } @@ -7731,7 +8840,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) qq = (q>>(((count/12)>>2)<<1))&3; //printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq); - for(a_tx=0; a_txnb_antennas_tx_eNB; a_tx++) { + for(a_tx=0; a_txnb_antenna_ports_eNB; a_tx++) { for (a_rx=0; a_rxnb_antennas_rx; a_rx++) { switch(qq) { case 0: @@ -7795,7 +8904,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) break; default: - msg("Problem in SINR Calculation for TM5 \n"); + printf("Problem in SINR Calculation for TM5 \n"); break; }//switch(qq) }//a_rx @@ -7813,7 +8922,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) qq = (q>>(((count/12)>>2)<<1))&3; //printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq); - for(a_tx=0; a_txnb_antennas_tx_eNB; a_tx++) { + for(a_tx=0; a_txnb_antenna_ports_eNB; a_tx++) { for (a_rx=0; a_rxnb_antennas_rx; a_rx++) { switch(qq) { case 0: @@ -7861,7 +8970,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) break; default: - msg("Problem in SINR Calculation for TM6 \n"); + printf("Problem in SINR Calculation for TM6 \n"); break; }//switch(qq) }//a_rx @@ -7873,7 +8982,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) break; default: - msg("Problem in SINR Calculation for CQI \n"); + printf("Problem in SINR Calculation for CQI \n"); break; } @@ -7942,13 +9051,14 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id) 3) + p_qam64[5]*pow(I_qam64_avg,2) + p_qam64[6]*I_qam64_avg + p_qam64[7]); sinr_eff = cmax3(sinr_eff_qpsk,sinr_eff_qam16,sinr_eff_qam64); - //msg("SINR_Eff = %e\n",sinr_eff); + //printf("SINR_Eff = %e\n",sinr_eff); return(sinr_eff); } // + #ifdef DEBUG_DLSCH_TOOLS main() { @@ -7961,20 +9071,20 @@ main() rah = 0; rballoc = 0x1fff; - msg("rballoc 0 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 0 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); rah = 1; rballoc = 0x1678; - msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); rballoc = 0xfffc; - msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); rballoc = 0xfffd; - msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); rballoc = 0xffff; - msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); rballoc = 0xfffe; - msg("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); + printf("rballoc 1 %x => %x\n",rballoc,conv_rballoc(rah,rballoc)); } #endif diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 6d34b8c9b9..f1f4be3072 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/defs.h * \brief data structures for PDSCH/DLSCH/PUSCH/ULSCH physical and transport channel descriptors (TX/RX) @@ -40,7 +32,9 @@ #ifndef __LTE_TRANSPORT_DEFS__H__ #define __LTE_TRANSPORT_DEFS__H__ #include "PHY/defs.h" +#include "PHY/impl_defs_lte.h" #include "dci.h" +#include "mdci.h" #include "uci.h" #ifndef STANDALONE_COMPILE #include "UTIL/LISTS/list.h" @@ -87,14 +81,22 @@ #if !defined(C_RNTI) #define C_RNTI (rnti_t)0x1234 #endif - -#define PMI_2A_11 0 +// These are the codebook indexes according to Table 6.3.4.2.3-1 of 36.211 +//1 layer +#define PMI_2A_11 0 #define PMI_2A_1m1 1 -#define PMI_2A_1j 2 +#define PMI_2A_1j 2 #define PMI_2A_1mj 3 +//2 layers +#define PMI_2A_R1_10 0 +#define PMI_2A_R1_11 1 +#define PMI_2A_R1_1j 2 + +typedef enum { SEARCH_EXIST=0, + SEARCH_EXIST_OR_FREE} find_type_t; typedef enum { - SCH_IDLE, + SCH_IDLE=0, ACTIVE, CBA_ACTIVE, DISABLED @@ -106,6 +108,8 @@ typedef struct { SCH_status_t status; /// Transport block size uint32_t TBS; + /// pointer to pdu from MAC interface (this is "a" in 36.212) + uint8_t *pdu; /// The payload + CRC size in bits, "B" from 36-212 uint32_t B; /// Pointer to the payload @@ -120,7 +124,9 @@ typedef struct { uint32_t subframe; /// Index of current HARQ round for this DLSCH uint8_t round; - /// MCS format for this DLSCH + /// Modulation order + uint8_t Qm; + /// MCS uint8_t mcs; /// Redundancy-version of the current sub-frame uint8_t rvidx; @@ -140,10 +146,14 @@ typedef struct { uint32_t cqi_alloc2; /// Current Number of RBs uint16_t nb_rb; + /// Current NDI + uint8_t ndi; /// downlink power offset field uint8_t dl_power_off; + /// start symbold of pdsch + uint8_t pdsch_start; /// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18) - uint8_t e[MAX_NUM_CHANNEL_BITS]; + uint8_t e[MAX_NUM_CHANNEL_BITS] __attribute__((aligned(32))); /// Turbo-code outputs (36-212 V8.6 2009-03, p.12 uint8_t *d[MAX_NUM_DLSCH_SEGMENTS];//[(96+3+(3*6144))]; /// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17) @@ -166,6 +176,8 @@ typedef struct { uint8_t Nlayers; /// First layer for this PSCH transmission uint8_t first_layer; + /// codeword this transport block is mapped to + uint8_t codeword; } LTE_DL_eNB_HARQ_t; typedef struct { @@ -235,21 +247,37 @@ typedef struct { uint8_t control_only; /// Flag to indicate that this is a calibration ULSCH (i.e. no MAC SDU and filled with TDD calibration information) // int calibration_flag; -} LTE_UL_UE_HARQ_t; + /// Number of soft channel bits + uint32_t G; + + // decode phich + uint8_t decode_phich; +} LTE_UL_UE_HARQ_t; + +#ifdef Rel14 +typedef enum { + CEmodeA = 0, + CEmodeB = 1 +} CEmode_t; +#endif typedef struct { /// TX buffers for UE-spec transmission (antenna ports 5 or 7..14, prior to precoding) - uint32_t *txdataF[8]; + int32_t *txdataF[8]; + /// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers? + int32_t **ue_spec_bf_weights[4]; + /// dl channel estimates (estimated from ul channel estimates) + int32_t **calib_dl_ch_estimates; /// Allocated RNTI (0 means DLSCH_t is not currently used) uint16_t rnti; /// Active flag for baseband transmitter processing uint8_t active; + /// HARQ process mask, indicates which processes are currently active + uint16_t harq_mask; /// Indicator of TX activation per subframe. Used during PUCCH detection for ACK/NAK. uint8_t subframe_tx[10]; /// First CCE of last PDSCH scheduling per subframe. Again used during PUCCH detection for ACK/NAK. uint8_t nCCE[10]; - /// Current HARQ process id - uint8_t current_harq_pid; /// Process ID's per subframe. Used to associate received ACKs on PUSCH/PUCCH to DLSCH harq process ids uint8_t harq_ids[10]; /// Window size (in outgoing transport blocks) for fine-grain rate adaptation @@ -274,7 +302,13 @@ typedef struct { int16_t sqrt_rho_a; /// amplitude of PDSCH (compared to RS) in symbols containing pilots int16_t sqrt_rho_b; - +#ifdef Rel14 + /// indicator that this DLSCH corresponds to SIB1-BR, needed for c_init for scrambling + uint8_t sib1_br_flag; + /// initial absolute subframe (see 36.211 Section 6.3.1), needed for c_init for scrambling + uint16_t i0; + CEmode_t CEmode; +#endif } LTE_eNB_DLSCH_t; #define PUSCH_x 2 @@ -287,8 +321,8 @@ typedef struct { uint8_t srs_active; /// Pointers to 8 HARQ processes for the ULSCH LTE_UL_UE_HARQ_t *harq_processes[8]; - /// Pointer to CQI data - uint8_t o[MAX_CQI_BYTES]; + /// Pointer to CQI data (+1 for 8 bits crc) + uint8_t o[1+MAX_CQI_BYTES]; /// Length of CQI data (bits) uint8_t O; /// Format of CQI data @@ -341,12 +375,16 @@ typedef struct { int16_t Po_PUSCH; /// PHR - current power headroom (based on last PUSCH transmission) int16_t PHR; + /// Po_SRS - target output power for SRS + int16_t Po_SRS; /// num active cba group uint8_t num_active_cba_groups; /// num dci found for cba uint8_t num_cba_dci[10]; /// allocated CBA RNTI uint16_t cba_rnti[4];//NUM_MAX_CBA_GROUP]; + /// UL max-harq-retransmission + uint8_t Mlimit; } LTE_UE_ULSCH_t; typedef struct { @@ -356,24 +394,34 @@ typedef struct { uint8_t rar_alloc; /// Status Flag indicating for this ULSCH (idle,active,disabled) SCH_status_t status; - /// Subframe scheduling indicator (i.e. Transmission opportunity indicator) - uint8_t subframe_scheduling_flag; - /// Subframe cba scheduling indicator (i.e. CBA Transmission opportunity indicator) - uint8_t subframe_cba_scheduling_flag; + /// Flag to indicate that eNB should decode UE Msg3 + uint8_t Msg3_flag; + /// Subframe for reception + uint8_t subframe; + /// Frame for reception + uint32_t frame; + /// Flag to indicate that the UL configuration has been handled. Used to remove a stale ULSCH when frame wraps around + uint8_t handled; /// PHICH active flag uint8_t phich_active; /// PHICH ACK uint8_t phich_ACK; - /// Last TPC command - uint8_t TPC; /// First Allocated RB uint16_t first_rb; + /// First Allocated RB - previous scheduling + /// This is needed for PHICH generation which + /// is done after a new scheduling + uint16_t previous_first_rb; /// Current Number of RBs - uint16_t nb_rb; + uint16_t nb_rb; + /// Current Modulation order + uint8_t Qm; /// Transport block size uint32_t TBS; /// The payload + CRC size in bits uint32_t B; + /// Number of soft channel bits + uint32_t G; /// CQI CRC status uint8_t cqi_crc_status; /// Pointer to CQI data @@ -407,7 +455,7 @@ typedef struct { /// coded RI bits int16_t q_RI[MAX_RI_PAYLOAD]; /// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18) - int16_t e[MAX_NUM_CHANNEL_BITS]; + int16_t e[MAX_NUM_CHANNEL_BITS] __attribute__((aligned(32))); /// Temporary h sequence to flag PUSCH_x/PUSCH_y symbols which are not scrambled uint8_t h[MAX_NUM_CHANNEL_BITS]; /// Pointer to the payload @@ -420,10 +468,10 @@ typedef struct { uint8_t Nsymb_pusch; /// SRS active flag uint8_t srs_active; + /// NDI + uint8_t ndi; /// Index of current HARQ round for this ULSCH uint8_t round; - /// MCS format for this ULSCH - uint8_t mcs; /// Redundancy-version of the current sub-frame uint8_t rvidx; /// soft bits for each received segment ("w"-sequence)(for definition see 36-212 V8.6 2009-03, p.15) @@ -450,6 +498,10 @@ typedef struct { uint8_t Nsymb_initial; /// n_DMRS for cyclic shift of DMRS (36.213 Table 9.1.2-2) uint8_t n_DMRS; + /// n_DMRS for cyclic shift of DMRS (36.213 Table 9.1.2-2) - previous scheduling + /// This is needed for PHICH generation which + /// is done after a new scheduling + uint8_t previous_n_DMRS; /// n_DMRS 2 for cyclic shift of DMRS (36.211 Table 5.5.1.1.-1) uint8_t n_DMRS2; /// Flag to indicate that this ULSCH is for calibration information sent from UE (i.e. no MAC SDU to pass up) @@ -458,7 +510,91 @@ typedef struct { int32_t delta_TF; } LTE_UL_eNB_HARQ_t; + +typedef enum { + pucch_format1=0, + pucch_format1a, + pucch_format1b, + pucch_format1b_csA2, + pucch_format1b_csA3, + pucch_format1b_csA4, + pucch_format2, + pucch_format2a, + pucch_format2b, + pucch_format3 // PUCCH format3 +} PUCCH_FMT_t; + +typedef enum { + SR, + HARQ, + CQI, + HARQ_SR, + HARQ_CQI, + SR_CQI, + HARQ_SR_CQI +} UCI_type_t; + +#ifdef Rel14 +typedef enum { + NOCE, + CEMODEA, + CEMODEB +} UE_type_t; +#endif + typedef struct { + uint8_t active; + /// Absolute frame for this UCI + uint16_t frame; + /// Absolute subframe for this UCI + uint8_t subframe; + /// corresponding UE RNTI + uint16_t rnti; + /// Type (SR,HARQ,CQI,HARQ_SR,HARQ_CQI,SR_CQI,HARQ_SR_CQI) + UCI_type_t type; + /// SRS active flag + uint8_t srs_active; + /// PUCCH format to use + PUCCH_FMT_t pucch_fmt; + /// number of PUCCH antenna ports + uint8_t num_antenna_ports; + /// number of PUCCH resources + uint8_t num_pucch_resources; + /// two antenna n1_pucch 1_0 + uint16_t n_pucch_1[4][2]; + /// two antenna n1_pucch 1_0 for SR + uint16_t n_pucch_1_0_sr[2]; + /// two antenna n2_pucch + uint16_t n_pucch_2[2]; + /// two antenna n3_pucch + uint16_t n_pucch_3[2]; + /// TDD Bundling/multiplexing flag + uint8_t tdd_bundling; + /// Received Energy + uint32_t stat; +#ifdef Rel14 + /// non BL/CE, CEmodeA, CEmodeB + UE_type_t ue_type; + /// Indicates the symbols that are left empty due to eMTC retuning. + uint8_t empty_symbols; + /// number of repetitions for BL/CE + uint16_t total_repetitions; + /// The size of the DL CQI/PMI in bits. + uint16_t dl_cqi_pmi_size2; + /// The starting PRB for the PUCCH + uint8_t starting_prb; + /// The number of PRB in PUCCH + uint8_t n_PRB; + /// Selected CDM option + uint8_t cdm_Index; + // Indicates if the resource blocks allocated for this grant overlap with the SRS configuration. + uint8_t Nsrs; +#endif +} LTE_eNB_UCI; + +typedef struct { + /// HARQ process mask, indicates which processes are currently active + uint16_t harq_mask; /// Pointers to 8 HARQ processes for the ULSCH LTE_UL_eNB_HARQ_t *harq_processes[8]; /// Maximum number of HARQ rounds @@ -475,12 +611,6 @@ typedef struct { uint16_t beta_offset_harqack_times8; /// Flag to indicate that eNB awaits UE Msg3 uint8_t Msg3_active; - /// Flag to indicate that eNB should decode UE Msg3 - uint8_t Msg3_flag; - /// Subframe for Msg3 - uint8_t Msg3_subframe; - /// Frame for Msg3 - uint32_t Msg3_frame; /// RNTI attributed to this ULSCH uint16_t rnti; /// cyclic shift for DM RS @@ -569,6 +699,8 @@ typedef struct { uint32_t trials[8]; /// error statistics per round uint32_t errors[8]; + /// codeword this transport block is mapped to + uint8_t codeword; } LTE_DL_UE_HARQ_t; typedef struct { @@ -660,12 +792,16 @@ typedef struct { typedef struct { /// HARQ process id uint8_t harq_id; - /// ACK bits (after decoding) + /// ACK bits (after decoding) 0:NACK / 1:ACK / 2:DTX uint8_t ack; /// send status (for PUCCH) uint8_t send_harq_status; /// nCCE (for PUCCH) uint8_t nCCE; + /// DAI value detected from DCI1/1a/1b/1d/2/2a/2b/2c. 0xff indicates not touched + uint8_t vDAI_DL; + /// DAI value detected from DCI0/4. 0xff indicates not touched + uint8_t vDAI_UL; } harq_status_t; typedef struct { @@ -679,7 +815,7 @@ typedef struct { int16_t sqrt_rho_a; /// amplitude of PDSCH (compared to RS) in symbols containing pilots int16_t sqrt_rho_b; - /// Current HARQ process id + /// Current HARQ process id threadRx Odd and threadRx Even uint8_t current_harq_pid; /// Current subband antenna selection uint32_t antenna_alloc; @@ -703,58 +839,35 @@ typedef struct { uint32_t Nsoft; /// Maximum number of Turbo iterations uint8_t max_turbo_iterations; + /// number of iterations used in last turbo decoding + uint8_t last_iteration_cnt; /// accumulated tx power adjustment for PUCCH int8_t g_pucch; } LTE_UE_DLSCH_t; -typedef enum {format0, - format1, - format1A, - format1B, - format1C, - format1D, - format1E_2A_M10PRB, - format2, - format2A, - format2B, - format2C, - format2D, - format3 - } DCI_format_t; + typedef enum { SI_PDSCH=0, RA_PDSCH, + P_PDSCH, PDSCH, + PDSCH1, PMCH } PDSCH_t; typedef enum { - pucch_format1=0, - pucch_format1a, - pucch_format1b, - pucch_format2, - pucch_format2a, - pucch_format2b -} PUCCH_FMT_t; + rx_standard=0, + rx_IC_single_stream, + rx_IC_dual_stream, + rx_SIC_dual_stream +} RX_type_t; -typedef struct { - /// Length of DCI in bits - uint8_t dci_length; - /// Aggregation level - uint8_t L; - /// Position of first CCE of the dci - int firstCCE; - /// flag to indicate that this is a RA response - boolean_t ra_flag; - /// rnti - rnti_t rnti; - /// Format - DCI_format_t format; - /// DCI pdu - uint8_t dci_pdu[8]; -} DCI_ALLOC_t; +typedef enum { + DCI_COMMON_SPACE, + DCI_UE_SPACE +} dci_space_t; /**@}*/ diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index 366b93e71d..bd3c92454f 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/dlsch_coding.c * \brief Top-level routines for implementing Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 @@ -48,6 +40,8 @@ #include "SCHED/defs.h" #include "defs.h" #include "UTIL/LOG/vcd_signal_dumper.h" +#include "UTIL/LOG/log.h" +#include //#define DEBUG_DLSCH_CODING //#define DEBUG_DLSCH_FREE 1 @@ -67,37 +61,37 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch) if (dlsch) { #ifdef DEBUG_DLSCH_FREE - msg("Freeing dlsch %p\n",dlsch); + printf("Freeing dlsch %p\n",dlsch); #endif for (i=0; iMdlharq; i++) { #ifdef DEBUG_DLSCH_FREE - msg("Freeing dlsch process %d\n",i); + printf("Freeing dlsch process %d\n",i); #endif if (dlsch->harq_processes[i]) { #ifdef DEBUG_DLSCH_FREE - msg("Freeing dlsch process %d (%p)\n",i,dlsch->harq_processes[i]); + printf("Freeing dlsch process %d (%p)\n",i,dlsch->harq_processes[i]); #endif if (dlsch->harq_processes[i]->b) { free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES); dlsch->harq_processes[i]->b = NULL; #ifdef DEBUG_DLSCH_FREE - msg("Freeing dlsch process %d b (%p)\n",i,dlsch->harq_processes[i]->b); + printf("Freeing dlsch process %d b (%p)\n",i,dlsch->harq_processes[i]->b); #endif } #ifdef DEBUG_DLSCH_FREE - msg("Freeing dlsch process %d c (%p)\n",i,dlsch->harq_processes[i]->c); + printf("Freeing dlsch process %d c (%p)\n",i,dlsch->harq_processes[i]->c); #endif for (r=0; rharq_processes[i]->c[r]); + printf("Freeing dlsch process %d c[%d] (%p)\n",i,r,dlsch->harq_processes[i]->c[r]); #endif - + if (dlsch->harq_processes[i]->c[r]) { free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768); dlsch->harq_processes[i]->c[r] = NULL; @@ -106,24 +100,25 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch) free16(dlsch->harq_processes[i]->d[r],(96+12+3+(3*6144))); dlsch->harq_processes[i]->d[r] = NULL; } - + } free16(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t)); dlsch->harq_processes[i] = NULL; } } - + free16(dlsch,sizeof(LTE_eNB_DLSCH_t)); dlsch = NULL; } - + } -LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t Nsoft,unsigned char N_RB_DL, uint8_t abstraction_flag) +LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_t Nsoft,unsigned char N_RB_DL, uint8_t abstraction_flag, LTE_DL_FRAME_PARMS* frame_parms) { LTE_eNB_DLSCH_t *dlsch; - unsigned char exit_flag = 0,i,j,r; + unsigned char exit_flag = 0,i,j,r,aa,layer; + int re; unsigned char bw_scaling =1; switch (N_RB_DL) { @@ -150,8 +145,27 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_ bzero(dlsch,sizeof(LTE_eNB_DLSCH_t)); dlsch->Kmimo = Kmimo; dlsch->Mdlharq = Mdlharq; - dlsch->Mlimit = 4; + dlsch->Mlimit = 8; dlsch->Nsoft = Nsoft; + + for (layer=0; layer<4; layer++) { + dlsch->ue_spec_bf_weights[layer] = (int32_t**)malloc16(64*sizeof(int32_t*)); + + for (aa=0; aa<64; aa++) { + dlsch->ue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); + for (re=0;reue_spec_bf_weights[layer][aa][re] = 0x00007fff; + } + } + } + + // NOTE: THIS HAS TO BE REVISED FOR RU, commenting to remove memory leak !!!!! + /* + dlsch->calib_dl_ch_estimates = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); + for (aa=0; aanb_antennas_tx; aa++) { + dlsch->calib_dl_ch_estimates[aa] = (int32_t *)malloc16(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES*sizeof(int32_t)); + + }*/ for (i=0; i<10; i++) dlsch->harq_ids[i] = Mdlharq; @@ -169,7 +183,7 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_ if (dlsch->harq_processes[i]->b) { bzero(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); } else { - msg("Can't get b\n"); + printf("Can't get b\n"); exit_flag=1; } @@ -181,19 +195,19 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_ if (dlsch->harq_processes[i]->c[r]) { bzero(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+ 768); } else { - msg("Can't get c\n"); + printf("Can't get c\n"); exit_flag=2; } if (dlsch->harq_processes[i]->d[r]) { bzero(dlsch->harq_processes[i]->d[r],(96+12+3+(3*6144))); } else { - msg("Can't get d\n"); + printf("Can't get d\n"); exit_flag=2; } } } } else { - msg("Can't get harq_p %d\n",i); + printf("Can't get harq_p %d\n",i); exit_flag=3; } } @@ -208,7 +222,7 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,uint32_ if (dlsch->harq_processes[i]->d[r]) dlsch->harq_processes[i]->d[r][j] = LTE_NULL; } - + } return(dlsch); @@ -233,6 +247,7 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch) Mdlharq = dlsch->Mdlharq; dlsch->rnti = 0; dlsch->active = 0; + dlsch->harq_mask = 0; for (i=0; i<10; i++) dlsch->harq_ids[i] = Mdlharq; @@ -247,15 +262,308 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch) for (r=0; rharq_processes[i]->d[r]) dlsch->harq_processes[i]->d[r][j] = LTE_NULL; - + } } } } -int dlsch_encoding(unsigned char *a, - LTE_DL_FRAME_PARMS *frame_parms, +int dlsch_encoding_2threads0(te_params *tep) { + + LTE_eNB_DLSCH_t *dlsch = tep->dlsch; + unsigned int G = tep->G; + unsigned char harq_pid = tep->harq_pid; + + unsigned short iind; + + unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; + unsigned int Kr=0,Kr_bytes,r,r_offset=0; + // unsigned short m=dlsch->harq_processes[harq_pid]->mcs; + + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W, VCD_FUNCTION_IN); + + if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet + + for (r=0; rharq_processes[harq_pid]->C>>1; r++) { + + if (rharq_processes[harq_pid]->Cminus) + Kr = dlsch->harq_processes[harq_pid]->Kminus; + else + Kr = dlsch->harq_processes[harq_pid]->Kplus; + + Kr_bytes = Kr>>3; + + // get interleaver index for Turbo code (lookup in Table 5.1.3-3 36-212, V8.6 2009-03, p. 13-14) + if (Kr_bytes<=64) + iind = (Kr_bytes-5); + else if (Kr_bytes <=128) + iind = 59 + ((Kr_bytes-64)>>1); + else if (Kr_bytes <= 256) + iind = 91 + ((Kr_bytes-128)>>2); + else if (Kr_bytes <= 768) + iind = 123 + ((Kr_bytes-256)>>3); + else { + printf("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes); + return(-1); + } + + + + threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r], + Kr>>3, + &dlsch->harq_processes[harq_pid]->d[r][96], + (r==0) ? dlsch->harq_processes[harq_pid]->F : 0, + f1f2mat_old[iind*2], // f1 (see 36121-820, page 14) + f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14) + ); + dlsch->harq_processes[harq_pid]->RTC[r] = + sub_block_interleaving_turbo(4+(Kr_bytes*8), + &dlsch->harq_processes[harq_pid]->d[r][96], + dlsch->harq_processes[harq_pid]->w[r]); + } + + } + + // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the + // outputs for each code segment, see Section 5.1.5 p.20 + + for (r=0; rharq_processes[harq_pid]->C>>1; r++) { + r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r], + G, //G + dlsch->harq_processes[harq_pid]->w[r], + dlsch->harq_processes[harq_pid]->e+r_offset, + dlsch->harq_processes[harq_pid]->C, // C + dlsch->Nsoft, // Nsoft, + dlsch->Mdlharq, + dlsch->Kmimo, + dlsch->harq_processes[harq_pid]->rvidx, + dlsch->harq_processes[harq_pid]->Qm, + dlsch->harq_processes[harq_pid]->Nl, + r, + nb_rb); + // m); // r + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING_W, VCD_FUNCTION_OUT); + + return(0); +} + +extern int oai_exit; +void *te_thread(void *param) { + pthread_setname_np( pthread_self(),"te processing"); + LOG_I(PHY,"thread te created id=%ld", syscall(__NR_gettid)); + + eNB_proc_t *proc = &((te_params *)param)->eNB->proc; + while (!oai_exit) { + + + if (wait_on_condition(&proc->mutex_te,&proc->cond_te,&proc->instance_cnt_te,"te thread")<0) break; + + dlsch_encoding_2threads0((te_params*)param); + + + if (release_thread(&proc->mutex_te,&proc->instance_cnt_te,"te thread")<0) break; + + if (pthread_cond_signal(&proc->cond_te) != 0) { + printf("[eNB] ERROR pthread_cond_signal for te thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return(NULL); + } + } + + return(NULL); +} + +int dlsch_encoding_2threads(PHY_VARS_eNB *eNB, + unsigned char *a, + uint8_t num_pdcch_symbols, + LTE_eNB_DLSCH_t *dlsch, + int frame, + uint8_t subframe, + time_stats_t *rm_stats, + time_stats_t *te_stats, + time_stats_t *i_stats) +{ + + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; + unsigned int G; + unsigned int crc=1; + unsigned short iind; + + unsigned char harq_pid = dlsch->harq_ids[subframe]; + unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; + unsigned int A; + unsigned char mod_order; + unsigned int Kr=0,Kr_bytes,r,r_offset=0; + // unsigned short m=dlsch->harq_processes[harq_pid]->mcs; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); + + A = dlsch->harq_processes[harq_pid]->TBS; //6228 + mod_order = dlsch->harq_processes[harq_pid]->Qm; + G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,dlsch->harq_processes[harq_pid]->mimo_mode==TM7?7:0); + + + if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet + + // Add 24-bit crc (polynomial A) to payload + crc = crc24a(a, + A)>>8; + a[A>>3] = ((uint8_t*)&crc)[2]; + a[1+(A>>3)] = ((uint8_t*)&crc)[1]; + a[2+(A>>3)] = ((uint8_t*)&crc)[0]; + + dlsch->harq_processes[harq_pid]->B = A+24; + memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4); + + if (lte_segmentation(dlsch->harq_processes[harq_pid]->b, + dlsch->harq_processes[harq_pid]->c, + dlsch->harq_processes[harq_pid]->B, + &dlsch->harq_processes[harq_pid]->C, + &dlsch->harq_processes[harq_pid]->Cplus, + &dlsch->harq_processes[harq_pid]->Cminus, + &dlsch->harq_processes[harq_pid]->Kplus, + &dlsch->harq_processes[harq_pid]->Kminus, + &dlsch->harq_processes[harq_pid]->F)<0) + return(-1); + + + + if (proc->instance_cnt_te==0) { + printf("[eNB] TE thread busy\n"); + exit_fun("TE thread busy"); + pthread_mutex_unlock( &proc->mutex_te ); + return(-1); + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT); + ++proc->instance_cnt_te; + + proc->tep.eNB = eNB; + proc->tep.dlsch = dlsch; + proc->tep.G = G; + proc->tep.harq_pid = harq_pid; + + // wakeup worker to do second half segments + if (pthread_cond_signal(&proc->cond_te) != 0) { + printf("[eNB] ERROR pthread_cond_signal for te thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return (-1); + } + + pthread_mutex_unlock( &proc->mutex_te ); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); + for (r=dlsch->harq_processes[harq_pid]->C>>1; rharq_processes[harq_pid]->C; r++) { + + if (rharq_processes[harq_pid]->Cminus) + Kr = dlsch->harq_processes[harq_pid]->Kminus; + else + Kr = dlsch->harq_processes[harq_pid]->Kplus; + + Kr_bytes = Kr>>3; + + // get interleaver index for Turbo code (lookup in Table 5.1.3-3 36-212, V8.6 2009-03, p. 13-14) + if (Kr_bytes<=64) + iind = (Kr_bytes-5); + else if (Kr_bytes <=128) + iind = 59 + ((Kr_bytes-64)>>1); + else if (Kr_bytes <= 256) + iind = 91 + ((Kr_bytes-128)>>2); + else if (Kr_bytes <= 768) + iind = 123 + ((Kr_bytes-256)>>3); + else { + printf("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes); + return(-1); + } + + + start_meas(te_stats); + threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r], + Kr>>3, + &dlsch->harq_processes[harq_pid]->d[r][96], + (r==0) ? dlsch->harq_processes[harq_pid]->F : 0, + f1f2mat_old[iind*2], // f1 (see 36121-820, page 14) + f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14) + ); + stop_meas(te_stats); + + start_meas(i_stats); + dlsch->harq_processes[harq_pid]->RTC[r] = + sub_block_interleaving_turbo(4+(Kr_bytes*8), + &dlsch->harq_processes[harq_pid]->d[r][96], + dlsch->harq_processes[harq_pid]->w[r]); + stop_meas(i_stats); + } + + } + else { + + proc->tep.eNB = eNB; + proc->tep.dlsch = dlsch; + proc->tep.G = G; + + // wakeup worker to do second half segments + if (pthread_cond_signal(&proc->cond_te) != 0) { + printf("[eNB] ERROR pthread_cond_signal for te thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return (-1); + } + } + + // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the + // outputs for each code segment, see Section 5.1.5 p.20 + + for (r=0,r_offset=0; rharq_processes[harq_pid]->C; r++) { + + // get information for E for the segments that are handled by the worker thread + if (r<(dlsch->harq_processes[harq_pid]->C>>1)) { + int Nl=dlsch->harq_processes[harq_pid]->Nl; + int Qm=dlsch->harq_processes[harq_pid]->Qm; + int C = dlsch->harq_processes[harq_pid]->C; + int Gp = G/Nl/Qm; + int GpmodC = Gp%C; + if (r < (C-(GpmodC))) + r_offset += Nl*Qm * (Gp/C); + else + r_offset += Nl*Qm * ((GpmodC==0?0:1) + (Gp/C)); + } + else { + start_meas(rm_stats); + r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r], + G, //G + dlsch->harq_processes[harq_pid]->w[r], + dlsch->harq_processes[harq_pid]->e+r_offset, + dlsch->harq_processes[harq_pid]->C, // C + dlsch->Nsoft, // Nsoft, + dlsch->Mdlharq, + dlsch->Kmimo, + dlsch->harq_processes[harq_pid]->rvidx, + dlsch->harq_processes[harq_pid]->Qm, + dlsch->harq_processes[harq_pid]->Nl, + r, + nb_rb); + // m); // r + stop_meas(rm_stats); + } + } + + // wait for worker to finish + + wait_on_busy_condition(&proc->mutex_te,&proc->cond_te,&proc->instance_cnt_te,"te thread"); + + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT); + + return(0); +} + +int dlsch_encoding(PHY_VARS_eNB *eNB, + unsigned char *a, uint8_t num_pdcch_symbols, LTE_eNB_DLSCH_t *dlsch, int frame, @@ -269,25 +577,35 @@ int dlsch_encoding(unsigned char *a, unsigned int crc=1; unsigned short iind; - unsigned char harq_pid = dlsch->current_harq_pid; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + unsigned char harq_pid = dlsch->harq_ids[subframe]; unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; unsigned int A; unsigned char mod_order; unsigned int Kr=0,Kr_bytes,r,r_offset=0; - unsigned short m=dlsch->harq_processes[harq_pid]->mcs; + // unsigned short m=dlsch->harq_processes[harq_pid]->mcs; + uint8_t beamforming_mode=0; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); A = dlsch->harq_processes[harq_pid]->TBS; //6228 // printf("Encoder: A: %d\n",A); - mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs); + mod_order = dlsch->harq_processes[harq_pid]->Qm; - G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe); + if(dlsch->harq_processes[harq_pid]->mimo_mode == TM7) + beamforming_mode = 7; + else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM8) + beamforming_mode = 8; + else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM9_10) + beamforming_mode = 9; + G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode); // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet - +#ifdef DEBUG_DLSCH_CODING + printf("encoding thinks this is a new packet \n"); +#endif /* int i; printf("dlsch (tx): \n"); @@ -319,6 +637,7 @@ int dlsch_encoding(unsigned char *a, return(-1); for (r=0; rharq_processes[harq_pid]->C; r++) { + if (rharq_processes[harq_pid]->Cminus) Kr = dlsch->harq_processes[harq_pid]->Kminus; else @@ -336,7 +655,7 @@ int dlsch_encoding(unsigned char *a, else if (Kr_bytes <= 768) iind = 123 + ((Kr_bytes-256)>>3); else { - msg("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes); + printf("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes); return(-1); } @@ -345,15 +664,15 @@ int dlsch_encoding(unsigned char *a, printf("Generating Code Segment %d (%d bits)\n",r,Kr); // generate codewords - msg("bits_per_codeword (Kr)= %d, A %d\n",Kr,A); - msg("N_RB = %d\n",nb_rb); - msg("Ncp %d\n",frame_parms->Ncp); - msg("mod_order %d\n",mod_order); + printf("bits_per_codeword (Kr)= %d, A %d\n",Kr,A); + printf("N_RB = %d\n",nb_rb); + printf("Ncp %d\n",frame_parms->Ncp); + printf("mod_order %d\n",mod_order); #endif #ifdef DEBUG_DLSCH_CODING - msg("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]); + printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]); #endif start_meas(te_stats); threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r], @@ -385,7 +704,7 @@ int dlsch_encoding(unsigned char *a, for (r=0; rharq_processes[harq_pid]->C; r++) { #ifdef DEBUG_DLSCH_CODING - msg("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", + printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", r, G, Kr*3, @@ -393,6 +712,9 @@ int dlsch_encoding(unsigned char *a, #endif start_meas(rm_stats); +#ifdef DEBUG_DLSCH_CODING + printf("rvidx in encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx); +#endif r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r], G, //G dlsch->harq_processes[harq_pid]->w[r], @@ -402,11 +724,11 @@ int dlsch_encoding(unsigned char *a, dlsch->Mdlharq, dlsch->Kmimo, dlsch->harq_processes[harq_pid]->rvidx, - get_Qm(dlsch->harq_processes[harq_pid]->mcs), + dlsch->harq_processes[harq_pid]->Qm, dlsch->harq_processes[harq_pid]->Nl, r, - nb_rb, - m); // r + nb_rb); + // m); // r stop_meas(rm_stats); #ifdef DEBUG_DLSCH_CODING @@ -421,39 +743,189 @@ int dlsch_encoding(unsigned char *a, return(0); } -#ifdef PHY_ABSTRACTION -void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t *DLSCH_pdu, - LTE_eNB_DLSCH_t *dlsch) + +int dlsch_encoding_SIC(PHY_VARS_UE *ue, + unsigned char *a, + uint8_t num_pdcch_symbols, + LTE_eNB_DLSCH_t *dlsch, + int frame, + uint8_t subframe, + time_stats_t *rm_stats, + time_stats_t *te_stats, + time_stats_t *i_stats) { + + unsigned int G; + unsigned int crc=1; + unsigned short iind; - //int payload_offset = 0; - unsigned char harq_pid = dlsch->current_harq_pid; - unsigned short i; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + unsigned char harq_pid = ue->dlsch[subframe&2][0][0]->rnti; + unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb; + unsigned int A; + unsigned char mod_order; + unsigned int Kr=0,Kr_bytes,r,r_offset=0; + // unsigned short m=dlsch->harq_processes[harq_pid]->mcs; + uint8_t beamforming_mode=0; - // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { - if (dlsch->harq_processes[harq_pid]->round == 0) { - memcpy(dlsch->harq_processes[harq_pid]->b, - DLSCH_pdu, - dlsch->harq_processes[harq_pid]->TBS>>3); - LOG_D(PHY, "eNB %d dlsch_encoding_emul, tbs is %d harq pid %d \n", - phy_vars_eNB->Mod_id, - dlsch->harq_processes[harq_pid]->TBS>>3, - harq_pid); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN); - for (i=0; iharq_processes[harq_pid]->TBS>>3; i++) - LOG_T(PHY,"%x.",DLSCH_pdu[i]); + A = dlsch->harq_processes[harq_pid]->TBS; //6228 + // printf("Encoder: A: %d\n",A); + mod_order = dlsch->harq_processes[harq_pid]->Qm; - LOG_T(PHY,"\n"); + if(dlsch->harq_processes[harq_pid]->mimo_mode == TM7) + beamforming_mode = 7; + else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM8) + beamforming_mode = 8; + else if(dlsch->harq_processes[harq_pid]->mimo_mode == TM9_10) + beamforming_mode = 9; + G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe,beamforming_mode); + + + // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet + if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet +#ifdef DEBUG_DLSCH_CODING + printf("SIC encoding thinks this is a new packet \n"); +#endif + /* + int i; + printf("dlsch (tx): \n"); + for (i=0;i<(A>>3);i++) + printf("%02x.",a[i]); + printf("\n"); + */ + // Add 24-bit crc (polynomial A) to payload + crc = crc24a(a, + A)>>8; + a[A>>3] = ((uint8_t*)&crc)[2]; + a[1+(A>>3)] = ((uint8_t*)&crc)[1]; + a[2+(A>>3)] = ((uint8_t*)&crc)[0]; + // printf("CRC %x (A %d)\n",crc,A); + + dlsch->harq_processes[harq_pid]->B = A+24; + // dlsch->harq_processes[harq_pid]->b = a; + memcpy(dlsch->harq_processes[harq_pid]->b,a,(A/8)+4); + + if (lte_segmentation(dlsch->harq_processes[harq_pid]->b, + dlsch->harq_processes[harq_pid]->c, + dlsch->harq_processes[harq_pid]->B, + &dlsch->harq_processes[harq_pid]->C, + &dlsch->harq_processes[harq_pid]->Cplus, + &dlsch->harq_processes[harq_pid]->Cminus, + &dlsch->harq_processes[harq_pid]->Kplus, + &dlsch->harq_processes[harq_pid]->Kminus, + &dlsch->harq_processes[harq_pid]->F)<0) + return(-1); + + for (r=0; rharq_processes[harq_pid]->C; r++) { + + if (rharq_processes[harq_pid]->Cminus) + Kr = dlsch->harq_processes[harq_pid]->Kminus; + else + Kr = dlsch->harq_processes[harq_pid]->Kplus; + + Kr_bytes = Kr>>3; + + // get interleaver index for Turbo code (lookup in Table 5.1.3-3 36-212, V8.6 2009-03, p. 13-14) + if (Kr_bytes<=64) + iind = (Kr_bytes-5); + else if (Kr_bytes <=128) + iind = 59 + ((Kr_bytes-64)>>1); + else if (Kr_bytes <= 256) + iind = 91 + ((Kr_bytes-128)>>2); + else if (Kr_bytes <= 768) + iind = 123 + ((Kr_bytes-256)>>3); + else { + printf("dlsch_coding: Illegal codeword size %d!!!\n",Kr_bytes); + return(-1); + } + + +#ifdef DEBUG_DLSCH_CODING + printf("Generating Code Segment %d (%d bits)\n",r,Kr); + // generate codewords + + printf("bits_per_codeword (Kr)= %d, A %d\n",Kr,A); + printf("N_RB = %d\n",nb_rb); + printf("Ncp %d\n",frame_parms->Ncp); + printf("mod_order %d\n",mod_order); +#endif + + +#ifdef DEBUG_DLSCH_CODING + printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]); +#endif + start_meas(te_stats); + threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r], + Kr>>3, + &dlsch->harq_processes[harq_pid]->d[r][96], + (r==0) ? dlsch->harq_processes[harq_pid]->F : 0, + f1f2mat_old[iind*2], // f1 (see 36121-820, page 14) + f1f2mat_old[(iind*2)+1] // f2 (see 36121-820, page 14) + ); + stop_meas(te_stats); +#ifdef DEBUG_DLSCH_CODING + + if (r==0) + write_output("enc_output0.m","enc0",&dlsch->harq_processes[harq_pid]->d[r][96],(3*8*Kr_bytes)+12,1,4); + +#endif + start_meas(i_stats); + dlsch->harq_processes[harq_pid]->RTC[r] = + sub_block_interleaving_turbo(4+(Kr_bytes*8), + &dlsch->harq_processes[harq_pid]->d[r][96], + dlsch->harq_processes[harq_pid]->w[r]); + stop_meas(i_stats); + } - memcpy(&eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].transport_blocks[eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]], - // memcpy(&eNB_transport_info[phy_vars_eNB->Mod_id].transport_blocks[payload_offset], - DLSCH_pdu, - dlsch->harq_processes[harq_pid]->TBS>>3); } - eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]+=dlsch->harq_processes[harq_pid]->TBS>>3; - //payload_offset +=dlsch->harq_processes[harq_pid]->TBS>>3; + // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the + // outputs for each code segment, see Section 5.1.5 p.20 -} + for (r=0; rharq_processes[harq_pid]->C; r++) { +#ifdef DEBUG_DLSCH_CODING + printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", + r, + G, + Kr*3, + mod_order,nb_rb); #endif + + start_meas(rm_stats); +#ifdef DEBUG_DLSCH_CODING + printf("rvidx in SIC encoding = %d\n", dlsch->harq_processes[harq_pid]->rvidx); +#endif + r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r], + G, //G + dlsch->harq_processes[harq_pid]->w[r], + dlsch->harq_processes[harq_pid]->e+r_offset, + dlsch->harq_processes[harq_pid]->C, // C + dlsch->Nsoft, // Nsoft, + dlsch->Mdlharq, + dlsch->Kmimo, + dlsch->harq_processes[harq_pid]->rvidx, + dlsch->harq_processes[harq_pid]->Qm, + dlsch->harq_processes[harq_pid]->Nl, + r, + nb_rb); + // m); // r + stop_meas(rm_stats); +#ifdef DEBUG_DLSCH_CODING + + if (r==dlsch->harq_processes[harq_pid]->C-1) + write_output("enc_output.m","enc",dlsch->harq_processes[harq_pid]->e,r_offset,1,4); + +#endif + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT); + + return(0); +} + + + + + diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index 2e8d70102f..7acf6480eb 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/dlsch_decoding.c * \brief Top-level routines for decoding Turbo-coded (DLSCH) transport channels from 36-212, V8.6 2009-03 @@ -45,7 +37,8 @@ #include "SCHED/extern.h" #include "SIMULATION/TOOLS/defs.h" //#define DEBUG_DLSCH_DECODING - + +extern double cpuf; void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch) { @@ -167,16 +160,18 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, LTE_UE_DLSCH_t *dlsch, LTE_DL_UE_HARQ_t *harq_process, + uint32_t frame, uint8_t subframe, uint8_t harq_pid, uint8_t is_crnti, uint8_t llr8_flag) { - +#if UE_TIMING_TRACE time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats; time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats; time_stats_t *dlsch_deinterleaving_stats=&phy_vars_ue->dlsch_deinterleaving_stats; +#endif uint32_t A,E; uint32_t G; uint32_t ret,offset; @@ -188,7 +183,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, #ifdef DEBUG_DLSCH_DECODING uint16_t i; #endif -#ifdef __AVX2__ + //#ifdef __AVX2__ +#if 0 int Kr_last,skipped_last=0; uint8_t (*tc_2cw)(int16_t *y, int16_t *y2, @@ -248,14 +244,25 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, return(dlsch->max_turbo_iterations); } + if (dlsch->harq_ack[subframe].ack != 2) { + LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n", + phy_vars_ue->Mod_id, subframe, dlsch->harq_ack[subframe].ack); + } + if (llr8_flag == 0) { -#ifdef __AVX2__ + //#ifdef __AVX2__ +#if 0 tc_2cw = phy_threegpplte_turbo_decoder16avx2; #endif tc = phy_threegpplte_turbo_decoder16; } else - tc = phy_threegpplte_turbo_decoder8; + { + AssertFatal (harq_process->TBS >= 256 , "Mismatch flag nbRB=%d TBS=%d mcs=%d Qm=%d RIV=%d round=%d \n", + harq_process->nb_rb, harq_process->TBS,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round); + tc = phy_threegpplte_turbo_decoder8; + } + // nb_rb = dlsch->nb_rb; @@ -265,7 +272,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, return(max_turbo_iterations); }*/ - /*harq_pid = dlsch->current_harq_pid; + /*harq_pid = dlsch->current_harq_pid[phy_vars_ue->current_thread_id[subframe]]; if (harq_pid >= 8) { printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid); return(max_turbo_iterations); @@ -336,9 +343,11 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, printf("Segmentation: C %d, Cminus %d, Kminus %d, Kplus %d\n",harq_process->C,harq_process->Cminus,harq_process->Kminus,harq_process->Kplus); #endif + opp_enabled=1; + for (r=0; rC; r++) { - + // Get Turbo interleaver parameters if (rCminus) Kr = harq_process->Kminus; @@ -364,14 +373,16 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, printf("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? harq_process->F : 0); #endif +#if UE_TIMING_TRACE start_meas(dlsch_rate_unmatching_stats); +#endif memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short)); harq_process->RTC[r] = generate_dummy_w(4+(Kr_bytes*8), (uint8_t*) &dummy_w[r][0], (r==0) ? harq_process->F : 0); #ifdef DEBUG_DLSCH_DECODING - LOG_I(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n", + LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n", harq_pid,r, G, Kr*3, harq_process->TBS, @@ -382,7 +393,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, harq_process->round); #endif - +#ifdef DEBUG_DLSCH_DECODING + printf(" in decoding dlsch->harq_processes[harq_pid]->rvidx = %d\n", dlsch->harq_processes[harq_pid]->rvidx); +#endif if (lte_rate_matching_turbo_rx(harq_process->RTC[r], G, harq_process->w[r], @@ -398,12 +411,17 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, harq_process->Nl, r, &E)==-1) { +#if UE_TIMING_TRACE stop_meas(dlsch_rate_unmatching_stats); +#endif LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n"); return(dlsch->max_turbo_iterations); } else + { +#if UE_TIMING_TRACE stop_meas(dlsch_rate_unmatching_stats); - +#endif + } r_offset += E; /* @@ -411,13 +429,16 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, harq_process->d[r], harq_process->w); */ +#if UE_TIMING_TRACE start_meas(dlsch_deinterleaving_stats); +#endif sub_block_deinterleaving_turbo(4+Kr, &harq_process->d[r][96], harq_process->w[r]); +#if UE_TIMING_TRACE stop_meas(dlsch_deinterleaving_stats); - +#endif #ifdef DEBUG_DLSCH_DECODING /* if (r==0) { @@ -453,8 +474,19 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, //#ifndef __AVX2__ #if 1 if (err_flag == 0) { - - start_meas(dlsch_turbo_decoding_stats); +/* + LOG_I(PHY, "turbo algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n", + Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS, + harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_turbo_iterations); +*/ + if (llr8_flag) { + AssertFatal (Kr >= 256, "turbo algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n", + Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round); + } +#if UE_TIMING_TRACE + start_meas(dlsch_turbo_decoding_stats); +#endif + LOG_D(PHY,"AbsSubframe %d.%d Start turbo segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1); ret = tc (&harq_process->d[r][96], harq_process->c[r], @@ -472,14 +504,17 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, &phy_vars_ue->dlsch_tc_intl1_stats, &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); - +#if UE_TIMING_TRACE stop_meas(dlsch_turbo_decoding_stats); +#endif } #else - if ((harq_process->C == 1) || + if ((harq_process->C == 1) || ((r==harq_process->C-1) && (skipped_last==0))) { // last segment with odd number of segments - start_meas(dlsch_turbo_decoding_stats); +#if UE_TIMING_TRACE + start_meas(dlsch_turbo_decoding_stats); +#endif ret = tc (&harq_process->d[r][96], harq_process->c[r], @@ -496,7 +531,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, &phy_vars_ue->dlsch_tc_ext_stats, &phy_vars_ue->dlsch_tc_intl1_stats, &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); + #if UE_TIMING_TRACE stop_meas(dlsch_turbo_decoding_stats); +#endif // printf("single decode, exit\n"); // exit(-1); } @@ -508,12 +545,14 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, } else { skipped_last=0; - + if (Kr_last == Kr) { // decode 2 code segments with AVX2 version #ifdef DEBUG_DLSCH_DECODING printf("single decoding segment %d (%p)\n",r-1,&harq_process->d[r-1][96]); #endif +#if UE_TIMING_TRACE start_meas(dlsch_turbo_decoding_stats); +#endif #ifdef DEBUG_DLSCH_DECODING printf("double decoding segments %d,%d (%p,%p)\n",r-1,r,&harq_process->d[r-1][96],&harq_process->d[r][96]); #endif @@ -554,10 +593,14 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); exit(-1);*/ - stop_meas(dlsch_turbo_decoding_stats); - } +#if UE_TIMING_TRACE + stop_meas(dlsch_turbo_decoding_stats); +#endif + } else { // Kr_last != Kr +#if UE_TIMING_TRACE start_meas(dlsch_turbo_decoding_stats); +#endif ret = tc (&harq_process->d[r-1][96], harq_process->c[r-1], @@ -574,9 +617,12 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, &phy_vars_ue->dlsch_tc_ext_stats, &phy_vars_ue->dlsch_tc_intl1_stats, &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); - stop_meas(dlsch_turbo_decoding_stats); - +#if UE_TIMING_TRACE + stop_meas(dlsch_turbo_decoding_stats); + start_meas(dlsch_turbo_decoding_stats); +#endif + ret = tc (&harq_process->d[r][96], harq_process->c[r], @@ -593,8 +639,18 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, &phy_vars_ue->dlsch_tc_ext_stats, &phy_vars_ue->dlsch_tc_intl1_stats, &phy_vars_ue->dlsch_tc_intl2_stats); //(is_crnti==0)?harq_pid:harq_pid+1); + +#if UE_TIMING_TRACE + stop_meas(dlsch_turbo_decoding_stats); - + + /*printf("Segmentation: C %d r %d, dlsch_rate_unmatching_stats %5.3f dlsch_deinterleaving_stats %5.3f dlsch_turbo_decoding_stats %5.3f \n", + harq_process->C, + r, + dlsch_rate_unmatching_stats->p_time/(cpuf*1000.0), + dlsch_deinterleaving_stats->p_time/(cpuf*1000.0), + dlsch_turbo_decoding_stats->p_time/(cpuf*1000.0));*/ +#endif } } } @@ -602,33 +658,62 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, if ((err_flag == 0) && (ret>=(1+dlsch->max_turbo_iterations))) {// a Code segment is in error so break; - //printf("CRC failed, segment %d\n",r); + LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1); err_flag = 1; } - } + int32_t frame_rx_prev = frame; + int32_t subframe_rx_prev = subframe - 1; + if (subframe_rx_prev < 0) { + frame_rx_prev--; + subframe_rx_prev += 10; + } + frame_rx_prev = frame_rx_prev%1024; + if (err_flag == 1) { +#if UE_DEBUG_TRACE + LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n", + phy_vars_ue->Mod_id, frame, subframe, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round); +#endif dlsch->harq_ack[subframe].ack = 0; dlsch->harq_ack[subframe].harq_id = harq_pid; dlsch->harq_ack[subframe].send_harq_status = 1; harq_process->errors[harq_process->round]++; harq_process->round++; - // LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round); + // printf("Rate: [UE %d] DLSCH: Setting NACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round); if (harq_process->round >= dlsch->Mdlharq) { harq_process->status = SCH_IDLE; + harq_process->round = 0; + } + if(is_crnti) + { + LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for subframe %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n", + phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS); } return((1+dlsch->max_turbo_iterations)); } else { +#if UE_DEBUG_TRACE + LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d TBS %d mcs %d nb_rb %d\n", + phy_vars_ue->Mod_id,subframe,harq_process->TBS,harq_process->mcs,harq_process->nb_rb); +#endif + harq_process->status = SCH_IDLE; harq_process->round = 0; dlsch->harq_ack[subframe].ack = 1; dlsch->harq_ack[subframe].harq_id = harq_pid; dlsch->harq_ack[subframe].send_harq_status = 1; - LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round); + //LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n", + // phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs); + + if(is_crnti) + { + LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round,harq_process->TBS); + } + //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round); } @@ -668,316 +753,8 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, } } + dlsch->last_iteration_cnt = ret; + return(ret); } -#ifdef PHY_ABSTRACTION -#include "SIMULATION/TOOLS/defs.h" -#ifdef OPENAIR2 -#include "LAYER2/MAC/extern.h" -#include "LAYER2/MAC/defs.h" -#endif - -int dlsch_abstraction_EESM(double* sinr_dB, uint8_t TM, uint32_t rb_alloc[4], uint8_t mcs, uint8_t dl_power_off) -{ - - int ii; - double sinr_eff = 0; - int rb_count = 0; - int offset; - double bler = 0; - - if(TM==5 && dl_power_off==1) { - //do nothing -- means there is no second UE and TM 5 is behaving like TM 6 for a singal user - } else - TM = TM-1; - - for (offset = 0; offset <= 24; offset++) { - if (rb_alloc[0] & (1<qpsk_max) - I += 1; - else - I += (q_qpsk[0]*pow(x,7) + q_qpsk[1]*pow(x,6) + q_qpsk[2]*pow(x,5) + q_qpsk[3]*pow(x,4) + q_qpsk[4]*pow(x,3) + q_qpsk[5]*pow(x,2) + q_qpsk[6]*x + q_qpsk[7]); - } else if(mcs>9 && mcs<17) { - if(x>qam16_max) - I += 1; - else - I += (q_qam16[0]*pow(x,7) + q_qam16[1]*pow(x,6) + q_qam16[2]*pow(x,5) + q_qam16[3]*pow(x,4) + q_qam16[4]*pow(x,3) + q_qam16[5]*pow(x,2) + q_qam16[6]*x + q_qam16[7]); - } else if(mcs>16 && mcs<23) { - - if(x>qam64_max) - I += 1; - else - I += (q_qam64[0]*pow(x,7) + q_qam64[1]*pow(x,6) + q_qam64[2]*pow(x,5) + q_qam64[3]*pow(x,4) + q_qam64[4]*pow(x,3) + q_qam64[5]*pow(x,2) + q_qam64[6]*x + q_qam64[7]); - } - } - } - } - } - - // averaging of accumulated MI - I = I/(12*rb_count); - //Now I->SINR_effective Mapping - - if(mcs<10) { - sinr_eff = (p_qpsk[0]*pow(I,7) + p_qpsk[1]*pow(I,6) + p_qpsk[2]*pow(I,5) + p_qpsk[3]*pow(I,4) + p_qpsk[4]*pow(I,3) + p_qpsk[5]*pow(I,2) + p_qpsk[6]*I + p_qpsk[7]); - } else if(mcs>9 && mcs<17) { - sinr_eff = (p_qam16[0]*pow(I,7) + p_qam16[1]*pow(I,6) + p_qam16[2]*pow(I,5) + p_qam16[3]*pow(I,4) + p_qam16[4]*pow(I,3) + p_qam16[5]*pow(I,2) + p_qam16[6]*I + p_qam16[7]); - } else if(mcs>16 && mcs<23) { - sinr_eff = (p_qam64[0]*pow(I,7) + p_qam64[1]*pow(I,6) + p_qam64[2]*pow(I,5) + p_qam64[3]*pow(I,4) + p_qam64[4]*pow(I,3) + p_qam64[5]*pow(I,2) + p_qam64[6]*I + p_qam64[7]); - } - - //sinr_eff = sinr_eff + 10*log10(beta2_dlsch_MI[TM][mcs]); - LOG_D(OCM,"SINR_Eff = %e\n",sinr_eff); - - bler = interp(sinr_eff,&sinr_bler_map[mcs][0][0],&sinr_bler_map[mcs][1][0],table_length[mcs]); - -#ifdef USER_MODE // need to be adapted for the emulation in the kernel space - - if (uniformrandom() < bler) { - LOG_N(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); - return(0); - } else { - LOG_I(OCM,"abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); - return(1); - } - -#endif -} - -uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, - uint8_t subframe, - uint8_t dlsch_id, - uint8_t eNB_id) -{ - - LTE_UE_DLSCH_t *dlsch_ue; - LTE_eNB_DLSCH_t *dlsch_eNB; - uint8_t harq_pid; - uint32_t eNB_id2; - uint32_t ue_id; -#ifdef DEBUG_DLSCH_DECODING - uint16_t i; -#endif - uint8_t CC_id = phy_vars_ue->CC_id; - - // may not be necessary for PMCH?? - for (eNB_id2=0; eNB_id2lte_frame_parms.Nid_cell == phy_vars_ue->lte_frame_parms.Nid_cell) - break; - } - - if (eNB_id2==NB_eNB_INST) { - LOG_E(PHY,"FATAL : Could not find attached eNB for DLSCH emulation !!!!\n"); - mac_xface->macphy_exit("Could not find attached eNB for DLSCH emulation"); - } - - LOG_D(PHY,"[UE] dlsch_decoding_emul : subframe %d, eNB_id %d, dlsch_id %d\n",subframe,eNB_id2,dlsch_id); - - // printf("dlsch_eNB_ra->harq_processes[0] %p\n",PHY_vars_eNB_g[eNB_id]->dlsch_eNB_ra->harq_processes[0]); - - - switch (dlsch_id) { - case 0: // SI - dlsch_ue = phy_vars_ue->dlsch_ue_SI[eNB_id]; - dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB_SI; - // printf("Doing SI: TBS %d\n",dlsch_ue->harq_processes[0]->TBS>>3); - memcpy(dlsch_ue->harq_processes[0]->b,dlsch_eNB->harq_processes[0]->b,dlsch_ue->harq_processes[0]->TBS>>3); -#ifdef DEBUG_DLSCH_DECODING - LOG_D(PHY,"SI Decoded\n"); - - for (i=0; iharq_processes[0]->TBS>>3; i++) - LOG_T(PHY,"%x.",dlsch_eNB->harq_processes[0]->b[i]); - - LOG_T(PHY,"\n"); -#endif - return(1); - break; - - case 1: // RA - dlsch_ue = phy_vars_ue->dlsch_ue_ra[eNB_id]; - dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB_ra; - memcpy(dlsch_ue->harq_processes[0]->b,dlsch_eNB->harq_processes[0]->b,dlsch_ue->harq_processes[0]->TBS>>3); -#ifdef DEBUG_DLSCH_DECODING - LOG_D(PHY,"RA Decoded\n"); - - for (i=0; iharq_processes[0]->TBS>>3; i++) - LOG_T(PHY,"%x.",dlsch_eNB->harq_processes[0]->b[i]); - - LOG_T(PHY,"\n"); -#endif - return(1); - break; - - case 2: // TB0 - dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id][0]; - harq_pid = dlsch_ue->current_harq_pid; - ue_id= (uint32_t)find_ue((int16_t)phy_vars_ue->lte_ue_pdcch_vars[(uint32_t)eNB_id]->crnti,PHY_vars_eNB_g[eNB_id2][CC_id]); - DevAssert( ue_id != (uint32_t)-1 ); - dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB[ue_id][0]; - -#ifdef DEBUG_DLSCH_DECODING - - for (i=0; iharq_processes[harq_pid]->TBS>>3; i++) - LOG_T(PHY,"%x.",dlsch_eNB->harq_processes[harq_pid]->b[i]); - - LOG_T(PHY,"\n current harq pid is %d ue id %d \n", harq_pid, ue_id); -#endif - - if (dlsch_abstraction_MIESM(phy_vars_ue->sinr_dB, - phy_vars_ue->transmission_mode[eNB_id], - dlsch_eNB->harq_processes[harq_pid]->rb_alloc, - dlsch_eNB->harq_processes[harq_pid]->mcs, - PHY_vars_eNB_g[eNB_id][CC_id]->mu_mimo_mode[ue_id].dl_pow_off) == 1) { - // reset HARQ - dlsch_ue->harq_processes[harq_pid]->status = SCH_IDLE; - dlsch_ue->harq_processes[harq_pid]->round = 0; - dlsch_ue->harq_ack[subframe].ack = 1; - dlsch_ue->harq_ack[subframe].harq_id = harq_pid; - dlsch_ue->harq_ack[subframe].send_harq_status = 1; - - if (dlsch_ue->harq_processes[harq_pid]->round == 0) - memcpy(dlsch_ue->harq_processes[harq_pid]->b, - dlsch_eNB->harq_processes[harq_pid]->b, - dlsch_ue->harq_processes[harq_pid]->TBS>>3); - - return(1); - } else { - // retransmission - dlsch_ue->harq_processes[harq_pid]->status = ACTIVE; - dlsch_ue->harq_processes[harq_pid]->round++; - dlsch_ue->harq_ack[subframe].ack = 0; - dlsch_ue->harq_ack[subframe].harq_id = harq_pid; - dlsch_ue->harq_ack[subframe].send_harq_status = 1; - return(1+dlsch_ue->max_turbo_iterations); - } - - break; - - case 3: { // TB1 - dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id][1]; - harq_pid = dlsch_ue->current_harq_pid; - int8_t UE_id = find_ue( phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, PHY_vars_eNB_g[eNB_id2][CC_id] ); - DevAssert( UE_id != -1 ); - dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB[UE_id][1]; - // reset HARQ - dlsch_ue->harq_processes[harq_pid]->status = SCH_IDLE; - dlsch_ue->harq_processes[harq_pid]->round = 0; - dlsch_ue->harq_ack[subframe].ack = 1; - dlsch_ue->harq_ack[subframe].harq_id = harq_pid; - dlsch_ue->harq_ack[subframe].send_harq_status = 1; - - if (dlsch_ue->harq_processes[harq_pid]->round == 0) - memcpy(dlsch_eNB->harq_processes[harq_pid]->b,dlsch_ue->harq_processes[harq_pid]->b,dlsch_ue->harq_processes[harq_pid]->TBS>>3); - - break; - } - - case 5: // PMCH - - dlsch_ue = phy_vars_ue->dlsch_ue_MCH[eNB_id]; - dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB_MCH; - - LOG_D(PHY,"decoding pmch emul (size is %d, enb %d %d)\n", dlsch_ue->harq_processes[0]->TBS>>3, eNB_id, eNB_id2); -#ifdef DEBUG_DLSCH_DECODING - - for (i=0; iharq_processes[0]->TBS>>3; i++) - printf("%x.",dlsch_eNB->harq_processes[0]->b[i]); - - printf("\n"); -#endif - - /* - if (dlsch_abstraction_MIESM(phy_vars_ue->sinr_dB, phy_vars_ue->transmission_mode[eNB_id], dlsch_eNB->rb_alloc, - dlsch_eNB->harq_processes[0]->mcs,PHY_vars_eNB_g[eNB_id]->mu_mimo_mode[ue_id].dl_pow_off) == 1) { - */ - if (1) { - // reset HARQ - dlsch_ue->harq_processes[0]->status = SCH_IDLE; - dlsch_ue->harq_processes[0]->round = 0; - memcpy(dlsch_ue->harq_processes[0]->b, - dlsch_eNB->harq_processes[0]->b, - dlsch_ue->harq_processes[0]->TBS>>3); - return(1); - } else { - // retransmission - return(1+dlsch_ue->max_turbo_iterations); - } - - break; - - default: - dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id][0]; - LOG_E(PHY,"dlsch_decoding_emul: FATAL, unknown DLSCH_id %d\n",dlsch_id); - return(1+dlsch_ue->max_turbo_iterations); - } - - LOG_E(PHY,"[FATAL] dlsch_decoding.c: Should never exit here ...\n"); - return(0); -} -#endif diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c index 19ce6b9edc..1bd0076e14 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c @@ -1,35 +1,27 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/dlsch_demodulation.c * \brief Top-level routines for demodulating the PDSCH physical channel from 36-211, V8.6 2009-03 - * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert + * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, X. Xiang * \date 2011 * \version 0.1 * \company Eurecom @@ -37,27 +29,41 @@ * \note * \warning */ - -#include "PHY/defs.h" +//#include "PHY/defs.h" #include "PHY/extern.h" +#include "SCHED/defs.h" #include "defs.h" #include "extern.h" #include "PHY/sse_intrin.h" +#include "T.h" - -#ifndef USER_MODE -#define NOCYGWIN_STATIC static -#else #define NOCYGWIN_STATIC -#endif + +/* dynamic shift for LLR computation for TM3/4 + * set as command line argument, see lte-softmodem.c + * default value: 0 + */ +int16_t dlsch_demod_shift = 0; +int16_t interf_unaw_shift = 13; + +//#define DEBUG_HARQ + +//#undef LOG_D +//#define LOG_D LOG_I //#define DEBUG_PHY 1 //#define DEBUG_DLSCH_DEMOD 1 -int avg[4]; + // [MCS][i_mod (0,1,2) = (2,4,6)] unsigned char offset_mumimo_llr_drange_fix=0; +//inferference-free case +unsigned char interf_unaw_shift_tm4_mcs[29]={5, 3, 4, 3, 3, 2, 1, 1, 2, 0, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 0, 2, 1, 0, 1, 0, 1, 0, 0} ; +unsigned char interf_unaw_shift_tm1_mcs[29]={5, 5, 4, 3, 3, 3, 2, 2, 4, 4, 2, 3, 3, 3, 1, 1, + 0, 1, 1, 2, 5, 4, 4, 6, 5, 1, 0, 5, 6} ; // mcs 21, 26, 28 seem to be errorneous + /* //original values from sebastion + same hand tuning unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{6,6,6},{6,6,6},{6,6,6},{5,5,5},{4,4,4},{1,2,4}, // QPSK @@ -78,719 +84,1157 @@ unsigned char offset_mumimo_llr_drange[29][3]= {{0, 6, 5},{0, 4, 5},{0, 4, 5},{0 extern void print_shorts(char *s,int16_t *x); -int rx_pdsch(PHY_VARS_UE *phy_vars_ue, +int rx_pdsch(PHY_VARS_UE *ue, PDSCH_t type, unsigned char eNB_id, - unsigned char eNB_id_i, //if this == phy_vars_ue->n_connected_eNB, we assume MU interference + unsigned char eNB_id_i, //if this == ue->n_connected_eNB, we assume MU interference + uint32_t frame, uint8_t subframe, unsigned char symbol, unsigned char first_symbol_flag, - unsigned char dual_stream_flag, + RX_type_t rx_type, unsigned char i_mod, unsigned char harq_pid) { - LTE_UE_COMMON *lte_ue_common_vars = &phy_vars_ue->lte_ue_common_vars; - LTE_UE_PDSCH **lte_ue_pdsch_vars; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - PHY_MEASUREMENTS *phy_measurements = &phy_vars_ue->PHY_measurements; - LTE_UE_DLSCH_t **dlsch_ue; + LTE_UE_COMMON *common_vars = &ue->common_vars; + LTE_UE_PDSCH **pdsch_vars; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + PHY_MEASUREMENTS *measurements = &ue->measurements; + LTE_UE_DLSCH_t **dlsch; + + int avg[4]; + int avg_0[2]; + int avg_1[2]; + +#if UE_TIMING_TRACE + uint8_t slot = 0; +#endif unsigned char aatx,aarx; - unsigned short nb_rb; - int avgs, rb; + + unsigned short nb_rb = 0, round; + int avgs = 0, rb; LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0; + + uint8_t beamforming_mode; uint32_t *rballoc; + int32_t **rxdataF_comp_ptr; + int32_t **dl_ch_mag_ptr; + int32_t codeword_TB0 = -1; + int32_t codeword_TB1 = -1; + + + switch (type) { case SI_PDSCH: - lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]; - dlsch_ue = &phy_vars_ue->dlsch_ue_SI[eNB_id]; - dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; + pdsch_vars = &ue->pdsch_vars_SI[eNB_id]; + dlsch = &ue->dlsch_SI[eNB_id]; + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; + beamforming_mode = 0; break; case RA_PDSCH: - lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_ra[eNB_id]; - dlsch_ue = &phy_vars_ue->dlsch_ue_ra[eNB_id]; - dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; + pdsch_vars = &ue->pdsch_vars_ra[eNB_id]; + dlsch = &ue->dlsch_ra[eNB_id]; + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; + beamforming_mode = 0; break; case PDSCH: - lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars[eNB_id]; - dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id]; - dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; - dlsch1_harq = dlsch_ue[1]->harq_processes[harq_pid]; + pdsch_vars = ue->pdsch_vars[ue->current_thread_id[subframe]]; + dlsch = ue->dlsch[ue->current_thread_id[subframe]][eNB_id]; + //printf("status TB0 = %d, status TB1 = %d \n", dlsch[0]->harq_processes[harq_pid]->status, dlsch[1]->harq_processes[harq_pid]->status); + LOG_D(PHY,"AbsSubframe %d.%d / Sym %d harq_pid %d, harq status %d.%d \n", + frame,subframe,symbol,harq_pid, + dlsch[0]->harq_processes[harq_pid]->status, + dlsch[1]->harq_processes[harq_pid]->status); + + if ((dlsch[0]->harq_processes[harq_pid]->status == ACTIVE) && + (dlsch[1]->harq_processes[harq_pid]->status == ACTIVE)){ + codeword_TB0 = dlsch[0]->harq_processes[harq_pid]->codeword; + codeword_TB1 = dlsch[1]->harq_processes[harq_pid]->codeword; + dlsch0_harq = dlsch[codeword_TB0]->harq_processes[harq_pid]; + dlsch1_harq = dlsch[codeword_TB1]->harq_processes[harq_pid]; +#ifdef DEBUG_HARQ + printf("[DEMOD] I am assuming both TBs are active\n"); +#endif + } + else if ((dlsch[0]->harq_processes[harq_pid]->status == ACTIVE) && + (dlsch[1]->harq_processes[harq_pid]->status != ACTIVE) ) { + codeword_TB0 = dlsch[0]->harq_processes[harq_pid]->codeword; + dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; + dlsch1_harq = NULL; + codeword_TB1 = -1; +#ifdef DEBUG_HARQ + printf("[DEMOD] I am assuming only TB0 is active\n"); +#endif + } + else if ((dlsch[0]->harq_processes[harq_pid]->status != ACTIVE) && + (dlsch[1]->harq_processes[harq_pid]->status == ACTIVE) ){ + codeword_TB1 = dlsch[1]->harq_processes[harq_pid]->codeword; + dlsch0_harq = dlsch[1]->harq_processes[harq_pid]; + dlsch1_harq = NULL; + codeword_TB0 = -1; +#ifdef DEBUG_HARQ + printf("[DEMOD] I am assuming only TB1 is active, it is in cw %d\n", dlsch0_harq->codeword); +#endif + } + else { + LOG_E(PHY,"[UE][FATAL] Frame %d subframe %d: no active DLSCH\n",ue->proc.proc_rxtx[0].frame_rx,subframe); + return(-1); + } + beamforming_mode = ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]; break; default: - LOG_E(PHY,"[UE %d][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",phy_vars_ue->frame_rx,subframe,type); + LOG_E(PHY,"[UE][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",ue->proc.proc_rxtx[0].frame_rx,subframe,type); return(-1); break; } +#ifdef DEBUG_HARQ + printf("[DEMOD] MIMO mode = %d\n", dlsch0_harq->mimo_mode); + printf("[DEMOD] cw for TB0 = %d, cw for TB1 = %d\n", codeword_TB0, codeword_TB1); +#endif + DevAssert(dlsch0_harq); + round = dlsch0_harq->round; + //printf("round = %d\n", round); if (eNB_id > 2) { LOG_W(PHY,"dlsch_demodulation.c: Illegal eNB_id %d\n",eNB_id); return(-1); } - if (!lte_ue_common_vars) { - LOG_W(PHY,"dlsch_demodulation.c: Null lte_ue_common_vars\n"); + if (!common_vars) { + LOG_W(PHY,"dlsch_demodulation.c: Null common_vars\n"); return(-1); } - if (!dlsch_ue[0]) { + if (!dlsch[0]) { LOG_W(PHY,"dlsch_demodulation.c: Null dlsch_ue pointer\n"); return(-1); } - if (!lte_ue_pdsch_vars) { - LOG_W(PHY,"dlsch_demodulation.c: Null lte_ue_pdsch_vars pointer\n"); + if (!pdsch_vars) { + LOG_W(PHY,"dlsch_demodulation.c: Null pdsch_vars pointer\n"); return(-1); } if (!frame_parms) { - LOG_W(PHY,"dlsch_demodulation.c: Null lte_frame_parms\n"); + LOG_W(PHY,"dlsch_demodulation.c: Null frame_parms\n"); return(-1); } - if (((frame_parms->Ncp == NORMAL) && (symbol>=7)) || ((frame_parms->Ncp == EXTENDED) && (symbol>=6))) rballoc = dlsch0_harq->rb_alloc_odd; else rballoc = dlsch0_harq->rb_alloc_even; - if (frame_parms->nb_antennas_tx_eNB>1) { -#ifdef DEBUG_DLSCH_MOD - LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch_ue[0],dlsch0_harq->rb_alloc_even[0]); + + if (dlsch0_harq->mimo_mode>DUALSTREAM_PUSCH_PRECODING) { + LOG_E(PHY,"This transmission mode is not yet supported!\n"); + return(-1); + } + + + if ((dlsch0_harq->mimo_mode==LARGE_CDD) || ((dlsch0_harq->mimo_mode>=DUALSTREAM_UNIFORM_PRECODING1) && (dlsch0_harq->mimo_mode<=DUALSTREAM_PUSCH_PRECODING))) { + DevAssert(dlsch1_harq); + if (eNB_id!=eNB_id_i) { + LOG_E(PHY,"TM3/TM4 requires to set eNB_id==eNB_id_i!\n"); + return(-1); + } + } + +#if UE_TIMING_TRACE + if(symbol > ue->frame_parms.symbols_per_tti>>1) + { + slot = 1; + } #endif - nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + +#ifdef DEBUG_HARQ + printf("Demod dlsch0_harq->pmi_alloc %d\n", dlsch0_harq->pmi_alloc); +#endif + + if (frame_parms->nb_antenna_ports_eNB>1 && beamforming_mode==0) { +#ifdef DEBUG_DLSCH_MOD + LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch[0],dlsch0_harq->rb_alloc_even[0]); +#endif + +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); +#endif + nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], + pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id]->pmi_ext, + pdsch_vars[eNB_id]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, - frame_parms); + ue->high_speed_flag, + frame_parms, + dlsch0_harq->mimo_mode); +#ifdef DEBUG_DLSCH_MOD + printf("dlsch: using pmi %lx, rb_alloc %x, pmi_ext ",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),*rballoc); + for (rb=0;rbpmi_ext[rb]); + printf("\n"); +#endif - if (dual_stream_flag==1) { - if (eNB_id_in_connected_eNB) - nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id_i], - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + if (rx_type >= rx_IC_single_stream) { + if (eNB_id_in_connected_eNB) // we are in TM5 + nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i], + pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, + pdsch_vars[eNB_id_i]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, - frame_parms); + ue->high_speed_flag, + frame_parms, + dlsch0_harq->mimo_mode); else - nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + nb_rb = dlsch_extract_rbs_dual(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], + pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, + pdsch_vars[eNB_id_i]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, - frame_parms); + ue->high_speed_flag, + frame_parms, + dlsch0_harq->mimo_mode); } - } // if n_tx>1 - else { - nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + } else if (beamforming_mode==0) { //else if nb_antennas_ports_eNB==1 && beamforming_mode == 0 + nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], + pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id]->pmi_ext, + pdsch_vars[eNB_id]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_parms); - if (dual_stream_flag==1) { - if (eNB_id_in_connected_eNB) - nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id_i], - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + if (rx_type==rx_IC_single_stream) { + if (eNB_id_in_connected_eNB) + nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id_i], + pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, + pdsch_vars[eNB_id_i]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_parms); - - nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + else + nb_rb = dlsch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], + pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, dlsch0_harq->pmi_alloc, - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, + pdsch_vars[eNB_id_i]->pmi_ext, rballoc, symbol, subframe, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_parms); } - } //else n_tx>1 + } else if (beamforming_mode==7) { //else if beamforming_mode == 7 + nb_rb = dlsch_extract_rbs_TM7(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + pdsch_vars[eNB_id]->dl_bf_ch_estimates, + pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext, + rballoc, + symbol, + subframe, + ue->high_speed_flag, + frame_parms); - // printf("nb_rb = %d, eNB_id %d\n",nb_rb,eNB_id); + } else if(beamforming_mode>7) { + LOG_W(PHY,"dlsch_demodulation: beamforming mode not supported yet.\n"); + } + + //printf("nb_rb = %d, eNB_id %d\n",nb_rb,eNB_id); if (nb_rb==0) { LOG_D(PHY,"dlsch_demodulation.c: nb_rb=0\n"); return(-1); } - /* - // DL power control: Scaling of Channel estimates for PDSCH - dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - frame_parms, - dlsch_ue, - symbol, - nb_rb); - */ - if (first_symbol_flag==1) { - dlsch_channel_level(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - frame_parms, - avg, - symbol, - nb_rb); -#ifdef DEBUG_PHY - LOG_D(PHY,"[DLSCH] avg[0] %d\n",avg[0]); + +#if UE_TIMING_TRACE + stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",frame,subframe,slot, + symbol,ue->high_speed_flag,type,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#else + LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d Flag %d type %d: Pilot/Data extraction %5.2f \n",frame,subframe,slot,symbol, + ue->high_speed_flag,type,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#endif #endif - // the channel gain should be the effective gain of precoding + channel - // however lets be more conservative and set maxh = nb_tx*nb_rx*max(h_i) - // in case of precoding we add an additional factor of two for the precoding gain - avgs = 0; - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) - for (aarx=0; aarxnb_antennas_rx; aarx++) - avgs = cmax(avgs,avg[(aatx<<1)+aarx]); - - // avgs = cmax(avgs,avg[(aarx<<1)+aatx]); - - - lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2)+1; - // + log2_approx(frame_parms->nb_antennas_tx_eNB-1) //-1 because log2_approx counts the number of bits - // + log2_approx(frame_parms->nb_antennas_rx-1); - - if ((dlsch0_harq->mimo_mode>=UNIFORM_PRECODING11) && - (dlsch0_harq->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) && - (dlsch0_harq->dl_power_off==1)) // we are in TM 6 - lte_ue_pdsch_vars[eNB_id]->log2_maxh++; - - // this version here applies the factor .5 also to the extra terms. however, it does not work so well as the one above - /* K = Nb_rx in TM1 - Nb_tx*Nb_rx in TM2,4,5 - Nb_tx^2*Nb_rx in TM6 */ - /* - K = frame_parms->nb_antennas_rx*frame_parms->nb_antennas_tx_eNB; //that also covers TM1 since Nb_tx=1 - if ((dlsch0_harq->mimo_mode>=UNIFORM_PRECODING11) && - (dlsch0_harq->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) && - (dlsch0_harq->dl_power_off==1)) // we are in TM 6 - K *= frame_parms->nb_antennas_tx_eNB; - - lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(K*avgs)/2); - */ - -#ifdef DEBUG_PHY - LOG_D(PHY,"[DLSCH] log2_maxh = %d (%d,%d)\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh,avg[0],avgs); - LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode); +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); #endif - } - - aatx = frame_parms->nb_antennas_tx_eNB; + aatx = frame_parms->nb_antenna_ports_eNB; aarx = frame_parms->nb_antennas_rx; - if (dlsch0_harq->mimo_modedl_ch_estimates_ext, + frame_parms, + dlsch, + symbol, + nb_rb); - dlsch_channel_compensation(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - (aatx>1) ? lte_ue_pdsch_vars[eNB_id]->rho : NULL, + if ((dlsch0_harq->mimo_moden_connected_eNB) && + (dlsch0_harq->dl_power_off==0) + ) // TM5 two-user + { + dlsch_scale_channel(pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + frame_parms, + dlsch, + symbol, + nb_rb); + } + +#if UE_TIMING_TRACE + stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#else + LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#endif +#endif + +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); +#endif + if (first_symbol_flag==1) { + if (beamforming_mode==0){ + if (dlsch0_harq->mimo_modedl_ch_estimates_ext, + frame_parms, + avg, + symbol, + nb_rb); + avgs = 0; + for (aatx=0;aatxnb_antenna_ports_eNB;aatx++) + for (aarx=0;aarxnb_antennas_rx;aarx++) + avgs = cmax(avgs,avg[(aatx<<1)+aarx]); + + pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2)+1; + } + else if ((dlsch0_harq->mimo_mode == LARGE_CDD) || + ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && + (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))) + { + dlsch_channel_level_TM34(pdsch_vars[eNB_id]->dl_ch_estimates_ext, + frame_parms, + pdsch_vars[eNB_id]->pmi_ext, + avg_0, + avg_1, + symbol, + nb_rb, + dlsch0_harq->mimo_mode); + + LOG_D(PHY,"Channel Level TM34 avg_0 %d, avg_1 %d, rx_type %d, rx_standard %d, dlsch_demod_shift %d \n", avg_0[0], + avg_1[0], rx_type, rx_standard, dlsch_demod_shift); + if (rx_type>rx_standard) { + avg_0[0] = (log2_approx(avg_0[0])/2) + dlsch_demod_shift;// + 2 ;//+ 4; + avg_1[0] = (log2_approx(avg_1[0])/2) + dlsch_demod_shift;// + 2 ;//+ 4; + pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0); + pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0); + // printf("dlsch_demod_shift %d\n", dlsch_demod_shift); + } + else { + avg_0[0] = (log2_approx(avg_0[0])/2) - 13 + interf_unaw_shift; + avg_1[0] = (log2_approx(avg_1[0])/2) - 13 + interf_unaw_shift; + pdsch_vars[eNB_id]->log2_maxh0 = cmax(avg_0[0],0); + pdsch_vars[eNB_id]->log2_maxh1 = cmax(avg_1[0],0); + } + } + else if (dlsch0_harq->mimo_moden_connected_eNB) && (dlsch0_harq->dl_power_off==0)) { + dlsch_channel_level_TM56(pdsch_vars[eNB_id]->dl_ch_estimates_ext, + frame_parms, + pdsch_vars[eNB_id]->pmi_ext, + avg, + symbol, + nb_rb); + avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1]; + pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0); + + } + else if (dlsch0_harq->dl_power_off==1) { //TM6 + + dlsch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext, + frame_parms, + avg, + symbol, + nb_rb); + + avgs = 0; + for (aatx=0;aatxnb_antenna_ports_eNB;aatx++) + for (aarx=0;aarxnb_antennas_rx;aarx++) + avgs = cmax(avgs,avg[(aatx<<1)+aarx]); + + pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1; + pdsch_vars[eNB_id]->log2_maxh++; + + } + } + + } + else if (beamforming_mode==7) + dlsch_channel_level_TM7(pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext, + frame_parms, + avg, + symbol, + nb_rb); +#ifdef UE_DEBUG_TRACE + LOG_D(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n", + frame%1024,subframe, pdsch_vars[eNB_id]->log2_maxh, + pdsch_vars[eNB_id]->log2_maxh0, + pdsch_vars[eNB_id]->log2_maxh1, + avg[0],avgs); + //LOG_D(PHY,"[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode); +#endif + + //wait until pdcch is decoded + //proc->channel_level = 1; + } + + /* + uint32_t wait = 0; + while(proc->channel_level == 0) + { + usleep(1); + wait++; + } + */ + +#if T_TRACER + if (type == PDSCH) + { + T(T_UE_PHY_PDSCH_ENERGY, T_INT(eNB_id), T_INT(frame%1024), T_INT(subframe), + T_INT(avg[0]), T_INT(avg[1]), T_INT(avg[2]), T_INT(avg[3])); + } +#endif + +#if UE_TIMING_TRACE + stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,subframe,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#else + LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d first_symbol_flag %d: Channel Level %5.2f \n",frame,subframe,slot,symbol,first_symbol_flag,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#endif +#endif + + +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); +#endif +// Now channel compensation + if (dlsch0_harq->mimo_moderxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + (aatx>1) ? pdsch_vars[eNB_id]->rho : NULL, frame_parms, symbol, first_symbol_flag, dlsch0_harq->Qm, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh, - phy_measurements); // log2_maxh+I0_shift -#ifdef DEBUG_PHY - - if (symbol==5) - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - -#endif - - if ((dual_stream_flag==1) && - (eNB_id_in_connected_eNB)) { - // get MF output for interfering stream - dlsch_channel_compensation(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - (aatx>1) ? lte_ue_pdsch_vars[eNB_id_i]->rho : NULL, + pdsch_vars[eNB_id]->log2_maxh, + measurements); // log2_maxh+I0_shift + /*if (symbol == 5) { + write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + } */ + if ((rx_type==rx_IC_single_stream) && + (eNB_id_in_connected_eNB)) { + dlsch_channel_compensation(pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id_i]->dl_ch_magb0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + (aatx>1) ? pdsch_vars[eNB_id_i]->rho : NULL, frame_parms, symbol, first_symbol_flag, i_mod, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh, - phy_measurements); // log2_maxh+I0_shift + pdsch_vars[eNB_id]->log2_maxh, + measurements); // log2_maxh+I0_shift #ifdef DEBUG_PHY - if (symbol == 5) { - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_i.m","rxF_c_i",&pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); } - #endif - // compute correlation between signal and interference channels dlsch_dual_stream_correlation(frame_parms, symbol, nb_rb, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->log2_maxh); + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->log2_maxh); } - } else if (dlsch0_harq->mimo_mode == LARGE_CDD) { // TM3 - // LOG_I(PHY,"Running PDSCH RX for TM3\n"); - if (frame_parms->nb_antennas_tx_eNB == 2) { - if (first_symbol_flag==1) { - // effective channel of desired user is always stronger than interfering eff. channel - dlsch_channel_level_TM3(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - frame_parms, - avg, symbol, nb_rb); - - // LOG_D(PHY,"llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(dlsch1_harq->mcs>>1)-1]); - avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(dlsch1_harq->Qm>>1)-1]; - - lte_ue_pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0); - // printf("log2_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh); - } - - dlsch_channel_compensation_TM3(frame_parms, - lte_ue_pdsch_vars[eNB_id], - phy_measurements, + } else if ((dlsch0_harq->mimo_mode == LARGE_CDD) || ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && + (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))){ + dlsch_channel_compensation_TM34(frame_parms, + pdsch_vars[eNB_id], + measurements, eNB_id, symbol, dlsch0_harq->Qm, dlsch1_harq->Qm, + harq_pid, dlsch0_harq->round, + dlsch0_harq->mimo_mode, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh); + pdsch_vars[eNB_id]->log2_maxh0, + pdsch_vars[eNB_id]->log2_maxh1); + /* if (symbol == 5) { + write_output("rxF_comp_d00.m","rxF_c_d00",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM + write_output("rxF_comp_d01.m","rxF_c_d01",&pdsch_vars[eNB_id]->rxdataF_comp0[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0 + write_output("rxF_comp_d10.m","rxF_c_d10",&pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0 + write_output("rxF_comp_d11.m","rxF_c_d11",&pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM + } */ // compute correlation between signal and interference channels (rho12 and rho21) - dlsch_dual_stream_correlation(frame_parms, + dlsch_dual_stream_correlation(frame_parms, // this is doing h11'*h12 and h21'*h22 symbol, nb_rb, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - &(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]), - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->log2_maxh); - dlsch_dual_stream_correlation(frame_parms, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + &(pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]), + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + pdsch_vars[eNB_id]->log2_maxh0); + //printf("rho stream1 =%d\n", &pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round] ); + //to be optimized (just take complex conjugate) + dlsch_dual_stream_correlation(frame_parms, // this is doing h12'*h11 and h22'*h21 symbol, nb_rb, - &(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]), - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext, - lte_ue_pdsch_vars[eNB_id]->log2_maxh); - //printf("TM3 log2_maxh : %d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh); + &(pdsch_vars[eNB_id]->dl_ch_estimates_ext[2]), + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->log2_maxh1); + // printf("rho stream2 =%d\n",&pdsch_vars[eNB_id]->dl_ch_rho2_ext ); + //printf("TM3 log2_maxh : %d\n",pdsch_vars[eNB_id]->log2_maxh); + /* if (symbol == 5) { + write_output("rho0_0.m","rho0_0",&pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM + write_output("rho2_0.m","rho2_0",&pdsch_vars[eNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0 + write_output("rho0_1.m.m","rho0_1",&pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0 + write_output("rho2_1.m","rho2_1",&pdsch_vars[eNB_id]->dl_ch_rho2_ext[1][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be QAM + } */ - } else { - LOG_E(PHY, "only 2 tx antennas supported for TM3\n"); - } - } else if (dlsch0_harq->mimo_moden_connected_eNB)) { // TM5 two-user - - // Scale the channel estimates for interfering stream - - dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - frame_parms, - dlsch_ue, - symbol, - nb_rb); - - /* compute new log2_maxh for effective channel */ - if (first_symbol_flag==1) { - // effective channel of desired user is always stronger than interfering eff. channel - dlsch_channel_level_TM56(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, lte_ue_pdsch_vars[eNB_id]->pmi_ext, avg, symbol, nb_rb); - - // LOG_D(PHY,"llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1]); - avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1]; - - lte_ue_pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0); - //printf("log1_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh); - } - - dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->pmi_ext, + } else if (dlsch0_harq->mimo_moden_connected_eNB) && (dlsch0_harq->dl_power_off==0)) { + dlsch_channel_compensation_TM56(pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->pmi_ext, frame_parms, - phy_measurements, + measurements, eNB_id, symbol, dlsch0_harq->Qm, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh, + pdsch_vars[eNB_id]->log2_maxh, dlsch0_harq->dl_power_off); - // if interference source is MU interference, assume opposite precoder was used at eNB - - // calculate opposite PMI - for (rb=0; rbpmi_ext[rb]) { - case 0: - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=1; - break; - - case 1: - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=0; - break; - - case 2: - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=3; - break; - - case 3: - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]=2; - break; - } - - // if (rb==0) - // printf("pmi %d, pmi_i %d\n",lte_ue_pdsch_vars[eNB_id]->pmi_ext[rb],lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[rb]); - + for (rb=0; rbpmi_ext[rb]) { + case 0: + pdsch_vars[eNB_id_i]->pmi_ext[rb]=1; + break; + case 1: + pdsch_vars[eNB_id_i]->pmi_ext[rb]=0; + break; + case 2: + pdsch_vars[eNB_id_i]->pmi_ext[rb]=3; + break; + case 3: + pdsch_vars[eNB_id_i]->pmi_ext[rb]=2; + break; + } + // if (rb==0) + // printf("pmi %d, pmi_i %d\n",pdsch_vars[eNB_id]->pmi_ext[rb],pdsch_vars[eNB_id_i]->pmi_ext[rb]); } - - dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, + dlsch_channel_compensation_TM56(pdsch_vars[eNB_id_i]->rxdataF_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id_i]->dl_ch_magb0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->pmi_ext, frame_parms, - phy_measurements, + measurements, eNB_id_i, symbol, i_mod, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh, + pdsch_vars[eNB_id]->log2_maxh, dlsch0_harq->dl_power_off); - #ifdef DEBUG_PHY - if (symbol==5) { - write_output("rxF_comp_d.m","rxF_c_d",<e_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); - write_output("rxF_comp_i.m","rxF_c_i",<e_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_d.m","rxF_c_d",&pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); + write_output("rxF_comp_i.m","rxF_c_i",&pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1); } - #endif - dlsch_dual_stream_correlation(frame_parms, symbol, nb_rb, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->log2_maxh); - - } else { - dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->pmi_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->log2_maxh); + } else if (dlsch0_harq->dl_power_off==1) { + dlsch_channel_compensation_TM56(pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->pmi_ext, frame_parms, - phy_measurements, + measurements, eNB_id, symbol, dlsch0_harq->Qm, nb_rb, - lte_ue_pdsch_vars[eNB_id]->log2_maxh, + pdsch_vars[eNB_id]->log2_maxh, 1); - } + + } + + + } else if (dlsch0_harq->mimo_mode==TM7) { //TM7 + + dlsch_channel_compensation(pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_bf_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + (aatx>1) ? pdsch_vars[eNB_id]->rho : NULL, + frame_parms, + symbol, + first_symbol_flag, + get_Qm(dlsch0_harq->mcs), + nb_rb, + //9, + pdsch_vars[eNB_id]->log2_maxh, + measurements); // log2_maxh+I0_shift } - // printf("MRC\n"); - if (frame_parms->nb_antennas_rx > 1) { - if (dlsch0_harq->mimo_mode == LARGE_CDD) { - if (frame_parms->nb_antennas_tx_eNB == 2) { - dlsch_detection_mrc(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->rho, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb1, - symbol, - nb_rb, - dual_stream_flag); +#if UE_TIMING_TRACE + stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,subframe,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#else + LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",frame,subframe,slot,symbol,pdsch_vars[eNB_id]->log2_maxh,proc->channel_level,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#endif +#endif +// MRC +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); +#endif + + if (frame_parms->nb_antennas_rx > 1) { + if ((dlsch0_harq->mimo_mode == LARGE_CDD) || + ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && + (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))){ // TM3 or TM4 + if (frame_parms->nb_antenna_ports_eNB == 2) { + dlsch_detection_mrc_TM34(frame_parms, + pdsch_vars[eNB_id], + harq_pid, + dlsch0_harq->round, + symbol, + nb_rb, + 1); + /* if (symbol == 5) { + write_output("rho0_mrc.m","rho0_0",&pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round][0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);// should be QAM + write_output("rho2_mrc.m","rho2_0",&pdsch_vars[eNB_id]->dl_ch_rho2_ext[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);//should be almost 0 + } */ } } else { - dlsch_detection_mrc(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->rho, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id_i]->rxdataF_comp0, + pdsch_vars[eNB_id]->rho, + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id_i]->dl_ch_mag0, + pdsch_vars[eNB_id_i]->dl_ch_magb0, symbol, nb_rb, - dual_stream_flag); + rx_type==rx_IC_single_stream); } } - // printf("Combining"); if ((dlsch0_harq->mimo_mode == SISO) || ((dlsch0_harq->mimo_mode >= UNIFORM_PRECODING11) && - (dlsch0_harq->mimo_mode <= PUSCH_PRECODING0))) { - + (dlsch0_harq->mimo_mode <= PUSCH_PRECODING0)) || + (dlsch0_harq->mimo_mode == TM7)) { /* dlsch_siso(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, + pdsch_vars[eNB_id]->rxdataF_comp, + pdsch_vars[eNB_id_i]->rxdataF_comp, symbol, nb_rb); */ } else if (dlsch0_harq->mimo_mode == ALAMOUTI) { - dlsch_alamouti(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, symbol, nb_rb); - - } - - else if (dlsch0_harq->mimo_mode == LARGE_CDD) { - - } else { - LOG_W(PHY,"dlsch_rx: Unknown MIMO mode\n"); - return (-1); } // printf("LLR"); + if ((dlsch0_harq->mimo_mode == LARGE_CDD) || + ((dlsch0_harq->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && + (dlsch0_harq->mimo_mode <=DUALSTREAM_PUSCH_PRECODING))) { + rxdataF_comp_ptr = pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round]; + dl_ch_mag_ptr = pdsch_vars[eNB_id]->dl_ch_mag1[harq_pid][round]; + } + else { + rxdataF_comp_ptr = pdsch_vars[eNB_id_i]->rxdataF_comp0; + dl_ch_mag_ptr = pdsch_vars[eNB_id_i]->dl_ch_mag0; + //i_mod should have been passed as a parameter + } + +#if UE_TIMING_TRACE + stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#else + LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: Channel Combine %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#endif +#endif + +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); +#endif + //printf("LLR dlsch0_harq->Qm %d rx_type %d cw0 %d cw1 %d symbol %d \n",dlsch0_harq->Qm,rx_type,codeword_TB0,codeword_TB1,symbol); + // compute LLRs + // -> // compute @pointer where llrs should filled for this ofdm-symbol + int8_t *pllr_symbol_cw0; + int8_t *pllr_symbol_cw1; + uint32_t llr_offset_symbol; + llr_offset_symbol = pdsch_vars[eNB_id]->llr_offset[symbol]; + pllr_symbol_cw0 = (int8_t*)pdsch_vars[eNB_id]->llr[0]; + pllr_symbol_cw1 = (int8_t*)pdsch_vars[eNB_id]->llr[1]; + pllr_symbol_cw0 += llr_offset_symbol; + pllr_symbol_cw1 += llr_offset_symbol; + + /*LOG_I(PHY,"compute LLRs [AbsSubframe %d.%d-%d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %x @LLR Buff(symb) %x\n", + proc->frame_rx, proc->subframe_rx,symbol, + nb_rb,dlsch0_harq->Qm, + pdsch_vars[eNB_id]->llr_length[symbol], + pdsch_vars[eNB_id]->llr_offset[symbol], + (int16_t*)pdsch_vars[eNB_id]->llr[0], + pllr_symbol);*/ switch (dlsch0_harq->Qm) { case 2 : - if (dlsch0_harq->mimo_mode != LARGE_CDD) { - if (dual_stream_flag == 0) + if ((rx_type==rx_standard) || (codeword_TB1 == -1)) { dlsch_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, + pdsch_vars[eNB_id]->rxdataF_comp0, + (int16_t*)pllr_symbol_cw0, + symbol, + first_symbol_flag, + nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - else if (i_mod == 2) { - dlsch_qpsk_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } else if (i_mod == 4) { - dlsch_qpsk_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } else { - dlsch_qpsk_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + beamforming_mode); - } - } else { // TM3 - DevAssert(dlsch1_harq); + } else if (codeword_TB0 == -1){ - if (dlsch1_harq->Qm == 2) { - /* dlsch_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - */ - dlsch_qpsk_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - dlsch_qpsk_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext, - lte_ue_pdsch_vars[eNB_id]->llr[1], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream); - } else if (dlsch1_harq->Qm == 4) { - dlsch_qpsk_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } else { - dlsch_qpsk_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - - } + dlsch_qpsk_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + (int16_t*)pllr_symbol_cw1, + symbol, + first_symbol_flag, + nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), + beamforming_mode); } - + else if (rx_type >= rx_IC_single_stream) { + if (dlsch1_harq->Qm == 2) { + dlsch_qpsk_qpsk_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + rxdataF_comp_ptr, + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), + pdsch_vars[eNB_id]->llr128); + if (rx_type==rx_IC_dual_stream) { + dlsch_qpsk_qpsk_llr(frame_parms, + rxdataF_comp_ptr, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->llr[1], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol), + pdsch_vars[eNB_id]->llr128_2ndstream); + } + } + else if (dlsch1_harq->Qm == 4) { + dlsch_qpsk_16qam_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + rxdataF_comp_ptr,//i + dl_ch_mag_ptr,//i + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), + pdsch_vars[eNB_id]->llr128); + if (rx_type==rx_IC_dual_stream) { + dlsch_16qam_qpsk_llr(frame_parms, + rxdataF_comp_ptr, + pdsch_vars[eNB_id]->rxdataF_comp0,//i + dl_ch_mag_ptr, + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->llr[1], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol), + pdsch_vars[eNB_id]->llr128_2ndstream); + } + } + else { + dlsch_qpsk_64qam_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + rxdataF_comp_ptr,//i + dl_ch_mag_ptr,//i + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), + pdsch_vars[eNB_id]->llr128); + if (rx_type==rx_IC_dual_stream) { + dlsch_64qam_qpsk_llr(frame_parms, + rxdataF_comp_ptr, + pdsch_vars[eNB_id]->rxdataF_comp0,//i + dl_ch_mag_ptr, + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->llr[1], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol), + pdsch_vars[eNB_id]->llr128_2ndstream); + } + } + } break; - case 4 : - if (dual_stream_flag == 0) { + if ((rx_type==rx_standard ) || (codeword_TB1 == -1)) { dlsch_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->dl_ch_mag0, symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } else if (i_mod == 2) { - dlsch_16qam_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } else if (i_mod == 4) { - dlsch_16qam_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } else { - dlsch_16qam_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128, + beamforming_mode); + } else if (codeword_TB0 == -1){ + dlsch_16qam_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[1], + pdsch_vars[eNB_id]->dl_ch_mag0, + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), + pdsch_vars[eNB_id]->llr128_2ndstream, + beamforming_mode); + } + else if (rx_type >= rx_IC_single_stream) { + if (dlsch1_harq->Qm == 2) { + dlsch_16qam_qpsk_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + rxdataF_comp_ptr,//i + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), + pdsch_vars[eNB_id]->llr128); + if (rx_type==rx_IC_dual_stream) { + dlsch_qpsk_16qam_llr(frame_parms, + rxdataF_comp_ptr, + pdsch_vars[eNB_id]->rxdataF_comp0,//i + pdsch_vars[eNB_id]->dl_ch_mag0,//i + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->llr[1], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol), + pdsch_vars[eNB_id]->llr128_2ndstream); + } + } + else if (dlsch1_harq->Qm == 4) { + dlsch_16qam_16qam_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + rxdataF_comp_ptr,//i + pdsch_vars[eNB_id]->dl_ch_mag0, + dl_ch_mag_ptr,//i + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), + pdsch_vars[eNB_id]->llr128); + if (rx_type==rx_IC_dual_stream) { + dlsch_16qam_16qam_llr(frame_parms, + rxdataF_comp_ptr, + pdsch_vars[eNB_id]->rxdataF_comp0,//i + dl_ch_mag_ptr, + pdsch_vars[eNB_id]->dl_ch_mag0,//i + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->llr[1], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol), + pdsch_vars[eNB_id]->llr128_2ndstream); + } + } + else { + dlsch_16qam_64qam_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + rxdataF_comp_ptr,//i + pdsch_vars[eNB_id]->dl_ch_mag0, + dl_ch_mag_ptr,//i + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), + pdsch_vars[eNB_id]->llr128); + if (rx_type==rx_IC_dual_stream) { + dlsch_64qam_16qam_llr(frame_parms, + rxdataF_comp_ptr, + pdsch_vars[eNB_id]->rxdataF_comp0, + dl_ch_mag_ptr, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->llr[1], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol), + pdsch_vars[eNB_id]->llr128_2ndstream); + } + } } - break; - case 6 : - if (dual_stream_flag == 0) { + if ((rx_type==rx_standard) || (codeword_TB1 == -1)) { dlsch_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + (int16_t*)pllr_symbol_cw0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, symbol,first_symbol_flag,nb_rb, adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } else if (i_mod == 2) { - dlsch_64qam_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - } else if (i_mod == 4) { - dlsch_64qam_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); - - } else { - dlsch_64qam_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext, - lte_ue_pdsch_vars[eNB_id]->llr[0], - symbol,first_symbol_flag,nb_rb, - adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr_offset[symbol], + beamforming_mode); + } else if (codeword_TB0 == -1){ + dlsch_64qam_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + (int16_t*)pllr_symbol_cw1, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), + pdsch_vars[eNB_id]->llr_offset[symbol], + beamforming_mode); + } + else if (rx_type >= rx_IC_single_stream) { + if (dlsch1_harq->Qm == 2) { + dlsch_64qam_qpsk_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + rxdataF_comp_ptr,//i + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), + pdsch_vars[eNB_id]->llr128); + if (rx_type==rx_IC_dual_stream) { + dlsch_qpsk_64qam_llr(frame_parms, + rxdataF_comp_ptr, + pdsch_vars[eNB_id]->rxdataF_comp0,//i + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->llr[1], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol), + pdsch_vars[eNB_id]->llr128_2ndstream); + } + } + else if (dlsch1_harq->Qm == 4) { + dlsch_64qam_16qam_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + rxdataF_comp_ptr,//i + pdsch_vars[eNB_id]->dl_ch_mag0, + dl_ch_mag_ptr,//i + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + pdsch_vars[eNB_id]->llr[0], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), + pdsch_vars[eNB_id]->llr128); + if (rx_type==rx_IC_dual_stream) { + dlsch_16qam_64qam_llr(frame_parms, + rxdataF_comp_ptr, + pdsch_vars[eNB_id]->rxdataF_comp0,//i + dl_ch_mag_ptr, + pdsch_vars[eNB_id]->dl_ch_mag0,//i + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + pdsch_vars[eNB_id]->llr[1], + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,4,subframe,symbol), + pdsch_vars[eNB_id]->llr128_2ndstream); + } + } + else { + dlsch_64qam_64qam_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + rxdataF_comp_ptr,//i + pdsch_vars[eNB_id]->dl_ch_mag0, + dl_ch_mag_ptr,//i + pdsch_vars[eNB_id]->dl_ch_rho2_ext, + (int16_t*)pllr_symbol_cw0, + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), + pdsch_vars[eNB_id]->llr_offset[symbol]); + if (rx_type==rx_IC_dual_stream) { + dlsch_64qam_64qam_llr(frame_parms, + rxdataF_comp_ptr, + pdsch_vars[eNB_id]->rxdataF_comp0,//i + dl_ch_mag_ptr, + pdsch_vars[eNB_id]->dl_ch_mag0,//i + pdsch_vars[eNB_id]->dl_ch_rho_ext[harq_pid][round], + (int16_t*)pllr_symbol_cw1, + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,6,subframe,symbol), + pdsch_vars[eNB_id]->llr_offset[symbol]); + } + } } - break; - default: LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n"); return(-1); break; } + if (dlsch1_harq) { + switch (get_Qm(dlsch1_harq->mcs)) { + case 2 : + if (rx_type==rx_standard) { + dlsch_qpsk_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + (int16_t*)pllr_symbol_cw0, + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol), + beamforming_mode); + } + break; + case 4: + if (rx_type==rx_standard) { + dlsch_16qam_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->dl_ch_mag0, + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol), + pdsch_vars[eNB_id]->llr128, + beamforming_mode); + } + break; + case 6 : + if (rx_type==rx_standard) { + dlsch_64qam_llr(frame_parms, + pdsch_vars[eNB_id]->rxdataF_comp0, + (int16_t*)pllr_symbol_cw0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + symbol,first_symbol_flag,nb_rb, + adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol), + pdsch_vars[eNB_id]->llr_offset[symbol], + beamforming_mode); + } + break; + default: + LOG_W(PHY,"rx_dlsch.c : Unknown mod_order!!!!\n"); + return(-1); + break; + } + } - return(0); +#if UE_TIMING_TRACE + stop_meas(&ue->generic_stat_bis[ue->current_thread_id[subframe]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#else + LOG_I(PHY, "[AbsSFN %d.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,subframe,slot,symbol,ue->generic_stat_bis[ue->current_thread_id[subframe]][slot].p_time/(cpuf*1000.0)); +#endif +#endif +// Please keep it: useful for debugging +#if 0 + if( (symbol == 13) && (subframe==0) && (dlsch0_harq->Qm == 6) /*&& (nb_rb==25)*/) + { + LOG_E(PHY,"Dump Phy Chan Est \n"); + if(1) + { +#if 1 + write_output("rxdataF0.m" , "rxdataF0", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1); + //write_output("rxdataF1.m" , "rxdataF1", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0][0],14*frame_parms->ofdm_symbol_size,1,1); + write_output("dl_ch_estimates00.m", "dl_ch_estimates00", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][0][0],14*frame_parms->ofdm_symbol_size,1,1); + //write_output("dl_ch_estimates01.m", "dl_ch_estimates01", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][1][0],14*frame_parms->ofdm_symbol_size,1,1); + //write_output("dl_ch_estimates10.m", "dl_ch_estimates10", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2][0],14*frame_parms->ofdm_symbol_size,1,1); + //write_output("dl_ch_estimates11.m", "dl_ch_estimates11", &common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][3][0],14*frame_parms->ofdm_symbol_size,1,1); + + + //write_output("rxdataF_ext00.m" , "rxdataF_ext00", &pdsch_vars[eNB_id]->rxdataF_ext[0][0],14*frame_parms->N_RB_DL*12,1,1); + //write_output("rxdataF_ext01.m" , "rxdataF_ext01", &pdsch_vars[eNB_id]->rxdataF_ext[1][0],14*frame_parms->N_RB_DL*12,1,1); + //write_output("rxdataF_ext10.m" , "rxdataF_ext10", &pdsch_vars[eNB_id]->rxdataF_ext[2][0],14*frame_parms->N_RB_DL*12,1,1); + //write_output("rxdataF_ext11.m" , "rxdataF_ext11", &pdsch_vars[eNB_id]->rxdataF_ext[3][0],14*frame_parms->N_RB_DL*12,1,1); + write_output("dl_ch_estimates_ext00.m", "dl_ch_estimates_ext00", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[0][0],14*frame_parms->N_RB_DL*12,1,1); + //write_output("dl_ch_estimates_ext01.m", "dl_ch_estimates_ext01", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[1][0],14*frame_parms->N_RB_DL*12,1,1); + //write_output("dl_ch_estimates_ext10.m", "dl_ch_estimates_ext10", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[2][0],14*frame_parms->N_RB_DL*12,1,1); + //write_output("dl_ch_estimates_ext11.m", "dl_ch_estimates_ext11", &pdsch_vars[eNB_id]->dl_ch_estimates_ext[3][0],14*frame_parms->N_RB_DL*12,1,1); + write_output("rxdataF_comp00.m","rxdataF_comp00", &pdsch_vars[eNB_id]->rxdataF_comp0[0][0],14*frame_parms->N_RB_DL*12,1,1); + //write_output("rxdataF_comp01.m","rxdataF_comp01", &pdsch_vars[eNB_id]->rxdataF_comp0[1][0],14*frame_parms->N_RB_DL*12,1,1); + //write_output("rxdataF_comp10.m","rxdataF_comp10", &pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][0][0],14*frame_parms->N_RB_DL*12,1,1); + //write_output("rxdataF_comp11.m","rxdataF_comp11", &pdsch_vars[eNB_id]->rxdataF_comp1[harq_pid][round][1][0],14*frame_parms->N_RB_DL*12,1,1); +#endif + write_output("llr0.m","llr0", &pdsch_vars[eNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0); + //write_output("llr1.m","llr1", &pdsch_vars[eNB_id]->llr[1][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0); + + + AssertFatal(0," "); + } + + } +#endif + + T(T_UE_PHY_PDSCH_IQ, T_INT(eNB_id), T_INT(frame%1024), + T_INT(subframe), T_INT(nb_rb), + T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_tti), + T_BUFFER(&pdsch_vars[eNB_id]->rxdataF_comp0[eNB_id][0], + 2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_tti*2)); + + return 0; } //============================================================================================== @@ -809,7 +1253,7 @@ void dlsch_channel_compensation(int **rxdataF_ext, unsigned char mod_order, unsigned short nb_rb, unsigned char output_shift, - PHY_MEASUREMENTS *phy_measurements) + PHY_MEASUREMENTS *measurements) { #if defined(__i386) || defined(__x86_64) @@ -823,13 +1267,13 @@ void dlsch_channel_compensation(int **rxdataF_ext, if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { - if (frame_parms->mode1_flag==1) // 10 out of 12 so don't reduce size + if (frame_parms->nb_antenna_ports_eNB==1) // 10 out of 12 so don't reduce size nb_rb=1+(5*nb_rb/6); else pilots=1; } - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) { + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) { if (mod_order == 4) { QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10) QAM_amp128b = _mm_setzero_si128(); @@ -867,9 +1311,9 @@ void dlsch_channel_compensation(int **rxdataF_ext, dl_ch_mag128b[0] = dl_ch_mag128[0]; dl_ch_mag128[0] = _mm_mulhi_epi16(dl_ch_mag128[0],QAM_amp128); dl_ch_mag128[0] = _mm_slli_epi16(dl_ch_mag128[0],1); - //print_ints("Re(ch):",(int16_t*)&mmtmpD0); - //print_shorts("QAM_amp:",(int16_t*)&QAM_amp128); - //print_shorts("mag:",(int16_t*)&dl_ch_mag128[0]); + //print_ints("Re(ch):",(int16_t*)&mmtmpD0); + //print_shorts("QAM_amp:",(int16_t*)&QAM_amp128); + //print_shorts("mag:",(int16_t*)&dl_ch_mag128[0]); dl_ch_mag128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0); dl_ch_mag128b[1] = dl_ch_mag128[1]; dl_ch_mag128[1] = _mm_mulhi_epi16(dl_ch_mag128[1],QAM_amp128); @@ -1055,7 +1499,7 @@ void dlsch_channel_compensation(int **rxdataF_ext, } if (first_symbol_flag==1) { - phy_measurements->rx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*frame_parms->N_RB_DL*12],rb*12); + measurements->rx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*frame_parms->N_RB_DL*12],rb*12); } } } @@ -1081,7 +1525,7 @@ void dlsch_channel_compensation(int **rxdataF_ext, symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { - if (frame_parms->mode1_flag==1) { // 10 out of 12 so don't reduce size + if (frame_parms->nb_antenna_ports_eNB==1) { // 10 out of 12 so don't reduce size nb_rb=1+(5*nb_rb/6); } else { @@ -1089,7 +1533,7 @@ void dlsch_channel_compensation(int **rxdataF_ext, } } - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) { + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) { if (mod_order == 4) { QAM_amp128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10) QAM_amp128b = vmovq_n_s16(0); @@ -1105,168 +1549,166 @@ void dlsch_channel_compensation(int **rxdataF_ext, dl_ch_mag128b = (int16x8_t*)&dl_ch_magb[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12]; rxdataF128 = (int16x4_t*)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128 = (int16x4x2_t*)&rxdataF_comp[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12]; - + for (rb=0; rb2) { - // get channel amplitude if not QPSK - mmtmpD0 = vmull_s16(dl_ch128[0], dl_ch128[0]); - // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits - mmtmpD1 = vmull_s16(dl_ch128[1], dl_ch128[1]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits - mmtmpD0 = vmull_s16(dl_ch128[2], dl_ch128[2]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch128[3], dl_ch128[3]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch128[4], dl_ch128[4]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch128[5], dl_ch128[5]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - } + if (mod_order>2) { + // get channel amplitude if not QPSK + mmtmpD0 = vmull_s16(dl_ch128[0], dl_ch128[0]); + // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits + mmtmpD1 = vmull_s16(dl_ch128[1], dl_ch128[1]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits + mmtmpD0 = vmull_s16(dl_ch128[2], dl_ch128[2]); + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + mmtmpD1 = vmull_s16(dl_ch128[3], dl_ch128[3]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + if (pilots==0) { + mmtmpD0 = vmull_s16(dl_ch128[4], dl_ch128[4]); + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + mmtmpD1 = vmull_s16(dl_ch128[5], dl_ch128[5]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + } - dl_ch_mag128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128b); - dl_ch_mag128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128b); - dl_ch_mag128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128); - dl_ch_mag128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128); + dl_ch_mag128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128b); + dl_ch_mag128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128b); + dl_ch_mag128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128); + dl_ch_mag128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128); - if (pilots==0) { - dl_ch_mag128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128b); - dl_ch_mag128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128); - } - } - - mmtmpD0 = vmull_s16(dl_ch128[0], rxdataF128[0]); - //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])] - mmtmpD1 = vmull_s16(dl_ch128[1], rxdataF128[1]); - //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])] - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] + if (pilots==0) { + dl_ch_mag128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128b); + dl_ch_mag128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128); + } + } - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[0],*(int16x4_t*)conj)), rxdataF128[0]); - //mmtmpD0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])] - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[1],*(int16x4_t*)conj)), rxdataF128[1]); - //mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])] - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - //mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])] + mmtmpD0 = vmull_s16(dl_ch128[0], rxdataF128[0]); + //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])] + mmtmpD1 = vmull_s16(dl_ch128[1], rxdataF128[1]); + //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])] + mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp128[0] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - mmtmpD0 = vmull_s16(dl_ch128[2], rxdataF128[2]); - mmtmpD1 = vmull_s16(dl_ch128[3], rxdataF128[3]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[2],*(int16x4_t*)conj)), rxdataF128[2]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[3],*(int16x4_t*)conj)), rxdataF128[3]); - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp128[1] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[0],*(int16x4_t*)conj)), rxdataF128[0]); + //mmtmpD0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])] + mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[1],*(int16x4_t*)conj)), rxdataF128[1]); + //mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])] + mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + //mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])] - if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch128[4], rxdataF128[4]); - mmtmpD1 = vmull_s16(dl_ch128[5], rxdataF128[5]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); + mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); + rxdataF_comp128[0] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + mmtmpD0 = vmull_s16(dl_ch128[2], rxdataF128[2]); + mmtmpD1 = vmull_s16(dl_ch128[3], rxdataF128[3]); + mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[2],*(int16x4_t*)conj)), rxdataF128[2]); + mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[3],*(int16x4_t*)conj)), rxdataF128[3]); + mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); + mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); + rxdataF_comp128[1] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[4],*(int16x4_t*)conj)), rxdataF128[4]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[5],*(int16x4_t*)conj)), rxdataF128[5]); - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + if (pilots==0) { + mmtmpD0 = vmull_s16(dl_ch128[4], rxdataF128[4]); + mmtmpD1 = vmull_s16(dl_ch128[5], rxdataF128[5]); + mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp128[2] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - - dl_ch128+=6; - dl_ch_mag128+=3; - dl_ch_mag128b+=3; - rxdataF128+=6; - rxdataF_comp128+=3; - - } else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less - dl_ch128+=4; - dl_ch_mag128+=2; - dl_ch_mag128b+=2; - rxdataF128+=4; - rxdataF_comp128+=2; - } + mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[4],*(int16x4_t*)conj)), rxdataF128[4]); + mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch128[5],*(int16x4_t*)conj)), rxdataF128[5]); + mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + + + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); + mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); + rxdataF_comp128[2] = vzip_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + + + dl_ch128+=6; + dl_ch_mag128+=3; + dl_ch_mag128b+=3; + rxdataF128+=6; + rxdataF_comp128+=3; + + } else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less + dl_ch128+=4; + dl_ch_mag128+=2; + dl_ch_mag128b+=2; + rxdataF128+=4; + rxdataF_comp128+=2; + } } } } - + if (rho) { for (aarx=0; aarxnb_antennas_rx; aarx++) { rho128 = (int16x4x2_t*)&rho[aarx][symbol*frame_parms->N_RB_DL*12]; dl_ch128 = (int16x4_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; dl_ch128_2 = (int16x4_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; for (rb=0; rbrx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*frame_parms->N_RB_DL*12],rb*12); + measurements->rx_correlation[0][aarx] = signal_energy(&rho[aarx][symbol*frame_parms->N_RB_DL*12],rb*12); } } } #endif } - - #if defined(__x86_64__) || defined(__i386__) void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) @@ -1312,62 +1754,63 @@ void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) _mm_empty(); _m_empty(); } - #elif defined(__arm__) -void prec2A_TM56_128(unsigned char pmi,int16x8_t* ch0,int16x8_t* ch1) { +void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) { - int16x8_t amp; - int16_t conj[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; + // sqrt(2) is already taken into account in computation sqrt_rho_a, sqrt_rho_b, + //so removed it - amp = vmovq_n_s16(ONE_OVER_SQRT2_Q15); + //__m128i amp; + //amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); switch (pmi) { + case 0 : // +1 +1 // print_shorts("phase 0 :ch0",ch0); // print_shorts("phase 0 :ch1",ch1); - ch0[0] = vqaddq_s16(ch0[0],ch1[0]); + ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]); break; - case 1 : // +1 -1 // print_shorts("phase 1 :ch0",ch0); // print_shorts("phase 1 :ch1",ch1); - ch0[0] = vqsubq_s16(ch0[0],ch1[0]); + ch0[0] = _mm_subs_epi16(ch0[0],ch1[0]); // print_shorts("phase 1 :ch0-ch1",ch0); break; - case 2 : // +1 +j - ch1[0] = vrev32q_s16(vmulq_s16(ch1[0],*(int16x8_t*)conj)); - ch0[0] = vqsubq_s16(ch0[0],ch1[0]); + ch1[0] = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]); + ch1[0] = _mm_shufflelo_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); + ch1[0] = _mm_shufflehi_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); + ch0[0] = _mm_subs_epi16(ch0[0],ch1[0]); + break; // +1 -j - case 3 : - ch1[0] = vrev32q_s16(vmulq_s16(ch1[0],*(int16x8_t*)conj)); - ch0[0] = vqaddq_s16(ch0[0],ch1[0]); + ch1[0] = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]); + ch1[0] = _mm_shufflelo_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); + ch1[0] = _mm_shufflehi_epi16(ch1[0],_MM_SHUFFLE(2,3,0,1)); + ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]); break; } - - ch0[0] = vqdmulhq_s16(ch0[0],amp); + + //ch0[0] = _mm_mulhi_epi16(ch0[0],amp); + //ch0[0] = _mm_slli_epi16(ch0[0],1); + + _mm_empty(); + _m_empty(); } - #endif - // precoding is stream 0 .5(1,1) .5(1,-1) .5(1,1) .5(1,-1) // stream 1 .5(1,-1) .5(1,1) .5(1,-1) .5(1,1) // store "precoded" channel for stream 0 in ch0, stream 1 in ch1 short TM3_prec[8]__attribute__((aligned(16))) = {1,1,-1,-1,1,1,-1,-1} ; -#if defined(__x86_64__) || defined(__i386__) +void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) { -static inline void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) __attribute__((always_inline)); -static inline void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) -{ - - // __m128i amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); + __m128i amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); __m128i tmp0,tmp1; - + //_mm_mulhi_epi16 // print_shorts("prec2A_TM3 ch0 (before):",ch0); // print_shorts("prec2A_TM3 ch1 (before):",ch1); @@ -1378,90 +1821,80 @@ static inline void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) ch0[0] = _mm_adds_epi16(ch0[0],tmp1); ch1[0] = _mm_subs_epi16(tmp0,tmp1); + ch0[0] = _mm_mulhi_epi16(ch0[0],amp); + ch0[0] = _mm_slli_epi16(ch0[0],1); + + ch1[0] = _mm_mulhi_epi16(ch1[0],amp); + ch1[0] = _mm_slli_epi16(ch1[0],1); // print_shorts("prec2A_TM3 ch0 (mid):",&tmp0); // print_shorts("prec2A_TM3 ch1 (mid):",ch1); + //ch0[0] = _mm_mulhi_epi16(ch0[0],amp); + //ch0[0] = _mm_slli_epi16(ch0[0],1); + //ch1[0] = _mm_mulhi_epi16(ch1[0],amp); + //ch1[0] = _mm_slli_epi16(ch1[0],1); - ch0[0] = _mm_srai_epi16(ch0[0],1); - ch1[0] = _mm_srai_epi16(ch1[0],1); + //ch0[0] = _mm_srai_epi16(ch0[0],1); + //ch1[0] = _mm_srai_epi16(ch1[0],1); // print_shorts("prec2A_TM3 ch0 (after):",ch0); // print_shorts("prec2A_TM3 ch1 (after):",ch1); + _mm_empty(); + _m_empty(); } -#elif defined(__arm__) - -void prec2A_TM3_128(int16x8_t* ch0, int16x8_t* ch1) -{ - - int16x8_t tmp0,tmp1; - - tmp0 = ch0[0]; - tmp1 = vmulq_s16(ch1[0],((int16x8_t*)&TM3_prec)[0]); - ch0[0] = vhaddq_s16(ch0[0],tmp1); - ch1[0] = vhsubq_s16(tmp0,tmp1); -} - -#endif - // pmi = 0 => stream 0 (1,1), stream 1 (1,-1) // pmi = 1 => stream 0 (1,j), stream 2 (1,-j) -#if defined(__x86_64__) || defined(__i386__) +void prec2A_TM4_128(int pmi,__m128i *ch0,__m128i *ch1) { -void prec2A_TM4_128(int pmi,__m128i *ch0,__m128i *ch1) -{ +// sqrt(2) is already taken into account in computation sqrt_rho_a, sqrt_rho_b, +//so divide by 2 is replaced by divide by sqrt(2). - __m128i amp; - amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); + // printf ("demod pmi=%d\n", pmi); + __m128i amp; + amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); __m128i tmp0,tmp1; - if (pmi == 0) { - ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]); - ch1[0] = _mm_subs_epi16(ch0[0],ch1[0]); - } else { + // print_shorts("prec2A_TM4 ch0 (before):",ch0); + // print_shorts("prec2A_TM4 ch1 (before):",ch1); + + if (pmi == 0) { //[1 1;1 -1] + tmp0 = ch0[0]; + tmp1 = ch1[0]; + ch0[0] = _mm_adds_epi16(tmp0,tmp1); + ch1[0] = _mm_subs_epi16(tmp0,tmp1); + } + else { //ch0+j*ch1 ch0-j*ch1 tmp0 = ch0[0]; tmp1 = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]); tmp1 = _mm_shufflelo_epi16(tmp1,_MM_SHUFFLE(2,3,0,1)); tmp1 = _mm_shufflehi_epi16(tmp1,_MM_SHUFFLE(2,3,0,1)); - ch0[0] = _mm_adds_epi16(tmp0,tmp1); - ch1[0] = _mm_subs_epi16(tmp0,tmp1); + ch0[0] = _mm_subs_epi16(tmp0,tmp1); + ch1[0] = _mm_add_epi16(tmp0,tmp1); } + //print_shorts("prec2A_TM4 ch0 (middle):",ch0); + //print_shorts("prec2A_TM4 ch1 (middle):",ch1); + ch0[0] = _mm_mulhi_epi16(ch0[0],amp); ch0[0] = _mm_slli_epi16(ch0[0],1); ch1[0] = _mm_mulhi_epi16(ch1[0],amp); ch1[0] = _mm_slli_epi16(ch1[0],1); + + // ch0[0] = _mm_srai_epi16(ch0[0],1); //divide by 2 + // ch1[0] = _mm_srai_epi16(ch1[0],1); //divide by 2 + //print_shorts("prec2A_TM4 ch0 (end):",ch0); + //print_shorts("prec2A_TM4 ch1 (end):",ch1); + _mm_empty(); + _m_empty(); + // print_shorts("prec2A_TM4 ch0 (end):",ch0); + //print_shorts("prec2A_TM4 ch1 (end):",ch1); } -#elif defined(__arm__) - -void prec2A_TM4_128(int pmi,int16x8_t *ch0,int16x8_t *ch1) -{ - int16x8_t amp; - int16x8_t tmp0,tmp1; - int16_t conj[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; - - amp = vmovq_n_s16(ONE_OVER_SQRT2_Q15); - - if (pmi == 0) { - ch0[0] = vqaddq_s16(ch0[0],ch1[0]); - ch1[0] = vqsubq_s16(ch0[0],ch1[0]); - } else { - tmp0 = ch0[0]; - tmp1 = vrev32q_s16(vmulq_s16(ch1[0],*(int16x8_t*)conj)); - ch0[0] = vqaddq_s16(tmp0,tmp1); - ch1[0] = vqsubq_s16(tmp0,tmp1); - } - - ch0[0] = vqdmulhq_s16(ch0[0],amp); - ch1[0] = vqdmulhq_s16(ch1[0],amp); -} -#endif - void dlsch_channel_compensation_TM56(int **rxdataF_ext, int **dl_ch_estimates_ext, int **dl_ch_mag, @@ -1469,7 +1902,7 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext, int **rxdataF_comp, unsigned char *pmi_ext, LTE_DL_FRAME_PARMS *frame_parms, - PHY_MEASUREMENTS *phy_measurements, + PHY_MEASUREMENTS *measurements, int eNB_id, unsigned char symbol, unsigned char mod_order, @@ -1523,6 +1956,7 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext, prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[1],&dl_ch1_128[1]); if (pilots==0) { + prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[2],&dl_ch1_128[2]); } @@ -1542,6 +1976,9 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext, dl_ch_mag128[0] = _mm_mulhi_epi16(dl_ch_mag128[0],QAM_amp128); dl_ch_mag128[0] = _mm_slli_epi16(dl_ch_mag128[0],1); + + //print_shorts("dl_ch_mag128[0]=",&dl_ch_mag128[0]); + //print_shorts("dl_ch_mag128[0]=",&dl_ch_mag128[0]); dl_ch_mag128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0); @@ -1573,32 +2010,34 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext, if (pilots==0) { dl_ch_mag128b[2] = _mm_mulhi_epi16(dl_ch_mag128b[2],QAM_amp128b); dl_ch_mag128b[2] = _mm_slli_epi16(dl_ch_mag128b[2],1); + } } // MF multiply by conjugated channel mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],rxdataF128[0]); - // print_ints("re",&mmtmpD0); + // print_ints("re",&mmtmpD0); // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); - // print_ints("im",&mmtmpD1); + + // print_ints("im",&mmtmpD1); mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]); // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - // print_ints("re(shift)",&mmtmpD0); + // print_ints("re(shift)",&mmtmpD0); mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); - // print_ints("im(shift)",&mmtmpD1); + // print_ints("im(shift)",&mmtmpD1); mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); // print_ints("c0",&mmtmpD2); - // print_ints("c1",&mmtmpD3); + // print_ints("c1",&mmtmpD3); rxdataF_comp128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128); - // print_shorts("ch:",dl_ch128); - // print_shorts("pack:",rxdataF_comp128); + // print_shorts("rx:",rxdataF128); + // print_shorts("ch:",dl_ch128); + // print_shorts("pack:",rxdataF_comp128); // multiply by conjugated channel mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]); @@ -1656,57 +2095,54 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext, Nre = (pilots==0) ? 12 : 8; precoded_signal_strength += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))) - (phy_measurements->n0_power[aarx])); + (nb_rb*Nre))) - (measurements->n0_power[aarx])); } // rx_antennas - phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,phy_measurements->n0_power_tot); + measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,measurements->n0_power_tot); //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol, - // phy_measurements->precoded_cqi_dB[eNB_id][0]); - - _mm_empty(); - _m_empty(); + // measurements->precoded_cqi_dB[eNB_id][0]); #elif defined(__arm__) uint32_t rb,Nre; uint32_t aarx,symbol_mod,pilots=0; - + int16x4_t *dl_ch0_128,*dl_ch1_128,*rxdataF128; int16x8_t *dl_ch0_128b,*dl_ch1_128b; int32x4_t mmtmpD0,mmtmpD1,mmtmpD0b,mmtmpD1b; int16x8_t *dl_ch_mag128,*dl_ch_mag128b,mmtmpD2,mmtmpD3,mmtmpD4,*rxdataF_comp128; int16x8_t QAM_amp128,QAM_amp128b; - + int16_t conj[4]__attribute__((aligned(16))) = {1,-1,1,-1}; int32x4_t output_shift128 = vmovq_n_s32(-(int32_t)output_shift); int32_t precoded_signal_strength=0; - - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { - if (frame_parms->mode1_flag==1) // 10 out of 12 so don't reduce size + if (frame_parms->nb_antenna_ports_eNB==1) // 10 out of 12 so don't reduce size { nb_rb=1+(5*nb_rb/6); } - + else { pilots=1; } } - - + + if (mod_order == 4) { QAM_amp128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10) QAM_amp128b = vmovq_n_s16(0); - + } else if (mod_order == 6) { QAM_amp128 = vmovq_n_s16(QAM64_n1); // QAM_amp128b = vmovq_n_s16(QAM64_n2); } - + // printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol); - + for (aarx=0; aarxnb_antennas_rx; aarx++) { - - - + + + dl_ch0_128 = (int16x4_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; dl_ch1_128 = (int16x4_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; dl_ch0_128b = (int16x8_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; @@ -1715,144 +2151,153 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext, dl_ch_mag128b = (int16x8_t*)&dl_ch_magb[aarx][symbol*frame_parms->N_RB_DL*12]; rxdataF128 = (int16x4_t*)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128 = (int16x8_t*)&rxdataF_comp[aarx][symbol*frame_parms->N_RB_DL*12]; - + for (rb=0; rb%d\n",rb,pmi_ext[rb]); #endif prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128b[0],&dl_ch1_128b[0]); prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128b[1],&dl_ch1_128b[1]); - + if (pilots==0) { - prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128b[2],&dl_ch1_128b[2]); + prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128b[2],&dl_ch1_128b[2]); } - + if (mod_order>2) { - // get channel amplitude if not QPSK - mmtmpD0 = vmull_s16(dl_ch0_128[0], dl_ch0_128[0]); - // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits - mmtmpD1 = vmull_s16(dl_ch0_128[1], dl_ch0_128[1]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits - mmtmpD0 = vmull_s16(dl_ch0_128[2], dl_ch0_128[2]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch0_128[3], dl_ch0_128[3]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch0_128[4], dl_ch0_128[4]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch0_128[5], dl_ch0_128[5]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - - } - - dl_ch_mag128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128b); - dl_ch_mag128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128b); - dl_ch_mag128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128); - dl_ch_mag128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128); - - - if (pilots==0) { - dl_ch_mag128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128b); - dl_ch_mag128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128); - } + // get channel amplitude if not QPSK + mmtmpD0 = vmull_s16(dl_ch0_128[0], dl_ch0_128[0]); + // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits + mmtmpD1 = vmull_s16(dl_ch0_128[1], dl_ch0_128[1]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits + mmtmpD0 = vmull_s16(dl_ch0_128[2], dl_ch0_128[2]); + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + mmtmpD1 = vmull_s16(dl_ch0_128[3], dl_ch0_128[3]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + if (pilots==0) { + mmtmpD0 = vmull_s16(dl_ch0_128[4], dl_ch0_128[4]); + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + mmtmpD1 = vmull_s16(dl_ch0_128[5], dl_ch0_128[5]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + + + } + + dl_ch_mag128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128b); + dl_ch_mag128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128b); + dl_ch_mag128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp128); + dl_ch_mag128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp128); + + + if (pilots==0) { + dl_ch_mag128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128b); + dl_ch_mag128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp128); + } } mmtmpD0 = vmull_s16(dl_ch0_128[0], rxdataF128[0]); - //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])] + //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])] mmtmpD1 = vmull_s16(dl_ch0_128[1], rxdataF128[1]); - //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])] + //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])] mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] - + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] + mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[0],*(int16x4_t*)conj)), rxdataF128[0]); //mmtmpD0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])] mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[1],*(int16x4_t*)conj)), rxdataF128[1]); //mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])] mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); //mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])] - + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); rxdataF_comp128[0] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - + mmtmpD0 = vmull_s16(dl_ch0_128[2], rxdataF128[2]); mmtmpD1 = vmull_s16(dl_ch0_128[3], rxdataF128[3]); mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[2],*(int16x4_t*)conj)), rxdataF128[2]); mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[3],*(int16x4_t*)conj)), rxdataF128[3]); mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); rxdataF_comp128[1] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - + if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch0_128[4], rxdataF128[4]); - mmtmpD1 = vmull_s16(dl_ch0_128[5], rxdataF128[5]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[4],*(int16x4_t*)conj)), rxdataF128[4]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[5],*(int16x4_t*)conj)), rxdataF128[5]); - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - - dl_ch0_128+=6; - dl_ch1_128+=6; - dl_ch_mag128+=3; - dl_ch_mag128b+=3; - rxdataF128+=6; - rxdataF_comp128+=3; - + mmtmpD0 = vmull_s16(dl_ch0_128[4], rxdataF128[4]); + mmtmpD1 = vmull_s16(dl_ch0_128[5], rxdataF128[5]); + mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + + mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[4],*(int16x4_t*)conj)), rxdataF128[4]); + mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[5],*(int16x4_t*)conj)), rxdataF128[5]); + mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + + + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); + mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); + rxdataF_comp128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + + + dl_ch0_128+=6; + dl_ch1_128+=6; + dl_ch_mag128+=3; + dl_ch_mag128b+=3; + rxdataF128+=6; + rxdataF_comp128+=3; + } else { // we have a smaller PDSCH in symbols with pilots so skip last group of 4 REs and increment less - dl_ch0_128+=4; - dl_ch1_128+=4; - dl_ch_mag128+=2; - dl_ch_mag128b+=2; - rxdataF128+=4; - rxdataF_comp128+=2; + dl_ch0_128+=4; + dl_ch1_128+=4; + dl_ch_mag128+=2; + dl_ch_mag128b+=2; + rxdataF128+=4; + rxdataF_comp128+=2; } } - + Nre = (pilots==0) ? 12 : 8; - + + precoded_signal_strength += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))) - (phy_measurements->n0_power[aarx])); + + (nb_rb*Nre))) - (measurements->n0_power[aarx])); // rx_antennas } - phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,phy_measurements->n0_power_tot); - + measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,measurements->n0_power_tot); + + //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol, + // measurements->precoded_cqi_dB[eNB_id][0]); + #endif + _mm_empty(); + _m_empty(); } -void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, - LTE_UE_PDSCH *lte_ue_pdsch_vars, - PHY_MEASUREMENTS *phy_measurements, +void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms, + LTE_UE_PDSCH *pdsch_vars, + PHY_MEASUREMENTS *measurements, int eNB_id, unsigned char symbol, unsigned char mod_order0, unsigned char mod_order1, + int harq_pid, int round, + MIMO_mode_t mimo_mode, unsigned short nb_rb, - unsigned char output_shift) -{ + unsigned char output_shift0, + unsigned char output_shift1) { #if defined(__x86_64__) || defined(__i386__) @@ -1860,25 +2305,27 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, __m128i *dl_ch0_128,*dl_ch1_128,*dl_ch_mag0_128,*dl_ch_mag1_128,*dl_ch_mag0_128b,*dl_ch_mag1_128b,*rxdataF128,*rxdataF_comp0_128,*rxdataF_comp1_128; unsigned char aarx=0,symbol_mod,pilots=0; int precoded_signal_strength0=0,precoded_signal_strength1=0; + int rx_power_correction; - int **rxdataF_ext = lte_ue_pdsch_vars->rxdataF_ext; - int **dl_ch_estimates_ext = lte_ue_pdsch_vars->dl_ch_estimates_ext; - int **dl_ch_mag0 = lte_ue_pdsch_vars->dl_ch_mag0; - int **dl_ch_mag1 = lte_ue_pdsch_vars->dl_ch_mag1; - int **dl_ch_magb0 = lte_ue_pdsch_vars->dl_ch_magb0; - int **dl_ch_magb1 = lte_ue_pdsch_vars->dl_ch_magb1; - int **rxdataF_comp0 = lte_ue_pdsch_vars->rxdataF_comp0; - int **rxdataF_comp1 = lte_ue_pdsch_vars->rxdataF_comp1[round]; //? + int **rxdataF_ext = pdsch_vars->rxdataF_ext; + int **dl_ch_estimates_ext = pdsch_vars->dl_ch_estimates_ext; + int **dl_ch_mag0 = pdsch_vars->dl_ch_mag0; + int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1[harq_pid][round]; + int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0; + int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1[harq_pid][round]; + int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0; + int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[harq_pid][round]; + unsigned char *pmi_ext = pdsch_vars->pmi_ext; __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp0_128,QAM_amp0_128b,QAM_amp1_128,QAM_amp1_128b; - symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) pilots=1; + rx_power_correction = 1; - //printf("comp prec: symbol %d, pilots %d\n",symbol, pilots); + // printf("comp prec: symbol %d, pilots %d\n",symbol, pilots); if (mod_order0 == 4) { QAM_amp0_128 = _mm_set1_epi16(QAM16_n1); @@ -1896,39 +2343,83 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, QAM_amp1_128b = _mm_set1_epi16(QAM64_n2); } - for (aarx=0; aarxnb_antennas_rx; aarx++) { + for (aarx=0;aarxnb_antennas_rx;aarx++) { - dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; // hr,0 - dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; // hr,1 + /* if (aarx==0) { + output_shift=output_shift0; + } + else { + output_shift=output_shift1; + } */ + + // printf("antenna %d\n", aarx); + // printf("symbol %d, rx antenna %d\n", symbol, aarx); + + dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; // this is h11 + dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; // this is h12 - dl_ch_mag0_128 = (__m128i *)&dl_ch_mag0[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag0_128b = (__m128i *)&dl_ch_magb0[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag1_128 = (__m128i *)&dl_ch_mag1[aarx][symbol*frame_parms->N_RB_DL*12]; - dl_ch_mag1_128b = (__m128i *)&dl_ch_magb1[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; // yr - rxdataF_comp0_128 = (__m128i *)&rxdataF_comp0[aarx][symbol*frame_parms->N_RB_DL*12]; // yr,0 = yr * conj(hr,0) - rxdataF_comp1_128 = (__m128i *)&rxdataF_comp1[aarx][symbol*frame_parms->N_RB_DL*12]; // yr,1 = yr * conj(hr,1) - + dl_ch_mag0_128 = (__m128i *)&dl_ch_mag0[aarx][symbol*frame_parms->N_RB_DL*12]; //responsible for x1 + dl_ch_mag0_128b = (__m128i *)&dl_ch_magb0[aarx][symbol*frame_parms->N_RB_DL*12];//responsible for x1 + dl_ch_mag1_128 = (__m128i *)&dl_ch_mag1[aarx][symbol*frame_parms->N_RB_DL*12]; //responsible for x2. always coming from tx2 + dl_ch_mag1_128b = (__m128i *)&dl_ch_magb1[aarx][symbol*frame_parms->N_RB_DL*12]; //responsible for x2. always coming from tx2 + rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; //received signal on antenna of interest h11*x1+h12*x2 + rxdataF_comp0_128 = (__m128i *)&rxdataF_comp0[aarx][symbol*frame_parms->N_RB_DL*12]; //result of multipl with MF x1 on antenna of interest + rxdataF_comp1_128 = (__m128i *)&rxdataF_comp1[aarx][symbol*frame_parms->N_RB_DL*12]; //result of multipl with MF x2 on antenna of interest for (rb=0; rb2) { // get channel amplitude if not QPSK mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch0_128[0]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); mmtmpD1 = _mm_madd_epi16(dl_ch0_128[1],dl_ch0_128[1]); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0); mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1); @@ -1939,6 +2430,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, // print_shorts("dl_ch_mag0_128[0]=",&dl_ch_mag0_128[0]); + dl_ch_mag0_128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0); dl_ch_mag0_128b[1] = dl_ch_mag0_128[1]; dl_ch_mag0_128[1] = _mm_mulhi_epi16(dl_ch_mag0_128[1],QAM_amp0_128); @@ -1946,7 +2438,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, if (pilots==0) { mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],dl_ch0_128[2]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0); @@ -1960,7 +2452,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, dl_ch_mag0_128b[0] = _mm_mulhi_epi16(dl_ch_mag0_128b[0],QAM_amp0_128b); dl_ch_mag0_128b[0] = _mm_slli_epi16(dl_ch_mag0_128b[0],1); - //print_shorts("dl_ch_mag128b[0]=",&dl_ch_mag128b[0]); + // print_shorts("dl_ch_mag0_128b[0]=",&dl_ch_mag0_128b[0]); dl_ch_mag0_128b[1] = _mm_mulhi_epi16(dl_ch_mag0_128b[1],QAM_amp0_128b); dl_ch_mag0_128b[1] = _mm_slli_epi16(dl_ch_mag0_128b[1],1); @@ -1975,10 +2467,10 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, // get channel amplitude if not QPSK mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],dl_ch1_128[0]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1); mmtmpD1 = _mm_madd_epi16(dl_ch1_128[1],dl_ch1_128[1]); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1); mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1); @@ -1987,7 +2479,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, dl_ch_mag1_128[0] = _mm_mulhi_epi16(dl_ch_mag1_128[0],QAM_amp1_128); dl_ch_mag1_128[0] = _mm_slli_epi16(dl_ch_mag1_128[0],1); - //print_shorts("dl_ch_mag128[0]=",&dl_ch_mag128[0]); + // print_shorts("dl_ch_mag1_128[0]=",&dl_ch_mag1_128[0]); dl_ch_mag1_128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0); dl_ch_mag1_128b[1] = dl_ch_mag1_128[1]; @@ -1996,7 +2488,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, if (pilots==0) { mmtmpD0 = _mm_madd_epi16(dl_ch1_128[2],dl_ch1_128[2]); - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1); mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0); @@ -2010,7 +2502,7 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, dl_ch_mag1_128b[0] = _mm_mulhi_epi16(dl_ch_mag1_128b[0],QAM_amp1_128b); dl_ch_mag1_128b[0] = _mm_slli_epi16(dl_ch_mag1_128b[0],1); - //print_shorts("dl_ch_mag128b[0]=",&dl_ch_mag128b[0]); + // print_shorts("dl_ch_mag1_128b[0]=",&dl_ch_mag1_128b[0]); dl_ch_mag1_128b[1] = _mm_mulhi_epi16(dl_ch_mag1_128b[1],QAM_amp1_128b); dl_ch_mag1_128b[1] = _mm_slli_epi16(dl_ch_mag1_128b[1],1); @@ -2024,28 +2516,29 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, // layer 0 // MF multiply by conjugated channel mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],rxdataF128[0]); - //print_ints("re",&mmtmpD0); + // print_ints("re",&mmtmpD0); // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]); - // print_ints("im",&mmtmpD1); + // print_ints("im",&mmtmpD1); // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - // printf("Shift: %d\n",output_shift); - // print_ints("re(shift)",&mmtmpD0); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); - // print_ints("im(shift)",&mmtmpD1); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); + // printf("Shift: %d\n",output_shift); + // print_ints("re(shift)",&mmtmpD0); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0); + // print_ints("im(shift)",&mmtmpD1); mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - // print_ints("c0",&mmtmpD2); - // print_ints("c1",&mmtmpD3); + // print_ints("c0",&mmtmpD2); + // print_ints("c1",&mmtmpD3); rxdataF_comp0_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128); - // print_shorts("ch:",dl_ch0_128); - // print_shorts("pack:",rxdataF_comp0_128); + + // print_shorts("rx:",rxdataF128); + // print_shorts("ch:",dl_ch0_128); + // print_shorts("pack:",rxdataF_comp0_128); // multiply by conjugated channel mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]); @@ -2055,15 +2548,15 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]); // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0); mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); rxdataF_comp0_128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128+1); - // print_shorts("ch:",dl_ch0_128+1); - // print_shorts("pack:",rxdataF_comp128+1); + // print_shorts("rx:",rxdataF128+1); + // print_shorts("ch:",dl_ch0_128+1); + // print_shorts("pack:",rxdataF_comp0_128+1); if (pilots==0) { // multiply by conjugated channel @@ -2074,17 +2567,15 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]); // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift0); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift0); mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); rxdataF_comp0_128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128+2); - // print_shorts("ch:",dl_ch0_128+2); - // print_shorts("pack:",rxdataF_comp128+2); - - } else { + // print_shorts("rx:",rxdataF128+2); + // print_shorts("ch:",dl_ch0_128+2); + // print_shorts("pack:",rxdataF_comp0_128+2); } @@ -2092,29 +2583,29 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, // layer 1 // MF multiply by conjugated channel mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],rxdataF128[0]); - // print_ints("re",&mmtmpD0); + // print_ints("re",&mmtmpD0); - // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) + // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[0],_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1)); mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]); - // print_ints("im",&mmtmpD1); + // print_ints("im",&mmtmpD1); mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]); // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - // print_ints("re(shift)",&mmtmpD0); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); - // print_ints("im(shift)",&mmtmpD1); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1); + // print_ints("re(shift)",&mmtmpD0); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1); + // print_ints("im(shift)",&mmtmpD1); mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); - // print_ints("c0",&mmtmpD2); - // print_ints("c1",&mmtmpD3); + // print_ints("c0",&mmtmpD2); + // print_ints("c1",&mmtmpD3); rxdataF_comp1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128); - // print_shorts("ch:",dl_ch128); - // print_shorts("pack:",rxdataF_comp128); + // print_shorts("rx:",rxdataF128); + // print_shorts("ch:",dl_ch1_128); + // print_shorts("pack:",rxdataF_comp1_128); - // multiply by conjugated channel + // multiply by conjugated channel mmtmpD0 = _mm_madd_epi16(dl_ch1_128[1],rxdataF128[1]); // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[1],_MM_SHUFFLE(2,3,0,1)); @@ -2122,15 +2613,15 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]); // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1); mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); rxdataF_comp1_128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128+1); - // print_shorts("ch:",dl_ch128+1); - // print_shorts("pack:",rxdataF_comp128+1); + // print_shorts("rx:",rxdataF128+1); + // print_shorts("ch:",dl_ch1_128+1); + // print_shorts("pack:",rxdataF_comp1_128+1); if (pilots==0) { // multiply by conjugated channel @@ -2141,15 +2632,15 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate); mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]); // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift); - mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift); + mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift1); + mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift1); mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1); mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); rxdataF_comp1_128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - // print_shorts("rx:",rxdataF128+2); - // print_shorts("ch:",dl_ch128+2); - // print_shorts("pack:",rxdataF_comp128+2); + // print_shorts("rx:",rxdataF128+2); + // print_shorts("ch:",dl_ch1_128+2); + // print_shorts("pack:",rxdataF_comp1_128+2); dl_ch0_128+=3; dl_ch1_128+=3; @@ -2160,7 +2651,8 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, rxdataF128+=3; rxdataF_comp0_128+=3; rxdataF_comp1_128+=3; - } else { + } + else { dl_ch0_128+=2; dl_ch1_128+=2; dl_ch_mag0_128+=2; @@ -2173,85 +2665,85 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, } } // rb loop - } - - Nre = (pilots==0) ? 12 : 8; + Nre = (pilots==0) ? 12 : 8; - precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))) - (phy_measurements->n0_power[aarx])); + precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], + (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx])); - precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))) - (phy_measurements->n0_power[aarx])); + precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre], + (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx])); + } // rx_antennas - phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,phy_measurements->n0_power_tot); - phy_measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,phy_measurements->n0_power_tot); + measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,measurements->n0_power_tot); + measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,measurements->n0_power_tot); - //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol, - // phy_measurements->precoded_cqi_dB[eNB_id][0]); + // printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol, + // measurements->precoded_cqi_dB[eNB_id][0]); _mm_empty(); _m_empty(); -#elif defined(__arm__) + #elif defined(__arm__) unsigned short rb,Nre; unsigned char aarx,symbol_mod,pilots=0; - int precoded_signal_strength0=0,precoded_signal_strength1=0; + int precoded_signal_strength0=0,precoded_signal_strength1=0, rx_power_correction; int16x4_t *dl_ch0_128,*rxdataF128; int16x4_t *dl_ch1_128; int16x8_t *dl_ch0_128b,*dl_ch1_128b; - + int32x4_t mmtmpD0,mmtmpD1,mmtmpD0b,mmtmpD1b; int16x8_t *dl_ch_mag0_128,*dl_ch_mag0_128b,*dl_ch_mag1_128,*dl_ch_mag1_128b,mmtmpD2,mmtmpD3,mmtmpD4,*rxdataF_comp0_128,*rxdataF_comp1_128; int16x8_t QAM_amp0_128,QAM_amp0_128b,QAM_amp1_128,QAM_amp1_128b; int32x4_t output_shift128 = vmovq_n_s32(-(int32_t)output_shift); - - int **rxdataF_ext = lte_ue_pdsch_vars->rxdataF_ext; - int **dl_ch_estimates_ext = lte_ue_pdsch_vars->dl_ch_estimates_ext; - int **dl_ch_mag0 = lte_ue_pdsch_vars->dl_ch_mag0; - int **dl_ch_mag1 = lte_ue_pdsch_vars->dl_ch_mag1; - int **dl_ch_magb0 = lte_ue_pdsch_vars->dl_ch_magb0; - int **dl_ch_magb1 = lte_ue_pdsch_vars->dl_ch_magb1; - int **rxdataF_comp0 = lte_ue_pdsch_vars->rxdataF_comp0; - int **rxdataF_comp1 = lte_ue_pdsch_vars->rxdataF_comp1[round]; //? - + + int **rxdataF_ext = pdsch_vars->rxdataF_ext; + int **dl_ch_estimates_ext = pdsch_vars->dl_ch_estimates_ext; + int **dl_ch_mag0 = pdsch_vars->dl_ch_mag0; + int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1[harq_pid][round]; + int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0; + int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1[harq_pid][round]; + int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0; + int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[harq_pid][round]; + int16_t conj[4]__attribute__((aligned(16))) = {1,-1,1,-1}; - + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - + if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { - if (frame_parms->mode1_flag==1) // 10 out of 12 so don't reduce size + if (frame_parms->nb_antenna_ports_eNB==1) // 10 out of 12 so don't reduce size { nb_rb=1+(5*nb_rb/6); } - + else { pilots=1; } } - - + + rx_power_correction=1; + if (mod_order0 == 4) { QAM_amp0_128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10) QAM_amp0_128b = vmovq_n_s16(0); - + } else if (mod_order0 == 6) { QAM_amp0_128 = vmovq_n_s16(QAM64_n1); // QAM_amp0_128b = vmovq_n_s16(QAM64_n2); } - + if (mod_order1 == 4) { QAM_amp1_128 = vmovq_n_s16(QAM16_n1); // 2/sqrt(10) QAM_amp1_128b = vmovq_n_s16(0); - + } else if (mod_order1 == 6) { QAM_amp1_128 = vmovq_n_s16(QAM64_n1); // QAM_amp1_128b = vmovq_n_s16(QAM64_n2); } - + // printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol); - + for (aarx=0; aarxnb_antennas_rx; aarx++) { - - - + + + dl_ch0_128 = (int16x4_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; dl_ch1_128 = (int16x4_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; dl_ch0_128b = (int16x8_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; @@ -2263,195 +2755,215 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, rxdataF128 = (int16x4_t*)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp0_128 = (int16x8_t*)&rxdataF_comp0[aarx][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp1_128 = (int16x8_t*)&rxdataF_comp1[aarx][symbol*frame_parms->N_RB_DL*12]; - - for (rb=0; rb%d\n",rb,pmi_ext[rb]); -#endif - prec2A_TM3_128(&dl_ch0_128b[0],&dl_ch1_128b[0]); - prec2A_TM3_128(&dl_ch0_128b[1],&dl_ch1_128b[1]); - - if (pilots==0) { - prec2A_TM3_128(&dl_ch0_128b[2],&dl_ch1_128b[2]); + for (rb=0; rb2) { - // get channel amplitude if not QPSK - mmtmpD0 = vmull_s16(dl_ch0_128[0], dl_ch0_128[0]); - // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits - mmtmpD1 = vmull_s16(dl_ch0_128[1], dl_ch0_128[1]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits - mmtmpD0 = vmull_s16(dl_ch0_128[2], dl_ch0_128[2]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch0_128[3], dl_ch0_128[3]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch0_128[4], dl_ch0_128[4]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch0_128[5], dl_ch0_128[5]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - - } - - dl_ch_mag0_128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp0_128b); - dl_ch_mag0_128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp0_128b); - dl_ch_mag0_128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp0_128); - dl_ch_mag0_128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp0_128); - - - if (pilots==0) { - dl_ch_mag0_128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp0_128b); - dl_ch_mag0_128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp0_128); - } + // get channel amplitude if not QPSK + mmtmpD0 = vmull_s16(dl_ch0_128[0], dl_ch0_128[0]); + // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits + mmtmpD1 = vmull_s16(dl_ch0_128[1], dl_ch0_128[1]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits + mmtmpD0 = vmull_s16(dl_ch0_128[2], dl_ch0_128[2]); + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + mmtmpD1 = vmull_s16(dl_ch0_128[3], dl_ch0_128[3]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + + if (pilots==0) { + mmtmpD0 = vmull_s16(dl_ch0_128[4], dl_ch0_128[4]); + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + mmtmpD1 = vmull_s16(dl_ch0_128[5], dl_ch0_128[5]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + + + } + + dl_ch_mag0_128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp0_128b); + dl_ch_mag0_128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp0_128b); + dl_ch_mag0_128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp0_128); + dl_ch_mag0_128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp0_128); + + + if (pilots==0) { + dl_ch_mag0_128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp0_128b); + dl_ch_mag0_128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp0_128); + } } if (mod_order1>2) { - // get channel amplitude if not QPSK - mmtmpD0 = vmull_s16(dl_ch1_128[0], dl_ch1_128[0]); - // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits - mmtmpD1 = vmull_s16(dl_ch1_128[1], dl_ch1_128[1]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits - mmtmpD0 = vmull_s16(dl_ch1_128[2], dl_ch1_128[2]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch1_128[3], dl_ch1_128[3]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch1_128[4], dl_ch1_128[4]); - mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); - mmtmpD1 = vmull_s16(dl_ch1_128[5], dl_ch1_128[5]); - mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); - mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - - - } - - dl_ch_mag1_128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp1_128b); - dl_ch_mag1_128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp1_128b); - dl_ch_mag1_128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp1_128); - dl_ch_mag1_128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp1_128); - - - if (pilots==0) { - dl_ch_mag1_128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp1_128b); - dl_ch_mag1_128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp1_128); - } + // get channel amplitude if not QPSK + mmtmpD0 = vmull_s16(dl_ch1_128[0], dl_ch1_128[0]); + // mmtmpD0 = [ch0*ch0,ch1*ch1,ch2*ch2,ch3*ch3]; + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + // mmtmpD0 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3]>>output_shift128 on 32-bits + mmtmpD1 = vmull_s16(dl_ch1_128[1], dl_ch1_128[1]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD2 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + // mmtmpD2 = [ch0*ch0 + ch1*ch1,ch0*ch0 + ch1*ch1,ch2*ch2 + ch3*ch3,ch2*ch2 + ch3*ch3,ch4*ch4 + ch5*ch5,ch4*ch4 + ch5*ch5,ch6*ch6 + ch7*ch7,ch6*ch6 + ch7*ch7]>>output_shift128 on 16-bits + mmtmpD0 = vmull_s16(dl_ch1_128[2], dl_ch1_128[2]); + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + mmtmpD1 = vmull_s16(dl_ch1_128[3], dl_ch1_128[3]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD3 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + + if (pilots==0) { + mmtmpD0 = vmull_s16(dl_ch1_128[4], dl_ch1_128[4]); + mmtmpD0 = vqshlq_s32(vqaddq_s32(mmtmpD0,vrev64q_s32(mmtmpD0)),output_shift128); + mmtmpD1 = vmull_s16(dl_ch1_128[5], dl_ch1_128[5]); + mmtmpD1 = vqshlq_s32(vqaddq_s32(mmtmpD1,vrev64q_s32(mmtmpD1)),output_shift128); + mmtmpD4 = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + + + } + + dl_ch_mag1_128b[0] = vqdmulhq_s16(mmtmpD2,QAM_amp1_128b); + dl_ch_mag1_128b[1] = vqdmulhq_s16(mmtmpD3,QAM_amp1_128b); + dl_ch_mag1_128[0] = vqdmulhq_s16(mmtmpD2,QAM_amp1_128); + dl_ch_mag1_128[1] = vqdmulhq_s16(mmtmpD3,QAM_amp1_128); + + + if (pilots==0) { + dl_ch_mag1_128b[2] = vqdmulhq_s16(mmtmpD4,QAM_amp1_128b); + dl_ch_mag1_128[2] = vqdmulhq_s16(mmtmpD4,QAM_amp1_128); + } } - + mmtmpD0 = vmull_s16(dl_ch0_128[0], rxdataF128[0]); - //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])] + //mmtmpD0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])] mmtmpD1 = vmull_s16(dl_ch0_128[1], rxdataF128[1]); - //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])] + //mmtmpD1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])] mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] - + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + //mmtmpD0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] + mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[0],*(int16x4_t*)conj)), rxdataF128[0]); //mmtmpD0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])] mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[1],*(int16x4_t*)conj)), rxdataF128[1]); //mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])] mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); //mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])] - + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); rxdataF_comp0_128[0] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - + mmtmpD0 = vmull_s16(dl_ch0_128[2], rxdataF128[2]); mmtmpD1 = vmull_s16(dl_ch0_128[3], rxdataF128[3]); mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[2],*(int16x4_t*)conj)), rxdataF128[2]); mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[3],*(int16x4_t*)conj)), rxdataF128[3]); mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); rxdataF_comp0_128[1] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - + // second stream mmtmpD0 = vmull_s16(dl_ch1_128[0], rxdataF128[0]); mmtmpD1 = vmull_s16(dl_ch1_128[1], rxdataF128[1]); mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[0],*(int16x4_t*)conj)), rxdataF128[0]); - + mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[1],*(int16x4_t*)conj)), rxdataF128[1]); //mmtmpD0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])] mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); //mmtmpD1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])] - + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); rxdataF_comp1_128[0] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - + mmtmpD0 = vmull_s16(dl_ch1_128[2], rxdataF128[2]); mmtmpD1 = vmull_s16(dl_ch1_128[3], rxdataF128[3]); mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[2],*(int16x4_t*)conj)), rxdataF128[2]); mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[3],*(int16x4_t*)conj)), rxdataF128[3]); mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); rxdataF_comp1_128[1] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - + if (pilots==0) { - mmtmpD0 = vmull_s16(dl_ch0_128[4], rxdataF128[4]); - mmtmpD1 = vmull_s16(dl_ch0_128[5], rxdataF128[5]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[4],*(int16x4_t*)conj)), rxdataF128[4]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[5],*(int16x4_t*)conj)), rxdataF128[5]); - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp0_128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); - mmtmpD0 = vmull_s16(dl_ch1_128[4], rxdataF128[4]); - mmtmpD1 = vmull_s16(dl_ch1_128[5], rxdataF128[5]); - mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), - vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); - - mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch1_128[4],*(int16x4_t*)conj)), rxdataF128[4]); - mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch1_128[5],*(int16x4_t*)conj)), rxdataF128[5]); - mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), - vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); - - - mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); - mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); - rxdataF_comp1_128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + mmtmpD0 = vmull_s16(dl_ch0_128[4], rxdataF128[4]); + mmtmpD1 = vmull_s16(dl_ch0_128[5], rxdataF128[5]); + mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + + mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[4],*(int16x4_t*)conj)), rxdataF128[4]); + mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch0_128[5],*(int16x4_t*)conj)), rxdataF128[5]); + mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + + + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); + mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); + rxdataF_comp0_128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); + mmtmpD0 = vmull_s16(dl_ch1_128[4], rxdataF128[4]); + mmtmpD1 = vmull_s16(dl_ch1_128[5], rxdataF128[5]); + mmtmpD0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0),vget_high_s32(mmtmpD0)), + vpadd_s32(vget_low_s32(mmtmpD1),vget_high_s32(mmtmpD1))); + + mmtmpD0b = vmull_s16(vrev32_s16(vmul_s16(dl_ch1_128[4],*(int16x4_t*)conj)), rxdataF128[4]); + mmtmpD1b = vmull_s16(vrev32_s16(vmul_s16(dl_ch1_128[5],*(int16x4_t*)conj)), rxdataF128[5]); + mmtmpD1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpD0b),vget_high_s32(mmtmpD0b)), + vpadd_s32(vget_low_s32(mmtmpD1b),vget_high_s32(mmtmpD1b))); + + + mmtmpD0 = vqshlq_s32(mmtmpD0,output_shift128); + mmtmpD1 = vqshlq_s32(mmtmpD1,output_shift128); + rxdataF_comp1_128[2] = vcombine_s16(vmovn_s32(mmtmpD0),vmovn_s32(mmtmpD1)); } } - - - + + + Nre = (pilots==0) ? 12 : 8; // rx_antennas @@ -2461,18 +2973,17 @@ void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, Nre = (pilots==0) ? 12 : 8; precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))) - (phy_measurements->n0_power[aarx])); - + (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx])); precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre], - (nb_rb*Nre))) - (phy_measurements->n0_power[aarx])); + (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx])); - - phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,phy_measurements->n0_power_tot); - phy_measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,phy_measurements->n0_power_tot); + measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,measurements->n0_power_tot); + measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,measurements->n0_power_tot); #endif } + void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms, unsigned char symbol, unsigned short nb_rb, @@ -2500,6 +3011,9 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms, for (aarx=0; aarxnb_antennas_rx; aarx++) { + + + //printf ("antenna %d", aarx); dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; if (dl_ch_estimates_ext_i == NULL) // TM3/4 @@ -2530,7 +3044,7 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms, // print_ints("c0",&mmtmpD2); // print_ints("c1",&mmtmpD3); dl_ch_rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - + // print_shorts("rho 0:",dl_ch_rho128); // multiply by conjugated channel mmtmpD0 = _mm_madd_epi16(dl_ch128[1],dl_ch128i[1]); // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) @@ -2545,7 +3059,9 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms, mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); dl_ch_rho128[1] =_mm_packs_epi32(mmtmpD2,mmtmpD3); + if (pilots==0) { + // multiply by conjugated channel mmtmpD0 = _mm_madd_epi16(dl_ch128[2],dl_ch128i[2]); // mmtmpD0 contains real part of 4 consecutive outputs (32-bit) @@ -2560,15 +3076,17 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms, mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1); dl_ch_rho128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3); - dl_ch128+=3; + dl_ch128+=3; dl_ch128i+=3; dl_ch_rho128+=3; } else { + dl_ch128+=2; dl_ch128i+=2; dl_ch_rho128+=2; } } + } _mm_empty(); @@ -2579,6 +3097,128 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms, #endif } + +/*void dlsch_dual_stream_correlationTM34(LTE_DL_FRAME_PARMS *frame_parms, + unsigned char symbol, + unsigned short nb_rb, + int **dl_ch_estimates_ext, + int **dl_ch_estimates_ext_i, + int **dl_ch_rho_ext, + unsigned char output_shift0, + unsigned char output_shift1) +{ + +#if defined(__x86_64__)||defined(__i386__) + + unsigned short rb; + __m128i *dl_ch128,*dl_ch128i,*dl_ch_rho128,mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3; + unsigned char aarx,symbol_mod,pilots=0; + int output_shift; + + // printf("dlsch_dual_stream_correlation: symbol %d\n",symbol); + + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + + if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { + pilots=1; + } + + // printf("Dual stream correlation (%p)\n",dl_ch_estimates_ext_i); + + for (aarx=0; aarxnb_antennas_rx; aarx++) { + + if (aarx==0) { + output_shift=output_shift0; + } + else { + output_shift=output_shift1; + } + + //printf ("antenna %d", aarx); + dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; + + if (dl_ch_estimates_ext_i == NULL) // TM3/4 + dl_ch128i = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; + else + dl_ch128i = (__m128i *)&dl_ch_estimates_ext_i[aarx][symbol*frame_parms->N_RB_DL*12]; + + dl_ch_rho128 = (__m128i *)&dl_ch_rho_ext[aarx][symbol*frame_parms->N_RB_DL*12]; + + + for (rb=0; rbnb_antennas_rx>1) { - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) { + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) { rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[(aatx<<1)][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12]; @@ -2612,20 +3252,24 @@ void dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms, dl_ch_mag128_1b = (__m128i *)&dl_ch_magb[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12]; // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation) - for (i=0; iN_RB_DL*12]; rho128_1 = (__m128i *) &rho[1][symbol*frame_parms->N_RB_DL*12]; - - for (i=0; inb_antennas_rx>1) { - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) { + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) { rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[(aatx<<1)][symbol*frame_parms->N_RB_DL*12]; rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[(aatx<<1)+1][symbol*frame_parms->N_RB_DL*12]; @@ -2715,6 +3359,87 @@ void dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms, #endif } + +void dlsch_detection_mrc_TM34(LTE_DL_FRAME_PARMS *frame_parms, + LTE_UE_PDSCH *pdsch_vars, + int harq_pid, + int round, + unsigned char symbol, + unsigned short nb_rb, + unsigned char dual_stream_UE) { + + int i; + __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*rxdataF_comp128_i0,*rxdataF_comp128_i1,*dl_ch_mag128_0,*dl_ch_mag128_1,*dl_ch_mag128_0b,*dl_ch_mag128_1b,*rho128_0,*rho128_1,*rho128_i0,*rho128_i1,*dl_ch_mag128_i0,*dl_ch_mag128_i1,*dl_ch_mag128_i0b,*dl_ch_mag128_i1b; + + int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0; + int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[harq_pid][round]; + int **dl_ch_rho_ext = pdsch_vars->dl_ch_rho_ext[harq_pid][round]; //for second stream + int **dl_ch_rho2_ext = pdsch_vars->dl_ch_rho2_ext; + int **dl_ch_mag0 = pdsch_vars->dl_ch_mag0; + int **dl_ch_mag1 = pdsch_vars->dl_ch_mag1[harq_pid][round]; + int **dl_ch_magb0 = pdsch_vars->dl_ch_magb0; + int **dl_ch_magb1 = pdsch_vars->dl_ch_magb1[harq_pid][round]; + + if (frame_parms->nb_antennas_rx>1) { + + rxdataF_comp128_0 = (__m128i *)&rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12]; + rxdataF_comp128_1 = (__m128i *)&rxdataF_comp0[1][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag128_0 = (__m128i *)&dl_ch_mag0[0][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag128_1 = (__m128i *)&dl_ch_mag0[1][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag128_0b = (__m128i *)&dl_ch_magb0[0][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag128_1b = (__m128i *)&dl_ch_magb0[1][symbol*frame_parms->N_RB_DL*12]; + + // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation) + for (i=0;iN_RB_DL*12]; + rho128_1 = (__m128i *) &dl_ch_rho2_ext[1][symbol*frame_parms->N_RB_DL*12]; + for (i=0;iN_RB_DL*12]; + rho128_i1 = (__m128i *) &dl_ch_rho_ext[1][symbol*frame_parms->N_RB_DL*12]; + rxdataF_comp128_i0 = (__m128i *)&rxdataF_comp1[0][symbol*frame_parms->N_RB_DL*12]; + rxdataF_comp128_i1 = (__m128i *)&rxdataF_comp1[1][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag128_i0 = (__m128i *)&dl_ch_mag1[0][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag128_i1 = (__m128i *)&dl_ch_mag1[1][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag128_i0b = (__m128i *)&dl_ch_magb1[0][symbol*frame_parms->N_RB_DL*12]; + dl_ch_mag128_i1b = (__m128i *)&dl_ch_magb1[1][symbol*frame_parms->N_RB_DL*12]; + for (i=0;i=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { - if (frame_parms->mode1_flag==1) // 10 out of 12 so don't reduce size + if (frame_parms->nb_antenna_ports_eNB==1) // 10 out of 12 so don't reduce size nb_rb=1+(5*nb_rb/6); else pilots=1; } // Determine scaling amplitude based the symbol - ch_amp = ((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a)); - // LOG_D(PHY,"Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp); + ch_amp = ((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a)); + + LOG_D(PHY,"Scaling PDSCH Chest in OFDM symbol %d by %d, pilots %d nb_rb %d NCP %d symbol %d\n",symbol_mod,ch_amp,pilots,nb_rb,frame_parms->Ncp,symbol); + // printf("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp); ch_amp128 = _mm_set1_epi16(ch_amp); // Q3.13 - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) { + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12]; - for (rb=0; rb=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) + nre=8; + else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1)) + nre=10; + else + nre=12; + + //nb_rb*nre = y * 2^x + int16_t x = factor2(nb_rb*nre); + int16_t y = (nb_rb*nre)>>x; + //printf("nb_rb*nre = %d = %d * 2^(%d)\n",nb_rb*nre,y,x); + + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) for (aarx=0; aarxnb_antennas_rx; aarx++) { //clear average level avg128D = _mm_setzero_si128(); @@ -2796,19 +3538,23 @@ void dlsch_channel_level(int **dl_ch_estimates_ext, dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12]; - for (rb=0; rbNcp-1)))&&(frame_parms->mode1_flag==0)) { + //avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[0],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[0], coeff128),15))); + //avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[1],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[1], coeff128),15))); + + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { dl_ch128+=2; - } else { - avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[2],dl_ch128[2])); + } + else { + avg128D = _mm_add_epi32(avg128D,_mm_srai_epi16(_mm_madd_epi16(dl_ch128[2],dl_ch128[2]),x)); + //avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[2],_mm_srai_epi16(_mm_mulhi_epi16(dl_ch128[2], coeff128),15))); dl_ch128+=3; } - /* if (rb==0) { print_shorts("dl_ch128",&dl_ch128[0]); @@ -2818,19 +3564,11 @@ void dlsch_channel_level(int **dl_ch_estimates_ext, */ } - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) - nre=8; - else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==1)) - nre=10; - else - nre=12; - - avg[(aatx<<1)+aarx] = (((int*)&avg128D)[0] + - ((int*)&avg128D)[1] + - ((int*)&avg128D)[2] + - ((int*)&avg128D)[3])/(nb_rb*nre); - - // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]); + avg[(aatx<<1)+aarx] =(((int32_t*)&avg128D)[0] + + ((int32_t*)&avg128D)[1] + + ((int32_t*)&avg128D)[2] + + ((int32_t*)&avg128D)[3])/y; + // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]); } _mm_empty(); @@ -2845,7 +3583,7 @@ void dlsch_channel_level(int **dl_ch_estimates_ext, symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - for (aatx=0; aatxnb_antennas_tx_eNB; aatx++) + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) for (aarx=0; aarxnb_antennas_rx; aarx++) { //clear average level avg128D = vdupq_n_s32(0); @@ -2861,7 +3599,7 @@ void dlsch_channel_level(int **dl_ch_estimates_ext, avg128D = vqaddq_s32(avg128D,vmull_s16(dl_ch128[2],dl_ch128[2])); avg128D = vqaddq_s32(avg128D,vmull_s16(dl_ch128[3],dl_ch128[3])); - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) { + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { dl_ch128+=4; } else { avg128D = vqaddq_s32(avg128D,vmull_s16(dl_ch128[4],dl_ch128[4])); @@ -2878,9 +3616,10 @@ void dlsch_channel_level(int **dl_ch_estimates_ext, */ } - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) + + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) nre=8; - else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==1)) + else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1)) nre=10; else nre=12; @@ -2898,14 +3637,156 @@ void dlsch_channel_level(int **dl_ch_estimates_ext, } //compute average channel_level of effective (precoded) channel -void dlsch_channel_level_TM3(int **dl_ch_estimates_ext, - LTE_DL_FRAME_PARMS *frame_parms, - int *avg, - uint8_t symbol, - unsigned short nb_rb) -{ + +//compute average channel_level of effective (precoded) channel +void dlsch_channel_level_TM34(int **dl_ch_estimates_ext, + LTE_DL_FRAME_PARMS *frame_parms, + unsigned char *pmi_ext, + int *avg_0, + int *avg_1, + uint8_t symbol, + unsigned short nb_rb, + MIMO_mode_t mimo_mode){ + #if defined(__x86_64__)||defined(__i386__) + + short rb; + unsigned char aarx,nre=12,symbol_mod; + __m128i *dl_ch0_128,*dl_ch1_128, dl_ch0_128_tmp, dl_ch1_128_tmp, avg_0_128D, avg_1_128D; + + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + + //clear average level + // avg_0_128D = _mm_setzero_si128(); + // avg_1_128D = _mm_setzero_si128(); + avg_0[0] = 0; + avg_0[1] = 0; + avg_1[0] = 0; + avg_1[1] = 0; + // 5 is always a symbol with no pilots for both normal and extended prefix + + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) + nre=8; + else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1)) + nre=10; + else + nre=12; + + for (aarx=0; aarxnb_antennas_rx; aarx++) { + dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12]; + dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12]; + + avg_0_128D = _mm_setzero_si128(); + avg_1_128D = _mm_setzero_si128(); + for (rb=0; rbNcp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { + dl_ch0_128+=2; + dl_ch1_128+=2; + } + else { + dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]); + dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]); + + if (mimo_mode==LARGE_CDD) + prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); + else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) + prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp); + else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) + prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp); + else if (mimo_mode==DUALSTREAM_PUSCH_PRECODING) + prec2A_TM4_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp); + // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); + + avg_1_128D = _mm_add_epi32(avg_1_128D,_mm_madd_epi16(dl_ch1_128_tmp,dl_ch1_128_tmp)); + avg_0_128D = _mm_add_epi32(avg_0_128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); + + dl_ch0_128+=3; + dl_ch1_128+=3; + } + } + + + avg_0[aarx] = (((int*)&avg_0_128D)[0])/(nb_rb*nre) + + (((int*)&avg_0_128D)[1])/(nb_rb*nre) + + (((int*)&avg_0_128D)[2])/(nb_rb*nre) + + (((int*)&avg_0_128D)[3])/(nb_rb*nre); + // printf("From Chan_level aver stream 0 %d =%d\n", aarx, avg_0[aarx]); + + avg_1[aarx] = (((int*)&avg_1_128D)[0])/(nb_rb*nre) + + (((int*)&avg_1_128D)[1])/(nb_rb*nre) + + (((int*)&avg_1_128D)[2])/(nb_rb*nre) + + (((int*)&avg_1_128D)[3])/(nb_rb*nre); + // printf("From Chan_level aver stream 1 %d =%d\n", aarx, avg_1[aarx]); + } +//avg_0[0] = max(avg_0[0],avg_0[1]); +//avg_1[0] = max(avg_1[0],avg_1[1]); +//avg_0[0]= max(avg_0[0], avg_1[0]); + + avg_0[0] = avg_0[0] + avg_0[1]; + // printf("From Chan_level aver stream 0 final =%d\n", avg_0[0]); + avg_1[0] = avg_1[0] + avg_1[1]; + // printf("From Chan_level aver stream 1 final =%d\n", avg_1[0]); + avg_0[0] = min (avg_0[0], avg_1[0]); + avg_1[0] = avg_0[0]; + + _mm_empty(); + _m_empty(); + +#elif defined(__arm__) + +#endif +} + + + +/*void dlsch_channel_level_TM34(int **dl_ch_estimates_ext, + LTE_DL_FRAME_PARMS *frame_parms, + int *avg, + uint8_t symbol, + unsigned short nb_rb, + MIMO_mode_t mimo_mode){ + +#if defined(__x86_64__)||defined(__i386__) + + short rb; unsigned char aarx,nre=12,symbol_mod; __m128i *dl_ch0_128,*dl_ch1_128, dl_ch0_128_tmp, dl_ch1_128_tmp,avg128D; @@ -2918,9 +3799,9 @@ void dlsch_channel_level_TM3(int **dl_ch_estimates_ext, avg[1] = 0; // 5 is always a symbol with no pilots for both normal and extended prefix - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) nre=8; - else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==1)) + else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1)) nre=10; else nre=12; @@ -2934,26 +3815,45 @@ void dlsch_channel_level_TM3(int **dl_ch_estimates_ext, dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[0]); dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[0]); - prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); + if (mimo_mode==LARGE_CDD) + prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); + else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) + prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp); + else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) + prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp); + // mmtmpD0 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[1]); dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[1]); - prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); + if (mimo_mode==LARGE_CDD) + prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); + else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) + prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp); + else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) + prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp); + // mmtmpD1 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) { + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { dl_ch0_128+=2; dl_ch1_128+=2; - } else { + } + else { dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]); dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]); - prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); - // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); + if (mimo_mode==LARGE_CDD) + prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp); + else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODING1) + prec2A_TM4_128(0,&dl_ch0_128_tmp,&dl_ch1_128_tmp); + else if (mimo_mode==DUALSTREAM_UNIFORM_PRECODINGj) + prec2A_TM4_128(1,&dl_ch0_128_tmp,&dl_ch1_128_tmp); + + // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); dl_ch0_128+=3; @@ -2976,7 +3876,7 @@ void dlsch_channel_level_TM3(int **dl_ch_estimates_ext, #elif defined(__arm__) #endif -} +}*/ //compute average channel_level of effective (precoded) channel void dlsch_channel_level_TM56(int **dl_ch_estimates_ext, @@ -3001,9 +3901,9 @@ void dlsch_channel_level_TM56(int **dl_ch_estimates_ext, avg[1] = 0; // 5 is always a symbol with no pilots for both normal and extended prefix - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) nre=8; - else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==1)) + else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB==1)) nre=10; else nre=12; @@ -3028,15 +3928,16 @@ void dlsch_channel_level_TM56(int **dl_ch_estimates_ext, // mmtmpD1 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); - if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) { + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { dl_ch0_128+=2; dl_ch1_128+=2; - } else { + } + else { dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]); dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]); prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp); - // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); + // mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp); avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp)); dl_ch0_128+=3; @@ -3062,7 +3963,77 @@ void dlsch_channel_level_TM56(int **dl_ch_estimates_ext, #endif } +//compute average channel_level for TM7 +void dlsch_channel_level_TM7(int **dl_bf_ch_estimates_ext, + LTE_DL_FRAME_PARMS *frame_parms, + int *avg, + uint8_t symbol, + unsigned short nb_rb) +{ +#if defined(__x86_64__)||defined(__i386__) + + short rb; + unsigned char aatx,aarx,nre=12,symbol_mod; + __m128i *dl_ch128,avg128D; + + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + + for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) + for (aarx=0; aarxnb_antennas_rx; aarx++) { + //clear average level + avg128D = _mm_setzero_si128(); + // 5 is always a symbol with no pilots for both normal and extended prefix + + dl_ch128=(__m128i *)&dl_bf_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12]; + + for (rb=0; rbNcp-1)))&&(frame_parms->nb_antenna_ports_eNB!=1)) { + dl_ch128+=2; + } else { + avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128[2],dl_ch128[2])); + dl_ch128+=3; + } + + /* + if (rb==0) { + print_shorts("dl_ch128",&dl_ch128[0]); + print_shorts("dl_ch128",&dl_ch128[1]); + print_shorts("dl_ch128",&dl_ch128[2]); + } + */ + } + + if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))) + nre=10; + else if ((frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)) + nre=9; + else if ((frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==9)) + nre=8; + else + nre=12; + + avg[(aatx<<1)+aarx] = (((int*)&avg128D)[0] + + ((int*)&avg128D)[1] + + ((int*)&avg128D)[2] + + ((int*)&avg128D)[3])/(nb_rb*nre); + + // printf("Channel level : %d\n",avg[(aatx<<1)+aarx]); + } + + _mm_empty(); + _m_empty(); + +#elif defined(__arm__) + +#endif +} +//#define ONE_OVER_2_Q15 16384 void dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms, int **rxdataF_comp, int **dl_ch_mag, @@ -3074,14 +4045,15 @@ void dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms, #if defined(__x86_64__)||defined(__i386__) short *rxF0,*rxF1; - __m128i *ch_mag0,*ch_mag1,*ch_mag0b,*ch_mag1b, amp, *rxF0_128; + __m128i *ch_mag0,*ch_mag1,*ch_mag0b,*ch_mag1b, *rxF0_128; unsigned char rb,re; int jj = (symbol*frame_parms->N_RB_DL*12); uint8_t symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; uint8_t pilots = ((symbol_mod==0)||(symbol_mod==(4-frame_parms->Ncp))) ? 1 : 0; rxF0_128 = (__m128i*) &rxdataF_comp[0][jj]; - amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15); + //amp = _mm_set1_epi16(ONE_OVER_2_Q15); + // printf("Doing alamouti!\n"); rxF0 = (short*)&rxdataF_comp[0][jj]; //tx antenna 0 h0*y @@ -3090,7 +4062,7 @@ void dlsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms, ch_mag1 = (__m128i *)&dl_ch_mag[2][jj]; ch_mag0b = (__m128i *)&dl_ch_magb[0][jj]; ch_mag1b = (__m128i *)&dl_ch_magb[2][jj]; - + for (rb=0; rbfirst_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))]; if ((frame_parms->N_RB_DL&1) == 0) // even number of RBs - for (rb=0; rbN_RB_DL; rb++) { + + for (rb=0;rbN_RB_DL;rb++) { if (rb < 32) rb_alloc_ind = (rb_alloc[0]>>rb) & 1; @@ -3230,7 +4211,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, else rb_alloc_ind = 0; - if (rb_alloc_ind == 1) + if (rb_alloc_ind == 1) nb_rb++; // For second half of RBs skip DC carrier @@ -3269,17 +4250,17 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); /* - printf("rb %d\n",rb); - for (i=0;i<12;i++) - printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]); - printf("\n"); + printf("rb %d\n",rb); + for (i=0;i<12;i++) + printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]); + printf("\n"); */ if (pilots==0) { for (i=0; i<12; i++) { rxF_ext[i]=rxF[i]; /* - printf("%d : (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]), - ((short*)&rxF[i])[0],((short*)&rxF[i])[1]);*/ + printf("%d : (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]), + ((short*)&rxF[i])[0],((short*)&rxF[i])[1]);*/ } dl_ch0_ext+=12; @@ -3311,7 +4292,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, else { // Odd number of RBs for (rb=0; rbN_RB_DL>>1; rb++) { #ifdef DEBUG_DLSCH_DEMOD - printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); + printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); #endif skip_half=0; @@ -3326,8 +4307,9 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, else rb_alloc_ind = 0; - if (rb_alloc_ind == 1) - nb_rb++; + if (rb_alloc_ind == 1) + nb_rb++; + // PBCH if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) { @@ -3348,7 +4330,6 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, (l==sss_symb) ) { rb_alloc_ind = 0; } - //SSS if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && @@ -3361,10 +4342,11 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, //PSS in subframe 0/5 if FDD if (frame_parms->frame_type == FDD) { //FDD - if (((subframe==0)||(subframe==5)) && - (rb>((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb) ) { + + if (((subframe==0)||(subframe==5)) && + (rb>((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l==pss_symb) ) { rb_alloc_ind = 0; } @@ -3375,11 +4357,10 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, } if ((frame_parms->frame_type == TDD) && - (subframe==6)) { //TDD Subframe 6 + (subframe==6)){ //TDD Subframe 6 if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; } - if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) skip_half=1; else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) @@ -3388,20 +4369,21 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, if (rb_alloc_ind==1) { + #ifdef DEBUG_DLSCH_DEMOD - printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); + printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); #endif if (pilots==0) { - // printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); + // printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); if (skip_half==1) { memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); for (i=0; i<6; i++) { - rxF_ext[i]=rxF[i]; + rxF_ext[i]=rxF[i]; #ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); #endif - } + } dl_ch0_ext+=6; rxF_ext+=6; } else if (skip_half==2) { @@ -3410,9 +4392,9 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, for (i=0; i<6; i++) { rxF_ext[i]=rxF[(i+6)]; #ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); #endif - } + } dl_ch0_ext+=6; rxF_ext+=6; } else { @@ -3423,12 +4405,12 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, #ifdef DEBUG_DLSCH_DEMOD printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); #endif - } + } dl_ch0_ext+=12; rxF_ext+=12; } } else { - // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); + // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); j=0; if (skip_half==1) { @@ -3441,14 +4423,14 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, dl_ch0_ext[j++]=dl_ch0[i]; } } - rxF_ext+=5; + rxF_ext+=5; dl_ch0_ext+=5; } else if (skip_half==2) { for (i=0; i<6; i++) { if (i!=((frame_parms->nushift+poffset)%6)) { rxF_ext[j]=rxF[(i+6)]; #ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); #endif dl_ch0_ext[j++]=dl_ch0[i+6]; } @@ -3462,7 +4444,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, (i!=((frame_parms->nushift+poffset+6)%12))) { rxF_ext[j]=rxF[i]; #ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); #endif dl_ch0_ext[j++]=dl_ch0[i]; @@ -3474,7 +4456,6 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, } } } - dl_ch0+=12; rxF+=12; } // first half loop @@ -3494,12 +4475,13 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, if (rb_alloc_ind == 1) - nb_rb++; + nb_rb++; // PBCH - if ((subframe==0) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) { + + if ((subframe==0) && + (l>=(nsymb>>1)) && + (l<((nsymb>>1) + 4))) { rb_alloc_ind = 0; } @@ -3518,16 +4500,16 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, //PSS if ((frame_parms->frame_type == TDD) && (subframe==6) && - (l==pss_symb) ) { - rb_alloc_ind = 0; + (l==pss_symb) ) { + rb_alloc_ind = 0; } - + // printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); // printf("DC rb %d (%p)\n",rb,rxF); if (rb_alloc_ind==1) { #ifdef DEBUG_DLSCH_DEMOD - printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); + printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); #endif if (pilots==0) { for (i=0; i<6; i++) { @@ -3565,14 +4547,13 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, rxF_ext[j++]=rxF[(1+i-6)]; #ifdef DEBUG_DLSCH_DEMOD printf("**extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1])); -#endif +#endif } } dl_ch0_ext+=10; rxF_ext+=10; } // symbol_mod==0 - } // rballoc==1 else { rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; @@ -3582,9 +4563,9 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, rxF+=7; rb++; - for (; rbN_RB_DL; rb++) { - // printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); - // printf("rb %d (%p)\n",rb,rxF); + for (;rbN_RB_DL;rb++) { + // printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); + // printf("rb %d (%p)\n",rb,rxF); skip_half=0; if (rb < 32) @@ -3598,14 +4579,13 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, else rb_alloc_ind = 0; - if (rb_alloc_ind == 1) - nb_rb++; + if (rb_alloc_ind == 1) + nb_rb++; // PBCH if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) { rb_alloc_ind = 0; } - //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) skip_half=1; @@ -3616,13 +4596,11 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { rb_alloc_ind = 0; } - //SSS if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==sss_symb)) skip_half=1; else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb)) skip_half=2; - if (frame_parms->frame_type == FDD) { //PSS if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { @@ -3630,6 +4608,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, } //PSS + if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) skip_half=1; else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) @@ -3637,6 +4616,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, } if ((frame_parms->frame_type == TDD) && + (subframe==6)) { //TDD Subframe 6 if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { rb_alloc_ind = 0; @@ -3649,26 +4629,26 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, } if (rb_alloc_ind==1) { -#ifdef DEBUG_DLSCH_DEMOD - printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); +#ifdef DEBUG_DLSCH_DEMOD + printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); #endif /* - printf("rb %d\n",rb); + printf("rb %d\n",rb); for (i=0;i<12;i++) printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]); printf("\n"); */ if (pilots==0) { - // printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); + // printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); if (skip_half==1) { memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); for (i=0; i<6; i++) { rxF_ext[i]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); #endif - } + } dl_ch0_ext+=6; rxF_ext+=6; @@ -3678,9 +4658,9 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, for (i=0; i<6; i++) { rxF_ext[i]=rxF[(i+6)]; #ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); #endif - } + } dl_ch0_ext+=6; rxF_ext+=6; @@ -3690,14 +4670,14 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, for (i=0; i<12; i++) { rxF_ext[i]=rxF[i]; #ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); #endif - } + } dl_ch0_ext+=12; rxF_ext+=12; } } else { - // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); + // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); j=0; if (skip_half==1) { @@ -3705,7 +4685,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, if (i!=((frame_parms->nushift+poffset)%6)) { rxF_ext[j]=rxF[i]; #ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); #endif dl_ch0_ext[j++]=dl_ch0[i]; } @@ -3718,7 +4698,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, if (i!=((frame_parms->nushift+poffset)%6)) { rxF_ext[j]=rxF[(i+6)]; #ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); #endif dl_ch0_ext[j++]=dl_ch0[i+6]; } @@ -3732,12 +4712,11 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, (i!=((frame_parms->nushift+poffset+6)%12))) { rxF_ext[j]=rxF[i]; #ifdef DEBUG_DLSCH_DEMOD - printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); #endif dl_ch0_ext[j++]=dl_ch0[i]; } } - dl_ch0_ext+=10; rxF_ext+=10; } @@ -3749,7 +4728,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF, } } } - + return(nb_rb/frame_parms->nb_antennas_rx); } @@ -3764,9 +4743,8 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, unsigned char symbol, unsigned char subframe, uint32_t high_speed_flag, - LTE_DL_FRAME_PARMS *frame_parms) -{ - + LTE_DL_FRAME_PARMS *frame_parms, + MIMO_mode_t mimo_mode) { int prb,nb_rb=0; int prb_off,prb_off2; @@ -3804,7 +4782,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, } pmi_loc = pmi_ext; - + // pointers to extracted RX signals and channel estimates rxF_ext = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; @@ -3812,95 +4790,102 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, for (prb=0; prbN_RB_DL; prb++) { skip_half=0; - + if (prb < 32) - rb_alloc_ind = (rb_alloc[0]>>prb) & 1; + rb_alloc_ind = (rb_alloc[0]>>prb) & 1; else if (prb < 64) - rb_alloc_ind = (rb_alloc[1]>>(prb-32)) & 1; + rb_alloc_ind = (rb_alloc[1]>>(prb-32)) & 1; else if (prb < 96) - rb_alloc_ind = (rb_alloc[2]>>(prb-64)) & 1; + rb_alloc_ind = (rb_alloc[2]>>(prb-64)) & 1; else if (prb < 100) - rb_alloc_ind = (rb_alloc[3]>>(prb-96)) & 1; + rb_alloc_ind = (rb_alloc[3]>>(prb-96)) & 1; else - rb_alloc_ind = 0; + rb_alloc_ind = 0; if (rb_alloc_ind == 1) nb_rb++; - + if ((frame_parms->N_RB_DL&1) == 0) { // even number of RBs - // PBCH - if ((subframe==0) && - (prb>=((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb); - } - - //SSS - - if (((subframe==0)||(subframe==5)) && - (prb>=((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==sss_symb) ) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb); - } - - - - //PSS in subframe 0/5 if FDD - if (frame_parms->frame_type == FDD) { //FDD - if (((subframe==0)||(subframe==5)) && - (prb>=((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb) ) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb); - } - } - - if ((frame_parms->frame_type == TDD) && - (subframe==6)) { //TDD Subframe 6 - if ((prb>=((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } - - if (rb_alloc_ind==1) { // PRB is allocated + // PBCH + if ((subframe==0) && + (prb>=((frame_parms->N_RB_DL>>1)-3)) && + (prb<((frame_parms->N_RB_DL>>1)+3)) && + (l>=(nsymb>>1)) && + (l<((nsymb>>1) + 4))) { + rb_alloc_ind = 0; + // printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb); + } + + //SSS + + if (((subframe==0)||(subframe==5)) && + (prb>=((frame_parms->N_RB_DL>>1)-3)) && + (prb<((frame_parms->N_RB_DL>>1)+3)) && + (l==sss_symb) ) { + rb_alloc_ind = 0; + // printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb); + } - - prb_off = 12*prb; - prb_off2 = 1+(12*(prb-(frame_parms->N_RB_DL>>1))); - dl_ch0p = dl_ch0+(12*prb); - dl_ch1p = dl_ch1+(12*prb); - if (prb<(frame_parms->N_RB_DL>>1)){ - rxF = &rxdataF[aarx][prb_off+ - frame_parms->first_carrier_offset + - (symbol*(frame_parms->ofdm_symbol_size))]; - } - else { - rxF = &rxdataF[aarx][prb_off2+ - (symbol*(frame_parms->ofdm_symbol_size))]; - } + + //PSS in subframe 0/5 if FDD + if (frame_parms->frame_type == FDD) { //FDD + if (((subframe==0)||(subframe==5)) && + (prb>=((frame_parms->N_RB_DL>>1)-3)) && + (prb<((frame_parms->N_RB_DL>>1)+3)) && + (l==pss_symb) ) { + rb_alloc_ind = 0; + // printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb); + } + } + + if ((frame_parms->frame_type == TDD) && + (subframe==6)) { //TDD Subframe 6 + if ((prb>=((frame_parms->N_RB_DL>>1)-3)) && + (prb<((frame_parms->N_RB_DL>>1)+3)) && + (l==pss_symb) ) { + rb_alloc_ind = 0; + } + } + + if (rb_alloc_ind==1) { // PRB is allocated + + + + prb_off = 12*prb; + prb_off2 = 1+(12*(prb-(frame_parms->N_RB_DL>>1))); + dl_ch0p = dl_ch0+(12*prb); + dl_ch1p = dl_ch1+(12*prb); + if (prb<(frame_parms->N_RB_DL>>1)){ + rxF = &rxdataF[aarx][prb_off+ + frame_parms->first_carrier_offset + + (symbol*(frame_parms->ofdm_symbol_size))]; + } + else { + rxF = &rxdataF[aarx][prb_off2+ + (symbol*(frame_parms->ofdm_symbol_size))]; + } + + /* + if (mimo_mode <= PUSCH_PRECODING1) *pmi_loc = (pmi>>((prb>>2)<<1))&3; + else + *pmi_loc=(pmi>>prb)&1;*/ + + *pmi_loc = get_pmi(frame_parms->N_RB_DL,mimo_mode,pmi,prb); pmi_loc++; - - + + if (pilots == 0) { - + memcpy(dl_ch0_ext,dl_ch0p,12*sizeof(int)); memcpy(dl_ch1_ext,dl_ch1p,12*sizeof(int)); memcpy(rxF_ext,rxF,12*sizeof(int)); - dl_ch0_ext +=12; - dl_ch1_ext +=12; - rxF_ext +=12; + dl_ch0_ext +=12; + dl_ch1_ext +=12; + rxF_ext +=12; } else { // pilots==1 j=0; for (i=0; i<12; i++) { @@ -3914,359 +4899,1219 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF, dl_ch1_ext[j++]=dl_ch1p[i]; } } - dl_ch0_ext+=8; - dl_ch1_ext+=8; - rxF_ext+=8; + dl_ch0_ext+=8; + dl_ch1_ext+=8; + rxF_ext+=8; } // pilots==1 - } + } } else { // Odd number of RBs // PBCH - if ((subframe==0) && - (prb>((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb); - } - - //SSS - - if (((subframe==0)||(subframe==5)) && - (prb>((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==sss_symb) ) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb); - } - - - - //PSS in subframe 0/5 if FDD - if (frame_parms->frame_type == FDD) { //FDD - if (((subframe==0)||(subframe==5)) && - (prb>((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb) ) { - rb_alloc_ind = 0; - // printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb); - } - } - - if ((frame_parms->frame_type == TDD) && - ((subframe==1) || (subframe==6))) { //TDD Subframe 1-6 - if ((prb>((frame_parms->N_RB_DL>>1)-3)) && - (prb<((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb) ) { - rb_alloc_ind = 0; - } - } + if ((subframe==0) && + (prb>((frame_parms->N_RB_DL>>1)-3)) && + (prb<((frame_parms->N_RB_DL>>1)+3)) && + (l>=(nsymb>>1)) && + (l<((nsymb>>1) + 4))) { + rb_alloc_ind = 0; + // printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb); + } - if (rb_alloc_ind == 1) { - skip_half=0; - - //Check if we have to drop half a PRB due to PSS/SSS/PBCH - // skip_half == 0 means full PRB - // skip_half == 1 means first half is used (leftmost half-PRB from PSS/SSS/PBCH) - // skip_half == 2 means second half is used (rightmost half-PRB from PSS/SSS/PBCH) - //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 - if ((subframe==0) && - (prb==((frame_parms->N_RB_DL>>1)-3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) - skip_half=1; - else if ((subframe==0) && - (prb==((frame_parms->N_RB_DL>>1)+3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) - skip_half=2; - - //SSS - if (((subframe==0)||(subframe==5)) && - (prb==((frame_parms->N_RB_DL>>1)-3)) && - (l==sss_symb)) - skip_half=1; - else if (((subframe==0)||(subframe==5)) && - (prb==((frame_parms->N_RB_DL>>1)+3)) && - (l==sss_symb)) - skip_half=2; - - //PSS Subframe 0,5 - if (((frame_parms->frame_type == FDD) && - (((subframe==0)||(subframe==5)))) || //FDD Subframes 0,5 - ((frame_parms->frame_type == TDD) && - (((subframe==1) || (subframe==6))))) { //TDD Subframes 1,6 - - if ((prb==((frame_parms->N_RB_DL>>1)-3)) && - (l==pss_symb)) - skip_half=1; - else if ((prb==((frame_parms->N_RB_DL>>1)+3)) && - (l==pss_symb)) - skip_half=2; - } - - - prb_off = 12*prb; - prb_off2 = 7+(12*(prb-(frame_parms->N_RB_DL>>1)-1)); - dl_ch0p = dl_ch0+(12*prb); - dl_ch1p = dl_ch1+(12*prb); - - if (prb<=(frame_parms->N_RB_DL>>1)){ - rxF = &rxdataF[aarx][prb_off+ - frame_parms->first_carrier_offset + - (symbol*(frame_parms->ofdm_symbol_size))]; - } - else { - rxF = &rxdataF[aarx][prb_off2+ - (symbol*(frame_parms->ofdm_symbol_size))]; - } + //SSS + + if (((subframe==0)||(subframe==5)) && + (prb>((frame_parms->N_RB_DL>>1)-3)) && + (prb<((frame_parms->N_RB_DL>>1)+3)) && + (l==sss_symb) ) { + rb_alloc_ind = 0; + // printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb); + } + + + + //PSS in subframe 0/5 if FDD + if (frame_parms->frame_type == FDD) { //FDD + if (((subframe==0)||(subframe==5)) && + (prb>((frame_parms->N_RB_DL>>1)-3)) && + (prb<((frame_parms->N_RB_DL>>1)+3)) && + (l==pss_symb) ) { + rb_alloc_ind = 0; + // printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb); + } + } + + if ((frame_parms->frame_type == TDD) && + ((subframe==1) || (subframe==6))) { //TDD Subframe 1-6 + if ((prb>((frame_parms->N_RB_DL>>1)-3)) && + (prb<((frame_parms->N_RB_DL>>1)+3)) && + (l==pss_symb) ) { + rb_alloc_ind = 0; + } + } + + if (rb_alloc_ind == 1) { + skip_half=0; + + //Check if we have to drop half a PRB due to PSS/SSS/PBCH + // skip_half == 0 means full PRB + // skip_half == 1 means first half is used (leftmost half-PRB from PSS/SSS/PBCH) + // skip_half == 2 means second half is used (rightmost half-PRB from PSS/SSS/PBCH) + //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 + if ((subframe==0) && + (prb==((frame_parms->N_RB_DL>>1)-3)) && + (l>=(nsymb>>1)) && + (l<((nsymb>>1) + 4))) + skip_half=1; + else if ((subframe==0) && + (prb==((frame_parms->N_RB_DL>>1)+3)) && + (l>=(nsymb>>1)) && + (l<((nsymb>>1) + 4))) + skip_half=2; + + //SSS + if (((subframe==0)||(subframe==5)) && + (prb==((frame_parms->N_RB_DL>>1)-3)) && + (l==sss_symb)) + skip_half=1; + else if (((subframe==0)||(subframe==5)) && + (prb==((frame_parms->N_RB_DL>>1)+3)) && + (l==sss_symb)) + skip_half=2; + + //PSS Subframe 0,5 + if (((frame_parms->frame_type == FDD) && + (((subframe==0)||(subframe==5)))) || //FDD Subframes 0,5 + ((frame_parms->frame_type == TDD) && + (((subframe==1) || (subframe==6))))) { //TDD Subframes 1,6 + + if ((prb==((frame_parms->N_RB_DL>>1)-3)) && + (l==pss_symb)) + skip_half=1; + else if ((prb==((frame_parms->N_RB_DL>>1)+3)) && + (l==pss_symb)) + skip_half=2; + } + + + prb_off = 12*prb; + prb_off2 = 7+(12*(prb-(frame_parms->N_RB_DL>>1)-1)); + dl_ch0p = dl_ch0+(12*prb); + dl_ch1p = dl_ch1+(12*prb); + + if (prb<=(frame_parms->N_RB_DL>>1)){ + rxF = &rxdataF[aarx][prb_off+ + frame_parms->first_carrier_offset + + (symbol*(frame_parms->ofdm_symbol_size))]; + } + else { + rxF = &rxdataF[aarx][prb_off2+ + (symbol*(frame_parms->ofdm_symbol_size))]; + } #ifdef DEBUG_DLSCH_DEMOD - printf("symbol %d / rb %d: alloc %d skip_half %d (rxF %p, rxF_ext %p) prb_off (%d,%d)\n",symbol,prb,rb_alloc_ind,skip_half,rxF,rxF_ext,prb_off,prb_off2); + printf("symbol %d / rb %d: alloc %d skip_half %d (rxF %p, rxF_ext %p) prb_off (%d,%d)\n",symbol,prb,rb_alloc_ind,skip_half,rxF,rxF_ext,prb_off,prb_off2); #endif - *pmi_loc = (pmi>>((prb>>2)<<1))&3; - // printf("symbol_mod %d (pilots %d) rb %d, sb %d, pmi %d (pmi_loc %p,rxF %p, ch00 %p, ch01 %p, rxF_ext %p dl_ch0_ext %p dl_ch1_ext %p)\n",symbol_mod,pilots,rb,rb>>2,*pmi_loc,pmi_loc,rxF,dl_ch0, dl_ch1, rxF_ext,dl_ch0_ext,dl_ch1_ext); - + /* if (mimo_mode <= PUSCH_PRECODING1) + *pmi_loc = (pmi>>((prb>>2)<<1))&3; + else + *pmi_loc=(pmi>>prb)&1; + // printf("symbol_mod %d (pilots %d) rb %d, sb %d, pmi %d (pmi_loc %p,rxF %p, ch00 %p, ch01 %p, rxF_ext %p dl_ch0_ext %p dl_ch1_ext %p)\n",symbol_mod,pilots,prb,prb>>2,*pmi_loc,pmi_loc,rxF,dl_ch0, dl_ch1, rxF_ext,dl_ch0_ext,dl_ch1_ext); +*/ + *pmi_loc = get_pmi(frame_parms->N_RB_DL,mimo_mode,pmi,prb); pmi_loc++; - if (prb != (frame_parms->N_RB_DL>>1)) { // This PRB is not around DC - if (pilots==0) { - if (skip_half==1) { - memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t)); - memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t)); - memcpy(rxF_ext,rxF,6*sizeof(int32_t)); + if (prb != (frame_parms->N_RB_DL>>1)) { // This PRB is not around DC + if (pilots==0) { + if (skip_half==1) { + memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t)); + memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t)); + memcpy(rxF_ext,rxF,6*sizeof(int32_t)); #ifdef DEBUG_DLSCH_DEMOD - for (i=0;i<6;i++) - printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); + for (i=0;i<6;i++) + printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); #endif - dl_ch0_ext+=6; - dl_ch1_ext+=6; - rxF_ext+=6; - } else if (skip_half==2) { - memcpy(dl_ch0_ext,dl_ch0p+6,6*sizeof(int32_t)); - memcpy(dl_ch1_ext,dl_ch1p+6,6*sizeof(int32_t)); - memcpy(rxF_ext,rxF+6,6*sizeof(int32_t)); + dl_ch0_ext+=6; + dl_ch1_ext+=6; + rxF_ext+=6; + } else if (skip_half==2) { + memcpy(dl_ch0_ext,dl_ch0p+6,6*sizeof(int32_t)); + memcpy(dl_ch1_ext,dl_ch1p+6,6*sizeof(int32_t)); + memcpy(rxF_ext,rxF+6,6*sizeof(int32_t)); #ifdef DEBUG_DLSCH_DEMOD - for (i=0;i<6;i++) - printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); + for (i=0;i<6;i++) + printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); #endif - dl_ch0_ext+=6; - dl_ch1_ext+=6; - rxF_ext+=6; - } else { // skip_half==0 - memcpy(dl_ch0_ext,dl_ch0p,12*sizeof(int32_t)); - memcpy(dl_ch1_ext,dl_ch1p,12*sizeof(int32_t)); - memcpy(rxF_ext,rxF,12*sizeof(int32_t)); + dl_ch0_ext+=6; + dl_ch1_ext+=6; + rxF_ext+=6; + } else { // skip_half==0 + memcpy(dl_ch0_ext,dl_ch0p,12*sizeof(int32_t)); + memcpy(dl_ch1_ext,dl_ch1p,12*sizeof(int32_t)); + memcpy(rxF_ext,rxF,12*sizeof(int32_t)); #ifdef DEBUG_DLSCH_DEMOD - for (i=0;i<12;i++) - printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); + for (i=0;i<12;i++) + printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); #endif - dl_ch0_ext+=12; - dl_ch1_ext+=12; - rxF_ext+=12; - } - } else { // pilots=1 - j=0; - - if (skip_half==1) { - for (i=0; i<6; i++) { - if ((i!=frame_parms->nushift) && - (i!=((frame_parms->nushift+3)%6))) { - rxF_ext[j]=rxF[i]; -#ifdef DEBUG_DLSCH_DEMOD - printf("(pilots,skip1)extract rb %d, re %d (%d)=> (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j]=dl_ch0p[i]; - dl_ch1_ext[j++]=dl_ch1p[i]; - } - } - dl_ch0_ext+=4; - dl_ch1_ext+=4; - rxF_ext+=4; - } else if (skip_half==2) { - for (i=0; i<6; i++) { - if ((i!=frame_parms->nushift) && - (i!=((frame_parms->nushift+3)%6))) { - rxF_ext[j]=rxF[(i+6)]; -#ifdef DEBUG_DLSCH_DEMOD - printf("(pilots,skip2)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); -#endif - dl_ch0_ext[j]=dl_ch0p[i+6]; - dl_ch1_ext[j++]=dl_ch1p[i+6]; - } - } - dl_ch0_ext+=4; - dl_ch1_ext+=4; - rxF_ext+=4; + dl_ch0_ext+=12; + dl_ch1_ext+=12; + rxF_ext+=12; + } + } else { // pilots=1 + j=0; - } else { //skip_half==0 - for (i=0; i<12; i++) { - if ((i!=frame_parms->nushift) && - (i!=frame_parms->nushift+3) && - (i!=frame_parms->nushift+6) && - (i!=((frame_parms->nushift+9)%12))) { - rxF_ext[j]=rxF[i]; + if (skip_half==1) { + for (i=0; i<6; i++) { + if ((i!=frame_parms->nushift) && + (i!=((frame_parms->nushift+3)%6))) { + rxF_ext[j]=rxF[i]; #ifdef DEBUG_DLSCH_DEMOD - printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); + printf("(pilots,skip1)extract rb %d, re %d (%d)=> (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); #endif - dl_ch0_ext[j] =dl_ch0p[i]; - dl_ch1_ext[j++]=dl_ch1p[i]; - } - } - dl_ch0_ext+=8; - dl_ch1_ext+=8; - rxF_ext+=8; - } //skip_half==0 - } //pilots==1 - } else { // Do middle RB (around DC) - - if (pilots==0) { - memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t)); - memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t)); - memcpy(rxF_ext,rxF,6*sizeof(int32_t)); + dl_ch0_ext[j]=dl_ch0p[i]; + dl_ch1_ext[j++]=dl_ch1p[i]; + } + } + dl_ch0_ext+=4; + dl_ch1_ext+=4; + rxF_ext+=4; + } else if (skip_half==2) { + for (i=0; i<6; i++) { + if ((i!=frame_parms->nushift) && + (i!=((frame_parms->nushift+3)%6))) { + rxF_ext[j]=rxF[(i+6)]; #ifdef DEBUG_DLSCH_DEMOD - for (i=0; i<6; i++) { - printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); - } + printf("(pilots,skip2)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); #endif - rxF_ext+=6; - dl_ch0_ext+=6; - dl_ch1_ext+=6; - dl_ch0p+=6; - dl_ch1p+=6; - - rxF = &rxdataF[aarx][1+((symbol*(frame_parms->ofdm_symbol_size)))]; + dl_ch0_ext[j]=dl_ch0p[i+6]; + dl_ch1_ext[j++]=dl_ch1p[i+6]; + } + } + dl_ch0_ext+=4; + dl_ch1_ext+=4; + rxF_ext+=4; - memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t)); - memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t)); - memcpy(rxF_ext,rxF,6*sizeof(int32_t)); + } else { //skip_half==0 + for (i=0; i<12; i++) { + if ((i!=frame_parms->nushift) && + (i!=frame_parms->nushift+3) && + (i!=frame_parms->nushift+6) && + (i!=((frame_parms->nushift+9)%12))) { + rxF_ext[j]=rxF[i]; #ifdef DEBUG_DLSCH_DEMOD - for (i=0; i<6; i++) { - printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); - } + printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); #endif - rxF_ext+=6; - dl_ch0_ext+=6; - dl_ch1_ext+=6; - } else { // pilots==1 - j=0; - - for (i=0; i<6; i++) { - if ((i!=frame_parms->nushift) && - (i!=((frame_parms->nushift+3)%6))) { - dl_ch0_ext[j]=dl_ch0p[i]; - dl_ch1_ext[j]=dl_ch1p[i]; - rxF_ext[j++]=rxF[i]; + dl_ch0_ext[j] =dl_ch0p[i]; + dl_ch1_ext[j++]=dl_ch1p[i]; + } + } + dl_ch0_ext+=8; + dl_ch1_ext+=8; + rxF_ext+=8; + } //skip_half==0 + } //pilots==1 + } else { // Do middle RB (around DC) + + if (pilots==0) { + memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t)); + memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t)); + memcpy(rxF_ext,rxF,6*sizeof(int32_t)); #ifdef DEBUG_DLSCH_DEMOD - printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[i],*(1+(short*)&rxF[i])); + for (i=0; i<6; i++) { + printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); + } #endif - } - } - rxF = &rxdataF[aarx][1+symbol*(frame_parms->ofdm_symbol_size)]; - - for (; i<12; i++) { - if ((i!=((frame_parms->nushift+6)%12)) && - (i!=((frame_parms->nushift+9)%12))) { - dl_ch0_ext[j]=dl_ch0p[i]; - dl_ch1_ext[j]=dl_ch1p[i]; - rxF_ext[j++]=rxF[i-6]; + rxF_ext+=6; + dl_ch0_ext+=6; + dl_ch1_ext+=6; + dl_ch0p+=6; + dl_ch1p+=6; + + rxF = &rxdataF[aarx][1+((symbol*(frame_parms->ofdm_symbol_size)))]; + + memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t)); + memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t)); + memcpy(rxF_ext,rxF,6*sizeof(int32_t)); #ifdef DEBUG_DLSCH_DEMOD - printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[1+i-6],*(1+(short*)&rxF[1+i-6])); + for (i=0; i<6; i++) { + printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); + } #endif - } - } - - dl_ch0_ext+=8; - dl_ch1_ext+=8; - rxF_ext+=8; - } //pilots==1 - } // if Middle PRB - } // if odd PRB + rxF_ext+=6; + dl_ch0_ext+=6; + dl_ch1_ext+=6; + } else { // pilots==1 + j=0; + + for (i=0; i<6; i++) { + if ((i!=frame_parms->nushift) && + (i!=((frame_parms->nushift+3)%6))) { + dl_ch0_ext[j]=dl_ch0p[i]; + dl_ch1_ext[j]=dl_ch1p[i]; + rxF_ext[j++]=rxF[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[i],*(1+(short*)&rxF[i])); +#endif + } + } + rxF = &rxdataF[aarx][1+symbol*(frame_parms->ofdm_symbol_size)]; + + for (; i<12; i++) { + if ((i!=((frame_parms->nushift+6)%12)) && + (i!=((frame_parms->nushift+9)%12))) { + dl_ch0_ext[j]=dl_ch0p[i]; + dl_ch1_ext[j]=dl_ch1p[i]; + rxF_ext[j++]=rxF[i-6]; +#ifdef DEBUG_DLSCH_DEMOD + printf("(pilots)extract rb %d, re %d (%d) => (%d,%d)\n",prb,i,j,*(short *)&rxF[1+i-6],*(1+(short*)&rxF[1+i-6])); +#endif + } + } + + dl_ch0_ext+=8; + dl_ch1_ext+=8; + rxF_ext+=8; + } //pilots==1 + } // if Middle PRB + } // if odd PRB } // if rballoc==1 - } // for prb + } // for prb } // for aarx + return(nb_rb/frame_parms->nb_antennas_rx); +} + +unsigned short dlsch_extract_rbs_TM7(int **rxdataF, + int **dl_bf_ch_estimates, + int **rxdataF_ext, + int **dl_bf_ch_estimates_ext, + unsigned int *rb_alloc, + unsigned char symbol, + unsigned char subframe, + uint32_t high_speed_flag, + LTE_DL_FRAME_PARMS *frame_parms) +{ + + unsigned short rb,nb_rb=0; + unsigned char rb_alloc_ind; + unsigned char i,aarx,l,nsymb,skip_half=0,sss_symb,pss_symb=0; + int *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext; + + unsigned char symbol_mod,pilots=0,uespec_pilots=0,j=0,poffset=0,uespec_poffset=0; + int8_t uespec_nushift = frame_parms->Nid_cell%3; + + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + pilots = ((symbol_mod==0)||(symbol_mod==(4-frame_parms->Ncp))) ? 1 : 0; + l=symbol; + nsymb = (frame_parms->Ncp==NORMAL) ? 14:12; + + if (frame_parms->Ncp==0){ + if (symbol==3 || symbol==6 || symbol==9 || symbol==12) + uespec_pilots = 1; + } else{ + if (symbol==4 || symbol==7 || symbol==10) + uespec_pilots = 1; + } + + if (frame_parms->frame_type == TDD) {// TDD + sss_symb = nsymb-1; + pss_symb = 2; + } else { + sss_symb = (nsymb>>1)-2; + pss_symb = (nsymb>>1)-1; + } + + if (symbol_mod==(4-frame_parms->Ncp)) + poffset=3; + + if ((frame_parms->Ncp==0 && (symbol==6 ||symbol ==12)) || (frame_parms->Ncp==1 && symbol==7)) + uespec_poffset=2; + + for (aarx=0; aarxnb_antennas_rx; aarx++) { + + if (high_speed_flag == 1) + dl_ch0 = &dl_bf_ch_estimates[aarx][symbol*(frame_parms->ofdm_symbol_size)]; + else + dl_ch0 = &dl_bf_ch_estimates[aarx][0]; + + dl_ch0_ext = &dl_bf_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; + + rxF_ext = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)]; + rxF = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))]; + + if ((frame_parms->N_RB_DL&1) == 0) // even number of RBs + for (rb=0; rbN_RB_DL; rb++) { + + if (rb < 32) + rb_alloc_ind = (rb_alloc[0]>>rb) & 1; + else if (rb < 64) + rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; + else if (rb < 96) + rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; + else if (rb < 100) + rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; + else + rb_alloc_ind = 0; + + if (rb_alloc_ind == 1) + nb_rb++; + + // For second half of RBs skip DC carrier + if (rb==(frame_parms->N_RB_DL>>1)) { + rxF = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))]; + //dl_ch0++; + } + + // PBCH + if ((subframe==0) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) { + rb_alloc_ind = 0; + } + + //SSS + if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { + rb_alloc_ind = 0; + } + + + if (frame_parms->frame_type == FDD) { + //PSS + if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + } + + if ((frame_parms->frame_type == TDD) && + (subframe==6)) { //TDD Subframe 6 + if ((rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + } + + if (rb_alloc_ind==1) { + + /* + printf("rb %d\n",rb); + for (i=0;i<12;i++) + printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]); + printf("\n"); + */ + if (pilots==0 && uespec_pilots==0) { + memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); + + for (i=0; i<12; i++) { + rxF_ext[i]=rxF[i]; + } + + dl_ch0_ext+=12; + rxF_ext+=12; + } else if(pilots==1 && uespec_pilots==0) { + j=0; + + for (i=0; i<12; i++) { + if ((i!=(frame_parms->nushift+poffset)) && + (i!=((frame_parms->nushift+poffset+6)%12))) { + rxF_ext[j]=rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; + } + } + + dl_ch0_ext+=10; + rxF_ext+=10; + + } else if (pilots==0 && uespec_pilots==1) { + j=0; + + + for (i=0; i<12; i++){ + if (frame_parms->Ncp==0){ + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ + rxF_ext[j] = rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; + } + } else{ + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ + rxF_ext[j] = rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; + } + } + + } + + dl_ch0_ext+=9-frame_parms->Ncp; + rxF_ext+=9-frame_parms->Ncp; + + } else { + LOG_E(PHY,"dlsch_extract_rbs_TM7(dl_demodulation.c):pilot or ue spec pilot detection error\n"); + exit(-1); + } + + } + + dl_ch0+=12; + rxF+=12; + + } + else { // Odd number of RBs + for (rb=0; rbN_RB_DL>>1; rb++) { + skip_half=0; + + if (rb < 32) + rb_alloc_ind = (rb_alloc[0]>>rb) & 1; + else if (rb < 64) + rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; + else if (rb < 96) + rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; + else if (rb < 100) + rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; + else + rb_alloc_ind = 0; + + if (rb_alloc_ind == 1) + nb_rb++; + + // PBCH + if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) { + rb_alloc_ind = 0; + } + + //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 + if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + skip_half=1; + else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + skip_half=2; + + //SSS + + if (((subframe==0)||(subframe==5)) && + (rb>((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l==sss_symb) ) { + rb_alloc_ind = 0; + } + + //SSS + if (((subframe==0)||(subframe==5)) && + (rb==((frame_parms->N_RB_DL>>1)-3)) && + (l==sss_symb)) + skip_half=1; + else if (((subframe==0)||(subframe==5)) && + (rb==((frame_parms->N_RB_DL>>1)+3)) && + (l==sss_symb)) + skip_half=2; + + //PSS in subframe 0/5 if FDD + if (frame_parms->frame_type == FDD) { //FDD + if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + + if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) + skip_half=1; + else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) + skip_half=2; + } + + if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6 + if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + + if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) + skip_half=1; + else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) + skip_half=2; + } + + + if (rb_alloc_ind==1) { +#ifdef DEBUG_DLSCH_DEMOD + printf("rb %d/symbol %d pilots %d, uespec_pilots %d, (skip_half %d)\n",rb,l,pilots,uespec_pilots,skip_half); +#endif + + if (pilots==0 && uespec_pilots==0) { + //printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); + + if (skip_half==1) { + memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); + + for (i=0; i<6; i++) { + rxF_ext[i]=rxF[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + + dl_ch0_ext+=6; + rxF_ext+=6; + } else if (skip_half==2) { + memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int)); + + for (i=0; i<6; i++) { + rxF_ext[i]=rxF[(i+6)]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + + dl_ch0_ext+=6; + rxF_ext+=6; + } else { + memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); + + for (i=0; i<12; i++){ + rxF_ext[i]=rxF[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",symbol,rb,i,*(short *)&rxF[i],*(1+(short*)&rxF[i])); +#endif + } + dl_ch0_ext+=12; + rxF_ext+=12; + } + } else if (pilots==1 && uespec_pilots==0) { + // printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); + j=0; + + if (skip_half==1) { + for (i=0; i<6; i++) { + if (i!=((frame_parms->nushift+poffset)%6)) { + rxF_ext[j]=rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + + dl_ch0_ext+=5; + rxF_ext+=5; + } else if (skip_half==2) { + for (i=0; i<6; i++) { + if (i!=((frame_parms->nushift+poffset)%6)) { + rxF_ext[j]=rxF[(i+6)]; + dl_ch0_ext[j++]=dl_ch0[i+6]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + + dl_ch0_ext+=5; + rxF_ext+=5; + } else { + for (i=0; i<12; i++) { + if ((i!=(frame_parms->nushift+poffset)) && + (i!=((frame_parms->nushift+poffset+6)%12))) { + rxF_ext[j]=rxF[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); +#endif + dl_ch0_ext[j++]=dl_ch0[i]; + + } + } + + dl_ch0_ext+=10; + rxF_ext+=10; + } + } else if(pilots==0 && uespec_pilots==1){ + //printf("Extracting with uespec pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); + j=0; + + if (skip_half==1) { + if (frame_parms->Ncp==0){ + for (i=0; i<6; i++) { + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ + rxF_ext[j]=rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + dl_ch0_ext+=6-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6); + rxF_ext+=6-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6); + + } else{ + for (i=0; i<6; i++) { + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ + rxF_ext[j]=rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + dl_ch0_ext+=4; + rxF_ext+=4; + } + + } else if (skip_half==2) { + if(frame_parms->Ncp==0){ + for (i=0; i<6; i++) { + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ + rxF_ext[j]=rxF[(i+6)]; + dl_ch0_ext[j++]=dl_ch0[i+6]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + dl_ch0_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6); + rxF_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6); + + } else { + for (i=0; i<6; i++) { + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ + rxF_ext[j]=rxF[(i+6)]; + dl_ch0_ext[j++]=dl_ch0[i+6]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + dl_ch0_ext+=4; + rxF_ext+=4; + } + + } else { + + for (i=0; i<12; i++){ + if (frame_parms->Ncp==0){ + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ + rxF_ext[j] = rxF[i]; + dl_ch0_ext[j++] = dl_ch0[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d, j %d => (%d,%d)\n",symbol,rb,i,j-1,*(short *)&dl_ch0[j],*(1+(short*)&dl_ch0[i])); +#endif + } + } else{ + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ + rxF_ext[j] = rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + + } + + dl_ch0_ext+=9-frame_parms->Ncp; + rxF_ext+=9-frame_parms->Ncp; + } + + } else { + LOG_E(PHY,"dlsch_extract_rbs_TM7(dl_demodulation.c):pilot or ue spec pilot detection error\n"); + exit(-1); + + } + } + + dl_ch0+=12; + rxF+=12; + } // first half loop + + + // Do middle RB (around DC) + if (rb < 32) + rb_alloc_ind = (rb_alloc[0]>>rb) & 1; + else if (rb < 64) + rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; + else if (rb < 96) + rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; + else if (rb < 100) + rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; + else + rb_alloc_ind = 0; + + if (rb_alloc_ind == 1) + nb_rb++; + + // PBCH + if ((subframe==0) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) { + rb_alloc_ind = 0; + } + + //SSS + if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { + rb_alloc_ind = 0; + } + + if (frame_parms->frame_type == FDD) { + //PSS + if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + } + + if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { + //PSS + if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + } + + //printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); + //printf("DC rb %d (%p)\n",rb,rxF); + if (rb_alloc_ind==1) { + //printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); + if (pilots==0 && uespec_pilots==0) { + for (i=0; i<6; i++) { + dl_ch0_ext[i]=dl_ch0[i]; + rxF_ext[i]=rxF[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + + rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; + + for (; i<12; i++) { + dl_ch0_ext[i]=dl_ch0[i]; + rxF_ext[i]=rxF[(1+i-6)]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + + dl_ch0_ext+=12; + rxF_ext+=12; + } else if(pilots==1 && uespec_pilots==0){ // pilots==1 + j=0; + + for (i=0; i<6; i++) { + if (i!=((frame_parms->nushift+poffset)%6)) { + dl_ch0_ext[j]=dl_ch0[i]; + rxF_ext[j++]=rxF[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + + rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; + + for (; i<12; i++) { + if (i!=((frame_parms->nushift+6+poffset)%12)) { + dl_ch0_ext[j]=dl_ch0[i]; + rxF_ext[j++]=rxF[(1+i-6)]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + + dl_ch0_ext+=10; + rxF_ext+=10; + } else if(pilots==0 && uespec_pilots==1) { + j=0; + + for (i=0; i<6; i++) { + if (frame_parms->Ncp==0){ + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ + dl_ch0_ext[j]=dl_ch0[i]; + rxF_ext[j++] = rxF[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } else { + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ + dl_ch0_ext[j]=dl_ch0[i]; + rxF_ext[j++] = rxF[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + } + + rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; + + for (; i<12; i++) { + if (frame_parms->Ncp==0){ + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ + dl_ch0_ext[j]=dl_ch0[i]; + rxF_ext[j++]=rxF[(1+i-6)]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } else { + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ + dl_ch0_ext[j]=dl_ch0[i]; + rxF_ext[j++] = rxF[(1+i-6)]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + } + + dl_ch0_ext+=9-frame_parms->Ncp; + rxF_ext+=9-frame_parms->Ncp; + + }// symbol_mod==0 + + } // rballoc==1 + else { + rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; + } + + dl_ch0+=12; + rxF+=7; + rb++; + + for (; rbN_RB_DL; rb++) { + // printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]); + // printf("rb %d (%p)\n",rb,rxF); + skip_half=0; + + if (rb < 32) + rb_alloc_ind = (rb_alloc[0]>>rb) & 1; + else if (rb < 64) + rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1; + else if (rb < 96) + rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1; + else if (rb < 100) + rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1; + else + rb_alloc_ind = 0; + + if (rb_alloc_ind==1) + nb_rb++; + + // PBCH + if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) { + rb_alloc_ind = 0; + } + + //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 + if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + skip_half=1; + else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + skip_half=2; + + //SSS + if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) { + rb_alloc_ind = 0; + } + + //SSS + if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==sss_symb)) + skip_half=1; + else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb)) + skip_half=2; + + //PSS + if (frame_parms->frame_type == FDD) { + if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + + if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) + skip_half=1; + else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) + skip_half=2; + } + + if ((frame_parms->frame_type == TDD) && ((subframe==1)||(subframe==6))) { //TDD Subframe 1 and 6 + if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) { + rb_alloc_ind = 0; + } + + if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb)) + skip_half=1; + else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb)) + skip_half=2; + } + + if (rb_alloc_ind==1) { +#ifdef DEBUG_DLSCH_DEMOD + printf("rb %d/symbol %d (skip_half %d)\n",rb,l,skip_half); +#endif + /* + printf("rb %d\n",rb); + for (i=0;i<12;i++) + printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]); + printf("\n"); + */ + if (pilots==0 && uespec_pilots==0) { + //printf("Extracting w/o pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); + if (skip_half==1) { + memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int)); + + for (i=0; i<6; i++) { + rxF_ext[i]=rxF[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + + dl_ch0_ext+=6; + rxF_ext+=6; + + } else if (skip_half==2) { + memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int)); + + for (i=0; i<6; i++) { + rxF_ext[i]=rxF[i+6]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + + dl_ch0_ext+=6; + rxF_ext+=6; + + } else { + memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int)); + //printf("symbol %d, extract rb %d, => (%d,%d)\n",symbol,rb,*(short *)&dl_ch0[j],*(1+(short*)&dl_ch0[i])); + + for (i=0; i<12; i++) { + rxF_ext[i]=rxF[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + + dl_ch0_ext+=12; + rxF_ext+=12; + } + } else if (pilots==1 && uespec_pilots==0){ + //printf("Extracting with pilots (symbol %d, rb %d, skip_half %d)\n",l,rb,skip_half); + j=0; + + if (skip_half==1) { + for (i=0; i<6; i++) { + if (i!=((frame_parms->nushift+poffset)%6)) { + rxF_ext[j]=rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + + dl_ch0_ext+=5; + rxF_ext+=5; + } else if (skip_half==2) { + for (i=0; i<6; i++) { + if (i!=((frame_parms->nushift+poffset)%6)) { + rxF_ext[j]=rxF[(i+6)]; + dl_ch0_ext[j++]=dl_ch0[i+6]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + + dl_ch0_ext+=5; + rxF_ext+=5; + } else { + for (i=0; i<12; i++) { + if ((i!=(frame_parms->nushift+poffset)) && + (i!=((frame_parms->nushift+poffset+6)%12))) { + rxF_ext[j]=rxF[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j])); +#endif + dl_ch0_ext[j++]=dl_ch0[i]; + } + } + + dl_ch0_ext+=10; + rxF_ext+=10; + } + } else if(pilots==0 && uespec_pilots==1) { + j=0; + + if (skip_half==1) { + if (frame_parms->Ncp==0){ + for (i=0; i<6; i++) { + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ + rxF_ext[j]=rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + dl_ch0_ext+=6-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6); + rxF_ext+=6-(uespec_nushift+uespec_poffset<6)-(uespec_nushift+uespec_poffset+4<6)-((uespec_nushift+uespec_poffset+8)%12<6); + + } else{ + for (i=0; i<6; i++) { + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ + rxF_ext[j]=rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + dl_ch0_ext+=4; + rxF_ext+=4; + } + + } else if (skip_half==2) { + if(frame_parms->Ncp==0){ + for (i=0; i<6; i++) { + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ + rxF_ext[j]=rxF[i+6]; + dl_ch0_ext[j++]=dl_ch0[i+6]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + dl_ch0_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6); + rxF_ext+=6-(uespec_nushift+uespec_poffset>6)-(uespec_nushift+uespec_poffset+4>6)-((uespec_nushift+uespec_poffset+8)%12>6); + + } else { + for (i=0; i<6; i++) { + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ + rxF_ext[j]=rxF[(i+6)]; + dl_ch0_ext[j++]=dl_ch0[i+6]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + dl_ch0_ext+=4; + rxF_ext+=4; + } + + } else { + for (i=0; i<12; i++){ + if (frame_parms->Ncp==0){ + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+4 && i!=(uespec_nushift+uespec_poffset+8)%12){ + rxF_ext[j] = rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } else{ + if (i!=uespec_nushift+uespec_poffset && i!=uespec_nushift+uespec_poffset+3 && i!=uespec_nushift+uespec_poffset+6 && i!=(uespec_nushift+uespec_poffset+9)%12){ + rxF_ext[j] = rxF[i]; + dl_ch0_ext[j++]=dl_ch0[i]; +#ifdef DEBUG_DLSCH_DEMOD + printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i])); +#endif + } + } + } + + dl_ch0_ext+=9-frame_parms->Ncp; + rxF_ext+=9-frame_parms->Ncp; + + } + + }// pilots=0 + } + + dl_ch0+=12; + rxF+=12; + } + } + } + + _mm_empty(); + _m_empty(); return(nb_rb/frame_parms->nb_antennas_rx); } -//============================================================================================== -// Auxiliary functions //============================================================================================== -#ifdef USER_MODE - -void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round) +void dump_dlsch2(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid) { - - unsigned int nsymb = (phy_vars_ue->lte_frame_parms.Ncp == 0) ? 14 : 12; + unsigned int nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12; char fname[32],vname[32]; - int N_RB_DL=phy_vars_ue->lte_frame_parms.N_RB_DL; + int N_RB_DL=ue->frame_parms.N_RB_DL; sprintf(fname,"dlsch%d_rxF_r%d_ext0.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_ext0",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1); - if (phy_vars_ue->lte_frame_parms.nb_antennas_rx >1) { + if (ue->frame_parms.nb_antennas_rx >1) { sprintf(fname,"dlsch%d_rxF_r%d_ext1.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_ext1",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1); } sprintf(fname,"dlsch%d_ch_r%d_ext00.m",eNB_id,round); sprintf(vname,"dl%d_ch_r%d_ext00",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); - if (phy_vars_ue->lte_frame_parms.nb_antennas_rx == 2) { - sprintf(fname,"dlsch%d_ch_r%d_ext01.m",eNB_id,round); - sprintf(vname,"dl%d_ch_r%d_ext01",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); + if (ue->transmission_mode[eNB_id]==7){ + sprintf(fname,"dlsch%d_bf_ch_r%d.m",eNB_id,round); + sprintf(vname,"dl%d_bf_ch_r%d",eNB_id,round); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_bf_ch_estimates[0],512*nsymb,1,1); + //write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_bf_ch_estimates[0],512,1,1); + + sprintf(fname,"dlsch%d_bf_ch_r%d_ext00.m",eNB_id,round); + sprintf(vname,"dl%d_bf_ch_r%d_ext00",eNB_id,round); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_bf_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1); } - if (phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB == 2) { + if (ue->frame_parms.nb_antennas_rx == 2) { + sprintf(fname,"dlsch%d_ch_r%d_ext01.m",eNB_id,round); + sprintf(vname,"dl%d_ch_r%d_ext01",eNB_id,round); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); + } + + if (ue->frame_parms.nb_antenna_ports_eNB == 2) { sprintf(fname,"dlsch%d_ch_r%d_ext10.m",eNB_id,round); sprintf(vname,"dl%d_ch_r%d_ext10",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); - if (phy_vars_ue->lte_frame_parms.nb_antennas_rx == 2) { + if (ue->frame_parms.nb_antennas_rx == 2) { sprintf(fname,"dlsch%d_ch_r%d_ext11.m",eNB_id,round); sprintf(vname,"dl%d_ch_r%d_ext11",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); } } + sprintf(fname,"dlsch%d_rxF_r%d_uespec0.m",eNB_id,round); + sprintf(vname,"dl%d_rxF_r%d_uespec0",eNB_id,round); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_uespec_pilots[0],12*N_RB_DL,1,1); + /* - write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); - write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); - write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); + write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1); + write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1); + write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1); */ sprintf(fname,"dlsch%d_r%d_rho.m",eNB_id,round); sprintf(vname,"dl_rho_r%d_%d",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[0],12*N_RB_DL*nsymb,1,1); + + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_rho_ext[harq_pid][round][0],12*N_RB_DL*nsymb,1,1); + + sprintf(fname,"dlsch%d_r%d_rho2.m",eNB_id,round); + sprintf(vname,"dl_rho2_r%d_%d",eNB_id,round); + + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_rho2_ext[0],12*N_RB_DL*nsymb,1,1); sprintf(fname,"dlsch%d_rxF_r%d_comp0.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_comp0",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1); - if (phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB == 2) { + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1); + if (ue->frame_parms.nb_antenna_ports_eNB == 2) { sprintf(fname,"dlsch%d_rxF_r%d_comp1.m",eNB_id,round); sprintf(vname,"dl%d_rxF_r%d_comp1",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[0][round],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[harq_pid][round][0],12*N_RB_DL*nsymb,1,1); } sprintf(fname,"dlsch%d_rxF_r%d_llr.m",eNB_id,round); sprintf(vname,"dl%d_r%d_llr",eNB_id,round); - write_output(fname,vname, phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0],coded_bits_per_codeword,1,0); + write_output(fname,vname, ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->llr[0],coded_bits_per_codeword[0],1,0); sprintf(fname,"dlsch%d_r%d_mag1.m",eNB_id,round); sprintf(vname,"dl%d_r%d_mag1",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1); sprintf(fname,"dlsch%d_r%d_mag2.m",eNB_id,round); sprintf(vname,"dl%d_r%d_mag2",eNB_id,round); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1); + write_output(fname,vname,ue->pdsch_vars[ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1); - // printf("log2_maxh = %d\n",phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->log2_maxh); + // printf("log2_maxh = %d\n",ue->pdsch_vars[eNB_id]->log2_maxh); } -#endif #ifdef DEBUG_DLSCH_DEMOD /* @@ -4278,7 +6123,7 @@ void print_bytes(char *s,__m128i *x) printf("%s : %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",s, tempb[0],tempb[1],tempb[2],tempb[3],tempb[4],tempb[5],tempb[6],tempb[7], tempb[8],tempb[9],tempb[10],tempb[11],tempb[12],tempb[13],tempb[14],tempb[15] - ); + ); } diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c index f9f6002970..8ea922b85c 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c @@ -1,35 +1,27 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/dlsch_llr_computation.c * \brief Top-level routines for LLR computation of the PDSCH physical channel from 36-211, V8.6 2009-03 - * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, S. Wagner + * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, S. Wagner, X Jiang * \date 2011 * \version 0.1 * \company Eurecom @@ -39,11 +31,15 @@ */ #include "PHY/defs.h" +#include "PHY/TOOLS/defs.h" #include "PHY/extern.h" #include "defs.h" #include "extern.h" #include "PHY/sse_intrin.h" +//#define DEBUG_LLR_SIC + + int16_t zero[8] __attribute__ ((aligned(16))) = {0,0,0,0,0,0,0,0}; int16_t ones[8] __attribute__ ((aligned(16))) = {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}; #if defined(__x86_64__) || defined(__i386__) @@ -640,7 +636,7 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, uint8_t first_symbol_flag, uint16_t nb_rb, uint16_t pbch_pss_sss_adjust, - int16_t **llr32p) + uint8_t beamforming_mode) { uint32_t *rxF = (uint32_t*)&rxdataF_comp[0][((int32_t)symbol*frame_parms->N_RB_DL*12)]; @@ -648,42 +644,163 @@ int dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, int i,len; uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + /* if (first_symbol_flag==1) { llr32 = (uint32_t*)dlsch_llr; } else { llr32 = (uint32_t*)(*llr32p); - } + }*/ + llr32 = (uint32_t*)dlsch_llr; if (!llr32) { - msg("dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32); + LOG_E(PHY,"dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32); return(-1); } if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){ + len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4); + } else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){ + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); } else { len = (nb_rb*12) - pbch_pss_sss_adjust; } - // printf("dlsch_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); + //printf("dlsch_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); + /*LOG_I(PHY,"dlsch_qpsk_llr: [symb %d / FirstSym %d / Length %d]: @LLR Buff %x, @LLR Buff(symb) %x \n", + symbol, + first_symbol_flag, + len, + dlsch_llr, + llr32);*/ + //printf("ll32p=%p , dlsch_llr=%p, symbol=%d, flag=%d \n", llr32, dlsch_llr, symbol, first_symbol_flag); for (i=0; iN_RB_DL*12]; + int16_t rho_rho_amp_x0[2*frame_parms->N_RB_DL*12]; + uint16_t amp_tmp; + uint16_t *llr16=(uint16_t*)dlsch_llr; + int i, len, nsymb; + uint8_t symbol, symbol_mod; + int len_acc=0; + uint16_t *sic_data; + uint16_t pbch_pss_sss_adjust; + + nsymb = (frame_parms->Ncp==0) ? 14:12; + + for (symbol=num_pdcch_symbols; symbolN_RB_DL*12)]); + int16_t *rho_1=(int16_t*)(&rho_i[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); + sic_data = (uint16_t*)&sic_buffer[0][((int16_t)len_acc)]; + + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + + + + + if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) //pilots=1 + amp_tmp=0x1fff;//dlsch0->sqrt_rho_b; already taken into account + else //pilots=0 + amp_tmp=0x1fff;//1.5*dlsch0->sqrt_rho_a; already taken into account + + if (mod_order_0==6) + amp_tmp=amp_tmp<<1; // to compensate for >> 1 shift in modulation + + + pbch_pss_sss_adjust=adjust_G2(frame_parms,&rb_alloc,2,subframe,symbol); + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + if (frame_parms->nb_antenna_ports_eNB!=1) + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); + else + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else { + len = (nb_rb*12) - pbch_pss_sss_adjust; + } + + // printf("dlsch_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); + + len_acc+=len; //accumulated length; this is done because in sic_buffer we have only data symbols + + multadd_complex_vector_real_scalar((int16_t *)sic_data, + amp_tmp, + (int16_t *)rho_amp_x0, //this is in Q13 + 1, + len); + + mult_cpx_vector((int16_t *)rho_1, //Q15 + (int16_t *)rho_amp_x0, //Q13 + (int16_t*)rho_rho_amp_x0, + len, + 13); + +#ifdef DEBUG_LLR_SIC + write_output("rho_for_multipl.m","rho_for_m", rho_1,len,1, + symbol==num_pdcch_symbols ? 15 : + symbol==nsymb-1 ? 14 : 13); + + write_output("rho_rho_in_llr.m","rho2", rho_rho_amp_x0,len,1, + symbol==num_pdcch_symbols ? 15 : + symbol==nsymb-1 ? 14 : 13); +#endif + + sub_cpx_vector16((int16_t *)rxF, + (int16_t *)rho_rho_amp_x0, + //(int16_t *)clean_x1, + (int16_t *)rxF, + len*2); + +#ifdef DEBUG_LLR_SIC + write_output("rxFdata_comp1_after.m","rxF_a", rxF,len,1,1); + write_output("rxF_comp1.m","rxF_1_comp", rxF,len,1, + symbol==num_pdcch_symbols ? 15 : + symbol==nsymb-1 ? 14 : 13); +#endif + + //this is for QPSK only!!! + for (i=0; iN_RB_DL*12)]; #endif if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - if (frame_parms->mode1_flag==0) - len = nb_rb*8 - (2*pbch_pss_sss_adjust/3); + if (frame_parms->nb_antenna_ports_eNB!=1) + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else - len = nb_rb*10 - (5*pbch_pss_sss_adjust/6); + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){ + len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4); + } else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){ + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); } else { - len = nb_rb*12 - pbch_pss_sss_adjust; + len = (nb_rb*12) - pbch_pss_sss_adjust; } // update output pointer according to number of REs in this symbol (<<2 because 4 bits per RE) @@ -752,10 +874,13 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, else *llr32p += (len<<2); + // printf("len=%d\n", len); len_mod4 = len&3; + // printf("len_mod4=%d\n", len_mod4); len>>=2; // length in quad words (4 REs) + // printf("len>>=2=%d\n", len); len+=(len_mod4==0 ? 0 : 1); - + // printf("len+=%d\n", len); for (i=0; iN_RB_DL*12]; + int16_t rho_rho_amp_x0[2*frame_parms->N_RB_DL*12]; + uint16_t amp_tmp; + uint32_t *llr32=(uint32_t*)dlsch_llr; + int i, len, nsymb; + uint8_t symbol, symbol_mod; + int len_acc=0; + uint16_t *sic_data; + uint16_t pbch_pss_sss_adjust; + unsigned char len_mod4=0; + __m128i llr128[2]; + __m128i *ch_mag; + nsymb = (frame_parms->Ncp==0) ? 14:12; + + for (symbol=num_pdcch_symbols; symbolN_RB_DL*12)]); + int16_t *rho_1=(int16_t*)(&rho_i[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); + ch_mag = (__m128i*)(&dl_ch_mag[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); + sic_data = (uint16_t*)(&sic_buffer[0][((int16_t)len_acc)]); + + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + + pbch_pss_sss_adjust=adjust_G2(frame_parms,&rb_alloc,4,subframe,symbol); + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + amp_tmp=0x1fff;//dlsch0->sqrt_rho_b; already taken into account + if (frame_parms->nb_antenna_ports_eNB!=1) + len = nb_rb*8 - (2*pbch_pss_sss_adjust/3); + else + len = nb_rb*10 - (5*pbch_pss_sss_adjust/6); + } else { + amp_tmp=0x1fff;;//dlsch0->sqrt_rho_a; already taken into account + len = nb_rb*12 - pbch_pss_sss_adjust; + } + + if (mod_order_0==6) + amp_tmp=amp_tmp<<1; // to compensate for >> 1 shift in modulation + + len_acc+=len; + + multadd_complex_vector_real_scalar((int16_t *)sic_data, + amp_tmp, + (int16_t *)rho_amp_x0, //this is in Q13 + 1, + len); + + mult_cpx_vector((int16_t *)rho_1, //Q15 + (int16_t *)rho_amp_x0, //Q13 + (int16_t*)rho_rho_amp_x0, + len, + 13); + + sub_cpx_vector16((int16_t *)rxF, + (int16_t *)rho_rho_amp_x0, + //(int16_t *)clean_x1, + (int16_t *)rxF, + len*2); + + len_mod4 = len&3; + len>>=2; // length in quad words (4 REs) + len+=(len_mod4==0 ? 0 : 1); + + for (i=0; iN_RB_DL*12)]; @@ -832,11 +1063,18 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, unsigned char symbol_mod,len_mod4; short *llr; int16_t *llr2; + int8_t *pllr_symbol; + /* if (first_symbol_flag==1) llr = dlsch_llr; else llr = *llr_save; + */ + llr = dlsch_llr; + + pllr_symbol = (int8_t*)dlsch_llr; + pllr_symbol += llr_offset; symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; @@ -848,20 +1086,33 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, ch_magb = (int16x8_t*)&dl_ch_magb[0][(symbol*frame_parms->N_RB_DL*12)]; #endif if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { - if (frame_parms->mode1_flag==0) - len = nb_rb*8 - (2*pbch_pss_sss_adjust/3); + if (frame_parms->nb_antenna_ports_eNB!=1) + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else - len = nb_rb*10 - (5*pbch_pss_sss_adjust/6); + len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6); + } else if((beamforming_mode==7) && (frame_parms->Ncp==0) && (symbol==3 || symbol==6 || symbol==9 || symbol==12)){ + len = (nb_rb*9) - (3*pbch_pss_sss_adjust/4); + } else if((beamforming_mode==7) && (frame_parms->Ncp==1) && (symbol==4 || symbol==7 || symbol==10)){ + len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); } else { - len = nb_rb*12 - pbch_pss_sss_adjust; + len = (nb_rb*12) - pbch_pss_sss_adjust; } +// printf("dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); + +/* LOG_I(PHY,"dlsch_64qam_llr [symb %d / FirstSym %d / Length %d]: @LLR Buff %x \n", + symbol, + first_symbol_flag, + len, + dlsch_llr, + pllr_symbol);*/ + llr2 = llr; llr += (len*6); len_mod4 =len&3; len2=len>>2; // length in quad words (4 REs) - len2+=(len_mod4?0:1); + len2+=((len_mod4==0)?0:1); for (i=0; iN_RB_DL*12]; + int16_t rho_rho_amp_x0[2*frame_parms->N_RB_DL*12]; + uint16_t amp_tmp; + uint16_t *llr32=(uint16_t*)dlsch_llr; + int i, len, nsymb, len2; + uint8_t symbol, symbol_mod; + int len_acc=0; + uint16_t *sic_data; + uint16_t pbch_pss_sss_adjust; + unsigned char len_mod4=0; + uint16_t *llr2; + __m128i *ch_mag,*ch_magb; + nsymb = (frame_parms->Ncp==0) ? 14:12; + + for (symbol=num_pdcch_symbols; symbolN_RB_DL*12)]); + int16_t *rho_1=(int16_t*)(&rho_i[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); + ch_mag = (__m128i*)(&dl_ch_mag[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); + ch_magb = (__m128i*)(&dl_ch_magb[0][((int16_t)symbol*frame_parms->N_RB_DL*12)]); + sic_data = (uint16_t*)(&sic_buffer[0][((int16_t)len_acc)]); + + symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; + + pbch_pss_sss_adjust=adjust_G2(frame_parms,&rb_alloc,6,subframe,symbol); + + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { + amp_tmp = 0x1fff;//dlsch0->sqrt_rho_b; already taken into account + if (frame_parms->nb_antenna_ports_eNB!=1) + len = nb_rb*8 - (2*pbch_pss_sss_adjust/3); + else + len = nb_rb*10 - (5*pbch_pss_sss_adjust/6); + } else { + amp_tmp = 0x1fff; //dlsch0->sqrt_rho_a; already taken into account + len = nb_rb*12 - pbch_pss_sss_adjust; + } + + if (mod_order_0==6) + amp_tmp=amp_tmp<<1; // to compensate for >> 1 shift in modulation + + len_acc+=len; + + multadd_complex_vector_real_scalar((int16_t *)sic_data, + amp_tmp, + (int16_t *)rho_amp_x0, //this is in Q13 + 1, + len); + + mult_cpx_vector((int16_t *)rho_1, //Q15 + (int16_t *)rho_amp_x0, //Q13 + (int16_t*)rho_rho_amp_x0, + len, + 13); + + sub_cpx_vector16((int16_t *)rxF, + (int16_t *)rho_rho_amp_x0, + //(int16_t *)clean_x1, + (int16_t *)rxF, + len*2); + + llr2 = llr32; + llr32 += (len*6); + + len_mod4 =len&3; + len2=len>>2; // length in quad words (4 REs) + len2+=(len_mod4?0:1); + + + + for (i=0; iNcp))) { // if symbol has pilots - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) // in 2 antenna ports we have 8 REs per symbol per RB len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else @@ -1026,6 +1423,7 @@ int dlsch_qpsk_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, len = (nb_rb*12) - pbch_pss_sss_adjust; } + // printf("dlsch_qpsk_qpsk_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); // printf("qpsk_qpsk: len %d, llr16 %p\n",len,llr16); qpsk_qpsk((short *)rxF, (short *)rxF_i, @@ -1046,7 +1444,7 @@ void qpsk_qpsk(short *stream0_in, short *stream0_out, short *rho01, int length - ) + ) { /* @@ -1259,14 +1657,12 @@ int dlsch_qpsk_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, llr16 = (int16_t*)(*llr16p); } - if (!llr16) { - msg("dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol); - return -1; - } + AssertFatal(llr16!=NULL,"dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol); + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { // if symbol has pilots - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) // in 2 antenna ports we have 8 REs per symbol per RB len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else @@ -1306,7 +1702,7 @@ void qpsk_qam16(int16_t *stream0_in, int16_t *stream0_out, int16_t *rho01, int32_t length - ) + ) { /* This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers. @@ -1537,20 +1933,18 @@ int dlsch_qpsk_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, int len; uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; + if (first_symbol_flag == 1) { llr16 = (int16_t*)dlsch_llr; } else { llr16 = (int16_t*)(*llr16p); } - if (!llr16) { - msg("dlsch_qpsk_qam64_llr: llr is null, symbol %d\n",symbol); - return -1; - } + AssertFatal(llr16!=NULL,"dlsch_qpsk_qam64_llr: llr is null, symbol %d\n",symbol); if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { // if symbol has pilots - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) // in 2 antenna ports we have 8 REs per symbol per RB len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else @@ -1590,7 +1984,7 @@ void qpsk_qam64(short *stream0_in, short *stream0_out, short *rho01, int length - ) + ) { /* @@ -1842,7 +2236,7 @@ void qam16_qpsk(short *stream0_in, short *stream0_out, short *rho01, int length - ) + ) { /* @@ -1876,7 +2270,7 @@ void qam16_qpsk(short *stream0_in, __m128i y0i_over_sqrt10; __m128i y0r_three_over_sqrt10; __m128i y0i_three_over_sqrt10; - + __m128i ch_mag_des; __m128i ch_mag_over_10; __m128i ch_mag_over_2; @@ -2312,15 +2706,11 @@ int dlsch_16qam_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, llr16 = (int16_t*)(*llr16p); } - - if (!llr16) { - msg("dlsch_16qam_qpsk_llr: llr is null, symbol %d\n",symbol); - return(-1); - } + AssertFatal(llr16!=NULL,"dlsch_16qam_qpsk_llr: llr is null, symbol %d\n",symbol); if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { // if symbol has pilots - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) // in 2 antenna ports we have 8 REs per symbol per RB len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else @@ -2353,7 +2743,7 @@ void qam16_qam16(short *stream0_in, short *stream0_out, short *rho01, int length - ) + ) { /* @@ -2871,14 +3261,11 @@ int dlsch_16qam_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, } - if (!llr16) { - msg("dlsch_16qam_16qam_llr: llr is null, symbol %d\n",symbol); - return(-1); - } + AssertFatal(llr16!=NULL,"dlsch_16qam_16qam_llr: llr is null, symbol %d\n",symbol); if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { // if symbol has pilots - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) // in 2 antenna ports we have 8 REs per symbol per RB len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else @@ -2912,7 +3299,7 @@ void qam16_qam64(int16_t *stream0_in, int16_t *stream0_out, int16_t *rho01, int32_t length - ) + ) { /* @@ -2938,7 +3325,7 @@ void qam16_qam64(int16_t *stream0_in, __m128i *ch_mag_128i = (__m128i *)ch_mag; __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i; - + __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15) __m128i ONE_OVER_SQRT_10 = _mm_set1_epi16(20724); // round(1/sqrt(10)*2^16) __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15) @@ -3507,14 +3894,12 @@ int dlsch_16qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, } - if (!llr16) { - msg("dlsch_16qam_64qam_llr: llr is null, symbol %d\n",symbol); - return(-1); - } + AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); + if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { // if symbol has pilots - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) // in 2 antenna ports we have 8 REs per symbol per RB len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else @@ -3588,7 +3973,7 @@ void qam64_qpsk(int16_t *stream0_in, int16_t *stream0_out, int16_t *rho01, int32_t length - ) + ) { /* @@ -3650,7 +4035,7 @@ void qam64_qpsk(int16_t *stream0_in, #elif defined(__arm__) #endif - + int i,j; for (i=0; i>2; i+=2) { @@ -5072,14 +5457,11 @@ int dlsch_64qam_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, llr16 = (int16_t*)(*llr16p); } - if (!llr16) { - msg("dlsch_64qam_64qam_llr: llr is null, symbol %d\n",symbol); - return(-1); - } + AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { // if symbol has pilots - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) // in 2 antenna ports we have 8 REs per symbol per RB len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else @@ -5111,7 +5493,7 @@ void qam64_qam16(short *stream0_in, short *stream0_out, short *rho01, int length - ) + ) { /* @@ -5174,7 +5556,7 @@ void qam64_qam16(short *stream0_in, __m128i y0i_three_over_sqrt_21; __m128i y0i_five_over_sqrt_21; __m128i y0i_seven_over_sqrt_21; - + #elif defined(__arm__) #endif @@ -6618,14 +7000,11 @@ int dlsch_64qam_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, llr16 = (int16_t*)(*llr16p); } - if (!llr16) { - msg("dlsch_64qam_16qam_llr: llr is null, symbol %d\n",symbol); - return(-1); - } + AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { // if symbol has pilots - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) // in 2 antenna ports we have 8 REs per symbol per RB len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else @@ -6656,7 +7035,7 @@ void qam64_qam64(short *stream0_in, short *stream0_out, short *rho01, int length - ) + ) { /* @@ -6723,7 +7102,7 @@ void qam64_qam64(short *stream0_in, __m128i y0i_seven_over_sqrt_21; __m128i ch_mag_int_with_sigma2; __m128i two_ch_mag_int_with_sigma2; - __m128i three_ch_mag_int_with_sigma2; + __m128i three_ch_mag_int_with_sigma2; #elif defined(__arm__) #endif @@ -8412,7 +8791,8 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, uint8_t first_symbol_flag, uint16_t nb_rb, uint16_t pbch_pss_sss_adjust, - int16_t **llr16p) + //int16_t **llr16p, + uint32_t llr_offset) { int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)]; @@ -8421,24 +8801,25 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)]; int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)]; int16_t *llr16; + int8_t *pllr_symbol; // pointer where llrs should filled for this ofdm symbol int len; uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol; //first symbol has different structure due to more pilots - if (first_symbol_flag == 1) { + /*if (first_symbol_flag == 1) { llr16 = (int16_t*)dlsch_llr; } else { llr16 = (int16_t*)(*llr16p); - } + }*/ + + llr16 = (int16_t*)dlsch_llr; + + AssertFatal(llr16!=NULL,"dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol); - if (!llr16) { - msg("dlsch_64qam_64qam_llr: llr is null, symbol %d\n",symbol); - return(-1); - } if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) { // if symbol has pilots - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) // in 2 antenna ports we have 8 REs per symbol per RB len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3); else @@ -8449,6 +8830,59 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, len = (nb_rb*12) - pbch_pss_sss_adjust; } + pllr_symbol = (int8_t*)dlsch_llr; + pllr_symbol += llr_offset; + //printf("dlsch_64qam_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust); + /*LOG_I(PHY,"dlsch_64qam_64qam_llr [symb %d / FirstSym %d / Length %d / LLR Offset %d]: @LLR Buff %x, @LLR Buff(symb) %x, , @Compute LLR Buff(symb) %x \n", + symbol, + first_symbol_flag, + len, + llr_offset, + (int16_t*)dlsch_llr, + llr16, + pllr_symbol);*/ + +#ifdef __AVX2__ + + // Round length up to multiple of 16 words + uint32_t len256i = ((len+16)>>4)*16; + int32_t *rxF_256i = (int32_t*) malloc16_clear(len256i*4); + int32_t *rxF_i_256i = (int32_t*) malloc16_clear(len256i*4); + int32_t *ch_mag_256i = (int32_t*) malloc16_clear(len256i*4); + int32_t *ch_mag_i_256i = (int32_t*) malloc16_clear(len256i*4); + int32_t *rho_256i = (int32_t*) malloc16_clear(len256i*4); + + memcpy(rxF_256i, rxF, len*4); + memcpy(rxF_i_256i, rxF_i, len*4); + memcpy(ch_mag_256i, ch_mag, len*4); + memcpy(ch_mag_i_256i, ch_mag_i, len*4); + memcpy(rho_256i, rho, len*4); + +#if 0 + qam64_qam16_avx2((short *)rxF_256i, + (short *)rxF_i_256i, + (short *)ch_mag_256i, + (short *)ch_mag_i_256i, + (short *)llr16, + (short *) rho_256i, + len); +#else + qam64_qam64_avx2((int32_t *)rxF_256i, + (int32_t *)rxF_i_256i, + (int32_t *)ch_mag_256i, + (int32_t *)ch_mag_i_256i, + (int16_t *)llr16, + (int32_t *) rho_256i, + len); +#endif + + free16(rxF_256i, sizeof(rxF_256i)); + free16(rxF_i_256i, sizeof(rxF_i_256i)); + free16(ch_mag_256i, sizeof(ch_mag_256i)); + free16(ch_mag_i_256i, sizeof(ch_mag_i_256i)); + free16(rho_256i, sizeof(rho_256i)); + +#else qam64_qam64((short *)rxF, (short *)rxF_i, (short *)ch_mag, @@ -8456,8 +8890,10 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, (short *)llr16, (short *)rho, len); +#endif llr16 += (6*len); - *llr16p = (short *)llr16; + //*llr16p = (short *)llr16; + return(0); } diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.c new file mode 100644 index 0000000000..588adfbc55 --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.c @@ -0,0 +1,4034 @@ + /* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/LTE_TRANSPORT/dlsch_llr_computation.c + * \brief Top-level routines for LLR computation of the PDSCH physical channel from 36-211, V8.6 2009-03 + * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert, S. Wagner, X Jiang + * \date 2011 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr,sebastien.aubert@eurecom.fr, sebastian.wagner@eurecom.fr + * \note + * \warning + */ + +#include "PHY/defs.h" +#include "PHY/TOOLS/defs.h" +#include "PHY/extern.h" +#include "defs.h" +#include "extern.h" +#include "PHY/sse_intrin.h" + +int16_t ones256[16] __attribute__ ((aligned(32))) = {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}; + +static __m256i rho_rpi __attribute__ ((aligned(32))); +static __m256i rho_rmi __attribute__ ((aligned(32))); +static __m256i rho_rpi_1_1 __attribute__ ((aligned(32))); +static __m256i rho_rpi_1_3 __attribute__ ((aligned(32))); +static __m256i rho_rpi_1_5 __attribute__ ((aligned(32))); +static __m256i rho_rpi_1_7 __attribute__ ((aligned(32))); +static __m256i rho_rpi_3_1 __attribute__ ((aligned(32))); +static __m256i rho_rpi_3_3 __attribute__ ((aligned(32))); +static __m256i rho_rpi_3_5 __attribute__ ((aligned(32))); +static __m256i rho_rpi_3_7 __attribute__ ((aligned(32))); +static __m256i rho_rpi_5_1 __attribute__ ((aligned(32))); +static __m256i rho_rpi_5_3 __attribute__ ((aligned(32))); +static __m256i rho_rpi_5_5 __attribute__ ((aligned(32))); +static __m256i rho_rpi_5_7 __attribute__ ((aligned(32))); +static __m256i rho_rpi_7_1 __attribute__ ((aligned(32))); +static __m256i rho_rpi_7_3 __attribute__ ((aligned(32))); +static __m256i rho_rpi_7_5 __attribute__ ((aligned(32))); +static __m256i rho_rpi_7_7 __attribute__ ((aligned(32))); +static __m256i rho_rmi_1_1 __attribute__ ((aligned(32))); +static __m256i rho_rmi_1_3 __attribute__ ((aligned(32))); +static __m256i rho_rmi_1_5 __attribute__ ((aligned(32))); +static __m256i rho_rmi_1_7 __attribute__ ((aligned(32))); +static __m256i rho_rmi_3_1 __attribute__ ((aligned(32))); +static __m256i rho_rmi_3_3 __attribute__ ((aligned(32))); +static __m256i rho_rmi_3_5 __attribute__ ((aligned(32))); +static __m256i rho_rmi_3_7 __attribute__ ((aligned(32))); +static __m256i rho_rmi_5_1 __attribute__ ((aligned(32))); +static __m256i rho_rmi_5_3 __attribute__ ((aligned(32))); +static __m256i rho_rmi_5_5 __attribute__ ((aligned(32))); +static __m256i rho_rmi_5_7 __attribute__ ((aligned(32))); +static __m256i rho_rmi_7_1 __attribute__ ((aligned(32))); +static __m256i rho_rmi_7_3 __attribute__ ((aligned(32))); +static __m256i rho_rmi_7_5 __attribute__ ((aligned(32))); +static __m256i rho_rmi_7_7 __attribute__ ((aligned(32))); + +static __m256i psi_r_m7_m7 __attribute__ ((aligned(32))); +static __m256i psi_r_m7_m5 __attribute__ ((aligned(32))); +static __m256i psi_r_m7_m3 __attribute__ ((aligned(32))); +static __m256i psi_r_m7_m1 __attribute__ ((aligned(32))); +static __m256i psi_r_m7_p1 __attribute__ ((aligned(32))); +static __m256i psi_r_m7_p3 __attribute__ ((aligned(32))); +static __m256i psi_r_m7_p5 __attribute__ ((aligned(32))); +static __m256i psi_r_m7_p7 __attribute__ ((aligned(32))); +static __m256i psi_r_m5_m7 __attribute__ ((aligned(32))); +static __m256i psi_r_m5_m5 __attribute__ ((aligned(32))); +static __m256i psi_r_m5_m3 __attribute__ ((aligned(32))); +static __m256i psi_r_m5_m1 __attribute__ ((aligned(32))); +static __m256i psi_r_m5_p1 __attribute__ ((aligned(32))); +static __m256i psi_r_m5_p3 __attribute__ ((aligned(32))); +static __m256i psi_r_m5_p5 __attribute__ ((aligned(32))); +static __m256i psi_r_m5_p7 __attribute__ ((aligned(32))); +static __m256i psi_r_m3_m7 __attribute__ ((aligned(32))); +static __m256i psi_r_m3_m5 __attribute__ ((aligned(32))); +static __m256i psi_r_m3_m3 __attribute__ ((aligned(32))); +static __m256i psi_r_m3_m1 __attribute__ ((aligned(32))); +static __m256i psi_r_m3_p1 __attribute__ ((aligned(32))); +static __m256i psi_r_m3_p3 __attribute__ ((aligned(32))); +static __m256i psi_r_m3_p5 __attribute__ ((aligned(32))); +static __m256i psi_r_m3_p7 __attribute__ ((aligned(32))); +static __m256i psi_r_m1_m7 __attribute__ ((aligned(32))); +static __m256i psi_r_m1_m5 __attribute__ ((aligned(32))); +static __m256i psi_r_m1_m3 __attribute__ ((aligned(32))); +static __m256i psi_r_m1_m1 __attribute__ ((aligned(32))); +static __m256i psi_r_m1_p1 __attribute__ ((aligned(32))); +static __m256i psi_r_m1_p3 __attribute__ ((aligned(32))); +static __m256i psi_r_m1_p5 __attribute__ ((aligned(32))); +static __m256i psi_r_m1_p7 __attribute__ ((aligned(32))); +static __m256i psi_r_p1_m7 __attribute__ ((aligned(32))); +static __m256i psi_r_p1_m5 __attribute__ ((aligned(32))); +static __m256i psi_r_p1_m3 __attribute__ ((aligned(32))); +static __m256i psi_r_p1_m1 __attribute__ ((aligned(32))); +static __m256i psi_r_p1_p1 __attribute__ ((aligned(32))); +static __m256i psi_r_p1_p3 __attribute__ ((aligned(32))); +static __m256i psi_r_p1_p5 __attribute__ ((aligned(32))); +static __m256i psi_r_p1_p7 __attribute__ ((aligned(32))); +static __m256i psi_r_p3_m7 __attribute__ ((aligned(32))); +static __m256i psi_r_p3_m5 __attribute__ ((aligned(32))); +static __m256i psi_r_p3_m3 __attribute__ ((aligned(32))); +static __m256i psi_r_p3_m1 __attribute__ ((aligned(32))); +static __m256i psi_r_p3_p1 __attribute__ ((aligned(32))); +static __m256i psi_r_p3_p3 __attribute__ ((aligned(32))); +static __m256i psi_r_p3_p5 __attribute__ ((aligned(32))); +static __m256i psi_r_p3_p7 __attribute__ ((aligned(32))); +static __m256i psi_r_p5_m7 __attribute__ ((aligned(32))); +static __m256i psi_r_p5_m5 __attribute__ ((aligned(32))); +static __m256i psi_r_p5_m3 __attribute__ ((aligned(32))); +static __m256i psi_r_p5_m1 __attribute__ ((aligned(32))); +static __m256i psi_r_p5_p1 __attribute__ ((aligned(32))); +static __m256i psi_r_p5_p3 __attribute__ ((aligned(32))); +static __m256i psi_r_p5_p5 __attribute__ ((aligned(32))); +static __m256i psi_r_p5_p7 __attribute__ ((aligned(32))); +static __m256i psi_r_p7_m7 __attribute__ ((aligned(32))); +static __m256i psi_r_p7_m5 __attribute__ ((aligned(32))); +static __m256i psi_r_p7_m3 __attribute__ ((aligned(32))); +static __m256i psi_r_p7_m1 __attribute__ ((aligned(32))); +static __m256i psi_r_p7_p1 __attribute__ ((aligned(32))); +static __m256i psi_r_p7_p3 __attribute__ ((aligned(32))); +static __m256i psi_r_p7_p5 __attribute__ ((aligned(32))); +static __m256i psi_r_p7_p7 __attribute__ ((aligned(32))); + +static __m256i psi_i_m7_m7 __attribute__ ((aligned(32))); +static __m256i psi_i_m7_m5 __attribute__ ((aligned(32))); +static __m256i psi_i_m7_m3 __attribute__ ((aligned(32))); +static __m256i psi_i_m7_m1 __attribute__ ((aligned(32))); +static __m256i psi_i_m7_p1 __attribute__ ((aligned(32))); +static __m256i psi_i_m7_p3 __attribute__ ((aligned(32))); +static __m256i psi_i_m7_p5 __attribute__ ((aligned(32))); +static __m256i psi_i_m7_p7 __attribute__ ((aligned(32))); +static __m256i psi_i_m5_m7 __attribute__ ((aligned(32))); +static __m256i psi_i_m5_m5 __attribute__ ((aligned(32))); +static __m256i psi_i_m5_m3 __attribute__ ((aligned(32))); +static __m256i psi_i_m5_m1 __attribute__ ((aligned(32))); +static __m256i psi_i_m5_p1 __attribute__ ((aligned(32))); +static __m256i psi_i_m5_p3 __attribute__ ((aligned(32))); +static __m256i psi_i_m5_p5 __attribute__ ((aligned(32))); +static __m256i psi_i_m5_p7 __attribute__ ((aligned(32))); +static __m256i psi_i_m3_m7 __attribute__ ((aligned(32))); +static __m256i psi_i_m3_m5 __attribute__ ((aligned(32))); +static __m256i psi_i_m3_m3 __attribute__ ((aligned(32))); +static __m256i psi_i_m3_m1 __attribute__ ((aligned(32))); +static __m256i psi_i_m3_p1 __attribute__ ((aligned(32))); +static __m256i psi_i_m3_p3 __attribute__ ((aligned(32))); +static __m256i psi_i_m3_p5 __attribute__ ((aligned(32))); +static __m256i psi_i_m3_p7 __attribute__ ((aligned(32))); +static __m256i psi_i_m1_m7 __attribute__ ((aligned(32))); +static __m256i psi_i_m1_m5 __attribute__ ((aligned(32))); +static __m256i psi_i_m1_m3 __attribute__ ((aligned(32))); +static __m256i psi_i_m1_m1 __attribute__ ((aligned(32))); +static __m256i psi_i_m1_p1 __attribute__ ((aligned(32))); +static __m256i psi_i_m1_p3 __attribute__ ((aligned(32))); +static __m256i psi_i_m1_p5 __attribute__ ((aligned(32))); +static __m256i psi_i_m1_p7 __attribute__ ((aligned(32))); +static __m256i psi_i_p1_m7 __attribute__ ((aligned(32))); +static __m256i psi_i_p1_m5 __attribute__ ((aligned(32))); +static __m256i psi_i_p1_m3 __attribute__ ((aligned(32))); +static __m256i psi_i_p1_m1 __attribute__ ((aligned(32))); +static __m256i psi_i_p1_p1 __attribute__ ((aligned(32))); +static __m256i psi_i_p1_p3 __attribute__ ((aligned(32))); +static __m256i psi_i_p1_p5 __attribute__ ((aligned(32))); +static __m256i psi_i_p1_p7 __attribute__ ((aligned(32))); +static __m256i psi_i_p3_m7 __attribute__ ((aligned(32))); +static __m256i psi_i_p3_m5 __attribute__ ((aligned(32))); +static __m256i psi_i_p3_m3 __attribute__ ((aligned(32))); +static __m256i psi_i_p3_m1 __attribute__ ((aligned(32))); +static __m256i psi_i_p3_p1 __attribute__ ((aligned(32))); +static __m256i psi_i_p3_p3 __attribute__ ((aligned(32))); +static __m256i psi_i_p3_p5 __attribute__ ((aligned(32))); +static __m256i psi_i_p3_p7 __attribute__ ((aligned(32))); +static __m256i psi_i_p5_m7 __attribute__ ((aligned(32))); +static __m256i psi_i_p5_m5 __attribute__ ((aligned(32))); +static __m256i psi_i_p5_m3 __attribute__ ((aligned(32))); +static __m256i psi_i_p5_m1 __attribute__ ((aligned(32))); +static __m256i psi_i_p5_p1 __attribute__ ((aligned(32))); +static __m256i psi_i_p5_p3 __attribute__ ((aligned(32))); +static __m256i psi_i_p5_p5 __attribute__ ((aligned(32))); +static __m256i psi_i_p5_p7 __attribute__ ((aligned(32))); +static __m256i psi_i_p7_m7 __attribute__ ((aligned(32))); +static __m256i psi_i_p7_m5 __attribute__ ((aligned(32))); +static __m256i psi_i_p7_m3 __attribute__ ((aligned(32))); +static __m256i psi_i_p7_m1 __attribute__ ((aligned(32))); +static __m256i psi_i_p7_p1 __attribute__ ((aligned(32))); +static __m256i psi_i_p7_p3 __attribute__ ((aligned(32))); +static __m256i psi_i_p7_p5 __attribute__ ((aligned(32))); +static __m256i psi_i_p7_p7 __attribute__ ((aligned(32))); + +static __m256i a_r_m7_m7 __attribute__ ((aligned(32))); +static __m256i a_r_m7_m5 __attribute__ ((aligned(32))); +static __m256i a_r_m7_m3 __attribute__ ((aligned(32))); +static __m256i a_r_m7_m1 __attribute__ ((aligned(32))); +static __m256i a_r_m7_p1 __attribute__ ((aligned(32))); +static __m256i a_r_m7_p3 __attribute__ ((aligned(32))); +static __m256i a_r_m7_p5 __attribute__ ((aligned(32))); +static __m256i a_r_m7_p7 __attribute__ ((aligned(32))); +static __m256i a_r_m5_m7 __attribute__ ((aligned(32))); +static __m256i a_r_m5_m5 __attribute__ ((aligned(32))); +static __m256i a_r_m5_m3 __attribute__ ((aligned(32))); +static __m256i a_r_m5_m1 __attribute__ ((aligned(32))); +static __m256i a_r_m5_p1 __attribute__ ((aligned(32))); +static __m256i a_r_m5_p3 __attribute__ ((aligned(32))); +static __m256i a_r_m5_p5 __attribute__ ((aligned(32))); +static __m256i a_r_m5_p7 __attribute__ ((aligned(32))); +static __m256i a_r_m3_m7 __attribute__ ((aligned(32))); +static __m256i a_r_m3_m5 __attribute__ ((aligned(32))); +static __m256i a_r_m3_m3 __attribute__ ((aligned(32))); +static __m256i a_r_m3_m1 __attribute__ ((aligned(32))); +static __m256i a_r_m3_p1 __attribute__ ((aligned(32))); +static __m256i a_r_m3_p3 __attribute__ ((aligned(32))); +static __m256i a_r_m3_p5 __attribute__ ((aligned(32))); +static __m256i a_r_m3_p7 __attribute__ ((aligned(32))); +static __m256i a_r_m1_m7 __attribute__ ((aligned(32))); +static __m256i a_r_m1_m5 __attribute__ ((aligned(32))); +static __m256i a_r_m1_m3 __attribute__ ((aligned(32))); +static __m256i a_r_m1_m1 __attribute__ ((aligned(32))); +static __m256i a_r_m1_p1 __attribute__ ((aligned(32))); +static __m256i a_r_m1_p3 __attribute__ ((aligned(32))); +static __m256i a_r_m1_p5 __attribute__ ((aligned(32))); +static __m256i a_r_m1_p7 __attribute__ ((aligned(32))); +static __m256i a_r_p1_m7 __attribute__ ((aligned(32))); +static __m256i a_r_p1_m5 __attribute__ ((aligned(32))); +static __m256i a_r_p1_m3 __attribute__ ((aligned(32))); +static __m256i a_r_p1_m1 __attribute__ ((aligned(32))); +static __m256i a_r_p1_p1 __attribute__ ((aligned(32))); +static __m256i a_r_p1_p3 __attribute__ ((aligned(32))); +static __m256i a_r_p1_p5 __attribute__ ((aligned(32))); +static __m256i a_r_p1_p7 __attribute__ ((aligned(32))); +static __m256i a_r_p3_m7 __attribute__ ((aligned(32))); +static __m256i a_r_p3_m5 __attribute__ ((aligned(32))); +static __m256i a_r_p3_m3 __attribute__ ((aligned(32))); +static __m256i a_r_p3_m1 __attribute__ ((aligned(32))); +static __m256i a_r_p3_p1 __attribute__ ((aligned(32))); +static __m256i a_r_p3_p3 __attribute__ ((aligned(32))); +static __m256i a_r_p3_p5 __attribute__ ((aligned(32))); +static __m256i a_r_p3_p7 __attribute__ ((aligned(32))); +static __m256i a_r_p5_m7 __attribute__ ((aligned(32))); +static __m256i a_r_p5_m5 __attribute__ ((aligned(32))); +static __m256i a_r_p5_m3 __attribute__ ((aligned(32))); +static __m256i a_r_p5_m1 __attribute__ ((aligned(32))); +static __m256i a_r_p5_p1 __attribute__ ((aligned(32))); +static __m256i a_r_p5_p3 __attribute__ ((aligned(32))); +static __m256i a_r_p5_p5 __attribute__ ((aligned(32))); +static __m256i a_r_p5_p7 __attribute__ ((aligned(32))); +static __m256i a_r_p7_m7 __attribute__ ((aligned(32))); +static __m256i a_r_p7_m5 __attribute__ ((aligned(32))); +static __m256i a_r_p7_m3 __attribute__ ((aligned(32))); +static __m256i a_r_p7_m1 __attribute__ ((aligned(32))); +static __m256i a_r_p7_p1 __attribute__ ((aligned(32))); +static __m256i a_r_p7_p3 __attribute__ ((aligned(32))); +static __m256i a_r_p7_p5 __attribute__ ((aligned(32))); +static __m256i a_r_p7_p7 __attribute__ ((aligned(32))); + +static __m256i a_i_m7_m7 __attribute__ ((aligned(32))); +static __m256i a_i_m7_m5 __attribute__ ((aligned(32))); +static __m256i a_i_m7_m3 __attribute__ ((aligned(32))); +static __m256i a_i_m7_m1 __attribute__ ((aligned(32))); +static __m256i a_i_m7_p1 __attribute__ ((aligned(32))); +static __m256i a_i_m7_p3 __attribute__ ((aligned(32))); +static __m256i a_i_m7_p5 __attribute__ ((aligned(32))); +static __m256i a_i_m7_p7 __attribute__ ((aligned(32))); +static __m256i a_i_m5_m7 __attribute__ ((aligned(32))); +static __m256i a_i_m5_m5 __attribute__ ((aligned(32))); +static __m256i a_i_m5_m3 __attribute__ ((aligned(32))); +static __m256i a_i_m5_m1 __attribute__ ((aligned(32))); +static __m256i a_i_m5_p1 __attribute__ ((aligned(32))); +static __m256i a_i_m5_p3 __attribute__ ((aligned(32))); +static __m256i a_i_m5_p5 __attribute__ ((aligned(32))); +static __m256i a_i_m5_p7 __attribute__ ((aligned(32))); +static __m256i a_i_m3_m7 __attribute__ ((aligned(32))); +static __m256i a_i_m3_m5 __attribute__ ((aligned(32))); +static __m256i a_i_m3_m3 __attribute__ ((aligned(32))); +static __m256i a_i_m3_m1 __attribute__ ((aligned(32))); +static __m256i a_i_m3_p1 __attribute__ ((aligned(32))); +static __m256i a_i_m3_p3 __attribute__ ((aligned(32))); +static __m256i a_i_m3_p5 __attribute__ ((aligned(32))); +static __m256i a_i_m3_p7 __attribute__ ((aligned(32))); +static __m256i a_i_m1_m7 __attribute__ ((aligned(32))); +static __m256i a_i_m1_m5 __attribute__ ((aligned(32))); +static __m256i a_i_m1_m3 __attribute__ ((aligned(32))); +static __m256i a_i_m1_m1 __attribute__ ((aligned(32))); +static __m256i a_i_m1_p1 __attribute__ ((aligned(32))); +static __m256i a_i_m1_p3 __attribute__ ((aligned(32))); +static __m256i a_i_m1_p5 __attribute__ ((aligned(32))); +static __m256i a_i_m1_p7 __attribute__ ((aligned(32))); +static __m256i a_i_p1_m7 __attribute__ ((aligned(32))); +static __m256i a_i_p1_m5 __attribute__ ((aligned(32))); +static __m256i a_i_p1_m3 __attribute__ ((aligned(32))); +static __m256i a_i_p1_m1 __attribute__ ((aligned(32))); +static __m256i a_i_p1_p1 __attribute__ ((aligned(32))); +static __m256i a_i_p1_p3 __attribute__ ((aligned(32))); +static __m256i a_i_p1_p5 __attribute__ ((aligned(32))); +static __m256i a_i_p1_p7 __attribute__ ((aligned(32))); +static __m256i a_i_p3_m7 __attribute__ ((aligned(32))); +static __m256i a_i_p3_m5 __attribute__ ((aligned(32))); +static __m256i a_i_p3_m3 __attribute__ ((aligned(32))); +static __m256i a_i_p3_m1 __attribute__ ((aligned(32))); +static __m256i a_i_p3_p1 __attribute__ ((aligned(32))); +static __m256i a_i_p3_p3 __attribute__ ((aligned(32))); +static __m256i a_i_p3_p5 __attribute__ ((aligned(32))); +static __m256i a_i_p3_p7 __attribute__ ((aligned(32))); +static __m256i a_i_p5_m7 __attribute__ ((aligned(32))); +static __m256i a_i_p5_m5 __attribute__ ((aligned(32))); +static __m256i a_i_p5_m3 __attribute__ ((aligned(32))); +static __m256i a_i_p5_m1 __attribute__ ((aligned(32))); +static __m256i a_i_p5_p1 __attribute__ ((aligned(32))); +static __m256i a_i_p5_p3 __attribute__ ((aligned(32))); +static __m256i a_i_p5_p5 __attribute__ ((aligned(32))); +static __m256i a_i_p5_p7 __attribute__ ((aligned(32))); +static __m256i a_i_p7_m7 __attribute__ ((aligned(32))); +static __m256i a_i_p7_m5 __attribute__ ((aligned(32))); +static __m256i a_i_p7_m3 __attribute__ ((aligned(32))); +static __m256i a_i_p7_m1 __attribute__ ((aligned(32))); +static __m256i a_i_p7_p1 __attribute__ ((aligned(32))); +static __m256i a_i_p7_p3 __attribute__ ((aligned(32))); +static __m256i a_i_p7_p5 __attribute__ ((aligned(32))); +static __m256i a_i_p7_p7 __attribute__ ((aligned(32))); + +static __m256i psi_a_m7_m7 __attribute__ ((aligned(32))); +static __m256i psi_a_m7_m5 __attribute__ ((aligned(32))); +static __m256i psi_a_m7_m3 __attribute__ ((aligned(32))); +static __m256i psi_a_m7_m1 __attribute__ ((aligned(32))); +static __m256i psi_a_m7_p1 __attribute__ ((aligned(32))); +static __m256i psi_a_m7_p3 __attribute__ ((aligned(32))); +static __m256i psi_a_m7_p5 __attribute__ ((aligned(32))); +static __m256i psi_a_m7_p7 __attribute__ ((aligned(32))); +static __m256i psi_a_m5_m7 __attribute__ ((aligned(32))); +static __m256i psi_a_m5_m5 __attribute__ ((aligned(32))); +static __m256i psi_a_m5_m3 __attribute__ ((aligned(32))); +static __m256i psi_a_m5_m1 __attribute__ ((aligned(32))); +static __m256i psi_a_m5_p1 __attribute__ ((aligned(32))); +static __m256i psi_a_m5_p3 __attribute__ ((aligned(32))); +static __m256i psi_a_m5_p5 __attribute__ ((aligned(32))); +static __m256i psi_a_m5_p7 __attribute__ ((aligned(32))); +static __m256i psi_a_m3_m7 __attribute__ ((aligned(32))); +static __m256i psi_a_m3_m5 __attribute__ ((aligned(32))); +static __m256i psi_a_m3_m3 __attribute__ ((aligned(32))); +static __m256i psi_a_m3_m1 __attribute__ ((aligned(32))); +static __m256i psi_a_m3_p1 __attribute__ ((aligned(32))); +static __m256i psi_a_m3_p3 __attribute__ ((aligned(32))); +static __m256i psi_a_m3_p5 __attribute__ ((aligned(32))); +static __m256i psi_a_m3_p7 __attribute__ ((aligned(32))); +static __m256i psi_a_m1_m7 __attribute__ ((aligned(32))); +static __m256i psi_a_m1_m5 __attribute__ ((aligned(32))); +static __m256i psi_a_m1_m3 __attribute__ ((aligned(32))); +static __m256i psi_a_m1_m1 __attribute__ ((aligned(32))); +static __m256i psi_a_m1_p1 __attribute__ ((aligned(32))); +static __m256i psi_a_m1_p3 __attribute__ ((aligned(32))); +static __m256i psi_a_m1_p5 __attribute__ ((aligned(32))); +static __m256i psi_a_m1_p7 __attribute__ ((aligned(32))); +static __m256i psi_a_p1_m7 __attribute__ ((aligned(32))); +static __m256i psi_a_p1_m5 __attribute__ ((aligned(32))); +static __m256i psi_a_p1_m3 __attribute__ ((aligned(32))); +static __m256i psi_a_p1_m1 __attribute__ ((aligned(32))); +static __m256i psi_a_p1_p1 __attribute__ ((aligned(32))); +static __m256i psi_a_p1_p3 __attribute__ ((aligned(32))); +static __m256i psi_a_p1_p5 __attribute__ ((aligned(32))); +static __m256i psi_a_p1_p7 __attribute__ ((aligned(32))); +static __m256i psi_a_p3_m7 __attribute__ ((aligned(32))); +static __m256i psi_a_p3_m5 __attribute__ ((aligned(32))); +static __m256i psi_a_p3_m3 __attribute__ ((aligned(32))); +static __m256i psi_a_p3_m1 __attribute__ ((aligned(32))); +static __m256i psi_a_p3_p1 __attribute__ ((aligned(32))); +static __m256i psi_a_p3_p3 __attribute__ ((aligned(32))); +static __m256i psi_a_p3_p5 __attribute__ ((aligned(32))); +static __m256i psi_a_p3_p7 __attribute__ ((aligned(32))); +static __m256i psi_a_p5_m7 __attribute__ ((aligned(32))); +static __m256i psi_a_p5_m5 __attribute__ ((aligned(32))); +static __m256i psi_a_p5_m3 __attribute__ ((aligned(32))); +static __m256i psi_a_p5_m1 __attribute__ ((aligned(32))); +static __m256i psi_a_p5_p1 __attribute__ ((aligned(32))); +static __m256i psi_a_p5_p3 __attribute__ ((aligned(32))); +static __m256i psi_a_p5_p5 __attribute__ ((aligned(32))); +static __m256i psi_a_p5_p7 __attribute__ ((aligned(32))); +static __m256i psi_a_p7_m7 __attribute__ ((aligned(32))); +static __m256i psi_a_p7_m5 __attribute__ ((aligned(32))); +static __m256i psi_a_p7_m3 __attribute__ ((aligned(32))); +static __m256i psi_a_p7_m1 __attribute__ ((aligned(32))); +static __m256i psi_a_p7_p1 __attribute__ ((aligned(32))); +static __m256i psi_a_p7_p3 __attribute__ ((aligned(32))); +static __m256i psi_a_p7_p5 __attribute__ ((aligned(32))); +static __m256i psi_a_p7_p7 __attribute__ ((aligned(32))); + +static __m256i a_sq_m7_m7 __attribute__ ((aligned(32))); +static __m256i a_sq_m7_m5 __attribute__ ((aligned(32))); +static __m256i a_sq_m7_m3 __attribute__ ((aligned(32))); +static __m256i a_sq_m7_m1 __attribute__ ((aligned(32))); +static __m256i a_sq_m7_p1 __attribute__ ((aligned(32))); +static __m256i a_sq_m7_p3 __attribute__ ((aligned(32))); +static __m256i a_sq_m7_p5 __attribute__ ((aligned(32))); +static __m256i a_sq_m7_p7 __attribute__ ((aligned(32))); +static __m256i a_sq_m5_m7 __attribute__ ((aligned(32))); +static __m256i a_sq_m5_m5 __attribute__ ((aligned(32))); +static __m256i a_sq_m5_m3 __attribute__ ((aligned(32))); +static __m256i a_sq_m5_m1 __attribute__ ((aligned(32))); +static __m256i a_sq_m5_p1 __attribute__ ((aligned(32))); +static __m256i a_sq_m5_p3 __attribute__ ((aligned(32))); +static __m256i a_sq_m5_p5 __attribute__ ((aligned(32))); +static __m256i a_sq_m5_p7 __attribute__ ((aligned(32))); +static __m256i a_sq_m3_m7 __attribute__ ((aligned(32))); +static __m256i a_sq_m3_m5 __attribute__ ((aligned(32))); +static __m256i a_sq_m3_m3 __attribute__ ((aligned(32))); +static __m256i a_sq_m3_m1 __attribute__ ((aligned(32))); +static __m256i a_sq_m3_p1 __attribute__ ((aligned(32))); +static __m256i a_sq_m3_p3 __attribute__ ((aligned(32))); +static __m256i a_sq_m3_p5 __attribute__ ((aligned(32))); +static __m256i a_sq_m3_p7 __attribute__ ((aligned(32))); +static __m256i a_sq_m1_m7 __attribute__ ((aligned(32))); +static __m256i a_sq_m1_m5 __attribute__ ((aligned(32))); +static __m256i a_sq_m1_m3 __attribute__ ((aligned(32))); +static __m256i a_sq_m1_m1 __attribute__ ((aligned(32))); +static __m256i a_sq_m1_p1 __attribute__ ((aligned(32))); +static __m256i a_sq_m1_p3 __attribute__ ((aligned(32))); +static __m256i a_sq_m1_p5 __attribute__ ((aligned(32))); +static __m256i a_sq_m1_p7 __attribute__ ((aligned(32))); +static __m256i a_sq_p1_m7 __attribute__ ((aligned(32))); +static __m256i a_sq_p1_m5 __attribute__ ((aligned(32))); +static __m256i a_sq_p1_m3 __attribute__ ((aligned(32))); +static __m256i a_sq_p1_m1 __attribute__ ((aligned(32))); +static __m256i a_sq_p1_p1 __attribute__ ((aligned(32))); +static __m256i a_sq_p1_p3 __attribute__ ((aligned(32))); +static __m256i a_sq_p1_p5 __attribute__ ((aligned(32))); +static __m256i a_sq_p1_p7 __attribute__ ((aligned(32))); +static __m256i a_sq_p3_m7 __attribute__ ((aligned(32))); +static __m256i a_sq_p3_m5 __attribute__ ((aligned(32))); +static __m256i a_sq_p3_m3 __attribute__ ((aligned(32))); +static __m256i a_sq_p3_m1 __attribute__ ((aligned(32))); +static __m256i a_sq_p3_p1 __attribute__ ((aligned(32))); +static __m256i a_sq_p3_p3 __attribute__ ((aligned(32))); +static __m256i a_sq_p3_p5 __attribute__ ((aligned(32))); +static __m256i a_sq_p3_p7 __attribute__ ((aligned(32))); +static __m256i a_sq_p5_m7 __attribute__ ((aligned(32))); +static __m256i a_sq_p5_m5 __attribute__ ((aligned(32))); +static __m256i a_sq_p5_m3 __attribute__ ((aligned(32))); +static __m256i a_sq_p5_m1 __attribute__ ((aligned(32))); +static __m256i a_sq_p5_p1 __attribute__ ((aligned(32))); +static __m256i a_sq_p5_p3 __attribute__ ((aligned(32))); +static __m256i a_sq_p5_p5 __attribute__ ((aligned(32))); +static __m256i a_sq_p5_p7 __attribute__ ((aligned(32))); +static __m256i a_sq_p7_m7 __attribute__ ((aligned(32))); +static __m256i a_sq_p7_m5 __attribute__ ((aligned(32))); +static __m256i a_sq_p7_m3 __attribute__ ((aligned(32))); +static __m256i a_sq_p7_m1 __attribute__ ((aligned(32))); +static __m256i a_sq_p7_p1 __attribute__ ((aligned(32))); +static __m256i a_sq_p7_p3 __attribute__ ((aligned(32))); +static __m256i a_sq_p7_p5 __attribute__ ((aligned(32))); +static __m256i a_sq_p7_p7 __attribute__ ((aligned(32))); + +static __m256i bit_met_m7_m7 __attribute__ ((aligned(32))); +static __m256i bit_met_m7_m5 __attribute__ ((aligned(32))); +static __m256i bit_met_m7_m3 __attribute__ ((aligned(32))); +static __m256i bit_met_m7_m1 __attribute__ ((aligned(32))); +static __m256i bit_met_m7_p1 __attribute__ ((aligned(32))); +static __m256i bit_met_m7_p3 __attribute__ ((aligned(32))); +static __m256i bit_met_m7_p5 __attribute__ ((aligned(32))); +static __m256i bit_met_m7_p7 __attribute__ ((aligned(32))); +static __m256i bit_met_m5_m7 __attribute__ ((aligned(32))); +static __m256i bit_met_m5_m5 __attribute__ ((aligned(32))); +static __m256i bit_met_m5_m3 __attribute__ ((aligned(32))); +static __m256i bit_met_m5_m1 __attribute__ ((aligned(32))); +static __m256i bit_met_m5_p1 __attribute__ ((aligned(32))); +static __m256i bit_met_m5_p3 __attribute__ ((aligned(32))); +static __m256i bit_met_m5_p5 __attribute__ ((aligned(32))); +static __m256i bit_met_m5_p7 __attribute__ ((aligned(32))); +static __m256i bit_met_m3_m7 __attribute__ ((aligned(32))); +static __m256i bit_met_m3_m5 __attribute__ ((aligned(32))); +static __m256i bit_met_m3_m3 __attribute__ ((aligned(32))); +static __m256i bit_met_m3_m1 __attribute__ ((aligned(32))); +static __m256i bit_met_m3_p1 __attribute__ ((aligned(32))); +static __m256i bit_met_m3_p3 __attribute__ ((aligned(32))); +static __m256i bit_met_m3_p5 __attribute__ ((aligned(32))); +static __m256i bit_met_m3_p7 __attribute__ ((aligned(32))); +static __m256i bit_met_m1_m7 __attribute__ ((aligned(32))); +static __m256i bit_met_m1_m5 __attribute__ ((aligned(32))); +static __m256i bit_met_m1_m3 __attribute__ ((aligned(32))); +static __m256i bit_met_m1_m1 __attribute__ ((aligned(32))); +static __m256i bit_met_m1_p1 __attribute__ ((aligned(32))); +static __m256i bit_met_m1_p3 __attribute__ ((aligned(32))); +static __m256i bit_met_m1_p5 __attribute__ ((aligned(32))); +static __m256i bit_met_m1_p7 __attribute__ ((aligned(32))); +static __m256i bit_met_p1_m7 __attribute__ ((aligned(32))); +static __m256i bit_met_p1_m5 __attribute__ ((aligned(32))); +static __m256i bit_met_p1_m3 __attribute__ ((aligned(32))); +static __m256i bit_met_p1_m1 __attribute__ ((aligned(32))); +static __m256i bit_met_p1_p1 __attribute__ ((aligned(32))); +static __m256i bit_met_p1_p3 __attribute__ ((aligned(32))); +static __m256i bit_met_p1_p5 __attribute__ ((aligned(32))); +static __m256i bit_met_p1_p7 __attribute__ ((aligned(32))); +static __m256i bit_met_p3_m7 __attribute__ ((aligned(32))); +static __m256i bit_met_p3_m5 __attribute__ ((aligned(32))); +static __m256i bit_met_p3_m3 __attribute__ ((aligned(32))); +static __m256i bit_met_p3_m1 __attribute__ ((aligned(32))); +static __m256i bit_met_p3_p1 __attribute__ ((aligned(32))); +static __m256i bit_met_p3_p3 __attribute__ ((aligned(32))); +static __m256i bit_met_p3_p5 __attribute__ ((aligned(32))); +static __m256i bit_met_p3_p7 __attribute__ ((aligned(32))); +static __m256i bit_met_p5_m7 __attribute__ ((aligned(32))); +static __m256i bit_met_p5_m5 __attribute__ ((aligned(32))); +static __m256i bit_met_p5_m3 __attribute__ ((aligned(32))); +static __m256i bit_met_p5_m1 __attribute__ ((aligned(32))); +static __m256i bit_met_p5_p1 __attribute__ ((aligned(32))); +static __m256i bit_met_p5_p3 __attribute__ ((aligned(32))); +static __m256i bit_met_p5_p5 __attribute__ ((aligned(32))); +static __m256i bit_met_p5_p7 __attribute__ ((aligned(32))); +static __m256i bit_met_p7_m7 __attribute__ ((aligned(32))); +static __m256i bit_met_p7_m5 __attribute__ ((aligned(32))); +static __m256i bit_met_p7_m3 __attribute__ ((aligned(32))); +static __m256i bit_met_p7_m1 __attribute__ ((aligned(32))); +static __m256i bit_met_p7_p1 __attribute__ ((aligned(32))); +static __m256i bit_met_p7_p3 __attribute__ ((aligned(32))); +static __m256i bit_met_p7_p5 __attribute__ ((aligned(32))); +static __m256i bit_met_p7_p7 __attribute__ ((aligned(32))); + +static __m256i y0_p_1_1 __attribute__ ((aligned(32))); +static __m256i y0_p_1_3 __attribute__ ((aligned(32))); +static __m256i y0_p_1_5 __attribute__ ((aligned(32))); +static __m256i y0_p_1_7 __attribute__ ((aligned(32))); +static __m256i y0_p_3_1 __attribute__ ((aligned(32))); +static __m256i y0_p_3_3 __attribute__ ((aligned(32))); +static __m256i y0_p_3_5 __attribute__ ((aligned(32))); +static __m256i y0_p_3_7 __attribute__ ((aligned(32))); +static __m256i y0_p_5_1 __attribute__ ((aligned(32))); +static __m256i y0_p_5_3 __attribute__ ((aligned(32))); +static __m256i y0_p_5_5 __attribute__ ((aligned(32))); +static __m256i y0_p_5_7 __attribute__ ((aligned(32))); +static __m256i y0_p_7_1 __attribute__ ((aligned(32))); +static __m256i y0_p_7_3 __attribute__ ((aligned(32))); +static __m256i y0_p_7_5 __attribute__ ((aligned(32))); +static __m256i y0_p_7_7 __attribute__ ((aligned(32))); +static __m256i y0_m_1_1 __attribute__ ((aligned(32))); +static __m256i y0_m_1_3 __attribute__ ((aligned(32))); +static __m256i y0_m_1_5 __attribute__ ((aligned(32))); +static __m256i y0_m_1_7 __attribute__ ((aligned(32))); +static __m256i y0_m_3_1 __attribute__ ((aligned(32))); +static __m256i y0_m_3_3 __attribute__ ((aligned(32))); +static __m256i y0_m_3_5 __attribute__ ((aligned(32))); +static __m256i y0_m_3_7 __attribute__ ((aligned(32))); +static __m256i y0_m_5_1 __attribute__ ((aligned(32))); +static __m256i y0_m_5_3 __attribute__ ((aligned(32))); +static __m256i y0_m_5_5 __attribute__ ((aligned(32))); +static __m256i y0_m_5_7 __attribute__ ((aligned(32))); +static __m256i y0_m_7_1 __attribute__ ((aligned(32))); +static __m256i y0_m_7_3 __attribute__ ((aligned(32))); +static __m256i y0_m_7_5 __attribute__ ((aligned(32))); +static __m256i y0_m_7_7 __attribute__ ((aligned(32))); + +static __m256i xmm0 __attribute__ ((aligned(32))); +static __m256i xmm1 __attribute__ ((aligned(32))); +static __m256i xmm2 __attribute__ ((aligned(32))); +static __m256i xmm3 __attribute__ ((aligned(32))); +static __m256i xmm4 __attribute__ ((aligned(32))); +static __m256i xmm5 __attribute__ ((aligned(32))); +static __m256i xmm6 __attribute__ ((aligned(32))); +static __m256i xmm7 __attribute__ ((aligned(32))); +static __m256i xmm8 __attribute__ ((aligned(32))); + +static __m256i y0r __attribute__ ((aligned(32))); +static __m256i y0i __attribute__ ((aligned(32))); +static __m256i y1r __attribute__ ((aligned(32))); +static __m256i y1i __attribute__ ((aligned(32))); +static __m256i y2r __attribute__ ((aligned(32))); +static __m256i y2i __attribute__ ((aligned(32))); + +static __m256i logmax_num_re0 __attribute__ ((aligned(32))); +static __m256i logmax_den_re0 __attribute__ ((aligned(32))); + +static __m256i tmp_result __attribute__ ((aligned(32))); +static __m256i tmp_result2 __attribute__ ((aligned(32))); +static __m256i tmp_result3 __attribute__ ((aligned(32))); +static __m256i tmp_result4 __attribute__ ((aligned(32))); + +//============================================================================================== +// Auxiliary Makros + +// calculate interference magnitude +#define interference_abs_epi16(psi,int_ch_mag,int_mag,c1,c2) tmp_result = _mm256_cmpgt_epi16(int_ch_mag,psi); tmp_result2 = _mm256_xor_si256(tmp_result,(*(__m256i*)&ones256[0])); tmp_result = _mm256_and_si256(tmp_result,c1); tmp_result2 = _mm256_and_si256(tmp_result2,c2); int_mag = _mm256_or_si256(tmp_result,tmp_result2); + +// calculate interference magnitude +// tmp_result = ones in shorts corr. to interval 2<=x<=4, tmp_result2 interval < 2, tmp_result3 interval 46 +#define interference_abs_64qam_epi16(psi,int_ch_mag,int_two_ch_mag,int_three_ch_mag,a,c1,c3,c5,c7) tmp_result = _mm256_cmpgt_epi16(int_two_ch_mag,psi); tmp_result3 = _mm256_xor_si256(tmp_result,(*(__m256i*)&ones256[0])); tmp_result2 = _mm256_cmpgt_epi16(int_ch_mag,psi); tmp_result = _mm256_xor_si256(tmp_result,tmp_result2); tmp_result4 = _mm256_cmpgt_epi16(psi,int_three_ch_mag); tmp_result3 = _mm256_xor_si256(tmp_result3,tmp_result4); tmp_result = _mm256_and_si256(tmp_result,c3); tmp_result2 = _mm256_and_si256(tmp_result2,c1); tmp_result3 = _mm256_and_si256(tmp_result3,c5); tmp_result4 = _mm256_and_si256(tmp_result4,c7); tmp_result = _mm256_or_si256(tmp_result,tmp_result2); tmp_result3 = _mm256_or_si256(tmp_result3,tmp_result4); a = _mm256_or_si256(tmp_result,tmp_result3); + +// calculates psi_a = psi_r*a_r + psi_i*a_i +#define prodsum_psi_a_epi16(psi_r,a_r,psi_i,a_i,psi_a) tmp_result = _mm256_mulhi_epi16(psi_r,a_r); tmp_result = _mm256_slli_epi16(tmp_result,1); tmp_result2 = _mm256_mulhi_epi16(psi_i,a_i); tmp_result2 = _mm256_slli_epi16(tmp_result2,1); psi_a = _mm256_adds_epi16(tmp_result,tmp_result2); + +// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor +#define square_a_epi16(a_r,a_i,int_ch_mag,scale_factor,a_sq) tmp_result = _mm256_mulhi_epi16(a_r,a_r); tmp_result = _mm256_slli_epi16(tmp_result,1); tmp_result = _mm256_mulhi_epi16(tmp_result,scale_factor); tmp_result = _mm256_slli_epi16(tmp_result,1); tmp_result = _mm256_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = _mm256_slli_epi16(tmp_result,1); tmp_result2 = _mm256_mulhi_epi16(a_i,a_i); tmp_result2 = _mm256_slli_epi16(tmp_result2,1); tmp_result2 = _mm256_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = _mm256_slli_epi16(tmp_result2,1); tmp_result2 = _mm256_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = _mm256_slli_epi16(tmp_result2,1); a_sq = _mm256_adds_epi16(tmp_result,tmp_result2); + +// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor for 64-QAM +#define square_a_64qam_epi16(a_r,a_i,int_ch_mag,scale_factor,a_sq) tmp_result = _mm256_mulhi_epi16(a_r,a_r); tmp_result = _mm256_slli_epi16(tmp_result,1); tmp_result = _mm256_mulhi_epi16(tmp_result,scale_factor); tmp_result = _mm256_slli_epi16(tmp_result,3); tmp_result = _mm256_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = _mm256_slli_epi16(tmp_result,1); tmp_result2 = _mm256_mulhi_epi16(a_i,a_i); tmp_result2 = _mm256_slli_epi16(tmp_result2,1); tmp_result2 = _mm256_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = _mm256_slli_epi16(tmp_result2,3); tmp_result2 = _mm256_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = _mm256_slli_epi16(tmp_result2,1); a_sq = _mm256_adds_epi16(tmp_result,tmp_result2); + +void seperate_real_imag_parts(__m256i *out_re, + __m256i *out_im, + __m256i in0, + __m256i in1) +{ + __m256i tmp0; + __m256i tmp1; + + in0 = _mm256_shufflelo_epi16(in0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + in0 = _mm256_shufflehi_epi16(in0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + in0 = _mm256_shuffle_epi32(in0,0xd8); //_MM_SHUFFLE(0,2,1,3)); + + in1 = _mm256_shufflelo_epi16(in1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + in1 = _mm256_shufflehi_epi16(in1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + in1 = _mm256_shuffle_epi32(in1,0xd8); //_MM_SHUFFLE(0,2,1,3)); + + //in0 = [Re(0,1,2,3) Im(0,1,2,3) Re(4,5,6,7) Im(4,5,6,7)] + //in0 = [Re(8,9,10,11) Im(8,9,10,11) Re(12,13,14,15) Im(12,13,14,15)] + + tmp0 = _mm256_unpacklo_epi64(in0, in1); + //axmm2 = [Re(0,1,2,3) Re(8,9,10,11) Re(4,5,6,7) Re(12,13,14,15)] + tmp0 = _mm256_permute4x64_epi64(tmp0,0xd8); // Re(rho) + + tmp1 = _mm256_unpackhi_epi64(in0, in1); + //axmm3 = [Im(0,1,2,3) Im(8,9,10,11) Im(4,5,6,7) Im(12,13,14,15)] + tmp1 = _mm256_permute4x64_epi64(tmp1,0xd8); // Im(rho) + + *out_re = tmp0; + *out_im = tmp1; +} + +void qam64_qam16_avx2(short *stream0_in, + short *stream1_in, + short *ch_mag, + short *ch_mag_i, + short *stream0_out, + short *rho01, + int length + ) +{ + + /* + Author: S. Wagner + Date: 31-07-12 + + Input: + stream0_in: MF filter for 1st stream, i.e., y0=h0'*y + stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y + ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc + rho01: Channel cross correlation, i.e., h1'*h0 + + Output: + stream0_out: output LLRs for 1st stream + */ + +#if defined(__x86_64__) || defined(__i386__) + + __m256i *rho01_256i = (__m256i *)rho01; + __m256i *stream0_256i_in = (__m256i *)stream0_in; + __m256i *stream1_256i_in = (__m256i *)stream1_in; + __m256i *ch_mag_256i = (__m256i *)ch_mag; + __m256i *ch_mag_256i_i = (__m256i *)ch_mag_i; + + __m256i ONE_OVER_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(10112)); // round(1/sqrt(42)*2^16) + __m256i THREE_OVER_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(30337)); // round(3/sqrt(42)*2^16) + __m256i FIVE_OVER_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(25281)); // round(5/sqrt(42)*2^15) + __m256i SEVEN_OVER_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(17697)); // round(5/sqrt(42)*2^15) + __m256i FORTYNINE_OVER_FOUR_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(30969)); // round(49/(4*sqrt(42))*2^14), Q2.14 + __m256i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(23385)); // round(37/(4*sqrt(42))*2^14), Q2.14 + __m256i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(31601)); // round(25/(4*sqrt(42))*2^15) + __m256i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(18329)); // round(29/(4*sqrt(42))*2^15), Q2.14 + __m256i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(21489)); // round(17/(4*sqrt(42))*2^15) + __m256i NINE_OVER_FOUR_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(11376)); // round(9/(4*sqrt(42))*2^15) + __m256i THIRTEEN_OVER_FOUR_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(16433)); // round(13/(4*sqrt(42))*2^15) + __m256i FIVE_OVER_FOUR_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(6320)); // round(5/(4*sqrt(42))*2^15) + __m256i ONE_OVER_FOUR_SQRT_42 = _mm256_broadcastw_epi16(_mm_set1_epi16(1264)); // round(1/(4*sqrt(42))*2^15) + __m256i ONE_OVER_SQRT_10_Q15 = _mm256_broadcastw_epi16(_mm_set1_epi16(10362)); // round(1/sqrt(10)*2^15) + __m256i THREE_OVER_SQRT_10 = _mm256_broadcastw_epi16(_mm_set1_epi16(31086)); // round(3/sqrt(10)*2^15) + __m256i SQRT_10_OVER_FOUR = _mm256_broadcastw_epi16(_mm_set1_epi16(25905)); // round(sqrt(10)/4*2^15) + + + __m256i ch_mag_int; + __m256i ch_mag_des; + __m256i ch_mag_98_over_42_with_sigma2; + __m256i ch_mag_74_over_42_with_sigma2; + __m256i ch_mag_58_over_42_with_sigma2; + __m256i ch_mag_50_over_42_with_sigma2; + __m256i ch_mag_34_over_42_with_sigma2; + __m256i ch_mag_18_over_42_with_sigma2; + __m256i ch_mag_26_over_42_with_sigma2; + __m256i ch_mag_10_over_42_with_sigma2; + __m256i ch_mag_2_over_42_with_sigma2; + __m256i y0r_one_over_sqrt_21; + __m256i y0r_three_over_sqrt_21; + __m256i y0r_five_over_sqrt_21; + __m256i y0r_seven_over_sqrt_21; + __m256i y0i_one_over_sqrt_21; + __m256i y0i_three_over_sqrt_21; + __m256i y0i_five_over_sqrt_21; + __m256i y0i_seven_over_sqrt_21; + +#elif defined(__arm__) + +#endif + int i,j; + uint32_t len256 = (length)>>3; + + for (i=0; i>3; + + for (i=0; i. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/dlsch_modulation.c -* \brief Top-level routines for generating the PDSCH physical channel from 36-211, V8.6 2009-03 -* \author R. Knopp, F. Kaltenberger -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr -* \note -* \warning -*/ + * \brief Top-level routines for generating the PDSCH physical channel from 36-211, V8.6 2009-03 + * \author R. Knopp, F. Kaltenberger + * \date 2011 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr + * \note + * \warning + */ #include "PHY/defs.h" #include "PHY/extern.h" #include "PHY/CODING/defs.h" @@ -46,7 +38,7 @@ #include "defs.h" #include "UTIL/LOG/vcd_signal_dumper.h" -//#define DEBUG_DLSCH_MODULATION +//#define DEBUG_DLSCH_MODULATION 1 //#define is_not_pilot(pilots,re,nushift,use2ndpilots) ((pilots==0) || ((re!=nushift) && (re!=nushift+6)&&((re!=nushift+3)||(use2ndpilots==1))&&((re!=nushift+9)||(use2ndpilots==1)))?1:0) @@ -70,10 +62,36 @@ uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2nd return(0); } -uint8_t is_not_UEspecRS(int first_layer,int re) +/*uint8_t is_not_UEspecRS(int first_layer,int re) { - return(1); +}*/ +uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode) +{ + uint8_t offset = (lprime==1||lprime==3)?2:0; + if (lprime==-1) + return(1); + + switch (beamforming_mode) { + case 7: + if (Ncp == NORMAL){ + if ((re!=nushift+offset) && (re!=((nushift+4+offset)%12)) && (re!=((nushift+8+offset)%12))) + return(1); + /*else{ + LOG_I(PHY,"(is_no_UEspec_RS):lprime=%d, re=%d, nushift=%d, offset=%d\n",lprime, re,nushift,offset); + }*/ + } else { + if ((re!=nushift+offset) && (re!=((nushift+3+offset)%12)) && (re!=((nushift+6+offset)%12)) && (re!=((nushift+9+offset)%12))) + return(1); + } + break; + + default: + LOG_E(PHY,"is_not_UEspecRS() [dlsch_modulation.c] : ERROR, unknown beamforming_mode %d\n",beamforming_mode); + return(-1); + } + + return(0); } void generate_64qam_table(void) @@ -110,33 +128,433 @@ void layer1prec2A(int32_t *antenna0_sample, int32_t *antenna1_sample, uint8_t pr switch (precoding_index) { - case 0: // 1 1 - *antenna1_sample=*antenna0_sample; - break; + case 0: // 1 1 + *antenna1_sample=*antenna0_sample; + break; - case 1: // 1 -1 - ((int16_t *)antenna1_sample)[0] = -((int16_t *)antenna0_sample)[0]; - ((int16_t *)antenna1_sample)[1] = -((int16_t *)antenna0_sample)[1]; - break; + case 1: // 1 -1 + ((int16_t *)antenna1_sample)[0] = -((int16_t *)antenna0_sample)[0]; + ((int16_t *)antenna1_sample)[1] = -((int16_t *)antenna0_sample)[1]; + break; - case 2: // 1 j - ((int16_t *)antenna1_sample)[0] = -((int16_t *)antenna0_sample)[1]; - ((int16_t *)antenna1_sample)[1] = ((int16_t *)antenna0_sample)[0]; - break; + case 2: // 1 j + ((int16_t *)antenna1_sample)[0] = -((int16_t *)antenna0_sample)[1]; + ((int16_t *)antenna1_sample)[1] = ((int16_t *)antenna0_sample)[0]; + break; - case 3: // 1 -j - ((int16_t *)antenna1_sample)[0] = ((int16_t *)antenna0_sample)[1]; - ((int16_t *)antenna1_sample)[1] = -((int16_t *)antenna0_sample)[0]; - break; + case 3: // 1 -j + ((int16_t *)antenna1_sample)[0] = ((int16_t *)antenna0_sample)[1]; + ((int16_t *)antenna1_sample)[1] = -((int16_t *)antenna0_sample)[0]; + break; } // normalize /* ((int16_t *)antenna0_sample)[0] = (int16_t)((((int16_t *)antenna0_sample)[0]*ONE_OVER_SQRT2_Q15)>>15); - ((int16_t *)antenna0_sample)[1] = (int16_t)((((int16_t *)antenna0_sample)[1]*ONE_OVER_SQRT2_Q15)>>15); ((int16_t *)antenna1_sample)[0] = (int16_t)((((int16_t *)antenna1_sample)[0]*ONE_OVER_SQRT2_Q15)>>15); - ((int16_t *)antenna1_sample)[1] = (int16_t)((((int16_t *)antenna1_sample)[1]*ONE_OVER_SQRT2_Q15)>>15); */ + ((int16_t *)antenna0_sample)[1] = (int16_t)((((int16_t *)antenna0_sample)[1]*ONE_OVER_SQRT2_Q15)>>15); ((int16_t *)antenna1_sample)[0] = (int16_t)((((int16_t *)antenna1_sample)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t *)antenna1_sample)[1] = (int16_t)((((int16_t *)antenna1_sample)[1]*ONE_OVER_SQRT2_Q15)>>15); */ } -int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, +uint32_t FOUR[2]={0,4}; +uint32_t TWO[2]={0,2}; + +int allocate_REs_in_RB_no_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB, + int **txdataF, + uint32_t *jj, + uint32_t *jj2, + uint16_t re_offset, + uint32_t symbol_offset, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, + uint8_t pilots, + int16_t amp, + uint8_t precoder_index, + int16_t *qam_table_s0, + int16_t *qam_table_s1, + uint32_t *re_allocated, + uint8_t skip_dc, + uint8_t skip_half, + uint8_t lprime, + uint8_t mprime, + uint8_t Ns, + int *P1_SHIFT, + int *P2_SHIFT) +{ + + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms; + uint8_t *x0 = dlsch0_harq->e; + uint32_t qam16_table_offset_re = 0; + uint32_t qam16_table_offset_im = 0; + + uint32_t tti_offset; + uint8_t re; + uint8_t *x0p; + + if (skip_dc == 0) { + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; + re<12; + re++,x0p+=4,tti_offset++) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + } + } + else { + // 1st half of PRB + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; + re<6; + re++,x0p+=4,tti_offset++) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + } + // 2nd half of PRB + for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+7; + re<12; + re++,x0p+=4,tti_offset++) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + } + } + *re_allocated = *re_allocated + 12; + *jj=*jj + 48; + + return(0); +} + +int allocate_REs_in_RB_pilots_16QAM_siso(PHY_VARS_eNB* phy_vars_eNB, + int **txdataF, + uint32_t *jj, + uint32_t *jj2, + uint16_t re_offset, + uint32_t symbol_offset, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, + uint8_t pilots, + int16_t amp, + uint8_t precoder_index, + int16_t *qam_table_s0, + int16_t *qam_table_s1, + uint32_t *re_allocated, + uint8_t skip_dc, + uint8_t skip_half, + uint8_t lprime, + uint8_t mprime, + uint8_t Ns, + int *P1_SHIFT, + int *P2_SHIFT) +{ + + + LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->frame_parms; + + uint8_t *x0 = dlsch0_harq->e; + uint32_t qam16_table_offset_re = 0; + uint32_t qam16_table_offset_im = 0; + + uint32_t tti_offset; + uint8_t re; + uint8_t *x0p; + + + if (skip_dc == 0) { + // LOG_I(PHY,"pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]); + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; + re<12; + x0p+=4) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + // LOG_I(PHY,"pilots: re %d, tti_offset %d, P1_SHIFT %d\n",re,tti_offset,P1_SHIFT[re+1]); + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + } + else { + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; + re<6; + x0p+=4) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + + for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+6+P1_SHIFT[6]; + re<12; + x0p+=4) { + + qam16_table_offset_re=TWO[x0p[0]]; + qam16_table_offset_im=TWO[x0p[1]]; + qam16_table_offset_re+=x0p[2]; + qam16_table_offset_im+=x0p[3]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam16_table_offset_im]; + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + } + *re_allocated = *re_allocated + 10; + *jj=*jj + 40; + + return(0); +} + +int allocate_REs_in_RB_no_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB, + int **txdataF, + uint32_t *jj, + uint32_t *jj2, + uint16_t re_offset, + uint32_t symbol_offset, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, + uint8_t pilots, + int16_t amp, + uint8_t precoder_index, + int16_t *qam_table_s0, + int16_t *qam_table_s1, + uint32_t *re_allocated, + uint8_t skip_dc, + uint8_t skip_half, + uint8_t lprime, + uint8_t mprime, + uint8_t Ns, + int *P1_SHIFT, + int *P2_SHIFT) +{ + + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms; + + uint8_t *x0 = dlsch0_harq->e; + uint32_t qam64_table_offset_re = 0; + uint32_t qam64_table_offset_im = 0; + + uint32_t tti_offset; + uint8_t re; + uint8_t *x0p; + + if (skip_dc == 0) { + + x0p=&x0[*jj],tti_offset=symbol_offset+re_offset; + + /* for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; + re<12; + re+=4,x0p+=24,tti_offset+=4) {*/ + + qam64_table_offset_re=(x0p[0]<<2)|(x0p[2]<<1)|x0p[4]; + qam64_table_offset_im=(x0p[1]<<2)|(x0p[3]<<1)|x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[6]<<2)|(x0p[8]<<1)|x0p[10]; + qam64_table_offset_im=(x0p[7]<<2)|(x0p[9]<<1)|x0p[11]; + ((int16_t *)&txdataF[0][tti_offset])[2]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[3]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[12]<<2)|(x0p[14]<<1)|x0p[16]; + qam64_table_offset_im=(x0p[13]<<2)|(x0p[15]<<1)|x0p[17]; + ((int16_t *)&txdataF[0][tti_offset])[4]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[5]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[18]<<2)|(x0p[20]<<1)|x0p[22]; + qam64_table_offset_im=(x0p[19]<<2)|(x0p[21]<<1)|x0p[23]; + ((int16_t *)&txdataF[0][tti_offset])[6]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[7]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[24]<<2)|(x0p[26]<<1)|x0p[28]; + qam64_table_offset_im=(x0p[25]<<2)|(x0p[27]<<1)|x0p[29]; + ((int16_t *)&txdataF[0][tti_offset])[8]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[9]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[30]<<2)|(x0p[32]<<1)|x0p[34]; + qam64_table_offset_im=(x0p[31]<<2)|(x0p[33]<<1)|x0p[35]; + ((int16_t *)&txdataF[0][tti_offset])[10]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[11]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[36]<<2)|(x0p[38]<<1)|x0p[40]; + qam64_table_offset_im=(x0p[37]<<2)|(x0p[39]<<1)|x0p[41]; + ((int16_t *)&txdataF[0][tti_offset])[12]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[13]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[42]<<2)|(x0p[44]<<1)|x0p[46]; + qam64_table_offset_im=(x0p[43]<<2)|(x0p[45]<<1)|x0p[47]; + ((int16_t *)&txdataF[0][tti_offset])[14]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[15]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[48]<<2)|(x0p[50]<<1)|x0p[52]; + qam64_table_offset_im=(x0p[49]<<2)|(x0p[51]<<1)|x0p[53]; + ((int16_t *)&txdataF[0][tti_offset])[16]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[17]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[54]<<2)|(x0p[56]<<1)|x0p[58]; + qam64_table_offset_im=(x0p[55]<<2)|(x0p[57]<<1)|x0p[59]; + ((int16_t *)&txdataF[0][tti_offset])[18]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[19]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[60]<<2)|(x0p[62]<<1)|x0p[64]; + qam64_table_offset_im=(x0p[61]<<2)|(x0p[63]<<1)|x0p[65]; + ((int16_t *)&txdataF[0][tti_offset])[20]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[21]=qam_table_s0[qam64_table_offset_im]; + + qam64_table_offset_re=(x0p[66]<<2)|(x0p[68]<<1)|x0p[70]; + qam64_table_offset_im=(x0p[67]<<2)|(x0p[69]<<1)|x0p[71]; + ((int16_t *)&txdataF[0][tti_offset])[22]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[23]=qam_table_s0[qam64_table_offset_im]; + + + // } + } + else { + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset,re=0; + re<6; + re++,x0p+=6,tti_offset++) { + + qam64_table_offset_re=FOUR[x0p[0]]; + qam64_table_offset_im=FOUR[x0p[1]]; + qam64_table_offset_re+=TWO[x0p[2]]; + qam64_table_offset_im+=TWO[x0p[3]]; + qam64_table_offset_re+=x0p[4]; + qam64_table_offset_im+=x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + } + + for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+7; + re<12; + re++,x0p+=6,tti_offset++) { + + qam64_table_offset_re=FOUR[x0p[0]]; + qam64_table_offset_im=FOUR[x0p[1]]; + qam64_table_offset_re+=TWO[x0p[2]]; + qam64_table_offset_im+=TWO[x0p[3]]; + qam64_table_offset_re+=x0p[4]; + qam64_table_offset_im+=x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + } + } + + *re_allocated = *re_allocated + 12; + *jj=*jj + 72; + + return(0); +} + +int allocate_REs_in_RB_pilots_64QAM_siso(PHY_VARS_eNB* phy_vars_eNB, + int **txdataF, + uint32_t *jj, + uint32_t *jj2, + uint16_t re_offset, + uint32_t symbol_offset, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, + uint8_t pilots, + int16_t amp, + uint8_t precoder_index, + int16_t *qam_table_s0, + int16_t *qam_table_s1, + uint32_t *re_allocated, + uint8_t skip_dc, + uint8_t skip_half, + uint8_t lprime, + uint8_t mprime, + uint8_t Ns, + int *P1_SHIFT, + int *P2_SHIFT) +{ + + + LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->frame_parms; + + uint8_t *x0 = dlsch0_harq->e; + uint32_t qam64_table_offset_re = 0; + uint32_t qam64_table_offset_im = 0; + + uint32_t tti_offset; + uint8_t re; + uint8_t *x0p; + + + if (skip_dc == 0) { + // LOG_I(PHY,"pilots: P1_SHIFT[0] %d\n",P1_SHIFT[0]); + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; + re<12; + x0p+=6) { + + qam64_table_offset_re=FOUR[x0p[0]]; + qam64_table_offset_im=FOUR[x0p[1]]; + qam64_table_offset_re+=TWO[x0p[2]]; + qam64_table_offset_im+=TWO[x0p[3]]; + qam64_table_offset_re+=x0p[4]; + qam64_table_offset_im+=x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + // LOG_I(PHY,"pilots: re %d, tti_offset %d, P1_SHIFT %d\n",re,tti_offset,P1_SHIFT[re+1]); + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + } + else { + for (x0p=&x0[*jj],tti_offset=symbol_offset+re_offset+P1_SHIFT[0],re=P1_SHIFT[0]; + re<6; + x0p+=6) { + + qam64_table_offset_re=FOUR[x0p[0]]; + qam64_table_offset_im=FOUR[x0p[1]]; + qam64_table_offset_re+=TWO[x0p[2]]; + qam64_table_offset_im+=TWO[x0p[3]]; + qam64_table_offset_re+=x0p[4]; + qam64_table_offset_im+=x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + + for (tti_offset=symbol_offset+re_offset-frame_parms->ofdm_symbol_size+6+P1_SHIFT[6]; + re<12; + x0p+=6) { + + qam64_table_offset_re=FOUR[x0p[0]]; + qam64_table_offset_im=FOUR[x0p[1]]; + qam64_table_offset_re+=TWO[x0p[2]]; + qam64_table_offset_im+=TWO[x0p[3]]; + qam64_table_offset_re+=x0p[4]; + qam64_table_offset_im+=x0p[5]; + ((int16_t *)&txdataF[0][tti_offset])[0]=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]=qam_table_s0[qam64_table_offset_im]; + tti_offset+=P1_SHIFT[re+1]; + re+=P1_SHIFT[re+1]; + } + } + *re_allocated = *re_allocated + 10; + *jj=*jj + 60; + + return(0); +} + +int allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, int32_t **txdataF, uint32_t *jj, uint32_t *jj2, @@ -151,28 +569,34 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, int16_t *qam_table_s1, uint32_t *re_allocated, uint8_t skip_dc, - uint8_t skip_half) + uint8_t skip_half, + uint8_t lprime, + uint8_t mprime, + uint8_t Ns, + int *P1_SHIFT, + int *P2_SHIFT) { + uint8_t *x0 = NULL; + MIMO_mode_t mimo_mode = -1; - uint8_t *x0 = dlsch0_harq->e; - MIMO_mode_t mimo_mode = dlsch0_harq->mimo_mode; + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms; - int first_layer0 = dlsch0_harq->first_layer; - int Nlayers0 = dlsch0_harq->Nlayers; - uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs); + int first_layer0 = -1; //= dlsch0_harq->first_layer; + int Nlayers0 = -1; // = dlsch0_harq->Nlayers; + uint8_t mod_order0=0; + uint8_t mod_order1=0; + uint8_t precoder_index0,precoder_index1; uint8_t *x1=NULL; - uint8_t mod_order1=2; // Fill these in later for TM8-10 // int Nlayers1; // int first_layer1; + int use2ndpilots = (frame_parms->nb_antenna_ports_eNB==1)?1:0; - int use2ndpilots = (frame_parms->mode1_flag==1)?1:0; - - uint32_t tti_offset,aa; + uint32_t tti_offset; //,aa; uint8_t re; uint8_t qam64_table_offset_re = 0; uint8_t qam64_table_offset_im = 0; @@ -196,43 +620,60 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, int32_t tmp_sample1,tmp_sample2; int16_t tmp_amp=amp; int s=1; + int mprime2 = mprime,ind,ind_dword,ind_qpsk_symb; gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15); - // if (mimo_mode == LARGE_CDD) gain_lin_QPSK>>=1; - if (dlsch1_harq) { + int32_t qpsk[4]; + ((int16_t *)&qpsk[0])[0] = gain_lin_QPSK; + ((int16_t *)&qpsk[0])[1] = gain_lin_QPSK; + ((int16_t *)&qpsk[1])[0] = -gain_lin_QPSK; + ((int16_t *)&qpsk[1])[1] = gain_lin_QPSK;; + ((int16_t *)&qpsk[2])[0] = gain_lin_QPSK;; + ((int16_t *)&qpsk[2])[1] = -gain_lin_QPSK;; + ((int16_t *)&qpsk[3])[0] = -gain_lin_QPSK;; + ((int16_t *)&qpsk[3])[1] = -gain_lin_QPSK; + + if ((dlsch0_harq != NULL) && (dlsch1_harq != NULL)) { //this is for TM3, TM4 + + x0 = dlsch0_harq->e; + mimo_mode = dlsch0_harq->mimo_mode; + first_layer0 = dlsch0_harq->first_layer; + Nlayers0 = dlsch0_harq->Nlayers; + mod_order0 = dlsch0_harq->Qm; x1 = dlsch1_harq->e; // Fill these in later for TM8-10 // Nlayers1 = dlsch1_harq->Nlayers; // first_layer1 = dlsch1_harq->first_layer; - mod_order1 = get_Qm(dlsch1_harq->mcs); + mod_order1 = dlsch1_harq->Qm; + + } else if ((dlsch0_harq != NULL) && (dlsch1_harq == NULL)){ //This is for SIS0 TM1, TM6, etc + + x0 = dlsch0_harq->e; + mimo_mode = dlsch0_harq->mimo_mode; + first_layer0 = dlsch0_harq->first_layer; + Nlayers0 = dlsch0_harq->Nlayers; + mod_order0 = dlsch0_harq->Qm; + + } else if ((dlsch0_harq == NULL) && (dlsch1_harq != NULL)){ // This is for TM4 retransmission + + x0 = dlsch1_harq->e; + mimo_mode = dlsch1_harq->mimo_mode; + first_layer0 = dlsch1_harq->first_layer; + Nlayers0 = dlsch1_harq->Nlayers; + mod_order0 = dlsch1_harq->Qm; } - /* - switch (mod_order) { - case 2: - // QPSK single stream - - break; - case 4: - //16QAM Single stream - gain_lin_16QAM1 = (int16_t)(((int32_t)amp*QAM16_n1)>>15); - gain_lin_16QAM2 = (int16_t)(((int32_t)amp*QAM16_n2)>>15); - - break; - - case 6: - //64QAM Single stream - break; - default: - break; + if (dlsch0_harq != NULL){ + #ifdef DEBUG_DLSCH_MODULATION + LOG_I(PHY,"allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]); + #endif + } else{ + #ifdef DEBUG_DLSCH_MODULATION + LOG_I(PHY,"allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]); + #endif } - */ - -#ifdef DEBUG_DLSCH_MODULATION - printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]); -#endif first_re=0; last_re=12; @@ -242,18 +683,19 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, else if (skip_half==2) first_re=6; - for (re=first_re; reofdm_symbol_size+1; tti_offset = symbol_offset + re_off + re; - // check that RE is not from Cell-specific RS + //check that RE is not from Cell-specific RS if (is_not_pilot(pilots,re,frame_parms->nushift,use2ndpilots)==1) { - // printf("re %d (jj %d)\n",re,*jj); + //LOG_I(PHY,"re %d (jj %d)\n",re,*jj); if (mimo_mode == SISO) { //SISO mapping @@ -262,20 +704,16 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, switch (mod_order0) { case 2: //QPSK -// printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); - for (aa=0; aanb_antennas_tx; aa++) { - ((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i - } + + //LOG_I(PHY,"re %d %d(%d) : %d,%d => ",re,tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + ((int16_t*)&txdataF[0][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i *jj = *jj + 1; - for (aa=0; aanb_antennas_tx; aa++) { - ((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} - } + ((int16_t*)&txdataF[0][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} *jj = *jj + 1; - // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); break; case 4: //16QAM @@ -304,12 +742,8 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, *jj=*jj+1; - for (aa=0; aanb_antennas_tx; aa++) { - ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam16_table_offset_re]; - ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im]; - // ((int16_t *)&txdataF[aa][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); - // ((int16_t *)&txdataF[aa][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - } + ((int16_t *)&txdataF[0][tti_offset])[0]+=qam_table_s0[qam16_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im]; break; @@ -349,10 +783,8 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, *jj=*jj+1; - for (aa=0; aanb_antennas_tx; aa++) { - ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam64_table_offset_re];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); - ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); - } + ((int16_t *)&txdataF[0][tti_offset])[0]+=qam_table_s0[qam64_table_offset_re]; + ((int16_t *)&txdataF[0][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im]; break; @@ -361,9 +793,10 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, else if (mimo_mode == ALAMOUTI) { *re_allocated = *re_allocated + 1; - // normalization for 2 tx antennas + amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15); + switch (mod_order0) { case 2: //QPSK @@ -381,44 +814,41 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, ((int16_t*)&tmp_sample2)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj=*jj+1; + //gain_lin_QPSK (=amp/sqrt(2)) is already contains the power offset from rho_a/rho_b, so here we do not need divide by sqrt(2) anymore // normalization for 2 tx antennas - ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); - ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15); - ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); - ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0])); + ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1])); + ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0])); + ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1])); - break; + break; case 4: //16QAM // Antenna 0 position n - qam16_table_offset_re = 0; qam16_table_offset_im = 0; if (x0[*jj] == 1) qam16_table_offset_re+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam16_table_offset_im+=2; - *jj=*jj+1; if (x0[*jj] == 1) qam16_table_offset_re+=1; - *jj=*jj+1; - if (x0[*jj] == 1) qam16_table_offset_im+=1; - *jj=*jj+1; - ((int16_t *)&txdataF[0][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); - ((int16_t *)&txdataF[0][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); + //((int16_t *)&txdataF[0][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); + //((int16_t *)&txdataF[0][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); + //gain_lin_QPSK (=amp/sqrt(2)) is already contains the power offset from rho_a/rho_b, so here we do not need divide by sqrt(2) anymore + ((int16_t *)&txdataF[0][tti_offset])[0]+=(qam_table_s0[qam16_table_offset_re]); + ((int16_t *)&txdataF[0][tti_offset])[1]+=(qam_table_s0[qam16_table_offset_im]); // Antenna 1 position n Real part -> -x1* @@ -427,28 +857,27 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, if (x0[*jj] == 1) qam16_table_offset_re+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam16_table_offset_im+=2; - *jj=*jj+1; if (x0[*jj] == 1) qam16_table_offset_re+=1; - *jj=*jj+1; - if (x0[*jj] == 1) qam16_table_offset_im+=1; - *jj=*jj+1; - ((int16_t *)&txdataF[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); - ((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); + //((int16_t *)&txdataF[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); + //((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); + //qam_table_s0 already contains the power offset from rho_a/rho_b, so here we do not need divide by sqrt(2) anymore + ((int16_t *)&txdataF[1][tti_offset])[0]+=-(qam_table_s0[qam16_table_offset_re]); + ((int16_t *)&txdataF[1][tti_offset])[1]+=(qam_table_s0[qam16_table_offset_im]); + //((int16_t *)&txdataF[1][tti_offset])[0]+=-qam_table_s0[qam16_table_offset_re]; + //((int16_t *)&txdataF[1][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im]; break; @@ -460,136 +889,112 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, if (x0[*jj] == 1) qam64_table_offset_re+=4; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im+=4; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_re+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_re+=1; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im+=1; - *jj=*jj+1; - ((int16_t *)&txdataF[0][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); - ((int16_t *)&txdataF[0][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); + //((int16_t *)&txdataF[0][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); + //((int16_t *)&txdataF[0][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); + //qam_table_s0 already contains the power offset from rho_a/rho_b, so here we do not need divide by sqrt(2) anymore + ((int16_t *)&txdataF[0][tti_offset])[0]+=(qam_table_s0[qam64_table_offset_re]); + ((int16_t *)&txdataF[0][tti_offset])[1]+=(qam_table_s0[qam64_table_offset_im]); // Antenna 1 => -x1* qam64_table_offset_re = 0; qam64_table_offset_im = 0; - if (x0[*jj] == 1) qam64_table_offset_re+=4; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im+=4; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_re+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_re+=1; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im+=1; - *jj=*jj+1; - ((int16_t *)&txdataF[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); - ((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); + //((int16_t *)&txdataF[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); + //((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); + //qam_table_s0 already contains the power offset from rho_a/rho_b, so here we do not need divide by sqrt(2) anymore + ((int16_t *)&txdataF[1][tti_offset])[0]+=-(qam_table_s0[qam64_table_offset_re]); + ((int16_t *)&txdataF[1][tti_offset])[1]+=(qam_table_s0[qam64_table_offset_im]); + break; } - - // fill in the rest of the ALAMOUTI precoding + // fill in the rest of the ALAMOUTI precoding if (is_not_pilot(pilots,re + 1,frame_parms->nushift,use2ndpilots)==1) { ((int16_t *)&txdataF[0][tti_offset+1])[0] += -((int16_t *)&txdataF[1][tti_offset])[0]; //x1 ((int16_t *)&txdataF[0][tti_offset+1])[1] += ((int16_t *)&txdataF[1][tti_offset])[1]; ((int16_t *)&txdataF[1][tti_offset+1])[0] += ((int16_t *)&txdataF[0][tti_offset])[0]; //x0* ((int16_t *)&txdataF[1][tti_offset+1])[1] += -((int16_t *)&txdataF[0][tti_offset])[1]; - } else { + } + else { ((int16_t *)&txdataF[0][tti_offset+2])[0] += -((int16_t *)&txdataF[1][tti_offset])[0]; //x1 ((int16_t *)&txdataF[0][tti_offset+2])[1] += ((int16_t *)&txdataF[1][tti_offset])[1]; ((int16_t *)&txdataF[1][tti_offset+2])[0] += ((int16_t *)&txdataF[0][tti_offset])[0]; //x0* ((int16_t *)&txdataF[1][tti_offset+2])[1] += -((int16_t *)&txdataF[0][tti_offset])[1]; } - } else if (mimo_mode == LARGE_CDD) { + } + else if (mimo_mode == LARGE_CDD) { *re_allocated = *re_allocated + 1; - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { switch (mod_order0) { + default: LOG_E(PHY,"Unknown mod_order0 %d\n",mod_order0); xx0_re=xx0_im=0; break; case 2: //QPSK - // printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); xx0_re = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj = *jj + 1; xx0_im = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj = *jj + 1; - - - - // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); break; case 4: //16QAM qam16_table_offset_re0 = 0; qam16_table_offset_im0 = 0; - if (x0[*jj] == 1) qam16_table_offset_re0+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam16_table_offset_im0+=2; - *jj=*jj+1; if (x0[*jj] == 1) qam16_table_offset_re0+=1; - *jj=*jj+1; - if (x0[*jj] == 1) qam16_table_offset_im0+=1; - *jj=*jj+1; xx0_re = qam_table_s0[qam16_table_offset_re0]; @@ -605,80 +1010,61 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, if (x0[*jj] == 1) qam64_table_offset_re0+=4; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im0+=4; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_re0+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im0+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_re0+=1; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im0+=1; - *jj=*jj+1; xx0_re = qam_table_s0[qam64_table_offset_re0]; xx0_im = qam_table_s0[qam64_table_offset_im0]; - break; } switch (mod_order1) { + default: LOG_E(PHY,"Unknown mod_order1 %d\n",mod_order1); xx1_re=xx1_im=0; break; case 2: //QPSK - // printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); xx1_re = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj2 = *jj2 + 1; xx1_im = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj2 = *jj2 + 1; - // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); break; case 4: //16QAM qam16_table_offset_re1 = 0; qam16_table_offset_im1 = 0; - if (x1[*jj2] == 1) qam16_table_offset_re1+=2; - *jj2 = *jj2 + 1; - if (x1[*jj2] == 1) qam16_table_offset_im1+=2; - *jj2 = *jj2 + 1; - if (x1[*jj2] == 1) qam16_table_offset_re1+=1; - *jj2 = *jj2 + 1; - if (x1[*jj2] == 1) qam16_table_offset_im1+=1; - *jj2 = *jj2 + 1; xx1_re = qam_table_s1[qam16_table_offset_re1]; @@ -693,38 +1079,26 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, if (x1[*jj2] == 1) qam64_table_offset_re1+=4; - *jj2 = *jj2 + 1; - if (x1[*jj2] == 1) qam64_table_offset_im1+=4; - *jj2 = *jj2 + 1; - if (x1[*jj2] == 1) qam64_table_offset_re1+=2; - *jj2 = *jj2 + 1; - if (x1[*jj2] == 1) qam64_table_offset_im1+=2; - *jj2 = *jj2 + 1; - if (x1[*jj2] == 1) qam64_table_offset_re1+=1; - *jj2 = *jj2 + 1; - if (x1[*jj2] == 1) qam64_table_offset_im1+=1; - *jj2 = *jj2 + 1; xx1_re = qam_table_s1[qam64_table_offset_re1]; xx1_im = qam_table_s1[qam64_table_offset_im1]; - break; } @@ -740,69 +1114,76 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, ((int16_t *)&txdataF[0][tti_offset])[1]+=((xx0_im+xx1_im)>>1); ((int16_t *)&txdataF[1][tti_offset])[1]+=(s*((xx0_im-xx1_im)>>1)); /* - printf("CDD: xx0 (%d,%d), xx1(%d,%d), s(%d), txF[0] (%d,%d), txF[1] (%d,%d)\n", + LOG_I(PHY,"CDD: xx0 (%d,%d), xx1(%d,%d), s(%d), txF[0] (%d,%d), txF[1] (%d,%d)\n", xx0_re,xx0_im,xx1_re,xx1_im, s, ((int16_t *)&txdataF[0][tti_offset])[0],((int16_t *)&txdataF[0][tti_offset])[1], ((int16_t *)&txdataF[1][tti_offset])[0],((int16_t *)&txdataF[1][tti_offset])[1]); */ // s alternates +1/-1 for each RE s = -s; } - } else if ((mimo_mode >= UNIFORM_PRECODING11)&&(mimo_mode <= PUSCH_PRECODING1)) { - // this is for transmission modes 4-6 (1 layer) + } + else if ((mimo_mode >= UNIFORM_PRECODING11)&&(mimo_mode <= PUSCH_PRECODING1)) { + // this is for transmission modes 5-6 (1 layer) *re_allocated = *re_allocated + 1; amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15); switch (mod_order0) { - case 2: //QPSK + case 2: ((int16_t*)&tmp_sample1)[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj = *jj + 1; ((int16_t*)&tmp_sample1)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; *jj = *jj + 1; - // normalization for 2 tx antennas - ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); + //normalization for 2 tx antennas + /*((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15); - if (frame_parms->nb_antennas_tx == 2) { + if (frame_parms->nb_antenna_ports_eNB == 2) { layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index); ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); + }*/ + + // We remove ONE_OVER_SQRT2_Q15 that was coming from precoder, as now it applied in computation sqrt_rho_a, sqrt_rho_b, same in the receiver in precoder function + + ((int16_t*)&txdataF[0][tti_offset])[0] += ((int16_t*)&tmp_sample1)[0]; + ((int16_t*)&txdataF[0][tti_offset])[1] += ((int16_t*)&tmp_sample1)[1]; + + if (frame_parms->nb_antenna_ports_eNB == 2) { + layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index); + ((int16_t*)&txdataF[1][tti_offset])[0] += ((int16_t*)&tmp_sample2)[0]; + ((int16_t*)&txdataF[1][tti_offset])[1] += ((int16_t*)&tmp_sample2)[1]; } break; - case 4: //16QAM + case 4: qam16_table_offset_re = 0; qam16_table_offset_im = 0; if (x0[*jj] == 1) qam16_table_offset_re+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam16_table_offset_im+=2; - *jj=*jj+1; if (x0[*jj] == 1) qam16_table_offset_re+=1; - *jj=*jj+1; - if (x0[*jj] == 1) qam16_table_offset_im+=1; - *jj=*jj+1; - ((int16_t*)&tmp_sample1)[0] = (int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); - ((int16_t*)&tmp_sample1)[1] = (int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - ((int16_t *)&txdataF[0][tti_offset])[0] += ((int16_t*)&tmp_sample1)[0]; - ((int16_t *)&txdataF[0][tti_offset])[1] += ((int16_t*)&tmp_sample1)[1]; + ((int16_t*)&tmp_sample1)[0] = (int16_t)((qam_table_s0[qam16_table_offset_re])); + ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s0[qam16_table_offset_im])); + + ((int16_t *)&txdataF[0][tti_offset])[0] += ((int16_t*)&tmp_sample1)[0]; + ((int16_t *)&txdataF[0][tti_offset])[1] += ((int16_t*)&tmp_sample1)[1]; if (frame_parms->nb_antennas_tx == 2) { layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index); @@ -812,59 +1193,256 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, break; - case 6: //64QAM + case 6: + qam64_table_offset_re = 0; + qam64_table_offset_im = 0; + if (x0[*jj] == 1) + qam64_table_offset_re+=4; + *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_im+=4; + *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_re+=2; + *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_im+=2; + *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_re+=1; + *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_im+=1; + *jj=*jj+1; + + ((int16_t*)&tmp_sample1)[0] = (int16_t)((qam_table_s0[qam64_table_offset_re])); + ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s0[qam64_table_offset_im])); + + ((int16_t *)&txdataF[0][tti_offset])[0] += ((int16_t*)&tmp_sample1)[0]; + ((int16_t *)&txdataF[0][tti_offset])[1] += ((int16_t*)&tmp_sample1)[1]; + + if (frame_parms->nb_antenna_ports_eNB == 2) { + layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index); + ((int16_t*)&txdataF[1][tti_offset])[0] += ((int16_t*)&tmp_sample2)[0]; + ((int16_t*)&txdataF[1][tti_offset])[1] += ((int16_t*)&tmp_sample2)[1]; + } + + break; + } + } + else if ((mimo_mode >= DUALSTREAM_UNIFORM_PRECODING1)&&(mimo_mode <= DUALSTREAM_PUSCH_PRECODING)) { + // this is for transmission mode 4 (1 layer) + *re_allocated = *re_allocated + 1; + + if (precoder_index==0) { + precoder_index0 = 0; //[1 1] + precoder_index1 = 1; //[1 -1] + } + else if (precoder_index==1) { + precoder_index0 = 2; //[1 j] + precoder_index1 = 3; //[1 -j] + } + else { + LOG_I(PHY,"problem with precoder in TM4\n"); + return(-1); + } + + switch (mod_order0) { + case 2: + + ((int16_t*)&tmp_sample1)[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj = *jj + 1; + ((int16_t*)&tmp_sample1)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj = *jj + 1; + + //normalization for 2 tx antennas + // We remove ONE_OVER_2_Q15 that was coming from precoder, + //as now it applied in computation sqrt_rho_a, sqrt_rho_b, same in the receiver in precoder function + //ONE_OVER_SQRT2_Q15 remains from it + ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15); + + //LOG_I(PHY,"%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + + if (frame_parms->nb_antenna_ports_eNB == 2) { + layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index0); + ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); + } + + break; + + case 4: + + qam16_table_offset_re = 0; + qam16_table_offset_im = 0; + + if (x0[*jj] == 1) + qam16_table_offset_re+=2; + *jj=*jj+1; + if (x0[*jj] == 1) + qam16_table_offset_im+=2; + *jj=*jj+1; + + if (x0[*jj] == 1) + qam16_table_offset_re+=1; + *jj=*jj+1; + if (x0[*jj] == 1) + qam16_table_offset_im+=1; + *jj=*jj+1; + + ((int16_t*)&tmp_sample1)[0] = (int16_t)((qam_table_s0[qam16_table_offset_re])); + ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s0[qam16_table_offset_im])); + + // We remove ONE_OVER_2_Q15 that was coming from precoder, + //as now it applied in computation sqrt_rho_a, sqrt_rho_b, same in the receiver in precoder function + //ONE_OVER_SQRT2_Q15 remains from it + ((int16_t *)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t *)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15); + + if (frame_parms->nb_antenna_ports_eNB == 2) { + layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index0); + ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); + } + + break; + + case 6: qam64_table_offset_re = 0; qam64_table_offset_im = 0; if (x0[*jj] == 1) qam64_table_offset_re+=4; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im+=4; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_re+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im+=2; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_re+=1; - *jj=*jj+1; - if (x0[*jj] == 1) qam64_table_offset_im+=1; - *jj=*jj+1; - ((int16_t*)&tmp_sample1)[0] = (int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); - ((int16_t*)&tmp_sample1)[1] = (int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); - - ((int16_t *)&txdataF[0][tti_offset])[0] += ((int16_t*)&tmp_sample1)[0]; - ((int16_t *)&txdataF[0][tti_offset])[1] += ((int16_t*)&tmp_sample1)[1]; + ((int16_t*)&tmp_sample1)[0] = (int16_t)((qam_table_s0[qam64_table_offset_re])); + ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s0[qam64_table_offset_im])); + ((int16_t *)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t *)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15); if (frame_parms->nb_antennas_tx == 2) { - layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index); - ((int16_t*)&txdataF[1][tti_offset])[0] += ((int16_t*)&tmp_sample2)[0]; - ((int16_t*)&txdataF[1][tti_offset])[1] += ((int16_t*)&tmp_sample2)[1]; + layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index0); + ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); } break; + } + if (dlsch1_harq) { + switch (mod_order1) { + + case 2: + + ((int16_t*)&tmp_sample1)[0] = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj2 = *jj2 + 1; + ((int16_t*)&tmp_sample1)[1] = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj2 = *jj2 + 1; + + //normalization for 2 tx antennas + ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15); + + if (frame_parms->nb_antenna_ports_eNB== 2) { + layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index1); + ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); + } + + break; + + case 4: + + qam16_table_offset_re = 0; + qam16_table_offset_im = 0; + + if (x1[*jj2] == 1) + qam16_table_offset_re+=2; + *jj2=*jj2+1; + if (x1[*jj2] == 1) + qam16_table_offset_im+=2; + *jj2=*jj2+1; + + + if (x1[*jj2] == 1) + qam16_table_offset_re+=1; + *jj2=*jj2+1; + if (x1[*jj2] == 1) + qam16_table_offset_im+=1; + *jj2=*jj2+1; + + ((int16_t*)&tmp_sample1)[0] = (int16_t)((qam_table_s1[qam16_table_offset_re])); + ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s1[qam16_table_offset_im])); + ((int16_t *)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t *)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15); + + if (frame_parms->nb_antenna_ports_eNB == 2) { + layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index1); + ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); + } + + break; + + case 6: + + qam64_table_offset_re = 0; + qam64_table_offset_im = 0; + if (x1[*jj2] == 1) + qam64_table_offset_re+=4; + *jj2=*jj2+1; + if (x1[*jj2] == 1) + qam64_table_offset_im+=4; + *jj2=*jj2+1; + if (x1[*jj2] == 1) + qam64_table_offset_re+=2; + *jj2=*jj2+1; + if (x1[*jj2] == 1) + qam64_table_offset_im+=2; + *jj2=*jj2+1; + if (x1[*jj2] == 1) + qam64_table_offset_re+=1; + *jj2=*jj2+1; + if (x1[*jj2] == 1) + qam64_table_offset_im+=1; + *jj2=*jj2+1; + + ((int16_t*)&tmp_sample1)[0] = (int16_t)((qam_table_s1[qam64_table_offset_re])); + ((int16_t*)&tmp_sample1)[1] = (int16_t)((qam_table_s1[qam64_table_offset_im])); + ((int16_t *)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t *)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15); + + if (frame_parms->nb_antenna_ports_eNB == 2) { + layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index1); + ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15); + ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15); + } + + break; + + } } } + if (mimo_mode == ALAMOUTI) { re++; // adjacent carriers are taken care of by precoding *re_allocated = *re_allocated + 1; @@ -875,13 +1453,117 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, } } - if (mimo_mode >= TM8) { //TM8,TM9,TM10 + if (mimo_mode == TM7) { + *re_allocated = *re_allocated + 1; - if (is_not_UEspecRS(first_layer0,re)) { + if (is_not_UEspecRS(lprime,re,frame_parms->Nid_cell%3,frame_parms->Ncp,7)) { + + switch (mod_order0){ + case 2: //QPSK + + ((int16_t*)&txdataF[5][tti_offset])[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj = *jj + 1; + ((int16_t*)&txdataF[5][tti_offset])[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; + *jj = *jj + 1; + + //LOG_I(PHY,"%d(%d) : %d,%d => + //",tti_offset,*jj,((int16_t*)&tmp_sample1)[0],((int16_t*)&tmp_sample1)[1]); + break; + + case 4: //16QAM + + qam16_table_offset_re = 0; + qam16_table_offset_im = 0; + + if (x0[*jj] == 1) + qam16_table_offset_re+=2; + + *jj=*jj+1; + + if (x0[*jj] == 1) + qam16_table_offset_im+=2; + + *jj=*jj+1; + + + if (x0[*jj] == 1) + qam16_table_offset_re+=1; + + *jj=*jj+1; + + if (x0[*jj] == 1) + qam16_table_offset_im+=1; + + *jj=*jj+1; + + ((int16_t*)&txdataF[5][tti_offset])[0] = (int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); + ((int16_t*)&txdataF[5][tti_offset])[1] = (int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); + + break; + + case 6: //64QAM + + + qam64_table_offset_re = 0; + qam64_table_offset_im = 0; + + if (x0[*jj] == 1) + qam64_table_offset_re+=4; + + *jj=*jj+1; + + if (x0[*jj] == 1) + qam64_table_offset_im+=4; + + *jj=*jj+1; + + if (x0[*jj] == 1) + qam64_table_offset_re+=2; + + *jj=*jj+1; + + if (x0[*jj] == 1) + qam64_table_offset_im+=2; + + *jj=*jj+1; + + if (x0[*jj] == 1) + qam64_table_offset_re+=1; + + *jj=*jj+1; + + if (x0[*jj] == 1) + qam64_table_offset_im+=1; + + *jj=*jj+1; + + ((int16_t*)&txdataF[5][tti_offset])[0] = (int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); + ((int16_t*)&txdataF[5][tti_offset])[1] = (int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); + + break; + + } + } else { + //precoding UE spec RS + //LOG_I(PHY,"precoding UE spec RS\n"); + + ind = 3*lprime*dlsch0_harq->nb_rb+mprime2; + ind_dword = ind>>4; + ind_qpsk_symb = ind&0xf; + + txdataF[5][tti_offset] = qpsk[(phy_vars_eNB->lte_gold_uespec_port5_table[0][Ns][ind_dword]>>(2*ind_qpsk_symb))&3]; + mprime2++; + + } + + } else if (mimo_mode >= TM8) { //TM8,TM9,TM10 + //uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode) + + if (is_not_UEspecRS(lprime,re,frame_parms->nushift,frame_parms->Ncp,8)) { switch (mod_order0) { case 2: //QPSK - // printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + // LOG_I(PHY,"%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); for (int layer=first_layer0; layer<=(first_layer0+Nlayers0); layer++) { ((int16_t*)&txdataF[layer][tti_offset])[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i *jj = *jj + 1; @@ -892,7 +1574,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, break; case 4: //16QAM - if (is_not_UEspecRS(0/*layer (FIXME uninitialized!)*/,re)) { + if (is_not_UEspecRS(lprime,re,frame_parms->nushift,frame_parms->Ncp,8)) { qam16_table_offset_re = 0; qam16_table_offset_im = 0; @@ -926,7 +1608,6 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, case 6: //64QAM - qam64_table_offset_re = 0; qam64_table_offset_im = 0; @@ -970,32 +1651,30 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, } } } else if (mimo_mode>=TM9_10) { - msg("allocate_REs_in_RB() [dlsch.c] : ERROR, unknown mimo_mode %d\n",mimo_mode); + LOG_I(PHY,"allocate_REs_in_RB() [dlsch.c] : ERROR, unknown mimo_mode %d\n",mimo_mode); return(-1); } } - - } - return(0); } + int allocate_REs_in_RB_MCH(int32_t **txdataF, uint32_t *jj, - uint16_t re_offset, - uint32_t symbol_offset, - uint8_t *x0, - uint8_t l, - uint8_t mod_order, - int16_t amp, - int16_t *qam_table_s, - uint32_t *re_allocated, - uint8_t skip_dc, - LTE_DL_FRAME_PARMS *frame_parms) + uint16_t re_offset, + uint32_t symbol_offset, + uint8_t *x0, + uint8_t l, + uint8_t mod_order, + int16_t amp, + int16_t *qam_table_s, + uint32_t *re_allocated, + uint8_t skip_dc, + LTE_DL_FRAME_PARMS *frame_parms) { - uint32_t tti_offset,aa; + uint32_t tti_offset; uint8_t re; uint8_t qam64_table_offset_re = 0; uint8_t qam64_table_offset_im = 0; @@ -1007,7 +1686,7 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF, uint8_t first_re,last_re; int inc; #ifdef DEBUG_DLSCH_MODULATION - printf("allocate_re_MCH (mod %d): symbol_offset %d re_offset %d (%d), jj %d -> %d,%d, gain_lin_QPSK %d,txdataF %p\n",mod_order,symbol_offset,re_offset,skip_dc,*jj, x0[*jj], x0[1+*jj],gain_lin_QPSK,&txdataF[0][symbol_offset]); + LOG_I(PHY,"allocate_re_MCH (mod %d): symbol_offset %d re_offset %d (%d), jj %d -> %d,%d, gain_lin_QPSK %d,txdataF %p\n",mod_order,symbol_offset,re_offset,skip_dc,*jj, x0[*jj], x0[1+*jj],gain_lin_QPSK,&txdataF[0][symbol_offset]); #endif last_re=12; @@ -1028,104 +1707,98 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF, tti_offset = symbol_offset + re_off + re; - // printf("re %d (jj %d)\n",re,*jj); + //LOG_I(PHY,"re %d (jj %d)\n",re,*jj); *re_allocated = *re_allocated + 1; switch (mod_order) { - case 2: //QPSK - // printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); - for (aa=0; aanb_antennas_tx; aa++) - ((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i + case 2: //QPSK + + // LOG_I(PHY,"%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + ((int16_t*)&txdataF[4][tti_offset])[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i *jj = *jj + 1; - for (aa=0; aanb_antennas_tx; aa++) - ((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} + ((int16_t*)&txdataF[4][tti_offset])[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} *jj = *jj + 1; - // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + //LOG_I(PHY,"%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); break; - case 4: //16QAM - qam16_table_offset_re = 0; - qam16_table_offset_im = 0; + case 4: //16QAM - if (x0[*jj] == 1) - qam16_table_offset_re+=2; + qam16_table_offset_re = 0; + qam16_table_offset_im = 0; - *jj=*jj+1; + if (x0[*jj] == 1) + qam16_table_offset_re+=2; - if (x0[*jj] == 1) - qam16_table_offset_im+=2; + *jj=*jj+1; - *jj=*jj+1; + if (x0[*jj] == 1) + qam16_table_offset_im+=2; + + *jj=*jj+1; - if (x0[*jj] == 1) - qam16_table_offset_re+=1; + if (x0[*jj] == 1) + qam16_table_offset_re+=1; - *jj=*jj+1; + *jj=*jj+1; - if (x0[*jj] == 1) - qam16_table_offset_im+=1; + if (x0[*jj] == 1) + qam16_table_offset_im+=1; - *jj=*jj+1; - - for (aa=0; aanb_antennas_tx; aa++) { - ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s[qam16_table_offset_re]; - ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s[qam16_table_offset_im]; - // ((int16_t *)&txdataF[aa][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); - // ((int16_t *)&txdataF[aa][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - } - - break; - - case 6: //64QAM + *jj=*jj+1; - qam64_table_offset_re = 0; - qam64_table_offset_im = 0; + ((int16_t *)&txdataF[4][tti_offset])[0]=qam_table_s[qam16_table_offset_re];//(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); + ((int16_t *)&txdataF[4][tti_offset])[1]=qam_table_s[qam16_table_offset_im];//(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - if (x0[*jj] == 1) - qam64_table_offset_re+=4; + break; - *jj=*jj+1; + case 6: //64QAM - if (x0[*jj] == 1) - qam64_table_offset_im+=4; + qam64_table_offset_re = 0; + qam64_table_offset_im = 0; - *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_re+=4; - if (x0[*jj] == 1) - qam64_table_offset_re+=2; + *jj=*jj+1; - *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_im+=4; - if (x0[*jj] == 1) - qam64_table_offset_im+=2; + *jj=*jj+1; - *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_re+=2; - if (x0[*jj] == 1) - qam64_table_offset_re+=1; + *jj=*jj+1; - *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_im+=2; - if (x0[*jj] == 1) - qam64_table_offset_im+=1; + *jj=*jj+1; - *jj=*jj+1; + if (x0[*jj] == 1) + qam64_table_offset_re+=1; - for (aa=0; aanb_antennas_tx; aa++) { - ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s[qam64_table_offset_re];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); - ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); - } + *jj=*jj+1; - break; + if (x0[*jj] == 1) + qam64_table_offset_im+=1; + + *jj=*jj+1; + + ((int16_t *)&txdataF[4][tti_offset])[0]=qam_table_s[qam64_table_offset_re];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); + ((int16_t *)&txdataF[4][tti_offset])[1]=qam_table_s[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); + + break; } } @@ -1133,98 +1806,327 @@ int allocate_REs_in_RB_MCH(int32_t **txdataF, return(0); } -uint8_t get_pmi(uint8_t N_RB_DL,LTE_DL_eNB_HARQ_t *dlsch_harq,uint16_t rb) +uint8_t get_pmi(uint8_t N_RB_DL, MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb) { - - + /* MIMO_mode_t mode = dlsch_harq->mimo_mode; uint32_t pmi_alloc = dlsch_harq->pmi_alloc; + */ - // printf("Getting pmi for RB %d => %d\n",rb,(pmi_alloc>>((rb>>2)<<1))&3); switch (N_RB_DL) { - case 6: // 1 PRB per subband - if (mode <= PUSCH_PRECODING1) - return((pmi_alloc>>(rb<<1))&3); - else - return((pmi_alloc>>rb)&1); + case 6: // 1 PRB per subband + if (mode <= PUSCH_PRECODING1) + return((pmi_alloc>>(rb<<1))&3); + else + return((pmi_alloc>>rb)&1); - break; + break; - default: - case 25: // 4 PRBs per subband - if (mode <= PUSCH_PRECODING1) - return((pmi_alloc>>((rb>>2)<<1))&3); - else - return((pmi_alloc>>(rb>>2))&1); + default: + case 25: // 4 PRBs per subband + if (mode <= PUSCH_PRECODING1) + return((pmi_alloc>>((rb>>2)<<1))&3); + else + return((pmi_alloc>>(rb>>2))&1); - break; + break; - case 50: // 6 PRBs per subband - if (mode <= PUSCH_PRECODING1) - return((pmi_alloc>>((rb/6)<<1))&3); - else - return((pmi_alloc>>(rb/6))&1); + case 50: // 6 PRBs per subband + if (mode <= PUSCH_PRECODING1) + return((pmi_alloc>>((rb/6)<<1))&3); + else + return((pmi_alloc>>(rb/6))&1); - break; + break; - case 100: // 8 PRBs per subband - if (mode <= PUSCH_PRECODING1) - return((pmi_alloc>>((rb>>3)<<1))&3); - else - return((pmi_alloc>>(rb>>3))&1); + case 100: // 8 PRBs per subband + if (mode <= PUSCH_PRECODING1) + return((pmi_alloc>>((rb>>3)<<1))&3); + else + return((pmi_alloc>>(rb>>3))&1); - break; + break; } } -int dlsch_modulation(int32_t **txdataF, +inline int check_skip(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) __attribute__((always_inline)); +inline int check_skip(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) { + + + if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL + // PBCH + if ((subframe_offset==0) && + (rb>((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l>=(nsymb>>1)) && + (l<((nsymb>>1) + 4))) { + return(1); + } + if (frame_parms->frame_type == TDD) { // TDD + //SSS TDD + if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1)) ) { + return(1); + } + //PSS TDD + if (((subframe_offset==1) || (subframe_offset==6)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==2) ) { + return(1); + } + } else { + //PSS FDD + if (((subframe_offset==0)||(subframe_offset==5)) && + (rb>((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l==((nsymb>>1)-1)) ) { + return(1); + } + //SSS FDD + if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) { + return(1); + } + } + } + else { // even N_RB_DL + //PBCH + if ((subframe_offset==0) && + (rb>=((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) + return(1); + + if (frame_parms->frame_type == TDD) { // TDD + //SSS + if (((subframe_offset==0)|| + (subframe_offset==5)) && + (rb>=((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l==nsymb-1) ) { + return(1); + } + + //PSS + if (((subframe_offset==1)|| + (subframe_offset==6)) && + (rb>=((frame_parms->N_RB_DL>>1)-3)) && + (rb<((frame_parms->N_RB_DL>>1)+3)) && + (l==2) ) { + return(1); + } + } else { // FDD + //SSS + if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) { + return(1); + } + + //PSS + if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-1)) ) { + return(1); + } + } + } + + return(0); +} + +inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) __attribute__((always_inline)); +inline int check_skiphalf(int rb,int subframe_offset,LTE_DL_FRAME_PARMS *frame_parms,int l,int nsymb) { + + // LOG_I(PHY,"check_skiphalf : rb %d, subframe_offset %d,l %d, nsymb %d\n",rb,subframe_offset,l,nsymb); + + if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL + + // PBCH + if ((subframe_offset==0) && + (rb==((frame_parms->N_RB_DL>>1)-3)) && + (l>=(nsymb>>1)) && + (l<((nsymb>>1) + 4))) + return(1); + else if ((subframe_offset==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) + return(2); + + if (frame_parms->frame_type == TDD) { // TDD + //SSS TDD + if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==(nsymb-1))) + return(1); + else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1))) + return(2); + //PSS TDD + if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==2)) + return(1); + else if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==2)) + return(2); + } + else { // FDD + //PSS FDD + if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==((nsymb>>1)-1))) + return(1); + else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(((nsymb>>1)-1)))) + return(2); + //SSS FDD + if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && ((l==((nsymb>>1)-2)))) + return(1); + else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && ((l==(nsymb>>1)-2))) + return(2); + } + } + else { // EVEN N_RB_DL + return(0); + } + + return(0); +} + +inline int check_skip_dc(int rb,LTE_DL_FRAME_PARMS *frame_parms) __attribute__((always_inline)); +inline int check_skip_dc(int rb,LTE_DL_FRAME_PARMS *frame_parms) { + + if (((frame_parms->N_RB_DL&1) == 1) && // odd N_RB_DL, rb==N_RB_DL/2 PRB contains DC element + (rb==(frame_parms->N_RB_DL>>1))) + return(1); + else + return(0); +} + + +int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, + int32_t **txdataF, int16_t amp, uint32_t subframe_offset, - LTE_DL_FRAME_PARMS *frame_parms, uint8_t num_pdcch_symbols, LTE_eNB_DLSCH_t *dlsch0, LTE_eNB_DLSCH_t *dlsch1) { + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->frame_parms; uint8_t nsymb; - uint8_t harq_pid = dlsch0->current_harq_pid; - LTE_DL_eNB_HARQ_t *dlsch0_harq = dlsch0->harq_processes[harq_pid]; - LTE_DL_eNB_HARQ_t *dlsch1_harq; //= dlsch1->harq_processes[harq_pid]; - uint32_t i,jj,jj2,re_allocated,symbol_offset; + uint8_t harq_pid = -1; //= dlsch0->current_harq_pid; + LTE_DL_eNB_HARQ_t *dlsch0_harq = NULL; + LTE_DL_eNB_HARQ_t *dlsch1_harq = NULL; //= dlsch1->harq_processes[harq_pid]; + uint32_t i,i2,jj,jj2,re_allocated,symbol_offset; uint16_t l,rb,re_offset; uint32_t rb_alloc_ind; - uint32_t *rb_alloc = dlsch0_harq->rb_alloc; + uint32_t *rb_alloc = NULL; //=dlsch0_harq->rb_alloc; + uint8_t pilots=0; uint8_t skip_dc,skip_half; - uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs); + uint8_t mod_order0 = 0; uint8_t mod_order1 = 0; int16_t amp_rho_a, amp_rho_b; int16_t qam16_table_a0[4],qam64_table_a0[8],qam16_table_b0[4],qam64_table_b0[8]; int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8]; - int16_t *qam_table_s0,*qam_table_s1; + + int16_t *qam_table_s0=NULL,*qam_table_s1=NULL; +#if 0 + /* TODO: variable to be removed? */ + int (*allocate_REs)(PHY_VARS_eNB*, + int **, + uint32_t*, + uint32_t*, + uint16_t, + uint32_t, + LTE_DL_eNB_HARQ_t *, + LTE_DL_eNB_HARQ_t *, + uint8_t, + int16_t, + uint8_t, + int16_t *, + int16_t *, + uint32_t *, + uint8_t, + uint8_t, + uint8_t, + uint8_t, + uint8_t, + int *, + int *); +#endif + + int P1_SHIFT[13],P2_SHIFT[13]; + int offset,nushiftmod3; + + uint8_t get_pmi_temp; + + MIMO_mode_t mimo_mode = -1; + uint8_t mprime=0,Ns; + int8_t lprime=-1; + int aa=0; + + #ifdef DEBUG_DLSCH_MODULATION - uint8_t Nl0 = dlsch0_harq->Nl; + uint8_t Nl0; //= dlsch0_harq->Nl; uint8_t Nl1; +#endif + int ru_id; + RU_t *ru; + int eNB_id; + + + if ((dlsch0 != NULL) && (dlsch1 != NULL)){ + + harq_pid = dlsch0->harq_ids[subframe_offset]; + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + mimo_mode = dlsch0_harq->mimo_mode; + mod_order0 = dlsch0_harq->Qm; + rb_alloc = dlsch0_harq->rb_alloc; +#ifdef DEBUG_DLSCH_MODULATION + Nl0 = dlsch0_harq->Nl; #endif - if (dlsch1) { dlsch1_harq = dlsch1->harq_processes[harq_pid]; - mod_order1 = get_Qm(dlsch1_harq->mcs); + mod_order1 = dlsch1_harq->Qm; #ifdef DEBUG_DLSCH_MODULATION Nl1 = dlsch1_harq->Nl; #endif + + }else if ((dlsch0 != NULL) && (dlsch1 == NULL)){ + + harq_pid = dlsch0->harq_ids[subframe_offset]; + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + mimo_mode = dlsch0_harq->mimo_mode; + mod_order0 = dlsch0_harq->Qm; + rb_alloc = dlsch0_harq->rb_alloc; +#ifdef DEBUG_DLSCH_MODULATION + Nl0 = dlsch0_harq->Nl; +#endif + + dlsch1_harq = NULL; + mod_order1 = 0; +#ifdef DEBUG_DLSCH_MODULATION + Nl1 = 0; +#endif + + }else if ((dlsch0 == NULL) && (dlsch1 != NULL)){ + + harq_pid = dlsch1->harq_ids[subframe_offset]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + mimo_mode = dlsch1_harq->mimo_mode; + mod_order0 = dlsch1_harq->Qm; + rb_alloc = dlsch1_harq->rb_alloc; +#ifdef DEBUG_DLSCH_MODULATION + Nl0 = dlsch1_harq->Nl; +#endif + + dlsch0_harq = NULL; + mod_order1 = 0; +#ifdef DEBUG_DLSCH_MODULATION + Nl1 = NULL; +#endif + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_IN); nsymb = (frame_parms->Ncp==0) ? 14:12; - amp_rho_a = (int16_t)(((int32_t)amp*dlsch0->sqrt_rho_a)>>13); + if (dlsch0 != NULL){ + amp_rho_a = (int16_t)(((int32_t)amp*dlsch0->sqrt_rho_a)>>13); //amp=512 in full scale; dlsch0->sqrt_rho_a=8192in Q2.13, 1 in full scale amp_rho_b = (int16_t)(((int32_t)amp*dlsch0->sqrt_rho_b)>>13); + } else{ + amp_rho_a = (int16_t)(((int32_t)amp*dlsch1->sqrt_rho_a)>>13); + amp_rho_b = (int16_t)(((int32_t)amp*dlsch1->sqrt_rho_b)>>13); + } if (mod_order0 == 4) - for (i=0; i<4; i++) { + for (i=0;i<4; i++) { qam16_table_a0[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_a)>>15); qam16_table_b0[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_b)>>15); } @@ -1251,19 +2153,22 @@ int dlsch_modulation(int32_t **txdataF, jj2=0; re_allocated=0; - // printf("num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb); + + // LOG_I(PHY,"num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb); for (l=num_pdcch_symbols; lmimo_mode, - pmi2hex_2Ar1(dlsch0_harq->pmi_alloc), - mod_order0, - mod_order1, - rb_alloc[0], - l); + LOG_I(PHY,"Generating DLSCH (harq_pid %d,mimo %d, pmi_alloc0 %lx, mod0 %d, mod1 %d, rb_alloc[0] %d)\n", + harq_pid, + dlsch0_harq->mimo_mode, + pmi2hex_2Ar2(dlsch0_harq->pmi_alloc), + mod_order0, + mod_order1, + rb_alloc[0] + ); #endif + } if (frame_parms->Ncp==0) { // normal prefix if ((l==4)||(l==11)) @@ -1281,12 +2186,162 @@ int dlsch_modulation(int32_t **txdataF, pilots=0; } + if(mimo_mode==TM7){ //36.211 V8.6.0 2009-03 + mprime = 0; + if (frame_parms->Ncp==0) { // normal prefix + if (l==12) + lprime=3; // pilots in nushift+3, nushift+9 + else if (l==9) + lprime=2; // pilots in nushift, nushift+6 + else if (l==6) + lprime=1; // pilots in nushift+3, nushift+9 + else if (l==3) + lprime=0; // pilots in nushift, nushift+6 + else + lprime=-1; + } else { + if (l==10) + lprime=2; + else if (l==7) + lprime=1; + else if (l==4) + lprime=0; + else + lprime=-1; + } + + // mapping ue specific beamforming weights from UE specified DLSCH structure to RU beam weights for the eNB + for (ru_id=0;ru_idnum_eNB;eNB_id++){ + if (phy_vars_eNB == ru->eNB_list[eNB_id]) { + for (aa=0;aanb_tx;aa++){ + LOG_I(PHY,"ru_id:%d eNB_id:%d aa:%d memcpy(ru->beam_weights, dlsch0->ue_spec_bf_weights[ru_id][0],)\n", ru_id, eNB_id, aa); + memcpy(ru->beam_weights[eNB_id][5][aa], + dlsch0->ue_spec_bf_weights[ru_id][0], + frame_parms->ofdm_symbol_size*sizeof(int32_t)); + } + } + } + } + + } + + Ns = 2*subframe_offset+(l>=(nsymb>>1)); + + offset = (pilots==2)?3:0; + nushiftmod3 = frame_parms->nushift%3; + + if (pilots>0) { // compute pilot arrays, could be done statically if performance suffers + if (frame_parms->nb_antenna_ports_eNB == 1) { + // LOG_I(PHY,"l %d, nushift %d, offset %d\n",l,frame_parms->nushift,offset); + for (i=0,i2=0;i<12;i++) { + if ((i!=(frame_parms->nushift+offset)) && (i!=((frame_parms->nushift+6+offset)%12))) + P1_SHIFT[i2++]=1; + else + P1_SHIFT[i2++]=2; + } + P1_SHIFT[0]--; + } + else { + for (i=0,i2=0;i<12;i++) { + if ((i!=nushiftmod3) && (i!=nushiftmod3+6) && (i!=nushiftmod3+3) && (i!=nushiftmod3+9)) + P2_SHIFT[i2++]=1; + else + P2_SHIFT[i2++]=2; + } + P2_SHIFT[0]--; + } + } + P1_SHIFT[12]=1;P2_SHIFT[12]=1; + re_offset = frame_parms->first_carrier_offset; symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe_offset*nsymb)); +#if 0 + /* TODO: remove this code? */ + allocate_REs = allocate_REs_in_RB; +#endif + + switch (mod_order0) { + case 2: + qam_table_s0 = NULL; + break; + case 4: + if (pilots) { + qam_table_s0 = qam16_table_b0; +#if 0 + /* TODO: remove this code? */ + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_pilots_16QAM_siso : + allocate_REs_in_RB; +#endif + } + else { + qam_table_s0 = qam16_table_a0; +#if 0 + /* TODO: remove this code? */ + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_no_pilots_16QAM_siso : + allocate_REs_in_RB; +#endif + + } + break; + + case 6: + if (pilots) { + qam_table_s0 = qam64_table_b0; +#if 0 + /* TODO: remove this code? */ + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_pilots_64QAM_siso : + allocate_REs_in_RB; +#endif + } + else { + qam_table_s0 = qam64_table_a0; +#if 0 + /* TODO: remove this code? */ + allocate_REs = (dlsch0->harq_processes[harq_pid]->mimo_mode == SISO) ? + allocate_REs_in_RB_no_pilots_64QAM_siso : + allocate_REs_in_RB; +#endif + } + break; + + } + + switch (mod_order1) { + case 2: + qam_table_s1 = NULL; +#if 0 + /* TODO: remove this code? */ + allocate_REs = allocate_REs_in_RB; +#endif + break; + case 4: + if (pilots) { + qam_table_s1 = qam16_table_b1; + } + else { + qam_table_s1 = qam16_table_a1; + } + break; + case 6: + if (pilots) { + qam_table_s1 = qam64_table_b1; + } + else { + qam_table_s1 = qam64_table_a1; + } + break; + + } + //for (aa=0;aanb_antennas_tx;aa++) - // memset(&txdataF[aa][symbol_offset],0,frame_parms->ofdm_symbol_size<<2); - //printf("symbol_offset %d,subframe offset %d : pilots %d\n",symbol_offset,subframe_offset,pilots); + //memset(&txdataF[aa][symbol_offset],0,frame_parms->ofdm_symbol_size<<2); + //LOG_I(PHY,"symbol_offset %d,subframe offset %d : pilots %d\n",symbol_offset,subframe_offset,pilots); for (rb=0; rbN_RB_DL; rb++) { if (rb < 32) @@ -1300,177 +2355,77 @@ int dlsch_modulation(int32_t **txdataF, else rb_alloc_ind = 0; - // check for PBCH - skip_half=0; + if (check_skip(rb,subframe_offset,frame_parms,l,nsymb)==1) + rb_alloc_ind = 0; - if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL + skip_half = check_skiphalf(rb,subframe_offset,frame_parms,l,nsymb); + skip_dc = check_skip_dc(rb,frame_parms); - if (rb==(frame_parms->N_RB_DL>>1)) - skip_dc = 1; - else - skip_dc = 0; - // PBCH - if ((subframe_offset==0) && - (rb>((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) { - rb_alloc_ind = 0; - } - //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3 - if ((subframe_offset==0) && - (rb==((frame_parms->N_RB_DL>>1)-3)) && - (l>=(nsymb>>1)) && - (l<((nsymb>>1) + 4))) - skip_half=1; - else if ((subframe_offset==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) - skip_half=2; - - if (frame_parms->frame_type == TDD) { // TDD - //SSS TDD - if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1)) ) { - rb_alloc_ind = 0; - } - - //SSS TDD - if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==(nsymb-1))) - skip_half=1; - else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(nsymb-1))) - skip_half=2; - - //PSS TDD - if (((subframe_offset==1) || (subframe_offset==6)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==2) ) { - rb_alloc_ind = 0; - } - - //PSS TDD - if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==2)) - skip_half=1; - else if (((subframe_offset==1)||(subframe_offset==6)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==2)) - skip_half=2; - } else { - //PSS FDD - if (((subframe_offset==0)||(subframe_offset==5)) && - (rb>((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l==((nsymb>>1)-1)) ) { - rb_alloc_ind = 0; - } - - //PSS FDD - if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==((nsymb>>1)-1))) - skip_half=1; - else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==(((nsymb>>1)-1)))) - skip_half=2; - - //SSS FDD - if (((subframe_offset==0)||(subframe_offset==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) { - rb_alloc_ind = 0; - } - - //SSS FDD - if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && ((l==((nsymb>>1)-2)))) - skip_half=1; - else if (((subframe_offset==0)||(subframe_offset==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && ((l==(nsymb>>1)-2))) - skip_half=2; - - } - - } else { // EVEN N_RB_DL - //PBCH - if ((subframe_offset==0) && - (rb>=((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l>=nsymb>>1) && (l<((nsymb>>1) + 4))) - rb_alloc_ind = 0; - - skip_dc=0; - skip_half=0; - - if (frame_parms->frame_type == TDD) { // TDD - //SSS - if (((subframe_offset==0)|| - (subframe_offset==5)) && - (rb>=((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l==nsymb-1) ) { - rb_alloc_ind = 0; - } - - //PSS - if (((subframe_offset==1)|| - (subframe_offset==6)) && - (rb>=((frame_parms->N_RB_DL>>1)-3)) && - (rb<((frame_parms->N_RB_DL>>1)+3)) && - (l==2) ) { - rb_alloc_ind = 0; - } - } else { // FDD - //SSS - if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-2)) ) { - rb_alloc_ind = 0; - } - - //PSS - if (((subframe_offset==0)||(subframe_offset==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==((nsymb>>1)-1)) ) { - rb_alloc_ind = 0; - } - } - } - - if (dlsch0_harq->Nlayers>1) { - msg("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); - return(-1); - } - - if (dlsch1) { - if (dlsch1_harq->Nlayers>1) { - msg("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); + if (dlsch0) { + if (dlsch0_harq->Nlayers>1) { + LOG_E(PHY,"Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); return(-1); } } - if (mod_order0 == 4) - qam_table_s0 = ((pilots) ? qam16_table_b0 : qam16_table_a0); - else if (mod_order0 == 6) - qam_table_s0 = ((pilots) ? qam64_table_b0 : qam64_table_a0); - else - qam_table_s0 = NULL; - - if (mod_order1 == 4) - qam_table_s1 = ((pilots) ? qam16_table_b1 : qam16_table_a1); - else if (mod_order1 == 6) - qam_table_s1 = ((pilots) ? qam64_table_b1 : qam64_table_a1); - else - qam_table_s1 = NULL; - - if (rb_alloc_ind > 0) { - // printf("Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj); - allocate_REs_in_RB(frame_parms, - txdataF, - &jj, - &jj2, - re_offset, - symbol_offset, - dlsch0->harq_processes[harq_pid], - (dlsch1==NULL) ? NULL : dlsch1->harq_processes[harq_pid], - pilots, - ((pilots) ? amp_rho_b : amp_rho_a), - get_pmi(frame_parms->N_RB_DL,dlsch0->harq_processes[harq_pid],rb), - qam_table_s0, - qam_table_s1, - &re_allocated, - skip_dc, - skip_half); - + if (dlsch1) { + if (dlsch1_harq->Nlayers>1) { + LOG_I(PHY,"Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); + return(-1); + } } + + + if (rb_alloc_ind > 0) { + // LOG_I(PHY,"Allocated rb %d/symbol %d, skip_half %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,l,skip_half,subframe_offset,symbol_offset,re_offset,jj); + + if (dlsch0 != NULL) { + get_pmi_temp = get_pmi(frame_parms->N_RB_DL, + dlsch0->harq_processes[harq_pid]->mimo_mode, + dlsch0->harq_processes[harq_pid]->pmi_alloc, + rb); + } else + get_pmi_temp = get_pmi(frame_parms->N_RB_DL, + dlsch1->harq_processes[harq_pid]->mimo_mode, + dlsch1->harq_processes[harq_pid]->pmi_alloc, + rb); + + + allocate_REs_in_RB(phy_vars_eNB, + txdataF, + &jj, + &jj2, + re_offset, + symbol_offset, + (dlsch0 == NULL) ? NULL : dlsch0->harq_processes[harq_pid], + (dlsch1 == NULL) ? NULL : dlsch1->harq_processes[harq_pid], + pilots, + ((pilots) ? amp_rho_b : amp_rho_a), + get_pmi_temp, + qam_table_s0, + qam_table_s1, + &re_allocated, + skip_dc, + skip_half, + lprime, + mprime, + Ns, + P1_SHIFT, + P2_SHIFT); + + if ((mimo_mode == TM7) && (lprime>=0)) + mprime +=3+frame_parms->Ncp; + } + else { + // LOG_I(PHY,"Unallocated rb %d/symbol %d, re_offset %d, jj %d\n",rb,l,re_offset,jj); + } re_offset+=12; // go to next RB + // check if we crossed the symbol boundary and skip DCs - // check if we crossed the symbol boundary and skip DC if (re_offset >= frame_parms->ofdm_symbol_size) { if (skip_dc == 0) //even number of RBs (doesn't straddle DC) re_offset=1; @@ -1478,13 +2433,14 @@ int dlsch_modulation(int32_t **txdataF, re_offset=7; // odd number of RBs } } - } - - #ifdef DEBUG_DLSCH_MODULATION - msg("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset)); + if (dlsch0 != NULL){ + LOG_I(PHY,"generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset,1)); + }else{ + LOG_I(PHY,"generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch1_harq->nb_rb,dlsch1_harq->rb_alloc,mod_order1,Nl1,2,0,subframe_offset,1)); + } #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_OUT); @@ -1492,6 +2448,148 @@ int dlsch_modulation(int32_t **txdataF, return (re_allocated); } + +int dlsch_modulation_SIC(int32_t **sic_buffer, + uint32_t subframe_offset, + LTE_DL_FRAME_PARMS *frame_parms, + uint8_t num_pdcch_symbols, + LTE_eNB_DLSCH_t *dlsch0, + int G) +{ + + AssertFatal(1==0,"This function needs to be reintegrated ...\n"); + uint8_t harq_pid = -1;//dlsch0->current_harq_pid; + LTE_DL_eNB_HARQ_t *dlsch0_harq = dlsch0->harq_processes[harq_pid]; + uint32_t i,jj,re_allocated=0; + uint8_t mod_order0 = dlsch0_harq->Qm; + uint8_t *x0 = dlsch0_harq->e; + uint8_t qam64_table_offset_re = 0; + uint8_t qam64_table_offset_im = 0; + uint8_t qam16_table_offset_re = 0; + uint8_t qam16_table_offset_im = 0; + int16_t gain_lin_QPSK; + #ifdef DEBUG_DLSCH_MODULATION + uint8_t Nl0 = dlsch0_harq->Nl; + uint8_t Nl1; +#endif + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_IN); + + gain_lin_QPSK = (int16_t)((ONE_OVER_SQRT2_Q15)); + + jj = 0; + i = 0; + while (jj <= G-1) { + + re_allocated = re_allocated + 1; + + switch (mod_order0) { + case 2: //QPSK + + ((int16_t*)&sic_buffer[0][i])[0] = (x0[jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i + + jj = jj + 1; + + ((int16_t*)&sic_buffer[0][i])[1] = (x0[jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} + + jj = jj + 1; + + //LOG_I(PHY,"recon %d,%d\n",((int16_t*)&sic_buffer[0][i])[0],((int16_t*)&sic_buffer[0][i])[1]); + i++; + + break; + + case 4: //16QAM + + qam16_table_offset_re = 0; + qam16_table_offset_im = 0; + + if (x0[jj] == 1) + qam16_table_offset_re+=2; + + jj=jj+1; + + if (x0[jj] == 1) + qam16_table_offset_im+=2; + + jj=jj+1; + + + if (x0[jj] == 1) + qam16_table_offset_re+=1; + + jj=jj+1; + + if (x0[jj] == 1) + qam16_table_offset_im+=1; + + jj=jj+1; + + + ((int16_t *)&sic_buffer[0][i])[0]+=qam16_table[qam16_table_offset_re]; + ((int16_t *)&sic_buffer[0][i])[1]+=qam16_table[qam16_table_offset_im]; + + i++; + + break; + + case 6: + + qam64_table_offset_re = 0; + qam64_table_offset_im = 0; + + if (x0[jj] == 1) + qam64_table_offset_re+=4; + + jj=jj+1; + + if (x0[jj] == 1) + qam64_table_offset_im+=4; + + jj=jj+1; + + if (x0[jj] == 1) + qam64_table_offset_re+=2; + + jj=jj+1; + + if (x0[jj] == 1) + qam64_table_offset_im+=2; + + jj=jj+1; + + if (x0[jj] == 1) + qam64_table_offset_re+=1; + + jj=jj+1; + + if (x0[jj] == 1) + qam64_table_offset_im+=1; + + jj=jj+1; + + + ((int16_t *)&sic_buffer[0][i])[0]+=(qam64_table[qam64_table_offset_re])>>1;//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15); + ((int16_t *)&sic_buffer[0][i])[1]+=(qam64_table[qam64_table_offset_im])>>1;//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15); + + i++; + + break; + } + + } + + +#ifdef DEBUG_DLSCH_MODULATION + LOG_I(PHY,"generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset,1/*transmission mode*/)); +#endif + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_OUT); + + return (re_allocated); +} + + int mch_modulation(int32_t **txdataF, int16_t amp, uint32_t subframe_offset, @@ -1502,7 +2600,7 @@ int mch_modulation(int32_t **txdataF, uint32_t i,jj,re_allocated,symbol_offset; uint16_t l,rb,re_offset; uint8_t skip_dc=0; - uint8_t mod_order = get_Qm(dlsch->harq_processes[0]->mcs); + uint8_t mod_order = dlsch->harq_processes[0]->Qm; int16_t qam16_table_a[4],qam64_table_a[8];//,qam16_table_b[4],qam64_table_b[8]; int16_t *qam_table_s; @@ -1521,11 +2619,11 @@ int mch_modulation(int32_t **txdataF, jj=0; re_allocated=0; - // printf("num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb); + // LOG_I(PHY,"num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb); for (l=2; lfirst_carrier_offset; @@ -1536,14 +2634,13 @@ int mch_modulation(int32_t **txdataF, if ((frame_parms->N_RB_DL&1) == 1) { // ODD N_RB_DL - if (rb==(frame_parms->N_RB_DL>>1)) + if (rb==(frame_parms->N_RB_DL>>1)) skip_dc = 1; else skip_dc = 0; } - if (mod_order == 4) qam_table_s = qam16_table_a; else if (mod_order == 6) @@ -1551,7 +2648,7 @@ int mch_modulation(int32_t **txdataF, else qam_table_s = NULL; - // printf("Allocated rb %d, subframe_offset %d,amp %d\n",rb,subframe_offset,amp); + //LOG_I(PHY,"Allocated rb %d, subframe_offset %d,amp %d\n",rb,subframe_offset,amp); allocate_REs_in_RB_MCH(txdataF, &jj, re_offset, @@ -1567,7 +2664,6 @@ int mch_modulation(int32_t **txdataF, re_offset+=12; // go to next RB - // check if we crossed the symbol boundary and skip DC if (re_offset >= frame_parms->ofdm_symbol_size) { if (skip_dc == 0) //even number of RBs (doesn't straddle DC) @@ -1578,12 +2674,8 @@ int mch_modulation(int32_t **txdataF, } } - - - - #ifdef DEBUG_DLSCH_MODULATION - msg("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset)); + LOG_I(PHY,"generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset,1/*transmission mode*/)); #endif return (re_allocated); diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c index dd971748cb..d90f4c66d2 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/dlsch_scrambling.c * \brief Routines for the scrambling procedure of the PDSCH physical channel from 36-211, V8.6 2009-03 @@ -48,54 +40,150 @@ #include "PHY/extern.h" #include "UTIL/LOG/vcd_signal_dumper.h" +static inline unsigned int lte_gold_scram(unsigned int *x1, unsigned int *x2, unsigned char reset) __attribute__((always_inline)); +static inline unsigned int lte_gold_scram(unsigned int *x1, unsigned int *x2, unsigned char reset) +{ + int n; + + if (reset) { + *x1 = 1+ (1<<31); + *x2=*x2 ^ ((*x2 ^ (*x2>>1) ^ (*x2>>2) ^ (*x2>>3))<<31); + + // skip first 50 double words (1600 bits) + // printf("n=0 : x1 %x, x2 %x\n",x1,x2); + for (n=1; n<50; n++) { + *x1 = (*x1>>1) ^ (*x1>>4); + *x1 = *x1 ^ (*x1<<31) ^ (*x1<<28); + *x2 = (*x2>>1) ^ (*x2>>2) ^ (*x2>>3) ^ (*x2>>4); + *x2 = *x2 ^ (*x2<<31) ^ (*x2<<30) ^ (*x2<<29) ^ (*x2<<28); + } + } + + *x1 = (*x1>>1) ^ (*x1>>4); + *x1 = *x1 ^ (*x1<<31) ^ (*x1<<28); + *x2 = (*x2>>1) ^ (*x2>>2) ^ (*x2>>3) ^ (*x2>>4); + *x2 = *x2 ^ (*x2<<31) ^ (*x2<<30) ^ (*x2<<29) ^ (*x2<<28); + return(*x1^*x2); + // printf("n=%d : c %x\n",n,x1^x2); + +} + void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, int mbsfn_flag, LTE_eNB_DLSCH_t *dlsch, + int harq_pid, int G, uint8_t q, + uint16_t frame, uint8_t Ns) { - int i,j,k=0; + int n; + // uint8_t reset; uint32_t x1, x2, s=0; - uint8_t *e=dlsch->harq_processes[dlsch->current_harq_pid]->e; + uint8_t *dlsch_e=dlsch->harq_processes[harq_pid]->e; + uint8_t *e=dlsch_e; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_SCRAMBLING, VCD_FUNCTION_IN); +#ifdef Rel14 + // Rule for accumulation of subframes for BL/CE UEs + uint8_t Nacc=4; + uint16_t j0,j,idelta; + uint16_t i = (Ns>>1) + (10*frame); + uint16_t i0 = dlsch->i0; + + if (dlsch->sib1_br_flag==1) Nacc=1; + else if (dlsch->rnti == 0xFFFF || dlsch->rnti == 0xFFFE) Nacc = (frame_parms->frame_type == TDD) ? 10 : 4; + // Note: above SC-RNTI will also have to be added when/if implemented + else if (dlsch->CEmode == CEmodeA) Nacc=1; + else if (dlsch->CEmode == CEmodeB) Nacc = (frame_parms->frame_type == TDD) ? 10 : 4; + + if (frame_parms->frame_type == FDD || Nacc == 1) idelta = 0; + else idelta = Nacc-2; + + j0 = (i0+idelta)/Nacc; + j = (i - i0)/Nacc; +#endif + // reset = 1; // x1 is set in lte_gold_generic if (mbsfn_flag == 0) { - x2 = (dlsch->rnti<<14) + (q<<13) + ((Ns>>1)<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1 +#ifdef Rel14 + if (dlsch->i0 != 0xFFFF) { + // rule for BL/CE UEs from Section 6.3.1 in 36.211 + x2= (dlsch->rnti<<14) + (q<<13) + ((((j0+j)*Nacc)%10)<<9) + frame_parms->Nid_cell; + if ((frame&1023) < 200) LOG_D(PHY,"Scrambling init for (i0 %d, i %d, j0 %d, j %d, Nacc %d) => x2 %d\n",i0,i,j0,j,Nacc,x2); + } + else +#endif + x2 = (dlsch->rnti<<14) + (q<<13) + ((Ns>>1)<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1 for PDSCH } else { - x2 = ((Ns>>1)<<9) + frame_parms->Nid_cell_mbsfn; //this is c_init in 36.211 Sec 6.3.1 + x2 = ((Ns>>1)<<9) + frame_parms->Nid_cell_mbsfn; //this is c_init in 36.211 Sec 6.3.1 for PMCH } #ifdef DEBUG_SCRAMBLING - printf("scrambling: rnti %x, q %d, Ns %d, Nid_cell %d, length %d\n",dlsch->rnti,q,Ns,frame_parms->Nid_cell, G); + printf("scrambling: i0 %d rnti %x, q %d, Ns %d, Nid_cell %d, G %d x2 %x\n",dlsch->i0,dlsch->rnti,q,Ns,frame_parms->Nid_cell, G, x2); #endif - s = lte_gold_generic(&x1, &x2, 1); + s = lte_gold_scram(&x1, &x2, 1); - for (i=0; i<(1+(G>>5)); i++) { + for (n=0; n<(1+(G>>5)); n++) { - for (j=0; j<32; j++,k++) { #ifdef DEBUG_SCRAMBLING - printf("scrambling %d : %d => ",k,e[k]); + printf("scrambling %d : %d => ",k,e[k]); #endif - e[k] = (e[k]&1) ^ ((s>>j)&1); -#ifdef DEBUG_SCRAMBLING - printf("%d\n",e[k]); -#endif - } - s = lte_gold_generic(&x1, &x2, 0); + + e[0] = (e[0]) ^ (s&1); + e[1] = (e[1]) ^ ((s>>1)&1); + e[2] = (e[2]) ^ ((s>>2)&1); + e[3] = (e[3]) ^ ((s>>3)&1); + e[4] = (e[4]) ^ ((s>>4)&1); + e[5] = (e[5]) ^ ((s>>5)&1); + e[6] = (e[6]) ^ ((s>>6)&1); + e[7] = (e[7]) ^ ((s>>7)&1); + e[8] = (e[8]) ^ ((s>>8)&1); + e[9] = (e[9]) ^ ((s>>9)&1); + e[10] = (e[10]) ^ ((s>>10)&1); + e[11] = (e[11]) ^ ((s>>11)&1); + e[12] = (e[12]) ^ ((s>>12)&1); + e[13] = (e[13]) ^ ((s>>13)&1); + e[14] = (e[14]) ^ ((s>>14)&1); + e[15] = (e[15]) ^ ((s>>15)&1); + e[16] = (e[16]) ^ ((s>>16)&1); + e[17] = (e[17]) ^ ((s>>17)&1); + e[18] = (e[18]) ^ ((s>>18)&1); + e[19] = (e[19]) ^ ((s>>19)&1); + e[20] = (e[20]) ^ ((s>>20)&1); + e[21] = (e[21]) ^ ((s>>21)&1); + e[22] = (e[22]) ^ ((s>>22)&1); + e[23] = (e[23]) ^ ((s>>23)&1); + e[24] = (e[24]) ^ ((s>>24)&1); + e[25] = (e[25]) ^ ((s>>25)&1); + e[26] = (e[26]) ^ ((s>>26)&1); + e[27] = (e[27]) ^ ((s>>27)&1); + e[28] = (e[28]) ^ ((s>>28)&1); + e[29] = (e[29]) ^ ((s>>29)&1); + e[30] = (e[30]) ^ ((s>>30)&1); + e[31] = (e[31]) ^ ((s>>31)&1); + + // This is not faster for some unknown reason + // ((__m128i *)e)[0] = _mm_xor_si128(((__m128i *)e)[0],((__m128i *)scrambling_lut)[s&65535]); + // ((__m128i *)e)[1] = _mm_xor_si128(((__m128i *)e)[1],((__m128i *)scrambling_lut)[s>>16]); +#ifdef DEBUG_SCRAMBLING + printf("%d\n",e[k]); +#endif + + + s = lte_gold_scram(&x1, &x2, 0); + e += 32; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_SCRAMBLING, VCD_FUNCTION_OUT); } - void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, int mbsfn_flag, LTE_UE_DLSCH_t *dlsch, @@ -118,9 +206,9 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, x2 = ((Ns>>1)<<9) + frame_parms->Nid_cell_mbsfn; //this is c_init in 36.211 Sec 6.3.1 #ifdef DEBUG_SCRAMBLING - printf("unscrambling: rnti %x, q %d, Ns %d, Nid_cell %d length %d\n",dlsch->rnti,q,Ns,frame_parms->Nid_cell,G); + printf("unscrambling: rnti %x, q %d, Ns %d, Nid_cell %d G %d, x2 %x\n",dlsch->rnti,q,Ns,frame_parms->Nid_cell,G,x2); #endif - s = lte_gold_generic(&x1, &x2, 1); + s = lte_gold_scram(&x1, &x2, 1); for (i=0; i<(1+(G>>5)); i++) { for (j=0; j<32; j++,k++) { @@ -133,6 +221,30 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, #endif } - s = lte_gold_generic(&x1, &x2, 0); + s = lte_gold_scram(&x1, &x2, 0); + } +} + +void init_unscrambling_lut() { + + uint32_t s; + int i=0,j; + + for (s=0;s<=65535;s++) { + for (j=0;j<16;j++) { + unscrambling_lut[i++] = (int16_t)((((s>>j)&1)<<1)-1); + } + } +} + +void init_scrambling_lut() { + + uint32_t s; + int i=0,j; + + for (s=0;s<=65535;s++) { + for (j=0;j<16;j++) { + scrambling_lut[i++] = (uint8_t)((s>>j)&1); + } } } diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h index 4a5520c371..5480338728 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ unsigned int dlsch_tbs25[27][25] = {{16,32,56,88,120,152,176,208,224,256,288,328,344,376,392,424,456,488,504,536,568,600,616,648,680}, {24,56,88,144,176,208,224,256,328,344,376,424,456,488,520,568,600,632,680,712,744,776,808,872,904}, {32,72,144,176,208,256,296,328,376,424,472,520,568,616,648,696,744,776,840,872,936,968,1000,1064,1096}, diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h index b2c32b8643..9673ba15b5 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define TBStable_rowCnt 27 /** \brief "Transport block size table" diff --git a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c index 097bcdd691..a432cde4e4 100644 --- a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/drs_modulation.c * \brief Top-level routines for generating the Demodulation Reference Signals from 36-211, V8.6 2009-03 @@ -42,7 +34,8 @@ #include "PHY/sse_intrin.h" //#define DEBUG_DRS -int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, +int generate_drs_pusch(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, uint8_t eNB_id, short amp, unsigned int subframe, @@ -62,75 +55,56 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, int16_t alpha_im[12] = {0, 16383, 28377, 32767, 28377, 16383, 0,-16384,-28378,-32768,-28378,-16384}; uint8_t cyclic_shift,cyclic_shift0,cyclic_shift1; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - int32_t *txdataF = phy_vars_ue->lte_ue_common_vars.txdataF[ant]; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + int32_t *txdataF = ue->common_vars.txdataF[ant]; uint32_t u,v,alpha_ind; uint32_t u0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]; uint32_t u1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]; uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1]; uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; int32_t ref_re,ref_im; - uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_ue->frame_tx,subframe); + uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe); cyclic_shift0 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2 + - phy_vars_ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]+ - ((phy_vars_ue->ulsch_ue[0]->cooperation_flag==2)?10:0)+ + ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 + + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]+ + ((ue->ulsch[0]->cooperation_flag==2)?10:0)+ ant*6) % 12; - // printf("PUSCH.cyclicShift %d, n_DMRS2 %d, nPRS %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,phy_vars_ue->ulsch_ue[eNB_id]->n_DMRS2,phy_vars_ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]); + // printf("PUSCH.cyclicShift %d, n_DMRS2 %d, nPRS %d\n",frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,ue->ulsch[eNB_id]->n_DMRS2,ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]); cyclic_shift1 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2 + - phy_vars_ue->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+1]+ - ((phy_vars_ue->ulsch_ue[0]->cooperation_flag==2)?10:0)+ + ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 + + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+1]+ + ((ue->ulsch[0]->cooperation_flag==2)?10:0)+ ant*6) % 12; // cyclic_shift0 = 0; // cyclic_shift1 = 0; Msc_RS = 12*nb_rb; -#ifdef USER_MODE Msc_idx_ptr = (uint16_t*) bsearch(&Msc_RS, dftsizes, 33, sizeof(uint16_t), compareints); if (Msc_idx_ptr) Msc_RS_idx = Msc_idx_ptr - dftsizes; else { - msg("generate_drs_pusch: index for Msc_RS=%d not found\n",Msc_RS); + LOG_I(PHY,"generate_drs_pusch: index for Msc_RS=%d not found\n",Msc_RS); return(-1); } -#else - uint8_t b; - - for (b=0; b<33; b++) - if (Msc_RS==dftsizes[b]) - Msc_RS_idx = b; - -#endif -#ifdef DEBUG_DRS - msg("[PHY] drs_modulation: Msc_RS = %d, Msc_RS_idx = %d,cyclic_shift %d, u0 %d, v0 %d, u1 %d, v1 %d,cshift0 %d,cshift1 %d\n",Msc_RS, Msc_RS_idx,cyclic_shift,u0,v0,u1,v1,cyclic_shift0,cyclic_shift1); - -#endif - - for (l = (3 - frame_parms->Ncp),u=u0,v=v0,cyclic_shift=cyclic_shift0; lsymbols_per_tti; l += (7 - frame_parms->Ncp),u=u1,v=v1,cyclic_shift=cyclic_shift1) { - drs_offset = 0; // msg("drs_modulation: Msc_RS = %d, Msc_RS_idx = %d\n",Msc_RS, Msc_RS_idx); + drs_offset = 0; // printf("drs_modulation: Msc_RS = %d, Msc_RS_idx = %d\n",Msc_RS, Msc_RS_idx); + -#ifdef IFFT_FPGA_UE - re_offset = frame_parms->N_RB_DL*12/2; - subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->N_RB_UL*12; - symbol_offset = subframe_offset + frame_parms->N_RB_UL*12*l; -#else re_offset = frame_parms->first_carrier_offset; subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->ofdm_symbol_size; symbol_offset = subframe_offset + frame_parms->ofdm_symbol_size*l; -#endif + #ifdef DEBUG_DRS - msg("generate_drs_pusch: symbol_offset %d, subframe offset %d, cyclic shift %d\n",symbol_offset,subframe_offset,cyclic_shift); + printf("generate_drs_pusch: symbol_offset %d, subframe offset %d, cyclic shift %d\n",symbol_offset,subframe_offset,cyclic_shift); #endif alpha_ind = 0; @@ -139,60 +113,9 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, if ((rb >= first_rb) && (rb<(first_rb+nb_rb))) { #ifdef DEBUG_DRS - msg("generate_drs_pusch: doing RB %d, re_offset=%d, drs_offset=%d,cyclic shift %d\n",rb,re_offset,drs_offset,cyclic_shift); + printf("generate_drs_pusch: doing RB %d, re_offset=%d, drs_offset=%d,cyclic shift %d\n",rb,re_offset,drs_offset,cyclic_shift); #endif -#ifdef IFFT_FPGA_UE - - if (cyclic_shift == 0) { - for (k=0; k<12; k++) { - if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 1; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 2; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 3; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 4; - - re_offset++; - drs_offset++; - - if (re_offset >= frame_parms->N_RB_UL*12) - re_offset=0; - } - } else if(cyclic_shift == 6 ) { - for (k=0; k<12; k++) { - if(k%2 == 0) { - if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 4; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 3; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 2; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 1; - } else { - if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 1; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] >= 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 2; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] >= 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 3; - else if ((ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1] < 0) && (ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1] < 0)) - txdataF[symbol_offset+re_offset] = (int32_t) 4; - } - - re_offset++; - drs_offset++; - - if (re_offset >= frame_parms->N_RB_UL*12) - re_offset=0; - } - } - -#else //IFFT_FPGA_UE - for (k=0; k<12; k++) { ref_re = (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][drs_offset<<1]; ref_im = (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][(drs_offset<<1)+1]; @@ -211,7 +134,7 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, alpha_ind-=12; #ifdef DEBUG_DRS - msg("symbol_offset %d, alpha_ind %d , re_offset %d : (%d,%d)\n", + printf("symbol_offset %d, alpha_ind %d , re_offset %d : (%d,%d)\n", symbol_offset, alpha_ind, re_offset, @@ -226,21 +149,10 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, re_offset = 0; } -#endif // IFFT_FPGA_UE } else { re_offset+=12; // go to next RB // check if we crossed the symbol boundary and skip DC -#ifdef IFFT_FPGA_UE - - if (re_offset >= frame_parms->N_RB_DL*12) { - if (frame_parms->N_RB_DL&1) // odd number of RBs - re_offset=6; - else // even number of RBs (doesn't straddle DC) - re_offset=0; - } - -#else if (re_offset >= frame_parms->ofdm_symbol_size) { if (frame_parms->N_RB_DL&1) // odd number of RBs @@ -249,7 +161,7 @@ int generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, re_offset=0; } -#endif + } } } diff --git a/openair1/PHY/LTE_TRANSPORT/edci.c b/openair1/PHY/LTE_TRANSPORT/edci.c new file mode 100755 index 0000000000..37b1c56349 --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/edci.c @@ -0,0 +1,201 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/LTE_TRANSPORT/dci.c +* \brief Implements PDCCH physical channel TX/RX procedures (36.211) and DCI encoding/decoding (36.212/36.213). Current LTE compliance V8.6 2009-03. +* \author R. Knopp +* \date 2011 +* \version 0.1 +* \company Eurecom +* \email: knopp@eurecom.fr +* \note +* \warning +*/ +#include +#include +#include +#include "PHY/defs.h" +#include "PHY/extern.h" +#include "SCHED/defs.h" +#include "SIMULATION/TOOLS/defs.h" // for taus +#include "PHY/sse_intrin.h" + +#include "assertions.h" +#include "T.h" +#include "UTIL/LOG/log.h" + +//#define DEBUG_DCI_ENCODING 1 +//#define DEBUG_DCI_DECODING 1 +//#define DEBUG_PHY + +#ifdef Rel14 +void generate_edci_top(PHY_VARS_eNB *eNB, int frame, int subframe) { + +} + +void mpdcch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, + mDCI_ALLOC_t *mdci, + uint16_t i, + uint8_t *e, + uint32_t length) +{ + int n; + uint8_t reset; + uint32_t x1, x2, s=0; + uint8_t Nacc=4; + uint16_t j0,j,idelta; + uint16_t i0 = mdci->i0; + + // Note: we could actually not do anything if i-i0 < Nacc, save it for later + + reset = 1; + // x1 is set in lte_gold_generic + + if ((mdci->rnti == 0xFFFE) || + (mdci->ce_mode == 2)) // CEModeB Note: also for mdci->rnti==SC_RNTI + Nacc=frame_parms->frame_type == FDD ? 4 : 10; + else Nacc=1; + + if (frame_parms->frame_type == FDD || Nacc == 1) idelta = 0; + else idelta = Nacc-2; + + j0 = (i0+idelta)/Nacc; + j = (i - i0)/Nacc; + + + // rule for BL/CE UEs from Section 6.8.B2 in 36.211 + x2= ((((j0+j)*Nacc)%10)<<9) + mdci->dmrs_scrambling_init; + + for (n=0; n>(i&0x1f))&1); + } +} + +// this table is the allocation of modulated MPDCCH format 5 symbols to REs +// There are in total 36 REs/ECCE * 4 ECCE/PRB_pair = 144 REs in total/PRB_pair, total is 168 REs => 24 REs for DMRS +// For format 5 there are 6 PRB pairs => 864 REs for 24 total ECCE +static uint16_t mpdcch5tab[864]; + +void init_mpdcch5tab_normal_regular_subframe_evenNRBDL(PHY_VARS_eNB *eNB) { + int l,k,kmod,re; + + LOG_I(PHY,"Inititalizing mpdcch5tab for normal prefix, normal prefix, no PSS/SSS/PBCH, even N_RB_DL\n"); + for (l=0,re=0;l<14;l++) { + for (k=0;k<72;k++){ + kmod = k % 12; + if (((l!=5) && (l!=6) && (l!=12) && (l!=13)) || + (((l==5)||(l==6)||(l==12)||(l==13))&&(kmod!=0)&&(kmod!=5)&&(kmod!=10))) + mpdcch5tab[re++]=(l*eNB->frame_parms.ofdm_symbol_size)+k; + } + } + AssertFatal(re==864,"RE count not equal to 864\n"); +} + +extern uint8_t *generate_dci0(uint8_t *dci, + uint8_t *e, + uint8_t DCI_LENGTH, + uint8_t aggregation_level, + uint16_t rnti); + +void generate_mdci_top(PHY_VARS_eNB *eNB, int frame, int subframe,int16_t amp,int32_t **txdataF) { + + LTE_eNB_MPDCCH *mpdcch= &eNB->mpdcch_vars[subframe&2]; + mDCI_ALLOC_t *mdci; + int coded_bits; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + int i; + int gain_lin_QPSK; + + for (i=0;inum_dci;i++) { + mdci = &mpdcch->mdci_alloc[i]; + + + AssertFatal(fp->frame_type==FDD,"TDD is not yet supported for MPDCCH\n"); + AssertFatal(fp->Ncp == NORMAL,"Extended Prefix not yet supported for MPDCCH\n"); + AssertFatal(mdci->L<=24,"L is %d\n",mdci->L); + AssertFatal(fp->N_RB_DL==50 || fp->N_RB_DL==100,"Only N_RB_DL=50,100 for MPDCCH\n"); + // Force MPDDCH format 5 + AssertFatal(mdci->number_of_prb_pairs==6,"2 or 4 PRB pairs not support yet for MPDCCH\n"); + AssertFatal(mdci->reps>0,"mdci->reps==0\n"); + + // 9 REs/EREG * 4 EREG/ECCE => 36 REs/ECCE => 72 bits/ECCE, so same as regular PDCCH channel encoding + + // Note: We only have to run this every Nacc subframes during repetitions, data and scrambling are constant, but we do it for now to simplify during testing + + generate_dci0(mdci->dci_pdu, + mpdcch->e+(72*mdci->firstCCE), + mdci->dci_length, + mdci->L, + mdci->rnti); + + + coded_bits = 72 * mdci->L; + + // scrambling + uint16_t absSF = (frame*10)+subframe; + + AssertFatal(absSF < 1024, + "Absolute subframe %d = %d*10 + %d > 1023\n", + absSF,frame,subframe); + + mpdcch_scrambling(fp, + mdci, + absSF, + mpdcch->e+(72*mdci->firstCCE), + coded_bits); + + // Modulation for PDCCH + if (fp->nb_antenna_ports_eNB==1) + gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15); + else + gain_lin_QPSK = amp/2; + + uint8_t *e_ptr = mpdcch->e; + + // if (mdci->transmission_type==0) nprime=mdci->rnti&3; // for Localized 2+4 we use 6.8B.5 rule + // map directly to one antenna port for now + // Note: aside from the antenna port mapping, there is no difference between localized and distributed transmission for MPDCCH format 5 + + // first RE of narrowband + // mpdcchtab5 below contains the mapping from each coded symbol to relative RE avoiding the DMRS + + + int re_offset = fp->first_carrier_offset + 1 + ((fp->N_RB_DL==100)?1:0) + mdci->narrowband*12*6; + if (re_offset>fp->ofdm_symbol_size) re_offset-=(fp->ofdm_symbol_size-1); + int32_t *txF = &txdataF[0][re_offset]; + int32_t yIQ; + + for (i=0; i<(coded_bits>>1); i++) { + // QPSK modulation to yIQ + ((int16_t*)&yIQ)[0] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; e_ptr++; + ((int16_t*)&yIQ)[1] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; e_ptr++; + txF[mpdcch5tab[i+(36*mdci->firstCCE)]] = yIQ; + } + + } +} + +#endif diff --git a/openair1/PHY/LTE_TRANSPORT/extern.h b/openair1/PHY/LTE_TRANSPORT/extern.h index 1fc6f7cb28..e791bec9a0 100644 --- a/openair1/PHY/LTE_TRANSPORT/extern.h +++ b/openair1/PHY/LTE_TRANSPORT/extern.h @@ -1,35 +1,30 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ extern unsigned int dlsch_tbs25[27][25],TBStable[27][110],TBStable1C[32]; extern unsigned short lte_cqi_eff1024[16]; extern char lte_cqi_snr_dB[15]; extern short conjugate[8],conjugate2[8]; +extern short minus_one[8]; +extern short minus_one[8]; extern short *ul_ref_sigs[30][2][33]; extern short *ul_ref_sigs_rx[30][2][33]; extern unsigned short dftsizes[33]; diff --git a/openair1/PHY/LTE_TRANSPORT/group_hopping.c b/openair1/PHY/LTE_TRANSPORT/group_hopping.c index 64c0830386..a7c8921c2c 100644 --- a/openair1/PHY/LTE_TRANSPORT/group_hopping.c +++ b/openair1/PHY/LTE_TRANSPORT/group_hopping.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/group_hopping.c * \brief Top-level routines for group/sequence hopping and nPRS sequence generationg for DRS and PUCCH from 36-211, V8.6 2009-03 @@ -50,6 +42,8 @@ void generate_grouphop(LTE_DL_FRAME_PARMS *frame_parms) // This is from Section 5.5.1.3 uint32_t fss_pusch = frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + uint32_t fss_pucch = frame_parms->Nid_cell; + x2 = frame_parms->Nid_cell/30; #ifdef DEBUG_GROUPHOP printf("[PHY] GroupHop:"); @@ -57,7 +51,10 @@ void generate_grouphop(LTE_DL_FRAME_PARMS *frame_parms) for (ns=0; ns<20; ns++) { if (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled == 0) + { frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[ns] = fss_pusch%30; + frame_parms->pucch_config_common.grouphop[ns] = fss_pucch%30; + } else { if ((ns&3) == 0) { s = lte_gold_generic(&x1,&x2,reset); @@ -65,6 +62,7 @@ void generate_grouphop(LTE_DL_FRAME_PARMS *frame_parms) } frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[ns] = (((uint8_t*)&s)[ns&3]+fss_pusch)%30; + frame_parms->pucch_config_common.grouphop[ns] = (((uint8_t*)&s)[ns&3]+fss_pucch)%30; } #ifdef DEBUG_GROUPHOP @@ -120,7 +118,8 @@ void generate_nPRS(LTE_DL_FRAME_PARMS *frame_parms) uint16_t next = 0; uint8_t ns=0; - uint32_t fss_pusch = frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + uint32_t fss_pucch = (frame_parms->Nid_cell) % 30; + uint32_t fss_pusch = (fss_pucch + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH) % 30; x2 = (32*(uint32_t)(frame_parms->Nid_cell/30)) + fss_pusch; #ifdef DEBUG_GROUPHOP diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c new file mode 100644 index 0000000000..38ced5d717 --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -0,0 +1,461 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/LTE_TRANSPORT/if4_tools.c +* \brief +* \author S. Sandeep Kumar, Raymond Knopp +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \note +* \warning +*/ + +#include "PHY/defs.h" +#include "PHY/TOOLS/alaw_lut.h" +#include "PHY/extern.h" +#include "SCHED/defs.h" + +//#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" +#include "targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h" +#include "UTIL/LOG/vcd_signal_dumper.h" + +const uint8_t lin2alaw_if4p5[65536] = {213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85}; const uint16_t alaw2lin_if4p5[256] = {60032, 60288, 59520, 59776, 61056, 61312, 60544, 60800, 57984, 58240, 57472, 57728, 59008, 59264, 58496, 58752, 62784, 62912, 62528, 62656, 63296, 63424, 63040, 63168, 61760, 61888, 61504, 61632, 62272, 62400, 62016, 62144, 43520, 44544, 41472, 42496, 47616, 48640, 45568, 46592, 35328, 36352, 33280, 34304, 39424, 40448, 37376, 38400, 54528, 55040, 53504, 54016, 56576, 57088, 55552, 56064, 50432, 50944, 49408, 49920, 52480, 52992, 51456, 51968, 65192, 65208, 65160, 65176, 65256, 65272, 65224, 65240, 65064, 65080, 65032, 65048, 65128, 65144, 65096, 65112, 65448, 65464, 65416, 65432, 65512, 65528, 65480, 65496, 65320, 65336, 65288, 65304, 65384, 65400, 65352, 65368, 64160, 64224, 64032, 64096, 64416, 64480, 64288, 64352, 63648, 63712, 63520, 63584, 63904, 63968, 63776, 63840, 64848, 64880, 64784, 64816, 64976, 65008, 64912, 64944, 64592, 64624, 64528, 64560, 64720, 64752, 64656, 64688, 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, 344, 328, 376, 360, 280, 264, 312, 296, 472, 456, 504, 488, 408, 392, 440, 424, 88, 72, 120, 104, 24, 8, 56, 40, 216, 200, 248, 232, 152, 136, 184, 168, 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, 688, 656, 752, 720, 560, 528, 624, 592, 944, 912, 1008, 976, 816, 784, 880, 848}; + +void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type) { + + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + int32_t **txdataF = ru->common.txdataF_BF; + int32_t **rxdataF = ru->common.rxdataF; + int16_t **prach_rxsigF = ru->prach_rxsigF; +#ifdef Rel14 + int16_t ***prach_rxsigF_br = ru->prach_rxsigF_br; +#endif + void *tx_buffer = ru->ifbuffer.tx[subframe&1]; + void *tx_buffer_prach = ru->ifbuffer.tx_prach; + + + uint16_t symbol_id=0, element_id=0; + uint16_t db_fulllength, db_halflength; + int slotoffsetF=0, blockoffsetF=0; + + uint16_t *data_block=NULL, *i=NULL, *d=NULL; + + IF4p5_header_t *packet_header=NULL; + eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv); + int nsym = fp->symbols_per_tti; + + if (ru->idx==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); + + if (packet_type == IF4p5_PDLFFT) { + //LOG_D(PHY,"send DL_IF4p5: RU %d frame %d, subframe %d\n",ru->idx,frame,subframe); + + if (subframe_select(fp,subframe)==SF_S) + nsym=fp->dl_symbols_in_S_subframe; + + + db_fulllength = 12*fp->N_RB_DL; + db_halflength = (db_fulllength)>>1; + slotoffsetF = 1;//(subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; + + + if (eth->flags == ETH_RAW_IF4p5_MODE) { + packet_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); + } else { + packet_header = (IF4p5_header_t *)(tx_buffer); + data_block = (uint16_t*)(tx_buffer + sizeof_IF4p5_header_t); + } + gen_IF4p5_dl_header(packet_header, frame, subframe); + + AssertFatal(txdataF[0]!=NULL,"txdataF_BF[0] is null\n"); + for (symbol_id=0; symbol_idframe_status &= ~(0x000f<<26); + packet_header->frame_status |= (symbol_id&0x000f)<<26; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 ); + if ((ru->ifdevice.trx_write_func(&ru->ifdevice, + symbol_id, + &tx_buffer, + db_fulllength, + 1, + IF4p5_PDLFFT)) < 0) { + perror("ETHERNET write for IF4p5_PDLFFT\n"); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 ); + slotoffsetF += fp->ofdm_symbol_size; + blockoffsetF += fp->ofdm_symbol_size; + } + } else if ((packet_type == IF4p5_PULFFT)|| + (packet_type == IF4p5_PULTICK)){ + db_fulllength = 12*fp->N_RB_UL; + db_halflength = (db_fulllength)>>1; + slotoffsetF = 0; + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; + + if (subframe_select(fp,subframe)==SF_S) { + nsym=fp->ul_symbols_in_S_subframe; + slotoffsetF += (fp->ofdm_symbol_size*(fp->symbols_per_tti-nsym)); + blockoffsetF += (fp->ofdm_symbol_size*(fp->symbols_per_tti-nsym)); + } + + if (eth->flags == ETH_RAW_IF4p5_MODE) { + packet_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); + } else { + packet_header = (IF4p5_header_t *)(tx_buffer); + data_block = (uint16_t*)(tx_buffer + sizeof_IF4p5_header_t); + } + gen_IF4p5_ul_header(packet_header, packet_type, frame, subframe); + + if (packet_type == IF4p5_PULFFT) { + + uint16_t *rx0 = (uint16_t*) &rxdataF[0][blockoffsetF]; + uint16_t *rx1 = (uint16_t*) &rxdataF[0][slotoffsetF]; + + + for (symbol_id=fp->symbols_per_tti-nsym; symbol_idsymbols_per_tti; symbol_id++) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF4_SYMBOL, symbol_id ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 1 ); + + + start_meas(&ru->compression); + + for (element_id=0; element_idcompression); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 0 ); + packet_header->frame_status &= ~(0x000f<<26); + packet_header->frame_status |= (symbol_id&0x000f)<<26; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 ); + start_meas(&ru->transport); + if ((ru->ifdevice.trx_write_func(&ru->ifdevice, + symbol_id, + &tx_buffer, + db_fulllength, + 1, + IF4p5_PULFFT)) < 0) { + perror("ETHERNET write for IF4p5_PULFFT\n"); + } + stop_meas(&ru->transport); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 ); + slotoffsetF += fp->ofdm_symbol_size; + blockoffsetF += fp->ofdm_symbol_size; + } + } + else { + if ((ru->ifdevice.trx_write_func(&ru->ifdevice, + 0, + &tx_buffer, + 0, + 1, + IF4p5_PULTICK)) < 0) { + perror("ETHERNET write for IF4p5_PULFFT\n"); + } + } + } else if (packet_type >= IF4p5_PRACH && + packet_type <= IF4p5_PRACH+4) { + // FIX: hard coded prach samples length + LOG_D(PHY,"IF4p5_PRACH: frame %d, subframe %d,packet type %x\n",frame,subframe,packet_type); + db_fulllength = PRACH_NUM_SAMPLES; + + if (eth->flags == ETH_RAW_IF4p5_MODE) { + packet_header = (IF4p5_header_t *)(tx_buffer_prach + MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t); + } else { + packet_header = (IF4p5_header_t *)(tx_buffer_prach); + data_block = (uint16_t*)(tx_buffer_prach + sizeof_IF4p5_header_t); + } + gen_IF4p5_prach_header(packet_header, frame, subframe); + + + int16_t *rxF; + +#ifdef Rel14 + if (packet_type > IF4p5_PRACH) + rxF = &prach_rxsigF_br[packet_type - IF4p5_PRACH - 1][0][0]; + else +#endif + rxF = &prach_rxsigF[0][0]; + + AssertFatal(rxF!=NULL,"rxF is null\n"); + if (eth->flags == ETH_RAW_IF4p5_MODE) { + memcpy((void *)(tx_buffer_prach + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t), + (void*)rxF, + PRACH_BLOCK_SIZE_BYTES); + } else { + memcpy((void *)(tx_buffer_prach + sizeof_IF4p5_header_t), + (void *)rxF, + PRACH_BLOCK_SIZE_BYTES); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 ); + if ((ru->ifdevice.trx_write_func(&ru->ifdevice, + symbol_id, + &tx_buffer_prach, + db_fulllength, + 1, + packet_type)) < 0) { + perror("ETHERNET write for IF4p5_PRACH\n"); + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 ); + } else { + AssertFatal(1==0, "send_IF4p5 - Unknown packet_type %x", packet_type); + } + + if (ru->idx==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + return; +} + +void recv_IF4p5(RU_t *ru, int *frame, int *subframe, uint16_t *packet_type, uint32_t *symbol_number) { + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + int32_t **txdataF = ru->common.txdataF_BF; + int32_t **rxdataF = ru->common.rxdataF; + int16_t **prach_rxsigF = ru->prach_rxsigF; +#ifdef Rel14 + int16_t ***prach_rxsigF_br = ru->prach_rxsigF_br; +#endif + void *rx_buffer = ru->ifbuffer.rx; + + uint16_t element_id; + uint16_t db_fulllength, db_halflength; + int slotoffsetF=0, blockoffsetF=0; + eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv); + int idx; + + if (ru->idx==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); + + if (ru->function == NGFI_RRU_IF4p5) { + db_fulllength = (12*fp->N_RB_DL); + } else { // This is not an RRU + db_fulllength = (12*fp->N_RB_UL); + } + db_halflength = db_fulllength>>1; + + IF4p5_header_t *packet_header=NULL; + uint16_t *data_block=NULL, *i=NULL; + + LOG_D(PHY,"recv IF4p5: RU %d waiting (%d samples)\n",ru->idx,db_fulllength); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 ); + if (ru->ifdevice.trx_read_func(&ru->ifdevice, + (int64_t*) packet_type, + &rx_buffer, + db_fulllength, + 0) < 0) { + perror("ETHERNET read"); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 ); + if (eth->flags == ETH_RAW_IF4p5_MODE) { + packet_header = (IF4p5_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES); + data_block = (uint16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t); + } else { + packet_header = (IF4p5_header_t*) (rx_buffer); + data_block = (uint16_t*) (rx_buffer+sizeof_IF4p5_header_t); + } + + + + *frame = ((packet_header->frame_status)>>6)&0xffff; + *subframe = ((packet_header->frame_status)>>22)&0x000f; + + *packet_type = packet_header->sub_type; + LOG_D(PHY,"recv_IF4p5: Frame %d, Subframe %d: packet_type %x\n",*frame,*subframe,*packet_type); + if (*packet_type == IF4p5_PDLFFT) { + *symbol_number = ((packet_header->frame_status)>>26)&0x000f; + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RECV_IF4_SYMBOL, *symbol_number ); + LOG_D(PHY,"DL_IF4p5: RU %d frame %d, subframe %d, symbol %d\n",ru->idx,*frame,*subframe,*symbol_number); + + slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size)+1;// + (*subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1; + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 1 ); + for (element_id=0; element_id>8) ]; + + i = (uint16_t*) &txdataF[0][slotoffsetF+element_id]; + *i = alaw2lin_if4p5[ (data_block[element_id+db_halflength] & 0xff) ]; + *(i+1) = alaw2lin_if4p5[ (data_block[element_id+db_halflength]>>8) ]; + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 0 ); + } else if (*packet_type == IF4p5_PULFFT) { + *symbol_number = ((packet_header->frame_status)>>26)&0x000f; + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RECV_IF4_SYMBOL, *symbol_number ); + if (ru->idx==0) LOG_D(PHY,"UL_IF4p5: RU %d : frame %d, subframe %d, symbol %d\n",ru->idx,*frame,*subframe,*symbol_number); + + + slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size); + blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 1 ); + for (element_id=0; element_id>8) ]; + + i = (uint16_t*) &rxdataF[0][slotoffsetF+element_id]; + *i = alaw2lin_if4p5[ (data_block[element_id+db_halflength] & 0xff) ]; + *(i+1) = alaw2lin_if4p5[ (data_block[element_id+db_halflength]>>8) ]; + + //if (element_id==0) LOG_I(PHY,"recv_if4p5: symbol %d rxdata0 = (%u,%u)\n",*symbol_number,*i,*(i+1)); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 0 ); + } else if (*packet_type >= IF4p5_PRACH && + *packet_type <= IF4p5_PRACH + 4) { + + int16_t *rxF; + +#ifdef Rel14 + if (*packet_type > IF4p5_PRACH) + rxF = &prach_rxsigF_br[*packet_type - IF4p5_PRACH - 1][0][0]; + else +#endif + rxF = &prach_rxsigF[0][0]; + + // FIX: hard coded prach samples length + db_fulllength = PRACH_NUM_SAMPLES; + + AssertFatal(rxF!=NULL,"rxF is null\n"); + + if (eth->flags == ETH_RAW_IF4p5_MODE) { + memcpy(rxF, + (int16_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES+sizeof_IF4p5_header_t), + PRACH_BLOCK_SIZE_BYTES); + } else { + memcpy(rxF, + (int16_t*) (rx_buffer+sizeof_IF4p5_header_t), + PRACH_BLOCK_SIZE_BYTES); + } + + LOG_D(PHY,"PRACH_IF4p5: CC_id %d : frame %d, subframe %d => %d dB\n",ru->idx,*frame,*subframe, + dB_fixed(signal_energy((int*)&prach_rxsigF[0][0],839))); + for (idx=0;idxnum_eNB;idx++) ru->wakeup_prach_eNB(ru->eNB_list[idx],ru,*frame,*subframe); + + } else if (*packet_type == IF4p5_PULTICK) { + + } else { + AssertFatal(1==0, "recv_IF4p5 - Unknown packet_type %x", *packet_type); + } + + if (ru->idx==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); + return; +} + + +void gen_IF4p5_dl_header(IF4p5_header_t *dl_packet, int frame, int subframe) { + dl_packet->type = IF4p5_PACKET_TYPE; + dl_packet->sub_type = IF4p5_PDLFFT; + + dl_packet->rsvd = 0; + + // Set frame status + dl_packet->frame_status = 0; + dl_packet->frame_status |= (frame&0xffff)<<6; + dl_packet->frame_status |= (subframe&0x000f)<<22; +} + + +void gen_IF4p5_ul_header(IF4p5_header_t *ul_packet, uint16_t packet_subtype, int frame, int subframe) { + + ul_packet->type = IF4p5_PACKET_TYPE; + ul_packet->sub_type = packet_subtype; + + ul_packet->rsvd = 0; + + // Set frame status + ul_packet->frame_status = 0; + ul_packet->frame_status |= (frame&0xffff)<<6; + ul_packet->frame_status |= (subframe&0x000f)<<22; +} + + +void gen_IF4p5_prach_header(IF4p5_header_t *prach_packet, int frame, int subframe) { + prach_packet->type = IF4p5_PACKET_TYPE; + prach_packet->sub_type = IF4p5_PRACH; + + prach_packet->rsvd = 0; + + // Set LTE Prach configuration + prach_packet->frame_status = 0; + prach_packet->frame_status |= (frame&0xffff)<<6; + prach_packet->frame_status |= (subframe&0x000f)<<22; +} + + +void malloc_IF4p5_buffer(RU_t *ru) { + // Keep the size large enough + eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv); + int i; + + if (eth->flags == ETH_RAW_IF4p5_MODE) { + for (i=0;i<10;i++) { + ru->ifbuffer.tx[i] = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + memset((void*)ru->ifbuffer.tx[i],0,RAW_IF4p5_PRACH_SIZE_BYTES); + } + ru->ifbuffer.tx_prach = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + memset((void*)ru->ifbuffer.tx_prach,0,RAW_IF4p5_PRACH_SIZE_BYTES); + ru->ifbuffer.rx = malloc(RAW_IF4p5_PRACH_SIZE_BYTES); + memset((void*)ru->ifbuffer.rx,0,RAW_IF4p5_PRACH_SIZE_BYTES); + } else { + for (i=0;i<10;i++) { + ru->ifbuffer.tx[i] = malloc(UDP_IF4p5_PRACH_SIZE_BYTES); + memset((void*)ru->ifbuffer.tx[i],0,UDP_IF4p5_PRACH_SIZE_BYTES); + } + ru->ifbuffer.tx_prach = malloc(UDP_IF4p5_PRACH_SIZE_BYTES); + memset((void*)ru->ifbuffer.tx_prach,0,UDP_IF4p5_PRACH_SIZE_BYTES); + ru->ifbuffer.rx = malloc(UDP_IF4p5_PRACH_SIZE_BYTES); + memset((void*)ru->ifbuffer.rx,0,UDP_IF4p5_PRACH_SIZE_BYTES); + } +} diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h new file mode 100644 index 0000000000..0a95e60ead --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -0,0 +1,75 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/LTE_TRANSPORT/if4_tools.h +* \brief +* \author S. Sandeep Kumar, Raymond Knopp +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \note +* \warning +*/ + +#ifndef __IF4_TOOLS_H__ +#define __IF4_TOOLS_H__ +#include "PHY/defs.h" + +/// Macro for IF4 packet type +#define IF4p5_PACKET_TYPE 0x080A +#define IF4p5_PULFFT 0x0019 +#define IF4p5_PDLFFT 0x0020 +#define IF4p5_PRACH 0x0021 +#define IF4p5_PRACH_BR_CE0 0x0022 +#define IF4p5_PRACH_BR_CE1 0x0023 +#define IF4p5_PRACH_BR_CE2 0x0024 +#define IF4p5_PRACH_BR_CE3 0x0025 +#define IF4p5_PULTICK 0x0026 + +struct IF4p5_header { + /// Type + uint16_t type; + /// Sub-Type + uint16_t sub_type; + /// Reserved + uint32_t rsvd; + /// Frame Status + uint32_t frame_status; + +} __attribute__ ((__packed__)); + +typedef struct IF4p5_header IF4p5_header_t; +#define sizeof_IF4p5_header_t 12 + +void gen_IF4p5_dl_header(IF4p5_header_t*, int, int); + +void gen_IF4p5_ul_header(IF4p5_header_t*, uint16_t, int, int); + +void gen_IF4p5_prach_header(IF4p5_header_t*, int, int); + +void send_IF4p5(RU_t*, int, int, uint16_t); + +void recv_IF4p5(RU_t*, int*, int*, uint16_t*, uint32_t*); + +void malloc_IF4p5_buffer(RU_t*); + +#endif diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.c b/openair1/PHY/LTE_TRANSPORT/if5_tools.c new file mode 100644 index 0000000000..b160318a6e --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.c @@ -0,0 +1,647 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/LTE_TRANSPORT/if5_tools.c +* \brief +* \author S. Sandeep Kumar, Raymond Knopp, Tien-Thinh Nguyen +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr, tien-thinh.nguyen@eurecom.fr +* \note +* \warning +*/ + +#include "PHY/defs.h" +#include "PHY/TOOLS/alaw_lut.h" + +#include "time_utils.h" + +//#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" +#include "targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h" +#include "UTIL/LOG/vcd_signal_dumper.h" +//#define DEBUG_DL_MOBIPASS +//#define DEBUG_UL_MOBIPASS +#define SUBFRAME_SKIP_NUM_MOBIPASS 8 + +const uint8_t lin2alaw_if5[65536] = {213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85}; + +const uint16_t alaw2lin_if5[256] = {60032, 60288, 59520, 59776, 61056, 61312, 60544, 60800, 57984, 58240, 57472, 57728, 59008, 59264, 58496, 58752, 62784, 62912, 62528, 62656, 63296, 63424, 63040, 63168, 61760, 61888, 61504, 61632, 62272, 62400, 62016, 62144, 43520, 44544, 41472, 42496, 47616, 48640, 45568, 46592, 35328, 36352, 33280, 34304, 39424, 40448, 37376, 38400, 54528, 55040, 53504, 54016, 56576, 57088, 55552, 56064, 50432, 50944, 49408, 49920, 52480, 52992, 51456, 51968, 65192, 65208, 65160, 65176, 65256, 65272, 65224, 65240, 65064, 65080, 65032, 65048, 65128, 65144, 65096, 65112, 65448, 65464, 65416, 65432, 65512, 65528, 65480, 65496, 65320, 65336, 65288, 65304, 65384, 65400, 65352, 65368, 64160, 64224, 64032, 64096, 64416, 64480, 64288, 64352, 63648, 63712, 63520, 63584, 63904, 63968, 63776, 63840, 64848, 64880, 64784, 64816, 64976, 65008, 64912, 64944, 64592, 64624, 64528, 64560, 64720, 64752, 64656, 64688, 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, 344, 328, 376, 360, 280, 264, 312, 296, 472, 456, 504, 488, 408, 392, 440, 424, 88, 72, 120, 104, 24, 8, 56, 40, 216, 200, 248, 232, 152, 136, 184, 168, 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, 688, 656, 752, 720, 560, 528, 624, 592, 944, 912, 1008, 976, 816, 784, 880, 848}; + +struct timespec start_comp, start_decomp, end_comp, end_decomp; +int dummy_cnt = 0; +int subframe_skip_extra = 0; +int start_flag = 1; +int offset_cnt = 1; +void send_IF5(RU_t *ru, openair0_timestamp proc_timestamp, int subframe, uint8_t *seqno, uint16_t packet_type) { + + LTE_DL_FRAME_PARMS *fp=&ru->frame_parms; + int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx]; + int32_t *tx_buffer=NULL; +#ifdef DEBUG_DL_MOBIPASS + int8_t dummy_buffer[fp->samples_per_tti*2]; +#endif + void *alaw_buffer = ru->ifbuffer.tx[subframe&1]; + uint16_t *data_block = NULL; + uint16_t *j = NULL; + uint16_t packet_id=0, i=0, element_id=0; + + uint32_t spp_eth = (uint32_t) ru->ifdevice.openair0_cfg->samples_per_packet; + uint32_t spsf = (uint32_t) ru->ifdevice.openair0_cfg->samples_per_frame/10; + eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); + if (packet_type == IF5_RRH_GW_DL) { + if (eth->compression == ALAW_COMPRESS) { + if (eth->flags == ETH_RAW_MODE) { + data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES); + } else { + data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES); + } + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_comp); + for (i=0; i < fp->nb_antennas_tx; i++) { + for (element_id=0; element_id< spp_eth; element_id++){ + j = (uint16_t*) &ru->common.txdata[i][subframe*fp->samples_per_tti+packet_id*spp_eth+element_id]; + data_block[element_id] = ((uint16_t) lin2alaw_if5[*j]) | (lin2alaw_if5[*(j+1)]<<8); + } + } + clock_gettime( CLOCK_MONOTONIC, &end_comp); + LOG_D(HW,"[SF %d] Compress_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_comp); + ru->ifdevice.trx_write_func(&ru->ifdevice, + (proc_timestamp + packet_id*spp_eth), + (void**)&data_block, + spp_eth, + fp->nb_antennas_tx, + 0); + clock_gettime( CLOCK_MONOTONIC, &end_comp); + LOG_D(HW,"[SF %d] IF_Write_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 ); + } + } else if (eth->compression == NO_COMPRESS) { + + for (i=0; i < fp->nb_antennas_tx; i++) + txp[i] = (void*)&ru->common.txdata[i][subframe*fp->samples_per_tti]; + + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_comp); + ru->ifdevice.trx_write_func(&ru->ifdevice, + (proc_timestamp + packet_id*spp_eth), + (void**)txp, + spp_eth, + fp->nb_antennas_tx, + 0); + clock_gettime( CLOCK_MONOTONIC, &end_comp); + LOG_D(HW,"[SF %d] IF_Write_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 ); + for (i=0; i < fp->nb_antennas_tx; i++) + txp[i] += spp_eth; + + } + } + } else if (packet_type == IF5_RRH_GW_UL) { + if (eth->compression == ALAW_COMPRESS) { + if (eth->flags == ETH_RAW_MODE) { + data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES); + } else { + data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES); + } + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_comp); + for (i=0; i < fp->nb_antennas_rx; i++) { + for (element_id=0; element_id< spp_eth; element_id++){ + j = (uint16_t*) &ru->common.rxdata[i][subframe*fp->samples_per_tti+packet_id*spp_eth+element_id]; + data_block[element_id] = ((uint16_t) lin2alaw_if5[*j]) | (lin2alaw_if5[*(j+1)]<<8); + } + } + clock_gettime( CLOCK_MONOTONIC, &end_comp); + LOG_D(HW,"[SF %d] Compress_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_comp); + ru->ifdevice.trx_write_func(&ru->ifdevice, + (proc_timestamp + packet_id*spp_eth), + (void**)&data_block, + spp_eth, + fp->nb_antennas_rx, + 0); + clock_gettime( CLOCK_MONOTONIC, &end_comp); + LOG_D(HW,"[SF %d] IF_Write_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 ); + } + } else if (eth->compression == NO_COMPRESS) { + for (i=0; i < fp->nb_antennas_rx; i++) + rxp[i] = (void*)&ru->common.rxdata[i][subframe*fp->samples_per_tti]; + + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_comp); + ru->ifdevice.trx_write_func(&ru->ifdevice, + (proc_timestamp + packet_id*spp_eth), + (void**)rxp, + spp_eth, + fp->nb_antennas_rx, + 0); + clock_gettime( CLOCK_MONOTONIC, &end_comp); + LOG_D(HW,"[SF %d] IF_Write_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_comp, end_comp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 ); + for (i=0; i < fp->nb_antennas_rx; i++) + rxp[i] += spp_eth; + + } + } + } else if (packet_type == IF5_MOBIPASS) { + /* the only difference between mobipass standalone and the other one + * is the timestamp in trx_write_func, but let's duplicate anyway + * (plus we don't call malloc for the standalone case) + */ + if (ru->if_timing == synch_to_mobipass_standalone) { + uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES; + + __m128i *data_block=NULL, *data_block_head=NULL; + __m128i *txp128; + __m128i t0, t1; + + unsigned char _tx_buffer[MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)]; + tx_buffer=(int32_t *)_tx_buffer; + + IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block_head = (__m128i *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t); + + header->flags = 0; + header->fifo_status = 0; + header->seqno = *seqno; + header->ack = 0; + header->word0 = 0; + + txp[0] = (void*)&ru->common.txdata[0][subframe*ru->frame_parms.samples_per_tti]; + txp128 = (__m128i *) txp[0]; + + for (packet_id=0; packet_idsamples_per_tti/db_fulllength; packet_id++) { + header->time_stamp = htonl((uint32_t)(proc_timestamp + packet_id*db_fulllength)); + data_block = data_block_head; + + for (i=0; i>2; i+=2) { + t0 = _mm_srai_epi16(*txp128++, 4); + t1 = _mm_srai_epi16(*txp128++, 4); + _mm_storeu_si128(data_block++, _mm_packs_epi16(t0, t1)); + } + + // Write the packet to the fronthaul + if ((ru->ifdevice.trx_write_func(&ru->ifdevice, + proc_timestamp + packet_id*db_fulllength, + (void**)&tx_buffer, + db_fulllength, + 1, + IF5_MOBIPASS)) < 0) { + perror("ETHERNET write for IF5_MOBIPASS\n"); + } + header->seqno += 1; + } + *seqno = header->seqno; + tx_buffer = NULL; + } else { + uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES; + + __m128i *data_block=NULL, *data_block_head=NULL; + + __m128i *txp128; + __m128i t0, t1; + + // tx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); + tx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); + IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES); + data_block_head = (__m128i *)((uint8_t *)tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t); + + header->flags = 0; + header->fifo_status = 0; + header->seqno = *seqno; + header->ack = 0; + header->word0 = 0; + + txp[0] = (void*)&ru->common.txdata[0][subframe*ru->frame_parms.samples_per_tti]; + txp128 = (__m128i *) txp[0]; + + for (packet_id=0; packet_idsamples_per_tti/db_fulllength; packet_id++) { + header->time_stamp = htonl((uint32_t)(proc_timestamp + packet_id*db_fulllength)); + data_block = data_block_head; + + for (i=0; i>2; i+=2) { + t0 = _mm_srai_epi16(*txp128++, 4); + t1 = _mm_srai_epi16(*txp128++, 4); +// *data_block++ = _mm_packs_epi16(t0, t1); + _mm_storeu_si128(data_block++, _mm_packs_epi16(t0, t1)); + } + + // Write the packet to the fronthaul + if ((ru->ifdevice.trx_write_func(&ru->ifdevice, + packet_id, + (void**)&tx_buffer, + db_fulllength, + 1, + IF5_MOBIPASS)) < 0) { + perror("ETHERNET write for IF5_MOBIPASS\n"); + } + +#ifdef DEBUG_DL_MOBIPASS + if ((subframe==0)&&(dummy_cnt == 100)) { + memcpy((void*)&dummy_buffer[packet_id*db_fulllength*2],(void*)data_block_head,db_fulllength*2); + } +#endif + header->seqno += 1; + } + *seqno = header->seqno; + +#ifdef DEBUG_DL_MOBIPASS + uint8_t txe; + txe = dB_fixed(signal_energy(txp[0],fp->samples_per_tti)); + if (txe > 0){ + LOG_D(PHY,"[Mobipass] frame:%d, subframe:%d, energy %d\n", (proc_timestamp/(10*fp->samples_per_tti))&1023,subframe, txe); + } +#endif + } + } else { + AssertFatal(1==0, "send_IF5 - Unknown packet_type %x", packet_type); + } + + free(tx_buffer); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); +#ifdef DEBUG_DL_MOBIPASS + if(subframe==0) { + if (dummy_cnt==100) { + write_output("txsigmb.m","txs",(void*)dummy_buffer, fp->samples_per_tti,1, 5); + exit(-1); + } else { + dummy_cnt++; + } + } +#endif + return; +} + + +void recv_IF5(RU_t *ru, openair0_timestamp *proc_timestamp, int subframe, uint16_t packet_type) { + + LTE_DL_FRAME_PARMS *fp=&ru->frame_parms; + int32_t *txp[fp->nb_antennas_tx], *rxp[fp->nb_antennas_rx]; + + uint16_t packet_id=0, i=0, element_id=0; +#ifdef DEBUG_UL_MOBIPASS + //int8_t dummy_buffer_rx[fp->samples_per_tti*2]; + uint8_t rxe; +#endif + + + int32_t spp_eth = (int32_t) ru->ifdevice.openair0_cfg->samples_per_packet; + int32_t spsf = (int32_t) ru->ifdevice.openair0_cfg->samples_per_frame/10; + void *alaw_buffer = ru->ifbuffer.rx; + uint16_t *data_block = NULL; + uint16_t *j = NULL; + + openair0_timestamp timestamp[spsf / spp_eth]; + eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); + + if (packet_type == IF5_RRH_GW_DL) { + if (eth->compression == ALAW_COMPRESS) { + if (eth->flags == ETH_RAW_MODE) { + data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES); + } else { + data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES); + } + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RECV_IF5_PKT_ID, packet_id ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_decomp); + ru->ifdevice.trx_read_func(&ru->ifdevice, + ×tamp[packet_id], + (void**)&data_block, + spp_eth, + fp->nb_antennas_tx); + + clock_gettime( CLOCK_MONOTONIC, &end_decomp); + LOG_D(HW,"[SF %d] IF_Read_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_decomp); + for (i=0; i < fp->nb_antennas_tx; i++) { + for (element_id=0; element_id< spp_eth; element_id++) { + j = (uint16_t*) &ru->common.txdata[i][subframe*fp->samples_per_tti+packet_id*spp_eth+element_id]; + *j = alaw2lin_if5[ (data_block[element_id] & 0xff) ]; + *(j+1) = alaw2lin_if5[ (data_block[element_id]>>8) ]; + } + } + clock_gettime( CLOCK_MONOTONIC, &end_decomp); + LOG_D(HW,"[SF %d] Decomperss_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 0 ); + } + } else if (eth->compression == NO_COMPRESS) { + for (i=0; i < fp->nb_antennas_tx; i++) + txp[i] = (void*)&ru->common.txdata[i][subframe*fp->samples_per_tti]; + + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RECV_IF5_PKT_ID, packet_id ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_decomp); + ru->ifdevice.trx_read_func(&ru->ifdevice, + ×tamp[packet_id], + (void**)txp, + spp_eth, + fp->nb_antennas_tx); + clock_gettime( CLOCK_MONOTONIC, &end_decomp); + LOG_D(HW,"[SF %d] IF_Read_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 ); + for (i=0; i < fp->nb_antennas_tx; i++) + txp[i] += spp_eth; + + } + } + *proc_timestamp = timestamp[0]; + + } else if (packet_type == IF5_RRH_GW_UL) { + if (eth->compression == ALAW_COMPRESS) { + if (eth->flags == ETH_RAW_MODE) { + data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES); + } else { + data_block = (uint16_t*)(alaw_buffer + APP_HEADER_SIZE_BYTES); + } + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_decomp); + ru->ifdevice.trx_read_func(&ru->ifdevice, + ×tamp[packet_id], + (void**)&data_block, + spp_eth, + fp->nb_antennas_rx); + clock_gettime( CLOCK_MONOTONIC, &end_decomp); + LOG_D(HW,"[SF %d] IF_Read_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_decomp); + for (i=0; i < fp->nb_antennas_rx; i++) { + for (element_id=0; element_id< spp_eth; element_id++) { + j = (uint16_t*) &ru->common.rxdata[i][subframe*fp->samples_per_tti+packet_id*spp_eth+element_id]; + *j = alaw2lin_if5[ (data_block[element_id] & 0xff) ]; + *(j+1) = alaw2lin_if5[ (data_block[element_id]>>8) ]; + } + } + clock_gettime( CLOCK_MONOTONIC, &end_decomp); + LOG_D(HW,"[SF %d] Decomperss_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_DECOMPR_IF, 0 ); + } + } else if (eth->compression == NO_COMPRESS) { + for (i=0; i < fp->nb_antennas_rx; i++) + rxp[i] = (void*)&ru->common.rxdata[i][subframe*fp->samples_per_tti]; + + for (packet_id=0; packet_id < spsf / spp_eth; packet_id++) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF5_PKT_ID, packet_id ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 ); + clock_gettime( CLOCK_MONOTONIC, &start_decomp); + ru->ifdevice.trx_read_func(&ru->ifdevice, + ×tamp[packet_id], + (void**)rxp, + spp_eth, + fp->nb_antennas_rx); + clock_gettime( CLOCK_MONOTONIC, &end_decomp); + LOG_D(HW,"[SF %d] IF_Read_Time: %"PRId64"\n",subframe,clock_difftime_ns(start_decomp, end_decomp)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 ); + for (i=0; i < fp->nb_antennas_rx; i++) + rxp[i] += spp_eth; + + } + } + *proc_timestamp = timestamp[0]; + + } else if (packet_type == IF5_MOBIPASS) { + if (ru->if_timing == synch_to_mobipass_standalone) { + uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES; + openair0_timestamp timestamp_mobipass[fp->samples_per_tti/db_fulllength]; + int32_t *rx_buffer=NULL; + __m128i *data_block=NULL, *data_block_head=NULL; + __m128i *rxp128; + __m128i r0; + + unsigned char _rx_buffer[MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)]; + rx_buffer = (int32_t *)_rx_buffer; + data_block_head = (__m128i *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t); + + rxp[0] = (void*)&ru->common.rxdata[0][subframe*ru->frame_parms.samples_per_tti]; + rxp128 = (__m128i *) (rxp[0]); + + packet_id=0; + while(packet_idsamples_per_tti/db_fulllength) { + data_block = data_block_head; + + ru->ifdevice.trx_read_func(&ru->ifdevice, + ×tamp_mobipass[packet_id], + (void**)&rx_buffer, + db_fulllength, + 1 + ); + + //store rxdata and increase packet_id + rxp[0] = (void*)&ru->common.rxdata[0][(subframe*ru->frame_parms.samples_per_tti)+packet_id*db_fulllength]; + rxp128 = (__m128i *) (rxp[0]); + for (i=0; i>2; i+=2) { + r0 = _mm_loadu_si128(data_block++); + *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4); + *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4); + } + packet_id++; + }//end while + + *proc_timestamp = ntohl(timestamp_mobipass[0]); + } else { + + uint16_t db_fulllength = PAYLOAD_MOBIPASS_NUM_SAMPLES; + openair0_timestamp timestamp_mobipass[fp->samples_per_tti/db_fulllength]; +#ifdef DEBUG_UL_MOBIPASS + int lower_offset = 0; + int upper_offset = 70000; +#endif + int subframe_skip = 0; + int reset_flag = 0; + int32_t *rx_buffer=NULL; + __m128i *data_block=NULL, *data_block_head=NULL; + __m128i *rxp128; + __m128i r0; + + //rx_buffer = memalign(16, MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); + rx_buffer = malloc(MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + db_fulllength*sizeof(int16_t)); + IF5_mobipass_header_t *header = (IF5_mobipass_header_t *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES); + data_block_head = (__m128i *)((uint8_t *)rx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t); + + rxp[0] = (void*)&ru->common.rxdata[0][subframe*ru->frame_parms.samples_per_tti]; + rxp128 = (__m128i *) (rxp[0]); + + RU_proc_t *proc = &ru->proc; +/* + // while(packet_idsamples_per_tti/db_fulllength) { + data_block = data_block_head; + + eNB->ifdevice.trx_read_func(&eNB->ifdevice, + &ts0, + (void**)&rx_buffer, + db_fulllength, + 1 + ); + + if ((header->seqno == 1)&&(first_packet==1)) { + first_packet = 0; //ignore the packets before synchnorization + packet_id = 0; + ts_offset = ntohl(ts0); + } + if (first_packet==0) { + packet_cnt++; + ts = ntohl(ts0); + packet_id = (ts-ts_offset)/db_fulllength; + packet_id = packet_id % (fp->samples_per_tti/db_fulllength); + + printf("[IF5_tools]packet_id:%d\n", packet_id); + // if (ts_stored == 0) { + // ts_stored = 1; + *proc_timestamp = ntohl(ts - (packet_id*db_fulllength)); + // } + rxp[0] = (void*)&eNB->common_vars.rxdata[0][0][(subframe*eNB->frame_parms.samples_per_tti)+packet_id*db_fulllength]; + rxp128 = (__m128i *) (rxp[0]); + + for (i=0; i>2; i+=2) { + r0 = _mm_loadu_si128(data_block++); + *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4); + *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4); + } + } + // }//end while +*/ + + + packet_id=0; + while(packet_idsamples_per_tti/db_fulllength) { + data_block = data_block_head; + + + ru->ifdevice.trx_read_func(&ru->ifdevice, + ×tamp_mobipass[packet_id], + (void**)&rx_buffer, + db_fulllength, + 1 + ); +#ifdef DEBUG_UL_MOBIPASS + if (((proc->timestamp_tx + lower_offset) > ntohl(timestamp_mobipass[packet_id])) || ((proc->timestamp_tx + upper_offset) < ntohl(timestamp_mobipass[packet_id]))) { + //ignore the packet + subframe_skip_extra = (subframe_skip_extra + 1)%67; + LOG_D("[Mobipass] ignored packet, id:[%d,%d], proc->timestamp_tx:%llu, proc->timestamp_rx:%llu, seqno:%d\n", packet_id,subframe_skip_extra, proc->timestamp_tx, ntohl(timestamp_mobipass[packet_id]), header->seqno); + } +#endif + //skip SUBFRAME_SKIP_NUM_MOBIPASS additional UL packets + if ((start_flag == 1) && (subframe_skip < SUBFRAME_SKIP_NUM_MOBIPASS)){ + subframe_skip++; + offset_cnt = header->seqno; + } else { + if ((offset_cnt != header->seqno) && (start_flag == 0) && (proc->first_rx > 3)){ +#ifdef DEBUG_UL_MOBIPASS + LOG_D(PHY,"[Mobipass] Reset sequence number, offset_cnt:%d, header->seqno:%d, packet_id:%d\n", offset_cnt, header->seqno, packet_id); +#endif + reset_flag=1; + } + if ((reset_flag == 1) && (proc->first_rx > 3 ) && (start_flag == 0) && (packet_id == 0)) { + packet_id = 1; + reset_flag = 0; + } + start_flag = 0; + + //store rxdata and increase packet_id + rxp[0] = (void*)&ru->common.rxdata[0][(subframe*ru->frame_parms.samples_per_tti)+packet_id*db_fulllength]; + rxp128 = (__m128i *) (rxp[0]); + for (i=0; i>2; i+=2) { + r0 = _mm_loadu_si128(data_block++); + *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpacklo_epi8(r0,r0),8),4); + *rxp128++ =_mm_slli_epi16(_mm_srai_epi16(_mm_unpackhi_epi8(r0,r0),8),4); + } + packet_id++; + offset_cnt = (header->seqno+1)&255; + } + }//end while + + *proc_timestamp = ntohl(timestamp_mobipass[0]); +#ifdef DEBUG_UL_MOBIPASS + LOG_I(PHY,"[Mobipass][Recv_MOBIPASS] timestamp: %llu\n ", *proc_timestamp); + if (eNB->CC_id>0) { + rxe = dB_fixed(signal_energy(rxp[0],fp->samples_per_tti)); + if (rxe > 0){ + LOG_I(PHY,"[Mobipass] frame:%d, subframe:%d, energy %d\n", (*proc_timestamp/(10*fp->samples_per_tti))&1023,subframe, rxe); + + // write_output("rxsigmb.m","rxs",(void*)dummy_buffer_rx, fp->samples_per_tti,1, 5); + // exit(-1); + } + } +#endif + + + + } + } else { + AssertFatal(1==0, "recv_IF5 - Unknown packet_type %x", packet_type); + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); + + return; +} + +void malloc_IF5_buffer(RU_t *ru) { + // Keep the size large enough, 3840 is the number of samples in a packet for 20MHz BW + int i; + eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv); + if (eth->compression == ALAW_COMPRESS) { + if (eth->flags == ETH_RAW_MODE) { + for (i=0;i<10;i++) + ru->ifbuffer.tx[i] = malloc(RAW_PACKET_SIZE_BYTES_ALAW(3840)); + ru->ifbuffer.rx = malloc(RAW_PACKET_SIZE_BYTES_ALAW(3840)); + } else { + for (i=0;i<10;i++) + ru->ifbuffer.tx[i] = malloc(UDP_PACKET_SIZE_BYTES_ALAW(3840)); + ru->ifbuffer.rx = malloc(UDP_PACKET_SIZE_BYTES_ALAW(3840)); + } + } else if (eth->compression == NO_COMPRESS) { + if (eth->flags == ETH_RAW_MODE) { + for (i=0;i<10;i++) + ru->ifbuffer.tx[i] = malloc(RAW_PACKET_SIZE_BYTES(3840)); + ru->ifbuffer.rx = malloc(RAW_PACKET_SIZE_BYTES(3840)); + } else { + for (i=0;i<10;i++) + ru->ifbuffer.tx[i] = malloc(UDP_PACKET_SIZE_BYTES(3840)); + ru->ifbuffer.rx = malloc(UDP_PACKET_SIZE_BYTES(3840)); + } + } +} diff --git a/openair1/PHY/LTE_TRANSPORT/if5_tools.h b/openair1/PHY/LTE_TRANSPORT/if5_tools.h new file mode 100644 index 0000000000..84ad530526 --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/if5_tools.h @@ -0,0 +1,69 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/LTE_TRANSPORT/if5_tools.h +* \brief +* \author S. Sandeep Kumar, Raymond Knopp +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \note +* \warning +*/ + +#ifndef __IF5_TOOLS_H__ +#define __IF5_TOOLS_H__ + +#include +#include "PHY/defs.h" + +#define IF5_RRH_GW_DL 0x0022 +#define IF5_RRH_GW_UL 0x0023 +#define IF5_MOBIPASS 0xbffe + +struct IF5_mobipass_header { + /// + uint16_t flags; + /// + uint16_t fifo_status; + /// + uint8_t seqno; + /// + uint8_t ack; + /// + uint32_t word0; + /// + uint32_t time_stamp; + +} __attribute__ ((__packed__)); + +typedef struct IF5_mobipass_header IF5_mobipass_header_t; +#define sizeof_IF5_mobipass_header_t 14 + +void send_IF5(RU_t *, openair0_timestamp, int, uint8_t*, uint16_t); + +void recv_IF5(RU_t *, openair0_timestamp*, int, uint16_t); + +void malloc_IF5_buffer(RU_t *ru); + +#endif + diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c index 5a8463a861..918696968b 100644 --- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c +++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/initial_sync.c * \brief Routines for initial UE synchronization procedure (PSS,SSS,PBCH and frame format detection) @@ -44,101 +36,100 @@ #include "SCHED/extern.h" #include "defs.h" #include "extern.h" -#ifdef EXMIMO -#include "gain_control.h" -#endif -#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR) + #include "common_lib.h" extern openair0_config_t openair0_cfg[]; -#endif + #define DEBUG_INITIAL_SYNCH -int pbch_detection(PHY_VARS_UE *phy_vars_ue, runmode_t mode) +int pbch_detection(PHY_VARS_UE *ue, runmode_t mode) { -uint8_t l,pbch_decoded,frame_mod4,pbch_tx_ant,dummy; -LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; -char phich_resource[6]; + uint8_t l,pbch_decoded,frame_mod4,pbch_tx_ant,dummy; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + char phich_resource[6]; #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",phy_vars_ue->Mod_id, - phy_vars_ue->rx_offset); + LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",ue->Mod_id, + ue->rx_offset); #endif for (l=0; lsymbols_per_tti/2; l++) { - slot_fep(phy_vars_ue, + slot_fep(ue, l, 0, - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); - } + } for (l=0; lsymbols_per_tti/2; l++) { - slot_fep(phy_vars_ue, + slot_fep(ue, l, 1, - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); - } - slot_fep(phy_vars_ue, + } + slot_fep(ue, 0, 2, - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); - lte_ue_measurements(phy_vars_ue, - phy_vars_ue->rx_offset, + lte_ue_measurements(ue, + ue->rx_offset, 0, - 0); - - - if (phy_vars_ue->lte_frame_parms.frame_type == TDD) { - ue_rrc_measurements(phy_vars_ue, - 1, + 0, + 0, + 0); + + + if (ue->frame_parms.frame_type == TDD) { + ue_rrc_measurements(ue, + 2, 0); } else { - ue_rrc_measurements(phy_vars_ue, + ue_rrc_measurements(ue, 0, 0); } #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"[UE %d] RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), avg rx power %d dB (%d lin), RX gain %d dB\n", - phy_vars_ue->Mod_id, - phy_vars_ue->PHY_measurements.rx_rssi_dBm[0] - ((phy_vars_ue->lte_frame_parms.nb_antennas_rx==2) ? 3 : 0), - phy_vars_ue->PHY_measurements.rx_power_dB[0][0], - phy_vars_ue->PHY_measurements.rx_power_dB[0][1], - phy_vars_ue->PHY_measurements.rx_power[0][0], - phy_vars_ue->PHY_measurements.rx_power[0][1], - phy_vars_ue->PHY_measurements.rx_power_avg_dB[0], - phy_vars_ue->PHY_measurements.rx_power_avg[0], - phy_vars_ue->rx_total_gain_dB); + ue->Mod_id, + ue->measurements.rx_rssi_dBm[0] - ((ue->frame_parms.nb_antennas_rx==2) ? 3 : 0), + ue->measurements.rx_power_dB[0][0], + ue->measurements.rx_power_dB[0][1], + ue->measurements.rx_power[0][0], + ue->measurements.rx_power[0][1], + ue->measurements.rx_power_avg_dB[0], + ue->measurements.rx_power_avg[0], + ue->rx_total_gain_dB); LOG_I(PHY,"[UE %d] N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n", - phy_vars_ue->Mod_id, - phy_vars_ue->PHY_measurements.n0_power_tot_dBm, - phy_vars_ue->PHY_measurements.n0_power_dB[0], - phy_vars_ue->PHY_measurements.n0_power_dB[1], - phy_vars_ue->PHY_measurements.n0_power[0], - phy_vars_ue->PHY_measurements.n0_power[1], - phy_vars_ue->PHY_measurements.n0_power_avg_dB, - phy_vars_ue->PHY_measurements.n0_power_avg); + ue->Mod_id, + ue->measurements.n0_power_tot_dBm, + ue->measurements.n0_power_dB[0], + ue->measurements.n0_power_dB[1], + ue->measurements.n0_power[0], + ue->measurements.n0_power[1], + ue->measurements.n0_power_avg_dB, + ue->measurements.n0_power_avg); #endif pbch_decoded = 0; for (frame_mod4=0; frame_mod4<4; frame_mod4++) { - pbch_tx_ant = rx_pbch(&phy_vars_ue->lte_ue_common_vars, - phy_vars_ue->lte_ue_pbch_vars[0], + pbch_tx_ant = rx_pbch(&ue->common_vars, + ue->pbch_vars[0], frame_parms, 0, SISO, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) { @@ -146,12 +137,12 @@ char phich_resource[6]; break; } - pbch_tx_ant = rx_pbch(&phy_vars_ue->lte_ue_common_vars, - phy_vars_ue->lte_ue_pbch_vars[0], + pbch_tx_ant = rx_pbch(&ue->common_vars, + ue->pbch_vars[0], frame_parms, 0, ALAMOUTI, - phy_vars_ue->high_speed_flag, + ue->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) { @@ -163,20 +154,19 @@ char phich_resource[6]; if (pbch_decoded) { - frame_parms->nb_antennas_tx_eNB = pbch_tx_ant; + frame_parms->nb_antenna_ports_eNB = pbch_tx_ant; // set initial transmission mode to 1 or 2 depending on number of detected TX antennas - frame_parms->mode1_flag = (pbch_tx_ant==1); // openair_daq_vars.dlsch_transmission_mode = (pbch_tx_ant>1) ? 2 : 1; // flip byte endian on 24-bits for MIB - // dummy = phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[0]; - // phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[0] = phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]; - // phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2] = dummy; + // dummy = ue->pbch_vars[0]->decoded_output[0]; + // ue->pbch_vars[0]->decoded_output[0] = ue->pbch_vars[0]->decoded_output[2]; + // ue->pbch_vars[0]->decoded_output[2] = dummy; // now check for Bandwidth of Cell - dummy = (phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]>>5)&7; + dummy = (ue->pbch_vars[0]->decoded_output[2]>>5)&7; switch (dummy) { @@ -205,15 +195,15 @@ char phich_resource[6]; break; default: - LOG_E(PHY,"[UE%d] Initial sync: PBCH decoding: Unknown N_RB_DL\n",phy_vars_ue->Mod_id); + LOG_E(PHY,"[UE%d] Initial sync: PBCH decoding: Unknown N_RB_DL\n",ue->Mod_id); return -1; break; } // now check for PHICH parameters - frame_parms->phich_config_common.phich_duration = (PHICH_DURATION_t)((phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]>>4)&1); - dummy = (phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]>>2)&3; + frame_parms->phich_config_common.phich_duration = (PHICH_DURATION_t)((ue->pbch_vars[0]->decoded_output[2]>>4)&1); + dummy = (ue->pbch_vars[0]->decoded_output[2]>>2)&3; switch (dummy) { case 0: @@ -237,25 +227,24 @@ char phich_resource[6]; break; default: - LOG_E(PHY,"[UE%d] Initial sync: Unknown PHICH_DURATION\n",phy_vars_ue->Mod_id); + LOG_E(PHY,"[UE%d] Initial sync: Unknown PHICH_DURATION\n",ue->Mod_id); return -1; break; } - phy_vars_ue->frame_rx = (((phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[2]&3)<<6) + (phy_vars_ue->lte_ue_pbch_vars[0]->decoded_output[1]>>2))<<2; - phy_vars_ue->frame_rx += frame_mod4; + for(int i=0; iproc.proc_rxtx[i].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2; + ue->proc.proc_rxtx[i].frame_rx = (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2; -#ifndef USER_MODE - // one frame delay - phy_vars_ue->frame_rx ++; -#endif - phy_vars_ue->frame_tx = phy_vars_ue->frame_rx; + ue->proc.proc_rxtx[i].frame_tx = ue->proc.proc_rxtx[0].frame_rx; + } #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"[UE%d] Initial sync: pbch decoded sucessfully mode1_flag %d, tx_ant %d, frame %d, N_RB_DL %d, phich_duration %d, phich_resource %s!\n", - phy_vars_ue->Mod_id, - frame_parms->mode1_flag, + LOG_I(PHY,"[UE%d] Initial sync: pbch decoded sucessfully p %d, tx_ant %d, frame %d, N_RB_DL %d, phich_duration %d, phich_resource %s!\n", + ue->Mod_id, + frame_parms->nb_antenna_ports_eNB, pbch_tx_ant, - phy_vars_ue->frame_rx, + ue->proc.proc_rxtx[0].frame_rx, frame_parms->N_RB_DL, frame_parms->phich_config_common.phich_duration, phich_resource); //frame_parms->phich_config_common.phich_resource); @@ -271,7 +260,7 @@ char phich_string[13][4] = {"","1/6","","1/2","","","one","","","","","","two"}; char duplex_string[2][4] = {"FDD","TDD"}; char prefix_string[2][9] = {"NORMAL","EXTENDED"}; -int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) +int initial_sync(PHY_VARS_UE *ue, runmode_t mode) { int32_t sync_pos,sync_pos2,sync_pos_slot; @@ -279,7 +268,7 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) uint8_t phase_fdd_ncp,phase_fdd_ecp,phase_tdd_ncp,phase_tdd_ecp; uint8_t flip_fdd_ncp,flip_fdd_ecp,flip_tdd_ncp,flip_tdd_ecp; // uint16_t Nid_cell_fdd_ncp=0,Nid_cell_fdd_ecp=0,Nid_cell_tdd_ncp=0,Nid_cell_tdd_ecp=0; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; int ret=-1; int aarx,rx_power=0; /*#ifdef OAI_USRP @@ -289,23 +278,25 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) // First try FDD normal prefix frame_parms->Ncp=NORMAL; frame_parms->frame_type=FDD; + frame_parms->nb_antenna_ports_eNB = 2; + init_frame_parms(frame_parms,1); /* - write_output("rxdata0.m","rxd0",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + write_output("rxdata0.m","rxd0",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); exit(-1); */ - sync_pos = lte_sync_time(phy_vars_ue->lte_ue_common_vars.rxdata, + sync_pos = lte_sync_time(ue->common_vars.rxdata, frame_parms, - (int *)&phy_vars_ue->lte_ue_common_vars.eNb_id); + (int *)&ue->common_vars.eNb_id); - // write_output("rxdata1.m","rxd1",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + // write_output("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); if (sync_pos >= frame_parms->nb_prefix_samples) sync_pos2 = sync_pos - frame_parms->nb_prefix_samples; else sync_pos2 = sync_pos + FRAME_LENGTH_COMPLEX_SAMPLES - frame_parms->nb_prefix_samples; #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",phy_vars_ue->Mod_id,sync_pos,phy_vars_ue->lte_ue_common_vars.eNb_id); + LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",ue->Mod_id,sync_pos,ue->common_vars.eNb_id); #endif // SSS detection @@ -314,25 +305,25 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) sync_pos_slot = (frame_parms->samples_per_tti>>1) - frame_parms->ofdm_symbol_size - frame_parms->nb_prefix_samples; if (sync_pos2 >= sync_pos_slot) - phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot; + ue->rx_offset = sync_pos2 - sync_pos_slot; else - phy_vars_ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot; + ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot; if (((sync_pos2 - sync_pos_slot) >=0 ) && ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) { #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"Calling sss detection (FDD normal CP)\n"); #endif - rx_sss(phy_vars_ue,&metric_fdd_ncp,&flip_fdd_ncp,&phase_fdd_ncp); + rx_sss(ue,&metric_fdd_ncp,&flip_fdd_ncp,&phase_fdd_ncp); frame_parms->nushift = frame_parms->Nid_cell%6; if (flip_fdd_ncp==1) - phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); + ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); - init_frame_parms(&phy_vars_ue->lte_frame_parms,1); - lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); - ret = pbch_detection(phy_vars_ue,mode); - // write_output("rxdata2.m","rxd2",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + init_frame_parms(&ue->frame_parms,1); + lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell); + ret = pbch_detection(ue,mode); + // write_output("rxdata2.m","rxd2",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"FDD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", @@ -361,25 +352,25 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) sync_pos_slot = (frame_parms->samples_per_tti>>1) - frame_parms->ofdm_symbol_size - (frame_parms->nb_prefix_samples); if (sync_pos2 >= sync_pos_slot) - phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot; + ue->rx_offset = sync_pos2 - sync_pos_slot; else - phy_vars_ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot; + ue->rx_offset = FRAME_LENGTH_COMPLEX_SAMPLES + sync_pos2 - sync_pos_slot; - //msg("nb_prefix_samples %d, rx_offset %d\n",frame_parms->nb_prefix_samples,phy_vars_ue->rx_offset); + //msg("nb_prefix_samples %d, rx_offset %d\n",frame_parms->nb_prefix_samples,ue->rx_offset); if (((sync_pos2 - sync_pos_slot) >=0 ) && ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) { - rx_sss(phy_vars_ue,&metric_fdd_ecp,&flip_fdd_ecp,&phase_fdd_ecp); + rx_sss(ue,&metric_fdd_ecp,&flip_fdd_ecp,&phase_fdd_ecp); frame_parms->nushift = frame_parms->Nid_cell%6; if (flip_fdd_ecp==1) - phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); + ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); - init_frame_parms(&phy_vars_ue->lte_frame_parms,1); - lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); - ret = pbch_detection(phy_vars_ue,mode); - // write_output("rxdata3.m","rxd3",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + init_frame_parms(&ue->frame_parms,1); + lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell); + ret = pbch_detection(ue,mode); + // write_output("rxdata3.m","rxd3",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"FDD Extended prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", frame_parms->Nid_cell,metric_fdd_ecp,phase_fdd_ecp,flip_fdd_ecp,ret); @@ -408,37 +399,26 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) (frame_parms->nb_prefix_samples); if (sync_pos2 >= sync_pos_slot) - phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot; + ue->rx_offset = sync_pos2 - sync_pos_slot; else - phy_vars_ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot; + ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot; - /*if (((sync_pos2 - sync_pos_slot) >=0 ) && - ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {*/ - - - rx_sss(phy_vars_ue,&metric_tdd_ncp,&flip_tdd_ncp,&phase_tdd_ncp); + rx_sss(ue,&metric_tdd_ncp,&flip_tdd_ncp,&phase_tdd_ncp); if (flip_tdd_ncp==1) - phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); + ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); frame_parms->nushift = frame_parms->Nid_cell%6; - init_frame_parms(&phy_vars_ue->lte_frame_parms,1); + init_frame_parms(&ue->frame_parms,1); - lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); - ret = pbch_detection(phy_vars_ue,mode); - // write_output("rxdata4.m","rxd4",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell); + ret = pbch_detection(ue,mode); + // write_output("rxdata4.m","rxd4",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"TDD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", frame_parms->Nid_cell,metric_tdd_ncp,phase_tdd_ncp,flip_tdd_ncp,ret); #endif - /*} - else { - #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"TDD Normal prefix: SSS error condition: sync_pos %d, sync_pos_slot %d\n", sync_pos, sync_pos_slot); - #endif - }*/ - if (ret==-1) { // Now TDD extended prefix @@ -456,110 +436,157 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) sync_pos_slot = frame_parms->samples_per_tti + (frame_parms->ofdm_symbol_size<<1) + (frame_parms->nb_prefix_samples<<1); if (sync_pos2 >= sync_pos_slot) - phy_vars_ue->rx_offset = sync_pos2 - sync_pos_slot; + ue->rx_offset = sync_pos2 - sync_pos_slot; else - phy_vars_ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot; + ue->rx_offset = (FRAME_LENGTH_COMPLEX_SAMPLES>>1) + sync_pos2 - sync_pos_slot; - /*if (((sync_pos2 - sync_pos_slot) >=0 ) && - ((sync_pos2 - sync_pos_slot) < ((FRAME_LENGTH_COMPLEX_SAMPLES-frame_parms->samples_per_tti/2)))) {*/ - - rx_sss(phy_vars_ue,&metric_tdd_ecp,&flip_tdd_ecp,&phase_tdd_ecp); + rx_sss(ue,&metric_tdd_ecp,&flip_tdd_ecp,&phase_tdd_ecp); frame_parms->nushift = frame_parms->Nid_cell%6; if (flip_tdd_ecp==1) - phy_vars_ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); + ue->rx_offset += (FRAME_LENGTH_COMPLEX_SAMPLES>>1); - init_frame_parms(&phy_vars_ue->lte_frame_parms,1); - lte_gold(frame_parms,phy_vars_ue->lte_gold_table[0],frame_parms->Nid_cell); - ret = pbch_detection(phy_vars_ue,mode); + init_frame_parms(&ue->frame_parms,1); + lte_gold(frame_parms,ue->lte_gold_table[0],frame_parms->Nid_cell); + ret = pbch_detection(ue,mode); - // write_output("rxdata5.m","rxd5",phy_vars_ue->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + // write_output("rxdata5.m","rxd5",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"TDD Extended prefix: CellId %d metric %d, phase %d, flip %d, pbch %d\n", frame_parms->Nid_cell,metric_tdd_ecp,phase_tdd_ecp,flip_tdd_ecp,ret); #endif - /*} - else { - #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"TDD Extended prefix: SSS error condition: sync_pos %d, sync_pos_slot %d\n", sync_pos, sync_pos_slot); - #endif - }*/ - } } } + /* Consider this is a false detection if the offset is > 1000 Hz */ + if( (abs(ue->common_vars.freq_offset) > 150) && (ret == 0) ) + { + ret=-1; +#if DISABLE_LOG_X + printf("Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset); +#else + LOG_E(HW, "Ignore MIB with high freq offset [%d Hz] estimation \n",ue->common_vars.freq_offset); +#endif + } + if (ret==0) { // PBCH found so indicate sync to higher layers and configure frame parameters -#ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"[UE%d] In synch, rx_offset %d samples\n",phy_vars_ue->Mod_id, phy_vars_ue->rx_offset); + //#ifdef DEBUG_INITIAL_SYNCH +#if DISABLE_LOG_X + printf("[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset); +#else + LOG_I(PHY, "[UE%d] In synch, rx_offset %d samples\n",ue->Mod_id, ue->rx_offset); #endif + //#endif - if (phy_vars_ue->UE_scan_carrier == 0) { - if (phy_vars_ue->mac_enabled==1) { - LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",phy_vars_ue->Mod_id); + if (ue->UE_scan_carrier == 0) { + + #if UE_AUTOTEST_TRACE + LOG_I(PHY,"[UE %d] AUTOTEST Cell Sync : frame = %d, rx_offset %d, freq_offset %d \n", + ue->Mod_id, + ue->proc.proc_rxtx[0].frame_rx, + ue->rx_offset, + ue->common_vars.freq_offset ); + #endif + +// send sync status to higher layers later when timing offset converge to target timing +#if OAISIM + if (ue->mac_enabled==1) { + LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id); //mac_resynch(); - mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,0,1);//phy_vars_ue->lte_ue_common_vars.eNb_id); - phy_vars_ue->UE_mode[0] = PRACH; + dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id); + ue->UE_mode[0] = PRACH; } else { - phy_vars_ue->UE_mode[0] = PUSCH; + ue->UE_mode[0] = PUSCH; } +#endif generate_pcfich_reg_mapping(frame_parms); generate_phich_reg_mapping(frame_parms); - // init_prach625(frame_parms); - //phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors=0; - phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_conseq=0; - //phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_last=0; + + ue->pbch_vars[0]->pdu_errors_conseq=0; + } - LOG_I(PHY,"[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx, - 10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB, - 10*log10(phy_vars_ue->PHY_measurements.rssi), - phy_vars_ue->rx_total_gain_dB, - phy_vars_ue->PHY_measurements.n0_power_tot_dBm, - 10*log10(phy_vars_ue->PHY_measurements.rsrp[0])-phy_vars_ue->rx_total_gain_dB, - (10*log10(phy_vars_ue->PHY_measurements.rsrq[0]))); - - - LOG_I(PHY,"[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n", - phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx, - duplex_string[phy_vars_ue->lte_frame_parms.frame_type], - prefix_string[phy_vars_ue->lte_frame_parms.Ncp], - phy_vars_ue->lte_frame_parms.Nid_cell, - phy_vars_ue->lte_frame_parms.N_RB_DL, - phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration, - phich_string[phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource], - phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB); -#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_LMSSDR) - LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n", - phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx, - openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset, - phy_vars_ue->lte_ue_common_vars.freq_offset); +#if DISABLE_LOG_X + printf("[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id, + ue->proc.proc_rxtx[0].frame_rx, + 10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB, + 10*log10(ue->measurements.rssi), + ue->rx_total_gain_dB, + ue->measurements.n0_power_tot_dBm, + 10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB, + (10*log10(ue->measurements.rsrq[0]))); + + + printf("[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n", + ue->Mod_id, + ue->proc.proc_rxtx[0].frame_rx, + duplex_string[ue->frame_parms.frame_type], + prefix_string[ue->frame_parms.Ncp], + ue->frame_parms.Nid_cell, + ue->frame_parms.N_RB_DL, + ue->frame_parms.phich_config_common.phich_duration, + phich_string[ue->frame_parms.phich_config_common.phich_resource], + ue->frame_parms.nb_antenna_ports_eNB); +#else + LOG_I(PHY, "[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id, + ue->proc.proc_rxtx[0].frame_rx, + 10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB, + 10*log10(ue->measurements.rssi), + ue->rx_total_gain_dB, + ue->measurements.n0_power_tot_dBm, + 10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB, + (10*log10(ue->measurements.rsrq[0]))); + + LOG_I(PHY, "[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n", + ue->Mod_id, + ue->proc.proc_rxtx[0].frame_rx, + duplex_string[ue->frame_parms.frame_type], + prefix_string[ue->frame_parms.Ncp], + ue->frame_parms.Nid_cell, + ue->frame_parms.N_RB_DL, + ue->frame_parms.phich_config_common.phich_duration, + phich_string[ue->frame_parms.phich_config_common.phich_resource], + ue->frame_parms.nb_antenna_ports_eNB); +#endif + +#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) +# if DISABLE_LOG_X + printf("[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n", + ue->Mod_id, + ue->proc.proc_rxtx[0].frame_rx, + openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset, + ue->common_vars.freq_offset); +# else + LOG_I(PHY, "[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n", + ue->Mod_id, + ue->proc.proc_rxtx[0].frame_rx, + openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset, + ue->common_vars.freq_offset); +# endif #endif } else { #ifdef DEBUG_INITIAL_SYNC - LOG_I(PHY,"[UE%d] Initial sync : PBCH not ok\n",phy_vars_ue->Mod_id); - LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",phy_vars_ue->Mod_id,sync_pos,phy_vars_ue->lte_ue_common_vars.eNb_id); + LOG_I(PHY,"[UE%d] Initial sync : PBCH not ok\n",ue->Mod_id); + LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n",ue->Mod_id,sync_pos,ue->common_vars.eNb_id); /* LOG_I(PHY,"[UE%d] Initial sync: (metric fdd_ncp %d (%d), metric fdd_ecp %d (%d), metric_tdd_ncp %d (%d), metric_tdd_ecp %d (%d))\n", - phy_vars_ue->Mod_id, + ue->Mod_id, metric_fdd_ncp,Nid_cell_fdd_ncp, metric_fdd_ecp,Nid_cell_fdd_ecp, metric_tdd_ncp,Nid_cell_tdd_ncp, metric_tdd_ecp,Nid_cell_tdd_ecp);*/ - LOG_I(PHY,"[UE%d] Initial sync : Estimated Nid_cell %d, Frame_type %d\n",phy_vars_ue->Mod_id, + LOG_I(PHY,"[UE%d] Initial sync : Estimated Nid_cell %d, Frame_type %d\n",ue->Mod_id, frame_parms->Nid_cell,frame_parms->frame_type); #endif - phy_vars_ue->UE_mode[0] = NOT_SYNCHED; - phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_last=phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors; - phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors++; - phy_vars_ue->lte_ue_pbch_vars[0]->pdu_errors_conseq++; + ue->UE_mode[0] = NOT_SYNCHED; + ue->pbch_vars[0]->pdu_errors_last=ue->pbch_vars[0]->pdu_errors; + ue->pbch_vars[0]->pdu_errors++; + ue->pbch_vars[0]->pdu_errors_conseq++; } @@ -569,57 +596,44 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode) // do a measurement on the best guess of the PSS for (aarx=0; aarxnb_antennas_rx; aarx++) - rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][sync_pos2], + rx_power += signal_energy(&ue->common_vars.rxdata[aarx][sync_pos2], frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples); - + /* // do a measurement on the full frame for (aarx=0; aarxnb_antennas_rx; aarx++) - rx_power += signal_energy(&phy_vars_ue->lte_ue_common_vars.rxdata[aarx][0], + rx_power += signal_energy(&ue->common_vars.rxdata[aarx][0], frame_parms->samples_per_tti*10); */ // we might add a low-pass filter here later - phy_vars_ue->PHY_measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx; + ue->measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx; - phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] = dB_fixed(phy_vars_ue->PHY_measurements.rx_power_avg[0]); + ue->measurements.rx_power_avg_dB[0] = dB_fixed(ue->measurements.rx_power_avg[0]); #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",phy_vars_ue->Mod_id,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0] ); + LOG_I(PHY,"[UE%d] Initial sync : Estimated power: %d dB\n",ue->Mod_id,ue->measurements.rx_power_avg_dB[0] ); #endif -#ifdef EXMIMO - if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) && - (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) ) - //phy_adjust_gain(phy_vars_ue,0); - gain_control_all(phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0); - -#else #ifndef OAI_USRP -#ifndef OAI_BLADERF +#ifndef OAI_BLADERF #ifndef OAI_LMSSDR - phy_adjust_gain(phy_vars_ue,phy_vars_ue->PHY_measurements.rx_power_avg_dB[0],0); -#endif + phy_adjust_gain(ue,ue->measurements.rx_power_avg_dB[0],0); #endif #endif #endif + } else { -#ifdef EXMIMO - if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) && - (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) ) - //phy_adjust_gain(phy_vars_ue,0); - gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); -#else #ifndef OAI_USRP -#ifndef OAI_BLADERF +#ifndef OAI_BLADERF #ifndef OAI_LMSSDR - phy_adjust_gain(phy_vars_ue,dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); -#endif + phy_adjust_gain(ue,dB_fixed(ue->measurements.rssi),0); #endif #endif #endif + } // exit_fun("debug exit"); diff --git a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c index 41d9ec72a6..910610b969 100644 --- a/openair1/PHY/LTE_TRANSPORT/lte_mcs.c +++ b/openair1/PHY/LTE_TRANSPORT/lte_mcs.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/lte_mcs.c * \brief Some support routines for MCS computations @@ -121,13 +113,8 @@ uint32_t get_TBS_DL(uint8_t mcs, uint16_t nb_rb) uint32_t TBS; if ((nb_rb > 0) && (mcs < 29)) { -#ifdef TBS_FIX - TBS = 3*TBStable[get_I_TBS(mcs)][nb_rb-1]/4; - TBS = TBS>>3; -#else TBS = TBStable[get_I_TBS(mcs)][nb_rb-1]; TBS = TBS>>3; -#endif return(TBS); } else { return(uint32_t)0; @@ -140,13 +127,8 @@ uint32_t get_TBS_UL(uint8_t mcs, uint16_t nb_rb) uint32_t TBS = 0; if ((nb_rb > 0) && (mcs < 29)) { -#ifdef TBS_FIX - TBS = 3*TBStable[get_I_TBS_UL(mcs)][nb_rb-1]/4; - TBS = TBS>>3; -#else TBS = TBStable[get_I_TBS_UL(mcs)][nb_rb-1]; TBS = TBS>>3; -#endif return(TBS); } else { return(uint32_t)0; @@ -306,7 +288,7 @@ int adjust_G(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_orde // printf("re_pbch_sss %d\n",re_pbch_sss); if (subframe==0) { //PBCH+SSS+PSS if (frame_parms->frame_type == TDD) { // TDD - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) //2ant so PBCH 3+2/3 symbols, SSS 1 symbol * REs => (14/3)*re_pbch_sss for normal CP, // 2+4/3 symbols, SSS 1 symbol => (13/3)*re_pbch_sss for ext. CP return((-frame_parms->Ncp+14)*re_pbch_sss * mod_order/3); @@ -315,7 +297,7 @@ int adjust_G(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_orde // 2+10/6 symbols, SSS 1 symbol => (28/6)*re_pbch_sss for ext. CP return((-frame_parms->Ncp+29)*re_pbch_sss * mod_order/6); } else { // FDD - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) //2ant so PBCH 3+2/3 symbols, PSS+SSS 2 symbols * REs => (17/3)*re_pbch_sss for normal CP, // 2+4/3 symbols, PSS+SSS 2 symbols => (16/3)*re_pbch_sss for ext. CP return((-frame_parms->Ncp+17)*re_pbch_sss * mod_order/3); @@ -333,11 +315,8 @@ int adjust_G(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_orde return(0); } -int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t Nl,uint8_t num_pdcch_symbols,int frame,uint8_t subframe) +int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t Nl,uint8_t num_pdcch_symbols,int frame,uint8_t subframe,uint8_t beamforming_mode) { - - - int G_adj; if (is_pmch_subframe(frame,subframe,frame_parms) == 0) { @@ -348,17 +327,21 @@ int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint // PDDDPDD PDDDPDD - 13 PDSCH symbols, 10 full, 3 w/ pilots = 10*12 + 3*8 // PCDDPDD PDDDPDD - 12 PDSCH symbols, 9 full, 3 w/ pilots = 9*12 + 3*8 // PCCDPDD PDDDPDD - 11 PDSCH symbols, 8 full, 3 w/pilots = 8*12 + 3*8 - if (frame_parms->mode1_flag==0) // SISO + if (beamforming_mode==0 && frame_parms->nb_antenna_ports_eNB!=1) return((((int)nb_rb * mod_order * ((11-num_pdcch_symbols)*12 + 3*8)) - G_adj)*Nl); - else + else if(beamforming_mode==7) + return(((int)nb_rb * mod_order * ((7-num_pdcch_symbols)*12 + 3*10 + 4*9)) - G_adj); + else //SISO return(((int)nb_rb * mod_order * ((11-num_pdcch_symbols)*12 + 3*10)) - G_adj); } else { // PDDPDD PDDPDD - 11 PDSCH symbols, 8 full, 3 w/ pilots = 8*12 + 3*8 // PCDPDD PDDPDD - 10 PDSCH symbols, 7 full, 3 w/ pilots = 7*12 + 3*8 // PCCPDD PDDPDD - 9 PDSCH symbols, 6 full, 3 w/pilots = 6*12 + 3*8 - if (frame_parms->mode1_flag==0) + if (frame_parms->nb_antenna_ports_eNB!=1) return((((int)nb_rb * mod_order * ((9-num_pdcch_symbols)*12 + 3*8)) - G_adj)*Nl); - else + else if(beamforming_mode==7) + return(((int)nb_rb * mod_order * ((5-num_pdcch_symbols)*12 + 3*8 + 4*9)) - G_adj); + else //SISO return(((int)nb_rb * mod_order * ((9-num_pdcch_symbols)*12 + 3*10)) - G_adj); } } else { // This is an MBSFN subframe diff --git a/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h b/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h index 36f965a5ff..59959a90fd 100644 --- a/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/mcs_tbs_tools.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define modOrder(I_MCS,I_TBS) ((I_MCS-I_TBS)*2+2) // Find modulation order from I_TBS and I_MCS /** \fn unsigned char I_TBS2I_MCS(unsigned char I_TBS); diff --git a/openair1/PHY/LTE_TRANSPORT/mdci.h b/openair1/PHY/LTE_TRANSPORT/mdci.h new file mode 100644 index 0000000000..1e278f8011 --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/mdci.h @@ -0,0 +1,469 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/LTE_TRANSPORT/dci.h + * \brief typedefs for LTE DCI structures from 36-212, V8.6 2009-03. Limited to 5 MHz formats for the moment.Current LTE compliance V8.6 2009-03. + * \author R. Knopp + * \date 2011 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr + * \note + * \warning + */ + +#include + + +/// basic DCI Format Type 6-0A (5 MHz, FDD, rep2, no mod order override - XX bits) +struct DCI6_0A_5MHz { + /// padding to fill 32 bit word + uint32_t padding:5; + /// DCI subframe repetition + uint32_t dci_rep:2; + /// SRS Request + uint32_t srs_req:1; + /// CSI Request + uint32_t csi_req:1; + /// Power Control + uint32_t TPC:2; + /// redundancy version + uint32_t rv_idx:2; + /// new data indicator + uint32_t ndi:1; + /// harq id + uint32_t harq_pid:3; + /// Repetition number + uint32_t rep:2; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// RB Assignment (ceil(log2(floor(N_RB_UL/6))) + 5 bits) + uint32_t rballoc:7; + /// Hopping flag + uint32_t hopping:1; + /// type = 0 => DCI Format 0, type = 1 => DCI Format 1A + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_0A_5MHz DCI6_0A_5MHz_t; +#define sizeof_DCI6_0A_5MHz_t 28 // extended by one bit to match DCI6_1A + +/// basic DCI Format Type 6-1A (5 MHz, FDD primary carrier, 24 bits, 5 bit format, TM!=9,TM!=6, no scheduling enhancement) +struct DCI6_1A_5MHz { + /// padding to fill 32-bit word + uint32_t padding:4; + /// DCI subframe repetition number + uint32_t dci_rep:2; + /// HARQ-ACK resource offset + uint32_t harq_ack_off:2; + /// SRS request + uint32_t srs_req:1; + /// Power Control + uint32_t TPC:2; + /// Redundancy version + uint32_t rv:2; + /// New Data Indicator + uint32_t ndi:1; + /// HARQ Process + uint32_t harq_pid:3; + /// Repetition number + uint32_t rep:2; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// Resource block assignment (assignment flag = 0 for 5 MHz, ceil(log2(floor(N_RB_DL/6)))+5) + uint32_t rballoc:7; + /// Frequency hopping flag + uint32_t hopping:1; + /// 0/1A differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_1A_5MHz DCI6_1A_5MHz_t; +#define sizeof_DCI6_1A_5MHz_t 28 + +/// basic DCI Format Type 6-0A (10 MHz, FDD, rep2, no mod order override - XX bits) +struct DCI6_0A_10MHz { + /// padding to fill 32 bit word + uint32_t padding:4; + /// DCI subframe repetition + uint32_t dci_rep:2; + /// SRS Request + uint32_t srs_req:1; + /// CSI Request + uint32_t csi_req:1; + /// Power Control + uint32_t TPC:2; + /// redundancy version + uint32_t rv_idx:2; + /// new data indicator + uint32_t ndi:1; + /// harq id + uint32_t harq_pid:3; + /// Repetition number + uint32_t rep:2; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// RB Assignment (ceil(log2(floor(N_RB_UL/6))) + 5 bits) + uint32_t rballoc:8; + /// Hopping flag + uint32_t hopping:1; + /// type = 0 => DCI Format 0, type = 1 => DCI Format 1A + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_0A_10MHz DCI6_0A_10MHz_t; +#define sizeof_DCI6_0A_10MHz_t 29 // extended by one bit to match DCI6_1A + +/// basic DCI Format Type 6-1A (10 MHz, FDD primary carrier, 24 bits, 5 bit format, TM!=9,TM!=6, no scheduling enhancement) +struct DCI6_1A_10MHz { + /// padding to fill 32-bit word + uint32_t padding:4; + /// DCI subframe repetition number + uint32_t dci_rep:2; + /// HARQ-ACK resource offset + uint32_t harq_ack_off:2; + /// SRS request + uint32_t srs_req:1; + /// Power Control + uint32_t TPC:2; + /// Redundancy version + uint32_t rv:2; + /// New Data Indicator + uint32_t ndi:1; + /// HARQ Process + uint32_t harq_pid:3; + /// Repetition number + uint32_t rep:2; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// Resource block assignment (assignment flag = 0 for 10 MHz, ceil(log2(floor(N_RB_DL/6)))+5) + uint32_t rballoc:8; + /// Frequency hopping flag + uint32_t hopping:1; + /// 0/1A differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_1A_10MHz DCI6_1A_10MHz_t; +#define sizeof_DCI6_1A_10MHz_t 29 + +/// basic DCI Format Type 6-0A (20 MHz, FDD, rep2, no mod order override - XX bits) +struct DCI6_0A_20MHz { + /// padding to fill 32 bit word + uint32_t padding:4; + /// DCI subframe repetition + uint32_t dci_rep:2; + /// SRS Request + uint32_t srs_req:1; + /// CSI Request + uint32_t csi_req:1; + /// Power Control + uint32_t TPC:2; + /// redundancy version + uint32_t rv_idx:2; + /// new data indicator + uint32_t ndi:1; + /// harq id + uint32_t harq_pid:3; + /// Repetition number + uint32_t rep:2; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// RB Assignment (ceil(log2(floor(N_RB_UL/6))) + 5 bits) + uint32_t rballoc:9; + /// Hopping flag + uint32_t hopping:1; + /// type = 0 => DCI Format 0, type = 1 => DCI Format 1A + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_0A_20MHz DCI6_0A_20MHz_t; +#define sizeof_DCI6_0A_20MHz_t 30 // extended by one bit to match DCI6_1A + +/// basic DCI Format Type 6-1A (20 MHz, FDD primary carrier, 24 bits, 5 bit format, TM!=9,TM!=6, no scheduling enhancement) +struct DCI6_1A_20MHz { + /// padding to fill 32-bit word + uint32_t padding:3; + /// DCI subframe repetition number + uint32_t dci_rep:2; + /// HARQ-ACK resource offset + uint32_t harq_ack_off:2; + /// SRS request + uint32_t srs_req:1; + /// Power Control + uint32_t TPC:2; + /// Redundancy version + uint32_t rv:2; + /// New Data Indicator + uint32_t ndi:1; + /// HARQ Process + uint32_t harq_pid:3; + /// Repetition number + uint32_t rep:2; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// Resource block assignment (assignment flag = 0 for 20 MHz, ceil(log2(floor(N_RB_DL/6)))+5) + uint32_t rballoc:9; + /// Frequency hopping flag + uint32_t hopping:1; + /// 0/1A differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_1A_20MHz DCI6_1A_20MHz_t; +#define sizeof_DCI6_1A_20MHz_t 30 + +/// basic DCI Format Type 6-0B (5 MHz) +struct DCI6_0B_5MHz { + /// padding to fill 32-bit word + uint32_t padding:15; + /// DCI subframe repetition + uint32_t dci_rep:2; + /// new data indicator + uint32_t ndi:1; + /// harq id + uint32_t harq_pid:1; + /// Repetition number + uint32_t rep:3; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// RB Assignment (ceil(log2(floor(N_RB_UL/6))) + 3 bits) + uint32_t rballoc:5; + /// type = 0 => DCI Format 0B, type = 1 => DCI Format 1B + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_0B_5MHz DCI6_0B_5MHz_t; +#define sizeof_DCI6_0B_5MHz_t 17 + +/// basic DCI Format Type 6-1B (5 MHz) +struct DCI6_1B_5MHz { + /// padding to fill 32-bit word + uint32_t padding:15; + /// DCI subframe repetition number + uint32_t dci_rep:2; + /// HARQ-ACK resource offset + uint32_t harq_ack_off:2; + /// New Data Indicator + uint32_t ndi:1; + /// HARQ Process + uint32_t harq_pid:1; + /// Repetition number + uint32_t rep:3; + /// Resource block assignment (assignment flag = 0 for 5 MHz, ceil(log2(floor(N_RB_DL/6)))+1) + uint32_t rballoc:3; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// 0B/1B differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_1B_5MHz DCI6_1B_5MHz_t; +#define sizeof_DCI6_1B_5MHz_t 17 + +/// basic DCI Format Type 6-0B (10 MHz) +struct DCI6_0B_10MHz { + /// padding to fill 32-bit word + uint32_t padding:14; + /// DCI subframe repetition + uint32_t dci_rep:2; + /// new data indicator + uint32_t ndi:1; + /// harq id + uint32_t harq_pid:1; + /// Repetition number + uint32_t rep:3; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// RB Assignment (ceil(log2(floor(N_RB_UL/6))) + 3 bits) + uint32_t rballoc:6; + /// type = 0 => DCI Format 0B, type = 1 => DCI Format 1B + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_0B_10MHz DCI6_0B_10MHz_t; +#define sizeof_DCI6_0B_10MHz_t 18 + +/// basic DCI Format Type 6-1B (10 MHz) +struct DCI6_1B_10MHz { + /// padding to fill 32-bit word + uint32_t padding:15; + /// DCI subframe repetition number + uint32_t dci_rep:2; + /// HARQ-ACK resource offset + uint32_t harq_ack_off:2; + /// New Data Indicator + uint32_t ndi:1; + /// HARQ Process + uint32_t harq_pid:1; + /// Repetition number + uint32_t rep:2; + /// Resource block assignment (assignment flag = 0 for 5 MHz, ceil(log2(floor(N_RB_DL/6)))+1) + uint32_t rballoc:4; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// 0B/1B differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_1B_10MHz DCI6_1B_10MHz_t; +#define sizeof_DCI6_1B_10MHz_t 17 + +/// basic DCI Format Type 6-0B (20 MHz) +struct DCI6_0B_20MHz { + /// padding to fill 32-bit word + uint32_t padding:14; + /// DCI subframe repetition + uint32_t dci_rep:2; + /// new data indicator + uint32_t ndi:1; + /// harq id + uint32_t harq_pid:1; + /// Repetition number + uint32_t rep:2; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// RB Assignment (ceil(log2(floor(N_RB_UL/6))) + 3 bits) + uint32_t rballoc:7; + /// type = 0 => DCI Format 0B, type = 1 => DCI Format 1B + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_0B_20MHz DCI6_0B_20MHz_t; +#define sizeof_DCI6_0B_20MHz_t 18 + +/// basic DCI Format Type 6-1B (10 MHz) +struct DCI6_1B_20MHz { + /// padding to fill 32-bit word + uint32_t padding:14; + /// DCI subframe repetition number + uint32_t dci_rep:2; + /// HARQ-ACK resource offset + uint32_t harq_ack_off:2; + /// New Data Indicator + uint32_t ndi:1; + /// HARQ Process + uint32_t harq_pid:1; + /// Repetition number + uint32_t rep:2; + /// Resource block assignment (assignment flag = 0 for 5 MHz, ceil(log2(floor(N_RB_DL/6)))+1) + uint32_t rballoc:5; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:4; + /// 0B/1B differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_1B_20MHz DCI6_1B_20MHz_t; +#define sizeof_DCI6_1B_20MHz_t 18 + +/// basic DCI Format Type 6-2 for paging (5 MHz) +struct DCI6_2_paging_5MHz { + /// padding to reach 32-bits + uint32_t padding:21; + /// DCI subframe repetition number + uint32_t dci_rep:2; + /// Repetition number + uint32_t rep:3; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:3; + /// Resource block assignment (ceil(log2(floor(N_RB_DL/6))) bits) + uint32_t rballoc:2; + /// 0B/1B paging/directindication differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_2_paging_5MHz DCI6_2_paging_5MHz_t; + +/// basic DCI Format Type 6-2 for direct indication (5 MHz) +struct DCI6_2_di_5MHz { + /// padding to reach 32-bits + uint32_t padding:23; + /// Direct indication information + uint32_t di_info:8; + /// 0B/1B paging/directindication differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_2_di_5MHz DCI6_2_di_5MHz_t; +#define sizeof_DCI6_2_5MHz_t 11 + +/// basic DCI Format Type 6-2 for paging (10 MHz) +struct DCI6_2_paging_10MHz { + /// padding to reach 32-bits + uint32_t padding:20; + /// DCI subframe repetition number + uint32_t dci_rep:2; + /// Repetition number + uint32_t rep:3; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:3; + /// Resource block assignment (ceil(log2(floor(N_RB_DL/6)))) + uint32_t rballoc:3; + /// 0B/1B paging/directindication differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); +typedef struct DCI6_2_paging_10MHz DCI6_2_paging_10MHz_t; + +/// basic DCI Format Type 6-2 for direct indication (10 MHz) +struct DCI6_2_di_10MHz { + /// padding to reach 32-bits + uint32_t padding:23; + /// Direct indication information + uint32_t di_info:8; + /// 0B/1B paging/directindication differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_2_di_10MHz DCI6_2_di_10MHz_t; +#define sizeof_DCI6_2_10MHz_t 12 + +/// basic DCI Format Type 6-2 for paging (20 MHz) +struct DCI6_2_paging_20MHz { + /// padding to reach 32-bits + uint32_t padding:19; + /// DCI subframe repetition number + uint32_t dci_rep:2; + /// Repetition number + uint32_t rep:3; + /// Modulation and Coding Scheme and Redundancy Version + uint32_t mcs:3; + /// Resource block assignment (ceil(log2(floor(N_RB_DL/6)))) + uint32_t rballoc:4; + /// 0B/1B paging/directindication differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_2_paging_20MHz DCI6_2_paging_20MHz_t; + +/// basic DCI Format Type 6-2 for direct indication (20 MHz) +struct DCI6_2_di_20MHz { + /// padding to reach 32-bits + uint32_t padding:23; + /// Direct indication information + uint32_t di_info:8; + /// 0B/1B paging/directindication differentiator + uint32_t type:1; +} __attribute__ ((__packed__)); + +typedef struct DCI6_2_di_20MHz DCI6_2_di_20MHz_t; +#define sizeof_DCI6_2_20MHz_t 13 + diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c old mode 100755 new mode 100644 index b7b7149c62..9e5b6757fc --- a/openair1/PHY/LTE_TRANSPORT/pbch.c +++ b/openair1/PHY/LTE_TRANSPORT/pbch.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/pbch.c * \brief Top-level routines for generating and decoding the PBCH/BCH physical/transport channel V8.6 2009-03 @@ -45,18 +37,10 @@ #include "PHY/extern.h" #include "PHY/sse_intrin.h" -#ifdef PHY_ABSTRACTION -#include "SIMULATION/TOOLS/defs.h" -#endif - - //#define DEBUG_PBCH 1 //#define DEBUG_PBCH_ENCODING //#define INTERFERENCE_MITIGATION 1 -#ifdef OPENAIR2 -#include "PHY_INTERFACE/defs.h" -#endif #define PBCH_A 24 @@ -71,10 +55,10 @@ int allocate_pbch_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, uint32_t *re_allocated) { - MIMO_mode_t mimo_mode = (frame_parms->mode1_flag==1)?SISO:ALAMOUTI; + MIMO_mode_t mimo_mode = (frame_parms->nb_antenna_ports_eNB==1)?SISO:ALAMOUTI; - uint32_t tti_offset,aa; + uint32_t tti_offset; uint8_t re; int16_t gain_lin_QPSK; int16_t re_off=re_offset; @@ -99,15 +83,11 @@ int allocate_pbch_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, *re_allocated = *re_allocated + 1; // printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); - for (aa=0; aanb_antennas_tx; aa++) { - ((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i - } + ((int16_t*)&txdataF[0][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i *jj = *jj + 1; - for (aa=0; aanb_antennas_tx; aa++) { - ((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} - } + ((int16_t*)&txdataF[0][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1} *jj = *jj + 1; } else if (mimo_mode == ALAMOUTI) { @@ -189,6 +169,8 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, pbch_E = (frame_parms->Ncp==NORMAL) ? 1920 : 1728; //RE/RB * #RB * bits/RB (QPSK) // pbch_E_bytes = pbch_coded_bits>>3; + LOG_D(PHY,"%s(eNB_pbch:%p txdataF:%p amp:%d frame_parms:%p pbch_pdu:%p frame_mod4:%d)\n", __FUNCTION__, eNB_pbch, txdataF, amp, frame_parms, pbch_pdu, frame_mod4==0); + if (frame_mod4==0) { bzero(pbch_a,PBCH_A>>3); bzero(eNB_pbch->pbch_e,pbch_E); @@ -200,7 +182,7 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, /* // scramble crc with PBCH CRC mask (Table 5.3.1.1-1 of 3GPP 36.212-860) - switch (frame_parms->nb_antennas_tx_eNB) { + switch (frame_parms->nb_antenna_ports_eNB) { case 1: crc = crc ^ (uint16_t) 0; break; @@ -222,17 +204,17 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, // pbch_data[i] = ((char*) &crc)[0]; // pbch_data[i+1] = ((char*) &crc)[1]; -#ifdef DEBUG_PBCH + //#ifdef DEBUG_PBCH for (i=0; i<(PBCH_A>>3); i++) - msg("[PBCH] pbch_data[%d] = %x\n",i,pbch_a[i]); + LOG_D(PHY,"[PBCH] pbch_data[%d] = %x\n",i,pbch_a[i]); -#endif + //#endif - if (frame_parms->mode1_flag == 1) + if (frame_parms->nb_antenna_ports_eNB == 1) amask = 0x0000; else { - switch (frame_parms->nb_antennas_tx_eNB) { + switch (frame_parms->nb_antenna_ports_eNB) { case 1: amask = 0x0000; break; @@ -252,7 +234,7 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, #ifdef DEBUG_PBCH_ENCODING for (i=0; i<16+PBCH_A; i++) - msg("%d : (%d,%d,%d)\n",i,*(eNB_pbch->pbch_d+96+(3*i)),*(eNB_pbch->pbch_d+97+(3*i)),*(eNB_pbch->pbch_d+98+(3*i))); + LOG_D(PHY,"%d : (%d,%d,%d)\n",i,*(eNB_pbch->pbch_d+96+(3*i)),*(eNB_pbch->pbch_d+97+(3*i)),*(eNB_pbch->pbch_d+98+(3*i))); #endif //DEBUG_PBCH_ENCODING @@ -273,36 +255,32 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, #endif #ifdef DEBUG_PBCH - #ifdef USER_MODE write_output("pbch_encoded_output2.m","pbch_encoded_out2", pbch_coded_data2, pbch_coded_bits, 1, 4); - #endif //USER_MODE #endif //DEBUG_PBCH */ #ifdef DEBUG_PBCH_ENCODING - msg("Doing PBCH interleaving for %d coded bits, e %p\n",pbch_D,eNB_pbch->pbch_e); + LOG_D(PHY,"Doing PBCH interleaving for %d coded bits, e %p\n",pbch_D,eNB_pbch->pbch_e); #endif RCC = sub_block_interleaving_cc(pbch_D,eNB_pbch->pbch_d+96,eNB_pbch->pbch_w); lte_rate_matching_cc(RCC,pbch_E,eNB_pbch->pbch_w,eNB_pbch->pbch_e); #ifdef DEBUG_PBCH_ENCODING - msg("PBCH_e:\n"); + LOG_D(PHY,"PBCH_e:\n"); for (i=0; ipbch_e+i)); + LOG_D(PHY,"%d %d\n",i,*(eNB_pbch->pbch_e+i)); - msg("\n"); + LOG_D(PHY,"\n"); #endif #ifdef DEBUG_PBCH -#ifdef USER_MODE - if (frame_mod4==0) { write_output("pbch_e.m","pbch_e", eNB_pbch->pbch_e, @@ -313,8 +291,6 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, for (i=0; i<16; i++) printf("e[%d] %d\n",i,eNB_pbch->pbch_e[i]); } - -#endif //USER_MODE #endif //DEBUG_PBCH // scrambling @@ -322,8 +298,6 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, eNB_pbch->pbch_e, pbch_E); #ifdef DEBUG_PBCH -#ifdef USER_MODE - if (frame_mod4==0) { write_output("pbch_e_s.m","pbch_e_s", eNB_pbch->pbch_e, @@ -334,8 +308,6 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, for (i=0; i<16; i++) printf("e_s[%d] %d\n",i,eNB_pbch->pbch_e[i]); } - -#endif //USER_MODE #endif //DEBUG_PBCH } // frame_mod4==0 @@ -363,7 +335,7 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, } #ifdef DEBUG_PBCH - msg("[PBCH] l=%d, pilots=%d\n",l,pilots); + LOG_D(PHY,"[PBCH] l=%d, pilots=%d\n",l,pilots); #endif @@ -373,7 +345,7 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, for (rb=0; rb<6; rb++) { #ifdef DEBUG_PBCH - msg("RB %d, jj %d, re_offset %d, symbol_offset %d, pilots %d, nushift %d\n",rb,jj,re_offset, symbol_offset, pilots,frame_parms->nushift); + LOG_D(PHY,"RB %d, jj %d, re_offset %d, symbol_offset %d, pilots %d, nushift %d\n",rb,jj,re_offset, symbol_offset, pilots,frame_parms->nushift); #endif allocate_pbch_REs_in_RB(frame_parms, txdataF, @@ -407,7 +379,7 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch, printf("%d=>(%d,%d)",i,((short*)&txdataF[0][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[0], ((short*)&txdataF[0][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[1]); - if (frame_parms->mode1_flag==0) { + if (frame_parms->nb_antenna_ports_eNB!=1) { printf("(%d,%d)\n",((short*)&txdataF[1][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[0], ((short*)&txdataF[1][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[1]); } else { @@ -492,7 +464,7 @@ uint16_t pbch_extract(int **rxdataF, } } - for (aatx=0; aatx<4; aatx++) { //frame_parms->nb_antennas_tx_eNB;aatx++) { + for (aatx=0; aatx<4; aatx++) { //frame_parms->nb_antenna_ports_eNB;aatx++) { if (high_speed_flag == 1) dl_ch0 = &dl_ch_estimates[(aatx<<1)+aarx][LTE_CE_OFFSET+ch_offset+(symbol*(frame_parms->ofdm_symbol_size))]; else @@ -554,7 +526,7 @@ int pbch_channel_level(int **dl_ch_estimates_ext, uint32_t nsymb = (frame_parms->Ncp==0) ? 7:6; uint32_t symbol_mod = symbol % nsymb; - for (aatx=0; aatx<4; aatx++) //frame_parms->nb_antennas_tx_eNB;aatx++) + for (aatx=0; aatx<4; aatx++) //frame_parms->nb_antenna_ports_eNB;aatx++) for (aarx=0; aarxnb_antennas_rx; aarx++) { //clear average level @@ -624,7 +596,7 @@ void pbch_channel_compensation(int **rxdataF_ext, #endif symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - for (aatx=0; aatx<4; aatx++) //frame_parms->nb_antennas_tx_eNB;aatx++) + for (aatx=0; aatx<4; aatx++) //frame_parms->nb_antenna_ports_eNB;aatx++) for (aarx=0; aarxnb_antennas_rx; aarx++) { #if defined(__x86_64__) || defined(__i386__) @@ -731,7 +703,7 @@ void pbch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms, symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; if (frame_parms->nb_antennas_rx>1) { - for (aatx=0; aatx<4; aatx++) { //frame_parms->nb_antennas_tx_eNB;aatx++) { + for (aatx=0; aatx<4; aatx++) { //frame_parms->nb_antenna_ports_eNB;aatx++) { #if defined(__x86_64__) || defined(__i386__) rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[(aatx<<1)][symbol_mod*6*12]; rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[(aatx<<1)+1][symbol_mod*6*12]; @@ -805,7 +777,6 @@ void pbch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, // take the quarter of the PBCH that corresponds to this frame if ((i>=(frame_mod4*(length>>2))) && (i<((1+frame_mod4)*(length>>2)))) { - // if (((s>>(i%32))&1)==1) if (((s>>(i%32))&1)==0) llr[i] = -llr[i]; @@ -901,7 +872,7 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, pbch_E = (frame_parms->Ncp==0) ? 1920 : 1728; //RE/RB * #RB * bits/RB (QPSK) pbch_e_rx = <e_ue_pbch_vars->llr[frame_mod4*(pbch_E>>2)]; #ifdef DEBUG_PBCH - msg("[PBCH] starting symbol loop (Ncp %d, frame_mod4 %d,mimo_mode %d\n",frame_parms->Ncp,frame_mod4,mimo_mode); + LOG_D(PHY,"[PBCH] starting symbol loop (Ncp %d, frame_mod4 %d,mimo_mode %d\n",frame_parms->Ncp,frame_mod4,mimo_mode); #endif // clear LLR buffer @@ -910,18 +881,18 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, for (symbol=(nsymb>>1); symbol<(nsymb>>1)+4; symbol++) { #ifdef DEBUG_PBCH - msg("[PBCH] starting extract\n"); + LOG_D(PHY,"[PBCH] starting extract\n"); #endif - pbch_extract(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], + pbch_extract(lte_ue_common_vars->common_vars_rx_data_per_thread[0].rxdataF, + lte_ue_common_vars->common_vars_rx_data_per_thread[0].dl_ch_estimates[eNB_id], lte_ue_pbch_vars->rxdataF_ext, lte_ue_pbch_vars->dl_ch_estimates_ext, symbol, high_speed_flag, frame_parms); #ifdef DEBUG_PBCH - msg("[PHY] PBCH Symbol %d\n",symbol); - msg("[PHY] PBCH starting channel_level\n"); + LOG_D(PHY,"[PHY] PBCH Symbol %d\n",symbol); + LOG_D(PHY,"[PHY] PBCH starting channel_level\n"); #endif max_h = pbch_channel_level(lte_ue_pbch_vars->dl_ch_estimates_ext, @@ -930,7 +901,7 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, log2_maxh = 3+(log2_approx(max_h)/2); #ifdef DEBUG_PBCH - msg("[PHY] PBCH log2_maxh = %d (%d)\n",log2_maxh,max_h); + LOG_D(PHY,"[PHY] PBCH log2_maxh = %d (%d)\n",log2_maxh,max_h); #endif pbch_channel_compensation(lte_ue_pbch_vars->rxdataF_ext, @@ -948,10 +919,8 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, if (mimo_mode == ALAMOUTI) { pbch_alamouti(frame_parms,lte_ue_pbch_vars->rxdataF_comp,symbol); - // msg("[PBCH][RX] Alamouti receiver not yet implemented!\n"); - // return(-1); } else if (mimo_mode != SISO) { - msg("[PBCH][RX] Unsupported MIMO mode\n"); + LOG_D(PHY,"[PBCH][RX] Unsupported MIMO mode\n"); return(-1); } @@ -978,7 +947,7 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, //un-scrambling #ifdef DEBUG_PBCH - msg("[PBCH] doing unscrambling\n"); + LOG_D(PHY,"[PBCH] doing unscrambling\n"); #endif @@ -991,7 +960,7 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, //un-rate matching #ifdef DEBUG_PBCH - msg("[PBCH] doing un-rate-matching\n"); + LOG_D(PHY,"[PBCH] doing un-rate-matching\n"); #endif @@ -1020,12 +989,12 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, #ifdef DEBUG_PBCH for (i=0; i<(PBCH_A>>3); i++) - msg("[PBCH] pbch_a[%d] = %x\n",i,decoded_output[i]); + LOG_I(PHY,"[PBCH] pbch_a[%d] = %x\n",i,decoded_output[i]); #endif //DEBUG_PBCH #ifdef DEBUG_PBCH - msg("PBCH CRC %x : %x\n", + LOG_I(PHY,"PBCH CRC %x : %x\n", crc16(pbch_a,PBCH_A), ((uint16_t)pbch_a[PBCH_A>>3]<<8)+pbch_a[(PBCH_A>>3)+1]); #endif @@ -1044,43 +1013,3 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars, } - -#ifdef PHY_ABSTRACTION -uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue, - uint8_t eNB_id, - uint8_t pbch_phase) -{ - - double bler=0.0;//, x=0.0; - double sinr=0.0; - uint16_t nb_rb = phy_vars_ue->lte_frame_parms.N_RB_DL; - int16_t f; - uint8_t CC_id=phy_vars_ue->CC_id; - - // compute effective sinr - // TODO: adapt this to varible bandwidth - for (f=(nb_rb*6-3*12); f<(nb_rb*6+3*12); f++) { - if (f!=0) //skip DC - sinr += pow(10, 0.1*(phy_vars_ue->sinr_dB[f])); - } - - sinr = 10*log10(sinr/(6*12)); - - bler = pbch_bler(sinr); - - LOG_D(PHY,"EMUL UE rx_pbch_emul: eNB_id %d, pbch_phase %d, sinr %f dB, bler %f \n", - eNB_id, - pbch_phase, - sinr, - bler); - - if (pbch_phase == (phy_vars_ue->frame_rx % 4)) { - if (uniformrandom() >= bler) { - memcpy(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output,PHY_vars_eNB_g[eNB_id][CC_id]->pbch_pdu,PBCH_PDU_SIZE); - return(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.nb_antennas_tx_eNB); - } else - return(-1); - } else - return(-1); -} -#endif diff --git a/openair1/PHY/LTE_TRANSPORT/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c index 915ce17a45..b7e24cb87d 100644 --- a/openair1/PHY/LTE_TRANSPORT/pcfich.c +++ b/openair1/PHY/LTE_TRANSPORT/pcfich.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/pcfich.c * \brief Top-level routines for generating and decoding the PCFICH/CFI physical/transport channel V8.6 2009-03 @@ -39,9 +31,6 @@ */ #include "PHY/defs.h" -//uint16_t pcfich_reg[4]; -//uint8_t pcfich_first_reg_idx = 0; - //#define DEBUG_PCFICH void generate_pcfich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) @@ -77,6 +66,7 @@ void generate_pcfich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) first_reg = pcfich_reg[3]; } + //#ifdef DEBUG_PCFICH printf("pcfich_reg : %d,%d,%d,%d\n",pcfich_reg[0],pcfich_reg[1],pcfich_reg[2],pcfich_reg[3]); //#endif @@ -103,7 +93,6 @@ void pcfich_scrambling(LTE_DL_FRAME_PARMS *frame_parms, } bt[i] = (b[i]&1) ^ ((s>>(i&0x1f))&1); - // printf("scrambling %d : b %d => bt %d, c %d\n",i,b[i],bt[i],((s>>(i&0x1f))&1)); } } @@ -130,7 +119,6 @@ void pcfich_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, if (((s>>(i&0x1f))&1) == 1) d[i]=-d[i]; - // printf("scrambling %d : b %d => bt %d, c %d\n",i,b[i],bt[i],((s>>(i&0x1f))&1)); } } @@ -156,7 +144,8 @@ void generate_pcfich(uint8_t num_pdcch_symbols, int nushiftmod3 = frame_parms->nushift%3; #ifdef DEBUG_PCFICH - msg("[PHY] Generating PCFICH for %d PDCCH symbols, AMP %d\n",num_pdcch_symbols,amp); + LOG_D(PHY,"Generating PCFICH in subfrmae %d for %d PDCCH symbols, AMP %d, p %d, Ncp %d\n", + subframe,num_pdcch_symbols,amp,frame_parms->nb_antenna_ports_eNB,frame_parms->Ncp); #endif // scrambling @@ -164,12 +153,12 @@ void generate_pcfich(uint8_t num_pdcch_symbols, pcfich_scrambling(frame_parms,subframe,pcfich_b[num_pdcch_symbols-1],pcfich_bt); // modulation - if (frame_parms->mode1_flag==1) + if (frame_parms->nb_antenna_ports_eNB==1) gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15); else gain_lin_QPSK = amp/2; - if (frame_parms->mode1_flag) { // SISO + if (frame_parms->nb_antenna_ports_eNB==1) { // SISO for (i=0; i<16; i++) { ((int16_t*)(&(pcfich_d[0][i])))[0] = ((pcfich_bt[2*i] == 1) ? -gain_lin_QPSK : gain_lin_QPSK); @@ -199,7 +188,7 @@ void generate_pcfich(uint8_t num_pdcch_symbols, // mapping nsymb = (frame_parms->Ncp==0) ? 14:12; - symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*((subframe*nsymb)); + symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(subframe*nsymb); re_offset = frame_parms->first_carrier_offset; // loop over 4 quadruplets and lookup REGs @@ -211,12 +200,11 @@ void generate_pcfich(uint8_t num_pdcch_symbols, if (reg_offset>=frame_parms->ofdm_symbol_size) reg_offset=1 + reg_offset-frame_parms->ofdm_symbol_size; - // printf("mapping pcfich reg_offset %d\n",reg_offset); for (i=0; i<6; i++) { if ((i!=nushiftmod3)&&(i!=(nushiftmod3+3))) { txdataF[0][symbol_offset+reg_offset+i] = pcfich_d[0][m]; - if (frame_parms->nb_antennas_tx_eNB>1) + if (frame_parms->nb_antenna_ports_eNB>1) txdataF[1][symbol_offset+reg_offset+i] = pcfich_d[1][m]; m++; @@ -251,17 +239,16 @@ uint8_t rx_pcfich(LTE_DL_FRAME_PARMS *frame_parms, for (pcfich_quad=0; pcfich_quad<4; pcfich_quad++) { reg_offset = (pcfich_reg[pcfich_quad]*4); - // if (frame_parms->mode1_flag==1) { // SISO for (i=0; i<4; i++) { pcfich_d_ptr[0] = ((int16_t*)&rxdataF_comp[0][reg_offset+i])[0]; // RE component pcfich_d_ptr[1] = ((int16_t*)&rxdataF_comp[0][reg_offset+i])[1]; // IM component - /* - printf("rx_pcfich: quad %d, i %d, offset %d => m%d (%d,%d) => pcfich_d_ptr[0] %d \n",pcfich_quad,i,reg_offset+i,m, +#ifdef DEBUG_PCFICH + printf("rx_pcfich: quad %d, i %d, offset %d => (%d,%d) => pcfich_d_ptr[0] %d \n",pcfich_quad,i,reg_offset+i, ((int16_t*)&rxdataF_comp[0][reg_offset+i])[0], ((int16_t*)&rxdataF_comp[0][reg_offset+i])[1], pcfich_d_ptr[0]); - */ +#endif pcfich_d_ptr+=2; } @@ -304,12 +291,12 @@ uint8_t rx_pcfich(LTE_DL_FRAME_PARMS *frame_parms, metric = 0; for (j=0; j<32; j++) { - //printf("pcfich_b[%d][%d] %d => pcfich_d[%d] %d\n",i,j,pcfich_b[i][j],j,pcfich_d[j]); + // printf("pcfich_b[%d][%d] %d => pcfich_d[%d] %d\n",i,j,pcfich_b[i][j],j,pcfich_d[j]); metric += (int32_t)(((pcfich_b[i][j]==0) ? (pcfich_d[j]) : (-pcfich_d[j]))); } #ifdef DEBUG_PCFICH - msg("metric %d : %d\n",i,metric); + printf("metric %d : %d\n",i,metric); #endif if (metric > old_metric) { @@ -319,7 +306,7 @@ uint8_t rx_pcfich(LTE_DL_FRAME_PARMS *frame_parms, } #ifdef DEBUG_PCFICH - msg("[PHY] PCFICH detected for %d PDCCH symbols\n",num_pdcch_symbols); + printf("[PHY] PCFICH detected for %d PDCCH symbols\n",num_pdcch_symbols); #endif return(num_pdcch_symbols); } diff --git a/openair1/PHY/LTE_TRANSPORT/pch.c b/openair1/PHY/LTE_TRANSPORT/pch.c new file mode 100644 index 0000000000..600c5215bd --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/pch.c @@ -0,0 +1,54 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "PHY/defs.h" +#include "PHY/extern.h" +#include "assertions.h" + +const unsigned int Ttab[4] = {32,64,128,256}; + +// This function implements the initialization of paging parameters for UE (See Section 7, 36.304) +// It must be called after setting IMSImod1024 during UE startup and after receiving SIB2 +int init_ue_paging_info(PHY_VARS_UE *ue, long defaultPagingCycle, long nB) { + + LTE_DL_FRAME_PARMS *fp = &ue->frame_parms; + + unsigned int T = Ttab[defaultPagingCycle]; + unsigned int N = (nB<=2) ? T : (T>>(nB-2)); + unsigned int Ns = (nB<2) ? (1<<(2-nB)) : 1; + unsigned int UE_ID = ue->IMSImod1024; + unsigned int i_s = (UE_ID/N)%Ns; + + + ue->PF = (T/N) * (UE_ID % N); + + // This implements Section 7.2 from 36.304 + if (Ns==1) + ue->PO = (fp->frame_type==FDD) ? 9 : 0; + else if (Ns==2) + ue->PO = (fp->frame_type==FDD) ? (4+(5*i_s)) : (5*i_s); + else if (Ns==4) + ue->PO = (fp->frame_type==FDD) ? (4*(i_s&1)+(5*(i_s>>1))) : ((i_s&1)+(5*(i_s>>1))); + else + AssertFatal(1==0,"init_ue_paging_info: Ns is %d\n",Ns); + + return(0); +} diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index a7138bcd04..2bd7140c32 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/phich.c * \brief Top-level routines for generating and decoding the PHICH/HI physical/transport channel V8.6 2009-03 @@ -42,9 +34,9 @@ #include "PHY/extern.h" #include "SCHED/defs.h" #include "defs.h" -#ifndef USER_MODE -#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h" -#endif + +#include "LAYER2/MAC/extern.h" +#include "LAYER2/MAC/defs.h" #include "T.h" @@ -139,132 +131,153 @@ unsigned char subframe2_ul_harq(LTE_DL_FRAME_PARMS *frame_parms,unsigned char su break; + case 4: + if ( (subframe == 8) || (subframe == 9) ) { + return(subframe-8); + } else { + LOG_E(PHY,"phich.c: subframe2_ul_harq, illegal subframe %d for tdd_config %d\n", + subframe,frame_parms->tdd_config); + return(0); + } + + break; + } return(0); } -uint8_t phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame,uint8_t subframe) +int phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms, int frame, int subframe) { + int pusch_frame; + if (frame_parms->frame_type == FDD) { - return((subframe<4) ? (frame - 1) : frame); + pusch_frame = subframe<4 ? frame + 1024 - 1 : frame; } else { // Note this is not true, but it doesn't matter, the frame number is irrelevant for TDD! - return(frame); + pusch_frame = (frame); } + + //LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", frame, subframe, pusch_frame); + return pusch_frame % 1024; } uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe) { + uint8_t pusch_subframe = 255; if (frame_parms->frame_type == FDD) - return(subframe<4 ? (subframe+6) : (subframe-4)); + return subframe < 4 ? subframe + 6 : subframe - 4; switch (frame_parms->tdd_config) { case 0: if (subframe == 0) - return(3); + pusch_subframe = (3); else if (subframe == 5) { - return (8); + pusch_subframe = (8); } else if (subframe == 6) - return (2); + pusch_subframe = (2); else if (subframe == 1) - return (7); + pusch_subframe = (7); else { - LOG_E(PHY, "phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", - subframe,frame_parms->tdd_config); - return(0); + AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", + subframe,frame_parms->tdd_config); + pusch_subframe = (0); } break; case 1: if (subframe == 6) - return(2); + pusch_subframe = (2); else if (subframe == 9) - return (3); + pusch_subframe = (3); else if (subframe == 1) - return (7); + pusch_subframe = (7); else if (subframe == 4) - return (8); + pusch_subframe = (8); else { - LOG_E(PHY,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", + AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", subframe,frame_parms->tdd_config); - return(0); + pusch_subframe = (0); } break; case 2: if (subframe == 8) - return(2); + pusch_subframe = (2); else if (subframe == 3) - return (7); + pusch_subframe = (7); else { - LOG_E(PHY,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", + AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", subframe,frame_parms->tdd_config); - return(0); + pusch_subframe = (0); } break; case 3: if ( (subframe == 8) || (subframe == 9) ) { - return(subframe-6); + pusch_subframe = (subframe-6); } else if (subframe==0) - return(4); + pusch_subframe = (4); else { - LOG_E(PHY,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", + AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", subframe,frame_parms->tdd_config); - return(0); + pusch_subframe = (0); } break; case 4: if ( (subframe == 8) || (subframe == 9) ) { - return(subframe-6); + pusch_subframe = (subframe-6); } else { - LOG_E(PHY,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", + AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", subframe,frame_parms->tdd_config); - return(0); + pusch_subframe = (0); } break; case 5: if (subframe == 8) { - return(2); + pusch_subframe = (2); } else { - LOG_E(PHY,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", + AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", subframe,frame_parms->tdd_config); - return(0); + pusch_subframe = (0); } break; case 6: if (subframe == 6) { - return(2); + pusch_subframe = (2); } else if (subframe == 9) { - return(3); + pusch_subframe = (3); } else if (subframe == 0) { - return(4); + pusch_subframe = (4); } else if (subframe == 1) { - return(7); + pusch_subframe = (7); } else if (subframe == 5) { - return(8); + pusch_subframe = (8); } else { - LOG_E(PHY,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", + AssertFatal(1==0,"phich.c: phich_subframe2_pusch_subframe, illegal subframe %d for tdd_config %d\n", subframe,frame_parms->tdd_config); - return(0); + pusch_subframe = (0); } break; + default: + AssertFatal(1==0, "no implementation for TDD UL/DL-config = %d!\n", frame_parms->tdd_config); + pusch_subframe = (0); } - return(0); + LOG_D(PHY, "subframe %d: PUSCH subframe = %d\n", subframe, pusch_subframe); + return pusch_subframe; } int check_pcfich(LTE_DL_FRAME_PARMS *frame_parms,uint16_t reg) @@ -302,17 +315,17 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) Ngroup_PHICH<<=1; } - //#ifdef DEBUG_PHICH - printf("Ngroup_PHICH %d (phich_config_common.phich_resource %d,phich_config_common.phich_duration %s, NidCell %d,Ncp %d, frame_type %d), smallest pcfich REG %d, n0 %d, n1 %d (first PHICH REG %d)\n", - ((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)), - frame_parms->phich_config_common.phich_resource, - frame_parms->phich_config_common.phich_duration==normal?"normal":"extended", - frame_parms->Nid_cell,frame_parms->Ncp,frame_parms->frame_type, - pcfich_reg[frame_parms->pcfich_first_reg_idx], - n0, - n1, - ((frame_parms->Nid_cell))%n0); - //#endif +#ifdef DEBUG_PHICH + LOG_D(PHY,"Ngroup_PHICH %d (phich_config_common.phich_resource %d,phich_config_common.phich_duration %s, NidCell %d,Ncp %d, frame_type %d), smallest pcfich REG %d, n0 %d, n1 %d (first PHICH REG %d)\n", + ((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)), + frame_parms->phich_config_common.phich_resource, + frame_parms->phich_config_common.phich_duration==normal?"normal":"extended", + frame_parms->Nid_cell,frame_parms->Ncp,frame_parms->frame_type, + pcfich_reg[frame_parms->pcfich_first_reg_idx], + n0, + n1, + ((frame_parms->Nid_cell))%n0); +#endif // This is the algorithm from Section 6.9.3 in 36-211, it works only for normal PHICH duration for now ... @@ -366,9 +379,9 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3]) frame_parms->phich_reg[mprime][2]++; - //#ifdef DEBUG_PHICH +#ifdef DEBUG_PHICH printf("phich_reg :%d => %d,%d,%d\n",mprime,frame_parms->phich_reg[mprime][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]); - //#endif +#endif } else { // extended PHICH duration frame_parms->phich_reg[mprime<<1][0] = (frame_parms->Nid_cell + mprime)%n0; frame_parms->phich_reg[1+(mprime<<1)][0] = (frame_parms->Nid_cell + mprime)%n0; @@ -424,7 +437,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, memset(d,0,24*sizeof(int16_t)); - if (frame_parms->mode1_flag==1) + if (frame_parms->nb_antenna_ports_eNB==1) gain_lin_QPSK = (int16_t)(((int32_t)amp*ONE_OVER_SQRT2_Q15)>>15); else gain_lin_QPSK = amp/2; @@ -435,9 +448,10 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, if (HI>0) HI=1; + // c = (1-(2*HI))*SSS_AMP; // x1 is set in lte_gold_generic - x2 = (((subframe+1)*(frame_parms->Nid_cell+1))<<9) + frame_parms->Nid_cell; + x2 = (((subframe+1)*((frame_parms->Nid_cell<<1)+1))<<9) + frame_parms->Nid_cell; s = lte_gold_generic(&x1, &x2, reset); @@ -542,7 +556,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, break; default: - LOG_E(PHY,"phich_coding.c: Illegal PHICH Number\n"); + AssertFatal(1==0,"phich_coding.c: Illegal PHICH Number\n"); } // nseq_PHICH } @@ -556,7 +570,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, #endif // modulation here - if (frame_parms->mode1_flag == 0) { + if (frame_parms->nb_antenna_ports_eNB != 1) { // do Alamouti precoding here // Symbol 0 @@ -685,7 +699,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, } } - } // mode1_flag + } // nb_antenna_ports_eNB else { // Symbol 0 @@ -768,7 +782,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, for (i=0;i<512;i++) printf("re %d (%d): %d,%d\n",i,subframe_offset+i,((int16_t*)&y[0][subframe_offset+i])[0],((int16_t*)&y[0][subframe_offset+i])[1]); */ - } // mode1_flag + } // nb_antenna_ports_eNB } else { // extended prefix // 6 output symbols @@ -840,12 +854,12 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, break; default: - LOG_E(PHY,"phich_coding.c: Illegal PHICH Number\n"); + AssertFatal(1==0,"phich_coding.c: Illegal PHICH Number\n"); } - if (frame_parms->mode1_flag == 0) { + if (frame_parms->nb_antenna_ports_eNB != 1) { // do Alamouti precoding here // Symbol 0 re_offset = frame_parms->first_carrier_offset + (frame_parms->phich_reg[ngroup_PHICH][0]*6); @@ -1047,25 +1061,25 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, y0[j+1] += y0_16[m++]; } - } // mode1_flag + } // nb_antenna_ports_eNB } // normal/extended prefix } // This routine demodulates the PHICH and updates PUSCH/ULSCH parameters - -void rx_phich(PHY_VARS_UE *phy_vars_ue, +void rx_phich(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, uint8_t subframe, uint8_t eNB_id) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; - LTE_UE_PDCCH **lte_ue_pdcch_vars = phy_vars_ue->lte_ue_pdcch_vars; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + LTE_UE_PDCCH **pdcch_vars = &ue->pdcch_vars[ue->current_thread_id[subframe]][eNB_id]; // uint8_t HI; - uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,phy_vars_ue->frame_rx,subframe); - LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id]; + uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,proc->frame_rx,subframe); + LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; int16_t phich_d[24],*phich_d_ptr,HI16; // unsigned int i,aa; int8_t d[24],*dp; @@ -1076,16 +1090,23 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, uint8_t reset = 1; int16_t cs[12]; uint32_t i,i2,i3,phich_quad; - int32_t **rxdataF_comp = lte_ue_pdcch_vars[eNB_id]->rxdataF_comp; + int32_t **rxdataF_comp = pdcch_vars[eNB_id]->rxdataF_comp; uint8_t Ngroup_PHICH,ngroup_PHICH,nseq_PHICH; uint8_t NSF_PHICH = 4; uint8_t pusch_subframe; + int8_t delta_PUSCH_acc[4] = {-1,0,1,3}; + // check if we're expecting a PHICH in this subframe - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe); + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe); + + if (!ulsch) + return; + + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX Status: %d \n",ue->Mod_id,harq_pid,proc->frame_rx,subframe, ulsch->harq_processes[harq_pid]->status); if (ulsch->harq_processes[harq_pid]->status == ACTIVE) { - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_rx,subframe); + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe); Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48; if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0) @@ -1108,6 +1129,16 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, nseq_PHICH = ((ulsch->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) + ulsch->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH); } else { + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH RX %s\n", + ue->Mod_id, + harq_pid, + proc->frame_rx, + subframe, + (ulsch->harq_processes[harq_pid]->status==SCH_IDLE? "SCH_IDLE" : + (ulsch->harq_processes[harq_pid]->status==ACTIVE? "ACTIVE" : + (ulsch->harq_processes[harq_pid]->status==CBA_ACTIVE? "CBA_ACTIVE": + (ulsch->harq_processes[harq_pid]->status==DISABLED? "DISABLED" : "UNKNOWN"))))); + return; } @@ -1115,7 +1146,7 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, phich_d_ptr = phich_d; // x1 is set in lte_gold_generic - x2 = (((subframe+1)*(frame_parms->Nid_cell+1))<<9) + frame_parms->Nid_cell; + x2 = (((subframe+1)*((frame_parms->Nid_cell<<1)+1))<<9) + frame_parms->Nid_cell; s = lte_gold_generic(&x1, &x2, reset); @@ -1220,7 +1251,7 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, break; default: - LOG_E(PHY,"phich_coding.c: Illegal PHICH Number\n"); + AssertFatal(1==0,"phich_coding.c: Illegal PHICH Number\n"); } // nseq_PHICH } @@ -1307,7 +1338,7 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, break; default: - LOG_E(PHY,"phich_coding.c: Illegal PHICH Number\n"); + AssertFatal(1==0,"phich_coding.c: Illegal PHICH Number\n"); } } @@ -1346,95 +1377,141 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, #endif if (HI16>0) { //NACK - if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) { + if (ue->ulsch_Msg3_active[eNB_id] == 1) { LOG_D(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received NAK (%d) nseq %d, ngroup %d\n", - phy_vars_ue->Mod_id,harq_pid, - phy_vars_ue->frame_rx, + ue->Mod_id,harq_pid, + proc->frame_rx, subframe, HI16, nseq_PHICH, ngroup_PHICH); - get_Msg3_alloc_ret(&phy_vars_ue->lte_frame_parms, - subframe, - phy_vars_ue->frame_rx, - &phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id], - &phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]); + + ulsch->f_pusch += delta_PUSCH_acc[ulsch->harq_processes[harq_pid]->TPC]; + + LOG_D(PHY,"[PUSCH %d] AbsSubframe %d.%d: f_pusch (ACC) %d, adjusting by %d (TPC %d)\n", + harq_pid,proc->frame_rx,subframe,ulsch->f_pusch, + delta_PUSCH_acc[ulsch->harq_processes[harq_pid]->TPC], + ulsch->harq_processes[harq_pid]->TPC); + + ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1; // ulsch->harq_processes[harq_pid]->Ndi = 0; ulsch->harq_processes[harq_pid]->round++; ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3]; - if (ulsch->harq_processes[harq_pid]->round>=phy_vars_ue->lte_frame_parms.maxHARQ_Msg3Tx) { + if (ulsch->harq_processes[harq_pid]->round>=ue->frame_parms.maxHARQ_Msg3Tx) { ulsch->harq_processes[harq_pid]->subframe_scheduling_flag =0; - ulsch->harq_processes[harq_pid]->status = IDLE; + ulsch->harq_processes[harq_pid]->status = SCH_IDLE; // inform MAC that Msg3 transmission has failed - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0; + ue->ulsch_Msg3_active[eNB_id] = 0; } } else { - //#ifdef DEBUG_PHICH - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received NAK (%d) nseq %d, ngroup %d\n", - phy_vars_ue->Mod_id,harq_pid, - phy_vars_ue->frame_rx, +#ifdef UE_DEBUG_TRACE + LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received NAK (%d) nseq %d, ngroup %d round %d (Mlimit %d)\n", + ue->Mod_id,harq_pid, + proc->frame_rx%1024, subframe, HI16, nseq_PHICH, - ngroup_PHICH); - //#endif - ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + ngroup_PHICH, + ulsch->harq_processes[harq_pid]->round, + ulsch->Mlimit); +#endif + // ulsch->harq_processes[harq_pid]->Ndi = 0; ulsch->harq_processes[harq_pid]->round++; - ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3]; - ulsch->O_RI = 0; - ulsch->O = 0; - ulsch->uci_format = HLC_subband_cqi_nopmi; - } + + if ( ulsch->harq_processes[harq_pid]->round >= (ulsch->Mlimit - 1) ) + { + // this is last push re transmission + ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3]; + ulsch->O_RI = 0; + ulsch->O = 0; + ulsch->uci_format = HLC_subband_cqi_nopmi; + // disable phich decoding since it is the last retransmission + ulsch->harq_processes[harq_pid]->status = SCH_IDLE; + + //ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0; + //ulsch->harq_processes[harq_pid]->round = 0; + + //LOG_I(PHY,"PUSCH MAX Retransmission acheived ==> flush harq buff (%d) \n",harq_pid); + //LOG_I(PHY,"[HARQ-UL harqId: %d] PHICH NACK MAX RETRANS(%d) ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->Mlimit, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag, ulsch->harq_processes[harq_pid]->round); + } + else + { + // ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3]; + ulsch->O_RI = 0; + ulsch->O = 0; + ulsch->uci_format = HLC_subband_cqi_nopmi; + //LOG_I(PHY,"[HARQ-UL harqId: %d] PHICH NACK ==> subframe_scheduling_flag = %d round: %d\n", harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag,ulsch->harq_processes[harq_pid]->round); + } + } +#if T_TRACER + T(T_UE_PHY_ULSCH_UE_NACK, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(subframe), T_INT(ulsch->rnti), + T_INT(harq_pid)); +#endif } else { //ACK - if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) { + if (ue->ulsch_Msg3_active[eNB_id] == 1) { LOG_D(PHY,"[UE %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received ACK (%d) nseq %d, ngroup %d\n\n", - phy_vars_ue->Mod_id,harq_pid, - phy_vars_ue->frame_rx, + ue->Mod_id,harq_pid, + proc->frame_rx, subframe, HI16, nseq_PHICH,ngroup_PHICH); } else { - //#ifdef PHICH_DEBUG +#ifdef UE_DEBUG_TRACE LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d PHICH, received ACK (%d) nseq %d, ngroup %d\n\n", - phy_vars_ue->Mod_id,harq_pid, - phy_vars_ue->frame_rx, + ue->Mod_id,harq_pid, + proc->frame_rx%1024, subframe, HI16, nseq_PHICH,ngroup_PHICH); - //#endif +#endif } - ulsch->harq_processes[harq_pid]->subframe_scheduling_flag =0; - ulsch->harq_processes[harq_pid]->status = IDLE; - ulsch->harq_processes[harq_pid]->round = 0; + // LOG_I(PHY,"[HARQ-UL harqId: %d] subframe_scheduling_flag = %d \n",harq_pid, ulsch->harq_processes[harq_pid]->subframe_scheduling_flag); + + // Incase of adaptive retransmission, PHICH is always decoded as ACK (at least with OAI-eNB) + // Workaround: + // rely only on DCI0 decoding and check if NDI has toggled + // save current harq_processes content in temporary struct + // harqId-8 corresponds to the temporary struct. In total we have 8 harq process(0 ..7) + 1 temporary harq process() + //ulsch->harq_processes[8] = ulsch->harq_processes[harq_pid]; + + + ulsch->harq_processes[harq_pid]->status = SCH_IDLE; + ulsch->harq_processes[harq_pid]->round = 0; + ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 0; // inform MAC? - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0; + ue->ulsch_Msg3_active[eNB_id] = 0; + +#if T_TRACER + T(T_UE_PHY_ULSCH_UE_ACK, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(subframe), T_INT(ulsch->rnti), + T_INT(harq_pid)); +#endif + } } -void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, - unsigned char sched_subframe, - int16_t amp, - uint8_t sect_id, - uint8_t abstraction_flag) +void generate_phich_top(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + int16_t amp) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; - LTE_eNB_ULSCH_t **ulsch_eNB = phy_vars_eNB->ulsch_eNB; - int32_t **txdataF = phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id]; + LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms; + int32_t **txdataF = eNB->common_vars.txdataF; uint8_t harq_pid; uint8_t Ngroup_PHICH,ngroup_PHICH,nseq_PHICH; uint8_t NSF_PHICH = 4; uint8_t pusch_subframe; - uint8_t UE_id; + uint8_t i; uint32_t pusch_frame; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; + int subframe = proc->subframe_tx; + phich_config_t *phich; // compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211 @@ -1446,87 +1523,48 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, if (frame_parms->Ncp == 1) NSF_PHICH = 2; - pusch_frame = phich_frame2_pusch_frame(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - pusch_subframe = phich_subframe2_pusch_subframe(frame_parms,subframe); - harq_pid = subframe2harq_pid(frame_parms,pusch_frame,pusch_subframe); + if (eNB->phich_vars[subframe&1].num_hi > 0) { + pusch_frame = phich_frame2_pusch_frame(frame_parms,proc->frame_tx,subframe); + pusch_subframe = phich_subframe2_pusch_subframe(frame_parms,subframe); + harq_pid = subframe2harq_pid(frame_parms,pusch_frame,pusch_subframe); + } - for (UE_id=0; UE_idrnti>0)) { - if (ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active == 1) { + for (i=0; iphich_vars[subframe&1].num_hi; i++) { - LOG_D(PHY,"[eNB][PUSCH %d/%x] Frame %d subframe %d (pusch_subframe %d,pusch_frame %d) phich active %d\n", - harq_pid,ulsch_eNB[UE_id]->rnti,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,pusch_subframe,pusch_frame,ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active); - - ngroup_PHICH = (ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb + - ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH; - - if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == TDD) ) { - - if ((pusch_subframe == 4) || (pusch_subframe == 9)) - ngroup_PHICH += Ngroup_PHICH; - } - - nseq_PHICH = ((ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) + - ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH); - LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d dci_alloc %d)\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->dci_alloc); - - if (ulsch_eNB[UE_id]->Msg3_active == 1) { - LOG_D(PHY,"[eNB %d][PUSCH %d][RAPROC] Frame %d, subframe %d: Generating Msg3 PHICH for UE %d, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - UE_id,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb); - } - - if (abstraction_flag == 0) { - generate_phich(frame_parms, - amp,//amp*2, - nseq_PHICH, - ngroup_PHICH, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK, - subframe, - txdataF); - } else { - /* - generate_phich_emul(frame_parms, - //nseq_PHICH, - //ngroup_PHICH, - ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK, - subframe); - */ - } - - // if no format0 DCI was transmitted by MAC, prepare the - // MCS parameters for the retransmission - - if ((ulsch_eNB[UE_id]->harq_processes[harq_pid]->dci_alloc == 0) && - (ulsch_eNB[UE_id]->harq_processes[harq_pid]->rar_alloc == 0) ) { - if (ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK==0 ) { - T(T_ENB_PHY_ULSCH_UE_NO_DCI_RETRANSMISSION, T_INT(phy_vars_eNB->Mod_id), T_INT(phy_vars_eNB->proc[sched_subframe].frame_tx), - T_INT(subframe), T_INT(UE_id), T_INT(ulsch_eNB[UE_id]->rnti), T_INT(harq_pid)); - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH NACK / (no format0 DCI) Setting subframe_scheduling_flag\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->rvidx = rv_table[ulsch_eNB[UE_id]->harq_processes[harq_pid]->round&3]; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->O_RI = 0; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or2 = 0; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or1 = 0; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format = HLC_subband_cqi_nopmi; - - } else { - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d PHICH ACK (no format0 DCI) Clearing subframe_scheduling_flag, setting round to 0\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->round=0; - } - } - - ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active=0; - } // phich_active==1 - } //ulsch_ue[UE_id] is non-null - }// UE loop + phich = &eNB->phich_vars[subframe&1].config[i]; + + ngroup_PHICH = (phich->first_rb + + phich->n_DMRS)%Ngroup_PHICH; + + if ((frame_parms->tdd_config == 0) && (frame_parms->frame_type == TDD) ) { + + if ((pusch_subframe == 4) || (pusch_subframe == 9)) + ngroup_PHICH += Ngroup_PHICH; + } + + nseq_PHICH = ((phich->first_rb/Ngroup_PHICH) + + phich->n_DMRS)%(2*NSF_PHICH); + LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, AMP %d ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d)\n", + eNB->Mod_id,harq_pid,proc->frame_tx, + subframe,amp,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH, + phich->hi, + phich->first_rb); + + T(T_ENB_PHY_PHICH, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(subframe), + T_INT(-1 /* TODO: rnti */), T_INT(harq_pid), + T_INT(Ngroup_PHICH), T_INT(NSF_PHICH), + T_INT(ngroup_PHICH), T_INT(nseq_PHICH), + T_INT(phich->hi), + T_INT(phich->first_rb), + T_INT(phich->n_DMRS)); + + generate_phich(frame_parms, + amp,//amp*2, + nseq_PHICH, + ngroup_PHICH, + phich->hi, + subframe, + txdataF); + }// for (i=0; iphich_vars[subframe&1].num_hi; i++) { + eNB->phich_vars[subframe&1].num_hi=0; } diff --git a/openair1/PHY/LTE_TRANSPORT/pilots.c b/openair1/PHY/LTE_TRANSPORT/pilots.c index 66e32fcb49..01b4bb7a8e 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/pilots.c * \brief Top-level routines for generating DL cell-specific reference signals V8.6 2009-03 @@ -40,13 +32,13 @@ //#include "defs.h" #include "PHY/defs.h" -void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, +void generate_pilots(PHY_VARS_eNB *eNB, int32_t **txdataF, int16_t amp, uint16_t Ntti) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; uint32_t tti,tti_offset,slot_offset,Nsymb,samples_per_symbol; uint8_t second_pilot; @@ -70,8 +62,8 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, // printf("tti %d : offset %d (slot %d)\n",tti,tti_offset,slot_offset); //Generate Pilots - //antenna 0 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset], + //antenna port 0 symbol 0 slot 0 + lte_dl_cell_spec(eNB,&txdataF[0][tti_offset], amp, slot_offset, 0, @@ -79,107 +71,76 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, // printf("tti %d : second_pilot offset %d \n",tti,tti_offset+(second_pilot*samples_per_symbol)); - //antenna 0 symbol 3/4 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset+(second_pilot*samples_per_symbol)], + //antenna port 0 symbol 3/4 slot 0 + lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+(second_pilot*samples_per_symbol)], amp, slot_offset, 1, 0); // printf("tti %d : third_pilot offset %d \n",tti,tti_offset+((Nsymb>>1)*samples_per_symbol)); - //antenna 0 symbol 0 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset+((Nsymb>>1)*samples_per_symbol)], + //antenna port 0 symbol 0 slot 1 + lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+((Nsymb>>1)*samples_per_symbol)], amp, 1+slot_offset, 0, 0); // printf("tti %d : third_pilot offset %d \n",tti,tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)); - //antenna 0 symbol 3/4 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[0][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)], + //antenna port 0 symbol 3/4 slot 1 + lte_dl_cell_spec(eNB,&txdataF[0][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)], amp, 1+slot_offset, 1, 0); - if (frame_parms->nb_antennas_tx > 1) { - if (frame_parms->mode1_flag) { - // antenna 1 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset], - amp, - slot_offset, - 0, - 0); + if (frame_parms->nb_antenna_ports_eNB > 1) { - // antenna 1 symbol 3 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)], - amp, - slot_offset, - 1, - 0); - - //antenna 1 symbol 0 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol], - amp, - 1+slot_offset, - 0, - 0); - - // antenna 1 symbol 3 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)], - amp, - 1+slot_offset, - 1, - 0); - - } else { - - // antenna 1 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset], + // antenna port 1 symbol 0 slot 0 + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset], amp, slot_offset, 0, 1); - // antenna 1 symbol 3 slot 0 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)], + // antenna port 1 symbol 3 slot 0 + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(second_pilot*samples_per_symbol)], amp, slot_offset, 1, 1); - //antenna 1 symbol 0 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol], + //antenna port 1 symbol 0 slot 1 + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(Nsymb>>1)*samples_per_symbol], amp, 1+slot_offset, 0, 1); - // antenna 1 symbol 3 slot 1 - lte_dl_cell_spec(phy_vars_eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)], + // antenna port 1 symbol 3 slot 1 + lte_dl_cell_spec(eNB,&txdataF[1][tti_offset+(((Nsymb>>1)+second_pilot)*samples_per_symbol)], amp, 1+slot_offset, 1, 1); - } } } } -int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, +int generate_pilots_slot(PHY_VARS_eNB *eNB, int32_t **txdataF, int16_t amp, uint16_t slot, int first_pilot_only) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; uint32_t slot_offset,Nsymb,samples_per_symbol; uint8_t second_pilot; if (slot<0 || slot>= 20) { - msg("generate_pilots_slot: slot not in range (%d)\n",slot); + LOG_E(PHY,"generate_pilots_slot: slot not in range (%d)\n",slot); return(-1); } @@ -193,8 +154,8 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, // printf("tti %d : offset %d (slot %d)\n",tti,tti_offset,slot_offset); //Generate Pilots - //antenna 0 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB, + //antenna port 0 symbol 0 slot 0 + lte_dl_cell_spec(eNB, &txdataF[0][slot_offset], amp, slot, @@ -204,7 +165,7 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, if (first_pilot_only==0) { //antenna 0 symbol 3 slot 0 - lte_dl_cell_spec(phy_vars_eNB, + lte_dl_cell_spec(eNB, &txdataF[0][slot_offset+(second_pilot*samples_per_symbol)], amp, slot, @@ -212,44 +173,24 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, 0); } - if (frame_parms->nb_antennas_tx > 1) { - if (frame_parms->mode1_flag) { - // antenna 1 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB, - &txdataF[1][slot_offset], + if (frame_parms->nb_antenna_ports_eNB > 1) { + + // antenna port 1 symbol 0 slot 0 + lte_dl_cell_spec(eNB, + &txdataF[1][slot_offset], + amp, + slot, + 0, + 1); + + if (first_pilot_only == 0) { + // antenna port 1 symbol 3 slot 0 + lte_dl_cell_spec(eNB, + &txdataF[1][slot_offset+(second_pilot*samples_per_symbol)], amp, slot, - 0, - 0); - - if (first_pilot_only==0) { - // antenna 1 symbol 3 slot 0 - lte_dl_cell_spec(phy_vars_eNB, - &txdataF[1][slot_offset+(second_pilot*samples_per_symbol)], - amp, - slot, - 1, - 0); - } - } else { - - // antenna 1 symbol 0 slot 0 - lte_dl_cell_spec(phy_vars_eNB, - &txdataF[1][slot_offset], - amp, - slot, - 0, + 1, 1); - - if (first_pilot_only == 0) { - // antenna 1 symbol 3 slot 0 - lte_dl_cell_spec(phy_vars_eNB, - &txdataF[1][slot_offset+(second_pilot*samples_per_symbol)], - amp, - slot, - 1, - 1); - } } } diff --git a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c index 168f3db17c..90e9ae329c 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/pilots_mbsfn.c * \brief Top-level routines for generating DL mbsfn reference signals @@ -41,19 +33,20 @@ #include "PHY/defs.h" -int generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB, +int generate_mbsfn_pilot(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, int32_t **txdataF, - int16_t amp, - uint16_t subframe) + int16_t amp) + { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; uint32_t subframe_offset,Nsymb,samples_per_symbol; - + int subframe = proc->subframe_tx; if (subframe<0 || subframe>= 10) { - msg("generate_mbsfn_pilots_subframe: subframe not in range (%d)\n",subframe); + LOG_E(PHY,"generate_mbsfn_pilots_subframe: subframe not in range (%d)\n",subframe); return(-1); } @@ -66,7 +59,7 @@ int generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB, //Generate Pilots //antenna 4 symbol 2 Slot 0 - lte_dl_mbsfn(phy_vars_eNB, + lte_dl_mbsfn(eNB, &txdataF[0][subframe_offset+(2*samples_per_symbol)], amp, subframe, @@ -75,14 +68,14 @@ int generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB, //antenna 4 symbol 0 slot 1 - lte_dl_mbsfn(phy_vars_eNB, + lte_dl_mbsfn(eNB, &txdataF[0][subframe_offset+(6*samples_per_symbol)], amp, subframe, 1); //antenna 4 symbol 4 slot 1 - lte_dl_mbsfn(phy_vars_eNB, + lte_dl_mbsfn(eNB, &txdataF[0][subframe_offset+(10*samples_per_symbol)], amp, subframe, diff --git a/openair1/PHY/LTE_TRANSPORT/pilots_ue_spec.c b/openair1/PHY/LTE_TRANSPORT/pilots_ue_spec.c new file mode 100644 index 0000000000..63aac7f091 --- /dev/null +++ b/openair1/PHY/LTE_TRANSPORT/pilots_ue_spec.c @@ -0,0 +1,209 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/LTE_TRANSPORT/uespec_pilots.c +* \brief Top-level routines for generating DL ue-specific reference signals V12.5 2015-03 +* \author X.JIANG +* \date 2011 +* \version 0.1 +* \company Eurecom +* \email: xiwen.jiangeurecom.fr +* \note +* \warning +*/ +//#include "defs.h" +#include "PHY/defs.h" + +void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB, + uint8_t UE_id, + int32_t **txdataF, + int16_t amp, + uint16_t Ntti, + uint8_t beamforming_mode) +{ + + /*LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; + + uint32_t tti,tti_offset,slot_offset,Nsymb,samples_per_symbol; + uint8_t second_pilot,aa; + + // printf("Doing TX pilots Nsymb %d, second_pilot %d\n",Nsymb,second_pilot); + + switch(beamforming_mode){ + case 7: + for (tti=0; ttiofdm_symbol_size*Nsymb; + samples_per_symbol = frame_parms->ofdm_symbol_size; + slot_offset = (tti*2)%20; + + // printf("tti %d : offset %d (slot %d)\n",tti,tti_offset,slot_offset); + //Generate UE specific Pilots + printf("generate_dl_ue_spec:tti_offset=%d\n",tti_offset); + + if(frame_parms->Ncp==0) { + for(aa=0;aanb_antennas_tx;aa++){ + //antenna port 5 symbol 0 slot 0 + lte_dl_ue_spec(phy_vars_eNB, + UE_id, + &txdataF[aa][tti_offset+3*samples_per_symbol], + amp, + slot_offset, + 1, + 5, + 0); + + //antenna port 5 symbol 1 slot 0 + lte_dl_ue_spec(phy_vars_eNB, + UE_id, + &txdataF[aa][tti_offset+6*samples_per_symbol], + amp, + slot_offset, + 1, + 5, + 0); + + //antenna port 5 symbol 0 slot 1 + lte_dl_ue_spec(phy_vars_eNB, + UE_id, + &txdataF[aa][tti_offset+9*samples_per_symbol], + amp, + slot_offset+1, + 0, + 5, + 0); + + //antenna port 5 symbol 1 slot 1 + lte_dl_ue_spec(phy_vars_eNB, + UE_id, + &txdataF[aa][tti_offset+12*samples_per_symbol], + amp, + slot_offset+1, + 1, + 5, + 0); + } + } else{ + msg("generate_ue_soec_pilots:Extented Cyclic Prefix for TM7 is not supported yet.\n"); + } + + + } + break; + + case 8: + case 9: + case 10: + default: + msg("[generate_ue_spec_pilots(in uespec_pilots.c)]ERROR:beamforming mode %d is not supported\n",beamforming_mode); + + }*/ +} + +/*int generate_ue_spec_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, + int32_t **txdataF, + int16_t amp, + uint16_t slot, + int first_pilot_only) +{ + + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; + uint32_t slot_offset,Nsymb,samples_per_symbol; + uint8_t second_pilot; + + if (slot<0 || slot>= 20) { + msg("generate_pilots_slot: slot not in range (%d)\n",slot); + return(-1); + } + + Nsymb = (frame_parms->Ncp==0)?7:6; + second_pilot = (frame_parms->Ncp==0)?4:3; + + + slot_offset = slot*frame_parms->ofdm_symbol_size*Nsymb; + samples_per_symbol = frame_parms->ofdm_symbol_size; + + // printf("tti %d : offset %d (slot %d)\n",tti,tti_offset,slot_offset); + //Generate Pilots + + //antenna 0 symbol 0 slot 0 + lte_dl_cell_spec(phy_vars_eNB, + &txdataF[0][slot_offset], + amp, + slot, + 0, + 0); + + + if (first_pilot_only==0) { + //antenna 0 symbol 3 slot 0 + lte_dl_cell_spec(phy_vars_eNB, + &txdataF[0][slot_offset+(second_pilot*samples_per_symbol)], + amp, + slot, + 1, + 0); + } + + if (frame_parms->nb_antennas_tx > 1) { + if (frame_parms->mode1_flag) { + // antenna 1 symbol 0 slot 0 + lte_dl_cell_spec(phy_vars_eNB, + &txdataF[1][slot_offset], + amp, + slot, + 0, + 0); + + if (first_pilot_only==0) { + // antenna 1 symbol 3 slot 0 + lte_dl_cell_spec(phy_vars_eNB, + &txdataF[1][slot_offset+(second_pilot*samples_per_symbol)], + amp, + slot, + 1, + 0); + } + } else { + + // antenna 1 symbol 0 slot 0 + lte_dl_cell_spec(phy_vars_eNB, + &txdataF[1][slot_offset], + amp, + slot, + 0, + 1); + + if (first_pilot_only == 0) { + // antenna 1 symbol 3 slot 0 + lte_dl_cell_spec(phy_vars_eNB, + &txdataF[1][slot_offset+(second_pilot*samples_per_symbol)], + amp, + slot, + 1, + 1); + } + } + } + + return(0); +}*/ + diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index fbcec50333..e756df1fe1 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" #include "PHY/sse_intrin.h" @@ -48,50 +41,51 @@ -void dump_mch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int subframe) +void dump_mch(PHY_VARS_UE *ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int subframe) { unsigned int nsymb_pmch=12; char fname[32],vname[32]; - int N_RB_DL=phy_vars_ue->lte_frame_parms.N_RB_DL; + int N_RB_DL=ue->frame_parms.N_RB_DL; sprintf(fname,"mch_rxF_ext0.m"); sprintf(vname,"pmch_rxF_ext0"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb_pmch,1,1); sprintf(fname,"mch_ch_ext00.m"); sprintf(vname,"pmch_ch_ext00"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb_pmch,1,1); /* - write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb_pmch,1,1); - write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb_pmch,1,1); - write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb_pmch,1,1); - write_output("dlsch%d_rho.m","dl_rho",lte_ue_pdsch_vars[eNB_id]->rho[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb_pmch,1,1); + write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb_pmch,1,1); + write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb_pmch,1,1); + write_output("dlsch%d_rho.m","dl_rho",pdsch_vars[eNB_id]->rho[0],12*N_RB_DL*nsymb_pmch,1,1); */ sprintf(fname,"mch_rxF_comp0.m"); sprintf(vname,"pmch_rxF_comp0"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb_pmch,1,1); sprintf(fname,"mch_rxF_llr.m"); sprintf(vname,"pmch_llr"); - write_output(fname,vname, phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->llr[0],coded_bits_per_codeword,1,0); + write_output(fname,vname, ue->pdsch_vars_MCH[eNB_id]->llr[0],coded_bits_per_codeword,1,0); sprintf(fname,"mch_mag1.m"); sprintf(vname,"pmch_mag1"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb_pmch,1,1); sprintf(fname,"mch_mag2.m"); sprintf(vname,"pmch_mag2"); - write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb_pmch,1,1); + write_output(fname,vname,ue->pdsch_vars_MCH[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb_pmch,1,1); write_output("mch00_ch0.m","pmch00_ch0", - &(phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]), - phy_vars_ue->lte_frame_parms.ofdm_symbol_size*12,1,1); + &(ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][0][0]), + ue->frame_parms.ofdm_symbol_size*12,1,1); write_output("rxsig_mch.m","rxs_mch", - &phy_vars_ue->lte_ue_common_vars.rxdata[0][subframe*phy_vars_ue->lte_frame_parms.samples_per_tti], - phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); + &ue->common_vars.rxdata[0][subframe*ue->frame_parms.samples_per_tti], + ue->frame_parms.samples_per_tti,1,1); + /* if (PHY_vars_eNB_g) write_output("txsig_mch.m","txs_mch", - &PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.txdata[0][0][subframe*phy_vars_ue->lte_frame_parms.samples_per_tti], - phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); + &PHY_vars_eNB_g[0][0]->common_vars.txdata[0][0][subframe*ue->frame_parms.samples_per_tti], + ue->frame_parms.samples_per_tti,1,1);*/ } int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parms) @@ -190,11 +184,11 @@ int is_pmch_subframe(uint32_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_par return(0); } -void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx, int abstraction_flag) +void fill_eNB_dlsch_MCH(PHY_VARS_eNB *eNB,int mcs,int ndi,int rvidx) { - LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB_MCH; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; + LTE_eNB_DLSCH_t *dlsch = eNB->dlsch_MCH; + LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms; // dlsch->rnti = M_RNTI; dlsch->harq_processes[0]->mcs = mcs; @@ -202,7 +196,7 @@ void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx, in dlsch->harq_processes[0]->rvidx = rvidx; dlsch->harq_processes[0]->Nl = 1; dlsch->harq_processes[0]->TBS = TBStable[get_I_TBS(dlsch->harq_processes[0]->mcs)][frame_parms->N_RB_DL-1]; - dlsch->current_harq_pid = 0; + // dlsch->harq_ids[subframe] = 0; dlsch->harq_processes[0]->nb_rb = frame_parms->N_RB_DL; switch(frame_parms->N_RB_DL) { @@ -227,24 +221,24 @@ void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx, in break; } - if (abstraction_flag) { - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].cntl.pmch_flag=1; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_pmch=1; // assumption: there is always one pmch in each SF - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_common_dci=0; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].num_ue_spec_dci=0; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].dlsch_type[0]=5;// put at the reserved position for PMCH - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].harq_pid[0]=0; - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].ue_id[0]=255;//broadcast - eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].tbs[0]=dlsch->harq_processes[0]->TBS>>3; + if (eNB->abstraction_flag) { + eNB_transport_info[eNB->Mod_id][eNB->CC_id].cntl.pmch_flag=1; + eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_pmch=1; // assumption: there is always one pmch in each SF + eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_common_dci=0; + eNB_transport_info[eNB->Mod_id][eNB->CC_id].num_ue_spec_dci=0; + eNB_transport_info[eNB->Mod_id][eNB->CC_id].dlsch_type[0]=5;// put at the reserved position for PMCH + eNB_transport_info[eNB->Mod_id][eNB->CC_id].harq_pid[0]=0; + eNB_transport_info[eNB->Mod_id][eNB->CC_id].ue_id[0]=255;//broadcast + eNB_transport_info[eNB->Mod_id][eNB->CC_id].tbs[0]=dlsch->harq_processes[0]->TBS>>3; } } -void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eNB_id) +void fill_UE_dlsch_MCH(PHY_VARS_UE *ue,int mcs,int ndi,int rvidx,int eNB_id) { - LTE_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch_ue_MCH[eNB_id]; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; + LTE_UE_DLSCH_t *dlsch = ue->dlsch_MCH[eNB_id]; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; // dlsch->rnti = M_RNTI; dlsch->harq_processes[0]->mcs = mcs; @@ -286,59 +280,59 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eN } } -void generate_mch(PHY_VARS_eNB *phy_vars_eNB,int sched_subframe,uint8_t *a,int abstraction_flag) +void generate_mch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,uint8_t *a) { int G; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; + int subframe = proc->subframe_tx; + int frame = proc->frame_tx; - if (abstraction_flag != 0) { - if (eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]!=0) - printf("[PHY][EMU] PMCH transport block position is different than zero %d \n", eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]); + if (eNB->abstraction_flag != 0) { + if (eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]!=0) + printf("[PHY][EMU] PMCH transport block position is different than zero %d \n", eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]); - memcpy(phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->b, + memcpy(eNB->dlsch_MCH->harq_processes[0]->b, a, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); + eNB->dlsch_MCH->harq_processes[0]->TBS>>3); LOG_D(PHY, "[eNB %d] dlsch_encoding_emul pmch , tbs is %d \n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); + eNB->Mod_id, + eNB->dlsch_MCH->harq_processes[0]->TBS>>3); - memcpy(&eNB_transport_info[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id].transport_blocks[eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]], + memcpy(&eNB_transport_info[eNB->Mod_id][eNB->CC_id].transport_blocks[eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]], a, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); - eNB_transport_info_TB_index[phy_vars_eNB->Mod_id][phy_vars_eNB->CC_id]+= phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3;//=eNB_transport_info[phy_vars_eNB->Mod_id].tbs[0]; + eNB->dlsch_MCH->harq_processes[0]->TBS>>3); + eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]+= eNB->dlsch_MCH->harq_processes[0]->TBS>>3;//=eNB_transport_info[eNB->Mod_id].tbs[0]; } else { - G = get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->lte_frame_parms.N_RB_DL, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->mcs),1, - 2,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); + G = get_G(&eNB->frame_parms, + eNB->frame_parms.N_RB_DL, + eNB->dlsch_MCH->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch_MCH->harq_processes[0]->mcs),1, + 2,proc->frame_tx,subframe,0); - generate_mbsfn_pilot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe); + generate_mbsfn_pilot(eNB,proc, + eNB->common_vars.txdataF, + AMP); - if (dlsch_encoding(a, - &phy_vars_eNB->lte_frame_parms, + + AssertFatal(dlsch_encoding(eNB, + a, 1, - phy_vars_eNB->dlsch_eNB_MCH, - phy_vars_eNB->proc[sched_subframe].frame_tx, + eNB->dlsch_MCH, + proc->frame_tx, subframe, - &phy_vars_eNB->dlsch_rate_matching_stats, - &phy_vars_eNB->dlsch_turbo_encoding_stats, - &phy_vars_eNB->dlsch_interleaving_stats - )<0) - mac_xface->macphy_exit("problem in dlsch_encoding"); + &eNB->dlsch_rate_matching_stats, + &eNB->dlsch_turbo_encoding_stats, + &eNB->dlsch_interleaving_stats)==0, + "problem in dlsch_encoding"); - dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,1,phy_vars_eNB->dlsch_eNB_MCH,G,0,subframe<<1); + dlsch_scrambling(&eNB->frame_parms,1,eNB->dlsch_MCH,0,G,0,frame,subframe<<1); - mch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], + mch_modulation(eNB->common_vars.txdataF, AMP, subframe, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB_MCH); + &eNB->frame_parms, + eNB->dlsch_MCH); } } @@ -379,6 +373,7 @@ void mch_extract_rbs(int **rxdataF, dl_ch_estimates_ext[aarx][(frame_parms->N_RB_DL*3)+j+symbol*(frame_parms->N_RB_DL*12)] = dl_ch_estimates[aarx][i+(frame_parms->N_RB_DL*6)+(symbol*frame_parms->ofdm_symbol_size)]; } } else { + memcpy((void*)&rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)], (void*)&rxdataF[aarx][frame_parms->first_carrier_offset + (symbol*frame_parms->ofdm_symbol_size)], frame_parms->N_RB_DL*24); @@ -388,6 +383,7 @@ void mch_extract_rbs(int **rxdataF, memcpy((void*)&dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)], (void*)&dl_ch_estimates[aarx][(symbol*frame_parms->ofdm_symbol_size)], frame_parms->N_RB_DL*48); + } } @@ -666,10 +662,7 @@ int mch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, llr32 = (uint32_t*)(*llr32p); } - if (!llr32) { - msg("dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32); - return(-1); - } + AssertFatal(llr32!=NULL,"dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32); if ((symbol==2) || (symbol==6) || (symbol==10)) { @@ -960,30 +953,30 @@ void mch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, } int avg_pmch[4]; -int rx_pmch(PHY_VARS_UE *phy_vars_ue, +int rx_pmch(PHY_VARS_UE *ue, unsigned char eNB_id, uint8_t subframe, unsigned char symbol) { - LTE_UE_COMMON *lte_ue_common_vars = &phy_vars_ue->lte_ue_common_vars; - LTE_UE_PDSCH **lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - LTE_UE_DLSCH_t **dlsch_ue = &phy_vars_ue->dlsch_ue_MCH[eNB_id]; + LTE_UE_COMMON *common_vars = &ue->common_vars; + LTE_UE_PDSCH **pdsch_vars = &ue->pdsch_vars_MCH[eNB_id]; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + LTE_UE_DLSCH_t **dlsch = &ue->dlsch_MCH[eNB_id]; int avgs,aarx; //printf("*********************mch: symbol %d\n",symbol); - mch_extract_rbs(lte_ue_common_vars->rxdataF, - lte_ue_common_vars->dl_ch_estimates[eNB_id], - lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + mch_extract_rbs(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF, + common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id], + pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, symbol, subframe, frame_parms); if (symbol == 2) { - mch_channel_level(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, + mch_channel_level(pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, avg_pmch, symbol, @@ -995,55 +988,55 @@ int rx_pmch(PHY_VARS_UE *phy_vars_ue, for (aarx=0; aarxnb_antennas_rx; aarx++) avgs = cmax(avgs,avg_pmch[aarx]); - if (get_Qm(dlsch_ue[0]->harq_processes[0]->mcs)==2) - lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) ;// + 2 + if (get_Qm(dlsch[0]->harq_processes[0]->mcs)==2) + pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2) ;// + 2 else - lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2); // + 5;// + 2 + pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2); // + 5;// + 2 - mch_channel_compensation(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, + mch_channel_compensation(pdsch_vars[eNB_id]->rxdataF_ext, + pdsch_vars[eNB_id]->dl_ch_estimates_ext, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, frame_parms, symbol, - get_Qm(dlsch_ue[0]->harq_processes[0]->mcs), - lte_ue_pdsch_vars[eNB_id]->log2_maxh); + get_Qm(dlsch[0]->harq_processes[0]->mcs), + pdsch_vars[eNB_id]->log2_maxh); if (frame_parms->nb_antennas_rx > 1) mch_detection_mrc(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, symbol); - switch (get_Qm(dlsch_ue[0]->harq_processes[0]->mcs)) { + switch (get_Qm(dlsch[0]->harq_processes[0]->mcs)) { case 2 : mch_qpsk_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], symbol, - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); break; case 4: mch_16qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->dl_ch_mag0, symbol, - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); break; case 6: mch_64qam_llr(frame_parms, - lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, - lte_ue_pdsch_vars[eNB_id]->llr[0], - lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, - lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, + pdsch_vars[eNB_id]->rxdataF_comp0, + pdsch_vars[eNB_id]->llr[0], + pdsch_vars[eNB_id]->dl_ch_mag0, + pdsch_vars[eNB_id]->dl_ch_magb0, symbol, - lte_ue_pdsch_vars[eNB_id]->llr128); + pdsch_vars[eNB_id]->llr128); break; } diff --git a/openair1/PHY/LTE_TRANSPORT/power_control.c b/openair1/PHY/LTE_TRANSPORT/power_control.c index 339a1faefd..10f0c1490c 100644 --- a/openair1/PHY/LTE_TRANSPORT/power_control.c +++ b/openair1/PHY/LTE_TRANSPORT/power_control.c @@ -1,151 +1,150 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#include "PHY/defs.h" -#include "PHY/impl_defs_lte.h" - -//#define DEBUG_PC 1 - -/* -double ratioPB[2][4]={{ 1.0,4.0/5.0,3.0/5.0,2.0/5.0}, - { 5.0/4.0,1.0,3.0/4.0,1.0/2.0}}; -*/ - -double ratioPB[2][4]= {{ 0.00000, -0.96910, -2.21849, -3.97940}, - { 0.96910, 0.00000, -1.24939, -3.01030} -}; - -double pa_values[8]= {-6.0,-4.77,-3.0,-1.77,0.0,1.0,2.0,3.0}; - -double get_pa_dB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated) -{ - return(pa_values[pdsch_config_dedicated->p_a]); -} - -double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, - LTE_eNB_DLSCH_t *dlsch_eNB,int dl_power_off) -{ - double rho_a_dB; - double sqrt_rho_a_lin; - - rho_a_dB = pa_values[ pdsch_config_dedicated->p_a]; - - if(!dl_power_off) - rho_a_dB-=10*log10(2); - - sqrt_rho_a_lin= pow(10,(0.05*rho_a_dB)); - - dlsch_eNB->sqrt_rho_a= (short) (sqrt_rho_a_lin*pow(2,13)); - -#ifdef DEBUG_PC - printf("sqrt_rho_a(eNB):%d\n",dlsch_eNB->sqrt_rho_a); -#endif - - return(rho_a_dB); -} - -double computeRhoB_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, - PDSCH_CONFIG_COMMON *pdsch_config_common, - uint8_t n_antenna_port, - LTE_eNB_DLSCH_t *dlsch_eNB, - int dl_power_off) -{ - - double rho_a_dB, rho_b_dB; - double sqrt_rho_b_lin; - - rho_a_dB= computeRhoA_eNB(pdsch_config_dedicated,dlsch_eNB,dl_power_off); - - if(n_antenna_port>1) - rho_b_dB= ratioPB[1][pdsch_config_common->p_b] + rho_a_dB; - else - rho_b_dB= ratioPB[0][pdsch_config_common->p_b] + rho_a_dB; - - sqrt_rho_b_lin= pow(10,(0.05*rho_b_dB)); - - dlsch_eNB->sqrt_rho_b= (short) (sqrt_rho_b_lin*pow(2,13)); - -#ifdef DEBUG_PC - printf("sqrt_rho_b(eNB):%d\n",dlsch_eNB->sqrt_rho_b); -#endif - return(rho_b_dB); -} - - -double computeRhoA_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, - LTE_UE_DLSCH_t *dlsch_ue, - unsigned char dl_power_off) -{ - - double rho_a_dB; - double sqrt_rho_a_lin; - - rho_a_dB = pa_values[ pdsch_config_dedicated->p_a]; - - if(!dl_power_off) - rho_a_dB-=10*log10(2); - - sqrt_rho_a_lin= pow(10,(0.05*rho_a_dB)); - - dlsch_ue->sqrt_rho_a= (short) (sqrt_rho_a_lin*pow(2,13)); - -#ifdef DEBUG_PC - printf("sqrt_rho_a(ue):%d\n",dlsch_ue->sqrt_rho_a); -#endif - - return(rho_a_dB); -} - -double computeRhoB_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, - PDSCH_CONFIG_COMMON *pdsch_config_common, - uint8_t n_antenna_port, - LTE_UE_DLSCH_t *dlsch_ue, - unsigned char dl_power_off) -{ - - double rho_a_dB, rho_b_dB; - double sqrt_rho_b_lin; - - rho_a_dB= computeRhoA_UE(pdsch_config_dedicated,dlsch_ue,dl_power_off); - - if(n_antenna_port>1) - rho_b_dB= ratioPB[1][pdsch_config_common->p_b] + rho_a_dB; - else - rho_b_dB= ratioPB[0][pdsch_config_common->p_b] + rho_a_dB; - - sqrt_rho_b_lin= pow(10,(0.05*rho_b_dB)); - - dlsch_ue->sqrt_rho_b= (short) (sqrt_rho_b_lin*pow(2,13)); - -#ifdef DEBUG_PC - printf("sqrt_rho_b(ue):%d\n",dlsch_ue->sqrt_rho_b); -#endif - return(rho_b_dB); -} - - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "PHY/defs.h" +#include "PHY/impl_defs_lte.h" + +//#define DEBUG_PC 0 +/* +double ratioPB[2][4]={{ 1.0,4.0/5.0,3.0/5.0,2.0/5.0}, + { 5.0/4.0,1.0,3.0/4.0,1.0/2.0}}; +*/ + +double ratioPB[2][4]={{ 0.00000, -0.96910, -2.21849, -3.97940}, //in db + { 0.96910, 0.00000, -1.24939, -3.01030}}; + +double pa_values[8]={-6.0,-4.77,-3.0,-1.77,0.0,1.0,2.0,3.0}; //reported by higher layers + +double get_pa_dB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated) +{ + if (pdsch_config_dedicated) + return(pa_values[ pdsch_config_dedicated->p_a]); + else + return(0.0); +} + +double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, + LTE_eNB_DLSCH_t *dlsch_eNB, int dl_power_off, uint8_t n_antenna_port){ + double rho_a_dB; + double sqrt_rho_a_lin; + + rho_a_dB = get_pa_dB(pdsch_config_dedicated); + + if(!dl_power_off) //if dl_power_offset is 0, this is for MU-interference, TM5 + rho_a_dB-=10*log10(2); + + if(n_antenna_port==4) // see TS 36.213 Section 5.2 + rho_a_dB+=10*log10(2); + + sqrt_rho_a_lin= pow(10,(0.05*rho_a_dB)); + + dlsch_eNB->sqrt_rho_a= (short) (sqrt_rho_a_lin*pow(2,13)); + +#if DEBUG_PC + printf("eNB: p_a=%d, value=%f, sqrt_rho_a=%d\n",pdsch_config_dedicated->p_a,pa_values[ pdsch_config_dedicated->p_a],dlsch_eNB->sqrt_rho_a); +#endif + + return(rho_a_dB); +} + +double computeRhoB_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, + PDSCH_CONFIG_COMMON *pdsch_config_common, + uint8_t n_antenna_port, + LTE_eNB_DLSCH_t *dlsch_eNB, + int dl_power_off) +{ + + double rho_a_dB, rho_b_dB; + double sqrt_rho_b_lin; + + rho_a_dB= computeRhoA_eNB(pdsch_config_dedicated,dlsch_eNB,dl_power_off, n_antenna_port); + + if(n_antenna_port>1) + rho_b_dB= ratioPB[1][pdsch_config_common->p_b] + rho_a_dB; + else + rho_b_dB= ratioPB[0][pdsch_config_common->p_b] + rho_a_dB; + + sqrt_rho_b_lin= pow(10,(0.05*rho_b_dB)); + + dlsch_eNB->sqrt_rho_b= (short) (sqrt_rho_b_lin*pow(2,13)); + +#ifdef DEBUG_PC + printf("eNB: n_ant=%d, p_b=%d -> rho_b/rho_a=%f -> sqrt_rho_b=%d\n",n_antenna_port,pdsch_config_common->p_b,ratioPB[1][pdsch_config_common->p_b],dlsch_eNB->sqrt_rho_b); +#endif + return(rho_b_dB); +} + + +double computeRhoA_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, + LTE_UE_DLSCH_t *dlsch_ue, + unsigned char dl_power_off, + uint8_t n_antenna_port + ){ + + double rho_a_dB; + double sqrt_rho_a_lin; + + rho_a_dB = get_pa_dB(pdsch_config_dedicated); + + if(!dl_power_off) + rho_a_dB-=10*log10(2); + //if dl_power_offset is 0, this is for MU-interference, TM5. But in practice UE may assume 16 or 64QAM TM4 as multiuser + + if(n_antenna_port==4) // see TS 36.213 Section 5.2 + rho_a_dB=+10*log10(2); + + sqrt_rho_a_lin= pow(10,(0.05*rho_a_dB)); + + dlsch_ue->sqrt_rho_a= (short) (sqrt_rho_a_lin*pow(2,13)); + +#ifdef DEBUG_PC + printf("UE: p_a=%d, value=%f, dl_power_off=%d, sqrt_rho_a=%d\n",pdsch_config_dedicated->p_a,pa_values[ pdsch_config_dedicated->p_a],dl_power_off,dlsch_ue->sqrt_rho_a); +#endif + + return(rho_a_dB); +} + +double computeRhoB_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, + PDSCH_CONFIG_COMMON *pdsch_config_common, + uint8_t n_antenna_port, + LTE_UE_DLSCH_t *dlsch_ue, + unsigned char dl_power_off) +{ + + double rho_a_dB, rho_b_dB; + double sqrt_rho_b_lin; + + rho_a_dB= computeRhoA_UE(pdsch_config_dedicated,dlsch_ue,dl_power_off, n_antenna_port); + + if(n_antenna_port>1) + rho_b_dB= ratioPB[1][pdsch_config_common->p_b] + rho_a_dB; + else + rho_b_dB= ratioPB[0][pdsch_config_common->p_b] + rho_a_dB; + + sqrt_rho_b_lin= pow(10,(0.05*rho_b_dB)); + + dlsch_ue->sqrt_rho_b= (short) (sqrt_rho_b_lin*pow(2,13)); + +#ifdef DEBUG_PC + printf("UE: p_b=%d, n_ant=%d -> ratio=%f -> sqrt_rho_b=%d\n",pdsch_config_common->p_b, n_antenna_port,ratioPB[1][pdsch_config_common->p_b],dlsch_ue->sqrt_rho_b); +#endif + return(rho_b_dB); +} diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index b93519d393..a332670a59 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/prach.c * \brief Top-level routines for generating and decoding the PRACH physical channel V8.6 2009-03 @@ -41,11 +33,13 @@ #include "PHY/defs.h" #include "PHY/extern.h" //#include "prach.h" +#include "PHY/LTE_TRANSPORT/if4_tools.h" #include "SCHED/defs.h" #include "SCHED/extern.h" #include "UTIL/LOG/vcd_signal_dumper.h" //#define PRACH_DEBUG 1 +//#define PRACH_WRITE_OUTPUT_DEBUG 1 uint16_t NCS_unrestricted[16] = {0,13,15,18,22,26,32,38,46,59,76,93,119,167,279,419}; uint16_t NCS_restricted[15] = {15,18,22,26,32,38,46,55,68,82,100,128,158,202,237}; // high-speed case @@ -348,7 +342,6 @@ uint16_t prach_root_sequence_map4[138] = { 1,138,2,137,3,136,4,135,5,134,6,133, 61,78,62,77,63,76,64,75,65,74,66,73,67,72,68,71,69,70 }; -#ifdef USER_MODE void dump_prach_config(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe) { @@ -369,7 +362,6 @@ void dump_prach_config(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe) fclose(fd); } -#endif // This function computes the du void fill_du(uint8_t prach_fmt) @@ -400,16 +392,16 @@ void fill_du(uint8_t prach_fmt) } -uint8_t get_num_prach_tdd(LTE_DL_FRAME_PARMS *frame_parms) +uint8_t get_num_prach_tdd(module_id_t Mod_id) { - - return(tdd_preamble_map[frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex][frame_parms->tdd_config].num_prach); + LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][0]->frame_parms; + return(tdd_preamble_map[fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex][fp->tdd_config].num_prach); } -uint8_t get_fid_prach_tdd(LTE_DL_FRAME_PARMS *frame_parms,uint8_t tdd_map_index) +uint8_t get_fid_prach_tdd(module_id_t Mod_id,uint8_t tdd_map_index) { - - return(tdd_preamble_map[frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex][frame_parms->tdd_config].map[tdd_map_index].f_ra); + LTE_DL_FRAME_PARMS *fp = &PHY_vars_UE_g[Mod_id][0]->frame_parms; + return(tdd_preamble_map[fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex][fp->tdd_config].map[tdd_map_index].f_ra); } uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type) @@ -435,12 +427,14 @@ uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type) } } -uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms, uint8_t tdd_mapindex, uint16_t Nf) +uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms, + uint8_t prach_ConfigIndex, + uint8_t n_ra_prboffset, + uint8_t tdd_mapindex, uint16_t Nf) { lte_frame_type_t frame_type = frame_parms->frame_type; uint8_t tdd_config = frame_parms->tdd_config; - uint8_t prach_ConfigIndex = frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex; - uint8_t n_ra_prboffset = frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset; + uint8_t n_ra_prb; uint8_t f_ra,t1_ra; uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type); @@ -481,15 +475,15 @@ uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms, uint8_t tdd_mapind return(n_ra_prb); } -int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t subframe) +int is_prach_subframe0(LTE_DL_FRAME_PARMS *frame_parms,uint8_t prach_ConfigIndex,uint32_t frame, uint8_t subframe) { - - uint8_t prach_ConfigIndex = frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex; + // uint8_t prach_ConfigIndex = frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex; uint8_t tdd_config = frame_parms->tdd_config; uint8_t t0_ra; uint8_t t1_ra; uint8_t t2_ra; + int prach_mask = 0; if (frame_parms->frame_type == FDD) { //FDD //implement Table 5.7.1-2 from 36.211 (Rel-10, p.41) @@ -503,76 +497,71 @@ int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t su switch (prach_ConfigIndex&0x1f) { case 0: case 3: - return(subframe==1); + if (subframe==1) prach_mask = 1; break; case 1: case 4: - return(subframe==4); + if (subframe==4) prach_mask = 1; break; case 2: case 5: - return(subframe==7); + if (subframe==7) prach_mask = 1; break; case 6: - return((subframe==1) || (subframe==6)); + if ((subframe==1) || (subframe==6)) prach_mask=1; break; case 7: - return((subframe==2) || (subframe==7)); + if ((subframe==2) || (subframe==7)) prach_mask=1; break; case 8: - return((subframe==3) || (subframe==8)); + if ((subframe==3) || (subframe==8)) prach_mask=1; break; case 9: - return((subframe==1) || (subframe==4) || (subframe==7)); + if ((subframe==1) || (subframe==4) || (subframe==7)) prach_mask=1; break; case 10: - return((subframe==2) || (subframe==5) || (subframe==8)); + if ((subframe==2) || (subframe==5) || (subframe==8)) prach_mask=1; break; case 11: - return((subframe==3) || (subframe==6) || (subframe==9)); + if ((subframe==3) || (subframe==6) || (subframe==9)) prach_mask=1; break; case 12: - return((subframe&1)==0); + if ((subframe&1)==0) prach_mask=1; break; case 13: - return((subframe&1)==1); + if ((subframe&1)==1) prach_mask=1; break; case 14: - return(1==1); + prach_mask=1; break; case 15: - return(subframe==9); + if (subframe==9) prach_mask=1; break; } } else { // TDD - if (prach_ConfigIndex>=64) { - LOG_E(PHY,"[PHY] Illegal prach_ConfigIndex %d for ",prach_ConfigIndex); - return(0); - } - - if (tdd_preamble_map[prach_ConfigIndex][tdd_config].num_prach==0) { - LOG_E(PHY,"[PHY] Illegal prach_ConfigIndex %d for ",prach_ConfigIndex); - return(0); - } + AssertFatal(prach_ConfigIndex<64, + "Illegal prach_ConfigIndex %d for ",prach_ConfigIndex); + AssertFatal(tdd_preamble_map[prach_ConfigIndex][tdd_config].num_prach>0, + "Illegal prach_ConfigIndex %d for ",prach_ConfigIndex); t0_ra = tdd_preamble_map[prach_ConfigIndex][tdd_config].map[0].t0_ra; t1_ra = tdd_preamble_map[prach_ConfigIndex][tdd_config].map[0].t1_ra; t2_ra = tdd_preamble_map[prach_ConfigIndex][tdd_config].map[0].t2_ra; #ifdef PRACH_DEBUG - LOG_D(PHY,"[PRACH] Checking for PRACH format (ConfigIndex %d) in TDD subframe %d (%d,%d,%d)\n", + LOG_I(PHY,"[PRACH] Checking for PRACH format (ConfigIndex %d) in TDD subframe %d (%d,%d,%d)\n", prach_ConfigIndex, subframe, t0_ra,t1_ra,t2_ra); @@ -583,35 +572,48 @@ int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t su (t0_ra == 0)) && // PRACH is in all frames (((subframe<5)&&(t1_ra==0)) || // PRACH is in 1st half-frame (((subframe>4)&&(t1_ra==1))))) { // PRACH is in 2nd half-frame - if (prach_ConfigIndex<48) // PRACH only in normal UL subframe - return((((subframe%5)-2)==t2_ra)); - else // PRACH can be in UpPTS - return((((subframe%5)-1)==t2_ra)); - } else - return(1==2); + if ((prach_ConfigIndex<48) && // PRACH only in normal UL subframe + (((subframe%5)-2)==t2_ra)) prach_mask=1; + else if ((prach_ConfigIndex>47) && (((subframe%5)-1)==t2_ra)) prach_mask=1; // PRACH can be in UpPTS + } } - // shouldn't get here! - return(2==1); + return(prach_mask); } -int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subframe, uint16_t Nf ) +int is_prach_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t subframe) { + + uint8_t prach_ConfigIndex = frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex; + int prach_mask = is_prach_subframe0(frame_parms,prach_ConfigIndex,frame,subframe); + +#ifdef Rel14 + int i; + + for (i=0;i<4;i++) { + if (frame_parms->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i] == 1) + prach_mask|=(is_prach_subframe0(frame_parms,frame_parms->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[i],frame,subframe)<<(i+1)); + } +#endif + return(prach_mask); +} + +int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint16_t Nf ) { - lte_frame_type_t frame_type = phy_vars_ue->lte_frame_parms.frame_type; - //uint8_t tdd_config = phy_vars_ue->lte_frame_parms.tdd_config; - uint16_t rootSequenceIndex = phy_vars_ue->lte_frame_parms.prach_config_common.rootSequenceIndex; - uint8_t prach_ConfigIndex = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; - uint8_t Ncs_config = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; - uint8_t restricted_set = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag; - //uint8_t n_ra_prboffset = phy_vars_ue->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset; - uint8_t preamble_index = phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex; - uint8_t tdd_mapindex = phy_vars_ue->prach_resources[eNB_id]->ra_TDD_map_index; - int16_t *prachF = phy_vars_ue->lte_ue_prach_vars[eNB_id]->prachF; + lte_frame_type_t frame_type = ue->frame_parms.frame_type; + //uint8_t tdd_config = ue->frame_parms.tdd_config; + uint16_t rootSequenceIndex = ue->frame_parms.prach_config_common.rootSequenceIndex; + uint8_t prach_ConfigIndex = ue->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; + uint8_t Ncs_config = ue->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; + uint8_t restricted_set = ue->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag; + //uint8_t n_ra_prboffset = ue->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset; + uint8_t preamble_index = ue->prach_resources[eNB_id]->ra_PreambleIndex; + uint8_t tdd_mapindex = ue->prach_resources[eNB_id]->ra_TDD_map_index; + int16_t *prachF = ue->prach_vars[eNB_id]->prachF; static int16_t prach_tmp[45600*2] __attribute__((aligned(32))); int16_t *prach = prach_tmp; int16_t *prach2; - int16_t amp = phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp; + int16_t amp = ue->prach_vars[eNB_id]->amp; int16_t Ncp; uint8_t n_ra_prb; uint16_t NCS; @@ -634,43 +636,48 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra int i, prach_len; uint16_t first_nonzero_root_idx=0; -#ifdef BIT8_TX - prach_start = ((subframe*phy_vars_ue->lte_frame_parms.samples_per_tti)<<1)-phy_vars_ue->N_TA_offset; -#else #if defined(EXMIMO) || defined(OAI_USRP) - prach_start = (phy_vars_ue->rx_offset+subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-openair_daq_vars.timing_advance-phy_vars_ue->N_TA_offset); + prach_start = (ue->rx_offset+subframe*ue->frame_parms.samples_per_tti-ue->hw_timing_advance-ue->N_TA_offset); +#ifdef PRACH_DEBUG + LOG_I(PHY,"[UE %d] prach_start %d, rx_offset %d, hw_timing_advance %d, N_TA_offset %d\n", ue->Mod_id, + prach_start, + ue->rx_offset, + ue->hw_timing_advance, + ue->N_TA_offset); +#endif if (prach_start<0) - prach_start+=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); + prach_start+=(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); - if (prach_start>=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) - prach_start-=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); + if (prach_start>=(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) + prach_start-=(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); #else //normal case (simulation) - prach_start = subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-phy_vars_ue->N_TA_offset; -#endif + prach_start = subframe*ue->frame_parms.samples_per_tti-ue->N_TA_offset; + LOG_I(PHY,"[UE %d] prach_start %d, rx_offset %d, hw_timing_advance %d, N_TA_offset %d\n", ue->Mod_id, + prach_start, + ue->rx_offset, + ue->hw_timing_advance, + ue->N_TA_offset); + #endif + // First compute physical root sequence if (restricted_set == 0) { - if (Ncs_config > 15) { - LOG_E( PHY, "[PHY] FATAL, Illegal Ncs_config for unrestricted format %"PRIu8"\n", Ncs_config ); - mac_xface->macphy_exit("PRACH: Illegal Ncs_config for unrestricted format"); - return 0; // not reached - } - + AssertFatal(Ncs_config <= 15, + "[PHY] FATAL, Illegal Ncs_config for unrestricted format %"PRIu8"\n", Ncs_config ); NCS = NCS_unrestricted[Ncs_config]; } else { - if (Ncs_config > 14) { - LOG_E( PHY, "[PHY] FATAL, Illegal Ncs_config for restricted format %"PRIu8"\n", Ncs_config ); - mac_xface->macphy_exit("PRACH: Illegal Ncs_config for restricted format"); - return 0; // not reached - } - + AssertFatal(Ncs_config <= 14, + "[PHY] FATAL, Illegal Ncs_config for restricted format %"PRIu8"\n", Ncs_config ); NCS = NCS_restricted[Ncs_config]; } - n_ra_prb = get_prach_prb_offset(&(phy_vars_ue->lte_frame_parms), tdd_mapindex, Nf); + n_ra_prb = get_prach_prb_offset(&(ue->frame_parms), + ue->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, + ue->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset, + tdd_mapindex, Nf); prach_root_sequence_map = (prach_fmt<4) ? prach_root_sequence_map0_3 : prach_root_sequence_map4; /* @@ -678,7 +685,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra if (frame_type == TDD) { // TDD if (tdd_preamble_map[prach_ConfigIndex][tdd_config].num_prach==0) { - LOG_E( PHY, "[PHY][UE %"PRIu8"] Illegal prach_ConfigIndex %"PRIu8" for ", phy_vars_ue->Mod_id, prach_ConfigIndex ); + LOG_E( PHY, "[PHY][UE %"PRIu8"] Illegal prach_ConfigIndex %"PRIu8" for ", ue->Mod_id, prach_ConfigIndex ); } // adjust n_ra_prboffset for frequency multiplexing (p.36 36.211) @@ -688,7 +695,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra if ((f_ra&1) == 0) { n_ra_prb = n_ra_prboffset + 6*(f_ra>>1); } else { - n_ra_prb = phy_vars_ue->lte_frame_parms.N_RB_UL - 6 - n_ra_prboffset + 6*(f_ra>>1); + n_ra_prb = ue->frame_parms.N_RB_UL - 6 - n_ra_prboffset + 6*(f_ra>>1); } } else { if ((tdd_config >2) && (tdd_config<6)) @@ -699,7 +706,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra if ((((Nf&1)*(2-Nsp)+t1_ra)&1) == 0) { n_ra_prb = 6*f_ra; } else { - n_ra_prb = phy_vars_ue->lte_frame_parms.N_RB_UL - 6*(f_ra+1); + n_ra_prb = ue->frame_parms.N_RB_UL - 6*(f_ra+1); } } } @@ -715,7 +722,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra } else { // This is the high-speed case #ifdef PRACH_DEBUG - LOG_D(PHY,"[UE %d] High-speed mode, NCS_config %d\n",phy_vars_ue->Mod_id,Ncs_config); + LOG_I(PHY,"[UE %d] High-speed mode, NCS_config %d\n",ue->Mod_id,Ncs_config); #endif not_found = 1; @@ -776,7 +783,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra #ifdef PRACH_DEBUG if (NCS>0) - LOG_D(PHY,"Generate PRACH for RootSeqIndex %d, Preamble Index %d, NCS %d (NCS_config %d, N_ZC/NCS %d) n_ra_prb %d: Preamble_offset %d, Preamble_shift %d\n", + LOG_I(PHY,"Generate PRACH for RootSeqIndex %d, Preamble Index %d, NCS %d (NCS_config %d, N_ZC/NCS %d) n_ra_prb %d: Preamble_offset %d, Preamble_shift %d\n", rootSequenceIndex,preamble_index,NCS,Ncs_config,N_ZC/NCS,n_ra_prb, preamble_offset,preamble_shift); @@ -785,24 +792,24 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra // nsymb = (frame_parms->Ncp==0) ? 14:12; // subframe_offset = (unsigned int)frame_parms->ofdm_symbol_size*subframe*nsymb; - k = (12*n_ra_prb) - 6*phy_vars_ue->lte_frame_parms.N_RB_UL; + k = (12*n_ra_prb) - 6*ue->frame_parms.N_RB_UL; if (k<0) - k+=phy_vars_ue->lte_frame_parms.ofdm_symbol_size; + k+=ue->frame_parms.ofdm_symbol_size; k*=12; k+=13; - Xu = (int16_t*)phy_vars_ue->X_u[preamble_offset-first_nonzero_root_idx]; + Xu = (int16_t*)ue->X_u[preamble_offset-first_nonzero_root_idx]; /* - k+=(12*phy_vars_ue->lte_frame_parms.first_carrier_offset); - if (k>(12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)) - k-=(12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size); + k+=(12*ue->frame_parms.first_carrier_offset); + if (k>(12*ue->frame_parms.ofdm_symbol_size)) + k-=(12*ue->frame_parms.ofdm_symbol_size); */ k*=2; - switch (phy_vars_ue->lte_frame_parms.N_RB_UL) { + switch (ue->frame_parms.N_RB_UL) { case 6: memset((void*)prachF,0,4*1536); break; @@ -820,11 +827,14 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra break; case 75: - memset((void*)prachF,0,4*19432); + memset((void*)prachF,0,4*18432); break; case 100: - memset((void*)prachF,0,4*24576); + if (ue->frame_parms.threequarter_fs == 0) + memset((void*)prachF,0,4*24576); + else + memset((void*)prachF,0,4*18432); break; } @@ -838,7 +848,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra prachF[k++]= ((Xu_re*ru[offset2<<1]) - (Xu_im*ru[1+(offset2<<1)]))>>15; prachF[k++]= ((Xu_im*ru[offset2<<1]) + (Xu_re*ru[1+(offset2<<1)]))>>15; - if (k==(12*2*phy_vars_ue->lte_frame_parms.ofdm_symbol_size)) + if (k==(12*2*ue->frame_parms.ofdm_symbol_size)) k=0; } @@ -865,7 +875,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra break; } - switch (phy_vars_ue->lte_frame_parms.N_RB_UL) { + switch (ue->frame_parms.N_RB_UL) { case 6: Ncp>>=4; prach+=4; // makes prach2 aligned to 128-bit @@ -888,10 +898,13 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra break; } + if (ue->frame_parms.threequarter_fs == 1) + Ncp=(Ncp*3)>>2; + prach2 = prach+(Ncp<<1); // do IDFT - switch (phy_vars_ue->lte_frame_parms.N_RB_UL) { + switch (ue->frame_parms.N_RB_UL) { case 6: if (prach_fmt == 4) { idft256(prachF,prach2,1); @@ -988,97 +1001,127 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra break; case 100: - if (prach_fmt == 4) { - idft4096(prachF,prach2,1); - memmove( prach, prach+8192, Ncp<<2 ); - prach_len = 4096+Ncp; - } else { - idft24576(prachF,prach2); - memmove( prach, prach+49152, Ncp<<2 ); - prach_len = 24576+Ncp; - - if (prach_fmt>1) { - memmove( prach2+49152, prach2, 98304 ); - prach_len = 2* 24576+Ncp; + if (ue->frame_parms.threequarter_fs == 0) { + if (prach_fmt == 4) { + idft4096(prachF,prach2,1); + memmove( prach, prach+8192, Ncp<<2 ); + prach_len = 4096+Ncp; + } else { + idft24576(prachF,prach2); + memmove( prach, prach+49152, Ncp<<2 ); + prach_len = 24576+Ncp; + + if (prach_fmt>1) { + memmove( prach2+49152, prach2, 98304 ); + prach_len = 2* 24576+Ncp; + } } } + else { + if (prach_fmt == 4) { + idft3072(prachF,prach2); + //TODO: account for repeated format in dft output + memmove( prach, prach+6144, Ncp<<2 ); + prach_len = 3072+Ncp; + } else { + idft18432(prachF,prach2); + memmove( prach, prach+36864, Ncp<<2 ); + prach_len = 18432+Ncp; + printf("Generated prach for 100 PRB, 3/4 sampling\n"); + if (prach_fmt>1) { + memmove( prach2+36834, prach2, 73728 ); + prach_len = 2*18432+Ncp; + } + } + } break; } - //LOG_D(PHY,"prach_len=%d\n",prach_len); + //LOG_I(PHY,"prach_len=%d\n",prach_len); - if (prach_fmt==4) { - LOG_E( PHY, "prach_fmt4 not fully implemented" ); - mac_xface->macphy_exit("prach_fmt4 not fully implemented"); - return 0; // not reached - } else { + AssertFatal(prach_fmt<4, + "prach_fmt4 not fully implemented" ); #if defined(EXMIMO) || defined(OAI_USRP) - int j; - int overflow = prach_start + prach_len - LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_ue->lte_frame_parms.samples_per_tti; - LOG_D( PHY, "prach_start=%d, overflow=%d\n", prach_start, overflow ); - - for (i=prach_start,j=0; ilte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,prach_start+prach_len); i++,j++) { - ((int16_t*)phy_vars_ue->lte_ue_common_vars.txdata[0])[2*i] = prach[2*j]<<4; - ((int16_t*)phy_vars_ue->lte_ue_common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4; - } - - for (i=0; ilte_ue_common_vars.txdata[0])[2*i] = prach[2*j]<<4; - ((int16_t*)phy_vars_ue->lte_ue_common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4; - } + int j; + int overflow = prach_start + prach_len - LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*ue->frame_parms.samples_per_tti; + LOG_I( PHY, "prach_start=%d, overflow=%d\n", prach_start, overflow ); + + for (i=prach_start,j=0; iframe_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,prach_start+prach_len); i++,j++) { + ((int16_t*)ue->common_vars.txdata[0])[2*i] = prach[2*j]<<4; + ((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4; + } + + for (i=0; icommon_vars.txdata[0])[2*i] = prach[2*j]<<4; + ((int16_t*)ue->common_vars.txdata[0])[2*i+1] = prach[2*j+1]<<4; + } #if defined(EXMIMO) - // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on - for (k=prach_start - (phy_vars_ue->lte_frame_parms.samples_per_tti>>1) ; klte_ue_common_vars.txdata[0][k+phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; - else if (k>(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) - phy_vars_ue->lte_ue_common_vars.txdata[0][k-phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; - else - phy_vars_ue->lte_ue_common_vars.txdata[0][k] &= 0xFFFEFFFE; - } + // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on + for (k=prach_start - (ue->frame_parms.samples_per_tti>>1) ; kcommon_vars.txdata[0][k+ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + else if (k>(ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) + ue->common_vars.txdata[0][k-ue->frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + else + ue->common_vars.txdata[0][k] &= 0xFFFEFFFE; + } #endif #else - - for (i=0; ilte_ue_common_vars.txdata[0][prach_start]))[2*i] = prach[2*i]; - ((int16_t*)(&phy_vars_ue->lte_ue_common_vars.txdata[0][prach_start]))[2*i+1] = prach[2*i+1]; - } - -#endif + + for (i=0; icommon_vars.txdata[0][prach_start]))[2*i] = prach[2*i]; + ((int16_t*)(&ue->common_vars.txdata[0][prach_start]))[2*i+1] = prach[2*i+1]; } + +#endif + - -#ifdef PRACH_DEBUG + +#if defined(PRACH_WRITE_OUTPUT_DEBUG) write_output("prach_txF0.m","prachtxF0",prachF,prach_len-Ncp,1,1); write_output("prach_tx0.m","prachtx0",prach+(Ncp<<1),prach_len-Ncp,1,1); + write_output("txsig.m","txs",(int16_t*)(&ue->common_vars.txdata[0][0]),2*ue->frame_parms.samples_per_tti,1,1); + exit(-1); #endif return signal_energy( (int*)prach, 256 ); } //__m128i mmtmpX0,mmtmpX1,mmtmpX2,mmtmpX3; -void rx_prach(PHY_VARS_eNB *phy_vars_eNB, - uint8_t subframe, - uint16_t *preamble_energy_list, - uint16_t *preamble_delay_list, - uint16_t Nf, - uint8_t tdd_mapindex) +void rx_prach0(PHY_VARS_eNB *eNB, + RU_t *ru, + uint16_t *max_preamble, + uint16_t *max_preamble_energy, + uint16_t *max_preamble_delay, + uint16_t Nf, + uint8_t tdd_mapindex +#ifdef Rel14 + ,uint8_t br_flag, + uint8_t ce_level +#endif + ) { int i; - lte_frame_type_t frame_type = phy_vars_eNB->lte_frame_parms.frame_type; - uint16_t rootSequenceIndex = phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex; - uint8_t prach_ConfigIndex = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; - uint8_t Ncs_config = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; - uint8_t restricted_set = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag; - int16_t *prachF = phy_vars_eNB->lte_eNB_prach_vars.prachF; - int16_t **rxsigF = phy_vars_eNB->lte_eNB_prach_vars.rxsigF; - int16_t **prach_ifft = phy_vars_eNB->lte_eNB_prach_vars.prach_ifft; - int16_t *prach[4]; + LTE_DL_FRAME_PARMS *fp; + lte_frame_type_t frame_type; + uint16_t rootSequenceIndex; + uint8_t prach_ConfigIndex; + uint8_t Ncs_config; + uint8_t restricted_set; + uint8_t n_ra_prb; + +#ifdef PRACH_DEBUG + int frame; +#endif + int subframe; + int16_t *prachF=NULL; + int16_t **rxsigF=NULL; + int nb_rx; + int16_t *prach2; - uint8_t n_ra_prb; uint8_t preamble_index; uint16_t NCS,NCS2; uint16_t preamble_offset=0,preamble_offset_old; @@ -1088,10 +1131,8 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB, uint16_t d_start=0; uint16_t numshift=0; uint16_t *prach_root_sequence_map; - uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type); - uint16_t N_ZC = (prach_fmt <4)?839:139; uint8_t not_found; - int k; + int k=0; uint16_t u; int16_t *Xu; uint16_t offset; @@ -1102,34 +1143,173 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB, int32_t lev; int16_t levdB; int fft_size,log2_ifft_size; - uint8_t nb_ant_rx = 1; //phy_vars_eNB->lte_frame_parms.nb_antennas_rx; + int16_t prach_ifft_tmp[2048*2] __attribute__((aligned(32))); + int32_t *prach_ifft=(int32_t*)NULL; + int32_t **prach_ifftp=(int32_t **)NULL; +#ifdef Rel14 + int prach_ifft_cnt=0; +#endif +#ifdef PRACH_DEBUG + int en0=0; +#endif - for (aa=0; aalte_eNB_common_vars.rxdata[0][aa][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti-phy_vars_eNB->N_TA_offset]; + if (ru) { + fp = &ru->frame_parms; + nb_rx = ru->nb_rx; + } + else if (eNB) { + fp = &eNB->frame_parms; + nb_rx = fp->nb_antennas_rx; + } + else AssertFatal(1==0,"rx_prach called without valid RU or eNB descriptor\n"); + + frame_type = fp->frame_type; + +#ifdef Rel14 + if (br_flag == 1) { + AssertFatal(fp->prach_emtc_config_common.prach_Config_enabled==1, + "emtc prach_Config is not enabled\n"); + AssertFatal(fp->prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[ce_level]==1, + "ce_level %d is not active\n",ce_level); + rootSequenceIndex = fp->prach_emtc_config_common.rootSequenceIndex; + prach_ConfigIndex = fp->prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[ce_level]; + Ncs_config = fp->prach_emtc_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; + restricted_set = fp->prach_emtc_config_common.prach_ConfigInfo.highSpeedFlag; + n_ra_prb = get_prach_prb_offset(fp,prach_ConfigIndex, + fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level], + tdd_mapindex,Nf); + // update pointers to results for ce_level + max_preamble += ce_level; + max_preamble_energy += ce_level; + max_preamble_delay += ce_level; + } + else +#endif + { + rootSequenceIndex = fp->prach_config_common.rootSequenceIndex; + prach_ConfigIndex = fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex; + Ncs_config = fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; + restricted_set = fp->prach_config_common.prach_ConfigInfo.highSpeedFlag; + n_ra_prb = get_prach_prb_offset(fp,prach_ConfigIndex, + fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset, + tdd_mapindex,Nf); + } + + int16_t *prach[nb_rx]; + uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type); + uint16_t N_ZC = (prach_fmt <4)?839:139; + + if (eNB) { +#ifdef Rel14 + if (br_flag == 1) { + prach_ifftp = eNB->prach_vars_br.prach_ifft[ce_level]; +#ifdef PRACH_DEBUG + frame = eNB->proc.frame_prach_br; +#endif + subframe = eNB->proc.subframe_prach_br; + prachF = eNB->prach_vars_br.prachF; + rxsigF = eNB->prach_vars_br.rxsigF[ce_level]; +#ifdef PRACH_DEBUG + if ((frame&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d, rootSequenceIndex %d, repetition number %d,numRepetitionsPrePreambleAttempt %d\n", + br_flag,ce_level,frame,subframe, + fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level], + prach_ConfigIndex,rootSequenceIndex, + eNB->prach_vars_br.repetition_number[ce_level], + fp->prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[ce_level]); +#endif + } + else +#endif + { + prach_ifftp = eNB->prach_vars.prach_ifft[0]; +#ifdef PRACH_DEBUG + frame = eNB->proc.frame_prach; +#endif + subframe = eNB->proc.subframe_prach; + prachF = eNB->prach_vars.prachF; + rxsigF = eNB->prach_vars.rxsigF[0]; +#ifdef PRACH_DEBUG + //if ((frame&1023) < 20) LOG_I(PHY,"PRACH (eNB) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d , rootSequenceIndex %d\n", subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex,rootSequenceIndex); +#endif + } + } + else { +#ifdef Rel14 + if (br_flag == 1) { +#ifdef PRACH_DEBUG + frame = ru->proc.frame_prach_br; +#endif + subframe = ru->proc.subframe_prach_br; + rxsigF = ru->prach_rxsigF_br[ce_level]; +#ifdef PRACH_DEBUG + if ((frame&1023) < 20) LOG_I(PHY,"PRACH (RU) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n", + br_flag,ce_level,frame,subframe,fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level],prach_ConfigIndex); +#endif + } + else +#endif + { +#ifdef PRACH_DEBUG + frame = ru->proc.frame_prach; +#endif + subframe = ru->proc.subframe_prach; + rxsigF = ru->prach_rxsigF; +#ifdef PRACH_DEBUG + if ((frame&1023) < 20) LOG_I(PHY,"PRACH (RU) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n", + subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex); +#endif + } + + } + + AssertFatal(ru!=NULL,"ru is null\n"); + + for (aa=0; aaif_south == LOCAL_RF) { // set the time-domain signal if we have to use it in this node + // DJP - indexing below in subframe zero takes us off the beginning of the array??? + prach[aa] = (int16_t*)&ru->common.rxdata[aa][(subframe*fp->samples_per_tti)-ru->N_TA_offset]; +#ifdef PRACH_DEBUG + int32_t en0=signal_energy((int32_t*)prach[aa],fp->samples_per_tti); + int8_t dbEn0 = dB_fixed(en0); + int8_t rach_dBm = dbEn0 - eNB->rx_total_gain_dB; + +#ifdef PRACH_WRITE_OUTPUT_DEBUG + if (dbEn0>32 && prach[0]!= NULL) + { + static int counter=0; + + char buffer[80]; + //counter++; + sprintf(buffer, "%s%d", "/tmp/prach_rx",counter); + write_output(buffer,"prach_rx",prach[0],fp->samples_per_tti,1,13); + } +#endif + + if (dbEn0>32) + { +#ifdef PRACH_WRITE_OUTPUT_DEBUG + if (prach[0]!= NULL) write_output("prach_rx","prach_rx",prach[0],fp->samples_per_tti,1,1); +#endif + LOG_I(PHY,"RU %d, br_flag %d ce_level %d frame %d subframe %d per_tti:%d prach:%p (energy %d) TA:%d rach_dBm:%d rxdata:%p index:%d\n",ru->idx,br_flag,ce_level,frame,subframe,fp->samples_per_tti,prach[aa],dbEn0,ru->N_TA_offset,rach_dBm,ru->common.rxdata[aa], (subframe*fp->samples_per_tti)-ru->N_TA_offset); + } +#endif + } } // First compute physical root sequence if (restricted_set == 0) { - if (Ncs_config>15) { - LOG_E(PHY,"FATAL, Illegal Ncs_config for unrestricted format %d\n",Ncs_config); - mac_xface->macphy_exit("PRACH Illegal Ncs_config for unrestricted format"); - return; // not reached - } - + AssertFatal(Ncs_config<=15, + "Illegal Ncs_config for unrestricted format %d\n",Ncs_config); NCS = NCS_unrestricted[Ncs_config]; } else { - if (Ncs_config>14) { - LOG_E(PHY,"FATAL, Illegal Ncs_config for restricted format %d\n",Ncs_config); - mac_xface->macphy_exit("PRACH Illegal Ncs_config for restricted format"); - return; // not reached - } - + AssertFatal(Ncs_config<=14, + "FATAL, Illegal Ncs_config for restricted format %d\n",Ncs_config); NCS = NCS_restricted[Ncs_config]; } - start_meas(&phy_vars_eNB->rx_prach); + if (eNB) start_meas(&eNB->rx_prach); + - n_ra_prb = get_prach_prb_offset(&(phy_vars_eNB->lte_frame_parms),tdd_mapindex,Nf); prach_root_sequence_map = (prach_fmt < 4) ? prach_root_sequence_map0_3 : prach_root_sequence_map4; // PDP is oversampled, e.g. 1024 sample instead of 839 @@ -1162,7 +1342,8 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB, break; } - switch (phy_vars_eNB->lte_frame_parms.N_RB_UL) { + // Adjust CP length based on UL bandwidth + switch (fp->N_RB_UL) { case 6: Ncp>>=4; break; @@ -1182,25 +1363,205 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB, case 75: Ncp=(Ncp*3)>>2; break; + + case 100: + if (fp->threequarter_fs == 1) + Ncp=(Ncp*3)>>2; + break; } + + if (((eNB!=NULL) && (ru->function != NGFI_RAU_IF4p5))|| + ((eNB==NULL) && (ru->function == NGFI_RRU_IF4p5))) { // compute the DFTs of the PRACH temporal resources + // Do forward transform +#ifdef PRACH_DEBUG + LOG_D(PHY,"rx_prach: Doing FFT for N_RB_UL %d nb_rx:%d Ncp:%d\n",fp->N_RB_UL, nb_rx, Ncp); +#endif + for (aa=0; aaN_RB_UL) { + case 6: + if (prach_fmt == 4) { + dft256(prach2,rxsigF[aa],1); + } else { + dft1536(prach2,rxsigF[aa],1); + + if (prach_fmt>1) + dft1536(prach2+3072,rxsigF[aa]+3072,1); + } + + break; + + case 15: + if (prach_fmt == 4) { + dft256(prach2,rxsigF[aa],1); + } else { + dft3072(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft3072(prach2+6144,rxsigF[aa]+6144); + } + + break; + + case 25: + default: + if (prach_fmt == 4) { + dft1024(prach2,rxsigF[aa],1); + fft_size = 1024; + } else { + dft6144(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft6144(prach2+12288,rxsigF[aa]+12288); + + fft_size = 6144; + } + + break; + + case 50: + if (prach_fmt == 4) { + dft2048(prach2,rxsigF[aa],1); + } else { + dft12288(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft12288(prach2+24576,rxsigF[aa]+24576); + } + + break; + + case 75: + if (prach_fmt == 4) { + dft3072(prach2,rxsigF[aa]); + } else { + dft18432(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft18432(prach2+36864,rxsigF[aa]+36864); + } + + break; + + case 100: + if (fp->threequarter_fs==0) { + if (prach_fmt == 4) { + dft4096(prach2,rxsigF[aa],1); + } else { + dft24576(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft24576(prach2+49152,rxsigF[aa]+49152); + } + } else { + if (prach_fmt == 4) { + dft3072(prach2,rxsigF[aa]); + } else { + dft18432(prach2,rxsigF[aa]); + + if (prach_fmt>1) + dft18432(prach2+36864,rxsigF[aa]+36864); + } + } + + break; + } + + k = (12*n_ra_prb) - 6*fp->N_RB_UL; + + if (k<0) { + k+=(fp->ofdm_symbol_size); + } + + k*=12; + k+=13; + k*=2; + int dftsize_x2 = fp->ofdm_symbol_size*24; + //LOG_D(PHY,"Shifting prach_rxF from %d to 0\n",k); + + if ((k+(839*2)) > dftsize_x2) { // PRACH signal is split around DC + memmove((void*)&rxsigF[aa][dftsize_x2-k],(void*)&rxsigF[aa][0],(k+(839*2)-dftsize_x2)*2); + memmove((void*)&rxsigF[aa][0],(void*)(&rxsigF[aa][k]),(dftsize_x2-k)*2); + } + else // PRACH signal is not split around DC + memmove((void*)&rxsigF[aa][0],(void*)(&rxsigF[aa][k]),839*4); + + } + + } + + if ((eNB==NULL) && (ru!=NULL) && ru->function == NGFI_RRU_IF4p5) { + + /// **** send_IF4 of rxsigF to RAU **** /// +#ifdef Rel14 + if (br_flag == 1) send_IF4p5(ru, ru->proc.frame_prach, ru->proc.subframe_prach, IF4p5_PRACH+1+ce_level); + + else +#endif + send_IF4p5(ru, ru->proc.frame_prach, ru->proc.subframe_prach, IF4p5_PRACH); + + return; + } else if (eNB!=NULL) { + +#ifdef PRACH_DEBUG + int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); + if ((en > 60)&&(br_flag==1)) LOG_I(PHY,"PRACH (br_flag %d,ce_level %d, n_ra_prb %d, k %d): Frame %d, Subframe %d => %d dB\n",br_flag,ce_level,n_ra_prb,k,eNB->proc.frame_rx,eNB->proc.subframe_rx,en); +#endif + } + + // in case of RAU and prach received rx_thread wakes up prach + + // here onwards is for eNodeB_3GPP or NGFI_RAU_IF4p5 + preamble_offset_old = 99; + uint8_t update_TA = 4; + uint8_t update_TA2 = 1; + switch (eNB->frame_parms.N_RB_DL) { + case 6: + update_TA = 16; + break; + + case 25: + update_TA = 4; + break; + + case 50: + update_TA = 2; + break; + + case 75: + update_TA = 3; + update_TA2 = 2; + case 100: + update_TA = 1; + break; + } + + *max_preamble_energy=0; for (preamble_index=0 ; preamble_index<64 ; preamble_index++) { + +#ifdef PRACH_DEBUG + if (en>60) LOG_I(PHY,"frame %d, subframe %d : Trying preamble %d (br_flag %d)\n",frame,subframe,preamble_index,br_flag); +#endif if (restricted_set == 0) { // This is the relative offset in the root sequence table (5.7.2-4 from 36.211) for the given preamble index preamble_offset = ((NCS==0)? preamble_index : (preamble_index/(N_ZC/NCS))); - + if (preamble_offset != preamble_offset_old) { preamble_offset_old = preamble_offset; new_dft = 1; // This is the \nu corresponding to the preamble index preamble_shift = 0; } - + else { preamble_shift -= NCS; - + if (preamble_shift < 0) preamble_shift+=N_ZC; } @@ -1270,196 +1631,183 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB, // Compute DFT of RX signal (conjugate input, results in conjugate output) for each new rootSequenceIndex #ifdef PRACH_DEBUG - LOG_I(PHY,"preamble index %d: offset %d, preamble shift %d\n",preamble_index,preamble_offset,preamble_shift); + if (en>60) LOG_I(PHY,"frame %d, subframe %d : preamble index %d: offset %d, preamble shift %d (br_flag %d, en %d)\n", + frame,subframe,preamble_index,preamble_offset,preamble_shift,br_flag,en); #endif log2_ifft_size = 10; fft_size = 6144; if (new_dft == 1) { new_dft = 0; - Xu=(int16_t*)phy_vars_eNB->X_u[preamble_offset-first_nonzero_root_idx]; - for (aa=0; aalte_frame_parms.N_RB_UL; - - if (k<0) - k+=(phy_vars_eNB->lte_frame_parms.ofdm_symbol_size); - - k*=12; - k+=13; // phi + K/2 - // k+=(12*phy_vars_eNB->lte_frame_parms.first_carrier_offset); - // if (k>(12*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)) - // k-=(12*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size); - - // printf("First prach carrier : k %d\n",k); - k*=2; - - // do DFT - switch (phy_vars_eNB->lte_frame_parms.N_RB_UL) { - case 6: - if (prach_fmt == 4) { - dft256(prach2,rxsigF[aa],1); - } else { - dft1536(prach2,rxsigF[aa],1); - - if (prach_fmt>1) - dft1536(prach2+3072,rxsigF[aa]+3072,1); - } - - break; - - case 15: - if (prach_fmt == 4) { - dft256(prach2,rxsigF[aa],1); - } else { - dft3072(prach2,rxsigF[aa]); - - if (prach_fmt>1) - dft3072(prach2+6144,rxsigF[aa]+6144); - } - - break; - - case 25: - default: - if (prach_fmt == 4) { - dft1024(prach2,rxsigF[aa],1); - fft_size = 1024; - } else { - dft6144(prach2,rxsigF[aa]); - - if (prach_fmt>1) - dft6144(prach2+12288,rxsigF[aa]+12288); - - fft_size = 6144; - } - - break; - - case 50: - if (prach_fmt == 4) { - dft2048(prach2,rxsigF[aa],1); - } else { - dft12288(prach2,rxsigF[aa]); - - if (prach_fmt>1) - dft12288(prach2+24576,rxsigF[aa]+24576); - } - - break; - - case 75: - if (prach_fmt == 4) { - dft3072(prach2,rxsigF[aa]); - } else { - dft18432(prach2,rxsigF[aa]); - - if (prach_fmt>1) - dft18432(prach2+36864,rxsigF[aa]+36864); - } - - break; - - case 100: - if (prach_fmt == 4) { - dft4096(prach2,rxsigF[aa],1); - } else { - dft24576(prach2,rxsigF[aa]); - - if (prach_fmt>1) - dft24576(prach2+49152,rxsigF[aa]+49152); - } - - break; - } - - memset( prachF, 0, sizeof(int16_t)*2*1024 ); -#ifdef PRACH_DEBUG - write_output("prach_rx0.m","prach_rx0",prach[0],6144+792,1,1); +#ifdef Rel14 + if (br_flag == 1) { + Xu=(int16_t*)eNB->X_u_br[ce_level][preamble_offset-first_nonzero_root_idx]; + prach_ifft = prach_ifftp[prach_ifft_cnt++]; + if (eNB->prach_vars_br.repetition_number[ce_level]==1) memset(prach_ifft,0,((N_ZC==839)?2048:256)*sizeof(int32_t)); + } + else #endif - // write_output("prach_rx1.m","prach_rx1",prach[1],6144+792,1,1); - // write_output("prach_rxF0.m","prach_rxF0",rxsigF[0],24576,1,1); - // write_output("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1); + { + Xu=(int16_t*)eNB->X_u[preamble_offset-first_nonzero_root_idx]; + prach_ifft = prach_ifftp[0]; + memset(prach_ifft,0,((N_ZC==839) ? 2048 : 256)*sizeof(int32_t)); + } - // Do componentwise product with Xu* - for (offset=0; offset<(N_ZC<<1); offset+=2) { - prachF[offset] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k] + (int32_t)Xu[offset+1]*rxsigF[aa][k+1])>>15); - prachF[offset+1] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k+1] - (int32_t)Xu[offset+1]*rxsigF[aa][k])>>15); - /* - if (offset<16) - printf("Xu[%d] %d %d, rxsigF[%d][%d] %d %d\n",offset,Xu[offset],Xu[offset+1],aa,k,rxsigF[aa][k],rxsigF[aa][k+1]); - */ - /* - mmtmpX0 = _mm_madd_epi16(*(__m128i*)&Xu[offset],*(__m128i*)&rxsigF[aa][k<<1]); - mmtmpX1 = _mm_shufflelo_epi16(*(__m128i*)&Xu[offset],_MM_SHUFFLE(2,3,0,1)); - mmtmpX1 = _mm_shufflehi_epi16(mmtmpX1,_MM_SHUFFLE(2,3,0,1)); - mmtmpX1 = _mm_sign_epi16(mmtmpX1,*(__m128i*)&conjugate[0]); - mmtmpX1 = _mm_madd_epi16(mmtmpX1,*(__m128i*)&rxsigF[aa][k<<1]); - mmtmpX0 = _mm_srai_epi32(mmtmpX0,15); - mmtmpX1 = _mm_srai_epi32(mmtmpX1,15); - mmtmpX2 = _mm_unpacklo_epi32(mmtmpX0,mmtmpX1); - mmtmpX3 = _mm_unpackhi_epi32(mmtmpX0,mmtmpX1); - *(__m128i*)&prachF[offset] = _mm_packs_epi32(mmtmpX2,mmtmpX3); - */ - k+=2; - - if (k==(12*2*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)) - k=0; - } - - // Now do IFFT of size 1024 (N_ZC=839) or 256 (N_ZC=139) - if (N_ZC == 839) { - log2_ifft_size = 10; - idft1024(prachF,prach_ifft[aa],1); - } else { - idft256(prachF,prach_ifft[aa],1); - log2_ifft_size = 8; - } -#ifdef PRACH_DEBUG - write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); + memset(prachF, 0, sizeof(int16_t)*2*1024 ); +#if defined(PRACH_WRITE_OUTPUT_DEBUG) + if (prach[0]!= NULL) write_output("prach_rx0.m","prach_rx0",prach[0],6144+792,1,1); #endif - // write_output("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1); + // write_output("prach_rx1.m","prach_rx1",prach[1],6144+792,1,1); + // write_output("prach_rxF0.m","prach_rxF0",rxsigF[0],24576,1,1); + // write_output("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1); + for (aa=0;aa>15); + prachF[offset+1] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k+1] - (int32_t)Xu[offset+1]*rxsigF[aa][k])>>15); + k+=2; + if (k==(12*2*fp->ofdm_symbol_size)) + k=0; + } + + // Now do IFFT of size 1024 (N_ZC=839) or 256 (N_ZC=139) + if (N_ZC == 839) { + log2_ifft_size = 10; + idft1024(prachF,prach_ifft_tmp,1); + // compute energy and accumulate over receive antennas and repetitions for BR + for (i=0;i<2048;i++) + prach_ifft[i] += (prach_ifft_tmp[i<<1]*prach_ifft_tmp[i<<1] + prach_ifft_tmp[1+(i<<1)]*prach_ifft_tmp[1+(i<<1)])>>10; + } else { + idft256(prachF,prach_ifft_tmp,1); + log2_ifft_size = 8; + // compute energy and accumulate over receive antennas and repetitions for BR + for (i=0;i<256;i++) + prach_ifft[i] += (prach_ifft_tmp[i<<1]*prach_ifft_tmp[(i<<1)] + prach_ifft_tmp[1+(i<<1)]*prach_ifft_tmp[1+(i<<1)])>>10; + } + +#if defined(PRACH_WRITE_OUTPUT_DEBUG) + if (aa==0) write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); +#endif + // if (aa=1) write_output("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1); }// antennas_rx -#ifdef PRACH_DEBUG - write_output("prach_ifft0.m","prach_t0",prach_ifft[0],2048,1,1); -#endif - // write_output("prach_ifft1.m","prach_t1",prach_ifft[1],2048,1,1); - } // new dft - - // check energy in nth time shift - preamble_shift2 = ((preamble_shift==0) ? 0 : ((preamble_shift<preamble_energy_list[preamble_index] ) { - preamble_energy_list[preamble_index] = levdB; - preamble_delay_list[preamble_index] = (i*fft_size)>>log2_ifft_size; - } - } - -#ifdef PRACH_DEBUG - LOG_D(PHY,"[RAPROC] Preamble %d => %d dB, %d (shift %d (%d), NCS2 %d(%d), Ncp %d)\n",preamble_index,preamble_energy_list[preamble_index],preamble_delay_list[preamble_index],preamble_shift2, - preamble_shift, NCS2,NCS,Ncp); + + // check energy in nth time shift, for +#ifdef Rel14 + if ((br_flag==0) || + (eNB->prach_vars_br.repetition_number[ce_level]== + eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[ce_level])) #endif - // exit(-1); + { +#ifdef PRACH_DEBUG + if (en>60) LOG_I(PHY,"frame %d, subframe %d: Checking for peak in time-domain (br_flag %d, en %d)\n",frame,subframe,br_flag,en); +#endif + preamble_shift2 = ((preamble_shift==0) ? 0 : ((preamble_shift<*max_preamble_energy) { + *max_preamble_energy = levdB; + *max_preamble_delay = ((i*fft_size)>>log2_ifft_size)*update_TA/update_TA2; + *max_preamble = preamble_index; +#ifdef PRACH_DEBUG + if ((en>60) && (br_flag==1)) LOG_D(PHY,"frame %d, subframe %d : max_preamble_energy %d, max_preamble_delay %d, max_preamble %d (br_flag %d,ce_level %d, levdB %d, lev %d)\n",frame,subframe,*max_preamble_energy,*max_preamble_delay,*max_preamble,br_flag,ce_level,levdB,lev); +#endif + } + } + + } }// preamble_index - stop_meas(&phy_vars_eNB->rx_prach); +#ifdef PRACH_DEBUG + + if (en>60) { + k = (12*n_ra_prb) - 6*fp->N_RB_UL; + + if (k<0) k+=fp->ofdm_symbol_size; + + k*=12; + k+=13; + k*=2; + + if (br_flag == 0) { +#if defined(PRACH_WRITE_OUTPUT_DEBUG) + write_output("rxsigF.m","prach_rxF",&rxsigF[0][0],12288,1,1); + write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); + write_output("Xu.m","xu",Xu,N_ZC,1,1); + write_output("prach_ifft0.m","prach_t0",prach_ifft,1024,1,1); +#endif + } + else { +#if defined(PRACH_WRITE_OUTPUT_DEBUG) + printf("Dumping prach (br_flag %d), k = %d (n_ra_prb %d)\n",br_flag,k,n_ra_prb); + write_output("rxsigF_br.m","prach_rxF_br",&rxsigF[0][0],12288,1,1); + write_output("prach_rxF_comp0_br.m","prach_rxF_comp0_br",prachF,1024,1,1); + write_output("Xu_br.m","xu_br",Xu,N_ZC,1,1); + write_output("prach_ifft0_br.m","prach_t0_br",prach_ifft,1024,1,1); + exit(-1); +#endif + } + + } +#endif + if (eNB) stop_meas(&eNB->rx_prach); } + + +#ifndef Rel14 +#define rx_prach rx_prach0 +#else +void rx_prach(PHY_VARS_eNB *eNB, + RU_t *ru, + uint16_t *max_preamble, + uint16_t *max_preamble_energy, + uint16_t *max_preamble_delay, + uint16_t Nf, + uint8_t tdd_mapindex, + uint8_t br_flag) { + + int i; + int prach_mask=0; + + if (br_flag == 0) { + rx_prach0(eNB,ru,max_preamble,max_preamble_energy,max_preamble_delay,Nf,tdd_mapindex,0,0); + } + else { // This is procedure for eMTC, basically handling the repetitions + prach_mask = is_prach_subframe(&eNB->frame_parms,eNB->proc.frame_prach_br,eNB->proc.subframe_prach_br); + for (i=0;i<4;i++) { + if ((eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i]==1) && + ((prach_mask&(1<<(i+1))) > 0)) { // check that prach CE level is active now + + // if first reception in group of repetitions store frame for later (in RA-RNTI for Msg2) + if (eNB->prach_vars_br.repetition_number[i]==0) eNB->prach_vars_br.first_frame[i]=eNB->proc.frame_prach_br; + + // increment repetition number + eNB->prach_vars_br.repetition_number[i]++; + + // do basic PRACH reception + rx_prach0(eNB,ru,max_preamble,max_preamble_energy,max_preamble_delay,Nf,tdd_mapindex,1,i); + + // if last repetition, clear counter + if (eNB->prach_vars_br.repetition_number[i] == eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[i]) { + eNB->prach_vars_br.repetition_number[i]=0; + + } + } + } + } +} +#endif + void init_prach_tables(int N_ZC) { @@ -1497,15 +1845,18 @@ void init_prach_tables(int N_ZC) } } -void compute_prach_seq(PRACH_CONFIG_COMMON *prach_config_common, - lte_frame_type_t frame_type, - uint32_t X_u[64][839]) +void compute_prach_seq(uint16_t rootSequenceIndex, + uint8_t prach_ConfigIndex, + uint8_t zeroCorrelationZoneConfig, + uint8_t highSpeedFlag, + lte_frame_type_t frame_type, + uint32_t X_u[64][839]) { // Compute DFT of x_u => X_u[k] = x_u(inv(u)*k)^* X_u[k] = exp(j\pi u*inv(u)*k*(inv(u)*k+1)/N_ZC) unsigned int k,inv_u,i,NCS=0,num_preambles; int N_ZC; - uint8_t prach_fmt = get_prach_fmt(prach_config_common->prach_ConfigInfo.prach_ConfigIndex,frame_type); + uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type); uint16_t *prach_root_sequence_map; uint16_t u, preamble_offset; uint16_t n_shift_ra,n_shift_ra_bar, d_start,numshift; @@ -1514,15 +1865,11 @@ void compute_prach_seq(PRACH_CONFIG_COMMON *prach_config_common, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_COMPUTE_PRACH, VCD_FUNCTION_IN); #ifdef PRACH_DEBUG - LOG_I(PHY,"compute_prach_seq: NCS_config %d, prach_fmt %d\n",prach_config_common->prach_ConfigInfo.zeroCorrelationZoneConfig, prach_fmt); + LOG_I(PHY,"compute_prach_seq: NCS_config %d, prach_fmt %d\n",zeroCorrelationZoneConfig, prach_fmt); #endif - if (prach_fmt>=4) { - LOG_E( PHY, "PRACH sequence is only precomputed for prach_fmt<4 (have %"PRIu8")\n", prach_fmt ); - mac_xface->macphy_exit("PRACH sequence is only precomputed for prach_fmt<4"); - return; // not reached - } - + AssertFatal(prach_fmt<4, + "PRACH sequence is only precomputed for prach_fmt<4 (have %"PRIu8")\n", prach_fmt ); N_ZC = (prach_fmt < 4) ? 839 : 139; //init_prach_tables(N_ZC); //moved to phy_init_lte_ue/eNB, since it takes to long in real-time @@ -1538,19 +1885,15 @@ void compute_prach_seq(PRACH_CONFIG_COMMON *prach_config_common, LOG_I( PHY, "compute_prach_seq: done init prach_tables\n" ); #endif - if (prach_config_common->prach_ConfigInfo.highSpeedFlag== 0) { + if (highSpeedFlag== 0) { #ifdef PRACH_DEBUG - LOG_I(PHY,"Low speed prach : NCS_config %d\n",prach_config_common->prach_ConfigInfo.zeroCorrelationZoneConfig); + LOG_I(PHY,"Low speed prach : NCS_config %d\n",zeroCorrelationZoneConfig); #endif - if (prach_config_common->prach_ConfigInfo.zeroCorrelationZoneConfig>15) { - LOG_E( PHY, "FATAL, Illegal Ncs_config for unrestricted format %"PRIu8"\n", prach_config_common->prach_ConfigInfo.zeroCorrelationZoneConfig ); - mac_xface->macphy_exit("PRACH Illegal Ncs_config for unrestricted format"); - return; // not reached - } else { - NCS = NCS_unrestricted[prach_config_common->prach_ConfigInfo.zeroCorrelationZoneConfig]; - } + AssertFatal(zeroCorrelationZoneConfig<=15, + "FATAL, Illegal Ncs_config for unrestricted format %"PRIu8"\n", zeroCorrelationZoneConfig ); + NCS = NCS_unrestricted[zeroCorrelationZoneConfig]; num_preambles = (NCS==0) ? 64 : ((64*NCS)/N_ZC); @@ -1560,17 +1903,13 @@ void compute_prach_seq(PRACH_CONFIG_COMMON *prach_config_common, } else { #ifdef PRACH_DEBUG - LOG_I( PHY, "high speed prach : NCS_config %"PRIu8"\n", prach_config_common->prach_ConfigInfo.zeroCorrelationZoneConfig ); + LOG_I( PHY, "high speed prach : NCS_config %"PRIu8"\n", zeroCorrelationZoneConfig ); #endif - if (prach_config_common->prach_ConfigInfo.zeroCorrelationZoneConfig>14) { - LOG_E( PHY, "FATAL, Illegal Ncs_config for restricted format %"PRIu8"\n", prach_config_common->prach_ConfigInfo.zeroCorrelationZoneConfig ); - mac_xface->macphy_exit("PRACH Illegal Ncs_config for restricted format"); - return; // not reached - } else { - NCS = NCS_restricted[prach_config_common->prach_ConfigInfo.zeroCorrelationZoneConfig]; - fill_du(prach_fmt); - } + AssertFatal(zeroCorrelationZoneConfig<=14, + "FATAL, Illegal Ncs_config for restricted format %"PRIu8"\n", zeroCorrelationZoneConfig ); + NCS = NCS_restricted[zeroCorrelationZoneConfig]; + fill_du(prach_fmt); num_preambles = 64; // compute ZC sequence for 64 possible roots // find first non-zero shift root (stored in preamble_offset) @@ -1579,7 +1918,7 @@ void compute_prach_seq(PRACH_CONFIG_COMMON *prach_config_common, while (not_found == 1) { // current root depending on rootSequenceIndex - int index = (prach_config_common->rootSequenceIndex + preamble_offset) % N_ZC; + int index = (rootSequenceIndex + preamble_offset) % N_ZC; if (prach_fmt<4) { // prach_root_sequence_map points to prach_root_sequence_map0_3 @@ -1623,12 +1962,12 @@ void compute_prach_seq(PRACH_CONFIG_COMMON *prach_config_common, if (NCS>0) LOG_I( PHY, "Initializing %u preambles for PRACH (NCS_config %"PRIu8", NCS %u, N_ZC/NCS %u)\n", - num_preambles, prach_config_common->prach_ConfigInfo.zeroCorrelationZoneConfig, NCS, N_ZC/NCS ); + num_preambles, zeroCorrelationZoneConfig, NCS, N_ZC/NCS ); #endif for (i=0; irootSequenceIndex+i+preamble_offset) % N_ZC; + int index = (rootSequenceIndex+i+preamble_offset) % N_ZC; if (prach_fmt<4) { // prach_root_sequence_map points to prach_root_sequence_map0_3 @@ -1649,7 +1988,6 @@ void compute_prach_seq(PRACH_CONFIG_COMMON *prach_config_common, for (k=0; k. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ short __attribute__((aligned(16))) X_u839[4][2*839] = {{25792,20209,24697,21533,21208,24977,14453,29407,3673,32560,-10603,31004,-25018,21161,-32697,2145,-25717,-20307,-2330,-32685,24778,-21441,31178,10078,4403,32469,-28990,15273,-22038,-24250,20546,-25526,26673,19030,-20065,25905,-22930,-23408,28086,-16877,6820,32049,-31985,-7121,22218,-24084,6580,32099,-28459,-16242,31873,-7599,-20642,25448,4038,-32518,10834,30923,-21115,-25058,26955,18629,-29699,-13845,30607,11698,-30291,-12497,28519,16134,-24291,-21993,16188,28488,-3308,-32600,-13118,30026,27959,-17087,-32353,-5193,18679,26921,9552,-31344,-31534,8904,22308,24000,14122,-29568,-32314,-5435,490,32763,32605,-3247,-2819,-32646,-32758,-798,-7539,31887,28149,16771,26458,-19330,-4283,-32487,-29271,-14729,-30052,13061,-12213,30405,9669,31307,25331,20784,32111,6520,32182,-6160,29046,-15165,25563,-20499,23450,-22887,23450,-22887,25563,-20499,29046,-15165,32182,-6160,32111,6520,25331,20784,9669,31307,-12213,30405,-30052,13061,-29271,-14729,-4283,-32487,26458,-19330,28149,16771,-7539,31887,-32758,-798,-2819,-32646,32605,-3247,490,32763,-32314,-5435,14122,-29568,22308,24000,-31534,8904,9552,-31344,18679,26921,-32353,-5193,27959,-17087,-13118,30026,-3308,-32600,16188,28488,-24291,-21993,28519,16134,-30291,-12497,30607,11698,-29699,-13845,26955,18629,-21115,-25058,10834,30923,4038,-32518,-20642,25448,31873,-7599,-28459,-16242,6580,32099,22218,-24084,-31985,-7121,6820,32049,28086,-16877,-22930,-23408,-20065,25905,26673,19030,20546,-25526,-22038,-24250,-28990,15273,4403,32469,31178,10078,24778,-21441,-2330,-32685,-25717,-20307,-32697,2145,-25018,21161,-10603,31004,3673,32560,14453,29407,21208,24977,24697,21533,25792,20209,24858,21348,21579,24657,15110,29074,4646,32435,-9435,31379,-24042,22263,-32540,3855,-26887,-18731,-4526,-32454,23104,-23235,31902,7479,7299,31943,-27368,18019,-24455,-21810,17555,-27668,28757,15705,-16614,28243,-25868,-20114,25409,-20690,11526,30672,-32705,-2024,17967,-27402,11984,30496,-30904,-10893,29902,-13399,-15328,28960,-2574,-32666,17034,27991,-26018,-19919,30428,12155,-32088,-6641,32509,4099,-32428,-4708,31663,8431,-29160,-14947,23191,23148,-12099,-30452,-4161,32501,21855,-24414,-32445,4585,25942,20016,-614,-32762,-27095,18426,28874,15490,3551,-32575,-32251,5797,11756,30585,29379,-14509,-14344,-29461,-30780,11238,4889,32400,32409,4828,16929,-28055,-16719,-28181,-32719,-1779,-22129,24166,1471,32733,21946,24331,31786,7956,31756,-8076,26166,-19724,19180,-26567,13454,-29878,10253,-31122,10020,-31198,12779,-30173,18172,-27267,25096,-21068,31140,-10196,32333,5313,24207,22082,5131,32362,-18881,26780,-32641,2879,-20927,-25215,11870,-30542,32741,-1288,11296,30758,-27635,17607,-20737,-25371,24938,-21255,19279,26494,-29435,14398,-5979,-32218,32205,6038,-19871,26054,-11412,-30716,31253,9845,-28640,15920,11181,-30801,8727,31583,-23278,-23062,30694,11469,-32751,-1043,32135,-6401,-31024,10544,30651,-11585,-31326,9610,32461,-4465,-32525,-3978,29103,15056,-19577,-26277,2940,32634,17347,-27799,-31600,8668,27501,17813,-1840,-32716,-27232,18223,28023,16981,6700,-32075,-32747,1165,5857,32239,31929,-7360,-5737,-32261,-32755,920,-7061,31997,27765,17399,27568,-17711,-1105,-32749,-27026,-18529,-31846,7717,-18275,27197,1716,32721,18477,27060,28397,16348,32292,5555,32650,-2758,31815,-7838,31289,-9729,31631,-8550,32493,-4222,32593,3368,29750,13733,21394,24818,6098,32194,-13790,29724,-29953,13286,-30196,-12724,-8373,-31680,22398,-23917,31396,9375,2451,32675,-30863,11008,-16082,-28550,27300,-18122,17451,27732,-29647,13955,-7181,-31971,32617,3123,-15975,28609,-17140,-27928,32711,1900,-22666,23663,-123,-32767,20450,25601,-31064,-10429,32390,-4951,-28275,16560,22576,-23748,-17866,27468,15436,-28904,-15760,28728,18780,-26851,-23875,22443,29487,-14289,-32726,1655,29541,14177,-16508,-28306,-5375,32323,26745,-18931,-31567,-8787,10137,31159,22754,-23579,-30475,-12042,-2697,32655,32553,-3735,-6941,-32024,-32011,7000,3916,32532,32679,2390,11641,-30630,-23959,-22354,-30945,10776,-8016,31771,19674,26202,32477,4342,27700,-17504,13005,-30076,-3063,-32624,-15653,-28787,-23621,-22710,-27831,-17296,-29594,-14067,-29802,-13623,-28580,-16029,-25254,-20879,-18579,-26991,-7420,-31916,7896,-31802,23790,-22533,32629,-3002,25640,20402,1226,32744,-26092,19821,-30100,-12950,-369,-32765,30984,-10661,17243,27862,-25487,20593,-21302,-24899,26312,-19527,14892,29187,-32062,6760,5010,-32382,26815,18830,-30149,12836,8134,-31742,17658,27601,-31501,-9023,30821,-11124,-21021,25135,8609,-31616,2206,32692,-9787,-31272,14011,29620,-15220,-29019,13566,29826,-8846,-31551,736,32758,10486,-31044,-22843,23492,31695,-8313,-30384,-12270,14232,29514,12326,-30361,-31726,8193,23364,22973,10718,-30965,-32765,429,8490,31647,30001,-13175,-14783,-29243,-29853,13510,9199,31449,32731,-1534,9317,-31415,-24617,-21626,-31103,10312,-9904,31234,16824,28117,31466,9140,30563,-11814,19772,-26130,6219,-32172,-5496,-32303,-13678,-29776,-18377,-27130,-20162,-25830,-19379,-26423,-15868,-28669,-9082,-31484,1349,-32740,14563,-29353,27163,-18326,32760,674,24372,21901,981,32752,-25176,20973,-31216,-9963,-5254,-32344,28212,-16667,23705,22621,-18071,27333,-28699,-15814,16294,-28429,26385,19428,-24536,21717,-13231,-29978,32765,-307,-15545,28845,-15002,-29132,31957,7240,-27896,17191,10950,-30884,7777,31830,-21672,-24577,29325,14618,-32272,-5677,32762,-553,-32568,3612,32580,-3491,-32767,184,32159,6279,-28933,-15382,20831,25292,-6461,-32124,-12441,30313,28816,-15599,-31432,-9259,12892,30123,17762,-27536,-32671,-2513,10370,31082,26602,-19131,-24125,-22174,-19478,26349,26530,19230,21487,-24739,-20355,-25679,-30337,12383,245,32766,29215,14837,28336,-16455,4768,-32419,-19968,-25981,-32037,-6881,-30244,12610,-20259,25754,-8254,31710,1961,32708,8963,31517,12666,30219,13342,29927,11065,30841,5616,32282,-3186,32611,-14674,29297,-26240,19625,-32661,2635,-27435,-17917,-7659,-31860,18980,-26710,32766,-62,16401,28366,-19081,26638,-31362,-9494,2084,-32701,32688,-2269,3429,32587,-32737,1410,3794,-32547,30518,11927,-21764,24495,-12554,-30267,32372,5071,-23536,22798,-859,-32756,22487,23832,-32229,-5919,30736,-11355,-23018,23321,13900,-29673,-6340,32147,1594,-32729,0,32767,1594,-32729,-6340,32147,13900,-29673,-23018,23321,30736,-11355,-32229,-5919,22487,23832,-859,-32756,-23536,22798,32372,5071,-12554,-30267,-21764,24495,30518,11927,3794,-32547,-32737,1410,3429,32587,32688,-2269,2084,-32701,-31362,-9494,-19081,26638,16401,28366,32766,-62,18980,-26710,-7659,-31860,-27435,-17917,-32661,2635,-26240,19625,-14674,29297,-3186,32611,5616,32282,11065,30841,13342,29927,12666,30219,8963,31517,1961,32708,-8254,31710,-20259,25754,-30244,12610,-32037,-6881,-19968,-25981,4768,-32419,28336,-16455,29215,14837,245,32766,-30337,12383,-20355,-25679,21487,-24739,26530,19230,-19478,26349,-24125,-22174,26602,-19131,10370,31082,-32671,-2513,17762,-27536,12892,30123,-31432,-9259,28816,-15599,-12441,30313,-6461,-32124,20831,25292,-28933,-15382,32159,6279,-32767,184,32580,-3491,-32568,3612,32762,-553,-32272,-5677,29325,14618,-21672,-24577,7777,31830,10950,-30884,-27896,17191,31957,7240,-15002,-29132,-15545,28845,32765,-307,-13231,-29978,-24536,21717,26385,19428,16294,-28429,-28699,-15814,-18071,27333,23705,22621,28212,-16667,-5254,-32344,-31216,-9963,-25176,20973,981,32752,24372,21901,32760,674,27163,-18326,14563,-29353,1349,-32740,-9082,-31484,-15868,-28669,-19379,-26423,-20162,-25830,-18377,-27130,-13678,-29776,-5496,-32303,6219,-32172,19772,-26130,30563,-11814,31466,9140,16824,28117,-9904,31234,-31103,10312,-24617,-21626,9317,-31415,32731,-1534,9199,31449,-29853,13510,-14783,-29243,30001,-13175,8490,31647,-32765,429,10718,-30965,23364,22973,-31726,8193,12326,-30361,14232,29514,-30384,-12270,31695,-8313,-22843,23492,10486,-31044,736,32758,-8846,-31551,13566,29826,-15220,-29019,14011,29620,-9787,-31272,2206,32692,8609,-31616,-21021,25135,30821,-11124,-31501,-9023,17658,27601,8134,-31742,-30149,12836,26815,18830,5010,-32382,-32062,6760,14892,29187,26312,-19527,-21302,-24899,-25487,20593,17243,27862,30984,-10661,-369,-32765,-30100,-12950,-26092,19821,1226,32744,25640,20402,32629,-3002,23790,-22533,7896,-31802,-7420,-31916,-18579,-26991,-25254,-20879,-28580,-16029,-29802,-13623,-29594,-14067,-27831,-17296,-23621,-22710,-15653,-28787,-3063,-32624,13005,-30076,27700,-17504,32477,4342,19674,26202,-8016,31771,-30945,10776,-23959,-22354,11641,-30630,32679,2390,3916,32532,-32011,7000,-6941,-32024,32553,-3735,-2697,32655,-30475,-12042,22754,-23579,10137,31159,-31567,-8787,26745,-18931,-5375,32323,-16508,-28306,29541,14177,-32726,1655,29487,-14289,-23875,22443,18780,-26851,-15760,28728,15436,-28904,-17866,27468,22576,-23748,-28275,16560,32390,-4951,-31064,-10429,20450,25601,-123,-32767,-22666,23663,32711,1900,-17140,-27928,-15975,28609,32617,3123,-7181,-31971,-29647,13955,17451,27732,27300,-18122,-16082,-28550,-30863,11008,2451,32675,31396,9375,22398,-23917,-8373,-31680,-30196,-12724,-29953,13286,-13790,29724,6098,32194,21394,24818,29750,13733,32593,3368,32493,-4222,31631,-8550,31289,-9729,31815,-7838,32650,-2758,32292,5555,28397,16348,18477,27060,1716,32721,-18275,27197,-31846,7717,-27026,-18529,-1105,-32749,27568,-17711,27765,17399,-7061,31997,-32755,920,-5737,-32261,31929,-7360,5857,32239,-32747,1165,6700,-32075,28023,16981,-27232,18223,-1840,-32716,27501,17813,-31600,8668,17347,-27799,2940,32634,-19577,-26277,29103,15056,-32525,-3978,32461,-4465,-31326,9610,30651,-11585,-31024,10544,32135,-6401,-32751,-1043,30694,11469,-23278,-23062,8727,31583,11181,-30801,-28640,15920,31253,9845,-11412,-30716,-19871,26054,32205,6038,-5979,-32218,-29435,14398,19279,26494,24938,-21255,-20737,-25371,-27635,17607,11296,30758,32741,-1288,11870,-30542,-20927,-25215,-32641,2879,-18881,26780,5131,32362,24207,22082,32333,5313,31140,-10196,25096,-21068,18172,-27267,12779,-30173,10020,-31198,10253,-31122,13454,-29878,19180,-26567,26166,-19724,31756,-8076,31786,7956,21946,24331,1471,32733,-22129,24166,-32719,-1779,-16719,-28181,16929,-28055,32409,4828,4889,32400,-30780,11238,-14344,-29461,29379,-14509,11756,30585,-32251,5797,3551,-32575,28874,15490,-27095,18426,-614,-32762,25942,20016,-32445,4585,21855,-24414,-4161,32501,-12099,-30452,23191,23148,-29160,-14947,31663,8431,-32428,-4708,32509,4099,-32088,-6641,30428,12155,-26018,-19919,17034,27991,-2574,-32666,-15328,28960,29902,-13399,-30904,-10893,11984,30496,17967,-27402,-32705,-2024,11526,30672,25409,-20690,-25868,-20114,-16614,28243,28757,15705,17555,-27668,-24455,-21810,-27368,18019,7299,31943,31902,7479,23104,-23235,-4526,-32454,-26887,-18731,-32540,3855,-24042,22263,-9435,31379,4646,32435,15110,29074,21579,24657,24858,21348}, {25792,-20210,24858,-21349,21579,-24658,15110,-29075,4646,-32436,-9435,-31380,-24042,-22264,-32540,-3856,-26887,18730,-4526,32453,23104,23234,31902,-7480,7299,-31944,-27368,-18020,-24455,21809,17555,27667,28757,-15706,-16614,-28244,-25868,20113,25409,20689,11526,-30673,-32705,2023,17967,27401,11984,-30497,-30904,10892,29902,13398,-15328,-28961,-2574,32665,17034,-27992,-26018,19918,30428,-12156,-32088,6640,32509,-4100,-32428,4707,31663,-8432,-29160,14946,23191,-23149,-12099,30451,-4161,-32502,21855,24413,-32445,-4586,25942,-20017,-614,32761,-27095,-18427,28874,-15491,3551,32574,-32251,-5798,11756,-30586,29379,14508,-14344,29460,-30780,-11239,4889,-32401,32409,-4829,16929,28054,-16719,28180,-32719,1778,-22129,-24167,1471,-32734,21946,-24332,31786,-7957,31756,8075,26166,19723,19180,26566,13454,29877,10253,31121,10020,31197,12779,30172,18172,27266,25096,21067,31140,10195,32333,-5314,24207,-22083,5131,-32363,-18881,-26781,-32641,-2880,-20927,25214,11870,30541,32741,1287,11296,-30759,-27635,-17608,-20737,25370,24938,21254,19279,-26495,-29435,-14399,-5979,32217,32205,-6039,-19871,-26055,-11412,30715,31253,-9846,-28640,-15921,11181,30800,8727,-31584,-23278,23061,30694,-11470,-32751,1042,32135,6400,-31024,-10545,30651,11584,-31326,-9611,32461,4464,-32525,3977,29103,-15057,-19577,26276,2940,-32635,17347,27798,-31600,-8669,27501,-17814,-1840,32715,-27232,-18224,28023,-16982,6700,32074,-32747,-1166,5857,-32240,31929,7359,-5737,32260,-32755,-921,-7061,-31998,27765,-17400,27568,17710,-1105,32748,-27026,18528,-31846,-7718,-18275,-27198,1716,-32722,18477,-27061,28397,-16349,32292,-5556,32650,2757,31815,7837,31289,9728,31631,8549,32493,4221,32593,-3369,29750,-13734,21394,-24819,6098,-32195,-13790,-29725,-29953,-13287,-30196,12723,-8373,31679,22398,23916,31396,-9376,2451,-32676,-30863,-11009,-16082,28549,27300,18121,17451,-27733,-29647,-13956,-7181,31970,32617,-3124,-15975,-28610,-17140,27927,32711,-1901,-22666,-23664,-123,32766,20450,-25602,-31064,10428,32390,4950,-28275,-16561,22576,23747,-17866,-27469,15436,28903,-15760,-28729,18780,26850,-23875,-22444,29487,14288,-32726,-1656,29541,-14178,-16508,28305,-5375,-32324,26745,18930,-31567,8786,10137,-31160,22754,23578,-30475,12041,-2697,-32656,32553,3734,-6941,32023,-32011,-7001,3916,-32533,32679,-2391,11641,30629,-23959,22353,-30945,-10777,-8016,-31772,19674,-26203,32477,-4343,27700,17503,13005,30075,-3063,32623,-15653,28786,-23621,22709,-27831,17295,-29594,14066,-29802,13622,-28580,16028,-25254,20878,-18579,26990,-7420,31915,7896,31801,23790,22532,32629,3001,25640,-20403,1226,-32745,-26092,-19822,-30100,12949,-369,32764,30984,10660,17243,-27863,-25487,-20594,-21302,24898,26312,19526,14892,-29188,-32062,-6761,5010,32381,26815,-18831,-30149,-12837,8134,31741,17658,-27602,-31501,9022,30821,11123,-21021,-25136,8609,31615,2206,-32693,-9787,31271,14011,-29621,-15220,29018,13566,-29827,-8846,31550,736,-32759,10486,31043,-22843,-23493,31695,8312,-30384,12269,14232,-29515,12326,30360,-31726,-8194,23364,-22974,10718,30964,-32765,-430,8490,-31648,30001,13174,-14783,29242,-29853,-13511,9199,-31450,32731,1533,9317,31414,-24617,21625,-31103,-10313,-9904,-31235,16824,-28118,31466,-9141,30563,11813,19772,26129,6219,32171,-5496,32302,-13678,29775,-18377,27129,-20162,25829,-19379,26422,-15868,28668,-9082,31483,1349,32739,14563,29352,27163,18325,32760,-675,24372,-21902,981,-32753,-25176,-20974,-31216,9962,-5254,32343,28212,16666,23705,-22622,-18071,-27334,-28699,15813,16294,28428,26385,-19429,-24536,-21718,-13231,29977,32765,306,-15545,-28846,-15002,29131,31957,-7241,-27896,-17192,10950,30883,7777,-31831,-21672,24576,29325,-14619,-32272,5676,32762,552,-32568,-3613,32580,3490,-32767,-185,32159,-6280,-28933,15381,20831,-25293,-6461,32123,-12441,-30314,28816,15598,-31432,9258,12892,-30124,17762,27535,-32671,2512,10370,-31083,26602,19130,-24125,22173,-19478,-26350,26530,-19231,21487,24738,-20355,25678,-30337,-12384,245,-32767,29215,-14838,28336,16454,4768,32418,-19968,25980,-32037,6880,-30244,-12611,-20259,-25755,-8254,-31711,1961,-32709,8963,-31518,12666,-30220,13342,-29928,11065,-30842,5616,-32283,-3186,-32612,-14674,-29298,-26240,-19626,-32661,-2636,-27435,17916,-7659,31859,18980,26709,32766,61,16401,-28367,-19081,-26639,-31362,9493,2084,32700,32688,2268,3429,-32588,-32737,-1411,3794,32546,30518,-11928,-21764,-24496,-12554,30266,32372,-5072,-23536,-22799,-859,32755,22487,-23833,-32229,5918,30736,11354,-23018,-23322,13900,29672,-6340,-32148,1594,32728,-1,-32767,1594,32728,-6340,-32148,13900,29672,-23018,-23322,30736,11354,-32229,5918,22487,-23833,-859,32755,-23536,-22799,32372,-5072,-12554,30266,-21764,-24496,30518,-11928,3794,32546,-32737,-1411,3429,-32588,32688,2268,2084,32700,-31362,9493,-19081,-26639,16401,-28367,32766,61,18980,26709,-7659,31859,-27435,17916,-32661,-2636,-26240,-19626,-14674,-29298,-3186,-32612,5616,-32283,11065,-30842,13342,-29928,12666,-30220,8963,-31518,1961,-32709,-8254,-31711,-20259,-25755,-30244,-12611,-32037,6880,-19968,25980,4768,32418,28336,16454,29215,-14838,245,-32767,-30337,-12384,-20355,25678,21487,24738,26530,-19231,-19478,-26350,-24125,22173,26602,19130,10370,-31083,-32671,2512,17762,27535,12892,-30124,-31432,9258,28816,15598,-12441,-30314,-6461,32123,20831,-25293,-28933,15381,32159,-6280,-32767,-185,32580,3490,-32568,-3613,32762,552,-32272,5676,29325,-14619,-21672,24576,7777,-31831,10950,30883,-27896,-17192,31957,-7241,-15002,29131,-15545,-28846,32765,306,-13231,29977,-24536,-21718,26385,-19429,16294,28428,-28699,15813,-18071,-27334,23705,-22622,28212,16666,-5254,32343,-31216,9962,-25176,-20974,981,-32753,24372,-21902,32760,-675,27163,18325,14563,29352,1349,32739,-9082,31483,-15868,28668,-19379,26422,-20162,25829,-18377,27129,-13678,29775,-5496,32302,6219,32171,19772,26129,30563,11813,31466,-9141,16824,-28118,-9904,-31235,-31103,-10313,-24617,21625,9317,31414,32731,1533,9199,-31450,-29853,-13511,-14783,29242,30001,13174,8490,-31648,-32765,-430,10718,30964,23364,-22974,-31726,-8194,12326,30360,14232,-29515,-30384,12269,31695,8312,-22843,-23493,10486,31043,736,-32759,-8846,31550,13566,-29827,-15220,29018,14011,-29621,-9787,31271,2206,-32693,8609,31615,-21021,-25136,30821,11123,-31501,9022,17658,-27602,8134,31741,-30149,-12837,26815,-18831,5010,32381,-32062,-6761,14892,-29188,26312,19526,-21302,24898,-25487,-20594,17243,-27863,30984,10660,-369,32764,-30100,12949,-26092,-19822,1226,-32745,25640,-20403,32629,3001,23790,22532,7896,31801,-7420,31915,-18579,26990,-25254,20878,-28580,16028,-29802,13622,-29594,14066,-27831,17295,-23621,22709,-15653,28786,-3063,32623,13005,30075,27700,17503,32477,-4343,19674,-26203,-8016,-31772,-30945,-10777,-23959,22353,11641,30629,32679,-2391,3916,-32533,-32011,-7001,-6941,32023,32553,3734,-2697,-32656,-30475,12041,22754,23578,10137,-31160,-31567,8786,26745,18930,-5375,-32324,-16508,28305,29541,-14178,-32726,-1656,29487,14288,-23875,-22444,18780,26850,-15760,-28729,15436,28903,-17866,-27469,22576,23747,-28275,-16561,32390,4950,-31064,10428,20450,-25602,-123,32766,-22666,-23664,32711,-1901,-17140,27927,-15975,-28610,32617,-3124,-7181,31970,-29647,-13956,17451,-27733,27300,18121,-16082,28549,-30863,-11009,2451,-32676,31396,-9376,22398,23916,-8373,31679,-30196,12723,-29953,-13287,-13790,-29725,6098,-32195,21394,-24819,29750,-13734,32593,-3369,32493,4221,31631,8549,31289,9728,31815,7837,32650,2757,32292,-5556,28397,-16349,18477,-27061,1716,-32722,-18275,-27198,-31846,-7718,-27026,18528,-1105,32748,27568,17710,27765,-17400,-7061,-31998,-32755,-921,-5737,32260,31929,7359,5857,-32240,-32747,-1166,6700,32074,28023,-16982,-27232,-18224,-1840,32715,27501,-17814,-31600,-8669,17347,27798,2940,-32635,-19577,26276,29103,-15057,-32525,3977,32461,4464,-31326,-9611,30651,11584,-31024,-10545,32135,6400,-32751,1042,30694,-11470,-23278,23061,8727,-31584,11181,30800,-28640,-15921,31253,-9846,-11412,30715,-19871,-26055,32205,-6039,-5979,32217,-29435,-14399,19279,-26495,24938,21254,-20737,25370,-27635,-17608,11296,-30759,32741,1287,11870,30541,-20927,25214,-32641,-2880,-18881,-26781,5131,-32363,24207,-22083,32333,-5314,31140,10195,25096,21067,18172,27266,12779,30172,10020,31197,10253,31121,13454,29877,19180,26566,26166,19723,31756,8075,31786,-7957,21946,-24332,1471,-32734,-22129,-24167,-32719,1778,-16719,28180,16929,28054,32409,-4829,4889,-32401,-30780,-11239,-14344,29460,29379,14508,11756,-30586,-32251,-5798,3551,32574,28874,-15491,-27095,-18427,-614,32761,25942,-20017,-32445,-4586,21855,24413,-4161,-32502,-12099,30451,23191,-23149,-29160,14946,31663,-8432,-32428,4707,32509,-4100,-32088,6640,30428,-12156,-26018,19918,17034,-27992,-2574,32665,-15328,-28961,29902,13398,-30904,10892,11984,-30497,17967,27401,-32705,2023,11526,-30673,25409,20689,-25868,20113,-16614,-28244,28757,-15706,17555,27667,-24455,21809,-27368,-18020,7299,-31944,31902,-7480,23104,23234,-4526,32453,-26887,18730,-32540,-3856,-24042,-22264,-9435,-31380,4646,-32436,15110,-29075,21579,-24658,24858,-21349,25792,-20210,24697,-21534,21208,-24978,14453,-29408,3673,-32561,-10603,-31005,-25018,-21162,-32697,-2146,-25717,20306,-2330,32684,24778,21440,31178,-10079,4403,-32470,-28990,-15274,-22038,24249,20546,25525,26673,-19031,-20065,-25906,-22930,23407,28086,16876,6820,-32050,-31985,7120,22218,24083,6580,-32100,-28459,16241,31873,7598,-20642,-25449,4038,32517,10834,-30924,-21115,25057,26955,-18630,-29699,13844,30607,-11699,-30291,12496,28519,-16135,-24291,21992,16188,-28489,-3308,32599,-13118,-30027,27959,17086,-32353,5192,18679,-26922,9552,31343,-31534,-8905,22308,-24001,14122,29567,-32314,5434,490,-32764,32605,3246,-2819,32645,-32758,797,-7539,-31888,28149,-16772,26458,19329,-4283,32486,-29271,14728,-30052,-13062,-12213,-30406,9669,-31308,25331,-20785,32111,-6521,32182,6159,29046,15164,25563,20498,23450,22886,23450,22886,25563,20498,29046,15164,32182,6159,32111,-6521,25331,-20785,9669,-31308,-12213,-30406,-30052,-13062,-29271,14728,-4283,32486,26458,19329,28149,-16772,-7539,-31888,-32758,797,-2819,32645,32605,3246,490,-32764,-32314,5434,14122,29567,22308,-24001,-31534,-8905,9552,31343,18679,-26922,-32353,5192,27959,17086,-13118,-30027,-3308,32599,16188,-28489,-24291,21992,28519,-16135,-30291,12496,30607,-11699,-29699,13844,26955,-18630,-21115,25057,10834,-30924,4038,32517,-20642,-25449,31873,7598,-28459,16241,6580,-32100,22218,24083,-31985,7120,6820,-32050,28086,16876,-22930,23407,-20065,-25906,26673,-19031,20546,25525,-22038,24249,-28990,-15274,4403,-32470,31178,-10079,24778,21440,-2330,32684,-25717,20306,-32697,-2146,-25018,-21162,-10603,-31005,3673,-32561,14453,-29408,21208,-24978,24697,-21534}, {-4283,-32487,4889,32400,-6941,-32024,10370,31082,-15002,-29132,20450,25601,-26018,-19919,30607,11698,-32751,-1043,30821,-11124,-23536,22798,10718,-30965,5857,32239,-22038,-24250,31902,7479,-29953,13286,14563,-29353,8963,31517,-28580,-16029,31140,-10196,-12213,30405,-16719,-28181,32679,2390,-19478,26349,-13231,-29978,32711,1900,-15328,28960,-21115,-25058,30651,-11585,2206,32692,-32229,-5919,12326,-30361,28023,16981,-20065,25905,-24455,-21810,22398,-23917,24372,21901,-20259,25754,-27831,-17296,12779,-30173,32111,6520,1471,32733,-30945,10776,-20355,-25679,16294,-28429,32617,3123,11984,30496,-20642,25448,-32525,-3978,-15220,-29019,13900,-29673,31695,-8313,27501,17813,6820,32049,-16614,28243,-30863,11008,-31216,-9963,-19968,-25981,-3063,-32624,13454,-29878,25563,-20499,31756,-8076,32477,4342,29215,14837,23705,22621,17451,27732,11526,30672,6580,32099,2940,32634,736,32758,0,32767,736,32758,2940,32634,6580,32099,11526,30672,17451,27732,23705,22621,29215,14837,32477,4342,31756,-8076,25563,-20499,13454,-29878,-3063,-32624,-19968,-25981,-31216,-9963,-30863,11008,-16614,28243,6820,32049,27501,17813,31695,-8313,13900,-29673,-15220,-29019,-32525,-3978,-20642,25448,11984,30496,32617,3123,16294,-28429,-20355,-25679,-30945,10776,1471,32733,32111,6520,12779,-30173,-27831,-17296,-20259,25754,24372,21901,22398,-23917,-24455,-21810,-20065,25905,28023,16981,12326,-30361,-32229,-5919,2206,32692,30651,-11585,-21115,-25058,-15328,28960,32711,1900,-13231,-29978,-19478,26349,32679,2390,-16719,-28181,-12213,30405,31140,-10196,-28580,-16029,8963,31517,14563,-29353,-29953,13286,31902,7479,-22038,-24250,5857,32239,10718,-30965,-23536,22798,30821,-11124,-32751,-1043,30607,11698,-26018,-19919,20450,25601,-15002,-29132,10370,31082,-6941,-32024,4889,32400,-4283,-32487,5131,32362,-7420,-31916,11065,30841,-15868,-28669,21394,24818,-26887,-18731,31178,10078,-32755,920,30001,-13175,-21764,24495,8134,-31742,8727,31583,-24291,-21993,32509,4099,-28275,16560,10950,-30884,12892,30123,-30475,-12042,29379,-14509,-7539,31887,-20927,-25215,32629,-3002,-14674,29297,-18377,-27130,32493,-4222,-9435,31379,-25717,-20307,27568,-17711,9199,31449,-32737,1410,5010,-32382,31253,9845,-13118,30026,-29160,-14947,15436,-28904,29325,14618,-12441,30313,-31567,-8787,3551,-32575,32605,-3247,11296,30758,-26092,19821,-27435,-17917,6219,-32172,31815,-7838,21579,24657,-10603,31004,-31846,7717,-24617,-21626,2084,-32701,26312,-19527,32205,6038,18679,26921,-4161,32501,-23875,22443,-32568,3612,-28933,-15382,-16508,-28306,-614,-32762,14122,-29568,24938,-21255,30984,-10661,32766,-62,31466,9140,28397,16348,24697,21533,21208,24977,18477,27060,16824,28117,16401,28366,17243,27862,19279,26494,22308,24000,25942,20016,29541,14177,32159,6279,32580,-3491,29487,-14289,21855,-24414,9552,-31344,-5979,-32218,-21302,-24899,-31362,-9494,-31103,10312,-18275,27197,3673,32560,24858,21348,32650,-2758,19772,-26130,-7659,-31860,-30100,-12950,-27635,17607,490,32763,28874,15490,26745,-18931,-6461,-32124,-32272,-5677,-15760,28728,23191,23148,27959,-17087,-11412,-30716,-32062,6760,3429,32587,32731,-1534,-1105,-32749,-32697,2145,4646,32435,31631,-8550,-13678,-29776,-26240,19625,25640,20402,11870,-30542,-32758,-798,11756,30585,22754,-23579,-31432,-9259,7777,31830,22576,-23748,-32428,-4708,16188,28488,11181,-30801,-30149,12836,30518,11927,-14783,-29243,-7061,31997,24778,-21441,-32540,3855,29750,13733,-19379,-26423,5616,32282,7896,-31802,-18881,26780,26458,-19330,-30780,11238,32553,-3735,-32671,-2513,31957,7240,-31064,-10429,30428,12155,-30291,-12497,30694,11469,-31501,-9023,32372,5071,-32765,429,31929,-7360,-28990,15273,23104,-23235,-13790,29724,1349,-32740,12666,30219,-25254,-20879,32333,5313,-30052,13061,16929,-28055,3916,32532,-24125,-22174,32765,-307,-22666,23663,-2574,-32666,26955,18629,-31024,10544,8609,-31616,22487,23832,-31726,8193,6700,-32075,26673,19030,-27368,18019,-8373,-31680,32760,674,-8254,31710,-29594,-14067,18172,-27267,25331,20784,-22129,24166,-23959,-22354,21487,-24739,26385,19428,-15975,28609,-30904,-10893,4038,-32518,32461,-4465,14011,29620,-23018,23321,-30384,-12270,-1840,-32716,28086,-16877,28757,15705,2451,32675,-25176,20973,-32037,-6881,-15653,-28787,10253,-31122,29046,-15165,31786,7956,19674,26202,245,32766,-18071,27333,-29647,13955,-32705,-2024,-28459,-16242,-19577,-26277,-8846,-31551,1594,-32729,10486,-31044,17347,-27799,22218,-24084,25409,-20690,27300,-18122,28212,-16667,28336,-16455,27700,-17504,26166,-19724,23450,-22887,19180,-26567,13005,-30076,4768,-32419,-5254,-32344,-16082,-28550,-25868,-20114,-31985,-7121,-31600,8668,-22843,23492,-6340,32147,13566,29826,29103,15056,31873,-7599,17967,-27402,-7181,-31971,-28699,-15814,-30337,12383,-8016,31771,21946,24331,32182,-6160,10020,-31198,-23621,-22710,-30244,12610,981,32752,31396,9375,17555,-27668,-22930,-23408,-27232,18223,14232,29514,30736,-11355,-9787,-31272,-31326,9610,10834,30923,29902,-13399,-17140,-27928,-24536,21717,26530,19230,11641,-30630,-32719,-1779,9669,31307,25096,-21068,-29802,-13623,1961,32708,27163,-18326,-30196,-12724,7299,31943,20546,-25526,-32747,1165,23364,22973,-859,-32756,-21021,25135,32135,-6401,-29699,-13845,17034,27991,-123,-32767,-15545,28845,26602,-19131,-32011,7000,32409,4828,-29271,-14729,24207,22082,-18579,-26991,13342,29927,-9082,-31484,6098,32194,-4526,-32454,4403,32469,-5737,-32261,8490,31647,-12554,-30267,17658,27601,-23278,-23062,28519,16134,-32088,-6641,32390,-4951,-27896,17191,17762,-27536,-2697,32655,-14344,-29461,28149,16771,-32641,2879,23790,-22533,-3186,32611,-20162,-25830,32593,3368,-24042,22263,-2330,-32685,27765,17399,-29853,13510,3794,-32547,26815,18830,-28640,15920,-3308,-32600,31663,8431,-17866,27468,-21672,-24577,28816,-15599,10137,31159,-32251,5797,-2819,-32646,32741,-1288,1226,32744,-32661,2635,-5496,-32303,31289,-9729,15110,29074,-25018,21161,-27026,-18529,9317,-31415,32688,-2269,14892,29187,-19871,26054,-32353,-5193,-12099,-30452,18780,-26851,32762,-553,20831,25292,-5375,32323,-27095,18426,-32314,-5435,-20737,-25371,-369,-32765,18980,-26710,30563,-11814,32292,5555,25792,20209,14453,29407,1716,32721,-9904,31234,-19081,26638,-25487,20593,-29435,14398,-31534,8904,-32445,4585,-32726,1655,-32767,184,-32767,184,-32726,1655,-32445,4585,-31534,8904,-29435,14398,-25487,20593,-19081,26638,-9904,31234,1716,32721,14453,29407,25792,20209,32292,5555,30563,-11814,18980,-26710,-369,-32765,-20737,-25371,-32314,-5435,-27095,18426,-5375,32323,20831,25292,32762,-553,18780,-26851,-12099,-30452,-32353,-5193,-19871,26054,14892,29187,32688,-2269,9317,-31415,-27026,-18529,-25018,21161,15110,29074,31289,-9729,-5496,-32303,-32661,2635,1226,32744,32741,-1288,-2819,-32646,-32251,5797,10137,31159,28816,-15599,-21672,-24577,-17866,27468,31663,8431,-3308,-32600,-28640,15920,26815,18830,3794,-32547,-29853,13510,27765,17399,-2330,-32685,-24042,22263,32593,3368,-20162,-25830,-3186,32611,23790,-22533,-32641,2879,28149,16771,-14344,-29461,-2697,32655,17762,-27536,-27896,17191,32390,-4951,-32088,-6641,28519,16134,-23278,-23062,17658,27601,-12554,-30267,8490,31647,-5737,-32261,4403,32469,-4526,-32454,6098,32194,-9082,-31484,13342,29927,-18579,-26991,24207,22082,-29271,-14729,32409,4828,-32011,7000,26602,-19131,-15545,28845,-123,-32767,17034,27991,-29699,-13845,32135,-6401,-21021,25135,-859,-32756,23364,22973,-32747,1165,20546,-25526,7299,31943,-30196,-12724,27163,-18326,1961,32708,-29802,-13623,25096,-21068,9669,31307,-32719,-1779,11641,-30630,26530,19230,-24536,21717,-17140,-27928,29902,-13399,10834,30923,-31326,9610,-9787,-31272,30736,-11355,14232,29514,-27232,18223,-22930,-23408,17555,-27668,31396,9375,981,32752,-30244,12610,-23621,-22710,10020,-31198,32182,-6160,21946,24331,-8016,31771,-30337,12383,-28699,-15814,-7181,-31971,17967,-27402,31873,-7599,29103,15056,13566,29826,-6340,32147,-22843,23492,-31600,8668,-31985,-7121,-25868,-20114,-16082,-28550,-5254,-32344,4768,-32419,13005,-30076,19180,-26567,23450,-22887,26166,-19724,27700,-17504,28336,-16455,28212,-16667,27300,-18122,25409,-20690,22218,-24084,17347,-27799,10486,-31044,1594,-32729,-8846,-31551,-19577,-26277,-28459,-16242,-32705,-2024,-29647,13955,-18071,27333,245,32766,19674,26202,31786,7956,29046,-15165,10253,-31122,-15653,-28787,-32037,-6881,-25176,20973,2451,32675,28757,15705,28086,-16877,-1840,-32716,-30384,-12270,-23018,23321,14011,29620,32461,-4465,4038,-32518,-30904,-10893,-15975,28609,26385,19428,21487,-24739,-23959,-22354,-22129,24166,25331,20784,18172,-27267,-29594,-14067,-8254,31710,32760,674,-8373,-31680,-27368,18019,26673,19030,6700,-32075,-31726,8193,22487,23832,8609,-31616,-31024,10544,26955,18629,-2574,-32666,-22666,23663,32765,-307,-24125,-22174,3916,32532,16929,-28055,-30052,13061,32333,5313,-25254,-20879,12666,30219,1349,-32740,-13790,29724,23104,-23235,-28990,15273,31929,-7360,-32765,429,32372,5071,-31501,-9023,30694,11469,-30291,-12497,30428,12155,-31064,-10429,31957,7240,-32671,-2513,32553,-3735,-30780,11238,26458,-19330,-18881,26780,7896,-31802,5616,32282,-19379,-26423,29750,13733,-32540,3855,24778,-21441,-7061,31997,-14783,-29243,30518,11927,-30149,12836,11181,-30801,16188,28488,-32428,-4708,22576,-23748,7777,31830,-31432,-9259,22754,-23579,11756,30585,-32758,-798,11870,-30542,25640,20402,-26240,19625,-13678,-29776,31631,-8550,4646,32435,-32697,2145,-1105,-32749,32731,-1534,3429,32587,-32062,6760,-11412,-30716,27959,-17087,23191,23148,-15760,28728,-32272,-5677,-6461,-32124,26745,-18931,28874,15490,490,32763,-27635,17607,-30100,-12950,-7659,-31860,19772,-26130,32650,-2758,24858,21348,3673,32560,-18275,27197,-31103,10312,-31362,-9494,-21302,-24899,-5979,-32218,9552,-31344,21855,-24414,29487,-14289,32580,-3491,32159,6279,29541,14177,25942,20016,22308,24000,19279,26494,17243,27862,16401,28366,16824,28117,18477,27060,21208,24977,24697,21533,28397,16348,31466,9140,32766,-62,30984,-10661,24938,-21255,14122,-29568,-614,-32762,-16508,-28306,-28933,-15382,-32568,3612,-23875,22443,-4161,32501,18679,26921,32205,6038,26312,-19527,2084,-32701,-24617,-21626,-31846,7717,-10603,31004,21579,24657,31815,-7838,6219,-32172,-27435,-17917,-26092,19821,11296,30758,32605,-3247,3551,-32575,-31567,-8787,-12441,30313,29325,14618,15436,-28904,-29160,-14947,-13118,30026,31253,9845,5010,-32382,-32737,1410,9199,31449,27568,-17711,-25717,-20307,-9435,31379,32493,-4222,-18377,-27130,-14674,29297,32629,-3002,-20927,-25215,-7539,31887,29379,-14509,-30475,-12042,12892,30123,10950,-30884,-28275,16560,32509,4099,-24291,-21993,8727,31583,8134,-31742,-21764,24495,30001,-13175,-32755,920,31178,10078,-26887,-18731,21394,24818,-15868,-28669,11065,30841,-7420,-31916,5131,32362}, diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index 7445fca40f..9e328353a4 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/print_stats.c * \brief PHY statstic logging function @@ -55,7 +47,7 @@ extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index); extern openair0_config_t openair0_cfg[]; #endif -int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t mode, int input_level_dBm) +int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length, runmode_t mode, int input_level_dBm) { uint8_t eNB=0; @@ -63,493 +55,493 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t int len=length; int harq_pid,round; - if (phy_vars_ue==NULL) + if (ue==NULL) return 0; if ((mode == normal_txrx) || (mode == no_L2_connect)) { - len += sprintf(&buffer[len], "[UE_PROC] UE %d, RNTI %x\n",phy_vars_ue->Mod_id, phy_vars_ue->lte_ue_pdcch_vars[0]->crnti); + len += sprintf(&buffer[len], "[UE_PROC] UE %d, RNTI %x\n",ue->Mod_id, ue->pdcch_vars[0][0]->crnti); len += sprintf(&buffer[len],"[UE PROC] RSRP[0] %.2f dBm/RE, RSSI %.2f dBm, RSRQ[0] %.2f dB, N0 %d dBm/RE (NF %.1f dB)\n", - 10*log10(phy_vars_ue->PHY_measurements.rsrp[0])-phy_vars_ue->rx_total_gain_dB, - 10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB, - 10*log10(phy_vars_ue->PHY_measurements.rsrq[0]), - phy_vars_ue->PHY_measurements.n0_power_tot_dBm, - (double)phy_vars_ue->PHY_measurements.n0_power_tot_dBm+132.24); + 10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB, + 10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB, + 10*log10(ue->measurements.rsrq[0]), + ue->measurements.n0_power_tot_dBm, + (double)ue->measurements.n0_power_tot_dBm+132.24); /* len += sprintf(&buffer[len], "[UE PROC] Frame count: %d\neNB0 RSSI %d dBm/RE (%d dB, %d dB)\neNB1 RSSI %d dBm/RE (%d dB, %d dB)neNB2 RSSI %d dBm/RE (%d dB, %d dB)\nN0 %d dBm/RE, %f dBm/%dPRB (%d dB, %d dB)\n", - phy_vars_ue->frame_rx, - phy_vars_ue->PHY_measurements.rx_rssi_dBm[0], - phy_vars_ue->PHY_measurements.rx_power_dB[0][0], - phy_vars_ue->PHY_measurements.rx_power_dB[0][1], - phy_vars_ue->PHY_measurements.rx_rssi_dBm[1], - phy_vars_ue->PHY_measurements.rx_power_dB[1][0], - phy_vars_ue->PHY_measurements.rx_power_dB[1][1], - phy_vars_ue->PHY_measurements.rx_rssi_dBm[2], - phy_vars_ue->PHY_measurements.rx_power_dB[2][0], - phy_vars_ue->PHY_measurements.rx_power_dB[2][1], - phy_vars_ue->PHY_measurements.n0_power_tot_dBm, - phy_vars_ue->PHY_measurements.n0_power_tot_dBm+10*log10(12*phy_vars_ue->lte_frame_parms.N_RB_DL), - phy_vars_ue->lte_frame_parms.N_RB_DL, - phy_vars_ue->PHY_measurements.n0_power_dB[0], - phy_vars_ue->PHY_measurements.n0_power_dB[1]); + proc->frame_rx, + ue->measurements.rx_rssi_dBm[0], + ue->measurements.rx_power_dB[0][0], + ue->measurements.rx_power_dB[0][1], + ue->measurements.rx_rssi_dBm[1], + ue->measurements.rx_power_dB[1][0], + ue->measurements.rx_power_dB[1][1], + ue->measurements.rx_rssi_dBm[2], + ue->measurements.rx_power_dB[2][0], + ue->measurements.rx_power_dB[2][1], + ue->measurements.n0_power_tot_dBm, + ue->measurements.n0_power_tot_dBm+10*log10(12*ue->frame_parms.N_RB_DL), + ue->frame_parms.N_RB_DL, + ue->measurements.n0_power_dB[0], + ue->measurements.n0_power_dB[1]); */ #ifdef EXMIMO - len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB (LNA %d, vga %d dB)\n",phy_vars_ue->rx_total_gain_dB, openair0_cfg[0].rxg_mode[0],(int)openair0_cfg[0].rx_gain[0]); + len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB (LNA %d, vga %d dB)\n",ue->rx_total_gain_dB, openair0_cfg[0].rxg_mode[0],(int)openair0_cfg[0].rx_gain[0]); #endif #if defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB); + len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",ue->rx_total_gain_dB); #endif #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz (%d), estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset); + len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz, estimated carrier frequency %f Hz\n",ue->common_vars.freq_offset,openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset); #endif - len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[phy_vars_ue->UE_mode[0]],phy_vars_ue->UE_mode[0]); - len += sprintf(&buffer[len], "[UE PROC] timing_advance = %d\n",phy_vars_ue->timing_advance); - if (phy_vars_ue->UE_mode[0]==PUSCH) { + len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[ue->UE_mode[0]],ue->UE_mode[0]); + len += sprintf(&buffer[len], "[UE PROC] timing_advance = %d\n",ue->timing_advance); + if (ue->UE_mode[0]==PUSCH) { len += sprintf(&buffer[len], "[UE PROC] Po_PUSCH = %d dBm (PL %d dB, Po_NOMINAL_PUSCH %d dBm, PHR %d dB)\n", - phy_vars_ue->ulsch_ue[0]->Po_PUSCH, - get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0), - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH, - phy_vars_ue->ulsch_ue[0]->PHR); + ue->ulsch[0]->Po_PUSCH, + get_PL(ue->Mod_id,ue->CC_id,0), + ue->frame_parms.ul_power_control_config_common.p0_NominalPUSCH, + ue->ulsch[0]->PHR); len += sprintf(&buffer[len], "[UE PROC] Po_PUCCH = %d dBm (Po_NOMINAL_PUCCH %d dBm, g_pucch %d dB)\n", - get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,0)+ - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+ - phy_vars_ue->dlsch_ue[0][0]->g_pucch, - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH, - phy_vars_ue->dlsch_ue[0][0]->g_pucch); + get_PL(ue->Mod_id,ue->CC_id,0)+ + ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+ + ue->dlsch[0][0][0]->g_pucch, + ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, + ue->dlsch[0][0][0]->g_pucch); } //for (eNB=0;eNBPHY_measurements.rx_spatial_power_dB[eNB][0][0], - phy_vars_ue->PHY_measurements.rx_spatial_power_dB[eNB][0][1], - phy_vars_ue->PHY_measurements.rx_spatial_power_dB[eNB][1][0], - phy_vars_ue->PHY_measurements.rx_spatial_power_dB[eNB][1][1]); + ue->measurements.rx_spatial_power_dB[eNB][0][0], + ue->measurements.rx_spatial_power_dB[eNB][0][1], + ue->measurements.rx_spatial_power_dB[eNB][1][0], + ue->measurements.rx_spatial_power_dB[eNB][1][1]); - len += sprintf(&buffer[len], "[UE PROC] RX total power eNB%d: %d dB, avg: %d dB\n",eNB,phy_vars_ue->PHY_measurements.rx_power_tot_dB[eNB],phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB]); - len += sprintf(&buffer[len], "[UE PROC] RX total power lin: %d, avg: %d, RX total noise lin: %d, avg: %d\n",phy_vars_ue->PHY_measurements.rx_power_tot[eNB], - phy_vars_ue->PHY_measurements.rx_power_avg[eNB], phy_vars_ue->PHY_measurements.n0_power_tot, phy_vars_ue->PHY_measurements.n0_power_avg); - len += sprintf(&buffer[len], "[UE PROC] effective SINR %.2f dB\n",phy_vars_ue->sinr_eff); - len += sprintf(&buffer[len], "[UE PROC] Wideband CQI eNB %d: %d dB, avg: %d dB\n",eNB,phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB],phy_vars_ue->PHY_measurements.wideband_cqi_avg[eNB]); + len += sprintf(&buffer[len], "[UE PROC] RX total power eNB%d: %d dB, avg: %d dB\n",eNB,ue->measurements.rx_power_tot_dB[eNB],ue->measurements.rx_power_avg_dB[eNB]); + len += sprintf(&buffer[len], "[UE PROC] RX total power lin: %d, avg: %d, RX total noise lin: %d, avg: %d\n",ue->measurements.rx_power_tot[eNB], + ue->measurements.rx_power_avg[eNB], ue->measurements.n0_power_tot, ue->measurements.n0_power_avg); + len += sprintf(&buffer[len], "[UE PROC] effective SINR %.2f dB\n",ue->sinr_eff); + len += sprintf(&buffer[len], "[UE PROC] Wideband CQI eNB %d: %d dB, avg: %d dB\n",eNB,ue->measurements.wideband_cqi_tot[eNB],ue->measurements.wideband_cqi_avg[eNB]); - switch (phy_vars_ue->lte_frame_parms.N_RB_DL) { + switch (ue->frame_parms.N_RB_DL) { case 6: len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 0): [%d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][5]); + ue->measurements.subband_cqi_dB[eNB][0][0], + ue->measurements.subband_cqi_dB[eNB][0][1], + ue->measurements.subband_cqi_dB[eNB][0][2], + ue->measurements.subband_cqi_dB[eNB][0][3], + ue->measurements.subband_cqi_dB[eNB][0][4], + ue->measurements.subband_cqi_dB[eNB][0][5]); len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 1): [%d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][5]); + ue->measurements.subband_cqi_dB[eNB][1][0], + ue->measurements.subband_cqi_dB[eNB][1][1], + ue->measurements.subband_cqi_dB[eNB][1][2], + ue->measurements.subband_cqi_dB[eNB][1][3], + ue->measurements.subband_cqi_dB[eNB][1][4], + ue->measurements.subband_cqi_dB[eNB][1][5]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 0): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][0]); + ue->measurements.subband_pmi_re[eNB][0][0], + ue->measurements.subband_pmi_im[eNB][0][0], + ue->measurements.subband_pmi_re[eNB][1][0], + ue->measurements.subband_pmi_im[eNB][1][0], + ue->measurements.subband_pmi_re[eNB][2][0], + ue->measurements.subband_pmi_im[eNB][2][0], + ue->measurements.subband_pmi_re[eNB][3][0], + ue->measurements.subband_pmi_im[eNB][3][0], + ue->measurements.subband_pmi_re[eNB][4][0], + ue->measurements.subband_pmi_im[eNB][4][0], + ue->measurements.subband_pmi_re[eNB][5][0], + ue->measurements.subband_pmi_im[eNB][5][0]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 1): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][1]); + ue->measurements.subband_pmi_re[eNB][0][1], + ue->measurements.subband_pmi_im[eNB][0][1], + ue->measurements.subband_pmi_re[eNB][1][1], + ue->measurements.subband_pmi_im[eNB][1][1], + ue->measurements.subband_pmi_re[eNB][2][1], + ue->measurements.subband_pmi_im[eNB][2][1], + ue->measurements.subband_pmi_re[eNB][3][1], + ue->measurements.subband_pmi_im[eNB][3][1], + ue->measurements.subband_pmi_re[eNB][4][1], + ue->measurements.subband_pmi_im[eNB][4][1], + ue->measurements.subband_pmi_re[eNB][5][1], + ue->measurements.subband_pmi_im[eNB][5][1]); len += sprintf(&buffer[len], "[UE PROC] PMI Antenna selection eNB%d : [%d %d %d %d %d %d]\n", eNB, - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][0], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][1], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][2], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][3], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][4], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][5]); + ue->measurements.selected_rx_antennas[eNB][0], + ue->measurements.selected_rx_antennas[eNB][1], + ue->measurements.selected_rx_antennas[eNB][2], + ue->measurements.selected_rx_antennas[eNB][3], + ue->measurements.selected_rx_antennas[eNB][4], + ue->measurements.selected_rx_antennas[eNB][5]); - len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&phy_vars_ue->PHY_measurements,eNB,6))); + len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&ue->measurements,eNB,6))); len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (both): %jx,%jx\n",eNB, - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,0,6)), - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,1,6))); + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,0,6)), + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,1,6))); break; case 25: len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 0): [%d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][6]); + ue->measurements.subband_cqi_dB[eNB][0][0], + ue->measurements.subband_cqi_dB[eNB][0][1], + ue->measurements.subband_cqi_dB[eNB][0][2], + ue->measurements.subband_cqi_dB[eNB][0][3], + ue->measurements.subband_cqi_dB[eNB][0][4], + ue->measurements.subband_cqi_dB[eNB][0][5], + ue->measurements.subband_cqi_dB[eNB][0][6]); len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 1): [%d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][6]); + ue->measurements.subband_cqi_dB[eNB][1][0], + ue->measurements.subband_cqi_dB[eNB][1][1], + ue->measurements.subband_cqi_dB[eNB][1][2], + ue->measurements.subband_cqi_dB[eNB][1][3], + ue->measurements.subband_cqi_dB[eNB][1][4], + ue->measurements.subband_cqi_dB[eNB][1][5], + ue->measurements.subband_cqi_dB[eNB][1][6]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 0): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][0]); + ue->measurements.subband_pmi_re[eNB][0][0], + ue->measurements.subband_pmi_im[eNB][0][0], + ue->measurements.subband_pmi_re[eNB][1][0], + ue->measurements.subband_pmi_im[eNB][1][0], + ue->measurements.subband_pmi_re[eNB][2][0], + ue->measurements.subband_pmi_im[eNB][2][0], + ue->measurements.subband_pmi_re[eNB][3][0], + ue->measurements.subband_pmi_im[eNB][3][0], + ue->measurements.subband_pmi_re[eNB][4][0], + ue->measurements.subband_pmi_im[eNB][4][0], + ue->measurements.subband_pmi_re[eNB][5][0], + ue->measurements.subband_pmi_im[eNB][5][0], + ue->measurements.subband_pmi_re[eNB][6][0], + ue->measurements.subband_pmi_im[eNB][6][0]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 1): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][1]); + ue->measurements.subband_pmi_re[eNB][0][1], + ue->measurements.subband_pmi_im[eNB][0][1], + ue->measurements.subband_pmi_re[eNB][1][1], + ue->measurements.subband_pmi_im[eNB][1][1], + ue->measurements.subband_pmi_re[eNB][2][1], + ue->measurements.subband_pmi_im[eNB][2][1], + ue->measurements.subband_pmi_re[eNB][3][1], + ue->measurements.subband_pmi_im[eNB][3][1], + ue->measurements.subband_pmi_re[eNB][4][1], + ue->measurements.subband_pmi_im[eNB][4][1], + ue->measurements.subband_pmi_re[eNB][5][1], + ue->measurements.subband_pmi_im[eNB][5][1], + ue->measurements.subband_pmi_re[eNB][6][1], + ue->measurements.subband_pmi_im[eNB][6][1]); len += sprintf(&buffer[len], "[UE PROC] PMI Antenna selection eNB%d : [%d %d %d %d %d %d %d]\n", eNB, - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][0], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][1], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][2], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][3], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][4], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][5], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][6]); + ue->measurements.selected_rx_antennas[eNB][0], + ue->measurements.selected_rx_antennas[eNB][1], + ue->measurements.selected_rx_antennas[eNB][2], + ue->measurements.selected_rx_antennas[eNB][3], + ue->measurements.selected_rx_antennas[eNB][4], + ue->measurements.selected_rx_antennas[eNB][5], + ue->measurements.selected_rx_antennas[eNB][6]); - len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&phy_vars_ue->PHY_measurements,eNB,7))); + len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&ue->measurements,eNB,7))); len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (both): %jx,%jx\n",eNB, - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,0,7)), - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,1,7))); + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,0,7)), + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,1,7))); break; case 50: len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 0): [%d %d %d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][6], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][7], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][8]); + ue->measurements.subband_cqi_dB[eNB][0][0], + ue->measurements.subband_cqi_dB[eNB][0][1], + ue->measurements.subband_cqi_dB[eNB][0][2], + ue->measurements.subband_cqi_dB[eNB][0][3], + ue->measurements.subband_cqi_dB[eNB][0][4], + ue->measurements.subband_cqi_dB[eNB][0][5], + ue->measurements.subband_cqi_dB[eNB][0][6], + ue->measurements.subband_cqi_dB[eNB][0][7], + ue->measurements.subband_cqi_dB[eNB][0][8]); len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 1): [%d %d %d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][6], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][7], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][8]); + ue->measurements.subband_cqi_dB[eNB][1][0], + ue->measurements.subband_cqi_dB[eNB][1][1], + ue->measurements.subband_cqi_dB[eNB][1][2], + ue->measurements.subband_cqi_dB[eNB][1][3], + ue->measurements.subband_cqi_dB[eNB][1][4], + ue->measurements.subband_cqi_dB[eNB][1][5], + ue->measurements.subband_cqi_dB[eNB][1][6], + ue->measurements.subband_cqi_dB[eNB][1][7], + ue->measurements.subband_cqi_dB[eNB][1][8]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 0): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][7][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][7][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][8][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][8][0]); + ue->measurements.subband_pmi_re[eNB][0][0], + ue->measurements.subband_pmi_im[eNB][0][0], + ue->measurements.subband_pmi_re[eNB][1][0], + ue->measurements.subband_pmi_im[eNB][1][0], + ue->measurements.subband_pmi_re[eNB][2][0], + ue->measurements.subband_pmi_im[eNB][2][0], + ue->measurements.subband_pmi_re[eNB][3][0], + ue->measurements.subband_pmi_im[eNB][3][0], + ue->measurements.subband_pmi_re[eNB][4][0], + ue->measurements.subband_pmi_im[eNB][4][0], + ue->measurements.subband_pmi_re[eNB][5][0], + ue->measurements.subband_pmi_im[eNB][5][0], + ue->measurements.subband_pmi_re[eNB][6][0], + ue->measurements.subband_pmi_im[eNB][6][0], + ue->measurements.subband_pmi_re[eNB][7][0], + ue->measurements.subband_pmi_im[eNB][7][0], + ue->measurements.subband_pmi_re[eNB][8][0], + ue->measurements.subband_pmi_im[eNB][8][0]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 1): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][7][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][7][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][8][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][8][1]); + ue->measurements.subband_pmi_re[eNB][0][1], + ue->measurements.subband_pmi_im[eNB][0][1], + ue->measurements.subband_pmi_re[eNB][1][1], + ue->measurements.subband_pmi_im[eNB][1][1], + ue->measurements.subband_pmi_re[eNB][2][1], + ue->measurements.subband_pmi_im[eNB][2][1], + ue->measurements.subband_pmi_re[eNB][3][1], + ue->measurements.subband_pmi_im[eNB][3][1], + ue->measurements.subband_pmi_re[eNB][4][1], + ue->measurements.subband_pmi_im[eNB][4][1], + ue->measurements.subband_pmi_re[eNB][5][1], + ue->measurements.subband_pmi_im[eNB][5][1], + ue->measurements.subband_pmi_re[eNB][6][1], + ue->measurements.subband_pmi_im[eNB][6][1], + ue->measurements.subband_pmi_re[eNB][7][1], + ue->measurements.subband_pmi_im[eNB][7][1], + ue->measurements.subband_pmi_re[eNB][8][1], + ue->measurements.subband_pmi_im[eNB][8][1]); len += sprintf(&buffer[len], "[UE PROC] PMI Antenna selection eNB%d : [%d %d %d %d %d %d %d %d %d]\n", eNB, - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][0], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][1], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][2], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][3], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][4], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][5], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][6], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][7], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][8]); + ue->measurements.selected_rx_antennas[eNB][0], + ue->measurements.selected_rx_antennas[eNB][1], + ue->measurements.selected_rx_antennas[eNB][2], + ue->measurements.selected_rx_antennas[eNB][3], + ue->measurements.selected_rx_antennas[eNB][4], + ue->measurements.selected_rx_antennas[eNB][5], + ue->measurements.selected_rx_antennas[eNB][6], + ue->measurements.selected_rx_antennas[eNB][7], + ue->measurements.selected_rx_antennas[eNB][8]); - len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&phy_vars_ue->PHY_measurements,eNB,9))); + len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&ue->measurements,eNB,9))); len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (both): %jx,%jx\n",eNB, - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,0,9)), - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,1,9))); + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,0,9)), + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,1,9))); break; case 100: len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 0): [%d %d %d %d %d %d %d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][6], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][7], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][8], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][9], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][10], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][11], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][0][12]); + ue->measurements.subband_cqi_dB[eNB][0][0], + ue->measurements.subband_cqi_dB[eNB][0][1], + ue->measurements.subband_cqi_dB[eNB][0][2], + ue->measurements.subband_cqi_dB[eNB][0][3], + ue->measurements.subband_cqi_dB[eNB][0][4], + ue->measurements.subband_cqi_dB[eNB][0][5], + ue->measurements.subband_cqi_dB[eNB][0][6], + ue->measurements.subband_cqi_dB[eNB][0][7], + ue->measurements.subband_cqi_dB[eNB][0][8], + ue->measurements.subband_cqi_dB[eNB][0][9], + ue->measurements.subband_cqi_dB[eNB][0][10], + ue->measurements.subband_cqi_dB[eNB][0][11], + ue->measurements.subband_cqi_dB[eNB][0][12]); len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 1): [%d %d %d %d %d %d %d %d %d %d %d %d %d] dB\n", eNB, - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][2], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][3], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][4], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][5], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][6], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][7], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][8], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][9], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][10], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][11], - phy_vars_ue->PHY_measurements.subband_cqi_dB[eNB][1][12]); + ue->measurements.subband_cqi_dB[eNB][1][0], + ue->measurements.subband_cqi_dB[eNB][1][1], + ue->measurements.subband_cqi_dB[eNB][1][2], + ue->measurements.subband_cqi_dB[eNB][1][3], + ue->measurements.subband_cqi_dB[eNB][1][4], + ue->measurements.subband_cqi_dB[eNB][1][5], + ue->measurements.subband_cqi_dB[eNB][1][6], + ue->measurements.subband_cqi_dB[eNB][1][7], + ue->measurements.subband_cqi_dB[eNB][1][8], + ue->measurements.subband_cqi_dB[eNB][1][9], + ue->measurements.subband_cqi_dB[eNB][1][10], + ue->measurements.subband_cqi_dB[eNB][1][11], + ue->measurements.subband_cqi_dB[eNB][1][12]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 0): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][7][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][7][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][8][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][8][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][9][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][9][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][10][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][10][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][11][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][11][0], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][12][0], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][12][0]); + ue->measurements.subband_pmi_re[eNB][0][0], + ue->measurements.subband_pmi_im[eNB][0][0], + ue->measurements.subband_pmi_re[eNB][1][0], + ue->measurements.subband_pmi_im[eNB][1][0], + ue->measurements.subband_pmi_re[eNB][2][0], + ue->measurements.subband_pmi_im[eNB][2][0], + ue->measurements.subband_pmi_re[eNB][3][0], + ue->measurements.subband_pmi_im[eNB][3][0], + ue->measurements.subband_pmi_re[eNB][4][0], + ue->measurements.subband_pmi_im[eNB][4][0], + ue->measurements.subband_pmi_re[eNB][5][0], + ue->measurements.subband_pmi_im[eNB][5][0], + ue->measurements.subband_pmi_re[eNB][6][0], + ue->measurements.subband_pmi_im[eNB][6][0], + ue->measurements.subband_pmi_re[eNB][7][0], + ue->measurements.subband_pmi_im[eNB][7][0], + ue->measurements.subband_pmi_re[eNB][8][0], + ue->measurements.subband_pmi_im[eNB][8][0], + ue->measurements.subband_pmi_re[eNB][9][0], + ue->measurements.subband_pmi_im[eNB][9][0], + ue->measurements.subband_pmi_re[eNB][10][0], + ue->measurements.subband_pmi_im[eNB][10][0], + ue->measurements.subband_pmi_re[eNB][11][0], + ue->measurements.subband_pmi_im[eNB][11][0], + ue->measurements.subband_pmi_re[eNB][12][0], + ue->measurements.subband_pmi_im[eNB][12][0]); len += sprintf(&buffer[len], "[UE PROC] Subband PMI eNB%d (Ant 1): [(%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d) (%d %d)]\n", eNB, - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][0][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][1][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][2][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][3][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][4][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][5][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][6][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][6][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][7][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][7][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][8][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][8][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][9][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][9][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][10][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][10][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][11][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][11][1], - phy_vars_ue->PHY_measurements.subband_pmi_re[eNB][12][1], - phy_vars_ue->PHY_measurements.subband_pmi_im[eNB][12][1]); + ue->measurements.subband_pmi_re[eNB][0][1], + ue->measurements.subband_pmi_im[eNB][0][1], + ue->measurements.subband_pmi_re[eNB][1][1], + ue->measurements.subband_pmi_im[eNB][1][1], + ue->measurements.subband_pmi_re[eNB][2][1], + ue->measurements.subband_pmi_im[eNB][2][1], + ue->measurements.subband_pmi_re[eNB][3][1], + ue->measurements.subband_pmi_im[eNB][3][1], + ue->measurements.subband_pmi_re[eNB][4][1], + ue->measurements.subband_pmi_im[eNB][4][1], + ue->measurements.subband_pmi_re[eNB][5][1], + ue->measurements.subband_pmi_im[eNB][5][1], + ue->measurements.subband_pmi_re[eNB][6][1], + ue->measurements.subband_pmi_im[eNB][6][1], + ue->measurements.subband_pmi_re[eNB][7][1], + ue->measurements.subband_pmi_im[eNB][7][1], + ue->measurements.subband_pmi_re[eNB][8][1], + ue->measurements.subband_pmi_im[eNB][8][1], + ue->measurements.subband_pmi_re[eNB][9][1], + ue->measurements.subband_pmi_im[eNB][9][1], + ue->measurements.subband_pmi_re[eNB][10][1], + ue->measurements.subband_pmi_im[eNB][10][1], + ue->measurements.subband_pmi_re[eNB][11][1], + ue->measurements.subband_pmi_im[eNB][11][1], + ue->measurements.subband_pmi_re[eNB][12][1], + ue->measurements.subband_pmi_im[eNB][12][1]); len += sprintf(&buffer[len], "[UE PROC] PMI Antenna selection eNB%d : [%d %d %d %d %d %d %d %d %d %d %d %d %d]\n", eNB, - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][0], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][1], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][2], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][3], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][4], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][5], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][6], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][7], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][8], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][9], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][10], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][11], - phy_vars_ue->PHY_measurements.selected_rx_antennas[eNB][12]); + ue->measurements.selected_rx_antennas[eNB][0], + ue->measurements.selected_rx_antennas[eNB][1], + ue->measurements.selected_rx_antennas[eNB][2], + ue->measurements.selected_rx_antennas[eNB][3], + ue->measurements.selected_rx_antennas[eNB][4], + ue->measurements.selected_rx_antennas[eNB][5], + ue->measurements.selected_rx_antennas[eNB][6], + ue->measurements.selected_rx_antennas[eNB][7], + ue->measurements.selected_rx_antennas[eNB][8], + ue->measurements.selected_rx_antennas[eNB][9], + ue->measurements.selected_rx_antennas[eNB][10], + ue->measurements.selected_rx_antennas[eNB][11], + ue->measurements.selected_rx_antennas[eNB][12]); - len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&phy_vars_ue->PHY_measurements,eNB,13))); + len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (max): %jx\n",eNB,pmi2hex_2Ar1(quantize_subband_pmi(&ue->measurements,eNB,13))); len += sprintf(&buffer[len], "[UE PROC] Quantized PMI eNB %d (both): %jx,%jx\n",eNB, - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,0,13)), - pmi2hex_2Ar1(quantize_subband_pmi2(&phy_vars_ue->PHY_measurements,eNB,1,13))); + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,0,13)), + pmi2hex_2Ar1(quantize_subband_pmi2(&ue->measurements,eNB,1,13))); break; } #ifdef OPENAIR2 - RRC_status = mac_UE_get_rrc_status(phy_vars_ue->Mod_id, 0); + RRC_status = mac_UE_get_rrc_status(ue->Mod_id, 0); len += sprintf(&buffer[len],"[UE PROC] RRC status = %d\n",RRC_status); #endif - len += sprintf(&buffer[len], "[UE PROC] Transmission Mode %d (mode1_flag %d)\n",phy_vars_ue->transmission_mode[eNB],phy_vars_ue->lte_frame_parms.mode1_flag); + len += sprintf(&buffer[len], "[UE PROC] Transmission Mode %d \n",ue->transmission_mode[eNB]); len += sprintf(&buffer[len], "[UE PROC] PBCH err conseq %d, PBCH error total %d, PBCH FER %d\n", - phy_vars_ue->lte_ue_pbch_vars[eNB]->pdu_errors_conseq, - phy_vars_ue->lte_ue_pbch_vars[eNB]->pdu_errors, - phy_vars_ue->lte_ue_pbch_vars[eNB]->pdu_fer); + ue->pbch_vars[eNB]->pdu_errors_conseq, + ue->pbch_vars[eNB]->pdu_errors, + ue->pbch_vars[eNB]->pdu_fer); - if (phy_vars_ue->transmission_mode[eNB] == 6) - len += sprintf(&buffer[len], "[UE PROC] Mode 6 Wideband CQI eNB %d : %d dB\n",eNB,phy_vars_ue->PHY_measurements.precoded_cqi_dB[eNB][0]); + if (ue->transmission_mode[eNB] == 6) + len += sprintf(&buffer[len], "[UE PROC] Mode 6 Wideband CQI eNB %d : %d dB\n",eNB,ue->measurements.precoded_cqi_dB[eNB][0]); for (harq_pid=0;harq_pid<8;harq_pid++) { - len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 0 harq_pid %d, mcs %d:",eNB,harq_pid,phy_vars_ue->dlsch_ue[0][0]->harq_processes[harq_pid]->mcs); + len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 0 harq_pid %d, mcs %d:",eNB,harq_pid,ue->dlsch[0][0][0]->harq_processes[harq_pid]->mcs); for (round=0;round<8;round++) len+=sprintf(&buffer[len],"%d/%d ", - phy_vars_ue->dlsch_ue[0][0]->harq_processes[harq_pid]->errors[round], - phy_vars_ue->dlsch_ue[0][0]->harq_processes[harq_pid]->trials[round]); + ue->dlsch[0][0][0]->harq_processes[harq_pid]->errors[round], + ue->dlsch[0][0][0]->harq_processes[harq_pid]->trials[round]); len+=sprintf(&buffer[len],"\n"); } - if (phy_vars_ue->dlsch_ue[0] && phy_vars_ue->dlsch_ue[0][0] && phy_vars_ue->dlsch_ue[0][1]) { - len += sprintf(&buffer[len], "[UE PROC] Saved PMI for DLSCH eNB %d : %jx (%p)\n",eNB,pmi2hex_2Ar1(phy_vars_ue->dlsch_ue[0][0]->pmi_alloc),phy_vars_ue->dlsch_ue[0][0]); + if (ue->dlsch[0][0] && ue->dlsch[0][0][0] && ue->dlsch[0][0][1]) { + len += sprintf(&buffer[len], "[UE PROC] Saved PMI for DLSCH eNB %d : %jx (%p)\n",eNB,pmi2hex_2Ar1(ue->dlsch[0][0][0]->pmi_alloc),ue->dlsch[0][0][0]); - len += sprintf(&buffer[len], "[UE PROC] eNB %d: dl_power_off = %d\n",eNB,phy_vars_ue->dlsch_ue[0][0]->harq_processes[0]->dl_power_off); + len += sprintf(&buffer[len], "[UE PROC] eNB %d: dl_power_off = %d\n",eNB,ue->dlsch[0][0][0]->harq_processes[0]->dl_power_off); for (harq_pid=0;harq_pid<8;harq_pid++) { - len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 1 harq_pid %d, mcs %d:",eNB,harq_pid,phy_vars_ue->dlsch_ue[0][1]->harq_processes[0]->mcs); + len+=sprintf(&buffer[len],"[UE PROC] eNB %d: CW 1 harq_pid %d, mcs %d:",eNB,harq_pid,ue->dlsch[0][0][1]->harq_processes[0]->mcs); for (round=0;round<8;round++) len+=sprintf(&buffer[len],"%d/%d ", - phy_vars_ue->dlsch_ue[0][1]->harq_processes[harq_pid]->errors[round], - phy_vars_ue->dlsch_ue[0][1]->harq_processes[harq_pid]->trials[round]); + ue->dlsch[0][0][1]->harq_processes[harq_pid]->errors[round], + ue->dlsch[0][0][1]->harq_processes[harq_pid]->trials[round]); len+=sprintf(&buffer[len],"\n"); } } - len += sprintf(&buffer[len], "[UE PROC] DLSCH Total %d, Error %d, FER %d\n",phy_vars_ue->dlsch_received[0],phy_vars_ue->dlsch_errors[0],phy_vars_ue->dlsch_fer[0]); - len += sprintf(&buffer[len], "[UE PROC] DLSCH (SI) Total %d, Error %d\n",phy_vars_ue->dlsch_SI_received[0],phy_vars_ue->dlsch_SI_errors[0]); - len += sprintf(&buffer[len], "[UE PROC] DLSCH (RA) Total %d, Error %d\n",phy_vars_ue->dlsch_ra_received[0],phy_vars_ue->dlsch_ra_errors[0]); -#ifdef Rel10 + len += sprintf(&buffer[len], "[UE PROC] DLSCH Total %d, Error %d, FER %d\n",ue->dlsch_received[0],ue->dlsch_errors[0],ue->dlsch_fer[0]); + len += sprintf(&buffer[len], "[UE PROC] DLSCH (SI) Total %d, Error %d\n",ue->dlsch_SI_received[0],ue->dlsch_SI_errors[0]); + len += sprintf(&buffer[len], "[UE PROC] DLSCH (RA) Total %d, Error %d\n",ue->dlsch_ra_received[0],ue->dlsch_ra_errors[0]); +#if defined(Rel10) || defined(Rel14) int i=0; - //len += sprintf(&buffer[len], "[UE PROC] MCH Total %d\n", phy_vars_ue->dlsch_mch_received[0]); - for(i=0; i lte_frame_parms.num_MBSFN_config; i++ ) { + //len += sprintf(&buffer[len], "[UE PROC] MCH Total %d\n", ue->dlsch_mch_received[0]); + for(i=0; i frame_parms.num_MBSFN_config; i++ ) { len += sprintf(&buffer[len], "[UE PROC] MCH (MCCH MBSFN %d) Total %d, Error %d, Trials %d\n", - i, phy_vars_ue->dlsch_mcch_received[i][0],phy_vars_ue->dlsch_mcch_errors[i][0],phy_vars_ue->dlsch_mcch_trials[i][0]); + i, ue->dlsch_mcch_received[i][0],ue->dlsch_mcch_errors[i][0],ue->dlsch_mcch_trials[i][0]); len += sprintf(&buffer[len], "[UE PROC] MCH (MTCH MBSFN %d) Total %d, Error %d, Trials %d\n", - i, phy_vars_ue->dlsch_mtch_received[i][0],phy_vars_ue->dlsch_mtch_errors[i][0],phy_vars_ue->dlsch_mtch_trials[i][0]); + i, ue->dlsch_mtch_received[i][0],ue->dlsch_mtch_errors[i][0],ue->dlsch_mtch_trials[i][0]); } #endif - len += sprintf(&buffer[len], "[UE PROC] DLSCH Bitrate %dkbps\n",(phy_vars_ue->bitrate[0]/1000)); - len += sprintf(&buffer[len], "[UE PROC] Total Received Bits %dkbits\n",(phy_vars_ue->total_received_bits[0]/1000)); - len += sprintf(&buffer[len], "[UE PROC] IA receiver %d\n",openair_daq_vars.use_ia_receiver); + len += sprintf(&buffer[len], "[UE PROC] DLSCH Bitrate %dkbps\n",(ue->bitrate[0]/1000)); + len += sprintf(&buffer[len], "[UE PROC] Total Received Bits %dkbits\n",(ue->total_received_bits[0]/1000)); + len += sprintf(&buffer[len], "[UE PROC] IA receiver %d\n",ue->use_ia_receiver); } } else { len += sprintf(&buffer[len], "[UE PROC] Frame count: %d, RSSI %3.2f dB (%d dB, %d dB), N0 %3.2f dB (%d dB, %d dB)\n", - phy_vars_ue->frame_rx, - 10*log10(phy_vars_ue->PHY_measurements.rssi), - phy_vars_ue->PHY_measurements.rx_power_dB[0][0], - phy_vars_ue->PHY_measurements.rx_power_dB[0][1], - 10*log10(phy_vars_ue->PHY_measurements.n0_power_tot), - phy_vars_ue->PHY_measurements.n0_power_dB[0], - phy_vars_ue->PHY_measurements.n0_power_dB[1]); + proc->frame_rx, + 10*log10(ue->measurements.rssi), + ue->measurements.rx_power_dB[0][0], + ue->measurements.rx_power_dB[0][1], + 10*log10(ue->measurements.n0_power_tot), + ue->measurements.n0_power_dB[0], + ue->measurements.n0_power_dB[1]); #ifdef EXMIMO - phy_vars_ue->rx_total_gain_dB = ((int)(10*log10(phy_vars_ue->PHY_measurements.rssi)))-input_level_dBm; + ue->rx_total_gain_dB = ((int)(10*log10(ue->measurements.rssi)))-input_level_dBm; len += sprintf(&buffer[len], "[UE PROC] rxg_mode %d, input level (set by user) %d dBm, VGA gain %d dB ==> total gain %3.2f dB, noise figure %3.2f dB\n", openair0_cfg[0].rxg_mode[0], input_level_dBm, (int)openair0_cfg[0].rx_gain[0], - 10*log10(phy_vars_ue->PHY_measurements.rssi)-input_level_dBm, - 10*log10(phy_vars_ue->PHY_measurements.n0_power_tot)-phy_vars_ue->rx_total_gain_dB+105); + 10*log10(ue->measurements.rssi)-input_level_dBm, + 10*log10(ue->measurements.n0_power_tot)-ue->rx_total_gain_dB+105); #endif } @@ -558,138 +550,127 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t return len; } // is_clusterhead - -int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) +/* +int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) { unsigned int success=0; - uint8_t eNB,UE_id,i,j,number_of_cards_l=1; + uint8_t eNB_id,UE_id,i,j,number_of_cards_l=1; uint32_t ulsch_errors=0,dlsch_errors=0; uint32_t ulsch_round_attempts[4]= {0,0,0,0},ulsch_round_errors[4]= {0,0,0,0}; uint32_t dlsch_round_attempts[4]= {0,0,0,0},dlsch_round_errors[4]= {0,0,0,0}; uint32_t UE_id_mac, RRC_status; - - if (phy_vars_eNB==NULL) + eNB_rxtx_proc_t *proc = &eNB->proc.proc_rxtx[0]; + if (eNB==NULL) return 0; int len = length; - // if(phy_vars_eNB->frame==0){ - phy_vars_eNB->total_dlsch_bitrate = 0;//phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_bitrate + phy_vars_eNB->total_dlsch_bitrate; - phy_vars_eNB->total_transmitted_bits = 0;// phy_vars_eNB->eNB_UE_stats[UE_id].total_transmitted_bits + phy_vars_eNB->total_transmitted_bits; - phy_vars_eNB->total_system_throughput = 0;//phy_vars_eNB->eNB_UE_stats[UE_id].total_transmitted_bits + phy_vars_eNB->total_system_throughput; + // if(eNB->frame==0){ + eNB->total_dlsch_bitrate = 0;//eNB->UE_stats[UE_id].dlsch_bitrate + eNB->total_dlsch_bitrate; + eNB->total_transmitted_bits = 0;// eNB->UE_stats[UE_id].total_transmitted_bits + eNB->total_transmitted_bits; + eNB->total_system_throughput = 0;//eNB->UE_stats[UE_id].total_transmitted_bits + eNB->total_system_throughput; // } - for (eNB=0; eNBproc[0].frame_tx, - phy_vars_eNB->rx_total_gain_eNB_dB, - phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_tot_dBm, - phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB[eNB].n0_power_dB[1]); + eNB_id,number_of_cards_l, + proc->frame_tx, + eNB->rx_total_gain_dB, + eNB->measurements.n0_power_tot_dBm, + eNB->measurements.n0_power_dB[0], + eNB->measurements.n0_power_dB[1]); len += sprintf(&buffer[len],"PRB I0 (%X.%X.%X.%X): ", - phy_vars_eNB->rb_mask_ul[0], - phy_vars_eNB->rb_mask_ul[1],phy_vars_eNB->rb_mask_ul[2],phy_vars_eNB->rb_mask_ul[3]); + eNB->rb_mask_ul[0], + eNB->rb_mask_ul[1],eNB->rb_mask_ul[2],eNB->rb_mask_ul[3]); - for (i=0; ilte_frame_parms.N_RB_UL; i++) { + for (i=0; iframe_parms.N_RB_UL; i++) { len += sprintf(&buffer[len],"%4d ", - phy_vars_eNB->PHY_measurements_eNB[eNB].n0_subband_power_tot_dBm[i]); + eNB->measurements.n0_subband_power_tot_dBm[i]); if ((i>0) && ((i%25) == 0)) len += sprintf(&buffer[len],"\n"); } len += sprintf(&buffer[len],"\n"); len += sprintf(&buffer[len],"\nPERFORMANCE PARAMETERS\n"); - /* - len += sprintf(&buffer[len],"[eNB PROC] Total DLSCH Bitrate for the System %dkbps\n",((phy_vars_eNB->eNB_UE_stats[0].dlsch_bitrate + phy_vars_eNB->eNB_UE_stats[1].dlsch_bitrate)/1000)); - len += sprintf(&buffer[len],"[eNB PROC] Total Bits successfully transitted %dKbits in %dframe(s)\n",((phy_vars_eNB->eNB_UE_stats[0].total_transmitted_bits + phy_vars_eNB->eNB_UE_stats[1].total_transmitted_bits)/1000),phy_vars_eNB->frame+1); - len += sprintf(&buffer[len],"[eNB PROC] Average System Throughput %dKbps\n",(phy_vars_eNB->eNB_UE_stats[0].total_transmitted_bits + phy_vars_eNB->eNB_UE_stats[1].total_transmitted_bits)/((phy_vars_eNB->frame+1)*10)); - */ for (UE_id=0; UE_iddlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& - (phy_vars_eNB->eNB_UE_stats[UE_id].mode == PUSCH)) { + if (eNB && + (eNB->dlsch!=NULL) && + (eNB->dlsch[(uint8_t)UE_id]!=NULL) && + (eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&& + (eNB->UE_stats[UE_id].mode == PUSCH)) { - phy_vars_eNB->total_dlsch_bitrate = phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_bitrate + phy_vars_eNB->total_dlsch_bitrate; - phy_vars_eNB->total_transmitted_bits = phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS + phy_vars_eNB->total_transmitted_bits; + eNB->total_dlsch_bitrate = eNB->UE_stats[UE_id].dlsch_bitrate + eNB->total_dlsch_bitrate; + eNB->total_transmitted_bits = eNB->UE_stats[UE_id].total_TBS + eNB->total_transmitted_bits; - //phy_vars_eNB->total_system_throughput = phy_vars_eNB->eNB_UE_stats[UE_id].total_transmitted_bits + phy_vars_eNB->total_system_throughput; + //eNB->total_system_throughput = eNB->UE_stats[UE_id].total_transmitted_bits + eNB->total_system_throughput; for (i=0; i<8; i++) - success = success + (phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][0] - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_l2_errors[i]); + success = success + (eNB->UE_stats[UE_id].dlsch_trials[i][0] - eNB->UE_stats[UE_id].dlsch_l2_errors[i]); - len += sprintf(&buffer[len],"Total DLSCH %d kbits / %d frames ",(phy_vars_eNB->total_transmitted_bits/1000),phy_vars_eNB->proc[0].frame_tx+1); - len += sprintf(&buffer[len],"Total DLSCH throughput %d kbps ",(phy_vars_eNB->total_dlsch_bitrate/1000)); - len += sprintf(&buffer[len],"Total DLSCH trans %d / %d frames\n",success,phy_vars_eNB->proc[0].frame_tx+1); - //len += sprintf(&buffer[len],"[eNB PROC] FULL MU-MIMO Transmissions/Total Transmissions = %d/%d\n",phy_vars_eNB->FULL_MUMIMO_transmissions,phy_vars_eNB->check_for_total_transmissions); - //len += sprintf(&buffer[len],"[eNB PROC] MU-MIMO Transmissions/Total Transmissions = %d/%d\n",phy_vars_eNB->check_for_MUMIMO_transmissions,phy_vars_eNB->check_for_total_transmissions); - //len += sprintf(&buffer[len],"[eNB PROC] SU-MIMO Transmissions/Total Transmissions = %d/%d\n",phy_vars_eNB->check_for_SUMIMO_transmissions,phy_vars_eNB->check_for_total_transmissions); + len += sprintf(&buffer[len],"Total DLSCH %d kbits / %d frames ",(eNB->total_transmitted_bits/1000),proc->frame_tx+1); + len += sprintf(&buffer[len],"Total DLSCH throughput %d kbps ",(eNB->total_dlsch_bitrate/1000)); + len += sprintf(&buffer[len],"Total DLSCH trans %d / %d frames\n",success,proc->frame_tx+1); + //len += sprintf(&buffer[len],"[eNB PROC] FULL MU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->FULL_MUMIMO_transmissions,eNB->check_for_total_transmissions); + //len += sprintf(&buffer[len],"[eNB PROC] MU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->check_for_MUMIMO_transmissions,eNB->check_for_total_transmissions); + //len += sprintf(&buffer[len],"[eNB PROC] SU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->check_for_SUMIMO_transmissions,eNB->check_for_total_transmissions); len += sprintf(&buffer[len],"UE %d (%x) Power: (%d,%d) dB, Po_PUSCH: (%d,%d) dBm, Po_PUCCH (%d/%d) dBm, Po_PUCCH1 (%d,%d) dBm, PUCCH1 Thres %d dBm \n", UE_id, - phy_vars_eNB->eNB_UE_stats[UE_id].crnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[UE_id]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[UE_id]->ulsch_power[1]), - phy_vars_eNB->eNB_UE_stats[UE_id].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[UE_id].UL_rssi[1], - dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB, - phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH, - dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB, - dB_fixed(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above/phy_vars_eNB->lte_frame_parms.N_RB_UL)-phy_vars_eNB->rx_total_gain_eNB_dB, - PUCCH1_THRES+phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm-dB_fixed(phy_vars_eNB->lte_frame_parms.N_RB_UL)); + eNB->UE_stats[UE_id].crnti, + dB_fixed(eNB->pusch_vars[UE_id]->ulsch_power[0]), + dB_fixed(eNB->pusch_vars[UE_id]->ulsch_power[1]), + eNB->UE_stats[UE_id].UL_rssi[0], + eNB->UE_stats[UE_id].UL_rssi[1], + dB_fixed(eNB->UE_stats[UE_id].Po_PUCCH/eNB->frame_parms.N_RB_UL)-eNB->rx_total_gain_dB, + eNB->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, + dB_fixed(eNB->UE_stats[UE_id].Po_PUCCH1_below/eNB->frame_parms.N_RB_UL)-eNB->rx_total_gain_dB, + dB_fixed(eNB->UE_stats[UE_id].Po_PUCCH1_above/eNB->frame_parms.N_RB_UL)-eNB->rx_total_gain_dB, + PUCCH1_THRES+eNB->measurements.n0_power_tot_dBm-dB_fixed(eNB->frame_parms.N_RB_UL)); len+= sprintf(&buffer[len],"DL mcs %d, UL mcs %d, UL rb %d, delta_TF %d, ", - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[0]->mcs, - phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[0]->mcs, - phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[0]->nb_rb, - phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[0]->delta_TF); + eNB->dlsch[(uint8_t)UE_id][0]->harq_processes[0]->mcs, + eNB->ulsch[(uint8_t)UE_id]->harq_processes[0]->mcs, + eNB->ulsch[(uint8_t)UE_id]->harq_processes[0]->nb_rb, + eNB->ulsch[(uint8_t)UE_id]->harq_processes[0]->delta_TF); len += sprintf(&buffer[len],"Wideband CQI: (%d,%d) dB\n", - phy_vars_eNB->PHY_measurements_eNB[eNB].wideband_cqi_dB[UE_id][0], - phy_vars_eNB->PHY_measurements_eNB[eNB].wideband_cqi_dB[UE_id][1]); + eNB->measurements.wideband_cqi_dB[UE_id][0], + eNB->measurements.wideband_cqi_dB[UE_id][1]); - /* len += sprintf(&buffer[len],"[eNB PROC] Subband CQI: "); - - for (i=0; ilte_frame_parms.N_RB_DL; i++) - len += sprintf(&buffer[len],"%2d ", - phy_vars_eNB->PHY_measurements_eNB[eNB].subband_cqi_tot_dB[UE_id][i]); - - len += sprintf(&buffer[len],"\n"); - */ - len += sprintf(&buffer[len],"DL TM %d, DL_cqi %d, DL_pmi_single %jx ", - phy_vars_eNB->transmission_mode[UE_id], - phy_vars_eNB->eNB_UE_stats[UE_id].DL_cqi[0], - pmi2hex_2Ar1(phy_vars_eNB->eNB_UE_stats[UE_id].DL_pmi_single)); + eNB->transmission_mode[UE_id], + eNB->UE_stats[UE_id].DL_cqi[0], + pmi2hex_2Ar1(eNB->UE_stats[UE_id].DL_pmi_single)); len += sprintf(&buffer[len],"Timing advance %d samples (%d 16Ts), update %d ", - phy_vars_eNB->eNB_UE_stats[UE_id].UE_timing_offset, - phy_vars_eNB->eNB_UE_stats[UE_id].UE_timing_offset>>2, - phy_vars_eNB->eNB_UE_stats[UE_id].timing_advance_update); + eNB->UE_stats[UE_id].UE_timing_offset, + eNB->UE_stats[UE_id].UE_timing_offset>>2, + eNB->UE_stats[UE_id].timing_advance_update); len += sprintf(&buffer[len],"Mode = %s(%d) ", - mode_string[phy_vars_eNB->eNB_UE_stats[UE_id].mode], - phy_vars_eNB->eNB_UE_stats[UE_id].mode); - UE_id_mac = find_UE_id(phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti); + mode_string[eNB->UE_stats[UE_id].mode], + eNB->UE_stats[UE_id].mode); + UE_id_mac = find_UE_id(eNB->Mod_id,eNB->dlsch[(uint8_t)UE_id][0]->rnti); if (UE_id_mac != -1) { - RRC_status = mac_eNB_get_rrc_status(phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti); + RRC_status = mac_eNB_get_rrc_status(eNB->Mod_id,eNB->dlsch[(uint8_t)UE_id][0]->rnti); len += sprintf(&buffer[len],"UE_id_mac = %d, RRC status = %d\n",UE_id_mac,RRC_status); } else len += sprintf(&buffer[len],"UE_id_mac = -1\n"); len += sprintf(&buffer[len],"SR received/total: %d/%d (diff %d)\n", - phy_vars_eNB->eNB_UE_stats[UE_id].sr_received, - phy_vars_eNB->eNB_UE_stats[UE_id].sr_total, - phy_vars_eNB->eNB_UE_stats[UE_id].sr_total-phy_vars_eNB->eNB_UE_stats[UE_id].sr_received); + eNB->UE_stats[UE_id].sr_received, + eNB->UE_stats[UE_id].sr_total, + eNB->UE_stats[UE_id].sr_total-eNB->UE_stats[UE_id].sr_received); len += sprintf(&buffer[len],"DL Subband CQI: "); int nb_sb; - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: nb_sb=0; break; @@ -713,7 +694,7 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) } for (i=0; ieNB_UE_stats[UE_id].DL_subband_cqi[0][i]); + eNB->UE_stats[UE_id].DL_subband_cqi[0][i]); len += sprintf(&buffer[len],"\n"); @@ -730,25 +711,25 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) for (i=0; i<8; i++) { len += sprintf(&buffer[len]," harq %d: %d/%d (fer %d) (%d/%d, %d/%d, %d/%d, %d/%d) ", i, - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_errors[i], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_fer[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[i][1], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][1], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[i][2], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][2], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[i][3], - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][3]); + eNB->UE_stats[UE_id].ulsch_errors[i], + eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][0], + eNB->UE_stats[UE_id].ulsch_round_fer[i][0], + eNB->UE_stats[UE_id].ulsch_round_errors[i][0], + eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][0], + eNB->UE_stats[UE_id].ulsch_round_errors[i][1], + eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][1], + eNB->UE_stats[UE_id].ulsch_round_errors[i][2], + eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][2], + eNB->UE_stats[UE_id].ulsch_round_errors[i][3], + eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][3]); if ((i&1) == 1) len += sprintf(&buffer[len],"\n"); - ulsch_errors+=phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_errors[i]; + ulsch_errors+=eNB->UE_stats[UE_id].ulsch_errors[i]; for (j=0; j<4; j++) { - ulsch_round_attempts[j]+=phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_decoding_attempts[i][j]; - ulsch_round_errors[j]+=phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[i][j]; + ulsch_round_attempts[j]+=eNB->UE_stats[UE_id].ulsch_decoding_attempts[i][j]; + ulsch_round_errors[j]+=eNB->UE_stats[UE_id].ulsch_round_errors[i][j]; } } @@ -772,29 +753,29 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) for (i=0; i<8; i++) { len += sprintf(&buffer[len]," harq %d: %d/%d (%d/%d/%d, %d/%d/%d, %d/%d/%d, %d/%d/%d) ", i, - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_l2_errors[i], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_ACK[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_NAK[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][0], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_ACK[i][1], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_NAK[i][1], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][1], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_ACK[i][2], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_NAK[i][2], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][2], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_ACK[i][3], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_NAK[i][3], - phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][3]); + eNB->UE_stats[UE_id].dlsch_l2_errors[i], + eNB->UE_stats[UE_id].dlsch_trials[i][0], + eNB->UE_stats[UE_id].dlsch_ACK[i][0], + eNB->UE_stats[UE_id].dlsch_NAK[i][0], + eNB->UE_stats[UE_id].dlsch_trials[i][0], + eNB->UE_stats[UE_id].dlsch_ACK[i][1], + eNB->UE_stats[UE_id].dlsch_NAK[i][1], + eNB->UE_stats[UE_id].dlsch_trials[i][1], + eNB->UE_stats[UE_id].dlsch_ACK[i][2], + eNB->UE_stats[UE_id].dlsch_NAK[i][2], + eNB->UE_stats[UE_id].dlsch_trials[i][2], + eNB->UE_stats[UE_id].dlsch_ACK[i][3], + eNB->UE_stats[UE_id].dlsch_NAK[i][3], + eNB->UE_stats[UE_id].dlsch_trials[i][3]); if ((i&1) == 1) len += sprintf(&buffer[len],"\n"); - dlsch_errors+=phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_l2_errors[i]; + dlsch_errors+=eNB->UE_stats[UE_id].dlsch_l2_errors[i]; for (j=0; j<4; j++) { - dlsch_round_attempts[j]+=phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_trials[i][j]; - dlsch_round_errors[j]+=phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_NAK[i][j]; + dlsch_round_attempts[j]+=eNB->UE_stats[UE_id].dlsch_trials[i][j]; + dlsch_round_errors[j]+=eNB->UE_stats[UE_id].dlsch_NAK[i][j]; } } @@ -806,31 +787,10 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) dlsch_round_errors[3],dlsch_round_attempts[3]); - len += sprintf(&buffer[len],"DLSCH total bits from MAC: %dkbit ",(phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC)/1000); - len += sprintf(&buffer[len],"DLSCH total bits ack'ed: %dkbit ",(phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS)/1000); - len += sprintf(&buffer[len],"DLSCH Average throughput (100 frames): %dkbps\n",(phy_vars_eNB->eNB_UE_stats[UE_id].dlsch_bitrate/1000)); - // len += sprintf(&buffer[len],"[eNB PROC] Transmission Mode %d\n",phy_vars_eNB->transmission_mode[UE_id]); - /* - if(phy_vars_eNB->transmission_mode[UE_id] == 5) { - if(phy_vars_eNB->mu_mimo_mode[UE_id].dl_pow_off == 0) - len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is in MU-MIMO mode****\n",UE_id); - else if(phy_vars_eNB->mu_mimo_mode[UE_id].dl_pow_off == 1) - len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is in SU-MIMO mode****\n",UE_id); - else - len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is not scheduled****\n",UE_id); - } - */ - /* - len += sprintf(&buffer[len],"[eNB PROC] RB Allocation on Sub-bands: "); - - // for (j=0;j< mac_xface->lte_frame_parms->N_RBGS;j++) - for (j=0; j<7; j++) - len += sprintf(&buffer[len],"%d ", - phy_vars_eNB->mu_mimo_mode[UE_id].rballoc_sub[j]); - - len += sprintf(&buffer[len],"\n"); - len += sprintf(&buffer[len],"[eNB PROC] Total Number of Allocated PRBs = %d\n",phy_vars_eNB->mu_mimo_mode[UE_id].pre_nb_available_rbs); - */ + len += sprintf(&buffer[len],"DLSCH total bits from MAC: %dkbit ",(eNB->UE_stats[UE_id].total_TBS_MAC)/1000); + len += sprintf(&buffer[len],"DLSCH total bits ack'ed: %dkbit ",(eNB->UE_stats[UE_id].total_TBS)/1000); + len += sprintf(&buffer[len],"DLSCH Average throughput (100 frames): %dkbps\n",(eNB->UE_stats[UE_id].dlsch_bitrate/1000)); + // len += sprintf(&buffer[len],"[eNB PROC] Transmission Mode %d\n",eNB->transmission_mode[UE_id]); } } @@ -841,3 +801,4 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) return len; } +*/ diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h index 411c058c3e..8afb7b14a3 100644 --- a/openair1/PHY/LTE_TRANSPORT/proto.h +++ b/openair1/PHY/LTE_TRANSPORT/proto.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/proto.h * \brief Function prototypes for PHY physical/transport channel processing and generation V8.6 2009-03 @@ -41,6 +33,7 @@ #define __LTE_TRANSPORT_PROTO__H__ #include "PHY/defs.h" #include +#include "nfapi_interface.h" // Functions below implement 36-211 and 36-212 @@ -56,7 +49,7 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch); void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch); -/** \fn new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t abstraction_flag) +/** \fn new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t abstraction_flag, LTE_DL_FRAME_PARMS* frame_parms) \brief This function allocates structures for a particular DLSCH at eNB @returns Pointer to DLSCH to be removed @param Kmimo Kmimo factor from 36-212/36-213 @@ -64,8 +57,9 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch); @param Nsoft Soft-LLR buffer size from UE-Category @params N_RB_DL total number of resource blocks (determine the operating BW) @param abstraction_flag Flag to indicate abstracted interface + @param frame_parms Pointer to frame descriptor structure */ -LTE_eNB_DLSCH_t *new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t N_RB_DL, uint8_t abstraction_flag); +LTE_eNB_DLSCH_t *new_eNB_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t N_RB_DL, uint8_t abstraction_flag, LTE_DL_FRAME_PARMS* frame_parms); /** \fn free_ue_dlsch(LTE_UE_DLSCH_t *dlsch) \brief This function frees memory allocated for a particular DLSCH at UE @@ -93,7 +87,8 @@ LTE_eNB_ULSCH_t *new_eNB_ulsch(uint8_t max_turbo_iterations,uint8_t N_RB_UL, uin LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag); -/** \fn dlsch_encoding(uint8_t *input_buffer, +/** \fn dlsch_encoding(PHY_VARS_eNB *eNB, + uint8_t *input_buffer, LTE_DL_FRAME_PARMS *frame_parms, uint8_t num_pdcch_symbols, LTE_eNB_DLSCH_t *dlsch, @@ -105,6 +100,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag); - Channel coding (Turbo coding) - Rate matching (sub-block interleaving, bit collection, selection and transmission - Code block concatenation + @param eNB Pointer to eNB PHY context @param input_buffer Pointer to input buffer for sub-frame @param frame_parms Pointer to frame descriptor structure @param num_pdcch_symbols Number of PDCCH symbols in this subframe @@ -116,8 +112,8 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag); @param i_stats Time statistics for interleaving @returns status */ -int32_t dlsch_encoding(uint8_t *a, - LTE_DL_FRAME_PARMS *frame_parms, +int32_t dlsch_encoding(PHY_VARS_eNB *eNB, + uint8_t *a, uint8_t num_pdcch_symbols, LTE_eNB_DLSCH_t *dlsch, int frame, @@ -126,11 +122,95 @@ int32_t dlsch_encoding(uint8_t *a, time_stats_t *te_stats, time_stats_t *i_stats); +int32_t dlsch_encoding_SIC(PHY_VARS_UE *ue, + uint8_t *a, + uint8_t num_pdcch_symbols, + LTE_eNB_DLSCH_t *dlsch, + int frame, + uint8_t subframe, + time_stats_t *rm_stats, + time_stats_t *te_stats, + time_stats_t *i_stats); + + + +/** \fn dlsch_encoding_2threads(PHY_VARS_eNB *eNB, + uint8_t *input_buffer, + uint8_t num_pdcch_symbols, + LTE_eNB_DLSCH_t *dlsch, + int frame, + uint8_t subframe) + \brief This function performs a subset of the bit-coding functions for LTE as described in 36-212, Release 8.Support is limited to turbo-coded channels (DLSCH/ULSCH). This version spawns 1 worker thread. The implemented functions are: + - CRC computation and addition + - Code block segmentation and sub-block CRC addition + - Channel coding (Turbo coding) + - Rate matching (sub-block interleaving, bit collection, selection and transmission + - Code block concatenation + @param eNB Pointer to eNB PHY context + @param input_buffer Pointer to input buffer for sub-frame + @param num_pdcch_symbols Number of PDCCH symbols in this subframe + @param dlsch Pointer to dlsch to be encoded + @param frame Frame number + @param subframe Subframe number + @param rm_stats Time statistics for rate-matching + @param te_stats Time statistics for turbo-encoding + @param i_stats Time statistics for interleaving + @returns status +*/ +int32_t dlsch_encoding_2threads(PHY_VARS_eNB *eNB, + uint8_t *a, + uint8_t num_pdcch_symbols, + LTE_eNB_DLSCH_t *dlsch, + int frame, + uint8_t subframe, + time_stats_t *rm_stats, + time_stats_t *te_stats, + time_stats_t *i_stats); + void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB, uint8_t *DLSCH_pdu, LTE_eNB_DLSCH_t *dlsch); +// Functions below implement 36-211 + +/** \fn allocate_REs_in_RB(int32_t **txdataF, + uint32_t *jj, + uint32_t *jj2, + uint16_t re_offset, + uint32_t symbol_offset, + LTE_DL_eNB_HARQ_t *dlsch0_harq, + LTE_DL_eNB_HARQ_t *dlsch1_harq, + uint8_t pilots, + int16_t amp, + int16_t *qam_table_s, + uint32_t *re_allocated, + uint8_t skip_dc, + uint8_t skip_half, + uint8_t use2ndpilots, + LTE_DL_FRAME_PARMS *frame_parms); + + \brief Fills RB with data + \param txdataF pointer to output data (frequency domain signal) + \param jj index to output (from CW 1) + \param jj2 index to output (from CW 2) + \param re_offset index of the first RE of the RB + \param symbol_offset index to the OFDM symbol + \param dlsch0_harq Pointer to Transport block 0 HARQ structure + \param dlsch0_harq Pointer to Transport block 1 HARQ structure + \param pilots =1 if symbol_offset is an OFDM symbol that contains pilots, 0 otherwise + \param amp Amplitude for symbols + \param qam_table_s0 pointer to scaled QAM table for Transport Block 0 (by rho_a or rho_b) + \param qam_table_s1 pointer to scaled QAM table for Transport Block 1 (by rho_a or rho_b) + \param re_allocated pointer to allocation counter + \param skip_dc offset for positive RBs + \param skip_half indicate that first or second half of RB must be skipped for PBCH/PSS/SSS + \param ue_spec_rs UE specific RS indicator + \param nb_antennas_tx_phy Physical antenna elements which can be different with antenna port number, especially in beamforming case + \param use2ndpilots Set to use the pilots from antenna port 1 for PDSCH + \param frame_parms Frame parameter descriptor +*/ + // Functions below implement 36-211 /** \fn allocate_REs_in_RB(int32_t **txdataF, @@ -168,7 +248,7 @@ void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB, \param frame_parms Frame parameter descriptor */ -int32_t allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, +int32_t allocate_REs_in_RB(PHY_VARS_eNB* phy_vars_eNB, int32_t **txdataF, uint32_t *jj, uint32_t *jj2, @@ -183,7 +263,12 @@ int32_t allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, int16_t *qam_table_s1, uint32_t *re_allocated, uint8_t skip_dc, - uint8_t skip_half); + uint8_t skip_half, + uint8_t lprime, + uint8_t mprime, + uint8_t Ns, + int *P1_SHIFT, + int *P2_SHIFT); /** \fn int32_t dlsch_modulation(int32_t **txdataF, @@ -201,15 +286,21 @@ int32_t allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, @param num_pdcch_symbols Number of PDCCH symbols in this subframe @param dlsch0 Pointer to Transport Block 0 DLSCH descriptor for this allocation @param dlsch1 Pointer to Transport Block 0 DLSCH descriptor for this allocation - */ -int32_t dlsch_modulation(int32_t **txdataF, +int32_t dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, + int32_t **txdataF, int16_t amp, + uint32_t sub_frame_offset, + uint8_t num_pdcch_symbols, + LTE_eNB_DLSCH_t *dlsch0, + LTE_eNB_DLSCH_t *dlsch1); + +int32_t dlsch_modulation_SIC(int32_t **sic_buffer, uint32_t sub_frame_offset, LTE_DL_FRAME_PARMS *frame_parms, uint8_t num_pdcch_symbols, LTE_eNB_DLSCH_t *dlsch0, - LTE_eNB_DLSCH_t *dlsch1); + int G); /* \brief This function is the top-level routine for generation of the sub-frame signal (frequency-domain) for MCH. @param txdataF Table of pointers for frequency-domain TX signals @@ -226,22 +317,20 @@ int mch_modulation(int32_t **txdataF, /** \brief Top-level generation function for eNB TX of MBSFN @param phy_vars_eNB Pointer to eNB variables - @param subframe Subframe for PMCH @param a Pointer to transport block @param abstraction_flag */ -void generate_mch(PHY_VARS_eNB *phy_vars_eNB,int subframe,uint8_t *a,int abstraction_flag); +void generate_mch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t *a); /** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals) @param phy_vars_eNB Pointer to eNB variables + @param proc Pointer to RXn-TXnp4 proc information @param mcs MCS for MBSFN @param ndi new data indicator @param rdvix - @param abstraction_flag - */ -void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx,int abstraction_flag); +void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx); /** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals) @param phy_vars_ue Pointer to UE variables @@ -298,9 +387,16 @@ int32_t generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, int first_pilot_only); int32_t generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB, + eNB_rxtx_proc_t *proc, + int32_t **txdataF, + int16_t amp); + +void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB, + uint8_t UE_id, int32_t **txdataF, int16_t amp, - uint16_t subframe); + uint16_t Ntti, + uint8_t beamforming_mode); int32_t generate_pss(int32_t **txdataF, int16_t amp, @@ -609,6 +705,22 @@ void qam64_qam16(short *stream0_in, short *rho01, int length); +/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/16QAM reception. + @param stream0_in Input from channel compensated (MR combined) stream 0 + @param stream1_in Input from channel compensated (MR combined) stream 1 + @param ch_mag Input from scaled channel magnitude square of h0'*g0 + @param ch_mag_i Input from scaled channel magnitude square of h0'*g1 + @param stream0_out Output from LLR unit for stream0 + @param rho01 Cross-correlation between channels (MR combined) + @param length in complex channel outputs*/ +void qam64_qam16_avx2(short *stream0_in, + short *stream1_in, + short *ch_mag, + short *ch_mag_i, + short *stream0_out, + short *rho01, + int length); + /** \brief This function perform LLR computation for dual-stream (64QAM/16QAM) transmission. @param frame_parms Frame descriptor structure @param rxdataF_comp Compensated channel output @@ -651,6 +763,22 @@ void qam64_qam64(short *stream0_in, short *rho01, int length); +/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/64QAM reception. + @param stream0_in Input from channel compensated (MR combined) stream 0 + @param stream1_in Input from channel compensated (MR combined) stream 1 + @param ch_mag Input from scaled channel magnitude square of h0'*g0 + @param ch_mag_i Input from scaled channel magnitude square of h0'*g1 + @param stream0_out Output from LLR unit for stream0 + @param rho01 Cross-correlation between channels (MR combined) + @param length in complex channel outputs*/ +void qam64_qam64_avx2(int32_t *stream0_in, + int32_t *stream1_in, + int32_t *ch_mag, + int32_t *ch_mag_i, + int16_t *stream0_out, + int32_t *rho01, + int length); + /** \brief This function perform LLR computation for dual-stream (64QAM/64QAM) transmission. @param frame_parms Frame descriptor structure @param rxdataF_comp Compensated channel output @@ -675,7 +803,8 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, unsigned char first_symbol_flag, unsigned short nb_rb, uint16_t pbch_pss_sss_adjust, - short **llr16p); + //short **llr16p, + uint32_t llr_offset); /** \brief This function generates log-likelihood ratios (decoder input) for single-stream QPSK received waveforms. @@ -687,6 +816,7 @@ int dlsch_64qam_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS @param llr128p pointer to pointer to symbol in dlsch_llr + @param beamforming_mode beamforming mode */ int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, @@ -695,7 +825,8 @@ int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, uint8_t first_symbol_flag, uint16_t nb_rb, uint16_t pbch_pss_sss_adj, - int16_t **llr128p); + //int16_t **llr128p, + uint8_t beamforming_mode); /** \brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms @@ -708,8 +839,20 @@ int32_t dlsch_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms, @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adjust Adjustment factor in RE for PBCH/PSS/SSS allocations @param llr128p pointer to pointer to symbol in dlsch_llr + @param beamforming_mode beamforming mode */ +int32_t dlsch_qpsk_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms, + int **rxdataF_comp, + int32_t **sic_buffer, + int **rho_i, + short *dlsch_llr, + uint8_t num_pdcch_symbols, + uint16_t nb_rb, + uint8_t subframe, + uint16_t mod_order_0, + uint32_t rb_alloc); + void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int16_t *dlsch_llr, @@ -718,8 +861,8 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, uint8_t first_symbol_flag, uint16_t nb_rb, uint16_t pbch_pss_sss_adjust, - int16_t **llr128p); - + int16_t **llr128p, + uint8_t beamforming_mode); /** \brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms @param frame_parms Frame descriptor structure @@ -731,7 +874,34 @@ void dlsch_16qam_llr(LTE_DL_FRAME_PARMS *frame_parms, @param first_symbol_flag @param nb_rb number of RBs for this allocation @param pbch_pss_sss_adjust PBCH/PSS/SSS RE adjustment (in REs) + @param beamforming_mode beamforming mode */ +void dlsch_16qam_llr_SIC (LTE_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int32_t **sic_buffer, //Q15 + int32_t **rho_i, + int16_t *dlsch_llr, + uint8_t num_pdcch_symbols, + int32_t **dl_ch_mag, + uint16_t nb_rb, + uint8_t subframe, + uint16_t mod_order_0, + uint32_t rb_alloc); + +void dlsch_64qam_llr_SIC(LTE_DL_FRAME_PARMS *frame_parms, + int32_t **rxdataF_comp, + int32_t **sic_buffer, //Q15 + int32_t **rho_i, + int16_t *dlsch_llr, + uint8_t num_pdcch_symbols, + int32_t **dl_ch_mag, + int32_t **dl_ch_magb, + uint16_t nb_rb, + uint8_t subframe, + uint16_t mod_order_0, + uint32_t rb_alloc); + + void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, int16_t *dlsch_llr, @@ -741,7 +911,10 @@ void dlsch_64qam_llr(LTE_DL_FRAME_PARMS *frame_parms, uint8_t first_symbol_flag, uint16_t nb_rb, uint16_t pbch_pss_sss_adjust, - short **llr_save); + //int16_t **llr_save, + uint32_t llr_offset, + uint8_t beamforming_mode); + /** \fn dlsch_siso(LTE_DL_FRAME_PARMS *frame_parms, int32_t **rxdataF_comp, @@ -840,6 +1013,14 @@ void dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms, uint16_t nb_rb, uint8_t dual_stream_UE); +void dlsch_detection_mrc_TM34(LTE_DL_FRAME_PARMS *frame_parms, + LTE_UE_PDSCH *lte_ue_pdsch_vars, + int harq_pid, + int round, + unsigned char symbol, + unsigned short nb_rb, + unsigned char dual_stream_UE); + /** \fn dlsch_extract_rbs_single(int32_t **rxdataF, int32_t **dl_ch_estimates, int32_t **rxdataF_ext, @@ -910,7 +1091,39 @@ uint16_t dlsch_extract_rbs_dual(int32_t **rxdataF, uint8_t symbol, uint8_t subframe, uint32_t high_speed_flag, - LTE_DL_FRAME_PARMS *frame_parms); + LTE_DL_FRAME_PARMS *frame_parms, + MIMO_mode_t mimo_mode); + +/** \fn dlsch_extract_rbs_TM7(int32_t **rxdataF, + int32_t **dl_bf_ch_estimates, + int32_t **rxdataF_ext, + int32_t **dl_bf_ch_estimates_ext, + uint32_t *rb_alloc, + uint8_t symbol, + uint8_t subframe, + uint32_t high_speed_flag, + LTE_DL_FRAME_PARMS *frame_parms) + \brief This function extracts the received resource blocks, both channel estimates and data symbols, + for the current allocation and for single antenna eNB transmission. + @param rxdataF Raw FFT output of received signal + @param dl_bf_ch_estimates Beamforming channel estimates of current slot + @param rxdataF_ext FFT output for RBs in this allocation + @param dl_bf_ch_estimates_ext Beamforming channel estimates for RBs in this allocation + @param rb_alloc RB allocation vector + @param symbol Symbol to extract + @param subframe Subframe number + @param high_speed_flag + @param frame_parms Pointer to frame descriptor +*/ +uint16_t dlsch_extract_rbs_TM7(int32_t **rxdataF, + int32_t **dl_bf_ch_estimates, + int32_t **rxdataF_ext, + int32_t **dl_bf_ch_estimates_ext, + uint32_t *rb_alloc, + uint8_t symbol, + uint8_t subframe, + uint32_t high_speed_flag, + LTE_DL_FRAME_PARMS *frame_parms); /** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation. In addition, it computes the squared-magnitude of the channel with weightings for 16QAM/64QAM detection as well as dual-stream detection (cross-correlation) @param rxdataF_ext Frequency-domain received signal in RBs to be demodulated @@ -949,6 +1162,67 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms, int **dl_ch_rho_ext, unsigned char output_shift); +void dlsch_dual_stream_correlationTM34(LTE_DL_FRAME_PARMS *frame_parms, + unsigned char symbol, + unsigned short nb_rb, + int **dl_ch_estimates_ext, + int **dl_ch_estimates_ext_i, + int **dl_ch_rho_ext, + unsigned char output_shift0, + unsigned char output_shift1); +//This function is used to compute multiplications in Hhermitian * H matrix +void conjch0_mult_ch1(int *ch0, + int *ch1, + int32_t *ch0conj_ch1, + unsigned short nb_rb, + unsigned char output_shift0); + +void construct_HhH_elements(int *ch0conj_ch0, + int *ch1conj_ch1, + int *ch2conj_ch2, + int *ch3conj_ch3, + int *ch0conj_ch1, + int *ch1conj_ch0, + int *ch2conj_ch3, + int *ch3conj_ch2, + int32_t *after_mf_00, + int32_t *after_mf_01, + int32_t *after_mf_10, + int32_t *after_mf_11, + unsigned short nb_rb); + +void squared_matrix_element(int32_t *Hh_h_00, + int32_t *Hh_h_00_sq, + unsigned short nb_rb); + +void dlsch_channel_level_TM34_meas(int *ch00, + int *ch01, + int *ch10, + int *ch11, + int *avg_0, + int *avg_1, + unsigned short nb_rb); + +void det_HhH(int32_t *after_mf_00, + int32_t *after_mf_01, + int32_t *after_mf_10, + int32_t *after_mf_11, + int32_t *det_fin_128, + unsigned short nb_rb); + +void numer(int32_t *Hh_h_00_sq, + int32_t *Hh_h_01_sq, + int32_t *Hh_h_10_sq, + int32_t *Hh_h_11_sq, + int32_t *num_fin, + unsigned short nb_rb); + +uint8_t rank_estimation_tm3_tm4(int *dl_ch_estimates_00, + int *dl_ch_estimates_01, + int *dl_ch_estimates_10, + int *dl_ch_estimates_11, + unsigned short nb_rb); + void dlsch_channel_compensation_TM56(int **rxdataF_ext, int **dl_ch_estimates_ext, int **dl_ch_mag, @@ -964,16 +1238,20 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext, unsigned char output_shift, unsigned char dl_power_off); -void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms, + +void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms, LTE_UE_PDSCH *lte_ue_pdsch_vars, PHY_MEASUREMENTS *phy_measurements, int eNB_id, unsigned char symbol, unsigned char mod_order0, unsigned char mod_order1, + int harq_pid, int round, + MIMO_mode_t mimo_mode, unsigned short nb_rb, - unsigned char output_shift); + unsigned char output_shift0, + unsigned char output_shift1); /** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal @@ -989,11 +1267,16 @@ void dlsch_channel_level(int32_t **dl_ch_estimates_ext, uint8_t pilots_flag, uint16_t nb_rb); -void dlsch_channel_level_TM3(int **dl_ch_estimates_ext, - LTE_DL_FRAME_PARMS *frame_parms, - int *avg, - uint8_t symbol, - unsigned short nb_rb); + +void dlsch_channel_level_TM34(int **dl_ch_estimates_ext, + LTE_DL_FRAME_PARMS *frame_parms, + unsigned char *pmi_ext, + int *avg_0, + int *avg_1, + uint8_t symbol, + unsigned short nb_rb, + MIMO_mode_t mimo_mode); + void dlsch_channel_level_TM56(int32_t **dl_ch_estimates_ext, LTE_DL_FRAME_PARMS *frame_parms, @@ -1002,6 +1285,12 @@ void dlsch_channel_level_TM56(int32_t **dl_ch_estimates_ext, uint8_t symbol_mod, uint16_t nb_rb); +void dlsch_channel_level_TM7(int32_t **dl_bf_ch_estimates_ext, + LTE_DL_FRAME_PARMS *frame_parms, + int32_t *avg, + uint8_t pilots_flag, + uint16_t nb_rb); + void dlsch_scale_channel(int32_t **dl_ch_estimates_ext, LTE_DL_FRAME_PARMS *frame_parms, LTE_UE_DLSCH_t **dlsch_ue, @@ -1019,6 +1308,7 @@ void dlsch_scale_channel(int32_t **dl_ch_estimates_ext, @param dlsch_llr Pointer to LLR values computed by dlsch_demodulation @param lte_frame_parms Pointer to frame descriptor @param dlsch Pointer to DLSCH descriptor + @param frame Frame number @param subframe Subframe number @param num_pdcch_symbols Number of PDCCH symbols @param is_crnti indicates if PDSCH belongs to a CRNTI (necessary for parallelizing decoding threads) @@ -1030,6 +1320,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *lte_frame_parms, LTE_UE_DLSCH_t *dlsch, LTE_DL_UE_HARQ_t *harq_process, + uint32_t frame, uint8_t subframe, uint8_t harq_pid, uint8_t is_crnti, @@ -1037,7 +1328,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, uint8_t subframe, - uint8_t dlsch_id, + PDSCH_t dlsch_id, uint8_t eNB_id); /** \brief This function is the top-level entry point to PDSCH demodulation, after frequency-domain transformation and channel estimation. It performs @@ -1046,6 +1337,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, - RE extraction (pilot, PBCH, synch. signals) - antenna combining (MRC, Alamouti, cycling) - LLR computation + This function supports TM1, 2, 3, 5, and 6. @param phy_vars_ue Pointer to PHY variables @param type Type of PDSCH (SI_PDSCH,RA_PDSCH,PDSCH,PMCH) @param eNB_id eNb index (Nid1) 0,1,2 @@ -1053,28 +1345,58 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, @param subframe Subframe number @param symbol Symbol on which to act (within sub-frame) @param first_symbol_flag set to 1 on first DLSCH symbol - @param dual_stream_UE Flag to indicate dual-stream interference cancellation + @param rx_type. rx_type=RX_IC_single_stream will enable interference cancellation of a second stream when decoding the first stream. In case of TM1, 2, 5, and this can cancel interference from a neighbouring cell given by eNB_id_i. In case of TM5, eNB_id_i should be set to n_connected_eNB to perform multi-user interference cancellation. In case of TM3, eNB_id_i should be set to eNB_id to perform co-channel interference cancellation; this option should be used together with an interference cancellation step [...]. In case of TM3, if rx_type=RX_IC_dual_stream, both streams will be decoded by applying the IC single stream receiver twice. @param i_mod Modulation order of the interfering stream */ int32_t rx_pdsch(PHY_VARS_UE *phy_vars_ue, PDSCH_t type, uint8_t eNB_id, uint8_t eNB_id_i, + uint32_t frame, uint8_t subframe, uint8_t symbol, uint8_t first_symbol_flag, - uint8_t dual_stream_UE, + RX_type_t rx_type, uint8_t i_mod, uint8_t harq_pid); -int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, - LTE_UE_PDCCH **lte_ue_pdcch_vars, - LTE_DL_FRAME_PARMS *frame_parms, +int32_t rx_pdcch(PHY_VARS_UE *ue, + uint32_t frame, uint8_t subframe, uint8_t eNB_id, MIMO_mode_t mimo_mode, uint32_t high_speed_flag, uint8_t is_secondary_ue); + +/*! \brief Extract PSS and SSS resource elements + @param phy_vars_ue Pointer to UE variables + @param[out] pss_ext contain the PSS signals after the extraction + @param[out] sss_ext contain the SSS signals after the extraction + @returns 0 on success +*/ +int pss_sss_extract(PHY_VARS_UE *phy_vars_ue, + int32_t pss_ext[4][72], + int32_t sss_ext[4][72], + uint8_t subframe); + +/*! \brief Extract only PSS resource elements + @param phy_vars_ue Pointer to UE variables + @param[out] pss_ext contain the PSS signals after the extraction + @returns 0 on success +*/ +int pss_only_extract(PHY_VARS_UE *phy_vars_ue, + int32_t pss_ext[4][72], + uint8_t subframe); + +/*! \brief Extract only SSS resource elements + @param phy_vars_ue Pointer to UE variables + @param[out] sss_ext contain the SSS signals after the extraction + @returns 0 on success +*/ +int sss_only_extract(PHY_VARS_UE *phy_vars_ue, + int32_t sss_ext[4][72], + uint8_t subframe); + /*! \brief Performs detection of SSS to find cell ID and other framing parameters (FDD/TDD, normal/extended prefix) @param phy_vars_ue Pointer to UE variables @param tot_metric Pointer to variable containing maximum metric under framing hypothesis (to be compared to other hypotheses @@ -1132,8 +1454,8 @@ void dci_encoding(uint8_t *a, uint16_t rnti); /*! \brief Top-level DCI entry point. This routine codes an set of DCI PDUs and performs PDCCH modulation, interleaving and mapping. - \param num_ue_spec_dci Number of UE specific DCI pdus to encode - \param num_common_dci Number of Common DCI pdus to encode + \param num_dci Number of pdcch symbols + \param num_dci Number of DCI pdus to encode \param dci_alloc Allocation vectors for each DCI pdu \param n_rnti n_RNTI (see ) \param amp Amplitude of QPSK symbols @@ -1142,8 +1464,9 @@ void dci_encoding(uint8_t *a, \param sub_frame_offset subframe offset in frame @returns Number of PDCCH symbols */ -uint8_t generate_dci_top(uint8_t num_ue_spec_dci, - uint8_t num_common_dci, + +uint8_t generate_dci_top(uint8_t num_pdcch_symbols, + uint8_t num_dci, DCI_ALLOC_t *dci_alloc, uint32_t n_rnti, int16_t amp, @@ -1152,8 +1475,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci, uint32_t sub_frame_offset); uint8_t generate_dci_top_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t num_ue_spec_dci, - uint8_t num_common_dci, + int num_dci, DCI_ALLOC_t *dci_alloc, uint8_t subframe); @@ -1202,6 +1524,12 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue, int16_t eNB_id, uint8_t subframe); +uint16_t dci_CRNTI_decoding_procedure(PHY_VARS_UE *ue, + DCI_ALLOC_t *dci_alloc, + uint8_t DCIFormat, + uint8_t agregationLevel, + int16_t eNB_id, + uint8_t subframe); uint16_t dci_decoding_procedure_emul(LTE_UE_PDCCH **lte_ue_pdcch_vars, uint8_t num_ue_spec_dci, @@ -1246,7 +1574,7 @@ uint32_t get_TBS_UL(uint8_t mcs, uint16_t nb_rb); */ uint32_t get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap); -/* \brief Return prb for a given vrb index +/* \brief Return prb for a given vrb index @param vrb_type VRB type (0=localized,1=distributed) @param rb_alloc_dci rballoc field from DCI */ @@ -1266,7 +1594,7 @@ uint8_t get_transmission_mode(module_id_t Mod_id, uint8_t CC_id, rnti_t rnti); */ uint32_t conv_nprb(uint8_t ra_header,uint32_t rb_alloc,int N_RB_DL); -int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t Nl,uint8_t num_pdcch_symbols,int frame,uint8_t subframe); +int get_G(LTE_DL_FRAME_PARMS *frame_parms,uint16_t nb_rb,uint32_t *rb_alloc,uint8_t mod_order,uint8_t Nl,uint8_t num_pdcch_symbols,int frame,uint8_t subframe, uint8_t beamforming_mode); int adjust_G(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_order,uint8_t subframe); int adjust_G2(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *rb_alloc,uint8_t mod_order,uint8_t subframe,uint8_t symbol); @@ -1300,9 +1628,11 @@ uint8_t SE2I_TBS(float SE, @param soundingrs_ul_config_dedicated Dynamic configuration from RRC during Connection Establishment @param txdataF pointer to the frequency domain TX signal @returns 0 on success*/ -int generate_srs_rx(LTE_DL_FRAME_PARMS *frame_parms, - SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated, - int *txdataF); +int generate_srs(LTE_DL_FRAME_PARMS *frame_parms, + SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated, + int *txdataF, + int16_t amp, + uint32_t subframe); int32_t generate_srs_tx_emul(PHY_VARS_UE *phy_vars_ue, uint8_t subframe); @@ -1326,6 +1656,7 @@ int32_t generate_srs_tx(PHY_VARS_UE *phy_vars_ue, */ int32_t generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, + UE_rxtx_proc_t *proc, uint8_t eNB_id, int16_t amp, uint32_t subframe, @@ -1338,6 +1669,14 @@ int32_t generate_drs_pusch(PHY_VARS_UE *phy_vars_ue, @param frame_parms Pointer to a LTE_DL_FRAME_PARMS structure (eNB or UE)*/ void init_ul_hopping(LTE_DL_FRAME_PARMS *frame_parms); + +/*! + \brief This function implements the initialization of paging parameters for UE (See Section 7, 36.304).It must be called after setting IMSImod1024 during UE startup and after receiving SIB2 + @param ue Pointer to UE context + @param defaultPagingCycle T from 36.304 (0=32,1=64,2=128,3=256) + @param nB nB from 36.304 (0=4T,1=2T,2=T,3=T/2,4=T/4,5=T/8,6=T/16,7=T/32*/ +int init_ue_paging_info(PHY_VARS_UE *ue, long defaultPagingCycle, long nB); + int32_t compareints (const void * a, const void * b); @@ -1361,16 +1700,34 @@ uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame,uint8_t uint8_t subframe2harq_pid_eNBrx(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe); int generate_ue_dlsch_params_from_dci(int frame, - uint8_t subframe, + uint8_t subframe, void *dci_pdu, rnti_t rnti, DCI_format_t dci_format, + LTE_UE_PDCCH *pdcch_vars, + LTE_UE_PDSCH *pdsch_vars, LTE_UE_DLSCH_t **dlsch, LTE_DL_FRAME_PARMS *frame_parms, PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, uint16_t si_rnti, uint16_t ra_rnti, - uint16_t p_rnti); + uint16_t p_rnti, + uint8_t beamforming_mode, + uint16_t tc_rnti); + +void fill_dci_and_dlsch(PHY_VARS_eNB *eNB, + int frame, + int subframe, + eNB_rxtx_proc_t *proc, + DCI_ALLOC_t *dci_alloc, + nfapi_dl_config_dci_dl_pdu *pdu); + +void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,mDCI_ALLOC_t *dci_alloc,nfapi_dl_config_mpdcch_pdu *pdu); + +void fill_dci0(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,DCI_ALLOC_t *dci_alloc, + nfapi_hi_dci0_dci_pdu *pdu); + +void fill_ulsch(PHY_VARS_eNB *eNB,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame,int subframe); int32_t generate_eNB_dlsch_params_from_dci(int frame, uint8_t subframe, @@ -1383,19 +1740,20 @@ int32_t generate_eNB_dlsch_params_from_dci(int frame, uint16_t si_rnti, uint16_t ra_rnti, uint16_t p_rnti, - uint16_t DL_pmi_single); + uint16_t DL_pmi_single, + uint8_t beamforming_mode); -int32_t generate_eNB_ulsch_params_from_rar(uint8_t *rar_pdu, - frame_t frame, - uint8_t subframe, - LTE_eNB_ULSCH_t *ulsch, - LTE_DL_FRAME_PARMS *frame_parms); +int generate_eNB_ulsch_params_from_rar(PHY_VARS_eNB *eNB, + unsigned char *rar_pdu, + uint32_t frame, + unsigned char subframe); int generate_ue_ulsch_params_from_dci(void *dci_pdu, rnti_t rnti, uint8_t subframe, DCI_format_t dci_format, PHY_VARS_UE *phy_vars_ue, + UE_rxtx_proc_t *proc, uint16_t si_rnti, uint16_t ra_rnti, uint16_t p_rnti, @@ -1404,34 +1762,32 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, uint8_t use_srs); int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, - uint8_t eNB_id); + UE_rxtx_proc_t *proc, + uint8_t eNB_id); double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, - uint8_t eNB_id); -int generate_eNB_ulsch_params_from_dci(void *dci_pdu, + uint8_t eNB_id, + uint8_t subframe); + +uint8_t sinr2cqi(double sinr,uint8_t trans_mode); + +int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB, + eNB_rxtx_proc_t *proc, + void *dci_pdu, rnti_t rnti, - uint8_t subframe, DCI_format_t dci_format, uint8_t UE_id, - PHY_VARS_eNB *PHY_vars_eNB, uint16_t si_rnti, uint16_t ra_rnti, uint16_t p_rnti, uint16_t cba_rnti, uint8_t use_srs); -#ifdef USER_MODE -void dump_ulsch(PHY_VARS_eNB *phy_vars_eNb,uint8_t subframe, uint8_t UE_id); -void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid); -void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); -void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); - -void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round); -#endif +void dump_ulsch(PHY_VARS_eNB *phy_vars_eNB,int frame, int subframe, uint8_t UE_id); int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci); -int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t mode, int input_level_dBm); +int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, UE_rxtx_proc_t *proc, char* buffer, int length, runmode_t mode, int input_level_dBm); int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length); @@ -1474,16 +1830,13 @@ void generate_RIV_tables(void); */ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode); -void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, - uint32_t subframe, - uint8_t eNB_id, // this is the effective sector id - uint8_t UE_id, - LTE_eNB_ULSCH_t **ulsch, - uint8_t cooperation_flag); +void rx_ulsch(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + uint8_t UE_id); -void rx_ulsch_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t subframe, - uint8_t sect_id, + +void rx_ulsch_emul(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, uint8_t UE_index); /*! @@ -1500,6 +1853,7 @@ uint32_t ulsch_encoding(uint8_t *a, PHY_VARS_UE *phy_vars_ue, uint8_t harq_pid, uint8_t eNB_id, + uint8_t subframe_rx, uint8_t tmode, uint8_t control_only_flag, uint8_t Nbundled); @@ -1515,12 +1869,14 @@ uint32_t ulsch_encoding(uint8_t *a, int32_t ulsch_encoding_emul(uint8_t *ulsch_buffer, PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, + uint8_t subframe_rx, uint8_t harq_pid, uint8_t control_only_flag); /*! \brief Decoding of PUSCH/ACK/RI/ACK from 36-212. @param phy_vars_eNB Pointer to eNB top-level descriptor + @param proc Pointer to RXTX proc variables @param UE_id ID of UE transmitting this PUSCH @param subframe Index of subframe for PUSCH @param control_only_flag Receive PUSCH with control information only @@ -1529,30 +1885,56 @@ int32_t ulsch_encoding_emul(uint8_t *ulsch_buffer, @returns 0 on success */ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, + eNB_rxtx_proc_t *proc, uint8_t UE_id, - uint8_t subframe, uint8_t control_only_flag, uint8_t Nbundled, uint8_t llr8_flag); +/*! + \brief Decoding of ULSCH data component from 36-212. This one spawns 1 worker thread in parallel,half of the segments in each thread. + @param phy_vars_eNB Pointer to eNB top-level descriptor + @param UE_id ID of UE transmitting this PUSCH + @param harq_pid HARQ process ID + @param llr8_flag If 1, indicate that the 8-bit turbo decoder should be used + @returns 0 on success +*/ +int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB, + int UE_id, + int harq_pid, + int llr8_flag); + +/*! + \brief Decoding of ULSCH data component from 36-212. This one is single thread. + @param phy_vars_eNB Pointer to eNB top-level descriptor + @param UE_id ID of UE transmitting this PUSCH + @param harq_pid HARQ process ID + @param llr8_flag If 1, indicate that the 8-bit turbo decoder should be used + @returns 0 on success +*/ +int ulsch_decoding_data(PHY_VARS_eNB *eNB, + int UE_id, + int harq_pid, + int llr8_flag); + uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t subframe, + eNB_rxtx_proc_t *proc, uint8_t UE_index, uint16_t *crnti); void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, - uint8_t subframe, - int16_t amp, - uint8_t sect_id, - uint8_t abstraction_flag); + eNB_rxtx_proc_t *proc, + int16_t amp); /* \brief This routine demodulates the PHICH and updates PUSCH/ULSCH parameters. @param phy_vars_ue Pointer to UE variables + @param proc Pointer to RXN_TXNp4 proc @param subframe Subframe of received PDCCH/PHICH @param eNB_id Index of eNB */ void rx_phich(PHY_VARS_UE *phy_vars_ue, + UE_rxtx_proc_t *proc, uint8_t subframe, uint8_t eNB_id); @@ -1570,16 +1952,26 @@ uint8_t phich_subframe2_pusch_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t s @param subframe Subframe of received/transmitted PHICH @returns frame of PUSCH transmission */ -uint8_t phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame,uint8_t subframe);; +int phich_frame2_pusch_frame(LTE_DL_FRAME_PARMS *frame_parms, int frame, int subframe); void print_CQI(void *o,UCI_format_t uci_format,uint8_t eNB_id,int N_RB_DL); void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats,uint8_t N_RB_DL, uint16_t * crnti, uint8_t * access_mode); void fill_CQI(LTE_UE_ULSCH_t *ulsch,PHY_MEASUREMENTS *meas,uint8_t eNB_id, uint8_t harq_pid,int N_RB_DL, rnti_t rnti, uint8_t trans_mode,double sinr_eff); + void reset_cba_uci(void *o); +/** \brief This routine computes the subband PMI bitmap based on measurements (0,1,2,3 for rank 0 and 0,1 for rank 1) in the format needed for UCI + @param meas pointer to measurements + @param eNB_id eNB_id + @param nb_subbands number of subbands + @returns subband PMI bitmap +*/ uint16_t quantize_subband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id,int nb_subbands); + +int32_t pmi_convert_rank1_from_rank2(uint16_t pmi_alloc, int tpmi, int nb_rb); + uint16_t quantize_subband_pmi2(PHY_MEASUREMENTS *meas,uint8_t eNB_id,uint8_t a_id,int nb_subbands); uint64_t pmi2hex_2Ar1(uint32_t pmi); @@ -1590,14 +1982,29 @@ uint64_t cqi2hex(uint32_t cqi); uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs); -uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi); +/** \brief This routine expands a single (wideband) PMI to subband PMI bitmap similar to the one used in the UCI and in the dlsch_modulation routine + @param frame_parms Pointer to DL frame configuration parameters + @param wideband_pmi (0,1,2,3 for rank 0 and 0,1 for rank 1) + @param rank (0 or 1) + @returns subband PMI bitmap +*/ +uint32_t pmi_extend(LTE_DL_FRAME_PARMS *frame_parms,uint8_t wideband_pmi, uint8_t rank); + +/** \brief This routine extracts a single subband PMI from a bitmap coming from UCI or the pmi_extend function + @param N_RB_DL number of resource blocks + @param mimo_mode + @param pmi_alloc subband PMI bitmap + @param rb resource block for which to extract PMI + @returns subband PMI +*/ +uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode, uint32_t pmi_alloc,uint16_t rb); int get_nCCE_offset_l1(int *CCE_table, - const unsigned char L, - const int nCCE, - const int common_dci, - const unsigned short rnti, - const unsigned char subframe); + const unsigned char L, + const int nCCE, + const int common_dci, + const unsigned short rnti, + const unsigned char subframe); uint16_t get_nCCE(uint8_t num_pdcch_symbols,LTE_DL_FRAME_PARMS *frame_parms,uint8_t mi); @@ -1624,8 +2031,10 @@ void pdcch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, int mbsfn_flag, LTE_eNB_DLSCH_t *dlsch, + int hard_pid, int G, uint8_t q, + uint16_t frame, uint8_t Ns); void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, @@ -1638,45 +2047,72 @@ void dlsch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, void init_ncs_cell(LTE_DL_FRAME_PARMS *frame_parms,uint8_t ncs_cell[20][7]); -void generate_pucch(int32_t **txdataF, +void generate_pucch1x(int32_t **txdataF, + LTE_DL_FRAME_PARMS *frame_parms, + uint8_t ncs_cell[20][7], + PUCCH_FMT_t fmt, + PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, + uint16_t n1_pucch, + uint8_t shortened_format, + uint8_t *payload, + int16_t amp, + uint8_t subframe); + +void generate_pucch2x(int32_t **txdataF, + LTE_DL_FRAME_PARMS *fp, + uint8_t ncs_cell[20][7], + PUCCH_FMT_t fmt, + PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, + uint16_t n2_pucch, + uint8_t *payload, + int A, + int B2, + int16_t amp, + uint8_t subframe, + uint16_t rnti); + +void generate_pucch3x(int32_t **txdataF, LTE_DL_FRAME_PARMS *frame_parms, uint8_t ncs_cell[20][7], PUCCH_FMT_t fmt, PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, - uint16_t n1_pucch, - uint16_t n2_pucch, + uint16_t n3_pucch, uint8_t shortened_format, uint8_t *payload, int16_t amp, - uint8_t subframe); + uint8_t subframe, + uint16_t rnti); void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue, + UE_rxtx_proc_t *proc, PUCCH_FMT_t format, uint8_t ncs1, uint8_t *pucch_ack_payload, - uint8_t sr, - uint8_t subframe); + uint8_t sr); + uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, - PUCCH_FMT_t fmt, - uint8_t UE_id, - uint16_t n1_pucch, - uint16_t n2_pucch, - uint8_t shortened_format, - uint8_t *payload, - int frame, - uint8_t subframe, - uint8_t pucch1_thres); + PUCCH_FMT_t fmt, + uint8_t UE_id, + uint16_t n1_pucch, + uint16_t n2_pucch, + uint8_t shortened_format, + uint8_t *payload, + int frame, + uint8_t subframe, + uint8_t pucch1_thres); int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t UE_index, - PUCCH_FMT_t fmt, - uint8_t n1_pucch_sel, - uint8_t *payload, - uint8_t subframe); + eNB_rxtx_proc_t *proc, + uint8_t UE_index, + PUCCH_FMT_t fmt, + uint8_t n1_pucch_sel, + uint8_t *payload); +void init_ulsch_power_LUT(void); + /*! \brief Check for PRACH TXop in subframe @param frame_parms Pointer to LTE_DL_FRAME_PARMS @@ -1700,23 +2136,34 @@ int32_t generate_prach(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe, /*! \brief Process PRACH waveform - @param phy_vars_eNB Pointer to eNB top-level descriptor - @param subframe subframe index to operate on - @param preamble_energy_list List of energies for each candidate preamble - @param preamble_delay_list List of delays for each candidate preamble + @param phy_vars_eNB Pointer to eNB top-level descriptor. If NULL, then this is an RRU + @param ru Pointer to RU top-level descriptor. If NULL, then this is an eNB and we make use of the RU_list + @param max_preamble most likely preamble + @param max_preamble_energy Estimated Energy of most likely preamble + @param max_preamble_delay Estimated Delay of most likely preamble @param Nf System frame number @param tdd_mapindex Index of PRACH resource in Table 5.7.1-4 (TDD) + @param br_flag indicator to act on eMTC PRACH @returns 0 on success */ -void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_energy_list, uint16_t *preamble_delay_list, uint16_t Nf, uint8_t tdd_mapindex); - +void rx_prach(PHY_VARS_eNB *phy_vars_eNB,RU_t *ru, + uint16_t *max_preamble, + uint16_t *max_preamble_energy, + uint16_t *max_preamble_delay, +#ifdef Rel14 + uint16_t Nf, uint8_t tdd_mapindex, + uint8_t br_flag +#else + uint16_t Nf, uint8_t tdd_mapindex +#endif + ); /*! \brief Helper for MAC, returns number of available PRACH in TDD for a particular configuration index @param frame_parms Pointer to LTE_DL_FRAME_PARMS structure @returns 0-5 depending on number of available prach */ -uint8_t get_num_prach_tdd(LTE_DL_FRAME_PARMS *frame_parms); +uint8_t get_num_prach_tdd(module_id_t Mod_id); /*! \brief Return the PRACH format as a function of the Configuration Index and Frame type. @@ -1731,19 +2178,30 @@ uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type); @param frame_parms Pointer to LTE_DL_FRAME_PARMS structure @returns 0-5 depending on number of available prach */ -uint8_t get_fid_prach_tdd(LTE_DL_FRAME_PARMS *frame_parms,uint8_t tdd_map_index); +uint8_t get_fid_prach_tdd(module_id_t Mod_id,uint8_t tdd_map_index); /*! \brief Comp ute DFT of PRACH ZC sequences. Used for generation of prach in UE and reception of PRACH in eNB. - @param prach_config_common Pointer to prachConfigCommon structure + @param rootSequenceIndex PRACH root sequence + #param prach_ConfigIndex PRACH Configuration Index + @param zeroCorrelationZoneConfig PRACH ncs_config + @param highSpeedFlat PRACH High-Speed Flag + @param frame_type TDD/FDD flag @param Xu DFT output */ -void compute_prach_seq(PRACH_CONFIG_COMMON *prach_config_common, - lte_frame_type_t frame_type, - uint32_t X_u[64][839]); +void compute_prach_seq(uint16_t rootSequenceIndex, + uint8_t prach_ConfigIndex, + uint8_t zeroCorrelationZoneConfig, + uint8_t highSpeedFlag, + lte_frame_type_t frame_type, + uint32_t X_u[64][839]); + void init_prach_tables(int N_ZC); +void init_unscrambling_lut(void); +void init_scrambling_lut(void); + /*! \brief Return the status of MBSFN in this frame/subframe @param frame Frame index @@ -1755,6 +2213,8 @@ int is_pmch_subframe(frame_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parm uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2ndpilots); +uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode); + uint32_t dlsch_decoding_abstraction(double *dlsch_MIPB, LTE_DL_FRAME_PARMS *lte_frame_parms, LTE_UE_DLSCH_t *dlsch, @@ -1766,16 +2226,19 @@ double get_pa_dB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated); double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, LTE_eNB_DLSCH_t *dlsch_eNB, - int dl_power_off); + int dl_power_off, + uint8_t n_antenna_port); double computeRhoB_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, PDSCH_CONFIG_COMMON *pdsch_config_common, uint8_t n_antenna_port, - LTE_eNB_DLSCH_t *dlsch_eNB,int dl_power_off); + LTE_eNB_DLSCH_t *dlsch_eNB, + int dl_power_off); double computeRhoA_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, LTE_UE_DLSCH_t *dlsch_ue, - uint8_t dl_power_off); + uint8_t dl_power_off, + uint8_t n_antenna_port); double computeRhoB_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, PDSCH_CONFIG_COMMON *pdsch_config_common, @@ -1789,9 +2252,19 @@ double computeRhoB_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated, LTE_UE_DLSCH_t *dlsch_ue); */ -uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms, uint8_t tdd_mapindex, uint16_t Nf); +uint8_t get_prach_prb_offset(LTE_DL_FRAME_PARMS *frame_parms, + uint8_t prach_ConfigIndex, + uint8_t n_ra_prboffset, + uint8_t tdd_mapindex, uint16_t Nf); uint8_t ul_subframe2pdcch_alloc_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n); + +int8_t find_dlsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type); + +int8_t find_ulsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type); + +int8_t find_uci(uint16_t rnti, int frame, int subframe, PHY_VARS_eNB *eNB,find_type_t type); + /**@}*/ #endif diff --git a/openair1/PHY/LTE_TRANSPORT/pss.c b/openair1/PHY/LTE_TRANSPORT/pss.c index e2a4c549da..c746a331db 100644 --- a/openair1/PHY/LTE_TRANSPORT/pss.c +++ b/openair1/PHY/LTE_TRANSPORT/pss.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/pss.c * \brief Top-level routines for generating primary synchronization signal (PSS) V8.6 2009-03 @@ -76,16 +68,16 @@ int generate_pss(int32_t **txdataF, break; default: - msg("[PSS] eNb_id has to be 0,1,2\n"); + LOG_E(PHY,"[PSS] eNb_id has to be 0,1,2\n"); return(-1); } - a = (frame_parms->nb_antennas_tx == 1) ? amp: (amp*ONE_OVER_SQRT2_Q15)>>15; + a = (frame_parms->nb_antenna_ports_eNB == 1) ? amp: (amp*ONE_OVER_SQRT2_Q15)>>15; //printf("[PSS] amp=%d, a=%d\n",amp,a); Nsymb = (frame_parms->Ncp==NORMAL)?14:12; - for (aa=0; aanb_antennas_tx; aa++) { + for (aa=0; aanb_antenna_ports_eNB; aa++) { // aa = 0; // The PSS occupies the inner 6 RBs, which start at @@ -116,7 +108,7 @@ int generate_pss(int32_t **txdataF, int generate_pss_emul(PHY_VARS_eNB *phy_vars_eNb,uint8_t sect_id) { - msg("[PHY] EMUL eNB generate_pss_emul eNB %d, sect_id %d\n",phy_vars_eNb->Mod_id,sect_id); + LOG_D(PHY,"EMUL eNB generate_pss_emul eNB %d, sect_id %d\n",phy_vars_eNb->Mod_id,sect_id); eNB_transport_info[phy_vars_eNb->Mod_id][phy_vars_eNb->CC_id].cntl.pss=sect_id; return(0); } diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c index 88ce57b930..9a19b0ddaf 100644 --- a/openair1/PHY/LTE_TRANSPORT/pucch.c +++ b/openair1/PHY/LTE_TRANSPORT/pucch.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/pucch.c * \brief Top-level routines for generating and decoding the PUCCH physical channel V8.6 2009-03 @@ -38,7 +30,7 @@ * \warning */ #include "PHY/defs.h" -#include "PHY/extern.h" +#include "PHY/extern.h" #include "LAYER2/MAC/extern.h" #include "UTIL/LOG/log.h" @@ -47,7 +39,7 @@ #include "T.h" //uint8_t ncs_cell[20][7]; -//#define DEBUG_PUCCH_TX +//#define DEBUG_PUCCH_TXS //#define DEBUG_PUCCH_RX int16_t cfo_pucch_np[24*7] = {20787,-25330,27244,-18205,31356,-9512,32767,0,31356,9511,27244,18204,20787,25329, @@ -97,7 +89,7 @@ void init_ncs_cell(LTE_DL_FRAME_PARMS *frame_parms,uint8_t ncs_cell[20][7]) } #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH ncs_cell init (j %d): Ns %d, l %d => ncs_cell %d\n",j,ns,l,ncs_cell[ns][l]); + printf("[PHY] PUCCH ncs_cell init (j %d): Ns %d, l %d => ncs_cell %d\n",j,ns,l,ncs_cell[ns][l]); #endif } @@ -121,19 +113,205 @@ int16_t W3_im[3][6] = {{0 ,0 ,0 }, {0 ,-28378, 28377} }; -char pucch_format_string[6][20] = {"format 1\0","format 1a\0","format 1b\0","format 2\0","format 2a\0","format 2b\0"}; +char *pucch_format_string[] = { + "format 1", + "format 1a", + "format 1b", + "pucch_format1b_csA2", + "pucch_format1b_csA3", + "pucch_format1b_csA4", + "format 2", + "format 2a", + "format 2b", + "pucch_format3" +}; -void generate_pucch(int32_t **txdataF, - LTE_DL_FRAME_PARMS *frame_parms, - uint8_t ncs_cell[20][7], - PUCCH_FMT_t fmt, - PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, - uint16_t n1_pucch, - uint16_t n2_pucch, - uint8_t shortened_format, - uint8_t *payload, - int16_t amp, - uint8_t subframe) +/* PUCCH format3 >> */ +#define D_I 0 +#define D_Q 1 +#define D_IQDATA 2 +#define D_NSLT1SF 2 +#define D_NSYM1SLT 7 +#define D_NSYM1SF 2*7 +#define D_NSC1RB 12 +#define D_NRB1PUCCH 2 +#define D_NPUCCH_SF5 5 +#define D_NPUCCH_SF4 4 + +uint8_t chcod_tbl[128][48] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1}, + {0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0}, + {0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0}, + {1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1}, + {1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1}, + {0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0}, + {0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0}, + {1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1}, + {1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1}, + {0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0}, + {0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0}, + {1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1}, + {1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1}, + {0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0}, + {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1}, + {1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0}, + {1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0}, + {0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1}, + {0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1}, + {1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0}, + {1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0}, + {0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1}, + {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1}, + {1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0}, + {1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0}, + {0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1}, + {0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1}, + {1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, + {1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0}, + {0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, + {1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0}, + {0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1}, + {0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1}, + {1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0}, + {1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0}, + {0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1}, + {0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1}, + {1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0}, + {1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0}, + {0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1}, + {0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1}, + {1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0}, + {1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0}, + {0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1}, + {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, + {1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}, + {1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1}, + {0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0}, + {0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0}, + {1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1}, + {1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1}, + {0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0}, + {1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1}, + {1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1}, + {0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0}, + {0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, + {1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1}, + {1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1}, + {0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0}, + {0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1}, + {1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0}, + {1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0}, + {0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1}, + {0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, + {1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, + {1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0}, + {0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1}, + {0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1}, + {1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0}, + {1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0}, + {0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1}, + {0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1}, + {1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0}, + {1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0}, + {0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1}, + {0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0}, + {1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1}, + {1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1}, + {0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0}, + {0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0}, + {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1}, + {1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1}, + {0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0}, + {0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0}, + {1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1}, + {1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1}, + {0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0}, + {0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0}, + {1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1}, + {1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1}, + {0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0}, + {0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0}, + {1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1}, + {1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1}, + {0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0}, + {0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0}, + {1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1}, + {1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1}, + {0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0}, + {0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0}, + {1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1}, + {1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1}, + {0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0}, + {0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0}, + {1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1}, + {1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1}, + {0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0}, + {0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1}, + {1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0}, + {1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0}, + {0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1}, + {0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, + {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0}, + {1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0}, + {0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1}, + {0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1}, + {1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0}, + {1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0}, + {0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1}, + {0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1}, + {1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0}, + {1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0}, + {0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1} }; + +// W5_TBL +int16_t W5_fmt3_re[5][5] = { {32767, 32767, 32767, 32767, 32767}, + {32767, 10125, -26509, -26509, 10125}, + {32767, -26509, 10125, 10125, -26509}, + {32767, -26509, 10125, 10125, -26509}, + {32767, 10125, -26509, -26509, 10125} }; + +int16_t W5_fmt3_im[5][5] = { {0, 0, 0, 0, 0}, + {0, 31163, 19259, -19259, -31163}, + {0, 19259, -31163, 31163, -19259}, + {0, -19259, 31163, -31163, 19259}, + {0, -31163, -19259, 19259, 31163} }; + +int16_t W4_fmt3[4][4] = { {32767, 32767, 32767, 32767}, + {32767, -32767, 32767, -32767}, + {32767, 32767, -32767, -32767}, + {32767, -32767, -32767, 32767} }; + +// W2 TBL +int16_t W2[2] = {32767, 32767}; + +// e^j*pai*floor (ncs_cell(ns,l)/64)/2 +int16_t RotTBL_re[4] = {32767, 0, -32767, 0}; +int16_t RotTBL_im[4] = {0, 32767, 0, -32767}; + +//np4_tbl, np5_tbl +uint8_t Np5_TBL[5] = {0, 3, 6, 8, 10}; +uint8_t Np4_TBL[4] = {0, 3, 6, 9}; + +// alpha_TBL +int16_t alphaTBL_re[12] = {32767, 28377, 16383, 0, -16383, -28377, -32767, -28377, -16383, 0, 16383, 28377}; +int16_t alphaTBL_im[12] = {0, 16383, 28377, 32767, 28377, 16383, 0, -16383, -28377, -32767, -28377, -16383}; + +/* PUCCH format3 << */ + +void generate_pucch1x(int32_t **txdataF, + LTE_DL_FRAME_PARMS *frame_parms, + uint8_t ncs_cell[20][7], + PUCCH_FMT_t fmt, + PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, + uint16_t n1_pucch, + uint8_t shortened_format, + uint8_t *payload, + int16_t amp, + uint8_t subframe) { uint32_t u,v,n; @@ -152,7 +330,11 @@ void generate_pucch(int32_t **txdataF, uint8_t deltaPUCCH_Shift = frame_parms->pucch_config_common.deltaPUCCH_Shift; uint8_t NRB2 = frame_parms->pucch_config_common.nRB_CQI; - uint8_t Ncs1_div_deltaPUCCH_Shift = frame_parms->pucch_config_common.nCS_AN; + uint8_t Ncs1 = frame_parms->pucch_config_common.nCS_AN; + uint8_t Ncs1_div_deltaPUCCH_Shift = Ncs1/deltaPUCCH_Shift; + + LOG_D(PHY,"generate_pucch Start [deltaPUCCH_Shift %d, NRB2 %d, Ncs1_div_deltaPUCCH_Shift %d, n1_pucch %d]\n", deltaPUCCH_Shift, NRB2, Ncs1_div_deltaPUCCH_Shift,n1_pucch); + uint32_t u0 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]) % 30; uint32_t u1 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30; @@ -160,12 +342,12 @@ void generate_pucch(int32_t **txdataF, uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; if ((deltaPUCCH_Shift==0) || (deltaPUCCH_Shift>3)) { - msg("[PHY] generate_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift); + printf("[PHY] generate_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift); return; } if (Ncs1_div_deltaPUCCH_Shift > 7) { - msg("[PHY] generate_pucch: Illegal Ncs1_div_deltaPUCCH_Shift %d (should be 0...7)\n",Ncs1_div_deltaPUCCH_Shift); + printf("[PHY] generate_pucch: Illegal Ncs1_div_deltaPUCCH_Shift %d (should be 0...7)\n",Ncs1_div_deltaPUCCH_Shift); return; } @@ -175,9 +357,14 @@ void generate_pucch(int32_t **txdataF, Nprime = Nprime_div_deltaPUCCH_Shift * deltaPUCCH_Shift; #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch); + printf("[PHY] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch); #endif + LOG_D(PHY,"[PHY] PUCCH: n1_pucch %d, thres %d Ncs1_div_deltaPUCCH_Shift %d (12/deltaPUCCH_Shift) %d Nprime_div_deltaPUCCH_Shift %d \n", + n1_pucch, thres, Ncs1_div_deltaPUCCH_Shift, (int)(12/deltaPUCCH_Shift), Nprime_div_deltaPUCCH_Shift); + LOG_D(PHY,"[PHY] PUCCH: deltaPUCCH_Shift %d, Nprime %d\n",deltaPUCCH_Shift,Nprime); + + N_UL_symb = (frame_parms->Ncp==0) ? 7 : 6; if (n1_pucch < thres) @@ -190,11 +377,14 @@ void generate_pucch(int32_t **txdataF, else { d = (frame_parms->Ncp==0) ? 2 : 0; h= (nprime0+d)%(c*Nprime_div_deltaPUCCH_Shift); +#ifdef DEBUG_PUCCH_TX + printf("[PHY] PUCCH: h %d, d %d\n",h,d); +#endif nprime1 = (h/c) + (h%c)*Nprime_div_deltaPUCCH_Shift; } #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH: nprime0 %d nprime1 %d, %s, payload (%d,%d)\n",nprime0,nprime1,pucch_format_string[fmt],payload[0],payload[1]); + printf("[PHY] PUCCH: nprime0 %d nprime1 %d, %s, payload (%d,%d)\n",nprime0,nprime1,pucch_format_string[fmt],payload[0],payload[1]); #endif n_oc0 = nprime0/Nprime_div_deltaPUCCH_Shift; @@ -208,7 +398,7 @@ void generate_pucch(int32_t **txdataF, n_oc1<<=1; #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1); + printf("[PHY] PUCCH: noc0 %d noc1 %d\n",n_oc0,n_oc1); #endif nprime=nprime0; @@ -280,7 +470,7 @@ void generate_pucch(int32_t **txdataF, } #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs); + printf("[PHY] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs); #endif alpha_ind=0; // compute output sequence @@ -327,18 +517,20 @@ void generate_pucch(int32_t **txdataF, } break; - + case pucch_format1b_csA2: + case pucch_format1b_csA3: + case pucch_format1b_csA4: + AssertFatal(1==0,"PUCCH format 1b_csX not supported yet\n"); + break; case pucch_format2: - msg("[PHY] PUCCH format 2 not implemented\n"); - break; - case pucch_format2a: - msg("[PHY] PUCCH format 2a not implemented\n"); + case pucch_format2b: + AssertFatal(1==0,"should not go here\n"); break; - case pucch_format2b: - msg("[PHY] PUCCH format 2b not implemented\n"); - break; + case pucch_format3: + fprintf(stderr, "PUCCH format 3 not handled\n"); + abort(); } // switch fmt } else { // These are PUCCH reference symbols @@ -348,7 +540,7 @@ void generate_pucch(int32_t **txdataF, } #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,((int16_t *)&zptr[n])[0],((int16_t *)&zptr[n])[1], + printf("[PHY] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,((int16_t *)&zptr[n])[0],((int16_t *)&zptr[n])[1], alpha_ind,alpha_re[alpha_ind],alpha_im[alpha_ind]); #endif alpha_ind = (alpha_ind + n_cs)%12; @@ -366,13 +558,12 @@ void generate_pucch(int32_t **txdataF, m = (n1_pucch < thres) ? NRB2 : (((n1_pucch-thres)/(12*c/deltaPUCCH_Shift))+NRB2+((deltaPUCCH_Shift*Ncs1_div_deltaPUCCH_Shift)>>3)+rem); #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH: m %d\n",m); + printf("[PHY] PUCCH: m %d\n",m); #endif nsymb = N_UL_symb<<1; //for (j=0,l=0;l<(nsymb-1);l++) { for (j=0,l=0; l<(nsymb); l++) { - if ((l<(nsymb>>1)) && ((m&1) == 0)) re_offset = (m*6) + frame_parms->first_carrier_offset; else if ((l<(nsymb>>1)) && ((m&1) == 1)) @@ -395,47 +586,1205 @@ void generate_pucch(int32_t **txdataF, re_offset = 0; #ifdef DEBUG_PUCCH_TX - msg("[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]); + printf("[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]); #endif } } } -void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue, +void generate_pucch_emul(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, PUCCH_FMT_t format, uint8_t ncs1, uint8_t *pucch_payload, - uint8_t sr, - uint8_t subframe) + uint8_t sr) + { - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_flag = format; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_Ncs1 = ncs1; + int subframe = proc->subframe_tx; + + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_flag = format; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_Ncs1 = ncs1; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.sr = sr; - // the value of phy_vars_ue->pucch_sel[subframe] is set by get_n1_pucch - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_sel = phy_vars_ue->pucch_sel[subframe]; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.sr = sr; + // the value of ue->pucch_sel[subframe] is set by get_n1_pucch + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_sel = ue->pucch_sel[subframe]; - // LOG_I(PHY,"subframe %d emu tx pucch_sel is %d sr is %d \n", subframe, UE_transport_info[phy_vars_ue->Mod_id].cntl.pucch_sel, sr); + // LOG_I(PHY,"subframe %d emu tx pucch_sel is %d sr is %d \n", subframe, UE_transport_info[ue->Mod_id].cntl.pucch_sel, sr); if (format == pucch_format1a) { - phy_vars_ue->pucch_payload[0] = pucch_payload[0]; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_payload = pucch_payload[0]; + ue->pucch_payload[0] = pucch_payload[0]; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_payload = pucch_payload[0]; } else if (format == pucch_format1b) { - phy_vars_ue->pucch_payload[0] = pucch_payload[0] + (pucch_payload[1]<<1); - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pucch_payload = pucch_payload[0] + (pucch_payload[1]<<1); + ue->pucch_payload[0] = pucch_payload[0] + (pucch_payload[1]<<1); + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_payload = pucch_payload[0] + (pucch_payload[1]<<1); } else if (format == pucch_format1) { - LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,sr); + // LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",ue->Mod_id,proc->frame_tx,subframe,sr); } - phy_vars_ue->sr[subframe] = sr; + ue->sr[subframe] = sr; } -uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, + +inline void pucch2x_scrambling(LTE_DL_FRAME_PARMS *fp,int subframe,uint16_t rnti,uint32_t B,uint8_t *btilde) __attribute__((always_inline)); +inline void pucch2x_scrambling(LTE_DL_FRAME_PARMS *fp,int subframe,uint16_t rnti,uint32_t B,uint8_t *btilde) { + + uint32_t x1, x2, s=0; + int i; + uint8_t c; + + x2 = (rnti) + ((uint32_t)(1+subframe)<<16)*(1+(fp->Nid_cell<<1)); //this is c_init in 36.211 Sec 6.3.1 + s = lte_gold_generic(&x1, &x2, 1); + for (i=0;i<19;i++) { + c = (uint8_t)((s>>i)&1); + btilde[i] = (((B>>i)&1) ^ c); + } +} + +inline void pucch2x_modulation(uint8_t *btilde,int16_t *d,int16_t amp) __attribute__((always_inline)); +inline void pucch2x_modulation(uint8_t *btilde,int16_t *d,int16_t amp) { + + int i; + + for (i=0;i<20;i++) + d[i] = btilde[i] == 1 ? -amp : amp; + +} + + + +uint32_t pucch_code[13] = {0xFFFFF,0x5A933,0x10E5A,0x6339C,0x73CE0, + 0xFFC00,0xD8E64,0x4F6B0,0x218EC,0x1B746, + 0x0FFFF,0x33FFF,0x3FFFC}; + + +void generate_pucch2x(int32_t **txdataF, + LTE_DL_FRAME_PARMS *fp, + uint8_t ncs_cell[20][7], + PUCCH_FMT_t fmt, + PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, + uint16_t n2_pucch, + uint8_t *payload, + int A, + int B2, + int16_t amp, + uint8_t subframe, + uint16_t rnti) { + + int i,j; + uint32_t B=0; + uint8_t btilde[20]; + int16_t d[22]; + uint8_t deltaPUCCH_Shift = fp->pucch_config_common.deltaPUCCH_Shift; + uint8_t NRB2 = fp->pucch_config_common.nRB_CQI; + uint8_t Ncs1 = fp->pucch_config_common.nCS_AN; + + uint32_t u0 = fp->pucch_config_common.grouphop[subframe<<1]; + uint32_t u1 = fp->pucch_config_common.grouphop[1+(subframe<<1)]; + uint32_t v0 = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1]; + uint32_t v1 = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; + + uint32_t z[12*14],*zptr; + uint32_t u,v,n; + uint8_t ns,N_UL_symb,nsymb_slot0,nsymb_pertti; + uint32_t nprime,l,n_cs; + int alpha_ind,data_ind; + int16_t ref_re,ref_im; + int m,re_offset,symbol_offset; + int32_t *txptr; + + if ((deltaPUCCH_Shift==0) || (deltaPUCCH_Shift>3)) { + printf("[PHY] generate_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift); + return; + } + + if (Ncs1 > 7) { + printf("[PHY] generate_pucch: Illegal Ncs1 %d (should be 0...7)\n",Ncs1); + return; + } + + // pucch2x_encoding + for (i=0;i 0) + B=B^pucch_code[i]; + + // scrambling + pucch2x_scrambling(fp,subframe,rnti,B,btilde); + // modulation + pucch2x_modulation(btilde,d,amp); + + // add extra symbol for 2a/2b + d[20]=0; + d[21]=0; + if (fmt==pucch_format2a) + d[20] = (B2 == 0) ? amp : -amp; + else if (fmt==pucch_format2b) { + switch (B2) { + case 0: + d[20] = amp; + break; + case 1: + d[21] = -amp; + break; + case 2: + d[21] = amp; + break; + case 3: + d[20] = -amp; + break; + default: + AssertFatal(1==0,"Illegal modulation symbol %d for PUCCH %s\n",B2,pucch_format_string[fmt]); + break; + } + } + + +#ifdef DEBUG_PUCCH_TX + printf("[PHY] PUCCH2x: n2_pucch %d\n",n2_pucch); +#endif + + N_UL_symb = (fp->Ncp==0) ? 7 : 6; + data_ind = 0; + zptr = z; + nprime = 0; + for (ns=(subframe<<1),u=u0,v=v0; ns<(2+(subframe<<1)); ns++,u=u1,v=v1) { + + if ((ns&1) == 0) + nprime = (n2_pucch < 12*NRB2) ? + n2_pucch % 12 : + (n2_pucch+Ncs1 + 1)%12; + else { + nprime = (n2_pucch < 12*NRB2) ? + ((12*(nprime+1)) % 13)-1 : + (10-n2_pucch)%12; + } + //loop over symbols in slot + for (l=0; l>15); + ref_im = (int16_t)(((int32_t)alpha_re[alpha_ind] * ul_ref_sigs[u][v][0][1+(n<<1)] + (int32_t)alpha_im[alpha_ind] * ul_ref_sigs[u][v][0][n<<1])>>15); + + if ((l!=1)&&(l!=5)) { //these are PUCCH data symbols + ((int16_t *)&zptr[n])[0] = ((int32_t)d[data_ind]*ref_re - (int32_t)d[data_ind+1]*ref_im)>>15; + ((int16_t *)&zptr[n])[1] = ((int32_t)d[data_ind]*ref_im + (int32_t)d[data_ind+1]*ref_re)>>15; + //LOG_I(PHY,"slot %d ofdm# %d ==> d[%d,%d] \n",ns,l,data_ind,n); + } + else { + if ((l==1) || ( (l==5) && (fmt==pucch_format2) )) + { + ((int16_t *)&zptr[n])[0] = ((int32_t)amp*ref_re>>15); + ((int16_t *)&zptr[n])[1] = ((int32_t)amp*ref_im>>15); + } + // l == 5 && pucch format 2a + else if (fmt==pucch_format2a) + { + ((int16_t *)&zptr[n])[0] = ((int32_t)d[20]*ref_re>>15); + ((int16_t *)&zptr[n])[1] = ((int32_t)d[21]*ref_im>>15); + } + // l == 5 && pucch format 2b + else if (fmt==pucch_format2b) + { + ((int16_t *)&zptr[n])[0] = ((int32_t)d[20]*ref_re>>15); + ((int16_t *)&zptr[n])[1] = ((int32_t)d[21]*ref_im>>15); + } + } // l==1 || l==5 + alpha_ind = (alpha_ind + n_cs)%12; + } // n + zptr+=12; + + if ((l!=1)&&(l!=5)) //these are PUCCH data symbols so increment data index + data_ind+=2; + } // l + } //ns + + m = n2_pucch/12; + +#ifdef DEBUG_PUCCH_TX + LOG_D(PHY,"[PHY] PUCCH: n2_pucch %d m %d\n",n2_pucch,m); +#endif + + nsymb_slot0 = ((fp->Ncp==0) ? 7 : 6); + nsymb_pertti = nsymb_slot0 << 1; + + //nsymb = nsymb_slot0<<1; + + //for (j=0,l=0;l<(nsymb-1);l++) { + for (j=0,l=0; l<(nsymb_pertti); l++) { + + if ((lfirst_carrier_offset; + else if ((lfirst_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12; + else if ((m&1) == 0) + re_offset = fp->first_carrier_offset + (fp->N_RB_DL - (m>>1) - 1)*12; + else + re_offset = ((m-1)*6) + fp->first_carrier_offset; + + if (re_offset > fp->ofdm_symbol_size) + re_offset -= (fp->ofdm_symbol_size); + + + + symbol_offset = (unsigned int)fp->ofdm_symbol_size*(l+(subframe*nsymb_pertti)); + txptr = &txdataF[0][symbol_offset]; + + //LOG_I(PHY,"ofdmSymb %d/%d, firstCarrierOffset %d, symbolOffset[sfn %d] %d, reOffset %d, &txptr: %x \n", l, nsymb, fp->first_carrier_offset, subframe, symbol_offset, re_offset, &txptr[0]); + + for (i=0; i<12; i++,j++) { + txptr[re_offset] = z[j]; + + re_offset++; + + if (re_offset==fp->ofdm_symbol_size) + re_offset -= (fp->ofdm_symbol_size); + +#ifdef DEBUG_PUCCH_TX + LOG_D(PHY,"[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]); +#endif + } + } +} + +/* PUCCH format3 >> */ +/* DFT */ +void pucchfmt3_Dft( int16_t *x, int16_t *y ) +{ + int16_t i, k; + int16_t tmp[2]; + int16_t calctmp[D_NSC1RB*2]={0}; + + for (i=0; i>15); + calctmp[2*i+1] += (((int32_t)x[2*k+1] * tmp[0] + (int32_t)x[2*k] * tmp[1])>>15); + } + y[2*i] = (int16_t)( (double) calctmp[2*i] / sqrt(D_NSC1RB)); + y[2*i+1] = (int16_t)((double) calctmp[2*i+1] / sqrt(D_NSC1RB)); + } +} + +void generate_pucch3x(int32_t **txdataF, + LTE_DL_FRAME_PARMS *frame_parms, + uint8_t ncs_cell[20][7], + PUCCH_FMT_t fmt, + PUCCH_CONFIG_DEDICATED *pucch_config_dedicated, + uint16_t n3_pucch, + uint8_t shortened_format, + uint8_t *payload, + int16_t amp, + uint8_t subframe, + uint16_t rnti) +{ + + uint32_t u, v; + uint16_t i, j, re_offset; + uint32_t z[12*14], *zptr; + uint32_t y_tilda[12*14]={}, *y_tilda_ptr; + uint8_t ns, nsymb, n_oc, n_oc0, n_oc1; + uint8_t N_UL_symb = (frame_parms->Ncp==0) ? 7 : 6; + uint8_t m, l; + uint8_t n_cs; + int16_t tmp_re, tmp_im, W_re=0, W_im=0; + int32_t *txptr; + uint32_t symbol_offset; + + uint32_t u0 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]) % 30; + uint32_t u1 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30; + uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1]; + uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; + + // variables for channel coding + uint8_t chcod_tbl_idx = 0; + //uint8_t chcod_dt[48] = {}; + + // variables for Scrambling + uint32_t cinit = 0; + uint32_t x1; + uint32_t s,s0,s1; + uint8_t C[48] ={}; + uint8_t scr_dt[48]={}; + + // variables for Modulation + int16_t d_re[24]={}; + int16_t d_im[24]={}; + + // variables for orthogonal sequence selection + uint8_t N_PUCCH_SF0 = 5; + uint8_t N_PUCCH_SF1 = (shortened_format==0)? 5:4; + uint8_t first_slot = 0; + int16_t rot_re=0; + int16_t rot_im=0; + + uint8_t dt_offset; + uint8_t sym_offset; + int16_t y_re[14][12]; //={0}; + int16_t y_im[14][12]; //={0}; + + // DMRS + uint8_t alpha_idx=0; + uint8_t m_alpha_idx=0; + + // TODO + // "SR+ACK/NACK" length is only 7 bits. + // This restriction will be lifted in the future. + // "CQI/PMI/RI+ACK/NACK" will be supported in the future. + + // Channel Coding + for (uint8_t i=0; i<7; i++) { + chcod_tbl_idx += (payload[i]<Nid_cell + 1)<<16) + rnti; + s0 = lte_gold_generic(&x1,&cinit,1); + s1 = lte_gold_generic(&x1,&cinit,0); + + for (i=0; i<48; i++) { + s = (i<32)? s0:s1; + j = (i<32)? i:(i-32); + C[i] = ((s>>j)&1); + } + + for (i=0; i<48; i++) { + scr_dt[i] = chcod_tbl[chcod_tbl_idx][i] ^ C[i]; + } + + // Modulation + for (uint8_t i=0; i<48; i+=2){ + if (scr_dt[i]==0 && scr_dt[i+1]==0){ + d_re[ i>>1] = ((ONE_OVER_SQRT2_Q15 * amp) >>15); + d_im[ i>>1] = ((ONE_OVER_SQRT2_Q15 * amp) >>15); + } else if (scr_dt[i]==0 && scr_dt[i+1]==1) { + d_re[ i>>1] = ((ONE_OVER_SQRT2_Q15 * amp) >>15); + d_im[ i>>1] = -1 * ((ONE_OVER_SQRT2_Q15 * amp) >>15); + } else if (scr_dt[i]==1 && scr_dt[i+1]==0) { + d_re[ i>>1] = -1 * ((ONE_OVER_SQRT2_Q15 * amp)>>15); + d_im[ i>>1] = ((ONE_OVER_SQRT2_Q15 * amp)>>15); + } else if (scr_dt[i]==1 && scr_dt[i+1]==1) { + d_re[ i>>1] = -1 * ((ONE_OVER_SQRT2_Q15 * amp)>>15); + d_im[ i>>1] = -1 * ((ONE_OVER_SQRT2_Q15 * amp)>>15); + } else { + //***log Modulation Error! + } + } + + // Calculate Orthogonal Sequence index + n_oc0 = n3_pucch % N_PUCCH_SF1; + if (N_PUCCH_SF1 == 5) { + n_oc1 = (3 * n_oc0) % N_PUCCH_SF1; + } else { + n_oc1 = n_oc0 % N_PUCCH_SF1; + } + + y_tilda_ptr = y_tilda; + zptr = z; + + // loop over 2 slots + for (ns=(subframe<<1), u=u0, v=v0; ns<(2+(subframe<<1)); ns++, u=u1, v=v1) { + first_slot = (ns==(subframe<<1))?1:0; + + //loop over symbols in slot + for (l=0; l=2 && l<5) { // data + W_re=W4_fmt3[n_oc][l-1]; + W_im=0; + } else if (l==5) { // DMRS + W_re=W2[1]; + W_im=0; + } else if ((l>=N_UL_symb-2)) { // data + ; + } else { + //***log W Select Error! + } + } else { + if (first_slot == 1) { // 1st slot or 2nd slot and not shortened + n_oc=n_oc0; + } else { + n_oc=n_oc1; + } + + if (l<1) { // data + W_re=W5_fmt3_re[n_oc][l]; + W_im=W5_fmt3_im[n_oc][l]; + } else if (l==1) { // DMRS + W_re=W2[0]; + W_im=0; + } else if (l>=2 && l<5) { // data + W_re=W5_fmt3_re[n_oc][l-1]; + W_im=W5_fmt3_im[n_oc][l-1]; + } else if (l==5) { // DMRS + W_re=W2[1]; + W_im=0; + } else if ((l>=N_UL_symb-1)) { // data + W_re=W5_fmt3_re[n_oc][l-N_UL_symb+5]; + W_im=W5_fmt3_im[n_oc][l-N_UL_symb+5]; + } else { + //***log W Select Error! + } + } // W Selection end + + // Compute n_cs (36.211 p. 18) + n_cs = ncs_cell[ns][l]; + if (N_PUCCH_SF1 == 5) { + alpha_idx = (n_cs + Np5_TBL[n_oc]) % 12; + } else { + alpha_idx = (n_cs + Np4_TBL[n_oc]) % 12; + } + + // generate pucch data + dt_offset = (first_slot == 1) ? 0:12; + sym_offset = (first_slot == 1) ? 0:7; + + for (i=0; i<12; i++) { + // Calculate yn(i) + tmp_re = (((int32_t) (W_re*rot_re - W_im*rot_im)) >>15); + tmp_im = (((int32_t) (W_re*rot_im + W_im*rot_re)) >>15); + y_re[l+sym_offset][i] = (((int32_t) (tmp_re*d_re[i+dt_offset] - tmp_im*d_im[i+dt_offset]))>>15); + y_im[l+sym_offset][i] = (((int32_t) (tmp_re*d_im[i+dt_offset] + tmp_im*d_re[i+dt_offset]))>>15); + + // cyclic shift + ((int16_t *)&y_tilda_ptr[(l+sym_offset)*12+(i-(ncs_cell[ns][l]%12)+12)%12])[0] = y_re[l+sym_offset][i]; + ((int16_t *)&y_tilda_ptr[(l+sym_offset)*12+(i-(ncs_cell[ns][l]%12)+12)%12])[1] = y_im[l+sym_offset][i]; + + // DMRS + m_alpha_idx = (alpha_idx * i) % 12; + if (l==1 || l==5) { + ((int16_t *)&zptr[(l+sym_offset)*12+i])[0] =(((((int32_t) alphaTBL_re[m_alpha_idx]*ul_ref_sigs[u][v][0][i<<1] - (int32_t) alphaTBL_im[m_alpha_idx] * ul_ref_sigs[u][v][0][1+(i<<1)])>>15) * (int32_t)amp)>>15); + ((int16_t *)&zptr[(l+sym_offset)*12+i])[1] =(((((int32_t) alphaTBL_re[m_alpha_idx]*ul_ref_sigs[u][v][0][1+(i<<1)] + (int32_t) alphaTBL_im[m_alpha_idx] * ul_ref_sigs[u][v][0][i<<1])>>15) * (int32_t)amp)>>15); + } + } + + } // l loop + } // ns + + // DFT for pucch-data + for (l=0; l<14; l++) { + if (l==1 || l==5 || l==8 || l==12) { + ; + } else { + pucchfmt3_Dft((int16_t*)&y_tilda_ptr[l*12],(int16_t*)&zptr[l*12]); + } + } + + + // Mapping + m = n3_pucch / N_PUCCH_SF0; + + if (shortened_format == 1) { + nsymb = (N_UL_symb<<1) - 1; + } else { + nsymb = (N_UL_symb<<1); + } + + for (j=0,l=0; l<(nsymb); l++) { + + if ((l<7) && ((m&1) == 0)) + re_offset = (m*6) + frame_parms->first_carrier_offset; + else if ((l<7) && ((m&1) == 1)) + re_offset = frame_parms->first_carrier_offset + (frame_parms->N_RB_DL - (m>>1) - 1)*12; + else if ((m&1) == 0) + re_offset = frame_parms->first_carrier_offset + (frame_parms->N_RB_DL - (m>>1) - 1)*12; + else + re_offset = ((m-1)*6) + frame_parms->first_carrier_offset; + + if (re_offset > frame_parms->ofdm_symbol_size) + re_offset -= (frame_parms->ofdm_symbol_size); + + symbol_offset = (unsigned int)frame_parms->ofdm_symbol_size*(l+(subframe*14)); + txptr = &txdataF[0][symbol_offset]; + + for (i=0; i<12; i++,j++) { + txptr[re_offset++] = z[j]; + + if (re_offset==frame_parms->ofdm_symbol_size) + re_offset = 0; + +#ifdef DEBUG_PUCCH_TX + msg("[PHY] PUCCH subframe %d (%d,%d,%d,%d) => %d,%d\n",subframe,l,i,re_offset-1,m,((int16_t *)&z[j])[0],((int16_t *)&z[j])[1]); +#endif + } + } + +} + +/* PUCCH format3 << */ + + +//#define Amax 13 +//void init_pucch2x_rx() {}; + + +/* PUCCH format3 >> */ +/* SubCarrier Demap */ +uint16_t pucchfmt3_subCarrierDeMapping( PHY_VARS_eNB *eNB, + int16_t SubCarrierDeMapData[NB_ANTENNAS_RX][14][12][2], + uint16_t n3_pucch ) +{ + LTE_eNB_COMMON *eNB_common_vars = &eNB->common_vars; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + int16_t *rxptr; + uint8_t N_UL_symb = D_NSYM1SLT; // only Normal CP format + uint16_t m; // Mapping to physical resource blocks(m) + uint32_t aa; + uint16_t k, l; + uint32_t symbol_offset; + uint16_t carrier_offset; + + + m = n3_pucch / D_NPUCCH_SF5; + + // Do detection + for (aa=0; aanb_antennas_rx; aa++) { + + for (l=0; lfirst_carrier_offset; + else if ((lfirst_carrier_offset + (frame_parms->N_RB_DL - (m>>1) - 1)*12; + else if ((m&1) == 0) + carrier_offset = frame_parms->first_carrier_offset + (frame_parms->N_RB_DL - (m>>1) - 1)*12; + else + carrier_offset = (((m-1)*6) + frame_parms->first_carrier_offset); + + if (carrier_offset > frame_parms->ofdm_symbol_size) + carrier_offset -= (frame_parms->ofdm_symbol_size); + + symbol_offset = (unsigned int)frame_parms->ofdm_symbol_size*l; + rxptr = (int16_t *)&eNB_common_vars->rxdataF[aa][symbol_offset]; + + for (k=0; k<12; k++,carrier_offset++) { + SubCarrierDeMapData[aa][l][k][0] = (int16_t)rxptr[carrier_offset<<1]; // DeMapping Data I + SubCarrierDeMapData[aa][l][k][1] = (int16_t)rxptr[1+(carrier_offset<<1)]; // DeMapping Date Q + + if (carrier_offset==frame_parms->ofdm_symbol_size) + carrier_offset = 0; + + /* #ifdef DEBUG_PUCCH_RX + LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d,%d) : (%d,%d)\n",subframe,l,k,carrier_offset,m, + SubCarrierDeMapData[aa][l][k][0],SubCarrierDeMapData[aa][l][k][1]); + #endif*/ + } + } + } + return 0; +} + +/* cyclic shift hopping remove */ +uint16_t pucchfmt3_Baseseq_csh_remove( int16_t SubCarrierDeMapData[NB_ANTENNAS_RX][14][12][2], + int16_t CshData_fmt3[NB_ANTENNAS_RX][14][12][2], + LTE_DL_FRAME_PARMS *frame_parms, + uint8_t subframe, + uint8_t ncs_cell[20][7] ) +{ + //int16_t calctmp_baSeq[2]; + int16_t calctmp_beta[2]; + int16_t calctmp_alphak[2]; + int16_t calctmp_SCDeMapData_alphak[2]; + int32_t n_cell_cs_div64; + int32_t n_cell_cs_modNSC_RB; + + //int32_t NSlot1subframe = D_NSLT1SF; + int32_t NSym1slot = D_NSYM1SLT; // Symbol per 1slot + int32_t NSym1subframe = D_NSYM1SF; // Symbol per 1subframe + int32_t aa, symNo, slotNo, sym, k; + + + for (aa=0; aanb_antennas_rx; aa++) { // Antenna + for (symNo=0; symNo>15); + calctmp_SCDeMapData_alphak[1] = (((int32_t)SubCarrierDeMapData[aa][symNo][k][1] * calctmp_alphak[0] - (int32_t)SubCarrierDeMapData[aa][symNo][k][0] * calctmp_alphak[1])>>15); + + // (e^(-alphar*k)*r_l,m,n,k) * e^(-beta) + CshData_fmt3[aa][symNo][k][0] = (((int32_t)calctmp_SCDeMapData_alphak[0] * calctmp_beta[0] + (int32_t)calctmp_SCDeMapData_alphak[1] * calctmp_beta[1])>>15); + CshData_fmt3[aa][symNo][k][1] = (((int32_t)calctmp_SCDeMapData_alphak[1] * calctmp_beta[0] - (int32_t)calctmp_SCDeMapData_alphak[0] * calctmp_beta[1])>>15); + } + } + } + return 0; +} + +#define MAXROW_TBL_SF5_OS_IDX (5) // Orthogonal sequence index +const int16_t TBL_3_SF5_GEN_N_DASH_NS[MAXROW_TBL_SF5_OS_IDX] = {0,3,6,8,10}; + +#define MAXROW_TBL_SF4_OS_IDX (4) // Orthogonal sequence index +const int16_t TBL_3_SF4_GEN_N_DASH_NS[MAXROW_TBL_SF4_OS_IDX] = {0,3,6,9}; + +/* Channel estimation */ +uint16_t pucchfmt3_ChannelEstimation( int16_t SubCarrierDeMapData[NB_ANTENNAS_RX][14][12][2], + double delta_theta[NB_ANTENNAS_RX][12], + int16_t ChestValue[NB_ANTENNAS_RX][2][12][2], + int16_t *Interpw, + uint8_t subframe, + uint8_t shortened_format, + LTE_DL_FRAME_PARMS *frame_parms, + uint16_t n3_pucch, + uint16_t n3_pucch_array[NUMBER_OF_UE_MAX], + uint8_t ncs_cell[20][7] ) +{ + uint32_t aa, symNo, k, slotNo, sym, i, j; + int16_t np, np_n, ip_ind; + //int16_t npucch_sf; + int16_t calctmp[2]; + int16_t BsCshData[NB_ANTENNAS_RX][D_NSYM1SF][D_NSC1RB][2]; + //int16_t delta_theta_calctmp[NB_ANTENNAS_RX][4][D_NSC1RB][2], delta_theta_comp[NB_ANTENNAS_RX][D_NSC1RB][2]; + int16_t delta_theta_comp[NB_ANTENNAS_RX][D_NSC1RB][2]; + int16_t CsData_allavg[NB_ANTENNAS_RX][14][2]; + int16_t CsData_temp[NB_ANTENNAS_RX][D_NSYM1SF][D_NSC1RB][2]; + int32_t IP_CsData_allsfavg[NB_ANTENNAS_RX][14][4][2]; + int32_t IP_allavg[D_NPUCCH_SF5]; + //int16_t temp_ch[2]; + int16_t m[NUMBER_OF_UE_MAX], m_self, same_m_number; + uint16_t n3_pucch_sameRB[NUMBER_OF_UE_MAX]; + int16_t n_oc0[NUMBER_OF_UE_MAX]; + int16_t n_oc1[NUMBER_OF_UE_MAX]; + int16_t np_n_array[2][NUMBER_OF_UE_MAX]; //Cyclic shift + uint8_t N_PUCCH_SF0 = 5; + uint8_t N_PUCCH_SF1 = (shortened_format==0)? 5:4; + + uint32_t u0 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[subframe<<1]) % 30; + uint32_t u1 = (frame_parms->Nid_cell + frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.grouphop[1+(subframe<<1)]) % 30; + uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1]; + uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; + + uint32_t u=u0; + uint32_t v=v0; + + //double d_theta[32]={0.0}; + //int32_t temp_theta[32][2]={0}; + + for (aa=0; aanb_antennas_rx; aa++) { + for (symNo=0; symNonb_antennas_rx; aa++) { + for (symNo=0; symNo>15); + BsCshData[aa][symNo][k][1] = (((int32_t)SubCarrierDeMapData[aa][symNo][k][1] * ul_ref_sigs[u][v][0][k<<1] - (int32_t)SubCarrierDeMapData[aa][symNo][k][0] * ul_ref_sigs[u][v][0][1+(k<<1)])>>15); + + if(shortened_format == 1) { + if (symNo < D_NSYM1SLT) { + np = n3_pucch % D_NPUCCH_SF4; // np = n_oc + np_n = TBL_3_SF4_GEN_N_DASH_NS[np]; // + } else { + np = n3_pucch % D_NPUCCH_SF4; // + np_n = TBL_3_SF4_GEN_N_DASH_NS[np]; // + } + //npucch_sf = D_NPUCCH_SF4;// = 4 + } else { + if (symNo < D_NSYM1SLT) { + np = n3_pucch % D_NPUCCH_SF5; + np_n = TBL_3_SF5_GEN_N_DASH_NS[np]; + } else { + np = (3 * n3_pucch) % D_NPUCCH_SF5; + np_n = TBL_3_SF5_GEN_N_DASH_NS[np]; + } + //npucch_sf = D_NPUCCH_SF5;// = 5 + } + // cyclic shift e^(-j * beta_n * k) + calctmp[0] = alphaTBL_re[(((ncs_cell[2*subframe+slotNo][sym] + np_n)%D_NSC1RB)*k)%12]; + calctmp[1] = alphaTBL_im[(((ncs_cell[2*subframe+slotNo][sym] + np_n)%D_NSC1RB)*k)%12]; + + // Channel Estimation 1A, g'(n_cs)_l,m,n + // CsData_temp = g_l,m,n,k + // remove cyclic shift BsCshData * e^(-j * beta_n * k) + CsData_temp[aa][symNo][k][0]=((((int32_t)BsCshData[aa][symNo][k][0] * calctmp[0] + (int32_t)BsCshData[aa][symNo][k][1] * calctmp[1])/ D_NSC1RB)>>15); + CsData_temp[aa][symNo][k][1]=((((int32_t)BsCshData[aa][symNo][k][1] * calctmp[0] - (int32_t)BsCshData[aa][symNo][k][0] * calctmp[1])/ D_NSC1RB)>>15); + + // Interference power for Channel Estimation 1A, No use Cyclic Shift g'(n_cs)_l,m,n + // Calculated by the cyclic shift that is not used S(ncs)_est + ip_ind = 0; + for(i=0; i>15); + IP_CsData_allsfavg[aa][symNo][ip_ind][1] += ((((int32_t)BsCshData[aa][symNo][k][1] * calctmp[0] - (int32_t)BsCshData[aa][symNo][k][0] * calctmp[1]))>>15); + if((symNo == 1 || symNo == 5 || symNo == 8 || symNo == 12)) { + } + ip_ind++; + } + } + } + } + if(symNo > D_NSYM1SLT-1) { + u=u1; + v=v1; + } + } + } + + for (aa=0; aanb_antennas_rx; aa++) { + for (symNo=0; symNonb_antennas_rx; aa++) { + for (k=0; k<12; k++) { + delta_theta_comp[aa][k][0] = 0; + delta_theta_comp[aa][k][1] = 0; + + delta_theta_comp[aa][k][0] += (((int32_t)CsData_temp[aa][1][k][0] * CsData_temp[aa][5][k][0] + (int32_t)((CsData_temp[aa][1][k][1])*CsData_temp[aa][5][k][1]))>>8); + delta_theta_comp[aa][k][1] += (((int32_t)CsData_temp[aa][1][k][0]*CsData_temp[aa][5][k][1] - (int32_t)((CsData_temp[aa][1][k][1])*CsData_temp[aa][5][k][0]) )>>8); + + delta_theta_comp[aa][k][0] += (((int32_t)CsData_temp[aa][8][k][0] * CsData_temp[aa][12][k][0] + (int32_t)((CsData_temp[aa][8][k][1])*CsData_temp[aa][12][k][1]))>>8); + delta_theta_comp[aa][k][1] += (((int32_t)CsData_temp[aa][8][k][0]*CsData_temp[aa][12][k][1] - (int32_t)((CsData_temp[aa][8][k][1])*CsData_temp[aa][12][k][0]))>>8); + + delta_theta[aa][k] = atan2((double)delta_theta_comp[aa][k][1], (double)delta_theta_comp[aa][k][0]) / 4.0; + } + } + + for (aa=0; aanb_antennas_rx; aa++) { + for (k=0; knb_antennas_rx; aa++) { + if(ip_ind == 0) {//ip_ind= The total number of cyclic shift of non-use + *Interpw = 1; + break; + } + for(i=0; i>8); + IP_allavg[i] += (((int32_t)IP_CsData_allsfavg[aa][5][i][0] * IP_CsData_allsfavg[aa][5][i][0] + (int32_t)IP_CsData_allsfavg[aa][5][i][1]*IP_CsData_allsfavg[aa][5][i][1])>>8); + IP_allavg[i] += (((int32_t)IP_CsData_allsfavg[aa][8][i][0] * IP_CsData_allsfavg[aa][8][i][0] + (int32_t)IP_CsData_allsfavg[aa][8][i][1]*IP_CsData_allsfavg[aa][8][i][1])>>8); + IP_allavg[i] += (((int32_t)IP_CsData_allsfavg[aa][12][i][0] * IP_CsData_allsfavg[aa][12][i][0] + (int32_t)IP_CsData_allsfavg[aa][12][i][1]*IP_CsData_allsfavg[aa][12][i][1])>>8); + *Interpw += IP_allavg[i]/(2*D_NSLT1SF*frame_parms->nb_antennas_rx*ip_ind*12); + } + } + return 0; +} + +/* Channel Equalization */ +uint16_t pucchfmt3_Equalization( int16_t CshData_fmt3[NB_ANTENNAS_RX][14][12][2], + int16_t ChdetAfterValue_fmt3[NB_ANTENNAS_RX][14][12][2], + int16_t ChestValue[NB_ANTENNAS_RX][2][12][2], + LTE_DL_FRAME_PARMS *frame_parms) +{ + int16_t aa, sltNo, symNo, k; + + for (aa=0; aanb_antennas_rx; aa++) { + sltNo = 0; + for (symNo=0; symNo= D_NSYM1SLT) { + sltNo = 1; + } + for (k=0; k>8); + ChdetAfterValue_fmt3[aa][symNo][k][1] = (((int32_t)CshData_fmt3[aa][symNo][k][1] * ChestValue[aa][sltNo][k][0] - (int32_t)CshData_fmt3[aa][symNo][k][0] * ChestValue[aa][sltNo][k][1])>>8); + } + } + } + return 0; +} + +/* Frequency deviation remove AFC */ +uint16_t pucchfmt3_FrqDevRemove( int16_t ChdetAfterValue_fmt3[NB_ANTENNAS_RX][14][12][2], + double delta_theta[NB_ANTENNAS_RX][12], + int16_t RemoveFrqDev_fmt3[NB_ANTENNAS_RX][2][5][12][2], + LTE_DL_FRAME_PARMS *frame_parms ) +{ + int16_t aa, sltNo, symNo1slt, k, n; + double calctmp[2]; + + for (aa=0; aanb_antennas_rx; aa++) { + for(sltNo = 0; sltNonb_antennas_rx; aa++) { + for (sltNo=0; sltNo>15); + Fmt3xDataRmvOrth[aa][sltNo][n][k][1] = (((int32_t)RemoveFrqDev_fmt3[aa][sltNo][n][k][1] * TBL_3_SF4[noc][n][0] - (int32_t)RemoveFrqDev_fmt3[aa][sltNo][n][k][0] * TBL_3_SF4[noc][n][1])>>15); + } else { + Fmt3xDataRmvOrth[aa][sltNo][n][k][0] = (((int32_t)RemoveFrqDev_fmt3[aa][sltNo][n][k][0] * TBL_3_SF5[noc][n][0] + (int32_t)RemoveFrqDev_fmt3[aa][sltNo][n][k][1] * TBL_3_SF5[noc][n][1])>>15); + Fmt3xDataRmvOrth[aa][sltNo][n][k][1] = (((int32_t)RemoveFrqDev_fmt3[aa][sltNo][n][k][1] * TBL_3_SF5[noc][n][0] - (int32_t)RemoveFrqDev_fmt3[aa][sltNo][n][k][0] * TBL_3_SF5[noc][n][1])>>15); + } + } + } + } + } + return 0; +} + +/* averaging antenna */ +uint16_t pucchfmt3_AvgAnt( int16_t Fmt3xDataRmvOrth[NB_ANTENNAS_RX][2][5][12][2], + int16_t Fmt3xDataAvgAnt[2][5][12][2], + uint8_t shortened_format, + LTE_DL_FRAME_PARMS *frame_parms ) +{ + int16_t aa, sltNo, n, k; + int16_t Npucch_sf; + + for (sltNo=0; sltNonb_antennas_rx; aa++) { + Fmt3xDataAvgAnt[sltNo][n][k][0] += Fmt3xDataRmvOrth[aa][sltNo][n][k][0] / frame_parms->nb_antennas_rx; + Fmt3xDataAvgAnt[sltNo][n][k][1] += Fmt3xDataRmvOrth[aa][sltNo][n][k][1] / frame_parms->nb_antennas_rx; + } + } + } + } + return 0; +} + +/* averaging symbol */ +uint16_t pucchfmt3_AvgSym( int16_t Fmt3xDataAvgAnt[2][5][12][2], + int16_t Fmt3xDataAvgSym[2][12][2], + uint8_t shortened_format ) +{ + int16_t sltNo, n, k; + int16_t Npucch_sf; + + for (sltNo=0; sltNo>15); + calctmp[2*k+1] += (((int32_t)x[2*i+1] * tmp[0] + (int32_t)x[2*i] * tmp[1])>>15); + } + y[2*k] = (int16_t)( (double) calctmp[2*k] / sqrt(D_NSC1RB)); + y[2*k+1] = (int16_t)((double) calctmp[2*k+1] / sqrt(D_NSC1RB)); + } +} + +/* descramble */ +uint16_t pucchfmt3_Descramble( int16_t IFFTOutData_Fmt3[2][12][2], + int16_t b[48], + uint8_t subframe, + uint32_t Nid_cell, + uint32_t rnti + ) +{ + int16_t m, k, c,i,j; + uint32_t cinit = 0; + uint32_t x1; + uint32_t s,s0,s1; + cinit = (subframe + 1) * ((2 * Nid_cell + 1)<<16) + rnti; + s0 = lte_gold_generic(&x1,&cinit,1); + s1 = lte_gold_generic(&x1,&cinit,0); + i=0; + for (m=0; m>j)&1); + b[i] = (IFFTOutData_Fmt3[m][k][0] * (1 - 2*c)); + i++; + + s = (i<32)? s0:s1; + j = (i<32)? i:(i-32); + c=((s>>j)&1); + b[i] = (IFFTOutData_Fmt3[m][k][1] * (1 - 2*c)); + i++; + } + } + return 0; +} + +int16_t pucchfmt3_Decode( int16_t b[48], + uint8_t subframe, + int16_t DTXthreshold, + int16_t Interpw, + uint8_t do_sr) +{ + int16_t c, i; + int32_t Rho_tmp; + int16_t c_max; + int32_t Rho_max; + int16_t bit_pattern; + + /* Is payload 6bit or 7bit? */ + if( do_sr == 1 ) { + bit_pattern = 128; + } else { + bit_pattern = 64; + } + + c=0; + Rho_tmp = 0; + for (i=0;i<48;i++) { + Rho_tmp += b[i] * (1-2*chcod_tbl[c][i]); + } + c_max = c; + Rho_max = Rho_tmp; + + for(c=1; c Rho_max) { + c_max = c; + Rho_max = Rho_tmp; + } + } + if(Interpw<1){ + Interpw=1; + } + if((Rho_max/Interpw) > DTXthreshold) { + // ***Log + return c_max; + } else { + // ***Log + return -1; + } +} + +/* PUCCH format3 << */ + +uint32_t rx_pucch(PHY_VARS_eNB *eNB, PUCCH_FMT_t fmt, uint8_t UE_id, uint16_t n1_pucch, @@ -449,15 +1798,12 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, static int first_call=1; - LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - // PUCCH_CONFIG_DEDICATED *pucch_config_dedicated = &phy_vars_eNB->pucch_config_dedicated[UE_id]; - int8_t sigma2_dB = phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dB[0]-10; - uint32_t *Po_PUCCH = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH); - int32_t *Po_PUCCH_dBm = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_dBm); - uint32_t *Po_PUCCH1_below = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_below); - uint32_t *Po_PUCCH1_above = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH1_above); - int32_t *Po_PUCCH_update = &(phy_vars_eNB->eNB_UE_stats[UE_id].Po_PUCCH_update); + LTE_eNB_COMMON *common_vars = &eNB->common_vars; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + // PUCCH_CONFIG_DEDICATED *pucch_config_dedicated = &eNB->pucch_config_dedicated[UE_id]; + + int8_t sigma2_dB = 20;//eNB->measurements.n0_subband_power_tot_dB[0]-10; + uint32_t u,v,n,aa; uint32_t z[12*14]; int16_t *zptr; @@ -472,9 +1818,13 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, int16_t tmp_re,tmp_im,W_re=0,W_im=0; int16_t *rxptr; uint32_t symbol_offset; - int16_t stat_ref_re,stat_ref_im,*cfo,chest_re,chest_im; + int16_t stat_ref_re,stat_ref_im,*cfo; + int16_t chest0_re[NB_ANTENNAS_RX][12],chest0_im[NB_ANTENNAS_RX][12]; + int16_t chest1_re[NB_ANTENNAS_RX][12],chest1_im[NB_ANTENNAS_RX][12]; + int32_t chest_mag; int32_t stat_re=0,stat_im=0; uint32_t stat,stat_max=0; + uint8_t log2_maxh; uint8_t deltaPUCCH_Shift = frame_parms->pucch_config_common.deltaPUCCH_Shift; uint8_t NRB2 = frame_parms->pucch_config_common.nRB_CQI; @@ -486,36 +1836,69 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; int chL; + /* PUCCH format3 >> */ + uint16_t Ret = 0; + int16_t SubCarrierDeMapData[NB_ANTENNAS_RX][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex] + int16_t CshData_fmt3[NB_ANTENNAS_RX][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex] + double delta_theta[NB_ANTENNAS_RX][12]; //[Antenna][Subcarrier][Complex] + int16_t ChestValue[NB_ANTENNAS_RX][2][12][2]; //[Antenna][Slot][Subcarrier][Complex] + int16_t ChdetAfterValue_fmt3[NB_ANTENNAS_RX][14][12][2]; //[Antenna][Symbol][Subcarrier][Complex] + int16_t RemoveFrqDev_fmt3[NB_ANTENNAS_RX][2][5][12][2]; //[Antenna][Slot][PUCCH_Symbol][Subcarrier][Complex] + int16_t Fmt3xDataRmvOrth[NB_ANTENNAS_RX][2][5][12][2]; //[Antenna][Slot][PUCCH_Symbol][Subcarrier][Complex] + int16_t Fmt3xDataAvgAnt[2][5][12][2]; //[Slot][PUCCH_Symbol][Subcarrier][Complex] + int16_t Fmt3xDataAvgSym[2][12][2]; //[Slot][Subcarrier][Complex] + int16_t IFFTOutData_Fmt3[2][12][2]; //[Slot][Subcarrier][Complex] + int16_t b[48]; //[bit] + //int16_t IP_CsData_allavg[NB_ANTENNAS_RX][12][4][2]; //[Antenna][Symbol][Nouse Cyclic Shift][Complex] + int16_t payload_entity = -1; + int16_t Interpw; + int16_t payload_max; + + // TODO + // When using PUCCH format3, it must be an argument of rx_pucch function + uint16_t n3_pucch = 20; + uint16_t n3_pucch_array[NUMBER_OF_UE_MAX]={1}; + n3_pucch_array[0]=n3_pucch; + uint8_t do_sr = 1; + uint16_t crnti=0x1234; + int16_t DTXthreshold = 10; + /* PUCCH format3 << */ + if (first_call == 1) { for (i=0;i<10;i++) { for (j=0;jpucch1_stats_cnt[j][i]=0; - phy_vars_eNB->pucch1ab_stats_cnt[j][i]=0; + eNB->pucch1_stats_cnt[j][i]=0; + eNB->pucch1ab_stats_cnt[j][i]=0; } } +#if defined(USRP_REC_PLAY) + // It's probably bad to do this statically only once. + // Looks like the above is incomplete. + // Such reset needs to be done once a UE PHY structure is being used/re-used + // Don't know if this is ever possible in current architecture + for (i=0;i<10240;i++) { + for (j=0;jpucch1_stats[j][i]=0; + eNB->pucch1_stats_thres[j][i]=0; + } + } + for (i=0;i<20480;i++) { + for (j=0;jpucch1ab_stats[j][i]=0; + } + } +#endif first_call=0; } - /* - switch (frame_parms->N_RB_UL) { - case 6: - sigma2_dB -= 8; - break; - case 25: - sigma2_dB -= 14; - break; - case 50: - sigma2_dB -= 17; - break; - case 100: - sigma2_dB -= 20; - break; - default: - sigma2_dB -= 14; - } - */ - + if(fmt!=pucch_format3) { /* PUCCH format3 */ + + // TODO + // "SR+ACK/NACK" length is only 7 bits. + // This restriction will be lifted in the future. + // "CQI/PMI/RI+ACK/NACK" will be supported in the future. + if ((deltaPUCCH_Shift==0) || (deltaPUCCH_Shift>3)) { LOG_E(PHY,"[eNB] rx_pucch: Illegal deltaPUCCH_shift %d (should be 1,2,3)\n",deltaPUCCH_Shift); return(-1); @@ -532,7 +1915,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, Nprime = Nprime_div_deltaPUCCH_Shift * deltaPUCCH_Shift; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch); + printf("[eNB] PUCCH: cNcs1/deltaPUCCH_Shift %d, Nprime %d, n1_pucch %d\n",thres,Nprime,n1_pucch); #endif N_UL_symb = (frame_parms->Ncp==NORMAL) ? 7 : 6; @@ -551,7 +1934,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, } #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"PUCCH: nprime0 %d nprime1 %d\n",nprime0,nprime1); + printf("PUCCH: nprime0 %d nprime1 %d\n",nprime0,nprime1); #endif n_oc0 = nprime0/Nprime_div_deltaPUCCH_Shift; @@ -565,7 +1948,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, n_oc1<<=1; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1); + printf("[eNB] PUCCH: noc0 %d noc11 %d\n",n_oc0,n_oc1); #endif nprime=nprime0; @@ -588,7 +1971,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, //loop over symbols in slot for (l=0; lncs_cell[ns][l]; + n_cs = eNB->ncs_cell[ns][l]; if (frame_parms->Ncp==0) { // normal CP n_cs = ((uint16_t)n_cs + (nprime*deltaPUCCH_Shift + (n_oc%deltaPUCCH_Shift))%Nprime)%12; @@ -644,7 +2027,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, } #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs); + printf("[eNB] PUCCH: ncs[%d][%d]=%d, W_re %d, W_im %d, S %d, refs %d\n",ns,l,n_cs,W_re,W_im,S,refs); #endif alpha_ind=0; // compute output sequence @@ -660,7 +2043,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, zptr[1+(n<<1)] = -(tmp_re*W_im + tmp_im*W_re)>>15; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,zptr[n<<1],zptr[(n<<1)+1], + printf("[eNB] PUCCH subframe %d z(%d,%d) => %d,%d, alpha(%d) => %d,%d\n",subframe,l,n,zptr[n<<1],zptr[(n<<1)+1], alpha_ind,alpha_re[alpha_ind],alpha_im[alpha_ind]); #endif @@ -679,7 +2062,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, m = (n1_pucch < thres) ? NRB2 : (((n1_pucch-thres)/(12*c/deltaPUCCH_Shift))+NRB2+((deltaPUCCH_Shift*Ncs1_div_deltaPUCCH_Shift)>>3)+rem); #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH: m %d\n",m); + printf("[eNB] PUCCH: m %d\n",m); #endif nsymb = N_UL_symb<<1; @@ -703,17 +2086,17 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, re_offset -= (frame_parms->ofdm_symbol_size); symbol_offset = (unsigned int)frame_parms->ofdm_symbol_size*l; - rxptr = (int16_t *)&eNB_common_vars->rxdataF[0][aa][symbol_offset]; + rxptr = (int16_t *)&common_vars->rxdataF[aa][symbol_offset]; for (i=0; i<12; i++,j+=2,re_offset++) { - rxcomp[aa][j] = (int16_t)((rxptr[re_offset<<1]*(int32_t)zptr[j])>>15) - ((rxptr[1+(re_offset<<1)]*(int32_t)zptr[1+j])>>15); - rxcomp[aa][1+j] = (int16_t)((rxptr[re_offset<<1]*(int32_t)zptr[1+j])>>15) + ((rxptr[1+(re_offset<<1)]*(int32_t)zptr[j])>>15); - if (re_offset==frame_parms->ofdm_symbol_size) re_offset = 0; + rxcomp[aa][j] = (int16_t)((rxptr[re_offset<<1]*(int32_t)zptr[j])>>15) - ((rxptr[1+(re_offset<<1)]*(int32_t)zptr[1+j])>>15); + rxcomp[aa][1+j] = (int16_t)((rxptr[re_offset<<1]*(int32_t)zptr[1+j])>>15) + ((rxptr[1+(re_offset<<1)]*(int32_t)zptr[j])>>15); + #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,i,re_offset,m,j, + printf("[eNB] PUCCH subframe %d (%d,%d,%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,i,re_offset,m,j, rxptr[re_offset<<1],rxptr[1+(re_offset<<1)], zptr[j],zptr[1+j], rxcomp[aa][j],rxcomp[aa][1+j]); @@ -728,7 +2111,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, if (fmt == pucch_format1) { #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"Doing PUCCH detection for format 1\n"); + printf("Doing PUCCH detection for format 1\n"); #endif stat_max = 0; @@ -751,7 +2134,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) , stat %d\n",subframe,phase,l,re, + printf("[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) , stat %d\n",subframe,phase,l,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l<<1],cfo[1+(l<<1)], stat_re,stat_im,stat); @@ -764,7 +2147,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d), stat %d\n",subframe,phase,l2,re, + printf("[eNB] PUCCH subframe %d (%d,%d,%d) => (%d,%d) x (%d,%d) : (%d,%d), stat %d\n",subframe,phase,l2,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l2<<1],cfo[1+(l2<<1)], stat_re,stat_im,stat); @@ -785,27 +2168,30 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, } //phase - stat_max *= nsymb; // normalize to energy per symbol - stat_max /= (frame_parms->N_RB_UL*12); // +// stat_max *= nsymb; // normalize to energy per symbol +// stat_max /= (frame_parms->N_RB_UL*12); // + stat_max /= (nsymb*12); + #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max); + printf("[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max); #endif #ifdef DEBUG_PUCCH_RX - LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dBm[6],pucch1_thres,phase_max); + LOG_D(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,eNB->measurements.n0_subband_power_tot_dBm[6],pucch1_thres,phase_max); #endif - phy_vars_eNB->pucch1_stats[UE_id][(subframe<<10)+phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]] = stat_max; - phy_vars_eNB->pucch1_stats_thres[UE_id][(subframe<<10)+phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]] = sigma2_dB+pucch1_thres; - phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe]+1)&1023; + + eNB->pucch1_stats[UE_id][(subframe<<10)+eNB->pucch1_stats_cnt[UE_id][subframe]] = stat_max; + eNB->pucch1_stats_thres[UE_id][(subframe<<10)+eNB->pucch1_stats_cnt[UE_id][subframe]] = sigma2_dB+pucch1_thres; + eNB->pucch1_stats_cnt[UE_id][subframe] = (eNB->pucch1_stats_cnt[UE_id][subframe]+1)&1023; - T(T_ENB_PHY_PUCCH_1_ENERGY, T_INT(phy_vars_eNB->Mod_id), T_INT(UE_id), T_INT(frame), T_INT(subframe), + T(T_ENB_PHY_PUCCH_1_ENERGY, T_INT(eNB->Mod_id), T_INT(eNB->uci_vars[UE_id].rnti), T_INT(frame), T_INT(subframe), T_INT(stat_max), T_INT(sigma2_dB+pucch1_thres)); /* - if (phy_vars_eNB->pucch1_stats_cnt[UE_id][subframe] == 0) { + if (eNB->pucch1_stats_cnt[UE_id][subframe] == 0) { write_output("pucch_debug.m","pucch_energy", - &phy_vars_eNB->pucch1_stats[UE_id][(subframe<<10)], + &eNB->pucch1_stats[UE_id][(subframe<<10)], 1024,1,2); AssertFatal(0,"Exiting for PUCCH 1 debug\n"); @@ -815,15 +2201,10 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, // This is a moving average of the PUCCH1 statistics conditioned on being above or below the threshold if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) { *payload = 1; - *Po_PUCCH1_above = ((*Po_PUCCH1_above<<9) + (stat_max<<9)+1024)>>10; - //LOG_I(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (%d, %d), phase_max : %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dBm,pucch1_thres,phase_max); } else { *payload = 0; - *Po_PUCCH1_below = ((*Po_PUCCH1_below<<9) + (stat_max<<9)+1024)>>10; } - LOG_D(PHY,"[eNB] PUCCH fmt1: stat_max : %d, sigma2_dB %d (I0 %d dBm, thres %d), Po_PUCCH1_below/above : %d / %d\n",dB_fixed(stat_max),sigma2_dB,phy_vars_eNB->PHY_measurements_eNB[0].n0_subband_power_tot_dBm[6],pucch1_thres,dB_fixed(*Po_PUCCH1_below),dB_fixed(*Po_PUCCH1_above)); - *Po_PUCCH_update = 1; if (UE_id==0) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SR_ENERGY,dB_fixed(stat_max)); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SR_THRES,sigma2_dB+pucch1_thres); @@ -831,14 +2212,18 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, } else if ((fmt == pucch_format1a)||(fmt == pucch_format1b)) { stat_max = 0; #ifdef DEBUG_PUCCH_RX - LOG_I(PHY,"Doing PUCCH detection for format 1a/1b\n"); + LOG_D(PHY,"Doing PUCCH detection for format 1a/1b\n"); #endif - for (phase=3;phase<4;phase++){ //phase=0; phase<7; phase++) { + for (phase=0; phase<7; phase++) { stat=0; for (aa=0; aanb_antennas_rx; aa++) { for (re=0; re<12; re++) { + + // compute received energy first slot, seperately for data and reference + // by coherent combining across symbols but not resource elements + // Note: assumption is that channel is stationary over symbols in slot after CFO stat_re=0; stat_im=0; stat_ref_re=0; @@ -858,28 +2243,34 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, + printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l<<1],cfo[1+(l<<1)], stat_re,stat_im); #endif } + // this is total energy received, summed over data and reference + stat += ((((stat_re*stat_re)) + ((stat_im*stat_im)) + + ((stat_ref_re*stat_ref_re)) + ((stat_ref_im*stat_ref_im)))/nsymb); - - + // now second slot + stat_re=0; + stat_im=0; + stat_ref_re=0; + stat_ref_im=0; for (l2=0,l=(nsymb>>1); l<(nsymb-1); l++,l2++) { if ((l2<2) || ((l2>(nsymb>>1) - 3)) ) { // data symbols stat_re += ((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15); stat_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l2<<1)])>>15); } else { //reference_symbols - stat_ref_re += ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15); - stat_ref_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15); + stat_ref_re += ((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15); + stat_ref_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l2<<1)])>>15); } off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l2,re, + printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l2,re, rxcomp[aa][off],rxcomp[aa][1+off], cfo[l2<<1],cfo[1+(l2<<1)], stat_re,stat_im); @@ -888,7 +2279,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, } #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"aa%d re %d : phase %d : stat %d\n",aa,re,phase,stat); + printf("aa%d re %d : phase %d : stat %d\n",aa,re,phase,stat); #endif stat += ((((stat_re*stat_re)) + ((stat_im*stat_im)) + @@ -899,7 +2290,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, } // aa #ifdef DEBUG_PUCCH_RX - LOG_I(PHY,"Format 1A: phase %d : stat %d\n",phase,stat); + LOG_D(PHY,"Format 1A: phase %d : stat %d\n",phase,stat); #endif if (stat>stat_max) { stat_max = stat; @@ -908,205 +2299,255 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB, } //phase stat_max/=(12); //normalize to energy per symbol and RE - //#ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH fmt1a/b: stat_max : %d, phase_max : %d\n",stat_max,phase_max); - //#endif +#ifdef DEBUG_PUCCH_RX + printf("[eNB] PUCCH fmt1a/b: stat_max : %d, phase_max : %d\n",stat_max,phase_max); +#endif stat_re=0; stat_im=0; - LOG_D(PHY,"PUCCH1A : Po_PUCCH before %d dB (%d)\n",dB_fixed(*Po_PUCCH),*Po_PUCCH); - *Po_PUCCH = ((*Po_PUCCH>>1) + ((stat_max)>>1)); - *Po_PUCCH_dBm = dB_fixed(*Po_PUCCH/frame_parms->N_RB_UL) - phy_vars_eNB->rx_total_gain_eNB_dB; - *Po_PUCCH_update = 1; - - LOG_D(PHY,"PUCCH1A : stat_max %d (%d,%d,%d) => Po_PUCCH %d\n", - dB_fixed(stat_max), - pucch1_thres+sigma2_dB, - pucch1_thres, - sigma2_dB, - dB_fixed(*Po_PUCCH)); // Do detection now +#if defined(USRP_REC_PLAY) + // It looks like the value is a bit messy when RF is replayed. + // For instance i assume to skip pucch1_thres from the test below. + if (sigma2_dB<(dB_fixed(stat_max))) {// +#else if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres)) {// - - - *Po_PUCCH = ((*Po_PUCCH*1023) + stat_max)>>10; - +#endif chL = (nsymb>>1)-4; + chest_mag=0; + cfo = (frame_parms->Ncp==0) ? &cfo_pucch_np[14*phase_max] : &cfo_pucch_ep[12*phase_max]; for (aa=0; aanb_antennas_rx; aa++) { + // channel estimates first for (re=0; re<12; re++) { - chest_re=0; - chest_im=0; - cfo = (frame_parms->Ncp==0) ? &cfo_pucch_np[14*phase_max] : &cfo_pucch_ep[12*phase_max]; // channel estimate for first slot + chest0_re[aa][re]=0; + chest0_im[aa][re]=0; + for (l=2; l<(nsymb>>1)-2; l++) { + off=(re<<1) + (24*l); + chest0_re[aa][re] += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/chL; + chest0_im[aa][re] += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/chL; + } + + + // channel estimate for second slot + chest1_re[aa][re]=0; + chest1_im[aa][re]=0; for (l=2; l<(nsymb>>1)-2; l++) { - off=(re<<1) + (24*l); - chest_re += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/chL; - chest_im += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/chL; + off=(re<<1) + (24*l) + (nsymb>>1)*24; + chest1_re[aa][re] += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/chL; + chest1_im[aa][re] += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/chL; } + chest_mag = max(chest_mag,(chest0_re[aa][re]*chest0_re[aa][re]) + (chest0_im[aa][re]*chest0_im[aa][re])); + chest_mag = max(chest_mag,(chest1_re[aa][re]*chest1_re[aa][re]) + (chest1_im[aa][re]*chest1_im[aa][re])); + + } + } + log2_maxh = log2_approx(chest_mag)/2; +#ifdef DEBUG_PUCCH_RX + printf("PUCCH 1A: log2_maxh %d\n",log2_maxh); +#endif + // now do channel matched filter + for (aa=0; aanb_antennas_rx; aa++) { + for (re=0; re<12; re++) { #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d l %d re %d chest1 => (%d,%d)\n",subframe,l,re, - chest_re,chest_im); + printf("[eNB] PUCCH subframe %d chest0[%d][%d] => (%d,%d)\n",subframe,aa,re, + chest0_re[aa][re],chest0_im[aa][re]); #endif - + // first slot, left of RS for (l=0; l<2; l++) { off=(re<<1) + (24*l); tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15); tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15); - stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4; - stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4; + stat_re += (((tmp_re*chest0_re[aa][re])>>log2_maxh) + ((tmp_im*chest0_im[aa][re])>>log2_maxh)); + stat_im += (((tmp_re*chest0_im[aa][re])>>log2_maxh) - ((tmp_im*chest0_re[aa][re])>>log2_maxh)); off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, - rxcomp[aa][off],rxcomp[aa][1+off], - cfo[l<<1],cfo[1+(l<<1)], - stat_re,stat_im); + printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) => (%d,%d)\n",subframe,l,re, + rxcomp[aa][off],rxcomp[aa][1+off], + cfo[l<<1],cfo[1+(l<<1)], + tmp_re,tmp_im, + stat_re,stat_im); #endif - } - + } + // first slot, right of RS for (l=(nsymb>>1)-2; l<(nsymb>>1); l++) { off=(re<<1) + (24*l); tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15); tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15); - stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15)/4); - stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15)/4); + stat_re += (((tmp_re*chest0_re[aa][re])>>log2_maxh) + ((tmp_im*chest0_im[aa][re])>>log2_maxh)); + stat_im += (((tmp_re*chest0_im[aa][re])>>log2_maxh) - ((tmp_im*chest0_re[aa][re])>>log2_maxh)); off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, - rxcomp[aa][off],rxcomp[aa][1+off], - cfo[l<<1],cfo[1+(l<<1)], - stat_re,stat_im); + printf("[eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) => (%d,%d)\n",subframe,l,re, + rxcomp[aa][off],rxcomp[aa][1+off], + cfo[l<<1],cfo[1+(l<<1)], + tmp_re,tmp_im, + stat_re,stat_im); #endif - } - - chest_re=0; - chest_im=0; - - // channel estimate for second slot - for (l=2; l<(nsymb>>1)-2; l++) { - off=(re<<1) + (24*l) + (nsymb>>1)*24; - chest_re += (((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15))/chL; - chest_im += (((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15))/chL; - } + } + + #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[eNB] PUCCH subframe %d l %d re %d chest2 => (%d,%d)\n",subframe,l,re, - chest_re,chest_im); + printf("[eNB] PUCCH subframe %d chest1[%d][%d] => (%d,%d)\n",subframe,aa,re, + chest0_re[aa][re],chest0_im[aa][re]); #endif - + // second slot, left of RS for (l=0; l<2; l++) { - off=(re<<1) + (24*l) + (nsymb>>1)*24; - tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15); - tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15); - stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4; - stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4; + off=(re<<1) + (24*l) + (nsymb>>1)*24; + tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15); + tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15); + stat_re += (((tmp_re*chest1_re[aa][re])>>log2_maxh) + ((tmp_im*chest1_im[aa][re])>>log2_maxh)); + stat_im += (((tmp_re*chest1_im[aa][re])>>log2_maxh) - ((tmp_im*chest1_re[aa][re])>>log2_maxh)); off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, - rxcomp[aa][off],rxcomp[aa][1+off], - cfo[l<<1],cfo[1+(l<<1)], - stat_re,stat_im); + printf("[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) => (%d,%d)\n",subframe,l,re, + rxcomp[aa][off],rxcomp[aa][1+off], + cfo[l<<1],cfo[1+(l<<1)], + tmp_re,tmp_im, + stat_re,stat_im); #endif } + // second slot, right of RS for (l=(nsymb>>1)-2; l<(nsymb>>1)-1; l++) { off=(re<<1) + (24*l) + (nsymb>>1)*24; tmp_re = ((rxcomp[aa][off]*(int32_t)cfo[l<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l<<1)])>>15); tmp_im = ((rxcomp[aa][off]*(int32_t)cfo[1+(l<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l<<1)])>>15); - stat_re += (((tmp_re*chest_re)>>15) + ((tmp_im*chest_im)>>15))/4; - stat_im += (((tmp_re*chest_im)>>15) - ((tmp_im*chest_re)>>15))/4; + stat_re += (((tmp_re*chest1_re[aa][re])>>log2_maxh) + ((tmp_im*chest1_im[aa][re])>>log2_maxh)); + stat_im += (((tmp_re*chest1_im[aa][re])>>log2_maxh) - ((tmp_im*chest1_re[aa][re])>>log2_maxh)); off+=2; #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d)\n",subframe,l,re, - rxcomp[aa][off],rxcomp[aa][1+off], - cfo[l<<1],cfo[1+(l<<1)], - stat_re,stat_im); + printf("[PHY][eNB] PUCCH subframe %d (%d,%d) => (%d,%d) x (%d,%d) : (%d,%d) => (%d,%d)\n",subframe,l,re, + rxcomp[aa][off],rxcomp[aa][1+off], + cfo[l<<1],cfo[1+(l<<1)], + tmp_re,tmp_im, + stat_re,stat_im); #endif } #ifdef DEBUG_PUCCH_RX - LOG_D(PHY,"aa%d re %d : stat %d,%d\n",aa,re,stat_re,stat_im); + printf("aa%d re %d : stat %d,%d\n",aa,re,stat_re,stat_im); #endif } //re } // aa -#ifdef DEBUG_PUCCH_RX - LOG_I(PHY,"PUCCH 1a/b: subframe %d : stat %d,%d (pos %d)\n",subframe,stat_re,stat_im, - (subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])); -#endif - phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<11) + 2*(phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_re); - phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<11) + 1+2*(phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_im); - phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023; + LOG_D(PHY,"PUCCH 1a/b: subframe %d : stat %d,%d (pos %d)\n",subframe,stat_re,stat_im, + (subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])); + LOG_D(PHY,"PUCCH 1a/b: subframe %d : sigma2_dB %d, stat_max %d, pucch1_thres %d\n",subframe,sigma2_dB,dB_fixed(stat_max),pucch1_thres); + + eNB->pucch1ab_stats[UE_id][(subframe<<11) + 2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_re); + eNB->pucch1ab_stats[UE_id][(subframe<<11) + 1+2*(eNB->pucch1ab_stats_cnt[UE_id][subframe])] = (stat_im); + eNB->pucch1ab_stats_cnt[UE_id][subframe] = (eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023; /* frame not available here - set to -1 for the moment */ - T(T_ENB_PHY_PUCCH_1AB_IQ, T_INT(phy_vars_eNB->Mod_id), T_INT(UE_id), T_INT(-1), T_INT(subframe), T_INT(stat_re), T_INT(stat_im)); + T(T_ENB_PHY_PUCCH_1AB_IQ, T_INT(eNB->Mod_id), T_INT(eNB->uci_vars[UE_id].rnti), T_INT(-1), T_INT(subframe), T_INT(stat_re), T_INT(stat_im)); - - *payload = (stat_re<0) ? 1 : 0; + *payload = (stat_re<0) ? 1 : 2; // 1 == ACK, 2 == NAK if (fmt==pucch_format1b) - *(1+payload) = (stat_im<0) ? 1 : 0; + *(1+payload) = (stat_im<0) ? 1 : 2; } else { // insufficient energy on PUCCH so NAK - *payload = 0; - ((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re); - ((int16_t*)&phy_vars_eNB->pucch1ab_stats[UE_id][(subframe<<10) + (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im); - phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe] = (phy_vars_eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023; - - *payload = (stat_re<0) ? 1 : 0; +#if defined(USRP_REC_PLAY) + LOG_D(PHY,"PUCCH 1a/b: NAK subframe %d : sigma2_dB %d, stat_max %d, pucch1_thres %d\n",subframe,sigma2_dB,dB_fixed(stat_max),pucch1_thres); +#else + LOG_D(PHY,"PUCCH 1a/b: subframe %d : sigma2_dB %d, stat_max %d, pucch1_thres %d\n",subframe,sigma2_dB,dB_fixed(stat_max),pucch1_thres); +#endif + *payload = 4; // DTX + ((int16_t*)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re); + ((int16_t*)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im); + eNB->pucch1ab_stats_cnt[UE_id][subframe] = (eNB->pucch1ab_stats_cnt[UE_id][subframe]+1)&1023; if (fmt==pucch_format1b) - *(1+payload) = 0; + *(1+payload) = 4; } } else { LOG_E(PHY,"[eNB] PUCCH fmt2/2a/2b not supported\n"); } + + /* PUCCH format3 >> */ + } else { + /* SubCarrier Demap */ + Ret = pucchfmt3_subCarrierDeMapping( eNB, SubCarrierDeMapData, n3_pucch ); + if(Ret != 0) { + //***log pucchfmt3_subCarrierDeMapping Error! + return(-1); + } + + /* cyclic shift hopping remove */ + Ret = pucchfmt3_Baseseq_csh_remove( SubCarrierDeMapData, CshData_fmt3, frame_parms, subframe, eNB->ncs_cell ); + if(Ret != 0) { + //***log pucchfmt3_Baseseq_csh_remove Error! + return(-1); + } + + /* Channel Estimation */ + Ret = pucchfmt3_ChannelEstimation( SubCarrierDeMapData, delta_theta, ChestValue, &Interpw, subframe, shortened_format, frame_parms, n3_pucch, n3_pucch_array, eNB->ncs_cell ); + if(Ret != 0) { + //***log pucchfmt3_ChannelEstimation Error! + return(-1); + } + + /* Channel Equalization */ + Ret = pucchfmt3_Equalization( CshData_fmt3, ChdetAfterValue_fmt3, ChestValue, frame_parms ); + if(Ret != 0) { + //***log pucchfmt3_Equalization Error! + return(-1); + } + + /* Frequency deviation remove AFC */ + Ret = pucchfmt3_FrqDevRemove( ChdetAfterValue_fmt3, delta_theta, RemoveFrqDev_fmt3, frame_parms ); + if(Ret != 0) { + //***log pucchfmt3_FrqDevRemove Error! + return(-1); + } + + /* orthogonal sequence remove */ + Ret = pucchfmt3_OrthSeqRemove( RemoveFrqDev_fmt3, Fmt3xDataRmvOrth, shortened_format, n3_pucch, frame_parms ); + if(Ret != 0) { + //***log pucchfmt3_OrthSeqRemove Error! + return(-1); + } + + /* averaging antenna */ + pucchfmt3_AvgAnt( Fmt3xDataRmvOrth, Fmt3xDataAvgAnt, shortened_format, frame_parms ); + + /* averaging symbol */ + pucchfmt3_AvgSym( Fmt3xDataAvgAnt, Fmt3xDataAvgSym, shortened_format ); + + /* IDFT */ + pucchfmt3_IDft2( (int16_t*)Fmt3xDataAvgSym[0], (int16_t*)IFFTOutData_Fmt3[0] ); + pucchfmt3_IDft2( (int16_t*)Fmt3xDataAvgSym[1], (int16_t*)IFFTOutData_Fmt3[1] ); + + /* descramble */ + pucchfmt3_Descramble(IFFTOutData_Fmt3, b, subframe, frame_parms->Nid_cell, crnti); + + /* Is payload 6bit or 7bit? */ + if( do_sr == 1 ) { + payload_max = 7; + } else { + payload_max = 6; + } + + /* decode */ + payload_entity = pucchfmt3_Decode( b, subframe, DTXthreshold, Interpw, do_sr ); + if (payload_entity == -1) { + //***log pucchfmt3_Decode Error! + return(-1); + } + + for(i=0; i>i) & 0x01); + } + } + /* PUCCH format3 << */ return((int32_t)stat_max); } - - -int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t UE_index, - PUCCH_FMT_t fmt, - uint8_t n1_pucch_sel, - uint8_t *payload, - uint8_t sched_subframe) -{ - uint8_t UE_id; - uint16_t rnti; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - uint8_t CC_id = phy_vars_eNB->CC_id; - - rnti = phy_vars_eNB->ulsch_eNB[UE_index]->rnti; - - for (UE_id=0; UE_idlte_ue_pdcch_vars[0]->crnti) - break; - } - - if (UE_id==NB_UE_INST) { - LOG_W(PHY,"rx_pucch_emul: Didn't find UE with rnti %x\n",rnti); - return(-1); - } - - if (fmt == pucch_format1) { - payload[0] = PHY_vars_UE_g[UE_id][CC_id]->sr[subframe]; - } else if (fmt == pucch_format1a) { - payload[0] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[0]; - } else if (fmt == pucch_format1b) { - payload[0] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[0]; - payload[1] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[1]; - } else - LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",phy_vars_eNB->proc[sched_subframe].frame_rx); - - if (PHY_vars_UE_g[UE_id][CC_id]->pucch_sel[subframe] == n1_pucch_sel) - return(99); - else - return(0); -} diff --git a/openair1/PHY/LTE_TRANSPORT/rar_tools.c b/openair1/PHY/LTE_TRANSPORT/rar_tools.c index 40dec0ec6f..9934b71d78 100644 --- a/openair1/PHY/LTE_TRANSPORT/rar_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/rar_tools.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/rar_tools.c * \brief Routine for filling the PUSCH/ULSCH data structures based on a random-access response (RAR) SDU from MAC. Note this is both for UE and eNB. V8.6 2009-03 @@ -39,9 +31,11 @@ */ #include "PHY/defs.h" #include "PHY/extern.h" +#include "SCHED/defs.h" #include "SCHED/extern.h" #include "LAYER2/MAC/defs.h" #include "SCHED/defs.h" +#include "UTIL/LOG/vcd_signal_dumper.h" #include "assertions.h" @@ -58,16 +52,16 @@ extern uint16_t RIV_max6,RIV_max25,RIV_max50,RIV_max100; //#define DEBUG_RAR -#ifdef OPENAIR2 -int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu, + +int generate_eNB_ulsch_params_from_rar(PHY_VARS_eNB *eNB, + unsigned char *rar_pdu, uint32_t frame, - unsigned char subframe, - LTE_eNB_ULSCH_t *ulsch, - LTE_DL_FRAME_PARMS *frame_parms) -{ + unsigned char subframe){ + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + // RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)rar_pdu; // RAR_PDU *rar = (RAR_PDU *)(rar_pdu+1); uint8_t *rar = (uint8_t *)(rar_pdu+1); @@ -76,8 +70,21 @@ int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu, uint8_t cqireq; uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT; uint16_t RIV_max; + uint16_t use_srs=0; + uint16_t rnti; + LTE_eNB_ULSCH_t *ulsch; + LTE_UL_eNB_HARQ_t *ulsch_harq; + int8_t UE_id; - LOG_D(PHY,"[eNB][RAPROC] generate_eNB_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",subframe,harq_pid); + LOG_I(PHY,"[eNB][RAPROC] generate_eNB_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",subframe,harq_pid); + + rnti = (((uint16_t)rar[4])<<8)+rar[5]; + + AssertFatal((UE_id = find_ulsch(rnti,eNB,SEARCH_EXIST_OR_FREE))>=0, + "Cannot get UE id for RAR (rnti %x)\n",rnti); + + ulsch = eNB->ulsch[UE_id]; + ulsch_harq = ulsch->harq_processes[harq_pid]; switch (frame_parms->N_RB_DL) { case 6: @@ -109,7 +116,7 @@ int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu, break; } - ulsch->harq_processes[harq_pid]->TPC = (rar[3]>>2)&7;//rar->TPC; + rballoc = (((uint16_t)(rar[1]&7))<<7)|(rar[2]>>1); if (rballoc>RIV_max) { @@ -117,84 +124,103 @@ int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu, return(-1); } - ulsch->harq_processes[harq_pid]->rar_alloc = 1; - ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT[rballoc]; - ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT[rballoc]; - // ulsch->harq_processes[harq_pid]->Ndi = 1; + ulsch_harq->rar_alloc = 1; + ulsch_harq->first_rb = RIV2first_rb_LUT[rballoc]; + ulsch_harq->nb_rb = RIV2nb_rb_LUT[rballoc]; + // ulsch_harq->Ndi = 1; cqireq = rar[3]&1; if (cqireq==1) { - ulsch->harq_processes[harq_pid]->Or2 = sizeof_wideband_cqi_rank2_2A_5MHz; - ulsch->harq_processes[harq_pid]->Or1 = sizeof_wideband_cqi_rank1_2A_5MHz; - ulsch->harq_processes[harq_pid]->O_RI = 1; + ulsch_harq->Or2 = sizeof_wideband_cqi_rank2_2A_5MHz; + ulsch_harq->Or1 = sizeof_wideband_cqi_rank1_2A_5MHz; + ulsch_harq->O_RI = 1; } else { - ulsch->harq_processes[harq_pid]->O_RI = 0;//1; - ulsch->harq_processes[harq_pid]->Or2 = 0; - ulsch->harq_processes[harq_pid]->Or1 = 0; + ulsch_harq->O_RI = 0;//1; + ulsch_harq->Or2 = 0; + ulsch_harq->Or1 = 0; } - ulsch->harq_processes[harq_pid]->O_ACK = 0;//2; + ulsch_harq->O_ACK = 0;//2; ulsch->beta_offset_cqi_times8 = 18; ulsch->beta_offset_ri_times8 = 10; ulsch->beta_offset_harqack_times8 = 16; + ulsch->rnti = rnti; + ulsch->harq_mask = 1<harq_processes[harq_pid]->Nsymb_pusch = 12-(frame_parms->Ncp<<1); - ulsch->rnti = (((uint16_t)rar[4])<<8)+rar[5]; + // if (ulsch_harq->round == 0) { + ulsch_harq->status = ACTIVE; + ulsch_harq->rvidx = 0; + uint8_t mcs = ((rar[2]&1)<<3)|(rar[3]>>5); + ulsch_harq->TBS = TBStable[get_I_TBS_UL(mcs)][ulsch_harq->nb_rb-1]; + ulsch_harq->Qm = get_Qm_ul(mcs); + ulsch_harq->Msc_initial = 12*ulsch_harq->nb_rb; + ulsch_harq->Nsymb_initial = 9; + ulsch_harq->round = 0; + /* } else { + ulsch_harq->rvidx = 0; + ulsch_harq->round++; + }*/ - if (ulsch->harq_processes[harq_pid]->round == 0) { - ulsch->harq_processes[harq_pid]->status = ACTIVE; - ulsch->harq_processes[harq_pid]->rvidx = 0; - ulsch->harq_processes[harq_pid]->mcs = ((rar[2]&1)<<3)|(rar[3]>>5); - //ulsch->harq_processes[harq_pid]->TBS = dlsch_tbs25[ulsch->harq_processes[harq_pid]->mcs][ulsch->harq_processes[harq_pid]->nb_rb-1]; - ulsch->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1]; - ulsch->harq_processes[harq_pid]->Msc_initial = 12*ulsch->harq_processes[harq_pid]->nb_rb; - ulsch->harq_processes[harq_pid]->Nsymb_initial = 9; - ulsch->harq_processes[harq_pid]->round = 0; - } else { - ulsch->harq_processes[harq_pid]->rvidx = 0; - ulsch->harq_processes[harq_pid]->round++; - } + + ulsch->Msg3_active = 1; + + get_Msg3_alloc(frame_parms, + subframe, + frame, + &ulsch_harq->frame, + &ulsch_harq->subframe); + + LOG_I(PHY,"Programming msg3 reception in (%d,%d) mcs:%d TBS:%d Qm:%d Mcs_intial:%d Nsymb_intial:%d round:%d\n", + ulsch_harq->frame,ulsch_harq->subframe, + mcs, ulsch_harq->TBS, ulsch_harq->Qm, ulsch_harq->Msc_initial, ulsch_harq->Nsymb_initial, ulsch_harq->round); + use_srs = is_srs_occasion_common(frame_parms,ulsch_harq->frame,ulsch_harq->subframe); + ulsch_harq->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1); + ulsch_harq->srs_active = use_srs; #ifdef DEBUG_RAR - msg("ulsch ra (eNB): harq_pid %d\n",harq_pid); - msg("ulsch ra (eNB): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); - msg("ulsch ra (eNB): rballoc %x\n",ulsch->harq_processes[harq_pid]->first_rb); - msg("ulsch ra (eNB): harq_pid %d\n",harq_pid); - msg("ulsch ra (eNB): round %d\n",ulsch->harq_processes[harq_pid]->round); - msg("ulsch ra (eNB): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); - msg("ulsch ra (eNB): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); - msg("ulsch ra (eNB): Or1 %d\n",ulsch->harq_processes[harq_pid]->Or1); - msg("ulsch ra (eNB): ORI %d\n",ulsch->harq_processes[harq_pid]->O_RI); + LOG_D(PHY,"ulsch ra (eNB): harq_pid %d\n",harq_pid); + LOG_D(PHY,"ulsch ra (eNB): NBRB %d\n",ulsch_harq->nb_rb); + LOG_D(PHY,"ulsch ra (eNB): rballoc %x\n",ulsch_harq->first_rb); + LOG_D(PHY,"ulsch ra (eNB): harq_pid %d\n",harq_pid); + LOG_D(PHY,"ulsch ra (eNB): round %d\n",ulsch_harq->round); + LOG_D(PHY,"ulsch ra (eNB): TBS %d\n",ulsch_harq->TBS); + LOG_D(PHY,"ulsch ra (eNB): mcs %d\n",ulsch_harq->Msc_initial); + LOG_D(PHY,"ulsch ra (eNB): Or1 %d\n",ulsch_harq->Or1); + LOG_D(PHY,"ulsch ra (eNB): ORI %d\n",ulsch_harq->O_RI); #endif return(0); } int8_t delta_PUSCH_msg2[8] = {-6,-4,-2,0,2,4,6,8}; -int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, +int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, unsigned char eNB_id ) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_RAR,VCD_FUNCTION_IN); + // RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)rar_pdu; - uint8_t transmission_mode = phy_vars_ue->transmission_mode[eNB_id]; - unsigned char *rar_pdu = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b; - unsigned char subframe = phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]; - LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id]; - PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - // int current_dlsch_cqi = phy_vars_ue->current_dlsch_cqi[eNB_id]; + uint8_t transmission_mode = ue->transmission_mode[eNB_id]; + unsigned char *rar_pdu = ue->dlsch_ra[eNB_id]->harq_processes[0]->b; + unsigned char subframe = ue->ulsch_Msg3_subframe[eNB_id]; + LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id]; + PHY_MEASUREMENTS *meas = &ue->measurements; + + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + // int current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id]; uint8_t *rar = (uint8_t *)(rar_pdu+1); - uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_ue->frame_tx,subframe); + uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe); uint16_t rballoc; uint8_t cqireq; uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT; uint16_t RIV_max = 0; - LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",phy_vars_ue->frame_tx,subframe,harq_pid); + LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",proc->frame_tx,subframe,harq_pid); switch (frame_parms->N_RB_DL) { case 6: @@ -228,28 +254,24 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, - ulsch->harq_processes[harq_pid]->TPC = (rar[3]>>3)&7;//rar->TPC; + ulsch->harq_processes[harq_pid]->TPC = (rar[3]>>2)&7;//rar->TPC; rballoc = (((uint16_t)(rar[1]&7))<<7)|(rar[2]>>1); cqireq=rar[3]&1; if (rballoc>RIV_max) { - msg("rar_tools.c: ERROR: rb_alloc (%x) > RIV_max\n",rballoc); + LOG_D(PHY,"rar_tools.c: ERROR: rb_alloc (%x) > RIV_max\n",rballoc); return(-1); } ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT[rballoc]; ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT[rballoc]; - if (ulsch->harq_processes[harq_pid]->nb_rb ==0) - return(-1); + AssertFatal(ulsch->harq_processes[harq_pid]->nb_rb >0, "nb_rb == 0\n"); ulsch->power_offset = ue_power_offsets[ulsch->harq_processes[harq_pid]->nb_rb]; - if (ulsch->harq_processes[harq_pid]->nb_rb > 4) { - msg("rar_tools.c: unlikely rb count for RAR grant : nb_rb > 3\n"); - return(-1); - } + AssertFatal(ulsch->harq_processes[harq_pid]->nb_rb <= 6,"unlikely rb count for RAR grant : nb_rb > 6\n"); // ulsch->harq_processes[harq_pid]->Ndi = 1; if (ulsch->harq_processes[harq_pid]->round == 0) @@ -269,10 +291,10 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, } ulsch->uci_format = HLC_subband_cqi_nopmi; - fill_CQI(ulsch,meas,eNB_id,0,phy_vars_ue->lte_frame_parms.N_RB_DL,0, transmission_mode,phy_vars_ue->sinr_eff); + fill_CQI(ulsch,meas,eNB_id,0,ue->frame_parms.N_RB_DL,0, transmission_mode,ue->sinr_eff); - if (((phy_vars_ue->frame_tx % 100) == 0) || (phy_vars_ue->frame_tx < 10)) - print_CQI(ulsch->o,ulsch->uci_format,eNB_id,phy_vars_ue->lte_frame_parms.N_RB_DL); + if (((proc->frame_tx % 100) == 0) || (proc->frame_tx < 10)) + print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL); } else { ulsch->O_RI = 0; ulsch->O = 0; @@ -304,24 +326,27 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, // initialize power control based on PRACH power ulsch->f_pusch = delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC] + - mac_xface->get_deltaP_rampup(phy_vars_ue->Mod_id,phy_vars_ue->CC_id); + get_deltaP_rampup(ue->Mod_id,ue->CC_id); LOG_D(PHY,"[UE %d][PUSCH PC] Initializing f_pusch to %d dB, TPC %d (delta_PUSCH_msg2 %d dB), deltaP_rampup %d dB\n", - phy_vars_ue->Mod_id,ulsch->f_pusch,ulsch->harq_processes[harq_pid]->TPC,delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC], - mac_xface->get_deltaP_rampup(phy_vars_ue->Mod_id,phy_vars_ue->CC_id)); + ue->Mod_id,ulsch->f_pusch,ulsch->harq_processes[harq_pid]->TPC,delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC], + get_deltaP_rampup(ue->Mod_id,ue->CC_id)); //#ifdef DEBUG_RAR - msg("ulsch ra (UE): harq_pid %d\n",harq_pid); - msg("ulsch ra (UE): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); - msg("ulsch ra (UE): first_rb %x\n",ulsch->harq_processes[harq_pid]->first_rb); - msg("ulsch ra (UE): nb_rb %d\n",ulsch->harq_processes[harq_pid]->nb_rb); - msg("ulsch ra (UE): round %d\n",ulsch->harq_processes[harq_pid]->round); - msg("ulsch ra (UE): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); - msg("ulsch ra (UE): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); - msg("ulsch ra (UE): TPC %d\n",ulsch->harq_processes[harq_pid]->TPC); - msg("ulsch ra (UE): O %d\n",ulsch->O); - msg("ulsch ra (UE): ORI %d\n",ulsch->O_RI); + LOG_D(PHY,"ulsch ra (UE): harq_pid %d\n",harq_pid); + LOG_D(PHY,"ulsch ra (UE): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); + LOG_D(PHY,"ulsch ra (UE): first_rb %x\n",ulsch->harq_processes[harq_pid]->first_rb); + LOG_D(PHY,"ulsch ra (UE): nb_rb %d\n",ulsch->harq_processes[harq_pid]->nb_rb); + LOG_D(PHY,"ulsch ra (UE): round %d\n",ulsch->harq_processes[harq_pid]->round); + LOG_D(PHY,"ulsch ra (UE): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); + LOG_D(PHY,"ulsch ra (UE): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); + LOG_D(PHY,"ulsch ra (UE): TPC %d\n",ulsch->harq_processes[harq_pid]->TPC); + LOG_D(PHY,"ulsch ra (UE): O %d\n",ulsch->O); + LOG_D(PHY,"ulsch ra (UE): ORI %d\n",ulsch->O_RI); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_RAR,VCD_FUNCTION_OUT); + //#endif return(0); } -#endif + diff --git a/openair1/PHY/LTE_TRANSPORT/srs_modulation.c b/openair1/PHY/LTE_TRANSPORT/srs_modulation.c index 249fd81ee4..c4c02e6312 100644 --- a/openair1/PHY/LTE_TRANSPORT/srs_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/srs_modulation.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/srs_modulation.c * \brief Top-level routines for generating sounding reference signal (SRS) V8.6 2009-03 @@ -128,27 +120,34 @@ int compareints (const void * a, const void * b) return ( *(unsigned short*)a - *(unsigned short*)b ); } - -int32_t generate_srs_tx(PHY_VARS_UE *phy_vars_ue, - uint8_t eNB_id, - int16_t amp, - uint32_t subframe) +#define DEBUG_SRS +int32_t generate_srs(LTE_DL_FRAME_PARMS *frame_parms, + SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated, + int32_t *txptr, + int16_t amp, + uint32_t subframe) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; - SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated=&phy_vars_ue->soundingrs_ul_config_dedicated[eNB_id]; - int32_t *txdataF = phy_vars_ue->lte_ue_common_vars.txdataF[0]; - uint16_t msrsb=0,Nb=0,nb,b,msrs0=0,k,Msc_RS,Msc_RS_idx,carrier_pos,symbol_offset; + uint16_t msrsb=0,Nb=0,nb,b,msrs0=0,k,Msc_RS,Msc_RS_idx,carrier_pos; uint16_t *Msc_idx_ptr; int32_t k0; - uint32_t T_SFC; - uint32_t subframe_offset; + //uint32_t subframe_offset; uint8_t Bsrs = soundingrs_ul_config_dedicated->srs_Bandwidth; uint8_t Csrs = frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig; uint8_t Ssrs = frame_parms->soundingrs_ul_config_common.srs_SubframeConfig; uint8_t n_RRC = soundingrs_ul_config_dedicated->freqDomainPosition; uint8_t kTC = soundingrs_ul_config_dedicated->transmissionComb; + // u is the PUCCH sequence-group number defined in Section 5.5.1.3 + // ν is the base sequence number defined in Section 5.5.1.4 + uint32_t u=frame_parms->pucch_config_common.grouphop[1+(subframe<<1)];; + uint32_t v=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)]; + + LOG_D(PHY,"SRS root sequence: u %d, v %d\n",u,v); + LOG_D(PHY,"CommonSrsConfig: Csrs %d, Ssrs %d, AnSrsSimultan %d \n",Csrs,Ssrs,frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission); + LOG_D(PHY,"DedicatedSrsConfig: Bsrs %d, bhop %d, nRRC %d, Isrs %d, kTC %d, n_SRS %d\n",Bsrs,soundingrs_ul_config_dedicated->srs_HoppingBandwidth,n_RRC + ,soundingrs_ul_config_dedicated->srs_ConfigIndex,kTC + ,soundingrs_ul_config_dedicated->cyclicShift); if (frame_parms->N_RB_UL < 41) { msrs0 = msrsb_6_40[Csrs][0]; @@ -169,7 +168,7 @@ int32_t generate_srs_tx(PHY_VARS_UE *phy_vars_ue, } Msc_RS = msrsb * 6; - k0 = (((frame_parms->N_RB_UL>>1)-(msrs0>>1))*12) + kTC; + k0 = ( ( (int16_t)(frame_parms->N_RB_UL>>1) - (int16_t)(msrs0>>1) ) * 12 ) + kTC; nb = (4*n_RRC/msrsb)%Nb; for (b=0; b<=Bsrs; b++) { @@ -177,84 +176,40 @@ int32_t generate_srs_tx(PHY_VARS_UE *phy_vars_ue, } if (k0<0) { - msg("generate_srs: invalid parameter set msrs0=%d, msrsb=%d, Nb=%d => nb=%d, k0=%d\n",msrs0,msrsb,Nb,nb,k0); + LOG_E(PHY,"generate_srs: invalid parameter set msrs0=%d, msrsb=%d, Nb=%d => nb=%d, k0=%d\n",msrs0,msrsb,Nb,nb,k0); return(-1); } -#ifdef USER_MODE Msc_idx_ptr = (uint16_t*) bsearch((uint16_t*) &Msc_RS, (uint16_t*) dftsizes, 33, sizeof(uint16_t), compareints); if (Msc_idx_ptr) Msc_RS_idx = Msc_idx_ptr - dftsizes; else { - msg("generate_srs: index for Msc_RS=%d not found\n",Msc_RS); + LOG_E(PHY,"generate_srs: index for Msc_RS=%d not found\n",Msc_RS); return(-1); } -#else //stdlib not availiable in RTAI - - if (Msc_RS==216) - Msc_RS_idx = 12; - else if (Msc_RS==144) - Msc_RS_idx = 9; - else { - msg("generate_srs: index for Msc_RS=%d not implemented\n",Msc_RS); - return(-1); - } - -#endif - #ifdef DEBUG_SRS - msg("generate_srs_tx: Msc_RS = %d, Msc_RS_idx = %d\n",Msc_RS, Msc_RS_idx); + LOG_D(PHY,"generate_srs_tx: Msc_RS = %d, Msc_RS_idx = %d, k0 = %d\n",Msc_RS, Msc_RS_idx,k0); #endif - T_SFC = (Ssrs<=7 ? 5 : 10); - - if ((1<<(subframe%T_SFC))&transmission_offset_tdd[Ssrs]) { - -#ifndef IFFT_FPGA_UE - carrier_pos = (frame_parms->first_carrier_offset + k0) % frame_parms->ofdm_symbol_size; - //msg("carrier_pos = %d\n",carrier_pos); - - subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->ofdm_symbol_size; - symbol_offset = subframe_offset+(frame_parms->symbols_per_tti-1)*frame_parms->ofdm_symbol_size; + carrier_pos = (frame_parms->first_carrier_offset + k0); + if (carrier_pos>frame_parms->ofdm_symbol_size) { + carrier_pos -= frame_parms->ofdm_symbol_size; + } for (k=0; k>15); - ((short*) txdataF)[2*(symbol_offset + carrier_pos)+1] = (short) (((int32_t) amp * (int32_t) ul_ref_sigs[0][0][Msc_RS_idx][(k<<1)+1])>>15); - carrier_pos+=2; + int32_t real = ((int32_t) amp * (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][k<<1]) >> 15; + int32_t imag = ((int32_t) amp * (int32_t) ul_ref_sigs[u][v][Msc_RS_idx][(k<<1)+1]) >> 15; + txptr[carrier_pos] = (real&0xFFFF) + ((imag<<16)&0xFFFF0000); + + + carrier_pos = carrier_pos+2; if (carrier_pos >= frame_parms->ofdm_symbol_size) - carrier_pos=1; + carrier_pos=carrier_pos-frame_parms->ofdm_symbol_size; } -#else - carrier_pos = (frame_parms->N_RB_UL*12/2 + k0) % (frame_parms->N_RB_UL*12); - //msg("carrier_pos = %d\n",carrier_pos); - - subframe_offset = subframe*frame_parms->symbols_per_tti*frame_parms->N_RB_UL*12; - symbol_offset = subframe_offset+(frame_parms->symbols_per_tti-1)*frame_parms->N_RB_UL*12; - - for (k=0; k= 0) && (ul_ref_sigs[0][0][Msc_RS_idx][(k<<1)+1] >= 0)) - txdataF[symbol_offset+carrier_pos] = (int32_t) 4; - else if ((ul_ref_sigs[0][0][Msc_RS_idx][k<<1] >= 0) && (ul_ref_sigs[0][0][Msc_RS_idx][(k<<1)+1] < 0)) - txdataF[symbol_offset+carrier_pos] = (int32_t) 2; - else if ((ul_ref_sigs[0][0][Msc_RS_idx][k<<1] < 0) && (ul_ref_sigs[0][0][Msc_RS_idx][(k<<1)+1] >= 0)) - txdataF[symbol_offset+carrier_pos] = (int32_t) 3; - else if ((ul_ref_sigs[0][0][Msc_RS_idx][k<<1] < 0) && (ul_ref_sigs[0][0][Msc_RS_idx][(k<<1)+1] < 0)) - txdataF[symbol_offset+carrier_pos] = (int32_t) 1; - - carrier_pos+=2; - - if (carrier_pos >= frame_parms->N_RB_UL*12) - carrier_pos=0; - } - -#endif - // write_output("srs_txF.m","srstxF",&txdataF[symbol_offset],512,1,1); - } - return(0); } @@ -265,6 +220,7 @@ int generate_srs_tx_emul(PHY_VARS_UE *phy_vars_ue,uint8_t subframe) return(0); } +#if 0 int generate_srs_rx(LTE_DL_FRAME_PARMS *frame_parms, SOUNDINGRS_UL_CONFIG_DEDICATED *soundingrs_ul_config_dedicated, int *txdataF) @@ -305,44 +261,28 @@ int generate_srs_rx(LTE_DL_FRAME_PARMS *frame_parms, } if (k0<0) { - msg("Invalid parameter set msrs0=%d, msrsb=%d, Nb=%d => nb=%d, k0=%d\n",msrs0,msrsb,Nb,nb,k0); + LOG_E(PHY,"Invalid parameter set msrs0=%d, msrsb=%d, Nb=%d => nb=%d, k0=%d\n",msrs0,msrsb,Nb,nb,k0); return(-1); } -#ifdef USER_MODE Msc_idx_ptr = (uint16_t*) bsearch((uint16_t*) &Msc_RS, (uint16_t*) dftsizes, 33, sizeof(uint16_t), compareints); if (Msc_idx_ptr) Msc_RS_idx = Msc_idx_ptr - dftsizes; else { - msg("generate_srs: index for Msc_RS=%d not found\n",Msc_RS); + LOG_E(PHY,"generate_srs: index for Msc_RS=%d not found\n",Msc_RS); return(-1); } -#else //stdlib not availiable in RTAI - - if (Msc_RS==216) - Msc_RS_idx = 12; - else if (Msc_RS==144) - Msc_RS_idx = 9; - else { - msg("generate_srs: index for Msc_RS=%d not implemented\n",Msc_RS); - return(-1); - } - -#endif - #ifdef DEBUG_SRS - msg("generate_srs_rx: Msc_RS = %d, Msc_RS_idx = %d, k0=%d\n",Msc_RS, Msc_RS_idx,k0); + LOG_I(PHY,"generate_srs_rx: Msc_RS = %d, Msc_RS_idx = %d, k0=%d\n",Msc_RS, Msc_RS_idx,k0); #endif carrier_pos = (frame_parms->first_carrier_offset + k0) % frame_parms->ofdm_symbol_size; for (k=0; k= frame_parms->ofdm_symbol_size) @@ -385,7 +325,7 @@ int generate_srs_rx(LTE_DL_FRAME_PARMS *frame_parms, // write_output("srs_rx.m","srsrx",txdataF,1024,2,1); return(0); } - +#endif #ifdef MAIN main() diff --git a/openair1/PHY/LTE_TRANSPORT/sss.c b/openair1/PHY/LTE_TRANSPORT/sss.c index 34d55daaea..17a4680c54 100644 --- a/openair1/PHY/LTE_TRANSPORT/sss.c +++ b/openair1/PHY/LTE_TRANSPORT/sss.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/sss.c * \brief Top-level routines for generating and decoding the secondary synchronization signal (SSS) V8.6 2009-03 @@ -67,10 +59,10 @@ int generate_sss(int32_t **txdataF, Nsymb = (frame_parms->Ncp==NORMAL)?14:12; k = frame_parms->ofdm_symbol_size-3*12+5; - a = (frame_parms->nb_antennas_tx == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15; + a = (frame_parms->nb_antenna_ports_eNB == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15; for (i=0; i<62; i++) { - for (aa=0; aanb_antennas_tx; aa++) { + for (aa=0; aanb_antenna_ports_eNB; aa++) { ((int16_t*)txdataF[aa])[2*(slot_offset*Nsymb/2*frame_parms->ofdm_symbol_size + symbol*frame_parms->ofdm_symbol_size + k)] = @@ -90,7 +82,7 @@ int generate_sss(int32_t **txdataF, return(0); } -int pss_ch_est(PHY_VARS_UE *phy_vars_ue, +int pss_ch_est(PHY_VARS_UE *ue, int32_t pss_ext[4][72], int32_t sss_ext[4][72]) { @@ -98,9 +90,9 @@ int pss_ch_est(PHY_VARS_UE *phy_vars_ue, int16_t *pss; int16_t *pss_ext2,*sss_ext2,*sss_ext3,tmp_re,tmp_im,tmp_re2,tmp_im2; uint8_t aarx,i; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; - switch (phy_vars_ue->lte_ue_common_vars.eNb_id) { + switch (ue->common_vars.eNb_id) { case 0: pss = &primary_synch0[10]; @@ -154,9 +146,11 @@ int pss_ch_est(PHY_VARS_UE *phy_vars_ue, } -int pss_sss_extract(PHY_VARS_UE *phy_vars_ue, +int _do_pss_sss_extract(PHY_VARS_UE *ue, int32_t pss_ext[4][72], - int32_t sss_ext[4][72]) + int32_t sss_ext[4][72], + uint8_t doPss, uint8_t doSss, + uint8_t subframe) // add flag to indicate extracting only PSS, only SSS, or both { @@ -165,42 +159,94 @@ int pss_sss_extract(PHY_VARS_UE *phy_vars_ue, uint8_t i,aarx; int32_t *pss_rxF,*pss_rxF_ext; int32_t *sss_rxF,*sss_rxF_ext; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + uint8_t next_thread_id = ue->current_thread_id[subframe]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[subframe]+1); int rx_offset = frame_parms->ofdm_symbol_size-3*12; uint8_t pss_symb,sss_symb; - int32_t **rxdataF = phy_vars_ue->lte_ue_common_vars.rxdataF; - - if (frame_parms->frame_type == FDD) { - pss_symb = 6-frame_parms->Ncp; - sss_symb = pss_symb-1; - } else { - pss_symb = 2; - sss_symb = frame_parms->symbols_per_tti-1; - } + int32_t **rxdataF; + //LOG_I(PHY,"do_pss_sss_extract subframe %d \n",subframe); for (aarx=0; aarxnb_antennas_rx; aarx++) { + if (frame_parms->frame_type == FDD) { + pss_symb = 6-frame_parms->Ncp; + sss_symb = pss_symb-1; + + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF; + pss_rxF = &rxdataF[aarx][(rx_offset + (pss_symb*(frame_parms->ofdm_symbol_size)))]; + sss_rxF = &rxdataF[aarx][(rx_offset + (sss_symb*(frame_parms->ofdm_symbol_size)))]; + + } else { + pss_symb = 2; + sss_symb = frame_parms->symbols_per_tti-1; + + if(subframe==5 || subframe==0) + { + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF; + sss_rxF = &rxdataF[aarx][(rx_offset + (sss_symb*(frame_parms->ofdm_symbol_size)))]; + + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF; + pss_rxF = &rxdataF[aarx][(rx_offset + (pss_symb*(frame_parms->ofdm_symbol_size)))]; + } + else if(subframe==6 || subframe==1) + { + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF; + pss_rxF = &rxdataF[aarx][(rx_offset + (pss_symb*(frame_parms->ofdm_symbol_size)))]; + + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF; + sss_rxF = &rxdataF[aarx][(rx_offset + (sss_symb*(frame_parms->ofdm_symbol_size)))]; + } + else + { + AssertFatal(0,""); + } + + } //printf("extract_rbs: symbol_mod=%d, rx_offset=%d, ch_offset=%d\n",symbol_mod, // (rx_offset + (symbol*(frame_parms->ofdm_symbol_size)))*2, // LTE_CE_OFFSET+ch_offset+(symbol_mod*(frame_parms->ofdm_symbol_size))); - pss_rxF = &rxdataF[aarx][(rx_offset + (pss_symb*(frame_parms->ofdm_symbol_size)))]; - sss_rxF = &rxdataF[aarx][(rx_offset + (sss_symb*(frame_parms->ofdm_symbol_size)))]; pss_rxF_ext = &pss_ext[aarx][0]; sss_rxF_ext = &sss_ext[aarx][0]; for (rb=0; rbofdm_symbol_size)))]; - pss_rxF = &rxdataF[aarx][(1 + (pss_symb*(frame_parms->ofdm_symbol_size)))]; + if(frame_parms->frame_type == FDD) + { + sss_rxF = &rxdataF[aarx][(1 + (sss_symb*(frame_parms->ofdm_symbol_size)))]; + pss_rxF = &rxdataF[aarx][(1 + (pss_symb*(frame_parms->ofdm_symbol_size)))]; + } + else + { + if(subframe==5 || subframe==0) + { + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF; + sss_rxF = &rxdataF[aarx][(1 + (sss_symb*(frame_parms->ofdm_symbol_size)))]; + + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF; + pss_rxF = &rxdataF[aarx][(1 + (pss_symb*(frame_parms->ofdm_symbol_size)))]; + } + else if(subframe==6 || subframe==1) + { + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF; + pss_rxF = &rxdataF[aarx][(rx_offset + (pss_symb*(frame_parms->ofdm_symbol_size)))]; + + rxdataF = ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF; + sss_rxF = &rxdataF[aarx][(rx_offset + (sss_symb*(frame_parms->ofdm_symbol_size)))]; + } + else + { + AssertFatal(0,""); + } + } } for (i=0; i<12; i++) { - pss_rxF_ext[i]=pss_rxF[i]; - sss_rxF_ext[i]=sss_rxF[i]; + if (doPss) {pss_rxF_ext[i]=pss_rxF[i];} + if (doSss) {sss_rxF_ext[i]=sss_rxF[i];} } pss_rxF+=12; @@ -214,79 +260,104 @@ int pss_sss_extract(PHY_VARS_UE *phy_vars_ue, return(0); } +int pss_sss_extract(PHY_VARS_UE *phy_vars_ue, + int32_t pss_ext[4][72], + int32_t sss_ext[4][72], + uint8_t subframe) +{ + return _do_pss_sss_extract(phy_vars_ue, pss_ext, sss_ext, 1 /* doPss */, 1 /* doSss */, subframe); +} + +int pss_only_extract(PHY_VARS_UE *phy_vars_ue, + int32_t pss_ext[4][72], + uint8_t subframe) +{ + static int32_t dummy[4][72]; + return _do_pss_sss_extract(phy_vars_ue, pss_ext, dummy, 1 /* doPss */, 0 /* doSss */, subframe); +} + + +int sss_only_extract(PHY_VARS_UE *phy_vars_ue, + int32_t sss_ext[4][72], + uint8_t subframe) +{ + static int32_t dummy[4][72]; + return _do_pss_sss_extract(phy_vars_ue, dummy, sss_ext, 0 /* doPss */, 1 /* doSss */, subframe); +} + int16_t phase_re[7] = {16383, 25101, 30791, 32767, 30791, 25101, 16383}; int16_t phase_im[7] = {-28378, -21063, -11208, 0, 11207, 21062, 28377}; -int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_t *phase_max) +int rx_sss(PHY_VARS_UE *ue,int32_t *tot_metric,uint8_t *flip_max,uint8_t *phase_max) { uint8_t i; int32_t pss_ext[4][72]; int32_t sss0_ext[4][72],sss5_ext[4][72]; - uint8_t Nid2 = phy_vars_ue->lte_ue_common_vars.eNb_id; + uint8_t Nid2 = ue->common_vars.eNb_id; uint8_t flip,phase; uint16_t Nid1; int16_t *sss0,*sss5; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; int32_t metric; int16_t *d0,*d5; - if (phy_vars_ue->lte_frame_parms.frame_type == FDD) { + if (frame_parms->frame_type == FDD) { #ifdef DEBUG_SSS - if (phy_vars_ue->lte_frame_parms.Ncp == NORMAL) - msg("[PHY][UE%d] Doing SSS for FDD Normal Prefix\n",phy_vars_ue->Mod_id); + if (frame_parms->Ncp == NORMAL) + msg("[PHY][UE%d] Doing SSS for FDD Normal Prefix\n",ue->Mod_id); else - msg("[PHY][UE%d] Doing SSS for FDD Extended Prefix\n",phy_vars_ue->Mod_id); + msg("[PHY][UE%d] Doing SSS for FDD Extended Prefix\n",ue->Mod_id); #endif // Do FFTs for SSS/PSS // SSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti/2)-2, // second to last symbol of 0, // slot 0 - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); // PSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti/2)-1, // last symbol of 0, // slot 0 - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); } else { // TDD #ifdef DEBUG_SSS - if (phy_vars_ue->lte_frame_parms.Ncp == NORMAL) - msg("[PHY][UE%d] Doing SSS for TDD Normal Prefix\n",phy_vars_ue->Mod_id); + if (ue->frame_parms->Ncp == NORMAL) + msg("[PHY][UE%d] Doing SSS for TDD Normal Prefix\n",ue->Mod_id); else - msg("[PHY][UE%d] Doing SSS for TDD Extended Prefix\n",phy_vars_ue->Mod_id); + msg("[PHY][UE%d] Doing SSS for TDD Extended Prefix\n",ue->Mod_id); #endif // SSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti>>1)-1, // last symbol of 1, // slot 1 - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); // PSS - slot_fep(phy_vars_ue, + slot_fep(ue, 2, // symbol 2 of 2, // slot 2 - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); } - - pss_sss_extract(phy_vars_ue, + // pss sss extract for subframe 0 + pss_sss_extract(ue, pss_ext, - sss0_ext); + sss0_ext,0); /* - write_output("rxsig0.m","rxs0",&phy_vars_ue->lte_ue_common_vars.rxdata[0][0],phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); - write_output("rxdataF0.m","rxF0",&phy_vars_ue->lte_ue_common_vars.rxdataF[0][0],2*14*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,2,1); + write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata[0][0],ue->frame_parms.samples_per_tti,1,1); + write_output("rxdataF0.m","rxF0",&ue->common_vars.rxdataF[0][0],2*14*ue->frame_parms.ofdm_symbol_size,2,1); write_output("pss_ext0.m","pssext0",pss_ext,72,1,1); write_output("sss0_ext0.m","sss0ext0",sss0_ext,72,1,1); */ @@ -294,52 +365,53 @@ int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_ // get conjugated channel estimate from PSS (symbol 6), H* = R* \cdot PSS // and do channel estimation and compensation based on PSS - pss_ch_est(phy_vars_ue, + pss_ch_est(ue, pss_ext, sss0_ext); // write_output("sss0_comp0.m","sss0comp0",sss0_ext,72,1,1); - if (phy_vars_ue->lte_frame_parms.frame_type == FDD) { // FDD + if (ue->frame_parms.frame_type == FDD) { // FDD // SSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti/2)-2, 10, - phy_vars_ue->rx_offset, + ue->rx_offset, 0,1); // PSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti/2)-1, 10, - phy_vars_ue->rx_offset, + ue->rx_offset, 0,1); } else { // TDD // SSS - slot_fep(phy_vars_ue, + slot_fep(ue, (frame_parms->symbols_per_tti>>1)-1, 11, - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); // PSS - slot_fep(phy_vars_ue, + slot_fep(ue, 2, 12, - phy_vars_ue->rx_offset, + ue->rx_offset, 0, 1); } - pss_sss_extract(phy_vars_ue, + // pss sss extract for subframe 5 + pss_sss_extract(ue, pss_ext, - sss5_ext); + sss5_ext,5); // write_output("sss5_ext0.m","sss5ext0",sss5_ext,72,1,1); // get conjugated channel estimate from PSS (symbol 6), H* = R* \cdot PSS // and do channel estimation and compensation based on PSS - pss_ch_est(phy_vars_ue, + pss_ch_est(ue, pss_ext, sss5_ext); @@ -375,7 +447,7 @@ int rx_sss(PHY_VARS_UE *phy_vars_ue,int32_t *tot_metric,uint8_t *flip_max,uint8_ // if the current metric is better than the last save it if (metric > *tot_metric) { *tot_metric = metric; - phy_vars_ue->lte_frame_parms.Nid_cell = Nid2+(3*Nid1); + ue->frame_parms.Nid_cell = Nid2+(3*Nid1); *phase_max = phase; *flip_max=flip; #ifdef DEBUG_SSS diff --git a/openair1/PHY/LTE_TRANSPORT/sss.h b/openair1/PHY/LTE_TRANSPORT/sss.h index 5b79f95610..6d42acaefc 100644 --- a/openair1/PHY/LTE_TRANSPORT/sss.h +++ b/openair1/PHY/LTE_TRANSPORT/sss.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ int16_t d0_sss[504*62] = {1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,-1,1,1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,1,-1,1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,-1,1,-1,-1,1,1,1,-1,1,1,-1,-1,-1,1,1,-1,1,1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,1,1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,-1,1,-1,1,1,1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,-1,1,1,-1,1,1,1,-1,1,1,1,1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1,1,1,-1,1,-1,1,1,-1,-1,-1,-1,1,1,1,1,1,1,1,-1,1,1,1,-1,1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,-1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,1,-1,-1,1,-1,1,1,1,1,1,1,1,-1,-1,-1,1,-1,1,-1,1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,1,1,-1,1,-1,1,-1,-1,1,-1,1,-1,-1,1,-1,1,-1,1,-1,1,-1}; diff --git a/openair1/PHY/LTE_TRANSPORT/uci.h b/openair1/PHY/LTE_TRANSPORT/uci.h index 03580cf4c9..c7741533da 100644 --- a/openair1/PHY/LTE_TRANSPORT/uci.h +++ b/openair1/PHY/LTE_TRANSPORT/uci.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" diff --git a/openair1/PHY/LTE_TRANSPORT/uci_tools.c b/openair1/PHY/LTE_TRANSPORT/uci_tools.c index 6a475d52ee..65640e2ec7 100644 --- a/openair1/PHY/LTE_TRANSPORT/uci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/uci_tools.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/phich.c * \brief Routines for generation of and computations regarding the uplink control information (UCI) for PUSCH. V8.6 2009-03 @@ -176,6 +168,7 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_ //unsigned char rank; //UCI_format fmt; //uint8_t N_RB_DL = 25; + uint8_t i; LOG_D(PHY,"[eNB][UCI] N_RB_DL %d uci format %d\n", N_RB_DL,uci_format); switch(N_RB_DL) { @@ -239,18 +232,6 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_ stats->DL_pmi_dual = ((HLC_subband_cqi_rank2_2A_1_5MHz *)o)->pmi; break; - case HLC_subband_cqi_mcs_CBA: - if ((*crnti == ((HLC_subband_cqi_mcs_CBA_1_5MHz *)o)->crnti) && (*crnti !=0)) { - *access_mode=CBA_ACCESS; - LOG_N(PHY,"[eNB] UCI for CBA : mcs %d crnti %x\n", - ((HLC_subband_cqi_mcs_CBA_1_5MHz *)o)->mcs, ((HLC_subband_cqi_mcs_CBA_1_5MHz *)o)->crnti); - } else { - LOG_D(PHY,"[eNB] UCI for CBA : rnti (enb context %x, rx uci %x) invalid, unknown access\n", - *crnti, ((HLC_subband_cqi_mcs_CBA_1_5MHz *)o)->crnti); - } - - break; - case unknown_cqi: default: LOG_N(PHY,"[eNB][UCI] received unknown uci (rb %d)\n",N_RB_DL); @@ -283,6 +264,11 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_ stats->DL_cqi[1] = 24; stats->DL_pmi_dual = ((wideband_cqi_rank2_2A_5MHz *)o)->pmi; + //this translates the 2-layer PMI into a single layer PMI for the first codeword + //the PMI for the second codeword will be stats->DL_pmi_single^0x1555 + stats->DL_pmi_single = 0; + for (i=0;i<7;i++) + stats->DL_pmi_single = stats->DL_pmi_single | (((stats->DL_pmi_dual&(1>i)*2)<<2*i; break; case HLC_subband_cqi_nopmi: @@ -320,18 +306,6 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_ stats->DL_pmi_dual = ((HLC_subband_cqi_rank2_2A_5MHz *)o)->pmi; break; - case HLC_subband_cqi_mcs_CBA: - if ((*crnti == ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti) && (*crnti !=0)) { - *access_mode=CBA_ACCESS; - LOG_N(PHY,"[eNB] UCI for CBA : mcs %d crnti %x\n", - ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->mcs, ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti); - } else { - LOG_D(PHY,"[eNB] UCI for CBA : rnti (enb context %x, rx uci %x) invalid, unknown access\n", - *crnti, ((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti); - } - - break; - case unknown_cqi: default: LOG_N(PHY,"[eNB][UCI] received unknown uci (rb %d)\n",N_RB_DL); @@ -400,18 +374,6 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_ stats->DL_pmi_dual = ((HLC_subband_cqi_rank2_2A_10MHz *)o)->pmi; break; - case HLC_subband_cqi_mcs_CBA: - if ((*crnti == ((HLC_subband_cqi_mcs_CBA_10MHz *)o)->crnti) && (*crnti !=0)) { - *access_mode=CBA_ACCESS; - LOG_N(PHY,"[eNB] UCI for CBA : mcs %d crnti %x\n", - ((HLC_subband_cqi_mcs_CBA_10MHz *)o)->mcs, ((HLC_subband_cqi_mcs_CBA_10MHz *)o)->crnti); - } else { - LOG_D(PHY,"[eNB] UCI for CBA : rnti (enb context %x, rx uci %x) invalid, unknown access\n", - *crnti, ((HLC_subband_cqi_mcs_CBA_10MHz *)o)->crnti); - } - - break; - case unknown_cqi: default: LOG_N(PHY,"[eNB][UCI] received unknown uci (RB %d)\n",N_RB_DL); @@ -480,18 +442,6 @@ void extract_CQI(void *o,UCI_format_t uci_format,LTE_eNB_UE_stats *stats, uint8_ stats->DL_pmi_dual = ((HLC_subband_cqi_rank2_2A_20MHz *)o)->pmi; break; - case HLC_subband_cqi_mcs_CBA: - if ((*crnti == ((HLC_subband_cqi_mcs_CBA_20MHz *)o)->crnti) && (*crnti !=0)) { - *access_mode=CBA_ACCESS; - LOG_N(PHY,"[eNB] UCI for CBA : mcs %d crnti %x\n", - ((HLC_subband_cqi_mcs_CBA_20MHz *)o)->mcs, ((HLC_subband_cqi_mcs_CBA_20MHz *)o)->crnti); - } else { - LOG_D(PHY,"[eNB] UCI for CBA : rnti (enb context %x, rx uci %x) invalid, unknown access\n", - *crnti, ((HLC_subband_cqi_mcs_CBA_20MHz *)o)->crnti); - } - - break; - case unknown_cqi: default: LOG_N(PHY,"[eNB][UCI] received unknown uci (RB %d)\n",N_RB_DL); @@ -589,6 +539,7 @@ void print_CQI(void *o,UCI_format_t uci_format,unsigned char eNB_id,int N_RB_DL) switch(uci_format) { case wideband_cqi_rank1_2A: #ifdef DEBUG_UCI + LOG_D(PHY,"[PRINT CQI] flat_LA %d\n", flag_LA); switch(N_RB_DL) { case 6: LOG_I(PHY,"[PRINT CQI] wideband_cqi rank 1: eNB %d, cqi %d\n",eNB_id, @@ -751,13 +702,6 @@ void print_CQI(void *o,UCI_format_t uci_format,unsigned char eNB_id,int N_RB_DL) break; } -#endif //DEBUG_UCI - break; - - case HLC_subband_cqi_mcs_CBA: -#ifdef DEBUG_UCI - LOG_I(PHY,"[PRINT CQI] hlc_cqi_mcs_CBA : eNB %d, mcs %d\n",eNB_id,((HLC_subband_cqi_mcs_CBA_5MHz *)o)->mcs); - LOG_I(PHY,"[PRINT CQI] hlc_cqi_mcs_CBA : eNB %d, rnti %x\n",eNB_id,((HLC_subband_cqi_mcs_CBA_5MHz *)o)->crnti); #endif //DEBUG_UCI break; @@ -844,3 +788,22 @@ void print_CQI(void *o,UCI_format_t uci_format,unsigned char eNB_id,int N_RB_DL) } + +int8_t find_uci(uint16_t rnti, int frame, int subframe, PHY_VARS_eNB *eNB,find_type_t type) { + uint8_t i; + int8_t first_free_index=-1; + + AssertFatal(eNB!=NULL,"eNB is null\n"); + for (i=0; iuci_vars[i].active >0) && + (eNB->uci_vars[i].rnti==rnti) && + (eNB->uci_vars[i].frame==frame) && + (eNB->uci_vars[i].subframe==subframe)) return(i); + else if ((eNB->uci_vars[i].active == 0) && (first_free_index==-1)) first_free_index=i; + } + if (type == SEARCH_EXIST) return(-1); + else return(first_free_index); +} + + + diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index 1004cfa192..87209e190b 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/ulsch_coding.c * \brief Top-level routines for coding the ULSCH transport channel as described in 36.212 V8.6 2009-03 @@ -70,35 +62,35 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) if (ulsch) { #ifdef DEBUG_ULSCH_FREE - msg("Freeing ulsch %p\n",ulsch); + printf("Freeing ulsch %p\n",ulsch); #endif for (i=0; i<8; i++) { #ifdef DEBUG_ULSCH_FREE - msg("Freeing ulsch process %d\n",i); + printf("Freeing ulsch process %d\n",i); #endif if (ulsch->harq_processes[i]) { #ifdef DEBUG_ULSCH_FREE - msg("Freeing ulsch process %d (%p)\n",i,ulsch->harq_processes[i]); + printf("Freeing ulsch process %d (%p)\n",i,ulsch->harq_processes[i]); #endif if (ulsch->harq_processes[i]->b) { free16(ulsch->harq_processes[i]->b,MAX_ULSCH_PAYLOAD_BYTES); ulsch->harq_processes[i]->b = NULL; #ifdef DEBUG_ULSCH_FREE - msg("Freeing ulsch process %d b (%p)\n",i,ulsch->harq_processes[i]->b); + printf("Freeing ulsch process %d b (%p)\n",i,ulsch->harq_processes[i]->b); #endif } #ifdef DEBUG_ULSCH_FREE - msg("Freeing ulsch process %d c (%p)\n",i,ulsch->harq_processes[i]->c); + printf("Freeing ulsch process %d c (%p)\n",i,ulsch->harq_processes[i]->c); #endif for (r=0; rharq_processes[i]->c[r]); + printf("Freeing ulsch process %d c[%d] (%p)\n",i,r,ulsch->harq_processes[i]->c[r]); #endif if (ulsch->harq_processes[i]->c[r]) { @@ -148,6 +140,8 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) if (ulsch) { memset(ulsch,0,sizeof(LTE_UE_ULSCH_t)); + ulsch->Mlimit = 4; + for (i=0; i<8; i++) { ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t)); @@ -196,7 +190,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) return(ulsch); } - LOG_E(PHY,"new_ue_ulsch exit flag, size of %d , %d\n",exit_flag, sizeof(LTE_UE_ULSCH_t)); + LOG_E(PHY,"new_ue_ulsch exit flag, size of %d , %zu\n",exit_flag, sizeof(LTE_UE_ULSCH_t)); free_ue_ulsch(ulsch); return(NULL); @@ -205,19 +199,20 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) uint32_t ulsch_encoding(uint8_t *a, - PHY_VARS_UE *phy_vars_ue, + PHY_VARS_UE *ue, uint8_t harq_pid, uint8_t eNB_id, + uint8_t subframe_rx, uint8_t tmode, uint8_t control_only_flag, uint8_t Nbundled) { - time_stats_t *seg_stats=&phy_vars_ue->ulsch_segmentation_stats; - time_stats_t *rm_stats=&phy_vars_ue->ulsch_rate_matching_stats; - time_stats_t *te_stats=&phy_vars_ue->ulsch_turbo_encoding_stats; - time_stats_t *i_stats=&phy_vars_ue->ulsch_interleaving_stats; - time_stats_t *m_stats=&phy_vars_ue->ulsch_multiplexing_stats; + time_stats_t *seg_stats=&ue->ulsch_segmentation_stats; + time_stats_t *rm_stats=&ue->ulsch_rate_matching_stats; + time_stats_t *te_stats=&ue->ulsch_turbo_encoding_stats; + time_stats_t *i_stats=&ue->ulsch_interleaving_stats; + time_stats_t *m_stats=&ue->ulsch_multiplexing_stats; // uint16_t offset; uint32_t crc=1; @@ -236,18 +231,18 @@ uint32_t ulsch_encoding(uint8_t *a, uint16_t o_RCC; uint8_t o_flip[8]; uint32_t wACK_idx; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; - PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements; - LTE_UE_ULSCH_t *ulsch=phy_vars_ue->ulsch_ue[eNB_id]; - LTE_UE_DLSCH_t **dlsch = phy_vars_ue->dlsch_ue[eNB_id]; - uint16_t rnti; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + PHY_MEASUREMENTS *meas = &ue->measurements; + LTE_UE_ULSCH_t *ulsch=ue->ulsch[eNB_id]; + LTE_UE_DLSCH_t **dlsch = ue->dlsch[0][eNB_id]; + uint16_t rnti = 0xffff; if (!ulsch) { LOG_E(PHY,"Null ulsch ptr %p\n",ulsch); return(-1); } - if (harq_pid > 7) { + if (harq_pid >= 8) { LOG_E(PHY,"Illegal harq_pid %d\n",harq_pid); return(-1); } @@ -266,17 +261,19 @@ uint32_t ulsch_encoding(uint8_t *a, // fill CQI/PMI information if (ulsch->O>0) { - rnti = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti; - fill_CQI(ulsch,meas,0,harq_pid,phy_vars_ue->lte_frame_parms.N_RB_DL,rnti, tmode,phy_vars_ue->sinr_eff); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_IN); + rnti = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti; + fill_CQI(ulsch,meas,0,harq_pid,ue->frame_parms.N_RB_DL,rnti, tmode,ue->sinr_eff); - LOG_D(PHY,"UE CQI\n"); - print_CQI(ulsch->o,ulsch->uci_format,0,phy_vars_ue->lte_frame_parms.N_RB_DL); + LOG_D(PHY,"ULSCH Encoding rnti %x \n", rnti); + print_CQI(ulsch->o,ulsch->uci_format,0,ue->frame_parms.N_RB_DL); // save PUSCH pmi for later (transmission modes 4,5,6) if (dlsch[0]) { //LOG_I(PHY,"XXX saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi)); dlsch[0]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi; } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_OUT); } if (ulsch->O<=32) { @@ -302,7 +299,7 @@ uint32_t ulsch_encoding(uint8_t *a, ulsch->harq_processes[harq_pid]->control_only = 0; #ifdef DEBUG_ULSCH_CODING - msg("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n", + printf("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n", ulsch->harq_processes[harq_pid]->TBS, Q_m, ulsch->harq_processes[harq_pid]->mcs, @@ -311,22 +308,22 @@ uint32_t ulsch_encoding(uint8_t *a, ulsch->harq_processes[harq_pid]->rvidx); for (i=0; iharq_processes[harq_pid]->O_ACK; i++) - msg("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]); + printf("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]); for (i=0; iO_RI; i++) - msg("ulsch_coding: o_RI[%d] %d\n",i,ulsch->o_RI[i]); + printf("ulsch_coding: o_RI[%d] %d\n",i,ulsch->o_RI[i]); - msg("ulsch_coding: O=%d\n",ulsch->O); + printf("ulsch_coding: O=%d\n",ulsch->O); for (i=0; i<1+((8+ulsch->O)/8); i++) { // ulsch->o[i] = i; - msg("ulsch_coding: O[%d] %d\n",i,ulsch->o[i]); + printf("ulsch_coding: O[%d] %d\n",i,ulsch->o[i]); } if ((tmode != 4)) - print_CQI(ulsch->o,wideband_cqi_rank1_2A,0,phy_vars_ue->lte_frame_parms.N_RB_DL); + print_CQI(ulsch->o,wideband_cqi_rank1_2A,0,ue->frame_parms.N_RB_DL); else - print_CQI(ulsch->o,HLC_subband_cqi_rank1_2A,0,phy_vars_ue->lte_frame_parms.N_RB_DL); + print_CQI(ulsch->o,HLC_subband_cqi_rank1_2A,0,ue->frame_parms.N_RB_DL); #endif @@ -380,20 +377,20 @@ uint32_t ulsch_encoding(uint8_t *a, #ifdef DEBUG_ULSCH_CODING - msg("Generating Code Segment %d (%d bits)\n",r,Kr); + printf("Generating Code Segment %d (%d bits)\n",r,Kr); // generate codewords - msg("bits_per_codeword (Kr)= %d\n",Kr); - msg("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb); - msg("Ncp %d\n",frame_parms->Ncp); - msg("Qm %d\n",Q_m); + printf("bits_per_codeword (Kr)= %d\n",Kr); + printf("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb); + printf("Ncp %d\n",frame_parms->Ncp); + printf("Qm %d\n",Q_m); #endif // offset=0; #ifdef DEBUG_ULSCH_CODING - msg("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]); + printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]); #endif start_meas(te_stats); threegpplte_turbo_encoder(ulsch->harq_processes[harq_pid]->c[r], @@ -475,6 +472,16 @@ uint32_t ulsch_encoding(uint8_t *a, Q_ACK = Qprime * Q_m; Qprime_ACK = Qprime; + LOG_D(PHY,"UE (%x/%d) O_ACK %d, Mcs_initial %d, Nsymb_initial %d, beta_offset_harqack*8 %d, sum Kr %d, Qprime_ACK %d, Q_ACK %d\n", + rnti, harq_pid, + ulsch->harq_processes[harq_pid]->O_ACK, + ulsch->harq_processes[harq_pid]->Msc_initial, + ulsch->harq_processes[harq_pid]->Nsymb_initial, + ulsch->beta_offset_harqack_times8, + sumKr, + Qprime_ACK, + Q_ACK); + // Compute Q_cqi, assume O>11, p. 26 36-212 if (control_only_flag == 0) { @@ -506,6 +513,21 @@ uint32_t ulsch_encoding(uint8_t *a, G = G - Q_RI - Q_CQI; + ulsch->harq_processes[harq_pid]->G = G; + +/* + LOG_I(PHY,"ULSCH Encoding G %d, Q_RI %d (O_RI%d, Msc_initial %d, Nsymb_initial%d, beta_offset_ri_times8 %d), Q_CQI %d, Q_ACK %d \n",G,Q_RI,ulsch->O_RI,ulsch->harq_processes[harq_pid]->Msc_initial,ulsch->harq_processes[harq_pid]->Nsymb_initial,ulsch->beta_offset_ri_times8,Q_CQI,Q_ACK); + + LOG_I(PHY,"ULSCH Encoding (Nid_cell %d, rnti %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d\n", + frame_parms->Nid_cell,ulsch->rnti, + harq_pid, + ulsch->harq_processes[harq_pid]->round, + ulsch->harq_processes[harq_pid]->rvidx, + ulsch->harq_processes[harq_pid]->mcs, + ulsch->O_RI, + ulsch->harq_processes[harq_pid]->O_ACK, + G); +*/ if ((int)G < 0) { LOG_E(PHY,"FATAL: ulsch_coding.c G < 0 (%d) : Q_RI %d, Q_CQI %d, O %d, betaCQI_times8 %d)\n",G,Q_RI,Q_CQI,ulsch->O,ulsch->beta_offset_cqi_times8); @@ -526,7 +548,7 @@ uint32_t ulsch_encoding(uint8_t *a, for (r=0; rharq_processes[harq_pid]->C; r++) { #ifdef DEBUG_ULSCH_CODING - msg("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", + printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", r, G, Kr*3, @@ -546,8 +568,8 @@ uint32_t ulsch_encoding(uint8_t *a, get_Qm_ul(ulsch->harq_processes[harq_pid]->mcs), 1, r, - ulsch->harq_processes[harq_pid]->nb_rb, - ulsch->harq_processes[harq_pid]->mcs); // r + ulsch->harq_processes[harq_pid]->nb_rb); + //ulsch->harq_processes[harq_pid]->mcs); // r stop_meas(rm_stats); #ifdef DEBUG_ULSCH_CODING @@ -633,7 +655,7 @@ uint32_t ulsch_encoding(uint8_t *a, // Do ACK coding, Section 5.2.2.6 36.213 (p.23-24 in v8.6) wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3); #ifdef DEBUG_ULSCH_CODING - msg("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n", + printf("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n", ulsch->bundling,Nbundled,wACK_idx); #endif @@ -865,7 +887,7 @@ uint32_t ulsch_encoding(uint8_t *a, for (q=0; qq_ACK[(q+(Q_m*i))%len_ACK]; #ifdef DEBUG_ULSCH_CODING - msg("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i), + printf("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i), q+(Q_m*((r*Cmux) + columnset[j])),ulsch->q_ACK[(q+(Q_m*i))%len_ACK], i,r*Cmux,columnset[j]); #endif @@ -931,76 +953,3 @@ uint32_t ulsch_encoding(uint8_t *a, return(0); } - -#ifdef PHY_ABSTRACTION -#ifdef OPENAIR2 -#include "LAYER2/MAC/extern.h" -#include "LAYER2/MAC/defs.h" -#endif -int ulsch_encoding_emul(uint8_t *ulsch_buffer, - PHY_VARS_UE *phy_vars_ue, - uint8_t eNB_id, - uint8_t harq_pid, - uint8_t control_only_flag) -{ - - LTE_UE_ULSCH_t *ulsch = phy_vars_ue->ulsch_ue[eNB_id]; - LTE_UE_DLSCH_t **dlsch = phy_vars_ue->dlsch_ue[eNB_id]; - PHY_MEASUREMENTS *meas = &phy_vars_ue->PHY_measurements; - uint8_t tmode = phy_vars_ue->transmission_mode[eNB_id]; - uint16_t rnti=phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti; - LOG_D(PHY,"EMUL UE ulsch_encoding for eNB %d,mod_id %d, harq_pid %d rnti %x, ACK(%d,%d) \n", - eNB_id,phy_vars_ue->Mod_id, harq_pid, rnti,ulsch->o_ACK[0],ulsch->o_ACK[1]); - - if (ulsch->O>0) { - /* - if(flag_LA==1) - sinr_eff = sinr_eff_cqi_calc(phy_vars_ue, eNB_id); - else - sinr_eff = meas->wideband_cqi_avg[eNB_id]; - */ - - fill_CQI(ulsch,meas,eNB_id,harq_pid,phy_vars_ue->lte_frame_parms.N_RB_DL,rnti,tmode,phy_vars_ue->sinr_eff); - //LOG_D(PHY,"UE CQI\n"); - // print_CQI(ulsch->o,ulsch->uci_format,eNB_id); - - // save PUSCH pmi for later (transmission modes 4,5,6) - // msg("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi)); - // if (ulsch->uci_format != HLC_subband_cqi_mcs_CBA) - dlsch[0]->harq_processes[harq_pid]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi; - } - - memcpy(phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->b, - ulsch_buffer, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3); - - - //memcpy(&UE_transport_info[phy_vars_ue->Mod_id].transport_blocks[UE_transport_info_TB_index[phy_vars_ue->Mod_id]], - memcpy(&UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].transport_blocks, - ulsch_buffer, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3); - //UE_transport_info_TB_index[phy_vars_ue->Mod_id]+=phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3; - // navid: currently more than one eNB is not supported in the code - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].num_eNB = 1; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].rnti[0] = phy_vars_ue->lte_ue_pdcch_vars[0]->crnti; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].eNB_id[0] = eNB_id; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].harq_pid[0] = harq_pid; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].tbs[0] = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3 ; - // msg("\nphy_vars_ue->Mod_id%d\n",phy_vars_ue->Mod_id); - - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_flag = 1; - //UE_transport_info[phy_vars_ue->Mod_id].cntl.pusch_uci = *(uint32_t *)ulsch->o; - memcpy(UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_uci, - ulsch->o, - MAX_CQI_BYTES); - // msg("[UE]cqi is %d \n", ((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1); - - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.length_uci = ulsch->O; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.uci_format = ulsch->uci_format; - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_ri = (ulsch->o_RI[0]&1)+((ulsch->o_RI[1]&1)<<1); - UE_transport_info[phy_vars_ue->Mod_id][phy_vars_ue->CC_id].cntl.pusch_ack = (ulsch->o_ACK[0]&1) + ((ulsch->o_ACK[1]&1)<<1); - //msg("ack is %d %d %d\n",UE_transport_info[phy_vars_ue->Mod_id].cntl.pusch_ack, (ulsch->o_ACK[1]&1)<<1, ulsch->o_ACK[0]&1); - return(0); - -} -#endif diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index a0a5602261..57087051d3 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/ulsch_decoding.c * \brief Top-level routines for decoding the ULSCH transport channel from 36.212 V8.6 2009-03 @@ -52,11 +44,6 @@ #include "PHY_INTERFACE/extern.h" #endif -#ifdef PHY_ABSTRACTION -#include "UTIL/OCG/OCG.h" -#include "UTIL/OCG/OCG_extern.h" -#endif - #include "UTIL/LOG/vcd_signal_dumper.h" //#define DEBUG_ULSCH_DECODING @@ -127,7 +114,7 @@ LTE_eNB_ULSCH_t *new_eNB_ulsch(uint8_t max_turbo_iterations,uint8_t N_RB_UL, uin ulsch->Mlimit = 4; for (i=0; i<8; i++) { - // msg("new_ue_ulsch: Harq process %d\n",i); + // printf("new_ue_ulsch: Harq process %d\n",i); ulsch->harq_processes[i] = (LTE_UL_eNB_HARQ_t *)malloc16(sizeof(LTE_UL_eNB_HARQ_t)); if (ulsch->harq_processes[i]) { @@ -154,8 +141,6 @@ LTE_eNB_ULSCH_t *new_eNB_ulsch(uint8_t max_turbo_iterations,uint8_t N_RB_UL, uin else exit_flag=2; } - - ulsch->harq_processes[i]->subframe_scheduling_flag = 0; } } else { exit_flag=1; @@ -180,18 +165,35 @@ void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch) //ulsch = (LTE_eNB_ULSCH_t *)malloc16(sizeof(LTE_eNB_ULSCH_t)); if (ulsch) { ulsch->rnti = 0; + ulsch->harq_mask = 0; for (i=0; i<8; i++) { if (ulsch->harq_processes[i]) { // ulsch->harq_processes[i]->Ndi = 0; ulsch->harq_processes[i]->status = 0; - ulsch->harq_processes[i]->subframe_scheduling_flag = 0; //ulsch->harq_processes[i]->phich_active = 0; //this will be done later after transmission of PHICH ulsch->harq_processes[i]->phich_ACK = 0; ulsch->harq_processes[i]->round = 0; + ulsch->harq_processes[i]->rar_alloc = 0; + ulsch->harq_processes[i]->first_rb = 0; + ulsch->harq_processes[i]->nb_rb = 0; + ulsch->harq_processes[i]->TBS = 0; + ulsch->harq_processes[i]->Or1 = 0; + ulsch->harq_processes[i]->Or2 = 0; + for ( int j = 0; j < 2; j++ ) { + ulsch->harq_processes[i]->o_RI[j] = 0; + } + ulsch->harq_processes[i]->O_ACK = 0; + ulsch->harq_processes[i]->srs_active = 0; + ulsch->harq_processes[i]->rvidx = 0; + ulsch->harq_processes[i]->Msc_initial = 0; + ulsch->harq_processes[i]->Nsymb_initial = 0; } } - + ulsch->beta_offset_cqi_times8 = 0; + ulsch->beta_offset_ri_times8 = 0; + ulsch->beta_offset_harqack_times8 = 0; + ulsch->Msg3_active = 0; } } @@ -202,11 +204,11 @@ uint8_t extract_cqi_crc(uint8_t *cqi,uint8_t CQI_LENGTH) uint8_t crc; crc = cqi[CQI_LENGTH>>3]; - // msg("crc1: %x, shift %d\n",crc,CQI_LENGTH&0x7); + // printf("crc1: %x, shift %d\n",crc,CQI_LENGTH&0x7); crc = (crc<<(CQI_LENGTH&0x7)); // clear crc bits // ((char *)cqi)[CQI_LENGTH>>3] &= 0xff>>(8-(CQI_LENGTH&0x7)); - // msg("crc2: %x, cqi0 %x\n",crc,cqi[1+(CQI_LENGTH>>3)]); + // printf("crc2: %x, cqi0 %x\n",crc,cqi[1+(CQI_LENGTH>>3)]); crc |= (cqi[1+(CQI_LENGTH>>3)])>>(8-(CQI_LENGTH&0x7)); // clear crc bits //(((char *)cqi)[1+(CQI_LENGTH>>3)]) = 0; @@ -218,50 +220,28 @@ uint8_t extract_cqi_crc(uint8_t *cqi,uint8_t CQI_LENGTH) -unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, - uint8_t UE_id, - uint8_t sched_subframe, - uint8_t control_only_flag, - uint8_t Nbundled, - uint8_t llr8_flag) -{ - int16_t *ulsch_llr = phy_vars_eNB->lte_eNB_pusch_vars[UE_id]->llr; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - LTE_eNB_ULSCH_t *ulsch = phy_vars_eNB->ulsch_eNB[UE_id]; - uint8_t harq_pid; - unsigned short nb_rb; - unsigned int A,E; - uint8_t Q_m; - unsigned int i,i2,q,j,j2; - int iprime; - unsigned int ret=0,offset; - unsigned short iind; - // uint8_t dummy_channel_output[(3*8*block_length)+12]; - unsigned int r,r_offset=0,Kr,Kr_bytes; +int ulsch_decoding_data_2thread0(td_params* tdp) { + + PHY_VARS_eNB *eNB = tdp->eNB; + int UE_id = tdp->UE_id; + int harq_pid = tdp->harq_pid; + int llr8_flag = tdp->llr8_flag; + + unsigned int r,r_offset=0,Kr,Kr_bytes,iind; uint8_t crc_type; - uint8_t *columnset; - unsigned int sumKr=0; - unsigned int Qprime,L,G,Q_CQI,Q_RI,H,Hprime,Hpp,Cmux,Rmux_prime,O_RCC; - unsigned int Qprime_ACK,Qprime_RI,len_ACK=0,len_RI=0; - // uint8_t q_ACK[MAX_ACK_PAYLOAD],q_RI[MAX_RI_PAYLOAD]; - int metric,metric_new; - uint8_t o_flip[8]; - uint32_t x1, x2, s=0; - int16_t ys,c; - uint32_t wACK_idx; + int offset = 0; + int ret = 1; int16_t dummy_w[MAX_NUM_ULSCH_SEGMENTS][3*(6144+64)]; - uint8_t dummy_w_cc[3*(MAX_CQI_BITS+8+32)]; - int16_t y[6*14*1200]; - uint8_t ytag[14*1200]; - // uint8_t ytag2[6*14*1200],*ytag2_ptr; - int16_t cseq[6*14*1200]; - int off; - int status[20]; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - LTE_UL_eNB_HARQ_t *ulsch_harq; + LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id]; + LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid]; + int Q_m = ulsch_harq->Qm; + int G = ulsch_harq->G; + uint32_t E=0; + uint32_t Gp,GpmodC,Nl=1; + uint32_t C = ulsch_harq->C; uint8_t (*tc)(int16_t *y, uint8_t *, @@ -279,7 +259,641 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, time_stats_t *, time_stats_t *); - harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe); + if (llr8_flag == 0) + tc = phy_threegpplte_turbo_decoder16; + else + tc = phy_threegpplte_turbo_decoder8; + + + + // go through first half of segments to get r_offset + for (r=0; r<(ulsch_harq->C/2); r++) { + + // Get Turbo interleaver parameters + if (rCminus) + Kr = ulsch_harq->Kminus; + else + Kr = ulsch_harq->Kplus; + + Kr_bytes = Kr>>3; + + if (Kr_bytes<=64) + iind = (Kr_bytes-5); + else if (Kr_bytes <=128) + iind = 59 + ((Kr_bytes-64)>>1); + else if (Kr_bytes <= 256) + iind = 91 + ((Kr_bytes-128)>>2); + else if (Kr_bytes <= 768) + iind = 123 + ((Kr_bytes-256)>>3); + else { + AssertFatal(1==0,"ulsch_decoding: Illegal codeword size %d!!!\n",Kr_bytes); + } + + // This is stolen from rate-matching algorithm to get the value of E + + Gp = G/Nl/Q_m; + GpmodC = Gp%C; + + if (r < (C-(GpmodC))) + E = Nl*Q_m * (Gp/C); + else + E = Nl*Q_m * ((GpmodC==0?0:1) + (Gp/C)); + + r_offset += E; + + if (r==0) { + offset = Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0); + } else { + offset += (Kr_bytes- ((ulsch_harq->C>1)?3:0)); + } + } + + // go through second half of segments + for (; r<(ulsch_harq->C); r++) { + + + // printf("before subblock deinterleaving c[%d] = %p\n",r,ulsch_harq->c[r]); + // Get Turbo interleaver parameters + if (rCminus) + Kr = ulsch_harq->Kminus; + else + Kr = ulsch_harq->Kplus; + + Kr_bytes = Kr>>3; + + if (Kr_bytes<=64) + iind = (Kr_bytes-5); + else if (Kr_bytes <=128) + iind = 59 + ((Kr_bytes-64)>>1); + else if (Kr_bytes <= 256) + iind = 91 + ((Kr_bytes-128)>>2); + else if (Kr_bytes <= 768) + iind = 123 + ((Kr_bytes-256)>>3); + else { + LOG_E(PHY,"ulsch_decoding: Illegal codeword size %d!!!\n",Kr_bytes); + return(-1); + } + +#ifdef DEBUG_ULSCH_DECODING + printf("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? ulsch_harq->F : 0); +#endif + + memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short)); + ulsch_harq->RTC[r] = generate_dummy_w(4+(Kr_bytes*8), + (uint8_t*)&dummy_w[r][0], + (r==0) ? ulsch_harq->F : 0); + +#ifdef DEBUG_ULSCH_DECODING + printf("Rate Matching Segment %d (coded bits (G) %d,unpunctured/repeated bits %d, Q_m %d, nb_rb %d, Nl %d)...\n", + r, G, + Kr*3, + Q_m, + nb_rb, + ulsch_harq->Nl); +#endif + + + if (lte_rate_matching_turbo_rx(ulsch_harq->RTC[r], + G, + ulsch_harq->w[r], + (uint8_t*) &dummy_w[r][0], + ulsch_harq->e+r_offset, + ulsch_harq->C, + NSOFT, + 0, //Uplink + 1, + ulsch_harq->rvidx, + (ulsch_harq->round==0)?1:0, // clear + ulsch_harq->Qm, + 1, + r, + &E)==-1) { + LOG_E(PHY,"ulsch_decoding.c: Problem in rate matching\n"); + return(-1); + } + + r_offset += E; + + sub_block_deinterleaving_turbo(4+Kr, + &ulsch_harq->d[r][96], + ulsch_harq->w[r]); + + if (ulsch_harq->C == 1) + crc_type = CRC24_A; + else + crc_type = CRC24_B; + + + ret = tc(&ulsch_harq->d[r][96], + ulsch_harq->c[r], + Kr, + f1f2mat_old[iind*2], + f1f2mat_old[(iind*2)+1], + ulsch->max_turbo_iterations,//MAX_TURBO_ITERATIONS, + crc_type, + (r==0) ? ulsch_harq->F : 0, + &eNB->ulsch_tc_init_stats, + &eNB->ulsch_tc_alpha_stats, + &eNB->ulsch_tc_beta_stats, + &eNB->ulsch_tc_gamma_stats, + &eNB->ulsch_tc_ext_stats, + &eNB->ulsch_tc_intl1_stats, + &eNB->ulsch_tc_intl2_stats); + + // Reassembly of Transport block here + + if (ret != (1+ulsch->max_turbo_iterations)) { + if (rCminus) + Kr = ulsch_harq->Kminus; + else + Kr = ulsch_harq->Kplus; + + Kr_bytes = Kr>>3; + + memcpy(ulsch_harq->b+offset, + ulsch_harq->c[r], + Kr_bytes - ((ulsch_harq->C>1)?3:0)); + offset += (Kr_bytes- ((ulsch_harq->C>1)?3:0)); + + + } else { + break; + } + + } + + return(ret); +} + +extern int oai_exit; +void *td_thread(void *param) { + pthread_setname_np( pthread_self(), "td processing"); + PHY_VARS_eNB *eNB = ((td_params*)param)->eNB; + eNB_proc_t *proc = &eNB->proc; + + while (!oai_exit) { + + if (wait_on_condition(&proc->mutex_td,&proc->cond_td,&proc->instance_cnt_td,"td thread")<0) break; + + ((td_params*)param)->ret = ulsch_decoding_data_2thread0((td_params*)param); + + if (release_thread(&proc->mutex_td,&proc->instance_cnt_td,"td thread")<0) break; + + if (pthread_cond_signal(&proc->cond_td) != 0) { + printf("[eNB] ERROR pthread_cond_signal for td thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return(NULL); + } + } + + return(NULL); +} + +int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag) { + + eNB_proc_t *proc = &eNB->proc; + unsigned int r,r_offset=0,Kr,Kr_bytes,iind; + uint8_t crc_type; + int offset = 0; + int ret = 1; + int16_t dummy_w[MAX_NUM_ULSCH_SEGMENTS][3*(6144+64)]; + LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id]; + LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid]; + + int G = ulsch_harq->G; + unsigned int E; + int Cby2; + + uint8_t (*tc)(int16_t *y, + uint8_t *, + uint16_t, + uint16_t, + uint16_t, + uint8_t, + uint8_t, + uint8_t, + time_stats_t *, + time_stats_t *, + time_stats_t *, + time_stats_t *, + time_stats_t *, + time_stats_t *, + time_stats_t *); + + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + + if (llr8_flag == 0) + tc = phy_threegpplte_turbo_decoder16; + else + tc = phy_threegpplte_turbo_decoder8; + + if (ulsch_harq->C>1) { // wakeup worker if more than 1 segment + if (pthread_mutex_timedlock(&proc->mutex_td,&wait) != 0) { + printf("[eNB] ERROR pthread_mutex_lock for TD thread (IC %d)\n", proc->instance_cnt_td); + exit_fun( "error locking mutex_fep" ); + return -1; + } + + if (proc->instance_cnt_td==0) { + printf("[eNB] TD thread busy\n"); + exit_fun("TD thread busy"); + pthread_mutex_unlock( &proc->mutex_td ); + return -1; + } + + ++proc->instance_cnt_td; + + proc->tdp.eNB = eNB; + proc->tdp.UE_id = UE_id; + proc->tdp.harq_pid = harq_pid; + proc->tdp.llr8_flag = llr8_flag; + + + // wakeup worker to do second half segments + if (pthread_cond_signal(&proc->cond_td) != 0) { + printf("[eNB] ERROR pthread_cond_signal for td thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return (1+ulsch->max_turbo_iterations); + } + + pthread_mutex_unlock( &proc->mutex_td ); + Cby2 = ulsch_harq->C/2; + } + else { + Cby2 = 1; + } + + // go through first half of segments in main thread + for (r=0; rc[r]); + // Get Turbo interleaver parameters + if (rCminus) + Kr = ulsch_harq->Kminus; + else + Kr = ulsch_harq->Kplus; + + Kr_bytes = Kr>>3; + + if (Kr_bytes<=64) + iind = (Kr_bytes-5); + else if (Kr_bytes <=128) + iind = 59 + ((Kr_bytes-64)>>1); + else if (Kr_bytes <= 256) + iind = 91 + ((Kr_bytes-128)>>2); + else if (Kr_bytes <= 768) + iind = 123 + ((Kr_bytes-256)>>3); + else { + LOG_E(PHY,"ulsch_decoding: Illegal codeword size %d!!!\n",Kr_bytes); + return(-1); + } + +#ifdef DEBUG_ULSCH_DECODING + printf("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? ulsch_harq->F : 0); +#endif + + memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short)); + ulsch_harq->RTC[r] = generate_dummy_w(4+(Kr_bytes*8), + (uint8_t*)&dummy_w[r][0], + (r==0) ? ulsch_harq->F : 0); + +#ifdef DEBUG_ULSCH_DECODING + printf("Rate Matching Segment %d (coded bits (G) %d,unpunctured/repeated bits %d, Q_m %d, nb_rb %d, Nl %d)...\n", + r, G, + Kr*3, + Q_m, + nb_rb, + ulsch_harq->Nl); +#endif + + start_meas(&eNB->ulsch_rate_unmatching_stats); + + if (lte_rate_matching_turbo_rx(ulsch_harq->RTC[r], + G, + ulsch_harq->w[r], + (uint8_t*) &dummy_w[r][0], + ulsch_harq->e+r_offset, + ulsch_harq->C, + NSOFT, + 0, //Uplink + 1, + ulsch_harq->rvidx, + (ulsch_harq->round==0)?1:0, // clear + ulsch_harq->Qm, + 1, + r, + &E)==-1) { + LOG_E(PHY,"ulsch_decoding.c: Problem in rate matching\n"); + return(-1); + } + + stop_meas(&eNB->ulsch_rate_unmatching_stats); + r_offset += E; + + start_meas(&eNB->ulsch_deinterleaving_stats); + sub_block_deinterleaving_turbo(4+Kr, + &ulsch_harq->d[r][96], + ulsch_harq->w[r]); + stop_meas(&eNB->ulsch_deinterleaving_stats); + + if (ulsch_harq->C == 1) + crc_type = CRC24_A; + else + crc_type = CRC24_B; + + start_meas(&eNB->ulsch_turbo_decoding_stats); + + ret = tc(&ulsch_harq->d[r][96], + ulsch_harq->c[r], + Kr, + f1f2mat_old[iind*2], + f1f2mat_old[(iind*2)+1], + ulsch->max_turbo_iterations,//MAX_TURBO_ITERATIONS, + crc_type, + (r==0) ? ulsch_harq->F : 0, + &eNB->ulsch_tc_init_stats, + &eNB->ulsch_tc_alpha_stats, + &eNB->ulsch_tc_beta_stats, + &eNB->ulsch_tc_gamma_stats, + &eNB->ulsch_tc_ext_stats, + &eNB->ulsch_tc_intl1_stats, + &eNB->ulsch_tc_intl2_stats); + + // Reassembly of Transport block here + + if (ret != (1+ulsch->max_turbo_iterations)) { + if (rCminus) + Kr = ulsch_harq->Kminus; + else + Kr = ulsch_harq->Kplus; + + Kr_bytes = Kr>>3; + + if (r==0) { + memcpy(ulsch_harq->b, + &ulsch_harq->c[0][(ulsch_harq->F>>3)], + Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0)); + offset = Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0); + } else { + memcpy(ulsch_harq->b+offset, + ulsch_harq->c[r], + Kr_bytes - ((ulsch_harq->C>1)?3:0)); + offset += (Kr_bytes- ((ulsch_harq->C>1)?3:0)); + } + + } else { + break; + } + stop_meas(&eNB->ulsch_turbo_decoding_stats); + } + + // wait for worker to finish + + wait_on_busy_condition(&proc->mutex_td,&proc->cond_td,&proc->instance_cnt_td,"td thread"); + + return( (ret>proc->tdp.ret) ? ret : proc->tdp.ret ); +} + +int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag) { + + unsigned int r,r_offset=0,Kr,Kr_bytes,iind; + uint8_t crc_type; + int offset = 0; + int ret = 1; + int16_t dummy_w[MAX_NUM_ULSCH_SEGMENTS][3*(6144+64)]; + LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id]; + LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid]; + + int G = ulsch_harq->G; + unsigned int E; + + uint8_t (*tc)(int16_t *y, + uint8_t *, + uint16_t, + uint16_t, + uint16_t, + uint8_t, + uint8_t, + uint8_t, + time_stats_t *, + time_stats_t *, + time_stats_t *, + time_stats_t *, + time_stats_t *, + time_stats_t *, + time_stats_t *); + + if (llr8_flag == 0) + tc = phy_threegpplte_turbo_decoder16; + else + tc = phy_threegpplte_turbo_decoder8; + + + for (r=0; rC; r++) { + + // printf("before subblock deinterleaving c[%d] = %p\n",r,ulsch_harq->c[r]); + // Get Turbo interleaver parameters + if (rCminus) + Kr = ulsch_harq->Kminus; + else + Kr = ulsch_harq->Kplus; + + Kr_bytes = Kr>>3; + + if (Kr_bytes<=64) + iind = (Kr_bytes-5); + else if (Kr_bytes <=128) + iind = 59 + ((Kr_bytes-64)>>1); + else if (Kr_bytes <= 256) + iind = 91 + ((Kr_bytes-128)>>2); + else if (Kr_bytes <= 768) + iind = 123 + ((Kr_bytes-256)>>3); + else { + LOG_E(PHY,"ulsch_decoding: Illegal codeword size %d!!!\n",Kr_bytes); + return(-1); + } + +#ifdef DEBUG_ULSCH_DECODING + printf("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? ulsch_harq->F : 0); +#endif + + memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short)); + ulsch_harq->RTC[r] = generate_dummy_w(4+(Kr_bytes*8), + (uint8_t*)&dummy_w[r][0], + (r==0) ? ulsch_harq->F : 0); + +#ifdef DEBUG_ULSCH_DECODING + printf("Rate Matching Segment %d (coded bits (G) %d,unpunctured/repeated bits %d, Q_m %d, nb_rb %d, Nl %d)...\n", + r, G, + Kr*3, + Q_m, + nb_rb, + ulsch_harq->Nl); +#endif + + start_meas(&eNB->ulsch_rate_unmatching_stats); + + if (lte_rate_matching_turbo_rx(ulsch_harq->RTC[r], + G, + ulsch_harq->w[r], + (uint8_t*) &dummy_w[r][0], + ulsch_harq->e+r_offset, + ulsch_harq->C, + NSOFT, + 0, //Uplink + 1, + ulsch_harq->rvidx, + (ulsch_harq->round==0)?1:0, // clear + ulsch_harq->Qm, + 1, + r, + &E)==-1) { + LOG_E(PHY,"ulsch_decoding.c: Problem in rate matching\n"); + return(-1); + } + + stop_meas(&eNB->ulsch_rate_unmatching_stats); + r_offset += E; + + start_meas(&eNB->ulsch_deinterleaving_stats); + sub_block_deinterleaving_turbo(4+Kr, + &ulsch_harq->d[r][96], + ulsch_harq->w[r]); + stop_meas(&eNB->ulsch_deinterleaving_stats); + + if (ulsch_harq->C == 1) + crc_type = CRC24_A; + else + crc_type = CRC24_B; + + start_meas(&eNB->ulsch_turbo_decoding_stats); + + ret = tc(&ulsch_harq->d[r][96], + ulsch_harq->c[r], + Kr, + f1f2mat_old[iind*2], + f1f2mat_old[(iind*2)+1], + ulsch->max_turbo_iterations,//MAX_TURBO_ITERATIONS, + crc_type, + (r==0) ? ulsch_harq->F : 0, + &eNB->ulsch_tc_init_stats, + &eNB->ulsch_tc_alpha_stats, + &eNB->ulsch_tc_beta_stats, + &eNB->ulsch_tc_gamma_stats, + &eNB->ulsch_tc_ext_stats, + &eNB->ulsch_tc_intl1_stats, + &eNB->ulsch_tc_intl2_stats); + + stop_meas(&eNB->ulsch_turbo_decoding_stats); + + // Reassembly of Transport block here + + if (ret != (1+ulsch->max_turbo_iterations)) { + if (rCminus) + Kr = ulsch_harq->Kminus; + else + Kr = ulsch_harq->Kplus; + + Kr_bytes = Kr>>3; + + if (r==0) { + memcpy(ulsch_harq->b, + &ulsch_harq->c[0][(ulsch_harq->F>>3)], + Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0)); + offset = Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0); + } else { + memcpy(ulsch_harq->b+offset, + ulsch_harq->c[r], + Kr_bytes - ((ulsch_harq->C>1)?3:0)); + offset += (Kr_bytes- ((ulsch_harq->C>1)?3:0)); + } + + } else { + break; + } + + } + + return(ret); +} + +static inline unsigned int lte_gold_unscram(unsigned int *x1, unsigned int *x2, unsigned char reset) __attribute__((always_inline)); +static inline unsigned int lte_gold_unscram(unsigned int *x1, unsigned int *x2, unsigned char reset) +{ + int n; + + if (reset) { + *x1 = 1+ (1<<31); + *x2=*x2 ^ ((*x2 ^ (*x2>>1) ^ (*x2>>2) ^ (*x2>>3))<<31); + + // skip first 50 double words (1600 bits) + // printf("n=0 : x1 %x, x2 %x\n",x1,x2); + for (n=1; n<50; n++) { + *x1 = (*x1>>1) ^ (*x1>>4); + *x1 = *x1 ^ (*x1<<31) ^ (*x1<<28); + *x2 = (*x2>>1) ^ (*x2>>2) ^ (*x2>>3) ^ (*x2>>4); + *x2 = *x2 ^ (*x2<<31) ^ (*x2<<30) ^ (*x2<<29) ^ (*x2<<28); + } + } + + *x1 = (*x1>>1) ^ (*x1>>4); + *x1 = *x1 ^ (*x1<<31) ^ (*x1<<28); + *x2 = (*x2>>1) ^ (*x2>>2) ^ (*x2>>3) ^ (*x2>>4); + *x2 = *x2 ^ (*x2<<31) ^ (*x2<<30) ^ (*x2<<29) ^ (*x2<<28); + return(*x1^*x2); + // printf("n=%d : c %x\n",n,x1^x2); + +} + +unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, + uint8_t UE_id, + uint8_t control_only_flag, + uint8_t Nbundled, + uint8_t llr8_flag) +{ + + + int16_t *ulsch_llr = eNB->pusch_vars[UE_id]->llr; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; + LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id]; + uint8_t harq_pid; + unsigned short nb_rb; + unsigned int A; + uint8_t Q_m; + unsigned int i,i2,q,j,j2; + int iprime; + unsigned int ret=0; + + // uint8_t dummy_channel_output[(3*8*block_length)+12]; + int r,Kr; + + uint8_t *columnset; + unsigned int sumKr=0; + unsigned int Qprime,L,G,Q_CQI,Q_RI,H,Hprime,Hpp,Cmux,Rmux_prime,O_RCC; + unsigned int Qprime_ACK,Qprime_RI,len_ACK=0,len_RI=0; + // uint8_t q_ACK[MAX_ACK_PAYLOAD],q_RI[MAX_RI_PAYLOAD]; + int metric,metric_new; + uint32_t x1, x2, s=0; + int16_t ys,c; + uint32_t wACK_idx; + uint8_t dummy_w_cc[3*(MAX_CQI_BITS+8+32)]; + int16_t y[6*14*1200] __attribute__((aligned(32))); + uint8_t ytag[14*1200]; + // uint8_t ytag2[6*14*1200],*ytag2_ptr; + int16_t cseq[6*14*1200] __attribute__((aligned(32))); + int off; + + int frame = proc->frame_rx; + int subframe = proc->subframe_rx; + LTE_UL_eNB_HARQ_t *ulsch_harq; + + + + harq_pid = subframe2harq_pid(frame_parms,frame,subframe); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0+harq_pid,1); @@ -287,40 +901,39 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, x2 = ((uint32_t)ulsch->rnti<<14) + ((uint32_t)subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1 ulsch_harq = ulsch->harq_processes[harq_pid]; - if (harq_pid==255) { - LOG_E(PHY, "FATAL ERROR: illegal harq_pid, returning\n"); - return -1; - } + AssertFatal(harq_pid!=255, + "FATAL ERROR: illegal harq_pid, returning\n"); + + AssertFatal(ulsch_harq->Nsymb_pusch != 0, + "FATAL ERROR: harq_pid %d, Nsymb 0!\n",harq_pid); - if (ulsch_harq->Nsymb_pusch == 0) { - LOG_E(PHY, "FATAL ERROR: harq_pid %d, Nsymb 0!\n",harq_pid); - return 1+ulsch->max_turbo_iterations; - } - if (llr8_flag == 0) - tc = phy_threegpplte_turbo_decoder16; - else - tc = phy_threegpplte_turbo_decoder8; nb_rb = ulsch_harq->nb_rb; A = ulsch_harq->TBS; - Q_m = get_Qm_ul(ulsch_harq->mcs); + Q_m = ulsch_harq->Qm; G = nb_rb * (12 * Q_m) * ulsch_harq->Nsymb_pusch; -#ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", - frame_parms->Nid_cell,ulsch->rnti,x2, - ulsch_harq->round, - ulsch_harq->rvidx, - ulsch_harq->mcs, - ulsch_harq->O_RI, - ulsch_harq->O_ACK, - G, - subframe); -#endif + //#ifdef DEBUG_ULSCH_DECODING + LOG_D(PHY,"[PUSCH %d] Frame %d, Subframe %d: ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): A %d, round %d, RV %d, O_r1 %d, O_RI %d, O_ACK %d, G %d, Q_m %d Nsymb_pusch %d nb_rb %d\n", + harq_pid, + proc->frame_rx,subframe, + frame_parms->Nid_cell,ulsch->rnti,x2, + A, + ulsch_harq->round, + ulsch_harq->rvidx, + ulsch_harq->Or1, + ulsch_harq->O_RI, + ulsch_harq->O_ACK, + G, + ulsch_harq->Qm, + ulsch_harq->Nsymb_pusch, + nb_rb); + + //#endif if (ulsch_harq->round == 0) { // This is a new packet, so compute quantities regarding segmentation @@ -350,21 +963,17 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, sumKr += Kr; } - if (sumKr==0) { - LOG_N(PHY,"[eNB %d] ulsch_decoding.c: FATAL sumKr is 0!\n",phy_vars_eNB->Mod_id); - LOG_D(PHY,"ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", - frame_parms->Nid_cell,ulsch->rnti,x2, - harq_pid, - ulsch_harq->round, - ulsch_harq->rvidx, - ulsch_harq->mcs, - ulsch_harq->O_RI, - ulsch_harq->O_ACK, - G, - subframe); - mac_xface->macphy_exit("ulsch_decoding.c: FATAL sumKr is 0!"); - return(-1); - } + AssertFatal(sumKr>0, + "[eNB] ulsch_decoding.c: FATAL sumKr is 0! (Nid_cell %d, rnti %x, x2 %x): harq_pid %d round %d, RV %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", + frame_parms->Nid_cell,ulsch->rnti,x2, + harq_pid, + ulsch_harq->round, + ulsch_harq->rvidx, + ulsch_harq->O_RI, + ulsch_harq->O_ACK, + G, + subframe); + // Compute Q_ri Qprime = ulsch_harq->O_RI*ulsch_harq->Msc_initial*ulsch_harq->Nsymb_initial * ulsch->beta_offset_ri_times8; @@ -400,7 +1009,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, // Q_ACK = Qprime * Q_m; Qprime_ACK = Qprime; #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: Qprime_ACK %d, Msc_initial %d, Nsymb_initial %d, sumKr %d\n", + printf("ulsch_decoding.c: Qprime_ACK %d, Msc_initial %d, Nsymb_initial %d, sumKr %d\n", Qprime_ACK,ulsch_harq->Msc_initial,ulsch_harq->Nsymb_initial,sumKr); #endif @@ -429,51 +1038,69 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, Q_CQI = Q_m * Qprime; #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding: G %d, Q_RI %d, Q_CQI %d (L %d, Or1 %d) O_ACK %d\n",G,Q_RI,Q_CQI,L,ulsch_harq->Or1,ulsch_harq->O_ACK); + printf("ulsch_decoding: G %d, Q_RI %d, Q_CQI %d (L %d, Or1 %d) O_ACK %d\n",G,Q_RI,Q_CQI,L,ulsch_harq->Or1,ulsch_harq->O_ACK); #endif G = G - Q_RI - Q_CQI; + ulsch_harq->G = G; - if ((int)G < 0) { - LOG_E(PHY,"FATAL: ulsch_decoding.c G < 0 (%d) : Q_RI %d, Q_CQI %d\n",G,Q_RI,Q_CQI); - return(-1); - } + AssertFatal((int)G > 0, + "FATAL: ulsch_decoding.c G < 0 (%d) : Q_RI %d, Q_CQI %d\n",G,Q_RI,Q_CQI); H = G + Q_CQI; Hprime = H/Q_m; + // Demultiplexing/Deinterleaving of PUSCH/ACK/RI/CQI + start_meas(&eNB->ulsch_demultiplexing_stats); Hpp = Hprime + Qprime_RI; Cmux = ulsch_harq->Nsymb_pusch; - // Rmux = Hpp*Q_m/Cmux; Rmux_prime = Hpp/Cmux; - // Clear "tag" interleaving matrix to allow for CQI/DATA identification memset(ytag,0,Cmux*Rmux_prime); - start_meas(&phy_vars_eNB->ulsch_demultiplexing_stats); + i=0; memset(y,LTE_NULL,Q_m*Hpp); - // printf("before unscrambling c[%d] = %p\n",0,ulsch_harq->c[0]); // read in buffer and unscramble llrs for everything but placeholder bits // llrs stored per symbol correspond to columns of interleaving matrix - s = lte_gold_generic(&x1, &x2, 1); + s = lte_gold_unscram(&x1, &x2, 1); i2=0; for (i=0; i<((Hpp*Q_m)>>5); i++) { + /* for (j=0; j<32; j++) { cseq[i2++] = (int16_t)((((s>>j)&1)<<1)-1); } - - s = lte_gold_generic(&x1, &x2, 0); + */ +#if defined(__x86_64__) || defined(__i386__) +#ifndef __AVX2__ + ((__m128i*)cseq)[i2++] = ((__m128i*)unscrambling_lut)[(s&65535)<<1]; + ((__m128i*)cseq)[i2++] = ((__m128i*)unscrambling_lut)[1+((s&65535)<<1)]; + s>>=16; + ((__m128i*)cseq)[i2++] = ((__m128i*)unscrambling_lut)[(s&65535)<<1]; + ((__m128i*)cseq)[i2++] = ((__m128i*)unscrambling_lut)[1+((s&65535)<<1)]; +#else + ((__m256i*)cseq)[i2++] = ((__m256i*)unscrambling_lut)[s&65535]; + ((__m256i*)cseq)[i2++] = ((__m256i*)unscrambling_lut)[(s>>16)&65535]; +#endif +#elif defined(__arm__) + ((int16x8_t*)cseq)[i2++] = ((int16x8_t*)unscrambling_lut)[(s&65535)<<1]; + ((int16x8_t*)cseq)[i2++] = ((int16x8_t*)unscrambling_lut)[1+((s&65535)<<1)]; + s>>=16; + ((int16x8_t*)cseq)[i2++] = ((int16x8_t*)unscrambling_lut)[(s&65535)<<1]; + ((int16x8_t*)cseq)[i2++] = ((int16x8_t*)unscrambling_lut)[1+((s&65535)<<1)]; +#endif + s = lte_gold_unscram(&x1, &x2, 0); } + // printf("after unscrambling c[%d] = %p\n",0,ulsch_harq->c[0]); if (frame_parms->Ncp == 0) @@ -511,11 +1138,6 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, for (i=0; i>2); - /* - for (q=0;qO_ACK == 1) { @@ -530,7 +1152,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, } #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: ACK i %d, r %d, j %d, ColumnSet[j] %d\n",i,r,j,columnset[j]); + printf("ulsch_decoding.c: ACK i %d, r %d, j %d, ColumnSet[j] %d\n",i,r,j,columnset[j]); #endif j=(j+3)&3; } @@ -564,6 +1186,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, i2=j<<2; for (r=0; rulsch_demultiplexing_stats); + if (i!=(H+Q_RI)) LOG_D(PHY,"ulsch_decoding.c: Error in input buffer length (j %d, H+Q_RI %d)\n",i,H+Q_RI); @@ -650,7 +1278,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, } if (ulsch_harq->O_ACK > 2) { - LOG_E(PHY,"ulsch_decoding: FATAL, ACK cannot be more than 2 bits yet\n"); + LOG_E(PHY,"ulsch_decoding: FATAL, ACK cannot be more than 2 bits yet O_ACK:%d SFN/SF:%04d%d UE_id:%d rnti:%x\n",ulsch_harq->O_ACK,proc->frame_rx,proc->subframe_rx,UE_id,ulsch->rnti); return(-1); } @@ -816,34 +1444,38 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, j2+=Q_m; } - // printf("after CQI0 c[%d] = %p\n",0,ulsch_harq->c[0]); - switch (Q_m) { - case 2: - for (iprime=0; iprimee[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - } - break; - case 4: - for (iprime=0; iprimee[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - } - break; - case 6: - for (iprime=0; iprimee[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - } - break; + /* To be improved according to alignment of j2 +#if defined(__x86_64__)||defined(__i386__) +#ifndef __AVX2__ + for (iprime=0; iprimee[iprime]) = *((__m128i *)&y[j2]); +#else + for (iprime=0; iprimee[iprime]) = *((__m256i *)&y[j2]); +#endif +#elif defined(__arm__) + for (iprime=0; iprimee[iprime]) = *((int16x8_t *)&y[j2]); +#endif + */ + int16_t *yp,*ep; + for (iprime=0,yp=&y[j2],ep=&ulsch_harq->e[0]; + iprimeulsch_demultiplexing_stats); + // printf("after ACKNAK2 c[%d] = %p (iprime %d, G %d)\n",0,ulsch_harq->c[0],iprime,G); // Do CQI/RI/HARQ-ACK Decoding first and pass to MAC @@ -912,6 +1544,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, // RI + // rank 1 if ((ulsch_harq->O_RI == 1) && (Qprime_RI > 0)) { ulsch_harq->o_RI[0] = ((ulsch_harq->q_RI[0] + ulsch_harq->q_RI[Q_m/2]) > 0) ? 0 : 1; } @@ -919,6 +1552,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, // CQI // printf("before cqi c[%d] = %p\n",0,ulsch_harq->c[0]); + ulsch_harq->cqi_crc_status = 0; if (Q_CQI>0) { memset((void *)&dummy_w_cc[0],0,3*(ulsch_harq->Or1+8+32)); @@ -936,696 +1570,33 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, &ulsch_harq->o_d[96], &ulsch_harq->o_w[0]); - memset(o_flip,0,1+((8+ulsch_harq->Or1)/8)); - phy_viterbi_lte_sse2(ulsch_harq->o_d+96,o_flip,8+ulsch_harq->Or1); + memset(ulsch_harq->o,0,(7+8+ulsch_harq->Or1) / 8); + phy_viterbi_lte_sse2(ulsch_harq->o_d+96,ulsch_harq->o,8+ulsch_harq->Or1); - if (extract_cqi_crc(o_flip,ulsch_harq->Or1) == (crc8(o_flip,ulsch_harq->Or1)>>24)) + if (extract_cqi_crc(ulsch_harq->o,ulsch_harq->Or1) == (crc8(ulsch_harq->o,ulsch_harq->Or1)>>24)) ulsch_harq->cqi_crc_status = 1; - else - ulsch_harq->cqi_crc_status = 0; - - - if (ulsch->harq_processes[harq_pid]->Or1<=32) { - ulsch_harq->o[3] = o_flip[0] ; - ulsch_harq->o[2] = o_flip[1] ; - ulsch_harq->o[1] = o_flip[2] ; - ulsch_harq->o[0] = o_flip[3] ; - } else { - ulsch_harq->o[7] = o_flip[0] ; - ulsch_harq->o[6] = o_flip[1] ; - ulsch_harq->o[5] = o_flip[2] ; - ulsch_harq->o[4] = o_flip[3] ; - ulsch_harq->o[3] = o_flip[4] ; - ulsch_harq->o[2] = o_flip[5] ; - ulsch_harq->o[1] = o_flip[6] ; - ulsch_harq->o[0] = o_flip[7] ; - - } #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding: Or1=%d\n",ulsch_harq->Or1); + printf("ulsch_decoding: Or1=%d\n",ulsch_harq->Or1); for (i=0; i<1+((8+ulsch_harq->Or1)/8); i++) - msg("ulsch_decoding: O[%d] %d\n",i,ulsch_harq->o[i]); + printf("ulsch_decoding: O[%d] %d\n",i,ulsch_harq->o[i]); if (ulsch_harq->cqi_crc_status == 1) - msg("RX CQI CRC OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1)); + printf("RX CQI CRC OK (%x)\n",extract_cqi_crc(ulsch_harq->o,ulsch_harq->Or1)); else - msg("RX CQI CRC NOT OK (%x)\n",extract_cqi_crc(o_flip,ulsch_harq->Or1)); + printf("RX CQI CRC NOT OK (%x)\n",extract_cqi_crc(ulsch_harq->o,ulsch_harq->Or1)); #endif } - // return(0); - // Do PUSCH Decoding + LOG_D(PHY,"frame %d subframe %d O_ACK:%d o_ACK[]=%d:%d:%d:%d\n",frame,subframe,ulsch_harq->O_ACK,ulsch_harq->o_ACK[0],ulsch_harq->o_ACK[1],ulsch_harq->o_ACK[2],ulsch_harq->o_ACK[3]); - // stop_meas(&phy_vars_eNB->ulsch_demultiplexing_stats); + // Do ULSCH Decoding for data portion - - r_offset = 0; - - for (r=0; rC; r++) { - - // printf("before subblock deinterleaving c[%d] = %p\n",r,ulsch_harq->c[r]); - // Get Turbo interleaver parameters - if (rCminus) - Kr = ulsch_harq->Kminus; - else - Kr = ulsch_harq->Kplus; - - Kr_bytes = Kr>>3; - - if (Kr_bytes<=64) - iind = (Kr_bytes-5); - else if (Kr_bytes <=128) - iind = 59 + ((Kr_bytes-64)>>1); - else if (Kr_bytes <= 256) - iind = 91 + ((Kr_bytes-128)>>2); - else if (Kr_bytes <= 768) - iind = 123 + ((Kr_bytes-256)>>3); - else { - LOG_E(PHY,"ulsch_decoding: Illegal codeword size %d!!!\n",Kr_bytes); - return(-1); - } - -#ifdef DEBUG_ULSCH_DECODING - msg("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? ulsch_harq->F : 0); -#endif - - memset(&dummy_w[r][0],0,3*(6144+64)*sizeof(short)); - ulsch_harq->RTC[r] = generate_dummy_w(4+(Kr_bytes*8), - (uint8_t*)&dummy_w[r][0], - (r==0) ? ulsch_harq->F : 0); - -#ifdef DEBUG_ULSCH_DECODING - msg("Rate Matching Segment %d (coded bits (G) %d,unpunctured/repeated bits %d, Q_m %d, nb_rb %d, Nl %d)...\n", - r, G, - Kr*3, - Q_m, - nb_rb, - ulsch_harq->Nl); -#endif - - start_meas(&phy_vars_eNB->ulsch_rate_unmatching_stats); - - if (lte_rate_matching_turbo_rx(ulsch_harq->RTC[r], - G, - ulsch_harq->w[r], - (uint8_t*) &dummy_w[r][0], - ulsch_harq->e+r_offset, - ulsch_harq->C, - NSOFT, - 0, //Uplink - 1, - ulsch_harq->rvidx, - (ulsch_harq->round==0)?1:0, // clear - get_Qm_ul(ulsch_harq->mcs), - 1, - r, - &E)==-1) { - LOG_E(PHY,"ulsch_decoding.c: Problem in rate matching\n"); - return(-1); - } - - stop_meas(&phy_vars_eNB->ulsch_rate_unmatching_stats); - r_offset += E; - - start_meas(&phy_vars_eNB->ulsch_deinterleaving_stats); - sub_block_deinterleaving_turbo(4+Kr, - &ulsch_harq->d[r][96], - ulsch_harq->w[r]); - stop_meas(&phy_vars_eNB->ulsch_deinterleaving_stats); - } - - for (r=0; rC; r++) { - - /* printf("c[%d] : %p\n",r, - ulsch_harq->c[r]); - */ - - if (ulsch_harq->C == 1) - crc_type = CRC24_A; - else - crc_type = CRC24_B; - - start_meas(&phy_vars_eNB->ulsch_turbo_decoding_stats); - - ret = tc(&ulsch_harq->d[r][96], - ulsch_harq->c[r], - Kr, - f1f2mat_old[iind*2], - f1f2mat_old[(iind*2)+1], - ulsch->max_turbo_iterations,//MAX_TURBO_ITERATIONS, - crc_type, - (r==0) ? ulsch_harq->F : 0, - &phy_vars_eNB->ulsch_tc_init_stats, - &phy_vars_eNB->ulsch_tc_alpha_stats, - &phy_vars_eNB->ulsch_tc_beta_stats, - &phy_vars_eNB->ulsch_tc_gamma_stats, - &phy_vars_eNB->ulsch_tc_ext_stats, - &phy_vars_eNB->ulsch_tc_intl1_stats, - &phy_vars_eNB->ulsch_tc_intl2_stats); - - stop_meas(&phy_vars_eNB->ulsch_turbo_decoding_stats); - - status[r] = ret; - - } - - // Reassembly of Transport block here - offset = 0; - - ret = 1; - - for (r=0; rC; r++) { - if (status[r] != (1+ulsch->max_turbo_iterations)) { - if (rCminus) - Kr = ulsch_harq->Kminus; - else - Kr = ulsch_harq->Kplus; - - Kr_bytes = Kr>>3; - - if (r==0) { - memcpy(ulsch_harq->b, - &ulsch_harq->c[0][(ulsch_harq->F>>3)], - Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0)); - offset = Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0); - } else { - memcpy(ulsch_harq->b+offset, - ulsch_harq->c[r], - Kr_bytes - ((ulsch_harq->C>1)?3:0)); - offset += (Kr_bytes- ((ulsch_harq->C>1)?3:0)); - } - - if (ret != (1+ulsch->max_turbo_iterations)) - ret = status[r]; - } else { - ret = 1+ulsch->max_turbo_iterations; - } - - } + ret = eNB->td(eNB,UE_id,harq_pid,llr8_flag); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0+harq_pid,0); return(ret); } - -#ifdef PHY_ABSTRACTION - -#ifdef PHY_ABSTRACTION_UL -int ulsch_abstraction(double* sinr_dB, uint8_t TM, uint8_t mcs,uint16_t nrb, uint16_t frb) -{ - - int index,ii; - double sinr_eff = 0; - int rb_count = 0; - int offset; - double bler = 0; - TM = TM-1; - sinr_eff = sinr_dB[frb]; //the single sinr_eff value we calculated with MMSE FDE formula in init_snr_up function - - - sinr_eff *= 10; - sinr_eff = floor(sinr_eff); - sinr_eff /= 10; - - LOG_D(PHY,"[ABSTRACTION] sinr_eff after rounding = %f\n",sinr_eff); - - for (index = 0; index < 16; index++) { - if(index == 0) { - if (sinr_eff < sinr_bler_map_up[mcs][0][index]) { - bler = 1; - break; - } - } - - if (sinr_eff == sinr_bler_map_up[mcs][0][index]) { - bler = sinr_bler_map_up[mcs][1][index]; - } - } - -#ifdef USER_MODE // need to be adapted for the emulation in the kernel space - - if (uniformrandom() < bler) { - LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); - return(0); - } else { - LOG_I(OCM,"abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); - return(1); - } - -#endif -} - - - - - - - -int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb, uint16_t frb) -{ - int index; - double sinr_eff = 0; - double sinr_db1 = 0; - double sinr_db2 = 0; - double SI=0; - double RBIR=0; - int rb_count = 0; - int offset, M=0; - double bler = 0; - int start,middle,end; - TM = TM-1; - - for (offset = frb; offset <= (frb + nrb -1); offset++) { - - rb_count++; - - //we need to do the table lookups here for the mutual information corresponding to the certain sinr_dB. - - sinr_db1 = sinr_dB[offset*2]; - sinr_db2 = sinr_dB[offset*2+1]; - - msg("sinr_db1=%f\n,sinr_db2=%f\n",sinr_db1,sinr_db2); - - //rounding up for the table lookup - sinr_db1 *= 10; - sinr_db2 *= 10; - - sinr_db1 = floor(sinr_db1); - sinr_db2 = floor(sinr_db2); - - if ((int)sinr_db1%2) { - sinr_db1 += 1; - } - - if ((int)sinr_db2%2) { - sinr_db2 += 1; - } - - sinr_db1 /= 10; - sinr_db2 /= 10; - - if(mcs<10) { - //for sinr_db1 - for (index = 0; index < 162; index++) { - if (sinr_db1 < MI_map_4qam[0][0]) { - SI += (MI_map_4qam[1][0]/beta1_dlsch_MI[TM][mcs]); - M +=2; - break; - } - - if (sinr_db1 > MI_map_4qam[0][161]) { - SI += (MI_map_4qam[1][161]/beta1_dlsch_MI[TM][mcs]); - M +=2; - break; - } - - if (sinr_db1 == MI_map_4qam[0][index]) { - SI += (MI_map_4qam[1][index]/beta1_dlsch_MI[TM][mcs]); - M +=2; - break; - } - } - - //for sinr_db2 - for (index = 0; index < 162; index++) { - if (sinr_db2 < MI_map_4qam[0][0]) { - SI += (MI_map_4qam[1][0]/beta1_dlsch_MI[TM][mcs]); - M +=2; - break; - } - - if (sinr_db2 > MI_map_4qam[0][161]) { - SI += (MI_map_4qam[1][161]/beta1_dlsch_MI[TM][mcs]); - M +=2; - break; - } - - if (sinr_db2 == MI_map_4qam[0][index]) { - SI += (MI_map_4qam[1][index]/beta1_dlsch_MI[TM][mcs]); - M +=2; - break; - } - } - - } else if(mcs>9 && mcs<17) { - //for sinr_db1 - for (index = 0; index < 197; index++) { - if (sinr_db1 < MI_map_16qam[0][0]) { - SI += (MI_map_16qam[1][0]/beta1_dlsch_MI[TM][mcs]); - M +=4; - break; - } - - if (sinr_db1 > MI_map_16qam[0][196]) { - SI += (MI_map_16qam[1][196]/beta1_dlsch_MI[TM][mcs]); - M +=4; - break; - } - - if (sinr_db1 == MI_map_16qam[0][index]) { - SI += (MI_map_16qam[1][index]/beta1_dlsch_MI[TM][mcs]); - M +=4; - break; - } - } - - //for sinr_db2 - for (index = 0; index < 197; index++) { - if (sinr_db2 < MI_map_16qam[0][0]) { - SI += (MI_map_16qam[1][0]/beta1_dlsch_MI[TM][mcs]); - M +=4; - break; - } - - if (sinr_db2 > MI_map_16qam[0][196]) { - SI += (MI_map_16qam[1][196]/beta1_dlsch_MI[TM][mcs]); - M +=4; - break; - } - - if (sinr_db2 == MI_map_16qam[0][index]) { - SI += (MI_map_16qam[1][index]/beta1_dlsch_MI[TM][mcs]); - M +=4; - break; - } - } - - } else if(mcs>16 && mcs<22) { - //for sinr_db1 - for (index = 0; index < 227; index++) { - if (sinr_db1 < MI_map_64qam[0][0]) { - SI += (MI_map_64qam[1][0]/beta1_dlsch_MI[TM][mcs]); - M +=6; - break; - } - - if (sinr_db1 > MI_map_64qam[0][226]) { - SI += (MI_map_64qam[1][226]/beta1_dlsch_MI[TM][mcs]); - M +=6; - break; - } - - if (sinr_db1 == MI_map_64qam[0][index]) { - SI += (MI_map_64qam[1][index]/beta1_dlsch_MI[TM][mcs]); - M +=6; - break; - } - } - - //for sinr_db2 - for (index = 0; index < 227; index++) { - if (sinr_db2 < MI_map_64qam[0][0]) { - SI += (MI_map_64qam[1][0]/beta1_dlsch_MI[TM][mcs]); - M +=6; - break; - } - - if (sinr_db2 > MI_map_64qam[0][226]) { - SI += (MI_map_64qam[1][226]/beta1_dlsch_MI[TM][mcs]); - M +=6; - break; - } - - if (sinr_db2 == MI_map_64qam[0][index]) { - SI += (MI_map_64qam[1][index]/beta1_dlsch_MI[TM][mcs]); - M +=6; - break; - } - } - } - } - - // } - - RBIR = SI/M; - - //Now RBIR->SINR_effective Mapping - //binary search method is performed here - if(mcs<10) { - start = 0; - end = 161; - middle = end/2; - - if (RBIR <= MI_map_4qam[2][start]) { - sinr_eff = MI_map_4qam[0][start]; - } else { - if (RBIR >= MI_map_4qam[2][end]) - sinr_eff = MI_map_4qam[0][end]; - else { - //while((end-start > 1) && (RBIR >= MI_map_4qam[2])) - if (RBIR < MI_map_4qam[2][middle]) { - end = middle; - middle = end/2; - } else { - start = middle; - middle = (end-middle)/2; - } - } - - for (; end>start; end--) { - if ((RBIR < MI_map_4qam[2][end]) && (RBIR > MI_map_4qam[2][end-2])) { - sinr_eff = MI_map_4qam[0][end-1]; - break; - } - } - } - - sinr_eff = sinr_eff * beta2_dlsch_MI[TM][mcs]; - } - - - - else if (mcs>9 && mcs<17) { - - start = 0; - end = 196; - middle = end/2; - - if (RBIR <= MI_map_16qam[2][start]) { - sinr_eff = MI_map_16qam[0][start]; - } else { - if (RBIR >= MI_map_16qam[2][end]) - sinr_eff = MI_map_16qam[0][end]; - else { - //while((end-start > 1) && (RBIR >= MI_map_4qam[2])) - if (RBIR < MI_map_16qam[2][middle]) { - end = middle; - middle = end/2; - } else { - start = middle; - middle = (end-middle)/2; - } - } - - for (; end>start; end--) { - if ((RBIR < MI_map_16qam[2][end]) && (RBIR > MI_map_16qam[2][end-2])) { - sinr_eff = MI_map_16qam[0][end-1]; - break; - } - } - } - - sinr_eff = sinr_eff * beta2_dlsch_MI[TM][mcs]; - } else if (mcs>16) { - start = 0; - end = 226; - middle = end/2; - - if (RBIR <= MI_map_64qam[2][start]) { - sinr_eff = MI_map_64qam[0][start]; - } else { - if (RBIR >= MI_map_64qam[2][end]) - sinr_eff = MI_map_64qam[0][end]; - else { - //while((end-start > 1) && (RBIR >= MI_map_4qam[2])) - if (RBIR < MI_map_64qam[2][middle]) { - end = middle; - middle = end/2; - } else { - start = middle; - middle = (end-middle)/2; - } - } - - for (; end>start; end--) { - if ((RBIR < MI_map_64qam[2][end]) && (RBIR > MI_map_64qam[2][end-2])) { - sinr_eff = MI_map_64qam[0][end-1]; - break; - } - } - } - - sinr_eff = sinr_eff * beta2_dlsch_MI[TM][mcs]; - } - - msg("SINR_Eff = %e\n",sinr_eff); - - sinr_eff *= 10; - sinr_eff = floor(sinr_eff); - // if ((int)sinr_eff%2) { - // sinr_eff += 1; - // } - sinr_eff /= 10; - msg("sinr_eff after rounding = %f\n",sinr_eff); - - for (index = 0; index < 16; index++) { - if(index == 0) { - if (sinr_eff < sinr_bler_map_up[mcs][0][index]) { - bler = 1; - break; - } - } - - if (sinr_eff == sinr_bler_map_up[mcs][0][index]) { - bler = sinr_bler_map_up[mcs][1][index]; - } - } - -#ifdef USER_MODE // need to be adapted for the emulation in the kernel space - - if (uniformrandom() < bler) { - msg("abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); - return(0); - } else { - msg("abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler); - return(1); - } - -#endif - -} - -#endif - -uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t sched_subframe, - uint8_t UE_index, - uint16_t *crnti) -{ - - uint8_t UE_id; - uint16_t rnti; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - uint8_t harq_pid; - uint8_t CC_id = phy_vars_eNB->CC_id; - - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe); - - rnti = phy_vars_eNB->ulsch_eNB[UE_index]->rnti; -#ifdef DEBUG_PHY - LOG_D(PHY,"[eNB %d] ulsch_decoding_emul : subframe %d UE_index %d harq_pid %d rnti %x\n",phy_vars_eNB->Mod_id,subframe,UE_index,harq_pid,rnti); -#endif - - for (UE_id=0; UE_idlte_ue_pdcch_vars[0]->crnti) - break; - - /* - msg("[PHY] EMUL eNB %d ulsch_decoding_emul : subframe ue id %d crnti %x nb ue %d\n", - phy_vars_eNB->Mod_id, - UE_id, - PHY_vars_UE_g[UE_id]->lte_ue_pdcch_vars[0]->crnti, - NB_UE_INST); - */ - } - - if (UE_id==NB_UE_INST) { - LOG_W(PHY,"[eNB %d] ulsch_decoding_emul: FATAL, didn't find UE with rnti %x (UE index %d)\n", - phy_vars_eNB->Mod_id, rnti, UE_index); - return(1+phy_vars_eNB->ulsch_eNB[UE_id]->max_turbo_iterations); - } else { - LOG_D(PHY,"[eNB %d] Found UE with rnti %x => UE_id %d\n",phy_vars_eNB->Mod_id, rnti, UE_id); - } - - if (PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->harq_processes[harq_pid]->status == CBA_ACTIVE) { - *crnti = rnti; - PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->harq_processes[harq_pid]->status=IDLE; - } else - *crnti = 0x0; - - // Do abstraction here to determine if packet it in error - /* if (ulsch_abstraction_MIESM(phy_vars_eNB->sinr_dB_eNB,1, phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb, phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb) == 1) - flag = 1; - else flag = 0;*/ - - - /* - //SINRdbPost = phy_vars_eNB->sinr_dB_eNB; - mcsPost = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs, - nrbPost = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb; - frbPost = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb; - - - if(nrbPost > 0) - { - SINRdbPost = phy_vars_eNB->sinr_dB_eNB; - ULflag1 = 1; - } - else - { - SINRdbPost = NULL ; - ULflag1 = 0 ; - }*/ - - // - // write_output("postprocSINR.m","SINReNB",phy_vars_eNB->sinr_dB,301,1,7); - - - //Yazdir buraya her frame icin 300 eNb - // fprintf(SINRrx,"%e,%e,%e,%e;\n",SINRdbPost); - //fprintf(SINRrx,"%e\n",SINRdbPost); - - // fprintf(csv_fd,"%e+i*(%e),",channelx,channely); - - // if (ulsch_abstraction(phy_vars_eNB->sinr_dB,1, phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb, phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb) == 1) { - if (1) { - LOG_D(PHY,"ulsch_decoding_emul abstraction successful\n"); - - memcpy(phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->b, - PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->TBS>>3); - - // get local ue's ack - if ((UE_index >= oai_emulation.info.first_ue_local) ||(UE_index <(oai_emulation.info.first_ue_local+oai_emulation.info.nb_ue_local))) { - get_ack(&phy_vars_eNB->lte_frame_parms, - PHY_vars_UE_g[UE_id][CC_id]->dlsch_ue[0][0]->harq_ack, - subframe, - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_ACK); - } else { // get remote UEs' ack - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_ACK[0] = PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->o_ACK[0]; - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_ACK[1] = PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->o_ACK[1]; - } - - // Do abstraction of PUSCH feedback -#ifdef DEBUG_PHY - LOG_D(PHY,"[eNB %d][EMUL] ue index %d UE_id %d: subframe %d : o_ACK (%d %d), cqi (val %d, len %d)\n", - phy_vars_eNB->Mod_id,UE_index, UE_id, subframe,phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_ACK[1], - ((HLC_subband_cqi_rank1_2A_5MHz *)PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->o)->cqi1, - PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->O); -#endif - - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->Or1 = PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->O; - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->Or2 = PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->O; - - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->uci_format = PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->uci_format; - memcpy(phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o,PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->o,MAX_CQI_BYTES); - memcpy(phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->o_RI,PHY_vars_UE_g[UE_id][CC_id]->ulsch_ue[0]->o_RI,2); - - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->cqi_crc_status = 1; - - return(1); - } else { - LOG_W(PHY,"[eNB %d] ulsch_decoding_emul abstraction failed for UE %d\n",phy_vars_eNB->Mod_id,UE_index); - - phy_vars_eNB->ulsch_eNB[UE_index]->harq_processes[harq_pid]->cqi_crc_status = 0; - - // retransmission - return(1+phy_vars_eNB->ulsch_eNB[UE_index]->max_turbo_iterations); - } - -} -#endif diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 010dd36f31..93c1af8d91 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/ulsch_demodulation.c * \brief Top-level routines for demodulating the PUSCH physical channel from 36.211 V8.6 2009-03 @@ -55,7 +47,6 @@ static short jitter[8] __attribute__ ((aligned(16))) = {1,0,0,1,0,1,1,0}; static short jitterc[8] __attribute__ ((aligned(16))) = {0,1,1,0,1,0,0,1}; -#ifndef OFDMA_ULSCH void lte_idft(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *z, uint16_t Msc_PUSCH) { #if defined(__x86_64__) || defined(__i386__) @@ -463,7 +454,7 @@ void lte_idft(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *z, uint16_t Msc_PUSCH) #endif } -#endif + @@ -734,14 +725,17 @@ void ulsch_extract_rbs_single(int32_t **rxdataF, //uint8_t symbol = l+Ns*frame_parms->symbols_per_tti/2; uint8_t symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame + AssertFatal((frame_parms->nb_antennas_rx>0) && (frame_parms->nb_antennas_rx<3), + "nb_antennas_rx not in (1-2)\n"); + for (aarx=0; aarxnb_antennas_rx; aarx++) { nb_rb1 = cmin(cmax((int)(frame_parms->N_RB_UL) - (int)(2*first_rb),(int)0),(int)(2*nb_rb)); // 2 times no. RBs before the DC nb_rb2 = 2*nb_rb - nb_rb1; // 2 times no. RBs after the DC - + #ifdef DEBUG_ULSCH - msg("ulsch_extract_rbs_single: 2*nb_rb1 = %d, 2*nb_rb2 = %d\n",nb_rb1,nb_rb2); + printf("ulsch_extract_rbs_single: 2*nb_rb1 = %d, 2*nb_rb2 = %d\n",nb_rb1,nb_rb2); #endif rxF_ext = &rxdataF_ext[aarx][(symbol*frame_parms->N_RB_UL*12)]; @@ -752,20 +746,12 @@ void ulsch_extract_rbs_single(int32_t **rxdataF, rxF_ext += nb_rb1*6; if (nb_rb2) { - //#ifdef OFDMA_ULSCH - // rxF = &rxdataF[aarx][(1 + symbol*frame_parms->ofdm_symbol_size)*2]; - //#else rxF = &rxdataF[aarx][(symbol*frame_parms->ofdm_symbol_size)]; - //#endif memcpy(rxF_ext, rxF, nb_rb2*6*sizeof(int)); rxF_ext += nb_rb2*6; } } else { //there is only data in the second half - //#ifdef OFDMA_ULSCH - // rxF = &rxdataF[aarx][(1 + 6*(2*first_rb - frame_parms->N_RB_UL) + symbol*frame_parms->ofdm_symbol_size)*2]; - //#else rxF = &rxdataF[aarx][(6*(2*first_rb - frame_parms->N_RB_UL) + symbol*frame_parms->ofdm_symbol_size)]; - //#endif memcpy(rxF_ext, rxF, nb_rb2*6*sizeof(int)); rxF_ext += nb_rb2*6; } @@ -814,9 +800,6 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, __m128i *ul_ch128,*ul_ch_mag128,*ul_ch_mag128b,*rxdataF128,*rxdataF_comp128; uint8_t aarx;//,symbol_mod; __m128i mmtmpU0,mmtmpU1,mmtmpU2,mmtmpU3; -#ifdef OFDMA_ULSCH - __m128i QAM_amp128U,QAM_amp128bU; -#endif #elif defined(__arm__) @@ -825,35 +808,11 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, uint8_t aarx;//,symbol_mod; int32x4_t mmtmpU0,mmtmpU1,mmtmpU0b,mmtmpU1b; -#ifdef OFDMA_ULSCH - int16x8_t mmtmpU2,mmtmpU3; - int16x8_t QAM_amp128U,QAM_amp128bU; -#endif int16_t conj[4]__attribute__((aligned(16))) = {1,-1,1,-1}; int32x4_t output_shift128 = vmovq_n_s32(-(int32_t)output_shift); -#endif - -#ifdef OFDMA_ULSCH - -#if defined(__x86_64__) || defined(__i386__) - if (Qm == 4) - QAM_amp128U = _mm_set1_epi16(QAM16_n1); - else if (Qm == 6) { - QAM_amp128U = _mm_set1_epi16(QAM64_n1); - QAM_amp128bU = _mm_set1_epi16(QAM64_n2); - } -#elif defined(__arm__) - if (Qm == 4) - QAM_amp128U = vdupq_n_s16(QAM16_n1); - else if (Qm == 6) { - QAM_amp128U = vdupq_n_s16(QAM64_n1); - QAM_amp128bU = vdupq_n_s16(QAM64_n2); - } - -#endif #endif for (aarx=0; aarxnb_antennas_rx; aarx++) { @@ -878,76 +837,7 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, #endif for (rb=0; rb2) { - // get channel amplitude if not QPSK -#if defined(__x86_64__) || defined(__i386__) - mmtmpU0 = _mm_madd_epi16(ul_ch128[0],ul_ch128[0]); - - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - - mmtmpU1 = _mm_madd_epi16(ul_ch128[1],ul_ch128[1]); - mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift); - mmtmpU0 = _mm_packs_epi32(mmtmpU0,mmtmpU1); - - ul_ch_mag128[0] = _mm_unpacklo_epi16(mmtmpU0,mmtmpU0); - ul_ch_mag128b[0] = ul_ch_mag128[0]; - ul_ch_mag128[0] = _mm_mulhi_epi16(ul_ch_mag128[0],QAM_amp128U); - ul_ch_mag128[0] = _mm_slli_epi16(ul_ch_mag128[0],2); // 2 to compensate the scale channel estimate - ul_ch_mag128[1] = _mm_unpackhi_epi16(mmtmpU0,mmtmpU0); - ul_ch_mag128b[1] = ul_ch_mag128[1]; - ul_ch_mag128[1] = _mm_mulhi_epi16(ul_ch_mag128[1],QAM_amp128U); - ul_ch_mag128[1] = _mm_slli_epi16(ul_ch_mag128[1],2); // 2 to compensate the scale channel estimate - - mmtmpU0 = _mm_madd_epi16(ul_ch128[2],ul_ch128[2]); - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - mmtmpU1 = _mm_packs_epi32(mmtmpU0,mmtmpU0); - - ul_ch_mag128[2] = _mm_unpacklo_epi16(mmtmpU1,mmtmpU1); - ul_ch_mag128b[2] = ul_ch_mag128[2]; - - ul_ch_mag128[2] = _mm_mulhi_epi16(ul_ch_mag128[2],QAM_amp128U); - ul_ch_mag128[2] = _mm_slli_epi16(ul_ch_mag128[2],2); // 2 to compensate the scale channel estimate - - - ul_ch_mag128b[0] = _mm_mulhi_epi16(ul_ch_mag128b[0],QAM_amp128bU); - ul_ch_mag128b[0] = _mm_slli_epi16(ul_ch_mag128b[0],2); // 2 to compensate the scale channel estimate - - - ul_ch_mag128b[1] = _mm_mulhi_epi16(ul_ch_mag128b[1],QAM_amp128bU); - ul_ch_mag128b[1] = _mm_slli_epi16(ul_ch_mag128b[1],2); // 2 to compensate the scale channel estimate - - ul_ch_mag128b[2] = _mm_mulhi_epi16(ul_ch_mag128b[2],QAM_amp128bU); - ul_ch_mag128b[2] = _mm_slli_epi16(ul_ch_mag128b[2],2);// 2 to compensate the scale channel estimate - -#elif defined(__arm__) - mmtmpU0 = vmull_s16(ul_ch128[0], ul_ch128[0]); - mmtmpU0 = vqshlq_s32(vqaddq_s32(mmtmpU0,vrev64q_s32(mmtmpU0)),-output_shift128); - mmtmpU1 = vmull_s16(ul_ch128[1], ul_ch128[1]); - mmtmpU1 = vqshlq_s32(vqaddq_s32(mmtmpU1,vrev64q_s32(mmtmpU1)),-output_shift128); - mmtmpU2 = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); - mmtmpU0 = vmull_s16(ul_ch128[2], ul_ch128[2]); - mmtmpU0 = vqshlq_s32(vqaddq_s32(mmtmpU0,vrev64q_s32(mmtmpU0)),-output_shift128); - mmtmpU1 = vmull_s16(ul_ch128[3], ul_ch128[3]); - mmtmpU1 = vqshlq_s32(vqaddq_s32(mmtmpU1,vrev64q_s32(mmtmpU1)),-output_shift128); - mmtmpU3 = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); - mmtmpU0 = vmull_s16(ul_ch128[4], ul_ch128[4]); - mmtmpU0 = vqshlq_s32(vqaddq_s32(mmtmpU0,vrev64q_s32(mmtmpU0)),-output_shift128); - mmtmpU1 = vmull_s16(ul_ch128[5], ul_ch128[5]); - mmtmpU1 = vqshlq_s32(vqaddq_s32(mmtmpU1,vrev64q_s32(mmtmpU1)),-output_shift128); - mmtmpU4 = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); - - ul_ch_mag128b[0] = vqdmulhq_s16(mmtmpU2,QAM_amp128b); - ul_ch_mag128b[1] = vqdmulhq_s16(mmtmpU3,QAM_amp128b); - ul_ch_mag128[0] = vqdmulhq_s16(mmtmpU2,QAM_amp128); - ul_ch_mag128[1] = vqdmulhq_s16(mmtmpU3,QAM_amp128); - ul_ch_mag128b[2] = vqdmulhq_s16(mmtmpU4,QAM_amp128b); - ul_ch_mag128[2] = vqdmulhq_s16(mmtmpU4,QAM_amp128); -#endif - } - -#else // SC-FDMA // just compute channel magnitude without scaling, this is done after equalization for SC-FDMA #if defined(__x86_64__) || defined(__i386__) @@ -973,30 +863,29 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, #elif defined(__arm__) - mmtmpU0 = vmull_s16(ul_ch128[0], ul_ch128[0]); - mmtmpU0 = vqshlq_s32(vqaddq_s32(mmtmpU0,vrev64q_s32(mmtmpU0)),-output_shift128); - mmtmpU1 = vmull_s16(ul_ch128[1], ul_ch128[1]); - mmtmpU1 = vqshlq_s32(vqaddq_s32(mmtmpU1,vrev64q_s32(mmtmpU1)),-output_shift128); - ul_ch_mag128[0] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); - mmtmpU0 = vmull_s16(ul_ch128[2], ul_ch128[2]); - mmtmpU0 = vqshlq_s32(vqaddq_s32(mmtmpU0,vrev64q_s32(mmtmpU0)),-output_shift128); - mmtmpU1 = vmull_s16(ul_ch128[3], ul_ch128[3]); - mmtmpU1 = vqshlq_s32(vqaddq_s32(mmtmpU1,vrev64q_s32(mmtmpU1)),-output_shift128); - ul_ch_mag128[1] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); - mmtmpU0 = vmull_s16(ul_ch128[4], ul_ch128[4]); - mmtmpU0 = vqshlq_s32(vqaddq_s32(mmtmpU0,vrev64q_s32(mmtmpU0)),-output_shift128); - mmtmpU1 = vmull_s16(ul_ch128[5], ul_ch128[5]); - mmtmpU1 = vqshlq_s32(vqaddq_s32(mmtmpU1,vrev64q_s32(mmtmpU1)),-output_shift128); - ul_ch_mag128[2] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); - -#endif + mmtmpU0 = vmull_s16(ul_ch128[0], ul_ch128[0]); + mmtmpU0 = vqshlq_s32(vqaddq_s32(mmtmpU0,vrev64q_s32(mmtmpU0)),-output_shift128); + mmtmpU1 = vmull_s16(ul_ch128[1], ul_ch128[1]); + mmtmpU1 = vqshlq_s32(vqaddq_s32(mmtmpU1,vrev64q_s32(mmtmpU1)),-output_shift128); + ul_ch_mag128[0] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); + mmtmpU0 = vmull_s16(ul_ch128[2], ul_ch128[2]); + mmtmpU0 = vqshlq_s32(vqaddq_s32(mmtmpU0,vrev64q_s32(mmtmpU0)),-output_shift128); + mmtmpU1 = vmull_s16(ul_ch128[3], ul_ch128[3]); + mmtmpU1 = vqshlq_s32(vqaddq_s32(mmtmpU1,vrev64q_s32(mmtmpU1)),-output_shift128); + ul_ch_mag128[1] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); + mmtmpU0 = vmull_s16(ul_ch128[4], ul_ch128[4]); + mmtmpU0 = vqshlq_s32(vqaddq_s32(mmtmpU0,vrev64q_s32(mmtmpU0)),-output_shift128); + mmtmpU1 = vmull_s16(ul_ch128[5], ul_ch128[5]); + mmtmpU1 = vqshlq_s32(vqaddq_s32(mmtmpU1,vrev64q_s32(mmtmpU1)),-output_shift128); + ul_ch_mag128[2] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); + #endif #if defined(__x86_64__) || defined(__i386__) // multiply by conjugated channel mmtmpU0 = _mm_madd_epi16(ul_ch128[0],rxdataF128[0]); // print_ints("re",&mmtmpU0); - + // mmtmpU0 contains real part of 4 consecutive outputs (32-bit) mmtmpU1 = _mm_shufflelo_epi16(ul_ch128[0],_MM_SHUFFLE(2,3,0,1)); mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1)); @@ -1065,65 +954,65 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, rxdataF128+=3; rxdataF_comp128+=3; #elif defined(__arm__) - mmtmpU0 = vmull_s16(ul_ch128[0], rxdataF128[0]); - //mmtmpU0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])] - mmtmpU1 = vmull_s16(ul_ch128[1], rxdataF128[1]); - //mmtmpU1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])] - mmtmpU0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0),vget_high_s32(mmtmpU0)), - vpadd_s32(vget_low_s32(mmtmpU1),vget_high_s32(mmtmpU1))); - //mmtmpU0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] - - mmtmpU0b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[0],*(int16x4_t*)conj)), rxdataF128[0]); - //mmtmpU0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])] - mmtmpU1b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[1],*(int16x4_t*)conj)), rxdataF128[1]); - //mmtmpU0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])] - mmtmpU1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0b),vget_high_s32(mmtmpU0b)), - vpadd_s32(vget_low_s32(mmtmpU1b),vget_high_s32(mmtmpU1b))); - //mmtmpU1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])] - - mmtmpU0 = vqshlq_s32(mmtmpU0,-output_shift128); - mmtmpU1 = vqshlq_s32(mmtmpU1,-output_shift128); - rxdataF_comp128[0] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); - mmtmpU0 = vmull_s16(ul_ch128[2], rxdataF128[2]); - mmtmpU1 = vmull_s16(ul_ch128[3], rxdataF128[3]); - mmtmpU0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0),vget_high_s32(mmtmpU0)), - vpadd_s32(vget_low_s32(mmtmpU1),vget_high_s32(mmtmpU1))); - mmtmpU0b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[2],*(int16x4_t*)conj)), rxdataF128[2]); - mmtmpU1b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[3],*(int16x4_t*)conj)), rxdataF128[3]); - mmtmpU1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0b),vget_high_s32(mmtmpU0b)), - vpadd_s32(vget_low_s32(mmtmpU1b),vget_high_s32(mmtmpU1b))); - mmtmpU0 = vqshlq_s32(mmtmpU0,-output_shift128); - mmtmpU1 = vqshlq_s32(mmtmpU1,-output_shift128); - rxdataF_comp128[1] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); - - mmtmpU0 = vmull_s16(ul_ch128[4], rxdataF128[4]); - mmtmpU1 = vmull_s16(ul_ch128[5], rxdataF128[5]); - mmtmpU0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0),vget_high_s32(mmtmpU0)), - vpadd_s32(vget_low_s32(mmtmpU1),vget_high_s32(mmtmpU1))); - - mmtmpU0b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[4],*(int16x4_t*)conj)), rxdataF128[4]); - mmtmpU1b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[5],*(int16x4_t*)conj)), rxdataF128[5]); - mmtmpU1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0b),vget_high_s32(mmtmpU0b)), - vpadd_s32(vget_low_s32(mmtmpU1b),vget_high_s32(mmtmpU1b))); - - - mmtmpU0 = vqshlq_s32(mmtmpU0,-output_shift128); - mmtmpU1 = vqshlq_s32(mmtmpU1,-output_shift128); - rxdataF_comp128[2] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); - - // Add a jitter to compensate for the saturation in "packs" resulting in a bias on the DC after IDFT - rxdataF_comp128[0] = vqaddq_s16(rxdataF_comp128[0],(*(int16x8_t*)&jitter[0])); - rxdataF_comp128[1] = vqaddq_s16(rxdataF_comp128[1],(*(int16x8_t*)&jitter[0])); - rxdataF_comp128[2] = vqaddq_s16(rxdataF_comp128[2],(*(int16x8_t*)&jitter[0])); - + mmtmpU0 = vmull_s16(ul_ch128[0], rxdataF128[0]); + //mmtmpU0 = [Re(ch[0])Re(rx[0]) Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1]) Im(ch[1])Im(ch[1])] + mmtmpU1 = vmull_s16(ul_ch128[1], rxdataF128[1]); + //mmtmpU1 = [Re(ch[2])Re(rx[2]) Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3]) Im(ch[3])Im(ch[3])] + mmtmpU0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0),vget_high_s32(mmtmpU0)), + vpadd_s32(vget_low_s32(mmtmpU1),vget_high_s32(mmtmpU1))); + //mmtmpU0 = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2])Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] - ul_ch128+=6; - ul_ch_mag128+=3; - ul_ch_mag128b+=3; - rxdataF128+=6; - rxdataF_comp128+=3; - + mmtmpU0b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[0],*(int16x4_t*)conj)), rxdataF128[0]); + //mmtmpU0 = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])] + mmtmpU1b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[1],*(int16x4_t*)conj)), rxdataF128[1]); + //mmtmpU0 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])] + mmtmpU1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0b),vget_high_s32(mmtmpU0b)), + vpadd_s32(vget_low_s32(mmtmpU1b),vget_high_s32(mmtmpU1b))); + //mmtmpU1 = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])] + + mmtmpU0 = vqshlq_s32(mmtmpU0,-output_shift128); + mmtmpU1 = vqshlq_s32(mmtmpU1,-output_shift128); + rxdataF_comp128[0] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); + mmtmpU0 = vmull_s16(ul_ch128[2], rxdataF128[2]); + mmtmpU1 = vmull_s16(ul_ch128[3], rxdataF128[3]); + mmtmpU0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0),vget_high_s32(mmtmpU0)), + vpadd_s32(vget_low_s32(mmtmpU1),vget_high_s32(mmtmpU1))); + mmtmpU0b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[2],*(int16x4_t*)conj)), rxdataF128[2]); + mmtmpU1b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[3],*(int16x4_t*)conj)), rxdataF128[3]); + mmtmpU1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0b),vget_high_s32(mmtmpU0b)), + vpadd_s32(vget_low_s32(mmtmpU1b),vget_high_s32(mmtmpU1b))); + mmtmpU0 = vqshlq_s32(mmtmpU0,-output_shift128); + mmtmpU1 = vqshlq_s32(mmtmpU1,-output_shift128); + rxdataF_comp128[1] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); + + mmtmpU0 = vmull_s16(ul_ch128[4], rxdataF128[4]); + mmtmpU1 = vmull_s16(ul_ch128[5], rxdataF128[5]); + mmtmpU0 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0),vget_high_s32(mmtmpU0)), + vpadd_s32(vget_low_s32(mmtmpU1),vget_high_s32(mmtmpU1))); + + mmtmpU0b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[4],*(int16x4_t*)conj)), rxdataF128[4]); + mmtmpU1b = vmull_s16(vrev32_s16(vmul_s16(ul_ch128[5],*(int16x4_t*)conj)), rxdataF128[5]); + mmtmpU1 = vcombine_s32(vpadd_s32(vget_low_s32(mmtmpU0b),vget_high_s32(mmtmpU0b)), + vpadd_s32(vget_low_s32(mmtmpU1b),vget_high_s32(mmtmpU1b))); + + + mmtmpU0 = vqshlq_s32(mmtmpU0,-output_shift128); + mmtmpU1 = vqshlq_s32(mmtmpU1,-output_shift128); + rxdataF_comp128[2] = vcombine_s16(vmovn_s32(mmtmpU0),vmovn_s32(mmtmpU1)); + + // Add a jitter to compensate for the saturation in "packs" resulting in a bias on the DC after IDFT + rxdataF_comp128[0] = vqaddq_s16(rxdataF_comp128[0],(*(int16x8_t*)&jitter[0])); + rxdataF_comp128[1] = vqaddq_s16(rxdataF_comp128[1],(*(int16x8_t*)&jitter[0])); + rxdataF_comp128[2] = vqaddq_s16(rxdataF_comp128[2],(*(int16x8_t*)&jitter[0])); + + + ul_ch128+=6; + ul_ch_mag128+=3; + ul_ch_mag128b+=3; + rxdataF128+=6; + rxdataF_comp128+=3; #endif + } } @@ -1136,381 +1025,16 @@ void ulsch_channel_compensation(int32_t **rxdataF_ext, -#if defined(__x86_64__) || defined(__i386__) -__m128i QAM_amp128U_0,QAM_amp128bU_0,QAM_amp128U_1,QAM_amp128bU_1; -#endif -void ulsch_channel_compensation_alamouti(int32_t **rxdataF_ext, // For Distributed Alamouti Combining - int32_t **ul_ch_estimates_ext_0, - int32_t **ul_ch_estimates_ext_1, - int32_t **ul_ch_mag_0, - int32_t **ul_ch_magb_0, - int32_t **ul_ch_mag_1, - int32_t **ul_ch_magb_1, - int32_t **rxdataF_comp_0, - int32_t **rxdataF_comp_1, - LTE_DL_FRAME_PARMS *frame_parms, - uint8_t symbol, - uint8_t Qm, - uint16_t nb_rb, - uint8_t output_shift) -{ -#if defined(__x86_64__) || defined(__i386__) - uint16_t rb; - __m128i *ul_ch128_0,*ul_ch128_1,*ul_ch_mag128_0,*ul_ch_mag128_1,*ul_ch_mag128b_0,*ul_ch_mag128b_1,*rxdataF128,*rxdataF_comp128_0,*rxdataF_comp128_1; - uint8_t aarx;//,symbol_mod; - __m128i mmtmpU0,mmtmpU1,mmtmpU2,mmtmpU3; - // symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - // printf("comp: symbol %d\n",symbol); - if (Qm == 4) { - QAM_amp128U_0 = _mm_set1_epi16(QAM16_n1); - QAM_amp128U_1 = _mm_set1_epi16(QAM16_n1); - } else if (Qm == 6) { - QAM_amp128U_0 = _mm_set1_epi16(QAM64_n1); - QAM_amp128bU_0 = _mm_set1_epi16(QAM64_n2); - QAM_amp128U_1 = _mm_set1_epi16(QAM64_n1); - QAM_amp128bU_1 = _mm_set1_epi16(QAM64_n2); - } - for (aarx=0; aarxnb_antennas_rx; aarx++) { - ul_ch128_0 = (__m128i *)&ul_ch_estimates_ext_0[aarx][symbol*frame_parms->N_RB_DL*12]; - ul_ch_mag128_0 = (__m128i *)&ul_ch_mag_0[aarx][symbol*frame_parms->N_RB_DL*12]; - ul_ch_mag128b_0 = (__m128i *)&ul_ch_magb_0[aarx][symbol*frame_parms->N_RB_DL*12]; - ul_ch128_1 = (__m128i *)&ul_ch_estimates_ext_1[aarx][symbol*frame_parms->N_RB_DL*12]; - ul_ch_mag128_1 = (__m128i *)&ul_ch_mag_1[aarx][symbol*frame_parms->N_RB_DL*12]; - ul_ch_mag128b_1 = (__m128i *)&ul_ch_magb_1[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128_0 = (__m128i *)&rxdataF_comp_0[aarx][symbol*frame_parms->N_RB_DL*12]; - rxdataF_comp128_1 = (__m128i *)&rxdataF_comp_1[aarx][symbol*frame_parms->N_RB_DL*12]; - for (rb=0; rb2) { - // get channel amplitude if not QPSK - - mmtmpU0 = _mm_madd_epi16(ul_ch128_0[0],ul_ch128_0[0]); - - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - - mmtmpU1 = _mm_madd_epi16(ul_ch128_0[1],ul_ch128_0[1]); - mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift); - mmtmpU0 = _mm_packs_epi32(mmtmpU0,mmtmpU1); - - ul_ch_mag128_0[0] = _mm_unpacklo_epi16(mmtmpU0,mmtmpU0); - ul_ch_mag128b_0[0] = ul_ch_mag128_0[0]; - ul_ch_mag128_0[0] = _mm_mulhi_epi16(ul_ch_mag128_0[0],QAM_amp128U_0); - ul_ch_mag128_0[0] = _mm_slli_epi16(ul_ch_mag128_0[0],2); // 2 to compensate the scale channel estimate - - ul_ch_mag128_0[1] = _mm_unpackhi_epi16(mmtmpU0,mmtmpU0); - ul_ch_mag128b_0[1] = ul_ch_mag128_0[1]; - ul_ch_mag128_0[1] = _mm_mulhi_epi16(ul_ch_mag128_0[1],QAM_amp128U_0); - ul_ch_mag128_0[1] = _mm_slli_epi16(ul_ch_mag128_0[1],2); // 2 to scale compensate the scale channel estimate - - mmtmpU0 = _mm_madd_epi16(ul_ch128_0[2],ul_ch128_0[2]); - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - mmtmpU1 = _mm_packs_epi32(mmtmpU0,mmtmpU0); - - ul_ch_mag128_0[2] = _mm_unpacklo_epi16(mmtmpU1,mmtmpU1); - ul_ch_mag128b_0[2] = ul_ch_mag128_0[2]; - - ul_ch_mag128_0[2] = _mm_mulhi_epi16(ul_ch_mag128_0[2],QAM_amp128U_0); - ul_ch_mag128_0[2] = _mm_slli_epi16(ul_ch_mag128_0[2],2); // 2 to scale compensate the scale channel estimat - - - ul_ch_mag128b_0[0] = _mm_mulhi_epi16(ul_ch_mag128b_0[0],QAM_amp128bU_0); - ul_ch_mag128b_0[0] = _mm_slli_epi16(ul_ch_mag128b_0[0],2); // 2 to scale compensate the scale channel estima - - - ul_ch_mag128b_0[1] = _mm_mulhi_epi16(ul_ch_mag128b_0[1],QAM_amp128bU_0); - ul_ch_mag128b_0[1] = _mm_slli_epi16(ul_ch_mag128b_0[1],2); // 2 to scale compensate the scale channel estima - - ul_ch_mag128b_0[2] = _mm_mulhi_epi16(ul_ch_mag128b_0[2],QAM_amp128bU_0); - ul_ch_mag128b_0[2] = _mm_slli_epi16(ul_ch_mag128b_0[2],2); // 2 to scale compensate the scale channel estima - - - - - mmtmpU0 = _mm_madd_epi16(ul_ch128_1[0],ul_ch128_1[0]); - - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - - mmtmpU1 = _mm_madd_epi16(ul_ch128_1[1],ul_ch128_1[1]); - mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift); - mmtmpU0 = _mm_packs_epi32(mmtmpU0,mmtmpU1); - - ul_ch_mag128_1[0] = _mm_unpacklo_epi16(mmtmpU0,mmtmpU0); - ul_ch_mag128b_1[0] = ul_ch_mag128_1[0]; - ul_ch_mag128_1[0] = _mm_mulhi_epi16(ul_ch_mag128_1[0],QAM_amp128U_1); - ul_ch_mag128_1[0] = _mm_slli_epi16(ul_ch_mag128_1[0],2); // 2 to compensate the scale channel estimate - - ul_ch_mag128_1[1] = _mm_unpackhi_epi16(mmtmpU0,mmtmpU0); - ul_ch_mag128b_1[1] = ul_ch_mag128_1[1]; - ul_ch_mag128_1[1] = _mm_mulhi_epi16(ul_ch_mag128_1[1],QAM_amp128U_1); - ul_ch_mag128_1[1] = _mm_slli_epi16(ul_ch_mag128_1[1],2); // 2 to scale compensate the scale channel estimate - - mmtmpU0 = _mm_madd_epi16(ul_ch128_1[2],ul_ch128_1[2]); - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - mmtmpU1 = _mm_packs_epi32(mmtmpU0,mmtmpU0); - - ul_ch_mag128_1[2] = _mm_unpacklo_epi16(mmtmpU1,mmtmpU1); - ul_ch_mag128b_1[2] = ul_ch_mag128_1[2]; - - ul_ch_mag128_1[2] = _mm_mulhi_epi16(ul_ch_mag128_1[2],QAM_amp128U_0); - ul_ch_mag128_1[2] = _mm_slli_epi16(ul_ch_mag128_1[2],2); // 2 to scale compensate the scale channel estimat - - - ul_ch_mag128b_1[0] = _mm_mulhi_epi16(ul_ch_mag128b_1[0],QAM_amp128bU_1); - ul_ch_mag128b_1[0] = _mm_slli_epi16(ul_ch_mag128b_1[0],2); // 2 to scale compensate the scale channel estima - - - ul_ch_mag128b_1[1] = _mm_mulhi_epi16(ul_ch_mag128b_1[1],QAM_amp128bU_1); - ul_ch_mag128b_1[1] = _mm_slli_epi16(ul_ch_mag128b_1[1],2); // 2 to scale compensate the scale channel estima - - ul_ch_mag128b_1[2] = _mm_mulhi_epi16(ul_ch_mag128b_1[2],QAM_amp128bU_1); - ul_ch_mag128b_1[2] = _mm_slli_epi16(ul_ch_mag128b_1[2],2); // 2 to scale compensate the scale channel estima - } - - - /************************For Computing (y)*(h0*)********************************************/ - - // multiply by conjugated channel - mmtmpU0 = _mm_madd_epi16(ul_ch128_0[0],rxdataF128[0]); - // print_ints("re",&mmtmpU0); - - // mmtmpU0 contains real part of 4 consecutive outputs (32-bit) - mmtmpU1 = _mm_shufflelo_epi16(ul_ch128_0[0],_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)&conjugate[0]); - // print_ints("im",&mmtmpU1); - mmtmpU1 = _mm_madd_epi16(mmtmpU1,rxdataF128[0]); - // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - // print_ints("re(shift)",&mmtmpU0); - mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift); - // print_ints("im(shift)",&mmtmpU1); - mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1); - mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1); - // print_ints("c0",&mmtmpU2); - // print_ints("c1",&mmtmpU3); - rxdataF_comp128_0[0] = _mm_packs_epi32(mmtmpU2,mmtmpU3); - // print_shorts("rx:",rxdataF128[0]); - // print_shorts("ch:",ul_ch128_0[0]); - // print_shorts("pack:",rxdataF_comp128_0[0]); - - // multiply by conjugated channel - mmtmpU0 = _mm_madd_epi16(ul_ch128_0[1],rxdataF128[1]); - // mmtmpU0 contains real part of 4 consecutive outputs (32-bit) - mmtmpU1 = _mm_shufflelo_epi16(ul_ch128_0[1],_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)conjugate); - mmtmpU1 = _mm_madd_epi16(mmtmpU1,rxdataF128[1]); - // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift); - mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1); - mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1); - - rxdataF_comp128_0[1] = _mm_packs_epi32(mmtmpU2,mmtmpU3); - // print_shorts("rx:",rxdataF128[1]); - // print_shorts("ch:",ul_ch128_0[1]); - // print_shorts("pack:",rxdataF_comp128_0[1]); - // multiply by conjugated channel - mmtmpU0 = _mm_madd_epi16(ul_ch128_0[2],rxdataF128[2]); - // mmtmpU0 contains real part of 4 consecutive outputs (32-bit) - mmtmpU1 = _mm_shufflelo_epi16(ul_ch128_0[2],_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)conjugate); - mmtmpU1 = _mm_madd_epi16(mmtmpU1,rxdataF128[2]); - // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift); - mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1); - mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1); - - rxdataF_comp128_0[2] = _mm_packs_epi32(mmtmpU2,mmtmpU3); - // print_shorts("rx:",rxdataF128[2]); - // print_shorts("ch:",ul_ch128_0[2]); - // print_shorts("pack:",rxdataF_comp128_0[2]); - - - - - /*************************For Computing (y*)*(h1)************************************/ - // multiply by conjugated signal - mmtmpU0 = _mm_madd_epi16(ul_ch128_1[0],rxdataF128[0]); - // print_ints("re",&mmtmpU0); - - // mmtmpU0 contains real part of 4 consecutive outputs (32-bit) - mmtmpU1 = _mm_shufflelo_epi16(rxdataF128[0],_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)&conjugate[0]); - // print_ints("im",&mmtmpU1); - mmtmpU1 = _mm_madd_epi16(mmtmpU1,ul_ch128_1[0]); - // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - // print_ints("re(shift)",&mmtmpU0); - mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift); - // print_ints("im(shift)",&mmtmpU1); - mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1); - mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1); - // print_ints("c0",&mmtmpU2); - // print_ints("c1",&mmtmpU3); - rxdataF_comp128_1[0] = _mm_packs_epi32(mmtmpU2,mmtmpU3); - // print_shorts("rx:",rxdataF128[0]); - // print_shorts("ch_conjugate:",ul_ch128_1[0]); - // print_shorts("pack:",rxdataF_comp128_1[0]); - - - // multiply by conjugated signal - mmtmpU0 = _mm_madd_epi16(ul_ch128_1[1],rxdataF128[1]); - // mmtmpU0 contains real part of 4 consecutive outputs (32-bit) - mmtmpU1 = _mm_shufflelo_epi16(rxdataF128[1],_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)conjugate); - mmtmpU1 = _mm_madd_epi16(mmtmpU1,ul_ch128_1[1]); - // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift); - mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1); - mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1); - - rxdataF_comp128_1[1] = _mm_packs_epi32(mmtmpU2,mmtmpU3); - // print_shorts("rx:",rxdataF128[1]); - // print_shorts("ch_conjugate:",ul_ch128_1[1]); - // print_shorts("pack:",rxdataF_comp128_1[1]); - - - // multiply by conjugated signal - mmtmpU0 = _mm_madd_epi16(ul_ch128_1[2],rxdataF128[2]); - // mmtmpU0 contains real part of 4 consecutive outputs (32-bit) - mmtmpU1 = _mm_shufflelo_epi16(rxdataF128[2],_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_shufflehi_epi16(mmtmpU1,_MM_SHUFFLE(2,3,0,1)); - mmtmpU1 = _mm_sign_epi16(mmtmpU1,*(__m128i*)conjugate); - mmtmpU1 = _mm_madd_epi16(mmtmpU1,ul_ch128_1[2]); - // mmtmpU1 contains imag part of 4 consecutive outputs (32-bit) - mmtmpU0 = _mm_srai_epi32(mmtmpU0,output_shift); - mmtmpU1 = _mm_srai_epi32(mmtmpU1,output_shift); - mmtmpU2 = _mm_unpacklo_epi32(mmtmpU0,mmtmpU1); - mmtmpU3 = _mm_unpackhi_epi32(mmtmpU0,mmtmpU1); - - rxdataF_comp128_1[2] = _mm_packs_epi32(mmtmpU2,mmtmpU3); - // print_shorts("rx:",rxdataF128[2]); - // print_shorts("ch_conjugate:",ul_ch128_0[2]); - // print_shorts("pack:",rxdataF_comp128_1[2]); - - - - ul_ch128_0+=3; - ul_ch_mag128_0+=3; - ul_ch_mag128b_0+=3; - ul_ch128_1+=3; - ul_ch_mag128_1+=3; - ul_ch_mag128b_1+=3; - rxdataF128+=3; - rxdataF_comp128_0+=3; - rxdataF_comp128_1+=3; - - } - } - - - _mm_empty(); - _m_empty(); -#endif -} - - - - -void ulsch_alamouti(LTE_DL_FRAME_PARMS *frame_parms,// For Distributed Alamouti Receiver Combining - int32_t **rxdataF_comp, - int32_t **rxdataF_comp_0, - int32_t **rxdataF_comp_1, - int32_t **ul_ch_mag, - int32_t **ul_ch_magb, - int32_t **ul_ch_mag_0, - int32_t **ul_ch_magb_0, - int32_t **ul_ch_mag_1, - int32_t **ul_ch_magb_1, - uint8_t symbol, - uint16_t nb_rb) -{ - -#if defined(__x86_64__) || defined(__i386__) - int16_t *rxF,*rxF0,*rxF1; - __m128i *ch_mag,*ch_magb,*ch_mag0,*ch_mag1,*ch_mag0b,*ch_mag1b; - uint8_t rb,re,aarx; - int32_t jj=(symbol*frame_parms->N_RB_DL*12); - - - for (aarx=0; aarxnb_antennas_rx; aarx++) { - - rxF = (int16_t*)&rxdataF_comp[aarx][jj]; - rxF0 = (int16_t*)&rxdataF_comp_0[aarx][jj]; // Contains (y)*(h0*) - rxF1 = (int16_t*)&rxdataF_comp_1[aarx][jj]; // Contains (y*)*(h1) - ch_mag = (__m128i *)&ul_ch_mag[aarx][jj]; - ch_mag0 = (__m128i *)&ul_ch_mag_0[aarx][jj]; - ch_mag1 = (__m128i *)&ul_ch_mag_1[aarx][jj]; - ch_magb = (__m128i *)&ul_ch_magb[aarx][jj]; - ch_mag0b = (__m128i *)&ul_ch_magb_0[aarx][jj]; - ch_mag1b = (__m128i *)&ul_ch_magb_1[aarx][jj]; - - for (rb=0; rbnb_antennas_rx; aarx++) { //clear average level #if defined(__x86_64__) || defined(__i386__) @@ -1575,46 +1102,46 @@ void ulsch_channel_level(int32_t **drs_ch_estimates_ext, #endif } -int32_t avgU[2]; -int32_t avgU_0[2],avgU_1[2]; // For the Distributed Alamouti Scheme +int ulsch_power_LUT[750]; -void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, - uint32_t sched_subframe, - uint8_t eNB_id, // this is the effective sector id - uint8_t UE_id, - LTE_eNB_ULSCH_t **ulsch, - uint8_t cooperation_flag) -{ +void init_ulsch_power_LUT() { + + int i; + + for (i=0;i<750;i++) ulsch_power_LUT[i] = (int)ceil((pow(2.0,(double)i/100) - 1.0)); + +} + +void rx_ulsch(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + uint8_t UE_id) { + + + LTE_eNB_ULSCH_t **ulsch = eNB->ulsch; // flagMag = 0; - LTE_eNB_COMMON *eNB_common_vars = &phy_vars_eNB->lte_eNB_common_vars; - LTE_eNB_PUSCH *eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars[UE_id]; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; + LTE_eNB_COMMON *common_vars = &eNB->common_vars; + LTE_eNB_PUSCH *pusch_vars = eNB->pusch_vars[UE_id]; + LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; uint32_t l,i; int32_t avgs; uint8_t log2_maxh=0,aarx; - - - int32_t avgs_0,avgs_1; - uint32_t log2_maxh_0=0,log2_maxh_1=0; + int32_t avgU[2]; // uint8_t harq_pid = ( ulsch->RRCConnRequest_flag== 0) ? subframe2harq_pid_tdd(frame_parms->tdd_config,subframe) : 0; uint8_t harq_pid; uint8_t Qm; - uint16_t rx_power_correction; int16_t *llrp; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; + int subframe = proc->subframe_rx; - harq_pid = subframe2harq_pid(frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe); - Qm = get_Qm_ul(ulsch[UE_id]->harq_processes[harq_pid]->mcs); + harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe); + Qm = ulsch[UE_id]->harq_processes[harq_pid]->Qm; #ifdef DEBUG_ULSCH - msg("rx_ulsch: eNB_id %d, harq_pid %d, nb_rb %d first_rb %d, cooperation %d\n",eNB_id,harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb, - cooperation_flag); -#endif //DEBUG_ULSCH + printf("rx_ulsch: harq_pid %d, nb_rb %d first_rb %d\n",harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb); - rx_power_correction = 1; +#endif //DEBUG_ULSCH if (ulsch[UE_id]->harq_processes[harq_pid]->nb_rb == 0) { LOG_E(PHY,"PUSCH (%d/%x) nb_rb=0!\n", harq_pid,ulsch[UE_id]->rnti); @@ -1624,230 +1151,147 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, for (l=0; l<(frame_parms->symbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active); l++) { #ifdef DEBUG_ULSCH - msg("rx_ulsch : symbol %d (first_rb %d,nb_rb %d), rxdataF %p, rxdataF_ext %p\n",l, + printf("rx_ulsch : symbol %d (first_rb %d,nb_rb %d), rxdataF %p, rxdataF_ext %p\n",l, ulsch[UE_id]->harq_processes[harq_pid]->first_rb, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, - eNB_common_vars->rxdataF[eNB_id], - eNB_pusch_vars->rxdataF_ext[eNB_id]); + common_vars->rxdataF, + pusch_vars->rxdataF_ext); #endif //DEBUG_ULSCH - ulsch_extract_rbs_single(eNB_common_vars->rxdataF[eNB_id], - eNB_pusch_vars->rxdataF_ext[eNB_id], + ulsch_extract_rbs_single(common_vars->rxdataF, + pusch_vars->rxdataF_ext, ulsch[UE_id]->harq_processes[harq_pid]->first_rb, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, l%(frame_parms->symbols_per_tti/2), l/(frame_parms->symbols_per_tti/2), frame_parms); - - lte_ul_channel_estimation(phy_vars_eNB, - eNB_id, + + lte_ul_channel_estimation(eNB,proc, UE_id, - sched_subframe, l%(frame_parms->symbols_per_tti/2), - l/(frame_parms->symbols_per_tti/2), - cooperation_flag); + l/(frame_parms->symbols_per_tti/2)); } - if(cooperation_flag == 2) { - for (i=0; inb_antennas_rx; i++) { - eNB_pusch_vars->ulsch_power_0[i] = signal_energy(eNB_pusch_vars->drs_ch_estimates_0[eNB_id][i], - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction; - eNB_pusch_vars->ulsch_power_1[i] = signal_energy(eNB_pusch_vars->drs_ch_estimates_1[eNB_id][i], - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction; - } - } else { - for (i=0; inb_antennas_rx; i++) { - /* - eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i], - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction; + int correction_factor = 1; + int deltaMCS=1; + int MPR_times_100Ks; - */ - - eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i], - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12); - -#ifdef LOCALIZATION - eNB_pusch_vars->subcarrier_power = (int32_t *)malloc(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*sizeof(int32_t)); - eNB_pusch_vars->active_subcarrier = subcarrier_energy(eNB_pusch_vars->drs_ch_estimates[eNB_id][i], - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12, eNB_pusch_vars->subcarrier_power, rx_power_correction); -#endif - } + if (deltaMCS==1) { + // Note we're using TBS instead of sumKr, since didn't run segmentation yet! + + MPR_times_100Ks = 500*ulsch[UE_id]->harq_processes[harq_pid]->TBS/(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*4*ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch); + + AssertFatal(MPR_times_100Ks < 750 && MPR_times_100Ks >= 0,"Impossible value for MPR_times_100Ks %d (TBS %d,Nre %d)\n", + MPR_times_100Ks,ulsch[UE_id]->harq_processes[harq_pid]->TBS, + (ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*4*ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch)); + + if (MPR_times_100Ks > 0) correction_factor = ulsch_power_LUT[MPR_times_100Ks]; + + } + for (i=0; inb_antennas_rx; i++) { + + pusch_vars->ulsch_power[i] = signal_energy_nodc(pusch_vars->drs_ch_estimates[i], + ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)/correction_factor; + /* printf("%4.4d.%d power harq_pid %d rb %2.2d TBS %2.2d (MPR_times_Ks %d correction %d) power %d dBtimes10\n", proc->frame_rx, proc->subframe_rx, harq_pid, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, ulsch[UE_id]->harq_processes[harq_pid]->TBS,MPR_times_100Ks,correction_factor,dB_fixed_times10(pusch_vars->ulsch_power[i])); + */ } - //write_output("rxdataF_ext.m","rxF_ext",eNB_pusch_vars->rxdataF_ext[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1); - //write_output("ulsch_chest.m","drs_est",eNB_pusch_vars->drs_ch_estimates[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1); + + //write_output("rxdataF_ext.m","rxF_ext",pusch_vars->rxdataF_ext[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1); + //write_output("ulsch_chest.m","drs_est",pusch_vars->drs_ch_estimates[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1); - if(cooperation_flag == 2) { - ulsch_channel_level(eNB_pusch_vars->drs_ch_estimates_0[eNB_id], - frame_parms, - avgU_0, - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); - - // msg("[ULSCH] avg_0[0] %d\n",avgU_0[0]); - - - avgs_0 = 0; - - for (aarx=0; aarxnb_antennas_rx; aarx++) - avgs_0 = cmax(avgs_0,avgU_0[(aarx<<1)]); - - log2_maxh_0 = (log2_approx(avgs_0)/2)+ log2_approx(frame_parms->nb_antennas_rx-1)+3; + ulsch_channel_level(pusch_vars->drs_ch_estimates, + frame_parms, + avgU, + ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); + + // printf("[ULSCH] avg[0] %d\n",avgU[0]); + + + avgs = 0; + + for (aarx=0; aarxnb_antennas_rx; aarx++) + avgs = cmax(avgs,avgU[(aarx<<1)]); + + // log2_maxh = 4+(log2_approx(avgs)/2); + + log2_maxh = (log2_approx(avgs)/2)+ log2_approx(frame_parms->nb_antennas_rx-1)+4; + #ifdef DEBUG_ULSCH - msg("[ULSCH] log2_maxh_0 = %d (%d,%d)\n",log2_maxh_0,avgU_0[0],avgs_0); + printf("[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs); #endif - ulsch_channel_level(eNB_pusch_vars->drs_ch_estimates_1[eNB_id], - frame_parms, - avgU_1, - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); - // msg("[ULSCH] avg_1[0] %d\n",avgU_1[0]); - - - avgs_1 = 0; - - for (aarx=0; aarxnb_antennas_rx; aarx++) - avgs_1 = cmax(avgs_1,avgU_1[(aarx<<1)]); - - log2_maxh_1 = (log2_approx(avgs_1)/2) + log2_approx(frame_parms->nb_antennas_rx-1)+3; -#ifdef DEBUG_ULSCH - msg("[ULSCH] log2_maxh_1 = %d (%d,%d)\n",log2_maxh_1,avgU_1[0],avgs_1); -#endif - log2_maxh = max(log2_maxh_0,log2_maxh_1); - } else { - ulsch_channel_level(eNB_pusch_vars->drs_ch_estimates[eNB_id], - frame_parms, - avgU, - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); - - // msg("[ULSCH] avg[0] %d\n",avgU[0]); - - - avgs = 0; - - for (aarx=0; aarxnb_antennas_rx; aarx++) - avgs = cmax(avgs,avgU[(aarx<<1)]); - - // log2_maxh = 4+(log2_approx(avgs)/2); - - log2_maxh = (log2_approx(avgs)/2)+ log2_approx(frame_parms->nb_antennas_rx-1)+4; - -#ifdef DEBUG_ULSCH - msg("[ULSCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgU[0],avgs); -#endif - } - - for (l=0; lsymbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active; l++) { + for (l=0; l<(frame_parms->symbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active); l++) { if (((frame_parms->Ncp == 0) && ((l==3) || (l==10)))|| // skip pilots ((frame_parms->Ncp == 1) && ((l==2) || (l==8)))) { l++; } - if(cooperation_flag == 2) { + ulsch_channel_compensation( + pusch_vars->rxdataF_ext, + pusch_vars->drs_ch_estimates, + pusch_vars->ul_ch_mag, + pusch_vars->ul_ch_magb, + pusch_vars->rxdataF_comp, + frame_parms, + l, + Qm, + ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, + log2_maxh); // log2_maxh+I0_shift - ulsch_channel_compensation_alamouti( - eNB_pusch_vars->rxdataF_ext[eNB_id], - eNB_pusch_vars->drs_ch_estimates_0[eNB_id], - eNB_pusch_vars->drs_ch_estimates_1[eNB_id], - eNB_pusch_vars->ul_ch_mag_0[eNB_id], - eNB_pusch_vars->ul_ch_magb_0[eNB_id], - eNB_pusch_vars->ul_ch_mag_1[eNB_id], - eNB_pusch_vars->ul_ch_magb_1[eNB_id], - eNB_pusch_vars->rxdataF_comp_0[eNB_id], - eNB_pusch_vars->rxdataF_comp_1[eNB_id], - frame_parms, - l, - Qm, - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, - log2_maxh); + - ulsch_alamouti(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->rxdataF_comp_0[eNB_id], - eNB_pusch_vars->rxdataF_comp_1[eNB_id], - eNB_pusch_vars->ul_ch_mag[eNB_id], - eNB_pusch_vars->ul_ch_magb[eNB_id], - eNB_pusch_vars->ul_ch_mag_0[eNB_id], - eNB_pusch_vars->ul_ch_magb_0[eNB_id], - eNB_pusch_vars->ul_ch_mag_1[eNB_id], - eNB_pusch_vars->ul_ch_magb_1[eNB_id], - l, - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); - } else { - ulsch_channel_compensation( - eNB_pusch_vars->rxdataF_ext[eNB_id], - eNB_pusch_vars->drs_ch_estimates[eNB_id], - eNB_pusch_vars->ul_ch_mag[eNB_id], - eNB_pusch_vars->ul_ch_magb[eNB_id], - eNB_pusch_vars->rxdataF_comp[eNB_id], - frame_parms, - l, - Qm, - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, - log2_maxh); // log2_maxh+I0_shift - - } - - - //eren - /* if(flagMag == 0){ - //writing for the first time - write_output(namepointer_log2,"xxx",log2_maxh,1,1,12); - - write_output(namepointer_chMag,"xxx",eNB_pusch_vars->ul_ch_mag[eNB_id][0],300,1,11); - - //namepointer_chMag = NULL; - flagMag=1; - }*/ if (frame_parms->nb_antennas_rx > 1) ulsch_detection_mrc(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->ul_ch_mag[eNB_id], - eNB_pusch_vars->ul_ch_magb[eNB_id], - l, - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); - -#ifndef OFDMA_ULSCH - - if ((phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0]+3)ulsch_power[0]) { - + pusch_vars->rxdataF_comp, + pusch_vars->ul_ch_mag, + pusch_vars->ul_ch_magb, + l, + ulsch[UE_id]->harq_processes[harq_pid]->nb_rb); + + + + // if ((eNB->measurements.n0_power_dB[0]+3)ulsch_power[0]) { + if (23ulsch_power[0]) { freq_equalization(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->ul_ch_mag[eNB_id], - eNB_pusch_vars->ul_ch_magb[eNB_id], - l, - ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12, - Qm); + pusch_vars->rxdataF_comp, + pusch_vars->ul_ch_mag, + pusch_vars->ul_ch_magb, + l, + ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12, + Qm); } - -#endif } -#ifndef OFDMA_ULSCH + + + //#ifdef DEBUG_ULSCH // Inverse-Transform equalized outputs - // msg("Doing IDFTs\n"); + // printf("Doing IDFTs\n"); lte_idft(frame_parms, - (uint32_t*)eNB_pusch_vars->rxdataF_comp[eNB_id][0], + (uint32_t*)pusch_vars->rxdataF_comp[0], ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12); - // msg("Done\n"); + // printf("Done\n"); //#endif //DEBUG_ULSCH -#endif - T(T_ENB_PHY_PUSCH_IQ, T_INT(eNB_id), T_INT(UE_id), T_INT(phy_vars_eNB->proc[sched_subframe].frame_rx), + + + llrp = (int16_t*)&pusch_vars->llr[0]; + + T(T_ENB_PHY_PUSCH_IQ, T_INT(0), T_INT(ulsch[UE_id]->rnti), T_INT(proc->frame_rx), T_INT(subframe), T_INT(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb), T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_tti), - T_BUFFER(eNB_pusch_vars->rxdataF_comp[eNB_id][0], + T_BUFFER(pusch_vars->rxdataF_comp[0], 2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_tti*2)); - llrp = (int16_t*)&eNB_pusch_vars->llr[0]; - for (l=0; lsymbols_per_tti-ulsch[UE_id]->harq_processes[harq_pid]->srs_active; l++) { if (((frame_parms->Ncp == 0) && ((l==3) || (l==10)))|| // skip pilots @@ -1858,8 +1302,8 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, switch (Qm) { case 2 : ulsch_qpsk_llr(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->llr, + pusch_vars->rxdataF_comp, + pusch_vars->llr, l, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, &llrp); @@ -1867,26 +1311,26 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, case 4 : ulsch_16qam_llr(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->llr, - eNB_pusch_vars->ul_ch_mag[eNB_id], + pusch_vars->rxdataF_comp, + pusch_vars->llr, + pusch_vars->ul_ch_mag, l,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, &llrp); break; case 6 : ulsch_64qam_llr(frame_parms, - eNB_pusch_vars->rxdataF_comp[eNB_id], - eNB_pusch_vars->llr, - eNB_pusch_vars->ul_ch_mag[eNB_id], - eNB_pusch_vars->ul_ch_magb[eNB_id], + pusch_vars->rxdataF_comp, + pusch_vars->llr, + pusch_vars->ul_ch_mag, + pusch_vars->ul_ch_magb, l,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, &llrp); break; default: #ifdef DEBUG_ULSCH - msg("ulsch_demodulation.c (rx_ulsch): Unknown Qm!!!!\n"); + printf("ulsch_demodulation.c (rx_ulsch): Unknown Qm!!!!\n"); #endif //DEBUG_ULSCH break; } @@ -1894,66 +1338,65 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB, } -void rx_ulsch_emul(PHY_VARS_eNB *phy_vars_eNB, - uint8_t subframe, - uint8_t sect_id, +void rx_ulsch_emul(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, uint8_t UE_index) { - msg("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",phy_vars_eNB->Mod_id,subframe,sect_id,UE_index); - phy_vars_eNB->lte_eNB_pusch_vars[UE_index]->ulsch_power[0] = 31622; //=45dB; - phy_vars_eNB->lte_eNB_pusch_vars[UE_index]->ulsch_power[1] = 31622; //=45dB; + printf("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, UE_index %d\n",eNB->Mod_id,proc->subframe_rx,UE_index); + eNB->pusch_vars[UE_index]->ulsch_power[0] = 31622; //=45dB; + eNB->pusch_vars[UE_index]->ulsch_power[1] = 31622; //=45dB; } -void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t sched_subframe, uint8_t UE_id) -{ - - uint32_t nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12; + void dump_ulsch(PHY_VARS_eNB *eNB,int frame,int subframe,uint8_t UE_id) { + + uint32_t nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; uint8_t harq_pid; - int subframe = PHY_vars_eNB->proc[sched_subframe].subframe_rx; - harq_pid = subframe2harq_pid(&PHY_vars_eNB->lte_frame_parms,PHY_vars_eNB->proc[sched_subframe].frame_rx,subframe); + harq_pid = subframe2harq_pid(&eNB->frame_parms,frame,subframe); - printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb, - PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs), - PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Nsymb_pusch); - //#ifndef OAI_EMU - write_output("/tmp/ulsch_d.m","ulsch_dseq",&PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->d[0][96], - PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0); - write_output("/tmp/rxsig0.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][0],PHY_vars_eNB->lte_frame_parms.samples_per_tti*10,1,1); + printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, TBS %d, Qm %d, N_symb %d\n", + subframe,harq_pid,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, + eNB->ulsch[UE_id]->harq_processes[harq_pid]->TBS,eNB->ulsch[UE_id]->harq_processes[harq_pid]->Qm, + eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch); + write_output("/tmp/ulsch_d.m","ulsch_dseq",&eNB->ulsch[UE_id]->harq_processes[harq_pid]->d[0][96], + eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0); + if (eNB->common_vars.rxdata) write_output("/tmp/rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0],eNB->frame_parms.samples_per_tti*10,1,1); + + if (eNB->frame_parms.nb_antennas_rx>1) + if (eNB->common_vars.rxdata) write_output("/tmp/rxsig1.m","rxs1", &eNB->common_vars.rxdata[1][0],eNB->frame_parms.samples_per_tti*10,1,1); + - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/rxsig1.m","rxs1", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][1][0],PHY_vars_eNB->lte_frame_parms.samples_per_tti*10,1,1); + write_output("/tmp/rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0],eNB->frame_parms.ofdm_symbol_size*nsymb,1,1); - write_output("/tmp/rxsigF0.m","rxsF0", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][0][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); + if (eNB->frame_parms.nb_antennas_rx>1) + write_output("/tmp/rxsigF1.m","rxsF1", &eNB->common_vars.rxdataF[1][0],eNB->frame_parms.ofdm_symbol_size*nsymb,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/rxsigF1.m","rxsF1", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][1][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); + write_output("/tmp/rxsigF0_ext.m","rxsF0_ext", &eNB->pusch_vars[UE_id]->rxdataF_ext[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); - write_output("/tmp/rxsigF0_ext.m","rxsF0_ext", &PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_ext[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); + if (eNB->frame_parms.nb_antennas_rx>1) + write_output("/tmp/rxsigF1_ext.m","rxsF1_ext", &eNB->pusch_vars[UE_id]->rxdataF_ext[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/rxsigF1_ext.m","rxsF1_ext", &PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_ext[1][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); + /* + if (eNB->srs_vars[UE_id].srs_ch_estimates) write_output("/tmp/srs_est0.m","srsest0",eNB->srs_vars[UE_id].srs_ch_estimates[0],eNB->frame_parms.ofdm_symbol_size,1,1); + if (eNB->frame_parms.nb_antennas_rx>1) + if (eNB->srs_vars[UE_id].srs_ch_estimates) write_output("/tmp/srs_est1.m","srsest1",eNB->srs_vars[UE_id].srs_ch_estimates[1],eNB->frame_parms.ofdm_symbol_size,1,1); + */ - write_output("/tmp/srs_est0.m","srsest0",PHY_vars_eNB->lte_eNB_srs_vars[UE_id].srs_ch_estimates[0][0],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); + write_output("/tmp/drs_est0.m","drsest0",eNB->pusch_vars[UE_id]->drs_ch_estimates[0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/srs_est1.m","srsest1",PHY_vars_eNB->lte_eNB_srs_vars[UE_id].srs_ch_estimates[0][1],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); + if (eNB->frame_parms.nb_antennas_rx>1) + write_output("/tmp/drs_est1.m","drsest1",eNB->pusch_vars[UE_id]->drs_ch_estimates[1],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); - write_output("/tmp/drs_est0.m","drsest0",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates[0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); - - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_rx>1) - write_output("/tmp/drs_est1.m","drsest1",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates[0][1],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); - - write_output("/tmp/ulsch_rxF_comp0.m","ulsch0_rxF_comp0",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); - // write_output("ulsch_rxF_comp1.m","ulsch0_rxF_comp1",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[0][1][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); - write_output("/tmp/ulsch_rxF_llr.m","ulsch_llr",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->llr, - PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb*12*get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs) - *PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Nsymb_pusch,1,0); - write_output("/tmp/ulsch_ch_mag.m","ulsch_ch_mag",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); - // write_output("ulsch_ch_mag1.m","ulsch_ch_mag1",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][1][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1); + write_output("/tmp/ulsch_rxF_comp0.m","ulsch0_rxF_comp0",&eNB->pusch_vars[UE_id]->rxdataF_comp[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); + // write_output("ulsch_rxF_comp1.m","ulsch0_rxF_comp1",&eNB->pusch_vars[UE_id]->rxdataF_comp[0][1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); + write_output("/tmp/ulsch_rxF_llr.m","ulsch_llr",eNB->pusch_vars[UE_id]->llr, + eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*eNB->ulsch[UE_id]->harq_processes[harq_pid]->Qm + *eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_pusch,1,0); + write_output("/tmp/ulsch_ch_mag.m","ulsch_ch_mag",&eNB->pusch_vars[UE_id]->ul_ch_mag[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); + // write_output("ulsch_ch_mag1.m","ulsch_ch_mag1",&eNB->pusch_vars[UE_id]->ul_ch_mag[1][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); //#endif } diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c index b4f7f02480..d1718f6e90 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/LTE_TRANSPORT/ulsch_modulation.c * \brief Top-level routines for generating PUSCH physical channel from 36.211 V8.6 2009-03 @@ -45,7 +37,7 @@ #include "defs.h" #include "UTIL/LOG/vcd_signal_dumper.h" -//#define OFDMA_ULSCH + //#define DEBUG_ULSCH_MODULATION @@ -72,7 +64,7 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb) #elif defined(__arm__) int16x8_t norm128; #endif - // msg("Doing lte_dft for Msc_PUSCH %d\n",Msc_PUSCH); + // printf("Doing lte_dft for Msc_PUSCH %d\n",Msc_PUSCH); d0 = (uint32_t *)d; d1 = d0+Msc_PUSCH; @@ -87,7 +79,7 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb) d10 = d9+Msc_PUSCH; d11 = d10+Msc_PUSCH; - // msg("symbol 0 (d0 %p, d %p)\n",d0,d); + // printf("symbol 0 (d0 %p, d %p)\n",d0,d); for (i=0,ip=0; irnti<<14) + (subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1 - if (harq_pid > 7) { - msg("ulsch_modulation.c: Illegal harq_pid %d\n",harq_pid); + if (harq_pid>=8) { + printf("ulsch_modulation.c: Illegal harq_pid %d\n",harq_pid); return; } @@ -419,12 +411,12 @@ void ulsch_modulation(int32_t **txdataF, nb_rb = ulsch->harq_processes[harq_pid]->nb_rb; if (nb_rb == 0) { - msg("ulsch_modulation.c: Frame %d, Subframe %d Illegal nb_rb %d\n",frame,subframe,nb_rb); + printf("ulsch_modulation.c: Frame %d, Subframe %d Illegal nb_rb %d\n",frame,subframe,nb_rb); return; } - if (first_rb >25 ) { - msg("ulsch_modulation.c: Frame %d, Subframe %d Illegal first_rb %d\n",frame,subframe,first_rb); + if (first_rb > frame_parms->N_RB_UL) { + printf("ulsch_modulation.c: Frame %d, Subframe %d Illegal first_rb %d\n",frame,subframe,first_rb); return; } @@ -434,17 +426,18 @@ void ulsch_modulation(int32_t **txdataF, G = (int)ulsch->harq_processes[harq_pid]->nb_rb * (12 * Q_m) * (ulsch->Nsymb_pusch); + // Mapping nsymb = (frame_parms->Ncp==0) ? 14:12; Msc_PUSCH = ulsch->harq_processes[harq_pid]->nb_rb*12; #ifdef DEBUG_ULSCH_MODULATION - msg("ulsch_modulation.c: Doing modulation (rnti %x,x2 %x) for G=%d bits, harq_pid %d , nb_rb %d, Q_m %d, Nsymb_pusch %d (nsymb %d), subframe %d\n", - ulsch->rnti,x2,G,harq_pid,ulsch->harq_processes[harq_pid]->nb_rb,Q_m, ulsch->Nsymb_pusch,nsymb,subframe); + LOG_D(PHY,"ulsch_modulation.c: Doing modulation (rnti %x,x2 %x) for G=%d bits, harq_pid %d , nb_rb %d, Q_m %d, Nsymb_pusch %d (nsymb %d), subframe %d\n", + ulsch->rnti,x2,G,harq_pid,ulsch->harq_processes[harq_pid]->nb_rb,Q_m, ulsch->Nsymb_pusch,nsymb,subframe); #endif // scrambling (Note the placeholding bits are handled in ulsch_coding.c directly!) - //msg("ulsch bits: "); + //printf("ulsch bits: "); s = lte_gold_generic(&x1, &x2, 1); k=0; @@ -454,14 +447,14 @@ void ulsch_modulation(int32_t **txdataF, c = (uint8_t)((s>>j)&1); if (ulsch->h[k] == PUSCH_x) { - // msg("i %d: PUSCH_x\n",i); + // printf("i %d: PUSCH_x\n",i); ulsch->b_tilde[k] = 1; } else if (ulsch->h[k] == PUSCH_y) { - // msg("i %d: PUSCH_y\n",i); + // printf("i %d: PUSCH_y\n",i); ulsch->b_tilde[k] = ulsch->b_tilde[k-1]; } else { ulsch->b_tilde[k] = (ulsch->h[k]+c)&1; - // msg("i %d : %d (h %d c %d)\n", (i<<5)+j,ulsch->b_tilde[k],ulsch->h[k],c); + // printf("i %d : %d (h %d c %d)\n", (i<<5)+j,ulsch->b_tilde[k],ulsch->h[k],c); } } @@ -469,7 +462,7 @@ void ulsch_modulation(int32_t **txdataF, s = lte_gold_generic(&x1, &x2, 0); } - //msg("\n"); + //printf("\n"); gain_lin_QPSK = (short)((amp*ONE_OVER_SQRT2_Q15)>>15); @@ -493,7 +486,7 @@ void ulsch_modulation(int32_t **txdataF, ((int16_t*)&ulsch->d[i])[0] = (ulsch->b_tilde[j] == 1) ? (gain_lin_QPSK) : -gain_lin_QPSK; ((int16_t*)&ulsch->d[i])[1] = (ulsch->b_tilde[j+1] == 1)? (-gain_lin_QPSK) : gain_lin_QPSK; // if (id[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); + // printf("input %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); // UE1, x0* ((int16_t*)&ulsch->d[i+1])[0] = (ulsch->b_tilde[j-2] == 1) ? (-gain_lin_QPSK) : gain_lin_QPSK; @@ -626,7 +619,7 @@ void ulsch_modulation(int32_t **txdataF, ((int16_t*)&ulsch->d[i])[0] = (ulsch->b_tilde[j] == 1) ? (-gain_lin_QPSK) : gain_lin_QPSK; ((int16_t*)&ulsch->d[i])[1] = (ulsch->b_tilde[j+1] == 1)? (-gain_lin_QPSK) : gain_lin_QPSK; // if (id[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); + // printf("input %d/%d Msc_PUSCH %d (%p): %d,%d\n", i,Msymb,Msc_PUSCH,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); break; @@ -650,7 +643,7 @@ void ulsch_modulation(int32_t **txdataF, ((int16_t*)&ulsch->d[i])[0]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15); ((int16_t*)&ulsch->d[i])[1]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15); - // msg("input(16qam) %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); + // printf("input(16qam) %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); break; case 6: @@ -710,14 +703,14 @@ void ulsch_modulation(int32_t **txdataF, // re_offset0++; } - // msg("re_offset0 %d\n",re_offset0); + // printf("re_offset0 %d\n",re_offset0); for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) { re_offset = re_offset0; symbol_offset = (int)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb)); #ifdef DEBUG_ULSCH_MODULATION - msg("symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); + printf("symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); #endif txptr = &txdataF[0][symbol_offset]; @@ -727,10 +720,10 @@ void ulsch_modulation(int32_t **txdataF, // Skip reference symbols else { - // msg("copying %d REs\n",Msc_PUSCH); + // printf("copying %d REs\n",Msc_PUSCH); for (i=0; iz[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1]); + printf("re_offset %d (%p): %d,%d\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1]); #endif txptr[re_offset++] = ulsch->z[j]; @@ -748,13 +741,13 @@ void ulsch_modulation(int32_t **txdataF, // re_offset0++; } - // msg("re_offset0 %d\n",re_offset0); + // printf("re_offset0 %d\n",re_offset0); // printf("txdataF %p\n",&txdataF[0][0]); for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) { re_offset = re_offset0; symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb)); #ifdef DEBUG_ULSCH_MODULATION - msg("ulsch_mod (OFDMA) symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); + printf("ulsch_mod (SC-FDMA) symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset); #endif txptr = &txdataF[0][symbol_offset]; @@ -763,11 +756,11 @@ void ulsch_modulation(int32_t **txdataF, } // Skip reference symbols else { - // msg("copying %d REs\n",Msc_PUSCH); + // printf("copying %d REs\n",Msc_PUSCH); for (i=0; i %p\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1],&txptr[re_offset]); + printf("re_offset %d (%p): %d,%d => %p\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1],&txptr[re_offset]); #endif //DEBUG_ULSCH_MODULATION txptr[re_offset++] = ulsch->z[j]; diff --git a/openair1/PHY/LTE_TRANSPORT/vars.h b/openair1/PHY/LTE_TRANSPORT/vars.h index c40633aff3..4b6fa920ea 100644 --- a/openair1/PHY/LTE_TRANSPORT/vars.h +++ b/openair1/PHY/LTE_TRANSPORT/vars.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "dlsch_tbs.h" //#include "dlsch_tbs_full.h" #include "sss.h" @@ -66,8 +59,8 @@ char lte_cqi_snr_dB[15] = { -2, unsigned char ue_power_offsets[25] = {14,11,9,8,7,6,6,5,4,4,4,3,3,3,2,2,2,1,1,1,1,1,0,0,0}; -short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ; -short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ; +short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1}; +short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; int qam64_table[8],qam16_table[4]; diff --git a/openair1/PHY/MODULATION/COPYING b/openair1/PHY/MODULATION/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/MODULATION/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/MODULATION/beamforming.c b/openair1/PHY/MODULATION/beamforming.c new file mode 100644 index 0000000000..84863c81e8 --- /dev/null +++ b/openair1/PHY/MODULATION/beamforming.c @@ -0,0 +1,90 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/MODULATION/beamforming.c + * \brief + * \author X. JIANG, F. Kaltenberger, R. KNOPP + * \date 2016 + * \version 0.1 + * \company Eurecom + * \email: xiwen.jiang@eurecom.fr,florian.kaltenberger@eurecom.fr,raymond.knopp@eurecom.fr + * \note + * \warning + */ +#include "PHY/defs.h" +#include "PHY/extern.h" +#include "PHY/CODING/defs.h" +#include "PHY/CODING/extern.h" +#include "PHY/CODING/lte_interleaver_inline.h" +#include "PHY/LTE_TRANSPORT/defs.h" +#include "defs.h" +#include "UTIL/LOG/vcd_signal_dumper.h" + +int beam_precoding(int32_t **txdataF, + int32_t **txdataF_BF, + LTE_DL_FRAME_PARMS *frame_parms, + int32_t ***beam_weights, + int slot, + int symbol, + int aa) +{ + uint8_t p; + //uint16_t re=0; + int slot_offset_F; + + slot_offset_F = slot*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==1) ? 6 : 7); + + // clear txdata_BF[aa][re] for each call of ue_spec_beamforming + memset(txdataF_BF[aa],0,sizeof(int32_t)*(frame_parms->ofdm_symbol_size)); + + for (p=0; pnb_antenna_ports_eNB || p==5) { + multadd_cpx_vector((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size], + (int16_t*)beam_weights[p][aa], + (int16_t*)&txdataF_BF[aa][symbol*frame_parms->ofdm_symbol_size], + 0, + frame_parms->ofdm_symbol_size, + 15); + //mult_cpx_conj_vector((int16_t*)beam_weights[p][aa], (int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size], (int16_t*)txdataF_BF[aa], frame_parms->ofdm_symbol_size, 15, 1); + + // if check version + /*for (re=0;reofdm_symbol_size;re++) { + if (txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re]!=0) { + ((int16_t*)&txdataF_BF[aa][re])[0] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[0])>>15); + ((int16_t*)&txdataF_BF[aa][re])[0] -= (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[1])>>15); + ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0]*((int16_t*)&beam_weights[p][aa][re])[1])>>15); + ((int16_t*)&txdataF_BF[aa][re])[1] += (int16_t)((((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1]*((int16_t*)&beam_weights[p][aa][re])[0])>>15); + + printf("beamforming.c:txdataF[%d][%d]=%d+j%d, beam_weights[%d][%d][%d]=%d+j%d,txdata_BF[%d][%d]=%d+j%d\n", + p,slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re, + ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[0], + ((int16_t*)&txdataF[p][slot_offset_F+symbol*frame_parms->ofdm_symbol_size+re])[1], + p,aa,re, + ((int16_t*)&beam_weights[p][aa][re])[0],((int16_t*)&beam_weights[p][aa][re])[1], + aa,re, + ((int16_t*)&txdataF_BF[aa][re])[0], + ((int16_t*)&txdataF_BF[aa][re])[1]); + } + }*/ + } + } + return 0; +} diff --git a/openair1/PHY/MODULATION/compute_bf_weights.c b/openair1/PHY/MODULATION/compute_bf_weights.c new file mode 100644 index 0000000000..4ef8e88ca6 --- /dev/null +++ b/openair1/PHY/MODULATION/compute_bf_weights.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include "PHY/impl_defs_lte.h" + +int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coeffs){ + + FILE *calibF_fd; + int i,j,calibF_e; + + calibF_fd = fopen(calibF_fname,"r"); + + if (calibF_fd) { + printf("Loading Calibration matrix from %s\n", calibF_fname); + + for(i=0;i. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __MODULATION_DEFS__H__ #define __MODULATION_DEFS__H__ #include "PHY/defs.h" @@ -78,18 +71,29 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, int sample_offset, int no_prefix); -int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, - LTE_eNB_COMMON *eNb_common_vars, +int slot_fep_ul(RU_t *ru, unsigned char l, unsigned char Ns, - unsigned char eNb_id, int no_prefix); +int front_end_fft(PHY_VARS_UE *ue, + unsigned char l, + unsigned char Ns, + int sample_offset, + int no_prefix); + +int front_end_chanEst(PHY_VARS_UE *ue, + unsigned char l, + unsigned char Ns, + int reset_freq_est); + void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRAME_PARMS *frame_parms); void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms); -void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe); +void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, RU_COMMON *common, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms,int do_precoding); + +void remove_7_5_kHz(RU_t *ru,uint8_t subframe); void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t subframe); @@ -99,6 +103,32 @@ void remove_625_Hz(PHY_VARS_eNB *phy_vars_eNB,int16_t *prach); void apply_625_Hz(PHY_VARS_UE *phy_vars_ue,int16_t *prach); +/** \brief This function performs beamforming precoding for common + * data + @param txdataF Table of pointers for frequency-domain TX signals + @param txdataF_BF Table of pointers for frequency-domain TX signals + @param frame_parms Frame descriptor structure +after beamforming + @param beam_weights Beamforming weights applied on each +antenna element and each carrier + @param slot Slot number + @param symbol Symbol index on which to act + @param aa physical antenna index*/ +int beam_precoding(int32_t **txdataF, + int32_t **txdataF_BF, + LTE_DL_FRAME_PARMS *frame_parms, + int32_t ***beam_weights, + int slot, + int symbol, + int aa); + +int f_read(char *calibF_fname, int nb_ant, int nb_freq, int32_t **tdd_calib_coeffs); + +int estimate_DLCSI_from_ULCSI(int32_t **calib_dl_ch_estimates, int32_t **ul_ch_estimates, int32_t **tdd_calib_coeffs, int nb_ant, int nb_freq); + +int compute_BF_weights(int32_t **beam_weights, int32_t **calib_dl_ch_estimates, PRECODE_TYPE_t precode_type, int nb_ant, int nb_freq); + + #endif /** @}*/ #endif diff --git a/openair1/PHY/MODULATION/extern.h b/openair1/PHY/MODULATION/extern.h index f5be5682aa..4690bba42e 100644 --- a/openair1/PHY/MODULATION/extern.h +++ b/openair1/PHY/MODULATION/extern.h @@ -1,30 +1,21 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ diff --git a/openair1/PHY/MODULATION/kHz_7_5.h b/openair1/PHY/MODULATION/kHz_7_5.h index 2c07627b66..ce2f0d5f2c 100644 --- a/openair1/PHY/MODULATION/kHz_7_5.h +++ b/openair1/PHY/MODULATION/kHz_7_5.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ int16_t s6n_kHz_7_5[1920]__attribute__((aligned(16))) = {31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805}; int16_t s6e_kHz_7_5[1920]__attribute__((aligned(16))) = {23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805,23169,23169,23731,22594,24278,22004,24811,21402,25329,20787,25831,20159,26318,19519,26789,18867,27244,18204,27683,17530,28105,16845,28510,16150,28897,15446,29268,14732,29621,14009,29955,13278,30272,12539,30571,11792,30851,11038,31113,10278,31356,9511,31580,8739,31785,7961,31970,7179,32137,6392,32284,5601,32412,4807,32520,4011,32609,3211,32678,2410,32727,1607,32757,804,32767,0,32757,-805,32727,-1608,32678,-2411,32609,-3212,32520,-4012,32412,-4808,32284,-5602,32137,-6393,31970,-7180,31785,-7962,31580,-8740,31356,-9512,31113,-10279,30851,-11039,30571,-11793,30272,-12540,29955,-13279,29621,-14010,29268,-14733,28897,-15447,28510,-16151,28105,-16846,27683,-17531,27244,-18205,26789,-18868,26318,-19520,25831,-20160,25329,-20788,24811,-21403,24278,-22005,23731,-22595,23169,-23170,22594,-23732,22004,-24279,21402,-24812,20787,-25330,20159,-25832,19519,-26319,18867,-26790,18204,-27245,17530,-27684,16845,-28106,16150,-28511,15446,-28898,14732,-29269,14009,-29622,13278,-29956,12539,-30273,11792,-30572,11038,-30852,10278,-31114,9511,-31357,8739,-31581,7961,-31786,7179,-31971,6392,-32138,5601,-32285,4807,-32413,4011,-32521,3211,-32610,2410,-32679,1607,-32728,804,-32758,0,-32767,-805,-32758,-1608,-32728,-2411,-32679,-3212,-32610,-4012,-32521,-4808,-32413,-5602,-32285,-6393,-32138,-7180,-31971,-7962,-31786,-8740,-31581,-9512,-31357,-10279,-31114,-11039,-30852,-11793,-30572,-12540,-30273,-13279,-29956,-14010,-29622,-14733,-29269,-15447,-28898,-16151,-28511,-16846,-28106,-17531,-27684,-18205,-27245,-18868,-26790,-19520,-26319,-20160,-25832,-20788,-25330,-21403,-24812,-22005,-24279,-22595,-23732,-23170,-23170,-23732,-22595,-24279,-22005,-24812,-21403,-25330,-20788,-25832,-20160,-26319,-19520,-26790,-18868,-27245,-18205,-27684,-17531,-28106,-16846,-28511,-16151,-28898,-15447,-29269,-14733,-29622,-14010,-29956,-13279,-30273,-12540,-30572,-11793,-30852,-11039,-31114,-10279,-31357,-9512,-31581,-8740,-31786,-7962,-31971,-7180,-32138,-6393,-32285,-5602,-32413,-4808,-32521,-4012,-32610,-3212,-32679,-2411,-32728,-1608,-32758,-805}; diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c old mode 100755 new mode 100644 index d7dd141fb5..37d1a48311 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* * @defgroup _PHY_MODULATION_ * @ingroup _physical_layer_ref_implementation_ @@ -38,8 +31,7 @@ This section deals with basic functions for OFDM Modulation. #include "PHY/defs.h" #include "UTIL/LOG/log.h" - -//static short temp2[2048*4] __attribute__((aligned(16))); +#include "UTIL/LOG/vcd_signal_dumper.h" //#define DEBUG_OFDM_MOD @@ -47,39 +39,23 @@ This section deals with basic functions for OFDM Modulation. void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRAME_PARMS *frame_parms) { - uint8_t i; - int short_offset=0; - if ((2*nsymb) < frame_parms->symbols_per_tti) - short_offset = 1; + + PHY_ofdm_mod(txdataF, // input + txdata, // output + frame_parms->ofdm_symbol_size, + 1, // number of symbols + frame_parms->nb_prefix_samples0, // number of prefix samples + CYCLIC_PREFIX); + PHY_ofdm_mod(txdataF+frame_parms->ofdm_symbol_size, // input + txdata+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0, // output + frame_parms->ofdm_symbol_size, + nsymb-1, + frame_parms->nb_prefix_samples, // number of prefix samples + CYCLIC_PREFIX); + - // printf("nsymb %d\n",nsymb); - for (i=0; i<((short_offset)+2*nsymb/frame_parms->symbols_per_tti); i++) { - -#ifdef DEBUG_OFDM_MOD - printf("slot i %d (txdata offset %d, txoutput %p)\n",i,(i*(frame_parms->samples_per_tti>>1)), - txdata+(i*(frame_parms->samples_per_tti>>1))); -#endif - - PHY_ofdm_mod(txdataF+(i*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti>>1), // input - txdata+(i*frame_parms->samples_per_tti>>1), // output - frame_parms->ofdm_symbol_size, - 1, // number of symbols - frame_parms->nb_prefix_samples0, // number of prefix samples - CYCLIC_PREFIX); -#ifdef DEBUG_OFDM_MOD - printf("slot i %d (txdata offset %d)\n",i,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(i*frame_parms->samples_per_tti>>1)); -#endif - - PHY_ofdm_mod(txdataF+frame_parms->ofdm_symbol_size+(i*frame_parms->ofdm_symbol_size*(frame_parms->symbols_per_tti>>1)), // input - txdata+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(i*(frame_parms->samples_per_tti>>1)), // output - frame_parms->ofdm_symbol_size, - (short_offset==1) ? 1 :(frame_parms->symbols_per_tti>>1)-1,//6, // number of symbols - frame_parms->nb_prefix_samples, // number of prefix samples - CYCLIC_PREFIX); - - - } + } void PHY_ofdm_mod(int *input, /// pointer to complex input @@ -91,7 +67,7 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input ) { - static short temp[2048*4] __attribute__((aligned(32))); + short temp[2048*4] __attribute__((aligned(32))); unsigned short i,j; short k; @@ -151,7 +127,7 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input #else // on AVX2 need 256-bit alignment idft((int16_t *)&input[i*fftsize], - (fftsize<=512) ? (int16_t *)temp : (int16_t *)&output[(i*fftsize) + ((1+i)*nb_prefix_samples)], + (int16_t *)temp, 1); #endif @@ -169,13 +145,12 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input #ifndef __AVX2__ if (fftsize==128) -#else - if (fftsize<=512) #endif { - for (j=0; jtxdataF; + int32_t **txdataF_BF = common->txdataF_BF; + int32_t **txdata = common->txdata; + + slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); + slot_offsetF = (next_slot)*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==EXTENDED) ? 6 : 7); + //printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc()); + for (l=0; lsymbols_per_tti>>1; l++) { + + for (aa=0; aanb_antennas_tx; aa++) { + + //printf("do_OFDM_mod_l, slot=%d, l=%d, NUMBER_OF_OFDM_CARRIERS=%d,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES=%d\n",next_slot, l,NUMBER_OF_OFDM_CARRIERS,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_BEAM_PRECODING,1); + if (do_precoding==1) beam_precoding(txdataF,txdataF_BF,frame_parms,eNB_common_vars->beam_weights,next_slot,l,aa); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_BEAM_PRECODING,0); + + //PMCH case not implemented... + + if (frame_parms->Ncp == EXTENDED) + PHY_ofdm_mod((do_precoding == 1)?txdataF_BF[aa]:&txdataF[aa][slot_offsetF+l*frame_parms->ofdm_symbol_size], // input + &txdata[aa][slot_offset+l*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES], // output + frame_parms->ofdm_symbol_size, + 1, // number of symbols + frame_parms->nb_prefix_samples, // number of prefix samples + CYCLIC_PREFIX); + else { + if (l==0) { + PHY_ofdm_mod((do_precoding==1)?txdataF_BF[aa]:&txdataF[aa][slot_offsetF+l*frame_parms->ofdm_symbol_size], // input + &txdata[aa][slot_offset], // output + frame_parms->ofdm_symbol_size, + 1, // number of symbols + frame_parms->nb_prefix_samples0, // number of prefix samples + CYCLIC_PREFIX); + + } else { + PHY_ofdm_mod((do_precoding==1)?txdataF_BF[aa]:&txdataF[aa][slot_offsetF+l*frame_parms->ofdm_symbol_size], // input + &txdata[aa][slot_offset+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(l-1)*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES], // output + frame_parms->ofdm_symbol_size, + 1, // number of symbols + frame_parms->nb_prefix_samples, // number of prefix samples + CYCLIC_PREFIX); + + //printf("txdata[%d][%d]=%d\n",aa,slot_offset+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(l-1)*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,txdata[aa][slot_offset+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES0+(l-1)*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES]); + + } + } + } + } + +} +*/ diff --git a/openair1/PHY/MODULATION/prach625Hz.h b/openair1/PHY/MODULATION/prach625Hz.h index 5a114181e6..38b63b3b05 100644 --- a/openair1/PHY/MODULATION/prach625Hz.h +++ b/openair1/PHY/MODULATION/prach625Hz.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ int16_t sig625_1_25MHz[2850*2]; int16_t sig625_2_5MHz[5700*2]; int16_t sig625_5MHz[11400*2]; diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c index 61c83e5b89..39ae90217f 100644 --- a/openair1/PHY/MODULATION/slot_fep.c +++ b/openair1/PHY/MODULATION/slot_fep.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "defs.h" //#define DEBUG_FEP @@ -33,7 +26,7 @@ #define SOFFSET 0 -int slot_fep(PHY_VARS_UE *phy_vars_ue, +int slot_fep(PHY_VARS_UE *ue, unsigned char l, unsigned char Ns, int sample_offset, @@ -41,8 +34,8 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, int reset_freq_est) { - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - LTE_UE_COMMON *ue_common_vars = &phy_vars_ue->lte_ue_common_vars; + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + LTE_UE_COMMON *common_vars = &ue->common_vars; uint8_t eNB_id = 0;//ue_common_vars->eNb_id; unsigned char aa; unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame @@ -54,6 +47,11 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, unsigned int frame_length_samples = frame_parms->samples_per_tti * 10; unsigned int rx_offset; + /*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id]; + unsigned char harq_pid = dlsch_ue[0]->current_harq_pid; + LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; + int uespec_pilot[9][1200];*/ + void (*dft)(int16_t *,int16_t *, int); int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs @@ -111,37 +109,35 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, for (aa=0; aanb_antennas_rx; aa++) { - memset(&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); + memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET; // Align with 256 bit // rx_offset = rx_offset&0xfffffff8; -#ifdef DEBUG_FEP - // if (phy_vars_ue->frame <100) - printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", phy_vars_ue->frame_rx,Ns, symbol, - nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset); -#endif - if (l==0) { if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) - memcpy((short *)&ue_common_vars->rxdata[aa][frame_length_samples], - (short *)&ue_common_vars->rxdata[aa][0], + memcpy((short *)&common_vars->rxdata[aa][frame_length_samples], + (short *)&common_vars->rxdata[aa][0], frame_parms->ofdm_symbol_size*sizeof(int)); if ((rx_offset&7)!=0) { // if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs memcpy((void *)tmp_dft_in, - (void *)&ue_common_vars->rxdata[aa][rx_offset % frame_length_samples], + (void *)&common_vars->rxdata[aa][rx_offset % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); dft((int16_t *)tmp_dft_in, - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly - start_meas(&phy_vars_ue->rx_dft_stats); +#if UE_TIMING_TRACE + start_meas(&ue->rx_dft_stats); +#endif - dft((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples], - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); - stop_meas(&phy_vars_ue->rx_dft_stats); + dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); +#if UE_TIMING_TRACE + stop_meas(&ue->rx_dft_stats); +#endif } } else { @@ -149,54 +145,64 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, // (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1); #ifdef DEBUG_FEP - // if (phy_vars_ue->frame <100) - printf("slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d\n", phy_vars_ue->frame_rx,Ns, symbol, - nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset); + // if (ue->frame <100) + LOG_I(PHY,"slot_fep: frame %d: slot %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx,Ns, symbol, + nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset,frame_length_samples); #endif if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) - memcpy((void *)&ue_common_vars->rxdata[aa][frame_length_samples], - (void *)&ue_common_vars->rxdata[aa][0], + memcpy((void *)&common_vars->rxdata[aa][frame_length_samples], + (void *)&common_vars->rxdata[aa][0], frame_parms->ofdm_symbol_size*sizeof(int)); - - start_meas(&phy_vars_ue->rx_dft_stats); +#if UE_TIMING_TRACE + start_meas(&ue->rx_dft_stats); +#endif if ((rx_offset&7)!=0) { // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs memcpy((void *)tmp_dft_in, - (void *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples], + (void *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], frame_parms->ofdm_symbol_size*sizeof(int)); dft((int16_t *)tmp_dft_in, - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } else { // use dft input from RX buffer directly - dft((int16_t *)&ue_common_vars->rxdata[aa][(rx_offset) % frame_length_samples], - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); } - - stop_meas(&phy_vars_ue->rx_dft_stats); +#if UE_TIMING_TRACE + stop_meas(&ue->rx_dft_stats); +#endif } + #ifdef DEBUG_FEP + // if (ue->frame <100) + printf("slot_fep: frame %d: symbol %d rx_offset %d\n", ue->proc.proc_rxtx[(Ns>>1)&1].frame_rx, symbol,rx_offset); + #endif } - if (phy_vars_ue->perfect_ce == 0) { + if (ue->perfect_ce == 0) { if ((l==0) || (l==(4-frame_parms->Ncp))) { - for (aa=0; aanb_antennas_tx_eNB; aa++) { + for (aa=0; aanb_antenna_ports_eNB; aa++) { #ifdef DEBUG_FEP printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l); #endif - start_meas(&phy_vars_ue->dlsch_channel_estimation_stats); - lte_dl_channel_estimation(phy_vars_ue,eNB_id,0, +#if UE_TIMING_TRACE + start_meas(&ue->dlsch_channel_estimation_stats); +#endif + lte_dl_channel_estimation(ue,eNB_id,0, Ns, aa, l, symbol); - stop_meas(&phy_vars_ue->dlsch_channel_estimation_stats); +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_channel_estimation_stats); +#endif - for (i=0; iPHY_measurements.n_adj_cells; i++) { - lte_dl_channel_estimation(phy_vars_ue,eNB_id,i+1, + for (i=0; imeasurements.n_adj_cells; i++) { + lte_dl_channel_estimation(ue,eNB_id,i+1, Ns, aa, l, @@ -212,16 +218,23 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, #endif if (l==(4-frame_parms->Ncp)) { - start_meas(&phy_vars_ue->dlsch_freq_offset_estimation_stats); - lte_est_freq_offset(ue_common_vars->dl_ch_estimates[0], + +#if UE_TIMING_TRACE + start_meas(&ue->dlsch_freq_offset_estimation_stats); +#endif + + lte_est_freq_offset(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[0], frame_parms, l, - &ue_common_vars->freq_offset, + &common_vars->freq_offset, reset_freq_est); - stop_meas(&phy_vars_ue->dlsch_freq_offset_estimation_stats); +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_freq_offset_estimation_stats); +#endif } } + } #ifdef DEBUG_FEP @@ -229,3 +242,219 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, #endif return(0); } + +int front_end_fft(PHY_VARS_UE *ue, + unsigned char l, + unsigned char Ns, + int sample_offset, + int no_prefix) +{ + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + LTE_UE_COMMON *common_vars = &ue->common_vars; + unsigned char aa; + unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame + unsigned int nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples); + unsigned int nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0); + unsigned int subframe_offset;//,subframe_offset_F; + unsigned int slot_offset; + unsigned int frame_length_samples = frame_parms->samples_per_tti * 10; + unsigned int rx_offset; + uint8_t threadId; + + /*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id]; + unsigned char harq_pid = dlsch_ue[0]->current_harq_pid; + LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; + int uespec_pilot[9][1200];*/ + + void (*dft)(int16_t *,int16_t *, int); + int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs + + switch (frame_parms->ofdm_symbol_size) { + case 128: + dft = dft128; + break; + + case 256: + dft = dft256; + break; + + case 512: + dft = dft512; + break; + + case 1024: + dft = dft1024; + break; + + case 1536: + dft = dft1536; + break; + + case 2048: + dft = dft2048; + break; + + default: + dft = dft512; + break; + } + + if (no_prefix) { + subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1); + slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_tti>>1) * (Ns%2); + } else { + subframe_offset = frame_parms->samples_per_tti * (Ns>>1); + slot_offset = (frame_parms->samples_per_tti>>1) * (Ns%2); + } + + // subframe_offset_F = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1); + + + if (l<0 || l>=7-frame_parms->Ncp) { + printf("slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp); + return(-1); + } + + if (Ns<0 || Ns>=20) { + printf("slot_fep: Ns must be between 0 and 19\n"); + return(-1); + } + + + + threadId = ue->current_thread_id[Ns>>1]; + for (aa=0; aanb_antennas_rx; aa++) { + // change thread index + memset(&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],0,frame_parms->ofdm_symbol_size*sizeof(int)); + + rx_offset = sample_offset + slot_offset + nb_prefix_samples0 + subframe_offset - SOFFSET; + // Align with 256 bit + // rx_offset = rx_offset&0xfffffff8; + + if (l==0) { + + if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) + memcpy((short *)&common_vars->rxdata[aa][frame_length_samples], + (short *)&common_vars->rxdata[aa][0], + frame_parms->ofdm_symbol_size*sizeof(int)); + + if ((rx_offset&7)!=0) { // if input to dft is not 256-bit aligned, issue for size 6,15 and 25 PRBs + memcpy((void *)tmp_dft_in, + (void *)&common_vars->rxdata[aa][rx_offset % frame_length_samples], + frame_parms->ofdm_symbol_size*sizeof(int)); + dft((int16_t *)tmp_dft_in, + (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + } else { // use dft input from RX buffer directly + start_meas(&ue->rx_dft_stats); + + dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], + (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + stop_meas(&ue->rx_dft_stats); + + } + } else { + rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l;// + + // (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1); + +#ifdef DEBUG_FEP + // if (ue->frame <100) + LOG_I(PHY,"slot_fep: frame %d: slot %d, threadId %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, slot_offset %d, subframe_offset %d, sample_offset %d,rx_offset %d, frame_length_samples %d\n", + ue->proc.proc_rxtx[threadId].frame_rx,Ns, threadId,symbol, + nb_prefix_samples,nb_prefix_samples0,slot_offset,subframe_offset,sample_offset,rx_offset,frame_length_samples); +#endif + + if (rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) + memcpy((void *)&common_vars->rxdata[aa][frame_length_samples], + (void *)&common_vars->rxdata[aa][0], + frame_parms->ofdm_symbol_size*sizeof(int)); + + start_meas(&ue->rx_dft_stats); + + if ((rx_offset&7)!=0) { // if input to dft is not 128-bit aligned, issue for size 6 and 15 PRBs + memcpy((void *)tmp_dft_in, + (void *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], + frame_parms->ofdm_symbol_size*sizeof(int)); + dft((int16_t *)tmp_dft_in, + (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + } else { // use dft input from RX buffer directly + + dft((int16_t *)&common_vars->rxdata[aa][(rx_offset) % frame_length_samples], + (int16_t *)&common_vars->common_vars_rx_data_per_thread[threadId].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1); + } + + stop_meas(&ue->rx_dft_stats); + + + } + + #ifdef DEBUG_FEP + // if (ue->frame <100) + printf("slot_fep: frame %d: symbol %d rx_offset %d\n", ue->proc.proc_rxtx[threadId].frame_rx, symbol,rx_offset); + #endif + } + return(0); +} + +int front_end_chanEst(PHY_VARS_UE *ue, + unsigned char l, + unsigned char Ns, + int reset_freq_est) +{ + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + LTE_UE_COMMON *common_vars = &ue->common_vars; + uint8_t eNB_id = 0;//ue_common_vars->eNb_id; + unsigned char aa; + unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame + int i; + + /*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id]; + unsigned char harq_pid = dlsch_ue[0]->current_harq_pid; + LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; + int uespec_pilot[9][1200];*/ + + if (ue->perfect_ce == 0) { + if ((l==0) || (l==(4-frame_parms->Ncp))) { + for (aa=0; aanb_antenna_ports_eNB; aa++) { + +#ifdef DEBUG_FEP + printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l); +#endif + start_meas(&ue->dlsch_channel_estimation_stats); + lte_dl_channel_estimation(ue,eNB_id,0, + Ns, + aa, + l, + symbol); + stop_meas(&ue->dlsch_channel_estimation_stats); + + for (i=0; imeasurements.n_adj_cells; i++) { + lte_dl_channel_estimation(ue,eNB_id,i+1, + Ns, + aa, + l, + symbol); + } + } + + + // do frequency offset estimation here! + // use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1}) +#ifdef DEBUG_FEP + printf("Frequency offset estimation\n"); +#endif + + if (l==(4-frame_parms->Ncp)) { + start_meas(&ue->dlsch_freq_offset_estimation_stats); + lte_est_freq_offset(common_vars->common_vars_rx_data_per_thread[(Ns>>1)&0x1].dl_ch_estimates[0], + frame_parms, + l, + &common_vars->freq_offset, + reset_freq_est); + stop_meas(&ue->dlsch_freq_offset_estimation_stats); + + } + } + + } + return(0); +} diff --git a/openair1/PHY/MODULATION/slot_fep_mbsfn.c b/openair1/PHY/MODULATION/slot_fep_mbsfn.c index f6ca4aa2f4..7b902bb8f1 100644 --- a/openair1/PHY/MODULATION/slot_fep_mbsfn.c +++ b/openair1/PHY/MODULATION/slot_fep_mbsfn.c @@ -1,46 +1,39 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "defs.h" //#define DEBUG_FEP #define SOFFSET 0 -int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, +int slot_fep_mbsfn(PHY_VARS_UE *ue, unsigned char l, int subframe, int sample_offset, int no_prefix) { - - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; - LTE_UE_COMMON *ue_common_vars = &phy_vars_ue->lte_ue_common_vars; + + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + LTE_UE_COMMON *common_vars = &ue->common_vars; uint8_t eNB_id = 0;//ue_common_vars->eNb_id; unsigned char aa; @@ -94,88 +87,95 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, if (l<0 || l>=12) { - msg("slot_fep_mbsfn: l must be between 0 and 11\n"); + LOG_E(PHY,"slot_fep_mbsfn: l must be between 0 and 11\n"); return(-1); } if (((subframe == 0) || (subframe == 5) || // SFn 0,4,5,9; (subframe == 4) || (subframe == 9)) && (frame_type==FDD) ) { //check for valid MBSFN subframe - msg("slot_fep_mbsfn: Subframe must be 1,2,3,6,7,8 for FDD, Got %d \n",subframe); + LOG_E(PHY,"slot_fep_mbsfn: Subframe must be 1,2,3,6,7,8 for FDD, Got %d \n",subframe); return(-1); } else if (((subframe == 0) || (subframe == 1) || (subframe==2) || // SFn 0,4,5,9; (subframe == 5) || (subframe == 6)) && (frame_type==TDD) ) { //check for valid MBSFN subframe - msg("slot_fep_mbsfn: Subframe must be 3,4,7,8,9 for TDD, Got %d \n",subframe); + LOG_E(PHY,"slot_fep_mbsfn: Subframe must be 3,4,7,8,9 for TDD, Got %d \n",subframe); return(-1); } #ifdef DEBUG_FEP - msg("slot_fep_mbsfn: subframe %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, subframe_offset %d, sample_offset %d\n", subframe, l, nb_prefix_samples,nb_prefix_samples0,subframe_offset, + LOG_D(PHY,"slot_fep_mbsfn: subframe %d, symbol %d, nb_prefix_samples %d, nb_prefix_samples0 %d, subframe_offset %d, sample_offset %d\n", subframe, l, nb_prefix_samples,nb_prefix_samples0,subframe_offset, sample_offset); #endif - for (aa=0; aanb_antennas_rx; aa++) { - memset(&ue_common_vars->rxdataF[aa][2*frame_parms->ofdm_symbol_size*l],0,2*frame_parms->ofdm_symbol_size*sizeof(int)); - + memset(&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][frame_parms->ofdm_symbol_size*l],0,frame_parms->ofdm_symbol_size*sizeof(int)); if (l==0) { - start_meas(&phy_vars_ue->rx_dft_stats); - dft((int16_t *)&ue_common_vars->rxdata[aa][(sample_offset + +#if UE_TIMING_TRACE + start_meas(&ue->rx_dft_stats); +#endif + dft((int16_t *)&common_vars->rxdata[aa][(sample_offset + nb_prefix_samples0 + subframe_offset - SOFFSET) % frame_length_samples], - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); - stop_meas(&phy_vars_ue->rx_dft_stats); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); +#if UE_TIMING_TRACE + stop_meas(&ue->rx_dft_stats); +#endif } else { if ((sample_offset + (frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) + (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1) + subframe_offset- SOFFSET) > (frame_length_samples - frame_parms->ofdm_symbol_size)) - memcpy((short *)&ue_common_vars->rxdata[aa][frame_length_samples], - (short *)&ue_common_vars->rxdata[aa][0], + memcpy((short *)&common_vars->rxdata[aa][frame_length_samples], + (short *)&common_vars->rxdata[aa][0], frame_parms->ofdm_symbol_size*sizeof(int)); - start_meas(&phy_vars_ue->rx_dft_stats); - dft((int16_t *)&ue_common_vars->rxdata[aa][(sample_offset + +#if UE_TIMING_TRACE + start_meas(&ue->rx_dft_stats); +#endif + dft((int16_t *)&common_vars->rxdata[aa][(sample_offset + (frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) + (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1) + subframe_offset- SOFFSET) % frame_length_samples], - (int16_t *)&ue_common_vars->rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); - stop_meas(&phy_vars_ue->rx_dft_stats); + (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[aa][frame_parms->ofdm_symbol_size*l],1); +#if UE_TIMING_TRACE + stop_meas(&ue->rx_dft_stats); +#endif } - } + + //if ((l==0) || (l==(4-frame_parms->Ncp))) { // changed to invoke MBSFN channel estimation in symbols 2,6,10 if ((l==2)||(l==6)||(l==10)) { for (aa=0; aanb_antennas_tx; aa++) { - if (phy_vars_ue->perfect_ce == 0) { + if (ue->perfect_ce == 0) { #ifdef DEBUG_FEP - msg("Channel estimation eNB %d, aatx %d, subframe %d, symbol %d\n",eNB_id,aa,subframe,l); + LOG_D(PHY,"Channel estimation eNB %d, aatx %d, subframe %d, symbol %d\n",eNB_id,aa,subframe,l); #endif - lte_dl_mbsfn_channel_estimation(phy_vars_ue, + lte_dl_mbsfn_channel_estimation(ue, eNB_id, 0, subframe, l); - /* for (i=0;iPHY_measurements.n_adj_cells;i++) { - lte_dl_mbsfn_channel_estimation(phy_vars_ue, + /* for (i=0;iPHY_measurements.n_adj_cells;i++) { + lte_dl_mbsfn_channel_estimation(ue, eNB_id, i+1, subframe, l); - lte_dl_channel_estimation(phy_vars_ue,eNB_id,0, + lte_dl_channel_estimation(ue,eNB_id,0, Ns, aa, l, symbol); - for (i=0;iPHY_measurements.n_adj_cells;i++) { - lte_dl_channel_estimation(phy_vars_ue,eNB_id,i+1, + for (i=0;iPHY_measurements.n_adj_cells;i++) { + lte_dl_channel_estimation(ue,eNB_id,i+1, Ns, aa, l, @@ -185,20 +185,20 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, // do frequency offset estimation here! // use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1}) #ifdef DEBUG_FEP - msg("Frequency offset estimation\n"); + LOG_D(PHY,"Frequency offset estimation\n"); #endif // if ((l == 0) || (l==(4-frame_parms->Ncp))) /* if ((l==2)||(l==6)||(l==10)) - lte_mbsfn_est_freq_offset(ue_common_vars->dl_ch_estimates[0], + lte_mbsfn_est_freq_offset(common_vars->dl_ch_estimates[0], frame_parms, l, - &ue_common_vars->freq_offset); */ + &common_vars->freq_offset); */ } } } #ifdef DEBUG_FEP - msg("slot_fep_mbsfn: done\n"); + LOG_D(PHY,"slot_fep_mbsfn: done\n"); #endif return(0); } diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c index 57f4a6f7ab..1f2963017e 100644 --- a/openair1/PHY/MODULATION/slot_fep_ul.c +++ b/openair1/PHY/MODULATION/slot_fep_ul.c @@ -1,56 +1,54 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" #include "defs.h" //#define DEBUG_FEP -int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, - LTE_eNB_COMMON *eNB_common_vars, +int slot_fep_ul(RU_t *ru, unsigned char l, unsigned char Ns, - unsigned char eNB_id, int no_prefix) { #ifdef DEBUG_FEP char fname[40], vname[40]; #endif unsigned char aa; - unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame - unsigned int nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples); - unsigned int nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0); + RU_COMMON *common=&ru->common; + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + unsigned char symbol = l+((7-fp->Ncp)*(Ns&1)); ///symbol within sub-frame + unsigned int nb_prefix_samples = (no_prefix ? 0 : fp->nb_prefix_samples); + unsigned int nb_prefix_samples0 = (no_prefix ? 0 : fp->nb_prefix_samples0); // unsigned int subframe_offset; unsigned int slot_offset; + void (*dft)(int16_t *,int16_t *, int); - switch (frame_parms->ofdm_symbol_size) { + int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs + unsigned int frame_length_samples = fp->samples_per_tti * 10; + unsigned int rx_offset; + + switch (fp->ofdm_symbol_size) { case 128: dft = dft128; break; @@ -82,14 +80,14 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, if (no_prefix) { // subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1); - slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_tti>>1) * (Ns%2); + slot_offset = fp->ofdm_symbol_size * (fp->symbols_per_tti>>1) * (Ns&1); } else { // subframe_offset = frame_parms->samples_per_tti * (Ns>>1); - slot_offset = (frame_parms->samples_per_tti>>1) * (Ns%2); + slot_offset = (fp->samples_per_tti>>1) * (Ns&1); } - if (l<0 || l>=7-frame_parms->Ncp) { - LOG_E(PHY,"slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp); + if (l<0 || l>=7-fp->Ncp) { + LOG_E(PHY,"slot_fep: l must be between 0 and %d\n",7-fp->Ncp); return(-1); } @@ -102,29 +100,36 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, LOG_D(PHY,"slot_fep: Ns %d offset %d, symbol %d, nb_prefix_samples %d\n",Ns,slot_offset,symbol, nb_prefix_samples); #endif - for (aa=0; aanb_antennas_rx; aa++) { - + for (aa=0; aanb_rx; aa++) { + rx_offset = slot_offset +nb_prefix_samples0; if (l==0) { - - dft( -#ifndef OFDMA_ULSCH - (int16_t *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][slot_offset + - nb_prefix_samples0], -#else - (int16_t *)&eNB_common_vars->rxdata[eNB_id][aa][((frame_parms->samples_per_tti>>1)*Ns) + - nb_prefix_samples0], +#ifdef DEBUG_FEP + LOG_D(PHY,"slot_fep: symbol 0 %d dB\n", + dB_fixed(signal_energy(&common->rxdata_7_5kHz[aa][rx_offset],fp->ofdm_symbol_size))); #endif - (int16_t *)&eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol],1); + dft( (int16_t *)&common->rxdata_7_5kHz[aa][rx_offset], + (int16_t *)&common->rxdataF[aa][fp->ofdm_symbol_size*symbol], + 1 + ); } else { - dft( -#ifndef OFDMA_ULSCH - (short *)&eNB_common_vars->rxdata_7_5kHz[eNB_id][aa][slot_offset + -#else - (short *)&eNB_common_vars->rxdata[eNB_id][aa][((frame_parms->samples_per_tti>>1)*Ns) + -#endif - (frame_parms->ofdm_symbol_size+nb_prefix_samples0+nb_prefix_samples) + - (frame_parms->ofdm_symbol_size+nb_prefix_samples)*(l-1)], - (short*)&eNB_common_vars->rxdataF[eNB_id][aa][frame_parms->ofdm_symbol_size*symbol],1); + + rx_offset += (fp->ofdm_symbol_size+nb_prefix_samples)*l; + // check for 256-bit alignment of input buffer and do DFT directly, else do via intermediate buffer + if( (rx_offset & 15) != 0){ + memcpy((void *)&tmp_dft_in, + (void *)&common->rxdata_7_5kHz[aa][(rx_offset % frame_length_samples)], + fp->ofdm_symbol_size*sizeof(int)); + dft( (short *) tmp_dft_in, + (short*) &common->rxdataF[aa][fp->ofdm_symbol_size*symbol], + 1 + ); + } + else{ + dft( (short *)&common->rxdata_7_5kHz[aa][rx_offset], + (short*)&common->rxdataF[aa][fp->ofdm_symbol_size*symbol], + 1 + ); + } } } diff --git a/openair1/PHY/MODULATION/ul_7_5_kHz.c b/openair1/PHY/MODULATION/ul_7_5_kHz.c old mode 100755 new mode 100644 index 4a50ad395e..80efc70c40 --- a/openair1/PHY/MODULATION/ul_7_5_kHz.c +++ b/openair1/PHY/MODULATION/ul_7_5_kHz.c @@ -1,48 +1,36 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/defs.h" #include "PHY/extern.h" #include "extern.h" #include "kHz_7_5.h" -#include "prach625Hz.h" -#ifdef USER_MODE #include -#else -#include "rtai_math.h" -#endif #include "PHY/sse_intrin.h" short conjugate75[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ; short conjugate75_2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ; short negate[8]__attribute__((aligned(16))) = {-1,-1,-1,-1,-1,-1,-1,-1}; -void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot) +void apply_7_5_kHz(PHY_VARS_UE *ue,int32_t*txdata,uint8_t slot) { @@ -58,7 +46,7 @@ void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot) uint32_t slot_offset; // uint8_t aa; uint32_t i; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; switch (frame_parms->N_RB_UL) { @@ -91,10 +79,8 @@ void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot) break; } - slot_offset = (uint32_t)slot * phy_vars_ue->lte_frame_parms.samples_per_tti/2; - // if ((slot&1)==1) - // slot_offset += (len/4); - len = phy_vars_ue->lte_frame_parms.samples_per_tti/2; + slot_offset = (uint32_t)slot * frame_parms->samples_per_tti/2; + len = frame_parms->samples_per_tti/2; #if defined(__x86_64__) || defined(__i386__) txptr128 = (__m128i *)&txdata[slot_offset]; @@ -149,12 +135,12 @@ void apply_7_5_kHz(PHY_VARS_UE *phy_vars_ue,int32_t*txdata,uint8_t slot) } -void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot) +void remove_7_5_kHz(RU_t *ru,uint8_t slot) { - int32_t **rxdata=phy_vars_eNB->lte_eNB_common_vars.rxdata[0]; - int32_t **rxdata_7_5kHz=phy_vars_eNB->lte_eNB_common_vars.rxdata_7_5kHz[0]; + int32_t **rxdata=ru->common.rxdata; + int32_t **rxdata_7_5kHz=ru->common.rxdata_7_5kHz; uint16_t len; uint32_t *kHz7_5ptr; #if defined(__x86_64__) || defined(__i386__) @@ -168,9 +154,9 @@ void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot) uint32_t slot_offset,slot_offset2; uint8_t aa; uint32_t i; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&ru->frame_parms; - switch (phy_vars_eNB->lte_frame_parms.N_RB_UL) { + switch (frame_parms->N_RB_UL) { case 6: kHz7_5ptr = (frame_parms->Ncp==0) ? (uint32_t*)s6n_kHz_7_5 : (uint32_t*)s6e_kHz_7_5; @@ -202,12 +188,12 @@ void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot) } - slot_offset = (uint32_t)slot * phy_vars_eNB->lte_frame_parms.samples_per_tti/2-phy_vars_eNB->N_TA_offset; - slot_offset2 = (uint32_t)(slot&1) * phy_vars_eNB->lte_frame_parms.samples_per_tti/2; + slot_offset = (uint32_t)slot * frame_parms->samples_per_tti/2-ru->N_TA_offset; + slot_offset2 = (uint32_t)(slot&1) * frame_parms->samples_per_tti/2; - len = phy_vars_eNB->lte_frame_parms.samples_per_tti/2; + len = frame_parms->samples_per_tti/2; - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aanb_rx; aa++) { #if defined(__x86_64__) || defined(__i386__) rxptr128 = (__m128i *)&rxdata[aa][slot_offset]; @@ -270,3 +256,4 @@ void remove_7_5_kHz(PHY_VARS_eNB *phy_vars_eNB,uint8_t slot) } } } + diff --git a/openair1/PHY/MODULATION/vars.h b/openair1/PHY/MODULATION/vars.h index 5fa9b96776..a05999afe1 100644 --- a/openair1/PHY/MODULATION/vars.h +++ b/openair1/PHY/MODULATION/vars.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ mod_sym_t qpsk_table[4]; mod_sym_t qam16_table[16]; mod_sym_t qam64_table[64]; diff --git a/openair1/PHY/Makefile.inc b/openair1/PHY/Makefile.inc index 06f9447488..90094b31f8 100644 --- a/openair1/PHY/Makefile.inc +++ b/openair1/PHY/Makefile.inc @@ -1,11 +1,13 @@ PHY_OBJS = $(TOP_DIR)/PHY/LTE_TRANSPORT/pss.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/sss.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/pilots.o +PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/pilots_ue_spec.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/pilots_mbsfn.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_coding.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_modulation.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_demodulation.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_llr_computation.o +PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_llr_computation_avx2.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/power_control.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_decoding.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_TRANSPORT/dlsch_scrambling.o @@ -40,6 +42,7 @@ PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_sync_time.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_sync_timefreq.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_adjust_sync.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.o +PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_dl_bf_channel_estimation.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_dl_mbsfn_channel_estimation.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_est_freq_offset.o @@ -47,7 +50,7 @@ PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_ue_measurements.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/lte_eNB_measurements.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_ESTIMATION/adjust_gain.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_dl_cell_spec.o -PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_dl_uespec.o +PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_dl_ue_spec.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_gold.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_gold_mbsfn.o PHY_OBJS += $(TOP_DIR)/PHY/LTE_REFSIG/lte_dl_mbsfn.o diff --git a/openair1/PHY/TOOLS/8bit_rxdemux.c b/openair1/PHY/TOOLS/8bit_rxdemux.c index c9406c10ce..030be47b5d 100644 --- a/openair1/PHY/TOOLS/8bit_rxdemux.c +++ b/openair1/PHY/TOOLS/8bit_rxdemux.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/TOOLS/8bit_txmux.c b/openair1/PHY/TOOLS/8bit_txmux.c index b31da10198..b103bc9c5c 100644 --- a/openair1/PHY/TOOLS/8bit_txmux.c +++ b/openair1/PHY/TOOLS/8bit_txmux.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/extern.h" diff --git a/openair1/PHY/TOOLS/COPYING b/openair1/PHY/TOOLS/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/PHY/TOOLS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/PHY/TOOLS/Makefile b/openair1/PHY/TOOLS/Makefile index eee9d78344..59b6a1e03b 100644 --- a/openair1/PHY/TOOLS/Makefile +++ b/openair1/PHY/TOOLS/Makefile @@ -1,14 +1,14 @@ lte_dfts_sse4: lte_dfts.c - gcc -O2 -msse4.1 -g -ggdb -o lte_dfts_sse4 lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS + gcc -O2 -msse4.1 -g -ggdb -o lte_dfts_sse4 lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS lte_dfts_avx2: lte_dfts.c - gcc -O2 -mavx2 -g -ggdb -o lte_dfts_avx2 lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS + gcc -O2 -mavx2 -g -ggdb -o lte_dfts_avx2 lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS lte_dfts_avx2.s: lte_dfts.c - gcc -O2 -mavx2 -S lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS + gcc -O2 -mavx2 -S lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS lte_dfts_sse4.s: lte_dfts.c - gcc -O2 -msse4.1 -S lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS + gcc -O2 -msse4.1 -S lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS dft_cycles_avx2: lte_dfts_avx2 ./lte_dfts_avx2 | egrep cycles diff --git a/openair1/PHY/TOOLS/alaw_lut.h b/openair1/PHY/TOOLS/alaw_lut.h new file mode 100644 index 0000000000..e7b9539e7f --- /dev/null +++ b/openair1/PHY/TOOLS/alaw_lut.h @@ -0,0 +1,46 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file PHY/TOOLS/ALAW/alaw_lut.h +* \brief +* \author S. Sandeep Kumar, Raymond Knopp +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \note +* \warning +*/ + +// Linear to ALaw +// 16 bit signed integer (typecasted as uint16_t) to 8 bit unsigned integer +extern const uint8_t lin2alaw_if4p5[65536]; + +// ALaw to Linear +// 8 bit unsigned integer to 16 bit signed integer (typecasted as uint16_t) +extern const uint16_t alaw2lin_if4p5[256]; + + + +extern const uint8_t lin2alaw_if5[65536]; + +extern const uint16_t alaw2lin_if5[256]; + diff --git a/openair1/PHY/TOOLS/angle.c b/openair1/PHY/TOOLS/angle.c index f2c71ea742..a06640d1cf 100644 --- a/openair1/PHY/TOOLS/angle.c +++ b/openair1/PHY/TOOLS/angle.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /****************************** * file: angle.c * purpose: compute the angle of a 8 bit complex number diff --git a/openair1/PHY/TOOLS/cadd_sv.c b/openair1/PHY/TOOLS/cadd_sv.c index 2fa052f6c9..caa8d1cc04 100644 --- a/openair1/PHY/TOOLS/cadd_sv.c +++ b/openair1/PHY/TOOLS/cadd_sv.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" static __m128i alpha_128 __attribute__ ((aligned(16))); diff --git a/openair1/PHY/TOOLS/cadd_vv.c b/openair1/PHY/TOOLS/cadd_vv.c index 3bc349463e..34808552fc 100644 --- a/openair1/PHY/TOOLS/cadd_vv.c +++ b/openair1/PHY/TOOLS/cadd_vv.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" @@ -176,6 +169,37 @@ int add_cpx_vector32(short *x, return(0); } +int32_t sub_cpx_vector16(int16_t *x, + int16_t *y, + int16_t *z, + uint32_t N) +{ + unsigned int i; // loop counter + + __m128i *x_128; + __m128i *y_128; + __m128i *z_128; + + x_128 = (__m128i *)&x[0]; + y_128 = (__m128i *)&y[0]; + z_128 = (__m128i *)&z[0]; + + for(i=0; i<(N>>3); i++) { + z_128[0] = _mm_subs_epi16(x_128[0],y_128[0]); + + x_128++; + y_128++; + z_128++; + + } + + _mm_empty(); + _m_empty(); + return(0); +} + + + int add_real_vector64(short *x, short* y, short *z, diff --git a/openair1/PHY/TOOLS/cdot_prod.c b/openair1/PHY/TOOLS/cdot_prod.c index e6ff476303..91ba246bdd 100644 --- a/openair1/PHY/TOOLS/cdot_prod.c +++ b/openair1/PHY/TOOLS/cdot_prod.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" #include "PHY/sse_intrin.h" @@ -114,10 +107,10 @@ int32_t dot_product(int16_t *x, // print_shorts("mmtmp7",&mmtmp7); // convert back to integer result = _mm_cvtsi64_si32(mmtmp7); - + _mm_empty(); _m_empty(); - + return(result); #elif defined(__arm__) diff --git a/openair1/PHY/TOOLS/cmult_sv.c b/openair1/PHY/TOOLS/cmult_sv.c index 31ad77be82..61970ca2b6 100644 --- a/openair1/PHY/TOOLS/cmult_sv.c +++ b/openair1/PHY/TOOLS/cmult_sv.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/sse_intrin.h" #include "defs.h" @@ -66,18 +59,23 @@ void multadd_complex_vector_real_scalar(int16_t *x, if (zero_flag == 1) for (n=0; n>2; n++) { + // print_shorts("x_128[n]=", &x_128[n]); + // print_shorts("alpha_128", &alpha_128); y_128[n] = mulhi_int16(x_128[n],alpha_128); + // print_shorts("y_128[n]=", &y_128[n]); } else for (n=0; n>2; n++) { y_128[n] = adds_int16(y_128[n],mulhi_int16(x_128[n],alpha_128)); } - + _mm_empty(); _m_empty(); } + + void multadd_real_vector_complex_scalar(int16_t *x, int16_t *alpha, int16_t *y, @@ -387,6 +385,7 @@ int rotate_cpx_vector(int16_t *x, m3 = _mm_sra_epi32(m3,shift); // shift right by shift in order to compensate for the input amplitude y_128[0] = _mm_packs_epi32(m2,m3); // pack in 16bit integers with saturation [re im re im re im re im] + //print_ints("y_128[0]=", &y_128[0]); #elif defined(__arm__) ab_re0 = vmull_s16(((int16x4_t*)xd)[0],((int16x4_t*)&bconj)[0]); diff --git a/openair1/PHY/TOOLS/cmult_vv.c b/openair1/PHY/TOOLS/cmult_vv.c old mode 100755 new mode 100644 index f970d33224..13facf6907 --- a/openair1/PHY/TOOLS/cmult_vv.c +++ b/openair1/PHY/TOOLS/cmult_vv.c @@ -1,41 +1,35 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" -//#include "MAC_INTERFACE/extern.h" -#ifdef USER_MODE #include -#endif #if defined(__x86_64__) || defined(__i386__) int16_t conjug[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ; +int16_t conjug2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1} ; + #define simd_q15_t __m128i #define simdshort_q15_t __m64 +#define set1_int16(a) _mm_set1_epi16(a) +#define setr_int16(a0, a1, a2, a3, a4, a5, a6, a7) _mm_setr_epi16(a0, a1, a2, a3, a4, a5, a6, a7 ) #elif defined(__arm__) int16_t conjug[4]__attribute__((aligned(16))) = {-1,1,-1,1} ; #define simd_q15_t int16x8_t @@ -48,9 +42,10 @@ int mult_cpx_conj_vector(int16_t *x1, int16_t *x2, int16_t *y, uint32_t N, - int output_shift) + int output_shift, + int madd) { - // Multiply elementwise the complex conjugate of x1 with x2. + // Multiply elementwise the complex conjugate of x1 with x2. // x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| // We assume x1 with a dinamic of 15 bit maximum // @@ -62,6 +57,8 @@ int mult_cpx_conj_vector(int16_t *x1, // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; // // output_shift - shift to be applied to generate output + // + // madd - add the output to y uint32_t i; // loop counter @@ -71,11 +68,12 @@ int mult_cpx_conj_vector(int16_t *x1, #if defined(__x86_64__) || defined(__i386__) simd_q15_t tmp_re,tmp_im; simd_q15_t tmpy0,tmpy1; + #elif defined(__arm__) int32x4_t tmp_re,tmp_im; int32x4_t tmp_re1,tmp_im1; - int16x4x2_t tmpy; - int32x4_t shift = vdupq_n_s32(-output_shift); + int16x4x2_t tmpy; + int32x4_t shift = vdupq_n_s32(-output_shift); #endif x1_128 = (simd_q15_t *)&x1[0]; @@ -85,7 +83,7 @@ int mult_cpx_conj_vector(int16_t *x1, // we compute 4 cpx multiply for each loop for(i=0; i<(N>>2); i++) { - #if defined(__x86_64__) || defined(__i386__) +#if defined(__x86_64__) || defined(__i386__) tmp_re = _mm_madd_epi16(*x1_128,*x2_128); tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1)); tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1)); @@ -95,16 +93,20 @@ int mult_cpx_conj_vector(int16_t *x1, tmp_im = _mm_srai_epi32(tmp_im,output_shift); tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im); tmpy1 = _mm_unpackhi_epi32(tmp_re,tmp_im); - *y_128 = _mm_packs_epi32(tmpy0,tmpy1); + if (madd==0) + *y_128 = _mm_packs_epi32(tmpy0,tmpy1); + else + *y_128 += _mm_packs_epi32(tmpy0,tmpy1); + #elif defined(__arm__) tmp_re = vmull_s16(((simdshort_q15_t *)x1_128)[0], ((simdshort_q15_t*)x2_128)[0]); - //tmp_re = [Re(x1[0])Re(x2[0]) Im(x1[0])Im(x2[0]) Re(x1[1])Re(x2[1]) Im(x1[1])Im(x2[1])] + //tmp_re = [Re(x1[0])Re(x2[0]) Im(x1[0])Im(x2[0]) Re(x1[1])Re(x2[1]) Im(x1[1])Im(x2[1])] tmp_re1 = vmull_s16(((simdshort_q15_t *)x1_128)[1], ((simdshort_q15_t*)x2_128)[1]); - //tmp_re1 = [Re(x1[1])Re(x2[1]) Im(x1[1])Im(x2[1]) Re(x1[1])Re(x2[2]) Im(x1[1])Im(x2[2])] + //tmp_re1 = [Re(x1[1])Re(x2[1]) Im(x1[1])Im(x2[1]) Re(x1[1])Re(x2[2]) Im(x1[1])Im(x2[2])] tmp_re = vcombine_s32(vpadd_s32(vget_low_s32(tmp_re),vget_high_s32(tmp_re)), vpadd_s32(vget_low_s32(tmp_re1),vget_high_s32(tmp_re1))); - //tmp_re = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2]) Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] + //tmp_re = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2]) Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])] tmp_im = vmull_s16(vrev32_s16(vmul_s16(((simdshort_q15_t*)x2_128)[0],*(simdshort_q15_t*)conjug)), ((simdshort_q15_t*)x1_128)[0]); //tmp_im = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])] @@ -117,7 +119,10 @@ int mult_cpx_conj_vector(int16_t *x1, tmp_re = vqshlq_s32(tmp_re,shift); tmp_im = vqshlq_s32(tmp_im,shift); tmpy = vzip_s16(vmovn_s32(tmp_re),vmovn_s32(tmp_im)); - *y_128 = vcombine_s16(tmpy.val[0],tmpy.val[1]); + if (madd==0) + *y_128 = vcombine_s16(tmpy.val[0],tmpy.val[1]); + else + *y_128 += vcombine_s16(tmpy.val[0],tmpy.val[1]); #endif x1_128++; x2_128++; @@ -131,3 +136,132 @@ int mult_cpx_conj_vector(int16_t *x1, return(0); } +int mult_cpx_vector(int16_t *x1, //Q15 + int16_t *x2,//Q13 + int16_t *y, + uint32_t N, + int output_shift) +{ + // Multiply elementwise x1 with x2. + // x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + // We assume x1 with a dinamic of 15 bit maximum + // + // x2 - input 2 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + // We assume x2 with a dinamic of 14 bit maximum + /// + // y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + // + // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; + // + // output_shift - shift to be applied to generate output + uint32_t i; // loop counter + simd_q15_t *x1_128; + simd_q15_t *x2_128; + simd_q15_t *y_128; + simd_q15_t tmp_re,tmp_im; + simd_q15_t tmpy0,tmpy1; + x1_128 = (simd_q15_t *)&x1[0]; + x2_128 = (simd_q15_t *)&x2[0]; + y_128 = (simd_q15_t *)&y[0]; + //print_shorts("x1_128:",&x1_128[0]); + // print_shorts("x2_128:",&x2_128[0]); + + //right shift by 13 while p_a * x0 and 15 while + // we compute 4 cpx multiply for each loop + for(i=0; i<(N>>2); i++) { + tmp_re = _mm_sign_epi16(*x1_128,*(__m128i*)&conjug2[0]);// Q15 + //print_shorts("tmp_re1:",&tmp_re[i]); + tmp_re = _mm_madd_epi16(tmp_re,*x2_128); //Q28 + //print_ints("tmp_re2:",&tmp_re[i]); + tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1)); //Q15 + //print_shorts("tmp_im1:",&tmp_im[i]); + tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1)); //Q15 + //print_shorts("tmp_im2:",&tmp_im[i]); + tmp_im = _mm_madd_epi16(tmp_im, *x2_128); //Q28 + //print_ints("tmp_im3:",&tmp_im[i]); + tmp_re = _mm_srai_epi32(tmp_re,output_shift);//Q(28-shift) + //print_ints("tmp_re shifted:",&tmp_re[i]); + tmp_im = _mm_srai_epi32(tmp_im,output_shift); //Q(28-shift) + //print_ints("tmp_im shifted:",&tmp_im[i]); + tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im); //Q(28-shift) + //print_ints("unpack lo :",&tmpy0[i]); + tmpy1 = _mm_unpackhi_epi32(tmp_re,tmp_im); //Q(28-shift) + //print_ints("mrc rho0:",&tmpy1[i]); + *y_128 = _mm_packs_epi32(tmpy0,tmpy1); //must be Q15 + //print_shorts("*y_128:",&y_128[i]); + x1_128++; + x2_128++; + y_128++; + } + _mm_empty(); + _m_empty(); + return(0); +} + +int multadd_cpx_vector(int16_t *x1, + int16_t *x2, + int16_t *y, + uint8_t zero_flag, + uint32_t N, + int output_shift) +{ + // Multiply elementwise the complex conjugate of x1 with x2. + // x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + // We assume x1 with a dinamic of 15 bit maximum + // + // x2 - input 2 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + // We assume x2 with a dinamic of 14 bit maximum + /// + // y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + // + // zero_flag - Set output (y) to zero prior to disable accumulation + // + // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; + // + // output_shift - shift to be applied to generate output + uint32_t i; // loop counter + simd_q15_t *x1_128; + simd_q15_t *x2_128; + simd_q15_t *y_128; +#if defined(__x86_64__) || defined(__i386__) + simd_q15_t tmp_re,tmp_im; + simd_q15_t tmpy0,tmpy1; +#elif defined(__arm__) + int32x4_t tmp_re,tmp_im; + int32x4_t tmp_re1,tmp_im1; + int16x4x2_t tmpy; + int32x4_t shift = vdupq_n_s32(-output_shift); +#endif + x1_128 = (simd_q15_t *)&x1[0]; + x2_128 = (simd_q15_t *)&x2[0]; + y_128 = (simd_q15_t *)&y[0]; + // we compute 4 cpx multiply for each loop + for(i=0; i<(N>>2); i++) { +#if defined(__x86_64__) || defined(__i386__) + tmp_re = _mm_sign_epi16(*x1_128,*(__m128i*)&conjug2[0]); + tmp_re = _mm_madd_epi16(tmp_re,*x2_128); + tmp_im = _mm_shufflelo_epi16(*x1_128,_MM_SHUFFLE(2,3,0,1)); + tmp_im = _mm_shufflehi_epi16(tmp_im,_MM_SHUFFLE(2,3,0,1)); + tmp_im = _mm_madd_epi16(tmp_im,*x2_128); + tmp_re = _mm_srai_epi32(tmp_re,output_shift); + tmp_im = _mm_srai_epi32(tmp_im,output_shift); + tmpy0 = _mm_unpacklo_epi32(tmp_re,tmp_im); + //print_ints("unpack lo:",&tmpy0[i]); + tmpy1 = _mm_unpackhi_epi32(tmp_re,tmp_im); + //print_ints("unpack hi:",&tmpy1[i]); + if (zero_flag == 1) + *y_128 = _mm_packs_epi32(tmpy0,tmpy1); + else + *y_128 = _mm_adds_epi16(*y_128,_mm_packs_epi32(tmpy0,tmpy1)); + //print_shorts("*y_128:",&y_128[i]); +#elif defined(__arm__) + msg("mult_cpx_vector not implemented for __arm__"); +#endif + x1_128++; + x2_128++; + y_128++; + } + _mm_empty(); + _m_empty(); + return(0); +} diff --git a/openair1/PHY/TOOLS/costable.h b/openair1/PHY/TOOLS/costable.h index 86627a4707..b9d24c75b4 100644 --- a/openair1/PHY/TOOLS/costable.h +++ b/openair1/PHY/TOOLS/costable.h @@ -1,29 +1,22 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ unsigned int acostable[256] = {16384,16343,16302,16261,16220,16179,16139,16098,16057,16016,15975,15934,15893,15852,15811,15770,15729,15688,15647,15606,15565,15524,15483,15442,15401,15360,15319,15278,15236,15195,15154,15113,15072,15030,14989,14948,14907,14865,14824,14782,14741,14700,14658,14617,14575,14534,14492,14450,14409,14367,14325,14284,14242,14200,14158,14116,14075,14033,13991,13949,13907,13864,13822,13780,13738,13696,13653,13611,13568,13526,13484,13441,13398,13356,13313,13270,13227,13184,13142,13099,13056,13012,12969,12926,12883,12839,12796,12752,12709,12665,12622,12578,12534,12490,12446,12402,12358,12314,12270,12225,12181,12136,12092,12047,12002,11957,11913,11868,11822,11777,11732,11687,11641,11595,11550,11504,11458,11412,11366,11320,11274,11227,11181,11134,11087,11040,10993,10946,10899,10852,10804,10757,10709,10661,10613,10565,10517,10468,10420,10371,10322,10273,10224,10174,10125,10075,10026,9976,9925,9875,9825,9774,9723,9672,9621,9569,9518,9466,9414,9362,9309,9257,9204,9151,9097,9044,8990,8936,8882,8827,8773,8718,8662,8607,8551,8495,8439,8382,8325,8268,8210,8152,8094,8035,7976,7917,7858,7798,7737,7676,7615,7554,7492,7430,7367,7303,7240,7176,7111,7046,6980,6914,6847,6780,6712,6643,6574,6505,6434,6363,6292,6219,6146,6072,5997,5921,5845,5767,5689,5610,5529,5448,5365,5282,5197,5110,5023,4934,4843,4751,4657,4562,4464,4364,4263,4159,4052,3942,3830,3715,3595,3472,3345,3213,3075,2931,2779,2620,2450,2267,2069,1850,1602,1307,924,0}; diff --git a/openair1/PHY/TOOLS/dB_routines.c b/openair1/PHY/TOOLS/dB_routines.c old mode 100755 new mode 100644 index ae792c4dd6..c99703eaf3 --- a/openair1/PHY/TOOLS/dB_routines.c +++ b/openair1/PHY/TOOLS/dB_routines.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" // Approximate 10*log10(x) in fixed point : x = 0...(2^32)-1 diff --git a/openair1/PHY/TOOLS/dB_routines.h b/openair1/PHY/TOOLS/dB_routines.h index 36040dc28a..c28184259f 100644 --- a/openair1/PHY/TOOLS/dB_routines.h +++ b/openair1/PHY/TOOLS/dB_routines.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* * dB_routines.h * diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h index 8d30a7ea10..b92c2a4236 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __PHY_TOOLS_DEFS__H__ #define __PHY_TOOLS_DEFS__H__ @@ -41,13 +34,10 @@ #include "PHY/sse_intrin.h" -//defined in rtai_math.h -#ifndef _RTAI_MATH_H struct complex { double x; double y; }; -#endif struct complexf { float r; @@ -123,13 +113,40 @@ int rotate_cpx_vector(int16_t *x, @param y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| @param N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; @param output_shift - shift to be applied to generate output + @param madd - if not zero result is added to output */ int mult_cpx_conj_vector(int16_t *x1, int16_t *x2, int16_t *y, uint32_t N, - int output_shift); + int output_shift, + int madd); + +/*! + Element-wise multiplication and accumulation of two complex vectors x1 and x2. + @param x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + We assume x1 with a dinamic of 15 bit maximum + @param x2 - input 2 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + We assume x2 with a dinamic of 14 bit maximum + @param y - output in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| + @param zero_flag Set output (y) to zero prior to accumulation + @param N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; + @param output_shift - shift to be applied to generate output +*/ + +int multadd_cpx_vector(int16_t *x1, + int16_t *x2, + int16_t *y, + uint8_t zero_flag, + uint32_t N, + int output_shift); + +int mult_cpx_vector(int16_t *x1, + int16_t *x2, + int16_t *y, + uint32_t N, + int output_shift); // lte_dfts.c void init_fft(uint16_t size, @@ -214,6 +231,11 @@ int32_t add_cpx_vector(int16_t *x, int16_t *y, uint32_t N); +int32_t sub_cpx_vector16(int16_t *x, + int16_t *y, + int16_t *z, + uint32_t N); + int32_t add_cpx_vector32(int16_t *x, int16_t *y, int16_t *z, @@ -261,7 +283,6 @@ void bit8_txmux(int32_t length,int32_t offset); void bit8_rxdemux(int32_t length,int32_t offset); -#ifdef USER_MODE /*!\fn int32_t write_output(const char *fname, const char *vname, void *data, int length, int dec, char format); \brief Write output file from signal data @param fname output file name @@ -272,7 +293,6 @@ void bit8_rxdemux(int32_t length,int32_t offset); @param format data format (0 = real 16-bit, 1 = complex 16-bit,2 real 32-bit, 3 complex 32-bit,4 = real 8-bit, 5 = complex 8-bit) */ int32_t write_output(const char *fname, const char *vname, void *data, int length, int dec, char format); -#endif void Zero_Buffer(void *,uint32_t); void Zero_Buffer_nommx(void *buf,uint32_t length); @@ -296,10 +316,10 @@ int32_t subcarrier_energy(int32_t *,uint32_t, int32_t* subcarrier_energy, uint16 */ int32_t signal_energy_nodc(int32_t *,uint32_t); -/*!\fn double signal_energy_fp(double **, double **,uint32_t, uint32_t,uint32_t); +/*!\fn double signal_energy_fp(double *s_re[2], double *s_im[2],uint32_t, uint32_t,uint32_t); \brief Computes the signal energy per subcarrier */ -double signal_energy_fp(double **s_re, double **s_im, uint32_t nb_antennas, uint32_t length,uint32_t offset); +double signal_energy_fp(double *s_re[2], double *s_im[2], uint32_t nb_antennas, uint32_t length,uint32_t offset); /*!\fn double signal_energy_fp2(struct complex *, uint32_t); \brief Computes the signal energy per subcarrier @@ -313,6 +333,9 @@ uint8_t log2_approx64(unsigned long long int x); int16_t invSqrt(int16_t x); uint32_t angle(struct complex16 perrror); +/// computes the number of factors 2 in x +unsigned char factor2(unsigned int x); + /*!\fn int32_t phy_phase_compensation_top (uint32_t pilot_type, uint32_t initial_pilot, uint32_t last_pilot, int32_t ignore_prefix); Compensate the phase rotation of the RF. WARNING: This function is currently unused. It has not been tested! @@ -333,17 +356,6 @@ int16_t dB_fixed_times10(uint32_t x); int32_t phy_phase_compensation_top (uint32_t pilot_type, uint32_t initial_pilot, uint32_t last_pilot, int32_t ignore_prefix); -/*!\fn void phy_phase_compensation (int16_t *ref_sch, int16_t *tgt_sch, int16_t *out_sym, int32_t ignore_prefix, int32_t aa, struct complex16 *perror_out); -This function is used by the EMOS to compensate the phase rotation of the RF. It has been designed for symbols of type CHSCH or SCH, but cannot be used for the data channels. -@param ref_sch reference symbol -@param tgt_sch target symbol -@param out_sym output of the operation -@param ignore_prefix set to 1 if cyclic prefix has not been removed (by the hardware) -@param aa antenna index -@param perror_out phase error (output parameter) -*/ -void phy_phase_compensation (int16_t *ref_sch, int16_t *tgt_sch, int16_t *out_sym, int32_t ignore_prefix, int32_t aa, struct complex16 *perror_out ); - int32_t dot_product(int16_t *x, int16_t *y, uint32_t N, //must be a multiple of 8 diff --git a/openair1/PHY/TOOLS/extern.h b/openair1/PHY/TOOLS/extern.h index 5c046434e6..4690bba42e 100644 --- a/openair1/PHY/TOOLS/extern.h +++ b/openair1/PHY/TOOLS/extern.h @@ -1,28 +1,21 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ \ No newline at end of file diff --git a/openair1/PHY/TOOLS/file_output.c b/openair1/PHY/TOOLS/file_output.c old mode 100755 new mode 100644 index e3a92696fe..1e0b31a47f --- a/openair1/PHY/TOOLS/file_output.c +++ b/openair1/PHY/TOOLS/file_output.c @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifdef USER_MODE +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -43,9 +34,9 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d printf("Writing %d elements of type %d to %s\n",length,format,fname); - if (format == 10 || format ==11 || format == 12 ) { + if (format == 10 || format ==11 || format == 12 || format == 13 || format == 14) { fp = fopen(fname,"a+"); - } else if (format != 10 && format !=11 && format != 12 ) { + } else if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14) { fp = fopen(fname,"w+"); } @@ -56,7 +47,7 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d return(-1); } - if (format != 10 && format !=11 && format != 12 ) + if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14) fprintf(fp,"%s = [",vname); @@ -70,7 +61,9 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d break; case 1: // complex 16-bit - + case 13: + case 14: + case 15: for (i=0; i. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ static short lookup_table[1025] = {0x7fff, 0x16a0, 0x1000, 0xd10, 0xb50, 0xa1e, 0x93c, 0x88d, 0x800, 0x78a, 0x727, 0x6d2, 0x688, 0x646, 0x60c, 0x5d7, 0x5a8, 0x57c, 0x555, 0x530, 0x50f, 0x4f0, 0x4d2, 0x4b7, 0x49e, 0x486, 0x470, 0x45a, 0x446, 0x433, 0x421, 0x410, 0x400, 0x3f0, 0x3e1, 0x3d3, 0x3c5, 0x3b8, 0x3ab, 0x39f, 0x393, 0x388, 0x37d, 0x373, 0x369, 0x35f, 0x356, 0x34c, 0x344, 0x33b, 0x333, 0x32b, 0x323, 0x31b, 0x314, 0x30d, 0x306, 0x2ff, 0x2f8, 0x2f2, 0x2eb, 0x2e5, 0x2df, 0x2d9, 0x2d4, 0x2ce, 0x2c9, 0x2c3, 0x2be, 0x2b9, 0x2b4, 0x2af, 0x2aa, 0x2a5, 0x2a1, 0x29c, 0x298, 0x294, 0x28f, 0x28b, 0x287, 0x283, 0x27f, 0x27b, 0x278, 0x274, 0x270, 0x26d, 0x269, 0x266, 0x262, 0x25f, 0x25b, 0x258, 0x255, 0x252, 0x24f, 0x24c, 0x249, 0x246, 0x243, 0x240, 0x23d, 0x23a, 0x238, 0x235, 0x232, 0x22f, 0x22d, 0x22a, 0x228, 0x225, 0x223, 0x220, 0x21e, 0x21c, 0x219, 0x217, 0x215, 0x213, 0x210, 0x20e, 0x20c, 0x20a, 0x208, 0x206, 0x204, 0x202, 0x200, 0x1fe, 0x1fc, 0x1fa, 0x1f8, 0x1f6, 0x1f4, 0x1f2, 0x1f0, 0x1ee, 0x1ed, 0x1eb, 0x1e9, 0x1e7, 0x1e6, 0x1e4, 0x1e2, 0x1e1, 0x1df, 0x1dd, 0x1dc, 0x1da, 0x1d8, 0x1d7, 0x1d5, 0x1d4, 0x1d2, 0x1d1, 0x1cf, 0x1ce, 0x1cc, 0x1cb, 0x1c9, 0x1c8, 0x1c7, 0x1c5, 0x1c4, 0x1c2, 0x1c1, 0x1c0, 0x1be, 0x1bd, 0x1bc, 0x1ba, 0x1b9, 0x1b8, 0x1b7, 0x1b5, 0x1b4, 0x1b3, 0x1b2, 0x1b0, 0x1af, 0x1ae, 0x1ad, 0x1ac, 0x1ab, 0x1a9, 0x1a8, 0x1a7, 0x1a6, 0x1a5, 0x1a4, 0x1a3, 0x1a2, 0x1a0, 0x19f, 0x19e, 0x19d, 0x19c, 0x19b, 0x19a, 0x199, 0x198, 0x197, 0x196, 0x195, 0x194, 0x193, 0x192, 0x191, 0x190, 0x18f, 0x18e, 0x18d, 0x18c, 0x18b, 0x18b, 0x18a, 0x189, 0x188, 0x187, 0x186, 0x185, 0x184, 0x183, 0x183, 0x182, 0x181, 0x180, 0x17f, 0x17e, 0x17d, 0x17d, 0x17c, 0x17b, 0x17a, 0x179, 0x179, 0x178, 0x177, 0x176, 0x175, 0x175, 0x174, 0x173, 0x172, 0x172, 0x171, 0x170, 0x16f, 0x16f, 0x16e, 0x16d, 0x16c, 0x16c, 0x16b, 0x16a, 0x16a, 0x169, 0x168, 0x167, 0x167, 0x166, 0x165, 0x165, 0x164, 0x163, 0x163, 0x162, 0x161, 0x161, 0x160, 0x15f, 0x15f, 0x15e, 0x15d, 0x15d, 0x15c, 0x15c, 0x15b, 0x15a, 0x15a, 0x159, 0x158, 0x158, 0x157, 0x157, 0x156, 0x155, 0x155, 0x154, 0x154, 0x153, 0x152, 0x152, 0x151, 0x151, 0x150, 0x150, 0x14f, 0x14e, 0x14e, 0x14d, 0x14d, 0x14c, 0x14c, 0x14b, 0x14b, 0x14a, 0x14a, 0x149, 0x148, 0x148, 0x147, 0x147, 0x146, 0x146, 0x145, 0x145, 0x144, 0x144, 0x143, 0x143, 0x142, 0x142, 0x141, 0x141, 0x140, 0x140, 0x13f, 0x13f, 0x13e, 0x13e, 0x13d, 0x13d, 0x13c, 0x13c, 0x13c, 0x13b, 0x13b, 0x13a, 0x13a, 0x139, 0x139, 0x138, 0x138, 0x137, 0x137, 0x136, 0x136, 0x136, 0x135, 0x135, 0x134, 0x134, 0x133, 0x133, 0x133, 0x132, 0x132, 0x131, 0x131, 0x130, 0x130, 0x130, 0x12f, 0x12f, 0x12e, 0x12e, 0x12d, 0x12d, 0x12d, 0x12c, 0x12c, 0x12b, 0x12b, 0x12b, 0x12a, 0x12a, 0x129, 0x129, 0x129, 0x128, 0x128, 0x127, 0x127, 0x127, 0x126, 0x126, 0x126, 0x125, 0x125, 0x124, 0x124, 0x124, 0x123, 0x123, 0x123, 0x122, 0x122, 0x121, 0x121, 0x121, 0x120, 0x120, 0x120, 0x11f, 0x11f, 0x11f, 0x11e, 0x11e, 0x11e, 0x11d, 0x11d, 0x11d, 0x11c, 0x11c, 0x11c, 0x11b, 0x11b, 0x11a, 0x11a, 0x11a, 0x119, 0x119, 0x119, 0x118, 0x118, 0x118, 0x117, 0x117, 0x117, 0x117, 0x116, 0x116, 0x116, 0x115, 0x115, 0x115, 0x114, 0x114, 0x114, 0x113, 0x113, 0x113, 0x112, 0x112, 0x112, 0x111, 0x111, 0x111, 0x111, 0x110, 0x110, 0x110, 0x10f, 0x10f, 0x10f, 0x10e, 0x10e, 0x10e, 0x10e, 0x10d, 0x10d, 0x10d, 0x10c, 0x10c, 0x10c, 0x10c, 0x10b, 0x10b, 0x10b, 0x10a, 0x10a, 0x10a, 0x10a, 0x109, 0x109, 0x109, 0x108, 0x108, 0x108, 0x108, 0x107, 0x107, 0x107, 0x107, 0x106, 0x106, 0x106, 0x105, 0x105, 0x105, 0x105, 0x104, 0x104, 0x104, 0x104, 0x103, 0x103, 0x103, 0x103, 0x102, 0x102, 0x102, 0x102, 0x101, 0x101, 0x101, 0x101, 0x100, 0x100, 0x100, 0x100, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfb, 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xfa, 0xfa, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf7, 0xf7, 0xf7, 0xf7, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf4, 0xf4, 0xf4, 0xf4, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf2, 0xf2, 0xf2, 0xf2, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xef, 0xef, 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0xed, 0xed, 0xed, 0xed, 0xec, 0xec, 0xec, 0xec, 0xec, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xea, 0xea, 0xea, 0xea, 0xea, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe1, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xce, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc9, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc5, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc1, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5}; short invSqrt(short x) diff --git a/openair1/PHY/TOOLS/log2_approx.c b/openair1/PHY/TOOLS/log2_approx.c index bfff65cb03..acd1534857 100644 --- a/openair1/PHY/TOOLS/log2_approx.c +++ b/openair1/PHY/TOOLS/log2_approx.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ unsigned char log2_approx(unsigned int x) { @@ -44,6 +37,26 @@ unsigned char log2_approx(unsigned int x) return(l2); } +unsigned char factor2(unsigned int x) +{ + + int i; + unsigned char l2; + + l2=0; + + for (i=0; i<31; i++) + if ((x&(1<. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifdef USER_MODE #include #include #include -#endif #include @@ -58,10 +49,10 @@ #define print_ints(s,x) printf("%s %d %d %d %d\n",s,(x)[0],(x)[1],(x)[2],(x)[3]) -static int16_t conjugatedft[32] __attribute__((aligned(32))) = {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1}; +const static int16_t conjugatedft[32] __attribute__((aligned(32))) = {-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1}; -static int16_t reflip[32] __attribute__((aligned(32))) = {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1}; +const static int16_t reflip[32] __attribute__((aligned(32))) = {1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1}; #if defined(__x86_64__) || defined(__i386__) static inline void cmac(__m128i a,__m128i b, __m128i *re32, __m128i *im32) __attribute__((always_inline)); @@ -474,33 +465,33 @@ static inline int16x8_t packed_cmult2(int16x8_t a,int16x8_t b, int16x8_t b2) #endif -static int16_t W0s[16]__attribute__((aligned(32))) = {32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0}; +const static int16_t W0s[16]__attribute__((aligned(32))) = {32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0,32767,0}; -static int16_t W13s[16]__attribute__((aligned(32))) = {-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378}; -static int16_t W23s[16]__attribute__((aligned(32))) = {-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378}; +const static int16_t W13s[16]__attribute__((aligned(32))) = {-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378,-16384,-28378}; +const static int16_t W23s[16]__attribute__((aligned(32))) = {-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378,-16384,28378}; -static int16_t W15s[16]__attribute__((aligned(32))) = {10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163}; -static int16_t W25s[16]__attribute__((aligned(32))) = {-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260}; -static int16_t W35s[16]__attribute__((aligned(32))) = {-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260}; -static int16_t W45s[16]__attribute__((aligned(32))) = {10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163}; +const static int16_t W15s[16]__attribute__((aligned(32))) = {10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163,10126,-31163}; +const static int16_t W25s[16]__attribute__((aligned(32))) = {-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260,-26509,-19260}; +const static int16_t W35s[16]__attribute__((aligned(32))) = {-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260,-26510,19260}; +const static int16_t W45s[16]__attribute__((aligned(32))) = {10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163,10126,31163}; #if defined(__x86_64__) || defined(__i386__) -__m128i *W0 = (__m128i *)W0s; -__m128i *W13 = (__m128i *)W13s; -__m128i *W23 = (__m128i *)W23s; -__m128i *W15 = (__m128i *)W15s; -__m128i *W25 = (__m128i *)W25s; -__m128i *W35 = (__m128i *)W35s; -__m128i *W45 = (__m128i *)W45s; +const __m128i *W0 = (__m128i *)W0s; +const __m128i *W13 = (__m128i *)W13s; +const __m128i *W23 = (__m128i *)W23s; +const __m128i *W15 = (__m128i *)W15s; +const __m128i *W25 = (__m128i *)W25s; +const __m128i *W35 = (__m128i *)W35s; +const __m128i *W45 = (__m128i *)W45s; #ifdef __AVX2__ -__m256i *W0_256 = (__m256i *)W0s; -__m256i *W13_256 = (__m256i *)W13s; -__m256i *W23_256 = (__m256i *)W23s; -__m256i *W15_256 = (__m256i *)W15s; -__m256i *W25_256 = (__m256i *)W25s; -__m256i *W35_256 = (__m256i *)W35s; -__m256i *W45_256 = (__m256i *)W45s; +const __m256i *W0_256 = (__m256i *)W0s; +const __m256i *W13_256 = (__m256i *)W13s; +const __m256i *W23_256 = (__m256i *)W23s; +const __m256i *W15_256 = (__m256i *)W15s; +const __m256i *W25_256 = (__m256i *)W25s; +const __m256i *W35_256 = (__m256i *)W35s; +const __m256i *W45_256 = (__m256i *)W45s; #endif #elif defined(__arm__) @@ -512,23 +503,23 @@ int16x8_t *W25 = (int16x8_t *)W25s; int16x8_t *W35 = (int16x8_t *)W35s; int16x8_t *W45 = (int16x8_t *)W45s; #endif -static int16_t dft_norm_table[16] = {9459, //12 - 6689,//24 - 5461,//36 - 4729,//482 - 4230,//60 - 23170,//72 - 3344,//96 - 3153,//108 - 2991,//120 - 18918,//sqrt(3),//144 - 18918,//sqrt(3),//180 - 16384,//2, //192 - 18918,//sqrt(3), // 216 - 16384,//2, //240 - 18918,//sqrt(3), // 288 - 14654 - }; //sqrt(5) //300 +const static int16_t dft_norm_table[16] = {9459, //12 + 6689,//24 + 5461,//36 + 4729,//482 + 4230,//60 + 23170,//72 + 3344,//96 + 3153,//108 + 2991,//120 + 18918,//sqrt(3),//144 + 18918,//sqrt(3),//180 + 16384,//2, //192 + 18918,//sqrt(3), // 216 + 16384,//2, //240 + 18918,//sqrt(3), // 288 + 14654 +}; //sqrt(5) //300 #if defined(__x86_64__) || defined(__i386__) @@ -2036,42 +2027,42 @@ static inline void transpose4_ooff(int16x4_t *x,int16x4_t *y,int off) // 16-point optimized DFT kernel -int16_t tw16[24] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273, +const static int16_t tw16[24] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273, 32767,0,23169,-23170,0 ,-32767,-23170,-23170, 32767,0,12539,-30273,-23170,-23170,-30273,12539 }; -int16_t tw16a[24] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273, +const static int16_t tw16a[24] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273, 32767,0,23169,23170,0 ,32767,-23170,23170, 32767,0,12539,30273,-23170,23170,-30273,-12539 }; -int16_t tw16b[24] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539, +const static int16_t tw16b[24] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539, 0,32767,-23170,23169,-32767,0 ,-23170,-23170, 0,32767,-30273,12539,-23170,-23170,12539 ,-30273 }; -int16_t tw16c[24] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539, +const static int16_t tw16c[24] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539, 0,32767,23170,23169,32767,0 ,23170 ,-23170, 0,32767,30273,12539,23170,-23170,-12539,-30273 }; -int16_t tw16rep[48] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273,32767,0,30272,-12540,23169 ,-23170,12539 ,-30273, +const static int16_t tw16rep[48] __attribute__((aligned(32))) = { 32767,0,30272,-12540,23169 ,-23170,12539 ,-30273,32767,0,30272,-12540,23169 ,-23170,12539 ,-30273, 32767,0,23169,-23170,0 ,-32767,-23170,-23170,32767,0,23169,-23170,0 ,-32767,-23170,-23170, 32767,0,12539,-30273,-23170,-23170,-30273,12539,32767,0,12539,-30273,-23170,-23170,-30273,12539 }; -int16_t tw16arep[48] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273,32767,0,30272,12540,23169 ,23170,12539 ,30273, +const static int16_t tw16arep[48] __attribute__((aligned(32))) = {32767,0,30272,12540,23169 ,23170,12539 ,30273,32767,0,30272,12540,23169 ,23170,12539 ,30273, 32767,0,23169,23170,0 ,32767,-23170,23170,32767,0,23169,23170,0 ,32767,-23170,23170, 32767,0,12539,30273,-23170,23170,-30273,-12539,32767,0,12539,30273,-23170,23170,-30273,-12539 }; -int16_t tw16brep[48] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539,0,32767,-12540,30272,-23170,23169 ,-30273,12539, +const static int16_t tw16brep[48] __attribute__((aligned(32))) = { 0,32767,-12540,30272,-23170,23169 ,-30273,12539,0,32767,-12540,30272,-23170,23169 ,-30273,12539, 0,32767,-23170,23169,-32767,0 ,-23170,-23170,0,32767,-23170,23169,-32767,0 ,-23170,-23170, 0,32767,-30273,12539,-23170,-23170,12539 ,-30273,0,32767,-30273,12539,-23170,-23170,12539 ,-30273 }; -int16_t tw16crep[48] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539,0,32767,12540,30272,23170,23169 ,30273 ,12539, +const static int16_t tw16crep[48] __attribute__((aligned(32))) = { 0,32767,12540,30272,23170,23169 ,30273 ,12539,0,32767,12540,30272,23170,23169 ,30273 ,12539, 0,32767,23170,23169,32767,0 ,23170 ,-23170,0,32767,23170,23169,32767,0 ,23170 ,-23170, 0,32767,30273,12539,23170,-23170,-12539,-30273,0,32767,30273,12539,23170,-23170,-12539,-30273 }; @@ -2502,7 +2493,7 @@ static inline void idft16_simd256(int16_t *x,int16_t *y) // 64-point optimized DFT -int16_t tw64[96] __attribute__((aligned(32))) = { +const static int16_t tw64[96] __attribute__((aligned(32))) = { 32767,0,32609,-3212,32137,-6393,31356,-9512, 30272,-12540,28897,-15447,27244,-18205,25329,-20788, 23169,-23170,20787,-25330,18204,-27245,15446,-28898, @@ -2517,7 +2508,9 @@ int16_t tw64[96] __attribute__((aligned(32))) = { -30273,12539,-25330,20787,-18205,27244,-9512,31356 }; -int16_t tw64rep[192] __attribute__((aligned(32))) = { +#if 0 +/* this is defined but not used, let's comment */ +const static int16_t tw64rep[192] __attribute__((aligned(32))) = { 32767,0,32609,-3212,32137,-6393,31356,-9512,32767,0,32609,-3212,32137,-6393,31356,-9512, 30272,-12540,28897,-15447,27244,-18205,25329,-20788,30272,-12540,28897,-15447,27244,-18205,25329,-20788, 23169,-23170,20787,-25330,18204,-27245,15446,-28898,23169,-23170,20787,-25330,18204,-27245,15446,-28898, @@ -2531,8 +2524,9 @@ int16_t tw64rep[192] __attribute__((aligned(32))) = { -23170,-23170,-28898,-15447,-32138,-6393,-32610,3211,-23170,-23170,-28898,-15447,-32138,-6393,-32610,3211, -30273,12539,-25330,20787,-18205,27244,-9512,31356,-30273,12539,-25330,20787,-18205,27244,-9512,31356 }; +#endif -int16_t tw64a[96] __attribute__((aligned(32))) = { +const static int16_t tw64a[96] __attribute__((aligned(32))) = { 32767,0,32609,3212,32137,6393,31356,9512, 30272,12540,28897,15447,27244,18205,25329,20788, 23169,23170,20787,25330,18204,27245,15446,28898, @@ -2546,7 +2540,9 @@ int16_t tw64a[96] __attribute__((aligned(32))) = { -23170,23170,-28898,15447,-32138,6393,-32610,-3211, -30273,-12539,-25330,-20787,-18205,-27244,-9512,-31356 }; -int16_t tw64arep[192] __attribute__((aligned(32))) = { +#if 0 +/* this is defined but not used, let's comment */ +const static int16_t tw64arep[192] __attribute__((aligned(32))) = { 32767,0,32609,3212,32137,6393,31356,9512,32767,0,32609,3212,32137,6393,31356,9512, 30272,12540,28897,15447,27244,18205,25329,20788,30272,12540,28897,15447,27244,18205,25329,20788, 23169,23170,20787,25330,18204,27245,15446,28898,23169,23170,20787,25330,18204,27245,15446,28898, @@ -2560,8 +2556,9 @@ int16_t tw64arep[192] __attribute__((aligned(32))) = { -23170,23170,-28898,15447,-32138,6393,-32610,-3211,-23170,23170,-28898,15447,-32138,6393,-32610,-3211, -30273,-12539,-25330,-20787,-18205,-27244,-9512,-31356,-30273,-12539,-25330,-20787,-18205,-27244,-9512,-31356 }; +#endif -int16_t tw64b[96] __attribute__((aligned(32))) = { +const static int16_t tw64b[96] __attribute__((aligned(32))) = { 0,32767,-3212,32609,-6393,32137,-9512,31356, -12540,30272,-15447,28897,-18205,27244,-20788,25329, -23170,23169,-25330,20787,-27245,18204,-28898,15446, @@ -2576,7 +2573,9 @@ int16_t tw64b[96] __attribute__((aligned(32))) = { 12539,-30273,20787,-25330,27244,-18205,31356,-9512 }; -int16_t tw64brep[192] __attribute__((aligned(32))) = { +#if 0 +/* this is defined but not used, let's comment */ +const static int16_t tw64brep[192] __attribute__((aligned(32))) = { 0,32767,-3212,32609,-6393,32137,-9512,31356,0,32767,-3212,32609,-6393,32137,-9512,31356, -12540,30272,-15447,28897,-18205,27244,-20788,25329,-12540,30272,-15447,28897,-18205,27244,-20788,25329, -23170,23169,-25330,20787,-27245,18204,-28898,15446,-23170,23169,-25330,20787,-27245,18204,-28898,15446, @@ -2590,8 +2589,9 @@ int16_t tw64brep[192] __attribute__((aligned(32))) = { -23170,-23170,-15447,-28898,-6393,-32138,3211,-32610,-23170,-23170,-15447,-28898,-6393,-32138,3211,-32610, 12539,-30273,20787,-25330,27244,-18205,31356,-9512,12539,-30273,20787,-25330,27244,-18205,31356,-9512 }; +#endif -int16_t tw64c[96] __attribute__((aligned(32))) = { +const static int16_t tw64c[96] __attribute__((aligned(32))) = { 0,32767,3212,32609,6393,32137,9512,31356, 12540,30272,15447,28897,18205,27244,20788,25329, 23170,23169,25330,20787,27245,18204,28898,15446, @@ -2606,7 +2606,9 @@ int16_t tw64c[96] __attribute__((aligned(32))) = { -12539,-30273,-20787,-25330,-27244,-18205,-31356,-9512 }; -int16_t tw64crep[192] __attribute__((aligned(32))) = { +#if 0 +/* this is defined but not used, let's comment */ +const static int16_t tw64crep[192] __attribute__((aligned(32))) = { 0,32767,3212,32609,6393,32137,9512,31356,0,32767,3212,32609,6393,32137,9512,31356, 12540,30272,15447,28897,18205,27244,20788,25329,12540,30272,15447,28897,18205,27244,20788,25329, 23170,23169,25330,20787,27245,18204,28898,15446,23170,23169,25330,20787,27245,18204,28898,15446, @@ -2620,6 +2622,7 @@ int16_t tw64crep[192] __attribute__((aligned(32))) = { 23170,-23170,15447,-28898,6393,-32138,-3211,-32610,23170,-23170,15447,-28898,6393,-32138,-3211,-32610, -12539,-30273,-20787,-25330,-27244,-18205,-31356,-9512,-12539,-30273,-20787,-25330,-27244,-18205,-31356,-9512 }; +#endif #if defined(__x86_64__) || defined(__i386__) @@ -2627,7 +2630,7 @@ int16_t tw64crep[192] __attribute__((aligned(32))) = { #define simdshort_q15_t __m64 #define shiftright_int16(a,shift) _mm_srai_epi16(a,shift) #define set1_int16(a) _mm_set1_epi16(a); -#define mulhi_int16(a,b) _mm_slli_epi16(_mm_mulhi_epi16(a,b),1); +#define mulhi_int16(a,b) _mm_mulhrs_epi16 (a,b) #ifdef __AVX2__ #define simd256_q15_t __m256i #define shiftright_int16_simd256(a,shift) _mm256_srai_epi16(a,shift) @@ -5229,7 +5232,7 @@ void dft8192(int16_t *x,int16_t *y,int scale) xtmpp = xtmp; - for (i=0; i<32; i++) { + for (i=0; i<16; i++) { transpose4_ooff_simd256(x256 ,xtmpp,512); transpose4_ooff_simd256(x256+2,xtmpp+1,512); transpose4_ooff_simd256(x256+4,xtmpp+2,512); @@ -5267,7 +5270,7 @@ void dft8192(int16_t *x,int16_t *y,int scale) } dft4096((int16_t*)(xtmp),(int16_t*)ytmp,1); - dft4096((int16_t*)(xtmp+1024),(int16_t*)(ytmp+512),1); + dft4096((int16_t*)(xtmp+512),(int16_t*)(ytmp+512),1); for (i=0; i<512; i++) { @@ -5319,7 +5322,7 @@ void idft8192(int16_t *x,int16_t *y,int scale) xtmpp = xtmp; - for (i=0; i<32; i++) { + for (i=0; i<16; i++) { transpose4_ooff_simd256(x256 ,xtmpp,512); transpose4_ooff_simd256(x256+2,xtmpp+1,512); transpose4_ooff_simd256(x256+4,xtmpp+2,512); @@ -5357,7 +5360,7 @@ void idft8192(int16_t *x,int16_t *y,int scale) } idft4096((int16_t*)(xtmp),(int16_t*)ytmp,1); - idft4096((int16_t*)(xtmp+1024),(int16_t*)(ytmp+512),1); + idft4096((int16_t*)(xtmp+512),(int16_t*)(ytmp+512),1); for (i=0; i<512; i++) { @@ -5680,15 +5683,58 @@ void idft12288(int16_t *input, int16_t *output) // write_output("out.m","out",output,6144,1,1); } +#include "twiddle18432.h" // 6144 x 3 -void dft18432(int16_t *input, int16_t *output) -{ +void dft18432(int16_t *input, int16_t *output) { + int i,i2,j; + uint32_t tmp[3][6144] __attribute__((aligned(32))); + uint32_t tmpo[3][6144] __attribute__((aligned(32))); + + for (i=0,j=0; i<6144; i++) { + tmp[0][i] = ((uint32_t *)input)[j++]; + tmp[1][i] = ((uint32_t *)input)[j++]; + tmp[2][i] = ((uint32_t *)input)[j++]; + } + + dft6144((int16_t*)(tmp[0]),(int16_t*)(tmpo[0])); + dft6144((int16_t*)(tmp[1]),(int16_t*)(tmpo[1])); + dft6144((int16_t*)(tmp[2]),(int16_t*)(tmpo[2])); + + for (i=0,i2=0; i<12288; i+=8,i2+=4) { + bfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), + (simd_q15_t*)(output+i),(simd_q15_t*)(output+12288+i),(simd_q15_t*)(output+24576+i), + (simd_q15_t*)(twa18432+i),(simd_q15_t*)(twb18432+i)); + } + + _mm_empty(); + _m_empty(); } -void idft18432(int16_t *input, int16_t *output) -{ +void idft18432(int16_t *input, int16_t *output) { + int i,i2,j; + uint32_t tmp[3][6144] __attribute__((aligned(32))); + uint32_t tmpo[3][6144] __attribute__((aligned(32))); + + for (i=0,j=0; i<6144; i++) { + tmp[0][i] = ((uint32_t *)input)[j++]; + tmp[1][i] = ((uint32_t *)input)[j++]; + tmp[2][i] = ((uint32_t *)input)[j++]; + } + + idft6144((int16_t*)(tmp[0]),(int16_t*)(tmpo[0])); + idft6144((int16_t*)(tmp[1]),(int16_t*)(tmpo[1])); + idft6144((int16_t*)(tmp[2]),(int16_t*)(tmpo[2])); + + for (i=0,i2=0; i<12288; i+=8,i2+=4) { + ibfly3((simd_q15_t*)(&tmpo[0][i2]),(simd_q15_t*)(&tmpo[1][i2]),(simd_q15_t*)(&tmpo[2][i2]), + (simd_q15_t*)(output+i),(simd_q15_t*)(output+12288+i),(simd_q15_t*)(output+24576+i), + (simd_q15_t*)(twa18432+i),(simd_q15_t*)(twb18432+i)); + } + + _mm_empty(); + _m_empty(); } #include "twiddle24576.h" @@ -5733,8 +5779,8 @@ void dft24576(int16_t *input, int16_t *output) void idft24576(int16_t *input, int16_t *output) { int i,i2,j; - uint32_t tmp[3][16384] __attribute__((aligned(32))); - uint32_t tmpo[3][16384] __attribute__((aligned(32))); + uint32_t tmp[3][8192] __attribute__((aligned(32))); + uint32_t tmpo[3][8192] __attribute__((aligned(32))); for (i=0,j=0; i<8192; i++) { tmp[0][i] = ((uint32_t *)input)[j++]; @@ -5746,13 +5792,6 @@ void idft24576(int16_t *input, int16_t *output) idft8192((int16_t*)(tmp[1]),(int16_t*)(tmpo[1]),1); idft8192((int16_t*)(tmp[2]),(int16_t*)(tmpo[2]),1); - /* - for (i=1; i<8192; i++) { - tmpo[0][i] = tmpo[0][i<<1]; - tmpo[1][i] = tmpo[1][i<<1]; - tmpo[2][i] = tmpo[2][i<<1]; - }*/ - /* write_output("in.m","in",input,24576,1,1); write_output("out0.m","o0",tmpo[0],8192,1,1); @@ -6817,6 +6856,7 @@ void dft60(int16_t *x,int16_t *y,unsigned char scale) for (i=0; i<60; i++) { y128[i] = mulhi_int16(y128[i],norm128); +// printf("y[%d] = (%d,%d)\n",i,((int16_t*)&y128[i])[0],((int16_t*)&y128[i])[1]); } } @@ -18553,6 +18593,7 @@ int main(int argc, char**argv) simd_q15_t x[4096],y[4096],tw0,tw1,tw2,tw3; #endif int i; + simd_q15_t *x128=x,*y128=y; set_taus_seed(0); opp_enabled = 1; @@ -18592,17 +18633,22 @@ int main(int argc, char**argv) ((int16_t *)&tw3)[5] = 0; ((int16_t *)&tw3)[6] = 32767; ((int16_t *)&tw3)[7] = 0; - + */ for (i=0;i<300;i++) { #if defined(__x86_64__) || defined(__i386__) +#ifndef __AVX2__ x[i] = _mm_set1_epi32(taus()); x[i] = _mm_srai_epi16(x[i],4); +#else + x[i] = _mm256_set1_epi32(taus()); + x[i] = _mm256_srai_epi16(x[i],4); +#endif #elif defined(__arm__) x[i] = (int16x8_t)vdupq_n_s32(taus()); x[i] = vshrq_n_s16(x[i],4); #endif } - + /* bfly2_tw1(x,x+1,y,y+1); printf("(%d,%d) (%d,%d) => (%d,%d) (%d,%d)\n",((int16_t*)&x[0])[0],((int16_t*)&x[0])[1],((int16_t*)&x[1])[0],((int16_t*)&x[1])[1],((int16_t*)&y[0])[0],((int16_t*)&y[0])[1],((int16_t*)&y[1])[0],((int16_t*)&y[1])[1]); printf("(%d,%d) (%d,%d) => (%d,%d) (%d,%d)\n",((int16_t*)&x[0])[0],((int16_t*)&x[0])[1],((int16_t*)&x[1])[0],((int16_t*)&x[1])[1],((int16_t*)&y[0])[2],((int16_t*)&y[0])[3],((int16_t*)&y[1])[2],((int16_t*)&y[1])[3]); @@ -18743,27 +18789,27 @@ int main(int argc, char**argv) for (i=0;i<48;i++) printf("%d,%d,",((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); printf("\n"); - + */ dft60((int16_t *)x,(int16_t *)y,1); printf("\n\n60-point\n"); printf("X: "); for (i=0;i<60;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); + printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]); printf("\nY:"); for (i=0;i<60;i++) - printf("%d,%d,",((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); + printf("%d,%d,",((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]); printf("\n"); - + dft72((int16_t *)x,(int16_t *)y,1); printf("\n\n72-point\n"); printf("X: "); for (i=0;i<72;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); + printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]); printf("\nY:"); for (i=0;i<72;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); + printf("%d: %d,%d\n",i,((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]); printf("\n"); - + /* dft96((int16_t *)x,(int16_t *)y,1); printf("\n\n96-point\n"); printf("X: "); @@ -18783,17 +18829,17 @@ int main(int argc, char**argv) for (i=0;i<108;i++) printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); printf("\n"); - + */ dft120((int16_t *)x,(int16_t *)y,1); printf("\n\n120-point\n"); printf("X: "); for (i=0;i<120;i++) - printf("%d,%d,",((int16_t*)(&x[i]))[0],((int16_t *)(&x[i]))[1]); + printf("%d,%d,",((int16_t*)(&x128[i]))[0],((int16_t *)(&x128[i]))[1]); printf("\nY:"); for (i=0;i<120;i++) - printf("%d: %d,%d\n",i,((int16_t*)(&y[i]))[0],((int16_t *)(&y[i]))[1]); + printf("%d: %d,%d\n",i,((int16_t*)(&y128[i]))[0],((int16_t *)(&y128[i]))[1]); printf("\n"); - + /* dft144((int16_t *)x,(int16_t *)y,1); printf("\n\n144-point\n"); printf("X: "); @@ -19122,6 +19168,55 @@ int main(int argc, char**argv) write_output("y2048.m","y2048",y,2048,1,1); write_output("x2048.m","x2048",x,2048,1,1); + memset((void*)x,0,2048*sizeof(int32_t)); + for (i=2;i<2402;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + for (i=2*(4096-1200);i<8192;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + reset_meas(&ts); + + for (i=0; i<10000; i++) { + start_meas(&ts); + idft4096((int16_t *)x,(int16_t *)y,1); + stop_meas(&ts); + } + + printf("\n\n4096-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + write_output("y4096.m","y4096",y,4096,1,1); + write_output("x4096.m","x4096",x,4096,1,1); + + memset((void*)x,0,8192*sizeof(int32_t)); + for (i=2;i<4802;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + for (i=2*(4096-1200);i<8192;i++) { + if ((taus() & 1)==0) + ((int16_t*)x)[i] = 364; + else + ((int16_t*)x)[i] = -364; + } + reset_meas(&ts); + for (i=0; i<10000; i++) { + start_meas(&ts); + idft8192((int16_t *)x,(int16_t *)y,1); + stop_meas(&ts); + } + + printf("\n\n8192-point(%f cycles)\n",(double)ts.diff/(double)ts.trials); + write_output("y8192.m","y8192",y,8192,1,1); + write_output("x8192.m","x8192",x,8192,1,1); + return(0); } diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c index 4b623fb9dc..30e57c1c62 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.c +++ b/openair1/PHY/TOOLS/lte_phy_scope.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Form definition file generated by fdesign */ #include @@ -47,11 +40,11 @@ static void ia_receiver_on_off( FL_OBJECT *button, long arg) if (fl_get_button(button)) { fl_set_object_label(button, "IA Receiver ON"); - openair_daq_vars.use_ia_receiver = 1; + // PHY_vars_UE_g[0][0]->use_ia_receiver = 1; fl_set_object_color(button, FL_GREEN, FL_GREEN); } else { fl_set_object_label(button, "IA Receiver OFF"); - openair_daq_vars.use_ia_receiver = 0; + // PHY_vars_UE_g[0][0]->use_ia_receiver = 0; fl_set_object_color(button, FL_RED, FL_RED); } } @@ -91,7 +84,7 @@ FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void ) fl_set_xyplot_ybounds(fdui->rxsig_t,10,70); // Time-domain channel response - fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" ); + fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "SRS Frequency Response (samples, abs)" ); fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX ); fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED ); fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color @@ -161,7 +154,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, { int eNB_id = 0; int i,i2,arx,atx,ind,k; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->frame_parms; int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti; uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx; uint8_t nb_antennas_tx = 1; // frame_parms->nb_antennas_tx; // in LTE Rel. 8 and 9 only a single transmit antenna is assumed at the UE @@ -183,30 +176,31 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, float time[FRAME_LENGTH_COMPLEX_SAMPLES]; float time2[2048]; float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx]; - int frame = phy_vars_enb->proc[0].frame_tx; + int frame = phy_vars_enb->proc.proc_rxtx[0].frame_tx; uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate; int coded_bits_per_codeword = 0; uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2 - int mcs = 0; + int Qm = 2; // choose max MCS to compute coded_bits_per_codeword - if (phy_vars_enb->ulsch_eNB[UE_id]!=NULL) { + if (phy_vars_enb->ulsch[UE_id]!=NULL) { for (harq_pid=0; harq_pid<3; harq_pid++) { - mcs = cmax(phy_vars_enb->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,mcs); + Qm = cmax(phy_vars_enb->ulsch[UE_id]->harq_processes[harq_pid]->Qm,Qm); } } - coded_bits_per_codeword = frame_parms->N_RB_UL*12*get_Qm(mcs)*frame_parms->symbols_per_tti; + coded_bits_per_codeword = frame_parms->N_RB_UL*12*Qm*frame_parms->symbols_per_tti; chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float)); llr = (float*) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero bit = malloc(coded_bits_per_codeword*sizeof(float)); - rxsig_t = (int16_t**) phy_vars_enb->lte_eNB_common_vars.rxdata[eNB_id]; - chest_t = (int16_t**) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id]; - chest_f = (int16_t**) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->drs_ch_estimates[eNB_id]; - pusch_llr = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->llr; - pusch_comp = (int16_t*) phy_vars_enb->lte_eNB_pusch_vars[UE_id]->rxdataF_comp[eNB_id][0]; + rxsig_t = (int16_t**) phy_vars_enb->common_vars.rxdata[eNB_id]; + //chest_t = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id]; + chest_t = (int16_t**) phy_vars_enb->srs_vars[UE_id].srs_ch_estimates[eNB_id]; + chest_f = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates[eNB_id]; + pusch_llr = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->llr; + pusch_comp = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[eNB_id][0]; pucch1_comp = (int32_t*) phy_vars_enb->pucch1_stats[UE_id]; pucch1_thres = (int32_t*) phy_vars_enb->pucch1_stats_thres[UE_id]; pucch1ab_comp = (int32_t*) phy_vars_enb->pucch1ab_stats[UE_id]; @@ -239,8 +233,10 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, if (chest_t[0] !=NULL) { for (i=0; i<(frame_parms->ofdm_symbol_size); i++) { - i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size; - time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1)); + //i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size; + i2=i; + //time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1)); + time2[i] = (float)i; chest_t_abs[0][i] = 10*log10((float) (1+chest_t[0][2*i2]*chest_t[0][2*i2]+chest_t[0][2*i2+1]*chest_t[0][2*i2+1])); if (chest_t_abs[0][i] > ymax) @@ -254,7 +250,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, if (chest_t[arx] !=NULL) { for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) { chest_t_abs[arx][i] = 10*log10((float) (1+chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1])); - + if (chest_t_abs[arx][i] > ymax) ymax = chest_t_abs[arx][i]; } @@ -347,7 +343,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form, Q_pucch[ind] = (float)pucch1ab_comp[2*(ind)+1]; A_pucch[ind] = 10*log10(pucch1_comp[ind]); B_pucch[ind] = ind; - C_pucch[ind] = (float)pucch1_thres[ind]; + C_pucch[ind] = (float)pucch1_thres[ind]; } fl_set_xyplot_data(form->pucch_comp,I_pucch,Q_pucch,10240,"","",""); fl_set_xyplot_data(form->pucch_comp1,B_pucch,A_pucch,1024,"","",""); @@ -488,16 +484,17 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, uint8_t subframe) { int i,arx,atx,ind,k; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms; int nsymb_ce = frame_parms->ofdm_symbol_size;//*frame_parms->symbols_per_tti; uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx; - uint8_t nb_antennas_tx = frame_parms->nb_antennas_tx_eNB; + uint8_t nb_antennas_tx = frame_parms->nb_antenna_ports_eNB; int16_t **rxsig_t; int16_t **chest_t; int16_t **chest_f; int16_t *pdsch_llr; int16_t *pdsch_comp; - int8_t *pdcch_llr; + int16_t *pdsch_mag; + int8_t *pdcch_llr; int16_t *pdcch_comp; int8_t *pbch_llr; int16_t *pbch_comp; @@ -509,42 +506,44 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, float **chest_t_abs; float time[FRAME_LENGTH_COMPLEX_SAMPLES]; float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx]; - int frame = phy_vars_ue->frame_rx; + int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx; uint32_t total_dlsch_bitrate = phy_vars_ue->bitrate[eNB_id]; int coded_bits_per_codeword = 0; int mcs = 0; unsigned char harq_pid = 0; + int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0; - if (phy_vars_ue->dlsch_ue[eNB_id][0]!=NULL) { - harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid; + if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) { + harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid; if (harq_pid>=8) return; - mcs = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs; + mcs = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs; // Button 0 - if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) { + if(!phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->dl_power_off) { // we are in TM5 fl_show_object(form->button_0); } } - if (phy_vars_ue->lte_ue_pdcch_vars[eNB_id]!=NULL) { - num_pdcch_symbols = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols; + if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) { + num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols; } // coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); - if (phy_vars_ue->dlsch_ue[eNB_id][0]!=NULL) { + if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) { coded_bits_per_codeword = get_G(frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb, + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, get_Qm(mcs), - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl, num_pdcch_symbols, frame, - subframe); + subframe, + beamforming_mode); } else { coded_bits_per_codeword = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); } @@ -563,16 +562,17 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, llr_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero bit_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); - rxsig_t = (int16_t**) phy_vars_ue->lte_ue_common_vars.rxdata; - chest_t = (int16_t**) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_id]; - chest_f = (int16_t**) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id]; - pbch_llr = (int8_t*) phy_vars_ue->lte_ue_pbch_vars[eNB_id]->llr; - pbch_comp = (int16_t*) phy_vars_ue->lte_ue_pbch_vars[eNB_id]->rxdataF_comp[0]; - pdcch_llr = (int8_t*) phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->llr; - pdcch_comp = (int16_t*) phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0]; - pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0]; // stream 0 + rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata; + chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id]; + chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id]; + pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr; + pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]; + pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr; + pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0]; + pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0 // pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0 - pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0]; + pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0]; + pdsch_mag = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0]; // Received signal in time domain of receive antenna 0 if (rxsig_t != NULL) { @@ -704,7 +704,14 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, } fl_set_xyplot_xbounds(form->pdcch_llr,0,12*frame_parms->N_RB_DL*2*3); - fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","",""); + if (frame_parms->N_RB_DL != 100) + { + fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","",""); + } + else + { + LOG_D(PHY,"UE PDCCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); + } } // PDCCH I/Q of MF Output @@ -713,8 +720,14 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, I[i] = pdcch_comp[2*i]; Q[i] = pdcch_comp[2*i+1]; } - - fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","",""); + if (frame_parms->N_RB_DL != 100) + { + fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","",""); + } + else + { + LOG_D(PHY,"UE PDCCH COMP plot is bugged in 20 MHz BW, to be fixed !!!\n"); + } } // PDSCH LLRs @@ -725,7 +738,14 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, } fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword); - fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","",""); + if (frame_parms->N_RB_DL != 100) + { + fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","",""); + } + else + { + LOG_D(PHY,"UE PDSCH LLR plot is bugged in 20 MHz BW, to be fixed !!!\n"); + } } // PDSCH I/Q of MF Output @@ -734,8 +754,9 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, for (k=0; ksymbols_per_tti; k++) { for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { - I[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i]; - Q[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i+1]; + int j = (2*frame_parms->N_RB_DL*12*k)+4*i; + I[ind] = (pdsch_mag[j ]!=0? 1.0/pdsch_mag[j ]: 0.0) * pdsch_comp[j ]*1.0; + Q[ind] = (pdsch_mag[j+1]!=0? 1.0/pdsch_mag[j+1]: 0.0) * pdsch_comp[j+1]*1.0; ind++; } } diff --git a/openair1/PHY/TOOLS/lte_phy_scope.h b/openair1/PHY/TOOLS/lte_phy_scope.h index 877934fc7a..1d2b2ea1ed 100644 --- a/openair1/PHY/TOOLS/lte_phy_scope.h +++ b/openair1/PHY/TOOLS/lte_phy_scope.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Header file generated by fdesign on Tue Nov 13 09:42:50 2012 */ #ifndef FD_lte_scope_h_ @@ -37,7 +30,6 @@ #include "../defs.h" #include "../../SCHED/defs.h" // for OPENAIR_DAQ_VARS -extern OPENAIR_DAQ_VARS openair_daq_vars; /* Forms and Objects */ typedef struct { @@ -54,18 +46,21 @@ typedef struct { } FD_lte_phy_scope_enb; typedef struct { - FL_FORM * lte_phy_scope_ue; - FL_OBJECT * rxsig_t; - FL_OBJECT * chest_f; - FL_OBJECT * chest_t; - FL_OBJECT * pbch_comp; - FL_OBJECT * pbch_llr; - FL_OBJECT * pdcch_comp; - FL_OBJECT * pdcch_llr; - FL_OBJECT * pdsch_comp; - FL_OBJECT * pdsch_llr; - FL_OBJECT * pdsch_tput; - FL_OBJECT * button_0; + FL_FORM * lte_phy_scope_ue; + FL_OBJECT * rxsig_t; + FL_OBJECT * chest_f; + FL_OBJECT * chest_t; + FL_OBJECT * pbch_comp; + FL_OBJECT * pbch_llr; + FL_OBJECT * pdcch_comp; + FL_OBJECT * pdcch_llr; + FL_OBJECT * pdsch_comp; + FL_OBJECT * pdsch_llr; + FL_OBJECT * pdsch_comp1; + FL_OBJECT * pdsch_llr1; + FL_OBJECT * pdsch_tput; + FL_OBJECT * button_0; + } FD_lte_phy_scope_ue; FD_lte_phy_scope_enb * create_lte_phy_scope_enb( void ); @@ -84,7 +79,4 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form, - - - #endif /* FD_lte_scope_h_ */ diff --git a/openair1/PHY/TOOLS/lte_phy_scope_tm4.c b/openair1/PHY/TOOLS/lte_phy_scope_tm4.c new file mode 100644 index 0000000000..8dd41548ab --- /dev/null +++ b/openair1/PHY/TOOLS/lte_phy_scope_tm4.c @@ -0,0 +1,830 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/* Form definition file generated by fdesign */ +#include +#include "lte_phy_scope.h" +#define TPUT_WINDOW_LENGTH 100 +int otg_enabled; +int use_sic_receiver=0; +FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW}; +float tput_time_enb[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; +float tput_enb[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; +float tput_time_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; +float tput_ue[NUMBER_OF_UE_MAX][TPUT_WINDOW_LENGTH] = {{0}}; +float tput_ue_max[NUMBER_OF_UE_MAX] = {0}; +static void ia_receiver_on_off( FL_OBJECT *button, long arg) +{ + if (fl_get_button(button)) { + fl_set_object_label(button, "IA Receiver ON"); + // PHY_vars_UE_g[0][0]->use_ia_receiver = 1; + fl_set_object_color(button, FL_GREEN, FL_GREEN); + } else { + fl_set_object_label(button, "IA Receiver OFF"); + // PHY_vars_UE_g[0][0]->use_ia_receiver = 0; + fl_set_object_color(button, FL_RED, FL_RED); + } +} +static void dl_traffic_on_off( FL_OBJECT *button, long arg) +{ + if (fl_get_button(button)) { + fl_set_object_label(button, "DL Traffic ON"); + otg_enabled = 1; + fl_set_object_color(button, FL_GREEN, FL_GREEN); + } else { + fl_set_object_label(button, "DL Traffic OFF"); + otg_enabled = 0; + fl_set_object_color(button, FL_RED, FL_RED); + } +} + +static void sic_receiver_on_off( FL_OBJECT *button, long arg) +{ + + if (fl_get_button(button)) { + fl_set_object_label(button, "SIC Receiver ON"); + use_sic_receiver = 1; + fl_set_object_color(button, FL_GREEN, FL_GREEN); + } else { + fl_set_object_label(button, "SIC Receiver OFF"); + use_sic_receiver = 0; + fl_set_object_color(button, FL_RED, FL_RED); + } +} + +FD_lte_phy_scope_enb *create_lte_phy_scope_enb( void ) +{ + FL_OBJECT *obj; + FD_lte_phy_scope_enb *fdui = fl_malloc( sizeof *fdui ); + // Define form + fdui->lte_phy_scope_enb = fl_bgn_form( FL_NO_BOX, 800, 800 ); + // This the whole UI box + obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 800, "" ); + fl_set_object_color( obj, FL_BLACK, FL_BLACK ); + // Received signal + fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" ); + fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED ); + fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color + fl_set_xyplot_ybounds(fdui->rxsig_t,10,70); + // Time-domain channel response + fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" ); + fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED ); + fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color + // Frequency-domain channel response + fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency Response (RE, dB)" ); + fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED ); + fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color + fl_set_xyplot_ybounds( fdui->chest_f,30,70); + // LLR of PUSCH + fdui->pusch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 200, "PUSCH Log-Likelihood Ratios (LLR, mag)" ); + fl_set_object_boxtype( fdui->pusch_llr, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pusch_llr, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pusch_llr, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pusch_llr,2); + // I/Q PUSCH comp + fdui->pusch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 200, "PUSCH I/Q of MF Output" ); + fl_set_object_boxtype( fdui->pusch_comp, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pusch_comp, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pusch_comp, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pusch_comp,2); + fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR); + // I/Q PUCCH comp (format 1) + fdui->pucch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 480, 240, 100, "PUCCH1 Energy (SR)" ); + fl_set_object_boxtype( fdui->pucch_comp1, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pucch_comp1, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pucch_comp1, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pucch_comp1,2); + // fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR); + // I/Q PUCCH comp (fromat 1a/b) + fdui->pucch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 600, 240, 100, "PUCCH I/Q of MF Output" ); + fl_set_object_boxtype( fdui->pucch_comp, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pucch_comp, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pucch_comp, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pucch_comp,2); + // fl_set_xyplot_xgrid( fdui->pusch_llr,FL_GRID_MAJOR); + // Throughput on PUSCH + fdui->pusch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 480, 500, 100, "PUSCH Throughput [frame]/[kbit/s]" ); + fl_set_object_boxtype( fdui->pusch_tput, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pusch_tput, FL_BLACK, FL_WHITE ); + fl_set_object_lcolor( fdui->pusch_tput, FL_WHITE ); // Label color + // Generic eNB Button + fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 20, 600, 240, 40, "" ); + fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER ); + fl_set_button(fdui->button_0,0); + otg_enabled = 0; + fl_set_object_label(fdui->button_0, "DL Traffic OFF"); + fl_set_object_color(fdui->button_0, FL_RED, FL_RED); + fl_set_object_callback(fdui->button_0, dl_traffic_on_off, 0 ); + fl_end_form( ); + fdui->lte_phy_scope_enb->fdui = fdui; + return fdui; +} +void phy_scope_eNB(FD_lte_phy_scope_enb *form, + PHY_VARS_eNB *phy_vars_enb, + int UE_id) +{ + int eNB_id = 0; + int i,i2,arx,atx,ind,k; + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_enb->frame_parms; + int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti; + uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx; + uint8_t nb_antennas_tx = 1; // frame_parms->nb_antennas_tx; // in LTE Rel. 8 and 9 only a single transmit antenna is assumed at the UE + int16_t **rxsig_t; + int16_t **chest_t; + int16_t **chest_f; + int16_t *pusch_llr; + int16_t *pusch_comp; + int32_t *pucch1_comp; + int32_t *pucch1_thres; + int32_t *pucch1ab_comp; + float Re,Im,ymax; + float *llr, *bit; + float I[nsymb_ce*2], Q[nsymb_ce*2]; + float I_pucch[10240],Q_pucch[10240],A_pucch[10240],B_pucch[10240],C_pucch[10240]; + float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES]; + float chest_t_abs[nb_antennas_rx][frame_parms->ofdm_symbol_size]; + float *chest_f_abs; + float time[FRAME_LENGTH_COMPLEX_SAMPLES]; + float time2[2048]; + float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx]; + int frame = phy_vars_enb->proc.proc_rxtx[0].frame_tx; + uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate; + int coded_bits_per_codeword = 0; + uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2 + int mcs = 0; + // choose max MCS to compute coded_bits_per_codeword + if (phy_vars_enb->ulsch[UE_id]!=NULL) { + for (harq_pid=0; harq_pid<3; harq_pid++) { + mcs = cmax(phy_vars_enb->ulsch[UE_id]->harq_processes[harq_pid]->mcs,mcs); + } + } + coded_bits_per_codeword = frame_parms->N_RB_UL*12*get_Qm(mcs)*frame_parms->symbols_per_tti; + chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float)); + llr = (float*) calloc(coded_bits_per_codeword,sizeof(float)); // init to zero + bit = malloc(coded_bits_per_codeword*sizeof(float)); + rxsig_t = (int16_t**) phy_vars_enb->common_vars.rxdata[eNB_id]; + chest_t = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates_time[eNB_id]; + chest_f = (int16_t**) phy_vars_enb->pusch_vars[UE_id]->drs_ch_estimates[eNB_id]; + pusch_llr = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->llr; + pusch_comp = (int16_t*) phy_vars_enb->pusch_vars[UE_id]->rxdataF_comp[eNB_id][0]; + pucch1_comp = (int32_t*) phy_vars_enb->pucch1_stats[UE_id]; + pucch1_thres = (int32_t*) phy_vars_enb->pucch1_stats_thres[UE_id]; + pucch1ab_comp = (int32_t*) phy_vars_enb->pucch1ab_stats[UE_id]; + // Received signal in time domain of receive antenna 0 + if (rxsig_t != NULL) { + if (rxsig_t[0] != NULL) { + for (i=0; irxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","",""); + } + for (arx=1; arxrxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]); + } + } + } + // Channel Impulse Response + if (chest_t != NULL) { + ymax = 0; + if (chest_t[0] !=NULL) { + for (i=0; i<(frame_parms->ofdm_symbol_size); i++) { + i2 = (i+(frame_parms->ofdm_symbol_size>>1))%frame_parms->ofdm_symbol_size; + time2[i] = (float)(i-(frame_parms->ofdm_symbol_size>>1)); + chest_t_abs[0][i] = 10*log10((float) (1+chest_t[0][2*i2]*chest_t[0][2*i2]+chest_t[0][2*i2+1]*chest_t[0][2*i2+1])); + if (chest_t_abs[0][i] > ymax) + ymax = chest_t_abs[0][i]; + } + fl_set_xyplot_data(form->chest_t,time2,chest_t_abs[0],(frame_parms->ofdm_symbol_size),"","",""); + } + for (arx=1; arxofdm_symbol_size>>3); i++) { + chest_t_abs[arx][i] = 10*log10((float) (1+chest_t[arx][2*i]*chest_t[arx][2*i]+chest_t[arx][2*i+1]*chest_t[arx][2*i+1])); + if (chest_t_abs[arx][i] > ymax) + ymax = chest_t_abs[arx][i]; + } + fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]); + fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT); + } + } + // Avoid flickering effect + // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); + fl_set_xyplot_ybounds(form->chest_t,0,ymax); + } + // Channel Frequency Response + if (chest_f != NULL) { + ind = 0; + for (atx=0; atxchest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce); + fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,3); + fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR); + fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","",""); + for (arx=1; arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); + } + // other tx antennas + if (nb_antennas_tx > 1) { + if (nb_antennas_rx > 1) { + for (atx=1; atxchest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); + } + } + } else { // 1 rx antenna + atx=1; + arx=0; + fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); + } + } + } + // PUSCH LLRs + if (pusch_llr != NULL) { + for (i=0; ipusch_llr,bit,llr,coded_bits_per_codeword,"","",""); + } + // PUSCH I/Q of MF Output + if (pusch_comp!=NULL) { + ind=0; + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_UL; i++) { + I[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i]; + Q[ind] = pusch_comp[(2*frame_parms->N_RB_UL*12*k)+2*i+1]; + ind++; + } + } + fl_set_xyplot_data(form->pusch_comp,I,Q,ind,"","",""); + } + // PUSCH I/Q of MF Output + if (pucch1ab_comp!=NULL) { + for (ind=0; ind<10240; ind++) { + I_pucch[ind] = (float)pucch1ab_comp[2*(ind)]; + Q_pucch[ind] = (float)pucch1ab_comp[2*(ind)+1]; + A_pucch[ind] = 10*log10(pucch1_comp[ind]); + B_pucch[ind] = ind; + C_pucch[ind] = (float)pucch1_thres[ind]; + } + fl_set_xyplot_data(form->pucch_comp,I_pucch,Q_pucch,10240,"","",""); + fl_set_xyplot_data(form->pucch_comp1,B_pucch,A_pucch,1024,"","",""); + fl_add_xyplot_overlay(form->pucch_comp1,1,B_pucch,C_pucch,1024,FL_RED); + fl_set_xyplot_ybounds(form->pucch_comp,-5000,5000); + fl_set_xyplot_xbounds(form->pucch_comp,-5000,5000); + fl_set_xyplot_ybounds(form->pucch_comp1,0,80); + } + // PUSCH Throughput + memmove( tput_time_enb[UE_id], &tput_time_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) ); + memmove( tput_enb[UE_id], &tput_enb[UE_id][1], (TPUT_WINDOW_LENGTH-1)*sizeof(float) ); + tput_time_enb[UE_id][TPUT_WINDOW_LENGTH-1] = (float) frame; + tput_enb[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0; + fl_set_xyplot_data(form->pusch_tput,tput_time_enb[UE_id],tput_enb[UE_id],TPUT_WINDOW_LENGTH,"","",""); + // fl_get_xyplot_ybounds(form->pusch_tput,&ymin,&ymax); + // fl_set_xyplot_ybounds(form->pusch_tput,0,ymax); + fl_check_forms(); + free(llr); + free(bit); + free(chest_f_abs); +} +FD_lte_phy_scope_ue *create_lte_phy_scope_ue( void ) { + FL_OBJECT *obj; + FD_lte_phy_scope_ue *fdui = fl_malloc( sizeof *fdui ); + // Define form + fdui->lte_phy_scope_ue = fl_bgn_form( FL_NO_BOX, 800, 1000 ); + // This the whole UI box + obj = fl_add_box( FL_BORDER_BOX, 0, 0, 800, 1000, "" ); + fl_set_object_color( obj, FL_BLACK, FL_BLACK ); + // Received signal + fdui->rxsig_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 20, 370, 100, "Received Signal (Time-Domain, dB)" ); + fl_set_object_boxtype( fdui->rxsig_t, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->rxsig_t, FL_BLACK, FL_RED ); + fl_set_object_lcolor( fdui->rxsig_t, FL_WHITE ); // Label color + fl_set_xyplot_ybounds(fdui->rxsig_t,30,70); + // Time-domain channel response + fdui->chest_t = fl_add_xyplot( FL_NORMAL_XYPLOT, 410, 20, 370, 100, "Channel Impulse Response (samples, abs)" ); + fl_set_object_boxtype( fdui->chest_t, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->chest_t, FL_BLACK, FL_RED ); + fl_set_object_lcolor( fdui->chest_t, FL_WHITE ); // Label color + // Frequency-domain channel response + fdui->chest_f = fl_add_xyplot( FL_IMPULSE_XYPLOT, 20, 140, 760, 100, "Channel Frequency Response (RE, dB)" ); + fl_set_object_boxtype( fdui->chest_f, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->chest_f, FL_BLACK, FL_RED ); + fl_set_object_lcolor( fdui->chest_f, FL_WHITE ); // Label color + fl_set_xyplot_ybounds( fdui->chest_f,30,70); + /* + // LLR of PBCH + fdui->pbch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 260, 500, 100, "PBCH Log-Likelihood Ratios (LLR, mag)" ); + fl_set_object_boxtype( fdui->pbch_llr, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pbch_llr, FL_BLACK, FL_GREEN ); + fl_set_object_lcolor( fdui->pbch_llr, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pbch_llr,2); + fl_set_xyplot_xgrid( fdui->pbch_llr,FL_GRID_MAJOR); + fl_set_xyplot_xbounds( fdui->pbch_llr,0,1920); + // I/Q PBCH comp + fdui->pbch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 260, 240, 100, "PBCH I/Q of MF Output" ); + fl_set_object_boxtype( fdui->pbch_comp, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pbch_comp, FL_BLACK, FL_GREEN ); + fl_set_object_lcolor( fdui->pbch_comp, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pbch_comp,2); + fl_set_xyplot_xbounds( fdui->pbch_comp,-100,100); + fl_set_xyplot_ybounds( fdui->pbch_comp,-100,100); + // LLR of PDCCH + fdui->pdcch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 380, 500, 100, "PDCCH Log-Likelihood Ratios (LLR, mag)" ); + fl_set_object_boxtype( fdui->pdcch_llr, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdcch_llr, FL_BLACK, FL_CYAN ); + fl_set_object_lcolor( fdui->pdcch_llr, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdcch_llr,2); + // I/Q PDCCH comp + fdui->pdcch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 380, 240, 100, "PDCCH I/Q of MF Output" ); + fl_set_object_boxtype( fdui->pdcch_comp, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdcch_comp, FL_BLACK, FL_CYAN ); + fl_set_object_lcolor( fdui->pdcch_comp, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdcch_comp,2); + fl_set_xyplot_xgrid( fdui->pdcch_llr,FL_GRID_MAJOR); + */ + int offset=240; + // LLR of PDSCH + fdui->pdsch_llr = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 500-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" ); + fl_set_object_boxtype( fdui->pdsch_llr, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdsch_llr, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pdsch_llr, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdsch_llr,2); + fl_set_xyplot_xgrid( fdui->pdsch_llr,FL_GRID_MAJOR); + // I/Q PDSCH comp + fdui->pdsch_comp = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 500-offset, 240, 200, "PDSCH I/Q of MF Output" ); + fl_set_object_boxtype( fdui->pdsch_comp, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdsch_comp, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pdsch_comp, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdsch_comp,2); + // LLR of PDSCH + fdui->pdsch_llr1 = fl_add_xyplot( FL_POINTS_XYPLOT, 20, 720-offset, 500, 200, "PDSCH Log-Likelihood Ratios (LLR, mag)" ); + fl_set_object_boxtype( fdui->pdsch_llr1, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdsch_llr1, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pdsch_llr1, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdsch_llr1,2); + fl_set_xyplot_xgrid( fdui->pdsch_llr1,FL_GRID_MAJOR); + // I/Q PDSCH comp + fdui->pdsch_comp1 = fl_add_xyplot( FL_POINTS_XYPLOT, 540, 720-offset, 240, 200, "PDSCH I/Q of MF Output" ); + fl_set_object_boxtype( fdui->pdsch_comp1, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdsch_comp1, FL_BLACK, FL_YELLOW ); + fl_set_object_lcolor( fdui->pdsch_comp1, FL_WHITE ); // Label color + fl_set_xyplot_symbolsize( fdui->pdsch_comp1,2); + /* + // Throughput on PDSCH + fdui->pdsch_tput = fl_add_xyplot( FL_NORMAL_XYPLOT, 20, 720, 500, 100, "PDSCH Throughput [frame]/[kbit/s]" ); + fl_set_object_boxtype( fdui->pdsch_tput, FL_EMBOSSED_BOX ); + fl_set_object_color( fdui->pdsch_tput, FL_BLACK, FL_WHITE ); + fl_set_object_lcolor( fdui->pdsch_tput, FL_WHITE ); // Label color + */ + // Generic UE Button + fdui->button_0 = fl_add_button( FL_PUSH_BUTTON, 540, 720, 240, 40, "" ); + fl_set_object_lalign(fdui->button_0, FL_ALIGN_CENTER ); + //use_sic_receiver = 0; + fl_set_button(fdui->button_0,0); + fl_set_object_label(fdui->button_0, "SIC Receiver OFF"); + fl_set_object_color(fdui->button_0, FL_RED, FL_RED); + fl_set_object_callback(fdui->button_0, sic_receiver_on_off, 0 ); + fl_hide_object(fdui->button_0); + + fl_end_form( ); + fdui->lte_phy_scope_ue->fdui = fdui; + return fdui; +} +void phy_scope_UE(FD_lte_phy_scope_ue *form, + PHY_VARS_UE *phy_vars_ue, + int eNB_id, + int UE_id, + uint8_t subframe){ + int i,arx,atx,ind,k; + LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_ue->frame_parms; + int nsymb_ce = frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti; + uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx; + uint8_t nb_antennas_tx = frame_parms->nb_antenna_ports_eNB; + int16_t **rxsig_t; + int16_t **chest_t; + int16_t **chest_f; + int16_t *pdsch_llr,*pdsch_llr1; + int16_t *pdsch_comp,*pdsch_comp1; + int16_t *pdsch_mag0,*pdsch_mag1,*pdsch_magb0,*pdsch_magb1; + int8_t *pdcch_llr; + int16_t *pdcch_comp; + int8_t *pbch_llr; + int16_t *pbch_comp; + float Re,Im,ymax=1; + int num_pdcch_symbols=3; + float *llr0, *bit0, *llr1, *bit1, *chest_f_abs, llr_pbch[1920], bit_pbch[1920], *llr_pdcch, *bit_pdcch; + float *I, *Q; + float rxsig_t_dB[nb_antennas_rx][FRAME_LENGTH_COMPLEX_SAMPLES]; + float **chest_t_abs; + float time[FRAME_LENGTH_COMPLEX_SAMPLES]; + float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx]; + int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx; + uint32_t total_dlsch_bitrate = phy_vars_ue->bitrate[eNB_id]; + int coded_bits_per_codeword0=0,coded_bits_per_codeword1=1; + int mod0,mod1; + int mcs0 = 0; + int mcs1=0; + unsigned char harq_pid = 0; + int beamforming_mode = phy_vars_ue->transmission_mode[eNB_id]>6 ? phy_vars_ue->transmission_mode[eNB_id] : 0; + if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) { + harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->current_harq_pid; + if (harq_pid>=8) + return; + mcs0 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->mcs; + // Button 0 + /* + if(!phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off) { + // we are in TM5 + fl_show_object(form->button_0); + } + */ + } + fl_show_object(form->button_0); + if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) { + harq_pid = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->current_harq_pid; + if (harq_pid>=8) + return; + mcs1 = phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->mcs; + } + if (phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]!=NULL) { + num_pdcch_symbols = phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->num_pdcch_symbols; + } + // coded_bits_per_codeword = frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); + if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]!=NULL) { + mod0 = get_Qm(mcs0); + coded_bits_per_codeword0 = get_G(frame_parms, + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb, + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, + get_Qm(mcs0), + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl, + num_pdcch_symbols, + frame, + subframe, + beamforming_mode); + } else { + coded_bits_per_codeword0 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); + mod0=0; + } + if (phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]!=NULL) { + mod1 = get_Qm(mcs1); + coded_bits_per_codeword1 = get_G(frame_parms, + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->nb_rb, + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->rb_alloc_even, + get_Qm(mcs1), + phy_vars_ue->dlsch[phy_vars_ue->current_thread_id[subframe]][eNB_id][1]->harq_processes[harq_pid]->Nl, + num_pdcch_symbols, + frame, + subframe, + beamforming_mode); + } else { + coded_bits_per_codeword1 = 0; //frame_parms->N_RB_DL*12*get_Qm(mcs)*(frame_parms->symbols_per_tti); + mod1=0; + } + I = (float*) calloc(nsymb_ce*2,sizeof(float)); + Q = (float*) calloc(nsymb_ce*2,sizeof(float)); + chest_t_abs = (float**) malloc(nb_antennas_rx*sizeof(float*)); + for (arx=0;arxofdm_symbol_size,sizeof(float)); + } + chest_f_abs = (float*) calloc(nsymb_ce*nb_antennas_rx*nb_antennas_tx,sizeof(float)); + llr0 = (float*) calloc(coded_bits_per_codeword0,sizeof(float)); // init to zero + bit0 = malloc(coded_bits_per_codeword0*sizeof(float)); + llr1 = (float*) calloc(coded_bits_per_codeword1,sizeof(float)); // init to zero + bit1 = malloc(coded_bits_per_codeword1*sizeof(float)); + llr_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); // init to zero + bit_pdcch = (float*) calloc(12*frame_parms->N_RB_DL*num_pdcch_symbols*2,sizeof(float)); + rxsig_t = (int16_t**) phy_vars_ue->common_vars.rxdata; + chest_t = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates_time[eNB_id]; + chest_f = (int16_t**) phy_vars_ue->common_vars.common_vars_rx_data_per_thread[phy_vars_ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id]; + pbch_llr = (int8_t*) phy_vars_ue->pbch_vars[eNB_id]->llr; + pbch_comp = (int16_t*) phy_vars_ue->pbch_vars[eNB_id]->rxdataF_comp[0]; + pdcch_llr = (int8_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr; + pdcch_comp = (int16_t*) phy_vars_ue->pdcch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0]; + pdsch_llr = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[0]; // stream 0 + pdsch_llr1 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->llr[1]; // stream 1 + pdsch_comp = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp0[0]; + //pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[0]; + //pdsch_comp1 = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_ext[1]; + pdsch_comp1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[0][0])[0]; + //pdsch_comp1 = (int16_t*) (phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[0][0])[0]; + pdsch_mag0 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag0[0]; + pdsch_mag1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_mag1[0][0])[0]; + pdsch_magb0 = (int16_t*) phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb0[0]; + pdsch_magb1 = (int16_t*) (phy_vars_ue->pdsch_vars[phy_vars_ue->current_thread_id[subframe]][eNB_id]->dl_ch_magb1[0][0])[0]; + fl_freeze_form(form->lte_phy_scope_ue); + // Received signal in time domain of receive antenna 0 + if (rxsig_t != NULL) { + if (rxsig_t[0] != NULL) { + for (i=0; irxsig_t,time,rxsig_t_dB[0],FRAME_LENGTH_COMPLEX_SAMPLES,"","",""); + } + for (arx=1;arxrxsig_t,arx,time,rxsig_t_dB[arx],FRAME_LENGTH_COMPLEX_SAMPLES,rx_antenna_colors[arx]); + } + } + } + // Channel Impulse Response (still repeated format) + if (chest_t != NULL) { + ymax = 0; + if (chest_t[0] !=NULL) { + for (i=0; i<(frame_parms->ofdm_symbol_size>>3); i++) { + chest_t_abs[0][i] = (float) (chest_t[0][4*i]*chest_t[0][4*i]+chest_t[0][4*i+1]*chest_t[0][4*i+1]); + if (chest_t_abs[0][i] > ymax) + ymax = chest_t_abs[0][i]; + } + fl_set_xyplot_data(form->chest_t,time,chest_t_abs[0],(frame_parms->ofdm_symbol_size>>3),"","",""); + } + for (arx=1; arxofdm_symbol_size>>3); i++) { + chest_t_abs[arx][i] = (float) (chest_t[arx][4*i]*chest_t[arx][4*i]+chest_t[arx][4*i+1]*chest_t[arx][4*i+1]); + if (chest_t_abs[arx][i] > ymax) + ymax = chest_t_abs[arx][i]; + } + fl_add_xyplot_overlay(form->chest_t,arx,time,chest_t_abs[arx],(frame_parms->ofdm_symbol_size>>3),rx_antenna_colors[arx]); + fl_set_xyplot_overlay_type(form->chest_t,arx,FL_DASHED_XYPLOT); + } + } + // Avoid flickering effect + // fl_get_xyplot_ybounds(form->chest_t,&ymin,&ymax); + fl_set_xyplot_ybounds(form->chest_t,0,ymax); + } + // Channel Frequency Response (includes 5 complex sample for filter) + if (chest_f != NULL) { + ind = 0; + for (atx=0;atxchest_f,0,nb_antennas_rx*nb_antennas_tx*nsymb_ce); + //fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*frame_parms->symbols_per_tti,2); + // fl_set_xyplot_xtics(form->chest_f,nb_antennas_rx*nb_antennas_tx*2,2); + fl_set_xyplot_xgrid(form->chest_f,FL_GRID_MAJOR); + fl_set_xyplot_data(form->chest_f,freq,chest_f_abs,nsymb_ce,"","",""); + for (arx=1;arxchest_f,1,&freq[arx*nsymb_ce],&chest_f_abs[arx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); + } + // other tx antennas + if (nb_antennas_tx > 1) { + if (nb_antennas_rx > 1) { + for (atx=1;atxchest_f,(atx<<1)+arx,&freq[((atx<<1)+arx)*nsymb_ce],&chest_f_abs[((atx<<1)+arx)*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); + } + } + } else { // 1 rx antenna + atx=1; arx=0; + fl_add_xyplot_overlay(form->chest_f,atx,&freq[atx*nsymb_ce],&chest_f_abs[atx*nsymb_ce],nsymb_ce,rx_antenna_colors[arx]); + } + } + } + /* + // PBCH LLRs + if (pbch_llr != NULL) { + for (i=0; i<1920;i++) { + llr_pbch[i] = (float) pbch_llr[i]; + bit_pbch[i] = (float) i; + } + fl_set_xyplot_data(form->pbch_llr,bit_pbch,llr_pbch,1920,"","",""); + } + // PBCH I/Q of MF Output + if (pbch_comp!=NULL) { + for (i=0; i<72*2; i++) { + I[i] = pbch_comp[2*i]; + Q[i] = pbch_comp[2*i+1]; + } + fl_set_xyplot_data(form->pbch_comp,I,Q,72*2,"","",""); + } + // PDCCH LLRs + if (pdcch_llr != NULL) { + for (i=0; i<12*frame_parms->N_RB_DL*2*num_pdcch_symbols;i++) { + llr_pdcch[i] = (float) pdcch_llr[i]; + bit_pdcch[i] = (float) i; + } + fl_set_xyplot_xbounds(form->pdcch_llr,0,12*frame_parms->N_RB_DL*2*3); + fl_set_xyplot_data(form->pdcch_llr,bit_pdcch,llr_pdcch,12*frame_parms->N_RB_DL*2*num_pdcch_symbols,"","",""); + } + // PDCCH I/Q of MF Output + if (pdcch_comp!=NULL) { + for (i=0; i<12*frame_parms->N_RB_DL*num_pdcch_symbols; i++) { + I[i] = pdcch_comp[2*i]; + Q[i] = pdcch_comp[2*i+1]; + } + fl_set_xyplot_data(form->pdcch_comp,I,Q,12*frame_parms->N_RB_DL*num_pdcch_symbols,"","",""); + } + */ + // PDSCH LLRs CW0 + if (pdsch_llr != NULL) { + for (i=0; ipdsch_llr,0,coded_bits_per_codeword0); + fl_set_xyplot_data(form->pdsch_llr,bit0,llr0,coded_bits_per_codeword0,"","",""); + } + // PDSCH I/Q of MF Output + if (pdsch_comp!=NULL) { + ind=0; + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + I[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i]; + Q[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i+1]; + ind++; + } + } + fl_set_xyplot_data(form->pdsch_comp,I,Q,ind,"","",""); + } + if (pdsch_mag0 != NULL) { + ind=0; + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + I[ind] = pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + Q[ind] = pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + ind++; + } + } + fl_add_xyplot_overlay(form->pdsch_comp,1,I,Q,ind,FL_GREEN); + } + if (pdsch_magb0 != NULL) { + ind=0; + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + I[ind] = pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + Q[ind] = pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + ind++; + } + } + fl_add_xyplot_overlay(form->pdsch_comp,2,I,Q,ind,FL_RED); + } + if ((pdsch_mag0 != NULL) && (pdsch_magb0 != NULL)) { + ind=0; + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + I[ind] = + (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i]+ + pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i])* + cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + Q[ind] = + (pdsch_mag0[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+ + pdsch_magb0[(2*frame_parms->N_RB_DL*12*k)+4*i+1])* + sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + ind++; + } + } + fl_add_xyplot_overlay(form->pdsch_comp,3,I,Q,ind,FL_BLUE); + } + // PDSCH LLRs CW1 + if (pdsch_llr1 != NULL) { + for (i=0; ipdsch_llr1,0,coded_bits_per_codeword1); + fl_set_xyplot_data(form->pdsch_llr1,bit1,llr1,coded_bits_per_codeword1,"","",""); + } + // PDSCH I/Q of MF Output + if (pdsch_comp1!=NULL) { + ind=0; + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + I[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i]; + Q[ind] = pdsch_comp1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]; + ind++; + } + } + fl_set_xyplot_data(form->pdsch_comp1,I,Q,ind,"","",""); + } + if (pdsch_mag1 != NULL) { + ind=0; + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + I[ind] = pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + Q[ind] = pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + ind++; + } + } + fl_add_xyplot_overlay(form->pdsch_comp1,1,I,Q,ind,FL_GREEN); + } + if (pdsch_magb1 != NULL) { + ind=0; + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + I[ind] = pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i]*cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + Q[ind] = pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]*sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + ind++; + } + } + fl_add_xyplot_overlay(form->pdsch_comp1,2,I,Q,ind,FL_RED); + } + if ((pdsch_mag1 != NULL) && (pdsch_magb1 != NULL)) { + ind=0; + for (k=0; ksymbols_per_tti; k++) { + for (i=0; i<12*frame_parms->N_RB_DL/2; i++) { + I[ind] = + (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i]+ + pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i])* + cos(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + Q[ind] = + (pdsch_mag1[(2*frame_parms->N_RB_DL*12*k)+4*i+1]+ + pdsch_magb1[(2*frame_parms->N_RB_DL*12*k)+4*i+1])* + sin(i*2*M_PI/(12*frame_parms->N_RB_DL/2)); + ind++; + } + } + fl_add_xyplot_overlay(form->pdsch_comp1,3,I,Q,ind,FL_BLUE); + } + /* + // PDSCH Throughput + memcpy((void*)tput_time_ue[UE_id],(void*)&tput_time_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float)); + memcpy((void*)tput_ue[UE_id],(void*)&tput_ue[UE_id][1],(TPUT_WINDOW_LENGTH-1)*sizeof(float)); + tput_time_ue[UE_id][TPUT_WINDOW_LENGTH-1] = (float) frame; + tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] = ((float) total_dlsch_bitrate)/1000.0; + if (tput_ue[UE_id][TPUT_WINDOW_LENGTH-1] > tput_ue_max[UE_id]) { + tput_ue_max[UE_id] = tput_ue[UE_id][TPUT_WINDOW_LENGTH-1]; + } + fl_set_xyplot_data(form->pdsch_tput,tput_time_ue[UE_id],tput_ue[UE_id],TPUT_WINDOW_LENGTH,"","",""); + fl_set_xyplot_ybounds(form->pdsch_tput,0,tput_ue_max[UE_id]); + */ + fl_unfreeze_form(form->lte_phy_scope_ue); + fl_check_forms(); + free(I); + free(Q); + free(chest_f_abs); + free(llr0); + free(bit0); + free(llr1); + free(bit1); + free(bit_pdcch); + free(llr_pdcch); + for (arx=0;arxtransmission_mode[eNB_id]==3 && phy_vars_ue->transmission_mode[eNB_id]==4){ + for (int i = 0; i<8; ++i) + for (int j = 0; j < 7*2*frame_parms->N_RB_DL*12+4; ++j ) + phy_vars_ue->pdsch_vars[subframe&0x1][eNB_id]->rxdataF_comp1[0][0][i][j]=0; + + for (int m=0; mpdsch_vars[subframe&0x1][eNB_id]->llr[0][m]=0; + }*/ + } + + diff --git a/openair1/PHY/TOOLS/lut.c b/openair1/PHY/TOOLS/lut.c index 5e6602c7f2..f58a06c8ae 100644 --- a/openair1/PHY/TOOLS/lut.c +++ b/openair1/PHY/TOOLS/lut.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ double interp(double x, double *xs, double *ys, int count) { int i; diff --git a/openair1/PHY/TOOLS/memory_routines.c b/openair1/PHY/TOOLS/memory_routines.c old mode 100755 new mode 100644 index 4da4d89cb6..cef9928988 --- a/openair1/PHY/TOOLS/memory_routines.c +++ b/openair1/PHY/TOOLS/memory_routines.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/sse_intrin.h" void Zero_Buffer(void *buf,unsigned int length) diff --git a/openair1/PHY/TOOLS/read_F.c b/openair1/PHY/TOOLS/read_F.c new file mode 100644 index 0000000000..32ade0dfdb --- /dev/null +++ b/openair1/PHY/TOOLS/read_F.c @@ -0,0 +1,24 @@ +#include +#include + +int f_read(char *calibF_fname, int nb_antM, int nb_freq, int16_t (*calibF_mtx)[nb_freq*2]){ + + FILE *calibF_fd; + int i,j,l,calibF_e; + + calibF_fd = fopen(calibF_fname,"r"); + + if (calibF_fd) { + printf("Loading Calibration matrix from %s\n", calibF_fname); + + for(i=0;i. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" #include "PHY/sse_intrin.h" @@ -255,7 +248,7 @@ int32_t signal_energy_nodc(int32_t *input,uint32_t length) } #endif -double signal_energy_fp(double **s_re,double **s_im,uint32_t nb_antennas,uint32_t length,uint32_t offset) +double signal_energy_fp(double *s_re[2],double *s_im[2],uint32_t nb_antennas,uint32_t length,uint32_t offset) { int32_t aa,i; diff --git a/openair1/PHY/TOOLS/smbv.c b/openair1/PHY/TOOLS/smbv.c index b7de63f483..e020ca0c52 100644 --- a/openair1/PHY/TOOLS/smbv.c +++ b/openair1/PHY/TOOLS/smbv.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* This library offers some functions to remotely program the R&S SMBV100A. @@ -127,7 +119,7 @@ int smbv_write_config_from_frame_parms(const char* fname, LTE_DL_FRAME_PARMS *fr fprintf(f_ptr, "BB:EUTR:TDD:SPSC %d\n",frame_parms->tdd_config_S); // MIMO - fprintf(f_ptr, "BB:EUTR:DL:MIMO:CONF TX%d\n",frame_parms->nb_antennas_tx_eNB); + fprintf(f_ptr, "BB:EUTR:DL:MIMO:CONF TX%d\n",frame_parms->nb_antenna_ports_eNB); fprintf(f_ptr, "BB:EUTR:DL:MIMO:ANTA ANT1\n"); fprintf(f_ptr, "BB:EUTR:DL:MIMO:ANTB NONE\n"); diff --git a/openair1/PHY/TOOLS/smbv.h b/openair1/PHY/TOOLS/smbv.h index c52b50f038..127cd3f7b9 100644 --- a/openair1/PHY/TOOLS/smbv.h +++ b/openair1/PHY/TOOLS/smbv.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* This library offers some functions to remotely program the R&S SMBV100A. diff --git a/openair1/PHY/TOOLS/sqrt.c b/openair1/PHY/TOOLS/sqrt.c old mode 100755 new mode 100644 index 247cfa138f..e6a4d9bb24 --- a/openair1/PHY/TOOLS/sqrt.c +++ b/openair1/PHY/TOOLS/sqrt.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + //---------------------------------------------- // // Integer square root. Take the square root of an integer. diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c index ba1014e9a0..d80832e243 100644 --- a/openair1/PHY/TOOLS/time_meas.c +++ b/openair1/PHY/TOOLS/time_meas.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #include #include "time_meas.h" #include @@ -48,7 +41,7 @@ double get_cpu_freq_GHz(void) { return cpu_freq_GHz; } -void print_meas_now(time_stats_t *ts, const char* name, int subframe, FILE* file_name){ +void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name){ if (opp_enabled) { @@ -90,9 +83,8 @@ void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_ti //printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials); if ((total_exec_time == NULL) || (sf_exec_time== NULL)) { - fprintf(stderr, "%25s: %15.3f ms ; %15.3f us; %15d;\n", + fprintf(stderr, "%25s: %15.3f us; %15d;\n", name, - (ts->diff/cpu_freq_GHz/1000000.0), (ts->diff/ts->trials/cpu_freq_GHz/1000.0), ts->trials); } else { diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h index 3e621ac281..32e6883d56 100644 --- a/openair1/PHY/TOOLS/time_meas.h +++ b/openair1/PHY/TOOLS/time_meas.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __TIME_MEAS_DEFS__H__ #define __TIME_MEAS_DEFS__H__ @@ -52,6 +45,7 @@ typedef struct { long long diff_square; /*!< \brief process duration square */ long long max; int trials; + int meas_flag; } time_stats_t; #elif defined(__arm__) typedef struct { @@ -69,7 +63,7 @@ static inline void start_meas(time_stats_t *ts) __attribute__((always_inline)); static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline)); -void print_meas_now(time_stats_t *ts, const char* name, int subframe, FILE* file_name); +void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name); void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time); double get_time_meas_us(time_stats_t *ts); double get_cpu_freq_GHz(void); @@ -105,9 +99,14 @@ static inline void start_meas(time_stats_t *ts) { if (opp_enabled) { - + if (ts->meas_flag==0) { ts->trials++; ts->in = rdtsc_oai(); + ts->meas_flag=1; + } + else { + ts->in = rdtsc_oai(); + } } } @@ -127,7 +126,8 @@ static inline void stop_meas(time_stats_t *ts) if ((out-ts->in) > ts->max) ts->max = out-ts->in; - + + ts->meas_flag=0; } } @@ -139,6 +139,7 @@ static inline void reset_meas(time_stats_t *ts) { ts->p_time=0; ts->diff_square=0; ts->max=0; + ts->meas_flag=0; } diff --git a/openair1/PHY/TOOLS/twiddle12288.h b/openair1/PHY/TOOLS/twiddle12288.h index bc1226c67e..17fa92f4e9 100644 --- a/openair1/PHY/TOOLS/twiddle12288.h +++ b/openair1/PHY/TOOLS/twiddle12288.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:4095)/12288)); twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:8190)/12288)); @@ -39,7 +32,7 @@ twb2(2:2:end) = imag(twb); */ -int16_t twa12288[8192] __attribute__((aligned(16))) = {32767,0,32766,-17,32766,-34,32766,-51,32766,-68,32766,-84,32766,-101,32766,-118,32766,-135,32766,-151,32766,-168,32766,-185,32766,-202,32766,-218,32766,-235,32766,-252,32765,-269,32765,-285,32765,-302,32765,-319,32765,-336,32765,-352,32764,-369,32764,-386,32764,-403,32764,-419,32764,-436,32763,-453,32763,-470,32763,-486,32763,-503,32762,-520,32762,-537,32762,-553,32762,-570,32761,-587,32761,-604,32761,-620,32760,-637,32760,-654,32760,-671,32759,-687,32759,-704,32759,-721,32758,-738,32758,-754,32757,-771,32757,-788,32757,-805,32756,-821,32756,-838,32755,-855,32755,-872,32754,-888,32754,-905,32754,-922,32753,-939,32753,-955,32752,-972,32752,-989,32751,-1006,32751,-1022,32750,-1039,32750,-1056,32749,-1073,32748,-1089,32748,-1106,32747,-1123,32747,-1140,32746,-1156,32746,-1173,32745,-1190,32744,-1207,32744,-1223,32743,-1240,32742,-1257,32742,-1274,32741,-1290,32740,-1307,32740,-1324,32739,-1340,32738,-1357,32738,-1374,32737,-1391,32736,-1407,32736,-1424,32735,-1441,32734,-1458,32733,-1474,32733,-1491,32732,-1508,32731,-1525,32730,-1541,32729,-1558,32729,-1575,32728,-1592,32727,-1608,32726,-1625,32725,-1642,32725,-1659,32724,-1675,32723,-1692,32722,-1709,32721,-1725,32720,-1742,32719,-1759,32718,-1776,32717,-1792,32717,-1809,32716,-1826,32715,-1843,32714,-1859,32713,-1876,32712,-1893,32711,-1909,32710,-1926,32709,-1943,32708,-1960,32707,-1976,32706,-1993,32705,-2010,32704,-2027,32703,-2043,32702,-2060,32701,-2077,32700,-2093,32699,-2110,32697,-2127,32696,-2144,32695,-2160,32694,-2177,32693,-2194,32692,-2210,32691,-2227,32690,-2244,32688,-2261,32687,-2277,32686,-2294,32685,-2311,32684,-2327,32683,-2344,32681,-2361,32680,-2378,32679,-2394,32678,-2411,32676,-2428,32675,-2444,32674,-2461,32673,-2478,32671,-2495,32670,-2511,32669,-2528,32668,-2545,32666,-2561,32665,-2578,32664,-2595,32662,-2611,32661,-2628,32660,-2645,32658,-2662,32657,-2678,32656,-2695,32654,-2712,32653,-2728,32651,-2745,32650,-2762,32649,-2778,32647,-2795,32646,-2812,32644,-2829,32643,-2845,32641,-2862,32640,-2879,32638,-2895,32637,-2912,32635,-2929,32634,-2945,32632,-2962,32631,-2979,32629,-2995,32628,-3012,32626,-3029,32625,-3045,32623,-3062,32622,-3079,32620,-3095,32618,-3112,32617,-3129,32615,-3146,32614,-3162,32612,-3179,32610,-3196,32609,-3212,32607,-3229,32605,-3246,32604,-3262,32602,-3279,32600,-3296,32599,-3312,32597,-3329,32595,-3346,32594,-3362,32592,-3379,32590,-3396,32588,-3412,32587,-3429,32585,-3446,32583,-3462,32581,-3479,32580,-3496,32578,-3512,32576,-3529,32574,-3546,32572,-3562,32571,-3579,32569,-3595,32567,-3612,32565,-3629,32563,-3645,32561,-3662,32559,-3679,32558,-3695,32556,-3712,32554,-3729,32552,-3745,32550,-3762,32548,-3779,32546,-3795,32544,-3812,32542,-3829,32540,-3845,32538,-3862,32536,-3878,32534,-3895,32532,-3912,32530,-3928,32528,-3945,32526,-3962,32524,-3978,32522,-3995,32520,-4012,32518,-4028,32516,-4045,32514,-4061,32512,-4078,32510,-4095,32508,-4111,32506,-4128,32503,-4145,32501,-4161,32499,-4178,32497,-4194,32495,-4211,32493,-4228,32491,-4244,32488,-4261,32486,-4277,32484,-4294,32482,-4311,32480,-4327,32477,-4344,32475,-4360,32473,-4377,32471,-4394,32468,-4410,32466,-4427,32464,-4444,32462,-4460,32459,-4477,32457,-4493,32455,-4510,32452,-4526,32450,-4543,32448,-4560,32445,-4576,32443,-4593,32441,-4609,32438,-4626,32436,-4643,32434,-4659,32431,-4676,32429,-4692,32426,-4709,32424,-4726,32422,-4742,32419,-4759,32417,-4775,32414,-4792,32412,-4808,32409,-4825,32407,-4842,32404,-4858,32402,-4875,32399,-4891,32397,-4908,32394,-4924,32392,-4941,32389,-4958,32387,-4974,32384,-4991,32382,-5007,32379,-5024,32377,-5040,32374,-5057,32371,-5073,32369,-5090,32366,-5107,32364,-5123,32361,-5140,32358,-5156,32356,-5173,32353,-5189,32350,-5206,32348,-5222,32345,-5239,32342,-5255,32340,-5272,32337,-5288,32334,-5305,32332,-5322,32329,-5338,32326,-5355,32323,-5371,32321,-5388,32318,-5404,32315,-5421,32312,-5437,32310,-5454,32307,-5470,32304,-5487,32301,-5503,32298,-5520,32295,-5536,32293,-5553,32290,-5569,32287,-5586,32284,-5602,32281,-5619,32278,-5635,32275,-5652,32273,-5668,32270,-5685,32267,-5701,32264,-5718,32261,-5734,32258,-5751,32255,-5767,32252,-5784,32249,-5800,32246,-5817,32243,-5833,32240,-5850,32237,-5866,32234,-5883,32231,-5899,32228,-5916,32225,-5932,32222,-5949,32219,-5965,32216,-5982,32213,-5998,32210,-6015,32207,-6031,32204,-6048,32201,-6064,32197,-6081,32194,-6097,32191,-6113,32188,-6130,32185,-6146,32182,-6163,32179,-6179,32176,-6196,32172,-6212,32169,-6229,32166,-6245,32163,-6262,32160,-6278,32156,-6294,32153,-6311,32150,-6327,32147,-6344,32143,-6360,32140,-6377,32137,-6393,32134,-6409,32130,-6426,32127,-6442,32124,-6459,32120,-6475,32117,-6492,32114,-6508,32110,-6524,32107,-6541,32104,-6557,32100,-6574,32097,-6590,32094,-6607,32090,-6623,32087,-6639,32084,-6656,32080,-6672,32077,-6689,32073,-6705,32070,-6721,32066,-6738,32063,-6754,32059,-6771,32056,-6787,32053,-6803,32049,-6820,32046,-6836,32042,-6852,32039,-6869,32035,-6885,32032,-6902,32028,-6918,32024,-6934,32021,-6951,32017,-6967,32014,-6983,32010,-7000,32007,-7016,32003,-7033,31999,-7049,31996,-7065,31992,-7082,31989,-7098,31985,-7114,31981,-7131,31978,-7147,31974,-7163,31970,-7180,31967,-7196,31963,-7212,31959,-7229,31956,-7245,31952,-7262,31948,-7278,31944,-7294,31941,-7311,31937,-7327,31933,-7343,31929,-7359,31926,-7376,31922,-7392,31918,-7408,31914,-7425,31911,-7441,31907,-7457,31903,-7474,31899,-7490,31895,-7506,31891,-7523,31888,-7539,31884,-7555,31880,-7572,31876,-7588,31872,-7604,31868,-7620,31864,-7637,31860,-7653,31856,-7669,31853,-7686,31849,-7702,31845,-7718,31841,-7734,31837,-7751,31833,-7767,31829,-7783,31825,-7800,31821,-7816,31817,-7832,31813,-7848,31809,-7865,31805,-7881,31801,-7897,31797,-7913,31793,-7930,31789,-7946,31785,-7962,31780,-7978,31776,-7995,31772,-8011,31768,-8027,31764,-8043,31760,-8060,31756,-8076,31752,-8092,31748,-8108,31743,-8125,31739,-8141,31735,-8157,31731,-8173,31727,-8190,31723,-8206,31718,-8222,31714,-8238,31710,-8254,31706,-8271,31701,-8287,31697,-8303,31693,-8319,31689,-8335,31684,-8352,31680,-8368,31676,-8384,31672,-8400,31667,-8416,31663,-8433,31659,-8449,31654,-8465,31650,-8481,31646,-8497,31641,-8514,31637,-8530,31633,-8546,31628,-8562,31624,-8578,31619,-8594,31615,-8611,31611,-8627,31606,-8643,31602,-8659,31597,-8675,31593,-8691,31588,-8708,31584,-8724,31580,-8740,31575,-8756,31571,-8772,31566,-8788,31562,-8804,31557,-8821,31553,-8837,31548,-8853,31544,-8869,31539,-8885,31534,-8901,31530,-8917,31525,-8933,31521,-8950,31516,-8966,31512,-8982,31507,-8998,31502,-9014,31498,-9030,31493,-9046,31489,-9062,31484,-9078,31479,-9095,31475,-9111,31470,-9127,31465,-9143,31461,-9159,31456,-9175,31451,-9191,31446,-9207,31442,-9223,31437,-9239,31432,-9255,31428,-9271,31423,-9288,31418,-9304,31413,-9320,31409,-9336,31404,-9352,31399,-9368,31394,-9384,31389,-9400,31385,-9416,31380,-9432,31375,-9448,31370,-9464,31365,-9480,31360,-9496,31356,-9512,31351,-9528,31346,-9544,31341,-9560,31336,-9576,31331,-9592,31326,-9608,31321,-9624,31316,-9640,31311,-9656,31307,-9672,31302,-9688,31297,-9704,31292,-9720,31287,-9736,31282,-9752,31277,-9768,31272,-9784,31267,-9800,31262,-9816,31257,-9832,31252,-9848,31247,-9864,31242,-9880,31236,-9896,31231,-9912,31226,-9928,31221,-9944,31216,-9960,31211,-9976,31206,-9992,31201,-10008,31196,-10024,31191,-10040,31185,-10056,31180,-10072,31175,-10088,31170,-10104,31165,-10120,31160,-10136,31154,-10152,31149,-10167,31144,-10183,31139,-10199,31134,-10215,31128,-10231,31123,-10247,31118,-10263,31113,-10279,31107,-10295,31102,-10311,31097,-10327,31092,-10343,31086,-10358,31081,-10374,31076,-10390,31070,-10406,31065,-10422,31060,-10438,31054,-10454,31049,-10470,31044,-10485,31038,-10501,31033,-10517,31028,-10533,31022,-10549,31017,-10565,31011,-10581,31006,-10597,31001,-10612,30995,-10628,30990,-10644,30984,-10660,30979,-10676,30973,-10692,30968,-10707,30962,-10723,30957,-10739,30951,-10755,30946,-10771,30940,-10787,30935,-10802,30929,-10818,30924,-10834,30918,-10850,30913,-10866,30907,-10881,30902,-10897,30896,-10913,30890,-10929,30885,-10945,30879,-10960,30874,-10976,30868,-10992,30862,-11008,30857,-11024,30851,-11039,30845,-11055,30840,-11071,30834,-11087,30828,-11102,30823,-11118,30817,-11134,30811,-11150,30806,-11165,30800,-11181,30794,-11197,30788,-11213,30783,-11228,30777,-11244,30771,-11260,30766,-11276,30760,-11291,30754,-11307,30748,-11323,30742,-11339,30737,-11354,30731,-11370,30725,-11386,30719,-11401,30713,-11417,30707,-11433,30702,-11449,30696,-11464,30690,-11480,30684,-11496,30678,-11511,30672,-11527,30666,-11543,30660,-11558,30655,-11574,30649,-11590,30643,-11605,30637,-11621,30631,-11637,30625,-11652,30619,-11668,30613,-11684,30607,-11699,30601,-11715,30595,-11731,30589,-11746,30583,-11762,30577,-11778,30571,-11793,30565,-11809,30559,-11824,30553,-11840,30547,-11856,30541,-11871,30535,-11887,30528,-11903,30522,-11918,30516,-11934,30510,-11949,30504,-11965,30498,-11981,30492,-11996,30486,-12012,30480,-12027,30473,-12043,30467,-12058,30461,-12074,30455,-12090,30449,-12105,30442,-12121,30436,-12136,30430,-12152,30424,-12167,30418,-12183,30411,-12199,30405,-12214,30399,-12230,30393,-12245,30386,-12261,30380,-12276,30374,-12292,30368,-12307,30361,-12323,30355,-12338,30349,-12354,30342,-12369,30336,-12385,30330,-12400,30323,-12416,30317,-12431,30311,-12447,30304,-12462,30298,-12478,30291,-12493,30285,-12509,30279,-12524,30272,-12540,30266,-12555,30259,-12571,30253,-12586,30247,-12602,30240,-12617,30234,-12633,30227,-12648,30221,-12664,30214,-12679,30208,-12695,30201,-12710,30195,-12725,30188,-12741,30182,-12756,30175,-12772,30169,-12787,30162,-12803,30156,-12818,30149,-12833,30142,-12849,30136,-12864,30129,-12880,30123,-12895,30116,-12910,30109,-12926,30103,-12941,30096,-12957,30090,-12972,30083,-12987,30076,-13003,30070,-13018,30063,-13034,30056,-13049,30050,-13064,30043,-13080,30036,-13095,30030,-13110,30023,-13126,30016,-13141,30009,-13156,30003,-13172,29996,-13187,29989,-13202,29983,-13218,29976,-13233,29969,-13248,29962,-13264,29955,-13279,29949,-13294,29942,-13310,29935,-13325,29928,-13340,29921,-13356,29915,-13371,29908,-13386,29901,-13401,29894,-13417,29887,-13432,29880,-13447,29873,-13463,29866,-13478,29860,-13493,29853,-13508,29846,-13524,29839,-13539,29832,-13554,29825,-13569,29818,-13585,29811,-13600,29804,-13615,29797,-13630,29790,-13646,29783,-13661,29776,-13676,29769,-13691,29762,-13707,29755,-13722,29748,-13737,29741,-13752,29734,-13767,29727,-13783,29720,-13798,29713,-13813,29706,-13828,29699,-13843,29692,-13859,29685,-13874,29678,-13889,29670,-13904,29663,-13919,29656,-13934,29649,-13950,29642,-13965,29635,-13980,29628,-13995,29621,-14010,29613,-14025,29606,-14040,29599,-14056,29592,-14071,29585,-14086,29577,-14101,29570,-14116,29563,-14131,29556,-14146,29548,-14161,29541,-14177,29534,-14192,29527,-14207,29519,-14222,29512,-14237,29505,-14252,29498,-14267,29490,-14282,29483,-14297,29476,-14312,29468,-14327,29461,-14343,29454,-14358,29446,-14373,29439,-14388,29432,-14403,29424,-14418,29417,-14433,29410,-14448,29402,-14463,29395,-14478,29387,-14493,29380,-14508,29372,-14523,29365,-14538,29358,-14553,29350,-14568,29343,-14583,29335,-14598,29328,-14613,29320,-14628,29313,-14643,29305,-14658,29298,-14673,29290,-14688,29283,-14703,29275,-14718,29268,-14733,29260,-14748,29253,-14763,29245,-14778,29238,-14793,29230,-14808,29222,-14823,29215,-14838,29207,-14853,29200,-14867,29192,-14882,29184,-14897,29177,-14912,29169,-14927,29162,-14942,29154,-14957,29146,-14972,29139,-14987,29131,-15002,29123,-15017,29116,-15031,29108,-15046,29100,-15061,29092,-15076,29085,-15091,29077,-15106,29069,-15121,29062,-15136,29054,-15150,29046,-15165,29038,-15180,29031,-15195,29023,-15210,29015,-15225,29007,-15239,28999,-15254,28992,-15269,28984,-15284,28976,-15299,28968,-15314,28960,-15328,28953,-15343,28945,-15358,28937,-15373,28929,-15388,28921,-15402,28913,-15417,28905,-15432,28897,-15447,28890,-15462,28882,-15476,28874,-15491,28866,-15506,28858,-15521,28850,-15535,28842,-15550,28834,-15565,28826,-15580,28818,-15594,28810,-15609,28802,-15624,28794,-15639,28786,-15653,28778,-15668,28770,-15683,28762,-15697,28754,-15712,28746,-15727,28738,-15741,28730,-15756,28722,-15771,28714,-15786,28706,-15800,28698,-15815,28690,-15830,28681,-15844,28673,-15859,28665,-15874,28657,-15888,28649,-15903,28641,-15918,28633,-15932,28625,-15947,28616,-15961,28608,-15976,28600,-15991,28592,-16005,28584,-16020,28575,-16035,28567,-16049,28559,-16064,28551,-16078,28543,-16093,28534,-16108,28526,-16122,28518,-16137,28510,-16151,28501,-16166,28493,-16180,28485,-16195,28477,-16210,28468,-16224,28460,-16239,28452,-16253,28443,-16268,28435,-16282,28427,-16297,28418,-16311,28410,-16326,28402,-16340,28393,-16355,28385,-16369,28377,-16384,28368,-16399,28360,-16413,28351,-16428,28343,-16442,28335,-16456,28326,-16471,28318,-16485,28309,-16500,28301,-16514,28292,-16529,28284,-16543,28275,-16558,28267,-16572,28259,-16587,28250,-16601,28242,-16616,28233,-16630,28225,-16644,28216,-16659,28208,-16673,28199,-16688,28190,-16702,28182,-16717,28173,-16731,28165,-16745,28156,-16760,28148,-16774,28139,-16789,28131,-16803,28122,-16817,28113,-16832,28105,-16846,28096,-16860,28087,-16875,28079,-16889,28070,-16904,28062,-16918,28053,-16932,28044,-16947,28036,-16961,28027,-16975,28018,-16990,28009,-17004,28001,-17018,27992,-17033,27983,-17047,27975,-17061,27966,-17075,27957,-17090,27948,-17104,27940,-17118,27931,-17133,27922,-17147,27913,-17161,27905,-17175,27896,-17190,27887,-17204,27878,-17218,27869,-17233,27861,-17247,27852,-17261,27843,-17275,27834,-17289,27825,-17304,27816,-17318,27808,-17332,27799,-17346,27790,-17361,27781,-17375,27772,-17389,27763,-17403,27754,-17417,27745,-17432,27736,-17446,27728,-17460,27719,-17474,27710,-17488,27701,-17502,27692,-17517,27683,-17531,27674,-17545,27665,-17559,27656,-17573,27647,-17587,27638,-17601,27629,-17616,27620,-17630,27611,-17644,27602,-17658,27593,-17672,27584,-17686,27575,-17700,27566,-17714,27557,-17728,27548,-17743,27538,-17757,27529,-17771,27520,-17785,27511,-17799,27502,-17813,27493,-17827,27484,-17841,27475,-17855,27466,-17869,27456,-17883,27447,-17897,27438,-17911,27429,-17925,27420,-17939,27411,-17953,27401,-17967,27392,-17981,27383,-17995,27374,-18009,27365,-18023,27355,-18037,27346,-18051,27337,-18065,27328,-18079,27319,-18093,27309,-18107,27300,-18121,27291,-18135,27281,-18149,27272,-18163,27263,-18177,27254,-18191,27244,-18205,27235,-18219,27226,-18233,27216,-18247,27207,-18261,27198,-18274,27188,-18288,27179,-18302,27170,-18316,27160,-18330,27151,-18344,27141,-18358,27132,-18372,27123,-18386,27113,-18399,27104,-18413,27094,-18427,27085,-18441,27076,-18455,27066,-18469,27057,-18483,27047,-18496,27038,-18510,27028,-18524,27019,-18538,27009,-18552,27000,-18565,26990,-18579,26981,-18593,26971,-18607,26962,-18621,26952,-18634,26943,-18648,26933,-18662,26924,-18676,26914,-18690,26905,-18703,26895,-18717,26885,-18731,26876,-18745,26866,-18758,26857,-18772,26847,-18786,26837,-18799,26828,-18813,26818,-18827,26809,-18841,26799,-18854,26789,-18868,26780,-18882,26770,-18895,26760,-18909,26751,-18923,26741,-18936,26731,-18950,26722,-18964,26712,-18977,26702,-18991,26692,-19005,26683,-19018,26673,-19032,26663,-19046,26654,-19059,26644,-19073,26634,-19087,26624,-19100,26615,-19114,26605,-19127,26595,-19141,26585,-19155,26575,-19168,26566,-19182,26556,-19195,26546,-19209,26536,-19222,26526,-19236,26516,-19250,26507,-19263,26497,-19277,26487,-19290,26477,-19304,26467,-19317,26457,-19331,26447,-19344,26437,-19358,26428,-19371,26418,-19385,26408,-19398,26398,-19412,26388,-19425,26378,-19439,26368,-19452,26358,-19466,26348,-19479,26338,-19493,26328,-19506,26318,-19520,26308,-19533,26298,-19547,26288,-19560,26278,-19574,26268,-19587,26258,-19600,26248,-19614,26238,-19627,26228,-19641,26218,-19654,26208,-19668,26198,-19681,26188,-19694,26178,-19708,26168,-19721,26158,-19734,26148,-19748,26137,-19761,26127,-19775,26117,-19788,26107,-19801,26097,-19815,26087,-19828,26077,-19841,26067,-19855,26056,-19868,26046,-19881,26036,-19895,26026,-19908,26016,-19921,26006,-19934,25995,-19948,25985,-19961,25975,-19974,25965,-19988,25954,-20001,25944,-20014,25934,-20027,25924,-20041,25913,-20054,25903,-20067,25893,-20080,25883,-20094,25872,-20107,25862,-20120,25852,-20133,25842,-20147,25831,-20160,25821,-20173,25811,-20186,25800,-20199,25790,-20213,25780,-20226,25769,-20239,25759,-20252,25749,-20265,25738,-20278,25728,-20292,25717,-20305,25707,-20318,25697,-20331,25686,-20344,25676,-20357,25665,-20370,25655,-20384,25645,-20397,25634,-20410,25624,-20423,25613,-20436,25603,-20449,25592,-20462,25582,-20475,25571,-20488,25561,-20501,25550,-20514,25540,-20528,25529,-20541,25519,-20554,25508,-20567,25498,-20580,25487,-20593,25477,-20606,25466,-20619,25456,-20632,25445,-20645,25435,-20658,25424,-20671,25414,-20684,25403,-20697,25392,-20710,25382,-20723,25371,-20736,25361,-20749,25350,-20762,25339,-20775,25329,-20788,25318,-20801,25307,-20814,25297,-20826,25286,-20839,25276,-20852,25265,-20865,25254,-20878,25243,-20891,25233,-20904,25222,-20917,25211,-20930,25201,-20943,25190,-20956,25179,-20968,25169,-20981,25158,-20994,25147,-21007,25136,-21020,25126,-21033,25115,-21046,25104,-21058,25093,-21071,25083,-21084,25072,-21097,25061,-21110,25050,-21123,25039,-21135,25029,-21148,25018,-21161,25007,-21174,24996,-21187,24985,-21199,24974,-21212,24964,-21225,24953,-21238,24942,-21250,24931,-21263,24920,-21276,24909,-21289,24898,-21301,24887,-21314,24877,-21327,24866,-21340,24855,-21352,24844,-21365,24833,-21378,24822,-21390,24811,-21403,24800,-21416,24789,-21428,24778,-21441,24767,-21454,24756,-21466,24745,-21479,24734,-21492,24723,-21504,24712,-21517,24701,-21530,24690,-21542,24679,-21555,24668,-21567,24657,-21580,24646,-21593,24635,-21605,24624,-21618,24613,-21630,24602,-21643,24591,-21656,24580,-21668,24569,-21681,24558,-21693,24546,-21706,24535,-21718,24524,-21731,24513,-21744,24502,-21756,24491,-21769,24480,-21781,24469,-21794,24457,-21806,24446,-21819,24435,-21831,24424,-21844,24413,-21856,24402,-21869,24390,-21881,24379,-21894,24368,-21906,24357,-21918,24346,-21931,24334,-21943,24323,-21956,24312,-21968,24301,-21981,24289,-21993,24278,-22005,24267,-22018,24256,-22030,24244,-22043,24233,-22055,24222,-22067,24211,-22080,24199,-22092,24188,-22105,24177,-22117,24165,-22129,24154,-22142,24143,-22154,24131,-22166,24120,-22179,24109,-22191,24097,-22203,24086,-22216,24075,-22228,24063,-22240,24052,-22253,24041,-22265,24029,-22277,24018,-22289,24006,-22302,23995,-22314,23984,-22326,23972,-22339,23961,-22351,23949,-22363,23938,-22375,23926,-22388,23915,-22400,23903,-22412,23892,-22424,23881,-22436,23869,-22449,23858,-22461,23846,-22473,23835,-22485,23823,-22497,23812,-22510,23800,-22522,23789,-22534,23777,-22546,23766,-22558,23754,-22570,23742,-22583,23731,-22595,23719,-22607,23708,-22619,23696,-22631,23685,-22643,23673,-22655,23661,-22667,23650,-22679,23638,-22692,23627,-22704,23615,-22716,23603,-22728,23592,-22740,23580,-22752,23569,-22764,23557,-22776,23545,-22788,23534,-22800,23522,-22812,23510,-22824,23499,-22836,23487,-22848,23475,-22860,23464,-22872,23452,-22884,23440,-22896,23428,-22908,23417,-22920,23405,-22932,23393,-22944,23382,-22956,23370,-22968,23358,-22980,23346,-22992,23335,-23004,23323,-23016,23311,-23028,23299,-23040,23287,-23051,23276,-23063,23264,-23075,23252,-23087,23240,-23099,23228,-23111,23217,-23123,23205,-23135,23193,-23147,23181,-23158,23169,-23170,23157,-23182,23146,-23194,23134,-23206,23122,-23218,23110,-23229,23098,-23241,23086,-23253,23074,-23265,23062,-23277,23050,-23288,23039,-23300,23027,-23312,23015,-23324,23003,-23336,22991,-23347,22979,-23359,22967,-23371,22955,-23383,22943,-23394,22931,-23406,22919,-23418,22907,-23429,22895,-23441,22883,-23453,22871,-23465,22859,-23476,22847,-23488,22835,-23500,22823,-23511,22811,-23523,22799,-23535,22787,-23546,22775,-23558,22763,-23570,22751,-23581,22739,-23593,22727,-23604,22715,-23616,22703,-23628,22691,-23639,22678,-23651,22666,-23662,22654,-23674,22642,-23686,22630,-23697,22618,-23709,22606,-23720,22594,-23732,22582,-23743,22569,-23755,22557,-23767,22545,-23778,22533,-23790,22521,-23801,22509,-23813,22496,-23824,22484,-23836,22472,-23847,22460,-23859,22448,-23870,22435,-23882,22423,-23893,22411,-23904,22399,-23916,22387,-23927,22374,-23939,22362,-23950,22350,-23962,22338,-23973,22325,-23985,22313,-23996,22301,-24007,22288,-24019,22276,-24030,22264,-24042,22252,-24053,22239,-24064,22227,-24076,22215,-24087,22202,-24098,22190,-24110,22178,-24121,22165,-24132,22153,-24144,22141,-24155,22128,-24166,22116,-24178,22104,-24189,22091,-24200,22079,-24212,22066,-24223,22054,-24234,22042,-24245,22029,-24257,22017,-24268,22004,-24279,21992,-24290,21980,-24302,21967,-24313,21955,-24324,21942,-24335,21930,-24347,21917,-24358,21905,-24369,21893,-24380,21880,-24391,21868,-24403,21855,-24414,21843,-24425,21830,-24436,21818,-24447,21805,-24458,21793,-24470,21780,-24481,21768,-24492,21755,-24503,21743,-24514,21730,-24525,21717,-24536,21705,-24547,21692,-24559,21680,-24570,21667,-24581,21655,-24592,21642,-24603,21629,-24614,21617,-24625,21604,-24636,21592,-24647,21579,-24658,21566,-24669,21554,-24680,21541,-24691,21529,-24702,21516,-24713,21503,-24724,21491,-24735,21478,-24746,21465,-24757,21453,-24768,21440,-24779,21427,-24790,21415,-24801,21402,-24812,21389,-24823,21377,-24834,21364,-24845,21351,-24856,21339,-24867,21326,-24878,21313,-24888,21300,-24899,21288,-24910,21275,-24921,21262,-24932,21249,-24943,21237,-24954,21224,-24965,21211,-24975,21198,-24986,21186,-24997,21173,-25008,21160,-25019,21147,-25030,21134,-25040,21122,-25051,21109,-25062,21096,-25073,21083,-25084,21070,-25094,21057,-25105,21045,-25116,21032,-25127,21019,-25137,21006,-25148,20993,-25159,20980,-25170,20967,-25180,20955,-25191,20942,-25202,20929,-25212,20916,-25223,20903,-25234,20890,-25244,20877,-25255,20864,-25266,20851,-25277,20838,-25287,20825,-25298,20813,-25308,20800,-25319,20787,-25330,20774,-25340,20761,-25351,20748,-25362,20735,-25372,20722,-25383,20709,-25393,20696,-25404,20683,-25415,20670,-25425,20657,-25436,20644,-25446,20631,-25457,20618,-25467,20605,-25478,20592,-25488,20579,-25499,20566,-25509,20553,-25520,20540,-25530,20527,-25541,20513,-25551,20500,-25562,20487,-25572,20474,-25583,20461,-25593,20448,-25604,20435,-25614,20422,-25625,20409,-25635,20396,-25646,20383,-25656,20369,-25666,20356,-25677,20343,-25687,20330,-25698,20317,-25708,20304,-25718,20291,-25729,20277,-25739,20264,-25750,20251,-25760,20238,-25770,20225,-25781,20212,-25791,20198,-25801,20185,-25812,20172,-25822,20159,-25832,20146,-25843,20132,-25853,20119,-25863,20106,-25873,20093,-25884,20079,-25894,20066,-25904,20053,-25914,20040,-25925,20026,-25935,20013,-25945,20000,-25955,19987,-25966,19973,-25976,19960,-25986,19947,-25996,19933,-26007,19920,-26017,19907,-26027,19894,-26037,19880,-26047,19867,-26057,19854,-26068,19840,-26078,19827,-26088,19814,-26098,19800,-26108,19787,-26118,19774,-26128,19760,-26138,19747,-26149,19733,-26159,19720,-26169,19707,-26179,19693,-26189,19680,-26199,19667,-26209,19653,-26219,19640,-26229,19626,-26239,19613,-26249,19599,-26259,19586,-26269,19573,-26279,19559,-26289,19546,-26299,19532,-26309,19519,-26319,19505,-26329,19492,-26339,19478,-26349,19465,-26359,19451,-26369,19438,-26379,19424,-26389,19411,-26399,19397,-26409,19384,-26419,19370,-26429,19357,-26438,19343,-26448,19330,-26458,19316,-26468,19303,-26478,19289,-26488,19276,-26498,19262,-26508,19249,-26517,19235,-26527,19221,-26537,19208,-26547,19194,-26557,19181,-26567,19167,-26576,19154,-26586,19140,-26596,19126,-26606,19113,-26616,19099,-26625,19086,-26635,19072,-26645,19058,-26655,19045,-26664,19031,-26674,19017,-26684,19004,-26693,18990,-26703,18976,-26713,18963,-26723,18949,-26732,18935,-26742,18922,-26752,18908,-26761,18894,-26771,18881,-26781,18867,-26790,18853,-26800,18840,-26810,18826,-26819,18812,-26829,18798,-26838,18785,-26848,18771,-26858,18757,-26867,18744,-26877,18730,-26886,18716,-26896,18702,-26906,18689,-26915,18675,-26925,18661,-26934,18647,-26944,18633,-26953,18620,-26963,18606,-26972,18592,-26982,18578,-26991,18564,-27001,18551,-27010,18537,-27020,18523,-27029,18509,-27039,18495,-27048,18482,-27058,18468,-27067,18454,-27077,18440,-27086,18426,-27095,18412,-27105,18398,-27114,18385,-27124,18371,-27133,18357,-27142,18343,-27152,18329,-27161,18315,-27171,18301,-27180,18287,-27189,18273,-27199,18260,-27208,18246,-27217,18232,-27227,18218,-27236,18204,-27245,18190,-27255,18176,-27264,18162,-27273,18148,-27282,18134,-27292,18120,-27301,18106,-27310,18092,-27320,18078,-27329,18064,-27338,18050,-27347,18036,-27356,18022,-27366,18008,-27375,17994,-27384,17980,-27393,17966,-27402,17952,-27412,17938,-27421,17924,-27430,17910,-27439,17896,-27448,17882,-27457,17868,-27467,17854,-27476,17840,-27485,17826,-27494,17812,-27503,17798,-27512,17784,-27521,17770,-27530,17756,-27539,17742,-27549,17727,-27558,17713,-27567,17699,-27576,17685,-27585,17671,-27594,17657,-27603,17643,-27612,17629,-27621,17615,-27630,17600,-27639,17586,-27648,17572,-27657,17558,-27666,17544,-27675,17530,-27684,17516,-27693,17501,-27702,17487,-27711,17473,-27720,17459,-27729,17445,-27737,17431,-27746,17416,-27755,17402,-27764,17388,-27773,17374,-27782,17360,-27791,17345,-27800,17331,-27809,17317,-27817,17303,-27826,17288,-27835,17274,-27844,17260,-27853,17246,-27862,17232,-27870,17217,-27879,17203,-27888,17189,-27897,17174,-27906,17160,-27914,17146,-27923,17132,-27932,17117,-27941,17103,-27949,17089,-27958,17074,-27967,17060,-27976,17046,-27984,17032,-27993,17017,-28002,17003,-28010,16989,-28019,16974,-28028,16960,-28037,16946,-28045,16931,-28054,16917,-28063,16903,-28071,16888,-28080,16874,-28088,16859,-28097,16845,-28106,16831,-28114,16816,-28123,16802,-28132,16788,-28140,16773,-28149,16759,-28157,16744,-28166,16730,-28174,16716,-28183,16701,-28191,16687,-28200,16672,-28209,16658,-28217,16643,-28226,16629,-28234,16615,-28243,16600,-28251,16586,-28260,16571,-28268,16557,-28276,16542,-28285,16528,-28293,16513,-28302,16499,-28310,16484,-28319,16470,-28327,16455,-28336,16441,-28344,16427,-28352,16412,-28361,16398,-28369,16383,-28378,16368,-28386,16354,-28394,16339,-28403,16325,-28411,16310,-28419,16296,-28428,16281,-28436,16267,-28444,16252,-28453,16238,-28461,16223,-28469,16209,-28478,16194,-28486,16179,-28494,16165,-28502,16150,-28511,16136,-28519,16121,-28527,16107,-28535,16092,-28544,16077,-28552,16063,-28560,16048,-28568,16034,-28576,16019,-28585,16004,-28593,15990,-28601,15975,-28609,15960,-28617,15946,-28626,15931,-28634,15917,-28642,15902,-28650,15887,-28658,15873,-28666,15858,-28674,15843,-28682,15829,-28691,15814,-28699,15799,-28707,15785,-28715,15770,-28723,15755,-28731,15740,-28739,15726,-28747,15711,-28755,15696,-28763,15682,-28771,15667,-28779,15652,-28787,15638,-28795,15623,-28803,15608,-28811,15593,-28819,15579,-28827,15564,-28835,15549,-28843,15534,-28851,15520,-28859,15505,-28867,15490,-28875,15475,-28883,15461,-28891,15446,-28898,15431,-28906,15416,-28914,15401,-28922,15387,-28930,15372,-28938,15357,-28946,15342,-28954,15327,-28961,15313,-28969,15298,-28977,15283,-28985,15268,-28993,15253,-29000,15238,-29008,15224,-29016,15209,-29024,15194,-29032,15179,-29039,15164,-29047,15149,-29055,15135,-29063,15120,-29070,15105,-29078,15090,-29086,15075,-29093,15060,-29101,15045,-29109,15030,-29117,15016,-29124,15001,-29132,14986,-29140,14971,-29147,14956,-29155,14941,-29163,14926,-29170,14911,-29178,14896,-29185,14881,-29193,14866,-29201,14852,-29208,14837,-29216,14822,-29223,14807,-29231,14792,-29239,14777,-29246,14762,-29254,14747,-29261,14732,-29269,14717,-29276,14702,-29284,14687,-29291,14672,-29299,14657,-29306,14642,-29314,14627,-29321,14612,-29329,14597,-29336,14582,-29344,14567,-29351,14552,-29359,14537,-29366,14522,-29373,14507,-29381,14492,-29388,14477,-29396,14462,-29403,14447,-29411,14432,-29418,14417,-29425,14402,-29433,14387,-29440,14372,-29447,14357,-29455,14342,-29462,14326,-29469,14311,-29477,14296,-29484,14281,-29491,14266,-29499,14251,-29506,14236,-29513,14221,-29520,14206,-29528,14191,-29535,14176,-29542,14160,-29549,14145,-29557,14130,-29564,14115,-29571,14100,-29578,14085,-29586,14070,-29593,14055,-29600,14039,-29607,14024,-29614,14009,-29622,13994,-29629,13979,-29636,13964,-29643,13949,-29650,13933,-29657,13918,-29664,13903,-29671,13888,-29679,13873,-29686,13858,-29693,13842,-29700,13827,-29707,13812,-29714,13797,-29721,13782,-29728,13766,-29735,13751,-29742,13736,-29749,13721,-29756,13706,-29763,13690,-29770,13675,-29777,13660,-29784,13645,-29791,13629,-29798,13614,-29805,13599,-29812,13584,-29819,13568,-29826,13553,-29833,13538,-29840,13523,-29847,13507,-29854,13492,-29861,13477,-29867,13462,-29874,13446,-29881,13431,-29888,13416,-29895,13400,-29902,13385,-29909,13370,-29916,13355,-29922,13339,-29929,13324,-29936,13309,-29943,13293,-29950,13278,-29956,13263,-29963,13247,-29970,13232,-29977,13217,-29984,13201,-29990,13186,-29997,13171,-30004,13155,-30010,13140,-30017,13125,-30024,13109,-30031,13094,-30037,13079,-30044,13063,-30051,13048,-30057,13033,-30064,13017,-30071,13002,-30077,12986,-30084,12971,-30091,12956,-30097,12940,-30104,12925,-30110,12909,-30117,12894,-30124,12879,-30130,12863,-30137,12848,-30143,12832,-30150,12817,-30157,12802,-30163,12786,-30170,12771,-30176,12755,-30183,12740,-30189,12724,-30196,12709,-30202,12694,-30209,12678,-30215,12663,-30222,12647,-30228,12632,-30235,12616,-30241,12601,-30248,12585,-30254,12570,-30260,12554,-30267,12539,-30273,12523,-30280,12508,-30286,12492,-30292,12477,-30299,12461,-30305,12446,-30312,12430,-30318,12415,-30324,12399,-30331,12384,-30337,12368,-30343,12353,-30350,12337,-30356,12322,-30362,12306,-30369,12291,-30375,12275,-30381,12260,-30387,12244,-30394,12229,-30400,12213,-30406,12198,-30412,12182,-30419,12166,-30425,12151,-30431,12135,-30437,12120,-30443,12104,-30450,12089,-30456,12073,-30462,12057,-30468,12042,-30474,12026,-30481,12011,-30487,11995,-30493,11980,-30499,11964,-30505,11948,-30511,11933,-30517,11917,-30523,11902,-30529,11886,-30536,11870,-30542,11855,-30548,11839,-30554,11823,-30560,11808,-30566,11792,-30572,11777,-30578,11761,-30584,11745,-30590,11730,-30596,11714,-30602,11698,-30608,11683,-30614,11667,-30620,11651,-30626,11636,-30632,11620,-30638,11604,-30644,11589,-30650,11573,-30656,11557,-30661,11542,-30667,11526,-30673,11510,-30679,11495,-30685,11479,-30691,11463,-30697,11448,-30703,11432,-30708,11416,-30714,11400,-30720,11385,-30726,11369,-30732,11353,-30738,11338,-30743,11322,-30749,11306,-30755,11290,-30761,11275,-30767,11259,-30772,11243,-30778,11227,-30784,11212,-30789,11196,-30795,11180,-30801,11164,-30807,11149,-30812,11133,-30818,11117,-30824,11101,-30829,11086,-30835,11070,-30841,11054,-30846,11038,-30852,11023,-30858,11007,-30863,10991,-30869,10975,-30875,10959,-30880,10944,-30886,10928,-30891,10912,-30897,10896,-30903,10880,-30908,10865,-30914,10849,-30919,10833,-30925,10817,-30930,10801,-30936,10786,-30941,10770,-30947,10754,-30952,10738,-30958,10722,-30963,10706,-30969,10691,-30974,10675,-30980,10659,-30985,10643,-30991,10627,-30996,10611,-31002,10596,-31007,10580,-31012,10564,-31018,10548,-31023,10532,-31029,10516,-31034,10500,-31039,10484,-31045,10469,-31050,10453,-31055,10437,-31061,10421,-31066,10405,-31071,10389,-31077,10373,-31082,10357,-31087,10342,-31093,10326,-31098,10310,-31103,10294,-31108,10278,-31114,10262,-31119,10246,-31124,10230,-31129,10214,-31135,10198,-31140,10182,-31145,10166,-31150,10151,-31155,10135,-31161,10119,-31166,10103,-31171,10087,-31176,10071,-31181,10055,-31186,10039,-31192,10023,-31197,10007,-31202,9991,-31207,9975,-31212,9959,-31217,9943,-31222,9927,-31227,9911,-31232,9895,-31237,9879,-31243,9863,-31248,9847,-31253,9831,-31258,9815,-31263,9799,-31268,9783,-31273,9767,-31278,9751,-31283,9735,-31288,9719,-31293,9703,-31298,9687,-31303,9671,-31308,9655,-31312,9639,-31317,9623,-31322,9607,-31327,9591,-31332,9575,-31337,9559,-31342,9543,-31347,9527,-31352,9511,-31357,9495,-31361,9479,-31366,9463,-31371,9447,-31376,9431,-31381,9415,-31386,9399,-31390,9383,-31395,9367,-31400,9351,-31405,9335,-31410,9319,-31414,9303,-31419,9287,-31424,9270,-31429,9254,-31433,9238,-31438,9222,-31443,9206,-31447,9190,-31452,9174,-31457,9158,-31462,9142,-31466,9126,-31471,9110,-31476,9094,-31480,9077,-31485,9061,-31490,9045,-31494,9029,-31499,9013,-31503,8997,-31508,8981,-31513,8965,-31517,8949,-31522,8932,-31526,8916,-31531,8900,-31535,8884,-31540,8868,-31545,8852,-31549,8836,-31554,8820,-31558,8803,-31563,8787,-31567,8771,-31572,8755,-31576,8739,-31581,8723,-31585,8707,-31589,8690,-31594,8674,-31598,8658,-31603,8642,-31607,8626,-31612,8610,-31616,8593,-31620,8577,-31625,8561,-31629,8545,-31634,8529,-31638,8513,-31642,8496,-31647,8480,-31651,8464,-31655,8448,-31660,8432,-31664,8415,-31668,8399,-31673,8383,-31677,8367,-31681,8351,-31685,8334,-31690,8318,-31694,8302,-31698,8286,-31702,8270,-31707,8253,-31711,8237,-31715,8221,-31719,8205,-31724,8189,-31728,8172,-31732,8156,-31736,8140,-31740,8124,-31744,8107,-31749,8091,-31753,8075,-31757,8059,-31761,8042,-31765,8026,-31769,8010,-31773,7994,-31777,7977,-31781,7961,-31786,7945,-31790,7929,-31794,7912,-31798,7896,-31802,7880,-31806,7864,-31810,7847,-31814,7831,-31818,7815,-31822,7799,-31826,7782,-31830,7766,-31834,7750,-31838,7733,-31842,7717,-31846,7701,-31850,7685,-31854,7668,-31857,7652,-31861,7636,-31865,7619,-31869,7603,-31873,7587,-31877,7571,-31881,7554,-31885,7538,-31889,7522,-31892,7505,-31896,7489,-31900,7473,-31904,7456,-31908,7440,-31912,7424,-31915,7407,-31919,7391,-31923,7375,-31927,7358,-31930,7342,-31934,7326,-31938,7310,-31942,7293,-31945,7277,-31949,7261,-31953,7244,-31957,7228,-31960,7211,-31964,7195,-31968,7179,-31971,7162,-31975,7146,-31979,7130,-31982,7113,-31986,7097,-31990,7081,-31993,7064,-31997,7048,-32000,7032,-32004,7015,-32008,6999,-32011,6982,-32015,6966,-32018,6950,-32022,6933,-32025,6917,-32029,6901,-32033,6884,-32036,6868,-32040,6851,-32043,6835,-32047,6819,-32050,6802,-32054,6786,-32057,6770,-32060,6753,-32064,6737,-32067,6720,-32071,6704,-32074,6688,-32078,6671,-32081,6655,-32085,6638,-32088,6622,-32091,6606,-32095,6589,-32098,6573,-32101,6556,-32105,6540,-32108,6523,-32111,6507,-32115,6491,-32118,6474,-32121,6458,-32125,6441,-32128,6425,-32131,6408,-32135,6392,-32138,6376,-32141,6359,-32144,6343,-32148,6326,-32151,6310,-32154,6293,-32157,6277,-32161,6261,-32164,6244,-32167,6228,-32170,6211,-32173,6195,-32177,6178,-32180,6162,-32183,6145,-32186,6129,-32189,6112,-32192,6096,-32195,6080,-32198,6063,-32202,6047,-32205,6030,-32208,6014,-32211,5997,-32214,5981,-32217,5964,-32220,5948,-32223,5931,-32226,5915,-32229,5898,-32232,5882,-32235,5865,-32238,5849,-32241,5832,-32244,5816,-32247,5799,-32250,5783,-32253,5766,-32256,5750,-32259,5733,-32262,5717,-32265,5700,-32268,5684,-32271,5667,-32274,5651,-32276,5634,-32279,5618,-32282,5601,-32285,5585,-32288,5568,-32291,5552,-32294,5535,-32296,5519,-32299,5502,-32302,5486,-32305,5469,-32308,5453,-32311,5436,-32313,5420,-32316,5403,-32319,5387,-32322,5370,-32324,5354,-32327,5337,-32330,5321,-32333,5304,-32335,5287,-32338,5271,-32341,5254,-32343,5238,-32346,5221,-32349,5205,-32351,5188,-32354,5172,-32357,5155,-32359,5139,-32362,5122,-32365,5106,-32367,5089,-32370,5072,-32372,5056,-32375,5039,-32378,5023,-32380,5006,-32383,4990,-32385,4973,-32388,4957,-32390,4940,-32393,4923,-32395,4907,-32398,4890,-32400,4874,-32403,4857,-32405,4841,-32408,4824,-32410,4807,-32413,4791,-32415,4774,-32418,4758,-32420,4741,-32423,4725,-32425,4708,-32427,4691,-32430,4675,-32432,4658,-32435,4642,-32437,4625,-32439,4608,-32442,4592,-32444,4575,-32446,4559,-32449,4542,-32451,4525,-32453,4509,-32456,4492,-32458,4476,-32460,4459,-32463,4443,-32465,4426,-32467,4409,-32469,4393,-32472,4376,-32474,4359,-32476,4343,-32478,4326,-32481,4310,-32483,4293,-32485,4276,-32487,4260,-32489,4243,-32492,4227,-32494,4210,-32496,4193,-32498,4177,-32500,4160,-32502,4144,-32504,4127,-32507,4110,-32509,4094,-32511,4077,-32513,4060,-32515,4044,-32517,4027,-32519,4011,-32521,3994,-32523,3977,-32525,3961,-32527,3944,-32529,3927,-32531,3911,-32533,3894,-32535,3877,-32537,3861,-32539,3844,-32541,3828,-32543,3811,-32545,3794,-32547,3778,-32549,3761,-32551,3744,-32553,3728,-32555,3711,-32557,3694,-32559,3678,-32560,3661,-32562,3644,-32564,3628,-32566,3611,-32568,3594,-32570,3578,-32572,3561,-32573,3545,-32575,3528,-32577,3511,-32579,3495,-32581,3478,-32582,3461,-32584,3445,-32586,3428,-32588,3411,-32589,3395,-32591,3378,-32593,3361,-32595,3345,-32596,3328,-32598,3311,-32600,3295,-32601,3278,-32603,3261,-32605,3245,-32606,3228,-32608,3211,-32610,3195,-32611,3178,-32613,3161,-32615,3145,-32616,3128,-32618,3111,-32619,3094,-32621,3078,-32623,3061,-32624,3044,-32626,3028,-32627,3011,-32629,2994,-32630,2978,-32632,2961,-32633,2944,-32635,2928,-32636,2911,-32638,2894,-32639,2878,-32641,2861,-32642,2844,-32644,2828,-32645,2811,-32647,2794,-32648,2777,-32650,2761,-32651,2744,-32652,2727,-32654,2711,-32655,2694,-32657,2677,-32658,2661,-32659,2644,-32661,2627,-32662,2610,-32663,2594,-32665,2577,-32666,2560,-32667,2544,-32669,2527,-32670,2510,-32671,2494,-32672,2477,-32674,2460,-32675,2443,-32676,2427,-32677,2410,-32679,2393,-32680,2377,-32681,2360,-32682,2343,-32684,2326,-32685,2310,-32686,2293,-32687,2276,-32688,2260,-32689,2243,-32691,2226,-32692,2209,-32693,2193,-32694,2176,-32695,2159,-32696,2143,-32697,2126,-32698,2109,-32700,2092,-32701,2076,-32702,2059,-32703,2042,-32704,2026,-32705,2009,-32706,1992,-32707,1975,-32708,1959,-32709,1942,-32710,1925,-32711,1908,-32712,1892,-32713,1875,-32714,1858,-32715,1842,-32716,1825,-32717,1808,-32718,1791,-32718,1775,-32719,1758,-32720,1741,-32721,1724,-32722,1708,-32723,1691,-32724,1674,-32725,1658,-32726,1641,-32726,1624,-32727,1607,-32728,1591,-32729,1574,-32730,1557,-32730,1540,-32731,1524,-32732,1507,-32733,1490,-32734,1473,-32734,1457,-32735,1440,-32736,1423,-32737,1406,-32737,1390,-32738,1373,-32739,1356,-32739,1339,-32740,1323,-32741,1306,-32741,1289,-32742,1273,-32743,1256,-32743,1239,-32744,1222,-32745,1206,-32745,1189,-32746,1172,-32747,1155,-32747,1139,-32748,1122,-32748,1105,-32749,1088,-32749,1072,-32750,1055,-32751,1038,-32751,1021,-32752,1005,-32752,988,-32753,971,-32753,954,-32754,938,-32754,921,-32755,904,-32755,887,-32755,871,-32756,854,-32756,837,-32757,820,-32757,804,-32758,787,-32758,770,-32758,753,-32759,737,-32759,720,-32760,703,-32760,686,-32760,670,-32761,653,-32761,636,-32761,619,-32762,603,-32762,586,-32762,569,-32763,552,-32763,536,-32763,519,-32763,502,-32764,485,-32764,469,-32764,452,-32764,435,-32765,418,-32765,402,-32765,385,-32765,368,-32765,351,-32766,335,-32766,318,-32766,301,-32766,284,-32766,268,-32766,251,-32767,234,-32767,217,-32767,201,-32767,184,-32767,167,-32767,150,-32767,134,-32767,117,-32767,100,-32767,83,-32767,67,-32767,50,-32767,33,-32767,16,-32767,0,-32767,-17,-32767,-34,-32767,-51,-32767,-68,-32767,-84,-32767,-101,-32767,-118,-32767,-135,-32767,-151,-32767,-168,-32767,-185,-32767,-202,-32767,-218,-32767,-235,-32767,-252,-32767,-269,-32766,-285,-32766,-302,-32766,-319,-32766,-336,-32766,-352,-32766,-369,-32765,-386,-32765,-403,-32765,-419,-32765,-436,-32765,-453,-32764,-470,-32764,-486,-32764,-503,-32764,-520,-32763,-537,-32763,-553,-32763,-570,-32763,-587,-32762,-604,-32762,-620,-32762,-637,-32761,-654,-32761,-671,-32761,-687,-32760,-704,-32760,-721,-32760,-738,-32759,-754,-32759,-771,-32758,-788,-32758,-805,-32758,-821,-32757,-838,-32757,-855,-32756,-872,-32756,-888,-32755,-905,-32755,-922,-32755,-939,-32754,-955,-32754,-972,-32753,-989,-32753,-1006,-32752,-1022,-32752,-1039,-32751,-1056,-32751,-1073,-32750,-1089,-32749,-1106,-32749,-1123,-32748,-1140,-32748,-1156,-32747,-1173,-32747,-1190,-32746,-1207,-32745,-1223,-32745,-1240,-32744,-1257,-32743,-1274,-32743,-1290,-32742,-1307,-32741,-1324,-32741,-1340,-32740,-1357,-32739,-1374,-32739,-1391,-32738,-1407,-32737,-1424,-32737,-1441,-32736,-1458,-32735,-1474,-32734,-1491,-32734,-1508,-32733,-1525,-32732,-1541,-32731,-1558,-32730,-1575,-32730,-1592,-32729,-1608,-32728,-1625,-32727,-1642,-32726,-1659,-32726,-1675,-32725,-1692,-32724,-1709,-32723,-1725,-32722,-1742,-32721,-1759,-32720,-1776,-32719,-1792,-32718,-1809,-32718,-1826,-32717,-1843,-32716,-1859,-32715,-1876,-32714,-1893,-32713,-1909,-32712,-1926,-32711,-1943,-32710,-1960,-32709,-1976,-32708,-1993,-32707,-2010,-32706,-2027,-32705,-2043,-32704,-2060,-32703,-2077,-32702,-2093,-32701,-2110,-32700,-2127,-32698,-2144,-32697,-2160,-32696,-2177,-32695,-2194,-32694,-2210,-32693,-2227,-32692,-2244,-32691,-2261,-32689,-2277,-32688,-2294,-32687,-2311,-32686,-2327,-32685,-2344,-32684,-2361,-32682,-2378,-32681,-2394,-32680,-2411,-32679,-2428,-32677,-2444,-32676,-2461,-32675,-2478,-32674,-2495,-32672,-2511,-32671,-2528,-32670,-2545,-32669,-2561,-32667,-2578,-32666,-2595,-32665,-2611,-32663,-2628,-32662,-2645,-32661,-2662,-32659,-2678,-32658,-2695,-32657,-2712,-32655,-2728,-32654,-2745,-32652,-2762,-32651,-2778,-32650,-2795,-32648,-2812,-32647,-2829,-32645,-2845,-32644,-2862,-32642,-2879,-32641,-2895,-32639,-2912,-32638,-2929,-32636,-2945,-32635,-2962,-32633,-2979,-32632,-2995,-32630,-3012,-32629,-3029,-32627,-3045,-32626,-3062,-32624,-3079,-32623,-3095,-32621,-3112,-32619,-3129,-32618,-3146,-32616,-3162,-32615,-3179,-32613,-3196,-32611,-3212,-32610,-3229,-32608,-3246,-32606,-3262,-32605,-3279,-32603,-3296,-32601,-3312,-32600,-3329,-32598,-3346,-32596,-3362,-32595,-3379,-32593,-3396,-32591,-3412,-32589,-3429,-32588,-3446,-32586,-3462,-32584,-3479,-32582,-3496,-32581,-3512,-32579,-3529,-32577,-3546,-32575,-3562,-32573,-3579,-32572,-3595,-32570,-3612,-32568,-3629,-32566,-3645,-32564,-3662,-32562,-3679,-32560,-3695,-32559,-3712,-32557,-3729,-32555,-3745,-32553,-3762,-32551,-3779,-32549,-3795,-32547,-3812,-32545,-3829,-32543,-3845,-32541,-3862,-32539,-3878,-32537,-3895,-32535,-3912,-32533,-3928,-32531,-3945,-32529,-3962,-32527,-3978,-32525,-3995,-32523,-4012,-32521,-4028,-32519,-4045,-32517,-4061,-32515,-4078,-32513,-4095,-32511,-4111,-32509,-4128,-32507,-4145,-32504,-4161,-32502,-4178,-32500,-4194,-32498,-4211,-32496,-4228,-32494,-4244,-32492,-4261,-32489,-4277,-32487,-4294,-32485,-4311,-32483,-4327,-32481,-4344,-32478,-4360,-32476,-4377,-32474,-4394,-32472,-4410,-32469,-4427,-32467,-4444,-32465,-4460,-32463,-4477,-32460,-4493,-32458,-4510,-32456,-4526,-32453,-4543,-32451,-4560,-32449,-4576,-32446,-4593,-32444,-4609,-32442,-4626,-32439,-4643,-32437,-4659,-32435,-4676,-32432,-4692,-32430,-4709,-32427,-4726,-32425,-4742,-32423,-4759,-32420,-4775,-32418,-4792,-32415,-4808,-32413,-4825,-32410,-4842,-32408,-4858,-32405,-4875,-32403,-4891,-32400,-4908,-32398,-4924,-32395,-4941,-32393,-4958,-32390,-4974,-32388,-4991,-32385,-5007,-32383,-5024,-32380,-5040,-32378,-5057,-32375,-5073,-32372,-5090,-32370,-5107,-32367,-5123,-32365,-5140,-32362,-5156,-32359,-5173,-32357,-5189,-32354,-5206,-32351,-5222,-32349,-5239,-32346,-5255,-32343,-5272,-32341,-5288,-32338,-5305,-32335,-5322,-32333,-5338,-32330,-5355,-32327,-5371,-32324,-5388,-32322,-5404,-32319,-5421,-32316,-5437,-32313,-5454,-32311,-5470,-32308,-5487,-32305,-5503,-32302,-5520,-32299,-5536,-32296,-5553,-32294,-5569,-32291,-5586,-32288,-5602,-32285,-5619,-32282,-5635,-32279,-5652,-32276,-5668,-32274,-5685,-32271,-5701,-32268,-5718,-32265,-5734,-32262,-5751,-32259,-5767,-32256,-5784,-32253,-5800,-32250,-5817,-32247,-5833,-32244,-5850,-32241,-5866,-32238,-5883,-32235,-5899,-32232,-5916,-32229,-5932,-32226,-5949,-32223,-5965,-32220,-5982,-32217,-5998,-32214,-6015,-32211,-6031,-32208,-6048,-32205,-6064,-32202,-6081,-32198,-6097,-32195,-6113,-32192,-6130,-32189,-6146,-32186,-6163,-32183,-6179,-32180,-6196,-32177,-6212,-32173,-6229,-32170,-6245,-32167,-6262,-32164,-6278,-32161,-6294,-32157,-6311,-32154,-6327,-32151,-6344,-32148,-6360,-32144,-6377,-32141,-6393,-32138,-6409,-32135,-6426,-32131,-6442,-32128,-6459,-32125,-6475,-32121,-6492,-32118,-6508,-32115,-6524,-32111,-6541,-32108,-6557,-32105,-6574,-32101,-6590,-32098,-6607,-32095,-6623,-32091,-6639,-32088,-6656,-32085,-6672,-32081,-6689,-32078,-6705,-32074,-6721,-32071,-6738,-32067,-6754,-32064,-6771,-32060,-6787,-32057,-6803,-32054,-6820,-32050,-6836,-32047,-6852,-32043,-6869,-32040,-6885,-32036,-6902,-32033,-6918,-32029,-6934,-32025,-6951,-32022,-6967,-32018,-6983,-32015,-7000,-32011,-7016,-32008,-7033,-32004,-7049,-32000,-7065,-31997,-7082,-31993,-7098,-31990,-7114,-31986,-7131,-31982,-7147,-31979,-7163,-31975,-7180,-31971,-7196,-31968,-7212,-31964,-7229,-31960,-7245,-31957,-7262,-31953,-7278,-31949,-7294,-31945,-7311,-31942,-7327,-31938,-7343,-31934,-7359,-31930,-7376,-31927,-7392,-31923,-7408,-31919,-7425,-31915,-7441,-31912,-7457,-31908,-7474,-31904,-7490,-31900,-7506,-31896,-7523,-31892,-7539,-31889,-7555,-31885,-7572,-31881,-7588,-31877,-7604,-31873,-7620,-31869,-7637,-31865,-7653,-31861,-7669,-31857,-7686,-31854,-7702,-31850,-7718,-31846,-7734,-31842,-7751,-31838,-7767,-31834,-7783,-31830,-7800,-31826,-7816,-31822,-7832,-31818,-7848,-31814,-7865,-31810,-7881,-31806,-7897,-31802,-7913,-31798,-7930,-31794,-7946,-31790,-7962,-31786,-7978,-31781,-7995,-31777,-8011,-31773,-8027,-31769,-8043,-31765,-8060,-31761,-8076,-31757,-8092,-31753,-8108,-31749,-8125,-31744,-8141,-31740,-8157,-31736,-8173,-31732,-8190,-31728,-8206,-31724,-8222,-31719,-8238,-31715,-8254,-31711,-8271,-31707,-8287,-31702,-8303,-31698,-8319,-31694,-8335,-31690,-8352,-31685,-8368,-31681,-8384,-31677,-8400,-31673,-8416,-31668,-8433,-31664,-8449,-31660,-8465,-31655,-8481,-31651,-8497,-31647,-8514,-31642,-8530,-31638,-8546,-31634,-8562,-31629,-8578,-31625,-8594,-31620,-8611,-31616,-8627,-31612,-8643,-31607,-8659,-31603,-8675,-31598,-8691,-31594,-8708,-31589,-8724,-31585,-8740,-31581,-8756,-31576,-8772,-31572,-8788,-31567,-8804,-31563,-8821,-31558,-8837,-31554,-8853,-31549,-8869,-31545,-8885,-31540,-8901,-31535,-8917,-31531,-8933,-31526,-8950,-31522,-8966,-31517,-8982,-31513,-8998,-31508,-9014,-31503,-9030,-31499,-9046,-31494,-9062,-31490,-9078,-31485,-9095,-31480,-9111,-31476,-9127,-31471,-9143,-31466,-9159,-31462,-9175,-31457,-9191,-31452,-9207,-31447,-9223,-31443,-9239,-31438,-9255,-31433,-9271,-31429,-9288,-31424,-9304,-31419,-9320,-31414,-9336,-31410,-9352,-31405,-9368,-31400,-9384,-31395,-9400,-31390,-9416,-31386,-9432,-31381,-9448,-31376,-9464,-31371,-9480,-31366,-9496,-31361,-9512,-31357,-9528,-31352,-9544,-31347,-9560,-31342,-9576,-31337,-9592,-31332,-9608,-31327,-9624,-31322,-9640,-31317,-9656,-31312,-9672,-31308,-9688,-31303,-9704,-31298,-9720,-31293,-9736,-31288,-9752,-31283,-9768,-31278,-9784,-31273,-9800,-31268,-9816,-31263,-9832,-31258,-9848,-31253,-9864,-31248,-9880,-31243,-9896,-31237,-9912,-31232,-9928,-31227,-9944,-31222,-9960,-31217,-9976,-31212,-9992,-31207,-10008,-31202,-10024,-31197,-10040,-31192,-10056,-31186,-10072,-31181,-10088,-31176,-10104,-31171,-10120,-31166,-10136,-31161,-10152,-31155,-10167,-31150,-10183,-31145,-10199,-31140,-10215,-31135,-10231,-31129,-10247,-31124,-10263,-31119,-10279,-31114,-10295,-31108,-10311,-31103,-10327,-31098,-10343,-31093,-10358,-31087,-10374,-31082,-10390,-31077,-10406,-31071,-10422,-31066,-10438,-31061,-10454,-31055,-10470,-31050,-10485,-31045,-10501,-31039,-10517,-31034,-10533,-31029,-10549,-31023,-10565,-31018,-10581,-31012,-10597,-31007,-10612,-31002,-10628,-30996,-10644,-30991,-10660,-30985,-10676,-30980,-10692,-30974,-10707,-30969,-10723,-30963,-10739,-30958,-10755,-30952,-10771,-30947,-10787,-30941,-10802,-30936,-10818,-30930,-10834,-30925,-10850,-30919,-10866,-30914,-10881,-30908,-10897,-30903,-10913,-30897,-10929,-30891,-10945,-30886,-10960,-30880,-10976,-30875,-10992,-30869,-11008,-30863,-11024,-30858,-11039,-30852,-11055,-30846,-11071,-30841,-11087,-30835,-11102,-30829,-11118,-30824,-11134,-30818,-11150,-30812,-11165,-30807,-11181,-30801,-11197,-30795,-11213,-30789,-11228,-30784,-11244,-30778,-11260,-30772,-11276,-30767,-11291,-30761,-11307,-30755,-11323,-30749,-11339,-30743,-11354,-30738,-11370,-30732,-11386,-30726,-11401,-30720,-11417,-30714,-11433,-30708,-11449,-30703,-11464,-30697,-11480,-30691,-11496,-30685,-11511,-30679,-11527,-30673,-11543,-30667,-11558,-30661,-11574,-30656,-11590,-30650,-11605,-30644,-11621,-30638,-11637,-30632,-11652,-30626,-11668,-30620,-11684,-30614,-11699,-30608,-11715,-30602,-11731,-30596,-11746,-30590,-11762,-30584,-11778,-30578,-11793,-30572,-11809,-30566,-11824,-30560,-11840,-30554,-11856,-30548,-11871,-30542,-11887,-30536,-11903,-30529,-11918,-30523,-11934,-30517,-11949,-30511,-11965,-30505,-11981,-30499,-11996,-30493,-12012,-30487,-12027,-30481,-12043,-30474,-12058,-30468,-12074,-30462,-12090,-30456,-12105,-30450,-12121,-30443,-12136,-30437,-12152,-30431,-12167,-30425,-12183,-30419,-12199,-30412,-12214,-30406,-12230,-30400,-12245,-30394,-12261,-30387,-12276,-30381,-12292,-30375,-12307,-30369,-12323,-30362,-12338,-30356,-12354,-30350,-12369,-30343,-12385,-30337,-12400,-30331,-12416,-30324,-12431,-30318,-12447,-30312,-12462,-30305,-12478,-30299,-12493,-30292,-12509,-30286,-12524,-30280,-12540,-30273,-12555,-30267,-12571,-30260,-12586,-30254,-12602,-30248,-12617,-30241,-12633,-30235,-12648,-30228,-12664,-30222,-12679,-30215,-12695,-30209,-12710,-30202,-12725,-30196,-12741,-30189,-12756,-30183,-12772,-30176,-12787,-30170,-12803,-30163,-12818,-30157,-12833,-30150,-12849,-30143,-12864,-30137,-12880,-30130,-12895,-30124,-12910,-30117,-12926,-30110,-12941,-30104,-12957,-30097,-12972,-30091,-12987,-30084,-13003,-30077,-13018,-30071,-13034,-30064,-13049,-30057,-13064,-30051,-13080,-30044,-13095,-30037,-13110,-30031,-13126,-30024,-13141,-30017,-13156,-30010,-13172,-30004,-13187,-29997,-13202,-29990,-13218,-29984,-13233,-29977,-13248,-29970,-13264,-29963,-13279,-29956,-13294,-29950,-13310,-29943,-13325,-29936,-13340,-29929,-13356,-29922,-13371,-29916,-13386,-29909,-13401,-29902,-13417,-29895,-13432,-29888,-13447,-29881,-13463,-29874,-13478,-29867,-13493,-29861,-13508,-29854,-13524,-29847,-13539,-29840,-13554,-29833,-13569,-29826,-13585,-29819,-13600,-29812,-13615,-29805,-13630,-29798,-13646,-29791,-13661,-29784,-13676,-29777,-13691,-29770,-13707,-29763,-13722,-29756,-13737,-29749,-13752,-29742,-13767,-29735,-13783,-29728,-13798,-29721,-13813,-29714,-13828,-29707,-13843,-29700,-13859,-29693,-13874,-29686,-13889,-29679,-13904,-29671,-13919,-29664,-13934,-29657,-13950,-29650,-13965,-29643,-13980,-29636,-13995,-29629,-14010,-29622,-14025,-29614,-14040,-29607,-14056,-29600,-14071,-29593,-14086,-29586,-14101,-29578,-14116,-29571,-14131,-29564,-14146,-29557,-14161,-29549,-14177,-29542,-14192,-29535,-14207,-29528,-14222,-29520,-14237,-29513,-14252,-29506,-14267,-29499,-14282,-29491,-14297,-29484,-14312,-29477,-14327,-29469,-14343,-29462,-14358,-29455,-14373,-29447,-14388,-29440,-14403,-29433,-14418,-29425,-14433,-29418,-14448,-29411,-14463,-29403,-14478,-29396,-14493,-29388,-14508,-29381,-14523,-29373,-14538,-29366,-14553,-29359,-14568,-29351,-14583,-29344,-14598,-29336,-14613,-29329,-14628,-29321,-14643,-29314,-14658,-29306,-14673,-29299,-14688,-29291,-14703,-29284,-14718,-29276,-14733,-29269,-14748,-29261,-14763,-29254,-14778,-29246,-14793,-29239,-14808,-29231,-14823,-29223,-14838,-29216,-14853,-29208,-14867,-29201,-14882,-29193,-14897,-29185,-14912,-29178,-14927,-29170,-14942,-29163,-14957,-29155,-14972,-29147,-14987,-29140,-15002,-29132,-15017,-29124,-15031,-29117,-15046,-29109,-15061,-29101,-15076,-29093,-15091,-29086,-15106,-29078,-15121,-29070,-15136,-29063,-15150,-29055,-15165,-29047,-15180,-29039,-15195,-29032,-15210,-29024,-15225,-29016,-15239,-29008,-15254,-29000,-15269,-28993,-15284,-28985,-15299,-28977,-15314,-28969,-15328,-28961,-15343,-28954,-15358,-28946,-15373,-28938,-15388,-28930,-15402,-28922,-15417,-28914,-15432,-28906,-15447,-28898,-15462,-28891,-15476,-28883,-15491,-28875,-15506,-28867,-15521,-28859,-15535,-28851,-15550,-28843,-15565,-28835,-15580,-28827,-15594,-28819,-15609,-28811,-15624,-28803,-15639,-28795,-15653,-28787,-15668,-28779,-15683,-28771,-15697,-28763,-15712,-28755,-15727,-28747,-15741,-28739,-15756,-28731,-15771,-28723,-15786,-28715,-15800,-28707,-15815,-28699,-15830,-28691,-15844,-28682,-15859,-28674,-15874,-28666,-15888,-28658,-15903,-28650,-15918,-28642,-15932,-28634,-15947,-28626,-15961,-28617,-15976,-28609,-15991,-28601,-16005,-28593,-16020,-28585,-16035,-28576,-16049,-28568,-16064,-28560,-16078,-28552,-16093,-28544,-16108,-28535,-16122,-28527,-16137,-28519,-16151,-28511,-16166,-28502,-16180,-28494,-16195,-28486,-16210,-28478,-16224,-28469,-16239,-28461,-16253,-28453,-16268,-28444,-16282,-28436,-16297,-28428,-16311,-28419,-16326,-28411,-16340,-28403,-16355,-28394,-16369,-28386}; +int16_t twa12288[8192] __attribute__((aligned(32))) = {32767,0,32766,-17,32766,-34,32766,-51,32766,-68,32766,-84,32766,-101,32766,-118,32766,-135,32766,-151,32766,-168,32766,-185,32766,-202,32766,-218,32766,-235,32766,-252,32765,-269,32765,-285,32765,-302,32765,-319,32765,-336,32765,-352,32764,-369,32764,-386,32764,-403,32764,-419,32764,-436,32763,-453,32763,-470,32763,-486,32763,-503,32762,-520,32762,-537,32762,-553,32762,-570,32761,-587,32761,-604,32761,-620,32760,-637,32760,-654,32760,-671,32759,-687,32759,-704,32759,-721,32758,-738,32758,-754,32757,-771,32757,-788,32757,-805,32756,-821,32756,-838,32755,-855,32755,-872,32754,-888,32754,-905,32754,-922,32753,-939,32753,-955,32752,-972,32752,-989,32751,-1006,32751,-1022,32750,-1039,32750,-1056,32749,-1073,32748,-1089,32748,-1106,32747,-1123,32747,-1140,32746,-1156,32746,-1173,32745,-1190,32744,-1207,32744,-1223,32743,-1240,32742,-1257,32742,-1274,32741,-1290,32740,-1307,32740,-1324,32739,-1340,32738,-1357,32738,-1374,32737,-1391,32736,-1407,32736,-1424,32735,-1441,32734,-1458,32733,-1474,32733,-1491,32732,-1508,32731,-1525,32730,-1541,32729,-1558,32729,-1575,32728,-1592,32727,-1608,32726,-1625,32725,-1642,32725,-1659,32724,-1675,32723,-1692,32722,-1709,32721,-1725,32720,-1742,32719,-1759,32718,-1776,32717,-1792,32717,-1809,32716,-1826,32715,-1843,32714,-1859,32713,-1876,32712,-1893,32711,-1909,32710,-1926,32709,-1943,32708,-1960,32707,-1976,32706,-1993,32705,-2010,32704,-2027,32703,-2043,32702,-2060,32701,-2077,32700,-2093,32699,-2110,32697,-2127,32696,-2144,32695,-2160,32694,-2177,32693,-2194,32692,-2210,32691,-2227,32690,-2244,32688,-2261,32687,-2277,32686,-2294,32685,-2311,32684,-2327,32683,-2344,32681,-2361,32680,-2378,32679,-2394,32678,-2411,32676,-2428,32675,-2444,32674,-2461,32673,-2478,32671,-2495,32670,-2511,32669,-2528,32668,-2545,32666,-2561,32665,-2578,32664,-2595,32662,-2611,32661,-2628,32660,-2645,32658,-2662,32657,-2678,32656,-2695,32654,-2712,32653,-2728,32651,-2745,32650,-2762,32649,-2778,32647,-2795,32646,-2812,32644,-2829,32643,-2845,32641,-2862,32640,-2879,32638,-2895,32637,-2912,32635,-2929,32634,-2945,32632,-2962,32631,-2979,32629,-2995,32628,-3012,32626,-3029,32625,-3045,32623,-3062,32622,-3079,32620,-3095,32618,-3112,32617,-3129,32615,-3146,32614,-3162,32612,-3179,32610,-3196,32609,-3212,32607,-3229,32605,-3246,32604,-3262,32602,-3279,32600,-3296,32599,-3312,32597,-3329,32595,-3346,32594,-3362,32592,-3379,32590,-3396,32588,-3412,32587,-3429,32585,-3446,32583,-3462,32581,-3479,32580,-3496,32578,-3512,32576,-3529,32574,-3546,32572,-3562,32571,-3579,32569,-3595,32567,-3612,32565,-3629,32563,-3645,32561,-3662,32559,-3679,32558,-3695,32556,-3712,32554,-3729,32552,-3745,32550,-3762,32548,-3779,32546,-3795,32544,-3812,32542,-3829,32540,-3845,32538,-3862,32536,-3878,32534,-3895,32532,-3912,32530,-3928,32528,-3945,32526,-3962,32524,-3978,32522,-3995,32520,-4012,32518,-4028,32516,-4045,32514,-4061,32512,-4078,32510,-4095,32508,-4111,32506,-4128,32503,-4145,32501,-4161,32499,-4178,32497,-4194,32495,-4211,32493,-4228,32491,-4244,32488,-4261,32486,-4277,32484,-4294,32482,-4311,32480,-4327,32477,-4344,32475,-4360,32473,-4377,32471,-4394,32468,-4410,32466,-4427,32464,-4444,32462,-4460,32459,-4477,32457,-4493,32455,-4510,32452,-4526,32450,-4543,32448,-4560,32445,-4576,32443,-4593,32441,-4609,32438,-4626,32436,-4643,32434,-4659,32431,-4676,32429,-4692,32426,-4709,32424,-4726,32422,-4742,32419,-4759,32417,-4775,32414,-4792,32412,-4808,32409,-4825,32407,-4842,32404,-4858,32402,-4875,32399,-4891,32397,-4908,32394,-4924,32392,-4941,32389,-4958,32387,-4974,32384,-4991,32382,-5007,32379,-5024,32377,-5040,32374,-5057,32371,-5073,32369,-5090,32366,-5107,32364,-5123,32361,-5140,32358,-5156,32356,-5173,32353,-5189,32350,-5206,32348,-5222,32345,-5239,32342,-5255,32340,-5272,32337,-5288,32334,-5305,32332,-5322,32329,-5338,32326,-5355,32323,-5371,32321,-5388,32318,-5404,32315,-5421,32312,-5437,32310,-5454,32307,-5470,32304,-5487,32301,-5503,32298,-5520,32295,-5536,32293,-5553,32290,-5569,32287,-5586,32284,-5602,32281,-5619,32278,-5635,32275,-5652,32273,-5668,32270,-5685,32267,-5701,32264,-5718,32261,-5734,32258,-5751,32255,-5767,32252,-5784,32249,-5800,32246,-5817,32243,-5833,32240,-5850,32237,-5866,32234,-5883,32231,-5899,32228,-5916,32225,-5932,32222,-5949,32219,-5965,32216,-5982,32213,-5998,32210,-6015,32207,-6031,32204,-6048,32201,-6064,32197,-6081,32194,-6097,32191,-6113,32188,-6130,32185,-6146,32182,-6163,32179,-6179,32176,-6196,32172,-6212,32169,-6229,32166,-6245,32163,-6262,32160,-6278,32156,-6294,32153,-6311,32150,-6327,32147,-6344,32143,-6360,32140,-6377,32137,-6393,32134,-6409,32130,-6426,32127,-6442,32124,-6459,32120,-6475,32117,-6492,32114,-6508,32110,-6524,32107,-6541,32104,-6557,32100,-6574,32097,-6590,32094,-6607,32090,-6623,32087,-6639,32084,-6656,32080,-6672,32077,-6689,32073,-6705,32070,-6721,32066,-6738,32063,-6754,32059,-6771,32056,-6787,32053,-6803,32049,-6820,32046,-6836,32042,-6852,32039,-6869,32035,-6885,32032,-6902,32028,-6918,32024,-6934,32021,-6951,32017,-6967,32014,-6983,32010,-7000,32007,-7016,32003,-7033,31999,-7049,31996,-7065,31992,-7082,31989,-7098,31985,-7114,31981,-7131,31978,-7147,31974,-7163,31970,-7180,31967,-7196,31963,-7212,31959,-7229,31956,-7245,31952,-7262,31948,-7278,31944,-7294,31941,-7311,31937,-7327,31933,-7343,31929,-7359,31926,-7376,31922,-7392,31918,-7408,31914,-7425,31911,-7441,31907,-7457,31903,-7474,31899,-7490,31895,-7506,31891,-7523,31888,-7539,31884,-7555,31880,-7572,31876,-7588,31872,-7604,31868,-7620,31864,-7637,31860,-7653,31856,-7669,31853,-7686,31849,-7702,31845,-7718,31841,-7734,31837,-7751,31833,-7767,31829,-7783,31825,-7800,31821,-7816,31817,-7832,31813,-7848,31809,-7865,31805,-7881,31801,-7897,31797,-7913,31793,-7930,31789,-7946,31785,-7962,31780,-7978,31776,-7995,31772,-8011,31768,-8027,31764,-8043,31760,-8060,31756,-8076,31752,-8092,31748,-8108,31743,-8125,31739,-8141,31735,-8157,31731,-8173,31727,-8190,31723,-8206,31718,-8222,31714,-8238,31710,-8254,31706,-8271,31701,-8287,31697,-8303,31693,-8319,31689,-8335,31684,-8352,31680,-8368,31676,-8384,31672,-8400,31667,-8416,31663,-8433,31659,-8449,31654,-8465,31650,-8481,31646,-8497,31641,-8514,31637,-8530,31633,-8546,31628,-8562,31624,-8578,31619,-8594,31615,-8611,31611,-8627,31606,-8643,31602,-8659,31597,-8675,31593,-8691,31588,-8708,31584,-8724,31580,-8740,31575,-8756,31571,-8772,31566,-8788,31562,-8804,31557,-8821,31553,-8837,31548,-8853,31544,-8869,31539,-8885,31534,-8901,31530,-8917,31525,-8933,31521,-8950,31516,-8966,31512,-8982,31507,-8998,31502,-9014,31498,-9030,31493,-9046,31489,-9062,31484,-9078,31479,-9095,31475,-9111,31470,-9127,31465,-9143,31461,-9159,31456,-9175,31451,-9191,31446,-9207,31442,-9223,31437,-9239,31432,-9255,31428,-9271,31423,-9288,31418,-9304,31413,-9320,31409,-9336,31404,-9352,31399,-9368,31394,-9384,31389,-9400,31385,-9416,31380,-9432,31375,-9448,31370,-9464,31365,-9480,31360,-9496,31356,-9512,31351,-9528,31346,-9544,31341,-9560,31336,-9576,31331,-9592,31326,-9608,31321,-9624,31316,-9640,31311,-9656,31307,-9672,31302,-9688,31297,-9704,31292,-9720,31287,-9736,31282,-9752,31277,-9768,31272,-9784,31267,-9800,31262,-9816,31257,-9832,31252,-9848,31247,-9864,31242,-9880,31236,-9896,31231,-9912,31226,-9928,31221,-9944,31216,-9960,31211,-9976,31206,-9992,31201,-10008,31196,-10024,31191,-10040,31185,-10056,31180,-10072,31175,-10088,31170,-10104,31165,-10120,31160,-10136,31154,-10152,31149,-10167,31144,-10183,31139,-10199,31134,-10215,31128,-10231,31123,-10247,31118,-10263,31113,-10279,31107,-10295,31102,-10311,31097,-10327,31092,-10343,31086,-10358,31081,-10374,31076,-10390,31070,-10406,31065,-10422,31060,-10438,31054,-10454,31049,-10470,31044,-10485,31038,-10501,31033,-10517,31028,-10533,31022,-10549,31017,-10565,31011,-10581,31006,-10597,31001,-10612,30995,-10628,30990,-10644,30984,-10660,30979,-10676,30973,-10692,30968,-10707,30962,-10723,30957,-10739,30951,-10755,30946,-10771,30940,-10787,30935,-10802,30929,-10818,30924,-10834,30918,-10850,30913,-10866,30907,-10881,30902,-10897,30896,-10913,30890,-10929,30885,-10945,30879,-10960,30874,-10976,30868,-10992,30862,-11008,30857,-11024,30851,-11039,30845,-11055,30840,-11071,30834,-11087,30828,-11102,30823,-11118,30817,-11134,30811,-11150,30806,-11165,30800,-11181,30794,-11197,30788,-11213,30783,-11228,30777,-11244,30771,-11260,30766,-11276,30760,-11291,30754,-11307,30748,-11323,30742,-11339,30737,-11354,30731,-11370,30725,-11386,30719,-11401,30713,-11417,30707,-11433,30702,-11449,30696,-11464,30690,-11480,30684,-11496,30678,-11511,30672,-11527,30666,-11543,30660,-11558,30655,-11574,30649,-11590,30643,-11605,30637,-11621,30631,-11637,30625,-11652,30619,-11668,30613,-11684,30607,-11699,30601,-11715,30595,-11731,30589,-11746,30583,-11762,30577,-11778,30571,-11793,30565,-11809,30559,-11824,30553,-11840,30547,-11856,30541,-11871,30535,-11887,30528,-11903,30522,-11918,30516,-11934,30510,-11949,30504,-11965,30498,-11981,30492,-11996,30486,-12012,30480,-12027,30473,-12043,30467,-12058,30461,-12074,30455,-12090,30449,-12105,30442,-12121,30436,-12136,30430,-12152,30424,-12167,30418,-12183,30411,-12199,30405,-12214,30399,-12230,30393,-12245,30386,-12261,30380,-12276,30374,-12292,30368,-12307,30361,-12323,30355,-12338,30349,-12354,30342,-12369,30336,-12385,30330,-12400,30323,-12416,30317,-12431,30311,-12447,30304,-12462,30298,-12478,30291,-12493,30285,-12509,30279,-12524,30272,-12540,30266,-12555,30259,-12571,30253,-12586,30247,-12602,30240,-12617,30234,-12633,30227,-12648,30221,-12664,30214,-12679,30208,-12695,30201,-12710,30195,-12725,30188,-12741,30182,-12756,30175,-12772,30169,-12787,30162,-12803,30156,-12818,30149,-12833,30142,-12849,30136,-12864,30129,-12880,30123,-12895,30116,-12910,30109,-12926,30103,-12941,30096,-12957,30090,-12972,30083,-12987,30076,-13003,30070,-13018,30063,-13034,30056,-13049,30050,-13064,30043,-13080,30036,-13095,30030,-13110,30023,-13126,30016,-13141,30009,-13156,30003,-13172,29996,-13187,29989,-13202,29983,-13218,29976,-13233,29969,-13248,29962,-13264,29955,-13279,29949,-13294,29942,-13310,29935,-13325,29928,-13340,29921,-13356,29915,-13371,29908,-13386,29901,-13401,29894,-13417,29887,-13432,29880,-13447,29873,-13463,29866,-13478,29860,-13493,29853,-13508,29846,-13524,29839,-13539,29832,-13554,29825,-13569,29818,-13585,29811,-13600,29804,-13615,29797,-13630,29790,-13646,29783,-13661,29776,-13676,29769,-13691,29762,-13707,29755,-13722,29748,-13737,29741,-13752,29734,-13767,29727,-13783,29720,-13798,29713,-13813,29706,-13828,29699,-13843,29692,-13859,29685,-13874,29678,-13889,29670,-13904,29663,-13919,29656,-13934,29649,-13950,29642,-13965,29635,-13980,29628,-13995,29621,-14010,29613,-14025,29606,-14040,29599,-14056,29592,-14071,29585,-14086,29577,-14101,29570,-14116,29563,-14131,29556,-14146,29548,-14161,29541,-14177,29534,-14192,29527,-14207,29519,-14222,29512,-14237,29505,-14252,29498,-14267,29490,-14282,29483,-14297,29476,-14312,29468,-14327,29461,-14343,29454,-14358,29446,-14373,29439,-14388,29432,-14403,29424,-14418,29417,-14433,29410,-14448,29402,-14463,29395,-14478,29387,-14493,29380,-14508,29372,-14523,29365,-14538,29358,-14553,29350,-14568,29343,-14583,29335,-14598,29328,-14613,29320,-14628,29313,-14643,29305,-14658,29298,-14673,29290,-14688,29283,-14703,29275,-14718,29268,-14733,29260,-14748,29253,-14763,29245,-14778,29238,-14793,29230,-14808,29222,-14823,29215,-14838,29207,-14853,29200,-14867,29192,-14882,29184,-14897,29177,-14912,29169,-14927,29162,-14942,29154,-14957,29146,-14972,29139,-14987,29131,-15002,29123,-15017,29116,-15031,29108,-15046,29100,-15061,29092,-15076,29085,-15091,29077,-15106,29069,-15121,29062,-15136,29054,-15150,29046,-15165,29038,-15180,29031,-15195,29023,-15210,29015,-15225,29007,-15239,28999,-15254,28992,-15269,28984,-15284,28976,-15299,28968,-15314,28960,-15328,28953,-15343,28945,-15358,28937,-15373,28929,-15388,28921,-15402,28913,-15417,28905,-15432,28897,-15447,28890,-15462,28882,-15476,28874,-15491,28866,-15506,28858,-15521,28850,-15535,28842,-15550,28834,-15565,28826,-15580,28818,-15594,28810,-15609,28802,-15624,28794,-15639,28786,-15653,28778,-15668,28770,-15683,28762,-15697,28754,-15712,28746,-15727,28738,-15741,28730,-15756,28722,-15771,28714,-15786,28706,-15800,28698,-15815,28690,-15830,28681,-15844,28673,-15859,28665,-15874,28657,-15888,28649,-15903,28641,-15918,28633,-15932,28625,-15947,28616,-15961,28608,-15976,28600,-15991,28592,-16005,28584,-16020,28575,-16035,28567,-16049,28559,-16064,28551,-16078,28543,-16093,28534,-16108,28526,-16122,28518,-16137,28510,-16151,28501,-16166,28493,-16180,28485,-16195,28477,-16210,28468,-16224,28460,-16239,28452,-16253,28443,-16268,28435,-16282,28427,-16297,28418,-16311,28410,-16326,28402,-16340,28393,-16355,28385,-16369,28377,-16384,28368,-16399,28360,-16413,28351,-16428,28343,-16442,28335,-16456,28326,-16471,28318,-16485,28309,-16500,28301,-16514,28292,-16529,28284,-16543,28275,-16558,28267,-16572,28259,-16587,28250,-16601,28242,-16616,28233,-16630,28225,-16644,28216,-16659,28208,-16673,28199,-16688,28190,-16702,28182,-16717,28173,-16731,28165,-16745,28156,-16760,28148,-16774,28139,-16789,28131,-16803,28122,-16817,28113,-16832,28105,-16846,28096,-16860,28087,-16875,28079,-16889,28070,-16904,28062,-16918,28053,-16932,28044,-16947,28036,-16961,28027,-16975,28018,-16990,28009,-17004,28001,-17018,27992,-17033,27983,-17047,27975,-17061,27966,-17075,27957,-17090,27948,-17104,27940,-17118,27931,-17133,27922,-17147,27913,-17161,27905,-17175,27896,-17190,27887,-17204,27878,-17218,27869,-17233,27861,-17247,27852,-17261,27843,-17275,27834,-17289,27825,-17304,27816,-17318,27808,-17332,27799,-17346,27790,-17361,27781,-17375,27772,-17389,27763,-17403,27754,-17417,27745,-17432,27736,-17446,27728,-17460,27719,-17474,27710,-17488,27701,-17502,27692,-17517,27683,-17531,27674,-17545,27665,-17559,27656,-17573,27647,-17587,27638,-17601,27629,-17616,27620,-17630,27611,-17644,27602,-17658,27593,-17672,27584,-17686,27575,-17700,27566,-17714,27557,-17728,27548,-17743,27538,-17757,27529,-17771,27520,-17785,27511,-17799,27502,-17813,27493,-17827,27484,-17841,27475,-17855,27466,-17869,27456,-17883,27447,-17897,27438,-17911,27429,-17925,27420,-17939,27411,-17953,27401,-17967,27392,-17981,27383,-17995,27374,-18009,27365,-18023,27355,-18037,27346,-18051,27337,-18065,27328,-18079,27319,-18093,27309,-18107,27300,-18121,27291,-18135,27281,-18149,27272,-18163,27263,-18177,27254,-18191,27244,-18205,27235,-18219,27226,-18233,27216,-18247,27207,-18261,27198,-18274,27188,-18288,27179,-18302,27170,-18316,27160,-18330,27151,-18344,27141,-18358,27132,-18372,27123,-18386,27113,-18399,27104,-18413,27094,-18427,27085,-18441,27076,-18455,27066,-18469,27057,-18483,27047,-18496,27038,-18510,27028,-18524,27019,-18538,27009,-18552,27000,-18565,26990,-18579,26981,-18593,26971,-18607,26962,-18621,26952,-18634,26943,-18648,26933,-18662,26924,-18676,26914,-18690,26905,-18703,26895,-18717,26885,-18731,26876,-18745,26866,-18758,26857,-18772,26847,-18786,26837,-18799,26828,-18813,26818,-18827,26809,-18841,26799,-18854,26789,-18868,26780,-18882,26770,-18895,26760,-18909,26751,-18923,26741,-18936,26731,-18950,26722,-18964,26712,-18977,26702,-18991,26692,-19005,26683,-19018,26673,-19032,26663,-19046,26654,-19059,26644,-19073,26634,-19087,26624,-19100,26615,-19114,26605,-19127,26595,-19141,26585,-19155,26575,-19168,26566,-19182,26556,-19195,26546,-19209,26536,-19222,26526,-19236,26516,-19250,26507,-19263,26497,-19277,26487,-19290,26477,-19304,26467,-19317,26457,-19331,26447,-19344,26437,-19358,26428,-19371,26418,-19385,26408,-19398,26398,-19412,26388,-19425,26378,-19439,26368,-19452,26358,-19466,26348,-19479,26338,-19493,26328,-19506,26318,-19520,26308,-19533,26298,-19547,26288,-19560,26278,-19574,26268,-19587,26258,-19600,26248,-19614,26238,-19627,26228,-19641,26218,-19654,26208,-19668,26198,-19681,26188,-19694,26178,-19708,26168,-19721,26158,-19734,26148,-19748,26137,-19761,26127,-19775,26117,-19788,26107,-19801,26097,-19815,26087,-19828,26077,-19841,26067,-19855,26056,-19868,26046,-19881,26036,-19895,26026,-19908,26016,-19921,26006,-19934,25995,-19948,25985,-19961,25975,-19974,25965,-19988,25954,-20001,25944,-20014,25934,-20027,25924,-20041,25913,-20054,25903,-20067,25893,-20080,25883,-20094,25872,-20107,25862,-20120,25852,-20133,25842,-20147,25831,-20160,25821,-20173,25811,-20186,25800,-20199,25790,-20213,25780,-20226,25769,-20239,25759,-20252,25749,-20265,25738,-20278,25728,-20292,25717,-20305,25707,-20318,25697,-20331,25686,-20344,25676,-20357,25665,-20370,25655,-20384,25645,-20397,25634,-20410,25624,-20423,25613,-20436,25603,-20449,25592,-20462,25582,-20475,25571,-20488,25561,-20501,25550,-20514,25540,-20528,25529,-20541,25519,-20554,25508,-20567,25498,-20580,25487,-20593,25477,-20606,25466,-20619,25456,-20632,25445,-20645,25435,-20658,25424,-20671,25414,-20684,25403,-20697,25392,-20710,25382,-20723,25371,-20736,25361,-20749,25350,-20762,25339,-20775,25329,-20788,25318,-20801,25307,-20814,25297,-20826,25286,-20839,25276,-20852,25265,-20865,25254,-20878,25243,-20891,25233,-20904,25222,-20917,25211,-20930,25201,-20943,25190,-20956,25179,-20968,25169,-20981,25158,-20994,25147,-21007,25136,-21020,25126,-21033,25115,-21046,25104,-21058,25093,-21071,25083,-21084,25072,-21097,25061,-21110,25050,-21123,25039,-21135,25029,-21148,25018,-21161,25007,-21174,24996,-21187,24985,-21199,24974,-21212,24964,-21225,24953,-21238,24942,-21250,24931,-21263,24920,-21276,24909,-21289,24898,-21301,24887,-21314,24877,-21327,24866,-21340,24855,-21352,24844,-21365,24833,-21378,24822,-21390,24811,-21403,24800,-21416,24789,-21428,24778,-21441,24767,-21454,24756,-21466,24745,-21479,24734,-21492,24723,-21504,24712,-21517,24701,-21530,24690,-21542,24679,-21555,24668,-21567,24657,-21580,24646,-21593,24635,-21605,24624,-21618,24613,-21630,24602,-21643,24591,-21656,24580,-21668,24569,-21681,24558,-21693,24546,-21706,24535,-21718,24524,-21731,24513,-21744,24502,-21756,24491,-21769,24480,-21781,24469,-21794,24457,-21806,24446,-21819,24435,-21831,24424,-21844,24413,-21856,24402,-21869,24390,-21881,24379,-21894,24368,-21906,24357,-21918,24346,-21931,24334,-21943,24323,-21956,24312,-21968,24301,-21981,24289,-21993,24278,-22005,24267,-22018,24256,-22030,24244,-22043,24233,-22055,24222,-22067,24211,-22080,24199,-22092,24188,-22105,24177,-22117,24165,-22129,24154,-22142,24143,-22154,24131,-22166,24120,-22179,24109,-22191,24097,-22203,24086,-22216,24075,-22228,24063,-22240,24052,-22253,24041,-22265,24029,-22277,24018,-22289,24006,-22302,23995,-22314,23984,-22326,23972,-22339,23961,-22351,23949,-22363,23938,-22375,23926,-22388,23915,-22400,23903,-22412,23892,-22424,23881,-22436,23869,-22449,23858,-22461,23846,-22473,23835,-22485,23823,-22497,23812,-22510,23800,-22522,23789,-22534,23777,-22546,23766,-22558,23754,-22570,23742,-22583,23731,-22595,23719,-22607,23708,-22619,23696,-22631,23685,-22643,23673,-22655,23661,-22667,23650,-22679,23638,-22692,23627,-22704,23615,-22716,23603,-22728,23592,-22740,23580,-22752,23569,-22764,23557,-22776,23545,-22788,23534,-22800,23522,-22812,23510,-22824,23499,-22836,23487,-22848,23475,-22860,23464,-22872,23452,-22884,23440,-22896,23428,-22908,23417,-22920,23405,-22932,23393,-22944,23382,-22956,23370,-22968,23358,-22980,23346,-22992,23335,-23004,23323,-23016,23311,-23028,23299,-23040,23287,-23051,23276,-23063,23264,-23075,23252,-23087,23240,-23099,23228,-23111,23217,-23123,23205,-23135,23193,-23147,23181,-23158,23169,-23170,23157,-23182,23146,-23194,23134,-23206,23122,-23218,23110,-23229,23098,-23241,23086,-23253,23074,-23265,23062,-23277,23050,-23288,23039,-23300,23027,-23312,23015,-23324,23003,-23336,22991,-23347,22979,-23359,22967,-23371,22955,-23383,22943,-23394,22931,-23406,22919,-23418,22907,-23429,22895,-23441,22883,-23453,22871,-23465,22859,-23476,22847,-23488,22835,-23500,22823,-23511,22811,-23523,22799,-23535,22787,-23546,22775,-23558,22763,-23570,22751,-23581,22739,-23593,22727,-23604,22715,-23616,22703,-23628,22691,-23639,22678,-23651,22666,-23662,22654,-23674,22642,-23686,22630,-23697,22618,-23709,22606,-23720,22594,-23732,22582,-23743,22569,-23755,22557,-23767,22545,-23778,22533,-23790,22521,-23801,22509,-23813,22496,-23824,22484,-23836,22472,-23847,22460,-23859,22448,-23870,22435,-23882,22423,-23893,22411,-23904,22399,-23916,22387,-23927,22374,-23939,22362,-23950,22350,-23962,22338,-23973,22325,-23985,22313,-23996,22301,-24007,22288,-24019,22276,-24030,22264,-24042,22252,-24053,22239,-24064,22227,-24076,22215,-24087,22202,-24098,22190,-24110,22178,-24121,22165,-24132,22153,-24144,22141,-24155,22128,-24166,22116,-24178,22104,-24189,22091,-24200,22079,-24212,22066,-24223,22054,-24234,22042,-24245,22029,-24257,22017,-24268,22004,-24279,21992,-24290,21980,-24302,21967,-24313,21955,-24324,21942,-24335,21930,-24347,21917,-24358,21905,-24369,21893,-24380,21880,-24391,21868,-24403,21855,-24414,21843,-24425,21830,-24436,21818,-24447,21805,-24458,21793,-24470,21780,-24481,21768,-24492,21755,-24503,21743,-24514,21730,-24525,21717,-24536,21705,-24547,21692,-24559,21680,-24570,21667,-24581,21655,-24592,21642,-24603,21629,-24614,21617,-24625,21604,-24636,21592,-24647,21579,-24658,21566,-24669,21554,-24680,21541,-24691,21529,-24702,21516,-24713,21503,-24724,21491,-24735,21478,-24746,21465,-24757,21453,-24768,21440,-24779,21427,-24790,21415,-24801,21402,-24812,21389,-24823,21377,-24834,21364,-24845,21351,-24856,21339,-24867,21326,-24878,21313,-24888,21300,-24899,21288,-24910,21275,-24921,21262,-24932,21249,-24943,21237,-24954,21224,-24965,21211,-24975,21198,-24986,21186,-24997,21173,-25008,21160,-25019,21147,-25030,21134,-25040,21122,-25051,21109,-25062,21096,-25073,21083,-25084,21070,-25094,21057,-25105,21045,-25116,21032,-25127,21019,-25137,21006,-25148,20993,-25159,20980,-25170,20967,-25180,20955,-25191,20942,-25202,20929,-25212,20916,-25223,20903,-25234,20890,-25244,20877,-25255,20864,-25266,20851,-25277,20838,-25287,20825,-25298,20813,-25308,20800,-25319,20787,-25330,20774,-25340,20761,-25351,20748,-25362,20735,-25372,20722,-25383,20709,-25393,20696,-25404,20683,-25415,20670,-25425,20657,-25436,20644,-25446,20631,-25457,20618,-25467,20605,-25478,20592,-25488,20579,-25499,20566,-25509,20553,-25520,20540,-25530,20527,-25541,20513,-25551,20500,-25562,20487,-25572,20474,-25583,20461,-25593,20448,-25604,20435,-25614,20422,-25625,20409,-25635,20396,-25646,20383,-25656,20369,-25666,20356,-25677,20343,-25687,20330,-25698,20317,-25708,20304,-25718,20291,-25729,20277,-25739,20264,-25750,20251,-25760,20238,-25770,20225,-25781,20212,-25791,20198,-25801,20185,-25812,20172,-25822,20159,-25832,20146,-25843,20132,-25853,20119,-25863,20106,-25873,20093,-25884,20079,-25894,20066,-25904,20053,-25914,20040,-25925,20026,-25935,20013,-25945,20000,-25955,19987,-25966,19973,-25976,19960,-25986,19947,-25996,19933,-26007,19920,-26017,19907,-26027,19894,-26037,19880,-26047,19867,-26057,19854,-26068,19840,-26078,19827,-26088,19814,-26098,19800,-26108,19787,-26118,19774,-26128,19760,-26138,19747,-26149,19733,-26159,19720,-26169,19707,-26179,19693,-26189,19680,-26199,19667,-26209,19653,-26219,19640,-26229,19626,-26239,19613,-26249,19599,-26259,19586,-26269,19573,-26279,19559,-26289,19546,-26299,19532,-26309,19519,-26319,19505,-26329,19492,-26339,19478,-26349,19465,-26359,19451,-26369,19438,-26379,19424,-26389,19411,-26399,19397,-26409,19384,-26419,19370,-26429,19357,-26438,19343,-26448,19330,-26458,19316,-26468,19303,-26478,19289,-26488,19276,-26498,19262,-26508,19249,-26517,19235,-26527,19221,-26537,19208,-26547,19194,-26557,19181,-26567,19167,-26576,19154,-26586,19140,-26596,19126,-26606,19113,-26616,19099,-26625,19086,-26635,19072,-26645,19058,-26655,19045,-26664,19031,-26674,19017,-26684,19004,-26693,18990,-26703,18976,-26713,18963,-26723,18949,-26732,18935,-26742,18922,-26752,18908,-26761,18894,-26771,18881,-26781,18867,-26790,18853,-26800,18840,-26810,18826,-26819,18812,-26829,18798,-26838,18785,-26848,18771,-26858,18757,-26867,18744,-26877,18730,-26886,18716,-26896,18702,-26906,18689,-26915,18675,-26925,18661,-26934,18647,-26944,18633,-26953,18620,-26963,18606,-26972,18592,-26982,18578,-26991,18564,-27001,18551,-27010,18537,-27020,18523,-27029,18509,-27039,18495,-27048,18482,-27058,18468,-27067,18454,-27077,18440,-27086,18426,-27095,18412,-27105,18398,-27114,18385,-27124,18371,-27133,18357,-27142,18343,-27152,18329,-27161,18315,-27171,18301,-27180,18287,-27189,18273,-27199,18260,-27208,18246,-27217,18232,-27227,18218,-27236,18204,-27245,18190,-27255,18176,-27264,18162,-27273,18148,-27282,18134,-27292,18120,-27301,18106,-27310,18092,-27320,18078,-27329,18064,-27338,18050,-27347,18036,-27356,18022,-27366,18008,-27375,17994,-27384,17980,-27393,17966,-27402,17952,-27412,17938,-27421,17924,-27430,17910,-27439,17896,-27448,17882,-27457,17868,-27467,17854,-27476,17840,-27485,17826,-27494,17812,-27503,17798,-27512,17784,-27521,17770,-27530,17756,-27539,17742,-27549,17727,-27558,17713,-27567,17699,-27576,17685,-27585,17671,-27594,17657,-27603,17643,-27612,17629,-27621,17615,-27630,17600,-27639,17586,-27648,17572,-27657,17558,-27666,17544,-27675,17530,-27684,17516,-27693,17501,-27702,17487,-27711,17473,-27720,17459,-27729,17445,-27737,17431,-27746,17416,-27755,17402,-27764,17388,-27773,17374,-27782,17360,-27791,17345,-27800,17331,-27809,17317,-27817,17303,-27826,17288,-27835,17274,-27844,17260,-27853,17246,-27862,17232,-27870,17217,-27879,17203,-27888,17189,-27897,17174,-27906,17160,-27914,17146,-27923,17132,-27932,17117,-27941,17103,-27949,17089,-27958,17074,-27967,17060,-27976,17046,-27984,17032,-27993,17017,-28002,17003,-28010,16989,-28019,16974,-28028,16960,-28037,16946,-28045,16931,-28054,16917,-28063,16903,-28071,16888,-28080,16874,-28088,16859,-28097,16845,-28106,16831,-28114,16816,-28123,16802,-28132,16788,-28140,16773,-28149,16759,-28157,16744,-28166,16730,-28174,16716,-28183,16701,-28191,16687,-28200,16672,-28209,16658,-28217,16643,-28226,16629,-28234,16615,-28243,16600,-28251,16586,-28260,16571,-28268,16557,-28276,16542,-28285,16528,-28293,16513,-28302,16499,-28310,16484,-28319,16470,-28327,16455,-28336,16441,-28344,16427,-28352,16412,-28361,16398,-28369,16383,-28378,16368,-28386,16354,-28394,16339,-28403,16325,-28411,16310,-28419,16296,-28428,16281,-28436,16267,-28444,16252,-28453,16238,-28461,16223,-28469,16209,-28478,16194,-28486,16179,-28494,16165,-28502,16150,-28511,16136,-28519,16121,-28527,16107,-28535,16092,-28544,16077,-28552,16063,-28560,16048,-28568,16034,-28576,16019,-28585,16004,-28593,15990,-28601,15975,-28609,15960,-28617,15946,-28626,15931,-28634,15917,-28642,15902,-28650,15887,-28658,15873,-28666,15858,-28674,15843,-28682,15829,-28691,15814,-28699,15799,-28707,15785,-28715,15770,-28723,15755,-28731,15740,-28739,15726,-28747,15711,-28755,15696,-28763,15682,-28771,15667,-28779,15652,-28787,15638,-28795,15623,-28803,15608,-28811,15593,-28819,15579,-28827,15564,-28835,15549,-28843,15534,-28851,15520,-28859,15505,-28867,15490,-28875,15475,-28883,15461,-28891,15446,-28898,15431,-28906,15416,-28914,15401,-28922,15387,-28930,15372,-28938,15357,-28946,15342,-28954,15327,-28961,15313,-28969,15298,-28977,15283,-28985,15268,-28993,15253,-29000,15238,-29008,15224,-29016,15209,-29024,15194,-29032,15179,-29039,15164,-29047,15149,-29055,15135,-29063,15120,-29070,15105,-29078,15090,-29086,15075,-29093,15060,-29101,15045,-29109,15030,-29117,15016,-29124,15001,-29132,14986,-29140,14971,-29147,14956,-29155,14941,-29163,14926,-29170,14911,-29178,14896,-29185,14881,-29193,14866,-29201,14852,-29208,14837,-29216,14822,-29223,14807,-29231,14792,-29239,14777,-29246,14762,-29254,14747,-29261,14732,-29269,14717,-29276,14702,-29284,14687,-29291,14672,-29299,14657,-29306,14642,-29314,14627,-29321,14612,-29329,14597,-29336,14582,-29344,14567,-29351,14552,-29359,14537,-29366,14522,-29373,14507,-29381,14492,-29388,14477,-29396,14462,-29403,14447,-29411,14432,-29418,14417,-29425,14402,-29433,14387,-29440,14372,-29447,14357,-29455,14342,-29462,14326,-29469,14311,-29477,14296,-29484,14281,-29491,14266,-29499,14251,-29506,14236,-29513,14221,-29520,14206,-29528,14191,-29535,14176,-29542,14160,-29549,14145,-29557,14130,-29564,14115,-29571,14100,-29578,14085,-29586,14070,-29593,14055,-29600,14039,-29607,14024,-29614,14009,-29622,13994,-29629,13979,-29636,13964,-29643,13949,-29650,13933,-29657,13918,-29664,13903,-29671,13888,-29679,13873,-29686,13858,-29693,13842,-29700,13827,-29707,13812,-29714,13797,-29721,13782,-29728,13766,-29735,13751,-29742,13736,-29749,13721,-29756,13706,-29763,13690,-29770,13675,-29777,13660,-29784,13645,-29791,13629,-29798,13614,-29805,13599,-29812,13584,-29819,13568,-29826,13553,-29833,13538,-29840,13523,-29847,13507,-29854,13492,-29861,13477,-29867,13462,-29874,13446,-29881,13431,-29888,13416,-29895,13400,-29902,13385,-29909,13370,-29916,13355,-29922,13339,-29929,13324,-29936,13309,-29943,13293,-29950,13278,-29956,13263,-29963,13247,-29970,13232,-29977,13217,-29984,13201,-29990,13186,-29997,13171,-30004,13155,-30010,13140,-30017,13125,-30024,13109,-30031,13094,-30037,13079,-30044,13063,-30051,13048,-30057,13033,-30064,13017,-30071,13002,-30077,12986,-30084,12971,-30091,12956,-30097,12940,-30104,12925,-30110,12909,-30117,12894,-30124,12879,-30130,12863,-30137,12848,-30143,12832,-30150,12817,-30157,12802,-30163,12786,-30170,12771,-30176,12755,-30183,12740,-30189,12724,-30196,12709,-30202,12694,-30209,12678,-30215,12663,-30222,12647,-30228,12632,-30235,12616,-30241,12601,-30248,12585,-30254,12570,-30260,12554,-30267,12539,-30273,12523,-30280,12508,-30286,12492,-30292,12477,-30299,12461,-30305,12446,-30312,12430,-30318,12415,-30324,12399,-30331,12384,-30337,12368,-30343,12353,-30350,12337,-30356,12322,-30362,12306,-30369,12291,-30375,12275,-30381,12260,-30387,12244,-30394,12229,-30400,12213,-30406,12198,-30412,12182,-30419,12166,-30425,12151,-30431,12135,-30437,12120,-30443,12104,-30450,12089,-30456,12073,-30462,12057,-30468,12042,-30474,12026,-30481,12011,-30487,11995,-30493,11980,-30499,11964,-30505,11948,-30511,11933,-30517,11917,-30523,11902,-30529,11886,-30536,11870,-30542,11855,-30548,11839,-30554,11823,-30560,11808,-30566,11792,-30572,11777,-30578,11761,-30584,11745,-30590,11730,-30596,11714,-30602,11698,-30608,11683,-30614,11667,-30620,11651,-30626,11636,-30632,11620,-30638,11604,-30644,11589,-30650,11573,-30656,11557,-30661,11542,-30667,11526,-30673,11510,-30679,11495,-30685,11479,-30691,11463,-30697,11448,-30703,11432,-30708,11416,-30714,11400,-30720,11385,-30726,11369,-30732,11353,-30738,11338,-30743,11322,-30749,11306,-30755,11290,-30761,11275,-30767,11259,-30772,11243,-30778,11227,-30784,11212,-30789,11196,-30795,11180,-30801,11164,-30807,11149,-30812,11133,-30818,11117,-30824,11101,-30829,11086,-30835,11070,-30841,11054,-30846,11038,-30852,11023,-30858,11007,-30863,10991,-30869,10975,-30875,10959,-30880,10944,-30886,10928,-30891,10912,-30897,10896,-30903,10880,-30908,10865,-30914,10849,-30919,10833,-30925,10817,-30930,10801,-30936,10786,-30941,10770,-30947,10754,-30952,10738,-30958,10722,-30963,10706,-30969,10691,-30974,10675,-30980,10659,-30985,10643,-30991,10627,-30996,10611,-31002,10596,-31007,10580,-31012,10564,-31018,10548,-31023,10532,-31029,10516,-31034,10500,-31039,10484,-31045,10469,-31050,10453,-31055,10437,-31061,10421,-31066,10405,-31071,10389,-31077,10373,-31082,10357,-31087,10342,-31093,10326,-31098,10310,-31103,10294,-31108,10278,-31114,10262,-31119,10246,-31124,10230,-31129,10214,-31135,10198,-31140,10182,-31145,10166,-31150,10151,-31155,10135,-31161,10119,-31166,10103,-31171,10087,-31176,10071,-31181,10055,-31186,10039,-31192,10023,-31197,10007,-31202,9991,-31207,9975,-31212,9959,-31217,9943,-31222,9927,-31227,9911,-31232,9895,-31237,9879,-31243,9863,-31248,9847,-31253,9831,-31258,9815,-31263,9799,-31268,9783,-31273,9767,-31278,9751,-31283,9735,-31288,9719,-31293,9703,-31298,9687,-31303,9671,-31308,9655,-31312,9639,-31317,9623,-31322,9607,-31327,9591,-31332,9575,-31337,9559,-31342,9543,-31347,9527,-31352,9511,-31357,9495,-31361,9479,-31366,9463,-31371,9447,-31376,9431,-31381,9415,-31386,9399,-31390,9383,-31395,9367,-31400,9351,-31405,9335,-31410,9319,-31414,9303,-31419,9287,-31424,9270,-31429,9254,-31433,9238,-31438,9222,-31443,9206,-31447,9190,-31452,9174,-31457,9158,-31462,9142,-31466,9126,-31471,9110,-31476,9094,-31480,9077,-31485,9061,-31490,9045,-31494,9029,-31499,9013,-31503,8997,-31508,8981,-31513,8965,-31517,8949,-31522,8932,-31526,8916,-31531,8900,-31535,8884,-31540,8868,-31545,8852,-31549,8836,-31554,8820,-31558,8803,-31563,8787,-31567,8771,-31572,8755,-31576,8739,-31581,8723,-31585,8707,-31589,8690,-31594,8674,-31598,8658,-31603,8642,-31607,8626,-31612,8610,-31616,8593,-31620,8577,-31625,8561,-31629,8545,-31634,8529,-31638,8513,-31642,8496,-31647,8480,-31651,8464,-31655,8448,-31660,8432,-31664,8415,-31668,8399,-31673,8383,-31677,8367,-31681,8351,-31685,8334,-31690,8318,-31694,8302,-31698,8286,-31702,8270,-31707,8253,-31711,8237,-31715,8221,-31719,8205,-31724,8189,-31728,8172,-31732,8156,-31736,8140,-31740,8124,-31744,8107,-31749,8091,-31753,8075,-31757,8059,-31761,8042,-31765,8026,-31769,8010,-31773,7994,-31777,7977,-31781,7961,-31786,7945,-31790,7929,-31794,7912,-31798,7896,-31802,7880,-31806,7864,-31810,7847,-31814,7831,-31818,7815,-31822,7799,-31826,7782,-31830,7766,-31834,7750,-31838,7733,-31842,7717,-31846,7701,-31850,7685,-31854,7668,-31857,7652,-31861,7636,-31865,7619,-31869,7603,-31873,7587,-31877,7571,-31881,7554,-31885,7538,-31889,7522,-31892,7505,-31896,7489,-31900,7473,-31904,7456,-31908,7440,-31912,7424,-31915,7407,-31919,7391,-31923,7375,-31927,7358,-31930,7342,-31934,7326,-31938,7310,-31942,7293,-31945,7277,-31949,7261,-31953,7244,-31957,7228,-31960,7211,-31964,7195,-31968,7179,-31971,7162,-31975,7146,-31979,7130,-31982,7113,-31986,7097,-31990,7081,-31993,7064,-31997,7048,-32000,7032,-32004,7015,-32008,6999,-32011,6982,-32015,6966,-32018,6950,-32022,6933,-32025,6917,-32029,6901,-32033,6884,-32036,6868,-32040,6851,-32043,6835,-32047,6819,-32050,6802,-32054,6786,-32057,6770,-32060,6753,-32064,6737,-32067,6720,-32071,6704,-32074,6688,-32078,6671,-32081,6655,-32085,6638,-32088,6622,-32091,6606,-32095,6589,-32098,6573,-32101,6556,-32105,6540,-32108,6523,-32111,6507,-32115,6491,-32118,6474,-32121,6458,-32125,6441,-32128,6425,-32131,6408,-32135,6392,-32138,6376,-32141,6359,-32144,6343,-32148,6326,-32151,6310,-32154,6293,-32157,6277,-32161,6261,-32164,6244,-32167,6228,-32170,6211,-32173,6195,-32177,6178,-32180,6162,-32183,6145,-32186,6129,-32189,6112,-32192,6096,-32195,6080,-32198,6063,-32202,6047,-32205,6030,-32208,6014,-32211,5997,-32214,5981,-32217,5964,-32220,5948,-32223,5931,-32226,5915,-32229,5898,-32232,5882,-32235,5865,-32238,5849,-32241,5832,-32244,5816,-32247,5799,-32250,5783,-32253,5766,-32256,5750,-32259,5733,-32262,5717,-32265,5700,-32268,5684,-32271,5667,-32274,5651,-32276,5634,-32279,5618,-32282,5601,-32285,5585,-32288,5568,-32291,5552,-32294,5535,-32296,5519,-32299,5502,-32302,5486,-32305,5469,-32308,5453,-32311,5436,-32313,5420,-32316,5403,-32319,5387,-32322,5370,-32324,5354,-32327,5337,-32330,5321,-32333,5304,-32335,5287,-32338,5271,-32341,5254,-32343,5238,-32346,5221,-32349,5205,-32351,5188,-32354,5172,-32357,5155,-32359,5139,-32362,5122,-32365,5106,-32367,5089,-32370,5072,-32372,5056,-32375,5039,-32378,5023,-32380,5006,-32383,4990,-32385,4973,-32388,4957,-32390,4940,-32393,4923,-32395,4907,-32398,4890,-32400,4874,-32403,4857,-32405,4841,-32408,4824,-32410,4807,-32413,4791,-32415,4774,-32418,4758,-32420,4741,-32423,4725,-32425,4708,-32427,4691,-32430,4675,-32432,4658,-32435,4642,-32437,4625,-32439,4608,-32442,4592,-32444,4575,-32446,4559,-32449,4542,-32451,4525,-32453,4509,-32456,4492,-32458,4476,-32460,4459,-32463,4443,-32465,4426,-32467,4409,-32469,4393,-32472,4376,-32474,4359,-32476,4343,-32478,4326,-32481,4310,-32483,4293,-32485,4276,-32487,4260,-32489,4243,-32492,4227,-32494,4210,-32496,4193,-32498,4177,-32500,4160,-32502,4144,-32504,4127,-32507,4110,-32509,4094,-32511,4077,-32513,4060,-32515,4044,-32517,4027,-32519,4011,-32521,3994,-32523,3977,-32525,3961,-32527,3944,-32529,3927,-32531,3911,-32533,3894,-32535,3877,-32537,3861,-32539,3844,-32541,3828,-32543,3811,-32545,3794,-32547,3778,-32549,3761,-32551,3744,-32553,3728,-32555,3711,-32557,3694,-32559,3678,-32560,3661,-32562,3644,-32564,3628,-32566,3611,-32568,3594,-32570,3578,-32572,3561,-32573,3545,-32575,3528,-32577,3511,-32579,3495,-32581,3478,-32582,3461,-32584,3445,-32586,3428,-32588,3411,-32589,3395,-32591,3378,-32593,3361,-32595,3345,-32596,3328,-32598,3311,-32600,3295,-32601,3278,-32603,3261,-32605,3245,-32606,3228,-32608,3211,-32610,3195,-32611,3178,-32613,3161,-32615,3145,-32616,3128,-32618,3111,-32619,3094,-32621,3078,-32623,3061,-32624,3044,-32626,3028,-32627,3011,-32629,2994,-32630,2978,-32632,2961,-32633,2944,-32635,2928,-32636,2911,-32638,2894,-32639,2878,-32641,2861,-32642,2844,-32644,2828,-32645,2811,-32647,2794,-32648,2777,-32650,2761,-32651,2744,-32652,2727,-32654,2711,-32655,2694,-32657,2677,-32658,2661,-32659,2644,-32661,2627,-32662,2610,-32663,2594,-32665,2577,-32666,2560,-32667,2544,-32669,2527,-32670,2510,-32671,2494,-32672,2477,-32674,2460,-32675,2443,-32676,2427,-32677,2410,-32679,2393,-32680,2377,-32681,2360,-32682,2343,-32684,2326,-32685,2310,-32686,2293,-32687,2276,-32688,2260,-32689,2243,-32691,2226,-32692,2209,-32693,2193,-32694,2176,-32695,2159,-32696,2143,-32697,2126,-32698,2109,-32700,2092,-32701,2076,-32702,2059,-32703,2042,-32704,2026,-32705,2009,-32706,1992,-32707,1975,-32708,1959,-32709,1942,-32710,1925,-32711,1908,-32712,1892,-32713,1875,-32714,1858,-32715,1842,-32716,1825,-32717,1808,-32718,1791,-32718,1775,-32719,1758,-32720,1741,-32721,1724,-32722,1708,-32723,1691,-32724,1674,-32725,1658,-32726,1641,-32726,1624,-32727,1607,-32728,1591,-32729,1574,-32730,1557,-32730,1540,-32731,1524,-32732,1507,-32733,1490,-32734,1473,-32734,1457,-32735,1440,-32736,1423,-32737,1406,-32737,1390,-32738,1373,-32739,1356,-32739,1339,-32740,1323,-32741,1306,-32741,1289,-32742,1273,-32743,1256,-32743,1239,-32744,1222,-32745,1206,-32745,1189,-32746,1172,-32747,1155,-32747,1139,-32748,1122,-32748,1105,-32749,1088,-32749,1072,-32750,1055,-32751,1038,-32751,1021,-32752,1005,-32752,988,-32753,971,-32753,954,-32754,938,-32754,921,-32755,904,-32755,887,-32755,871,-32756,854,-32756,837,-32757,820,-32757,804,-32758,787,-32758,770,-32758,753,-32759,737,-32759,720,-32760,703,-32760,686,-32760,670,-32761,653,-32761,636,-32761,619,-32762,603,-32762,586,-32762,569,-32763,552,-32763,536,-32763,519,-32763,502,-32764,485,-32764,469,-32764,452,-32764,435,-32765,418,-32765,402,-32765,385,-32765,368,-32765,351,-32766,335,-32766,318,-32766,301,-32766,284,-32766,268,-32766,251,-32767,234,-32767,217,-32767,201,-32767,184,-32767,167,-32767,150,-32767,134,-32767,117,-32767,100,-32767,83,-32767,67,-32767,50,-32767,33,-32767,16,-32767,0,-32767,-17,-32767,-34,-32767,-51,-32767,-68,-32767,-84,-32767,-101,-32767,-118,-32767,-135,-32767,-151,-32767,-168,-32767,-185,-32767,-202,-32767,-218,-32767,-235,-32767,-252,-32767,-269,-32766,-285,-32766,-302,-32766,-319,-32766,-336,-32766,-352,-32766,-369,-32765,-386,-32765,-403,-32765,-419,-32765,-436,-32765,-453,-32764,-470,-32764,-486,-32764,-503,-32764,-520,-32763,-537,-32763,-553,-32763,-570,-32763,-587,-32762,-604,-32762,-620,-32762,-637,-32761,-654,-32761,-671,-32761,-687,-32760,-704,-32760,-721,-32760,-738,-32759,-754,-32759,-771,-32758,-788,-32758,-805,-32758,-821,-32757,-838,-32757,-855,-32756,-872,-32756,-888,-32755,-905,-32755,-922,-32755,-939,-32754,-955,-32754,-972,-32753,-989,-32753,-1006,-32752,-1022,-32752,-1039,-32751,-1056,-32751,-1073,-32750,-1089,-32749,-1106,-32749,-1123,-32748,-1140,-32748,-1156,-32747,-1173,-32747,-1190,-32746,-1207,-32745,-1223,-32745,-1240,-32744,-1257,-32743,-1274,-32743,-1290,-32742,-1307,-32741,-1324,-32741,-1340,-32740,-1357,-32739,-1374,-32739,-1391,-32738,-1407,-32737,-1424,-32737,-1441,-32736,-1458,-32735,-1474,-32734,-1491,-32734,-1508,-32733,-1525,-32732,-1541,-32731,-1558,-32730,-1575,-32730,-1592,-32729,-1608,-32728,-1625,-32727,-1642,-32726,-1659,-32726,-1675,-32725,-1692,-32724,-1709,-32723,-1725,-32722,-1742,-32721,-1759,-32720,-1776,-32719,-1792,-32718,-1809,-32718,-1826,-32717,-1843,-32716,-1859,-32715,-1876,-32714,-1893,-32713,-1909,-32712,-1926,-32711,-1943,-32710,-1960,-32709,-1976,-32708,-1993,-32707,-2010,-32706,-2027,-32705,-2043,-32704,-2060,-32703,-2077,-32702,-2093,-32701,-2110,-32700,-2127,-32698,-2144,-32697,-2160,-32696,-2177,-32695,-2194,-32694,-2210,-32693,-2227,-32692,-2244,-32691,-2261,-32689,-2277,-32688,-2294,-32687,-2311,-32686,-2327,-32685,-2344,-32684,-2361,-32682,-2378,-32681,-2394,-32680,-2411,-32679,-2428,-32677,-2444,-32676,-2461,-32675,-2478,-32674,-2495,-32672,-2511,-32671,-2528,-32670,-2545,-32669,-2561,-32667,-2578,-32666,-2595,-32665,-2611,-32663,-2628,-32662,-2645,-32661,-2662,-32659,-2678,-32658,-2695,-32657,-2712,-32655,-2728,-32654,-2745,-32652,-2762,-32651,-2778,-32650,-2795,-32648,-2812,-32647,-2829,-32645,-2845,-32644,-2862,-32642,-2879,-32641,-2895,-32639,-2912,-32638,-2929,-32636,-2945,-32635,-2962,-32633,-2979,-32632,-2995,-32630,-3012,-32629,-3029,-32627,-3045,-32626,-3062,-32624,-3079,-32623,-3095,-32621,-3112,-32619,-3129,-32618,-3146,-32616,-3162,-32615,-3179,-32613,-3196,-32611,-3212,-32610,-3229,-32608,-3246,-32606,-3262,-32605,-3279,-32603,-3296,-32601,-3312,-32600,-3329,-32598,-3346,-32596,-3362,-32595,-3379,-32593,-3396,-32591,-3412,-32589,-3429,-32588,-3446,-32586,-3462,-32584,-3479,-32582,-3496,-32581,-3512,-32579,-3529,-32577,-3546,-32575,-3562,-32573,-3579,-32572,-3595,-32570,-3612,-32568,-3629,-32566,-3645,-32564,-3662,-32562,-3679,-32560,-3695,-32559,-3712,-32557,-3729,-32555,-3745,-32553,-3762,-32551,-3779,-32549,-3795,-32547,-3812,-32545,-3829,-32543,-3845,-32541,-3862,-32539,-3878,-32537,-3895,-32535,-3912,-32533,-3928,-32531,-3945,-32529,-3962,-32527,-3978,-32525,-3995,-32523,-4012,-32521,-4028,-32519,-4045,-32517,-4061,-32515,-4078,-32513,-4095,-32511,-4111,-32509,-4128,-32507,-4145,-32504,-4161,-32502,-4178,-32500,-4194,-32498,-4211,-32496,-4228,-32494,-4244,-32492,-4261,-32489,-4277,-32487,-4294,-32485,-4311,-32483,-4327,-32481,-4344,-32478,-4360,-32476,-4377,-32474,-4394,-32472,-4410,-32469,-4427,-32467,-4444,-32465,-4460,-32463,-4477,-32460,-4493,-32458,-4510,-32456,-4526,-32453,-4543,-32451,-4560,-32449,-4576,-32446,-4593,-32444,-4609,-32442,-4626,-32439,-4643,-32437,-4659,-32435,-4676,-32432,-4692,-32430,-4709,-32427,-4726,-32425,-4742,-32423,-4759,-32420,-4775,-32418,-4792,-32415,-4808,-32413,-4825,-32410,-4842,-32408,-4858,-32405,-4875,-32403,-4891,-32400,-4908,-32398,-4924,-32395,-4941,-32393,-4958,-32390,-4974,-32388,-4991,-32385,-5007,-32383,-5024,-32380,-5040,-32378,-5057,-32375,-5073,-32372,-5090,-32370,-5107,-32367,-5123,-32365,-5140,-32362,-5156,-32359,-5173,-32357,-5189,-32354,-5206,-32351,-5222,-32349,-5239,-32346,-5255,-32343,-5272,-32341,-5288,-32338,-5305,-32335,-5322,-32333,-5338,-32330,-5355,-32327,-5371,-32324,-5388,-32322,-5404,-32319,-5421,-32316,-5437,-32313,-5454,-32311,-5470,-32308,-5487,-32305,-5503,-32302,-5520,-32299,-5536,-32296,-5553,-32294,-5569,-32291,-5586,-32288,-5602,-32285,-5619,-32282,-5635,-32279,-5652,-32276,-5668,-32274,-5685,-32271,-5701,-32268,-5718,-32265,-5734,-32262,-5751,-32259,-5767,-32256,-5784,-32253,-5800,-32250,-5817,-32247,-5833,-32244,-5850,-32241,-5866,-32238,-5883,-32235,-5899,-32232,-5916,-32229,-5932,-32226,-5949,-32223,-5965,-32220,-5982,-32217,-5998,-32214,-6015,-32211,-6031,-32208,-6048,-32205,-6064,-32202,-6081,-32198,-6097,-32195,-6113,-32192,-6130,-32189,-6146,-32186,-6163,-32183,-6179,-32180,-6196,-32177,-6212,-32173,-6229,-32170,-6245,-32167,-6262,-32164,-6278,-32161,-6294,-32157,-6311,-32154,-6327,-32151,-6344,-32148,-6360,-32144,-6377,-32141,-6393,-32138,-6409,-32135,-6426,-32131,-6442,-32128,-6459,-32125,-6475,-32121,-6492,-32118,-6508,-32115,-6524,-32111,-6541,-32108,-6557,-32105,-6574,-32101,-6590,-32098,-6607,-32095,-6623,-32091,-6639,-32088,-6656,-32085,-6672,-32081,-6689,-32078,-6705,-32074,-6721,-32071,-6738,-32067,-6754,-32064,-6771,-32060,-6787,-32057,-6803,-32054,-6820,-32050,-6836,-32047,-6852,-32043,-6869,-32040,-6885,-32036,-6902,-32033,-6918,-32029,-6934,-32025,-6951,-32022,-6967,-32018,-6983,-32015,-7000,-32011,-7016,-32008,-7033,-32004,-7049,-32000,-7065,-31997,-7082,-31993,-7098,-31990,-7114,-31986,-7131,-31982,-7147,-31979,-7163,-31975,-7180,-31971,-7196,-31968,-7212,-31964,-7229,-31960,-7245,-31957,-7262,-31953,-7278,-31949,-7294,-31945,-7311,-31942,-7327,-31938,-7343,-31934,-7359,-31930,-7376,-31927,-7392,-31923,-7408,-31919,-7425,-31915,-7441,-31912,-7457,-31908,-7474,-31904,-7490,-31900,-7506,-31896,-7523,-31892,-7539,-31889,-7555,-31885,-7572,-31881,-7588,-31877,-7604,-31873,-7620,-31869,-7637,-31865,-7653,-31861,-7669,-31857,-7686,-31854,-7702,-31850,-7718,-31846,-7734,-31842,-7751,-31838,-7767,-31834,-7783,-31830,-7800,-31826,-7816,-31822,-7832,-31818,-7848,-31814,-7865,-31810,-7881,-31806,-7897,-31802,-7913,-31798,-7930,-31794,-7946,-31790,-7962,-31786,-7978,-31781,-7995,-31777,-8011,-31773,-8027,-31769,-8043,-31765,-8060,-31761,-8076,-31757,-8092,-31753,-8108,-31749,-8125,-31744,-8141,-31740,-8157,-31736,-8173,-31732,-8190,-31728,-8206,-31724,-8222,-31719,-8238,-31715,-8254,-31711,-8271,-31707,-8287,-31702,-8303,-31698,-8319,-31694,-8335,-31690,-8352,-31685,-8368,-31681,-8384,-31677,-8400,-31673,-8416,-31668,-8433,-31664,-8449,-31660,-8465,-31655,-8481,-31651,-8497,-31647,-8514,-31642,-8530,-31638,-8546,-31634,-8562,-31629,-8578,-31625,-8594,-31620,-8611,-31616,-8627,-31612,-8643,-31607,-8659,-31603,-8675,-31598,-8691,-31594,-8708,-31589,-8724,-31585,-8740,-31581,-8756,-31576,-8772,-31572,-8788,-31567,-8804,-31563,-8821,-31558,-8837,-31554,-8853,-31549,-8869,-31545,-8885,-31540,-8901,-31535,-8917,-31531,-8933,-31526,-8950,-31522,-8966,-31517,-8982,-31513,-8998,-31508,-9014,-31503,-9030,-31499,-9046,-31494,-9062,-31490,-9078,-31485,-9095,-31480,-9111,-31476,-9127,-31471,-9143,-31466,-9159,-31462,-9175,-31457,-9191,-31452,-9207,-31447,-9223,-31443,-9239,-31438,-9255,-31433,-9271,-31429,-9288,-31424,-9304,-31419,-9320,-31414,-9336,-31410,-9352,-31405,-9368,-31400,-9384,-31395,-9400,-31390,-9416,-31386,-9432,-31381,-9448,-31376,-9464,-31371,-9480,-31366,-9496,-31361,-9512,-31357,-9528,-31352,-9544,-31347,-9560,-31342,-9576,-31337,-9592,-31332,-9608,-31327,-9624,-31322,-9640,-31317,-9656,-31312,-9672,-31308,-9688,-31303,-9704,-31298,-9720,-31293,-9736,-31288,-9752,-31283,-9768,-31278,-9784,-31273,-9800,-31268,-9816,-31263,-9832,-31258,-9848,-31253,-9864,-31248,-9880,-31243,-9896,-31237,-9912,-31232,-9928,-31227,-9944,-31222,-9960,-31217,-9976,-31212,-9992,-31207,-10008,-31202,-10024,-31197,-10040,-31192,-10056,-31186,-10072,-31181,-10088,-31176,-10104,-31171,-10120,-31166,-10136,-31161,-10152,-31155,-10167,-31150,-10183,-31145,-10199,-31140,-10215,-31135,-10231,-31129,-10247,-31124,-10263,-31119,-10279,-31114,-10295,-31108,-10311,-31103,-10327,-31098,-10343,-31093,-10358,-31087,-10374,-31082,-10390,-31077,-10406,-31071,-10422,-31066,-10438,-31061,-10454,-31055,-10470,-31050,-10485,-31045,-10501,-31039,-10517,-31034,-10533,-31029,-10549,-31023,-10565,-31018,-10581,-31012,-10597,-31007,-10612,-31002,-10628,-30996,-10644,-30991,-10660,-30985,-10676,-30980,-10692,-30974,-10707,-30969,-10723,-30963,-10739,-30958,-10755,-30952,-10771,-30947,-10787,-30941,-10802,-30936,-10818,-30930,-10834,-30925,-10850,-30919,-10866,-30914,-10881,-30908,-10897,-30903,-10913,-30897,-10929,-30891,-10945,-30886,-10960,-30880,-10976,-30875,-10992,-30869,-11008,-30863,-11024,-30858,-11039,-30852,-11055,-30846,-11071,-30841,-11087,-30835,-11102,-30829,-11118,-30824,-11134,-30818,-11150,-30812,-11165,-30807,-11181,-30801,-11197,-30795,-11213,-30789,-11228,-30784,-11244,-30778,-11260,-30772,-11276,-30767,-11291,-30761,-11307,-30755,-11323,-30749,-11339,-30743,-11354,-30738,-11370,-30732,-11386,-30726,-11401,-30720,-11417,-30714,-11433,-30708,-11449,-30703,-11464,-30697,-11480,-30691,-11496,-30685,-11511,-30679,-11527,-30673,-11543,-30667,-11558,-30661,-11574,-30656,-11590,-30650,-11605,-30644,-11621,-30638,-11637,-30632,-11652,-30626,-11668,-30620,-11684,-30614,-11699,-30608,-11715,-30602,-11731,-30596,-11746,-30590,-11762,-30584,-11778,-30578,-11793,-30572,-11809,-30566,-11824,-30560,-11840,-30554,-11856,-30548,-11871,-30542,-11887,-30536,-11903,-30529,-11918,-30523,-11934,-30517,-11949,-30511,-11965,-30505,-11981,-30499,-11996,-30493,-12012,-30487,-12027,-30481,-12043,-30474,-12058,-30468,-12074,-30462,-12090,-30456,-12105,-30450,-12121,-30443,-12136,-30437,-12152,-30431,-12167,-30425,-12183,-30419,-12199,-30412,-12214,-30406,-12230,-30400,-12245,-30394,-12261,-30387,-12276,-30381,-12292,-30375,-12307,-30369,-12323,-30362,-12338,-30356,-12354,-30350,-12369,-30343,-12385,-30337,-12400,-30331,-12416,-30324,-12431,-30318,-12447,-30312,-12462,-30305,-12478,-30299,-12493,-30292,-12509,-30286,-12524,-30280,-12540,-30273,-12555,-30267,-12571,-30260,-12586,-30254,-12602,-30248,-12617,-30241,-12633,-30235,-12648,-30228,-12664,-30222,-12679,-30215,-12695,-30209,-12710,-30202,-12725,-30196,-12741,-30189,-12756,-30183,-12772,-30176,-12787,-30170,-12803,-30163,-12818,-30157,-12833,-30150,-12849,-30143,-12864,-30137,-12880,-30130,-12895,-30124,-12910,-30117,-12926,-30110,-12941,-30104,-12957,-30097,-12972,-30091,-12987,-30084,-13003,-30077,-13018,-30071,-13034,-30064,-13049,-30057,-13064,-30051,-13080,-30044,-13095,-30037,-13110,-30031,-13126,-30024,-13141,-30017,-13156,-30010,-13172,-30004,-13187,-29997,-13202,-29990,-13218,-29984,-13233,-29977,-13248,-29970,-13264,-29963,-13279,-29956,-13294,-29950,-13310,-29943,-13325,-29936,-13340,-29929,-13356,-29922,-13371,-29916,-13386,-29909,-13401,-29902,-13417,-29895,-13432,-29888,-13447,-29881,-13463,-29874,-13478,-29867,-13493,-29861,-13508,-29854,-13524,-29847,-13539,-29840,-13554,-29833,-13569,-29826,-13585,-29819,-13600,-29812,-13615,-29805,-13630,-29798,-13646,-29791,-13661,-29784,-13676,-29777,-13691,-29770,-13707,-29763,-13722,-29756,-13737,-29749,-13752,-29742,-13767,-29735,-13783,-29728,-13798,-29721,-13813,-29714,-13828,-29707,-13843,-29700,-13859,-29693,-13874,-29686,-13889,-29679,-13904,-29671,-13919,-29664,-13934,-29657,-13950,-29650,-13965,-29643,-13980,-29636,-13995,-29629,-14010,-29622,-14025,-29614,-14040,-29607,-14056,-29600,-14071,-29593,-14086,-29586,-14101,-29578,-14116,-29571,-14131,-29564,-14146,-29557,-14161,-29549,-14177,-29542,-14192,-29535,-14207,-29528,-14222,-29520,-14237,-29513,-14252,-29506,-14267,-29499,-14282,-29491,-14297,-29484,-14312,-29477,-14327,-29469,-14343,-29462,-14358,-29455,-14373,-29447,-14388,-29440,-14403,-29433,-14418,-29425,-14433,-29418,-14448,-29411,-14463,-29403,-14478,-29396,-14493,-29388,-14508,-29381,-14523,-29373,-14538,-29366,-14553,-29359,-14568,-29351,-14583,-29344,-14598,-29336,-14613,-29329,-14628,-29321,-14643,-29314,-14658,-29306,-14673,-29299,-14688,-29291,-14703,-29284,-14718,-29276,-14733,-29269,-14748,-29261,-14763,-29254,-14778,-29246,-14793,-29239,-14808,-29231,-14823,-29223,-14838,-29216,-14853,-29208,-14867,-29201,-14882,-29193,-14897,-29185,-14912,-29178,-14927,-29170,-14942,-29163,-14957,-29155,-14972,-29147,-14987,-29140,-15002,-29132,-15017,-29124,-15031,-29117,-15046,-29109,-15061,-29101,-15076,-29093,-15091,-29086,-15106,-29078,-15121,-29070,-15136,-29063,-15150,-29055,-15165,-29047,-15180,-29039,-15195,-29032,-15210,-29024,-15225,-29016,-15239,-29008,-15254,-29000,-15269,-28993,-15284,-28985,-15299,-28977,-15314,-28969,-15328,-28961,-15343,-28954,-15358,-28946,-15373,-28938,-15388,-28930,-15402,-28922,-15417,-28914,-15432,-28906,-15447,-28898,-15462,-28891,-15476,-28883,-15491,-28875,-15506,-28867,-15521,-28859,-15535,-28851,-15550,-28843,-15565,-28835,-15580,-28827,-15594,-28819,-15609,-28811,-15624,-28803,-15639,-28795,-15653,-28787,-15668,-28779,-15683,-28771,-15697,-28763,-15712,-28755,-15727,-28747,-15741,-28739,-15756,-28731,-15771,-28723,-15786,-28715,-15800,-28707,-15815,-28699,-15830,-28691,-15844,-28682,-15859,-28674,-15874,-28666,-15888,-28658,-15903,-28650,-15918,-28642,-15932,-28634,-15947,-28626,-15961,-28617,-15976,-28609,-15991,-28601,-16005,-28593,-16020,-28585,-16035,-28576,-16049,-28568,-16064,-28560,-16078,-28552,-16093,-28544,-16108,-28535,-16122,-28527,-16137,-28519,-16151,-28511,-16166,-28502,-16180,-28494,-16195,-28486,-16210,-28478,-16224,-28469,-16239,-28461,-16253,-28453,-16268,-28444,-16282,-28436,-16297,-28428,-16311,-28419,-16326,-28411,-16340,-28403,-16355,-28394,-16369,-28386}; -int16_t twb12288[8192] __attribute__((aligned(16))) = {32767,0,32766,-34,32766,-68,32766,-101,32766,-135,32766,-168,32766,-202,32766,-235,32765,-269,32765,-302,32765,-336,32764,-369,32764,-403,32764,-436,32763,-470,32763,-503,32762,-537,32762,-570,32761,-604,32760,-637,32760,-671,32759,-704,32758,-738,32757,-771,32757,-805,32756,-838,32755,-872,32754,-905,32753,-939,32752,-972,32751,-1006,32750,-1039,32749,-1073,32748,-1106,32747,-1140,32746,-1173,32744,-1207,32743,-1240,32742,-1274,32740,-1307,32739,-1340,32738,-1374,32736,-1407,32735,-1441,32733,-1474,32732,-1508,32730,-1541,32729,-1575,32727,-1608,32725,-1642,32724,-1675,32722,-1709,32720,-1742,32718,-1776,32717,-1809,32715,-1843,32713,-1876,32711,-1909,32709,-1943,32707,-1976,32705,-2010,32703,-2043,32701,-2077,32699,-2110,32696,-2144,32694,-2177,32692,-2210,32690,-2244,32687,-2277,32685,-2311,32683,-2344,32680,-2378,32678,-2411,32675,-2444,32673,-2478,32670,-2511,32668,-2545,32665,-2578,32662,-2611,32660,-2645,32657,-2678,32654,-2712,32651,-2745,32649,-2778,32646,-2812,32643,-2845,32640,-2879,32637,-2912,32634,-2945,32631,-2979,32628,-3012,32625,-3045,32622,-3079,32618,-3112,32615,-3146,32612,-3179,32609,-3212,32605,-3246,32602,-3279,32599,-3312,32595,-3346,32592,-3379,32588,-3412,32585,-3446,32581,-3479,32578,-3512,32574,-3546,32571,-3579,32567,-3612,32563,-3645,32559,-3679,32556,-3712,32552,-3745,32548,-3779,32544,-3812,32540,-3845,32536,-3878,32532,-3912,32528,-3945,32524,-3978,32520,-4012,32516,-4045,32512,-4078,32508,-4111,32503,-4145,32499,-4178,32495,-4211,32491,-4244,32486,-4277,32482,-4311,32477,-4344,32473,-4377,32468,-4410,32464,-4444,32459,-4477,32455,-4510,32450,-4543,32445,-4576,32441,-4609,32436,-4643,32431,-4676,32426,-4709,32422,-4742,32417,-4775,32412,-4808,32407,-4842,32402,-4875,32397,-4908,32392,-4941,32387,-4974,32382,-5007,32377,-5040,32371,-5073,32366,-5107,32361,-5140,32356,-5173,32350,-5206,32345,-5239,32340,-5272,32334,-5305,32329,-5338,32323,-5371,32318,-5404,32312,-5437,32307,-5470,32301,-5503,32295,-5536,32290,-5569,32284,-5602,32278,-5635,32273,-5668,32267,-5701,32261,-5734,32255,-5767,32249,-5800,32243,-5833,32237,-5866,32231,-5899,32225,-5932,32219,-5965,32213,-5998,32207,-6031,32201,-6064,32194,-6097,32188,-6130,32182,-6163,32176,-6196,32169,-6229,32163,-6262,32156,-6294,32150,-6327,32143,-6360,32137,-6393,32130,-6426,32124,-6459,32117,-6492,32110,-6524,32104,-6557,32097,-6590,32090,-6623,32084,-6656,32077,-6689,32070,-6721,32063,-6754,32056,-6787,32049,-6820,32042,-6852,32035,-6885,32028,-6918,32021,-6951,32014,-6983,32007,-7016,31999,-7049,31992,-7082,31985,-7114,31978,-7147,31970,-7180,31963,-7212,31956,-7245,31948,-7278,31941,-7311,31933,-7343,31926,-7376,31918,-7408,31911,-7441,31903,-7474,31895,-7506,31888,-7539,31880,-7572,31872,-7604,31864,-7637,31856,-7669,31849,-7702,31841,-7734,31833,-7767,31825,-7800,31817,-7832,31809,-7865,31801,-7897,31793,-7930,31785,-7962,31776,-7995,31768,-8027,31760,-8060,31752,-8092,31743,-8125,31735,-8157,31727,-8190,31718,-8222,31710,-8254,31701,-8287,31693,-8319,31684,-8352,31676,-8384,31667,-8416,31659,-8449,31650,-8481,31641,-8514,31633,-8546,31624,-8578,31615,-8611,31606,-8643,31597,-8675,31588,-8708,31580,-8740,31571,-8772,31562,-8804,31553,-8837,31544,-8869,31534,-8901,31525,-8933,31516,-8966,31507,-8998,31498,-9030,31489,-9062,31479,-9095,31470,-9127,31461,-9159,31451,-9191,31442,-9223,31432,-9255,31423,-9288,31413,-9320,31404,-9352,31394,-9384,31385,-9416,31375,-9448,31365,-9480,31356,-9512,31346,-9544,31336,-9576,31326,-9608,31316,-9640,31307,-9672,31297,-9704,31287,-9736,31277,-9768,31267,-9800,31257,-9832,31247,-9864,31236,-9896,31226,-9928,31216,-9960,31206,-9992,31196,-10024,31185,-10056,31175,-10088,31165,-10120,31154,-10152,31144,-10183,31134,-10215,31123,-10247,31113,-10279,31102,-10311,31092,-10343,31081,-10374,31070,-10406,31060,-10438,31049,-10470,31038,-10501,31028,-10533,31017,-10565,31006,-10597,30995,-10628,30984,-10660,30973,-10692,30962,-10723,30951,-10755,30940,-10787,30929,-10818,30918,-10850,30907,-10881,30896,-10913,30885,-10945,30874,-10976,30862,-11008,30851,-11039,30840,-11071,30828,-11102,30817,-11134,30806,-11165,30794,-11197,30783,-11228,30771,-11260,30760,-11291,30748,-11323,30737,-11354,30725,-11386,30713,-11417,30702,-11449,30690,-11480,30678,-11511,30666,-11543,30655,-11574,30643,-11605,30631,-11637,30619,-11668,30607,-11699,30595,-11731,30583,-11762,30571,-11793,30559,-11824,30547,-11856,30535,-11887,30522,-11918,30510,-11949,30498,-11981,30486,-12012,30473,-12043,30461,-12074,30449,-12105,30436,-12136,30424,-12167,30411,-12199,30399,-12230,30386,-12261,30374,-12292,30361,-12323,30349,-12354,30336,-12385,30323,-12416,30311,-12447,30298,-12478,30285,-12509,30272,-12540,30259,-12571,30247,-12602,30234,-12633,30221,-12664,30208,-12695,30195,-12725,30182,-12756,30169,-12787,30156,-12818,30142,-12849,30129,-12880,30116,-12910,30103,-12941,30090,-12972,30076,-13003,30063,-13034,30050,-13064,30036,-13095,30023,-13126,30009,-13156,29996,-13187,29983,-13218,29969,-13248,29955,-13279,29942,-13310,29928,-13340,29915,-13371,29901,-13401,29887,-13432,29873,-13463,29860,-13493,29846,-13524,29832,-13554,29818,-13585,29804,-13615,29790,-13646,29776,-13676,29762,-13707,29748,-13737,29734,-13767,29720,-13798,29706,-13828,29692,-13859,29678,-13889,29663,-13919,29649,-13950,29635,-13980,29621,-14010,29606,-14040,29592,-14071,29577,-14101,29563,-14131,29548,-14161,29534,-14192,29519,-14222,29505,-14252,29490,-14282,29476,-14312,29461,-14343,29446,-14373,29432,-14403,29417,-14433,29402,-14463,29387,-14493,29372,-14523,29358,-14553,29343,-14583,29328,-14613,29313,-14643,29298,-14673,29283,-14703,29268,-14733,29253,-14763,29238,-14793,29222,-14823,29207,-14853,29192,-14882,29177,-14912,29162,-14942,29146,-14972,29131,-15002,29116,-15031,29100,-15061,29085,-15091,29069,-15121,29054,-15150,29038,-15180,29023,-15210,29007,-15239,28992,-15269,28976,-15299,28960,-15328,28945,-15358,28929,-15388,28913,-15417,28897,-15447,28882,-15476,28866,-15506,28850,-15535,28834,-15565,28818,-15594,28802,-15624,28786,-15653,28770,-15683,28754,-15712,28738,-15741,28722,-15771,28706,-15800,28690,-15830,28673,-15859,28657,-15888,28641,-15918,28625,-15947,28608,-15976,28592,-16005,28575,-16035,28559,-16064,28543,-16093,28526,-16122,28510,-16151,28493,-16180,28477,-16210,28460,-16239,28443,-16268,28427,-16297,28410,-16326,28393,-16355,28377,-16384,28360,-16413,28343,-16442,28326,-16471,28309,-16500,28292,-16529,28275,-16558,28259,-16587,28242,-16616,28225,-16644,28208,-16673,28190,-16702,28173,-16731,28156,-16760,28139,-16789,28122,-16817,28105,-16846,28087,-16875,28070,-16904,28053,-16932,28036,-16961,28018,-16990,28001,-17018,27983,-17047,27966,-17075,27948,-17104,27931,-17133,27913,-17161,27896,-17190,27878,-17218,27861,-17247,27843,-17275,27825,-17304,27808,-17332,27790,-17361,27772,-17389,27754,-17417,27736,-17446,27719,-17474,27701,-17502,27683,-17531,27665,-17559,27647,-17587,27629,-17616,27611,-17644,27593,-17672,27575,-17700,27557,-17728,27538,-17757,27520,-17785,27502,-17813,27484,-17841,27466,-17869,27447,-17897,27429,-17925,27411,-17953,27392,-17981,27374,-18009,27355,-18037,27337,-18065,27319,-18093,27300,-18121,27281,-18149,27263,-18177,27244,-18205,27226,-18233,27207,-18261,27188,-18288,27170,-18316,27151,-18344,27132,-18372,27113,-18399,27094,-18427,27076,-18455,27057,-18483,27038,-18510,27019,-18538,27000,-18565,26981,-18593,26962,-18621,26943,-18648,26924,-18676,26905,-18703,26885,-18731,26866,-18758,26847,-18786,26828,-18813,26809,-18841,26789,-18868,26770,-18895,26751,-18923,26731,-18950,26712,-18977,26692,-19005,26673,-19032,26654,-19059,26634,-19087,26615,-19114,26595,-19141,26575,-19168,26556,-19195,26536,-19222,26516,-19250,26497,-19277,26477,-19304,26457,-19331,26437,-19358,26418,-19385,26398,-19412,26378,-19439,26358,-19466,26338,-19493,26318,-19520,26298,-19547,26278,-19574,26258,-19600,26238,-19627,26218,-19654,26198,-19681,26178,-19708,26158,-19734,26137,-19761,26117,-19788,26097,-19815,26077,-19841,26056,-19868,26036,-19895,26016,-19921,25995,-19948,25975,-19974,25954,-20001,25934,-20027,25913,-20054,25893,-20080,25872,-20107,25852,-20133,25831,-20160,25811,-20186,25790,-20213,25769,-20239,25749,-20265,25728,-20292,25707,-20318,25686,-20344,25665,-20370,25645,-20397,25624,-20423,25603,-20449,25582,-20475,25561,-20501,25540,-20528,25519,-20554,25498,-20580,25477,-20606,25456,-20632,25435,-20658,25414,-20684,25392,-20710,25371,-20736,25350,-20762,25329,-20788,25307,-20814,25286,-20839,25265,-20865,25243,-20891,25222,-20917,25201,-20943,25179,-20968,25158,-20994,25136,-21020,25115,-21046,25093,-21071,25072,-21097,25050,-21123,25029,-21148,25007,-21174,24985,-21199,24964,-21225,24942,-21250,24920,-21276,24898,-21301,24877,-21327,24855,-21352,24833,-21378,24811,-21403,24789,-21428,24767,-21454,24745,-21479,24723,-21504,24701,-21530,24679,-21555,24657,-21580,24635,-21605,24613,-21630,24591,-21656,24569,-21681,24546,-21706,24524,-21731,24502,-21756,24480,-21781,24457,-21806,24435,-21831,24413,-21856,24390,-21881,24368,-21906,24346,-21931,24323,-21956,24301,-21981,24278,-22005,24256,-22030,24233,-22055,24211,-22080,24188,-22105,24165,-22129,24143,-22154,24120,-22179,24097,-22203,24075,-22228,24052,-22253,24029,-22277,24006,-22302,23984,-22326,23961,-22351,23938,-22375,23915,-22400,23892,-22424,23869,-22449,23846,-22473,23823,-22497,23800,-22522,23777,-22546,23754,-22570,23731,-22595,23708,-22619,23685,-22643,23661,-22667,23638,-22692,23615,-22716,23592,-22740,23569,-22764,23545,-22788,23522,-22812,23499,-22836,23475,-22860,23452,-22884,23428,-22908,23405,-22932,23382,-22956,23358,-22980,23335,-23004,23311,-23028,23287,-23051,23264,-23075,23240,-23099,23217,-23123,23193,-23147,23169,-23170,23146,-23194,23122,-23218,23098,-23241,23074,-23265,23050,-23288,23027,-23312,23003,-23336,22979,-23359,22955,-23383,22931,-23406,22907,-23429,22883,-23453,22859,-23476,22835,-23500,22811,-23523,22787,-23546,22763,-23570,22739,-23593,22715,-23616,22691,-23639,22666,-23662,22642,-23686,22618,-23709,22594,-23732,22569,-23755,22545,-23778,22521,-23801,22496,-23824,22472,-23847,22448,-23870,22423,-23893,22399,-23916,22374,-23939,22350,-23962,22325,-23985,22301,-24007,22276,-24030,22252,-24053,22227,-24076,22202,-24098,22178,-24121,22153,-24144,22128,-24166,22104,-24189,22079,-24212,22054,-24234,22029,-24257,22004,-24279,21980,-24302,21955,-24324,21930,-24347,21905,-24369,21880,-24391,21855,-24414,21830,-24436,21805,-24458,21780,-24481,21755,-24503,21730,-24525,21705,-24547,21680,-24570,21655,-24592,21629,-24614,21604,-24636,21579,-24658,21554,-24680,21529,-24702,21503,-24724,21478,-24746,21453,-24768,21427,-24790,21402,-24812,21377,-24834,21351,-24856,21326,-24878,21300,-24899,21275,-24921,21249,-24943,21224,-24965,21198,-24986,21173,-25008,21147,-25030,21122,-25051,21096,-25073,21070,-25094,21045,-25116,21019,-25137,20993,-25159,20967,-25180,20942,-25202,20916,-25223,20890,-25244,20864,-25266,20838,-25287,20813,-25308,20787,-25330,20761,-25351,20735,-25372,20709,-25393,20683,-25415,20657,-25436,20631,-25457,20605,-25478,20579,-25499,20553,-25520,20527,-25541,20500,-25562,20474,-25583,20448,-25604,20422,-25625,20396,-25646,20369,-25666,20343,-25687,20317,-25708,20291,-25729,20264,-25750,20238,-25770,20212,-25791,20185,-25812,20159,-25832,20132,-25853,20106,-25873,20079,-25894,20053,-25914,20026,-25935,20000,-25955,19973,-25976,19947,-25996,19920,-26017,19894,-26037,19867,-26057,19840,-26078,19814,-26098,19787,-26118,19760,-26138,19733,-26159,19707,-26179,19680,-26199,19653,-26219,19626,-26239,19599,-26259,19573,-26279,19546,-26299,19519,-26319,19492,-26339,19465,-26359,19438,-26379,19411,-26399,19384,-26419,19357,-26438,19330,-26458,19303,-26478,19276,-26498,19249,-26517,19221,-26537,19194,-26557,19167,-26576,19140,-26596,19113,-26616,19086,-26635,19058,-26655,19031,-26674,19004,-26693,18976,-26713,18949,-26732,18922,-26752,18894,-26771,18867,-26790,18840,-26810,18812,-26829,18785,-26848,18757,-26867,18730,-26886,18702,-26906,18675,-26925,18647,-26944,18620,-26963,18592,-26982,18564,-27001,18537,-27020,18509,-27039,18482,-27058,18454,-27077,18426,-27095,18398,-27114,18371,-27133,18343,-27152,18315,-27171,18287,-27189,18260,-27208,18232,-27227,18204,-27245,18176,-27264,18148,-27282,18120,-27301,18092,-27320,18064,-27338,18036,-27356,18008,-27375,17980,-27393,17952,-27412,17924,-27430,17896,-27448,17868,-27467,17840,-27485,17812,-27503,17784,-27521,17756,-27539,17727,-27558,17699,-27576,17671,-27594,17643,-27612,17615,-27630,17586,-27648,17558,-27666,17530,-27684,17501,-27702,17473,-27720,17445,-27737,17416,-27755,17388,-27773,17360,-27791,17331,-27809,17303,-27826,17274,-27844,17246,-27862,17217,-27879,17189,-27897,17160,-27914,17132,-27932,17103,-27949,17074,-27967,17046,-27984,17017,-28002,16989,-28019,16960,-28037,16931,-28054,16903,-28071,16874,-28088,16845,-28106,16816,-28123,16788,-28140,16759,-28157,16730,-28174,16701,-28191,16672,-28209,16643,-28226,16615,-28243,16586,-28260,16557,-28276,16528,-28293,16499,-28310,16470,-28327,16441,-28344,16412,-28361,16383,-28378,16354,-28394,16325,-28411,16296,-28428,16267,-28444,16238,-28461,16209,-28478,16179,-28494,16150,-28511,16121,-28527,16092,-28544,16063,-28560,16034,-28576,16004,-28593,15975,-28609,15946,-28626,15917,-28642,15887,-28658,15858,-28674,15829,-28691,15799,-28707,15770,-28723,15740,-28739,15711,-28755,15682,-28771,15652,-28787,15623,-28803,15593,-28819,15564,-28835,15534,-28851,15505,-28867,15475,-28883,15446,-28898,15416,-28914,15387,-28930,15357,-28946,15327,-28961,15298,-28977,15268,-28993,15238,-29008,15209,-29024,15179,-29039,15149,-29055,15120,-29070,15090,-29086,15060,-29101,15030,-29117,15001,-29132,14971,-29147,14941,-29163,14911,-29178,14881,-29193,14852,-29208,14822,-29223,14792,-29239,14762,-29254,14732,-29269,14702,-29284,14672,-29299,14642,-29314,14612,-29329,14582,-29344,14552,-29359,14522,-29373,14492,-29388,14462,-29403,14432,-29418,14402,-29433,14372,-29447,14342,-29462,14311,-29477,14281,-29491,14251,-29506,14221,-29520,14191,-29535,14160,-29549,14130,-29564,14100,-29578,14070,-29593,14039,-29607,14009,-29622,13979,-29636,13949,-29650,13918,-29664,13888,-29679,13858,-29693,13827,-29707,13797,-29721,13766,-29735,13736,-29749,13706,-29763,13675,-29777,13645,-29791,13614,-29805,13584,-29819,13553,-29833,13523,-29847,13492,-29861,13462,-29874,13431,-29888,13400,-29902,13370,-29916,13339,-29929,13309,-29943,13278,-29956,13247,-29970,13217,-29984,13186,-29997,13155,-30010,13125,-30024,13094,-30037,13063,-30051,13033,-30064,13002,-30077,12971,-30091,12940,-30104,12909,-30117,12879,-30130,12848,-30143,12817,-30157,12786,-30170,12755,-30183,12724,-30196,12694,-30209,12663,-30222,12632,-30235,12601,-30248,12570,-30260,12539,-30273,12508,-30286,12477,-30299,12446,-30312,12415,-30324,12384,-30337,12353,-30350,12322,-30362,12291,-30375,12260,-30387,12229,-30400,12198,-30412,12166,-30425,12135,-30437,12104,-30450,12073,-30462,12042,-30474,12011,-30487,11980,-30499,11948,-30511,11917,-30523,11886,-30536,11855,-30548,11823,-30560,11792,-30572,11761,-30584,11730,-30596,11698,-30608,11667,-30620,11636,-30632,11604,-30644,11573,-30656,11542,-30667,11510,-30679,11479,-30691,11448,-30703,11416,-30714,11385,-30726,11353,-30738,11322,-30749,11290,-30761,11259,-30772,11227,-30784,11196,-30795,11164,-30807,11133,-30818,11101,-30829,11070,-30841,11038,-30852,11007,-30863,10975,-30875,10944,-30886,10912,-30897,10880,-30908,10849,-30919,10817,-30930,10786,-30941,10754,-30952,10722,-30963,10691,-30974,10659,-30985,10627,-30996,10596,-31007,10564,-31018,10532,-31029,10500,-31039,10469,-31050,10437,-31061,10405,-31071,10373,-31082,10342,-31093,10310,-31103,10278,-31114,10246,-31124,10214,-31135,10182,-31145,10151,-31155,10119,-31166,10087,-31176,10055,-31186,10023,-31197,9991,-31207,9959,-31217,9927,-31227,9895,-31237,9863,-31248,9831,-31258,9799,-31268,9767,-31278,9735,-31288,9703,-31298,9671,-31308,9639,-31317,9607,-31327,9575,-31337,9543,-31347,9511,-31357,9479,-31366,9447,-31376,9415,-31386,9383,-31395,9351,-31405,9319,-31414,9287,-31424,9254,-31433,9222,-31443,9190,-31452,9158,-31462,9126,-31471,9094,-31480,9061,-31490,9029,-31499,8997,-31508,8965,-31517,8932,-31526,8900,-31535,8868,-31545,8836,-31554,8803,-31563,8771,-31572,8739,-31581,8707,-31589,8674,-31598,8642,-31607,8610,-31616,8577,-31625,8545,-31634,8513,-31642,8480,-31651,8448,-31660,8415,-31668,8383,-31677,8351,-31685,8318,-31694,8286,-31702,8253,-31711,8221,-31719,8189,-31728,8156,-31736,8124,-31744,8091,-31753,8059,-31761,8026,-31769,7994,-31777,7961,-31786,7929,-31794,7896,-31802,7864,-31810,7831,-31818,7799,-31826,7766,-31834,7733,-31842,7701,-31850,7668,-31857,7636,-31865,7603,-31873,7571,-31881,7538,-31889,7505,-31896,7473,-31904,7440,-31912,7407,-31919,7375,-31927,7342,-31934,7310,-31942,7277,-31949,7244,-31957,7211,-31964,7179,-31971,7146,-31979,7113,-31986,7081,-31993,7048,-32000,7015,-32008,6982,-32015,6950,-32022,6917,-32029,6884,-32036,6851,-32043,6819,-32050,6786,-32057,6753,-32064,6720,-32071,6688,-32078,6655,-32085,6622,-32091,6589,-32098,6556,-32105,6523,-32111,6491,-32118,6458,-32125,6425,-32131,6392,-32138,6359,-32144,6326,-32151,6293,-32157,6261,-32164,6228,-32170,6195,-32177,6162,-32183,6129,-32189,6096,-32195,6063,-32202,6030,-32208,5997,-32214,5964,-32220,5931,-32226,5898,-32232,5865,-32238,5832,-32244,5799,-32250,5766,-32256,5733,-32262,5700,-32268,5667,-32274,5634,-32279,5601,-32285,5568,-32291,5535,-32296,5502,-32302,5469,-32308,5436,-32313,5403,-32319,5370,-32324,5337,-32330,5304,-32335,5271,-32341,5238,-32346,5205,-32351,5172,-32357,5139,-32362,5106,-32367,5072,-32372,5039,-32378,5006,-32383,4973,-32388,4940,-32393,4907,-32398,4874,-32403,4841,-32408,4807,-32413,4774,-32418,4741,-32423,4708,-32427,4675,-32432,4642,-32437,4608,-32442,4575,-32446,4542,-32451,4509,-32456,4476,-32460,4443,-32465,4409,-32469,4376,-32474,4343,-32478,4310,-32483,4276,-32487,4243,-32492,4210,-32496,4177,-32500,4144,-32504,4110,-32509,4077,-32513,4044,-32517,4011,-32521,3977,-32525,3944,-32529,3911,-32533,3877,-32537,3844,-32541,3811,-32545,3778,-32549,3744,-32553,3711,-32557,3678,-32560,3644,-32564,3611,-32568,3578,-32572,3545,-32575,3511,-32579,3478,-32582,3445,-32586,3411,-32589,3378,-32593,3345,-32596,3311,-32600,3278,-32603,3245,-32606,3211,-32610,3178,-32613,3145,-32616,3111,-32619,3078,-32623,3044,-32626,3011,-32629,2978,-32632,2944,-32635,2911,-32638,2878,-32641,2844,-32644,2811,-32647,2777,-32650,2744,-32652,2711,-32655,2677,-32658,2644,-32661,2610,-32663,2577,-32666,2544,-32669,2510,-32671,2477,-32674,2443,-32676,2410,-32679,2377,-32681,2343,-32684,2310,-32686,2276,-32688,2243,-32691,2209,-32693,2176,-32695,2143,-32697,2109,-32700,2076,-32702,2042,-32704,2009,-32706,1975,-32708,1942,-32710,1908,-32712,1875,-32714,1842,-32716,1808,-32718,1775,-32719,1741,-32721,1708,-32723,1674,-32725,1641,-32726,1607,-32728,1574,-32730,1540,-32731,1507,-32733,1473,-32734,1440,-32736,1406,-32737,1373,-32739,1339,-32740,1306,-32741,1273,-32743,1239,-32744,1206,-32745,1172,-32747,1139,-32748,1105,-32749,1072,-32750,1038,-32751,1005,-32752,971,-32753,938,-32754,904,-32755,871,-32756,837,-32757,804,-32758,770,-32758,737,-32759,703,-32760,670,-32761,636,-32761,603,-32762,569,-32763,536,-32763,502,-32764,469,-32764,435,-32765,402,-32765,368,-32765,335,-32766,301,-32766,268,-32766,234,-32767,201,-32767,167,-32767,134,-32767,100,-32767,67,-32767,33,-32767,0,-32767,-34,-32767,-68,-32767,-101,-32767,-135,-32767,-168,-32767,-202,-32767,-235,-32767,-269,-32766,-302,-32766,-336,-32766,-369,-32765,-403,-32765,-436,-32765,-470,-32764,-503,-32764,-537,-32763,-570,-32763,-604,-32762,-637,-32761,-671,-32761,-704,-32760,-738,-32759,-771,-32758,-805,-32758,-838,-32757,-872,-32756,-905,-32755,-939,-32754,-972,-32753,-1006,-32752,-1039,-32751,-1073,-32750,-1106,-32749,-1140,-32748,-1173,-32747,-1207,-32745,-1240,-32744,-1274,-32743,-1307,-32741,-1340,-32740,-1374,-32739,-1407,-32737,-1441,-32736,-1474,-32734,-1508,-32733,-1541,-32731,-1575,-32730,-1608,-32728,-1642,-32726,-1675,-32725,-1709,-32723,-1742,-32721,-1776,-32719,-1809,-32718,-1843,-32716,-1876,-32714,-1909,-32712,-1943,-32710,-1976,-32708,-2010,-32706,-2043,-32704,-2077,-32702,-2110,-32700,-2144,-32697,-2177,-32695,-2210,-32693,-2244,-32691,-2277,-32688,-2311,-32686,-2344,-32684,-2378,-32681,-2411,-32679,-2444,-32676,-2478,-32674,-2511,-32671,-2545,-32669,-2578,-32666,-2611,-32663,-2645,-32661,-2678,-32658,-2712,-32655,-2745,-32652,-2778,-32650,-2812,-32647,-2845,-32644,-2879,-32641,-2912,-32638,-2945,-32635,-2979,-32632,-3012,-32629,-3045,-32626,-3079,-32623,-3112,-32619,-3146,-32616,-3179,-32613,-3212,-32610,-3246,-32606,-3279,-32603,-3312,-32600,-3346,-32596,-3379,-32593,-3412,-32589,-3446,-32586,-3479,-32582,-3512,-32579,-3546,-32575,-3579,-32572,-3612,-32568,-3645,-32564,-3679,-32560,-3712,-32557,-3745,-32553,-3779,-32549,-3812,-32545,-3845,-32541,-3878,-32537,-3912,-32533,-3945,-32529,-3978,-32525,-4012,-32521,-4045,-32517,-4078,-32513,-4111,-32509,-4145,-32504,-4178,-32500,-4211,-32496,-4244,-32492,-4277,-32487,-4311,-32483,-4344,-32478,-4377,-32474,-4410,-32469,-4444,-32465,-4477,-32460,-4510,-32456,-4543,-32451,-4576,-32446,-4609,-32442,-4643,-32437,-4676,-32432,-4709,-32427,-4742,-32423,-4775,-32418,-4808,-32413,-4842,-32408,-4875,-32403,-4908,-32398,-4941,-32393,-4974,-32388,-5007,-32383,-5040,-32378,-5073,-32372,-5107,-32367,-5140,-32362,-5173,-32357,-5206,-32351,-5239,-32346,-5272,-32341,-5305,-32335,-5338,-32330,-5371,-32324,-5404,-32319,-5437,-32313,-5470,-32308,-5503,-32302,-5536,-32296,-5569,-32291,-5602,-32285,-5635,-32279,-5668,-32274,-5701,-32268,-5734,-32262,-5767,-32256,-5800,-32250,-5833,-32244,-5866,-32238,-5899,-32232,-5932,-32226,-5965,-32220,-5998,-32214,-6031,-32208,-6064,-32202,-6097,-32195,-6130,-32189,-6163,-32183,-6196,-32177,-6229,-32170,-6262,-32164,-6294,-32157,-6327,-32151,-6360,-32144,-6393,-32138,-6426,-32131,-6459,-32125,-6492,-32118,-6524,-32111,-6557,-32105,-6590,-32098,-6623,-32091,-6656,-32085,-6689,-32078,-6721,-32071,-6754,-32064,-6787,-32057,-6820,-32050,-6852,-32043,-6885,-32036,-6918,-32029,-6951,-32022,-6983,-32015,-7016,-32008,-7049,-32000,-7082,-31993,-7114,-31986,-7147,-31979,-7180,-31971,-7212,-31964,-7245,-31957,-7278,-31949,-7311,-31942,-7343,-31934,-7376,-31927,-7408,-31919,-7441,-31912,-7474,-31904,-7506,-31896,-7539,-31889,-7572,-31881,-7604,-31873,-7637,-31865,-7669,-31857,-7702,-31850,-7734,-31842,-7767,-31834,-7800,-31826,-7832,-31818,-7865,-31810,-7897,-31802,-7930,-31794,-7962,-31786,-7995,-31777,-8027,-31769,-8060,-31761,-8092,-31753,-8125,-31744,-8157,-31736,-8190,-31728,-8222,-31719,-8254,-31711,-8287,-31702,-8319,-31694,-8352,-31685,-8384,-31677,-8416,-31668,-8449,-31660,-8481,-31651,-8514,-31642,-8546,-31634,-8578,-31625,-8611,-31616,-8643,-31607,-8675,-31598,-8708,-31589,-8740,-31581,-8772,-31572,-8804,-31563,-8837,-31554,-8869,-31545,-8901,-31535,-8933,-31526,-8966,-31517,-8998,-31508,-9030,-31499,-9062,-31490,-9095,-31480,-9127,-31471,-9159,-31462,-9191,-31452,-9223,-31443,-9255,-31433,-9288,-31424,-9320,-31414,-9352,-31405,-9384,-31395,-9416,-31386,-9448,-31376,-9480,-31366,-9512,-31357,-9544,-31347,-9576,-31337,-9608,-31327,-9640,-31317,-9672,-31308,-9704,-31298,-9736,-31288,-9768,-31278,-9800,-31268,-9832,-31258,-9864,-31248,-9896,-31237,-9928,-31227,-9960,-31217,-9992,-31207,-10024,-31197,-10056,-31186,-10088,-31176,-10120,-31166,-10152,-31155,-10183,-31145,-10215,-31135,-10247,-31124,-10279,-31114,-10311,-31103,-10343,-31093,-10374,-31082,-10406,-31071,-10438,-31061,-10470,-31050,-10501,-31039,-10533,-31029,-10565,-31018,-10597,-31007,-10628,-30996,-10660,-30985,-10692,-30974,-10723,-30963,-10755,-30952,-10787,-30941,-10818,-30930,-10850,-30919,-10881,-30908,-10913,-30897,-10945,-30886,-10976,-30875,-11008,-30863,-11039,-30852,-11071,-30841,-11102,-30829,-11134,-30818,-11165,-30807,-11197,-30795,-11228,-30784,-11260,-30772,-11291,-30761,-11323,-30749,-11354,-30738,-11386,-30726,-11417,-30714,-11449,-30703,-11480,-30691,-11511,-30679,-11543,-30667,-11574,-30656,-11605,-30644,-11637,-30632,-11668,-30620,-11699,-30608,-11731,-30596,-11762,-30584,-11793,-30572,-11824,-30560,-11856,-30548,-11887,-30536,-11918,-30523,-11949,-30511,-11981,-30499,-12012,-30487,-12043,-30474,-12074,-30462,-12105,-30450,-12136,-30437,-12167,-30425,-12199,-30412,-12230,-30400,-12261,-30387,-12292,-30375,-12323,-30362,-12354,-30350,-12385,-30337,-12416,-30324,-12447,-30312,-12478,-30299,-12509,-30286,-12540,-30273,-12571,-30260,-12602,-30248,-12633,-30235,-12664,-30222,-12695,-30209,-12725,-30196,-12756,-30183,-12787,-30170,-12818,-30157,-12849,-30143,-12880,-30130,-12910,-30117,-12941,-30104,-12972,-30091,-13003,-30077,-13034,-30064,-13064,-30051,-13095,-30037,-13126,-30024,-13156,-30010,-13187,-29997,-13218,-29984,-13248,-29970,-13279,-29956,-13310,-29943,-13340,-29929,-13371,-29916,-13401,-29902,-13432,-29888,-13463,-29874,-13493,-29861,-13524,-29847,-13554,-29833,-13585,-29819,-13615,-29805,-13646,-29791,-13676,-29777,-13707,-29763,-13737,-29749,-13767,-29735,-13798,-29721,-13828,-29707,-13859,-29693,-13889,-29679,-13919,-29664,-13950,-29650,-13980,-29636,-14010,-29622,-14040,-29607,-14071,-29593,-14101,-29578,-14131,-29564,-14161,-29549,-14192,-29535,-14222,-29520,-14252,-29506,-14282,-29491,-14312,-29477,-14343,-29462,-14373,-29447,-14403,-29433,-14433,-29418,-14463,-29403,-14493,-29388,-14523,-29373,-14553,-29359,-14583,-29344,-14613,-29329,-14643,-29314,-14673,-29299,-14703,-29284,-14733,-29269,-14763,-29254,-14793,-29239,-14823,-29223,-14853,-29208,-14882,-29193,-14912,-29178,-14942,-29163,-14972,-29147,-15002,-29132,-15031,-29117,-15061,-29101,-15091,-29086,-15121,-29070,-15150,-29055,-15180,-29039,-15210,-29024,-15239,-29008,-15269,-28993,-15299,-28977,-15328,-28961,-15358,-28946,-15388,-28930,-15417,-28914,-15447,-28898,-15476,-28883,-15506,-28867,-15535,-28851,-15565,-28835,-15594,-28819,-15624,-28803,-15653,-28787,-15683,-28771,-15712,-28755,-15741,-28739,-15771,-28723,-15800,-28707,-15830,-28691,-15859,-28674,-15888,-28658,-15918,-28642,-15947,-28626,-15976,-28609,-16005,-28593,-16035,-28576,-16064,-28560,-16093,-28544,-16122,-28527,-16151,-28511,-16180,-28494,-16210,-28478,-16239,-28461,-16268,-28444,-16297,-28428,-16326,-28411,-16355,-28394,-16384,-28378,-16413,-28361,-16442,-28344,-16471,-28327,-16500,-28310,-16529,-28293,-16558,-28276,-16587,-28260,-16616,-28243,-16644,-28226,-16673,-28209,-16702,-28191,-16731,-28174,-16760,-28157,-16789,-28140,-16817,-28123,-16846,-28106,-16875,-28088,-16904,-28071,-16932,-28054,-16961,-28037,-16990,-28019,-17018,-28002,-17047,-27984,-17075,-27967,-17104,-27949,-17133,-27932,-17161,-27914,-17190,-27897,-17218,-27879,-17247,-27862,-17275,-27844,-17304,-27826,-17332,-27809,-17361,-27791,-17389,-27773,-17417,-27755,-17446,-27737,-17474,-27720,-17502,-27702,-17531,-27684,-17559,-27666,-17587,-27648,-17616,-27630,-17644,-27612,-17672,-27594,-17700,-27576,-17728,-27558,-17757,-27539,-17785,-27521,-17813,-27503,-17841,-27485,-17869,-27467,-17897,-27448,-17925,-27430,-17953,-27412,-17981,-27393,-18009,-27375,-18037,-27356,-18065,-27338,-18093,-27320,-18121,-27301,-18149,-27282,-18177,-27264,-18205,-27245,-18233,-27227,-18261,-27208,-18288,-27189,-18316,-27171,-18344,-27152,-18372,-27133,-18399,-27114,-18427,-27095,-18455,-27077,-18483,-27058,-18510,-27039,-18538,-27020,-18565,-27001,-18593,-26982,-18621,-26963,-18648,-26944,-18676,-26925,-18703,-26906,-18731,-26886,-18758,-26867,-18786,-26848,-18813,-26829,-18841,-26810,-18868,-26790,-18895,-26771,-18923,-26752,-18950,-26732,-18977,-26713,-19005,-26693,-19032,-26674,-19059,-26655,-19087,-26635,-19114,-26616,-19141,-26596,-19168,-26576,-19195,-26557,-19222,-26537,-19250,-26517,-19277,-26498,-19304,-26478,-19331,-26458,-19358,-26438,-19385,-26419,-19412,-26399,-19439,-26379,-19466,-26359,-19493,-26339,-19520,-26319,-19547,-26299,-19574,-26279,-19600,-26259,-19627,-26239,-19654,-26219,-19681,-26199,-19708,-26179,-19734,-26159,-19761,-26138,-19788,-26118,-19815,-26098,-19841,-26078,-19868,-26057,-19895,-26037,-19921,-26017,-19948,-25996,-19974,-25976,-20001,-25955,-20027,-25935,-20054,-25914,-20080,-25894,-20107,-25873,-20133,-25853,-20160,-25832,-20186,-25812,-20213,-25791,-20239,-25770,-20265,-25750,-20292,-25729,-20318,-25708,-20344,-25687,-20370,-25666,-20397,-25646,-20423,-25625,-20449,-25604,-20475,-25583,-20501,-25562,-20528,-25541,-20554,-25520,-20580,-25499,-20606,-25478,-20632,-25457,-20658,-25436,-20684,-25415,-20710,-25393,-20736,-25372,-20762,-25351,-20788,-25330,-20814,-25308,-20839,-25287,-20865,-25266,-20891,-25244,-20917,-25223,-20943,-25202,-20968,-25180,-20994,-25159,-21020,-25137,-21046,-25116,-21071,-25094,-21097,-25073,-21123,-25051,-21148,-25030,-21174,-25008,-21199,-24986,-21225,-24965,-21250,-24943,-21276,-24921,-21301,-24899,-21327,-24878,-21352,-24856,-21378,-24834,-21403,-24812,-21428,-24790,-21454,-24768,-21479,-24746,-21504,-24724,-21530,-24702,-21555,-24680,-21580,-24658,-21605,-24636,-21630,-24614,-21656,-24592,-21681,-24570,-21706,-24547,-21731,-24525,-21756,-24503,-21781,-24481,-21806,-24458,-21831,-24436,-21856,-24414,-21881,-24391,-21906,-24369,-21931,-24347,-21956,-24324,-21981,-24302,-22005,-24279,-22030,-24257,-22055,-24234,-22080,-24212,-22105,-24189,-22129,-24166,-22154,-24144,-22179,-24121,-22203,-24098,-22228,-24076,-22253,-24053,-22277,-24030,-22302,-24007,-22326,-23985,-22351,-23962,-22375,-23939,-22400,-23916,-22424,-23893,-22449,-23870,-22473,-23847,-22497,-23824,-22522,-23801,-22546,-23778,-22570,-23755,-22595,-23732,-22619,-23709,-22643,-23686,-22667,-23662,-22692,-23639,-22716,-23616,-22740,-23593,-22764,-23570,-22788,-23546,-22812,-23523,-22836,-23500,-22860,-23476,-22884,-23453,-22908,-23429,-22932,-23406,-22956,-23383,-22980,-23359,-23004,-23336,-23028,-23312,-23051,-23288,-23075,-23265,-23099,-23241,-23123,-23218,-23147,-23194,-23170,-23170,-23194,-23147,-23218,-23123,-23241,-23099,-23265,-23075,-23288,-23051,-23312,-23028,-23336,-23004,-23359,-22980,-23383,-22956,-23406,-22932,-23429,-22908,-23453,-22884,-23476,-22860,-23500,-22836,-23523,-22812,-23546,-22788,-23570,-22764,-23593,-22740,-23616,-22716,-23639,-22692,-23662,-22667,-23686,-22643,-23709,-22619,-23732,-22595,-23755,-22570,-23778,-22546,-23801,-22522,-23824,-22497,-23847,-22473,-23870,-22449,-23893,-22424,-23916,-22400,-23939,-22375,-23962,-22351,-23985,-22326,-24007,-22302,-24030,-22277,-24053,-22253,-24076,-22228,-24098,-22203,-24121,-22179,-24144,-22154,-24166,-22129,-24189,-22105,-24212,-22080,-24234,-22055,-24257,-22030,-24279,-22005,-24302,-21981,-24324,-21956,-24347,-21931,-24369,-21906,-24391,-21881,-24414,-21856,-24436,-21831,-24458,-21806,-24481,-21781,-24503,-21756,-24525,-21731,-24547,-21706,-24570,-21681,-24592,-21656,-24614,-21630,-24636,-21605,-24658,-21580,-24680,-21555,-24702,-21530,-24724,-21504,-24746,-21479,-24768,-21454,-24790,-21428,-24812,-21403,-24834,-21378,-24856,-21352,-24878,-21327,-24899,-21301,-24921,-21276,-24943,-21250,-24965,-21225,-24986,-21199,-25008,-21174,-25030,-21148,-25051,-21123,-25073,-21097,-25094,-21071,-25116,-21046,-25137,-21020,-25159,-20994,-25180,-20968,-25202,-20943,-25223,-20917,-25244,-20891,-25266,-20865,-25287,-20839,-25308,-20814,-25330,-20788,-25351,-20762,-25372,-20736,-25393,-20710,-25415,-20684,-25436,-20658,-25457,-20632,-25478,-20606,-25499,-20580,-25520,-20554,-25541,-20528,-25562,-20501,-25583,-20475,-25604,-20449,-25625,-20423,-25646,-20397,-25666,-20370,-25687,-20344,-25708,-20318,-25729,-20292,-25750,-20265,-25770,-20239,-25791,-20213,-25812,-20186,-25832,-20160,-25853,-20133,-25873,-20107,-25894,-20080,-25914,-20054,-25935,-20027,-25955,-20001,-25976,-19974,-25996,-19948,-26017,-19921,-26037,-19895,-26057,-19868,-26078,-19841,-26098,-19815,-26118,-19788,-26138,-19761,-26159,-19734,-26179,-19708,-26199,-19681,-26219,-19654,-26239,-19627,-26259,-19600,-26279,-19574,-26299,-19547,-26319,-19520,-26339,-19493,-26359,-19466,-26379,-19439,-26399,-19412,-26419,-19385,-26438,-19358,-26458,-19331,-26478,-19304,-26498,-19277,-26517,-19250,-26537,-19222,-26557,-19195,-26576,-19168,-26596,-19141,-26616,-19114,-26635,-19087,-26655,-19059,-26674,-19032,-26693,-19005,-26713,-18977,-26732,-18950,-26752,-18923,-26771,-18895,-26790,-18868,-26810,-18841,-26829,-18813,-26848,-18786,-26867,-18758,-26886,-18731,-26906,-18703,-26925,-18676,-26944,-18648,-26963,-18621,-26982,-18593,-27001,-18565,-27020,-18538,-27039,-18510,-27058,-18483,-27077,-18455,-27095,-18427,-27114,-18399,-27133,-18372,-27152,-18344,-27171,-18316,-27189,-18288,-27208,-18261,-27227,-18233,-27245,-18205,-27264,-18177,-27282,-18149,-27301,-18121,-27320,-18093,-27338,-18065,-27356,-18037,-27375,-18009,-27393,-17981,-27412,-17953,-27430,-17925,-27448,-17897,-27467,-17869,-27485,-17841,-27503,-17813,-27521,-17785,-27539,-17757,-27558,-17728,-27576,-17700,-27594,-17672,-27612,-17644,-27630,-17616,-27648,-17587,-27666,-17559,-27684,-17531,-27702,-17502,-27720,-17474,-27737,-17446,-27755,-17417,-27773,-17389,-27791,-17361,-27809,-17332,-27826,-17304,-27844,-17275,-27862,-17247,-27879,-17218,-27897,-17190,-27914,-17161,-27932,-17133,-27949,-17104,-27967,-17075,-27984,-17047,-28002,-17018,-28019,-16990,-28037,-16961,-28054,-16932,-28071,-16904,-28088,-16875,-28106,-16846,-28123,-16817,-28140,-16789,-28157,-16760,-28174,-16731,-28191,-16702,-28209,-16673,-28226,-16644,-28243,-16616,-28260,-16587,-28276,-16558,-28293,-16529,-28310,-16500,-28327,-16471,-28344,-16442,-28361,-16413,-28378,-16384,-28394,-16355,-28411,-16326,-28428,-16297,-28444,-16268,-28461,-16239,-28478,-16210,-28494,-16180,-28511,-16151,-28527,-16122,-28544,-16093,-28560,-16064,-28576,-16035,-28593,-16005,-28609,-15976,-28626,-15947,-28642,-15918,-28658,-15888,-28674,-15859,-28691,-15830,-28707,-15800,-28723,-15771,-28739,-15741,-28755,-15712,-28771,-15683,-28787,-15653,-28803,-15624,-28819,-15594,-28835,-15565,-28851,-15535,-28867,-15506,-28883,-15476,-28898,-15447,-28914,-15417,-28930,-15388,-28946,-15358,-28961,-15328,-28977,-15299,-28993,-15269,-29008,-15239,-29024,-15210,-29039,-15180,-29055,-15150,-29070,-15121,-29086,-15091,-29101,-15061,-29117,-15031,-29132,-15002,-29147,-14972,-29163,-14942,-29178,-14912,-29193,-14882,-29208,-14853,-29223,-14823,-29239,-14793,-29254,-14763,-29269,-14733,-29284,-14703,-29299,-14673,-29314,-14643,-29329,-14613,-29344,-14583,-29359,-14553,-29373,-14523,-29388,-14493,-29403,-14463,-29418,-14433,-29433,-14403,-29447,-14373,-29462,-14343,-29477,-14312,-29491,-14282,-29506,-14252,-29520,-14222,-29535,-14192,-29549,-14161,-29564,-14131,-29578,-14101,-29593,-14071,-29607,-14040,-29622,-14010,-29636,-13980,-29650,-13950,-29664,-13919,-29679,-13889,-29693,-13859,-29707,-13828,-29721,-13798,-29735,-13767,-29749,-13737,-29763,-13707,-29777,-13676,-29791,-13646,-29805,-13615,-29819,-13585,-29833,-13554,-29847,-13524,-29861,-13493,-29874,-13463,-29888,-13432,-29902,-13401,-29916,-13371,-29929,-13340,-29943,-13310,-29956,-13279,-29970,-13248,-29984,-13218,-29997,-13187,-30010,-13156,-30024,-13126,-30037,-13095,-30051,-13064,-30064,-13034,-30077,-13003,-30091,-12972,-30104,-12941,-30117,-12910,-30130,-12880,-30143,-12849,-30157,-12818,-30170,-12787,-30183,-12756,-30196,-12725,-30209,-12695,-30222,-12664,-30235,-12633,-30248,-12602,-30260,-12571,-30273,-12540,-30286,-12509,-30299,-12478,-30312,-12447,-30324,-12416,-30337,-12385,-30350,-12354,-30362,-12323,-30375,-12292,-30387,-12261,-30400,-12230,-30412,-12199,-30425,-12167,-30437,-12136,-30450,-12105,-30462,-12074,-30474,-12043,-30487,-12012,-30499,-11981,-30511,-11949,-30523,-11918,-30536,-11887,-30548,-11856,-30560,-11824,-30572,-11793,-30584,-11762,-30596,-11731,-30608,-11699,-30620,-11668,-30632,-11637,-30644,-11605,-30656,-11574,-30667,-11543,-30679,-11511,-30691,-11480,-30703,-11449,-30714,-11417,-30726,-11386,-30738,-11354,-30749,-11323,-30761,-11291,-30772,-11260,-30784,-11228,-30795,-11197,-30807,-11165,-30818,-11134,-30829,-11102,-30841,-11071,-30852,-11039,-30863,-11008,-30875,-10976,-30886,-10945,-30897,-10913,-30908,-10881,-30919,-10850,-30930,-10818,-30941,-10787,-30952,-10755,-30963,-10723,-30974,-10692,-30985,-10660,-30996,-10628,-31007,-10597,-31018,-10565,-31029,-10533,-31039,-10501,-31050,-10470,-31061,-10438,-31071,-10406,-31082,-10374,-31093,-10343,-31103,-10311,-31114,-10279,-31124,-10247,-31135,-10215,-31145,-10183,-31155,-10152,-31166,-10120,-31176,-10088,-31186,-10056,-31197,-10024,-31207,-9992,-31217,-9960,-31227,-9928,-31237,-9896,-31248,-9864,-31258,-9832,-31268,-9800,-31278,-9768,-31288,-9736,-31298,-9704,-31308,-9672,-31317,-9640,-31327,-9608,-31337,-9576,-31347,-9544,-31357,-9512,-31366,-9480,-31376,-9448,-31386,-9416,-31395,-9384,-31405,-9352,-31414,-9320,-31424,-9288,-31433,-9255,-31443,-9223,-31452,-9191,-31462,-9159,-31471,-9127,-31480,-9095,-31490,-9062,-31499,-9030,-31508,-8998,-31517,-8966,-31526,-8933,-31535,-8901,-31545,-8869,-31554,-8837,-31563,-8804,-31572,-8772,-31581,-8740,-31589,-8708,-31598,-8675,-31607,-8643,-31616,-8611,-31625,-8578,-31634,-8546,-31642,-8514,-31651,-8481,-31660,-8449,-31668,-8416,-31677,-8384,-31685,-8352,-31694,-8319,-31702,-8287,-31711,-8254,-31719,-8222,-31728,-8190,-31736,-8157,-31744,-8125,-31753,-8092,-31761,-8060,-31769,-8027,-31777,-7995,-31786,-7962,-31794,-7930,-31802,-7897,-31810,-7865,-31818,-7832,-31826,-7800,-31834,-7767,-31842,-7734,-31850,-7702,-31857,-7669,-31865,-7637,-31873,-7604,-31881,-7572,-31889,-7539,-31896,-7506,-31904,-7474,-31912,-7441,-31919,-7408,-31927,-7376,-31934,-7343,-31942,-7311,-31949,-7278,-31957,-7245,-31964,-7212,-31971,-7180,-31979,-7147,-31986,-7114,-31993,-7082,-32000,-7049,-32008,-7016,-32015,-6983,-32022,-6951,-32029,-6918,-32036,-6885,-32043,-6852,-32050,-6820,-32057,-6787,-32064,-6754,-32071,-6721,-32078,-6689,-32085,-6656,-32091,-6623,-32098,-6590,-32105,-6557,-32111,-6524,-32118,-6492,-32125,-6459,-32131,-6426,-32138,-6393,-32144,-6360,-32151,-6327,-32157,-6294,-32164,-6262,-32170,-6229,-32177,-6196,-32183,-6163,-32189,-6130,-32195,-6097,-32202,-6064,-32208,-6031,-32214,-5998,-32220,-5965,-32226,-5932,-32232,-5899,-32238,-5866,-32244,-5833,-32250,-5800,-32256,-5767,-32262,-5734,-32268,-5701,-32274,-5668,-32279,-5635,-32285,-5602,-32291,-5569,-32296,-5536,-32302,-5503,-32308,-5470,-32313,-5437,-32319,-5404,-32324,-5371,-32330,-5338,-32335,-5305,-32341,-5272,-32346,-5239,-32351,-5206,-32357,-5173,-32362,-5140,-32367,-5107,-32372,-5073,-32378,-5040,-32383,-5007,-32388,-4974,-32393,-4941,-32398,-4908,-32403,-4875,-32408,-4842,-32413,-4808,-32418,-4775,-32423,-4742,-32427,-4709,-32432,-4676,-32437,-4643,-32442,-4609,-32446,-4576,-32451,-4543,-32456,-4510,-32460,-4477,-32465,-4444,-32469,-4410,-32474,-4377,-32478,-4344,-32483,-4311,-32487,-4277,-32492,-4244,-32496,-4211,-32500,-4178,-32504,-4145,-32509,-4111,-32513,-4078,-32517,-4045,-32521,-4012,-32525,-3978,-32529,-3945,-32533,-3912,-32537,-3878,-32541,-3845,-32545,-3812,-32549,-3779,-32553,-3745,-32557,-3712,-32560,-3679,-32564,-3645,-32568,-3612,-32572,-3579,-32575,-3546,-32579,-3512,-32582,-3479,-32586,-3446,-32589,-3412,-32593,-3379,-32596,-3346,-32600,-3312,-32603,-3279,-32606,-3246,-32610,-3212,-32613,-3179,-32616,-3146,-32619,-3112,-32623,-3079,-32626,-3045,-32629,-3012,-32632,-2979,-32635,-2945,-32638,-2912,-32641,-2879,-32644,-2845,-32647,-2812,-32650,-2778,-32652,-2745,-32655,-2712,-32658,-2678,-32661,-2645,-32663,-2611,-32666,-2578,-32669,-2545,-32671,-2511,-32674,-2478,-32676,-2444,-32679,-2411,-32681,-2378,-32684,-2344,-32686,-2311,-32688,-2277,-32691,-2244,-32693,-2210,-32695,-2177,-32697,-2144,-32700,-2110,-32702,-2077,-32704,-2043,-32706,-2010,-32708,-1976,-32710,-1943,-32712,-1909,-32714,-1876,-32716,-1843,-32718,-1809,-32719,-1776,-32721,-1742,-32723,-1709,-32725,-1675,-32726,-1642,-32728,-1608,-32730,-1575,-32731,-1541,-32733,-1508,-32734,-1474,-32736,-1441,-32737,-1407,-32739,-1374,-32740,-1340,-32741,-1307,-32743,-1274,-32744,-1240,-32745,-1207,-32747,-1173,-32748,-1140,-32749,-1106,-32750,-1073,-32751,-1039,-32752,-1006,-32753,-972,-32754,-939,-32755,-905,-32756,-872,-32757,-838,-32758,-805,-32758,-771,-32759,-738,-32760,-704,-32761,-671,-32761,-637,-32762,-604,-32763,-570,-32763,-537,-32764,-503,-32764,-470,-32765,-436,-32765,-403,-32765,-369,-32766,-336,-32766,-302,-32766,-269,-32767,-235,-32767,-202,-32767,-168,-32767,-135,-32767,-101,-32767,-68,-32767,-34,-32767,-1,-32767,33,-32767,67,-32767,100,-32767,134,-32767,167,-32767,201,-32767,234,-32766,268,-32766,301,-32766,335,-32765,368,-32765,402,-32765,435,-32764,469,-32764,502,-32763,536,-32763,569,-32762,603,-32761,636,-32761,670,-32760,703,-32759,737,-32758,770,-32758,804,-32757,837,-32756,871,-32755,904,-32754,938,-32753,971,-32752,1005,-32751,1038,-32750,1072,-32749,1105,-32748,1139,-32747,1172,-32745,1206,-32744,1239,-32743,1273,-32741,1306,-32740,1339,-32739,1373,-32737,1406,-32736,1440,-32734,1473,-32733,1507,-32731,1540,-32730,1574,-32728,1607,-32726,1641,-32725,1674,-32723,1708,-32721,1741,-32719,1775,-32718,1808,-32716,1842,-32714,1875,-32712,1908,-32710,1942,-32708,1975,-32706,2009,-32704,2042,-32702,2076,-32700,2109,-32697,2143,-32695,2176,-32693,2209,-32691,2243,-32688,2276,-32686,2310,-32684,2343,-32681,2377,-32679,2410,-32676,2443,-32674,2477,-32671,2510,-32669,2544,-32666,2577,-32663,2610,-32661,2644,-32658,2677,-32655,2711,-32652,2744,-32650,2777,-32647,2811,-32644,2844,-32641,2878,-32638,2911,-32635,2944,-32632,2978,-32629,3011,-32626,3044,-32623,3078,-32619,3111,-32616,3145,-32613,3178,-32610,3211,-32606,3245,-32603,3278,-32600,3311,-32596,3345,-32593,3378,-32589,3411,-32586,3445,-32582,3478,-32579,3511,-32575,3545,-32572,3578,-32568,3611,-32564,3644,-32560,3678,-32557,3711,-32553,3744,-32549,3778,-32545,3811,-32541,3844,-32537,3877,-32533,3911,-32529,3944,-32525,3977,-32521,4011,-32517,4044,-32513,4077,-32509,4110,-32504,4144,-32500,4177,-32496,4210,-32492,4243,-32487,4276,-32483,4310,-32478,4343,-32474,4376,-32469,4409,-32465,4443,-32460,4476,-32456,4509,-32451,4542,-32446,4575,-32442,4608,-32437,4642,-32432,4675,-32427,4708,-32423,4741,-32418,4774,-32413,4807,-32408,4841,-32403,4874,-32398,4907,-32393,4940,-32388,4973,-32383,5006,-32378,5039,-32372,5072,-32367,5106,-32362,5139,-32357,5172,-32351,5205,-32346,5238,-32341,5271,-32335,5304,-32330,5337,-32324,5370,-32319,5403,-32313,5436,-32308,5469,-32302,5502,-32296,5535,-32291,5568,-32285,5601,-32279,5634,-32274,5667,-32268,5700,-32262,5733,-32256,5766,-32250,5799,-32244,5832,-32238,5865,-32232,5898,-32226,5931,-32220,5964,-32214,5997,-32208,6030,-32202,6063,-32195,6096,-32189,6129,-32183,6162,-32177,6195,-32170,6228,-32164,6261,-32157,6293,-32151,6326,-32144,6359,-32138,6392,-32131,6425,-32125,6458,-32118,6491,-32111,6523,-32105,6556,-32098,6589,-32091,6622,-32085,6655,-32078,6688,-32071,6720,-32064,6753,-32057,6786,-32050,6819,-32043,6851,-32036,6884,-32029,6917,-32022,6950,-32015,6982,-32008,7015,-32000,7048,-31993,7081,-31986,7113,-31979,7146,-31971,7179,-31964,7211,-31957,7244,-31949,7277,-31942,7310,-31934,7342,-31927,7375,-31919,7407,-31912,7440,-31904,7473,-31896,7505,-31889,7538,-31881,7571,-31873,7603,-31865,7636,-31857,7668,-31850,7701,-31842,7733,-31834,7766,-31826,7799,-31818,7831,-31810,7864,-31802,7896,-31794,7929,-31786,7961,-31777,7994,-31769,8026,-31761,8059,-31753,8091,-31744,8124,-31736,8156,-31728,8189,-31719,8221,-31711,8253,-31702,8286,-31694,8318,-31685,8351,-31677,8383,-31668,8415,-31660,8448,-31651,8480,-31642,8513,-31634,8545,-31625,8577,-31616,8610,-31607,8642,-31598,8674,-31589,8707,-31581,8739,-31572,8771,-31563,8803,-31554,8836,-31545,8868,-31535,8900,-31526,8932,-31517,8965,-31508,8997,-31499,9029,-31490,9061,-31480,9094,-31471,9126,-31462,9158,-31452,9190,-31443,9222,-31433,9254,-31424,9287,-31414,9319,-31405,9351,-31395,9383,-31386,9415,-31376,9447,-31366,9479,-31357,9511,-31347,9543,-31337,9575,-31327,9607,-31317,9639,-31308,9671,-31298,9703,-31288,9735,-31278,9767,-31268,9799,-31258,9831,-31248,9863,-31237,9895,-31227,9927,-31217,9959,-31207,9991,-31197,10023,-31186,10055,-31176,10087,-31166,10119,-31155,10151,-31145,10182,-31135,10214,-31124,10246,-31114,10278,-31103,10310,-31093,10342,-31082,10373,-31071,10405,-31061,10437,-31050,10469,-31039,10500,-31029,10532,-31018,10564,-31007,10596,-30996,10627,-30985,10659,-30974,10691,-30963,10722,-30952,10754,-30941,10786,-30930,10817,-30919,10849,-30908,10880,-30897,10912,-30886,10944,-30875,10975,-30863,11007,-30852,11038,-30841,11070,-30829,11101,-30818,11133,-30807,11164,-30795,11196,-30784,11227,-30772,11259,-30761,11290,-30749,11322,-30738,11353,-30726,11385,-30714,11416,-30703,11448,-30691,11479,-30679,11510,-30667,11542,-30656,11573,-30644,11604,-30632,11636,-30620,11667,-30608,11698,-30596,11730,-30584,11761,-30572,11792,-30560,11823,-30548,11855,-30536,11886,-30523,11917,-30511,11948,-30499,11980,-30487,12011,-30474,12042,-30462,12073,-30450,12104,-30437,12135,-30425,12166,-30412,12198,-30400,12229,-30387,12260,-30375,12291,-30362,12322,-30350,12353,-30337,12384,-30324,12415,-30312,12446,-30299,12477,-30286,12508,-30273,12539,-30260,12570,-30248,12601,-30235,12632,-30222,12663,-30209,12694,-30196,12724,-30183,12755,-30170,12786,-30157,12817,-30143,12848,-30130,12879,-30117,12909,-30104,12940,-30091,12971,-30077,13002,-30064,13033,-30051,13063,-30037,13094,-30024,13125,-30010,13155,-29997,13186,-29984,13217,-29970,13247,-29956,13278,-29943,13309,-29929,13339,-29916,13370,-29902,13400,-29888,13431,-29874,13462,-29861,13492,-29847,13523,-29833,13553,-29819,13584,-29805,13614,-29791,13645,-29777,13675,-29763,13706,-29749,13736,-29735,13766,-29721,13797,-29707,13827,-29693,13858,-29679,13888,-29664,13918,-29650,13949,-29636,13979,-29622,14009,-29607,14039,-29593,14070,-29578,14100,-29564,14130,-29549,14160,-29535,14191,-29520,14221,-29506,14251,-29491,14281,-29477,14311,-29462,14342,-29447,14372,-29433,14402,-29418,14432,-29403,14462,-29388,14492,-29373,14522,-29359,14552,-29344,14582,-29329,14612,-29314,14642,-29299,14672,-29284,14702,-29269,14732,-29254,14762,-29239,14792,-29223,14822,-29208,14852,-29193,14881,-29178,14911,-29163,14941,-29147,14971,-29132,15001,-29117,15030,-29101,15060,-29086,15090,-29070,15120,-29055,15149,-29039,15179,-29024,15209,-29008,15238,-28993,15268,-28977,15298,-28961,15327,-28946,15357,-28930,15387,-28914,15416,-28898,15446,-28883,15475,-28867,15505,-28851,15534,-28835,15564,-28819,15593,-28803,15623,-28787,15652,-28771,15682,-28755,15711,-28739,15740,-28723,15770,-28707,15799,-28691,15829,-28674,15858,-28658,15887,-28642,15917,-28626,15946,-28609,15975,-28593,16004,-28576,16034,-28560,16063,-28544,16092,-28527,16121,-28511,16150,-28494,16179,-28478,16209,-28461,16238,-28444,16267,-28428,16296,-28411,16325,-28394,16354,-28378,16383,-28361,16412,-28344,16441,-28327,16470,-28310,16499,-28293,16528,-28276,16557,-28260,16586,-28243,16615,-28226,16643,-28209,16672,-28191,16701,-28174,16730,-28157,16759,-28140,16788,-28123,16816,-28106,16845,-28088,16874,-28071,16903,-28054,16931,-28037,16960,-28019,16989,-28002,17017,-27984,17046,-27967,17074,-27949,17103,-27932,17132,-27914,17160,-27897,17189,-27879,17217,-27862,17246,-27844,17274,-27826,17303,-27809,17331,-27791,17360,-27773,17388,-27755,17416,-27737,17445,-27720,17473,-27702,17501,-27684,17530,-27666,17558,-27648,17586,-27630,17615,-27612,17643,-27594,17671,-27576,17699,-27558,17727,-27539,17756,-27521,17784,-27503,17812,-27485,17840,-27467,17868,-27448,17896,-27430,17924,-27412,17952,-27393,17980,-27375,18008,-27356,18036,-27338,18064,-27320,18092,-27301,18120,-27282,18148,-27264,18176,-27245,18204,-27227,18232,-27208,18260,-27189,18287,-27171,18315,-27152,18343,-27133,18371,-27114,18398,-27095,18426,-27077,18454,-27058,18482,-27039,18509,-27020,18537,-27001,18564,-26982,18592,-26963,18620,-26944,18647,-26925,18675,-26906,18702,-26886,18730,-26867,18757,-26848,18785,-26829,18812,-26810,18840,-26790,18867,-26771,18894,-26752,18922,-26732,18949,-26713,18976,-26693,19004,-26674,19031,-26655,19058,-26635,19086,-26616,19113,-26596,19140,-26576,19167,-26557,19194,-26537,19221,-26517,19249,-26498,19276,-26478,19303,-26458,19330,-26438,19357,-26419,19384,-26399,19411,-26379,19438,-26359,19465,-26339,19492,-26319,19519,-26299,19546,-26279,19573,-26259,19599,-26239,19626,-26219,19653,-26199,19680,-26179,19707,-26159,19733,-26138,19760,-26118,19787,-26098,19814,-26078,19840,-26057,19867,-26037,19894,-26017,19920,-25996,19947,-25976,19973,-25955,20000,-25935,20026,-25914,20053,-25894,20079,-25873,20106,-25853,20132,-25832,20159,-25812,20185,-25791,20212,-25770,20238,-25750,20264,-25729,20291,-25708,20317,-25687,20343,-25666,20369,-25646,20396,-25625,20422,-25604,20448,-25583,20474,-25562,20500,-25541,20527,-25520,20553,-25499,20579,-25478,20605,-25457,20631,-25436,20657,-25415,20683,-25393,20709,-25372,20735,-25351,20761,-25330,20787,-25308,20813,-25287,20838,-25266,20864,-25244,20890,-25223,20916,-25202,20942,-25180,20967,-25159,20993,-25137,21019,-25116,21045,-25094,21070,-25073,21096,-25051,21122,-25030,21147,-25008,21173,-24986,21198,-24965,21224,-24943,21249,-24921,21275,-24899,21300,-24878,21326,-24856,21351,-24834,21377,-24812,21402,-24790,21427,-24768,21453,-24746,21478,-24724,21503,-24702,21529,-24680,21554,-24658,21579,-24636,21604,-24614,21629,-24592,21655,-24570,21680,-24547,21705,-24525,21730,-24503,21755,-24481,21780,-24458,21805,-24436,21830,-24414,21855,-24391,21880,-24369,21905,-24347,21930,-24324,21955,-24302,21980,-24279,22004,-24257,22029,-24234,22054,-24212,22079,-24189,22104,-24166,22128,-24144,22153,-24121,22178,-24098,22202,-24076,22227,-24053,22252,-24030,22276,-24007,22301,-23985,22325,-23962,22350,-23939,22374,-23916,22399,-23893,22423,-23870,22448,-23847,22472,-23824,22496,-23801,22521,-23778,22545,-23755,22569,-23732,22594,-23709,22618,-23686,22642,-23662,22666,-23639,22691,-23616,22715,-23593,22739,-23570,22763,-23546,22787,-23523,22811,-23500,22835,-23476,22859,-23453,22883,-23429,22907,-23406,22931,-23383,22955,-23359,22979,-23336,23003,-23312,23027,-23288,23050,-23265,23074,-23241,23098,-23218,23122,-23194,23146,-23170,23169,-23147,23193,-23123,23217,-23099,23240,-23075,23264,-23051,23287,-23028,23311,-23004,23335,-22980,23358,-22956,23382,-22932,23405,-22908,23428,-22884,23452,-22860,23475,-22836,23499,-22812,23522,-22788,23545,-22764,23569,-22740,23592,-22716,23615,-22692,23638,-22667,23661,-22643,23685,-22619,23708,-22595,23731,-22570,23754,-22546,23777,-22522,23800,-22497,23823,-22473,23846,-22449,23869,-22424,23892,-22400,23915,-22375,23938,-22351,23961,-22326,23984,-22302,24006,-22277,24029,-22253,24052,-22228,24075,-22203,24097,-22179,24120,-22154,24143,-22129,24165,-22105,24188,-22080,24211,-22055,24233,-22030,24256,-22005,24278,-21981,24301,-21956,24323,-21931,24346,-21906,24368,-21881,24390,-21856,24413,-21831,24435,-21806,24457,-21781,24480,-21756,24502,-21731,24524,-21706,24546,-21681,24569,-21656,24591,-21630,24613,-21605,24635,-21580,24657,-21555,24679,-21530,24701,-21504,24723,-21479,24745,-21454,24767,-21428,24789,-21403,24811,-21378,24833,-21352,24855,-21327,24877,-21301,24898,-21276,24920,-21250,24942,-21225,24964,-21199,24985,-21174,25007,-21148,25029,-21123,25050,-21097,25072,-21071,25093,-21046,25115,-21020,25136,-20994,25158,-20968,25179,-20943,25201,-20917,25222,-20891,25243,-20865,25265,-20839,25286,-20814,25307,-20788,25329,-20762,25350,-20736,25371,-20710,25392,-20684,25414,-20658,25435,-20632,25456,-20606,25477,-20580,25498,-20554,25519,-20528,25540,-20501,25561,-20475,25582,-20449,25603,-20423,25624,-20397,25645,-20370,25665,-20344,25686,-20318,25707,-20292,25728,-20265,25749,-20239,25769,-20213,25790,-20186,25811,-20160,25831,-20133,25852,-20107,25872,-20080,25893,-20054,25913,-20027,25934,-20001,25954,-19974,25975,-19948,25995,-19921,26016,-19895,26036,-19868,26056,-19841,26077,-19815,26097,-19788,26117,-19761,26137,-19734,26158,-19708,26178,-19681,26198,-19654,26218,-19627,26238,-19600,26258,-19574,26278,-19547,26298,-19520,26318,-19493,26338,-19466,26358,-19439,26378,-19412,26398,-19385,26418,-19358,26437,-19331,26457,-19304,26477,-19277,26497,-19250,26516,-19222,26536,-19195,26556,-19168,26575,-19141,26595,-19114,26615,-19087,26634,-19059,26654,-19032,26673,-19005,26692,-18977,26712,-18950,26731,-18923,26751,-18895,26770,-18868,26789,-18841,26809,-18813,26828,-18786,26847,-18758,26866,-18731,26885,-18703,26905,-18676,26924,-18648,26943,-18621,26962,-18593,26981,-18565,27000,-18538,27019,-18510,27038,-18483,27057,-18455,27076,-18427,27094,-18399,27113,-18372,27132,-18344,27151,-18316,27170,-18288,27188,-18261,27207,-18233,27226,-18205,27244,-18177,27263,-18149,27281,-18121,27300,-18093,27319,-18065,27337,-18037,27355,-18009,27374,-17981,27392,-17953,27411,-17925,27429,-17897,27447,-17869,27466,-17841,27484,-17813,27502,-17785,27520,-17757,27538,-17728,27557,-17700,27575,-17672,27593,-17644,27611,-17616,27629,-17587,27647,-17559,27665,-17531,27683,-17502,27701,-17474,27719,-17446,27736,-17417,27754,-17389,27772,-17361,27790,-17332,27808,-17304,27825,-17275,27843,-17247,27861,-17218,27878,-17190,27896,-17161,27913,-17133,27931,-17104,27948,-17075,27966,-17047,27983,-17018,28001,-16990,28018,-16961,28036,-16932,28053,-16904,28070,-16875,28087,-16846,28105,-16817,28122,-16789,28139,-16760,28156,-16731,28173,-16702,28190,-16673,28208,-16644,28225,-16616,28242,-16587,28259,-16558,28275,-16529,28292,-16500,28309,-16471,28326,-16442,28343,-16413,28360}; +int16_t twb12288[8192] __attribute__((aligned(32))) = {32767,0,32766,-34,32766,-68,32766,-101,32766,-135,32766,-168,32766,-202,32766,-235,32765,-269,32765,-302,32765,-336,32764,-369,32764,-403,32764,-436,32763,-470,32763,-503,32762,-537,32762,-570,32761,-604,32760,-637,32760,-671,32759,-704,32758,-738,32757,-771,32757,-805,32756,-838,32755,-872,32754,-905,32753,-939,32752,-972,32751,-1006,32750,-1039,32749,-1073,32748,-1106,32747,-1140,32746,-1173,32744,-1207,32743,-1240,32742,-1274,32740,-1307,32739,-1340,32738,-1374,32736,-1407,32735,-1441,32733,-1474,32732,-1508,32730,-1541,32729,-1575,32727,-1608,32725,-1642,32724,-1675,32722,-1709,32720,-1742,32718,-1776,32717,-1809,32715,-1843,32713,-1876,32711,-1909,32709,-1943,32707,-1976,32705,-2010,32703,-2043,32701,-2077,32699,-2110,32696,-2144,32694,-2177,32692,-2210,32690,-2244,32687,-2277,32685,-2311,32683,-2344,32680,-2378,32678,-2411,32675,-2444,32673,-2478,32670,-2511,32668,-2545,32665,-2578,32662,-2611,32660,-2645,32657,-2678,32654,-2712,32651,-2745,32649,-2778,32646,-2812,32643,-2845,32640,-2879,32637,-2912,32634,-2945,32631,-2979,32628,-3012,32625,-3045,32622,-3079,32618,-3112,32615,-3146,32612,-3179,32609,-3212,32605,-3246,32602,-3279,32599,-3312,32595,-3346,32592,-3379,32588,-3412,32585,-3446,32581,-3479,32578,-3512,32574,-3546,32571,-3579,32567,-3612,32563,-3645,32559,-3679,32556,-3712,32552,-3745,32548,-3779,32544,-3812,32540,-3845,32536,-3878,32532,-3912,32528,-3945,32524,-3978,32520,-4012,32516,-4045,32512,-4078,32508,-4111,32503,-4145,32499,-4178,32495,-4211,32491,-4244,32486,-4277,32482,-4311,32477,-4344,32473,-4377,32468,-4410,32464,-4444,32459,-4477,32455,-4510,32450,-4543,32445,-4576,32441,-4609,32436,-4643,32431,-4676,32426,-4709,32422,-4742,32417,-4775,32412,-4808,32407,-4842,32402,-4875,32397,-4908,32392,-4941,32387,-4974,32382,-5007,32377,-5040,32371,-5073,32366,-5107,32361,-5140,32356,-5173,32350,-5206,32345,-5239,32340,-5272,32334,-5305,32329,-5338,32323,-5371,32318,-5404,32312,-5437,32307,-5470,32301,-5503,32295,-5536,32290,-5569,32284,-5602,32278,-5635,32273,-5668,32267,-5701,32261,-5734,32255,-5767,32249,-5800,32243,-5833,32237,-5866,32231,-5899,32225,-5932,32219,-5965,32213,-5998,32207,-6031,32201,-6064,32194,-6097,32188,-6130,32182,-6163,32176,-6196,32169,-6229,32163,-6262,32156,-6294,32150,-6327,32143,-6360,32137,-6393,32130,-6426,32124,-6459,32117,-6492,32110,-6524,32104,-6557,32097,-6590,32090,-6623,32084,-6656,32077,-6689,32070,-6721,32063,-6754,32056,-6787,32049,-6820,32042,-6852,32035,-6885,32028,-6918,32021,-6951,32014,-6983,32007,-7016,31999,-7049,31992,-7082,31985,-7114,31978,-7147,31970,-7180,31963,-7212,31956,-7245,31948,-7278,31941,-7311,31933,-7343,31926,-7376,31918,-7408,31911,-7441,31903,-7474,31895,-7506,31888,-7539,31880,-7572,31872,-7604,31864,-7637,31856,-7669,31849,-7702,31841,-7734,31833,-7767,31825,-7800,31817,-7832,31809,-7865,31801,-7897,31793,-7930,31785,-7962,31776,-7995,31768,-8027,31760,-8060,31752,-8092,31743,-8125,31735,-8157,31727,-8190,31718,-8222,31710,-8254,31701,-8287,31693,-8319,31684,-8352,31676,-8384,31667,-8416,31659,-8449,31650,-8481,31641,-8514,31633,-8546,31624,-8578,31615,-8611,31606,-8643,31597,-8675,31588,-8708,31580,-8740,31571,-8772,31562,-8804,31553,-8837,31544,-8869,31534,-8901,31525,-8933,31516,-8966,31507,-8998,31498,-9030,31489,-9062,31479,-9095,31470,-9127,31461,-9159,31451,-9191,31442,-9223,31432,-9255,31423,-9288,31413,-9320,31404,-9352,31394,-9384,31385,-9416,31375,-9448,31365,-9480,31356,-9512,31346,-9544,31336,-9576,31326,-9608,31316,-9640,31307,-9672,31297,-9704,31287,-9736,31277,-9768,31267,-9800,31257,-9832,31247,-9864,31236,-9896,31226,-9928,31216,-9960,31206,-9992,31196,-10024,31185,-10056,31175,-10088,31165,-10120,31154,-10152,31144,-10183,31134,-10215,31123,-10247,31113,-10279,31102,-10311,31092,-10343,31081,-10374,31070,-10406,31060,-10438,31049,-10470,31038,-10501,31028,-10533,31017,-10565,31006,-10597,30995,-10628,30984,-10660,30973,-10692,30962,-10723,30951,-10755,30940,-10787,30929,-10818,30918,-10850,30907,-10881,30896,-10913,30885,-10945,30874,-10976,30862,-11008,30851,-11039,30840,-11071,30828,-11102,30817,-11134,30806,-11165,30794,-11197,30783,-11228,30771,-11260,30760,-11291,30748,-11323,30737,-11354,30725,-11386,30713,-11417,30702,-11449,30690,-11480,30678,-11511,30666,-11543,30655,-11574,30643,-11605,30631,-11637,30619,-11668,30607,-11699,30595,-11731,30583,-11762,30571,-11793,30559,-11824,30547,-11856,30535,-11887,30522,-11918,30510,-11949,30498,-11981,30486,-12012,30473,-12043,30461,-12074,30449,-12105,30436,-12136,30424,-12167,30411,-12199,30399,-12230,30386,-12261,30374,-12292,30361,-12323,30349,-12354,30336,-12385,30323,-12416,30311,-12447,30298,-12478,30285,-12509,30272,-12540,30259,-12571,30247,-12602,30234,-12633,30221,-12664,30208,-12695,30195,-12725,30182,-12756,30169,-12787,30156,-12818,30142,-12849,30129,-12880,30116,-12910,30103,-12941,30090,-12972,30076,-13003,30063,-13034,30050,-13064,30036,-13095,30023,-13126,30009,-13156,29996,-13187,29983,-13218,29969,-13248,29955,-13279,29942,-13310,29928,-13340,29915,-13371,29901,-13401,29887,-13432,29873,-13463,29860,-13493,29846,-13524,29832,-13554,29818,-13585,29804,-13615,29790,-13646,29776,-13676,29762,-13707,29748,-13737,29734,-13767,29720,-13798,29706,-13828,29692,-13859,29678,-13889,29663,-13919,29649,-13950,29635,-13980,29621,-14010,29606,-14040,29592,-14071,29577,-14101,29563,-14131,29548,-14161,29534,-14192,29519,-14222,29505,-14252,29490,-14282,29476,-14312,29461,-14343,29446,-14373,29432,-14403,29417,-14433,29402,-14463,29387,-14493,29372,-14523,29358,-14553,29343,-14583,29328,-14613,29313,-14643,29298,-14673,29283,-14703,29268,-14733,29253,-14763,29238,-14793,29222,-14823,29207,-14853,29192,-14882,29177,-14912,29162,-14942,29146,-14972,29131,-15002,29116,-15031,29100,-15061,29085,-15091,29069,-15121,29054,-15150,29038,-15180,29023,-15210,29007,-15239,28992,-15269,28976,-15299,28960,-15328,28945,-15358,28929,-15388,28913,-15417,28897,-15447,28882,-15476,28866,-15506,28850,-15535,28834,-15565,28818,-15594,28802,-15624,28786,-15653,28770,-15683,28754,-15712,28738,-15741,28722,-15771,28706,-15800,28690,-15830,28673,-15859,28657,-15888,28641,-15918,28625,-15947,28608,-15976,28592,-16005,28575,-16035,28559,-16064,28543,-16093,28526,-16122,28510,-16151,28493,-16180,28477,-16210,28460,-16239,28443,-16268,28427,-16297,28410,-16326,28393,-16355,28377,-16384,28360,-16413,28343,-16442,28326,-16471,28309,-16500,28292,-16529,28275,-16558,28259,-16587,28242,-16616,28225,-16644,28208,-16673,28190,-16702,28173,-16731,28156,-16760,28139,-16789,28122,-16817,28105,-16846,28087,-16875,28070,-16904,28053,-16932,28036,-16961,28018,-16990,28001,-17018,27983,-17047,27966,-17075,27948,-17104,27931,-17133,27913,-17161,27896,-17190,27878,-17218,27861,-17247,27843,-17275,27825,-17304,27808,-17332,27790,-17361,27772,-17389,27754,-17417,27736,-17446,27719,-17474,27701,-17502,27683,-17531,27665,-17559,27647,-17587,27629,-17616,27611,-17644,27593,-17672,27575,-17700,27557,-17728,27538,-17757,27520,-17785,27502,-17813,27484,-17841,27466,-17869,27447,-17897,27429,-17925,27411,-17953,27392,-17981,27374,-18009,27355,-18037,27337,-18065,27319,-18093,27300,-18121,27281,-18149,27263,-18177,27244,-18205,27226,-18233,27207,-18261,27188,-18288,27170,-18316,27151,-18344,27132,-18372,27113,-18399,27094,-18427,27076,-18455,27057,-18483,27038,-18510,27019,-18538,27000,-18565,26981,-18593,26962,-18621,26943,-18648,26924,-18676,26905,-18703,26885,-18731,26866,-18758,26847,-18786,26828,-18813,26809,-18841,26789,-18868,26770,-18895,26751,-18923,26731,-18950,26712,-18977,26692,-19005,26673,-19032,26654,-19059,26634,-19087,26615,-19114,26595,-19141,26575,-19168,26556,-19195,26536,-19222,26516,-19250,26497,-19277,26477,-19304,26457,-19331,26437,-19358,26418,-19385,26398,-19412,26378,-19439,26358,-19466,26338,-19493,26318,-19520,26298,-19547,26278,-19574,26258,-19600,26238,-19627,26218,-19654,26198,-19681,26178,-19708,26158,-19734,26137,-19761,26117,-19788,26097,-19815,26077,-19841,26056,-19868,26036,-19895,26016,-19921,25995,-19948,25975,-19974,25954,-20001,25934,-20027,25913,-20054,25893,-20080,25872,-20107,25852,-20133,25831,-20160,25811,-20186,25790,-20213,25769,-20239,25749,-20265,25728,-20292,25707,-20318,25686,-20344,25665,-20370,25645,-20397,25624,-20423,25603,-20449,25582,-20475,25561,-20501,25540,-20528,25519,-20554,25498,-20580,25477,-20606,25456,-20632,25435,-20658,25414,-20684,25392,-20710,25371,-20736,25350,-20762,25329,-20788,25307,-20814,25286,-20839,25265,-20865,25243,-20891,25222,-20917,25201,-20943,25179,-20968,25158,-20994,25136,-21020,25115,-21046,25093,-21071,25072,-21097,25050,-21123,25029,-21148,25007,-21174,24985,-21199,24964,-21225,24942,-21250,24920,-21276,24898,-21301,24877,-21327,24855,-21352,24833,-21378,24811,-21403,24789,-21428,24767,-21454,24745,-21479,24723,-21504,24701,-21530,24679,-21555,24657,-21580,24635,-21605,24613,-21630,24591,-21656,24569,-21681,24546,-21706,24524,-21731,24502,-21756,24480,-21781,24457,-21806,24435,-21831,24413,-21856,24390,-21881,24368,-21906,24346,-21931,24323,-21956,24301,-21981,24278,-22005,24256,-22030,24233,-22055,24211,-22080,24188,-22105,24165,-22129,24143,-22154,24120,-22179,24097,-22203,24075,-22228,24052,-22253,24029,-22277,24006,-22302,23984,-22326,23961,-22351,23938,-22375,23915,-22400,23892,-22424,23869,-22449,23846,-22473,23823,-22497,23800,-22522,23777,-22546,23754,-22570,23731,-22595,23708,-22619,23685,-22643,23661,-22667,23638,-22692,23615,-22716,23592,-22740,23569,-22764,23545,-22788,23522,-22812,23499,-22836,23475,-22860,23452,-22884,23428,-22908,23405,-22932,23382,-22956,23358,-22980,23335,-23004,23311,-23028,23287,-23051,23264,-23075,23240,-23099,23217,-23123,23193,-23147,23169,-23170,23146,-23194,23122,-23218,23098,-23241,23074,-23265,23050,-23288,23027,-23312,23003,-23336,22979,-23359,22955,-23383,22931,-23406,22907,-23429,22883,-23453,22859,-23476,22835,-23500,22811,-23523,22787,-23546,22763,-23570,22739,-23593,22715,-23616,22691,-23639,22666,-23662,22642,-23686,22618,-23709,22594,-23732,22569,-23755,22545,-23778,22521,-23801,22496,-23824,22472,-23847,22448,-23870,22423,-23893,22399,-23916,22374,-23939,22350,-23962,22325,-23985,22301,-24007,22276,-24030,22252,-24053,22227,-24076,22202,-24098,22178,-24121,22153,-24144,22128,-24166,22104,-24189,22079,-24212,22054,-24234,22029,-24257,22004,-24279,21980,-24302,21955,-24324,21930,-24347,21905,-24369,21880,-24391,21855,-24414,21830,-24436,21805,-24458,21780,-24481,21755,-24503,21730,-24525,21705,-24547,21680,-24570,21655,-24592,21629,-24614,21604,-24636,21579,-24658,21554,-24680,21529,-24702,21503,-24724,21478,-24746,21453,-24768,21427,-24790,21402,-24812,21377,-24834,21351,-24856,21326,-24878,21300,-24899,21275,-24921,21249,-24943,21224,-24965,21198,-24986,21173,-25008,21147,-25030,21122,-25051,21096,-25073,21070,-25094,21045,-25116,21019,-25137,20993,-25159,20967,-25180,20942,-25202,20916,-25223,20890,-25244,20864,-25266,20838,-25287,20813,-25308,20787,-25330,20761,-25351,20735,-25372,20709,-25393,20683,-25415,20657,-25436,20631,-25457,20605,-25478,20579,-25499,20553,-25520,20527,-25541,20500,-25562,20474,-25583,20448,-25604,20422,-25625,20396,-25646,20369,-25666,20343,-25687,20317,-25708,20291,-25729,20264,-25750,20238,-25770,20212,-25791,20185,-25812,20159,-25832,20132,-25853,20106,-25873,20079,-25894,20053,-25914,20026,-25935,20000,-25955,19973,-25976,19947,-25996,19920,-26017,19894,-26037,19867,-26057,19840,-26078,19814,-26098,19787,-26118,19760,-26138,19733,-26159,19707,-26179,19680,-26199,19653,-26219,19626,-26239,19599,-26259,19573,-26279,19546,-26299,19519,-26319,19492,-26339,19465,-26359,19438,-26379,19411,-26399,19384,-26419,19357,-26438,19330,-26458,19303,-26478,19276,-26498,19249,-26517,19221,-26537,19194,-26557,19167,-26576,19140,-26596,19113,-26616,19086,-26635,19058,-26655,19031,-26674,19004,-26693,18976,-26713,18949,-26732,18922,-26752,18894,-26771,18867,-26790,18840,-26810,18812,-26829,18785,-26848,18757,-26867,18730,-26886,18702,-26906,18675,-26925,18647,-26944,18620,-26963,18592,-26982,18564,-27001,18537,-27020,18509,-27039,18482,-27058,18454,-27077,18426,-27095,18398,-27114,18371,-27133,18343,-27152,18315,-27171,18287,-27189,18260,-27208,18232,-27227,18204,-27245,18176,-27264,18148,-27282,18120,-27301,18092,-27320,18064,-27338,18036,-27356,18008,-27375,17980,-27393,17952,-27412,17924,-27430,17896,-27448,17868,-27467,17840,-27485,17812,-27503,17784,-27521,17756,-27539,17727,-27558,17699,-27576,17671,-27594,17643,-27612,17615,-27630,17586,-27648,17558,-27666,17530,-27684,17501,-27702,17473,-27720,17445,-27737,17416,-27755,17388,-27773,17360,-27791,17331,-27809,17303,-27826,17274,-27844,17246,-27862,17217,-27879,17189,-27897,17160,-27914,17132,-27932,17103,-27949,17074,-27967,17046,-27984,17017,-28002,16989,-28019,16960,-28037,16931,-28054,16903,-28071,16874,-28088,16845,-28106,16816,-28123,16788,-28140,16759,-28157,16730,-28174,16701,-28191,16672,-28209,16643,-28226,16615,-28243,16586,-28260,16557,-28276,16528,-28293,16499,-28310,16470,-28327,16441,-28344,16412,-28361,16383,-28378,16354,-28394,16325,-28411,16296,-28428,16267,-28444,16238,-28461,16209,-28478,16179,-28494,16150,-28511,16121,-28527,16092,-28544,16063,-28560,16034,-28576,16004,-28593,15975,-28609,15946,-28626,15917,-28642,15887,-28658,15858,-28674,15829,-28691,15799,-28707,15770,-28723,15740,-28739,15711,-28755,15682,-28771,15652,-28787,15623,-28803,15593,-28819,15564,-28835,15534,-28851,15505,-28867,15475,-28883,15446,-28898,15416,-28914,15387,-28930,15357,-28946,15327,-28961,15298,-28977,15268,-28993,15238,-29008,15209,-29024,15179,-29039,15149,-29055,15120,-29070,15090,-29086,15060,-29101,15030,-29117,15001,-29132,14971,-29147,14941,-29163,14911,-29178,14881,-29193,14852,-29208,14822,-29223,14792,-29239,14762,-29254,14732,-29269,14702,-29284,14672,-29299,14642,-29314,14612,-29329,14582,-29344,14552,-29359,14522,-29373,14492,-29388,14462,-29403,14432,-29418,14402,-29433,14372,-29447,14342,-29462,14311,-29477,14281,-29491,14251,-29506,14221,-29520,14191,-29535,14160,-29549,14130,-29564,14100,-29578,14070,-29593,14039,-29607,14009,-29622,13979,-29636,13949,-29650,13918,-29664,13888,-29679,13858,-29693,13827,-29707,13797,-29721,13766,-29735,13736,-29749,13706,-29763,13675,-29777,13645,-29791,13614,-29805,13584,-29819,13553,-29833,13523,-29847,13492,-29861,13462,-29874,13431,-29888,13400,-29902,13370,-29916,13339,-29929,13309,-29943,13278,-29956,13247,-29970,13217,-29984,13186,-29997,13155,-30010,13125,-30024,13094,-30037,13063,-30051,13033,-30064,13002,-30077,12971,-30091,12940,-30104,12909,-30117,12879,-30130,12848,-30143,12817,-30157,12786,-30170,12755,-30183,12724,-30196,12694,-30209,12663,-30222,12632,-30235,12601,-30248,12570,-30260,12539,-30273,12508,-30286,12477,-30299,12446,-30312,12415,-30324,12384,-30337,12353,-30350,12322,-30362,12291,-30375,12260,-30387,12229,-30400,12198,-30412,12166,-30425,12135,-30437,12104,-30450,12073,-30462,12042,-30474,12011,-30487,11980,-30499,11948,-30511,11917,-30523,11886,-30536,11855,-30548,11823,-30560,11792,-30572,11761,-30584,11730,-30596,11698,-30608,11667,-30620,11636,-30632,11604,-30644,11573,-30656,11542,-30667,11510,-30679,11479,-30691,11448,-30703,11416,-30714,11385,-30726,11353,-30738,11322,-30749,11290,-30761,11259,-30772,11227,-30784,11196,-30795,11164,-30807,11133,-30818,11101,-30829,11070,-30841,11038,-30852,11007,-30863,10975,-30875,10944,-30886,10912,-30897,10880,-30908,10849,-30919,10817,-30930,10786,-30941,10754,-30952,10722,-30963,10691,-30974,10659,-30985,10627,-30996,10596,-31007,10564,-31018,10532,-31029,10500,-31039,10469,-31050,10437,-31061,10405,-31071,10373,-31082,10342,-31093,10310,-31103,10278,-31114,10246,-31124,10214,-31135,10182,-31145,10151,-31155,10119,-31166,10087,-31176,10055,-31186,10023,-31197,9991,-31207,9959,-31217,9927,-31227,9895,-31237,9863,-31248,9831,-31258,9799,-31268,9767,-31278,9735,-31288,9703,-31298,9671,-31308,9639,-31317,9607,-31327,9575,-31337,9543,-31347,9511,-31357,9479,-31366,9447,-31376,9415,-31386,9383,-31395,9351,-31405,9319,-31414,9287,-31424,9254,-31433,9222,-31443,9190,-31452,9158,-31462,9126,-31471,9094,-31480,9061,-31490,9029,-31499,8997,-31508,8965,-31517,8932,-31526,8900,-31535,8868,-31545,8836,-31554,8803,-31563,8771,-31572,8739,-31581,8707,-31589,8674,-31598,8642,-31607,8610,-31616,8577,-31625,8545,-31634,8513,-31642,8480,-31651,8448,-31660,8415,-31668,8383,-31677,8351,-31685,8318,-31694,8286,-31702,8253,-31711,8221,-31719,8189,-31728,8156,-31736,8124,-31744,8091,-31753,8059,-31761,8026,-31769,7994,-31777,7961,-31786,7929,-31794,7896,-31802,7864,-31810,7831,-31818,7799,-31826,7766,-31834,7733,-31842,7701,-31850,7668,-31857,7636,-31865,7603,-31873,7571,-31881,7538,-31889,7505,-31896,7473,-31904,7440,-31912,7407,-31919,7375,-31927,7342,-31934,7310,-31942,7277,-31949,7244,-31957,7211,-31964,7179,-31971,7146,-31979,7113,-31986,7081,-31993,7048,-32000,7015,-32008,6982,-32015,6950,-32022,6917,-32029,6884,-32036,6851,-32043,6819,-32050,6786,-32057,6753,-32064,6720,-32071,6688,-32078,6655,-32085,6622,-32091,6589,-32098,6556,-32105,6523,-32111,6491,-32118,6458,-32125,6425,-32131,6392,-32138,6359,-32144,6326,-32151,6293,-32157,6261,-32164,6228,-32170,6195,-32177,6162,-32183,6129,-32189,6096,-32195,6063,-32202,6030,-32208,5997,-32214,5964,-32220,5931,-32226,5898,-32232,5865,-32238,5832,-32244,5799,-32250,5766,-32256,5733,-32262,5700,-32268,5667,-32274,5634,-32279,5601,-32285,5568,-32291,5535,-32296,5502,-32302,5469,-32308,5436,-32313,5403,-32319,5370,-32324,5337,-32330,5304,-32335,5271,-32341,5238,-32346,5205,-32351,5172,-32357,5139,-32362,5106,-32367,5072,-32372,5039,-32378,5006,-32383,4973,-32388,4940,-32393,4907,-32398,4874,-32403,4841,-32408,4807,-32413,4774,-32418,4741,-32423,4708,-32427,4675,-32432,4642,-32437,4608,-32442,4575,-32446,4542,-32451,4509,-32456,4476,-32460,4443,-32465,4409,-32469,4376,-32474,4343,-32478,4310,-32483,4276,-32487,4243,-32492,4210,-32496,4177,-32500,4144,-32504,4110,-32509,4077,-32513,4044,-32517,4011,-32521,3977,-32525,3944,-32529,3911,-32533,3877,-32537,3844,-32541,3811,-32545,3778,-32549,3744,-32553,3711,-32557,3678,-32560,3644,-32564,3611,-32568,3578,-32572,3545,-32575,3511,-32579,3478,-32582,3445,-32586,3411,-32589,3378,-32593,3345,-32596,3311,-32600,3278,-32603,3245,-32606,3211,-32610,3178,-32613,3145,-32616,3111,-32619,3078,-32623,3044,-32626,3011,-32629,2978,-32632,2944,-32635,2911,-32638,2878,-32641,2844,-32644,2811,-32647,2777,-32650,2744,-32652,2711,-32655,2677,-32658,2644,-32661,2610,-32663,2577,-32666,2544,-32669,2510,-32671,2477,-32674,2443,-32676,2410,-32679,2377,-32681,2343,-32684,2310,-32686,2276,-32688,2243,-32691,2209,-32693,2176,-32695,2143,-32697,2109,-32700,2076,-32702,2042,-32704,2009,-32706,1975,-32708,1942,-32710,1908,-32712,1875,-32714,1842,-32716,1808,-32718,1775,-32719,1741,-32721,1708,-32723,1674,-32725,1641,-32726,1607,-32728,1574,-32730,1540,-32731,1507,-32733,1473,-32734,1440,-32736,1406,-32737,1373,-32739,1339,-32740,1306,-32741,1273,-32743,1239,-32744,1206,-32745,1172,-32747,1139,-32748,1105,-32749,1072,-32750,1038,-32751,1005,-32752,971,-32753,938,-32754,904,-32755,871,-32756,837,-32757,804,-32758,770,-32758,737,-32759,703,-32760,670,-32761,636,-32761,603,-32762,569,-32763,536,-32763,502,-32764,469,-32764,435,-32765,402,-32765,368,-32765,335,-32766,301,-32766,268,-32766,234,-32767,201,-32767,167,-32767,134,-32767,100,-32767,67,-32767,33,-32767,0,-32767,-34,-32767,-68,-32767,-101,-32767,-135,-32767,-168,-32767,-202,-32767,-235,-32767,-269,-32766,-302,-32766,-336,-32766,-369,-32765,-403,-32765,-436,-32765,-470,-32764,-503,-32764,-537,-32763,-570,-32763,-604,-32762,-637,-32761,-671,-32761,-704,-32760,-738,-32759,-771,-32758,-805,-32758,-838,-32757,-872,-32756,-905,-32755,-939,-32754,-972,-32753,-1006,-32752,-1039,-32751,-1073,-32750,-1106,-32749,-1140,-32748,-1173,-32747,-1207,-32745,-1240,-32744,-1274,-32743,-1307,-32741,-1340,-32740,-1374,-32739,-1407,-32737,-1441,-32736,-1474,-32734,-1508,-32733,-1541,-32731,-1575,-32730,-1608,-32728,-1642,-32726,-1675,-32725,-1709,-32723,-1742,-32721,-1776,-32719,-1809,-32718,-1843,-32716,-1876,-32714,-1909,-32712,-1943,-32710,-1976,-32708,-2010,-32706,-2043,-32704,-2077,-32702,-2110,-32700,-2144,-32697,-2177,-32695,-2210,-32693,-2244,-32691,-2277,-32688,-2311,-32686,-2344,-32684,-2378,-32681,-2411,-32679,-2444,-32676,-2478,-32674,-2511,-32671,-2545,-32669,-2578,-32666,-2611,-32663,-2645,-32661,-2678,-32658,-2712,-32655,-2745,-32652,-2778,-32650,-2812,-32647,-2845,-32644,-2879,-32641,-2912,-32638,-2945,-32635,-2979,-32632,-3012,-32629,-3045,-32626,-3079,-32623,-3112,-32619,-3146,-32616,-3179,-32613,-3212,-32610,-3246,-32606,-3279,-32603,-3312,-32600,-3346,-32596,-3379,-32593,-3412,-32589,-3446,-32586,-3479,-32582,-3512,-32579,-3546,-32575,-3579,-32572,-3612,-32568,-3645,-32564,-3679,-32560,-3712,-32557,-3745,-32553,-3779,-32549,-3812,-32545,-3845,-32541,-3878,-32537,-3912,-32533,-3945,-32529,-3978,-32525,-4012,-32521,-4045,-32517,-4078,-32513,-4111,-32509,-4145,-32504,-4178,-32500,-4211,-32496,-4244,-32492,-4277,-32487,-4311,-32483,-4344,-32478,-4377,-32474,-4410,-32469,-4444,-32465,-4477,-32460,-4510,-32456,-4543,-32451,-4576,-32446,-4609,-32442,-4643,-32437,-4676,-32432,-4709,-32427,-4742,-32423,-4775,-32418,-4808,-32413,-4842,-32408,-4875,-32403,-4908,-32398,-4941,-32393,-4974,-32388,-5007,-32383,-5040,-32378,-5073,-32372,-5107,-32367,-5140,-32362,-5173,-32357,-5206,-32351,-5239,-32346,-5272,-32341,-5305,-32335,-5338,-32330,-5371,-32324,-5404,-32319,-5437,-32313,-5470,-32308,-5503,-32302,-5536,-32296,-5569,-32291,-5602,-32285,-5635,-32279,-5668,-32274,-5701,-32268,-5734,-32262,-5767,-32256,-5800,-32250,-5833,-32244,-5866,-32238,-5899,-32232,-5932,-32226,-5965,-32220,-5998,-32214,-6031,-32208,-6064,-32202,-6097,-32195,-6130,-32189,-6163,-32183,-6196,-32177,-6229,-32170,-6262,-32164,-6294,-32157,-6327,-32151,-6360,-32144,-6393,-32138,-6426,-32131,-6459,-32125,-6492,-32118,-6524,-32111,-6557,-32105,-6590,-32098,-6623,-32091,-6656,-32085,-6689,-32078,-6721,-32071,-6754,-32064,-6787,-32057,-6820,-32050,-6852,-32043,-6885,-32036,-6918,-32029,-6951,-32022,-6983,-32015,-7016,-32008,-7049,-32000,-7082,-31993,-7114,-31986,-7147,-31979,-7180,-31971,-7212,-31964,-7245,-31957,-7278,-31949,-7311,-31942,-7343,-31934,-7376,-31927,-7408,-31919,-7441,-31912,-7474,-31904,-7506,-31896,-7539,-31889,-7572,-31881,-7604,-31873,-7637,-31865,-7669,-31857,-7702,-31850,-7734,-31842,-7767,-31834,-7800,-31826,-7832,-31818,-7865,-31810,-7897,-31802,-7930,-31794,-7962,-31786,-7995,-31777,-8027,-31769,-8060,-31761,-8092,-31753,-8125,-31744,-8157,-31736,-8190,-31728,-8222,-31719,-8254,-31711,-8287,-31702,-8319,-31694,-8352,-31685,-8384,-31677,-8416,-31668,-8449,-31660,-8481,-31651,-8514,-31642,-8546,-31634,-8578,-31625,-8611,-31616,-8643,-31607,-8675,-31598,-8708,-31589,-8740,-31581,-8772,-31572,-8804,-31563,-8837,-31554,-8869,-31545,-8901,-31535,-8933,-31526,-8966,-31517,-8998,-31508,-9030,-31499,-9062,-31490,-9095,-31480,-9127,-31471,-9159,-31462,-9191,-31452,-9223,-31443,-9255,-31433,-9288,-31424,-9320,-31414,-9352,-31405,-9384,-31395,-9416,-31386,-9448,-31376,-9480,-31366,-9512,-31357,-9544,-31347,-9576,-31337,-9608,-31327,-9640,-31317,-9672,-31308,-9704,-31298,-9736,-31288,-9768,-31278,-9800,-31268,-9832,-31258,-9864,-31248,-9896,-31237,-9928,-31227,-9960,-31217,-9992,-31207,-10024,-31197,-10056,-31186,-10088,-31176,-10120,-31166,-10152,-31155,-10183,-31145,-10215,-31135,-10247,-31124,-10279,-31114,-10311,-31103,-10343,-31093,-10374,-31082,-10406,-31071,-10438,-31061,-10470,-31050,-10501,-31039,-10533,-31029,-10565,-31018,-10597,-31007,-10628,-30996,-10660,-30985,-10692,-30974,-10723,-30963,-10755,-30952,-10787,-30941,-10818,-30930,-10850,-30919,-10881,-30908,-10913,-30897,-10945,-30886,-10976,-30875,-11008,-30863,-11039,-30852,-11071,-30841,-11102,-30829,-11134,-30818,-11165,-30807,-11197,-30795,-11228,-30784,-11260,-30772,-11291,-30761,-11323,-30749,-11354,-30738,-11386,-30726,-11417,-30714,-11449,-30703,-11480,-30691,-11511,-30679,-11543,-30667,-11574,-30656,-11605,-30644,-11637,-30632,-11668,-30620,-11699,-30608,-11731,-30596,-11762,-30584,-11793,-30572,-11824,-30560,-11856,-30548,-11887,-30536,-11918,-30523,-11949,-30511,-11981,-30499,-12012,-30487,-12043,-30474,-12074,-30462,-12105,-30450,-12136,-30437,-12167,-30425,-12199,-30412,-12230,-30400,-12261,-30387,-12292,-30375,-12323,-30362,-12354,-30350,-12385,-30337,-12416,-30324,-12447,-30312,-12478,-30299,-12509,-30286,-12540,-30273,-12571,-30260,-12602,-30248,-12633,-30235,-12664,-30222,-12695,-30209,-12725,-30196,-12756,-30183,-12787,-30170,-12818,-30157,-12849,-30143,-12880,-30130,-12910,-30117,-12941,-30104,-12972,-30091,-13003,-30077,-13034,-30064,-13064,-30051,-13095,-30037,-13126,-30024,-13156,-30010,-13187,-29997,-13218,-29984,-13248,-29970,-13279,-29956,-13310,-29943,-13340,-29929,-13371,-29916,-13401,-29902,-13432,-29888,-13463,-29874,-13493,-29861,-13524,-29847,-13554,-29833,-13585,-29819,-13615,-29805,-13646,-29791,-13676,-29777,-13707,-29763,-13737,-29749,-13767,-29735,-13798,-29721,-13828,-29707,-13859,-29693,-13889,-29679,-13919,-29664,-13950,-29650,-13980,-29636,-14010,-29622,-14040,-29607,-14071,-29593,-14101,-29578,-14131,-29564,-14161,-29549,-14192,-29535,-14222,-29520,-14252,-29506,-14282,-29491,-14312,-29477,-14343,-29462,-14373,-29447,-14403,-29433,-14433,-29418,-14463,-29403,-14493,-29388,-14523,-29373,-14553,-29359,-14583,-29344,-14613,-29329,-14643,-29314,-14673,-29299,-14703,-29284,-14733,-29269,-14763,-29254,-14793,-29239,-14823,-29223,-14853,-29208,-14882,-29193,-14912,-29178,-14942,-29163,-14972,-29147,-15002,-29132,-15031,-29117,-15061,-29101,-15091,-29086,-15121,-29070,-15150,-29055,-15180,-29039,-15210,-29024,-15239,-29008,-15269,-28993,-15299,-28977,-15328,-28961,-15358,-28946,-15388,-28930,-15417,-28914,-15447,-28898,-15476,-28883,-15506,-28867,-15535,-28851,-15565,-28835,-15594,-28819,-15624,-28803,-15653,-28787,-15683,-28771,-15712,-28755,-15741,-28739,-15771,-28723,-15800,-28707,-15830,-28691,-15859,-28674,-15888,-28658,-15918,-28642,-15947,-28626,-15976,-28609,-16005,-28593,-16035,-28576,-16064,-28560,-16093,-28544,-16122,-28527,-16151,-28511,-16180,-28494,-16210,-28478,-16239,-28461,-16268,-28444,-16297,-28428,-16326,-28411,-16355,-28394,-16384,-28378,-16413,-28361,-16442,-28344,-16471,-28327,-16500,-28310,-16529,-28293,-16558,-28276,-16587,-28260,-16616,-28243,-16644,-28226,-16673,-28209,-16702,-28191,-16731,-28174,-16760,-28157,-16789,-28140,-16817,-28123,-16846,-28106,-16875,-28088,-16904,-28071,-16932,-28054,-16961,-28037,-16990,-28019,-17018,-28002,-17047,-27984,-17075,-27967,-17104,-27949,-17133,-27932,-17161,-27914,-17190,-27897,-17218,-27879,-17247,-27862,-17275,-27844,-17304,-27826,-17332,-27809,-17361,-27791,-17389,-27773,-17417,-27755,-17446,-27737,-17474,-27720,-17502,-27702,-17531,-27684,-17559,-27666,-17587,-27648,-17616,-27630,-17644,-27612,-17672,-27594,-17700,-27576,-17728,-27558,-17757,-27539,-17785,-27521,-17813,-27503,-17841,-27485,-17869,-27467,-17897,-27448,-17925,-27430,-17953,-27412,-17981,-27393,-18009,-27375,-18037,-27356,-18065,-27338,-18093,-27320,-18121,-27301,-18149,-27282,-18177,-27264,-18205,-27245,-18233,-27227,-18261,-27208,-18288,-27189,-18316,-27171,-18344,-27152,-18372,-27133,-18399,-27114,-18427,-27095,-18455,-27077,-18483,-27058,-18510,-27039,-18538,-27020,-18565,-27001,-18593,-26982,-18621,-26963,-18648,-26944,-18676,-26925,-18703,-26906,-18731,-26886,-18758,-26867,-18786,-26848,-18813,-26829,-18841,-26810,-18868,-26790,-18895,-26771,-18923,-26752,-18950,-26732,-18977,-26713,-19005,-26693,-19032,-26674,-19059,-26655,-19087,-26635,-19114,-26616,-19141,-26596,-19168,-26576,-19195,-26557,-19222,-26537,-19250,-26517,-19277,-26498,-19304,-26478,-19331,-26458,-19358,-26438,-19385,-26419,-19412,-26399,-19439,-26379,-19466,-26359,-19493,-26339,-19520,-26319,-19547,-26299,-19574,-26279,-19600,-26259,-19627,-26239,-19654,-26219,-19681,-26199,-19708,-26179,-19734,-26159,-19761,-26138,-19788,-26118,-19815,-26098,-19841,-26078,-19868,-26057,-19895,-26037,-19921,-26017,-19948,-25996,-19974,-25976,-20001,-25955,-20027,-25935,-20054,-25914,-20080,-25894,-20107,-25873,-20133,-25853,-20160,-25832,-20186,-25812,-20213,-25791,-20239,-25770,-20265,-25750,-20292,-25729,-20318,-25708,-20344,-25687,-20370,-25666,-20397,-25646,-20423,-25625,-20449,-25604,-20475,-25583,-20501,-25562,-20528,-25541,-20554,-25520,-20580,-25499,-20606,-25478,-20632,-25457,-20658,-25436,-20684,-25415,-20710,-25393,-20736,-25372,-20762,-25351,-20788,-25330,-20814,-25308,-20839,-25287,-20865,-25266,-20891,-25244,-20917,-25223,-20943,-25202,-20968,-25180,-20994,-25159,-21020,-25137,-21046,-25116,-21071,-25094,-21097,-25073,-21123,-25051,-21148,-25030,-21174,-25008,-21199,-24986,-21225,-24965,-21250,-24943,-21276,-24921,-21301,-24899,-21327,-24878,-21352,-24856,-21378,-24834,-21403,-24812,-21428,-24790,-21454,-24768,-21479,-24746,-21504,-24724,-21530,-24702,-21555,-24680,-21580,-24658,-21605,-24636,-21630,-24614,-21656,-24592,-21681,-24570,-21706,-24547,-21731,-24525,-21756,-24503,-21781,-24481,-21806,-24458,-21831,-24436,-21856,-24414,-21881,-24391,-21906,-24369,-21931,-24347,-21956,-24324,-21981,-24302,-22005,-24279,-22030,-24257,-22055,-24234,-22080,-24212,-22105,-24189,-22129,-24166,-22154,-24144,-22179,-24121,-22203,-24098,-22228,-24076,-22253,-24053,-22277,-24030,-22302,-24007,-22326,-23985,-22351,-23962,-22375,-23939,-22400,-23916,-22424,-23893,-22449,-23870,-22473,-23847,-22497,-23824,-22522,-23801,-22546,-23778,-22570,-23755,-22595,-23732,-22619,-23709,-22643,-23686,-22667,-23662,-22692,-23639,-22716,-23616,-22740,-23593,-22764,-23570,-22788,-23546,-22812,-23523,-22836,-23500,-22860,-23476,-22884,-23453,-22908,-23429,-22932,-23406,-22956,-23383,-22980,-23359,-23004,-23336,-23028,-23312,-23051,-23288,-23075,-23265,-23099,-23241,-23123,-23218,-23147,-23194,-23170,-23170,-23194,-23147,-23218,-23123,-23241,-23099,-23265,-23075,-23288,-23051,-23312,-23028,-23336,-23004,-23359,-22980,-23383,-22956,-23406,-22932,-23429,-22908,-23453,-22884,-23476,-22860,-23500,-22836,-23523,-22812,-23546,-22788,-23570,-22764,-23593,-22740,-23616,-22716,-23639,-22692,-23662,-22667,-23686,-22643,-23709,-22619,-23732,-22595,-23755,-22570,-23778,-22546,-23801,-22522,-23824,-22497,-23847,-22473,-23870,-22449,-23893,-22424,-23916,-22400,-23939,-22375,-23962,-22351,-23985,-22326,-24007,-22302,-24030,-22277,-24053,-22253,-24076,-22228,-24098,-22203,-24121,-22179,-24144,-22154,-24166,-22129,-24189,-22105,-24212,-22080,-24234,-22055,-24257,-22030,-24279,-22005,-24302,-21981,-24324,-21956,-24347,-21931,-24369,-21906,-24391,-21881,-24414,-21856,-24436,-21831,-24458,-21806,-24481,-21781,-24503,-21756,-24525,-21731,-24547,-21706,-24570,-21681,-24592,-21656,-24614,-21630,-24636,-21605,-24658,-21580,-24680,-21555,-24702,-21530,-24724,-21504,-24746,-21479,-24768,-21454,-24790,-21428,-24812,-21403,-24834,-21378,-24856,-21352,-24878,-21327,-24899,-21301,-24921,-21276,-24943,-21250,-24965,-21225,-24986,-21199,-25008,-21174,-25030,-21148,-25051,-21123,-25073,-21097,-25094,-21071,-25116,-21046,-25137,-21020,-25159,-20994,-25180,-20968,-25202,-20943,-25223,-20917,-25244,-20891,-25266,-20865,-25287,-20839,-25308,-20814,-25330,-20788,-25351,-20762,-25372,-20736,-25393,-20710,-25415,-20684,-25436,-20658,-25457,-20632,-25478,-20606,-25499,-20580,-25520,-20554,-25541,-20528,-25562,-20501,-25583,-20475,-25604,-20449,-25625,-20423,-25646,-20397,-25666,-20370,-25687,-20344,-25708,-20318,-25729,-20292,-25750,-20265,-25770,-20239,-25791,-20213,-25812,-20186,-25832,-20160,-25853,-20133,-25873,-20107,-25894,-20080,-25914,-20054,-25935,-20027,-25955,-20001,-25976,-19974,-25996,-19948,-26017,-19921,-26037,-19895,-26057,-19868,-26078,-19841,-26098,-19815,-26118,-19788,-26138,-19761,-26159,-19734,-26179,-19708,-26199,-19681,-26219,-19654,-26239,-19627,-26259,-19600,-26279,-19574,-26299,-19547,-26319,-19520,-26339,-19493,-26359,-19466,-26379,-19439,-26399,-19412,-26419,-19385,-26438,-19358,-26458,-19331,-26478,-19304,-26498,-19277,-26517,-19250,-26537,-19222,-26557,-19195,-26576,-19168,-26596,-19141,-26616,-19114,-26635,-19087,-26655,-19059,-26674,-19032,-26693,-19005,-26713,-18977,-26732,-18950,-26752,-18923,-26771,-18895,-26790,-18868,-26810,-18841,-26829,-18813,-26848,-18786,-26867,-18758,-26886,-18731,-26906,-18703,-26925,-18676,-26944,-18648,-26963,-18621,-26982,-18593,-27001,-18565,-27020,-18538,-27039,-18510,-27058,-18483,-27077,-18455,-27095,-18427,-27114,-18399,-27133,-18372,-27152,-18344,-27171,-18316,-27189,-18288,-27208,-18261,-27227,-18233,-27245,-18205,-27264,-18177,-27282,-18149,-27301,-18121,-27320,-18093,-27338,-18065,-27356,-18037,-27375,-18009,-27393,-17981,-27412,-17953,-27430,-17925,-27448,-17897,-27467,-17869,-27485,-17841,-27503,-17813,-27521,-17785,-27539,-17757,-27558,-17728,-27576,-17700,-27594,-17672,-27612,-17644,-27630,-17616,-27648,-17587,-27666,-17559,-27684,-17531,-27702,-17502,-27720,-17474,-27737,-17446,-27755,-17417,-27773,-17389,-27791,-17361,-27809,-17332,-27826,-17304,-27844,-17275,-27862,-17247,-27879,-17218,-27897,-17190,-27914,-17161,-27932,-17133,-27949,-17104,-27967,-17075,-27984,-17047,-28002,-17018,-28019,-16990,-28037,-16961,-28054,-16932,-28071,-16904,-28088,-16875,-28106,-16846,-28123,-16817,-28140,-16789,-28157,-16760,-28174,-16731,-28191,-16702,-28209,-16673,-28226,-16644,-28243,-16616,-28260,-16587,-28276,-16558,-28293,-16529,-28310,-16500,-28327,-16471,-28344,-16442,-28361,-16413,-28378,-16384,-28394,-16355,-28411,-16326,-28428,-16297,-28444,-16268,-28461,-16239,-28478,-16210,-28494,-16180,-28511,-16151,-28527,-16122,-28544,-16093,-28560,-16064,-28576,-16035,-28593,-16005,-28609,-15976,-28626,-15947,-28642,-15918,-28658,-15888,-28674,-15859,-28691,-15830,-28707,-15800,-28723,-15771,-28739,-15741,-28755,-15712,-28771,-15683,-28787,-15653,-28803,-15624,-28819,-15594,-28835,-15565,-28851,-15535,-28867,-15506,-28883,-15476,-28898,-15447,-28914,-15417,-28930,-15388,-28946,-15358,-28961,-15328,-28977,-15299,-28993,-15269,-29008,-15239,-29024,-15210,-29039,-15180,-29055,-15150,-29070,-15121,-29086,-15091,-29101,-15061,-29117,-15031,-29132,-15002,-29147,-14972,-29163,-14942,-29178,-14912,-29193,-14882,-29208,-14853,-29223,-14823,-29239,-14793,-29254,-14763,-29269,-14733,-29284,-14703,-29299,-14673,-29314,-14643,-29329,-14613,-29344,-14583,-29359,-14553,-29373,-14523,-29388,-14493,-29403,-14463,-29418,-14433,-29433,-14403,-29447,-14373,-29462,-14343,-29477,-14312,-29491,-14282,-29506,-14252,-29520,-14222,-29535,-14192,-29549,-14161,-29564,-14131,-29578,-14101,-29593,-14071,-29607,-14040,-29622,-14010,-29636,-13980,-29650,-13950,-29664,-13919,-29679,-13889,-29693,-13859,-29707,-13828,-29721,-13798,-29735,-13767,-29749,-13737,-29763,-13707,-29777,-13676,-29791,-13646,-29805,-13615,-29819,-13585,-29833,-13554,-29847,-13524,-29861,-13493,-29874,-13463,-29888,-13432,-29902,-13401,-29916,-13371,-29929,-13340,-29943,-13310,-29956,-13279,-29970,-13248,-29984,-13218,-29997,-13187,-30010,-13156,-30024,-13126,-30037,-13095,-30051,-13064,-30064,-13034,-30077,-13003,-30091,-12972,-30104,-12941,-30117,-12910,-30130,-12880,-30143,-12849,-30157,-12818,-30170,-12787,-30183,-12756,-30196,-12725,-30209,-12695,-30222,-12664,-30235,-12633,-30248,-12602,-30260,-12571,-30273,-12540,-30286,-12509,-30299,-12478,-30312,-12447,-30324,-12416,-30337,-12385,-30350,-12354,-30362,-12323,-30375,-12292,-30387,-12261,-30400,-12230,-30412,-12199,-30425,-12167,-30437,-12136,-30450,-12105,-30462,-12074,-30474,-12043,-30487,-12012,-30499,-11981,-30511,-11949,-30523,-11918,-30536,-11887,-30548,-11856,-30560,-11824,-30572,-11793,-30584,-11762,-30596,-11731,-30608,-11699,-30620,-11668,-30632,-11637,-30644,-11605,-30656,-11574,-30667,-11543,-30679,-11511,-30691,-11480,-30703,-11449,-30714,-11417,-30726,-11386,-30738,-11354,-30749,-11323,-30761,-11291,-30772,-11260,-30784,-11228,-30795,-11197,-30807,-11165,-30818,-11134,-30829,-11102,-30841,-11071,-30852,-11039,-30863,-11008,-30875,-10976,-30886,-10945,-30897,-10913,-30908,-10881,-30919,-10850,-30930,-10818,-30941,-10787,-30952,-10755,-30963,-10723,-30974,-10692,-30985,-10660,-30996,-10628,-31007,-10597,-31018,-10565,-31029,-10533,-31039,-10501,-31050,-10470,-31061,-10438,-31071,-10406,-31082,-10374,-31093,-10343,-31103,-10311,-31114,-10279,-31124,-10247,-31135,-10215,-31145,-10183,-31155,-10152,-31166,-10120,-31176,-10088,-31186,-10056,-31197,-10024,-31207,-9992,-31217,-9960,-31227,-9928,-31237,-9896,-31248,-9864,-31258,-9832,-31268,-9800,-31278,-9768,-31288,-9736,-31298,-9704,-31308,-9672,-31317,-9640,-31327,-9608,-31337,-9576,-31347,-9544,-31357,-9512,-31366,-9480,-31376,-9448,-31386,-9416,-31395,-9384,-31405,-9352,-31414,-9320,-31424,-9288,-31433,-9255,-31443,-9223,-31452,-9191,-31462,-9159,-31471,-9127,-31480,-9095,-31490,-9062,-31499,-9030,-31508,-8998,-31517,-8966,-31526,-8933,-31535,-8901,-31545,-8869,-31554,-8837,-31563,-8804,-31572,-8772,-31581,-8740,-31589,-8708,-31598,-8675,-31607,-8643,-31616,-8611,-31625,-8578,-31634,-8546,-31642,-8514,-31651,-8481,-31660,-8449,-31668,-8416,-31677,-8384,-31685,-8352,-31694,-8319,-31702,-8287,-31711,-8254,-31719,-8222,-31728,-8190,-31736,-8157,-31744,-8125,-31753,-8092,-31761,-8060,-31769,-8027,-31777,-7995,-31786,-7962,-31794,-7930,-31802,-7897,-31810,-7865,-31818,-7832,-31826,-7800,-31834,-7767,-31842,-7734,-31850,-7702,-31857,-7669,-31865,-7637,-31873,-7604,-31881,-7572,-31889,-7539,-31896,-7506,-31904,-7474,-31912,-7441,-31919,-7408,-31927,-7376,-31934,-7343,-31942,-7311,-31949,-7278,-31957,-7245,-31964,-7212,-31971,-7180,-31979,-7147,-31986,-7114,-31993,-7082,-32000,-7049,-32008,-7016,-32015,-6983,-32022,-6951,-32029,-6918,-32036,-6885,-32043,-6852,-32050,-6820,-32057,-6787,-32064,-6754,-32071,-6721,-32078,-6689,-32085,-6656,-32091,-6623,-32098,-6590,-32105,-6557,-32111,-6524,-32118,-6492,-32125,-6459,-32131,-6426,-32138,-6393,-32144,-6360,-32151,-6327,-32157,-6294,-32164,-6262,-32170,-6229,-32177,-6196,-32183,-6163,-32189,-6130,-32195,-6097,-32202,-6064,-32208,-6031,-32214,-5998,-32220,-5965,-32226,-5932,-32232,-5899,-32238,-5866,-32244,-5833,-32250,-5800,-32256,-5767,-32262,-5734,-32268,-5701,-32274,-5668,-32279,-5635,-32285,-5602,-32291,-5569,-32296,-5536,-32302,-5503,-32308,-5470,-32313,-5437,-32319,-5404,-32324,-5371,-32330,-5338,-32335,-5305,-32341,-5272,-32346,-5239,-32351,-5206,-32357,-5173,-32362,-5140,-32367,-5107,-32372,-5073,-32378,-5040,-32383,-5007,-32388,-4974,-32393,-4941,-32398,-4908,-32403,-4875,-32408,-4842,-32413,-4808,-32418,-4775,-32423,-4742,-32427,-4709,-32432,-4676,-32437,-4643,-32442,-4609,-32446,-4576,-32451,-4543,-32456,-4510,-32460,-4477,-32465,-4444,-32469,-4410,-32474,-4377,-32478,-4344,-32483,-4311,-32487,-4277,-32492,-4244,-32496,-4211,-32500,-4178,-32504,-4145,-32509,-4111,-32513,-4078,-32517,-4045,-32521,-4012,-32525,-3978,-32529,-3945,-32533,-3912,-32537,-3878,-32541,-3845,-32545,-3812,-32549,-3779,-32553,-3745,-32557,-3712,-32560,-3679,-32564,-3645,-32568,-3612,-32572,-3579,-32575,-3546,-32579,-3512,-32582,-3479,-32586,-3446,-32589,-3412,-32593,-3379,-32596,-3346,-32600,-3312,-32603,-3279,-32606,-3246,-32610,-3212,-32613,-3179,-32616,-3146,-32619,-3112,-32623,-3079,-32626,-3045,-32629,-3012,-32632,-2979,-32635,-2945,-32638,-2912,-32641,-2879,-32644,-2845,-32647,-2812,-32650,-2778,-32652,-2745,-32655,-2712,-32658,-2678,-32661,-2645,-32663,-2611,-32666,-2578,-32669,-2545,-32671,-2511,-32674,-2478,-32676,-2444,-32679,-2411,-32681,-2378,-32684,-2344,-32686,-2311,-32688,-2277,-32691,-2244,-32693,-2210,-32695,-2177,-32697,-2144,-32700,-2110,-32702,-2077,-32704,-2043,-32706,-2010,-32708,-1976,-32710,-1943,-32712,-1909,-32714,-1876,-32716,-1843,-32718,-1809,-32719,-1776,-32721,-1742,-32723,-1709,-32725,-1675,-32726,-1642,-32728,-1608,-32730,-1575,-32731,-1541,-32733,-1508,-32734,-1474,-32736,-1441,-32737,-1407,-32739,-1374,-32740,-1340,-32741,-1307,-32743,-1274,-32744,-1240,-32745,-1207,-32747,-1173,-32748,-1140,-32749,-1106,-32750,-1073,-32751,-1039,-32752,-1006,-32753,-972,-32754,-939,-32755,-905,-32756,-872,-32757,-838,-32758,-805,-32758,-771,-32759,-738,-32760,-704,-32761,-671,-32761,-637,-32762,-604,-32763,-570,-32763,-537,-32764,-503,-32764,-470,-32765,-436,-32765,-403,-32765,-369,-32766,-336,-32766,-302,-32766,-269,-32767,-235,-32767,-202,-32767,-168,-32767,-135,-32767,-101,-32767,-68,-32767,-34,-32767,-1,-32767,33,-32767,67,-32767,100,-32767,134,-32767,167,-32767,201,-32767,234,-32766,268,-32766,301,-32766,335,-32765,368,-32765,402,-32765,435,-32764,469,-32764,502,-32763,536,-32763,569,-32762,603,-32761,636,-32761,670,-32760,703,-32759,737,-32758,770,-32758,804,-32757,837,-32756,871,-32755,904,-32754,938,-32753,971,-32752,1005,-32751,1038,-32750,1072,-32749,1105,-32748,1139,-32747,1172,-32745,1206,-32744,1239,-32743,1273,-32741,1306,-32740,1339,-32739,1373,-32737,1406,-32736,1440,-32734,1473,-32733,1507,-32731,1540,-32730,1574,-32728,1607,-32726,1641,-32725,1674,-32723,1708,-32721,1741,-32719,1775,-32718,1808,-32716,1842,-32714,1875,-32712,1908,-32710,1942,-32708,1975,-32706,2009,-32704,2042,-32702,2076,-32700,2109,-32697,2143,-32695,2176,-32693,2209,-32691,2243,-32688,2276,-32686,2310,-32684,2343,-32681,2377,-32679,2410,-32676,2443,-32674,2477,-32671,2510,-32669,2544,-32666,2577,-32663,2610,-32661,2644,-32658,2677,-32655,2711,-32652,2744,-32650,2777,-32647,2811,-32644,2844,-32641,2878,-32638,2911,-32635,2944,-32632,2978,-32629,3011,-32626,3044,-32623,3078,-32619,3111,-32616,3145,-32613,3178,-32610,3211,-32606,3245,-32603,3278,-32600,3311,-32596,3345,-32593,3378,-32589,3411,-32586,3445,-32582,3478,-32579,3511,-32575,3545,-32572,3578,-32568,3611,-32564,3644,-32560,3678,-32557,3711,-32553,3744,-32549,3778,-32545,3811,-32541,3844,-32537,3877,-32533,3911,-32529,3944,-32525,3977,-32521,4011,-32517,4044,-32513,4077,-32509,4110,-32504,4144,-32500,4177,-32496,4210,-32492,4243,-32487,4276,-32483,4310,-32478,4343,-32474,4376,-32469,4409,-32465,4443,-32460,4476,-32456,4509,-32451,4542,-32446,4575,-32442,4608,-32437,4642,-32432,4675,-32427,4708,-32423,4741,-32418,4774,-32413,4807,-32408,4841,-32403,4874,-32398,4907,-32393,4940,-32388,4973,-32383,5006,-32378,5039,-32372,5072,-32367,5106,-32362,5139,-32357,5172,-32351,5205,-32346,5238,-32341,5271,-32335,5304,-32330,5337,-32324,5370,-32319,5403,-32313,5436,-32308,5469,-32302,5502,-32296,5535,-32291,5568,-32285,5601,-32279,5634,-32274,5667,-32268,5700,-32262,5733,-32256,5766,-32250,5799,-32244,5832,-32238,5865,-32232,5898,-32226,5931,-32220,5964,-32214,5997,-32208,6030,-32202,6063,-32195,6096,-32189,6129,-32183,6162,-32177,6195,-32170,6228,-32164,6261,-32157,6293,-32151,6326,-32144,6359,-32138,6392,-32131,6425,-32125,6458,-32118,6491,-32111,6523,-32105,6556,-32098,6589,-32091,6622,-32085,6655,-32078,6688,-32071,6720,-32064,6753,-32057,6786,-32050,6819,-32043,6851,-32036,6884,-32029,6917,-32022,6950,-32015,6982,-32008,7015,-32000,7048,-31993,7081,-31986,7113,-31979,7146,-31971,7179,-31964,7211,-31957,7244,-31949,7277,-31942,7310,-31934,7342,-31927,7375,-31919,7407,-31912,7440,-31904,7473,-31896,7505,-31889,7538,-31881,7571,-31873,7603,-31865,7636,-31857,7668,-31850,7701,-31842,7733,-31834,7766,-31826,7799,-31818,7831,-31810,7864,-31802,7896,-31794,7929,-31786,7961,-31777,7994,-31769,8026,-31761,8059,-31753,8091,-31744,8124,-31736,8156,-31728,8189,-31719,8221,-31711,8253,-31702,8286,-31694,8318,-31685,8351,-31677,8383,-31668,8415,-31660,8448,-31651,8480,-31642,8513,-31634,8545,-31625,8577,-31616,8610,-31607,8642,-31598,8674,-31589,8707,-31581,8739,-31572,8771,-31563,8803,-31554,8836,-31545,8868,-31535,8900,-31526,8932,-31517,8965,-31508,8997,-31499,9029,-31490,9061,-31480,9094,-31471,9126,-31462,9158,-31452,9190,-31443,9222,-31433,9254,-31424,9287,-31414,9319,-31405,9351,-31395,9383,-31386,9415,-31376,9447,-31366,9479,-31357,9511,-31347,9543,-31337,9575,-31327,9607,-31317,9639,-31308,9671,-31298,9703,-31288,9735,-31278,9767,-31268,9799,-31258,9831,-31248,9863,-31237,9895,-31227,9927,-31217,9959,-31207,9991,-31197,10023,-31186,10055,-31176,10087,-31166,10119,-31155,10151,-31145,10182,-31135,10214,-31124,10246,-31114,10278,-31103,10310,-31093,10342,-31082,10373,-31071,10405,-31061,10437,-31050,10469,-31039,10500,-31029,10532,-31018,10564,-31007,10596,-30996,10627,-30985,10659,-30974,10691,-30963,10722,-30952,10754,-30941,10786,-30930,10817,-30919,10849,-30908,10880,-30897,10912,-30886,10944,-30875,10975,-30863,11007,-30852,11038,-30841,11070,-30829,11101,-30818,11133,-30807,11164,-30795,11196,-30784,11227,-30772,11259,-30761,11290,-30749,11322,-30738,11353,-30726,11385,-30714,11416,-30703,11448,-30691,11479,-30679,11510,-30667,11542,-30656,11573,-30644,11604,-30632,11636,-30620,11667,-30608,11698,-30596,11730,-30584,11761,-30572,11792,-30560,11823,-30548,11855,-30536,11886,-30523,11917,-30511,11948,-30499,11980,-30487,12011,-30474,12042,-30462,12073,-30450,12104,-30437,12135,-30425,12166,-30412,12198,-30400,12229,-30387,12260,-30375,12291,-30362,12322,-30350,12353,-30337,12384,-30324,12415,-30312,12446,-30299,12477,-30286,12508,-30273,12539,-30260,12570,-30248,12601,-30235,12632,-30222,12663,-30209,12694,-30196,12724,-30183,12755,-30170,12786,-30157,12817,-30143,12848,-30130,12879,-30117,12909,-30104,12940,-30091,12971,-30077,13002,-30064,13033,-30051,13063,-30037,13094,-30024,13125,-30010,13155,-29997,13186,-29984,13217,-29970,13247,-29956,13278,-29943,13309,-29929,13339,-29916,13370,-29902,13400,-29888,13431,-29874,13462,-29861,13492,-29847,13523,-29833,13553,-29819,13584,-29805,13614,-29791,13645,-29777,13675,-29763,13706,-29749,13736,-29735,13766,-29721,13797,-29707,13827,-29693,13858,-29679,13888,-29664,13918,-29650,13949,-29636,13979,-29622,14009,-29607,14039,-29593,14070,-29578,14100,-29564,14130,-29549,14160,-29535,14191,-29520,14221,-29506,14251,-29491,14281,-29477,14311,-29462,14342,-29447,14372,-29433,14402,-29418,14432,-29403,14462,-29388,14492,-29373,14522,-29359,14552,-29344,14582,-29329,14612,-29314,14642,-29299,14672,-29284,14702,-29269,14732,-29254,14762,-29239,14792,-29223,14822,-29208,14852,-29193,14881,-29178,14911,-29163,14941,-29147,14971,-29132,15001,-29117,15030,-29101,15060,-29086,15090,-29070,15120,-29055,15149,-29039,15179,-29024,15209,-29008,15238,-28993,15268,-28977,15298,-28961,15327,-28946,15357,-28930,15387,-28914,15416,-28898,15446,-28883,15475,-28867,15505,-28851,15534,-28835,15564,-28819,15593,-28803,15623,-28787,15652,-28771,15682,-28755,15711,-28739,15740,-28723,15770,-28707,15799,-28691,15829,-28674,15858,-28658,15887,-28642,15917,-28626,15946,-28609,15975,-28593,16004,-28576,16034,-28560,16063,-28544,16092,-28527,16121,-28511,16150,-28494,16179,-28478,16209,-28461,16238,-28444,16267,-28428,16296,-28411,16325,-28394,16354,-28378,16383,-28361,16412,-28344,16441,-28327,16470,-28310,16499,-28293,16528,-28276,16557,-28260,16586,-28243,16615,-28226,16643,-28209,16672,-28191,16701,-28174,16730,-28157,16759,-28140,16788,-28123,16816,-28106,16845,-28088,16874,-28071,16903,-28054,16931,-28037,16960,-28019,16989,-28002,17017,-27984,17046,-27967,17074,-27949,17103,-27932,17132,-27914,17160,-27897,17189,-27879,17217,-27862,17246,-27844,17274,-27826,17303,-27809,17331,-27791,17360,-27773,17388,-27755,17416,-27737,17445,-27720,17473,-27702,17501,-27684,17530,-27666,17558,-27648,17586,-27630,17615,-27612,17643,-27594,17671,-27576,17699,-27558,17727,-27539,17756,-27521,17784,-27503,17812,-27485,17840,-27467,17868,-27448,17896,-27430,17924,-27412,17952,-27393,17980,-27375,18008,-27356,18036,-27338,18064,-27320,18092,-27301,18120,-27282,18148,-27264,18176,-27245,18204,-27227,18232,-27208,18260,-27189,18287,-27171,18315,-27152,18343,-27133,18371,-27114,18398,-27095,18426,-27077,18454,-27058,18482,-27039,18509,-27020,18537,-27001,18564,-26982,18592,-26963,18620,-26944,18647,-26925,18675,-26906,18702,-26886,18730,-26867,18757,-26848,18785,-26829,18812,-26810,18840,-26790,18867,-26771,18894,-26752,18922,-26732,18949,-26713,18976,-26693,19004,-26674,19031,-26655,19058,-26635,19086,-26616,19113,-26596,19140,-26576,19167,-26557,19194,-26537,19221,-26517,19249,-26498,19276,-26478,19303,-26458,19330,-26438,19357,-26419,19384,-26399,19411,-26379,19438,-26359,19465,-26339,19492,-26319,19519,-26299,19546,-26279,19573,-26259,19599,-26239,19626,-26219,19653,-26199,19680,-26179,19707,-26159,19733,-26138,19760,-26118,19787,-26098,19814,-26078,19840,-26057,19867,-26037,19894,-26017,19920,-25996,19947,-25976,19973,-25955,20000,-25935,20026,-25914,20053,-25894,20079,-25873,20106,-25853,20132,-25832,20159,-25812,20185,-25791,20212,-25770,20238,-25750,20264,-25729,20291,-25708,20317,-25687,20343,-25666,20369,-25646,20396,-25625,20422,-25604,20448,-25583,20474,-25562,20500,-25541,20527,-25520,20553,-25499,20579,-25478,20605,-25457,20631,-25436,20657,-25415,20683,-25393,20709,-25372,20735,-25351,20761,-25330,20787,-25308,20813,-25287,20838,-25266,20864,-25244,20890,-25223,20916,-25202,20942,-25180,20967,-25159,20993,-25137,21019,-25116,21045,-25094,21070,-25073,21096,-25051,21122,-25030,21147,-25008,21173,-24986,21198,-24965,21224,-24943,21249,-24921,21275,-24899,21300,-24878,21326,-24856,21351,-24834,21377,-24812,21402,-24790,21427,-24768,21453,-24746,21478,-24724,21503,-24702,21529,-24680,21554,-24658,21579,-24636,21604,-24614,21629,-24592,21655,-24570,21680,-24547,21705,-24525,21730,-24503,21755,-24481,21780,-24458,21805,-24436,21830,-24414,21855,-24391,21880,-24369,21905,-24347,21930,-24324,21955,-24302,21980,-24279,22004,-24257,22029,-24234,22054,-24212,22079,-24189,22104,-24166,22128,-24144,22153,-24121,22178,-24098,22202,-24076,22227,-24053,22252,-24030,22276,-24007,22301,-23985,22325,-23962,22350,-23939,22374,-23916,22399,-23893,22423,-23870,22448,-23847,22472,-23824,22496,-23801,22521,-23778,22545,-23755,22569,-23732,22594,-23709,22618,-23686,22642,-23662,22666,-23639,22691,-23616,22715,-23593,22739,-23570,22763,-23546,22787,-23523,22811,-23500,22835,-23476,22859,-23453,22883,-23429,22907,-23406,22931,-23383,22955,-23359,22979,-23336,23003,-23312,23027,-23288,23050,-23265,23074,-23241,23098,-23218,23122,-23194,23146,-23170,23169,-23147,23193,-23123,23217,-23099,23240,-23075,23264,-23051,23287,-23028,23311,-23004,23335,-22980,23358,-22956,23382,-22932,23405,-22908,23428,-22884,23452,-22860,23475,-22836,23499,-22812,23522,-22788,23545,-22764,23569,-22740,23592,-22716,23615,-22692,23638,-22667,23661,-22643,23685,-22619,23708,-22595,23731,-22570,23754,-22546,23777,-22522,23800,-22497,23823,-22473,23846,-22449,23869,-22424,23892,-22400,23915,-22375,23938,-22351,23961,-22326,23984,-22302,24006,-22277,24029,-22253,24052,-22228,24075,-22203,24097,-22179,24120,-22154,24143,-22129,24165,-22105,24188,-22080,24211,-22055,24233,-22030,24256,-22005,24278,-21981,24301,-21956,24323,-21931,24346,-21906,24368,-21881,24390,-21856,24413,-21831,24435,-21806,24457,-21781,24480,-21756,24502,-21731,24524,-21706,24546,-21681,24569,-21656,24591,-21630,24613,-21605,24635,-21580,24657,-21555,24679,-21530,24701,-21504,24723,-21479,24745,-21454,24767,-21428,24789,-21403,24811,-21378,24833,-21352,24855,-21327,24877,-21301,24898,-21276,24920,-21250,24942,-21225,24964,-21199,24985,-21174,25007,-21148,25029,-21123,25050,-21097,25072,-21071,25093,-21046,25115,-21020,25136,-20994,25158,-20968,25179,-20943,25201,-20917,25222,-20891,25243,-20865,25265,-20839,25286,-20814,25307,-20788,25329,-20762,25350,-20736,25371,-20710,25392,-20684,25414,-20658,25435,-20632,25456,-20606,25477,-20580,25498,-20554,25519,-20528,25540,-20501,25561,-20475,25582,-20449,25603,-20423,25624,-20397,25645,-20370,25665,-20344,25686,-20318,25707,-20292,25728,-20265,25749,-20239,25769,-20213,25790,-20186,25811,-20160,25831,-20133,25852,-20107,25872,-20080,25893,-20054,25913,-20027,25934,-20001,25954,-19974,25975,-19948,25995,-19921,26016,-19895,26036,-19868,26056,-19841,26077,-19815,26097,-19788,26117,-19761,26137,-19734,26158,-19708,26178,-19681,26198,-19654,26218,-19627,26238,-19600,26258,-19574,26278,-19547,26298,-19520,26318,-19493,26338,-19466,26358,-19439,26378,-19412,26398,-19385,26418,-19358,26437,-19331,26457,-19304,26477,-19277,26497,-19250,26516,-19222,26536,-19195,26556,-19168,26575,-19141,26595,-19114,26615,-19087,26634,-19059,26654,-19032,26673,-19005,26692,-18977,26712,-18950,26731,-18923,26751,-18895,26770,-18868,26789,-18841,26809,-18813,26828,-18786,26847,-18758,26866,-18731,26885,-18703,26905,-18676,26924,-18648,26943,-18621,26962,-18593,26981,-18565,27000,-18538,27019,-18510,27038,-18483,27057,-18455,27076,-18427,27094,-18399,27113,-18372,27132,-18344,27151,-18316,27170,-18288,27188,-18261,27207,-18233,27226,-18205,27244,-18177,27263,-18149,27281,-18121,27300,-18093,27319,-18065,27337,-18037,27355,-18009,27374,-17981,27392,-17953,27411,-17925,27429,-17897,27447,-17869,27466,-17841,27484,-17813,27502,-17785,27520,-17757,27538,-17728,27557,-17700,27575,-17672,27593,-17644,27611,-17616,27629,-17587,27647,-17559,27665,-17531,27683,-17502,27701,-17474,27719,-17446,27736,-17417,27754,-17389,27772,-17361,27790,-17332,27808,-17304,27825,-17275,27843,-17247,27861,-17218,27878,-17190,27896,-17161,27913,-17133,27931,-17104,27948,-17075,27966,-17047,27983,-17018,28001,-16990,28018,-16961,28036,-16932,28053,-16904,28070,-16875,28087,-16846,28105,-16817,28122,-16789,28139,-16760,28156,-16731,28173,-16702,28190,-16673,28208,-16644,28225,-16616,28242,-16587,28259,-16558,28275,-16529,28292,-16500,28309,-16471,28326,-16442,28343,-16413,28360}; diff --git a/openair1/PHY/TOOLS/twiddle1536.h b/openair1/PHY/TOOLS/twiddle1536.h index b74534aabf..304766caaf 100644 --- a/openair1/PHY/TOOLS/twiddle1536.h +++ b/openair1/PHY/TOOLS/twiddle1536.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include /* Twiddles generated with diff --git a/openair1/PHY/TOOLS/twiddle18432.h b/openair1/PHY/TOOLS/twiddle18432.h new file mode 100644 index 0000000000..696c7f37ae --- /dev/null +++ b/openair1/PHY/TOOLS/twiddle18432.h @@ -0,0 +1,35 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/* Twiddles generated with +twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:6143)/18432)); +twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:12286)/18432)); +twa2 = zeros(1,12288); +twb2 = zeros(1,12288); +twa2(1:2:end) = real(twa); +twa2(2:2:end) = imag(twa); +twb2(1:2:end) = real(twb); +twb2(2:2:end) = imag(twb); +*/ + +int16_t twa18432[12288] = {32767,0,32766,-12,32766,-23,32766,-34,32766,-45,32766,-56,32766,-68,32766,-79,32766,-90,32766,-101,32766,-112,32766,-123,32766,-135,32766,-146,32766,-157,32766,-168,32766,-179,32766,-190,32766,-202,32766,-213,32766,-224,32766,-235,32766,-246,32765,-257,32765,-269,32765,-280,32765,-291,32765,-302,32765,-313,32765,-324,32765,-336,32765,-347,32765,-358,32764,-369,32764,-380,32764,-391,32764,-403,32764,-414,32764,-425,32764,-436,32763,-447,32763,-458,32763,-470,32763,-481,32763,-492,32763,-503,32762,-514,32762,-525,32762,-537,32762,-548,32762,-559,32762,-570,32761,-581,32761,-592,32761,-604,32761,-615,32761,-626,32760,-637,32760,-648,32760,-659,32760,-671,32759,-682,32759,-693,32759,-704,32759,-715,32758,-726,32758,-738,32758,-749,32758,-760,32757,-771,32757,-782,32757,-793,32757,-805,32756,-816,32756,-827,32756,-838,32756,-849,32755,-860,32755,-872,32755,-883,32754,-894,32754,-905,32754,-916,32753,-927,32753,-939,32753,-950,32752,-961,32752,-972,32752,-983,32751,-994,32751,-1006,32751,-1017,32750,-1028,32750,-1039,32750,-1050,32749,-1061,32749,-1073,32749,-1084,32748,-1095,32748,-1106,32747,-1117,32747,-1128,32747,-1140,32746,-1151,32746,-1162,32746,-1173,32745,-1184,32745,-1195,32744,-1207,32744,-1218,32743,-1229,32743,-1240,32743,-1251,32742,-1262,32742,-1274,32741,-1285,32741,-1296,32740,-1307,32740,-1318,32740,-1329,32739,-1340,32739,-1352,32738,-1363,32738,-1374,32737,-1385,32737,-1396,32736,-1407,32736,-1419,32735,-1430,32735,-1441,32734,-1452,32734,-1463,32733,-1474,32733,-1486,32732,-1497,32732,-1508,32731,-1519,32731,-1530,32730,-1541,32730,-1553,32729,-1564,32729,-1575,32728,-1586,32728,-1597,32727,-1608,32726,-1619,32726,-1631,32725,-1642,32725,-1653,32724,-1664,32724,-1675,32723,-1686,32723,-1698,32722,-1709,32721,-1720,32721,-1731,32720,-1742,32720,-1753,32719,-1764,32718,-1776,32718,-1787,32717,-1798,32717,-1809,32716,-1820,32715,-1831,32715,-1843,32714,-1854,32713,-1865,32713,-1876,32712,-1887,32711,-1898,32711,-1909,32710,-1921,32710,-1932,32709,-1943,32708,-1954,32708,-1965,32707,-1976,32706,-1987,32706,-1999,32705,-2010,32704,-2021,32703,-2032,32703,-2043,32702,-2054,32701,-2066,32701,-2077,32700,-2088,32699,-2099,32699,-2110,32698,-2121,32697,-2132,32696,-2144,32696,-2155,32695,-2166,32694,-2177,32693,-2188,32693,-2199,32692,-2210,32691,-2222,32690,-2233,32690,-2244,32689,-2255,32688,-2266,32687,-2277,32687,-2288,32686,-2300,32685,-2311,32684,-2322,32683,-2333,32683,-2344,32682,-2355,32681,-2366,32680,-2378,32679,-2389,32679,-2400,32678,-2411,32677,-2422,32676,-2433,32675,-2444,32674,-2456,32674,-2467,32673,-2478,32672,-2489,32671,-2500,32670,-2511,32669,-2522,32668,-2534,32668,-2545,32667,-2556,32666,-2567,32665,-2578,32664,-2589,32663,-2600,32662,-2611,32661,-2623,32661,-2634,32660,-2645,32659,-2656,32658,-2667,32657,-2678,32656,-2689,32655,-2701,32654,-2712,32653,-2723,32652,-2734,32651,-2745,32650,-2756,32649,-2767,32649,-2778,32648,-2790,32647,-2801,32646,-2812,32645,-2823,32644,-2834,32643,-2845,32642,-2856,32641,-2867,32640,-2879,32639,-2890,32638,-2901,32637,-2912,32636,-2923,32635,-2934,32634,-2945,32633,-2956,32632,-2968,32631,-2979,32630,-2990,32629,-3001,32628,-3012,32627,-3023,32626,-3034,32625,-3045,32624,-3057,32623,-3068,32622,-3079,32621,-3090,32619,-3101,32618,-3112,32617,-3123,32616,-3134,32615,-3146,32614,-3157,32613,-3168,32612,-3179,32611,-3190,32610,-3201,32609,-3212,32608,-3223,32607,-3234,32605,-3246,32604,-3257,32603,-3268,32602,-3279,32601,-3290,32600,-3301,32599,-3312,32598,-3323,32596,-3334,32595,-3346,32594,-3357,32593,-3368,32592,-3379,32591,-3390,32590,-3401,32588,-3412,32587,-3423,32586,-3434,32585,-3446,32584,-3457,32583,-3468,32581,-3479,32580,-3490,32579,-3501,32578,-3512,32577,-3523,32575,-3534,32574,-3546,32573,-3557,32572,-3568,32571,-3579,32569,-3590,32568,-3601,32567,-3612,32566,-3623,32564,-3634,32563,-3645,32562,-3657,32561,-3668,32559,-3679,32558,-3690,32557,-3701,32556,-3712,32554,-3723,32553,-3734,32552,-3745,32551,-3756,32549,-3768,32548,-3779,32547,-3790,32545,-3801,32544,-3812,32543,-3823,32541,-3834,32540,-3845,32539,-3856,32538,-3867,32536,-3878,32535,-3890,32534,-3901,32532,-3912,32531,-3923,32530,-3934,32528,-3945,32527,-3956,32526,-3967,32524,-3978,32523,-3989,32521,-4000,32520,-4012,32519,-4023,32517,-4034,32516,-4045,32515,-4056,32513,-4067,32512,-4078,32510,-4089,32509,-4100,32508,-4111,32506,-4122,32505,-4133,32503,-4145,32502,-4156,32501,-4167,32499,-4178,32498,-4189,32496,-4200,32495,-4211,32493,-4222,32492,-4233,32491,-4244,32489,-4255,32488,-4266,32486,-4277,32485,-4289,32483,-4300,32482,-4311,32480,-4322,32479,-4333,32477,-4344,32476,-4355,32474,-4366,32473,-4377,32471,-4388,32470,-4399,32468,-4410,32467,-4421,32465,-4432,32464,-4444,32462,-4455,32461,-4466,32459,-4477,32458,-4488,32456,-4499,32455,-4510,32453,-4521,32452,-4532,32450,-4543,32449,-4554,32447,-4565,32445,-4576,32444,-4587,32442,-4598,32441,-4609,32439,-4621,32438,-4632,32436,-4643,32434,-4654,32433,-4665,32431,-4676,32430,-4687,32428,-4698,32426,-4709,32425,-4720,32423,-4731,32422,-4742,32420,-4753,32418,-4764,32417,-4775,32415,-4786,32413,-4797,32412,-4808,32410,-4819,32409,-4831,32407,-4842,32405,-4853,32404,-4864,32402,-4875,32400,-4886,32399,-4897,32397,-4908,32395,-4919,32394,-4930,32392,-4941,32390,-4952,32389,-4963,32387,-4974,32385,-4985,32383,-4996,32382,-5007,32380,-5018,32378,-5029,32377,-5040,32375,-5051,32373,-5062,32371,-5073,32370,-5084,32368,-5095,32366,-5107,32364,-5118,32363,-5129,32361,-5140,32359,-5151,32357,-5162,32356,-5173,32354,-5184,32352,-5195,32350,-5206,32349,-5217,32347,-5228,32345,-5239,32343,-5250,32341,-5261,32340,-5272,32338,-5283,32336,-5294,32334,-5305,32332,-5316,32331,-5327,32329,-5338,32327,-5349,32325,-5360,32323,-5371,32322,-5382,32320,-5393,32318,-5404,32316,-5415,32314,-5426,32312,-5437,32310,-5448,32309,-5459,32307,-5470,32305,-5481,32303,-5492,32301,-5503,32299,-5514,32297,-5525,32295,-5536,32294,-5547,32292,-5558,32290,-5569,32288,-5580,32286,-5591,32284,-5602,32282,-5613,32280,-5624,32278,-5635,32276,-5646,32274,-5657,32273,-5668,32271,-5679,32269,-5690,32267,-5701,32265,-5712,32263,-5723,32261,-5734,32259,-5745,32257,-5756,32255,-5767,32253,-5778,32251,-5789,32249,-5800,32247,-5811,32245,-5822,32243,-5833,32241,-5844,32239,-5855,32237,-5866,32235,-5877,32233,-5888,32231,-5899,32229,-5910,32227,-5921,32225,-5932,32223,-5943,32221,-5954,32219,-5965,32217,-5976,32215,-5987,32213,-5998,32211,-6009,32209,-6020,32207,-6031,32205,-6042,32203,-6053,32201,-6064,32199,-6075,32196,-6086,32194,-6097,32192,-6108,32190,-6119,32188,-6130,32186,-6141,32184,-6152,32182,-6163,32180,-6174,32178,-6185,32176,-6196,32173,-6207,32171,-6218,32169,-6229,32167,-6240,32165,-6251,32163,-6262,32161,-6272,32158,-6283,32156,-6294,32154,-6305,32152,-6316,32150,-6327,32148,-6338,32146,-6349,32143,-6360,32141,-6371,32139,-6382,32137,-6393,32135,-6404,32133,-6415,32130,-6426,32128,-6437,32126,-6448,32124,-6459,32122,-6470,32119,-6481,32117,-6492,32115,-6503,32113,-6513,32110,-6524,32108,-6535,32106,-6546,32104,-6557,32102,-6568,32099,-6579,32097,-6590,32095,-6601,32093,-6612,32090,-6623,32088,-6634,32086,-6645,32084,-6656,32081,-6667,32079,-6678,32077,-6689,32074,-6699,32072,-6710,32070,-6721,32068,-6732,32065,-6743,32063,-6754,32061,-6765,32058,-6776,32056,-6787,32054,-6798,32051,-6809,32049,-6820,32047,-6831,32044,-6842,32042,-6852,32040,-6863,32037,-6874,32035,-6885,32033,-6896,32030,-6907,32028,-6918,32026,-6929,32023,-6940,32021,-6951,32019,-6962,32016,-6973,32014,-6983,32011,-6994,32009,-7005,32007,-7016,32004,-7027,32002,-7038,31999,-7049,31997,-7060,31995,-7071,31992,-7082,31990,-7093,31987,-7103,31985,-7114,31983,-7125,31980,-7136,31978,-7147,31975,-7158,31973,-7169,31970,-7180,31968,-7191,31965,-7202,31963,-7212,31961,-7223,31958,-7234,31956,-7245,31953,-7256,31951,-7267,31948,-7278,31946,-7289,31943,-7300,31941,-7311,31938,-7321,31936,-7332,31933,-7343,31931,-7354,31928,-7365,31926,-7376,31923,-7387,31921,-7398,31918,-7408,31916,-7419,31913,-7430,31911,-7441,31908,-7452,31905,-7463,31903,-7474,31900,-7485,31898,-7495,31895,-7506,31893,-7517,31890,-7528,31888,-7539,31885,-7550,31882,-7561,31880,-7572,31877,-7582,31875,-7593,31872,-7604,31869,-7615,31867,-7626,31864,-7637,31862,-7648,31859,-7658,31856,-7669,31854,-7680,31851,-7691,31849,-7702,31846,-7713,31843,-7724,31841,-7734,31838,-7745,31835,-7756,31833,-7767,31830,-7778,31827,-7789,31825,-7800,31822,-7810,31819,-7821,31817,-7832,31814,-7843,31811,-7854,31809,-7865,31806,-7876,31803,-7886,31801,-7897,31798,-7908,31795,-7919,31793,-7930,31790,-7941,31787,-7951,31785,-7962,31782,-7973,31779,-7984,31776,-7995,31774,-8006,31771,-8016,31768,-8027,31765,-8038,31763,-8049,31760,-8060,31757,-8071,31754,-8081,31752,-8092,31749,-8103,31746,-8114,31743,-8125,31741,-8135,31738,-8146,31735,-8157,31732,-8168,31729,-8179,31727,-8190,31724,-8200,31721,-8211,31718,-8222,31716,-8233,31713,-8244,31710,-8254,31707,-8265,31704,-8276,31701,-8287,31699,-8298,31696,-8308,31693,-8319,31690,-8330,31687,-8341,31684,-8352,31682,-8362,31679,-8373,31676,-8384,31673,-8395,31670,-8406,31667,-8416,31664,-8427,31662,-8438,31659,-8449,31656,-8460,31653,-8470,31650,-8481,31647,-8492,31644,-8503,31641,-8514,31638,-8524,31635,-8535,31633,-8546,31630,-8557,31627,-8568,31624,-8578,31621,-8589,31618,-8600,31615,-8611,31612,-8621,31609,-8632,31606,-8643,31603,-8654,31600,-8664,31597,-8675,31594,-8686,31591,-8697,31588,-8708,31586,-8718,31583,-8729,31580,-8740,31577,-8751,31574,-8761,31571,-8772,31568,-8783,31565,-8794,31562,-8804,31559,-8815,31556,-8826,31553,-8837,31550,-8847,31547,-8858,31544,-8869,31541,-8880,31537,-8890,31534,-8901,31531,-8912,31528,-8923,31525,-8933,31522,-8944,31519,-8955,31516,-8966,31513,-8976,31510,-8987,31507,-8998,31504,-9009,31501,-9019,31498,-9030,31495,-9041,31492,-9052,31489,-9062,31485,-9073,31482,-9084,31479,-9095,31476,-9105,31473,-9116,31470,-9127,31467,-9137,31464,-9148,31461,-9159,31457,-9170,31454,-9180,31451,-9191,31448,-9202,31445,-9213,31442,-9223,31439,-9234,31435,-9245,31432,-9255,31429,-9266,31426,-9277,31423,-9288,31420,-9298,31417,-9309,31413,-9320,31410,-9330,31407,-9341,31404,-9352,31401,-9363,31397,-9373,31394,-9384,31391,-9395,31388,-9405,31385,-9416,31381,-9427,31378,-9437,31375,-9448,31372,-9459,31369,-9469,31365,-9480,31362,-9491,31359,-9502,31356,-9512,31352,-9523,31349,-9534,31346,-9544,31343,-9555,31339,-9566,31336,-9576,31333,-9587,31330,-9598,31326,-9608,31323,-9619,31320,-9630,31316,-9640,31313,-9651,31310,-9662,31307,-9672,31303,-9683,31300,-9694,31297,-9704,31293,-9715,31290,-9726,31287,-9736,31283,-9747,31280,-9758,31277,-9768,31273,-9779,31270,-9790,31267,-9800,31263,-9811,31260,-9822,31257,-9832,31253,-9843,31250,-9854,31247,-9864,31243,-9875,31240,-9886,31236,-9896,31233,-9907,31230,-9918,31226,-9928,31223,-9939,31220,-9950,31216,-9960,31213,-9971,31209,-9981,31206,-9992,31203,-10003,31199,-10013,31196,-10024,31192,-10035,31189,-10045,31185,-10056,31182,-10067,31179,-10077,31175,-10088,31172,-10098,31168,-10109,31165,-10120,31161,-10130,31158,-10141,31154,-10152,31151,-10162,31148,-10173,31144,-10183,31141,-10194,31137,-10205,31134,-10215,31130,-10226,31127,-10236,31123,-10247,31120,-10258,31116,-10268,31113,-10279,31109,-10290,31106,-10300,31102,-10311,31099,-10321,31095,-10332,31092,-10343,31088,-10353,31085,-10364,31081,-10374,31077,-10385,31074,-10396,31070,-10406,31067,-10417,31063,-10427,31060,-10438,31056,-10448,31053,-10459,31049,-10470,31045,-10480,31042,-10491,31038,-10501,31035,-10512,31031,-10523,31028,-10533,31024,-10544,31020,-10554,31017,-10565,31013,-10575,31010,-10586,31006,-10597,31002,-10607,30999,-10618,30995,-10628,30991,-10639,30988,-10649,30984,-10660,30981,-10671,30977,-10681,30973,-10692,30970,-10702,30966,-10713,30962,-10723,30959,-10734,30955,-10744,30951,-10755,30948,-10766,30944,-10776,30940,-10787,30937,-10797,30933,-10808,30929,-10818,30926,-10829,30922,-10839,30918,-10850,30915,-10860,30911,-10871,30907,-10881,30903,-10892,30900,-10903,30896,-10913,30892,-10924,30889,-10934,30885,-10945,30881,-10955,30877,-10966,30874,-10976,30870,-10987,30866,-10997,30862,-11008,30859,-11018,30855,-11029,30851,-11039,30847,-11050,30844,-11060,30840,-11071,30836,-11081,30832,-11092,30828,-11102,30825,-11113,30821,-11123,30817,-11134,30813,-11144,30809,-11155,30806,-11165,30802,-11176,30798,-11186,30794,-11197,30790,-11207,30787,-11218,30783,-11228,30779,-11239,30775,-11249,30771,-11260,30767,-11270,30764,-11281,30760,-11291,30756,-11302,30752,-11312,30748,-11323,30744,-11333,30740,-11344,30737,-11354,30733,-11365,30729,-11375,30725,-11386,30721,-11396,30717,-11407,30713,-11417,30709,-11428,30705,-11438,30702,-11449,30698,-11459,30694,-11469,30690,-11480,30686,-11490,30682,-11501,30678,-11511,30674,-11522,30670,-11532,30666,-11543,30662,-11553,30658,-11564,30655,-11574,30651,-11584,30647,-11595,30643,-11605,30639,-11616,30635,-11626,30631,-11637,30627,-11647,30623,-11658,30619,-11668,30615,-11678,30611,-11689,30607,-11699,30603,-11710,30599,-11720,30595,-11731,30591,-11741,30587,-11751,30583,-11762,30579,-11772,30575,-11783,30571,-11793,30567,-11804,30563,-11814,30559,-11824,30555,-11835,30551,-11845,30547,-11856,30543,-11866,30539,-11877,30535,-11887,30530,-11897,30526,-11908,30522,-11918,30518,-11929,30514,-11939,30510,-11949,30506,-11960,30502,-11970,30498,-11981,30494,-11991,30490,-12001,30486,-12012,30482,-12022,30477,-12033,30473,-12043,30469,-12053,30465,-12064,30461,-12074,30457,-12084,30453,-12095,30449,-12105,30445,-12116,30440,-12126,30436,-12136,30432,-12147,30428,-12157,30424,-12167,30420,-12178,30416,-12188,30411,-12199,30407,-12209,30403,-12219,30399,-12230,30395,-12240,30391,-12250,30386,-12261,30382,-12271,30378,-12281,30374,-12292,30370,-12302,30365,-12313,30361,-12323,30357,-12333,30353,-12344,30349,-12354,30344,-12364,30340,-12375,30336,-12385,30332,-12395,30328,-12406,30323,-12416,30319,-12426,30315,-12437,30311,-12447,30306,-12457,30302,-12468,30298,-12478,30294,-12488,30289,-12499,30285,-12509,30281,-12519,30277,-12530,30272,-12540,30268,-12550,30264,-12561,30259,-12571,30255,-12581,30251,-12591,30247,-12602,30242,-12612,30238,-12622,30234,-12633,30229,-12643,30225,-12653,30221,-12664,30216,-12674,30212,-12684,30208,-12695,30203,-12705,30199,-12715,30195,-12725,30190,-12736,30186,-12746,30182,-12756,30177,-12767,30173,-12777,30169,-12787,30164,-12797,30160,-12808,30156,-12818,30151,-12828,30147,-12839,30142,-12849,30138,-12859,30134,-12869,30129,-12880,30125,-12890,30121,-12900,30116,-12910,30112,-12921,30107,-12931,30103,-12941,30098,-12951,30094,-12962,30090,-12972,30085,-12982,30081,-12993,30076,-13003,30072,-13013,30067,-13023,30063,-13034,30059,-13044,30054,-13054,30050,-13064,30045,-13075,30041,-13085,30036,-13095,30032,-13105,30027,-13115,30023,-13126,30018,-13136,30014,-13146,30009,-13156,30005,-13167,30001,-13177,29996,-13187,29992,-13197,29987,-13208,29983,-13218,29978,-13228,29973,-13238,29969,-13248,29964,-13259,29960,-13269,29955,-13279,29951,-13289,29946,-13299,29942,-13310,29937,-13320,29933,-13330,29928,-13340,29924,-13350,29919,-13361,29915,-13371,29910,-13381,29905,-13391,29901,-13401,29896,-13412,29892,-13422,29887,-13432,29883,-13442,29878,-13452,29873,-13463,29869,-13473,29864,-13483,29860,-13493,29855,-13503,29850,-13513,29846,-13524,29841,-13534,29837,-13544,29832,-13554,29827,-13564,29823,-13575,29818,-13585,29813,-13595,29809,-13605,29804,-13615,29800,-13625,29795,-13635,29790,-13646,29786,-13656,29781,-13666,29776,-13676,29772,-13686,29767,-13696,29762,-13707,29758,-13717,29753,-13727,29748,-13737,29744,-13747,29739,-13757,29734,-13767,29729,-13778,29725,-13788,29720,-13798,29715,-13808,29711,-13818,29706,-13828,29701,-13838,29696,-13848,29692,-13859,29687,-13869,29682,-13879,29678,-13889,29673,-13899,29668,-13909,29663,-13919,29659,-13929,29654,-13939,29649,-13950,29644,-13960,29640,-13970,29635,-13980,29630,-13990,29625,-14000,29621,-14010,29616,-14020,29611,-14030,29606,-14040,29601,-14051,29597,-14061,29592,-14071,29587,-14081,29582,-14091,29577,-14101,29573,-14111,29568,-14121,29563,-14131,29558,-14141,29553,-14151,29548,-14161,29544,-14172,29539,-14182,29534,-14192,29529,-14202,29524,-14212,29519,-14222,29515,-14232,29510,-14242,29505,-14252,29500,-14262,29495,-14272,29490,-14282,29485,-14292,29481,-14302,29476,-14312,29471,-14322,29466,-14332,29461,-14343,29456,-14353,29451,-14363,29446,-14373,29441,-14383,29437,-14393,29432,-14403,29427,-14413,29422,-14423,29417,-14433,29412,-14443,29407,-14453,29402,-14463,29397,-14473,29392,-14483,29387,-14493,29382,-14503,29377,-14513,29372,-14523,29368,-14533,29363,-14543,29358,-14553,29353,-14563,29348,-14573,29343,-14583,29338,-14593,29333,-14603,29328,-14613,29323,-14623,29318,-14633,29313,-14643,29308,-14653,29303,-14663,29298,-14673,29293,-14683,29288,-14693,29283,-14703,29278,-14713,29273,-14723,29268,-14733,29263,-14743,29258,-14753,29253,-14763,29248,-14773,29243,-14783,29238,-14793,29233,-14803,29227,-14813,29222,-14823,29217,-14833,29212,-14843,29207,-14853,29202,-14862,29197,-14872,29192,-14882,29187,-14892,29182,-14902,29177,-14912,29172,-14922,29167,-14932,29162,-14942,29156,-14952,29151,-14962,29146,-14972,29141,-14982,29136,-14992,29131,-15002,29126,-15012,29121,-15022,29116,-15031,29110,-15041,29105,-15051,29100,-15061,29095,-15071,29090,-15081,29085,-15091,29080,-15101,29074,-15111,29069,-15121,29064,-15131,29059,-15141,29054,-15150,29049,-15160,29044,-15170,29038,-15180,29033,-15190,29028,-15200,29023,-15210,29018,-15220,29012,-15230,29007,-15239,29002,-15249,28997,-15259,28992,-15269,28986,-15279,28981,-15289,28976,-15299,28971,-15309,28966,-15319,28960,-15328,28955,-15338,28950,-15348,28945,-15358,28939,-15368,28934,-15378,28929,-15388,28924,-15397,28918,-15407,28913,-15417,28908,-15427,28903,-15437,28897,-15447,28892,-15457,28887,-15466,28882,-15476,28876,-15486,28871,-15496,28866,-15506,28860,-15516,28855,-15526,28850,-15535,28845,-15545,28839,-15555,28834,-15565,28829,-15575,28823,-15584,28818,-15594,28813,-15604,28807,-15614,28802,-15624,28797,-15634,28791,-15643,28786,-15653,28781,-15663,28775,-15673,28770,-15683,28765,-15692,28759,-15702,28754,-15712,28749,-15722,28743,-15732,28738,-15741,28733,-15751,28727,-15761,28722,-15771,28716,-15781,28711,-15790,28706,-15800,28700,-15810,28695,-15820,28690,-15830,28684,-15839,28679,-15849,28673,-15859,28668,-15869,28662,-15878,28657,-15888,28652,-15898,28646,-15908,28641,-15918,28635,-15927,28630,-15937,28625,-15947,28619,-15957,28614,-15966,28608,-15976,28603,-15986,28597,-15996,28592,-16005,28586,-16015,28581,-16025,28575,-16035,28570,-16044,28565,-16054,28559,-16064,28554,-16073,28548,-16083,28543,-16093,28537,-16103,28532,-16112,28526,-16122,28521,-16132,28515,-16142,28510,-16151,28504,-16161,28499,-16171,28493,-16180,28488,-16190,28482,-16200,28477,-16210,28471,-16219,28465,-16229,28460,-16239,28454,-16248,28449,-16258,28443,-16268,28438,-16277,28432,-16287,28427,-16297,28421,-16307,28416,-16316,28410,-16326,28404,-16336,28399,-16345,28393,-16355,28388,-16365,28382,-16374,28377,-16384,28371,-16394,28365,-16403,28360,-16413,28354,-16423,28349,-16432,28343,-16442,28337,-16452,28332,-16461,28326,-16471,28321,-16481,28315,-16490,28309,-16500,28304,-16510,28298,-16519,28292,-16529,28287,-16539,28281,-16548,28275,-16558,28270,-16567,28264,-16577,28259,-16587,28253,-16596,28247,-16606,28242,-16616,28236,-16625,28230,-16635,28225,-16644,28219,-16654,28213,-16664,28208,-16673,28202,-16683,28196,-16693,28190,-16702,28185,-16712,28179,-16721,28173,-16731,28168,-16741,28162,-16750,28156,-16760,28151,-16769,28145,-16779,28139,-16789,28133,-16798,28128,-16808,28122,-16817,28116,-16827,28110,-16837,28105,-16846,28099,-16856,28093,-16865,28087,-16875,28082,-16884,28076,-16894,28070,-16904,28064,-16913,28059,-16923,28053,-16932,28047,-16942,28041,-16951,28036,-16961,28030,-16970,28024,-16980,28018,-16990,28012,-16999,28007,-17009,28001,-17018,27995,-17028,27989,-17037,27983,-17047,27978,-17056,27972,-17066,27966,-17075,27960,-17085,27954,-17095,27948,-17104,27943,-17114,27937,-17123,27931,-17133,27925,-17142,27919,-17152,27913,-17161,27908,-17171,27902,-17180,27896,-17190,27890,-17199,27884,-17209,27878,-17218,27872,-17228,27867,-17237,27861,-17247,27855,-17256,27849,-17266,27843,-17275,27837,-17285,27831,-17294,27825,-17304,27819,-17313,27814,-17323,27808,-17332,27802,-17342,27796,-17351,27790,-17361,27784,-17370,27778,-17380,27772,-17389,27766,-17398,27760,-17408,27754,-17417,27748,-17427,27742,-17436,27736,-17446,27731,-17455,27725,-17465,27719,-17474,27713,-17484,27707,-17493,27701,-17502,27695,-17512,27689,-17521,27683,-17531,27677,-17540,27671,-17550,27665,-17559,27659,-17568,27653,-17578,27647,-17587,27641,-17597,27635,-17606,27629,-17616,27623,-17625,27617,-17634,27611,-17644,27605,-17653,27599,-17663,27593,-17672,27587,-17681,27581,-17691,27575,-17700,27569,-17710,27563,-17719,27557,-17728,27551,-17738,27545,-17747,27538,-17757,27532,-17766,27526,-17775,27520,-17785,27514,-17794,27508,-17804,27502,-17813,27496,-17822,27490,-17832,27484,-17841,27478,-17850,27472,-17860,27466,-17869,27460,-17879,27453,-17888,27447,-17897,27441,-17907,27435,-17916,27429,-17925,27423,-17935,27417,-17944,27411,-17953,27405,-17963,27398,-17972,27392,-17981,27386,-17991,27380,-18000,27374,-18009,27368,-18019,27362,-18028,27355,-18037,27349,-18047,27343,-18056,27337,-18065,27331,-18075,27325,-18084,27319,-18093,27312,-18103,27306,-18112,27300,-18121,27294,-18131,27288,-18140,27281,-18149,27275,-18158,27269,-18168,27263,-18177,27257,-18186,27250,-18196,27244,-18205,27238,-18214,27232,-18223,27226,-18233,27219,-18242,27213,-18251,27207,-18261,27201,-18270,27195,-18279,27188,-18288,27182,-18298,27176,-18307,27170,-18316,27163,-18325,27157,-18335,27151,-18344,27145,-18353,27138,-18362,27132,-18372,27126,-18381,27120,-18390,27113,-18399,27107,-18409,27101,-18418,27094,-18427,27088,-18436,27082,-18446,27076,-18455,27069,-18464,27063,-18473,27057,-18483,27050,-18492,27044,-18501,27038,-18510,27031,-18519,27025,-18529,27019,-18538,27012,-18547,27006,-18556,27000,-18565,26994,-18575,26987,-18584,26981,-18593,26975,-18602,26968,-18611,26962,-18621,26955,-18630,26949,-18639,26943,-18648,26936,-18657,26930,-18667,26924,-18676,26917,-18685,26911,-18694,26905,-18703,26898,-18712,26892,-18722,26885,-18731,26879,-18740,26873,-18749,26866,-18758,26860,-18767,26853,-18777,26847,-18786,26841,-18795,26834,-18804,26828,-18813,26821,-18822,26815,-18831,26809,-18841,26802,-18850,26796,-18859,26789,-18868,26783,-18877,26776,-18886,26770,-18895,26764,-18905,26757,-18914,26751,-18923,26744,-18932,26738,-18941,26731,-18950,26725,-18959,26718,-18968,26712,-18977,26705,-18987,26699,-18996,26692,-19005,26686,-19014,26680,-19023,26673,-19032,26667,-19041,26660,-19050,26654,-19059,26647,-19068,26641,-19077,26634,-19087,26628,-19096,26621,-19105,26615,-19114,26608,-19123,26601,-19132,26595,-19141,26588,-19150,26582,-19159,26575,-19168,26569,-19177,26562,-19186,26556,-19195,26549,-19204,26543,-19213,26536,-19222,26530,-19232,26523,-19241,26516,-19250,26510,-19259,26503,-19268,26497,-19277,26490,-19286,26484,-19295,26477,-19304,26470,-19313,26464,-19322,26457,-19331,26451,-19340,26444,-19349,26437,-19358,26431,-19367,26424,-19376,26418,-19385,26411,-19394,26404,-19403,26398,-19412,26391,-19421,26385,-19430,26378,-19439,26371,-19448,26365,-19457,26358,-19466,26351,-19475,26345,-19484,26338,-19493,26332,-19502,26325,-19511,26318,-19520,26312,-19529,26305,-19538,26298,-19547,26292,-19556,26285,-19565,26278,-19574,26272,-19583,26265,-19591,26258,-19600,26252,-19609,26245,-19618,26238,-19627,26231,-19636,26225,-19645,26218,-19654,26211,-19663,26205,-19672,26198,-19681,26191,-19690,26185,-19699,26178,-19708,26171,-19717,26164,-19726,26158,-19734,26151,-19743,26144,-19752,26137,-19761,26131,-19770,26124,-19779,26117,-19788,26110,-19797,26104,-19806,26097,-19815,26090,-19823,26083,-19832,26077,-19841,26070,-19850,26063,-19859,26056,-19868,26050,-19877,26043,-19886,26036,-19895,26029,-19903,26022,-19912,26016,-19921,26009,-19930,26002,-19939,25995,-19948,25989,-19957,25982,-19966,25975,-19974,25968,-19983,25961,-19992,25954,-20001,25948,-20010,25941,-20019,25934,-20027,25927,-20036,25920,-20045,25913,-20054,25907,-20063,25900,-20072,25893,-20080,25886,-20089,25879,-20098,25872,-20107,25866,-20116,25859,-20125,25852,-20133,25845,-20142,25838,-20151,25831,-20160,25824,-20169,25817,-20177,25811,-20186,25804,-20195,25797,-20204,25790,-20213,25783,-20221,25776,-20230,25769,-20239,25762,-20248,25755,-20257,25749,-20265,25742,-20274,25735,-20283,25728,-20292,25721,-20300,25714,-20309,25707,-20318,25700,-20327,25693,-20335,25686,-20344,25679,-20353,25672,-20362,25665,-20370,25659,-20379,25652,-20388,25645,-20397,25638,-20405,25631,-20414,25624,-20423,25617,-20432,25610,-20440,25603,-20449,25596,-20458,25589,-20467,25582,-20475,25575,-20484,25568,-20493,25561,-20501,25554,-20510,25547,-20519,25540,-20528,25533,-20536,25526,-20545,25519,-20554,25512,-20562,25505,-20571,25498,-20580,25491,-20588,25484,-20597,25477,-20606,25470,-20614,25463,-20623,25456,-20632,25449,-20641,25442,-20649,25435,-20658,25428,-20667,25421,-20675,25414,-20684,25407,-20693,25399,-20701,25392,-20710,25385,-20719,25378,-20727,25371,-20736,25364,-20744,25357,-20753,25350,-20762,25343,-20770,25336,-20779,25329,-20788,25322,-20796,25315,-20805,25307,-20814,25300,-20822,25293,-20831,25286,-20839,25279,-20848,25272,-20857,25265,-20865,25258,-20874,25251,-20882,25243,-20891,25236,-20900,25229,-20908,25222,-20917,25215,-20926,25208,-20934,25201,-20943,25194,-20951,25186,-20960,25179,-20968,25172,-20977,25165,-20986,25158,-20994,25151,-21003,25144,-21011,25136,-21020,25129,-21028,25122,-21037,25115,-21046,25108,-21054,25100,-21063,25093,-21071,25086,-21080,25079,-21088,25072,-21097,25065,-21105,25057,-21114,25050,-21123,25043,-21131,25036,-21140,25029,-21148,25021,-21157,25014,-21165,25007,-21174,25000,-21182,24992,-21191,24985,-21199,24978,-21208,24971,-21216,24964,-21225,24956,-21233,24949,-21242,24942,-21250,24935,-21259,24927,-21267,24920,-21276,24913,-21284,24906,-21293,24898,-21301,24891,-21310,24884,-21318,24877,-21327,24869,-21335,24862,-21344,24855,-21352,24847,-21361,24840,-21369,24833,-21378,24826,-21386,24818,-21395,24811,-21403,24804,-21411,24796,-21420,24789,-21428,24782,-21437,24774,-21445,24767,-21454,24760,-21462,24753,-21471,24745,-21479,24738,-21487,24731,-21496,24723,-21504,24716,-21513,24709,-21521,24701,-21530,24694,-21538,24687,-21546,24679,-21555,24672,-21563,24664,-21572,24657,-21580,24650,-21588,24642,-21597,24635,-21605,24628,-21614,24620,-21622,24613,-21630,24606,-21639,24598,-21647,24591,-21656,24583,-21664,24576,-21672,24569,-21681,24561,-21689,24554,-21698,24546,-21706,24539,-21714,24532,-21723,24524,-21731,24517,-21739,24509,-21748,24502,-21756,24495,-21764,24487,-21773,24480,-21781,24472,-21789,24465,-21798,24457,-21806,24450,-21814,24443,-21823,24435,-21831,24428,-21839,24420,-21848,24413,-21856,24405,-21864,24398,-21873,24390,-21881,24383,-21889,24376,-21898,24368,-21906,24361,-21914,24353,-21923,24346,-21931,24338,-21939,24331,-21947,24323,-21956,24316,-21964,24308,-21972,24301,-21981,24293,-21989,24286,-21997,24278,-22005,24271,-22014,24263,-22022,24256,-22030,24248,-22039,24241,-22047,24233,-22055,24226,-22063,24218,-22072,24211,-22080,24203,-22088,24196,-22096,24188,-22105,24180,-22113,24173,-22121,24165,-22129,24158,-22138,24150,-22146,24143,-22154,24135,-22162,24128,-22170,24120,-22179,24113,-22187,24105,-22195,24097,-22203,24090,-22212,24082,-22220,24075,-22228,24067,-22236,24060,-22244,24052,-22253,24044,-22261,24037,-22269,24029,-22277,24022,-22285,24014,-22294,24006,-22302,23999,-22310,23991,-22318,23984,-22326,23976,-22334,23968,-22343,23961,-22351,23953,-22359,23945,-22367,23938,-22375,23930,-22383,23923,-22392,23915,-22400,23907,-22408,23900,-22416,23892,-22424,23884,-22432,23877,-22440,23869,-22449,23861,-22457,23854,-22465,23846,-22473,23838,-22481,23831,-22489,23823,-22497,23815,-22506,23808,-22514,23800,-22522,23792,-22530,23785,-22538,23777,-22546,23769,-22554,23762,-22562,23754,-22570,23746,-22578,23739,-22587,23731,-22595,23723,-22603,23715,-22611,23708,-22619,23700,-22627,23692,-22635,23685,-22643,23677,-22651,23669,-22659,23661,-22667,23654,-22675,23646,-22684,23638,-22692,23631,-22700,23623,-22708,23615,-22716,23607,-22724,23600,-22732,23592,-22740,23584,-22748,23576,-22756,23569,-22764,23561,-22772,23553,-22780,23545,-22788,23537,-22796,23530,-22804,23522,-22812,23514,-22820,23506,-22828,23499,-22836,23491,-22844,23483,-22852,23475,-22860,23467,-22868,23460,-22876,23452,-22884,23444,-22892,23436,-22900,23428,-22908,23421,-22916,23413,-22924,23405,-22932,23397,-22940,23389,-22948,23382,-22956,23374,-22964,23366,-22972,23358,-22980,23350,-22988,23342,-22996,23335,-23004,23327,-23012,23319,-23020,23311,-23028,23303,-23036,23295,-23044,23287,-23051,23280,-23059,23272,-23067,23264,-23075,23256,-23083,23248,-23091,23240,-23099,23232,-23107,23224,-23115,23217,-23123,23209,-23131,23201,-23139,23193,-23147,23185,-23154,23177,-23162,23169,-23170,23161,-23178,23153,-23186,23146,-23194,23138,-23202,23130,-23210,23122,-23218,23114,-23225,23106,-23233,23098,-23241,23090,-23249,23082,-23257,23074,-23265,23066,-23273,23058,-23281,23050,-23288,23043,-23296,23035,-23304,23027,-23312,23019,-23320,23011,-23328,23003,-23336,22995,-23343,22987,-23351,22979,-23359,22971,-23367,22963,-23375,22955,-23383,22947,-23390,22939,-23398,22931,-23406,22923,-23414,22915,-23422,22907,-23429,22899,-23437,22891,-23445,22883,-23453,22875,-23461,22867,-23468,22859,-23476,22851,-23484,22843,-23492,22835,-23500,22827,-23507,22819,-23515,22811,-23523,22803,-23531,22795,-23538,22787,-23546,22779,-23554,22771,-23562,22763,-23570,22755,-23577,22747,-23585,22739,-23593,22731,-23601,22723,-23608,22715,-23616,22707,-23624,22699,-23632,22691,-23639,22683,-23647,22674,-23655,22666,-23662,22658,-23670,22650,-23678,22642,-23686,22634,-23693,22626,-23701,22618,-23709,22610,-23716,22602,-23724,22594,-23732,22586,-23740,22577,-23747,22569,-23755,22561,-23763,22553,-23770,22545,-23778,22537,-23786,22529,-23793,22521,-23801,22513,-23809,22505,-23816,22496,-23824,22488,-23832,22480,-23839,22472,-23847,22464,-23855,22456,-23862,22448,-23870,22439,-23878,22431,-23885,22423,-23893,22415,-23901,22407,-23908,22399,-23916,22391,-23924,22382,-23931,22374,-23939,22366,-23946,22358,-23954,22350,-23962,22342,-23969,22333,-23977,22325,-23985,22317,-23992,22309,-24000,22301,-24007,22293,-24015,22284,-24023,22276,-24030,22268,-24038,22260,-24045,22252,-24053,22243,-24061,22235,-24068,22227,-24076,22219,-24083,22211,-24091,22202,-24098,22194,-24106,22186,-24114,22178,-24121,22169,-24129,22161,-24136,22153,-24144,22145,-24151,22137,-24159,22128,-24166,22120,-24174,22112,-24181,22104,-24189,22095,-24197,22087,-24204,22079,-24212,22071,-24219,22062,-24227,22054,-24234,22046,-24242,22038,-24249,22029,-24257,22021,-24264,22013,-24272,22004,-24279,21996,-24287,21988,-24294,21980,-24302,21971,-24309,21963,-24317,21955,-24324,21946,-24332,21938,-24339,21930,-24347,21922,-24354,21913,-24362,21905,-24369,21897,-24377,21888,-24384,21880,-24391,21872,-24399,21863,-24406,21855,-24414,21847,-24421,21838,-24429,21830,-24436,21822,-24444,21813,-24451,21805,-24458,21797,-24466,21788,-24473,21780,-24481,21772,-24488,21763,-24496,21755,-24503,21747,-24510,21738,-24518,21730,-24525,21722,-24533,21713,-24540,21705,-24547,21697,-24555,21688,-24562,21680,-24570,21671,-24577,21663,-24584,21655,-24592,21646,-24599,21638,-24607,21629,-24614,21621,-24621,21613,-24629,21604,-24636,21596,-24643,21587,-24651,21579,-24658,21571,-24665,21562,-24673,21554,-24680,21545,-24688,21537,-24695,21529,-24702,21520,-24710,21512,-24717,21503,-24724,21495,-24732,21486,-24739,21478,-24746,21470,-24754,21461,-24761,21453,-24768,21444,-24775,21436,-24783,21427,-24790,21419,-24797,21410,-24805,21402,-24812,21394,-24819,21385,-24827,21377,-24834,21368,-24841,21360,-24848,21351,-24856,21343,-24863,21334,-24870,21326,-24878,21317,-24885,21309,-24892,21300,-24899,21292,-24907,21283,-24914,21275,-24921,21266,-24928,21258,-24936,21249,-24943,21241,-24950,21232,-24957,21224,-24965,21215,-24972,21207,-24979,21198,-24986,21190,-24993,21181,-25001,21173,-25008,21164,-25015,21156,-25022,21147,-25030,21139,-25037,21130,-25044,21122,-25051,21113,-25058,21104,-25066,21096,-25073,21087,-25080,21079,-25087,21070,-25094,21062,-25101,21053,-25109,21045,-25116,21036,-25123,21027,-25130,21019,-25137,21010,-25145,21002,-25152,20993,-25159,20985,-25166,20976,-25173,20967,-25180,20959,-25187,20950,-25195,20942,-25202,20933,-25209,20925,-25216,20916,-25223,20907,-25230,20899,-25237,20890,-25244,20881,-25252,20873,-25259,20864,-25266,20856,-25273,20847,-25280,20838,-25287,20830,-25294,20821,-25301,20813,-25308,20804,-25316,20795,-25323,20787,-25330,20778,-25337,20769,-25344,20761,-25351,20752,-25358,20743,-25365,20735,-25372,20726,-25379,20718,-25386,20709,-25393,20700,-25400,20692,-25408,20683,-25415,20674,-25422,20666,-25429,20657,-25436,20648,-25443,20640,-25450,20631,-25457,20622,-25464,20613,-25471,20605,-25478,20596,-25485,20587,-25492,20579,-25499,20570,-25506,20561,-25513,20553,-25520,20544,-25527,20535,-25534,20527,-25541,20518,-25548,20509,-25555,20500,-25562,20492,-25569,20483,-25576,20474,-25583,20466,-25590,20457,-25597,20448,-25604,20439,-25611,20431,-25618,20422,-25625,20413,-25632,20404,-25639,20396,-25646,20387,-25653,20378,-25660,20369,-25666,20361,-25673,20352,-25680,20343,-25687,20334,-25694,20326,-25701,20317,-25708,20308,-25715,20299,-25722,20291,-25729,20282,-25736,20273,-25743,20264,-25750,20256,-25756,20247,-25763,20238,-25770,20229,-25777,20220,-25784,20212,-25791,20203,-25798,20194,-25805,20185,-25812,20176,-25818,20168,-25825,20159,-25832,20150,-25839,20141,-25846,20132,-25853,20124,-25860,20115,-25867,20106,-25873,20097,-25880,20088,-25887,20079,-25894,20071,-25901,20062,-25908,20053,-25914,20044,-25921,20035,-25928,20026,-25935,20018,-25942,20009,-25949,20000,-25955,19991,-25962,19982,-25969,19973,-25976,19965,-25983,19956,-25990,19947,-25996,19938,-26003,19929,-26010,19920,-26017,19911,-26023,19902,-26030,19894,-26037,19885,-26044,19876,-26051,19867,-26057,19858,-26064,19849,-26071,19840,-26078,19831,-26084,19822,-26091,19814,-26098,19805,-26105,19796,-26111,19787,-26118,19778,-26125,19769,-26132,19760,-26138,19751,-26145,19742,-26152,19733,-26159,19725,-26165,19716,-26172,19707,-26179,19698,-26186,19689,-26192,19680,-26199,19671,-26206,19662,-26212,19653,-26219,19644,-26226,19635,-26232,19626,-26239,19617,-26246,19608,-26253,19599,-26259,19590,-26266,19582,-26273,19573,-26279,19564,-26286,19555,-26293,19546,-26299,19537,-26306,19528,-26313,19519,-26319,19510,-26326,19501,-26333,19492,-26339,19483,-26346,19474,-26352,19465,-26359,19456,-26366,19447,-26372,19438,-26379,19429,-26386,19420,-26392,19411,-26399,19402,-26405,19393,-26412,19384,-26419,19375,-26425,19366,-26432,19357,-26438,19348,-26445,19339,-26452,19330,-26458,19321,-26465,19312,-26471,19303,-26478,19294,-26485,19285,-26491,19276,-26498,19267,-26504,19258,-26511,19249,-26517,19240,-26524,19231,-26531,19221,-26537,19212,-26544,19203,-26550,19194,-26557,19185,-26563,19176,-26570,19167,-26576,19158,-26583,19149,-26589,19140,-26596,19131,-26602,19122,-26609,19113,-26616,19104,-26622,19095,-26629,19086,-26635,19076,-26642,19067,-26648,19058,-26655,19049,-26661,19040,-26668,19031,-26674,19022,-26681,19013,-26687,19004,-26693,18995,-26700,18986,-26706,18976,-26713,18967,-26719,18958,-26726,18949,-26732,18940,-26739,18931,-26745,18922,-26752,18913,-26758,18904,-26765,18894,-26771,18885,-26777,18876,-26784,18867,-26790,18858,-26797,18849,-26803,18840,-26810,18830,-26816,18821,-26822,18812,-26829,18803,-26835,18794,-26842,18785,-26848,18776,-26854,18766,-26861,18757,-26867,18748,-26874,18739,-26880,18730,-26886,18721,-26893,18711,-26899,18702,-26906,18693,-26912,18684,-26918,18675,-26925,18666,-26931,18656,-26937,18647,-26944,18638,-26950,18629,-26956,18620,-26963,18610,-26969,18601,-26976,18592,-26982,18583,-26988,18574,-26995,18564,-27001,18555,-27007,18546,-27013,18537,-27020,18528,-27026,18518,-27032,18509,-27039,18500,-27045,18491,-27051,18482,-27058,18472,-27064,18463,-27070,18454,-27077,18445,-27083,18435,-27089,18426,-27095,18417,-27102,18408,-27108,18398,-27114,18389,-27121,18380,-27127,18371,-27133,18361,-27139,18352,-27146,18343,-27152,18334,-27158,18324,-27164,18315,-27171,18306,-27177,18297,-27183,18287,-27189,18278,-27196,18269,-27202,18260,-27208,18250,-27214,18241,-27220,18232,-27227,18222,-27233,18213,-27239,18204,-27245,18195,-27251,18185,-27258,18176,-27264,18167,-27270,18157,-27276,18148,-27282,18139,-27289,18130,-27295,18120,-27301,18111,-27307,18102,-27313,18092,-27320,18083,-27326,18074,-27332,18064,-27338,18055,-27344,18046,-27350,18036,-27356,18027,-27363,18018,-27369,18008,-27375,17999,-27381,17990,-27387,17980,-27393,17971,-27399,17962,-27406,17952,-27412,17943,-27418,17934,-27424,17924,-27430,17915,-27436,17906,-27442,17896,-27448,17887,-27454,17878,-27461,17868,-27467,17859,-27473,17849,-27479,17840,-27485,17831,-27491,17821,-27497,17812,-27503,17803,-27509,17793,-27515,17784,-27521,17774,-27527,17765,-27533,17756,-27539,17746,-27546,17737,-27552,17727,-27558,17718,-27564,17709,-27570,17699,-27576,17690,-27582,17680,-27588,17671,-27594,17662,-27600,17652,-27606,17643,-27612,17633,-27618,17624,-27624,17615,-27630,17605,-27636,17596,-27642,17586,-27648,17577,-27654,17567,-27660,17558,-27666,17549,-27672,17539,-27678,17530,-27684,17520,-27690,17511,-27696,17501,-27702,17492,-27708,17483,-27714,17473,-27720,17464,-27726,17454,-27732,17445,-27737,17435,-27743,17426,-27749,17416,-27755,17407,-27761,17397,-27767,17388,-27773,17379,-27779,17369,-27785,17360,-27791,17350,-27797,17341,-27803,17331,-27809,17322,-27815,17312,-27820,17303,-27826,17293,-27832,17284,-27838,17274,-27844,17265,-27850,17255,-27856,17246,-27862,17236,-27868,17227,-27873,17217,-27879,17208,-27885,17198,-27891,17189,-27897,17179,-27903,17170,-27909,17160,-27914,17151,-27920,17141,-27926,17132,-27932,17122,-27938,17113,-27944,17103,-27949,17094,-27955,17084,-27961,17074,-27967,17065,-27973,17055,-27979,17046,-27984,17036,-27990,17027,-27996,17017,-28002,17008,-28008,16998,-28013,16989,-28019,16979,-28025,16969,-28031,16960,-28037,16950,-28042,16941,-28048,16931,-28054,16922,-28060,16912,-28065,16903,-28071,16893,-28077,16883,-28083,16874,-28088,16864,-28094,16855,-28100,16845,-28106,16836,-28111,16826,-28117,16816,-28123,16807,-28129,16797,-28134,16788,-28140,16778,-28146,16768,-28152,16759,-28157,16749,-28163,16740,-28169,16730,-28174,16720,-28180,16711,-28186,16701,-28191,16692,-28197,16682,-28203,16672,-28209,16663,-28214,16653,-28220,16643,-28226,16634,-28231,16624,-28237,16615,-28243,16605,-28248,16595,-28254,16586,-28260,16576,-28265,16566,-28271,16557,-28276,16547,-28282,16538,-28288,16528,-28293,16518,-28299,16509,-28305,16499,-28310,16489,-28316,16480,-28322,16470,-28327,16460,-28333,16451,-28338,16441,-28344,16431,-28350,16422,-28355,16412,-28361,16402,-28366,16393,-28372,16383,-28378,16373,-28383,16364,-28389,16354,-28394,16344,-28400,16335,-28405,16325,-28411,16315,-28417,16306,-28422,16296,-28428,16286,-28433,16276,-28439,16267,-28444,16257,-28450,16247,-28455,16238,-28461,16228,-28466,16218,-28472,16209,-28478,16199,-28483,16189,-28489,16179,-28494,16170,-28500,16160,-28505,16150,-28511,16141,-28516,16131,-28522,16121,-28527,16111,-28533,16102,-28538,16092,-28544,16082,-28549,16072,-28555,16063,-28560,16053,-28566,16043,-28571,16034,-28576,16024,-28582,16014,-28587,16004,-28593,15995,-28598,15985,-28604,15975,-28609,15965,-28615,15956,-28620,15946,-28626,15936,-28631,15926,-28636,15917,-28642,15907,-28647,15897,-28653,15887,-28658,15877,-28663,15868,-28669,15858,-28674,15848,-28680,15838,-28685,15829,-28691,15819,-28696,15809,-28701,15799,-28707,15789,-28712,15780,-28717,15770,-28723,15760,-28728,15750,-28734,15740,-28739,15731,-28744,15721,-28750,15711,-28755,15701,-28760,15691,-28766,15682,-28771,15672,-28776,15662,-28782,15652,-28787,15642,-28792,15633,-28798,15623,-28803,15613,-28808,15603,-28814,15593,-28819,15583,-28824,15574,-28830,15564,-28835,15554,-28840,15544,-28846,15534,-28851,15525,-28856,15515,-28861,15505,-28867,15495,-28872,15485,-28877,15475,-28883,15465,-28888,15456,-28893,15446,-28898,15436,-28904,15426,-28909,15416,-28914,15406,-28919,15396,-28925,15387,-28930,15377,-28935,15367,-28940,15357,-28946,15347,-28951,15337,-28956,15327,-28961,15318,-28967,15308,-28972,15298,-28977,15288,-28982,15278,-28987,15268,-28993,15258,-28998,15248,-29003,15238,-29008,15229,-29013,15219,-29019,15209,-29024,15199,-29029,15189,-29034,15179,-29039,15169,-29045,15159,-29050,15149,-29055,15140,-29060,15130,-29065,15120,-29070,15110,-29075,15100,-29081,15090,-29086,15080,-29091,15070,-29096,15060,-29101,15050,-29106,15040,-29111,15030,-29117,15021,-29122,15011,-29127,15001,-29132,14991,-29137,14981,-29142,14971,-29147,14961,-29152,14951,-29157,14941,-29163,14931,-29168,14921,-29173,14911,-29178,14901,-29183,14891,-29188,14881,-29193,14871,-29198,14861,-29203,14852,-29208,14842,-29213,14832,-29218,14822,-29223,14812,-29228,14802,-29234,14792,-29239,14782,-29244,14772,-29249,14762,-29254,14752,-29259,14742,-29264,14732,-29269,14722,-29274,14712,-29279,14702,-29284,14692,-29289,14682,-29294,14672,-29299,14662,-29304,14652,-29309,14642,-29314,14632,-29319,14622,-29324,14612,-29329,14602,-29334,14592,-29339,14582,-29344,14572,-29349,14562,-29354,14552,-29359,14542,-29364,14532,-29369,14522,-29373,14512,-29378,14502,-29383,14492,-29388,14482,-29393,14472,-29398,14462,-29403,14452,-29408,14442,-29413,14432,-29418,14422,-29423,14412,-29428,14402,-29433,14392,-29438,14382,-29442,14372,-29447,14362,-29452,14352,-29457,14342,-29462,14331,-29467,14321,-29472,14311,-29477,14301,-29482,14291,-29486,14281,-29491,14271,-29496,14261,-29501,14251,-29506,14241,-29511,14231,-29516,14221,-29520,14211,-29525,14201,-29530,14191,-29535,14181,-29540,14171,-29545,14160,-29549,14150,-29554,14140,-29559,14130,-29564,14120,-29569,14110,-29574,14100,-29578,14090,-29583,14080,-29588,14070,-29593,14060,-29598,14050,-29602,14039,-29607,14029,-29612,14019,-29617,14009,-29622,13999,-29626,13989,-29631,13979,-29636,13969,-29641,13959,-29645,13949,-29650,13938,-29655,13928,-29660,13918,-29664,13908,-29669,13898,-29674,13888,-29679,13878,-29683,13868,-29688,13858,-29693,13847,-29697,13837,-29702,13827,-29707,13817,-29712,13807,-29716,13797,-29721,13787,-29726,13777,-29730,13766,-29735,13756,-29740,13746,-29745,13736,-29749,13726,-29754,13716,-29759,13706,-29763,13695,-29768,13685,-29773,13675,-29777,13665,-29782,13655,-29787,13645,-29791,13634,-29796,13624,-29801,13614,-29805,13604,-29810,13594,-29814,13584,-29819,13574,-29824,13563,-29828,13553,-29833,13543,-29838,13533,-29842,13523,-29847,13512,-29851,13502,-29856,13492,-29861,13482,-29865,13472,-29870,13462,-29874,13451,-29879,13441,-29884,13431,-29888,13421,-29893,13411,-29897,13400,-29902,13390,-29906,13380,-29911,13370,-29916,13360,-29920,13349,-29925,13339,-29929,13329,-29934,13319,-29938,13309,-29943,13298,-29947,13288,-29952,13278,-29956,13268,-29961,13258,-29965,13247,-29970,13237,-29974,13227,-29979,13217,-29984,13207,-29988,13196,-29993,13186,-29997,13176,-30002,13166,-30006,13155,-30010,13145,-30015,13135,-30019,13125,-30024,13114,-30028,13104,-30033,13094,-30037,13084,-30042,13074,-30046,13063,-30051,13053,-30055,13043,-30060,13033,-30064,13022,-30068,13012,-30073,13002,-30077,12992,-30082,12981,-30086,12971,-30091,12961,-30095,12950,-30099,12940,-30104,12930,-30108,12920,-30113,12909,-30117,12899,-30122,12889,-30126,12879,-30130,12868,-30135,12858,-30139,12848,-30143,12838,-30148,12827,-30152,12817,-30157,12807,-30161,12796,-30165,12786,-30170,12776,-30174,12766,-30178,12755,-30183,12745,-30187,12735,-30191,12724,-30196,12714,-30200,12704,-30204,12694,-30209,12683,-30213,12673,-30217,12663,-30222,12652,-30226,12642,-30230,12632,-30235,12621,-30239,12611,-30243,12601,-30248,12590,-30252,12580,-30256,12570,-30260,12560,-30265,12549,-30269,12539,-30273,12529,-30278,12518,-30282,12508,-30286,12498,-30290,12487,-30295,12477,-30299,12467,-30303,12456,-30307,12446,-30312,12436,-30316,12425,-30320,12415,-30324,12405,-30329,12394,-30333,12384,-30337,12374,-30341,12363,-30345,12353,-30350,12343,-30354,12332,-30358,12322,-30362,12312,-30366,12301,-30371,12291,-30375,12280,-30379,12270,-30383,12260,-30387,12249,-30392,12239,-30396,12229,-30400,12218,-30404,12208,-30408,12198,-30412,12187,-30417,12177,-30421,12166,-30425,12156,-30429,12146,-30433,12135,-30437,12125,-30441,12115,-30446,12104,-30450,12094,-30454,12083,-30458,12073,-30462,12063,-30466,12052,-30470,12042,-30474,12032,-30478,12021,-30483,12011,-30487,12000,-30491,11990,-30495,11980,-30499,11969,-30503,11959,-30507,11948,-30511,11938,-30515,11928,-30519,11917,-30523,11907,-30527,11896,-30531,11886,-30536,11876,-30540,11865,-30544,11855,-30548,11844,-30552,11834,-30556,11823,-30560,11813,-30564,11803,-30568,11792,-30572,11782,-30576,11771,-30580,11761,-30584,11750,-30588,11740,-30592,11730,-30596,11719,-30600,11709,-30604,11698,-30608,11688,-30612,11677,-30616,11667,-30620,11657,-30624,11646,-30628,11636,-30632,11625,-30636,11615,-30640,11604,-30644,11594,-30648,11583,-30652,11573,-30656,11563,-30659,11552,-30663,11542,-30667,11531,-30671,11521,-30675,11510,-30679,11500,-30683,11489,-30687,11479,-30691,11468,-30695,11458,-30699,11448,-30703,11437,-30706,11427,-30710,11416,-30714,11406,-30718,11395,-30722,11385,-30726,11374,-30730,11364,-30734,11353,-30738,11343,-30741,11332,-30745,11322,-30749,11311,-30753,11301,-30757,11290,-30761,11280,-30765,11269,-30768,11259,-30772,11248,-30776,11238,-30780,11227,-30784,11217,-30788,11206,-30791,11196,-30795,11185,-30799,11175,-30803,11164,-30807,11154,-30810,11143,-30814,11133,-30818,11122,-30822,11112,-30826,11101,-30829,11091,-30833,11080,-30837,11070,-30841,11059,-30845,11049,-30848,11038,-30852,11028,-30856,11017,-30860,11007,-30863,10996,-30867,10986,-30871,10975,-30875,10965,-30878,10954,-30882,10944,-30886,10933,-30890,10923,-30893,10912,-30897,10902,-30901,10891,-30904,10880,-30908,10870,-30912,10859,-30916,10849,-30919,10838,-30923,10828,-30927,10817,-30930,10807,-30934,10796,-30938,10786,-30941,10775,-30945,10765,-30949,10754,-30952,10743,-30956,10733,-30960,10722,-30963,10712,-30967,10701,-30971,10691,-30974,10680,-30978,10670,-30982,10659,-30985,10648,-30989,10638,-30992,10627,-30996,10617,-31000,10606,-31003,10596,-31007,10585,-31011,10574,-31014,10564,-31018,10553,-31021,10543,-31025,10532,-31029,10522,-31032,10511,-31036,10500,-31039,10490,-31043,10479,-31046,10469,-31050,10458,-31054,10447,-31057,10437,-31061,10426,-31064,10416,-31068,10405,-31071,10395,-31075,10384,-31078,10373,-31082,10363,-31086,10352,-31089,10342,-31093,10331,-31096,10320,-31100,10310,-31103,10299,-31107,10289,-31110,10278,-31114,10267,-31117,10257,-31121,10246,-31124,10235,-31128,10225,-31131,10214,-31135,10204,-31138,10193,-31142,10182,-31145,10172,-31149,10161,-31152,10151,-31155,10140,-31159,10129,-31162,10119,-31166,10108,-31169,10097,-31173,10087,-31176,10076,-31180,10066,-31183,10055,-31186,10044,-31190,10034,-31193,10023,-31197,10012,-31200,10002,-31204,9991,-31207,9980,-31210,9970,-31214,9959,-31217,9949,-31221,9938,-31224,9927,-31227,9917,-31231,9906,-31234,9895,-31237,9885,-31241,9874,-31244,9863,-31248,9853,-31251,9842,-31254,9831,-31258,9821,-31261,9810,-31264,9799,-31268,9789,-31271,9778,-31274,9767,-31278,9757,-31281,9746,-31284,9735,-31288,9725,-31291,9714,-31294,9703,-31298,9693,-31301,9682,-31304,9671,-31308,9661,-31311,9650,-31314,9639,-31317,9629,-31321,9618,-31324,9607,-31327,9597,-31331,9586,-31334,9575,-31337,9565,-31340,9554,-31344,9543,-31347,9533,-31350,9522,-31353,9511,-31357,9501,-31360,9490,-31363,9479,-31366,9468,-31370,9458,-31373,9447,-31376,9436,-31379,9426,-31382,9415,-31386,9404,-31389,9394,-31392,9383,-31395,9372,-31398,9362,-31402,9351,-31405,9340,-31408,9329,-31411,9319,-31414,9308,-31418,9297,-31421,9287,-31424,9276,-31427,9265,-31430,9254,-31433,9244,-31436,9233,-31440,9222,-31443,9212,-31446,9201,-31449,9190,-31452,9179,-31455,9169,-31458,9158,-31462,9147,-31465,9136,-31468,9126,-31471,9115,-31474,9104,-31477,9094,-31480,9083,-31483,9072,-31486,9061,-31490,9051,-31493,9040,-31496,9029,-31499,9018,-31502,9008,-31505,8997,-31508,8986,-31511,8975,-31514,8965,-31517,8954,-31520,8943,-31523,8932,-31526,8922,-31529,8911,-31532,8900,-31535,8889,-31538,8879,-31542,8868,-31545,8857,-31548,8846,-31551,8836,-31554,8825,-31557,8814,-31560,8803,-31563,8793,-31566,8782,-31569,8771,-31572,8760,-31575,8750,-31578,8739,-31581,8728,-31584,8717,-31587,8707,-31589,8696,-31592,8685,-31595,8674,-31598,8663,-31601,8653,-31604,8642,-31607,8631,-31610,8620,-31613,8610,-31616,8599,-31619,8588,-31622,8577,-31625,8567,-31628,8556,-31631,8545,-31634,8534,-31636,8523,-31639,8513,-31642,8502,-31645,8491,-31648,8480,-31651,8469,-31654,8459,-31657,8448,-31660,8437,-31663,8426,-31665,8415,-31668,8405,-31671,8394,-31674,8383,-31677,8372,-31680,8361,-31683,8351,-31685,8340,-31688,8329,-31691,8318,-31694,8307,-31697,8297,-31700,8286,-31702,8275,-31705,8264,-31708,8253,-31711,8243,-31714,8232,-31717,8221,-31719,8210,-31722,8199,-31725,8189,-31728,8178,-31730,8167,-31733,8156,-31736,8145,-31739,8134,-31742,8124,-31744,8113,-31747,8102,-31750,8091,-31753,8080,-31755,8070,-31758,8059,-31761,8048,-31764,8037,-31766,8026,-31769,8015,-31772,8005,-31775,7994,-31777,7983,-31780,7972,-31783,7961,-31786,7950,-31788,7940,-31791,7929,-31794,7918,-31796,7907,-31799,7896,-31802,7885,-31804,7875,-31807,7864,-31810,7853,-31812,7842,-31815,7831,-31818,7820,-31820,7809,-31823,7799,-31826,7788,-31828,7777,-31831,7766,-31834,7755,-31836,7744,-31839,7733,-31842,7723,-31844,7712,-31847,7701,-31850,7690,-31852,7679,-31855,7668,-31857,7657,-31860,7647,-31863,7636,-31865,7625,-31868,7614,-31870,7603,-31873,7592,-31876,7581,-31878,7571,-31881,7560,-31883,7549,-31886,7538,-31889,7527,-31891,7516,-31894,7505,-31896,7494,-31899,7484,-31901,7473,-31904,7462,-31906,7451,-31909,7440,-31912,7429,-31914,7418,-31917,7407,-31919,7397,-31922,7386,-31924,7375,-31927,7364,-31929,7353,-31932,7342,-31934,7331,-31937,7320,-31939,7310,-31942,7299,-31944,7288,-31947,7277,-31949,7266,-31952,7255,-31954,7244,-31957,7233,-31959,7222,-31962,7211,-31964,7201,-31966,7190,-31969,7179,-31971,7168,-31974,7157,-31976,7146,-31979,7135,-31981,7124,-31984,7113,-31986,7102,-31988,7092,-31991,7081,-31993,7070,-31996,7059,-31998,7048,-32000,7037,-32003,7026,-32005,7015,-32008,7004,-32010,6993,-32012,6982,-32015,6972,-32017,6961,-32020,6950,-32022,6939,-32024,6928,-32027,6917,-32029,6906,-32031,6895,-32034,6884,-32036,6873,-32038,6862,-32041,6851,-32043,6841,-32045,6830,-32048,6819,-32050,6808,-32052,6797,-32055,6786,-32057,6775,-32059,6764,-32062,6753,-32064,6742,-32066,6731,-32069,6720,-32071,6709,-32073,6698,-32075,6688,-32078,6677,-32080,6666,-32082,6655,-32085,6644,-32087,6633,-32089,6622,-32091,6611,-32094,6600,-32096,6589,-32098,6578,-32100,6567,-32103,6556,-32105,6545,-32107,6534,-32109,6523,-32111,6512,-32114,6502,-32116,6491,-32118,6480,-32120,6469,-32123,6458,-32125,6447,-32127,6436,-32129,6425,-32131,6414,-32134,6403,-32136,6392,-32138,6381,-32140,6370,-32142,6359,-32144,6348,-32147,6337,-32149,6326,-32151,6315,-32153,6304,-32155,6293,-32157,6282,-32159,6271,-32162,6261,-32164,6250,-32166,6239,-32168,6228,-32170,6217,-32172,6206,-32174,6195,-32177,6184,-32179,6173,-32181,6162,-32183,6151,-32185,6140,-32187,6129,-32189,6118,-32191,6107,-32193,6096,-32195,6085,-32197,6074,-32200,6063,-32202,6052,-32204,6041,-32206,6030,-32208,6019,-32210,6008,-32212,5997,-32214,5986,-32216,5975,-32218,5964,-32220,5953,-32222,5942,-32224,5931,-32226,5920,-32228,5909,-32230,5898,-32232,5887,-32234,5876,-32236,5865,-32238,5854,-32240,5843,-32242,5832,-32244,5821,-32246,5810,-32248,5799,-32250,5788,-32252,5777,-32254,5766,-32256,5755,-32258,5744,-32260,5733,-32262,5722,-32264,5711,-32266,5700,-32268,5689,-32270,5678,-32272,5667,-32274,5656,-32275,5645,-32277,5634,-32279,5623,-32281,5612,-32283,5601,-32285,5590,-32287,5579,-32289,5568,-32291,5557,-32293,5546,-32295,5535,-32296,5524,-32298,5513,-32300,5502,-32302,5491,-32304,5480,-32306,5469,-32308,5458,-32310,5447,-32311,5436,-32313,5425,-32315,5414,-32317,5403,-32319,5392,-32321,5381,-32323,5370,-32324,5359,-32326,5348,-32328,5337,-32330,5326,-32332,5315,-32333,5304,-32335,5293,-32337,5282,-32339,5271,-32341,5260,-32342,5249,-32344,5238,-32346,5227,-32348,5216,-32350,5205,-32351,5194,-32353,5183,-32355,5172,-32357,5161,-32358,5150,-32360,5139,-32362,5128,-32364,5117,-32365,5106,-32367,5094,-32369,5083,-32371,5072,-32372,5061,-32374,5050,-32376,5039,-32378,5028,-32379,5017,-32381,5006,-32383,4995,-32384,4984,-32386,4973,-32388,4962,-32390,4951,-32391,4940,-32393,4929,-32395,4918,-32396,4907,-32398,4896,-32400,4885,-32401,4874,-32403,4863,-32405,4852,-32406,4841,-32408,4830,-32410,4818,-32411,4807,-32413,4796,-32414,4785,-32416,4774,-32418,4763,-32419,4752,-32421,4741,-32423,4730,-32424,4719,-32426,4708,-32427,4697,-32429,4686,-32431,4675,-32432,4664,-32434,4653,-32435,4642,-32437,4631,-32439,4620,-32440,4608,-32442,4597,-32443,4586,-32445,4575,-32446,4564,-32448,4553,-32450,4542,-32451,4531,-32453,4520,-32454,4509,-32456,4498,-32457,4487,-32459,4476,-32460,4465,-32462,4454,-32463,4443,-32465,4431,-32466,4420,-32468,4409,-32469,4398,-32471,4387,-32472,4376,-32474,4365,-32475,4354,-32477,4343,-32478,4332,-32480,4321,-32481,4310,-32483,4299,-32484,4288,-32486,4276,-32487,4265,-32489,4254,-32490,4243,-32492,4232,-32493,4221,-32494,4210,-32496,4199,-32497,4188,-32499,4177,-32500,4166,-32502,4155,-32503,4144,-32504,4132,-32506,4121,-32507,4110,-32509,4099,-32510,4088,-32511,4077,-32513,4066,-32514,4055,-32516,4044,-32517,4033,-32518,4022,-32520,4011,-32521,3999,-32522,3988,-32524,3977,-32525,3966,-32527,3955,-32528,3944,-32529,3933,-32531,3922,-32532,3911,-32533,3900,-32535,3889,-32536,3877,-32537,3866,-32539,3855,-32540,3844,-32541,3833,-32542,3822,-32544,3811,-32545,3800,-32546,3789,-32548,3778,-32549,3767,-32550,3755,-32552,3744,-32553,3733,-32554,3722,-32555,3711,-32557,3700,-32558,3689,-32559,3678,-32560,3667,-32562,3656,-32563,3644,-32564,3633,-32565,3622,-32567,3611,-32568,3600,-32569,3589,-32570,3578,-32572,3567,-32573,3556,-32574,3545,-32575,3533,-32576,3522,-32578,3511,-32579,3500,-32580,3489,-32581,3478,-32582,3467,-32584,3456,-32585,3445,-32586,3433,-32587,3422,-32588,3411,-32589,3400,-32591,3389,-32592,3378,-32593,3367,-32594,3356,-32595,3345,-32596,3333,-32597,3322,-32599,3311,-32600,3300,-32601,3289,-32602,3278,-32603,3267,-32604,3256,-32605,3245,-32606,3233,-32608,3222,-32609,3211,-32610,3200,-32611,3189,-32612,3178,-32613,3167,-32614,3156,-32615,3145,-32616,3133,-32617,3122,-32618,3111,-32619,3100,-32620,3089,-32622,3078,-32623,3067,-32624,3056,-32625,3044,-32626,3033,-32627,3022,-32628,3011,-32629,3000,-32630,2989,-32631,2978,-32632,2967,-32633,2955,-32634,2944,-32635,2933,-32636,2922,-32637,2911,-32638,2900,-32639,2889,-32640,2878,-32641,2866,-32642,2855,-32643,2844,-32644,2833,-32645,2822,-32646,2811,-32647,2800,-32648,2789,-32649,2777,-32650,2766,-32650,2755,-32651,2744,-32652,2733,-32653,2722,-32654,2711,-32655,2700,-32656,2688,-32657,2677,-32658,2666,-32659,2655,-32660,2644,-32661,2633,-32662,2622,-32662,2610,-32663,2599,-32664,2588,-32665,2577,-32666,2566,-32667,2555,-32668,2544,-32669,2533,-32669,2521,-32670,2510,-32671,2499,-32672,2488,-32673,2477,-32674,2466,-32675,2455,-32675,2443,-32676,2432,-32677,2421,-32678,2410,-32679,2399,-32680,2388,-32680,2377,-32681,2365,-32682,2354,-32683,2343,-32684,2332,-32684,2321,-32685,2310,-32686,2299,-32687,2287,-32688,2276,-32688,2265,-32689,2254,-32690,2243,-32691,2232,-32691,2221,-32692,2209,-32693,2198,-32694,2187,-32694,2176,-32695,2165,-32696,2154,-32697,2143,-32697,2131,-32698,2120,-32699,2109,-32700,2098,-32700,2087,-32701,2076,-32702,2065,-32702,2053,-32703,2042,-32704,2031,-32704,2020,-32705,2009,-32706,1998,-32707,1986,-32707,1975,-32708,1964,-32709,1953,-32709,1942,-32710,1931,-32711,1920,-32711,1908,-32712,1897,-32712,1886,-32713,1875,-32714,1864,-32714,1853,-32715,1842,-32716,1830,-32716,1819,-32717,1808,-32718,1797,-32718,1786,-32719,1775,-32719,1763,-32720,1752,-32721,1741,-32721,1730,-32722,1719,-32722,1708,-32723,1697,-32724,1685,-32724,1674,-32725,1663,-32725,1652,-32726,1641,-32726,1630,-32727,1618,-32727,1607,-32728,1596,-32729,1585,-32729,1574,-32730,1563,-32730,1552,-32731,1540,-32731,1529,-32732,1518,-32732,1507,-32733,1496,-32733,1485,-32734,1473,-32734,1462,-32735,1451,-32735,1440,-32736,1429,-32736,1418,-32737,1406,-32737,1395,-32738,1384,-32738,1373,-32739,1362,-32739,1351,-32740,1339,-32740,1328,-32741,1317,-32741,1306,-32741,1295,-32742,1284,-32742,1273,-32743,1261,-32743,1250,-32744,1239,-32744,1228,-32744,1217,-32745,1206,-32745,1194,-32746,1183,-32746,1172,-32747,1161,-32747,1150,-32747,1139,-32748,1127,-32748,1116,-32748,1105,-32749,1094,-32749,1083,-32750,1072,-32750,1060,-32750,1049,-32751,1038,-32751,1027,-32751,1016,-32752,1005,-32752,993,-32752,982,-32753,971,-32753,960,-32753,949,-32754,938,-32754,926,-32754,915,-32755,904,-32755,893,-32755,882,-32756,871,-32756,859,-32756,848,-32757,837,-32757,826,-32757,815,-32757,804,-32758,792,-32758,781,-32758,770,-32758,759,-32759,748,-32759,737,-32759,725,-32759,714,-32760,703,-32760,692,-32760,681,-32760,670,-32761,658,-32761,647,-32761,636,-32761,625,-32762,614,-32762,603,-32762,591,-32762,580,-32762,569,-32763,558,-32763,547,-32763,536,-32763,524,-32763,513,-32763,502,-32764,491,-32764,480,-32764,469,-32764,457,-32764,446,-32764,435,-32765,424,-32765,413,-32765,402,-32765,390,-32765,379,-32765,368,-32765,357,-32766,346,-32766,335,-32766,323,-32766,312,-32766,301,-32766,290,-32766,279,-32766,268,-32766,256,-32766,245,-32767,234,-32767,223,-32767,212,-32767,201,-32767,189,-32767,178,-32767,167,-32767,156,-32767,145,-32767,134,-32767,122,-32767,111,-32767,100,-32767,89,-32767,78,-32767,67,-32767,55,-32767,44,-32767,33,-32767,22,-32767,11,-32767,0,-32767,-12,-32767,-23,-32767,-34,-32767,-45,-32767,-56,-32767,-68,-32767,-79,-32767,-90,-32767,-101,-32767,-112,-32767,-123,-32767,-135,-32767,-146,-32767,-157,-32767,-168,-32767,-179,-32767,-190,-32767,-202,-32767,-213,-32767,-224,-32767,-235,-32767,-246,-32767,-257,-32766,-269,-32766,-280,-32766,-291,-32766,-302,-32766,-313,-32766,-324,-32766,-336,-32766,-347,-32766,-358,-32766,-369,-32765,-380,-32765,-391,-32765,-403,-32765,-414,-32765,-425,-32765,-436,-32765,-447,-32764,-458,-32764,-470,-32764,-481,-32764,-492,-32764,-503,-32764,-514,-32763,-525,-32763,-537,-32763,-548,-32763,-559,-32763,-570,-32763,-581,-32762,-592,-32762,-604,-32762,-615,-32762,-626,-32762,-637,-32761,-648,-32761,-659,-32761,-671,-32761,-682,-32760,-693,-32760,-704,-32760,-715,-32760,-726,-32759,-738,-32759,-749,-32759,-760,-32759,-771,-32758,-782,-32758,-793,-32758,-805,-32758,-816,-32757,-827,-32757,-838,-32757,-849,-32757,-860,-32756,-872,-32756,-883,-32756,-894,-32755,-905,-32755,-916,-32755,-927,-32754,-939,-32754,-950,-32754,-961,-32753,-972,-32753,-983,-32753,-994,-32752,-1006,-32752,-1017,-32752,-1028,-32751,-1039,-32751,-1050,-32751,-1061,-32750,-1073,-32750,-1084,-32750,-1095,-32749,-1106,-32749,-1117,-32748,-1128,-32748,-1140,-32748,-1151,-32747,-1162,-32747,-1173,-32747,-1184,-32746,-1195,-32746,-1207,-32745,-1218,-32745,-1229,-32744,-1240,-32744,-1251,-32744,-1262,-32743,-1274,-32743,-1285,-32742,-1296,-32742,-1307,-32741,-1318,-32741,-1329,-32741,-1340,-32740,-1352,-32740,-1363,-32739,-1374,-32739,-1385,-32738,-1396,-32738,-1407,-32737,-1419,-32737,-1430,-32736,-1441,-32736,-1452,-32735,-1463,-32735,-1474,-32734,-1486,-32734,-1497,-32733,-1508,-32733,-1519,-32732,-1530,-32732,-1541,-32731,-1553,-32731,-1564,-32730,-1575,-32730,-1586,-32729,-1597,-32729,-1608,-32728,-1619,-32727,-1631,-32727,-1642,-32726,-1653,-32726,-1664,-32725,-1675,-32725,-1686,-32724,-1698,-32724,-1709,-32723,-1720,-32722,-1731,-32722,-1742,-32721,-1753,-32721,-1764,-32720,-1776,-32719,-1787,-32719,-1798,-32718,-1809,-32718,-1820,-32717,-1831,-32716,-1843,-32716,-1854,-32715,-1865,-32714,-1876,-32714,-1887,-32713,-1898,-32712,-1909,-32712,-1921,-32711,-1932,-32711,-1943,-32710,-1954,-32709,-1965,-32709,-1976,-32708,-1987,-32707,-1999,-32707,-2010,-32706,-2021,-32705,-2032,-32704,-2043,-32704,-2054,-32703,-2066,-32702,-2077,-32702,-2088,-32701,-2099,-32700,-2110,-32700,-2121,-32699,-2132,-32698,-2144,-32697,-2155,-32697,-2166,-32696,-2177,-32695,-2188,-32694,-2199,-32694,-2210,-32693,-2222,-32692,-2233,-32691,-2244,-32691,-2255,-32690,-2266,-32689,-2277,-32688,-2288,-32688,-2300,-32687,-2311,-32686,-2322,-32685,-2333,-32684,-2344,-32684,-2355,-32683,-2366,-32682,-2378,-32681,-2389,-32680,-2400,-32680,-2411,-32679,-2422,-32678,-2433,-32677,-2444,-32676,-2456,-32675,-2467,-32675,-2478,-32674,-2489,-32673,-2500,-32672,-2511,-32671,-2522,-32670,-2534,-32669,-2545,-32669,-2556,-32668,-2567,-32667,-2578,-32666,-2589,-32665,-2600,-32664,-2611,-32663,-2623,-32662,-2634,-32662,-2645,-32661,-2656,-32660,-2667,-32659,-2678,-32658,-2689,-32657,-2701,-32656,-2712,-32655,-2723,-32654,-2734,-32653,-2745,-32652,-2756,-32651,-2767,-32650,-2778,-32650,-2790,-32649,-2801,-32648,-2812,-32647,-2823,-32646,-2834,-32645,-2845,-32644,-2856,-32643,-2867,-32642,-2879,-32641,-2890,-32640,-2901,-32639,-2912,-32638,-2923,-32637,-2934,-32636,-2945,-32635,-2956,-32634,-2968,-32633,-2979,-32632,-2990,-32631,-3001,-32630,-3012,-32629,-3023,-32628,-3034,-32627,-3045,-32626,-3057,-32625,-3068,-32624,-3079,-32623,-3090,-32622,-3101,-32620,-3112,-32619,-3123,-32618,-3134,-32617,-3146,-32616,-3157,-32615,-3168,-32614,-3179,-32613,-3190,-32612,-3201,-32611,-3212,-32610,-3223,-32609,-3234,-32608,-3246,-32606,-3257,-32605,-3268,-32604,-3279,-32603,-3290,-32602,-3301,-32601,-3312,-32600,-3323,-32599,-3334,-32597,-3346,-32596,-3357,-32595,-3368,-32594,-3379,-32593,-3390,-32592,-3401,-32591,-3412,-32589,-3423,-32588,-3434,-32587,-3446,-32586,-3457,-32585,-3468,-32584,-3479,-32582,-3490,-32581,-3501,-32580,-3512,-32579,-3523,-32578,-3534,-32576,-3546,-32575,-3557,-32574,-3568,-32573,-3579,-32572,-3590,-32570,-3601,-32569,-3612,-32568,-3623,-32567,-3634,-32565,-3645,-32564,-3657,-32563,-3668,-32562,-3679,-32560,-3690,-32559,-3701,-32558,-3712,-32557,-3723,-32555,-3734,-32554,-3745,-32553,-3756,-32552,-3768,-32550,-3779,-32549,-3790,-32548,-3801,-32546,-3812,-32545,-3823,-32544,-3834,-32542,-3845,-32541,-3856,-32540,-3867,-32539,-3878,-32537,-3890,-32536,-3901,-32535,-3912,-32533,-3923,-32532,-3934,-32531,-3945,-32529,-3956,-32528,-3967,-32527,-3978,-32525,-3989,-32524,-4000,-32522,-4012,-32521,-4023,-32520,-4034,-32518,-4045,-32517,-4056,-32516,-4067,-32514,-4078,-32513,-4089,-32511,-4100,-32510,-4111,-32509,-4122,-32507,-4133,-32506,-4145,-32504,-4156,-32503,-4167,-32502,-4178,-32500,-4189,-32499,-4200,-32497,-4211,-32496,-4222,-32494,-4233,-32493,-4244,-32492,-4255,-32490,-4266,-32489,-4277,-32487,-4289,-32486,-4300,-32484,-4311,-32483,-4322,-32481,-4333,-32480,-4344,-32478,-4355,-32477,-4366,-32475,-4377,-32474,-4388,-32472,-4399,-32471,-4410,-32469,-4421,-32468,-4432,-32466,-4444,-32465,-4455,-32463,-4466,-32462,-4477,-32460,-4488,-32459,-4499,-32457,-4510,-32456,-4521,-32454,-4532,-32453,-4543,-32451,-4554,-32450,-4565,-32448,-4576,-32446,-4587,-32445,-4598,-32443,-4609,-32442,-4621,-32440,-4632,-32439,-4643,-32437,-4654,-32435,-4665,-32434,-4676,-32432,-4687,-32431,-4698,-32429,-4709,-32427,-4720,-32426,-4731,-32424,-4742,-32423,-4753,-32421,-4764,-32419,-4775,-32418,-4786,-32416,-4797,-32414,-4808,-32413,-4819,-32411,-4831,-32410,-4842,-32408,-4853,-32406,-4864,-32405,-4875,-32403,-4886,-32401,-4897,-32400,-4908,-32398,-4919,-32396,-4930,-32395,-4941,-32393,-4952,-32391,-4963,-32390,-4974,-32388,-4985,-32386,-4996,-32384,-5007,-32383,-5018,-32381,-5029,-32379,-5040,-32378,-5051,-32376,-5062,-32374,-5073,-32372,-5084,-32371,-5095,-32369,-5107,-32367,-5118,-32365,-5129,-32364,-5140,-32362,-5151,-32360,-5162,-32358,-5173,-32357,-5184,-32355,-5195,-32353,-5206,-32351,-5217,-32350,-5228,-32348,-5239,-32346,-5250,-32344,-5261,-32342,-5272,-32341,-5283,-32339,-5294,-32337,-5305,-32335,-5316,-32333,-5327,-32332,-5338,-32330,-5349,-32328,-5360,-32326,-5371,-32324,-5382,-32323,-5393,-32321,-5404,-32319,-5415,-32317,-5426,-32315,-5437,-32313,-5448,-32311,-5459,-32310,-5470,-32308,-5481,-32306,-5492,-32304,-5503,-32302,-5514,-32300,-5525,-32298,-5536,-32296,-5547,-32295,-5558,-32293,-5569,-32291,-5580,-32289,-5591,-32287,-5602,-32285,-5613,-32283,-5624,-32281,-5635,-32279,-5646,-32277,-5657,-32275,-5668,-32274,-5679,-32272,-5690,-32270,-5701,-32268,-5712,-32266,-5723,-32264,-5734,-32262,-5745,-32260,-5756,-32258,-5767,-32256,-5778,-32254,-5789,-32252,-5800,-32250,-5811,-32248,-5822,-32246,-5833,-32244,-5844,-32242,-5855,-32240,-5866,-32238,-5877,-32236,-5888,-32234,-5899,-32232,-5910,-32230,-5921,-32228,-5932,-32226,-5943,-32224,-5954,-32222,-5965,-32220,-5976,-32218,-5987,-32216,-5998,-32214,-6009,-32212,-6020,-32210,-6031,-32208,-6042,-32206,-6053,-32204,-6064,-32202,-6075,-32200,-6086,-32197,-6097,-32195,-6108,-32193,-6119,-32191,-6130,-32189,-6141,-32187,-6152,-32185,-6163,-32183,-6174,-32181,-6185,-32179,-6196,-32177,-6207,-32174,-6218,-32172,-6229,-32170,-6240,-32168,-6251,-32166,-6262,-32164,-6272,-32162,-6283,-32159,-6294,-32157,-6305,-32155,-6316,-32153,-6327,-32151,-6338,-32149,-6349,-32147,-6360,-32144,-6371,-32142,-6382,-32140,-6393,-32138,-6404,-32136,-6415,-32134,-6426,-32131,-6437,-32129,-6448,-32127,-6459,-32125,-6470,-32123,-6481,-32120,-6492,-32118,-6503,-32116,-6513,-32114,-6524,-32111,-6535,-32109,-6546,-32107,-6557,-32105,-6568,-32103,-6579,-32100,-6590,-32098,-6601,-32096,-6612,-32094,-6623,-32091,-6634,-32089,-6645,-32087,-6656,-32085,-6667,-32082,-6678,-32080,-6689,-32078,-6699,-32075,-6710,-32073,-6721,-32071,-6732,-32069,-6743,-32066,-6754,-32064,-6765,-32062,-6776,-32059,-6787,-32057,-6798,-32055,-6809,-32052,-6820,-32050,-6831,-32048,-6842,-32045,-6852,-32043,-6863,-32041,-6874,-32038,-6885,-32036,-6896,-32034,-6907,-32031,-6918,-32029,-6929,-32027,-6940,-32024,-6951,-32022,-6962,-32020,-6973,-32017,-6983,-32015,-6994,-32012,-7005,-32010,-7016,-32008,-7027,-32005,-7038,-32003,-7049,-32000,-7060,-31998,-7071,-31996,-7082,-31993,-7093,-31991,-7103,-31988,-7114,-31986,-7125,-31984,-7136,-31981,-7147,-31979,-7158,-31976,-7169,-31974,-7180,-31971,-7191,-31969,-7202,-31966,-7212,-31964,-7223,-31962,-7234,-31959,-7245,-31957,-7256,-31954,-7267,-31952,-7278,-31949,-7289,-31947,-7300,-31944,-7311,-31942,-7321,-31939,-7332,-31937,-7343,-31934,-7354,-31932,-7365,-31929,-7376,-31927,-7387,-31924,-7398,-31922,-7408,-31919,-7419,-31917,-7430,-31914,-7441,-31912,-7452,-31909,-7463,-31906,-7474,-31904,-7485,-31901,-7495,-31899,-7506,-31896,-7517,-31894,-7528,-31891,-7539,-31889,-7550,-31886,-7561,-31883,-7572,-31881,-7582,-31878,-7593,-31876,-7604,-31873,-7615,-31870,-7626,-31868,-7637,-31865,-7648,-31863,-7658,-31860,-7669,-31857,-7680,-31855,-7691,-31852,-7702,-31850,-7713,-31847,-7724,-31844,-7734,-31842,-7745,-31839,-7756,-31836,-7767,-31834,-7778,-31831,-7789,-31828,-7800,-31826,-7810,-31823,-7821,-31820,-7832,-31818,-7843,-31815,-7854,-31812,-7865,-31810,-7876,-31807,-7886,-31804,-7897,-31802,-7908,-31799,-7919,-31796,-7930,-31794,-7941,-31791,-7951,-31788,-7962,-31786,-7973,-31783,-7984,-31780,-7995,-31777,-8006,-31775,-8016,-31772,-8027,-31769,-8038,-31766,-8049,-31764,-8060,-31761,-8071,-31758,-8081,-31755,-8092,-31753,-8103,-31750,-8114,-31747,-8125,-31744,-8135,-31742,-8146,-31739,-8157,-31736,-8168,-31733,-8179,-31730,-8190,-31728,-8200,-31725,-8211,-31722,-8222,-31719,-8233,-31717,-8244,-31714,-8254,-31711,-8265,-31708,-8276,-31705,-8287,-31702,-8298,-31700,-8308,-31697,-8319,-31694,-8330,-31691,-8341,-31688,-8352,-31685,-8362,-31683,-8373,-31680,-8384,-31677,-8395,-31674,-8406,-31671,-8416,-31668,-8427,-31665,-8438,-31663,-8449,-31660,-8460,-31657,-8470,-31654,-8481,-31651,-8492,-31648,-8503,-31645,-8514,-31642,-8524,-31639,-8535,-31636,-8546,-31634,-8557,-31631,-8568,-31628,-8578,-31625,-8589,-31622,-8600,-31619,-8611,-31616,-8621,-31613,-8632,-31610,-8643,-31607,-8654,-31604,-8664,-31601,-8675,-31598,-8686,-31595,-8697,-31592,-8708,-31589,-8718,-31587,-8729,-31584,-8740,-31581,-8751,-31578,-8761,-31575,-8772,-31572,-8783,-31569,-8794,-31566,-8804,-31563,-8815,-31560,-8826,-31557,-8837,-31554,-8847,-31551,-8858,-31548,-8869,-31545,-8880,-31542,-8890,-31538,-8901,-31535,-8912,-31532,-8923,-31529,-8933,-31526,-8944,-31523,-8955,-31520,-8966,-31517,-8976,-31514,-8987,-31511,-8998,-31508,-9009,-31505,-9019,-31502,-9030,-31499,-9041,-31496,-9052,-31493,-9062,-31490,-9073,-31486,-9084,-31483,-9095,-31480,-9105,-31477,-9116,-31474,-9127,-31471,-9137,-31468,-9148,-31465,-9159,-31462,-9170,-31458,-9180,-31455,-9191,-31452,-9202,-31449,-9213,-31446,-9223,-31443,-9234,-31440,-9245,-31436,-9255,-31433,-9266,-31430,-9277,-31427,-9288,-31424,-9298,-31421,-9309,-31418,-9320,-31414,-9330,-31411,-9341,-31408,-9352,-31405,-9363,-31402,-9373,-31398,-9384,-31395,-9395,-31392,-9405,-31389,-9416,-31386,-9427,-31382,-9437,-31379,-9448,-31376,-9459,-31373,-9469,-31370,-9480,-31366,-9491,-31363,-9502,-31360,-9512,-31357,-9523,-31353,-9534,-31350,-9544,-31347,-9555,-31344,-9566,-31340,-9576,-31337,-9587,-31334,-9598,-31331,-9608,-31327,-9619,-31324,-9630,-31321,-9640,-31317,-9651,-31314,-9662,-31311,-9672,-31308,-9683,-31304,-9694,-31301,-9704,-31298,-9715,-31294,-9726,-31291,-9736,-31288,-9747,-31284,-9758,-31281,-9768,-31278,-9779,-31274,-9790,-31271,-9800,-31268,-9811,-31264,-9822,-31261,-9832,-31258,-9843,-31254,-9854,-31251,-9864,-31248,-9875,-31244,-9886,-31241,-9896,-31237,-9907,-31234,-9918,-31231,-9928,-31227,-9939,-31224,-9950,-31221,-9960,-31217,-9971,-31214,-9981,-31210,-9992,-31207,-10003,-31204,-10013,-31200,-10024,-31197,-10035,-31193,-10045,-31190,-10056,-31186,-10067,-31183,-10077,-31180,-10088,-31176,-10098,-31173,-10109,-31169,-10120,-31166,-10130,-31162,-10141,-31159,-10152,-31155,-10162,-31152,-10173,-31149,-10183,-31145,-10194,-31142,-10205,-31138,-10215,-31135,-10226,-31131,-10236,-31128,-10247,-31124,-10258,-31121,-10268,-31117,-10279,-31114,-10290,-31110,-10300,-31107,-10311,-31103,-10321,-31100,-10332,-31096,-10343,-31093,-10353,-31089,-10364,-31086,-10374,-31082,-10385,-31078,-10396,-31075,-10406,-31071,-10417,-31068,-10427,-31064,-10438,-31061,-10448,-31057,-10459,-31054,-10470,-31050,-10480,-31046,-10491,-31043,-10501,-31039,-10512,-31036,-10523,-31032,-10533,-31029,-10544,-31025,-10554,-31021,-10565,-31018,-10575,-31014,-10586,-31011,-10597,-31007,-10607,-31003,-10618,-31000,-10628,-30996,-10639,-30992,-10649,-30989,-10660,-30985,-10671,-30982,-10681,-30978,-10692,-30974,-10702,-30971,-10713,-30967,-10723,-30963,-10734,-30960,-10744,-30956,-10755,-30952,-10766,-30949,-10776,-30945,-10787,-30941,-10797,-30938,-10808,-30934,-10818,-30930,-10829,-30927,-10839,-30923,-10850,-30919,-10860,-30916,-10871,-30912,-10881,-30908,-10892,-30904,-10903,-30901,-10913,-30897,-10924,-30893,-10934,-30890,-10945,-30886,-10955,-30882,-10966,-30878,-10976,-30875,-10987,-30871,-10997,-30867,-11008,-30863,-11018,-30860,-11029,-30856,-11039,-30852,-11050,-30848,-11060,-30845,-11071,-30841,-11081,-30837,-11092,-30833,-11102,-30829,-11113,-30826,-11123,-30822,-11134,-30818,-11144,-30814,-11155,-30810,-11165,-30807,-11176,-30803,-11186,-30799,-11197,-30795,-11207,-30791,-11218,-30788,-11228,-30784,-11239,-30780,-11249,-30776,-11260,-30772,-11270,-30768,-11281,-30765,-11291,-30761,-11302,-30757,-11312,-30753,-11323,-30749,-11333,-30745,-11344,-30741,-11354,-30738,-11365,-30734,-11375,-30730,-11386,-30726,-11396,-30722,-11407,-30718,-11417,-30714,-11428,-30710,-11438,-30706,-11449,-30703,-11459,-30699,-11469,-30695,-11480,-30691,-11490,-30687,-11501,-30683,-11511,-30679,-11522,-30675,-11532,-30671,-11543,-30667,-11553,-30663,-11564,-30659,-11574,-30656,-11584,-30652,-11595,-30648,-11605,-30644,-11616,-30640,-11626,-30636,-11637,-30632,-11647,-30628,-11658,-30624,-11668,-30620,-11678,-30616,-11689,-30612,-11699,-30608,-11710,-30604,-11720,-30600,-11731,-30596,-11741,-30592,-11751,-30588,-11762,-30584,-11772,-30580,-11783,-30576,-11793,-30572,-11804,-30568,-11814,-30564,-11824,-30560,-11835,-30556,-11845,-30552,-11856,-30548,-11866,-30544,-11877,-30540,-11887,-30536,-11897,-30531,-11908,-30527,-11918,-30523,-11929,-30519,-11939,-30515,-11949,-30511,-11960,-30507,-11970,-30503,-11981,-30499,-11991,-30495,-12001,-30491,-12012,-30487,-12022,-30483,-12033,-30478,-12043,-30474,-12053,-30470,-12064,-30466,-12074,-30462,-12084,-30458,-12095,-30454,-12105,-30450,-12116,-30446,-12126,-30441,-12136,-30437,-12147,-30433,-12157,-30429,-12167,-30425,-12178,-30421,-12188,-30417,-12199,-30412,-12209,-30408,-12219,-30404,-12230,-30400,-12240,-30396,-12250,-30392,-12261,-30387,-12271,-30383,-12281,-30379,-12292,-30375,-12302,-30371,-12313,-30366,-12323,-30362,-12333,-30358,-12344,-30354,-12354,-30350,-12364,-30345,-12375,-30341,-12385,-30337,-12395,-30333,-12406,-30329,-12416,-30324,-12426,-30320,-12437,-30316,-12447,-30312,-12457,-30307,-12468,-30303,-12478,-30299,-12488,-30295,-12499,-30290,-12509,-30286,-12519,-30282,-12530,-30278,-12540,-30273,-12550,-30269,-12561,-30265,-12571,-30260,-12581,-30256,-12591,-30252,-12602,-30248,-12612,-30243,-12622,-30239,-12633,-30235,-12643,-30230,-12653,-30226,-12664,-30222,-12674,-30217,-12684,-30213,-12695,-30209,-12705,-30204,-12715,-30200,-12725,-30196,-12736,-30191,-12746,-30187,-12756,-30183,-12767,-30178,-12777,-30174,-12787,-30170,-12797,-30165,-12808,-30161,-12818,-30157,-12828,-30152,-12839,-30148,-12849,-30143,-12859,-30139,-12869,-30135,-12880,-30130,-12890,-30126,-12900,-30122,-12910,-30117,-12921,-30113,-12931,-30108,-12941,-30104,-12951,-30099,-12962,-30095,-12972,-30091,-12982,-30086,-12993,-30082,-13003,-30077,-13013,-30073,-13023,-30068,-13034,-30064,-13044,-30060,-13054,-30055,-13064,-30051,-13075,-30046,-13085,-30042,-13095,-30037,-13105,-30033,-13115,-30028,-13126,-30024,-13136,-30019,-13146,-30015,-13156,-30010,-13167,-30006,-13177,-30002,-13187,-29997,-13197,-29993,-13208,-29988,-13218,-29984,-13228,-29979,-13238,-29974,-13248,-29970,-13259,-29965,-13269,-29961,-13279,-29956,-13289,-29952,-13299,-29947,-13310,-29943,-13320,-29938,-13330,-29934,-13340,-29929,-13350,-29925,-13361,-29920,-13371,-29916,-13381,-29911,-13391,-29906,-13401,-29902,-13412,-29897,-13422,-29893,-13432,-29888,-13442,-29884,-13452,-29879,-13463,-29874,-13473,-29870,-13483,-29865,-13493,-29861,-13503,-29856,-13513,-29851,-13524,-29847,-13534,-29842,-13544,-29838,-13554,-29833,-13564,-29828,-13575,-29824,-13585,-29819,-13595,-29814,-13605,-29810,-13615,-29805,-13625,-29801,-13635,-29796,-13646,-29791,-13656,-29787,-13666,-29782,-13676,-29777,-13686,-29773,-13696,-29768,-13707,-29763,-13717,-29759,-13727,-29754,-13737,-29749,-13747,-29745,-13757,-29740,-13767,-29735,-13778,-29730,-13788,-29726,-13798,-29721,-13808,-29716,-13818,-29712,-13828,-29707,-13838,-29702,-13848,-29697,-13859,-29693,-13869,-29688,-13879,-29683,-13889,-29679,-13899,-29674,-13909,-29669,-13919,-29664,-13929,-29660,-13939,-29655,-13950,-29650,-13960,-29645,-13970,-29641,-13980,-29636,-13990,-29631,-14000,-29626,-14010,-29622,-14020,-29617,-14030,-29612,-14040,-29607,-14051,-29602,-14061,-29598,-14071,-29593,-14081,-29588,-14091,-29583,-14101,-29578,-14111,-29574,-14121,-29569,-14131,-29564,-14141,-29559,-14151,-29554,-14161,-29549,-14172,-29545,-14182,-29540,-14192,-29535,-14202,-29530,-14212,-29525,-14222,-29520,-14232,-29516,-14242,-29511,-14252,-29506,-14262,-29501,-14272,-29496,-14282,-29491,-14292,-29486,-14302,-29482,-14312,-29477,-14322,-29472,-14332,-29467,-14343,-29462,-14353,-29457,-14363,-29452,-14373,-29447,-14383,-29442,-14393,-29438,-14403,-29433,-14413,-29428,-14423,-29423,-14433,-29418,-14443,-29413,-14453,-29408,-14463,-29403,-14473,-29398,-14483,-29393,-14493,-29388,-14503,-29383,-14513,-29378,-14523,-29373,-14533,-29369,-14543,-29364,-14553,-29359,-14563,-29354,-14573,-29349,-14583,-29344,-14593,-29339,-14603,-29334,-14613,-29329,-14623,-29324,-14633,-29319,-14643,-29314,-14653,-29309,-14663,-29304,-14673,-29299,-14683,-29294,-14693,-29289,-14703,-29284,-14713,-29279,-14723,-29274,-14733,-29269,-14743,-29264,-14753,-29259,-14763,-29254,-14773,-29249,-14783,-29244,-14793,-29239,-14803,-29234,-14813,-29228,-14823,-29223,-14833,-29218,-14843,-29213,-14853,-29208,-14862,-29203,-14872,-29198,-14882,-29193,-14892,-29188,-14902,-29183,-14912,-29178,-14922,-29173,-14932,-29168,-14942,-29163,-14952,-29157,-14962,-29152,-14972,-29147,-14982,-29142,-14992,-29137,-15002,-29132,-15012,-29127,-15022,-29122,-15031,-29117,-15041,-29111,-15051,-29106,-15061,-29101,-15071,-29096,-15081,-29091,-15091,-29086,-15101,-29081,-15111,-29075,-15121,-29070,-15131,-29065,-15141,-29060,-15150,-29055,-15160,-29050,-15170,-29045,-15180,-29039,-15190,-29034,-15200,-29029,-15210,-29024,-15220,-29019,-15230,-29013,-15239,-29008,-15249,-29003,-15259,-28998,-15269,-28993,-15279,-28987,-15289,-28982,-15299,-28977,-15309,-28972,-15319,-28967,-15328,-28961,-15338,-28956,-15348,-28951,-15358,-28946,-15368,-28940,-15378,-28935,-15388,-28930,-15397,-28925,-15407,-28919,-15417,-28914,-15427,-28909,-15437,-28904,-15447,-28898,-15457,-28893,-15466,-28888,-15476,-28883,-15486,-28877,-15496,-28872,-15506,-28867,-15516,-28861,-15526,-28856,-15535,-28851,-15545,-28846,-15555,-28840,-15565,-28835,-15575,-28830,-15584,-28824,-15594,-28819,-15604,-28814,-15614,-28808,-15624,-28803,-15634,-28798,-15643,-28792,-15653,-28787,-15663,-28782,-15673,-28776,-15683,-28771,-15692,-28766,-15702,-28760,-15712,-28755,-15722,-28750,-15732,-28744,-15741,-28739,-15751,-28734,-15761,-28728,-15771,-28723,-15781,-28717,-15790,-28712,-15800,-28707,-15810,-28701,-15820,-28696,-15830,-28691,-15839,-28685,-15849,-28680,-15859,-28674,-15869,-28669,-15878,-28663,-15888,-28658,-15898,-28653,-15908,-28647,-15918,-28642,-15927,-28636,-15937,-28631,-15947,-28626,-15957,-28620,-15966,-28615,-15976,-28609,-15986,-28604,-15996,-28598,-16005,-28593,-16015,-28587,-16025,-28582,-16035,-28576,-16044,-28571,-16054,-28566,-16064,-28560,-16073,-28555,-16083,-28549,-16093,-28544,-16103,-28538,-16112,-28533,-16122,-28527,-16132,-28522,-16142,-28516,-16151,-28511,-16161,-28505,-16171,-28500,-16180,-28494,-16190,-28489,-16200,-28483,-16210,-28478,-16219,-28472,-16229,-28466,-16239,-28461,-16248,-28455,-16258,-28450,-16268,-28444,-16277,-28439,-16287,-28433,-16297,-28428,-16307,-28422,-16316,-28417,-16326,-28411,-16336,-28405,-16345,-28400,-16355,-28394,-16365,-28389,-16374,-28383}; + +int16_t twb18432[12288] = { 32767,0,32766,-23,32766,-45,32766,-68,32766,-90,32766,-112,32766,-135,32766,-157,32766,-179,32766,-202,32766,-224,32766,-246,32765,-269,32765,-291,32765,-313,32765,-336,32765,-358,32764,-380,32764,-403,32764,-425,32763,-447,32763,-470,32763,-492,32762,-514,32762,-537,32762,-559,32761,-581,32761,-604,32761,-626,32760,-648,32760,-671,32759,-693,32759,-715,32758,-738,32758,-760,32757,-782,32757,-805,32756,-827,32756,-849,32755,-872,32754,-894,32754,-916,32753,-939,32752,-961,32752,-983,32751,-1006,32750,-1028,32750,-1050,32749,-1073,32748,-1095,32747,-1117,32747,-1140,32746,-1162,32745,-1184,32744,-1207,32743,-1229,32743,-1251,32742,-1274,32741,-1296,32740,-1318,32739,-1340,32738,-1363,32737,-1385,32736,-1407,32735,-1430,32734,-1452,32733,-1474,32732,-1497,32731,-1519,32730,-1541,32729,-1564,32728,-1586,32727,-1608,32726,-1631,32725,-1653,32724,-1675,32723,-1698,32721,-1720,32720,-1742,32719,-1764,32718,-1787,32717,-1809,32715,-1831,32714,-1854,32713,-1876,32711,-1898,32710,-1921,32709,-1943,32708,-1965,32706,-1987,32705,-2010,32703,-2032,32702,-2054,32701,-2077,32699,-2099,32698,-2121,32696,-2144,32695,-2166,32693,-2188,32692,-2210,32690,-2233,32689,-2255,32687,-2277,32686,-2300,32684,-2322,32683,-2344,32681,-2366,32679,-2389,32678,-2411,32676,-2433,32674,-2456,32673,-2478,32671,-2500,32669,-2522,32668,-2545,32666,-2567,32664,-2589,32662,-2611,32661,-2634,32659,-2656,32657,-2678,32655,-2701,32653,-2723,32651,-2745,32649,-2767,32648,-2790,32646,-2812,32644,-2834,32642,-2856,32640,-2879,32638,-2901,32636,-2923,32634,-2945,32632,-2968,32630,-2990,32628,-3012,32626,-3034,32624,-3057,32622,-3079,32619,-3101,32617,-3123,32615,-3146,32613,-3168,32611,-3190,32609,-3212,32607,-3234,32604,-3257,32602,-3279,32600,-3301,32598,-3323,32595,-3346,32593,-3368,32591,-3390,32588,-3412,32586,-3434,32584,-3457,32581,-3479,32579,-3501,32577,-3523,32574,-3546,32572,-3568,32569,-3590,32567,-3612,32564,-3634,32562,-3657,32559,-3679,32557,-3701,32554,-3723,32552,-3745,32549,-3768,32547,-3790,32544,-3812,32541,-3834,32539,-3856,32536,-3878,32534,-3901,32531,-3923,32528,-3945,32526,-3967,32523,-3989,32520,-4012,32517,-4034,32515,-4056,32512,-4078,32509,-4100,32506,-4122,32503,-4145,32501,-4167,32498,-4189,32495,-4211,32492,-4233,32489,-4255,32486,-4277,32483,-4300,32480,-4322,32477,-4344,32474,-4366,32471,-4388,32468,-4410,32465,-4432,32462,-4455,32459,-4477,32456,-4499,32453,-4521,32450,-4543,32447,-4565,32444,-4587,32441,-4609,32438,-4632,32434,-4654,32431,-4676,32428,-4698,32425,-4720,32422,-4742,32418,-4764,32415,-4786,32412,-4808,32409,-4831,32405,-4853,32402,-4875,32399,-4897,32395,-4919,32392,-4941,32389,-4963,32385,-4985,32382,-5007,32378,-5029,32375,-5051,32371,-5073,32368,-5095,32364,-5118,32361,-5140,32357,-5162,32354,-5184,32350,-5206,32347,-5228,32343,-5250,32340,-5272,32336,-5294,32332,-5316,32329,-5338,32325,-5360,32322,-5382,32318,-5404,32314,-5426,32310,-5448,32307,-5470,32303,-5492,32299,-5514,32295,-5536,32292,-5558,32288,-5580,32284,-5602,32280,-5624,32276,-5646,32273,-5668,32269,-5690,32265,-5712,32261,-5734,32257,-5756,32253,-5778,32249,-5800,32245,-5822,32241,-5844,32237,-5866,32233,-5888,32229,-5910,32225,-5932,32221,-5954,32217,-5976,32213,-5998,32209,-6020,32205,-6042,32201,-6064,32196,-6086,32192,-6108,32188,-6130,32184,-6152,32180,-6174,32176,-6196,32171,-6218,32167,-6240,32163,-6262,32158,-6283,32154,-6305,32150,-6327,32146,-6349,32141,-6371,32137,-6393,32133,-6415,32128,-6437,32124,-6459,32119,-6481,32115,-6503,32110,-6524,32106,-6546,32102,-6568,32097,-6590,32093,-6612,32088,-6634,32084,-6656,32079,-6678,32074,-6699,32070,-6721,32065,-6743,32061,-6765,32056,-6787,32051,-6809,32047,-6831,32042,-6852,32037,-6874,32033,-6896,32028,-6918,32023,-6940,32019,-6962,32014,-6983,32009,-7005,32004,-7027,31999,-7049,31995,-7071,31990,-7093,31985,-7114,31980,-7136,31975,-7158,31970,-7180,31965,-7202,31961,-7223,31956,-7245,31951,-7267,31946,-7289,31941,-7311,31936,-7332,31931,-7354,31926,-7376,31921,-7398,31916,-7419,31911,-7441,31905,-7463,31900,-7485,31895,-7506,31890,-7528,31885,-7550,31880,-7572,31875,-7593,31869,-7615,31864,-7637,31859,-7658,31854,-7680,31849,-7702,31843,-7724,31838,-7745,31833,-7767,31827,-7789,31822,-7810,31817,-7832,31811,-7854,31806,-7876,31801,-7897,31795,-7919,31790,-7941,31785,-7962,31779,-7984,31774,-8006,31768,-8027,31763,-8049,31757,-8071,31752,-8092,31746,-8114,31741,-8135,31735,-8157,31729,-8179,31724,-8200,31718,-8222,31713,-8244,31707,-8265,31701,-8287,31696,-8308,31690,-8330,31684,-8352,31679,-8373,31673,-8395,31667,-8416,31662,-8438,31656,-8460,31650,-8481,31644,-8503,31638,-8524,31633,-8546,31627,-8568,31621,-8589,31615,-8611,31609,-8632,31603,-8654,31597,-8675,31591,-8697,31586,-8718,31580,-8740,31574,-8761,31568,-8783,31562,-8804,31556,-8826,31550,-8847,31544,-8869,31537,-8890,31531,-8912,31525,-8933,31519,-8955,31513,-8976,31507,-8998,31501,-9019,31495,-9041,31489,-9062,31482,-9084,31476,-9105,31470,-9127,31464,-9148,31457,-9170,31451,-9191,31445,-9213,31439,-9234,31432,-9255,31426,-9277,31420,-9298,31413,-9320,31407,-9341,31401,-9363,31394,-9384,31388,-9405,31381,-9427,31375,-9448,31369,-9469,31362,-9491,31356,-9512,31349,-9534,31343,-9555,31336,-9576,31330,-9598,31323,-9619,31316,-9640,31310,-9662,31303,-9683,31297,-9704,31290,-9726,31283,-9747,31277,-9768,31270,-9790,31263,-9811,31257,-9832,31250,-9854,31243,-9875,31236,-9896,31230,-9918,31223,-9939,31216,-9960,31209,-9981,31203,-10003,31196,-10024,31189,-10045,31182,-10067,31175,-10088,31168,-10109,31161,-10130,31154,-10152,31148,-10173,31141,-10194,31134,-10215,31127,-10236,31120,-10258,31113,-10279,31106,-10300,31099,-10321,31092,-10343,31085,-10364,31077,-10385,31070,-10406,31063,-10427,31056,-10448,31049,-10470,31042,-10491,31035,-10512,31028,-10533,31020,-10554,31013,-10575,31006,-10597,30999,-10618,30991,-10639,30984,-10660,30977,-10681,30970,-10702,30962,-10723,30955,-10744,30948,-10766,30940,-10787,30933,-10808,30926,-10829,30918,-10850,30911,-10871,30903,-10892,30896,-10913,30889,-10934,30881,-10955,30874,-10976,30866,-10997,30859,-11018,30851,-11039,30844,-11060,30836,-11081,30828,-11102,30821,-11123,30813,-11144,30806,-11165,30798,-11186,30790,-11207,30783,-11228,30775,-11249,30767,-11270,30760,-11291,30752,-11312,30744,-11333,30737,-11354,30729,-11375,30721,-11396,30713,-11417,30705,-11438,30698,-11459,30690,-11480,30682,-11501,30674,-11522,30666,-11543,30658,-11564,30651,-11584,30643,-11605,30635,-11626,30627,-11647,30619,-11668,30611,-11689,30603,-11710,30595,-11731,30587,-11751,30579,-11772,30571,-11793,30563,-11814,30555,-11835,30547,-11856,30539,-11877,30530,-11897,30522,-11918,30514,-11939,30506,-11960,30498,-11981,30490,-12001,30482,-12022,30473,-12043,30465,-12064,30457,-12084,30449,-12105,30440,-12126,30432,-12147,30424,-12167,30416,-12188,30407,-12209,30399,-12230,30391,-12250,30382,-12271,30374,-12292,30365,-12313,30357,-12333,30349,-12354,30340,-12375,30332,-12395,30323,-12416,30315,-12437,30306,-12457,30298,-12478,30289,-12499,30281,-12519,30272,-12540,30264,-12561,30255,-12581,30247,-12602,30238,-12622,30229,-12643,30221,-12664,30212,-12684,30203,-12705,30195,-12725,30186,-12746,30177,-12767,30169,-12787,30160,-12808,30151,-12828,30142,-12849,30134,-12869,30125,-12890,30116,-12910,30107,-12931,30098,-12951,30090,-12972,30081,-12993,30072,-13013,30063,-13034,30054,-13054,30045,-13075,30036,-13095,30027,-13115,30018,-13136,30009,-13156,30001,-13177,29992,-13197,29983,-13218,29973,-13238,29964,-13259,29955,-13279,29946,-13299,29937,-13320,29928,-13340,29919,-13361,29910,-13381,29901,-13401,29892,-13422,29883,-13442,29873,-13463,29864,-13483,29855,-13503,29846,-13524,29837,-13544,29827,-13564,29818,-13585,29809,-13605,29800,-13625,29790,-13646,29781,-13666,29772,-13686,29762,-13707,29753,-13727,29744,-13747,29734,-13767,29725,-13788,29715,-13808,29706,-13828,29696,-13848,29687,-13869,29678,-13889,29668,-13909,29659,-13929,29649,-13950,29640,-13970,29630,-13990,29621,-14010,29611,-14030,29601,-14051,29592,-14071,29582,-14091,29573,-14111,29563,-14131,29553,-14151,29544,-14172,29534,-14192,29524,-14212,29515,-14232,29505,-14252,29495,-14272,29485,-14292,29476,-14312,29466,-14332,29456,-14353,29446,-14373,29437,-14393,29427,-14413,29417,-14433,29407,-14453,29397,-14473,29387,-14493,29377,-14513,29368,-14533,29358,-14553,29348,-14573,29338,-14593,29328,-14613,29318,-14633,29308,-14653,29298,-14673,29288,-14693,29278,-14713,29268,-14733,29258,-14753,29248,-14773,29238,-14793,29227,-14813,29217,-14833,29207,-14853,29197,-14872,29187,-14892,29177,-14912,29167,-14932,29156,-14952,29146,-14972,29136,-14992,29126,-15012,29116,-15031,29105,-15051,29095,-15071,29085,-15091,29074,-15111,29064,-15131,29054,-15150,29044,-15170,29033,-15190,29023,-15210,29012,-15230,29002,-15249,28992,-15269,28981,-15289,28971,-15309,28960,-15328,28950,-15348,28939,-15368,28929,-15388,28918,-15407,28908,-15427,28897,-15447,28887,-15466,28876,-15486,28866,-15506,28855,-15526,28845,-15545,28834,-15565,28823,-15584,28813,-15604,28802,-15624,28791,-15643,28781,-15663,28770,-15683,28759,-15702,28749,-15722,28738,-15741,28727,-15761,28716,-15781,28706,-15800,28695,-15820,28684,-15839,28673,-15859,28662,-15878,28652,-15898,28641,-15918,28630,-15937,28619,-15957,28608,-15976,28597,-15996,28586,-16015,28575,-16035,28565,-16054,28554,-16073,28543,-16093,28532,-16112,28521,-16132,28510,-16151,28499,-16171,28488,-16190,28477,-16210,28465,-16229,28454,-16248,28443,-16268,28432,-16287,28421,-16307,28410,-16326,28399,-16345,28388,-16365,28377,-16384,28365,-16403,28354,-16423,28343,-16442,28332,-16461,28321,-16481,28309,-16500,28298,-16519,28287,-16539,28275,-16558,28264,-16577,28253,-16596,28242,-16616,28230,-16635,28219,-16654,28208,-16673,28196,-16693,28185,-16712,28173,-16731,28162,-16750,28151,-16769,28139,-16789,28128,-16808,28116,-16827,28105,-16846,28093,-16865,28082,-16884,28070,-16904,28059,-16923,28047,-16942,28036,-16961,28024,-16980,28012,-16999,28001,-17018,27989,-17037,27978,-17056,27966,-17075,27954,-17095,27943,-17114,27931,-17133,27919,-17152,27908,-17171,27896,-17190,27884,-17209,27872,-17228,27861,-17247,27849,-17266,27837,-17285,27825,-17304,27814,-17323,27802,-17342,27790,-17361,27778,-17380,27766,-17398,27754,-17417,27742,-17436,27731,-17455,27719,-17474,27707,-17493,27695,-17512,27683,-17531,27671,-17550,27659,-17568,27647,-17587,27635,-17606,27623,-17625,27611,-17644,27599,-17663,27587,-17681,27575,-17700,27563,-17719,27551,-17738,27538,-17757,27526,-17775,27514,-17794,27502,-17813,27490,-17832,27478,-17850,27466,-17869,27453,-17888,27441,-17907,27429,-17925,27417,-17944,27405,-17963,27392,-17981,27380,-18000,27368,-18019,27355,-18037,27343,-18056,27331,-18075,27319,-18093,27306,-18112,27294,-18131,27281,-18149,27269,-18168,27257,-18186,27244,-18205,27232,-18223,27219,-18242,27207,-18261,27195,-18279,27182,-18298,27170,-18316,27157,-18335,27145,-18353,27132,-18372,27120,-18390,27107,-18409,27094,-18427,27082,-18446,27069,-18464,27057,-18483,27044,-18501,27031,-18519,27019,-18538,27006,-18556,26994,-18575,26981,-18593,26968,-18611,26955,-18630,26943,-18648,26930,-18667,26917,-18685,26905,-18703,26892,-18722,26879,-18740,26866,-18758,26853,-18777,26841,-18795,26828,-18813,26815,-18831,26802,-18850,26789,-18868,26776,-18886,26764,-18905,26751,-18923,26738,-18941,26725,-18959,26712,-18977,26699,-18996,26686,-19014,26673,-19032,26660,-19050,26647,-19068,26634,-19087,26621,-19105,26608,-19123,26595,-19141,26582,-19159,26569,-19177,26556,-19195,26543,-19213,26530,-19232,26516,-19250,26503,-19268,26490,-19286,26477,-19304,26464,-19322,26451,-19340,26437,-19358,26424,-19376,26411,-19394,26398,-19412,26385,-19430,26371,-19448,26358,-19466,26345,-19484,26332,-19502,26318,-19520,26305,-19538,26292,-19556,26278,-19574,26265,-19591,26252,-19609,26238,-19627,26225,-19645,26211,-19663,26198,-19681,26185,-19699,26171,-19717,26158,-19734,26144,-19752,26131,-19770,26117,-19788,26104,-19806,26090,-19823,26077,-19841,26063,-19859,26050,-19877,26036,-19895,26022,-19912,26009,-19930,25995,-19948,25982,-19966,25968,-19983,25954,-20001,25941,-20019,25927,-20036,25913,-20054,25900,-20072,25886,-20089,25872,-20107,25859,-20125,25845,-20142,25831,-20160,25817,-20177,25804,-20195,25790,-20213,25776,-20230,25762,-20248,25749,-20265,25735,-20283,25721,-20300,25707,-20318,25693,-20335,25679,-20353,25665,-20370,25652,-20388,25638,-20405,25624,-20423,25610,-20440,25596,-20458,25582,-20475,25568,-20493,25554,-20510,25540,-20528,25526,-20545,25512,-20562,25498,-20580,25484,-20597,25470,-20614,25456,-20632,25442,-20649,25428,-20667,25414,-20684,25399,-20701,25385,-20719,25371,-20736,25357,-20753,25343,-20770,25329,-20788,25315,-20805,25300,-20822,25286,-20839,25272,-20857,25258,-20874,25243,-20891,25229,-20908,25215,-20926,25201,-20943,25186,-20960,25172,-20977,25158,-20994,25144,-21011,25129,-21028,25115,-21046,25100,-21063,25086,-21080,25072,-21097,25057,-21114,25043,-21131,25029,-21148,25014,-21165,25000,-21182,24985,-21199,24971,-21216,24956,-21233,24942,-21250,24927,-21267,24913,-21284,24898,-21301,24884,-21318,24869,-21335,24855,-21352,24840,-21369,24826,-21386,24811,-21403,24796,-21420,24782,-21437,24767,-21454,24753,-21471,24738,-21487,24723,-21504,24709,-21521,24694,-21538,24679,-21555,24664,-21572,24650,-21588,24635,-21605,24620,-21622,24606,-21639,24591,-21656,24576,-21672,24561,-21689,24546,-21706,24532,-21723,24517,-21739,24502,-21756,24487,-21773,24472,-21789,24457,-21806,24443,-21823,24428,-21839,24413,-21856,24398,-21873,24383,-21889,24368,-21906,24353,-21923,24338,-21939,24323,-21956,24308,-21972,24293,-21989,24278,-22005,24263,-22022,24248,-22039,24233,-22055,24218,-22072,24203,-22088,24188,-22105,24173,-22121,24158,-22138,24143,-22154,24128,-22170,24113,-22187,24097,-22203,24082,-22220,24067,-22236,24052,-22253,24037,-22269,24022,-22285,24006,-22302,23991,-22318,23976,-22334,23961,-22351,23945,-22367,23930,-22383,23915,-22400,23900,-22416,23884,-22432,23869,-22449,23854,-22465,23838,-22481,23823,-22497,23808,-22514,23792,-22530,23777,-22546,23762,-22562,23746,-22578,23731,-22595,23715,-22611,23700,-22627,23685,-22643,23669,-22659,23654,-22675,23638,-22692,23623,-22708,23607,-22724,23592,-22740,23576,-22756,23561,-22772,23545,-22788,23530,-22804,23514,-22820,23499,-22836,23483,-22852,23467,-22868,23452,-22884,23436,-22900,23421,-22916,23405,-22932,23389,-22948,23374,-22964,23358,-22980,23342,-22996,23327,-23012,23311,-23028,23295,-23044,23280,-23059,23264,-23075,23248,-23091,23232,-23107,23217,-23123,23201,-23139,23185,-23154,23169,-23170,23153,-23186,23138,-23202,23122,-23218,23106,-23233,23090,-23249,23074,-23265,23058,-23281,23043,-23296,23027,-23312,23011,-23328,22995,-23343,22979,-23359,22963,-23375,22947,-23390,22931,-23406,22915,-23422,22899,-23437,22883,-23453,22867,-23468,22851,-23484,22835,-23500,22819,-23515,22803,-23531,22787,-23546,22771,-23562,22755,-23577,22739,-23593,22723,-23608,22707,-23624,22691,-23639,22674,-23655,22658,-23670,22642,-23686,22626,-23701,22610,-23716,22594,-23732,22577,-23747,22561,-23763,22545,-23778,22529,-23793,22513,-23809,22496,-23824,22480,-23839,22464,-23855,22448,-23870,22431,-23885,22415,-23901,22399,-23916,22382,-23931,22366,-23946,22350,-23962,22333,-23977,22317,-23992,22301,-24007,22284,-24023,22268,-24038,22252,-24053,22235,-24068,22219,-24083,22202,-24098,22186,-24114,22169,-24129,22153,-24144,22137,-24159,22120,-24174,22104,-24189,22087,-24204,22071,-24219,22054,-24234,22038,-24249,22021,-24264,22004,-24279,21988,-24294,21971,-24309,21955,-24324,21938,-24339,21922,-24354,21905,-24369,21888,-24384,21872,-24399,21855,-24414,21838,-24429,21822,-24444,21805,-24458,21788,-24473,21772,-24488,21755,-24503,21738,-24518,21722,-24533,21705,-24547,21688,-24562,21671,-24577,21655,-24592,21638,-24607,21621,-24621,21604,-24636,21587,-24651,21571,-24665,21554,-24680,21537,-24695,21520,-24710,21503,-24724,21486,-24739,21470,-24754,21453,-24768,21436,-24783,21419,-24797,21402,-24812,21385,-24827,21368,-24841,21351,-24856,21334,-24870,21317,-24885,21300,-24899,21283,-24914,21266,-24928,21249,-24943,21232,-24957,21215,-24972,21198,-24986,21181,-25001,21164,-25015,21147,-25030,21130,-25044,21113,-25058,21096,-25073,21079,-25087,21062,-25101,21045,-25116,21027,-25130,21010,-25145,20993,-25159,20976,-25173,20959,-25187,20942,-25202,20925,-25216,20907,-25230,20890,-25244,20873,-25259,20856,-25273,20838,-25287,20821,-25301,20804,-25316,20787,-25330,20769,-25344,20752,-25358,20735,-25372,20718,-25386,20700,-25400,20683,-25415,20666,-25429,20648,-25443,20631,-25457,20613,-25471,20596,-25485,20579,-25499,20561,-25513,20544,-25527,20527,-25541,20509,-25555,20492,-25569,20474,-25583,20457,-25597,20439,-25611,20422,-25625,20404,-25639,20387,-25653,20369,-25666,20352,-25680,20334,-25694,20317,-25708,20299,-25722,20282,-25736,20264,-25750,20247,-25763,20229,-25777,20212,-25791,20194,-25805,20176,-25818,20159,-25832,20141,-25846,20124,-25860,20106,-25873,20088,-25887,20071,-25901,20053,-25914,20035,-25928,20018,-25942,20000,-25955,19982,-25969,19965,-25983,19947,-25996,19929,-26010,19911,-26023,19894,-26037,19876,-26051,19858,-26064,19840,-26078,19822,-26091,19805,-26105,19787,-26118,19769,-26132,19751,-26145,19733,-26159,19716,-26172,19698,-26186,19680,-26199,19662,-26212,19644,-26226,19626,-26239,19608,-26253,19590,-26266,19573,-26279,19555,-26293,19537,-26306,19519,-26319,19501,-26333,19483,-26346,19465,-26359,19447,-26372,19429,-26386,19411,-26399,19393,-26412,19375,-26425,19357,-26438,19339,-26452,19321,-26465,19303,-26478,19285,-26491,19267,-26504,19249,-26517,19231,-26531,19212,-26544,19194,-26557,19176,-26570,19158,-26583,19140,-26596,19122,-26609,19104,-26622,19086,-26635,19067,-26648,19049,-26661,19031,-26674,19013,-26687,18995,-26700,18976,-26713,18958,-26726,18940,-26739,18922,-26752,18904,-26765,18885,-26777,18867,-26790,18849,-26803,18830,-26816,18812,-26829,18794,-26842,18776,-26854,18757,-26867,18739,-26880,18721,-26893,18702,-26906,18684,-26918,18666,-26931,18647,-26944,18629,-26956,18610,-26969,18592,-26982,18574,-26995,18555,-27007,18537,-27020,18518,-27032,18500,-27045,18482,-27058,18463,-27070,18445,-27083,18426,-27095,18408,-27108,18389,-27121,18371,-27133,18352,-27146,18334,-27158,18315,-27171,18297,-27183,18278,-27196,18260,-27208,18241,-27220,18222,-27233,18204,-27245,18185,-27258,18167,-27270,18148,-27282,18130,-27295,18111,-27307,18092,-27320,18074,-27332,18055,-27344,18036,-27356,18018,-27369,17999,-27381,17980,-27393,17962,-27406,17943,-27418,17924,-27430,17906,-27442,17887,-27454,17868,-27467,17849,-27479,17831,-27491,17812,-27503,17793,-27515,17774,-27527,17756,-27539,17737,-27552,17718,-27564,17699,-27576,17680,-27588,17662,-27600,17643,-27612,17624,-27624,17605,-27636,17586,-27648,17567,-27660,17549,-27672,17530,-27684,17511,-27696,17492,-27708,17473,-27720,17454,-27732,17435,-27743,17416,-27755,17397,-27767,17379,-27779,17360,-27791,17341,-27803,17322,-27815,17303,-27826,17284,-27838,17265,-27850,17246,-27862,17227,-27873,17208,-27885,17189,-27897,17170,-27909,17151,-27920,17132,-27932,17113,-27944,17094,-27955,17074,-27967,17055,-27979,17036,-27990,17017,-28002,16998,-28013,16979,-28025,16960,-28037,16941,-28048,16922,-28060,16903,-28071,16883,-28083,16864,-28094,16845,-28106,16826,-28117,16807,-28129,16788,-28140,16768,-28152,16749,-28163,16730,-28174,16711,-28186,16692,-28197,16672,-28209,16653,-28220,16634,-28231,16615,-28243,16595,-28254,16576,-28265,16557,-28276,16538,-28288,16518,-28299,16499,-28310,16480,-28322,16460,-28333,16441,-28344,16422,-28355,16402,-28366,16383,-28378,16364,-28389,16344,-28400,16325,-28411,16306,-28422,16286,-28433,16267,-28444,16247,-28455,16228,-28466,16209,-28478,16189,-28489,16170,-28500,16150,-28511,16131,-28522,16111,-28533,16092,-28544,16072,-28555,16053,-28566,16034,-28576,16014,-28587,15995,-28598,15975,-28609,15956,-28620,15936,-28631,15917,-28642,15897,-28653,15877,-28663,15858,-28674,15838,-28685,15819,-28696,15799,-28707,15780,-28717,15760,-28728,15740,-28739,15721,-28750,15701,-28760,15682,-28771,15662,-28782,15642,-28792,15623,-28803,15603,-28814,15583,-28824,15564,-28835,15544,-28846,15525,-28856,15505,-28867,15485,-28877,15465,-28888,15446,-28898,15426,-28909,15406,-28919,15387,-28930,15367,-28940,15347,-28951,15327,-28961,15308,-28972,15288,-28982,15268,-28993,15248,-29003,15229,-29013,15209,-29024,15189,-29034,15169,-29045,15149,-29055,15130,-29065,15110,-29075,15090,-29086,15070,-29096,15050,-29106,15030,-29117,15011,-29127,14991,-29137,14971,-29147,14951,-29157,14931,-29168,14911,-29178,14891,-29188,14871,-29198,14852,-29208,14832,-29218,14812,-29228,14792,-29239,14772,-29249,14752,-29259,14732,-29269,14712,-29279,14692,-29289,14672,-29299,14652,-29309,14632,-29319,14612,-29329,14592,-29339,14572,-29349,14552,-29359,14532,-29369,14512,-29378,14492,-29388,14472,-29398,14452,-29408,14432,-29418,14412,-29428,14392,-29438,14372,-29447,14352,-29457,14331,-29467,14311,-29477,14291,-29486,14271,-29496,14251,-29506,14231,-29516,14211,-29525,14191,-29535,14171,-29545,14150,-29554,14130,-29564,14110,-29574,14090,-29583,14070,-29593,14050,-29602,14029,-29612,14009,-29622,13989,-29631,13969,-29641,13949,-29650,13928,-29660,13908,-29669,13888,-29679,13868,-29688,13847,-29697,13827,-29707,13807,-29716,13787,-29726,13766,-29735,13746,-29745,13726,-29754,13706,-29763,13685,-29773,13665,-29782,13645,-29791,13624,-29801,13604,-29810,13584,-29819,13563,-29828,13543,-29838,13523,-29847,13502,-29856,13482,-29865,13462,-29874,13441,-29884,13421,-29893,13400,-29902,13380,-29911,13360,-29920,13339,-29929,13319,-29938,13298,-29947,13278,-29956,13258,-29965,13237,-29974,13217,-29984,13196,-29993,13176,-30002,13155,-30010,13135,-30019,13114,-30028,13094,-30037,13074,-30046,13053,-30055,13033,-30064,13012,-30073,12992,-30082,12971,-30091,12950,-30099,12930,-30108,12909,-30117,12889,-30126,12868,-30135,12848,-30143,12827,-30152,12807,-30161,12786,-30170,12766,-30178,12745,-30187,12724,-30196,12704,-30204,12683,-30213,12663,-30222,12642,-30230,12621,-30239,12601,-30248,12580,-30256,12560,-30265,12539,-30273,12518,-30282,12498,-30290,12477,-30299,12456,-30307,12436,-30316,12415,-30324,12394,-30333,12374,-30341,12353,-30350,12332,-30358,12312,-30366,12291,-30375,12270,-30383,12249,-30392,12229,-30400,12208,-30408,12187,-30417,12166,-30425,12146,-30433,12125,-30441,12104,-30450,12083,-30458,12063,-30466,12042,-30474,12021,-30483,12000,-30491,11980,-30499,11959,-30507,11938,-30515,11917,-30523,11896,-30531,11876,-30540,11855,-30548,11834,-30556,11813,-30564,11792,-30572,11771,-30580,11750,-30588,11730,-30596,11709,-30604,11688,-30612,11667,-30620,11646,-30628,11625,-30636,11604,-30644,11583,-30652,11563,-30659,11542,-30667,11521,-30675,11500,-30683,11479,-30691,11458,-30699,11437,-30706,11416,-30714,11395,-30722,11374,-30730,11353,-30738,11332,-30745,11311,-30753,11290,-30761,11269,-30768,11248,-30776,11227,-30784,11206,-30791,11185,-30799,11164,-30807,11143,-30814,11122,-30822,11101,-30829,11080,-30837,11059,-30845,11038,-30852,11017,-30860,10996,-30867,10975,-30875,10954,-30882,10933,-30890,10912,-30897,10891,-30904,10870,-30912,10849,-30919,10828,-30927,10807,-30934,10786,-30941,10765,-30949,10743,-30956,10722,-30963,10701,-30971,10680,-30978,10659,-30985,10638,-30992,10617,-31000,10596,-31007,10574,-31014,10553,-31021,10532,-31029,10511,-31036,10490,-31043,10469,-31050,10447,-31057,10426,-31064,10405,-31071,10384,-31078,10363,-31086,10342,-31093,10320,-31100,10299,-31107,10278,-31114,10257,-31121,10235,-31128,10214,-31135,10193,-31142,10172,-31149,10151,-31155,10129,-31162,10108,-31169,10087,-31176,10066,-31183,10044,-31190,10023,-31197,10002,-31204,9980,-31210,9959,-31217,9938,-31224,9917,-31231,9895,-31237,9874,-31244,9853,-31251,9831,-31258,9810,-31264,9789,-31271,9767,-31278,9746,-31284,9725,-31291,9703,-31298,9682,-31304,9661,-31311,9639,-31317,9618,-31324,9597,-31331,9575,-31337,9554,-31344,9533,-31350,9511,-31357,9490,-31363,9468,-31370,9447,-31376,9426,-31382,9404,-31389,9383,-31395,9362,-31402,9340,-31408,9319,-31414,9297,-31421,9276,-31427,9254,-31433,9233,-31440,9212,-31446,9190,-31452,9169,-31458,9147,-31465,9126,-31471,9104,-31477,9083,-31483,9061,-31490,9040,-31496,9018,-31502,8997,-31508,8975,-31514,8954,-31520,8932,-31526,8911,-31532,8889,-31538,8868,-31545,8846,-31551,8825,-31557,8803,-31563,8782,-31569,8760,-31575,8739,-31581,8717,-31587,8696,-31592,8674,-31598,8653,-31604,8631,-31610,8610,-31616,8588,-31622,8567,-31628,8545,-31634,8523,-31639,8502,-31645,8480,-31651,8459,-31657,8437,-31663,8415,-31668,8394,-31674,8372,-31680,8351,-31685,8329,-31691,8307,-31697,8286,-31702,8264,-31708,8243,-31714,8221,-31719,8199,-31725,8178,-31730,8156,-31736,8134,-31742,8113,-31747,8091,-31753,8070,-31758,8048,-31764,8026,-31769,8005,-31775,7983,-31780,7961,-31786,7940,-31791,7918,-31796,7896,-31802,7875,-31807,7853,-31812,7831,-31818,7809,-31823,7788,-31828,7766,-31834,7744,-31839,7723,-31844,7701,-31850,7679,-31855,7657,-31860,7636,-31865,7614,-31870,7592,-31876,7571,-31881,7549,-31886,7527,-31891,7505,-31896,7484,-31901,7462,-31906,7440,-31912,7418,-31917,7397,-31922,7375,-31927,7353,-31932,7331,-31937,7310,-31942,7288,-31947,7266,-31952,7244,-31957,7222,-31962,7201,-31966,7179,-31971,7157,-31976,7135,-31981,7113,-31986,7092,-31991,7070,-31996,7048,-32000,7026,-32005,7004,-32010,6982,-32015,6961,-32020,6939,-32024,6917,-32029,6895,-32034,6873,-32038,6851,-32043,6830,-32048,6808,-32052,6786,-32057,6764,-32062,6742,-32066,6720,-32071,6698,-32075,6677,-32080,6655,-32085,6633,-32089,6611,-32094,6589,-32098,6567,-32103,6545,-32107,6523,-32111,6502,-32116,6480,-32120,6458,-32125,6436,-32129,6414,-32134,6392,-32138,6370,-32142,6348,-32147,6326,-32151,6304,-32155,6282,-32159,6261,-32164,6239,-32168,6217,-32172,6195,-32177,6173,-32181,6151,-32185,6129,-32189,6107,-32193,6085,-32197,6063,-32202,6041,-32206,6019,-32210,5997,-32214,5975,-32218,5953,-32222,5931,-32226,5909,-32230,5887,-32234,5865,-32238,5843,-32242,5821,-32246,5799,-32250,5777,-32254,5755,-32258,5733,-32262,5711,-32266,5689,-32270,5667,-32274,5645,-32277,5623,-32281,5601,-32285,5579,-32289,5557,-32293,5535,-32296,5513,-32300,5491,-32304,5469,-32308,5447,-32311,5425,-32315,5403,-32319,5381,-32323,5359,-32326,5337,-32330,5315,-32333,5293,-32337,5271,-32341,5249,-32344,5227,-32348,5205,-32351,5183,-32355,5161,-32358,5139,-32362,5117,-32365,5094,-32369,5072,-32372,5050,-32376,5028,-32379,5006,-32383,4984,-32386,4962,-32390,4940,-32393,4918,-32396,4896,-32400,4874,-32403,4852,-32406,4830,-32410,4807,-32413,4785,-32416,4763,-32419,4741,-32423,4719,-32426,4697,-32429,4675,-32432,4653,-32435,4631,-32439,4608,-32442,4586,-32445,4564,-32448,4542,-32451,4520,-32454,4498,-32457,4476,-32460,4454,-32463,4431,-32466,4409,-32469,4387,-32472,4365,-32475,4343,-32478,4321,-32481,4299,-32484,4276,-32487,4254,-32490,4232,-32493,4210,-32496,4188,-32499,4166,-32502,4144,-32504,4121,-32507,4099,-32510,4077,-32513,4055,-32516,4033,-32518,4011,-32521,3988,-32524,3966,-32527,3944,-32529,3922,-32532,3900,-32535,3877,-32537,3855,-32540,3833,-32542,3811,-32545,3789,-32548,3767,-32550,3744,-32553,3722,-32555,3700,-32558,3678,-32560,3656,-32563,3633,-32565,3611,-32568,3589,-32570,3567,-32573,3545,-32575,3522,-32578,3500,-32580,3478,-32582,3456,-32585,3433,-32587,3411,-32589,3389,-32592,3367,-32594,3345,-32596,3322,-32599,3300,-32601,3278,-32603,3256,-32605,3233,-32608,3211,-32610,3189,-32612,3167,-32614,3145,-32616,3122,-32618,3100,-32620,3078,-32623,3056,-32625,3033,-32627,3011,-32629,2989,-32631,2967,-32633,2944,-32635,2922,-32637,2900,-32639,2878,-32641,2855,-32643,2833,-32645,2811,-32647,2789,-32649,2766,-32650,2744,-32652,2722,-32654,2700,-32656,2677,-32658,2655,-32660,2633,-32662,2610,-32663,2588,-32665,2566,-32667,2544,-32669,2521,-32670,2499,-32672,2477,-32674,2455,-32675,2432,-32677,2410,-32679,2388,-32680,2365,-32682,2343,-32684,2321,-32685,2299,-32687,2276,-32688,2254,-32690,2232,-32691,2209,-32693,2187,-32694,2165,-32696,2143,-32697,2120,-32699,2098,-32700,2076,-32702,2053,-32703,2031,-32704,2009,-32706,1986,-32707,1964,-32709,1942,-32710,1920,-32711,1897,-32712,1875,-32714,1853,-32715,1830,-32716,1808,-32718,1786,-32719,1763,-32720,1741,-32721,1719,-32722,1697,-32724,1674,-32725,1652,-32726,1630,-32727,1607,-32728,1585,-32729,1563,-32730,1540,-32731,1518,-32732,1496,-32733,1473,-32734,1451,-32735,1429,-32736,1406,-32737,1384,-32738,1362,-32739,1339,-32740,1317,-32741,1295,-32742,1273,-32743,1250,-32744,1228,-32744,1206,-32745,1183,-32746,1161,-32747,1139,-32748,1116,-32748,1094,-32749,1072,-32750,1049,-32751,1027,-32751,1005,-32752,982,-32753,960,-32753,938,-32754,915,-32755,893,-32755,871,-32756,848,-32757,826,-32757,804,-32758,781,-32758,759,-32759,737,-32759,714,-32760,692,-32760,670,-32761,647,-32761,625,-32762,603,-32762,580,-32762,558,-32763,536,-32763,513,-32763,491,-32764,469,-32764,446,-32764,424,-32765,402,-32765,379,-32765,357,-32766,335,-32766,312,-32766,290,-32766,268,-32766,245,-32767,223,-32767,201,-32767,178,-32767,156,-32767,134,-32767,111,-32767,89,-32767,67,-32767,44,-32767,22,-32767,0,-32767,-23,-32767,-45,-32767,-68,-32767,-90,-32767,-112,-32767,-135,-32767,-157,-32767,-179,-32767,-202,-32767,-224,-32767,-246,-32767,-269,-32766,-291,-32766,-313,-32766,-336,-32766,-358,-32766,-380,-32765,-403,-32765,-425,-32765,-447,-32764,-470,-32764,-492,-32764,-514,-32763,-537,-32763,-559,-32763,-581,-32762,-604,-32762,-626,-32762,-648,-32761,-671,-32761,-693,-32760,-715,-32760,-738,-32759,-760,-32759,-782,-32758,-805,-32758,-827,-32757,-849,-32757,-872,-32756,-894,-32755,-916,-32755,-939,-32754,-961,-32753,-983,-32753,-1006,-32752,-1028,-32751,-1050,-32751,-1073,-32750,-1095,-32749,-1117,-32748,-1140,-32748,-1162,-32747,-1184,-32746,-1207,-32745,-1229,-32744,-1251,-32744,-1274,-32743,-1296,-32742,-1318,-32741,-1340,-32740,-1363,-32739,-1385,-32738,-1407,-32737,-1430,-32736,-1452,-32735,-1474,-32734,-1497,-32733,-1519,-32732,-1541,-32731,-1564,-32730,-1586,-32729,-1608,-32728,-1631,-32727,-1653,-32726,-1675,-32725,-1698,-32724,-1720,-32722,-1742,-32721,-1764,-32720,-1787,-32719,-1809,-32718,-1831,-32716,-1854,-32715,-1876,-32714,-1898,-32712,-1921,-32711,-1943,-32710,-1965,-32709,-1987,-32707,-2010,-32706,-2032,-32704,-2054,-32703,-2077,-32702,-2099,-32700,-2121,-32699,-2144,-32697,-2166,-32696,-2188,-32694,-2210,-32693,-2233,-32691,-2255,-32690,-2277,-32688,-2300,-32687,-2322,-32685,-2344,-32684,-2366,-32682,-2389,-32680,-2411,-32679,-2433,-32677,-2456,-32675,-2478,-32674,-2500,-32672,-2522,-32670,-2545,-32669,-2567,-32667,-2589,-32665,-2611,-32663,-2634,-32662,-2656,-32660,-2678,-32658,-2701,-32656,-2723,-32654,-2745,-32652,-2767,-32650,-2790,-32649,-2812,-32647,-2834,-32645,-2856,-32643,-2879,-32641,-2901,-32639,-2923,-32637,-2945,-32635,-2968,-32633,-2990,-32631,-3012,-32629,-3034,-32627,-3057,-32625,-3079,-32623,-3101,-32620,-3123,-32618,-3146,-32616,-3168,-32614,-3190,-32612,-3212,-32610,-3234,-32608,-3257,-32605,-3279,-32603,-3301,-32601,-3323,-32599,-3346,-32596,-3368,-32594,-3390,-32592,-3412,-32589,-3434,-32587,-3457,-32585,-3479,-32582,-3501,-32580,-3523,-32578,-3546,-32575,-3568,-32573,-3590,-32570,-3612,-32568,-3634,-32565,-3657,-32563,-3679,-32560,-3701,-32558,-3723,-32555,-3745,-32553,-3768,-32550,-3790,-32548,-3812,-32545,-3834,-32542,-3856,-32540,-3878,-32537,-3901,-32535,-3923,-32532,-3945,-32529,-3967,-32527,-3989,-32524,-4012,-32521,-4034,-32518,-4056,-32516,-4078,-32513,-4100,-32510,-4122,-32507,-4145,-32504,-4167,-32502,-4189,-32499,-4211,-32496,-4233,-32493,-4255,-32490,-4277,-32487,-4300,-32484,-4322,-32481,-4344,-32478,-4366,-32475,-4388,-32472,-4410,-32469,-4432,-32466,-4455,-32463,-4477,-32460,-4499,-32457,-4521,-32454,-4543,-32451,-4565,-32448,-4587,-32445,-4609,-32442,-4632,-32439,-4654,-32435,-4676,-32432,-4698,-32429,-4720,-32426,-4742,-32423,-4764,-32419,-4786,-32416,-4808,-32413,-4831,-32410,-4853,-32406,-4875,-32403,-4897,-32400,-4919,-32396,-4941,-32393,-4963,-32390,-4985,-32386,-5007,-32383,-5029,-32379,-5051,-32376,-5073,-32372,-5095,-32369,-5118,-32365,-5140,-32362,-5162,-32358,-5184,-32355,-5206,-32351,-5228,-32348,-5250,-32344,-5272,-32341,-5294,-32337,-5316,-32333,-5338,-32330,-5360,-32326,-5382,-32323,-5404,-32319,-5426,-32315,-5448,-32311,-5470,-32308,-5492,-32304,-5514,-32300,-5536,-32296,-5558,-32293,-5580,-32289,-5602,-32285,-5624,-32281,-5646,-32277,-5668,-32274,-5690,-32270,-5712,-32266,-5734,-32262,-5756,-32258,-5778,-32254,-5800,-32250,-5822,-32246,-5844,-32242,-5866,-32238,-5888,-32234,-5910,-32230,-5932,-32226,-5954,-32222,-5976,-32218,-5998,-32214,-6020,-32210,-6042,-32206,-6064,-32202,-6086,-32197,-6108,-32193,-6130,-32189,-6152,-32185,-6174,-32181,-6196,-32177,-6218,-32172,-6240,-32168,-6262,-32164,-6283,-32159,-6305,-32155,-6327,-32151,-6349,-32147,-6371,-32142,-6393,-32138,-6415,-32134,-6437,-32129,-6459,-32125,-6481,-32120,-6503,-32116,-6524,-32111,-6546,-32107,-6568,-32103,-6590,-32098,-6612,-32094,-6634,-32089,-6656,-32085,-6678,-32080,-6699,-32075,-6721,-32071,-6743,-32066,-6765,-32062,-6787,-32057,-6809,-32052,-6831,-32048,-6852,-32043,-6874,-32038,-6896,-32034,-6918,-32029,-6940,-32024,-6962,-32020,-6983,-32015,-7005,-32010,-7027,-32005,-7049,-32000,-7071,-31996,-7093,-31991,-7114,-31986,-7136,-31981,-7158,-31976,-7180,-31971,-7202,-31966,-7223,-31962,-7245,-31957,-7267,-31952,-7289,-31947,-7311,-31942,-7332,-31937,-7354,-31932,-7376,-31927,-7398,-31922,-7419,-31917,-7441,-31912,-7463,-31906,-7485,-31901,-7506,-31896,-7528,-31891,-7550,-31886,-7572,-31881,-7593,-31876,-7615,-31870,-7637,-31865,-7658,-31860,-7680,-31855,-7702,-31850,-7724,-31844,-7745,-31839,-7767,-31834,-7789,-31828,-7810,-31823,-7832,-31818,-7854,-31812,-7876,-31807,-7897,-31802,-7919,-31796,-7941,-31791,-7962,-31786,-7984,-31780,-8006,-31775,-8027,-31769,-8049,-31764,-8071,-31758,-8092,-31753,-8114,-31747,-8135,-31742,-8157,-31736,-8179,-31730,-8200,-31725,-8222,-31719,-8244,-31714,-8265,-31708,-8287,-31702,-8308,-31697,-8330,-31691,-8352,-31685,-8373,-31680,-8395,-31674,-8416,-31668,-8438,-31663,-8460,-31657,-8481,-31651,-8503,-31645,-8524,-31639,-8546,-31634,-8568,-31628,-8589,-31622,-8611,-31616,-8632,-31610,-8654,-31604,-8675,-31598,-8697,-31592,-8718,-31587,-8740,-31581,-8761,-31575,-8783,-31569,-8804,-31563,-8826,-31557,-8847,-31551,-8869,-31545,-8890,-31538,-8912,-31532,-8933,-31526,-8955,-31520,-8976,-31514,-8998,-31508,-9019,-31502,-9041,-31496,-9062,-31490,-9084,-31483,-9105,-31477,-9127,-31471,-9148,-31465,-9170,-31458,-9191,-31452,-9213,-31446,-9234,-31440,-9255,-31433,-9277,-31427,-9298,-31421,-9320,-31414,-9341,-31408,-9363,-31402,-9384,-31395,-9405,-31389,-9427,-31382,-9448,-31376,-9469,-31370,-9491,-31363,-9512,-31357,-9534,-31350,-9555,-31344,-9576,-31337,-9598,-31331,-9619,-31324,-9640,-31317,-9662,-31311,-9683,-31304,-9704,-31298,-9726,-31291,-9747,-31284,-9768,-31278,-9790,-31271,-9811,-31264,-9832,-31258,-9854,-31251,-9875,-31244,-9896,-31237,-9918,-31231,-9939,-31224,-9960,-31217,-9981,-31210,-10003,-31204,-10024,-31197,-10045,-31190,-10067,-31183,-10088,-31176,-10109,-31169,-10130,-31162,-10152,-31155,-10173,-31149,-10194,-31142,-10215,-31135,-10236,-31128,-10258,-31121,-10279,-31114,-10300,-31107,-10321,-31100,-10343,-31093,-10364,-31086,-10385,-31078,-10406,-31071,-10427,-31064,-10448,-31057,-10470,-31050,-10491,-31043,-10512,-31036,-10533,-31029,-10554,-31021,-10575,-31014,-10597,-31007,-10618,-31000,-10639,-30992,-10660,-30985,-10681,-30978,-10702,-30971,-10723,-30963,-10744,-30956,-10766,-30949,-10787,-30941,-10808,-30934,-10829,-30927,-10850,-30919,-10871,-30912,-10892,-30904,-10913,-30897,-10934,-30890,-10955,-30882,-10976,-30875,-10997,-30867,-11018,-30860,-11039,-30852,-11060,-30845,-11081,-30837,-11102,-30829,-11123,-30822,-11144,-30814,-11165,-30807,-11186,-30799,-11207,-30791,-11228,-30784,-11249,-30776,-11270,-30768,-11291,-30761,-11312,-30753,-11333,-30745,-11354,-30738,-11375,-30730,-11396,-30722,-11417,-30714,-11438,-30706,-11459,-30699,-11480,-30691,-11501,-30683,-11522,-30675,-11543,-30667,-11564,-30659,-11584,-30652,-11605,-30644,-11626,-30636,-11647,-30628,-11668,-30620,-11689,-30612,-11710,-30604,-11731,-30596,-11751,-30588,-11772,-30580,-11793,-30572,-11814,-30564,-11835,-30556,-11856,-30548,-11877,-30540,-11897,-30531,-11918,-30523,-11939,-30515,-11960,-30507,-11981,-30499,-12001,-30491,-12022,-30483,-12043,-30474,-12064,-30466,-12084,-30458,-12105,-30450,-12126,-30441,-12147,-30433,-12167,-30425,-12188,-30417,-12209,-30408,-12230,-30400,-12250,-30392,-12271,-30383,-12292,-30375,-12313,-30366,-12333,-30358,-12354,-30350,-12375,-30341,-12395,-30333,-12416,-30324,-12437,-30316,-12457,-30307,-12478,-30299,-12499,-30290,-12519,-30282,-12540,-30273,-12561,-30265,-12581,-30256,-12602,-30248,-12622,-30239,-12643,-30230,-12664,-30222,-12684,-30213,-12705,-30204,-12725,-30196,-12746,-30187,-12767,-30178,-12787,-30170,-12808,-30161,-12828,-30152,-12849,-30143,-12869,-30135,-12890,-30126,-12910,-30117,-12931,-30108,-12951,-30099,-12972,-30091,-12993,-30082,-13013,-30073,-13034,-30064,-13054,-30055,-13075,-30046,-13095,-30037,-13115,-30028,-13136,-30019,-13156,-30010,-13177,-30002,-13197,-29993,-13218,-29984,-13238,-29974,-13259,-29965,-13279,-29956,-13299,-29947,-13320,-29938,-13340,-29929,-13361,-29920,-13381,-29911,-13401,-29902,-13422,-29893,-13442,-29884,-13463,-29874,-13483,-29865,-13503,-29856,-13524,-29847,-13544,-29838,-13564,-29828,-13585,-29819,-13605,-29810,-13625,-29801,-13646,-29791,-13666,-29782,-13686,-29773,-13707,-29763,-13727,-29754,-13747,-29745,-13767,-29735,-13788,-29726,-13808,-29716,-13828,-29707,-13848,-29697,-13869,-29688,-13889,-29679,-13909,-29669,-13929,-29660,-13950,-29650,-13970,-29641,-13990,-29631,-14010,-29622,-14030,-29612,-14051,-29602,-14071,-29593,-14091,-29583,-14111,-29574,-14131,-29564,-14151,-29554,-14172,-29545,-14192,-29535,-14212,-29525,-14232,-29516,-14252,-29506,-14272,-29496,-14292,-29486,-14312,-29477,-14332,-29467,-14353,-29457,-14373,-29447,-14393,-29438,-14413,-29428,-14433,-29418,-14453,-29408,-14473,-29398,-14493,-29388,-14513,-29378,-14533,-29369,-14553,-29359,-14573,-29349,-14593,-29339,-14613,-29329,-14633,-29319,-14653,-29309,-14673,-29299,-14693,-29289,-14713,-29279,-14733,-29269,-14753,-29259,-14773,-29249,-14793,-29239,-14813,-29228,-14833,-29218,-14853,-29208,-14872,-29198,-14892,-29188,-14912,-29178,-14932,-29168,-14952,-29157,-14972,-29147,-14992,-29137,-15012,-29127,-15031,-29117,-15051,-29106,-15071,-29096,-15091,-29086,-15111,-29075,-15131,-29065,-15150,-29055,-15170,-29045,-15190,-29034,-15210,-29024,-15230,-29013,-15249,-29003,-15269,-28993,-15289,-28982,-15309,-28972,-15328,-28961,-15348,-28951,-15368,-28940,-15388,-28930,-15407,-28919,-15427,-28909,-15447,-28898,-15466,-28888,-15486,-28877,-15506,-28867,-15526,-28856,-15545,-28846,-15565,-28835,-15584,-28824,-15604,-28814,-15624,-28803,-15643,-28792,-15663,-28782,-15683,-28771,-15702,-28760,-15722,-28750,-15741,-28739,-15761,-28728,-15781,-28717,-15800,-28707,-15820,-28696,-15839,-28685,-15859,-28674,-15878,-28663,-15898,-28653,-15918,-28642,-15937,-28631,-15957,-28620,-15976,-28609,-15996,-28598,-16015,-28587,-16035,-28576,-16054,-28566,-16073,-28555,-16093,-28544,-16112,-28533,-16132,-28522,-16151,-28511,-16171,-28500,-16190,-28489,-16210,-28478,-16229,-28466,-16248,-28455,-16268,-28444,-16287,-28433,-16307,-28422,-16326,-28411,-16345,-28400,-16365,-28389,-16384,-28378,-16403,-28366,-16423,-28355,-16442,-28344,-16461,-28333,-16481,-28322,-16500,-28310,-16519,-28299,-16539,-28288,-16558,-28276,-16577,-28265,-16596,-28254,-16616,-28243,-16635,-28231,-16654,-28220,-16673,-28209,-16693,-28197,-16712,-28186,-16731,-28174,-16750,-28163,-16769,-28152,-16789,-28140,-16808,-28129,-16827,-28117,-16846,-28106,-16865,-28094,-16884,-28083,-16904,-28071,-16923,-28060,-16942,-28048,-16961,-28037,-16980,-28025,-16999,-28013,-17018,-28002,-17037,-27990,-17056,-27979,-17075,-27967,-17095,-27955,-17114,-27944,-17133,-27932,-17152,-27920,-17171,-27909,-17190,-27897,-17209,-27885,-17228,-27873,-17247,-27862,-17266,-27850,-17285,-27838,-17304,-27826,-17323,-27815,-17342,-27803,-17361,-27791,-17380,-27779,-17398,-27767,-17417,-27755,-17436,-27743,-17455,-27732,-17474,-27720,-17493,-27708,-17512,-27696,-17531,-27684,-17550,-27672,-17568,-27660,-17587,-27648,-17606,-27636,-17625,-27624,-17644,-27612,-17663,-27600,-17681,-27588,-17700,-27576,-17719,-27564,-17738,-27552,-17757,-27539,-17775,-27527,-17794,-27515,-17813,-27503,-17832,-27491,-17850,-27479,-17869,-27467,-17888,-27454,-17907,-27442,-17925,-27430,-17944,-27418,-17963,-27406,-17981,-27393,-18000,-27381,-18019,-27369,-18037,-27356,-18056,-27344,-18075,-27332,-18093,-27320,-18112,-27307,-18131,-27295,-18149,-27282,-18168,-27270,-18186,-27258,-18205,-27245,-18223,-27233,-18242,-27220,-18261,-27208,-18279,-27196,-18298,-27183,-18316,-27171,-18335,-27158,-18353,-27146,-18372,-27133,-18390,-27121,-18409,-27108,-18427,-27095,-18446,-27083,-18464,-27070,-18483,-27058,-18501,-27045,-18519,-27032,-18538,-27020,-18556,-27007,-18575,-26995,-18593,-26982,-18611,-26969,-18630,-26956,-18648,-26944,-18667,-26931,-18685,-26918,-18703,-26906,-18722,-26893,-18740,-26880,-18758,-26867,-18777,-26854,-18795,-26842,-18813,-26829,-18831,-26816,-18850,-26803,-18868,-26790,-18886,-26777,-18905,-26765,-18923,-26752,-18941,-26739,-18959,-26726,-18977,-26713,-18996,-26700,-19014,-26687,-19032,-26674,-19050,-26661,-19068,-26648,-19087,-26635,-19105,-26622,-19123,-26609,-19141,-26596,-19159,-26583,-19177,-26570,-19195,-26557,-19213,-26544,-19232,-26531,-19250,-26517,-19268,-26504,-19286,-26491,-19304,-26478,-19322,-26465,-19340,-26452,-19358,-26438,-19376,-26425,-19394,-26412,-19412,-26399,-19430,-26386,-19448,-26372,-19466,-26359,-19484,-26346,-19502,-26333,-19520,-26319,-19538,-26306,-19556,-26293,-19574,-26279,-19591,-26266,-19609,-26253,-19627,-26239,-19645,-26226,-19663,-26212,-19681,-26199,-19699,-26186,-19717,-26172,-19734,-26159,-19752,-26145,-19770,-26132,-19788,-26118,-19806,-26105,-19823,-26091,-19841,-26078,-19859,-26064,-19877,-26051,-19895,-26037,-19912,-26023,-19930,-26010,-19948,-25996,-19966,-25983,-19983,-25969,-20001,-25955,-20019,-25942,-20036,-25928,-20054,-25914,-20072,-25901,-20089,-25887,-20107,-25873,-20125,-25860,-20142,-25846,-20160,-25832,-20177,-25818,-20195,-25805,-20213,-25791,-20230,-25777,-20248,-25763,-20265,-25750,-20283,-25736,-20300,-25722,-20318,-25708,-20335,-25694,-20353,-25680,-20370,-25666,-20388,-25653,-20405,-25639,-20423,-25625,-20440,-25611,-20458,-25597,-20475,-25583,-20493,-25569,-20510,-25555,-20528,-25541,-20545,-25527,-20562,-25513,-20580,-25499,-20597,-25485,-20614,-25471,-20632,-25457,-20649,-25443,-20667,-25429,-20684,-25415,-20701,-25400,-20719,-25386,-20736,-25372,-20753,-25358,-20770,-25344,-20788,-25330,-20805,-25316,-20822,-25301,-20839,-25287,-20857,-25273,-20874,-25259,-20891,-25244,-20908,-25230,-20926,-25216,-20943,-25202,-20960,-25187,-20977,-25173,-20994,-25159,-21011,-25145,-21028,-25130,-21046,-25116,-21063,-25101,-21080,-25087,-21097,-25073,-21114,-25058,-21131,-25044,-21148,-25030,-21165,-25015,-21182,-25001,-21199,-24986,-21216,-24972,-21233,-24957,-21250,-24943,-21267,-24928,-21284,-24914,-21301,-24899,-21318,-24885,-21335,-24870,-21352,-24856,-21369,-24841,-21386,-24827,-21403,-24812,-21420,-24797,-21437,-24783,-21454,-24768,-21471,-24754,-21487,-24739,-21504,-24724,-21521,-24710,-21538,-24695,-21555,-24680,-21572,-24665,-21588,-24651,-21605,-24636,-21622,-24621,-21639,-24607,-21656,-24592,-21672,-24577,-21689,-24562,-21706,-24547,-21723,-24533,-21739,-24518,-21756,-24503,-21773,-24488,-21789,-24473,-21806,-24458,-21823,-24444,-21839,-24429,-21856,-24414,-21873,-24399,-21889,-24384,-21906,-24369,-21923,-24354,-21939,-24339,-21956,-24324,-21972,-24309,-21989,-24294,-22005,-24279,-22022,-24264,-22039,-24249,-22055,-24234,-22072,-24219,-22088,-24204,-22105,-24189,-22121,-24174,-22138,-24159,-22154,-24144,-22170,-24129,-22187,-24114,-22203,-24098,-22220,-24083,-22236,-24068,-22253,-24053,-22269,-24038,-22285,-24023,-22302,-24007,-22318,-23992,-22334,-23977,-22351,-23962,-22367,-23946,-22383,-23931,-22400,-23916,-22416,-23901,-22432,-23885,-22449,-23870,-22465,-23855,-22481,-23839,-22497,-23824,-22514,-23809,-22530,-23793,-22546,-23778,-22562,-23763,-22578,-23747,-22595,-23732,-22611,-23716,-22627,-23701,-22643,-23686,-22659,-23670,-22675,-23655,-22692,-23639,-22708,-23624,-22724,-23608,-22740,-23593,-22756,-23577,-22772,-23562,-22788,-23546,-22804,-23531,-22820,-23515,-22836,-23500,-22852,-23484,-22868,-23468,-22884,-23453,-22900,-23437,-22916,-23422,-22932,-23406,-22948,-23390,-22964,-23375,-22980,-23359,-22996,-23343,-23012,-23328,-23028,-23312,-23044,-23296,-23059,-23281,-23075,-23265,-23091,-23249,-23107,-23233,-23123,-23218,-23139,-23202,-23154,-23186,-23170,-23170,-23186,-23154,-23202,-23139,-23218,-23123,-23233,-23107,-23249,-23091,-23265,-23075,-23281,-23059,-23296,-23044,-23312,-23028,-23328,-23012,-23343,-22996,-23359,-22980,-23375,-22964,-23390,-22948,-23406,-22932,-23422,-22916,-23437,-22900,-23453,-22884,-23468,-22868,-23484,-22852,-23500,-22836,-23515,-22820,-23531,-22804,-23546,-22788,-23562,-22772,-23577,-22756,-23593,-22740,-23608,-22724,-23624,-22708,-23639,-22692,-23655,-22675,-23670,-22659,-23686,-22643,-23701,-22627,-23716,-22611,-23732,-22595,-23747,-22578,-23763,-22562,-23778,-22546,-23793,-22530,-23809,-22514,-23824,-22497,-23839,-22481,-23855,-22465,-23870,-22449,-23885,-22432,-23901,-22416,-23916,-22400,-23931,-22383,-23946,-22367,-23962,-22351,-23977,-22334,-23992,-22318,-24007,-22302,-24023,-22285,-24038,-22269,-24053,-22253,-24068,-22236,-24083,-22220,-24098,-22203,-24114,-22187,-24129,-22170,-24144,-22154,-24159,-22138,-24174,-22121,-24189,-22105,-24204,-22088,-24219,-22072,-24234,-22055,-24249,-22039,-24264,-22022,-24279,-22005,-24294,-21989,-24309,-21972,-24324,-21956,-24339,-21939,-24354,-21923,-24369,-21906,-24384,-21889,-24399,-21873,-24414,-21856,-24429,-21839,-24444,-21823,-24458,-21806,-24473,-21789,-24488,-21773,-24503,-21756,-24518,-21739,-24533,-21723,-24547,-21706,-24562,-21689,-24577,-21672,-24592,-21656,-24607,-21639,-24621,-21622,-24636,-21605,-24651,-21588,-24665,-21572,-24680,-21555,-24695,-21538,-24710,-21521,-24724,-21504,-24739,-21487,-24754,-21471,-24768,-21454,-24783,-21437,-24797,-21420,-24812,-21403,-24827,-21386,-24841,-21369,-24856,-21352,-24870,-21335,-24885,-21318,-24899,-21301,-24914,-21284,-24928,-21267,-24943,-21250,-24957,-21233,-24972,-21216,-24986,-21199,-25001,-21182,-25015,-21165,-25030,-21148,-25044,-21131,-25058,-21114,-25073,-21097,-25087,-21080,-25101,-21063,-25116,-21046,-25130,-21028,-25145,-21011,-25159,-20994,-25173,-20977,-25187,-20960,-25202,-20943,-25216,-20926,-25230,-20908,-25244,-20891,-25259,-20874,-25273,-20857,-25287,-20839,-25301,-20822,-25316,-20805,-25330,-20788,-25344,-20770,-25358,-20753,-25372,-20736,-25386,-20719,-25400,-20701,-25415,-20684,-25429,-20667,-25443,-20649,-25457,-20632,-25471,-20614,-25485,-20597,-25499,-20580,-25513,-20562,-25527,-20545,-25541,-20528,-25555,-20510,-25569,-20493,-25583,-20475,-25597,-20458,-25611,-20440,-25625,-20423,-25639,-20405,-25653,-20388,-25666,-20370,-25680,-20353,-25694,-20335,-25708,-20318,-25722,-20300,-25736,-20283,-25750,-20265,-25763,-20248,-25777,-20230,-25791,-20213,-25805,-20195,-25818,-20177,-25832,-20160,-25846,-20142,-25860,-20125,-25873,-20107,-25887,-20089,-25901,-20072,-25914,-20054,-25928,-20036,-25942,-20019,-25955,-20001,-25969,-19983,-25983,-19966,-25996,-19948,-26010,-19930,-26023,-19912,-26037,-19895,-26051,-19877,-26064,-19859,-26078,-19841,-26091,-19823,-26105,-19806,-26118,-19788,-26132,-19770,-26145,-19752,-26159,-19734,-26172,-19717,-26186,-19699,-26199,-19681,-26212,-19663,-26226,-19645,-26239,-19627,-26253,-19609,-26266,-19591,-26279,-19574,-26293,-19556,-26306,-19538,-26319,-19520,-26333,-19502,-26346,-19484,-26359,-19466,-26372,-19448,-26386,-19430,-26399,-19412,-26412,-19394,-26425,-19376,-26438,-19358,-26452,-19340,-26465,-19322,-26478,-19304,-26491,-19286,-26504,-19268,-26517,-19250,-26531,-19232,-26544,-19213,-26557,-19195,-26570,-19177,-26583,-19159,-26596,-19141,-26609,-19123,-26622,-19105,-26635,-19087,-26648,-19068,-26661,-19050,-26674,-19032,-26687,-19014,-26700,-18996,-26713,-18977,-26726,-18959,-26739,-18941,-26752,-18923,-26765,-18905,-26777,-18886,-26790,-18868,-26803,-18850,-26816,-18831,-26829,-18813,-26842,-18795,-26854,-18777,-26867,-18758,-26880,-18740,-26893,-18722,-26906,-18703,-26918,-18685,-26931,-18667,-26944,-18648,-26956,-18630,-26969,-18611,-26982,-18593,-26995,-18575,-27007,-18556,-27020,-18538,-27032,-18519,-27045,-18501,-27058,-18483,-27070,-18464,-27083,-18446,-27095,-18427,-27108,-18409,-27121,-18390,-27133,-18372,-27146,-18353,-27158,-18335,-27171,-18316,-27183,-18298,-27196,-18279,-27208,-18261,-27220,-18242,-27233,-18223,-27245,-18205,-27258,-18186,-27270,-18168,-27282,-18149,-27295,-18131,-27307,-18112,-27320,-18093,-27332,-18075,-27344,-18056,-27356,-18037,-27369,-18019,-27381,-18000,-27393,-17981,-27406,-17963,-27418,-17944,-27430,-17925,-27442,-17907,-27454,-17888,-27467,-17869,-27479,-17850,-27491,-17832,-27503,-17813,-27515,-17794,-27527,-17775,-27539,-17757,-27552,-17738,-27564,-17719,-27576,-17700,-27588,-17681,-27600,-17663,-27612,-17644,-27624,-17625,-27636,-17606,-27648,-17587,-27660,-17568,-27672,-17550,-27684,-17531,-27696,-17512,-27708,-17493,-27720,-17474,-27732,-17455,-27743,-17436,-27755,-17417,-27767,-17398,-27779,-17380,-27791,-17361,-27803,-17342,-27815,-17323,-27826,-17304,-27838,-17285,-27850,-17266,-27862,-17247,-27873,-17228,-27885,-17209,-27897,-17190,-27909,-17171,-27920,-17152,-27932,-17133,-27944,-17114,-27955,-17095,-27967,-17075,-27979,-17056,-27990,-17037,-28002,-17018,-28013,-16999,-28025,-16980,-28037,-16961,-28048,-16942,-28060,-16923,-28071,-16904,-28083,-16884,-28094,-16865,-28106,-16846,-28117,-16827,-28129,-16808,-28140,-16789,-28152,-16769,-28163,-16750,-28174,-16731,-28186,-16712,-28197,-16693,-28209,-16673,-28220,-16654,-28231,-16635,-28243,-16616,-28254,-16596,-28265,-16577,-28276,-16558,-28288,-16539,-28299,-16519,-28310,-16500,-28322,-16481,-28333,-16461,-28344,-16442,-28355,-16423,-28366,-16403,-28378,-16384,-28389,-16365,-28400,-16345,-28411,-16326,-28422,-16307,-28433,-16287,-28444,-16268,-28455,-16248,-28466,-16229,-28478,-16210,-28489,-16190,-28500,-16171,-28511,-16151,-28522,-16132,-28533,-16112,-28544,-16093,-28555,-16073,-28566,-16054,-28576,-16035,-28587,-16015,-28598,-15996,-28609,-15976,-28620,-15957,-28631,-15937,-28642,-15918,-28653,-15898,-28663,-15878,-28674,-15859,-28685,-15839,-28696,-15820,-28707,-15800,-28717,-15781,-28728,-15761,-28739,-15741,-28750,-15722,-28760,-15702,-28771,-15683,-28782,-15663,-28792,-15643,-28803,-15624,-28814,-15604,-28824,-15584,-28835,-15565,-28846,-15545,-28856,-15526,-28867,-15506,-28877,-15486,-28888,-15466,-28898,-15447,-28909,-15427,-28919,-15407,-28930,-15388,-28940,-15368,-28951,-15348,-28961,-15328,-28972,-15309,-28982,-15289,-28993,-15269,-29003,-15249,-29013,-15230,-29024,-15210,-29034,-15190,-29045,-15170,-29055,-15150,-29065,-15131,-29075,-15111,-29086,-15091,-29096,-15071,-29106,-15051,-29117,-15031,-29127,-15012,-29137,-14992,-29147,-14972,-29157,-14952,-29168,-14932,-29178,-14912,-29188,-14892,-29198,-14872,-29208,-14853,-29218,-14833,-29228,-14813,-29239,-14793,-29249,-14773,-29259,-14753,-29269,-14733,-29279,-14713,-29289,-14693,-29299,-14673,-29309,-14653,-29319,-14633,-29329,-14613,-29339,-14593,-29349,-14573,-29359,-14553,-29369,-14533,-29378,-14513,-29388,-14493,-29398,-14473,-29408,-14453,-29418,-14433,-29428,-14413,-29438,-14393,-29447,-14373,-29457,-14353,-29467,-14332,-29477,-14312,-29486,-14292,-29496,-14272,-29506,-14252,-29516,-14232,-29525,-14212,-29535,-14192,-29545,-14172,-29554,-14151,-29564,-14131,-29574,-14111,-29583,-14091,-29593,-14071,-29602,-14051,-29612,-14030,-29622,-14010,-29631,-13990,-29641,-13970,-29650,-13950,-29660,-13929,-29669,-13909,-29679,-13889,-29688,-13869,-29697,-13848,-29707,-13828,-29716,-13808,-29726,-13788,-29735,-13767,-29745,-13747,-29754,-13727,-29763,-13707,-29773,-13686,-29782,-13666,-29791,-13646,-29801,-13625,-29810,-13605,-29819,-13585,-29828,-13564,-29838,-13544,-29847,-13524,-29856,-13503,-29865,-13483,-29874,-13463,-29884,-13442,-29893,-13422,-29902,-13401,-29911,-13381,-29920,-13361,-29929,-13340,-29938,-13320,-29947,-13299,-29956,-13279,-29965,-13259,-29974,-13238,-29984,-13218,-29993,-13197,-30002,-13177,-30010,-13156,-30019,-13136,-30028,-13115,-30037,-13095,-30046,-13075,-30055,-13054,-30064,-13034,-30073,-13013,-30082,-12993,-30091,-12972,-30099,-12951,-30108,-12931,-30117,-12910,-30126,-12890,-30135,-12869,-30143,-12849,-30152,-12828,-30161,-12808,-30170,-12787,-30178,-12767,-30187,-12746,-30196,-12725,-30204,-12705,-30213,-12684,-30222,-12664,-30230,-12643,-30239,-12622,-30248,-12602,-30256,-12581,-30265,-12561,-30273,-12540,-30282,-12519,-30290,-12499,-30299,-12478,-30307,-12457,-30316,-12437,-30324,-12416,-30333,-12395,-30341,-12375,-30350,-12354,-30358,-12333,-30366,-12313,-30375,-12292,-30383,-12271,-30392,-12250,-30400,-12230,-30408,-12209,-30417,-12188,-30425,-12167,-30433,-12147,-30441,-12126,-30450,-12105,-30458,-12084,-30466,-12064,-30474,-12043,-30483,-12022,-30491,-12001,-30499,-11981,-30507,-11960,-30515,-11939,-30523,-11918,-30531,-11897,-30540,-11877,-30548,-11856,-30556,-11835,-30564,-11814,-30572,-11793,-30580,-11772,-30588,-11751,-30596,-11731,-30604,-11710,-30612,-11689,-30620,-11668,-30628,-11647,-30636,-11626,-30644,-11605,-30652,-11584,-30659,-11564,-30667,-11543,-30675,-11522,-30683,-11501,-30691,-11480,-30699,-11459,-30706,-11438,-30714,-11417,-30722,-11396,-30730,-11375,-30738,-11354,-30745,-11333,-30753,-11312,-30761,-11291,-30768,-11270,-30776,-11249,-30784,-11228,-30791,-11207,-30799,-11186,-30807,-11165,-30814,-11144,-30822,-11123,-30829,-11102,-30837,-11081,-30845,-11060,-30852,-11039,-30860,-11018,-30867,-10997,-30875,-10976,-30882,-10955,-30890,-10934,-30897,-10913,-30904,-10892,-30912,-10871,-30919,-10850,-30927,-10829,-30934,-10808,-30941,-10787,-30949,-10766,-30956,-10744,-30963,-10723,-30971,-10702,-30978,-10681,-30985,-10660,-30992,-10639,-31000,-10618,-31007,-10597,-31014,-10575,-31021,-10554,-31029,-10533,-31036,-10512,-31043,-10491,-31050,-10470,-31057,-10448,-31064,-10427,-31071,-10406,-31078,-10385,-31086,-10364,-31093,-10343,-31100,-10321,-31107,-10300,-31114,-10279,-31121,-10258,-31128,-10236,-31135,-10215,-31142,-10194,-31149,-10173,-31155,-10152,-31162,-10130,-31169,-10109,-31176,-10088,-31183,-10067,-31190,-10045,-31197,-10024,-31204,-10003,-31210,-9981,-31217,-9960,-31224,-9939,-31231,-9918,-31237,-9896,-31244,-9875,-31251,-9854,-31258,-9832,-31264,-9811,-31271,-9790,-31278,-9768,-31284,-9747,-31291,-9726,-31298,-9704,-31304,-9683,-31311,-9662,-31317,-9640,-31324,-9619,-31331,-9598,-31337,-9576,-31344,-9555,-31350,-9534,-31357,-9512,-31363,-9491,-31370,-9469,-31376,-9448,-31382,-9427,-31389,-9405,-31395,-9384,-31402,-9363,-31408,-9341,-31414,-9320,-31421,-9298,-31427,-9277,-31433,-9255,-31440,-9234,-31446,-9213,-31452,-9191,-31458,-9170,-31465,-9148,-31471,-9127,-31477,-9105,-31483,-9084,-31490,-9062,-31496,-9041,-31502,-9019,-31508,-8998,-31514,-8976,-31520,-8955,-31526,-8933,-31532,-8912,-31538,-8890,-31545,-8869,-31551,-8847,-31557,-8826,-31563,-8804,-31569,-8783,-31575,-8761,-31581,-8740,-31587,-8718,-31592,-8697,-31598,-8675,-31604,-8654,-31610,-8632,-31616,-8611,-31622,-8589,-31628,-8568,-31634,-8546,-31639,-8524,-31645,-8503,-31651,-8481,-31657,-8460,-31663,-8438,-31668,-8416,-31674,-8395,-31680,-8373,-31685,-8352,-31691,-8330,-31697,-8308,-31702,-8287,-31708,-8265,-31714,-8244,-31719,-8222,-31725,-8200,-31730,-8179,-31736,-8157,-31742,-8135,-31747,-8114,-31753,-8092,-31758,-8071,-31764,-8049,-31769,-8027,-31775,-8006,-31780,-7984,-31786,-7962,-31791,-7941,-31796,-7919,-31802,-7897,-31807,-7876,-31812,-7854,-31818,-7832,-31823,-7810,-31828,-7789,-31834,-7767,-31839,-7745,-31844,-7724,-31850,-7702,-31855,-7680,-31860,-7658,-31865,-7637,-31870,-7615,-31876,-7593,-31881,-7572,-31886,-7550,-31891,-7528,-31896,-7506,-31901,-7485,-31906,-7463,-31912,-7441,-31917,-7419,-31922,-7398,-31927,-7376,-31932,-7354,-31937,-7332,-31942,-7311,-31947,-7289,-31952,-7267,-31957,-7245,-31962,-7223,-31966,-7202,-31971,-7180,-31976,-7158,-31981,-7136,-31986,-7114,-31991,-7093,-31996,-7071,-32000,-7049,-32005,-7027,-32010,-7005,-32015,-6983,-32020,-6962,-32024,-6940,-32029,-6918,-32034,-6896,-32038,-6874,-32043,-6852,-32048,-6831,-32052,-6809,-32057,-6787,-32062,-6765,-32066,-6743,-32071,-6721,-32075,-6699,-32080,-6678,-32085,-6656,-32089,-6634,-32094,-6612,-32098,-6590,-32103,-6568,-32107,-6546,-32111,-6524,-32116,-6503,-32120,-6481,-32125,-6459,-32129,-6437,-32134,-6415,-32138,-6393,-32142,-6371,-32147,-6349,-32151,-6327,-32155,-6305,-32159,-6283,-32164,-6262,-32168,-6240,-32172,-6218,-32177,-6196,-32181,-6174,-32185,-6152,-32189,-6130,-32193,-6108,-32197,-6086,-32202,-6064,-32206,-6042,-32210,-6020,-32214,-5998,-32218,-5976,-32222,-5954,-32226,-5932,-32230,-5910,-32234,-5888,-32238,-5866,-32242,-5844,-32246,-5822,-32250,-5800,-32254,-5778,-32258,-5756,-32262,-5734,-32266,-5712,-32270,-5690,-32274,-5668,-32277,-5646,-32281,-5624,-32285,-5602,-32289,-5580,-32293,-5558,-32296,-5536,-32300,-5514,-32304,-5492,-32308,-5470,-32311,-5448,-32315,-5426,-32319,-5404,-32323,-5382,-32326,-5360,-32330,-5338,-32333,-5316,-32337,-5294,-32341,-5272,-32344,-5250,-32348,-5228,-32351,-5206,-32355,-5184,-32358,-5162,-32362,-5140,-32365,-5118,-32369,-5095,-32372,-5073,-32376,-5051,-32379,-5029,-32383,-5007,-32386,-4985,-32390,-4963,-32393,-4941,-32396,-4919,-32400,-4897,-32403,-4875,-32406,-4853,-32410,-4831,-32413,-4808,-32416,-4786,-32419,-4764,-32423,-4742,-32426,-4720,-32429,-4698,-32432,-4676,-32435,-4654,-32439,-4632,-32442,-4609,-32445,-4587,-32448,-4565,-32451,-4543,-32454,-4521,-32457,-4499,-32460,-4477,-32463,-4455,-32466,-4432,-32469,-4410,-32472,-4388,-32475,-4366,-32478,-4344,-32481,-4322,-32484,-4300,-32487,-4277,-32490,-4255,-32493,-4233,-32496,-4211,-32499,-4189,-32502,-4167,-32504,-4145,-32507,-4122,-32510,-4100,-32513,-4078,-32516,-4056,-32518,-4034,-32521,-4012,-32524,-3989,-32527,-3967,-32529,-3945,-32532,-3923,-32535,-3901,-32537,-3878,-32540,-3856,-32542,-3834,-32545,-3812,-32548,-3790,-32550,-3768,-32553,-3745,-32555,-3723,-32558,-3701,-32560,-3679,-32563,-3657,-32565,-3634,-32568,-3612,-32570,-3590,-32573,-3568,-32575,-3546,-32578,-3523,-32580,-3501,-32582,-3479,-32585,-3457,-32587,-3434,-32589,-3412,-32592,-3390,-32594,-3368,-32596,-3346,-32599,-3323,-32601,-3301,-32603,-3279,-32605,-3257,-32608,-3234,-32610,-3212,-32612,-3190,-32614,-3168,-32616,-3146,-32618,-3123,-32620,-3101,-32623,-3079,-32625,-3057,-32627,-3034,-32629,-3012,-32631,-2990,-32633,-2968,-32635,-2945,-32637,-2923,-32639,-2901,-32641,-2879,-32643,-2856,-32645,-2834,-32647,-2812,-32649,-2790,-32650,-2767,-32652,-2745,-32654,-2723,-32656,-2701,-32658,-2678,-32660,-2656,-32662,-2634,-32663,-2611,-32665,-2589,-32667,-2567,-32669,-2545,-32670,-2522,-32672,-2500,-32674,-2478,-32675,-2456,-32677,-2433,-32679,-2411,-32680,-2389,-32682,-2366,-32684,-2344,-32685,-2322,-32687,-2300,-32688,-2277,-32690,-2255,-32691,-2233,-32693,-2210,-32694,-2188,-32696,-2166,-32697,-2144,-32699,-2121,-32700,-2099,-32702,-2077,-32703,-2054,-32704,-2032,-32706,-2010,-32707,-1987,-32709,-1965,-32710,-1943,-32711,-1921,-32712,-1898,-32714,-1876,-32715,-1854,-32716,-1831,-32718,-1809,-32719,-1787,-32720,-1764,-32721,-1742,-32722,-1720,-32724,-1698,-32725,-1675,-32726,-1653,-32727,-1631,-32728,-1608,-32729,-1586,-32730,-1564,-32731,-1541,-32732,-1519,-32733,-1497,-32734,-1474,-32735,-1452,-32736,-1430,-32737,-1407,-32738,-1385,-32739,-1363,-32740,-1340,-32741,-1318,-32742,-1296,-32743,-1274,-32744,-1251,-32744,-1229,-32745,-1207,-32746,-1184,-32747,-1162,-32748,-1140,-32748,-1117,-32749,-1095,-32750,-1073,-32751,-1050,-32751,-1028,-32752,-1006,-32753,-983,-32753,-961,-32754,-939,-32755,-916,-32755,-894,-32756,-872,-32757,-849,-32757,-827,-32758,-805,-32758,-782,-32759,-760,-32759,-738,-32760,-715,-32760,-693,-32761,-671,-32761,-648,-32762,-626,-32762,-604,-32762,-581,-32763,-559,-32763,-537,-32763,-514,-32764,-492,-32764,-470,-32764,-447,-32765,-425,-32765,-403,-32765,-380,-32766,-358,-32766,-336,-32766,-313,-32766,-291,-32766,-269,-32767,-246,-32767,-224,-32767,-202,-32767,-179,-32767,-157,-32767,-135,-32767,-112,-32767,-90,-32767,-68,-32767,-45,-32767,-23,-32767,-1,-32767,22,-32767,44,-32767,67,-32767,89,-32767,111,-32767,134,-32767,156,-32767,178,-32767,201,-32767,223,-32767,245,-32766,268,-32766,290,-32766,312,-32766,335,-32766,357,-32765,379,-32765,402,-32765,424,-32764,446,-32764,469,-32764,491,-32763,513,-32763,536,-32763,558,-32762,580,-32762,603,-32762,625,-32761,647,-32761,670,-32760,692,-32760,714,-32759,737,-32759,759,-32758,781,-32758,804,-32757,826,-32757,848,-32756,871,-32755,893,-32755,915,-32754,938,-32753,960,-32753,982,-32752,1005,-32751,1027,-32751,1049,-32750,1072,-32749,1094,-32748,1116,-32748,1139,-32747,1161,-32746,1183,-32745,1206,-32744,1228,-32744,1250,-32743,1273,-32742,1295,-32741,1317,-32740,1339,-32739,1362,-32738,1384,-32737,1406,-32736,1429,-32735,1451,-32734,1473,-32733,1496,-32732,1518,-32731,1540,-32730,1563,-32729,1585,-32728,1607,-32727,1630,-32726,1652,-32725,1674,-32724,1697,-32722,1719,-32721,1741,-32720,1763,-32719,1786,-32718,1808,-32716,1830,-32715,1853,-32714,1875,-32712,1897,-32711,1920,-32710,1942,-32709,1964,-32707,1986,-32706,2009,-32704,2031,-32703,2053,-32702,2076,-32700,2098,-32699,2120,-32697,2143,-32696,2165,-32694,2187,-32693,2209,-32691,2232,-32690,2254,-32688,2276,-32687,2299,-32685,2321,-32684,2343,-32682,2365,-32680,2388,-32679,2410,-32677,2432,-32675,2455,-32674,2477,-32672,2499,-32670,2521,-32669,2544,-32667,2566,-32665,2588,-32663,2610,-32662,2633,-32660,2655,-32658,2677,-32656,2700,-32654,2722,-32652,2744,-32650,2766,-32649,2789,-32647,2811,-32645,2833,-32643,2855,-32641,2878,-32639,2900,-32637,2922,-32635,2944,-32633,2967,-32631,2989,-32629,3011,-32627,3033,-32625,3056,-32623,3078,-32620,3100,-32618,3122,-32616,3145,-32614,3167,-32612,3189,-32610,3211,-32608,3233,-32605,3256,-32603,3278,-32601,3300,-32599,3322,-32596,3345,-32594,3367,-32592,3389,-32589,3411,-32587,3433,-32585,3456,-32582,3478,-32580,3500,-32578,3522,-32575,3545,-32573,3567,-32570,3589,-32568,3611,-32565,3633,-32563,3656,-32560,3678,-32558,3700,-32555,3722,-32553,3744,-32550,3767,-32548,3789,-32545,3811,-32542,3833,-32540,3855,-32537,3877,-32535,3900,-32532,3922,-32529,3944,-32527,3966,-32524,3988,-32521,4011,-32518,4033,-32516,4055,-32513,4077,-32510,4099,-32507,4121,-32504,4144,-32502,4166,-32499,4188,-32496,4210,-32493,4232,-32490,4254,-32487,4276,-32484,4299,-32481,4321,-32478,4343,-32475,4365,-32472,4387,-32469,4409,-32466,4431,-32463,4454,-32460,4476,-32457,4498,-32454,4520,-32451,4542,-32448,4564,-32445,4586,-32442,4608,-32439,4631,-32435,4653,-32432,4675,-32429,4697,-32426,4719,-32423,4741,-32419,4763,-32416,4785,-32413,4807,-32410,4830,-32406,4852,-32403,4874,-32400,4896,-32396,4918,-32393,4940,-32390,4962,-32386,4984,-32383,5006,-32379,5028,-32376,5050,-32372,5072,-32369,5094,-32365,5117,-32362,5139,-32358,5161,-32355,5183,-32351,5205,-32348,5227,-32344,5249,-32341,5271,-32337,5293,-32333,5315,-32330,5337,-32326,5359,-32323,5381,-32319,5403,-32315,5425,-32311,5447,-32308,5469,-32304,5491,-32300,5513,-32296,5535,-32293,5557,-32289,5579,-32285,5601,-32281,5623,-32277,5645,-32274,5667,-32270,5689,-32266,5711,-32262,5733,-32258,5755,-32254,5777,-32250,5799,-32246,5821,-32242,5843,-32238,5865,-32234,5887,-32230,5909,-32226,5931,-32222,5953,-32218,5975,-32214,5997,-32210,6019,-32206,6041,-32202,6063,-32197,6085,-32193,6107,-32189,6129,-32185,6151,-32181,6173,-32177,6195,-32172,6217,-32168,6239,-32164,6261,-32159,6282,-32155,6304,-32151,6326,-32147,6348,-32142,6370,-32138,6392,-32134,6414,-32129,6436,-32125,6458,-32120,6480,-32116,6502,-32111,6523,-32107,6545,-32103,6567,-32098,6589,-32094,6611,-32089,6633,-32085,6655,-32080,6677,-32075,6698,-32071,6720,-32066,6742,-32062,6764,-32057,6786,-32052,6808,-32048,6830,-32043,6851,-32038,6873,-32034,6895,-32029,6917,-32024,6939,-32020,6961,-32015,6982,-32010,7004,-32005,7026,-32000,7048,-31996,7070,-31991,7092,-31986,7113,-31981,7135,-31976,7157,-31971,7179,-31966,7201,-31962,7222,-31957,7244,-31952,7266,-31947,7288,-31942,7310,-31937,7331,-31932,7353,-31927,7375,-31922,7397,-31917,7418,-31912,7440,-31906,7462,-31901,7484,-31896,7505,-31891,7527,-31886,7549,-31881,7571,-31876,7592,-31870,7614,-31865,7636,-31860,7657,-31855,7679,-31850,7701,-31844,7723,-31839,7744,-31834,7766,-31828,7788,-31823,7809,-31818,7831,-31812,7853,-31807,7875,-31802,7896,-31796,7918,-31791,7940,-31786,7961,-31780,7983,-31775,8005,-31769,8026,-31764,8048,-31758,8070,-31753,8091,-31747,8113,-31742,8134,-31736,8156,-31730,8178,-31725,8199,-31719,8221,-31714,8243,-31708,8264,-31702,8286,-31697,8307,-31691,8329,-31685,8351,-31680,8372,-31674,8394,-31668,8415,-31663,8437,-31657,8459,-31651,8480,-31645,8502,-31639,8523,-31634,8545,-31628,8567,-31622,8588,-31616,8610,-31610,8631,-31604,8653,-31598,8674,-31592,8696,-31587,8717,-31581,8739,-31575,8760,-31569,8782,-31563,8803,-31557,8825,-31551,8846,-31545,8868,-31538,8889,-31532,8911,-31526,8932,-31520,8954,-31514,8975,-31508,8997,-31502,9018,-31496,9040,-31490,9061,-31483,9083,-31477,9104,-31471,9126,-31465,9147,-31458,9169,-31452,9190,-31446,9212,-31440,9233,-31433,9254,-31427,9276,-31421,9297,-31414,9319,-31408,9340,-31402,9362,-31395,9383,-31389,9404,-31382,9426,-31376,9447,-31370,9468,-31363,9490,-31357,9511,-31350,9533,-31344,9554,-31337,9575,-31331,9597,-31324,9618,-31317,9639,-31311,9661,-31304,9682,-31298,9703,-31291,9725,-31284,9746,-31278,9767,-31271,9789,-31264,9810,-31258,9831,-31251,9853,-31244,9874,-31237,9895,-31231,9917,-31224,9938,-31217,9959,-31210,9980,-31204,10002,-31197,10023,-31190,10044,-31183,10066,-31176,10087,-31169,10108,-31162,10129,-31155,10151,-31149,10172,-31142,10193,-31135,10214,-31128,10235,-31121,10257,-31114,10278,-31107,10299,-31100,10320,-31093,10342,-31086,10363,-31078,10384,-31071,10405,-31064,10426,-31057,10447,-31050,10469,-31043,10490,-31036,10511,-31029,10532,-31021,10553,-31014,10574,-31007,10596,-31000,10617,-30992,10638,-30985,10659,-30978,10680,-30971,10701,-30963,10722,-30956,10743,-30949,10765,-30941,10786,-30934,10807,-30927,10828,-30919,10849,-30912,10870,-30904,10891,-30897,10912,-30890,10933,-30882,10954,-30875,10975,-30867,10996,-30860,11017,-30852,11038,-30845,11059,-30837,11080,-30829,11101,-30822,11122,-30814,11143,-30807,11164,-30799,11185,-30791,11206,-30784,11227,-30776,11248,-30768,11269,-30761,11290,-30753,11311,-30745,11332,-30738,11353,-30730,11374,-30722,11395,-30714,11416,-30706,11437,-30699,11458,-30691,11479,-30683,11500,-30675,11521,-30667,11542,-30659,11563,-30652,11583,-30644,11604,-30636,11625,-30628,11646,-30620,11667,-30612,11688,-30604,11709,-30596,11730,-30588,11750,-30580,11771,-30572,11792,-30564,11813,-30556,11834,-30548,11855,-30540,11876,-30531,11896,-30523,11917,-30515,11938,-30507,11959,-30499,11980,-30491,12000,-30483,12021,-30474,12042,-30466,12063,-30458,12083,-30450,12104,-30441,12125,-30433,12146,-30425,12166,-30417,12187,-30408,12208,-30400,12229,-30392,12249,-30383,12270,-30375,12291,-30366,12312,-30358,12332,-30350,12353,-30341,12374,-30333,12394,-30324,12415,-30316,12436,-30307,12456,-30299,12477,-30290,12498,-30282,12518,-30273,12539,-30265,12560,-30256,12580,-30248,12601,-30239,12621,-30230,12642,-30222,12663,-30213,12683,-30204,12704,-30196,12724,-30187,12745,-30178,12766,-30170,12786,-30161,12807,-30152,12827,-30143,12848,-30135,12868,-30126,12889,-30117,12909,-30108,12930,-30099,12950,-30091,12971,-30082,12992,-30073,13012,-30064,13033,-30055,13053,-30046,13074,-30037,13094,-30028,13114,-30019,13135,-30010,13155,-30002,13176,-29993,13196,-29984,13217,-29974,13237,-29965,13258,-29956,13278,-29947,13298,-29938,13319,-29929,13339,-29920,13360,-29911,13380,-29902,13400,-29893,13421,-29884,13441,-29874,13462,-29865,13482,-29856,13502,-29847,13523,-29838,13543,-29828,13563,-29819,13584,-29810,13604,-29801,13624,-29791,13645,-29782,13665,-29773,13685,-29763,13706,-29754,13726,-29745,13746,-29735,13766,-29726,13787,-29716,13807,-29707,13827,-29697,13847,-29688,13868,-29679,13888,-29669,13908,-29660,13928,-29650,13949,-29641,13969,-29631,13989,-29622,14009,-29612,14029,-29602,14050,-29593,14070,-29583,14090,-29574,14110,-29564,14130,-29554,14150,-29545,14171,-29535,14191,-29525,14211,-29516,14231,-29506,14251,-29496,14271,-29486,14291,-29477,14311,-29467,14331,-29457,14352,-29447,14372,-29438,14392,-29428,14412,-29418,14432,-29408,14452,-29398,14472,-29388,14492,-29378,14512,-29369,14532,-29359,14552,-29349,14572,-29339,14592,-29329,14612,-29319,14632,-29309,14652,-29299,14672,-29289,14692,-29279,14712,-29269,14732,-29259,14752,-29249,14772,-29239,14792,-29228,14812,-29218,14832,-29208,14852,-29198,14871,-29188,14891,-29178,14911,-29168,14931,-29157,14951,-29147,14971,-29137,14991,-29127,15011,-29117,15030,-29106,15050,-29096,15070,-29086,15090,-29075,15110,-29065,15130,-29055,15149,-29045,15169,-29034,15189,-29024,15209,-29013,15229,-29003,15248,-28993,15268,-28982,15288,-28972,15308,-28961,15327,-28951,15347,-28940,15367,-28930,15387,-28919,15406,-28909,15426,-28898,15446,-28888,15465,-28877,15485,-28867,15505,-28856,15525,-28846,15544,-28835,15564,-28824,15583,-28814,15603,-28803,15623,-28792,15642,-28782,15662,-28771,15682,-28760,15701,-28750,15721,-28739,15740,-28728,15760,-28717,15780,-28707,15799,-28696,15819,-28685,15838,-28674,15858,-28663,15877,-28653,15897,-28642,15917,-28631,15936,-28620,15956,-28609,15975,-28598,15995,-28587,16014,-28576,16034,-28566,16053,-28555,16072,-28544,16092,-28533,16111,-28522,16131,-28511,16150,-28500,16170,-28489,16189,-28478,16209,-28466,16228,-28455,16247,-28444,16267,-28433,16286,-28422,16306,-28411,16325,-28400,16344,-28389,16364,-28378,16383,-28366,16402,-28355,16422,-28344,16441,-28333,16460,-28322,16480,-28310,16499,-28299,16518,-28288,16538,-28276,16557,-28265,16576,-28254,16595,-28243,16615,-28231,16634,-28220,16653,-28209,16672,-28197,16692,-28186,16711,-28174,16730,-28163,16749,-28152,16768,-28140,16788,-28129,16807,-28117,16826,-28106,16845,-28094,16864,-28083,16883,-28071,16903,-28060,16922,-28048,16941,-28037,16960,-28025,16979,-28013,16998,-28002,17017,-27990,17036,-27979,17055,-27967,17074,-27955,17094,-27944,17113,-27932,17132,-27920,17151,-27909,17170,-27897,17189,-27885,17208,-27873,17227,-27862,17246,-27850,17265,-27838,17284,-27826,17303,-27815,17322,-27803,17341,-27791,17360,-27779,17379,-27767,17397,-27755,17416,-27743,17435,-27732,17454,-27720,17473,-27708,17492,-27696,17511,-27684,17530,-27672,17549,-27660,17567,-27648,17586,-27636,17605,-27624,17624,-27612,17643,-27600,17662,-27588,17680,-27576,17699,-27564,17718,-27552,17737,-27539,17756,-27527,17774,-27515,17793,-27503,17812,-27491,17831,-27479,17849,-27467,17868,-27454,17887,-27442,17906,-27430,17924,-27418,17943,-27406,17962,-27393,17980,-27381,17999,-27369,18018,-27356,18036,-27344,18055,-27332,18074,-27320,18092,-27307,18111,-27295,18130,-27282,18148,-27270,18167,-27258,18185,-27245,18204,-27233,18222,-27220,18241,-27208,18260,-27196,18278,-27183,18297,-27171,18315,-27158,18334,-27146,18352,-27133,18371,-27121,18389,-27108,18408,-27095,18426,-27083,18445,-27070,18463,-27058,18482,-27045,18500,-27032,18518,-27020,18537,-27007,18555,-26995,18574,-26982,18592,-26969,18610,-26956,18629,-26944,18647,-26931,18666,-26918,18684,-26906,18702,-26893,18721,-26880,18739,-26867,18757,-26854,18776,-26842,18794,-26829,18812,-26816,18830,-26803,18849,-26790,18867,-26777,18885,-26765,18904,-26752,18922,-26739,18940,-26726,18958,-26713,18976,-26700,18995,-26687,19013,-26674,19031,-26661,19049,-26648,19067,-26635,19086,-26622,19104,-26609,19122,-26596,19140,-26583,19158,-26570,19176,-26557,19194,-26544,19212,-26531,19231,-26517,19249,-26504,19267,-26491,19285,-26478,19303,-26465,19321,-26452,19339,-26438,19357,-26425,19375,-26412,19393,-26399,19411,-26386,19429,-26372,19447,-26359,19465,-26346,19483,-26333,19501,-26319,19519,-26306,19537,-26293,19555,-26279,19573,-26266,19590,-26253,19608,-26239,19626,-26226,19644,-26212,19662,-26199,19680,-26186,19698,-26172,19716,-26159,19733,-26145,19751,-26132,19769,-26118,19787,-26105,19805,-26091,19822,-26078,19840,-26064,19858,-26051,19876,-26037,19894,-26023,19911,-26010,19929,-25996,19947,-25983,19965,-25969,19982,-25955,20000,-25942,20018,-25928,20035,-25914,20053,-25901,20071,-25887,20088,-25873,20106,-25860,20124,-25846,20141,-25832,20159,-25818,20176,-25805,20194,-25791,20212,-25777,20229,-25763,20247,-25750,20264,-25736,20282,-25722,20299,-25708,20317,-25694,20334,-25680,20352,-25666,20369,-25653,20387,-25639,20404,-25625,20422,-25611,20439,-25597,20457,-25583,20474,-25569,20492,-25555,20509,-25541,20527,-25527,20544,-25513,20561,-25499,20579,-25485,20596,-25471,20613,-25457,20631,-25443,20648,-25429,20666,-25415,20683,-25400,20700,-25386,20718,-25372,20735,-25358,20752,-25344,20769,-25330,20787,-25316,20804,-25301,20821,-25287,20838,-25273,20856,-25259,20873,-25244,20890,-25230,20907,-25216,20925,-25202,20942,-25187,20959,-25173,20976,-25159,20993,-25145,21010,-25130,21027,-25116,21045,-25101,21062,-25087,21079,-25073,21096,-25058,21113,-25044,21130,-25030,21147,-25015,21164,-25001,21181,-24986,21198,-24972,21215,-24957,21232,-24943,21249,-24928,21266,-24914,21283,-24899,21300,-24885,21317,-24870,21334,-24856,21351,-24841,21368,-24827,21385,-24812,21402,-24797,21419,-24783,21436,-24768,21453,-24754,21470,-24739,21486,-24724,21503,-24710,21520,-24695,21537,-24680,21554,-24665,21571,-24651,21587,-24636,21604,-24621,21621,-24607,21638,-24592,21655,-24577,21671,-24562,21688,-24547,21705,-24533,21722,-24518,21738,-24503,21755,-24488,21772,-24473,21788,-24458,21805,-24444,21822,-24429,21838,-24414,21855,-24399,21872,-24384,21888,-24369,21905,-24354,21922,-24339,21938,-24324,21955,-24309,21971,-24294,21988,-24279,22004,-24264,22021,-24249,22038,-24234,22054,-24219,22071,-24204,22087,-24189,22104,-24174,22120,-24159,22137,-24144,22153,-24129,22169,-24114,22186,-24098,22202,-24083,22219,-24068,22235,-24053,22252,-24038,22268,-24023,22284,-24007,22301,-23992,22317,-23977,22333,-23962,22350,-23946,22366,-23931,22382,-23916,22399,-23901,22415,-23885,22431,-23870,22448,-23855,22464,-23839,22480,-23824,22496,-23809,22513,-23793,22529,-23778,22545,-23763,22561,-23747,22577,-23732,22594,-23716,22610,-23701,22626,-23686,22642,-23670,22658,-23655,22674,-23639,22691,-23624,22707,-23608,22723,-23593,22739,-23577,22755,-23562,22771,-23546,22787,-23531,22803,-23515,22819,-23500,22835,-23484,22851,-23468,22867,-23453,22883,-23437,22899,-23422,22915,-23406,22931,-23390,22947,-23375,22963,-23359,22979,-23343,22995,-23328,23011,-23312,23027,-23296,23043,-23281,23058,-23265,23074,-23249,23090,-23233,23106,-23218,23122,-23202,23138,-23186,23153,-23170,23169,-23154,23185,-23139,23201,-23123,23217,-23107,23232,-23091,23248,-23075,23264,-23059,23280,-23044,23295,-23028,23311,-23012,23327,-22996,23342,-22980,23358,-22964,23374,-22948,23389,-22932,23405,-22916,23421,-22900,23436,-22884,23452,-22868,23467,-22852,23483,-22836,23499,-22820,23514,-22804,23530,-22788,23545,-22772,23561,-22756,23576,-22740,23592,-22724,23607,-22708,23623,-22692,23638,-22675,23654,-22659,23669,-22643,23685,-22627,23700,-22611,23715,-22595,23731,-22578,23746,-22562,23762,-22546,23777,-22530,23792,-22514,23808,-22497,23823,-22481,23838,-22465,23854,-22449,23869,-22432,23884,-22416,23900,-22400,23915,-22383,23930,-22367,23945,-22351,23961,-22334,23976,-22318,23991,-22302,24006,-22285,24022,-22269,24037,-22253,24052,-22236,24067,-22220,24082,-22203,24097,-22187,24113,-22170,24128,-22154,24143,-22138,24158,-22121,24173,-22105,24188,-22088,24203,-22072,24218,-22055,24233,-22039,24248,-22022,24263,-22005,24278,-21989,24293,-21972,24308,-21956,24323,-21939,24338,-21923,24353,-21906,24368,-21889,24383,-21873,24398,-21856,24413,-21839,24428,-21823,24443,-21806,24457,-21789,24472,-21773,24487,-21756,24502,-21739,24517,-21723,24532,-21706,24546,-21689,24561,-21672,24576,-21656,24591,-21639,24606,-21622,24620,-21605,24635,-21588,24650,-21572,24664,-21555,24679,-21538,24694,-21521,24709,-21504,24723,-21487,24738,-21471,24753,-21454,24767,-21437,24782,-21420,24796,-21403,24811,-21386,24826,-21369,24840,-21352,24855,-21335,24869,-21318,24884,-21301,24898,-21284,24913,-21267,24927,-21250,24942,-21233,24956,-21216,24971,-21199,24985,-21182,25000,-21165,25014,-21148,25029,-21131,25043,-21114,25057,-21097,25072,-21080,25086,-21063,25100,-21046,25115,-21028,25129,-21011,25144,-20994,25158,-20977,25172,-20960,25186,-20943,25201,-20926,25215,-20908,25229,-20891,25243,-20874,25258,-20857,25272,-20839,25286,-20822,25300,-20805,25315,-20788,25329,-20770,25343,-20753,25357,-20736,25371,-20719,25385,-20701,25399,-20684,25414,-20667,25428,-20649,25442,-20632,25456,-20614,25470,-20597,25484,-20580,25498,-20562,25512,-20545,25526,-20528,25540,-20510,25554,-20493,25568,-20475,25582,-20458,25596,-20440,25610,-20423,25624,-20405,25638,-20388,25652,-20370,25665,-20353,25679,-20335,25693,-20318,25707,-20300,25721,-20283,25735,-20265,25749,-20248,25762,-20230,25776,-20213,25790,-20195,25804,-20177,25817,-20160,25831,-20142,25845,-20125,25859,-20107,25872,-20089,25886,-20072,25900,-20054,25913,-20036,25927,-20019,25941,-20001,25954,-19983,25968,-19966,25982,-19948,25995,-19930,26009,-19912,26022,-19895,26036,-19877,26050,-19859,26063,-19841,26077,-19823,26090,-19806,26104,-19788,26117,-19770,26131,-19752,26144,-19734,26158,-19717,26171,-19699,26185,-19681,26198,-19663,26211,-19645,26225,-19627,26238,-19609,26252,-19591,26265,-19574,26278,-19556,26292,-19538,26305,-19520,26318,-19502,26332,-19484,26345,-19466,26358,-19448,26371,-19430,26385,-19412,26398,-19394,26411,-19376,26424,-19358,26437,-19340,26451,-19322,26464,-19304,26477,-19286,26490,-19268,26503,-19250,26516,-19232,26530,-19213,26543,-19195,26556,-19177,26569,-19159,26582,-19141,26595,-19123,26608,-19105,26621,-19087,26634,-19068,26647,-19050,26660,-19032,26673,-19014,26686,-18996,26699,-18977,26712,-18959,26725,-18941,26738,-18923,26751,-18905,26764,-18886,26776,-18868,26789,-18850,26802,-18831,26815,-18813,26828,-18795,26841,-18777,26853,-18758,26866,-18740,26879,-18722,26892,-18703,26905,-18685,26917,-18667,26930,-18648,26943,-18630,26955,-18611,26968,-18593,26981,-18575,26994,-18556,27006,-18538,27019,-18519,27031,-18501,27044,-18483,27057,-18464,27069,-18446,27082,-18427,27094,-18409,27107,-18390,27120,-18372,27132,-18353,27145,-18335,27157,-18316,27170,-18298,27182,-18279,27195,-18261,27207,-18242,27219,-18223,27232,-18205,27244,-18186,27257,-18168,27269,-18149,27281,-18131,27294,-18112,27306,-18093,27319,-18075,27331,-18056,27343,-18037,27355,-18019,27368,-18000,27380,-17981,27392,-17963,27405,-17944,27417,-17925,27429,-17907,27441,-17888,27453,-17869,27466,-17850,27478,-17832,27490,-17813,27502,-17794,27514,-17775,27526,-17757,27538,-17738,27551,-17719,27563,-17700,27575,-17681,27587,-17663,27599,-17644,27611,-17625,27623,-17606,27635,-17587,27647,-17568,27659,-17550,27671,-17531,27683,-17512,27695,-17493,27707,-17474,27719,-17455,27731,-17436,27742,-17417,27754,-17398,27766,-17380,27778,-17361,27790,-17342,27802,-17323,27814,-17304,27825,-17285,27837,-17266,27849,-17247,27861,-17228,27872,-17209,27884,-17190,27896,-17171,27908,-17152,27919,-17133,27931,-17114,27943,-17095,27954,-17075,27966,-17056,27978,-17037,27989,-17018,28001,-16999,28012,-16980,28024,-16961,28036,-16942,28047,-16923,28059,-16904,28070,-16884,28082,-16865,28093,-16846,28105,-16827,28116,-16808,28128,-16789,28139,-16769,28151,-16750,28162,-16731,28173,-16712,28185,-16693,28196,-16673,28208,-16654,28219,-16635,28230,-16616,28242,-16596,28253,-16577,28264,-16558,28275,-16539,28287,-16519,28298,-16500,28309,-16481,28321,-16461,28332,-16442,28343,-16423,28354,-16403,28365}; diff --git a/openair1/PHY/TOOLS/twiddle24576.h b/openair1/PHY/TOOLS/twiddle24576.h index 46cdb97a5b..34fc59d779 100644 --- a/openair1/PHY/TOOLS/twiddle24576.h +++ b/openair1/PHY/TOOLS/twiddle24576.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:8191)/24576)); twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:16382)/24576)); @@ -37,8 +30,8 @@ twb2(1:2:end) = real(twb); twb2(2:2:end) = imag(twb); - */ +*/ -int16_t twa24576[16384] __attribute__((aligned(16))) = {32767,0,32766,-9,32766,-17,32766,-26,32766,-34,32766,-42,32766,-51,32766,-59,32766,-68,32766,-76,32766,-84,32766,-93,32766,-101,32766,-109,32766,-118,32766,-126,32766,-135,32766,-143,32766,-151,32766,-160,32766,-168,32766,-176,32766,-185,32766,-193,32766,-202,32766,-210,32766,-218,32766,-227,32766,-235,32766,-243,32766,-252,32765,-260,32765,-269,32765,-277,32765,-285,32765,-294,32765,-302,32765,-310,32765,-319,32765,-327,32765,-336,32765,-344,32765,-352,32765,-361,32764,-369,32764,-377,32764,-386,32764,-394,32764,-403,32764,-411,32764,-419,32764,-428,32764,-436,32763,-444,32763,-453,32763,-461,32763,-470,32763,-478,32763,-486,32763,-495,32763,-503,32763,-511,32762,-520,32762,-528,32762,-537,32762,-545,32762,-553,32762,-562,32762,-570,32761,-579,32761,-587,32761,-595,32761,-604,32761,-612,32761,-620,32760,-629,32760,-637,32760,-646,32760,-654,32760,-662,32760,-671,32759,-679,32759,-687,32759,-696,32759,-704,32759,-713,32759,-721,32758,-729,32758,-738,32758,-746,32758,-754,32758,-763,32757,-771,32757,-780,32757,-788,32757,-796,32757,-805,32756,-813,32756,-821,32756,-830,32756,-838,32756,-847,32755,-855,32755,-863,32755,-872,32755,-880,32754,-888,32754,-897,32754,-905,32754,-914,32754,-922,32753,-930,32753,-939,32753,-947,32753,-955,32752,-964,32752,-972,32752,-981,32752,-989,32751,-997,32751,-1006,32751,-1014,32751,-1022,32750,-1031,32750,-1039,32750,-1047,32750,-1056,32749,-1064,32749,-1073,32749,-1081,32748,-1089,32748,-1098,32748,-1106,32748,-1114,32747,-1123,32747,-1131,32747,-1140,32746,-1148,32746,-1156,32746,-1165,32746,-1173,32745,-1181,32745,-1190,32745,-1198,32744,-1207,32744,-1215,32744,-1223,32743,-1232,32743,-1240,32743,-1248,32742,-1257,32742,-1265,32742,-1274,32741,-1282,32741,-1290,32741,-1299,32740,-1307,32740,-1315,32740,-1324,32739,-1332,32739,-1340,32739,-1349,32738,-1357,32738,-1366,32738,-1374,32737,-1382,32737,-1391,32737,-1399,32736,-1407,32736,-1416,32736,-1424,32735,-1433,32735,-1441,32734,-1449,32734,-1458,32734,-1466,32733,-1474,32733,-1483,32733,-1491,32732,-1500,32732,-1508,32731,-1516,32731,-1525,32731,-1533,32730,-1541,32730,-1550,32729,-1558,32729,-1566,32729,-1575,32728,-1583,32728,-1592,32727,-1600,32727,-1608,32727,-1617,32726,-1625,32726,-1633,32725,-1642,32725,-1650,32725,-1659,32724,-1667,32724,-1675,32723,-1684,32723,-1692,32722,-1700,32722,-1709,32722,-1717,32721,-1725,32721,-1734,32720,-1742,32720,-1751,32719,-1759,32719,-1767,32718,-1776,32718,-1784,32717,-1792,32717,-1801,32717,-1809,32716,-1817,32716,-1826,32715,-1834,32715,-1843,32714,-1851,32714,-1859,32713,-1868,32713,-1876,32712,-1884,32712,-1893,32711,-1901,32711,-1909,32710,-1918,32710,-1926,32709,-1935,32709,-1943,32708,-1951,32708,-1960,32707,-1968,32707,-1976,32706,-1985,32706,-1993,32705,-2001,32705,-2010,32704,-2018,32704,-2027,32703,-2035,32703,-2043,32702,-2052,32702,-2060,32701,-2068,32701,-2077,32700,-2085,32700,-2093,32699,-2102,32699,-2110,32698,-2118,32697,-2127,32697,-2135,32696,-2144,32696,-2152,32695,-2160,32695,-2169,32694,-2177,32694,-2185,32693,-2194,32692,-2202,32692,-2210,32691,-2219,32691,-2227,32690,-2236,32690,-2244,32689,-2252,32688,-2261,32688,-2269,32687,-2277,32687,-2286,32686,-2294,32686,-2302,32685,-2311,32684,-2319,32684,-2327,32683,-2336,32683,-2344,32682,-2353,32681,-2361,32681,-2369,32680,-2378,32680,-2386,32679,-2394,32678,-2403,32678,-2411,32677,-2419,32676,-2428,32676,-2436,32675,-2444,32675,-2453,32674,-2461,32673,-2469,32673,-2478,32672,-2486,32671,-2495,32671,-2503,32670,-2511,32670,-2520,32669,-2528,32668,-2536,32668,-2545,32667,-2553,32666,-2561,32666,-2570,32665,-2578,32664,-2586,32664,-2595,32663,-2603,32662,-2611,32662,-2620,32661,-2628,32660,-2637,32660,-2645,32659,-2653,32658,-2662,32658,-2670,32657,-2678,32656,-2687,32656,-2695,32655,-2703,32654,-2712,32653,-2720,32653,-2728,32652,-2737,32651,-2745,32651,-2753,32650,-2762,32649,-2770,32649,-2778,32648,-2787,32647,-2795,32646,-2803,32646,-2812,32645,-2820,32644,-2829,32644,-2837,32643,-2845,32642,-2854,32641,-2862,32641,-2870,32640,-2879,32639,-2887,32638,-2895,32638,-2904,32637,-2912,32636,-2920,32635,-2929,32635,-2937,32634,-2945,32633,-2954,32632,-2962,32632,-2970,32631,-2979,32630,-2987,32629,-2995,32629,-3004,32628,-3012,32627,-3020,32626,-3029,32625,-3037,32625,-3045,32624,-3054,32623,-3062,32622,-3070,32622,-3079,32621,-3087,32620,-3095,32619,-3104,32618,-3112,32618,-3121,32617,-3129,32616,-3137,32615,-3146,32614,-3154,32614,-3162,32613,-3171,32612,-3179,32611,-3187,32610,-3196,32610,-3204,32609,-3212,32608,-3221,32607,-3229,32606,-3237,32605,-3246,32605,-3254,32604,-3262,32603,-3271,32602,-3279,32601,-3287,32600,-3296,32600,-3304,32599,-3312,32598,-3321,32597,-3329,32596,-3337,32595,-3346,32594,-3354,32594,-3362,32593,-3371,32592,-3379,32591,-3387,32590,-3396,32589,-3404,32588,-3412,32588,-3421,32587,-3429,32586,-3437,32585,-3446,32584,-3454,32583,-3462,32582,-3471,32581,-3479,32580,-3487,32580,-3496,32579,-3504,32578,-3512,32577,-3521,32576,-3529,32575,-3537,32574,-3546,32573,-3554,32572,-3562,32571,-3571,32571,-3579,32570,-3587,32569,-3595,32568,-3604,32567,-3612,32566,-3620,32565,-3629,32564,-3637,32563,-3645,32562,-3654,32561,-3662,32560,-3670,32559,-3679,32558,-3687,32558,-3695,32557,-3704,32556,-3712,32555,-3720,32554,-3729,32553,-3737,32552,-3745,32551,-3754,32550,-3762,32549,-3770,32548,-3779,32547,-3787,32546,-3795,32545,-3804,32544,-3812,32543,-3820,32542,-3829,32541,-3837,32540,-3845,32539,-3854,32538,-3862,32537,-3870,32536,-3878,32535,-3887,32534,-3895,32533,-3903,32532,-3912,32531,-3920,32530,-3928,32529,-3937,32528,-3945,32527,-3953,32526,-3962,32525,-3970,32524,-3978,32523,-3987,32522,-3995,32521,-4003,32520,-4012,32519,-4020,32518,-4028,32517,-4036,32516,-4045,32515,-4053,32514,-4061,32513,-4070,32512,-4078,32511,-4086,32510,-4095,32509,-4103,32508,-4111,32507,-4120,32506,-4128,32504,-4136,32503,-4145,32502,-4153,32501,-4161,32500,-4169,32499,-4178,32498,-4186,32497,-4194,32496,-4203,32495,-4211,32494,-4219,32493,-4228,32492,-4236,32491,-4244,32489,-4253,32488,-4261,32487,-4269,32486,-4277,32485,-4286,32484,-4294,32483,-4302,32482,-4311,32481,-4319,32480,-4327,32478,-4336,32477,-4344,32476,-4352,32475,-4360,32474,-4369,32473,-4377,32472,-4385,32471,-4394,32470,-4402,32468,-4410,32467,-4419,32466,-4427,32465,-4435,32464,-4444,32463,-4452,32462,-4460,32460,-4468,32459,-4477,32458,-4485,32457,-4493,32456,-4502,32455,-4510,32454,-4518,32452,-4526,32451,-4535,32450,-4543,32449,-4551,32448,-4560,32447,-4568,32445,-4576,32444,-4585,32443,-4593,32442,-4601,32441,-4609,32440,-4618,32438,-4626,32437,-4634,32436,-4643,32435,-4651,32434,-4659,32432,-4667,32431,-4676,32430,-4684,32429,-4692,32428,-4701,32426,-4709,32425,-4717,32424,-4726,32423,-4734,32422,-4742,32420,-4750,32419,-4759,32418,-4767,32417,-4775,32416,-4784,32414,-4792,32413,-4800,32412,-4808,32411,-4817,32409,-4825,32408,-4833,32407,-4842,32406,-4850,32404,-4858,32403,-4866,32402,-4875,32401,-4883,32399,-4891,32398,-4900,32397,-4908,32396,-4916,32394,-4924,32393,-4933,32392,-4941,32391,-4949,32389,-4958,32388,-4966,32387,-4974,32386,-4982,32384,-4991,32383,-4999,32382,-5007,32380,-5015,32379,-5024,32378,-5032,32377,-5040,32375,-5049,32374,-5057,32373,-5065,32371,-5073,32370,-5082,32369,-5090,32368,-5098,32366,-5107,32365,-5115,32364,-5123,32362,-5131,32361,-5140,32360,-5148,32358,-5156,32357,-5164,32356,-5173,32354,-5181,32353,-5189,32352,-5198,32350,-5206,32349,-5214,32348,-5222,32346,-5231,32345,-5239,32344,-5247,32342,-5255,32341,-5264,32340,-5272,32338,-5280,32337,-5288,32336,-5297,32334,-5305,32333,-5313,32332,-5322,32330,-5330,32329,-5338,32327,-5346,32326,-5355,32325,-5363,32323,-5371,32322,-5379,32321,-5388,32319,-5396,32318,-5404,32316,-5412,32315,-5421,32314,-5429,32312,-5437,32311,-5446,32310,-5454,32308,-5462,32307,-5470,32305,-5479,32304,-5487,32303,-5495,32301,-5503,32300,-5512,32298,-5520,32297,-5528,32295,-5536,32294,-5545,32293,-5553,32291,-5561,32290,-5569,32288,-5578,32287,-5586,32286,-5594,32284,-5602,32283,-5611,32281,-5619,32280,-5627,32278,-5635,32277,-5644,32275,-5652,32274,-5660,32273,-5668,32271,-5677,32270,-5685,32268,-5693,32267,-5701,32265,-5710,32264,-5718,32262,-5726,32261,-5734,32259,-5743,32258,-5751,32256,-5759,32255,-5767,32254,-5776,32252,-5784,32251,-5792,32249,-5800,32248,-5809,32246,-5817,32245,-5825,32243,-5833,32242,-5842,32240,-5850,32239,-5858,32237,-5866,32236,-5875,32234,-5883,32233,-5891,32231,-5899,32230,-5908,32228,-5916,32227,-5924,32225,-5932,32224,-5941,32222,-5949,32221,-5957,32219,-5965,32218,-5973,32216,-5982,32214,-5990,32213,-5998,32211,-6006,32210,-6015,32208,-6023,32207,-6031,32205,-6039,32204,-6048,32202,-6056,32201,-6064,32199,-6072,32197,-6081,32196,-6089,32194,-6097,32193,-6105,32191,-6113,32190,-6122,32188,-6130,32187,-6138,32185,-6146,32183,-6155,32182,-6163,32180,-6171,32179,-6179,32177,-6187,32176,-6196,32174,-6204,32172,-6212,32171,-6220,32169,-6229,32168,-6237,32166,-6245,32164,-6253,32163,-6262,32161,-6270,32160,-6278,32158,-6286,32156,-6294,32155,-6303,32153,-6311,32152,-6319,32150,-6327,32148,-6335,32147,-6344,32145,-6352,32143,-6360,32142,-6368,32140,-6377,32139,-6385,32137,-6393,32135,-6401,32134,-6409,32132,-6418,32130,-6426,32129,-6434,32127,-6442,32125,-6451,32124,-6459,32122,-6467,32120,-6475,32119,-6483,32117,-6492,32115,-6500,32114,-6508,32112,-6516,32110,-6524,32109,-6533,32107,-6541,32105,-6549,32104,-6557,32102,-6565,32100,-6574,32099,-6582,32097,-6590,32095,-6598,32094,-6607,32092,-6615,32090,-6623,32089,-6631,32087,-6639,32085,-6648,32084,-6656,32082,-6664,32080,-6672,32078,-6680,32077,-6689,32075,-6697,32073,-6705,32072,-6713,32070,-6721,32068,-6730,32066,-6738,32065,-6746,32063,-6754,32061,-6762,32059,-6771,32058,-6779,32056,-6787,32054,-6795,32053,-6803,32051,-6812,32049,-6820,32047,-6828,32046,-6836,32044,-6844,32042,-6852,32040,-6861,32039,-6869,32037,-6877,32035,-6885,32033,-6893,32032,-6902,32030,-6910,32028,-6918,32026,-6926,32024,-6934,32023,-6943,32021,-6951,32019,-6959,32017,-6967,32016,-6975,32014,-6983,32012,-6992,32010,-7000,32008,-7008,32007,-7016,32005,-7024,32003,-7033,32001,-7041,31999,-7049,31998,-7057,31996,-7065,31994,-7073,31992,-7082,31990,-7090,31989,-7098,31987,-7106,31985,-7114,31983,-7123,31981,-7131,31979,-7139,31978,-7147,31976,-7155,31974,-7163,31972,-7172,31970,-7180,31968,-7188,31967,-7196,31965,-7204,31963,-7212,31961,-7221,31959,-7229,31957,-7237,31956,-7245,31954,-7253,31952,-7262,31950,-7270,31948,-7278,31946,-7286,31944,-7294,31943,-7302,31941,-7311,31939,-7319,31937,-7327,31935,-7335,31933,-7343,31931,-7351,31929,-7359,31928,-7368,31926,-7376,31924,-7384,31922,-7392,31920,-7400,31918,-7408,31916,-7417,31914,-7425,31912,-7433,31911,-7441,31909,-7449,31907,-7457,31905,-7466,31903,-7474,31901,-7482,31899,-7490,31897,-7498,31895,-7506,31893,-7515,31891,-7523,31889,-7531,31888,-7539,31886,-7547,31884,-7555,31882,-7563,31880,-7572,31878,-7580,31876,-7588,31874,-7596,31872,-7604,31870,-7612,31868,-7620,31866,-7629,31864,-7637,31862,-7645,31860,-7653,31858,-7661,31856,-7669,31854,-7677,31853,-7686,31851,-7694,31849,-7702,31847,-7710,31845,-7718,31843,-7726,31841,-7734,31839,-7743,31837,-7751,31835,-7759,31833,-7767,31831,-7775,31829,-7783,31827,-7791,31825,-7800,31823,-7808,31821,-7816,31819,-7824,31817,-7832,31815,-7840,31813,-7848,31811,-7857,31809,-7865,31807,-7873,31805,-7881,31803,-7889,31801,-7897,31799,-7905,31797,-7913,31795,-7922,31793,-7930,31791,-7938,31789,-7946,31787,-7954,31785,-7962,31782,-7970,31780,-7978,31778,-7987,31776,-7995,31774,-8003,31772,-8011,31770,-8019,31768,-8027,31766,-8035,31764,-8043,31762,-8052,31760,-8060,31758,-8068,31756,-8076,31754,-8084,31752,-8092,31750,-8100,31748,-8108,31745,-8117,31743,-8125,31741,-8133,31739,-8141,31737,-8149,31735,-8157,31733,-8165,31731,-8173,31729,-8181,31727,-8190,31725,-8198,31723,-8206,31720,-8214,31718,-8222,31716,-8230,31714,-8238,31712,-8246,31710,-8254,31708,-8263,31706,-8271,31704,-8279,31701,-8287,31699,-8295,31697,-8303,31695,-8311,31693,-8319,31691,-8327,31689,-8335,31687,-8344,31684,-8352,31682,-8360,31680,-8368,31678,-8376,31676,-8384,31674,-8392,31672,-8400,31669,-8408,31667,-8416,31665,-8425,31663,-8433,31661,-8441,31659,-8449,31656,-8457,31654,-8465,31652,-8473,31650,-8481,31648,-8489,31646,-8497,31643,-8505,31641,-8514,31639,-8522,31637,-8530,31635,-8538,31633,-8546,31630,-8554,31628,-8562,31626,-8570,31624,-8578,31622,-8586,31619,-8594,31617,-8603,31615,-8611,31613,-8619,31611,-8627,31608,-8635,31606,-8643,31604,-8651,31602,-8659,31600,-8667,31597,-8675,31595,-8683,31593,-8691,31591,-8700,31588,-8708,31586,-8716,31584,-8724,31582,-8732,31580,-8740,31577,-8748,31575,-8756,31573,-8764,31571,-8772,31568,-8780,31566,-8788,31564,-8796,31562,-8804,31559,-8813,31557,-8821,31555,-8829,31553,-8837,31550,-8845,31548,-8853,31546,-8861,31544,-8869,31541,-8877,31539,-8885,31537,-8893,31534,-8901,31532,-8909,31530,-8917,31528,-8925,31525,-8933,31523,-8942,31521,-8950,31518,-8958,31516,-8966,31514,-8974,31512,-8982,31509,-8990,31507,-8998,31505,-9006,31502,-9014,31500,-9022,31498,-9030,31495,-9038,31493,-9046,31491,-9054,31489,-9062,31486,-9070,31484,-9078,31482,-9087,31479,-9095,31477,-9103,31475,-9111,31472,-9119,31470,-9127,31468,-9135,31465,-9143,31463,-9151,31461,-9159,31458,-9167,31456,-9175,31454,-9183,31451,-9191,31449,-9199,31446,-9207,31444,-9215,31442,-9223,31439,-9231,31437,-9239,31435,-9247,31432,-9255,31430,-9263,31428,-9271,31425,-9280,31423,-9288,31420,-9296,31418,-9304,31416,-9312,31413,-9320,31411,-9328,31409,-9336,31406,-9344,31404,-9352,31401,-9360,31399,-9368,31397,-9376,31394,-9384,31392,-9392,31389,-9400,31387,-9408,31385,-9416,31382,-9424,31380,-9432,31377,-9440,31375,-9448,31373,-9456,31370,-9464,31368,-9472,31365,-9480,31363,-9488,31360,-9496,31358,-9504,31356,-9512,31353,-9520,31351,-9528,31348,-9536,31346,-9544,31343,-9552,31341,-9560,31338,-9568,31336,-9576,31334,-9584,31331,-9592,31329,-9600,31326,-9608,31324,-9616,31321,-9624,31319,-9632,31316,-9640,31314,-9648,31311,-9656,31309,-9664,31307,-9672,31304,-9680,31302,-9688,31299,-9696,31297,-9704,31294,-9712,31292,-9720,31289,-9728,31287,-9736,31284,-9744,31282,-9752,31279,-9760,31277,-9768,31274,-9776,31272,-9784,31269,-9792,31267,-9800,31264,-9808,31262,-9816,31259,-9824,31257,-9832,31254,-9840,31252,-9848,31249,-9856,31247,-9864,31244,-9872,31242,-9880,31239,-9888,31236,-9896,31234,-9904,31231,-9912,31229,-9920,31226,-9928,31224,-9936,31221,-9944,31219,-9952,31216,-9960,31214,-9968,31211,-9976,31209,-9984,31206,-9992,31203,-10000,31201,-10008,31198,-10016,31196,-10024,31193,-10032,31191,-10040,31188,-10048,31185,-10056,31183,-10064,31180,-10072,31178,-10080,31175,-10088,31173,-10096,31170,-10104,31167,-10112,31165,-10120,31162,-10128,31160,-10136,31157,-10144,31154,-10152,31152,-10160,31149,-10167,31147,-10175,31144,-10183,31141,-10191,31139,-10199,31136,-10207,31134,-10215,31131,-10223,31128,-10231,31126,-10239,31123,-10247,31121,-10255,31118,-10263,31115,-10271,31113,-10279,31110,-10287,31107,-10295,31105,-10303,31102,-10311,31100,-10319,31097,-10327,31094,-10335,31092,-10343,31089,-10350,31086,-10358,31084,-10366,31081,-10374,31078,-10382,31076,-10390,31073,-10398,31070,-10406,31068,-10414,31065,-10422,31062,-10430,31060,-10438,31057,-10446,31054,-10454,31052,-10462,31049,-10470,31046,-10478,31044,-10485,31041,-10493,31038,-10501,31036,-10509,31033,-10517,31030,-10525,31028,-10533,31025,-10541,31022,-10549,31019,-10557,31017,-10565,31014,-10573,31011,-10581,31009,-10589,31006,-10597,31003,-10604,31001,-10612,30998,-10620,30995,-10628,30992,-10636,30990,-10644,30987,-10652,30984,-10660,30981,-10668,30979,-10676,30976,-10684,30973,-10692,30971,-10700,30968,-10707,30965,-10715,30962,-10723,30960,-10731,30957,-10739,30954,-10747,30951,-10755,30949,-10763,30946,-10771,30943,-10779,30940,-10787,30938,-10795,30935,-10802,30932,-10810,30929,-10818,30927,-10826,30924,-10834,30921,-10842,30918,-10850,30915,-10858,30913,-10866,30910,-10874,30907,-10881,30904,-10889,30902,-10897,30899,-10905,30896,-10913,30893,-10921,30890,-10929,30888,-10937,30885,-10945,30882,-10953,30879,-10960,30876,-10968,30874,-10976,30871,-10984,30868,-10992,30865,-11000,30862,-11008,30860,-11016,30857,-11024,30854,-11031,30851,-11039,30848,-11047,30845,-11055,30843,-11063,30840,-11071,30837,-11079,30834,-11087,30831,-11095,30828,-11102,30826,-11110,30823,-11118,30820,-11126,30817,-11134,30814,-11142,30811,-11150,30809,-11158,30806,-11165,30803,-11173,30800,-11181,30797,-11189,30794,-11197,30791,-11205,30788,-11213,30786,-11221,30783,-11228,30780,-11236,30777,-11244,30774,-11252,30771,-11260,30768,-11268,30766,-11276,30763,-11284,30760,-11291,30757,-11299,30754,-11307,30751,-11315,30748,-11323,30745,-11331,30742,-11339,30739,-11346,30737,-11354,30734,-11362,30731,-11370,30728,-11378,30725,-11386,30722,-11394,30719,-11401,30716,-11409,30713,-11417,30710,-11425,30707,-11433,30705,-11441,30702,-11449,30699,-11456,30696,-11464,30693,-11472,30690,-11480,30687,-11488,30684,-11496,30681,-11503,30678,-11511,30675,-11519,30672,-11527,30669,-11535,30666,-11543,30663,-11551,30660,-11558,30657,-11566,30655,-11574,30652,-11582,30649,-11590,30646,-11598,30643,-11605,30640,-11613,30637,-11621,30634,-11629,30631,-11637,30628,-11645,30625,-11652,30622,-11660,30619,-11668,30616,-11676,30613,-11684,30610,-11692,30607,-11699,30604,-11707,30601,-11715,30598,-11723,30595,-11731,30592,-11738,30589,-11746,30586,-11754,30583,-11762,30580,-11770,30577,-11778,30574,-11785,30571,-11793,30568,-11801,30565,-11809,30562,-11817,30559,-11824,30556,-11832,30553,-11840,30550,-11848,30547,-11856,30544,-11863,30541,-11871,30538,-11879,30535,-11887,30532,-11895,30528,-11903,30525,-11910,30522,-11918,30519,-11926,30516,-11934,30513,-11942,30510,-11949,30507,-11957,30504,-11965,30501,-11973,30498,-11981,30495,-11988,30492,-11996,30489,-12004,30486,-12012,30483,-12020,30480,-12027,30476,-12035,30473,-12043,30470,-12051,30467,-12058,30464,-12066,30461,-12074,30458,-12082,30455,-12090,30452,-12097,30449,-12105,30446,-12113,30442,-12121,30439,-12129,30436,-12136,30433,-12144,30430,-12152,30427,-12160,30424,-12167,30421,-12175,30418,-12183,30415,-12191,30411,-12199,30408,-12206,30405,-12214,30402,-12222,30399,-12230,30396,-12237,30393,-12245,30390,-12253,30386,-12261,30383,-12269,30380,-12276,30377,-12284,30374,-12292,30371,-12300,30368,-12307,30364,-12315,30361,-12323,30358,-12331,30355,-12338,30352,-12346,30349,-12354,30345,-12362,30342,-12369,30339,-12377,30336,-12385,30333,-12393,30330,-12400,30326,-12408,30323,-12416,30320,-12424,30317,-12431,30314,-12439,30311,-12447,30307,-12455,30304,-12462,30301,-12470,30298,-12478,30295,-12486,30291,-12493,30288,-12501,30285,-12509,30282,-12517,30279,-12524,30275,-12532,30272,-12540,30269,-12548,30266,-12555,30263,-12563,30259,-12571,30256,-12579,30253,-12586,30250,-12594,30247,-12602,30243,-12610,30240,-12617,30237,-12625,30234,-12633,30230,-12640,30227,-12648,30224,-12656,30221,-12664,30217,-12671,30214,-12679,30211,-12687,30208,-12695,30205,-12702,30201,-12710,30198,-12718,30195,-12725,30191,-12733,30188,-12741,30185,-12749,30182,-12756,30178,-12764,30175,-12772,30172,-12779,30169,-12787,30165,-12795,30162,-12803,30159,-12810,30156,-12818,30152,-12826,30149,-12833,30146,-12841,30142,-12849,30139,-12857,30136,-12864,30133,-12872,30129,-12880,30126,-12887,30123,-12895,30119,-12903,30116,-12910,30113,-12918,30109,-12926,30106,-12934,30103,-12941,30100,-12949,30096,-12957,30093,-12964,30090,-12972,30086,-12980,30083,-12987,30080,-12995,30076,-13003,30073,-13010,30070,-13018,30066,-13026,30063,-13034,30060,-13041,30056,-13049,30053,-13057,30050,-13064,30046,-13072,30043,-13080,30040,-13087,30036,-13095,30033,-13103,30030,-13110,30026,-13118,30023,-13126,30020,-13133,30016,-13141,30013,-13149,30009,-13156,30006,-13164,30003,-13172,29999,-13179,29996,-13187,29993,-13195,29989,-13202,29986,-13210,29983,-13218,29979,-13225,29976,-13233,29972,-13241,29969,-13248,29966,-13256,29962,-13264,29959,-13271,29955,-13279,29952,-13287,29949,-13294,29945,-13302,29942,-13310,29938,-13317,29935,-13325,29932,-13333,29928,-13340,29925,-13348,29921,-13356,29918,-13363,29915,-13371,29911,-13379,29908,-13386,29904,-13394,29901,-13401,29897,-13409,29894,-13417,29891,-13424,29887,-13432,29884,-13440,29880,-13447,29877,-13455,29873,-13463,29870,-13470,29866,-13478,29863,-13486,29860,-13493,29856,-13501,29853,-13508,29849,-13516,29846,-13524,29842,-13531,29839,-13539,29835,-13547,29832,-13554,29828,-13562,29825,-13569,29822,-13577,29818,-13585,29815,-13592,29811,-13600,29808,-13608,29804,-13615,29801,-13623,29797,-13630,29794,-13638,29790,-13646,29787,-13653,29783,-13661,29780,-13668,29776,-13676,29773,-13684,29769,-13691,29766,-13699,29762,-13707,29759,-13714,29755,-13722,29752,-13729,29748,-13737,29745,-13745,29741,-13752,29738,-13760,29734,-13767,29731,-13775,29727,-13783,29724,-13790,29720,-13798,29717,-13805,29713,-13813,29709,-13821,29706,-13828,29702,-13836,29699,-13843,29695,-13851,29692,-13859,29688,-13866,29685,-13874,29681,-13881,29678,-13889,29674,-13896,29670,-13904,29667,-13912,29663,-13919,29660,-13927,29656,-13934,29653,-13942,29649,-13950,29646,-13957,29642,-13965,29638,-13972,29635,-13980,29631,-13987,29628,-13995,29624,-14003,29621,-14010,29617,-14018,29613,-14025,29610,-14033,29606,-14040,29603,-14048,29599,-14056,29595,-14063,29592,-14071,29588,-14078,29585,-14086,29581,-14093,29577,-14101,29574,-14109,29570,-14116,29567,-14124,29563,-14131,29559,-14139,29556,-14146,29552,-14154,29548,-14161,29545,-14169,29541,-14177,29538,-14184,29534,-14192,29530,-14199,29527,-14207,29523,-14214,29519,-14222,29516,-14229,29512,-14237,29509,-14245,29505,-14252,29501,-14260,29498,-14267,29494,-14275,29490,-14282,29487,-14290,29483,-14297,29479,-14305,29476,-14312,29472,-14320,29468,-14327,29465,-14335,29461,-14343,29457,-14350,29454,-14358,29450,-14365,29446,-14373,29443,-14380,29439,-14388,29435,-14395,29432,-14403,29428,-14410,29424,-14418,29421,-14425,29417,-14433,29413,-14440,29410,-14448,29406,-14455,29402,-14463,29398,-14470,29395,-14478,29391,-14485,29387,-14493,29384,-14500,29380,-14508,29376,-14516,29372,-14523,29369,-14531,29365,-14538,29361,-14546,29358,-14553,29354,-14561,29350,-14568,29346,-14576,29343,-14583,29339,-14591,29335,-14598,29332,-14606,29328,-14613,29324,-14621,29320,-14628,29317,-14636,29313,-14643,29309,-14651,29305,-14658,29302,-14666,29298,-14673,29294,-14681,29290,-14688,29287,-14695,29283,-14703,29279,-14710,29275,-14718,29272,-14725,29268,-14733,29264,-14740,29260,-14748,29256,-14755,29253,-14763,29249,-14770,29245,-14778,29241,-14785,29238,-14793,29234,-14800,29230,-14808,29226,-14815,29222,-14823,29219,-14830,29215,-14838,29211,-14845,29207,-14853,29203,-14860,29200,-14867,29196,-14875,29192,-14882,29188,-14890,29184,-14897,29181,-14905,29177,-14912,29173,-14920,29169,-14927,29165,-14935,29162,-14942,29158,-14950,29154,-14957,29150,-14964,29146,-14972,29142,-14979,29139,-14987,29135,-14994,29131,-15002,29127,-15009,29123,-15017,29119,-15024,29116,-15031,29112,-15039,29108,-15046,29104,-15054,29100,-15061,29096,-15069,29092,-15076,29089,-15084,29085,-15091,29081,-15098,29077,-15106,29073,-15113,29069,-15121,29065,-15128,29062,-15136,29058,-15143,29054,-15150,29050,-15158,29046,-15165,29042,-15173,29038,-15180,29034,-15188,29031,-15195,29027,-15202,29023,-15210,29019,-15217,29015,-15225,29011,-15232,29007,-15239,29003,-15247,28999,-15254,28996,-15262,28992,-15269,28988,-15277,28984,-15284,28980,-15291,28976,-15299,28972,-15306,28968,-15314,28964,-15321,28960,-15328,28956,-15336,28953,-15343,28949,-15351,28945,-15358,28941,-15365,28937,-15373,28933,-15380,28929,-15388,28925,-15395,28921,-15402,28917,-15410,28913,-15417,28909,-15425,28905,-15432,28901,-15439,28897,-15447,28893,-15454,28890,-15462,28886,-15469,28882,-15476,28878,-15484,28874,-15491,28870,-15498,28866,-15506,28862,-15513,28858,-15521,28854,-15528,28850,-15535,28846,-15543,28842,-15550,28838,-15557,28834,-15565,28830,-15572,28826,-15580,28822,-15587,28818,-15594,28814,-15602,28810,-15609,28806,-15616,28802,-15624,28798,-15631,28794,-15639,28790,-15646,28786,-15653,28782,-15661,28778,-15668,28774,-15675,28770,-15683,28766,-15690,28762,-15697,28758,-15705,28754,-15712,28750,-15719,28746,-15727,28742,-15734,28738,-15741,28734,-15749,28730,-15756,28726,-15764,28722,-15771,28718,-15778,28714,-15786,28710,-15793,28706,-15800,28702,-15808,28698,-15815,28694,-15822,28690,-15830,28685,-15837,28681,-15844,28677,-15852,28673,-15859,28669,-15866,28665,-15874,28661,-15881,28657,-15888,28653,-15896,28649,-15903,28645,-15910,28641,-15918,28637,-15925,28633,-15932,28629,-15939,28625,-15947,28620,-15954,28616,-15961,28612,-15969,28608,-15976,28604,-15983,28600,-15991,28596,-15998,28592,-16005,28588,-16013,28584,-16020,28580,-16027,28575,-16035,28571,-16042,28567,-16049,28563,-16056,28559,-16064,28555,-16071,28551,-16078,28547,-16086,28543,-16093,28538,-16100,28534,-16108,28530,-16115,28526,-16122,28522,-16129,28518,-16137,28514,-16144,28510,-16151,28506,-16159,28501,-16166,28497,-16173,28493,-16180,28489,-16188,28485,-16195,28481,-16202,28477,-16210,28472,-16217,28468,-16224,28464,-16231,28460,-16239,28456,-16246,28452,-16253,28447,-16261,28443,-16268,28439,-16275,28435,-16282,28431,-16290,28427,-16297,28423,-16304,28418,-16311,28414,-16319,28410,-16326,28406,-16333,28402,-16340,28397,-16348,28393,-16355,28389,-16362,28385,-16369,28381,-16377,28377,-16384,28372,-16391,28368,-16399,28364,-16406,28360,-16413,28356,-16420,28351,-16428,28347,-16435,28343,-16442,28339,-16449,28335,-16456,28330,-16464,28326,-16471,28322,-16478,28318,-16485,28314,-16493,28309,-16500,28305,-16507,28301,-16514,28297,-16522,28292,-16529,28288,-16536,28284,-16543,28280,-16551,28275,-16558,28271,-16565,28267,-16572,28263,-16579,28259,-16587,28254,-16594,28250,-16601,28246,-16608,28242,-16616,28237,-16623,28233,-16630,28229,-16637,28225,-16644,28220,-16652,28216,-16659,28212,-16666,28208,-16673,28203,-16681,28199,-16688,28195,-16695,28190,-16702,28186,-16709,28182,-16717,28178,-16724,28173,-16731,28169,-16738,28165,-16745,28161,-16753,28156,-16760,28152,-16767,28148,-16774,28143,-16781,28139,-16789,28135,-16796,28131,-16803,28126,-16810,28122,-16817,28118,-16825,28113,-16832,28109,-16839,28105,-16846,28100,-16853,28096,-16860,28092,-16868,28087,-16875,28083,-16882,28079,-16889,28075,-16896,28070,-16904,28066,-16911,28062,-16918,28057,-16925,28053,-16932,28049,-16939,28044,-16947,28040,-16954,28036,-16961,28031,-16968,28027,-16975,28023,-16982,28018,-16990,28014,-16997,28009,-17004,28005,-17011,28001,-17018,27996,-17025,27992,-17033,27988,-17040,27983,-17047,27979,-17054,27975,-17061,27970,-17068,27966,-17075,27962,-17083,27957,-17090,27953,-17097,27948,-17104,27944,-17111,27940,-17118,27935,-17125,27931,-17133,27927,-17140,27922,-17147,27918,-17154,27913,-17161,27909,-17168,27905,-17175,27900,-17183,27896,-17190,27891,-17197,27887,-17204,27883,-17211,27878,-17218,27874,-17225,27869,-17233,27865,-17240,27861,-17247,27856,-17254,27852,-17261,27847,-17268,27843,-17275,27839,-17282,27834,-17289,27830,-17297,27825,-17304,27821,-17311,27816,-17318,27812,-17325,27808,-17332,27803,-17339,27799,-17346,27794,-17353,27790,-17361,27785,-17368,27781,-17375,27777,-17382,27772,-17389,27768,-17396,27763,-17403,27759,-17410,27754,-17417,27750,-17424,27745,-17432,27741,-17439,27736,-17446,27732,-17453,27728,-17460,27723,-17467,27719,-17474,27714,-17481,27710,-17488,27705,-17495,27701,-17502,27696,-17510,27692,-17517,27687,-17524,27683,-17531,27678,-17538,27674,-17545,27669,-17552,27665,-17559,27660,-17566,27656,-17573,27651,-17580,27647,-17587,27642,-17594,27638,-17601,27633,-17609,27629,-17616,27624,-17623,27620,-17630,27615,-17637,27611,-17644,27606,-17651,27602,-17658,27597,-17665,27593,-17672,27588,-17679,27584,-17686,27579,-17693,27575,-17700,27570,-17707,27566,-17714,27561,-17721,27557,-17728,27552,-17736,27548,-17743,27543,-17750,27538,-17757,27534,-17764,27529,-17771,27525,-17778,27520,-17785,27516,-17792,27511,-17799,27507,-17806,27502,-17813,27498,-17820,27493,-17827,27488,-17834,27484,-17841,27479,-17848,27475,-17855,27470,-17862,27466,-17869,27461,-17876,27456,-17883,27452,-17890,27447,-17897,27443,-17904,27438,-17911,27434,-17918,27429,-17925,27424,-17932,27420,-17939,27415,-17946,27411,-17953,27406,-17960,27401,-17967,27397,-17974,27392,-17981,27388,-17988,27383,-17995,27378,-18002,27374,-18009,27369,-18016,27365,-18023,27360,-18030,27355,-18037,27351,-18044,27346,-18051,27342,-18058,27337,-18065,27332,-18072,27328,-18079,27323,-18086,27319,-18093,27314,-18100,27309,-18107,27305,-18114,27300,-18121,27295,-18128,27291,-18135,27286,-18142,27281,-18149,27277,-18156,27272,-18163,27268,-18170,27263,-18177,27258,-18184,27254,-18191,27249,-18198,27244,-18205,27240,-18212,27235,-18219,27230,-18226,27226,-18233,27221,-18240,27216,-18247,27212,-18254,27207,-18261,27202,-18268,27198,-18274,27193,-18281,27188,-18288,27184,-18295,27179,-18302,27174,-18309,27170,-18316,27165,-18323,27160,-18330,27156,-18337,27151,-18344,27146,-18351,27141,-18358,27137,-18365,27132,-18372,27127,-18379,27123,-18386,27118,-18393,27113,-18399,27109,-18406,27104,-18413,27099,-18420,27094,-18427,27090,-18434,27085,-18441,27080,-18448,27076,-18455,27071,-18462,27066,-18469,27061,-18476,27057,-18483,27052,-18489,27047,-18496,27042,-18503,27038,-18510,27033,-18517,27028,-18524,27024,-18531,27019,-18538,27014,-18545,27009,-18552,27005,-18559,27000,-18565,26995,-18572,26990,-18579,26986,-18586,26981,-18593,26976,-18600,26971,-18607,26967,-18614,26962,-18621,26957,-18628,26952,-18634,26948,-18641,26943,-18648,26938,-18655,26933,-18662,26928,-18669,26924,-18676,26919,-18683,26914,-18690,26909,-18696,26905,-18703,26900,-18710,26895,-18717,26890,-18724,26885,-18731,26881,-18738,26876,-18745,26871,-18751,26866,-18758,26861,-18765,26857,-18772,26852,-18779,26847,-18786,26842,-18793,26837,-18799,26833,-18806,26828,-18813,26823,-18820,26818,-18827,26813,-18834,26809,-18841,26804,-18847,26799,-18854,26794,-18861,26789,-18868,26784,-18875,26780,-18882,26775,-18889,26770,-18895,26765,-18902,26760,-18909,26755,-18916,26751,-18923,26746,-18930,26741,-18936,26736,-18943,26731,-18950,26726,-18957,26722,-18964,26717,-18971,26712,-18977,26707,-18984,26702,-18991,26697,-18998,26692,-19005,26688,-19012,26683,-19018,26678,-19025,26673,-19032,26668,-19039,26663,-19046,26658,-19052,26654,-19059,26649,-19066,26644,-19073,26639,-19080,26634,-19087,26629,-19093,26624,-19100,26619,-19107,26615,-19114,26610,-19121,26605,-19127,26600,-19134,26595,-19141,26590,-19148,26585,-19155,26580,-19161,26575,-19168,26570,-19175,26566,-19182,26561,-19189,26556,-19195,26551,-19202,26546,-19209,26541,-19216,26536,-19222,26531,-19229,26526,-19236,26521,-19243,26516,-19250,26512,-19256,26507,-19263,26502,-19270,26497,-19277,26492,-19283,26487,-19290,26482,-19297,26477,-19304,26472,-19311,26467,-19317,26462,-19324,26457,-19331,26452,-19338,26447,-19344,26442,-19351,26437,-19358,26433,-19365,26428,-19371,26423,-19378,26418,-19385,26413,-19392,26408,-19398,26403,-19405,26398,-19412,26393,-19419,26388,-19425,26383,-19432,26378,-19439,26373,-19446,26368,-19452,26363,-19459,26358,-19466,26353,-19473,26348,-19479,26343,-19486,26338,-19493,26333,-19500,26328,-19506,26323,-19513,26318,-19520,26313,-19527,26308,-19533,26303,-19540,26298,-19547,26293,-19553,26288,-19560,26283,-19567,26278,-19574,26273,-19580,26268,-19587,26263,-19594,26258,-19600,26253,-19607,26248,-19614,26243,-19621,26238,-19627,26233,-19634,26228,-19641,26223,-19647,26218,-19654,26213,-19661,26208,-19668,26203,-19674,26198,-19681,26193,-19688,26188,-19694,26183,-19701,26178,-19708,26173,-19714,26168,-19721,26163,-19728,26158,-19734,26153,-19741,26148,-19748,26142,-19755,26137,-19761,26132,-19768,26127,-19775,26122,-19781,26117,-19788,26112,-19795,26107,-19801,26102,-19808,26097,-19815,26092,-19821,26087,-19828,26082,-19835,26077,-19841,26072,-19848,26067,-19855,26061,-19861,26056,-19868,26051,-19875,26046,-19881,26041,-19888,26036,-19895,26031,-19901,26026,-19908,26021,-19915,26016,-19921,26011,-19928,26006,-19934,26000,-19941,25995,-19948,25990,-19954,25985,-19961,25980,-19968,25975,-19974,25970,-19981,25965,-19988,25960,-19994,25954,-20001,25949,-20008,25944,-20014,25939,-20021,25934,-20027,25929,-20034,25924,-20041,25919,-20047,25913,-20054,25908,-20061,25903,-20067,25898,-20074,25893,-20080,25888,-20087,25883,-20094,25878,-20100,25872,-20107,25867,-20114,25862,-20120,25857,-20127,25852,-20133,25847,-20140,25842,-20147,25836,-20153,25831,-20160,25826,-20166,25821,-20173,25816,-20180,25811,-20186,25805,-20193,25800,-20199,25795,-20206,25790,-20213,25785,-20219,25780,-20226,25774,-20232,25769,-20239,25764,-20246,25759,-20252,25754,-20259,25749,-20265,25743,-20272,25738,-20278,25733,-20285,25728,-20292,25723,-20298,25717,-20305,25712,-20311,25707,-20318,25702,-20324,25697,-20331,25691,-20338,25686,-20344,25681,-20351,25676,-20357,25671,-20364,25665,-20370,25660,-20377,25655,-20384,25650,-20390,25645,-20397,25639,-20403,25634,-20410,25629,-20416,25624,-20423,25619,-20429,25613,-20436,25608,-20443,25603,-20449,25598,-20456,25592,-20462,25587,-20469,25582,-20475,25577,-20482,25571,-20488,25566,-20495,25561,-20501,25556,-20508,25550,-20514,25545,-20521,25540,-20528,25535,-20534,25529,-20541,25524,-20547,25519,-20554,25514,-20560,25508,-20567,25503,-20573,25498,-20580,25493,-20586,25487,-20593,25482,-20599,25477,-20606,25472,-20612,25466,-20619,25461,-20625,25456,-20632,25451,-20638,25445,-20645,25440,-20651,25435,-20658,25429,-20664,25424,-20671,25419,-20677,25414,-20684,25408,-20690,25403,-20697,25398,-20703,25392,-20710,25387,-20716,25382,-20723,25376,-20729,25371,-20736,25366,-20742,25361,-20749,25355,-20755,25350,-20762,25345,-20768,25339,-20775,25334,-20781,25329,-20788,25323,-20794,25318,-20801,25313,-20807,25307,-20814,25302,-20820,25297,-20826,25291,-20833,25286,-20839,25281,-20846,25276,-20852,25270,-20859,25265,-20865,25260,-20872,25254,-20878,25249,-20885,25243,-20891,25238,-20898,25233,-20904,25227,-20910,25222,-20917,25217,-20923,25211,-20930,25206,-20936,25201,-20943,25195,-20949,25190,-20956,25185,-20962,25179,-20968,25174,-20975,25169,-20981,25163,-20988,25158,-20994,25152,-21001,25147,-21007,25142,-21013,25136,-21020,25131,-21026,25126,-21033,25120,-21039,25115,-21046,25109,-21052,25104,-21058,25099,-21065,25093,-21071,25088,-21078,25083,-21084,25077,-21091,25072,-21097,25066,-21103,25061,-21110,25056,-21116,25050,-21123,25045,-21129,25039,-21135,25034,-21142,25029,-21148,25023,-21155,25018,-21161,25012,-21167,25007,-21174,25001,-21180,24996,-21187,24991,-21193,24985,-21199,24980,-21206,24974,-21212,24969,-21218,24964,-21225,24958,-21231,24953,-21238,24947,-21244,24942,-21250,24936,-21257,24931,-21263,24926,-21269,24920,-21276,24915,-21282,24909,-21289,24904,-21295,24898,-21301,24893,-21308,24887,-21314,24882,-21320,24877,-21327,24871,-21333,24866,-21340,24860,-21346,24855,-21352,24849,-21359,24844,-21365,24838,-21371,24833,-21378,24827,-21384,24822,-21390,24816,-21397,24811,-21403,24805,-21409,24800,-21416,24795,-21422,24789,-21428,24784,-21435,24778,-21441,24773,-21447,24767,-21454,24762,-21460,24756,-21466,24751,-21473,24745,-21479,24740,-21485,24734,-21492,24729,-21498,24723,-21504,24718,-21511,24712,-21517,24707,-21523,24701,-21530,24696,-21536,24690,-21542,24685,-21549,24679,-21555,24674,-21561,24668,-21567,24663,-21574,24657,-21580,24652,-21586,24646,-21593,24641,-21599,24635,-21605,24630,-21612,24624,-21618,24618,-21624,24613,-21630,24607,-21637,24602,-21643,24596,-21649,24591,-21656,24585,-21662,24580,-21668,24574,-21674,24569,-21681,24563,-21687,24558,-21693,24552,-21700,24546,-21706,24541,-21712,24535,-21718,24530,-21725,24524,-21731,24519,-21737,24513,-21744,24508,-21750,24502,-21756,24496,-21762,24491,-21769,24485,-21775,24480,-21781,24474,-21787,24469,-21794,24463,-21800,24457,-21806,24452,-21812,24446,-21819,24441,-21825,24435,-21831,24430,-21837,24424,-21844,24418,-21850,24413,-21856,24407,-21862,24402,-21869,24396,-21875,24390,-21881,24385,-21887,24379,-21894,24374,-21900,24368,-21906,24362,-21912,24357,-21918,24351,-21925,24346,-21931,24340,-21937,24334,-21943,24329,-21950,24323,-21956,24318,-21962,24312,-21968,24306,-21974,24301,-21981,24295,-21987,24289,-21993,24284,-21999,24278,-22005,24273,-22012,24267,-22018,24261,-22024,24256,-22030,24250,-22036,24244,-22043,24239,-22049,24233,-22055,24228,-22061,24222,-22067,24216,-22074,24211,-22080,24205,-22086,24199,-22092,24194,-22098,24188,-22105,24182,-22111,24177,-22117,24171,-22123,24165,-22129,24160,-22136,24154,-22142,24148,-22148,24143,-22154,24137,-22160,24131,-22166,24126,-22173,24120,-22179,24114,-22185,24109,-22191,24103,-22197,24097,-22203,24092,-22210,24086,-22216,24080,-22222,24075,-22228,24069,-22234,24063,-22240,24058,-22246,24052,-22253,24046,-22259,24041,-22265,24035,-22271,24029,-22277,24023,-22283,24018,-22289,24012,-22296,24006,-22302,24001,-22308,23995,-22314,23989,-22320,23984,-22326,23978,-22332,23972,-22339,23966,-22345,23961,-22351,23955,-22357,23949,-22363,23944,-22369,23938,-22375,23932,-22381,23926,-22388,23921,-22394,23915,-22400,23909,-22406,23903,-22412,23898,-22418,23892,-22424,23886,-22430,23881,-22436,23875,-22443,23869,-22449,23863,-22455,23858,-22461,23852,-22467,23846,-22473,23840,-22479,23835,-22485,23829,-22491,23823,-22497,23817,-22504,23812,-22510,23806,-22516,23800,-22522,23794,-22528,23789,-22534,23783,-22540,23777,-22546,23771,-22552,23766,-22558,23760,-22564,23754,-22570,23748,-22576,23742,-22583,23737,-22589,23731,-22595,23725,-22601,23719,-22607,23714,-22613,23708,-22619,23702,-22625,23696,-22631,23690,-22637,23685,-22643,23679,-22649,23673,-22655,23667,-22661,23661,-22667,23656,-22673,23650,-22679,23644,-22686,23638,-22692,23632,-22698,23627,-22704,23621,-22710,23615,-22716,23609,-22722,23603,-22728,23598,-22734,23592,-22740,23586,-22746,23580,-22752,23574,-22758,23569,-22764,23563,-22770,23557,-22776,23551,-22782,23545,-22788,23539,-22794,23534,-22800,23528,-22806,23522,-22812,23516,-22818,23510,-22824,23504,-22830,23499,-22836,23493,-22842,23487,-22848,23481,-22854,23475,-22860,23469,-22866,23464,-22872,23458,-22878,23452,-22884,23446,-22890,23440,-22896,23434,-22902,23428,-22908,23423,-22914,23417,-22920,23411,-22926,23405,-22932,23399,-22938,23393,-22944,23387,-22950,23382,-22956,23376,-22962,23370,-22968,23364,-22974,23358,-22980,23352,-22986,23346,-22992,23340,-22998,23335,-23004,23329,-23010,23323,-23016,23317,-23022,23311,-23028,23305,-23034,23299,-23040,23293,-23046,23287,-23051,23282,-23057,23276,-23063,23270,-23069,23264,-23075,23258,-23081,23252,-23087,23246,-23093,23240,-23099,23234,-23105,23228,-23111,23223,-23117,23217,-23123,23211,-23129,23205,-23135,23199,-23141,23193,-23147,23187,-23152,23181,-23158,23175,-23164,23169,-23170,23163,-23176,23157,-23182,23151,-23188,23146,-23194,23140,-23200,23134,-23206,23128,-23212,23122,-23218,23116,-23224,23110,-23229,23104,-23235,23098,-23241,23092,-23247,23086,-23253,23080,-23259,23074,-23265,23068,-23271,23062,-23277,23056,-23283,23050,-23288,23045,-23294,23039,-23300,23033,-23306,23027,-23312,23021,-23318,23015,-23324,23009,-23330,23003,-23336,22997,-23341,22991,-23347,22985,-23353,22979,-23359,22973,-23365,22967,-23371,22961,-23377,22955,-23383,22949,-23388,22943,-23394,22937,-23400,22931,-23406,22925,-23412,22919,-23418,22913,-23424,22907,-23429,22901,-23435,22895,-23441,22889,-23447,22883,-23453,22877,-23459,22871,-23465,22865,-23470,22859,-23476,22853,-23482,22847,-23488,22841,-23494,22835,-23500,22829,-23505,22823,-23511,22817,-23517,22811,-23523,22805,-23529,22799,-23535,22793,-23540,22787,-23546,22781,-23552,22775,-23558,22769,-23564,22763,-23570,22757,-23575,22751,-23581,22745,-23587,22739,-23593,22733,-23599,22727,-23604,22721,-23610,22715,-23616,22709,-23622,22703,-23628,22697,-23633,22691,-23639,22685,-23645,22678,-23651,22672,-23657,22666,-23662,22660,-23668,22654,-23674,22648,-23680,22642,-23686,22636,-23691,22630,-23697,22624,-23703,22618,-23709,22612,-23715,22606,-23720,22600,-23726,22594,-23732,22588,-23738,22582,-23743,22575,-23749,22569,-23755,22563,-23761,22557,-23767,22551,-23772,22545,-23778,22539,-23784,22533,-23790,22527,-23795,22521,-23801,22515,-23807,22509,-23813,22503,-23818,22496,-23824,22490,-23830,22484,-23836,22478,-23841,22472,-23847,22466,-23853,22460,-23859,22454,-23864,22448,-23870,22442,-23876,22435,-23882,22429,-23887,22423,-23893,22417,-23899,22411,-23904,22405,-23910,22399,-23916,22393,-23922,22387,-23927,22380,-23933,22374,-23939,22368,-23945,22362,-23950,22356,-23956,22350,-23962,22344,-23967,22338,-23973,22331,-23979,22325,-23985,22319,-23990,22313,-23996,22307,-24002,22301,-24007,22295,-24013,22288,-24019,22282,-24024,22276,-24030,22270,-24036,22264,-24042,22258,-24047,22252,-24053,22245,-24059,22239,-24064,22233,-24070,22227,-24076,22221,-24081,22215,-24087,22209,-24093,22202,-24098,22196,-24104,22190,-24110,22184,-24115,22178,-24121,22172,-24127,22165,-24132,22159,-24138,22153,-24144,22147,-24149,22141,-24155,22135,-24161,22128,-24166,22122,-24172,22116,-24178,22110,-24183,22104,-24189,22097,-24195,22091,-24200,22085,-24206,22079,-24212,22073,-24217,22066,-24223,22060,-24229,22054,-24234,22048,-24240,22042,-24245,22035,-24251,22029,-24257,22023,-24262,22017,-24268,22011,-24274,22004,-24279,21998,-24285,21992,-24290,21986,-24296,21980,-24302,21973,-24307,21967,-24313,21961,-24319,21955,-24324,21949,-24330,21942,-24335,21936,-24341,21930,-24347,21924,-24352,21917,-24358,21911,-24363,21905,-24369,21899,-24375,21893,-24380,21886,-24386,21880,-24391,21874,-24397,21868,-24403,21861,-24408,21855,-24414,21849,-24419,21843,-24425,21836,-24431,21830,-24436,21824,-24442,21818,-24447,21811,-24453,21805,-24458,21799,-24464,21793,-24470,21786,-24475,21780,-24481,21774,-24486,21768,-24492,21761,-24497,21755,-24503,21749,-24509,21743,-24514,21736,-24520,21730,-24525,21724,-24531,21717,-24536,21711,-24542,21705,-24547,21699,-24553,21692,-24559,21686,-24564,21680,-24570,21673,-24575,21667,-24581,21661,-24586,21655,-24592,21648,-24597,21642,-24603,21636,-24608,21629,-24614,21623,-24619,21617,-24625,21611,-24631,21604,-24636,21598,-24642,21592,-24647,21585,-24653,21579,-24658,21573,-24664,21566,-24669,21560,-24675,21554,-24680,21548,-24686,21541,-24691,21535,-24697,21529,-24702,21522,-24708,21516,-24713,21510,-24719,21503,-24724,21497,-24730,21491,-24735,21484,-24741,21478,-24746,21472,-24752,21465,-24757,21459,-24763,21453,-24768,21446,-24774,21440,-24779,21434,-24785,21427,-24790,21421,-24796,21415,-24801,21408,-24806,21402,-24812,21396,-24817,21389,-24823,21383,-24828,21377,-24834,21370,-24839,21364,-24845,21358,-24850,21351,-24856,21345,-24861,21339,-24867,21332,-24872,21326,-24878,21319,-24883,21313,-24888,21307,-24894,21300,-24899,21294,-24905,21288,-24910,21281,-24916,21275,-24921,21268,-24927,21262,-24932,21256,-24937,21249,-24943,21243,-24948,21237,-24954,21230,-24959,21224,-24965,21217,-24970,21211,-24975,21205,-24981,21198,-24986,21192,-24992,21186,-24997,21179,-25002,21173,-25008,21166,-25013,21160,-25019,21154,-25024,21147,-25030,21141,-25035,21134,-25040,21128,-25046,21122,-25051,21115,-25057,21109,-25062,21102,-25067,21096,-25073,21090,-25078,21083,-25084,21077,-25089,21070,-25094,21064,-25100,21057,-25105,21051,-25110,21045,-25116,21038,-25121,21032,-25127,21025,-25132,21019,-25137,21012,-25143,21006,-25148,21000,-25153,20993,-25159,20987,-25164,20980,-25170,20974,-25175,20967,-25180,20961,-25186,20955,-25191,20948,-25196,20942,-25202,20935,-25207,20929,-25212,20922,-25218,20916,-25223,20909,-25228,20903,-25234,20897,-25239,20890,-25244,20884,-25250,20877,-25255,20871,-25261,20864,-25266,20858,-25271,20851,-25277,20845,-25282,20838,-25287,20832,-25292,20825,-25298,20819,-25303,20813,-25308,20806,-25314,20800,-25319,20793,-25324,20787,-25330,20780,-25335,20774,-25340,20767,-25346,20761,-25351,20754,-25356,20748,-25362,20741,-25367,20735,-25372,20728,-25377,20722,-25383,20715,-25388,20709,-25393,20702,-25399,20696,-25404,20689,-25409,20683,-25415,20676,-25420,20670,-25425,20663,-25430,20657,-25436,20650,-25441,20644,-25446,20637,-25452,20631,-25457,20624,-25462,20618,-25467,20611,-25473,20605,-25478,20598,-25483,20592,-25488,20585,-25494,20579,-25499,20572,-25504,20566,-25509,20559,-25515,20553,-25520,20546,-25525,20540,-25530,20533,-25536,20527,-25541,20520,-25546,20513,-25551,20507,-25557,20500,-25562,20494,-25567,20487,-25572,20481,-25578,20474,-25583,20468,-25588,20461,-25593,20455,-25599,20448,-25604,20442,-25609,20435,-25614,20428,-25620,20422,-25625,20415,-25630,20409,-25635,20402,-25640,20396,-25646,20389,-25651,20383,-25656,20376,-25661,20369,-25666,20363,-25672,20356,-25677,20350,-25682,20343,-25687,20337,-25692,20330,-25698,20323,-25703,20317,-25708,20310,-25713,20304,-25718,20297,-25724,20291,-25729,20284,-25734,20277,-25739,20271,-25744,20264,-25750,20258,-25755,20251,-25760,20245,-25765,20238,-25770,20231,-25775,20225,-25781,20218,-25786,20212,-25791,20205,-25796,20198,-25801,20192,-25806,20185,-25812,20179,-25817,20172,-25822,20165,-25827,20159,-25832,20152,-25837,20146,-25843,20139,-25848,20132,-25853,20126,-25858,20119,-25863,20113,-25868,20106,-25873,20099,-25879,20093,-25884,20086,-25889,20079,-25894,20073,-25899,20066,-25904,20060,-25909,20053,-25914,20046,-25920,20040,-25925,20033,-25930,20026,-25935,20020,-25940,20013,-25945,20007,-25950,20000,-25955,19993,-25961,19987,-25966,19980,-25971,19973,-25976,19967,-25981,19960,-25986,19953,-25991,19947,-25996,19940,-26001,19933,-26007,19927,-26012,19920,-26017,19914,-26022,19907,-26027,19900,-26032,19894,-26037,19887,-26042,19880,-26047,19874,-26052,19867,-26057,19860,-26062,19854,-26068,19847,-26073,19840,-26078,19834,-26083,19827,-26088,19820,-26093,19814,-26098,19807,-26103,19800,-26108,19794,-26113,19787,-26118,19780,-26123,19774,-26128,19767,-26133,19760,-26138,19754,-26143,19747,-26149,19740,-26154,19733,-26159,19727,-26164,19720,-26169,19713,-26174,19707,-26179,19700,-26184,19693,-26189,19687,-26194,19680,-26199,19673,-26204,19667,-26209,19660,-26214,19653,-26219,19646,-26224,19640,-26229,19633,-26234,19626,-26239,19620,-26244,19613,-26249,19606,-26254,19599,-26259,19593,-26264,19586,-26269,19579,-26274,19573,-26279,19566,-26284,19559,-26289,19552,-26294,19546,-26299,19539,-26304,19532,-26309,19526,-26314,19519,-26319,19512,-26324,19505,-26329,19499,-26334,19492,-26339,19485,-26344,19478,-26349,19472,-26354,19465,-26359,19458,-26364,19451,-26369,19445,-26374,19438,-26379,19431,-26384,19424,-26389,19418,-26394,19411,-26399,19404,-26404,19397,-26409,19391,-26414,19384,-26419,19377,-26424,19370,-26429,19364,-26434,19357,-26438,19350,-26443,19343,-26448,19337,-26453,19330,-26458,19323,-26463,19316,-26468,19310,-26473,19303,-26478,19296,-26483,19289,-26488,19282,-26493,19276,-26498,19269,-26503,19262,-26508,19255,-26513,19249,-26517,19242,-26522,19235,-26527,19228,-26532,19221,-26537,19215,-26542,19208,-26547,19201,-26552,19194,-26557,19188,-26562,19181,-26567,19174,-26571,19167,-26576,19160,-26581,19154,-26586,19147,-26591,19140,-26596,19133,-26601,19126,-26606,19120,-26611,19113,-26616,19106,-26620,19099,-26625,19092,-26630,19086,-26635,19079,-26640,19072,-26645,19065,-26650,19058,-26655,19051,-26659,19045,-26664,19038,-26669,19031,-26674,19024,-26679,19017,-26684,19011,-26689,19004,-26693,18997,-26698,18990,-26703,18983,-26708,18976,-26713,18970,-26718,18963,-26723,18956,-26727,18949,-26732,18942,-26737,18935,-26742,18929,-26747,18922,-26752,18915,-26756,18908,-26761,18901,-26766,18894,-26771,18888,-26776,18881,-26781,18874,-26785,18867,-26790,18860,-26795,18853,-26800,18846,-26805,18840,-26810,18833,-26814,18826,-26819,18819,-26824,18812,-26829,18805,-26834,18798,-26838,18792,-26843,18785,-26848,18778,-26853,18771,-26858,18764,-26862,18757,-26867,18750,-26872,18744,-26877,18737,-26882,18730,-26886,18723,-26891,18716,-26896,18709,-26901,18702,-26906,18695,-26910,18689,-26915,18682,-26920,18675,-26925,18668,-26929,18661,-26934,18654,-26939,18647,-26944,18640,-26949,18633,-26953,18627,-26958,18620,-26963,18613,-26968,18606,-26972,18599,-26977,18592,-26982,18585,-26987,18578,-26991,18571,-26996,18564,-27001,18558,-27006,18551,-27010,18544,-27015,18537,-27020,18530,-27025,18523,-27029,18516,-27034,18509,-27039,18502,-27043,18495,-27048,18488,-27053,18482,-27058,18475,-27062,18468,-27067,18461,-27072,18454,-27077,18447,-27081,18440,-27086,18433,-27091,18426,-27095,18419,-27100,18412,-27105,18405,-27110,18398,-27114,18392,-27119,18385,-27124,18378,-27128,18371,-27133,18364,-27138,18357,-27142,18350,-27147,18343,-27152,18336,-27157,18329,-27161,18322,-27166,18315,-27171,18308,-27175,18301,-27180,18294,-27185,18287,-27189,18280,-27194,18273,-27199,18267,-27203,18260,-27208,18253,-27213,18246,-27217,18239,-27222,18232,-27227,18225,-27231,18218,-27236,18211,-27241,18204,-27245,18197,-27250,18190,-27255,18183,-27259,18176,-27264,18169,-27269,18162,-27273,18155,-27278,18148,-27282,18141,-27287,18134,-27292,18127,-27296,18120,-27301,18113,-27306,18106,-27310,18099,-27315,18092,-27320,18085,-27324,18078,-27329,18071,-27333,18064,-27338,18057,-27343,18050,-27347,18043,-27352,18036,-27356,18029,-27361,18022,-27366,18015,-27370,18008,-27375,18001,-27379,17994,-27384,17987,-27389,17980,-27393,17973,-27398,17966,-27402,17959,-27407,17952,-27412,17945,-27416,17938,-27421,17931,-27425,17924,-27430,17917,-27435,17910,-27439,17903,-27444,17896,-27448,17889,-27453,17882,-27457,17875,-27462,17868,-27467,17861,-27471,17854,-27476,17847,-27480,17840,-27485,17833,-27489,17826,-27494,17819,-27499,17812,-27503,17805,-27508,17798,-27512,17791,-27517,17784,-27521,17777,-27526,17770,-27530,17763,-27535,17756,-27539,17749,-27544,17742,-27549,17735,-27553,17727,-27558,17720,-27562,17713,-27567,17706,-27571,17699,-27576,17692,-27580,17685,-27585,17678,-27589,17671,-27594,17664,-27598,17657,-27603,17650,-27607,17643,-27612,17636,-27616,17629,-27621,17622,-27625,17615,-27630,17608,-27634,17600,-27639,17593,-27643,17586,-27648,17579,-27652,17572,-27657,17565,-27661,17558,-27666,17551,-27670,17544,-27675,17537,-27679,17530,-27684,17523,-27688,17516,-27693,17509,-27697,17501,-27702,17494,-27706,17487,-27711,17480,-27715,17473,-27720,17466,-27724,17459,-27729,17452,-27733,17445,-27737,17438,-27742,17431,-27746,17423,-27751,17416,-27755,17409,-27760,17402,-27764,17395,-27769,17388,-27773,17381,-27778,17374,-27782,17367,-27786,17360,-27791,17352,-27795,17345,-27800,17338,-27804,17331,-27809,17324,-27813,17317,-27817,17310,-27822,17303,-27826,17296,-27831,17288,-27835,17281,-27840,17274,-27844,17267,-27848,17260,-27853,17253,-27857,17246,-27862,17239,-27866,17232,-27870,17224,-27875,17217,-27879,17210,-27884,17203,-27888,17196,-27892,17189,-27897,17182,-27901,17174,-27906,17167,-27910,17160,-27914,17153,-27919,17146,-27923,17139,-27928,17132,-27932,17124,-27936,17117,-27941,17110,-27945,17103,-27949,17096,-27954,17089,-27958,17082,-27963,17074,-27967,17067,-27971,17060,-27976,17053,-27980,17046,-27984,17039,-27989,17032,-27993,17024,-27997,17017,-28002,17010,-28006,17003,-28010,16996,-28015,16989,-28019,16981,-28024,16974,-28028,16967,-28032,16960,-28037,16953,-28041,16946,-28045,16938,-28050,16931,-28054,16924,-28058,16917,-28063,16910,-28067,16903,-28071,16895,-28076,16888,-28080,16881,-28084,16874,-28088,16867,-28093,16859,-28097,16852,-28101,16845,-28106,16838,-28110,16831,-28114,16824,-28119,16816,-28123,16809,-28127,16802,-28132,16795,-28136,16788,-28140,16780,-28144,16773,-28149,16766,-28153,16759,-28157,16752,-28162,16744,-28166,16737,-28170,16730,-28174,16723,-28179,16716,-28183,16708,-28187,16701,-28191,16694,-28196,16687,-28200,16680,-28204,16672,-28209,16665,-28213,16658,-28217,16651,-28221,16643,-28226,16636,-28230,16629,-28234,16622,-28238,16615,-28243,16607,-28247,16600,-28251,16593,-28255,16586,-28260,16578,-28264,16571,-28268,16564,-28272,16557,-28276,16550,-28281,16542,-28285,16535,-28289,16528,-28293,16521,-28298,16513,-28302,16506,-28306,16499,-28310,16492,-28315,16484,-28319,16477,-28323,16470,-28327,16463,-28331,16455,-28336,16448,-28340,16441,-28344,16434,-28348,16427,-28352,16419,-28357,16412,-28361,16405,-28365,16398,-28369,16390,-28373,16383,-28378,16376,-28382,16368,-28386,16361,-28390,16354,-28394,16347,-28398,16339,-28403,16332,-28407,16325,-28411,16318,-28415,16310,-28419,16303,-28424,16296,-28428,16289,-28432,16281,-28436,16274,-28440,16267,-28444,16260,-28448,16252,-28453,16245,-28457,16238,-28461,16230,-28465,16223,-28469,16216,-28473,16209,-28478,16201,-28482,16194,-28486,16187,-28490,16179,-28494,16172,-28498,16165,-28502,16158,-28507,16150,-28511,16143,-28515,16136,-28519,16128,-28523,16121,-28527,16114,-28531,16107,-28535,16099,-28539,16092,-28544,16085,-28548,16077,-28552,16070,-28556,16063,-28560,16055,-28564,16048,-28568,16041,-28572,16034,-28576,16026,-28581,16019,-28585,16012,-28589,16004,-28593,15997,-28597,15990,-28601,15982,-28605,15975,-28609,15968,-28613,15960,-28617,15953,-28621,15946,-28626,15938,-28630,15931,-28634,15924,-28638,15917,-28642,15909,-28646,15902,-28650,15895,-28654,15887,-28658,15880,-28662,15873,-28666,15865,-28670,15858,-28674,15851,-28678,15843,-28682,15836,-28686,15829,-28691,15821,-28695,15814,-28699,15807,-28703,15799,-28707,15792,-28711,15785,-28715,15777,-28719,15770,-28723,15763,-28727,15755,-28731,15748,-28735,15740,-28739,15733,-28743,15726,-28747,15718,-28751,15711,-28755,15704,-28759,15696,-28763,15689,-28767,15682,-28771,15674,-28775,15667,-28779,15660,-28783,15652,-28787,15645,-28791,15638,-28795,15630,-28799,15623,-28803,15615,-28807,15608,-28811,15601,-28815,15593,-28819,15586,-28823,15579,-28827,15571,-28831,15564,-28835,15556,-28839,15549,-28843,15542,-28847,15534,-28851,15527,-28855,15520,-28859,15512,-28863,15505,-28867,15497,-28871,15490,-28875,15483,-28879,15475,-28883,15468,-28887,15461,-28891,15453,-28894,15446,-28898,15438,-28902,15431,-28906,15424,-28910,15416,-28914,15409,-28918,15401,-28922,15394,-28926,15387,-28930,15379,-28934,15372,-28938,15364,-28942,15357,-28946,15350,-28950,15342,-28954,15335,-28957,15327,-28961,15320,-28965,15313,-28969,15305,-28973,15298,-28977,15290,-28981,15283,-28985,15276,-28989,15268,-28993,15261,-28997,15253,-29000,15246,-29004,15238,-29008,15231,-29012,15224,-29016,15216,-29020,15209,-29024,15201,-29028,15194,-29032,15187,-29035,15179,-29039,15172,-29043,15164,-29047,15157,-29051,15149,-29055,15142,-29059,15135,-29063,15127,-29066,15120,-29070,15112,-29074,15105,-29078,15097,-29082,15090,-29086,15083,-29090,15075,-29093,15068,-29097,15060,-29101,15053,-29105,15045,-29109,15038,-29113,15030,-29117,15023,-29120,15016,-29124,15008,-29128,15001,-29132,14993,-29136,14986,-29140,14978,-29143,14971,-29147,14963,-29151,14956,-29155,14949,-29159,14941,-29163,14934,-29166,14926,-29170,14919,-29174,14911,-29178,14904,-29182,14896,-29185,14889,-29189,14881,-29193,14874,-29197,14866,-29201,14859,-29204,14852,-29208,14844,-29212,14837,-29216,14829,-29220,14822,-29223,14814,-29227,14807,-29231,14799,-29235,14792,-29239,14784,-29242,14777,-29246,14769,-29250,14762,-29254,14754,-29257,14747,-29261,14739,-29265,14732,-29269,14724,-29273,14717,-29276,14709,-29280,14702,-29284,14694,-29288,14687,-29291,14680,-29295,14672,-29299,14665,-29303,14657,-29306,14650,-29310,14642,-29314,14635,-29318,14627,-29321,14620,-29325,14612,-29329,14605,-29333,14597,-29336,14590,-29340,14582,-29344,14575,-29347,14567,-29351,14560,-29355,14552,-29359,14545,-29362,14537,-29366,14530,-29370,14522,-29373,14515,-29377,14507,-29381,14499,-29385,14492,-29388,14484,-29392,14477,-29396,14469,-29399,14462,-29403,14454,-29407,14447,-29411,14439,-29414,14432,-29418,14424,-29422,14417,-29425,14409,-29429,14402,-29433,14394,-29436,14387,-29440,14379,-29444,14372,-29447,14364,-29451,14357,-29455,14349,-29458,14342,-29462,14334,-29466,14326,-29469,14319,-29473,14311,-29477,14304,-29480,14296,-29484,14289,-29488,14281,-29491,14274,-29495,14266,-29499,14259,-29502,14251,-29506,14244,-29510,14236,-29513,14228,-29517,14221,-29520,14213,-29524,14206,-29528,14198,-29531,14191,-29535,14183,-29539,14176,-29542,14168,-29546,14160,-29549,14153,-29553,14145,-29557,14138,-29560,14130,-29564,14123,-29568,14115,-29571,14108,-29575,14100,-29578,14092,-29582,14085,-29586,14077,-29589,14070,-29593,14062,-29596,14055,-29600,14047,-29604,14039,-29607,14032,-29611,14024,-29614,14017,-29618,14009,-29622,14002,-29625,13994,-29629,13986,-29632,13979,-29636,13971,-29639,13964,-29643,13956,-29647,13949,-29650,13941,-29654,13933,-29657,13926,-29661,13918,-29664,13911,-29668,13903,-29671,13895,-29675,13888,-29679,13880,-29682,13873,-29686,13865,-29689,13858,-29693,13850,-29696,13842,-29700,13835,-29703,13827,-29707,13820,-29710,13812,-29714,13804,-29718,13797,-29721,13789,-29725,13782,-29728,13774,-29732,13766,-29735,13759,-29739,13751,-29742,13744,-29746,13736,-29749,13728,-29753,13721,-29756,13713,-29760,13706,-29763,13698,-29767,13690,-29770,13683,-29774,13675,-29777,13667,-29781,13660,-29784,13652,-29788,13645,-29791,13637,-29795,13629,-29798,13622,-29802,13614,-29805,13607,-29809,13599,-29812,13591,-29816,13584,-29819,13576,-29823,13568,-29826,13561,-29829,13553,-29833,13546,-29836,13538,-29840,13530,-29843,13523,-29847,13515,-29850,13507,-29854,13500,-29857,13492,-29861,13485,-29864,13477,-29867,13469,-29871,13462,-29874,13454,-29878,13446,-29881,13439,-29885,13431,-29888,13423,-29892,13416,-29895,13408,-29898,13400,-29902,13393,-29905,13385,-29909,13378,-29912,13370,-29916,13362,-29919,13355,-29922,13347,-29926,13339,-29929,13332,-29933,13324,-29936,13316,-29939,13309,-29943,13301,-29946,13293,-29950,13286,-29953,13278,-29956,13270,-29960,13263,-29963,13255,-29967,13247,-29970,13240,-29973,13232,-29977,13224,-29980,13217,-29984,13209,-29987,13201,-29990,13194,-29994,13186,-29997,13178,-30000,13171,-30004,13163,-30007,13155,-30010,13148,-30014,13140,-30017,13132,-30021,13125,-30024,13117,-30027,13109,-30031,13102,-30034,13094,-30037,13086,-30041,13079,-30044,13071,-30047,13063,-30051,13056,-30054,13048,-30057,13040,-30061,13033,-30064,13025,-30067,13017,-30071,13009,-30074,13002,-30077,12994,-30081,12986,-30084,12979,-30087,12971,-30091,12963,-30094,12956,-30097,12948,-30101,12940,-30104,12933,-30107,12925,-30110,12917,-30114,12909,-30117,12902,-30120,12894,-30124,12886,-30127,12879,-30130,12871,-30134,12863,-30137,12856,-30140,12848,-30143,12840,-30147,12832,-30150,12825,-30153,12817,-30157,12809,-30160,12802,-30163,12794,-30166,12786,-30170,12778,-30173,12771,-30176,12763,-30179,12755,-30183,12748,-30186,12740,-30189,12732,-30192,12724,-30196,12717,-30199,12709,-30202,12701,-30206,12694,-30209,12686,-30212,12678,-30215,12670,-30218,12663,-30222,12655,-30225,12647,-30228,12639,-30231,12632,-30235,12624,-30238,12616,-30241,12609,-30244,12601,-30248,12593,-30251,12585,-30254,12578,-30257,12570,-30260,12562,-30264,12554,-30267,12547,-30270,12539,-30273,12531,-30276,12523,-30280,12516,-30283,12508,-30286,12500,-30289,12492,-30292,12485,-30296,12477,-30299,12469,-30302,12461,-30305,12454,-30308,12446,-30312,12438,-30315,12430,-30318,12423,-30321,12415,-30324,12407,-30327,12399,-30331,12392,-30334,12384,-30337,12376,-30340,12368,-30343,12361,-30346,12353,-30350,12345,-30353,12337,-30356,12330,-30359,12322,-30362,12314,-30365,12306,-30369,12299,-30372,12291,-30375,12283,-30378,12275,-30381,12268,-30384,12260,-30387,12252,-30391,12244,-30394,12236,-30397,12229,-30400,12221,-30403,12213,-30406,12205,-30409,12198,-30412,12190,-30416,12182,-30419,12174,-30422,12166,-30425,12159,-30428,12151,-30431,12143,-30434,12135,-30437,12128,-30440,12120,-30443,12112,-30447,12104,-30450,12096,-30453,12089,-30456,12081,-30459,12073,-30462,12065,-30465,12057,-30468,12050,-30471,12042,-30474,12034,-30477,12026,-30481,12019,-30484,12011,-30487,12003,-30490,11995,-30493,11987,-30496,11980,-30499,11972,-30502,11964,-30505,11956,-30508,11948,-30511,11941,-30514,11933,-30517,11925,-30520,11917,-30523,11909,-30526,11902,-30529,11894,-30533,11886,-30536,11878,-30539,11870,-30542,11862,-30545,11855,-30548,11847,-30551,11839,-30554,11831,-30557,11823,-30560,11816,-30563,11808,-30566,11800,-30569,11792,-30572,11784,-30575,11777,-30578,11769,-30581,11761,-30584,11753,-30587,11745,-30590,11737,-30593,11730,-30596,11722,-30599,11714,-30602,11706,-30605,11698,-30608,11691,-30611,11683,-30614,11675,-30617,11667,-30620,11659,-30623,11651,-30626,11644,-30629,11636,-30632,11628,-30635,11620,-30638,11612,-30641,11604,-30644,11597,-30647,11589,-30650,11581,-30653,11573,-30656,11565,-30658,11557,-30661,11550,-30664,11542,-30667,11534,-30670,11526,-30673,11518,-30676,11510,-30679,11502,-30682,11495,-30685,11487,-30688,11479,-30691,11471,-30694,11463,-30697,11455,-30700,11448,-30703,11440,-30706,11432,-30708,11424,-30711,11416,-30714,11408,-30717,11400,-30720,11393,-30723,11385,-30726,11377,-30729,11369,-30732,11361,-30735,11353,-30738,11345,-30740,11338,-30743,11330,-30746,11322,-30749,11314,-30752,11306,-30755,11298,-30758,11290,-30761,11283,-30764,11275,-30767,11267,-30769,11259,-30772,11251,-30775,11243,-30778,11235,-30781,11227,-30784,11220,-30787,11212,-30789,11204,-30792,11196,-30795,11188,-30798,11180,-30801,11172,-30804,11164,-30807,11157,-30810,11149,-30812,11141,-30815,11133,-30818,11125,-30821,11117,-30824,11109,-30827,11101,-30829,11094,-30832,11086,-30835,11078,-30838,11070,-30841,11062,-30844,11054,-30846,11046,-30849,11038,-30852,11030,-30855,11023,-30858,11015,-30861,11007,-30863,10999,-30866,10991,-30869,10983,-30872,10975,-30875,10967,-30877,10959,-30880,10952,-30883,10944,-30886,10936,-30889,10928,-30891,10920,-30894,10912,-30897,10904,-30900,10896,-30903,10888,-30905,10880,-30908,10873,-30911,10865,-30914,10857,-30916,10849,-30919,10841,-30922,10833,-30925,10825,-30928,10817,-30930,10809,-30933,10801,-30936,10794,-30939,10786,-30941,10778,-30944,10770,-30947,10762,-30950,10754,-30952,10746,-30955,10738,-30958,10730,-30961,10722,-30963,10714,-30966,10706,-30969,10699,-30972,10691,-30974,10683,-30977,10675,-30980,10667,-30982,10659,-30985,10651,-30988,10643,-30991,10635,-30993,10627,-30996,10619,-30999,10611,-31002,10603,-31004,10596,-31007,10588,-31010,10580,-31012,10572,-31015,10564,-31018,10556,-31020,10548,-31023,10540,-31026,10532,-31029,10524,-31031,10516,-31034,10508,-31037,10500,-31039,10492,-31042,10484,-31045,10477,-31047,10469,-31050,10461,-31053,10453,-31055,10445,-31058,10437,-31061,10429,-31063,10421,-31066,10413,-31069,10405,-31071,10397,-31074,10389,-31077,10381,-31079,10373,-31082,10365,-31085,10357,-31087,10349,-31090,10342,-31093,10334,-31095,10326,-31098,10318,-31101,10310,-31103,10302,-31106,10294,-31108,10286,-31111,10278,-31114,10270,-31116,10262,-31119,10254,-31122,10246,-31124,10238,-31127,10230,-31129,10222,-31132,10214,-31135,10206,-31137,10198,-31140,10190,-31142,10182,-31145,10174,-31148,10166,-31150,10159,-31153,10151,-31155,10143,-31158,10135,-31161,10127,-31163,10119,-31166,10111,-31168,10103,-31171,10095,-31174,10087,-31176,10079,-31179,10071,-31181,10063,-31184,10055,-31186,10047,-31189,10039,-31192,10031,-31194,10023,-31197,10015,-31199,10007,-31202,9999,-31204,9991,-31207,9983,-31210,9975,-31212,9967,-31215,9959,-31217,9951,-31220,9943,-31222,9935,-31225,9927,-31227,9919,-31230,9911,-31232,9903,-31235,9895,-31237,9887,-31240,9879,-31243,9871,-31245,9863,-31248,9855,-31250,9847,-31253,9839,-31255,9831,-31258,9823,-31260,9815,-31263,9807,-31265,9799,-31268,9791,-31270,9783,-31273,9775,-31275,9767,-31278,9759,-31280,9751,-31283,9743,-31285,9735,-31288,9727,-31290,9719,-31293,9711,-31295,9703,-31298,9695,-31300,9687,-31303,9679,-31305,9671,-31308,9663,-31310,9655,-31312,9647,-31315,9639,-31317,9631,-31320,9623,-31322,9615,-31325,9607,-31327,9599,-31330,9591,-31332,9583,-31335,9575,-31337,9567,-31339,9559,-31342,9551,-31344,9543,-31347,9535,-31349,9527,-31352,9519,-31354,9511,-31357,9503,-31359,9495,-31361,9487,-31364,9479,-31366,9471,-31369,9463,-31371,9455,-31374,9447,-31376,9439,-31378,9431,-31381,9423,-31383,9415,-31386,9407,-31388,9399,-31390,9391,-31393,9383,-31395,9375,-31398,9367,-31400,9359,-31402,9351,-31405,9343,-31407,9335,-31410,9327,-31412,9319,-31414,9311,-31417,9303,-31419,9295,-31421,9287,-31424,9279,-31426,9270,-31429,9262,-31431,9254,-31433,9246,-31436,9238,-31438,9230,-31440,9222,-31443,9214,-31445,9206,-31447,9198,-31450,9190,-31452,9182,-31455,9174,-31457,9166,-31459,9158,-31462,9150,-31464,9142,-31466,9134,-31469,9126,-31471,9118,-31473,9110,-31476,9102,-31478,9094,-31480,9086,-31483,9077,-31485,9069,-31487,9061,-31490,9053,-31492,9045,-31494,9037,-31496,9029,-31499,9021,-31501,9013,-31503,9005,-31506,8997,-31508,8989,-31510,8981,-31513,8973,-31515,8965,-31517,8957,-31519,8949,-31522,8941,-31524,8932,-31526,8924,-31529,8916,-31531,8908,-31533,8900,-31535,8892,-31538,8884,-31540,8876,-31542,8868,-31545,8860,-31547,8852,-31549,8844,-31551,8836,-31554,8828,-31556,8820,-31558,8812,-31560,8803,-31563,8795,-31565,8787,-31567,8779,-31569,8771,-31572,8763,-31574,8755,-31576,8747,-31578,8739,-31581,8731,-31583,8723,-31585,8715,-31587,8707,-31589,8699,-31592,8690,-31594,8682,-31596,8674,-31598,8666,-31601,8658,-31603,8650,-31605,8642,-31607,8634,-31609,8626,-31612,8618,-31614,8610,-31616,8602,-31618,8593,-31620,8585,-31623,8577,-31625,8569,-31627,8561,-31629,8553,-31631,8545,-31634,8537,-31636,8529,-31638,8521,-31640,8513,-31642,8504,-31644,8496,-31647,8488,-31649,8480,-31651,8472,-31653,8464,-31655,8456,-31657,8448,-31660,8440,-31662,8432,-31664,8424,-31666,8415,-31668,8407,-31670,8399,-31673,8391,-31675,8383,-31677,8375,-31679,8367,-31681,8359,-31683,8351,-31685,8343,-31688,8334,-31690,8326,-31692,8318,-31694,8310,-31696,8302,-31698,8294,-31700,8286,-31702,8278,-31705,8270,-31707,8262,-31709,8253,-31711,8245,-31713,8237,-31715,8229,-31717,8221,-31719,8213,-31721,8205,-31724,8197,-31726,8189,-31728,8180,-31730,8172,-31732,8164,-31734,8156,-31736,8148,-31738,8140,-31740,8132,-31742,8124,-31744,8116,-31746,8107,-31749,8099,-31751,8091,-31753,8083,-31755,8075,-31757,8067,-31759,8059,-31761,8051,-31763,8042,-31765,8034,-31767,8026,-31769,8018,-31771,8010,-31773,8002,-31775,7994,-31777,7986,-31779,7977,-31781,7969,-31783,7961,-31786,7953,-31788,7945,-31790,7937,-31792,7929,-31794,7921,-31796,7912,-31798,7904,-31800,7896,-31802,7888,-31804,7880,-31806,7872,-31808,7864,-31810,7856,-31812,7847,-31814,7839,-31816,7831,-31818,7823,-31820,7815,-31822,7807,-31824,7799,-31826,7790,-31828,7782,-31830,7774,-31832,7766,-31834,7758,-31836,7750,-31838,7742,-31840,7733,-31842,7725,-31844,7717,-31846,7709,-31848,7701,-31850,7693,-31852,7685,-31854,7676,-31855,7668,-31857,7660,-31859,7652,-31861,7644,-31863,7636,-31865,7628,-31867,7619,-31869,7611,-31871,7603,-31873,7595,-31875,7587,-31877,7579,-31879,7571,-31881,7562,-31883,7554,-31885,7546,-31887,7538,-31889,7530,-31890,7522,-31892,7514,-31894,7505,-31896,7497,-31898,7489,-31900,7481,-31902,7473,-31904,7465,-31906,7456,-31908,7448,-31910,7440,-31912,7432,-31913,7424,-31915,7416,-31917,7407,-31919,7399,-31921,7391,-31923,7383,-31925,7375,-31927,7367,-31929,7358,-31930,7350,-31932,7342,-31934,7334,-31936,7326,-31938,7318,-31940,7310,-31942,7301,-31944,7293,-31945,7285,-31947,7277,-31949,7269,-31951,7261,-31953,7252,-31955,7244,-31957,7236,-31958,7228,-31960,7220,-31962,7211,-31964,7203,-31966,7195,-31968,7187,-31969,7179,-31971,7171,-31973,7162,-31975,7154,-31977,7146,-31979,7138,-31980,7130,-31982,7122,-31984,7113,-31986,7105,-31988,7097,-31990,7089,-31991,7081,-31993,7072,-31995,7064,-31997,7056,-31999,7048,-32000,7040,-32002,7032,-32004,7023,-32006,7015,-32008,7007,-32009,6999,-32011,6991,-32013,6982,-32015,6974,-32017,6966,-32018,6958,-32020,6950,-32022,6942,-32024,6933,-32025,6925,-32027,6917,-32029,6909,-32031,6901,-32033,6892,-32034,6884,-32036,6876,-32038,6868,-32040,6860,-32041,6851,-32043,6843,-32045,6835,-32047,6827,-32048,6819,-32050,6811,-32052,6802,-32054,6794,-32055,6786,-32057,6778,-32059,6770,-32060,6761,-32062,6753,-32064,6745,-32066,6737,-32067,6729,-32069,6720,-32071,6712,-32073,6704,-32074,6696,-32076,6688,-32078,6679,-32079,6671,-32081,6663,-32083,6655,-32085,6647,-32086,6638,-32088,6630,-32090,6622,-32091,6614,-32093,6606,-32095,6597,-32096,6589,-32098,6581,-32100,6573,-32101,6564,-32103,6556,-32105,6548,-32106,6540,-32108,6532,-32110,6523,-32111,6515,-32113,6507,-32115,6499,-32116,6491,-32118,6482,-32120,6474,-32121,6466,-32123,6458,-32125,6450,-32126,6441,-32128,6433,-32130,6425,-32131,6417,-32133,6408,-32135,6400,-32136,6392,-32138,6384,-32140,6376,-32141,6367,-32143,6359,-32144,6351,-32146,6343,-32148,6334,-32149,6326,-32151,6318,-32153,6310,-32154,6302,-32156,6293,-32157,6285,-32159,6277,-32161,6269,-32162,6261,-32164,6252,-32165,6244,-32167,6236,-32169,6228,-32170,6219,-32172,6211,-32173,6203,-32175,6195,-32177,6186,-32178,6178,-32180,6170,-32181,6162,-32183,6154,-32184,6145,-32186,6137,-32188,6129,-32189,6121,-32191,6112,-32192,6104,-32194,6096,-32195,6088,-32197,6080,-32198,6071,-32200,6063,-32202,6055,-32203,6047,-32205,6038,-32206,6030,-32208,6022,-32209,6014,-32211,6005,-32212,5997,-32214,5989,-32215,5981,-32217,5972,-32219,5964,-32220,5956,-32222,5948,-32223,5940,-32225,5931,-32226,5923,-32228,5915,-32229,5907,-32231,5898,-32232,5890,-32234,5882,-32235,5874,-32237,5865,-32238,5857,-32240,5849,-32241,5841,-32243,5832,-32244,5824,-32246,5816,-32247,5808,-32249,5799,-32250,5791,-32252,5783,-32253,5775,-32255,5766,-32256,5758,-32257,5750,-32259,5742,-32260,5733,-32262,5725,-32263,5717,-32265,5709,-32266,5700,-32268,5692,-32269,5684,-32271,5676,-32272,5667,-32274,5659,-32275,5651,-32276,5643,-32278,5634,-32279,5626,-32281,5618,-32282,5610,-32284,5601,-32285,5593,-32287,5585,-32288,5577,-32289,5568,-32291,5560,-32292,5552,-32294,5544,-32295,5535,-32296,5527,-32298,5519,-32299,5511,-32301,5502,-32302,5494,-32304,5486,-32305,5478,-32306,5469,-32308,5461,-32309,5453,-32311,5445,-32312,5436,-32313,5428,-32315,5420,-32316,5411,-32317,5403,-32319,5395,-32320,5387,-32322,5378,-32323,5370,-32324,5362,-32326,5354,-32327,5345,-32328,5337,-32330,5329,-32331,5321,-32333,5312,-32334,5304,-32335,5296,-32337,5287,-32338,5279,-32339,5271,-32341,5263,-32342,5254,-32343,5246,-32345,5238,-32346,5230,-32347,5221,-32349,5213,-32350,5205,-32351,5197,-32353,5188,-32354,5180,-32355,5172,-32357,5163,-32358,5155,-32359,5147,-32361,5139,-32362,5130,-32363,5122,-32365,5114,-32366,5106,-32367,5097,-32369,5089,-32370,5081,-32371,5072,-32372,5064,-32374,5056,-32375,5048,-32376,5039,-32378,5031,-32379,5023,-32380,5014,-32381,5006,-32383,4998,-32384,4990,-32385,4981,-32387,4973,-32388,4965,-32389,4957,-32390,4948,-32392,4940,-32393,4932,-32394,4923,-32395,4915,-32397,4907,-32398,4899,-32399,4890,-32400,4882,-32402,4874,-32403,4865,-32404,4857,-32405,4849,-32407,4841,-32408,4832,-32409,4824,-32410,4816,-32412,4807,-32413,4799,-32414,4791,-32415,4783,-32417,4774,-32418,4766,-32419,4758,-32420,4749,-32421,4741,-32423,4733,-32424,4725,-32425,4716,-32426,4708,-32427,4700,-32429,4691,-32430,4683,-32431,4675,-32432,4666,-32433,4658,-32435,4650,-32436,4642,-32437,4633,-32438,4625,-32439,4617,-32441,4608,-32442,4600,-32443,4592,-32444,4584,-32445,4575,-32446,4567,-32448,4559,-32449,4550,-32450,4542,-32451,4534,-32452,4525,-32453,4517,-32455,4509,-32456,4501,-32457,4492,-32458,4484,-32459,4476,-32460,4467,-32461,4459,-32463,4451,-32464,4443,-32465,4434,-32466,4426,-32467,4418,-32468,4409,-32469,4401,-32471,4393,-32472,4384,-32473,4376,-32474,4368,-32475,4359,-32476,4351,-32477,4343,-32478,4335,-32479,4326,-32481,4318,-32482,4310,-32483,4301,-32484,4293,-32485,4285,-32486,4276,-32487,4268,-32488,4260,-32489,4252,-32490,4243,-32492,4235,-32493,4227,-32494,4218,-32495,4210,-32496,4202,-32497,4193,-32498,4185,-32499,4177,-32500,4168,-32501,4160,-32502,4152,-32503,4144,-32504,4135,-32505,4127,-32507,4119,-32508,4110,-32509,4102,-32510,4094,-32511,4085,-32512,4077,-32513,4069,-32514,4060,-32515,4052,-32516,4044,-32517,4035,-32518,4027,-32519,4019,-32520,4011,-32521,4002,-32522,3994,-32523,3986,-32524,3977,-32525,3969,-32526,3961,-32527,3952,-32528,3944,-32529,3936,-32530,3927,-32531,3919,-32532,3911,-32533,3902,-32534,3894,-32535,3886,-32536,3877,-32537,3869,-32538,3861,-32539,3853,-32540,3844,-32541,3836,-32542,3828,-32543,3819,-32544,3811,-32545,3803,-32546,3794,-32547,3786,-32548,3778,-32549,3769,-32550,3761,-32551,3753,-32552,3744,-32553,3736,-32554,3728,-32555,3719,-32556,3711,-32557,3703,-32558,3694,-32559,3686,-32559,3678,-32560,3669,-32561,3661,-32562,3653,-32563,3644,-32564,3636,-32565,3628,-32566,3619,-32567,3611,-32568,3603,-32569,3594,-32570,3586,-32571,3578,-32572,3570,-32572,3561,-32573,3553,-32574,3545,-32575,3536,-32576,3528,-32577,3520,-32578,3511,-32579,3503,-32580,3495,-32581,3486,-32581,3478,-32582,3470,-32583,3461,-32584,3453,-32585,3445,-32586,3436,-32587,3428,-32588,3420,-32589,3411,-32589,3403,-32590,3395,-32591,3386,-32592,3378,-32593,3370,-32594,3361,-32595,3353,-32595,3345,-32596,3336,-32597,3328,-32598,3320,-32599,3311,-32600,3303,-32601,3295,-32601,3286,-32602,3278,-32603,3270,-32604,3261,-32605,3253,-32606,3245,-32606,3236,-32607,3228,-32608,3220,-32609,3211,-32610,3203,-32611,3195,-32611,3186,-32612,3178,-32613,3170,-32614,3161,-32615,3153,-32615,3145,-32616,3136,-32617,3128,-32618,3120,-32619,3111,-32619,3103,-32620,3094,-32621,3086,-32622,3078,-32623,3069,-32623,3061,-32624,3053,-32625,3044,-32626,3036,-32626,3028,-32627,3019,-32628,3011,-32629,3003,-32630,2994,-32630,2986,-32631,2978,-32632,2969,-32633,2961,-32633,2953,-32634,2944,-32635,2936,-32636,2928,-32636,2919,-32637,2911,-32638,2903,-32639,2894,-32639,2886,-32640,2878,-32641,2869,-32642,2861,-32642,2853,-32643,2844,-32644,2836,-32645,2828,-32645,2819,-32646,2811,-32647,2802,-32647,2794,-32648,2786,-32649,2777,-32650,2769,-32650,2761,-32651,2752,-32652,2744,-32652,2736,-32653,2727,-32654,2719,-32654,2711,-32655,2702,-32656,2694,-32657,2686,-32657,2677,-32658,2669,-32659,2661,-32659,2652,-32660,2644,-32661,2636,-32661,2627,-32662,2619,-32663,2610,-32663,2602,-32664,2594,-32665,2585,-32665,2577,-32666,2569,-32667,2560,-32667,2552,-32668,2544,-32669,2535,-32669,2527,-32670,2519,-32671,2510,-32671,2502,-32672,2494,-32672,2485,-32673,2477,-32674,2468,-32674,2460,-32675,2452,-32676,2443,-32676,2435,-32677,2427,-32677,2418,-32678,2410,-32679,2402,-32679,2393,-32680,2385,-32681,2377,-32681,2368,-32682,2360,-32682,2352,-32683,2343,-32684,2335,-32684,2326,-32685,2318,-32685,2310,-32686,2301,-32687,2293,-32687,2285,-32688,2276,-32688,2268,-32689,2260,-32689,2251,-32690,2243,-32691,2235,-32691,2226,-32692,2218,-32692,2209,-32693,2201,-32693,2193,-32694,2184,-32695,2176,-32695,2168,-32696,2159,-32696,2151,-32697,2143,-32697,2134,-32698,2126,-32698,2117,-32699,2109,-32700,2101,-32700,2092,-32701,2084,-32701,2076,-32702,2067,-32702,2059,-32703,2051,-32703,2042,-32704,2034,-32704,2026,-32705,2017,-32705,2009,-32706,2000,-32706,1992,-32707,1984,-32707,1975,-32708,1967,-32708,1959,-32709,1950,-32709,1942,-32710,1934,-32710,1925,-32711,1917,-32711,1908,-32712,1900,-32712,1892,-32713,1883,-32713,1875,-32714,1867,-32714,1858,-32715,1850,-32715,1842,-32716,1833,-32716,1825,-32717,1816,-32717,1808,-32718,1800,-32718,1791,-32718,1783,-32719,1775,-32719,1766,-32720,1758,-32720,1750,-32721,1741,-32721,1733,-32722,1724,-32722,1716,-32723,1708,-32723,1699,-32723,1691,-32724,1683,-32724,1674,-32725,1666,-32725,1658,-32726,1649,-32726,1641,-32726,1632,-32727,1624,-32727,1616,-32728,1607,-32728,1599,-32728,1591,-32729,1582,-32729,1574,-32730,1565,-32730,1557,-32730,1549,-32731,1540,-32731,1532,-32732,1524,-32732,1515,-32732,1507,-32733,1499,-32733,1490,-32734,1482,-32734,1473,-32734,1465,-32735,1457,-32735,1448,-32735,1440,-32736,1432,-32736,1423,-32737,1415,-32737,1406,-32737,1398,-32738,1390,-32738,1381,-32738,1373,-32739,1365,-32739,1356,-32739,1348,-32740,1339,-32740,1331,-32740,1323,-32741,1314,-32741,1306,-32741,1298,-32742,1289,-32742,1281,-32742,1273,-32743,1264,-32743,1256,-32743,1247,-32744,1239,-32744,1231,-32744,1222,-32745,1214,-32745,1206,-32745,1197,-32746,1189,-32746,1180,-32746,1172,-32747,1164,-32747,1155,-32747,1147,-32747,1139,-32748,1130,-32748,1122,-32748,1113,-32749,1105,-32749,1097,-32749,1088,-32749,1080,-32750,1072,-32750,1063,-32750,1055,-32751,1046,-32751,1038,-32751,1030,-32751,1021,-32752,1013,-32752,1005,-32752,996,-32752,988,-32753,980,-32753,971,-32753,963,-32753,954,-32754,946,-32754,938,-32754,929,-32754,921,-32755,913,-32755,904,-32755,896,-32755,887,-32755,879,-32756,871,-32756,862,-32756,854,-32756,846,-32757,837,-32757,829,-32757,820,-32757,812,-32757,804,-32758,795,-32758,787,-32758,779,-32758,770,-32758,762,-32759,753,-32759,745,-32759,737,-32759,728,-32759,720,-32760,712,-32760,703,-32760,695,-32760,686,-32760,678,-32760,670,-32761,661,-32761,653,-32761,645,-32761,636,-32761,628,-32761,619,-32762,611,-32762,603,-32762,594,-32762,586,-32762,578,-32762,569,-32763,561,-32763,552,-32763,544,-32763,536,-32763,527,-32763,519,-32763,510,-32764,502,-32764,494,-32764,485,-32764,477,-32764,469,-32764,460,-32764,452,-32764,443,-32764,435,-32765,427,-32765,418,-32765,410,-32765,402,-32765,393,-32765,385,-32765,376,-32765,368,-32765,360,-32766,351,-32766,343,-32766,335,-32766,326,-32766,318,-32766,309,-32766,301,-32766,293,-32766,284,-32766,276,-32766,268,-32766,259,-32766,251,-32767,242,-32767,234,-32767,226,-32767,217,-32767,209,-32767,201,-32767,192,-32767,184,-32767,175,-32767,167,-32767,159,-32767,150,-32767,142,-32767,134,-32767,125,-32767,117,-32767,108,-32767,100,-32767,92,-32767,83,-32767,75,-32767,67,-32767,58,-32767,50,-32767,41,-32767,33,-32767,25,-32767,16,-32767,8,-32767,0,-32767,-9,-32767,-17,-32767,-26,-32767,-34,-32767,-42,-32767,-51,-32767,-59,-32767,-68,-32767,-76,-32767,-84,-32767,-93,-32767,-101,-32767,-109,-32767,-118,-32767,-126,-32767,-135,-32767,-143,-32767,-151,-32767,-160,-32767,-168,-32767,-176,-32767,-185,-32767,-193,-32767,-202,-32767,-210,-32767,-218,-32767,-227,-32767,-235,-32767,-243,-32767,-252,-32767,-260,-32766,-269,-32766,-277,-32766,-285,-32766,-294,-32766,-302,-32766,-310,-32766,-319,-32766,-327,-32766,-336,-32766,-344,-32766,-352,-32766,-361,-32766,-369,-32765,-377,-32765,-386,-32765,-394,-32765,-403,-32765,-411,-32765,-419,-32765,-428,-32765,-436,-32765,-444,-32764,-453,-32764,-461,-32764,-470,-32764,-478,-32764,-486,-32764,-495,-32764,-503,-32764,-511,-32764,-520,-32763,-528,-32763,-537,-32763,-545,-32763,-553,-32763,-562,-32763,-570,-32763,-579,-32762,-587,-32762,-595,-32762,-604,-32762,-612,-32762,-620,-32762,-629,-32761,-637,-32761,-646,-32761,-654,-32761,-662,-32761,-671,-32761,-679,-32760,-687,-32760,-696,-32760,-704,-32760,-713,-32760,-721,-32760,-729,-32759,-738,-32759,-746,-32759,-754,-32759,-763,-32759,-771,-32758,-780,-32758,-788,-32758,-796,-32758,-805,-32758,-813,-32757,-821,-32757,-830,-32757,-838,-32757,-847,-32757,-855,-32756,-863,-32756,-872,-32756,-880,-32756,-888,-32755,-897,-32755,-905,-32755,-914,-32755,-922,-32755,-930,-32754,-939,-32754,-947,-32754,-955,-32754,-964,-32753,-972,-32753,-981,-32753,-989,-32753,-997,-32752,-1006,-32752,-1014,-32752,-1022,-32752,-1031,-32751,-1039,-32751,-1047,-32751,-1056,-32751,-1064,-32750,-1073,-32750,-1081,-32750,-1089,-32749,-1098,-32749,-1106,-32749,-1114,-32749,-1123,-32748,-1131,-32748,-1140,-32748,-1148,-32747,-1156,-32747,-1165,-32747,-1173,-32747,-1181,-32746,-1190,-32746,-1198,-32746,-1207,-32745,-1215,-32745,-1223,-32745,-1232,-32744,-1240,-32744,-1248,-32744,-1257,-32743,-1265,-32743,-1274,-32743,-1282,-32742,-1290,-32742,-1299,-32742,-1307,-32741,-1315,-32741,-1324,-32741,-1332,-32740,-1340,-32740,-1349,-32740,-1357,-32739,-1366,-32739,-1374,-32739,-1382,-32738,-1391,-32738,-1399,-32738,-1407,-32737,-1416,-32737,-1424,-32737,-1433,-32736,-1441,-32736,-1449,-32735,-1458,-32735,-1466,-32735,-1474,-32734,-1483,-32734,-1491,-32734,-1500,-32733,-1508,-32733,-1516,-32732,-1525,-32732,-1533,-32732,-1541,-32731,-1550,-32731,-1558,-32730,-1566,-32730,-1575,-32730,-1583,-32729,-1592,-32729,-1600,-32728,-1608,-32728,-1617,-32728,-1625,-32727,-1633,-32727,-1642,-32726,-1650,-32726,-1659,-32726,-1667,-32725,-1675,-32725,-1684,-32724,-1692,-32724,-1700,-32723,-1709,-32723,-1717,-32723,-1725,-32722,-1734,-32722,-1742,-32721,-1751,-32721,-1759,-32720,-1767,-32720,-1776,-32719,-1784,-32719,-1792,-32718,-1801,-32718,-1809,-32718,-1817,-32717,-1826,-32717,-1834,-32716,-1843,-32716,-1851,-32715,-1859,-32715,-1868,-32714,-1876,-32714,-1884,-32713,-1893,-32713,-1901,-32712,-1909,-32712,-1918,-32711,-1926,-32711,-1935,-32710,-1943,-32710,-1951,-32709,-1960,-32709,-1968,-32708,-1976,-32708,-1985,-32707,-1993,-32707,-2001,-32706,-2010,-32706,-2018,-32705,-2027,-32705,-2035,-32704,-2043,-32704,-2052,-32703,-2060,-32703,-2068,-32702,-2077,-32702,-2085,-32701,-2093,-32701,-2102,-32700,-2110,-32700,-2118,-32699,-2127,-32698,-2135,-32698,-2144,-32697,-2152,-32697,-2160,-32696,-2169,-32696,-2177,-32695,-2185,-32695,-2194,-32694,-2202,-32693,-2210,-32693,-2219,-32692,-2227,-32692,-2236,-32691,-2244,-32691,-2252,-32690,-2261,-32689,-2269,-32689,-2277,-32688,-2286,-32688,-2294,-32687,-2302,-32687,-2311,-32686,-2319,-32685,-2327,-32685,-2336,-32684,-2344,-32684,-2353,-32683,-2361,-32682,-2369,-32682,-2378,-32681,-2386,-32681,-2394,-32680,-2403,-32679,-2411,-32679,-2419,-32678,-2428,-32677,-2436,-32677,-2444,-32676,-2453,-32676,-2461,-32675,-2469,-32674,-2478,-32674,-2486,-32673,-2495,-32672,-2503,-32672,-2511,-32671,-2520,-32671,-2528,-32670,-2536,-32669,-2545,-32669,-2553,-32668,-2561,-32667,-2570,-32667,-2578,-32666,-2586,-32665,-2595,-32665,-2603,-32664,-2611,-32663,-2620,-32663,-2628,-32662,-2637,-32661,-2645,-32661,-2653,-32660,-2662,-32659,-2670,-32659,-2678,-32658,-2687,-32657,-2695,-32657,-2703,-32656,-2712,-32655,-2720,-32654,-2728,-32654,-2737,-32653,-2745,-32652,-2753,-32652,-2762,-32651,-2770,-32650,-2778,-32650,-2787,-32649,-2795,-32648,-2803,-32647,-2812,-32647,-2820,-32646,-2829,-32645,-2837,-32645,-2845,-32644,-2854,-32643,-2862,-32642,-2870,-32642,-2879,-32641,-2887,-32640,-2895,-32639,-2904,-32639,-2912,-32638,-2920,-32637,-2929,-32636,-2937,-32636,-2945,-32635,-2954,-32634,-2962,-32633,-2970,-32633,-2979,-32632,-2987,-32631,-2995,-32630,-3004,-32630,-3012,-32629,-3020,-32628,-3029,-32627,-3037,-32626,-3045,-32626,-3054,-32625,-3062,-32624,-3070,-32623,-3079,-32623,-3087,-32622,-3095,-32621,-3104,-32620,-3112,-32619,-3121,-32619,-3129,-32618,-3137,-32617,-3146,-32616,-3154,-32615,-3162,-32615,-3171,-32614,-3179,-32613,-3187,-32612,-3196,-32611,-3204,-32611,-3212,-32610,-3221,-32609,-3229,-32608,-3237,-32607,-3246,-32606,-3254,-32606,-3262,-32605,-3271,-32604,-3279,-32603,-3287,-32602,-3296,-32601,-3304,-32601,-3312,-32600,-3321,-32599,-3329,-32598,-3337,-32597,-3346,-32596,-3354,-32595,-3362,-32595,-3371,-32594,-3379,-32593,-3387,-32592,-3396,-32591,-3404,-32590,-3412,-32589,-3421,-32589,-3429,-32588,-3437,-32587,-3446,-32586,-3454,-32585,-3462,-32584,-3471,-32583,-3479,-32582,-3487,-32581,-3496,-32581,-3504,-32580,-3512,-32579,-3521,-32578,-3529,-32577,-3537,-32576,-3546,-32575,-3554,-32574,-3562,-32573,-3571,-32572,-3579,-32572,-3587,-32571,-3595,-32570,-3604,-32569,-3612,-32568,-3620,-32567,-3629,-32566,-3637,-32565,-3645,-32564,-3654,-32563,-3662,-32562,-3670,-32561,-3679,-32560,-3687,-32559,-3695,-32559,-3704,-32558,-3712,-32557,-3720,-32556,-3729,-32555,-3737,-32554,-3745,-32553,-3754,-32552,-3762,-32551,-3770,-32550,-3779,-32549,-3787,-32548,-3795,-32547,-3804,-32546,-3812,-32545,-3820,-32544,-3829,-32543,-3837,-32542,-3845,-32541,-3854,-32540,-3862,-32539,-3870,-32538,-3878,-32537,-3887,-32536,-3895,-32535,-3903,-32534,-3912,-32533,-3920,-32532,-3928,-32531,-3937,-32530,-3945,-32529,-3953,-32528,-3962,-32527,-3970,-32526,-3978,-32525,-3987,-32524,-3995,-32523,-4003,-32522,-4012,-32521,-4020,-32520,-4028,-32519,-4036,-32518,-4045,-32517,-4053,-32516,-4061,-32515,-4070,-32514,-4078,-32513,-4086,-32512,-4095,-32511,-4103,-32510,-4111,-32509,-4120,-32508,-4128,-32507,-4136,-32505,-4145,-32504,-4153,-32503,-4161,-32502,-4169,-32501,-4178,-32500,-4186,-32499,-4194,-32498,-4203,-32497,-4211,-32496,-4219,-32495,-4228,-32494,-4236,-32493,-4244,-32492,-4253,-32490,-4261,-32489,-4269,-32488,-4277,-32487,-4286,-32486,-4294,-32485,-4302,-32484,-4311,-32483,-4319,-32482,-4327,-32481,-4336,-32479,-4344,-32478,-4352,-32477,-4360,-32476,-4369,-32475,-4377,-32474,-4385,-32473,-4394,-32472,-4402,-32471,-4410,-32469,-4419,-32468,-4427,-32467,-4435,-32466,-4444,-32465,-4452,-32464,-4460,-32463,-4468,-32461,-4477,-32460,-4485,-32459,-4493,-32458,-4502,-32457,-4510,-32456,-4518,-32455,-4526,-32453,-4535,-32452,-4543,-32451,-4551,-32450,-4560,-32449,-4568,-32448,-4576,-32446,-4585,-32445,-4593,-32444,-4601,-32443,-4609,-32442,-4618,-32441,-4626,-32439,-4634,-32438,-4643,-32437,-4651,-32436,-4659,-32435,-4667,-32433,-4676,-32432,-4684,-32431,-4692,-32430,-4701,-32429,-4709,-32427,-4717,-32426,-4726,-32425,-4734,-32424,-4742,-32423,-4750,-32421,-4759,-32420,-4767,-32419,-4775,-32418,-4784,-32417,-4792,-32415,-4800,-32414,-4808,-32413,-4817,-32412,-4825,-32410,-4833,-32409,-4842,-32408,-4850,-32407,-4858,-32405,-4866,-32404,-4875,-32403,-4883,-32402,-4891,-32400,-4900,-32399,-4908,-32398,-4916,-32397,-4924,-32395,-4933,-32394,-4941,-32393,-4949,-32392,-4958,-32390,-4966,-32389,-4974,-32388,-4982,-32387,-4991,-32385,-4999,-32384,-5007,-32383,-5015,-32381,-5024,-32380,-5032,-32379,-5040,-32378,-5049,-32376,-5057,-32375,-5065,-32374,-5073,-32372,-5082,-32371,-5090,-32370,-5098,-32369,-5107,-32367,-5115,-32366,-5123,-32365,-5131,-32363,-5140,-32362,-5148,-32361,-5156,-32359,-5164,-32358,-5173,-32357,-5181,-32355,-5189,-32354,-5198,-32353,-5206,-32351,-5214,-32350,-5222,-32349,-5231,-32347,-5239,-32346,-5247,-32345,-5255,-32343,-5264,-32342,-5272,-32341,-5280,-32339,-5288,-32338,-5297,-32337,-5305,-32335,-5313,-32334,-5322,-32333,-5330,-32331,-5338,-32330,-5346,-32328,-5355,-32327,-5363,-32326,-5371,-32324,-5379,-32323,-5388,-32322,-5396,-32320,-5404,-32319,-5412,-32317,-5421,-32316,-5429,-32315,-5437,-32313,-5446,-32312,-5454,-32311,-5462,-32309,-5470,-32308,-5479,-32306,-5487,-32305,-5495,-32304,-5503,-32302,-5512,-32301,-5520,-32299,-5528,-32298,-5536,-32296,-5545,-32295,-5553,-32294,-5561,-32292,-5569,-32291,-5578,-32289,-5586,-32288,-5594,-32287,-5602,-32285,-5611,-32284,-5619,-32282,-5627,-32281,-5635,-32279,-5644,-32278,-5652,-32276,-5660,-32275,-5668,-32274,-5677,-32272,-5685,-32271,-5693,-32269,-5701,-32268,-5710,-32266,-5718,-32265,-5726,-32263,-5734,-32262,-5743,-32260,-5751,-32259,-5759,-32257,-5767,-32256,-5776,-32255,-5784,-32253,-5792,-32252,-5800,-32250,-5809,-32249,-5817,-32247,-5825,-32246,-5833,-32244,-5842,-32243,-5850,-32241,-5858,-32240,-5866,-32238,-5875,-32237,-5883,-32235,-5891,-32234,-5899,-32232,-5908,-32231,-5916,-32229,-5924,-32228,-5932,-32226,-5941,-32225,-5949,-32223,-5957,-32222,-5965,-32220,-5973,-32219,-5982,-32217,-5990,-32215,-5998,-32214,-6006,-32212,-6015,-32211,-6023,-32209,-6031,-32208,-6039,-32206,-6048,-32205,-6056,-32203,-6064,-32202,-6072,-32200,-6081,-32198,-6089,-32197,-6097,-32195,-6105,-32194,-6113,-32192,-6122,-32191,-6130,-32189,-6138,-32188,-6146,-32186,-6155,-32184,-6163,-32183,-6171,-32181,-6179,-32180,-6187,-32178,-6196,-32177,-6204,-32175,-6212,-32173,-6220,-32172,-6229,-32170,-6237,-32169,-6245,-32167,-6253,-32165,-6262,-32164,-6270,-32162,-6278,-32161,-6286,-32159,-6294,-32157,-6303,-32156,-6311,-32154,-6319,-32153,-6327,-32151,-6335,-32149,-6344,-32148,-6352,-32146,-6360,-32144,-6368,-32143,-6377,-32141,-6385,-32140,-6393,-32138,-6401,-32136,-6409,-32135,-6418,-32133,-6426,-32131,-6434,-32130,-6442,-32128,-6451,-32126,-6459,-32125,-6467,-32123,-6475,-32121,-6483,-32120,-6492,-32118,-6500,-32116,-6508,-32115,-6516,-32113,-6524,-32111,-6533,-32110,-6541,-32108,-6549,-32106,-6557,-32105,-6565,-32103,-6574,-32101,-6582,-32100,-6590,-32098,-6598,-32096,-6607,-32095,-6615,-32093,-6623,-32091,-6631,-32090,-6639,-32088,-6648,-32086,-6656,-32085,-6664,-32083,-6672,-32081,-6680,-32079,-6689,-32078,-6697,-32076,-6705,-32074,-6713,-32073,-6721,-32071,-6730,-32069,-6738,-32067,-6746,-32066,-6754,-32064,-6762,-32062,-6771,-32060,-6779,-32059,-6787,-32057,-6795,-32055,-6803,-32054,-6812,-32052,-6820,-32050,-6828,-32048,-6836,-32047,-6844,-32045,-6852,-32043,-6861,-32041,-6869,-32040,-6877,-32038,-6885,-32036,-6893,-32034,-6902,-32033,-6910,-32031,-6918,-32029,-6926,-32027,-6934,-32025,-6943,-32024,-6951,-32022,-6959,-32020,-6967,-32018,-6975,-32017,-6983,-32015,-6992,-32013,-7000,-32011,-7008,-32009,-7016,-32008,-7024,-32006,-7033,-32004,-7041,-32002,-7049,-32000,-7057,-31999,-7065,-31997,-7073,-31995,-7082,-31993,-7090,-31991,-7098,-31990,-7106,-31988,-7114,-31986,-7123,-31984,-7131,-31982,-7139,-31980,-7147,-31979,-7155,-31977,-7163,-31975,-7172,-31973,-7180,-31971,-7188,-31969,-7196,-31968,-7204,-31966,-7212,-31964,-7221,-31962,-7229,-31960,-7237,-31958,-7245,-31957,-7253,-31955,-7262,-31953,-7270,-31951,-7278,-31949,-7286,-31947,-7294,-31945,-7302,-31944,-7311,-31942,-7319,-31940,-7327,-31938,-7335,-31936,-7343,-31934,-7351,-31932,-7359,-31930,-7368,-31929,-7376,-31927,-7384,-31925,-7392,-31923,-7400,-31921,-7408,-31919,-7417,-31917,-7425,-31915,-7433,-31913,-7441,-31912,-7449,-31910,-7457,-31908,-7466,-31906,-7474,-31904,-7482,-31902,-7490,-31900,-7498,-31898,-7506,-31896,-7515,-31894,-7523,-31892,-7531,-31890,-7539,-31889,-7547,-31887,-7555,-31885,-7563,-31883,-7572,-31881,-7580,-31879,-7588,-31877,-7596,-31875,-7604,-31873,-7612,-31871,-7620,-31869,-7629,-31867,-7637,-31865,-7645,-31863,-7653,-31861,-7661,-31859,-7669,-31857,-7677,-31855,-7686,-31854,-7694,-31852,-7702,-31850,-7710,-31848,-7718,-31846,-7726,-31844,-7734,-31842,-7743,-31840,-7751,-31838,-7759,-31836,-7767,-31834,-7775,-31832,-7783,-31830,-7791,-31828,-7800,-31826,-7808,-31824,-7816,-31822,-7824,-31820,-7832,-31818,-7840,-31816,-7848,-31814,-7857,-31812,-7865,-31810,-7873,-31808,-7881,-31806,-7889,-31804,-7897,-31802,-7905,-31800,-7913,-31798,-7922,-31796,-7930,-31794,-7938,-31792,-7946,-31790,-7954,-31788,-7962,-31786,-7970,-31783,-7978,-31781,-7987,-31779,-7995,-31777,-8003,-31775,-8011,-31773,-8019,-31771,-8027,-31769,-8035,-31767,-8043,-31765,-8052,-31763,-8060,-31761,-8068,-31759,-8076,-31757,-8084,-31755,-8092,-31753,-8100,-31751,-8108,-31749,-8117,-31746,-8125,-31744,-8133,-31742,-8141,-31740,-8149,-31738,-8157,-31736,-8165,-31734,-8173,-31732,-8181,-31730,-8190,-31728,-8198,-31726,-8206,-31724,-8214,-31721,-8222,-31719,-8230,-31717,-8238,-31715,-8246,-31713,-8254,-31711,-8263,-31709,-8271,-31707,-8279,-31705,-8287,-31702,-8295,-31700,-8303,-31698,-8311,-31696,-8319,-31694,-8327,-31692,-8335,-31690,-8344,-31688,-8352,-31685,-8360,-31683,-8368,-31681,-8376,-31679,-8384,-31677,-8392,-31675,-8400,-31673,-8408,-31670,-8416,-31668,-8425,-31666,-8433,-31664,-8441,-31662,-8449,-31660,-8457,-31657,-8465,-31655,-8473,-31653,-8481,-31651,-8489,-31649,-8497,-31647,-8505,-31644,-8514,-31642,-8522,-31640,-8530,-31638,-8538,-31636,-8546,-31634,-8554,-31631,-8562,-31629,-8570,-31627,-8578,-31625,-8586,-31623,-8594,-31620,-8603,-31618,-8611,-31616,-8619,-31614,-8627,-31612,-8635,-31609,-8643,-31607,-8651,-31605,-8659,-31603,-8667,-31601,-8675,-31598,-8683,-31596,-8691,-31594,-8700,-31592,-8708,-31589,-8716,-31587,-8724,-31585,-8732,-31583,-8740,-31581,-8748,-31578,-8756,-31576,-8764,-31574,-8772,-31572,-8780,-31569,-8788,-31567,-8796,-31565,-8804,-31563,-8813,-31560,-8821,-31558,-8829,-31556,-8837,-31554,-8845,-31551,-8853,-31549,-8861,-31547,-8869,-31545,-8877,-31542,-8885,-31540,-8893,-31538,-8901,-31535,-8909,-31533,-8917,-31531,-8925,-31529,-8933,-31526,-8942,-31524,-8950,-31522,-8958,-31519,-8966,-31517,-8974,-31515,-8982,-31513,-8990,-31510,-8998,-31508,-9006,-31506,-9014,-31503,-9022,-31501,-9030,-31499,-9038,-31496,-9046,-31494,-9054,-31492,-9062,-31490,-9070,-31487,-9078,-31485,-9087,-31483,-9095,-31480,-9103,-31478,-9111,-31476,-9119,-31473,-9127,-31471,-9135,-31469,-9143,-31466,-9151,-31464,-9159,-31462,-9167,-31459,-9175,-31457,-9183,-31455,-9191,-31452,-9199,-31450,-9207,-31447,-9215,-31445,-9223,-31443,-9231,-31440,-9239,-31438,-9247,-31436,-9255,-31433,-9263,-31431,-9271,-31429,-9280,-31426,-9288,-31424,-9296,-31421,-9304,-31419,-9312,-31417,-9320,-31414,-9328,-31412,-9336,-31410,-9344,-31407,-9352,-31405,-9360,-31402,-9368,-31400,-9376,-31398,-9384,-31395,-9392,-31393,-9400,-31390,-9408,-31388,-9416,-31386,-9424,-31383,-9432,-31381,-9440,-31378,-9448,-31376,-9456,-31374,-9464,-31371,-9472,-31369,-9480,-31366,-9488,-31364,-9496,-31361,-9504,-31359,-9512,-31357,-9520,-31354,-9528,-31352,-9536,-31349,-9544,-31347,-9552,-31344,-9560,-31342,-9568,-31339,-9576,-31337,-9584,-31335,-9592,-31332,-9600,-31330,-9608,-31327,-9616,-31325,-9624,-31322,-9632,-31320,-9640,-31317,-9648,-31315,-9656,-31312,-9664,-31310,-9672,-31308,-9680,-31305,-9688,-31303,-9696,-31300,-9704,-31298,-9712,-31295,-9720,-31293,-9728,-31290,-9736,-31288,-9744,-31285,-9752,-31283,-9760,-31280,-9768,-31278,-9776,-31275,-9784,-31273,-9792,-31270,-9800,-31268,-9808,-31265,-9816,-31263,-9824,-31260,-9832,-31258,-9840,-31255,-9848,-31253,-9856,-31250,-9864,-31248,-9872,-31245,-9880,-31243,-9888,-31240,-9896,-31237,-9904,-31235,-9912,-31232,-9920,-31230,-9928,-31227,-9936,-31225,-9944,-31222,-9952,-31220,-9960,-31217,-9968,-31215,-9976,-31212,-9984,-31210,-9992,-31207,-10000,-31204,-10008,-31202,-10016,-31199,-10024,-31197,-10032,-31194,-10040,-31192,-10048,-31189,-10056,-31186,-10064,-31184,-10072,-31181,-10080,-31179,-10088,-31176,-10096,-31174,-10104,-31171,-10112,-31168,-10120,-31166,-10128,-31163,-10136,-31161,-10144,-31158,-10152,-31155,-10160,-31153,-10167,-31150,-10175,-31148,-10183,-31145,-10191,-31142,-10199,-31140,-10207,-31137,-10215,-31135,-10223,-31132,-10231,-31129,-10239,-31127,-10247,-31124,-10255,-31122,-10263,-31119,-10271,-31116,-10279,-31114,-10287,-31111,-10295,-31108,-10303,-31106,-10311,-31103,-10319,-31101,-10327,-31098,-10335,-31095,-10343,-31093,-10350,-31090,-10358,-31087,-10366,-31085,-10374,-31082,-10382,-31079,-10390,-31077,-10398,-31074,-10406,-31071,-10414,-31069,-10422,-31066,-10430,-31063,-10438,-31061,-10446,-31058,-10454,-31055,-10462,-31053,-10470,-31050,-10478,-31047,-10485,-31045,-10493,-31042,-10501,-31039,-10509,-31037,-10517,-31034,-10525,-31031,-10533,-31029,-10541,-31026,-10549,-31023,-10557,-31020,-10565,-31018,-10573,-31015,-10581,-31012,-10589,-31010,-10597,-31007,-10604,-31004,-10612,-31002,-10620,-30999,-10628,-30996,-10636,-30993,-10644,-30991,-10652,-30988,-10660,-30985,-10668,-30982,-10676,-30980,-10684,-30977,-10692,-30974,-10700,-30972,-10707,-30969,-10715,-30966,-10723,-30963,-10731,-30961,-10739,-30958,-10747,-30955,-10755,-30952,-10763,-30950,-10771,-30947,-10779,-30944,-10787,-30941,-10795,-30939,-10802,-30936,-10810,-30933,-10818,-30930,-10826,-30928,-10834,-30925,-10842,-30922,-10850,-30919,-10858,-30916,-10866,-30914,-10874,-30911,-10881,-30908,-10889,-30905,-10897,-30903,-10905,-30900,-10913,-30897,-10921,-30894,-10929,-30891,-10937,-30889,-10945,-30886,-10953,-30883,-10960,-30880,-10968,-30877,-10976,-30875,-10984,-30872,-10992,-30869,-11000,-30866,-11008,-30863,-11016,-30861,-11024,-30858,-11031,-30855,-11039,-30852,-11047,-30849,-11055,-30846,-11063,-30844,-11071,-30841,-11079,-30838,-11087,-30835,-11095,-30832,-11102,-30829,-11110,-30827,-11118,-30824,-11126,-30821,-11134,-30818,-11142,-30815,-11150,-30812,-11158,-30810,-11165,-30807,-11173,-30804,-11181,-30801,-11189,-30798,-11197,-30795,-11205,-30792,-11213,-30789,-11221,-30787,-11228,-30784,-11236,-30781,-11244,-30778,-11252,-30775,-11260,-30772,-11268,-30769,-11276,-30767,-11284,-30764,-11291,-30761,-11299,-30758,-11307,-30755,-11315,-30752,-11323,-30749,-11331,-30746,-11339,-30743,-11346,-30740,-11354,-30738,-11362,-30735,-11370,-30732,-11378,-30729,-11386,-30726,-11394,-30723,-11401,-30720,-11409,-30717,-11417,-30714,-11425,-30711,-11433,-30708,-11441,-30706,-11449,-30703,-11456,-30700,-11464,-30697,-11472,-30694,-11480,-30691,-11488,-30688,-11496,-30685,-11503,-30682,-11511,-30679,-11519,-30676,-11527,-30673,-11535,-30670,-11543,-30667,-11551,-30664,-11558,-30661,-11566,-30658,-11574,-30656,-11582,-30653,-11590,-30650,-11598,-30647,-11605,-30644,-11613,-30641,-11621,-30638,-11629,-30635,-11637,-30632,-11645,-30629,-11652,-30626,-11660,-30623,-11668,-30620,-11676,-30617,-11684,-30614,-11692,-30611,-11699,-30608,-11707,-30605,-11715,-30602,-11723,-30599,-11731,-30596,-11738,-30593,-11746,-30590,-11754,-30587,-11762,-30584,-11770,-30581,-11778,-30578,-11785,-30575,-11793,-30572,-11801,-30569,-11809,-30566,-11817,-30563,-11824,-30560,-11832,-30557,-11840,-30554,-11848,-30551,-11856,-30548,-11863,-30545,-11871,-30542,-11879,-30539,-11887,-30536,-11895,-30533,-11903,-30529,-11910,-30526,-11918,-30523,-11926,-30520,-11934,-30517,-11942,-30514,-11949,-30511,-11957,-30508,-11965,-30505,-11973,-30502,-11981,-30499,-11988,-30496,-11996,-30493,-12004,-30490,-12012,-30487,-12020,-30484,-12027,-30481,-12035,-30477,-12043,-30474,-12051,-30471,-12058,-30468,-12066,-30465,-12074,-30462,-12082,-30459,-12090,-30456,-12097,-30453,-12105,-30450,-12113,-30447,-12121,-30443,-12129,-30440,-12136,-30437,-12144,-30434,-12152,-30431,-12160,-30428,-12167,-30425,-12175,-30422,-12183,-30419,-12191,-30416,-12199,-30412,-12206,-30409,-12214,-30406,-12222,-30403,-12230,-30400,-12237,-30397,-12245,-30394,-12253,-30391,-12261,-30387,-12269,-30384,-12276,-30381,-12284,-30378,-12292,-30375,-12300,-30372,-12307,-30369,-12315,-30365,-12323,-30362,-12331,-30359,-12338,-30356,-12346,-30353,-12354,-30350,-12362,-30346,-12369,-30343,-12377,-30340,-12385,-30337,-12393,-30334,-12400,-30331,-12408,-30327,-12416,-30324,-12424,-30321,-12431,-30318,-12439,-30315,-12447,-30312,-12455,-30308,-12462,-30305,-12470,-30302,-12478,-30299,-12486,-30296,-12493,-30292,-12501,-30289,-12509,-30286,-12517,-30283,-12524,-30280,-12532,-30276,-12540,-30273,-12548,-30270,-12555,-30267,-12563,-30264,-12571,-30260,-12579,-30257,-12586,-30254,-12594,-30251,-12602,-30248,-12610,-30244,-12617,-30241,-12625,-30238,-12633,-30235,-12640,-30231,-12648,-30228,-12656,-30225,-12664,-30222,-12671,-30218,-12679,-30215,-12687,-30212,-12695,-30209,-12702,-30206,-12710,-30202,-12718,-30199,-12725,-30196,-12733,-30192,-12741,-30189,-12749,-30186,-12756,-30183,-12764,-30179,-12772,-30176,-12779,-30173,-12787,-30170,-12795,-30166,-12803,-30163,-12810,-30160,-12818,-30157,-12826,-30153,-12833,-30150,-12841,-30147,-12849,-30143,-12857,-30140,-12864,-30137,-12872,-30134,-12880,-30130,-12887,-30127,-12895,-30124,-12903,-30120,-12910,-30117,-12918,-30114,-12926,-30110,-12934,-30107,-12941,-30104,-12949,-30101,-12957,-30097,-12964,-30094,-12972,-30091,-12980,-30087,-12987,-30084,-12995,-30081,-13003,-30077,-13010,-30074,-13018,-30071,-13026,-30067,-13034,-30064,-13041,-30061,-13049,-30057,-13057,-30054,-13064,-30051,-13072,-30047,-13080,-30044,-13087,-30041,-13095,-30037,-13103,-30034,-13110,-30031,-13118,-30027,-13126,-30024,-13133,-30021,-13141,-30017,-13149,-30014,-13156,-30010,-13164,-30007,-13172,-30004,-13179,-30000,-13187,-29997,-13195,-29994,-13202,-29990,-13210,-29987,-13218,-29984,-13225,-29980,-13233,-29977,-13241,-29973,-13248,-29970,-13256,-29967,-13264,-29963,-13271,-29960,-13279,-29956,-13287,-29953,-13294,-29950,-13302,-29946,-13310,-29943,-13317,-29939,-13325,-29936,-13333,-29933,-13340,-29929,-13348,-29926,-13356,-29922,-13363,-29919,-13371,-29916,-13379,-29912,-13386,-29909,-13394,-29905,-13401,-29902,-13409,-29898,-13417,-29895,-13424,-29892,-13432,-29888,-13440,-29885,-13447,-29881,-13455,-29878,-13463,-29874,-13470,-29871,-13478,-29867,-13486,-29864,-13493,-29861,-13501,-29857,-13508,-29854,-13516,-29850,-13524,-29847,-13531,-29843,-13539,-29840,-13547,-29836,-13554,-29833,-13562,-29829,-13569,-29826,-13577,-29823,-13585,-29819,-13592,-29816,-13600,-29812,-13608,-29809,-13615,-29805,-13623,-29802,-13630,-29798,-13638,-29795,-13646,-29791,-13653,-29788,-13661,-29784,-13668,-29781,-13676,-29777,-13684,-29774,-13691,-29770,-13699,-29767,-13707,-29763,-13714,-29760,-13722,-29756,-13729,-29753,-13737,-29749,-13745,-29746,-13752,-29742,-13760,-29739,-13767,-29735,-13775,-29732,-13783,-29728,-13790,-29725,-13798,-29721,-13805,-29718,-13813,-29714,-13821,-29710,-13828,-29707,-13836,-29703,-13843,-29700,-13851,-29696,-13859,-29693,-13866,-29689,-13874,-29686,-13881,-29682,-13889,-29679,-13896,-29675,-13904,-29671,-13912,-29668,-13919,-29664,-13927,-29661,-13934,-29657,-13942,-29654,-13950,-29650,-13957,-29647,-13965,-29643,-13972,-29639,-13980,-29636,-13987,-29632,-13995,-29629,-14003,-29625,-14010,-29622,-14018,-29618,-14025,-29614,-14033,-29611,-14040,-29607,-14048,-29604,-14056,-29600,-14063,-29596,-14071,-29593,-14078,-29589,-14086,-29586,-14093,-29582,-14101,-29578,-14109,-29575,-14116,-29571,-14124,-29568,-14131,-29564,-14139,-29560,-14146,-29557,-14154,-29553,-14161,-29549,-14169,-29546,-14177,-29542,-14184,-29539,-14192,-29535,-14199,-29531,-14207,-29528,-14214,-29524,-14222,-29520,-14229,-29517,-14237,-29513,-14245,-29510,-14252,-29506,-14260,-29502,-14267,-29499,-14275,-29495,-14282,-29491,-14290,-29488,-14297,-29484,-14305,-29480,-14312,-29477,-14320,-29473,-14327,-29469,-14335,-29466,-14343,-29462,-14350,-29458,-14358,-29455,-14365,-29451,-14373,-29447,-14380,-29444,-14388,-29440,-14395,-29436,-14403,-29433,-14410,-29429,-14418,-29425,-14425,-29422,-14433,-29418,-14440,-29414,-14448,-29411,-14455,-29407,-14463,-29403,-14470,-29399,-14478,-29396,-14485,-29392,-14493,-29388,-14500,-29385,-14508,-29381,-14516,-29377,-14523,-29373,-14531,-29370,-14538,-29366,-14546,-29362,-14553,-29359,-14561,-29355,-14568,-29351,-14576,-29347,-14583,-29344,-14591,-29340,-14598,-29336,-14606,-29333,-14613,-29329,-14621,-29325,-14628,-29321,-14636,-29318,-14643,-29314,-14651,-29310,-14658,-29306,-14666,-29303,-14673,-29299,-14681,-29295,-14688,-29291,-14695,-29288,-14703,-29284,-14710,-29280,-14718,-29276,-14725,-29273,-14733,-29269,-14740,-29265,-14748,-29261,-14755,-29257,-14763,-29254,-14770,-29250,-14778,-29246,-14785,-29242,-14793,-29239,-14800,-29235,-14808,-29231,-14815,-29227,-14823,-29223,-14830,-29220,-14838,-29216,-14845,-29212,-14853,-29208,-14860,-29204,-14867,-29201,-14875,-29197,-14882,-29193,-14890,-29189,-14897,-29185,-14905,-29182,-14912,-29178,-14920,-29174,-14927,-29170,-14935,-29166,-14942,-29163,-14950,-29159,-14957,-29155,-14964,-29151,-14972,-29147,-14979,-29143,-14987,-29140,-14994,-29136,-15002,-29132,-15009,-29128,-15017,-29124,-15024,-29120,-15031,-29117,-15039,-29113,-15046,-29109,-15054,-29105,-15061,-29101,-15069,-29097,-15076,-29093,-15084,-29090,-15091,-29086,-15098,-29082,-15106,-29078,-15113,-29074,-15121,-29070,-15128,-29066,-15136,-29063,-15143,-29059,-15150,-29055,-15158,-29051,-15165,-29047,-15173,-29043,-15180,-29039,-15188,-29035,-15195,-29032,-15202,-29028,-15210,-29024,-15217,-29020,-15225,-29016,-15232,-29012,-15239,-29008,-15247,-29004,-15254,-29000,-15262,-28997,-15269,-28993,-15277,-28989,-15284,-28985,-15291,-28981,-15299,-28977,-15306,-28973,-15314,-28969,-15321,-28965,-15328,-28961,-15336,-28957,-15343,-28954,-15351,-28950,-15358,-28946,-15365,-28942,-15373,-28938,-15380,-28934,-15388,-28930,-15395,-28926,-15402,-28922,-15410,-28918,-15417,-28914,-15425,-28910,-15432,-28906,-15439,-28902,-15447,-28898,-15454,-28894,-15462,-28891,-15469,-28887,-15476,-28883,-15484,-28879,-15491,-28875,-15498,-28871,-15506,-28867,-15513,-28863,-15521,-28859,-15528,-28855,-15535,-28851,-15543,-28847,-15550,-28843,-15557,-28839,-15565,-28835,-15572,-28831,-15580,-28827,-15587,-28823,-15594,-28819,-15602,-28815,-15609,-28811,-15616,-28807,-15624,-28803,-15631,-28799,-15639,-28795,-15646,-28791,-15653,-28787,-15661,-28783,-15668,-28779,-15675,-28775,-15683,-28771,-15690,-28767,-15697,-28763,-15705,-28759,-15712,-28755,-15719,-28751,-15727,-28747,-15734,-28743,-15741,-28739,-15749,-28735,-15756,-28731,-15764,-28727,-15771,-28723,-15778,-28719,-15786,-28715,-15793,-28711,-15800,-28707,-15808,-28703,-15815,-28699,-15822,-28695,-15830,-28691,-15837,-28686,-15844,-28682,-15852,-28678,-15859,-28674,-15866,-28670,-15874,-28666,-15881,-28662,-15888,-28658,-15896,-28654,-15903,-28650,-15910,-28646,-15918,-28642,-15925,-28638,-15932,-28634,-15939,-28630,-15947,-28626,-15954,-28621,-15961,-28617,-15969,-28613,-15976,-28609,-15983,-28605,-15991,-28601,-15998,-28597,-16005,-28593,-16013,-28589,-16020,-28585,-16027,-28581,-16035,-28576,-16042,-28572,-16049,-28568,-16056,-28564,-16064,-28560,-16071,-28556,-16078,-28552,-16086,-28548,-16093,-28544,-16100,-28539,-16108,-28535,-16115,-28531,-16122,-28527,-16129,-28523,-16137,-28519,-16144,-28515,-16151,-28511,-16159,-28507,-16166,-28502,-16173,-28498,-16180,-28494,-16188,-28490,-16195,-28486,-16202,-28482,-16210,-28478,-16217,-28473,-16224,-28469,-16231,-28465,-16239,-28461,-16246,-28457,-16253,-28453,-16261,-28448,-16268,-28444,-16275,-28440,-16282,-28436,-16290,-28432,-16297,-28428,-16304,-28424,-16311,-28419,-16319,-28415,-16326,-28411,-16333,-28407,-16340,-28403,-16348,-28398,-16355,-28394,-16362,-28390,-16369,-28386,-16377,-28382}; +int16_t twa24576[16384] __attribute__((aligned(32))) = {32767,0,32766,-9,32766,-17,32766,-26,32766,-34,32766,-42,32766,-51,32766,-59,32766,-68,32766,-76,32766,-84,32766,-93,32766,-101,32766,-109,32766,-118,32766,-126,32766,-135,32766,-143,32766,-151,32766,-160,32766,-168,32766,-176,32766,-185,32766,-193,32766,-202,32766,-210,32766,-218,32766,-227,32766,-235,32766,-243,32766,-252,32765,-260,32765,-269,32765,-277,32765,-285,32765,-294,32765,-302,32765,-310,32765,-319,32765,-327,32765,-336,32765,-344,32765,-352,32765,-361,32764,-369,32764,-377,32764,-386,32764,-394,32764,-403,32764,-411,32764,-419,32764,-428,32764,-436,32763,-444,32763,-453,32763,-461,32763,-470,32763,-478,32763,-486,32763,-495,32763,-503,32763,-511,32762,-520,32762,-528,32762,-537,32762,-545,32762,-553,32762,-562,32762,-570,32761,-579,32761,-587,32761,-595,32761,-604,32761,-612,32761,-620,32760,-629,32760,-637,32760,-646,32760,-654,32760,-662,32760,-671,32759,-679,32759,-687,32759,-696,32759,-704,32759,-713,32759,-721,32758,-729,32758,-738,32758,-746,32758,-754,32758,-763,32757,-771,32757,-780,32757,-788,32757,-796,32757,-805,32756,-813,32756,-821,32756,-830,32756,-838,32756,-847,32755,-855,32755,-863,32755,-872,32755,-880,32754,-888,32754,-897,32754,-905,32754,-914,32754,-922,32753,-930,32753,-939,32753,-947,32753,-955,32752,-964,32752,-972,32752,-981,32752,-989,32751,-997,32751,-1006,32751,-1014,32751,-1022,32750,-1031,32750,-1039,32750,-1047,32750,-1056,32749,-1064,32749,-1073,32749,-1081,32748,-1089,32748,-1098,32748,-1106,32748,-1114,32747,-1123,32747,-1131,32747,-1140,32746,-1148,32746,-1156,32746,-1165,32746,-1173,32745,-1181,32745,-1190,32745,-1198,32744,-1207,32744,-1215,32744,-1223,32743,-1232,32743,-1240,32743,-1248,32742,-1257,32742,-1265,32742,-1274,32741,-1282,32741,-1290,32741,-1299,32740,-1307,32740,-1315,32740,-1324,32739,-1332,32739,-1340,32739,-1349,32738,-1357,32738,-1366,32738,-1374,32737,-1382,32737,-1391,32737,-1399,32736,-1407,32736,-1416,32736,-1424,32735,-1433,32735,-1441,32734,-1449,32734,-1458,32734,-1466,32733,-1474,32733,-1483,32733,-1491,32732,-1500,32732,-1508,32731,-1516,32731,-1525,32731,-1533,32730,-1541,32730,-1550,32729,-1558,32729,-1566,32729,-1575,32728,-1583,32728,-1592,32727,-1600,32727,-1608,32727,-1617,32726,-1625,32726,-1633,32725,-1642,32725,-1650,32725,-1659,32724,-1667,32724,-1675,32723,-1684,32723,-1692,32722,-1700,32722,-1709,32722,-1717,32721,-1725,32721,-1734,32720,-1742,32720,-1751,32719,-1759,32719,-1767,32718,-1776,32718,-1784,32717,-1792,32717,-1801,32717,-1809,32716,-1817,32716,-1826,32715,-1834,32715,-1843,32714,-1851,32714,-1859,32713,-1868,32713,-1876,32712,-1884,32712,-1893,32711,-1901,32711,-1909,32710,-1918,32710,-1926,32709,-1935,32709,-1943,32708,-1951,32708,-1960,32707,-1968,32707,-1976,32706,-1985,32706,-1993,32705,-2001,32705,-2010,32704,-2018,32704,-2027,32703,-2035,32703,-2043,32702,-2052,32702,-2060,32701,-2068,32701,-2077,32700,-2085,32700,-2093,32699,-2102,32699,-2110,32698,-2118,32697,-2127,32697,-2135,32696,-2144,32696,-2152,32695,-2160,32695,-2169,32694,-2177,32694,-2185,32693,-2194,32692,-2202,32692,-2210,32691,-2219,32691,-2227,32690,-2236,32690,-2244,32689,-2252,32688,-2261,32688,-2269,32687,-2277,32687,-2286,32686,-2294,32686,-2302,32685,-2311,32684,-2319,32684,-2327,32683,-2336,32683,-2344,32682,-2353,32681,-2361,32681,-2369,32680,-2378,32680,-2386,32679,-2394,32678,-2403,32678,-2411,32677,-2419,32676,-2428,32676,-2436,32675,-2444,32675,-2453,32674,-2461,32673,-2469,32673,-2478,32672,-2486,32671,-2495,32671,-2503,32670,-2511,32670,-2520,32669,-2528,32668,-2536,32668,-2545,32667,-2553,32666,-2561,32666,-2570,32665,-2578,32664,-2586,32664,-2595,32663,-2603,32662,-2611,32662,-2620,32661,-2628,32660,-2637,32660,-2645,32659,-2653,32658,-2662,32658,-2670,32657,-2678,32656,-2687,32656,-2695,32655,-2703,32654,-2712,32653,-2720,32653,-2728,32652,-2737,32651,-2745,32651,-2753,32650,-2762,32649,-2770,32649,-2778,32648,-2787,32647,-2795,32646,-2803,32646,-2812,32645,-2820,32644,-2829,32644,-2837,32643,-2845,32642,-2854,32641,-2862,32641,-2870,32640,-2879,32639,-2887,32638,-2895,32638,-2904,32637,-2912,32636,-2920,32635,-2929,32635,-2937,32634,-2945,32633,-2954,32632,-2962,32632,-2970,32631,-2979,32630,-2987,32629,-2995,32629,-3004,32628,-3012,32627,-3020,32626,-3029,32625,-3037,32625,-3045,32624,-3054,32623,-3062,32622,-3070,32622,-3079,32621,-3087,32620,-3095,32619,-3104,32618,-3112,32618,-3121,32617,-3129,32616,-3137,32615,-3146,32614,-3154,32614,-3162,32613,-3171,32612,-3179,32611,-3187,32610,-3196,32610,-3204,32609,-3212,32608,-3221,32607,-3229,32606,-3237,32605,-3246,32605,-3254,32604,-3262,32603,-3271,32602,-3279,32601,-3287,32600,-3296,32600,-3304,32599,-3312,32598,-3321,32597,-3329,32596,-3337,32595,-3346,32594,-3354,32594,-3362,32593,-3371,32592,-3379,32591,-3387,32590,-3396,32589,-3404,32588,-3412,32588,-3421,32587,-3429,32586,-3437,32585,-3446,32584,-3454,32583,-3462,32582,-3471,32581,-3479,32580,-3487,32580,-3496,32579,-3504,32578,-3512,32577,-3521,32576,-3529,32575,-3537,32574,-3546,32573,-3554,32572,-3562,32571,-3571,32571,-3579,32570,-3587,32569,-3595,32568,-3604,32567,-3612,32566,-3620,32565,-3629,32564,-3637,32563,-3645,32562,-3654,32561,-3662,32560,-3670,32559,-3679,32558,-3687,32558,-3695,32557,-3704,32556,-3712,32555,-3720,32554,-3729,32553,-3737,32552,-3745,32551,-3754,32550,-3762,32549,-3770,32548,-3779,32547,-3787,32546,-3795,32545,-3804,32544,-3812,32543,-3820,32542,-3829,32541,-3837,32540,-3845,32539,-3854,32538,-3862,32537,-3870,32536,-3878,32535,-3887,32534,-3895,32533,-3903,32532,-3912,32531,-3920,32530,-3928,32529,-3937,32528,-3945,32527,-3953,32526,-3962,32525,-3970,32524,-3978,32523,-3987,32522,-3995,32521,-4003,32520,-4012,32519,-4020,32518,-4028,32517,-4036,32516,-4045,32515,-4053,32514,-4061,32513,-4070,32512,-4078,32511,-4086,32510,-4095,32509,-4103,32508,-4111,32507,-4120,32506,-4128,32504,-4136,32503,-4145,32502,-4153,32501,-4161,32500,-4169,32499,-4178,32498,-4186,32497,-4194,32496,-4203,32495,-4211,32494,-4219,32493,-4228,32492,-4236,32491,-4244,32489,-4253,32488,-4261,32487,-4269,32486,-4277,32485,-4286,32484,-4294,32483,-4302,32482,-4311,32481,-4319,32480,-4327,32478,-4336,32477,-4344,32476,-4352,32475,-4360,32474,-4369,32473,-4377,32472,-4385,32471,-4394,32470,-4402,32468,-4410,32467,-4419,32466,-4427,32465,-4435,32464,-4444,32463,-4452,32462,-4460,32460,-4468,32459,-4477,32458,-4485,32457,-4493,32456,-4502,32455,-4510,32454,-4518,32452,-4526,32451,-4535,32450,-4543,32449,-4551,32448,-4560,32447,-4568,32445,-4576,32444,-4585,32443,-4593,32442,-4601,32441,-4609,32440,-4618,32438,-4626,32437,-4634,32436,-4643,32435,-4651,32434,-4659,32432,-4667,32431,-4676,32430,-4684,32429,-4692,32428,-4701,32426,-4709,32425,-4717,32424,-4726,32423,-4734,32422,-4742,32420,-4750,32419,-4759,32418,-4767,32417,-4775,32416,-4784,32414,-4792,32413,-4800,32412,-4808,32411,-4817,32409,-4825,32408,-4833,32407,-4842,32406,-4850,32404,-4858,32403,-4866,32402,-4875,32401,-4883,32399,-4891,32398,-4900,32397,-4908,32396,-4916,32394,-4924,32393,-4933,32392,-4941,32391,-4949,32389,-4958,32388,-4966,32387,-4974,32386,-4982,32384,-4991,32383,-4999,32382,-5007,32380,-5015,32379,-5024,32378,-5032,32377,-5040,32375,-5049,32374,-5057,32373,-5065,32371,-5073,32370,-5082,32369,-5090,32368,-5098,32366,-5107,32365,-5115,32364,-5123,32362,-5131,32361,-5140,32360,-5148,32358,-5156,32357,-5164,32356,-5173,32354,-5181,32353,-5189,32352,-5198,32350,-5206,32349,-5214,32348,-5222,32346,-5231,32345,-5239,32344,-5247,32342,-5255,32341,-5264,32340,-5272,32338,-5280,32337,-5288,32336,-5297,32334,-5305,32333,-5313,32332,-5322,32330,-5330,32329,-5338,32327,-5346,32326,-5355,32325,-5363,32323,-5371,32322,-5379,32321,-5388,32319,-5396,32318,-5404,32316,-5412,32315,-5421,32314,-5429,32312,-5437,32311,-5446,32310,-5454,32308,-5462,32307,-5470,32305,-5479,32304,-5487,32303,-5495,32301,-5503,32300,-5512,32298,-5520,32297,-5528,32295,-5536,32294,-5545,32293,-5553,32291,-5561,32290,-5569,32288,-5578,32287,-5586,32286,-5594,32284,-5602,32283,-5611,32281,-5619,32280,-5627,32278,-5635,32277,-5644,32275,-5652,32274,-5660,32273,-5668,32271,-5677,32270,-5685,32268,-5693,32267,-5701,32265,-5710,32264,-5718,32262,-5726,32261,-5734,32259,-5743,32258,-5751,32256,-5759,32255,-5767,32254,-5776,32252,-5784,32251,-5792,32249,-5800,32248,-5809,32246,-5817,32245,-5825,32243,-5833,32242,-5842,32240,-5850,32239,-5858,32237,-5866,32236,-5875,32234,-5883,32233,-5891,32231,-5899,32230,-5908,32228,-5916,32227,-5924,32225,-5932,32224,-5941,32222,-5949,32221,-5957,32219,-5965,32218,-5973,32216,-5982,32214,-5990,32213,-5998,32211,-6006,32210,-6015,32208,-6023,32207,-6031,32205,-6039,32204,-6048,32202,-6056,32201,-6064,32199,-6072,32197,-6081,32196,-6089,32194,-6097,32193,-6105,32191,-6113,32190,-6122,32188,-6130,32187,-6138,32185,-6146,32183,-6155,32182,-6163,32180,-6171,32179,-6179,32177,-6187,32176,-6196,32174,-6204,32172,-6212,32171,-6220,32169,-6229,32168,-6237,32166,-6245,32164,-6253,32163,-6262,32161,-6270,32160,-6278,32158,-6286,32156,-6294,32155,-6303,32153,-6311,32152,-6319,32150,-6327,32148,-6335,32147,-6344,32145,-6352,32143,-6360,32142,-6368,32140,-6377,32139,-6385,32137,-6393,32135,-6401,32134,-6409,32132,-6418,32130,-6426,32129,-6434,32127,-6442,32125,-6451,32124,-6459,32122,-6467,32120,-6475,32119,-6483,32117,-6492,32115,-6500,32114,-6508,32112,-6516,32110,-6524,32109,-6533,32107,-6541,32105,-6549,32104,-6557,32102,-6565,32100,-6574,32099,-6582,32097,-6590,32095,-6598,32094,-6607,32092,-6615,32090,-6623,32089,-6631,32087,-6639,32085,-6648,32084,-6656,32082,-6664,32080,-6672,32078,-6680,32077,-6689,32075,-6697,32073,-6705,32072,-6713,32070,-6721,32068,-6730,32066,-6738,32065,-6746,32063,-6754,32061,-6762,32059,-6771,32058,-6779,32056,-6787,32054,-6795,32053,-6803,32051,-6812,32049,-6820,32047,-6828,32046,-6836,32044,-6844,32042,-6852,32040,-6861,32039,-6869,32037,-6877,32035,-6885,32033,-6893,32032,-6902,32030,-6910,32028,-6918,32026,-6926,32024,-6934,32023,-6943,32021,-6951,32019,-6959,32017,-6967,32016,-6975,32014,-6983,32012,-6992,32010,-7000,32008,-7008,32007,-7016,32005,-7024,32003,-7033,32001,-7041,31999,-7049,31998,-7057,31996,-7065,31994,-7073,31992,-7082,31990,-7090,31989,-7098,31987,-7106,31985,-7114,31983,-7123,31981,-7131,31979,-7139,31978,-7147,31976,-7155,31974,-7163,31972,-7172,31970,-7180,31968,-7188,31967,-7196,31965,-7204,31963,-7212,31961,-7221,31959,-7229,31957,-7237,31956,-7245,31954,-7253,31952,-7262,31950,-7270,31948,-7278,31946,-7286,31944,-7294,31943,-7302,31941,-7311,31939,-7319,31937,-7327,31935,-7335,31933,-7343,31931,-7351,31929,-7359,31928,-7368,31926,-7376,31924,-7384,31922,-7392,31920,-7400,31918,-7408,31916,-7417,31914,-7425,31912,-7433,31911,-7441,31909,-7449,31907,-7457,31905,-7466,31903,-7474,31901,-7482,31899,-7490,31897,-7498,31895,-7506,31893,-7515,31891,-7523,31889,-7531,31888,-7539,31886,-7547,31884,-7555,31882,-7563,31880,-7572,31878,-7580,31876,-7588,31874,-7596,31872,-7604,31870,-7612,31868,-7620,31866,-7629,31864,-7637,31862,-7645,31860,-7653,31858,-7661,31856,-7669,31854,-7677,31853,-7686,31851,-7694,31849,-7702,31847,-7710,31845,-7718,31843,-7726,31841,-7734,31839,-7743,31837,-7751,31835,-7759,31833,-7767,31831,-7775,31829,-7783,31827,-7791,31825,-7800,31823,-7808,31821,-7816,31819,-7824,31817,-7832,31815,-7840,31813,-7848,31811,-7857,31809,-7865,31807,-7873,31805,-7881,31803,-7889,31801,-7897,31799,-7905,31797,-7913,31795,-7922,31793,-7930,31791,-7938,31789,-7946,31787,-7954,31785,-7962,31782,-7970,31780,-7978,31778,-7987,31776,-7995,31774,-8003,31772,-8011,31770,-8019,31768,-8027,31766,-8035,31764,-8043,31762,-8052,31760,-8060,31758,-8068,31756,-8076,31754,-8084,31752,-8092,31750,-8100,31748,-8108,31745,-8117,31743,-8125,31741,-8133,31739,-8141,31737,-8149,31735,-8157,31733,-8165,31731,-8173,31729,-8181,31727,-8190,31725,-8198,31723,-8206,31720,-8214,31718,-8222,31716,-8230,31714,-8238,31712,-8246,31710,-8254,31708,-8263,31706,-8271,31704,-8279,31701,-8287,31699,-8295,31697,-8303,31695,-8311,31693,-8319,31691,-8327,31689,-8335,31687,-8344,31684,-8352,31682,-8360,31680,-8368,31678,-8376,31676,-8384,31674,-8392,31672,-8400,31669,-8408,31667,-8416,31665,-8425,31663,-8433,31661,-8441,31659,-8449,31656,-8457,31654,-8465,31652,-8473,31650,-8481,31648,-8489,31646,-8497,31643,-8505,31641,-8514,31639,-8522,31637,-8530,31635,-8538,31633,-8546,31630,-8554,31628,-8562,31626,-8570,31624,-8578,31622,-8586,31619,-8594,31617,-8603,31615,-8611,31613,-8619,31611,-8627,31608,-8635,31606,-8643,31604,-8651,31602,-8659,31600,-8667,31597,-8675,31595,-8683,31593,-8691,31591,-8700,31588,-8708,31586,-8716,31584,-8724,31582,-8732,31580,-8740,31577,-8748,31575,-8756,31573,-8764,31571,-8772,31568,-8780,31566,-8788,31564,-8796,31562,-8804,31559,-8813,31557,-8821,31555,-8829,31553,-8837,31550,-8845,31548,-8853,31546,-8861,31544,-8869,31541,-8877,31539,-8885,31537,-8893,31534,-8901,31532,-8909,31530,-8917,31528,-8925,31525,-8933,31523,-8942,31521,-8950,31518,-8958,31516,-8966,31514,-8974,31512,-8982,31509,-8990,31507,-8998,31505,-9006,31502,-9014,31500,-9022,31498,-9030,31495,-9038,31493,-9046,31491,-9054,31489,-9062,31486,-9070,31484,-9078,31482,-9087,31479,-9095,31477,-9103,31475,-9111,31472,-9119,31470,-9127,31468,-9135,31465,-9143,31463,-9151,31461,-9159,31458,-9167,31456,-9175,31454,-9183,31451,-9191,31449,-9199,31446,-9207,31444,-9215,31442,-9223,31439,-9231,31437,-9239,31435,-9247,31432,-9255,31430,-9263,31428,-9271,31425,-9280,31423,-9288,31420,-9296,31418,-9304,31416,-9312,31413,-9320,31411,-9328,31409,-9336,31406,-9344,31404,-9352,31401,-9360,31399,-9368,31397,-9376,31394,-9384,31392,-9392,31389,-9400,31387,-9408,31385,-9416,31382,-9424,31380,-9432,31377,-9440,31375,-9448,31373,-9456,31370,-9464,31368,-9472,31365,-9480,31363,-9488,31360,-9496,31358,-9504,31356,-9512,31353,-9520,31351,-9528,31348,-9536,31346,-9544,31343,-9552,31341,-9560,31338,-9568,31336,-9576,31334,-9584,31331,-9592,31329,-9600,31326,-9608,31324,-9616,31321,-9624,31319,-9632,31316,-9640,31314,-9648,31311,-9656,31309,-9664,31307,-9672,31304,-9680,31302,-9688,31299,-9696,31297,-9704,31294,-9712,31292,-9720,31289,-9728,31287,-9736,31284,-9744,31282,-9752,31279,-9760,31277,-9768,31274,-9776,31272,-9784,31269,-9792,31267,-9800,31264,-9808,31262,-9816,31259,-9824,31257,-9832,31254,-9840,31252,-9848,31249,-9856,31247,-9864,31244,-9872,31242,-9880,31239,-9888,31236,-9896,31234,-9904,31231,-9912,31229,-9920,31226,-9928,31224,-9936,31221,-9944,31219,-9952,31216,-9960,31214,-9968,31211,-9976,31209,-9984,31206,-9992,31203,-10000,31201,-10008,31198,-10016,31196,-10024,31193,-10032,31191,-10040,31188,-10048,31185,-10056,31183,-10064,31180,-10072,31178,-10080,31175,-10088,31173,-10096,31170,-10104,31167,-10112,31165,-10120,31162,-10128,31160,-10136,31157,-10144,31154,-10152,31152,-10160,31149,-10167,31147,-10175,31144,-10183,31141,-10191,31139,-10199,31136,-10207,31134,-10215,31131,-10223,31128,-10231,31126,-10239,31123,-10247,31121,-10255,31118,-10263,31115,-10271,31113,-10279,31110,-10287,31107,-10295,31105,-10303,31102,-10311,31100,-10319,31097,-10327,31094,-10335,31092,-10343,31089,-10350,31086,-10358,31084,-10366,31081,-10374,31078,-10382,31076,-10390,31073,-10398,31070,-10406,31068,-10414,31065,-10422,31062,-10430,31060,-10438,31057,-10446,31054,-10454,31052,-10462,31049,-10470,31046,-10478,31044,-10485,31041,-10493,31038,-10501,31036,-10509,31033,-10517,31030,-10525,31028,-10533,31025,-10541,31022,-10549,31019,-10557,31017,-10565,31014,-10573,31011,-10581,31009,-10589,31006,-10597,31003,-10604,31001,-10612,30998,-10620,30995,-10628,30992,-10636,30990,-10644,30987,-10652,30984,-10660,30981,-10668,30979,-10676,30976,-10684,30973,-10692,30971,-10700,30968,-10707,30965,-10715,30962,-10723,30960,-10731,30957,-10739,30954,-10747,30951,-10755,30949,-10763,30946,-10771,30943,-10779,30940,-10787,30938,-10795,30935,-10802,30932,-10810,30929,-10818,30927,-10826,30924,-10834,30921,-10842,30918,-10850,30915,-10858,30913,-10866,30910,-10874,30907,-10881,30904,-10889,30902,-10897,30899,-10905,30896,-10913,30893,-10921,30890,-10929,30888,-10937,30885,-10945,30882,-10953,30879,-10960,30876,-10968,30874,-10976,30871,-10984,30868,-10992,30865,-11000,30862,-11008,30860,-11016,30857,-11024,30854,-11031,30851,-11039,30848,-11047,30845,-11055,30843,-11063,30840,-11071,30837,-11079,30834,-11087,30831,-11095,30828,-11102,30826,-11110,30823,-11118,30820,-11126,30817,-11134,30814,-11142,30811,-11150,30809,-11158,30806,-11165,30803,-11173,30800,-11181,30797,-11189,30794,-11197,30791,-11205,30788,-11213,30786,-11221,30783,-11228,30780,-11236,30777,-11244,30774,-11252,30771,-11260,30768,-11268,30766,-11276,30763,-11284,30760,-11291,30757,-11299,30754,-11307,30751,-11315,30748,-11323,30745,-11331,30742,-11339,30739,-11346,30737,-11354,30734,-11362,30731,-11370,30728,-11378,30725,-11386,30722,-11394,30719,-11401,30716,-11409,30713,-11417,30710,-11425,30707,-11433,30705,-11441,30702,-11449,30699,-11456,30696,-11464,30693,-11472,30690,-11480,30687,-11488,30684,-11496,30681,-11503,30678,-11511,30675,-11519,30672,-11527,30669,-11535,30666,-11543,30663,-11551,30660,-11558,30657,-11566,30655,-11574,30652,-11582,30649,-11590,30646,-11598,30643,-11605,30640,-11613,30637,-11621,30634,-11629,30631,-11637,30628,-11645,30625,-11652,30622,-11660,30619,-11668,30616,-11676,30613,-11684,30610,-11692,30607,-11699,30604,-11707,30601,-11715,30598,-11723,30595,-11731,30592,-11738,30589,-11746,30586,-11754,30583,-11762,30580,-11770,30577,-11778,30574,-11785,30571,-11793,30568,-11801,30565,-11809,30562,-11817,30559,-11824,30556,-11832,30553,-11840,30550,-11848,30547,-11856,30544,-11863,30541,-11871,30538,-11879,30535,-11887,30532,-11895,30528,-11903,30525,-11910,30522,-11918,30519,-11926,30516,-11934,30513,-11942,30510,-11949,30507,-11957,30504,-11965,30501,-11973,30498,-11981,30495,-11988,30492,-11996,30489,-12004,30486,-12012,30483,-12020,30480,-12027,30476,-12035,30473,-12043,30470,-12051,30467,-12058,30464,-12066,30461,-12074,30458,-12082,30455,-12090,30452,-12097,30449,-12105,30446,-12113,30442,-12121,30439,-12129,30436,-12136,30433,-12144,30430,-12152,30427,-12160,30424,-12167,30421,-12175,30418,-12183,30415,-12191,30411,-12199,30408,-12206,30405,-12214,30402,-12222,30399,-12230,30396,-12237,30393,-12245,30390,-12253,30386,-12261,30383,-12269,30380,-12276,30377,-12284,30374,-12292,30371,-12300,30368,-12307,30364,-12315,30361,-12323,30358,-12331,30355,-12338,30352,-12346,30349,-12354,30345,-12362,30342,-12369,30339,-12377,30336,-12385,30333,-12393,30330,-12400,30326,-12408,30323,-12416,30320,-12424,30317,-12431,30314,-12439,30311,-12447,30307,-12455,30304,-12462,30301,-12470,30298,-12478,30295,-12486,30291,-12493,30288,-12501,30285,-12509,30282,-12517,30279,-12524,30275,-12532,30272,-12540,30269,-12548,30266,-12555,30263,-12563,30259,-12571,30256,-12579,30253,-12586,30250,-12594,30247,-12602,30243,-12610,30240,-12617,30237,-12625,30234,-12633,30230,-12640,30227,-12648,30224,-12656,30221,-12664,30217,-12671,30214,-12679,30211,-12687,30208,-12695,30205,-12702,30201,-12710,30198,-12718,30195,-12725,30191,-12733,30188,-12741,30185,-12749,30182,-12756,30178,-12764,30175,-12772,30172,-12779,30169,-12787,30165,-12795,30162,-12803,30159,-12810,30156,-12818,30152,-12826,30149,-12833,30146,-12841,30142,-12849,30139,-12857,30136,-12864,30133,-12872,30129,-12880,30126,-12887,30123,-12895,30119,-12903,30116,-12910,30113,-12918,30109,-12926,30106,-12934,30103,-12941,30100,-12949,30096,-12957,30093,-12964,30090,-12972,30086,-12980,30083,-12987,30080,-12995,30076,-13003,30073,-13010,30070,-13018,30066,-13026,30063,-13034,30060,-13041,30056,-13049,30053,-13057,30050,-13064,30046,-13072,30043,-13080,30040,-13087,30036,-13095,30033,-13103,30030,-13110,30026,-13118,30023,-13126,30020,-13133,30016,-13141,30013,-13149,30009,-13156,30006,-13164,30003,-13172,29999,-13179,29996,-13187,29993,-13195,29989,-13202,29986,-13210,29983,-13218,29979,-13225,29976,-13233,29972,-13241,29969,-13248,29966,-13256,29962,-13264,29959,-13271,29955,-13279,29952,-13287,29949,-13294,29945,-13302,29942,-13310,29938,-13317,29935,-13325,29932,-13333,29928,-13340,29925,-13348,29921,-13356,29918,-13363,29915,-13371,29911,-13379,29908,-13386,29904,-13394,29901,-13401,29897,-13409,29894,-13417,29891,-13424,29887,-13432,29884,-13440,29880,-13447,29877,-13455,29873,-13463,29870,-13470,29866,-13478,29863,-13486,29860,-13493,29856,-13501,29853,-13508,29849,-13516,29846,-13524,29842,-13531,29839,-13539,29835,-13547,29832,-13554,29828,-13562,29825,-13569,29822,-13577,29818,-13585,29815,-13592,29811,-13600,29808,-13608,29804,-13615,29801,-13623,29797,-13630,29794,-13638,29790,-13646,29787,-13653,29783,-13661,29780,-13668,29776,-13676,29773,-13684,29769,-13691,29766,-13699,29762,-13707,29759,-13714,29755,-13722,29752,-13729,29748,-13737,29745,-13745,29741,-13752,29738,-13760,29734,-13767,29731,-13775,29727,-13783,29724,-13790,29720,-13798,29717,-13805,29713,-13813,29709,-13821,29706,-13828,29702,-13836,29699,-13843,29695,-13851,29692,-13859,29688,-13866,29685,-13874,29681,-13881,29678,-13889,29674,-13896,29670,-13904,29667,-13912,29663,-13919,29660,-13927,29656,-13934,29653,-13942,29649,-13950,29646,-13957,29642,-13965,29638,-13972,29635,-13980,29631,-13987,29628,-13995,29624,-14003,29621,-14010,29617,-14018,29613,-14025,29610,-14033,29606,-14040,29603,-14048,29599,-14056,29595,-14063,29592,-14071,29588,-14078,29585,-14086,29581,-14093,29577,-14101,29574,-14109,29570,-14116,29567,-14124,29563,-14131,29559,-14139,29556,-14146,29552,-14154,29548,-14161,29545,-14169,29541,-14177,29538,-14184,29534,-14192,29530,-14199,29527,-14207,29523,-14214,29519,-14222,29516,-14229,29512,-14237,29509,-14245,29505,-14252,29501,-14260,29498,-14267,29494,-14275,29490,-14282,29487,-14290,29483,-14297,29479,-14305,29476,-14312,29472,-14320,29468,-14327,29465,-14335,29461,-14343,29457,-14350,29454,-14358,29450,-14365,29446,-14373,29443,-14380,29439,-14388,29435,-14395,29432,-14403,29428,-14410,29424,-14418,29421,-14425,29417,-14433,29413,-14440,29410,-14448,29406,-14455,29402,-14463,29398,-14470,29395,-14478,29391,-14485,29387,-14493,29384,-14500,29380,-14508,29376,-14516,29372,-14523,29369,-14531,29365,-14538,29361,-14546,29358,-14553,29354,-14561,29350,-14568,29346,-14576,29343,-14583,29339,-14591,29335,-14598,29332,-14606,29328,-14613,29324,-14621,29320,-14628,29317,-14636,29313,-14643,29309,-14651,29305,-14658,29302,-14666,29298,-14673,29294,-14681,29290,-14688,29287,-14695,29283,-14703,29279,-14710,29275,-14718,29272,-14725,29268,-14733,29264,-14740,29260,-14748,29256,-14755,29253,-14763,29249,-14770,29245,-14778,29241,-14785,29238,-14793,29234,-14800,29230,-14808,29226,-14815,29222,-14823,29219,-14830,29215,-14838,29211,-14845,29207,-14853,29203,-14860,29200,-14867,29196,-14875,29192,-14882,29188,-14890,29184,-14897,29181,-14905,29177,-14912,29173,-14920,29169,-14927,29165,-14935,29162,-14942,29158,-14950,29154,-14957,29150,-14964,29146,-14972,29142,-14979,29139,-14987,29135,-14994,29131,-15002,29127,-15009,29123,-15017,29119,-15024,29116,-15031,29112,-15039,29108,-15046,29104,-15054,29100,-15061,29096,-15069,29092,-15076,29089,-15084,29085,-15091,29081,-15098,29077,-15106,29073,-15113,29069,-15121,29065,-15128,29062,-15136,29058,-15143,29054,-15150,29050,-15158,29046,-15165,29042,-15173,29038,-15180,29034,-15188,29031,-15195,29027,-15202,29023,-15210,29019,-15217,29015,-15225,29011,-15232,29007,-15239,29003,-15247,28999,-15254,28996,-15262,28992,-15269,28988,-15277,28984,-15284,28980,-15291,28976,-15299,28972,-15306,28968,-15314,28964,-15321,28960,-15328,28956,-15336,28953,-15343,28949,-15351,28945,-15358,28941,-15365,28937,-15373,28933,-15380,28929,-15388,28925,-15395,28921,-15402,28917,-15410,28913,-15417,28909,-15425,28905,-15432,28901,-15439,28897,-15447,28893,-15454,28890,-15462,28886,-15469,28882,-15476,28878,-15484,28874,-15491,28870,-15498,28866,-15506,28862,-15513,28858,-15521,28854,-15528,28850,-15535,28846,-15543,28842,-15550,28838,-15557,28834,-15565,28830,-15572,28826,-15580,28822,-15587,28818,-15594,28814,-15602,28810,-15609,28806,-15616,28802,-15624,28798,-15631,28794,-15639,28790,-15646,28786,-15653,28782,-15661,28778,-15668,28774,-15675,28770,-15683,28766,-15690,28762,-15697,28758,-15705,28754,-15712,28750,-15719,28746,-15727,28742,-15734,28738,-15741,28734,-15749,28730,-15756,28726,-15764,28722,-15771,28718,-15778,28714,-15786,28710,-15793,28706,-15800,28702,-15808,28698,-15815,28694,-15822,28690,-15830,28685,-15837,28681,-15844,28677,-15852,28673,-15859,28669,-15866,28665,-15874,28661,-15881,28657,-15888,28653,-15896,28649,-15903,28645,-15910,28641,-15918,28637,-15925,28633,-15932,28629,-15939,28625,-15947,28620,-15954,28616,-15961,28612,-15969,28608,-15976,28604,-15983,28600,-15991,28596,-15998,28592,-16005,28588,-16013,28584,-16020,28580,-16027,28575,-16035,28571,-16042,28567,-16049,28563,-16056,28559,-16064,28555,-16071,28551,-16078,28547,-16086,28543,-16093,28538,-16100,28534,-16108,28530,-16115,28526,-16122,28522,-16129,28518,-16137,28514,-16144,28510,-16151,28506,-16159,28501,-16166,28497,-16173,28493,-16180,28489,-16188,28485,-16195,28481,-16202,28477,-16210,28472,-16217,28468,-16224,28464,-16231,28460,-16239,28456,-16246,28452,-16253,28447,-16261,28443,-16268,28439,-16275,28435,-16282,28431,-16290,28427,-16297,28423,-16304,28418,-16311,28414,-16319,28410,-16326,28406,-16333,28402,-16340,28397,-16348,28393,-16355,28389,-16362,28385,-16369,28381,-16377,28377,-16384,28372,-16391,28368,-16399,28364,-16406,28360,-16413,28356,-16420,28351,-16428,28347,-16435,28343,-16442,28339,-16449,28335,-16456,28330,-16464,28326,-16471,28322,-16478,28318,-16485,28314,-16493,28309,-16500,28305,-16507,28301,-16514,28297,-16522,28292,-16529,28288,-16536,28284,-16543,28280,-16551,28275,-16558,28271,-16565,28267,-16572,28263,-16579,28259,-16587,28254,-16594,28250,-16601,28246,-16608,28242,-16616,28237,-16623,28233,-16630,28229,-16637,28225,-16644,28220,-16652,28216,-16659,28212,-16666,28208,-16673,28203,-16681,28199,-16688,28195,-16695,28190,-16702,28186,-16709,28182,-16717,28178,-16724,28173,-16731,28169,-16738,28165,-16745,28161,-16753,28156,-16760,28152,-16767,28148,-16774,28143,-16781,28139,-16789,28135,-16796,28131,-16803,28126,-16810,28122,-16817,28118,-16825,28113,-16832,28109,-16839,28105,-16846,28100,-16853,28096,-16860,28092,-16868,28087,-16875,28083,-16882,28079,-16889,28075,-16896,28070,-16904,28066,-16911,28062,-16918,28057,-16925,28053,-16932,28049,-16939,28044,-16947,28040,-16954,28036,-16961,28031,-16968,28027,-16975,28023,-16982,28018,-16990,28014,-16997,28009,-17004,28005,-17011,28001,-17018,27996,-17025,27992,-17033,27988,-17040,27983,-17047,27979,-17054,27975,-17061,27970,-17068,27966,-17075,27962,-17083,27957,-17090,27953,-17097,27948,-17104,27944,-17111,27940,-17118,27935,-17125,27931,-17133,27927,-17140,27922,-17147,27918,-17154,27913,-17161,27909,-17168,27905,-17175,27900,-17183,27896,-17190,27891,-17197,27887,-17204,27883,-17211,27878,-17218,27874,-17225,27869,-17233,27865,-17240,27861,-17247,27856,-17254,27852,-17261,27847,-17268,27843,-17275,27839,-17282,27834,-17289,27830,-17297,27825,-17304,27821,-17311,27816,-17318,27812,-17325,27808,-17332,27803,-17339,27799,-17346,27794,-17353,27790,-17361,27785,-17368,27781,-17375,27777,-17382,27772,-17389,27768,-17396,27763,-17403,27759,-17410,27754,-17417,27750,-17424,27745,-17432,27741,-17439,27736,-17446,27732,-17453,27728,-17460,27723,-17467,27719,-17474,27714,-17481,27710,-17488,27705,-17495,27701,-17502,27696,-17510,27692,-17517,27687,-17524,27683,-17531,27678,-17538,27674,-17545,27669,-17552,27665,-17559,27660,-17566,27656,-17573,27651,-17580,27647,-17587,27642,-17594,27638,-17601,27633,-17609,27629,-17616,27624,-17623,27620,-17630,27615,-17637,27611,-17644,27606,-17651,27602,-17658,27597,-17665,27593,-17672,27588,-17679,27584,-17686,27579,-17693,27575,-17700,27570,-17707,27566,-17714,27561,-17721,27557,-17728,27552,-17736,27548,-17743,27543,-17750,27538,-17757,27534,-17764,27529,-17771,27525,-17778,27520,-17785,27516,-17792,27511,-17799,27507,-17806,27502,-17813,27498,-17820,27493,-17827,27488,-17834,27484,-17841,27479,-17848,27475,-17855,27470,-17862,27466,-17869,27461,-17876,27456,-17883,27452,-17890,27447,-17897,27443,-17904,27438,-17911,27434,-17918,27429,-17925,27424,-17932,27420,-17939,27415,-17946,27411,-17953,27406,-17960,27401,-17967,27397,-17974,27392,-17981,27388,-17988,27383,-17995,27378,-18002,27374,-18009,27369,-18016,27365,-18023,27360,-18030,27355,-18037,27351,-18044,27346,-18051,27342,-18058,27337,-18065,27332,-18072,27328,-18079,27323,-18086,27319,-18093,27314,-18100,27309,-18107,27305,-18114,27300,-18121,27295,-18128,27291,-18135,27286,-18142,27281,-18149,27277,-18156,27272,-18163,27268,-18170,27263,-18177,27258,-18184,27254,-18191,27249,-18198,27244,-18205,27240,-18212,27235,-18219,27230,-18226,27226,-18233,27221,-18240,27216,-18247,27212,-18254,27207,-18261,27202,-18268,27198,-18274,27193,-18281,27188,-18288,27184,-18295,27179,-18302,27174,-18309,27170,-18316,27165,-18323,27160,-18330,27156,-18337,27151,-18344,27146,-18351,27141,-18358,27137,-18365,27132,-18372,27127,-18379,27123,-18386,27118,-18393,27113,-18399,27109,-18406,27104,-18413,27099,-18420,27094,-18427,27090,-18434,27085,-18441,27080,-18448,27076,-18455,27071,-18462,27066,-18469,27061,-18476,27057,-18483,27052,-18489,27047,-18496,27042,-18503,27038,-18510,27033,-18517,27028,-18524,27024,-18531,27019,-18538,27014,-18545,27009,-18552,27005,-18559,27000,-18565,26995,-18572,26990,-18579,26986,-18586,26981,-18593,26976,-18600,26971,-18607,26967,-18614,26962,-18621,26957,-18628,26952,-18634,26948,-18641,26943,-18648,26938,-18655,26933,-18662,26928,-18669,26924,-18676,26919,-18683,26914,-18690,26909,-18696,26905,-18703,26900,-18710,26895,-18717,26890,-18724,26885,-18731,26881,-18738,26876,-18745,26871,-18751,26866,-18758,26861,-18765,26857,-18772,26852,-18779,26847,-18786,26842,-18793,26837,-18799,26833,-18806,26828,-18813,26823,-18820,26818,-18827,26813,-18834,26809,-18841,26804,-18847,26799,-18854,26794,-18861,26789,-18868,26784,-18875,26780,-18882,26775,-18889,26770,-18895,26765,-18902,26760,-18909,26755,-18916,26751,-18923,26746,-18930,26741,-18936,26736,-18943,26731,-18950,26726,-18957,26722,-18964,26717,-18971,26712,-18977,26707,-18984,26702,-18991,26697,-18998,26692,-19005,26688,-19012,26683,-19018,26678,-19025,26673,-19032,26668,-19039,26663,-19046,26658,-19052,26654,-19059,26649,-19066,26644,-19073,26639,-19080,26634,-19087,26629,-19093,26624,-19100,26619,-19107,26615,-19114,26610,-19121,26605,-19127,26600,-19134,26595,-19141,26590,-19148,26585,-19155,26580,-19161,26575,-19168,26570,-19175,26566,-19182,26561,-19189,26556,-19195,26551,-19202,26546,-19209,26541,-19216,26536,-19222,26531,-19229,26526,-19236,26521,-19243,26516,-19250,26512,-19256,26507,-19263,26502,-19270,26497,-19277,26492,-19283,26487,-19290,26482,-19297,26477,-19304,26472,-19311,26467,-19317,26462,-19324,26457,-19331,26452,-19338,26447,-19344,26442,-19351,26437,-19358,26433,-19365,26428,-19371,26423,-19378,26418,-19385,26413,-19392,26408,-19398,26403,-19405,26398,-19412,26393,-19419,26388,-19425,26383,-19432,26378,-19439,26373,-19446,26368,-19452,26363,-19459,26358,-19466,26353,-19473,26348,-19479,26343,-19486,26338,-19493,26333,-19500,26328,-19506,26323,-19513,26318,-19520,26313,-19527,26308,-19533,26303,-19540,26298,-19547,26293,-19553,26288,-19560,26283,-19567,26278,-19574,26273,-19580,26268,-19587,26263,-19594,26258,-19600,26253,-19607,26248,-19614,26243,-19621,26238,-19627,26233,-19634,26228,-19641,26223,-19647,26218,-19654,26213,-19661,26208,-19668,26203,-19674,26198,-19681,26193,-19688,26188,-19694,26183,-19701,26178,-19708,26173,-19714,26168,-19721,26163,-19728,26158,-19734,26153,-19741,26148,-19748,26142,-19755,26137,-19761,26132,-19768,26127,-19775,26122,-19781,26117,-19788,26112,-19795,26107,-19801,26102,-19808,26097,-19815,26092,-19821,26087,-19828,26082,-19835,26077,-19841,26072,-19848,26067,-19855,26061,-19861,26056,-19868,26051,-19875,26046,-19881,26041,-19888,26036,-19895,26031,-19901,26026,-19908,26021,-19915,26016,-19921,26011,-19928,26006,-19934,26000,-19941,25995,-19948,25990,-19954,25985,-19961,25980,-19968,25975,-19974,25970,-19981,25965,-19988,25960,-19994,25954,-20001,25949,-20008,25944,-20014,25939,-20021,25934,-20027,25929,-20034,25924,-20041,25919,-20047,25913,-20054,25908,-20061,25903,-20067,25898,-20074,25893,-20080,25888,-20087,25883,-20094,25878,-20100,25872,-20107,25867,-20114,25862,-20120,25857,-20127,25852,-20133,25847,-20140,25842,-20147,25836,-20153,25831,-20160,25826,-20166,25821,-20173,25816,-20180,25811,-20186,25805,-20193,25800,-20199,25795,-20206,25790,-20213,25785,-20219,25780,-20226,25774,-20232,25769,-20239,25764,-20246,25759,-20252,25754,-20259,25749,-20265,25743,-20272,25738,-20278,25733,-20285,25728,-20292,25723,-20298,25717,-20305,25712,-20311,25707,-20318,25702,-20324,25697,-20331,25691,-20338,25686,-20344,25681,-20351,25676,-20357,25671,-20364,25665,-20370,25660,-20377,25655,-20384,25650,-20390,25645,-20397,25639,-20403,25634,-20410,25629,-20416,25624,-20423,25619,-20429,25613,-20436,25608,-20443,25603,-20449,25598,-20456,25592,-20462,25587,-20469,25582,-20475,25577,-20482,25571,-20488,25566,-20495,25561,-20501,25556,-20508,25550,-20514,25545,-20521,25540,-20528,25535,-20534,25529,-20541,25524,-20547,25519,-20554,25514,-20560,25508,-20567,25503,-20573,25498,-20580,25493,-20586,25487,-20593,25482,-20599,25477,-20606,25472,-20612,25466,-20619,25461,-20625,25456,-20632,25451,-20638,25445,-20645,25440,-20651,25435,-20658,25429,-20664,25424,-20671,25419,-20677,25414,-20684,25408,-20690,25403,-20697,25398,-20703,25392,-20710,25387,-20716,25382,-20723,25376,-20729,25371,-20736,25366,-20742,25361,-20749,25355,-20755,25350,-20762,25345,-20768,25339,-20775,25334,-20781,25329,-20788,25323,-20794,25318,-20801,25313,-20807,25307,-20814,25302,-20820,25297,-20826,25291,-20833,25286,-20839,25281,-20846,25276,-20852,25270,-20859,25265,-20865,25260,-20872,25254,-20878,25249,-20885,25243,-20891,25238,-20898,25233,-20904,25227,-20910,25222,-20917,25217,-20923,25211,-20930,25206,-20936,25201,-20943,25195,-20949,25190,-20956,25185,-20962,25179,-20968,25174,-20975,25169,-20981,25163,-20988,25158,-20994,25152,-21001,25147,-21007,25142,-21013,25136,-21020,25131,-21026,25126,-21033,25120,-21039,25115,-21046,25109,-21052,25104,-21058,25099,-21065,25093,-21071,25088,-21078,25083,-21084,25077,-21091,25072,-21097,25066,-21103,25061,-21110,25056,-21116,25050,-21123,25045,-21129,25039,-21135,25034,-21142,25029,-21148,25023,-21155,25018,-21161,25012,-21167,25007,-21174,25001,-21180,24996,-21187,24991,-21193,24985,-21199,24980,-21206,24974,-21212,24969,-21218,24964,-21225,24958,-21231,24953,-21238,24947,-21244,24942,-21250,24936,-21257,24931,-21263,24926,-21269,24920,-21276,24915,-21282,24909,-21289,24904,-21295,24898,-21301,24893,-21308,24887,-21314,24882,-21320,24877,-21327,24871,-21333,24866,-21340,24860,-21346,24855,-21352,24849,-21359,24844,-21365,24838,-21371,24833,-21378,24827,-21384,24822,-21390,24816,-21397,24811,-21403,24805,-21409,24800,-21416,24795,-21422,24789,-21428,24784,-21435,24778,-21441,24773,-21447,24767,-21454,24762,-21460,24756,-21466,24751,-21473,24745,-21479,24740,-21485,24734,-21492,24729,-21498,24723,-21504,24718,-21511,24712,-21517,24707,-21523,24701,-21530,24696,-21536,24690,-21542,24685,-21549,24679,-21555,24674,-21561,24668,-21567,24663,-21574,24657,-21580,24652,-21586,24646,-21593,24641,-21599,24635,-21605,24630,-21612,24624,-21618,24618,-21624,24613,-21630,24607,-21637,24602,-21643,24596,-21649,24591,-21656,24585,-21662,24580,-21668,24574,-21674,24569,-21681,24563,-21687,24558,-21693,24552,-21700,24546,-21706,24541,-21712,24535,-21718,24530,-21725,24524,-21731,24519,-21737,24513,-21744,24508,-21750,24502,-21756,24496,-21762,24491,-21769,24485,-21775,24480,-21781,24474,-21787,24469,-21794,24463,-21800,24457,-21806,24452,-21812,24446,-21819,24441,-21825,24435,-21831,24430,-21837,24424,-21844,24418,-21850,24413,-21856,24407,-21862,24402,-21869,24396,-21875,24390,-21881,24385,-21887,24379,-21894,24374,-21900,24368,-21906,24362,-21912,24357,-21918,24351,-21925,24346,-21931,24340,-21937,24334,-21943,24329,-21950,24323,-21956,24318,-21962,24312,-21968,24306,-21974,24301,-21981,24295,-21987,24289,-21993,24284,-21999,24278,-22005,24273,-22012,24267,-22018,24261,-22024,24256,-22030,24250,-22036,24244,-22043,24239,-22049,24233,-22055,24228,-22061,24222,-22067,24216,-22074,24211,-22080,24205,-22086,24199,-22092,24194,-22098,24188,-22105,24182,-22111,24177,-22117,24171,-22123,24165,-22129,24160,-22136,24154,-22142,24148,-22148,24143,-22154,24137,-22160,24131,-22166,24126,-22173,24120,-22179,24114,-22185,24109,-22191,24103,-22197,24097,-22203,24092,-22210,24086,-22216,24080,-22222,24075,-22228,24069,-22234,24063,-22240,24058,-22246,24052,-22253,24046,-22259,24041,-22265,24035,-22271,24029,-22277,24023,-22283,24018,-22289,24012,-22296,24006,-22302,24001,-22308,23995,-22314,23989,-22320,23984,-22326,23978,-22332,23972,-22339,23966,-22345,23961,-22351,23955,-22357,23949,-22363,23944,-22369,23938,-22375,23932,-22381,23926,-22388,23921,-22394,23915,-22400,23909,-22406,23903,-22412,23898,-22418,23892,-22424,23886,-22430,23881,-22436,23875,-22443,23869,-22449,23863,-22455,23858,-22461,23852,-22467,23846,-22473,23840,-22479,23835,-22485,23829,-22491,23823,-22497,23817,-22504,23812,-22510,23806,-22516,23800,-22522,23794,-22528,23789,-22534,23783,-22540,23777,-22546,23771,-22552,23766,-22558,23760,-22564,23754,-22570,23748,-22576,23742,-22583,23737,-22589,23731,-22595,23725,-22601,23719,-22607,23714,-22613,23708,-22619,23702,-22625,23696,-22631,23690,-22637,23685,-22643,23679,-22649,23673,-22655,23667,-22661,23661,-22667,23656,-22673,23650,-22679,23644,-22686,23638,-22692,23632,-22698,23627,-22704,23621,-22710,23615,-22716,23609,-22722,23603,-22728,23598,-22734,23592,-22740,23586,-22746,23580,-22752,23574,-22758,23569,-22764,23563,-22770,23557,-22776,23551,-22782,23545,-22788,23539,-22794,23534,-22800,23528,-22806,23522,-22812,23516,-22818,23510,-22824,23504,-22830,23499,-22836,23493,-22842,23487,-22848,23481,-22854,23475,-22860,23469,-22866,23464,-22872,23458,-22878,23452,-22884,23446,-22890,23440,-22896,23434,-22902,23428,-22908,23423,-22914,23417,-22920,23411,-22926,23405,-22932,23399,-22938,23393,-22944,23387,-22950,23382,-22956,23376,-22962,23370,-22968,23364,-22974,23358,-22980,23352,-22986,23346,-22992,23340,-22998,23335,-23004,23329,-23010,23323,-23016,23317,-23022,23311,-23028,23305,-23034,23299,-23040,23293,-23046,23287,-23051,23282,-23057,23276,-23063,23270,-23069,23264,-23075,23258,-23081,23252,-23087,23246,-23093,23240,-23099,23234,-23105,23228,-23111,23223,-23117,23217,-23123,23211,-23129,23205,-23135,23199,-23141,23193,-23147,23187,-23152,23181,-23158,23175,-23164,23169,-23170,23163,-23176,23157,-23182,23151,-23188,23146,-23194,23140,-23200,23134,-23206,23128,-23212,23122,-23218,23116,-23224,23110,-23229,23104,-23235,23098,-23241,23092,-23247,23086,-23253,23080,-23259,23074,-23265,23068,-23271,23062,-23277,23056,-23283,23050,-23288,23045,-23294,23039,-23300,23033,-23306,23027,-23312,23021,-23318,23015,-23324,23009,-23330,23003,-23336,22997,-23341,22991,-23347,22985,-23353,22979,-23359,22973,-23365,22967,-23371,22961,-23377,22955,-23383,22949,-23388,22943,-23394,22937,-23400,22931,-23406,22925,-23412,22919,-23418,22913,-23424,22907,-23429,22901,-23435,22895,-23441,22889,-23447,22883,-23453,22877,-23459,22871,-23465,22865,-23470,22859,-23476,22853,-23482,22847,-23488,22841,-23494,22835,-23500,22829,-23505,22823,-23511,22817,-23517,22811,-23523,22805,-23529,22799,-23535,22793,-23540,22787,-23546,22781,-23552,22775,-23558,22769,-23564,22763,-23570,22757,-23575,22751,-23581,22745,-23587,22739,-23593,22733,-23599,22727,-23604,22721,-23610,22715,-23616,22709,-23622,22703,-23628,22697,-23633,22691,-23639,22685,-23645,22678,-23651,22672,-23657,22666,-23662,22660,-23668,22654,-23674,22648,-23680,22642,-23686,22636,-23691,22630,-23697,22624,-23703,22618,-23709,22612,-23715,22606,-23720,22600,-23726,22594,-23732,22588,-23738,22582,-23743,22575,-23749,22569,-23755,22563,-23761,22557,-23767,22551,-23772,22545,-23778,22539,-23784,22533,-23790,22527,-23795,22521,-23801,22515,-23807,22509,-23813,22503,-23818,22496,-23824,22490,-23830,22484,-23836,22478,-23841,22472,-23847,22466,-23853,22460,-23859,22454,-23864,22448,-23870,22442,-23876,22435,-23882,22429,-23887,22423,-23893,22417,-23899,22411,-23904,22405,-23910,22399,-23916,22393,-23922,22387,-23927,22380,-23933,22374,-23939,22368,-23945,22362,-23950,22356,-23956,22350,-23962,22344,-23967,22338,-23973,22331,-23979,22325,-23985,22319,-23990,22313,-23996,22307,-24002,22301,-24007,22295,-24013,22288,-24019,22282,-24024,22276,-24030,22270,-24036,22264,-24042,22258,-24047,22252,-24053,22245,-24059,22239,-24064,22233,-24070,22227,-24076,22221,-24081,22215,-24087,22209,-24093,22202,-24098,22196,-24104,22190,-24110,22184,-24115,22178,-24121,22172,-24127,22165,-24132,22159,-24138,22153,-24144,22147,-24149,22141,-24155,22135,-24161,22128,-24166,22122,-24172,22116,-24178,22110,-24183,22104,-24189,22097,-24195,22091,-24200,22085,-24206,22079,-24212,22073,-24217,22066,-24223,22060,-24229,22054,-24234,22048,-24240,22042,-24245,22035,-24251,22029,-24257,22023,-24262,22017,-24268,22011,-24274,22004,-24279,21998,-24285,21992,-24290,21986,-24296,21980,-24302,21973,-24307,21967,-24313,21961,-24319,21955,-24324,21949,-24330,21942,-24335,21936,-24341,21930,-24347,21924,-24352,21917,-24358,21911,-24363,21905,-24369,21899,-24375,21893,-24380,21886,-24386,21880,-24391,21874,-24397,21868,-24403,21861,-24408,21855,-24414,21849,-24419,21843,-24425,21836,-24431,21830,-24436,21824,-24442,21818,-24447,21811,-24453,21805,-24458,21799,-24464,21793,-24470,21786,-24475,21780,-24481,21774,-24486,21768,-24492,21761,-24497,21755,-24503,21749,-24509,21743,-24514,21736,-24520,21730,-24525,21724,-24531,21717,-24536,21711,-24542,21705,-24547,21699,-24553,21692,-24559,21686,-24564,21680,-24570,21673,-24575,21667,-24581,21661,-24586,21655,-24592,21648,-24597,21642,-24603,21636,-24608,21629,-24614,21623,-24619,21617,-24625,21611,-24631,21604,-24636,21598,-24642,21592,-24647,21585,-24653,21579,-24658,21573,-24664,21566,-24669,21560,-24675,21554,-24680,21548,-24686,21541,-24691,21535,-24697,21529,-24702,21522,-24708,21516,-24713,21510,-24719,21503,-24724,21497,-24730,21491,-24735,21484,-24741,21478,-24746,21472,-24752,21465,-24757,21459,-24763,21453,-24768,21446,-24774,21440,-24779,21434,-24785,21427,-24790,21421,-24796,21415,-24801,21408,-24806,21402,-24812,21396,-24817,21389,-24823,21383,-24828,21377,-24834,21370,-24839,21364,-24845,21358,-24850,21351,-24856,21345,-24861,21339,-24867,21332,-24872,21326,-24878,21319,-24883,21313,-24888,21307,-24894,21300,-24899,21294,-24905,21288,-24910,21281,-24916,21275,-24921,21268,-24927,21262,-24932,21256,-24937,21249,-24943,21243,-24948,21237,-24954,21230,-24959,21224,-24965,21217,-24970,21211,-24975,21205,-24981,21198,-24986,21192,-24992,21186,-24997,21179,-25002,21173,-25008,21166,-25013,21160,-25019,21154,-25024,21147,-25030,21141,-25035,21134,-25040,21128,-25046,21122,-25051,21115,-25057,21109,-25062,21102,-25067,21096,-25073,21090,-25078,21083,-25084,21077,-25089,21070,-25094,21064,-25100,21057,-25105,21051,-25110,21045,-25116,21038,-25121,21032,-25127,21025,-25132,21019,-25137,21012,-25143,21006,-25148,21000,-25153,20993,-25159,20987,-25164,20980,-25170,20974,-25175,20967,-25180,20961,-25186,20955,-25191,20948,-25196,20942,-25202,20935,-25207,20929,-25212,20922,-25218,20916,-25223,20909,-25228,20903,-25234,20897,-25239,20890,-25244,20884,-25250,20877,-25255,20871,-25261,20864,-25266,20858,-25271,20851,-25277,20845,-25282,20838,-25287,20832,-25292,20825,-25298,20819,-25303,20813,-25308,20806,-25314,20800,-25319,20793,-25324,20787,-25330,20780,-25335,20774,-25340,20767,-25346,20761,-25351,20754,-25356,20748,-25362,20741,-25367,20735,-25372,20728,-25377,20722,-25383,20715,-25388,20709,-25393,20702,-25399,20696,-25404,20689,-25409,20683,-25415,20676,-25420,20670,-25425,20663,-25430,20657,-25436,20650,-25441,20644,-25446,20637,-25452,20631,-25457,20624,-25462,20618,-25467,20611,-25473,20605,-25478,20598,-25483,20592,-25488,20585,-25494,20579,-25499,20572,-25504,20566,-25509,20559,-25515,20553,-25520,20546,-25525,20540,-25530,20533,-25536,20527,-25541,20520,-25546,20513,-25551,20507,-25557,20500,-25562,20494,-25567,20487,-25572,20481,-25578,20474,-25583,20468,-25588,20461,-25593,20455,-25599,20448,-25604,20442,-25609,20435,-25614,20428,-25620,20422,-25625,20415,-25630,20409,-25635,20402,-25640,20396,-25646,20389,-25651,20383,-25656,20376,-25661,20369,-25666,20363,-25672,20356,-25677,20350,-25682,20343,-25687,20337,-25692,20330,-25698,20323,-25703,20317,-25708,20310,-25713,20304,-25718,20297,-25724,20291,-25729,20284,-25734,20277,-25739,20271,-25744,20264,-25750,20258,-25755,20251,-25760,20245,-25765,20238,-25770,20231,-25775,20225,-25781,20218,-25786,20212,-25791,20205,-25796,20198,-25801,20192,-25806,20185,-25812,20179,-25817,20172,-25822,20165,-25827,20159,-25832,20152,-25837,20146,-25843,20139,-25848,20132,-25853,20126,-25858,20119,-25863,20113,-25868,20106,-25873,20099,-25879,20093,-25884,20086,-25889,20079,-25894,20073,-25899,20066,-25904,20060,-25909,20053,-25914,20046,-25920,20040,-25925,20033,-25930,20026,-25935,20020,-25940,20013,-25945,20007,-25950,20000,-25955,19993,-25961,19987,-25966,19980,-25971,19973,-25976,19967,-25981,19960,-25986,19953,-25991,19947,-25996,19940,-26001,19933,-26007,19927,-26012,19920,-26017,19914,-26022,19907,-26027,19900,-26032,19894,-26037,19887,-26042,19880,-26047,19874,-26052,19867,-26057,19860,-26062,19854,-26068,19847,-26073,19840,-26078,19834,-26083,19827,-26088,19820,-26093,19814,-26098,19807,-26103,19800,-26108,19794,-26113,19787,-26118,19780,-26123,19774,-26128,19767,-26133,19760,-26138,19754,-26143,19747,-26149,19740,-26154,19733,-26159,19727,-26164,19720,-26169,19713,-26174,19707,-26179,19700,-26184,19693,-26189,19687,-26194,19680,-26199,19673,-26204,19667,-26209,19660,-26214,19653,-26219,19646,-26224,19640,-26229,19633,-26234,19626,-26239,19620,-26244,19613,-26249,19606,-26254,19599,-26259,19593,-26264,19586,-26269,19579,-26274,19573,-26279,19566,-26284,19559,-26289,19552,-26294,19546,-26299,19539,-26304,19532,-26309,19526,-26314,19519,-26319,19512,-26324,19505,-26329,19499,-26334,19492,-26339,19485,-26344,19478,-26349,19472,-26354,19465,-26359,19458,-26364,19451,-26369,19445,-26374,19438,-26379,19431,-26384,19424,-26389,19418,-26394,19411,-26399,19404,-26404,19397,-26409,19391,-26414,19384,-26419,19377,-26424,19370,-26429,19364,-26434,19357,-26438,19350,-26443,19343,-26448,19337,-26453,19330,-26458,19323,-26463,19316,-26468,19310,-26473,19303,-26478,19296,-26483,19289,-26488,19282,-26493,19276,-26498,19269,-26503,19262,-26508,19255,-26513,19249,-26517,19242,-26522,19235,-26527,19228,-26532,19221,-26537,19215,-26542,19208,-26547,19201,-26552,19194,-26557,19188,-26562,19181,-26567,19174,-26571,19167,-26576,19160,-26581,19154,-26586,19147,-26591,19140,-26596,19133,-26601,19126,-26606,19120,-26611,19113,-26616,19106,-26620,19099,-26625,19092,-26630,19086,-26635,19079,-26640,19072,-26645,19065,-26650,19058,-26655,19051,-26659,19045,-26664,19038,-26669,19031,-26674,19024,-26679,19017,-26684,19011,-26689,19004,-26693,18997,-26698,18990,-26703,18983,-26708,18976,-26713,18970,-26718,18963,-26723,18956,-26727,18949,-26732,18942,-26737,18935,-26742,18929,-26747,18922,-26752,18915,-26756,18908,-26761,18901,-26766,18894,-26771,18888,-26776,18881,-26781,18874,-26785,18867,-26790,18860,-26795,18853,-26800,18846,-26805,18840,-26810,18833,-26814,18826,-26819,18819,-26824,18812,-26829,18805,-26834,18798,-26838,18792,-26843,18785,-26848,18778,-26853,18771,-26858,18764,-26862,18757,-26867,18750,-26872,18744,-26877,18737,-26882,18730,-26886,18723,-26891,18716,-26896,18709,-26901,18702,-26906,18695,-26910,18689,-26915,18682,-26920,18675,-26925,18668,-26929,18661,-26934,18654,-26939,18647,-26944,18640,-26949,18633,-26953,18627,-26958,18620,-26963,18613,-26968,18606,-26972,18599,-26977,18592,-26982,18585,-26987,18578,-26991,18571,-26996,18564,-27001,18558,-27006,18551,-27010,18544,-27015,18537,-27020,18530,-27025,18523,-27029,18516,-27034,18509,-27039,18502,-27043,18495,-27048,18488,-27053,18482,-27058,18475,-27062,18468,-27067,18461,-27072,18454,-27077,18447,-27081,18440,-27086,18433,-27091,18426,-27095,18419,-27100,18412,-27105,18405,-27110,18398,-27114,18392,-27119,18385,-27124,18378,-27128,18371,-27133,18364,-27138,18357,-27142,18350,-27147,18343,-27152,18336,-27157,18329,-27161,18322,-27166,18315,-27171,18308,-27175,18301,-27180,18294,-27185,18287,-27189,18280,-27194,18273,-27199,18267,-27203,18260,-27208,18253,-27213,18246,-27217,18239,-27222,18232,-27227,18225,-27231,18218,-27236,18211,-27241,18204,-27245,18197,-27250,18190,-27255,18183,-27259,18176,-27264,18169,-27269,18162,-27273,18155,-27278,18148,-27282,18141,-27287,18134,-27292,18127,-27296,18120,-27301,18113,-27306,18106,-27310,18099,-27315,18092,-27320,18085,-27324,18078,-27329,18071,-27333,18064,-27338,18057,-27343,18050,-27347,18043,-27352,18036,-27356,18029,-27361,18022,-27366,18015,-27370,18008,-27375,18001,-27379,17994,-27384,17987,-27389,17980,-27393,17973,-27398,17966,-27402,17959,-27407,17952,-27412,17945,-27416,17938,-27421,17931,-27425,17924,-27430,17917,-27435,17910,-27439,17903,-27444,17896,-27448,17889,-27453,17882,-27457,17875,-27462,17868,-27467,17861,-27471,17854,-27476,17847,-27480,17840,-27485,17833,-27489,17826,-27494,17819,-27499,17812,-27503,17805,-27508,17798,-27512,17791,-27517,17784,-27521,17777,-27526,17770,-27530,17763,-27535,17756,-27539,17749,-27544,17742,-27549,17735,-27553,17727,-27558,17720,-27562,17713,-27567,17706,-27571,17699,-27576,17692,-27580,17685,-27585,17678,-27589,17671,-27594,17664,-27598,17657,-27603,17650,-27607,17643,-27612,17636,-27616,17629,-27621,17622,-27625,17615,-27630,17608,-27634,17600,-27639,17593,-27643,17586,-27648,17579,-27652,17572,-27657,17565,-27661,17558,-27666,17551,-27670,17544,-27675,17537,-27679,17530,-27684,17523,-27688,17516,-27693,17509,-27697,17501,-27702,17494,-27706,17487,-27711,17480,-27715,17473,-27720,17466,-27724,17459,-27729,17452,-27733,17445,-27737,17438,-27742,17431,-27746,17423,-27751,17416,-27755,17409,-27760,17402,-27764,17395,-27769,17388,-27773,17381,-27778,17374,-27782,17367,-27786,17360,-27791,17352,-27795,17345,-27800,17338,-27804,17331,-27809,17324,-27813,17317,-27817,17310,-27822,17303,-27826,17296,-27831,17288,-27835,17281,-27840,17274,-27844,17267,-27848,17260,-27853,17253,-27857,17246,-27862,17239,-27866,17232,-27870,17224,-27875,17217,-27879,17210,-27884,17203,-27888,17196,-27892,17189,-27897,17182,-27901,17174,-27906,17167,-27910,17160,-27914,17153,-27919,17146,-27923,17139,-27928,17132,-27932,17124,-27936,17117,-27941,17110,-27945,17103,-27949,17096,-27954,17089,-27958,17082,-27963,17074,-27967,17067,-27971,17060,-27976,17053,-27980,17046,-27984,17039,-27989,17032,-27993,17024,-27997,17017,-28002,17010,-28006,17003,-28010,16996,-28015,16989,-28019,16981,-28024,16974,-28028,16967,-28032,16960,-28037,16953,-28041,16946,-28045,16938,-28050,16931,-28054,16924,-28058,16917,-28063,16910,-28067,16903,-28071,16895,-28076,16888,-28080,16881,-28084,16874,-28088,16867,-28093,16859,-28097,16852,-28101,16845,-28106,16838,-28110,16831,-28114,16824,-28119,16816,-28123,16809,-28127,16802,-28132,16795,-28136,16788,-28140,16780,-28144,16773,-28149,16766,-28153,16759,-28157,16752,-28162,16744,-28166,16737,-28170,16730,-28174,16723,-28179,16716,-28183,16708,-28187,16701,-28191,16694,-28196,16687,-28200,16680,-28204,16672,-28209,16665,-28213,16658,-28217,16651,-28221,16643,-28226,16636,-28230,16629,-28234,16622,-28238,16615,-28243,16607,-28247,16600,-28251,16593,-28255,16586,-28260,16578,-28264,16571,-28268,16564,-28272,16557,-28276,16550,-28281,16542,-28285,16535,-28289,16528,-28293,16521,-28298,16513,-28302,16506,-28306,16499,-28310,16492,-28315,16484,-28319,16477,-28323,16470,-28327,16463,-28331,16455,-28336,16448,-28340,16441,-28344,16434,-28348,16427,-28352,16419,-28357,16412,-28361,16405,-28365,16398,-28369,16390,-28373,16383,-28378,16376,-28382,16368,-28386,16361,-28390,16354,-28394,16347,-28398,16339,-28403,16332,-28407,16325,-28411,16318,-28415,16310,-28419,16303,-28424,16296,-28428,16289,-28432,16281,-28436,16274,-28440,16267,-28444,16260,-28448,16252,-28453,16245,-28457,16238,-28461,16230,-28465,16223,-28469,16216,-28473,16209,-28478,16201,-28482,16194,-28486,16187,-28490,16179,-28494,16172,-28498,16165,-28502,16158,-28507,16150,-28511,16143,-28515,16136,-28519,16128,-28523,16121,-28527,16114,-28531,16107,-28535,16099,-28539,16092,-28544,16085,-28548,16077,-28552,16070,-28556,16063,-28560,16055,-28564,16048,-28568,16041,-28572,16034,-28576,16026,-28581,16019,-28585,16012,-28589,16004,-28593,15997,-28597,15990,-28601,15982,-28605,15975,-28609,15968,-28613,15960,-28617,15953,-28621,15946,-28626,15938,-28630,15931,-28634,15924,-28638,15917,-28642,15909,-28646,15902,-28650,15895,-28654,15887,-28658,15880,-28662,15873,-28666,15865,-28670,15858,-28674,15851,-28678,15843,-28682,15836,-28686,15829,-28691,15821,-28695,15814,-28699,15807,-28703,15799,-28707,15792,-28711,15785,-28715,15777,-28719,15770,-28723,15763,-28727,15755,-28731,15748,-28735,15740,-28739,15733,-28743,15726,-28747,15718,-28751,15711,-28755,15704,-28759,15696,-28763,15689,-28767,15682,-28771,15674,-28775,15667,-28779,15660,-28783,15652,-28787,15645,-28791,15638,-28795,15630,-28799,15623,-28803,15615,-28807,15608,-28811,15601,-28815,15593,-28819,15586,-28823,15579,-28827,15571,-28831,15564,-28835,15556,-28839,15549,-28843,15542,-28847,15534,-28851,15527,-28855,15520,-28859,15512,-28863,15505,-28867,15497,-28871,15490,-28875,15483,-28879,15475,-28883,15468,-28887,15461,-28891,15453,-28894,15446,-28898,15438,-28902,15431,-28906,15424,-28910,15416,-28914,15409,-28918,15401,-28922,15394,-28926,15387,-28930,15379,-28934,15372,-28938,15364,-28942,15357,-28946,15350,-28950,15342,-28954,15335,-28957,15327,-28961,15320,-28965,15313,-28969,15305,-28973,15298,-28977,15290,-28981,15283,-28985,15276,-28989,15268,-28993,15261,-28997,15253,-29000,15246,-29004,15238,-29008,15231,-29012,15224,-29016,15216,-29020,15209,-29024,15201,-29028,15194,-29032,15187,-29035,15179,-29039,15172,-29043,15164,-29047,15157,-29051,15149,-29055,15142,-29059,15135,-29063,15127,-29066,15120,-29070,15112,-29074,15105,-29078,15097,-29082,15090,-29086,15083,-29090,15075,-29093,15068,-29097,15060,-29101,15053,-29105,15045,-29109,15038,-29113,15030,-29117,15023,-29120,15016,-29124,15008,-29128,15001,-29132,14993,-29136,14986,-29140,14978,-29143,14971,-29147,14963,-29151,14956,-29155,14949,-29159,14941,-29163,14934,-29166,14926,-29170,14919,-29174,14911,-29178,14904,-29182,14896,-29185,14889,-29189,14881,-29193,14874,-29197,14866,-29201,14859,-29204,14852,-29208,14844,-29212,14837,-29216,14829,-29220,14822,-29223,14814,-29227,14807,-29231,14799,-29235,14792,-29239,14784,-29242,14777,-29246,14769,-29250,14762,-29254,14754,-29257,14747,-29261,14739,-29265,14732,-29269,14724,-29273,14717,-29276,14709,-29280,14702,-29284,14694,-29288,14687,-29291,14680,-29295,14672,-29299,14665,-29303,14657,-29306,14650,-29310,14642,-29314,14635,-29318,14627,-29321,14620,-29325,14612,-29329,14605,-29333,14597,-29336,14590,-29340,14582,-29344,14575,-29347,14567,-29351,14560,-29355,14552,-29359,14545,-29362,14537,-29366,14530,-29370,14522,-29373,14515,-29377,14507,-29381,14499,-29385,14492,-29388,14484,-29392,14477,-29396,14469,-29399,14462,-29403,14454,-29407,14447,-29411,14439,-29414,14432,-29418,14424,-29422,14417,-29425,14409,-29429,14402,-29433,14394,-29436,14387,-29440,14379,-29444,14372,-29447,14364,-29451,14357,-29455,14349,-29458,14342,-29462,14334,-29466,14326,-29469,14319,-29473,14311,-29477,14304,-29480,14296,-29484,14289,-29488,14281,-29491,14274,-29495,14266,-29499,14259,-29502,14251,-29506,14244,-29510,14236,-29513,14228,-29517,14221,-29520,14213,-29524,14206,-29528,14198,-29531,14191,-29535,14183,-29539,14176,-29542,14168,-29546,14160,-29549,14153,-29553,14145,-29557,14138,-29560,14130,-29564,14123,-29568,14115,-29571,14108,-29575,14100,-29578,14092,-29582,14085,-29586,14077,-29589,14070,-29593,14062,-29596,14055,-29600,14047,-29604,14039,-29607,14032,-29611,14024,-29614,14017,-29618,14009,-29622,14002,-29625,13994,-29629,13986,-29632,13979,-29636,13971,-29639,13964,-29643,13956,-29647,13949,-29650,13941,-29654,13933,-29657,13926,-29661,13918,-29664,13911,-29668,13903,-29671,13895,-29675,13888,-29679,13880,-29682,13873,-29686,13865,-29689,13858,-29693,13850,-29696,13842,-29700,13835,-29703,13827,-29707,13820,-29710,13812,-29714,13804,-29718,13797,-29721,13789,-29725,13782,-29728,13774,-29732,13766,-29735,13759,-29739,13751,-29742,13744,-29746,13736,-29749,13728,-29753,13721,-29756,13713,-29760,13706,-29763,13698,-29767,13690,-29770,13683,-29774,13675,-29777,13667,-29781,13660,-29784,13652,-29788,13645,-29791,13637,-29795,13629,-29798,13622,-29802,13614,-29805,13607,-29809,13599,-29812,13591,-29816,13584,-29819,13576,-29823,13568,-29826,13561,-29829,13553,-29833,13546,-29836,13538,-29840,13530,-29843,13523,-29847,13515,-29850,13507,-29854,13500,-29857,13492,-29861,13485,-29864,13477,-29867,13469,-29871,13462,-29874,13454,-29878,13446,-29881,13439,-29885,13431,-29888,13423,-29892,13416,-29895,13408,-29898,13400,-29902,13393,-29905,13385,-29909,13378,-29912,13370,-29916,13362,-29919,13355,-29922,13347,-29926,13339,-29929,13332,-29933,13324,-29936,13316,-29939,13309,-29943,13301,-29946,13293,-29950,13286,-29953,13278,-29956,13270,-29960,13263,-29963,13255,-29967,13247,-29970,13240,-29973,13232,-29977,13224,-29980,13217,-29984,13209,-29987,13201,-29990,13194,-29994,13186,-29997,13178,-30000,13171,-30004,13163,-30007,13155,-30010,13148,-30014,13140,-30017,13132,-30021,13125,-30024,13117,-30027,13109,-30031,13102,-30034,13094,-30037,13086,-30041,13079,-30044,13071,-30047,13063,-30051,13056,-30054,13048,-30057,13040,-30061,13033,-30064,13025,-30067,13017,-30071,13009,-30074,13002,-30077,12994,-30081,12986,-30084,12979,-30087,12971,-30091,12963,-30094,12956,-30097,12948,-30101,12940,-30104,12933,-30107,12925,-30110,12917,-30114,12909,-30117,12902,-30120,12894,-30124,12886,-30127,12879,-30130,12871,-30134,12863,-30137,12856,-30140,12848,-30143,12840,-30147,12832,-30150,12825,-30153,12817,-30157,12809,-30160,12802,-30163,12794,-30166,12786,-30170,12778,-30173,12771,-30176,12763,-30179,12755,-30183,12748,-30186,12740,-30189,12732,-30192,12724,-30196,12717,-30199,12709,-30202,12701,-30206,12694,-30209,12686,-30212,12678,-30215,12670,-30218,12663,-30222,12655,-30225,12647,-30228,12639,-30231,12632,-30235,12624,-30238,12616,-30241,12609,-30244,12601,-30248,12593,-30251,12585,-30254,12578,-30257,12570,-30260,12562,-30264,12554,-30267,12547,-30270,12539,-30273,12531,-30276,12523,-30280,12516,-30283,12508,-30286,12500,-30289,12492,-30292,12485,-30296,12477,-30299,12469,-30302,12461,-30305,12454,-30308,12446,-30312,12438,-30315,12430,-30318,12423,-30321,12415,-30324,12407,-30327,12399,-30331,12392,-30334,12384,-30337,12376,-30340,12368,-30343,12361,-30346,12353,-30350,12345,-30353,12337,-30356,12330,-30359,12322,-30362,12314,-30365,12306,-30369,12299,-30372,12291,-30375,12283,-30378,12275,-30381,12268,-30384,12260,-30387,12252,-30391,12244,-30394,12236,-30397,12229,-30400,12221,-30403,12213,-30406,12205,-30409,12198,-30412,12190,-30416,12182,-30419,12174,-30422,12166,-30425,12159,-30428,12151,-30431,12143,-30434,12135,-30437,12128,-30440,12120,-30443,12112,-30447,12104,-30450,12096,-30453,12089,-30456,12081,-30459,12073,-30462,12065,-30465,12057,-30468,12050,-30471,12042,-30474,12034,-30477,12026,-30481,12019,-30484,12011,-30487,12003,-30490,11995,-30493,11987,-30496,11980,-30499,11972,-30502,11964,-30505,11956,-30508,11948,-30511,11941,-30514,11933,-30517,11925,-30520,11917,-30523,11909,-30526,11902,-30529,11894,-30533,11886,-30536,11878,-30539,11870,-30542,11862,-30545,11855,-30548,11847,-30551,11839,-30554,11831,-30557,11823,-30560,11816,-30563,11808,-30566,11800,-30569,11792,-30572,11784,-30575,11777,-30578,11769,-30581,11761,-30584,11753,-30587,11745,-30590,11737,-30593,11730,-30596,11722,-30599,11714,-30602,11706,-30605,11698,-30608,11691,-30611,11683,-30614,11675,-30617,11667,-30620,11659,-30623,11651,-30626,11644,-30629,11636,-30632,11628,-30635,11620,-30638,11612,-30641,11604,-30644,11597,-30647,11589,-30650,11581,-30653,11573,-30656,11565,-30658,11557,-30661,11550,-30664,11542,-30667,11534,-30670,11526,-30673,11518,-30676,11510,-30679,11502,-30682,11495,-30685,11487,-30688,11479,-30691,11471,-30694,11463,-30697,11455,-30700,11448,-30703,11440,-30706,11432,-30708,11424,-30711,11416,-30714,11408,-30717,11400,-30720,11393,-30723,11385,-30726,11377,-30729,11369,-30732,11361,-30735,11353,-30738,11345,-30740,11338,-30743,11330,-30746,11322,-30749,11314,-30752,11306,-30755,11298,-30758,11290,-30761,11283,-30764,11275,-30767,11267,-30769,11259,-30772,11251,-30775,11243,-30778,11235,-30781,11227,-30784,11220,-30787,11212,-30789,11204,-30792,11196,-30795,11188,-30798,11180,-30801,11172,-30804,11164,-30807,11157,-30810,11149,-30812,11141,-30815,11133,-30818,11125,-30821,11117,-30824,11109,-30827,11101,-30829,11094,-30832,11086,-30835,11078,-30838,11070,-30841,11062,-30844,11054,-30846,11046,-30849,11038,-30852,11030,-30855,11023,-30858,11015,-30861,11007,-30863,10999,-30866,10991,-30869,10983,-30872,10975,-30875,10967,-30877,10959,-30880,10952,-30883,10944,-30886,10936,-30889,10928,-30891,10920,-30894,10912,-30897,10904,-30900,10896,-30903,10888,-30905,10880,-30908,10873,-30911,10865,-30914,10857,-30916,10849,-30919,10841,-30922,10833,-30925,10825,-30928,10817,-30930,10809,-30933,10801,-30936,10794,-30939,10786,-30941,10778,-30944,10770,-30947,10762,-30950,10754,-30952,10746,-30955,10738,-30958,10730,-30961,10722,-30963,10714,-30966,10706,-30969,10699,-30972,10691,-30974,10683,-30977,10675,-30980,10667,-30982,10659,-30985,10651,-30988,10643,-30991,10635,-30993,10627,-30996,10619,-30999,10611,-31002,10603,-31004,10596,-31007,10588,-31010,10580,-31012,10572,-31015,10564,-31018,10556,-31020,10548,-31023,10540,-31026,10532,-31029,10524,-31031,10516,-31034,10508,-31037,10500,-31039,10492,-31042,10484,-31045,10477,-31047,10469,-31050,10461,-31053,10453,-31055,10445,-31058,10437,-31061,10429,-31063,10421,-31066,10413,-31069,10405,-31071,10397,-31074,10389,-31077,10381,-31079,10373,-31082,10365,-31085,10357,-31087,10349,-31090,10342,-31093,10334,-31095,10326,-31098,10318,-31101,10310,-31103,10302,-31106,10294,-31108,10286,-31111,10278,-31114,10270,-31116,10262,-31119,10254,-31122,10246,-31124,10238,-31127,10230,-31129,10222,-31132,10214,-31135,10206,-31137,10198,-31140,10190,-31142,10182,-31145,10174,-31148,10166,-31150,10159,-31153,10151,-31155,10143,-31158,10135,-31161,10127,-31163,10119,-31166,10111,-31168,10103,-31171,10095,-31174,10087,-31176,10079,-31179,10071,-31181,10063,-31184,10055,-31186,10047,-31189,10039,-31192,10031,-31194,10023,-31197,10015,-31199,10007,-31202,9999,-31204,9991,-31207,9983,-31210,9975,-31212,9967,-31215,9959,-31217,9951,-31220,9943,-31222,9935,-31225,9927,-31227,9919,-31230,9911,-31232,9903,-31235,9895,-31237,9887,-31240,9879,-31243,9871,-31245,9863,-31248,9855,-31250,9847,-31253,9839,-31255,9831,-31258,9823,-31260,9815,-31263,9807,-31265,9799,-31268,9791,-31270,9783,-31273,9775,-31275,9767,-31278,9759,-31280,9751,-31283,9743,-31285,9735,-31288,9727,-31290,9719,-31293,9711,-31295,9703,-31298,9695,-31300,9687,-31303,9679,-31305,9671,-31308,9663,-31310,9655,-31312,9647,-31315,9639,-31317,9631,-31320,9623,-31322,9615,-31325,9607,-31327,9599,-31330,9591,-31332,9583,-31335,9575,-31337,9567,-31339,9559,-31342,9551,-31344,9543,-31347,9535,-31349,9527,-31352,9519,-31354,9511,-31357,9503,-31359,9495,-31361,9487,-31364,9479,-31366,9471,-31369,9463,-31371,9455,-31374,9447,-31376,9439,-31378,9431,-31381,9423,-31383,9415,-31386,9407,-31388,9399,-31390,9391,-31393,9383,-31395,9375,-31398,9367,-31400,9359,-31402,9351,-31405,9343,-31407,9335,-31410,9327,-31412,9319,-31414,9311,-31417,9303,-31419,9295,-31421,9287,-31424,9279,-31426,9270,-31429,9262,-31431,9254,-31433,9246,-31436,9238,-31438,9230,-31440,9222,-31443,9214,-31445,9206,-31447,9198,-31450,9190,-31452,9182,-31455,9174,-31457,9166,-31459,9158,-31462,9150,-31464,9142,-31466,9134,-31469,9126,-31471,9118,-31473,9110,-31476,9102,-31478,9094,-31480,9086,-31483,9077,-31485,9069,-31487,9061,-31490,9053,-31492,9045,-31494,9037,-31496,9029,-31499,9021,-31501,9013,-31503,9005,-31506,8997,-31508,8989,-31510,8981,-31513,8973,-31515,8965,-31517,8957,-31519,8949,-31522,8941,-31524,8932,-31526,8924,-31529,8916,-31531,8908,-31533,8900,-31535,8892,-31538,8884,-31540,8876,-31542,8868,-31545,8860,-31547,8852,-31549,8844,-31551,8836,-31554,8828,-31556,8820,-31558,8812,-31560,8803,-31563,8795,-31565,8787,-31567,8779,-31569,8771,-31572,8763,-31574,8755,-31576,8747,-31578,8739,-31581,8731,-31583,8723,-31585,8715,-31587,8707,-31589,8699,-31592,8690,-31594,8682,-31596,8674,-31598,8666,-31601,8658,-31603,8650,-31605,8642,-31607,8634,-31609,8626,-31612,8618,-31614,8610,-31616,8602,-31618,8593,-31620,8585,-31623,8577,-31625,8569,-31627,8561,-31629,8553,-31631,8545,-31634,8537,-31636,8529,-31638,8521,-31640,8513,-31642,8504,-31644,8496,-31647,8488,-31649,8480,-31651,8472,-31653,8464,-31655,8456,-31657,8448,-31660,8440,-31662,8432,-31664,8424,-31666,8415,-31668,8407,-31670,8399,-31673,8391,-31675,8383,-31677,8375,-31679,8367,-31681,8359,-31683,8351,-31685,8343,-31688,8334,-31690,8326,-31692,8318,-31694,8310,-31696,8302,-31698,8294,-31700,8286,-31702,8278,-31705,8270,-31707,8262,-31709,8253,-31711,8245,-31713,8237,-31715,8229,-31717,8221,-31719,8213,-31721,8205,-31724,8197,-31726,8189,-31728,8180,-31730,8172,-31732,8164,-31734,8156,-31736,8148,-31738,8140,-31740,8132,-31742,8124,-31744,8116,-31746,8107,-31749,8099,-31751,8091,-31753,8083,-31755,8075,-31757,8067,-31759,8059,-31761,8051,-31763,8042,-31765,8034,-31767,8026,-31769,8018,-31771,8010,-31773,8002,-31775,7994,-31777,7986,-31779,7977,-31781,7969,-31783,7961,-31786,7953,-31788,7945,-31790,7937,-31792,7929,-31794,7921,-31796,7912,-31798,7904,-31800,7896,-31802,7888,-31804,7880,-31806,7872,-31808,7864,-31810,7856,-31812,7847,-31814,7839,-31816,7831,-31818,7823,-31820,7815,-31822,7807,-31824,7799,-31826,7790,-31828,7782,-31830,7774,-31832,7766,-31834,7758,-31836,7750,-31838,7742,-31840,7733,-31842,7725,-31844,7717,-31846,7709,-31848,7701,-31850,7693,-31852,7685,-31854,7676,-31855,7668,-31857,7660,-31859,7652,-31861,7644,-31863,7636,-31865,7628,-31867,7619,-31869,7611,-31871,7603,-31873,7595,-31875,7587,-31877,7579,-31879,7571,-31881,7562,-31883,7554,-31885,7546,-31887,7538,-31889,7530,-31890,7522,-31892,7514,-31894,7505,-31896,7497,-31898,7489,-31900,7481,-31902,7473,-31904,7465,-31906,7456,-31908,7448,-31910,7440,-31912,7432,-31913,7424,-31915,7416,-31917,7407,-31919,7399,-31921,7391,-31923,7383,-31925,7375,-31927,7367,-31929,7358,-31930,7350,-31932,7342,-31934,7334,-31936,7326,-31938,7318,-31940,7310,-31942,7301,-31944,7293,-31945,7285,-31947,7277,-31949,7269,-31951,7261,-31953,7252,-31955,7244,-31957,7236,-31958,7228,-31960,7220,-31962,7211,-31964,7203,-31966,7195,-31968,7187,-31969,7179,-31971,7171,-31973,7162,-31975,7154,-31977,7146,-31979,7138,-31980,7130,-31982,7122,-31984,7113,-31986,7105,-31988,7097,-31990,7089,-31991,7081,-31993,7072,-31995,7064,-31997,7056,-31999,7048,-32000,7040,-32002,7032,-32004,7023,-32006,7015,-32008,7007,-32009,6999,-32011,6991,-32013,6982,-32015,6974,-32017,6966,-32018,6958,-32020,6950,-32022,6942,-32024,6933,-32025,6925,-32027,6917,-32029,6909,-32031,6901,-32033,6892,-32034,6884,-32036,6876,-32038,6868,-32040,6860,-32041,6851,-32043,6843,-32045,6835,-32047,6827,-32048,6819,-32050,6811,-32052,6802,-32054,6794,-32055,6786,-32057,6778,-32059,6770,-32060,6761,-32062,6753,-32064,6745,-32066,6737,-32067,6729,-32069,6720,-32071,6712,-32073,6704,-32074,6696,-32076,6688,-32078,6679,-32079,6671,-32081,6663,-32083,6655,-32085,6647,-32086,6638,-32088,6630,-32090,6622,-32091,6614,-32093,6606,-32095,6597,-32096,6589,-32098,6581,-32100,6573,-32101,6564,-32103,6556,-32105,6548,-32106,6540,-32108,6532,-32110,6523,-32111,6515,-32113,6507,-32115,6499,-32116,6491,-32118,6482,-32120,6474,-32121,6466,-32123,6458,-32125,6450,-32126,6441,-32128,6433,-32130,6425,-32131,6417,-32133,6408,-32135,6400,-32136,6392,-32138,6384,-32140,6376,-32141,6367,-32143,6359,-32144,6351,-32146,6343,-32148,6334,-32149,6326,-32151,6318,-32153,6310,-32154,6302,-32156,6293,-32157,6285,-32159,6277,-32161,6269,-32162,6261,-32164,6252,-32165,6244,-32167,6236,-32169,6228,-32170,6219,-32172,6211,-32173,6203,-32175,6195,-32177,6186,-32178,6178,-32180,6170,-32181,6162,-32183,6154,-32184,6145,-32186,6137,-32188,6129,-32189,6121,-32191,6112,-32192,6104,-32194,6096,-32195,6088,-32197,6080,-32198,6071,-32200,6063,-32202,6055,-32203,6047,-32205,6038,-32206,6030,-32208,6022,-32209,6014,-32211,6005,-32212,5997,-32214,5989,-32215,5981,-32217,5972,-32219,5964,-32220,5956,-32222,5948,-32223,5940,-32225,5931,-32226,5923,-32228,5915,-32229,5907,-32231,5898,-32232,5890,-32234,5882,-32235,5874,-32237,5865,-32238,5857,-32240,5849,-32241,5841,-32243,5832,-32244,5824,-32246,5816,-32247,5808,-32249,5799,-32250,5791,-32252,5783,-32253,5775,-32255,5766,-32256,5758,-32257,5750,-32259,5742,-32260,5733,-32262,5725,-32263,5717,-32265,5709,-32266,5700,-32268,5692,-32269,5684,-32271,5676,-32272,5667,-32274,5659,-32275,5651,-32276,5643,-32278,5634,-32279,5626,-32281,5618,-32282,5610,-32284,5601,-32285,5593,-32287,5585,-32288,5577,-32289,5568,-32291,5560,-32292,5552,-32294,5544,-32295,5535,-32296,5527,-32298,5519,-32299,5511,-32301,5502,-32302,5494,-32304,5486,-32305,5478,-32306,5469,-32308,5461,-32309,5453,-32311,5445,-32312,5436,-32313,5428,-32315,5420,-32316,5411,-32317,5403,-32319,5395,-32320,5387,-32322,5378,-32323,5370,-32324,5362,-32326,5354,-32327,5345,-32328,5337,-32330,5329,-32331,5321,-32333,5312,-32334,5304,-32335,5296,-32337,5287,-32338,5279,-32339,5271,-32341,5263,-32342,5254,-32343,5246,-32345,5238,-32346,5230,-32347,5221,-32349,5213,-32350,5205,-32351,5197,-32353,5188,-32354,5180,-32355,5172,-32357,5163,-32358,5155,-32359,5147,-32361,5139,-32362,5130,-32363,5122,-32365,5114,-32366,5106,-32367,5097,-32369,5089,-32370,5081,-32371,5072,-32372,5064,-32374,5056,-32375,5048,-32376,5039,-32378,5031,-32379,5023,-32380,5014,-32381,5006,-32383,4998,-32384,4990,-32385,4981,-32387,4973,-32388,4965,-32389,4957,-32390,4948,-32392,4940,-32393,4932,-32394,4923,-32395,4915,-32397,4907,-32398,4899,-32399,4890,-32400,4882,-32402,4874,-32403,4865,-32404,4857,-32405,4849,-32407,4841,-32408,4832,-32409,4824,-32410,4816,-32412,4807,-32413,4799,-32414,4791,-32415,4783,-32417,4774,-32418,4766,-32419,4758,-32420,4749,-32421,4741,-32423,4733,-32424,4725,-32425,4716,-32426,4708,-32427,4700,-32429,4691,-32430,4683,-32431,4675,-32432,4666,-32433,4658,-32435,4650,-32436,4642,-32437,4633,-32438,4625,-32439,4617,-32441,4608,-32442,4600,-32443,4592,-32444,4584,-32445,4575,-32446,4567,-32448,4559,-32449,4550,-32450,4542,-32451,4534,-32452,4525,-32453,4517,-32455,4509,-32456,4501,-32457,4492,-32458,4484,-32459,4476,-32460,4467,-32461,4459,-32463,4451,-32464,4443,-32465,4434,-32466,4426,-32467,4418,-32468,4409,-32469,4401,-32471,4393,-32472,4384,-32473,4376,-32474,4368,-32475,4359,-32476,4351,-32477,4343,-32478,4335,-32479,4326,-32481,4318,-32482,4310,-32483,4301,-32484,4293,-32485,4285,-32486,4276,-32487,4268,-32488,4260,-32489,4252,-32490,4243,-32492,4235,-32493,4227,-32494,4218,-32495,4210,-32496,4202,-32497,4193,-32498,4185,-32499,4177,-32500,4168,-32501,4160,-32502,4152,-32503,4144,-32504,4135,-32505,4127,-32507,4119,-32508,4110,-32509,4102,-32510,4094,-32511,4085,-32512,4077,-32513,4069,-32514,4060,-32515,4052,-32516,4044,-32517,4035,-32518,4027,-32519,4019,-32520,4011,-32521,4002,-32522,3994,-32523,3986,-32524,3977,-32525,3969,-32526,3961,-32527,3952,-32528,3944,-32529,3936,-32530,3927,-32531,3919,-32532,3911,-32533,3902,-32534,3894,-32535,3886,-32536,3877,-32537,3869,-32538,3861,-32539,3853,-32540,3844,-32541,3836,-32542,3828,-32543,3819,-32544,3811,-32545,3803,-32546,3794,-32547,3786,-32548,3778,-32549,3769,-32550,3761,-32551,3753,-32552,3744,-32553,3736,-32554,3728,-32555,3719,-32556,3711,-32557,3703,-32558,3694,-32559,3686,-32559,3678,-32560,3669,-32561,3661,-32562,3653,-32563,3644,-32564,3636,-32565,3628,-32566,3619,-32567,3611,-32568,3603,-32569,3594,-32570,3586,-32571,3578,-32572,3570,-32572,3561,-32573,3553,-32574,3545,-32575,3536,-32576,3528,-32577,3520,-32578,3511,-32579,3503,-32580,3495,-32581,3486,-32581,3478,-32582,3470,-32583,3461,-32584,3453,-32585,3445,-32586,3436,-32587,3428,-32588,3420,-32589,3411,-32589,3403,-32590,3395,-32591,3386,-32592,3378,-32593,3370,-32594,3361,-32595,3353,-32595,3345,-32596,3336,-32597,3328,-32598,3320,-32599,3311,-32600,3303,-32601,3295,-32601,3286,-32602,3278,-32603,3270,-32604,3261,-32605,3253,-32606,3245,-32606,3236,-32607,3228,-32608,3220,-32609,3211,-32610,3203,-32611,3195,-32611,3186,-32612,3178,-32613,3170,-32614,3161,-32615,3153,-32615,3145,-32616,3136,-32617,3128,-32618,3120,-32619,3111,-32619,3103,-32620,3094,-32621,3086,-32622,3078,-32623,3069,-32623,3061,-32624,3053,-32625,3044,-32626,3036,-32626,3028,-32627,3019,-32628,3011,-32629,3003,-32630,2994,-32630,2986,-32631,2978,-32632,2969,-32633,2961,-32633,2953,-32634,2944,-32635,2936,-32636,2928,-32636,2919,-32637,2911,-32638,2903,-32639,2894,-32639,2886,-32640,2878,-32641,2869,-32642,2861,-32642,2853,-32643,2844,-32644,2836,-32645,2828,-32645,2819,-32646,2811,-32647,2802,-32647,2794,-32648,2786,-32649,2777,-32650,2769,-32650,2761,-32651,2752,-32652,2744,-32652,2736,-32653,2727,-32654,2719,-32654,2711,-32655,2702,-32656,2694,-32657,2686,-32657,2677,-32658,2669,-32659,2661,-32659,2652,-32660,2644,-32661,2636,-32661,2627,-32662,2619,-32663,2610,-32663,2602,-32664,2594,-32665,2585,-32665,2577,-32666,2569,-32667,2560,-32667,2552,-32668,2544,-32669,2535,-32669,2527,-32670,2519,-32671,2510,-32671,2502,-32672,2494,-32672,2485,-32673,2477,-32674,2468,-32674,2460,-32675,2452,-32676,2443,-32676,2435,-32677,2427,-32677,2418,-32678,2410,-32679,2402,-32679,2393,-32680,2385,-32681,2377,-32681,2368,-32682,2360,-32682,2352,-32683,2343,-32684,2335,-32684,2326,-32685,2318,-32685,2310,-32686,2301,-32687,2293,-32687,2285,-32688,2276,-32688,2268,-32689,2260,-32689,2251,-32690,2243,-32691,2235,-32691,2226,-32692,2218,-32692,2209,-32693,2201,-32693,2193,-32694,2184,-32695,2176,-32695,2168,-32696,2159,-32696,2151,-32697,2143,-32697,2134,-32698,2126,-32698,2117,-32699,2109,-32700,2101,-32700,2092,-32701,2084,-32701,2076,-32702,2067,-32702,2059,-32703,2051,-32703,2042,-32704,2034,-32704,2026,-32705,2017,-32705,2009,-32706,2000,-32706,1992,-32707,1984,-32707,1975,-32708,1967,-32708,1959,-32709,1950,-32709,1942,-32710,1934,-32710,1925,-32711,1917,-32711,1908,-32712,1900,-32712,1892,-32713,1883,-32713,1875,-32714,1867,-32714,1858,-32715,1850,-32715,1842,-32716,1833,-32716,1825,-32717,1816,-32717,1808,-32718,1800,-32718,1791,-32718,1783,-32719,1775,-32719,1766,-32720,1758,-32720,1750,-32721,1741,-32721,1733,-32722,1724,-32722,1716,-32723,1708,-32723,1699,-32723,1691,-32724,1683,-32724,1674,-32725,1666,-32725,1658,-32726,1649,-32726,1641,-32726,1632,-32727,1624,-32727,1616,-32728,1607,-32728,1599,-32728,1591,-32729,1582,-32729,1574,-32730,1565,-32730,1557,-32730,1549,-32731,1540,-32731,1532,-32732,1524,-32732,1515,-32732,1507,-32733,1499,-32733,1490,-32734,1482,-32734,1473,-32734,1465,-32735,1457,-32735,1448,-32735,1440,-32736,1432,-32736,1423,-32737,1415,-32737,1406,-32737,1398,-32738,1390,-32738,1381,-32738,1373,-32739,1365,-32739,1356,-32739,1348,-32740,1339,-32740,1331,-32740,1323,-32741,1314,-32741,1306,-32741,1298,-32742,1289,-32742,1281,-32742,1273,-32743,1264,-32743,1256,-32743,1247,-32744,1239,-32744,1231,-32744,1222,-32745,1214,-32745,1206,-32745,1197,-32746,1189,-32746,1180,-32746,1172,-32747,1164,-32747,1155,-32747,1147,-32747,1139,-32748,1130,-32748,1122,-32748,1113,-32749,1105,-32749,1097,-32749,1088,-32749,1080,-32750,1072,-32750,1063,-32750,1055,-32751,1046,-32751,1038,-32751,1030,-32751,1021,-32752,1013,-32752,1005,-32752,996,-32752,988,-32753,980,-32753,971,-32753,963,-32753,954,-32754,946,-32754,938,-32754,929,-32754,921,-32755,913,-32755,904,-32755,896,-32755,887,-32755,879,-32756,871,-32756,862,-32756,854,-32756,846,-32757,837,-32757,829,-32757,820,-32757,812,-32757,804,-32758,795,-32758,787,-32758,779,-32758,770,-32758,762,-32759,753,-32759,745,-32759,737,-32759,728,-32759,720,-32760,712,-32760,703,-32760,695,-32760,686,-32760,678,-32760,670,-32761,661,-32761,653,-32761,645,-32761,636,-32761,628,-32761,619,-32762,611,-32762,603,-32762,594,-32762,586,-32762,578,-32762,569,-32763,561,-32763,552,-32763,544,-32763,536,-32763,527,-32763,519,-32763,510,-32764,502,-32764,494,-32764,485,-32764,477,-32764,469,-32764,460,-32764,452,-32764,443,-32764,435,-32765,427,-32765,418,-32765,410,-32765,402,-32765,393,-32765,385,-32765,376,-32765,368,-32765,360,-32766,351,-32766,343,-32766,335,-32766,326,-32766,318,-32766,309,-32766,301,-32766,293,-32766,284,-32766,276,-32766,268,-32766,259,-32766,251,-32767,242,-32767,234,-32767,226,-32767,217,-32767,209,-32767,201,-32767,192,-32767,184,-32767,175,-32767,167,-32767,159,-32767,150,-32767,142,-32767,134,-32767,125,-32767,117,-32767,108,-32767,100,-32767,92,-32767,83,-32767,75,-32767,67,-32767,58,-32767,50,-32767,41,-32767,33,-32767,25,-32767,16,-32767,8,-32767,0,-32767,-9,-32767,-17,-32767,-26,-32767,-34,-32767,-42,-32767,-51,-32767,-59,-32767,-68,-32767,-76,-32767,-84,-32767,-93,-32767,-101,-32767,-109,-32767,-118,-32767,-126,-32767,-135,-32767,-143,-32767,-151,-32767,-160,-32767,-168,-32767,-176,-32767,-185,-32767,-193,-32767,-202,-32767,-210,-32767,-218,-32767,-227,-32767,-235,-32767,-243,-32767,-252,-32767,-260,-32766,-269,-32766,-277,-32766,-285,-32766,-294,-32766,-302,-32766,-310,-32766,-319,-32766,-327,-32766,-336,-32766,-344,-32766,-352,-32766,-361,-32766,-369,-32765,-377,-32765,-386,-32765,-394,-32765,-403,-32765,-411,-32765,-419,-32765,-428,-32765,-436,-32765,-444,-32764,-453,-32764,-461,-32764,-470,-32764,-478,-32764,-486,-32764,-495,-32764,-503,-32764,-511,-32764,-520,-32763,-528,-32763,-537,-32763,-545,-32763,-553,-32763,-562,-32763,-570,-32763,-579,-32762,-587,-32762,-595,-32762,-604,-32762,-612,-32762,-620,-32762,-629,-32761,-637,-32761,-646,-32761,-654,-32761,-662,-32761,-671,-32761,-679,-32760,-687,-32760,-696,-32760,-704,-32760,-713,-32760,-721,-32760,-729,-32759,-738,-32759,-746,-32759,-754,-32759,-763,-32759,-771,-32758,-780,-32758,-788,-32758,-796,-32758,-805,-32758,-813,-32757,-821,-32757,-830,-32757,-838,-32757,-847,-32757,-855,-32756,-863,-32756,-872,-32756,-880,-32756,-888,-32755,-897,-32755,-905,-32755,-914,-32755,-922,-32755,-930,-32754,-939,-32754,-947,-32754,-955,-32754,-964,-32753,-972,-32753,-981,-32753,-989,-32753,-997,-32752,-1006,-32752,-1014,-32752,-1022,-32752,-1031,-32751,-1039,-32751,-1047,-32751,-1056,-32751,-1064,-32750,-1073,-32750,-1081,-32750,-1089,-32749,-1098,-32749,-1106,-32749,-1114,-32749,-1123,-32748,-1131,-32748,-1140,-32748,-1148,-32747,-1156,-32747,-1165,-32747,-1173,-32747,-1181,-32746,-1190,-32746,-1198,-32746,-1207,-32745,-1215,-32745,-1223,-32745,-1232,-32744,-1240,-32744,-1248,-32744,-1257,-32743,-1265,-32743,-1274,-32743,-1282,-32742,-1290,-32742,-1299,-32742,-1307,-32741,-1315,-32741,-1324,-32741,-1332,-32740,-1340,-32740,-1349,-32740,-1357,-32739,-1366,-32739,-1374,-32739,-1382,-32738,-1391,-32738,-1399,-32738,-1407,-32737,-1416,-32737,-1424,-32737,-1433,-32736,-1441,-32736,-1449,-32735,-1458,-32735,-1466,-32735,-1474,-32734,-1483,-32734,-1491,-32734,-1500,-32733,-1508,-32733,-1516,-32732,-1525,-32732,-1533,-32732,-1541,-32731,-1550,-32731,-1558,-32730,-1566,-32730,-1575,-32730,-1583,-32729,-1592,-32729,-1600,-32728,-1608,-32728,-1617,-32728,-1625,-32727,-1633,-32727,-1642,-32726,-1650,-32726,-1659,-32726,-1667,-32725,-1675,-32725,-1684,-32724,-1692,-32724,-1700,-32723,-1709,-32723,-1717,-32723,-1725,-32722,-1734,-32722,-1742,-32721,-1751,-32721,-1759,-32720,-1767,-32720,-1776,-32719,-1784,-32719,-1792,-32718,-1801,-32718,-1809,-32718,-1817,-32717,-1826,-32717,-1834,-32716,-1843,-32716,-1851,-32715,-1859,-32715,-1868,-32714,-1876,-32714,-1884,-32713,-1893,-32713,-1901,-32712,-1909,-32712,-1918,-32711,-1926,-32711,-1935,-32710,-1943,-32710,-1951,-32709,-1960,-32709,-1968,-32708,-1976,-32708,-1985,-32707,-1993,-32707,-2001,-32706,-2010,-32706,-2018,-32705,-2027,-32705,-2035,-32704,-2043,-32704,-2052,-32703,-2060,-32703,-2068,-32702,-2077,-32702,-2085,-32701,-2093,-32701,-2102,-32700,-2110,-32700,-2118,-32699,-2127,-32698,-2135,-32698,-2144,-32697,-2152,-32697,-2160,-32696,-2169,-32696,-2177,-32695,-2185,-32695,-2194,-32694,-2202,-32693,-2210,-32693,-2219,-32692,-2227,-32692,-2236,-32691,-2244,-32691,-2252,-32690,-2261,-32689,-2269,-32689,-2277,-32688,-2286,-32688,-2294,-32687,-2302,-32687,-2311,-32686,-2319,-32685,-2327,-32685,-2336,-32684,-2344,-32684,-2353,-32683,-2361,-32682,-2369,-32682,-2378,-32681,-2386,-32681,-2394,-32680,-2403,-32679,-2411,-32679,-2419,-32678,-2428,-32677,-2436,-32677,-2444,-32676,-2453,-32676,-2461,-32675,-2469,-32674,-2478,-32674,-2486,-32673,-2495,-32672,-2503,-32672,-2511,-32671,-2520,-32671,-2528,-32670,-2536,-32669,-2545,-32669,-2553,-32668,-2561,-32667,-2570,-32667,-2578,-32666,-2586,-32665,-2595,-32665,-2603,-32664,-2611,-32663,-2620,-32663,-2628,-32662,-2637,-32661,-2645,-32661,-2653,-32660,-2662,-32659,-2670,-32659,-2678,-32658,-2687,-32657,-2695,-32657,-2703,-32656,-2712,-32655,-2720,-32654,-2728,-32654,-2737,-32653,-2745,-32652,-2753,-32652,-2762,-32651,-2770,-32650,-2778,-32650,-2787,-32649,-2795,-32648,-2803,-32647,-2812,-32647,-2820,-32646,-2829,-32645,-2837,-32645,-2845,-32644,-2854,-32643,-2862,-32642,-2870,-32642,-2879,-32641,-2887,-32640,-2895,-32639,-2904,-32639,-2912,-32638,-2920,-32637,-2929,-32636,-2937,-32636,-2945,-32635,-2954,-32634,-2962,-32633,-2970,-32633,-2979,-32632,-2987,-32631,-2995,-32630,-3004,-32630,-3012,-32629,-3020,-32628,-3029,-32627,-3037,-32626,-3045,-32626,-3054,-32625,-3062,-32624,-3070,-32623,-3079,-32623,-3087,-32622,-3095,-32621,-3104,-32620,-3112,-32619,-3121,-32619,-3129,-32618,-3137,-32617,-3146,-32616,-3154,-32615,-3162,-32615,-3171,-32614,-3179,-32613,-3187,-32612,-3196,-32611,-3204,-32611,-3212,-32610,-3221,-32609,-3229,-32608,-3237,-32607,-3246,-32606,-3254,-32606,-3262,-32605,-3271,-32604,-3279,-32603,-3287,-32602,-3296,-32601,-3304,-32601,-3312,-32600,-3321,-32599,-3329,-32598,-3337,-32597,-3346,-32596,-3354,-32595,-3362,-32595,-3371,-32594,-3379,-32593,-3387,-32592,-3396,-32591,-3404,-32590,-3412,-32589,-3421,-32589,-3429,-32588,-3437,-32587,-3446,-32586,-3454,-32585,-3462,-32584,-3471,-32583,-3479,-32582,-3487,-32581,-3496,-32581,-3504,-32580,-3512,-32579,-3521,-32578,-3529,-32577,-3537,-32576,-3546,-32575,-3554,-32574,-3562,-32573,-3571,-32572,-3579,-32572,-3587,-32571,-3595,-32570,-3604,-32569,-3612,-32568,-3620,-32567,-3629,-32566,-3637,-32565,-3645,-32564,-3654,-32563,-3662,-32562,-3670,-32561,-3679,-32560,-3687,-32559,-3695,-32559,-3704,-32558,-3712,-32557,-3720,-32556,-3729,-32555,-3737,-32554,-3745,-32553,-3754,-32552,-3762,-32551,-3770,-32550,-3779,-32549,-3787,-32548,-3795,-32547,-3804,-32546,-3812,-32545,-3820,-32544,-3829,-32543,-3837,-32542,-3845,-32541,-3854,-32540,-3862,-32539,-3870,-32538,-3878,-32537,-3887,-32536,-3895,-32535,-3903,-32534,-3912,-32533,-3920,-32532,-3928,-32531,-3937,-32530,-3945,-32529,-3953,-32528,-3962,-32527,-3970,-32526,-3978,-32525,-3987,-32524,-3995,-32523,-4003,-32522,-4012,-32521,-4020,-32520,-4028,-32519,-4036,-32518,-4045,-32517,-4053,-32516,-4061,-32515,-4070,-32514,-4078,-32513,-4086,-32512,-4095,-32511,-4103,-32510,-4111,-32509,-4120,-32508,-4128,-32507,-4136,-32505,-4145,-32504,-4153,-32503,-4161,-32502,-4169,-32501,-4178,-32500,-4186,-32499,-4194,-32498,-4203,-32497,-4211,-32496,-4219,-32495,-4228,-32494,-4236,-32493,-4244,-32492,-4253,-32490,-4261,-32489,-4269,-32488,-4277,-32487,-4286,-32486,-4294,-32485,-4302,-32484,-4311,-32483,-4319,-32482,-4327,-32481,-4336,-32479,-4344,-32478,-4352,-32477,-4360,-32476,-4369,-32475,-4377,-32474,-4385,-32473,-4394,-32472,-4402,-32471,-4410,-32469,-4419,-32468,-4427,-32467,-4435,-32466,-4444,-32465,-4452,-32464,-4460,-32463,-4468,-32461,-4477,-32460,-4485,-32459,-4493,-32458,-4502,-32457,-4510,-32456,-4518,-32455,-4526,-32453,-4535,-32452,-4543,-32451,-4551,-32450,-4560,-32449,-4568,-32448,-4576,-32446,-4585,-32445,-4593,-32444,-4601,-32443,-4609,-32442,-4618,-32441,-4626,-32439,-4634,-32438,-4643,-32437,-4651,-32436,-4659,-32435,-4667,-32433,-4676,-32432,-4684,-32431,-4692,-32430,-4701,-32429,-4709,-32427,-4717,-32426,-4726,-32425,-4734,-32424,-4742,-32423,-4750,-32421,-4759,-32420,-4767,-32419,-4775,-32418,-4784,-32417,-4792,-32415,-4800,-32414,-4808,-32413,-4817,-32412,-4825,-32410,-4833,-32409,-4842,-32408,-4850,-32407,-4858,-32405,-4866,-32404,-4875,-32403,-4883,-32402,-4891,-32400,-4900,-32399,-4908,-32398,-4916,-32397,-4924,-32395,-4933,-32394,-4941,-32393,-4949,-32392,-4958,-32390,-4966,-32389,-4974,-32388,-4982,-32387,-4991,-32385,-4999,-32384,-5007,-32383,-5015,-32381,-5024,-32380,-5032,-32379,-5040,-32378,-5049,-32376,-5057,-32375,-5065,-32374,-5073,-32372,-5082,-32371,-5090,-32370,-5098,-32369,-5107,-32367,-5115,-32366,-5123,-32365,-5131,-32363,-5140,-32362,-5148,-32361,-5156,-32359,-5164,-32358,-5173,-32357,-5181,-32355,-5189,-32354,-5198,-32353,-5206,-32351,-5214,-32350,-5222,-32349,-5231,-32347,-5239,-32346,-5247,-32345,-5255,-32343,-5264,-32342,-5272,-32341,-5280,-32339,-5288,-32338,-5297,-32337,-5305,-32335,-5313,-32334,-5322,-32333,-5330,-32331,-5338,-32330,-5346,-32328,-5355,-32327,-5363,-32326,-5371,-32324,-5379,-32323,-5388,-32322,-5396,-32320,-5404,-32319,-5412,-32317,-5421,-32316,-5429,-32315,-5437,-32313,-5446,-32312,-5454,-32311,-5462,-32309,-5470,-32308,-5479,-32306,-5487,-32305,-5495,-32304,-5503,-32302,-5512,-32301,-5520,-32299,-5528,-32298,-5536,-32296,-5545,-32295,-5553,-32294,-5561,-32292,-5569,-32291,-5578,-32289,-5586,-32288,-5594,-32287,-5602,-32285,-5611,-32284,-5619,-32282,-5627,-32281,-5635,-32279,-5644,-32278,-5652,-32276,-5660,-32275,-5668,-32274,-5677,-32272,-5685,-32271,-5693,-32269,-5701,-32268,-5710,-32266,-5718,-32265,-5726,-32263,-5734,-32262,-5743,-32260,-5751,-32259,-5759,-32257,-5767,-32256,-5776,-32255,-5784,-32253,-5792,-32252,-5800,-32250,-5809,-32249,-5817,-32247,-5825,-32246,-5833,-32244,-5842,-32243,-5850,-32241,-5858,-32240,-5866,-32238,-5875,-32237,-5883,-32235,-5891,-32234,-5899,-32232,-5908,-32231,-5916,-32229,-5924,-32228,-5932,-32226,-5941,-32225,-5949,-32223,-5957,-32222,-5965,-32220,-5973,-32219,-5982,-32217,-5990,-32215,-5998,-32214,-6006,-32212,-6015,-32211,-6023,-32209,-6031,-32208,-6039,-32206,-6048,-32205,-6056,-32203,-6064,-32202,-6072,-32200,-6081,-32198,-6089,-32197,-6097,-32195,-6105,-32194,-6113,-32192,-6122,-32191,-6130,-32189,-6138,-32188,-6146,-32186,-6155,-32184,-6163,-32183,-6171,-32181,-6179,-32180,-6187,-32178,-6196,-32177,-6204,-32175,-6212,-32173,-6220,-32172,-6229,-32170,-6237,-32169,-6245,-32167,-6253,-32165,-6262,-32164,-6270,-32162,-6278,-32161,-6286,-32159,-6294,-32157,-6303,-32156,-6311,-32154,-6319,-32153,-6327,-32151,-6335,-32149,-6344,-32148,-6352,-32146,-6360,-32144,-6368,-32143,-6377,-32141,-6385,-32140,-6393,-32138,-6401,-32136,-6409,-32135,-6418,-32133,-6426,-32131,-6434,-32130,-6442,-32128,-6451,-32126,-6459,-32125,-6467,-32123,-6475,-32121,-6483,-32120,-6492,-32118,-6500,-32116,-6508,-32115,-6516,-32113,-6524,-32111,-6533,-32110,-6541,-32108,-6549,-32106,-6557,-32105,-6565,-32103,-6574,-32101,-6582,-32100,-6590,-32098,-6598,-32096,-6607,-32095,-6615,-32093,-6623,-32091,-6631,-32090,-6639,-32088,-6648,-32086,-6656,-32085,-6664,-32083,-6672,-32081,-6680,-32079,-6689,-32078,-6697,-32076,-6705,-32074,-6713,-32073,-6721,-32071,-6730,-32069,-6738,-32067,-6746,-32066,-6754,-32064,-6762,-32062,-6771,-32060,-6779,-32059,-6787,-32057,-6795,-32055,-6803,-32054,-6812,-32052,-6820,-32050,-6828,-32048,-6836,-32047,-6844,-32045,-6852,-32043,-6861,-32041,-6869,-32040,-6877,-32038,-6885,-32036,-6893,-32034,-6902,-32033,-6910,-32031,-6918,-32029,-6926,-32027,-6934,-32025,-6943,-32024,-6951,-32022,-6959,-32020,-6967,-32018,-6975,-32017,-6983,-32015,-6992,-32013,-7000,-32011,-7008,-32009,-7016,-32008,-7024,-32006,-7033,-32004,-7041,-32002,-7049,-32000,-7057,-31999,-7065,-31997,-7073,-31995,-7082,-31993,-7090,-31991,-7098,-31990,-7106,-31988,-7114,-31986,-7123,-31984,-7131,-31982,-7139,-31980,-7147,-31979,-7155,-31977,-7163,-31975,-7172,-31973,-7180,-31971,-7188,-31969,-7196,-31968,-7204,-31966,-7212,-31964,-7221,-31962,-7229,-31960,-7237,-31958,-7245,-31957,-7253,-31955,-7262,-31953,-7270,-31951,-7278,-31949,-7286,-31947,-7294,-31945,-7302,-31944,-7311,-31942,-7319,-31940,-7327,-31938,-7335,-31936,-7343,-31934,-7351,-31932,-7359,-31930,-7368,-31929,-7376,-31927,-7384,-31925,-7392,-31923,-7400,-31921,-7408,-31919,-7417,-31917,-7425,-31915,-7433,-31913,-7441,-31912,-7449,-31910,-7457,-31908,-7466,-31906,-7474,-31904,-7482,-31902,-7490,-31900,-7498,-31898,-7506,-31896,-7515,-31894,-7523,-31892,-7531,-31890,-7539,-31889,-7547,-31887,-7555,-31885,-7563,-31883,-7572,-31881,-7580,-31879,-7588,-31877,-7596,-31875,-7604,-31873,-7612,-31871,-7620,-31869,-7629,-31867,-7637,-31865,-7645,-31863,-7653,-31861,-7661,-31859,-7669,-31857,-7677,-31855,-7686,-31854,-7694,-31852,-7702,-31850,-7710,-31848,-7718,-31846,-7726,-31844,-7734,-31842,-7743,-31840,-7751,-31838,-7759,-31836,-7767,-31834,-7775,-31832,-7783,-31830,-7791,-31828,-7800,-31826,-7808,-31824,-7816,-31822,-7824,-31820,-7832,-31818,-7840,-31816,-7848,-31814,-7857,-31812,-7865,-31810,-7873,-31808,-7881,-31806,-7889,-31804,-7897,-31802,-7905,-31800,-7913,-31798,-7922,-31796,-7930,-31794,-7938,-31792,-7946,-31790,-7954,-31788,-7962,-31786,-7970,-31783,-7978,-31781,-7987,-31779,-7995,-31777,-8003,-31775,-8011,-31773,-8019,-31771,-8027,-31769,-8035,-31767,-8043,-31765,-8052,-31763,-8060,-31761,-8068,-31759,-8076,-31757,-8084,-31755,-8092,-31753,-8100,-31751,-8108,-31749,-8117,-31746,-8125,-31744,-8133,-31742,-8141,-31740,-8149,-31738,-8157,-31736,-8165,-31734,-8173,-31732,-8181,-31730,-8190,-31728,-8198,-31726,-8206,-31724,-8214,-31721,-8222,-31719,-8230,-31717,-8238,-31715,-8246,-31713,-8254,-31711,-8263,-31709,-8271,-31707,-8279,-31705,-8287,-31702,-8295,-31700,-8303,-31698,-8311,-31696,-8319,-31694,-8327,-31692,-8335,-31690,-8344,-31688,-8352,-31685,-8360,-31683,-8368,-31681,-8376,-31679,-8384,-31677,-8392,-31675,-8400,-31673,-8408,-31670,-8416,-31668,-8425,-31666,-8433,-31664,-8441,-31662,-8449,-31660,-8457,-31657,-8465,-31655,-8473,-31653,-8481,-31651,-8489,-31649,-8497,-31647,-8505,-31644,-8514,-31642,-8522,-31640,-8530,-31638,-8538,-31636,-8546,-31634,-8554,-31631,-8562,-31629,-8570,-31627,-8578,-31625,-8586,-31623,-8594,-31620,-8603,-31618,-8611,-31616,-8619,-31614,-8627,-31612,-8635,-31609,-8643,-31607,-8651,-31605,-8659,-31603,-8667,-31601,-8675,-31598,-8683,-31596,-8691,-31594,-8700,-31592,-8708,-31589,-8716,-31587,-8724,-31585,-8732,-31583,-8740,-31581,-8748,-31578,-8756,-31576,-8764,-31574,-8772,-31572,-8780,-31569,-8788,-31567,-8796,-31565,-8804,-31563,-8813,-31560,-8821,-31558,-8829,-31556,-8837,-31554,-8845,-31551,-8853,-31549,-8861,-31547,-8869,-31545,-8877,-31542,-8885,-31540,-8893,-31538,-8901,-31535,-8909,-31533,-8917,-31531,-8925,-31529,-8933,-31526,-8942,-31524,-8950,-31522,-8958,-31519,-8966,-31517,-8974,-31515,-8982,-31513,-8990,-31510,-8998,-31508,-9006,-31506,-9014,-31503,-9022,-31501,-9030,-31499,-9038,-31496,-9046,-31494,-9054,-31492,-9062,-31490,-9070,-31487,-9078,-31485,-9087,-31483,-9095,-31480,-9103,-31478,-9111,-31476,-9119,-31473,-9127,-31471,-9135,-31469,-9143,-31466,-9151,-31464,-9159,-31462,-9167,-31459,-9175,-31457,-9183,-31455,-9191,-31452,-9199,-31450,-9207,-31447,-9215,-31445,-9223,-31443,-9231,-31440,-9239,-31438,-9247,-31436,-9255,-31433,-9263,-31431,-9271,-31429,-9280,-31426,-9288,-31424,-9296,-31421,-9304,-31419,-9312,-31417,-9320,-31414,-9328,-31412,-9336,-31410,-9344,-31407,-9352,-31405,-9360,-31402,-9368,-31400,-9376,-31398,-9384,-31395,-9392,-31393,-9400,-31390,-9408,-31388,-9416,-31386,-9424,-31383,-9432,-31381,-9440,-31378,-9448,-31376,-9456,-31374,-9464,-31371,-9472,-31369,-9480,-31366,-9488,-31364,-9496,-31361,-9504,-31359,-9512,-31357,-9520,-31354,-9528,-31352,-9536,-31349,-9544,-31347,-9552,-31344,-9560,-31342,-9568,-31339,-9576,-31337,-9584,-31335,-9592,-31332,-9600,-31330,-9608,-31327,-9616,-31325,-9624,-31322,-9632,-31320,-9640,-31317,-9648,-31315,-9656,-31312,-9664,-31310,-9672,-31308,-9680,-31305,-9688,-31303,-9696,-31300,-9704,-31298,-9712,-31295,-9720,-31293,-9728,-31290,-9736,-31288,-9744,-31285,-9752,-31283,-9760,-31280,-9768,-31278,-9776,-31275,-9784,-31273,-9792,-31270,-9800,-31268,-9808,-31265,-9816,-31263,-9824,-31260,-9832,-31258,-9840,-31255,-9848,-31253,-9856,-31250,-9864,-31248,-9872,-31245,-9880,-31243,-9888,-31240,-9896,-31237,-9904,-31235,-9912,-31232,-9920,-31230,-9928,-31227,-9936,-31225,-9944,-31222,-9952,-31220,-9960,-31217,-9968,-31215,-9976,-31212,-9984,-31210,-9992,-31207,-10000,-31204,-10008,-31202,-10016,-31199,-10024,-31197,-10032,-31194,-10040,-31192,-10048,-31189,-10056,-31186,-10064,-31184,-10072,-31181,-10080,-31179,-10088,-31176,-10096,-31174,-10104,-31171,-10112,-31168,-10120,-31166,-10128,-31163,-10136,-31161,-10144,-31158,-10152,-31155,-10160,-31153,-10167,-31150,-10175,-31148,-10183,-31145,-10191,-31142,-10199,-31140,-10207,-31137,-10215,-31135,-10223,-31132,-10231,-31129,-10239,-31127,-10247,-31124,-10255,-31122,-10263,-31119,-10271,-31116,-10279,-31114,-10287,-31111,-10295,-31108,-10303,-31106,-10311,-31103,-10319,-31101,-10327,-31098,-10335,-31095,-10343,-31093,-10350,-31090,-10358,-31087,-10366,-31085,-10374,-31082,-10382,-31079,-10390,-31077,-10398,-31074,-10406,-31071,-10414,-31069,-10422,-31066,-10430,-31063,-10438,-31061,-10446,-31058,-10454,-31055,-10462,-31053,-10470,-31050,-10478,-31047,-10485,-31045,-10493,-31042,-10501,-31039,-10509,-31037,-10517,-31034,-10525,-31031,-10533,-31029,-10541,-31026,-10549,-31023,-10557,-31020,-10565,-31018,-10573,-31015,-10581,-31012,-10589,-31010,-10597,-31007,-10604,-31004,-10612,-31002,-10620,-30999,-10628,-30996,-10636,-30993,-10644,-30991,-10652,-30988,-10660,-30985,-10668,-30982,-10676,-30980,-10684,-30977,-10692,-30974,-10700,-30972,-10707,-30969,-10715,-30966,-10723,-30963,-10731,-30961,-10739,-30958,-10747,-30955,-10755,-30952,-10763,-30950,-10771,-30947,-10779,-30944,-10787,-30941,-10795,-30939,-10802,-30936,-10810,-30933,-10818,-30930,-10826,-30928,-10834,-30925,-10842,-30922,-10850,-30919,-10858,-30916,-10866,-30914,-10874,-30911,-10881,-30908,-10889,-30905,-10897,-30903,-10905,-30900,-10913,-30897,-10921,-30894,-10929,-30891,-10937,-30889,-10945,-30886,-10953,-30883,-10960,-30880,-10968,-30877,-10976,-30875,-10984,-30872,-10992,-30869,-11000,-30866,-11008,-30863,-11016,-30861,-11024,-30858,-11031,-30855,-11039,-30852,-11047,-30849,-11055,-30846,-11063,-30844,-11071,-30841,-11079,-30838,-11087,-30835,-11095,-30832,-11102,-30829,-11110,-30827,-11118,-30824,-11126,-30821,-11134,-30818,-11142,-30815,-11150,-30812,-11158,-30810,-11165,-30807,-11173,-30804,-11181,-30801,-11189,-30798,-11197,-30795,-11205,-30792,-11213,-30789,-11221,-30787,-11228,-30784,-11236,-30781,-11244,-30778,-11252,-30775,-11260,-30772,-11268,-30769,-11276,-30767,-11284,-30764,-11291,-30761,-11299,-30758,-11307,-30755,-11315,-30752,-11323,-30749,-11331,-30746,-11339,-30743,-11346,-30740,-11354,-30738,-11362,-30735,-11370,-30732,-11378,-30729,-11386,-30726,-11394,-30723,-11401,-30720,-11409,-30717,-11417,-30714,-11425,-30711,-11433,-30708,-11441,-30706,-11449,-30703,-11456,-30700,-11464,-30697,-11472,-30694,-11480,-30691,-11488,-30688,-11496,-30685,-11503,-30682,-11511,-30679,-11519,-30676,-11527,-30673,-11535,-30670,-11543,-30667,-11551,-30664,-11558,-30661,-11566,-30658,-11574,-30656,-11582,-30653,-11590,-30650,-11598,-30647,-11605,-30644,-11613,-30641,-11621,-30638,-11629,-30635,-11637,-30632,-11645,-30629,-11652,-30626,-11660,-30623,-11668,-30620,-11676,-30617,-11684,-30614,-11692,-30611,-11699,-30608,-11707,-30605,-11715,-30602,-11723,-30599,-11731,-30596,-11738,-30593,-11746,-30590,-11754,-30587,-11762,-30584,-11770,-30581,-11778,-30578,-11785,-30575,-11793,-30572,-11801,-30569,-11809,-30566,-11817,-30563,-11824,-30560,-11832,-30557,-11840,-30554,-11848,-30551,-11856,-30548,-11863,-30545,-11871,-30542,-11879,-30539,-11887,-30536,-11895,-30533,-11903,-30529,-11910,-30526,-11918,-30523,-11926,-30520,-11934,-30517,-11942,-30514,-11949,-30511,-11957,-30508,-11965,-30505,-11973,-30502,-11981,-30499,-11988,-30496,-11996,-30493,-12004,-30490,-12012,-30487,-12020,-30484,-12027,-30481,-12035,-30477,-12043,-30474,-12051,-30471,-12058,-30468,-12066,-30465,-12074,-30462,-12082,-30459,-12090,-30456,-12097,-30453,-12105,-30450,-12113,-30447,-12121,-30443,-12129,-30440,-12136,-30437,-12144,-30434,-12152,-30431,-12160,-30428,-12167,-30425,-12175,-30422,-12183,-30419,-12191,-30416,-12199,-30412,-12206,-30409,-12214,-30406,-12222,-30403,-12230,-30400,-12237,-30397,-12245,-30394,-12253,-30391,-12261,-30387,-12269,-30384,-12276,-30381,-12284,-30378,-12292,-30375,-12300,-30372,-12307,-30369,-12315,-30365,-12323,-30362,-12331,-30359,-12338,-30356,-12346,-30353,-12354,-30350,-12362,-30346,-12369,-30343,-12377,-30340,-12385,-30337,-12393,-30334,-12400,-30331,-12408,-30327,-12416,-30324,-12424,-30321,-12431,-30318,-12439,-30315,-12447,-30312,-12455,-30308,-12462,-30305,-12470,-30302,-12478,-30299,-12486,-30296,-12493,-30292,-12501,-30289,-12509,-30286,-12517,-30283,-12524,-30280,-12532,-30276,-12540,-30273,-12548,-30270,-12555,-30267,-12563,-30264,-12571,-30260,-12579,-30257,-12586,-30254,-12594,-30251,-12602,-30248,-12610,-30244,-12617,-30241,-12625,-30238,-12633,-30235,-12640,-30231,-12648,-30228,-12656,-30225,-12664,-30222,-12671,-30218,-12679,-30215,-12687,-30212,-12695,-30209,-12702,-30206,-12710,-30202,-12718,-30199,-12725,-30196,-12733,-30192,-12741,-30189,-12749,-30186,-12756,-30183,-12764,-30179,-12772,-30176,-12779,-30173,-12787,-30170,-12795,-30166,-12803,-30163,-12810,-30160,-12818,-30157,-12826,-30153,-12833,-30150,-12841,-30147,-12849,-30143,-12857,-30140,-12864,-30137,-12872,-30134,-12880,-30130,-12887,-30127,-12895,-30124,-12903,-30120,-12910,-30117,-12918,-30114,-12926,-30110,-12934,-30107,-12941,-30104,-12949,-30101,-12957,-30097,-12964,-30094,-12972,-30091,-12980,-30087,-12987,-30084,-12995,-30081,-13003,-30077,-13010,-30074,-13018,-30071,-13026,-30067,-13034,-30064,-13041,-30061,-13049,-30057,-13057,-30054,-13064,-30051,-13072,-30047,-13080,-30044,-13087,-30041,-13095,-30037,-13103,-30034,-13110,-30031,-13118,-30027,-13126,-30024,-13133,-30021,-13141,-30017,-13149,-30014,-13156,-30010,-13164,-30007,-13172,-30004,-13179,-30000,-13187,-29997,-13195,-29994,-13202,-29990,-13210,-29987,-13218,-29984,-13225,-29980,-13233,-29977,-13241,-29973,-13248,-29970,-13256,-29967,-13264,-29963,-13271,-29960,-13279,-29956,-13287,-29953,-13294,-29950,-13302,-29946,-13310,-29943,-13317,-29939,-13325,-29936,-13333,-29933,-13340,-29929,-13348,-29926,-13356,-29922,-13363,-29919,-13371,-29916,-13379,-29912,-13386,-29909,-13394,-29905,-13401,-29902,-13409,-29898,-13417,-29895,-13424,-29892,-13432,-29888,-13440,-29885,-13447,-29881,-13455,-29878,-13463,-29874,-13470,-29871,-13478,-29867,-13486,-29864,-13493,-29861,-13501,-29857,-13508,-29854,-13516,-29850,-13524,-29847,-13531,-29843,-13539,-29840,-13547,-29836,-13554,-29833,-13562,-29829,-13569,-29826,-13577,-29823,-13585,-29819,-13592,-29816,-13600,-29812,-13608,-29809,-13615,-29805,-13623,-29802,-13630,-29798,-13638,-29795,-13646,-29791,-13653,-29788,-13661,-29784,-13668,-29781,-13676,-29777,-13684,-29774,-13691,-29770,-13699,-29767,-13707,-29763,-13714,-29760,-13722,-29756,-13729,-29753,-13737,-29749,-13745,-29746,-13752,-29742,-13760,-29739,-13767,-29735,-13775,-29732,-13783,-29728,-13790,-29725,-13798,-29721,-13805,-29718,-13813,-29714,-13821,-29710,-13828,-29707,-13836,-29703,-13843,-29700,-13851,-29696,-13859,-29693,-13866,-29689,-13874,-29686,-13881,-29682,-13889,-29679,-13896,-29675,-13904,-29671,-13912,-29668,-13919,-29664,-13927,-29661,-13934,-29657,-13942,-29654,-13950,-29650,-13957,-29647,-13965,-29643,-13972,-29639,-13980,-29636,-13987,-29632,-13995,-29629,-14003,-29625,-14010,-29622,-14018,-29618,-14025,-29614,-14033,-29611,-14040,-29607,-14048,-29604,-14056,-29600,-14063,-29596,-14071,-29593,-14078,-29589,-14086,-29586,-14093,-29582,-14101,-29578,-14109,-29575,-14116,-29571,-14124,-29568,-14131,-29564,-14139,-29560,-14146,-29557,-14154,-29553,-14161,-29549,-14169,-29546,-14177,-29542,-14184,-29539,-14192,-29535,-14199,-29531,-14207,-29528,-14214,-29524,-14222,-29520,-14229,-29517,-14237,-29513,-14245,-29510,-14252,-29506,-14260,-29502,-14267,-29499,-14275,-29495,-14282,-29491,-14290,-29488,-14297,-29484,-14305,-29480,-14312,-29477,-14320,-29473,-14327,-29469,-14335,-29466,-14343,-29462,-14350,-29458,-14358,-29455,-14365,-29451,-14373,-29447,-14380,-29444,-14388,-29440,-14395,-29436,-14403,-29433,-14410,-29429,-14418,-29425,-14425,-29422,-14433,-29418,-14440,-29414,-14448,-29411,-14455,-29407,-14463,-29403,-14470,-29399,-14478,-29396,-14485,-29392,-14493,-29388,-14500,-29385,-14508,-29381,-14516,-29377,-14523,-29373,-14531,-29370,-14538,-29366,-14546,-29362,-14553,-29359,-14561,-29355,-14568,-29351,-14576,-29347,-14583,-29344,-14591,-29340,-14598,-29336,-14606,-29333,-14613,-29329,-14621,-29325,-14628,-29321,-14636,-29318,-14643,-29314,-14651,-29310,-14658,-29306,-14666,-29303,-14673,-29299,-14681,-29295,-14688,-29291,-14695,-29288,-14703,-29284,-14710,-29280,-14718,-29276,-14725,-29273,-14733,-29269,-14740,-29265,-14748,-29261,-14755,-29257,-14763,-29254,-14770,-29250,-14778,-29246,-14785,-29242,-14793,-29239,-14800,-29235,-14808,-29231,-14815,-29227,-14823,-29223,-14830,-29220,-14838,-29216,-14845,-29212,-14853,-29208,-14860,-29204,-14867,-29201,-14875,-29197,-14882,-29193,-14890,-29189,-14897,-29185,-14905,-29182,-14912,-29178,-14920,-29174,-14927,-29170,-14935,-29166,-14942,-29163,-14950,-29159,-14957,-29155,-14964,-29151,-14972,-29147,-14979,-29143,-14987,-29140,-14994,-29136,-15002,-29132,-15009,-29128,-15017,-29124,-15024,-29120,-15031,-29117,-15039,-29113,-15046,-29109,-15054,-29105,-15061,-29101,-15069,-29097,-15076,-29093,-15084,-29090,-15091,-29086,-15098,-29082,-15106,-29078,-15113,-29074,-15121,-29070,-15128,-29066,-15136,-29063,-15143,-29059,-15150,-29055,-15158,-29051,-15165,-29047,-15173,-29043,-15180,-29039,-15188,-29035,-15195,-29032,-15202,-29028,-15210,-29024,-15217,-29020,-15225,-29016,-15232,-29012,-15239,-29008,-15247,-29004,-15254,-29000,-15262,-28997,-15269,-28993,-15277,-28989,-15284,-28985,-15291,-28981,-15299,-28977,-15306,-28973,-15314,-28969,-15321,-28965,-15328,-28961,-15336,-28957,-15343,-28954,-15351,-28950,-15358,-28946,-15365,-28942,-15373,-28938,-15380,-28934,-15388,-28930,-15395,-28926,-15402,-28922,-15410,-28918,-15417,-28914,-15425,-28910,-15432,-28906,-15439,-28902,-15447,-28898,-15454,-28894,-15462,-28891,-15469,-28887,-15476,-28883,-15484,-28879,-15491,-28875,-15498,-28871,-15506,-28867,-15513,-28863,-15521,-28859,-15528,-28855,-15535,-28851,-15543,-28847,-15550,-28843,-15557,-28839,-15565,-28835,-15572,-28831,-15580,-28827,-15587,-28823,-15594,-28819,-15602,-28815,-15609,-28811,-15616,-28807,-15624,-28803,-15631,-28799,-15639,-28795,-15646,-28791,-15653,-28787,-15661,-28783,-15668,-28779,-15675,-28775,-15683,-28771,-15690,-28767,-15697,-28763,-15705,-28759,-15712,-28755,-15719,-28751,-15727,-28747,-15734,-28743,-15741,-28739,-15749,-28735,-15756,-28731,-15764,-28727,-15771,-28723,-15778,-28719,-15786,-28715,-15793,-28711,-15800,-28707,-15808,-28703,-15815,-28699,-15822,-28695,-15830,-28691,-15837,-28686,-15844,-28682,-15852,-28678,-15859,-28674,-15866,-28670,-15874,-28666,-15881,-28662,-15888,-28658,-15896,-28654,-15903,-28650,-15910,-28646,-15918,-28642,-15925,-28638,-15932,-28634,-15939,-28630,-15947,-28626,-15954,-28621,-15961,-28617,-15969,-28613,-15976,-28609,-15983,-28605,-15991,-28601,-15998,-28597,-16005,-28593,-16013,-28589,-16020,-28585,-16027,-28581,-16035,-28576,-16042,-28572,-16049,-28568,-16056,-28564,-16064,-28560,-16071,-28556,-16078,-28552,-16086,-28548,-16093,-28544,-16100,-28539,-16108,-28535,-16115,-28531,-16122,-28527,-16129,-28523,-16137,-28519,-16144,-28515,-16151,-28511,-16159,-28507,-16166,-28502,-16173,-28498,-16180,-28494,-16188,-28490,-16195,-28486,-16202,-28482,-16210,-28478,-16217,-28473,-16224,-28469,-16231,-28465,-16239,-28461,-16246,-28457,-16253,-28453,-16261,-28448,-16268,-28444,-16275,-28440,-16282,-28436,-16290,-28432,-16297,-28428,-16304,-28424,-16311,-28419,-16319,-28415,-16326,-28411,-16333,-28407,-16340,-28403,-16348,-28398,-16355,-28394,-16362,-28390,-16369,-28386,-16377,-28382}; -int16_t twb24576[16384] __attribute__((aligned(16))) = {32767,0,32766,-17,32766,-34,32766,-51,32766,-68,32766,-84,32766,-101,32766,-118,32766,-135,32766,-151,32766,-168,32766,-185,32766,-202,32766,-218,32766,-235,32766,-252,32765,-269,32765,-285,32765,-302,32765,-319,32765,-336,32765,-352,32764,-369,32764,-386,32764,-403,32764,-419,32764,-436,32763,-453,32763,-470,32763,-486,32763,-503,32762,-520,32762,-537,32762,-553,32762,-570,32761,-587,32761,-604,32761,-620,32760,-637,32760,-654,32760,-671,32759,-687,32759,-704,32759,-721,32758,-738,32758,-754,32757,-771,32757,-788,32757,-805,32756,-821,32756,-838,32755,-855,32755,-872,32754,-888,32754,-905,32754,-922,32753,-939,32753,-955,32752,-972,32752,-989,32751,-1006,32751,-1022,32750,-1039,32750,-1056,32749,-1073,32748,-1089,32748,-1106,32747,-1123,32747,-1140,32746,-1156,32746,-1173,32745,-1190,32744,-1207,32744,-1223,32743,-1240,32742,-1257,32742,-1274,32741,-1290,32740,-1307,32740,-1324,32739,-1340,32738,-1357,32738,-1374,32737,-1391,32736,-1407,32736,-1424,32735,-1441,32734,-1458,32733,-1474,32733,-1491,32732,-1508,32731,-1525,32730,-1541,32729,-1558,32729,-1575,32728,-1592,32727,-1608,32726,-1625,32725,-1642,32725,-1659,32724,-1675,32723,-1692,32722,-1709,32721,-1725,32720,-1742,32719,-1759,32718,-1776,32717,-1792,32717,-1809,32716,-1826,32715,-1843,32714,-1859,32713,-1876,32712,-1893,32711,-1909,32710,-1926,32709,-1943,32708,-1960,32707,-1976,32706,-1993,32705,-2010,32704,-2027,32703,-2043,32702,-2060,32701,-2077,32700,-2093,32699,-2110,32697,-2127,32696,-2144,32695,-2160,32694,-2177,32693,-2194,32692,-2210,32691,-2227,32690,-2244,32688,-2261,32687,-2277,32686,-2294,32685,-2311,32684,-2327,32683,-2344,32681,-2361,32680,-2378,32679,-2394,32678,-2411,32676,-2428,32675,-2444,32674,-2461,32673,-2478,32671,-2495,32670,-2511,32669,-2528,32668,-2545,32666,-2561,32665,-2578,32664,-2595,32662,-2611,32661,-2628,32660,-2645,32658,-2662,32657,-2678,32656,-2695,32654,-2712,32653,-2728,32651,-2745,32650,-2762,32649,-2778,32647,-2795,32646,-2812,32644,-2829,32643,-2845,32641,-2862,32640,-2879,32638,-2895,32637,-2912,32635,-2929,32634,-2945,32632,-2962,32631,-2979,32629,-2995,32628,-3012,32626,-3029,32625,-3045,32623,-3062,32622,-3079,32620,-3095,32618,-3112,32617,-3129,32615,-3146,32614,-3162,32612,-3179,32610,-3196,32609,-3212,32607,-3229,32605,-3246,32604,-3262,32602,-3279,32600,-3296,32599,-3312,32597,-3329,32595,-3346,32594,-3362,32592,-3379,32590,-3396,32588,-3412,32587,-3429,32585,-3446,32583,-3462,32581,-3479,32580,-3496,32578,-3512,32576,-3529,32574,-3546,32572,-3562,32571,-3579,32569,-3595,32567,-3612,32565,-3629,32563,-3645,32561,-3662,32559,-3679,32558,-3695,32556,-3712,32554,-3729,32552,-3745,32550,-3762,32548,-3779,32546,-3795,32544,-3812,32542,-3829,32540,-3845,32538,-3862,32536,-3878,32534,-3895,32532,-3912,32530,-3928,32528,-3945,32526,-3962,32524,-3978,32522,-3995,32520,-4012,32518,-4028,32516,-4045,32514,-4061,32512,-4078,32510,-4095,32508,-4111,32506,-4128,32503,-4145,32501,-4161,32499,-4178,32497,-4194,32495,-4211,32493,-4228,32491,-4244,32488,-4261,32486,-4277,32484,-4294,32482,-4311,32480,-4327,32477,-4344,32475,-4360,32473,-4377,32471,-4394,32468,-4410,32466,-4427,32464,-4444,32462,-4460,32459,-4477,32457,-4493,32455,-4510,32452,-4526,32450,-4543,32448,-4560,32445,-4576,32443,-4593,32441,-4609,32438,-4626,32436,-4643,32434,-4659,32431,-4676,32429,-4692,32426,-4709,32424,-4726,32422,-4742,32419,-4759,32417,-4775,32414,-4792,32412,-4808,32409,-4825,32407,-4842,32404,-4858,32402,-4875,32399,-4891,32397,-4908,32394,-4924,32392,-4941,32389,-4958,32387,-4974,32384,-4991,32382,-5007,32379,-5024,32377,-5040,32374,-5057,32371,-5073,32369,-5090,32366,-5107,32364,-5123,32361,-5140,32358,-5156,32356,-5173,32353,-5189,32350,-5206,32348,-5222,32345,-5239,32342,-5255,32340,-5272,32337,-5288,32334,-5305,32332,-5322,32329,-5338,32326,-5355,32323,-5371,32321,-5388,32318,-5404,32315,-5421,32312,-5437,32310,-5454,32307,-5470,32304,-5487,32301,-5503,32298,-5520,32295,-5536,32293,-5553,32290,-5569,32287,-5586,32284,-5602,32281,-5619,32278,-5635,32275,-5652,32273,-5668,32270,-5685,32267,-5701,32264,-5718,32261,-5734,32258,-5751,32255,-5767,32252,-5784,32249,-5800,32246,-5817,32243,-5833,32240,-5850,32237,-5866,32234,-5883,32231,-5899,32228,-5916,32225,-5932,32222,-5949,32219,-5965,32216,-5982,32213,-5998,32210,-6015,32207,-6031,32204,-6048,32201,-6064,32197,-6081,32194,-6097,32191,-6113,32188,-6130,32185,-6146,32182,-6163,32179,-6179,32176,-6196,32172,-6212,32169,-6229,32166,-6245,32163,-6262,32160,-6278,32156,-6294,32153,-6311,32150,-6327,32147,-6344,32143,-6360,32140,-6377,32137,-6393,32134,-6409,32130,-6426,32127,-6442,32124,-6459,32120,-6475,32117,-6492,32114,-6508,32110,-6524,32107,-6541,32104,-6557,32100,-6574,32097,-6590,32094,-6607,32090,-6623,32087,-6639,32084,-6656,32080,-6672,32077,-6689,32073,-6705,32070,-6721,32066,-6738,32063,-6754,32059,-6771,32056,-6787,32053,-6803,32049,-6820,32046,-6836,32042,-6852,32039,-6869,32035,-6885,32032,-6902,32028,-6918,32024,-6934,32021,-6951,32017,-6967,32014,-6983,32010,-7000,32007,-7016,32003,-7033,31999,-7049,31996,-7065,31992,-7082,31989,-7098,31985,-7114,31981,-7131,31978,-7147,31974,-7163,31970,-7180,31967,-7196,31963,-7212,31959,-7229,31956,-7245,31952,-7262,31948,-7278,31944,-7294,31941,-7311,31937,-7327,31933,-7343,31929,-7359,31926,-7376,31922,-7392,31918,-7408,31914,-7425,31911,-7441,31907,-7457,31903,-7474,31899,-7490,31895,-7506,31891,-7523,31888,-7539,31884,-7555,31880,-7572,31876,-7588,31872,-7604,31868,-7620,31864,-7637,31860,-7653,31856,-7669,31853,-7686,31849,-7702,31845,-7718,31841,-7734,31837,-7751,31833,-7767,31829,-7783,31825,-7800,31821,-7816,31817,-7832,31813,-7848,31809,-7865,31805,-7881,31801,-7897,31797,-7913,31793,-7930,31789,-7946,31785,-7962,31780,-7978,31776,-7995,31772,-8011,31768,-8027,31764,-8043,31760,-8060,31756,-8076,31752,-8092,31748,-8108,31743,-8125,31739,-8141,31735,-8157,31731,-8173,31727,-8190,31723,-8206,31718,-8222,31714,-8238,31710,-8254,31706,-8271,31701,-8287,31697,-8303,31693,-8319,31689,-8335,31684,-8352,31680,-8368,31676,-8384,31672,-8400,31667,-8416,31663,-8433,31659,-8449,31654,-8465,31650,-8481,31646,-8497,31641,-8514,31637,-8530,31633,-8546,31628,-8562,31624,-8578,31619,-8594,31615,-8611,31611,-8627,31606,-8643,31602,-8659,31597,-8675,31593,-8691,31588,-8708,31584,-8724,31580,-8740,31575,-8756,31571,-8772,31566,-8788,31562,-8804,31557,-8821,31553,-8837,31548,-8853,31544,-8869,31539,-8885,31534,-8901,31530,-8917,31525,-8933,31521,-8950,31516,-8966,31512,-8982,31507,-8998,31502,-9014,31498,-9030,31493,-9046,31489,-9062,31484,-9078,31479,-9095,31475,-9111,31470,-9127,31465,-9143,31461,-9159,31456,-9175,31451,-9191,31446,-9207,31442,-9223,31437,-9239,31432,-9255,31428,-9271,31423,-9288,31418,-9304,31413,-9320,31409,-9336,31404,-9352,31399,-9368,31394,-9384,31389,-9400,31385,-9416,31380,-9432,31375,-9448,31370,-9464,31365,-9480,31360,-9496,31356,-9512,31351,-9528,31346,-9544,31341,-9560,31336,-9576,31331,-9592,31326,-9608,31321,-9624,31316,-9640,31311,-9656,31307,-9672,31302,-9688,31297,-9704,31292,-9720,31287,-9736,31282,-9752,31277,-9768,31272,-9784,31267,-9800,31262,-9816,31257,-9832,31252,-9848,31247,-9864,31242,-9880,31236,-9896,31231,-9912,31226,-9928,31221,-9944,31216,-9960,31211,-9976,31206,-9992,31201,-10008,31196,-10024,31191,-10040,31185,-10056,31180,-10072,31175,-10088,31170,-10104,31165,-10120,31160,-10136,31154,-10152,31149,-10167,31144,-10183,31139,-10199,31134,-10215,31128,-10231,31123,-10247,31118,-10263,31113,-10279,31107,-10295,31102,-10311,31097,-10327,31092,-10343,31086,-10358,31081,-10374,31076,-10390,31070,-10406,31065,-10422,31060,-10438,31054,-10454,31049,-10470,31044,-10485,31038,-10501,31033,-10517,31028,-10533,31022,-10549,31017,-10565,31011,-10581,31006,-10597,31001,-10612,30995,-10628,30990,-10644,30984,-10660,30979,-10676,30973,-10692,30968,-10707,30962,-10723,30957,-10739,30951,-10755,30946,-10771,30940,-10787,30935,-10802,30929,-10818,30924,-10834,30918,-10850,30913,-10866,30907,-10881,30902,-10897,30896,-10913,30890,-10929,30885,-10945,30879,-10960,30874,-10976,30868,-10992,30862,-11008,30857,-11024,30851,-11039,30845,-11055,30840,-11071,30834,-11087,30828,-11102,30823,-11118,30817,-11134,30811,-11150,30806,-11165,30800,-11181,30794,-11197,30788,-11213,30783,-11228,30777,-11244,30771,-11260,30766,-11276,30760,-11291,30754,-11307,30748,-11323,30742,-11339,30737,-11354,30731,-11370,30725,-11386,30719,-11401,30713,-11417,30707,-11433,30702,-11449,30696,-11464,30690,-11480,30684,-11496,30678,-11511,30672,-11527,30666,-11543,30660,-11558,30655,-11574,30649,-11590,30643,-11605,30637,-11621,30631,-11637,30625,-11652,30619,-11668,30613,-11684,30607,-11699,30601,-11715,30595,-11731,30589,-11746,30583,-11762,30577,-11778,30571,-11793,30565,-11809,30559,-11824,30553,-11840,30547,-11856,30541,-11871,30535,-11887,30528,-11903,30522,-11918,30516,-11934,30510,-11949,30504,-11965,30498,-11981,30492,-11996,30486,-12012,30480,-12027,30473,-12043,30467,-12058,30461,-12074,30455,-12090,30449,-12105,30442,-12121,30436,-12136,30430,-12152,30424,-12167,30418,-12183,30411,-12199,30405,-12214,30399,-12230,30393,-12245,30386,-12261,30380,-12276,30374,-12292,30368,-12307,30361,-12323,30355,-12338,30349,-12354,30342,-12369,30336,-12385,30330,-12400,30323,-12416,30317,-12431,30311,-12447,30304,-12462,30298,-12478,30291,-12493,30285,-12509,30279,-12524,30272,-12540,30266,-12555,30259,-12571,30253,-12586,30247,-12602,30240,-12617,30234,-12633,30227,-12648,30221,-12664,30214,-12679,30208,-12695,30201,-12710,30195,-12725,30188,-12741,30182,-12756,30175,-12772,30169,-12787,30162,-12803,30156,-12818,30149,-12833,30142,-12849,30136,-12864,30129,-12880,30123,-12895,30116,-12910,30109,-12926,30103,-12941,30096,-12957,30090,-12972,30083,-12987,30076,-13003,30070,-13018,30063,-13034,30056,-13049,30050,-13064,30043,-13080,30036,-13095,30030,-13110,30023,-13126,30016,-13141,30009,-13156,30003,-13172,29996,-13187,29989,-13202,29983,-13218,29976,-13233,29969,-13248,29962,-13264,29955,-13279,29949,-13294,29942,-13310,29935,-13325,29928,-13340,29921,-13356,29915,-13371,29908,-13386,29901,-13401,29894,-13417,29887,-13432,29880,-13447,29873,-13463,29866,-13478,29860,-13493,29853,-13508,29846,-13524,29839,-13539,29832,-13554,29825,-13569,29818,-13585,29811,-13600,29804,-13615,29797,-13630,29790,-13646,29783,-13661,29776,-13676,29769,-13691,29762,-13707,29755,-13722,29748,-13737,29741,-13752,29734,-13767,29727,-13783,29720,-13798,29713,-13813,29706,-13828,29699,-13843,29692,-13859,29685,-13874,29678,-13889,29670,-13904,29663,-13919,29656,-13934,29649,-13950,29642,-13965,29635,-13980,29628,-13995,29621,-14010,29613,-14025,29606,-14040,29599,-14056,29592,-14071,29585,-14086,29577,-14101,29570,-14116,29563,-14131,29556,-14146,29548,-14161,29541,-14177,29534,-14192,29527,-14207,29519,-14222,29512,-14237,29505,-14252,29498,-14267,29490,-14282,29483,-14297,29476,-14312,29468,-14327,29461,-14343,29454,-14358,29446,-14373,29439,-14388,29432,-14403,29424,-14418,29417,-14433,29410,-14448,29402,-14463,29395,-14478,29387,-14493,29380,-14508,29372,-14523,29365,-14538,29358,-14553,29350,-14568,29343,-14583,29335,-14598,29328,-14613,29320,-14628,29313,-14643,29305,-14658,29298,-14673,29290,-14688,29283,-14703,29275,-14718,29268,-14733,29260,-14748,29253,-14763,29245,-14778,29238,-14793,29230,-14808,29222,-14823,29215,-14838,29207,-14853,29200,-14867,29192,-14882,29184,-14897,29177,-14912,29169,-14927,29162,-14942,29154,-14957,29146,-14972,29139,-14987,29131,-15002,29123,-15017,29116,-15031,29108,-15046,29100,-15061,29092,-15076,29085,-15091,29077,-15106,29069,-15121,29062,-15136,29054,-15150,29046,-15165,29038,-15180,29031,-15195,29023,-15210,29015,-15225,29007,-15239,28999,-15254,28992,-15269,28984,-15284,28976,-15299,28968,-15314,28960,-15328,28953,-15343,28945,-15358,28937,-15373,28929,-15388,28921,-15402,28913,-15417,28905,-15432,28897,-15447,28890,-15462,28882,-15476,28874,-15491,28866,-15506,28858,-15521,28850,-15535,28842,-15550,28834,-15565,28826,-15580,28818,-15594,28810,-15609,28802,-15624,28794,-15639,28786,-15653,28778,-15668,28770,-15683,28762,-15697,28754,-15712,28746,-15727,28738,-15741,28730,-15756,28722,-15771,28714,-15786,28706,-15800,28698,-15815,28690,-15830,28681,-15844,28673,-15859,28665,-15874,28657,-15888,28649,-15903,28641,-15918,28633,-15932,28625,-15947,28616,-15961,28608,-15976,28600,-15991,28592,-16005,28584,-16020,28575,-16035,28567,-16049,28559,-16064,28551,-16078,28543,-16093,28534,-16108,28526,-16122,28518,-16137,28510,-16151,28501,-16166,28493,-16180,28485,-16195,28477,-16210,28468,-16224,28460,-16239,28452,-16253,28443,-16268,28435,-16282,28427,-16297,28418,-16311,28410,-16326,28402,-16340,28393,-16355,28385,-16369,28377,-16384,28368,-16399,28360,-16413,28351,-16428,28343,-16442,28335,-16456,28326,-16471,28318,-16485,28309,-16500,28301,-16514,28292,-16529,28284,-16543,28275,-16558,28267,-16572,28259,-16587,28250,-16601,28242,-16616,28233,-16630,28225,-16644,28216,-16659,28208,-16673,28199,-16688,28190,-16702,28182,-16717,28173,-16731,28165,-16745,28156,-16760,28148,-16774,28139,-16789,28131,-16803,28122,-16817,28113,-16832,28105,-16846,28096,-16860,28087,-16875,28079,-16889,28070,-16904,28062,-16918,28053,-16932,28044,-16947,28036,-16961,28027,-16975,28018,-16990,28009,-17004,28001,-17018,27992,-17033,27983,-17047,27975,-17061,27966,-17075,27957,-17090,27948,-17104,27940,-17118,27931,-17133,27922,-17147,27913,-17161,27905,-17175,27896,-17190,27887,-17204,27878,-17218,27869,-17233,27861,-17247,27852,-17261,27843,-17275,27834,-17289,27825,-17304,27816,-17318,27808,-17332,27799,-17346,27790,-17361,27781,-17375,27772,-17389,27763,-17403,27754,-17417,27745,-17432,27736,-17446,27728,-17460,27719,-17474,27710,-17488,27701,-17502,27692,-17517,27683,-17531,27674,-17545,27665,-17559,27656,-17573,27647,-17587,27638,-17601,27629,-17616,27620,-17630,27611,-17644,27602,-17658,27593,-17672,27584,-17686,27575,-17700,27566,-17714,27557,-17728,27548,-17743,27538,-17757,27529,-17771,27520,-17785,27511,-17799,27502,-17813,27493,-17827,27484,-17841,27475,-17855,27466,-17869,27456,-17883,27447,-17897,27438,-17911,27429,-17925,27420,-17939,27411,-17953,27401,-17967,27392,-17981,27383,-17995,27374,-18009,27365,-18023,27355,-18037,27346,-18051,27337,-18065,27328,-18079,27319,-18093,27309,-18107,27300,-18121,27291,-18135,27281,-18149,27272,-18163,27263,-18177,27254,-18191,27244,-18205,27235,-18219,27226,-18233,27216,-18247,27207,-18261,27198,-18274,27188,-18288,27179,-18302,27170,-18316,27160,-18330,27151,-18344,27141,-18358,27132,-18372,27123,-18386,27113,-18399,27104,-18413,27094,-18427,27085,-18441,27076,-18455,27066,-18469,27057,-18483,27047,-18496,27038,-18510,27028,-18524,27019,-18538,27009,-18552,27000,-18565,26990,-18579,26981,-18593,26971,-18607,26962,-18621,26952,-18634,26943,-18648,26933,-18662,26924,-18676,26914,-18690,26905,-18703,26895,-18717,26885,-18731,26876,-18745,26866,-18758,26857,-18772,26847,-18786,26837,-18799,26828,-18813,26818,-18827,26809,-18841,26799,-18854,26789,-18868,26780,-18882,26770,-18895,26760,-18909,26751,-18923,26741,-18936,26731,-18950,26722,-18964,26712,-18977,26702,-18991,26692,-19005,26683,-19018,26673,-19032,26663,-19046,26654,-19059,26644,-19073,26634,-19087,26624,-19100,26615,-19114,26605,-19127,26595,-19141,26585,-19155,26575,-19168,26566,-19182,26556,-19195,26546,-19209,26536,-19222,26526,-19236,26516,-19250,26507,-19263,26497,-19277,26487,-19290,26477,-19304,26467,-19317,26457,-19331,26447,-19344,26437,-19358,26428,-19371,26418,-19385,26408,-19398,26398,-19412,26388,-19425,26378,-19439,26368,-19452,26358,-19466,26348,-19479,26338,-19493,26328,-19506,26318,-19520,26308,-19533,26298,-19547,26288,-19560,26278,-19574,26268,-19587,26258,-19600,26248,-19614,26238,-19627,26228,-19641,26218,-19654,26208,-19668,26198,-19681,26188,-19694,26178,-19708,26168,-19721,26158,-19734,26148,-19748,26137,-19761,26127,-19775,26117,-19788,26107,-19801,26097,-19815,26087,-19828,26077,-19841,26067,-19855,26056,-19868,26046,-19881,26036,-19895,26026,-19908,26016,-19921,26006,-19934,25995,-19948,25985,-19961,25975,-19974,25965,-19988,25954,-20001,25944,-20014,25934,-20027,25924,-20041,25913,-20054,25903,-20067,25893,-20080,25883,-20094,25872,-20107,25862,-20120,25852,-20133,25842,-20147,25831,-20160,25821,-20173,25811,-20186,25800,-20199,25790,-20213,25780,-20226,25769,-20239,25759,-20252,25749,-20265,25738,-20278,25728,-20292,25717,-20305,25707,-20318,25697,-20331,25686,-20344,25676,-20357,25665,-20370,25655,-20384,25645,-20397,25634,-20410,25624,-20423,25613,-20436,25603,-20449,25592,-20462,25582,-20475,25571,-20488,25561,-20501,25550,-20514,25540,-20528,25529,-20541,25519,-20554,25508,-20567,25498,-20580,25487,-20593,25477,-20606,25466,-20619,25456,-20632,25445,-20645,25435,-20658,25424,-20671,25414,-20684,25403,-20697,25392,-20710,25382,-20723,25371,-20736,25361,-20749,25350,-20762,25339,-20775,25329,-20788,25318,-20801,25307,-20814,25297,-20826,25286,-20839,25276,-20852,25265,-20865,25254,-20878,25243,-20891,25233,-20904,25222,-20917,25211,-20930,25201,-20943,25190,-20956,25179,-20968,25169,-20981,25158,-20994,25147,-21007,25136,-21020,25126,-21033,25115,-21046,25104,-21058,25093,-21071,25083,-21084,25072,-21097,25061,-21110,25050,-21123,25039,-21135,25029,-21148,25018,-21161,25007,-21174,24996,-21187,24985,-21199,24974,-21212,24964,-21225,24953,-21238,24942,-21250,24931,-21263,24920,-21276,24909,-21289,24898,-21301,24887,-21314,24877,-21327,24866,-21340,24855,-21352,24844,-21365,24833,-21378,24822,-21390,24811,-21403,24800,-21416,24789,-21428,24778,-21441,24767,-21454,24756,-21466,24745,-21479,24734,-21492,24723,-21504,24712,-21517,24701,-21530,24690,-21542,24679,-21555,24668,-21567,24657,-21580,24646,-21593,24635,-21605,24624,-21618,24613,-21630,24602,-21643,24591,-21656,24580,-21668,24569,-21681,24558,-21693,24546,-21706,24535,-21718,24524,-21731,24513,-21744,24502,-21756,24491,-21769,24480,-21781,24469,-21794,24457,-21806,24446,-21819,24435,-21831,24424,-21844,24413,-21856,24402,-21869,24390,-21881,24379,-21894,24368,-21906,24357,-21918,24346,-21931,24334,-21943,24323,-21956,24312,-21968,24301,-21981,24289,-21993,24278,-22005,24267,-22018,24256,-22030,24244,-22043,24233,-22055,24222,-22067,24211,-22080,24199,-22092,24188,-22105,24177,-22117,24165,-22129,24154,-22142,24143,-22154,24131,-22166,24120,-22179,24109,-22191,24097,-22203,24086,-22216,24075,-22228,24063,-22240,24052,-22253,24041,-22265,24029,-22277,24018,-22289,24006,-22302,23995,-22314,23984,-22326,23972,-22339,23961,-22351,23949,-22363,23938,-22375,23926,-22388,23915,-22400,23903,-22412,23892,-22424,23881,-22436,23869,-22449,23858,-22461,23846,-22473,23835,-22485,23823,-22497,23812,-22510,23800,-22522,23789,-22534,23777,-22546,23766,-22558,23754,-22570,23742,-22583,23731,-22595,23719,-22607,23708,-22619,23696,-22631,23685,-22643,23673,-22655,23661,-22667,23650,-22679,23638,-22692,23627,-22704,23615,-22716,23603,-22728,23592,-22740,23580,-22752,23569,-22764,23557,-22776,23545,-22788,23534,-22800,23522,-22812,23510,-22824,23499,-22836,23487,-22848,23475,-22860,23464,-22872,23452,-22884,23440,-22896,23428,-22908,23417,-22920,23405,-22932,23393,-22944,23382,-22956,23370,-22968,23358,-22980,23346,-22992,23335,-23004,23323,-23016,23311,-23028,23299,-23040,23287,-23051,23276,-23063,23264,-23075,23252,-23087,23240,-23099,23228,-23111,23217,-23123,23205,-23135,23193,-23147,23181,-23158,23169,-23170,23157,-23182,23146,-23194,23134,-23206,23122,-23218,23110,-23229,23098,-23241,23086,-23253,23074,-23265,23062,-23277,23050,-23288,23039,-23300,23027,-23312,23015,-23324,23003,-23336,22991,-23347,22979,-23359,22967,-23371,22955,-23383,22943,-23394,22931,-23406,22919,-23418,22907,-23429,22895,-23441,22883,-23453,22871,-23465,22859,-23476,22847,-23488,22835,-23500,22823,-23511,22811,-23523,22799,-23535,22787,-23546,22775,-23558,22763,-23570,22751,-23581,22739,-23593,22727,-23604,22715,-23616,22703,-23628,22691,-23639,22678,-23651,22666,-23662,22654,-23674,22642,-23686,22630,-23697,22618,-23709,22606,-23720,22594,-23732,22582,-23743,22569,-23755,22557,-23767,22545,-23778,22533,-23790,22521,-23801,22509,-23813,22496,-23824,22484,-23836,22472,-23847,22460,-23859,22448,-23870,22435,-23882,22423,-23893,22411,-23904,22399,-23916,22387,-23927,22374,-23939,22362,-23950,22350,-23962,22338,-23973,22325,-23985,22313,-23996,22301,-24007,22288,-24019,22276,-24030,22264,-24042,22252,-24053,22239,-24064,22227,-24076,22215,-24087,22202,-24098,22190,-24110,22178,-24121,22165,-24132,22153,-24144,22141,-24155,22128,-24166,22116,-24178,22104,-24189,22091,-24200,22079,-24212,22066,-24223,22054,-24234,22042,-24245,22029,-24257,22017,-24268,22004,-24279,21992,-24290,21980,-24302,21967,-24313,21955,-24324,21942,-24335,21930,-24347,21917,-24358,21905,-24369,21893,-24380,21880,-24391,21868,-24403,21855,-24414,21843,-24425,21830,-24436,21818,-24447,21805,-24458,21793,-24470,21780,-24481,21768,-24492,21755,-24503,21743,-24514,21730,-24525,21717,-24536,21705,-24547,21692,-24559,21680,-24570,21667,-24581,21655,-24592,21642,-24603,21629,-24614,21617,-24625,21604,-24636,21592,-24647,21579,-24658,21566,-24669,21554,-24680,21541,-24691,21529,-24702,21516,-24713,21503,-24724,21491,-24735,21478,-24746,21465,-24757,21453,-24768,21440,-24779,21427,-24790,21415,-24801,21402,-24812,21389,-24823,21377,-24834,21364,-24845,21351,-24856,21339,-24867,21326,-24878,21313,-24888,21300,-24899,21288,-24910,21275,-24921,21262,-24932,21249,-24943,21237,-24954,21224,-24965,21211,-24975,21198,-24986,21186,-24997,21173,-25008,21160,-25019,21147,-25030,21134,-25040,21122,-25051,21109,-25062,21096,-25073,21083,-25084,21070,-25094,21057,-25105,21045,-25116,21032,-25127,21019,-25137,21006,-25148,20993,-25159,20980,-25170,20967,-25180,20955,-25191,20942,-25202,20929,-25212,20916,-25223,20903,-25234,20890,-25244,20877,-25255,20864,-25266,20851,-25277,20838,-25287,20825,-25298,20813,-25308,20800,-25319,20787,-25330,20774,-25340,20761,-25351,20748,-25362,20735,-25372,20722,-25383,20709,-25393,20696,-25404,20683,-25415,20670,-25425,20657,-25436,20644,-25446,20631,-25457,20618,-25467,20605,-25478,20592,-25488,20579,-25499,20566,-25509,20553,-25520,20540,-25530,20527,-25541,20513,-25551,20500,-25562,20487,-25572,20474,-25583,20461,-25593,20448,-25604,20435,-25614,20422,-25625,20409,-25635,20396,-25646,20383,-25656,20369,-25666,20356,-25677,20343,-25687,20330,-25698,20317,-25708,20304,-25718,20291,-25729,20277,-25739,20264,-25750,20251,-25760,20238,-25770,20225,-25781,20212,-25791,20198,-25801,20185,-25812,20172,-25822,20159,-25832,20146,-25843,20132,-25853,20119,-25863,20106,-25873,20093,-25884,20079,-25894,20066,-25904,20053,-25914,20040,-25925,20026,-25935,20013,-25945,20000,-25955,19987,-25966,19973,-25976,19960,-25986,19947,-25996,19933,-26007,19920,-26017,19907,-26027,19894,-26037,19880,-26047,19867,-26057,19854,-26068,19840,-26078,19827,-26088,19814,-26098,19800,-26108,19787,-26118,19774,-26128,19760,-26138,19747,-26149,19733,-26159,19720,-26169,19707,-26179,19693,-26189,19680,-26199,19667,-26209,19653,-26219,19640,-26229,19626,-26239,19613,-26249,19599,-26259,19586,-26269,19573,-26279,19559,-26289,19546,-26299,19532,-26309,19519,-26319,19505,-26329,19492,-26339,19478,-26349,19465,-26359,19451,-26369,19438,-26379,19424,-26389,19411,-26399,19397,-26409,19384,-26419,19370,-26429,19357,-26438,19343,-26448,19330,-26458,19316,-26468,19303,-26478,19289,-26488,19276,-26498,19262,-26508,19249,-26517,19235,-26527,19221,-26537,19208,-26547,19194,-26557,19181,-26567,19167,-26576,19154,-26586,19140,-26596,19126,-26606,19113,-26616,19099,-26625,19086,-26635,19072,-26645,19058,-26655,19045,-26664,19031,-26674,19017,-26684,19004,-26693,18990,-26703,18976,-26713,18963,-26723,18949,-26732,18935,-26742,18922,-26752,18908,-26761,18894,-26771,18881,-26781,18867,-26790,18853,-26800,18840,-26810,18826,-26819,18812,-26829,18798,-26838,18785,-26848,18771,-26858,18757,-26867,18744,-26877,18730,-26886,18716,-26896,18702,-26906,18689,-26915,18675,-26925,18661,-26934,18647,-26944,18633,-26953,18620,-26963,18606,-26972,18592,-26982,18578,-26991,18564,-27001,18551,-27010,18537,-27020,18523,-27029,18509,-27039,18495,-27048,18482,-27058,18468,-27067,18454,-27077,18440,-27086,18426,-27095,18412,-27105,18398,-27114,18385,-27124,18371,-27133,18357,-27142,18343,-27152,18329,-27161,18315,-27171,18301,-27180,18287,-27189,18273,-27199,18260,-27208,18246,-27217,18232,-27227,18218,-27236,18204,-27245,18190,-27255,18176,-27264,18162,-27273,18148,-27282,18134,-27292,18120,-27301,18106,-27310,18092,-27320,18078,-27329,18064,-27338,18050,-27347,18036,-27356,18022,-27366,18008,-27375,17994,-27384,17980,-27393,17966,-27402,17952,-27412,17938,-27421,17924,-27430,17910,-27439,17896,-27448,17882,-27457,17868,-27467,17854,-27476,17840,-27485,17826,-27494,17812,-27503,17798,-27512,17784,-27521,17770,-27530,17756,-27539,17742,-27549,17727,-27558,17713,-27567,17699,-27576,17685,-27585,17671,-27594,17657,-27603,17643,-27612,17629,-27621,17615,-27630,17600,-27639,17586,-27648,17572,-27657,17558,-27666,17544,-27675,17530,-27684,17516,-27693,17501,-27702,17487,-27711,17473,-27720,17459,-27729,17445,-27737,17431,-27746,17416,-27755,17402,-27764,17388,-27773,17374,-27782,17360,-27791,17345,-27800,17331,-27809,17317,-27817,17303,-27826,17288,-27835,17274,-27844,17260,-27853,17246,-27862,17232,-27870,17217,-27879,17203,-27888,17189,-27897,17174,-27906,17160,-27914,17146,-27923,17132,-27932,17117,-27941,17103,-27949,17089,-27958,17074,-27967,17060,-27976,17046,-27984,17032,-27993,17017,-28002,17003,-28010,16989,-28019,16974,-28028,16960,-28037,16946,-28045,16931,-28054,16917,-28063,16903,-28071,16888,-28080,16874,-28088,16859,-28097,16845,-28106,16831,-28114,16816,-28123,16802,-28132,16788,-28140,16773,-28149,16759,-28157,16744,-28166,16730,-28174,16716,-28183,16701,-28191,16687,-28200,16672,-28209,16658,-28217,16643,-28226,16629,-28234,16615,-28243,16600,-28251,16586,-28260,16571,-28268,16557,-28276,16542,-28285,16528,-28293,16513,-28302,16499,-28310,16484,-28319,16470,-28327,16455,-28336,16441,-28344,16427,-28352,16412,-28361,16398,-28369,16383,-28378,16368,-28386,16354,-28394,16339,-28403,16325,-28411,16310,-28419,16296,-28428,16281,-28436,16267,-28444,16252,-28453,16238,-28461,16223,-28469,16209,-28478,16194,-28486,16179,-28494,16165,-28502,16150,-28511,16136,-28519,16121,-28527,16107,-28535,16092,-28544,16077,-28552,16063,-28560,16048,-28568,16034,-28576,16019,-28585,16004,-28593,15990,-28601,15975,-28609,15960,-28617,15946,-28626,15931,-28634,15917,-28642,15902,-28650,15887,-28658,15873,-28666,15858,-28674,15843,-28682,15829,-28691,15814,-28699,15799,-28707,15785,-28715,15770,-28723,15755,-28731,15740,-28739,15726,-28747,15711,-28755,15696,-28763,15682,-28771,15667,-28779,15652,-28787,15638,-28795,15623,-28803,15608,-28811,15593,-28819,15579,-28827,15564,-28835,15549,-28843,15534,-28851,15520,-28859,15505,-28867,15490,-28875,15475,-28883,15461,-28891,15446,-28898,15431,-28906,15416,-28914,15401,-28922,15387,-28930,15372,-28938,15357,-28946,15342,-28954,15327,-28961,15313,-28969,15298,-28977,15283,-28985,15268,-28993,15253,-29000,15238,-29008,15224,-29016,15209,-29024,15194,-29032,15179,-29039,15164,-29047,15149,-29055,15135,-29063,15120,-29070,15105,-29078,15090,-29086,15075,-29093,15060,-29101,15045,-29109,15030,-29117,15016,-29124,15001,-29132,14986,-29140,14971,-29147,14956,-29155,14941,-29163,14926,-29170,14911,-29178,14896,-29185,14881,-29193,14866,-29201,14852,-29208,14837,-29216,14822,-29223,14807,-29231,14792,-29239,14777,-29246,14762,-29254,14747,-29261,14732,-29269,14717,-29276,14702,-29284,14687,-29291,14672,-29299,14657,-29306,14642,-29314,14627,-29321,14612,-29329,14597,-29336,14582,-29344,14567,-29351,14552,-29359,14537,-29366,14522,-29373,14507,-29381,14492,-29388,14477,-29396,14462,-29403,14447,-29411,14432,-29418,14417,-29425,14402,-29433,14387,-29440,14372,-29447,14357,-29455,14342,-29462,14326,-29469,14311,-29477,14296,-29484,14281,-29491,14266,-29499,14251,-29506,14236,-29513,14221,-29520,14206,-29528,14191,-29535,14176,-29542,14160,-29549,14145,-29557,14130,-29564,14115,-29571,14100,-29578,14085,-29586,14070,-29593,14055,-29600,14039,-29607,14024,-29614,14009,-29622,13994,-29629,13979,-29636,13964,-29643,13949,-29650,13933,-29657,13918,-29664,13903,-29671,13888,-29679,13873,-29686,13858,-29693,13842,-29700,13827,-29707,13812,-29714,13797,-29721,13782,-29728,13766,-29735,13751,-29742,13736,-29749,13721,-29756,13706,-29763,13690,-29770,13675,-29777,13660,-29784,13645,-29791,13629,-29798,13614,-29805,13599,-29812,13584,-29819,13568,-29826,13553,-29833,13538,-29840,13523,-29847,13507,-29854,13492,-29861,13477,-29867,13462,-29874,13446,-29881,13431,-29888,13416,-29895,13400,-29902,13385,-29909,13370,-29916,13355,-29922,13339,-29929,13324,-29936,13309,-29943,13293,-29950,13278,-29956,13263,-29963,13247,-29970,13232,-29977,13217,-29984,13201,-29990,13186,-29997,13171,-30004,13155,-30010,13140,-30017,13125,-30024,13109,-30031,13094,-30037,13079,-30044,13063,-30051,13048,-30057,13033,-30064,13017,-30071,13002,-30077,12986,-30084,12971,-30091,12956,-30097,12940,-30104,12925,-30110,12909,-30117,12894,-30124,12879,-30130,12863,-30137,12848,-30143,12832,-30150,12817,-30157,12802,-30163,12786,-30170,12771,-30176,12755,-30183,12740,-30189,12724,-30196,12709,-30202,12694,-30209,12678,-30215,12663,-30222,12647,-30228,12632,-30235,12616,-30241,12601,-30248,12585,-30254,12570,-30260,12554,-30267,12539,-30273,12523,-30280,12508,-30286,12492,-30292,12477,-30299,12461,-30305,12446,-30312,12430,-30318,12415,-30324,12399,-30331,12384,-30337,12368,-30343,12353,-30350,12337,-30356,12322,-30362,12306,-30369,12291,-30375,12275,-30381,12260,-30387,12244,-30394,12229,-30400,12213,-30406,12198,-30412,12182,-30419,12166,-30425,12151,-30431,12135,-30437,12120,-30443,12104,-30450,12089,-30456,12073,-30462,12057,-30468,12042,-30474,12026,-30481,12011,-30487,11995,-30493,11980,-30499,11964,-30505,11948,-30511,11933,-30517,11917,-30523,11902,-30529,11886,-30536,11870,-30542,11855,-30548,11839,-30554,11823,-30560,11808,-30566,11792,-30572,11777,-30578,11761,-30584,11745,-30590,11730,-30596,11714,-30602,11698,-30608,11683,-30614,11667,-30620,11651,-30626,11636,-30632,11620,-30638,11604,-30644,11589,-30650,11573,-30656,11557,-30661,11542,-30667,11526,-30673,11510,-30679,11495,-30685,11479,-30691,11463,-30697,11448,-30703,11432,-30708,11416,-30714,11400,-30720,11385,-30726,11369,-30732,11353,-30738,11338,-30743,11322,-30749,11306,-30755,11290,-30761,11275,-30767,11259,-30772,11243,-30778,11227,-30784,11212,-30789,11196,-30795,11180,-30801,11164,-30807,11149,-30812,11133,-30818,11117,-30824,11101,-30829,11086,-30835,11070,-30841,11054,-30846,11038,-30852,11023,-30858,11007,-30863,10991,-30869,10975,-30875,10959,-30880,10944,-30886,10928,-30891,10912,-30897,10896,-30903,10880,-30908,10865,-30914,10849,-30919,10833,-30925,10817,-30930,10801,-30936,10786,-30941,10770,-30947,10754,-30952,10738,-30958,10722,-30963,10706,-30969,10691,-30974,10675,-30980,10659,-30985,10643,-30991,10627,-30996,10611,-31002,10596,-31007,10580,-31012,10564,-31018,10548,-31023,10532,-31029,10516,-31034,10500,-31039,10484,-31045,10469,-31050,10453,-31055,10437,-31061,10421,-31066,10405,-31071,10389,-31077,10373,-31082,10357,-31087,10342,-31093,10326,-31098,10310,-31103,10294,-31108,10278,-31114,10262,-31119,10246,-31124,10230,-31129,10214,-31135,10198,-31140,10182,-31145,10166,-31150,10151,-31155,10135,-31161,10119,-31166,10103,-31171,10087,-31176,10071,-31181,10055,-31186,10039,-31192,10023,-31197,10007,-31202,9991,-31207,9975,-31212,9959,-31217,9943,-31222,9927,-31227,9911,-31232,9895,-31237,9879,-31243,9863,-31248,9847,-31253,9831,-31258,9815,-31263,9799,-31268,9783,-31273,9767,-31278,9751,-31283,9735,-31288,9719,-31293,9703,-31298,9687,-31303,9671,-31308,9655,-31312,9639,-31317,9623,-31322,9607,-31327,9591,-31332,9575,-31337,9559,-31342,9543,-31347,9527,-31352,9511,-31357,9495,-31361,9479,-31366,9463,-31371,9447,-31376,9431,-31381,9415,-31386,9399,-31390,9383,-31395,9367,-31400,9351,-31405,9335,-31410,9319,-31414,9303,-31419,9287,-31424,9270,-31429,9254,-31433,9238,-31438,9222,-31443,9206,-31447,9190,-31452,9174,-31457,9158,-31462,9142,-31466,9126,-31471,9110,-31476,9094,-31480,9077,-31485,9061,-31490,9045,-31494,9029,-31499,9013,-31503,8997,-31508,8981,-31513,8965,-31517,8949,-31522,8932,-31526,8916,-31531,8900,-31535,8884,-31540,8868,-31545,8852,-31549,8836,-31554,8820,-31558,8803,-31563,8787,-31567,8771,-31572,8755,-31576,8739,-31581,8723,-31585,8707,-31589,8690,-31594,8674,-31598,8658,-31603,8642,-31607,8626,-31612,8610,-31616,8593,-31620,8577,-31625,8561,-31629,8545,-31634,8529,-31638,8513,-31642,8496,-31647,8480,-31651,8464,-31655,8448,-31660,8432,-31664,8415,-31668,8399,-31673,8383,-31677,8367,-31681,8351,-31685,8334,-31690,8318,-31694,8302,-31698,8286,-31702,8270,-31707,8253,-31711,8237,-31715,8221,-31719,8205,-31724,8189,-31728,8172,-31732,8156,-31736,8140,-31740,8124,-31744,8107,-31749,8091,-31753,8075,-31757,8059,-31761,8042,-31765,8026,-31769,8010,-31773,7994,-31777,7977,-31781,7961,-31786,7945,-31790,7929,-31794,7912,-31798,7896,-31802,7880,-31806,7864,-31810,7847,-31814,7831,-31818,7815,-31822,7799,-31826,7782,-31830,7766,-31834,7750,-31838,7733,-31842,7717,-31846,7701,-31850,7685,-31854,7668,-31857,7652,-31861,7636,-31865,7619,-31869,7603,-31873,7587,-31877,7571,-31881,7554,-31885,7538,-31889,7522,-31892,7505,-31896,7489,-31900,7473,-31904,7456,-31908,7440,-31912,7424,-31915,7407,-31919,7391,-31923,7375,-31927,7358,-31930,7342,-31934,7326,-31938,7310,-31942,7293,-31945,7277,-31949,7261,-31953,7244,-31957,7228,-31960,7211,-31964,7195,-31968,7179,-31971,7162,-31975,7146,-31979,7130,-31982,7113,-31986,7097,-31990,7081,-31993,7064,-31997,7048,-32000,7032,-32004,7015,-32008,6999,-32011,6982,-32015,6966,-32018,6950,-32022,6933,-32025,6917,-32029,6901,-32033,6884,-32036,6868,-32040,6851,-32043,6835,-32047,6819,-32050,6802,-32054,6786,-32057,6770,-32060,6753,-32064,6737,-32067,6720,-32071,6704,-32074,6688,-32078,6671,-32081,6655,-32085,6638,-32088,6622,-32091,6606,-32095,6589,-32098,6573,-32101,6556,-32105,6540,-32108,6523,-32111,6507,-32115,6491,-32118,6474,-32121,6458,-32125,6441,-32128,6425,-32131,6408,-32135,6392,-32138,6376,-32141,6359,-32144,6343,-32148,6326,-32151,6310,-32154,6293,-32157,6277,-32161,6261,-32164,6244,-32167,6228,-32170,6211,-32173,6195,-32177,6178,-32180,6162,-32183,6145,-32186,6129,-32189,6112,-32192,6096,-32195,6080,-32198,6063,-32202,6047,-32205,6030,-32208,6014,-32211,5997,-32214,5981,-32217,5964,-32220,5948,-32223,5931,-32226,5915,-32229,5898,-32232,5882,-32235,5865,-32238,5849,-32241,5832,-32244,5816,-32247,5799,-32250,5783,-32253,5766,-32256,5750,-32259,5733,-32262,5717,-32265,5700,-32268,5684,-32271,5667,-32274,5651,-32276,5634,-32279,5618,-32282,5601,-32285,5585,-32288,5568,-32291,5552,-32294,5535,-32296,5519,-32299,5502,-32302,5486,-32305,5469,-32308,5453,-32311,5436,-32313,5420,-32316,5403,-32319,5387,-32322,5370,-32324,5354,-32327,5337,-32330,5321,-32333,5304,-32335,5287,-32338,5271,-32341,5254,-32343,5238,-32346,5221,-32349,5205,-32351,5188,-32354,5172,-32357,5155,-32359,5139,-32362,5122,-32365,5106,-32367,5089,-32370,5072,-32372,5056,-32375,5039,-32378,5023,-32380,5006,-32383,4990,-32385,4973,-32388,4957,-32390,4940,-32393,4923,-32395,4907,-32398,4890,-32400,4874,-32403,4857,-32405,4841,-32408,4824,-32410,4807,-32413,4791,-32415,4774,-32418,4758,-32420,4741,-32423,4725,-32425,4708,-32427,4691,-32430,4675,-32432,4658,-32435,4642,-32437,4625,-32439,4608,-32442,4592,-32444,4575,-32446,4559,-32449,4542,-32451,4525,-32453,4509,-32456,4492,-32458,4476,-32460,4459,-32463,4443,-32465,4426,-32467,4409,-32469,4393,-32472,4376,-32474,4359,-32476,4343,-32478,4326,-32481,4310,-32483,4293,-32485,4276,-32487,4260,-32489,4243,-32492,4227,-32494,4210,-32496,4193,-32498,4177,-32500,4160,-32502,4144,-32504,4127,-32507,4110,-32509,4094,-32511,4077,-32513,4060,-32515,4044,-32517,4027,-32519,4011,-32521,3994,-32523,3977,-32525,3961,-32527,3944,-32529,3927,-32531,3911,-32533,3894,-32535,3877,-32537,3861,-32539,3844,-32541,3828,-32543,3811,-32545,3794,-32547,3778,-32549,3761,-32551,3744,-32553,3728,-32555,3711,-32557,3694,-32559,3678,-32560,3661,-32562,3644,-32564,3628,-32566,3611,-32568,3594,-32570,3578,-32572,3561,-32573,3545,-32575,3528,-32577,3511,-32579,3495,-32581,3478,-32582,3461,-32584,3445,-32586,3428,-32588,3411,-32589,3395,-32591,3378,-32593,3361,-32595,3345,-32596,3328,-32598,3311,-32600,3295,-32601,3278,-32603,3261,-32605,3245,-32606,3228,-32608,3211,-32610,3195,-32611,3178,-32613,3161,-32615,3145,-32616,3128,-32618,3111,-32619,3094,-32621,3078,-32623,3061,-32624,3044,-32626,3028,-32627,3011,-32629,2994,-32630,2978,-32632,2961,-32633,2944,-32635,2928,-32636,2911,-32638,2894,-32639,2878,-32641,2861,-32642,2844,-32644,2828,-32645,2811,-32647,2794,-32648,2777,-32650,2761,-32651,2744,-32652,2727,-32654,2711,-32655,2694,-32657,2677,-32658,2661,-32659,2644,-32661,2627,-32662,2610,-32663,2594,-32665,2577,-32666,2560,-32667,2544,-32669,2527,-32670,2510,-32671,2494,-32672,2477,-32674,2460,-32675,2443,-32676,2427,-32677,2410,-32679,2393,-32680,2377,-32681,2360,-32682,2343,-32684,2326,-32685,2310,-32686,2293,-32687,2276,-32688,2260,-32689,2243,-32691,2226,-32692,2209,-32693,2193,-32694,2176,-32695,2159,-32696,2143,-32697,2126,-32698,2109,-32700,2092,-32701,2076,-32702,2059,-32703,2042,-32704,2026,-32705,2009,-32706,1992,-32707,1975,-32708,1959,-32709,1942,-32710,1925,-32711,1908,-32712,1892,-32713,1875,-32714,1858,-32715,1842,-32716,1825,-32717,1808,-32718,1791,-32718,1775,-32719,1758,-32720,1741,-32721,1724,-32722,1708,-32723,1691,-32724,1674,-32725,1658,-32726,1641,-32726,1624,-32727,1607,-32728,1591,-32729,1574,-32730,1557,-32730,1540,-32731,1524,-32732,1507,-32733,1490,-32734,1473,-32734,1457,-32735,1440,-32736,1423,-32737,1406,-32737,1390,-32738,1373,-32739,1356,-32739,1339,-32740,1323,-32741,1306,-32741,1289,-32742,1273,-32743,1256,-32743,1239,-32744,1222,-32745,1206,-32745,1189,-32746,1172,-32747,1155,-32747,1139,-32748,1122,-32748,1105,-32749,1088,-32749,1072,-32750,1055,-32751,1038,-32751,1021,-32752,1005,-32752,988,-32753,971,-32753,954,-32754,938,-32754,921,-32755,904,-32755,887,-32755,871,-32756,854,-32756,837,-32757,820,-32757,804,-32758,787,-32758,770,-32758,753,-32759,737,-32759,720,-32760,703,-32760,686,-32760,670,-32761,653,-32761,636,-32761,619,-32762,603,-32762,586,-32762,569,-32763,552,-32763,536,-32763,519,-32763,502,-32764,485,-32764,469,-32764,452,-32764,435,-32765,418,-32765,402,-32765,385,-32765,368,-32765,351,-32766,335,-32766,318,-32766,301,-32766,284,-32766,268,-32766,251,-32767,234,-32767,217,-32767,201,-32767,184,-32767,167,-32767,150,-32767,134,-32767,117,-32767,100,-32767,83,-32767,67,-32767,50,-32767,33,-32767,16,-32767,0,-32767,-17,-32767,-34,-32767,-51,-32767,-68,-32767,-84,-32767,-101,-32767,-118,-32767,-135,-32767,-151,-32767,-168,-32767,-185,-32767,-202,-32767,-218,-32767,-235,-32767,-252,-32767,-269,-32766,-285,-32766,-302,-32766,-319,-32766,-336,-32766,-352,-32766,-369,-32765,-386,-32765,-403,-32765,-419,-32765,-436,-32765,-453,-32764,-470,-32764,-486,-32764,-503,-32764,-520,-32763,-537,-32763,-553,-32763,-570,-32763,-587,-32762,-604,-32762,-620,-32762,-637,-32761,-654,-32761,-671,-32761,-687,-32760,-704,-32760,-721,-32760,-738,-32759,-754,-32759,-771,-32758,-788,-32758,-805,-32758,-821,-32757,-838,-32757,-855,-32756,-872,-32756,-888,-32755,-905,-32755,-922,-32755,-939,-32754,-955,-32754,-972,-32753,-989,-32753,-1006,-32752,-1022,-32752,-1039,-32751,-1056,-32751,-1073,-32750,-1089,-32749,-1106,-32749,-1123,-32748,-1140,-32748,-1156,-32747,-1173,-32747,-1190,-32746,-1207,-32745,-1223,-32745,-1240,-32744,-1257,-32743,-1274,-32743,-1290,-32742,-1307,-32741,-1324,-32741,-1340,-32740,-1357,-32739,-1374,-32739,-1391,-32738,-1407,-32737,-1424,-32737,-1441,-32736,-1458,-32735,-1474,-32734,-1491,-32734,-1508,-32733,-1525,-32732,-1541,-32731,-1558,-32730,-1575,-32730,-1592,-32729,-1608,-32728,-1625,-32727,-1642,-32726,-1659,-32726,-1675,-32725,-1692,-32724,-1709,-32723,-1725,-32722,-1742,-32721,-1759,-32720,-1776,-32719,-1792,-32718,-1809,-32718,-1826,-32717,-1843,-32716,-1859,-32715,-1876,-32714,-1893,-32713,-1909,-32712,-1926,-32711,-1943,-32710,-1960,-32709,-1976,-32708,-1993,-32707,-2010,-32706,-2027,-32705,-2043,-32704,-2060,-32703,-2077,-32702,-2093,-32701,-2110,-32700,-2127,-32698,-2144,-32697,-2160,-32696,-2177,-32695,-2194,-32694,-2210,-32693,-2227,-32692,-2244,-32691,-2261,-32689,-2277,-32688,-2294,-32687,-2311,-32686,-2327,-32685,-2344,-32684,-2361,-32682,-2378,-32681,-2394,-32680,-2411,-32679,-2428,-32677,-2444,-32676,-2461,-32675,-2478,-32674,-2495,-32672,-2511,-32671,-2528,-32670,-2545,-32669,-2561,-32667,-2578,-32666,-2595,-32665,-2611,-32663,-2628,-32662,-2645,-32661,-2662,-32659,-2678,-32658,-2695,-32657,-2712,-32655,-2728,-32654,-2745,-32652,-2762,-32651,-2778,-32650,-2795,-32648,-2812,-32647,-2829,-32645,-2845,-32644,-2862,-32642,-2879,-32641,-2895,-32639,-2912,-32638,-2929,-32636,-2945,-32635,-2962,-32633,-2979,-32632,-2995,-32630,-3012,-32629,-3029,-32627,-3045,-32626,-3062,-32624,-3079,-32623,-3095,-32621,-3112,-32619,-3129,-32618,-3146,-32616,-3162,-32615,-3179,-32613,-3196,-32611,-3212,-32610,-3229,-32608,-3246,-32606,-3262,-32605,-3279,-32603,-3296,-32601,-3312,-32600,-3329,-32598,-3346,-32596,-3362,-32595,-3379,-32593,-3396,-32591,-3412,-32589,-3429,-32588,-3446,-32586,-3462,-32584,-3479,-32582,-3496,-32581,-3512,-32579,-3529,-32577,-3546,-32575,-3562,-32573,-3579,-32572,-3595,-32570,-3612,-32568,-3629,-32566,-3645,-32564,-3662,-32562,-3679,-32560,-3695,-32559,-3712,-32557,-3729,-32555,-3745,-32553,-3762,-32551,-3779,-32549,-3795,-32547,-3812,-32545,-3829,-32543,-3845,-32541,-3862,-32539,-3878,-32537,-3895,-32535,-3912,-32533,-3928,-32531,-3945,-32529,-3962,-32527,-3978,-32525,-3995,-32523,-4012,-32521,-4028,-32519,-4045,-32517,-4061,-32515,-4078,-32513,-4095,-32511,-4111,-32509,-4128,-32507,-4145,-32504,-4161,-32502,-4178,-32500,-4194,-32498,-4211,-32496,-4228,-32494,-4244,-32492,-4261,-32489,-4277,-32487,-4294,-32485,-4311,-32483,-4327,-32481,-4344,-32478,-4360,-32476,-4377,-32474,-4394,-32472,-4410,-32469,-4427,-32467,-4444,-32465,-4460,-32463,-4477,-32460,-4493,-32458,-4510,-32456,-4526,-32453,-4543,-32451,-4560,-32449,-4576,-32446,-4593,-32444,-4609,-32442,-4626,-32439,-4643,-32437,-4659,-32435,-4676,-32432,-4692,-32430,-4709,-32427,-4726,-32425,-4742,-32423,-4759,-32420,-4775,-32418,-4792,-32415,-4808,-32413,-4825,-32410,-4842,-32408,-4858,-32405,-4875,-32403,-4891,-32400,-4908,-32398,-4924,-32395,-4941,-32393,-4958,-32390,-4974,-32388,-4991,-32385,-5007,-32383,-5024,-32380,-5040,-32378,-5057,-32375,-5073,-32372,-5090,-32370,-5107,-32367,-5123,-32365,-5140,-32362,-5156,-32359,-5173,-32357,-5189,-32354,-5206,-32351,-5222,-32349,-5239,-32346,-5255,-32343,-5272,-32341,-5288,-32338,-5305,-32335,-5322,-32333,-5338,-32330,-5355,-32327,-5371,-32324,-5388,-32322,-5404,-32319,-5421,-32316,-5437,-32313,-5454,-32311,-5470,-32308,-5487,-32305,-5503,-32302,-5520,-32299,-5536,-32296,-5553,-32294,-5569,-32291,-5586,-32288,-5602,-32285,-5619,-32282,-5635,-32279,-5652,-32276,-5668,-32274,-5685,-32271,-5701,-32268,-5718,-32265,-5734,-32262,-5751,-32259,-5767,-32256,-5784,-32253,-5800,-32250,-5817,-32247,-5833,-32244,-5850,-32241,-5866,-32238,-5883,-32235,-5899,-32232,-5916,-32229,-5932,-32226,-5949,-32223,-5965,-32220,-5982,-32217,-5998,-32214,-6015,-32211,-6031,-32208,-6048,-32205,-6064,-32202,-6081,-32198,-6097,-32195,-6113,-32192,-6130,-32189,-6146,-32186,-6163,-32183,-6179,-32180,-6196,-32177,-6212,-32173,-6229,-32170,-6245,-32167,-6262,-32164,-6278,-32161,-6294,-32157,-6311,-32154,-6327,-32151,-6344,-32148,-6360,-32144,-6377,-32141,-6393,-32138,-6409,-32135,-6426,-32131,-6442,-32128,-6459,-32125,-6475,-32121,-6492,-32118,-6508,-32115,-6524,-32111,-6541,-32108,-6557,-32105,-6574,-32101,-6590,-32098,-6607,-32095,-6623,-32091,-6639,-32088,-6656,-32085,-6672,-32081,-6689,-32078,-6705,-32074,-6721,-32071,-6738,-32067,-6754,-32064,-6771,-32060,-6787,-32057,-6803,-32054,-6820,-32050,-6836,-32047,-6852,-32043,-6869,-32040,-6885,-32036,-6902,-32033,-6918,-32029,-6934,-32025,-6951,-32022,-6967,-32018,-6983,-32015,-7000,-32011,-7016,-32008,-7033,-32004,-7049,-32000,-7065,-31997,-7082,-31993,-7098,-31990,-7114,-31986,-7131,-31982,-7147,-31979,-7163,-31975,-7180,-31971,-7196,-31968,-7212,-31964,-7229,-31960,-7245,-31957,-7262,-31953,-7278,-31949,-7294,-31945,-7311,-31942,-7327,-31938,-7343,-31934,-7359,-31930,-7376,-31927,-7392,-31923,-7408,-31919,-7425,-31915,-7441,-31912,-7457,-31908,-7474,-31904,-7490,-31900,-7506,-31896,-7523,-31892,-7539,-31889,-7555,-31885,-7572,-31881,-7588,-31877,-7604,-31873,-7620,-31869,-7637,-31865,-7653,-31861,-7669,-31857,-7686,-31854,-7702,-31850,-7718,-31846,-7734,-31842,-7751,-31838,-7767,-31834,-7783,-31830,-7800,-31826,-7816,-31822,-7832,-31818,-7848,-31814,-7865,-31810,-7881,-31806,-7897,-31802,-7913,-31798,-7930,-31794,-7946,-31790,-7962,-31786,-7978,-31781,-7995,-31777,-8011,-31773,-8027,-31769,-8043,-31765,-8060,-31761,-8076,-31757,-8092,-31753,-8108,-31749,-8125,-31744,-8141,-31740,-8157,-31736,-8173,-31732,-8190,-31728,-8206,-31724,-8222,-31719,-8238,-31715,-8254,-31711,-8271,-31707,-8287,-31702,-8303,-31698,-8319,-31694,-8335,-31690,-8352,-31685,-8368,-31681,-8384,-31677,-8400,-31673,-8416,-31668,-8433,-31664,-8449,-31660,-8465,-31655,-8481,-31651,-8497,-31647,-8514,-31642,-8530,-31638,-8546,-31634,-8562,-31629,-8578,-31625,-8594,-31620,-8611,-31616,-8627,-31612,-8643,-31607,-8659,-31603,-8675,-31598,-8691,-31594,-8708,-31589,-8724,-31585,-8740,-31581,-8756,-31576,-8772,-31572,-8788,-31567,-8804,-31563,-8821,-31558,-8837,-31554,-8853,-31549,-8869,-31545,-8885,-31540,-8901,-31535,-8917,-31531,-8933,-31526,-8950,-31522,-8966,-31517,-8982,-31513,-8998,-31508,-9014,-31503,-9030,-31499,-9046,-31494,-9062,-31490,-9078,-31485,-9095,-31480,-9111,-31476,-9127,-31471,-9143,-31466,-9159,-31462,-9175,-31457,-9191,-31452,-9207,-31447,-9223,-31443,-9239,-31438,-9255,-31433,-9271,-31429,-9288,-31424,-9304,-31419,-9320,-31414,-9336,-31410,-9352,-31405,-9368,-31400,-9384,-31395,-9400,-31390,-9416,-31386,-9432,-31381,-9448,-31376,-9464,-31371,-9480,-31366,-9496,-31361,-9512,-31357,-9528,-31352,-9544,-31347,-9560,-31342,-9576,-31337,-9592,-31332,-9608,-31327,-9624,-31322,-9640,-31317,-9656,-31312,-9672,-31308,-9688,-31303,-9704,-31298,-9720,-31293,-9736,-31288,-9752,-31283,-9768,-31278,-9784,-31273,-9800,-31268,-9816,-31263,-9832,-31258,-9848,-31253,-9864,-31248,-9880,-31243,-9896,-31237,-9912,-31232,-9928,-31227,-9944,-31222,-9960,-31217,-9976,-31212,-9992,-31207,-10008,-31202,-10024,-31197,-10040,-31192,-10056,-31186,-10072,-31181,-10088,-31176,-10104,-31171,-10120,-31166,-10136,-31161,-10152,-31155,-10167,-31150,-10183,-31145,-10199,-31140,-10215,-31135,-10231,-31129,-10247,-31124,-10263,-31119,-10279,-31114,-10295,-31108,-10311,-31103,-10327,-31098,-10343,-31093,-10358,-31087,-10374,-31082,-10390,-31077,-10406,-31071,-10422,-31066,-10438,-31061,-10454,-31055,-10470,-31050,-10485,-31045,-10501,-31039,-10517,-31034,-10533,-31029,-10549,-31023,-10565,-31018,-10581,-31012,-10597,-31007,-10612,-31002,-10628,-30996,-10644,-30991,-10660,-30985,-10676,-30980,-10692,-30974,-10707,-30969,-10723,-30963,-10739,-30958,-10755,-30952,-10771,-30947,-10787,-30941,-10802,-30936,-10818,-30930,-10834,-30925,-10850,-30919,-10866,-30914,-10881,-30908,-10897,-30903,-10913,-30897,-10929,-30891,-10945,-30886,-10960,-30880,-10976,-30875,-10992,-30869,-11008,-30863,-11024,-30858,-11039,-30852,-11055,-30846,-11071,-30841,-11087,-30835,-11102,-30829,-11118,-30824,-11134,-30818,-11150,-30812,-11165,-30807,-11181,-30801,-11197,-30795,-11213,-30789,-11228,-30784,-11244,-30778,-11260,-30772,-11276,-30767,-11291,-30761,-11307,-30755,-11323,-30749,-11339,-30743,-11354,-30738,-11370,-30732,-11386,-30726,-11401,-30720,-11417,-30714,-11433,-30708,-11449,-30703,-11464,-30697,-11480,-30691,-11496,-30685,-11511,-30679,-11527,-30673,-11543,-30667,-11558,-30661,-11574,-30656,-11590,-30650,-11605,-30644,-11621,-30638,-11637,-30632,-11652,-30626,-11668,-30620,-11684,-30614,-11699,-30608,-11715,-30602,-11731,-30596,-11746,-30590,-11762,-30584,-11778,-30578,-11793,-30572,-11809,-30566,-11824,-30560,-11840,-30554,-11856,-30548,-11871,-30542,-11887,-30536,-11903,-30529,-11918,-30523,-11934,-30517,-11949,-30511,-11965,-30505,-11981,-30499,-11996,-30493,-12012,-30487,-12027,-30481,-12043,-30474,-12058,-30468,-12074,-30462,-12090,-30456,-12105,-30450,-12121,-30443,-12136,-30437,-12152,-30431,-12167,-30425,-12183,-30419,-12199,-30412,-12214,-30406,-12230,-30400,-12245,-30394,-12261,-30387,-12276,-30381,-12292,-30375,-12307,-30369,-12323,-30362,-12338,-30356,-12354,-30350,-12369,-30343,-12385,-30337,-12400,-30331,-12416,-30324,-12431,-30318,-12447,-30312,-12462,-30305,-12478,-30299,-12493,-30292,-12509,-30286,-12524,-30280,-12540,-30273,-12555,-30267,-12571,-30260,-12586,-30254,-12602,-30248,-12617,-30241,-12633,-30235,-12648,-30228,-12664,-30222,-12679,-30215,-12695,-30209,-12710,-30202,-12725,-30196,-12741,-30189,-12756,-30183,-12772,-30176,-12787,-30170,-12803,-30163,-12818,-30157,-12833,-30150,-12849,-30143,-12864,-30137,-12880,-30130,-12895,-30124,-12910,-30117,-12926,-30110,-12941,-30104,-12957,-30097,-12972,-30091,-12987,-30084,-13003,-30077,-13018,-30071,-13034,-30064,-13049,-30057,-13064,-30051,-13080,-30044,-13095,-30037,-13110,-30031,-13126,-30024,-13141,-30017,-13156,-30010,-13172,-30004,-13187,-29997,-13202,-29990,-13218,-29984,-13233,-29977,-13248,-29970,-13264,-29963,-13279,-29956,-13294,-29950,-13310,-29943,-13325,-29936,-13340,-29929,-13356,-29922,-13371,-29916,-13386,-29909,-13401,-29902,-13417,-29895,-13432,-29888,-13447,-29881,-13463,-29874,-13478,-29867,-13493,-29861,-13508,-29854,-13524,-29847,-13539,-29840,-13554,-29833,-13569,-29826,-13585,-29819,-13600,-29812,-13615,-29805,-13630,-29798,-13646,-29791,-13661,-29784,-13676,-29777,-13691,-29770,-13707,-29763,-13722,-29756,-13737,-29749,-13752,-29742,-13767,-29735,-13783,-29728,-13798,-29721,-13813,-29714,-13828,-29707,-13843,-29700,-13859,-29693,-13874,-29686,-13889,-29679,-13904,-29671,-13919,-29664,-13934,-29657,-13950,-29650,-13965,-29643,-13980,-29636,-13995,-29629,-14010,-29622,-14025,-29614,-14040,-29607,-14056,-29600,-14071,-29593,-14086,-29586,-14101,-29578,-14116,-29571,-14131,-29564,-14146,-29557,-14161,-29549,-14177,-29542,-14192,-29535,-14207,-29528,-14222,-29520,-14237,-29513,-14252,-29506,-14267,-29499,-14282,-29491,-14297,-29484,-14312,-29477,-14327,-29469,-14343,-29462,-14358,-29455,-14373,-29447,-14388,-29440,-14403,-29433,-14418,-29425,-14433,-29418,-14448,-29411,-14463,-29403,-14478,-29396,-14493,-29388,-14508,-29381,-14523,-29373,-14538,-29366,-14553,-29359,-14568,-29351,-14583,-29344,-14598,-29336,-14613,-29329,-14628,-29321,-14643,-29314,-14658,-29306,-14673,-29299,-14688,-29291,-14703,-29284,-14718,-29276,-14733,-29269,-14748,-29261,-14763,-29254,-14778,-29246,-14793,-29239,-14808,-29231,-14823,-29223,-14838,-29216,-14853,-29208,-14867,-29201,-14882,-29193,-14897,-29185,-14912,-29178,-14927,-29170,-14942,-29163,-14957,-29155,-14972,-29147,-14987,-29140,-15002,-29132,-15017,-29124,-15031,-29117,-15046,-29109,-15061,-29101,-15076,-29093,-15091,-29086,-15106,-29078,-15121,-29070,-15136,-29063,-15150,-29055,-15165,-29047,-15180,-29039,-15195,-29032,-15210,-29024,-15225,-29016,-15239,-29008,-15254,-29000,-15269,-28993,-15284,-28985,-15299,-28977,-15314,-28969,-15328,-28961,-15343,-28954,-15358,-28946,-15373,-28938,-15388,-28930,-15402,-28922,-15417,-28914,-15432,-28906,-15447,-28898,-15462,-28891,-15476,-28883,-15491,-28875,-15506,-28867,-15521,-28859,-15535,-28851,-15550,-28843,-15565,-28835,-15580,-28827,-15594,-28819,-15609,-28811,-15624,-28803,-15639,-28795,-15653,-28787,-15668,-28779,-15683,-28771,-15697,-28763,-15712,-28755,-15727,-28747,-15741,-28739,-15756,-28731,-15771,-28723,-15786,-28715,-15800,-28707,-15815,-28699,-15830,-28691,-15844,-28682,-15859,-28674,-15874,-28666,-15888,-28658,-15903,-28650,-15918,-28642,-15932,-28634,-15947,-28626,-15961,-28617,-15976,-28609,-15991,-28601,-16005,-28593,-16020,-28585,-16035,-28576,-16049,-28568,-16064,-28560,-16078,-28552,-16093,-28544,-16108,-28535,-16122,-28527,-16137,-28519,-16151,-28511,-16166,-28502,-16180,-28494,-16195,-28486,-16210,-28478,-16224,-28469,-16239,-28461,-16253,-28453,-16268,-28444,-16282,-28436,-16297,-28428,-16311,-28419,-16326,-28411,-16340,-28403,-16355,-28394,-16369,-28386,-16384,-28378,-16399,-28369,-16413,-28361,-16428,-28352,-16442,-28344,-16456,-28336,-16471,-28327,-16485,-28319,-16500,-28310,-16514,-28302,-16529,-28293,-16543,-28285,-16558,-28276,-16572,-28268,-16587,-28260,-16601,-28251,-16616,-28243,-16630,-28234,-16644,-28226,-16659,-28217,-16673,-28209,-16688,-28200,-16702,-28191,-16717,-28183,-16731,-28174,-16745,-28166,-16760,-28157,-16774,-28149,-16789,-28140,-16803,-28132,-16817,-28123,-16832,-28114,-16846,-28106,-16860,-28097,-16875,-28088,-16889,-28080,-16904,-28071,-16918,-28063,-16932,-28054,-16947,-28045,-16961,-28037,-16975,-28028,-16990,-28019,-17004,-28010,-17018,-28002,-17033,-27993,-17047,-27984,-17061,-27976,-17075,-27967,-17090,-27958,-17104,-27949,-17118,-27941,-17133,-27932,-17147,-27923,-17161,-27914,-17175,-27906,-17190,-27897,-17204,-27888,-17218,-27879,-17233,-27870,-17247,-27862,-17261,-27853,-17275,-27844,-17289,-27835,-17304,-27826,-17318,-27817,-17332,-27809,-17346,-27800,-17361,-27791,-17375,-27782,-17389,-27773,-17403,-27764,-17417,-27755,-17432,-27746,-17446,-27737,-17460,-27729,-17474,-27720,-17488,-27711,-17502,-27702,-17517,-27693,-17531,-27684,-17545,-27675,-17559,-27666,-17573,-27657,-17587,-27648,-17601,-27639,-17616,-27630,-17630,-27621,-17644,-27612,-17658,-27603,-17672,-27594,-17686,-27585,-17700,-27576,-17714,-27567,-17728,-27558,-17743,-27549,-17757,-27539,-17771,-27530,-17785,-27521,-17799,-27512,-17813,-27503,-17827,-27494,-17841,-27485,-17855,-27476,-17869,-27467,-17883,-27457,-17897,-27448,-17911,-27439,-17925,-27430,-17939,-27421,-17953,-27412,-17967,-27402,-17981,-27393,-17995,-27384,-18009,-27375,-18023,-27366,-18037,-27356,-18051,-27347,-18065,-27338,-18079,-27329,-18093,-27320,-18107,-27310,-18121,-27301,-18135,-27292,-18149,-27282,-18163,-27273,-18177,-27264,-18191,-27255,-18205,-27245,-18219,-27236,-18233,-27227,-18247,-27217,-18261,-27208,-18274,-27199,-18288,-27189,-18302,-27180,-18316,-27171,-18330,-27161,-18344,-27152,-18358,-27142,-18372,-27133,-18386,-27124,-18399,-27114,-18413,-27105,-18427,-27095,-18441,-27086,-18455,-27077,-18469,-27067,-18483,-27058,-18496,-27048,-18510,-27039,-18524,-27029,-18538,-27020,-18552,-27010,-18565,-27001,-18579,-26991,-18593,-26982,-18607,-26972,-18621,-26963,-18634,-26953,-18648,-26944,-18662,-26934,-18676,-26925,-18690,-26915,-18703,-26906,-18717,-26896,-18731,-26886,-18745,-26877,-18758,-26867,-18772,-26858,-18786,-26848,-18799,-26838,-18813,-26829,-18827,-26819,-18841,-26810,-18854,-26800,-18868,-26790,-18882,-26781,-18895,-26771,-18909,-26761,-18923,-26752,-18936,-26742,-18950,-26732,-18964,-26723,-18977,-26713,-18991,-26703,-19005,-26693,-19018,-26684,-19032,-26674,-19046,-26664,-19059,-26655,-19073,-26645,-19087,-26635,-19100,-26625,-19114,-26616,-19127,-26606,-19141,-26596,-19155,-26586,-19168,-26576,-19182,-26567,-19195,-26557,-19209,-26547,-19222,-26537,-19236,-26527,-19250,-26517,-19263,-26508,-19277,-26498,-19290,-26488,-19304,-26478,-19317,-26468,-19331,-26458,-19344,-26448,-19358,-26438,-19371,-26429,-19385,-26419,-19398,-26409,-19412,-26399,-19425,-26389,-19439,-26379,-19452,-26369,-19466,-26359,-19479,-26349,-19493,-26339,-19506,-26329,-19520,-26319,-19533,-26309,-19547,-26299,-19560,-26289,-19574,-26279,-19587,-26269,-19600,-26259,-19614,-26249,-19627,-26239,-19641,-26229,-19654,-26219,-19668,-26209,-19681,-26199,-19694,-26189,-19708,-26179,-19721,-26169,-19734,-26159,-19748,-26149,-19761,-26138,-19775,-26128,-19788,-26118,-19801,-26108,-19815,-26098,-19828,-26088,-19841,-26078,-19855,-26068,-19868,-26057,-19881,-26047,-19895,-26037,-19908,-26027,-19921,-26017,-19934,-26007,-19948,-25996,-19961,-25986,-19974,-25976,-19988,-25966,-20001,-25955,-20014,-25945,-20027,-25935,-20041,-25925,-20054,-25914,-20067,-25904,-20080,-25894,-20094,-25884,-20107,-25873,-20120,-25863,-20133,-25853,-20147,-25843,-20160,-25832,-20173,-25822,-20186,-25812,-20199,-25801,-20213,-25791,-20226,-25781,-20239,-25770,-20252,-25760,-20265,-25750,-20278,-25739,-20292,-25729,-20305,-25718,-20318,-25708,-20331,-25698,-20344,-25687,-20357,-25677,-20370,-25666,-20384,-25656,-20397,-25646,-20410,-25635,-20423,-25625,-20436,-25614,-20449,-25604,-20462,-25593,-20475,-25583,-20488,-25572,-20501,-25562,-20514,-25551,-20528,-25541,-20541,-25530,-20554,-25520,-20567,-25509,-20580,-25499,-20593,-25488,-20606,-25478,-20619,-25467,-20632,-25457,-20645,-25446,-20658,-25436,-20671,-25425,-20684,-25415,-20697,-25404,-20710,-25393,-20723,-25383,-20736,-25372,-20749,-25362,-20762,-25351,-20775,-25340,-20788,-25330,-20801,-25319,-20814,-25308,-20826,-25298,-20839,-25287,-20852,-25277,-20865,-25266,-20878,-25255,-20891,-25244,-20904,-25234,-20917,-25223,-20930,-25212,-20943,-25202,-20956,-25191,-20968,-25180,-20981,-25170,-20994,-25159,-21007,-25148,-21020,-25137,-21033,-25127,-21046,-25116,-21058,-25105,-21071,-25094,-21084,-25084,-21097,-25073,-21110,-25062,-21123,-25051,-21135,-25040,-21148,-25030,-21161,-25019,-21174,-25008,-21187,-24997,-21199,-24986,-21212,-24975,-21225,-24965,-21238,-24954,-21250,-24943,-21263,-24932,-21276,-24921,-21289,-24910,-21301,-24899,-21314,-24888,-21327,-24878,-21340,-24867,-21352,-24856,-21365,-24845,-21378,-24834,-21390,-24823,-21403,-24812,-21416,-24801,-21428,-24790,-21441,-24779,-21454,-24768,-21466,-24757,-21479,-24746,-21492,-24735,-21504,-24724,-21517,-24713,-21530,-24702,-21542,-24691,-21555,-24680,-21567,-24669,-21580,-24658,-21593,-24647,-21605,-24636,-21618,-24625,-21630,-24614,-21643,-24603,-21656,-24592,-21668,-24581,-21681,-24570,-21693,-24559,-21706,-24547,-21718,-24536,-21731,-24525,-21744,-24514,-21756,-24503,-21769,-24492,-21781,-24481,-21794,-24470,-21806,-24458,-21819,-24447,-21831,-24436,-21844,-24425,-21856,-24414,-21869,-24403,-21881,-24391,-21894,-24380,-21906,-24369,-21918,-24358,-21931,-24347,-21943,-24335,-21956,-24324,-21968,-24313,-21981,-24302,-21993,-24290,-22005,-24279,-22018,-24268,-22030,-24257,-22043,-24245,-22055,-24234,-22067,-24223,-22080,-24212,-22092,-24200,-22105,-24189,-22117,-24178,-22129,-24166,-22142,-24155,-22154,-24144,-22166,-24132,-22179,-24121,-22191,-24110,-22203,-24098,-22216,-24087,-22228,-24076,-22240,-24064,-22253,-24053,-22265,-24042,-22277,-24030,-22289,-24019,-22302,-24007,-22314,-23996,-22326,-23985,-22339,-23973,-22351,-23962,-22363,-23950,-22375,-23939,-22388,-23927,-22400,-23916,-22412,-23904,-22424,-23893,-22436,-23882,-22449,-23870,-22461,-23859,-22473,-23847,-22485,-23836,-22497,-23824,-22510,-23813,-22522,-23801,-22534,-23790,-22546,-23778,-22558,-23767,-22570,-23755,-22583,-23743,-22595,-23732,-22607,-23720,-22619,-23709,-22631,-23697,-22643,-23686,-22655,-23674,-22667,-23662,-22679,-23651,-22692,-23639,-22704,-23628,-22716,-23616,-22728,-23604,-22740,-23593,-22752,-23581,-22764,-23570,-22776,-23558,-22788,-23546,-22800,-23535,-22812,-23523,-22824,-23511,-22836,-23500,-22848,-23488,-22860,-23476,-22872,-23465,-22884,-23453,-22896,-23441,-22908,-23429,-22920,-23418,-22932,-23406,-22944,-23394,-22956,-23383,-22968,-23371,-22980,-23359,-22992,-23347,-23004,-23336,-23016,-23324,-23028,-23312,-23040,-23300,-23051,-23288,-23063,-23277,-23075,-23265,-23087,-23253,-23099,-23241,-23111,-23229,-23123,-23218,-23135,-23206,-23147,-23194,-23158,-23182,-23170,-23170,-23182,-23158,-23194,-23147,-23206,-23135,-23218,-23123,-23229,-23111,-23241,-23099,-23253,-23087,-23265,-23075,-23277,-23063,-23288,-23051,-23300,-23040,-23312,-23028,-23324,-23016,-23336,-23004,-23347,-22992,-23359,-22980,-23371,-22968,-23383,-22956,-23394,-22944,-23406,-22932,-23418,-22920,-23429,-22908,-23441,-22896,-23453,-22884,-23465,-22872,-23476,-22860,-23488,-22848,-23500,-22836,-23511,-22824,-23523,-22812,-23535,-22800,-23546,-22788,-23558,-22776,-23570,-22764,-23581,-22752,-23593,-22740,-23604,-22728,-23616,-22716,-23628,-22704,-23639,-22692,-23651,-22679,-23662,-22667,-23674,-22655,-23686,-22643,-23697,-22631,-23709,-22619,-23720,-22607,-23732,-22595,-23743,-22583,-23755,-22570,-23767,-22558,-23778,-22546,-23790,-22534,-23801,-22522,-23813,-22510,-23824,-22497,-23836,-22485,-23847,-22473,-23859,-22461,-23870,-22449,-23882,-22436,-23893,-22424,-23904,-22412,-23916,-22400,-23927,-22388,-23939,-22375,-23950,-22363,-23962,-22351,-23973,-22339,-23985,-22326,-23996,-22314,-24007,-22302,-24019,-22289,-24030,-22277,-24042,-22265,-24053,-22253,-24064,-22240,-24076,-22228,-24087,-22216,-24098,-22203,-24110,-22191,-24121,-22179,-24132,-22166,-24144,-22154,-24155,-22142,-24166,-22129,-24178,-22117,-24189,-22105,-24200,-22092,-24212,-22080,-24223,-22067,-24234,-22055,-24245,-22043,-24257,-22030,-24268,-22018,-24279,-22005,-24290,-21993,-24302,-21981,-24313,-21968,-24324,-21956,-24335,-21943,-24347,-21931,-24358,-21918,-24369,-21906,-24380,-21894,-24391,-21881,-24403,-21869,-24414,-21856,-24425,-21844,-24436,-21831,-24447,-21819,-24458,-21806,-24470,-21794,-24481,-21781,-24492,-21769,-24503,-21756,-24514,-21744,-24525,-21731,-24536,-21718,-24547,-21706,-24559,-21693,-24570,-21681,-24581,-21668,-24592,-21656,-24603,-21643,-24614,-21630,-24625,-21618,-24636,-21605,-24647,-21593,-24658,-21580,-24669,-21567,-24680,-21555,-24691,-21542,-24702,-21530,-24713,-21517,-24724,-21504,-24735,-21492,-24746,-21479,-24757,-21466,-24768,-21454,-24779,-21441,-24790,-21428,-24801,-21416,-24812,-21403,-24823,-21390,-24834,-21378,-24845,-21365,-24856,-21352,-24867,-21340,-24878,-21327,-24888,-21314,-24899,-21301,-24910,-21289,-24921,-21276,-24932,-21263,-24943,-21250,-24954,-21238,-24965,-21225,-24975,-21212,-24986,-21199,-24997,-21187,-25008,-21174,-25019,-21161,-25030,-21148,-25040,-21135,-25051,-21123,-25062,-21110,-25073,-21097,-25084,-21084,-25094,-21071,-25105,-21058,-25116,-21046,-25127,-21033,-25137,-21020,-25148,-21007,-25159,-20994,-25170,-20981,-25180,-20968,-25191,-20956,-25202,-20943,-25212,-20930,-25223,-20917,-25234,-20904,-25244,-20891,-25255,-20878,-25266,-20865,-25277,-20852,-25287,-20839,-25298,-20826,-25308,-20814,-25319,-20801,-25330,-20788,-25340,-20775,-25351,-20762,-25362,-20749,-25372,-20736,-25383,-20723,-25393,-20710,-25404,-20697,-25415,-20684,-25425,-20671,-25436,-20658,-25446,-20645,-25457,-20632,-25467,-20619,-25478,-20606,-25488,-20593,-25499,-20580,-25509,-20567,-25520,-20554,-25530,-20541,-25541,-20528,-25551,-20514,-25562,-20501,-25572,-20488,-25583,-20475,-25593,-20462,-25604,-20449,-25614,-20436,-25625,-20423,-25635,-20410,-25646,-20397,-25656,-20384,-25666,-20370,-25677,-20357,-25687,-20344,-25698,-20331,-25708,-20318,-25718,-20305,-25729,-20292,-25739,-20278,-25750,-20265,-25760,-20252,-25770,-20239,-25781,-20226,-25791,-20213,-25801,-20199,-25812,-20186,-25822,-20173,-25832,-20160,-25843,-20147,-25853,-20133,-25863,-20120,-25873,-20107,-25884,-20094,-25894,-20080,-25904,-20067,-25914,-20054,-25925,-20041,-25935,-20027,-25945,-20014,-25955,-20001,-25966,-19988,-25976,-19974,-25986,-19961,-25996,-19948,-26007,-19934,-26017,-19921,-26027,-19908,-26037,-19895,-26047,-19881,-26057,-19868,-26068,-19855,-26078,-19841,-26088,-19828,-26098,-19815,-26108,-19801,-26118,-19788,-26128,-19775,-26138,-19761,-26149,-19748,-26159,-19734,-26169,-19721,-26179,-19708,-26189,-19694,-26199,-19681,-26209,-19668,-26219,-19654,-26229,-19641,-26239,-19627,-26249,-19614,-26259,-19600,-26269,-19587,-26279,-19574,-26289,-19560,-26299,-19547,-26309,-19533,-26319,-19520,-26329,-19506,-26339,-19493,-26349,-19479,-26359,-19466,-26369,-19452,-26379,-19439,-26389,-19425,-26399,-19412,-26409,-19398,-26419,-19385,-26429,-19371,-26438,-19358,-26448,-19344,-26458,-19331,-26468,-19317,-26478,-19304,-26488,-19290,-26498,-19277,-26508,-19263,-26517,-19250,-26527,-19236,-26537,-19222,-26547,-19209,-26557,-19195,-26567,-19182,-26576,-19168,-26586,-19155,-26596,-19141,-26606,-19127,-26616,-19114,-26625,-19100,-26635,-19087,-26645,-19073,-26655,-19059,-26664,-19046,-26674,-19032,-26684,-19018,-26693,-19005,-26703,-18991,-26713,-18977,-26723,-18964,-26732,-18950,-26742,-18936,-26752,-18923,-26761,-18909,-26771,-18895,-26781,-18882,-26790,-18868,-26800,-18854,-26810,-18841,-26819,-18827,-26829,-18813,-26838,-18799,-26848,-18786,-26858,-18772,-26867,-18758,-26877,-18745,-26886,-18731,-26896,-18717,-26906,-18703,-26915,-18690,-26925,-18676,-26934,-18662,-26944,-18648,-26953,-18634,-26963,-18621,-26972,-18607,-26982,-18593,-26991,-18579,-27001,-18565,-27010,-18552,-27020,-18538,-27029,-18524,-27039,-18510,-27048,-18496,-27058,-18483,-27067,-18469,-27077,-18455,-27086,-18441,-27095,-18427,-27105,-18413,-27114,-18399,-27124,-18386,-27133,-18372,-27142,-18358,-27152,-18344,-27161,-18330,-27171,-18316,-27180,-18302,-27189,-18288,-27199,-18274,-27208,-18261,-27217,-18247,-27227,-18233,-27236,-18219,-27245,-18205,-27255,-18191,-27264,-18177,-27273,-18163,-27282,-18149,-27292,-18135,-27301,-18121,-27310,-18107,-27320,-18093,-27329,-18079,-27338,-18065,-27347,-18051,-27356,-18037,-27366,-18023,-27375,-18009,-27384,-17995,-27393,-17981,-27402,-17967,-27412,-17953,-27421,-17939,-27430,-17925,-27439,-17911,-27448,-17897,-27457,-17883,-27467,-17869,-27476,-17855,-27485,-17841,-27494,-17827,-27503,-17813,-27512,-17799,-27521,-17785,-27530,-17771,-27539,-17757,-27549,-17743,-27558,-17728,-27567,-17714,-27576,-17700,-27585,-17686,-27594,-17672,-27603,-17658,-27612,-17644,-27621,-17630,-27630,-17616,-27639,-17601,-27648,-17587,-27657,-17573,-27666,-17559,-27675,-17545,-27684,-17531,-27693,-17517,-27702,-17502,-27711,-17488,-27720,-17474,-27729,-17460,-27737,-17446,-27746,-17432,-27755,-17417,-27764,-17403,-27773,-17389,-27782,-17375,-27791,-17361,-27800,-17346,-27809,-17332,-27817,-17318,-27826,-17304,-27835,-17289,-27844,-17275,-27853,-17261,-27862,-17247,-27870,-17233,-27879,-17218,-27888,-17204,-27897,-17190,-27906,-17175,-27914,-17161,-27923,-17147,-27932,-17133,-27941,-17118,-27949,-17104,-27958,-17090,-27967,-17075,-27976,-17061,-27984,-17047,-27993,-17033,-28002,-17018,-28010,-17004,-28019,-16990,-28028,-16975,-28037,-16961,-28045,-16947,-28054,-16932,-28063,-16918,-28071,-16904,-28080,-16889,-28088,-16875,-28097,-16860,-28106,-16846,-28114,-16832,-28123,-16817,-28132,-16803,-28140,-16789,-28149,-16774,-28157,-16760,-28166,-16745,-28174,-16731,-28183,-16717,-28191,-16702,-28200,-16688,-28209,-16673,-28217,-16659,-28226,-16644,-28234,-16630,-28243,-16616,-28251,-16601,-28260,-16587,-28268,-16572,-28276,-16558,-28285,-16543,-28293,-16529,-28302,-16514,-28310,-16500,-28319,-16485,-28327,-16471,-28336,-16456,-28344,-16442,-28352,-16428,-28361,-16413,-28369,-16399,-28378,-16384,-28386,-16369,-28394,-16355,-28403,-16340,-28411,-16326,-28419,-16311,-28428,-16297,-28436,-16282,-28444,-16268,-28453,-16253,-28461,-16239,-28469,-16224,-28478,-16210,-28486,-16195,-28494,-16180,-28502,-16166,-28511,-16151,-28519,-16137,-28527,-16122,-28535,-16108,-28544,-16093,-28552,-16078,-28560,-16064,-28568,-16049,-28576,-16035,-28585,-16020,-28593,-16005,-28601,-15991,-28609,-15976,-28617,-15961,-28626,-15947,-28634,-15932,-28642,-15918,-28650,-15903,-28658,-15888,-28666,-15874,-28674,-15859,-28682,-15844,-28691,-15830,-28699,-15815,-28707,-15800,-28715,-15786,-28723,-15771,-28731,-15756,-28739,-15741,-28747,-15727,-28755,-15712,-28763,-15697,-28771,-15683,-28779,-15668,-28787,-15653,-28795,-15639,-28803,-15624,-28811,-15609,-28819,-15594,-28827,-15580,-28835,-15565,-28843,-15550,-28851,-15535,-28859,-15521,-28867,-15506,-28875,-15491,-28883,-15476,-28891,-15462,-28898,-15447,-28906,-15432,-28914,-15417,-28922,-15402,-28930,-15388,-28938,-15373,-28946,-15358,-28954,-15343,-28961,-15328,-28969,-15314,-28977,-15299,-28985,-15284,-28993,-15269,-29000,-15254,-29008,-15239,-29016,-15225,-29024,-15210,-29032,-15195,-29039,-15180,-29047,-15165,-29055,-15150,-29063,-15136,-29070,-15121,-29078,-15106,-29086,-15091,-29093,-15076,-29101,-15061,-29109,-15046,-29117,-15031,-29124,-15017,-29132,-15002,-29140,-14987,-29147,-14972,-29155,-14957,-29163,-14942,-29170,-14927,-29178,-14912,-29185,-14897,-29193,-14882,-29201,-14867,-29208,-14853,-29216,-14838,-29223,-14823,-29231,-14808,-29239,-14793,-29246,-14778,-29254,-14763,-29261,-14748,-29269,-14733,-29276,-14718,-29284,-14703,-29291,-14688,-29299,-14673,-29306,-14658,-29314,-14643,-29321,-14628,-29329,-14613,-29336,-14598,-29344,-14583,-29351,-14568,-29359,-14553,-29366,-14538,-29373,-14523,-29381,-14508,-29388,-14493,-29396,-14478,-29403,-14463,-29411,-14448,-29418,-14433,-29425,-14418,-29433,-14403,-29440,-14388,-29447,-14373,-29455,-14358,-29462,-14343,-29469,-14327,-29477,-14312,-29484,-14297,-29491,-14282,-29499,-14267,-29506,-14252,-29513,-14237,-29520,-14222,-29528,-14207,-29535,-14192,-29542,-14177,-29549,-14161,-29557,-14146,-29564,-14131,-29571,-14116,-29578,-14101,-29586,-14086,-29593,-14071,-29600,-14056,-29607,-14040,-29614,-14025,-29622,-14010,-29629,-13995,-29636,-13980,-29643,-13965,-29650,-13950,-29657,-13934,-29664,-13919,-29671,-13904,-29679,-13889,-29686,-13874,-29693,-13859,-29700,-13843,-29707,-13828,-29714,-13813,-29721,-13798,-29728,-13783,-29735,-13767,-29742,-13752,-29749,-13737,-29756,-13722,-29763,-13707,-29770,-13691,-29777,-13676,-29784,-13661,-29791,-13646,-29798,-13630,-29805,-13615,-29812,-13600,-29819,-13585,-29826,-13569,-29833,-13554,-29840,-13539,-29847,-13524,-29854,-13508,-29861,-13493,-29867,-13478,-29874,-13463,-29881,-13447,-29888,-13432,-29895,-13417,-29902,-13401,-29909,-13386,-29916,-13371,-29922,-13356,-29929,-13340,-29936,-13325,-29943,-13310,-29950,-13294,-29956,-13279,-29963,-13264,-29970,-13248,-29977,-13233,-29984,-13218,-29990,-13202,-29997,-13187,-30004,-13172,-30010,-13156,-30017,-13141,-30024,-13126,-30031,-13110,-30037,-13095,-30044,-13080,-30051,-13064,-30057,-13049,-30064,-13034,-30071,-13018,-30077,-13003,-30084,-12987,-30091,-12972,-30097,-12957,-30104,-12941,-30110,-12926,-30117,-12910,-30124,-12895,-30130,-12880,-30137,-12864,-30143,-12849,-30150,-12833,-30157,-12818,-30163,-12803,-30170,-12787,-30176,-12772,-30183,-12756,-30189,-12741,-30196,-12725,-30202,-12710,-30209,-12695,-30215,-12679,-30222,-12664,-30228,-12648,-30235,-12633,-30241,-12617,-30248,-12602,-30254,-12586,-30260,-12571,-30267,-12555,-30273,-12540,-30280,-12524,-30286,-12509,-30292,-12493,-30299,-12478,-30305,-12462,-30312,-12447,-30318,-12431,-30324,-12416,-30331,-12400,-30337,-12385,-30343,-12369,-30350,-12354,-30356,-12338,-30362,-12323,-30369,-12307,-30375,-12292,-30381,-12276,-30387,-12261,-30394,-12245,-30400,-12230,-30406,-12214,-30412,-12199,-30419,-12183,-30425,-12167,-30431,-12152,-30437,-12136,-30443,-12121,-30450,-12105,-30456,-12090,-30462,-12074,-30468,-12058,-30474,-12043,-30481,-12027,-30487,-12012,-30493,-11996,-30499,-11981,-30505,-11965,-30511,-11949,-30517,-11934,-30523,-11918,-30529,-11903,-30536,-11887,-30542,-11871,-30548,-11856,-30554,-11840,-30560,-11824,-30566,-11809,-30572,-11793,-30578,-11778,-30584,-11762,-30590,-11746,-30596,-11731,-30602,-11715,-30608,-11699,-30614,-11684,-30620,-11668,-30626,-11652,-30632,-11637,-30638,-11621,-30644,-11605,-30650,-11590,-30656,-11574,-30661,-11558,-30667,-11543,-30673,-11527,-30679,-11511,-30685,-11496,-30691,-11480,-30697,-11464,-30703,-11449,-30708,-11433,-30714,-11417,-30720,-11401,-30726,-11386,-30732,-11370,-30738,-11354,-30743,-11339,-30749,-11323,-30755,-11307,-30761,-11291,-30767,-11276,-30772,-11260,-30778,-11244,-30784,-11228,-30789,-11213,-30795,-11197,-30801,-11181,-30807,-11165,-30812,-11150,-30818,-11134,-30824,-11118,-30829,-11102,-30835,-11087,-30841,-11071,-30846,-11055,-30852,-11039,-30858,-11024,-30863,-11008,-30869,-10992,-30875,-10976,-30880,-10960,-30886,-10945,-30891,-10929,-30897,-10913,-30903,-10897,-30908,-10881,-30914,-10866,-30919,-10850,-30925,-10834,-30930,-10818,-30936,-10802,-30941,-10787,-30947,-10771,-30952,-10755,-30958,-10739,-30963,-10723,-30969,-10707,-30974,-10692,-30980,-10676,-30985,-10660,-30991,-10644,-30996,-10628,-31002,-10612,-31007,-10597,-31012,-10581,-31018,-10565,-31023,-10549,-31029,-10533,-31034,-10517,-31039,-10501,-31045,-10485,-31050,-10470,-31055,-10454,-31061,-10438,-31066,-10422,-31071,-10406,-31077,-10390,-31082,-10374,-31087,-10358,-31093,-10343,-31098,-10327,-31103,-10311,-31108,-10295,-31114,-10279,-31119,-10263,-31124,-10247,-31129,-10231,-31135,-10215,-31140,-10199,-31145,-10183,-31150,-10167,-31155,-10152,-31161,-10136,-31166,-10120,-31171,-10104,-31176,-10088,-31181,-10072,-31186,-10056,-31192,-10040,-31197,-10024,-31202,-10008,-31207,-9992,-31212,-9976,-31217,-9960,-31222,-9944,-31227,-9928,-31232,-9912,-31237,-9896,-31243,-9880,-31248,-9864,-31253,-9848,-31258,-9832,-31263,-9816,-31268,-9800,-31273,-9784,-31278,-9768,-31283,-9752,-31288,-9736,-31293,-9720,-31298,-9704,-31303,-9688,-31308,-9672,-31312,-9656,-31317,-9640,-31322,-9624,-31327,-9608,-31332,-9592,-31337,-9576,-31342,-9560,-31347,-9544,-31352,-9528,-31357,-9512,-31361,-9496,-31366,-9480,-31371,-9464,-31376,-9448,-31381,-9432,-31386,-9416,-31390,-9400,-31395,-9384,-31400,-9368,-31405,-9352,-31410,-9336,-31414,-9320,-31419,-9304,-31424,-9288,-31429,-9271,-31433,-9255,-31438,-9239,-31443,-9223,-31447,-9207,-31452,-9191,-31457,-9175,-31462,-9159,-31466,-9143,-31471,-9127,-31476,-9111,-31480,-9095,-31485,-9078,-31490,-9062,-31494,-9046,-31499,-9030,-31503,-9014,-31508,-8998,-31513,-8982,-31517,-8966,-31522,-8950,-31526,-8933,-31531,-8917,-31535,-8901,-31540,-8885,-31545,-8869,-31549,-8853,-31554,-8837,-31558,-8821,-31563,-8804,-31567,-8788,-31572,-8772,-31576,-8756,-31581,-8740,-31585,-8724,-31589,-8708,-31594,-8691,-31598,-8675,-31603,-8659,-31607,-8643,-31612,-8627,-31616,-8611,-31620,-8594,-31625,-8578,-31629,-8562,-31634,-8546,-31638,-8530,-31642,-8514,-31647,-8497,-31651,-8481,-31655,-8465,-31660,-8449,-31664,-8433,-31668,-8416,-31673,-8400,-31677,-8384,-31681,-8368,-31685,-8352,-31690,-8335,-31694,-8319,-31698,-8303,-31702,-8287,-31707,-8271,-31711,-8254,-31715,-8238,-31719,-8222,-31724,-8206,-31728,-8190,-31732,-8173,-31736,-8157,-31740,-8141,-31744,-8125,-31749,-8108,-31753,-8092,-31757,-8076,-31761,-8060,-31765,-8043,-31769,-8027,-31773,-8011,-31777,-7995,-31781,-7978,-31786,-7962,-31790,-7946,-31794,-7930,-31798,-7913,-31802,-7897,-31806,-7881,-31810,-7865,-31814,-7848,-31818,-7832,-31822,-7816,-31826,-7800,-31830,-7783,-31834,-7767,-31838,-7751,-31842,-7734,-31846,-7718,-31850,-7702,-31854,-7686,-31857,-7669,-31861,-7653,-31865,-7637,-31869,-7620,-31873,-7604,-31877,-7588,-31881,-7572,-31885,-7555,-31889,-7539,-31892,-7523,-31896,-7506,-31900,-7490,-31904,-7474,-31908,-7457,-31912,-7441,-31915,-7425,-31919,-7408,-31923,-7392,-31927,-7376,-31930,-7359,-31934,-7343,-31938,-7327,-31942,-7311,-31945,-7294,-31949,-7278,-31953,-7262,-31957,-7245,-31960,-7229,-31964,-7212,-31968,-7196,-31971,-7180,-31975,-7163,-31979,-7147,-31982,-7131,-31986,-7114,-31990,-7098,-31993,-7082,-31997,-7065,-32000,-7049,-32004,-7033,-32008,-7016,-32011,-7000,-32015,-6983,-32018,-6967,-32022,-6951,-32025,-6934,-32029,-6918,-32033,-6902,-32036,-6885,-32040,-6869,-32043,-6852,-32047,-6836,-32050,-6820,-32054,-6803,-32057,-6787,-32060,-6771,-32064,-6754,-32067,-6738,-32071,-6721,-32074,-6705,-32078,-6689,-32081,-6672,-32085,-6656,-32088,-6639,-32091,-6623,-32095,-6607,-32098,-6590,-32101,-6574,-32105,-6557,-32108,-6541,-32111,-6524,-32115,-6508,-32118,-6492,-32121,-6475,-32125,-6459,-32128,-6442,-32131,-6426,-32135,-6409,-32138,-6393,-32141,-6377,-32144,-6360,-32148,-6344,-32151,-6327,-32154,-6311,-32157,-6294,-32161,-6278,-32164,-6262,-32167,-6245,-32170,-6229,-32173,-6212,-32177,-6196,-32180,-6179,-32183,-6163,-32186,-6146,-32189,-6130,-32192,-6113,-32195,-6097,-32198,-6081,-32202,-6064,-32205,-6048,-32208,-6031,-32211,-6015,-32214,-5998,-32217,-5982,-32220,-5965,-32223,-5949,-32226,-5932,-32229,-5916,-32232,-5899,-32235,-5883,-32238,-5866,-32241,-5850,-32244,-5833,-32247,-5817,-32250,-5800,-32253,-5784,-32256,-5767,-32259,-5751,-32262,-5734,-32265,-5718,-32268,-5701,-32271,-5685,-32274,-5668,-32276,-5652,-32279,-5635,-32282,-5619,-32285,-5602,-32288,-5586,-32291,-5569,-32294,-5553,-32296,-5536,-32299,-5520,-32302,-5503,-32305,-5487,-32308,-5470,-32311,-5454,-32313,-5437,-32316,-5421,-32319,-5404,-32322,-5388,-32324,-5371,-32327,-5355,-32330,-5338,-32333,-5322,-32335,-5305,-32338,-5288,-32341,-5272,-32343,-5255,-32346,-5239,-32349,-5222,-32351,-5206,-32354,-5189,-32357,-5173,-32359,-5156,-32362,-5140,-32365,-5123,-32367,-5107,-32370,-5090,-32372,-5073,-32375,-5057,-32378,-5040,-32380,-5024,-32383,-5007,-32385,-4991,-32388,-4974,-32390,-4958,-32393,-4941,-32395,-4924,-32398,-4908,-32400,-4891,-32403,-4875,-32405,-4858,-32408,-4842,-32410,-4825,-32413,-4808,-32415,-4792,-32418,-4775,-32420,-4759,-32423,-4742,-32425,-4726,-32427,-4709,-32430,-4692,-32432,-4676,-32435,-4659,-32437,-4643,-32439,-4626,-32442,-4609,-32444,-4593,-32446,-4576,-32449,-4560,-32451,-4543,-32453,-4526,-32456,-4510,-32458,-4493,-32460,-4477,-32463,-4460,-32465,-4444,-32467,-4427,-32469,-4410,-32472,-4394,-32474,-4377,-32476,-4360,-32478,-4344,-32481,-4327,-32483,-4311,-32485,-4294,-32487,-4277,-32489,-4261,-32492,-4244,-32494,-4228,-32496,-4211,-32498,-4194,-32500,-4178,-32502,-4161,-32504,-4145,-32507,-4128,-32509,-4111,-32511,-4095,-32513,-4078,-32515,-4061,-32517,-4045,-32519,-4028,-32521,-4012,-32523,-3995,-32525,-3978,-32527,-3962,-32529,-3945,-32531,-3928,-32533,-3912,-32535,-3895,-32537,-3878,-32539,-3862,-32541,-3845,-32543,-3829,-32545,-3812,-32547,-3795,-32549,-3779,-32551,-3762,-32553,-3745,-32555,-3729,-32557,-3712,-32559,-3695,-32560,-3679,-32562,-3662,-32564,-3645,-32566,-3629,-32568,-3612,-32570,-3595,-32572,-3579,-32573,-3562,-32575,-3546,-32577,-3529,-32579,-3512,-32581,-3496,-32582,-3479,-32584,-3462,-32586,-3446,-32588,-3429,-32589,-3412,-32591,-3396,-32593,-3379,-32595,-3362,-32596,-3346,-32598,-3329,-32600,-3312,-32601,-3296,-32603,-3279,-32605,-3262,-32606,-3246,-32608,-3229,-32610,-3212,-32611,-3196,-32613,-3179,-32615,-3162,-32616,-3146,-32618,-3129,-32619,-3112,-32621,-3095,-32623,-3079,-32624,-3062,-32626,-3045,-32627,-3029,-32629,-3012,-32630,-2995,-32632,-2979,-32633,-2962,-32635,-2945,-32636,-2929,-32638,-2912,-32639,-2895,-32641,-2879,-32642,-2862,-32644,-2845,-32645,-2829,-32647,-2812,-32648,-2795,-32650,-2778,-32651,-2762,-32652,-2745,-32654,-2728,-32655,-2712,-32657,-2695,-32658,-2678,-32659,-2662,-32661,-2645,-32662,-2628,-32663,-2611,-32665,-2595,-32666,-2578,-32667,-2561,-32669,-2545,-32670,-2528,-32671,-2511,-32672,-2495,-32674,-2478,-32675,-2461,-32676,-2444,-32677,-2428,-32679,-2411,-32680,-2394,-32681,-2378,-32682,-2361,-32684,-2344,-32685,-2327,-32686,-2311,-32687,-2294,-32688,-2277,-32689,-2261,-32691,-2244,-32692,-2227,-32693,-2210,-32694,-2194,-32695,-2177,-32696,-2160,-32697,-2144,-32698,-2127,-32700,-2110,-32701,-2093,-32702,-2077,-32703,-2060,-32704,-2043,-32705,-2027,-32706,-2010,-32707,-1993,-32708,-1976,-32709,-1960,-32710,-1943,-32711,-1926,-32712,-1909,-32713,-1893,-32714,-1876,-32715,-1859,-32716,-1843,-32717,-1826,-32718,-1809,-32718,-1792,-32719,-1776,-32720,-1759,-32721,-1742,-32722,-1725,-32723,-1709,-32724,-1692,-32725,-1675,-32726,-1659,-32726,-1642,-32727,-1625,-32728,-1608,-32729,-1592,-32730,-1575,-32730,-1558,-32731,-1541,-32732,-1525,-32733,-1508,-32734,-1491,-32734,-1474,-32735,-1458,-32736,-1441,-32737,-1424,-32737,-1407,-32738,-1391,-32739,-1374,-32739,-1357,-32740,-1340,-32741,-1324,-32741,-1307,-32742,-1290,-32743,-1274,-32743,-1257,-32744,-1240,-32745,-1223,-32745,-1207,-32746,-1190,-32747,-1173,-32747,-1156,-32748,-1140,-32748,-1123,-32749,-1106,-32749,-1089,-32750,-1073,-32751,-1056,-32751,-1039,-32752,-1022,-32752,-1006,-32753,-989,-32753,-972,-32754,-955,-32754,-939,-32755,-922,-32755,-905,-32755,-888,-32756,-872,-32756,-855,-32757,-838,-32757,-821,-32758,-805,-32758,-788,-32758,-771,-32759,-754,-32759,-738,-32760,-721,-32760,-704,-32760,-687,-32761,-671,-32761,-654,-32761,-637,-32762,-620,-32762,-604,-32762,-587,-32763,-570,-32763,-553,-32763,-537,-32763,-520,-32764,-503,-32764,-486,-32764,-470,-32764,-453,-32765,-436,-32765,-419,-32765,-403,-32765,-386,-32765,-369,-32766,-352,-32766,-336,-32766,-319,-32766,-302,-32766,-285,-32766,-269,-32767,-252,-32767,-235,-32767,-218,-32767,-202,-32767,-185,-32767,-168,-32767,-151,-32767,-135,-32767,-118,-32767,-101,-32767,-84,-32767,-68,-32767,-51,-32767,-34,-32767,-17,-32767,-1,-32767,16,-32767,33,-32767,50,-32767,67,-32767,83,-32767,100,-32767,117,-32767,134,-32767,150,-32767,167,-32767,184,-32767,201,-32767,217,-32767,234,-32767,251,-32766,268,-32766,284,-32766,301,-32766,318,-32766,335,-32766,351,-32765,368,-32765,385,-32765,402,-32765,418,-32765,435,-32764,452,-32764,469,-32764,485,-32764,502,-32763,519,-32763,536,-32763,552,-32763,569,-32762,586,-32762,603,-32762,619,-32761,636,-32761,653,-32761,670,-32760,686,-32760,703,-32760,720,-32759,737,-32759,753,-32758,770,-32758,787,-32758,804,-32757,820,-32757,837,-32756,854,-32756,871,-32755,887,-32755,904,-32755,921,-32754,938,-32754,954,-32753,971,-32753,988,-32752,1005,-32752,1021,-32751,1038,-32751,1055,-32750,1072,-32749,1088,-32749,1105,-32748,1122,-32748,1139,-32747,1155,-32747,1172,-32746,1189,-32745,1206,-32745,1222,-32744,1239,-32743,1256,-32743,1273,-32742,1289,-32741,1306,-32741,1323,-32740,1339,-32739,1356,-32739,1373,-32738,1390,-32737,1406,-32737,1423,-32736,1440,-32735,1457,-32734,1473,-32734,1490,-32733,1507,-32732,1524,-32731,1540,-32730,1557,-32730,1574,-32729,1591,-32728,1607,-32727,1624,-32726,1641,-32726,1658,-32725,1674,-32724,1691,-32723,1708,-32722,1724,-32721,1741,-32720,1758,-32719,1775,-32718,1791,-32718,1808,-32717,1825,-32716,1842,-32715,1858,-32714,1875,-32713,1892,-32712,1908,-32711,1925,-32710,1942,-32709,1959,-32708,1975,-32707,1992,-32706,2009,-32705,2026,-32704,2042,-32703,2059,-32702,2076,-32701,2092,-32700,2109,-32698,2126,-32697,2143,-32696,2159,-32695,2176,-32694,2193,-32693,2209,-32692,2226,-32691,2243,-32689,2260,-32688,2276,-32687,2293,-32686,2310,-32685,2326,-32684,2343,-32682,2360,-32681,2377,-32680,2393,-32679,2410,-32677,2427,-32676,2443,-32675,2460,-32674,2477,-32672,2494,-32671,2510,-32670,2527,-32669,2544,-32667,2560,-32666,2577,-32665,2594,-32663,2610,-32662,2627,-32661,2644,-32659,2661,-32658,2677,-32657,2694,-32655,2711,-32654,2727,-32652,2744,-32651,2761,-32650,2777,-32648,2794,-32647,2811,-32645,2828,-32644,2844,-32642,2861,-32641,2878,-32639,2894,-32638,2911,-32636,2928,-32635,2944,-32633,2961,-32632,2978,-32630,2994,-32629,3011,-32627,3028,-32626,3044,-32624,3061,-32623,3078,-32621,3094,-32619,3111,-32618,3128,-32616,3145,-32615,3161,-32613,3178,-32611,3195,-32610,3211,-32608,3228,-32606,3245,-32605,3261,-32603,3278,-32601,3295,-32600,3311,-32598,3328,-32596,3345,-32595,3361,-32593,3378,-32591,3395,-32589,3411,-32588,3428,-32586,3445,-32584,3461,-32582,3478,-32581,3495,-32579,3511,-32577,3528,-32575,3545,-32573,3561,-32572,3578,-32570,3594,-32568,3611,-32566,3628,-32564,3644,-32562,3661,-32560,3678,-32559,3694,-32557,3711,-32555,3728,-32553,3744,-32551,3761,-32549,3778,-32547,3794,-32545,3811,-32543,3828,-32541,3844,-32539,3861,-32537,3877,-32535,3894,-32533,3911,-32531,3927,-32529,3944,-32527,3961,-32525,3977,-32523,3994,-32521,4011,-32519,4027,-32517,4044,-32515,4060,-32513,4077,-32511,4094,-32509,4110,-32507,4127,-32504,4144,-32502,4160,-32500,4177,-32498,4193,-32496,4210,-32494,4227,-32492,4243,-32489,4260,-32487,4276,-32485,4293,-32483,4310,-32481,4326,-32478,4343,-32476,4359,-32474,4376,-32472,4393,-32469,4409,-32467,4426,-32465,4443,-32463,4459,-32460,4476,-32458,4492,-32456,4509,-32453,4525,-32451,4542,-32449,4559,-32446,4575,-32444,4592,-32442,4608,-32439,4625,-32437,4642,-32435,4658,-32432,4675,-32430,4691,-32427,4708,-32425,4725,-32423,4741,-32420,4758,-32418,4774,-32415,4791,-32413,4807,-32410,4824,-32408,4841,-32405,4857,-32403,4874,-32400,4890,-32398,4907,-32395,4923,-32393,4940,-32390,4957,-32388,4973,-32385,4990,-32383,5006,-32380,5023,-32378,5039,-32375,5056,-32372,5072,-32370,5089,-32367,5106,-32365,5122,-32362,5139,-32359,5155,-32357,5172,-32354,5188,-32351,5205,-32349,5221,-32346,5238,-32343,5254,-32341,5271,-32338,5287,-32335,5304,-32333,5321,-32330,5337,-32327,5354,-32324,5370,-32322,5387,-32319,5403,-32316,5420,-32313,5436,-32311,5453,-32308,5469,-32305,5486,-32302,5502,-32299,5519,-32296,5535,-32294,5552,-32291,5568,-32288,5585,-32285,5601,-32282,5618,-32279,5634,-32276,5651,-32274,5667,-32271,5684,-32268,5700,-32265,5717,-32262,5733,-32259,5750,-32256,5766,-32253,5783,-32250,5799,-32247,5816,-32244,5832,-32241,5849,-32238,5865,-32235,5882,-32232,5898,-32229,5915,-32226,5931,-32223,5948,-32220,5964,-32217,5981,-32214,5997,-32211,6014,-32208,6030,-32205,6047,-32202,6063,-32198,6080,-32195,6096,-32192,6112,-32189,6129,-32186,6145,-32183,6162,-32180,6178,-32177,6195,-32173,6211,-32170,6228,-32167,6244,-32164,6261,-32161,6277,-32157,6293,-32154,6310,-32151,6326,-32148,6343,-32144,6359,-32141,6376,-32138,6392,-32135,6408,-32131,6425,-32128,6441,-32125,6458,-32121,6474,-32118,6491,-32115,6507,-32111,6523,-32108,6540,-32105,6556,-32101,6573,-32098,6589,-32095,6606,-32091,6622,-32088,6638,-32085,6655,-32081,6671,-32078,6688,-32074,6704,-32071,6720,-32067,6737,-32064,6753,-32060,6770,-32057,6786,-32054,6802,-32050,6819,-32047,6835,-32043,6851,-32040,6868,-32036,6884,-32033,6901,-32029,6917,-32025,6933,-32022,6950,-32018,6966,-32015,6982,-32011,6999,-32008,7015,-32004,7032,-32000,7048,-31997,7064,-31993,7081,-31990,7097,-31986,7113,-31982,7130,-31979,7146,-31975,7162,-31971,7179,-31968,7195,-31964,7211,-31960,7228,-31957,7244,-31953,7261,-31949,7277,-31945,7293,-31942,7310,-31938,7326,-31934,7342,-31930,7358,-31927,7375,-31923,7391,-31919,7407,-31915,7424,-31912,7440,-31908,7456,-31904,7473,-31900,7489,-31896,7505,-31892,7522,-31889,7538,-31885,7554,-31881,7571,-31877,7587,-31873,7603,-31869,7619,-31865,7636,-31861,7652,-31857,7668,-31854,7685,-31850,7701,-31846,7717,-31842,7733,-31838,7750,-31834,7766,-31830,7782,-31826,7799,-31822,7815,-31818,7831,-31814,7847,-31810,7864,-31806,7880,-31802,7896,-31798,7912,-31794,7929,-31790,7945,-31786,7961,-31781,7977,-31777,7994,-31773,8010,-31769,8026,-31765,8042,-31761,8059,-31757,8075,-31753,8091,-31749,8107,-31744,8124,-31740,8140,-31736,8156,-31732,8172,-31728,8189,-31724,8205,-31719,8221,-31715,8237,-31711,8253,-31707,8270,-31702,8286,-31698,8302,-31694,8318,-31690,8334,-31685,8351,-31681,8367,-31677,8383,-31673,8399,-31668,8415,-31664,8432,-31660,8448,-31655,8464,-31651,8480,-31647,8496,-31642,8513,-31638,8529,-31634,8545,-31629,8561,-31625,8577,-31620,8593,-31616,8610,-31612,8626,-31607,8642,-31603,8658,-31598,8674,-31594,8690,-31589,8707,-31585,8723,-31581,8739,-31576,8755,-31572,8771,-31567,8787,-31563,8803,-31558,8820,-31554,8836,-31549,8852,-31545,8868,-31540,8884,-31535,8900,-31531,8916,-31526,8932,-31522,8949,-31517,8965,-31513,8981,-31508,8997,-31503,9013,-31499,9029,-31494,9045,-31490,9061,-31485,9077,-31480,9094,-31476,9110,-31471,9126,-31466,9142,-31462,9158,-31457,9174,-31452,9190,-31447,9206,-31443,9222,-31438,9238,-31433,9254,-31429,9270,-31424,9287,-31419,9303,-31414,9319,-31410,9335,-31405,9351,-31400,9367,-31395,9383,-31390,9399,-31386,9415,-31381,9431,-31376,9447,-31371,9463,-31366,9479,-31361,9495,-31357,9511,-31352,9527,-31347,9543,-31342,9559,-31337,9575,-31332,9591,-31327,9607,-31322,9623,-31317,9639,-31312,9655,-31308,9671,-31303,9687,-31298,9703,-31293,9719,-31288,9735,-31283,9751,-31278,9767,-31273,9783,-31268,9799,-31263,9815,-31258,9831,-31253,9847,-31248,9863,-31243,9879,-31237,9895,-31232,9911,-31227,9927,-31222,9943,-31217,9959,-31212,9975,-31207,9991,-31202,10007,-31197,10023,-31192,10039,-31186,10055,-31181,10071,-31176,10087,-31171,10103,-31166,10119,-31161,10135,-31155,10151,-31150,10166,-31145,10182,-31140,10198,-31135,10214,-31129,10230,-31124,10246,-31119,10262,-31114,10278,-31108,10294,-31103,10310,-31098,10326,-31093,10342,-31087,10357,-31082,10373,-31077,10389,-31071,10405,-31066,10421,-31061,10437,-31055,10453,-31050,10469,-31045,10484,-31039,10500,-31034,10516,-31029,10532,-31023,10548,-31018,10564,-31012,10580,-31007,10596,-31002,10611,-30996,10627,-30991,10643,-30985,10659,-30980,10675,-30974,10691,-30969,10706,-30963,10722,-30958,10738,-30952,10754,-30947,10770,-30941,10786,-30936,10801,-30930,10817,-30925,10833,-30919,10849,-30914,10865,-30908,10880,-30903,10896,-30897,10912,-30891,10928,-30886,10944,-30880,10959,-30875,10975,-30869,10991,-30863,11007,-30858,11023,-30852,11038,-30846,11054,-30841,11070,-30835,11086,-30829,11101,-30824,11117,-30818,11133,-30812,11149,-30807,11164,-30801,11180,-30795,11196,-30789,11212,-30784,11227,-30778,11243,-30772,11259,-30767,11275,-30761,11290,-30755,11306,-30749,11322,-30743,11338,-30738,11353,-30732,11369,-30726,11385,-30720,11400,-30714,11416,-30708,11432,-30703,11448,-30697,11463,-30691,11479,-30685,11495,-30679,11510,-30673,11526,-30667,11542,-30661,11557,-30656,11573,-30650,11589,-30644,11604,-30638,11620,-30632,11636,-30626,11651,-30620,11667,-30614,11683,-30608,11698,-30602,11714,-30596,11730,-30590,11745,-30584,11761,-30578,11777,-30572,11792,-30566,11808,-30560,11823,-30554,11839,-30548,11855,-30542,11870,-30536,11886,-30529,11902,-30523,11917,-30517,11933,-30511,11948,-30505,11964,-30499,11980,-30493,11995,-30487,12011,-30481,12026,-30474,12042,-30468,12057,-30462,12073,-30456,12089,-30450,12104,-30443,12120,-30437,12135,-30431,12151,-30425,12166,-30419,12182,-30412,12198,-30406,12213,-30400,12229,-30394,12244,-30387,12260,-30381,12275,-30375,12291,-30369,12306,-30362,12322,-30356,12337,-30350,12353,-30343,12368,-30337,12384,-30331,12399,-30324,12415,-30318,12430,-30312,12446,-30305,12461,-30299,12477,-30292,12492,-30286,12508,-30280,12523,-30273,12539,-30267,12554,-30260,12570,-30254,12585,-30248,12601,-30241,12616,-30235,12632,-30228,12647,-30222,12663,-30215,12678,-30209,12694,-30202,12709,-30196,12724,-30189,12740,-30183,12755,-30176,12771,-30170,12786,-30163,12802,-30157,12817,-30150,12832,-30143,12848,-30137,12863,-30130,12879,-30124,12894,-30117,12909,-30110,12925,-30104,12940,-30097,12956,-30091,12971,-30084,12986,-30077,13002,-30071,13017,-30064,13033,-30057,13048,-30051,13063,-30044,13079,-30037,13094,-30031,13109,-30024,13125,-30017,13140,-30010,13155,-30004,13171,-29997,13186,-29990,13201,-29984,13217,-29977,13232,-29970,13247,-29963,13263,-29956,13278,-29950,13293,-29943,13309,-29936,13324,-29929,13339,-29922,13355,-29916,13370,-29909,13385,-29902,13400,-29895,13416,-29888,13431,-29881,13446,-29874,13462,-29867,13477,-29861,13492,-29854,13507,-29847,13523,-29840,13538,-29833,13553,-29826,13568,-29819,13584,-29812,13599,-29805,13614,-29798,13629,-29791,13645,-29784,13660,-29777,13675,-29770,13690,-29763,13706,-29756,13721,-29749,13736,-29742,13751,-29735,13766,-29728,13782,-29721,13797,-29714,13812,-29707,13827,-29700,13842,-29693,13858,-29686,13873,-29679,13888,-29671,13903,-29664,13918,-29657,13933,-29650,13949,-29643,13964,-29636,13979,-29629,13994,-29622,14009,-29614,14024,-29607,14039,-29600,14055,-29593,14070,-29586,14085,-29578,14100,-29571,14115,-29564,14130,-29557,14145,-29549,14160,-29542,14176,-29535,14191,-29528,14206,-29520,14221,-29513,14236,-29506,14251,-29499,14266,-29491,14281,-29484,14296,-29477,14311,-29469,14326,-29462,14342,-29455,14357,-29447,14372,-29440,14387,-29433,14402,-29425,14417,-29418,14432,-29411,14447,-29403,14462,-29396,14477,-29388,14492,-29381,14507,-29373,14522,-29366,14537,-29359,14552,-29351,14567,-29344,14582,-29336,14597,-29329,14612,-29321,14627,-29314,14642,-29306,14657,-29299,14672,-29291,14687,-29284,14702,-29276,14717,-29269,14732,-29261,14747,-29254,14762,-29246,14777,-29239,14792,-29231,14807,-29223,14822,-29216,14837,-29208,14852,-29201,14866,-29193,14881,-29185,14896,-29178,14911,-29170,14926,-29163,14941,-29155,14956,-29147,14971,-29140,14986,-29132,15001,-29124,15016,-29117,15030,-29109,15045,-29101,15060,-29093,15075,-29086,15090,-29078,15105,-29070,15120,-29063,15135,-29055,15149,-29047,15164,-29039,15179,-29032,15194,-29024,15209,-29016,15224,-29008,15238,-29000,15253,-28993,15268,-28985,15283,-28977,15298,-28969,15313,-28961,15327,-28954,15342,-28946,15357,-28938,15372,-28930,15387,-28922,15401,-28914,15416,-28906,15431,-28898,15446,-28891,15461,-28883,15475,-28875,15490,-28867,15505,-28859,15520,-28851,15534,-28843,15549,-28835,15564,-28827,15579,-28819,15593,-28811,15608,-28803,15623,-28795,15638,-28787,15652,-28779,15667,-28771,15682,-28763,15696,-28755,15711,-28747,15726,-28739,15740,-28731,15755,-28723,15770,-28715,15785,-28707,15799,-28699,15814,-28691,15829,-28682,15843,-28674,15858,-28666,15873,-28658,15887,-28650,15902,-28642,15917,-28634,15931,-28626,15946,-28617,15960,-28609,15975,-28601,15990,-28593,16004,-28585,16019,-28576,16034,-28568,16048,-28560,16063,-28552,16077,-28544,16092,-28535,16107,-28527,16121,-28519,16136,-28511,16150,-28502,16165,-28494,16179,-28486,16194,-28478,16209,-28469,16223,-28461,16238,-28453,16252,-28444,16267,-28436,16281,-28428,16296,-28419,16310,-28411,16325,-28403,16339,-28394,16354,-28386,16368,-28378,16383,-28369,16398,-28361,16412,-28352,16427,-28344,16441,-28336,16455,-28327,16470,-28319,16484,-28310,16499,-28302,16513,-28293,16528,-28285,16542,-28276,16557,-28268,16571,-28260,16586,-28251,16600,-28243,16615,-28234,16629,-28226,16643,-28217,16658,-28209,16672,-28200,16687,-28191,16701,-28183,16716,-28174,16730,-28166,16744,-28157,16759,-28149,16773,-28140,16788,-28132,16802,-28123,16816,-28114,16831,-28106,16845,-28097,16859,-28088,16874,-28080,16888,-28071,16903,-28063,16917,-28054,16931,-28045,16946,-28037,16960,-28028,16974,-28019,16989,-28010,17003,-28002,17017,-27993,17032,-27984,17046,-27976,17060,-27967,17074,-27958,17089,-27949,17103,-27941,17117,-27932,17132,-27923,17146,-27914,17160,-27906,17174,-27897,17189,-27888,17203,-27879,17217,-27870,17232,-27862,17246,-27853,17260,-27844,17274,-27835,17288,-27826,17303,-27817,17317,-27809,17331,-27800,17345,-27791,17360,-27782,17374,-27773,17388,-27764,17402,-27755,17416,-27746,17431,-27737,17445,-27729,17459,-27720,17473,-27711,17487,-27702,17501,-27693,17516,-27684,17530,-27675,17544,-27666,17558,-27657,17572,-27648,17586,-27639,17600,-27630,17615,-27621,17629,-27612,17643,-27603,17657,-27594,17671,-27585,17685,-27576,17699,-27567,17713,-27558,17727,-27549,17742,-27539,17756,-27530,17770,-27521,17784,-27512,17798,-27503,17812,-27494,17826,-27485,17840,-27476,17854,-27467,17868,-27457,17882,-27448,17896,-27439,17910,-27430,17924,-27421,17938,-27412,17952,-27402,17966,-27393,17980,-27384,17994,-27375,18008,-27366,18022,-27356,18036,-27347,18050,-27338,18064,-27329,18078,-27320,18092,-27310,18106,-27301,18120,-27292,18134,-27282,18148,-27273,18162,-27264,18176,-27255,18190,-27245,18204,-27236,18218,-27227,18232,-27217,18246,-27208,18260,-27199,18273,-27189,18287,-27180,18301,-27171,18315,-27161,18329,-27152,18343,-27142,18357,-27133,18371,-27124,18385,-27114,18398,-27105,18412,-27095,18426,-27086,18440,-27077,18454,-27067,18468,-27058,18482,-27048,18495,-27039,18509,-27029,18523,-27020,18537,-27010,18551,-27001,18564,-26991,18578,-26982,18592,-26972,18606,-26963,18620,-26953,18633,-26944,18647,-26934,18661,-26925,18675,-26915,18689,-26906,18702,-26896,18716,-26886,18730,-26877,18744,-26867,18757,-26858,18771,-26848,18785,-26838,18798,-26829,18812,-26819,18826,-26810,18840,-26800,18853,-26790,18867,-26781,18881,-26771,18894,-26761,18908,-26752,18922,-26742,18935,-26732,18949,-26723,18963,-26713,18976,-26703,18990,-26693,19004,-26684,19017,-26674,19031,-26664,19045,-26655,19058,-26645,19072,-26635,19086,-26625,19099,-26616,19113,-26606,19126,-26596,19140,-26586,19154,-26576,19167,-26567,19181,-26557,19194,-26547,19208,-26537,19221,-26527,19235,-26517,19249,-26508,19262,-26498,19276,-26488,19289,-26478,19303,-26468,19316,-26458,19330,-26448,19343,-26438,19357,-26429,19370,-26419,19384,-26409,19397,-26399,19411,-26389,19424,-26379,19438,-26369,19451,-26359,19465,-26349,19478,-26339,19492,-26329,19505,-26319,19519,-26309,19532,-26299,19546,-26289,19559,-26279,19573,-26269,19586,-26259,19599,-26249,19613,-26239,19626,-26229,19640,-26219,19653,-26209,19667,-26199,19680,-26189,19693,-26179,19707,-26169,19720,-26159,19733,-26149,19747,-26138,19760,-26128,19774,-26118,19787,-26108,19800,-26098,19814,-26088,19827,-26078,19840,-26068,19854,-26057,19867,-26047,19880,-26037,19894,-26027,19907,-26017,19920,-26007,19933,-25996,19947,-25986,19960,-25976,19973,-25966,19987,-25955,20000,-25945,20013,-25935,20026,-25925,20040,-25914,20053,-25904,20066,-25894,20079,-25884,20093,-25873,20106,-25863,20119,-25853,20132,-25843,20146,-25832,20159,-25822,20172,-25812,20185,-25801,20198,-25791,20212,-25781,20225,-25770,20238,-25760,20251,-25750,20264,-25739,20277,-25729,20291,-25718,20304,-25708,20317,-25698,20330,-25687,20343,-25677,20356,-25666,20369,-25656,20383,-25646,20396,-25635,20409,-25625,20422,-25614,20435,-25604,20448,-25593,20461,-25583,20474,-25572,20487,-25562,20500,-25551,20513,-25541,20527,-25530,20540,-25520,20553,-25509,20566,-25499,20579,-25488,20592,-25478,20605,-25467,20618,-25457,20631,-25446,20644,-25436,20657,-25425,20670,-25415,20683,-25404,20696,-25393,20709,-25383,20722,-25372,20735,-25362,20748,-25351,20761,-25340,20774,-25330,20787,-25319,20800,-25308,20813,-25298,20825,-25287,20838,-25277,20851,-25266,20864,-25255,20877,-25244,20890,-25234,20903,-25223,20916,-25212,20929,-25202,20942,-25191,20955,-25180,20967,-25170,20980,-25159,20993,-25148,21006,-25137,21019,-25127,21032,-25116,21045,-25105,21057,-25094,21070,-25084,21083,-25073,21096,-25062,21109,-25051,21122,-25040,21134,-25030,21147,-25019,21160,-25008,21173,-24997,21186,-24986,21198,-24975,21211,-24965,21224,-24954,21237,-24943,21249,-24932,21262,-24921,21275,-24910,21288,-24899,21300,-24888,21313,-24878,21326,-24867,21339,-24856,21351,-24845,21364,-24834,21377,-24823,21389,-24812,21402,-24801,21415,-24790,21427,-24779,21440,-24768,21453,-24757,21465,-24746,21478,-24735,21491,-24724,21503,-24713,21516,-24702,21529,-24691,21541,-24680,21554,-24669,21566,-24658,21579,-24647,21592,-24636,21604,-24625,21617,-24614,21629,-24603,21642,-24592,21655,-24581,21667,-24570,21680,-24559,21692,-24547,21705,-24536,21717,-24525,21730,-24514,21743,-24503,21755,-24492,21768,-24481,21780,-24470,21793,-24458,21805,-24447,21818,-24436,21830,-24425,21843,-24414,21855,-24403,21868,-24391,21880,-24380,21893,-24369,21905,-24358,21917,-24347,21930,-24335,21942,-24324,21955,-24313,21967,-24302,21980,-24290,21992,-24279,22004,-24268,22017,-24257,22029,-24245,22042,-24234,22054,-24223,22066,-24212,22079,-24200,22091,-24189,22104,-24178,22116,-24166,22128,-24155,22141,-24144,22153,-24132,22165,-24121,22178,-24110,22190,-24098,22202,-24087,22215,-24076,22227,-24064,22239,-24053,22252,-24042,22264,-24030,22276,-24019,22288,-24007,22301,-23996,22313,-23985,22325,-23973,22338,-23962,22350,-23950,22362,-23939,22374,-23927,22387,-23916,22399,-23904,22411,-23893,22423,-23882,22435,-23870,22448,-23859,22460,-23847,22472,-23836,22484,-23824,22496,-23813,22509,-23801,22521,-23790,22533,-23778,22545,-23767,22557,-23755,22569,-23743,22582,-23732,22594,-23720,22606,-23709,22618,-23697,22630,-23686,22642,-23674,22654,-23662,22666,-23651,22678,-23639,22691,-23628,22703,-23616,22715,-23604,22727,-23593,22739,-23581,22751,-23570,22763,-23558,22775,-23546,22787,-23535,22799,-23523,22811,-23511,22823,-23500,22835,-23488,22847,-23476,22859,-23465,22871,-23453,22883,-23441,22895,-23429,22907,-23418,22919,-23406,22931,-23394,22943,-23383,22955,-23371,22967,-23359,22979,-23347,22991,-23336,23003,-23324,23015,-23312,23027,-23300,23039,-23288,23050,-23277,23062,-23265,23074,-23253,23086,-23241,23098,-23229,23110,-23218,23122,-23206,23134,-23194,23146,-23182,23157,-23170,23169,-23158,23181,-23147,23193,-23135,23205,-23123,23217,-23111,23228,-23099,23240,-23087,23252,-23075,23264,-23063,23276,-23051,23287,-23040,23299,-23028,23311,-23016,23323,-23004,23335,-22992,23346,-22980,23358,-22968,23370,-22956,23382,-22944,23393,-22932,23405,-22920,23417,-22908,23428,-22896,23440,-22884,23452,-22872,23464,-22860,23475,-22848,23487,-22836,23499,-22824,23510,-22812,23522,-22800,23534,-22788,23545,-22776,23557,-22764,23569,-22752,23580,-22740,23592,-22728,23603,-22716,23615,-22704,23627,-22692,23638,-22679,23650,-22667,23661,-22655,23673,-22643,23685,-22631,23696,-22619,23708,-22607,23719,-22595,23731,-22583,23742,-22570,23754,-22558,23766,-22546,23777,-22534,23789,-22522,23800,-22510,23812,-22497,23823,-22485,23835,-22473,23846,-22461,23858,-22449,23869,-22436,23881,-22424,23892,-22412,23903,-22400,23915,-22388,23926,-22375,23938,-22363,23949,-22351,23961,-22339,23972,-22326,23984,-22314,23995,-22302,24006,-22289,24018,-22277,24029,-22265,24041,-22253,24052,-22240,24063,-22228,24075,-22216,24086,-22203,24097,-22191,24109,-22179,24120,-22166,24131,-22154,24143,-22142,24154,-22129,24165,-22117,24177,-22105,24188,-22092,24199,-22080,24211,-22067,24222,-22055,24233,-22043,24244,-22030,24256,-22018,24267,-22005,24278,-21993,24289,-21981,24301,-21968,24312,-21956,24323,-21943,24334,-21931,24346,-21918,24357,-21906,24368,-21894,24379,-21881,24390,-21869,24402,-21856,24413,-21844,24424,-21831,24435,-21819,24446,-21806,24457,-21794,24469,-21781,24480,-21769,24491,-21756,24502,-21744,24513,-21731,24524,-21718,24535,-21706,24546,-21693,24558,-21681,24569,-21668,24580,-21656,24591,-21643,24602,-21630,24613,-21618,24624,-21605,24635,-21593,24646,-21580,24657,-21567,24668,-21555,24679,-21542,24690,-21530,24701,-21517,24712,-21504,24723,-21492,24734,-21479,24745,-21466,24756,-21454,24767,-21441,24778,-21428,24789,-21416,24800,-21403,24811,-21390,24822,-21378,24833,-21365,24844,-21352,24855,-21340,24866,-21327,24877,-21314,24887,-21301,24898,-21289,24909,-21276,24920,-21263,24931,-21250,24942,-21238,24953,-21225,24964,-21212,24974,-21199,24985,-21187,24996,-21174,25007,-21161,25018,-21148,25029,-21135,25039,-21123,25050,-21110,25061,-21097,25072,-21084,25083,-21071,25093,-21058,25104,-21046,25115,-21033,25126,-21020,25136,-21007,25147,-20994,25158,-20981,25169,-20968,25179,-20956,25190,-20943,25201,-20930,25211,-20917,25222,-20904,25233,-20891,25243,-20878,25254,-20865,25265,-20852,25276,-20839,25286,-20826,25297,-20814,25307,-20801,25318,-20788,25329,-20775,25339,-20762,25350,-20749,25361,-20736,25371,-20723,25382,-20710,25392,-20697,25403,-20684,25414,-20671,25424,-20658,25435,-20645,25445,-20632,25456,-20619,25466,-20606,25477,-20593,25487,-20580,25498,-20567,25508,-20554,25519,-20541,25529,-20528,25540,-20514,25550,-20501,25561,-20488,25571,-20475,25582,-20462,25592,-20449,25603,-20436,25613,-20423,25624,-20410,25634,-20397,25645,-20384,25655,-20370,25665,-20357,25676,-20344,25686,-20331,25697,-20318,25707,-20305,25717,-20292,25728,-20278,25738,-20265,25749,-20252,25759,-20239,25769,-20226,25780,-20213,25790,-20199,25800,-20186,25811,-20173,25821,-20160,25831,-20147,25842,-20133,25852,-20120,25862,-20107,25872,-20094,25883,-20080,25893,-20067,25903,-20054,25913,-20041,25924,-20027,25934,-20014,25944,-20001,25954,-19988,25965,-19974,25975,-19961,25985,-19948,25995,-19934,26006,-19921,26016,-19908,26026,-19895,26036,-19881,26046,-19868,26056,-19855,26067,-19841,26077,-19828,26087,-19815,26097,-19801,26107,-19788,26117,-19775,26127,-19761,26137,-19748,26148,-19734,26158,-19721,26168,-19708,26178,-19694,26188,-19681,26198,-19668,26208,-19654,26218,-19641,26228,-19627,26238,-19614,26248,-19600,26258,-19587,26268,-19574,26278,-19560,26288,-19547,26298,-19533,26308,-19520,26318,-19506,26328,-19493,26338,-19479,26348,-19466,26358,-19452,26368,-19439,26378,-19425,26388,-19412,26398,-19398,26408,-19385,26418,-19371,26428,-19358,26437,-19344,26447,-19331,26457,-19317,26467,-19304,26477,-19290,26487,-19277,26497,-19263,26507,-19250,26516,-19236,26526,-19222,26536,-19209,26546,-19195,26556,-19182,26566,-19168,26575,-19155,26585,-19141,26595,-19127,26605,-19114,26615,-19100,26624,-19087,26634,-19073,26644,-19059,26654,-19046,26663,-19032,26673,-19018,26683,-19005,26692,-18991,26702,-18977,26712,-18964,26722,-18950,26731,-18936,26741,-18923,26751,-18909,26760,-18895,26770,-18882,26780,-18868,26789,-18854,26799,-18841,26809,-18827,26818,-18813,26828,-18799,26837,-18786,26847,-18772,26857,-18758,26866,-18745,26876,-18731,26885,-18717,26895,-18703,26905,-18690,26914,-18676,26924,-18662,26933,-18648,26943,-18634,26952,-18621,26962,-18607,26971,-18593,26981,-18579,26990,-18565,27000,-18552,27009,-18538,27019,-18524,27028,-18510,27038,-18496,27047,-18483,27057,-18469,27066,-18455,27076,-18441,27085,-18427,27094,-18413,27104,-18399,27113,-18386,27123,-18372,27132,-18358,27141,-18344,27151,-18330,27160,-18316,27170,-18302,27179,-18288,27188,-18274,27198,-18261,27207,-18247,27216,-18233,27226,-18219,27235,-18205,27244,-18191,27254,-18177,27263,-18163,27272,-18149,27281,-18135,27291,-18121,27300,-18107,27309,-18093,27319,-18079,27328,-18065,27337,-18051,27346,-18037,27355,-18023,27365,-18009,27374,-17995,27383,-17981,27392,-17967,27401,-17953,27411,-17939,27420,-17925,27429,-17911,27438,-17897,27447,-17883,27456,-17869,27466,-17855,27475,-17841,27484,-17827,27493,-17813,27502,-17799,27511,-17785,27520,-17771,27529,-17757,27538,-17743,27548,-17728,27557,-17714,27566,-17700,27575,-17686,27584,-17672,27593,-17658,27602,-17644,27611,-17630,27620,-17616,27629,-17601,27638,-17587,27647,-17573,27656,-17559,27665,-17545,27674,-17531,27683,-17517,27692,-17502,27701,-17488,27710,-17474,27719,-17460,27728,-17446,27736,-17432,27745,-17417,27754,-17403,27763,-17389,27772,-17375,27781,-17361,27790,-17346,27799,-17332,27808,-17318,27816,-17304,27825,-17289,27834,-17275,27843,-17261,27852,-17247,27861,-17233,27869,-17218,27878,-17204,27887,-17190,27896,-17175,27905,-17161,27913,-17147,27922,-17133,27931,-17118,27940,-17104,27948,-17090,27957,-17075,27966,-17061,27975,-17047,27983,-17033,27992,-17018,28001,-17004,28009,-16990,28018,-16975,28027,-16961,28036,-16947,28044,-16932,28053,-16918,28062,-16904,28070,-16889,28079,-16875,28087,-16860,28096,-16846,28105,-16832,28113,-16817,28122,-16803,28131,-16789,28139,-16774,28148,-16760,28156,-16745,28165,-16731,28173,-16717,28182,-16702,28190,-16688,28199,-16673,28208,-16659,28216,-16644,28225,-16630,28233,-16616,28242,-16601,28250,-16587,28259,-16572,28267,-16558,28275,-16543,28284,-16529,28292,-16514,28301,-16500,28309,-16485,28318,-16471,28326,-16456,28335,-16442,28343,-16428,28351,-16413,28360,-16399,28368}; +int16_t twb24576[16384] __attribute__((aligned(32))) = {32767,0,32766,-17,32766,-34,32766,-51,32766,-68,32766,-84,32766,-101,32766,-118,32766,-135,32766,-151,32766,-168,32766,-185,32766,-202,32766,-218,32766,-235,32766,-252,32765,-269,32765,-285,32765,-302,32765,-319,32765,-336,32765,-352,32764,-369,32764,-386,32764,-403,32764,-419,32764,-436,32763,-453,32763,-470,32763,-486,32763,-503,32762,-520,32762,-537,32762,-553,32762,-570,32761,-587,32761,-604,32761,-620,32760,-637,32760,-654,32760,-671,32759,-687,32759,-704,32759,-721,32758,-738,32758,-754,32757,-771,32757,-788,32757,-805,32756,-821,32756,-838,32755,-855,32755,-872,32754,-888,32754,-905,32754,-922,32753,-939,32753,-955,32752,-972,32752,-989,32751,-1006,32751,-1022,32750,-1039,32750,-1056,32749,-1073,32748,-1089,32748,-1106,32747,-1123,32747,-1140,32746,-1156,32746,-1173,32745,-1190,32744,-1207,32744,-1223,32743,-1240,32742,-1257,32742,-1274,32741,-1290,32740,-1307,32740,-1324,32739,-1340,32738,-1357,32738,-1374,32737,-1391,32736,-1407,32736,-1424,32735,-1441,32734,-1458,32733,-1474,32733,-1491,32732,-1508,32731,-1525,32730,-1541,32729,-1558,32729,-1575,32728,-1592,32727,-1608,32726,-1625,32725,-1642,32725,-1659,32724,-1675,32723,-1692,32722,-1709,32721,-1725,32720,-1742,32719,-1759,32718,-1776,32717,-1792,32717,-1809,32716,-1826,32715,-1843,32714,-1859,32713,-1876,32712,-1893,32711,-1909,32710,-1926,32709,-1943,32708,-1960,32707,-1976,32706,-1993,32705,-2010,32704,-2027,32703,-2043,32702,-2060,32701,-2077,32700,-2093,32699,-2110,32697,-2127,32696,-2144,32695,-2160,32694,-2177,32693,-2194,32692,-2210,32691,-2227,32690,-2244,32688,-2261,32687,-2277,32686,-2294,32685,-2311,32684,-2327,32683,-2344,32681,-2361,32680,-2378,32679,-2394,32678,-2411,32676,-2428,32675,-2444,32674,-2461,32673,-2478,32671,-2495,32670,-2511,32669,-2528,32668,-2545,32666,-2561,32665,-2578,32664,-2595,32662,-2611,32661,-2628,32660,-2645,32658,-2662,32657,-2678,32656,-2695,32654,-2712,32653,-2728,32651,-2745,32650,-2762,32649,-2778,32647,-2795,32646,-2812,32644,-2829,32643,-2845,32641,-2862,32640,-2879,32638,-2895,32637,-2912,32635,-2929,32634,-2945,32632,-2962,32631,-2979,32629,-2995,32628,-3012,32626,-3029,32625,-3045,32623,-3062,32622,-3079,32620,-3095,32618,-3112,32617,-3129,32615,-3146,32614,-3162,32612,-3179,32610,-3196,32609,-3212,32607,-3229,32605,-3246,32604,-3262,32602,-3279,32600,-3296,32599,-3312,32597,-3329,32595,-3346,32594,-3362,32592,-3379,32590,-3396,32588,-3412,32587,-3429,32585,-3446,32583,-3462,32581,-3479,32580,-3496,32578,-3512,32576,-3529,32574,-3546,32572,-3562,32571,-3579,32569,-3595,32567,-3612,32565,-3629,32563,-3645,32561,-3662,32559,-3679,32558,-3695,32556,-3712,32554,-3729,32552,-3745,32550,-3762,32548,-3779,32546,-3795,32544,-3812,32542,-3829,32540,-3845,32538,-3862,32536,-3878,32534,-3895,32532,-3912,32530,-3928,32528,-3945,32526,-3962,32524,-3978,32522,-3995,32520,-4012,32518,-4028,32516,-4045,32514,-4061,32512,-4078,32510,-4095,32508,-4111,32506,-4128,32503,-4145,32501,-4161,32499,-4178,32497,-4194,32495,-4211,32493,-4228,32491,-4244,32488,-4261,32486,-4277,32484,-4294,32482,-4311,32480,-4327,32477,-4344,32475,-4360,32473,-4377,32471,-4394,32468,-4410,32466,-4427,32464,-4444,32462,-4460,32459,-4477,32457,-4493,32455,-4510,32452,-4526,32450,-4543,32448,-4560,32445,-4576,32443,-4593,32441,-4609,32438,-4626,32436,-4643,32434,-4659,32431,-4676,32429,-4692,32426,-4709,32424,-4726,32422,-4742,32419,-4759,32417,-4775,32414,-4792,32412,-4808,32409,-4825,32407,-4842,32404,-4858,32402,-4875,32399,-4891,32397,-4908,32394,-4924,32392,-4941,32389,-4958,32387,-4974,32384,-4991,32382,-5007,32379,-5024,32377,-5040,32374,-5057,32371,-5073,32369,-5090,32366,-5107,32364,-5123,32361,-5140,32358,-5156,32356,-5173,32353,-5189,32350,-5206,32348,-5222,32345,-5239,32342,-5255,32340,-5272,32337,-5288,32334,-5305,32332,-5322,32329,-5338,32326,-5355,32323,-5371,32321,-5388,32318,-5404,32315,-5421,32312,-5437,32310,-5454,32307,-5470,32304,-5487,32301,-5503,32298,-5520,32295,-5536,32293,-5553,32290,-5569,32287,-5586,32284,-5602,32281,-5619,32278,-5635,32275,-5652,32273,-5668,32270,-5685,32267,-5701,32264,-5718,32261,-5734,32258,-5751,32255,-5767,32252,-5784,32249,-5800,32246,-5817,32243,-5833,32240,-5850,32237,-5866,32234,-5883,32231,-5899,32228,-5916,32225,-5932,32222,-5949,32219,-5965,32216,-5982,32213,-5998,32210,-6015,32207,-6031,32204,-6048,32201,-6064,32197,-6081,32194,-6097,32191,-6113,32188,-6130,32185,-6146,32182,-6163,32179,-6179,32176,-6196,32172,-6212,32169,-6229,32166,-6245,32163,-6262,32160,-6278,32156,-6294,32153,-6311,32150,-6327,32147,-6344,32143,-6360,32140,-6377,32137,-6393,32134,-6409,32130,-6426,32127,-6442,32124,-6459,32120,-6475,32117,-6492,32114,-6508,32110,-6524,32107,-6541,32104,-6557,32100,-6574,32097,-6590,32094,-6607,32090,-6623,32087,-6639,32084,-6656,32080,-6672,32077,-6689,32073,-6705,32070,-6721,32066,-6738,32063,-6754,32059,-6771,32056,-6787,32053,-6803,32049,-6820,32046,-6836,32042,-6852,32039,-6869,32035,-6885,32032,-6902,32028,-6918,32024,-6934,32021,-6951,32017,-6967,32014,-6983,32010,-7000,32007,-7016,32003,-7033,31999,-7049,31996,-7065,31992,-7082,31989,-7098,31985,-7114,31981,-7131,31978,-7147,31974,-7163,31970,-7180,31967,-7196,31963,-7212,31959,-7229,31956,-7245,31952,-7262,31948,-7278,31944,-7294,31941,-7311,31937,-7327,31933,-7343,31929,-7359,31926,-7376,31922,-7392,31918,-7408,31914,-7425,31911,-7441,31907,-7457,31903,-7474,31899,-7490,31895,-7506,31891,-7523,31888,-7539,31884,-7555,31880,-7572,31876,-7588,31872,-7604,31868,-7620,31864,-7637,31860,-7653,31856,-7669,31853,-7686,31849,-7702,31845,-7718,31841,-7734,31837,-7751,31833,-7767,31829,-7783,31825,-7800,31821,-7816,31817,-7832,31813,-7848,31809,-7865,31805,-7881,31801,-7897,31797,-7913,31793,-7930,31789,-7946,31785,-7962,31780,-7978,31776,-7995,31772,-8011,31768,-8027,31764,-8043,31760,-8060,31756,-8076,31752,-8092,31748,-8108,31743,-8125,31739,-8141,31735,-8157,31731,-8173,31727,-8190,31723,-8206,31718,-8222,31714,-8238,31710,-8254,31706,-8271,31701,-8287,31697,-8303,31693,-8319,31689,-8335,31684,-8352,31680,-8368,31676,-8384,31672,-8400,31667,-8416,31663,-8433,31659,-8449,31654,-8465,31650,-8481,31646,-8497,31641,-8514,31637,-8530,31633,-8546,31628,-8562,31624,-8578,31619,-8594,31615,-8611,31611,-8627,31606,-8643,31602,-8659,31597,-8675,31593,-8691,31588,-8708,31584,-8724,31580,-8740,31575,-8756,31571,-8772,31566,-8788,31562,-8804,31557,-8821,31553,-8837,31548,-8853,31544,-8869,31539,-8885,31534,-8901,31530,-8917,31525,-8933,31521,-8950,31516,-8966,31512,-8982,31507,-8998,31502,-9014,31498,-9030,31493,-9046,31489,-9062,31484,-9078,31479,-9095,31475,-9111,31470,-9127,31465,-9143,31461,-9159,31456,-9175,31451,-9191,31446,-9207,31442,-9223,31437,-9239,31432,-9255,31428,-9271,31423,-9288,31418,-9304,31413,-9320,31409,-9336,31404,-9352,31399,-9368,31394,-9384,31389,-9400,31385,-9416,31380,-9432,31375,-9448,31370,-9464,31365,-9480,31360,-9496,31356,-9512,31351,-9528,31346,-9544,31341,-9560,31336,-9576,31331,-9592,31326,-9608,31321,-9624,31316,-9640,31311,-9656,31307,-9672,31302,-9688,31297,-9704,31292,-9720,31287,-9736,31282,-9752,31277,-9768,31272,-9784,31267,-9800,31262,-9816,31257,-9832,31252,-9848,31247,-9864,31242,-9880,31236,-9896,31231,-9912,31226,-9928,31221,-9944,31216,-9960,31211,-9976,31206,-9992,31201,-10008,31196,-10024,31191,-10040,31185,-10056,31180,-10072,31175,-10088,31170,-10104,31165,-10120,31160,-10136,31154,-10152,31149,-10167,31144,-10183,31139,-10199,31134,-10215,31128,-10231,31123,-10247,31118,-10263,31113,-10279,31107,-10295,31102,-10311,31097,-10327,31092,-10343,31086,-10358,31081,-10374,31076,-10390,31070,-10406,31065,-10422,31060,-10438,31054,-10454,31049,-10470,31044,-10485,31038,-10501,31033,-10517,31028,-10533,31022,-10549,31017,-10565,31011,-10581,31006,-10597,31001,-10612,30995,-10628,30990,-10644,30984,-10660,30979,-10676,30973,-10692,30968,-10707,30962,-10723,30957,-10739,30951,-10755,30946,-10771,30940,-10787,30935,-10802,30929,-10818,30924,-10834,30918,-10850,30913,-10866,30907,-10881,30902,-10897,30896,-10913,30890,-10929,30885,-10945,30879,-10960,30874,-10976,30868,-10992,30862,-11008,30857,-11024,30851,-11039,30845,-11055,30840,-11071,30834,-11087,30828,-11102,30823,-11118,30817,-11134,30811,-11150,30806,-11165,30800,-11181,30794,-11197,30788,-11213,30783,-11228,30777,-11244,30771,-11260,30766,-11276,30760,-11291,30754,-11307,30748,-11323,30742,-11339,30737,-11354,30731,-11370,30725,-11386,30719,-11401,30713,-11417,30707,-11433,30702,-11449,30696,-11464,30690,-11480,30684,-11496,30678,-11511,30672,-11527,30666,-11543,30660,-11558,30655,-11574,30649,-11590,30643,-11605,30637,-11621,30631,-11637,30625,-11652,30619,-11668,30613,-11684,30607,-11699,30601,-11715,30595,-11731,30589,-11746,30583,-11762,30577,-11778,30571,-11793,30565,-11809,30559,-11824,30553,-11840,30547,-11856,30541,-11871,30535,-11887,30528,-11903,30522,-11918,30516,-11934,30510,-11949,30504,-11965,30498,-11981,30492,-11996,30486,-12012,30480,-12027,30473,-12043,30467,-12058,30461,-12074,30455,-12090,30449,-12105,30442,-12121,30436,-12136,30430,-12152,30424,-12167,30418,-12183,30411,-12199,30405,-12214,30399,-12230,30393,-12245,30386,-12261,30380,-12276,30374,-12292,30368,-12307,30361,-12323,30355,-12338,30349,-12354,30342,-12369,30336,-12385,30330,-12400,30323,-12416,30317,-12431,30311,-12447,30304,-12462,30298,-12478,30291,-12493,30285,-12509,30279,-12524,30272,-12540,30266,-12555,30259,-12571,30253,-12586,30247,-12602,30240,-12617,30234,-12633,30227,-12648,30221,-12664,30214,-12679,30208,-12695,30201,-12710,30195,-12725,30188,-12741,30182,-12756,30175,-12772,30169,-12787,30162,-12803,30156,-12818,30149,-12833,30142,-12849,30136,-12864,30129,-12880,30123,-12895,30116,-12910,30109,-12926,30103,-12941,30096,-12957,30090,-12972,30083,-12987,30076,-13003,30070,-13018,30063,-13034,30056,-13049,30050,-13064,30043,-13080,30036,-13095,30030,-13110,30023,-13126,30016,-13141,30009,-13156,30003,-13172,29996,-13187,29989,-13202,29983,-13218,29976,-13233,29969,-13248,29962,-13264,29955,-13279,29949,-13294,29942,-13310,29935,-13325,29928,-13340,29921,-13356,29915,-13371,29908,-13386,29901,-13401,29894,-13417,29887,-13432,29880,-13447,29873,-13463,29866,-13478,29860,-13493,29853,-13508,29846,-13524,29839,-13539,29832,-13554,29825,-13569,29818,-13585,29811,-13600,29804,-13615,29797,-13630,29790,-13646,29783,-13661,29776,-13676,29769,-13691,29762,-13707,29755,-13722,29748,-13737,29741,-13752,29734,-13767,29727,-13783,29720,-13798,29713,-13813,29706,-13828,29699,-13843,29692,-13859,29685,-13874,29678,-13889,29670,-13904,29663,-13919,29656,-13934,29649,-13950,29642,-13965,29635,-13980,29628,-13995,29621,-14010,29613,-14025,29606,-14040,29599,-14056,29592,-14071,29585,-14086,29577,-14101,29570,-14116,29563,-14131,29556,-14146,29548,-14161,29541,-14177,29534,-14192,29527,-14207,29519,-14222,29512,-14237,29505,-14252,29498,-14267,29490,-14282,29483,-14297,29476,-14312,29468,-14327,29461,-14343,29454,-14358,29446,-14373,29439,-14388,29432,-14403,29424,-14418,29417,-14433,29410,-14448,29402,-14463,29395,-14478,29387,-14493,29380,-14508,29372,-14523,29365,-14538,29358,-14553,29350,-14568,29343,-14583,29335,-14598,29328,-14613,29320,-14628,29313,-14643,29305,-14658,29298,-14673,29290,-14688,29283,-14703,29275,-14718,29268,-14733,29260,-14748,29253,-14763,29245,-14778,29238,-14793,29230,-14808,29222,-14823,29215,-14838,29207,-14853,29200,-14867,29192,-14882,29184,-14897,29177,-14912,29169,-14927,29162,-14942,29154,-14957,29146,-14972,29139,-14987,29131,-15002,29123,-15017,29116,-15031,29108,-15046,29100,-15061,29092,-15076,29085,-15091,29077,-15106,29069,-15121,29062,-15136,29054,-15150,29046,-15165,29038,-15180,29031,-15195,29023,-15210,29015,-15225,29007,-15239,28999,-15254,28992,-15269,28984,-15284,28976,-15299,28968,-15314,28960,-15328,28953,-15343,28945,-15358,28937,-15373,28929,-15388,28921,-15402,28913,-15417,28905,-15432,28897,-15447,28890,-15462,28882,-15476,28874,-15491,28866,-15506,28858,-15521,28850,-15535,28842,-15550,28834,-15565,28826,-15580,28818,-15594,28810,-15609,28802,-15624,28794,-15639,28786,-15653,28778,-15668,28770,-15683,28762,-15697,28754,-15712,28746,-15727,28738,-15741,28730,-15756,28722,-15771,28714,-15786,28706,-15800,28698,-15815,28690,-15830,28681,-15844,28673,-15859,28665,-15874,28657,-15888,28649,-15903,28641,-15918,28633,-15932,28625,-15947,28616,-15961,28608,-15976,28600,-15991,28592,-16005,28584,-16020,28575,-16035,28567,-16049,28559,-16064,28551,-16078,28543,-16093,28534,-16108,28526,-16122,28518,-16137,28510,-16151,28501,-16166,28493,-16180,28485,-16195,28477,-16210,28468,-16224,28460,-16239,28452,-16253,28443,-16268,28435,-16282,28427,-16297,28418,-16311,28410,-16326,28402,-16340,28393,-16355,28385,-16369,28377,-16384,28368,-16399,28360,-16413,28351,-16428,28343,-16442,28335,-16456,28326,-16471,28318,-16485,28309,-16500,28301,-16514,28292,-16529,28284,-16543,28275,-16558,28267,-16572,28259,-16587,28250,-16601,28242,-16616,28233,-16630,28225,-16644,28216,-16659,28208,-16673,28199,-16688,28190,-16702,28182,-16717,28173,-16731,28165,-16745,28156,-16760,28148,-16774,28139,-16789,28131,-16803,28122,-16817,28113,-16832,28105,-16846,28096,-16860,28087,-16875,28079,-16889,28070,-16904,28062,-16918,28053,-16932,28044,-16947,28036,-16961,28027,-16975,28018,-16990,28009,-17004,28001,-17018,27992,-17033,27983,-17047,27975,-17061,27966,-17075,27957,-17090,27948,-17104,27940,-17118,27931,-17133,27922,-17147,27913,-17161,27905,-17175,27896,-17190,27887,-17204,27878,-17218,27869,-17233,27861,-17247,27852,-17261,27843,-17275,27834,-17289,27825,-17304,27816,-17318,27808,-17332,27799,-17346,27790,-17361,27781,-17375,27772,-17389,27763,-17403,27754,-17417,27745,-17432,27736,-17446,27728,-17460,27719,-17474,27710,-17488,27701,-17502,27692,-17517,27683,-17531,27674,-17545,27665,-17559,27656,-17573,27647,-17587,27638,-17601,27629,-17616,27620,-17630,27611,-17644,27602,-17658,27593,-17672,27584,-17686,27575,-17700,27566,-17714,27557,-17728,27548,-17743,27538,-17757,27529,-17771,27520,-17785,27511,-17799,27502,-17813,27493,-17827,27484,-17841,27475,-17855,27466,-17869,27456,-17883,27447,-17897,27438,-17911,27429,-17925,27420,-17939,27411,-17953,27401,-17967,27392,-17981,27383,-17995,27374,-18009,27365,-18023,27355,-18037,27346,-18051,27337,-18065,27328,-18079,27319,-18093,27309,-18107,27300,-18121,27291,-18135,27281,-18149,27272,-18163,27263,-18177,27254,-18191,27244,-18205,27235,-18219,27226,-18233,27216,-18247,27207,-18261,27198,-18274,27188,-18288,27179,-18302,27170,-18316,27160,-18330,27151,-18344,27141,-18358,27132,-18372,27123,-18386,27113,-18399,27104,-18413,27094,-18427,27085,-18441,27076,-18455,27066,-18469,27057,-18483,27047,-18496,27038,-18510,27028,-18524,27019,-18538,27009,-18552,27000,-18565,26990,-18579,26981,-18593,26971,-18607,26962,-18621,26952,-18634,26943,-18648,26933,-18662,26924,-18676,26914,-18690,26905,-18703,26895,-18717,26885,-18731,26876,-18745,26866,-18758,26857,-18772,26847,-18786,26837,-18799,26828,-18813,26818,-18827,26809,-18841,26799,-18854,26789,-18868,26780,-18882,26770,-18895,26760,-18909,26751,-18923,26741,-18936,26731,-18950,26722,-18964,26712,-18977,26702,-18991,26692,-19005,26683,-19018,26673,-19032,26663,-19046,26654,-19059,26644,-19073,26634,-19087,26624,-19100,26615,-19114,26605,-19127,26595,-19141,26585,-19155,26575,-19168,26566,-19182,26556,-19195,26546,-19209,26536,-19222,26526,-19236,26516,-19250,26507,-19263,26497,-19277,26487,-19290,26477,-19304,26467,-19317,26457,-19331,26447,-19344,26437,-19358,26428,-19371,26418,-19385,26408,-19398,26398,-19412,26388,-19425,26378,-19439,26368,-19452,26358,-19466,26348,-19479,26338,-19493,26328,-19506,26318,-19520,26308,-19533,26298,-19547,26288,-19560,26278,-19574,26268,-19587,26258,-19600,26248,-19614,26238,-19627,26228,-19641,26218,-19654,26208,-19668,26198,-19681,26188,-19694,26178,-19708,26168,-19721,26158,-19734,26148,-19748,26137,-19761,26127,-19775,26117,-19788,26107,-19801,26097,-19815,26087,-19828,26077,-19841,26067,-19855,26056,-19868,26046,-19881,26036,-19895,26026,-19908,26016,-19921,26006,-19934,25995,-19948,25985,-19961,25975,-19974,25965,-19988,25954,-20001,25944,-20014,25934,-20027,25924,-20041,25913,-20054,25903,-20067,25893,-20080,25883,-20094,25872,-20107,25862,-20120,25852,-20133,25842,-20147,25831,-20160,25821,-20173,25811,-20186,25800,-20199,25790,-20213,25780,-20226,25769,-20239,25759,-20252,25749,-20265,25738,-20278,25728,-20292,25717,-20305,25707,-20318,25697,-20331,25686,-20344,25676,-20357,25665,-20370,25655,-20384,25645,-20397,25634,-20410,25624,-20423,25613,-20436,25603,-20449,25592,-20462,25582,-20475,25571,-20488,25561,-20501,25550,-20514,25540,-20528,25529,-20541,25519,-20554,25508,-20567,25498,-20580,25487,-20593,25477,-20606,25466,-20619,25456,-20632,25445,-20645,25435,-20658,25424,-20671,25414,-20684,25403,-20697,25392,-20710,25382,-20723,25371,-20736,25361,-20749,25350,-20762,25339,-20775,25329,-20788,25318,-20801,25307,-20814,25297,-20826,25286,-20839,25276,-20852,25265,-20865,25254,-20878,25243,-20891,25233,-20904,25222,-20917,25211,-20930,25201,-20943,25190,-20956,25179,-20968,25169,-20981,25158,-20994,25147,-21007,25136,-21020,25126,-21033,25115,-21046,25104,-21058,25093,-21071,25083,-21084,25072,-21097,25061,-21110,25050,-21123,25039,-21135,25029,-21148,25018,-21161,25007,-21174,24996,-21187,24985,-21199,24974,-21212,24964,-21225,24953,-21238,24942,-21250,24931,-21263,24920,-21276,24909,-21289,24898,-21301,24887,-21314,24877,-21327,24866,-21340,24855,-21352,24844,-21365,24833,-21378,24822,-21390,24811,-21403,24800,-21416,24789,-21428,24778,-21441,24767,-21454,24756,-21466,24745,-21479,24734,-21492,24723,-21504,24712,-21517,24701,-21530,24690,-21542,24679,-21555,24668,-21567,24657,-21580,24646,-21593,24635,-21605,24624,-21618,24613,-21630,24602,-21643,24591,-21656,24580,-21668,24569,-21681,24558,-21693,24546,-21706,24535,-21718,24524,-21731,24513,-21744,24502,-21756,24491,-21769,24480,-21781,24469,-21794,24457,-21806,24446,-21819,24435,-21831,24424,-21844,24413,-21856,24402,-21869,24390,-21881,24379,-21894,24368,-21906,24357,-21918,24346,-21931,24334,-21943,24323,-21956,24312,-21968,24301,-21981,24289,-21993,24278,-22005,24267,-22018,24256,-22030,24244,-22043,24233,-22055,24222,-22067,24211,-22080,24199,-22092,24188,-22105,24177,-22117,24165,-22129,24154,-22142,24143,-22154,24131,-22166,24120,-22179,24109,-22191,24097,-22203,24086,-22216,24075,-22228,24063,-22240,24052,-22253,24041,-22265,24029,-22277,24018,-22289,24006,-22302,23995,-22314,23984,-22326,23972,-22339,23961,-22351,23949,-22363,23938,-22375,23926,-22388,23915,-22400,23903,-22412,23892,-22424,23881,-22436,23869,-22449,23858,-22461,23846,-22473,23835,-22485,23823,-22497,23812,-22510,23800,-22522,23789,-22534,23777,-22546,23766,-22558,23754,-22570,23742,-22583,23731,-22595,23719,-22607,23708,-22619,23696,-22631,23685,-22643,23673,-22655,23661,-22667,23650,-22679,23638,-22692,23627,-22704,23615,-22716,23603,-22728,23592,-22740,23580,-22752,23569,-22764,23557,-22776,23545,-22788,23534,-22800,23522,-22812,23510,-22824,23499,-22836,23487,-22848,23475,-22860,23464,-22872,23452,-22884,23440,-22896,23428,-22908,23417,-22920,23405,-22932,23393,-22944,23382,-22956,23370,-22968,23358,-22980,23346,-22992,23335,-23004,23323,-23016,23311,-23028,23299,-23040,23287,-23051,23276,-23063,23264,-23075,23252,-23087,23240,-23099,23228,-23111,23217,-23123,23205,-23135,23193,-23147,23181,-23158,23169,-23170,23157,-23182,23146,-23194,23134,-23206,23122,-23218,23110,-23229,23098,-23241,23086,-23253,23074,-23265,23062,-23277,23050,-23288,23039,-23300,23027,-23312,23015,-23324,23003,-23336,22991,-23347,22979,-23359,22967,-23371,22955,-23383,22943,-23394,22931,-23406,22919,-23418,22907,-23429,22895,-23441,22883,-23453,22871,-23465,22859,-23476,22847,-23488,22835,-23500,22823,-23511,22811,-23523,22799,-23535,22787,-23546,22775,-23558,22763,-23570,22751,-23581,22739,-23593,22727,-23604,22715,-23616,22703,-23628,22691,-23639,22678,-23651,22666,-23662,22654,-23674,22642,-23686,22630,-23697,22618,-23709,22606,-23720,22594,-23732,22582,-23743,22569,-23755,22557,-23767,22545,-23778,22533,-23790,22521,-23801,22509,-23813,22496,-23824,22484,-23836,22472,-23847,22460,-23859,22448,-23870,22435,-23882,22423,-23893,22411,-23904,22399,-23916,22387,-23927,22374,-23939,22362,-23950,22350,-23962,22338,-23973,22325,-23985,22313,-23996,22301,-24007,22288,-24019,22276,-24030,22264,-24042,22252,-24053,22239,-24064,22227,-24076,22215,-24087,22202,-24098,22190,-24110,22178,-24121,22165,-24132,22153,-24144,22141,-24155,22128,-24166,22116,-24178,22104,-24189,22091,-24200,22079,-24212,22066,-24223,22054,-24234,22042,-24245,22029,-24257,22017,-24268,22004,-24279,21992,-24290,21980,-24302,21967,-24313,21955,-24324,21942,-24335,21930,-24347,21917,-24358,21905,-24369,21893,-24380,21880,-24391,21868,-24403,21855,-24414,21843,-24425,21830,-24436,21818,-24447,21805,-24458,21793,-24470,21780,-24481,21768,-24492,21755,-24503,21743,-24514,21730,-24525,21717,-24536,21705,-24547,21692,-24559,21680,-24570,21667,-24581,21655,-24592,21642,-24603,21629,-24614,21617,-24625,21604,-24636,21592,-24647,21579,-24658,21566,-24669,21554,-24680,21541,-24691,21529,-24702,21516,-24713,21503,-24724,21491,-24735,21478,-24746,21465,-24757,21453,-24768,21440,-24779,21427,-24790,21415,-24801,21402,-24812,21389,-24823,21377,-24834,21364,-24845,21351,-24856,21339,-24867,21326,-24878,21313,-24888,21300,-24899,21288,-24910,21275,-24921,21262,-24932,21249,-24943,21237,-24954,21224,-24965,21211,-24975,21198,-24986,21186,-24997,21173,-25008,21160,-25019,21147,-25030,21134,-25040,21122,-25051,21109,-25062,21096,-25073,21083,-25084,21070,-25094,21057,-25105,21045,-25116,21032,-25127,21019,-25137,21006,-25148,20993,-25159,20980,-25170,20967,-25180,20955,-25191,20942,-25202,20929,-25212,20916,-25223,20903,-25234,20890,-25244,20877,-25255,20864,-25266,20851,-25277,20838,-25287,20825,-25298,20813,-25308,20800,-25319,20787,-25330,20774,-25340,20761,-25351,20748,-25362,20735,-25372,20722,-25383,20709,-25393,20696,-25404,20683,-25415,20670,-25425,20657,-25436,20644,-25446,20631,-25457,20618,-25467,20605,-25478,20592,-25488,20579,-25499,20566,-25509,20553,-25520,20540,-25530,20527,-25541,20513,-25551,20500,-25562,20487,-25572,20474,-25583,20461,-25593,20448,-25604,20435,-25614,20422,-25625,20409,-25635,20396,-25646,20383,-25656,20369,-25666,20356,-25677,20343,-25687,20330,-25698,20317,-25708,20304,-25718,20291,-25729,20277,-25739,20264,-25750,20251,-25760,20238,-25770,20225,-25781,20212,-25791,20198,-25801,20185,-25812,20172,-25822,20159,-25832,20146,-25843,20132,-25853,20119,-25863,20106,-25873,20093,-25884,20079,-25894,20066,-25904,20053,-25914,20040,-25925,20026,-25935,20013,-25945,20000,-25955,19987,-25966,19973,-25976,19960,-25986,19947,-25996,19933,-26007,19920,-26017,19907,-26027,19894,-26037,19880,-26047,19867,-26057,19854,-26068,19840,-26078,19827,-26088,19814,-26098,19800,-26108,19787,-26118,19774,-26128,19760,-26138,19747,-26149,19733,-26159,19720,-26169,19707,-26179,19693,-26189,19680,-26199,19667,-26209,19653,-26219,19640,-26229,19626,-26239,19613,-26249,19599,-26259,19586,-26269,19573,-26279,19559,-26289,19546,-26299,19532,-26309,19519,-26319,19505,-26329,19492,-26339,19478,-26349,19465,-26359,19451,-26369,19438,-26379,19424,-26389,19411,-26399,19397,-26409,19384,-26419,19370,-26429,19357,-26438,19343,-26448,19330,-26458,19316,-26468,19303,-26478,19289,-26488,19276,-26498,19262,-26508,19249,-26517,19235,-26527,19221,-26537,19208,-26547,19194,-26557,19181,-26567,19167,-26576,19154,-26586,19140,-26596,19126,-26606,19113,-26616,19099,-26625,19086,-26635,19072,-26645,19058,-26655,19045,-26664,19031,-26674,19017,-26684,19004,-26693,18990,-26703,18976,-26713,18963,-26723,18949,-26732,18935,-26742,18922,-26752,18908,-26761,18894,-26771,18881,-26781,18867,-26790,18853,-26800,18840,-26810,18826,-26819,18812,-26829,18798,-26838,18785,-26848,18771,-26858,18757,-26867,18744,-26877,18730,-26886,18716,-26896,18702,-26906,18689,-26915,18675,-26925,18661,-26934,18647,-26944,18633,-26953,18620,-26963,18606,-26972,18592,-26982,18578,-26991,18564,-27001,18551,-27010,18537,-27020,18523,-27029,18509,-27039,18495,-27048,18482,-27058,18468,-27067,18454,-27077,18440,-27086,18426,-27095,18412,-27105,18398,-27114,18385,-27124,18371,-27133,18357,-27142,18343,-27152,18329,-27161,18315,-27171,18301,-27180,18287,-27189,18273,-27199,18260,-27208,18246,-27217,18232,-27227,18218,-27236,18204,-27245,18190,-27255,18176,-27264,18162,-27273,18148,-27282,18134,-27292,18120,-27301,18106,-27310,18092,-27320,18078,-27329,18064,-27338,18050,-27347,18036,-27356,18022,-27366,18008,-27375,17994,-27384,17980,-27393,17966,-27402,17952,-27412,17938,-27421,17924,-27430,17910,-27439,17896,-27448,17882,-27457,17868,-27467,17854,-27476,17840,-27485,17826,-27494,17812,-27503,17798,-27512,17784,-27521,17770,-27530,17756,-27539,17742,-27549,17727,-27558,17713,-27567,17699,-27576,17685,-27585,17671,-27594,17657,-27603,17643,-27612,17629,-27621,17615,-27630,17600,-27639,17586,-27648,17572,-27657,17558,-27666,17544,-27675,17530,-27684,17516,-27693,17501,-27702,17487,-27711,17473,-27720,17459,-27729,17445,-27737,17431,-27746,17416,-27755,17402,-27764,17388,-27773,17374,-27782,17360,-27791,17345,-27800,17331,-27809,17317,-27817,17303,-27826,17288,-27835,17274,-27844,17260,-27853,17246,-27862,17232,-27870,17217,-27879,17203,-27888,17189,-27897,17174,-27906,17160,-27914,17146,-27923,17132,-27932,17117,-27941,17103,-27949,17089,-27958,17074,-27967,17060,-27976,17046,-27984,17032,-27993,17017,-28002,17003,-28010,16989,-28019,16974,-28028,16960,-28037,16946,-28045,16931,-28054,16917,-28063,16903,-28071,16888,-28080,16874,-28088,16859,-28097,16845,-28106,16831,-28114,16816,-28123,16802,-28132,16788,-28140,16773,-28149,16759,-28157,16744,-28166,16730,-28174,16716,-28183,16701,-28191,16687,-28200,16672,-28209,16658,-28217,16643,-28226,16629,-28234,16615,-28243,16600,-28251,16586,-28260,16571,-28268,16557,-28276,16542,-28285,16528,-28293,16513,-28302,16499,-28310,16484,-28319,16470,-28327,16455,-28336,16441,-28344,16427,-28352,16412,-28361,16398,-28369,16383,-28378,16368,-28386,16354,-28394,16339,-28403,16325,-28411,16310,-28419,16296,-28428,16281,-28436,16267,-28444,16252,-28453,16238,-28461,16223,-28469,16209,-28478,16194,-28486,16179,-28494,16165,-28502,16150,-28511,16136,-28519,16121,-28527,16107,-28535,16092,-28544,16077,-28552,16063,-28560,16048,-28568,16034,-28576,16019,-28585,16004,-28593,15990,-28601,15975,-28609,15960,-28617,15946,-28626,15931,-28634,15917,-28642,15902,-28650,15887,-28658,15873,-28666,15858,-28674,15843,-28682,15829,-28691,15814,-28699,15799,-28707,15785,-28715,15770,-28723,15755,-28731,15740,-28739,15726,-28747,15711,-28755,15696,-28763,15682,-28771,15667,-28779,15652,-28787,15638,-28795,15623,-28803,15608,-28811,15593,-28819,15579,-28827,15564,-28835,15549,-28843,15534,-28851,15520,-28859,15505,-28867,15490,-28875,15475,-28883,15461,-28891,15446,-28898,15431,-28906,15416,-28914,15401,-28922,15387,-28930,15372,-28938,15357,-28946,15342,-28954,15327,-28961,15313,-28969,15298,-28977,15283,-28985,15268,-28993,15253,-29000,15238,-29008,15224,-29016,15209,-29024,15194,-29032,15179,-29039,15164,-29047,15149,-29055,15135,-29063,15120,-29070,15105,-29078,15090,-29086,15075,-29093,15060,-29101,15045,-29109,15030,-29117,15016,-29124,15001,-29132,14986,-29140,14971,-29147,14956,-29155,14941,-29163,14926,-29170,14911,-29178,14896,-29185,14881,-29193,14866,-29201,14852,-29208,14837,-29216,14822,-29223,14807,-29231,14792,-29239,14777,-29246,14762,-29254,14747,-29261,14732,-29269,14717,-29276,14702,-29284,14687,-29291,14672,-29299,14657,-29306,14642,-29314,14627,-29321,14612,-29329,14597,-29336,14582,-29344,14567,-29351,14552,-29359,14537,-29366,14522,-29373,14507,-29381,14492,-29388,14477,-29396,14462,-29403,14447,-29411,14432,-29418,14417,-29425,14402,-29433,14387,-29440,14372,-29447,14357,-29455,14342,-29462,14326,-29469,14311,-29477,14296,-29484,14281,-29491,14266,-29499,14251,-29506,14236,-29513,14221,-29520,14206,-29528,14191,-29535,14176,-29542,14160,-29549,14145,-29557,14130,-29564,14115,-29571,14100,-29578,14085,-29586,14070,-29593,14055,-29600,14039,-29607,14024,-29614,14009,-29622,13994,-29629,13979,-29636,13964,-29643,13949,-29650,13933,-29657,13918,-29664,13903,-29671,13888,-29679,13873,-29686,13858,-29693,13842,-29700,13827,-29707,13812,-29714,13797,-29721,13782,-29728,13766,-29735,13751,-29742,13736,-29749,13721,-29756,13706,-29763,13690,-29770,13675,-29777,13660,-29784,13645,-29791,13629,-29798,13614,-29805,13599,-29812,13584,-29819,13568,-29826,13553,-29833,13538,-29840,13523,-29847,13507,-29854,13492,-29861,13477,-29867,13462,-29874,13446,-29881,13431,-29888,13416,-29895,13400,-29902,13385,-29909,13370,-29916,13355,-29922,13339,-29929,13324,-29936,13309,-29943,13293,-29950,13278,-29956,13263,-29963,13247,-29970,13232,-29977,13217,-29984,13201,-29990,13186,-29997,13171,-30004,13155,-30010,13140,-30017,13125,-30024,13109,-30031,13094,-30037,13079,-30044,13063,-30051,13048,-30057,13033,-30064,13017,-30071,13002,-30077,12986,-30084,12971,-30091,12956,-30097,12940,-30104,12925,-30110,12909,-30117,12894,-30124,12879,-30130,12863,-30137,12848,-30143,12832,-30150,12817,-30157,12802,-30163,12786,-30170,12771,-30176,12755,-30183,12740,-30189,12724,-30196,12709,-30202,12694,-30209,12678,-30215,12663,-30222,12647,-30228,12632,-30235,12616,-30241,12601,-30248,12585,-30254,12570,-30260,12554,-30267,12539,-30273,12523,-30280,12508,-30286,12492,-30292,12477,-30299,12461,-30305,12446,-30312,12430,-30318,12415,-30324,12399,-30331,12384,-30337,12368,-30343,12353,-30350,12337,-30356,12322,-30362,12306,-30369,12291,-30375,12275,-30381,12260,-30387,12244,-30394,12229,-30400,12213,-30406,12198,-30412,12182,-30419,12166,-30425,12151,-30431,12135,-30437,12120,-30443,12104,-30450,12089,-30456,12073,-30462,12057,-30468,12042,-30474,12026,-30481,12011,-30487,11995,-30493,11980,-30499,11964,-30505,11948,-30511,11933,-30517,11917,-30523,11902,-30529,11886,-30536,11870,-30542,11855,-30548,11839,-30554,11823,-30560,11808,-30566,11792,-30572,11777,-30578,11761,-30584,11745,-30590,11730,-30596,11714,-30602,11698,-30608,11683,-30614,11667,-30620,11651,-30626,11636,-30632,11620,-30638,11604,-30644,11589,-30650,11573,-30656,11557,-30661,11542,-30667,11526,-30673,11510,-30679,11495,-30685,11479,-30691,11463,-30697,11448,-30703,11432,-30708,11416,-30714,11400,-30720,11385,-30726,11369,-30732,11353,-30738,11338,-30743,11322,-30749,11306,-30755,11290,-30761,11275,-30767,11259,-30772,11243,-30778,11227,-30784,11212,-30789,11196,-30795,11180,-30801,11164,-30807,11149,-30812,11133,-30818,11117,-30824,11101,-30829,11086,-30835,11070,-30841,11054,-30846,11038,-30852,11023,-30858,11007,-30863,10991,-30869,10975,-30875,10959,-30880,10944,-30886,10928,-30891,10912,-30897,10896,-30903,10880,-30908,10865,-30914,10849,-30919,10833,-30925,10817,-30930,10801,-30936,10786,-30941,10770,-30947,10754,-30952,10738,-30958,10722,-30963,10706,-30969,10691,-30974,10675,-30980,10659,-30985,10643,-30991,10627,-30996,10611,-31002,10596,-31007,10580,-31012,10564,-31018,10548,-31023,10532,-31029,10516,-31034,10500,-31039,10484,-31045,10469,-31050,10453,-31055,10437,-31061,10421,-31066,10405,-31071,10389,-31077,10373,-31082,10357,-31087,10342,-31093,10326,-31098,10310,-31103,10294,-31108,10278,-31114,10262,-31119,10246,-31124,10230,-31129,10214,-31135,10198,-31140,10182,-31145,10166,-31150,10151,-31155,10135,-31161,10119,-31166,10103,-31171,10087,-31176,10071,-31181,10055,-31186,10039,-31192,10023,-31197,10007,-31202,9991,-31207,9975,-31212,9959,-31217,9943,-31222,9927,-31227,9911,-31232,9895,-31237,9879,-31243,9863,-31248,9847,-31253,9831,-31258,9815,-31263,9799,-31268,9783,-31273,9767,-31278,9751,-31283,9735,-31288,9719,-31293,9703,-31298,9687,-31303,9671,-31308,9655,-31312,9639,-31317,9623,-31322,9607,-31327,9591,-31332,9575,-31337,9559,-31342,9543,-31347,9527,-31352,9511,-31357,9495,-31361,9479,-31366,9463,-31371,9447,-31376,9431,-31381,9415,-31386,9399,-31390,9383,-31395,9367,-31400,9351,-31405,9335,-31410,9319,-31414,9303,-31419,9287,-31424,9270,-31429,9254,-31433,9238,-31438,9222,-31443,9206,-31447,9190,-31452,9174,-31457,9158,-31462,9142,-31466,9126,-31471,9110,-31476,9094,-31480,9077,-31485,9061,-31490,9045,-31494,9029,-31499,9013,-31503,8997,-31508,8981,-31513,8965,-31517,8949,-31522,8932,-31526,8916,-31531,8900,-31535,8884,-31540,8868,-31545,8852,-31549,8836,-31554,8820,-31558,8803,-31563,8787,-31567,8771,-31572,8755,-31576,8739,-31581,8723,-31585,8707,-31589,8690,-31594,8674,-31598,8658,-31603,8642,-31607,8626,-31612,8610,-31616,8593,-31620,8577,-31625,8561,-31629,8545,-31634,8529,-31638,8513,-31642,8496,-31647,8480,-31651,8464,-31655,8448,-31660,8432,-31664,8415,-31668,8399,-31673,8383,-31677,8367,-31681,8351,-31685,8334,-31690,8318,-31694,8302,-31698,8286,-31702,8270,-31707,8253,-31711,8237,-31715,8221,-31719,8205,-31724,8189,-31728,8172,-31732,8156,-31736,8140,-31740,8124,-31744,8107,-31749,8091,-31753,8075,-31757,8059,-31761,8042,-31765,8026,-31769,8010,-31773,7994,-31777,7977,-31781,7961,-31786,7945,-31790,7929,-31794,7912,-31798,7896,-31802,7880,-31806,7864,-31810,7847,-31814,7831,-31818,7815,-31822,7799,-31826,7782,-31830,7766,-31834,7750,-31838,7733,-31842,7717,-31846,7701,-31850,7685,-31854,7668,-31857,7652,-31861,7636,-31865,7619,-31869,7603,-31873,7587,-31877,7571,-31881,7554,-31885,7538,-31889,7522,-31892,7505,-31896,7489,-31900,7473,-31904,7456,-31908,7440,-31912,7424,-31915,7407,-31919,7391,-31923,7375,-31927,7358,-31930,7342,-31934,7326,-31938,7310,-31942,7293,-31945,7277,-31949,7261,-31953,7244,-31957,7228,-31960,7211,-31964,7195,-31968,7179,-31971,7162,-31975,7146,-31979,7130,-31982,7113,-31986,7097,-31990,7081,-31993,7064,-31997,7048,-32000,7032,-32004,7015,-32008,6999,-32011,6982,-32015,6966,-32018,6950,-32022,6933,-32025,6917,-32029,6901,-32033,6884,-32036,6868,-32040,6851,-32043,6835,-32047,6819,-32050,6802,-32054,6786,-32057,6770,-32060,6753,-32064,6737,-32067,6720,-32071,6704,-32074,6688,-32078,6671,-32081,6655,-32085,6638,-32088,6622,-32091,6606,-32095,6589,-32098,6573,-32101,6556,-32105,6540,-32108,6523,-32111,6507,-32115,6491,-32118,6474,-32121,6458,-32125,6441,-32128,6425,-32131,6408,-32135,6392,-32138,6376,-32141,6359,-32144,6343,-32148,6326,-32151,6310,-32154,6293,-32157,6277,-32161,6261,-32164,6244,-32167,6228,-32170,6211,-32173,6195,-32177,6178,-32180,6162,-32183,6145,-32186,6129,-32189,6112,-32192,6096,-32195,6080,-32198,6063,-32202,6047,-32205,6030,-32208,6014,-32211,5997,-32214,5981,-32217,5964,-32220,5948,-32223,5931,-32226,5915,-32229,5898,-32232,5882,-32235,5865,-32238,5849,-32241,5832,-32244,5816,-32247,5799,-32250,5783,-32253,5766,-32256,5750,-32259,5733,-32262,5717,-32265,5700,-32268,5684,-32271,5667,-32274,5651,-32276,5634,-32279,5618,-32282,5601,-32285,5585,-32288,5568,-32291,5552,-32294,5535,-32296,5519,-32299,5502,-32302,5486,-32305,5469,-32308,5453,-32311,5436,-32313,5420,-32316,5403,-32319,5387,-32322,5370,-32324,5354,-32327,5337,-32330,5321,-32333,5304,-32335,5287,-32338,5271,-32341,5254,-32343,5238,-32346,5221,-32349,5205,-32351,5188,-32354,5172,-32357,5155,-32359,5139,-32362,5122,-32365,5106,-32367,5089,-32370,5072,-32372,5056,-32375,5039,-32378,5023,-32380,5006,-32383,4990,-32385,4973,-32388,4957,-32390,4940,-32393,4923,-32395,4907,-32398,4890,-32400,4874,-32403,4857,-32405,4841,-32408,4824,-32410,4807,-32413,4791,-32415,4774,-32418,4758,-32420,4741,-32423,4725,-32425,4708,-32427,4691,-32430,4675,-32432,4658,-32435,4642,-32437,4625,-32439,4608,-32442,4592,-32444,4575,-32446,4559,-32449,4542,-32451,4525,-32453,4509,-32456,4492,-32458,4476,-32460,4459,-32463,4443,-32465,4426,-32467,4409,-32469,4393,-32472,4376,-32474,4359,-32476,4343,-32478,4326,-32481,4310,-32483,4293,-32485,4276,-32487,4260,-32489,4243,-32492,4227,-32494,4210,-32496,4193,-32498,4177,-32500,4160,-32502,4144,-32504,4127,-32507,4110,-32509,4094,-32511,4077,-32513,4060,-32515,4044,-32517,4027,-32519,4011,-32521,3994,-32523,3977,-32525,3961,-32527,3944,-32529,3927,-32531,3911,-32533,3894,-32535,3877,-32537,3861,-32539,3844,-32541,3828,-32543,3811,-32545,3794,-32547,3778,-32549,3761,-32551,3744,-32553,3728,-32555,3711,-32557,3694,-32559,3678,-32560,3661,-32562,3644,-32564,3628,-32566,3611,-32568,3594,-32570,3578,-32572,3561,-32573,3545,-32575,3528,-32577,3511,-32579,3495,-32581,3478,-32582,3461,-32584,3445,-32586,3428,-32588,3411,-32589,3395,-32591,3378,-32593,3361,-32595,3345,-32596,3328,-32598,3311,-32600,3295,-32601,3278,-32603,3261,-32605,3245,-32606,3228,-32608,3211,-32610,3195,-32611,3178,-32613,3161,-32615,3145,-32616,3128,-32618,3111,-32619,3094,-32621,3078,-32623,3061,-32624,3044,-32626,3028,-32627,3011,-32629,2994,-32630,2978,-32632,2961,-32633,2944,-32635,2928,-32636,2911,-32638,2894,-32639,2878,-32641,2861,-32642,2844,-32644,2828,-32645,2811,-32647,2794,-32648,2777,-32650,2761,-32651,2744,-32652,2727,-32654,2711,-32655,2694,-32657,2677,-32658,2661,-32659,2644,-32661,2627,-32662,2610,-32663,2594,-32665,2577,-32666,2560,-32667,2544,-32669,2527,-32670,2510,-32671,2494,-32672,2477,-32674,2460,-32675,2443,-32676,2427,-32677,2410,-32679,2393,-32680,2377,-32681,2360,-32682,2343,-32684,2326,-32685,2310,-32686,2293,-32687,2276,-32688,2260,-32689,2243,-32691,2226,-32692,2209,-32693,2193,-32694,2176,-32695,2159,-32696,2143,-32697,2126,-32698,2109,-32700,2092,-32701,2076,-32702,2059,-32703,2042,-32704,2026,-32705,2009,-32706,1992,-32707,1975,-32708,1959,-32709,1942,-32710,1925,-32711,1908,-32712,1892,-32713,1875,-32714,1858,-32715,1842,-32716,1825,-32717,1808,-32718,1791,-32718,1775,-32719,1758,-32720,1741,-32721,1724,-32722,1708,-32723,1691,-32724,1674,-32725,1658,-32726,1641,-32726,1624,-32727,1607,-32728,1591,-32729,1574,-32730,1557,-32730,1540,-32731,1524,-32732,1507,-32733,1490,-32734,1473,-32734,1457,-32735,1440,-32736,1423,-32737,1406,-32737,1390,-32738,1373,-32739,1356,-32739,1339,-32740,1323,-32741,1306,-32741,1289,-32742,1273,-32743,1256,-32743,1239,-32744,1222,-32745,1206,-32745,1189,-32746,1172,-32747,1155,-32747,1139,-32748,1122,-32748,1105,-32749,1088,-32749,1072,-32750,1055,-32751,1038,-32751,1021,-32752,1005,-32752,988,-32753,971,-32753,954,-32754,938,-32754,921,-32755,904,-32755,887,-32755,871,-32756,854,-32756,837,-32757,820,-32757,804,-32758,787,-32758,770,-32758,753,-32759,737,-32759,720,-32760,703,-32760,686,-32760,670,-32761,653,-32761,636,-32761,619,-32762,603,-32762,586,-32762,569,-32763,552,-32763,536,-32763,519,-32763,502,-32764,485,-32764,469,-32764,452,-32764,435,-32765,418,-32765,402,-32765,385,-32765,368,-32765,351,-32766,335,-32766,318,-32766,301,-32766,284,-32766,268,-32766,251,-32767,234,-32767,217,-32767,201,-32767,184,-32767,167,-32767,150,-32767,134,-32767,117,-32767,100,-32767,83,-32767,67,-32767,50,-32767,33,-32767,16,-32767,0,-32767,-17,-32767,-34,-32767,-51,-32767,-68,-32767,-84,-32767,-101,-32767,-118,-32767,-135,-32767,-151,-32767,-168,-32767,-185,-32767,-202,-32767,-218,-32767,-235,-32767,-252,-32767,-269,-32766,-285,-32766,-302,-32766,-319,-32766,-336,-32766,-352,-32766,-369,-32765,-386,-32765,-403,-32765,-419,-32765,-436,-32765,-453,-32764,-470,-32764,-486,-32764,-503,-32764,-520,-32763,-537,-32763,-553,-32763,-570,-32763,-587,-32762,-604,-32762,-620,-32762,-637,-32761,-654,-32761,-671,-32761,-687,-32760,-704,-32760,-721,-32760,-738,-32759,-754,-32759,-771,-32758,-788,-32758,-805,-32758,-821,-32757,-838,-32757,-855,-32756,-872,-32756,-888,-32755,-905,-32755,-922,-32755,-939,-32754,-955,-32754,-972,-32753,-989,-32753,-1006,-32752,-1022,-32752,-1039,-32751,-1056,-32751,-1073,-32750,-1089,-32749,-1106,-32749,-1123,-32748,-1140,-32748,-1156,-32747,-1173,-32747,-1190,-32746,-1207,-32745,-1223,-32745,-1240,-32744,-1257,-32743,-1274,-32743,-1290,-32742,-1307,-32741,-1324,-32741,-1340,-32740,-1357,-32739,-1374,-32739,-1391,-32738,-1407,-32737,-1424,-32737,-1441,-32736,-1458,-32735,-1474,-32734,-1491,-32734,-1508,-32733,-1525,-32732,-1541,-32731,-1558,-32730,-1575,-32730,-1592,-32729,-1608,-32728,-1625,-32727,-1642,-32726,-1659,-32726,-1675,-32725,-1692,-32724,-1709,-32723,-1725,-32722,-1742,-32721,-1759,-32720,-1776,-32719,-1792,-32718,-1809,-32718,-1826,-32717,-1843,-32716,-1859,-32715,-1876,-32714,-1893,-32713,-1909,-32712,-1926,-32711,-1943,-32710,-1960,-32709,-1976,-32708,-1993,-32707,-2010,-32706,-2027,-32705,-2043,-32704,-2060,-32703,-2077,-32702,-2093,-32701,-2110,-32700,-2127,-32698,-2144,-32697,-2160,-32696,-2177,-32695,-2194,-32694,-2210,-32693,-2227,-32692,-2244,-32691,-2261,-32689,-2277,-32688,-2294,-32687,-2311,-32686,-2327,-32685,-2344,-32684,-2361,-32682,-2378,-32681,-2394,-32680,-2411,-32679,-2428,-32677,-2444,-32676,-2461,-32675,-2478,-32674,-2495,-32672,-2511,-32671,-2528,-32670,-2545,-32669,-2561,-32667,-2578,-32666,-2595,-32665,-2611,-32663,-2628,-32662,-2645,-32661,-2662,-32659,-2678,-32658,-2695,-32657,-2712,-32655,-2728,-32654,-2745,-32652,-2762,-32651,-2778,-32650,-2795,-32648,-2812,-32647,-2829,-32645,-2845,-32644,-2862,-32642,-2879,-32641,-2895,-32639,-2912,-32638,-2929,-32636,-2945,-32635,-2962,-32633,-2979,-32632,-2995,-32630,-3012,-32629,-3029,-32627,-3045,-32626,-3062,-32624,-3079,-32623,-3095,-32621,-3112,-32619,-3129,-32618,-3146,-32616,-3162,-32615,-3179,-32613,-3196,-32611,-3212,-32610,-3229,-32608,-3246,-32606,-3262,-32605,-3279,-32603,-3296,-32601,-3312,-32600,-3329,-32598,-3346,-32596,-3362,-32595,-3379,-32593,-3396,-32591,-3412,-32589,-3429,-32588,-3446,-32586,-3462,-32584,-3479,-32582,-3496,-32581,-3512,-32579,-3529,-32577,-3546,-32575,-3562,-32573,-3579,-32572,-3595,-32570,-3612,-32568,-3629,-32566,-3645,-32564,-3662,-32562,-3679,-32560,-3695,-32559,-3712,-32557,-3729,-32555,-3745,-32553,-3762,-32551,-3779,-32549,-3795,-32547,-3812,-32545,-3829,-32543,-3845,-32541,-3862,-32539,-3878,-32537,-3895,-32535,-3912,-32533,-3928,-32531,-3945,-32529,-3962,-32527,-3978,-32525,-3995,-32523,-4012,-32521,-4028,-32519,-4045,-32517,-4061,-32515,-4078,-32513,-4095,-32511,-4111,-32509,-4128,-32507,-4145,-32504,-4161,-32502,-4178,-32500,-4194,-32498,-4211,-32496,-4228,-32494,-4244,-32492,-4261,-32489,-4277,-32487,-4294,-32485,-4311,-32483,-4327,-32481,-4344,-32478,-4360,-32476,-4377,-32474,-4394,-32472,-4410,-32469,-4427,-32467,-4444,-32465,-4460,-32463,-4477,-32460,-4493,-32458,-4510,-32456,-4526,-32453,-4543,-32451,-4560,-32449,-4576,-32446,-4593,-32444,-4609,-32442,-4626,-32439,-4643,-32437,-4659,-32435,-4676,-32432,-4692,-32430,-4709,-32427,-4726,-32425,-4742,-32423,-4759,-32420,-4775,-32418,-4792,-32415,-4808,-32413,-4825,-32410,-4842,-32408,-4858,-32405,-4875,-32403,-4891,-32400,-4908,-32398,-4924,-32395,-4941,-32393,-4958,-32390,-4974,-32388,-4991,-32385,-5007,-32383,-5024,-32380,-5040,-32378,-5057,-32375,-5073,-32372,-5090,-32370,-5107,-32367,-5123,-32365,-5140,-32362,-5156,-32359,-5173,-32357,-5189,-32354,-5206,-32351,-5222,-32349,-5239,-32346,-5255,-32343,-5272,-32341,-5288,-32338,-5305,-32335,-5322,-32333,-5338,-32330,-5355,-32327,-5371,-32324,-5388,-32322,-5404,-32319,-5421,-32316,-5437,-32313,-5454,-32311,-5470,-32308,-5487,-32305,-5503,-32302,-5520,-32299,-5536,-32296,-5553,-32294,-5569,-32291,-5586,-32288,-5602,-32285,-5619,-32282,-5635,-32279,-5652,-32276,-5668,-32274,-5685,-32271,-5701,-32268,-5718,-32265,-5734,-32262,-5751,-32259,-5767,-32256,-5784,-32253,-5800,-32250,-5817,-32247,-5833,-32244,-5850,-32241,-5866,-32238,-5883,-32235,-5899,-32232,-5916,-32229,-5932,-32226,-5949,-32223,-5965,-32220,-5982,-32217,-5998,-32214,-6015,-32211,-6031,-32208,-6048,-32205,-6064,-32202,-6081,-32198,-6097,-32195,-6113,-32192,-6130,-32189,-6146,-32186,-6163,-32183,-6179,-32180,-6196,-32177,-6212,-32173,-6229,-32170,-6245,-32167,-6262,-32164,-6278,-32161,-6294,-32157,-6311,-32154,-6327,-32151,-6344,-32148,-6360,-32144,-6377,-32141,-6393,-32138,-6409,-32135,-6426,-32131,-6442,-32128,-6459,-32125,-6475,-32121,-6492,-32118,-6508,-32115,-6524,-32111,-6541,-32108,-6557,-32105,-6574,-32101,-6590,-32098,-6607,-32095,-6623,-32091,-6639,-32088,-6656,-32085,-6672,-32081,-6689,-32078,-6705,-32074,-6721,-32071,-6738,-32067,-6754,-32064,-6771,-32060,-6787,-32057,-6803,-32054,-6820,-32050,-6836,-32047,-6852,-32043,-6869,-32040,-6885,-32036,-6902,-32033,-6918,-32029,-6934,-32025,-6951,-32022,-6967,-32018,-6983,-32015,-7000,-32011,-7016,-32008,-7033,-32004,-7049,-32000,-7065,-31997,-7082,-31993,-7098,-31990,-7114,-31986,-7131,-31982,-7147,-31979,-7163,-31975,-7180,-31971,-7196,-31968,-7212,-31964,-7229,-31960,-7245,-31957,-7262,-31953,-7278,-31949,-7294,-31945,-7311,-31942,-7327,-31938,-7343,-31934,-7359,-31930,-7376,-31927,-7392,-31923,-7408,-31919,-7425,-31915,-7441,-31912,-7457,-31908,-7474,-31904,-7490,-31900,-7506,-31896,-7523,-31892,-7539,-31889,-7555,-31885,-7572,-31881,-7588,-31877,-7604,-31873,-7620,-31869,-7637,-31865,-7653,-31861,-7669,-31857,-7686,-31854,-7702,-31850,-7718,-31846,-7734,-31842,-7751,-31838,-7767,-31834,-7783,-31830,-7800,-31826,-7816,-31822,-7832,-31818,-7848,-31814,-7865,-31810,-7881,-31806,-7897,-31802,-7913,-31798,-7930,-31794,-7946,-31790,-7962,-31786,-7978,-31781,-7995,-31777,-8011,-31773,-8027,-31769,-8043,-31765,-8060,-31761,-8076,-31757,-8092,-31753,-8108,-31749,-8125,-31744,-8141,-31740,-8157,-31736,-8173,-31732,-8190,-31728,-8206,-31724,-8222,-31719,-8238,-31715,-8254,-31711,-8271,-31707,-8287,-31702,-8303,-31698,-8319,-31694,-8335,-31690,-8352,-31685,-8368,-31681,-8384,-31677,-8400,-31673,-8416,-31668,-8433,-31664,-8449,-31660,-8465,-31655,-8481,-31651,-8497,-31647,-8514,-31642,-8530,-31638,-8546,-31634,-8562,-31629,-8578,-31625,-8594,-31620,-8611,-31616,-8627,-31612,-8643,-31607,-8659,-31603,-8675,-31598,-8691,-31594,-8708,-31589,-8724,-31585,-8740,-31581,-8756,-31576,-8772,-31572,-8788,-31567,-8804,-31563,-8821,-31558,-8837,-31554,-8853,-31549,-8869,-31545,-8885,-31540,-8901,-31535,-8917,-31531,-8933,-31526,-8950,-31522,-8966,-31517,-8982,-31513,-8998,-31508,-9014,-31503,-9030,-31499,-9046,-31494,-9062,-31490,-9078,-31485,-9095,-31480,-9111,-31476,-9127,-31471,-9143,-31466,-9159,-31462,-9175,-31457,-9191,-31452,-9207,-31447,-9223,-31443,-9239,-31438,-9255,-31433,-9271,-31429,-9288,-31424,-9304,-31419,-9320,-31414,-9336,-31410,-9352,-31405,-9368,-31400,-9384,-31395,-9400,-31390,-9416,-31386,-9432,-31381,-9448,-31376,-9464,-31371,-9480,-31366,-9496,-31361,-9512,-31357,-9528,-31352,-9544,-31347,-9560,-31342,-9576,-31337,-9592,-31332,-9608,-31327,-9624,-31322,-9640,-31317,-9656,-31312,-9672,-31308,-9688,-31303,-9704,-31298,-9720,-31293,-9736,-31288,-9752,-31283,-9768,-31278,-9784,-31273,-9800,-31268,-9816,-31263,-9832,-31258,-9848,-31253,-9864,-31248,-9880,-31243,-9896,-31237,-9912,-31232,-9928,-31227,-9944,-31222,-9960,-31217,-9976,-31212,-9992,-31207,-10008,-31202,-10024,-31197,-10040,-31192,-10056,-31186,-10072,-31181,-10088,-31176,-10104,-31171,-10120,-31166,-10136,-31161,-10152,-31155,-10167,-31150,-10183,-31145,-10199,-31140,-10215,-31135,-10231,-31129,-10247,-31124,-10263,-31119,-10279,-31114,-10295,-31108,-10311,-31103,-10327,-31098,-10343,-31093,-10358,-31087,-10374,-31082,-10390,-31077,-10406,-31071,-10422,-31066,-10438,-31061,-10454,-31055,-10470,-31050,-10485,-31045,-10501,-31039,-10517,-31034,-10533,-31029,-10549,-31023,-10565,-31018,-10581,-31012,-10597,-31007,-10612,-31002,-10628,-30996,-10644,-30991,-10660,-30985,-10676,-30980,-10692,-30974,-10707,-30969,-10723,-30963,-10739,-30958,-10755,-30952,-10771,-30947,-10787,-30941,-10802,-30936,-10818,-30930,-10834,-30925,-10850,-30919,-10866,-30914,-10881,-30908,-10897,-30903,-10913,-30897,-10929,-30891,-10945,-30886,-10960,-30880,-10976,-30875,-10992,-30869,-11008,-30863,-11024,-30858,-11039,-30852,-11055,-30846,-11071,-30841,-11087,-30835,-11102,-30829,-11118,-30824,-11134,-30818,-11150,-30812,-11165,-30807,-11181,-30801,-11197,-30795,-11213,-30789,-11228,-30784,-11244,-30778,-11260,-30772,-11276,-30767,-11291,-30761,-11307,-30755,-11323,-30749,-11339,-30743,-11354,-30738,-11370,-30732,-11386,-30726,-11401,-30720,-11417,-30714,-11433,-30708,-11449,-30703,-11464,-30697,-11480,-30691,-11496,-30685,-11511,-30679,-11527,-30673,-11543,-30667,-11558,-30661,-11574,-30656,-11590,-30650,-11605,-30644,-11621,-30638,-11637,-30632,-11652,-30626,-11668,-30620,-11684,-30614,-11699,-30608,-11715,-30602,-11731,-30596,-11746,-30590,-11762,-30584,-11778,-30578,-11793,-30572,-11809,-30566,-11824,-30560,-11840,-30554,-11856,-30548,-11871,-30542,-11887,-30536,-11903,-30529,-11918,-30523,-11934,-30517,-11949,-30511,-11965,-30505,-11981,-30499,-11996,-30493,-12012,-30487,-12027,-30481,-12043,-30474,-12058,-30468,-12074,-30462,-12090,-30456,-12105,-30450,-12121,-30443,-12136,-30437,-12152,-30431,-12167,-30425,-12183,-30419,-12199,-30412,-12214,-30406,-12230,-30400,-12245,-30394,-12261,-30387,-12276,-30381,-12292,-30375,-12307,-30369,-12323,-30362,-12338,-30356,-12354,-30350,-12369,-30343,-12385,-30337,-12400,-30331,-12416,-30324,-12431,-30318,-12447,-30312,-12462,-30305,-12478,-30299,-12493,-30292,-12509,-30286,-12524,-30280,-12540,-30273,-12555,-30267,-12571,-30260,-12586,-30254,-12602,-30248,-12617,-30241,-12633,-30235,-12648,-30228,-12664,-30222,-12679,-30215,-12695,-30209,-12710,-30202,-12725,-30196,-12741,-30189,-12756,-30183,-12772,-30176,-12787,-30170,-12803,-30163,-12818,-30157,-12833,-30150,-12849,-30143,-12864,-30137,-12880,-30130,-12895,-30124,-12910,-30117,-12926,-30110,-12941,-30104,-12957,-30097,-12972,-30091,-12987,-30084,-13003,-30077,-13018,-30071,-13034,-30064,-13049,-30057,-13064,-30051,-13080,-30044,-13095,-30037,-13110,-30031,-13126,-30024,-13141,-30017,-13156,-30010,-13172,-30004,-13187,-29997,-13202,-29990,-13218,-29984,-13233,-29977,-13248,-29970,-13264,-29963,-13279,-29956,-13294,-29950,-13310,-29943,-13325,-29936,-13340,-29929,-13356,-29922,-13371,-29916,-13386,-29909,-13401,-29902,-13417,-29895,-13432,-29888,-13447,-29881,-13463,-29874,-13478,-29867,-13493,-29861,-13508,-29854,-13524,-29847,-13539,-29840,-13554,-29833,-13569,-29826,-13585,-29819,-13600,-29812,-13615,-29805,-13630,-29798,-13646,-29791,-13661,-29784,-13676,-29777,-13691,-29770,-13707,-29763,-13722,-29756,-13737,-29749,-13752,-29742,-13767,-29735,-13783,-29728,-13798,-29721,-13813,-29714,-13828,-29707,-13843,-29700,-13859,-29693,-13874,-29686,-13889,-29679,-13904,-29671,-13919,-29664,-13934,-29657,-13950,-29650,-13965,-29643,-13980,-29636,-13995,-29629,-14010,-29622,-14025,-29614,-14040,-29607,-14056,-29600,-14071,-29593,-14086,-29586,-14101,-29578,-14116,-29571,-14131,-29564,-14146,-29557,-14161,-29549,-14177,-29542,-14192,-29535,-14207,-29528,-14222,-29520,-14237,-29513,-14252,-29506,-14267,-29499,-14282,-29491,-14297,-29484,-14312,-29477,-14327,-29469,-14343,-29462,-14358,-29455,-14373,-29447,-14388,-29440,-14403,-29433,-14418,-29425,-14433,-29418,-14448,-29411,-14463,-29403,-14478,-29396,-14493,-29388,-14508,-29381,-14523,-29373,-14538,-29366,-14553,-29359,-14568,-29351,-14583,-29344,-14598,-29336,-14613,-29329,-14628,-29321,-14643,-29314,-14658,-29306,-14673,-29299,-14688,-29291,-14703,-29284,-14718,-29276,-14733,-29269,-14748,-29261,-14763,-29254,-14778,-29246,-14793,-29239,-14808,-29231,-14823,-29223,-14838,-29216,-14853,-29208,-14867,-29201,-14882,-29193,-14897,-29185,-14912,-29178,-14927,-29170,-14942,-29163,-14957,-29155,-14972,-29147,-14987,-29140,-15002,-29132,-15017,-29124,-15031,-29117,-15046,-29109,-15061,-29101,-15076,-29093,-15091,-29086,-15106,-29078,-15121,-29070,-15136,-29063,-15150,-29055,-15165,-29047,-15180,-29039,-15195,-29032,-15210,-29024,-15225,-29016,-15239,-29008,-15254,-29000,-15269,-28993,-15284,-28985,-15299,-28977,-15314,-28969,-15328,-28961,-15343,-28954,-15358,-28946,-15373,-28938,-15388,-28930,-15402,-28922,-15417,-28914,-15432,-28906,-15447,-28898,-15462,-28891,-15476,-28883,-15491,-28875,-15506,-28867,-15521,-28859,-15535,-28851,-15550,-28843,-15565,-28835,-15580,-28827,-15594,-28819,-15609,-28811,-15624,-28803,-15639,-28795,-15653,-28787,-15668,-28779,-15683,-28771,-15697,-28763,-15712,-28755,-15727,-28747,-15741,-28739,-15756,-28731,-15771,-28723,-15786,-28715,-15800,-28707,-15815,-28699,-15830,-28691,-15844,-28682,-15859,-28674,-15874,-28666,-15888,-28658,-15903,-28650,-15918,-28642,-15932,-28634,-15947,-28626,-15961,-28617,-15976,-28609,-15991,-28601,-16005,-28593,-16020,-28585,-16035,-28576,-16049,-28568,-16064,-28560,-16078,-28552,-16093,-28544,-16108,-28535,-16122,-28527,-16137,-28519,-16151,-28511,-16166,-28502,-16180,-28494,-16195,-28486,-16210,-28478,-16224,-28469,-16239,-28461,-16253,-28453,-16268,-28444,-16282,-28436,-16297,-28428,-16311,-28419,-16326,-28411,-16340,-28403,-16355,-28394,-16369,-28386,-16384,-28378,-16399,-28369,-16413,-28361,-16428,-28352,-16442,-28344,-16456,-28336,-16471,-28327,-16485,-28319,-16500,-28310,-16514,-28302,-16529,-28293,-16543,-28285,-16558,-28276,-16572,-28268,-16587,-28260,-16601,-28251,-16616,-28243,-16630,-28234,-16644,-28226,-16659,-28217,-16673,-28209,-16688,-28200,-16702,-28191,-16717,-28183,-16731,-28174,-16745,-28166,-16760,-28157,-16774,-28149,-16789,-28140,-16803,-28132,-16817,-28123,-16832,-28114,-16846,-28106,-16860,-28097,-16875,-28088,-16889,-28080,-16904,-28071,-16918,-28063,-16932,-28054,-16947,-28045,-16961,-28037,-16975,-28028,-16990,-28019,-17004,-28010,-17018,-28002,-17033,-27993,-17047,-27984,-17061,-27976,-17075,-27967,-17090,-27958,-17104,-27949,-17118,-27941,-17133,-27932,-17147,-27923,-17161,-27914,-17175,-27906,-17190,-27897,-17204,-27888,-17218,-27879,-17233,-27870,-17247,-27862,-17261,-27853,-17275,-27844,-17289,-27835,-17304,-27826,-17318,-27817,-17332,-27809,-17346,-27800,-17361,-27791,-17375,-27782,-17389,-27773,-17403,-27764,-17417,-27755,-17432,-27746,-17446,-27737,-17460,-27729,-17474,-27720,-17488,-27711,-17502,-27702,-17517,-27693,-17531,-27684,-17545,-27675,-17559,-27666,-17573,-27657,-17587,-27648,-17601,-27639,-17616,-27630,-17630,-27621,-17644,-27612,-17658,-27603,-17672,-27594,-17686,-27585,-17700,-27576,-17714,-27567,-17728,-27558,-17743,-27549,-17757,-27539,-17771,-27530,-17785,-27521,-17799,-27512,-17813,-27503,-17827,-27494,-17841,-27485,-17855,-27476,-17869,-27467,-17883,-27457,-17897,-27448,-17911,-27439,-17925,-27430,-17939,-27421,-17953,-27412,-17967,-27402,-17981,-27393,-17995,-27384,-18009,-27375,-18023,-27366,-18037,-27356,-18051,-27347,-18065,-27338,-18079,-27329,-18093,-27320,-18107,-27310,-18121,-27301,-18135,-27292,-18149,-27282,-18163,-27273,-18177,-27264,-18191,-27255,-18205,-27245,-18219,-27236,-18233,-27227,-18247,-27217,-18261,-27208,-18274,-27199,-18288,-27189,-18302,-27180,-18316,-27171,-18330,-27161,-18344,-27152,-18358,-27142,-18372,-27133,-18386,-27124,-18399,-27114,-18413,-27105,-18427,-27095,-18441,-27086,-18455,-27077,-18469,-27067,-18483,-27058,-18496,-27048,-18510,-27039,-18524,-27029,-18538,-27020,-18552,-27010,-18565,-27001,-18579,-26991,-18593,-26982,-18607,-26972,-18621,-26963,-18634,-26953,-18648,-26944,-18662,-26934,-18676,-26925,-18690,-26915,-18703,-26906,-18717,-26896,-18731,-26886,-18745,-26877,-18758,-26867,-18772,-26858,-18786,-26848,-18799,-26838,-18813,-26829,-18827,-26819,-18841,-26810,-18854,-26800,-18868,-26790,-18882,-26781,-18895,-26771,-18909,-26761,-18923,-26752,-18936,-26742,-18950,-26732,-18964,-26723,-18977,-26713,-18991,-26703,-19005,-26693,-19018,-26684,-19032,-26674,-19046,-26664,-19059,-26655,-19073,-26645,-19087,-26635,-19100,-26625,-19114,-26616,-19127,-26606,-19141,-26596,-19155,-26586,-19168,-26576,-19182,-26567,-19195,-26557,-19209,-26547,-19222,-26537,-19236,-26527,-19250,-26517,-19263,-26508,-19277,-26498,-19290,-26488,-19304,-26478,-19317,-26468,-19331,-26458,-19344,-26448,-19358,-26438,-19371,-26429,-19385,-26419,-19398,-26409,-19412,-26399,-19425,-26389,-19439,-26379,-19452,-26369,-19466,-26359,-19479,-26349,-19493,-26339,-19506,-26329,-19520,-26319,-19533,-26309,-19547,-26299,-19560,-26289,-19574,-26279,-19587,-26269,-19600,-26259,-19614,-26249,-19627,-26239,-19641,-26229,-19654,-26219,-19668,-26209,-19681,-26199,-19694,-26189,-19708,-26179,-19721,-26169,-19734,-26159,-19748,-26149,-19761,-26138,-19775,-26128,-19788,-26118,-19801,-26108,-19815,-26098,-19828,-26088,-19841,-26078,-19855,-26068,-19868,-26057,-19881,-26047,-19895,-26037,-19908,-26027,-19921,-26017,-19934,-26007,-19948,-25996,-19961,-25986,-19974,-25976,-19988,-25966,-20001,-25955,-20014,-25945,-20027,-25935,-20041,-25925,-20054,-25914,-20067,-25904,-20080,-25894,-20094,-25884,-20107,-25873,-20120,-25863,-20133,-25853,-20147,-25843,-20160,-25832,-20173,-25822,-20186,-25812,-20199,-25801,-20213,-25791,-20226,-25781,-20239,-25770,-20252,-25760,-20265,-25750,-20278,-25739,-20292,-25729,-20305,-25718,-20318,-25708,-20331,-25698,-20344,-25687,-20357,-25677,-20370,-25666,-20384,-25656,-20397,-25646,-20410,-25635,-20423,-25625,-20436,-25614,-20449,-25604,-20462,-25593,-20475,-25583,-20488,-25572,-20501,-25562,-20514,-25551,-20528,-25541,-20541,-25530,-20554,-25520,-20567,-25509,-20580,-25499,-20593,-25488,-20606,-25478,-20619,-25467,-20632,-25457,-20645,-25446,-20658,-25436,-20671,-25425,-20684,-25415,-20697,-25404,-20710,-25393,-20723,-25383,-20736,-25372,-20749,-25362,-20762,-25351,-20775,-25340,-20788,-25330,-20801,-25319,-20814,-25308,-20826,-25298,-20839,-25287,-20852,-25277,-20865,-25266,-20878,-25255,-20891,-25244,-20904,-25234,-20917,-25223,-20930,-25212,-20943,-25202,-20956,-25191,-20968,-25180,-20981,-25170,-20994,-25159,-21007,-25148,-21020,-25137,-21033,-25127,-21046,-25116,-21058,-25105,-21071,-25094,-21084,-25084,-21097,-25073,-21110,-25062,-21123,-25051,-21135,-25040,-21148,-25030,-21161,-25019,-21174,-25008,-21187,-24997,-21199,-24986,-21212,-24975,-21225,-24965,-21238,-24954,-21250,-24943,-21263,-24932,-21276,-24921,-21289,-24910,-21301,-24899,-21314,-24888,-21327,-24878,-21340,-24867,-21352,-24856,-21365,-24845,-21378,-24834,-21390,-24823,-21403,-24812,-21416,-24801,-21428,-24790,-21441,-24779,-21454,-24768,-21466,-24757,-21479,-24746,-21492,-24735,-21504,-24724,-21517,-24713,-21530,-24702,-21542,-24691,-21555,-24680,-21567,-24669,-21580,-24658,-21593,-24647,-21605,-24636,-21618,-24625,-21630,-24614,-21643,-24603,-21656,-24592,-21668,-24581,-21681,-24570,-21693,-24559,-21706,-24547,-21718,-24536,-21731,-24525,-21744,-24514,-21756,-24503,-21769,-24492,-21781,-24481,-21794,-24470,-21806,-24458,-21819,-24447,-21831,-24436,-21844,-24425,-21856,-24414,-21869,-24403,-21881,-24391,-21894,-24380,-21906,-24369,-21918,-24358,-21931,-24347,-21943,-24335,-21956,-24324,-21968,-24313,-21981,-24302,-21993,-24290,-22005,-24279,-22018,-24268,-22030,-24257,-22043,-24245,-22055,-24234,-22067,-24223,-22080,-24212,-22092,-24200,-22105,-24189,-22117,-24178,-22129,-24166,-22142,-24155,-22154,-24144,-22166,-24132,-22179,-24121,-22191,-24110,-22203,-24098,-22216,-24087,-22228,-24076,-22240,-24064,-22253,-24053,-22265,-24042,-22277,-24030,-22289,-24019,-22302,-24007,-22314,-23996,-22326,-23985,-22339,-23973,-22351,-23962,-22363,-23950,-22375,-23939,-22388,-23927,-22400,-23916,-22412,-23904,-22424,-23893,-22436,-23882,-22449,-23870,-22461,-23859,-22473,-23847,-22485,-23836,-22497,-23824,-22510,-23813,-22522,-23801,-22534,-23790,-22546,-23778,-22558,-23767,-22570,-23755,-22583,-23743,-22595,-23732,-22607,-23720,-22619,-23709,-22631,-23697,-22643,-23686,-22655,-23674,-22667,-23662,-22679,-23651,-22692,-23639,-22704,-23628,-22716,-23616,-22728,-23604,-22740,-23593,-22752,-23581,-22764,-23570,-22776,-23558,-22788,-23546,-22800,-23535,-22812,-23523,-22824,-23511,-22836,-23500,-22848,-23488,-22860,-23476,-22872,-23465,-22884,-23453,-22896,-23441,-22908,-23429,-22920,-23418,-22932,-23406,-22944,-23394,-22956,-23383,-22968,-23371,-22980,-23359,-22992,-23347,-23004,-23336,-23016,-23324,-23028,-23312,-23040,-23300,-23051,-23288,-23063,-23277,-23075,-23265,-23087,-23253,-23099,-23241,-23111,-23229,-23123,-23218,-23135,-23206,-23147,-23194,-23158,-23182,-23170,-23170,-23182,-23158,-23194,-23147,-23206,-23135,-23218,-23123,-23229,-23111,-23241,-23099,-23253,-23087,-23265,-23075,-23277,-23063,-23288,-23051,-23300,-23040,-23312,-23028,-23324,-23016,-23336,-23004,-23347,-22992,-23359,-22980,-23371,-22968,-23383,-22956,-23394,-22944,-23406,-22932,-23418,-22920,-23429,-22908,-23441,-22896,-23453,-22884,-23465,-22872,-23476,-22860,-23488,-22848,-23500,-22836,-23511,-22824,-23523,-22812,-23535,-22800,-23546,-22788,-23558,-22776,-23570,-22764,-23581,-22752,-23593,-22740,-23604,-22728,-23616,-22716,-23628,-22704,-23639,-22692,-23651,-22679,-23662,-22667,-23674,-22655,-23686,-22643,-23697,-22631,-23709,-22619,-23720,-22607,-23732,-22595,-23743,-22583,-23755,-22570,-23767,-22558,-23778,-22546,-23790,-22534,-23801,-22522,-23813,-22510,-23824,-22497,-23836,-22485,-23847,-22473,-23859,-22461,-23870,-22449,-23882,-22436,-23893,-22424,-23904,-22412,-23916,-22400,-23927,-22388,-23939,-22375,-23950,-22363,-23962,-22351,-23973,-22339,-23985,-22326,-23996,-22314,-24007,-22302,-24019,-22289,-24030,-22277,-24042,-22265,-24053,-22253,-24064,-22240,-24076,-22228,-24087,-22216,-24098,-22203,-24110,-22191,-24121,-22179,-24132,-22166,-24144,-22154,-24155,-22142,-24166,-22129,-24178,-22117,-24189,-22105,-24200,-22092,-24212,-22080,-24223,-22067,-24234,-22055,-24245,-22043,-24257,-22030,-24268,-22018,-24279,-22005,-24290,-21993,-24302,-21981,-24313,-21968,-24324,-21956,-24335,-21943,-24347,-21931,-24358,-21918,-24369,-21906,-24380,-21894,-24391,-21881,-24403,-21869,-24414,-21856,-24425,-21844,-24436,-21831,-24447,-21819,-24458,-21806,-24470,-21794,-24481,-21781,-24492,-21769,-24503,-21756,-24514,-21744,-24525,-21731,-24536,-21718,-24547,-21706,-24559,-21693,-24570,-21681,-24581,-21668,-24592,-21656,-24603,-21643,-24614,-21630,-24625,-21618,-24636,-21605,-24647,-21593,-24658,-21580,-24669,-21567,-24680,-21555,-24691,-21542,-24702,-21530,-24713,-21517,-24724,-21504,-24735,-21492,-24746,-21479,-24757,-21466,-24768,-21454,-24779,-21441,-24790,-21428,-24801,-21416,-24812,-21403,-24823,-21390,-24834,-21378,-24845,-21365,-24856,-21352,-24867,-21340,-24878,-21327,-24888,-21314,-24899,-21301,-24910,-21289,-24921,-21276,-24932,-21263,-24943,-21250,-24954,-21238,-24965,-21225,-24975,-21212,-24986,-21199,-24997,-21187,-25008,-21174,-25019,-21161,-25030,-21148,-25040,-21135,-25051,-21123,-25062,-21110,-25073,-21097,-25084,-21084,-25094,-21071,-25105,-21058,-25116,-21046,-25127,-21033,-25137,-21020,-25148,-21007,-25159,-20994,-25170,-20981,-25180,-20968,-25191,-20956,-25202,-20943,-25212,-20930,-25223,-20917,-25234,-20904,-25244,-20891,-25255,-20878,-25266,-20865,-25277,-20852,-25287,-20839,-25298,-20826,-25308,-20814,-25319,-20801,-25330,-20788,-25340,-20775,-25351,-20762,-25362,-20749,-25372,-20736,-25383,-20723,-25393,-20710,-25404,-20697,-25415,-20684,-25425,-20671,-25436,-20658,-25446,-20645,-25457,-20632,-25467,-20619,-25478,-20606,-25488,-20593,-25499,-20580,-25509,-20567,-25520,-20554,-25530,-20541,-25541,-20528,-25551,-20514,-25562,-20501,-25572,-20488,-25583,-20475,-25593,-20462,-25604,-20449,-25614,-20436,-25625,-20423,-25635,-20410,-25646,-20397,-25656,-20384,-25666,-20370,-25677,-20357,-25687,-20344,-25698,-20331,-25708,-20318,-25718,-20305,-25729,-20292,-25739,-20278,-25750,-20265,-25760,-20252,-25770,-20239,-25781,-20226,-25791,-20213,-25801,-20199,-25812,-20186,-25822,-20173,-25832,-20160,-25843,-20147,-25853,-20133,-25863,-20120,-25873,-20107,-25884,-20094,-25894,-20080,-25904,-20067,-25914,-20054,-25925,-20041,-25935,-20027,-25945,-20014,-25955,-20001,-25966,-19988,-25976,-19974,-25986,-19961,-25996,-19948,-26007,-19934,-26017,-19921,-26027,-19908,-26037,-19895,-26047,-19881,-26057,-19868,-26068,-19855,-26078,-19841,-26088,-19828,-26098,-19815,-26108,-19801,-26118,-19788,-26128,-19775,-26138,-19761,-26149,-19748,-26159,-19734,-26169,-19721,-26179,-19708,-26189,-19694,-26199,-19681,-26209,-19668,-26219,-19654,-26229,-19641,-26239,-19627,-26249,-19614,-26259,-19600,-26269,-19587,-26279,-19574,-26289,-19560,-26299,-19547,-26309,-19533,-26319,-19520,-26329,-19506,-26339,-19493,-26349,-19479,-26359,-19466,-26369,-19452,-26379,-19439,-26389,-19425,-26399,-19412,-26409,-19398,-26419,-19385,-26429,-19371,-26438,-19358,-26448,-19344,-26458,-19331,-26468,-19317,-26478,-19304,-26488,-19290,-26498,-19277,-26508,-19263,-26517,-19250,-26527,-19236,-26537,-19222,-26547,-19209,-26557,-19195,-26567,-19182,-26576,-19168,-26586,-19155,-26596,-19141,-26606,-19127,-26616,-19114,-26625,-19100,-26635,-19087,-26645,-19073,-26655,-19059,-26664,-19046,-26674,-19032,-26684,-19018,-26693,-19005,-26703,-18991,-26713,-18977,-26723,-18964,-26732,-18950,-26742,-18936,-26752,-18923,-26761,-18909,-26771,-18895,-26781,-18882,-26790,-18868,-26800,-18854,-26810,-18841,-26819,-18827,-26829,-18813,-26838,-18799,-26848,-18786,-26858,-18772,-26867,-18758,-26877,-18745,-26886,-18731,-26896,-18717,-26906,-18703,-26915,-18690,-26925,-18676,-26934,-18662,-26944,-18648,-26953,-18634,-26963,-18621,-26972,-18607,-26982,-18593,-26991,-18579,-27001,-18565,-27010,-18552,-27020,-18538,-27029,-18524,-27039,-18510,-27048,-18496,-27058,-18483,-27067,-18469,-27077,-18455,-27086,-18441,-27095,-18427,-27105,-18413,-27114,-18399,-27124,-18386,-27133,-18372,-27142,-18358,-27152,-18344,-27161,-18330,-27171,-18316,-27180,-18302,-27189,-18288,-27199,-18274,-27208,-18261,-27217,-18247,-27227,-18233,-27236,-18219,-27245,-18205,-27255,-18191,-27264,-18177,-27273,-18163,-27282,-18149,-27292,-18135,-27301,-18121,-27310,-18107,-27320,-18093,-27329,-18079,-27338,-18065,-27347,-18051,-27356,-18037,-27366,-18023,-27375,-18009,-27384,-17995,-27393,-17981,-27402,-17967,-27412,-17953,-27421,-17939,-27430,-17925,-27439,-17911,-27448,-17897,-27457,-17883,-27467,-17869,-27476,-17855,-27485,-17841,-27494,-17827,-27503,-17813,-27512,-17799,-27521,-17785,-27530,-17771,-27539,-17757,-27549,-17743,-27558,-17728,-27567,-17714,-27576,-17700,-27585,-17686,-27594,-17672,-27603,-17658,-27612,-17644,-27621,-17630,-27630,-17616,-27639,-17601,-27648,-17587,-27657,-17573,-27666,-17559,-27675,-17545,-27684,-17531,-27693,-17517,-27702,-17502,-27711,-17488,-27720,-17474,-27729,-17460,-27737,-17446,-27746,-17432,-27755,-17417,-27764,-17403,-27773,-17389,-27782,-17375,-27791,-17361,-27800,-17346,-27809,-17332,-27817,-17318,-27826,-17304,-27835,-17289,-27844,-17275,-27853,-17261,-27862,-17247,-27870,-17233,-27879,-17218,-27888,-17204,-27897,-17190,-27906,-17175,-27914,-17161,-27923,-17147,-27932,-17133,-27941,-17118,-27949,-17104,-27958,-17090,-27967,-17075,-27976,-17061,-27984,-17047,-27993,-17033,-28002,-17018,-28010,-17004,-28019,-16990,-28028,-16975,-28037,-16961,-28045,-16947,-28054,-16932,-28063,-16918,-28071,-16904,-28080,-16889,-28088,-16875,-28097,-16860,-28106,-16846,-28114,-16832,-28123,-16817,-28132,-16803,-28140,-16789,-28149,-16774,-28157,-16760,-28166,-16745,-28174,-16731,-28183,-16717,-28191,-16702,-28200,-16688,-28209,-16673,-28217,-16659,-28226,-16644,-28234,-16630,-28243,-16616,-28251,-16601,-28260,-16587,-28268,-16572,-28276,-16558,-28285,-16543,-28293,-16529,-28302,-16514,-28310,-16500,-28319,-16485,-28327,-16471,-28336,-16456,-28344,-16442,-28352,-16428,-28361,-16413,-28369,-16399,-28378,-16384,-28386,-16369,-28394,-16355,-28403,-16340,-28411,-16326,-28419,-16311,-28428,-16297,-28436,-16282,-28444,-16268,-28453,-16253,-28461,-16239,-28469,-16224,-28478,-16210,-28486,-16195,-28494,-16180,-28502,-16166,-28511,-16151,-28519,-16137,-28527,-16122,-28535,-16108,-28544,-16093,-28552,-16078,-28560,-16064,-28568,-16049,-28576,-16035,-28585,-16020,-28593,-16005,-28601,-15991,-28609,-15976,-28617,-15961,-28626,-15947,-28634,-15932,-28642,-15918,-28650,-15903,-28658,-15888,-28666,-15874,-28674,-15859,-28682,-15844,-28691,-15830,-28699,-15815,-28707,-15800,-28715,-15786,-28723,-15771,-28731,-15756,-28739,-15741,-28747,-15727,-28755,-15712,-28763,-15697,-28771,-15683,-28779,-15668,-28787,-15653,-28795,-15639,-28803,-15624,-28811,-15609,-28819,-15594,-28827,-15580,-28835,-15565,-28843,-15550,-28851,-15535,-28859,-15521,-28867,-15506,-28875,-15491,-28883,-15476,-28891,-15462,-28898,-15447,-28906,-15432,-28914,-15417,-28922,-15402,-28930,-15388,-28938,-15373,-28946,-15358,-28954,-15343,-28961,-15328,-28969,-15314,-28977,-15299,-28985,-15284,-28993,-15269,-29000,-15254,-29008,-15239,-29016,-15225,-29024,-15210,-29032,-15195,-29039,-15180,-29047,-15165,-29055,-15150,-29063,-15136,-29070,-15121,-29078,-15106,-29086,-15091,-29093,-15076,-29101,-15061,-29109,-15046,-29117,-15031,-29124,-15017,-29132,-15002,-29140,-14987,-29147,-14972,-29155,-14957,-29163,-14942,-29170,-14927,-29178,-14912,-29185,-14897,-29193,-14882,-29201,-14867,-29208,-14853,-29216,-14838,-29223,-14823,-29231,-14808,-29239,-14793,-29246,-14778,-29254,-14763,-29261,-14748,-29269,-14733,-29276,-14718,-29284,-14703,-29291,-14688,-29299,-14673,-29306,-14658,-29314,-14643,-29321,-14628,-29329,-14613,-29336,-14598,-29344,-14583,-29351,-14568,-29359,-14553,-29366,-14538,-29373,-14523,-29381,-14508,-29388,-14493,-29396,-14478,-29403,-14463,-29411,-14448,-29418,-14433,-29425,-14418,-29433,-14403,-29440,-14388,-29447,-14373,-29455,-14358,-29462,-14343,-29469,-14327,-29477,-14312,-29484,-14297,-29491,-14282,-29499,-14267,-29506,-14252,-29513,-14237,-29520,-14222,-29528,-14207,-29535,-14192,-29542,-14177,-29549,-14161,-29557,-14146,-29564,-14131,-29571,-14116,-29578,-14101,-29586,-14086,-29593,-14071,-29600,-14056,-29607,-14040,-29614,-14025,-29622,-14010,-29629,-13995,-29636,-13980,-29643,-13965,-29650,-13950,-29657,-13934,-29664,-13919,-29671,-13904,-29679,-13889,-29686,-13874,-29693,-13859,-29700,-13843,-29707,-13828,-29714,-13813,-29721,-13798,-29728,-13783,-29735,-13767,-29742,-13752,-29749,-13737,-29756,-13722,-29763,-13707,-29770,-13691,-29777,-13676,-29784,-13661,-29791,-13646,-29798,-13630,-29805,-13615,-29812,-13600,-29819,-13585,-29826,-13569,-29833,-13554,-29840,-13539,-29847,-13524,-29854,-13508,-29861,-13493,-29867,-13478,-29874,-13463,-29881,-13447,-29888,-13432,-29895,-13417,-29902,-13401,-29909,-13386,-29916,-13371,-29922,-13356,-29929,-13340,-29936,-13325,-29943,-13310,-29950,-13294,-29956,-13279,-29963,-13264,-29970,-13248,-29977,-13233,-29984,-13218,-29990,-13202,-29997,-13187,-30004,-13172,-30010,-13156,-30017,-13141,-30024,-13126,-30031,-13110,-30037,-13095,-30044,-13080,-30051,-13064,-30057,-13049,-30064,-13034,-30071,-13018,-30077,-13003,-30084,-12987,-30091,-12972,-30097,-12957,-30104,-12941,-30110,-12926,-30117,-12910,-30124,-12895,-30130,-12880,-30137,-12864,-30143,-12849,-30150,-12833,-30157,-12818,-30163,-12803,-30170,-12787,-30176,-12772,-30183,-12756,-30189,-12741,-30196,-12725,-30202,-12710,-30209,-12695,-30215,-12679,-30222,-12664,-30228,-12648,-30235,-12633,-30241,-12617,-30248,-12602,-30254,-12586,-30260,-12571,-30267,-12555,-30273,-12540,-30280,-12524,-30286,-12509,-30292,-12493,-30299,-12478,-30305,-12462,-30312,-12447,-30318,-12431,-30324,-12416,-30331,-12400,-30337,-12385,-30343,-12369,-30350,-12354,-30356,-12338,-30362,-12323,-30369,-12307,-30375,-12292,-30381,-12276,-30387,-12261,-30394,-12245,-30400,-12230,-30406,-12214,-30412,-12199,-30419,-12183,-30425,-12167,-30431,-12152,-30437,-12136,-30443,-12121,-30450,-12105,-30456,-12090,-30462,-12074,-30468,-12058,-30474,-12043,-30481,-12027,-30487,-12012,-30493,-11996,-30499,-11981,-30505,-11965,-30511,-11949,-30517,-11934,-30523,-11918,-30529,-11903,-30536,-11887,-30542,-11871,-30548,-11856,-30554,-11840,-30560,-11824,-30566,-11809,-30572,-11793,-30578,-11778,-30584,-11762,-30590,-11746,-30596,-11731,-30602,-11715,-30608,-11699,-30614,-11684,-30620,-11668,-30626,-11652,-30632,-11637,-30638,-11621,-30644,-11605,-30650,-11590,-30656,-11574,-30661,-11558,-30667,-11543,-30673,-11527,-30679,-11511,-30685,-11496,-30691,-11480,-30697,-11464,-30703,-11449,-30708,-11433,-30714,-11417,-30720,-11401,-30726,-11386,-30732,-11370,-30738,-11354,-30743,-11339,-30749,-11323,-30755,-11307,-30761,-11291,-30767,-11276,-30772,-11260,-30778,-11244,-30784,-11228,-30789,-11213,-30795,-11197,-30801,-11181,-30807,-11165,-30812,-11150,-30818,-11134,-30824,-11118,-30829,-11102,-30835,-11087,-30841,-11071,-30846,-11055,-30852,-11039,-30858,-11024,-30863,-11008,-30869,-10992,-30875,-10976,-30880,-10960,-30886,-10945,-30891,-10929,-30897,-10913,-30903,-10897,-30908,-10881,-30914,-10866,-30919,-10850,-30925,-10834,-30930,-10818,-30936,-10802,-30941,-10787,-30947,-10771,-30952,-10755,-30958,-10739,-30963,-10723,-30969,-10707,-30974,-10692,-30980,-10676,-30985,-10660,-30991,-10644,-30996,-10628,-31002,-10612,-31007,-10597,-31012,-10581,-31018,-10565,-31023,-10549,-31029,-10533,-31034,-10517,-31039,-10501,-31045,-10485,-31050,-10470,-31055,-10454,-31061,-10438,-31066,-10422,-31071,-10406,-31077,-10390,-31082,-10374,-31087,-10358,-31093,-10343,-31098,-10327,-31103,-10311,-31108,-10295,-31114,-10279,-31119,-10263,-31124,-10247,-31129,-10231,-31135,-10215,-31140,-10199,-31145,-10183,-31150,-10167,-31155,-10152,-31161,-10136,-31166,-10120,-31171,-10104,-31176,-10088,-31181,-10072,-31186,-10056,-31192,-10040,-31197,-10024,-31202,-10008,-31207,-9992,-31212,-9976,-31217,-9960,-31222,-9944,-31227,-9928,-31232,-9912,-31237,-9896,-31243,-9880,-31248,-9864,-31253,-9848,-31258,-9832,-31263,-9816,-31268,-9800,-31273,-9784,-31278,-9768,-31283,-9752,-31288,-9736,-31293,-9720,-31298,-9704,-31303,-9688,-31308,-9672,-31312,-9656,-31317,-9640,-31322,-9624,-31327,-9608,-31332,-9592,-31337,-9576,-31342,-9560,-31347,-9544,-31352,-9528,-31357,-9512,-31361,-9496,-31366,-9480,-31371,-9464,-31376,-9448,-31381,-9432,-31386,-9416,-31390,-9400,-31395,-9384,-31400,-9368,-31405,-9352,-31410,-9336,-31414,-9320,-31419,-9304,-31424,-9288,-31429,-9271,-31433,-9255,-31438,-9239,-31443,-9223,-31447,-9207,-31452,-9191,-31457,-9175,-31462,-9159,-31466,-9143,-31471,-9127,-31476,-9111,-31480,-9095,-31485,-9078,-31490,-9062,-31494,-9046,-31499,-9030,-31503,-9014,-31508,-8998,-31513,-8982,-31517,-8966,-31522,-8950,-31526,-8933,-31531,-8917,-31535,-8901,-31540,-8885,-31545,-8869,-31549,-8853,-31554,-8837,-31558,-8821,-31563,-8804,-31567,-8788,-31572,-8772,-31576,-8756,-31581,-8740,-31585,-8724,-31589,-8708,-31594,-8691,-31598,-8675,-31603,-8659,-31607,-8643,-31612,-8627,-31616,-8611,-31620,-8594,-31625,-8578,-31629,-8562,-31634,-8546,-31638,-8530,-31642,-8514,-31647,-8497,-31651,-8481,-31655,-8465,-31660,-8449,-31664,-8433,-31668,-8416,-31673,-8400,-31677,-8384,-31681,-8368,-31685,-8352,-31690,-8335,-31694,-8319,-31698,-8303,-31702,-8287,-31707,-8271,-31711,-8254,-31715,-8238,-31719,-8222,-31724,-8206,-31728,-8190,-31732,-8173,-31736,-8157,-31740,-8141,-31744,-8125,-31749,-8108,-31753,-8092,-31757,-8076,-31761,-8060,-31765,-8043,-31769,-8027,-31773,-8011,-31777,-7995,-31781,-7978,-31786,-7962,-31790,-7946,-31794,-7930,-31798,-7913,-31802,-7897,-31806,-7881,-31810,-7865,-31814,-7848,-31818,-7832,-31822,-7816,-31826,-7800,-31830,-7783,-31834,-7767,-31838,-7751,-31842,-7734,-31846,-7718,-31850,-7702,-31854,-7686,-31857,-7669,-31861,-7653,-31865,-7637,-31869,-7620,-31873,-7604,-31877,-7588,-31881,-7572,-31885,-7555,-31889,-7539,-31892,-7523,-31896,-7506,-31900,-7490,-31904,-7474,-31908,-7457,-31912,-7441,-31915,-7425,-31919,-7408,-31923,-7392,-31927,-7376,-31930,-7359,-31934,-7343,-31938,-7327,-31942,-7311,-31945,-7294,-31949,-7278,-31953,-7262,-31957,-7245,-31960,-7229,-31964,-7212,-31968,-7196,-31971,-7180,-31975,-7163,-31979,-7147,-31982,-7131,-31986,-7114,-31990,-7098,-31993,-7082,-31997,-7065,-32000,-7049,-32004,-7033,-32008,-7016,-32011,-7000,-32015,-6983,-32018,-6967,-32022,-6951,-32025,-6934,-32029,-6918,-32033,-6902,-32036,-6885,-32040,-6869,-32043,-6852,-32047,-6836,-32050,-6820,-32054,-6803,-32057,-6787,-32060,-6771,-32064,-6754,-32067,-6738,-32071,-6721,-32074,-6705,-32078,-6689,-32081,-6672,-32085,-6656,-32088,-6639,-32091,-6623,-32095,-6607,-32098,-6590,-32101,-6574,-32105,-6557,-32108,-6541,-32111,-6524,-32115,-6508,-32118,-6492,-32121,-6475,-32125,-6459,-32128,-6442,-32131,-6426,-32135,-6409,-32138,-6393,-32141,-6377,-32144,-6360,-32148,-6344,-32151,-6327,-32154,-6311,-32157,-6294,-32161,-6278,-32164,-6262,-32167,-6245,-32170,-6229,-32173,-6212,-32177,-6196,-32180,-6179,-32183,-6163,-32186,-6146,-32189,-6130,-32192,-6113,-32195,-6097,-32198,-6081,-32202,-6064,-32205,-6048,-32208,-6031,-32211,-6015,-32214,-5998,-32217,-5982,-32220,-5965,-32223,-5949,-32226,-5932,-32229,-5916,-32232,-5899,-32235,-5883,-32238,-5866,-32241,-5850,-32244,-5833,-32247,-5817,-32250,-5800,-32253,-5784,-32256,-5767,-32259,-5751,-32262,-5734,-32265,-5718,-32268,-5701,-32271,-5685,-32274,-5668,-32276,-5652,-32279,-5635,-32282,-5619,-32285,-5602,-32288,-5586,-32291,-5569,-32294,-5553,-32296,-5536,-32299,-5520,-32302,-5503,-32305,-5487,-32308,-5470,-32311,-5454,-32313,-5437,-32316,-5421,-32319,-5404,-32322,-5388,-32324,-5371,-32327,-5355,-32330,-5338,-32333,-5322,-32335,-5305,-32338,-5288,-32341,-5272,-32343,-5255,-32346,-5239,-32349,-5222,-32351,-5206,-32354,-5189,-32357,-5173,-32359,-5156,-32362,-5140,-32365,-5123,-32367,-5107,-32370,-5090,-32372,-5073,-32375,-5057,-32378,-5040,-32380,-5024,-32383,-5007,-32385,-4991,-32388,-4974,-32390,-4958,-32393,-4941,-32395,-4924,-32398,-4908,-32400,-4891,-32403,-4875,-32405,-4858,-32408,-4842,-32410,-4825,-32413,-4808,-32415,-4792,-32418,-4775,-32420,-4759,-32423,-4742,-32425,-4726,-32427,-4709,-32430,-4692,-32432,-4676,-32435,-4659,-32437,-4643,-32439,-4626,-32442,-4609,-32444,-4593,-32446,-4576,-32449,-4560,-32451,-4543,-32453,-4526,-32456,-4510,-32458,-4493,-32460,-4477,-32463,-4460,-32465,-4444,-32467,-4427,-32469,-4410,-32472,-4394,-32474,-4377,-32476,-4360,-32478,-4344,-32481,-4327,-32483,-4311,-32485,-4294,-32487,-4277,-32489,-4261,-32492,-4244,-32494,-4228,-32496,-4211,-32498,-4194,-32500,-4178,-32502,-4161,-32504,-4145,-32507,-4128,-32509,-4111,-32511,-4095,-32513,-4078,-32515,-4061,-32517,-4045,-32519,-4028,-32521,-4012,-32523,-3995,-32525,-3978,-32527,-3962,-32529,-3945,-32531,-3928,-32533,-3912,-32535,-3895,-32537,-3878,-32539,-3862,-32541,-3845,-32543,-3829,-32545,-3812,-32547,-3795,-32549,-3779,-32551,-3762,-32553,-3745,-32555,-3729,-32557,-3712,-32559,-3695,-32560,-3679,-32562,-3662,-32564,-3645,-32566,-3629,-32568,-3612,-32570,-3595,-32572,-3579,-32573,-3562,-32575,-3546,-32577,-3529,-32579,-3512,-32581,-3496,-32582,-3479,-32584,-3462,-32586,-3446,-32588,-3429,-32589,-3412,-32591,-3396,-32593,-3379,-32595,-3362,-32596,-3346,-32598,-3329,-32600,-3312,-32601,-3296,-32603,-3279,-32605,-3262,-32606,-3246,-32608,-3229,-32610,-3212,-32611,-3196,-32613,-3179,-32615,-3162,-32616,-3146,-32618,-3129,-32619,-3112,-32621,-3095,-32623,-3079,-32624,-3062,-32626,-3045,-32627,-3029,-32629,-3012,-32630,-2995,-32632,-2979,-32633,-2962,-32635,-2945,-32636,-2929,-32638,-2912,-32639,-2895,-32641,-2879,-32642,-2862,-32644,-2845,-32645,-2829,-32647,-2812,-32648,-2795,-32650,-2778,-32651,-2762,-32652,-2745,-32654,-2728,-32655,-2712,-32657,-2695,-32658,-2678,-32659,-2662,-32661,-2645,-32662,-2628,-32663,-2611,-32665,-2595,-32666,-2578,-32667,-2561,-32669,-2545,-32670,-2528,-32671,-2511,-32672,-2495,-32674,-2478,-32675,-2461,-32676,-2444,-32677,-2428,-32679,-2411,-32680,-2394,-32681,-2378,-32682,-2361,-32684,-2344,-32685,-2327,-32686,-2311,-32687,-2294,-32688,-2277,-32689,-2261,-32691,-2244,-32692,-2227,-32693,-2210,-32694,-2194,-32695,-2177,-32696,-2160,-32697,-2144,-32698,-2127,-32700,-2110,-32701,-2093,-32702,-2077,-32703,-2060,-32704,-2043,-32705,-2027,-32706,-2010,-32707,-1993,-32708,-1976,-32709,-1960,-32710,-1943,-32711,-1926,-32712,-1909,-32713,-1893,-32714,-1876,-32715,-1859,-32716,-1843,-32717,-1826,-32718,-1809,-32718,-1792,-32719,-1776,-32720,-1759,-32721,-1742,-32722,-1725,-32723,-1709,-32724,-1692,-32725,-1675,-32726,-1659,-32726,-1642,-32727,-1625,-32728,-1608,-32729,-1592,-32730,-1575,-32730,-1558,-32731,-1541,-32732,-1525,-32733,-1508,-32734,-1491,-32734,-1474,-32735,-1458,-32736,-1441,-32737,-1424,-32737,-1407,-32738,-1391,-32739,-1374,-32739,-1357,-32740,-1340,-32741,-1324,-32741,-1307,-32742,-1290,-32743,-1274,-32743,-1257,-32744,-1240,-32745,-1223,-32745,-1207,-32746,-1190,-32747,-1173,-32747,-1156,-32748,-1140,-32748,-1123,-32749,-1106,-32749,-1089,-32750,-1073,-32751,-1056,-32751,-1039,-32752,-1022,-32752,-1006,-32753,-989,-32753,-972,-32754,-955,-32754,-939,-32755,-922,-32755,-905,-32755,-888,-32756,-872,-32756,-855,-32757,-838,-32757,-821,-32758,-805,-32758,-788,-32758,-771,-32759,-754,-32759,-738,-32760,-721,-32760,-704,-32760,-687,-32761,-671,-32761,-654,-32761,-637,-32762,-620,-32762,-604,-32762,-587,-32763,-570,-32763,-553,-32763,-537,-32763,-520,-32764,-503,-32764,-486,-32764,-470,-32764,-453,-32765,-436,-32765,-419,-32765,-403,-32765,-386,-32765,-369,-32766,-352,-32766,-336,-32766,-319,-32766,-302,-32766,-285,-32766,-269,-32767,-252,-32767,-235,-32767,-218,-32767,-202,-32767,-185,-32767,-168,-32767,-151,-32767,-135,-32767,-118,-32767,-101,-32767,-84,-32767,-68,-32767,-51,-32767,-34,-32767,-17,-32767,-1,-32767,16,-32767,33,-32767,50,-32767,67,-32767,83,-32767,100,-32767,117,-32767,134,-32767,150,-32767,167,-32767,184,-32767,201,-32767,217,-32767,234,-32767,251,-32766,268,-32766,284,-32766,301,-32766,318,-32766,335,-32766,351,-32765,368,-32765,385,-32765,402,-32765,418,-32765,435,-32764,452,-32764,469,-32764,485,-32764,502,-32763,519,-32763,536,-32763,552,-32763,569,-32762,586,-32762,603,-32762,619,-32761,636,-32761,653,-32761,670,-32760,686,-32760,703,-32760,720,-32759,737,-32759,753,-32758,770,-32758,787,-32758,804,-32757,820,-32757,837,-32756,854,-32756,871,-32755,887,-32755,904,-32755,921,-32754,938,-32754,954,-32753,971,-32753,988,-32752,1005,-32752,1021,-32751,1038,-32751,1055,-32750,1072,-32749,1088,-32749,1105,-32748,1122,-32748,1139,-32747,1155,-32747,1172,-32746,1189,-32745,1206,-32745,1222,-32744,1239,-32743,1256,-32743,1273,-32742,1289,-32741,1306,-32741,1323,-32740,1339,-32739,1356,-32739,1373,-32738,1390,-32737,1406,-32737,1423,-32736,1440,-32735,1457,-32734,1473,-32734,1490,-32733,1507,-32732,1524,-32731,1540,-32730,1557,-32730,1574,-32729,1591,-32728,1607,-32727,1624,-32726,1641,-32726,1658,-32725,1674,-32724,1691,-32723,1708,-32722,1724,-32721,1741,-32720,1758,-32719,1775,-32718,1791,-32718,1808,-32717,1825,-32716,1842,-32715,1858,-32714,1875,-32713,1892,-32712,1908,-32711,1925,-32710,1942,-32709,1959,-32708,1975,-32707,1992,-32706,2009,-32705,2026,-32704,2042,-32703,2059,-32702,2076,-32701,2092,-32700,2109,-32698,2126,-32697,2143,-32696,2159,-32695,2176,-32694,2193,-32693,2209,-32692,2226,-32691,2243,-32689,2260,-32688,2276,-32687,2293,-32686,2310,-32685,2326,-32684,2343,-32682,2360,-32681,2377,-32680,2393,-32679,2410,-32677,2427,-32676,2443,-32675,2460,-32674,2477,-32672,2494,-32671,2510,-32670,2527,-32669,2544,-32667,2560,-32666,2577,-32665,2594,-32663,2610,-32662,2627,-32661,2644,-32659,2661,-32658,2677,-32657,2694,-32655,2711,-32654,2727,-32652,2744,-32651,2761,-32650,2777,-32648,2794,-32647,2811,-32645,2828,-32644,2844,-32642,2861,-32641,2878,-32639,2894,-32638,2911,-32636,2928,-32635,2944,-32633,2961,-32632,2978,-32630,2994,-32629,3011,-32627,3028,-32626,3044,-32624,3061,-32623,3078,-32621,3094,-32619,3111,-32618,3128,-32616,3145,-32615,3161,-32613,3178,-32611,3195,-32610,3211,-32608,3228,-32606,3245,-32605,3261,-32603,3278,-32601,3295,-32600,3311,-32598,3328,-32596,3345,-32595,3361,-32593,3378,-32591,3395,-32589,3411,-32588,3428,-32586,3445,-32584,3461,-32582,3478,-32581,3495,-32579,3511,-32577,3528,-32575,3545,-32573,3561,-32572,3578,-32570,3594,-32568,3611,-32566,3628,-32564,3644,-32562,3661,-32560,3678,-32559,3694,-32557,3711,-32555,3728,-32553,3744,-32551,3761,-32549,3778,-32547,3794,-32545,3811,-32543,3828,-32541,3844,-32539,3861,-32537,3877,-32535,3894,-32533,3911,-32531,3927,-32529,3944,-32527,3961,-32525,3977,-32523,3994,-32521,4011,-32519,4027,-32517,4044,-32515,4060,-32513,4077,-32511,4094,-32509,4110,-32507,4127,-32504,4144,-32502,4160,-32500,4177,-32498,4193,-32496,4210,-32494,4227,-32492,4243,-32489,4260,-32487,4276,-32485,4293,-32483,4310,-32481,4326,-32478,4343,-32476,4359,-32474,4376,-32472,4393,-32469,4409,-32467,4426,-32465,4443,-32463,4459,-32460,4476,-32458,4492,-32456,4509,-32453,4525,-32451,4542,-32449,4559,-32446,4575,-32444,4592,-32442,4608,-32439,4625,-32437,4642,-32435,4658,-32432,4675,-32430,4691,-32427,4708,-32425,4725,-32423,4741,-32420,4758,-32418,4774,-32415,4791,-32413,4807,-32410,4824,-32408,4841,-32405,4857,-32403,4874,-32400,4890,-32398,4907,-32395,4923,-32393,4940,-32390,4957,-32388,4973,-32385,4990,-32383,5006,-32380,5023,-32378,5039,-32375,5056,-32372,5072,-32370,5089,-32367,5106,-32365,5122,-32362,5139,-32359,5155,-32357,5172,-32354,5188,-32351,5205,-32349,5221,-32346,5238,-32343,5254,-32341,5271,-32338,5287,-32335,5304,-32333,5321,-32330,5337,-32327,5354,-32324,5370,-32322,5387,-32319,5403,-32316,5420,-32313,5436,-32311,5453,-32308,5469,-32305,5486,-32302,5502,-32299,5519,-32296,5535,-32294,5552,-32291,5568,-32288,5585,-32285,5601,-32282,5618,-32279,5634,-32276,5651,-32274,5667,-32271,5684,-32268,5700,-32265,5717,-32262,5733,-32259,5750,-32256,5766,-32253,5783,-32250,5799,-32247,5816,-32244,5832,-32241,5849,-32238,5865,-32235,5882,-32232,5898,-32229,5915,-32226,5931,-32223,5948,-32220,5964,-32217,5981,-32214,5997,-32211,6014,-32208,6030,-32205,6047,-32202,6063,-32198,6080,-32195,6096,-32192,6112,-32189,6129,-32186,6145,-32183,6162,-32180,6178,-32177,6195,-32173,6211,-32170,6228,-32167,6244,-32164,6261,-32161,6277,-32157,6293,-32154,6310,-32151,6326,-32148,6343,-32144,6359,-32141,6376,-32138,6392,-32135,6408,-32131,6425,-32128,6441,-32125,6458,-32121,6474,-32118,6491,-32115,6507,-32111,6523,-32108,6540,-32105,6556,-32101,6573,-32098,6589,-32095,6606,-32091,6622,-32088,6638,-32085,6655,-32081,6671,-32078,6688,-32074,6704,-32071,6720,-32067,6737,-32064,6753,-32060,6770,-32057,6786,-32054,6802,-32050,6819,-32047,6835,-32043,6851,-32040,6868,-32036,6884,-32033,6901,-32029,6917,-32025,6933,-32022,6950,-32018,6966,-32015,6982,-32011,6999,-32008,7015,-32004,7032,-32000,7048,-31997,7064,-31993,7081,-31990,7097,-31986,7113,-31982,7130,-31979,7146,-31975,7162,-31971,7179,-31968,7195,-31964,7211,-31960,7228,-31957,7244,-31953,7261,-31949,7277,-31945,7293,-31942,7310,-31938,7326,-31934,7342,-31930,7358,-31927,7375,-31923,7391,-31919,7407,-31915,7424,-31912,7440,-31908,7456,-31904,7473,-31900,7489,-31896,7505,-31892,7522,-31889,7538,-31885,7554,-31881,7571,-31877,7587,-31873,7603,-31869,7619,-31865,7636,-31861,7652,-31857,7668,-31854,7685,-31850,7701,-31846,7717,-31842,7733,-31838,7750,-31834,7766,-31830,7782,-31826,7799,-31822,7815,-31818,7831,-31814,7847,-31810,7864,-31806,7880,-31802,7896,-31798,7912,-31794,7929,-31790,7945,-31786,7961,-31781,7977,-31777,7994,-31773,8010,-31769,8026,-31765,8042,-31761,8059,-31757,8075,-31753,8091,-31749,8107,-31744,8124,-31740,8140,-31736,8156,-31732,8172,-31728,8189,-31724,8205,-31719,8221,-31715,8237,-31711,8253,-31707,8270,-31702,8286,-31698,8302,-31694,8318,-31690,8334,-31685,8351,-31681,8367,-31677,8383,-31673,8399,-31668,8415,-31664,8432,-31660,8448,-31655,8464,-31651,8480,-31647,8496,-31642,8513,-31638,8529,-31634,8545,-31629,8561,-31625,8577,-31620,8593,-31616,8610,-31612,8626,-31607,8642,-31603,8658,-31598,8674,-31594,8690,-31589,8707,-31585,8723,-31581,8739,-31576,8755,-31572,8771,-31567,8787,-31563,8803,-31558,8820,-31554,8836,-31549,8852,-31545,8868,-31540,8884,-31535,8900,-31531,8916,-31526,8932,-31522,8949,-31517,8965,-31513,8981,-31508,8997,-31503,9013,-31499,9029,-31494,9045,-31490,9061,-31485,9077,-31480,9094,-31476,9110,-31471,9126,-31466,9142,-31462,9158,-31457,9174,-31452,9190,-31447,9206,-31443,9222,-31438,9238,-31433,9254,-31429,9270,-31424,9287,-31419,9303,-31414,9319,-31410,9335,-31405,9351,-31400,9367,-31395,9383,-31390,9399,-31386,9415,-31381,9431,-31376,9447,-31371,9463,-31366,9479,-31361,9495,-31357,9511,-31352,9527,-31347,9543,-31342,9559,-31337,9575,-31332,9591,-31327,9607,-31322,9623,-31317,9639,-31312,9655,-31308,9671,-31303,9687,-31298,9703,-31293,9719,-31288,9735,-31283,9751,-31278,9767,-31273,9783,-31268,9799,-31263,9815,-31258,9831,-31253,9847,-31248,9863,-31243,9879,-31237,9895,-31232,9911,-31227,9927,-31222,9943,-31217,9959,-31212,9975,-31207,9991,-31202,10007,-31197,10023,-31192,10039,-31186,10055,-31181,10071,-31176,10087,-31171,10103,-31166,10119,-31161,10135,-31155,10151,-31150,10166,-31145,10182,-31140,10198,-31135,10214,-31129,10230,-31124,10246,-31119,10262,-31114,10278,-31108,10294,-31103,10310,-31098,10326,-31093,10342,-31087,10357,-31082,10373,-31077,10389,-31071,10405,-31066,10421,-31061,10437,-31055,10453,-31050,10469,-31045,10484,-31039,10500,-31034,10516,-31029,10532,-31023,10548,-31018,10564,-31012,10580,-31007,10596,-31002,10611,-30996,10627,-30991,10643,-30985,10659,-30980,10675,-30974,10691,-30969,10706,-30963,10722,-30958,10738,-30952,10754,-30947,10770,-30941,10786,-30936,10801,-30930,10817,-30925,10833,-30919,10849,-30914,10865,-30908,10880,-30903,10896,-30897,10912,-30891,10928,-30886,10944,-30880,10959,-30875,10975,-30869,10991,-30863,11007,-30858,11023,-30852,11038,-30846,11054,-30841,11070,-30835,11086,-30829,11101,-30824,11117,-30818,11133,-30812,11149,-30807,11164,-30801,11180,-30795,11196,-30789,11212,-30784,11227,-30778,11243,-30772,11259,-30767,11275,-30761,11290,-30755,11306,-30749,11322,-30743,11338,-30738,11353,-30732,11369,-30726,11385,-30720,11400,-30714,11416,-30708,11432,-30703,11448,-30697,11463,-30691,11479,-30685,11495,-30679,11510,-30673,11526,-30667,11542,-30661,11557,-30656,11573,-30650,11589,-30644,11604,-30638,11620,-30632,11636,-30626,11651,-30620,11667,-30614,11683,-30608,11698,-30602,11714,-30596,11730,-30590,11745,-30584,11761,-30578,11777,-30572,11792,-30566,11808,-30560,11823,-30554,11839,-30548,11855,-30542,11870,-30536,11886,-30529,11902,-30523,11917,-30517,11933,-30511,11948,-30505,11964,-30499,11980,-30493,11995,-30487,12011,-30481,12026,-30474,12042,-30468,12057,-30462,12073,-30456,12089,-30450,12104,-30443,12120,-30437,12135,-30431,12151,-30425,12166,-30419,12182,-30412,12198,-30406,12213,-30400,12229,-30394,12244,-30387,12260,-30381,12275,-30375,12291,-30369,12306,-30362,12322,-30356,12337,-30350,12353,-30343,12368,-30337,12384,-30331,12399,-30324,12415,-30318,12430,-30312,12446,-30305,12461,-30299,12477,-30292,12492,-30286,12508,-30280,12523,-30273,12539,-30267,12554,-30260,12570,-30254,12585,-30248,12601,-30241,12616,-30235,12632,-30228,12647,-30222,12663,-30215,12678,-30209,12694,-30202,12709,-30196,12724,-30189,12740,-30183,12755,-30176,12771,-30170,12786,-30163,12802,-30157,12817,-30150,12832,-30143,12848,-30137,12863,-30130,12879,-30124,12894,-30117,12909,-30110,12925,-30104,12940,-30097,12956,-30091,12971,-30084,12986,-30077,13002,-30071,13017,-30064,13033,-30057,13048,-30051,13063,-30044,13079,-30037,13094,-30031,13109,-30024,13125,-30017,13140,-30010,13155,-30004,13171,-29997,13186,-29990,13201,-29984,13217,-29977,13232,-29970,13247,-29963,13263,-29956,13278,-29950,13293,-29943,13309,-29936,13324,-29929,13339,-29922,13355,-29916,13370,-29909,13385,-29902,13400,-29895,13416,-29888,13431,-29881,13446,-29874,13462,-29867,13477,-29861,13492,-29854,13507,-29847,13523,-29840,13538,-29833,13553,-29826,13568,-29819,13584,-29812,13599,-29805,13614,-29798,13629,-29791,13645,-29784,13660,-29777,13675,-29770,13690,-29763,13706,-29756,13721,-29749,13736,-29742,13751,-29735,13766,-29728,13782,-29721,13797,-29714,13812,-29707,13827,-29700,13842,-29693,13858,-29686,13873,-29679,13888,-29671,13903,-29664,13918,-29657,13933,-29650,13949,-29643,13964,-29636,13979,-29629,13994,-29622,14009,-29614,14024,-29607,14039,-29600,14055,-29593,14070,-29586,14085,-29578,14100,-29571,14115,-29564,14130,-29557,14145,-29549,14160,-29542,14176,-29535,14191,-29528,14206,-29520,14221,-29513,14236,-29506,14251,-29499,14266,-29491,14281,-29484,14296,-29477,14311,-29469,14326,-29462,14342,-29455,14357,-29447,14372,-29440,14387,-29433,14402,-29425,14417,-29418,14432,-29411,14447,-29403,14462,-29396,14477,-29388,14492,-29381,14507,-29373,14522,-29366,14537,-29359,14552,-29351,14567,-29344,14582,-29336,14597,-29329,14612,-29321,14627,-29314,14642,-29306,14657,-29299,14672,-29291,14687,-29284,14702,-29276,14717,-29269,14732,-29261,14747,-29254,14762,-29246,14777,-29239,14792,-29231,14807,-29223,14822,-29216,14837,-29208,14852,-29201,14866,-29193,14881,-29185,14896,-29178,14911,-29170,14926,-29163,14941,-29155,14956,-29147,14971,-29140,14986,-29132,15001,-29124,15016,-29117,15030,-29109,15045,-29101,15060,-29093,15075,-29086,15090,-29078,15105,-29070,15120,-29063,15135,-29055,15149,-29047,15164,-29039,15179,-29032,15194,-29024,15209,-29016,15224,-29008,15238,-29000,15253,-28993,15268,-28985,15283,-28977,15298,-28969,15313,-28961,15327,-28954,15342,-28946,15357,-28938,15372,-28930,15387,-28922,15401,-28914,15416,-28906,15431,-28898,15446,-28891,15461,-28883,15475,-28875,15490,-28867,15505,-28859,15520,-28851,15534,-28843,15549,-28835,15564,-28827,15579,-28819,15593,-28811,15608,-28803,15623,-28795,15638,-28787,15652,-28779,15667,-28771,15682,-28763,15696,-28755,15711,-28747,15726,-28739,15740,-28731,15755,-28723,15770,-28715,15785,-28707,15799,-28699,15814,-28691,15829,-28682,15843,-28674,15858,-28666,15873,-28658,15887,-28650,15902,-28642,15917,-28634,15931,-28626,15946,-28617,15960,-28609,15975,-28601,15990,-28593,16004,-28585,16019,-28576,16034,-28568,16048,-28560,16063,-28552,16077,-28544,16092,-28535,16107,-28527,16121,-28519,16136,-28511,16150,-28502,16165,-28494,16179,-28486,16194,-28478,16209,-28469,16223,-28461,16238,-28453,16252,-28444,16267,-28436,16281,-28428,16296,-28419,16310,-28411,16325,-28403,16339,-28394,16354,-28386,16368,-28378,16383,-28369,16398,-28361,16412,-28352,16427,-28344,16441,-28336,16455,-28327,16470,-28319,16484,-28310,16499,-28302,16513,-28293,16528,-28285,16542,-28276,16557,-28268,16571,-28260,16586,-28251,16600,-28243,16615,-28234,16629,-28226,16643,-28217,16658,-28209,16672,-28200,16687,-28191,16701,-28183,16716,-28174,16730,-28166,16744,-28157,16759,-28149,16773,-28140,16788,-28132,16802,-28123,16816,-28114,16831,-28106,16845,-28097,16859,-28088,16874,-28080,16888,-28071,16903,-28063,16917,-28054,16931,-28045,16946,-28037,16960,-28028,16974,-28019,16989,-28010,17003,-28002,17017,-27993,17032,-27984,17046,-27976,17060,-27967,17074,-27958,17089,-27949,17103,-27941,17117,-27932,17132,-27923,17146,-27914,17160,-27906,17174,-27897,17189,-27888,17203,-27879,17217,-27870,17232,-27862,17246,-27853,17260,-27844,17274,-27835,17288,-27826,17303,-27817,17317,-27809,17331,-27800,17345,-27791,17360,-27782,17374,-27773,17388,-27764,17402,-27755,17416,-27746,17431,-27737,17445,-27729,17459,-27720,17473,-27711,17487,-27702,17501,-27693,17516,-27684,17530,-27675,17544,-27666,17558,-27657,17572,-27648,17586,-27639,17600,-27630,17615,-27621,17629,-27612,17643,-27603,17657,-27594,17671,-27585,17685,-27576,17699,-27567,17713,-27558,17727,-27549,17742,-27539,17756,-27530,17770,-27521,17784,-27512,17798,-27503,17812,-27494,17826,-27485,17840,-27476,17854,-27467,17868,-27457,17882,-27448,17896,-27439,17910,-27430,17924,-27421,17938,-27412,17952,-27402,17966,-27393,17980,-27384,17994,-27375,18008,-27366,18022,-27356,18036,-27347,18050,-27338,18064,-27329,18078,-27320,18092,-27310,18106,-27301,18120,-27292,18134,-27282,18148,-27273,18162,-27264,18176,-27255,18190,-27245,18204,-27236,18218,-27227,18232,-27217,18246,-27208,18260,-27199,18273,-27189,18287,-27180,18301,-27171,18315,-27161,18329,-27152,18343,-27142,18357,-27133,18371,-27124,18385,-27114,18398,-27105,18412,-27095,18426,-27086,18440,-27077,18454,-27067,18468,-27058,18482,-27048,18495,-27039,18509,-27029,18523,-27020,18537,-27010,18551,-27001,18564,-26991,18578,-26982,18592,-26972,18606,-26963,18620,-26953,18633,-26944,18647,-26934,18661,-26925,18675,-26915,18689,-26906,18702,-26896,18716,-26886,18730,-26877,18744,-26867,18757,-26858,18771,-26848,18785,-26838,18798,-26829,18812,-26819,18826,-26810,18840,-26800,18853,-26790,18867,-26781,18881,-26771,18894,-26761,18908,-26752,18922,-26742,18935,-26732,18949,-26723,18963,-26713,18976,-26703,18990,-26693,19004,-26684,19017,-26674,19031,-26664,19045,-26655,19058,-26645,19072,-26635,19086,-26625,19099,-26616,19113,-26606,19126,-26596,19140,-26586,19154,-26576,19167,-26567,19181,-26557,19194,-26547,19208,-26537,19221,-26527,19235,-26517,19249,-26508,19262,-26498,19276,-26488,19289,-26478,19303,-26468,19316,-26458,19330,-26448,19343,-26438,19357,-26429,19370,-26419,19384,-26409,19397,-26399,19411,-26389,19424,-26379,19438,-26369,19451,-26359,19465,-26349,19478,-26339,19492,-26329,19505,-26319,19519,-26309,19532,-26299,19546,-26289,19559,-26279,19573,-26269,19586,-26259,19599,-26249,19613,-26239,19626,-26229,19640,-26219,19653,-26209,19667,-26199,19680,-26189,19693,-26179,19707,-26169,19720,-26159,19733,-26149,19747,-26138,19760,-26128,19774,-26118,19787,-26108,19800,-26098,19814,-26088,19827,-26078,19840,-26068,19854,-26057,19867,-26047,19880,-26037,19894,-26027,19907,-26017,19920,-26007,19933,-25996,19947,-25986,19960,-25976,19973,-25966,19987,-25955,20000,-25945,20013,-25935,20026,-25925,20040,-25914,20053,-25904,20066,-25894,20079,-25884,20093,-25873,20106,-25863,20119,-25853,20132,-25843,20146,-25832,20159,-25822,20172,-25812,20185,-25801,20198,-25791,20212,-25781,20225,-25770,20238,-25760,20251,-25750,20264,-25739,20277,-25729,20291,-25718,20304,-25708,20317,-25698,20330,-25687,20343,-25677,20356,-25666,20369,-25656,20383,-25646,20396,-25635,20409,-25625,20422,-25614,20435,-25604,20448,-25593,20461,-25583,20474,-25572,20487,-25562,20500,-25551,20513,-25541,20527,-25530,20540,-25520,20553,-25509,20566,-25499,20579,-25488,20592,-25478,20605,-25467,20618,-25457,20631,-25446,20644,-25436,20657,-25425,20670,-25415,20683,-25404,20696,-25393,20709,-25383,20722,-25372,20735,-25362,20748,-25351,20761,-25340,20774,-25330,20787,-25319,20800,-25308,20813,-25298,20825,-25287,20838,-25277,20851,-25266,20864,-25255,20877,-25244,20890,-25234,20903,-25223,20916,-25212,20929,-25202,20942,-25191,20955,-25180,20967,-25170,20980,-25159,20993,-25148,21006,-25137,21019,-25127,21032,-25116,21045,-25105,21057,-25094,21070,-25084,21083,-25073,21096,-25062,21109,-25051,21122,-25040,21134,-25030,21147,-25019,21160,-25008,21173,-24997,21186,-24986,21198,-24975,21211,-24965,21224,-24954,21237,-24943,21249,-24932,21262,-24921,21275,-24910,21288,-24899,21300,-24888,21313,-24878,21326,-24867,21339,-24856,21351,-24845,21364,-24834,21377,-24823,21389,-24812,21402,-24801,21415,-24790,21427,-24779,21440,-24768,21453,-24757,21465,-24746,21478,-24735,21491,-24724,21503,-24713,21516,-24702,21529,-24691,21541,-24680,21554,-24669,21566,-24658,21579,-24647,21592,-24636,21604,-24625,21617,-24614,21629,-24603,21642,-24592,21655,-24581,21667,-24570,21680,-24559,21692,-24547,21705,-24536,21717,-24525,21730,-24514,21743,-24503,21755,-24492,21768,-24481,21780,-24470,21793,-24458,21805,-24447,21818,-24436,21830,-24425,21843,-24414,21855,-24403,21868,-24391,21880,-24380,21893,-24369,21905,-24358,21917,-24347,21930,-24335,21942,-24324,21955,-24313,21967,-24302,21980,-24290,21992,-24279,22004,-24268,22017,-24257,22029,-24245,22042,-24234,22054,-24223,22066,-24212,22079,-24200,22091,-24189,22104,-24178,22116,-24166,22128,-24155,22141,-24144,22153,-24132,22165,-24121,22178,-24110,22190,-24098,22202,-24087,22215,-24076,22227,-24064,22239,-24053,22252,-24042,22264,-24030,22276,-24019,22288,-24007,22301,-23996,22313,-23985,22325,-23973,22338,-23962,22350,-23950,22362,-23939,22374,-23927,22387,-23916,22399,-23904,22411,-23893,22423,-23882,22435,-23870,22448,-23859,22460,-23847,22472,-23836,22484,-23824,22496,-23813,22509,-23801,22521,-23790,22533,-23778,22545,-23767,22557,-23755,22569,-23743,22582,-23732,22594,-23720,22606,-23709,22618,-23697,22630,-23686,22642,-23674,22654,-23662,22666,-23651,22678,-23639,22691,-23628,22703,-23616,22715,-23604,22727,-23593,22739,-23581,22751,-23570,22763,-23558,22775,-23546,22787,-23535,22799,-23523,22811,-23511,22823,-23500,22835,-23488,22847,-23476,22859,-23465,22871,-23453,22883,-23441,22895,-23429,22907,-23418,22919,-23406,22931,-23394,22943,-23383,22955,-23371,22967,-23359,22979,-23347,22991,-23336,23003,-23324,23015,-23312,23027,-23300,23039,-23288,23050,-23277,23062,-23265,23074,-23253,23086,-23241,23098,-23229,23110,-23218,23122,-23206,23134,-23194,23146,-23182,23157,-23170,23169,-23158,23181,-23147,23193,-23135,23205,-23123,23217,-23111,23228,-23099,23240,-23087,23252,-23075,23264,-23063,23276,-23051,23287,-23040,23299,-23028,23311,-23016,23323,-23004,23335,-22992,23346,-22980,23358,-22968,23370,-22956,23382,-22944,23393,-22932,23405,-22920,23417,-22908,23428,-22896,23440,-22884,23452,-22872,23464,-22860,23475,-22848,23487,-22836,23499,-22824,23510,-22812,23522,-22800,23534,-22788,23545,-22776,23557,-22764,23569,-22752,23580,-22740,23592,-22728,23603,-22716,23615,-22704,23627,-22692,23638,-22679,23650,-22667,23661,-22655,23673,-22643,23685,-22631,23696,-22619,23708,-22607,23719,-22595,23731,-22583,23742,-22570,23754,-22558,23766,-22546,23777,-22534,23789,-22522,23800,-22510,23812,-22497,23823,-22485,23835,-22473,23846,-22461,23858,-22449,23869,-22436,23881,-22424,23892,-22412,23903,-22400,23915,-22388,23926,-22375,23938,-22363,23949,-22351,23961,-22339,23972,-22326,23984,-22314,23995,-22302,24006,-22289,24018,-22277,24029,-22265,24041,-22253,24052,-22240,24063,-22228,24075,-22216,24086,-22203,24097,-22191,24109,-22179,24120,-22166,24131,-22154,24143,-22142,24154,-22129,24165,-22117,24177,-22105,24188,-22092,24199,-22080,24211,-22067,24222,-22055,24233,-22043,24244,-22030,24256,-22018,24267,-22005,24278,-21993,24289,-21981,24301,-21968,24312,-21956,24323,-21943,24334,-21931,24346,-21918,24357,-21906,24368,-21894,24379,-21881,24390,-21869,24402,-21856,24413,-21844,24424,-21831,24435,-21819,24446,-21806,24457,-21794,24469,-21781,24480,-21769,24491,-21756,24502,-21744,24513,-21731,24524,-21718,24535,-21706,24546,-21693,24558,-21681,24569,-21668,24580,-21656,24591,-21643,24602,-21630,24613,-21618,24624,-21605,24635,-21593,24646,-21580,24657,-21567,24668,-21555,24679,-21542,24690,-21530,24701,-21517,24712,-21504,24723,-21492,24734,-21479,24745,-21466,24756,-21454,24767,-21441,24778,-21428,24789,-21416,24800,-21403,24811,-21390,24822,-21378,24833,-21365,24844,-21352,24855,-21340,24866,-21327,24877,-21314,24887,-21301,24898,-21289,24909,-21276,24920,-21263,24931,-21250,24942,-21238,24953,-21225,24964,-21212,24974,-21199,24985,-21187,24996,-21174,25007,-21161,25018,-21148,25029,-21135,25039,-21123,25050,-21110,25061,-21097,25072,-21084,25083,-21071,25093,-21058,25104,-21046,25115,-21033,25126,-21020,25136,-21007,25147,-20994,25158,-20981,25169,-20968,25179,-20956,25190,-20943,25201,-20930,25211,-20917,25222,-20904,25233,-20891,25243,-20878,25254,-20865,25265,-20852,25276,-20839,25286,-20826,25297,-20814,25307,-20801,25318,-20788,25329,-20775,25339,-20762,25350,-20749,25361,-20736,25371,-20723,25382,-20710,25392,-20697,25403,-20684,25414,-20671,25424,-20658,25435,-20645,25445,-20632,25456,-20619,25466,-20606,25477,-20593,25487,-20580,25498,-20567,25508,-20554,25519,-20541,25529,-20528,25540,-20514,25550,-20501,25561,-20488,25571,-20475,25582,-20462,25592,-20449,25603,-20436,25613,-20423,25624,-20410,25634,-20397,25645,-20384,25655,-20370,25665,-20357,25676,-20344,25686,-20331,25697,-20318,25707,-20305,25717,-20292,25728,-20278,25738,-20265,25749,-20252,25759,-20239,25769,-20226,25780,-20213,25790,-20199,25800,-20186,25811,-20173,25821,-20160,25831,-20147,25842,-20133,25852,-20120,25862,-20107,25872,-20094,25883,-20080,25893,-20067,25903,-20054,25913,-20041,25924,-20027,25934,-20014,25944,-20001,25954,-19988,25965,-19974,25975,-19961,25985,-19948,25995,-19934,26006,-19921,26016,-19908,26026,-19895,26036,-19881,26046,-19868,26056,-19855,26067,-19841,26077,-19828,26087,-19815,26097,-19801,26107,-19788,26117,-19775,26127,-19761,26137,-19748,26148,-19734,26158,-19721,26168,-19708,26178,-19694,26188,-19681,26198,-19668,26208,-19654,26218,-19641,26228,-19627,26238,-19614,26248,-19600,26258,-19587,26268,-19574,26278,-19560,26288,-19547,26298,-19533,26308,-19520,26318,-19506,26328,-19493,26338,-19479,26348,-19466,26358,-19452,26368,-19439,26378,-19425,26388,-19412,26398,-19398,26408,-19385,26418,-19371,26428,-19358,26437,-19344,26447,-19331,26457,-19317,26467,-19304,26477,-19290,26487,-19277,26497,-19263,26507,-19250,26516,-19236,26526,-19222,26536,-19209,26546,-19195,26556,-19182,26566,-19168,26575,-19155,26585,-19141,26595,-19127,26605,-19114,26615,-19100,26624,-19087,26634,-19073,26644,-19059,26654,-19046,26663,-19032,26673,-19018,26683,-19005,26692,-18991,26702,-18977,26712,-18964,26722,-18950,26731,-18936,26741,-18923,26751,-18909,26760,-18895,26770,-18882,26780,-18868,26789,-18854,26799,-18841,26809,-18827,26818,-18813,26828,-18799,26837,-18786,26847,-18772,26857,-18758,26866,-18745,26876,-18731,26885,-18717,26895,-18703,26905,-18690,26914,-18676,26924,-18662,26933,-18648,26943,-18634,26952,-18621,26962,-18607,26971,-18593,26981,-18579,26990,-18565,27000,-18552,27009,-18538,27019,-18524,27028,-18510,27038,-18496,27047,-18483,27057,-18469,27066,-18455,27076,-18441,27085,-18427,27094,-18413,27104,-18399,27113,-18386,27123,-18372,27132,-18358,27141,-18344,27151,-18330,27160,-18316,27170,-18302,27179,-18288,27188,-18274,27198,-18261,27207,-18247,27216,-18233,27226,-18219,27235,-18205,27244,-18191,27254,-18177,27263,-18163,27272,-18149,27281,-18135,27291,-18121,27300,-18107,27309,-18093,27319,-18079,27328,-18065,27337,-18051,27346,-18037,27355,-18023,27365,-18009,27374,-17995,27383,-17981,27392,-17967,27401,-17953,27411,-17939,27420,-17925,27429,-17911,27438,-17897,27447,-17883,27456,-17869,27466,-17855,27475,-17841,27484,-17827,27493,-17813,27502,-17799,27511,-17785,27520,-17771,27529,-17757,27538,-17743,27548,-17728,27557,-17714,27566,-17700,27575,-17686,27584,-17672,27593,-17658,27602,-17644,27611,-17630,27620,-17616,27629,-17601,27638,-17587,27647,-17573,27656,-17559,27665,-17545,27674,-17531,27683,-17517,27692,-17502,27701,-17488,27710,-17474,27719,-17460,27728,-17446,27736,-17432,27745,-17417,27754,-17403,27763,-17389,27772,-17375,27781,-17361,27790,-17346,27799,-17332,27808,-17318,27816,-17304,27825,-17289,27834,-17275,27843,-17261,27852,-17247,27861,-17233,27869,-17218,27878,-17204,27887,-17190,27896,-17175,27905,-17161,27913,-17147,27922,-17133,27931,-17118,27940,-17104,27948,-17090,27957,-17075,27966,-17061,27975,-17047,27983,-17033,27992,-17018,28001,-17004,28009,-16990,28018,-16975,28027,-16961,28036,-16947,28044,-16932,28053,-16918,28062,-16904,28070,-16889,28079,-16875,28087,-16860,28096,-16846,28105,-16832,28113,-16817,28122,-16803,28131,-16789,28139,-16774,28148,-16760,28156,-16745,28165,-16731,28173,-16717,28182,-16702,28190,-16688,28199,-16673,28208,-16659,28216,-16644,28225,-16630,28233,-16616,28242,-16601,28250,-16587,28259,-16572,28267,-16558,28275,-16543,28284,-16529,28292,-16514,28301,-16500,28309,-16485,28318,-16471,28326,-16456,28335,-16442,28343,-16428,28351,-16413,28360,-16399,28368}; diff --git a/openair1/PHY/TOOLS/twiddle6144.h b/openair1/PHY/TOOLS/twiddle6144.h index 3f9c3684dc..6fc18ebfbe 100644 --- a/openair1/PHY/TOOLS/twiddle6144.h +++ b/openair1/PHY/TOOLS/twiddle6144.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:2047)/6144)); twb = floor(32767*exp(-sqrt(-1)*2*pi*(0:2:4094)/6144)); @@ -38,8 +31,8 @@ twb2(2:2:end) = imag(twb); */ -int16_t twa6144[4096] __attribute__((aligned(16))) = {32767,0,32766,-34,32766,-68,32766,-101,32766,-135,32766,-168,32766,-202,32766,-235,32765,-269,32765,-302,32765,-336,32764,-369,32764,-403,32764,-436,32763,-470,32763,-503,32762,-537,32762,-570,32761,-604,32760,-637,32760,-671,32759,-704,32758,-738,32757,-771,32757,-805,32756,-838,32755,-872,32754,-905,32753,-939,32752,-972,32751,-1006,32750,-1039,32749,-1073,32748,-1106,32747,-1140,32746,-1173,32744,-1207,32743,-1240,32742,-1274,32740,-1307,32739,-1340,32738,-1374,32736,-1407,32735,-1441,32733,-1474,32732,-1508,32730,-1541,32729,-1575,32727,-1608,32725,-1642,32724,-1675,32722,-1709,32720,-1742,32718,-1776,32717,-1809,32715,-1843,32713,-1876,32711,-1909,32709,-1943,32707,-1976,32705,-2010,32703,-2043,32701,-2077,32699,-2110,32696,-2144,32694,-2177,32692,-2210,32690,-2244,32687,-2277,32685,-2311,32683,-2344,32680,-2378,32678,-2411,32675,-2444,32673,-2478,32670,-2511,32668,-2545,32665,-2578,32662,-2611,32660,-2645,32657,-2678,32654,-2712,32651,-2745,32649,-2778,32646,-2812,32643,-2845,32640,-2879,32637,-2912,32634,-2945,32631,-2979,32628,-3012,32625,-3045,32622,-3079,32618,-3112,32615,-3146,32612,-3179,32609,-3212,32605,-3246,32602,-3279,32599,-3312,32595,-3346,32592,-3379,32588,-3412,32585,-3446,32581,-3479,32578,-3512,32574,-3546,32571,-3579,32567,-3612,32563,-3645,32559,-3679,32556,-3712,32552,-3745,32548,-3779,32544,-3812,32540,-3845,32536,-3878,32532,-3912,32528,-3945,32524,-3978,32520,-4012,32516,-4045,32512,-4078,32508,-4111,32503,-4145,32499,-4178,32495,-4211,32491,-4244,32486,-4277,32482,-4311,32477,-4344,32473,-4377,32468,-4410,32464,-4444,32459,-4477,32455,-4510,32450,-4543,32445,-4576,32441,-4609,32436,-4643,32431,-4676,32426,-4709,32422,-4742,32417,-4775,32412,-4808,32407,-4842,32402,-4875,32397,-4908,32392,-4941,32387,-4974,32382,-5007,32377,-5040,32371,-5073,32366,-5107,32361,-5140,32356,-5173,32350,-5206,32345,-5239,32340,-5272,32334,-5305,32329,-5338,32323,-5371,32318,-5404,32312,-5437,32307,-5470,32301,-5503,32295,-5536,32290,-5569,32284,-5602,32278,-5635,32273,-5668,32267,-5701,32261,-5734,32255,-5767,32249,-5800,32243,-5833,32237,-5866,32231,-5899,32225,-5932,32219,-5965,32213,-5998,32207,-6031,32201,-6064,32194,-6097,32188,-6130,32182,-6163,32176,-6196,32169,-6229,32163,-6262,32156,-6294,32150,-6327,32143,-6360,32137,-6393,32130,-6426,32124,-6459,32117,-6492,32110,-6524,32104,-6557,32097,-6590,32090,-6623,32084,-6656,32077,-6689,32070,-6721,32063,-6754,32056,-6787,32049,-6820,32042,-6852,32035,-6885,32028,-6918,32021,-6951,32014,-6983,32007,-7016,31999,-7049,31992,-7082,31985,-7114,31978,-7147,31970,-7180,31963,-7212,31956,-7245,31948,-7278,31941,-7311,31933,-7343,31926,-7376,31918,-7408,31911,-7441,31903,-7474,31895,-7506,31888,-7539,31880,-7572,31872,-7604,31864,-7637,31856,-7669,31849,-7702,31841,-7734,31833,-7767,31825,-7800,31817,-7832,31809,-7865,31801,-7897,31793,-7930,31785,-7962,31776,-7995,31768,-8027,31760,-8060,31752,-8092,31743,-8125,31735,-8157,31727,-8190,31718,-8222,31710,-8254,31701,-8287,31693,-8319,31684,-8352,31676,-8384,31667,-8416,31659,-8449,31650,-8481,31641,-8514,31633,-8546,31624,-8578,31615,-8611,31606,-8643,31597,-8675,31588,-8708,31580,-8740,31571,-8772,31562,-8804,31553,-8837,31544,-8869,31534,-8901,31525,-8933,31516,-8966,31507,-8998,31498,-9030,31489,-9062,31479,-9095,31470,-9127,31461,-9159,31451,-9191,31442,-9223,31432,-9255,31423,-9288,31413,-9320,31404,-9352,31394,-9384,31385,-9416,31375,-9448,31365,-9480,31356,-9512,31346,-9544,31336,-9576,31326,-9608,31316,-9640,31307,-9672,31297,-9704,31287,-9736,31277,-9768,31267,-9800,31257,-9832,31247,-9864,31236,-9896,31226,-9928,31216,-9960,31206,-9992,31196,-10024,31185,-10056,31175,-10088,31165,-10120,31154,-10152,31144,-10183,31134,-10215,31123,-10247,31113,-10279,31102,-10311,31092,-10343,31081,-10374,31070,-10406,31060,-10438,31049,-10470,31038,-10501,31028,-10533,31017,-10565,31006,-10597,30995,-10628,30984,-10660,30973,-10692,30962,-10723,30951,-10755,30940,-10787,30929,-10818,30918,-10850,30907,-10881,30896,-10913,30885,-10945,30874,-10976,30862,-11008,30851,-11039,30840,-11071,30828,-11102,30817,-11134,30806,-11165,30794,-11197,30783,-11228,30771,-11260,30760,-11291,30748,-11323,30737,-11354,30725,-11386,30713,-11417,30702,-11449,30690,-11480,30678,-11511,30666,-11543,30655,-11574,30643,-11605,30631,-11637,30619,-11668,30607,-11699,30595,-11731,30583,-11762,30571,-11793,30559,-11824,30547,-11856,30535,-11887,30522,-11918,30510,-11949,30498,-11981,30486,-12012,30473,-12043,30461,-12074,30449,-12105,30436,-12136,30424,-12167,30411,-12199,30399,-12230,30386,-12261,30374,-12292,30361,-12323,30349,-12354,30336,-12385,30323,-12416,30311,-12447,30298,-12478,30285,-12509,30272,-12540,30259,-12571,30247,-12602,30234,-12633,30221,-12664,30208,-12695,30195,-12725,30182,-12756,30169,-12787,30156,-12818,30142,-12849,30129,-12880,30116,-12910,30103,-12941,30090,-12972,30076,-13003,30063,-13034,30050,-13064,30036,-13095,30023,-13126,30009,-13156,29996,-13187,29983,-13218,29969,-13248,29955,-13279,29942,-13310,29928,-13340,29915,-13371,29901,-13401,29887,-13432,29873,-13463,29860,-13493,29846,-13524,29832,-13554,29818,-13585,29804,-13615,29790,-13646,29776,-13676,29762,-13707,29748,-13737,29734,-13767,29720,-13798,29706,-13828,29692,-13859,29678,-13889,29663,-13919,29649,-13950,29635,-13980,29621,-14010,29606,-14040,29592,-14071,29577,-14101,29563,-14131,29548,-14161,29534,-14192,29519,-14222,29505,-14252,29490,-14282,29476,-14312,29461,-14343,29446,-14373,29432,-14403,29417,-14433,29402,-14463,29387,-14493,29372,-14523,29358,-14553,29343,-14583,29328,-14613,29313,-14643,29298,-14673,29283,-14703,29268,-14733,29253,-14763,29238,-14793,29222,-14823,29207,-14853,29192,-14882,29177,-14912,29162,-14942,29146,-14972,29131,-15002,29116,-15031,29100,-15061,29085,-15091,29069,-15121,29054,-15150,29038,-15180,29023,-15210,29007,-15239,28992,-15269,28976,-15299,28960,-15328,28945,-15358,28929,-15388,28913,-15417,28897,-15447,28882,-15476,28866,-15506,28850,-15535,28834,-15565,28818,-15594,28802,-15624,28786,-15653,28770,-15683,28754,-15712,28738,-15741,28722,-15771,28706,-15800,28690,-15830,28673,-15859,28657,-15888,28641,-15918,28625,-15947,28608,-15976,28592,-16005,28575,-16035,28559,-16064,28543,-16093,28526,-16122,28510,-16151,28493,-16180,28477,-16210,28460,-16239,28443,-16268,28427,-16297,28410,-16326,28393,-16355,28377,-16384,28360,-16413,28343,-16442,28326,-16471,28309,-16500,28292,-16529,28275,-16558,28259,-16587,28242,-16616,28225,-16644,28208,-16673,28190,-16702,28173,-16731,28156,-16760,28139,-16789,28122,-16817,28105,-16846,28087,-16875,28070,-16904,28053,-16932,28036,-16961,28018,-16990,28001,-17018,27983,-17047,27966,-17075,27948,-17104,27931,-17133,27913,-17161,27896,-17190,27878,-17218,27861,-17247,27843,-17275,27825,-17304,27808,-17332,27790,-17361,27772,-17389,27754,-17417,27736,-17446,27719,-17474,27701,-17502,27683,-17531,27665,-17559,27647,-17587,27629,-17616,27611,-17644,27593,-17672,27575,-17700,27557,-17728,27538,-17757,27520,-17785,27502,-17813,27484,-17841,27466,-17869,27447,-17897,27429,-17925,27411,-17953,27392,-17981,27374,-18009,27355,-18037,27337,-18065,27319,-18093,27300,-18121,27281,-18149,27263,-18177,27244,-18205,27226,-18233,27207,-18261,27188,-18288,27170,-18316,27151,-18344,27132,-18372,27113,-18399,27094,-18427,27076,-18455,27057,-18483,27038,-18510,27019,-18538,27000,-18565,26981,-18593,26962,-18621,26943,-18648,26924,-18676,26905,-18703,26885,-18731,26866,-18758,26847,-18786,26828,-18813,26809,-18841,26789,-18868,26770,-18895,26751,-18923,26731,-18950,26712,-18977,26692,-19005,26673,-19032,26654,-19059,26634,-19087,26615,-19114,26595,-19141,26575,-19168,26556,-19195,26536,-19222,26516,-19250,26497,-19277,26477,-19304,26457,-19331,26437,-19358,26418,-19385,26398,-19412,26378,-19439,26358,-19466,26338,-19493,26318,-19520,26298,-19547,26278,-19574,26258,-19600,26238,-19627,26218,-19654,26198,-19681,26178,-19708,26158,-19734,26137,-19761,26117,-19788,26097,-19815,26077,-19841,26056,-19868,26036,-19895,26016,-19921,25995,-19948,25975,-19974,25954,-20001,25934,-20027,25913,-20054,25893,-20080,25872,-20107,25852,-20133,25831,-20160,25811,-20186,25790,-20213,25769,-20239,25749,-20265,25728,-20292,25707,-20318,25686,-20344,25665,-20370,25645,-20397,25624,-20423,25603,-20449,25582,-20475,25561,-20501,25540,-20528,25519,-20554,25498,-20580,25477,-20606,25456,-20632,25435,-20658,25414,-20684,25392,-20710,25371,-20736,25350,-20762,25329,-20788,25307,-20814,25286,-20839,25265,-20865,25243,-20891,25222,-20917,25201,-20943,25179,-20968,25158,-20994,25136,-21020,25115,-21046,25093,-21071,25072,-21097,25050,-21123,25029,-21148,25007,-21174,24985,-21199,24964,-21225,24942,-21250,24920,-21276,24898,-21301,24877,-21327,24855,-21352,24833,-21378,24811,-21403,24789,-21428,24767,-21454,24745,-21479,24723,-21504,24701,-21530,24679,-21555,24657,-21580,24635,-21605,24613,-21630,24591,-21656,24569,-21681,24546,-21706,24524,-21731,24502,-21756,24480,-21781,24457,-21806,24435,-21831,24413,-21856,24390,-21881,24368,-21906,24346,-21931,24323,-21956,24301,-21981,24278,-22005,24256,-22030,24233,-22055,24211,-22080,24188,-22105,24165,-22129,24143,-22154,24120,-22179,24097,-22203,24075,-22228,24052,-22253,24029,-22277,24006,-22302,23984,-22326,23961,-22351,23938,-22375,23915,-22400,23892,-22424,23869,-22449,23846,-22473,23823,-22497,23800,-22522,23777,-22546,23754,-22570,23731,-22595,23708,-22619,23685,-22643,23661,-22667,23638,-22692,23615,-22716,23592,-22740,23569,-22764,23545,-22788,23522,-22812,23499,-22836,23475,-22860,23452,-22884,23428,-22908,23405,-22932,23382,-22956,23358,-22980,23335,-23004,23311,-23028,23287,-23051,23264,-23075,23240,-23099,23217,-23123,23193,-23147,23169,-23170,23146,-23194,23122,-23218,23098,-23241,23074,-23265,23050,-23288,23027,-23312,23003,-23336,22979,-23359,22955,-23383,22931,-23406,22907,-23429,22883,-23453,22859,-23476,22835,-23500,22811,-23523,22787,-23546,22763,-23570,22739,-23593,22715,-23616,22691,-23639,22666,-23662,22642,-23686,22618,-23709,22594,-23732,22569,-23755,22545,-23778,22521,-23801,22496,-23824,22472,-23847,22448,-23870,22423,-23893,22399,-23916,22374,-23939,22350,-23962,22325,-23985,22301,-24007,22276,-24030,22252,-24053,22227,-24076,22202,-24098,22178,-24121,22153,-24144,22128,-24166,22104,-24189,22079,-24212,22054,-24234,22029,-24257,22004,-24279,21980,-24302,21955,-24324,21930,-24347,21905,-24369,21880,-24391,21855,-24414,21830,-24436,21805,-24458,21780,-24481,21755,-24503,21730,-24525,21705,-24547,21680,-24570,21655,-24592,21629,-24614,21604,-24636,21579,-24658,21554,-24680,21529,-24702,21503,-24724,21478,-24746,21453,-24768,21427,-24790,21402,-24812,21377,-24834,21351,-24856,21326,-24878,21300,-24899,21275,-24921,21249,-24943,21224,-24965,21198,-24986,21173,-25008,21147,-25030,21122,-25051,21096,-25073,21070,-25094,21045,-25116,21019,-25137,20993,-25159,20967,-25180,20942,-25202,20916,-25223,20890,-25244,20864,-25266,20838,-25287,20813,-25308,20787,-25330,20761,-25351,20735,-25372,20709,-25393,20683,-25415,20657,-25436,20631,-25457,20605,-25478,20579,-25499,20553,-25520,20527,-25541,20500,-25562,20474,-25583,20448,-25604,20422,-25625,20396,-25646,20369,-25666,20343,-25687,20317,-25708,20291,-25729,20264,-25750,20238,-25770,20212,-25791,20185,-25812,20159,-25832,20132,-25853,20106,-25873,20079,-25894,20053,-25914,20026,-25935,20000,-25955,19973,-25976,19947,-25996,19920,-26017,19894,-26037,19867,-26057,19840,-26078,19814,-26098,19787,-26118,19760,-26138,19733,-26159,19707,-26179,19680,-26199,19653,-26219,19626,-26239,19599,-26259,19573,-26279,19546,-26299,19519,-26319,19492,-26339,19465,-26359,19438,-26379,19411,-26399,19384,-26419,19357,-26438,19330,-26458,19303,-26478,19276,-26498,19249,-26517,19221,-26537,19194,-26557,19167,-26576,19140,-26596,19113,-26616,19086,-26635,19058,-26655,19031,-26674,19004,-26693,18976,-26713,18949,-26732,18922,-26752,18894,-26771,18867,-26790,18840,-26810,18812,-26829,18785,-26848,18757,-26867,18730,-26886,18702,-26906,18675,-26925,18647,-26944,18620,-26963,18592,-26982,18564,-27001,18537,-27020,18509,-27039,18482,-27058,18454,-27077,18426,-27095,18398,-27114,18371,-27133,18343,-27152,18315,-27171,18287,-27189,18260,-27208,18232,-27227,18204,-27245,18176,-27264,18148,-27282,18120,-27301,18092,-27320,18064,-27338,18036,-27356,18008,-27375,17980,-27393,17952,-27412,17924,-27430,17896,-27448,17868,-27467,17840,-27485,17812,-27503,17784,-27521,17756,-27539,17727,-27558,17699,-27576,17671,-27594,17643,-27612,17615,-27630,17586,-27648,17558,-27666,17530,-27684,17501,-27702,17473,-27720,17445,-27737,17416,-27755,17388,-27773,17360,-27791,17331,-27809,17303,-27826,17274,-27844,17246,-27862,17217,-27879,17189,-27897,17160,-27914,17132,-27932,17103,-27949,17074,-27967,17046,-27984,17017,-28002,16989,-28019,16960,-28037,16931,-28054,16903,-28071,16874,-28088,16845,-28106,16816,-28123,16788,-28140,16759,-28157,16730,-28174,16701,-28191,16672,-28209,16643,-28226,16615,-28243,16586,-28260,16557,-28276,16528,-28293,16499,-28310,16470,-28327,16441,-28344,16412,-28361,16383,-28378,16354,-28394,16325,-28411,16296,-28428,16267,-28444,16238,-28461,16209,-28478,16179,-28494,16150,-28511,16121,-28527,16092,-28544,16063,-28560,16034,-28576,16004,-28593,15975,-28609,15946,-28626,15917,-28642,15887,-28658,15858,-28674,15829,-28691,15799,-28707,15770,-28723,15740,-28739,15711,-28755,15682,-28771,15652,-28787,15623,-28803,15593,-28819,15564,-28835,15534,-28851,15505,-28867,15475,-28883,15446,-28898,15416,-28914,15387,-28930,15357,-28946,15327,-28961,15298,-28977,15268,-28993,15238,-29008,15209,-29024,15179,-29039,15149,-29055,15120,-29070,15090,-29086,15060,-29101,15030,-29117,15001,-29132,14971,-29147,14941,-29163,14911,-29178,14881,-29193,14852,-29208,14822,-29223,14792,-29239,14762,-29254,14732,-29269,14702,-29284,14672,-29299,14642,-29314,14612,-29329,14582,-29344,14552,-29359,14522,-29373,14492,-29388,14462,-29403,14432,-29418,14402,-29433,14372,-29447,14342,-29462,14311,-29477,14281,-29491,14251,-29506,14221,-29520,14191,-29535,14160,-29549,14130,-29564,14100,-29578,14070,-29593,14039,-29607,14009,-29622,13979,-29636,13949,-29650,13918,-29664,13888,-29679,13858,-29693,13827,-29707,13797,-29721,13766,-29735,13736,-29749,13706,-29763,13675,-29777,13645,-29791,13614,-29805,13584,-29819,13553,-29833,13523,-29847,13492,-29861,13462,-29874,13431,-29888,13400,-29902,13370,-29916,13339,-29929,13309,-29943,13278,-29956,13247,-29970,13217,-29984,13186,-29997,13155,-30010,13125,-30024,13094,-30037,13063,-30051,13033,-30064,13002,-30077,12971,-30091,12940,-30104,12909,-30117,12879,-30130,12848,-30143,12817,-30157,12786,-30170,12755,-30183,12724,-30196,12694,-30209,12663,-30222,12632,-30235,12601,-30248,12570,-30260,12539,-30273,12508,-30286,12477,-30299,12446,-30312,12415,-30324,12384,-30337,12353,-30350,12322,-30362,12291,-30375,12260,-30387,12229,-30400,12198,-30412,12166,-30425,12135,-30437,12104,-30450,12073,-30462,12042,-30474,12011,-30487,11980,-30499,11948,-30511,11917,-30523,11886,-30536,11855,-30548,11823,-30560,11792,-30572,11761,-30584,11730,-30596,11698,-30608,11667,-30620,11636,-30632,11604,-30644,11573,-30656,11542,-30667,11510,-30679,11479,-30691,11448,-30703,11416,-30714,11385,-30726,11353,-30738,11322,-30749,11290,-30761,11259,-30772,11227,-30784,11196,-30795,11164,-30807,11133,-30818,11101,-30829,11070,-30841,11038,-30852,11007,-30863,10975,-30875,10944,-30886,10912,-30897,10880,-30908,10849,-30919,10817,-30930,10786,-30941,10754,-30952,10722,-30963,10691,-30974,10659,-30985,10627,-30996,10596,-31007,10564,-31018,10532,-31029,10500,-31039,10469,-31050,10437,-31061,10405,-31071,10373,-31082,10342,-31093,10310,-31103,10278,-31114,10246,-31124,10214,-31135,10182,-31145,10151,-31155,10119,-31166,10087,-31176,10055,-31186,10023,-31197,9991,-31207,9959,-31217,9927,-31227,9895,-31237,9863,-31248,9831,-31258,9799,-31268,9767,-31278,9735,-31288,9703,-31298,9671,-31308,9639,-31317,9607,-31327,9575,-31337,9543,-31347,9511,-31357,9479,-31366,9447,-31376,9415,-31386,9383,-31395,9351,-31405,9319,-31414,9287,-31424,9254,-31433,9222,-31443,9190,-31452,9158,-31462,9126,-31471,9094,-31480,9061,-31490,9029,-31499,8997,-31508,8965,-31517,8932,-31526,8900,-31535,8868,-31545,8836,-31554,8803,-31563,8771,-31572,8739,-31581,8707,-31589,8674,-31598,8642,-31607,8610,-31616,8577,-31625,8545,-31634,8513,-31642,8480,-31651,8448,-31660,8415,-31668,8383,-31677,8351,-31685,8318,-31694,8286,-31702,8253,-31711,8221,-31719,8189,-31728,8156,-31736,8124,-31744,8091,-31753,8059,-31761,8026,-31769,7994,-31777,7961,-31786,7929,-31794,7896,-31802,7864,-31810,7831,-31818,7799,-31826,7766,-31834,7733,-31842,7701,-31850,7668,-31857,7636,-31865,7603,-31873,7571,-31881,7538,-31889,7505,-31896,7473,-31904,7440,-31912,7407,-31919,7375,-31927,7342,-31934,7310,-31942,7277,-31949,7244,-31957,7211,-31964,7179,-31971,7146,-31979,7113,-31986,7081,-31993,7048,-32000,7015,-32008,6982,-32015,6950,-32022,6917,-32029,6884,-32036,6851,-32043,6819,-32050,6786,-32057,6753,-32064,6720,-32071,6688,-32078,6655,-32085,6622,-32091,6589,-32098,6556,-32105,6523,-32111,6491,-32118,6458,-32125,6425,-32131,6392,-32138,6359,-32144,6326,-32151,6293,-32157,6261,-32164,6228,-32170,6195,-32177,6162,-32183,6129,-32189,6096,-32195,6063,-32202,6030,-32208,5997,-32214,5964,-32220,5931,-32226,5898,-32232,5865,-32238,5832,-32244,5799,-32250,5766,-32256,5733,-32262,5700,-32268,5667,-32274,5634,-32279,5601,-32285,5568,-32291,5535,-32296,5502,-32302,5469,-32308,5436,-32313,5403,-32319,5370,-32324,5337,-32330,5304,-32335,5271,-32341,5238,-32346,5205,-32351,5172,-32357,5139,-32362,5106,-32367,5072,-32372,5039,-32378,5006,-32383,4973,-32388,4940,-32393,4907,-32398,4874,-32403,4841,-32408,4807,-32413,4774,-32418,4741,-32423,4708,-32427,4675,-32432,4642,-32437,4608,-32442,4575,-32446,4542,-32451,4509,-32456,4476,-32460,4443,-32465,4409,-32469,4376,-32474,4343,-32478,4310,-32483,4276,-32487,4243,-32492,4210,-32496,4177,-32500,4144,-32504,4110,-32509,4077,-32513,4044,-32517,4011,-32521,3977,-32525,3944,-32529,3911,-32533,3877,-32537,3844,-32541,3811,-32545,3778,-32549,3744,-32553,3711,-32557,3678,-32560,3644,-32564,3611,-32568,3578,-32572,3545,-32575,3511,-32579,3478,-32582,3445,-32586,3411,-32589,3378,-32593,3345,-32596,3311,-32600,3278,-32603,3245,-32606,3211,-32610,3178,-32613,3145,-32616,3111,-32619,3078,-32623,3044,-32626,3011,-32629,2978,-32632,2944,-32635,2911,-32638,2878,-32641,2844,-32644,2811,-32647,2777,-32650,2744,-32652,2711,-32655,2677,-32658,2644,-32661,2610,-32663,2577,-32666,2544,-32669,2510,-32671,2477,-32674,2443,-32676,2410,-32679,2377,-32681,2343,-32684,2310,-32686,2276,-32688,2243,-32691,2209,-32693,2176,-32695,2143,-32697,2109,-32700,2076,-32702,2042,-32704,2009,-32706,1975,-32708,1942,-32710,1908,-32712,1875,-32714,1842,-32716,1808,-32718,1775,-32719,1741,-32721,1708,-32723,1674,-32725,1641,-32726,1607,-32728,1574,-32730,1540,-32731,1507,-32733,1473,-32734,1440,-32736,1406,-32737,1373,-32739,1339,-32740,1306,-32741,1273,-32743,1239,-32744,1206,-32745,1172,-32747,1139,-32748,1105,-32749,1072,-32750,1038,-32751,1005,-32752,971,-32753,938,-32754,904,-32755,871,-32756,837,-32757,804,-32758,770,-32758,737,-32759,703,-32760,670,-32761,636,-32761,603,-32762,569,-32763,536,-32763,502,-32764,469,-32764,435,-32765,402,-32765,368,-32765,335,-32766,301,-32766,268,-32766,234,-32767,201,-32767,167,-32767,134,-32767,100,-32767,67,-32767,33,-32767,0,-32767,-34,-32767,-68,-32767,-101,-32767,-135,-32767,-168,-32767,-202,-32767,-235,-32767,-269,-32766,-302,-32766,-336,-32766,-369,-32765,-403,-32765,-436,-32765,-470,-32764,-503,-32764,-537,-32763,-570,-32763,-604,-32762,-637,-32761,-671,-32761,-704,-32760,-738,-32759,-771,-32758,-805,-32758,-838,-32757,-872,-32756,-905,-32755,-939,-32754,-972,-32753,-1006,-32752,-1039,-32751,-1073,-32750,-1106,-32749,-1140,-32748,-1173,-32747,-1207,-32745,-1240,-32744,-1274,-32743,-1307,-32741,-1340,-32740,-1374,-32739,-1407,-32737,-1441,-32736,-1474,-32734,-1508,-32733,-1541,-32731,-1575,-32730,-1608,-32728,-1642,-32726,-1675,-32725,-1709,-32723,-1742,-32721,-1776,-32719,-1809,-32718,-1843,-32716,-1876,-32714,-1909,-32712,-1943,-32710,-1976,-32708,-2010,-32706,-2043,-32704,-2077,-32702,-2110,-32700,-2144,-32697,-2177,-32695,-2210,-32693,-2244,-32691,-2277,-32688,-2311,-32686,-2344,-32684,-2378,-32681,-2411,-32679,-2444,-32676,-2478,-32674,-2511,-32671,-2545,-32669,-2578,-32666,-2611,-32663,-2645,-32661,-2678,-32658,-2712,-32655,-2745,-32652,-2778,-32650,-2812,-32647,-2845,-32644,-2879,-32641,-2912,-32638,-2945,-32635,-2979,-32632,-3012,-32629,-3045,-32626,-3079,-32623,-3112,-32619,-3146,-32616,-3179,-32613,-3212,-32610,-3246,-32606,-3279,-32603,-3312,-32600,-3346,-32596,-3379,-32593,-3412,-32589,-3446,-32586,-3479,-32582,-3512,-32579,-3546,-32575,-3579,-32572,-3612,-32568,-3645,-32564,-3679,-32560,-3712,-32557,-3745,-32553,-3779,-32549,-3812,-32545,-3845,-32541,-3878,-32537,-3912,-32533,-3945,-32529,-3978,-32525,-4012,-32521,-4045,-32517,-4078,-32513,-4111,-32509,-4145,-32504,-4178,-32500,-4211,-32496,-4244,-32492,-4277,-32487,-4311,-32483,-4344,-32478,-4377,-32474,-4410,-32469,-4444,-32465,-4477,-32460,-4510,-32456,-4543,-32451,-4576,-32446,-4609,-32442,-4643,-32437,-4676,-32432,-4709,-32427,-4742,-32423,-4775,-32418,-4808,-32413,-4842,-32408,-4875,-32403,-4908,-32398,-4941,-32393,-4974,-32388,-5007,-32383,-5040,-32378,-5073,-32372,-5107,-32367,-5140,-32362,-5173,-32357,-5206,-32351,-5239,-32346,-5272,-32341,-5305,-32335,-5338,-32330,-5371,-32324,-5404,-32319,-5437,-32313,-5470,-32308,-5503,-32302,-5536,-32296,-5569,-32291,-5602,-32285,-5635,-32279,-5668,-32274,-5701,-32268,-5734,-32262,-5767,-32256,-5800,-32250,-5833,-32244,-5866,-32238,-5899,-32232,-5932,-32226,-5965,-32220,-5998,-32214,-6031,-32208,-6064,-32202,-6097,-32195,-6130,-32189,-6163,-32183,-6196,-32177,-6229,-32170,-6262,-32164,-6294,-32157,-6327,-32151,-6360,-32144,-6393,-32138,-6426,-32131,-6459,-32125,-6492,-32118,-6524,-32111,-6557,-32105,-6590,-32098,-6623,-32091,-6656,-32085,-6689,-32078,-6721,-32071,-6754,-32064,-6787,-32057,-6820,-32050,-6852,-32043,-6885,-32036,-6918,-32029,-6951,-32022,-6983,-32015,-7016,-32008,-7049,-32000,-7082,-31993,-7114,-31986,-7147,-31979,-7180,-31971,-7212,-31964,-7245,-31957,-7278,-31949,-7311,-31942,-7343,-31934,-7376,-31927,-7408,-31919,-7441,-31912,-7474,-31904,-7506,-31896,-7539,-31889,-7572,-31881,-7604,-31873,-7637,-31865,-7669,-31857,-7702,-31850,-7734,-31842,-7767,-31834,-7800,-31826,-7832,-31818,-7865,-31810,-7897,-31802,-7930,-31794,-7962,-31786,-7995,-31777,-8027,-31769,-8060,-31761,-8092,-31753,-8125,-31744,-8157,-31736,-8190,-31728,-8222,-31719,-8254,-31711,-8287,-31702,-8319,-31694,-8352,-31685,-8384,-31677,-8416,-31668,-8449,-31660,-8481,-31651,-8514,-31642,-8546,-31634,-8578,-31625,-8611,-31616,-8643,-31607,-8675,-31598,-8708,-31589,-8740,-31581,-8772,-31572,-8804,-31563,-8837,-31554,-8869,-31545,-8901,-31535,-8933,-31526,-8966,-31517,-8998,-31508,-9030,-31499,-9062,-31490,-9095,-31480,-9127,-31471,-9159,-31462,-9191,-31452,-9223,-31443,-9255,-31433,-9288,-31424,-9320,-31414,-9352,-31405,-9384,-31395,-9416,-31386,-9448,-31376,-9480,-31366,-9512,-31357,-9544,-31347,-9576,-31337,-9608,-31327,-9640,-31317,-9672,-31308,-9704,-31298,-9736,-31288,-9768,-31278,-9800,-31268,-9832,-31258,-9864,-31248,-9896,-31237,-9928,-31227,-9960,-31217,-9992,-31207,-10024,-31197,-10056,-31186,-10088,-31176,-10120,-31166,-10152,-31155,-10183,-31145,-10215,-31135,-10247,-31124,-10279,-31114,-10311,-31103,-10343,-31093,-10374,-31082,-10406,-31071,-10438,-31061,-10470,-31050,-10501,-31039,-10533,-31029,-10565,-31018,-10597,-31007,-10628,-30996,-10660,-30985,-10692,-30974,-10723,-30963,-10755,-30952,-10787,-30941,-10818,-30930,-10850,-30919,-10881,-30908,-10913,-30897,-10945,-30886,-10976,-30875,-11008,-30863,-11039,-30852,-11071,-30841,-11102,-30829,-11134,-30818,-11165,-30807,-11197,-30795,-11228,-30784,-11260,-30772,-11291,-30761,-11323,-30749,-11354,-30738,-11386,-30726,-11417,-30714,-11449,-30703,-11480,-30691,-11511,-30679,-11543,-30667,-11574,-30656,-11605,-30644,-11637,-30632,-11668,-30620,-11699,-30608,-11731,-30596,-11762,-30584,-11793,-30572,-11824,-30560,-11856,-30548,-11887,-30536,-11918,-30523,-11949,-30511,-11981,-30499,-12012,-30487,-12043,-30474,-12074,-30462,-12105,-30450,-12136,-30437,-12167,-30425,-12199,-30412,-12230,-30400,-12261,-30387,-12292,-30375,-12323,-30362,-12354,-30350,-12385,-30337,-12416,-30324,-12447,-30312,-12478,-30299,-12509,-30286,-12540,-30273,-12571,-30260,-12602,-30248,-12633,-30235,-12664,-30222,-12695,-30209,-12725,-30196,-12756,-30183,-12787,-30170,-12818,-30157,-12849,-30143,-12880,-30130,-12910,-30117,-12941,-30104,-12972,-30091,-13003,-30077,-13034,-30064,-13064,-30051,-13095,-30037,-13126,-30024,-13156,-30010,-13187,-29997,-13218,-29984,-13248,-29970,-13279,-29956,-13310,-29943,-13340,-29929,-13371,-29916,-13401,-29902,-13432,-29888,-13463,-29874,-13493,-29861,-13524,-29847,-13554,-29833,-13585,-29819,-13615,-29805,-13646,-29791,-13676,-29777,-13707,-29763,-13737,-29749,-13767,-29735,-13798,-29721,-13828,-29707,-13859,-29693,-13889,-29679,-13919,-29664,-13950,-29650,-13980,-29636,-14010,-29622,-14040,-29607,-14071,-29593,-14101,-29578,-14131,-29564,-14161,-29549,-14192,-29535,-14222,-29520,-14252,-29506,-14282,-29491,-14312,-29477,-14343,-29462,-14373,-29447,-14403,-29433,-14433,-29418,-14463,-29403,-14493,-29388,-14523,-29373,-14553,-29359,-14583,-29344,-14613,-29329,-14643,-29314,-14673,-29299,-14703,-29284,-14733,-29269,-14763,-29254,-14793,-29239,-14823,-29223,-14853,-29208,-14882,-29193,-14912,-29178,-14942,-29163,-14972,-29147,-15002,-29132,-15031,-29117,-15061,-29101,-15091,-29086,-15121,-29070,-15150,-29055,-15180,-29039,-15210,-29024,-15239,-29008,-15269,-28993,-15299,-28977,-15328,-28961,-15358,-28946,-15388,-28930,-15417,-28914,-15447,-28898,-15476,-28883,-15506,-28867,-15535,-28851,-15565,-28835,-15594,-28819,-15624,-28803,-15653,-28787,-15683,-28771,-15712,-28755,-15741,-28739,-15771,-28723,-15800,-28707,-15830,-28691,-15859,-28674,-15888,-28658,-15918,-28642,-15947,-28626,-15976,-28609,-16005,-28593,-16035,-28576,-16064,-28560,-16093,-28544,-16122,-28527,-16151,-28511,-16180,-28494,-16210,-28478,-16239,-28461,-16268,-28444,-16297,-28428,-16326,-28411,-16355,-28394}; +int16_t twa6144[4096] __attribute__((aligned(32))) = {32767,0,32766,-34,32766,-68,32766,-101,32766,-135,32766,-168,32766,-202,32766,-235,32765,-269,32765,-302,32765,-336,32764,-369,32764,-403,32764,-436,32763,-470,32763,-503,32762,-537,32762,-570,32761,-604,32760,-637,32760,-671,32759,-704,32758,-738,32757,-771,32757,-805,32756,-838,32755,-872,32754,-905,32753,-939,32752,-972,32751,-1006,32750,-1039,32749,-1073,32748,-1106,32747,-1140,32746,-1173,32744,-1207,32743,-1240,32742,-1274,32740,-1307,32739,-1340,32738,-1374,32736,-1407,32735,-1441,32733,-1474,32732,-1508,32730,-1541,32729,-1575,32727,-1608,32725,-1642,32724,-1675,32722,-1709,32720,-1742,32718,-1776,32717,-1809,32715,-1843,32713,-1876,32711,-1909,32709,-1943,32707,-1976,32705,-2010,32703,-2043,32701,-2077,32699,-2110,32696,-2144,32694,-2177,32692,-2210,32690,-2244,32687,-2277,32685,-2311,32683,-2344,32680,-2378,32678,-2411,32675,-2444,32673,-2478,32670,-2511,32668,-2545,32665,-2578,32662,-2611,32660,-2645,32657,-2678,32654,-2712,32651,-2745,32649,-2778,32646,-2812,32643,-2845,32640,-2879,32637,-2912,32634,-2945,32631,-2979,32628,-3012,32625,-3045,32622,-3079,32618,-3112,32615,-3146,32612,-3179,32609,-3212,32605,-3246,32602,-3279,32599,-3312,32595,-3346,32592,-3379,32588,-3412,32585,-3446,32581,-3479,32578,-3512,32574,-3546,32571,-3579,32567,-3612,32563,-3645,32559,-3679,32556,-3712,32552,-3745,32548,-3779,32544,-3812,32540,-3845,32536,-3878,32532,-3912,32528,-3945,32524,-3978,32520,-4012,32516,-4045,32512,-4078,32508,-4111,32503,-4145,32499,-4178,32495,-4211,32491,-4244,32486,-4277,32482,-4311,32477,-4344,32473,-4377,32468,-4410,32464,-4444,32459,-4477,32455,-4510,32450,-4543,32445,-4576,32441,-4609,32436,-4643,32431,-4676,32426,-4709,32422,-4742,32417,-4775,32412,-4808,32407,-4842,32402,-4875,32397,-4908,32392,-4941,32387,-4974,32382,-5007,32377,-5040,32371,-5073,32366,-5107,32361,-5140,32356,-5173,32350,-5206,32345,-5239,32340,-5272,32334,-5305,32329,-5338,32323,-5371,32318,-5404,32312,-5437,32307,-5470,32301,-5503,32295,-5536,32290,-5569,32284,-5602,32278,-5635,32273,-5668,32267,-5701,32261,-5734,32255,-5767,32249,-5800,32243,-5833,32237,-5866,32231,-5899,32225,-5932,32219,-5965,32213,-5998,32207,-6031,32201,-6064,32194,-6097,32188,-6130,32182,-6163,32176,-6196,32169,-6229,32163,-6262,32156,-6294,32150,-6327,32143,-6360,32137,-6393,32130,-6426,32124,-6459,32117,-6492,32110,-6524,32104,-6557,32097,-6590,32090,-6623,32084,-6656,32077,-6689,32070,-6721,32063,-6754,32056,-6787,32049,-6820,32042,-6852,32035,-6885,32028,-6918,32021,-6951,32014,-6983,32007,-7016,31999,-7049,31992,-7082,31985,-7114,31978,-7147,31970,-7180,31963,-7212,31956,-7245,31948,-7278,31941,-7311,31933,-7343,31926,-7376,31918,-7408,31911,-7441,31903,-7474,31895,-7506,31888,-7539,31880,-7572,31872,-7604,31864,-7637,31856,-7669,31849,-7702,31841,-7734,31833,-7767,31825,-7800,31817,-7832,31809,-7865,31801,-7897,31793,-7930,31785,-7962,31776,-7995,31768,-8027,31760,-8060,31752,-8092,31743,-8125,31735,-8157,31727,-8190,31718,-8222,31710,-8254,31701,-8287,31693,-8319,31684,-8352,31676,-8384,31667,-8416,31659,-8449,31650,-8481,31641,-8514,31633,-8546,31624,-8578,31615,-8611,31606,-8643,31597,-8675,31588,-8708,31580,-8740,31571,-8772,31562,-8804,31553,-8837,31544,-8869,31534,-8901,31525,-8933,31516,-8966,31507,-8998,31498,-9030,31489,-9062,31479,-9095,31470,-9127,31461,-9159,31451,-9191,31442,-9223,31432,-9255,31423,-9288,31413,-9320,31404,-9352,31394,-9384,31385,-9416,31375,-9448,31365,-9480,31356,-9512,31346,-9544,31336,-9576,31326,-9608,31316,-9640,31307,-9672,31297,-9704,31287,-9736,31277,-9768,31267,-9800,31257,-9832,31247,-9864,31236,-9896,31226,-9928,31216,-9960,31206,-9992,31196,-10024,31185,-10056,31175,-10088,31165,-10120,31154,-10152,31144,-10183,31134,-10215,31123,-10247,31113,-10279,31102,-10311,31092,-10343,31081,-10374,31070,-10406,31060,-10438,31049,-10470,31038,-10501,31028,-10533,31017,-10565,31006,-10597,30995,-10628,30984,-10660,30973,-10692,30962,-10723,30951,-10755,30940,-10787,30929,-10818,30918,-10850,30907,-10881,30896,-10913,30885,-10945,30874,-10976,30862,-11008,30851,-11039,30840,-11071,30828,-11102,30817,-11134,30806,-11165,30794,-11197,30783,-11228,30771,-11260,30760,-11291,30748,-11323,30737,-11354,30725,-11386,30713,-11417,30702,-11449,30690,-11480,30678,-11511,30666,-11543,30655,-11574,30643,-11605,30631,-11637,30619,-11668,30607,-11699,30595,-11731,30583,-11762,30571,-11793,30559,-11824,30547,-11856,30535,-11887,30522,-11918,30510,-11949,30498,-11981,30486,-12012,30473,-12043,30461,-12074,30449,-12105,30436,-12136,30424,-12167,30411,-12199,30399,-12230,30386,-12261,30374,-12292,30361,-12323,30349,-12354,30336,-12385,30323,-12416,30311,-12447,30298,-12478,30285,-12509,30272,-12540,30259,-12571,30247,-12602,30234,-12633,30221,-12664,30208,-12695,30195,-12725,30182,-12756,30169,-12787,30156,-12818,30142,-12849,30129,-12880,30116,-12910,30103,-12941,30090,-12972,30076,-13003,30063,-13034,30050,-13064,30036,-13095,30023,-13126,30009,-13156,29996,-13187,29983,-13218,29969,-13248,29955,-13279,29942,-13310,29928,-13340,29915,-13371,29901,-13401,29887,-13432,29873,-13463,29860,-13493,29846,-13524,29832,-13554,29818,-13585,29804,-13615,29790,-13646,29776,-13676,29762,-13707,29748,-13737,29734,-13767,29720,-13798,29706,-13828,29692,-13859,29678,-13889,29663,-13919,29649,-13950,29635,-13980,29621,-14010,29606,-14040,29592,-14071,29577,-14101,29563,-14131,29548,-14161,29534,-14192,29519,-14222,29505,-14252,29490,-14282,29476,-14312,29461,-14343,29446,-14373,29432,-14403,29417,-14433,29402,-14463,29387,-14493,29372,-14523,29358,-14553,29343,-14583,29328,-14613,29313,-14643,29298,-14673,29283,-14703,29268,-14733,29253,-14763,29238,-14793,29222,-14823,29207,-14853,29192,-14882,29177,-14912,29162,-14942,29146,-14972,29131,-15002,29116,-15031,29100,-15061,29085,-15091,29069,-15121,29054,-15150,29038,-15180,29023,-15210,29007,-15239,28992,-15269,28976,-15299,28960,-15328,28945,-15358,28929,-15388,28913,-15417,28897,-15447,28882,-15476,28866,-15506,28850,-15535,28834,-15565,28818,-15594,28802,-15624,28786,-15653,28770,-15683,28754,-15712,28738,-15741,28722,-15771,28706,-15800,28690,-15830,28673,-15859,28657,-15888,28641,-15918,28625,-15947,28608,-15976,28592,-16005,28575,-16035,28559,-16064,28543,-16093,28526,-16122,28510,-16151,28493,-16180,28477,-16210,28460,-16239,28443,-16268,28427,-16297,28410,-16326,28393,-16355,28377,-16384,28360,-16413,28343,-16442,28326,-16471,28309,-16500,28292,-16529,28275,-16558,28259,-16587,28242,-16616,28225,-16644,28208,-16673,28190,-16702,28173,-16731,28156,-16760,28139,-16789,28122,-16817,28105,-16846,28087,-16875,28070,-16904,28053,-16932,28036,-16961,28018,-16990,28001,-17018,27983,-17047,27966,-17075,27948,-17104,27931,-17133,27913,-17161,27896,-17190,27878,-17218,27861,-17247,27843,-17275,27825,-17304,27808,-17332,27790,-17361,27772,-17389,27754,-17417,27736,-17446,27719,-17474,27701,-17502,27683,-17531,27665,-17559,27647,-17587,27629,-17616,27611,-17644,27593,-17672,27575,-17700,27557,-17728,27538,-17757,27520,-17785,27502,-17813,27484,-17841,27466,-17869,27447,-17897,27429,-17925,27411,-17953,27392,-17981,27374,-18009,27355,-18037,27337,-18065,27319,-18093,27300,-18121,27281,-18149,27263,-18177,27244,-18205,27226,-18233,27207,-18261,27188,-18288,27170,-18316,27151,-18344,27132,-18372,27113,-18399,27094,-18427,27076,-18455,27057,-18483,27038,-18510,27019,-18538,27000,-18565,26981,-18593,26962,-18621,26943,-18648,26924,-18676,26905,-18703,26885,-18731,26866,-18758,26847,-18786,26828,-18813,26809,-18841,26789,-18868,26770,-18895,26751,-18923,26731,-18950,26712,-18977,26692,-19005,26673,-19032,26654,-19059,26634,-19087,26615,-19114,26595,-19141,26575,-19168,26556,-19195,26536,-19222,26516,-19250,26497,-19277,26477,-19304,26457,-19331,26437,-19358,26418,-19385,26398,-19412,26378,-19439,26358,-19466,26338,-19493,26318,-19520,26298,-19547,26278,-19574,26258,-19600,26238,-19627,26218,-19654,26198,-19681,26178,-19708,26158,-19734,26137,-19761,26117,-19788,26097,-19815,26077,-19841,26056,-19868,26036,-19895,26016,-19921,25995,-19948,25975,-19974,25954,-20001,25934,-20027,25913,-20054,25893,-20080,25872,-20107,25852,-20133,25831,-20160,25811,-20186,25790,-20213,25769,-20239,25749,-20265,25728,-20292,25707,-20318,25686,-20344,25665,-20370,25645,-20397,25624,-20423,25603,-20449,25582,-20475,25561,-20501,25540,-20528,25519,-20554,25498,-20580,25477,-20606,25456,-20632,25435,-20658,25414,-20684,25392,-20710,25371,-20736,25350,-20762,25329,-20788,25307,-20814,25286,-20839,25265,-20865,25243,-20891,25222,-20917,25201,-20943,25179,-20968,25158,-20994,25136,-21020,25115,-21046,25093,-21071,25072,-21097,25050,-21123,25029,-21148,25007,-21174,24985,-21199,24964,-21225,24942,-21250,24920,-21276,24898,-21301,24877,-21327,24855,-21352,24833,-21378,24811,-21403,24789,-21428,24767,-21454,24745,-21479,24723,-21504,24701,-21530,24679,-21555,24657,-21580,24635,-21605,24613,-21630,24591,-21656,24569,-21681,24546,-21706,24524,-21731,24502,-21756,24480,-21781,24457,-21806,24435,-21831,24413,-21856,24390,-21881,24368,-21906,24346,-21931,24323,-21956,24301,-21981,24278,-22005,24256,-22030,24233,-22055,24211,-22080,24188,-22105,24165,-22129,24143,-22154,24120,-22179,24097,-22203,24075,-22228,24052,-22253,24029,-22277,24006,-22302,23984,-22326,23961,-22351,23938,-22375,23915,-22400,23892,-22424,23869,-22449,23846,-22473,23823,-22497,23800,-22522,23777,-22546,23754,-22570,23731,-22595,23708,-22619,23685,-22643,23661,-22667,23638,-22692,23615,-22716,23592,-22740,23569,-22764,23545,-22788,23522,-22812,23499,-22836,23475,-22860,23452,-22884,23428,-22908,23405,-22932,23382,-22956,23358,-22980,23335,-23004,23311,-23028,23287,-23051,23264,-23075,23240,-23099,23217,-23123,23193,-23147,23169,-23170,23146,-23194,23122,-23218,23098,-23241,23074,-23265,23050,-23288,23027,-23312,23003,-23336,22979,-23359,22955,-23383,22931,-23406,22907,-23429,22883,-23453,22859,-23476,22835,-23500,22811,-23523,22787,-23546,22763,-23570,22739,-23593,22715,-23616,22691,-23639,22666,-23662,22642,-23686,22618,-23709,22594,-23732,22569,-23755,22545,-23778,22521,-23801,22496,-23824,22472,-23847,22448,-23870,22423,-23893,22399,-23916,22374,-23939,22350,-23962,22325,-23985,22301,-24007,22276,-24030,22252,-24053,22227,-24076,22202,-24098,22178,-24121,22153,-24144,22128,-24166,22104,-24189,22079,-24212,22054,-24234,22029,-24257,22004,-24279,21980,-24302,21955,-24324,21930,-24347,21905,-24369,21880,-24391,21855,-24414,21830,-24436,21805,-24458,21780,-24481,21755,-24503,21730,-24525,21705,-24547,21680,-24570,21655,-24592,21629,-24614,21604,-24636,21579,-24658,21554,-24680,21529,-24702,21503,-24724,21478,-24746,21453,-24768,21427,-24790,21402,-24812,21377,-24834,21351,-24856,21326,-24878,21300,-24899,21275,-24921,21249,-24943,21224,-24965,21198,-24986,21173,-25008,21147,-25030,21122,-25051,21096,-25073,21070,-25094,21045,-25116,21019,-25137,20993,-25159,20967,-25180,20942,-25202,20916,-25223,20890,-25244,20864,-25266,20838,-25287,20813,-25308,20787,-25330,20761,-25351,20735,-25372,20709,-25393,20683,-25415,20657,-25436,20631,-25457,20605,-25478,20579,-25499,20553,-25520,20527,-25541,20500,-25562,20474,-25583,20448,-25604,20422,-25625,20396,-25646,20369,-25666,20343,-25687,20317,-25708,20291,-25729,20264,-25750,20238,-25770,20212,-25791,20185,-25812,20159,-25832,20132,-25853,20106,-25873,20079,-25894,20053,-25914,20026,-25935,20000,-25955,19973,-25976,19947,-25996,19920,-26017,19894,-26037,19867,-26057,19840,-26078,19814,-26098,19787,-26118,19760,-26138,19733,-26159,19707,-26179,19680,-26199,19653,-26219,19626,-26239,19599,-26259,19573,-26279,19546,-26299,19519,-26319,19492,-26339,19465,-26359,19438,-26379,19411,-26399,19384,-26419,19357,-26438,19330,-26458,19303,-26478,19276,-26498,19249,-26517,19221,-26537,19194,-26557,19167,-26576,19140,-26596,19113,-26616,19086,-26635,19058,-26655,19031,-26674,19004,-26693,18976,-26713,18949,-26732,18922,-26752,18894,-26771,18867,-26790,18840,-26810,18812,-26829,18785,-26848,18757,-26867,18730,-26886,18702,-26906,18675,-26925,18647,-26944,18620,-26963,18592,-26982,18564,-27001,18537,-27020,18509,-27039,18482,-27058,18454,-27077,18426,-27095,18398,-27114,18371,-27133,18343,-27152,18315,-27171,18287,-27189,18260,-27208,18232,-27227,18204,-27245,18176,-27264,18148,-27282,18120,-27301,18092,-27320,18064,-27338,18036,-27356,18008,-27375,17980,-27393,17952,-27412,17924,-27430,17896,-27448,17868,-27467,17840,-27485,17812,-27503,17784,-27521,17756,-27539,17727,-27558,17699,-27576,17671,-27594,17643,-27612,17615,-27630,17586,-27648,17558,-27666,17530,-27684,17501,-27702,17473,-27720,17445,-27737,17416,-27755,17388,-27773,17360,-27791,17331,-27809,17303,-27826,17274,-27844,17246,-27862,17217,-27879,17189,-27897,17160,-27914,17132,-27932,17103,-27949,17074,-27967,17046,-27984,17017,-28002,16989,-28019,16960,-28037,16931,-28054,16903,-28071,16874,-28088,16845,-28106,16816,-28123,16788,-28140,16759,-28157,16730,-28174,16701,-28191,16672,-28209,16643,-28226,16615,-28243,16586,-28260,16557,-28276,16528,-28293,16499,-28310,16470,-28327,16441,-28344,16412,-28361,16383,-28378,16354,-28394,16325,-28411,16296,-28428,16267,-28444,16238,-28461,16209,-28478,16179,-28494,16150,-28511,16121,-28527,16092,-28544,16063,-28560,16034,-28576,16004,-28593,15975,-28609,15946,-28626,15917,-28642,15887,-28658,15858,-28674,15829,-28691,15799,-28707,15770,-28723,15740,-28739,15711,-28755,15682,-28771,15652,-28787,15623,-28803,15593,-28819,15564,-28835,15534,-28851,15505,-28867,15475,-28883,15446,-28898,15416,-28914,15387,-28930,15357,-28946,15327,-28961,15298,-28977,15268,-28993,15238,-29008,15209,-29024,15179,-29039,15149,-29055,15120,-29070,15090,-29086,15060,-29101,15030,-29117,15001,-29132,14971,-29147,14941,-29163,14911,-29178,14881,-29193,14852,-29208,14822,-29223,14792,-29239,14762,-29254,14732,-29269,14702,-29284,14672,-29299,14642,-29314,14612,-29329,14582,-29344,14552,-29359,14522,-29373,14492,-29388,14462,-29403,14432,-29418,14402,-29433,14372,-29447,14342,-29462,14311,-29477,14281,-29491,14251,-29506,14221,-29520,14191,-29535,14160,-29549,14130,-29564,14100,-29578,14070,-29593,14039,-29607,14009,-29622,13979,-29636,13949,-29650,13918,-29664,13888,-29679,13858,-29693,13827,-29707,13797,-29721,13766,-29735,13736,-29749,13706,-29763,13675,-29777,13645,-29791,13614,-29805,13584,-29819,13553,-29833,13523,-29847,13492,-29861,13462,-29874,13431,-29888,13400,-29902,13370,-29916,13339,-29929,13309,-29943,13278,-29956,13247,-29970,13217,-29984,13186,-29997,13155,-30010,13125,-30024,13094,-30037,13063,-30051,13033,-30064,13002,-30077,12971,-30091,12940,-30104,12909,-30117,12879,-30130,12848,-30143,12817,-30157,12786,-30170,12755,-30183,12724,-30196,12694,-30209,12663,-30222,12632,-30235,12601,-30248,12570,-30260,12539,-30273,12508,-30286,12477,-30299,12446,-30312,12415,-30324,12384,-30337,12353,-30350,12322,-30362,12291,-30375,12260,-30387,12229,-30400,12198,-30412,12166,-30425,12135,-30437,12104,-30450,12073,-30462,12042,-30474,12011,-30487,11980,-30499,11948,-30511,11917,-30523,11886,-30536,11855,-30548,11823,-30560,11792,-30572,11761,-30584,11730,-30596,11698,-30608,11667,-30620,11636,-30632,11604,-30644,11573,-30656,11542,-30667,11510,-30679,11479,-30691,11448,-30703,11416,-30714,11385,-30726,11353,-30738,11322,-30749,11290,-30761,11259,-30772,11227,-30784,11196,-30795,11164,-30807,11133,-30818,11101,-30829,11070,-30841,11038,-30852,11007,-30863,10975,-30875,10944,-30886,10912,-30897,10880,-30908,10849,-30919,10817,-30930,10786,-30941,10754,-30952,10722,-30963,10691,-30974,10659,-30985,10627,-30996,10596,-31007,10564,-31018,10532,-31029,10500,-31039,10469,-31050,10437,-31061,10405,-31071,10373,-31082,10342,-31093,10310,-31103,10278,-31114,10246,-31124,10214,-31135,10182,-31145,10151,-31155,10119,-31166,10087,-31176,10055,-31186,10023,-31197,9991,-31207,9959,-31217,9927,-31227,9895,-31237,9863,-31248,9831,-31258,9799,-31268,9767,-31278,9735,-31288,9703,-31298,9671,-31308,9639,-31317,9607,-31327,9575,-31337,9543,-31347,9511,-31357,9479,-31366,9447,-31376,9415,-31386,9383,-31395,9351,-31405,9319,-31414,9287,-31424,9254,-31433,9222,-31443,9190,-31452,9158,-31462,9126,-31471,9094,-31480,9061,-31490,9029,-31499,8997,-31508,8965,-31517,8932,-31526,8900,-31535,8868,-31545,8836,-31554,8803,-31563,8771,-31572,8739,-31581,8707,-31589,8674,-31598,8642,-31607,8610,-31616,8577,-31625,8545,-31634,8513,-31642,8480,-31651,8448,-31660,8415,-31668,8383,-31677,8351,-31685,8318,-31694,8286,-31702,8253,-31711,8221,-31719,8189,-31728,8156,-31736,8124,-31744,8091,-31753,8059,-31761,8026,-31769,7994,-31777,7961,-31786,7929,-31794,7896,-31802,7864,-31810,7831,-31818,7799,-31826,7766,-31834,7733,-31842,7701,-31850,7668,-31857,7636,-31865,7603,-31873,7571,-31881,7538,-31889,7505,-31896,7473,-31904,7440,-31912,7407,-31919,7375,-31927,7342,-31934,7310,-31942,7277,-31949,7244,-31957,7211,-31964,7179,-31971,7146,-31979,7113,-31986,7081,-31993,7048,-32000,7015,-32008,6982,-32015,6950,-32022,6917,-32029,6884,-32036,6851,-32043,6819,-32050,6786,-32057,6753,-32064,6720,-32071,6688,-32078,6655,-32085,6622,-32091,6589,-32098,6556,-32105,6523,-32111,6491,-32118,6458,-32125,6425,-32131,6392,-32138,6359,-32144,6326,-32151,6293,-32157,6261,-32164,6228,-32170,6195,-32177,6162,-32183,6129,-32189,6096,-32195,6063,-32202,6030,-32208,5997,-32214,5964,-32220,5931,-32226,5898,-32232,5865,-32238,5832,-32244,5799,-32250,5766,-32256,5733,-32262,5700,-32268,5667,-32274,5634,-32279,5601,-32285,5568,-32291,5535,-32296,5502,-32302,5469,-32308,5436,-32313,5403,-32319,5370,-32324,5337,-32330,5304,-32335,5271,-32341,5238,-32346,5205,-32351,5172,-32357,5139,-32362,5106,-32367,5072,-32372,5039,-32378,5006,-32383,4973,-32388,4940,-32393,4907,-32398,4874,-32403,4841,-32408,4807,-32413,4774,-32418,4741,-32423,4708,-32427,4675,-32432,4642,-32437,4608,-32442,4575,-32446,4542,-32451,4509,-32456,4476,-32460,4443,-32465,4409,-32469,4376,-32474,4343,-32478,4310,-32483,4276,-32487,4243,-32492,4210,-32496,4177,-32500,4144,-32504,4110,-32509,4077,-32513,4044,-32517,4011,-32521,3977,-32525,3944,-32529,3911,-32533,3877,-32537,3844,-32541,3811,-32545,3778,-32549,3744,-32553,3711,-32557,3678,-32560,3644,-32564,3611,-32568,3578,-32572,3545,-32575,3511,-32579,3478,-32582,3445,-32586,3411,-32589,3378,-32593,3345,-32596,3311,-32600,3278,-32603,3245,-32606,3211,-32610,3178,-32613,3145,-32616,3111,-32619,3078,-32623,3044,-32626,3011,-32629,2978,-32632,2944,-32635,2911,-32638,2878,-32641,2844,-32644,2811,-32647,2777,-32650,2744,-32652,2711,-32655,2677,-32658,2644,-32661,2610,-32663,2577,-32666,2544,-32669,2510,-32671,2477,-32674,2443,-32676,2410,-32679,2377,-32681,2343,-32684,2310,-32686,2276,-32688,2243,-32691,2209,-32693,2176,-32695,2143,-32697,2109,-32700,2076,-32702,2042,-32704,2009,-32706,1975,-32708,1942,-32710,1908,-32712,1875,-32714,1842,-32716,1808,-32718,1775,-32719,1741,-32721,1708,-32723,1674,-32725,1641,-32726,1607,-32728,1574,-32730,1540,-32731,1507,-32733,1473,-32734,1440,-32736,1406,-32737,1373,-32739,1339,-32740,1306,-32741,1273,-32743,1239,-32744,1206,-32745,1172,-32747,1139,-32748,1105,-32749,1072,-32750,1038,-32751,1005,-32752,971,-32753,938,-32754,904,-32755,871,-32756,837,-32757,804,-32758,770,-32758,737,-32759,703,-32760,670,-32761,636,-32761,603,-32762,569,-32763,536,-32763,502,-32764,469,-32764,435,-32765,402,-32765,368,-32765,335,-32766,301,-32766,268,-32766,234,-32767,201,-32767,167,-32767,134,-32767,100,-32767,67,-32767,33,-32767,0,-32767,-34,-32767,-68,-32767,-101,-32767,-135,-32767,-168,-32767,-202,-32767,-235,-32767,-269,-32766,-302,-32766,-336,-32766,-369,-32765,-403,-32765,-436,-32765,-470,-32764,-503,-32764,-537,-32763,-570,-32763,-604,-32762,-637,-32761,-671,-32761,-704,-32760,-738,-32759,-771,-32758,-805,-32758,-838,-32757,-872,-32756,-905,-32755,-939,-32754,-972,-32753,-1006,-32752,-1039,-32751,-1073,-32750,-1106,-32749,-1140,-32748,-1173,-32747,-1207,-32745,-1240,-32744,-1274,-32743,-1307,-32741,-1340,-32740,-1374,-32739,-1407,-32737,-1441,-32736,-1474,-32734,-1508,-32733,-1541,-32731,-1575,-32730,-1608,-32728,-1642,-32726,-1675,-32725,-1709,-32723,-1742,-32721,-1776,-32719,-1809,-32718,-1843,-32716,-1876,-32714,-1909,-32712,-1943,-32710,-1976,-32708,-2010,-32706,-2043,-32704,-2077,-32702,-2110,-32700,-2144,-32697,-2177,-32695,-2210,-32693,-2244,-32691,-2277,-32688,-2311,-32686,-2344,-32684,-2378,-32681,-2411,-32679,-2444,-32676,-2478,-32674,-2511,-32671,-2545,-32669,-2578,-32666,-2611,-32663,-2645,-32661,-2678,-32658,-2712,-32655,-2745,-32652,-2778,-32650,-2812,-32647,-2845,-32644,-2879,-32641,-2912,-32638,-2945,-32635,-2979,-32632,-3012,-32629,-3045,-32626,-3079,-32623,-3112,-32619,-3146,-32616,-3179,-32613,-3212,-32610,-3246,-32606,-3279,-32603,-3312,-32600,-3346,-32596,-3379,-32593,-3412,-32589,-3446,-32586,-3479,-32582,-3512,-32579,-3546,-32575,-3579,-32572,-3612,-32568,-3645,-32564,-3679,-32560,-3712,-32557,-3745,-32553,-3779,-32549,-3812,-32545,-3845,-32541,-3878,-32537,-3912,-32533,-3945,-32529,-3978,-32525,-4012,-32521,-4045,-32517,-4078,-32513,-4111,-32509,-4145,-32504,-4178,-32500,-4211,-32496,-4244,-32492,-4277,-32487,-4311,-32483,-4344,-32478,-4377,-32474,-4410,-32469,-4444,-32465,-4477,-32460,-4510,-32456,-4543,-32451,-4576,-32446,-4609,-32442,-4643,-32437,-4676,-32432,-4709,-32427,-4742,-32423,-4775,-32418,-4808,-32413,-4842,-32408,-4875,-32403,-4908,-32398,-4941,-32393,-4974,-32388,-5007,-32383,-5040,-32378,-5073,-32372,-5107,-32367,-5140,-32362,-5173,-32357,-5206,-32351,-5239,-32346,-5272,-32341,-5305,-32335,-5338,-32330,-5371,-32324,-5404,-32319,-5437,-32313,-5470,-32308,-5503,-32302,-5536,-32296,-5569,-32291,-5602,-32285,-5635,-32279,-5668,-32274,-5701,-32268,-5734,-32262,-5767,-32256,-5800,-32250,-5833,-32244,-5866,-32238,-5899,-32232,-5932,-32226,-5965,-32220,-5998,-32214,-6031,-32208,-6064,-32202,-6097,-32195,-6130,-32189,-6163,-32183,-6196,-32177,-6229,-32170,-6262,-32164,-6294,-32157,-6327,-32151,-6360,-32144,-6393,-32138,-6426,-32131,-6459,-32125,-6492,-32118,-6524,-32111,-6557,-32105,-6590,-32098,-6623,-32091,-6656,-32085,-6689,-32078,-6721,-32071,-6754,-32064,-6787,-32057,-6820,-32050,-6852,-32043,-6885,-32036,-6918,-32029,-6951,-32022,-6983,-32015,-7016,-32008,-7049,-32000,-7082,-31993,-7114,-31986,-7147,-31979,-7180,-31971,-7212,-31964,-7245,-31957,-7278,-31949,-7311,-31942,-7343,-31934,-7376,-31927,-7408,-31919,-7441,-31912,-7474,-31904,-7506,-31896,-7539,-31889,-7572,-31881,-7604,-31873,-7637,-31865,-7669,-31857,-7702,-31850,-7734,-31842,-7767,-31834,-7800,-31826,-7832,-31818,-7865,-31810,-7897,-31802,-7930,-31794,-7962,-31786,-7995,-31777,-8027,-31769,-8060,-31761,-8092,-31753,-8125,-31744,-8157,-31736,-8190,-31728,-8222,-31719,-8254,-31711,-8287,-31702,-8319,-31694,-8352,-31685,-8384,-31677,-8416,-31668,-8449,-31660,-8481,-31651,-8514,-31642,-8546,-31634,-8578,-31625,-8611,-31616,-8643,-31607,-8675,-31598,-8708,-31589,-8740,-31581,-8772,-31572,-8804,-31563,-8837,-31554,-8869,-31545,-8901,-31535,-8933,-31526,-8966,-31517,-8998,-31508,-9030,-31499,-9062,-31490,-9095,-31480,-9127,-31471,-9159,-31462,-9191,-31452,-9223,-31443,-9255,-31433,-9288,-31424,-9320,-31414,-9352,-31405,-9384,-31395,-9416,-31386,-9448,-31376,-9480,-31366,-9512,-31357,-9544,-31347,-9576,-31337,-9608,-31327,-9640,-31317,-9672,-31308,-9704,-31298,-9736,-31288,-9768,-31278,-9800,-31268,-9832,-31258,-9864,-31248,-9896,-31237,-9928,-31227,-9960,-31217,-9992,-31207,-10024,-31197,-10056,-31186,-10088,-31176,-10120,-31166,-10152,-31155,-10183,-31145,-10215,-31135,-10247,-31124,-10279,-31114,-10311,-31103,-10343,-31093,-10374,-31082,-10406,-31071,-10438,-31061,-10470,-31050,-10501,-31039,-10533,-31029,-10565,-31018,-10597,-31007,-10628,-30996,-10660,-30985,-10692,-30974,-10723,-30963,-10755,-30952,-10787,-30941,-10818,-30930,-10850,-30919,-10881,-30908,-10913,-30897,-10945,-30886,-10976,-30875,-11008,-30863,-11039,-30852,-11071,-30841,-11102,-30829,-11134,-30818,-11165,-30807,-11197,-30795,-11228,-30784,-11260,-30772,-11291,-30761,-11323,-30749,-11354,-30738,-11386,-30726,-11417,-30714,-11449,-30703,-11480,-30691,-11511,-30679,-11543,-30667,-11574,-30656,-11605,-30644,-11637,-30632,-11668,-30620,-11699,-30608,-11731,-30596,-11762,-30584,-11793,-30572,-11824,-30560,-11856,-30548,-11887,-30536,-11918,-30523,-11949,-30511,-11981,-30499,-12012,-30487,-12043,-30474,-12074,-30462,-12105,-30450,-12136,-30437,-12167,-30425,-12199,-30412,-12230,-30400,-12261,-30387,-12292,-30375,-12323,-30362,-12354,-30350,-12385,-30337,-12416,-30324,-12447,-30312,-12478,-30299,-12509,-30286,-12540,-30273,-12571,-30260,-12602,-30248,-12633,-30235,-12664,-30222,-12695,-30209,-12725,-30196,-12756,-30183,-12787,-30170,-12818,-30157,-12849,-30143,-12880,-30130,-12910,-30117,-12941,-30104,-12972,-30091,-13003,-30077,-13034,-30064,-13064,-30051,-13095,-30037,-13126,-30024,-13156,-30010,-13187,-29997,-13218,-29984,-13248,-29970,-13279,-29956,-13310,-29943,-13340,-29929,-13371,-29916,-13401,-29902,-13432,-29888,-13463,-29874,-13493,-29861,-13524,-29847,-13554,-29833,-13585,-29819,-13615,-29805,-13646,-29791,-13676,-29777,-13707,-29763,-13737,-29749,-13767,-29735,-13798,-29721,-13828,-29707,-13859,-29693,-13889,-29679,-13919,-29664,-13950,-29650,-13980,-29636,-14010,-29622,-14040,-29607,-14071,-29593,-14101,-29578,-14131,-29564,-14161,-29549,-14192,-29535,-14222,-29520,-14252,-29506,-14282,-29491,-14312,-29477,-14343,-29462,-14373,-29447,-14403,-29433,-14433,-29418,-14463,-29403,-14493,-29388,-14523,-29373,-14553,-29359,-14583,-29344,-14613,-29329,-14643,-29314,-14673,-29299,-14703,-29284,-14733,-29269,-14763,-29254,-14793,-29239,-14823,-29223,-14853,-29208,-14882,-29193,-14912,-29178,-14942,-29163,-14972,-29147,-15002,-29132,-15031,-29117,-15061,-29101,-15091,-29086,-15121,-29070,-15150,-29055,-15180,-29039,-15210,-29024,-15239,-29008,-15269,-28993,-15299,-28977,-15328,-28961,-15358,-28946,-15388,-28930,-15417,-28914,-15447,-28898,-15476,-28883,-15506,-28867,-15535,-28851,-15565,-28835,-15594,-28819,-15624,-28803,-15653,-28787,-15683,-28771,-15712,-28755,-15741,-28739,-15771,-28723,-15800,-28707,-15830,-28691,-15859,-28674,-15888,-28658,-15918,-28642,-15947,-28626,-15976,-28609,-16005,-28593,-16035,-28576,-16064,-28560,-16093,-28544,-16122,-28527,-16151,-28511,-16180,-28494,-16210,-28478,-16239,-28461,-16268,-28444,-16297,-28428,-16326,-28411,-16355,-28394}; -int16_t twb6144[4096] __attribute__((aligned(16))) = {32767,0,32766,-68,32766,-135,32766,-202,32765,-269,32765,-336,32764,-403,32763,-470,32762,-537,32761,-604,32760,-671,32758,-738,32757,-805,32755,-872,32753,-939,32751,-1006,32749,-1073,32747,-1140,32744,-1207,32742,-1274,32739,-1340,32736,-1407,32733,-1474,32730,-1541,32727,-1608,32724,-1675,32720,-1742,32717,-1809,32713,-1876,32709,-1943,32705,-2010,32701,-2077,32696,-2144,32692,-2210,32687,-2277,32683,-2344,32678,-2411,32673,-2478,32668,-2545,32662,-2611,32657,-2678,32651,-2745,32646,-2812,32640,-2879,32634,-2945,32628,-3012,32622,-3079,32615,-3146,32609,-3212,32602,-3279,32595,-3346,32588,-3412,32581,-3479,32574,-3546,32567,-3612,32559,-3679,32552,-3745,32544,-3812,32536,-3878,32528,-3945,32520,-4012,32512,-4078,32503,-4145,32495,-4211,32486,-4277,32477,-4344,32468,-4410,32459,-4477,32450,-4543,32441,-4609,32431,-4676,32422,-4742,32412,-4808,32402,-4875,32392,-4941,32382,-5007,32371,-5073,32361,-5140,32350,-5206,32340,-5272,32329,-5338,32318,-5404,32307,-5470,32295,-5536,32284,-5602,32273,-5668,32261,-5734,32249,-5800,32237,-5866,32225,-5932,32213,-5998,32201,-6064,32188,-6130,32176,-6196,32163,-6262,32150,-6327,32137,-6393,32124,-6459,32110,-6524,32097,-6590,32084,-6656,32070,-6721,32056,-6787,32042,-6852,32028,-6918,32014,-6983,31999,-7049,31985,-7114,31970,-7180,31956,-7245,31941,-7311,31926,-7376,31911,-7441,31895,-7506,31880,-7572,31864,-7637,31849,-7702,31833,-7767,31817,-7832,31801,-7897,31785,-7962,31768,-8027,31752,-8092,31735,-8157,31718,-8222,31701,-8287,31684,-8352,31667,-8416,31650,-8481,31633,-8546,31615,-8611,31597,-8675,31580,-8740,31562,-8804,31544,-8869,31525,-8933,31507,-8998,31489,-9062,31470,-9127,31451,-9191,31432,-9255,31413,-9320,31394,-9384,31375,-9448,31356,-9512,31336,-9576,31316,-9640,31297,-9704,31277,-9768,31257,-9832,31236,-9896,31216,-9960,31196,-10024,31175,-10088,31154,-10152,31134,-10215,31113,-10279,31092,-10343,31070,-10406,31049,-10470,31028,-10533,31006,-10597,30984,-10660,30962,-10723,30940,-10787,30918,-10850,30896,-10913,30874,-10976,30851,-11039,30828,-11102,30806,-11165,30783,-11228,30760,-11291,30737,-11354,30713,-11417,30690,-11480,30666,-11543,30643,-11605,30619,-11668,30595,-11731,30571,-11793,30547,-11856,30522,-11918,30498,-11981,30473,-12043,30449,-12105,30424,-12167,30399,-12230,30374,-12292,30349,-12354,30323,-12416,30298,-12478,30272,-12540,30247,-12602,30221,-12664,30195,-12725,30169,-12787,30142,-12849,30116,-12910,30090,-12972,30063,-13034,30036,-13095,30009,-13156,29983,-13218,29955,-13279,29928,-13340,29901,-13401,29873,-13463,29846,-13524,29818,-13585,29790,-13646,29762,-13707,29734,-13767,29706,-13828,29678,-13889,29649,-13950,29621,-14010,29592,-14071,29563,-14131,29534,-14192,29505,-14252,29476,-14312,29446,-14373,29417,-14433,29387,-14493,29358,-14553,29328,-14613,29298,-14673,29268,-14733,29238,-14793,29207,-14853,29177,-14912,29146,-14972,29116,-15031,29085,-15091,29054,-15150,29023,-15210,28992,-15269,28960,-15328,28929,-15388,28897,-15447,28866,-15506,28834,-15565,28802,-15624,28770,-15683,28738,-15741,28706,-15800,28673,-15859,28641,-15918,28608,-15976,28575,-16035,28543,-16093,28510,-16151,28477,-16210,28443,-16268,28410,-16326,28377,-16384,28343,-16442,28309,-16500,28275,-16558,28242,-16616,28208,-16673,28173,-16731,28139,-16789,28105,-16846,28070,-16904,28036,-16961,28001,-17018,27966,-17075,27931,-17133,27896,-17190,27861,-17247,27825,-17304,27790,-17361,27754,-17417,27719,-17474,27683,-17531,27647,-17587,27611,-17644,27575,-17700,27538,-17757,27502,-17813,27466,-17869,27429,-17925,27392,-17981,27355,-18037,27319,-18093,27281,-18149,27244,-18205,27207,-18261,27170,-18316,27132,-18372,27094,-18427,27057,-18483,27019,-18538,26981,-18593,26943,-18648,26905,-18703,26866,-18758,26828,-18813,26789,-18868,26751,-18923,26712,-18977,26673,-19032,26634,-19087,26595,-19141,26556,-19195,26516,-19250,26477,-19304,26437,-19358,26398,-19412,26358,-19466,26318,-19520,26278,-19574,26238,-19627,26198,-19681,26158,-19734,26117,-19788,26077,-19841,26036,-19895,25995,-19948,25954,-20001,25913,-20054,25872,-20107,25831,-20160,25790,-20213,25749,-20265,25707,-20318,25665,-20370,25624,-20423,25582,-20475,25540,-20528,25498,-20580,25456,-20632,25414,-20684,25371,-20736,25329,-20788,25286,-20839,25243,-20891,25201,-20943,25158,-20994,25115,-21046,25072,-21097,25029,-21148,24985,-21199,24942,-21250,24898,-21301,24855,-21352,24811,-21403,24767,-21454,24723,-21504,24679,-21555,24635,-21605,24591,-21656,24546,-21706,24502,-21756,24457,-21806,24413,-21856,24368,-21906,24323,-21956,24278,-22005,24233,-22055,24188,-22105,24143,-22154,24097,-22203,24052,-22253,24006,-22302,23961,-22351,23915,-22400,23869,-22449,23823,-22497,23777,-22546,23731,-22595,23685,-22643,23638,-22692,23592,-22740,23545,-22788,23499,-22836,23452,-22884,23405,-22932,23358,-22980,23311,-23028,23264,-23075,23217,-23123,23169,-23170,23122,-23218,23074,-23265,23027,-23312,22979,-23359,22931,-23406,22883,-23453,22835,-23500,22787,-23546,22739,-23593,22691,-23639,22642,-23686,22594,-23732,22545,-23778,22496,-23824,22448,-23870,22399,-23916,22350,-23962,22301,-24007,22252,-24053,22202,-24098,22153,-24144,22104,-24189,22054,-24234,22004,-24279,21955,-24324,21905,-24369,21855,-24414,21805,-24458,21755,-24503,21705,-24547,21655,-24592,21604,-24636,21554,-24680,21503,-24724,21453,-24768,21402,-24812,21351,-24856,21300,-24899,21249,-24943,21198,-24986,21147,-25030,21096,-25073,21045,-25116,20993,-25159,20942,-25202,20890,-25244,20838,-25287,20787,-25330,20735,-25372,20683,-25415,20631,-25457,20579,-25499,20527,-25541,20474,-25583,20422,-25625,20369,-25666,20317,-25708,20264,-25750,20212,-25791,20159,-25832,20106,-25873,20053,-25914,20000,-25955,19947,-25996,19894,-26037,19840,-26078,19787,-26118,19733,-26159,19680,-26199,19626,-26239,19573,-26279,19519,-26319,19465,-26359,19411,-26399,19357,-26438,19303,-26478,19249,-26517,19194,-26557,19140,-26596,19086,-26635,19031,-26674,18976,-26713,18922,-26752,18867,-26790,18812,-26829,18757,-26867,18702,-26906,18647,-26944,18592,-26982,18537,-27020,18482,-27058,18426,-27095,18371,-27133,18315,-27171,18260,-27208,18204,-27245,18148,-27282,18092,-27320,18036,-27356,17980,-27393,17924,-27430,17868,-27467,17812,-27503,17756,-27539,17699,-27576,17643,-27612,17586,-27648,17530,-27684,17473,-27720,17416,-27755,17360,-27791,17303,-27826,17246,-27862,17189,-27897,17132,-27932,17074,-27967,17017,-28002,16960,-28037,16903,-28071,16845,-28106,16788,-28140,16730,-28174,16672,-28209,16615,-28243,16557,-28276,16499,-28310,16441,-28344,16383,-28378,16325,-28411,16267,-28444,16209,-28478,16150,-28511,16092,-28544,16034,-28576,15975,-28609,15917,-28642,15858,-28674,15799,-28707,15740,-28739,15682,-28771,15623,-28803,15564,-28835,15505,-28867,15446,-28898,15387,-28930,15327,-28961,15268,-28993,15209,-29024,15149,-29055,15090,-29086,15030,-29117,14971,-29147,14911,-29178,14852,-29208,14792,-29239,14732,-29269,14672,-29299,14612,-29329,14552,-29359,14492,-29388,14432,-29418,14372,-29447,14311,-29477,14251,-29506,14191,-29535,14130,-29564,14070,-29593,14009,-29622,13949,-29650,13888,-29679,13827,-29707,13766,-29735,13706,-29763,13645,-29791,13584,-29819,13523,-29847,13462,-29874,13400,-29902,13339,-29929,13278,-29956,13217,-29984,13155,-30010,13094,-30037,13033,-30064,12971,-30091,12909,-30117,12848,-30143,12786,-30170,12724,-30196,12663,-30222,12601,-30248,12539,-30273,12477,-30299,12415,-30324,12353,-30350,12291,-30375,12229,-30400,12166,-30425,12104,-30450,12042,-30474,11980,-30499,11917,-30523,11855,-30548,11792,-30572,11730,-30596,11667,-30620,11604,-30644,11542,-30667,11479,-30691,11416,-30714,11353,-30738,11290,-30761,11227,-30784,11164,-30807,11101,-30829,11038,-30852,10975,-30875,10912,-30897,10849,-30919,10786,-30941,10722,-30963,10659,-30985,10596,-31007,10532,-31029,10469,-31050,10405,-31071,10342,-31093,10278,-31114,10214,-31135,10151,-31155,10087,-31176,10023,-31197,9959,-31217,9895,-31237,9831,-31258,9767,-31278,9703,-31298,9639,-31317,9575,-31337,9511,-31357,9447,-31376,9383,-31395,9319,-31414,9254,-31433,9190,-31452,9126,-31471,9061,-31490,8997,-31508,8932,-31526,8868,-31545,8803,-31563,8739,-31581,8674,-31598,8610,-31616,8545,-31634,8480,-31651,8415,-31668,8351,-31685,8286,-31702,8221,-31719,8156,-31736,8091,-31753,8026,-31769,7961,-31786,7896,-31802,7831,-31818,7766,-31834,7701,-31850,7636,-31865,7571,-31881,7505,-31896,7440,-31912,7375,-31927,7310,-31942,7244,-31957,7179,-31971,7113,-31986,7048,-32000,6982,-32015,6917,-32029,6851,-32043,6786,-32057,6720,-32071,6655,-32085,6589,-32098,6523,-32111,6458,-32125,6392,-32138,6326,-32151,6261,-32164,6195,-32177,6129,-32189,6063,-32202,5997,-32214,5931,-32226,5865,-32238,5799,-32250,5733,-32262,5667,-32274,5601,-32285,5535,-32296,5469,-32308,5403,-32319,5337,-32330,5271,-32341,5205,-32351,5139,-32362,5072,-32372,5006,-32383,4940,-32393,4874,-32403,4807,-32413,4741,-32423,4675,-32432,4608,-32442,4542,-32451,4476,-32460,4409,-32469,4343,-32478,4276,-32487,4210,-32496,4144,-32504,4077,-32513,4011,-32521,3944,-32529,3877,-32537,3811,-32545,3744,-32553,3678,-32560,3611,-32568,3545,-32575,3478,-32582,3411,-32589,3345,-32596,3278,-32603,3211,-32610,3145,-32616,3078,-32623,3011,-32629,2944,-32635,2878,-32641,2811,-32647,2744,-32652,2677,-32658,2610,-32663,2544,-32669,2477,-32674,2410,-32679,2343,-32684,2276,-32688,2209,-32693,2143,-32697,2076,-32702,2009,-32706,1942,-32710,1875,-32714,1808,-32718,1741,-32721,1674,-32725,1607,-32728,1540,-32731,1473,-32734,1406,-32737,1339,-32740,1273,-32743,1206,-32745,1139,-32748,1072,-32750,1005,-32752,938,-32754,871,-32756,804,-32758,737,-32759,670,-32761,603,-32762,536,-32763,469,-32764,402,-32765,335,-32766,268,-32766,201,-32767,134,-32767,67,-32767,0,-32767,-68,-32767,-135,-32767,-202,-32767,-269,-32766,-336,-32766,-403,-32765,-470,-32764,-537,-32763,-604,-32762,-671,-32761,-738,-32759,-805,-32758,-872,-32756,-939,-32754,-1006,-32752,-1073,-32750,-1140,-32748,-1207,-32745,-1274,-32743,-1340,-32740,-1407,-32737,-1474,-32734,-1541,-32731,-1608,-32728,-1675,-32725,-1742,-32721,-1809,-32718,-1876,-32714,-1943,-32710,-2010,-32706,-2077,-32702,-2144,-32697,-2210,-32693,-2277,-32688,-2344,-32684,-2411,-32679,-2478,-32674,-2545,-32669,-2611,-32663,-2678,-32658,-2745,-32652,-2812,-32647,-2879,-32641,-2945,-32635,-3012,-32629,-3079,-32623,-3146,-32616,-3212,-32610,-3279,-32603,-3346,-32596,-3412,-32589,-3479,-32582,-3546,-32575,-3612,-32568,-3679,-32560,-3745,-32553,-3812,-32545,-3878,-32537,-3945,-32529,-4012,-32521,-4078,-32513,-4145,-32504,-4211,-32496,-4277,-32487,-4344,-32478,-4410,-32469,-4477,-32460,-4543,-32451,-4609,-32442,-4676,-32432,-4742,-32423,-4808,-32413,-4875,-32403,-4941,-32393,-5007,-32383,-5073,-32372,-5140,-32362,-5206,-32351,-5272,-32341,-5338,-32330,-5404,-32319,-5470,-32308,-5536,-32296,-5602,-32285,-5668,-32274,-5734,-32262,-5800,-32250,-5866,-32238,-5932,-32226,-5998,-32214,-6064,-32202,-6130,-32189,-6196,-32177,-6262,-32164,-6327,-32151,-6393,-32138,-6459,-32125,-6524,-32111,-6590,-32098,-6656,-32085,-6721,-32071,-6787,-32057,-6852,-32043,-6918,-32029,-6983,-32015,-7049,-32000,-7114,-31986,-7180,-31971,-7245,-31957,-7311,-31942,-7376,-31927,-7441,-31912,-7506,-31896,-7572,-31881,-7637,-31865,-7702,-31850,-7767,-31834,-7832,-31818,-7897,-31802,-7962,-31786,-8027,-31769,-8092,-31753,-8157,-31736,-8222,-31719,-8287,-31702,-8352,-31685,-8416,-31668,-8481,-31651,-8546,-31634,-8611,-31616,-8675,-31598,-8740,-31581,-8804,-31563,-8869,-31545,-8933,-31526,-8998,-31508,-9062,-31490,-9127,-31471,-9191,-31452,-9255,-31433,-9320,-31414,-9384,-31395,-9448,-31376,-9512,-31357,-9576,-31337,-9640,-31317,-9704,-31298,-9768,-31278,-9832,-31258,-9896,-31237,-9960,-31217,-10024,-31197,-10088,-31176,-10152,-31155,-10215,-31135,-10279,-31114,-10343,-31093,-10406,-31071,-10470,-31050,-10533,-31029,-10597,-31007,-10660,-30985,-10723,-30963,-10787,-30941,-10850,-30919,-10913,-30897,-10976,-30875,-11039,-30852,-11102,-30829,-11165,-30807,-11228,-30784,-11291,-30761,-11354,-30738,-11417,-30714,-11480,-30691,-11543,-30667,-11605,-30644,-11668,-30620,-11731,-30596,-11793,-30572,-11856,-30548,-11918,-30523,-11981,-30499,-12043,-30474,-12105,-30450,-12167,-30425,-12230,-30400,-12292,-30375,-12354,-30350,-12416,-30324,-12478,-30299,-12540,-30273,-12602,-30248,-12664,-30222,-12725,-30196,-12787,-30170,-12849,-30143,-12910,-30117,-12972,-30091,-13034,-30064,-13095,-30037,-13156,-30010,-13218,-29984,-13279,-29956,-13340,-29929,-13401,-29902,-13463,-29874,-13524,-29847,-13585,-29819,-13646,-29791,-13707,-29763,-13767,-29735,-13828,-29707,-13889,-29679,-13950,-29650,-14010,-29622,-14071,-29593,-14131,-29564,-14192,-29535,-14252,-29506,-14312,-29477,-14373,-29447,-14433,-29418,-14493,-29388,-14553,-29359,-14613,-29329,-14673,-29299,-14733,-29269,-14793,-29239,-14853,-29208,-14912,-29178,-14972,-29147,-15031,-29117,-15091,-29086,-15150,-29055,-15210,-29024,-15269,-28993,-15328,-28961,-15388,-28930,-15447,-28898,-15506,-28867,-15565,-28835,-15624,-28803,-15683,-28771,-15741,-28739,-15800,-28707,-15859,-28674,-15918,-28642,-15976,-28609,-16035,-28576,-16093,-28544,-16151,-28511,-16210,-28478,-16268,-28444,-16326,-28411,-16384,-28378,-16442,-28344,-16500,-28310,-16558,-28276,-16616,-28243,-16673,-28209,-16731,-28174,-16789,-28140,-16846,-28106,-16904,-28071,-16961,-28037,-17018,-28002,-17075,-27967,-17133,-27932,-17190,-27897,-17247,-27862,-17304,-27826,-17361,-27791,-17417,-27755,-17474,-27720,-17531,-27684,-17587,-27648,-17644,-27612,-17700,-27576,-17757,-27539,-17813,-27503,-17869,-27467,-17925,-27430,-17981,-27393,-18037,-27356,-18093,-27320,-18149,-27282,-18205,-27245,-18261,-27208,-18316,-27171,-18372,-27133,-18427,-27095,-18483,-27058,-18538,-27020,-18593,-26982,-18648,-26944,-18703,-26906,-18758,-26867,-18813,-26829,-18868,-26790,-18923,-26752,-18977,-26713,-19032,-26674,-19087,-26635,-19141,-26596,-19195,-26557,-19250,-26517,-19304,-26478,-19358,-26438,-19412,-26399,-19466,-26359,-19520,-26319,-19574,-26279,-19627,-26239,-19681,-26199,-19734,-26159,-19788,-26118,-19841,-26078,-19895,-26037,-19948,-25996,-20001,-25955,-20054,-25914,-20107,-25873,-20160,-25832,-20213,-25791,-20265,-25750,-20318,-25708,-20370,-25666,-20423,-25625,-20475,-25583,-20528,-25541,-20580,-25499,-20632,-25457,-20684,-25415,-20736,-25372,-20788,-25330,-20839,-25287,-20891,-25244,-20943,-25202,-20994,-25159,-21046,-25116,-21097,-25073,-21148,-25030,-21199,-24986,-21250,-24943,-21301,-24899,-21352,-24856,-21403,-24812,-21454,-24768,-21504,-24724,-21555,-24680,-21605,-24636,-21656,-24592,-21706,-24547,-21756,-24503,-21806,-24458,-21856,-24414,-21906,-24369,-21956,-24324,-22005,-24279,-22055,-24234,-22105,-24189,-22154,-24144,-22203,-24098,-22253,-24053,-22302,-24007,-22351,-23962,-22400,-23916,-22449,-23870,-22497,-23824,-22546,-23778,-22595,-23732,-22643,-23686,-22692,-23639,-22740,-23593,-22788,-23546,-22836,-23500,-22884,-23453,-22932,-23406,-22980,-23359,-23028,-23312,-23075,-23265,-23123,-23218,-23170,-23170,-23218,-23123,-23265,-23075,-23312,-23028,-23359,-22980,-23406,-22932,-23453,-22884,-23500,-22836,-23546,-22788,-23593,-22740,-23639,-22692,-23686,-22643,-23732,-22595,-23778,-22546,-23824,-22497,-23870,-22449,-23916,-22400,-23962,-22351,-24007,-22302,-24053,-22253,-24098,-22203,-24144,-22154,-24189,-22105,-24234,-22055,-24279,-22005,-24324,-21956,-24369,-21906,-24414,-21856,-24458,-21806,-24503,-21756,-24547,-21706,-24592,-21656,-24636,-21605,-24680,-21555,-24724,-21504,-24768,-21454,-24812,-21403,-24856,-21352,-24899,-21301,-24943,-21250,-24986,-21199,-25030,-21148,-25073,-21097,-25116,-21046,-25159,-20994,-25202,-20943,-25244,-20891,-25287,-20839,-25330,-20788,-25372,-20736,-25415,-20684,-25457,-20632,-25499,-20580,-25541,-20528,-25583,-20475,-25625,-20423,-25666,-20370,-25708,-20318,-25750,-20265,-25791,-20213,-25832,-20160,-25873,-20107,-25914,-20054,-25955,-20001,-25996,-19948,-26037,-19895,-26078,-19841,-26118,-19788,-26159,-19734,-26199,-19681,-26239,-19627,-26279,-19574,-26319,-19520,-26359,-19466,-26399,-19412,-26438,-19358,-26478,-19304,-26517,-19250,-26557,-19195,-26596,-19141,-26635,-19087,-26674,-19032,-26713,-18977,-26752,-18923,-26790,-18868,-26829,-18813,-26867,-18758,-26906,-18703,-26944,-18648,-26982,-18593,-27020,-18538,-27058,-18483,-27095,-18427,-27133,-18372,-27171,-18316,-27208,-18261,-27245,-18205,-27282,-18149,-27320,-18093,-27356,-18037,-27393,-17981,-27430,-17925,-27467,-17869,-27503,-17813,-27539,-17757,-27576,-17700,-27612,-17644,-27648,-17587,-27684,-17531,-27720,-17474,-27755,-17417,-27791,-17361,-27826,-17304,-27862,-17247,-27897,-17190,-27932,-17133,-27967,-17075,-28002,-17018,-28037,-16961,-28071,-16904,-28106,-16846,-28140,-16789,-28174,-16731,-28209,-16673,-28243,-16616,-28276,-16558,-28310,-16500,-28344,-16442,-28378,-16384,-28411,-16326,-28444,-16268,-28478,-16210,-28511,-16151,-28544,-16093,-28576,-16035,-28609,-15976,-28642,-15918,-28674,-15859,-28707,-15800,-28739,-15741,-28771,-15683,-28803,-15624,-28835,-15565,-28867,-15506,-28898,-15447,-28930,-15388,-28961,-15328,-28993,-15269,-29024,-15210,-29055,-15150,-29086,-15091,-29117,-15031,-29147,-14972,-29178,-14912,-29208,-14853,-29239,-14793,-29269,-14733,-29299,-14673,-29329,-14613,-29359,-14553,-29388,-14493,-29418,-14433,-29447,-14373,-29477,-14312,-29506,-14252,-29535,-14192,-29564,-14131,-29593,-14071,-29622,-14010,-29650,-13950,-29679,-13889,-29707,-13828,-29735,-13767,-29763,-13707,-29791,-13646,-29819,-13585,-29847,-13524,-29874,-13463,-29902,-13401,-29929,-13340,-29956,-13279,-29984,-13218,-30010,-13156,-30037,-13095,-30064,-13034,-30091,-12972,-30117,-12910,-30143,-12849,-30170,-12787,-30196,-12725,-30222,-12664,-30248,-12602,-30273,-12540,-30299,-12478,-30324,-12416,-30350,-12354,-30375,-12292,-30400,-12230,-30425,-12167,-30450,-12105,-30474,-12043,-30499,-11981,-30523,-11918,-30548,-11856,-30572,-11793,-30596,-11731,-30620,-11668,-30644,-11605,-30667,-11543,-30691,-11480,-30714,-11417,-30738,-11354,-30761,-11291,-30784,-11228,-30807,-11165,-30829,-11102,-30852,-11039,-30875,-10976,-30897,-10913,-30919,-10850,-30941,-10787,-30963,-10723,-30985,-10660,-31007,-10597,-31029,-10533,-31050,-10470,-31071,-10406,-31093,-10343,-31114,-10279,-31135,-10215,-31155,-10152,-31176,-10088,-31197,-10024,-31217,-9960,-31237,-9896,-31258,-9832,-31278,-9768,-31298,-9704,-31317,-9640,-31337,-9576,-31357,-9512,-31376,-9448,-31395,-9384,-31414,-9320,-31433,-9255,-31452,-9191,-31471,-9127,-31490,-9062,-31508,-8998,-31526,-8933,-31545,-8869,-31563,-8804,-31581,-8740,-31598,-8675,-31616,-8611,-31634,-8546,-31651,-8481,-31668,-8416,-31685,-8352,-31702,-8287,-31719,-8222,-31736,-8157,-31753,-8092,-31769,-8027,-31786,-7962,-31802,-7897,-31818,-7832,-31834,-7767,-31850,-7702,-31865,-7637,-31881,-7572,-31896,-7506,-31912,-7441,-31927,-7376,-31942,-7311,-31957,-7245,-31971,-7180,-31986,-7114,-32000,-7049,-32015,-6983,-32029,-6918,-32043,-6852,-32057,-6787,-32071,-6721,-32085,-6656,-32098,-6590,-32111,-6524,-32125,-6459,-32138,-6393,-32151,-6327,-32164,-6262,-32177,-6196,-32189,-6130,-32202,-6064,-32214,-5998,-32226,-5932,-32238,-5866,-32250,-5800,-32262,-5734,-32274,-5668,-32285,-5602,-32296,-5536,-32308,-5470,-32319,-5404,-32330,-5338,-32341,-5272,-32351,-5206,-32362,-5140,-32372,-5073,-32383,-5007,-32393,-4941,-32403,-4875,-32413,-4808,-32423,-4742,-32432,-4676,-32442,-4609,-32451,-4543,-32460,-4477,-32469,-4410,-32478,-4344,-32487,-4277,-32496,-4211,-32504,-4145,-32513,-4078,-32521,-4012,-32529,-3945,-32537,-3878,-32545,-3812,-32553,-3745,-32560,-3679,-32568,-3612,-32575,-3546,-32582,-3479,-32589,-3412,-32596,-3346,-32603,-3279,-32610,-3212,-32616,-3146,-32623,-3079,-32629,-3012,-32635,-2945,-32641,-2879,-32647,-2812,-32652,-2745,-32658,-2678,-32663,-2611,-32669,-2545,-32674,-2478,-32679,-2411,-32684,-2344,-32688,-2277,-32693,-2210,-32697,-2144,-32702,-2077,-32706,-2010,-32710,-1943,-32714,-1876,-32718,-1809,-32721,-1742,-32725,-1675,-32728,-1608,-32731,-1541,-32734,-1474,-32737,-1407,-32740,-1340,-32743,-1274,-32745,-1207,-32748,-1140,-32750,-1073,-32752,-1006,-32754,-939,-32756,-872,-32758,-805,-32759,-738,-32761,-671,-32762,-604,-32763,-537,-32764,-470,-32765,-403,-32766,-336,-32766,-269,-32767,-202,-32767,-135,-32767,-68,-32767,-1,-32767,67,-32767,134,-32767,201,-32766,268,-32766,335,-32765,402,-32764,469,-32763,536,-32762,603,-32761,670,-32759,737,-32758,804,-32756,871,-32754,938,-32752,1005,-32750,1072,-32748,1139,-32745,1206,-32743,1273,-32740,1339,-32737,1406,-32734,1473,-32731,1540,-32728,1607,-32725,1674,-32721,1741,-32718,1808,-32714,1875,-32710,1942,-32706,2009,-32702,2076,-32697,2143,-32693,2209,-32688,2276,-32684,2343,-32679,2410,-32674,2477,-32669,2544,-32663,2610,-32658,2677,-32652,2744,-32647,2811,-32641,2878,-32635,2944,-32629,3011,-32623,3078,-32616,3145,-32610,3211,-32603,3278,-32596,3345,-32589,3411,-32582,3478,-32575,3545,-32568,3611,-32560,3678,-32553,3744,-32545,3811,-32537,3877,-32529,3944,-32521,4011,-32513,4077,-32504,4144,-32496,4210,-32487,4276,-32478,4343,-32469,4409,-32460,4476,-32451,4542,-32442,4608,-32432,4675,-32423,4741,-32413,4807,-32403,4874,-32393,4940,-32383,5006,-32372,5072,-32362,5139,-32351,5205,-32341,5271,-32330,5337,-32319,5403,-32308,5469,-32296,5535,-32285,5601,-32274,5667,-32262,5733,-32250,5799,-32238,5865,-32226,5931,-32214,5997,-32202,6063,-32189,6129,-32177,6195,-32164,6261,-32151,6326,-32138,6392,-32125,6458,-32111,6523,-32098,6589,-32085,6655,-32071,6720,-32057,6786,-32043,6851,-32029,6917,-32015,6982,-32000,7048,-31986,7113,-31971,7179,-31957,7244,-31942,7310,-31927,7375,-31912,7440,-31896,7505,-31881,7571,-31865,7636,-31850,7701,-31834,7766,-31818,7831,-31802,7896,-31786,7961,-31769,8026,-31753,8091,-31736,8156,-31719,8221,-31702,8286,-31685,8351,-31668,8415,-31651,8480,-31634,8545,-31616,8610,-31598,8674,-31581,8739,-31563,8803,-31545,8868,-31526,8932,-31508,8997,-31490,9061,-31471,9126,-31452,9190,-31433,9254,-31414,9319,-31395,9383,-31376,9447,-31357,9511,-31337,9575,-31317,9639,-31298,9703,-31278,9767,-31258,9831,-31237,9895,-31217,9959,-31197,10023,-31176,10087,-31155,10151,-31135,10214,-31114,10278,-31093,10342,-31071,10405,-31050,10469,-31029,10532,-31007,10596,-30985,10659,-30963,10722,-30941,10786,-30919,10849,-30897,10912,-30875,10975,-30852,11038,-30829,11101,-30807,11164,-30784,11227,-30761,11290,-30738,11353,-30714,11416,-30691,11479,-30667,11542,-30644,11604,-30620,11667,-30596,11730,-30572,11792,-30548,11855,-30523,11917,-30499,11980,-30474,12042,-30450,12104,-30425,12166,-30400,12229,-30375,12291,-30350,12353,-30324,12415,-30299,12477,-30273,12539,-30248,12601,-30222,12663,-30196,12724,-30170,12786,-30143,12848,-30117,12909,-30091,12971,-30064,13033,-30037,13094,-30010,13155,-29984,13217,-29956,13278,-29929,13339,-29902,13400,-29874,13462,-29847,13523,-29819,13584,-29791,13645,-29763,13706,-29735,13766,-29707,13827,-29679,13888,-29650,13949,-29622,14009,-29593,14070,-29564,14130,-29535,14191,-29506,14251,-29477,14311,-29447,14372,-29418,14432,-29388,14492,-29359,14552,-29329,14612,-29299,14672,-29269,14732,-29239,14792,-29208,14852,-29178,14911,-29147,14971,-29117,15030,-29086,15090,-29055,15149,-29024,15209,-28993,15268,-28961,15327,-28930,15387,-28898,15446,-28867,15505,-28835,15564,-28803,15623,-28771,15682,-28739,15740,-28707,15799,-28674,15858,-28642,15917,-28609,15975,-28576,16034,-28544,16092,-28511,16150,-28478,16209,-28444,16267,-28411,16325,-28378,16383,-28344,16441,-28310,16499,-28276,16557,-28243,16615,-28209,16672,-28174,16730,-28140,16788,-28106,16845,-28071,16903,-28037,16960,-28002,17017,-27967,17074,-27932,17132,-27897,17189,-27862,17246,-27826,17303,-27791,17360,-27755,17416,-27720,17473,-27684,17530,-27648,17586,-27612,17643,-27576,17699,-27539,17756,-27503,17812,-27467,17868,-27430,17924,-27393,17980,-27356,18036,-27320,18092,-27282,18148,-27245,18204,-27208,18260,-27171,18315,-27133,18371,-27095,18426,-27058,18482,-27020,18537,-26982,18592,-26944,18647,-26906,18702,-26867,18757,-26829,18812,-26790,18867,-26752,18922,-26713,18976,-26674,19031,-26635,19086,-26596,19140,-26557,19194,-26517,19249,-26478,19303,-26438,19357,-26399,19411,-26359,19465,-26319,19519,-26279,19573,-26239,19626,-26199,19680,-26159,19733,-26118,19787,-26078,19840,-26037,19894,-25996,19947,-25955,20000,-25914,20053,-25873,20106,-25832,20159,-25791,20212,-25750,20264,-25708,20317,-25666,20369,-25625,20422,-25583,20474,-25541,20527,-25499,20579,-25457,20631,-25415,20683,-25372,20735,-25330,20787,-25287,20838,-25244,20890,-25202,20942,-25159,20993,-25116,21045,-25073,21096,-25030,21147,-24986,21198,-24943,21249,-24899,21300,-24856,21351,-24812,21402,-24768,21453,-24724,21503,-24680,21554,-24636,21604,-24592,21655,-24547,21705,-24503,21755,-24458,21805,-24414,21855,-24369,21905,-24324,21955,-24279,22004,-24234,22054,-24189,22104,-24144,22153,-24098,22202,-24053,22252,-24007,22301,-23962,22350,-23916,22399,-23870,22448,-23824,22496,-23778,22545,-23732,22594,-23686,22642,-23639,22691,-23593,22739,-23546,22787,-23500,22835,-23453,22883,-23406,22931,-23359,22979,-23312,23027,-23265,23074,-23218,23122,-23170,23169,-23123,23217,-23075,23264,-23028,23311,-22980,23358,-22932,23405,-22884,23452,-22836,23499,-22788,23545,-22740,23592,-22692,23638,-22643,23685,-22595,23731,-22546,23777,-22497,23823,-22449,23869,-22400,23915,-22351,23961,-22302,24006,-22253,24052,-22203,24097,-22154,24143,-22105,24188,-22055,24233,-22005,24278,-21956,24323,-21906,24368,-21856,24413,-21806,24457,-21756,24502,-21706,24546,-21656,24591,-21605,24635,-21555,24679,-21504,24723,-21454,24767,-21403,24811,-21352,24855,-21301,24898,-21250,24942,-21199,24985,-21148,25029,-21097,25072,-21046,25115,-20994,25158,-20943,25201,-20891,25243,-20839,25286,-20788,25329,-20736,25371,-20684,25414,-20632,25456,-20580,25498,-20528,25540,-20475,25582,-20423,25624,-20370,25665,-20318,25707,-20265,25749,-20213,25790,-20160,25831,-20107,25872,-20054,25913,-20001,25954,-19948,25995,-19895,26036,-19841,26077,-19788,26117,-19734,26158,-19681,26198,-19627,26238,-19574,26278,-19520,26318,-19466,26358,-19412,26398,-19358,26437,-19304,26477,-19250,26516,-19195,26556,-19141,26595,-19087,26634,-19032,26673,-18977,26712,-18923,26751,-18868,26789,-18813,26828,-18758,26866,-18703,26905,-18648,26943,-18593,26981,-18538,27019,-18483,27057,-18427,27094,-18372,27132,-18316,27170,-18261,27207,-18205,27244,-18149,27281,-18093,27319,-18037,27355,-17981,27392,-17925,27429,-17869,27466,-17813,27502,-17757,27538,-17700,27575,-17644,27611,-17587,27647,-17531,27683,-17474,27719,-17417,27754,-17361,27790,-17304,27825,-17247,27861,-17190,27896,-17133,27931,-17075,27966,-17018,28001,-16961,28036,-16904,28070,-16846,28105,-16789,28139,-16731,28173,-16673,28208,-16616,28242,-16558,28275,-16500,28309,-16442,28343}; +int16_t twb6144[4096] __attribute__((aligned(32))) = {32767,0,32766,-68,32766,-135,32766,-202,32765,-269,32765,-336,32764,-403,32763,-470,32762,-537,32761,-604,32760,-671,32758,-738,32757,-805,32755,-872,32753,-939,32751,-1006,32749,-1073,32747,-1140,32744,-1207,32742,-1274,32739,-1340,32736,-1407,32733,-1474,32730,-1541,32727,-1608,32724,-1675,32720,-1742,32717,-1809,32713,-1876,32709,-1943,32705,-2010,32701,-2077,32696,-2144,32692,-2210,32687,-2277,32683,-2344,32678,-2411,32673,-2478,32668,-2545,32662,-2611,32657,-2678,32651,-2745,32646,-2812,32640,-2879,32634,-2945,32628,-3012,32622,-3079,32615,-3146,32609,-3212,32602,-3279,32595,-3346,32588,-3412,32581,-3479,32574,-3546,32567,-3612,32559,-3679,32552,-3745,32544,-3812,32536,-3878,32528,-3945,32520,-4012,32512,-4078,32503,-4145,32495,-4211,32486,-4277,32477,-4344,32468,-4410,32459,-4477,32450,-4543,32441,-4609,32431,-4676,32422,-4742,32412,-4808,32402,-4875,32392,-4941,32382,-5007,32371,-5073,32361,-5140,32350,-5206,32340,-5272,32329,-5338,32318,-5404,32307,-5470,32295,-5536,32284,-5602,32273,-5668,32261,-5734,32249,-5800,32237,-5866,32225,-5932,32213,-5998,32201,-6064,32188,-6130,32176,-6196,32163,-6262,32150,-6327,32137,-6393,32124,-6459,32110,-6524,32097,-6590,32084,-6656,32070,-6721,32056,-6787,32042,-6852,32028,-6918,32014,-6983,31999,-7049,31985,-7114,31970,-7180,31956,-7245,31941,-7311,31926,-7376,31911,-7441,31895,-7506,31880,-7572,31864,-7637,31849,-7702,31833,-7767,31817,-7832,31801,-7897,31785,-7962,31768,-8027,31752,-8092,31735,-8157,31718,-8222,31701,-8287,31684,-8352,31667,-8416,31650,-8481,31633,-8546,31615,-8611,31597,-8675,31580,-8740,31562,-8804,31544,-8869,31525,-8933,31507,-8998,31489,-9062,31470,-9127,31451,-9191,31432,-9255,31413,-9320,31394,-9384,31375,-9448,31356,-9512,31336,-9576,31316,-9640,31297,-9704,31277,-9768,31257,-9832,31236,-9896,31216,-9960,31196,-10024,31175,-10088,31154,-10152,31134,-10215,31113,-10279,31092,-10343,31070,-10406,31049,-10470,31028,-10533,31006,-10597,30984,-10660,30962,-10723,30940,-10787,30918,-10850,30896,-10913,30874,-10976,30851,-11039,30828,-11102,30806,-11165,30783,-11228,30760,-11291,30737,-11354,30713,-11417,30690,-11480,30666,-11543,30643,-11605,30619,-11668,30595,-11731,30571,-11793,30547,-11856,30522,-11918,30498,-11981,30473,-12043,30449,-12105,30424,-12167,30399,-12230,30374,-12292,30349,-12354,30323,-12416,30298,-12478,30272,-12540,30247,-12602,30221,-12664,30195,-12725,30169,-12787,30142,-12849,30116,-12910,30090,-12972,30063,-13034,30036,-13095,30009,-13156,29983,-13218,29955,-13279,29928,-13340,29901,-13401,29873,-13463,29846,-13524,29818,-13585,29790,-13646,29762,-13707,29734,-13767,29706,-13828,29678,-13889,29649,-13950,29621,-14010,29592,-14071,29563,-14131,29534,-14192,29505,-14252,29476,-14312,29446,-14373,29417,-14433,29387,-14493,29358,-14553,29328,-14613,29298,-14673,29268,-14733,29238,-14793,29207,-14853,29177,-14912,29146,-14972,29116,-15031,29085,-15091,29054,-15150,29023,-15210,28992,-15269,28960,-15328,28929,-15388,28897,-15447,28866,-15506,28834,-15565,28802,-15624,28770,-15683,28738,-15741,28706,-15800,28673,-15859,28641,-15918,28608,-15976,28575,-16035,28543,-16093,28510,-16151,28477,-16210,28443,-16268,28410,-16326,28377,-16384,28343,-16442,28309,-16500,28275,-16558,28242,-16616,28208,-16673,28173,-16731,28139,-16789,28105,-16846,28070,-16904,28036,-16961,28001,-17018,27966,-17075,27931,-17133,27896,-17190,27861,-17247,27825,-17304,27790,-17361,27754,-17417,27719,-17474,27683,-17531,27647,-17587,27611,-17644,27575,-17700,27538,-17757,27502,-17813,27466,-17869,27429,-17925,27392,-17981,27355,-18037,27319,-18093,27281,-18149,27244,-18205,27207,-18261,27170,-18316,27132,-18372,27094,-18427,27057,-18483,27019,-18538,26981,-18593,26943,-18648,26905,-18703,26866,-18758,26828,-18813,26789,-18868,26751,-18923,26712,-18977,26673,-19032,26634,-19087,26595,-19141,26556,-19195,26516,-19250,26477,-19304,26437,-19358,26398,-19412,26358,-19466,26318,-19520,26278,-19574,26238,-19627,26198,-19681,26158,-19734,26117,-19788,26077,-19841,26036,-19895,25995,-19948,25954,-20001,25913,-20054,25872,-20107,25831,-20160,25790,-20213,25749,-20265,25707,-20318,25665,-20370,25624,-20423,25582,-20475,25540,-20528,25498,-20580,25456,-20632,25414,-20684,25371,-20736,25329,-20788,25286,-20839,25243,-20891,25201,-20943,25158,-20994,25115,-21046,25072,-21097,25029,-21148,24985,-21199,24942,-21250,24898,-21301,24855,-21352,24811,-21403,24767,-21454,24723,-21504,24679,-21555,24635,-21605,24591,-21656,24546,-21706,24502,-21756,24457,-21806,24413,-21856,24368,-21906,24323,-21956,24278,-22005,24233,-22055,24188,-22105,24143,-22154,24097,-22203,24052,-22253,24006,-22302,23961,-22351,23915,-22400,23869,-22449,23823,-22497,23777,-22546,23731,-22595,23685,-22643,23638,-22692,23592,-22740,23545,-22788,23499,-22836,23452,-22884,23405,-22932,23358,-22980,23311,-23028,23264,-23075,23217,-23123,23169,-23170,23122,-23218,23074,-23265,23027,-23312,22979,-23359,22931,-23406,22883,-23453,22835,-23500,22787,-23546,22739,-23593,22691,-23639,22642,-23686,22594,-23732,22545,-23778,22496,-23824,22448,-23870,22399,-23916,22350,-23962,22301,-24007,22252,-24053,22202,-24098,22153,-24144,22104,-24189,22054,-24234,22004,-24279,21955,-24324,21905,-24369,21855,-24414,21805,-24458,21755,-24503,21705,-24547,21655,-24592,21604,-24636,21554,-24680,21503,-24724,21453,-24768,21402,-24812,21351,-24856,21300,-24899,21249,-24943,21198,-24986,21147,-25030,21096,-25073,21045,-25116,20993,-25159,20942,-25202,20890,-25244,20838,-25287,20787,-25330,20735,-25372,20683,-25415,20631,-25457,20579,-25499,20527,-25541,20474,-25583,20422,-25625,20369,-25666,20317,-25708,20264,-25750,20212,-25791,20159,-25832,20106,-25873,20053,-25914,20000,-25955,19947,-25996,19894,-26037,19840,-26078,19787,-26118,19733,-26159,19680,-26199,19626,-26239,19573,-26279,19519,-26319,19465,-26359,19411,-26399,19357,-26438,19303,-26478,19249,-26517,19194,-26557,19140,-26596,19086,-26635,19031,-26674,18976,-26713,18922,-26752,18867,-26790,18812,-26829,18757,-26867,18702,-26906,18647,-26944,18592,-26982,18537,-27020,18482,-27058,18426,-27095,18371,-27133,18315,-27171,18260,-27208,18204,-27245,18148,-27282,18092,-27320,18036,-27356,17980,-27393,17924,-27430,17868,-27467,17812,-27503,17756,-27539,17699,-27576,17643,-27612,17586,-27648,17530,-27684,17473,-27720,17416,-27755,17360,-27791,17303,-27826,17246,-27862,17189,-27897,17132,-27932,17074,-27967,17017,-28002,16960,-28037,16903,-28071,16845,-28106,16788,-28140,16730,-28174,16672,-28209,16615,-28243,16557,-28276,16499,-28310,16441,-28344,16383,-28378,16325,-28411,16267,-28444,16209,-28478,16150,-28511,16092,-28544,16034,-28576,15975,-28609,15917,-28642,15858,-28674,15799,-28707,15740,-28739,15682,-28771,15623,-28803,15564,-28835,15505,-28867,15446,-28898,15387,-28930,15327,-28961,15268,-28993,15209,-29024,15149,-29055,15090,-29086,15030,-29117,14971,-29147,14911,-29178,14852,-29208,14792,-29239,14732,-29269,14672,-29299,14612,-29329,14552,-29359,14492,-29388,14432,-29418,14372,-29447,14311,-29477,14251,-29506,14191,-29535,14130,-29564,14070,-29593,14009,-29622,13949,-29650,13888,-29679,13827,-29707,13766,-29735,13706,-29763,13645,-29791,13584,-29819,13523,-29847,13462,-29874,13400,-29902,13339,-29929,13278,-29956,13217,-29984,13155,-30010,13094,-30037,13033,-30064,12971,-30091,12909,-30117,12848,-30143,12786,-30170,12724,-30196,12663,-30222,12601,-30248,12539,-30273,12477,-30299,12415,-30324,12353,-30350,12291,-30375,12229,-30400,12166,-30425,12104,-30450,12042,-30474,11980,-30499,11917,-30523,11855,-30548,11792,-30572,11730,-30596,11667,-30620,11604,-30644,11542,-30667,11479,-30691,11416,-30714,11353,-30738,11290,-30761,11227,-30784,11164,-30807,11101,-30829,11038,-30852,10975,-30875,10912,-30897,10849,-30919,10786,-30941,10722,-30963,10659,-30985,10596,-31007,10532,-31029,10469,-31050,10405,-31071,10342,-31093,10278,-31114,10214,-31135,10151,-31155,10087,-31176,10023,-31197,9959,-31217,9895,-31237,9831,-31258,9767,-31278,9703,-31298,9639,-31317,9575,-31337,9511,-31357,9447,-31376,9383,-31395,9319,-31414,9254,-31433,9190,-31452,9126,-31471,9061,-31490,8997,-31508,8932,-31526,8868,-31545,8803,-31563,8739,-31581,8674,-31598,8610,-31616,8545,-31634,8480,-31651,8415,-31668,8351,-31685,8286,-31702,8221,-31719,8156,-31736,8091,-31753,8026,-31769,7961,-31786,7896,-31802,7831,-31818,7766,-31834,7701,-31850,7636,-31865,7571,-31881,7505,-31896,7440,-31912,7375,-31927,7310,-31942,7244,-31957,7179,-31971,7113,-31986,7048,-32000,6982,-32015,6917,-32029,6851,-32043,6786,-32057,6720,-32071,6655,-32085,6589,-32098,6523,-32111,6458,-32125,6392,-32138,6326,-32151,6261,-32164,6195,-32177,6129,-32189,6063,-32202,5997,-32214,5931,-32226,5865,-32238,5799,-32250,5733,-32262,5667,-32274,5601,-32285,5535,-32296,5469,-32308,5403,-32319,5337,-32330,5271,-32341,5205,-32351,5139,-32362,5072,-32372,5006,-32383,4940,-32393,4874,-32403,4807,-32413,4741,-32423,4675,-32432,4608,-32442,4542,-32451,4476,-32460,4409,-32469,4343,-32478,4276,-32487,4210,-32496,4144,-32504,4077,-32513,4011,-32521,3944,-32529,3877,-32537,3811,-32545,3744,-32553,3678,-32560,3611,-32568,3545,-32575,3478,-32582,3411,-32589,3345,-32596,3278,-32603,3211,-32610,3145,-32616,3078,-32623,3011,-32629,2944,-32635,2878,-32641,2811,-32647,2744,-32652,2677,-32658,2610,-32663,2544,-32669,2477,-32674,2410,-32679,2343,-32684,2276,-32688,2209,-32693,2143,-32697,2076,-32702,2009,-32706,1942,-32710,1875,-32714,1808,-32718,1741,-32721,1674,-32725,1607,-32728,1540,-32731,1473,-32734,1406,-32737,1339,-32740,1273,-32743,1206,-32745,1139,-32748,1072,-32750,1005,-32752,938,-32754,871,-32756,804,-32758,737,-32759,670,-32761,603,-32762,536,-32763,469,-32764,402,-32765,335,-32766,268,-32766,201,-32767,134,-32767,67,-32767,0,-32767,-68,-32767,-135,-32767,-202,-32767,-269,-32766,-336,-32766,-403,-32765,-470,-32764,-537,-32763,-604,-32762,-671,-32761,-738,-32759,-805,-32758,-872,-32756,-939,-32754,-1006,-32752,-1073,-32750,-1140,-32748,-1207,-32745,-1274,-32743,-1340,-32740,-1407,-32737,-1474,-32734,-1541,-32731,-1608,-32728,-1675,-32725,-1742,-32721,-1809,-32718,-1876,-32714,-1943,-32710,-2010,-32706,-2077,-32702,-2144,-32697,-2210,-32693,-2277,-32688,-2344,-32684,-2411,-32679,-2478,-32674,-2545,-32669,-2611,-32663,-2678,-32658,-2745,-32652,-2812,-32647,-2879,-32641,-2945,-32635,-3012,-32629,-3079,-32623,-3146,-32616,-3212,-32610,-3279,-32603,-3346,-32596,-3412,-32589,-3479,-32582,-3546,-32575,-3612,-32568,-3679,-32560,-3745,-32553,-3812,-32545,-3878,-32537,-3945,-32529,-4012,-32521,-4078,-32513,-4145,-32504,-4211,-32496,-4277,-32487,-4344,-32478,-4410,-32469,-4477,-32460,-4543,-32451,-4609,-32442,-4676,-32432,-4742,-32423,-4808,-32413,-4875,-32403,-4941,-32393,-5007,-32383,-5073,-32372,-5140,-32362,-5206,-32351,-5272,-32341,-5338,-32330,-5404,-32319,-5470,-32308,-5536,-32296,-5602,-32285,-5668,-32274,-5734,-32262,-5800,-32250,-5866,-32238,-5932,-32226,-5998,-32214,-6064,-32202,-6130,-32189,-6196,-32177,-6262,-32164,-6327,-32151,-6393,-32138,-6459,-32125,-6524,-32111,-6590,-32098,-6656,-32085,-6721,-32071,-6787,-32057,-6852,-32043,-6918,-32029,-6983,-32015,-7049,-32000,-7114,-31986,-7180,-31971,-7245,-31957,-7311,-31942,-7376,-31927,-7441,-31912,-7506,-31896,-7572,-31881,-7637,-31865,-7702,-31850,-7767,-31834,-7832,-31818,-7897,-31802,-7962,-31786,-8027,-31769,-8092,-31753,-8157,-31736,-8222,-31719,-8287,-31702,-8352,-31685,-8416,-31668,-8481,-31651,-8546,-31634,-8611,-31616,-8675,-31598,-8740,-31581,-8804,-31563,-8869,-31545,-8933,-31526,-8998,-31508,-9062,-31490,-9127,-31471,-9191,-31452,-9255,-31433,-9320,-31414,-9384,-31395,-9448,-31376,-9512,-31357,-9576,-31337,-9640,-31317,-9704,-31298,-9768,-31278,-9832,-31258,-9896,-31237,-9960,-31217,-10024,-31197,-10088,-31176,-10152,-31155,-10215,-31135,-10279,-31114,-10343,-31093,-10406,-31071,-10470,-31050,-10533,-31029,-10597,-31007,-10660,-30985,-10723,-30963,-10787,-30941,-10850,-30919,-10913,-30897,-10976,-30875,-11039,-30852,-11102,-30829,-11165,-30807,-11228,-30784,-11291,-30761,-11354,-30738,-11417,-30714,-11480,-30691,-11543,-30667,-11605,-30644,-11668,-30620,-11731,-30596,-11793,-30572,-11856,-30548,-11918,-30523,-11981,-30499,-12043,-30474,-12105,-30450,-12167,-30425,-12230,-30400,-12292,-30375,-12354,-30350,-12416,-30324,-12478,-30299,-12540,-30273,-12602,-30248,-12664,-30222,-12725,-30196,-12787,-30170,-12849,-30143,-12910,-30117,-12972,-30091,-13034,-30064,-13095,-30037,-13156,-30010,-13218,-29984,-13279,-29956,-13340,-29929,-13401,-29902,-13463,-29874,-13524,-29847,-13585,-29819,-13646,-29791,-13707,-29763,-13767,-29735,-13828,-29707,-13889,-29679,-13950,-29650,-14010,-29622,-14071,-29593,-14131,-29564,-14192,-29535,-14252,-29506,-14312,-29477,-14373,-29447,-14433,-29418,-14493,-29388,-14553,-29359,-14613,-29329,-14673,-29299,-14733,-29269,-14793,-29239,-14853,-29208,-14912,-29178,-14972,-29147,-15031,-29117,-15091,-29086,-15150,-29055,-15210,-29024,-15269,-28993,-15328,-28961,-15388,-28930,-15447,-28898,-15506,-28867,-15565,-28835,-15624,-28803,-15683,-28771,-15741,-28739,-15800,-28707,-15859,-28674,-15918,-28642,-15976,-28609,-16035,-28576,-16093,-28544,-16151,-28511,-16210,-28478,-16268,-28444,-16326,-28411,-16384,-28378,-16442,-28344,-16500,-28310,-16558,-28276,-16616,-28243,-16673,-28209,-16731,-28174,-16789,-28140,-16846,-28106,-16904,-28071,-16961,-28037,-17018,-28002,-17075,-27967,-17133,-27932,-17190,-27897,-17247,-27862,-17304,-27826,-17361,-27791,-17417,-27755,-17474,-27720,-17531,-27684,-17587,-27648,-17644,-27612,-17700,-27576,-17757,-27539,-17813,-27503,-17869,-27467,-17925,-27430,-17981,-27393,-18037,-27356,-18093,-27320,-18149,-27282,-18205,-27245,-18261,-27208,-18316,-27171,-18372,-27133,-18427,-27095,-18483,-27058,-18538,-27020,-18593,-26982,-18648,-26944,-18703,-26906,-18758,-26867,-18813,-26829,-18868,-26790,-18923,-26752,-18977,-26713,-19032,-26674,-19087,-26635,-19141,-26596,-19195,-26557,-19250,-26517,-19304,-26478,-19358,-26438,-19412,-26399,-19466,-26359,-19520,-26319,-19574,-26279,-19627,-26239,-19681,-26199,-19734,-26159,-19788,-26118,-19841,-26078,-19895,-26037,-19948,-25996,-20001,-25955,-20054,-25914,-20107,-25873,-20160,-25832,-20213,-25791,-20265,-25750,-20318,-25708,-20370,-25666,-20423,-25625,-20475,-25583,-20528,-25541,-20580,-25499,-20632,-25457,-20684,-25415,-20736,-25372,-20788,-25330,-20839,-25287,-20891,-25244,-20943,-25202,-20994,-25159,-21046,-25116,-21097,-25073,-21148,-25030,-21199,-24986,-21250,-24943,-21301,-24899,-21352,-24856,-21403,-24812,-21454,-24768,-21504,-24724,-21555,-24680,-21605,-24636,-21656,-24592,-21706,-24547,-21756,-24503,-21806,-24458,-21856,-24414,-21906,-24369,-21956,-24324,-22005,-24279,-22055,-24234,-22105,-24189,-22154,-24144,-22203,-24098,-22253,-24053,-22302,-24007,-22351,-23962,-22400,-23916,-22449,-23870,-22497,-23824,-22546,-23778,-22595,-23732,-22643,-23686,-22692,-23639,-22740,-23593,-22788,-23546,-22836,-23500,-22884,-23453,-22932,-23406,-22980,-23359,-23028,-23312,-23075,-23265,-23123,-23218,-23170,-23170,-23218,-23123,-23265,-23075,-23312,-23028,-23359,-22980,-23406,-22932,-23453,-22884,-23500,-22836,-23546,-22788,-23593,-22740,-23639,-22692,-23686,-22643,-23732,-22595,-23778,-22546,-23824,-22497,-23870,-22449,-23916,-22400,-23962,-22351,-24007,-22302,-24053,-22253,-24098,-22203,-24144,-22154,-24189,-22105,-24234,-22055,-24279,-22005,-24324,-21956,-24369,-21906,-24414,-21856,-24458,-21806,-24503,-21756,-24547,-21706,-24592,-21656,-24636,-21605,-24680,-21555,-24724,-21504,-24768,-21454,-24812,-21403,-24856,-21352,-24899,-21301,-24943,-21250,-24986,-21199,-25030,-21148,-25073,-21097,-25116,-21046,-25159,-20994,-25202,-20943,-25244,-20891,-25287,-20839,-25330,-20788,-25372,-20736,-25415,-20684,-25457,-20632,-25499,-20580,-25541,-20528,-25583,-20475,-25625,-20423,-25666,-20370,-25708,-20318,-25750,-20265,-25791,-20213,-25832,-20160,-25873,-20107,-25914,-20054,-25955,-20001,-25996,-19948,-26037,-19895,-26078,-19841,-26118,-19788,-26159,-19734,-26199,-19681,-26239,-19627,-26279,-19574,-26319,-19520,-26359,-19466,-26399,-19412,-26438,-19358,-26478,-19304,-26517,-19250,-26557,-19195,-26596,-19141,-26635,-19087,-26674,-19032,-26713,-18977,-26752,-18923,-26790,-18868,-26829,-18813,-26867,-18758,-26906,-18703,-26944,-18648,-26982,-18593,-27020,-18538,-27058,-18483,-27095,-18427,-27133,-18372,-27171,-18316,-27208,-18261,-27245,-18205,-27282,-18149,-27320,-18093,-27356,-18037,-27393,-17981,-27430,-17925,-27467,-17869,-27503,-17813,-27539,-17757,-27576,-17700,-27612,-17644,-27648,-17587,-27684,-17531,-27720,-17474,-27755,-17417,-27791,-17361,-27826,-17304,-27862,-17247,-27897,-17190,-27932,-17133,-27967,-17075,-28002,-17018,-28037,-16961,-28071,-16904,-28106,-16846,-28140,-16789,-28174,-16731,-28209,-16673,-28243,-16616,-28276,-16558,-28310,-16500,-28344,-16442,-28378,-16384,-28411,-16326,-28444,-16268,-28478,-16210,-28511,-16151,-28544,-16093,-28576,-16035,-28609,-15976,-28642,-15918,-28674,-15859,-28707,-15800,-28739,-15741,-28771,-15683,-28803,-15624,-28835,-15565,-28867,-15506,-28898,-15447,-28930,-15388,-28961,-15328,-28993,-15269,-29024,-15210,-29055,-15150,-29086,-15091,-29117,-15031,-29147,-14972,-29178,-14912,-29208,-14853,-29239,-14793,-29269,-14733,-29299,-14673,-29329,-14613,-29359,-14553,-29388,-14493,-29418,-14433,-29447,-14373,-29477,-14312,-29506,-14252,-29535,-14192,-29564,-14131,-29593,-14071,-29622,-14010,-29650,-13950,-29679,-13889,-29707,-13828,-29735,-13767,-29763,-13707,-29791,-13646,-29819,-13585,-29847,-13524,-29874,-13463,-29902,-13401,-29929,-13340,-29956,-13279,-29984,-13218,-30010,-13156,-30037,-13095,-30064,-13034,-30091,-12972,-30117,-12910,-30143,-12849,-30170,-12787,-30196,-12725,-30222,-12664,-30248,-12602,-30273,-12540,-30299,-12478,-30324,-12416,-30350,-12354,-30375,-12292,-30400,-12230,-30425,-12167,-30450,-12105,-30474,-12043,-30499,-11981,-30523,-11918,-30548,-11856,-30572,-11793,-30596,-11731,-30620,-11668,-30644,-11605,-30667,-11543,-30691,-11480,-30714,-11417,-30738,-11354,-30761,-11291,-30784,-11228,-30807,-11165,-30829,-11102,-30852,-11039,-30875,-10976,-30897,-10913,-30919,-10850,-30941,-10787,-30963,-10723,-30985,-10660,-31007,-10597,-31029,-10533,-31050,-10470,-31071,-10406,-31093,-10343,-31114,-10279,-31135,-10215,-31155,-10152,-31176,-10088,-31197,-10024,-31217,-9960,-31237,-9896,-31258,-9832,-31278,-9768,-31298,-9704,-31317,-9640,-31337,-9576,-31357,-9512,-31376,-9448,-31395,-9384,-31414,-9320,-31433,-9255,-31452,-9191,-31471,-9127,-31490,-9062,-31508,-8998,-31526,-8933,-31545,-8869,-31563,-8804,-31581,-8740,-31598,-8675,-31616,-8611,-31634,-8546,-31651,-8481,-31668,-8416,-31685,-8352,-31702,-8287,-31719,-8222,-31736,-8157,-31753,-8092,-31769,-8027,-31786,-7962,-31802,-7897,-31818,-7832,-31834,-7767,-31850,-7702,-31865,-7637,-31881,-7572,-31896,-7506,-31912,-7441,-31927,-7376,-31942,-7311,-31957,-7245,-31971,-7180,-31986,-7114,-32000,-7049,-32015,-6983,-32029,-6918,-32043,-6852,-32057,-6787,-32071,-6721,-32085,-6656,-32098,-6590,-32111,-6524,-32125,-6459,-32138,-6393,-32151,-6327,-32164,-6262,-32177,-6196,-32189,-6130,-32202,-6064,-32214,-5998,-32226,-5932,-32238,-5866,-32250,-5800,-32262,-5734,-32274,-5668,-32285,-5602,-32296,-5536,-32308,-5470,-32319,-5404,-32330,-5338,-32341,-5272,-32351,-5206,-32362,-5140,-32372,-5073,-32383,-5007,-32393,-4941,-32403,-4875,-32413,-4808,-32423,-4742,-32432,-4676,-32442,-4609,-32451,-4543,-32460,-4477,-32469,-4410,-32478,-4344,-32487,-4277,-32496,-4211,-32504,-4145,-32513,-4078,-32521,-4012,-32529,-3945,-32537,-3878,-32545,-3812,-32553,-3745,-32560,-3679,-32568,-3612,-32575,-3546,-32582,-3479,-32589,-3412,-32596,-3346,-32603,-3279,-32610,-3212,-32616,-3146,-32623,-3079,-32629,-3012,-32635,-2945,-32641,-2879,-32647,-2812,-32652,-2745,-32658,-2678,-32663,-2611,-32669,-2545,-32674,-2478,-32679,-2411,-32684,-2344,-32688,-2277,-32693,-2210,-32697,-2144,-32702,-2077,-32706,-2010,-32710,-1943,-32714,-1876,-32718,-1809,-32721,-1742,-32725,-1675,-32728,-1608,-32731,-1541,-32734,-1474,-32737,-1407,-32740,-1340,-32743,-1274,-32745,-1207,-32748,-1140,-32750,-1073,-32752,-1006,-32754,-939,-32756,-872,-32758,-805,-32759,-738,-32761,-671,-32762,-604,-32763,-537,-32764,-470,-32765,-403,-32766,-336,-32766,-269,-32767,-202,-32767,-135,-32767,-68,-32767,-1,-32767,67,-32767,134,-32767,201,-32766,268,-32766,335,-32765,402,-32764,469,-32763,536,-32762,603,-32761,670,-32759,737,-32758,804,-32756,871,-32754,938,-32752,1005,-32750,1072,-32748,1139,-32745,1206,-32743,1273,-32740,1339,-32737,1406,-32734,1473,-32731,1540,-32728,1607,-32725,1674,-32721,1741,-32718,1808,-32714,1875,-32710,1942,-32706,2009,-32702,2076,-32697,2143,-32693,2209,-32688,2276,-32684,2343,-32679,2410,-32674,2477,-32669,2544,-32663,2610,-32658,2677,-32652,2744,-32647,2811,-32641,2878,-32635,2944,-32629,3011,-32623,3078,-32616,3145,-32610,3211,-32603,3278,-32596,3345,-32589,3411,-32582,3478,-32575,3545,-32568,3611,-32560,3678,-32553,3744,-32545,3811,-32537,3877,-32529,3944,-32521,4011,-32513,4077,-32504,4144,-32496,4210,-32487,4276,-32478,4343,-32469,4409,-32460,4476,-32451,4542,-32442,4608,-32432,4675,-32423,4741,-32413,4807,-32403,4874,-32393,4940,-32383,5006,-32372,5072,-32362,5139,-32351,5205,-32341,5271,-32330,5337,-32319,5403,-32308,5469,-32296,5535,-32285,5601,-32274,5667,-32262,5733,-32250,5799,-32238,5865,-32226,5931,-32214,5997,-32202,6063,-32189,6129,-32177,6195,-32164,6261,-32151,6326,-32138,6392,-32125,6458,-32111,6523,-32098,6589,-32085,6655,-32071,6720,-32057,6786,-32043,6851,-32029,6917,-32015,6982,-32000,7048,-31986,7113,-31971,7179,-31957,7244,-31942,7310,-31927,7375,-31912,7440,-31896,7505,-31881,7571,-31865,7636,-31850,7701,-31834,7766,-31818,7831,-31802,7896,-31786,7961,-31769,8026,-31753,8091,-31736,8156,-31719,8221,-31702,8286,-31685,8351,-31668,8415,-31651,8480,-31634,8545,-31616,8610,-31598,8674,-31581,8739,-31563,8803,-31545,8868,-31526,8932,-31508,8997,-31490,9061,-31471,9126,-31452,9190,-31433,9254,-31414,9319,-31395,9383,-31376,9447,-31357,9511,-31337,9575,-31317,9639,-31298,9703,-31278,9767,-31258,9831,-31237,9895,-31217,9959,-31197,10023,-31176,10087,-31155,10151,-31135,10214,-31114,10278,-31093,10342,-31071,10405,-31050,10469,-31029,10532,-31007,10596,-30985,10659,-30963,10722,-30941,10786,-30919,10849,-30897,10912,-30875,10975,-30852,11038,-30829,11101,-30807,11164,-30784,11227,-30761,11290,-30738,11353,-30714,11416,-30691,11479,-30667,11542,-30644,11604,-30620,11667,-30596,11730,-30572,11792,-30548,11855,-30523,11917,-30499,11980,-30474,12042,-30450,12104,-30425,12166,-30400,12229,-30375,12291,-30350,12353,-30324,12415,-30299,12477,-30273,12539,-30248,12601,-30222,12663,-30196,12724,-30170,12786,-30143,12848,-30117,12909,-30091,12971,-30064,13033,-30037,13094,-30010,13155,-29984,13217,-29956,13278,-29929,13339,-29902,13400,-29874,13462,-29847,13523,-29819,13584,-29791,13645,-29763,13706,-29735,13766,-29707,13827,-29679,13888,-29650,13949,-29622,14009,-29593,14070,-29564,14130,-29535,14191,-29506,14251,-29477,14311,-29447,14372,-29418,14432,-29388,14492,-29359,14552,-29329,14612,-29299,14672,-29269,14732,-29239,14792,-29208,14852,-29178,14911,-29147,14971,-29117,15030,-29086,15090,-29055,15149,-29024,15209,-28993,15268,-28961,15327,-28930,15387,-28898,15446,-28867,15505,-28835,15564,-28803,15623,-28771,15682,-28739,15740,-28707,15799,-28674,15858,-28642,15917,-28609,15975,-28576,16034,-28544,16092,-28511,16150,-28478,16209,-28444,16267,-28411,16325,-28378,16383,-28344,16441,-28310,16499,-28276,16557,-28243,16615,-28209,16672,-28174,16730,-28140,16788,-28106,16845,-28071,16903,-28037,16960,-28002,17017,-27967,17074,-27932,17132,-27897,17189,-27862,17246,-27826,17303,-27791,17360,-27755,17416,-27720,17473,-27684,17530,-27648,17586,-27612,17643,-27576,17699,-27539,17756,-27503,17812,-27467,17868,-27430,17924,-27393,17980,-27356,18036,-27320,18092,-27282,18148,-27245,18204,-27208,18260,-27171,18315,-27133,18371,-27095,18426,-27058,18482,-27020,18537,-26982,18592,-26944,18647,-26906,18702,-26867,18757,-26829,18812,-26790,18867,-26752,18922,-26713,18976,-26674,19031,-26635,19086,-26596,19140,-26557,19194,-26517,19249,-26478,19303,-26438,19357,-26399,19411,-26359,19465,-26319,19519,-26279,19573,-26239,19626,-26199,19680,-26159,19733,-26118,19787,-26078,19840,-26037,19894,-25996,19947,-25955,20000,-25914,20053,-25873,20106,-25832,20159,-25791,20212,-25750,20264,-25708,20317,-25666,20369,-25625,20422,-25583,20474,-25541,20527,-25499,20579,-25457,20631,-25415,20683,-25372,20735,-25330,20787,-25287,20838,-25244,20890,-25202,20942,-25159,20993,-25116,21045,-25073,21096,-25030,21147,-24986,21198,-24943,21249,-24899,21300,-24856,21351,-24812,21402,-24768,21453,-24724,21503,-24680,21554,-24636,21604,-24592,21655,-24547,21705,-24503,21755,-24458,21805,-24414,21855,-24369,21905,-24324,21955,-24279,22004,-24234,22054,-24189,22104,-24144,22153,-24098,22202,-24053,22252,-24007,22301,-23962,22350,-23916,22399,-23870,22448,-23824,22496,-23778,22545,-23732,22594,-23686,22642,-23639,22691,-23593,22739,-23546,22787,-23500,22835,-23453,22883,-23406,22931,-23359,22979,-23312,23027,-23265,23074,-23218,23122,-23170,23169,-23123,23217,-23075,23264,-23028,23311,-22980,23358,-22932,23405,-22884,23452,-22836,23499,-22788,23545,-22740,23592,-22692,23638,-22643,23685,-22595,23731,-22546,23777,-22497,23823,-22449,23869,-22400,23915,-22351,23961,-22302,24006,-22253,24052,-22203,24097,-22154,24143,-22105,24188,-22055,24233,-22005,24278,-21956,24323,-21906,24368,-21856,24413,-21806,24457,-21756,24502,-21706,24546,-21656,24591,-21605,24635,-21555,24679,-21504,24723,-21454,24767,-21403,24811,-21352,24855,-21301,24898,-21250,24942,-21199,24985,-21148,25029,-21097,25072,-21046,25115,-20994,25158,-20943,25201,-20891,25243,-20839,25286,-20788,25329,-20736,25371,-20684,25414,-20632,25456,-20580,25498,-20528,25540,-20475,25582,-20423,25624,-20370,25665,-20318,25707,-20265,25749,-20213,25790,-20160,25831,-20107,25872,-20054,25913,-20001,25954,-19948,25995,-19895,26036,-19841,26077,-19788,26117,-19734,26158,-19681,26198,-19627,26238,-19574,26278,-19520,26318,-19466,26358,-19412,26398,-19358,26437,-19304,26477,-19250,26516,-19195,26556,-19141,26595,-19087,26634,-19032,26673,-18977,26712,-18923,26751,-18868,26789,-18813,26828,-18758,26866,-18703,26905,-18648,26943,-18593,26981,-18538,27019,-18483,27057,-18427,27094,-18372,27132,-18316,27170,-18261,27207,-18205,27244,-18149,27281,-18093,27319,-18037,27355,-17981,27392,-17925,27429,-17869,27466,-17813,27502,-17757,27538,-17700,27575,-17644,27611,-17587,27647,-17531,27683,-17474,27719,-17417,27754,-17361,27790,-17304,27825,-17247,27861,-17190,27896,-17133,27931,-17075,27966,-17018,28001,-16961,28036,-16904,28070,-16846,28105,-16789,28139,-16731,28173,-16673,28208,-16616,28242,-16558,28275,-16500,28309,-16442,28343}; diff --git a/openair1/PHY/TOOLS/twiddles4096.h b/openair1/PHY/TOOLS/twiddles4096.h index df25ae5364..af2b6a8887 100644 --- a/openair1/PHY/TOOLS/twiddles4096.h +++ b/openair1/PHY/TOOLS/twiddles4096.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:1023)/4096)); twb = floor(32767*exp(-sqrt(-1)*2*pi*2*(0:1023)/4096)); diff --git a/openair1/PHY/TOOLS/twiddles8192.h b/openair1/PHY/TOOLS/twiddles8192.h index ddb8ab2273..6b76619013 100644 --- a/openair1/PHY/TOOLS/twiddles8192.h +++ b/openair1/PHY/TOOLS/twiddles8192.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Twiddles generated with twa = floor(32767*exp(-sqrt(-1)*2*pi*(0:4095)/8192)); twa2 = zeros(1,2*4096); diff --git a/openair1/PHY/TOOLS/vars.h b/openair1/PHY/TOOLS/vars.h index 7f3cc6e31f..4690bba42e 100644 --- a/openair1/PHY/TOOLS/vars.h +++ b/openair1/PHY/TOOLS/vars.h @@ -1,28 +1,21 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h old mode 100755 new mode 100644 index 26239b024c..6f52867d2d --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/defs.h \brief Top-level defines and structure definitions @@ -40,27 +32,37 @@ #ifndef __PHY_DEFS__H__ #define __PHY_DEFS__H__ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + #include #include #include #include #include +#include "common_lib.h" +#include "msc.h" + +#include "openair2/PHY_INTERFACE/IF_Module.h" + //#include #include "assertions.h" #ifdef MEX # define msg mexPrintf -#else -# ifdef OPENAIR2 -# if ENABLE_RAL -# include "collection/hashtable/hashtable.h" -# include "COMMON/ral_messages_types.h" -# include "UTIL/queue.h" -# endif -# include "log.h" -# define msg(aRGS...) LOG_D(PHY, ##aRGS) -# else -# define msg printf -# endif #endif //use msg in the real-time thread context #define msg_nrt printf @@ -78,12 +80,9 @@ #define openair_free(y,x) free((y)) #define PAGE_SIZE 4096 -//#ifdef SHRLIBDEV -//extern int rxrescale; -//#define RX_IQRESCALELEN rxrescale -//#else -//#define RX_IQRESCALELEN 15 -//#endif +#define RX_NB_TH_MAX 2 +#define RX_NB_TH 2 + //! \brief Allocate \c size bytes of memory on the heap with alignment 16 and zero it afterwards. //! If no more memory is available, this function will terminate the program with an assertion error. @@ -129,30 +128,93 @@ static inline void* malloc16_clear( size_t size ) #include "PHY/CODING/defs.h" #include "PHY/TOOLS/defs.h" #include "platform_types.h" - -#ifdef OPENAIR_LTE - -//#include "PHY/LTE_ESTIMATION/defs.h" +#define MAX_NUM_RU_PER_eNB 64 #include "PHY/LTE_TRANSPORT/defs.h" #include +#include "targets/ARCH/COMMON/common_lib.h" +#include "targets/COMMON/openairinterface5g_limits.h" + +#if defined(EXMIMO) || defined(OAI_USRP) +//#define NUMBER_OF_eNB_MAX 1 +//#define NUMBER_OF_UE_MAX 16 + +//#define NUMBER_OF_CONNECTED_eNB_MAX 3 +#else +#ifdef LARGE_SCALE +//#define NUMBER_OF_eNB_MAX 2 +//#define NUMBER_OF_UE_MAX 120 +//#define NUMBER_OF_CONNECTED_eNB_MAX 1 // to save some memory +#else +//#define NUMBER_OF_eNB_MAX 3 +//#define NUMBER_OF_UE_MAX 16 +//#define NUMBER_OF_RU_MAX 64 +//#define NUMBER_OF_CONNECTED_eNB_MAX 1 +#endif +#endif +#define NUMBER_OF_SUBBANDS_MAX 13 +#define NUMBER_OF_HARQ_PID_MAX 8 + +#define MAX_FRAME_NUMBER 0x400 + + + +#define NUMBER_OF_RN_MAX 3 +typedef enum {no_relay=1,unicast_relay_type1,unicast_relay_type2, multicast_relay} relaying_type_t; + + + +#define MCS_COUNT 28 +#define MCS_TABLE_LENGTH_MAX 64 + + #define NUM_DCI_MAX 32 #define NUMBER_OF_eNB_SECTORS_MAX 3 #define NB_BANDS_MAX 8 +#define MAX_BANDS_PER_RRU 4 + + +#ifdef OCP_FRAMEWORK +#include +#else typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3,debug_prach=4,no_L2_connect=5,calib_prach_tx=6,rx_dump_frame=7,loop_through_memory=8} runmode_t; +/*! \brief Extension Type */ +typedef enum { + CYCLIC_PREFIX, + CYCLIC_SUFFIX, + ZEROS, + NONE +} Extension_t; + enum transmission_access_mode { NO_ACCESS=0, POSTPONED_ACCESS, CANCELED_ACCESS, UNKNOWN_ACCESS, SCHEDULED_ACCESS, - CBA_ACCESS -}; + CBA_ACCESS}; + +typedef enum { + eNodeB_3GPP=0, // classical eNodeB function + NGFI_RAU_IF5, // RAU with NGFI IF5 + NGFI_RAU_IF4p5, // RAU with NFGI IF4p5 + NGFI_RRU_IF5, // NGFI_RRU (NGFI remote radio-unit,IF5) + NGFI_RRU_IF4p5, // NGFI_RRU (NGFI remote radio-unit,IF4p5) + MBP_RRU_IF5 // Mobipass RRU +} node_function_t; + +typedef enum { + + synch_to_ext_device=0, // synch to RF or Ethernet device + synch_to_other, // synch to another source_(timer, other RU) + synch_to_mobipass_standalone // special case for mobipass in standalone mode +} node_timing_t; +#endif typedef struct UE_SCAN_INFO_s { /// 10 best amplitudes (linear) for each pss signals @@ -161,22 +223,26 @@ typedef struct UE_SCAN_INFO_s { int32_t freq_offset_Hz[3][10]; } UE_SCAN_INFO_t; -#if ENABLE_RAL -typedef struct ral_threshold_phy_s { - SLIST_ENTRY(ral_threshold_phy_s) ral_thresholds; - ral_threshold_t threshold; - ral_th_action_t th_action; - ral_link_param_t link_param; - long timer_id; -} ral_threshold_phy_t; -#endif +/// Top-level PHY Data Structure for RN +typedef struct { + /// Module ID indicator for this instance + uint8_t Mod_id; + uint32_t frame; + // phy_vars_eNB + // phy_vars ue + // cuurently only used to store and forward the PMCH + uint8_t mch_avtive[10]; + uint8_t sync_area[10]; // num SF + LTE_UE_DLSCH_t *dlsch_rn_MCH[10]; -/// Context data structure for eNB subframe processing +} PHY_VARS_RN; + +/// Context data structure for RX/TX portion of subframe processing typedef struct { /// Component Carrier index uint8_t CC_id; - /// subframe index - int subframe; + /// timestamp transmitted to HW + openair0_timestamp timestamp_tx; /// subframe to act upon for transmission int subframe_tx; /// subframe to act upon for reception @@ -185,59 +251,754 @@ typedef struct { int frame_tx; /// frame to act upon for reception int frame_rx; - /// \brief Instance count for tx processing thread. - /// \internal This variable is protected by \ref mutex_tx. - int instance_cnt_tx; - /// \brief Instance count for rx processing thread. - /// \internal This variable is protected by \ref mutex_rx. - int instance_cnt_rx; - /// pthread structure for tx processing thread - pthread_t pthread_tx; - /// pthread structure for rx processing thread - pthread_t pthread_rx; + /// \brief Instance count for RXn-TXnp4 processing thread. + /// \internal This variable is protected by \ref mutex_rxtx. + int instance_cnt_rxtx; + /// pthread structure for RXn-TXnp4 processing thread + pthread_t pthread_rxtx; + /// pthread attributes for RXn-TXnp4 processing thread + pthread_attr_t attr_rxtx; /// condition variable for tx processing thread - pthread_cond_t cond_tx; - /// condition variable for rx processing thread - pthread_cond_t cond_rx; - /// mutex for tx processing thread - pthread_mutex_t mutex_tx; - /// mutex for tx processing thread - pthread_mutex_t mutex_rx; + pthread_cond_t cond_rxtx; + /// mutex for RXn-TXnp4 processing thread + pthread_mutex_t mutex_rxtx; + /// scheduling parameters for RXn-TXnp4 thread + struct sched_param sched_param_rxtx; +} eNB_rxtx_proc_t; + +typedef struct { + struct PHY_VARS_eNB_s *eNB; + int UE_id; + int harq_pid; + int llr8_flag; + int ret; +} td_params; + +typedef struct { + struct PHY_VARS_eNB_s *eNB; + LTE_eNB_DLSCH_t *dlsch; + int G; + int harq_pid; +} te_params; + +typedef struct RU_proc_t_s { + /// Pointer to associated RU descriptor + struct RU_t_s *ru; + /// timestamp received from HW + openair0_timestamp timestamp_rx; + /// timestamp to send to "slave rru" + openair0_timestamp timestamp_tx; + /// subframe to act upon for reception + int subframe_rx; + /// subframe to act upon for transmission + int subframe_tx; + /// subframe to act upon for reception of prach + int subframe_prach; +#ifdef Rel14 + /// subframe to act upon for reception of prach BL/CE UEs + int subframe_prach_br; +#endif + /// frame to act upon for reception + int frame_rx; + /// frame to act upon for transmission + int frame_tx; + /// unwrapped frame count + int frame_tx_unwrap; + /// frame to act upon for reception of prach + int frame_prach; +#ifdef Rel14 + /// frame to act upon for reception of prach + int frame_prach_br; +#endif + /// frame offset for slave RUs (to correct for frame asynchronism at startup) + int frame_offset; + /// \brief Instance count for FH processing thread. + /// \internal This variable is protected by \ref mutex_FH. + int instance_cnt_FH; + /// \internal This variable is protected by \ref mutex_prach. + int instance_cnt_prach; +#ifdef Rel14 + /// \internal This variable is protected by \ref mutex_prach. + int instance_cnt_prach_br; +#endif + /// \internal This variable is protected by \ref mutex_synch. + int instance_cnt_synch; + /// \internal This variable is protected by \ref mutex_eNBs. + int instance_cnt_eNBs; + /// \brief Instance count for rx processing thread. + /// \internal This variable is protected by \ref mutex_asynch_rxtx. + int instance_cnt_asynch_rxtx; + /// \internal This variable is protected by \ref mutex_fep + int instance_cnt_fep; + /// \internal This variable is protected by \ref mutex_fep + int instance_cnt_feptx; + /// pthread structure for RU FH processing thread + pthread_t pthread_FH; + /// pthread structure for RU prach processing thread + pthread_t pthread_prach; +#ifdef Rel14 + /// pthread structure for RU prach processing thread BL/CE UEs + pthread_t pthread_prach_br; +#endif + /// pthread struct for RU synch thread + pthread_t pthread_synch; + /// pthread struct for RU RX FEP worker thread + pthread_t pthread_fep; + /// pthread struct for RU RX FEPTX worker thread + pthread_t pthread_feptx; + /// pthread structure for asychronous RX/TX processing thread + pthread_t pthread_asynch_rxtx; + /// flag to indicate first RX acquisition + int first_rx; + /// flag to indicate first TX transmission + int first_tx; + /// pthread attributes for RU FH processing thread + pthread_attr_t attr_FH; + /// pthread attributes for RU prach + pthread_attr_t attr_prach; +#ifdef Rel14 + /// pthread attributes for RU prach BL/CE UEs + pthread_attr_t attr_prach_br; +#endif + /// pthread attributes for RU synch thread + pthread_attr_t attr_synch; + /// pthread attributes for asynchronous RX thread + pthread_attr_t attr_asynch_rxtx; + /// pthread attributes for worker fep thread + pthread_attr_t attr_fep; + /// pthread attributes for worker feptx thread + pthread_attr_t attr_feptx; + /// scheduling parameters for RU FH thread + struct sched_param sched_param_FH; + /// scheduling parameters for RU prach thread + struct sched_param sched_param_prach; +#ifdef Rel14 + /// scheduling parameters for RU prach thread BL/CE UEs + struct sched_param sched_param_prach_br; +#endif + /// scheduling parameters for RU synch thread + struct sched_param sched_param_synch; + /// scheduling parameters for asynch_rxtx thread + struct sched_param sched_param_asynch_rxtx; + /// condition variable for RU FH thread + pthread_cond_t cond_FH; + /// condition variable for RU prach thread + pthread_cond_t cond_prach; +#ifdef Rel14 + /// condition variable for RU prach thread BL/CE UEs + pthread_cond_t cond_prach_br; +#endif + /// condition variable for RU synch thread + pthread_cond_t cond_synch; + /// condition variable for asynch RX/TX thread + pthread_cond_t cond_asynch_rxtx; + /// condition varaible for RU RX FEP thread + pthread_cond_t cond_fep; + /// condition varaible for RU RX FEPTX thread + pthread_cond_t cond_feptx; + /// condition variable for eNB signal + pthread_cond_t cond_eNBs; + /// mutex for RU FH + pthread_mutex_t mutex_FH; + /// mutex for RU prach + pthread_mutex_t mutex_prach; +#ifdef Rel14 + /// mutex for RU prach BL/CE UEs + pthread_mutex_t mutex_prach_br; +#endif + /// mutex for RU synch + pthread_mutex_t mutex_synch; + /// mutex for eNB signal + pthread_mutex_t mutex_eNBs; + /// mutex for asynch RX/TX thread + pthread_mutex_t mutex_asynch_rxtx; + /// mutex for fep RX worker thread + pthread_mutex_t mutex_fep; + /// mutex for fep TX worker thread + pthread_mutex_t mutex_feptx; + /// symbol mask for IF4p5 reception per subframe + uint32_t symbol_mask[10]; + /// number of slave threads + int num_slaves; + /// array of pointers to slaves + struct RU_proc_t_s **slave_proc; +} RU_proc_t; + +/// Context data structure for eNB subframe processing +typedef struct eNB_proc_t_s { + /// Component Carrier index + uint8_t CC_id; + /// thread index + int thread_index; + /// timestamp received from HW + openair0_timestamp timestamp_rx; + /// timestamp to send to "slave rru" + openair0_timestamp timestamp_tx; + /// subframe to act upon for reception + int subframe_rx; + /// subframe to act upon for PRACH + int subframe_prach; +#ifdef Rel14 + /// subframe to act upon for reception of prach BL/CE UEs + int subframe_prach_br; +#endif + /// frame to act upon for reception + int frame_rx; + /// frame to act upon for transmission + int frame_tx; + /// frame to act upon for PRACH + int frame_prach; +#ifdef Rel14 + /// frame to act upon for PRACH BL/CE UEs + int frame_prach_br; +#endif + /// \internal This variable is protected by \ref mutex_td. + int instance_cnt_td; + /// \internal This variable is protected by \ref mutex_te. + int instance_cnt_te; + /// \internal This variable is protected by \ref mutex_prach. + int instance_cnt_prach; +#ifdef Rel14 + /// \internal This variable is protected by \ref mutex_prach for BL/CE UEs. + int instance_cnt_prach_br; +#endif + // instance count for over-the-air eNB synchronization + int instance_cnt_synch; + /// \internal This variable is protected by \ref mutex_asynch_rxtx. + int instance_cnt_asynch_rxtx; + /// pthread structure for eNB single processing thread + pthread_t pthread_single; + /// pthread structure for asychronous RX/TX processing thread + pthread_t pthread_asynch_rxtx; + /// flag to indicate first RX acquisition + int first_rx; + /// flag to indicate first TX transmission + int first_tx; + /// pthread attributes for parallel turbo-decoder thread + pthread_attr_t attr_td; + /// pthread attributes for parallel turbo-encoder thread + pthread_attr_t attr_te; + /// pthread attributes for single eNB processing thread + pthread_attr_t attr_single; + /// pthread attributes for prach processing thread + pthread_attr_t attr_prach; +#ifdef Rel14 + /// pthread attributes for prach processing thread BL/CE UEs + pthread_attr_t attr_prach_br; +#endif + /// pthread attributes for asynchronous RX thread + pthread_attr_t attr_asynch_rxtx; + /// scheduling parameters for parallel turbo-decoder thread + struct sched_param sched_param_td; + /// scheduling parameters for parallel turbo-encoder thread + struct sched_param sched_param_te; + /// scheduling parameters for single eNB thread + struct sched_param sched_param_single; + /// scheduling parameters for prach thread + struct sched_param sched_param_prach; +#ifdef Rel14 + /// scheduling parameters for prach thread + struct sched_param sched_param_prach_br; +#endif + /// scheduling parameters for asynch_rxtx thread + struct sched_param sched_param_asynch_rxtx; + /// pthread structure for parallel turbo-decoder thread + pthread_t pthread_td; + /// pthread structure for parallel turbo-encoder thread + pthread_t pthread_te; + /// pthread structure for PRACH thread + pthread_t pthread_prach; +#ifdef Rel14 + /// pthread structure for PRACH thread BL/CE UEs + pthread_t pthread_prach_br; +#endif + /// condition variable for parallel turbo-decoder thread + pthread_cond_t cond_td; + /// condition variable for parallel turbo-encoder thread + pthread_cond_t cond_te; + /// condition variable for PRACH processing thread; + pthread_cond_t cond_prach; +#ifdef Rel14 + /// condition variable for PRACH processing thread BL/CE UEs; + pthread_cond_t cond_prach_br; +#endif + /// condition variable for asynch RX/TX thread + pthread_cond_t cond_asynch_rxtx; + /// mutex for parallel turbo-decoder thread + pthread_mutex_t mutex_td; + /// mutex for parallel turbo-encoder thread + pthread_mutex_t mutex_te; + /// mutex for PRACH thread + pthread_mutex_t mutex_prach; +#ifdef Rel14 + /// mutex for PRACH thread for BL/CE UEs + pthread_mutex_t mutex_prach_br; +#endif + /// mutex for asynch RX/TX thread + pthread_mutex_t mutex_asynch_rxtx; + /// mutex for RU access to eNB processing (PDSCH/PUSCH) + pthread_mutex_t mutex_RU; + /// mutex for RU access to eNB processing (PRACH) + pthread_mutex_t mutex_RU_PRACH; + /// mutex for RU access to eNB processing (PRACH BR) + pthread_mutex_t mutex_RU_PRACH_br; + /// mask for RUs serving eNB (PDSCH/PUSCH) + int RU_mask; + /// mask for RUs serving eNB (PRACH) + int RU_mask_prach; +#ifdef Rel14 + /// mask for RUs serving eNB (PRACH) + int RU_mask_prach_br; +#endif + /// parameters for turbo-decoding worker thread + td_params tdp; + /// parameters for turbo-encoding worker thread + te_params tep; + /// set of scheduling variables RXn-TXnp4 threads + eNB_rxtx_proc_t proc_rxtx[2]; } eNB_proc_t; -//! \brief Number of eNB TX and RX threads. -//! This number must be equal to the number of LTE subframes (10). Each thread is responsible for a single subframe. -#define NUM_ENB_THREADS 10 + +/// Context data structure for RX/TX portion of subframe processing +typedef struct { + /// index of the current UE RX/TX proc + int proc_id; + /// Component Carrier index + uint8_t CC_id; + /// timestamp transmitted to HW + openair0_timestamp timestamp_tx; + /// subframe to act upon for transmission + int subframe_tx; + /// subframe to act upon for reception + int subframe_rx; + /// frame to act upon for transmission + int frame_tx; + /// frame to act upon for reception + int frame_rx; + /// \brief Instance count for RXn-TXnp4 processing thread. + /// \internal This variable is protected by \ref mutex_rxtx. + int instance_cnt_rxtx; + /// pthread structure for RXn-TXnp4 processing thread + pthread_t pthread_rxtx; + /// pthread attributes for RXn-TXnp4 processing thread + pthread_attr_t attr_rxtx; + /// condition variable for tx processing thread + pthread_cond_t cond_rxtx; + /// mutex for RXn-TXnp4 processing thread + pthread_mutex_t mutex_rxtx; + /// scheduling parameters for RXn-TXnp4 thread + struct sched_param sched_param_rxtx; + + /// internal This variable is protected by ref mutex_fep_slot1. + //int instance_cnt_slot0_dl_processing; + int instance_cnt_slot1_dl_processing; + /// pthread descriptor fep_slot1 thread + //pthread_t pthread_slot0_dl_processing; + pthread_t pthread_slot1_dl_processing; + /// pthread attributes for fep_slot1 processing thread + // pthread_attr_t attr_slot0_dl_processing; + pthread_attr_t attr_slot1_dl_processing; + /// condition variable for UE fep_slot1 thread; + //pthread_cond_t cond_slot0_dl_processing; + pthread_cond_t cond_slot1_dl_processing; + /// mutex for UE synch thread + //pthread_mutex_t mutex_slot0_dl_processing; + pthread_mutex_t mutex_slot1_dl_processing; + // + uint8_t chan_est_pilot0_slot1_available; + uint8_t chan_est_slot1_available; + uint8_t llr_slot1_available; + uint8_t dci_slot0_available; + uint8_t first_symbol_available; + //uint8_t channel_level; + /// scheduling parameters for fep_slot1 thread + struct sched_param sched_param_fep_slot1; + + int sub_frame_start; + int sub_frame_step; + unsigned long long gotIQs; +} UE_rxtx_proc_t; + +/// Context data structure for eNB subframe processing +typedef struct { + /// Component Carrier index + uint8_t CC_id; + /// Last RX timestamp + openair0_timestamp timestamp_rx; + /// pthread attributes for main UE thread + pthread_attr_t attr_ue; + /// scheduling parameters for main UE thread + struct sched_param sched_param_ue; + /// pthread descriptor main UE thread + pthread_t pthread_ue; + /// \brief Instance count for synch thread. + /// \internal This variable is protected by \ref mutex_synch. + int instance_cnt_synch; + /// pthread attributes for synch processing thread + pthread_attr_t attr_synch; + /// scheduling parameters for synch thread + struct sched_param sched_param_synch; + /// pthread descriptor synch thread + pthread_t pthread_synch; + /// condition variable for UE synch thread; + pthread_cond_t cond_synch; + /// mutex for UE synch thread + pthread_mutex_t mutex_synch; + /// instance count for eNBs + int instance_cnt_eNBs; + /// set of scheduling variables RXn-TXnp4 threads + UE_rxtx_proc_t proc_rxtx[RX_NB_TH]; +} UE_proc_t; + +typedef enum { + LOCAL_RF =0, + REMOTE_IF5 =1, + REMOTE_MBP_IF5 =2, + REMOTE_IF4p5 =3, + REMOTE_IF1pp =4, + MAX_RU_IF_TYPES =5 +} RU_if_south_t; + +typedef struct RU_t_s{ + /// index of this ru + uint32_t idx; + /// Pointer to configuration file + char *rf_config_file; + /// southbound interface + RU_if_south_t if_south; + /// timing + node_timing_t if_timing; + /// function + node_function_t function; + /// Ethernet parameters for fronthaul interface + eth_params_t eth_params; + /// flag to indicate the RU is in synch with a master reference + int in_synch; + /// timing offset + int rx_offset; + /// flag to indicate the RU is a slave to another source + int is_slave; + /// Total gain of receive chain + uint32_t rx_total_gain_dB; + /// number of bands that this device can support + int num_bands; + /// band list + int band[MAX_BANDS_PER_RRU]; + /// number of RX paths on device + int nb_rx; + /// number of TX paths on device + int nb_tx; + /// maximum PDSCH RS EPRE + int max_pdschReferenceSignalPower; + /// maximum RX gain + int max_rxgain; + /// Attenuation of RX paths on device + int att_rx; + /// Attenuation of TX paths on device + int att_tx; + /// flag to indicate precoding operation in RU + int do_precoding; + /// Frame parameters + LTE_DL_FRAME_PARMS frame_parms; + ///timing offset used in TDD + int N_TA_offset; + /// RF device descriptor + openair0_device rfdevice; + /// HW configuration + openair0_config_t openair0_cfg; + /// Number of eNBs using this RU + int num_eNB; + /// list of eNBs using this RU + struct PHY_VARS_eNB_s *eNB_list[NUMBER_OF_eNB_MAX]; + /// Mapping of antenna ports to RF chain index + openair0_rf_map rf_map; + /// IF device descriptor + openair0_device ifdevice; + /// Pointer for ifdevice buffer struct + if_buffer_t ifbuffer; + /// if prach processing is to be performed in RU + int do_prach; + /// function pointer to synchronous RX fronthaul function (RRU,3GPP_eNB) + void (*fh_south_in)(struct RU_t_s *ru,int *frame, int *subframe); + /// function pointer to synchronous TX fronthaul function + void (*fh_south_out)(struct RU_t_s *ru); + /// function pointer to synchronous RX fronthaul function (RRU) + void (*fh_north_in)(struct RU_t_s *ru,int *frame, int *subframe); + /// function pointer to synchronous RX fronthaul function (RRU) + void (*fh_north_out)(struct RU_t_s *ru); + /// function pointer to asynchronous fronthaul interface + void (*fh_north_asynch_in)(struct RU_t_s *ru,int *frame, int *subframe); + /// function pointer to asynchronous fronthaul interface + void (*fh_south_asynch_in)(struct RU_t_s *ru,int *frame, int *subframe); + /// function pointer to initialization function for radio interface + int (*start_rf)(struct RU_t_s *ru); + /// function pointer to initialization function for radio interface + int (*start_if)(struct RU_t_s *ru,struct PHY_VARS_eNB_s *eNB); + /// function pointer to RX front-end processing routine (DFTs/prefix removal or NULL) + void (*feprx)(struct RU_t_s *ru); + /// function pointer to TX front-end processing routine (IDFTs and prefix removal or NULL) + void (*feptx_ofdm)(struct RU_t_s *ru); + /// function pointer to TX front-end processing routine (PRECODING) + void (*feptx_prec)(struct RU_t_s *ru); + /// function pointer to wakeup routine in lte-enb. + int (*wakeup_rxtx)(struct PHY_VARS_eNB_s *eNB, struct RU_t_s *ru); + /// function pointer to wakeup routine in lte-enb. + void (*wakeup_prach_eNB)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru,int frame,int subframe); + /// function pointer to wakeup routine in lte-enb. + void (*wakeup_prach_eNB_br)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru,int frame,int subframe); + /// function pointer to eNB entry routine + void (*eNB_top)(struct PHY_VARS_eNB_s *eNB, int frame_rx, int subframe_rx, char *string); + /// Timing statistics + time_stats_t ofdm_demod_stats; + /// Timing statistics (TX) + time_stats_t ofdm_mod_stats; + /// Timing statistics (RX Fronthaul + Compression) + time_stats_t rx_fhaul; + /// Timing statistics (TX Fronthaul + Compression) + time_stats_t tx_fhaul; + /// Timong statistics (Compression) + time_stats_t compression; + /// Timing statistics (Fronthaul transport) + time_stats_t transport; + /// RX and TX buffers for precoder output + RU_COMMON common; + /// beamforming weight vectors per eNB + int32_t **beam_weights[NUMBER_OF_eNB_MAX+1][15]; + + /// received frequency-domain signal for PRACH (IF4p5 RRU) + int16_t **prach_rxsigF; + /// received frequency-domain signal for PRACH BR (IF4p5 RRU) + int16_t **prach_rxsigF_br[4]; + /// sequence number for IF5 + uint8_t seqno; + /// initial timestamp used as an offset make first real timestamp 0 + openair0_timestamp ts_offset; + /// process scheduling variables + RU_proc_t proc; + /// stats thread pthread descriptor + pthread_t ru_stats_thread; +} RU_t; + + +typedef struct { + //unsigned int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (linear) + //unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (dB) + //unsigned short rx_avg_power_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //! estimated avg received signal power (dB) + + // RRC measurements + uint32_t rssi; + int n_adj_cells; + unsigned int adj_cell_id[6]; + uint32_t rsrq[7]; + uint32_t rsrp[7]; + float rsrp_filtered[7]; // after layer 3 filtering + float rsrq_filtered[7]; + // common measurements + //! estimated noise power (linear) + unsigned int n0_power[NB_ANTENNAS_RX]; + //! estimated noise power (dB) + unsigned short n0_power_dB[NB_ANTENNAS_RX]; + //! total estimated noise power (linear) + unsigned int n0_power_tot; + //! total estimated noise power (dB) + unsigned short n0_power_tot_dB; + //! average estimated noise power (linear) + unsigned int n0_power_avg; + //! average estimated noise power (dB) + unsigned short n0_power_avg_dB; + //! total estimated noise power (dBm) + short n0_power_tot_dBm; + + // UE measurements + //! estimated received spatial signal power (linear) + int rx_spatial_power[NUMBER_OF_CONNECTED_eNB_MAX][2][2]; + //! estimated received spatial signal power (dB) + unsigned short rx_spatial_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][2][2]; + + /// estimated received signal power (sum over all TX antennas) + //int wideband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; + int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; + /// estimated received signal power (sum over all TX antennas) + //int wideband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; + unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; + + /// estimated received signal power (sum over all TX/RX antennas) + int rx_power_tot[NUMBER_OF_CONNECTED_eNB_MAX]; //NEW + /// estimated received signal power (sum over all TX/RX antennas) + unsigned short rx_power_tot_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //NEW + + //! estimated received signal power (sum of all TX/RX antennas, time average) + int rx_power_avg[NUMBER_OF_CONNECTED_eNB_MAX]; + //! estimated received signal power (sum of all TX/RX antennas, time average, in dB) + unsigned short rx_power_avg_dB[NUMBER_OF_CONNECTED_eNB_MAX]; + + /// SINR (sum of all TX/RX antennas, in dB) + int wideband_cqi_tot[NUMBER_OF_CONNECTED_eNB_MAX]; + /// SINR (sum of all TX/RX antennas, time average, in dB) + int wideband_cqi_avg[NUMBER_OF_CONNECTED_eNB_MAX]; + + //! estimated rssi (dBm) + short rx_rssi_dBm[NUMBER_OF_CONNECTED_eNB_MAX]; + //! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation) + int rx_correlation[NUMBER_OF_CONNECTED_eNB_MAX][2]; + //! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation) + int rx_correlation_dB[NUMBER_OF_CONNECTED_eNB_MAX][2]; + + /// Wideband CQI (sum of all RX antennas, in dB, for precoded transmission modes (3,4,5,6), up to 4 spatial streams) + int precoded_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX+1][4]; + /// Subband CQI per RX antenna (= SINR) + int subband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX]; + /// Total Subband CQI (= SINR) + int subband_cqi_tot[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX]; + /// Subband CQI in dB (= SINR dB) + int subband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX]; + /// Total Subband CQI + int subband_cqi_tot_dB[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX]; + /// Wideband PMI for each RX antenna + int wideband_pmi_re[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; + /// Wideband PMI for each RX antenna + int wideband_pmi_im[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; + ///Subband PMI for each RX antenna + int subband_pmi_re[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX][NB_ANTENNAS_RX]; + ///Subband PMI for each RX antenna + int subband_pmi_im[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX][NB_ANTENNAS_RX]; + /// chosen RX antennas (1=Rx antenna 1, 2=Rx antenna 2, 3=both Rx antennas) + unsigned char selected_rx_antennas[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX]; + /// Wideband Rank indication + unsigned char rank[NUMBER_OF_CONNECTED_eNB_MAX]; + /// Number of RX Antennas + unsigned char nb_antennas_rx; + /// DLSCH error counter + // short dlsch_errors; + +} PHY_MEASUREMENTS; + +typedef struct { + //unsigned int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (linear) + //unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (dB) + //unsigned short rx_avg_power_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //! estimated avg received signal power (dB) + + // common measurements + //! estimated noise power (linear) + unsigned int n0_power[MAX_NUM_RU_PER_eNB]; + //! estimated noise power (dB) + unsigned short n0_power_dB[MAX_NUM_RU_PER_eNB]; + //! total estimated noise power (linear) + unsigned int n0_power_tot; + //! estimated avg noise power (dB) + unsigned short n0_power_tot_dB; + //! estimated avg noise power (dB) + short n0_power_tot_dBm; + //! estimated avg noise power per RB per RX ant (lin) + unsigned short n0_subband_power[MAX_NUM_RU_PER_eNB][100]; + //! estimated avg noise power per RB per RX ant (dB) + unsigned short n0_subband_power_dB[MAX_NUM_RU_PER_eNB][100]; + //! estimated avg noise power per RB (dB) + short n0_subband_power_tot_dB[100]; + //! estimated avg noise power per RB (dBm) + short n0_subband_power_tot_dBm[100]; + // eNB measurements (per user) + //! estimated received spatial signal power (linear) + unsigned int rx_spatial_power[NUMBER_OF_UE_MAX][2][2]; + //! estimated received spatial signal power (dB) + unsigned short rx_spatial_power_dB[NUMBER_OF_UE_MAX][2][2]; + //! estimated rssi (dBm) + short rx_rssi_dBm[NUMBER_OF_UE_MAX]; + //! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation) + int rx_correlation[NUMBER_OF_UE_MAX][2]; + //! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation) + int rx_correlation_dB[NUMBER_OF_UE_MAX][2]; + + /// Wideband CQI (= SINR) + int wideband_cqi[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB]; + /// Wideband CQI in dB (= SINR dB) + int wideband_cqi_dB[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB]; + /// Wideband CQI (sum of all RX antennas, in dB) + char wideband_cqi_tot[NUMBER_OF_UE_MAX]; + /// Subband CQI per RX antenna and RB (= SINR) + int subband_cqi[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB][100]; + /// Total Subband CQI and RB (= SINR) + int subband_cqi_tot[NUMBER_OF_UE_MAX][100]; + /// Subband CQI in dB and RB (= SINR dB) + int subband_cqi_dB[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB][100]; + /// Total Subband CQI and RB + int subband_cqi_tot_dB[NUMBER_OF_UE_MAX][100]; + /// PRACH background noise level + int prach_I0; +} PHY_MEASUREMENTS_eNB; + /// Top-level PHY Data Structure for eNB typedef struct PHY_VARS_eNB_s { /// Module ID indicator for this instance module_id_t Mod_id; uint8_t CC_id; - eNB_proc_t proc[NUM_ENB_THREADS]; + uint8_t configured; + eNB_proc_t proc; + int single_thread_flag; + int abstraction_flag; + int num_RU; + RU_t *RU_list[MAX_NUM_RU_PER_eNB]; + /// Ethernet parameters for northbound midhaul interface + eth_params_t eth_params_n; + /// Ethernet parameters for fronthaul interface + eth_params_t eth_params; + int rx_total_gain_dB; + int (*td)(struct PHY_VARS_eNB_s *eNB,int UE_id,int harq_pid,int llr8_flag); + int (*te)(struct PHY_VARS_eNB_s *,uint8_t *,uint8_t,LTE_eNB_DLSCH_t *,int,uint8_t,time_stats_t *,time_stats_t *,time_stats_t *); + int (*start_if)(struct RU_t_s *ru,struct PHY_VARS_eNB_s *eNB); uint8_t local_flag; - uint32_t rx_total_gain_eNB_dB; - LTE_DL_FRAME_PARMS lte_frame_parms; - PHY_MEASUREMENTS_eNB PHY_measurements_eNB[NUMBER_OF_eNB_SECTORS_MAX]; /// Measurement variables - LTE_eNB_COMMON lte_eNB_common_vars; - LTE_eNB_SRS lte_eNB_srs_vars[NUMBER_OF_UE_MAX]; - LTE_eNB_PBCH lte_eNB_pbch; - /// \brief ?. - /// - first index: UE [0..NUMBER_OF_UE_MAX[ (hard coded) - /// - second index: UE [0..NUMBER_OF_UE_MAX[ - LTE_eNB_PUSCH *lte_eNB_pusch_vars[NUMBER_OF_UE_MAX]; - LTE_eNB_PRACH lte_eNB_prach_vars; - LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams - // old: LTE_eNB_DLSCH_t **dlsch_eNB[2]; // Nusers times two spatial streams - LTE_eNB_ULSCH_t *ulsch_eNB[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA - LTE_eNB_DLSCH_t *dlsch_eNB_SI,*dlsch_eNB_ra; - LTE_eNB_DLSCH_t *dlsch_eNB_MCH; - LTE_eNB_UE_stats eNB_UE_stats[NUMBER_OF_UE_MAX]; - LTE_eNB_UE_stats *eNB_UE_stats_ptr[NUMBER_OF_UE_MAX]; + LTE_DL_FRAME_PARMS frame_parms; + PHY_MEASUREMENTS_eNB measurements; + IF_Module_t *if_inst; + UL_IND_t UL_INFO; + pthread_mutex_t UL_INFO_mutex; + /// NFAPI RX ULSCH information + nfapi_rx_indication_pdu_t rx_pdu_list[NFAPI_RX_IND_MAX_PDU]; + /// NFAPI RX ULSCH CRC information + nfapi_crc_indication_pdu_t crc_pdu_list[NFAPI_CRC_IND_MAX_PDU]; + /// NFAPI HARQ information + nfapi_harq_indication_pdu_t harq_pdu_list[NFAPI_HARQ_IND_MAX_PDU]; + /// NFAPI SR information + nfapi_sr_indication_pdu_t sr_pdu_list[NFAPI_SR_IND_MAX_PDU]; + /// NFAPI CQI information + nfapi_cqi_indication_pdu_t cqi_pdu_list[NFAPI_CQI_IND_MAX_PDU]; + /// NFAPI CQI information (raw component) + nfapi_cqi_indication_raw_pdu_t cqi_raw_pdu_list[NFAPI_CQI_IND_MAX_PDU]; + /// NFAPI PRACH information + nfapi_preamble_pdu_t preamble_list[MAX_NUM_RX_PRACH_PREAMBLES]; +#ifdef Rel14 + /// NFAPI PRACH information BL/CE UEs + nfapi_preamble_pdu_t preamble_list_br[MAX_NUM_RX_PRACH_PREAMBLES]; +#endif + Sched_Rsp_t Sched_INFO; + LTE_eNB_PDCCH pdcch_vars[2]; + LTE_eNB_PHICH phich_vars[2]; +#ifdef Rel14 + LTE_eNB_EPDCCH epdcch_vars[2]; + LTE_eNB_MPDCCH mpdcch_vars[2]; + LTE_eNB_PRACH prach_vars_br; +#endif + LTE_eNB_COMMON common_vars; + LTE_eNB_UCI uci_vars[NUMBER_OF_UE_MAX]; + LTE_eNB_SRS srs_vars[NUMBER_OF_UE_MAX]; + LTE_eNB_PBCH pbch; + LTE_eNB_PUSCH *pusch_vars[NUMBER_OF_UE_MAX]; + LTE_eNB_PRACH prach_vars; + LTE_eNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams + LTE_eNB_ULSCH_t *ulsch[NUMBER_OF_UE_MAX+1]; // Nusers + number of RA + LTE_eNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p; + LTE_eNB_DLSCH_t *dlsch_MCH; + LTE_eNB_DLSCH_t *dlsch_PCH; + LTE_eNB_UE_stats UE_stats[NUMBER_OF_UE_MAX]; + LTE_eNB_UE_stats *UE_stats_ptr[NUMBER_OF_UE_MAX]; /// cell-specific reference symbols uint32_t lte_gold_table[20][2][14]; + /// UE-specific reference symbols (p=5), TM 7 + uint32_t lte_gold_uespec_port5_table[NUMBER_OF_UE_MAX][20][38]; + /// UE-specific reference symbols (p=7...14), TM 8/9/10 uint32_t lte_gold_uespec_table[2][20][2][21]; @@ -245,7 +1006,10 @@ typedef struct PHY_VARS_eNB_s { uint32_t lte_gold_mbsfn_table[10][3][42]; uint32_t X_u[64][839]; - +#ifdef Rel14 + uint32_t X_u_br[4][64][839]; +#endif + uint8_t pbch_configured; uint8_t pbch_pdu[4]; //PBCH_PDU_SIZE char eNB_generate_rar; @@ -255,8 +1019,6 @@ typedef struct PHY_VARS_eNB_s { uint32_t max_peak_val; int max_eNB_id, max_sync_pos; - int N_TA_offset; ///timing offset used in TDD - /// \brief sinr for all subcarriers of the current link (used only for abstraction). /// first index: ? [0..N_RB_DL*12[ double *sinr_dB; @@ -267,13 +1029,11 @@ typedef struct PHY_VARS_eNB_s { unsigned char first_run_timing_advance[NUMBER_OF_UE_MAX]; unsigned char first_run_I0_measurements; - unsigned char cooperation_flag; // for cooperative communication - + unsigned char is_secondary_eNB; // primary by default unsigned char is_init_sync; /// Flag to tell if initial synchronization is performed. This affects how often the secondary eNB will listen to the PSS from the primary system. unsigned char has_valid_precoder; /// Flag to tell if secondary eNB has channel estimates to create NULL-beams from, and this B/F vector is created. unsigned char PeNB_id; /// id of Primary eNB - int rx_offset; /// Timing offset (used if is_secondary_eNB) /// hold the precoder for NULL beam to the primary user int **dl_precoder_SeNB[3]; @@ -281,12 +1041,8 @@ typedef struct PHY_VARS_eNB_s { /// if ==0 enables phy only test mode int mac_enabled; - - /// For emulation only (used by UE abstraction to retrieve DCI) - uint8_t num_common_dci[2]; // num_dci in even/odd subframes - uint8_t num_ue_spec_dci[2]; // num_dci in even/odd subframes - DCI_ALLOC_t dci_alloc[2][NUM_DCI_MAX]; // dci_alloc from even/odd subframes - + /// counter to average prach energh over first 100 prach opportunities + int prach_energy_counter; // PDSCH Varaibles PDSCH_CONFIG_DEDICATED pdsch_config_dedicated[NUMBER_OF_UE_MAX]; @@ -330,6 +1086,15 @@ typedef struct PHY_VARS_eNB_s { MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX]; + /// target_ue_dl_mcs : only for debug purposes + uint32_t target_ue_dl_mcs; + /// target_ue_ul_mcs : only for debug purposes + uint32_t target_ue_ul_mcs; + /// target_ue_dl_rballoc : only for debug purposes + uint32_t ue_dl_rb_alloc; + /// target ul PRBs : only for debug + uint32_t ue_ul_nb_rb; + ///check for Total Transmissions uint32_t check_for_total_transmissions; @@ -347,14 +1112,11 @@ typedef struct PHY_VARS_eNB_s { uint32_t total_transmitted_bits; uint32_t total_system_throughput; + int hw_timing_advance; + time_stats_t phy_proc; time_stats_t phy_proc_tx; time_stats_t phy_proc_rx; - /* - time_stats_t phy_proc_sf[10]; // for each subframe - time_stats_t phy_proc_tx_sf[10]; - time_stats_t phy_proc_rx_sf[10]; - */ time_stats_t rx_prach; time_stats_t ofdm_mod_stats; @@ -365,7 +1127,6 @@ typedef struct PHY_VARS_eNB_s { time_stats_t dlsch_turbo_encoding_stats; time_stats_t dlsch_interleaving_stats; - time_stats_t ofdm_demod_stats; time_stats_t rx_dft_stats; time_stats_t ulsch_channel_estimation_stats; time_stats_t ulsch_freq_offset_estimation_stats; @@ -387,7 +1148,7 @@ typedef struct PHY_VARS_eNB_s { #ifdef LOCALIZATION /// time state for localization time_stats_t localization_stats; -#endif +#endif int32_t pucch1_stats_cnt[NUMBER_OF_UE_MAX][10]; int32_t pucch1_stats[NUMBER_OF_UE_MAX][10*1024]; @@ -399,22 +1160,9 @@ typedef struct PHY_VARS_eNB_s { int32_t pusch_stats_mcs[NUMBER_OF_UE_MAX][10240]; int32_t pusch_stats_bsr[NUMBER_OF_UE_MAX][10240]; int32_t pusch_stats_BO[NUMBER_OF_UE_MAX][10240]; -#if ENABLE_RAL - hash_table_t *ral_thresholds_timed; - SLIST_HEAD(ral_thresholds_gen_poll_enb_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX]; - SLIST_HEAD(ral_thresholds_lte_poll_enb_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX]; -#endif - } PHY_VARS_eNB; #define debug_msg if (((mac_xface->frame%100) == 0) || (mac_xface->frame < 50)) msg -//#define debug_msg msg - -/* -typedef enum { - max_gain=0,med_gain,byp_gain -} rx_gain_t; -*/ /// Top-level PHY Data Structure for UE typedef struct { @@ -422,6 +1170,8 @@ typedef struct { uint8_t Mod_id; /// \brief Component carrier ID for this PHY instance uint8_t CC_id; + /// \brief Mapping of CC_id antennas to cards + openair0_rf_map rf_map; //uint8_t local_flag; /// \brief Indicator of current run mode of UE (normal_txrx, rx_calib_ue, no_L2_connect, debug_prach) runmode_t mode; @@ -431,34 +1181,10 @@ typedef struct { int UE_scan_carrier; /// \brief Indicator that UE is synchronized to an eNB int is_synchronized; - /// \brief Instance count of TX processing thread (-1 means ready, 0 means busy) - int instance_cnt_tx; - /// \brief Instance count of RX processing thread (-1 means ready, 0 means busy) - int instance_cnt_rx; - /// \brief Instance count of initial synchronization thread (-1 means ready, 0 means busy). - /// Protected by mutex \ref mutex_synch and condition \ref cond_synch. - int instance_cnt_synch; - /// \brief Condition variable for TX processing thread - pthread_cond_t cond_tx; - /// \brief Condition variable for RX processing thread - pthread_cond_t cond_rx; - /// \brief Condition variable for initial synchronization thread. - /// The corresponding mutex is \ref mutex_synch. - pthread_cond_t cond_synch; - /// \brief Mutex for TX processing thread - pthread_mutex_t mutex_tx; - /// \brief Mutex for RX processing thread - pthread_mutex_t mutex_rx; - /// \brief Mutex for initial synchronization thread. - /// Used to protect \ref instance_cnt_synch. - /// \sa cond_synch - pthread_mutex_t mutex_synch; - /// \brief Pthread structure for RX processing thread - pthread_t thread_rx; - /// \brief Pthread structure for TX processing thread - pthread_t thread_tx; - /// \brief Pthread structure to RX processing thread - pthread_t thread_synch; + /// Data structure for UE process scheduling + UE_proc_t proc; + /// Flag to indicate the UE shouldn't do timing correction at all + int no_timing_correction; /// \brief Total gain of the TX chain (16-bit baseband I/Q to antenna) uint32_t tx_total_gain_dB; /// \brief Total gain of the RX chain (antenna to baseband I/Q) This is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card. @@ -470,15 +1196,11 @@ typedef struct { /// \brief Total gains with bypassed RF gain stage (ExpressMIMO2/Lime) uint32_t rx_gain_byp[4]; /// \brief Current transmit power - int8_t tx_power_dBm; + int16_t tx_power_dBm[10]; /// \brief Total number of REs in current transmission - int tx_total_RE; + int tx_total_RE[10]; /// \brief Maximum transmit power int8_t tx_power_max_dBm; - /// \brief Frame counters for TX and RX processing - uint32_t frame_rx,frame_tx; - /// \brief Slot counters for TX and RX processing - uint32_t slot_tx,slot_rx; /// \brief Number of eNB seen by UE uint8_t n_connected_eNB; /// \brief indicator that Handover procedure has been initiated @@ -486,29 +1208,38 @@ typedef struct { /// \brief indicator that Handover procedure has been triggered uint8_t ho_triggered; /// \brief Measurement variables. - PHY_MEASUREMENTS PHY_measurements; - LTE_DL_FRAME_PARMS lte_frame_parms; + PHY_MEASUREMENTS measurements; + LTE_DL_FRAME_PARMS frame_parms; /// \brief Frame parame before ho used to recover if ho fails. - LTE_DL_FRAME_PARMS lte_frame_parms_before_ho; - LTE_UE_COMMON lte_ue_common_vars; + LTE_DL_FRAME_PARMS frame_parms_before_ho; + LTE_UE_COMMON common_vars; - LTE_UE_PDSCH *lte_ue_pdsch_vars[NUMBER_OF_CONNECTED_eNB_MAX+1]; - LTE_UE_PDSCH_FLP *lte_ue_pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1]; - LTE_UE_PDSCH *lte_ue_pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1]; - LTE_UE_PDSCH *lte_ue_pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1]; - LTE_UE_PDSCH *lte_ue_pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_PBCH *lte_ue_pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_PDCCH *lte_ue_pdcch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_PRACH *lte_ue_prach_vars[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_DLSCH_t *dlsch_ue[NUMBER_OF_CONNECTED_eNB_MAX][2]; - LTE_UE_ULSCH_t *ulsch_ue[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_DLSCH_t *dlsch_ue_col[NUMBER_OF_CONNECTED_eNB_MAX][2]; - LTE_UE_DLSCH_t *ulsch_ue_col[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_DLSCH_t *dlsch_ue_SI[NUMBER_OF_CONNECTED_eNB_MAX],*dlsch_ue_ra[NUMBER_OF_CONNECTED_eNB_MAX]; - LTE_UE_DLSCH_t *dlsch_ue_MCH[NUMBER_OF_CONNECTED_eNB_MAX]; + // point to the current rxTx thread index + uint8_t current_thread_id[10]; + + LTE_UE_PDSCH *pdsch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX+1]; // two RxTx Threads + LTE_UE_PDSCH_FLP *pdsch_vars_flp[NUMBER_OF_CONNECTED_eNB_MAX+1]; + LTE_UE_PDSCH *pdsch_vars_SI[NUMBER_OF_CONNECTED_eNB_MAX+1]; + LTE_UE_PDSCH *pdsch_vars_ra[NUMBER_OF_CONNECTED_eNB_MAX+1]; + LTE_UE_PDSCH *pdsch_vars_p[NUMBER_OF_CONNECTED_eNB_MAX+1]; + LTE_UE_PDSCH *pdsch_vars_MCH[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_PBCH *pbch_vars[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_PDCCH *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_DLSCH_t *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_eNB_MAX][2]; // two RxTx Threads + LTE_UE_ULSCH_t *ulsch[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_DLSCH_t *dlsch_SI[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_DLSCH_t *dlsch_ra[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_DLSCH_t *dlsch_p[NUMBER_OF_CONNECTED_eNB_MAX]; + LTE_UE_DLSCH_t *dlsch_MCH[NUMBER_OF_CONNECTED_eNB_MAX]; // This is for SIC in the UE, to store the reencoded data LTE_eNB_DLSCH_t *dlsch_eNB[NUMBER_OF_CONNECTED_eNB_MAX]; + //Paging parameters + uint32_t IMSImod1024; + uint32_t PF; + uint32_t PO; + // For abstraction-purposes only uint8_t sr[10]; uint8_t pucch_sel[10]; @@ -518,8 +1249,11 @@ typedef struct { /// cell-specific reference symbols uint32_t lte_gold_table[7][20][2][14]; + /// UE-specific reference symbols (p=5), TM 7 + uint32_t lte_gold_uespec_port5_table[20][38]; + /// ue-specific reference symbols - uint32_t lte_gold_uespec_table[2][20][2][21]; + uint32_t lte_gold_uespec_table[2][20][2][21]; /// mbsfn reference symbols uint32_t lte_gold_mbsfn_table[10][3][42]; @@ -529,15 +1263,17 @@ typedef struct { uint32_t high_speed_flag; uint32_t perfect_ce; int16_t ch_est_alpha; + int generate_ul_signal[NUMBER_OF_CONNECTED_eNB_MAX]; + UE_SCAN_INFO_t scan_info[NB_BANDS_MAX]; char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX]; - unsigned char ulsch_ue_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX]; - uint32_t ulsch_ue_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX]; - unsigned char ulsch_ue_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX]; - // unsigned char Msg3_timer[NUMBER_OF_CONNECTED_eNB_MAX]; - //unsigned char *Msg3_ptr[NUMBER_OF_CONNECTED_eNB_MAX]; + + + unsigned char ulsch_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX]; + uint32_t ulsch_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX]; + unsigned char ulsch_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX]; PRACH_RESOURCES_t *prach_resources[NUMBER_OF_CONNECTED_eNB_MAX]; int turbo_iterations, turbo_cntl_iterations; /// \brief ?. @@ -561,6 +1297,8 @@ typedef struct { int dlsch_SI_errors[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_ra_received[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_ra_errors[NUMBER_OF_CONNECTED_eNB_MAX]; + int dlsch_p_received[NUMBER_OF_CONNECTED_eNB_MAX]; + int dlsch_p_errors[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mch_received_sf[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mch_received[NUMBER_OF_CONNECTED_eNB_MAX]; int dlsch_mcch_received[MAX_MBSFN_AREA][NUMBER_OF_CONNECTED_eNB_MAX]; @@ -575,8 +1313,13 @@ typedef struct { uint8_t prach_cnt; uint8_t prach_PreambleIndex; // uint8_t prach_timer; + uint8_t decode_SIB; + uint8_t decode_MIB; int rx_offset; /// Timing offset + int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP + int time_sync_cell; int timing_advance; ///timing advance signalled from eNB + int hw_timing_advance; int N_TA_offset; ///timing offset used in TDD /// Flag to tell if UE is secondary user (cognitive mode) unsigned char is_secondary_ue; @@ -641,9 +1384,11 @@ typedef struct { /// Transmission mode per eNB uint8_t transmission_mode[NUMBER_OF_CONNECTED_eNB_MAX]; - time_stats_t phy_proc; + time_stats_t phy_proc[RX_NB_TH]; time_stats_t phy_proc_tx; - time_stats_t phy_proc_rx; + time_stats_t phy_proc_rx[RX_NB_TH]; + + uint32_t use_ia_receiver; time_stats_t ofdm_mod_stats; time_stats_t ulsch_encoding_stats; @@ -654,17 +1399,27 @@ typedef struct { time_stats_t ulsch_interleaving_stats; time_stats_t ulsch_multiplexing_stats; + time_stats_t generic_stat; + time_stats_t generic_stat_bis[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME]; + time_stats_t ue_front_end_stat[RX_NB_TH]; + time_stats_t ue_front_end_per_slot_stat[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME]; + time_stats_t pdcch_procedures_stat[RX_NB_TH]; + time_stats_t pdsch_procedures_stat[RX_NB_TH]; + time_stats_t pdsch_procedures_per_slot_stat[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME]; + time_stats_t dlsch_procedures_stat[RX_NB_TH]; + time_stats_t ofdm_demod_stats; time_stats_t dlsch_rx_pdcch_stats; time_stats_t rx_dft_stats; time_stats_t dlsch_channel_estimation_stats; time_stats_t dlsch_freq_offset_estimation_stats; - time_stats_t dlsch_decoding_stats; + time_stats_t dlsch_decoding_stats[2]; time_stats_t dlsch_demodulation_stats; time_stats_t dlsch_rate_unmatching_stats; time_stats_t dlsch_turbo_decoding_stats; time_stats_t dlsch_deinterleaving_stats; time_stats_t dlsch_llr_stats; + time_stats_t dlsch_llr_stats_parallelization[RX_NB_TH][LTE_SLOTS_PER_SUBFRAME]; time_stats_t dlsch_unscrambling_stats; time_stats_t dlsch_rate_matching_stats; time_stats_t dlsch_turbo_encoding_stats; @@ -678,26 +1433,188 @@ typedef struct { time_stats_t dlsch_tc_intl2_stats; time_stats_t tx_prach; -#if ENABLE_RAL - hash_table_t *ral_thresholds_timed; - SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX]; - SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX]; -#endif + /// RF and Interface devices per CC + + openair0_device rfdevice; } PHY_VARS_UE; -/// Top-level PHY Data Structure for RN -typedef struct { - /// Module ID indicator for this instance - uint8_t Mod_id; - uint32_t frame; - // phy_vars_eNB - // phy_vars ue - // cuurently only used to store and forward the PMCH - uint8_t mch_avtive[10]; - uint8_t sync_area[10]; // num SF - LTE_UE_DLSCH_t *dlsch_rn_MCH[10]; +/* this structure is used to pass both UE phy vars and + * proc to the function UE_thread_rxn_txnp4 + */ +struct rx_tx_thread_data { + PHY_VARS_UE *UE; + UE_rxtx_proc_t *proc; +}; + +void exit_fun(const char* s); + +#include "UTIL/LOG/log_extern.h" +extern pthread_cond_t sync_cond; +extern pthread_mutex_t sync_mutex; +extern int sync_var; + +#define MAX_RRU_CONFIG_SIZE 1024 +typedef enum { + RAU_tick=0, + RRU_capabilities=1, + RRU_config=2, + RRU_MSG_max_num=3 +} rru_config_msg_type_t; + +typedef struct RRU_CONFIG_msg_s { + rru_config_msg_type_t type; + ssize_t len; + uint8_t msg[MAX_RRU_CONFIG_SIZE]; +} RRU_CONFIG_msg_t; + +typedef enum { + OAI_IF5_only =0, + OAI_IF4p5_only =1, + OAI_IF5_and_IF4p5 =2, + MBP_IF5 =3, + MAX_FH_FMTs =4 +} FH_fmt_options_t; + +#define MAX_BANDS_PER_RRU 4 + +typedef struct RRU_capabilities_s { + /// Fronthaul format + FH_fmt_options_t FH_fmt; + /// number of EUTRA bands (<=4) supported by RRU + uint8_t num_bands; + /// EUTRA band list supported by RRU + uint8_t band_list[MAX_BANDS_PER_RRU]; + /// Number of concurrent bands (component carriers) + uint8_t num_concurrent_bands; + /// Maximum TX EPRE of each band + int8_t max_pdschReferenceSignalPower[MAX_BANDS_PER_RRU]; + /// Maximum RX gain of each band + uint8_t max_rxgain[MAX_BANDS_PER_RRU]; + /// Number of RX ports of each band + uint8_t nb_rx[MAX_BANDS_PER_RRU]; + /// Number of TX ports of each band + uint8_t nb_tx[MAX_BANDS_PER_RRU]; + /// max DL bandwidth (1,6,15,25,50,75,100) + uint8_t N_RB_DL[MAX_BANDS_PER_RRU]; + /// max UL bandwidth (1,6,15,25,50,75,100) + uint8_t N_RB_UL[MAX_BANDS_PER_RRU]; +} RRU_capabilities_t; + +typedef struct RRU_config_s { + + /// Fronthaul format + RU_if_south_t FH_fmt; + /// number of EUTRA bands (<=4) configured in RRU + uint8_t num_bands; + /// EUTRA band list configured in RRU + uint8_t band_list[MAX_BANDS_PER_RRU]; + /// TDD configuration (0-6) + uint8_t tdd_config[MAX_BANDS_PER_RRU]; + /// TDD special subframe configuration (0-10) + uint8_t tdd_config_S[MAX_BANDS_PER_RRU]; + /// TX frequency + uint32_t tx_freq[MAX_BANDS_PER_RRU]; + /// RX frequency + uint32_t rx_freq[MAX_BANDS_PER_RRU]; + /// TX attenation w.r.t. max + uint8_t att_tx[MAX_BANDS_PER_RRU]; + /// RX attenuation w.r.t. max + uint8_t att_rx[MAX_BANDS_PER_RRU]; + /// DL bandwidth + uint8_t N_RB_DL[MAX_BANDS_PER_RRU]; + /// UL bandwidth + uint8_t N_RB_UL[MAX_BANDS_PER_RRU]; + /// 3/4 sampling rate + uint8_t threequarter_fs[MAX_BANDS_PER_RRU]; + /// prach_FreqOffset for IF4p5 + int prach_FreqOffset[MAX_BANDS_PER_RRU]; + /// prach_ConfigIndex for IF4p5 + int prach_ConfigIndex[MAX_BANDS_PER_RRU]; +#ifdef Rel14 + int emtc_prach_CElevel_enable[MAX_BANDS_PER_RRU][4]; + /// emtc_prach_FreqOffset for IF4p5 per CE Level + int emtc_prach_FreqOffset[MAX_BANDS_PER_RRU][4]; + /// emtc_prach_ConfigIndex for IF4p5 per CE Level + int emtc_prach_ConfigIndex[MAX_BANDS_PER_RRU][4]; +#endif +} RRU_config_t; + + +static inline void wait_sync(char *thread_name) { + + printf( "waiting for sync (%s)\n",thread_name); + pthread_mutex_lock( &sync_mutex ); + + while (sync_var<0) + pthread_cond_wait( &sync_cond, &sync_mutex ); + + pthread_mutex_unlock(&sync_mutex); + + printf( "got sync (%s)\n", thread_name); + +} + +static inline int wait_on_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) { + if (pthread_mutex_lock(mutex) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + + while (*instance_cnt < 0) { + // most of the time the thread is waiting here + // proc->instance_cnt_rxtx is -1 + pthread_cond_wait(cond,mutex); // this unlocks mutex_rxtx while waiting and then locks it again + } + + if (pthread_mutex_unlock(mutex) != 0) { + LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + return(0); +} + +static inline int wait_on_busy_condition(pthread_mutex_t *mutex,pthread_cond_t *cond,int *instance_cnt,char *name) { + + if (pthread_mutex_lock(mutex) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + + while (*instance_cnt == 0) { + // most of the time the thread will skip this + // waits only if proc->instance_cnt_rxtx is 0 + pthread_cond_wait(cond,mutex); // this unlocks mutex_rxtx while waiting and then locks it again + } + + if (pthread_mutex_unlock(mutex) != 0) { + LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + return(0); +} + +static inline int release_thread(pthread_mutex_t *mutex,int *instance_cnt,char *name) { + + if (pthread_mutex_lock(mutex) != 0) { + LOG_E( PHY, "[SCHED][eNB] error locking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + + *instance_cnt=*instance_cnt-1; + + if (pthread_mutex_unlock(mutex) != 0) { + LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for %s\n",name); + exit_fun("nothing to add"); + return(-1); + } + return(0); +} -} PHY_VARS_RN; #include "PHY/INIT/defs.h" #include "PHY/LTE_REFSIG/defs.h" @@ -706,13 +1623,4 @@ typedef struct { #include "PHY/LTE_ESTIMATION/defs.h" #include "SIMULATION/ETH_TRANSPORT/defs.h" -#endif //OPENAIR_LTE - - #endif // __PHY_DEFS__H__ - - - - - - diff --git a/openair1/PHY/extern.h b/openair1/PHY/extern.h old mode 100755 new mode 100644 index 4c9e2706c7..3ff2d64da0 --- a/openair1/PHY/extern.h +++ b/openair1/PHY/extern.h @@ -1,36 +1,29 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __PHY_EXTERN_H__ #define __PHY_EXTERN_H__ #include "PHY/defs.h" -#include "PHY_INTERFACE/defs.h" +#include "common/ran_context.h" extern char* namepointer_chMag ; extern char* namepointer_log2; @@ -45,16 +38,19 @@ extern unsigned int TX_DMA_BUFFER[4][NB_ANTENNAS_TX]; extern unsigned int DAQ_MBOX; extern int number_of_cards; -//extern PHY_CONFIG *PHY_config; -//extern PHY_VARS *PHY_vars; +#ifndef OCP_FRAMEWORK extern PHY_VARS_UE ***PHY_vars_UE_g; -extern PHY_VARS_eNB ***PHY_vars_eNB_g; +//extern PHY_VARS_eNB ***PHY_vars_eNB_g; +extern RAN_CONTEXT_t RC; extern PHY_VARS_RN **PHY_vars_RN_g; extern LTE_DL_FRAME_PARMS *lte_frame_parms_g; - -extern MAC_xface *mac_xface; - +#else +#define MAX_UE 10 +#define MAX_eNB 20 +extern PHY_VARS_UE * PHY_vars_UE_g[MAX_UE][MAX_NUM_CCs]; +extern PHY_VARS_eNB * PHY_vars_eNB_g[MAX_eNB][MAX_NUM_CCs]; +#endif extern short primary_synch0[144]; extern short primary_synch1[144]; @@ -76,6 +72,7 @@ extern char mode_string[4][20]; #include "PHY/LTE_TRANSPORT/extern.h" +extern unsigned char NB_RU; #ifndef OPENAIR2 extern unsigned char NB_eNB_INST; @@ -111,6 +108,24 @@ extern double p_qam64[8]; extern double beta1_dlsch[6][MCS_COUNT]; extern double beta2_dlsch[6][MCS_COUNT]; +extern char eNB_functions[6][20]; +extern char eNB_timing[2][20]; +extern char ru_if_types[MAX_RU_IF_TYPES][20]; + +extern int16_t unscrambling_lut[65536*16]; +extern uint8_t scrambling_lut[65536*16]; + +extern unsigned short msrsb_6_40[8][4]; +extern unsigned short msrsb_41_60[8][4]; +extern unsigned short msrsb_61_80[8][4]; +extern unsigned short msrsb_81_110[8][4]; +extern unsigned short Nb_6_40[8][4]; +extern unsigned short Nb_41_60[8][4]; +extern unsigned short Nb_61_80[8][4]; +extern unsigned short Nb_81_110[8][4]; + +extern uint16_t hundred_times_log10_NPRB[100]; +extern uint8_t alpha_lut[8]; #endif /*__PHY_EXTERN_H__ */ diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index 7c38048a55..ac54be36fb 100644 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/impl_defs_lte.h * \brief LTE Physical channel configuration and variable structure definitions @@ -43,7 +35,14 @@ #include "types.h" +#include "nfapi_interface.h" //#include "defs.h" +#include "openair2/COMMON/platform_types.h" + +#define RX_NB_TH_MAX 2 +#define RX_NB_TH 2 + +#define LTE_SLOTS_PER_SUBFRAME 2 #define LTE_NUMBER_OF_SUBFRAMES_PER_FRAME 10 #define LTE_SLOTS_PER_FRAME 20 @@ -62,7 +61,11 @@ #define MAX_MBSFN_AREA 8 +#define NB_RX_ANTENNAS_MAX 64 +#ifdef OCP_FRAMEWORK +#include "enums.h" +#else typedef enum {TDD=1,FDD=0} lte_frame_type_t; typedef enum {EXTENDED=1,NORMAL=0} lte_prefix_type_t; @@ -82,7 +85,7 @@ typedef enum { one=6, two=12 } PHICH_RESOURCE_t; - +#endif /// PHICH-Config from 36.331 RRC spec typedef struct { /// Parameter: PHICH-Duration, see TS 36.211 (Table 6.9.3-1). @@ -103,6 +106,8 @@ typedef struct { uint8_t prach_FreqOffset; } PRACH_CONFIG_INFO; + + /// PRACH-ConfigSIB or PRACH-Config from 36.331 RRC spec typedef struct { /// Parameter: RACH_ROOT_SEQUENCE, see TS 36.211 (5.7.1). \vr{[0..837]} @@ -113,6 +118,46 @@ typedef struct { PRACH_CONFIG_INFO prach_ConfigInfo; } PRACH_CONFIG_COMMON; +#ifdef Rel14 + +/// PRACH-eMTC-Config from 36.331 RRC spec +typedef struct { + /// Parameter: High-speed-flag, see TS 36.211 (5.7.2). \vr{[0..1]} 1 corresponds to Restricted set and 0 to Unrestricted set. + uint8_t highSpeedFlag; +/// Parameter: \f$N_\text{CS}\f$, see TS 36.211 (5.7.2). \vr{[0..15]}\n Refer to table 5.7.2-2 for preamble format 0..3 and to table 5.7.2-3 for preamble format 4. + uint8_t zeroCorrelationZoneConfig; + /// Parameter: prach-FrequencyOffset, see TS 36.211 (5.7.1). \vr{[0..94]}\n For TDD the value range is dependent on the value of \ref prach_ConfigIndex. + + /// PRACH starting subframe periodicity, expressed in number of subframes available for preamble transmission (PRACH opportunities), see TS 36.211. Value 2 corresponds to 2 subframes, 4 corresponds to 4 subframes and so on. EUTRAN configures the PRACH starting subframe periodicity larger than or equal to the Number of PRACH repetitions per attempt for each CE level (numRepetitionPerPreambleAttempt). + uint8_t prach_starting_subframe_periodicity[4]; + /// number of repetitions per preamble attempt per CE level + uint8_t prach_numRepetitionPerPreambleAttempt[4]; + /// prach configuration index for each CE level + uint8_t prach_ConfigIndex[4]; + /// indicator for CE level activation + uint8_t prach_CElevel_enable[4]; + /// prach frequency offset for each CE level + uint8_t prach_FreqOffset[4]; + /// indicator for CE level hopping activation + uint8_t prach_hopping_enable[4]; + /// indicator for CE level hopping activation + uint8_t prach_hopping_offset[4]; +} PRACH_eMTC_CONFIG_INFO; + +#endif + +/// PRACH-ConfigSIB or PRACH-Config from 36.331 RRC spec +typedef struct { + /// Parameter: RACH_ROOT_SEQUENCE, see TS 36.211 (5.7.1). \vr{[0..837]} + uint16_t rootSequenceIndex; + /// prach_Config_enabled=1 means enabled. \vr{[0..1]} + uint8_t prach_Config_enabled; + /// PRACH Configuration Information +#ifdef Rel14 + PRACH_eMTC_CONFIG_INFO prach_ConfigInfo; +#endif +} PRACH_eMTC_CONFIG_COMMON; + /// Enumeration for parameter \f$N_\text{ANRep}\f$ \ref PUCCH_CONFIG_DEDICATED::repetitionFactor. typedef enum { n2=0, @@ -148,6 +193,11 @@ typedef struct { uint8_t nCS_AN; /// Parameter: \f$N^{(1)}_\text{PUCCH}\f$ see TS 36.213 (10.1). \vr{[0..2047]} uint16_t n1PUCCH_AN; + + /// group hopping sequence for DRS \note not part of offical UL-PUCCH_CONFIG_COMMON ASN1 specification. + uint8_t grouphop[20]; + /// sequence hopping sequence for DRS \note not part of offical UL-PUCCH_CONFIG_COMMON ASN1 specification. + uint8_t seqhop[20]; } PUCCH_CONFIG_COMMON; /// UL-ReferenceSignalsPUSCH from 36.331 RRC spec @@ -169,10 +219,12 @@ typedef struct { } UL_REFERENCE_SIGNALS_PUSCH_t; /// Enumeration for parameter Hopping-mode \ref PUSCH_CONFIG_COMMON::hoppingMode. +#ifndef OCP_FRAMEWORK typedef enum { interSubFrame=0, intraAndInterSubFrame=1 } PUSCH_HOPPING_t; +#endif /// PUSCH-ConfigCommon from 36.331 RRC spec. typedef struct { @@ -305,6 +357,14 @@ typedef struct { /// SoundingRS-UL-ConfigDedicated Information Element from 36.331 RRC spec typedef struct { + /// This descriptor is active + uint8_t active; + /// This descriptor's frame + uint16_t frame; + /// This descriptor's subframe + uint8_t subframe; + /// rnti + uint16_t rnti; /// Parameter: \f$B_\text{SRS}\f$, see TS 36.211 (table 5.5.3.2-1, 5.5.3.2-2, 5.5.3.2-3 and 5.5.3.2-4). \vr{[0..3]} \note the specification sais it is an enumerated value. uint8_t srs_Bandwidth; /// Parameter: SRS hopping bandwidth \f$b_\text{hop}\in\{0,1,2,3\}\f$, see TS 36.211 (5.5.3.2) \vr{[0..3]} \note the specification sais it is an enumerated value. @@ -319,6 +379,12 @@ typedef struct { uint16_t srs_ConfigIndex; /// Parameter: \f$n^\text{CS}_\text{SRS}\f$. See TS 36.211 (5.5.3.1). \vr{[0..7]} \note the specification sais it is an enumerated value. uint8_t cyclicShift; + // Parameter: internal implementation: UE SRS configured + uint8_t srsConfigDedicatedSetup; + // Parameter: cell srs subframe for internal implementation + uint8_t srsCellSubframe; + // Parameter: ue srs subframe for internal implementation + uint8_t srsUeSubframe; } SOUNDINGRS_UL_CONFIG_DEDICATED; /// UplinkPowerControlDedicated Information Element from 36.331 RRC spec @@ -337,6 +403,7 @@ typedef struct { uint8_t filterCoefficient; } UL_POWER_CONTROL_DEDICATED; +#ifndef OCP_FRAMEWORK /// Enumeration for parameter \f$\alpha\f$ \ref UL_POWER_CONTROL_CONFIG_COMMON::alpha. typedef enum { al0=0, @@ -348,6 +415,7 @@ typedef enum { al09=6, al1=7 } PUSCH_alpha_t; +#endif /// \note UNUSED typedef enum { @@ -420,16 +488,20 @@ typedef struct { /// CQI-ReportPeriodic typedef struct { - /// Parameter: \f$n^{(2)}_\text{PUCCH}\f$, see TS 36.213 (7.2). \vr{[0..1185]} - uint16_t cqi_PUCCH_ResourceIndex; + /// Parameter: \f$n^{(2)}_\text{PUCCH}\f$, see TS 36.213 (7.2). \vr{[0..1185]}, -1 indicates inactivity + int16_t cqi_PUCCH_ResourceIndex; /// Parameter: CQI/PMI Periodicity and Offset Configuration Index \f$I_\text{CQI/PMI}\f$, see TS 36.213 (tables 7.2.2-1A and 7.2.2-1C). \vr{[0..1023]} - uint16_t cqi_PMI_ConfigIndex; + int16_t cqi_PMI_ConfigIndex; /// Parameter: K, see 36.213 (4.2.2). \vr{[1..4]} uint8_t K; - /// Parameter: RI Config Index \f$I_\text{RI}\f$, see TS 36.213 (7.2.2-1B). \vr{[0..1023]} - uint16_t ri_ConfigIndex; + /// Parameter: RI Config Index \f$I_\text{RI}\f$, see TS 36.213 (7.2.2-1B). \vr{[0..1023]}, -1 indicates inactivity + int16_t ri_ConfigIndex; /// Parameter: Simultaneous-AN-and-CQI, see TS 36.213 (10.1). \vr{[0..1]} 1 indicates that simultaneous transmission of ACK/NACK and CQI is allowed. uint8_t simultaneousAckNackAndCQI; + /// parameter computed from Tables 7.2.2-1A and 7.2.2-1C + uint16_t Npd; + /// parameter computed from Tables 7.2.2-1A and 7.2.2-1C + uint16_t N_OFFSET_CQI; } CQI_REPORTPERIODIC; /// Enumeration for parameter reporting mode \ref CQI_REPORT_CONFIG::cqi_ReportModeAperiodic. @@ -471,6 +543,16 @@ typedef struct { uint8_t N_RB_DL; /// Number of resource blocks (RB) in UL uint8_t N_RB_UL; + /// EUTRA Band + uint8_t eutra_band; + /// DL carrier frequency + uint32_t dl_CarrierFreq; + /// UL carrier frequency + uint32_t ul_CarrierFreq; + /// TX attenuation + uint32_t att_tx; + /// RX attenuation + uint32_t att_rx; /// total Number of Resource Block Groups: this is ceil(N_PRB/P) uint8_t N_RBG; /// Total Number of Resource Block Groups SubSets: this is P @@ -491,30 +573,10 @@ typedef struct { uint8_t tdd_config; /// TDD S-subframe configuration (0-9) uint8_t tdd_config_S; + /// srs extra symbol flag for TDD + uint8_t srsX; /// indicates if node is a UE (NODE=2) or eNB (PRIMARY_CH=0). uint8_t node_id; - /// Frequency index of CBMIMO1 card - uint8_t freq_idx; - /// RX Frequency for ExpressMIMO/LIME - uint32_t carrier_freq[4]; - /// TX Frequency for ExpressMIMO/LIME - uint32_t carrier_freqtx[4]; - /// RX gain for ExpressMIMO/LIME - uint32_t rxgain[4]; - /// TX gain for ExpressMIMO/LIME - uint32_t txgain[4]; - /// RF mode for ExpressMIMO/LIME - uint32_t rfmode[4]; - /// RF RX DC Calibration for ExpressMIMO/LIME - uint32_t rxdc[4]; - /// RF TX DC Calibration for ExpressMIMO/LIME - uint32_t rflocal[4]; - /// RF VCO calibration for ExpressMIMO/LIME - uint32_t rfvcolocal[4]; - /// Turns on second TX of CBMIMO1 card - uint8_t dual_tx; - /// flag to indicate SISO transmission - uint8_t mode1_flag; /// Indicator that 20 MHz channel uses 3/4 sampling frequency uint8_t threequarter_fs; /// Size of FFT @@ -529,14 +591,22 @@ typedef struct { uint32_t samples_per_tti; /// Number of OFDM/SC-FDMA symbols in one subframe (to be modified to account for potential different in UL/DL) uint16_t symbols_per_tti; - /// Number of Transmit antennas in node + /// Number of OFDM symbols in DL portion of S-subframe + uint16_t dl_symbols_in_S_subframe; + /// Number of SC-FDMA symbols in UL portion of S-subframe + uint16_t ul_symbols_in_S_subframe; + /// Number of Physical transmit antennas in node uint8_t nb_antennas_tx; /// Number of Receive antennas in node uint8_t nb_antennas_rx; - /// Number of Transmit antennas in eNodeB - uint8_t nb_antennas_tx_eNB; + /// Number of common transmit antenna ports in eNodeB (1 or 2) + uint8_t nb_antenna_ports_eNB; /// PRACH_CONFIG PRACH_CONFIG_COMMON prach_config_common; +#ifdef Rel14 + /// PRACH_eMTC_CONFIG + PRACH_eMTC_CONFIG_COMMON prach_emtc_config_common; +#endif /// PUCCH Config Common (from 36-331 RRC spec) PUCCH_CONFIG_COMMON pucch_config_common; /// PDSCH Config Common (from 36-331 RRC spec) @@ -588,156 +658,291 @@ typedef enum { DUALSTREAM_UNIFORM_PRECODING1=9, DUALSTREAM_UNIFORM_PRECODINGj=10, DUALSTREAM_PUSCH_PRECODING=11, - TM8=12, - TM9_10=13 + TM7=12, + TM8=13, + TM9_10=14 } MIMO_mode_t; + +typedef enum { + /// MRT + MRT=0, + /// ZF + ZF=1, + /// MMSE + MMSE=2 +} PRECODE_TYPE_t; + typedef struct { - /// \brief Holds the transmit data in time domain. - /// For IFFT_FPGA this points to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: tx antenna [0..nb_antennas_tx[ - /// - third index: - int32_t **txdata[3]; + /// \brief Pointers (dynamic) to the received data in the time domain. + /// - first index: rx antenna [0..nb_antennas_rx[ + /// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[ + int32_t **rxdata; + /// \brief Pointers (dynamic) to the received data in the frequency domain. + /// - first index: rx antenna [0..nb_antennas_rx[ + /// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[ + int32_t **rxdataF; /// \brief holds the transmit data in the frequency domain. - /// For IFFT_FPGA this points to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. + /// For IFFT_FPGA this points to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. //? /// - first index: eNB id [0..2] (hard coded) - /// - second index: tx antenna [0..nb_antennas_tx[ + /// - second index: tx antenna [0..14[ where 14 is the total supported antenna ports. /// - third index: sample [0..] - int32_t **txdataF[3]; - /// \brief Holds the received data in time domain. - /// Should point to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna [0..nb_antennas_rx[ - /// - third index: sample [0..] - int32_t **rxdata[3]; - /// \brief Holds the last subframe of received data in time domain after removal of 7.5kHz frequency offset. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna [0..nb_antennas_rx[ - /// - third index: sample [0..samples_per_tti[ - int32_t **rxdata_7_5kHz[3]; - /// \brief Holds the received data in the frequency domain. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna [0..nb_antennas_rx[ - /// - third index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[ - int32_t **rxdataF[3]; - /// \brief Holds output of the sync correlator. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: sample [0..samples_per_tti*10[ - uint32_t *sync_corr[3]; + int32_t **txdataF; } LTE_eNB_COMMON; +typedef struct { + /// \brief Holds the transmit data in the frequency domain. + /// - first index: rx antenna [0..nb_antennas_rx[ + /// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[ + int32_t **txdata; + /// \brief holds the transmit data after beamforming in the frequency domain. + /// - first index: tx antenna [0..nb_antennas_tx[ + /// - second index: sample [0..] + int32_t **txdataF_BF; + /// \brief holds the transmit data before beamforming for epdcch/mpdcch + /// - first index : tx antenna [0..nb_epdcch_antenna_ports[ + /// - second index: sampl [0..] + int32_t **txdataF_epdcch; + /// \brief Holds the receive data in the frequency domain. + /// - first index: rx antenna [0..nb_antennas_rx[ + /// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[ + int32_t **rxdata; + /// \brief Holds the last subframe of received data in time domain after removal of 7.5kHz frequency offset. + /// - first index: rx antenna [0..nb_antennas_rx[ + /// - second index: sample [0..samples_per_tti[ + int32_t **rxdata_7_5kHz; + /// \brief Holds the received data in the frequency domain. + /// - first index: rx antenna [0..nb_antennas_rx[ + /// - second index: ? [0..2*ofdm_symbol_size*frame_parms->symbols_per_tti[ + int32_t **rxdataF; + /// \brief Holds output of the sync correlator. + /// - first index: sample [0..samples_per_tti*10[ + uint32_t *sync_corr; + /// \brief Holds the tdd reciprocity calibration coefficients + /// - first index: eNB id [0..2] (hard coded) + /// - second index: tx antenna [0..nb_antennas_tx[ + /// - third index: frequency [0..] + int32_t **tdd_calib_coeffs; +} RU_COMMON; + +typedef enum {format0, + format1, + format1A, + format1B, + format1C, + format1D, + format1E_2A_M10PRB, + format2, + format2A, + format2B, + format2C, + format2D, + format3, + format3A, + format4, + format5, + format6_0A, + format6_0B, + format6_1A, + format6_1B, + format6_2 + } DCI_format_t; + +typedef struct { + /// Length of DCI in bits + uint8_t dci_length; + /// Aggregation level + uint8_t L; + /// Position of first CCE of the dci + int firstCCE; + /// flag to indicate that this is a RA response + boolean_t ra_flag; + /// rnti + rnti_t rnti; + /// harq_pid + rnti_t harq_pid; + /// Format + DCI_format_t format; + /// DCI pdu + uint8_t dci_pdu[8]; +} DCI_ALLOC_t; + +#define MAX_EPDCCH_PRB 8 + +typedef struct { + /// Length of DCI in bits + uint8_t dci_length; + /// Aggregation level + uint8_t L; + /// Position of first CCE of the dci + int firstCCE; + /// flag to indicate that this is a RA response + boolean_t ra_flag; + /// rnti + rnti_t rnti; + /// Format + DCI_format_t format; + /// epdcch resource assignment (0=localized,1=distributed) + uint8_t epdcch_resource_assignment_flag; + /// epdcch index + uint16_t epdcch_id; + /// epdcch start symbol + uint8_t epdcch_start_symbol; + /// epdcch number of PRBs in set + uint8_t epdcch_num_prb; + /// vector of prb ids for set + uint8_t epdcch_prb_index[MAX_EPDCCH_PRB]; + /// LBT parameter for frame configuration + uint8_t dwpts_symbols; + /// LBT parameter for frame configuration + uint8_t initial_lbt_sf; + /// DCI pdu + uint8_t dci_pdu[8]; +} eDCI_ALLOC_t; + +typedef struct { + /// Length of DCI in bits + uint8_t dci_length; + /// Aggregation level + uint8_t L; + /// Position of first CCE of the dci + int firstCCE; + /// flag to indicate that this is a RA response + boolean_t ra_flag; + /// rnti + rnti_t rnti; + /// Format + DCI_format_t format; + /// harq process index + uint8_t harq_pid; + /// Narrowband index + uint8_t narrowband; + /// number of PRB pairs for MPDCCH + uint8_t number_of_prb_pairs; + /// mpdcch resource assignment (combinatorial index r) + uint8_t resource_block_assignment; + /// transmission type (0=localized,1=distributed) + uint8_t transmission_type; + /// mpdcch start symbol + uint8_t start_symbol; + /// CE mode (1=ModeA,2=ModeB) + uint8_t ce_mode; + /// 0-503 n_EPDCCHid_i + uint16_t dmrs_scrambling_init; + /// Absolute subframe of the initial transmission (0-10239) + uint16_t i0; + /// number of mdpcch repetitions + uint16_t reps; + /// current absolute subframe number + uint16_t absSF; + /// DCI pdu + uint8_t dci_pdu[8]; +} mDCI_ALLOC_t; + + +typedef struct { + uint8_t num_dci; + uint8_t num_pdcch_symbols; + DCI_ALLOC_t dci_alloc[32]; +} LTE_eNB_PDCCH; + +typedef struct { + uint8_t hi; + uint8_t first_rb; + uint8_t n_DMRS; +} phich_config_t; + +typedef struct { + uint8_t num_hi; + phich_config_t config[32]; +} LTE_eNB_PHICH; + +typedef struct { + uint8_t num_dci; + eDCI_ALLOC_t edci_alloc[32]; +} LTE_eNB_EPDCCH; + +typedef struct { + /// number of active MPDCCH allocations + uint8_t num_dci; + /// MPDCCH DCI allocations from MAC + mDCI_ALLOC_t mdci_alloc[32]; + // MAX SIZE of an EPDCCH set is 16EREGs * 9REs/EREG * 8 PRB pairs = 2304 bits + uint8_t e[2304]; +} LTE_eNB_MPDCCH; + + typedef struct { /// \brief Hold the channel estimates in frequency domain based on SRS. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..ofdm_symbol_size[ - int32_t **srs_ch_estimates[3]; + /// - first index: rx antenna id [0..nb_antennas_rx[ + /// - second index: ? [0..ofdm_symbol_size[ + int32_t **srs_ch_estimates; /// \brief Hold the channel estimates in time domain based on SRS. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..2*ofdm_symbol_size[ - int32_t **srs_ch_estimates_time[3]; + /// - first index: rx antenna id [0..nb_antennas_rx[ + /// - second index: ? [0..2*ofdm_symbol_size[ + int32_t **srs_ch_estimates_time; /// \brief Holds the SRS for channel estimation at the RX. - /// - first index: ? [0..ofdm_symbol_size[ + /// - first index: rx antenna id [0..nb_antennas_rx[ + /// - second index: ? [0..ofdm_symbol_size[ int32_t *srs; } LTE_eNB_SRS; typedef struct { /// \brief Holds the received data in the frequency domain for the allocated RBs in repeated format. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..2*ofdm_symbol_size[ - /// - third index (definition from phy_init_lte_eNB()): ? [0..24*N_RB_UL*frame_parms->symbols_per_tti[ - /// \warning inconsistent third index definition - int32_t **rxdataF_ext[3]; + /// - first index: rx antenna id [0..nb_antennas_rx[ + /// - second index: ? [0..2*ofdm_symbol_size[ + int32_t **rxdataF_ext; /// \brief Holds the received data in the frequency domain for the allocated RBs in normal format. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index (definition from phy_init_lte_eNB()): ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **rxdataF_ext2[3]; + /// - first index: rx antenna id [0..nb_antennas_rx[ + /// - second index (definition from phy_init_lte_eNB()): ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ + int32_t **rxdataF_ext2; /// \brief Hold the channel estimates in time domain based on DRS. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..4*ofdm_symbol_size[ - int32_t **drs_ch_estimates_time[3]; + /// - first index: rx antenna id [0..nb_antennas_rx[ + /// - second index: ? [0..4*ofdm_symbol_size[ + int32_t **drs_ch_estimates_time; /// \brief Hold the channel estimates in frequency domain based on DRS. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **drs_ch_estimates[3]; - /// \brief Hold the channel estimates for UE0 in case of Distributed Alamouti Scheme. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **drs_ch_estimates_0[3]; - /// \brief Hold the channel estimates for UE1 in case of Distributed Almouti Scheme. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **drs_ch_estimates_1[3]; + /// - first index: rx antenna id [0..nb_antennas_rx[ + /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ + int32_t **drs_ch_estimates; /// \brief Holds the compensated signal. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **rxdataF_comp[3]; - /// \brief Hold the compensated data (y)*(h0*) in case of Distributed Alamouti Scheme. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **rxdataF_comp_0[3]; - /// \brief Hold the compensated data (y*)*(h1) in case of Distributed Alamouti Scheme. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **rxdataF_comp_1[3]; - /// \brief ?. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **ul_ch_mag[3]; - /// \brief ?. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **ul_ch_magb[3]; - /// \brief Hold the channel mag for UE0 in case of Distributed Alamouti Scheme. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **ul_ch_mag_0[3]; - /// \brief Hold the channel magb for UE0 in case of Distributed Alamouti Scheme. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **ul_ch_magb_0[3]; - /// \brief Hold the channel mag for UE1 in case of Distributed Alamouti Scheme. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **ul_ch_mag_1[3]; - /// \brief Hold the channel magb for UE1 in case of Distributed Alamouti Scheme. - /// - first index: eNB id [0..2] (hard coded) - /// - second index: rx antenna id [0..nb_antennas_rx[ - /// - third index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ - int32_t **ul_ch_magb_1[3]; + /// - first index: rx antenna id [0..nb_antennas_rx[ + /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ + int32_t **rxdataF_comp; + /// \brief Magnitude of the UL channel estimates. Used for 2nd-bit level thresholds in LLR computation + /// - first index: rx antenna id [0..nb_antennas_rx[ + /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ + int32_t **ul_ch_mag; + /// \brief Magnitude of the UL channel estimates scaled for 3rd bit level thresholds in LLR computation + /// - first index: rx antenna id [0..nb_antennas_rx[ + /// - second index: ? [0..12*N_RB_UL*frame_parms->symbols_per_tti[ + int32_t **ul_ch_magb; /// measured RX power based on DRS int ulsch_power[2]; - /// measured RX power based on DRS for UE0 in case of Distributed Alamouti Scheme - int ulsch_power_0[2]; - /// measured RX power based on DRS for UE0 in case of Distributed Alamouti Scheme - int ulsch_power_1[2]; /// \brief llr values. /// - first index: ? [0..1179743] (hard coded) int16_t *llr; -#ifdef LOCALIZATION - /// number of active subcarrier for a specific UE - int32_t active_subcarrier; - /// subcarrier power in dBm - int32_t *subcarrier_power; -#endif } LTE_eNB_PUSCH; +typedef struct { + + /// \brief Holds the received data in the frequency domain. + /// - first index: rx antenna [0..nb_antennas_rx[ + /// - second index: symbol [0..28*ofdm_symbol_size[ + int32_t **rxdataF; + + /// \brief Hold the channel estimates in frequency domain. + /// - first index: eNB id [0..6] (hard coded) + /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx + /// - third index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[ + int32_t **dl_ch_estimates[7]; + + /// \brief Hold the channel estimates in time domain (used for tracking). + /// - first index: eNB id [0..6] (hard coded) + /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx + /// - third index: samples? [0..2*ofdm_symbol_size[ + int32_t **dl_ch_estimates_time[7]; +}LTE_UE_COMMON_PER_THREAD; + typedef struct { /// \brief Holds the transmit data in time domain. /// For IFFT_FPGA this points to the same memory as PHY_vars->tx_vars[a].TX_DMA_BUFFER. @@ -749,29 +954,15 @@ typedef struct { /// - first index: tx antenna [0..nb_antennas_tx[ /// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX[ int32_t **txdataF; + /// \brief Holds the received data in time domain. /// Should point to the same memory as PHY_vars->rx_vars[a].RX_DMA_BUFFER. /// - first index: rx antenna [0..nb_antennas_rx[ /// - second index: sample [0..FRAME_LENGTH_COMPLEX_SAMPLES+2048[ int32_t **rxdata; - /// \brief Holds the received data in the frequency domain. - /// - first index: rx antenna [0..nb_antennas_rx[ - /// - second index: symbol [0..28*ofdm_symbol_size[ - int32_t **rxdataF; - /// \brief ?. - /// - first index: rx antenna [0..nb_antennas_rx[ - /// - second index: ? [0..20*ofdm_symbol_size*symbols_per_tti[ - int32_t **rxdataF2; - /// \brief Hold the channel estimates in frequency domain. - /// - first index: eNB id [0..6] (hard coded) - /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - third index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[ - int32_t **dl_ch_estimates[7]; - /// \brief Hold the channel estimates in time domain (used for tracking). - /// - first index: eNB id [0..6] (hard coded) - /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - third index: samples? [0..2*ofdm_symbol_size[ - int32_t **dl_ch_estimates_time[7]; + + LTE_UE_COMMON_PER_THREAD common_vars_rx_data_per_thread[RX_NB_TH_MAX]; + /// holds output of the sync correlator int32_t *sync_corr; /// estimated frequency offset (in radians) for all subcarriers @@ -785,23 +976,38 @@ typedef struct { /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **rxdataF_ext; + /// \brief Received frequency-domain ue specific pilots. + /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx + /// - second index: ? [0..12*N_RB_DL[ + int32_t **rxdataF_uespec_pilots; /// \brief Received frequency-domain signal after extraction and channel compensation. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **rxdataF_comp0; - /// \brief Received frequency-domain signal after extraction and channel compensation. - /// - first index: ? [0..7] (hard coded) accessed via \c round - /// - second index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx - /// - third index: ? [0..168*N_RB_DL[ - int32_t **rxdataF_comp1[8]; + /// \brief Received frequency-domain signal after extraction and channel compensation for the second stream. For the SIC receiver we need to store the history of this for each harq process and round + /// - first index: ? [0..7] (hard coded) accessed via \c harq_pid + /// - second index: ? [0..7] (hard coded) accessed via \c round + /// - third index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx + /// - fourth index: ? [0..168*N_RB_DL[ + int32_t **rxdataF_comp1[8][8]; /// \brief Downlink channel estimates extracted in PRBS. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ int32_t **dl_ch_estimates_ext; - /// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS. + /// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS. For the SIC receiver we need to store the history of this for each harq process and round + /// - first index: ? [0..7] (hard coded) accessed via \c harq_pid + /// - second index: ? [0..7] (hard coded) accessed via \c round + /// - third index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx + /// - fourth index: ? [0..168*N_RB_DL[ + int32_t **dl_ch_rho_ext[8][8]; + /// \brief Downlink beamforming channel estimates in frequency domain. + /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx + /// - second index: samples? [0..symbols_per_tti*(ofdm_symbol_size+LTE_CE_FILTER_LENGTH)[ + int32_t **dl_bf_ch_estimates; + /// \brief Downlink beamforming channel estimates. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ - int32_t **dl_ch_rho_ext; + int32_t **dl_bf_ch_estimates_ext; /// \brief Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS. /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ @@ -816,7 +1022,7 @@ typedef struct { /// \brief Magnitude of Downlink Channel second layer (16QAM level/First 64QAM level). /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ - int32_t **dl_ch_mag1; + int32_t **dl_ch_mag1[8][8]; /// \brief Magnitude of Downlink Channel, first layer (2nd 64QAM level). /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ @@ -824,7 +1030,7 @@ typedef struct { /// \brief Magnitude of Downlink Channel second layer (2nd 64QAM level). /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..168*N_RB_DL[ - int32_t **dl_ch_magb1; + int32_t **dl_ch_magb1[8][8]; /// \brief Cross-correlation of two eNB signals. /// - first index: rx antenna [0..nb_antennas_rx[ /// - second index: symbol [0..] @@ -837,6 +1043,10 @@ typedef struct { int16_t *llr[2]; /// \f$\log_2(\max|H_i|^2)\f$ int16_t log2_maxh; + /// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer1 channel compensation + int16_t log2_maxh0; + /// \f$\log_2(\max|H_i|^2)\f$ //this is for TM3-4 layer2 channel commpensation + int16_t log2_maxh1; /// \brief LLR shifts for subband scaling. /// - first index: ? [0..168*N_RB_DL[ uint8_t *llr_shifts; @@ -854,6 +1064,10 @@ typedef struct { //uint32_t *rb_alloc; //uint8_t Qm[2]; //MIMO_mode_t mimo_mode; + // llr offset per ofdm symbol + uint32_t llr_offset[14]; + // llr length per ofdm symbol + uint32_t llr_length[14]; } LTE_UE_PDSCH; typedef struct { @@ -942,6 +1156,8 @@ typedef struct { uint8_t num_pdcch_symbols; /// Allocated CRNTI for UE uint16_t crnti; + /// 1: the allocated crnti is Temporary C-RNTI / 0: otherwise + uint8_t crnti_is_temporary; /// Total number of PDU errors (diagnostic mode) uint32_t dci_errors; /// Total number of PDU received @@ -952,6 +1168,9 @@ typedef struct { uint32_t dci_missed; /// nCCE for PUCCH per subframe uint8_t nCCE[10]; + //Check for specific DCIFormat and AgregationLevel + uint8_t dciFormat; + uint8_t agregationLevel; } LTE_UE_PDCCH; #define PBCH_A 24 @@ -996,18 +1215,30 @@ typedef struct { int16_t *prach; } LTE_UE_PRACH; +#define MAX_NUM_RX_PRACH_PREAMBLES 4 + typedef struct { /// \brief ?. /// first index: ? [0..1023] (hard coded) int16_t *prachF; /// \brief ?. - /// first index: rx antenna [0..3] (hard coded) \note Hard coded array size indexed by \c nb_antennas_rx. - /// second index: ? [0..ofdm_symbol_size*12[ - int16_t *rxsigF[4]; + /// first index: ce_level [0..3] + /// second index: rx antenna [0..63] (hard coded) \note Hard coded array size indexed by \c nb_antennas_rx. + /// third index: frequency-domain sample [0..ofdm_symbol_size*12[ + int16_t **rxsigF[4]; /// \brief local buffer to compute prach_ifft (necessary in case of multiple CCs) - /// first index: rx antenna [0..3] (hard coded) \note Hard coded array size indexed by \c nb_antennas_rx. - /// second index: ? [0..2047] (hard coded) - int16_t *prach_ifft[4]; + /// first index: ce_level [0..3] (hard coded) \note Hard coded array size indexed by \c nb_antennas_rx. + /// second index: ? [0..63] (hard coded) + /// third index: ? [0..63] (hard coded) + int32_t **prach_ifft[4]; + + /// repetition number +#ifdef Rel14 + /// indicator of first frame in a group of PRACH repetitions + int first_frame[4]; + /// current repetition for each CE level + int repetition_number[4]; +#endif } LTE_eNB_PRACH; typedef struct { @@ -1025,6 +1256,7 @@ typedef struct { uint8_t *Msg3; } PRACH_RESOURCES_t; + typedef struct { /// Downlink Power offset field uint8_t dl_pow_off; @@ -1046,6 +1278,14 @@ typedef enum { typedef enum {SF_DL, SF_UL, SF_S} lte_subframe_t; +typedef enum { + /// do not detect any DCIs in the current subframe + NO_DCI = 0x0, + /// detect only downlink DCIs in the current subframe + UL_DCI = 0x1, + /// detect only uplink DCIs in the current subframe + DL_DCI = 0x2, + /// detect both uplink and downlink DCIs in the current subframe + UL_DL_DCI = 0x3} dci_detect_mode_t; + #endif - - diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h old mode 100755 new mode 100644 index 98615d6f6e..60d3fec5f4 --- a/openair1/PHY/impl_defs_top.h +++ b/openair1/PHY/impl_defs_top.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/impl_defs_top.h * \brief More defines and structure definitions @@ -115,6 +107,7 @@ * @} */ +#include "defs.h" #include "types.h" @@ -132,10 +125,6 @@ #define FIRST_CARRIER_OFFSET (HALF_NUMBER_OF_USEFUL_CARRIERS+NUMBER_OF_ZERO_CARRIERS) #define NUMBER_OF_OFDM_SYMBOLS_PER_SLOT (NUMBER_OF_SYMBOLS_PER_FRAME/LTE_SLOTS_PER_FRAME) -#ifdef EMOS -#define EMOS_SCH_INDEX 1 -#endif //EMOS - #define EXTENSION_TYPE (PHY_config->PHY_framing.Extension_type) #define NUMBER_OF_OFDM_CARRIERS_BYTES NUMBER_OF_OFDM_CARRIERS*4 @@ -185,6 +174,7 @@ #define DMA_BLKS_PER_SLOT (SLOT_LENGTH_BYTES/2048) // Number of DMA blocks per slot #define SLOT_TIME_NS (SLOT_LENGTH_SAMPLES*(1e3)/7.68) // slot time in ns +#define NB_ANTENNA_PORTS_ENB 6 // total number of eNB antenna ports #ifdef EXMIMO #define TARGET_RX_POWER 55 // Target digital power for the AGC @@ -209,7 +199,7 @@ #define ONE_OVER_SQRT2_Q15 23170 - +#define ONE_OVER_2_Q15 16384 // QAM amplitude definitions @@ -277,187 +267,15 @@ typedef struct { int *RX_DMA_BUFFER[2]; } TX_RX_VARS; -/*! \brief Extension Type */ -typedef enum { - CYCLIC_PREFIX, - CYCLIC_SUFFIX, - ZEROS, - NONE -} Extension_t; - /// Measurement Variables #define NUMBER_OF_SUBBANDS_MAX 13 #define NUMBER_OF_HARQ_PID_MAX 8 #define MAX_FRAME_NUMBER 0x400 -#if defined(CBMIMO1) || defined(EXMIMO) || defined(OAI_USRP) -#define NUMBER_OF_eNB_MAX 1 -#define NUMBER_OF_UE_MAX 16 -#define NUMBER_OF_CONNECTED_eNB_MAX 3 -#else -#ifdef LARGE_SCALE -#define NUMBER_OF_eNB_MAX 2 -#define NUMBER_OF_UE_MAX 120 -#define NUMBER_OF_CONNECTED_eNB_MAX 1 // to save some memory -#else -#define NUMBER_OF_eNB_MAX 7 -#define NUMBER_OF_UE_MAX 16 -#define NUMBER_OF_CONNECTED_eNB_MAX 3 -#endif -#endif +#include "openairinterface5g_limits.h" -#define NUMBER_OF_RN_MAX 3 -typedef enum {no_relay=1,unicast_relay_type1,unicast_relay_type2, multicast_relay} relaying_type_t; -typedef struct { - //unsigned int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (linear) - //unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (dB) - //unsigned short rx_avg_power_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //! estimated avg received signal power (dB) - - // RRC measurements - uint32_t rssi; - int n_adj_cells; - unsigned int adj_cell_id[6]; - uint32_t rsrq[7]; - uint32_t rsrp[7]; - float rsrp_filtered[7]; // after layer 3 filtering - float rsrq_filtered[7]; - // common measurements - //! estimated noise power (linear) - unsigned int n0_power[NB_ANTENNAS_RX]; - //! estimated noise power (dB) - unsigned short n0_power_dB[NB_ANTENNAS_RX]; - //! total estimated noise power (linear) - unsigned int n0_power_tot; - //! total estimated noise power (dB) - unsigned short n0_power_tot_dB; - //! average estimated noise power (linear) - unsigned int n0_power_avg; - //! average estimated noise power (dB) - unsigned short n0_power_avg_dB; - //! total estimated noise power (dBm) - short n0_power_tot_dBm; - - // UE measurements - //! estimated received spatial signal power (linear) - int rx_spatial_power[NUMBER_OF_CONNECTED_eNB_MAX][2][2]; - //! estimated received spatial signal power (dB) - unsigned short rx_spatial_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][2][2]; - - /// estimated received signal power (sum over all TX antennas) - //int wideband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; - int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; - /// estimated received signal power (sum over all TX antennas) - //int wideband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; - unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; - - /// estimated received signal power (sum over all TX/RX antennas) - int rx_power_tot[NUMBER_OF_CONNECTED_eNB_MAX]; //NEW - /// estimated received signal power (sum over all TX/RX antennas) - unsigned short rx_power_tot_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //NEW - - //! estimated received signal power (sum of all TX/RX antennas, time average) - int rx_power_avg[NUMBER_OF_CONNECTED_eNB_MAX]; - //! estimated received signal power (sum of all TX/RX antennas, time average, in dB) - unsigned short rx_power_avg_dB[NUMBER_OF_CONNECTED_eNB_MAX]; - - /// SINR (sum of all TX/RX antennas, in dB) - int wideband_cqi_tot[NUMBER_OF_CONNECTED_eNB_MAX]; - /// SINR (sum of all TX/RX antennas, time average, in dB) - int wideband_cqi_avg[NUMBER_OF_CONNECTED_eNB_MAX]; - - //! estimated rssi (dBm) - short rx_rssi_dBm[NUMBER_OF_CONNECTED_eNB_MAX]; - //! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation) - int rx_correlation[NUMBER_OF_CONNECTED_eNB_MAX][2]; - //! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation) - int rx_correlation_dB[NUMBER_OF_CONNECTED_eNB_MAX][2]; - - /// Wideband CQI (sum of all RX antennas, in dB, for precoded transmission modes (3,4,5,6), up to 4 spatial streams) - int precoded_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX+1][4]; - /// Subband CQI per RX antenna (= SINR) - int subband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX]; - /// Total Subband CQI (= SINR) - int subband_cqi_tot[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX]; - /// Subband CQI in dB (= SINR dB) - int subband_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX]; - /// Total Subband CQI - int subband_cqi_tot_dB[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX]; - /// Wideband PMI for each RX antenna - int wideband_pmi_re[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; - /// Wideband PMI for each RX antenna - int wideband_pmi_im[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; - ///Subband PMI for each RX antenna - int subband_pmi_re[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX][NB_ANTENNAS_RX]; - ///Subband PMI for each RX antenna - int subband_pmi_im[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX][NB_ANTENNAS_RX]; - /// chosen RX antennas (1=Rx antenna 1, 2=Rx antenna 2, 3=both Rx antennas) - unsigned char selected_rx_antennas[NUMBER_OF_CONNECTED_eNB_MAX][NUMBER_OF_SUBBANDS_MAX]; - /// Wideband Rank indication - unsigned char rank[NUMBER_OF_CONNECTED_eNB_MAX]; - /// Number of RX Antennas - unsigned char nb_antennas_rx; - /// DLSCH error counter - // short dlsch_errors; - -} PHY_MEASUREMENTS; - -typedef struct { - //unsigned int rx_power[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (linear) - //unsigned short rx_power_dB[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX]; //! estimated received signal power (dB) - //unsigned short rx_avg_power_dB[NUMBER_OF_CONNECTED_eNB_MAX]; //! estimated avg received signal power (dB) - - // common measurements - //! estimated noise power (linear) - unsigned int n0_power[NB_ANTENNAS_RX]; - //! estimated noise power (dB) - unsigned short n0_power_dB[NB_ANTENNAS_RX]; - //! total estimated noise power (linear) - unsigned int n0_power_tot; - //! estimated avg noise power (dB) - unsigned short n0_power_tot_dB; - //! estimated avg noise power (dB) - short n0_power_tot_dBm; - //! estimated avg noise power per RB per RX ant (lin) - unsigned short n0_subband_power[NB_ANTENNAS_RX][100]; - //! estimated avg noise power per RB per RX ant (dB) - unsigned short n0_subband_power_dB[NB_ANTENNAS_RX][100]; - //! estimated avg noise power per RB (dB) - short n0_subband_power_tot_dB[100]; - //! estimated avg noise power per RB (dBm) - short n0_subband_power_tot_dBm[100]; - // eNB measurements (per user) - //! estimated received spatial signal power (linear) - unsigned int rx_spatial_power[NUMBER_OF_UE_MAX][2][2]; - //! estimated received spatial signal power (dB) - unsigned short rx_spatial_power_dB[NUMBER_OF_UE_MAX][2][2]; - //! estimated rssi (dBm) - short rx_rssi_dBm[NUMBER_OF_UE_MAX]; - //! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation) - int rx_correlation[NUMBER_OF_UE_MAX][2]; - //! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation) - int rx_correlation_dB[NUMBER_OF_UE_MAX][2]; - - /// Wideband CQI (= SINR) - int wideband_cqi[NUMBER_OF_UE_MAX][NB_ANTENNAS_RX]; - /// Wideband CQI in dB (= SINR dB) - int wideband_cqi_dB[NUMBER_OF_UE_MAX][NB_ANTENNAS_RX]; - /// Wideband CQI (sum of all RX antennas, in dB) - char wideband_cqi_tot[NUMBER_OF_UE_MAX]; - /// Subband CQI per RX antenna and RB (= SINR) - int subband_cqi[NUMBER_OF_UE_MAX][NB_ANTENNAS_RX][100]; - /// Total Subband CQI and RB (= SINR) - int subband_cqi_tot[NUMBER_OF_UE_MAX][100]; - /// Subband CQI in dB and RB (= SINR dB) - int subband_cqi_dB[NUMBER_OF_UE_MAX][NB_ANTENNAS_RX][100]; - /// Total Subband CQI and RB - int subband_cqi_tot_dB[NUMBER_OF_UE_MAX][100]; - -} PHY_MEASUREMENTS_eNB; - -#define MCS_COUNT 28 -#define MCS_TABLE_LENGTH_MAX 64 #endif //__PHY_IMPLEMENTATION_DEFS_H__ /**@} diff --git a/openair1/PHY/sse_intrin.h b/openair1/PHY/sse_intrin.h index dbeb21dff1..da4d1db846 100644 --- a/openair1/PHY/sse_intrin.h +++ b/openair1/PHY/sse_intrin.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 2015 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY/sse_intrin.h * \brief SSE includes and compatibility functions. diff --git a/openair1/PHY/types.h b/openair1/PHY/types.h old mode 100755 new mode 100644 index 7a362c5270..c0a9af388c --- a/openair1/PHY/types.h +++ b/openair1/PHY/types.h @@ -1,39 +1,28 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __openair_TYPES_H__ #define __openair_TYPES_H__ -#ifdef USER_MODE #include -#else -#include -#endif #endif /*__openair_TYPES_H__ */ diff --git a/openair1/PHY/vars.h b/openair1/PHY/vars.h old mode 100755 new mode 100644 index 3d940d4a94..f78cb92bcd --- a/openair1/PHY/vars.h +++ b/openair1/PHY/vars.h @@ -1,46 +1,33 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __PHY_VARS_H__ #define __PHY_VARS_H__ #include "PHY/types.h" #include "PHY/defs.h" -#ifndef USER_MODE -unsigned int RX_DMA_BUFFER[4][NB_ANTENNAS_RX]; -unsigned int TX_DMA_BUFFER[4][NB_ANTENNAS_TX]; -unsigned int DAQ_MBOX; -#endif char* namepointer_chMag ; char fmageren_name2[512]; char* namepointer_log2; -//PHY_CONFIG *PHY_config; #include "PHY/LTE_REFSIG/primary_synch.h" @@ -52,10 +39,17 @@ int16_t *primary_synch2_time; #include "PHY/CODING/vars.h" //PHY_VARS *PHY_vars; +#ifndef OCP_FRAMEWORK PHY_VARS_UE ***PHY_vars_UE_g; -PHY_VARS_eNB ***PHY_vars_eNB_g; -PHY_VARS_RN **PHY_vars_RN_g; +RAN_CONTEXT_t RC; + +//PHY_VARS_eNB ***PHY_vars_eNB_g; +//PHY_VARS_RN **PHY_vars_RN_g; LTE_DL_FRAME_PARMS *lte_frame_parms_g; +#else +PHY_VARS_UE * PHY_vars_UE_g[MAX_UE][MAX_NUM_CCs]={NULL}; +PHY_VARS_eNB * PHY_vars_eNB_g[MAX_eNB][MAX_NUM_CCs]={NULL}; +#endif unsigned short rev[2048],rev_times4[8192],rev_half[1024]; @@ -69,6 +63,7 @@ char mode_string[4][20] = {"NOT SYNCHED","PRACH","RAR","PUSCH"}; #include "SIMULATION/ETH_TRANSPORT/vars.h" +unsigned char NB_RU=0; #ifndef OPENAIR2 unsigned char NB_eNB_INST=0; @@ -81,6 +76,7 @@ unsigned int ULSCH_max_consecutive_errors = 20; int number_of_cards; + int flag_LA=0; int flagMag; //extern channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX]; @@ -139,6 +135,18 @@ double beta2_dlsch[6][MCS_COUNT] = { {2.52163, 0.83231, 0.77472, 1.36536, 1.1682 */ +#ifdef OCP_FRAMEWORK +#include +#else +char eNB_functions[6][20]={"eNodeB_3GPP","eNodeB_3GPP_BBU","NGFI_RAU_IF4p5","NGFI_RRU_IF5","NGFI_RRU_IF4p5",}; +char eNB_timing[2][20]={"synch_to_ext_device","synch_to_other"}; +char ru_if_types[MAX_RU_IF_TYPES][20]={"local RF","IF5 RRU","IF5 Mobipass","IF4p5 RRU","IF1pp RRU"}; +#endif + +/// lookup table for unscrambling in RX +int16_t unscrambling_lut[65536*16] __attribute__((aligned(32))); +/// lookup table for scrambling in TX +uint8_t scrambling_lut[65536*16] __attribute__((aligned(32))); #endif /*__PHY_VARS_H__ */ diff --git a/openair1/README.TXT b/openair1/README.TXT index 34d3144105..23c86e888e 100644 --- a/openair1/README.TXT +++ b/openair1/README.TXT @@ -1,40 +1,5 @@ This folder contains the software for the device driver of CBMIMO1 and the physical layer signal processing. - -|-- ARCH // contains drivers for hardware -| |-- CBMIMO1 // contains everything related to CBMIMO1 -| | `-- DEVICE_DRIVER -| | |-- Makefile // main Makefile used to compile the driver; usually invoked from the top level Makefile -| | |-- cbmimo1_device.c // main file for device driver (initializes the card, bigphys, main variables) -| | |-- cbmimo1_device.h -| | |-- cbmimo1_dma.c -| | |-- cbmimo1_fileops.c // file that processes IOCTL commands coming from the userspace control utility (USERSPACE_TOOLS/OPENAIR_RF/) -| | |-- cbmimo1_generate_fs4.c // generates test signals (DEBUGGING) -| | |-- cbmimo1_generate_ofdm.c // generates test signals (DEBUGGING) -| | |-- cbmimo1_get_frame.c // code to grab a frame from the card -| | |-- cbmimo1_init.c // code to set up the registers of the card -| | |-- cbmimo1_pci.h -| | |-- cbmimo1_proc.c // generates the proc entries /proc/openair1/bch_stats and /proc/openair1/openair1_state -| | |-- cbmimo1_rf_cntl.c // controls the RF chipset on the card -| | |-- cbmimo1_test.c -| | |-- from_grlib_softconfig.h -| | |-- from_grlib_softregs.h -| | |-- defs.h -| | |-- extern.h -| | `-- vars.h -| |-- COMMON // common for all hardware (mainly bigphys) -| |-- EXPRESS_MIMO // contains everything related to EXPRESS MIMO -|-- DOCS // Documentation -| |-- DOXYGEN // Automaitcally generated DOXYGEN documentation in latex and html -| `-- PAPERS // papers related to openair1 -|-- EMOS // this contains everything related to Eurecom MIMO Openair Sounder (EMOS) -| |-- DOC -| |-- DUMP // program that dumps channel estimate to disk using a FIFO -| |-- GUI -| |-- MATLAB // Matlab code to process measurements -| |-- SIM // EMOS simulator (for DEBUGGING) -| `-- UTIL -|-- MAC_INTERFACE // interface with MAC layer (in openair2) |-- PHY // contains all signal processing related to physical layer (used in real-time AND simulation) General remarks: every directory contains at least defs.h (for declaration of structure and functions), vars.h (for definitions of variables), and extern.h (variables are defined only once in cbmimo1_device.c (for real-time HW operation) or a top-level simulation (in SIMULATION/xxx), if variables are needed in another file, use extern.h) @@ -57,17 +22,19 @@ General remarks: every directory contains at least defs.h (for declaration of st | |-- spec_defs_top.h | |-- types.h | `-- vars.h -|-- SCHED // schedules the different PHY functions according to the nodes role (CH=BS, MR=UE) +|-- SCHED // schedules the different PHY functions according to the nodes role | |-- defs.h | |-- extern.h -| |-- phy_procedures.c // non-LTE PHY procedures this is used in synchronized mode to schedule the slot processing | |-- phy_procedures_emos.c // non-LTE PHY procedures for EMOS | |-- phy_procedures_emos.h | |-- phy_procedures_lte_eNb.c // LTE PHY procedures for eNB (from 36-213) | |-- phy_procedures_lte_ue.c // LTE PHY procedures for UE (from 36-213) +| |-- phy_procedures_lte_common.c // LTE PHY procedures common for UE and eNB (from 36-213) +| |-- phy_mac_stub.c //MAC stub that generates channels when used in phy-test-mode +| |-- pucch_pc.c // power control for PUCCH +| |-- pusch_pc.c // power control for PUSCH +| |-- srs_pc.c // power control for SRS | |-- rt_compat.h -| |-- sched.c // contains the top level scheduler (only for CBMIMO1 HW) -| |-- sched_lte.c // same as sched.c for LTE (only for CBMIMO1 HW) | `-- vars.h |-- SIMULATION // contains simulation routines to test PHY | |-- LTE_PHY // LTE simulation testbenches for unitary simulation of transport/physical channels @@ -76,17 +43,9 @@ General remarks: every directory contains at least defs.h (for declaration of st | | |-- dlsim.c // PDSCH simulation testbench | | |-- ulsim.c // PUSCH simulation testbench | | |-- pucchsim.c // PUCCH simulation testbench -| |-- LTE_PHY_L2 // LTE simulation testbench for full system simulation (PHY,MAC,RLC,RRC,PDCP) -| `-- TOOLS | |-- RF -|-- USERSPACE_TOOLS // tools that run in userspace (not kernel) -| |-- OCTAVE -| | |-- AGILE_RF_TOOLS // octave tools to test agile RF -| | |-- CBMIMO1_TOOLS // octave interface for CBMIMO1 -| | |-- GPIB // octave tools to control signal generator (used for calibration) -| | `-- PHY_SIM // octave implementation of sync -| |-- OPENAIR_RF // tool to interface with the device driver using IOCTL -| |-- SCOPE // tool to visualize data from PHY (channel estimates, IQ plots, etc.). Communicates with kernel module using shared memory. -| `-- SENSING // tools related to sensing +| |-- ETH_TRANSPORT +| `-- TOOLS + diff --git a/openair1/SCHED/COPYING b/openair1/SCHED/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SCHED/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SCHED/Makefile.inc b/openair1/SCHED/Makefile.inc index e3fd877e5d..559d3dca32 100644 --- a/openair1/SCHED/Makefile.inc +++ b/openair1/SCHED/Makefile.inc @@ -3,3 +3,4 @@ SCHED_OBJS += $(TOP_DIR)/SCHED/phy_procedures_lte_ue.o SCHED_OBJS += $(TOP_DIR)/SCHED/phy_procedures_lte_eNb.o SCHED_OBJS += $(TOP_DIR)/SCHED/pusch_pc.o SCHED_OBJS += $(TOP_DIR)/SCHED/pucch_pc.o +SCHED_OBJS += $(TOP_DIR)/SCHED/srs_pc.o diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h index 29fb7c37e8..3c232a82b7 100644 --- a/openair1/SCHED/defs.h +++ b/openair1/SCHED/defs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* \author R. Knopp, F. Kaltenberger \company EURECOM @@ -36,7 +29,7 @@ #define __openair_SCHED_H__ #include "PHY/defs.h" - +#include "PHY_INTERFACE/defs.h" enum THREAD_INDEX { OPENAIR_THREAD_INDEX = 0, TOP_LEVEL_SCHEDULER_THREAD_INDEX, @@ -50,6 +43,7 @@ enum THREAD_INDEX { OPENAIR_THREAD_INDEX = 0, #define OPENAIR_THREAD_STACK_SIZE PTHREAD_STACK_MIN //4096 //RTL_PTHREAD_STACK_MIN*6 //#define DLC_THREAD_STACK_SIZE 4096 //DLC stack size +//#define UE_SLOT_PARALLELISATION enum openair_SCHED_STATUS { openair_SCHED_STOPPED=1, @@ -72,78 +66,20 @@ enum openair_ERROR { enum openair_SYNCH_STATUS { openair_NOT_SYNCHED=1, -#ifdef OPENAIR_LTE openair_SYNCHED, -#else - openair_SYNCHED_TO_CHSCH, - openair_SYNCHED_TO_MRSCH, -#endif openair_SCHED_EXIT }; +enum openair_HARQ_TYPE { + openair_harq_DL = 0, + openair_harq_UL, + openair_harq_RA +}; #define DAQ_AGC_ON 1 #define DAQ_AGC_OFF 0 - -typedef struct { - boolean_t is_eNB; - uint8_t mode; - uint8_t synch_source; - uint32_t slot_count; - uint32_t sched_cnt; - uint32_t synch_wait_cnt; - uint32_t sync_state; - uint32_t scheduler_interval_ns; - uint32_t last_adac_cnt; - uint8_t first_sync_call; - int32_t instance_cnt; - uint8_t one_shot_get_frame; - uint8_t do_synch; - uint8_t node_configured; // &1..basic config, &3..ue config &5..eNb config - uint8_t node_running; - uint8_t tx_test; - uint8_t mac_registered; - //uint8_t freq; - uint32_t freq; - uint32_t rx_gain_val; - uint32_t rx_gain_mode; - uint32_t tcxo_dac; - uint32_t auto_freq_correction; - int32_t freq_offset; - uint32_t tx_rx_switch_point; - uint32_t manual_timing_advance; /// 1 to override automatic timing advance - int32_t timing_advance; - uint32_t dual_tx; /// 1 for dual-antenna TX, 0 for single-antenna TX - uint32_t tdd; /// 1 for TDD mode, 0 for FDD mode - uint32_t rx_rf_mode; - uint32_t node_id; - uint32_t rach_detection_count; - uint32_t channel_vacant[4]; - uint32_t target_ue_dl_mcs; - uint32_t target_ue_ul_mcs; - uint32_t ue_ul_nb_rb; - uint32_t ue_dl_rb_alloc; - uint32_t dlsch_rate_adaptation; - uint32_t dlsch_transmission_mode; - uint32_t ulsch_allocation_mode; - uint32_t rx_total_gain_dB; - uint32_t hw_frame; - uint32_t get_frame_done; - uint32_t use_ia_receiver; -} OPENAIR_DAQ_VARS; - -#ifndef USER_MODE -int32_t openair_sched_init(void); -void openair_sched_cleanup(void); -void openair_sched_exit(char *); -void openair1_restart(void); -int32_t init_dlsch_threads(void); -void cleanup_dlsch_threads(void); -#endif //USER_MODE - -#ifdef OPENAIR_LTE /** @addtogroup _PHY_PROCEDURES_ * @{ */ @@ -160,8 +96,6 @@ void cleanup_dlsch_threads(void); void phy_procedures_eNB_lte(uint8_t subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t abstraction_flag, relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn); /*! \brief Top-level entry routine for UE procedures. Called every slot by process scheduler. In even slots, it performs RX functions from previous subframe (if required). On odd slots, it generate TX waveform for the following subframe. - @param last_slot Index of last slot (0-19) - @param next_slot Index of next_slot (0-19) @param phy_vars_ue Pointer to UE variables on which to act @param eNB_id ID of eNB on which to act @param abstraction_flag Indicator of PHY abstraction @@ -169,9 +103,9 @@ void phy_procedures_eNB_lte(uint8_t subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param *phy_vars_rn pointer to RN variables */ -void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); +void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) /*! \brief Top-level entry routine for relay node procedures when acting as eNB. This proc will make us of the existing eNB procs. @param last_slot Index of last slot (0-19) @param next_slot Index of next_slot (0-19) @@ -188,22 +122,30 @@ int phy_procedures_RN_UE_RX(unsigned char last_slot, unsigned char next_slot, re /*! \brief Scheduling for UE TX procedures in normal subframes. @param phy_vars_ue Pointer to UE variables on which to act + @param proc Pointer to RXn-TXnp4 proc information @param eNB_id Local id of eNB on which to act @param abstraction_flag Indicator of PHY abstraction @param mode calib/normal mode @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type); +void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type); /*! \brief Scheduling for UE RX procedures in normal subframes. @param last_slot Index of last slot (0-19) @param phy_vars_ue Pointer to UE variables on which to act + @param proc Pointer to RXn_TXnp4 proc information @param eNB_id Local id of eNB on which to act @param abstraction_flag Indicator of PHY abstraction @param mode calibration/debug mode @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param phy_vars_rn pointer to RN variables */ -int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); +int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); +int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id, + uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode, + relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); +#ifdef UE_SLOT_PARALLELISATION +void *UE_thread_slot1_dl_processing(void *arg); +#endif /*! \brief Scheduling for UE TX procedures in TDD S-subframes. @param phy_vars_ue Pointer to UE variables on which to act @@ -214,54 +156,88 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac void phy_procedures_UE_S_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type); /*! \brief Scheduling for UE RX procedures in TDD S-subframes. - @param last_slot Index of last slot (0-19) @param phy_vars_ue Pointer to UE variables on which to act @param eNB_id Local id of eNB on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_UE_S_RX(uint8_t last_slot,PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag, relaying_type_t r_type); +void phy_procedures_UE_S_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag, relaying_type_t r_type); /*! \brief Scheduling for eNB TX procedures in normal subframes. - @param next_slot Index of next slot (0-19) @param phy_vars_eNB Pointer to eNB variables on which to act @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying @param phy_vars_rn pointer to the RN variables + @param do_meas Do inline timing measurement */ -void phy_procedures_eNB_TX(uint8_t next_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn); +void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn,int do_meas); -/*! \brief Scheduling for eNB RX procedures in normal subframes. - @param last_slot Index of last slot (0-19) +/*! \brief Scheduling for eNB RX UE-specific procedures in normal subframes. @param phy_vars_eNB Pointer to eNB variables on which to act - @param abstraction_flag Indicator of PHY abstraction + @param proc Pointer to RXn-TXnp4 proc information @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_RX(uint8_t last_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); +void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type); /*! \brief Scheduling for eNB TX procedures in TDD S-subframes. - @param next_slot Index of next slot (0-19) @param phy_vars_eNB Pointer to eNB variables on which to act - @param abstraction_flag Indicator of PHY abstraction + @param proc Pointer to RXn-TXnp4 proc information @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_S_TX(uint8_t next_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); + +/*! \brief Scheduling for eNB RX common procedures in normal subframes. + @param phy_vars_eNB Pointer to eNB variables on which to act + @param abstraction_flag Indicator of PHY abstraction +*/ +void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc); + +/*! \brief Scheduling for eNB TX procedures in TDD S-subframes. + @param phy_vars_eNB Pointer to eNB variables on which to act + @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying +*/ + +void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB,relaying_type_t r_type); /*! \brief Scheduling for eNB RX procedures in TDD S-subframes. - @param last_slot Index of next slot (0-19) @param phy_vars_eNB Pointer to eNB variables on which to act - @param abstraction_flag Indicator of PHY abstraction @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying */ -void phy_procedures_eNB_S_RX(uint8_t last_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type); +void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,relaying_type_t r_type); + +/*! \brief Scheduling for eNB PRACH RX procedures + @param phy_vars_eNB Pointer to eNB variables on which to act + @param br_flag indicator for eMTC PRACH +*/ +#ifdef Rel14 +void prach_procedures(PHY_VARS_eNB *eNB, + int br_flag); +#else +void prach_procedures(PHY_VARS_eNB *eNB); +#endif + +/*! \brief Function to compute subframe Number(DL and S) as a function of Frame type and TDD Configuration + @param frame_parms Pointer to DL frame parameter descriptor + @returns Subframe Number (DL,S) +*/ +int subframe_num(LTE_DL_FRAME_PARMS *frame_parms); /*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index. @param frame_parms Pointer to DL frame parameter descriptor @param subframe Subframe index @returns Subframe type (DL,UL,S) */ + + lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe); + +/*! \brief Function to compute which type of DCIs to detect in the given subframe + @param frame_parms Pointer to DL frame parameter descriptor + @param subframe Subframe index + @returns DCI detetion mode type (no DCIs, uplink DCIs, downlink DCIs, both uplink and downlink DCIs) + */ +dci_detect_mode_t dci_detect_mode_select(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe); + /*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index. Same as subframe_select, except that it uses the Mod_id and is provided as a service to the MAC scheduler. @param Mod_id Index of eNB @param CC_id Component Carrier Index @@ -348,7 +324,22 @@ uint8_t pdcch_alloc2ul_subframe(LTE_DL_FRAME_PARMS *frame_parms,uint8_t n); @param o_ACK Pointer to ACK/NAK payload for PUCCH/PUSCH @returns status indicator for PUCCH/PUSCH transmission */ -uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms,harq_status_t *harq_ack,uint8_t subframe,uint8_t *o_ACK); +uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms,harq_status_t *harq_ack,uint8_t subframe_tx,uint8_t subframe_rx,uint8_t *o_ACK, uint8_t cw_idx); + +/*! \brief Reset ACK/NACK information + @param frame_parms Pointer to DL frame parameter descriptor + @param harq_ack Pointer to dlsch_ue harq_ack status descriptor + @param subframe Subframe for UE transmission (n in 36.213) + @param o_ACK Pointer to ACK/NAK payload for PUCCH/PUSCH + @returns status indicator for PUCCH/PUSCH transmission +*/ +uint8_t reset_ack(LTE_DL_FRAME_PARMS *frame_parms, + harq_status_t *harq_ack, + unsigned char subframe_tx, + unsigned char subframe_rx, + unsigned char *o_ACK, + uint8_t *pN_bundled, + uint8_t cw_idx); /*! \brief Compute UL ACK subframe from DL subframe. This is used to retrieve corresponding DLSCH HARQ pid at eNB upon reception of ACK/NAK information on PUCCH/PUSCH. Derived from Table 10.1-1 in 36.213 (p. 69 in version 8.6) @param frame_parms Pointer to DL frame parameter descriptor @@ -367,22 +358,22 @@ uint8_t ul_ACK_subframe2_M(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subfram /*! \brief Indicates the SR TXOp in current subframe. Implements Table 10.1-5 from 36.213. @param phy_vars_ue Pointer to UE variables + @param proc Pointer to RXn_TXnp4 thread context @param eNB_id ID of eNB which is to receive the SR - @param subframe index of next subframe @returns 1 if TXOp is active. */ -uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); +uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id); /*! \brief Indicates the SR TXOp in current subframe for eNB and particular UE index. Implements Table 10.1-5 from 36.213. @param phy_vars_eNB Pointer to eNB variables @param UE_id ID of UE which may be issuing the SR - @param subframe index of last subframe @returns 1 if TXOp is active. */ -uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t subframe); +uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id); /*! \brief Gives the UL subframe corresponding to a PDDCH order in subframe n @param frame_parms Pointer to DL frame parameters + @param proc Pointer to RXn-TXnp4 proc information @param n subframe of PDCCH @returns UL subframe corresponding to pdcch order */ @@ -400,12 +391,14 @@ uint32_t pdcch_alloc2ul_frame(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame, ui uint16_t get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1); -int8_t find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB); -int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB); -int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rnti); +int8_t find_ue_dlsch(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB); +int8_t find_ue_ulsch(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB); + +//int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB); +//int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rnti); void process_timing_advance(module_id_t Mod_id,uint8_t CC_id,int16_t timing_advance); -void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,uint16_t timing_advance); +void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint16_t timing_advance); unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb); @@ -415,22 +408,25 @@ void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index); subframe n-4 which is acknowledged in subframe n (for FDD) according to n1_pucch = Ncce + N1_pucch. For TDD, this routine computes the complex procedure described in Section 10.1 of 36.213 (through tables 10.1-1,10.1-2) @param phy_vars_ue Pointer to UE variables +@param proc Pointer to RXn-TXnp4 proc information +@param harq_ack Pointer to dlsch_ue harq_ack status descriptor @param eNB_id Index of eNB -@param sched_subframe Index of subframe where procedures were scheduled @param b Pointer to PUCCH payload (b[0],b[1]) @param SR 1 means there's a positive SR in parallel to ACK/NAK @returns n1_pucch */ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, + UE_rxtx_proc_t *proc, + harq_status_t *harq_ack, uint8_t eNB_id, - uint8_t sched_subframe, uint8_t *b, uint8_t SR); /*! \brief This function retrives the resource (n1_pucch) corresponding to a PDSCH transmission in subframe n-4 which is acknowledged in subframe n (for FDD) according to n1_pucch = Ncce + N1_pucch. For TDD, this routine computes the procedure described in Section 10.1 of 36.213 (through tables 10.1-1,10.1-2) -@param phy_vars_eNB Pointer to UE variables +@param phy_vars_eNB Pointer to eNB variables +@param proc Pointer to RXn-TXnp4 proc information @param eNB_id Index of eNB @param subframe Index of subframe @param b Pointer to PUCCH payload (b[0],b[1]) @@ -440,8 +436,8 @@ TDD, this routine computes the procedure described in Section 10.1 of 36.213 (th @param n1_pucch3 Pointer to n1_pucch3 */ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, + eNB_rxtx_proc_t *proc, uint8_t UE_id, - uint8_t subframe, int16_t *n1_pucch0, int16_t *n1_pucch1, int16_t *n1_pucch2, @@ -450,16 +446,16 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, /*! \brief This function retrieves the harq_pid of the corresponding DLSCH process and updates the error statistics of the DLSCH based on the received ACK info from UE along with the round index. It also performs the fine-grain rate-adaptation based on the error statistics derived from the ACK/NAK process. @param UE_id Local UE index on which to act - @param subframe Index of subframe @param phy_vars_eNB Pointer to eNB variables on which to act + @param proc Pointer to RXn-TXnp4 proc information @param pusch_flag Indication that feedback came from PUSCH @param pucch_payload Resulting payload from pucch @param pucch_sel Selection of n1_pucch0 or n1_pucch1 (TDD specific) @param SR_payload Indication of SR presence (TDD specific) */ void process_HARQ_feedback(uint8_t UE_id, - uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB, + eNB_rxtx_proc_t *proc, uint8_t pusch_flag, uint8_t *pucch_payload, uint8_t pucch_sel, @@ -475,36 +471,40 @@ UE_MODE_t get_ue_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index); /*! \brief This function implements the power control mechanism for PUCCH from 36.213. @param phy_vars_ue PHY variables - @param subframe Index of subframe + @param proc Pointer to proc descriptor @param eNB_id Index of eNB @param pucch_fmt Format of PUCCH that is being transmitted @returns Transmit power */ -int8_t pucch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt); +int16_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt); /*! \brief This function implements the power control mechanism for PUCCH from 36.213. @param phy_vars_ue PHY variables - @param subframe Index of subframe + @param proc Pointer to proc descriptor @param eNB_id Index of eNB @param j index of type of PUSCH (SPS, Normal, Msg3) @returns Transmit power */ -void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag); +void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag); + +/*! \brief This function implements the power control mechanism for SRS from 36.213. + @param phy_vars_ue PHY variables + @param proc Pointer to proc descriptor + @param eNB_id Index of eNB + @param j index of type of PUSCH (SPS, Normal, Msg3) + @returns Transmit power + */ +void srs_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t *pnb_rb_srs, uint8_t abstraction_flag); + +void get_cqipmiri_params(PHY_VARS_UE *ue,uint8_t eNB_id); int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id, uint8_t eNB_index); -#ifdef LOCALIZATION -/*! \brief This function collects eNB_UE stats and aggregate them in lists for localization - @param phy_vars_ue PHY variables - @param UE_id Index of UE - @param frame Index of frame - @param subframe Index of subframe - @param UE_tx_power_dB estimated UE Tx power - @returns -1 if updated list, 0 if calculated median - */ -double aggregate_eNB_UE_localization_stats(PHY_VARS_eNB *phy_vars_eNB, int8_t UE_id, frame_t frameP, sub_frame_t subframeP, int32_t UE_tx_power_dB); -#endif -LTE_eNB_UE_stats* get_eNB_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti); +void schedule_response(Sched_Rsp_t *Sched_INFO); + +LTE_eNB_UE_stats* get_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti); + + LTE_DL_FRAME_PARMS *get_lte_frame_parms(module_id_t Mod_id, uint8_t CC_id); @@ -521,17 +521,19 @@ int16_t get_target_pucch_rx_power(module_id_t module_idP, uint8_t CC_id); int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,int frame, uint8_t subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag); -void ulsch_decoding_procedures(unsigned char last_slot, unsigned int i, PHY_VARS_eNB *phy_vars_eNB, unsigned char abstraction_flag); +void dump_dlsch(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid); +void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe); +void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe); -void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid); -void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); -void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe); +void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe, unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid); + + +int is_srs_occasion_common(LTE_DL_FRAME_PARMS *frame_parms,int frame_tx,int subframe_tx); + +void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset); /*@}*/ -#endif //OPENAIR_LTE - -extern int slot_irq_handler(int irq, void *cookie); #endif diff --git a/openair1/SCHED/extern.h b/openair1/SCHED/extern.h index dd3892a290..b1e8df67ef 100644 --- a/openair1/SCHED/extern.h +++ b/openair1/SCHED/extern.h @@ -1,70 +1,29 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*!\brief SCHED external variables */ #ifndef __SCHED_EXTERN_H__ #define __SCHED_EXTERN_H__ -#ifndef USER_MODE -#define __NO_VERSION__ - - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - - - - -#ifdef RTAI_ENABLED -#include -//#include -#include -#include -#include -//#include "rt_compat.h" - -#else -#include -#endif - -#endif /* USER_MODE */ - #include "defs.h" //#include "dlc_engine.h" @@ -75,15 +34,8 @@ extern int openair_sched_status; extern int synch_wait_cnt; -extern OPENAIR_DAQ_VARS openair_daq_vars; extern int16_t hundred_times_delta_TF[100]; extern uint16_t hundred_times_log10_NPRB[100]; -/* -#ifdef EMOS -extern fifo_dump_emos_UE emos_dump_UE; -extern fifo_dump_emos_eNB emos_dump_eNB; -#endif -*/ #endif /*__SCHED_EXTERN_H__ */ diff --git a/openair1/SCHED/fapi_l1.c b/openair1/SCHED/fapi_l1.c new file mode 100644 index 0000000000..7c6ded9ba9 --- /dev/null +++ b/openair1/SCHED/fapi_l1.c @@ -0,0 +1,826 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file fapi_l1.c + * \brief functions for FAPI L1 interface + * \author R. Knopp + * \date 2017 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr + * \note + * \warning + */ + +#include "PHY/defs.h" +#include "PHY/extern.h" +#include "SCHED/defs.h" +#include "SCHED/extern.h" +#include "nfapi_interface.h" +#include "fapi_l1.h" + +int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req); +int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req); +int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req); +int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req); + +extern uint8_t nfapi_mode; + + +void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB, + int frame, int subframe, + eNB_rxtx_proc_t *proc, + nfapi_dl_config_request_pdu_t *dl_config_pdu) +{ + int idx = subframe&1; + LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[idx]; + nfapi_dl_config_dci_dl_pdu *pdu = &dl_config_pdu->dci_dl_pdu; + + LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populating pdcch_vars->dci_alloc[%d] proc:subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",frame,subframe, pdcch_vars->num_dci, proc->subframe_tx, idx, pdcch_vars->num_dci); + + // copy dci configuration into eNB structure + fill_dci_and_dlsch(eNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],pdu); + + LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populated pdcch_vars->dci_alloc[%d] proc:subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",proc->frame_tx,proc->subframe_tx, pdcch_vars->num_dci, proc->subframe_tx, idx, pdcch_vars->num_dci); +} + +#ifdef Rel14 +void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + nfapi_dl_config_request_pdu_t *dl_config_pdu) +{ + int idx = proc->subframe_tx&1; + LTE_eNB_MPDCCH *mpdcch_vars = &eNB->mpdcch_vars[idx]; + nfapi_dl_config_mpdcch_pdu *pdu = &dl_config_pdu->mpdcch_pdu; + + LOG_D(PHY,"Frame %d, Subframe %d: MDCI processing\n",proc->frame_tx,proc->subframe_tx); + + // copy dci configuration into eNB structure + fill_mdci_and_dlsch(eNB,proc,&mpdcch_vars->mdci_alloc[mpdcch_vars->num_dci],pdu); +} +#endif + +void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc, + nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu) +{ + int idx = subframe&1; + LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[idx]; + + //LOG_D(PHY,"%s() SFN/SF:%04d%d Before num_dci:%d\n", __FUNCTION__,frame,subframe,pdcch_vars->num_dci); + + // copy dci configuration in to eNB structure + fill_dci0(eNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci], &hi_dci0_config_pdu->dci_pdu); +} + +void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc, + nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu) +{ + LTE_eNB_PHICH *phich = &eNB->phich_vars[subframe&1]; + + // copy dci configuration in to eNB structure + LOG_D(PHY,"Received HI PDU with value %d (rbstart %d,cshift %d)\n", + hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.hi_value, + hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.resource_block_start, + hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms); + + // DJP - TODO FIXME - transmission power ignored + phich->config[phich->num_hi].hi = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.hi_value; + phich->config[phich->num_hi].first_rb = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.resource_block_start; + phich->config[phich->num_hi].n_DMRS = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms; + phich->num_hi++; + AssertFatal(phich->num_hi<32,"Maximum number of phich reached in subframe\n"); +} + +void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, + nfapi_dl_config_request_pdu_t *dl_config_pdu, + uint8_t *sdu) +{ + nfapi_dl_config_bch_pdu_rel8_t *rel8 = &dl_config_pdu->bch_pdu.bch_pdu_rel8; + + AssertFatal(rel8->length == 3, "BCH PDU has length %d != 3\n",rel8->length); + + //LOG_D(PHY,"bch_pdu: %x,%x,%x\n",sdu[0],sdu[1],sdu[2]); + eNB->pbch_pdu[0] = sdu[2]; + eNB->pbch_pdu[1] = sdu[1]; + eNB->pbch_pdu[2] = sdu[0]; + + // adjust transmit amplitude here based on NFAPI info +} + +#ifdef Rel14 +extern uint32_t localRIV2alloc_LUT6[32]; +extern uint32_t localRIV2alloc_LUT25[512]; +extern uint32_t localRIV2alloc_LUT50_0[1600]; +extern uint32_t localRIV2alloc_LUT50_1[1600]; +extern uint32_t localRIV2alloc_LUT100_0[6000]; +extern uint32_t localRIV2alloc_LUT100_1[6000]; +extern uint32_t localRIV2alloc_LUT100_2[6000]; +extern uint32_t localRIV2alloc_LUT100_3[6000]; +#endif + +void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc, + nfapi_dl_config_request_pdu_t *dl_config_pdu, + uint8_t codeword_index, + uint8_t *sdu) +{ + nfapi_dl_config_dlsch_pdu_rel8_t *rel8 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8; +#ifndef Rel8 + nfapi_dl_config_dlsch_pdu_rel10_t *rel10 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10; +#endif +#ifdef Rel14 + nfapi_dl_config_dlsch_pdu_rel13_t *rel13 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13; +#endif + LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL; + LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL; + int UE_id; + int harq_pid; + + UE_id = find_dlsch(rel8->rnti,eNB,SEARCH_EXIST_OR_FREE); + AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n"); + AssertFatal(UE_id= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX); + + dlsch0 = eNB->dlsch[UE_id][0]; + dlsch1 = eNB->dlsch[UE_id][1]; + +#ifdef Rel14 + if ((rel13->pdsch_payload_type < 2) && (rel13->ue_type>0)) dlsch0->harq_ids[subframe] = 0; +#endif + + harq_pid = dlsch0->harq_ids[subframe]; + AssertFatal((harq_pid>=0) && (harq_pid<8),"harq_pid %d not in 0...7 frame:%d subframe:%d subframe(TX):%d rnti:%x UE_id:%d dlsch0[harq_ids:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d]\n", + harq_pid, + frame,subframe, + proc->subframe_tx,rel8->rnti,UE_id, + dlsch0->harq_ids[0], + dlsch0->harq_ids[1], + dlsch0->harq_ids[2], + dlsch0->harq_ids[3], + dlsch0->harq_ids[4], + dlsch0->harq_ids[5], + dlsch0->harq_ids[6], + dlsch0->harq_ids[7], + dlsch0->harq_ids[8], + dlsch0->harq_ids[9] + ); + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + AssertFatal(dlsch0_harq!=NULL,"dlsch_harq is null\n"); + + // compute DL power control parameters + eNB->pdsch_config_dedicated[UE_id].p_a = rel8->pa; + + if (dlsch0->active){ + computeRhoA_eNB(&eNB->pdsch_config_dedicated[UE_id], dlsch0,dlsch0_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB); + computeRhoB_eNB(&eNB->pdsch_config_dedicated[UE_id],&(eNB->frame_parms.pdsch_config_common),eNB->frame_parms.nb_antenna_ports_eNB,dlsch0,dlsch0_harq->dl_power_off); + } + if (dlsch1->active){ + computeRhoA_eNB(&eNB->pdsch_config_dedicated[UE_id], dlsch1,dlsch1_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB); + computeRhoB_eNB(&eNB->pdsch_config_dedicated[UE_id],&(eNB->frame_parms.pdsch_config_common),eNB->frame_parms.nb_antenna_ports_eNB,dlsch1,dlsch1_harq->dl_power_off); + } + + dlsch0_harq->pdsch_start = eNB->pdcch_vars[subframe & 1].num_pdcch_symbols; + + if (dlsch0_harq->round==0) { //get pointer to SDU if this a new SDU + AssertFatal(sdu!=NULL,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d dlsch0_harq[round:%d SFN/SF:%d%d pdu:%p mcs:%d ndi:%d pdschstart:%d]\n", + frame,subframe, + proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid, + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index,dlsch0_harq->round,dlsch0_harq->frame,dlsch0_harq->subframe,dlsch0_harq->pdu,dlsch0_harq->mcs,dlsch0_harq->ndi,dlsch0_harq->pdsch_start); + if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d, subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d\n", + frame,subframe,proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid); + if (codeword_index == 0) dlsch0_harq->pdu = sdu; + else dlsch1_harq->pdu = sdu; + } + else { + if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d, subframe %d]: programming dlsch for round %d, rnti %x, UE_id %d, harq_pid %d\n", + frame,subframe,proc->frame_tx,proc->subframe_tx,dlsch0_harq->round, + rel8->rnti,UE_id,harq_pid); + } + +#ifdef Rel14 + dlsch0->sib1_br_flag=0; + + if ((rel13->pdsch_payload_type <2) && (rel13->ue_type>0)) { // this is a BR/CE UE and SIB1-BR/SI-BR + dlsch0->rnti = 0xFFFF; + dlsch0->Kmimo = 1; + dlsch0->Mdlharq = 4; + dlsch0->Nsoft = 25344; + + if (rel13->pdsch_payload_type == 0) dlsch0->sib1_br_flag=1; + + // configure PDSCH + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rel8->resource_block_coding]; + break; + case 15: + AssertFatal(1==0,"15 PRBs not supported for now\n"); + break; + case 25: + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rel8->resource_block_coding]; + break; + case 50: + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rel8->resource_block_coding]; + dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rel8->resource_block_coding]; + break; + case 75: + AssertFatal(1==0,"75 PRBs not supported for now\n"); + break; + case 100: + dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rel8->resource_block_coding]; + dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rel8->resource_block_coding]; + dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rel8->resource_block_coding]; + dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rel8->resource_block_coding]; + } + + dlsch0->active = 1; + + dlsch0_harq->nb_rb = 6; + dlsch0_harq->vrb_type = LOCALIZED; + dlsch0_harq->rvidx = rel8->redundancy_version; + dlsch0_harq->Nl = 1; + dlsch0_harq->mimo_mode = (eNB->frame_parms.nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI; + dlsch0_harq->dl_power_off = 1; + dlsch0_harq->round = 0; + dlsch0_harq->status = ACTIVE; + dlsch0_harq->TBS = rel8->length<<3; + dlsch0_harq->Qm = rel8->modulation; + dlsch0_harq->codeword = 0; + dlsch0_harq->pdsch_start = rel10->pdsch_start; + } +#endif + dlsch0->i0 = rel13->initial_transmission_sf_io; + + LOG_D(PHY,"dlsch->i0:%04x dlsch0_harq[pdsch_start:%d nb_rb:%d vrb_type:%d rvidx:%d Nl:%d mimo_mode:%d dl_power_off:%d round:%d status:%d TBS:%d Qm:%d codeword:%d rb_alloc:%d] rel8[length:%d]\n", + dlsch0->i0, + dlsch0_harq->pdsch_start, dlsch0_harq->nb_rb, dlsch0_harq->vrb_type, dlsch0_harq->rvidx, dlsch0_harq->Nl, dlsch0_harq->mimo_mode, dlsch0_harq->dl_power_off, dlsch0_harq->round, dlsch0_harq->status, dlsch0_harq->TBS, dlsch0_harq->Qm, dlsch0_harq->codeword, dlsch0_harq->rb_alloc[0], + rel8->length + ); +} + +uint16_t to_beta_offset_harqack[16]={16,20,25,32,40,50,64,80,101,127,160,248,400,640,1008,8}; + +void handle_ulsch_harq_pdu( + PHY_VARS_eNB *eNB, + int UE_id, + nfapi_ul_config_request_pdu_t *ul_config_pdu, + nfapi_ul_config_ulsch_harq_information *harq_information, + uint16_t frame, + uint8_t subframe) +{ + nfapi_ul_config_ulsch_pdu_rel8_t *rel8 = &ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8; + + LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id]; + LTE_UL_eNB_HARQ_t *ulsch_harq; + + int harq_pid = rel8->harq_process_number; + ulsch_harq = ulsch->harq_processes[harq_pid]; + ulsch_harq->frame = frame; + ulsch_harq->subframe = subframe; + ulsch_harq->O_ACK = harq_information->harq_information_rel10.harq_size; + ulsch->beta_offset_harqack_times8 = to_beta_offset_harqack[harq_information->harq_information_rel10.delta_offset_harq]; +} + +uint16_t to_beta_offset_ri[16]={9,13,16,20,25,32,40,50,64,80,101,127,160,0,0,0}; +uint16_t to_beta_offset_cqi[16]={0,0,9,10,11,13,14,16,18,20,23,25,28,32,40,50}; + +void handle_ulsch_cqi_ri_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe) +{ + nfapi_ul_config_cqi_ri_information_rel9_t *rel9 = &ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9; + + LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id]; + int harq_pid = ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.harq_process_number; + LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid]; + + ulsch_harq->frame = frame; + ulsch_harq->subframe = subframe; + ulsch_harq->O_RI = rel9->aperiodic_cqi_pmi_ri_report.cc[0].ri_size; + ulsch_harq->Or1 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0]; + if (ulsch_harq->O_RI>1) ulsch_harq->Or2 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[1]; + ulsch->beta_offset_ri_times8 = to_beta_offset_ri[rel9->delta_offset_ri]; + ulsch->beta_offset_cqi_times8 = to_beta_offset_cqi[rel9->delta_offset_cqi]; + LOG_D(PHY,"Filling ulsch_cqi_ri information for frame %d, subframe %d : O_RI %d, Or1 %d, beta_offset_cqi_times8 %d (%d)\n", + frame,subframe,ulsch_harq->O_RI,ulsch_harq->Or1,ulsch->beta_offset_cqi_times8, + rel9->delta_offset_cqi); +} + +void handle_ulsch_cqi_harq_ri_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe) +{ + nfapi_ul_config_cqi_ri_information_rel9_t *rel9 = &ul_config_pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information.cqi_ri_information_rel9; + + LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id]; + int harq_pid = ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.harq_process_number; + LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid]; + nfapi_ul_config_ulsch_harq_information *harq_information = &ul_config_pdu->ulsch_cqi_harq_ri_pdu.harq_information; + + ulsch_harq->frame = frame; + ulsch_harq->subframe = subframe; + ulsch_harq->O_RI = rel9->aperiodic_cqi_pmi_ri_report.cc[0].ri_size; + ulsch_harq->Or1 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0]; + ulsch_harq->O_ACK = harq_information->harq_information_rel10.harq_size; + + if (ulsch_harq->O_RI>1) ulsch_harq->Or2 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[1]; + + ulsch->beta_offset_harqack_times8 = to_beta_offset_harqack[harq_information->harq_information_rel10.delta_offset_harq]; + ulsch->beta_offset_ri_times8 = to_beta_offset_ri[rel9->delta_offset_ri]; + ulsch->beta_offset_cqi_times8 = to_beta_offset_cqi[rel9->delta_offset_cqi]; +} + +void handle_uci_harq_information(PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci,nfapi_ul_config_harq_information *harq_information) +{ + if (eNB->frame_parms.frame_type == FDD) { + uci->num_pucch_resources = harq_information->harq_information_rel9_fdd.number_of_pucch_resources; + + LOG_D(PHY,"Programming UCI HARQ mode %d : size %d in (%d,%d)\n", + harq_information->harq_information_rel9_fdd.ack_nack_mode, + harq_information->harq_information_rel9_fdd.harq_size, + uci->frame,uci->subframe); + + if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 0) && + (harq_information->harq_information_rel9_fdd.harq_size == 1)) { + uci->pucch_fmt = pucch_format1a; + uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0; + uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0; + } + else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 0) && + (harq_information->harq_information_rel9_fdd.harq_size == 2)) { + uci->pucch_fmt = pucch_format1b; + uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0; + uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0; + } + else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) && + (harq_information->harq_information_rel9_fdd.harq_size == 2)) { + uci->pucch_fmt = pucch_format1b_csA2; + uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0; + uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0; + uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1; + uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1; + } + else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) && + (harq_information->harq_information_rel9_fdd.harq_size == 3)) { + uci->pucch_fmt = pucch_format1b_csA3; + uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0; + uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0; + uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1; + uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1; + uci->n_pucch_1[2][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_2; + uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2; + } + else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) && + (harq_information->harq_information_rel9_fdd.harq_size == 4)) { + uci->pucch_fmt = pucch_format1b_csA4; + uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0; + uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0; + uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1; + uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1; + uci->n_pucch_1[2][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_2; + uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2; + } + else if (harq_information->harq_information_rel9_fdd.ack_nack_mode == 2) { + uci->pucch_fmt = pucch_format3; + uci->n_pucch_3[0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0; + uci->n_pucch_3[1] = harq_information->harq_information_rel11.n_pucch_2_0; + } + else AssertFatal(1==0,"unsupported HARQ mode %d\n",harq_information->harq_information_rel9_fdd.ack_nack_mode); + } + else { // TDD + uci->num_pucch_resources = harq_information->harq_information_rel10_tdd.number_of_pucch_resources; + + if (harq_information->harq_information_rel10_tdd.ack_nack_mode == 0) {//bundling + + uci->pucch_fmt = harq_information->harq_information_rel10_tdd.harq_size==1 ? pucch_format1a : pucch_format1b; + uci->tdd_bundling = 1; + uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0; + uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0; + } + else if ((harq_information->harq_information_rel10_tdd.ack_nack_mode == 1) && //multiplexing + (uci->num_pucch_resources == 1)) { + uci->pucch_fmt = harq_information->harq_information_rel10_tdd.harq_size==1 ? pucch_format1a : pucch_format1b; + uci->tdd_bundling = 0; + uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0; + uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0; + } + else if ((harq_information->harq_information_rel10_tdd.ack_nack_mode == 1) && //multiplexing M>1 + (uci->num_pucch_resources > 1)) { + uci->pucch_fmt = pucch_format1b; + uci->tdd_bundling = 0; + uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0; + uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0; + uci->n_pucch_1[1][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_1; + uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1; + uci->n_pucch_1[2][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_2; + uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2; + uci->n_pucch_1[3][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_3; + uci->n_pucch_1[3][1] = harq_information->harq_information_rel11.n_pucch_2_3; + } + else if (harq_information->harq_information_rel10_tdd.ack_nack_mode == 2) { + uci->pucch_fmt = pucch_format3; + uci->n_pucch_3[0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0; + uci->n_pucch_3[1] = harq_information->harq_information_rel11.n_pucch_2_0; + } + else AssertFatal(1==0,"unsupported HARQ mode %d\n",harq_information->harq_information_rel10_tdd.ack_nack_mode); + } +} + +void handle_uci_sr_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active) +{ + LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id]; + + uci->frame = frame; + uci->subframe = subframe; + uci->rnti = ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti; + uci->type = SR; + uci->pucch_fmt = pucch_format1; + uci->num_antenna_ports = 1; + uci->num_pucch_resources = 1; + uci->n_pucch_1_0_sr[0] = ul_config_pdu->uci_sr_pdu.sr_information.sr_information_rel8.pucch_index; + uci->srs_active = srs_active; + uci->active = 1; + + LOG_D(PHY,"Programming UCI SR rnti %x, pucch1_0 %d for (%d,%d)\n", + uci->rnti,uci->n_pucch_1_0_sr[0],frame,subframe); +} + +void handle_uci_sr_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active) +{ + LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id]; + + uci->frame = frame; + uci->subframe = subframe; + uci->rnti = ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel8.rnti; + uci->type = HARQ_SR; + uci->num_antenna_ports = 1; + uci->num_pucch_resources = 1; + uci->n_pucch_1_0_sr[0] = ul_config_pdu->uci_sr_harq_pdu.sr_information.sr_information_rel8.pucch_index; + uci->srs_active = srs_active; + uci->active = 1; + + handle_uci_harq_information(eNB,uci,&ul_config_pdu->uci_sr_harq_pdu.harq_information); +} + +void handle_uci_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active) +{ + LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id]; + + LOG_D(PHY,"Frame %d, Subframe %d: Programming UCI_HARQ process (type %d)\n",frame,subframe,HARQ); + uci->frame = frame; + uci->subframe = subframe; + uci->rnti = ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti; + uci->type = HARQ; + uci->srs_active = srs_active; + uci->num_antenna_ports = ul_config_pdu->uci_harq_pdu.harq_information.harq_information_rel11.num_ant_ports; + + handle_uci_harq_information(eNB,uci,&ul_config_pdu->uci_harq_pdu.harq_information); + + uci->active=1; +} + +void handle_srs_pdu(PHY_VARS_eNB *eNB,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe) +{ + int i; + + for (i=0;isoundingrs_ul_config_dedicated[i].active==1) continue; + + eNB->soundingrs_ul_config_dedicated[i].active = 1; + eNB->soundingrs_ul_config_dedicated[i].frame = frame; + eNB->soundingrs_ul_config_dedicated[i].subframe = subframe; + eNB->soundingrs_ul_config_dedicated[i].rnti = ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti; + eNB->soundingrs_ul_config_dedicated[i].srs_Bandwidth = ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_bandwidth; + eNB->soundingrs_ul_config_dedicated[i].srs_HoppingBandwidth = ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth; + eNB->soundingrs_ul_config_dedicated[i].freqDomainPosition = ul_config_pdu->srs_pdu.srs_pdu_rel8.frequency_domain_position; + eNB->soundingrs_ul_config_dedicated[i].transmissionComb = ul_config_pdu->srs_pdu.srs_pdu_rel8.transmission_comb; + eNB->soundingrs_ul_config_dedicated[i].srs_ConfigIndex = ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs; + eNB->soundingrs_ul_config_dedicated[i].cyclicShift = ul_config_pdu->srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift; + break; + } + AssertFatal(iulsch_pdu.ulsch_pdu_rel8; + + int8_t UE_id; + + // check if we have received a dci for this ue and ulsch descriptor is configured + + if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) { + AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0, + "No existing UE ULSCH for rnti %x\n",rel8->rnti); + //LOG_D(PHY,"Applying UL config for UE %d, rnti %x for frame %d, subframe %d\n", UE_id,rel8->rnti,frame,subframe); + + fill_ulsch(eNB,&ul_config_pdu->ulsch_pdu,frame,subframe); + + } + else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE) { + AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0, + "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti); + + fill_ulsch(eNB,&ul_config_pdu->ulsch_harq_pdu.ulsch_pdu,frame,subframe); + handle_ulsch_harq_pdu(eNB, UE_id, ul_config_pdu, + &ul_config_pdu->ulsch_harq_pdu.harq_information, frame, subframe); + + } + else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) { + AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti, + eNB,SEARCH_EXIST_OR_FREE))>=0, + "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti); + fill_ulsch(eNB,&ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu,frame,subframe); + handle_ulsch_cqi_ri_pdu(eNB,UE_id,ul_config_pdu,frame,subframe); + + } + else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE) { + AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti, + eNB,SEARCH_EXIST_OR_FREE))>=0, + "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti); + fill_ulsch(eNB,&ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu,frame,subframe); + handle_ulsch_cqi_harq_ri_pdu(eNB,UE_id,ul_config_pdu,frame,subframe); + handle_ulsch_harq_pdu(eNB, UE_id, ul_config_pdu, + &ul_config_pdu->ulsch_cqi_harq_ri_pdu.harq_information, frame, subframe); + } + else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) { + AssertFatal((UE_id = find_uci(ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti, + proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0, + "No available UE UCI for rnti %x\n",ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti); + handle_uci_harq_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present); + } + else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE) { + AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE not handled yet\n"); + } + else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE) { + AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE not handled yet\n"); + } + else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE) { + AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE not handled yet\n"); + } + else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE) { + AssertFatal((UE_id = find_uci(ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti, + proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0, + "No available UE UCI for rnti %x\n",ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti); + handle_uci_sr_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present); + + } + else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE) { + AssertFatal((UE_id = find_uci(rel8->rnti,proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0, + "No available UE UCI for rnti %x\n",ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel8.rnti); + handle_uci_sr_harq_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present); + } + else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_SRS_PDU_TYPE) { + handle_srs_pdu(eNB,ul_config_pdu,frame,subframe); + } +} + +void schedule_response(Sched_Rsp_t *Sched_INFO) +{ + PHY_VARS_eNB *eNB; + eNB_rxtx_proc_t *proc; + // copy data from L2 interface into L1 structures + module_id_t Mod_id = Sched_INFO->module_id; + uint8_t CC_id = Sched_INFO->CC_id; + nfapi_dl_config_request_t *DL_req = Sched_INFO->DL_req; + nfapi_hi_dci0_request_t *HI_DCI0_req = Sched_INFO->HI_DCI0_req; + nfapi_ul_config_request_t *UL_req = Sched_INFO->UL_req; + nfapi_tx_request_t *TX_req = Sched_INFO->TX_req; + frame_t frame = Sched_INFO->frame; + sub_frame_t subframe = Sched_INFO->subframe; + LTE_DL_FRAME_PARMS *fp; + uint8_t ul_subframe; + int ul_frame; + int harq_pid; + LTE_UL_eNB_HARQ_t *ulsch_harq; + + AssertFatal(RC.eNB!=NULL,"RC.eNB is null\n"); + AssertFatal(RC.eNB[Mod_id]!=NULL,"RC.eNB[%d] is null\n",Mod_id); + AssertFatal(RC.eNB[Mod_id][CC_id]!=NULL,"RC.eNB[%d][%d] is null\n",Mod_id,CC_id); + + eNB = RC.eNB[Mod_id][CC_id]; + fp = &eNB->frame_parms; + proc = &eNB->proc.proc_rxtx[0]; + ul_subframe = pdcch_alloc2ul_subframe(fp,subframe); + ul_frame = pdcch_alloc2ul_frame(fp,frame,subframe); + + // DJP - subframe assert will fail - not sure why yet + // DJP - AssertFatal(proc->subframe_tx == subframe, "Current subframe %d != NFAPI subframe %d\n",proc->subframe_tx,subframe); + // DJP - AssertFatal(proc->subframe_tx == subframe, "Current frame %d != NFAPI frame %d\n",proc->frame_tx,frame); + + uint8_t number_pdcch_ofdm_symbols = DL_req->dl_config_request_body.number_pdcch_ofdm_symbols; + + uint8_t number_dl_pdu = DL_req->dl_config_request_body.number_pdu; + uint8_t number_hi_dci0_pdu = HI_DCI0_req->hi_dci0_request_body.number_of_dci+HI_DCI0_req->hi_dci0_request_body.number_of_hi; + uint8_t number_ul_pdu = UL_req!=NULL ? UL_req->ul_config_request_body.number_of_pdus : 0; + + nfapi_dl_config_request_pdu_t *dl_config_pdu; + nfapi_hi_dci0_request_pdu_t *hi_dci0_req_pdu; + nfapi_ul_config_request_pdu_t *ul_config_pdu; + + int i; + + eNB->pdcch_vars[subframe&1].num_pdcch_symbols = number_pdcch_ofdm_symbols; + eNB->pdcch_vars[subframe&1].num_dci = 0; + eNB->phich_vars[subframe&1].num_hi = 0; + + LOG_D(PHY,"NFAPI: Sched_INFO:SFN/SF:%04d%d DL_req:SFN/SF:%04d%d:dl_pdu:%d tx_req:SFN/SF:%04d%d:pdus:%d hi_dci0:SFN/SF:%04d%d:pdus:%d ul_cfg:SFN/SF:%04d%d:pdus:%d num_pdcch_symbols:%d\n", + frame,subframe, + NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),number_dl_pdu, + NFAPI_SFNSF2SFN(TX_req->sfn_sf),NFAPI_SFNSF2SF(TX_req->sfn_sf),TX_req->tx_request_body.number_of_pdus, + NFAPI_SFNSF2SFN(HI_DCI0_req->sfn_sf),NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf),number_hi_dci0_pdu, + NFAPI_SFNSF2SFN(UL_req->sfn_sf),NFAPI_SFNSF2SF(UL_req->sfn_sf),number_ul_pdu, + eNB->pdcch_vars[subframe&1].num_pdcch_symbols); + + int do_oai =0; + int dont_send =0; + + if (ul_subframe<10) { // This means that there is an ul_subframe that can be configured here + LOG_D(PHY,"NFAPI: Clearing dci allocations for potential UL\n"); + harq_pid = subframe2harq_pid(fp,ul_frame,ul_subframe); + + // clear DCI allocation maps for new subframe + + for (i=0; iulsch[i]) { + ulsch_harq = eNB->ulsch[i]->harq_processes[harq_pid]; + ulsch_harq->dci_alloc=0; + ulsch_harq->rar_alloc=0; + } + } + } + for (i=0;idl_config_request_body.dl_config_pdu_list[i]; + //LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_config_pdu->pdu_type); + switch (dl_config_pdu->pdu_type) { + case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: + handle_nfapi_dci_dl_pdu(eNB,NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),proc,dl_config_pdu); + eNB->pdcch_vars[NFAPI_SFNSF2SF(DL_req->sfn_sf)&1].num_dci++; + //LOG_E(PHY,"Incremented num_dci:%d but already set??? dl_config:num_dci:%d\n", eNB->pdcch_vars[subframe&1].num_dci, number_dci); + do_oai=1; + break; + case NFAPI_DL_CONFIG_BCH_PDU_TYPE: + AssertFatal(dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_indextx_request_body.number_of_pdus, + "bch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n", + dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index, + TX_req->tx_request_body.number_of_pdus); + eNB->pbch_configured=1; + do_oai=1; + //LOG_D(PHY,"%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE TX:%d/%d RX:%d/%d TXREQ:%d/%d\n", + //__FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->frame_rx, proc->subframe_rx, NFAPI_SFNSF2SFN(TX_req->sfn_sf), NFAPI_SFNSF2SF(TX_req->sfn_sf)); + + + handle_nfapi_bch_pdu(eNB,proc,dl_config_pdu, + TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index].segments[0].segment_data); + break; + case NFAPI_DL_CONFIG_MCH_PDU_TYPE: + // handle_nfapi_mch_dl_pdu(eNB,dl_config_pdu); + break; + case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: + { + nfapi_dl_config_dlsch_pdu_rel8_t *dlsch_pdu_rel8 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8; + uint16_t pdu_index = dlsch_pdu_rel8->pdu_index; + uint16_t tx_pdus = TX_req->tx_request_body.number_of_pdus; + uint16_t invalid_pdu = pdu_index == -1; + uint8_t *sdu = invalid_pdu ? NULL : pdu_index >= tx_pdus ? NULL : TX_req->tx_request_body.tx_pdu_list[pdu_index].segments[0].segment_data; + + LOG_D(PHY,"%s() [PDU:%d] NFAPI_DL_CONFIG_DLSCH_PDU_TYPE SFN/SF:%04d%d TX:%d/%d RX:%d/%d transport_blocks:%d pdu_index:%d sdu:%p\n", + __FUNCTION__, i, + NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf), + proc->frame_tx, proc->subframe_tx, + proc->frame_rx, proc->subframe_rx, + dlsch_pdu_rel8->transport_blocks, pdu_index, sdu); + + /* + AssertFatal(dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_indextx_request_body.number_of_pdus, + "dlsch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n", + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index, + TX_req->tx_request_body.number_of_pdus); + */ + AssertFatal((dlsch_pdu_rel8->transport_blocks<3) && + (dlsch_pdu_rel8->transport_blocks>0), + "dlsch_pdu_rel8->transport_blocks = %d not in [1,2]\n", + dlsch_pdu_rel8->transport_blocks); + if (1)//sdu != NULL) + { + handle_nfapi_dlsch_pdu(eNB,NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),proc,dl_config_pdu, dlsch_pdu_rel8->transport_blocks-1, sdu); + } + else + { + dont_send=1; + + LOG_E(MAC,"%s() NFAPI_DL_CONFIG_DLSCH_PDU_TYPE sdu is NULL DL_CFG:SFN/SF:%d:pdu_index:%d TX_REQ:SFN/SF:%d:pdus:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(DL_req->sfn_sf), pdu_index, NFAPI_SFNSF2DEC(TX_req->sfn_sf), tx_pdus); + } + + // Send the data first so that the DL_CONFIG can just pluck it out of the buffer + // DJP - OAI was here - moved to bottom + do_oai=1; + + /* + if (dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti == eNB->preamble_list[0].preamble_rel8.rnti) {// is RAR pdu + + LOG_D(PHY,"Frame %d, Subframe %d: Received LTE RAR pdu, programming based on UL Grant\n",frame,subframe); + generate_eNB_ulsch_params_from_rar(eNB, + TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index].segments[0].segment_data, + frame, + subframe); + + } */ + } + break; + case NFAPI_DL_CONFIG_PCH_PDU_TYPE: + // handle_nfapi_pch_pdu(eNB,dl_config_pdu); + break; + case NFAPI_DL_CONFIG_PRS_PDU_TYPE: + // handle_nfapi_prs_pdu(eNB,dl_config_pdu); + break; + case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: + // handle_nfapi_csi_rs_pdu(eNB,dl_config_pdu); + break; + case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: + // handle_nfapi_epdcch_pdu(eNB,dl_config_pdu); + break; +#ifdef Rel14 + case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: + handle_nfapi_mpdcch_pdu(eNB,proc,dl_config_pdu); + eNB->mpdcch_vars[subframe&1].num_dci++; + break; +#endif + } + } + + if (nfapi_mode && do_oai && !dont_send) { + oai_nfapi_tx_req(Sched_INFO->TX_req); + + oai_nfapi_dl_config_req(Sched_INFO->DL_req); // DJP - .dl_config_request_body.dl_config_pdu_list[0]); // DJP - FIXME TODO - yuk - only copes with 1 pdu + } + + if (nfapi_mode && number_hi_dci0_pdu!=0) { + oai_nfapi_hi_dci0_req(HI_DCI0_req); + eNB->pdcch_vars[NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf)&1].num_dci=0; + eNB->pdcch_vars[NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf)&1].num_pdcch_symbols=0; + } + + for (i=0;ihi_dci0_request_body.hi_dci0_pdu_list[i]; + + LOG_D(PHY,"NFAPI: hi_dci0_pdu %d : type %d\n",i,hi_dci0_req_pdu->pdu_type); + + switch (hi_dci0_req_pdu->pdu_type) { + + case NFAPI_HI_DCI0_DCI_PDU_TYPE: + + handle_nfapi_hi_dci0_dci_pdu(eNB,NFAPI_SFNSF2SFN(HI_DCI0_req->sfn_sf),NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf),proc,hi_dci0_req_pdu); + + eNB->pdcch_vars[NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf)&1].num_dci++; + break; + + case NFAPI_HI_DCI0_HI_PDU_TYPE: + handle_nfapi_hi_dci0_hi_pdu(eNB,NFAPI_SFNSF2SFN(HI_DCI0_req->sfn_sf),NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf),proc,hi_dci0_req_pdu); + break; + } + } + + if (nfapi_mode) { + if (number_ul_pdu>0) + { + //LOG_D(PHY, "UL_CONFIG to send to PNF\n"); + oai_nfapi_ul_config_req(UL_req); + UL_req->ul_config_request_body.number_of_pdus=0; + number_ul_pdu=0; + } + } + else { + for (i=0;iul_config_request_body.ul_config_pdu_list[i]; + LOG_D(PHY,"NFAPI: ul_pdu %d : type %d\n",i,ul_config_pdu->pdu_type); + AssertFatal(ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE || + ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE || + ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE || + ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE || + ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE || + ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE || + ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE + , + "Optional UL_PDU type %d not supported\n",ul_config_pdu->pdu_type); + handle_nfapi_ul_pdu(eNB,proc,ul_config_pdu,UL_req->sfn_sf>>4,UL_req->sfn_sf&0xf,UL_req->ul_config_request_body.srs_present); + } + } +} diff --git a/openair1/SCHED/fapi_l1.h b/openair1/SCHED/fapi_l1.h new file mode 100644 index 0000000000..725bb31c45 --- /dev/null +++ b/openair1/SCHED/fapi_l1.h @@ -0,0 +1,78 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file fapi_l1.h + * \brief function prototypes for FAPI L1 interface + * \author R. Knopp + * \date 2017 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr + * \note + * \warning + */ + +#include "PHY/defs.h" +#include "PHY/extern.h" +#include "SCHED/defs.h" +#include "SCHED/extern.h" +#include "nfapi_interface.h" + +void fill_uci_harq_indication(PHY_VARS_eNB *eNB,LTE_eNB_UCI *uci,int frame,int subframe,uint8_t *harq_ack,uint8_t tdd_mapping_mode,uint16_t tdd_multiplexing_mask); +void fill_ulsch_harq_indication(PHY_VARS_eNB *eNB,LTE_UL_eNB_HARQ_t *ulsch_harq,uint16_t rnti, int frame,int subframe,int bundling); +void fill_ulsch_cqi_indication(PHY_VARS_eNB *eNB,uint16_t frame,uint8_t subframe,LTE_UL_eNB_HARQ_t *ulsch_harq,uint16_t rnti); +void fill_sr_indication(PHY_VARS_eNB *eNB,uint16_t rnti,int frame,int subframe,uint32_t stat); +void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe); +void fill_crc_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe,uint8_t crc_flag); +void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,nfapi_dl_config_request_pdu_t *dl_config_pdu); +void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,nfapi_dl_config_request_pdu_t *dl_config_pdu); +void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc, + nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu); +void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc, + nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu); +void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc, + nfapi_dl_config_request_pdu_t *dl_config_pdu, + uint8_t codeword_index, + uint8_t *sdu); +void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, + nfapi_ul_config_request_pdu_t *ul_config_pdu, + uint16_t frame,uint8_t subframe,uint8_t srs_present); + +void handle_ulsch_harq_pdu( + PHY_VARS_eNB *eNB, + int UE_id, + nfapi_ul_config_request_pdu_t *ul_config_pdu, + nfapi_ul_config_ulsch_harq_information *harq_information, + uint16_t frame, + uint8_t subframe); + +void handle_ulsch_cqi_ri_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe); + +void handle_uci_harq_information(PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci,nfapi_ul_config_harq_information *harq_information); + +void handle_uci_sr_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active); + +void handle_uci_sr_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active); +void handle_uci_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active); + +void handle_srs_pdu(PHY_VARS_eNB *eNB,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe); + +void schedule_response(Sched_Rsp_t *Sched_INFO); diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c index a7da9f9cc5..664791f7c4 100644 --- a/openair1/SCHED/phy_mac_stub.c +++ b/openair1/SCHED/phy_mac_stub.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file phy_mac_stub.c * \brief stimulates the phy without mac @@ -44,22 +36,25 @@ #include "SCHED/extern.h" #include "LAYER2/MAC/extern.h" -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif +/* SYRTEM */ +uint8_t dci_ndi_toggle_even[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +uint8_t dci_ndi_toggle_odd[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB) +void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { +/* SYRTEM */ + uint8_t *dci_ndi_toggle_tmp = NULL; + uint8_t harq_pid_value = 0; +/* End of SYRTEM */ - //uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag; - uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0]; + //uint8_t cooperation_flag = eNB->cooperation_flag; + uint8_t transmission_mode = eNB->transmission_mode[0]; - uint32_t rballoc = 0x7FFF; + uint32_t rballoc = 0x1FFFF; //uint32_t rballoc2 = 0x000F; - uint32_t rballoc_test = 0xFFFF; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; - LTE_eNB_DLSCH_t *DLSCH_ptr = phy_vars_eNB->dlsch_eNB[0][0]; + int subframe = proc->subframe_tx; + /* uint32_t rand = taus(); @@ -71,25 +66,30 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e uint32_t bcch_pdu; uint64_t dlsch_pdu; - DCI_pdu->Num_common_dci = 0; - DCI_pdu->Num_ue_spec_dci=0; + LOG_D(PHY,"frame %d, subframe %d, transmission_mode %d\n",proc->frame_tx,proc->subframe_tx,transmission_mode); + + DCI_pdu->Num_dci = 0; switch (subframe) { case 5: - DCI_pdu->Num_common_dci = 1; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = SI_RNTI; - DCI_pdu->dci_alloc[0].format = format1A; - DCI_pdu->dci_alloc[0].ra_flag = 0; + if ( !(proc->frame_tx&1) ) // SI message on even frame only (SFN mod 2 == 0) + { + DCI_pdu->Num_dci = 1; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].firstCCE = 0; + DCI_pdu->dci_alloc[0].rnti = SI_RNTI; + DCI_pdu->dci_alloc[0].format = format1A; + DCI_pdu->dci_alloc[0].ra_flag = 0; + DCI_pdu->dci_alloc[0].search_space = DCI_COMMON_SPACE; - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 6: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_1_5MHz_FDD_t; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -100,7 +100,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -112,12 +112,12 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e case 25: default: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_FDD_t; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -128,7 +128,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(25,10,3); - ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -139,12 +139,12 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e break; case 50: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_10MHz_FDD_t; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(50,10,3); - ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -166,12 +166,12 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e break; case 100: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_20MHz_FDD_t; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc = computeRIV(100,10,3); - ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs = 1; ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->harq_pid = 0; @@ -182,7 +182,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type = 0; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc = computeRIV(100,10,3); - ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi = proc->frame_tx&1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs = 1; ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid = 0; @@ -194,14 +194,21 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e } break; //subframe switch + } // if ( !(proc->frame_tx&1) ) + else // No SI message on odd frame (SFN mod 2 == 1) + { + /* warning: work around to send dlsch on subframe 5 odd frame !!! */ + /* todo: clean up, espacially if subframe cases are added next !!! */ + } /* case 6: - DCI_pdu->Num_ue_spec_dci = 1; - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1236; - DCI_pdu->dci_alloc[0].format = format2_2A_M10PRB; - DCI_pdu->dci_alloc[0].ra_flag = 0; + DCI_pdu->Num_dci = 1; + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0x1236; + DCI_pdu->dci_alloc[0].format = format2_2A_M10PRB; + DCI_pdu->dci_alloc[0].ra_flag = 0; + DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE; DLSCH_alloc_pdu1.rballoc = 0x00ff; DLSCH_alloc_pdu1.TPC = 0; @@ -218,28 +225,38 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e default: case 7: - DCI_pdu->Num_ue_spec_dci = 1; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1; - DCI_pdu->dci_alloc[0].ra_flag = 0; + DCI_pdu->Num_dci = 1; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].firstCCE = 0; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format1; + DCI_pdu->dci_alloc[0].ra_flag = 0; + DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE; - if (transmission_mode<3) { + if (transmission_mode<3 || transmission_mode == 7) { //user 1 - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { + switch (eNB->frame_parms.N_RB_DL) { case 25: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; + harq_pid_value = ( ((proc->frame_tx * 10) + subframe) % 8 ); + + if (!(subframe&1)) // even subframe + dci_ndi_toggle_tmp = &(dci_ndi_toggle_even[harq_pid_value]); + else // odd subframe + dci_ndi_toggle_tmp = &(dci_ndi_toggle_odd[harq_pid_value]); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(25,10,3); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = subframe % 5; - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = subframe / 5; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = harq_pid_value; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = (*dci_ndi_toggle_tmp); ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rah = 0; + (*dci_ndi_toggle_tmp) = ((*dci_ndi_toggle_tmp) + 1) & 1; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_FDD_t)); /* @@ -254,8 +271,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t)); @@ -267,8 +284,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid = subframe % 5; - ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi = subframe / 5; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rah = 0; @@ -286,8 +303,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rah = 0; @@ -299,39 +316,27 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e case 50: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_FDD_t; + harq_pid_value = ( ((proc->frame_tx * 10) + subframe) % 8 ); + + if (!(subframe&1)) // even subframe + dci_ndi_toggle_tmp = &(dci_ndi_toggle_even[harq_pid_value]); + else // odd subframe + dci_ndi_toggle_tmp = &(dci_ndi_toggle_odd[harq_pid_value]); + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(50,10,3); ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = subframe % 5; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = subframe / 5; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = harq_pid_value; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = (*dci_ndi_toggle_tmp); ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rah = 0; + (*dci_ndi_toggle_tmp) = ((*dci_ndi_toggle_tmp) + 1) & 1; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_FDD_t)); - - /* - //user2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_10MHz_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc2; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rah = 0; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t)); - */ } else { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_10MHz_TDD_t; @@ -339,8 +344,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid = subframe % 5; - ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi = subframe / 5; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rah = 0; @@ -358,8 +363,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rah = 0; @@ -370,18 +375,26 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e break; case 100: - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { + if (eNB->frame_parms.frame_type == FDD) { DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_20MHz_FDD_t; - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rballoc = rballoc; //computeRIV(100,10,3); + harq_pid_value = ( ((proc->frame_tx * 10) + subframe) % 8 ); + + if (!(subframe&1)) // even subframe + dci_ndi_toggle_tmp = &(dci_ndi_toggle_even[harq_pid_value]); + else // odd subframe + dci_ndi_toggle_tmp = &(dci_ndi_toggle_odd[harq_pid_value]); + + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rballoc = 0x1ffffff; //rballoc; //computeRIV(100,10,3); ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->TPC = 0; - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = subframe % 5; - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = subframe / 5; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = harq_pid_value; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = (*dci_ndi_toggle_tmp); ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rah = 0; + (*dci_ndi_toggle_tmp) = ((*dci_ndi_toggle_tmp) + 1) & 1; + memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_FDD_t)); /* @@ -396,8 +409,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rah = 0; @@ -410,8 +423,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid = subframe % 5; - ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; - //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); + ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; + //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->frame%1024)%28); ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi = subframe / 5; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rah = 0; @@ -429,8 +442,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->TPC = 0; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->dai = 0; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid = 1; - //((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = openair_daq_vars.target_ue_dl_mcs; + //((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs = eNB->target_ue_dl_mcs; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi = 1; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv = 0; ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rah = 0; @@ -440,81 +453,231 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e break; } + + + + + DCI_pdu->dci_alloc[1].L = 2; + DCI_pdu->dci_alloc[1].rnti = 0x1235; + DCI_pdu->dci_alloc[1].format = format0; + DCI_pdu->dci_alloc[1].ra_flag = 0; + DCI_pdu->dci_alloc[1].search_space = DCI_UE_SPACE; + + if (eNB->frame_parms.frame_type == FDD) { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI0_1_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_1_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_1_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(6,1,4); + ((DCI0_1_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_1_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_1_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_1_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_1_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break; + /* case 15: + ((DCI0_3MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_3MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_3MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(25,2,eNB->ue_ul_nb_rb); + ((DCI0_3MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_3MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_3MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_3MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_3MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->dai = 0; + ((DCI0_3MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break;*/ + case 25: + ((DCI0_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(25,1,20); + printf("rballoc %d\n",((DCI0_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc); + ((DCI0_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_5MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break; + case 50: + ((DCI0_10MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_10MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_10MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(50,1,48); + ((DCI0_10MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_10MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_10MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_10MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_10MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break; + /* case 75: + ((DCI0_15MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_15MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_15MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(25,2,eNB->ue_ul_nb_rb); + ((DCI0_15MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_15MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_15MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_15MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_15MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break;*/ + case 100: + ((DCI0_20MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_20MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_20MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(100,1,96); + ((DCI0_20MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_20MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_20MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_20MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_20MHz_FDD_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break; + } + } + else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI0_1_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_1_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_1_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(6,1,5); + ((DCI0_1_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_1_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_1_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_1_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_1_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->dai = 0; + ((DCI0_1_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break; + /* case 15: + ((DCI0_3MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_3MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_3MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(25,2,eNB->ue_ul_nb_rb); + ((DCI0_3MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_3MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_3MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_3MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_3MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->dai = 0; + ((DCI0_3MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break;*/ + case 25: + ((DCI0_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(25,2,20); + ((DCI0_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->dai = 0; + ((DCI0_5MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break; + case 50: + ((DCI0_10MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_10MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_10MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(50,1,48); + ((DCI0_10MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_10MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_10MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_10MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_10MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->dai = 0; + ((DCI0_10MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break; + /* case 75: + ((DCI0_15MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_15MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_15MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(25,2,eNB->ue_ul_nb_rb); + ((DCI0_15MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_15MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_15MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_15MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_15MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->dai = 0; + ((DCI0_15MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break;*/ + case 100: + ((DCI0_20MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->type = 0; + ((DCI0_20MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->hopping = 0; + ((DCI0_20MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->rballoc = computeRIV(100,1,96); + ((DCI0_20MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->mcs = eNB->target_ue_ul_mcs; + ((DCI0_20MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->ndi = proc->frame_tx&1; + ((DCI0_20MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->TPC = 0; + ((DCI0_20MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cshift = 0; + ((DCI0_20MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->dai = 0; + ((DCI0_20MHz_TDD_1_6_t*)&DCI_pdu->dci_alloc[1].dci_pdu[0])->cqi_req = 1; + break; + } + } } else if (transmission_mode==4) { - DCI_pdu->Num_ue_spec_dci = 1; + DCI_pdu->Num_dci = 1; // user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_FDD_t; - DCI_pdu->dci_alloc[0].L = 3; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format2; - DCI_pdu->dci_alloc[0].ra_flag = 0; + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_FDD_t; + DCI_pdu->dci_alloc[0].L = 3; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format2; + DCI_pdu->dci_alloc[0].ra_flag = 0; + DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1 = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1 = subframe / 5; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = openair_daq_vars.target_ue_dl_mcs; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1 = eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2 = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2 = subframe / 5; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = openair_daq_vars.target_ue_dl_mcs; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2 = eNB->target_ue_dl_mcs; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap = 0; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = subframe % 5; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->TPC = 0; - ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = openair_daq_vars.ue_dl_rb_alloc; + ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc = eNB->ue_dl_rb_alloc; ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rah = 0; } else if (transmission_mode==5) { - DCI_pdu->Num_ue_spec_dci = 2; + DCI_pdu->Num_dci = 2; // user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[0].L = 3; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[0].ra_flag = 0; + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[0].L = 3; + DCI_pdu->dci_alloc[0].rnti = 0x1235; + DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB; + DCI_pdu->dci_alloc[0].ra_flag = 0; + DCI_pdu->dci_alloc[0].search_space = DCI_UE_SPACE; DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback DLSCH_alloc_pdu1E.rv = 0; DLSCH_alloc_pdu1E.ndi = subframe / 5; - //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]]; + //DLSCH_alloc_pdu1E.mcs = cqi_to_mcs[eNB->UE_stats->DL_cqi[0]]; //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); - DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; - //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28); - phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; + DLSCH_alloc_pdu1E.mcs = eNB->target_ue_dl_mcs; + //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((eNB->proc[subframe].frame%1024)%28); + eNB->UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; DLSCH_alloc_pdu1E.harq_pid = subframe % 5; DLSCH_alloc_pdu1E.dai = 0; DLSCH_alloc_pdu1E.TPC = 0; - DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; + DLSCH_alloc_pdu1E.rballoc = eNB->ue_dl_rb_alloc; DLSCH_alloc_pdu1E.rah = 0; DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); //user 2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[1].L = 0; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[1].ra_flag = 0; - //DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; + DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + DCI_pdu->dci_alloc[1].L = 0; + DCI_pdu->dci_alloc[1].rnti = 0x1236; + DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; + DCI_pdu->dci_alloc[1].ra_flag = 0; + DCI_pdu->dci_alloc[1].search_space = DCI_UE_SPACE; + //DLSCH_alloc_pdu1E.mcs = eNB->target_ue_dl_mcs; //DLSCH_alloc_pdu1E.mcs = (unsigned char) (taus()%28); - //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((phy_vars_eNB->frame%1024)%28); - DLSCH_alloc_pdu1E.mcs = (unsigned char) (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)/3)%28); - phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; + //DLSCH_alloc_pdu1E.mcs = (unsigned char) ((eNB->frame%1024)%28); + DLSCH_alloc_pdu1E.mcs = (unsigned char) (((proc->frame_tx%1024)/3)%28); + eNB->UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); // set the precoder of the second UE orthogonal to the first - phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); + eNB->UE_stats[1].DL_pmi_single = (eNB->UE_stats[0].DL_pmi_single ^ 0x1555); } break; //subframe switch /* case 8: - DCI_pdu->Num_common_dci = 1; - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0xbeef; - DCI_pdu->dci_alloc[0].format = format1A; - DCI_pdu->dci_alloc[0].ra_flag = 1; + DCI_pdu->Num_dci = 1; + DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + DCI_pdu->dci_alloc[0].L = 2; + DCI_pdu->dci_alloc[0].rnti = 0xbeef; + DCI_pdu->dci_alloc[0].format = format1A; + DCI_pdu->dci_alloc[0].ra_flag = 1; + DCI_pdu->dci_alloc[0].search_space = DCI_COMMON_SPACE; RA_alloc_pdu.type = 1; RA_alloc_pdu.vrb_type = 0; @@ -528,32 +691,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); break; */ - /* - case 9: - DCI_pdu->Num_ue_spec_dci = 1; + - //user 1 - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_FDD_t ; - else - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; - - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format0; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - UL_alloc_pdu.type = 0; - UL_alloc_pdu.hopping = 0; - UL_alloc_pdu.rballoc = computeRIV(25,2,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; - UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; - UL_alloc_pdu.TPC = 0; - UL_alloc_pdu.cshift = 0; - UL_alloc_pdu.dai = 0; - UL_alloc_pdu.cqi_req = 1; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); - */ // user 2 /* DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; @@ -565,11 +704,11 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e UL_alloc_pdu.type = 0; UL_alloc_pdu.hopping = 0; if (cooperation_flag==0) - UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb); + UL_alloc_pdu.rballoc = computeRIV(25,2+eNB->ue_ul_nb_rb,eNB->ue_ul_nb_rb); else - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; - UL_alloc_pdu.ndi = phy_vars_eNB->proc[sched_subframe].frame_tx&1; + UL_alloc_pdu.rballoc = computeRIV(25,0,eNB->ue_ul_nb_rb); + UL_alloc_pdu.mcs = eNB->target_ue_ul_mcs; + UL_alloc_pdu.ndi = proc->frame_tx&1; UL_alloc_pdu.TPC = 0; if ((cooperation_flag==0) || (cooperation_flag==1)) UL_alloc_pdu.cshift = 0; @@ -578,190 +717,14 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e UL_alloc_pdu.dai = 0; UL_alloc_pdu.cqi_req = 1; memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); - break; + */ - - /*default: - break;*/ } /* DCI_pdu->nCCE = 0; - for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) { - DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L)); - } - */ -} - -void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB) -{ - - //uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag; - uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0]; - - //uint32_t rballoc = 0x00F0; - //uint32_t rballoc2 = 0x000F; - /* - uint32_t rand = taus(); - if ((subframe==8) || (subframe==9) || (subframe==0)) - rand = (rand%5)+5; - else - rand = (rand%4)+5; - */ - - DCI_pdu->Num_common_dci = 0; - DCI_pdu->Num_ue_spec_dci=0; - - switch (subframe) { - case 5: - DCI_pdu->Num_ue_spec_dci = 1; - - if (transmission_mode<3) { - //user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - DLSCH_alloc_pdu.rballoc = openair_daq_vars.ue_dl_rb_alloc; - DLSCH_alloc_pdu.TPC = 0; - DLSCH_alloc_pdu.dai = 0; - DLSCH_alloc_pdu.harq_pid = 1; - DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; - DLSCH_alloc_pdu.ndi = 1; - DLSCH_alloc_pdu.rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); - - /* - //user2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - DLSCH_alloc_pdu.rballoc = rballoc2; - DLSCH_alloc_pdu.TPC = 0; - DLSCH_alloc_pdu.dai = 0; - DLSCH_alloc_pdu.harq_pid = 1; - DLSCH_alloc_pdu.mcs = openair_daq_vars.target_ue_dl_mcs; - DLSCH_alloc_pdu.ndi = 1; - DLSCH_alloc_pdu.rv = 0; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t)); - */ - } else if (transmission_mode==5) { - DCI_pdu->Num_ue_spec_dci = 2; - // user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - DLSCH_alloc_pdu1E.tpmi = 5; //5=use feedback - DLSCH_alloc_pdu1E.rv = 0; - DLSCH_alloc_pdu1E.ndi = 1; - DLSCH_alloc_pdu1E.mcs = openair_daq_vars.target_ue_dl_mcs; - DLSCH_alloc_pdu1E.harq_pid = 1; - DLSCH_alloc_pdu1E.dai = 0; - DLSCH_alloc_pdu1E.TPC = 0; - DLSCH_alloc_pdu1E.rballoc = openair_daq_vars.ue_dl_rb_alloc; - DLSCH_alloc_pdu1E.rah = 0; - DLSCH_alloc_pdu1E.dl_power_off = 0; //0=second user present - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - - //user 2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format1E_2A_M10PRB; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - - // set the precoder of the second UE orthogonal to the first - phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); - } - - break; - - case 7: - DCI_pdu->Num_common_dci = 1; - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0xbeef; - DCI_pdu->dci_alloc[0].format = format1A; - DCI_pdu->dci_alloc[0].ra_flag = 1; - - RA_alloc_pdu.type = 1; - RA_alloc_pdu.vrb_type = 0; - RA_alloc_pdu.rballoc = computeRIV(25,12,3); - RA_alloc_pdu.ndi = 1; - RA_alloc_pdu.rv = 1; - RA_alloc_pdu.mcs = 4; - RA_alloc_pdu.harq_pid = 0; - RA_alloc_pdu.TPC = 1; - - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); - break; - - case 9: - DCI_pdu->Num_ue_spec_dci = 1; - - //user 1 - DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; - DCI_pdu->dci_alloc[0].L = 2; - DCI_pdu->dci_alloc[0].rnti = 0x1235; - DCI_pdu->dci_alloc[0].format = format0; - DCI_pdu->dci_alloc[0].ra_flag = 0; - - UL_alloc_pdu.type = 0; - UL_alloc_pdu.hopping = 0; - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; - UL_alloc_pdu.ndi = 1; - UL_alloc_pdu.TPC = 0; - UL_alloc_pdu.cshift = 0; - UL_alloc_pdu.dai = 0; - UL_alloc_pdu.cqi_req = 1; - memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); - - /* - //user 2 - DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; - DCI_pdu->dci_alloc[1].L = 2; - DCI_pdu->dci_alloc[1].rnti = 0x1236; - DCI_pdu->dci_alloc[1].format = format0; - DCI_pdu->dci_alloc[1].ra_flag = 0; - - UL_alloc_pdu.type = 0; - UL_alloc_pdu.hopping = 0; - if (cooperation_flag==0) - UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb); - else - UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb); - UL_alloc_pdu.mcs = openair_daq_vars.target_ue_ul_mcs; - UL_alloc_pdu.ndi = 1; - UL_alloc_pdu.TPC = 0; - if ((cooperation_flag==0) || (cooperation_flag==1)) - UL_alloc_pdu.cshift = 0; - else - UL_alloc_pdu.cshift = 1; - UL_alloc_pdu.dai = 0; - UL_alloc_pdu.cqi_req = 1; - memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t)); - */ - break; - - default: - break; - } - /* - DCI_pdu->nCCE = 0; - - for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) { + for (i=0; iNum_dci; i++) { DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L)); } */ diff --git a/openair1/SCHED/phy_procedures_emos.h b/openair1/SCHED/phy_procedures_emos.h deleted file mode 100644 index b34730bddb..0000000000 --- a/openair1/SCHED/phy_procedures_emos.h +++ /dev/null @@ -1,115 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifndef __PHY_PROCEDURES_EMOS_H__ -#define __PHY_PROCEDURES_EMOS_H__ - -/* -#ifndef RTAI -typedef uint64_t RTIME; -#else -*/ -#ifdef RTAI -#include -#include -#endif - -//#include "PHY/TOOLS/defs.h" -#include "PHY/defs.h" -#define CHANSOUNDER_FIFO_SIZE 10485760 // 10 Mbytes FIFO -//#define CHANSOUNDER_FIFO_SIZE 20971520 // 20 Mbytes FIFO -#define CHANSOUNDER_FIFO_MINOR 4 // minor of the FIFO device - this is /dev/rtf3 -#define CHANSOUNDER_FIFO_DEV "/dev/rtf4" - -#define NUMBER_OF_OFDM_CARRIERS_EMOS 512 // the number of OFDM carriers used for channel sounding -#define NUMBER_OF_USEFUL_CARRIERS_EMOS 300 // the number of OFDM carriers that contain data - -#define N_RB_UL_EMOS 25 -#define N_PILOTS_DL_EMOS 2 // ofdm symbols with pilots per slot -#define N_PILOTS_UL_EMOS 2 // ofdm symbols with pilots per subframe -#define N_SLOTS_DL_EMOS 2 // we take slots 14,15 -#define N_SUBFRAMES_UL_EMOS 1 // we take subframes 4 -#define NB_ANTENNAS_TX_EMOS 2 -#define NB_ANTENNAS_RX_EMOS 2 - -struct fifo_dump_emos_struct_UE { - // RX - uint64_t timestamp; //! Timestamp of the receiver - unsigned int frame_tx; //! Framenumber of the TX (encoded in the BCH) - unsigned int frame_rx; //! Framenumber of the RX - UE_MODE_t UE_mode; - PHY_MEASUREMENTS PHY_measurements; //! Structure holding all PHY measurements (one for every slot) - unsigned int pbch_errors; /// Total number of errors on PBCH - unsigned int pbch_errors_last; /// Total number of errors on PBCH 100 frames ago - unsigned int pbch_errors_conseq; /// Total number of consecutive errors on PBCH - unsigned int pbch_fer; /// PBCH FER (in percent) - unsigned int dlsch_errors; /// Total number of error on the DLSCH (data) - unsigned int dlsch_errors_last; - unsigned int dlsch_received; - unsigned int dlsch_received_last; - unsigned int dlsch_fer; - unsigned int dlsch_cntl_errors; /// Total number of error on the DLSCH (control) - unsigned int dlsch_ra_errors; /// Total number of error on the DLSCH (random access) - unsigned int total_TBS; - unsigned int total_TBS_last; - unsigned int bitrate; - unsigned int total_received_bits; - int timing_offset; /// Timing offset - int timing_advance; /// Timing advance - int freq_offset; /// Frequency offset - int use_ia_receiver; - unsigned short pmi_saved; - unsigned short mcs; - unsigned int rx_total_gain_dB; /// Total gain - unsigned char eNb_id; /// eNb_id UE is synched to - unsigned char mimo_mode; /// Transmission mode -#ifdef EMOS_CHANNEL - int channel[NB_ANTENNAS_RX_EMOS][NB_ANTENNAS_TX_EMOS][NUMBER_OF_OFDM_CARRIERS_EMOS*N_PILOTS_DL_EMOS*N_SLOTS_DL_EMOS]; -#endif -}; - -typedef struct fifo_dump_emos_struct_UE fifo_dump_emos_UE; - - -struct fifo_dump_emos_struct_eNB { - // TX - uint64_t timestamp; //! Timestamp of the receiver - unsigned int frame_tx; //! Framenumber of the TX - unsigned char mimo_mode; /// Transmission mode - // RX - PHY_MEASUREMENTS_eNB PHY_measurements_eNB; /// UL measurements - LTE_eNB_UE_stats eNB_UE_stats[NUMBER_OF_UE_MAX]; /// Contains received feedback - unsigned int rx_total_gain_dB; /// Total gain -#ifdef EMOS_CHANNEL - int channel[NB_ANTENNAS_RX_EMOS][N_RB_UL_EMOS*12*N_PILOTS_UL_EMOS*N_SUBFRAMES_UL_EMOS]; ///UL channel estimate -#endif -}; - -typedef struct fifo_dump_emos_struct_eNB fifo_dump_emos_eNB; - -#endif diff --git a/openair1/SCHED/phy_procedures_lte_common.c b/openair1/SCHED/phy_procedures_lte_common.c old mode 100755 new mode 100644 index e56606e262..bbb6986ce9 --- a/openair1/SCHED/phy_procedures_lte_common.c +++ b/openair1/SCHED/phy_procedures_lte_common.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file phy_procedures_lte_eNB.c * \brief Implementation of common utilities for eNB/UE procedures from 36.213 LTE specifications @@ -42,10 +34,6 @@ #include "SCHED/defs.h" #include "SCHED/extern.h" -#ifdef LOCALIZATION -#include -#endif - void get_Msg3_alloc(LTE_DL_FRAME_PARMS *frame_parms, unsigned char current_subframe, unsigned int current_frame, @@ -113,7 +101,47 @@ void get_Msg3_alloc(LTE_DL_FRAME_PARMS *frame_parms, *frame = (current_frame+2) & 1023; break; } - } + } else if (frame_parms->tdd_config == 4) { + switch (current_subframe) { + + case 0: + case 4: + case 5: + case 6: + *subframe = 2; + *frame = (current_frame+1) & 1023; + break; + + case 7: + *subframe = 3; + *frame = (current_frame+1) & 1023; + break; + + case 8: + case 9: + *subframe = 2; + *frame = (current_frame+2) & 1023; + break; + } + } else if (frame_parms->tdd_config == 5) { + switch (current_subframe) { + + case 0: + case 4: + case 5: + case 6: + *subframe = 2; + *frame = (current_frame+1) & 1023; + break; + + case 7: + case 8: + case 9: + *subframe = 2; + *frame = (current_frame+2) & 1023; + break; + } + } } } @@ -145,6 +173,13 @@ void get_Msg3_alloc_ret(LTE_DL_FRAME_PARMS *frame_parms, // original PUSCH in 3, PHICH in 9, ret in 3 next frame // original PUSCH in 4, PHICH in 0, ret in 4 next frame *frame=(current_frame+1) & 1023; + } else if (frame_parms->tdd_config == 4) { + // original PUSCH in 2, PHICH in 8, ret in 2 next frame + // original PUSCH in 3, PHICH in 9, ret in 3 next frame + *frame=(current_frame+1) & 1023; + } else if (frame_parms->tdd_config == 5) { + // original PUSCH in 2, PHICH in 8, ret in 2 next frame + *frame=(current_frame+1) & 1023; } } } @@ -227,7 +262,7 @@ uint8_t get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms, default: LOG_E(PHY,"get_Msg3_harq_pid: Unsupported TDD configuration %d\n",frame_parms->tdd_config); - mac_xface->macphy_exit("get_Msg3_harq_pid: Unsupported TDD configuration"); + AssertFatal(1==0,"get_Msg3_harq_pid: Unsupported TDD configuration"); break; } } @@ -261,6 +296,24 @@ unsigned char ul_ACK_subframe2_dl_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsig break; + case 4: + if (subframe == 2) { // ACK subframes 0, 4 and 5 + //if (ACK_index==2) + // return(1); TBC + if (ACK_index==2) + return(0); + + return(4+ACK_index); + } else if (subframe == 3) { // ACK subframes 6, 7 8 and 9 + return(6+ACK_index); // To be updated + } else { + LOG_E(PHY,"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n", + subframe,frame_parms->tdd_config); + return(0); + } + + break; + case 1: if (subframe == 2) { // ACK subframes 5 and 6 return(5+ACK_index); @@ -305,6 +358,30 @@ unsigned char ul_ACK_subframe2_M(LTE_DL_FRAME_PARMS *frame_parms,unsigned char s break; + case 4: + if (subframe == 2) { // ACK subframes 0,4 and 5 + return(3); // should be 4 + } else if (subframe == 3) { // ACK subframes 6,7,8 and 9 + return(4); + } else { + LOG_E(PHY,"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n", + subframe,frame_parms->tdd_config); + return(0); + } + + break; + + case 5: + if (subframe == 2) { // ACK subframes 0,3,4,5,6,7,8 and 9 + return(8); // should be 3 + } else { + LOG_E(PHY,"phy_procedures_lte_common.c/subframe2_dl_harq_pid: illegal subframe %d for tdd_config %d\n", + subframe,frame_parms->tdd_config); + return(0); + } + + break; + case 1: if (subframe == 2) { // ACK subframes 5 and 6 return(2); @@ -328,94 +405,228 @@ unsigned char ul_ACK_subframe2_M(LTE_DL_FRAME_PARMS *frame_parms,unsigned char s } // This function implements table 10.1-1 of 36-213, p. 69 -uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms, +// return the number 'Nbundled' +uint8_t get_reset_ack(LTE_DL_FRAME_PARMS *frame_parms, harq_status_t *harq_ack, - unsigned char subframe, - unsigned char *o_ACK) + unsigned char subframe_tx, + unsigned char subframe_rx, + unsigned char *o_ACK, + uint8_t *pN_bundled, + uint8_t cw_idx, + uint8_t do_reset) // 1 to reset ACK/NACK status : 0 otherwise { - - uint8_t status=0; - uint8_t subframe_dl; + uint8_t subframe_ul=0xff, subframe_dl0=0xff, subframe_dl1=0xff,subframe_dl2=0xff, subframe_dl3=0xff; // printf("get_ack: SF %d\n",subframe); if (frame_parms->frame_type == FDD) { - if (subframe < 4) - subframe_dl = subframe + 6; + if (subframe_tx < 4) + subframe_dl0 = subframe_tx + 6; else - subframe_dl = subframe - 4; + subframe_dl0 = subframe_tx - 4; - o_ACK[0] = harq_ack[subframe_dl].ack; - status = harq_ack[subframe_dl].send_harq_status; + o_ACK[cw_idx] = harq_ack[subframe_dl0].ack; + status = harq_ack[subframe_dl0].send_harq_status; + + //LOG_I(PHY,"dl subframe %d send_harq_status %d cw_idx %d, reset %d\n",subframe_dl0, status, cw_idx, do_reset); + if(do_reset) + harq_ack[subframe_dl0].send_harq_status = 0; //printf("get_ack: Getting ACK/NAK for PDSCH (subframe %d) => %d\n",subframe_dl,o_ACK[0]); } else { switch (frame_parms->tdd_config) { case 1: - if (subframe == 2) { // ACK subframes 5 (forget 6) - o_ACK[0] = harq_ack[5].ack; - status = harq_ack[5].send_harq_status; - } else if (subframe == 3) { // ACK subframe 9 - o_ACK[0] = harq_ack[9].ack; - status = harq_ack[9].send_harq_status; - } else if (subframe == 4) { // nothing - status = 0; - } else if (subframe == 7) { // ACK subframes 0 (forget 1) - o_ACK[0] = harq_ack[0].ack; - status = harq_ack[0].send_harq_status; - } else if (subframe == 8) { // ACK subframes 4 - o_ACK[0] = harq_ack[4].ack; - status = harq_ack[4].send_harq_status; + if (subframe_tx == 2) { // ACK subframes 5,6 + subframe_ul = 6; + subframe_dl0 = 5; + subframe_dl1 = 6; + } else if (subframe_tx == 3) { // ACK subframe 9 + subframe_ul = 9; + subframe_dl0 = 9; + subframe_dl1 = 0xff; + } else if (subframe_tx == 4) { // nothing + subframe_ul = 0xff; + subframe_dl0 = 0xff; // invalid subframe number indicates ACK/NACK is not needed + subframe_dl1 = 0xff; + } else if (subframe_tx == 7) { // ACK subframes 0,1 + subframe_ul = 1; + subframe_dl0 = 0; + subframe_dl1 = 1; + } else if (subframe_tx == 8) { // ACK subframes 4 + subframe_ul = 4; + subframe_dl0 = 4; + subframe_dl1 = 0xff; } else { - LOG_E(PHY,"phy_procedures_lte.c: get_ack, illegal subframe %d for tdd_config %d\n", - subframe,frame_parms->tdd_config); + LOG_E(PHY,"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n", + subframe_tx,frame_parms->tdd_config); return(0); } + // report ACK/NACK status + o_ACK[cw_idx] = 1; + status = 0; + if ((subframe_dl0 < 10) && (harq_ack[subframe_dl0].send_harq_status)) { + o_ACK[cw_idx] &= harq_ack[subframe_dl0].ack; + status = harq_ack[subframe_dl0].send_harq_status; + } + if ((subframe_dl1 < 10) && (harq_ack[subframe_dl1].send_harq_status)) { + o_ACK[cw_idx] &= harq_ack[subframe_dl1].ack; + status = harq_ack[subframe_dl1].send_harq_status; + } + // report status = Nbundled + if (!status) { + o_ACK[cw_idx] = 0; + } else { + if (harq_ack[subframe_ul].vDAI_UL < 0xff) { + status = harq_ack[subframe_ul].vDAI_UL; + } + } + + if (!do_reset && (subframe_ul < 10)) { + if ((subframe_dl0 < 10) && (subframe_dl1 < 10)) { + LOG_D(PHY,"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d harq_status=%d vDAI_DL=%d, dlsf#%d ACK=%d harq_status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d\n", + subframe_tx, subframe_ul, harq_ack[subframe_ul].vDAI_UL, status, + subframe_dl0, harq_ack[subframe_dl0].ack, harq_ack[subframe_dl0].send_harq_status, harq_ack[subframe_dl0].vDAI_DL, + subframe_dl1, harq_ack[subframe_dl1].ack, harq_ack[subframe_dl1].send_harq_status, harq_ack[subframe_dl1].vDAI_DL, + o_ACK[cw_idx], status); + } else if (subframe_dl0 < 10) { + LOG_D(PHY,"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d\n", + subframe_tx, subframe_ul, harq_ack[subframe_ul].vDAI_UL, status, + subframe_dl0, harq_ack[subframe_dl0].ack, harq_ack[subframe_dl0].send_harq_status, harq_ack[subframe_dl0].vDAI_DL, + o_ACK[cw_idx], status); + }else if (subframe_dl1 < 10) { + LOG_D(PHY,"ul-sf#%d vDAI_UL[sf#%d]=%d Nbundled=%d: dlsf#%d ACK=%d status=%d vDAI_DL=%d, o_ACK[0]=%d status=%d\n", + subframe_tx, subframe_ul, harq_ack[subframe_ul].vDAI_UL, status, + subframe_dl1, harq_ack[subframe_dl1].ack, harq_ack[subframe_dl1].send_harq_status, harq_ack[subframe_dl1].vDAI_DL, + o_ACK[cw_idx], status); + } + } + + // reset ACK/NACK status + if (do_reset) { + LOG_D(PHY,"ul-sf#%d ACK/NACK status resetting @ dci0-sf#%d, dci1x/2x-sf#%d, dci1x/2x-sf#%d\n", subframe_tx, subframe_ul, subframe_dl0, subframe_dl1); + if (subframe_ul < 10) { + harq_ack[subframe_ul].vDAI_UL = 0xff; + } + if (subframe_dl0 < 10) { + harq_ack[subframe_dl0].vDAI_DL = 0xff; + harq_ack[subframe_dl0].ack = 2; + harq_ack[subframe_dl0].send_harq_status = 0; + } + if (subframe_dl1 < 10) { + harq_ack[subframe_dl1].vDAI_DL = 0xff; + harq_ack[subframe_dl1].ack = 2; + harq_ack[subframe_dl1].send_harq_status = 0; + } + } + break; case 3: - if (subframe == 2) { // ACK subframes 5 and 6 - if (harq_ack[5].send_harq_status == 1) { - o_ACK[0] = harq_ack[5].ack; - - if (harq_ack[6].send_harq_status == 1) - o_ACK[1] = harq_ack[6].ack; - } else if (harq_ack[6].send_harq_status == 1) - o_ACK[0] = harq_ack[6].ack; - - status = harq_ack[5].send_harq_status + (harq_ack[6].send_harq_status<<1); - //printf("Subframe 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status); - } else if (subframe == 3) { // ACK subframes 7 and 8 - if (harq_ack[7].send_harq_status == 1) { - o_ACK[0] = harq_ack[7].ack; - - if (harq_ack[8].send_harq_status == 1) - o_ACK[1] = harq_ack[8].ack; - } else if (harq_ack[8].send_harq_status == 1) - o_ACK[0] = harq_ack[8].ack; - - status = harq_ack[7].send_harq_status + (harq_ack[8].send_harq_status<<1); + if (subframe_tx == 2) { // ACK subframes 5 and 6 + subframe_dl0 = 5; + subframe_dl1 = 6; + subframe_ul = 2; + //printf("subframe_tx 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status); + } else if (subframe_tx == 3) { // ACK subframes 7 and 8 + subframe_dl0 = 7; + subframe_dl1 = 8; + subframe_ul = 3; //printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack); //printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]); - } else if (subframe == 4) { // ACK subframes 9 and 0 - if (harq_ack[9].send_harq_status == 1) { - o_ACK[0] = harq_ack[9].ack; - - if (harq_ack[0].send_harq_status == 1) - o_ACK[1] = harq_ack[0].ack; - } else if (harq_ack[0].send_harq_status == 1) - o_ACK[0] = harq_ack[0].ack; - - status = harq_ack[9].send_harq_status + (harq_ack[0].send_harq_status<<1); + } else if (subframe_tx == 4) { // ACK subframes 9 and 0 + subframe_dl0 = 9; + subframe_dl1 = 0; + subframe_ul = 4; //printf("Subframe 4, TDD config 3: harq_ack[9] = %d,harq_ack[0] = %d\n",harq_ack[9].ack,harq_ack[0].ack); } else { - LOG_E(PHY,"phy_procedures_lte.c: get_ack, illegal subframe %d for tdd_config %d\n", - subframe,frame_parms->tdd_config); + LOG_E(PHY,"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n", + subframe_tx,frame_parms->tdd_config); return(0); } + // report ACK/NACK status + o_ACK[cw_idx] = 0; + if (harq_ack[subframe_dl0].send_harq_status == 1) { + o_ACK[cw_idx] = harq_ack[subframe_dl0].ack; + + if (harq_ack[subframe_dl1].send_harq_status == 1) + o_ACK[cw_idx] &= harq_ack[subframe_dl1].ack; + } else if (harq_ack[subframe_dl1].send_harq_status == 1) + o_ACK[cw_idx] = harq_ack[subframe_dl1].ack; + + pN_bundled[0] = harq_ack[subframe_rx].vDAI_UL; + status = harq_ack[subframe_dl0].send_harq_status + harq_ack[subframe_dl1].send_harq_status; + + //LOG_D(PHY,"TDD Config3 UL Sfn %d, dl Sfn0 %d status %d o_Ack %d, dl Sfn1 %d status %d o_Ack %d subframe_rx %d N_bundled %d \n", + // subframe_tx, subframe_dl0, harq_ack[subframe_dl0].send_harq_status,harq_ack[subframe_dl0].ack, + // subframe_dl1, harq_ack[subframe_dl1].send_harq_status,harq_ack[subframe_dl1].ack, subframe_rx, pN_bundled[0]); + if (do_reset) { + // reset ACK/NACK status + harq_ack[subframe_dl0].ack = 2; + harq_ack[subframe_dl1].ack = 2; + harq_ack[subframe_dl0].send_harq_status = 0; + harq_ack[subframe_dl1].send_harq_status = 0; + } + break; + case 4: + if (subframe_tx == 2) { // ACK subframes 4, 5 and 0 + subframe_dl0 = 0; + subframe_dl1 = 4; + subframe_dl2 = 5; + subframe_ul = 2; + //printf("subframe_tx 2, TDD config 3: harq_ack[5] = %d (%d),harq_ack[6] = %d (%d)\n",harq_ack[5].ack,harq_ack[5].send_harq_status,harq_ack[6].ack,harq_ack[6].send_harq_status); + } else if (subframe_tx == 3) { // ACK subframes 6, 7 8 and 9 + subframe_dl0 = 7; + subframe_dl1 = 8; + subframe_dl2 = 9; + subframe_dl3 = 6; + subframe_ul = 3; + //printf("Subframe 3, TDD config 3: harq_ack[7] = %d,harq_ack[8] = %d\n",harq_ack[7].ack,harq_ack[8].ack); + //printf("status %d : o_ACK (%d,%d)\n", status,o_ACK[0],o_ACK[1]); + } else { + LOG_E(PHY,"phy_procedures_lte.c: get_ack, illegal subframe_tx %d for tdd_config %d\n", + subframe_tx,frame_parms->tdd_config); + return(0); + } + + // report ACK/NACK status + o_ACK[cw_idx] = 0; + if (harq_ack[subframe_dl0].send_harq_status == 1) + o_ACK[cw_idx] = harq_ack[subframe_dl0].ack; + + if (harq_ack[subframe_dl1].send_harq_status == 1) + o_ACK[cw_idx] &= harq_ack[subframe_dl1].ack; + + if (harq_ack[subframe_dl2].send_harq_status == 1) + o_ACK[cw_idx] &= harq_ack[subframe_dl2].ack; + + if (harq_ack[subframe_dl3].send_harq_status == 1) + o_ACK[cw_idx] &= harq_ack[subframe_dl3].ack; + + pN_bundled[0] = harq_ack[subframe_rx].vDAI_UL; + status = harq_ack[subframe_dl0].send_harq_status + harq_ack[subframe_dl1].send_harq_status + harq_ack[subframe_dl2].send_harq_status + harq_ack[subframe_dl3].send_harq_status; + + LOG_I(PHY,"TDD Config3 UL Sfn %d, dl Sfn0 %d status %d o_Ack %d, dl Sfn1 %d status %d o_Ack %d dl Sfn2 %d status %d o_Ack %d dl Sfn3 %d status %d o_Ack %d subframe_rx %d N_bundled %d status %d\n", + subframe_tx, subframe_dl0, harq_ack[subframe_dl0].send_harq_status,harq_ack[subframe_dl0].ack, + subframe_dl1, harq_ack[subframe_dl1].send_harq_status,harq_ack[subframe_dl1].ack, + subframe_dl2, harq_ack[subframe_dl2].send_harq_status,harq_ack[subframe_dl2].ack, + subframe_dl3, harq_ack[subframe_dl3].send_harq_status,harq_ack[subframe_dl3].ack,subframe_rx, pN_bundled[0], status); + if (do_reset) { + // reset ACK/NACK status + harq_ack[subframe_dl0].ack = 2; + harq_ack[subframe_dl1].ack = 2; + harq_ack[subframe_dl2].ack = 2; + harq_ack[subframe_dl3].ack = 2; + harq_ack[subframe_dl0].send_harq_status = 0; + harq_ack[subframe_dl1].send_harq_status = 0; + harq_ack[subframe_dl2].send_harq_status = 0; + harq_ack[subframe_dl3].send_harq_status = 0; + } + + break; + } } @@ -424,6 +635,30 @@ uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms, return(status); } +uint8_t get_ack(LTE_DL_FRAME_PARMS *frame_parms, + harq_status_t *harq_ack, + unsigned char subframe_tx, + unsigned char subframe_rx, + unsigned char *o_ACK, + uint8_t cw_idx) +{ + uint8_t N_bundled = 0; + return get_reset_ack(frame_parms, harq_ack, subframe_tx, subframe_rx, o_ACK, &N_bundled, cw_idx, 0); +} + +uint8_t reset_ack(LTE_DL_FRAME_PARMS *frame_parms, + harq_status_t *harq_ack, + unsigned char subframe_tx, + unsigned char subframe_rx, + unsigned char *o_ACK, + uint8_t *pN_bundled, + uint8_t cw_idx) +{ + return get_reset_ack(frame_parms, harq_ack, subframe_tx, subframe_rx, o_ACK, pN_bundled, cw_idx, 1); +} + + + uint8_t Np6[4]= {0,1,3,5}; uint8_t Np15[4]= {0,3,8,13}; uint8_t Np25[4]= {0,5,13,22}; @@ -474,6 +709,26 @@ uint16_t get_Np(uint8_t N_RB_DL,uint8_t nCCE,uint8_t plus1) return(Np[0+plus1]); } +int subframe_num(LTE_DL_FRAME_PARMS *frame_parms){ + if (frame_parms->frame_type == FDD) + return 10; + + switch (frame_parms->tdd_config) { + case 1: + return 6; + case 3: + return 7; + case 4: + return 8; + case 5: + return 9; + default: + LOG_E(PHY,"Unsupported TDD configuration %d\n",frame_parms->tdd_config); + AssertFatal(frame_parms->tdd_config==1 || frame_parms->tdd_config==3 || frame_parms->tdd_config==4 || frame_parms->tdd_config==5,"subframe x Unsupported TDD configuration"); + return(255); + } +} + lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe) { @@ -516,20 +771,70 @@ lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,unsigned char sub return(255); } + case 4: + if ((subframe<1) || (subframe>=4)) + return(SF_DL); + else if ((subframe>1) && (subframe < 4)) + return(SF_UL); + else if (subframe==1) + return (SF_S); + else { + LOG_E(PHY,"[PHY_PROCEDURES_LTE] Unknown subframe number\n"); + return(255); + } + + case 5: + if ((subframe<1) || (subframe>=3)) + return(SF_DL); + else if ((subframe>1) && (subframe < 3)) + return(SF_UL); + else if (subframe==1) + return (SF_S); + else { + LOG_E(PHY,"[PHY_PROCEDURES_LTE] Unknown subframe number\n"); + return(255); + } break; default: - LOG_E(PHY,"subframe %d Unsupported TDD configuration %d\n",subframe,frame_parms->tdd_config); - mac_xface->macphy_exit("subframe x Unsupported TDD configuration"); + AssertFatal(1==0,"subframe %d Unsupported TDD configuration %d\n",subframe,frame_parms->tdd_config); return(255); } } +dci_detect_mode_t dci_detect_mode_select(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe) +{ + dci_detect_mode_t ret = 0; + + static dci_detect_mode_t Table_8_2_3gpp_36_213[][10] = { + //subf0 , subf1 , subf2 , subf3 , subf4 , subf5 , subf6 , subf7 , subf8 , subf9 + {UL_DL_DCI, UL_DL_DCI , NO_DCI , NO_DCI , NO_DCI , UL_DL_DCI , UL_DL_DCI , NO_DCI, NO_DCI , NO_DCI }, // tdd0 + {DL_DCI , UL_DL_DCI , NO_DCI , NO_DCI , UL_DL_DCI , DL_DCI , UL_DL_DCI , NO_DCI, NO_DCI , UL_DL_DCI }, // tdd1 + {DL_DCI , DL_DCI , NO_DCI , UL_DL_DCI , DL_DCI , DL_DCI , DL_DCI , NO_DCI, UL_DL_DCI , DL_DCI }, // tdd2 + {UL_DL_DCI, DL_DCI , NO_DCI , NO_DCI , NO_DCI , DL_DCI , DL_DCI , DL_DCI, UL_DL_DCI , UL_DL_DCI }, // tdd3 + {DL_DCI , DL_DCI , NO_DCI , NO_DCI , DL_DCI , DL_DCI , DL_DCI , DL_DCI, UL_DL_DCI , UL_DL_DCI }, // tdd4 + {DL_DCI , DL_DCI , NO_DCI , DL_DCI , DL_DCI , DL_DCI , DL_DCI , DL_DCI, UL_DL_DCI , DL_DCI }, // tdd5 + {UL_DL_DCI, UL_DL_DCI , NO_DCI , NO_DCI , NO_DCI , UL_DL_DCI , UL_DL_DCI , NO_DCI, NO_DCI , UL_DL_DCI }}; // tdd6 + + + DevAssert(subframe>=0 && subframe<=9); + DevAssert((frame_parms->tdd_config)>=0 && (frame_parms->tdd_config)<=6); + + if (frame_parms->frame_type == FDD) { + ret = UL_DL_DCI; + } else { + ret = Table_8_2_3gpp_36_213[frame_parms->tdd_config][subframe]; + } + + LOG_D(PHY, "subframe %d: detect UL_DCI=%d, detect DL_DCI=%d\n", subframe, (ret & UL_DCI)>0, (ret & DL_DCI)>0); + return ret; +} + lte_subframe_t get_subframe_direction(uint8_t Mod_id,uint8_t CC_id,uint8_t subframe) { - return(subframe_select(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,subframe)); + return(subframe_select(&RC.eNB[Mod_id][CC_id]->frame_parms,subframe)); } @@ -562,13 +867,13 @@ unsigned int is_phich_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsigned char sub break; case 4: - if ((subframe == 0) || (subframe == 8) ) + if ((subframe == 8) || (subframe == 9) ) return(1); break; case 5: - if (subframe == 0) + if (subframe == 8) return(1); break; @@ -583,256 +888,181 @@ unsigned int is_phich_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsigned char sub } -#ifdef LOCALIZATION -double aggregate_eNB_UE_localization_stats(PHY_VARS_eNB *phy_vars_eNB, int8_t UE_id, frame_t frame, sub_frame_t subframe, int32_t UE_tx_power_dB) -{ - // parameters declaration - int8_t Mod_id, CC_id; - // int32_t harq_pid; - int32_t avg_power, avg_rssi, median_power, median_rssi, median_subcarrier_rss, median_TA, median_TA_update, ref_timestamp_ms, current_timestamp_ms; - char cqis[100], sub_powers[2048]; - int len = 0, i; - struct timeval ts; - double sys_bw = 0; - uint8_t N_RB_DL; - LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - Mod_id = phy_vars_eNB->Mod_id; - CC_id = phy_vars_eNB->CC_id; - ref_timestamp_ms = phy_vars_eNB->ulsch_eNB[UE_id+1]->reference_timestamp_ms; - - for (i=0; i<13; i++) { - len += sprintf(&cqis[len]," %d ", phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].DL_subband_cqi[0][i]); - } - - len = 0; - - for (i=0; ilte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier; i++) { - len += sprintf(&sub_powers[len]," %d ", phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->subcarrier_power[i]); - } - - gettimeofday(&ts, NULL); - current_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000; - - - LOG_D(LOCALIZE, " PHY: [UE %x/%d -> eNB %d], timestamp %d, " - "frame %d, subframe %d" - "UE Tx power %d dBm, " - "RSSI ant1 %d dBm, " - "RSSI ant2 %d dBm, " - "pwr ant1 %d dBm, " - "pwr ant2 %d dBm, " - "Rx gain %d dB, " - "TA %d, " - "TA update %d, " - "DL_CQI (%d,%d), " - "Wideband CQI (%d,%d), " - "DL Subband CQI[13] %s \n", - // "timestamp %d, (%d active subcarrier) %s \n" - phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->rnti, UE_id, Mod_id, current_timestamp_ms, - frame,subframe, - UE_tx_power_dB, - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[1], - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[1]), - phy_vars_eNB->rx_total_gain_eNB_dB, - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset, // raw timing advance 1/sampling rate - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].timing_advance_update, - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].DL_cqi[0],phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].DL_cqi[1], - phy_vars_eNB->PHY_measurements_eNB[Mod_id].wideband_cqi_dB[(uint32_t)UE_id][0], - phy_vars_eNB->PHY_measurements_eNB[Mod_id].wideband_cqi_dB[(uint32_t)UE_id][1], - cqis); - LOG_D(LOCALIZE, " PHY: timestamp %d, (%d active subcarrier) %s \n", - current_timestamp_ms, - phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier, - sub_powers); - - N_RB_DL = frame_parms->N_RB_DL; - - switch (N_RB_DL) { - case 6: - sys_bw = 1.92; - break; - - case 25: - sys_bw = 7.68; - break; - - case 50: - sys_bw = 15.36; - break; - - case 100: - sys_bw = 30.72; - break; - } - - if ((current_timestamp_ms - ref_timestamp_ms > phy_vars_eNB->ulsch_eNB[UE_id+1]->aggregation_period_ms)) { - // check the size of one list to be sure there was a message transmitted during the defined aggregation period - - // make the reference timestamp == current timestamp - phy_vars_eNB->ulsch_eNB[UE_id+1]->reference_timestamp_ms = current_timestamp_ms; - int i; - - for (i=0; i<10; i++) { - median_power = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list[i]); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list[i]); - median_rssi = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list[i]); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list[i]); - median_subcarrier_rss = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list[i]); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list[i]); - median_TA = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list[i]); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list[i]); - median_TA_update = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list[i]); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list[i]); - - if (median_power != 0) - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rss_list,median_power); - - if (median_rssi != 0) - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rssi_list,median_rssi); - - if (median_subcarrier_rss != 0) - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_subcarrier_rss_list,median_subcarrier_rss); - - if (median_TA != 0) - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_advance_list,median_TA); - - if (median_TA_update != 0) - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_update_list,median_TA_update); - - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list[i]); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list[i]); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list[i]); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list[i]); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list[i]); - } - - median_power = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rss_list); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rss_list); - median_rssi = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rssi_list); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rssi_list); - median_subcarrier_rss = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_subcarrier_rss_list); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_subcarrier_rss_list); - median_TA = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_advance_list); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_advance_list); - median_TA_update = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_update_list); - del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_update_list); - - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rss_list); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_subcarrier_rss_list); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_rssi_list); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_advance_list); - initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->tot_loc_timing_update_list); - - double alpha = 2, power_distance, time_distance; - // distance = 10^((Ptx - Prx - A)/10alpha), A is a constance experimentally evaluated - // A includes the rx gain (phy_vars_eNB->rx_total_gain_eNB_dB) and hardware calibration - power_distance = pow(10, ((UE_tx_power_dB - median_power - phy_vars_eNB->rx_total_gain_eNB_dB + 133)/(10.0*alpha))); - /* current measurements shows constant UE_timing_offset = 18 - and timing_advance_update = 11 at 1m. at 5m, timing_advance_update = 12*/ - //time_distance = (double) 299792458*(phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].timing_advance_update)/(sys_bw*1000000); - time_distance = (double) abs(phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].timing_advance_update - 11) * 4.89;// (3 x 108 x 1 / (15000 x 2048)) / 2 = 4.89 m - - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].distance.time_based = time_distance; - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].distance.power_based = power_distance; - - LOG_D(LOCALIZE, " PHY agg [UE %x/%d -> eNB %d], timestamp %d, " - "frame %d, subframe %d " - "UE Tx power %d dBm, " - "median RSSI %d dBm, " - "median Power %d dBm, " - "Rx gain %d dB, " - "power estimated r = %0.3f, " - " TA %d, update %d " - "TA estimated r = %0.3f\n" - ,phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->rnti, UE_id, Mod_id, current_timestamp_ms, - frame, subframe, - UE_tx_power_dB, - median_rssi, - median_power, - phy_vars_eNB->rx_total_gain_eNB_dB, - power_distance, - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset, median_TA_update, - time_distance); - - return 0; - } else { - avg_power = (dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[0]) + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[1]))/2; - avg_rssi = (phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[0] + phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[1])/2; - - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list[subframe],avg_power); - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list[subframe],avg_rssi); - - for (i=0; ilte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier; i++) { - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list[subframe], phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->subcarrier_power[i]); - } - - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list[subframe], phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset); - push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list[subframe], phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].timing_advance_update); - return -1; - } -} -#endif -LTE_eNB_UE_stats* get_eNB_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti) +/* +LTE_eNB_UE_stats* get_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti) { int8_t UE_id; - if ((PHY_vars_eNB_g == NULL) || (PHY_vars_eNB_g[Mod_id] == NULL) || (PHY_vars_eNB_g[Mod_id][CC_id]==NULL)) { - LOG_E(PHY,"get_eNB_UE_stats: No phy_vars_eNB found (or not allocated) for Mod_id %d,CC_id %d\n",Mod_id,CC_id); + if ((RC.eNB == NULL) || (Mod_id > RC.nb_inst) || (CC_id > RC.nb_CC[Mod_id])) { + LOG_E(PHY,"get_UE_stats: No eNB found (or not allocated) for Mod_id %d,CC_id %d\n",Mod_id,CC_id); return NULL; } - UE_id = find_ue(rnti, PHY_vars_eNB_g[Mod_id][CC_id]); + UE_id = find_ue(rnti, RC.eNB[Mod_id][CC_id]); if (UE_id == -1) { - // LOG_E(PHY,"get_eNB_UE_stats: UE with rnti %x not found\n",rnti); + // LOG_E(PHY,"get_UE_stats: UE with rnti %x not found\n",rnti); return NULL; } - return(&PHY_vars_eNB_g[Mod_id][CC_id]->eNB_UE_stats[(uint32_t)UE_id]); -} - -int8_t find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB) -{ - uint8_t i; - - for (i=0; idlsch_eNB[i]) && - (phy_vars_eNB->dlsch_eNB[i][0]) && - (phy_vars_eNB->dlsch_eNB[i][0]->rnti==rnti)) { - return(i); - } - } - -#ifdef CBA - - for (i=0; iulsch_eNB[i]) && // ue J is the representative of group j - (phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups) && - (phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i]== rnti)) - return(i); - } - -#endif - - return(-1); + return(&RC.eNB[Mod_id][CC_id]->UE_stats[(uint32_t)UE_id]); } +*/ +/* LTE_DL_FRAME_PARMS* get_lte_frame_parms(module_id_t Mod_id, uint8_t CC_id) { - return(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms); + return(&RC.eNB[Mod_id][CC_id]->frame_parms); } MU_MIMO_mode *get_mu_mimo_mode (module_id_t Mod_id, uint8_t CC_id, rnti_t rnti) { - int8_t UE_id = find_ue( rnti, PHY_vars_eNB_g[Mod_id][CC_id] ); + int8_t UE_id = find_ue( rnti, RC.eNB[Mod_id][CC_id] ); if (UE_id == -1) return 0; - return &PHY_vars_eNB_g[Mod_id][CC_id]->mu_mimo_mode[UE_id]; + return &RC.eNB[Mod_id][CC_id]->mu_mimo_mode[UE_id]; +} +*/ + +int is_srs_occasion_common(LTE_DL_FRAME_PARMS *frame_parms,int frame_tx,int subframe_tx) +{ + uint8_t isSubframeSRS = 0; // SRS Cell Occasion + + //ue->ulsch[eNB_id]->srs_active = 0; + //ue->ulsch[eNB_id]->Nsymb_pusch = 12-(frame_parms->Ncp<<1)- ue->ulsch[eNB_id]->srs_active; + if(frame_parms->soundingrs_ul_config_common.enabled_flag) + { + + //LOG_D(PHY," SRS SUBFRAMECONFIG: %d\n", frame_parms->soundingrs_ul_config_common.srs_SubframeConfig); + + uint8_t TSFC; + uint16_t deltaTSFC; // bitmap + uint8_t srs_SubframeConfig; + + // table resuming TSFC (Period) and deltaSFC (offset) + const uint16_t deltaTSFCTabType1[15][2] = { {1,1},{1,2},{2,2},{1,5},{2,5},{4,5},{8,5},{3,5},{12,5},{1,10},{2,10},{4,10},{8,10},{351,10},{383,10} }; // Table 5.5.3.3-2 3GPP 36.211 FDD + const uint16_t deltaTSFCTabType2[14][2] = { {2,5},{6,5},{10,5},{18,5},{14,5},{22,5},{26,5},{30,5},{70,10},{74,10},{194,10},{326,10},{586,10},{210,10} }; // Table 5.5.3.3-2 3GPP 36.211 TDD + + srs_SubframeConfig = frame_parms->soundingrs_ul_config_common.srs_SubframeConfig; + if (FDD == frame_parms->frame_type) + { + // srs_SubframeConfig =< 14 + deltaTSFC = deltaTSFCTabType1[srs_SubframeConfig][0]; + TSFC = deltaTSFCTabType1[srs_SubframeConfig][1]; + } + else + { + // srs_SubframeConfig =< 13 + deltaTSFC = deltaTSFCTabType2[srs_SubframeConfig][0]; + TSFC = deltaTSFCTabType2[srs_SubframeConfig][1]; + } + + // Sounding reference signal subframes are the subframes satisfying ns/2 mod TSFC (- deltaTSFC + uint16_t tmp = (subframe_tx % TSFC); + if((1<frame_type, TSFC, deltaTSFC, frame_tx, subframe_tx); + } + //LOG_D(PHY," isSubframeSRS %d\n", isSubframeSRS); + return(isSubframeSRS); +} + +void compute_srs_pos(lte_frame_type_t frameType,uint16_t isrs,uint16_t *psrsPeriodicity,uint16_t *psrsOffset) +{ + if(TDD == frameType) + { + AssertFatal(isrs>=10,"2 ms SRS periodicity not supported"); + + if((isrs>9)&&(isrs<15)) + { + *psrsPeriodicity=5; + *psrsOffset=isrs-10; + } + if((isrs>14)&&(isrs<25)) + { + *psrsPeriodicity=10; + *psrsOffset=isrs-15; + } + if((isrs>24)&&(isrs<45)) + { + *psrsPeriodicity=20; + *psrsOffset=isrs-25; + } + if((isrs>44)&&(isrs<85)) + { + *psrsPeriodicity=40; + *psrsOffset=isrs-45; + } + if((isrs>84)&&(isrs<165)) + { + *psrsPeriodicity=80; + *psrsOffset=isrs-85; + } + if((isrs>164)&&(isrs<325)) + { + *psrsPeriodicity=160; + *psrsOffset=isrs-165; + } + if((isrs>324)&&(isrs<645)) + { + *psrsPeriodicity=320; + *psrsOffset=isrs-325; + } + + AssertFatal(isrs<=644,"Isrs out of range %d>644\n",isrs); + + } + else + { + if(isrs<2) + { + *psrsPeriodicity=2; + *psrsOffset=isrs; + } + if((isrs>1)&&(isrs<7)) + { + *psrsPeriodicity=5; + *psrsOffset=isrs-2; + } + if((isrs>6)&&(isrs<17)) + { + *psrsPeriodicity=10; + *psrsOffset=isrs-7; + } + if((isrs>16)&&(isrs<37)) + { + *psrsPeriodicity=20; + *psrsOffset=isrs-17; + } + if((isrs>36)&&(isrs<77)) + { + *psrsPeriodicity=40; + *psrsOffset=isrs-37; + } + if((isrs>76)&&(isrs<157)) + { + *psrsPeriodicity=80; + *psrsOffset=isrs-77; + } + if((isrs>156)&&(isrs<317)) + { + *psrsPeriodicity=160; + *psrsOffset=isrs-157; + } + if((isrs>316)&&(isrs<637)) + { + *psrsPeriodicity=320; + *psrsOffset=isrs-317; + } + AssertFatal(isrs<=636,"Isrs out of range %d>636\n",isrs); + + } } diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c old mode 100755 new mode 100644 index 77a993578a..e426c31110 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1,40 +1,31 @@ - -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file phy_procedures_lte_eNB.c * \brief Implementation of eNB procedures from 36.213 LTE specifications - * \author R. Knopp, F. Kaltenberger, N. Nikaein + * \author R. Knopp, F. Kaltenberger, N. Nikaein, X. Foukas * \date 2011 * \version 0.1 * \company Eurecom - * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,navid.nikaein@eurecom.fr + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,navid.nikaein@eurecom.fr, x.foukas@sms.ed.ac.uk * \note * \warning */ @@ -43,16 +34,8 @@ #include "PHY/extern.h" #include "SCHED/defs.h" #include "SCHED/extern.h" - -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif - -//#define DEBUG_PHY_PROC (Already defined in cmake) -//#define DEBUG_ULSCH - -#include "LAYER2/MAC/extern.h" -#include "LAYER2/MAC/defs.h" +#include "nfapi_interface.h" +#include "fapi_l1.h" #include "UTIL/LOG/log.h" #include "UTIL/LOG/vcd_signal_dumper.h" @@ -61,3474 +44,2047 @@ #include "assertions.h" #include "msc.h" +#include + #if defined(ENABLE_ITTI) # include "intertask_interface.h" -# if ENABLE_RAL -# include "timer.h" -# endif #endif -//#define DIAG_PHY +extern uint8_t nfapi_mode; +int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind); -#define NS_PER_SLOT 500000 -#define PUCCH 1 -extern int exit_openair; +void pmch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,PHY_VARS_RN *rn,relaying_type_t r_type) { -unsigned char dlsch_input_buffer[2700] __attribute__ ((aligned(32))); -int eNB_sync_buffer0[640*6] __attribute__ ((aligned(32))); -int eNB_sync_buffer1[640*6] __attribute__ ((aligned(32))); -int *eNB_sync_buffer[2] = {eNB_sync_buffer0, eNB_sync_buffer1}; - -extern uint16_t hundred_times_log10_NPRB[100]; - -unsigned int max_peak_val; -int max_sync_pos; - -//DCI_ALLOC_t dci_alloc[8]; - -#ifdef EMOS -fifo_dump_emos_eNB emos_dump_eNB; -#endif - -#if defined(SMBV) && !defined(EXMIMO) -extern const char smbv_fname[]; -extern unsigned short config_frames[4]; -extern uint8_t smbv_frame_cnt; -#endif - -#ifdef DIAG_PHY -extern int rx_sig_fifo; -#endif - -uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t sched_subframe) -{ - - const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking for SR TXOp(sr_ConfigIndex %d)\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe, - phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex); - - if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 4) { // 5 ms SR period - if ((subframe%5) == phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex) - return(1); - } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 14) { // 10 ms SR period - if (subframe==(phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-5)) - return(1); - } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 34) { // 20 ms SR period - if ((10*(frame&1)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-15)) - return(1); - } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 74) { // 40 ms SR period - if ((10*(frame&3)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-35)) - return(1); - } else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 154) { // 80 ms SR period - if ((10*(frame&7)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-75)) - return(1); - } - - return(0); -} - -int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB) -{ - uint8_t i; - -#ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d/%d] Adding UE with rnti %x\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - (uint16_t)rnti); -#endif - - for (i=0; idlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) { - MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed add ue %"PRIx16" (ENOMEM)", rnti); - LOG_E(PHY,"Can't add UE, not enough memory allocated\n"); - return(-1); - } else { - if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) { - MSC_LOG_EVENT(MSC_PHY_ENB, "0 Add ue %"PRIx16" ", rnti); - LOG_D(PHY,"UE_id %d associated with rnti %x\n",i, (uint16_t)rnti); - phy_vars_eNB->dlsch_eNB[i][0]->rnti = rnti; - phy_vars_eNB->ulsch_eNB[i]->rnti = rnti; - phy_vars_eNB->eNB_UE_stats[i].crnti = rnti; - - phy_vars_eNB->eNB_UE_stats[i].Po_PUCCH1_below = 0; - phy_vars_eNB->eNB_UE_stats[i].Po_PUCCH1_above = (int32_t)pow(10.0,.1*(phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+phy_vars_eNB->rx_total_gain_eNB_dB)); - phy_vars_eNB->eNB_UE_stats[i].Po_PUCCH = (int32_t)pow(10.0,.1*(phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+phy_vars_eNB->rx_total_gain_eNB_dB)); - LOG_D(PHY,"Initializing Po_PUCCH: p0_NominalPUCCH %d, gain %d => %d\n", - phy_vars_eNB->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH, - phy_vars_eNB->rx_total_gain_eNB_dB, - phy_vars_eNB->eNB_UE_stats[i].Po_PUCCH); - - return(i); - } - } - } - return(-1); -} - -int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) { - uint8_t i; - int j,CC_id; - PHY_VARS_eNB *phy_vars_eNB; - - for (CC_id=0;CC_iddlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) { - MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (ENOMEM)", rnti); - LOG_E(PHY,"Can't remove UE, not enough memory allocated\n"); - return(-1); - } else { - if (phy_vars_eNB->eNB_UE_stats[i].crnti==rntiP) { - MSC_LOG_EVENT(MSC_PHY_ENB, "0 Removed ue %"PRIx16" ", rntiP); -#ifdef DEBUG_PHY_PROC - LOG_I(PHY,"eNB %d removing UE %d with rnti %x\n",phy_vars_eNB->Mod_id,i,rnti); -#endif - //msg("[PHY] UE_id %d\n",i); - clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0]); - clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i]); - //phy_vars_eNB->eNB_UE_stats[i].crnti = 0; - memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats)); - // mac_exit_wrapper("Removing UE"); - - return(i); - } - } - } - } - MSC_LOG_EVENT(MSC_PHY_ENB, "0 Failed remove ue %"PRIx16" (not found)", rntiP); - return(-1); -} - -int8_t find_next_ue_index(PHY_VARS_eNB *phy_vars_eNB) -{ - uint8_t i; - - for (i=0; ieNB_UE_stats[i].crnti==0) { - /*if ((phy_vars_eNB->dlsch_eNB[i]) && - (phy_vars_eNB->dlsch_eNB[i][0]) && - (phy_vars_eNB->dlsch_eNB[i][0]->rnti==0))*/ - LOG_D(PHY,"Next free UE id is %d\n",i); - return(i); - } - } - - return(-1); -} - -int get_ue_active_harq_pid(const uint8_t Mod_id,const uint8_t CC_id,const uint16_t rnti, const int frame, const uint8_t subframe,uint8_t *harq_pid,uint8_t *round,const uint8_t ul_flag) -{ - LTE_eNB_DLSCH_t *DLSCH_ptr; - LTE_eNB_ULSCH_t *ULSCH_ptr; - uint8_t ulsch_subframe,ulsch_frame; - int i; - int8_t UE_id = find_ue(rnti,PHY_vars_eNB_g[Mod_id][CC_id]); - - if (UE_id==-1) { - LOG_D(PHY,"Cannot find UE with rnti %x (Mod_id %d, CC_id %d)\n",rnti, Mod_id, CC_id); - *round=0; - return(-1); - } - - if (ul_flag == 0) {// this is a DL request - DLSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->dlsch_eNB[(uint32_t)UE_id][0]; - - /* let's go synchronous for the moment - maybe we can change at some point */ - i = (frame * 10 + subframe) % 8; - - if (DLSCH_ptr->harq_processes[i]->status == ACTIVE) { - *harq_pid = i; - *round = DLSCH_ptr->harq_processes[i]->round; - } else if (DLSCH_ptr->harq_processes[i]->status == SCH_IDLE) { - *harq_pid = i; - *round = 0; - } else { - printf("%s:%d: bad state for harq process - PLEASE REPORT!!\n", __FILE__, __LINE__); - abort(); - } - } else { // This is a UL request - - ULSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->ulsch_eNB[(uint32_t)UE_id]; - ulsch_subframe = pdcch_alloc2ul_subframe(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,subframe); - ulsch_frame = pdcch_alloc2ul_frame(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,frame,subframe); - // Note this is for TDD configuration 3,4,5 only - *harq_pid = subframe2harq_pid(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms, - ulsch_frame, - ulsch_subframe); - *round = ULSCH_ptr->harq_processes[*harq_pid]->round; - LOG_T(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Checking HARQ, round %d\n",Mod_id,*harq_pid,frame,subframe,*round); - } - - return(0); -} - -int16_t get_target_pusch_rx_power(const module_id_t module_idP, const uint8_t CC_id) -{ - //return PHY_vars_eNB_g[module_idP][CC_id]->PHY_measurements_eNB[0].n0_power_tot_dBm; - return PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH; -} - -int16_t get_target_pucch_rx_power(const module_id_t module_idP, const uint8_t CC_id) -{ - //return PHY_vars_eNB_g[module_idP][CC_id]->PHY_measurements_eNB[0].n0_power_tot_dBm; - return PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH; -} - -#ifdef EMOS -void phy_procedures_emos_eNB_TX(unsigned char subframe, PHY_VARS_eNB *phy_vars_eNB) -{ - -} -#endif - - - -void phy_procedures_eNB_S_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type) -{ - UNUSED(r_type); - - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_S_RX(%d)\n", phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_rx, subframe); -#endif - - - if (abstraction_flag == 0) { - lte_eNB_I0_measurements(phy_vars_eNB, - subframe, - 0, - phy_vars_eNB->first_run_I0_measurements); - } - -#ifdef PHY_ABSTRACTION - else { - lte_eNB_I0_measurements_emul(phy_vars_eNB, - 0); - } - -#endif - - -} - - - -#ifdef EMOS -void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB) -{ - - uint8_t aa; - uint16_t last_subframe_emos; - uint16_t pilot_pos1 = 3 - phy_vars_eNB->lte_frame_parms.Ncp, pilot_pos2 = 10 - 2*phy_vars_eNB->lte_frame_parms.Ncp; - uint32_t bytes; - - last_subframe_emos=0; - - - - -#ifdef EMOS_CHANNEL - - //if (last_slot%2==1) // this is for all UL subframes - if (subframe==3) - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { - memcpy(&emos_dump_eNB.channel[aa][last_subframe_emos*2*phy_vars_eNB->lte_frame_parms.N_RB_UL*12], - &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos1], - phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int)); - memcpy(&emos_dump_eNB.channel[aa][(last_subframe_emos*2+1)*phy_vars_eNB->lte_frame_parms.N_RB_UL*12], - &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos2], - phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int)); - } - -#endif - - if (subframe==4) { - emos_dump_eNB.timestamp = rt_get_time_ns(); - emos_dump_eNB.frame_tx = phy_vars_eNB->proc[subframe].frame_rx; - emos_dump_eNB.rx_total_gain_dB = phy_vars_eNB->rx_total_gain_eNB_dB; - emos_dump_eNB.mimo_mode = phy_vars_eNB->transmission_mode[0]; - memcpy(&emos_dump_eNB.PHY_measurements_eNB, - &phy_vars_eNB->PHY_measurements_eNB[0], - sizeof(PHY_MEASUREMENTS_eNB)); - memcpy(&emos_dump_eNB.eNB_UE_stats[0],&phy_vars_eNB->eNB_UE_stats[0],NUMBER_OF_UE_MAX*sizeof(LTE_eNB_UE_stats)); - - bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_eNB, sizeof(fifo_dump_emos_eNB)); - - //bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, "test", sizeof("test")); - if (bytes!=sizeof(fifo_dump_emos_eNB)) { - LOG_W(PHY,"[eNB %d] Frame %d, subframe %d, Problem writing EMOS data to FIFO (bytes=%d, size=%d)\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[(subframe+1)%10].frame_rx, subframe,bytes,sizeof(fifo_dump_emos_eNB)); - } else { - if (phy_vars_eNB->proc[(subframe+1)%10].frame_tx%100==0) { - LOG_I(PHY,"[eNB %d] Frame %d (%d), subframe %d, Writing %d bytes EMOS data to FIFO\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[(subframe+1)%10].frame_rx, ((fifo_dump_emos_eNB*)&emos_dump_eNB)->frame_tx, subframe, bytes); - } - } - } -} -#endif - - -#define AMP_OVER_SQRT2 ((AMP*ONE_OVER_SQRT2_Q15)>>15) -#define AMP_OVER_2 (AMP>>1) -int QPSK[4]= {AMP_OVER_SQRT2|(AMP_OVER_SQRT2<<16),AMP_OVER_SQRT2|((65536-AMP_OVER_SQRT2)<<16),((65536-AMP_OVER_SQRT2)<<16)|AMP_OVER_SQRT2,((65536-AMP_OVER_SQRT2)<<16)|(65536-AMP_OVER_SQRT2)}; -int QPSK2[4]= {AMP_OVER_2|(AMP_OVER_2<<16),AMP_OVER_2|((65536-AMP_OVER_2)<<16),((65536-AMP_OVER_2)<<16)|AMP_OVER_2,((65536-AMP_OVER_2)<<16)|(65536-AMP_OVER_2)}; - - -#if defined(ENABLE_ITTI) -# if ENABLE_RAL -extern PHY_MEASUREMENTS PHY_measurements; - -void phy_eNB_lte_measurement_thresholds_test_and_report(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP, uint16_t valP) -{ - MessageDef *message_p = NULL; - - if ( - ( - ((threshold_phy_pP->threshold.threshold_val < valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_ABOVE_THRESHOLD)) || - ((threshold_phy_pP->threshold.threshold_val > valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_BELOW_THRESHOLD)) - ) || - (threshold_phy_pP->threshold.threshold_xdir == RAL_NO_THRESHOLD) - ) { - message_p = itti_alloc_new_message(TASK_PHY_ENB , PHY_MEAS_REPORT_IND); - memset(&PHY_MEAS_REPORT_IND(message_p), 0, sizeof(PHY_MEAS_REPORT_IND(message_p))); - - memcpy(&PHY_MEAS_REPORT_IND (message_p).threshold, - &threshold_phy_pP->threshold, - sizeof(PHY_MEAS_REPORT_IND (message_p).threshold)); - - memcpy(&PHY_MEAS_REPORT_IND (message_p).link_param, - &threshold_phy_pP->link_param, - sizeof(PHY_MEAS_REPORT_IND (message_p).link_param)); - \ - - switch (threshold_phy_pP->link_param.choice) { - case RAL_LINK_PARAM_CHOICE_LINK_PARAM_VAL: - PHY_MEAS_REPORT_IND (message_p).link_param._union.link_param_val = valP; - break; - - case RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL: - //PHY_MEAS_REPORT_IND (message_p).link_param._union.qos_param_val. - AssertFatal (1 == 0, "TO DO RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL\n"); - break; - } - - itti_send_msg_to_task(TASK_RRC_ENB, instanceP, message_p); - } -} - -void phy_eNB_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP) -{ - unsigned int mod_id; - - mod_id = instanceP; - - switch (threshold_phy_pP->link_param.link_param_type.choice) { - - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_GEN_DATA_RATE: - phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH: - phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_SINR: - phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_THROUGHPUT: - break; - - case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE: - break; - - default: - ; - } - - break; - - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_LTE_UE_RSRP: - break; - - case RAL_LINK_PARAM_LTE_UE_RSRQ: - break; - - case RAL_LINK_PARAM_LTE_UE_CQI: - break; - - case RAL_LINK_PARAM_LTE_AVAILABLE_BW: - break; - - case RAL_LINK_PARAM_LTE_PACKET_DELAY: - break; - - case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE: - break; - - case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS: - break; - - case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES: - break; - - case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY: - break; - - case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY: - break; - - case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS: - break; - - case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW: - break; - - default: - ; - } - - break; - - default: - ; - } -} -# endif -#endif - - -unsigned int taus(void); -DCI_PDU DCI_pdu_tmp; - -void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag, - relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) -{ - UNUSED(phy_vars_rn); - uint8_t *pbch_pdu=&phy_vars_eNB->pbch_pdu[0]; - uint16_t input_buffer_length, re_allocated=0; - uint32_t i,aa; - uint8_t harq_pid; - DCI_PDU *DCI_pdu; - uint8_t *DLSCH_pdu=NULL; - //DCI_PDU DCI_pdu_tmp; - uint8_t DLSCH_pdu_tmp[768*8]; - int8_t UE_id; - uint8_t num_pdcch_symbols=0; - uint8_t ul_subframe; - uint32_t ul_frame; -#ifdef Rel10 - MCH_PDU *mch_pduP; +#if defined(Rel10) || defined(Rel14) + MCH_PDU *mch_pduP=NULL; MCH_PDU mch_pdu; // uint8_t sync_area=255; #endif -#if defined(SMBV) && !defined(EXMIMO) - // counts number of allocations in subframe - // there is at least one allocation for PDCCH - uint8_t smbv_alloc_cnt = 1; -#endif - int frame = phy_vars_eNB->proc[sched_subframe].frame_tx; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1); - start_meas(&phy_vars_eNB->phy_proc_tx); + int subframe = proc->subframe_tx; - T(T_ENB_PHY_DL_TICK, T_INT(phy_vars_eNB->Mod_id), T_INT(frame), T_INT(subframe)); + AssertFatal(1==0,"pmch not tested for the moment, exiting\n"); - for (i=0; icommon_vars.txdataF, + AMP, + subframe<<1,1); - if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) { - LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->CC_id,frame,subframe, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors); - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; - mac_xface->UL_failure_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->eNB_UE_stats[i].crnti, - subframe); - - } - - - } - - - // Get scheduling info for next subframe - if (phy_vars_eNB->mac_enabled==1) { - if (phy_vars_eNB->CC_id == 0) { - mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);//,1); - } - } - - if (abstraction_flag==0) { - // clear the transmit data array for the current subframe - for (aa=0; aalte_frame_parms.nb_antennas_tx_eNB; aa++) { - - memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][subframe*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)], - 0,phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(int32_t)); - } - } - - - if (is_pmch_subframe(phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,&phy_vars_eNB->lte_frame_parms)) { - - if (abstraction_flag==0) { - // This is DL-Cell spec pilots in Control region - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe<<1,1); - } - -#ifdef Rel10 - // if mcch is active, send regardless of the node type: eNB or RN - // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing - mch_pduP = mac_xface->get_mch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe); - - switch (r_type) { - case no_relay: - if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 - LOG_I(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->mcs, - phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3); - else { - LOG_D(PHY,"[DeNB %"PRIu8"] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %"PRIu8" (%s)\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->sync_area, - (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment"); - mch_pduP = NULL; - } - - break; - - case multicast_relay: - if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)) { - LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Got the MCH PDU for MBSFN sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", - phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe, - mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size); - } else if (phy_vars_rn->mch_avtive[subframe%5] == 1) { // SF2 -> SF7, SF3 -> SF8 - mch_pduP= &mch_pdu; - memcpy(&mch_pduP->payload, // could be a simple copy - phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->b, - phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); - mch_pduP->Pdu_size = (uint16_t) (phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); - mch_pduP->mcs = phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->mcs; - LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", - phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe,subframe%5, - phy_vars_rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size); - } else { - mch_pduP=NULL; - } - - phy_vars_rn->mch_avtive[subframe]=0; - break; - - default: - LOG_W(PHY,"[eNB %"PRIu8"] Frame %d subframe %d: unknown relaying type %d \n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,r_type); - mch_pduP=NULL; - break; - }// switch - - if (mch_pduP) { - fill_eNB_dlsch_MCH(phy_vars_eNB,mch_pduP->mcs,1,0, abstraction_flag); - // Generate PMCH - generate_mch(phy_vars_eNB,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag); -#ifdef DEBUG_PHY - - for (i=0; iPdu_size; i++) - msg("%2"PRIx8".",(uint8_t)mch_pduP->payload[i]); - - msg("\n"); -#endif - } else { - LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - } - -#endif - } - - else { - // this is not a pmch subframe - - if (abstraction_flag==0) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe<<1,0); - if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_DL) - generate_pilots_slot(phy_vars_eNB, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - (subframe<<1)+1,0); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0); - - // First half of PSS/SSS (FDD) - if (subframe == 0) { - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 0); - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 5 : 4, - 0); - - } - } - } - } - - if (subframe == 0) { - // generate PBCH (Physical Broadcast CHannel) info - if ((phy_vars_eNB->proc[sched_subframe].frame_tx&3) == 0) { - pbch_pdu[2] = 0; - - // FIXME setting pbch_pdu[2] to zero makes the switch statement easier: remove all the or-operators - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (0<<5); - break; - - case 15: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (1<<5); - break; - - case 25: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); - break; - - case 50: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (3<<5); - break; - - case 75: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (4<<5); - break; - - case 100: - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (5<<5); - break; - - default: - // FIXME if we get here, this should be flagged as an error, right? - pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); - break; - } - - pbch_pdu[2] = (pbch_pdu[2]&0xef) | - ((phy_vars_eNB->lte_frame_parms.phich_config_common.phich_duration << 4)&0x10); - - switch (phy_vars_eNB->lte_frame_parms.phich_config_common.phich_resource) { - case oneSixth: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (0<<2); - break; - - case half: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (1<<2); - break; - - case one: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (2<<2); - break; - - case two: - pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (3<<2); - break; - - default: - // unreachable - break; - } - - pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((phy_vars_eNB->proc[sched_subframe].frame_tx>>8)&0x3); - pbch_pdu[1] = phy_vars_eNB->proc[sched_subframe].frame_tx&0xfc; - pbch_pdu[0] = 0; - } - - /// First half of SSS (TDD) - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 1); - } - } - - - - - if (abstraction_flag==0) { - - generate_pbch(&phy_vars_eNB->lte_eNB_pbch, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - pbch_pdu, - phy_vars_eNB->proc[sched_subframe].frame_tx&3); - - } - -#ifdef PHY_ABSTRACTION + +#if defined(Rel10) || defined(Rel14) + // if mcch is active, send regardless of the node type: eNB or RN + // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing + /* + mch_pduP = mac_xface->get_mch_sdu(eNB->Mod_id, + eNB->CC_id, + proc->frame_tx, + subframe); + */ + switch (r_type) { + case no_relay: + if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 + LOG_D(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n", + eNB->Mod_id,proc->frame_tx,subframe,mch_pduP->mcs, + eNB->dlsch_MCH->harq_processes[0]->TBS>>3); else { - generate_pbch_emul(phy_vars_eNB,pbch_pdu); + LOG_D(PHY,"[DeNB %"PRIu8"] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %"PRIu8" (%s)\n", + eNB->Mod_id,proc->frame_tx,subframe,mch_pduP->sync_area, + (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment"); + mch_pduP = NULL; } - + + break; + + case multicast_relay: + if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)) { + LOG_D(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Got the MCH PDU for MBSFN sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", + rn->Mod_id,rn->frame, subframe, + mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size); + } else if (rn->mch_avtive[subframe%5] == 1) { // SF2 -> SF7, SF3 -> SF8 + mch_pduP= &mch_pdu; + memcpy(&mch_pduP->payload, // could be a simple copy + rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->b, + rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); + mch_pduP->Pdu_size = (uint16_t) (rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3); + mch_pduP->mcs = rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->mcs; + LOG_D(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n", + rn->Mod_id,rn->frame, subframe,subframe%5, + rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size); + } else { + mch_pduP=NULL; + } + + rn->mch_avtive[subframe]=0; + break; + + default: + LOG_W(PHY,"[eNB %"PRIu8"] Frame %d subframe %d: unknown relaying type %d \n", + eNB->Mod_id,proc->frame_tx,subframe,r_type); + mch_pduP=NULL; + break; + }// switch + + if (mch_pduP) { + fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0); + // Generate PMCH + generate_mch(eNB,proc,(uint8_t*)mch_pduP->payload); + } else { + LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",proc->frame_tx,subframe); + } + #endif +} +void common_signal_procedures (PHY_VARS_eNB *eNB,int frame, int subframe) { - } + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + int **txdataF = eNB->common_vars.txdataF; + uint8_t *pbch_pdu=&eNB->pbch_pdu[0]; - if (subframe == 1) { + //LOG_D(PHY,"common_signal_procedures: frame %d, subframe %d fdd:%s dir:%s\n",frame,subframe,fp->frame_type == FDD?"FDD":"TDD", subframe_select(fp,subframe) == SF_DL?"DL":"UL?"); - if (abstraction_flag==0) { + // generate Cell-Specific Reference Signals for both slots + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); + generate_pilots_slot(eNB, + txdataF, + AMP, + subframe<<1,0); + // check that 2nd slot is for DL + if (subframe_select(fp,subframe) == SF_DL) + generate_pilots_slot(eNB, + txdataF, + AMP, + (subframe<<1)+1,0); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0); + - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - 2, - 2); - } + // First half of PSS/SSS (FDD, slot 0) + if (subframe == 0) { + if (fp->frame_type == FDD) { + generate_pss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 6 : 5, + 0); + generate_sss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 5 : 4, + 0); + } - } + - // Second half of PSS/SSS (FDD) - if (subframe == 5) { - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 10); - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 5 : 4, - 10); - - } + + /// First half of SSS (TDD, slot 1) + + if (fp->frame_type == TDD) { + generate_sss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 6 : 5, + 1); } - } - // Second-half of SSS (TDD) - if (subframe == 5) { - if (abstraction_flag==0) { + // generate PBCH (Physical Broadcast CHannel) info - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5, - 11); - } + /// generate PBCH + if ((frame&3)==0) { + //AssertFatal(eNB->pbch_configured==1,"PBCH was not configured by MAC\n"); + if (eNB->pbch_configured!=1) return; + eNB->pbch_configured=0; } + generate_pbch(&eNB->pbch, + txdataF, + AMP, + fp, + pbch_pdu, + frame&3); + + } + else if ((subframe == 1) && + (fp->frame_type == TDD)){ + generate_pss(txdataF, + AMP, + fp, + 2, + 2); + } + + // Second half of PSS/SSS (FDD, slot 10) + else if ((subframe == 5) && + (fp->frame_type == FDD)) { + generate_pss(txdataF, + AMP, + &eNB->frame_parms, + (fp->Ncp==NORMAL) ? 6 : 5, + 10); + generate_sss(txdataF, + AMP, + &eNB->frame_parms, + (fp->Ncp==NORMAL) ? 5 : 4, + 10); + } - // Second half of PSS (TDD) - if (subframe == 6) { - - if (abstraction_flag==0) { - - if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - &phy_vars_eNB->lte_frame_parms, - 2, - 12); - } - } + // Second-half of SSS (TDD, slot 11) + else if ((subframe == 5) && + (fp->frame_type == TDD)) { + generate_sss(txdataF, + AMP, + fp, + (fp->Ncp==NORMAL) ? 6 : 5, + 11); } - - -#if defined(SMBV) && !defined(EXMIMO) - - // PBCH takes one allocation - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - if (subframe==0) - smbv_alloc_cnt++; + // Second half of PSS (TDD, slot 12) + else if ((subframe == 6) && + (fp->frame_type == TDD)) { + generate_pss(txdataF, + AMP, + fp, + 2, + 12); } +} + + + +void pdsch_procedures(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + int harq_pid, + LTE_eNB_DLSCH_t *dlsch, + LTE_eNB_DLSCH_t *dlsch1, + LTE_eNB_UE_stats *ue_stats, + int ra_flag) { + + int frame=proc->frame_tx; + int subframe=proc->subframe_tx; + LTE_DL_eNB_HARQ_t *dlsch_harq=dlsch->harq_processes[harq_pid]; + int input_buffer_length = dlsch_harq->TBS/8; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + + if (dlsch->rnti == 0x02) {//frame < 200) { + + LOG_D(PHY, + "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", pdsch_start %d, G %d, nb_rb %"PRIu16", rb0 %x, rb1 %x, TBS %"PRIu16", pmi_alloc %"PRIx64", rv %"PRIu8" (round %"PRIu8")\n", + eNB->Mod_id, dlsch->rnti,harq_pid, + frame, subframe, input_buffer_length, dlsch_harq->pdsch_start, + get_G(fp, + dlsch_harq->nb_rb, + dlsch_harq->rb_alloc, + dlsch_harq->Qm, + dlsch_harq->Nl, + dlsch_harq->pdsch_start, + frame, + subframe, + dlsch_harq->mimo_mode==TM7?7:0), + dlsch_harq->nb_rb, + dlsch_harq->rb_alloc[0], + dlsch_harq->rb_alloc[1], + dlsch_harq->TBS, + pmi2hex_2Ar1(dlsch_harq->pmi_alloc), + dlsch_harq->rvidx, + dlsch_harq->round); + } +#if defined(MESSAGE_CHART_GENERATOR_PHY) + MSC_LOG_TX_MESSAGE( + MSC_PHY_ENB,MSC_PHY_UE, + NULL,0, + "%05u:%02u PDSCH/DLSCH input size = %"PRIu16", G %d, nb_rb %"PRIu16", TBS %"PRIu16", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")", + frame, subframe, + input_buffer_length, + get_G(fp, + dlsch_harq->nb_rb, + dlsch_harq->rb_alloc, + dlsch_harq->Qm, + dlsch_harq->Nl, + dlsch_harq->pdsch_start, + frame, + subframe, + dlsch_harq->mimo_mode==TM7?7:0), + dlsch_harq->nb_rb, + dlsch_harq->TBS, + pmi2hex_2Ar1(dlsch_harq->pmi_alloc), + dlsch_harq->rvidx, + dlsch_harq->round); #endif - - if (phy_vars_eNB->mac_enabled==1) { - // Parse DCI received from MAC - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1); - DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe); - } - else { - DCI_pdu = &DCI_pdu_tmp; -#ifdef EMOS_CHANNEL - fill_dci_emos(DCI_pdu,sched_subframe,phy_vars_eNB); -#else - fill_dci(DCI_pdu,sched_subframe,phy_vars_eNB); + + + if (ue_stats) ue_stats->dlsch_sliding_cnt++; + + if (dlsch_harq->round == 0) { + if (ue_stats) + ue_stats->dlsch_trials[harq_pid][0]++; + } else { + ue_stats->dlsch_trials[harq_pid][dlsch_harq->round]++; +#ifdef DEBUG_PHY_PROC +#ifdef DEBUG_DLSCH + LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n"); #endif +#endif + } + + + LOG_D(PHY,"Generating DLSCH/PDSCH pdu:%p pdsch_start:%d frame:%d subframe:%d nb_rb:%d rb_alloc:%d Qm:%d Nl:%d round:%d\n", + dlsch_harq->pdu,dlsch_harq->pdsch_start,frame,subframe,dlsch_harq->nb_rb,dlsch_harq->rb_alloc[0],dlsch_harq->Qm,dlsch_harq->Nl,dlsch_harq->round); + // 36-212 + if (nfapi_mode == 0 || nfapi_mode == 1) { // monolthic OR PNF - do not need turbo encoding on VNF + + if (dlsch_harq->pdu==NULL){ + LOG_E(PHY,"dlsch_harq->pdu == NULL SFN/SF:%04d%d dlsch[rnti:%x] dlsch_harq[pdu:%p pdsch_start:%d Qm:%d Nl:%d round:%d nb_rb:%d rb_alloc[0]:%d]\n", frame,subframe,dlsch->rnti, dlsch_harq->pdu,dlsch_harq->pdsch_start,dlsch_harq->Qm,dlsch_harq->Nl,dlsch_harq->round,dlsch_harq->nb_rb,dlsch_harq->rb_alloc[0]); + return; + } + + start_meas(&eNB->dlsch_encoding_stats); + + eNB->te(eNB, + dlsch_harq->pdu, + dlsch_harq->pdsch_start, + dlsch, + frame,subframe, + &eNB->dlsch_rate_matching_stats, + &eNB->dlsch_turbo_encoding_stats, + &eNB->dlsch_interleaving_stats); + stop_meas(&eNB->dlsch_encoding_stats); + // 36-211 + start_meas(&eNB->dlsch_scrambling_stats); + dlsch_scrambling(fp, + 0, + dlsch, + harq_pid, + get_G(fp, + dlsch_harq->nb_rb, + dlsch_harq->rb_alloc, + dlsch_harq->Qm, + dlsch_harq->Nl, + dlsch_harq->pdsch_start, + frame,subframe, + 0), + 0, + frame, + subframe<<1); + stop_meas(&eNB->dlsch_scrambling_stats); + + start_meas(&eNB->dlsch_modulation_stats); + + + dlsch_modulation(eNB, + eNB->common_vars.txdataF, + AMP, + subframe, + dlsch_harq->pdsch_start, + dlsch, + dlsch1); + + stop_meas(&eNB->dlsch_modulation_stats); + } + + dlsch->active = 0; + dlsch_harq->round++; + + LOG_D(PHY,"Generating DLSCH/PDSCH dlsch_harq[round:%d]\n",dlsch_harq->round); +} + + + +void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, + eNB_rxtx_proc_t *proc, + relaying_type_t r_type, + PHY_VARS_RN *rn, + int do_meas) +{ + UNUSED(rn); + int frame=proc->frame_tx; + int subframe=proc->subframe_tx; + uint32_t i,aa; + uint8_t harq_pid; + int8_t UE_id=0; + uint8_t num_pdcch_symbols=0; + uint8_t num_dci=0; + uint8_t ul_subframe; + uint32_t ul_frame; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + LTE_UL_eNB_HARQ_t *ulsch_harq; + + int offset = eNB->CC_id;//proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; + + if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)==SF_UL)) return; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,1); + if (do_meas==1) start_meas(&eNB->phy_proc_tx); + + // clear the transmit data array for the current subframe + for (aa=0; aanb_antenna_ports_eNB; aa++) { + memset(&eNB->common_vars.txdataF[aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)], + 0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t)); + } + + + if (nfapi_mode == 0 || nfapi_mode == 1) { + if (is_pmch_subframe(frame,subframe,fp)) { + pmch_procedures(eNB,proc,rn,r_type); + } + else { + // this is not a pmch subframe, so generate PSS/SSS/PBCH + common_signal_procedures(eNB,proc->frame_tx, proc->subframe_tx); + } } // clear existing ulsch dci allocations before applying info from MAC (this is table - ul_subframe = pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe); - ul_frame = pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); + ul_subframe = pdcch_alloc2ul_subframe(fp,subframe); + ul_frame = pdcch_alloc2ul_frame(fp,frame,subframe); - if ((subframe_select(&phy_vars_eNB->lte_frame_parms,ul_subframe)==SF_UL) || - (phy_vars_eNB->lte_frame_parms.frame_type == FDD)) { - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,ul_frame,ul_subframe); - for (i=0; iulsch_eNB[i]) { - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0; - } - } // clear previous allocation information for all UEs for (i=0; idlsch_eNB[i][0]->subframe_tx[subframe] = 0; + if (eNB->dlsch[i][0]) + eNB->dlsch[i][0]->subframe_tx[subframe] = 0; } - - num_pdcch_symbols = DCI_pdu->num_pdcch_symbols; - - LOG_D(PHY,"num_pdcch_symbols %"PRIu8",(dci common %"PRIu8", dci uespec %"PRIu8"\n",num_pdcch_symbols, - DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); - -#if defined(SMBV) && !defined(EXMIMO) - - // Sets up PDCCH and DCI table - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) { - msg("[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); - dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[0]); - smbv_configure_pdcch(smbv_fname,(smbv_frame_cnt*10) + (subframe),num_pdcch_symbols,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci); - } - -#endif - - - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->num_pdcch_symbols); - - for (i=0; iNum_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { - LOG_D(PHY,"[eNB] Subframe %d: DCI %d/%d : rnti %x, CCEind %d\n",subframe,i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,DCI_pdu->dci_alloc[i].rnti,DCI_pdu->dci_alloc[i].firstCCE); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].rnti); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].format); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].firstCCE); - - if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) { - - generate_eNB_dlsch_params_from_dci(frame, - subframe, - &DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].format, - &phy_vars_eNB->dlsch_eNB_SI, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - - phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; - - LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe],DCI_pdu->dci_alloc[i].firstCCE); - -#if defined(SMBV) && !defined(EXMIMO) - - // configure SI DCI - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "SI", &DCI_pdu->dci_alloc[i], i); - } - -#endif - - - } else if (DCI_pdu->dci_alloc[i].ra_flag == 1) { - - generate_eNB_dlsch_params_from_dci(frame, - subframe, - &DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].format, - &phy_vars_eNB->dlsch_eNB_ra, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - DCI_pdu->dci_alloc[i].rnti, - P_RNTI, - phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - - phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; - - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA) => %"PRIu8"/%u (num_pdcch_symbols %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe],get_nCCE_mac(phy_vars_eNB->Mod_id,phy_vars_eNB->CC_id,num_pdcch_symbols,subframe),num_pdcch_symbols); -#if defined(SMBV) && !defined(EXMIMO) - - // configure RA DCI - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "RA", &DCI_pdu->dci_alloc[i], i); - } - -#endif - - } - - else if (DCI_pdu->dci_alloc[i].format != format0) { // this is a normal DLSCH allocation - - if (phy_vars_eNB->mac_enabled==1) - UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); - else - UE_id = i; - - if (UE_id>=0) { - if ((frame%100)==0) { - LOG_D(PHY,"Frame %3d, SF %d \n",frame,subframe); - dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); - } -#if defined(SMBV) && !defined(EXMIMO) - // Configure this user - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1, - DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->transmission_mode[(uint8_t)UE_id]); - smbv_configure_user(smbv_fname,UE_id+1,phy_vars_eNB->transmission_mode[(uint8_t)UE_id],DCI_pdu->dci_alloc[i].rnti); - } - -#endif - - generate_eNB_dlsch_params_from_dci(frame, - subframe, - &DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].format, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id], - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - phy_vars_eNB->eNB_UE_stats[(uint8_t)UE_id].DL_pmi_single); - LOG_D(PHY,"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d subframe %d: Generated dlsch params\n", - phy_vars_eNB->Mod_id,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - - - T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(phy_vars_eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(UE_id), - T_INT(DCI_pdu->dci_alloc[i].rnti), T_INT(DCI_pdu->dci_alloc[i].format), - T_INT(phy_vars_eNB->dlsch_eNB[(int)UE_id][0]->current_harq_pid)); - - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; - - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16") => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe],DCI_pdu->dci_alloc[i].firstCCE); - -#if defined(SMBV) && !defined(EXMIMO) + /* save old HARQ information needed for PHICH generation */ + if (ul_subframe < 10) { // This means that there is a potential UL subframe that will be scheduled here + for (i=0; iulsch[i]) { + ulsch_harq = eNB->ulsch[i]->harq_processes[harq_pid]; + + /* Store first_rb and n_DMRS for correct PHICH generation below. + * For PHICH generation we need "old" values of last scheduling + * for this HARQ process. 'generate_eNB_dlsch_params' below will + * overwrite first_rb and n_DMRS and 'generate_phich_top', done + * after 'generate_eNB_dlsch_params', would use the "new" values + * instead of the "old" ones. + * + * This has been tested for FDD only, may be wrong for TDD. + * + * TODO: maybe we should restructure the code to be sure it + * is done correctly. The main concern is if the code + * changes and first_rb and n_DMRS are modified before + * we reach here, then the PHICH processing will be wrong, + * using wrong first_rb and n_DMRS values to compute + * ngroup_PHICH and nseq_PHICH. + * + * TODO: check if that works with TDD. + */ + ulsch_harq->previous_first_rb = ulsch_harq->first_rb; + ulsch_harq->previous_n_DMRS = ulsch_harq->n_DMRS; - // configure UE-spec DCI - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i); - } - -#endif - - LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n", - phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti, - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,UE_id, - DCI_pdu->dci_alloc[i].format, - 1<dci_alloc[i].L); - } else { - LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti); } } - } + + + // num_pdcch_symbols = DCI_pdu->num_pdcch_symbols; + num_pdcch_symbols = eNB->pdcch_vars[subframe&1].num_pdcch_symbols; + num_dci = eNB->pdcch_vars[subframe&1].num_dci; + // LOG_D(PHY,"num_pdcch_symbols %"PRIu8",(dci common %"PRIu8", dci uespec %"PRIu8"\n",num_pdcch_symbols, + // DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); + LOG_D(PHY,"num_pdcch_symbols %"PRIu8",number dci %"PRIu8"\n",num_pdcch_symbols, num_dci); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,num_pdcch_symbols); + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,(frame*10)+subframe); - // Apply physicalConfigDedicated if needed - phy_config_dedicated_eNB_step2(phy_vars_eNB); + if (num_dci > 0) + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (num_dci %"PRIu8") num_pdcch_symbols:%d\n",eNB->Mod_id,frame, subframe, num_dci, num_pdcch_symbols); - for (i=0; iNum_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { - if (DCI_pdu->dci_alloc[i].format == format0) { // this is a ULSCH allocation + //LOG_D(PHY,"Before generate_dci_top num_pdcch_symbols:%d num_dci:%d dci_alloc:dci_length:%d\n", num_pdcch_symbols, num_dci, eNB->pdcch_vars[subframe&1].dci_alloc[0].dci_length); - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, - pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe)); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1); - if (harq_pid==255) { - LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx); - return; - } - - if (phy_vars_eNB->mac_enabled==1) - UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); - else - UE_id = i; - - T(T_ENB_PHY_ULSCH_UE_DCI, T_INT(phy_vars_eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(UE_id), - T_INT(DCI_pdu->dci_alloc[i].rnti), T_INT(harq_pid)); - - if (UE_id<0) { - LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti); - mac_exit_wrapper("Invalid UE id (< 0) detected"); - return; // not reached - } - - LOG_D(PHY, - "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8") (DCI pos %"PRIu32"/%d), aggregation %d\n", - phy_vars_eNB->Mod_id, - subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, - pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe)), - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe, - pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe), - DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].dci_pdu[0], - i, - DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci, - 1<dci_alloc[i].L); - - generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0], - DCI_pdu->dci_alloc[i].rnti, - sched_subframe, - format0, - UE_id, - phy_vars_eNB, - SI_RNTI, - 0, - P_RNTI, - CBA_RNTI, - 0); // do_srs - - LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d/%u\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->dci_alloc[i].rnti, - DCI_pdu->dci_alloc[i].firstCCE,DCI_pdu->dci_alloc[i].firstCCE); - -#if defined(SMBV) && !defined(EXMIMO) - - // configure UE-spec DCI for UL Grant - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i); - smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i); - } - -#endif - - - - if ((DCI_pdu->dci_alloc[i].rnti >= CBA_RNTI) && (DCI_pdu->dci_alloc[i].rnti < P_RNTI)) - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; - else - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - - } + if (nfapi_mode == 0 || nfapi_mode == 1) { + generate_dci_top(num_pdcch_symbols, + num_dci, + &eNB->pdcch_vars[subframe&1].dci_alloc[0], + 0, + AMP, + fp, + eNB->common_vars.txdataF, + subframe); } - - - - // if we have DCI to generate do it now - if ((DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci)>0) { - - - } else { // for emulation!! - phy_vars_eNB->num_ue_spec_dci[(subframe)&1]=0; - phy_vars_eNB->num_common_dci[(subframe)&1]=0; - } - - if (abstraction_flag == 0) { - - if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, - DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); - - num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci, - DCI_pdu->Num_common_dci, - DCI_pdu->dci_alloc, - 0, - AMP, - &phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - subframe); - - } - -#ifdef PHY_ABSTRACTION // FIXME this ifdef seems suspicious - else { - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top_emul\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe); - num_pdcch_symbols = generate_dci_top_emul(phy_vars_eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,subframe); - } - -#endif - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0); - // Check for SI activity - - if (phy_vars_eNB->dlsch_eNB_SI->active == 1) { - input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8; - - - if (phy_vars_eNB->mac_enabled==1) { - DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - SI_RNTI, - 0); - } - else { - DLSCH_pdu = DLSCH_pdu_tmp; - - for (i=0; iproc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); - smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), DLSCH_pdu, input_buffer_length); - } - -#endif - - if (abstraction_flag == 0) { - - start_meas(&phy_vars_eNB->dlsch_encoding_stats); - dlsch_encoding(DLSCH_pdu, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_SI, - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - &phy_vars_eNB->dlsch_rate_matching_stats, - &phy_vars_eNB->dlsch_turbo_encoding_stats, - &phy_vars_eNB->dlsch_interleaving_stats); - stop_meas(&phy_vars_eNB->dlsch_encoding_stats); - - start_meas(&phy_vars_eNB->dlsch_scrambling_stats); - dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, - 0, - phy_vars_eNB->dlsch_eNB_SI, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->nb_rb, - phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs), - 1, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - 0, - subframe<<1); - - stop_meas(&phy_vars_eNB->dlsch_scrambling_stats); - - start_meas(&phy_vars_eNB->dlsch_modulation_stats); - - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_SI, - (LTE_eNB_DLSCH_t *)NULL); - stop_meas(&phy_vars_eNB->dlsch_modulation_stats); - } - -#ifdef PHY_ABSTRACTION - else { - start_meas(&phy_vars_eNB->dlsch_encoding_stats); - dlsch_encoding_emul(phy_vars_eNB, - DLSCH_pdu, - phy_vars_eNB->dlsch_eNB_SI); - stop_meas(&phy_vars_eNB->dlsch_encoding_stats); - } - -#endif - phy_vars_eNB->dlsch_eNB_SI->active = 0; - - } - - // Check for RA activity - if (phy_vars_eNB->dlsch_eNB_ra->active == 1) { - - input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8; - - int16_t crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - dlsch_input_buffer, - phy_vars_eNB->lte_frame_parms.N_RB_UL, - input_buffer_length); - if (crnti!=0) - UE_id = add_ue(crnti,phy_vars_eNB); - else - UE_id = -1; - - if (UE_id==-1) { - LOG_W(PHY,"[eNB] Max user count reached.\n"); - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - crnti); - } else { - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE; - // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged) - phy_vars_eNB->first_sr[(uint32_t)UE_id] = 1; - - generate_eNB_ulsch_params_from_rar(dlsch_input_buffer, - phy_vars_eNB->proc[sched_subframe].frame_tx, - (subframe), - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id], - &phy_vars_eNB->lte_frame_parms); - - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 1; - - get_Msg3_alloc(&phy_vars_eNB->lte_frame_parms, - subframe, - phy_vars_eNB->proc[sched_subframe].frame_tx, - &phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - &phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); - LOG_D(PHY,"[eNB][RAPROC] Frame %d subframe %d, Activated Msg3 demodulation for UE %"PRId8" in frame %"PRIu32", subframe %"PRIu8"\n", - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe, - UE_id, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); - -#if defined(SMBV) && !defined(EXMIMO) - - // Configures the data source of allocation (allocation is configured by DCI) - if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); - smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), dlsch_input_buffer, input_buffer_length); - } - -#endif - - - LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA) with input size = %"PRIu16",Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,input_buffer_length, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); - - - if (abstraction_flag == 0) { - - dlsch_encoding(dlsch_input_buffer, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_ra, - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - &phy_vars_eNB->dlsch_rate_matching_stats, - &phy_vars_eNB->dlsch_turbo_encoding_stats, - &phy_vars_eNB->dlsch_interleaving_stats); - - // phy_vars_eNB->dlsch_eNB_ra->rnti = RA_RNTI; - dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, - 0, - phy_vars_eNB->dlsch_eNB_ra, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->nb_rb, - phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs), - 1, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - 0, - subframe<<1); - - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB_ra, - (LTE_eNB_DLSCH_t *)NULL); - } - -#ifdef PHY_ABSTRACTION - else { - dlsch_encoding_emul(phy_vars_eNB, - dlsch_input_buffer, - phy_vars_eNB->dlsch_eNB_ra); - } - -#endif - LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d subframe %d Deactivating DLSCH RA\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); - - } //max user count - - phy_vars_eNB->dlsch_eNB_ra->active = 0; - } - + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,1); // Now scan UE specific DLSCH + LTE_eNB_DLSCH_t *dlsch0,*dlsch1; for (UE_id=0; UE_iddlsch_eNB[(uint8_t)UE_id][0])&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 1)) { - harq_pid = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid; - input_buffer_length = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS/8; + { + dlsch0 = eNB->dlsch[(uint8_t)UE_id][0]; + dlsch1 = eNB->dlsch[(uint8_t)UE_id][1]; + if ((dlsch0)&& + (dlsch0->rnti>0)&& + (dlsch0->active == 1)) { + // get harq_pid + harq_pid = dlsch0->harq_ids[subframe]; + AssertFatal(harq_pid>=0,"harq_pid is negative\n"); - LOG_D(PHY, - "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")\n", - phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,harq_pid, - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, input_buffer_length, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs, - pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round); - -#if defined(MESSAGE_CHART_GENERATOR_PHY) - MSC_LOG_TX_MESSAGE( - MSC_PHY_ENB,MSC_PHY_UE, - NULL,0, - "%05u:%02u PDSCH/DLSCH input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")", - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, - input_buffer_length, - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs, - pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round); -#endif - - phy_vars_eNB->eNB_UE_stats[(uint8_t)UE_id].dlsch_sliding_cnt++; - - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->harq_processes[harq_pid]->round == 0) { - - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][0]++; - - if (phy_vars_eNB->mac_enabled==1) { - DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti, - 0); - phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS; - } - else { - DLSCH_pdu = DLSCH_pdu_tmp; - - for (i=0; iproc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) { - msg("[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt); - smbv_configure_datalist_for_user(smbv_fname, UE_id+1, DLSCH_pdu, input_buffer_length); + if (harq_pid>=8) + { + LOG_E(PHY,"harq_pid:%d corrupt must be 0-7 UE_id:%d frame:%d subframe:%d rnti:%x\n", harq_pid,UE_id,frame,subframe,dlsch0->rnti); } - -#endif - - -#ifdef DEBUG_PHY_PROC -#ifdef DEBUG_DLSCH - LOG_T(PHY,"eNB DLSCH SDU: \n"); - - for (i=0; idlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS>>3; i++) - LOG_T(PHY,"%"PRIx8".",DLSCH_pdu[i]); - - LOG_T(PHY,"\n"); -#endif -#endif - } else { - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round]++; -#ifdef DEBUG_PHY_PROC -#ifdef DEBUG_DLSCH - LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n"); -#endif -#endif - } - - if (abstraction_flag==0) { - - // 36-212 - start_meas(&phy_vars_eNB->dlsch_encoding_stats); - dlsch_encoding(DLSCH_pdu, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0], - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, - &phy_vars_eNB->dlsch_rate_matching_stats, - &phy_vars_eNB->dlsch_turbo_encoding_stats, - &phy_vars_eNB->dlsch_interleaving_stats); - stop_meas(&phy_vars_eNB->dlsch_encoding_stats); - // 36-211 - start_meas(&phy_vars_eNB->dlsch_scrambling_stats); - dlsch_scrambling(&phy_vars_eNB->lte_frame_parms, - 0, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0], - get_G(&phy_vars_eNB->lte_frame_parms, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc, - get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs), - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl, - num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe), - 0, - subframe<<1); - stop_meas(&phy_vars_eNB->dlsch_scrambling_stats); - start_meas(&phy_vars_eNB->dlsch_modulation_stats); - - - re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - AMP, - subframe, - &phy_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0], - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][1]); - - stop_meas(&phy_vars_eNB->dlsch_modulation_stats); - } - -#ifdef PHY_ABSTRACTION - else { - start_meas(&phy_vars_eNB->dlsch_encoding_stats); - dlsch_encoding_emul(phy_vars_eNB, - DLSCH_pdu, - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]); - stop_meas(&phy_vars_eNB->dlsch_encoding_stats); - } - -#endif - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active = 0; - - } - - else if ((phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0])&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&& - (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 0)) { - - // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later) - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->subframe_tx[subframe]=0; - } - } - - - - // if we have PHICH to generate - - if (is_phich_subframe(&phy_vars_eNB->lte_frame_parms,subframe)) - { - generate_phich_top(phy_vars_eNB, - sched_subframe, - AMP, - 0, - abstraction_flag); - } - - - -#ifdef EMOS - phy_procedures_emos_eNB_TX(subframe, phy_vars_eNB); -#endif - -#if !(defined(EXMIMO) || defined(OAI_USRP) || defined (CPRIGW)) - - if (abstraction_flag==0) - { - start_meas(&phy_vars_eNB->ofdm_mod_stats); - do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - phy_vars_eNB->lte_eNB_common_vars.txdata[0], - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe<<1, - &phy_vars_eNB->lte_frame_parms); - do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], - phy_vars_eNB->lte_eNB_common_vars.txdata[0], - phy_vars_eNB->proc[sched_subframe].frame_tx,1+(subframe<<1), - &phy_vars_eNB->lte_frame_parms); - stop_meas(&phy_vars_eNB->ofdm_mod_stats); - } - -#endif - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,0); - stop_meas(&phy_vars_eNB->phy_proc_tx); - - - (void)re_allocated; /* remove gcc warning "set but not used" */ -} - -void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t UE_id, uint8_t harq_pid) -{ - // this prepares the demodulation of the first PUSCH of a new user, containing Msg3 - - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - - LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d : process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n", - phy_vars_eNB->Mod_id, - frame,subframe, - UE_id,phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe, - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame); - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 0; - - if ((phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active == 1) && - (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe == subframe) && - (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame == (uint32_t)frame)) { - - // harq_pid = 0; - - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 0; - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 1; - phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1; - LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n", - phy_vars_eNB->Mod_id, - frame,subframe,UE_id); - } -} - - -// This function retrieves the harq_pid of the corresponding DLSCH process -// and updates the error statistics of the DLSCH based on the received ACK -// info from UE along with the round index. It also performs the fine-grain -// rate-adaptation based on the error statistics derived from the ACK/NAK process - -void process_HARQ_feedback(uint8_t UE_id, - uint8_t sched_subframe, - PHY_VARS_eNB *phy_vars_eNB, - uint8_t pusch_flag, - uint8_t *pucch_payload, - uint8_t pucch_sel, - uint8_t SR_payload) -{ - - uint8_t dl_harq_pid[8],dlsch_ACK[8],dl_subframe; - LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]; - LTE_eNB_UE_stats *ue_stats = &phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id]; - LTE_DL_eNB_HARQ_t *dlsch_harq_proc; - uint8_t subframe_m4,M,m; - int mp; - int all_ACKed=1,nb_alloc=0,nb_ACK=0; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - int harq_pid = subframe2harq_pid( &phy_vars_eNB->lte_frame_parms,frame,subframe); - - if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { //FDD - subframe_m4 = (subframe<4) ? subframe+6 : subframe-4; - - dl_harq_pid[0] = dlsch->harq_ids[subframe_m4]; - M=1; - - if (pusch_flag == 1) { - dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; - if (dlsch->subframe_tx[subframe_m4]==1) - LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUSCH for subframe %d\n",phy_vars_eNB->Mod_id, - frame,dlsch_ACK[0],subframe_m4); - } - else { - dlsch_ACK[0] = pucch_payload[0]; - LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUCCH for subframe %d\n",phy_vars_eNB->Mod_id, - frame,dlsch_ACK[0],subframe_m4); - /* - if (dlsch_ACK[0]==0) - AssertFatal(0,"Exiting on NAK on PUCCH\n"); - */ - } - - -#if defined(MESSAGE_CHART_GENERATOR_PHY) - MSC_LOG_RX_MESSAGE( - MSC_PHY_ENB,MSC_PHY_UE, - NULL,0, - "%05u:%02u %s received %s rnti %x harq id %u tx SF %u", - frame,subframe, - (pusch_flag == 1)?"PUSCH":"PUCCH", - (dlsch_ACK[0])?"ACK":"NACK", - dlsch->rnti, - dl_harq_pid[0], - subframe_m4 - ); -#endif - } else { // TDD Handle M=1,2 cases only - - M=ul_ACK_subframe2_M(&phy_vars_eNB->lte_frame_parms, - subframe); - - // Now derive ACK information for TDD - if (pusch_flag == 1) { // Do PUSCH ACK/NAK first - // detect missing DAI - //FK: this code is just a guess - //RK: not exactly, yes if scheduled from PHICH (i.e. no DCI format 0) - // otherwise, it depends on how many of the PDSCH in the set are scheduled, we can leave it like this, - // but we have to adapt the code below. For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used - - dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]; - dlsch_ACK[1] = (phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == bundling) - ?phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]:phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[1]; - // printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]); - } - - else { // PUCCH ACK/NAK - if ((SR_payload == 1)&&(pucch_sel!=2)) { // decode Table 7.3 if multiplexing and SR=1 - nb_ACK = 0; - - if (M == 2) { - if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) // b[0],b[1] - nb_ACK = 1; - else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0)) - nb_ACK = 2; - } else if (M == 3) { - if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) - nb_ACK = 1; - else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0)) - nb_ACK = 2; - else if ((pucch_payload[0] == 0) && (pucch_payload[1] == 1)) - nb_ACK = 3; - } - } else if (pucch_sel == 2) { // bundling or M=1 - // printf("*** (%d,%d)\n",pucch_payload[0],pucch_payload[1]); - dlsch_ACK[0] = pucch_payload[0]; - dlsch_ACK[1] = pucch_payload[0]; - } else { // multiplexing with no SR, this is table 10.1 - if (M==1) - dlsch_ACK[0] = pucch_payload[0]; - else if (M==2) { - if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) || - ((pucch_sel == 0) && (pucch_payload[0] == 0) && (pucch_payload[1] == 1))) - dlsch_ACK[0] = 1; - else - dlsch_ACK[0] = 0; - - if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) || - ((pucch_sel == 1) && (pucch_payload[0] == 0) && (pucch_payload[1] == 0))) - dlsch_ACK[1] = 1; - else - dlsch_ACK[1] = 0; - } - } - } - } - - // handle case where positive SR was transmitted with multiplexing - if ((SR_payload == 1)&&(pucch_sel!=2)&&(pusch_flag == 0)) { - nb_alloc = 0; - - for (m=0; mlte_frame_parms, - subframe, - m); - - if (dlsch->subframe_tx[dl_subframe]==1) - nb_alloc++; - } - - if (nb_alloc == nb_ACK) - all_ACKed = 1; - else - all_ACKed = 0; - - // printf("nb_alloc %d, all_ACKed %d\n",nb_alloc,all_ACKed); - } - - - for (m=0,mp=-1; mlte_frame_parms, - subframe, - m); - - if (dlsch->subframe_tx[dl_subframe]==1) { - if (pusch_flag == 1) - mp++; - else - mp = m; - - dl_harq_pid[m] = dlsch->harq_ids[dl_subframe]; - - if ((pucch_sel != 2)&&(pusch_flag == 0)) { // multiplexing - if ((SR_payload == 1)&&(all_ACKed == 1)) - dlsch_ACK[m] = 1; else - dlsch_ACK[m] = 0; - } - - if (dl_harq_pid[m]Mdlharq) { - dlsch_harq_proc = dlsch->harq_processes[dl_harq_pid[m]]; -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",phy_vars_eNB->Mod_id, - dlsch->rnti,dl_harq_pid[m],dl_subframe, - dlsch_harq_proc->status,dlsch_harq_proc->round, - dlsch->harq_processes[dl_harq_pid[m]]->mcs, - dlsch->harq_processes[dl_harq_pid[m]]->rvidx, - dlsch->harq_processes[dl_harq_pid[m]]->TBS); - - if (dlsch_harq_proc->status==DISABLED) - LOG_E(PHY,"dlsch_harq_proc is disabled? \n"); - -#endif - - if ((dl_harq_pid[m]Mdlharq) && - (dlsch_harq_proc->status == ACTIVE)) { - // dl_harq_pid of DLSCH is still active - - // msg("[PHY] eNB %d Process %d is active (%d)\n",phy_vars_eNB->Mod_id,dl_harq_pid[m],dlsch_ACK[m]); - if ( dlsch_ACK[mp]==0) { - // Received NAK -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x/%d] M = %d, m= %d, mp=%d NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id, - dlsch->rnti,dl_harq_pid[m],M,m,mp,dlsch_harq_proc->round); -#endif - - T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(phy_vars_eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(UE_id), T_INT(dlsch->rnti), - T_INT(dl_harq_pid[m])); - - if (dlsch_harq_proc->round == 0) - ue_stats->dlsch_NAK_round0++; - - ue_stats->dlsch_NAK[dl_harq_pid[m]][dlsch_harq_proc->round]++; - - - // then Increment DLSCH round index - dlsch_harq_proc->round++; - - - if (dlsch_harq_proc->round == dlsch->Mlimit) { - // This was the last round for DLSCH so reset round and increment l2_error counter -#ifdef DEBUG_PHY_PROC - LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",phy_vars_eNB->Mod_id, - dlsch->rnti,dl_harq_pid[m]); -#endif -#if defined(MESSAGE_CHART_GENERATOR_PHY) - MSC_LOG_EVENT(MSC_PHY_ENB, "0 HARQ DLSCH Failed RNTI %"PRIx16" round %u", - dlsch->rnti, - dlsch_harq_proc->round); -#endif - - dlsch_harq_proc->round = 0; - ue_stats->dlsch_l2_errors[dl_harq_pid[m]]++; - dlsch_harq_proc->status = SCH_IDLE; - dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq; - } - } else { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",phy_vars_eNB->Mod_id, - dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round); -#endif - - T(T_ENB_PHY_DLSCH_UE_ACK, T_INT(phy_vars_eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(UE_id), T_INT(dlsch->rnti), - T_INT(dl_harq_pid[m])); - - ue_stats->dlsch_ACK[dl_harq_pid[m]][dlsch_harq_proc->round]++; - - // Received ACK so set round to 0 and set dlsch_harq_pid IDLE - dlsch_harq_proc->round = 0; - dlsch_harq_proc->status = SCH_IDLE; - dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq; - - ue_stats->total_TBS = ue_stats->total_TBS + - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; - /* - ue_stats->total_transmitted_bits = ue_stats->total_transmitted_bits + - phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS; - */ - } - - // Do fine-grain rate-adaptation for DLSCH - if (ue_stats->dlsch_NAK_round0 > dlsch->error_threshold) { - if (ue_stats->dlsch_mcs_offset == 1) - ue_stats->dlsch_mcs_offset=0; - else - ue_stats->dlsch_mcs_offset=-1; - } - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[process_HARQ_feedback] Frame %d Setting round to %d for pid %d (subframe %d)\n",frame, - dlsch_harq_proc->round,dl_harq_pid[m],subframe); -#endif - - // Clear NAK stats and adjust mcs offset - // after measurement window timer expires - if (ue_stats->dlsch_sliding_cnt == dlsch->ra_window_size) { - if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK_round0 < 2)) - ue_stats->dlsch_mcs_offset = 1; - - if ((ue_stats->dlsch_mcs_offset == 1) && (ue_stats->dlsch_NAK_round0 > 2)) - ue_stats->dlsch_mcs_offset = 0; - - if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK_round0 > 2)) - ue_stats->dlsch_mcs_offset = -1; - - if ((ue_stats->dlsch_mcs_offset == -1) && (ue_stats->dlsch_NAK_round0 < 2)) - ue_stats->dlsch_mcs_offset = 0; - - ue_stats->dlsch_NAK_round0 = 0; - ue_stats->dlsch_sliding_cnt = 0; - } - - + { + // generate pdsch + pdsch_procedures(eNB, + proc, + harq_pid, + dlsch0, + dlsch1, + &eNB->UE_stats[(uint32_t)UE_id], + 0); } + + + } + + + else if ((dlsch0)&& + (dlsch0->rnti>0)&& + (dlsch0->active == 0)) { + + // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later) + dlsch0->subframe_tx[subframe]=0; } } - } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,0); + + + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_PHICH,1); + generate_phich_top(eNB, + proc, + AMP); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_PHICH,0); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,0); + if (do_meas==1) stop_meas(&eNB->phy_proc_tx); + } -void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB, - uint8_t UE_id, - uint8_t sched_subframe, - int16_t *n1_pucch0, - int16_t *n1_pucch1, - int16_t *n1_pucch2, - int16_t *n1_pucch3) -{ - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; - uint8_t nCCE0,nCCE1; - int sf; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - - if (frame_parms->frame_type == FDD ) { - sf = (subframe<4) ? (subframe+6) : (subframe-4); - // printf("n1_pucch_eNB: subframe %d, nCCE %d\n",sf,phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf]); - - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[sf]>0) { - *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf]; - *n1_pucch1 = -1; - } else { - *n1_pucch0 = -1; - *n1_pucch1 = -1; - } - } else { - - switch (frame_parms->tdd_config) { - case 1: // DL:S:UL:UL:DL:DL:S:UL:UL:DL - if (subframe == 2) { // ACK subframes 5 and 6 - /* if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6]; - *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; - } - else - *n1_pucch1 = -1;*/ - - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; - } else - *n1_pucch0 = -1; - - *n1_pucch1 = -1; - } else if (subframe == 3) { // ACK subframe 9 - - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; - } else - *n1_pucch0 = -1; - - *n1_pucch1 = -1; - - } else if (subframe == 7) { // ACK subframes 0 and 1 - //harq_ack[0].nCCE; - //harq_ack[1].nCCE; - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; - } else - *n1_pucch0 = -1; - - *n1_pucch1 = -1; - } else if (subframe == 8) { // ACK subframes 4 - //harq_ack[4].nCCE; - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[4]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[4]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; - } else - *n1_pucch0 = -1; - - *n1_pucch1 = -1; - } else { - LOG_D(PHY,"[eNB %d] frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", - phy_vars_eNB->Mod_id, - frame, - subframe,frame_parms->tdd_config); - return; - } - - break; - - case 3: // DL:S:UL:UL:UL:DL:DL:DL:DL:DL - if (subframe == 2) { // ACK subframes 5,6 and 1 (S in frame-2), forget about n-11 for the moment (S-subframe) - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6]; - *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; - } else - *n1_pucch1 = -1; - - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; - } else - *n1_pucch0 = -1; - } else if (subframe == 3) { // ACK subframes 7 and 8 - LOG_D(PHY,"get_n1_pucch_eNB : subframe 3, subframe_tx[7] %d, subframe_tx[8] %d\n", - phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7],phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]); - - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[8]; - *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; - LOG_D(PHY,"nCCE1 %d, n1_pucch1 %d\n",nCCE1,*n1_pucch1); - } else - *n1_pucch1 = -1; - - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[7]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; - LOG_D(PHY,"nCCE0 %d, n1_pucch0 %d\n",nCCE0,*n1_pucch0); - } else - *n1_pucch0 = -1; - } else if (subframe == 4) { // ACK subframes 9 and 0 - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) { - nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0]; - *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; - } else - *n1_pucch1 = -1; - - if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) { - nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9]; - *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; - } else - *n1_pucch0 = -1; - } else { - LOG_D(PHY,"[eNB %d] Frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", - phy_vars_eNB->Mod_id,frame,subframe,frame_parms->tdd_config); - return; - } - - break; - } // switch tdd_config - - // Don't handle the case M>2 - *n1_pucch2 = -1; - *n1_pucch3 = -1; - } -} - -void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t abstraction_flag) -{ - - uint16_t preamble_energy_list[64],preamble_delay_list[64]; - uint16_t preamble_max,preamble_energy_max; +#ifdef Rel14 +void prach_procedures(PHY_VARS_eNB *eNB, + int br_flag) { +#else +void prach_procedures(PHY_VARS_eNB *eNB) { +#endif + uint16_t max_preamble[4],max_preamble_energy[4],max_preamble_delay[4]; uint16_t i; - int8_t UE_id; - int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - uint8_t CC_id = phy_vars_eNB->CC_id; + int frame,subframe; - memset(&preamble_energy_list[0],0,64*sizeof(uint16_t)); - memset(&preamble_delay_list[0],0,64*sizeof(uint16_t)); +#ifdef Rel14 + if (br_flag==1) { + subframe = eNB->proc.subframe_prach_br; + frame = eNB->proc.frame_prach_br; + pthread_mutex_lock(&eNB->UL_INFO_mutex); + eNB->UL_INFO.rach_ind_br.rach_indication_body.number_of_preambles=0; + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + } + else +#endif + { + pthread_mutex_lock(&eNB->UL_INFO_mutex); + eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles=0; + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + subframe = eNB->proc.subframe_prach; + frame = eNB->proc.frame_prach; + } + RU_t *ru; + int aa=0; + int ru_aa; - if (abstraction_flag == 0) { - LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id, - frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); - rx_prach(phy_vars_eNB, - subframe, - preamble_energy_list, - preamble_delay_list, - frame, - 0); - } else { - for (UE_id=0; UE_idgenerate_prach, - PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex, - phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex, - PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex); + for (i=0;inum_RU;i++) { + ru=eNB->RU_list[i]; + for (ru_aa=0,aa=0;ru_aanb_rx;ru_aa++,aa++) { + eNB->prach_vars.rxsigF[0][aa] = eNB->RU_list[i]->prach_rxsigF[ru_aa]; +#ifdef Rel14 + int ce_level; - if ((PHY_vars_UE_g[UE_id][CC_id]->generate_prach==1) && - (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex == - phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex) ) { - preamble_energy_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 800; - preamble_delay_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 5; + if (br_flag==1) + for (ce_level=0;ce_level<4;ce_level++) eNB->prach_vars_br.rxsigF[ce_level][aa] = eNB->RU_list[i]->prach_rxsigF_br[ce_level][ru_aa]; +#endif + } + } + rx_prach(eNB, + eNB->RU_list[0], + &max_preamble[0], + &max_preamble_energy[0], + &max_preamble_delay[0], + frame, + 0 +#ifdef Rel14 + ,br_flag +#endif + ); + + //#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[RAPROC] Frame %d, subframe %d : Most likely preamble %d, energy %d dB delay %d\n", + frame,subframe, + max_preamble[0], + max_preamble_energy[0]/10, + max_preamble_delay[0]); + //q#endif + +#ifdef Rel14 + if (br_flag==1) { + + int prach_mask; + + prach_mask = is_prach_subframe(&eNB->frame_parms,eNB->proc.frame_prach_br,eNB->proc.subframe_prach_br); + + eNB->UL_INFO.rach_ind_br.rach_indication_body.preamble_list = eNB->preamble_list_br; + int ind=0; + int ce_level=0; + /* Save for later, it doesn't work + for (int ind=0,ce_level=0;ce_level<4;ce_level++) { + + if ((eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[ce_level]==1)&& + (prach_mask&(1<<(1+ce_level)) > 0) && // prach is active and CE level has finished its repetitions + (eNB->prach_vars_br.repetition_number[ce_level]== + eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[ce_level])) { + */ + if (eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[0]==1){ + if ((eNB->prach_energy_counter == 100) && + (max_preamble_energy[0] > eNB->measurements.prach_I0 + 100)) { + eNB->UL_INFO.rach_ind_br.rach_indication_body.number_of_preambles++; + + eNB->preamble_list_br[ind].preamble_rel8.timing_advance = max_preamble_delay[ind];// + eNB->preamble_list_br[ind].preamble_rel8.preamble = max_preamble[ind]; + // note: fid is implicitly 0 here, this is the rule for eMTC RA-RNTI from 36.321, Section 5.1.4 + eNB->preamble_list_br[ind].preamble_rel8.rnti = 1+subframe+(eNB->prach_vars_br.first_frame[ce_level]%40); + eNB->preamble_list_br[ind].instance_length = 0; //don't know exactly what this is + eNB->preamble_list_br[ind].preamble_rel13.rach_resource_type = 1+ce_level; // CE Level + LOG_D(PHY,"Filling NFAPI indication for RACH %d CELevel %d (mask %x) : TA %d, Preamble %d, rnti %x, rach_resource_type %d\n", + ind, + ce_level, + prach_mask, + eNB->preamble_list_br[ind].preamble_rel8.timing_advance, + eNB->preamble_list_br[ind].preamble_rel8.preamble, + eNB->preamble_list_br[ind].preamble_rel8.rnti, + eNB->preamble_list_br[ind].preamble_rel13.rach_resource_type); + } + /* + ind++; + } + } */// ce_level + } + } + else +#endif + + { + if ((eNB->prach_energy_counter == 100) && + (max_preamble_energy[0] > eNB->measurements.prach_I0+100)) { + + LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n", + eNB->Mod_id, + eNB->CC_id, + frame, + subframe, + max_preamble[0], + max_preamble_energy[0]/10, + max_preamble_energy[0]%10, + max_preamble_delay[0]); + + T(T_ENB_PHY_INITIATE_RA_PROCEDURE, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), + T_INT(max_preamble[0]), T_INT(max_preamble_energy[0]), T_INT(max_preamble_delay[0])); + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + + eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles = 1; + eNB->UL_INFO.rach_ind.rach_indication_body.preamble_list = &eNB->preamble_list[0]; + eNB->UL_INFO.rach_ind.rach_indication_body.tl.tag = NFAPI_RACH_INDICATION_BODY_TAG; + eNB->UL_INFO.rach_ind.header.message_id = NFAPI_RACH_INDICATION; + eNB->UL_INFO.rach_ind.sfn_sf = frame<<4 | subframe; + + eNB->preamble_list[0].preamble_rel8.tl.tag = NFAPI_PREAMBLE_REL8_TAG; + eNB->preamble_list[0].preamble_rel8.timing_advance = max_preamble_delay[0]; + eNB->preamble_list[0].preamble_rel8.preamble = max_preamble[0]; + eNB->preamble_list[0].preamble_rel8.rnti = 1+subframe; // note: fid is implicitly 0 here + eNB->preamble_list[0].preamble_rel13.rach_resource_type = 0; + eNB->preamble_list[0].instance_length = 0; //don't know exactly what this is + + if (nfapi_mode == 1) { // If NFAPI PNF then we need to send the message to the VNF + + LOG_D(PHY,"Filling NFAPI indication for RACH : SFN_SF:%d TA %d, Preamble %d, rnti %x, rach_resource_type %d\n", + NFAPI_SFNSF2DEC(eNB->UL_INFO.rach_ind.sfn_sf), + eNB->preamble_list[0].preamble_rel8.timing_advance, + eNB->preamble_list[0].preamble_rel8.preamble, + eNB->preamble_list[0].preamble_rel8.rnti, + eNB->preamble_list[0].preamble_rel13.rach_resource_type); + + oai_nfapi_rach_ind(&eNB->UL_INFO.rach_ind); + + eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles = 0; + } + + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + + } // max_preamble_energy > prach_I0 + 100 + else { + eNB->measurements.prach_I0 = ((eNB->measurements.prach_I0*900)>>10) + ((max_preamble_energy[0]*124)>>10); + if (frame==0) LOG_I(PHY,"prach_I0 = %d.%d dB\n",eNB->measurements.prach_I0/10,eNB->measurements.prach_I0%10); + if (eNB->prach_energy_counter < 100) eNB->prach_energy_counter++; + } + } // else br_flag + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); +} + +void srs_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + const int subframe = proc->subframe_rx; + const int frame = proc->frame_rx; + + int i; + + if (is_srs_occasion_common(fp,frame,subframe)) { + + // Do SRS processing + // check if there is SRS and we have to use shortened format + // TODO: check for exceptions in transmission of SRS together with ACK/NACK + for (i=0;isoundingrs_ul_config_dedicated[i].active==1) { + + + if (lte_srs_channel_estimation(fp, + &eNB->common_vars, + &eNB->srs_vars[i], + &eNB->soundingrs_ul_config_dedicated[i], + subframe, + 0/*eNB_id*/)) { + LOG_E(PHY,"problem processing SRS\n"); + } + eNB->soundingrs_ul_config_dedicated[i].active=0; } } } - - preamble_energy_max = preamble_energy_list[0]; - preamble_max = 0; - - for (i=1; i<64; i++) { - if (preamble_energy_max < preamble_energy_list[i]) { - preamble_energy_max = preamble_energy_list[i]; - preamble_max = i; - } - } - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[RAPROC] Most likely preamble %d, energy %d dB delay %d\n", - preamble_max, - preamble_energy_list[preamble_max], - preamble_delay_list[preamble_max]); -#endif - - if (preamble_energy_list[preamble_max] > 580) { - - UE_id = find_next_ue_index(phy_vars_eNB); - - if (UE_id>=0) { - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits - - phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].sector = 0; - LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - subframe, - UE_id, - preamble_max, - preamble_energy_max/10, - preamble_energy_max%10, - preamble_delay_list[preamble_max]); - - if (phy_vars_eNB->mac_enabled==1) { - uint8_t update_TA=4; - - switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - update_TA = 16; - break; - - case 25: - update_TA = 4; - break; - - case 50: - update_TA = 2; - break; - - case 100: - update_TA = 1; - break; - } - - mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - preamble_max, - preamble_delay_list[preamble_max]*update_TA, - 0,subframe,0); - } - - } else { - MSC_LOG_EVENT(MSC_PHY_ENB, "0 RA Failed add user, too many"); - LOG_I(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n", - phy_vars_eNB->Mod_id,frame, subframe); - } - } } -void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *phy_vars_eNB, unsigned char abstraction_flag) +void fill_sr_indication(PHY_VARS_eNB *eNB,uint16_t rnti,int frame,int subframe,uint32_t stat) { + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + nfapi_sr_indication_t *sr_ind = &eNB->UL_INFO.sr_ind; + nfapi_sr_indication_body_t *sr_ind_body = &sr_ind->sr_indication_body; + nfapi_sr_indication_pdu_t *pdu = &sr_ind_body->sr_pdu_list[sr_ind_body->number_of_srs]; + + sr_ind->sfn_sf = frame<<4|subframe; + sr_ind->header.message_id = NFAPI_RX_SR_INDICATION; + + sr_ind_body->tl.tag = NFAPI_SR_INDICATION_BODY_TAG; + + pdu->instance_length = 0; // don't know what to do with this + // pdu->rx_ue_information.handle = handle; + pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdu->rx_ue_information.rnti = rnti; + + int SNRtimes10 = dB_fixed_times10(stat) - 200;//(10*eNB->measurements.n0_power_dB[0]); + + + pdu->ul_cqi_information.tl.tag = NFAPI_UL_CQI_INFORMATION_TAG; + + if (SNRtimes10 < -640) pdu->ul_cqi_information.ul_cqi=0; + else if (SNRtimes10 > 635) pdu->ul_cqi_information.ul_cqi=255; + else pdu->ul_cqi_information.ul_cqi=(640+SNRtimes10)/5; + pdu->ul_cqi_information.channel = 0; + + sr_ind_body->number_of_srs++; + pthread_mutex_unlock(&eNB->UL_INFO_mutex); +} + +void uci_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { - UNUSED(subframe); - UNUSED(i); - UNUSED(phy_vars_eNB); - UNUSED(abstraction_flag); - LOG_D(PHY,"ulsch_decoding_procedures not yet implemented. should not be called"); -} + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + uint8_t SR_payload = 0,pucch_b0b1[4][2]= {{0,0},{0,0},{0,0},{0,0}},harq_ack[4]={0,0,0,0}; + int32_t metric[4]={0,0,0,0},metric_SR=0,max_metric; + const int subframe = proc->subframe_rx; + const int frame = proc->frame_rx; + int i; + LTE_eNB_UCI *uci; + uint16_t tdd_multiplexing_mask=0; + int res; + for (i=0;iuci_vars[i]; + if ((uci->active == 1) && + (uci->frame == frame) && + (uci->subframe == subframe)) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; - uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0}; - int16_t n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3; - uint8_t do_SR = 0; - uint8_t pucch_sel = 0; - int32_t metric0=0,metric1=0,metric0_SR=0; - ANFBmode_t bundling_flag; - PUCCH_FMT_t format; + LOG_D(PHY,"Frame %d, subframe %d: Running uci procedures (type %d) for %d \n",frame,subframe,uci->type,i); + uci->active=0; - const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; + // Null out PUCCH PRBs for noise measurement + switch(fp->N_RB_UL) { + case 6: + eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5 + break; + case 15: + eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14 + break; + case 25: + eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24 + break; + case 50: + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32) + break; + case 75: + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64) + break; + case 100: + eNB->rb_mask_ul[0] |= 0x1; + eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96) + break; + default: + LOG_E(PHY,"Unknown number for N_RB_UL %d\n",fp->N_RB_UL); + break; + } - if ((phy_vars_eNB->dlsch_eNB[UE_id][0]) && - (phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti>0) && - (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { - - // check SR availability - do_SR = is_SR_subframe(phy_vars_eNB,UE_id,sched_subframe); - // do_SR = 0; - - // Now ACK/NAK - // First check subframe_tx flag for earlier subframes - get_n1_pucch_eNB(phy_vars_eNB, - UE_id, - sched_subframe, - &n1_pucch0, - &n1_pucch1, - &n1_pucch2, - &n1_pucch3); - - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, - frame,subframe, - n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); - - if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) { // no TX PDSCH that have to be checked and no SR for this UE_id - } else { - // otherwise we have some PUCCH detection to do - - // Null out PUCCH PRBs for noise measurement - switch(phy_vars_eNB->lte_frame_parms.N_RB_UL) { - case 6: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5 - break; - case 15: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14 - break; - case 25: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24 - break; - case 50: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32) - break; - case 75: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64) - break; - case 100: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96) - break; - default: - LOG_E(PHY,"Unknown number for N_RB_UL %d\n",phy_vars_eNB->lte_frame_parms.N_RB_UL); - break; + switch (uci->type) { + case SR: + case HARQ_SR: + + metric_SR = rx_pucch(eNB, + uci->pucch_fmt, + i, + uci->n_pucch_1_0_sr[0], + 0, // n2_pucch + uci->srs_active, // shortened format + &SR_payload, + frame, + subframe, + PUCCH1_THRES); + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR is %d (SR n1pucch is %d)\n", + eNB->Mod_id, + uci->rnti, + frame, + subframe, + SR_payload, + uci->n_pucch_1_0_sr[0]); + if (uci->type == SR) { + if (SR_payload == 1) { + fill_sr_indication(eNB,uci->rnti,frame,subframe,metric_SR); + continue; + } + else { + continue; + } } - - if (do_SR == 1) { - phy_vars_eNB->eNB_UE_stats[UE_id].sr_total++; - - if (abstraction_flag == 0) - metric0_SR = rx_pucch(phy_vars_eNB, - pucch_format1, - UE_id, - phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, - 0, // n2_pucch - 0, // shortened format, should be use_srs flag, later - &SR_payload, - frame, - subframe, - PUCCH1_THRES); - -#ifdef PHY_ABSTRACTION - else { - metric0_SR = rx_pucch_emul(phy_vars_eNB, - UE_id, - pucch_format1, - 0, - &SR_payload, - sched_subframe); - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); - } - -#endif - - if (SR_payload == 1) { - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); - phy_vars_eNB->eNB_UE_stats[UE_id].sr_received++; - - if (phy_vars_eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 - phy_vars_eNB->first_sr[UE_id] = 0; - phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->round=0; - phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status=SCH_IDLE; - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); - } - - if (phy_vars_eNB->mac_enabled==1) { - mac_xface->SR_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe); - } - } - }// do_SR==1 - - if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR - } else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD - // if SR was detected, use the n1_pucch from SR, else use n1_pucch0 - // n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0; - - LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); - - if (abstraction_flag == 0) { - - - - metric0 = rx_pucch(phy_vars_eNB, - pucch_format1a, - UE_id, - (uint16_t)n1_pucch0, - 0, //n2_pucch - 0, // shortened format - pucch_payload0, - frame, - subframe, - PUCCH1a_THRES); - - if (metric0 < metric0_SR) - metric0=rx_pucch(phy_vars_eNB, - pucch_format1a, - UE_id, - phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + case HARQ: + if (fp->frame_type == FDD) { + LOG_D(PHY,"Frame %d Subframe %d Demodulating PUCCH (UCI %d) for ACK/NAK (uci->pucch_fmt %d,uci->type %d.uci->frame %d, uci->subframe %d): n1_pucch0 %d SR_payload %d\n", + frame,subframe,i, + uci->pucch_fmt,uci->type, + uci->frame,uci->subframe,uci->n_pucch_1[0][0], + SR_payload); + + metric[0] = rx_pucch(eNB, + uci->pucch_fmt, + i, + uci->n_pucch_1[0][0], 0, //n2_pucch - 0, // shortened format - pucch_payload0, - frame, + uci->srs_active, // shortened format + pucch_b0b1[0], + frame, + subframe, + PUCCH1a_THRES); + + + /* cancel SR detection if reception on n1_pucch0 is better than on SR PUCCH resource index, otherwise send it up to MAC */ + if (uci->type==HARQ_SR && metric[0] > metric_SR) SR_payload = 0; + else if (SR_payload == 1) fill_sr_indication(eNB,uci->rnti,frame,subframe,metric_SR); + + if (uci->type==HARQ_SR && metric[0] <= metric_SR) { + /* when transmitting ACK/NACK on SR PUCCH resource index, SR payload is always 1 */ + SR_payload = 1; + + metric[0]=rx_pucch(eNB, + uci->pucch_fmt, + i, + uci->n_pucch_1_0_sr[0], + 0, //n2_pucch + uci->srs_active, // shortened format + pucch_b0b1[0], + frame, subframe, PUCCH1a_THRES); } - else { -#ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, - pucch_format1a, - 0, - pucch_payload0, - subframe); -#endif - } + + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", + eNB->Mod_id, + uci->rnti, + frame,subframe, + pucch_b0b1[0][0],metric[0]); + + uci->stat = metric[0]; + fill_uci_harq_indication(eNB,uci,frame,subframe,pucch_b0b1[0],0,0xffff); + + } + else { // frame_type == TDD + + + // if SR was detected, use the n1_pucch from SR + if (SR_payload==1) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, - frame,subframe, - pucch_payload0[0],metric0); + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",eNB->Mod_id, + eNB->dlsch[UE_id][0]->rnti, + frame,subframe, + n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); #endif - - process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB, - 0,// pusch_flag - pucch_payload0, - 2, - SR_payload); - - } // FDD - else { //TDD - - bundling_flag = phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; - - // fix later for 2 TB case and format1b - - if ((frame_parms->frame_type==FDD) || - (bundling_flag==bundling) || - ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) { - format = pucch_format1a; - // msg("PUCCH 1a\n"); - } else { - format = pucch_format1b; - // msg("PUCCH 1b\n"); - } - - // if SR was detected, use the n1_pucch from SR - if (SR_payload==1) { + + metric[0] = rx_pucch(eNB, + pucch_format1b, + i, + uci->n_pucch_1_0_sr[0], + 0, //n2_pucch + uci->srs_active, // shortened format + pucch_b0b1[0], + frame, + subframe, + PUCCH1a_THRES); + } else { //using assigned pucch resources #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, - frame,subframe, - n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK M=%d (%d,%d,%d,%d) format %d\n",eNB->Mod_id, + eNB->dlsch[UE_id][0]->rnti, + frame,subframe, + uci->num_pucch_resources, + uci->n_pucch_1[res][0], + uci->n_pucch_1[res][1], + uci->n_pucch_1[res][2], + uci->n_pucch_1[res][3], + uci->pucch_fmt); #endif + for (res=0;resnum_pucch_resources;res++) + metric[res] = rx_pucch(eNB, + uci->pucch_fmt, + i, + uci->n_pucch_1[res][0], + 0, // n2_pucch + uci->srs_active, // shortened format + pucch_b0b1[res], + frame, + subframe, + PUCCH1a_THRES); + + - if (abstraction_flag == 0) - metric0_SR = rx_pucch(phy_vars_eNB, - format, - UE_id, - phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, - 0, //n2_pucch - 0, // shortened format - pucch_payload0, - frame, - subframe, - PUCCH1a_THRES); - else { -#ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, - format, - 0, - pucch_payload0, - subframe); -#endif - } - } else { //using n1_pucch0/n1_pucch1 resources + } + + + if (SR_payload == 1) { // this implements Table 7.3.1 from 36.213 + if (pucch_b0b1[0][0] == 4) { // there isn't a likely transmission + harq_ack[0] = 4; // DTX + } + else if (pucch_b0b1[1][0] == 1 && pucch_b0b1[1][1] == 1) { // 1/4/7 ACKs + harq_ack[0] = 1; + } + else if (pucch_b0b1[1][0] == 1 && pucch_b0b1[1][1] != 1) { // 2/5/8 ACKs + harq_ack[0] = 2; + } + else if (pucch_b0b1[1][0] != 1 && pucch_b0b1[1][1] == 1) { // 3/6/9 ACKs + harq_ack[0] = 3; + } + else if (pucch_b0b1[1][0] != 1 && pucch_b0b1[1][1] != 1) { // 0 ACKs, or at least one DL assignment missed + harq_ack[0] = 0; + } + uci->stat = metric[0]; + fill_uci_harq_indication(eNB,uci,frame,subframe,harq_ack,2,0xffff); // special_bundling mode + } + else if ((uci->tdd_bundling == 0) && (uci->num_pucch_resources==2)){ // multiplexing + no SR, implement Table 10.1.3-5 (Rel14) for multiplexing with M=2 + if (pucch_b0b1[0][0] == 4 || + pucch_b0b1[1][0] == 4) { // there isn't a likely transmission + harq_ack[0] = 4; // DTX + harq_ack[1] = 6; // NACK/DTX + } + else { + if (metric[1]>metric[0]) { + if (pucch_b0b1[1][0] == 1 && pucch_b0b1[1][1] != 1){ + harq_ack[0] = 1; // ACK + harq_ack[1] = 1; // ACK + tdd_multiplexing_mask = 0x3; + } + else if (pucch_b0b1[1][0] != 1 && pucch_b0b1[1][1] == 1){ + harq_ack[0] = 6; // NACK/DTX + harq_ack[1] = 1; // ACK + tdd_multiplexing_mask = 0x2; + } + else { + harq_ack[0] = 4; // DTX + harq_ack[1] = 4; // DTX + } + } + else { + if (pucch_b0b1[0][0] == 1 && pucch_b0b1[0][1] == 1){ + harq_ack[0] = 1; // ACK + harq_ack[1] = 6; // NACK/DTX + tdd_multiplexing_mask = 0x1; + } + else if (pucch_b0b1[0][0] != 1 && pucch_b0b1[0][1] != 1){ + harq_ack[0] = 2; // NACK + harq_ack[1] = 6; // NACK/DTX + } + else { + harq_ack[0] = 4; // DTX + harq_ack[1] = 4; // DTX + } + } + } + uci->stat = max(metric[0],metric[1]); + fill_uci_harq_indication(eNB,uci,frame,subframe,harq_ack,1,tdd_multiplexing_mask); // multiplexing mode + } //else if ((uci->tdd_bundling == 0) && (res==2)) + else if ((uci->tdd_bundling == 0) && (uci->num_pucch_resources==3)){ // multiplexing + no SR, implement Table 10.1.3-6 (Rel14) for multiplexing with M=3 + + if (harq_ack[0] == 4 || + harq_ack[1] == 4 || + harq_ack[2] == 4) { // there isn't a likely transmission + harq_ack[0] = 4; // DTX + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 6; // NACK/DTX + + } + else { + + max_metric = max(metric[0],max(metric[1],metric[2])); + + if (metric[0]==max_metric) { + if (pucch_b0b1[0][0] == 1 && pucch_b0b1[0][1] == 1){ + harq_ack[0] = 1; // ACK + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 6; // NACK/DTX + tdd_multiplexing_mask = 0x1; + } + else if (pucch_b0b1[0][0] != 1 && pucch_b0b1[0][1] != 1){ + harq_ack[0] = 2; // NACK + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 6; // NACK/DTX + } + else { + harq_ack[0] = 4; // DTX + harq_ack[1] = 4; // DTX + harq_ack[2] = 4; // DTX + } + } // if (metric[0]==max_metric) { + else if (metric[1]==max_metric) { + + if (pucch_b0b1[1][0] == 1 && pucch_b0b1[1][1] != 1){ + harq_ack[0] = 1; // ACK + harq_ack[1] = 1; // ACK + harq_ack[2] = 6; // NACK/DTX + tdd_multiplexing_mask = 0x3; + } + else if (pucch_b0b1[1][0] != 1 && pucch_b0b1[1][1] == 1 ) { + harq_ack[0] = 6; // NACK/DTX + harq_ack[1] = 1; // ACK + harq_ack[2] = 6; // NACK/DTX + tdd_multiplexing_mask = 0x2; + } + else { + harq_ack[0] = 4; // DTX + harq_ack[1] = 4; // DTX + harq_ack[2] = 4; // DTX + } + } // if (metric[1]==max_metric) { + else { + if (pucch_b0b1[2][0] == 1 && pucch_b0b1[2][1] == 1){ + harq_ack[0] = 1; // ACK + harq_ack[1] = 1; // ACK + harq_ack[2] = 1; // ACK + tdd_multiplexing_mask = 0x7; + } + else if (pucch_b0b1[2][0] == 1 && pucch_b0b1[2][1] != 1 ) { + harq_ack[0] = 1; // ACK + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 1; // ACK + tdd_multiplexing_mask = 0x5; + } + else if (pucch_b0b1[2][0] != 1 && pucch_b0b1[2][1] == 1 ) { + harq_ack[0] = 6; // NACK/DTX + harq_ack[1] = 1; // ACK + harq_ack[2] = 1; // ACK + tdd_multiplexing_mask = 0x6; + } + else if (pucch_b0b1[2][0] != 1 && pucch_b0b1[2][1] != 1 ) { + harq_ack[0] = 6; // NACK/DTX + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 1; // ACK + tdd_multiplexing_mask = 0x4; + } + } + uci->stat = max_metric; + fill_uci_harq_indication(eNB,uci,frame,subframe,harq_ack,1,tdd_multiplexing_mask); // multiplexing mode + } + } //else if ((uci->tdd_bundling == 0) && (res==3)) + else if ((uci->tdd_bundling == 0) && (uci->num_pucch_resources==4)){ // multiplexing + no SR, implement Table 10.1.3-7 (Rel14) for multiplexing with M=4 + if (pucch_b0b1[0][0] == 4 || + pucch_b0b1[1][0] == 4 || + pucch_b0b1[2][0] == 4 || + pucch_b0b1[3][0] == 4) { // there isn't a likely transmission + harq_ack[0] = 4; // DTX + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 6; // NACK/DTX + harq_ack[3] = 6; // NACK/DTX + + } else { + + max_metric = max(metric[0],max(metric[1],max(metric[2],metric[3]))); + + if (metric[0]==max_metric) { + if (pucch_b0b1[0][0] == 1 && pucch_b0b1[0][1] != 1){ + harq_ack[0] = 2; // NACK + harq_ack[1] = 4; // DTX + harq_ack[2] = 4; // DTX + harq_ack[3] = 4; // DTX + } + else if (pucch_b0b1[0][0] != 1 && pucch_b0b1[0][1] == 1){ + harq_ack[0] = 1; // ACK + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 6; // NACK/DTX + harq_ack[3] = 1; // ACK + tdd_multiplexing_mask = 0x9; + } + else if (pucch_b0b1[0][0] == 1 && pucch_b0b1[0][1] == 1){ + harq_ack[0] = 1; // ACK + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 6; // NACK/DTX + harq_ack[3] = 6; // NACK/DTX + tdd_multiplexing_mask = 0x1; + } + else if (pucch_b0b1[0][0] != 1 && pucch_b0b1[0][1] != 1){ + harq_ack[0] = 2; // NACK + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 6; // NACK/DTX + harq_ack[3] = 6; // NACK/DTX + } + + } + else if (metric[1]==max_metric) { + if (pucch_b0b1[1][0] == 1 && pucch_b0b1[1][1] == 1){ + harq_ack[0] = 1; // ACK + harq_ack[1] = 1; // ACK + harq_ack[2] = 1; // ACK + harq_ack[3] = 1; // ACK + tdd_multiplexing_mask = 0xF; + } + else if (pucch_b0b1[1][0] == 1 && pucch_b0b1[1][1] != 1 ) { + harq_ack[0] = 1; // ACK + harq_ack[1] = 1; // ACK + harq_ack[2] = 6; // NACK/DTX + harq_ack[3] = 6; // NACK/DTX + tdd_multiplexing_mask = 0x3; + } + else if (pucch_b0b1[1][0] != 1 && pucch_b0b1[1][1] != 1 ) { + harq_ack[0] = 6; // NACK/DTX + harq_ack[1] = 1; // ACK + harq_ack[2] = 1; // ACK + harq_ack[3] = 1; // ACK + tdd_multiplexing_mask = 0xE; + } + else if (pucch_b0b1[1][0] != 1 && pucch_b0b1[1][1] == 1 ) { + harq_ack[0] = 6; // NACK/DTX + harq_ack[1] = 1; // ACK + harq_ack[2] = 6; // NACK/DTX + harq_ack[3] = 6; // NACK/DTX + tdd_multiplexing_mask = 0x2; + } + } + else if (metric[2]==max_metric) { + if (pucch_b0b1[2][0] == 1 && pucch_b0b1[2][1] == 1){ + harq_ack[0] = 1; // ACK + harq_ack[1] = 1; // ACK + harq_ack[2] = 1; // ACK + harq_ack[3] = 6; // NACK/DTX + tdd_multiplexing_mask = 0x7; + } + else if (pucch_b0b1[2][0] == 1 && pucch_b0b1[2][1] != 1 ) { + harq_ack[0] = 1; // ACK + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 1; // ACK + harq_ack[3] = 6; // NACK/DTX + tdd_multiplexing_mask = 0x5; + } + else if (pucch_b0b1[2][0] != 1 && pucch_b0b1[2][1] == 1 ) { + harq_ack[0] = 4; // NACK/DTX + harq_ack[1] = 1; // ACK + harq_ack[2] = 1; // ACK + harq_ack[3] = 4; // NACK/DTX + tdd_multiplexing_mask = 0x6; + } + else if (pucch_b0b1[2][0] != 1 && pucch_b0b1[2][1] != 1 ) { + harq_ack[0] = 4; // NACK/DTX + harq_ack[1] = 4; // NACK/DTX + harq_ack[2] = 1; // ACK + harq_ack[3] = 4; // NACK/DTX + tdd_multiplexing_mask = 0x4; + } + } + else { // max_metric[3]=max_metric + if (pucch_b0b1[2][0] == 1 && pucch_b0b1[2][1] == 1){ + harq_ack[0] = 1; // ACK + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 1; // ACK + harq_ack[3] = 1; // ACK + tdd_multiplexing_mask = 0xD; + } + else if (pucch_b0b1[2][0] == 1 && pucch_b0b1[2][1] != 1 ) { + harq_ack[0] = 6; // NACK/DTX + harq_ack[1] = 1; // ACK + harq_ack[2] = 6; // NACK/DTX + harq_ack[3] = 1; // ACK + tdd_multiplexing_mask = 0xA; + } + else if (pucch_b0b1[2][0] != 1 && pucch_b0b1[2][1] == 1 ) { + harq_ack[0] = 6; // NACK/DTX + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 1; // ACK + harq_ack[3] = 1; // ACK + tdd_multiplexing_mask = 0xC; + } + else if (pucch_b0b1[2][0] != 1 && pucch_b0b1[2][1] != 1 ) { + harq_ack[0] = 6; // NACK/DTX + harq_ack[1] = 6; // NACK/DTX + harq_ack[2] = 6; // NACK/DTX + harq_ack[3] = 1; // ACK + tdd_multiplexing_mask = 0x8; + } + } + } + uci->stat = max_metric; + fill_uci_harq_indication(eNB,uci,frame,subframe,harq_ack,1,tdd_multiplexing_mask); // multiplexing mode + } // else if ((uci->tdd_bundling == 0) && (res==4)) + else { // bundling + harq_ack[0] = pucch_b0b1[0][0]; + harq_ack[1] = pucch_b0b1[0][1]; + uci->stat = metric[0]; + fill_uci_harq_indication(eNB,uci,frame,subframe,harq_ack,0,0xffff); // special_bundling mode + } + #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, - frame,subframe, - n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, (%d,%d)\n",eNB->Mod_id, + eNB->dlsch[UE_id][0]->rnti, + frame,subframe, + metric0,metric1,pucch_b0b1[0],pucch_b0b1[1]); #endif - metric0=0; - metric1=0; - - // Check n1_pucch0 metric - if (n1_pucch0 != -1) { - if (abstraction_flag == 0) - metric0 = rx_pucch(phy_vars_eNB, - format, - UE_id, - (uint16_t)n1_pucch0, - 0, // n2_pucch - 0, // shortened format - pucch_payload0, - frame, - subframe, - PUCCH1a_THRES); - else { -#ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, - format, - 0, - pucch_payload0, - subframe); -#endif - } - } - - // Check n1_pucch1 metric - if (n1_pucch1 != -1) { - if (abstraction_flag == 0) - metric1 = rx_pucch(phy_vars_eNB, - format, - UE_id, - (uint16_t)n1_pucch1, - 0, //n2_pucch - 0, // shortened format - pucch_payload1, - frame, - subframe, - PUCCH1a_THRES); - else { -#ifdef PHY_ABSTRACTION - metric1 = rx_pucch_emul(phy_vars_eNB,UE_id, - format, - 1, - pucch_payload1, - subframe); - - -#endif - } - } - } - - if (SR_payload == 1) { - pucch_payload = pucch_payload0; - - if (bundling_flag == bundling) - pucch_sel = 2; - } else if (bundling_flag == multiplexing) { // multiplexing + no SR - pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0; - pucch_sel = (metric1>metric0) ? 1 : 0; - } else { // bundling + no SR - if (n1_pucch1 != -1) - pucch_payload = pucch_payload1; - else if (n1_pucch0 != -1) - pucch_payload = pucch_payload0; - - pucch_sel = 2; // indicate that this is a bundled ACK/NAK - } - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, - frame,subframe, - metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); -#endif - process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB, - 0,// pusch_flag - pucch_payload, - pucch_sel, - SR_payload); - } + } + break; + default: + AssertFatal(1==0,"Unsupported UCI type %d\n",uci->type); + break; } - - } -} - -void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { - - uint8_t access_mode; - int num_active_cba_groups; - const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - uint16_t rnti=0; - int ret=0; - - num_active_cba_groups = phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups; - - if ((phy_vars_eNB->ulsch_eNB[UE_id]) && - (num_active_cba_groups > 0) && - (phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) && - (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) { - rnti=0; -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe, - UE_id, (uint16_t)phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[UE_id].mode]); -#endif - - if (abstraction_flag==0) { - rx_ulsch(phy_vars_eNB, - sched_subframe, - phy_vars_eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id - UE_id, - phy_vars_eNB->ulsch_eNB, - 0); - } - -#ifdef PHY_ABSTRACTION - else { - rx_ulsch_emul(phy_vars_eNB, - subframe, - phy_vars_eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id - UE_id); - } - -#endif - - if (abstraction_flag == 0) { - ret = ulsch_decoding(phy_vars_eNB, - UE_id, - sched_subframe, - 0, // control_only_flag - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->V_UL_DAI, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); - } - -#ifdef PHY_ABSTRACTION - else { - ret = ulsch_decoding_emul(phy_vars_eNB, - sched_subframe, - UE_id, - &rnti); - } - -#endif - - if (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->cqi_crc_status == 1) { -#ifdef DEBUG_PHY_PROC - - print_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL); -#endif - access_mode = UNKNOWN_ACCESS; - extract_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format, - &phy_vars_eNB->eNB_UE_stats[UE_id], - phy_vars_eNB->lte_frame_parms.N_RB_DL, - &rnti, &access_mode); - phy_vars_eNB->eNB_UE_stats[UE_id].rank = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o_RI[0]; - } - - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status= SCH_IDLE; - - if ((num_active_cba_groups > 0) && - (UE_id + num_active_cba_groups < NUMBER_OF_UE_MAX) && - (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->cba_rnti[UE_id%num_active_cba_groups] > 0 ) && - (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->num_active_cba_groups> 0)) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n", - phy_vars_eNB->Mod_id,harq_pid,frame,subframe,UE_id,harq_pid, - UE_id+num_active_cba_groups, UE_id%phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups); -#endif - phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; - phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE; - phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS; + if (SR_payload == 1) { + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",eNB->Mod_id, + uci->rnti,frame,subframe); + + if (eNB->first_sr[i] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 + eNB->first_sr[i] = 0; + eNB->dlsch[i][0]->harq_processes[0]->round=0; + eNB->dlsch[i][0]->harq_processes[0]->status=SCH_IDLE; + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", + eNB->Mod_id, + eNB->ulsch[i]->rnti,frame,subframe); + } } - - if (ret == (1+MAX_TURBO_ITERATIONS)) { - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round]++; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 0; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++; - } // ulsch in error - else { - LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe); - - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 1; - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round = 0; - phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_consecutive_errors = 0; -#ifdef DEBUG_PHY_PROC -#ifdef DEBUG_ULSCH - LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:", - frame,subframe, - harq_pid,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3); - - for (j=0; julsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b[j]); - - LOG_T(PHY,"\n"); -#endif -#endif - - if (access_mode > UNKNOWN_ACCESS) { - LOG_D(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n", - phy_vars_eNB->Mod_id, frame,subframe, - UE_id, phy_vars_eNB->ulsch_eNB[UE_id]->rnti, - UE_id % phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]); - - // detect if there is a CBA collision - if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) { - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame,subframe, - phy_vars_eNB->ulsch_eNB[UE_id]->rnti, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3, - harq_pid, - NULL); - - phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;//(subframe); - } else { - if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 1 ) - LOG_N(PHY,"[eNB%d] Frame %d subframe %d : first CBA collision detected \n ", - phy_vars_eNB->Mod_id,frame,subframe); - - LOG_N(PHY,"[eNB%d] Frame %d subframe %d : CBA collision set SR for UE %d in group %d \n ", - phy_vars_eNB->Mod_id,frame,subframe, - phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups],UE_id%num_active_cba_groups ); - - phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1; - - mac_xface->SR_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe); - } - } // UNKNOWN_ACCESS - } // ULSCH CBA not in error + } } - } -void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) +void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { - //RX processing - UNUSED(r_type); - uint32_t l, ret=0,i,j,k; - uint32_t harq_pid, harq_idx, round; + uint32_t ret=0,i; + uint32_t harq_pid; uint8_t nPRS; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; - int sync_pos; - uint16_t rnti=0; - uint8_t access_mode; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + LTE_eNB_ULSCH_t *ulsch; + LTE_UL_eNB_HARQ_t *ulsch_harq; - const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; - const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - - AssertFatal(sched_subframe < NUM_ENB_THREADS, "Bad sched_subframe %d", sched_subframe); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1); - start_meas(&phy_vars_eNB->phy_proc_rx); -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, subframe); -#endif - - T(T_ENB_PHY_UL_TICK, T_INT(phy_vars_eNB->Mod_id), T_INT(frame), T_INT(subframe)); - - T(T_ENB_PHY_INPUT_SIGNAL, T_INT(phy_vars_eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(0), - T_BUFFER(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti], - phy_vars_eNB->lte_frame_parms.samples_per_tti * 4)); - - phy_vars_eNB->rb_mask_ul[0]=0; - phy_vars_eNB->rb_mask_ul[1]=0; - phy_vars_eNB->rb_mask_ul[2]=0; - phy_vars_eNB->rb_mask_ul[3]=0; - - if (abstraction_flag == 0) { - remove_7_5_kHz(phy_vars_eNB,subframe<<1); - remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1); - } - - // check if we have to detect PRACH first - if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,subframe)>0) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); - prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); - } - - if (abstraction_flag == 0) { - start_meas(&phy_vars_eNB->ofdm_demod_stats); - - for (l=0; llte_frame_parms.symbols_per_tti/2; l++) { - - slot_fep_ul(&phy_vars_eNB->lte_frame_parms, - &phy_vars_eNB->lte_eNB_common_vars, - l, - subframe<<1, - 0, - 0 - ); - slot_fep_ul(&phy_vars_eNB->lte_frame_parms, - &phy_vars_eNB->lte_eNB_common_vars, - l, - (subframe<<1)+1, - 0, - 0 - ); - } - - stop_meas(&phy_vars_eNB->ofdm_demod_stats); - } - - // Check for active processes in current subframe - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, - frame,subframe); - - // reset the cba flag used for collision detection - for (i=0; i < NUM_MAX_CBA_GROUP; i++) { - phy_vars_eNB->cba_last_reception[i]=0; - } - - // Do PUCCH processing first + const int subframe = proc->subframe_rx; + const int frame = proc->frame_rx; + + if (fp->frame_type == FDD) harq_pid = ((10*frame) + subframe)&7; + else harq_pid = subframe%10; for (i=0; imac_enabled==1) { - if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) { - process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid); - } - } - - - phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = -63; - phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = 0; - phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63; - - if ((phy_vars_eNB->ulsch_eNB[i]) && - (phy_vars_eNB->ulsch_eNB[i]->rnti>0) && - (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) { - // UE is has ULSCH scheduling - round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; - + ulsch = eNB->ulsch[i]; + ulsch_harq = ulsch->harq_processes[harq_pid]; + if (ulsch->rnti>0) LOG_D(PHY,"eNB->ulsch[%d]->harq_processes[harq_pid:%d] SFN/SF:%04d%d: PUSCH procedures, UE %d/%x ulsch_harq[status:%d SFN/SF:%04d%d handled:%d]\n", + i, harq_pid, frame,subframe,i,ulsch->rnti, + ulsch_harq->status, ulsch_harq->frame, ulsch_harq->subframe, ulsch_harq->handled); + + if ((ulsch) && + (ulsch->rnti>0) && + (ulsch_harq->status == ACTIVE) && + (ulsch_harq->frame == frame) && + (ulsch_harq->subframe == subframe) && + (ulsch_harq->handled == 0)) { + + // UE has ULSCH scheduling for (int rb=0; - rb<=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; + rb<=ulsch_harq->nb_rb; rb++) { - int rb2 = rb+phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb; - phy_vars_eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31)); - } -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x (UE_id %d)\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe,phy_vars_eNB->ulsch_eNB[i]->rnti,i); -#endif - - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { - LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n", - phy_vars_eNB->Mod_id, - frame, - subframe, - phy_vars_eNB->eNB_UE_stats[i].sector); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,1); - } else { - LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s\n", - phy_vars_eNB->Mod_id, - frame, - subframe, - i, - mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]); + int rb2 = rb+ulsch_harq->first_rb; + eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31)); } + LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d \n", eNB->Mod_id, frame, subframe, i); - nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]; + nPRS = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]; - phy_vars_eNB->ulsch_eNB[i]->cyclicShift = (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + + ulsch->cyclicShift = (ulsch_harq->n_DMRS2 + + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + nPRS)%12; - if (frame_parms->frame_type == FDD ) { - int sf = (subframe<4) ? (subframe+6) : (subframe-4); - - if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1; - } else { - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0; - } - } - LOG_D(PHY, - "[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n", - phy_vars_eNB->Mod_id,harq_pid,frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx, - phy_vars_eNB->ulsch_eNB[i]->cyclicShift, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2, - phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, - nPRS, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK); - phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; - phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; - phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs; - start_meas(&phy_vars_eNB->ulsch_demodulation_stats); + "[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, Qm %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, ), O_ACK %d, beta_cqi %d \n", + eNB->Mod_id,harq_pid,frame,subframe, + ulsch_harq->dci_alloc, + ulsch_harq->rar_alloc, + ulsch_harq->round, + ulsch_harq->first_rb, + ulsch_harq->nb_rb, + ulsch_harq->Qm, + ulsch_harq->TBS, + ulsch_harq->rvidx, + ulsch->cyclicShift, + ulsch_harq->n_DMRS2, + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, + ulsch_harq->O_ACK, + ulsch->beta_offset_cqi_times8); - if (abstraction_flag==0) { - rx_ulsch(phy_vars_eNB, - sched_subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id - i, - phy_vars_eNB->ulsch_eNB, - 0); - } + start_meas(&eNB->ulsch_demodulation_stats); -#ifdef PHY_ABSTRACTION - else { - rx_ulsch_emul(phy_vars_eNB, - subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id - i); - } + rx_ulsch(eNB,proc, i); -#endif - stop_meas(&phy_vars_eNB->ulsch_demodulation_stats); + stop_meas(&eNB->ulsch_demodulation_stats); + start_meas(&eNB->ulsch_decoding_stats); - start_meas(&phy_vars_eNB->ulsch_decoding_stats); + ret = ulsch_decoding(eNB,proc, + i, + 0, // control_only_flag + ulsch_harq->V_UL_DAI, + ulsch_harq->nb_rb>20 ? 1 : 0); - if (abstraction_flag == 0) { - ret = ulsch_decoding(phy_vars_eNB, - i, - sched_subframe, - 0, // control_only_flag - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); - } + stop_meas(&eNB->ulsch_decoding_stats); -#ifdef PHY_ABSTRACTION - else { - ret = ulsch_decoding_emul(phy_vars_eNB, - sched_subframe, - i, - &rnti); - } - -#endif - stop_meas(&phy_vars_eNB->ulsch_decoding_stats); - - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d ulsch_harq->cqi_crc_status:%d ackBits:%d ulsch_decoding_stats[t:%lld max:%lld]\n", + eNB->Mod_id,harq_pid, frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], - ret); + ulsch->rnti, + dB_fixed(eNB->pusch_vars[i]->ulsch_power[0]), + dB_fixed(eNB->pusch_vars[i]->ulsch_power[1]), + 20,//eNB->measurements.n0_power_dB[0], + 20,//eNB->measurements.n0_power_dB[1], + ulsch_harq->o_ACK[0], + ulsch_harq->o_ACK[1], + ret, + ulsch_harq->cqi_crc_status, + ulsch_harq->O_ACK, + eNB->ulsch_decoding_stats.diff_now, eNB->ulsch_decoding_stats.max); + //compute the expected ULSCH RX power (for the stats) + ulsch_harq->delta_TF = get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 0); // 0 means bw_factor is not considered - //compute the expected ULSCH RX power (for the stats) - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF = - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0); // 0 means bw_factor is not considered - - //dump_ulsch(phy_vars_eNB, sched_subframe, i); - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; + if (ulsch_harq->cqi_crc_status == 1) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n", - phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid); + //if (((frame%10) == 0) || (frame < 50)) + print_CQI(ulsch_harq->o,ulsch_harq->uci_format,0,fp->N_RB_DL); #endif - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; - - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) { -#ifdef DEBUG_PHY_PROC - //if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) - print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL); -#endif - extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format, - &phy_vars_eNB->eNB_UE_stats[i], - phy_vars_eNB->lte_frame_parms.N_RB_DL, - &rnti, &access_mode); - phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0]; + fill_ulsch_cqi_indication(eNB,frame,subframe, + ulsch_harq, + ulsch->rnti); } - - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,0); - + if (ret == (1+MAX_TURBO_ITERATIONS)) { - T(T_ENB_PHY_ULSCH_UE_NACK, T_INT(phy_vars_eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(i), T_INT(phy_vars_eNB->ulsch_eNB[i]->rnti), + T(T_ENB_PHY_ULSCH_UE_NACK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(ulsch->rnti), T_INT(harq_pid)); - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; - - LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round); - - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { - LOG_D(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, - phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1); - - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], - ret); - - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == - phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) { - LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n", - phy_vars_eNB->Mod_id, i); - phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; - if (phy_vars_eNB->mac_enabled==1) { - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->eNB_UE_stats[i].crnti); - } - mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); - - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; - //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0; - - } else { - // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI) - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1; - - get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms, - subframe, - frame, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe); - } - LOG_D(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error, i = %d \n", frame,subframe,i); - } // This is Msg3 error - - else { //normal ULSCH - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, - phy_vars_eNB->ulsch_eNB[i]->Mlimit, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]); + fill_crc_indication(eNB,i,frame,subframe,1); // indicate NAK to MAC + fill_rx_indication(eNB,i,frame,subframe); // indicate SDU to MAC + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n", + eNB->Mod_id,harq_pid, + frame,subframe, i, + ulsch_harq->round-1, + ulsch->Mlimit, + ulsch_harq->o_ACK[0], + ulsch_harq->o_ACK[1]); + if (ulsch_harq->round >= 3) { + ulsch_harq->status = SCH_IDLE; + ulsch_harq->handled = 0; + ulsch->harq_mask &= ~(1 << harq_pid); + ulsch_harq->round = 0; + } #if defined(MESSAGE_CHART_GENERATOR_PHY) - MSC_LOG_RX_DISCARDED_MESSAGE( + MSC_LOG_RX_DISCARDED_MESSAGE( MSC_PHY_ENB,MSC_PHY_UE, NULL,0, "%05u:%02u ULSCH received rnti %x harq id %u round %d", frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1 + ulsch->rnti,harq_pid, + ulsch_harq->round-1 ); #endif - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mlimit) { - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mlimit %d reached\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->Mlimit); - - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors++; - - // indicate error to MAC - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - NULL, - 0, - harq_pid, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag); - } - } + /* Mark the HARQ process to release it later if max transmission reached + * (see below). + * MAC does not send the max transmission count, we have to deal with it + * locally in PHY. + */ + ulsch_harq->handled = 1; } // ulsch in error else { - T(T_ENB_PHY_ULSCH_UE_ACK, T_INT(phy_vars_eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(i), T_INT(phy_vars_eNB->ulsch_eNB[i]->rnti), + fill_crc_indication(eNB,i,frame,subframe,0); // indicate ACK to MAC + fill_rx_indication(eNB,i,frame,subframe); // indicate SDU to MAC + + ulsch_harq->status = SCH_IDLE; + ulsch->harq_mask &= ~(1 << harq_pid); + + T(T_ENB_PHY_ULSCH_UE_ACK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(ulsch->rnti), T_INT(harq_pid)); - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { - LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe); - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], - ret); - } #if defined(MESSAGE_CHART_GENERATOR_PHY) - MSC_LOG_RX_MESSAGE( - MSC_PHY_ENB,MSC_PHY_UE, - NULL,0, - "%05u:%02u ULSCH received rnti %x harq id %u", - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid - ); + MSC_LOG_RX_MESSAGE( + MSC_PHY_ENB,MSC_PHY_UE, + NULL,0, + "%05u:%02u ULSCH received rnti %x harq id %u", + frame,subframe, + ulsch->rnti,harq_pid + ); #endif - for (j=0; jlte_frame_parms.nb_antennas_rx; j++) - //this is the RSSI per RB - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = - - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]* - (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/ - phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) - - phy_vars_eNB->rx_total_gain_eNB_dB - - hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 - - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100; - - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0; - - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { - if (phy_vars_eNB->mac_enabled==1) { - - LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n", - phy_vars_eNB->Mod_id, - frame,harq_pid,i); - - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, - harq_pid, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag); - - // one-shot msg3 detection by MAC: empty PDU (e.g. CRNTI) - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 0 ) { - phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->eNB_UE_stats[i].crnti); - mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; - } // Msg3_flag == 0 - - } // mac_enabled==1 - - phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH; - phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0; - - LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,subframe,i); - - for (k=0; k<8; k++) { //harq_processes - for (j=0; jdlsch_eNB[i][0]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0; - } - - phy_vars_eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; - - for (j=0; julsch_eNB[i]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; - } - } - - phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK_round0=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_mcs_offset=0; - } // Msg3_flag==1 - else { // Msg3_flag == 0 #ifdef DEBUG_PHY_PROC #ifdef DEBUG_ULSCH LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe, - harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + harq_pid,ulsch_harq->TBS>>3); - for (j=0; julsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); + for (j=0; jTBS>>3; j++) + LOG_T(PHY,"%x.",ulsch->harq_processes[harq_pid]->b[j]); LOG_T(PHY,"\n"); #endif #endif + } // ulsch not in error - if (phy_vars_eNB->mac_enabled==1) { + if (ulsch_harq->O_ACK>0) fill_ulsch_harq_indication(eNB,ulsch_harq,ulsch->rnti,frame,subframe,ulsch->bundling); - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, - harq_pid, - NULL); - -#ifdef LOCALIZATION - start_meas(&phy_vars_eNB->localization_stats); - aggregate_eNB_UE_localization_stats(phy_vars_eNB, - i, - frame, - subframe, - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 1)/100); - stop_meas(&phy_vars_eNB->localization_stats); -#endif - - } // mac_enabled==1 - } // Msg3_flag == 0 - - // estimate timing advance for MAC - if (abstraction_flag == 0) { - sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe); - phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/4; //to check - } - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] frame %d, subframe %d: user %d: timing advance = %d\n", - phy_vars_eNB->Mod_id, - frame, subframe, - i, - phy_vars_eNB->eNB_UE_stats[i].timing_advance_update); -#endif - - - } // ulsch not in error - - // process HARQ feedback -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,subframe, - i); -#endif - process_HARQ_feedback(i, - sched_subframe, - phy_vars_eNB, - 1, // pusch_flag - 0, - 0, - 0); - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n", - phy_vars_eNB->Mod_id,frame,subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, + LOG_D(PHY,"[eNB %d] Frame %d subframe %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n", + eNB->Mod_id,frame,subframe, harq_pid, i, ret, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid], - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]); -#endif + ulsch_harq->cqi_crc_status, + ulsch_harq->o_ACK[0], + ulsch_harq->o_ACK[1], + eNB->UE_stats[i].ulsch_errors[harq_pid], + eNB->UE_stats[i].ulsch_decoding_attempts[harq_pid][0]); + } // if ((ulsch) && + // (ulsch->rnti>0) && + // (ulsch_harq->status == ACTIVE)) + else if ((ulsch) && + (ulsch->rnti>0) && + (ulsch_harq->status == ACTIVE) && + (ulsch_harq->frame == frame) && + (ulsch_harq->subframe == subframe) && + (ulsch_harq->handled == 1)) { + // this harq process is stale, kill it, this 1024 frames later (10s), consider reducing that + ulsch_harq->status = SCH_IDLE; + ulsch_harq->handled = 0; + ulsch->harq_mask &= ~(1 << harq_pid); + LOG_W(PHY,"Removing stale ULSCH config for UE %x harq_pid %d (harq_mask is now 0x%2.2x)\n", + ulsch->rnti, harq_pid, ulsch->harq_mask); + } + } // for (i=0; iproc; + + proc->tdp.eNB = eNB; + proc->instance_cnt_td = -1; + + pthread_mutex_init( &proc->mutex_td, NULL); + pthread_cond_init( &proc->cond_td, NULL); + + pthread_create(&proc->pthread_td, attr_td, td_thread, (void*)&proc->tdp); + +} + +extern void *te_thread(void*); + +void init_te_thread(PHY_VARS_eNB *eNB,pthread_attr_t *attr_te) { + + eNB_proc_t *proc = &eNB->proc; + + proc->tep.eNB = eNB; + proc->instance_cnt_te = -1; + + pthread_mutex_init( &proc->mutex_te, NULL); + pthread_cond_init( &proc->cond_te, NULL); + + printf("Creating te_thread\n"); + pthread_create(&proc->pthread_te, attr_te, te_thread, (void*)&proc->tep); + +} + +void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe) +{ + nfapi_rx_indication_pdu_t *pdu; + + int timing_advance_update; + int sync_pos; + + uint32_t harq_pid = subframe2harq_pid(&eNB->frame_parms, + frame,subframe); + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + + eNB->UL_INFO.rx_ind.sfn_sf = frame<<4| subframe; + eNB->UL_INFO.rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG; + + pdu = &eNB->UL_INFO.rx_ind.rx_indication_body.rx_pdu_list[eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus]; + + // pdu->rx_ue_information.handle = eNB->ulsch[UE_id]->handle; + pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdu->rx_ue_information.rnti = eNB->ulsch[UE_id]->rnti; + pdu->rx_indication_rel8.tl.tag = NFAPI_RX_INDICATION_REL8_TAG; + pdu->rx_indication_rel8.length = eNB->ulsch[UE_id]->harq_processes[harq_pid]->TBS>>3; + pdu->rx_indication_rel8.offset = 1; // DJP - I dont understand - but broken unless 1 ???? 0; // filled in at the end of the UL_INFO formation + pdu->data = eNB->ulsch[UE_id]->harq_processes[harq_pid]->b; + // estimate timing advance for MAC + sync_pos = lte_est_timing_advance_pusch(eNB,UE_id); + timing_advance_update = sync_pos; // - eNB->frame_parms.nb_prefix_samples/4; //to check + + // if (timing_advance_update > 10) { dump_ulsch(eNB,frame,subframe,UE_id); exit(-1);} + // if (timing_advance_update < -10) { dump_ulsch(eNB,frame,subframe,UE_id); exit(-1);} + switch (eNB->frame_parms.N_RB_DL) { + case 6: /* nothing to do */ break; + case 15: timing_advance_update /= 2; break; + case 25: timing_advance_update /= 4; break; + case 50: timing_advance_update /= 8; break; + case 75: timing_advance_update /= 12; break; + case 100: timing_advance_update /= 16; break; + default: abort(); + } + // put timing advance command in 0..63 range + timing_advance_update += 31; + if (timing_advance_update < 0) timing_advance_update = 0; + if (timing_advance_update > 63) timing_advance_update = 63; + pdu->rx_indication_rel8.timing_advance = timing_advance_update; + + // estimate UL_CQI for MAC (from antenna port 0 only) + int SNRtimes10 = dB_fixed_times10(eNB->pusch_vars[UE_id]->ulsch_power[0]) - 200;//(10*eNB->measurements.n0_power_dB[0]); + + if (SNRtimes10 < -640) pdu->rx_indication_rel8.ul_cqi=0; + else if (SNRtimes10 > 635) pdu->rx_indication_rel8.ul_cqi=255; + else pdu->rx_indication_rel8.ul_cqi=(640+SNRtimes10)/5; + + LOG_D(PHY,"[PUSCH %d] Frame %d Subframe %d Filling RX_indication with SNR %d (%d), timing_advance %d (update %d)\n", + harq_pid,frame,subframe,SNRtimes10,pdu->rx_indication_rel8.ul_cqi,pdu->rx_indication_rel8.timing_advance, + timing_advance_update); + + eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus++; + eNB->UL_INFO.rx_ind.sfn_sf = frame<<4 | subframe; + pthread_mutex_unlock(&eNB->UL_INFO_mutex); +} + +void release_harq(PHY_VARS_eNB *eNB,int UE_id,int tb,uint16_t frame,uint8_t subframe,uint16_t mask) { + + LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL; + LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL; + int harq_pid; + int subframe_tx; + int M,m; + + AssertFatal(UE_id!=-1,"no existing dlsch context\n"); + AssertFatal(UE_id= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX); + dlsch0 = eNB->dlsch[UE_id][0]; + dlsch1 = eNB->dlsch[UE_id][1]; + + if (eNB->frame_parms.frame_type == FDD) { + subframe_tx = (subframe+6)%10; + harq_pid = dlsch0->harq_ids[subframe_tx]; + AssertFatal((harq_pid>=0) && (harq_pid<10),"harq_pid %d not in 0...9\n",harq_pid); + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + AssertFatal(dlsch0_harq!=NULL,"dlsch0_harq is null\n"); + + dlsch0_harq->status = SCH_IDLE; + /*if ((dlsch1_harq == NULL)|| + ((dlsch1_harq!=NULL)&& + (dlsch1_harq->status == SCH_IDLE)))*/ + dlsch0->harq_mask &= ~(1<rnti); + + } + else { // release all processes in the bundle that was acked, based on mask + // This is at most 4 for multiplexing and 9 for bundling/special bundling + M=ul_ACK_subframe2_M(&eNB->frame_parms, + subframe); + + for (m=0; mframe_parms, + subframe, + m); + if (((1< 0) { + harq_pid = dlsch0->harq_ids[subframe_tx]; + if ((harq_pid>=0) && (harq_pid<10)) { + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + AssertFatal(dlsch0_harq!=NULL,"dlsch0_harq is null\n"); - // dump stats to VCD - if (i==0) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,phy_vars_eNB->pusch_stats_mcs[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,phy_vars_eNB->pusch_stats_rb[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,phy_vars_eNB->pusch_stats_round[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[0])); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES0+harq_pid,ret); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN0+harq_pid,(frame*10)+subframe); - } - } // ulsch_eNB[0] && ulsch_eNB[0]->rnti>0 && ulsch_eNB[0]->subframe_scheduling_flag == 1 - - - // update ULSCH statistics for tracing - if ((frame % 100 == 0) && (subframe == 4)) { - for (harq_idx=0; harq_idx<8; harq_idx++) { - for (round=0; roundulsch_eNB[i]->Mlimit; round++) { - if ((phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]) != 0) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = - (100*(phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round]))/ - (phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]); - } else { - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = 0; - } - - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round] = - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round]; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round] = - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round]; - } + dlsch0_harq->status = SCH_IDLE; + if ((dlsch1_harq == NULL)|| + ((dlsch1_harq!=NULL)&& + (dlsch1_harq->status == SCH_IDLE))) + dlsch0->harq_mask &= ~(1<eNB_UE_stats[i].dlsch_bitrate = (phy_vars_eNB->eNB_UE_stats[i].total_TBS - - phy_vars_eNB->eNB_UE_stats[i].total_TBS_last); - - phy_vars_eNB->eNB_UE_stats[i].total_TBS_last = phy_vars_eNB->eNB_UE_stats[i].total_TBS; - } - - // CBA (non-LTE) - cba_procedures(sched_subframe,phy_vars_eNB,i,harq_pid,abstraction_flag); - } // loop i=0 ... NUMBER_OF_UE_MAX-1 - - if (abstraction_flag == 0) { - lte_eNB_I0_measurements(phy_vars_eNB, - subframe, - 0, - phy_vars_eNB->first_run_I0_measurements); - phy_vars_eNB->first_run_I0_measurements = 0; } +} -#ifdef PHY_ABSTRACTION - else { - lte_eNB_I0_measurements_emul(phy_vars_eNB, - 0); +int getM(PHY_VARS_eNB *eNB,int frame,int subframe) { + + int M,Mtx=0; + LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL; + LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL; + int harq_pid; + int subframe_tx; + int m; + + M=ul_ACK_subframe2_M(&eNB->frame_parms, + subframe); + + for (m=0; mframe_parms, + subframe, + m); + harq_pid = dlsch0->harq_ids[subframe_tx]; + if (harq_pid>=0 && harq_pid<10) { + dlsch0_harq = dlsch0->harq_processes[harq_pid]; + dlsch1_harq = dlsch1->harq_processes[harq_pid]; + AssertFatal(dlsch0_harq!=NULL,"dlsch0_harq is null\n"); + if (dlsch0_harq->status == ACTIVE|| + (dlsch1_harq!=NULL && dlsch1_harq->status == ACTIVE)) Mtx ++; } - -#endif + } + return(Mtx); +} - //} +void fill_ulsch_cqi_indication(PHY_VARS_eNB *eNB,uint16_t frame,uint8_t subframe,LTE_UL_eNB_HARQ_t *ulsch_harq,uint16_t rnti) { -#ifdef EMOS - phy_procedures_emos_eNB_RX(subframe,phy_vars_eNB); -#endif + pthread_mutex_lock(&eNB->UL_INFO_mutex); + nfapi_cqi_indication_pdu_t *pdu = &eNB->UL_INFO.cqi_ind.cqi_pdu_list[eNB->UL_INFO.cqi_ind.number_of_cqis]; + nfapi_cqi_indication_raw_pdu_t *raw_pdu = &eNB->UL_INFO.cqi_ind.cqi_raw_pdu_list[eNB->UL_INFO.cqi_ind.number_of_cqis]; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,0); - stop_meas(&phy_vars_eNB->phy_proc_rx); + pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdu->rx_ue_information.rnti = rnti; + if (ulsch_harq->cqi_crc_status != 1) pdu->cqi_indication_rel9.data_offset = 0; + else pdu->cqi_indication_rel9.data_offset = 1; // fill in after all cqi_indications have been generated when non-zero + + // by default set O to rank 1 value + pdu->cqi_indication_rel9.tl.tag = NFAPI_CQI_INDICATION_REL9_TAG; + pdu->cqi_indication_rel9.length = (ulsch_harq->Or1>>3) + ((ulsch_harq->Or1&7) > 0 ? 1 : 0); + pdu->cqi_indication_rel9.ri[0] = 0; + + // if we have RI bits, set them and if rank2 overwrite O + if (ulsch_harq->O_RI>0) { + pdu->cqi_indication_rel9.ri[0] = ulsch_harq->o_RI[0]; + if (ulsch_harq->o_RI[0] == 2) pdu->cqi_indication_rel9.length = (ulsch_harq->Or2>>3) + ((ulsch_harq->Or2&7) > 0 ? 1 : 0); + pdu->cqi_indication_rel9.timing_advance = 0; + } + + pdu->cqi_indication_rel9.number_of_cc_reported = 1; + pdu->ul_cqi_information.channel = 1; // PUSCH + memcpy((void*)raw_pdu->pdu,ulsch_harq->o,pdu->cqi_indication_rel9.length); + eNB->UL_INFO.cqi_ind.number_of_cqis++; + LOG_D(PHY,"eNB->UL_INFO.cqi_ind.number_of_cqis:%d\n", eNB->UL_INFO.cqi_ind.number_of_cqis); + + pthread_mutex_unlock(&eNB->UL_INFO_mutex); } -#undef DEBUG_PHY_PROC - -#ifdef Rel10 -int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, relaying_type_t r_type) +void fill_ulsch_harq_indication(PHY_VARS_eNB *eNB,LTE_UL_eNB_HARQ_t *ulsch_harq,uint16_t rnti, int frame,int subframe,int bundling) { + int UE_id = find_dlsch(rnti,eNB,SEARCH_EXIST); + //AssertFatal(UE_id>=0,"UE_id doesn't exist\n"); - int do_proc=0;// do nothing - - switch(r_type) { - case no_relay: - do_proc= no_relay; // perform the normal eNB operation - break; - - case multicast_relay: - if (((next_slot >>1) < 6) || ((next_slot >>1) > 8)) - do_proc = 0; // do nothing - else // SF#6, SF#7 and SF#8 - do_proc = multicast_relay; // do PHY procedures eNB TX - - break; - - default: // should'not be here - LOG_W(PHY,"Not supported relay type %d, do nothing\n", r_type); - do_proc=0; - break; + if (UE_id < 0) + { + LOG_E(PHY,"%s(eNB, ulsch_harq, rnti:%04x, frame:%d, subframe:%d, bundling:%d) harq_pdus:%d - Could not find rnti - abort fill of ulsch harq ind\n", __FUNCTION__, rnti, frame, subframe, bundling,eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs); + return; } - return do_proc; + LOG_D(PHY,"%s(eNB, ulsch_harq, rnti:%04x, frame:%d, subframe:%d, bundling:%d) harq_pdus:%d O_ACK:%d\n", __FUNCTION__, rnti, frame, subframe, bundling,eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs,ulsch_harq->O_ACK); + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + nfapi_harq_indication_pdu_t *pdu = &eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list[eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs]; + int M; + int i; + + eNB->UL_INFO.harq_ind.header.message_id = NFAPI_HARQ_INDICATION; + eNB->UL_INFO.harq_ind.sfn_sf = frame<<4|subframe; + + eNB->UL_INFO.harq_ind.harq_indication_body.tl.tag = NFAPI_HARQ_INDICATION_BODY_TAG; + + pdu->instance_length = 0; // don't know what to do with this + // pdu->rx_ue_information.handle = handle; + pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdu->rx_ue_information.rnti = rnti; + + if (eNB->frame_parms.frame_type == FDD) { + pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL13_TAG; + pdu->harq_indication_fdd_rel13.mode = 0; + pdu->harq_indication_fdd_rel13.number_of_ack_nack = ulsch_harq->O_ACK; + + for (i=0;iO_ACK;i++) { + AssertFatal(ulsch_harq->o_ACK[i] == 0 || ulsch_harq->o_ACK[i] == 1, "harq_ack[%d] is %d, should be 1,2 or 4\n",i,ulsch_harq->o_ACK[i]); + + pdu->harq_indication_fdd_rel13.harq_tb_n[i] = 2-ulsch_harq->o_ACK[i]; + // release DLSCH if needed + if (ulsch_harq->o_ACK[i] == 1) release_harq(eNB,UE_id,i,frame,subframe,0xffff); + +#if T_TRACER + /* TODO: get correct harq pid */ + if (ulsch_harq->o_ACK[i] != 1) + T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(0), T_INT(frame), T_INT(subframe), + T_INT(rnti), T_INT(eNB->dlsch[UE_id][0]->harq_ids[(subframe+6)%10])); + else + T(T_ENB_PHY_DLSCH_UE_ACK, T_INT(0), T_INT(frame), T_INT(subframe), + T_INT(rnti), T_INT(eNB->dlsch[UE_id][0]->harq_ids[(subframe+6)%10])); +#endif + } + } + else { // TDD + M=ul_ACK_subframe2_M(&eNB->frame_parms, + subframe); + + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.mode = 1-bundling; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = ulsch_harq->O_ACK; + + for (i=0;iO_ACK;i++) { + AssertFatal(ulsch_harq->o_ACK[i] == 0 || ulsch_harq->o_ACK[i] == 1, "harq_ack[%d] is %d, should be 1,2 or 4\n",i,ulsch_harq->o_ACK[i]); + + pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = 2-ulsch_harq->o_ACK[i]; + // release DLSCH if needed + if (ulsch_harq->o_ACK[i] == 1) release_harq(eNB,UE_id,i,frame,subframe,0xffff); + if (M==1 && ulsch_harq->O_ACK==1 && ulsch_harq->o_ACK[i] == 1) release_harq(eNB,UE_id,0,frame,subframe,0xffff); + else if (M==1 && ulsch_harq->O_ACK==2 && ulsch_harq->o_ACK[i] == 1) release_harq(eNB,UE_id,i,frame,subframe,0xffff); + else if (M>1 && ulsch_harq->o_ACK[i] == 1) { + // spatial bundling + release_harq(eNB,UE_id,0,frame,subframe,1<UL_INFO.harq_ind.harq_indication_body.number_of_harqs:%d\n", eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs); + eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs++; + + pthread_mutex_unlock(&eNB->UL_INFO_mutex); } + +void fill_uci_harq_indication(PHY_VARS_eNB *eNB, + LTE_eNB_UCI *uci, + int frame, + int subframe, + uint8_t *harq_ack, + uint8_t tdd_mapping_mode, + uint16_t tdd_multiplexing_mask) { + + int UE_id=find_dlsch(uci->rnti,eNB,SEARCH_EXIST); + //AssertFatal(UE_id>=0,"UE_id doesn't exist rnti:%x\n", uci->rnti); + if (UE_id < 0) { + LOG_E(PHY,"SFN/SF:%04d%d Unable to find rnti:%x do not send HARQ\n", frame, subframe, uci->rnti); + return; + } + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + + nfapi_harq_indication_t *ind = &eNB->UL_INFO.harq_ind; + nfapi_harq_indication_body_t *body = &ind->harq_indication_body; + nfapi_harq_indication_pdu_t *pdu = &body->harq_pdu_list[eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs]; + + ind->sfn_sf = frame<<4|subframe; + ind->header.message_id = NFAPI_HARQ_INDICATION; + + body->tl.tag = NFAPI_HARQ_INDICATION_BODY_TAG; + + pdu->instance_length = 0; // don't know what to do with this + // pdu->rx_ue_information.handle = handle; + pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdu->rx_ue_information.rnti = uci->rnti; + + // estimate UL_CQI for MAC (from antenna port 0 only) + pdu->ul_cqi_information.tl.tag = NFAPI_UL_CQI_INFORMATION_TAG; + int SNRtimes10 = dB_fixed_times10(uci->stat) - 200;//(10*eNB->measurements.n0_power_dB[0]); + + if (SNRtimes10 < -100) LOG_I(PHY,"uci->stat %d \n",uci->stat); + + if (SNRtimes10 < -640) pdu->ul_cqi_information.ul_cqi=0; + else if (SNRtimes10 > 635) pdu->ul_cqi_information.ul_cqi=255; + else pdu->ul_cqi_information.ul_cqi=(640+SNRtimes10)/5; + pdu->ul_cqi_information.channel = 0; + + if (eNB->frame_parms.frame_type == FDD) { + if (uci->pucch_fmt == pucch_format1a) { + pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL13_TAG; + pdu->harq_indication_fdd_rel13.mode = 0; + pdu->harq_indication_fdd_rel13.number_of_ack_nack = 1; + + AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); + pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; + // release DLSCH if needed + if (harq_ack[0] == 1) release_harq(eNB,UE_id,0,frame,subframe,0xffff); + +#if T_TRACER + if (harq_ack[0] != 1) + T(T_ENB_PHY_DLSCH_UE_NACK, T_INT(0), T_INT(frame), T_INT(subframe), + T_INT(uci->rnti), T_INT(eNB->dlsch[UE_id][0]->harq_ids[(subframe+6)%10])); + else + T(T_ENB_PHY_DLSCH_UE_ACK, T_INT(0), T_INT(frame), T_INT(subframe), + T_INT(uci->rnti), T_INT(eNB->dlsch[UE_id][0]->harq_ids[(subframe+6)%10])); #endif -void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t abstraction_flag, - relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) -{ -#if defined(ENABLE_ITTI) - MessageDef *msg_p; - const char *msg_name; - instance_t instance; - unsigned int Mod_id; - int result; -#endif + } + else if (uci->pucch_fmt == pucch_format1b) { + pdu->harq_indication_fdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_FDD_REL13_TAG; + pdu->harq_indication_fdd_rel13.mode = 0; + pdu->harq_indication_fdd_rel13.number_of_ack_nack = 2; + AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); + AssertFatal(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); + pdu->harq_indication_fdd_rel13.harq_tb_n[0] = harq_ack[0]; + pdu->harq_indication_fdd_rel13.harq_tb_n[1] = harq_ack[1]; + // release DLSCH if needed + if (harq_ack[0] == 1) release_harq(eNB,UE_id,0,frame,subframe,0xffff); + if (harq_ack[1] == 1) release_harq(eNB,UE_id,1,frame,subframe,0xffff); + } + else AssertFatal(1==0,"only format 1a/b for now, received %d\n",uci->pucch_fmt); + } + else { // TDD + AssertFatal(tdd_mapping_mode==0 || tdd_mapping_mode==1 || tdd_mapping_mode==2, + "Illegal tdd_mapping_mode %d\n",tdd_mapping_mode); - int CC_id=0; + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.mode = tdd_mapping_mode; - /* - if (phy_vars_eNB->proc[sched_subframe].frame_tx >= 1000) - mac_xface->macphy_exit("Exiting after 1000 Frames\n"); - */ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, phy_vars_eNB[0]->proc[subframe].frame_tx); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,1); - start_meas(&phy_vars_eNB[0]->phy_proc); + switch (tdd_mapping_mode) { + case 0: // bundling -#if defined(ENABLE_ITTI) + if (uci->pucch_fmt == pucch_format1a) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; + AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); + pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; + // release all bundled DLSCH if needed + if (harq_ack[0] == 1) release_harq(eNB,UE_id,0,frame,subframe,0xffff); + } + else if (uci->pucch_fmt == pucch_format1b) { + pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; + AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); + AssertFatal(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.harq_data[0].bundling.value_0 = harq_ack[0]; + pdu->harq_indication_tdd_rel13.harq_data[1].bundling.value_0 = harq_ack[1]; + // release all DLSCH if needed + if (harq_ack[0] == 1) release_harq(eNB,UE_id,0,frame,subframe,0xffff); + if (harq_ack[1] == 1) release_harq(eNB,UE_id,1,frame,subframe,0xffff); + } + break; + case 1: // multiplexing + AssertFatal(uci->pucch_fmt == pucch_format1b,"uci->pucch_format %d is not format1b\n",uci->pucch_fmt); + + if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1a) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; + AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[0] == 4, "harq_ack[0] is %d, should be 1,2 or 4\n",harq_ack[0]); + pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; + // release all DLSCH if needed + if (harq_ack[0] == 1) release_harq(eNB,UE_id,0,frame,subframe,0xffff); + } + else if (uci->num_pucch_resources == 1 && uci->pucch_fmt == pucch_format1b) { + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = 2; + AssertFatal(harq_ack[0] == 1 || harq_ack[0] == 2 || harq_ack[1] == 4, "harq_ack[0] is %d, should be 0,1 or 4\n",harq_ack[0]); + AssertFatal(harq_ack[1] == 1 || harq_ack[1] == 2 || harq_ack[1] == 4, "harq_ack[1] is %d, should be 0,1 or 4\n",harq_ack[1]); + pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; + pdu->harq_indication_tdd_rel13.harq_data[1].multiplex.value_0 = harq_ack[1]; + // release all DLSCH if needed + if (harq_ack[0] == 1) release_harq(eNB,UE_id,0,frame,subframe,0xffff); + if (harq_ack[1] == 1) release_harq(eNB,UE_id,1,frame,subframe,0xffff); + } + else { // num_pucch_resources (M) > 1 + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = uci->num_pucch_resources; - do { - // Checks if a message has been sent to PHY sub-task - itti_poll_msg (TASK_PHY_ENB, &msg_p); - - if (msg_p != NULL) { - msg_name = ITTI_MSG_NAME (msg_p); - instance = ITTI_MSG_INSTANCE (msg_p); - Mod_id = instance; - - switch (ITTI_MSG_ID(msg_p)) { -# if ENABLE_RAL - - case TIMER_HAS_EXPIRED: - // check if it is a measurement timer - { - hashtable_rc_t hashtable_rc; - - hashtable_rc = hashtable_is_key_exists(PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id)); - - if (hashtable_rc == HASH_TABLE_OK) { - phy_eNB_lte_check_measurement_thresholds(instance, (ral_threshold_phy_t*)TIMER_HAS_EXPIRED(msg_p).arg); - } + pdu->harq_indication_tdd_rel13.harq_data[0].multiplex.value_0 = harq_ack[0]; + pdu->harq_indication_tdd_rel13.harq_data[1].multiplex.value_0 = harq_ack[1]; + if (uci->num_pucch_resources == 3) pdu->harq_indication_tdd_rel13.harq_data[2].multiplex.value_0 = harq_ack[2]; + if (uci->num_pucch_resources == 4) pdu->harq_indication_tdd_rel13.harq_data[3].multiplex.value_0 = harq_ack[3]; + // spatial-bundling in this case so release both HARQ if necessary + release_harq(eNB,UE_id,0,frame,subframe,tdd_multiplexing_mask); + release_harq(eNB,UE_id,1,frame,subframe,tdd_multiplexing_mask); + } + break; + case 2: // special bundling (SR collision) + pdu->harq_indication_tdd_rel13.tl.tag = NFAPI_HARQ_INDICATION_TDD_REL13_TAG; + pdu->harq_indication_tdd_rel13.number_of_ack_nack = 1; + int tdd_config5_sf2scheds=0; + if (eNB->frame_parms.tdd_config==5) tdd_config5_sf2scheds = getM(eNB,frame,subframe); + + switch (harq_ack[0]) { + case 0: + break; + case 1: // check if M=1,4,7 + if (uci->num_pucch_resources == 1 || uci->num_pucch_resources == 4 || + tdd_config5_sf2scheds == 1 || tdd_config5_sf2scheds == 4 || tdd_config5_sf2scheds == 7) { + release_harq(eNB,UE_id,0,frame,subframe,0xffff); + release_harq(eNB,UE_id,1,frame,subframe,0xffff); + } + break; + case 2: // check if M=2,5,8 + if (uci->num_pucch_resources == 2 || tdd_config5_sf2scheds == 2 || + tdd_config5_sf2scheds == 5 || tdd_config5_sf2scheds == 8) { + release_harq(eNB,UE_id,0,frame,subframe,0xffff); + release_harq(eNB,UE_id,1,frame,subframe,0xffff); + } + break; + case 3: // check if M=3,6,9 + if (uci->num_pucch_resources == 3 || tdd_config5_sf2scheds == 3 || + tdd_config5_sf2scheds == 6 || tdd_config5_sf2scheds == 9) { + release_harq(eNB,UE_id,0,frame,subframe,0xffff); + release_harq(eNB,UE_id,1,frame,subframe,0xffff); + } + break; } break; - - case PHY_MEAS_THRESHOLD_REQ: -#warning "TO DO LIST OF THRESHOLDS" - LOG_D(PHY, "[ENB %d] Received %s\n", Mod_id, msg_name); - { - ral_threshold_phy_t* threshold_phy_p = NULL; - int index, res; - long timer_id; - hashtable_rc_t hashtable_rc; - - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action) { - - case RAL_TH_ACTION_CANCEL_THRESHOLD: - break; - - case RAL_TH_ACTION_SET_NORMAL_THRESHOLD: - case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD: - for (index = 0; index < PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.num_thresholds; index++) { - threshold_phy_p = calloc(1, sizeof(ral_threshold_phy_t)); - threshold_phy_p->th_action = PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action; - memcpy(&threshold_phy_p->link_param.link_param_type, - &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type, - sizeof(ral_link_param_type_t)); - - memcpy(&threshold_phy_p->threshold, - &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.thresholds[index], - sizeof(ral_threshold_t)); - - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice) { - - case RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL: - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) { - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - SLIST_INSERT_HEAD( - &PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen], - threshold_phy_p, - ral_thresholds); - break; - - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - SLIST_INSERT_HEAD( - &PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte], - threshold_phy_p, - ral_thresholds); - break; - - default: - LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.link_param_type.choice %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice, msg_name); - } - - break; - - case RAL_LINK_CFG_PARAM_CHOICE_TIMER: - res = timer_setup( - (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval/1000),//uint32_t interval_sec, - (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval%1000),//uint32_t interval_us, - TASK_PHY_ENB, - instance, - TIMER_PERIODIC, - threshold_phy_p, - &timer_id); - - if (res == 0) { - hashtable_rc = hashtable_insert(PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p); - - if (hashtable_rc == HASH_TABLE_OK) { - threshold_phy_p->timer_id = timer_id; - } else { - LOG_E(PHY, "[ENB %d] %s: Error in hashtable. Could not configure threshold index %d \n", - Mod_id, msg_name, index); - } - - } else { - LOG_E(PHY, "[ENB %d] %s: Could not configure threshold index %d because of timer initialization failure\n", - Mod_id, msg_name, index); - } - - break; - - default: // already checked in RRC, should not happen here - LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.union_choice %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice, msg_name); - } - } - - break; - - default: - LOG_E(PHY, "[ENB %d] BAD PARAMETER th_action value %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action, msg_name); - } - - } - break; -# endif - - /* Messages from eNB app */ - case PHY_CONFIGURATION_REQ: - LOG_I(PHY, "[eNB %d] Received %s\n", instance, msg_name); - /* TODO */ - - break; - - default: - LOG_E(PHY, "[ENB %d] Received unexpected message %s\n", Mod_id, msg_name); - break; - } - - result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); } - } while(msg_p != NULL); - -#endif + } //TDD - for (CC_id=0; CC_idlte_frame_parms.frame_type == TDD)&& - (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_DL))|| - (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { -#ifdef Rel10 + eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs++; + LOG_D(PHY,"Incremented eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs:%d\n", eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs); + pthread_mutex_unlock(&eNB->UL_INFO_mutex); - if (phy_procedures_RN_eNB_TX(phy_vars_eNB[CC_id]->proc[subframe].subframe_rx, phy_vars_eNB[CC_id]->proc[subframe].subframe_tx, r_type) != 0 ) -#endif - phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn); - } - - if ((((phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == TDD )&& - (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_UL)) || - (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))) { - phy_procedures_eNB_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type); - } - - if (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_S) { -#ifdef Rel10 - - if (phy_procedures_RN_eNB_TX(subframe, subframe, r_type) != 0 ) -#endif - phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn); - } - - if ((subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_S)) { - phy_procedures_eNB_S_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type); - } - - phy_vars_eNB[CC_id]->proc[subframe].frame_tx++; - phy_vars_eNB[CC_id]->proc[subframe].frame_rx++; - - if (phy_vars_eNB[CC_id]->proc[subframe].frame_tx>=MAX_FRAME_NUMBER) // defined in impl_defs_top.h - phy_vars_eNB[CC_id]->proc[subframe].frame_tx-=MAX_FRAME_NUMBER; - - if (phy_vars_eNB[CC_id]->proc[subframe].frame_rx>=MAX_FRAME_NUMBER) - phy_vars_eNB[CC_id]->proc[subframe].frame_rx-=MAX_FRAME_NUMBER; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,0); - stop_meas(&phy_vars_eNB[0]->phy_proc); } + +void fill_crc_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe,uint8_t crc_flag) { + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + nfapi_crc_indication_pdu_t *pdu = &eNB->UL_INFO.crc_ind.crc_indication_body.crc_pdu_list[eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs]; + + eNB->UL_INFO.crc_ind.sfn_sf = frame<<4 | subframe; + eNB->UL_INFO.crc_ind.header.message_id = NFAPI_CRC_INDICATION; + eNB->UL_INFO.crc_ind.crc_indication_body.tl.tag = NFAPI_CRC_INDICATION_BODY_TAG; + + pdu->instance_length = 0; // don't know what to do with this + // pdu->rx_ue_information.handle = handle; + pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; + pdu->rx_ue_information.rnti = eNB->ulsch[UE_id]->rnti; + pdu->crc_indication_rel8.tl.tag = NFAPI_CRC_INDICATION_REL8_TAG; + pdu->crc_indication_rel8.crc_flag = crc_flag; + + eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs++; + + //LOG_D(PHY, "%s() rnti:%04x crcs:%d crc_flag:%d\n", __FUNCTION__, pdu->rx_ue_information.rnti, eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs, crc_flag); + + pthread_mutex_unlock(&eNB->UL_INFO_mutex); +} + +void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const relaying_type_t r_type) +{ + //RX processing for ue-specific resources (i + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + const int subframe = proc->subframe_rx; + const int frame = proc->frame_rx; + + + if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; + + T(T_ENB_PHY_UL_TICK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe)); + + /* TODO: use correct rxdata */ + T(T_ENB_PHY_INPUT_SIGNAL, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(0), + T_BUFFER(&eNB->RU_list[0]->common.rxdata[0][subframe*eNB->frame_parms.samples_per_tti], + eNB->frame_parms.samples_per_tti * 4)); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); + + LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_uespec_RX(%d)\n",eNB->Mod_id,frame, subframe); + + eNB->rb_mask_ul[0]=0; + eNB->rb_mask_ul[1]=0; + eNB->rb_mask_ul[2]=0; + eNB->rb_mask_ul[3]=0; + + // Fix me here, these should be locked + eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus = 0; + eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs = 0; + + // Call SRS first since all others depend on presence of SRS or lack thereof + srs_procedures(eNB,proc); + + eNB->first_run_I0_measurements = 0; + + uci_procedures(eNB,proc); + + if (nfapi_mode == 0 || nfapi_mode == 1) { // If PNF or monolithic + pusch_procedures(eNB,proc); + } + + lte_eNB_I0_measurements(eNB, + subframe, + 0, + eNB->first_run_I0_measurements); + + int min_I0=1000,max_I0=0; + if ((frame==0) && (subframe==6)) { + for (int i=0;iframe_parms.N_RB_UL;i++) { + if (i==(eNB->frame_parms.N_RB_UL>>1) - 1) i+=2; + + if (eNB->measurements.n0_subband_power_tot_dB[i]measurements.n0_subband_power_tot_dB[i]; + if (eNB->measurements.n0_subband_power_tot_dB[i]>max_I0) max_I0 = eNB->measurements.n0_subband_power_tot_dB[i]; + } + LOG_I(PHY,"max_I0 %d, min_I0 %d\n",max_I0,min_I0); + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 ); + + stop_meas(&eNB->phy_proc_rx); + +} diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c old mode 100755 new mode 100644 index ac09ac77b3..f57e6c1806 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file phy_procedures_lte_ue.c * \brief Implementation of UE procedures from 36.213 LTE specifications @@ -38,24 +30,16 @@ * \warning */ +#define _GNU_SOURCE + #include "assertions.h" #include "defs.h" #include "PHY/defs.h" #include "PHY/extern.h" #include "SCHED/defs.h" #include "SCHED/extern.h" - -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif - -#ifdef EXMIMO -#ifdef DRIVER2013 -#include "openair0_lib.h" -#include "gain_control.h" -extern int card; -#endif -#endif +#include +#include "targets/RT/USER/lte-softmodem.h" #define DEBUG_PHY_PROC @@ -67,166 +51,152 @@ extern int card; #include "LAYER2/MAC/defs.h" #include "UTIL/LOG/log.h" -#ifdef EMOS -fifo_dump_emos_UE emos_dump_UE; -#endif - #include "UTIL/LOG/vcd_signal_dumper.h" +#include "UTIL/OPT/opt.h" #if defined(ENABLE_ITTI) # include "intertask_interface.h" -# if ENABLE_RAL -# include "timer.h" -# endif #endif +#include "PHY/defs.h" + +#include "PHY/CODING/extern.h" + +#include "T.h" + +#include "PHY/TOOLS/defs.h" #define DLSCH_RB_ALLOC 0x1fbf // skip DC RB (total 23/25 RBs) #define DLSCH_RB_ALLOC_12 0x0aaa // skip DC RB (total 23/25 RBs) #define NS_PER_SLOT 500000 -extern int oai_exit; - -uint8_t ulsch_input_buffer[2700] __attribute__ ((aligned(16))); -uint8_t access_mode; - -#ifdef DLSCH_THREAD -extern int dlsch_instance_cnt[8]; -extern int dlsch_subframe[8]; -extern pthread_mutex_t dlsch_mutex[8]; -/// Condition variable for dlsch thread -extern pthread_cond_t dlsch_cond[8]; -extern int rx_pdsch_instance_cnt; -extern int rx_pdsch_slot; -extern pthread_mutex_t rx_pdsch_mutex; -/// Condition variable for rx_pdsch thread -extern pthread_cond_t rx_pdsch_cond; -#endif - -DCI_ALLOC_t dci_alloc_rx[8]; - -#ifdef DIAG_PHY -extern int rx_sig_fifo; -#endif +extern double cpuf; +void Msg1_transmitted(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id); +void Msg3_transmitted(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id); #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; #endif -#ifdef USER_MODE -void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid) + +void dump_dlsch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid) { unsigned int coded_bits_per_codeword; - uint8_t nsymb = (phy_vars_ue->lte_frame_parms.Ncp == 0) ? 14 : 12; + uint8_t nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12; - coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - phy_vars_ue->frame_rx,subframe); + coded_bits_per_codeword = get_G(&ue->frame_parms, + ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->nb_rb, + ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, + ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Qm, + ue->dlsch[ue->current_thread_id[subframe]][eNB_id][0]->harq_processes[harq_pid]->Nl, + ue->pdcch_vars[0%RX_NB_TH][eNB_id]->num_pdcch_symbols, + proc->frame_rx, + subframe, + ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]); - write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,2,1); - write_output("rxsigF0_ext.m","rxsF0_ext", phy_vars_ue->lte_ue_pdsch_vars[0]->rxdataF_ext[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1); - write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[0],300*nsymb,1,1); + write_output("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,2,1); + write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_estimates_ext[0],300*nsymb,1,1); /* - write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); - write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); - write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); - write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1); + write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); + write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); + write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); + write_output("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); */ - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars[0]->rxdataF_comp0[0],300*12,1,1); - write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars[0]->llr[0],coded_bits_per_codeword,1,0); + write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->rxdataF_comp0[0],300*12,1,1); + write_output("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars[ue->current_thread_id[subframe]][0]->llr[0],coded_bits_per_codeword,1,0); - write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_mag0,300*12,1,1); - write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_magb0,300*12,1,1); + write_output("dlsch_mag1.m","dlschmag1",ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_mag0,300*12,1,1); + write_output("dlsch_mag2.m","dlschmag2",ue->pdsch_vars[ue->current_thread_id[subframe]][0]->dl_ch_magb0,300*12,1,1); } -void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) +void dump_dlsch_SI(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe) { unsigned int coded_bits_per_codeword; - uint8_t nsymb = ((phy_vars_ue->lte_frame_parms.Ncp == 0) ? 14 : 12); + uint8_t nsymb = ((ue->frame_parms.Ncp == 0) ? 14 : 12); - coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even, + coded_bits_per_codeword = get_G(&ue->frame_parms, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even, 2, 1, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - phy_vars_ue->frame_rx,subframe); + ue->pdcch_vars[0%RX_NB_TH][eNB_id]->num_pdcch_symbols, + proc->frame_rx, + subframe, + 0); LOG_D(PHY,"[UE %d] Dumping dlsch_SI : ofdm_symbol_size %d, nsymb %d, nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", - phy_vars_ue->Mod_id, - phy_vars_ue->lte_frame_parms.ofdm_symbol_size, - nsymb, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->Mod_id, + ue->frame_parms.ofdm_symbol_size, + nsymb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs, + ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb, + ue->pdcch_vars[0%RX_NB_TH][eNB_id]->num_pdcch_symbols, coded_bits_per_codeword); - write_output("rxsig0.m","rxs0", &phy_vars_ue->lte_ue_common_vars.rxdata[0][subframe*phy_vars_ue->lte_frame_parms.samples_per_tti],phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); + write_output("rxsig0.m","rxs0", &ue->common_vars.rxdata[0][subframe*ue->frame_parms.samples_per_tti],ue->frame_parms.samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1); - write_output("rxsigF0_ext.m","rxsF0_ext", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->rxdataF_ext[0],2*nsymb*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1); - write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_estimates_ext[0],phy_vars_ue->lte_frame_parms.N_RB_DL*12*nsymb,1,1); + write_output("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0],nsymb*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars_SI[0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars_SI[0]->dl_ch_estimates_ext[0],ue->frame_parms.N_RB_DL*12*nsymb,1,1); /* - write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); - write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); - write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); - write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1); + write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); + write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); + write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); + write_output("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); */ - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->rxdataF_comp0[0],phy_vars_ue->lte_frame_parms.N_RB_DL*12*nsymb,1,1); - write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->llr[0],coded_bits_per_codeword,1,0); + write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars_SI[0]->rxdataF_comp0[0],ue->frame_parms.N_RB_DL*12*nsymb,1,1); + write_output("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars_SI[0]->llr[0],coded_bits_per_codeword,1,0); - write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_mag0,300*nsymb,1,1); - write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_magb0,300*nsymb,1,1); + write_output("dlsch_mag1.m","dlschmag1",ue->pdsch_vars_SI[0]->dl_ch_mag0,300*nsymb,1,1); + write_output("dlsch_mag2.m","dlschmag2",ue->pdsch_vars_SI[0]->dl_ch_magb0,300*nsymb,1,1); + sleep(1); exit(-1); } #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) //unsigned int gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162}; /* -unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL) -{ + unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL) + { int gain_dB = power_dBm - power_max_dBm; int amp_x_100; switch (N_RB_UL) { case 6: - amp_x_100 = AMP; // PRACH is 6 PRBS so no scale - break; + amp_x_100 = AMP; // PRACH is 6 PRBS so no scale + break; case 15: - amp_x_100 = 158*AMP; // 158 = 100*sqrt(15/6) - break; + amp_x_100 = 158*AMP; // 158 = 100*sqrt(15/6) + break; case 25: - amp_x_100 = 204*AMP; // 204 = 100*sqrt(25/6) - break; + amp_x_100 = 204*AMP; // 204 = 100*sqrt(25/6) + break; case 50: - amp_x_100 = 286*AMP; // 286 = 100*sqrt(50/6) - break; + amp_x_100 = 286*AMP; // 286 = 100*sqrt(50/6) + break; case 75: - amp_x_100 = 354*AMP; // 354 = 100*sqrt(75/6) - break; + amp_x_100 = 354*AMP; // 354 = 100*sqrt(75/6) + break; case 100: - amp_x_100 = 408*AMP; // 408 = 100*sqrt(100/6) - break; + amp_x_100 = 408*AMP; // 408 = 100*sqrt(100/6) + break; default: - LOG_E(PHY,"Unknown PRB size %d\n",N_RB_UL); - mac_xface->macphy_exit(""); - break; + LOG_E(PHY,"Unknown PRB size %d\n",N_RB_UL); + mac_xface->macphy_exit(""); + break; } if (gain_dB < -30) { - return(amp_x_100/3162); + return(amp_x_100/3162); } else if (gain_dB>0) - return(amp_x_100); + return(amp_x_100); else - return(amp_x_100/gain_table[-gain_dB]); // 245 corresponds to the factor sqrt(25/6) -} + return(amp_x_100/gain_table[-gain_dB]); // 245 corresponds to the factor sqrt(25/6) + } */ unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb) @@ -235,58 +205,50 @@ unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb int gain_dB = power_dBm - power_max_dBm; double gain_lin; - if (gain_dB < -20) - return(AMP/10); - gain_lin = pow(10,.1*gain_dB); - if ((nb_rb >0) && (nb_rb <= N_RB_UL)) { - return((int)(AMP*sqrt(gain_lin*N_RB_UL/(double)nb_rb))); - } - else { - LOG_E(PHY,"Illegal nb_rb/N_RB_UL combination (%d/%d)\n",nb_rb,N_RB_UL); - mac_xface->macphy_exit(""); - } - return(0); + AssertFatal((nb_rb >0) && (nb_rb <= N_RB_UL),"Illegal nb_rb/N_RB_UL combination (%d/%d)\n",nb_rb,N_RB_UL); + return((int)(AMP*sqrt(gain_lin*N_RB_UL/(double)nb_rb))); } #endif -void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) +void dump_dlsch_ra(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe) { unsigned int coded_bits_per_codeword; - uint8_t nsymb = ((phy_vars_ue->lte_frame_parms.Ncp == 0) ? 14 : 12); + uint8_t nsymb = ((ue->frame_parms.Ncp == 0) ? 14 : 12); - coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc_even, + coded_bits_per_codeword = get_G(&ue->frame_parms, + ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even, 2, 1, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - phy_vars_ue->frame_rx,subframe); + ue->pdcch_vars[0%RX_NB_TH][eNB_id]->num_pdcch_symbols, + proc->frame_rx, + subframe, + 0); LOG_D(PHY,"[UE %d] Dumping dlsch_ra : nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->mcs, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, + ue->Mod_id, + ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, + ue->dlsch_ra[eNB_id]->harq_processes[0]->mcs, + ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb, + ue->pdcch_vars[0%RX_NB_TH][eNB_id]->num_pdcch_symbols, coded_bits_per_codeword); - write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],2*12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,2,1); - write_output("rxsigF0_ext.m","rxsF0_ext", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->rxdataF_ext[0],2*12*phy_vars_ue->lte_frame_parms.ofdm_symbol_size,1,1); - write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_estimates_ext[0],300*nsymb,1,1); + write_output("rxsigF0.m","rxsF0", ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF[0],2*12*ue->frame_parms.ofdm_symbol_size,2,1); + write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars_ra[0]->rxdataF_ext[0],2*12*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("dlsch00_ch0_ext.m","dl00_ch0_ext", ue->pdsch_vars_ra[0]->dl_ch_estimates_ext[0],300*nsymb,1,1); /* - write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); - write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); - write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); - write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1); + write_output("dlsch01_ch0_ext.m","dl01_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[1],300*12,1,1); + write_output("dlsch10_ch0_ext.m","dl10_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[2],300*12,1,1); + write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1); + write_output("dlsch_rho.m","dl_rho",pdsch_vars[0]->rho[0],300*12,1,1); */ - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->rxdataF_comp0[0],300*nsymb,1,1); - write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->llr[0],coded_bits_per_codeword,1,0); + write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", ue->pdsch_vars_ra[0]->rxdataF_comp0[0],300*nsymb,1,1); + write_output("dlsch_rxF_llr.m","dlsch_llr", ue->pdsch_vars_ra[0]->llr[0],coded_bits_per_codeword,1,0); - write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1); - write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1); + write_output("dlsch_mag1.m","dlschmag1",ue->pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1); + write_output("dlsch_mag2.m","dlschmag2",ue->pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1); } -#endif void phy_reset_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) { @@ -294,33 +256,42 @@ void phy_reset_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) // This flushes ALL DLSCH and ULSCH harq buffers of ALL connected eNBs...add the eNB_index later // for more flexibility - uint8_t i,j,k; - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id][CC_id]; + uint8_t i,j,k,s; + PHY_VARS_UE *ue = PHY_vars_UE_g[Mod_id][CC_id]; - //[NUMBER_OF_CONNECTED_eNB_MAX][2]; - for(i=0; idlsch_ue[i][j]) { - for(k=0; kdlsch_ue[i][j]->harq_processes[k]; k++) { - phy_vars_ue->dlsch_ue[i][j]->harq_processes[k]->status = SCH_IDLE; - } - } - } + //[NUMBER_OF_RX_THREAD=2][NUMBER_OF_CONNECTED_eNB_MAX][2]; + for(int l=0; ldlsch[l][i][j]) { + for(k=0; kdlsch[l][i][j]->harq_processes[k]; k++) { + ue->dlsch[l][i][j]->harq_processes[k]->status = SCH_IDLE; + for (s=0; s<10; s++) { + // reset ACK/NACK bit to DTX for all subframes s = 0..9 + ue->dlsch[l][i][j]->harq_ack[s].ack = 2; + ue->dlsch[l][i][j]->harq_ack[s].send_harq_status = 0; + ue->dlsch[l][i][j]->harq_ack[s].vDAI_UL = 0xff; + ue->dlsch[l][i][j]->harq_ack[s].vDAI_DL = 0xff; + } + } + } + } - //UL HARQ - if(phy_vars_ue->ulsch_ue[i]) { - for(k=0; kulsch_ue[i]->harq_processes[k]; k++) { - phy_vars_ue->ulsch_ue[i]->harq_processes[k]->status = SCH_IDLE; - //Set NDIs for all UL HARQs to 0 - // phy_vars_ue->ulsch_ue[i]->harq_processes[k]->Ndi = 0; + //UL HARQ + if(ue->ulsch[i]) { + for(k=0; kulsch[i]->harq_processes[k]; k++) { + ue->ulsch[i]->harq_processes[k]->status = SCH_IDLE; + //Set NDIs for all UL HARQs to 0 + // ue->ulsch[i]->harq_processes[k]->Ndi = 0; + + } + } + + // flush Msg3 buffer + ue->ulsch_Msg3_active[i] = 0; } - } - - // flush Msg3 buffer - phy_vars_ue->ulsch_ue_Msg3_active[i] = 0; - } } @@ -329,8 +300,11 @@ void ra_failed(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) // if contention resolution fails, go back to PRACH PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index] = PRACH; - LOG_E(PHY,"[UE %d] Frame %d Random-access procedure fails, going back to PRACH, setting SIStatus = 0 and State RRC_IDLE\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx); - //mac_xface->macphy_exit(""); + PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[0][eNB_index]->crnti_is_temporary = 0; + PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[0][eNB_index]->crnti = 0; + PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_index]->crnti_is_temporary = 0; + PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_index]->crnti = 0; + LOG_E(PHY,"[UE %d] Random-access procedure fails, going back to PRACH, setting SIStatus = 0, discard temporary C-RNTI and State RRC_IDLE\n",Mod_id); } void ra_succeeded(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) @@ -338,15 +312,19 @@ void ra_succeeded(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) int i; - LOG_I(PHY,"[UE %d][RAPROC] Frame %d Random-access procedure succeeded\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx); + LOG_I(PHY,"[UE %d][RAPROC] Random-access procedure succeeded. Set C-RNTI = Temporary C-RNTI\n",Mod_id); - PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue_Msg3_active[eNB_index] = 0; + PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[0][eNB_index]->crnti_is_temporary = 0; + PHY_vars_UE_g[Mod_id][CC_id]->pdcch_vars[1][eNB_index]->crnti_is_temporary = 0; + PHY_vars_UE_g[Mod_id][CC_id]->ulsch_Msg3_active[eNB_index] = 0; PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index] = PUSCH; for (i=0; i<8; i++) { - if (PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[eNB_index]->harq_processes[i]) { - PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[eNB_index]->harq_processes[i]->status=IDLE; - PHY_vars_UE_g[Mod_id][CC_id]->dlsch_ue[eNB_index][0]->harq_processes[i]->round=0; + if (PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->harq_processes[i]) { + PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->harq_processes[i]->status=SCH_IDLE; + PHY_vars_UE_g[Mod_id][CC_id]->dlsch[0][eNB_index][0]->harq_processes[i]->round=0; + PHY_vars_UE_g[Mod_id][CC_id]->dlsch[1][eNB_index][0]->harq_processes[i]->round=0; + PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->harq_processes[i]->subframe_scheduling_flag=0; } } @@ -359,21 +337,15 @@ UE_MODE_t get_ue_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index) return(PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index]); } -void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,uint16_t timing_advance) -{ +void process_timing_advance_rar(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint16_t timing_advance) { - /* - if ((timing_advance>>10) & 1) //it is negative - timing_advance = timing_advance - (1<<11); - */ + ue->timing_advance = timing_advance*4; - if (openair_daq_vars.manual_timing_advance == 0) { - phy_vars_ue->timing_advance = timing_advance*4; - - } #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx, phy_vars_ue->timing_advance,openair_daq_vars.timing_advance); + /* TODO: fix this log, what is 'HW timing advance'? */ + /*LOG_I(PHY,"[UE %d] AbsoluteSubFrame %d.%d, received (rar) timing_advance %d, HW timing advance %d\n",ue->Mod_id,proc->frame_rx, proc->subframe_rx, ue->timing_advance);*/ + LOG_I(PHY,"[UE %d] AbsoluteSubFrame %d.%d, received (rar) timing_advance %d\n",ue->Mod_id,proc->frame_rx, proc->subframe_rx, ue->timing_advance); #endif } @@ -386,81 +358,376 @@ void process_timing_advance(uint8_t Mod_id,uint8_t CC_id,int16_t timing_advance) // timing advance has Q1.5 format timing_advance = timing_advance - 31; - if (openair_daq_vars.manual_timing_advance == 0) { - //if ( (frame % 100) == 0) { - //if ((timing_advance > 3) || (timing_advance < -3) ) - PHY_vars_UE_g[Mod_id][CC_id]->timing_advance = PHY_vars_UE_g[Mod_id][CC_id]->timing_advance+timing_advance*4; //this is for 25RB only!!! - } + PHY_vars_UE_g[Mod_id][CC_id]->timing_advance = PHY_vars_UE_g[Mod_id][CC_id]->timing_advance+timing_advance*4; //this is for 25RB only!!! - LOG_I(PHY,"[UE %d] Got timing advance %d from MAC, new value %d\n",Mod_id, timing_advance, PHY_vars_UE_g[Mod_id][CC_id]->timing_advance); + + LOG_D(PHY,"[UE %d] Got timing advance %d from MAC, new value %d\n",Mod_id, timing_advance, PHY_vars_UE_g[Mod_id][CC_id]->timing_advance); } -uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) +uint8_t is_SR_TXOp(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id) { - LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Checking for SR TXOp (sr_ConfigIndex %d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,phy_vars_ue->frame_tx,subframe, - phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex); + int subframe=proc->subframe_tx; - if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 4) { // 5 ms SR period - if ((subframe%5) == phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex) + LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Checking for SR TXOp (sr_ConfigIndex %d)\n", + ue->Mod_id,ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->crnti,proc->frame_tx,subframe, + ue->scheduling_request_config[eNB_id].sr_ConfigIndex); + + if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 4) { // 5 ms SR period + if ((subframe%5) == ue->scheduling_request_config[eNB_id].sr_ConfigIndex) return(1); - } else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 14) { // 10 ms SR period - if (subframe==(phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-5)) + } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 14) { // 10 ms SR period + if (subframe==(ue->scheduling_request_config[eNB_id].sr_ConfigIndex-5)) return(1); - } else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 34) { // 20 ms SR period - if ((10*(phy_vars_ue->frame_tx&1)+subframe) == (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-15)) + } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 34) { // 20 ms SR period + if ((10*(proc->frame_tx&1)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-15)) return(1); - } else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 74) { // 40 ms SR period - if ((10*(phy_vars_ue->frame_tx&3)+subframe) == (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-35)) + } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 74) { // 40 ms SR period + if ((10*(proc->frame_tx&3)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-35)) return(1); - } else if (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 154) { // 80 ms SR period - if ((10*(phy_vars_ue->frame_tx&7)+subframe) == (phy_vars_ue->scheduling_request_config[eNB_id].sr_ConfigIndex-75)) + } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 154) { // 80 ms SR period + if ((10*(proc->frame_tx&7)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-75)) return(1); } return(0); } -uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, +uint8_t is_cqi_TXOp(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id) +{ + int subframe = proc->subframe_tx; + int frame = proc->frame_tx; + CQI_REPORTPERIODIC *cqirep = &ue->cqi_report_config[eNB_id].CQI_ReportPeriodic; + + //LOG_I(PHY,"[UE %d][CRNTI %x] AbsSubFrame %d.%d Checking for CQI TXOp (cqi_ConfigIndex %d) isCQIOp %d\n", + // ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame,subframe, + // cqirep->cqi_PMI_ConfigIndex, + // (((10*frame + subframe) % cqirep->Npd) == cqirep->N_OFFSET_CQI)); + + if (cqirep->cqi_PMI_ConfigIndex==-1) + return(0); + else if (((10*frame + subframe) % cqirep->Npd) == cqirep->N_OFFSET_CQI) + return(1); + else + return(0); +} +uint8_t is_ri_TXOp(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id) +{ + + + int subframe = proc->subframe_tx; + int frame = proc->frame_tx; + CQI_REPORTPERIODIC *cqirep = &ue->cqi_report_config[eNB_id].CQI_ReportPeriodic; + int log2Mri = cqirep->ri_ConfigIndex/161; + int N_OFFSET_RI = cqirep->ri_ConfigIndex % 161; + + //LOG_I(PHY,"[UE %d][CRNTI %x] AbsSubFrame %d.%d Checking for RI TXOp (ri_ConfigIndex %d) isRIOp %d\n", + // ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame,subframe, + // cqirep->ri_ConfigIndex, + // (((10*frame + subframe + cqirep->N_OFFSET_CQI - N_OFFSET_RI) % (cqirep->Npd<ri_ConfigIndex==-1) + return(0); + else if (((10*frame + subframe + cqirep->N_OFFSET_CQI - N_OFFSET_RI) % (cqirep->Npd<measurements; + //uint8_t transmission_mode = ue->transmission_mode[eNB_id]; + + + //LOG_I(PHY,"compute_cqi_ri_resources O_RI %d O %d uci format %d \n",ulsch->O_RI,ulsch->O,ulsch->uci_format); + if (cqi_status == 1 || ri_status == 1) + { + ulsch->O = 4; + } +} + +void ue_compute_srs_occasion(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t isSubframeSRS) +{ + + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + int frame_tx = proc->frame_tx; + int subframe_tx = proc->subframe_tx; + SOUNDINGRS_UL_CONFIG_DEDICATED *pSoundingrs_ul_config_dedicated=&ue->soundingrs_ul_config_dedicated[eNB_id]; + uint16_t srsPeriodicity; + uint16_t srsOffset; + uint8_t is_pucch2_subframe = 0; + uint8_t is_sr_an_subframe = 0; + + // check for SRS opportunity + pSoundingrs_ul_config_dedicated->srsUeSubframe = 0; + pSoundingrs_ul_config_dedicated->srsCellSubframe = isSubframeSRS; + + if (isSubframeSRS) { + LOG_D(PHY," SrsDedicatedSetup: %d \n",pSoundingrs_ul_config_dedicated->srsConfigDedicatedSetup); + if(pSoundingrs_ul_config_dedicated->srsConfigDedicatedSetup) + { + compute_srs_pos(frame_parms->frame_type, pSoundingrs_ul_config_dedicated->srs_ConfigIndex, &srsPeriodicity, &srsOffset); + + LOG_D(PHY," srsPeriodicity: %d srsOffset: %d isSubframeSRS %d \n",srsPeriodicity,srsOffset,isSubframeSRS); + + // transmit SRS if the four following constraints are respected: + // - UE is configured to transmit SRS + // - SRS are configured in current subframe + // - UE is configured to send SRS in this subframe + + // 36.213 8.2 + // 1- A UE shall not transmit SRS whenever SRS and PUCCH format 2/2a/2b transmissions happen to coincide in the same subframe + // 2- A UE shall not transmit SRS whenever SRS transmit + // on and PUCCH transmission carrying ACK/NACK and/or + // positive SR happen to coincide in the same subframe if the parameter + // Simultaneous-AN-and-SRS is FALSE + + // check PUCCH format 2/2a/2b transmissions + is_pucch2_subframe = is_cqi_TXOp(ue,proc,eNB_id) && (ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex>0); + is_pucch2_subframe = (is_ri_TXOp(ue,proc,eNB_id) && (ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex>0)) || is_pucch2_subframe; + + // check ACK/SR transmission + if(frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission == FALSE) + { + if(is_SR_TXOp(ue,proc,eNB_id)) + { + uint32_t SR_payload = 0; + if (ue->mac_enabled==1) + { + int Mod_id = ue->Mod_id; + int CC_id = ue->CC_id; + SR_payload = ue_get_SR(Mod_id, + CC_id, + frame_tx, + eNB_id, + ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->crnti, + subframe_tx); // subframe used for meas gap + + if (SR_payload > 0) + is_sr_an_subframe = 1; + } + } + + uint8_t pucch_ack_payload[2]; + if (get_ack(&ue->frame_parms, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack, + subframe_tx,proc->subframe_rx,pucch_ack_payload,0) > 0) + { + is_sr_an_subframe = 1; + } + } + + // check SRS UE opportunity + if( isSubframeSRS && + (((10*frame_tx+subframe_tx) % srsPeriodicity) == srsOffset) + ) + { + if ((is_pucch2_subframe == 0) && (is_sr_an_subframe == 0)) + { + pSoundingrs_ul_config_dedicated->srsUeSubframe = 1; + ue->ulsch[eNB_id]->srs_active = 1; + ue->ulsch[eNB_id]->Nsymb_pusch = 12-(frame_parms->Ncp<<1)- ue->ulsch[eNB_id]->srs_active; + } + else + { + LOG_I(PHY,"DROP UE-SRS-TX for this subframe %d.%d: collision with PUCCH2 or SR/AN: PUCCH2-occasion: %d, SR-AN-occasion[simSRS-SR-AN %d]: %d \n", frame_tx, subframe_tx, is_pucch2_subframe, frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission, is_sr_an_subframe); + } + } + } + LOG_D(PHY," srsCellSubframe: %d, srsUeSubframe: %d, Nsymb-pusch: %d \n", pSoundingrs_ul_config_dedicated->srsCellSubframe, pSoundingrs_ul_config_dedicated->srsUeSubframe, ue->ulsch[eNB_id]->Nsymb_pusch); + } +} + + +void get_cqipmiri_params(PHY_VARS_UE *ue,uint8_t eNB_id) +{ + + CQI_REPORTPERIODIC *cqirep = &ue->cqi_report_config[eNB_id].CQI_ReportPeriodic; + int cqi_PMI_ConfigIndex = cqirep->cqi_PMI_ConfigIndex; + + if (ue->frame_parms.frame_type == FDD) { + if (cqi_PMI_ConfigIndex <= 1) { // 2 ms CQI_PMI period + cqirep->Npd = 2; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex; + } else if (cqi_PMI_ConfigIndex <= 6) { // 5 ms CQI_PMI period + cqirep->Npd = 5; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-2; + } else if (cqi_PMI_ConfigIndex <=16) { // 10ms CQI_PMI period + cqirep->Npd = 10; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-7; + } else if (cqi_PMI_ConfigIndex <= 36) { // 20 ms CQI_PMI period + cqirep->Npd = 20; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-17; + } else if (cqi_PMI_ConfigIndex <= 76) { // 40 ms CQI_PMI period + cqirep->Npd = 40; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-37; + } else if (cqi_PMI_ConfigIndex <= 156) { // 80 ms CQI_PMI period + cqirep->Npd = 80; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-77; + } else if (cqi_PMI_ConfigIndex <= 316) { // 160 ms CQI_PMI period + cqirep->Npd = 160; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-157; + } + else if (cqi_PMI_ConfigIndex > 317) { + + if (cqi_PMI_ConfigIndex <= 349) { // 32 ms CQI_PMI period + cqirep->Npd = 32; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-318; + } + else if (cqi_PMI_ConfigIndex <= 413) { // 64 ms CQI_PMI period + cqirep->Npd = 64; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-350; + } + else if (cqi_PMI_ConfigIndex <= 541) { // 128 ms CQI_PMI period + cqirep->Npd = 128; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-414; + } + } + } + else { // TDD + if (cqi_PMI_ConfigIndex == 0) { // all UL subframes + cqirep->Npd = 1; + cqirep->N_OFFSET_CQI = 0; + } else if (cqi_PMI_ConfigIndex <= 6) { // 5 ms CQI_PMI period + cqirep->Npd = 5; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-1; + } else if (cqi_PMI_ConfigIndex <=16) { // 10ms CQI_PMI period + cqirep->Npd = 10; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-6; + } else if (cqi_PMI_ConfigIndex <= 36) { // 20 ms CQI_PMI period + cqirep->Npd = 20; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-16; + } else if (cqi_PMI_ConfigIndex <= 76) { // 40 ms CQI_PMI period + cqirep->Npd = 40; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-36; + } else if (cqi_PMI_ConfigIndex <= 156) { // 80 ms CQI_PMI period + cqirep->Npd = 80; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-76; + } else if (cqi_PMI_ConfigIndex <= 316) { // 160 ms CQI_PMI period + cqirep->Npd = 160; + cqirep->N_OFFSET_CQI = cqi_PMI_ConfigIndex-156; + } + } +} + +PUCCH_FMT_t get_pucch_format(lte_frame_type_t frame_type, + lte_prefix_type_t cyclic_prefix_type, + uint8_t SR_payload, + uint8_t nb_cw, + uint8_t cqi_status, + uint8_t ri_status, + uint8_t bundling_flag) +{ + if((cqi_status == 0) && (ri_status==0)) + { + // PUCCH Format 1 1a 1b + // 1- SR only ==> PUCCH format 1 + // 2- 1bit Ack/Nack with/without SR ==> PUCCH format 1a + // 3- 2bits Ack/Nack with/without SR ==> PUCCH format 1b + if((nb_cw == 1)&&(bundling_flag==bundling)) + { + return pucch_format1a; + } + if((nb_cw == 1)&&(bundling_flag==multiplexing)) + { + return pucch_format1b; + } + if(nb_cw == 2) + { + return pucch_format1b; + } + if(SR_payload == 1) + { + return pucch_format1; + /* + if (frame_type == FDD) { + return pucch_format1; + } else if (frame_type == TDD) { + return pucch_format1b; + } else { + AssertFatal(1==0,"Unknown frame_type"); + }*/ + } + } + else + { + // PUCCH Format 2 2a 2b + // 1- CQI only or RI only ==> PUCCH format 2 + // 2- CQI or RI + 1bit Ack/Nack for normal CP ==> PUCCH format 2a + // 3- CQI or RI + 2bits Ack/Nack for normal CP ==> PUCCH format 2b + // 4- CQI or RI + Ack/Nack for extended CP ==> PUCCH format 2 + if(nb_cw == 0) + { + return pucch_format2; + } + if(cyclic_prefix_type == NORMAL) + { + if(nb_cw == 1) + { + return pucch_format2a; + } + if(nb_cw == 2) + { + return pucch_format2b; + } + } + else + { + return pucch_format2; + } + } + return pucch_format1a; +} +uint16_t get_n1_pucch(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, + harq_status_t *harq_ack, uint8_t eNB_id, - uint8_t subframe, uint8_t *b, uint8_t SR) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; - uint8_t nCCE0,nCCE1,harq_ack1,harq_ack0; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + uint8_t nCCE0,nCCE1,nCCE2,nCCE3,harq_ack1,harq_ack0,harq_ack3,harq_ack2; ANFBmode_t bundling_flag; - uint16_t n1_pucch0=0,n1_pucch1=0; - int subframe_offset; + uint16_t n1_pucch0=0,n1_pucch1=0,n1_pucch2=0,n1_pucch3=0,n1_pucch_inter; + static uint8_t candidate_dl[9]; // which downlink(s) the current ACK/NACK is associating to + uint8_t last_dl=0xff; // the last downlink with valid DL-DCI. for calculating the PUCCH resource index int sf; int M; + uint8_t ack_counter=0; // clear this, important for case where n1_pucch selection is not used + int subframe=proc->subframe_tx; - phy_vars_ue->pucch_sel[subframe] = 0; + ue->pucch_sel[subframe] = 0; if (frame_parms->frame_type == FDD ) { // FDD sf = (subframe<4)? subframe+6 : subframe-4; - LOG_D(PHY,"n1_pucch_UE: subframe %d, nCCE %d\n",sf,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]); + LOG_D(PHY,"n1_pucch_UE: subframe %d, nCCE %d\n",sf,ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[sf]); if (SR == 0) - return(frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[sf]); + return(frame_parms->pucch_config_common.n1PUCCH_AN + ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[sf]); else - return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + return(ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } else { - bundling_flag = phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; + bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; #ifdef DEBUG_PHY_PROC if (bundling_flag==bundling) { - LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, bundling, SR %d/%d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,SR, - phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, bundling, SR %d/%d\n",ue->Mod_id,proc->frame_tx,subframe,SR, + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } else { - LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, multiplexing, SR %d/%d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,SR, - phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, multiplexing, SR %d/%d\n",ue->Mod_id,proc->frame_tx,subframe,SR, + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } #endif @@ -472,41 +739,71 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, M=1; // This is the offset for a particular subframe (2,3,4) => (0,2,4) - if (subframe == 2) { // ACK subframes 5 (forget 6) - subframe_offset = 5; + if (subframe == 2) { // ACK subframes 5,6 + candidate_dl[0] = 6; + candidate_dl[1] = 5; M=2; } else if (subframe == 3) { // ACK subframe 9 - subframe_offset = 9; - } else if (subframe == 7) { // ACK subframes 0 (forget 1) - subframe_offset = 0; + candidate_dl[0] = 9; + } else if (subframe == 7) { // ACK subframes 0,1 + candidate_dl[0] = 1; + candidate_dl[1] = 0; M=2; } else if (subframe == 8) { // ACK subframes 4 - subframe_offset = 4; + candidate_dl[0] = 4; } else { - LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n", - phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,frame_parms->tdd_config); + LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, illegal tx-subframe %d for tdd_config %d\n", + ue->Mod_id,proc->frame_tx,subframe,frame_parms->tdd_config); return(0); } + // checking which downlink candidate is the last downlink with valid DL-DCI + int k; + for (k=0;k0) { + last_dl = candidate_dl[k]; + break; + } + } + if (last_dl >= 10) { + LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, illegal rx-subframe %d (tx-subframe %d) for tdd_config %d\n", + ue->Mod_id,proc->frame_tx,last_dl,subframe,frame_parms->tdd_config); + return (0); + } + + LOG_D(PHY,"SFN/SF %d/%d calculating n1_pucch0 from last_dl=%d\n", + proc->frame_tx%1024, + proc->subframe_tx, + last_dl); // i=0 - nCCE0 = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[subframe_offset]; + nCCE0 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[last_dl]; n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; - // set ACK/NAK to values if not DTX - if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[subframe_offset].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed - harq_ack0 = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[subframe_offset].ack; - + harq_ack0 = b[0]; if (harq_ack0!=2) { // DTX - if (SR == 0) { // last paragraph pg 68 from 36.213 (v8.6), m=0 - b[0]=(M==2) ? 1-harq_ack0 : harq_ack0; - b[1]=harq_ack0; // in case we use pucch format 1b (subframes 2,7) - phy_vars_ue->pucch_sel[subframe] = 0; - return(n1_pucch0); - } else { // SR and only 0 or 1 ACKs (first 2 entries in Table 7.3-1 of 36.213) - b[0]=harq_ack0; - return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + if (frame_parms->frame_type == FDD ) { + if (SR == 0) { // last paragraph pg 68 from 36.213 (v8.6), m=0 + b[0]=(M==2) ? 1-harq_ack0 : harq_ack0; + b[1]=harq_ack0; // in case we use pucch format 1b (subframes 2,7) + ue->pucch_sel[subframe] = 0; + return(n1_pucch0); + } else { // SR and only 0 or 1 ACKs (first 2 entries in Table 7.3-1 of 36.213) + b[0]=harq_ack0; + return(ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + } + } else { + if (SR == 0) { + b[0] = harq_ack0; + b[1] = harq_ack0; + ue->pucch_sel[subframe] = 0; + return(n1_pucch0); + } else { + b[0] = harq_ack0; + b[1] = harq_ack0; + return(ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + } } } @@ -520,21 +817,26 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, harq_ack1 = 2; // DTX harq_ack0 = 2; // DTX // This is the offset for a particular subframe (2,3,4) => (0,2,4) - subframe_offset = (subframe-2)<<1; + last_dl = (subframe-2)<<1; // i=0 - nCCE0 = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[5+subframe_offset]; + nCCE0 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[5+last_dl]; n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; // i=1 - nCCE1 = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[(6+subframe_offset)%10]; + nCCE1 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[(6+last_dl)%10]; n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; // set ACK/NAK to values if not DTX - if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[(6+subframe_offset)%10].send_harq_status>0) // n-6 // subframe 6 is to be ACK/NAKed - harq_ack1 = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[(6+subframe_offset)%10].ack; + if (ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[(6+last_dl)%10].send_harq_status>0) // n-6 // subframe 6 is to be ACK/NAKed + harq_ack1 = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[(6+last_dl)%10].ack; - if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[5+subframe_offset].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed - harq_ack0 = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[5+subframe_offset].ack; + if (ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[5+last_dl].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed + harq_ack0 = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[5+last_dl].ack; + LOG_D(PHY,"SFN/SF %d/%d calculating n1_pucch cce0=%d n1_pucch0=%d cce1=%d n1_pucch1=%d\n", + proc->frame_tx%1024, + proc->subframe_tx, + nCCE0,n1_pucch0, + nCCE1,n1_pucch1); if (harq_ack1!=2) { // n-6 // subframe 6,8,0 and maybe 5,7,9 is to be ACK/NAKed @@ -546,7 +848,7 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, if (harq_ack0!=2) b[0]=b[0]&harq_ack0; - phy_vars_ue->pucch_sel[subframe] = 1; + ue->pucch_sel[subframe] = 1; return(n1_pucch1); } else if ((bundling_flag==multiplexing)&&(SR==0)) { // Table 10.1 @@ -557,10 +859,10 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, b[0] = (harq_ack0!=harq_ack1)?0:1; if ((harq_ack0 == 1) && (harq_ack1 == 0)) { - phy_vars_ue->pucch_sel[subframe] = 0; + ue->pucch_sel[subframe] = 0; return(n1_pucch0); } else { - phy_vars_ue->pucch_sel[subframe] = 1; + ue->pucch_sel[subframe] = 1; return(n1_pucch1); } } else if (SR==1) { // SR and 0,1,or 2 ACKS, (first 3 entries in Table 7.3-1 of 36.213) @@ -570,1168 +872,1685 @@ uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue, b[0]= harq_ack1 | harq_ack0; b[1]= harq_ack1 ^ harq_ack0; - return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + return(ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } } else if (harq_ack0!=2) { // n-7 // subframe 5,7,9 only is to be ACK/NAKed if ((bundling_flag==bundling)&&(SR == 0)) { // last paragraph pg 68 from 36.213 (v8.6), m=0 b[0]=harq_ack0; - phy_vars_ue->pucch_sel[subframe] = 0; + ue->pucch_sel[subframe] = 0; return(n1_pucch0); } else if ((bundling_flag==multiplexing)&&(SR==0)) { // Table 10.1 with i=1 set to DTX b[0] = harq_ack0; b[1] = 1-b[0]; - phy_vars_ue->pucch_sel[subframe] = 0; + ue->pucch_sel[subframe] = 0; return(n1_pucch0); } else if (SR==1) { // SR and only 0 or 1 ACKs (first 2 entries in Table 7.3-1 of 36.213) b[0]=harq_ack0; b[1]=b[0]; - return(phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + return(ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); } } break; + case 4: // DL:S:UL:UL:DL:DL:DL:DL:DL:DL + // in this configuration we have M=4 from pg 68 of 36.213 (v8.6) + // Note: this doesn't allow using subframe 1 for PDSCH transmission!!! (i.e. SF 1 cannot be acked in SF 2) + // set ACK/NAKs to DTX + harq_ack3 = 2; // DTX + harq_ack2 = 2; // DTX + harq_ack1 = 2; // DTX + harq_ack0 = 2; // DTX + // This is the offset for a particular subframe (2,3,4) => (0,2,4) + //last_dl = (subframe-2)<<1; + if (subframe == 2) { + // i=0 + //nCCE0 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[2+subframe]; + nCCE0 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[(8+subframe)%10]; + n1_pucch0 = 2*get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; + // i=1 + nCCE1 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[2+subframe]; + n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,0) + get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; + // i=2 + nCCE2 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[(8+subframe)%10]; + + n1_pucch2 = 2*get_Np(frame_parms->N_RB_DL,nCCE2,1) + nCCE2+ frame_parms->pucch_config_common.n1PUCCH_AN; + // i=3 + //nCCE3 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[(9+subframe)%10]; + //n1_pucch3 = get_Np(frame_parms->N_RB_DL,nCCE3,1) + nCCE3 + frame_parms->pucch_config_common.n1PUCCH_AN; + + // set ACK/NAK to values if not DTX + if (ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[(8+subframe)%10].send_harq_status>0) // n-6 // subframe 6 is to be ACK/NAKed + harq_ack0 = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[(8+subframe)%10].ack; + + if (ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[2+subframe].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed + harq_ack1 = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[2+subframe].ack; + + if (ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[3+subframe].send_harq_status>0) // n-6 // subframe 6 is to be ACK/NAKed + harq_ack2 = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[3+subframe].ack; + + //if (ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[(9+subframe)%10].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed + //harq_ack3 = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[(9+subframe)%10].ack; + //LOG_I(PHY,"SFN/SF %d/%d calculating n1_pucch cce0=%d n1_pucch0=%d cce1=%d n1_pucch1=%d cce2=%d n1_pucch2=%d\n", + // proc->frame_tx%1024, + // proc->subframe_tx, + // nCCE0,n1_pucch0, + // nCCE1,n1_pucch1, nCCE2, n1_pucch2); + }else if (subframe == 3) { + // i=0 + + nCCE0 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[4+subframe]; + n1_pucch0 = 3*get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; + // i=1 + nCCE1 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[5+subframe]; + n1_pucch1 = 2*get_Np(frame_parms->N_RB_DL,nCCE1,0) + get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; + // i=2 + nCCE2 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[(6+subframe)]; + n1_pucch2 = get_Np(frame_parms->N_RB_DL,nCCE2,0) + 2*get_Np(frame_parms->N_RB_DL,nCCE2,1) + nCCE2+ frame_parms->pucch_config_common.n1PUCCH_AN; + // i=3 + nCCE3 = ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->nCCE[(3+subframe)]; + n1_pucch3 = 3*get_Np(frame_parms->N_RB_DL,nCCE3,1) + nCCE3 + frame_parms->pucch_config_common.n1PUCCH_AN; + + // set ACK/NAK to values if not DTX + if (ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[4+subframe].send_harq_status>0) // n-6 // subframe 6 is to be ACK/NAKed + harq_ack0 = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[4+subframe].ack; + + if (ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[5+subframe].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed + harq_ack1 = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[5+subframe].ack; + + if (ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[(6+subframe)].send_harq_status>0) // n-6 // subframe 6 is to be ACK/NAKed + harq_ack2 = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[(6+subframe)].ack; + + if (ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[(3+subframe)].send_harq_status>0) // n-6 // subframe 5 is to be ACK/NAKed + harq_ack3 = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack[(3+subframe)].ack; + } + + //LOG_I(PHY,"SFN/SF %d/%d calculating n1_pucch cce0=%d n1_pucch0=%d harq_ack0=%d cce1=%d n1_pucch1=%d harq_ack1=%d cce2=%d n1_pucch2=%d harq_ack2=%d cce3=%d n1_pucch3=%d harq_ack3=%d bundling_flag=%d\n", + // proc->frame_tx%1024, + // proc->subframe_tx, + // nCCE0,n1_pucch0,harq_ack0, + // nCCE1,n1_pucch1,harq_ack1, nCCE2, n1_pucch2, harq_ack2, + // nCCE3, n1_pucch3, harq_ack3, bundling_flag); + + if ((bundling_flag==bundling)&&(SR == 0)) { // This is for bundling without SR, + b[0] = 1; + ack_counter = 0; + + if ((harq_ack3!=2) ) { + b[0] = b[0]&harq_ack3; + n1_pucch_inter = n1_pucch3; + ack_counter ++; + } + if ((harq_ack0!=2) ) { + b[0] = b[0]&harq_ack0; + n1_pucch_inter = n1_pucch0; + ack_counter ++; + } + if ((harq_ack1!=2) ) { + b[0] = b[0]&harq_ack1; + n1_pucch_inter = n1_pucch1; + ack_counter ++; + } + if ((harq_ack2!=2) ) { + b[0] = b[0]&harq_ack2; + n1_pucch_inter = n1_pucch2; + ack_counter ++; + } + + if (ack_counter == 0) + b[0] = 0; + + /*if (subframe == 3) { + n1_pucch_inter = n1_pucch2; + } else if (subframe == 2) { + n1_pucch_inter = n1_pucch1; + }*/ + + //LOG_I(PHY,"SFN/SF %d/%d calculating n1_pucch n1_pucch_inter=%d b[0]=%d b[1]=%d \n", + // proc->frame_tx%1024, + // proc->subframe_tx,n1_pucch_inter, + // b[0],b[1]); + + return(n1_pucch_inter); + + } else if ((bundling_flag==multiplexing)&&(SR==0)) { // Table 10.1 + + if (subframe == 3) { + LOG_I(PHY, "sbuframe=%d \n",subframe); + if ((harq_ack0 == 1) && (harq_ack1 == 1) && (harq_ack2 == 1) && (harq_ack3 == 1)) { + b[0] = 1; + b[1] = 1; + return(n1_pucch1); + } else if ((harq_ack0 == 1) && (harq_ack1 == 1) && (harq_ack2 == 1) && ((harq_ack3 == 2) || (harq_ack3 == 0))) { + b[0] = 1; + b[1] = 0; + return(n1_pucch1); + } else if (((harq_ack0 == 0) || (harq_ack0 == 2)) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && (harq_ack2 == 0) && (harq_ack3 == 2)) { + b[0] = 1; + b[1] = 1; + return(n1_pucch2); + } else if ((harq_ack0 == 1) && (harq_ack1 == 1) && ((harq_ack2 == 2) || (harq_ack2 == 0)) && (harq_ack3 == 1)) { + b[0] = 1; + b[1] = 0; + return(n1_pucch1); + } else if ((harq_ack0 == 0) && (harq_ack1 == 2) && (harq_ack2 == 2) && (harq_ack3 == 2)) { + b[0] = 1; + b[1] = 0; + return(n1_pucch0); + } else if ((harq_ack0 == 1) && (harq_ack1 == 1) && ((harq_ack2 == 2) || (harq_ack2 == 0)) && ((harq_ack3 == 2) || (harq_ack3 == 0))) { + b[0] = 1; + b[1] = 0; + return(n1_pucch1); + } else if ((harq_ack0 == 1) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && (harq_ack2 == 1) && (harq_ack3 == 1)) { + b[0] = 0; + b[1] = 1; + return(n1_pucch3); + } else if (((harq_ack0 == 0) || (harq_ack0 == 2)) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && ((harq_ack2 == 2) || (harq_ack2 == 0)) && (harq_ack3 == 0)) { + b[0] = 1; + b[1] = 1; + return(n1_pucch3); + } else if ((harq_ack0 == 1) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && (harq_ack2 == 1) && ((harq_ack3 == 2) || (harq_ack3 == 0))) { + b[0] = 0; + b[1] = 1; + return(n1_pucch2); + } else if ((harq_ack0 == 1) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && ((harq_ack2 == 2) || (harq_ack2 == 0)) && (harq_ack3 == 1)) { + b[0] = 0; + b[1] = 1; + return(n1_pucch0); + } else if ((harq_ack0 == 1) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && ((harq_ack2 == 2) || (harq_ack2 == 0)) && ((harq_ack3 == 2) || (harq_ack3 == 0))) { + b[0] = 0; + b[1] = 1; + return(n1_pucch0); + } else if (((harq_ack0 == 2) || (harq_ack0 == 0)) && (harq_ack1 == 1) && (harq_ack2 == 1) && (harq_ack3 == 1)) { + b[0] = 0; + b[1] = 1; + return(n1_pucch3); + } else if (((harq_ack0 == 2) || (harq_ack0 == 0)) && (harq_ack1 == 0) && (harq_ack2 == 2) && (harq_ack3 == 2)) { + b[0] = 0; + b[1] = 0; + return(n1_pucch1); + } else if (((harq_ack0 == 2) || (harq_ack0 == 0)) && (harq_ack1 == 1) && (harq_ack2 == 1) && ((harq_ack3 == 2) || (harq_ack3 == 0))) { + b[0] = 1; + b[1] = 0; + return(n1_pucch2); + } else if (((harq_ack0 == 2) || (harq_ack0 == 0)) && (harq_ack1 == 1) && ((harq_ack2 == 2) || (harq_ack2 == 0)) && (harq_ack3 == 1)) { + b[0] = 1; + b[1] = 0; + return(n1_pucch3); + } else if (((harq_ack0 == 2) || (harq_ack0 == 0)) && (harq_ack1 == 1) && ((harq_ack2 == 2) || (harq_ack2 == 0)) && ((harq_ack3 == 2) || (harq_ack3 == 0))) { + b[0] = 0; + b[1] = 1; + return(n1_pucch1); + } else if (((harq_ack0 == 2) || (harq_ack0 == 0)) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && (harq_ack2 == 1) && (harq_ack3 == 1)) { + b[0] = 0; + b[1] = 1; + return(n1_pucch3); + } else if (((harq_ack0 == 2) || (harq_ack0 == 0)) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && (harq_ack2 == 1) && ((harq_ack3 == 2) || (harq_ack3 == 0))) { + b[0] = 0; + b[1] = 0; + return(n1_pucch2); + } else if (((harq_ack0 == 2) || (harq_ack0 == 0)) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && (harq_ack3 == 1) && ((harq_ack2 == 2) || (harq_ack2 == 0))) { + b[0] = 0; + b[1] = 0; + return(n1_pucch3); + } + } else if (subframe == 2) { + if ((harq_ack0 == 1) && (harq_ack1 == 1) && (harq_ack2 == 1)) { + b[0] = 1; + b[1] = 1; + return(n1_pucch2); + } else if ((harq_ack0 == 1) && (harq_ack1 == 1) && ((harq_ack2 == 2) || (harq_ack2 == 0))) { + b[0] = 1; + b[1] = 1; + return(n1_pucch1); + } else if ((harq_ack0 == 1) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && (harq_ack2 == 1)) { + b[0] = 1; + b[1] = 1; + return(n1_pucch0); + } else if ((harq_ack0 == 1) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && ((harq_ack2 == 2) || (harq_ack2 == 0))) { + b[0] = 0; + b[1] = 1; + return(n1_pucch0); + } else if (((harq_ack0 == 2) || (harq_ack0 == 0)) && (harq_ack1 == 1) && (harq_ack2 == 1)) { + b[0] = 1; + b[1] = 0; + return(n1_pucch2); + } else if (((harq_ack0 == 2) || (harq_ack0 == 0)) && (harq_ack1 == 1) && ((harq_ack2 == 2) || (harq_ack2 == 0))) { + b[1] = 0; + b[0] = 0; + return(n1_pucch1); + } else if (((harq_ack0 == 2) || (harq_ack0 == 0)) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && (harq_ack2 == 1)) { + b[0] = 0; + b[1] = 0; + return(n1_pucch2); + } else if ((harq_ack0 == 2) && (harq_ack1 == 2) && (harq_ack2 == 0)) { + b[0] = 0; + b[1] = 1; + return(n1_pucch2); + } else if ((harq_ack0 == 2) && (harq_ack1 == 0) && ((harq_ack2 == 2) || (harq_ack2 == 0))) { + b[0] = 1; + b[1] = 0; + return(n1_pucch1); + } else if ((harq_ack0 == 0) && ((harq_ack1 == 2) || (harq_ack1 == 0)) && ((harq_ack2 == 2) || (harq_ack2 == 0))) { + b[0] = 1; + b[1] = 0; + return(n1_pucch0); + } + + } + } else if (SR==1) { // SR and 0,1,or 2 ACKS, (first 3 entries in Table 7.3-1 of 36.213) + // this should be number of ACKs (including + ack_counter = 0; + if (harq_ack0==1) + ack_counter ++; + if (harq_ack1==1) + ack_counter ++; + if (harq_ack2==1) + ack_counter ++; + if (harq_ack3==1) + ack_counter ++; + + switch (ack_counter) { + case 0: + b[0] = 0; + b[1] = 0; + break; + + case 1: + b[0] = 1; + b[1] = 1; + break; + + case 2: + b[0] = 1; + b[1] = 0; + break; + + case 3: + b[0] = 0; + b[1] = 1; + break; + + case 4: + b[0] = 1; + b[1] = 1; + break; + } + + ack_counter = 0; + return(ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex); + } + + break; + } // switch tdd_config } - LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, exit without proper return\n",phy_vars_ue->frame_tx); + LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, exit without proper return\n", ue->Mod_id, proc->frame_tx); return(-1); } -#ifdef EMOS -/* -void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) { - uint8_t harq_pid; +void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, uint8_t empty_subframe) { + int aa; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; - if (next_slot%2==0) { - // get harq_pid from subframe relationship - harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms,phy_vars_ue->frame,(next_slot>>1)); - if (harq_pid==255) { - LOG_E(PHY,"[UE%d] Frame %d : FATAL ERROR: illegal harq_pid, returning\n", - 0,phy_vars_ue->frame); + int nsymb; + int subframe_tx = proc->subframe_tx; + int frame_tx = proc->frame_tx; + int ulsch_start; + int overflow=0; +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + int k,l; + int dummy_tx_buffer[frame_parms->samples_per_tti] __attribute__((aligned(16))); +#endif + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_COMMON,VCD_FUNCTION_IN); +#if UE_TIMING_TRACE + start_meas(&ue->ofdm_mod_stats); +#endif + nsymb = (frame_parms->Ncp == 0) ? 14 : 12; + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case + ulsch_start = (ue->rx_offset+subframe_tx*frame_parms->samples_per_tti- + ue->hw_timing_advance- + ue->timing_advance- + ue->N_TA_offset+5); + //LOG_E(PHY,"ul-signal [subframe: %d, ulsch_start %d]\n",subframe_tx, ulsch_start); + + if(ulsch_start < 0) + ulsch_start = ulsch_start + (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti); + + if (ulsch_start > (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti)) + ulsch_start = ulsch_start % (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti); + + //LOG_E(PHY,"ul-signal [subframe: %d, ulsch_start %d]\n",subframe_tx, ulsch_start); +#else //this is the normal case + ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-ue->N_TA_offset; //-ue->timing_advance; +#endif //else EXMIMO + +//#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + if (empty_subframe) + { +//#if 1 + overflow = ulsch_start - 9*frame_parms->samples_per_tti; + for (aa=0; aanb_antennas_tx; aa++) { + + if (overflow > 0) + { + memset(&ue->common_vars.txdata[aa][ulsch_start],0,4*(frame_parms->samples_per_tti-overflow)); + memset(&ue->common_vars.txdata[aa][0],0,4*overflow); + } + else + { + memset(&ue->common_vars.txdata[aa][ulsch_start],0,4*frame_parms->samples_per_tti); + } + } +/*#else + overflow = ulsch_start - 9*frame_parms->samples_per_tti; + for (aa=0; aanb_antennas_tx; aa++) { + for (k=ulsch_start; ksamples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++) { + ((short*)ue->common_vars.txdata[aa])[2*k] = 0; + ((short*)ue->common_vars.txdata[aa])[2*k+1] = 0; + } + + for (k=0; kcommon_vars.txdata[aa])[2*k] = 0; + ((short*)ue->common_vars.txdata[aa])[2*k+1] = 0; + } + } +#endif*/ return; + } +//#endif + + if ((frame_tx%100) == 0) + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d\n", + ue->Mod_id,frame_tx,subframe_tx, + ulsch_start, + ue->rx_offset, + ue->hw_timing_advance, + ue->timing_advance, + ue->N_TA_offset); + + + for (aa=0; aanb_antennas_tx; aa++) { + if (frame_parms->Ncp == 1) + PHY_ofdm_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + dummy_tx_buffer, +#else + &ue->common_vars.txdata[aa][ulsch_start], +#endif + frame_parms->ofdm_symbol_size, + nsymb, + frame_parms->nb_prefix_samples, + CYCLIC_PREFIX); + else + normal_prefix_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + dummy_tx_buffer, +#else + &ue->common_vars.txdata[aa][ulsch_start], +#endif + nsymb, + &ue->frame_parms); + + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + apply_7_5_kHz(ue,dummy_tx_buffer,0); + apply_7_5_kHz(ue,dummy_tx_buffer,1); +#else + apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],0); + apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],1); +#endif + + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + overflow = ulsch_start - 9*frame_parms->samples_per_tti; + + + for (k=ulsch_start,l=0; ksamples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++,l++) { + ((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; + ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; } - if (ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { - emos_dump_UE.uci_cnt[next_slot>>1] = 1; - memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o,ulsch_ue[eNB_id]->o,MAX_CQI_BITS*sizeof(char)); - emos_dump_UE.UCI_data[0][next_slot>>1].O = ulsch_ue[eNB_id]->O; - memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_RI,ulsch_ue[eNB_id]->o_RI,2*sizeof(char)); - emos_dump_UE.UCI_data[0][next_slot>>1].O_RI = ulsch_ue[eNB_id]->O_RI; - memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_ACK,ulsch_ue[eNB_id]->o_ACK,4*sizeof(char)); - emos_dump_UE.UCI_data[0][next_slot>>1].O_ACK = ulsch_ue[eNB_id]->harq_processes[harq_pid]->O_ACK; + for (k=0; kcommon_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; + ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; } - else { - emos_dump_UE.uci_cnt[next_slot>>1] = 0; +#if defined(EXMIMO) + // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on + for (k=ulsch_start - (frame_parms->samples_per_tti>>1) ; kcommon_vars.txdata[aa][k+frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + else if (k>(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) + ue->common_vars.txdata[aa][k-frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; + else + ue->common_vars.txdata[aa][k] &= 0xFFFEFFFE; + } +#endif +#endif + /* + only for debug + LOG_I(PHY,"ul-signal [subframe: %d, ulsch_start %d, TA: %d, rxOffset: %d, timing_advance: %d, hw_timing_advance: %d]\n",subframe_tx, ulsch_start, ue->N_TA_offset, ue->rx_offset, ue->timing_advance, ue->hw_timing_advance); + if( (crash == 1) && (subframe_tx == 0) ) + { + LOG_E(PHY,"***** DUMP TX Signal [ulsch_start %d] *****\n",ulsch_start); + write_output("txBuff.m","txSignal",&ue->common_vars.txdata[aa][ulsch_start],frame_parms->samples_per_tti,1,1); + } + */ + + } //nb_antennas_tx + +#if UE_TIMING_TRACE + stop_meas(&ue->ofdm_mod_stats); +#endif + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_COMMON,VCD_FUNCTION_OUT); + +} + +void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode) { + + int frame_tx = proc->frame_tx; + int subframe_tx = proc->subframe_tx; + int prach_power; + PRACH_RESOURCES_t prach_resources_local; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PRACH, VCD_FUNCTION_IN); + + ue->generate_prach=0; + + if (ue->mac_enabled==0){ + ue->prach_resources[eNB_id] = &prach_resources_local; + prach_resources_local.ra_RNTI = 0xbeef; + prach_resources_local.ra_PreambleIndex = 0; + } + + if (ue->mac_enabled==1){ + // ask L2 for RACH transport + if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) { + LOG_D(PHY,"Getting PRACH resources\n"); + + ue->prach_resources[eNB_id] = ue_get_rach(ue->Mod_id, + ue->CC_id, + frame_tx, + eNB_id, + subframe_tx); + LOG_D(PHY,"Got prach_resources for eNB %d address %p, RRCCommon %p\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[ue->Mod_id].radioResourceConfigCommon); + LOG_D(PHY,"Prach resources %p\n",ue->prach_resources[eNB_id]); } } -} -*/ + + if (ue->prach_resources[eNB_id]!=NULL) { + + ue->generate_prach=1; + ue->prach_cnt=0; +#ifdef SMBV + ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; #endif - -int dummy_tx_buffer[3840*4] __attribute__((aligned(16))); -PRACH_RESOURCES_t prach_resources_local; - -void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) -{ - - int i; - uint16_t first_rb, nb_rb; - uint8_t harq_pid; - unsigned int input_buffer_length; - unsigned int aa; - uint8_t Msg3_flag=0; - uint8_t pucch_ack_payload[2]; - uint8_t n1_pucch; - ANFBmode_t bundling_flag; - PUCCH_FMT_t format; - uint8_t SR_payload; - int32_t prach_power; - uint8_t nsymb; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; - uint8_t generate_ul_signal = 0; - uint8_t ack_status=0; - int8_t Po_PUCCH; - int32_t ulsch_start=0; + LOG_I(PHY,"mode %d\n",mode); + + if ((ue->mac_enabled==1) && (mode != calib_prach_tx)) { + ue->tx_power_dBm[subframe_tx] = ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(ue->Mod_id,ue->CC_id,eNB_id); + } + else { + ue->tx_power_dBm[subframe_tx] = ue->tx_power_max_dBm; + ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; + } + + LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d,PL %d, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", + ue->Mod_id, + frame_tx, + subframe_tx, + ue->prach_resources[eNB_id]->ra_PreambleIndex, + get_PL(ue->Mod_id,ue->CC_id,eNB_id), + ue->tx_power_dBm[subframe_tx], + ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER, + ue->prach_resources[eNB_id]->ra_TDD_map_index, + ue->prach_resources[eNB_id]->ra_RNTI); + + ue->tx_total_RE[subframe_tx] = 96; + #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - int overflow=0; - int k,l; + ue->prach_vars[eNB_id]->amp = get_tx_amp(ue->tx_power_dBm[subframe_tx], + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, + 6); + +#else + ue->prach_vars[eNB_id]->amp = AMP; #endif - int slot_tx = phy_vars_ue->slot_tx; - int subframe_tx = phy_vars_ue->slot_tx>>1; - int frame_tx = phy_vars_ue->frame_tx; - int Mod_id = phy_vars_ue->Mod_id; - int CC_id = phy_vars_ue->CC_id; + + if ((mode == calib_prach_tx) && (((proc->frame_tx&0xfffe)%100)==0)) + LOG_D(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n", + ue->Mod_id, + proc->frame_rx, + proc->subframe_tx, + ue->tx_power_dBm[subframe_tx], + ue->prach_vars[eNB_id]->amp); + + + // start_meas(&ue->tx_prach); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN); + prach_power = generate_prach(ue,eNB_id,subframe_tx,frame_tx); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT); + // stop_meas(&ue->tx_prach); + LOG_D(PHY,"[UE %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n", + ue->Mod_id, + get_PL(ue->Mod_id,ue->CC_id,eNB_id), + ue->tx_power_dBm[subframe_tx], + dB_fixed(prach_power), + ue->prach_vars[eNB_id]->amp); + } else { + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.prach_flag=1; + UE_transport_info[ue->Mod_id][ue->CC_id].cntl.prach_id=ue->prach_resources[eNB_id]->ra_PreambleIndex; + } + + if (ue->mac_enabled==1){ + Msg1_transmitted(ue->Mod_id, + ue->CC_id, + frame_tx, + eNB_id); + } + + LOG_I(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n", + ue->Mod_id,frame_tx,subframe_tx,eNB_id, + ue->prach_resources[eNB_id]->ra_PreambleIndex, + ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(ue->Mod_id,ue->CC_id,eNB_id), + get_PL(ue->Mod_id,ue->CC_id,eNB_id)); + + + + // if we're calibrating the PRACH kill the pointer to its resources so that the RA protocol doesn't continue + if (mode == calib_prach_tx) + ue->prach_resources[eNB_id]=NULL; + + LOG_D(PHY,"[UE %d] frame %d subframe %d : generate_prach %d, prach_cnt %d\n", + ue->Mod_id,frame_tx,subframe_tx,ue->generate_prach,ue->prach_cnt); + + ue->prach_cnt++; + + if (ue->prach_cnt==3) + ue->generate_prach=0; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PRACH, VCD_FUNCTION_OUT); +} + +void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) { + + int harq_pid; + int frame_tx=proc->frame_tx; + int subframe_tx=proc->subframe_tx; + int Mod_id = ue->Mod_id; + int CC_id = ue->CC_id; + uint8_t Msg3_flag=0; + uint16_t first_rb, nb_rb; + unsigned int input_buffer_length; + int i; + int aa; int tx_amp; + uint8_t ulsch_input_buffer[5477] __attribute__ ((aligned(32))); + uint8_t access_mode; + uint8_t Nbundled=0; + uint8_t NbundledCw1=0; + uint8_t ack_status_cw0=0; + uint8_t ack_status_cw1=0; + uint8_t cqi_status = 0; + uint8_t ri_status = 0; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC,VCD_FUNCTION_IN); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN); + // get harq_pid from subframe relationship + harq_pid = subframe2harq_pid(&ue->frame_parms, + frame_tx, + subframe_tx); - start_meas(&phy_vars_ue->phy_proc_tx); -#ifdef EMOS - //phy_procedures_emos_UE_TX(next_slot); -#endif + if (ue->mac_enabled == 1) { + if ((ue->ulsch_Msg3_active[eNB_id] == 1) && + (ue->ulsch_Msg3_frame[eNB_id] == frame_tx) && + (ue->ulsch_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3 - if ((slot_tx%2)==0) { - phy_vars_ue->tx_power_dBm=-127; + ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - if (abstraction_flag==0) { - for (aa=0; aanb_antennas_tx; aa++) { - memset(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti], - 0, - frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*sizeof(int32_t)); - } + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) + generate_ue_ulsch_params_from_rar(ue, + proc, + eNB_id); + + ue->ulsch[eNB_id]->power_offset = 14; + LOG_D(PHY,"[UE %d][RAPROC] Frame %d: Setting Msg3_flag in subframe %d, for harq_pid %d\n", + Mod_id, + frame_tx, + subframe_tx, + harq_pid); + Msg3_flag = 1; + } else { + + + AssertFatal(harq_pid!=255,"[UE%d] Frame %d subframe %d ulsch_decoding.c: FATAL ERROR: illegal harq_pid, exiting\n", + Mod_id,frame_tx, subframe_tx); + Msg3_flag=0; + } + } + + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { + + uint8_t isBad = 0; + if (ue->frame_parms.N_RB_UL <= ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb) { + LOG_D(PHY,"Invalid PUSCH first_RB=%d for N_RB_UL=%d\n", + ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb, + ue->frame_parms.N_RB_UL); + isBad = 1; + } + if (ue->frame_parms.N_RB_UL < ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb) { + LOG_D(PHY,"Invalid PUSCH num_RB=%d for N_RB_UL=%d\n", + ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb, + ue->frame_parms.N_RB_UL); + isBad = 1; + } + if (0 > ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb) { + LOG_D(PHY,"Invalid PUSCH first_RB=%d\n", + ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb); + isBad = 1; + } + if (0 >= ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb) { + LOG_D(PHY,"Invalid PUSCH num_RB=%d\n", + ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb); + isBad = 1; + } + if (ue->frame_parms.N_RB_UL < (ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb + ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb)) { + LOG_D(PHY,"Invalid PUSCH num_RB=%d + first_RB=%d for N_RB_UL=%d\n", + ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb, + ue->frame_parms.N_RB_UL); + isBad = 1; + } + if ((0 > ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx) || + (3 < ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx)) { + LOG_D(PHY,"Invalid PUSCH RV index=%d\n", ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx); + isBad = 1; } - if (phy_vars_ue->UE_mode[eNB_id] != PRACH) { - /* - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d: Generating SRS\n",Mod_id,phy_vars_ue->frame,slot_tx); - #endif - if (abstraction_flag == 0) { - #ifdef OFDMA_ULSCH - generate_srs_tx(phy_vars_ue,eNB_id,AMP,subframe_tx); - #else - generate_srs_tx(phy_vars_ue,eNB_id,AMP,subframe_tx); - #endif - } + if (isBad) { + LOG_I(PHY,"Skip PUSCH generation!\n"); + ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; + } + } + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { - #ifdef PHY_ABSTRACTION - else { - generate_srs_tx_emul(phy_vars_ue,subframe_tx); + ue->generate_ul_signal[eNB_id] = 1; + + // deactivate service request + // ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; + LOG_D(PHY,"Generating PUSCH (Abssubframe: %d.%d): harq-Id: %d, round: %d, MaxReTrans: %d \n",frame_tx,subframe_tx,harq_pid,ue->ulsch[eNB_id]->harq_processes[harq_pid]->round,ue->ulsch[eNB_id]->Mlimit); + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round >= (ue->ulsch[eNB_id]->Mlimit - 1)) + { + LOG_D(PHY,"PUSCH MAX Retransmission achieved ==> send last pusch\n"); + ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0; + } + + ack_status_cw0 = reset_ack(&ue->frame_parms, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack, + subframe_tx, + proc->subframe_rx, + ue->ulsch[eNB_id]->o_ACK, + &Nbundled, + 0); + ack_status_cw1 = reset_ack(&ue->frame_parms, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][1]->harq_ack, + subframe_tx, + proc->subframe_rx, + ue->ulsch[eNB_id]->o_ACK, + &NbundledCw1, + 1); + + //Nbundled = ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack; + //ue->ulsch[eNB_id]->bundling = Nbundled; + + first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb; + nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb; + + + // check Periodic CQI/RI reporting + cqi_status = ((ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex>0)&& + (is_cqi_TXOp(ue,proc,eNB_id)==1)); + + ri_status = ((ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex>0) && + (is_ri_TXOp(ue,proc,eNB_id)==1)); + + // compute CQI/RI resources + compute_cqi_ri_resources(ue, ue->ulsch[eNB_id], eNB_id, ue->ulsch[eNB_id]->rnti, P_RNTI, CBA_RNTI, cqi_status, ri_status); + + if (ack_status_cw0 > 0) { + + // check if we received a PDSCH at subframe_tx - 4 + // ==> send ACK/NACK on PUSCH + if (ue->frame_parms.frame_type == FDD) + { + ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK = ack_status_cw0 + ack_status_cw1; + } + + +#if T_TRACER + if(ue->ulsch[eNB_id]->o_ACK[0]) + { + LOG_I(PHY,"PUSCH ACK\n"); + T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), + T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); + } + else + { + LOG_I(PHY,"PUSCH NACK\n"); + T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), + T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); + } +#endif +#ifdef UE_DEBUG_TRACE + LOG_I(PHY,"[UE %d][PDSCH %x] AbsSubFrame %d.%d Generating ACK (%d,%d) for %d bits on PUSCH\n", + Mod_id, + ue->ulsch[eNB_id]->rnti, + frame_tx%1024,subframe_tx, + ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1], + ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK); +#endif + } + + +#ifdef UE_DEBUG_TRACE + LOG_I(PHY, + "[UE %d][PUSCH %d] AbsSubframe %d.%d Generating PUSCH : first_rb %d, nb_rb %d, round %d, mcs %d, rv %d, " + "cyclic_shift %d (cyclic_shift_common %d,n_DMRS2 %d,n_PRS %d), ACK (%d,%d), O_ACK %d, ack_status_cw0 %d ack_status_cw1 %d bundling %d, Nbundled %d, CQI %d, RI %d\n", + Mod_id,harq_pid,frame_tx%1024,subframe_tx, + first_rb,nb_rb, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx, + (ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift+ + ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2+ + ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe_tx<<1])%12, + ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2, + ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe_tx<<1], + ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1], + ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK, + ack_status_cw0, + ack_status_cw1, + ue->ulsch[eNB_id]->bundling, Nbundled, + cqi_status, + ri_status); +#endif + + + + + + if (Msg3_flag == 1) { + LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d Generating (RRCConnectionRequest) Msg3 (nb_rb %d, first_rb %d, round %d, rvidx %d) Msg3: %x.%x.%x|%x.%x.%x.%x.%x.%x\n",Mod_id,frame_tx, + subframe_tx, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round, + ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx, + ue->prach_resources[eNB_id]->Msg3[0], + ue->prach_resources[eNB_id]->Msg3[1], + ue->prach_resources[eNB_id]->Msg3[2], + ue->prach_resources[eNB_id]->Msg3[3], + ue->prach_resources[eNB_id]->Msg3[4], + ue->prach_resources[eNB_id]->Msg3[5], + ue->prach_resources[eNB_id]->Msg3[6], + ue->prach_resources[eNB_id]->Msg3[7], + ue->prach_resources[eNB_id]->Msg3[8]); +#if UE_TIMING_TRACE + start_meas(&ue->ulsch_encoding_stats); +#endif + + AssertFatal(ulsch_encoding(ue->prach_resources[eNB_id]->Msg3, + ue, + harq_pid, + eNB_id, + proc->subframe_rx, + ue->transmission_mode[eNB_id],0,0)==0, + "ulsch_coding.c: FATAL ERROR: returning\n"); + +#if UE_TIMING_TRACE + stop_meas(&ue->phy_proc_tx); + printf("------FULL TX PROC : %5.2f ------\n",ue->phy_proc_tx.p_time/(cpuf*1000.0)); +#endif + return; + +#if UE_TIMING_TRACE + stop_meas(&ue->ulsch_encoding_stats); +#endif + if (ue->mac_enabled == 1) { + + // signal MAC that Msg3 was sent + Msg3_transmitted(Mod_id, + CC_id, + frame_tx, + eNB_id); + } + LOG_I(PHY,"Done Msg3 encoding\n"); + } // Msg3_flag==1 + else {// Msg3_flag==0 + input_buffer_length = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/8; + + if (ue->mac_enabled==1) { + + // LOG_D(PHY,"[UE %d] ULSCH : Searching for MAC SDUs\n",Mod_id); + if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) { + //if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { + access_mode=SCHEDULED_ACCESS; + ue_get_sdu(Mod_id, + CC_id, + frame_tx, + subframe_tx, + eNB_id, + ulsch_input_buffer, + input_buffer_length, + &access_mode); + } + + + + +#ifdef DEBUG_PHY_PROC +#ifdef DEBUG_ULSCH + LOG_D(PHY,"[UE] Frame %d, subframe %d : ULSCH SDU (TX harq_pid %d) (%d bytes) : \n",frame_tx,subframe_tx,harq_pid, ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3); + + for (i=0; iulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3; i++) + LOG_T(PHY,"%x.",ulsch_input_buffer[i]); + + LOG_T(PHY,"\n"); +#endif +#endif + } + else { + unsigned int taus(void); + + for (i=0; iulsch_encoding_stats); +#endif + if (abstraction_flag==0) { + + if (ulsch_encoding(ulsch_input_buffer, + ue, + harq_pid, + eNB_id, + proc->subframe_rx, + ue->transmission_mode[eNB_id],0, + Nbundled)!=0) { + LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&ue->phy_proc_tx); +#endif + return; + } + } + +#if UE_TIMING_TRACE + stop_meas(&ue->ulsch_encoding_stats); +#endif + } + + if (abstraction_flag == 0) { + if (ue->mac_enabled==1) { + pusch_power_cntl(ue,proc,eNB_id,1, abstraction_flag); + ue->tx_power_dBm[subframe_tx] = ue->ulsch[eNB_id]->Po_PUSCH; + } + else { + ue->tx_power_dBm[subframe_tx] = ue->tx_power_max_dBm; + } + ue->tx_total_RE[subframe_tx] = nb_rb*12; + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + tx_amp = get_tx_amp(ue->tx_power_dBm[subframe_tx], + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, + nb_rb); +#else + tx_amp = AMP; +#endif + + T(T_UE_PHY_PUSCH_TX_POWER, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx),T_INT(ue->tx_power_dBm[subframe_tx]), + T_INT(tx_amp),T_INT(ue->ulsch[eNB_id]->f_pusch),T_INT(get_PL(Mod_id,0,eNB_id)),T_INT(nb_rb)); + +#ifdef UE_DEBUG_TRACE + LOG_I(PHY,"[UE %d][PUSCH %d] AbsSubFrame %d.%d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d\n", + Mod_id,harq_pid,frame_tx%1024,subframe_tx,ue->tx_power_dBm[subframe_tx],ue->tx_power_max_dBm, tx_amp); +#endif +#if UE_TIMING_TRACE + + start_meas(&ue->ulsch_modulation_stats); +#endif + ulsch_modulation(ue->common_vars.txdataF, + tx_amp, + frame_tx, + subframe_tx, + &ue->frame_parms, + ue->ulsch[eNB_id]); + for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++) + generate_drs_pusch(ue, + proc, + eNB_id, + tx_amp, + subframe_tx, + first_rb, + nb_rb, + aa); +#if UE_TIMING_TRACE + stop_meas(&ue->ulsch_modulation_stats); +#endif + } + + if (abstraction_flag==1) { + // clear SR + ue->sr[subframe_tx]=0; + } + } // subframe_scheduling_flag==1 + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC,VCD_FUNCTION_OUT); + +} + +void ue_srs_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) +{ + + //LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + //int8_t frame_tx = proc->frame_tx; + int8_t subframe_tx = proc->subframe_tx; + int16_t tx_amp; + int16_t Po_SRS; + uint8_t nb_rb_srs; + + SOUNDINGRS_UL_CONFIG_DEDICATED *pSoundingrs_ul_config_dedicated=&ue->soundingrs_ul_config_dedicated[eNB_id]; + uint8_t isSrsTxOccasion = pSoundingrs_ul_config_dedicated->srsUeSubframe; + + if(isSrsTxOccasion) + { + ue->generate_ul_signal[eNB_id] = 1; + if (ue->mac_enabled==1) + { + srs_power_cntl(ue,proc,eNB_id, (uint8_t*)(&nb_rb_srs), abstraction_flag); + Po_SRS = ue->ulsch[eNB_id]->Po_SRS; + } + else + { + Po_SRS = ue->tx_power_max_dBm; + } + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + if (ue->mac_enabled==1) + { + tx_amp = get_tx_amp(Po_SRS, + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, + nb_rb_srs); + } + else + { + tx_amp = AMP; + } +#else + tx_amp = AMP; +#endif + LOG_D(PHY,"SRS PROC; TX_MAX_POWER %d, Po_SRS %d, NB_RB_UL %d, NB_RB_SRS %d TX_AMPL %d\n",ue->tx_power_max_dBm, + Po_SRS, + ue->frame_parms.N_RB_UL, + nb_rb_srs, + tx_amp); + + uint16_t nsymb = (ue->frame_parms.Ncp==0) ? 14:12; + uint16_t symbol_offset = (int)ue->frame_parms.ofdm_symbol_size*((subframe_tx*nsymb)+(nsymb-1)); + generate_srs(&ue->frame_parms, + &ue->soundingrs_ul_config_dedicated[eNB_id], + &ue->common_vars.txdataF[eNB_id][symbol_offset], + tx_amp, + subframe_tx); + } +} + +int16_t get_pucch2_cqi(PHY_VARS_UE *ue,int eNB_id,int *len) { + + if ((ue->transmission_mode[eNB_id]<4)|| + (ue->transmission_mode[eNB_id]==7)) { // Mode 1-0 feedback + // 4-bit CQI message + /*LOG_I(PHY,"compute CQI value, TM %d, length 4, Cqi Avg %d, value %d \n", ue->transmission_mode[eNB_id], + ue->measurements.wideband_cqi_avg[eNB_id], + sinr2cqi((double)ue->measurements.wideband_cqi_avg[eNB_id], + ue->transmission_mode[eNB_id]));*/ + *len=4; + return(sinr2cqi((double)ue->measurements.wideband_cqi_avg[eNB_id], + ue->transmission_mode[eNB_id])); + } + else { // Mode 1-1 feedback, later + //LOG_I(PHY,"compute CQI value, TM %d, length 0, Cqi Avg 0 \n", ue->transmission_mode[eNB_id]); + *len=0; + // 2-antenna ports RI=1, 6 bits (2 PMI, 4 CQI) + + // 2-antenna ports RI=2, 8 bits (1 PMI, 7 CQI/DIFF CQI) + return(0); + } +} + + +int16_t get_pucch2_ri(PHY_VARS_UE *ue,int eNB_id) { + + return(1); +} + + +void get_pucch_param(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, + uint8_t *ack_payload, + PUCCH_FMT_t format, + uint8_t eNB_id, + uint8_t SR, + uint8_t cqi_report, + uint16_t *pucch_resource, + uint8_t *pucch_payload, + uint16_t *plength) +{ + + switch (format) { + case pucch_format1: + { + pucch_resource[0] = ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex; + pucch_payload[0] = 0; // payload is ignored in case of format1 + pucch_payload[1] = 0; // payload is ignored in case of format1 + } + break; + + case pucch_format1a: + case pucch_format1b: + case pucch_format1b_csA2: + case pucch_format1b_csA3: + case pucch_format1b_csA4: + { + pucch_resource[0] = get_n1_pucch(ue, + proc, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack, + eNB_id, + ack_payload, + SR); + pucch_payload[0] = ack_payload[0]; + pucch_payload[1] = ack_payload[1]; + //pucch_payload[1] = 1; + } + break; + + case pucch_format2: + { + pucch_resource[0] = ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PUCCH_ResourceIndex; + if(cqi_report) + { + pucch_payload[0] = get_pucch2_cqi(ue,eNB_id,(int*)plength); } - #endif - */ - // get harq_pid from subframe relationship - harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms, + else + { + *plength = 1; + pucch_payload[0] = get_pucch2_ri(ue,eNB_id); + } + } + break; + + case pucch_format2a: + case pucch_format2b: + LOG_E(PHY,"NO Resource available for PUCCH 2a/2b \n"); + break; + + case pucch_format3: + fprintf(stderr, "PUCCH format 3 not handled\n"); + abort(); + } +} + +void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) { + + + uint8_t pucch_ack_payload[2]; + uint16_t pucch_resource; + ANFBmode_t bundling_flag; + PUCCH_FMT_t format; + + uint8_t SR_payload; + uint8_t pucch_payload[2]; + uint16_t len; + + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + int frame_tx=proc->frame_tx; + int subframe_tx=proc->subframe_tx; + int Mod_id = ue->Mod_id; + int CC_id = ue->CC_id; + int tx_amp; + int16_t Po_PUCCH; + uint8_t ack_status_cw0=0; + uint8_t ack_status_cw1=0; + uint8_t nb_cw=0; + uint8_t cqi_status=0; + uint8_t ri_status=0; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PUCCH,VCD_FUNCTION_IN); + + SOUNDINGRS_UL_CONFIG_DEDICATED *pSoundingrs_ul_config_dedicated=&ue->soundingrs_ul_config_dedicated[eNB_id]; + + // 36.213 8.2 + /*if ackNackSRS_SimultaneousTransmission == TRUE and in the cell specific SRS subframes UE shall transmit + ACK/NACK and SR using the shortened PUCCH format. This shortened PUCCH format shall be used in a cell + specific SRS subframe even if the UE does not transmit SRS in that subframe + */ + + int harq_pid = subframe2harq_pid(&ue->frame_parms, frame_tx, subframe_tx); + if(ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag) + { + LOG_D(PHY,"PUSCH is programmed on this subframe [pid %d] AbsSuframe %d.%d ==> Skip PUCCH transmission \n",harq_pid,frame_tx,subframe_tx); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PUCCH,VCD_FUNCTION_OUT); + return; + } - if (phy_vars_ue->mac_enabled == 1) { - if ((phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) && - (phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id] == frame_tx) && - (phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3 + uint8_t isShortenPucch = (pSoundingrs_ul_config_dedicated->srsCellSubframe && frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission); - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; + bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; - if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round==0) - generate_ue_ulsch_params_from_rar(phy_vars_ue, - eNB_id); + if ((frame_parms->frame_type==FDD) || + (bundling_flag==bundling) || + ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe_tx!=2)||(subframe_tx!=7)))) { + format = pucch_format1a; + LOG_D(PHY,"[UE] PUCCH 1a\n"); + } else { + format = pucch_format1b; + LOG_D(PHY,"[UE] PUCCH 1b\n"); + } - phy_vars_ue->ulsch_ue[eNB_id]->power_offset = 14; - LOG_D(PHY,"[UE %d][RAPROC] Frame %d: Setting Msg3_flag in subframe %d, for harq_pid %d\n", - Mod_id, - frame_tx, - subframe_tx, - harq_pid); - Msg3_flag = 1; - } else { + // Part - I + // Collect feedback that should be transmitted at this subframe + // - SR + // - ACK/NACK + // - CQI + // - RI - if (harq_pid==255) { - LOG_E(PHY,"[UE%d] Frame %d ulsch_decoding.c: FATAL ERROR: illegal harq_pid, returning\n", - Mod_id,frame_tx); - mac_xface->macphy_exit("Error in ulsch_decoding"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_tx); - return; - } - - Msg3_flag=0; - } - } - - if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) { - - generate_ul_signal = 1; - - // deactivate service request - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; - - ack_status = get_ack(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack, - subframe_tx, - phy_vars_ue->ulsch_ue[eNB_id]->o_ACK); - - first_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->first_rb; - nb_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb; - - - //frame_parms->pusch_config_c ommon.ul_ReferenceSignalsPUSCH.cyclicShift = 0; - - //frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[20] = 0; - - - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY, - "[UE %d][PUSCH %d] Frame %d subframe %d Generating PUSCH : first_rb %d, nb_rb %d, round %d, mcs %d, rv %d, cyclic_shift %d (cyclic_shift_common %d,n_DMRS2 %d,n_PRS %d), ACK (%d,%d), O_ACK %d\n", - Mod_id,harq_pid,frame_tx,subframe_tx, - first_rb,nb_rb, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->mcs, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->rvidx, - (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift+ - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2+ - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[slot_tx])%12, - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->n_DMRS2, - frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[slot_tx], - phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[0],phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[1], - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->O_ACK); -#endif - - if (ack_status > 0) { - LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d Generating ACK (%d,%d) for %d bits on PUSCH\n", - Mod_id, - phy_vars_ue->ulsch_ue[eNB_id]->rnti, - frame_tx,subframe_tx, - phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[0],phy_vars_ue->ulsch_ue[eNB_id]->o_ACK[1], - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->O_ACK); - } - - - - - - //#ifdef DEBUG_PHY_PROC - // debug_LOG_D(PHY,"[UE %d] Frame %d, Subframe %d ulsch harq_pid %d : O %d, O_ACK %d, O_RI %d, TBS %d\n",Mod_id,phy_vars_ue->frame,subframe_tx,harq_pid,phy_vars_ue->ulsch_ue[eNB_id]->O,phy_vars_ue->ulsch_ue[eNB_id]->O_ACK,phy_vars_ue->ulsch_ue[eNB_id]->O_RI,phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS); - //#endif - if (Msg3_flag == 1) { - LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d next slot %d Generating (RRCConnectionRequest) Msg3 (nb_rb %d, first_rb %d, round %d, rvidx %d) Msg3: %x.%x.%x|%x.%x.%x.%x.%x.%x\n",Mod_id,frame_tx, - subframe_tx, slot_tx, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->first_rb, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->prach_resources[eNB_id]->Msg3[0], - phy_vars_ue->prach_resources[eNB_id]->Msg3[1], - phy_vars_ue->prach_resources[eNB_id]->Msg3[2], - phy_vars_ue->prach_resources[eNB_id]->Msg3[3], - phy_vars_ue->prach_resources[eNB_id]->Msg3[4], - phy_vars_ue->prach_resources[eNB_id]->Msg3[5], - phy_vars_ue->prach_resources[eNB_id]->Msg3[6], - phy_vars_ue->prach_resources[eNB_id]->Msg3[7], - phy_vars_ue->prach_resources[eNB_id]->Msg3[8]); - - start_meas(&phy_vars_ue->ulsch_encoding_stats); - - if (abstraction_flag==0) { - if (ulsch_encoding(phy_vars_ue->prach_resources[eNB_id]->Msg3, - phy_vars_ue, - harq_pid, - eNB_id, - phy_vars_ue->transmission_mode[eNB_id],0,0)!=0) { - LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); - mac_xface->macphy_exit("Error in ulsch_coding"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_tx); - return; - } - } - -#ifdef PHY_ABSTRACTION - else { - ulsch_encoding_emul(phy_vars_ue->prach_resources[eNB_id]->Msg3,phy_vars_ue,eNB_id,harq_pid,0); - } - -#endif - stop_meas(&phy_vars_ue->ulsch_encoding_stats); - - if (phy_vars_ue->mac_enabled == 1) { - // signal MAC that Msg3 was sent - mac_xface->Msg3_transmitted(Mod_id, - CC_id, - frame_tx, - eNB_id); - } - } else { - input_buffer_length = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS/8; - - if (phy_vars_ue->mac_enabled==1) { - // LOG_D(PHY,"[UE %d] ULSCH : Searching for MAC SDUs\n",Mod_id); - if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round==0) { - //if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { - access_mode=SCHEDULED_ACCESS; - mac_xface->ue_get_sdu(Mod_id, - CC_id, - frame_tx, - subframe_tx, - eNB_id, - ulsch_input_buffer, - input_buffer_length, - &access_mode); - - //} - /* - else { - // Get calibration information from TDD procedures - LOG_D(PHY,"[UE %d] Frame %d, subframe %d : ULSCH: Getting TDD Auto-Calibration information\n", - Mod_id,phy_vars_ue->frame,subframe_tx); - for (i=0;iulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3); - - for (i=0; iulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS>>3; i++) - LOG_T(PHY,"%x.",ulsch_input_buffer[i]); - - LOG_T(PHY,"\n"); -#endif -#endif - } - else { - // the following lines were necessary for the calibration in CROWN - /* - if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { - for (i=0;iulsch_ue[eNB_id]->o ,0,MAX_CQI_BYTES*sizeof(uint8_t)); - memset(phy_vars_ue->ulsch_ue[eNB_id]->o_RI ,0,2*sizeof(uint8_t)); - memset(phy_vars_ue->ulsch_ue[eNB_id]->o_ACK,0,4*sizeof(uint8_t)); - for (i=0;iulsch_encoding_stats); - - if (abstraction_flag==0) { - /* - if (phy_vars_ue->frame%100==0) { - LOG_I(PHY,"Encoding ulsch\n"); - } - */ - if (ulsch_encoding(ulsch_input_buffer, - phy_vars_ue, - harq_pid, - eNB_id, - phy_vars_ue->transmission_mode[eNB_id],0, - 0)!=0) { // Nbundled, to be updated!!!! - LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_tx); - return; - } - } - -#ifdef PHY_ABSTRACTION - else { - ulsch_encoding_emul(ulsch_input_buffer,phy_vars_ue,eNB_id,harq_pid,0); - } - -#endif - stop_meas(&phy_vars_ue->ulsch_encoding_stats); - } - - if (abstraction_flag == 0) { - if (phy_vars_ue->mac_enabled==1) { - pusch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,1, abstraction_flag); - phy_vars_ue->tx_power_dBm = phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH; - } - else { - phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm; - } - phy_vars_ue->tx_total_RE = nb_rb*12; - -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - tx_amp = get_tx_amp(phy_vars_ue->tx_power_dBm, - phy_vars_ue->tx_power_max_dBm, - phy_vars_ue->lte_frame_parms.N_RB_UL, - nb_rb); -#else - tx_amp = AMP; -#endif - LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d\n", - Mod_id,harq_pid,frame_tx,subframe_tx,phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm, tx_amp); - start_meas(&phy_vars_ue->ulsch_modulation_stats); - ulsch_modulation(phy_vars_ue->lte_ue_common_vars.txdataF, - tx_amp, - frame_tx, - subframe_tx, - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->ulsch_ue[eNB_id]); - for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++) - generate_drs_pusch(phy_vars_ue, + SR_payload = 0; + if (is_SR_TXOp(ue,proc,eNB_id)==1) + { + if (ue->mac_enabled==1) { + SR_payload = ue_get_SR(Mod_id, + CC_id, + frame_tx, eNB_id, - tx_amp, - subframe_tx, - first_rb, - nb_rb, - aa); + ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->crnti, + subframe_tx); // subframe used for meas gap + } + else { + SR_payload = 1; + } + } - stop_meas(&phy_vars_ue->ulsch_modulation_stats); - } + ack_status_cw0 = get_ack(&ue->frame_parms, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack, + subframe_tx, + proc->subframe_rx, + pucch_ack_payload, + 0); - if (abstraction_flag==1) { - // clear SR - phy_vars_ue->sr[subframe_tx]=0; - } - } // ULSCH is active + ack_status_cw1 = get_ack(&ue->frame_parms, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][1]->harq_ack, + subframe_tx, + proc->subframe_rx, + pucch_ack_payload, + 1); -#ifdef PUCCH - else if (phy_vars_ue->UE_mode[eNB_id] == PUSCH) { // check if we need to use PUCCH 1a/1b - // debug_LOG_D(PHY,"[UE%d] Frame %d, subframe %d: Checking for PUCCH 1a/1b\n",Mod_id,frame_tx,subframe_tx); - bundling_flag = phy_vars_ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode; + nb_cw = ( (ack_status_cw0 != 0) ? 1:0) + ( (ack_status_cw1 != 0) ? 1:0); - if ((frame_parms->frame_type==FDD) || - (bundling_flag==bundling) || - ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((slot_tx!=4)||(slot_tx!=14)))) { - format = pucch_format1a; - LOG_D(PHY,"[UE] PUCCH 1a\n"); - } else { - format = pucch_format1b; - LOG_D(PHY,"[UE] PUCCH 1b\n"); - } + cqi_status = ((ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex>0)&& + (is_cqi_TXOp(ue,proc,eNB_id)==1)); - // Check for SR and do ACK/NACK accordingly - if (is_SR_TXOp(phy_vars_ue,eNB_id,subframe_tx)==1) { - LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n", - Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx); + ri_status = ((ue->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex>0) && + (is_ri_TXOp(ue,proc,eNB_id)==1)); - if (phy_vars_ue->mac_enabled==1) { - SR_payload = mac_xface->ue_get_SR(Mod_id, - CC_id, - frame_tx, - eNB_id, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, - subframe_tx); // subframe used for meas gap - } - else { - SR_payload = 1; - } - + // Part - II + // if nothing to report ==> exit function + if( (nb_cw==0) && (SR_payload==0) && (cqi_status==0) && (ri_status==0) ) + { + LOG_D(PHY,"PUCCH No feedback AbsSubframe %d.%d SR_payload %d nb_cw %d pucch_ack_payload[0] %d pucch_ack_payload[1] %d cqi_status %d Return \n", + frame_tx%1024, subframe_tx, SR_payload, nb_cw, pucch_ack_payload[0], pucch_ack_payload[1], cqi_status); + return; + } + + // Part - III + // Decide which PUCCH format should be used if needed + format = get_pucch_format(frame_parms->frame_type, + frame_parms->Ncp, + SR_payload, + nb_cw, + cqi_status, + ri_status, + bundling_flag); + // Determine PUCCH resources and payload: mandatory for pucch encoding + get_pucch_param(ue, + proc, + pucch_ack_payload, + format, + eNB_id, + SR_payload, + cqi_status, + &pucch_resource, + (uint8_t *)&pucch_payload, + &len); + + + LOG_D(PHY,"PUCCH feedback AbsSubframe %d.%d SR %d NbCW %d (%d %d) AckNack %d.%d CQI %d RI %d format %d pucch_resource %d pucch_payload %d %d \n", + frame_tx%1024, subframe_tx, SR_payload, nb_cw, ack_status_cw0, ack_status_cw1, pucch_ack_payload[0], pucch_ack_payload[1], cqi_status, ri_status, format, pucch_resource,pucch_payload[0],pucch_payload[1]); + + // Part - IV + // Generate PUCCH signal + ue->generate_ul_signal[eNB_id] = 1; + + switch (format) { + case pucch_format1: + case pucch_format1a: + case pucch_format1b: + { + if (ue->mac_enabled == 1) { + Po_PUCCH = pucch_power_cntl(ue,proc,subframe_tx,eNB_id,format); + } + else { + Po_PUCCH = ue->tx_power_max_dBm; + } + ue->tx_power_dBm[subframe_tx] = Po_PUCCH; + ue->tx_total_RE[subframe_tx] = 12; + +#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) + tx_amp = get_tx_amp(Po_PUCCH, + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, + 1); +#else + tx_amp = AMP; +#endif +#if T_TRACER + T(T_UE_PHY_PUCCH_TX_POWER, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx),T_INT(ue->tx_power_dBm[subframe_tx]), + T_INT(tx_amp),T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->g_pucch),T_INT(get_PL(ue->Mod_id,ue->CC_id,eNB_id))); +#endif + +#ifdef UE_DEBUG_TRACE + if(format == pucch_format1) + { + LOG_I(PHY,"[UE %d][SR %x] AbsSubframe %d.%d Generating PUCCH 1 (SR for PUSCH), an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, Po_PUCCH %d\n", + Mod_id, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti, + frame_tx%1024, subframe_tx, + frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission, + isShortenPucch, + ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, + Po_PUCCH); + } + else + { if (SR_payload>0) { - generate_ul_signal = 1; - LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n", - Mod_id,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx,SR_payload); + LOG_I(PHY,"[UE %d][SR %x] AbsSubFrame %d.%d Generating PUCCH %s payload %d,%d (with SR for PUSCH), an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, Po_PUCCH %d, amp %d\n", + Mod_id, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti, + frame_tx % 1024, subframe_tx, + (format == pucch_format1a? "1a": ( + format == pucch_format1b? "1b" : "??")), + pucch_ack_payload[0],pucch_ack_payload[1], + frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission, + isShortenPucch, + pucch_resource, + Po_PUCCH, + tx_amp); } else { - phy_vars_ue->sr[subframe_tx]=0; + LOG_I(PHY,"[UE %d][PDSCH %x] AbsSubFrame %d.%d rx_offset_diff: %d, Generating PUCCH %s, an_srs_simultanous %d, shorten_pucch %d, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n", + Mod_id, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti, + frame_tx%1024, subframe_tx,ue->rx_offset_diff, + (format == pucch_format1a? "1a": ( + format == pucch_format1b? "1b" : "??")), + frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission, + isShortenPucch, + pucch_resource,pucch_payload[0],pucch_payload[1],SR_payload, + Po_PUCCH, + tx_amp); } - } else { - SR_payload=0; - } - - if (get_ack(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack, - subframe_tx,pucch_ack_payload) > 0) { - // we need to transmit ACK/NAK in this subframe - - generate_ul_signal = 1; - - n1_pucch = get_n1_pucch(phy_vars_ue, - eNB_id, - subframe_tx, - pucch_ack_payload, - SR_payload); - - if (phy_vars_ue->mac_enabled == 1) { - Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,format); - } - else { - Po_PUCCH = phy_vars_ue->tx_power_max_dBm; - } - phy_vars_ue->tx_power_dBm = Po_PUCCH; - phy_vars_ue->tx_total_RE = 12; - -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - tx_amp = get_tx_amp(Po_PUCCH, - phy_vars_ue->tx_power_max_dBm, - phy_vars_ue->lte_frame_parms.N_RB_UL, - 1); -#else - tx_amp = AMP; -#endif - - if (SR_payload>0) { - LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH 1a/1b payload %d,%d (with SR for PUSCH), n1_pucch %d, Po_PUCCH, amp %d\n", - Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - frame_tx, subframe_tx, - pucch_ack_payload[0],pucch_ack_payload[1], - phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, - Po_PUCCH, - tx_amp); - } else { - LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d Generating PUCCH 1a/1b, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n", - Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - frame_tx, subframe_tx, - n1_pucch,pucch_ack_payload[0],pucch_ack_payload[1],SR_payload, - Po_PUCCH, - tx_amp); - } - - if (abstraction_flag == 0) { - - generate_pucch(phy_vars_ue->lte_ue_common_vars.txdataF, - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->ncs_cell, - format, - &phy_vars_ue->pucch_config_dedicated[eNB_id], - n1_pucch, - 0, // n2_pucch - 1, // shortened format - pucch_ack_payload, - tx_amp, - subframe_tx); - - } else { -#ifdef PHY_ABSTRACTION - LOG_D(PHY,"Calling generate_pucch_emul ... (ACK %d %d, SR %d)\n",pucch_ack_payload[0],pucch_ack_payload[1],SR_payload); - generate_pucch_emul(phy_vars_ue, - format, - phy_vars_ue->lte_frame_parms.pucch_config_common.nCS_AN, - pucch_ack_payload, - SR_payload, - subframe_tx); -#endif - } - } else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC - - if (phy_vars_ue->mac_enabled == 1) { - Po_PUCCH = pucch_power_cntl(phy_vars_ue,subframe_tx,eNB_id,pucch_format1); - } - else { - Po_PUCCH = phy_vars_ue->tx_power_max_dBm; - } - phy_vars_ue->tx_power_dBm = Po_PUCCH; - phy_vars_ue->tx_total_RE = 12; - -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - tx_amp = get_tx_amp(Po_PUCCH, - phy_vars_ue->tx_power_max_dBm, - phy_vars_ue->lte_frame_parms.N_RB_UL, - 1); -#else - tx_amp = AMP; -#endif - LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Generating PUCCH 1 (SR for PUSCH), n1_pucch %d, Po_PUCCH %d\n", - Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - frame_tx, subframe_tx, - phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, - Po_PUCCH); - - if (abstraction_flag == 0) { - - generate_pucch(phy_vars_ue->lte_ue_common_vars.txdataF, - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->ncs_cell, - pucch_format1, - &phy_vars_ue->pucch_config_dedicated[eNB_id], - phy_vars_ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex, - 0, // n2_pucch - 1, // shortened format - pucch_ack_payload, // this is ignored anyway, we just need a pointer - tx_amp, - subframe_tx); - } else { - LOG_D(PHY,"Calling generate_pucch_emul ...\n"); - generate_pucch_emul(phy_vars_ue, - pucch_format1, - phy_vars_ue->lte_frame_parms.pucch_config_common.nCS_AN, - pucch_ack_payload, - SR_payload, - subframe_tx); - } - } } - -#endif // PUCCH - -#ifdef CBA - - if ((phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag >= 1) && - (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status == CBA_ACTIVE)) { - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag=0; //-=1 - // phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status= IDLE; - first_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->first_rb; - nb_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb; - //cba_mcs=phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->mcs; - input_buffer_length = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS/8; - access_mode=CBA_ACCESS; - - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: CBA num dci %d\n", - Mod_id,frame_tx,subframe_tx, - phy_vars_ue->ulsch_ue[eNB_id]->num_cba_dci[subframe_tx]); - - mac_xface->ue_get_sdu(Mod_id, - CC_id, - frame_tx, - subframe_tx, - eNB_id, - ulsch_input_buffer, - input_buffer_length, - &access_mode); - - phy_vars_ue->ulsch_ue[eNB_id]->num_cba_dci[subframe_tx]=0; - - if (access_mode > UNKNOWN_ACCESS) { - - if (abstraction_flag==0) { - if (ulsch_encoding(ulsch_input_buffer, - phy_vars_ue, - harq_pid, - eNB_id, - phy_vars_ue->transmission_mode[eNB_id],0, - 0)!=0) { // Nbundled, to be updated!!!! - LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n"); - return; - } - } - -#ifdef PHY_ABSTRACTION - else { - ulsch_encoding_emul(ulsch_input_buffer,phy_vars_ue,eNB_id,harq_pid,0); - } - #endif - } else { - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status= IDLE; - //reset_cba_uci(phy_vars_ue->ulsch_ue[eNB_id]->o); - LOG_N(PHY,"[UE %d] Frame %d, subframe %d: CBA transmission cancelled or postponed\n", - Mod_id, frame_tx,subframe_tx); - } + +#if T_TRACER + if(pucch_payload[0]) + { + T(T_UE_PHY_DLSCH_UE_ACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), + T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); } - -#endif // end CBA - - if (abstraction_flag == 0) { - nsymb = (frame_parms->Ncp == 0) ? 14 : 12; - -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case - ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti- - openair_daq_vars.timing_advance- - phy_vars_ue->timing_advance- - phy_vars_ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti); -#else //this is the normal case - ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-phy_vars_ue->N_TA_offset; //-phy_vars_ue->timing_advance; -#endif //else EXMIMO - if ((frame_tx%100) == 0) - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d\n", - Mod_id,frame_tx,subframe_tx, - ulsch_start, - phy_vars_ue->rx_offset, - openair_daq_vars.timing_advance, - phy_vars_ue->timing_advance, - phy_vars_ue->N_TA_offset); - - - if (generate_ul_signal == 1 ) { - - - - start_meas(&phy_vars_ue->ofdm_mod_stats); - - for (aa=0; aanb_antennas_tx; aa++) { - if (frame_parms->Ncp == 1) - PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - dummy_tx_buffer, -#else - &phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start], -#endif - frame_parms->ofdm_symbol_size, - nsymb, - frame_parms->nb_prefix_samples, - CYCLIC_PREFIX); - else - normal_prefix_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size], -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - dummy_tx_buffer, -#else - &phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start], -#endif - nsymb, - &phy_vars_ue->lte_frame_parms); - - /* - if (subframe_tx == 8) { - printf("Symbol 0 %p (offset %d) base %p\n", - &phy_vars_ue->lte_ue_common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe], - nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe, - phy_vars_ue->lte_ue_common_vars.txdataF[0]); - write_output("txsigF8.m","txsF8", &phy_vars_ue->lte_ue_common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe], - phy_vars_ue->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); - write_output("txsig8.m","txs8", &phy_vars_ue->lte_ue_common_vars.txdata[0][phy_vars_ue->lte_frame_parms.samples_per_tti*subframe], - phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); - } - */ -#ifndef OFDMA_ULSCH -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,0); - apply_7_5_kHz(phy_vars_ue,dummy_tx_buffer,1); -#else - apply_7_5_kHz(phy_vars_ue,&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],0); - apply_7_5_kHz(phy_vars_ue,&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],1); -#endif - /* - if (subframe_tx == 8) { - write_output("txsig8_mod.m","txs8_mod", &phy_vars_ue->lte_ue_common_vars.txdata[0][phy_vars_ue->lte_frame_parms.samples_per_tti*subframe], - phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); - } - */ -#endif - -#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - overflow = ulsch_start - 9*frame_parms->samples_per_tti; - - //if ((slot_tx==4) && (aa==0)) printf("ulsch_start %d, overflow %d\n",ulsch_start,overflow); - for (k=ulsch_start,l=0; ksamples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++,l++) { - ((short*)phy_vars_ue->lte_ue_common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; - ((short*)phy_vars_ue->lte_ue_common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; - } - - for (k=0; klte_ue_common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4; - ((short*)phy_vars_ue->lte_ue_common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4; - } -#if defined(EXMIMO) - // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on - for (k=ulsch_start - (frame_parms->samples_per_tti>>1) ; klte_ue_common_vars.txdata[aa][k+frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; - else if (k>(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)) - phy_vars_ue->lte_ue_common_vars.txdata[aa][k-frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE; - else - phy_vars_ue->lte_ue_common_vars.txdata[aa][k] &= 0xFFFEFFFE; - } -#endif -#endif - - } //nb_antennas_tx - - stop_meas(&phy_vars_ue->ofdm_mod_stats); - } // generate_ul_signal == 1 - else { // no uplink so clear signal buffer instead - for (aa=0; aanb_antennas_tx; aa++) { - memset(&phy_vars_ue->lte_ue_common_vars.txdata[aa][ulsch_start],0,frame_parms->samples_per_tti<<2); - } - } + else + { + T(T_UE_PHY_DLSCH_UE_NACK, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx), T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti), + T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->current_harq_pid)); } - } // mode != PRACH - - // }// slot_tx is even - // else { // slot_tx is odd, do the PRACH here - - if ((phy_vars_ue->UE_mode[eNB_id] == PRACH) && (phy_vars_ue->lte_frame_parms.prach_config_common.prach_Config_enabled==1)) { - - // check if we have PRACH opportunity - if (is_prach_subframe(&phy_vars_ue->lte_frame_parms,frame_tx,subframe_tx)) { - phy_vars_ue->generate_prach=0; - - if (phy_vars_ue->mac_enabled==1){ - // ask L2 for RACH transport - if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) { - phy_vars_ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id, - CC_id, - frame_tx, - eNB_id, - subframe_tx); - // LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,phy_vars_ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon); - } - } - - if (phy_vars_ue->prach_resources[eNB_id]!=NULL) { - - phy_vars_ue->generate_prach=1; - phy_vars_ue->prach_cnt=0; -#ifdef SMBV - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; -#endif -#ifdef OAI_EMU - phy_vars_ue->prach_PreambleIndex=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex; #endif - if (abstraction_flag == 0) { - LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n", - Mod_id, - frame_tx, - subframe_tx, - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex, - phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER, - phy_vars_ue->prach_resources[eNB_id]->ra_TDD_map_index, - phy_vars_ue->prach_resources[eNB_id]->ra_RNTI); + generate_pucch1x(ue->common_vars.txdataF, + &ue->frame_parms, + ue->ncs_cell, + format, + &ue->pucch_config_dedicated[eNB_id], + pucch_resource, + isShortenPucch, // shortened format + pucch_payload, + tx_amp, + subframe_tx); + + } + break; - if ((phy_vars_ue->mac_enabled==1) && (mode != calib_prach_tx)) { - phy_vars_ue->tx_power_dBm = phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id); - } - else { - phy_vars_ue->tx_power_dBm = phy_vars_ue->tx_power_max_dBm; - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex = 19; - } - phy_vars_ue->tx_total_RE = 96; + case pucch_format2: + { + if (ue->mac_enabled == 1) { + Po_PUCCH = pucch_power_cntl(ue,proc,subframe_tx,eNB_id,format); + } + else { + Po_PUCCH = ue->tx_power_max_dBm; + } + ue->tx_power_dBm[subframe_tx] = Po_PUCCH; + ue->tx_total_RE[subframe_tx] = 12; #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = get_tx_amp(phy_vars_ue->tx_power_dBm, - phy_vars_ue->tx_power_max_dBm, - phy_vars_ue->lte_frame_parms.N_RB_UL, - 6); + tx_amp = get_tx_amp(Po_PUCCH, + ue->tx_power_max_dBm, + ue->frame_parms.N_RB_UL, + 1); #else - phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = AMP; + tx_amp = AMP; #endif - if ((mode == calib_prach_tx) && (((phy_vars_ue->frame_tx&0xfffe)%100)==0)) - LOG_D(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n",Mod_id,phy_vars_ue->frame_rx,phy_vars_ue->slot_tx>>1,phy_vars_ue->tx_power_dBm, - phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp); +#if T_TRACER + T(T_UE_PHY_PUCCH_TX_POWER, T_INT(eNB_id), T_INT(frame_tx%1024), T_INT(subframe_tx),T_INT(ue->tx_power_dBm[subframe_tx]), + T_INT(tx_amp),T_INT(ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->g_pucch),T_INT(get_PL(ue->Mod_id,ue->CC_id,eNB_id))); +#endif +#ifdef UE_DEBUG_TRACE + LOG_I(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2 (RI or CQI), Po_PUCCH %d, isShortenPucch %d, amp %d\n", + Mod_id, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti, + frame_tx%1024, subframe_tx, + Po_PUCCH, + isShortenPucch, + tx_amp); +#endif + generate_pucch2x(ue->common_vars.txdataF, + &ue->frame_parms, + ue->ncs_cell, + format, + &ue->pucch_config_dedicated[eNB_id], + pucch_resource, + pucch_payload, + len, // A + 0, // B2 not needed + tx_amp, + subframe_tx, + ue->pdcch_vars[ue->current_thread_id[proc->subframe_rx]][eNB_id]->crnti); + } + break; + + case pucch_format2a: + LOG_D(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2a (RI or CQI) Ack/Nack 1bit \n", + Mod_id, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti, + frame_tx%1024, subframe_tx); + break; + case pucch_format2b: + LOG_D(PHY,"[UE %d][RNTI %x] AbsSubFrame %d.%d Generating PUCCH 2b (RI or CQI) Ack/Nack 2bits\n", + Mod_id, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti, + frame_tx%1024, subframe_tx); + break; + default: + break; + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PUCCH,VCD_FUNCTION_OUT); + +} + +void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) { - // start_meas(&phy_vars_ue->tx_prach); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN); - prach_power = generate_prach(phy_vars_ue,eNB_id,subframe_tx,frame_tx); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT); - // stop_meas(&phy_vars_ue->tx_prach); - LOG_D(PHY,"[UE %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n", - Mod_id, - get_PL(Mod_id,CC_id,eNB_id), - phy_vars_ue->tx_power_dBm, - dB_fixed(prach_power), - phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp); - } else { - UE_transport_info[Mod_id][CC_id].cntl.prach_flag=1; - UE_transport_info[Mod_id][CC_id].cntl.prach_id=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex; - if (phy_vars_ue->mac_enabled==1){ - mac_xface->Msg1_transmitted(Mod_id, - CC_id, - frame_tx, - eNB_id); - } - } + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + //int32_t ulsch_start=0; + int subframe_tx = proc->subframe_tx; + int frame_tx = proc->frame_tx; + unsigned int aa; + uint8_t isSubframeSRS; - LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n", - Mod_id,frame_tx,subframe_tx,eNB_id, - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex, - phy_vars_ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id), - get_PL(Mod_id,CC_id,eNB_id)); + uint8_t next1_thread_id = ue->current_thread_id[proc->subframe_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[proc->subframe_rx]+1); + uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1); - } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN); - } - // if we're calibrating the PRACH kill the pointer to its resources so that the RA protocol doesn't continue - if (mode == calib_prach_tx) - phy_vars_ue->prach_resources[eNB_id]=NULL; + LOG_D(PHY,"****** start TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, subframe_tx); +#if T_TRACER + T(T_UE_PHY_UL_TICK, T_INT(ue->Mod_id), T_INT(frame_tx%1024), T_INT(subframe_tx)); +#endif - LOG_D(PHY,"[UE %d] frame %d subframe %d : generate_prach %d, prach_cnt %d\n", - Mod_id,frame_tx,subframe_tx,phy_vars_ue->generate_prach,phy_vars_ue->prach_cnt); + ue->generate_ul_signal[eNB_id] = 0; +#if UE_TIMING_TRACE + start_meas(&ue->phy_proc_tx); +#endif - phy_vars_ue->prach_cnt++; + ue->tx_power_dBm[subframe_tx]=-127; - if (phy_vars_ue->prach_cnt==3) - phy_vars_ue->generate_prach=0; - } // mode is PRACH - else { - phy_vars_ue->generate_prach=0; + + for (aa=0; aanb_antennas_tx; aa++) { + memset(&ue->common_vars.txdataF[aa][subframe_tx*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti], + 0, + frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*sizeof(int32_t)); + } + + + if (ue->UE_mode[eNB_id] != PRACH) { + // check cell srs subframe and ue srs subframe. This has an impact on pusch encoding + isSubframeSRS = is_srs_occasion_common(&ue->frame_parms,proc->frame_tx,proc->subframe_tx); + + ue_compute_srs_occasion(ue,proc,eNB_id,isSubframeSRS); + + ue_ulsch_uespec_procedures(ue,proc,eNB_id,abstraction_flag); + + } + + if (ue->UE_mode[eNB_id] == PUSCH) { + // check if we need to use PUCCH 1a/1b + ue_pucch_procedures(ue,proc,eNB_id,abstraction_flag); + // check if we need to use SRS + ue_srs_procedures(ue,proc,eNB_id,abstraction_flag); + } // UE_mode==PUSCH + + + + + + ulsch_common_procedures(ue,proc, (ue->generate_ul_signal[eNB_id] == 0)); + + if ((ue->UE_mode[eNB_id] == PRACH) && + (ue->frame_parms.prach_config_common.prach_Config_enabled==1)) { + + // check if we have PRACH opportunity + + if (is_prach_subframe(&ue->frame_parms,frame_tx,subframe_tx)) { + + ue_prach_procedures(ue,proc,eNB_id,abstraction_flag,mode); } - } // slot_tx is even + } // mode is PRACH + else { + ue->generate_prach=0; + } + + // reset DL ACK/NACK status + uint8_t N_bundled = 0; + if (ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0] != NULL) + { + reset_ack(&ue->frame_parms, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->harq_ack, + subframe_tx, + proc->subframe_rx, + ue->ulsch[eNB_id]->o_ACK, + &N_bundled, + 0); + reset_ack(&ue->frame_parms, + ue->dlsch[next1_thread_id][eNB_id][0]->harq_ack, + subframe_tx, + proc->subframe_rx, + ue->ulsch[eNB_id]->o_ACK, + &N_bundled, + 0); + reset_ack(&ue->frame_parms, + ue->dlsch[next2_thread_id][eNB_id][0]->harq_ack, + subframe_tx, + proc->subframe_rx, + ue->ulsch[eNB_id]->o_ACK, + &N_bundled, + 0); + } + + if (ue->dlsch_SI[eNB_id] != NULL) + reset_ack(&ue->frame_parms, + ue->dlsch_SI[eNB_id]->harq_ack, + subframe_tx, + proc->subframe_rx, + ue->ulsch[eNB_id]->o_ACK, + &N_bundled, + 0); + + + LOG_D(PHY,"****** end TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, subframe_tx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_tx); +#if UE_TIMING_TRACE + stop_meas(&ue->phy_proc_tx); +#endif } -void phy_procedures_UE_S_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type) +void phy_procedures_UE_S_TX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type) { int aa;//i,aa; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; - if (abstraction_flag==0) { - - for (aa=0; aanb_antennas_tx; aa++) { + + for (aa=0; aanb_antennas_tx; aa++) { #if defined(EXMIMO) //this is the EXPRESS MIMO case - int i; - // set the whole tx buffer to RX - for (i=0; isamples_per_tti; i++) - phy_vars_ue->lte_ue_common_vars.txdata[aa][i] = 0x00010001; - + int i; + // set the whole tx buffer to RX + for (i=0; isamples_per_tti; i++) + ue->common_vars.txdata[aa][i] = 0x00010001; + #else //this is the normal case - memset(&phy_vars_ue->lte_ue_common_vars.txdata[aa][0],0, - (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti)*sizeof(int32_t)); + memset(&ue->common_vars.txdata[aa][0],0, + (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti)*sizeof(int32_t)); #endif //else EXMIMO - - } + } + } -void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode) +void ue_measurement_procedures( + uint16_t l, // symbol index of each slot [0..6] + PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uint8_t eNB_id, + uint16_t slot, // slot index of each radio frame [0..19] + uint8_t abstraction_flag,runmode_t mode) { - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_ue->lte_frame_parms; - // int aa; -#if defined(EXMIMO) && defined(DRIVER2013) - // exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr; - // int aa; -#endif + //LOG_I(PHY,"ue_measurement_procedures l %d Ncp %d\n",l,ue->frame_parms.Ncp); - int slot_rx = phy_vars_ue->slot_rx; - int subframe_rx = slot_rx>>1; + LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; + + int subframe_rx = proc->subframe_rx; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_IN); if (l==0) { // UE measurements on symbol 0 - if (abstraction_flag==0) { - LOG_D(PHY,"Calling measurements subframe %d, rxdata %p\n",subframe_rx,phy_vars_ue->lte_ue_common_vars.rxdata); - lte_ue_measurements(phy_vars_ue, - (subframe_rx*frame_parms->samples_per_tti+phy_vars_ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME), - (slot_rx == 2) ? 1 : 0, - 0); - } else { - lte_ue_measurements(phy_vars_ue, - 0, - 0, - 1); - } + LOG_D(PHY,"Calling measurements subframe %d, rxdata %p\n",subframe_rx,ue->common_vars.rxdata); + LOG_D(PHY,"Calling measurements subframe %d, rxdata %p\n",subframe_rx,ue->common_vars.rxdata); + + lte_ue_measurements(ue, + (subframe_rx*frame_parms->samples_per_tti+ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME), + (subframe_rx == 1) ? 1 : 0, + 0, + 0, + subframe_rx); + +#if T_TRACER + if(slot == 0) + T(T_UE_PHY_MEAS, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(proc->subframe_rx), + T_INT((int)(10*log10(ue->measurements.rsrp[0])-ue->rx_total_gain_dB)), + T_INT((int)ue->measurements.rx_rssi_dBm[0]), + T_INT((int)(ue->measurements.rx_power_avg_dB[0] - ue->measurements.n0_power_avg_dB)), + T_INT((int)ue->measurements.rx_power_avg_dB[0]), + T_INT((int)ue->measurements.n0_power_avg_dB), + T_INT((int)ue->measurements.wideband_cqi_avg[0]), + T_INT((int)ue->common_vars.freq_offset)); +#endif } - if (l==(6-phy_vars_ue->lte_frame_parms.Ncp)) { - - // make sure we have signal from PSS/SSS for N0 measurement + if (l==(6-ue->frame_parms.Ncp)) { + + // make sure we have signal from PSS/SSS for N0 measurement + // LOG_I(PHY," l==(6-ue->frame_parms.Ncp) ue_rrc_measurements\n"); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_IN); - ue_rrc_measurements(phy_vars_ue, - slot_rx, - abstraction_flag); + ue_rrc_measurements(ue, + slot, + abstraction_flag); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_OUT); - if (abstraction_flag==1) - phy_vars_ue->sinr_eff = sinr_eff_cqi_calc(phy_vars_ue, 0); - } - if ((slot_rx==1) && (l==(4-frame_parms->Ncp))) { + // accumulate and filter timing offset estimation every subframe (instead of every frame) + if (( (slot%2) == 0) && (l==(4-frame_parms->Ncp))) { // AGC VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_IN); -#if defined EXMIMO - if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) && - (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) ) - if (phy_vars_ue->frame_rx%100==0) - gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); - -#else #ifndef OAI_USRP #ifndef OAI_BLADERF #ifndef OAI_LMSSDR - phy_adjust_gain (phy_vars_ue,dB_fixed(phy_vars_ue->PHY_measurements.rssi),0); -#endif + phy_adjust_gain (ue,dB_fixed(ue->measurements.rssi),0); #endif #endif #endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN); + eNB_id = 0; - if (abstraction_flag == 0) - lte_adjust_synch(&phy_vars_ue->lte_frame_parms, - phy_vars_ue, - eNB_id, - 0, - 16384); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT); - - /* if (openair_daq_vars.auto_freq_correction == 1) { - if (frame_rx % 100 == 0) { - if ((phy_vars_ue->lte_ue_common_vars.freq_offset>100) && (openair_daq_vars.freq_offset < 1000)) { - openair_daq_vars.freq_offset+=100; - #if defined(EXMIMO) && defined(DRIVER2013) - for (aa = 0; aa<4; aa++) { - p_exmimo_config->rf.rf_freq_rx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - p_exmimo_config->rf.rf_freq_tx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - } - #endif - } - else if ((phy_vars_ue->lte_ue_common_vars.freq_offset<-100) && (openair_daq_vars.freq_offset > -1000)) { - openair_daq_vars.freq_offset-=100; - #if defined(EXMIMO) && defined(DRIVER2013) - for (aa = 0; aa<4; aa++) { - p_exmimo_config->rf.rf_freq_rx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - p_exmimo_config->rf.rf_freq_tx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset; - } - #endif - } - } - }*/ - + + if (ue->no_timing_correction==0) + lte_adjust_synch(&ue->frame_parms, + ue, + eNB_id, + subframe_rx, + 0, + 16384); + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_OUT); } -#ifdef EMOS -void phy_procedures_emos_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_t eNB_id) -{ - - uint8_t i,j; - //uint16_t last_slot_emos; - uint32_t bytes; - int Mod_id = phy_vars_ue->Mod_id; - - /* - if (last_slot<2) - last_slot_emos = last_slot; - else if (last_slot>9) - last_slot_emos = last_slot - 8; - else { - LOG_E(PHY,"emos rx last_slot_emos %d, last_slot %d\n", last_slot_emos,last_slot); - mac_xface->macphy_exit("should never happen"); - } - */ - -#ifdef EMOS_CHANNEL - - if ((last_slot==10) || (last_slot==11)) { - for (i=0; ilte_frame_parms.nb_antennas_rx; i++) - for (j=0; jlte_frame_parms.nb_antennas_tx; j++) { - // first OFDM symbol with pilots - memcpy(&emos_dump_UE.channel[i][j][(last_slot%2)*2*phy_vars_ue->lte_frame_parms.ofdm_symbol_size], - &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][0], - phy_vars_ue->lte_frame_parms.ofdm_symbol_size*sizeof(int)); - // second OFDM symbol with pilots - memcpy(&emos_dump_UE.channel[i][j][((last_slot%2)*2+1)*phy_vars_ue->lte_frame_parms.ofdm_symbol_size], - &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][(phy_vars_ue->lte_frame_parms.Ncp == 0 ? 4 : 3)*phy_vars_ue->lte_frame_parms.ofdm_symbol_size], - phy_vars_ue->lte_frame_parms.ofdm_symbol_size*sizeof(int)); - } - } - -#endif - - if (last_slot==0) { - emos_dump_UE.timestamp = rt_get_time_ns(); - emos_dump_UE.frame_rx = phy_vars_ue->frame_rx; - emos_dump_UE.UE_mode = phy_vars_ue->UE_mode[eNB_id]; - emos_dump_UE.mimo_mode = phy_vars_ue->transmission_mode[eNB_id]; - emos_dump_UE.freq_offset = phy_vars_ue->lte_ue_common_vars.freq_offset; - emos_dump_UE.timing_advance = phy_vars_ue->timing_advance; - emos_dump_UE.timing_offset = phy_vars_ue->rx_offset; - emos_dump_UE.rx_total_gain_dB = phy_vars_ue->rx_total_gain_dB; - emos_dump_UE.eNb_id = eNB_id; - memcpy(&emos_dump_UE.PHY_measurements,&phy_vars_ue->PHY_measurements,sizeof(PHY_MEASUREMENTS)); - } - - if (last_slot==1) { - emos_dump_UE.pbch_errors = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors; - emos_dump_UE.pbch_errors_last = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_last; - emos_dump_UE.pbch_errors_conseq = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq; - emos_dump_UE.pbch_fer = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_fer; - } - - if (last_slot==19) { - emos_dump_UE.dlsch_errors = phy_vars_ue->dlsch_errors[eNB_id]; - emos_dump_UE.dlsch_errors_last = phy_vars_ue->dlsch_errors_last[eNB_id]; - emos_dump_UE.dlsch_received = phy_vars_ue->dlsch_received[eNB_id]; - emos_dump_UE.dlsch_received_last = phy_vars_ue->dlsch_received_last[eNB_id]; - emos_dump_UE.dlsch_fer = phy_vars_ue->dlsch_fer[eNB_id]; - emos_dump_UE.dlsch_cntl_errors = phy_vars_ue->dlsch_SI_errors[eNB_id]; - emos_dump_UE.dlsch_ra_errors = phy_vars_ue->dlsch_ra_errors[eNB_id]; - emos_dump_UE.total_TBS = phy_vars_ue->total_TBS[eNB_id]; - emos_dump_UE.total_TBS_last = phy_vars_ue->total_TBS_last[eNB_id]; - emos_dump_UE.bitrate = phy_vars_ue->bitrate[eNB_id]; - emos_dump_UE.total_received_bits = phy_vars_ue->total_received_bits[eNB_id]; - emos_dump_UE.pmi_saved = phy_vars_ue->dlsch_ue[eNB_id][0]->pmi_alloc; - emos_dump_UE.mcs = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs; - emos_dump_UE.use_ia_receiver = openair_daq_vars.use_ia_receiver; - - bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_UE, sizeof(fifo_dump_emos_UE)); - - if (bytes!=sizeof(fifo_dump_emos_UE)) { - LOG_W(PHY,"[UE %d] frame %d, slot %d, Problem writing EMOS data to FIFO\n",Mod_id,phy_vars_ue->frame_rx, last_slot); - } else { - if (phy_vars_ue->frame_rx%100==0) { - LOG_I(PHY,"[UE %d] frame %d, slot %d, Writing %d bytes EMOS data to FIFO\n",Mod_id,phy_vars_ue->frame_rx, last_slot, bytes); - } - } - } - -} -#endif -void restart_phy(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag) -{ - - // uint8_t last_slot; - uint8_t i; - LOG_I(PHY,"[UE %d] frame %d, slot %d, restarting PHY!\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx,phy_vars_ue->slot_rx); - mac_xface->macphy_exit("restart_phy called"); - // first_run = 1; - - if (abstraction_flag ==0 ) { - openair_daq_vars.mode = openair_NOT_SYNCHED; - phy_vars_ue->UE_mode[eNB_id] = NOT_SYNCHED; - openair_daq_vars.sync_state=0; - } else { - phy_vars_ue->UE_mode[eNB_id] = PRACH; - phy_vars_ue->prach_resources[eNB_id]=NULL; - } - - phy_vars_ue->frame_rx = -1; - phy_vars_ue->frame_tx = -1; - openair_daq_vars.synch_wait_cnt=0; - openair_daq_vars.sched_cnt=-1; - - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq=0; - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors=0; - - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors = 0; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_missed = 0; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false = 0; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_received = 0; - - phy_vars_ue->dlsch_errors[eNB_id] = 0; - phy_vars_ue->dlsch_errors_last[eNB_id] = 0; - phy_vars_ue->dlsch_received[eNB_id] = 0; - phy_vars_ue->dlsch_received_last[eNB_id] = 0; - phy_vars_ue->dlsch_fer[eNB_id] = 0; - phy_vars_ue->dlsch_SI_received[eNB_id] = 0; - phy_vars_ue->dlsch_ra_received[eNB_id] = 0; - phy_vars_ue->dlsch_SI_errors[eNB_id] = 0; - phy_vars_ue->dlsch_ra_errors[eNB_id] = 0; - - phy_vars_ue->dlsch_mch_received[eNB_id] = 0; - - for (i=0; i < MAX_MBSFN_AREA ; i ++) { - phy_vars_ue->dlsch_mch_received_sf[i][eNB_id] = 0; - phy_vars_ue->dlsch_mcch_received[i][eNB_id] = 0; - phy_vars_ue->dlsch_mtch_received[i][eNB_id] = 0; - phy_vars_ue->dlsch_mcch_errors[i][eNB_id] = 0; - phy_vars_ue->dlsch_mtch_errors[i][eNB_id] = 0; - phy_vars_ue->dlsch_mcch_trials[i][eNB_id] = 0; - phy_vars_ue->dlsch_mtch_trials[i][eNB_id] = 0; - } - - //phy_vars_ue->total_TBS[eNB_id] = 0; - //phy_vars_ue->total_TBS_last[eNB_id] = 0; - //phy_vars_ue->bitrate[eNB_id] = 0; - //phy_vars_ue->total_received_bits[eNB_id] = 0; -} - - -void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abstraction_flag) +void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uint8_t abstraction_flag) { // int i; @@ -1741,9 +2560,10 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst static uint8_t first_run = 1; uint8_t pbch_trials = 0; - DevAssert(phy_vars_ue); - int slot_rx = phy_vars_ue->slot_rx; - int frame_rx = phy_vars_ue->frame_rx; + DevAssert(ue); + + int frame_rx = proc->frame_rx; + int subframe_rx = proc->subframe_rx; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_IN); @@ -1754,29 +2574,16 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst for (pbch_trials=0; pbch_trials<4; pbch_trials++) { //for (pbch_phase=0;pbch_phase<4;pbch_phase++) { - //LOG_I(PHY,"[UE %d] Frame %d, Trying PBCH %d (NidCell %d, eNB_id %d)\n",phy_vars_ue->Mod_id,frame_rx,pbch_phase,phy_vars_ue->lte_frame_parms.Nid_cell,eNB_id); - if (abstraction_flag == 0) { - pbch_tx_ant = rx_pbch(&phy_vars_ue->lte_ue_common_vars, - phy_vars_ue->lte_ue_pbch_vars[eNB_id], - &phy_vars_ue->lte_frame_parms, - eNB_id, - phy_vars_ue->lte_frame_parms.mode1_flag==1?SISO:ALAMOUTI, - phy_vars_ue->high_speed_flag, - pbch_phase); - - - - } - -#ifdef PHY_ABSTRACTION - else { - pbch_tx_ant = rx_pbch_emul(phy_vars_ue, - eNB_id, - pbch_phase); - } - -#endif + //LOG_I(PHY,"[UE %d] Frame %d, Trying PBCH %d (NidCell %d, eNB_id %d)\n",ue->Mod_id,frame_rx,pbch_phase,ue->frame_parms.Nid_cell,eNB_id); + pbch_tx_ant = rx_pbch(&ue->common_vars, + ue->pbch_vars[eNB_id], + &ue->frame_parms, + eNB_id, + ue->frame_parms.nb_antenna_ports_eNB==1?SISO:ALAMOUTI, + ue->high_speed_flag, + pbch_phase); + if ((pbch_tx_ant>0) && (pbch_tx_ant<=4)) { break; } @@ -1791,6 +2598,17 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst if ((pbch_tx_ant>0) && (pbch_tx_ant<=4)) { + if (opt_enabled) { + static uint8_t dummy[3]; + dummy[0] = ue->pbch_vars[eNB_id]->decoded_output[2]; + dummy[1] = ue->pbch_vars[eNB_id]->decoded_output[1]; + dummy[2] = ue->pbch_vars[eNB_id]->decoded_output[0]; + trace_pdu(1, dummy, 3, ue->Mod_id, 0, 0, + frame_rx, subframe_rx, 0, 0); + LOG_D(OPT,"[UE %d][PBCH] Frame %d trace pdu for PBCH\n", + ue->Mod_id, subframe_rx); + } + if (pbch_tx_ant>2) { LOG_W(PHY,"[openair][SCHED][SYNCH] PBCH decoding: pbch_tx_ant>2 not supported\n"); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_OUT); @@ -1798,1642 +2616,2510 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst } - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq = 0; - frame_tx = (((int)(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[2]&0x03))<<8); - frame_tx += ((int)(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1]&0xfc)); + ue->pbch_vars[eNB_id]->pdu_errors_conseq = 0; + frame_tx = (((int)(ue->pbch_vars[eNB_id]->decoded_output[2]&0x03))<<8); + frame_tx += ((int)(ue->pbch_vars[eNB_id]->decoded_output[1]&0xfc)); frame_tx += pbch_phase; - if (phy_vars_ue->mac_enabled==1) { - mac_xface->dl_phy_sync_success(phy_vars_ue->Mod_id,frame_rx,eNB_id, - phy_vars_ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0); + if (ue->mac_enabled==1) { + + dl_phy_sync_success(ue->Mod_id,frame_rx,eNB_id, + ue->UE_mode[eNB_id]==NOT_SYNCHED ? 1 : 0); } - -#ifdef EMOS - //emos_dump_UE.frame_tx = frame_tx; - //emos_dump_UE.mimo_mode = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output[1]; -#endif if (first_run) { first_run = 0; - LOG_I(PHY,"[UE %d] frame %d, slot %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d).\n", - phy_vars_ue->Mod_id, - frame_rx, - slot_rx, - pbch_tx_ant, - frame_tx, - pbch_phase); - phy_vars_ue->frame_rx = (phy_vars_ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); - phy_vars_ue->frame_tx = phy_vars_ue->frame_rx; - frame_rx = phy_vars_ue->frame_rx; - } else if (((frame_tx & 0x03FF) != (phy_vars_ue->frame_rx & 0x03FF))) { - //(pbch_tx_ant != phy_vars_ue->lte_frame_parms.nb_antennas_tx)) { - LOG_D(PHY,"[UE %d] frame %d, slot %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%1024=%d, phase %d).\n", - phy_vars_ue->Mod_id, - phy_vars_ue->frame_rx, - slot_rx, - pbch_tx_ant, - frame_tx, - frame_rx & 0x03FF, - pbch_phase); - phy_vars_ue->frame_rx = (phy_vars_ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); - phy_vars_ue->frame_tx = phy_vars_ue->frame_rx; - frame_rx = phy_vars_ue->frame_rx; - /* - LOG_D(PHY,"[UE %d] frame %d, slot %d: PBCH PDU does not match, ignoring it (PBCH ant_tx=%d, frame_tx=%d).\n", - phy_vars_ue->Mod_id, - phy_vars_ue->frame, - slot_rx, - pbch_tx_ant, - frame_tx); - */ - //phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq = 21; // this will make it go out of sync - //phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq += 1; // this will make it go out of sync + proc->frame_rx = (proc->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); + proc->frame_tx = proc->frame_rx; + + for(int th_id=0; th_idproc.proc_rxtx[th_id].frame_rx = proc->frame_rx; + ue->proc.proc_rxtx[th_id].frame_tx = proc->frame_tx; + + printf("[UE %d] frame %d, subframe %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d, rx_offset %d) => new frame %d\n", + ue->Mod_id, + ue->proc.proc_rxtx[th_id].frame_rx, + subframe_rx, + pbch_tx_ant, + frame_tx, + pbch_phase, + ue->rx_offset, + proc->frame_rx); + } + + + frame_rx = proc->frame_rx; + + } else if (((frame_tx & 0x03FF) != (proc->frame_rx & 0x03FF))) { + //(pbch_tx_ant != ue->frame_parms.nb_antennas_tx)) { + LOG_D(PHY,"[UE %d] frame %d, subframe %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%%1024=%d, phase %d).\n", + ue->Mod_id, + proc->frame_rx, + subframe_rx, + pbch_tx_ant, + frame_tx, + frame_rx & 0x03FF, + pbch_phase); + + + proc->frame_rx = (proc->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); + proc->frame_tx = proc->frame_rx; + frame_rx = proc->frame_rx; + + for(int th_id=0; th_idproc.proc_rxtx[th_id].frame_rx = (proc->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF); + ue->proc.proc_rxtx[th_id].frame_tx = proc->frame_rx; + } + } #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] frame %d, slot %d, Received PBCH (MIB): mode1_flag %d, tx_ant %d, frame_tx %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6!\n", - phy_vars_ue->Mod_id, - frame_rx, - slot_rx, - phy_vars_ue->lte_frame_parms.mode1_flag, - pbch_tx_ant, - frame_tx, - phy_vars_ue->lte_frame_parms.N_RB_DL, - phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration, - phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource); - /* - if (frame_rx%100 == 0) { - LOG_I(PHY,"[UE %d] frame %d, slot %d, PBCH: mode1_flag %d, tx_ant %d, frame_tx %d, phase %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6,Frequency offset %d Hz (%d)\n", - phy_vars_ue->Mod_id, - frame_rx, - slot_rx, - phy_vars_ue->lte_frame_parms.mode1_flag, - pbch_tx_ant, - frame_tx, - pbch_phase, - phy_vars_ue->lte_frame_parms.N_RB_DL, - phy_vars_ue->lte_frame_parms.phich_config_common.phich_duration, - phy_vars_ue->lte_frame_parms.phich_config_common.phich_resource, - phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset); - //dump_frame_parms(&phy_vars_ue->lte_frame_parms); - } - */ + LOG_D(PHY,"[UE %d] frame %d, subframe %d, Received PBCH (MIB): nb_antenna_ports_eNB %d, tx_ant %d, frame_tx %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6!\n", + ue->Mod_id, + frame_rx, + subframe_rx, + ue->frame_parms.nb_antenna_ports_eNB, + pbch_tx_ant, + frame_tx, + ue->frame_parms.N_RB_DL, + ue->frame_parms.phich_config_common.phich_duration, + ue->frame_parms.phich_config_common.phich_resource); #endif - } else { - LOG_E(PHY,"[UE %d] frame %d, slot %d, Error decoding PBCH!\n", - phy_vars_ue->Mod_id,frame_rx, slot_rx); - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq++; - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors++; - if (phy_vars_ue->mac_enabled == 1) { - mac_xface->out_of_sync_ind(phy_vars_ue->Mod_id,frame_rx,eNB_id); - } - else{ - if (phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq>=100) { - LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n"); - mac_xface->macphy_exit("More that 100 consecutive PBCH errors!"); - } - } + } else { + + /* + LOG_E(PHY,"[UE %d] frame %d, subframe %d, Error decoding PBCH!\n", + ue->Mod_id,frame_rx, subframe_rx); + + LOG_I(PHY,"[UE %d] rx_offset %d\n",ue->Mod_id,ue->rx_offset); + + + write_output("rxsig0.m","rxs0", ue->common_vars.rxdata[0],ue->frame_parms.samples_per_tti,1,1); + + write_output("H00.m","h00",&(ue->common_vars.dl_ch_estimates[0][0][0]),((ue->frame_parms.Ncp==0)?7:6)*(ue->frame_parms.ofdm_symbol_size),1,1); + write_output("H10.m","h10",&(ue->common_vars.dl_ch_estimates[0][2][0]),((ue->frame_parms.Ncp==0)?7:6)*(ue->frame_parms.ofdm_symbol_size),1,1); + + write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],8*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("PBCH_rxF0_ext.m","pbch0_ext",ue->pbch_vars[0]->rxdataF_ext[0],12*4*6,1,1); + write_output("PBCH_rxF0_comp.m","pbch0_comp",ue->pbch_vars[0]->rxdataF_comp[0],12*4*6,1,1); + write_output("PBCH_rxF_llr.m","pbch_llr",ue->pbch_vars[0]->llr,(ue->frame_parms.Ncp==0) ? 1920 : 1728,1,4); + exit(-1); + */ + + ue->pbch_vars[eNB_id]->pdu_errors_conseq++; + ue->pbch_vars[eNB_id]->pdu_errors++; + + if (ue->mac_enabled == 1) rrc_out_of_sync_ind(ue->Mod_id,frame_rx,eNB_id); + else AssertFatal(ue->pbch_vars[eNB_id]->pdu_errors_conseq<100, + "More that 100 consecutive PBCH errors! Exiting!\n"); } + if (frame_rx % 100 == 0) { - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_fer = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_last; - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_last = phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors; + ue->pbch_vars[eNB_id]->pdu_fer = ue->pbch_vars[eNB_id]->pdu_errors - ue->pbch_vars[eNB_id]->pdu_errors_last; + ue->pbch_vars[eNB_id]->pdu_errors_last = ue->pbch_vars[eNB_id]->pdu_errors; } #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] frame %d, slot %d, PBCH errors = %d, consecutive errors = %d!\n", - phy_vars_ue->Mod_id,frame_rx, slot_rx, - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors, - phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq); + ue->Mod_id,frame_rx, subframe_rx, + ue->pbch_vars[eNB_id]->pdu_errors, + ue->pbch_vars[eNB_id]->pdu_errors_conseq); #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_OUT); } -int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abstraction_flag) +int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t abstraction_flag) { unsigned int dci_cnt=0, i; - //DCI_PDU *DCI_pdu; - //uint16_t ra_RNTI; + int frame_rx = proc->frame_rx; + int subframe_rx = proc->subframe_rx; + DCI_ALLOC_t dci_alloc_rx[8]; - int frame_rx = phy_vars_ue->frame_rx; - int slot_rx = phy_vars_ue->slot_rx; - int subframe_rx = slot_rx>>1; - - -#ifdef PHY_ABSTRACTION - int CC_id; - int UE_id; - uint8_t harq_pid; -#endif + uint8_t next1_thread_id = ue->current_thread_id[subframe_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[subframe_rx]+1); + uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_IN); - - // if (subframe_rx != 5) - // return 0; - if (abstraction_flag == 0) { - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN); - rx_pdcch(&phy_vars_ue->lte_ue_common_vars, - phy_vars_ue->lte_ue_pdcch_vars, - &phy_vars_ue->lte_frame_parms, - subframe_rx, - eNB_id, - (phy_vars_ue->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, - phy_vars_ue->high_speed_flag, - phy_vars_ue->is_secondary_ue); - - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_IN); - dci_cnt = dci_decoding_procedure(phy_vars_ue, - dci_alloc_rx, - (phy_vars_ue->UE_mode[eNB_id] < PUSCH)? 1 : 0, // if we're in PUSCH don't listen to common search space, - // later when we need paging or RA during connection, update this ... - eNB_id,subframe_rx); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_OUT); - //LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d PHICH RX\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx); - - if (is_phich_subframe(&phy_vars_ue->lte_frame_parms,subframe_rx)) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_IN); - rx_phich(phy_vars_ue, - subframe_rx,eNB_id); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_OUT); - } - } - -#ifdef PHY_ABSTRACTION - else { - for (i=0; ilte_frame_parms.Nid_cell == phy_vars_ue->lte_frame_parms.Nid_cell) - break; - - if (CC_id < MAX_NUM_CCs) - break; - } - - if (i==NB_eNB_INST) { - LOG_E(PHY,"[UE %d] phy_procedures_lte_ue.c: FATAL : Could not find attached eNB for DCI emulation (Nid_cell %d)!!!!\n",phy_vars_ue->Mod_id,phy_vars_ue->lte_frame_parms.Nid_cell); - mac_xface->macphy_exit("Could not find attached eNB for DCI emulation"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); - } - - LOG_D(PHY,"Calling dci_decoding_proc_emul ...\n"); - dci_cnt = dci_decoding_procedure_emul(phy_vars_ue->lte_ue_pdcch_vars, - PHY_vars_eNB_g[i][CC_id]->num_ue_spec_dci[subframe_rx&1], - PHY_vars_eNB_g[i][CC_id]->num_common_dci[subframe_rx&1], - PHY_vars_eNB_g[i][CC_id]->dci_alloc[subframe_rx&1], - dci_alloc_rx, - eNB_id); - // printf("DCI: dci_cnt %d\n",dci_cnt); - UE_id = (uint32_t)find_ue((int16_t)phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,PHY_vars_eNB_g[i][CC_id]); - - if (UE_id>=0) { - // msg("Checking PHICH for UE %d (eNB %d)\n",UE_id,i); - if (is_phich_subframe(&phy_vars_ue->lte_frame_parms,subframe_rx)) { - harq_pid = phich_subframe_to_harq_pid(&phy_vars_ue->lte_frame_parms,frame_rx,subframe_rx); - - if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status == ACTIVE) { - // phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->phich_ACK=1; - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0; - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status = IDLE; - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0; - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round = 0; - LOG_D(PHY,"Msg3 inactive\n"); - /* Phich is not abstracted for the moment - if (PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->phich_ACK==0) { // NAK - if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) { - #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Msg3 PHICH, received NAK\n", - phy_vars_ue->Mod_id, - frame_rx, - subframe_rx); - #endif - get_Msg3_alloc_ret(&phy_vars_ue->lte_frame_parms, - subframe_rx, - frame_rx, - &phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id], - &phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]); - } - // PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - // PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Ndi = 0; - // PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++; - } - else { - #ifdef DEBUG_PHY_PROC - if (phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) - LOG_D(PHY,"[UE %d][RAPROC] Frame %d, subframe %d: Msg3 PHICH, received ACK\n", - phy_vars_ue->Mod_id, - frame_rx, - subframe_rx); - #endif - PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0; - PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status = IDLE; - // inform MAC? - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0; - } //phich_ACK */ - } // harq_pid is ACTIVE - } // This is a PHICH subframe - } // UE_id exists - } - +#if UE_TIMING_TRACE + start_meas(&ue->dlsch_rx_pdcch_stats); #endif - //#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d, Mode %s: DCI found %i\n",phy_vars_ue->Mod_id,frame_rx,slot_rx,mode_string[phy_vars_ue->UE_mode[eNB_id]],dci_cnt); - //#endif - - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_received += dci_cnt; - /* - #ifdef DEBUG_PHY_PROC - if (slot_rx==18) - debug_LOG_D(PHY,"[UE %d] Frame %d, slot %d: PDCCH: DCI errors %d, DCI received %d, DCI missed %d, DCI False Detection %d \n", - phy_vars_ue->Mod_id,frame_rx,slot_rx, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_received, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_missed, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false); - #endif - */ -#ifdef EMOS - //emos_dump_UE.dci_cnt[subframe_rx] = dci_cnt; -#endif - - /* - #ifdef DIAG_PHY - //if (phy_vars_ue->UE_mode[eNB_id] == PUSCH) - if (dci_cnt > 1) { - LOG_D(PHY,"[UE %d][DIAG] frame %d, subframe %d: received %d>1 DCI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_cnt); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN); + rx_pdcch(ue, + proc->frame_rx, + subframe_rx, + eNB_id, + ue->frame_parms.nb_antenna_ports_eNB==1?SISO:ALAMOUTI, + ue->high_speed_flag, + ue->is_secondary_ue); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_IN); + + + //printf("Decode SIB frame param agregation + DCI %d %d \n",agregationLevel,dciFormat); + + //agregation level == FF means no configuration on + if(ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->agregationLevel == 0xFF || ue->decode_SIB) + { + // search all possible dcis + dci_cnt = dci_decoding_procedure(ue, + dci_alloc_rx, + (ue->UE_mode[eNB_id] < PUSCH)? 1 : 0, // if we're in PUSCH don't listen to common search space, + // later when we need paging or RA during connection, update this ... + eNB_id,subframe_rx); } - else if (dci_cnt==0) { - LOG_D(PHY,"[UE %d][DIAG] frame %d, subframe %d: received %d DCI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_cnt); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_missed++; + else + { + // search only preconfigured dcis + // search C RNTI dci + dci_cnt = dci_CRNTI_decoding_procedure(ue, + dci_alloc_rx, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->dciFormat, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->agregationLevel, + eNB_id, + subframe_rx); } - #endif - */ + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_OUT); + //LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d PHICH RX\n",ue->Mod_id,frame_rx,subframe_rx); + + if (is_phich_subframe(&ue->frame_parms,subframe_rx)) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_IN); + rx_phich(ue,proc, + subframe_rx,eNB_id); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_OUT); + } + + uint8_t *nCCE_current = &ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->nCCE[subframe_rx]; + uint8_t *nCCE_dest = &ue->pdcch_vars[next1_thread_id][eNB_id]->nCCE[subframe_rx]; + uint8_t *nCCE_dest1 = &ue->pdcch_vars[next2_thread_id][eNB_id]->nCCE[subframe_rx]; + memcpy(nCCE_dest, nCCE_current, sizeof(uint8_t)); + memcpy(nCCE_dest1, nCCE_current, sizeof(uint8_t)); + + LOG_D(PHY,"current_thread %d next1_thread %d next2_thread %d \n", ue->current_thread_id[subframe_rx], next1_thread_id, next2_thread_id); + + LOG_D(PHY,"[UE %d] AbsSubFrame %d.%d, Mode %s: DCI found %i --> rnti %x / crnti %x : format %d\n", + ue->Mod_id,frame_rx%1024,subframe_rx,mode_string[ue->UE_mode[eNB_id]], + dci_cnt, + dci_alloc_rx[0].rnti, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti, + dci_alloc_rx[0].format ); + + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->dci_received += dci_cnt; - // dci_cnt = 0; - // ra_RNTI = (phy_vars_ue->prach_resources[eNB_id]) ? phy_vars_ue->prach_resources[eNB_id]->ra_RNTI : 0; for (i=0; ilte_ue_pdcch_vars[eNB_id]->crnti,i,dci_cnt); - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - } -#endif - - //if ((phy_vars_ue->UE_mode[eNB_id] != PRACH) && - // (dci_alloc_rx[i].rnti != 0x1234) && - - if ((phy_vars_ue->UE_mode[eNB_id]>PRACH) && - (dci_alloc_rx[i].rnti == phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti) && + if ((ue->UE_mode[eNB_id]>PRACH) && + (dci_alloc_rx[i].rnti == ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti) && (dci_alloc_rx[i].format != format0)) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][DCI][PDSCH %x] frame %d, subframe %d: format %d, num_pdcch_symbols %d, nCCE %d, total CCEs %d\n", - phy_vars_ue->Mod_id,dci_alloc_rx[i].rnti, - frame_rx,subframe_rx, - dci_alloc_rx[i].format, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[subframe_rx], - get_nCCE(3,&phy_vars_ue->lte_frame_parms,get_mi(&phy_vars_ue->lte_frame_parms,0))); - - -#endif -#ifdef DIAG_PHY + LOG_D(PHY,"[UE %d][DCI][PDSCH %x] AbsSubframe %d.%d: format %d, num_pdcch_symbols %d, nCCE %d, total CCEs %d\n", + ue->Mod_id,dci_alloc_rx[i].rnti, + frame_rx%1024,subframe_rx, + dci_alloc_rx[i].format, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->nCCE[subframe_rx], + get_nCCE(3,&ue->frame_parms,get_mi(&ue->frame_parms,0))); - if (!(((subframe_rx == 7) && (dci_alloc_rx[i].format == format1E_2A_M10PRB)) || - ((subframe_rx == 7) && (dci_alloc_rx[i].format == format1)))) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format %d!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); - } + //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); -#endif - - // dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - if ((phy_vars_ue->UE_mode[eNB_id] > PRACH) && + if ((ue->UE_mode[eNB_id] > PRACH) && (generate_ue_dlsch_params_from_dci(frame_rx, subframe_rx, (void *)&dci_alloc_rx[i].dci_pdu, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti, dci_alloc_rx[i].format, - phy_vars_ue->dlsch_ue[eNB_id], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->pdsch_config_dedicated, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id], + ue->pdsch_vars[ue->current_thread_id[subframe_rx]][eNB_id], + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id], + &ue->frame_parms, + ue->pdsch_config_dedicated, SI_RNTI, 0, - P_RNTI)==0)) { - -#ifdef DIAG_PHY + P_RNTI, + ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], + ue->pdcch_vars[0%RX_NB_TH][eNB_id]->crnti_is_temporary? ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti: 0)==0)) { - if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs != (((frame_rx%1024)%28))) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: wrong mcs!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs); - dump_dci(&phy_vars_ue->lte_frame_parms,(void *)&dci_alloc_rx[i]); - } + // update TPC for PUCCH + if((dci_alloc_rx[i].format == format1) || + (dci_alloc_rx[i].format == format1A) || + (dci_alloc_rx[i].format == format1B) || + (dci_alloc_rx[i].format == format2) || + (dci_alloc_rx[i].format == format2A) || + (dci_alloc_rx[i].format == format2B)) + { + //ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->g_pucch += ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->harq_processes[ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->current_harq_pid]->delta_PUCCH; + int32_t delta_pucch = ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->harq_processes[ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->current_harq_pid]->delta_PUCCH; + for(int th_id=0; th_iddlsch[th_id][eNB_id][0]->g_pucch += delta_pucch; + } + LOG_D(PHY,"update TPC for PUCCH %d.%d / pid %d delta_PUCCH %d g_pucch %d %d \n",frame_rx, subframe_rx,ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->current_harq_pid, + delta_pucch, + ue->dlsch[0][eNB_id][0]->g_pucch, + ue->dlsch[1][eNB_id][0]->g_pucch + //ue->dlsch[2][eNB_id][0]->g_pucch + ); + } -#endif - - - phy_vars_ue->dlsch_received[eNB_id]++; + ue->dlsch_received[eNB_id]++; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",phy_vars_ue->Mod_id,dci_alloc_rx[i].format); - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d (%d)=> %d\n",phy_vars_ue->Mod_id,subframe_rx,slot_rx,phy_vars_ue->dlsch_ue[eNB_id][0]->active); + LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",ue->Mod_id,dci_alloc_rx[i].format); + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d=> %d\n",ue->Mod_id,subframe_rx,ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active); #endif - // we received a CRNTI, so we're in PUSCH - if (phy_vars_ue->UE_mode[eNB_id] != PUSCH) { + // we received a CRNTI, so we're in PUSCH + if (ue->UE_mode[eNB_id] != PUSCH) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Received DCI with CRNTI %x => Mode PUSCH\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti); + LOG_I(PHY,"[UE %d] Frame %d, subframe %d: Received DCI with CRNTI %x => Mode PUSCH\n",ue->Mod_id,frame_rx,subframe_rx,ue->pdcch_vars[subframe_rx&1][eNB_id]->crnti); #endif - //dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - phy_vars_ue->UE_mode[eNB_id] = PUSCH; - //mac_xface->macphy_exit("Connected. Exiting\n"); - } + + //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + ue->UE_mode[eNB_id] = PUSCH; + } } else { - LOG_E(PHY,"[UE %d] Frame %d, subframe %d: Problem in DCI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx); - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - } + LOG_E(PHY,"[UE %d] Frame %d, subframe %d: Problem in DCI!\n",ue->Mod_id,frame_rx,subframe_rx); + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + } } + + else if ((dci_alloc_rx[i].rnti == SI_RNTI) && + ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { - else if ((dci_alloc_rx[i].rnti == SI_RNTI) && - ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",phy_vars_ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); - /* - if (((frame_rx%100) == 0) || (frame_rx < 20)) - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - */ + LOG_I(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); #endif -#ifdef DIAG_PHY - - if ((subframe_rx != 5)) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received SI_RNTI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); + + if (generate_ue_dlsch_params_from_dci(frame_rx, + subframe_rx, + (void *)&dci_alloc_rx[i].dci_pdu, + SI_RNTI, + dci_alloc_rx[i].format, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id], + ue->pdsch_vars_SI[eNB_id], + &ue->dlsch_SI[eNB_id], + &ue->frame_parms, + ue->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], + 0)==0) { + + ue->dlsch_SI_received[eNB_id]++; + + LOG_I(PHY,"[UE %d] Frame %d, subframe %d : Generate UE DLSCH SI_RNTI format 1%s\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format==format1A?"A":"C"); + //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + + } } + else if ((dci_alloc_rx[i].rnti == P_RNTI) && + ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { + +#ifdef DEBUG_PHY_PROC + LOG_I(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); #endif + if (generate_ue_dlsch_params_from_dci(frame_rx, subframe_rx, - (void *)&dci_alloc_rx[i].dci_pdu, - SI_RNTI, - dci_alloc_rx[i].format, - &phy_vars_ue->dlsch_ue_SI[eNB_id], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI)==0) { - - phy_vars_ue->dlsch_SI_received[eNB_id]++; - - - LOG_D(PHY,"[UE %d] Frame %d, subframe %d : Generate UE DLSCH SI_RNTI format 1%s\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format==format1A?"A":"C"); - //dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); + (void *)&dci_alloc_rx[i].dci_pdu, + P_RNTI, + dci_alloc_rx[i].format, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id], + ue->pdsch_vars_p[eNB_id], + &ue->dlsch_SI[eNB_id], + &ue->frame_parms, + ue->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], + 0)==0) { + ue->dlsch_p_received[eNB_id]++; + LOG_D(PHY,"[UE %d] Frame %d, subframe %d : Generate UE DLSCH P_RNTI format 1%s\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format==format1A?"A":"C"); + //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); + } } - else if ((phy_vars_ue->prach_resources[eNB_id]) && - (dci_alloc_rx[i].rnti == phy_vars_ue->prach_resources[eNB_id]->ra_RNTI) && - (dci_alloc_rx[i].format == format1A)) { + else if ((ue->prach_resources[eNB_id]) && + (dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) && + (dci_alloc_rx[i].format == format1A)) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d\n",phy_vars_ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i); - - //if (((frame_rx%100) == 0) || (frame_rx < 20)) - //dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - //mac_xface->macphy_exit("so far so good...\n"); + LOG_I(PHY,"[UE %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i); #endif -#ifdef DIAG_PHY - if (subframe_rx != 9) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received RA_RNTI!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); - } - -#endif if (generate_ue_dlsch_params_from_dci(frame_rx, subframe_rx, - (DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu, - phy_vars_ue->prach_resources[eNB_id]->ra_RNTI, - format1A, - &phy_vars_ue->dlsch_ue_ra[eNB_id], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->pdsch_config_dedicated, - SI_RNTI, - phy_vars_ue->prach_resources[eNB_id]->ra_RNTI, - P_RNTI)==0) { - - phy_vars_ue->dlsch_ra_received[eNB_id]++; + (DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu, + ue->prach_resources[eNB_id]->ra_RNTI, + format1A, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id], + ue->pdsch_vars_ra[eNB_id], + &ue->dlsch_ra[eNB_id], + &ue->frame_parms, + ue->pdsch_config_dedicated, + SI_RNTI, + ue->prach_resources[eNB_id]->ra_RNTI, + P_RNTI, + ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], + 0)==0) { + + ue->dlsch_ra_received[eNB_id]++; #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ue_ra[eNB_id] %p\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],phy_vars_ue->dlsch_ue_ra[eNB_id]); + LOG_D(PHY,"[UE %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ra[eNB_id] %p\n", + ue->Mod_id,ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],ue->dlsch_ra[eNB_id]); #endif } - } else if( (dci_alloc_rx[i].rnti == phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti) && - (dci_alloc_rx[i].format == format0)) { + } else if( (dci_alloc_rx[i].rnti == ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti) && + (dci_alloc_rx[i].format == format0)) { + #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d: Found rnti %x, format 0, dci_cnt %d\n", - phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); - /* - if (((frame_rx%100) == 0) || (frame_rx < 20)) - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - */ -#endif -#ifdef DIAG_PHY - - if (subframe_rx != 9) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format 0!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); - } - + ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); #endif - phy_vars_ue->ulsch_no_allocation_counter[eNB_id] = 0; - //dump_dci(&phy_vars_ue->lte_frame_parms,&dci_alloc_rx[i]); - - if ((phy_vars_ue->UE_mode[eNB_id] > PRACH) && + ue->ulsch_no_allocation_counter[eNB_id] = 0; + //dump_dci(&ue->frame_parms,&dci_alloc_rx[i]); + + if ((ue->UE_mode[eNB_id] > PRACH) && (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti, subframe_rx, format0, - phy_vars_ue, + ue, + proc, SI_RNTI, 0, P_RNTI, CBA_RNTI, eNB_id, 0)==0)) { +#if T_TRACER + LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + uint8_t harq_pid = subframe2harq_pid(frame_parms, + pdcch_alloc2ul_frame(frame_parms,proc->frame_rx,proc->subframe_rx), + pdcch_alloc2ul_subframe(frame_parms,proc->subframe_rx)); + T(T_UE_PHY_ULSCH_UE_DCI, T_INT(eNB_id), T_INT(proc->frame_rx%1024), T_INT(proc->subframe_rx), + T_INT(dci_alloc_rx[i].rnti), T_INT(harq_pid), + T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs), + T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->round), + T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb), + T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb), + T_INT(ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS)); +#endif #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",phy_vars_ue->Mod_id,subframe_rx); + LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); #endif } - } else if( (dci_alloc_rx[i].rnti == phy_vars_ue->ulsch_ue[eNB_id]->cba_rnti[0]) && - (dci_alloc_rx[i].format == format0)) { + } else if( (dci_alloc_rx[i].rnti == ue->ulsch[eNB_id]->cba_rnti[0]) && + (dci_alloc_rx[i].format == format0)) { // UE could belong to more than one CBA group - // phy_vars_ue->Mod_id%phy_vars_ue->ulsch_ue[eNB_id]->num_active_cba_groups] + // ue->Mod_id%ue->ulsch[eNB_id]->num_active_cba_groups] #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PUSCH] Frame %d subframe %d: Found cba rnti %x, format 0, dci_cnt %d\n", - phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); + ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i); /* - if (((frame_rx%100) == 0) || (frame_rx < 20)) - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); + if (((frame_rx%100) == 0) || (frame_rx < 20)) + dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); */ #endif - /* - #ifdef DIAG_PHY - if (subframe_rx != 8) { - LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received CBA RNTI Format 0!\n", - phy_vars_ue->Mod_id,frame_rx,subframe_rx); - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); - } - #endif - */ - phy_vars_ue->ulsch_no_allocation_counter[eNB_id] = 0; - //dump_dci(&phy_vars_ue->lte_frame_parms,&dci_alloc_rx[i]); + ue->ulsch_no_allocation_counter[eNB_id] = 0; + //dump_dci(&ue->frame_parms,&dci_alloc_rx[i]); - if ((phy_vars_ue->UE_mode[eNB_id] > PRACH) && - (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, - phy_vars_ue->ulsch_ue[eNB_id]->cba_rnti[0], - subframe_rx, - format0, - phy_vars_ue, - SI_RNTI, - 0, - P_RNTI, - CBA_RNTI, - eNB_id, - 0)==0)) { + if ((ue->UE_mode[eNB_id] > PRACH) && + (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, + ue->ulsch[eNB_id]->cba_rnti[0], + subframe_rx, + format0, + ue, + proc, + SI_RNTI, + 0, + P_RNTI, + CBA_RNTI, + eNB_id, + 0)==0)) { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",phy_vars_ue->Mod_id,subframe_rx); + LOG_D(PHY,"[UE %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx); #endif - phy_vars_ue->ulsch_ue[eNB_id]->num_cba_dci[(subframe_rx+4)%10]++; + ue->ulsch[eNB_id]->num_cba_dci[(subframe_rx+4)%10]++; } } else { #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] frame %d, subframe %d: received DCI %d with RNTI=%x (C-RNTI:%x, CBA_RNTI %x) and format %d!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,i,dci_alloc_rx[i].rnti, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, - phy_vars_ue->ulsch_ue[eNB_id]->cba_rnti[0], - dci_alloc_rx[i].format); - // dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); -#endif -#ifdef DIAG_PHY - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_errors++; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->dci_false++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); - return(-1); + LOG_I(PHY,"[UE %d] frame %d, subframe %d: received DCI %d with RNTI=%x (C-RNTI:%x, CBA_RNTI %x) and format %d!\n",ue->Mod_id,frame_rx,subframe_rx,i,dci_alloc_rx[i].rnti, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti, + ue->ulsch[eNB_id]->cba_rnti[0], + dci_alloc_rx[i].format); + + // dump_dci(&ue->frame_parms, &dci_alloc_rx[i]); #endif } } -/* - if ((frame_rx > 1000) && ((frame_rx&1)==0) && (subframe_rx == 5)) { - write_output("rxsig0.m","rxs0", phy_vars_ue->lte_ue_common_vars.rxdata[0],10*phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],phy_vars_ue->lte_frame_parms.ofdm_symbol_size*2*((phy_vars_ue->lte_frame_parms.Ncp==0)?14:12),2,1); - write_output("H00.m","h00",&(phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((phy_vars_ue->lte_frame_parms.Ncp==0)?7:6)*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size),1,1); - - write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->rxdataF_ext[0],3*12*phy_vars_ue->lte_frame_parms.N_RB_DL,1,1); - write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*12*phy_vars_ue->lte_frame_parms.N_RB_DL,1,1); - write_output("pdcch_rxF_llr.m","pdcch_llr",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->llr,2400,1,4); - mac_xface->macphy_exit("debug exit"); - } -*/ +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_rx_pdcch_stats); +#endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(0); } -int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode, - relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) -{ - - uint16_t l,m,n_symb; - // int eNB_id = 0, - int ret=0; - uint8_t harq_pid = -1; - int timing_advance; - uint8_t pilot1,pilot2,pilot3; -#ifndef DLSCH_THREAD - uint8_t i_mod = 0; - int eNB_id_i = 1; - uint8_t dual_stream_UE = 0; -#endif - uint8_t *rar; - int pmch_flag=0; - uint8_t sync_area=255; +void ue_pmch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,int eNB_id,int abstraction_flag) { + + int subframe_rx = proc->subframe_rx; + int frame_rx = proc->frame_rx; int pmch_mcs=-1; - uint8_t mcch_active=0; - int frame_rx = phy_vars_ue->frame_rx; - int slot_rx = phy_vars_ue->slot_rx; - int subframe_rx = slot_rx>>1; - int subframe_prev = (subframe_rx+9)%10; - int CC_id = phy_vars_ue->CC_id; +#if defined(Rel10) || defined(Rel14) + int CC_id = ue->CC_id; +#endif + uint8_t sync_area=255; + uint8_t mcch_active; + int l; + int ret=0; + + if (is_pmch_subframe(frame_rx,subframe_rx,&ue->frame_parms)) { + LOG_D(PHY,"ue calling pmch subframe ..\n "); + + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation\n", + ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx); +#if defined(Rel10) || defined(Rel14) + + pmch_mcs = ue_query_mch(ue->Mod_id, + CC_id, + frame_rx, + subframe_rx, + eNB_id, + &sync_area, + &mcch_active); + +#else + pmch_mcs=-1; +#endif + + if (pmch_mcs>=0) { + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Programming PMCH demodulation for mcs %d\n",ue->Mod_id,frame_rx,subframe_rx,pmch_mcs); + fill_UE_dlsch_MCH(ue,pmch_mcs,1,0,0); + + + for (l=2; l<12; l++) { + + slot_fep_mbsfn(ue, + l, + subframe_rx, + 0,0);//ue->rx_offset,0); + } + + for (l=2; l<12; l++) { + rx_pmch(ue, + 0, + subframe_rx, + l); + } + + + ue->dlsch_MCH[0]->harq_processes[0]->G = get_G(&ue->frame_parms, + ue->dlsch_MCH[0]->harq_processes[0]->nb_rb, + ue->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even, + ue->dlsch_MCH[0]->harq_processes[0]->Qm, + 1, + 2, + frame_rx, + subframe_rx, + 0); + + dlsch_unscrambling(&ue->frame_parms,1,ue->dlsch_MCH[0], + ue->dlsch_MCH[0]->harq_processes[0]->G, + ue->pdsch_vars_MCH[0]->llr[0],0,subframe_rx<<1); + + ret = dlsch_decoding(ue, + ue->pdsch_vars_MCH[0]->llr[0], + &ue->frame_parms, + ue->dlsch_MCH[0], + ue->dlsch_MCH[0]->harq_processes[0], + frame_rx, + subframe_rx, + 0, + 0,1); + if (mcch_active == 1) + ue->dlsch_mcch_trials[sync_area][0]++; + else + ue->dlsch_mtch_trials[sync_area][0]++; + + if (ret == (1+ue->dlsch_MCH[0]->max_turbo_iterations)) { + if (mcch_active == 1) + ue->dlsch_mcch_errors[sync_area][0]++; + else + ue->dlsch_mtch_errors[sync_area][0]++; + + LOG_D(PHY,"[UE %d] Frame %d, subframe %d: PMCH in error (%d,%d), not passing to L2 (TBS %d, iter %d,G %d)\n", + ue->Mod_id, + frame_rx,subframe_rx, + ue->dlsch_mcch_errors[sync_area][0], + ue->dlsch_mtch_errors[sync_area][0], + ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, + ue->dlsch_MCH[0]->max_turbo_iterations, + ue->dlsch_MCH[0]->harq_processes[0]->G); + dump_mch(ue,0,ue->dlsch_MCH[0]->harq_processes[0]->G,subframe_rx); +#ifdef DEBUG_DLSCH + + for (int i=0; idlsch_MCH[0]->harq_processes[0]->TBS>>3; i++) { + LOG_T(PHY,"%02x.",ue->dlsch_MCH[0]->harq_processes[0]->c[0][i]); + } + + LOG_T(PHY,"\n"); +#endif + + + // if (subframe_rx==9) + // mac_xface->macphy_exit("Why are we exiting here?"); + } else { // decoding successful +#if defined(Rel10) || defined(Rel14) + + if (mcch_active == 1) { + ue_send_mch_sdu(ue->Mod_id, + CC_id, + frame_rx, + ue->dlsch_MCH[0]->harq_processes[0]->b, + ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3, + eNB_id,// not relevant in eMBMS context + sync_area); + ue->dlsch_mcch_received[sync_area][0]++; + + + if (ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) { + ue->dlsch_mch_received_sf[subframe_rx%5][0]=0; + } else { + ue->dlsch_mch_received[0]+=1; + ue->dlsch_mch_received_sf[subframe_rx][0]=1; + } + + + } + +#endif // Rel10 || Rel14 + } // decoding sucessful + } // pmch_mcs>=0 + } // is_pmch_subframe=true +} + +void copy_harq_proc_struct(LTE_DL_UE_HARQ_t *harq_processes_dest, LTE_DL_UE_HARQ_t *current_harq_processes) +{ + harq_processes_dest->B = current_harq_processes->B ; + harq_processes_dest->C = current_harq_processes->C ; + harq_processes_dest->Cminus = current_harq_processes->Cminus ; + harq_processes_dest->Cplus = current_harq_processes->Cplus ; + harq_processes_dest->DCINdi = current_harq_processes->DCINdi ; + harq_processes_dest->F = current_harq_processes->F ; + harq_processes_dest->G = current_harq_processes->G ; + harq_processes_dest->Kminus = current_harq_processes->Kminus ; + harq_processes_dest->Kplus = current_harq_processes->Kplus ; + harq_processes_dest->Nl = current_harq_processes->Nl ; + harq_processes_dest->Qm = current_harq_processes->Qm ; + harq_processes_dest->TBS = current_harq_processes->TBS ; + harq_processes_dest->b = current_harq_processes->b ; + harq_processes_dest->codeword = current_harq_processes->codeword ; + harq_processes_dest->delta_PUCCH = current_harq_processes->delta_PUCCH ; + harq_processes_dest->dl_power_off = current_harq_processes->dl_power_off ; + harq_processes_dest->first_tx = current_harq_processes->first_tx ; + harq_processes_dest->mcs = current_harq_processes->mcs ; + harq_processes_dest->mimo_mode = current_harq_processes->mimo_mode ; + harq_processes_dest->nb_rb = current_harq_processes->nb_rb ; + harq_processes_dest->pmi_alloc = current_harq_processes->pmi_alloc ; + harq_processes_dest->rb_alloc_even[0] = current_harq_processes->rb_alloc_even[0] ; + harq_processes_dest->rb_alloc_even[1] = current_harq_processes->rb_alloc_even[1] ; + harq_processes_dest->rb_alloc_even[2] = current_harq_processes->rb_alloc_even[2] ; + harq_processes_dest->rb_alloc_even[3] = current_harq_processes->rb_alloc_even[3] ; + harq_processes_dest->rb_alloc_odd[0] = current_harq_processes->rb_alloc_odd[0] ; + harq_processes_dest->rb_alloc_odd[1] = current_harq_processes->rb_alloc_odd[1] ; + harq_processes_dest->rb_alloc_odd[2] = current_harq_processes->rb_alloc_odd[2] ; + harq_processes_dest->rb_alloc_odd[3] = current_harq_processes->rb_alloc_odd[3] ; + harq_processes_dest->round = current_harq_processes->round ; + harq_processes_dest->rvidx = current_harq_processes->rvidx ; + harq_processes_dest->status = current_harq_processes->status ; + harq_processes_dest->vrb_type = current_harq_processes->vrb_type ; +} + +void copy_ack_struct(harq_status_t *harq_ack_dest, harq_status_t *current_harq_ack) +{ + memcpy(harq_ack_dest, current_harq_ack, sizeof(harq_status_t)); +} + +void ue_pdsch_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, int eNB_id, PDSCH_t pdsch, LTE_UE_DLSCH_t *dlsch0, LTE_UE_DLSCH_t *dlsch1, int s0, int s1, int abstraction_flag) { + + int subframe_rx = proc->subframe_rx; + int m; + int harq_pid; + int i_mod,eNB_id_i,dual_stream_UE; + int first_symbol_flag=0; + + if (dlsch0->active == 0) + return; + + for (m=s0;m<=s1;m++) { + + if (dlsch0 && (!dlsch1)) { + harq_pid = dlsch0->current_harq_pid; + LOG_D(PHY,"[UE %d] PDSCH active in subframe %d, harq_pid %d Symbol %d\n",ue->Mod_id,subframe_rx,harq_pid,m); + + if ((pdsch==PDSCH) && + (ue->transmission_mode[eNB_id] == 5) && + (dlsch0->harq_processes[harq_pid]->dl_power_off==0) && + (ue->use_ia_receiver ==1)) { + dual_stream_UE = 1; + eNB_id_i = ue->n_connected_eNB; + i_mod = dlsch0->harq_processes[harq_pid]->Qm; + + } + else if((pdsch==PDSCH) && (ue->transmission_mode[eNB_id]==3)) + { + dual_stream_UE = rx_IC_dual_stream; + eNB_id_i = eNB_id; + i_mod = 0; + } + else { + dual_stream_UE = 0; + eNB_id_i = eNB_id+1; + i_mod = 0; + } + + //TM7 UE specific channel estimation here!!! + if (ue->transmission_mode[eNB_id]==7) { + if (ue->frame_parms.Ncp==0) { + if ((m==3) || (m==6) || (m==9) || (m==12)) + //LOG_D(PHY,"[UE %d] dlsch->active in subframe %d => %d, l=%d\n",phy_vars_ue->Mod_id,subframe_rx,phy_vars_ue->dlsch_ue[eNB_id][0]->active, l); + lte_dl_bf_channel_estimation(ue,eNB_id,0,subframe_rx*2+(m>6?1:0),5,m); + } else { + LOG_E(PHY,"[UE %d]Beamforming channel estimation not supported yet for TM7 extented CP.\n",ue->Mod_id); + } + } + + if ((m==s0) && (m<4)) + first_symbol_flag = 1; + else + first_symbol_flag = 0; +#if UE_TIMING_TRACE + uint8_t slot = 0; + if(m >= ue->frame_parms.symbols_per_tti>>1) + slot = 1; + start_meas(&ue->dlsch_llr_stats_parallelization[ue->current_thread_id[subframe_rx]][slot]); +#endif + // process DLSCH received in first slot + rx_pdsch(ue, + pdsch, + eNB_id, + eNB_id_i, + proc->frame_rx, + subframe_rx, // subframe, + m, + first_symbol_flag, + dual_stream_UE, + i_mod, + dlsch0->current_harq_pid); +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_llr_stats_parallelization[ue->current_thread_id[subframe_rx]][slot]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f \n",proc->frame_rx,subframe_rx,m,ue->dlsch_llr_stats_parallelization[ue->current_thread_id[subframe_rx]][slot].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f \n",proc->frame_rx,subframe_rx,m,ue->dlsch_llr_stats_parallelization[ue->current_thread_id[subframe_rx]][slot].p_time/(cpuf*1000.0)); +#endif +#endif + + + if(first_symbol_flag) + { + proc->first_symbol_available = 1; + } + } // CRNTI active + } +} + +void process_rar(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc, int eNB_id, runmode_t mode, int abstraction_flag) { + + int frame_rx = proc->frame_rx; + int subframe_rx = proc->subframe_rx; + int timing_advance; + LTE_UE_DLSCH_t *dlsch0 = ue->dlsch_ra[eNB_id]; + int harq_pid = 0; + uint8_t *rar; + uint8_t next1_thread_id = ue->current_thread_id[subframe_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[subframe_rx]+1); + uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1); + + LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Received RAR mode %d\n", + ue->Mod_id, + frame_rx, + subframe_rx, ue->UE_mode[eNB_id]); + + + if (ue->mac_enabled == 1) { + if ((ue->UE_mode[eNB_id] != PUSCH) && + (ue->prach_resources[eNB_id]->Msg3!=NULL)) { + LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n", + ue->Mod_id,frame_rx, + subframe_rx, + ue->prach_resources[eNB_id]->ra_PreambleIndex); + + timing_advance = ue_process_rar(ue->Mod_id, + ue->CC_id, + frame_rx, + ue->prach_resources[eNB_id]->ra_RNTI, + dlsch0->harq_processes[0]->b, + &ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti, + ue->prach_resources[eNB_id]->ra_PreambleIndex, + dlsch0->harq_processes[0]->b); // alter the 'b' buffer so it contains only the selected RAR header and RAR payload + + ue->pdcch_vars[next1_thread_id][eNB_id]->crnti = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti; + ue->pdcch_vars[next2_thread_id][eNB_id]->crnti = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti; + + + if (timing_advance!=0xffff) { + + LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Got rnti %x and timing advance %d from RAR\n", + ue->Mod_id, + frame_rx, + subframe_rx, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti, + timing_advance); + + // remember this c-rnti is still a tc-rnti + + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti_is_temporary = 1; + + //timing_advance = 0; + process_timing_advance_rar(ue,proc,timing_advance); + + if (mode!=debug_prach) { + ue->ulsch_Msg3_active[eNB_id]=1; + get_Msg3_alloc(&ue->frame_parms, + subframe_rx, + frame_rx, + &ue->ulsch_Msg3_frame[eNB_id], + &ue->ulsch_Msg3_subframe[eNB_id]); + + LOG_D(PHY,"[UE %d][RAPROC] Got Msg3_alloc Frame %d subframe %d: Msg3_frame %d, Msg3_subframe %d\n", + ue->Mod_id, + frame_rx, + subframe_rx, + ue->ulsch_Msg3_frame[eNB_id], + ue->ulsch_Msg3_subframe[eNB_id]); + harq_pid = subframe2harq_pid(&ue->frame_parms, + ue->ulsch_Msg3_frame[eNB_id], + ue->ulsch_Msg3_subframe[eNB_id]); + ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0; + + ue->UE_mode[eNB_id] = RA_RESPONSE; + // ue->Msg3_timer[eNB_id] = 10; + ue->ulsch[eNB_id]->power_offset = 6; + ue->ulsch_no_allocation_counter[eNB_id] = 0; + } + } else { // PRACH preamble doesn't match RAR + LOG_W(PHY,"[UE %d][RAPROC] Received RAR preamble (%d) doesn't match !!!\n", + ue->Mod_id, + ue->prach_resources[eNB_id]->ra_PreambleIndex); + } + } // mode != PUSCH + } + else { + rar = dlsch0->harq_processes[0]->b+1; + timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); + process_timing_advance_rar(ue,proc,timing_advance); + } + +} + +void ue_dlsch_procedures(PHY_VARS_UE *ue, + UE_rxtx_proc_t *proc, + int eNB_id, + PDSCH_t pdsch, + LTE_UE_DLSCH_t *dlsch0, + LTE_UE_DLSCH_t *dlsch1, + int *dlsch_errors, + runmode_t mode, + int abstraction_flag) { + + int harq_pid; + int frame_rx = proc->frame_rx; + int subframe_rx = proc->subframe_rx; + int ret=0, ret1=0; + int CC_id = ue->CC_id; + LTE_UE_PDSCH *pdsch_vars; + uint8_t is_cw0_active = 0; + uint8_t is_cw1_active = 0; + + if (dlsch0==NULL) + AssertFatal(0,"dlsch0 should be defined at this level \n"); + + harq_pid = dlsch0->current_harq_pid; + is_cw0_active = dlsch0->harq_processes[harq_pid]->status; + + if(dlsch1) + is_cw1_active = dlsch1->harq_processes[harq_pid]->status; + + LOG_D(PHY,"AbsSubframe %d.%d Start Turbo Decoder for CW0 [harq_pid %d] ? %d \n", frame_rx%1024, subframe_rx, harq_pid, is_cw0_active); + LOG_D(PHY,"AbsSubframe %d.%d Start Turbo Decoder for CW1 [harq_pid %d] ? %d \n", frame_rx%1024, subframe_rx, harq_pid, is_cw1_active); + + if(is_cw0_active && is_cw1_active) + { + dlsch0->Kmimo = 2; + dlsch1->Kmimo = 2; + } + else + { + dlsch0->Kmimo = 1; + } + if (1) { + switch (pdsch) { + case SI_PDSCH: + pdsch_vars = ue->pdsch_vars_SI[eNB_id]; + break; + case RA_PDSCH: + pdsch_vars = ue->pdsch_vars_ra[eNB_id]; + break; + case P_PDSCH: + pdsch_vars = ue->pdsch_vars_p[eNB_id]; + break; + case PDSCH: + pdsch_vars = ue->pdsch_vars[ue->current_thread_id[subframe_rx]][eNB_id]; + break; + case PMCH: + case PDSCH1: + LOG_E(PHY,"Illegal PDSCH %d for ue_pdsch_procedures\n",pdsch); + pdsch_vars = NULL; + return; + break; + default: + pdsch_vars = NULL; + return; + break; + + } + if (frame_rx < *dlsch_errors) + *dlsch_errors=0; + + if (pdsch==RA_PDSCH) { + + if (ue->prach_resources[eNB_id]!=NULL) + dlsch0->rnti = ue->prach_resources[eNB_id]->ra_RNTI; + else { + LOG_E(PHY,"[UE %d] Frame %d, subframe %d: FATAL, prach_resources is NULL\n",ue->Mod_id,frame_rx,subframe_rx); + AssertFatal(1==0,"prach_resources is NULL"); + } + } + + + // start turbo decode for CW 0 + dlsch0->harq_processes[harq_pid]->G = get_G(&ue->frame_parms, + dlsch0->harq_processes[harq_pid]->nb_rb, + dlsch0->harq_processes[harq_pid]->rb_alloc_even, + dlsch0->harq_processes[harq_pid]->Qm, + dlsch0->harq_processes[harq_pid]->Nl, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + frame_rx, + subframe_rx, + ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]); +#if UE_TIMING_TRACE + start_meas(&ue->dlsch_unscrambling_stats); +#endif + dlsch_unscrambling(&ue->frame_parms, + 0, + dlsch0, + dlsch0->harq_processes[harq_pid]->G, + pdsch_vars->llr[0], + 0, + subframe_rx<<1); +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_unscrambling_stats); +#endif + +#if 0 + LOG_I(PHY," ------ start turbo decoder for AbsSubframe %d.%d / %d ------ \n", frame_rx, subframe_rx, harq_pid); + LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, subframe_rx, harq_pid, dlsch0->harq_processes[harq_pid]->nb_rb); + LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> rb_alloc_even %x \n", frame_rx, subframe_rx, harq_pid, dlsch0->harq_processes[harq_pid]->rb_alloc_even); + LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> Qm %d \n", frame_rx, subframe_rx, harq_pid, dlsch0->harq_processes[harq_pid]->Qm); + LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> Nl %d \n", frame_rx, subframe_rx, harq_pid, dlsch0->harq_processes[harq_pid]->Nl); + LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> G %d \n", frame_rx, subframe_rx, harq_pid, dlsch0->harq_processes[harq_pid]->G); + LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, subframe_rx, harq_pid, dlsch0->Kmimo); + LOG_I(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, subframe_rx, harq_pid, ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols); +#endif + +#if UE_TIMING_TRACE + start_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); +#endif + ret = dlsch_decoding(ue, + pdsch_vars->llr[0], + &ue->frame_parms, + dlsch0, + dlsch0->harq_processes[harq_pid], + frame_rx, + subframe_rx, + harq_pid, + pdsch==PDSCH?1:0, + dlsch0->harq_processes[harq_pid]->TBS>256?1:0); + +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); +#if DISABLE_LOG_X + printf(" --> Unscrambling for CW0 %5.3f\n", + (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); + printf("AbsSubframe %d.%d --> Turbo Decoding for CW0 %5.3f\n", + frame_rx%1024, subframe_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]].p_time)/(cpuf*1000.0)); +#else + LOG_D(PHY, " --> Unscrambling for CW0 %5.3f\n", + (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); + LOG_D(PHY, "AbsSubframe %d.%d --> Turbo Decoding for CW0 %5.3f\n", + frame_rx%1024, subframe_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]].p_time)/(cpuf*1000.0)); +#endif + +#endif + if(is_cw1_active) + { + // start turbo decode for CW 1 + dlsch1->harq_processes[harq_pid]->G = get_G(&ue->frame_parms, + dlsch1->harq_processes[harq_pid]->nb_rb, + dlsch1->harq_processes[harq_pid]->rb_alloc_even, + dlsch1->harq_processes[harq_pid]->Qm, + dlsch1->harq_processes[harq_pid]->Nl, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + frame_rx, + subframe_rx, + ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]); +#if UE_TIMING_TRACE + start_meas(&ue->dlsch_unscrambling_stats); +#endif + dlsch_unscrambling(&ue->frame_parms, + 0, + dlsch1, + dlsch1->harq_processes[harq_pid]->G, + pdsch_vars->llr[1], + 1, + subframe_rx<<1); +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_unscrambling_stats); +#endif + +#if 0 + LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, subframe_rx, harq_pid, dlsch1->harq_processes[harq_pid]->nb_rb); + LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> rb_alloc_even %x \n", frame_rx, subframe_rx, harq_pid, dlsch1->harq_processes[harq_pid]->rb_alloc_even); + LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> Qm %d \n", frame_rx, subframe_rx, harq_pid, dlsch1->harq_processes[harq_pid]->Qm); + LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> Nl %d \n", frame_rx, subframe_rx, harq_pid, dlsch1->harq_processes[harq_pid]->Nl); + LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> G %d \n", frame_rx, subframe_rx, harq_pid, dlsch1->harq_processes[harq_pid]->G); + LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> Kmimo %d \n", frame_rx, subframe_rx, harq_pid, dlsch1->Kmimo); + LOG_I(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, subframe_rx, harq_pid, ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols); +#endif + +#if UE_TIMING_TRACE + start_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); +#endif + + ret1 = dlsch_decoding(ue, + pdsch_vars->llr[1], + &ue->frame_parms, + dlsch1, + dlsch1->harq_processes[harq_pid], + frame_rx, + subframe_rx, + harq_pid, + pdsch==PDSCH?1:0, + dlsch1->harq_processes[harq_pid]->TBS>256?1:0); + +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]); +#if DISABLE_LOG_X + printf(" --> Unscrambling for CW1 %5.3f\n", + (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); + printf("AbsSubframe %d.%d --> Turbo Decoding for CW1 %5.3f\n", + frame_rx%1024, subframe_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]].p_time)/(cpuf*1000.0)); +#else + LOG_D(PHY, " --> Unscrambling for CW1 %5.3f\n", + (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0)); + LOG_D(PHY, "AbsSubframe %d.%d --> Turbo Decoding for CW1 %5.3f\n", + frame_rx%1024, subframe_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]].p_time)/(cpuf*1000.0)); +#endif + +#endif + LOG_D(PHY,"AbsSubframe %d.%d --> Turbo Decoding for CW1 %5.3f\n", + frame_rx%1024, subframe_rx,(ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]].p_time)/(cpuf*1000.0)); + } + + LOG_D(PHY," ------ end turbo decoder for AbsSubframe %d.%d ------ \n", frame_rx, subframe_rx); + + + + // Check CRC for CW 0 + if (ret == (1+dlsch0->max_turbo_iterations)) { + *dlsch_errors=*dlsch_errors+1; + + if(dlsch0->rnti != 0xffff) + { + + LOG_D(PHY,"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : DLSCH CW0 in error (rv %d,round %d, mcs %d,TBS %d)\n", + ue->Mod_id,dlsch0->rnti, + harq_pid,frame_rx,subframe_rx, + dlsch0->harq_processes[harq_pid]->rvidx, + dlsch0->harq_processes[harq_pid]->round, + dlsch0->harq_processes[harq_pid]->mcs, + dlsch0->harq_processes[harq_pid]->TBS); + } + + + } else { + if(dlsch0->rnti != 0xffff) + { + LOG_D(PHY,"[UE %d][PDSCH %x/%d] AbsSubframe %d.%d : Received DLSCH CW0 (rv %d,round %d, mcs %d,TBS %d)\n", + ue->Mod_id,dlsch0->rnti, + harq_pid,frame_rx,subframe_rx, + dlsch0->harq_processes[harq_pid]->rvidx, + dlsch0->harq_processes[harq_pid]->round, + dlsch0->harq_processes[harq_pid]->mcs, + dlsch0->harq_processes[harq_pid]->TBS); + } + +#ifdef DEBUG_DLSCH + int j; + LOG_D(PHY,"dlsch harq_pid %d (rx): \n",dlsch0->current_harq_pid); + + for (j=0; jharq_processes[dlsch0->current_harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",dlsch0->harq_processes[dlsch0->current_harq_pid]->b[j]); + + LOG_T(PHY,"\n"); +#endif + + + if (ue->mac_enabled == 1) { + + switch (pdsch) { + case PDSCH: + ue_send_sdu(ue->Mod_id, + CC_id, + frame_rx, + subframe_rx, + dlsch0->harq_processes[dlsch0->current_harq_pid]->b, + dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS>>3, + eNB_id); + break; + case SI_PDSCH: + ue_decode_si(ue->Mod_id, + CC_id, + frame_rx, + eNB_id, + ue->dlsch_SI[eNB_id]->harq_processes[0]->b, + ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3); + break; + case P_PDSCH: + ue_decode_p(ue->Mod_id, + CC_id, + frame_rx, + eNB_id, + ue->dlsch_SI[eNB_id]->harq_processes[0]->b, + ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3); + break; + case RA_PDSCH: + process_rar(ue,proc,eNB_id,mode,abstraction_flag); + break; + case PDSCH1: + LOG_E(PHY,"Shouldn't have PDSCH1 yet, come back later\n"); + AssertFatal(1==0,"exiting"); + break; + case PMCH: + LOG_E(PHY,"Shouldn't have PMCH here\n"); + AssertFatal(1==0,"exiting"); + break; + } + } + ue->total_TBS[eNB_id] = ue->total_TBS[eNB_id] + + dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS; + ue->total_received_bits[eNB_id] = ue->total_TBS[eNB_id] + + dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS; + } + // Check CRC for CW 1 + if(is_cw1_active) + { + if (ret1 == (1+dlsch0->max_turbo_iterations)) { + LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH CW1 in error (rv %d,mcs %d,TBS %d)\n", + ue->Mod_id,dlsch0->rnti, + harq_pid,frame_rx,subframe_rx, + dlsch0->harq_processes[harq_pid]->rvidx, + dlsch0->harq_processes[harq_pid]->mcs, + dlsch0->harq_processes[harq_pid]->TBS); + + } else { + LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH CW1 (rv %d,mcs %d,TBS %d)\n", + ue->Mod_id,dlsch0->rnti, + harq_pid,frame_rx,subframe_rx, + dlsch0->harq_processes[harq_pid]->rvidx, + dlsch0->harq_processes[harq_pid]->mcs, + dlsch0->harq_processes[harq_pid]->TBS); + + + if (ue->mac_enabled == 1) { + switch (pdsch) { + case PDSCH: + if(is_cw1_active) + ue_send_sdu(ue->Mod_id, + CC_id, + frame_rx, + subframe_rx, + dlsch1->harq_processes[dlsch1->current_harq_pid]->b, + dlsch1->harq_processes[dlsch1->current_harq_pid]->TBS>>3, + eNB_id); + break; + case SI_PDSCH: + case P_PDSCH: + case RA_PDSCH: + case PDSCH1: + case PMCH: + AssertFatal(0,"exiting"); + break; + } + } + } + } + +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", + ue->Mod_id, + dlsch0->rnti,harq_pid, + frame_rx,subframe_rx,ret, + dlsch0->harq_processes[harq_pid]->mcs, + dlsch0->harq_processes[harq_pid]->rvidx, + dlsch0->harq_processes[harq_pid]->TBS); + + if (frame_rx%100==0) { + LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n", + ue->Mod_id,dlsch0->rnti, + frame_rx,subframe_rx, + ue->dlsch_errors[eNB_id], + ue->dlsch_received[eNB_id], + ue->dlsch_fer[eNB_id], + ue->measurements.wideband_cqi_tot[eNB_id]); + } + +#endif + + } + + +} + +/*! + * \brief This is the UE synchronize thread. + * It performs band scanning and synchonization. + * \param arg is a pointer to a \ref PHY_VARS_UE structure. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +#ifdef UE_SLOT_PARALLELISATION +#define FIFO_PRIORITY 40 +void *UE_thread_slot1_dl_processing(void *arg) { + + static __thread int UE_dl_slot1_processing_retval; + struct rx_tx_thread_data *rtd = arg; + UE_rxtx_proc_t *proc = rtd->proc; + PHY_VARS_UE *ue = rtd->UE; + + int frame_rx; + uint8_t subframe_rx; + uint8_t pilot0; + uint8_t pilot1; + uint8_t slot1; + + uint8_t next_subframe_rx; + uint8_t next_subframe_slot0; + + proc->instance_cnt_slot1_dl_processing=-1; + proc->subframe_rx=proc->sub_frame_start; + + char threadname[256]; + sprintf(threadname,"UE_thread_slot1_dl_processing_%d", proc->sub_frame_start); + + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + if ( (proc->sub_frame_start+1)%RX_NB_TH == 0 && threads.slot1_proc_one != -1 ) + CPU_SET(threads.slot1_proc_one, &cpuset); + if ( (proc->sub_frame_start+1)%RX_NB_TH == 1 && threads.slot1_proc_two != -1 ) + CPU_SET(threads.slot1_proc_two, &cpuset); + if ( (proc->sub_frame_start+1)%RX_NB_TH == 2 && threads.slot1_proc_three != -1 ) + CPU_SET(threads.slot1_proc_three, &cpuset); + + init_thread(900000,1000000 , FIFO_PRIORITY-1, &cpuset, + threadname); + + while (!oai_exit) { + if (pthread_mutex_lock(&proc->mutex_slot1_dl_processing) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE slot1 dl processing\n" ); + exit_fun("nothing to add"); + } + while (proc->instance_cnt_slot1_dl_processing < 0) { + // most of the time, the thread is waiting here + pthread_cond_wait( &proc->cond_slot1_dl_processing, &proc->mutex_slot1_dl_processing ); + } + if (pthread_mutex_unlock(&proc->mutex_slot1_dl_processing) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE slot1 dl processing \n" ); + exit_fun("nothing to add"); + } + + /*for(int th_idx=0; th_idx< RX_NB_TH; th_idx++) + { + frame_rx = ue->proc.proc_rxtx[0].frame_rx; + subframe_rx = ue->proc.proc_rxtx[0].subframe_rx; + printf("AbsSubframe %d.%d execute dl slot1 processing \n", frame_rx, subframe_rx); + }*/ + frame_rx = proc->frame_rx; + subframe_rx = proc->subframe_rx; + next_subframe_rx = (1+subframe_rx)%10; + next_subframe_slot0 = next_subframe_rx<<1; + + slot1 = (subframe_rx<<1) + 1; + pilot0 = 0; + + //printf("AbsSubframe %d.%d execute dl slot1 processing \n", frame_rx, subframe_rx); + + if (ue->frame_parms.Ncp == 0) { // normal prefix + pilot1 = 4; + } else { // extended prefix + pilot1 = 3; + } + + /**** Slot1 FE Processing ****/ +#if UE_TIMING_TRACE + start_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); +#endif + // I- start dl slot1 processing + // do first symbol of next downlink subframe for channel estimation + /* + // 1- perform FFT for pilot ofdm symbols first (ofdmSym0 next subframe ofdmSym11) + if (subframe_select(&ue->frame_parms,next_subframe_rx) != SF_UL) + { + front_end_fft(ue, + pilot0, + next_subframe_slot0, + 0, + 0); + } + + front_end_fft(ue, + pilot1, + slot1, + 0, + 0); + */ + // 1- perform FFT + for (int l=1; lframe_parms.symbols_per_tti>>1; l++) + { + //if( (l != pilot0) && (l != pilot1)) + { +#if UE_TIMING_TRACE + start_meas(&ue->ofdm_demod_stats); +#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); + //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,subframe_rx,slot1,l); + front_end_fft(ue, + l, + slot1, + 0, + 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&ue->ofdm_demod_stats); +#endif + } + } // for l=1..l2 + + if (subframe_select(&ue->frame_parms,next_subframe_rx) != SF_UL) + { + //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,subframe_rx,next_subframe_slot0,pilot0); + front_end_fft(ue, + pilot0, + next_subframe_slot0, + 0, + 0); + } + + // 2- perform Channel Estimation for slot1 + for (int l=1; lframe_parms.symbols_per_tti>>1; l++) + { + if(l == pilot1) + { + //wait until channel estimation for pilot0/slot1 is available + uint32_t wait = 0; + while(proc->chan_est_pilot0_slot1_available == 0) + { + usleep(1); + wait++; + } + //printf("[slot1 dl processing] ChanEst symbol %d slot %d wait%d\n",l,slot1,wait); + } + //printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,subframe_rx,slot1,l); + front_end_chanEst(ue, + l, + slot1, + 0); + ue_measurement_procedures(l-1,ue,proc,0,1+(subframe_rx<<1),0,ue->mode); + } + //printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,subframe_rx,next_subframe_slot0,pilot0); + front_end_chanEst(ue, + pilot0, + next_subframe_slot0, + 0); + + if ( (subframe_rx == 0) && (ue->decode_MIB == 1)) + { + ue_pbch_procedures(0,ue,proc,0); + } + + proc->chan_est_slot1_available = 1; + //printf("Set available slot 1channelEst to 1 AbsSubframe %d.%d \n",frame_rx,subframe_rx); + //printf(" [slot1 dl processing] ==> FFT/CHanEst Done for AbsSubframe %d.%d \n", proc->frame_rx, proc->subframe_rx); + + //printf(" [slot1 dl processing] ==> Start LLR Comuptation slot1 for AbsSubframe %d.%d \n", proc->frame_rx, proc->subframe_rx); + + +#if UE_TIMING_TRACE + stop_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1].p_time/(cpuf*1000.0)); +#endif + +#endif + + + //wait until pdcch is decoded + uint32_t wait = 0; + while(proc->dci_slot0_available == 0) + { + usleep(1); + wait++; + } + //printf("[slot1 dl processing] AbsSubframe %d.%d LLR Computation Start wait DCI %d\n",frame_rx,subframe_rx,wait); + + + /**** Pdsch Procedure Slot1 ****/ + // start slot1 thread for Pdsch Procedure (slot1) + // do procedures for C-RNTI + //printf("AbsSubframe %d.%d Pdsch Procedure (slot1)\n",frame_rx,subframe_rx); + + +#if UE_TIMING_TRACE + start_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); +#endif + // start slave thread for Pdsch Procedure (slot1) + // do procedures for C-RNTI + uint8_t eNB_id = 0; + uint8_t abstraction_flag = 0; + if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active == 1) { + //wait until first ofdm symbol is processed + //wait = 0; + //while(proc->first_symbol_available == 0) + //{ + // usleep(1); + // wait++; + //} + //printf("[slot1 dl processing] AbsSubframe %d.%d LLR Computation Start wait First Ofdm Sym %d\n",frame_rx,subframe_rx,wait); + + //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); + ue_pdsch_procedures(ue, + proc, + eNB_id, + PDSCH, + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0], + NULL, + (ue->frame_parms.symbols_per_tti>>1), + ue->frame_parms.symbols_per_tti-1, + abstraction_flag); + LOG_D(PHY," ------ end PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); + LOG_D(PHY," ------ --> PDSCH Turbo Decoder slot 0/1: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); + } + + // do procedures for SI-RNTI + if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) { + ue_pdsch_procedures(ue, + proc, + eNB_id, + SI_PDSCH, + ue->dlsch_SI[eNB_id], + NULL, + (ue->frame_parms.symbols_per_tti>>1), + ue->frame_parms.symbols_per_tti-1, + abstraction_flag); + } + + // do procedures for P-RNTI + if ((ue->dlsch_p[eNB_id]) && (ue->dlsch_p[eNB_id]->active == 1)) { + ue_pdsch_procedures(ue, + proc, + eNB_id, + P_PDSCH, + ue->dlsch_p[eNB_id], + NULL, + (ue->frame_parms.symbols_per_tti>>1), + ue->frame_parms.symbols_per_tti-1, + abstraction_flag); + } + // do procedures for RA-RNTI + if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) { + ue_pdsch_procedures(ue, + proc, + eNB_id, + RA_PDSCH, + ue->dlsch_ra[eNB_id], + NULL, + (ue->frame_parms.symbols_per_tti>>1), + ue->frame_parms.symbols_per_tti-1, + abstraction_flag); + } + + proc->llr_slot1_available=1; + //printf("Set available LLR slot1 to 1 AbsSubframe %d.%d \n",frame_rx,subframe_rx); + +#if UE_TIMING_TRACE + stop_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot1: LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[AbsSFN %d.%d] Slot1: LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1].p_time/(cpuf*1000.0)); +#endif +#endif + + + if (pthread_mutex_lock(&proc->mutex_slot1_dl_processing) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" ); + exit_fun("noting to add"); + } + proc->instance_cnt_slot1_dl_processing--; + if (pthread_mutex_unlock(&proc->mutex_slot1_dl_processing) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE FEP Slo1\n" ); + exit_fun("noting to add"); + } + } + // thread finished + free(arg); + return &UE_dl_slot1_processing_retval; +} +#endif + +#ifdef UE_SLOT_PARALLELISATION +int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id, + uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode, + relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) { + + int l,l2; + int pmch_flag=0; + int frame_rx = proc->frame_rx; + int subframe_rx = proc->subframe_rx; + uint8_t pilot0; + uint8_t pilot1; + uint8_t slot0; + uint8_t slot1; + uint8_t first_ofdm_sym; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN); + +#if T_TRACER + T(T_UE_PHY_DL_TICK, T_INT(ue->Mod_id), T_INT(frame_rx%1024), T_INT(subframe_rx)); + + T(T_UE_PHY_INPUT_SIGNAL, T_INT(ue->Mod_id), T_INT(frame_rx%1024), T_INT(subframe_rx), T_INT(0), + T_BUFFER(&ue->common_vars.rxdata[0][subframe_rx*ue->frame_parms.samples_per_tti], + ue->frame_parms.samples_per_tti * 4)); +#endif + + // start timers +#ifdef UE_DEBUG_TRACE + LOG_I(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, subframe_rx); +#endif + +#if UE_TIMING_TRACE + start_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]); + start_meas(&ue->ue_front_end_stat[ue->current_thread_id[subframe_rx]]); +#endif + + pmch_flag = is_pmch_subframe(frame_rx,subframe_rx,&ue->frame_parms) ? 1 : 0; + + if (do_pdcch_flag) { + // deactivate reception until we scan pdcch + if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]) + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active = 0; + if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][1]) + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][1]->active = 0; + + if (ue->dlsch_SI[eNB_id]) + ue->dlsch_SI[eNB_id]->active = 0; + if (ue->dlsch_p[eNB_id]) + ue->dlsch_p[eNB_id]->active = 0; + if (ue->dlsch_ra[eNB_id]) + ue->dlsch_ra[eNB_id]->active = 0; + } + +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n", + (r_type == multicast_relay) ? "RN/UE" : "UE", + ue->Mod_id,frame_rx, subframe_rx); +#endif + + + + + if (subframe_select(&ue->frame_parms,subframe_rx) == SF_S) { // S-subframe, do first 5 symbols only + l2 = 5; + } else if (pmch_flag == 1) { // do first 2 symbols only + l2 = 1; + } else { // normal subframe, last symbol to be processed is the first of the second slot + l2 = (ue->frame_parms.symbols_per_tti/2)-1; + } + + int prev_subframe_rx = (subframe_rx - 1)<0? 9: (subframe_rx - 1); + if (subframe_select(&ue->frame_parms,prev_subframe_rx) != SF_DL) { + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // RX processing of symbols l=0...l2 + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + first_ofdm_sym = 0; + } else { + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // RX processing of symbols l=1...l2 (l=0 is done in last scheduling epoch) + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + first_ofdm_sym = 1; + } + slot0 = (subframe_rx<<1); + slot1 = (subframe_rx<<1) + 1; + pilot0 = 0; + if (ue->frame_parms.Ncp == 0) { // normal prefix + pilot1 = 4; + } else { // extended prefix + pilot1 = 3; + } + + //LOG_I(PHY,"Set available channelEst to 0 AbsSubframe %d.%d \n",frame_rx,subframe_rx); + //LOG_I(PHY,"Set available llrs slot1 to 0 AbsSubframe %d.%d \n",frame_rx,subframe_rx); + //LOG_I(PHY,"Set available dci info slot0 to 0 AbsSubframe %d.%d \n",frame_rx,subframe_rx); + proc->chan_est_pilot0_slot1_available=0; + proc->llr_slot1_available=0; + proc->dci_slot0_available=0; + proc->first_symbol_available=0; + proc->chan_est_slot1_available=0; + //proc->channel_level=0; + + if (pthread_mutex_lock(&proc->mutex_slot1_dl_processing) != 0) { + LOG_E( PHY, "[SCHED][UE %d][Slot0] error locking mutex for UE slot1 dl processing\n",ue->Mod_id ); + exit_fun("nothing to add"); + } + + proc->instance_cnt_slot1_dl_processing++; + if (proc->instance_cnt_slot1_dl_processing == 0) + { + LOG_D(PHY,"unblock slot1 dl processing thread blocked on instance_cnt_slot1_dl_processing : %d \n", proc->instance_cnt_slot1_dl_processing ); + if (pthread_cond_signal(&proc->cond_slot1_dl_processing) != 0) { + LOG_E( PHY, "[SCHED][UE %d][Slot0] ERROR pthread_cond_signal for UE slot1 processing thread\n", ue->Mod_id); + exit_fun("nothing to add"); + } + if (pthread_mutex_unlock(&proc->mutex_slot1_dl_processing) != 0) { + LOG_E( PHY, "[SCHED][UE %d][Slot0] error unlocking mutex for UE slot1 dl processing \n",ue->Mod_id ); + exit_fun("nothing to add"); + } + + } else + { + LOG_E( PHY, "[SCHED][UE %d] UE RX thread busy (IC %d)!!\n", ue->Mod_id, proc->instance_cnt_slot1_dl_processing); + if (proc->instance_cnt_slot1_dl_processing > 2) + exit_fun("instance_cnt_slot1_dl_processing > 2"); + } + //AssertFatal(pthread_cond_signal(&proc->cond_slot1_dl_processing) ==0 ,""); + AssertFatal(pthread_mutex_unlock(&proc->mutex_slot1_dl_processing) ==0,""); + + + /**** Slot0 FE Processing ****/ + // I- start main thread for FFT/ChanEst symbol: 0/1 --> 7 +#if UE_TIMING_TRACE + start_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); +#endif + // 1- perform FFT for pilot ofdm symbols first (ofdmSym7 ofdmSym4 or (ofdmSym6 ofdmSym3)) + //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,subframe_rx,slot1,pilot0); + front_end_fft(ue, + pilot0, + slot1, + 0, + 0); + //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,subframe_rx,slot0,pilot1); + front_end_fft(ue, + pilot1, + slot0, + 0, + 0); + //printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,subframe_rx,slot0,pilot1); + front_end_chanEst(ue, + pilot1, + slot0, + 0); + //printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,subframe_rx,slot1,pilot0); + front_end_chanEst(ue, + pilot0, + slot1, + 0); + proc->chan_est_pilot0_slot1_available = 1; + //printf("Set available channelEst to 1 AbsSubframe %d.%d \n",frame_rx,subframe_rx); + + // 2- perform FFT for other ofdm symbols other than pilots + for (l=first_ofdm_sym; l<=l2; l++) + { + if( (l != pilot0) && (l != pilot1)) + { + //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,subframe_rx,slot0,l); +#if UE_TIMING_TRACE + start_meas(&ue->ofdm_demod_stats); +#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); + front_end_fft(ue, + l, + slot0, + 0, + 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&ue->ofdm_demod_stats); +#endif + } + } // for l=1..l2 + + // 3- perform Channel Estimation for slot0 + for (l=first_ofdm_sym; l<=l2; l++) + { + if( (l != pilot0) && (l != pilot1)) + { + //printf("AbsSubframe %d.%d ChanEst slot %d, symbol %d\n", frame_rx,subframe_rx,slot0,l); + front_end_chanEst(ue, + l, + slot0, + 0); + } + ue_measurement_procedures(l-1,ue,proc,eNB_id,(subframe_rx<<1),abstraction_flag,mode); + } + + if (do_pdcch_flag) { +#if UE_TIMING_TRACE + start_meas(&ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]]); +#endif + if (ue_pdcch_procedures(eNB_id,ue,proc,abstraction_flag) == -1) { + LOG_E(PHY,"[UE %d] Frame %d, subframe %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,subframe_rx); +#if UE_TIMING_TRACE + stop_meas(&ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot0: PDCCH %5.2f \n",frame_rx,subframe_rx,ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[AbsSFN %d.%d] Slot0: PDCCH %5.2f \n",frame_rx,subframe_rx,ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#endif +#endif + //proc->dci_slot0_available = 1; + return(-1); + } + //proc->dci_slot0_available=1; +#if UE_TIMING_TRACE + stop_meas(&ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot0: PDCCH %5.2f \n",frame_rx,subframe_rx,ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[AbsSFN %d.%d] Slot0: PDCCH %5.2f \n",frame_rx,subframe_rx,ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#endif +#endif + } + + //printf("num_pdcch_symbols %d\n",ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols); + + // first slot has been processed (FFTs + Channel Estimation, PCFICH/PHICH/PDCCH) +#if UE_TIMING_TRACE + stop_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[AbsSFN %d.%d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); +#endif +#endif + + //wait until slot1 FE is done + uint32_t wait = 0; + while(proc->chan_est_slot1_available == 0) + { + usleep(1); + wait++; + } + +#if UE_TIMING_TRACE + stop_meas(&ue->ue_front_end_stat[ue->current_thread_id[subframe_rx]]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] FULL FE Processing %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[AbsSFN %d.%d] FULL FE Processing %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); +#endif +#endif + /**** End Subframe FE Processing ****/ + + +#if 0 + //Trigger LLR parallelized for Slot 1 + proc->dci_slot0_available=1; + printf("Set available dci slot0 to 1 AbsSubframe %d.%d \n",frame_rx%1024,subframe_rx); +#endif + + /**** Pdsch Procedure Slot0 ****/ + // start main thread for Pdsch Procedure (slot0) + // do procedures for C-RNTI + //printf("AbsSubframe %d.%d Pdsch Procedure (slot0)\n",frame_rx%1024,subframe_rx); + //printf("AbsSubframe %d.%d Pdsch Procedure PDSCH Active %d \n",frame_rx%1024,subframe_rx, ue->dlsch[ue->current_thread_id[subframe_rx]][0][0]->active); + +#if UE_TIMING_TRACE + start_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]); +#endif + +#if UE_TIMING_TRACE + start_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); +#endif + if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active == 1) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); + ue_pdsch_procedures(ue, + proc, + eNB_id, + PDSCH, + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0], + NULL, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + (ue->frame_parms.symbols_per_tti>>1)-1, + abstraction_flag); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT); + } + + // do procedures for SI-RNTI + if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_IN); + ue_pdsch_procedures(ue, + proc, + eNB_id, + SI_PDSCH, + ue->dlsch_SI[eNB_id], + NULL, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + (ue->frame_parms.symbols_per_tti>>1)-1, + abstraction_flag); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_OUT); + } + + // do procedures for SI-RNTI + if ((ue->dlsch_p[eNB_id]) && (ue->dlsch_p[eNB_id]->active == 1)) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_IN); + ue_pdsch_procedures(ue, + proc, + eNB_id, + P_PDSCH, + ue->dlsch_p[eNB_id], + NULL, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + (ue->frame_parms.symbols_per_tti>>1)-1, + abstraction_flag); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_OUT); + } + + // do procedures for RA-RNTI + if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_IN); + ue_pdsch_procedures(ue, + proc, + eNB_id, + RA_PDSCH, + ue->dlsch_ra[eNB_id], + NULL, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + (ue->frame_parms.symbols_per_tti>>1)-1, + abstraction_flag); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_OUT); + } + +#if 1 + // LLR linear + proc->dci_slot0_available=1; + //printf("Set available dci slot0 to 1 AbsSubframe %d.%d \n",frame_rx%1024,subframe_rx); +#endif + +#if UE_TIMING_TRACE + stop_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Slot0: LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[AbsSFN %d.%d] Slot0: LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0)); +#endif +#endif + + + //wait until LLR Slot1 is done + wait = 0; + while(proc->llr_slot1_available == 0) + { + usleep(1); + wait++; + } + + + +#if UE_TIMING_TRACE + stop_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Full LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[AbsSFN %d.%d] Full LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#endif +#endif + //printf("[slot0 dl processing] AbsSubframe %d.%d Channel Decoder Start wait %d\n",frame_rx,subframe_rx,wait); + + + //=====================================================================// +#if UE_TIMING_TRACE + start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); +#endif + + LOG_D(PHY,"==> Start Turbo Decoder active dlsch %d SI %d RA %d \n",ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active, + ue->dlsch_SI[eNB_id]->active, + //ue->dlsch_p[eNB_id]->active, + ue->dlsch_ra[eNB_id]->active); + // Start Turbo decoder + if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active == 1) { + //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); + ue_dlsch_procedures(ue, + proc, + eNB_id, + PDSCH, + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0], + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][1], + &ue->dlsch_errors[eNB_id], + mode, + abstraction_flag); + //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT); + } + + // do procedures for SI-RNTI + if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) { + ue_dlsch_procedures(ue, + proc, + eNB_id, + SI_PDSCH, + ue->dlsch_SI[eNB_id], + NULL, + &ue->dlsch_SI_errors[eNB_id], + mode, + abstraction_flag); + ue->dlsch_SI[eNB_id]->active = 0; + } + + // do procedures for P-RNTI + if ((ue->dlsch_p[eNB_id]) && (ue->dlsch_p[eNB_id]->active == 1)) { + ue_dlsch_procedures(ue, + proc, + eNB_id, + P_PDSCH, + ue->dlsch_p[eNB_id], + NULL, + &ue->dlsch_p_errors[eNB_id], + mode, + abstraction_flag); + ue->dlsch_p[eNB_id]->active = 0; + } + // do procedures for RA-RNTI + if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) { + ue_dlsch_procedures(ue, + proc, + eNB_id, + RA_PDSCH, + ue->dlsch_ra[eNB_id], + NULL, + &ue->dlsch_ra_errors[eNB_id], + mode, + abstraction_flag); + ue->dlsch_ra[eNB_id]->active = 0; + } + +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); +#if DISABLE_LOG_X + printf("[AbsSFN %d.%d] Channel Decoder: %5.2f \n",frame_rx,subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[AbsSFN %d.%d] Channel Decoder: %5.2f \n",frame_rx,subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#endif + +#endif + + // duplicate harq structure + uint8_t current_harq_pid = ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->current_harq_pid; + LTE_DL_UE_HARQ_t *current_harq_processes = ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->harq_processes[current_harq_pid]; + harq_status_t *current_harq_ack = &ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->harq_ack[subframe_rx]; + + // For Debug parallelisation + //if (current_harq_ack->ack == 0) { + //printf("[slot0 dl processing][End of Channel Decoding] AbsSubframe %d.%d Decode Fail for HarqId%d Round%d\n",frame_rx,subframe_rx,current_harq_pid,current_harq_processes->round); + //} + for(uint8_t rx_th_idx=1; rx_th_idxdlsch[ue->current_thread_id[(subframe_rx+rx_th_idx)%10]][eNB_id][0]->harq_processes[current_harq_pid]; + harq_status_t *harq_ack_dest = &ue->dlsch[ue->current_thread_id[(subframe_rx+rx_th_idx)%10]][eNB_id][0]->harq_ack[subframe_rx]; + + copy_harq_proc_struct(harq_processes_dest, current_harq_processes); + copy_ack_struct(harq_ack_dest, current_harq_ack); + + } + /* + LTE_DL_UE_HARQ_t *harq_processes_dest = ue->dlsch[(subframe_rx+1)%RX_NB_TH][eNB_id][0]->harq_processes[current_harq_pid]; + LTE_DL_UE_HARQ_t *harq_processes_dest1 = ue->dlsch[(subframe_rx+2)%RX_NB_TH][eNB_id][0]->harq_processes[current_harq_pid]; + + harq_status_t *current_harq_ack = &ue->dlsch[subframe_rx%RX_NB_TH][eNB_id][0]->harq_ack[subframe_rx]; + harq_status_t *harq_ack_dest = &ue->dlsch[(subframe_rx+1)%RX_NB_TH][eNB_id][0]->harq_ack[subframe_rx]; + harq_status_t *harq_ack_dest1 = &ue->dlsch[(subframe_rx+2)%RX_NB_TH][eNB_id][0]->harq_ack[subframe_rx]; + + copy_harq_proc_struct(harq_processes_dest, current_harq_processes); + copy_ack_struct(harq_ack_dest, current_harq_ack); + + copy_harq_proc_struct(harq_processes_dest1, current_harq_processes); + copy_ack_struct(harq_ack_dest1, current_harq_ack); + */ + if (subframe_rx==9) { + if (frame_rx % 10 == 0) { + if ((ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]) != 0) + ue->dlsch_fer[eNB_id] = (100*(ue->dlsch_errors[eNB_id] - ue->dlsch_errors_last[eNB_id]))/(ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]); + + ue->dlsch_errors_last[eNB_id] = ue->dlsch_errors[eNB_id]; + ue->dlsch_received_last[eNB_id] = ue->dlsch_received[eNB_id]; + } + + + ue->bitrate[eNB_id] = (ue->total_TBS[eNB_id] - ue->total_TBS_last[eNB_id])*100; + ue->total_TBS_last[eNB_id] = ue->total_TBS[eNB_id]; + LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n", + ue->Mod_id,frame_rx,ue->total_TBS[eNB_id], + ue->total_TBS_last[eNB_id],(float) ue->bitrate[eNB_id]/1000.0); + +#if UE_AUTOTEST_TRACE + if ((frame_rx % 100 == 0)) { + LOG_I(PHY,"[UE %d] AUTOTEST Metric : UE_DLSCH_BITRATE = %5.2f kbps (frame = %d) \n", ue->Mod_id, (float) ue->bitrate[eNB_id]/1000.0, frame_rx); + } +#endif + + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); + +#if UE_TIMING_TRACE + stop_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]); +#if DISABLE_LOG_X + printf("------FULL RX PROC [AbsSFN %d.%d]: %5.2f ------\n",frame_rx,subframe_rx,ue->phy_proc_rx[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "------FULL RX PROC [AbsSFN %d.%d]: %5.2f ------\n",frame_rx,subframe_rx,ue->phy_proc_rx[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#endif +#endif + + LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, subframe_rx); + return (0); +} +#endif + + +int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id, + uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode, + relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) { + + int l,l2; + int pilot1; + int pmch_flag=0; + int frame_rx = proc->frame_rx; + int subframe_rx = proc->subframe_rx; + + uint8_t next1_thread_id = ue->current_thread_id[subframe_rx]== (RX_NB_TH-1) ? 0:(ue->current_thread_id[subframe_rx]+1); + uint8_t next2_thread_id = next1_thread_id== (RX_NB_TH-1) ? 0:(next1_thread_id+1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN); +#if T_TRACER + T(T_UE_PHY_DL_TICK, T_INT(ue->Mod_id), T_INT(frame_rx%1024), T_INT(subframe_rx)); - start_meas(&phy_vars_ue->phy_proc_rx); -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX(%d)\n", - (r_type == multicast_relay) ? "RN/UE" : "UE", - phy_vars_ue->Mod_id,frame_rx, subframe_rx, slot_rx); + T(T_UE_PHY_INPUT_SIGNAL, T_INT(ue->Mod_id), T_INT(frame_rx%1024), T_INT(subframe_rx), T_INT(0), + T_BUFFER(&ue->common_vars.rxdata[0][subframe_rx*ue->frame_parms.samples_per_tti], + ue->frame_parms.samples_per_tti * 4)); #endif -#ifdef EMOS - if ((slot_rx == 0)) { - if (frame_rx%1024 == 0) - openair_daq_vars.use_ia_receiver = 0; - else - openair_daq_vars.use_ia_receiver = (openair_daq_vars.use_ia_receiver+1)%3; + // start timers +#ifdef UE_DEBUG_TRACE + LOG_I(PHY," ****** start RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, subframe_rx); +#endif - LOG_D(PHY,"[MYEMOS] frame %d, IA receiver %d, MCS %d, bitrate %d\n", - frame_rx, - openair_daq_vars.use_ia_receiver, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs, - phy_vars_ue->bitrate[eNB_id]); +#if UE_TIMING_TRACE + start_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]); + start_meas(&ue->generic_stat); +#endif + + pmch_flag = is_pmch_subframe(frame_rx,subframe_rx,&ue->frame_parms) ? 1 : 0; + + if (do_pdcch_flag) { + // deactivate reception until we scan pdcch + if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]) + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active = 0; + if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][1]) + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][1]->active = 0; + + if (ue->dlsch_SI[eNB_id]) + ue->dlsch_SI[eNB_id]->active = 0; + if (ue->dlsch_p[eNB_id]) + ue->dlsch_p[eNB_id]->active = 0; + if (ue->dlsch_ra[eNB_id]) + ue->dlsch_ra[eNB_id]->active = 0; } +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n", + (r_type == multicast_relay) ? "RN/UE" : "UE", + ue->Mod_id,frame_rx, subframe_rx); #endif - if (phy_vars_ue->lte_frame_parms.Ncp == 0) { // normal prefix + if (ue->frame_parms.Ncp == 0) { // normal prefix pilot1 = 4; - pilot2 = 7; - pilot3 = 11; } else { // extended prefix pilot1 = 3; - pilot2 = 6; - pilot3 = 9; } - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - if (subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx) == SF_S) { - if ((slot_rx%2)==0) - n_symb = 5;//3; - else - n_symb = 0; + + if (subframe_select(&ue->frame_parms,subframe_rx) == SF_S) { // S-subframe, do first 5 symbols only + l2 = 5; + } else if (pmch_flag == 1) { // do first 2 symbols only + l2 = 1; + } else { // normal subframe, last symbol to be processed is the first of the second slot + l2 = (ue->frame_parms.symbols_per_tti/2)-1; + } + + int prev_subframe_rx = (subframe_rx - 1)<0? 9: (subframe_rx - 1); + if (subframe_select(&ue->frame_parms,prev_subframe_rx) != SF_DL) { + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // RX processing of symbols l=0...l2 + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + l=0; } else { - /* - if (is_pmch_subframe(frame_rx,subframe_rx,&phy_vars_ue->lte_frame_parms)) { - if ((slot_rx%2)==0) { - n_symb=2; - pmch_flag=1; - } - else - n_symb=0; - } - else*/ - n_symb = phy_vars_ue->lte_frame_parms.symbols_per_tti/2; + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // RX processing of symbols l=1...l2 (l=0 is done in last scheduling epoch) + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + l=1; } - //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // This is normal processing (i.e. not MBSFN) - // RX processing of symbols in slot_rx - - - - for (l=0; l FFT/ChannelEst/PDCCH slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); + for (; l<=l2; l++) { if (abstraction_flag == 0) { - start_meas(&phy_vars_ue->ofdm_demod_stats); +#if UE_TIMING_TRACE + start_meas(&ue->ofdm_demod_stats); +#endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); - - slot_fep(phy_vars_ue, - l, - slot_rx, - phy_vars_ue->rx_offset, - 0, - 0); + slot_fep(ue, + l, + (subframe_rx<<1), + 0, + 0, + 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->ofdm_demod_stats); +#if UE_TIMING_TRACE + stop_meas(&ue->ofdm_demod_stats); +#endif } - //if (subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx) == SF_DL) - lte_ue_measurement_procedures(l,phy_vars_ue,eNB_id,abstraction_flag,mode); + ue_measurement_procedures(l-1,ue,proc,eNB_id,(subframe_rx<<1),abstraction_flag,mode); + if (do_pdcch_flag) { + if ((l==pilot1) || + ((pmch_flag==1)&(l==l2))) { + LOG_D(PHY,"[UE %d] Frame %d: Calling pdcch procedures (eNB %d)\n",ue->Mod_id,frame_rx,eNB_id); - if ((slot_rx==1) && (l==4-phy_vars_ue->lte_frame_parms.Ncp)) { - - /* - phy_vars_ue->ulsch_no_allocation_counter[eNB_id]++; - - if (phy_vars_ue->ulsch_no_allocation_counter[eNB_id] == 10) { - #ifdef DEBUG_PHY_PROC - msg("[UE %d] no_allocation : setting mode to PRACH\n",phy_vars_ue->Mod_id); - #endif - phy_vars_ue->UE_mode[eNB_id] = PRACH; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti = 0x1234; - } - */ - - lte_ue_pbch_procedures(eNB_id,phy_vars_ue,abstraction_flag); - - /* - if (phy_vars_ue->UE_mode[eNB_id] == RA_RESPONSE) { - phy_vars_ue->Msg3_timer[eNB_id]--; - msg("[UE RAR] frame %d: Msg3_timer %d\n",frame_rx,phy_vars_ue->Msg3_timer); - - if (phy_vars_ue->Msg3_timer[eNB_id] == 0) { - LOG_D(PHY,"[UE %d] Frame %d: Msg3_timer = 0 : setting mode to PRACH\n",phy_vars_ue->Mod_id,frame_rx); - // I guess here we also need to tell the RRC - phy_vars_ue->UE_mode[eNB_id] = PRACH; - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti = 0x1234; - } - } - */ - } - -#ifdef DLSCH_THREAD - if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1) { - // activate thread since Chest is now done for slot before slot_rx - if (l==0) { - LOG_I(PHY,"frame %d, slot_rx %d: Calling rx_pdsch_thread for harq_pid %d\n",frame_rx,slot_rx, phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid); - - if (pthread_mutex_lock (&rx_pdsch_mutex) != 0) { // Signal MAC_PHY Scheduler - LOG_E(PHY,"[UE %d] ERROR pthread_mutex_lock\n",phy_vars_ue->Mod_id); // lock before accessing shared resource - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - } else { - rx_pdsch_instance_cnt++; - (slot_rx == 0) ? (rx_pdsch_slot = 19) : (rx_pdsch_slot = (slot_rx-1)); - pthread_mutex_unlock (&rx_pdsch_mutex); - - if (rx_pdsch_instance_cnt == 0) { - if (pthread_cond_signal(&rx_pdsch_cond) != 0) { - LOG_E(PHY,"[UE %d] ERROR pthread_cond_signal for rx_pdsch_cond\n",phy_vars_ue->Mod_id); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - } - } else { - LOG_W(PHY,"[UE %d] Frame=%d, Slot=%d, RX_PDSCH thread for rx_pdsch_thread busy!!!\n",phy_vars_ue->Mod_id,frame_rx,slot_rx); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - } - } - - // trigger DLSCH decoding thread - if ((slot_rx%2)==1) // odd slots - phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0; - } - } - -#endif - - // process last DLSCH symbols + invoke decoding - if (((slot_rx%2)==0) && (l==0)) { - // Regular PDSCH - LOG_D(PHY,"[UE %d] dlsch->active in subframe %d => %d\n",phy_vars_ue->Mod_id,subframe_prev,phy_vars_ue->dlsch_ue[eNB_id][0]->active); - - if (phy_vars_ue->dlsch_ue[eNB_id][0]->active == 1) { -#ifndef DLSCH_THREAD //USER_MODE - harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid; - LOG_D(PHY,"[UE %d] PDSCH active in subframe %d, harq_pid %d\n",phy_vars_ue->Mod_id,subframe_prev,harq_pid); - - if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && - (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver ==1)) { - dual_stream_UE = 1; - eNB_id_i = phy_vars_ue->n_connected_eNB; - i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; - - if (frame_rx%100==0) { - LOG_I(PHY,"using IA receiver\n"); - } - } else { - dual_stream_UE = 0; - eNB_id_i = eNB_id+1; - i_mod = 0; - } - - // process symbols 10,11,12 and trigger DLSCH decoding - if (abstraction_flag == 0) { - - start_meas(&phy_vars_ue->dlsch_llr_stats); - - for (m=pilot3; mlte_frame_parms.symbols_per_tti; m++) { - - rx_pdsch(phy_vars_ue, - PDSCH, - eNB_id, - eNB_id_i, - subframe_prev, // subframe - m, // symbol - 0, // first_symbol_flag - dual_stream_UE, - i_mod, - phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid); - } - - stop_meas(&phy_vars_ue->dlsch_llr_stats); - } - - phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0; - - //#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d Scheduling DLSCH decoding\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - harq_pid, - (subframe_prev == 9) ? (frame_rx-1) : frame_rx,subframe_prev); - //#endif - - if (phy_vars_ue->dlsch_ue[eNB_id][0]) { - if (abstraction_flag == 0) { - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - frame_rx,subframe_prev); - start_meas(&phy_vars_ue->dlsch_unscrambling_stats); - dlsch_unscrambling(&phy_vars_ue->lte_frame_parms, - 0, - phy_vars_ue->dlsch_ue[0][0], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G, - phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0], - 0, - subframe_prev<<1); - stop_meas(&phy_vars_ue->dlsch_unscrambling_stats); - - start_meas(&phy_vars_ue->dlsch_decoding_stats); - ret = dlsch_decoding(phy_vars_ue, - phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid], - subframe_prev, - harq_pid, - 1,phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb>10 ? 1 : 0); - stop_meas(&phy_vars_ue->dlsch_decoding_stats); - } - - else { - LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); -#ifdef PHY_ABSTRACTION - ret = dlsch_decoding_emul(phy_vars_ue, - subframe_prev, - 2, - eNB_id); -#endif - } - - if (ret == (1+phy_vars_ue->dlsch_ue[eNB_id][0]->max_turbo_iterations)) { - phy_vars_ue->dlsch_errors[eNB_id]++; - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - harq_pid,frame_rx,subframe_prev, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); -/* - if (abstraction_flag ==0 ) - dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid); - mac_xface->macphy_exit(""); -*/ -#endif - } else { - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - harq_pid,frame_rx,subframe_prev,slot_rx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); -#ifdef DEBUG_PHY_PROC -#ifdef DEBUG_DLSCH - int j; - LOG_D(PHY,"dlsch harq_pid %d (rx): \n",phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid); - - for (j=0; jdlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b[j]); - - LOG_T(PHY,"\n"); -#endif -#endif - if (phy_vars_ue->mac_enabled == 1) { - mac_xface->ue_send_sdu(phy_vars_ue->Mod_id, - CC_id, - frame_rx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->b, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS>>3, - eNB_id); - } - phy_vars_ue->total_TBS[eNB_id] = phy_vars_ue->total_TBS[eNB_id] + - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS; - phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_TBS[eNB_id] + - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS; - } - } - - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid, - frame_rx,subframe_prev,ret, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); - - if (frame_rx%100==0) { - LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - frame_rx,subframe_prev, - phy_vars_ue->dlsch_errors[eNB_id], - phy_vars_ue->dlsch_received[eNB_id], - phy_vars_ue->dlsch_fer[eNB_id], - phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB_id]); - } - -#endif -#endif //DLSCH_THREAD - } else { - // printf("PDSCH inactive in subframe %d\n",subframe_rx-1); - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[subframe_prev].send_harq_status = 0; - } - - // SI_DLSCH - if (phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"SI is active in subframe %d\n",subframe_prev); -#endif - - // process symbols 10,11,12 (13) of last SF and trigger DLSCH decoding - if (abstraction_flag==0) { - start_meas(&phy_vars_ue->dlsch_llr_stats); - - for (m=pilot3; mlte_frame_parms.symbols_per_tti; m++) { -#ifdef DEBUG_PHY_PROC - - LOG_D(PHY,"[UE %d] Frame %d, slot %d: DLSCH (SI) demod between pilot 3 and 4 (2nd slot), m %d\n", - phy_vars_ue->Mod_id,frame_rx,slot_rx,m); - -#endif - rx_pdsch(phy_vars_ue, - SI_PDSCH, - eNB_id, - eNB_id+1, - subframe_prev, // subframe, - m, - 0, - 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid); - } - - stop_meas(&phy_vars_ue->dlsch_llr_stats); - } - - // write_output("dlsch_ra_llr.m","llr",lte_ue_pdsch_vars_ra[eNB_id]->llr[0],40,1,0); - - phy_vars_ue->dlsch_ue_SI[eNB_id]->active = 0; - - if (frame_rx < phy_vars_ue->dlsch_SI_errors[eNB_id]) - phy_vars_ue->dlsch_SI_errors[eNB_id]=0; - - if (phy_vars_ue->dlsch_ue_SI[eNB_id]) { - - if (abstraction_flag==0) { - - // dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G = - get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even, - 2, - 1, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - frame_rx,subframe_prev); - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols); -#endif - - - dlsch_unscrambling(&phy_vars_ue->lte_frame_parms, - 0, - phy_vars_ue->dlsch_ue_SI[eNB_id], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G, - phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0], - 0, - subframe_prev<<1); - - ret = dlsch_decoding(phy_vars_ue, - phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_SI[eNB_id], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0], - subframe_prev, - phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid, - 0,0); - -#ifdef DEBUG_PHY_PROC - - for (int i=0; i<11; i++) - LOG_D(PHY,"dlsch_output_buffer[%d]=%x\n",i,phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->c[0][i]); - -#endif - - } - -#ifdef PHY_ABSTRACTION - else { - LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); - ret = dlsch_decoding_emul(phy_vars_ue, - subframe_prev, - 0, - eNB_id); - } - -#endif - - if (ret == (1+phy_vars_ue->dlsch_ue_SI[eNB_id]->max_turbo_iterations)) { - phy_vars_ue->dlsch_SI_errors[eNB_id]++; -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI in error (TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n", - phy_vars_ue->Mod_id, - frame_rx, - subframe_prev, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rvidx, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]); -#endif - - // dump_dlsch_SI(phy_vars_ue,eNB_id,subframe_prev); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_rx); - return(-1); - } else { - - -#ifdef DEBUG_PHY_PROC - //if ((frame_rx % 100) == 0) - LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received SI for TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n", - phy_vars_ue->Mod_id,frame_rx,subframe_prev, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rvidx, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2], - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]); -#endif - - if (phy_vars_ue->mac_enabled == 1) { - /* - printf("\n\n"); - for (i=0;idlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3;i++) - printf("%02x ",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b[i]); - printf("\n"); - */ - mac_xface->ue_decode_si(phy_vars_ue->Mod_id, - CC_id, - frame_rx, - eNB_id, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->b, - phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS>>3); - } - } - } - - /* - #ifdef DEBUG_PHY_PROC - debug_LOG_D(PHY,"[UE %d] Frame %d, slot %d: dlsch_decoding (SI) ret %d (%d errors)\n", - phy_vars_ue->Mod_id,frame_rx,slot_rx,ret,phy_vars_ue->dlsch_SI_errors[eNB_id]); - #endif - */ - } - - - if (phy_vars_ue->dlsch_ue_ra[eNB_id]->active == 1) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d: DLSCH (RA) demod symbols 10,11,12\n",phy_vars_ue->Mod_id,frame_rx,slot_rx); -#endif - - // process symbols 10,11,12 and trigger DLSCH decoding - if (abstraction_flag==0) { - start_meas(&phy_vars_ue->dlsch_llr_stats); - - for (m=pilot3; mlte_frame_parms.symbols_per_tti; m++) - rx_pdsch(phy_vars_ue, - RA_PDSCH, - eNB_id, - eNB_id+1, - subframe_prev, // subframe, - m, // symbol - 0, // first_symbol_flag - 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid); - } - - stop_meas(&phy_vars_ue->dlsch_llr_stats); - - phy_vars_ue->dlsch_ue_ra[eNB_id]->active = 0; - - if (frame_rx < phy_vars_ue->dlsch_ra_errors[eNB_id]) - phy_vars_ue->dlsch_ra_errors[eNB_id]=0; - - if (phy_vars_ue->prach_resources[eNB_id]!=NULL) - phy_vars_ue->dlsch_ue_ra[eNB_id]->rnti = phy_vars_ue->prach_resources[eNB_id]->ra_RNTI; - else { - LOG_E(PHY,"[UE %d] Frame %d, subframe %d: FATAL, prach_resources is NULL\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev); - mac_xface->macphy_exit("prach_resources is NULL"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_rx); - return 0; - } - - if (abstraction_flag==0) { - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc_even, - 2, - 1, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - frame_rx, - subframe_prev); - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE] decoding RA (subframe %d): G %d,rnti %x\n" ,subframe_prev, - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G, - phy_vars_ue->dlsch_ue_ra[eNB_id]->rnti); -#endif - - dlsch_unscrambling(&phy_vars_ue->lte_frame_parms, - 0, - phy_vars_ue->dlsch_ue_ra[eNB_id], - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G, - phy_vars_ue->lte_ue_pdsch_vars_ra[eNB_id]->llr[0], - 0, - subframe_prev<<1); - - ret = dlsch_decoding(phy_vars_ue, - phy_vars_ue->lte_ue_pdsch_vars_ra[eNB_id]->llr[0], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_ra[eNB_id], - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0], - subframe_prev, // subframe - phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid, - 0,0); - } - -#ifdef PHY_ABSTRACTION - else { - LOG_D(PHY,"Calling dlsch_decoding_emul ...\n"); - ret = dlsch_decoding_emul(phy_vars_ue, - subframe_prev, - 1, - eNB_id); - } - -#endif - - if (ret == (1+phy_vars_ue->dlsch_ue_ra[eNB_id]->max_turbo_iterations)) { - phy_vars_ue->dlsch_ra_errors[eNB_id]++; - LOG_D(PHY,"[UE %d] Frame %d, subframe %d, received RA in error\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev); -#ifdef USER_MODE - //dump_dlsch_ra(phy_vars_ue,eNB_id,subframe_prev); -#endif - // oai_exit=1; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_rx); - return(-1); - - } else { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Received RAR mode %d\n", - phy_vars_ue->Mod_id, - frame_rx, - subframe_prev, phy_vars_ue->UE_mode[eNB_id]); -#endif - - if (phy_vars_ue->mac_enabled == 1) { - if ((phy_vars_ue->UE_mode[eNB_id] != PUSCH) && (phy_vars_ue->prach_resources[eNB_id]->Msg3!=NULL)) { - LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n", - phy_vars_ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0), - subframe_prev, - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex); - - timing_advance = mac_xface->ue_process_rar(phy_vars_ue->Mod_id, - CC_id, - frame_rx-((subframe_prev==0) ? 1 : 0), - phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b, - &phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex); - - - if (timing_advance!=0xffff) { - - LOG_D(PHY,"[UE %d][RAPROC] Frame %d subframe %d Got rnti %x and timing advance %d from RAR\n", - phy_vars_ue->Mod_id, - frame_rx-((subframe_prev==9) ? 1 : 0), - subframe_prev, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, - timing_advance); - - //timing_advance = 0; - process_timing_advance_rar(phy_vars_ue,timing_advance); - - if (mode!=debug_prach) { - phy_vars_ue->ulsch_ue_Msg3_active[eNB_id]=1; - get_Msg3_alloc(&phy_vars_ue->lte_frame_parms, - subframe_prev, - frame_rx-((subframe_prev==9) ? 1 : 0), - &phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id], - &phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]); - - LOG_D(PHY,"[UE %d][RAPROC] Got Msg3_alloc Frame %d subframe %d: Msg3_frame %d, Msg3_subframe %d\n", - phy_vars_ue->Mod_id, - frame_rx-((subframe_prev==9) ? 1 : 0), - subframe_prev, - phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id], - phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]); - harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id], - phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]); - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round = 0; - - phy_vars_ue->UE_mode[eNB_id] = RA_RESPONSE; - // phy_vars_ue->Msg3_timer[eNB_id] = 10; - phy_vars_ue->ulsch_ue[eNB_id]->power_offset = 6; - phy_vars_ue->ulsch_no_allocation_counter[eNB_id] = 0; - } - } else { // PRACH preamble doesn't match RAR - LOG_W(PHY,"[UE %d][RAPROC] Received RAR preamble (%d) doesn't match !!!\n", - phy_vars_ue->Mod_id, - phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex); - } - } // mode != PUSCH - } - else { - rar = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b+1; - timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); - //timing_advance = phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->b[0]; - process_timing_advance_rar(phy_vars_ue,timing_advance); - } - } //ret <= MAX_ITERATIONS - - /* - #ifdef DEBUG_PHY_PROC - debug_LOG_D(PHY,"[UE %d] Frame %d, slot %d: dlsch_decoding (RA) ret %d (%d errors)\n", - phy_vars_ue->Mod_id,frame_rx,slot_rx,ret,phy_vars_ue->dlsch_ra_errors[eNB_id]); - #endif - */ - } // dlsch_ue_ra[eNB_id]->active == 1 - - } - - - if ((((slot_rx%2)==0) && ((l==pilot1))) || - ((pmch_flag==1)&&(l==1))) { - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] Frame %d, slot %d: Calling pdcch procedures (eNB %d)\n",phy_vars_ue->Mod_id,frame_rx,slot_rx,eNB_id); -#endif - - // rt_printk("[PDCCH] Frame %d, slot %d, start %llu\n",frame_rx,slot_rx,rt_get_time_ns()); - if (lte_ue_pdcch_procedures(eNB_id,phy_vars_ue,abstraction_flag) == -1) { -#ifdef DEBUG_PHY_PROC - LOG_E(PHY,"[UE %d] Frame %d, slot %d: Error in pdcch procedures\n",phy_vars_ue->Mod_id,frame_rx,slot_rx); -#endif + //start_meas(&ue->rx_pdcch_stats[ue->current_thread_id[subframe_rx]]); + if (ue_pdcch_procedures(eNB_id,ue,proc,abstraction_flag) == -1) { + LOG_E(PHY,"[UE %d] Frame %d, subframe %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,subframe_rx); return(-1); + } + //stop_meas(&ue->rx_pdcch_stats[ue->current_thread_id[subframe_rx]]); + //printf("subframe %d n_pdcch_sym %d pdcch procedures %5.3f \n", + // subframe_rx, ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + // (ue->rx_pdcch_stats[ue->current_thread_id[subframe_rx]].p_time)/(cpuf*1000.0)); + LOG_D(PHY,"num_pdcch_symbols %d\n",ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols); } - - - // rt_printk("[PDCCH] Frame %d, slot %d, stop %llu\n",frame_rx,slot_rx,rt_get_time_ns()); -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"num_pdcch_symbols %d\n",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols); -#endif } - if (abstraction_flag==0) { + } // for l=1..l2 + ue_measurement_procedures(l-1,ue,proc,eNB_id,(subframe_rx<<1),abstraction_flag,mode); - if (((slot_rx%2)==1) && (l==0)) { - start_meas(&phy_vars_ue->dlsch_llr_stats); - - for (m=phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols; - mdlsch_ue[eNB_id][0]->active == 1) { - harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid; - LOG_D(PHY,"[UE %d] PDSCH active in subframe %d (%d), harq_pid %d\n",phy_vars_ue->Mod_id,subframe_rx,slot_rx,harq_pid); - - if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && - (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver ==1)) { - dual_stream_UE = 1; - eNB_id_i = phy_vars_ue->n_connected_eNB; - i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; - } else { - dual_stream_UE = 0; - eNB_id_i = eNB_id+1; - i_mod = 0; - } - - // process DLSCH received in first slot - - rx_pdsch(phy_vars_ue, - PDSCH, - eNB_id, - eNB_id_i, - subframe_rx, // subframe, - m, - (m==phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag - dual_stream_UE, - i_mod, - phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid); - } // CRNTI active - -#endif - - if (phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1) { - // process SI DLSCH in first slot - rx_pdsch(phy_vars_ue, - SI_PDSCH, - eNB_id, - eNB_id+1, - subframe_rx, // subframe, - m, - (m==phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag - 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid); - } // SI active - - if (phy_vars_ue->dlsch_ue_ra[eNB_id]->active == 1) { - rx_pdsch(phy_vars_ue, - RA_PDSCH, - eNB_id, - eNB_id+1, - subframe_rx, // subframe, - m, - (m==phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, - 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid); - } // RA active - } // loop from first dlsch symbol to end of slot - - stop_meas(&phy_vars_ue->dlsch_llr_stats); - } // 2nd quarter - - if (((slot_rx%2)==1) && (l==pilot1)) { - start_meas(&phy_vars_ue->dlsch_llr_stats); - - for (m=pilot2; mdlsch_ue[eNB_id][0]->active == 1) { - harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid; - - if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && - (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver ==1)) { - dual_stream_UE = 1; - eNB_id_i = phy_vars_ue->n_connected_eNB; - i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm; - } else { - dual_stream_UE = 0; - eNB_id_i = eNB_id+1; - i_mod = 0; - } - - rx_pdsch(phy_vars_ue, - PDSCH, - eNB_id, - eNB_id_i, - subframe_rx, // subframe, - m, - 0, - dual_stream_UE, - i_mod, - phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid); - } // CRNTI active - -#endif - - if(phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1) { - rx_pdsch(phy_vars_ue, - SI_PDSCH, - eNB_id, - eNB_id+1, - subframe_rx, // subframe, - m, - 0, // first_symbol_flag - 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid); - } // SI active - - if (phy_vars_ue->dlsch_ue_ra[eNB_id]->active == 1) { - rx_pdsch(phy_vars_ue, - RA_PDSCH, - eNB_id, - eNB_id+1, - subframe_rx, // subframe, - m, - 0, // first_symbol_flag - 0, - phy_vars_ue->is_secondary_ue, - phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid); - } // RA active - - } // loop over 3rd quarter - - stop_meas(&phy_vars_ue->dlsch_llr_stats); - } // 3rd quarter of subframe - } // abstraction_flag==0 - }// l loop - - // calculate some statistics - if (slot_rx==19) { - if (frame_rx % 10 == 0) { - if ((phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]) != 0) - phy_vars_ue->dlsch_fer[eNB_id] = (100*(phy_vars_ue->dlsch_errors[eNB_id] - phy_vars_ue->dlsch_errors_last[eNB_id]))/(phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]); - - phy_vars_ue->dlsch_errors_last[eNB_id] = phy_vars_ue->dlsch_errors[eNB_id]; - phy_vars_ue->dlsch_received_last[eNB_id] = phy_vars_ue->dlsch_received[eNB_id]; - } - - phy_vars_ue->bitrate[eNB_id] = (phy_vars_ue->total_TBS[eNB_id] - phy_vars_ue->total_TBS_last[eNB_id])*100; - phy_vars_ue->total_TBS_last[eNB_id] = phy_vars_ue->total_TBS[eNB_id]; - LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n", - phy_vars_ue->Mod_id,frame_rx,phy_vars_ue->total_TBS[eNB_id], - phy_vars_ue->total_TBS_last[eNB_id],(float) phy_vars_ue->bitrate[eNB_id]/1000.0); - /* - if ((frame_rx % 100 == 0)) { - LOG_I(PHY,"Throughput %5.1f kbps\n",(float) phy_vars_ue->bitrate[eNB_id]/1000.0); - } - */ + LOG_D(PHY," ------ end FFT/ChannelEst/PDCCH slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); + // If this is PMCH, call procedures and return + if (pmch_flag == 1) { + ue_pmch_procedures(ue,proc,eNB_id,abstraction_flag); + return 0; } - if (is_pmch_subframe((subframe_rx==9?-1:0)+frame_rx,subframe_rx,&phy_vars_ue->lte_frame_parms)) { - LOG_D(PHY,"ue calling pmch subframe ..\n "); - - if ((slot_rx%2)==1) { - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation(%d)\n", - phy_vars_ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,slot_rx); -#ifdef Rel10 - pmch_mcs = mac_xface->ue_query_mch(phy_vars_ue->Mod_id, - CC_id, - (subframe_rx==9?-1:0)+frame_rx, - subframe_rx, - eNB_id, - &sync_area, - &mcch_active); - - if (phy_vars_rn) - phy_vars_rn->mch_avtive[subframe_rx]=0; + slot_fep(ue, + 0, + 1+(subframe_rx<<1), + 0, + 0, + 0); + // first slot has been processed (FFTs + Channel Estimation, PCFICH/PHICH/PDCCH) +#if UE_TIMING_TRACE + stop_meas(&ue->generic_stat); +#if DISABLE_LOG_X + printf("[SFN %d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0)); #else - pmch_mcs=-1; + LOG_D(PHY, "[SFN %d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0)); #endif - if (pmch_mcs>=0) { - LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Programming PMCH demodulation for mcs %d\n",phy_vars_ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,pmch_mcs); - fill_UE_dlsch_MCH(phy_vars_ue,pmch_mcs,1,0,0); - - if (abstraction_flag == 0 ) { - for (l=2; l<12; l++) { - - slot_fep_mbsfn(phy_vars_ue, - l, - subframe_rx, - 0,0);//phy_vars_ue->rx_offset,0); - } - - for (l=2; l<12; l++) { - rx_pmch(phy_vars_ue, - 0, - subframe_rx, - l); - - - } - - /* printf("PMCH decoding, Frame %d, subframe %d, G %d\n", - (subframe_rx==9?-1:0)+frame_rx, - subframe_rx, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G); - */ - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G = get_G(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->nb_rb, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->rb_alloc_even, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->Qm, - 1, - 2, - (subframe_rx==9?-1:0)+frame_rx,subframe_rx); - - dlsch_unscrambling(&phy_vars_ue->lte_frame_parms,1,phy_vars_ue->dlsch_ue_MCH[0], - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G, - phy_vars_ue->lte_ue_pdsch_vars_MCH[0]->llr[0],0,subframe_prev<<1); - - ret = dlsch_decoding(phy_vars_ue, - phy_vars_ue->lte_ue_pdsch_vars_MCH[0]->llr[0], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue_MCH[0], - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0], - subframe_prev, - 0, - 0,1); - } else { // abstraction -#ifdef PHY_ABSTRACTION - ret = dlsch_decoding_emul(phy_vars_ue, - subframe_rx, - 5, // PMCH - eNB_id); -#endif - } - - if (mcch_active == 1) - phy_vars_ue->dlsch_mcch_trials[sync_area][0]++; - else - phy_vars_ue->dlsch_mtch_trials[sync_area][0]++; - - if (ret == (1+phy_vars_ue->dlsch_ue_MCH[0]->max_turbo_iterations)) { - if (mcch_active == 1) - phy_vars_ue->dlsch_mcch_errors[sync_area][0]++; - else - phy_vars_ue->dlsch_mtch_errors[sync_area][0]++; - - LOG_D(PHY,"[%s %d] Frame %d, subframe %d: PMCH in error (%d,%d), not passing to L2 (TBS %d, iter %d,G %d)\n", - (r_type == no_relay)? "UE": "RN/UE", phy_vars_ue->Mod_id, - (subframe_rx==9?-1:0)+frame_rx,subframe_rx, - phy_vars_ue->dlsch_mcch_errors[sync_area][0], - phy_vars_ue->dlsch_mtch_errors[sync_area][0], - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3, - phy_vars_ue->dlsch_ue_MCH[0]->max_turbo_iterations, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G); - dump_mch(phy_vars_ue,0,phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G,subframe_rx); -#ifdef DEBUG_DLSCH - - for (int i=0; idlsch_ue_MCH[0]->harq_processes[0]->TBS>>3; i++) { - LOG_T(PHY,"%02x.",phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->c[0][i]); - } - - LOG_T(PHY,"\n"); #endif - if (subframe_rx==9) - mac_xface->macphy_exit("Why are we exiting here?"); - } else { -#ifdef Rel10 - - if ((r_type == no_relay) || (mcch_active == 1)) { - mac_xface->ue_send_mch_sdu(phy_vars_ue->Mod_id, - CC_id, - frame_rx, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->b, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3, - eNB_id,// not relevant in eMBMS context - sync_area); - /* for (i=0;idlsch_ue_MCH[0]->harq_processes[0]->TBS>>3;i++) - msg("%2x.",phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->b[i]); - msg("\n"); - */ - - if (mcch_active == 1) - phy_vars_ue->dlsch_mcch_received[sync_area][0]++; - else - phy_vars_ue->dlsch_mtch_received[sync_area][0]++; - - - if (phy_vars_ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) { - phy_vars_ue->dlsch_mch_received_sf[subframe_rx%5][0]=0; - } else { - phy_vars_ue->dlsch_mch_received[0]+=1; - phy_vars_ue->dlsch_mch_received_sf[subframe_rx][0]=1; - } - - } else if (r_type == multicast_relay) { // mcch is not active here - // only 1 harq process exists - // Fix me: this could be a pointer copy - memcpy (phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->b, - phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS>>3); - // keep the tbs - phy_vars_rn->mch_avtive[subframe_rx] = 1; - phy_vars_rn->sync_area[subframe_rx] = sync_area; // this could also go the harq data struct - phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS = phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->TBS; - phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs = phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->mcs; - LOG_D(PHY,"[RN/UE %d] Frame %d subframe %d: store the MCH PDU for MBSFN sync area %d (MCS %d, TBS %d)\n", - phy_vars_ue->Mod_id, frame_rx,subframe_rx,sync_area, - phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs, - phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3); -#ifdef DEBUG_PHY - - for (int i=0; idlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3; i++) - msg("%02x ",phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b[i]); - - msg("\n"); + LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat); #endif - } else - LOG_W(PHY,"[UE %d] Frame %d: not supported option\n",phy_vars_ue->Mod_id, frame_rx); + // do procedures for C-RNTI + if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active == 1) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); + ue_pdsch_procedures(ue, + proc, + eNB_id, + PDSCH, + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0], + NULL, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + ue->frame_parms.symbols_per_tti>>1, + abstraction_flag); -#endif - } - } - } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT); } -#ifdef EMOS - phy_procedures_emos_UE_RX(phy_vars_ue,slot_rx,eNB_id); + LOG_D(PHY," ------ end PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); + // do procedures for SI-RNTI + if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_IN); + ue_pdsch_procedures(ue, + + proc, + eNB_id, + SI_PDSCH, + ue->dlsch_SI[eNB_id], + NULL, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + ue->frame_parms.symbols_per_tti>>1, + abstraction_flag); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_OUT); + } + + // do procedures for SI-RNTI + if ((ue->dlsch_p[eNB_id]) && (ue->dlsch_p[eNB_id]->active == 1)) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_IN); + ue_pdsch_procedures(ue, + proc, + eNB_id, + P_PDSCH, + ue->dlsch_p[eNB_id], + NULL, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + ue->frame_parms.symbols_per_tti>>1, + abstraction_flag); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_P, VCD_FUNCTION_OUT); + } + + // do procedures for RA-RNTI + if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_IN); + ue_pdsch_procedures(ue, + proc, + eNB_id, + RA_PDSCH, + ue->dlsch_ra[eNB_id], + NULL, + ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols, + ue->frame_parms.symbols_per_tti>>1, + abstraction_flag); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_RA, VCD_FUNCTION_OUT); + } + + LOG_D(PHY," ------ slot 1 Processing: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); + LOG_D(PHY," ------ --> FFT/ChannelEst/PDCCH slot 1: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); + + if (subframe_select(&ue->frame_parms,subframe_rx) != SF_S) { // do front-end processing for second slot, and first symbol of next subframe + for (l=1; lframe_parms.symbols_per_tti>>1; l++) { + if (abstraction_flag == 0) { +#if UE_TIMING_TRACE + start_meas(&ue->ofdm_demod_stats); +#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN); + slot_fep(ue, + l, + 1+(subframe_rx<<1), + 0, + 0, + 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&ue->ofdm_demod_stats); +#endif + } + + ue_measurement_procedures(l-1,ue,proc,eNB_id,1+(subframe_rx<<1),abstraction_flag,mode); + + } // for l=1..l2 + + // do first symbol of next downlink subframe for channel estimation + int next_subframe_rx = (1+subframe_rx)%10; + if (subframe_select(&ue->frame_parms,next_subframe_rx) != SF_UL) + { + slot_fep(ue, + 0, + (next_subframe_rx<<1), + 0, + 0, + 0); + } + } // not an S-subframe +#if UE_TIMING_TRACE + stop_meas(&ue->generic_stat); +#if DISABLE_LOG_X + printf("[SFN %d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[SFN %d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0)); +#endif + +#endif + + LOG_D(PHY," ------ end FFT/ChannelEst/PDCCH slot 1: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); + + if ( (subframe_rx == 0) && (ue->decode_MIB == 1)) + { + ue_pbch_procedures(eNB_id,ue,proc,abstraction_flag); + } + + + + // do procedures for C-RNTI + LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); + if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active == 1) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN); +#if UE_TIMING_TRACE + start_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]); +#endif + ue_pdsch_procedures(ue, + proc, + eNB_id, + PDSCH, + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0], + NULL, + 1+(ue->frame_parms.symbols_per_tti>>1), + ue->frame_parms.symbols_per_tti-1, + abstraction_flag); + LOG_D(PHY," ------ end PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); + LOG_D(PHY," ------ --> PDSCH Turbo Decoder slot 0/1: AbsSubframe %d.%d ------ \n", frame_rx%1024, subframe_rx); +#if UE_TIMING_TRACE + stop_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]); + start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); +#endif + ue_dlsch_procedures(ue, + proc, + eNB_id, + PDSCH, + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0], + ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][1], + &ue->dlsch_errors[eNB_id], + mode, + abstraction_flag); +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]); +#if DISABLE_LOG_X + printf("[SFN %d] Slot1: Pdsch Proc %5.2f\n",subframe_rx,ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); + printf("[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "[SFN %d] Slot1: Pdsch Proc %5.2f\n",subframe_rx,ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); + LOG_D(PHY, "[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#endif + +#endif + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT); + + } +#if UE_TIMING_TRACE + start_meas(&ue->generic_stat); +#endif + +#if 0 + if(subframe_rx==5 && ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->harq_processes[ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->current_harq_pid]->nb_rb > 20){ + //write_output("decoder_llr.m","decllr",dlsch_llr,G,1,0); + //write_output("llr.m","llr", &ue->pdsch_vars[eNB_id]->llr[0][0],(14*nb_rb*12*dlsch1_harq->Qm) - 4*(nb_rb*4*dlsch1_harq->Qm),1,0); + + write_output("rxdataF0_current.m" , "rxdataF0", &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF[0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); + //write_output("rxdataF0_previous.m" , "rxdataF0_prev_sss", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); + + //write_output("rxdataF0_previous.m" , "rxdataF0_prev", &ue->common_vars.common_vars_rx_data_per_thread[next_thread_id].rxdataF[0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); + + write_output("dl_ch_estimates.m", "dl_ch_estimates_sfn5", &ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].dl_ch_estimates[0][0][0],14*ue->frame_parms.ofdm_symbol_size,1,1); + write_output("dl_ch_estimates_ext.m", "dl_ch_estimatesExt_sfn5", &ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->dl_ch_estimates_ext[0][0],14*ue->frame_parms.N_RB_DL*12,1,1); + write_output("rxdataF_comp00.m","rxdataF_comp00", &ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->rxdataF_comp0[0][0],14*ue->frame_parms.N_RB_DL*12,1,1); + //write_output("magDLFirst.m", "magDLFirst", &phy_vars_ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->dl_ch_mag0[0][0],14*frame_parms->N_RB_DL*12,1,1); + //write_output("magDLSecond.m", "magDLSecond", &phy_vars_ue->pdsch_vars[ue->current_thread_id[subframe_rx]][0]->dl_ch_magb0[0][0],14*frame_parms->N_RB_DL*12,1,1); + + AssertFatal (0,""); + } +#endif + + // do procedures for SI-RNTI + if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) { + ue_pdsch_procedures(ue, + proc, + eNB_id, + SI_PDSCH, + ue->dlsch_SI[eNB_id], + NULL, + 1+(ue->frame_parms.symbols_per_tti>>1), + ue->frame_parms.symbols_per_tti-1, + abstraction_flag); + + ue_dlsch_procedures(ue, + proc, + eNB_id, + SI_PDSCH, + ue->dlsch_SI[eNB_id], + NULL, + &ue->dlsch_SI_errors[eNB_id], + mode, + abstraction_flag); + ue->dlsch_SI[eNB_id]->active = 0; + } + + // do procedures for P-RNTI + if ((ue->dlsch_p[eNB_id]) && (ue->dlsch_p[eNB_id]->active == 1)) { + ue_pdsch_procedures(ue, + proc, + eNB_id, + P_PDSCH, + ue->dlsch_p[eNB_id], + NULL, + 1+(ue->frame_parms.symbols_per_tti>>1), + ue->frame_parms.symbols_per_tti-1, + abstraction_flag); + + ue_dlsch_procedures(ue, + proc, + eNB_id, + P_PDSCH, + ue->dlsch_p[eNB_id], + NULL, + &ue->dlsch_p_errors[eNB_id], + mode, + abstraction_flag); + ue->dlsch_p[eNB_id]->active = 0; + } + // do procedures for RA-RNTI + if ((ue->dlsch_ra[eNB_id]) && (ue->dlsch_ra[eNB_id]->active == 1)) { + ue_pdsch_procedures(ue, + proc, + eNB_id, + RA_PDSCH, + ue->dlsch_ra[eNB_id], + NULL, + 1+(ue->frame_parms.symbols_per_tti>>1), + ue->frame_parms.symbols_per_tti-1, + abstraction_flag); + ue_dlsch_procedures(ue, + proc, + eNB_id, + RA_PDSCH, + ue->dlsch_ra[eNB_id], + NULL, + &ue->dlsch_ra_errors[eNB_id], + mode, + abstraction_flag); + ue->dlsch_ra[eNB_id]->active = 0; + } + + // duplicate harq structure + + uint8_t current_harq_pid = ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->current_harq_pid; + LTE_DL_UE_HARQ_t *current_harq_processes = ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->harq_processes[current_harq_pid]; + LTE_DL_UE_HARQ_t *harq_processes_dest = ue->dlsch[next1_thread_id][eNB_id][0]->harq_processes[current_harq_pid]; + LTE_DL_UE_HARQ_t *harq_processes_dest1 = ue->dlsch[next2_thread_id][eNB_id][0]->harq_processes[current_harq_pid]; + + harq_status_t *current_harq_ack = &ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->harq_ack[subframe_rx]; + harq_status_t *harq_ack_dest = &ue->dlsch[next1_thread_id][eNB_id][0]->harq_ack[subframe_rx]; + harq_status_t *harq_ack_dest1 = &ue->dlsch[next2_thread_id][eNB_id][0]->harq_ack[subframe_rx]; + + copy_harq_proc_struct(harq_processes_dest, current_harq_processes); + copy_ack_struct(harq_ack_dest, current_harq_ack); + + copy_harq_proc_struct(harq_processes_dest1, current_harq_processes); + copy_ack_struct(harq_ack_dest1, current_harq_ack); + + if (subframe_rx==9) { + if (frame_rx % 10 == 0) { + if ((ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]) != 0) + ue->dlsch_fer[eNB_id] = (100*(ue->dlsch_errors[eNB_id] - ue->dlsch_errors_last[eNB_id]))/(ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]); + + ue->dlsch_errors_last[eNB_id] = ue->dlsch_errors[eNB_id]; + ue->dlsch_received_last[eNB_id] = ue->dlsch_received[eNB_id]; + } + + + ue->bitrate[eNB_id] = (ue->total_TBS[eNB_id] - ue->total_TBS_last[eNB_id])*100; + ue->total_TBS_last[eNB_id] = ue->total_TBS[eNB_id]; + LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n", + ue->Mod_id,frame_rx,ue->total_TBS[eNB_id], + ue->total_TBS_last[eNB_id],(float) ue->bitrate[eNB_id]/1000.0); + + #if UE_AUTOTEST_TRACE + if ((frame_rx % 100 == 0)) { + LOG_I(PHY,"[UE %d] AUTOTEST Metric : UE_DLSCH_BITRATE = %5.2f kbps (frame = %d) \n", ue->Mod_id, (float) ue->bitrate[eNB_id]/1000.0, frame_rx); + } + #endif + + } + +#if UE_TIMING_TRACE + stop_meas(&ue->generic_stat); + printf("after tubo until end of Rx %5.2f \n",ue->generic_stat.p_time/(cpuf*1000.0)); #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - stop_meas(&phy_vars_ue->phy_proc_rx); + +#if UE_TIMING_TRACE + stop_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]); +#if DISABLE_LOG_X + printf("------FULL RX PROC [SFN %d]: %5.2f ------\n",subframe_rx,ue->phy_proc_rx[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#else + LOG_D(PHY, "------FULL RX PROC [SFN %d]: %5.2f ------\n",subframe_rx,ue->phy_proc_rx[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0)); +#endif +#endif + + LOG_D(PHY," ****** end RX-Chain for AbsSubframe %d.%d ****** \n", frame_rx%1024, subframe_rx); return (0); } -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) + int phy_procedures_RN_UE_RX(uint8_t slot_rx, uint8_t next_slot, relaying_type_t r_type) { @@ -3462,138 +5148,8 @@ int phy_procedures_RN_UE_RX(uint8_t slot_rx, uint8_t next_slot, relaying_type_t } #endif - -#if defined(ENABLE_ITTI) -# if ENABLE_RAL -extern PHY_MEASUREMENTS PHY_measurements; - -void phy_UE_lte_measurement_thresholds_test_and_report(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP, uint16_t valP) -{ - MessageDef *message_p = NULL; - - if ( - ( - (((short) threshold_phy_pP->threshold.threshold_val < (short) valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_ABOVE_THRESHOLD)) || - (((short)threshold_phy_pP->threshold.threshold_val > (short)valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_BELOW_THRESHOLD)) - ) || - (threshold_phy_pP->threshold.threshold_xdir == RAL_NO_THRESHOLD) - ) { - message_p = itti_alloc_new_message(TASK_PHY_UE , PHY_MEAS_REPORT_IND); - memset(&PHY_MEAS_REPORT_IND(message_p), 0, sizeof(PHY_MEAS_REPORT_IND(message_p))); - - memcpy(&PHY_MEAS_REPORT_IND (message_p).threshold, - &threshold_phy_pP->threshold, - sizeof(PHY_MEAS_REPORT_IND (message_p).threshold)); - - memcpy(&PHY_MEAS_REPORT_IND (message_p).link_param, - &threshold_phy_pP->link_param, - sizeof(PHY_MEAS_REPORT_IND (message_p).link_param)); - - switch (threshold_phy_pP->link_param.choice) { - case RAL_LINK_PARAM_CHOICE_LINK_PARAM_VAL: - PHY_MEAS_REPORT_IND (message_p).link_param._union.link_param_val = valP; - break; - - case RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL: - //PHY_MEAS_REPORT_IND (message_p).link_param._union.qos_param_val. - AssertFatal (1 == 0, "TO DO RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL\n"); - break; - } - - //LOG_I(PHY,"[XXX] Sending link parameters report msg message to RRC\n"); - itti_send_msg_to_task(TASK_RRC_UE, instanceP, message_p); - } -} - -void phy_UE_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP) -{ - unsigned int mod_id; - int CC_id = 0; // this should become the function argument, requested by the upper layers. - - mod_id = instanceP - NB_eNB_INST; - - switch (threshold_phy_pP->link_param.link_param_type.choice) { - - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_GEN_DATA_RATE: - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH: - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_SINR: - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0); - break; - - case RAL_LINK_PARAM_GEN_THROUGHPUT: - break; - - default: - ; - } - - break; - - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) { - case RAL_LINK_PARAM_LTE_UE_RSRP: - // phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id]->PHY_measurements.rx_rssi_dBm[0]); - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id][CC_id]->PHY_measurements.rsrp[0]); - break; - - case RAL_LINK_PARAM_LTE_UE_RSRQ: - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id][CC_id]->PHY_measurements.rsrq[0]); - break; - - case RAL_LINK_PARAM_LTE_UE_CQI: - phy_UE_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, PHY_vars_UE_g[mod_id][CC_id]->PHY_measurements.wideband_cqi_avg[0]); - break; - - case RAL_LINK_PARAM_LTE_AVAILABLE_BW: - break; - - case RAL_LINK_PARAM_LTE_PACKET_DELAY: - break; - - case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE: - break; - - case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS: - break; - - case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES: - break; - - case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY: - break; - - case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY: - break; - - case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS: - break; - - case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW: - break; - - default: - LOG_W(PHY,"unknown message %d\n", threshold_phy_pP->link_param.link_param_type._union.link_param_gen); - } - - break; - - default: - LOG_W(PHY,"unknown message %d\n", threshold_phy_pP->link_param.link_param_type.choice); - } -} -# endif -#endif - -void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode, - relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) +void phy_procedures_UE_lte(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,uint8_t do_pdcch_flag,runmode_t mode, + relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) { #if defined(ENABLE_ITTI) MessageDef *msg_p; @@ -3602,34 +5158,25 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr unsigned int Mod_id; int result; #endif -# if ENABLE_RAL - int CC_id =0; -#endif - int frame_rx = phy_vars_ue->frame_rx; - int frame_tx = phy_vars_ue->frame_tx; - int slot_rx = phy_vars_ue->slot_rx; - int slot_tx = phy_vars_ue->slot_tx; - int subframe_tx = slot_tx>>1; - int subframe_rx = slot_rx>>1; + + int frame_rx = proc->frame_rx; + int frame_tx = proc->frame_tx; + int subframe_rx = proc->subframe_rx; + int subframe_tx = proc->subframe_tx; #undef DEBUG_PHY_PROC UE_L2_STATE_t ret; + int slot; - if (phy_vars_ue->mac_enabled == 0) { - phy_vars_ue->UE_mode[eNB_id]=PUSCH; - phy_vars_ue->prach_resources[eNB_id] = &prach_resources_local; - prach_resources_local.ra_RNTI = 0xbeef; - prach_resources_local.ra_PreambleIndex = 0; + if (ue->mac_enabled == 0) { + ue->UE_mode[eNB_id]=PUSCH; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,1); -#if defined(EXMIMO) -#ifndef OAI_USRP - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[0].rxcnt_ptr[0])); +#if UE_TIMING_TRACE + start_meas(&ue->phy_proc[ue->current_thread_id[subframe_rx]]); #endif -#endif - start_meas(&phy_vars_ue->phy_proc); #if defined(ENABLE_ITTI) do { @@ -3643,145 +5190,14 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr switch (ITTI_MSG_ID(msg_p)) { case PHY_FIND_CELL_REQ: - LOG_I(PHY, "[UE %d] Received %s\n", Mod_id, msg_name); + LOG_I(PHY, "[UE %d] Received %s\n", Mod_id, msg_name); - /* TODO process the message */ -# if ENABLE_RAL - { - MessageDef *message_p; - - message_p = itti_alloc_new_message(TASK_PHY_UE , PHY_FIND_CELL_IND); - memset(&PHY_FIND_CELL_IND(message_p), 0, sizeof(PHY_FIND_CELL_IND(message_p))); - PHY_FIND_CELL_IND (message_p).transaction_id = PHY_FIND_CELL_REQ(msg_p).transaction_id; - PHY_FIND_CELL_IND (message_p).cell_nb = 1; - PHY_FIND_CELL_IND (message_p).cells[0].earfcn = 1; - PHY_FIND_CELL_IND (message_p).cells[0].cell_id = 06; - PHY_FIND_CELL_IND (message_p).cells[0].rsrp = 39; - PHY_FIND_CELL_IND (message_p).cells[0].rsrq = 39; - - itti_send_msg_to_task(TASK_RRC_UE, instance, message_p); - - } -# endif - break; - -# if ENABLE_RAL - - case TIMER_HAS_EXPIRED: - // check if it is a measurement timer - { - hashtable_rc_t hashtable_rc; - hashtable_rc = hashtable_is_key_exists(PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id)); - LOG_I(PHY, "[UE %d] Received TIMER HAS EXPIRED: (hash_rc %d, HASH_TABLE_OK %d)\n", Mod_id, hashtable_rc, HASH_TABLE_OK); - - if (hashtable_rc == HASH_TABLE_OK) { - phy_UE_lte_check_measurement_thresholds(instance, (ral_threshold_phy_t*)TIMER_HAS_EXPIRED(msg_p).arg); - } - } - break; - - - case PHY_MEAS_THRESHOLD_REQ: -#warning "TO DO LIST OF THRESHOLDS" - LOG_I(PHY, "[UE %d] Received %s\n", Mod_id, msg_name); - { - ral_threshold_phy_t* threshold_phy_p = NULL; - int index, res; - long timer_id; - hashtable_rc_t hashtable_rc; - - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action) { - - case RAL_TH_ACTION_CANCEL_THRESHOLD: - break; - - case RAL_TH_ACTION_SET_NORMAL_THRESHOLD: - case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD: - for (index = 0; index < PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.num_thresholds; index++) { - threshold_phy_p = calloc(1, sizeof(ral_threshold_phy_t)); - threshold_phy_p->th_action = PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action; - memcpy(&threshold_phy_p->link_param.link_param_type, - &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type, - sizeof(ral_link_param_type_t)); - - memcpy(&threshold_phy_p->threshold, - &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.thresholds[index], - sizeof(ral_threshold_t)); - - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice) { - - case RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL: - switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) { - case RAL_LINK_PARAM_TYPE_CHOICE_GEN: - SLIST_INSERT_HEAD( - &PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen], - threshold_phy_p, - ral_thresholds); - break; - - case RAL_LINK_PARAM_TYPE_CHOICE_LTE: - SLIST_INSERT_HEAD( - &PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte], - threshold_phy_p, - ral_thresholds); - //LOG_E(PHY, "[UE %d] NORMAL/ONE SHOT - TIMER NULL - type LTE in %s\n", Mod_id, msg_name); - break; - - default: - LOG_E(PHY, "[UE %d] BAD PARAMETER cfg_param.link_param_type.choice %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice, msg_name); - } - - break; - - case RAL_LINK_CFG_PARAM_CHOICE_TIMER: - res = timer_setup( - (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval/1000),//uint32_t interval_sec, - (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval%1000),//uint32_t interval_us, - TASK_PHY_UE, - instance, - TIMER_PERIODIC, - threshold_phy_p, - &timer_id); - - if (res == 0) { - hashtable_rc = hashtable_insert(PHY_vars_UE_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p); - - if (hashtable_rc == HASH_TABLE_OK) { - threshold_phy_p->timer_id = timer_id; - LOG_I(PHY, "[UE %d] NORMAL/ONE SHOT - TIMER CHOICE - OK - in Hash %s\n", Mod_id, msg_name); - } else { - LOG_E(PHY, "[UE %d] %s: Error in hashtable. Could not configure threshold index %d \n", - Mod_id, msg_name, index); - } - - } else { - LOG_E(PHY, "[UE %d] %s: Could not configure threshold index %d because of timer initialization failure\n", - Mod_id, msg_name, index); - } - - break; - - default: // already checked in RRC, should not happen here - LOG_E(PHY, "[UE %d] BAD PARAMETER cfg_param.union_choice %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice, msg_name); - } - } - - break; - - default: - LOG_E(PHY, "[UE %d] BAD PARAMETER th_action value %d in %s\n", - Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action, msg_name); - } - - } - break; -# endif + /* TODO process the message */ + break; default: - LOG_E(PHY, "[UE %d] Received unexpected message %s\n", Mod_id, msg_name); - break; + LOG_E(PHY, "[UE %d] Received unexpected message %s\n", Mod_id, msg_name); + break; } result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); @@ -3791,62 +5207,73 @@ void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstr #endif - if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx)==SF_UL)|| - (phy_vars_ue->lte_frame_parms.frame_type == FDD)) { - phy_procedures_UE_TX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type); - } + for (slot=0;slot<2;slot++) { - if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx)==SF_DL) || - (phy_vars_ue->lte_frame_parms.frame_type == FDD)) { -#ifdef Rel10 - - if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 ) -#endif - phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); - } - - if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx)==SF_S) && - ((slot_tx&1)==1)) { - phy_procedures_UE_S_TX(phy_vars_ue,eNB_id,abstraction_flag,r_type); - } - - if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_rx)==SF_S) && - ((slot_rx&1)==0)) { -#ifdef Rel10 - - if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 ) -#endif - phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); - } - - if (phy_vars_ue->mac_enabled==1) { - if (slot_rx%2==0) { - ret = mac_xface->ue_scheduler(phy_vars_ue->Mod_id, - frame_tx, - subframe_rx, - subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx), - eNB_id, - 0/*FIXME CC_id*/); - - if (ret == CONNECTION_LOST) { - LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",phy_vars_ue->Mod_id, - frame_rx,subframe_tx); - phy_vars_ue->UE_mode[eNB_id] = PRACH; - // mac_xface->macphy_exit("Connection lost"); - } else if (ret == PHY_RESYNCH) { - LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, trying to resynch\n", - phy_vars_ue->Mod_id, - frame_rx,subframe_tx); - phy_vars_ue->UE_mode[eNB_id] = RESYNCH; - // mac_xface->macphy_exit("Connection lost"); - } else if (ret == PHY_HO_PRACH) { - LOG_I(PHY,"[UE %d] Frame %d, subframe %d, return to PRACH and perform a contention-free access\n", - phy_vars_ue->Mod_id,frame_rx,subframe_tx); - phy_vars_ue->UE_mode[eNB_id] = PRACH; + if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_UL)|| + (ue->frame_parms.frame_type == FDD)) { + phy_procedures_UE_TX(ue,proc,eNB_id,abstraction_flag,mode,r_type); } - } - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0); - stop_meas(&phy_vars_ue->phy_proc); + if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_DL) || + (ue->frame_parms.frame_type == FDD)) { +#if defined(Rel10) || defined(Rel14) + + if (phy_procedures_RN_UE_RX(subframe_rx, subframe_tx, r_type) != 0 ) +#endif + phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,do_pdcch_flag,mode,r_type,phy_vars_rn); + } + + if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_S) && + (slot==1)) { + phy_procedures_UE_S_TX(ue,eNB_id,abstraction_flag,r_type); + } + + if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_S) && + (slot==0)) { +#if defined(Rel10) || defined(Rel14) + + if (phy_procedures_RN_UE_RX(subframe_rx, subframe_tx, r_type) != 0 ) +#endif + phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,do_pdcch_flag,mode,r_type,phy_vars_rn); + } + + if (ue->mac_enabled==1) { + if (slot==0) { + + //LOG_I(PHY,"[UE %d] Frame %d, subframe %d, star ue_scheduler\n", ue->Mod_id,frame_rx,subframe_tx); + ret = ue_scheduler(ue->Mod_id, + frame_rx, + subframe_rx, + frame_tx, + subframe_tx, + subframe_select(&ue->frame_parms,subframe_tx), + eNB_id, + 0/*FIXME CC_id*/); + + if (ret == CONNECTION_LOST) { + LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",ue->Mod_id, + frame_rx,subframe_tx); + ue->UE_mode[eNB_id] = PRACH; + // mac_xface->macphy_exit("Connection lost"); + } else if (ret == PHY_RESYNCH) { + LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, trying to resynch\n", + ue->Mod_id, + frame_rx,subframe_tx); + ue->UE_mode[eNB_id] = RESYNCH; + // mac_xface->macphy_exit("Connection lost"); + } else if (ret == PHY_HO_PRACH) { + LOG_I(PHY,"[UE %d] Frame %d, subframe %d, return to PRACH and perform a contention-free access\n", + ue->Mod_id,frame_rx,subframe_tx); + ue->UE_mode[eNB_id] = PRACH; + } + } + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0); +#if UE_TIMING_TRACE + stop_meas(&ue->phy_proc[ue->current_thread_id[subframe_rx]]); +#endif + } // slot } + + diff --git a/openair1/SCHED/prach_procedures.c b/openair1/SCHED/prach_procedures.c new file mode 100644 index 0000000000..469f73e3aa --- /dev/null +++ b/openair1/SCHED/prach_procedures.c @@ -0,0 +1,227 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file phy_procedures_lte_eNB.c + * \brief Implementation of eNB procedures from 36.213 LTE specifications + * \author R. Knopp, F. Kaltenberger, N. Nikaein, X. Foukas + * \date 2011 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,navid.nikaein@eurecom.fr, x.foukas@sms.ed.ac.uk + * \note + * \warning + */ + +#include "PHY/defs.h" +#include "PHY/extern.h" +#include "SCHED/defs.h" +#include "SCHED/extern.h" +#include "nfapi_interface.h" +#include "fapi_l1.h" +#include "UTIL/LOG/log.h" +#include "UTIL/LOG/vcd_signal_dumper.h" + +#include "T.h" + +#include "assertions.h" +#include "msc.h" + +#include + +#if defined(ENABLE_ITTI) +# include "intertask_interface.h" +#endif + +extern uint32_t nfapi_mode; + +void prach_procedures(PHY_VARS_eNB *eNB, +#ifdef Rel14 + int br_flag +#endif + ) { + uint16_t max_preamble[4],max_preamble_energy[4],max_preamble_delay[4]; + uint16_t i; + int frame,subframe; + +#ifdef Rel14 + if (br_flag==1) { + subframe = eNB->proc.subframe_prach_br; + frame = eNB->proc.frame_prach_br; + pthread_mutex_lock(&eNB->UL_INFO_mutex); + eNB->UL_INFO.rach_ind_br.rach_indication_body.number_of_preambles=0; + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + } + else +#endif + { + pthread_mutex_lock(&eNB->UL_INFO_mutex); + eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles=0; + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + subframe = eNB->proc.subframe_prach; + frame = eNB->proc.frame_prach; + } + RU_t *ru; + int aa=0; + int ru_aa; + + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); + + + + for (i=0;inum_RU;i++) { + ru=eNB->RU_list[i]; + for (ru_aa=0,aa=0;ru_aanb_rx;ru_aa++,aa++) { + eNB->prach_vars.rxsigF[0][aa] = eNB->RU_list[i]->prach_rxsigF[ru_aa]; +#ifdef Rel14 + int ce_level; + + if (br_flag==1) + for (ce_level=0;ce_level<4;ce_level++) eNB->prach_vars_br.rxsigF[ce_level][aa] = eNB->RU_list[i]->prach_rxsigF_br[ce_level][ru_aa]; +#endif + } + } + + rx_prach(eNB, + eNB->RU_list[0], + &max_preamble[0], + &max_preamble_energy[0], + &max_preamble_delay[0], + frame, + 0 +#ifdef Rel14 + ,br_flag +#endif + ); + + LOG_D(PHY,"[RAPROC] Frame %d, subframe %d : Most likely preamble %d, energy %d dB delay %d (prach_energy counter %d)\n", + frame,subframe, + max_preamble[0], + max_preamble_energy[0]/10, + max_preamble_delay[0], + eNB->prach_energy_counter); + +#ifdef Rel14 + if (br_flag==1) { + + int prach_mask; + + prach_mask = is_prach_subframe(&eNB->frame_parms,eNB->proc.frame_prach_br,eNB->proc.subframe_prach_br); + + eNB->UL_INFO.rach_ind_br.rach_indication_body.preamble_list = eNB->preamble_list_br; + int ind=0; + int ce_level=0; + /* Save for later, it doesn't work + for (int ind=0,ce_level=0;ce_level<4;ce_level++) { + + if ((eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[ce_level]==1)&& + (prach_mask&(1<<(1+ce_level)) > 0) && // prach is active and CE level has finished its repetitions + (eNB->prach_vars_br.repetition_number[ce_level]== + eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[ce_level])) { + */ + if (eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[0]==1){ + if ((eNB->prach_energy_counter == 100) && + (max_preamble_energy[0] > eNB->measurements.prach_I0 + 100)) { + eNB->UL_INFO.rach_ind_br.rach_indication_body.number_of_preambles++; + + eNB->preamble_list_br[ind].preamble_rel8.timing_advance = max_preamble_delay[ind];// + eNB->preamble_list_br[ind].preamble_rel8.preamble = max_preamble[ind]; + // note: fid is implicitly 0 here, this is the rule for eMTC RA-RNTI from 36.321, Section 5.1.4 + eNB->preamble_list_br[ind].preamble_rel8.rnti = 1+subframe+(eNB->prach_vars_br.first_frame[ce_level]%40); + eNB->preamble_list_br[ind].instance_length = 0; //don't know exactly what this is + eNB->preamble_list_br[ind].preamble_rel13.rach_resource_type = 1+ce_level; // CE Level + LOG_D(PHY,"Filling NFAPI indication for RACH %d CELevel %d (mask %x) : TA %d, Preamble %d, rnti %x, rach_resource_type %d\n", + ind, + ce_level, + prach_mask, + eNB->preamble_list_br[ind].preamble_rel8.timing_advance, + eNB->preamble_list_br[ind].preamble_rel8.preamble, + eNB->preamble_list_br[ind].preamble_rel8.rnti, + eNB->preamble_list_br[ind].preamble_rel13.rach_resource_type); + } + /* + ind++; + } + } */// ce_level + } + } + else +#endif + + { + if ((eNB->prach_energy_counter == 100) && + (max_preamble_energy[0] > eNB->measurements.prach_I0+100)) { + + LOG_I(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n", + eNB->Mod_id, + eNB->CC_id, + frame, + subframe, + max_preamble[0], + max_preamble_energy[0]/10, + max_preamble_energy[0]%10, + max_preamble_delay[0]); + + T(T_ENB_PHY_INITIATE_RA_PROCEDURE, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), + T_INT(max_preamble[0]), T_INT(max_preamble_energy[0]), T_INT(max_preamble_delay[0])); + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + + eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles = 1; + eNB->UL_INFO.rach_ind.rach_indication_body.preamble_list = &eNB->preamble_list[0]; + eNB->UL_INFO.rach_ind.rach_indication_body.tl.tag = NFAPI_RACH_INDICATION_BODY_TAG; + eNB->UL_INFO.rach_ind.header.message_id = NFAPI_RACH_INDICATION; + eNB->UL_INFO.rach_ind.sfn_sf = frame<<4 | subframe; + + eNB->preamble_list[0].preamble_rel8.tl.tag = NFAPI_PREAMBLE_REL8_TAG; + eNB->preamble_list[0].preamble_rel8.timing_advance = max_preamble_delay[0]; + eNB->preamble_list[0].preamble_rel8.preamble = max_preamble[0]; + eNB->preamble_list[0].preamble_rel8.rnti = 1+subframe; // note: fid is implicitly 0 here + eNB->preamble_list[0].preamble_rel13.rach_resource_type = 0; + eNB->preamble_list[0].instance_length = 0; //don't know exactly what this is + + if (nfapi_mode == 1) { // If NFAPI PNF then we need to send the message to the VNF + + LOG_D(PHY,"Filling NFAPI indication for RACH : SFN_SF:%d TA %d, Preamble %d, rnti %x, rach_resource_type %d\n", + NFAPI_SFNSF2DEC(eNB->UL_INFO.rach_ind.sfn_sf), + eNB->preamble_list[0].preamble_rel8.timing_advance, + eNB->preamble_list[0].preamble_rel8.preamble, + eNB->preamble_list[0].preamble_rel8.rnti, + eNB->preamble_list[0].preamble_rel13.rach_resource_type); + + oai_nfapi_rach_ind(&eNB->UL_INFO.rach_ind); + + eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles = 0; + } + + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + + } // max_preamble_energy > prach_I0 + 100 + else { + eNB->measurements.prach_I0 = ((eNB->measurements.prach_I0*900)>>10) + ((max_preamble_energy[0]*124)>>10); + if (frame==0) LOG_I(PHY,"prach_I0 = %d.%d dB\n",eNB->measurements.prach_I0/10,eNB->measurements.prach_I0%10); + if (eNB->prach_energy_counter < 100) eNB->prach_energy_counter++; + } + } // else br_flag + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); +} + diff --git a/openair1/SCHED/pucch_pc.c b/openair1/SCHED/pucch_pc.c index afcf4bd5b3..f01d0d96dd 100644 --- a/openair1/SCHED/pucch_pc.c +++ b/openair1/SCHED/pucch_pc.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file pusch_pc.c * \brief Implementation of UE PUSCH Power Control procedures from 36.213 LTE specifications (Section @@ -39,42 +31,46 @@ */ #include "PHY/defs.h" +#include "SCHED/defs.h" #include "PHY/LTE_TRANSPORT/proto.h" #include "PHY/extern.h" -int8_t pucch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt) +int16_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt) { - int8_t Po_PUCCH; + int16_t Po_PUCCH; //uint8_t harq_pid; // P_pucch = P_opucch+ PL + h(nCQI,nHARQ) + delta_pucchF(pucch_fmt) + g(i)) // //if ((pucch_fmt == pucch_format1a) || // (pucch_fmt == pucch_format1b)) { // Update g_pucch based on TPC/delta_PUCCH received in PDCCH for this process - //harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_ack[subframe].harq_id; + //harq_pid = ue->dlsch[eNB_id][0]->harq_ack[subframe].harq_id; //this is now done in dci_tools - //phy_vars_ue->g_pucch[eNB_id] += phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->delta_PUCCH; + //ue->g_pucch[eNB_id] += ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->delta_PUCCH; //} - Po_PUCCH = get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,eNB_id)+ - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH+ - phy_vars_ue->dlsch_ue[eNB_id][0]->g_pucch; + Po_PUCCH = get_PL(ue->Mod_id,ue->CC_id,eNB_id)+ + ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH+ + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->g_pucch; switch (pucch_fmt) { case pucch_format1: case pucch_format2a: case pucch_format2b: - Po_PUCCH += (-2+(phy_vars_ue->lte_frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format1<<1)); + Po_PUCCH += (-2+(ue->frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format1<<1)); break; case pucch_format1a: case pucch_format1b: - Po_PUCCH += (1+(phy_vars_ue->lte_frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format1b<<1)); + case pucch_format1b_csA2: + case pucch_format1b_csA3: + case pucch_format1b_csA4: + Po_PUCCH += (1+(ue->frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format1b<<1)); break; case pucch_format2: - switch (phy_vars_ue->lte_frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format2a) { + switch (ue->frame_parms.ul_power_control_config_common.deltaF_PUCCH_Format2a) { case 0: Po_PUCCH -= 2; break; @@ -93,24 +89,28 @@ int8_t pucch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id } break; + + case pucch_format3: + fprintf(stderr, "PUCCH format 3 not handled\n"); + abort(); } if (pucch_fmt!=pucch_format1) { - LOG_I(PHY,"[UE %d][PDSCH %x] frame %d, subframe %d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB, g_pucch %d dB\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,phy_vars_ue->frame_tx,subframe, + LOG_D(PHY,"[UE %d][PDSCH %x] AbsSubframe %d.%d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB, g_pucch %d dB\n", + ue->Mod_id, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti,proc->frame_tx%1024,subframe, Po_PUCCH, - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH, - get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,eNB_id), - phy_vars_ue->dlsch_ue[eNB_id][0]->g_pucch); + ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, + get_PL(ue->Mod_id,ue->CC_id,eNB_id), + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->g_pucch); } else { - LOG_I(PHY,"[UE %d][SR %x] frame %d, subframe %d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB g_pucch %d dB\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,phy_vars_ue->frame_tx,subframe, + LOG_D(PHY,"[UE %d][SR %x] AbsSubframe %d.%d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB g_pucch %d dB\n", + ue->Mod_id, + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->rnti,proc->frame_tx%1024,subframe, Po_PUCCH, - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUCCH, - get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,eNB_id), - phy_vars_ue->dlsch_ue[eNB_id][0]->g_pucch); + ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH, + get_PL(ue->Mod_id,ue->CC_id,eNB_id), + ue->dlsch[ue->current_thread_id[proc->subframe_rx]][eNB_id][0]->g_pucch); } return(Po_PUCCH); diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c index 5fb1f7449c..caef131627 100644 --- a/openair1/SCHED/pusch_pc.c +++ b/openair1/SCHED/pusch_pc.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file pusch_pc.c * \brief Implementation of UE PUSCH Power Control procedures from 36.213 LTE specifications (Section @@ -47,7 +39,7 @@ int16_t hundred_times_delta_TF[100] = {-32768,-1268,-956,-768,-631,-523,-431,-352,-282,-219,-161,-107,-57,-9,36,79,120,159,197,234,269,304,337,370,402,434,465,495,525,555,583,612,640,668,696,723,750,777,803,829,856,881,907,933,958,983,1008,1033,1058,1083,1108,1132,1157,1181,1205,1229,1254,1278,1302,1325,1349,1373,1397,1421,1444,1468,1491,1515,1538,1562,1585,1609,1632,1655,1679,1702,1725,1748,1772,1795,1818,1841,1864,1887,1910,1933,1956,1980,2003,2026,2049,2072,2095,2118,2141,2164,2186,2209,2232,2255}; uint16_t hundred_times_log10_NPRB[100] = {0,301,477,602,698,778,845,903,954,1000,1041,1079,1113,1146,1176,1204,1230,1255,1278,1301,1322,1342,1361,1380,1397,1414,1431,1447,1462,1477,1491,1505,1518,1531,1544,1556,1568,1579,1591,1602,1612,1623,1633,1643,1653,1662,1672,1681,1690,1698,1707,1716,1724,1732,1740,1748,1755,1763,1770,1778,1785,1792,1799,1806,1812,1819,1826,1832,1838,1845,1851,1857,1863,1869,1875,1880,1886,1892,1897,1903,1908,1913,1919,1924,1929,1934,1939,1944,1949,1954,1959,1963,1968,1973,1977,1982,1986,1991,1995,2000}; -int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t harq_pid, uint8_t bw_factor) +int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *eNB,uint8_t UE_id,uint8_t harq_pid, uint8_t bw_factor) { uint32_t Nre,sumKr,MPR_x100,Kr,r; @@ -56,16 +48,16 @@ int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id, DevAssert( UE_id < NUMBER_OF_UE_MAX+1 ); DevAssert( harq_pid < 8 ); - Nre = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Nsymb_initial * - phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb*12; + Nre = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Nsymb_initial * + eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12; sumKr = 0; - for (r=0; rulsch_eNB[UE_id]->harq_processes[harq_pid]->C; r++) { - if (rulsch_eNB[UE_id]->harq_processes[harq_pid]->Cminus) - Kr = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Kminus; + for (r=0; rulsch[UE_id]->harq_processes[harq_pid]->C; r++) { + if (rulsch[UE_id]->harq_processes[harq_pid]->Cminus) + Kr = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kminus; else - Kr = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Kplus; + Kr = eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus; sumKr += Kr; } @@ -78,16 +70,16 @@ int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id, // FK 20140908 sumKr is only set after the ulsch_encoding beta_offset_pusch = 8; - //(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->control_only == 1) ? phy_vars_eNB->ulsch_eNB[UE_id]->beta_offset_cqi_times8:8; + //(eNB->ulsch[UE_id]->harq_processes[harq_pid]->control_only == 1) ? eNB->ulsch[UE_id]->beta_offset_cqi_times8:8; DevAssert( UE_id < NUMBER_OF_UE_MAX ); //#warning "This condition happens sometimes. Need more investigation" // navid //DevAssert( MPR_x100/6 < 100 ); - if (phy_vars_eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled == 1) { + if (1==1) { //eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled == 1) { // This is the formula from Section 5.1.1.1 in 36.213 10*log10(deltaIF_PUSCH = (2^(MPR*Ks)-1)*beta_offset_pusch) if (bw_factor == 1) { - uint8_t nb_rb = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb; + uint8_t nb_rb = eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb; return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3)) + hundred_times_log10_NPRB[nb_rb-1]; } else return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3)); @@ -98,33 +90,41 @@ int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id, int16_t get_hundred_times_delta_IF_mac(module_id_t module_idP, uint8_t CC_id, rnti_t rnti, uint8_t harq_pid) { - int8_t UE_id = find_ue( rnti, PHY_vars_eNB_g[module_idP][CC_id] ); + + int8_t UE_id; + + if ((RC.eNB == NULL) || (module_idP > RC.nb_inst) || (CC_id > RC.nb_CC[module_idP])) { + LOG_E(PHY,"get_UE_stats: No eNB found (or not allocated) for Mod_id %d,CC_id %d\n",module_idP,CC_id); + return -1; + } + + UE_id = find_ulsch( rnti, RC.eNB[module_idP][CC_id],SEARCH_EXIST); if (UE_id == -1) { // not found return 0; } - return get_hundred_times_delta_IF_eNB( PHY_vars_eNB_g[module_idP][CC_id], UE_id, harq_pid, 0 ); + return get_hundred_times_delta_IF_eNB( RC.eNB[module_idP][CC_id], UE_id, harq_pid, 0 ); } -int16_t get_hundred_times_delta_IF(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t harq_pid) +int16_t get_hundred_times_delta_IF(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t harq_pid) { - uint32_t Nre = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->Nsymb_initial * - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb*12; + uint32_t Nre = 2*ue->ulsch[eNB_id]->harq_processes[harq_pid]->Nsymb_initial * + ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb*12; if (Nre==0) return(0); - uint32_t MPR_x100 = 100*phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->sumKr/Nre; + uint32_t MPR_x100 = 100*ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/Nre; // Note: MPR=is the effective spectral efficiency of the PUSCH // FK 20140908 sumKr is only set after the ulsch_encoding - uint16_t beta_offset_pusch = (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->control_only == 1) ? - phy_vars_ue->ulsch_ue[eNB_id]->beta_offset_cqi_times8:8; + uint16_t beta_offset_pusch = (ue->ulsch[eNB_id]->harq_processes[harq_pid]->control_only == 1) ? + ue->ulsch[eNB_id]->beta_offset_cqi_times8:8; - if (phy_vars_ue->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled == 1) { + if (ue->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled == 1) { // This is the formula from Section 5.1.1.1 in 36.213 10*log10(deltaIF_PUSCH = (2^(MPR*Ks)-1)*beta_offset_pusch) return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3)); } else { @@ -136,16 +136,16 @@ int16_t get_hundred_times_delta_IF(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8 uint8_t alpha_lut[8] = {0,40,50,60,70,80,90,100}; -void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag) +void pusch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag) { - uint8_t harq_pid = subframe2harq_pid(&phy_vars_ue->lte_frame_parms, - phy_vars_ue->frame_tx, - subframe); + uint8_t harq_pid = subframe2harq_pid(&ue->frame_parms, + proc->frame_tx, + proc->subframe_tx); - uint8_t nb_rb = phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb; - int8_t PL; + uint8_t nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb; + int16_t PL; // P_pusch = 10*log10(nb_rb + P_opusch(j)+ alpha(u)*PL + delta_TF(i) + f(i)) @@ -153,46 +153,47 @@ void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,u // P_opusch(0) = P_oPTR + deltaP_Msg3 if PUSCH is transporting Msg3 // else // P_opusch(0) = PO_NOMINAL_PUSCH(j) + P_O_UE_PUSCH(j) - PL = get_PL(phy_vars_ue->Mod_id,phy_vars_ue->CC_id,eNB_id); + PL = get_PL(ue->Mod_id,ue->CC_id,eNB_id); - phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH = (hundred_times_log10_NPRB[nb_rb-1]+ - get_hundred_times_delta_IF(phy_vars_ue,eNB_id,harq_pid) + - 100*phy_vars_ue->ulsch_ue[eNB_id]->f_pusch)/100; + ue->ulsch[eNB_id]->Po_PUSCH = (hundred_times_log10_NPRB[nb_rb-1]+ + get_hundred_times_delta_IF(ue,eNB_id,harq_pid) + + 100*ue->ulsch[eNB_id]->f_pusch)/100; - if( phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] == 1) { // Msg3 PUSCH + if(ue->ulsch_Msg3_active[eNB_id] == 1) { // Msg3 PUSCH + + ue->ulsch[eNB_id]->Po_PUSCH += (get_Po_NOMINAL_PUSCH(ue->Mod_id,0) + PL); - phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH += (mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id,0) + PL); LOG_I(PHY,"[UE %d][RAPROC] frame %d, subframe %d: Msg3 Po_PUSCH %d dBm (%d,%d,100*PL=%d,%d,%d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->frame_tx,subframe,phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH, - 100*mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id,0), + ue->Mod_id,proc->frame_tx,proc->subframe_tx,ue->ulsch[eNB_id]->Po_PUSCH, + 100*get_Po_NOMINAL_PUSCH(ue->Mod_id,0), hundred_times_log10_NPRB[nb_rb-1], 100*PL, - get_hundred_times_delta_IF(phy_vars_ue,eNB_id,harq_pid), - 100*phy_vars_ue->ulsch_ue[eNB_id]->f_pusch); + get_hundred_times_delta_IF(ue,eNB_id,harq_pid), + 100*ue->ulsch[eNB_id]->f_pusch); } else if (j==0) { // SPS PUSCH } else if (j==1) { // Normal PUSCH - phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH += ((alpha_lut[phy_vars_ue->lte_frame_parms.ul_power_control_config_common.alpha]*PL)/100); - phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH += phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH; - phy_vars_ue->ulsch_ue[eNB_id]->PHR = phy_vars_ue->tx_power_max_dBm-phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH; + ue->ulsch[eNB_id]->Po_PUSCH += ((alpha_lut[ue->frame_parms.ul_power_control_config_common.alpha]*PL)/100); + ue->ulsch[eNB_id]->Po_PUSCH += ue->frame_parms.ul_power_control_config_common.p0_NominalPUSCH; + ue->ulsch[eNB_id]->PHR = ue->tx_power_max_dBm-ue->ulsch[eNB_id]->Po_PUSCH; - if (phy_vars_ue->ulsch_ue[eNB_id]->PHR < -23) - phy_vars_ue->ulsch_ue[eNB_id]->PHR = -23; - else if (phy_vars_ue->ulsch_ue[eNB_id]->PHR > 40) - phy_vars_ue->ulsch_ue[eNB_id]->PHR = 40; + if (ue->ulsch[eNB_id]->PHR < -23) + ue->ulsch[eNB_id]->PHR = -23; + else if (ue->ulsch[eNB_id]->PHR > 40) + ue->ulsch[eNB_id]->PHR = 40; - LOG_D(PHY,"[UE %d][PUSCH %d] frame %d, subframe %d: Po_PUSCH %d dBm : tx power %d, Po_NOMINAL_PUSCH %d,log10(NPRB) %f,PHR %d, PL %d, alpha*PL %f,delta_IF %f,f_pusch %d\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame_tx,subframe, - phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH, - phy_vars_ue->tx_power_max_dBm, - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH, + LOG_D(PHY,"[UE %d][PUSCH %d] AbsSubframe %d.%d: nb_rb: %d, Po_PUSCH %d dBm : tx power %d, Po_NOMINAL_PUSCH %d,log10(NPRB) %f,PHR %d, PL %d, alpha*PL %f,delta_IF %f,f_pusch %d\n", + ue->Mod_id,harq_pid,proc->frame_tx,proc->subframe_tx,nb_rb, + ue->ulsch[eNB_id]->Po_PUSCH, + ue->tx_power_max_dBm, + ue->frame_parms.ul_power_control_config_common.p0_NominalPUSCH, hundred_times_log10_NPRB[nb_rb-1]/100.0, - phy_vars_ue->ulsch_ue[eNB_id]->PHR, + ue->ulsch[eNB_id]->PHR, PL, - alpha_lut[phy_vars_ue->lte_frame_parms.ul_power_control_config_common.alpha]*PL/100.0, - get_hundred_times_delta_IF(phy_vars_ue,eNB_id,harq_pid)/100.0, - phy_vars_ue->ulsch_ue[eNB_id]->f_pusch); + alpha_lut[ue->frame_parms.ul_power_control_config_common.alpha]*PL/100.0, + get_hundred_times_delta_IF(ue,eNB_id,harq_pid)/100.0, + ue->ulsch[eNB_id]->f_pusch); } } @@ -200,7 +201,7 @@ void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,u int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id,uint8_t eNB_index) { - return PHY_vars_UE_g[Mod_id][CC_id]->ulsch_ue[eNB_index]->PHR; + return PHY_vars_UE_g[Mod_id][CC_id]->ulsch[eNB_index]->PHR; } // uint8_t eNB_id,uint8_t harq_pid, uint8_t UE_id, @@ -260,7 +261,7 @@ int16_t estimate_ue_tx_power(uint32_t tbs, uint32_t nb_rb, uint8_t control_only, if (control_only == 1 ) beta_offset_pusch_x8=8; // fixme - //(beta_offset_pusch_x8=phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->control_only == 1) ? phy_vars_ue->ulsch_ue[eNB_id]->beta_offset_cqi_times8:8; + //(beta_offset_pusch_x8=ue->ulsch[eNB_id]->harq_processes[harq_pid]->control_only == 1) ? ue->ulsch[eNB_id]->beta_offset_cqi_times8:8; // if deltamcs_enabledm delta_mcs = ((hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch_x8)>>3))/100.0); diff --git a/openair1/SCHED/rt_compat.h b/openair1/SCHED/rt_compat.h deleted file mode 100755 index 14b5e8cb52..0000000000 --- a/openair1/SCHED/rt_compat.h +++ /dev/null @@ -1,145 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -/* Header file for making PLATON work on both RTLinux and RTAI using pthreads -* Copyright Frank Wartena, 2004 -* Version: 0.1 January 28th, 2004 ## First version for scheduling test -* 0.2 February 20th, 2004 ## All PLATON functions added -* It is mostly a conversion from RTLinux to RTAI, because PLATON was written -* for RTLinux. -* Not all necessary conversions can be done in this header file, other -* adjustments in the code are also necessary. -*/ - -#ifndef _RT_COMPAT_H_ -#define _RT_COMPAT_H_ - -#ifdef RTAI_ENABLED -//the conversions from RTLinux to RTAI - -//variable for containing times -#define hrtime_t RTIME - -//function for making a thread periodic -#define pthread_make_periodic_np(x,y,z) rt_task_make_periodic(x,rt_get_time(),nano2count(z)) - -//function for printing to the kernel log -#define rtl_printf printk - -//function for determining the current cpu -#define rtl_getcpuid hard_cpu_id - -//function for initialising a mutex -#define pthread_mutex_init pthread_mutex_init_rt - -//function for initialising a mutex attribute -#define pthread_mutexattr_init pthread_mutexattr_init_rt - -//function for setting a mutex protocol, does not exist in RTAI -#define pthread_mutexattr_setprotocol(x,y); - -//function for locking a mutex -#define pthread_mutex_lock pthread_mutex_lock_rt - -//function for unlocking a mutex -#define pthread_mutex_unlock pthread_mutex_unlock_rt - -//function for destroying a mutex -#define pthread_mutex_destroy pthread_mutex_destroy_rt - -//function for getting the current time -#define clock_gethrtime(x) rt_get_time_ns() -#define gethrtime rt_get_time_ns - -//function for initialising a condition -#define pthread_cond_init pthread_cond_init_rt - -//function for waiting on a condition -#define pthread_cond_wait pthread_cond_wait_rt - -//function for signalling a condition -#define pthread_cond_signal pthread_cond_signal_rt - -//function for destroying a condition -#define pthread_cond_destroy pthread_cond_destroy_rt - -//function for waking up a thread -#define pthread_wakeup_np rt_task_resume - -//function for getting the current thread -#define pthread_self rt_whoami - -//function for initialising an attribute -#define pthread_attr_init pthread_attr_init_rt - -//function for setting a schedparam -#define pthread_attr_setschedparam pthread_attr_setschedparam_rt - -//funcion for setting a schedpolicy -#define pthread_attr_setschedpolicy pthread_attr_setschedpolicy_rt - -//function for creating a thread -#define pthread_create pthread_create_rt - -//function for cancelling a thread -#define pthread_cancel pthread_cancel_rt - -//function for deleting a thread, in RTAI both by calling cancel -#define pthread_delete_np pthread_cancel_rt - -//testing if a cpuid exists -#define rtl_cpu_exists(x) x + +#include "targets/RT/USER/rt_wrapper.h" + +// RU OFDM Modulator, used in IF4p5 RRU, RCC/RAU with IF5, eNodeB + +extern openair0_config_t openair0_cfg[MAX_CARDS]; + +extern int oai_exit; + + +void feptx0(RU_t *ru,int slot) { + + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + //int dummy_tx_b[7680*2] __attribute__((aligned(32))); + + unsigned int aa,slot_offset; + int i, tx_offset; + int slot_sizeF = (fp->ofdm_symbol_size)* + ((fp->Ncp==1) ? 6 : 7); + int subframe = ru->proc.subframe_tx; + + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+slot , 1 ); + + slot_offset = subframe*fp->samples_per_tti + (slot*(fp->samples_per_tti>>1)); + + //LOG_D(PHY,"SFN/SF:RU:TX:%d/%d Generating slot %d\n",ru->proc.frame_tx, ru->proc.subframe_tx,slot); + + for (aa=0; aanb_tx; aa++) { + if (fp->Ncp == EXTENDED) PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF], + (int*)&ru->common.txdata[aa][slot_offset], + fp->ofdm_symbol_size, + 6, + fp->nb_prefix_samples, + CYCLIC_PREFIX); + else normal_prefix_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF], + (int*)&ru->common.txdata[aa][slot_offset], + 7, + fp); + + /* + len = fp->samples_per_tti>>1; + + + if ((slot_offset+len)>(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_tti)) { + tx_offset = (int)slot_offset; + txdata = (int16_t*)&ru->common.txdata[aa][tx_offset]; + len2 = -tx_offset+LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_tti; + for (i=0; i<(len2<<1); i++) { + txdata[i] = ((int16_t*)dummy_tx_b)[i]; + } + txdata = (int16_t*)&ru->common.txdata[aa][0]; + for (j=0; i<(len<<1); i++,j++) { + txdata[j++] = ((int16_t*)dummy_tx_b)[i]; + } + } + else { + tx_offset = (int)slot_offset; + txdata = (int16_t*)&ru->common.txdata[aa][tx_offset]; + memcpy((void*)txdata,(void*)dummy_tx_b,len<<2); + } +*/ + // TDD: turn on tx switch N_TA_offset before by setting buffer in these samples to 0 + if ((slot == 0) && + (fp->frame_type == TDD) && + ((fp->tdd_config==0) || + (fp->tdd_config==1) || + (fp->tdd_config==2) || + (fp->tdd_config==6)) && + ((subframe==0) || (subframe==5))) { + for (i=0; iN_TA_offset; i++) { + tx_offset = (int)slot_offset+i-ru->N_TA_offset/2; + if (tx_offset<0) + tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_tti; + + if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_tti)) + tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_tti; + + ru->common.txdata[aa][tx_offset] = 0x00000000; + } + } + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+slot , 0); +} + +static void *feptx_thread(void *param) { + + RU_t *ru = (RU_t *)param; + RU_proc_t *proc = &ru->proc; + + thread_top_init("feptx_thread",0,870000,1000000,1000000); + + while (!oai_exit) { + + if (wait_on_condition(&proc->mutex_feptx,&proc->cond_feptx,&proc->instance_cnt_feptx,"feptx thread")<0) break; + feptx0(ru,1); + if (release_thread(&proc->mutex_feptx,&proc->instance_cnt_feptx,"feptx thread")<0) break; + + if (pthread_cond_signal(&proc->cond_feptx) != 0) { + printf("[eNB] ERROR pthread_cond_signal for feptx thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return NULL; + } + } + + + + return(NULL); +} + +void feptx_ofdm_2thread(RU_t *ru) { + + LTE_DL_FRAME_PARMS *fp=&ru->frame_parms; + RU_proc_t *proc = &ru->proc; + struct timespec wait; + int subframe = ru->proc.subframe_tx; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + start_meas(&ru->ofdm_mod_stats); + + if (subframe_select(fp,subframe) == SF_UL) return; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 1 ); + + if (subframe_select(fp,subframe)==SF_DL) { + // If this is not an S-subframe + if (pthread_mutex_timedlock(&proc->mutex_feptx,&wait) != 0) { + printf("[RU] ERROR pthread_mutex_lock for feptx thread (IC %d)\n", proc->instance_cnt_feptx); + exit_fun( "error locking mutex_feptx" ); + return; + } + + if (proc->instance_cnt_feptx==0) { + printf("[RU] FEPtx thread busy\n"); + exit_fun("FEPtx thread busy"); + pthread_mutex_unlock( &proc->mutex_feptx ); + return; + } + + ++proc->instance_cnt_feptx; + + + if (pthread_cond_signal(&proc->cond_feptx) != 0) { + printf("[RU] ERROR pthread_cond_signal for feptx thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + + pthread_mutex_unlock( &proc->mutex_feptx ); + } + + // call first slot in this thread + feptx0(ru,0); + wait_on_busy_condition(&proc->mutex_feptx,&proc->cond_feptx,&proc->instance_cnt_feptx,"feptx thread"); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 0 ); + + stop_meas(&ru->ofdm_mod_stats); + +} + +void feptx_ofdm(RU_t *ru) { + + LTE_DL_FRAME_PARMS *fp=&ru->frame_parms; + + unsigned int aa,slot_offset, slot_offset_F; + int dummy_tx_b[7680*4] __attribute__((aligned(32))); + int i,j, tx_offset; + int slot_sizeF = (fp->ofdm_symbol_size)* + ((fp->Ncp==1) ? 6 : 7); + int len,len2; + int16_t *txdata; + int subframe = ru->proc.subframe_tx; + +// int CC_id = ru->proc.CC_id; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 1 ); + + slot_offset_F = 0; + + slot_offset = subframe*fp->samples_per_tti; + + if ((subframe_select(fp,subframe)==SF_DL)|| + ((subframe_select(fp,subframe)==SF_S))) { + // LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot); + + start_meas(&ru->ofdm_mod_stats); + + for (aa=0; aanb_tx; aa++) { + if (fp->Ncp == EXTENDED) { + PHY_ofdm_mod(&ru->common.txdataF_BF[aa][0], + dummy_tx_b, + fp->ofdm_symbol_size, + 6, + fp->nb_prefix_samples, + CYCLIC_PREFIX); + PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_sizeF], + dummy_tx_b+(fp->samples_per_tti>>1), + fp->ofdm_symbol_size, + 6, + fp->nb_prefix_samples, + CYCLIC_PREFIX); + } else { + normal_prefix_mod(&ru->common.txdataF_BF[aa][slot_offset_F], + dummy_tx_b, + 7, + fp); + // if S-subframe generate first slot only + if (subframe_select(fp,subframe) == SF_DL) + normal_prefix_mod(&ru->common.txdataF_BF[aa][slot_offset_F+slot_sizeF], + dummy_tx_b+(fp->samples_per_tti>>1), + 7, + fp); + } + + // if S-subframe generate first slot only + if (subframe_select(fp,subframe) == SF_S) + len = fp->samples_per_tti>>1; + else + len = fp->samples_per_tti; + /* + for (i=0;icommon.txdata[aa][(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_tti)+tx_offset]; + len2 = -(slot_offset); + len2 = (len2>len) ? len : len2; + for (i=0; i<(len2<<1); i++) { + txdata[i] = ((int16_t*)dummy_tx_b)[i]; + } + if (len2common.txdata[aa][0]; + for (j=0; i<(len<<1); i++,j++) { + txdata[j++] = ((int16_t*)dummy_tx_b)[i]; + } + } + } + else if ((slot_offset+len)>(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_tti)) { + tx_offset = (int)slot_offset; + txdata = (int16_t*)&ru->common.txdata[aa][tx_offset]; + len2 = -tx_offset+LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_tti; + for (i=0; i<(len2<<1); i++) { + txdata[i] = ((int16_t*)dummy_tx_b)[i]; + } + txdata = (int16_t*)&ru->common.txdata[aa][0]; + for (j=0; i<(len<<1); i++,j++) { + txdata[j++] = ((int16_t*)dummy_tx_b)[i]; + } + } + else { + //LOG_D(PHY,"feptx_ofdm: Writing to position %d\n",slot_offset); + tx_offset = (int)slot_offset; + txdata = (int16_t*)&ru->common.txdata[aa][tx_offset]; + + for (i=0; i<(len<<1); i++) { + txdata[i] = ((int16_t*)dummy_tx_b)[i]; + } + } + + // if S-subframe switch to RX in second subframe + /* + if (subframe_select(fp,subframe) == SF_S) { + for (i=0; icommon_vars.txdata[0][aa][tx_offset++] = 0x00010001; + } + } + */ + if ((fp->frame_type == TDD) && + ((fp->tdd_config==0) || + (fp->tdd_config==1) || + (fp->tdd_config==2) || + (fp->tdd_config==6)) && + ((subframe==0) || (subframe==5))) { + // turn on tx switch N_TA_offset before + //LOG_D(HW,"subframe %d, time to switch to tx (N_TA_offset %d, slot_offset %d) \n",subframe,ru->N_TA_offset,slot_offset); + for (i=0; iN_TA_offset; i++) { + tx_offset = (int)slot_offset+i-ru->N_TA_offset/2; + if (tx_offset<0) + tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_tti; + + if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_tti)) + tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_tti; + + ru->common.txdata[aa][tx_offset] = 0x00000000; + } + } + stop_meas(&ru->ofdm_mod_stats); + LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, subframe %d: txp (time %p) %d dB, txp (freq) %d dB\n", + ru->proc.frame_tx,subframe,txdata,dB_fixed(signal_energy((int32_t*)txdata,fp->samples_per_tti)), + dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF))); + } + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 0 ); +} + +void feptx_prec(RU_t *ru) { + + int l,i,aa; + PHY_VARS_eNB **eNB_list = ru->eNB_list,*eNB; + LTE_DL_FRAME_PARMS *fp; + int32_t ***bw; + int subframe = ru->proc.subframe_tx; + + if (ru->num_eNB == 1) { + eNB = eNB_list[0]; + fp = &eNB->frame_parms; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC , 1); + + for (aa=0;aanb_tx;aa++) + memcpy((void*)ru->common.txdataF_BF[aa], + (void*)&eNB->common_vars.txdataF[aa][subframe*fp->symbols_per_tti*fp->ofdm_symbol_size], + fp->symbols_per_tti*fp->ofdm_symbol_size*sizeof(int32_t)); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC , 0); + } + else { + for (i=0;inum_eNB;i++) { + eNB = eNB_list[i]; + fp = &eNB->frame_parms; + bw = ru->beam_weights[i]; + + for (l=0;lsymbols_per_tti;l++) { + for (aa=0;aanb_tx;aa++) { + beam_precoding(eNB->common_vars.txdataF, + ru->common.txdataF_BF, + fp, + bw, + subframe<<1, + l, + aa); + } + } +#if 0 + LOG_D(PHY,"feptx_prec: frame %d, subframe %d: txp (freq) %d dB\n", + ru->proc.frame_tx,subframe, + dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[0],2*fp->symbols_per_tti*fp->ofdm_symbol_size))); +#endif + } + } +} + +void fep0(RU_t *ru,int slot) { + + RU_proc_t *proc = &ru->proc; + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + int l; + + // printf("fep0: slot %d\n",slot); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX+slot, 1); + + remove_7_5_kHz(ru,(slot&1)+(proc->subframe_rx<<1)); + for (l=0; lsymbols_per_tti/2; l++) { + slot_fep_ul(ru, + l, + (slot&1), + 0 + ); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX+slot, 0); +} + + + +static void *fep_thread(void *param) { + + RU_t *ru = (RU_t *)param; + RU_proc_t *proc = &ru->proc; + + thread_top_init("fep_thread",0,870000,1000000,1000000); + + while (!oai_exit) { + + if (wait_on_condition(&proc->mutex_fep,&proc->cond_fep,&proc->instance_cnt_fep,"fep thread")<0) break; + fep0(ru,0); + if (release_thread(&proc->mutex_fep,&proc->instance_cnt_fep,"fep thread")<0) break; + + if (pthread_cond_signal(&proc->cond_fep) != 0) { + printf("[eNB] ERROR pthread_cond_signal for fep thread exit\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return NULL; + } + } + + + + return(NULL); +} + +void init_feptx_thread(RU_t *ru,pthread_attr_t *attr_feptx) { + + RU_proc_t *proc = &ru->proc; + + proc->instance_cnt_feptx = -1; + + pthread_mutex_init( &proc->mutex_feptx, NULL); + pthread_cond_init( &proc->cond_feptx, NULL); + + pthread_create(&proc->pthread_feptx, attr_feptx, feptx_thread, (void*)ru); + + +} + +void init_fep_thread(RU_t *ru,pthread_attr_t *attr_fep) { + + RU_proc_t *proc = &ru->proc; + + proc->instance_cnt_fep = -1; + + pthread_mutex_init( &proc->mutex_fep, NULL); + pthread_cond_init( &proc->cond_fep, NULL); + + pthread_create(&proc->pthread_fep, attr_fep, fep_thread, (void*)ru); + + +} +void ru_fep_full_2thread(RU_t *ru) { + + RU_proc_t *proc = &ru->proc; + + struct timespec wait; + + LTE_DL_FRAME_PARMS *fp=&ru->frame_parms; + + if ((fp->frame_type == TDD) && + (subframe_select(fp,proc->subframe_rx) != SF_UL)) return; + + if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 1 ); + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + start_meas(&ru->ofdm_demod_stats); + + if (pthread_mutex_timedlock(&proc->mutex_fep,&wait) != 0) { + printf("[RU] ERROR pthread_mutex_lock for fep thread (IC %d)\n", proc->instance_cnt_fep); + exit_fun( "error locking mutex_fep" ); + return; + } + + if (proc->instance_cnt_fep==0) { + printf("[RU] FEP thread busy\n"); + exit_fun("FEP thread busy"); + pthread_mutex_unlock( &proc->mutex_fep ); + return; + } + + ++proc->instance_cnt_fep; + + + if (pthread_cond_signal(&proc->cond_fep) != 0) { + printf("[RU] ERROR pthread_cond_signal for fep thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + + pthread_mutex_unlock( &proc->mutex_fep ); + + // call second slot in this symbol + fep0(ru,1); + + wait_on_busy_condition(&proc->mutex_fep,&proc->cond_fep,&proc->instance_cnt_fep,"fep thread"); + + stop_meas(&ru->ofdm_demod_stats); +} + + + +void fep_full(RU_t *ru) { + + RU_proc_t *proc = &ru->proc; + int l; + LTE_DL_FRAME_PARMS *fp=&ru->frame_parms; + + if ((fp->frame_type == TDD) && + (subframe_select(fp,proc->subframe_rx) != SF_UL)) return; + + start_meas(&ru->ofdm_demod_stats); + if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 1 ); + + remove_7_5_kHz(ru,proc->subframe_rx<<1); + remove_7_5_kHz(ru,1+(proc->subframe_rx<<1)); + for (l=0; lsymbols_per_tti/2; l++) { + slot_fep_ul(ru, + l, + 0, + 0 + ); + slot_fep_ul(ru, + l, + 1, + 0 + ); + } + if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 0 ); + stop_meas(&ru->ofdm_demod_stats); + + +} + + +void do_prach_ru(RU_t *ru) { + + RU_proc_t *proc = &ru->proc; + LTE_DL_FRAME_PARMS *fp=&ru->frame_parms; + + // check if we have to detect PRACH first + if (is_prach_subframe(fp,proc->frame_prach,proc->subframe_prach)>0) { + //accept some delay in processing - up to 5ms + int i; + for (i = 0; i < 10 && proc->instance_cnt_prach == 0; i++) { + LOG_W(PHY,"Frame %d Subframe %d, PRACH thread busy (IC %d)!!\n", proc->frame_prach,proc->subframe_prach, + proc->instance_cnt_prach); + usleep(500); + } + if (proc->instance_cnt_prach == 0) { + exit_fun( "PRACH thread busy" ); + return; + } + + // wake up thread for PRACH RX + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "ERROR pthread_mutex_lock for PRACH thread (IC %d)\n", proc->instance_cnt_prach ); + exit_fun( "error locking mutex_prach" ); + return; + } + + ++proc->instance_cnt_prach; + + // the thread can now be woken up + if (pthread_cond_signal(&proc->cond_prach) != 0) { + LOG_E( PHY, "ERROR pthread_cond_signal for PRACH thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + + pthread_mutex_unlock( &proc->mutex_prach ); + } + +} diff --git a/openair1/SCHED/srs_pc.c b/openair1/SCHED/srs_pc.c new file mode 100644 index 0000000000..04dacecc25 --- /dev/null +++ b/openair1/SCHED/srs_pc.c @@ -0,0 +1,100 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file srs_pc.c + * \brief Implementation of UE SRS Power Control procedures from 36.213 LTE specifications (Section + * \author H. Bilel + * \date 2016 + * \version 0.1 + * \company TCL + * \email: haithem.bilel@alcatelOneTouch.com + * \note + * \warning + */ + +#include "PHY/defs.h" +#include "PHY/LTE_TRANSPORT/proto.h" +#include "PHY/extern.h" + +void srs_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t *pnb_rb_srs, uint8_t abstraction_flag) +{ + + int16_t PL; + int8_t p0_NominalPUSCH; + int8_t p0_UE_PUSCH; + int8_t Psrs_offset; + int16_t P_srs; + int16_t f_pusch; + uint8_t alpha; + uint8_t Msrs = 0; + + + SOUNDINGRS_UL_CONFIG_DEDICATED *psoundingrs_ul_config_dedicated = &ue->soundingrs_ul_config_dedicated[eNB_id]; + LTE_DL_FRAME_PARMS *pframe_parms = &ue->frame_parms; + + uint8_t Bsrs = psoundingrs_ul_config_dedicated->srs_Bandwidth; + uint8_t Csrs = pframe_parms->soundingrs_ul_config_common.srs_BandwidthConfig; + LOG_D(PHY," SRS Power Control; AbsSubframe %d.%d, eNB_id %d, N_RB_UL %d, srs_Bandwidth %d, srs_BandwidthConfig %d \n",proc->frame_tx,proc->subframe_tx,eNB_id,pframe_parms->N_RB_UL,Bsrs,Csrs); + + if (pframe_parms->N_RB_UL < 41) + { + Msrs = Nb_6_40[Csrs][Bsrs]; + } + else if (pframe_parms->N_RB_UL < 61) + { + Msrs = Nb_41_60[Csrs][Bsrs]; + } + else if (pframe_parms->N_RB_UL < 81) + { + Msrs = Nb_61_80[Csrs][Bsrs]; + } + else if (pframe_parms->N_RB_UL <111) + { + Msrs = Nb_81_110[Csrs][Bsrs]; + } + + // SRS Power control 36.213 5.1.3.1 + // P_srs = P_srs_offset+ 10log10(Msrs) + P_opusch(j) + alpha*PL + f(i)) + + p0_NominalPUSCH = ue->frame_parms.ul_power_control_config_common.p0_NominalPUSCH; + p0_UE_PUSCH = ue->ul_power_control_dedicated[eNB_id].p0_UE_PUSCH; + Psrs_offset = (ue->ul_power_control_dedicated[eNB_id].pSRS_Offset - 3); + + + f_pusch = ue->ulsch[eNB_id]->f_pusch; + alpha = alpha_lut[ue->frame_parms.ul_power_control_config_common.alpha]; + PL = get_PL(ue->Mod_id,ue->CC_id,eNB_id); + + LOG_D(PHY," SRS Power Control; eNB_id %d, p0_NominalPUSCH %d, p0_UE_PUSCH %d, alpha %d \n",eNB_id,p0_NominalPUSCH,p0_UE_PUSCH,alpha); + LOG_D(PHY," SRS Power Control; eNB_id %d, pSRS_Offset[dB] %d, Msrs %d, PL %d, f_pusch %d \n",eNB_id,Psrs_offset,Msrs,PL,f_pusch); + + P_srs = (p0_NominalPUSCH + p0_UE_PUSCH) + Psrs_offset + f_pusch; + P_srs += (((int32_t)alpha * (int32_t)PL) + hundred_times_log10_NPRB[Msrs-1])/100 ; + + ue->ulsch[eNB_id]->Po_SRS = P_srs; + if(ue->ulsch[eNB_id]->Po_SRS > ue->tx_power_max_dBm) + { + ue->ulsch[eNB_id]->Po_SRS = ue->tx_power_max_dBm; + } + + pnb_rb_srs[0] = Msrs; + LOG_D(PHY," SRS Power Control; eNB_id %d, Psrs_pc[dBm] %d, Pcmax[dBm] %d, Psrs[dBm] %d\n",eNB_id,P_srs,ue->tx_power_max_dBm,ue->ulsch[eNB_id]->Po_SRS); +} diff --git a/openair1/SCHED/vars.h b/openair1/SCHED/vars.h index 532251a2f0..4dac375f18 100644 --- a/openair1/SCHED/vars.h +++ b/openair1/SCHED/vars.h @@ -1,34 +1,26 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "defs.h" -OPENAIR_DAQ_VARS openair_daq_vars; diff --git a/openair1/SIMULATION/COPYING b/openair1/SIMULATION/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SIMULATION/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SIMULATION/ETH_TRANSPORT/COPYING b/openair1/SIMULATION/ETH_TRANSPORT/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SIMULATION/ETH_TRANSPORT/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c b/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c index 0ced6e0ceb..e96db24521 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/bypass_session_layer.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file bypass_session_layer.h * \brief implementation of emultor tx and rx * \author Navid Nikaein and Raymond Knopp @@ -45,10 +38,7 @@ #include "UTIL/OCG/OCG_extern.h" #include "UTIL/LOG/log.h" -#ifdef USER_MODE -# include "multicast_link.h" -# include "pgm_link.h" -#endif +#include "multicast_link.h" char rx_bufferP[BYPASS_RX_BUFFER_SIZE]; unsigned int num_bytesP = 0; @@ -58,10 +48,6 @@ static unsigned int byte_tx_count; unsigned int Master_list_rx; static uint64_t seq_num_tx = 0; -#if defined(ENABLE_PGM_TRANSPORT) -extern unsigned int pgm_would_block; -#endif - mapping transport_names[] = { {"WAIT PM TRANSPORT INFO", EMU_TRANSPORT_INFO_WAIT_PM}, {"WAIT SM TRANSPORT INFO", EMU_TRANSPORT_INFO_WAIT_SM}, @@ -69,9 +55,6 @@ mapping transport_names[] = { {"ENB_TRANSPORT INFO", EMU_TRANSPORT_INFO_ENB}, {"UE TRANSPORT INFO", EMU_TRANSPORT_INFO_UE}, {"RELEASE TRANSPORT INFO", EMU_TRANSPORT_INFO_RELEASE}, -#if defined(ENABLE_PGM_TRANSPORT) - {"NACK TRANSPORT INFO", EMU_TRANSPORT_NACK}, -#endif {NULL, -1} }; @@ -86,9 +69,6 @@ void init_bypass (void) pthread_mutex_init (&emul_low_mutex, NULL); pthread_cond_init (&emul_low_cond, NULL); emul_low_mutex_var = 1; -#endif -#if defined(ENABLE_PGM_TRANSPORT) - pgm_oai_init(oai_emulation.info.multicast_ifname); #endif bypass_init (emul_tx_handler, emul_rx_handler); } @@ -97,10 +77,8 @@ void init_bypass (void) void bypass_init (tx_handler_t tx_handlerP, rx_handler_t rx_handlerP) { /***************************************************************************/ -#if defined(USER_MODE) multicast_link_start (bypass_rx_handler, oai_emulation.info.multicast_group, oai_emulation.info.multicast_ifname); -#endif //USER_MODE tx_handler = tx_handlerP; rx_handler = rx_handlerP; Master_list_rx=0; @@ -329,20 +307,12 @@ int bypass_rx_data(unsigned int frame, unsigned int last_slot, frame, next_slot, is_master); #if defined(ENABLE_NEW_MULTICAST) -# if defined(ENABLE_PGM_TRANSPORT) - num_bytesP = pgm_recv_msg(oai_emulation.info.multicast_group, - (uint8_t *)&rx_bufferP[0], sizeof(rx_bufferP), - frame, next_slot); - - DevCheck(num_bytesP > 0, num_bytesP, 0, 0); -# else if (multicast_link_read_data_from_sock(is_master) == 1) { /* We got a timeout */ return -1; } -# endif #else pthread_mutex_lock(&emul_low_mutex); @@ -370,10 +340,6 @@ int bypass_rx_data(unsigned int frame, unsigned int last_slot, num_bytesP, map_int_to_str(transport_names, messg->Message_type), messg->master_id, messg->seq_num); -#if defined(ENABLE_PGM_TRANSPORT) - - if (messg->Message_type != EMU_TRANSPORT_NACK) -#endif DevCheck4((messg->frame == frame) && (messg->subframe == (next_slot>>1)), messg->frame, frame, messg->subframe, next_slot>>1); @@ -416,20 +382,6 @@ int bypass_rx_data(unsigned int frame, unsigned int last_slot, Master_list_rx = oai_emulation.info.master_list; LOG_E(EMU, "RX EMU_TRANSPORT_INFO_RELEASE\n"); break; -#if defined(ENABLE_PGM_TRANSPORT) - - case EMU_TRANSPORT_NACK: - if (messg->failing_master_id == oai_emulation.info.master_id) { - /* We simply re-send the last message */ - pgm_link_send_msg(oai_emulation.info.multicast_group, - (uint8_t *)bypass_tx_buffer, byte_tx_count); - } else { - /* Sleep awhile till other peers have recovered data */ - usleep(500); - } - - break; -#endif default: LOG_E(EMU, "[MAC][BYPASS] ERROR RX UNKNOWN MESSAGE\n"); @@ -455,35 +407,6 @@ int bypass_rx_data(unsigned int frame, unsigned int last_slot, return bytes_read; } -/******************************************************************************************************/ -#ifndef USER_MODE -int bypass_rx_handler(unsigned int fifo, int rw) -{ - /******************************************************************************************************/ - int bytes_read; - int bytes_processed=0; - int header_bytes; //, elapsed_time; - //printk("[BYPASS] BYPASS_RX_HANDLER IN...\n"); - header_bytes= rtf_get(fifo_bypass_phy_user2kern, rx_bufferP, - sizeof(bypass_proto2multicast_header_t) ); - - if (header_bytes> 0) { - bytes_read = rtf_get(fifo_bypass_phy_user2kern, &rx_bufferP[header_bytes], - ((bypass_proto2multicast_header_t *) (&rx_bufferP[0]))->size); - - // printk("BYTES_READ=%d\n",bytes_read); - if (bytes_read > 0) { - num_bytesP=header_bytes+bytes_read; - emul_low_mutex_var=0; - //printk("BYPASS_PHY SIGNAL MAC_LOW...\n"); - pthread_cond_signal(&emul_low_cond); - } - } - - // } - return 0; -} -#else //USER_MODE /******************************************************************************************************/ void bypass_rx_handler(unsigned int Num_bytes,char *Rx_buffer) { @@ -510,7 +433,6 @@ void bypass_rx_handler(unsigned int Num_bytes,char *Rx_buffer) #endif } } -#endif //USER_MODE /******************************************************************************************************/ void bypass_signal_mac_phy(unsigned int frame, unsigned int last_slot, @@ -518,57 +440,12 @@ void bypass_signal_mac_phy(unsigned int frame, unsigned int last_slot, { /******************************************************************************************************/ if (Master_list_rx != oai_emulation.info.master_list) { -#ifndef USER_MODE - rtf_put(fifo_mac_bypass, &tt, 1); - /* the Rx window is still opened (Re)signal bypass_phy (emulate MAC signal) */ -#endif bypass_rx_data(frame, last_slot, next_slot, is_master); } else { Master_list_rx = 0; } } -#ifndef USER_MODE -/***************************************************************************/ -int multicast_link_write_sock (int groupP, char *dataP, unsigned int sizeP) -{ - /***************************************************************************/ - int tx_bytes=0; - - pthread_mutex_lock(&Tx_mutex); - - while(!Tx_mutex_var) { - pthread_cond_wait(&Tx_cond,&Tx_mutex); - } - - Tx_mutex_var=0; - N_P=(int)((sizeP-sizeof (bypass_proto2multicast_header_t))/1000)+2; - tx_bytes += rtf_put (fifo_bypass_phy_kern2user, &dataP[tx_bytes], - sizeof (bypass_proto2multicast_header_t)); - - while(tx_bytesMessage_type = EMU_TRANSPORT_NACK; - - for (i = 0; i < oai_emulation.info.nb_master; i++) { - /* Skip our id */ - if (i == oai_emulation.info.master_id) - continue; - - if ((Master_list_rx & (1 << i)) == 0) { - messg->failing_master_id = i; - break; - } - } - - LOG_T(EMU,"[TX_DATA] NACK TRANSPORT\n"); - } else -#endif if (Type == WAIT_PM_TRANSPORT) { messg->Message_type = EMU_TRANSPORT_INFO_WAIT_PM; LOG_T(EMU,"[TX_DATA] WAIT SYNC PM TRANSPORT\n"); @@ -709,32 +566,11 @@ void bypass_tx_data(emu_transport_info_t Type, unsigned int frame, unsigned int ((bypass_proto2multicast_header_t *) bypass_tx_buffer)->size = byte_tx_count - sizeof (bypass_proto2multicast_header_t); -#if defined(ENABLE_PGM_TRANSPORT) - pgm_link_send_msg(oai_emulation.info.multicast_group, - (uint8_t *)bypass_tx_buffer, byte_tx_count); -#else multicast_link_write_sock(oai_emulation.info.multicast_group, bypass_tx_buffer, byte_tx_count); -#endif LOG_D(EMU, "Frame %d, subframe %d (%d): Sent %d bytes [%s] with master_id %d and seq %"PRIuMAX"\n", frame, next_slot>>1, next_slot,byte_tx_count, map_int_to_str(transport_names, Type), messg->master_id, messg->seq_num); } -#ifndef USER_MODE -/*********************************************************************************************************************/ -int bypass_tx_handler(unsigned int fifo, int rw) -{ - /***************************************************************************/ - if(++N_R==N_P) { - rtf_reset(fifo_bypass_phy_kern2user); - - Tx_mutex_var=1; - N_R=0; - - pthread_cond_signal(&Tx_cond); - } -} -#endif - diff --git a/openair1/SIMULATION/ETH_TRANSPORT/defs.h b/openair1/SIMULATION/ETH_TRANSPORT/defs.h old mode 100755 new mode 100644 index 790a0adc2d..5cd961b61a --- a/openair1/SIMULATION/ETH_TRANSPORT/defs.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/defs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file phy_emulation.h * \brief specifies the data structure and variable for phy emulation * \author Navid Nikaein, Raymomd Knopp and Hicham Anouar @@ -48,9 +41,6 @@ typedef enum emu_transport_info_e { EMU_TRANSPORT_INFO_ENB, EMU_TRANSPORT_INFO_UE, EMU_TRANSPORT_INFO_RELEASE -#if defined(ENABLE_PGM_TRANSPORT) - ,EMU_TRANSPORT_NACK -#endif } emu_transport_info_t; #define WAIT_PM_TRANSPORT 1 @@ -59,9 +49,6 @@ typedef enum emu_transport_info_e { #define ENB_TRANSPORT 4 #define UE_TRANSPORT 5 #define RELEASE_TRANSPORT 6 -#if defined(ENABLE_PGM_TRANSPORT) -# define NACK_TRANSPORT 7 -#endif #define WAIT_SYNC_TRANSPORT 1 #define SYNCED_TRANSPORT 2 diff --git a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c index ec15e7c668..f71a8ee117 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file phy_emulation.c * \brief implements the underlying protocol for emulated data exchange over Ethernet using IP multicast * \author Navid Nikaein @@ -38,6 +31,7 @@ #include "PHY/defs.h" #include "PHY/extern.h" +#include "common/ran_context.h" #include "defs.h" #include "extern.h" #include "proto.h" @@ -46,49 +40,17 @@ #include "UTIL/LOG/log.h" #include "UTIL/LOG/vcd_signal_dumper.h" -#include "pgm_link.h" - extern unsigned int Master_list_rx; extern unsigned char NB_INST; //#define DEBUG_CONTROL 1 //#define DEBUG_EMU 1 -#if defined(ENABLE_PGM_TRANSPORT) -extern unsigned int pgm_would_block; -#endif - void emu_transport_sync(void) { LOG_D(EMU, "Entering EMU transport SYNC is primary master %d\n", oai_emulation.info.is_primary_master); -#if defined(ENABLE_PGM_TRANSPORT) - - if (oai_emulation.info.is_primary_master == 0) { - bypass_tx_data(WAIT_SM_TRANSPORT,0,0); - // just wait to recieve the master 0 msg - Master_list_rx = oai_emulation.info.master_list - 1; - bypass_rx_data(0,0,0,1); - } else { - bypass_rx_data(0,0,0,0); - bypass_tx_data(WAIT_PM_TRANSPORT,0,0); - } - - if (oai_emulation.info.master_list != 0) { - bypass_tx_data(SYNC_TRANSPORT,0,0); - bypass_rx_data(0,0,0,0); - - // i received the sync from all secondary masters - if (emu_rx_status == SYNCED_TRANSPORT) { - emu_tx_status = SYNCED_TRANSPORT; - } - - LOG_D(EMU,"TX secondary master SYNC_TRANSPORT state \n"); - } - -#else - if (oai_emulation.info.is_primary_master == 0) { retry: bypass_tx_data(WAIT_SM_TRANSPORT,0,0); @@ -121,8 +83,6 @@ retry2: LOG_D(EMU,"TX secondary master SYNC_TRANSPORT state \n"); } -#endif - LOG_D(EMU, "Leaving EMU transport SYNC is primary master %d\n", oai_emulation.info.is_primary_master); } @@ -160,9 +120,6 @@ void emu_transport(unsigned int frame, unsigned int last_slot, } } -#if defined(ENABLE_PGM_TRANSPORT) - pgm_would_block = 0; -#endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_EMU_TRANSPORT, VCD_FUNCTION_OUT); } @@ -295,13 +252,13 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot // eNB // PBCH : copy payload - *(uint32_t *)PHY_vars_eNB_g[enb_id][CC_id]->pbch_pdu = + *(uint32_t *)RC.eNB[enb_id][CC_id]->pbch_pdu = eNB_transport_info[enb_id][CC_id].cntl.pbch_payload; /* LOG_I(EMU," RX slot %d ENB TRANSPORT pbch payload %d pdu[0] %d pdu[0] %d \n", next_slot , eNB_transport_info[enb_id][CC_id].cntl.pbch_payload, - ((uint8_t*)PHY_vars_eNB_g[enb_id]->pbch_pdu)[0], - ((uint8_t*)PHY_vars_eNB_g[enb_id]->pbch_pdu)[1]); + ((uint8_t*)RC.eNB[enb_id]->pbch_pdu)[0], + ((uint8_t*)RC.eNB[enb_id]->pbch_pdu)[1]); */ // } //CFI @@ -315,9 +272,9 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot eNB_transport_info[enb_id][CC_id].num_ue_spec_dci + eNB_transport_info[enb_id][CC_id].num_common_dci; - PHY_vars_eNB_g[enb_id][CC_id]->num_ue_spec_dci[(next_slot>>1)&1] = + RC.eNB[enb_id][CC_id]->num_ue_spec_dci[(next_slot>>1)&1] = eNB_transport_info[enb_id][CC_id].num_ue_spec_dci; - PHY_vars_eNB_g[enb_id][CC_id]->num_common_dci[(next_slot>>1)&1] = + RC.eNB[enb_id][CC_id]->num_common_dci[(next_slot>>1)&1] = eNB_transport_info[enb_id][CC_id].num_common_dci; #ifdef DEBUG_EMU LOG_D(EMU, "Fill phy vars eNB %d for slot %d, DCI found %d \n", @@ -326,7 +283,7 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot if (nb_total_dci >0) { - memcpy(PHY_vars_eNB_g[enb_id][CC_id]->dci_alloc[(next_slot>>1)&1], + memcpy(RC.eNB[enb_id][CC_id]->dci_alloc[(next_slot>>1)&1], eNB_transport_info[enb_id][CC_id].dci_alloc, (nb_total_dci) * sizeof(DCI_ALLOC_t)); @@ -348,7 +305,7 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot switch (eNB_transport_info[enb_id][CC_id].dlsch_type[n_dci_dl]) { case 0: //SI: - memcpy(PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB_SI->harq_processes[0]->b, + memcpy(RC.eNB[enb_id][CC_id]->dlsch_SI->harq_processes[0]->b, &eNB_transport_info[enb_id][CC_id].transport_blocks[payload_offset], eNB_transport_info[enb_id][CC_id].tbs[n_dci_dl]); #ifdef DEBUG_EMU @@ -358,7 +315,7 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot break; case 1: //RA: - memcpy(PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB_ra->harq_processes[0]->b, + memcpy(RC.eNB[enb_id][CC_id]->dlsch_ra->harq_processes[0]->b, &eNB_transport_info[enb_id][CC_id].transport_blocks[payload_offset], eNB_transport_info[enb_id][CC_id].tbs[n_dci_dl]); #ifdef DEBUG_EMU @@ -370,9 +327,9 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot case 2://TB0: harq_pid = eNB_transport_info[enb_id][CC_id].harq_pid[n_dci_dl]; ue_id = eNB_transport_info[enb_id][CC_id].ue_id[n_dci_dl]; - PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB[ue_id][0]->rnti= + RC.eNB[enb_id][CC_id]->dlsch[ue_id][0]->rnti= eNB_transport_info[enb_id][CC_id].dci_alloc[n_dci_dl].rnti; - dlsch_eNB = PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB[ue_id][0]; + dlsch_eNB = RC.eNB[enb_id][CC_id]->dlsch[ue_id][0]; #ifdef DEBUG_EMU LOG_D(EMU, " enb_id %d ue id is %d rnti is %x dci index %d, harq_pid %d tbs %d \n", @@ -393,9 +350,9 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot case 3://TB1: harq_pid = eNB_transport_info[enb_id][CC_id].harq_pid[n_dci_dl]; ue_id = eNB_transport_info[enb_id][CC_id].ue_id[n_dci_dl]; - PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB[ue_id][1]->rnti= + RC.eNB[enb_id][CC_id]->dlsch[ue_id][1]->rnti= eNB_transport_info[enb_id][CC_id].dci_alloc[n_dci_dl].rnti; - dlsch_eNB = PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB[ue_id][1]; + dlsch_eNB = RC.eNB[enb_id][CC_id]->dlsch[ue_id][1]; memcpy(dlsch_eNB->harq_processes[harq_pid]->b, &eNB_transport_info[enb_id][CC_id].transport_blocks[payload_offset], @@ -403,7 +360,7 @@ void fill_phy_enb_vars(unsigned int enb_id, uint8_t CC_id,unsigned int next_slot break; case 5: - memcpy(PHY_vars_eNB_g[enb_id][CC_id]->dlsch_eNB_MCH->harq_processes[0]->b, + memcpy(RC.eNB[enb_id][CC_id]->dlsch_MCH->harq_processes[0]->b, &eNB_transport_info[enb_id][CC_id].transport_blocks[payload_offset], eNB_transport_info[enb_id][CC_id].tbs[n_dci_dl]); #ifdef DEBUG_EMU @@ -491,52 +448,46 @@ void fill_phy_ue_vars(unsigned int ue_id, uint8_t CC_id,unsigned int last_slot) #endif for (n_enb = 0; n_enb < UE_transport_info[ue_id][CC_id].num_eNB; n_enb++) { -#ifdef DEBUG_EMU - /* LOG_D(EMU,"Setting ulsch vars for ue %d rnti %x harq pid is %d \n", - ue_id, UE_transport_info[ue_id][CC_id].rnti[n_enb], - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]); - */ -#endif + rnti = UE_transport_info[ue_id][CC_id].rnti[n_enb]; enb_id = UE_transport_info[ue_id][CC_id].eNB_id[n_enb]; - PHY_vars_UE_g[ue_id][CC_id]->lte_ue_pdcch_vars[enb_id]->crnti=rnti; + PHY_vars_UE_g[ue_id][CC_id]->pdcch_vars[0][enb_id]->crnti=rnti; + PHY_vars_UE_g[ue_id][CC_id]->pdcch_vars[1][enb_id]->crnti=rnti; harq_pid = UE_transport_info[ue_id][CC_id].harq_pid[n_enb]; - //ulsch = PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]; - - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->o_RI[0] = + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->o_RI[0] = ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_ri & 0x1; - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->o_RI[1] = + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->o_RI[1] = (ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_ri>>1) & 0x1; - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->o_ACK[0]= + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->o_ACK[0]= ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_ack & 0x1; - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->o_ACK[1]= + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->o_ACK[1]= (ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_ack>>1) & 0x1; //*(uint32_t *)ulsch->o = ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_uci; if ((last_slot % 2) == 1) { - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->O = + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->O = ue_cntl_delay[ue_id][CC_id][last_slot%2].length_uci; - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->uci_format = + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->uci_format = ue_cntl_delay[ue_id][CC_id][last_slot%2].uci_format; - memcpy(PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->o, + memcpy(PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->o, ue_cntl_delay[ue_id][CC_id][last_slot%2].pusch_uci, MAX_CQI_BYTES); - ulsch = PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]; + ulsch = PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]; // if (((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1) LOG_D(EMU, "[UE %d] subframe %d last slot %d copy the payload from eNB %d to UE %d with harq id %d cqi (val %d, length %d) \n", ue_id, subframe, last_slot, enb_id, ue_id, harq_pid, ((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1, - PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->O); + PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->O); } - memcpy(PHY_vars_UE_g[ue_id][CC_id]->ulsch_ue[enb_id]->harq_processes[harq_pid]->b, + memcpy(PHY_vars_UE_g[ue_id][CC_id]->ulsch[enb_id]->harq_processes[harq_pid]->b, UE_transport_info[ue_id][CC_id].transport_blocks, UE_transport_info[ue_id][CC_id].tbs[enb_id]); diff --git a/openair1/SIMULATION/ETH_TRANSPORT/extern.h b/openair1/SIMULATION/ETH_TRANSPORT/extern.h old mode 100755 new mode 100644 index c368fa7229..c01b5584e2 --- a/openair1/SIMULATION/ETH_TRANSPORT/extern.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/extern.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file extern.h * \brief specifies the extern variables for phy emulation * \author Navid Nikaein and Raymomd Knopp and Hicham Anouar @@ -38,11 +31,7 @@ #ifndef __BYPASS_SESSION_LAYER_EXTERN_H__ # define __BYPASS_SESSION_LAYER_EXTERN_H__ -#ifndef USER_MODE -#include -#else #include -#endif //RTAI_ENABLED extern unsigned char Emulation_status; extern unsigned char emu_tx_status; diff --git a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c old mode 100755 new mode 100644 index b919d979d8..1ba724976f --- a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file multicast.h * \brief * \author Lionel Gauthier and Navid Nikaein @@ -61,9 +54,7 @@ #include "socket.h" #include "multicast_link.h" -#ifdef USER_MODE -# include "UTIL/LOG/log.h" -#endif //USER_MODE +#include "UTIL/LOG/log.h" extern unsigned short Master_id; @@ -315,17 +306,15 @@ void* multicast_link_main_loop (void *param) } void multicast_link_start(void (*rx_handlerP) (unsigned int, char *), - unsigned char multicast_group, char *multicast_ifname) + unsigned char _multicast_group, char *multicast_ifname) { rx_handler = rx_handlerP; - multicast_group = multicast_group; + multicast_group = _multicast_group; multicast_if = multicast_ifname; LOG_I(EMU, "[MULTICAST] LINK START on interface=%s for group=%d: handler=%p\n", (multicast_if == NULL) ? "not specified" : multicast_if, multicast_group, rx_handler); -#if !defined(ENABLE_PGM_TRANSPORT) multicast_link_init (); -#endif #if ! defined(ENABLE_NEW_MULTICAST) LOG_D(EMU, "[MULTICAST] multicast link start thread\n"); diff --git a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h old mode 100755 new mode 100644 index 0ac2ceb336..3c072e0e3c --- a/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/multicast_link.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file multicast.h * \brief * \author Lionel Gauthier and Navid Nikaein diff --git a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c index d7fc98348c..b578721a1a 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file netlink_init.c * \brief initiate the netlink socket for communication with nas dirver * \author Navid Nikaein and Raymomd Knopp diff --git a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c deleted file mode 100644 index e76b50f61b..0000000000 --- a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.c +++ /dev/null @@ -1,424 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -/*! \file pgm_link.c - * \brief implementation a warpper for openpgm for reliable multicast transmission - * \author Navid Nikaein and S. Roux - * \date 2013 - 2014 - * \version 1.0 - * \company Eurecom - * \email: navid.nikaein@eurecom.fr - */ - -#include -#include -#include -#include -#include - -#include - -#if defined(ENABLE_PGM_TRANSPORT) - -#include - -#include "assertions.h" - -#include "pgm_link.h" -#include "multicast_link.h" - -#include "UTIL/OCG/OCG.h" -#include "UTIL/OCG/OCG_extern.h" - -#include "UTIL/LOG/log.h" - -// #define ENABLE_PGM_DEBUG - -typedef struct { - pgm_sock_t *sock; - uint16_t port; - uint8_t rx_buffer[40000]; -} pgm_multicast_group_t; - -pgm_multicast_group_t pgm_multicast_group[MULTICAST_LINK_NUM_GROUPS]; - -static -int pgm_create_socket(int index, const char *if_addr); - -unsigned int pgm_would_block = 1; - -#if defined(ENABLE_PGM_DEBUG) -static void -log_handler ( - const int log_level, - const char* message, - void* closure -) -{ - printf("%s\n", message); -} -#endif - -int pgm_oai_init(char *if_addr) -{ - pgm_error_t* pgm_err = NULL; - - memset(pgm_multicast_group, 0, - MULTICAST_LINK_NUM_GROUPS * sizeof(pgm_multicast_group_t)); - -#if defined(ENABLE_PGM_DEBUG) - pgm_messages_init(); - pgm_min_log_level = PGM_LOG_LEVEL_DEBUG; - pgm_log_mask = 0xFFF; - - pgm_log_set_handler(log_handler, NULL); -#endif - - if (!pgm_init(&pgm_err)) { - LOG_E(EMU, "Unable to start PGM engine: %s\n", pgm_err->message); - pgm_error_free (pgm_err); - exit(EXIT_FAILURE); - } - - return pgm_create_socket(oai_emulation.info.multicast_group, if_addr); -} - -int pgm_recv_msg(int group, uint8_t *buffer, uint32_t length, - unsigned int frame, unsigned int next_slot) -{ - size_t num_bytes = 0; - int status = 0; - pgm_error_t* pgm_err = NULL; - struct pgm_sockaddr_t from; - socklen_t fromlen = sizeof(from); - uint32_t timeout = 0; - int flags = 0; - - if (pgm_would_block == 0) { - flags = MSG_DONTWAIT; - } - - DevCheck((group <= MULTICAST_LINK_NUM_GROUPS) && (group >= 0), - group, MULTICAST_LINK_NUM_GROUPS, 0); - -#ifdef DEBUG_EMU - LOG_I(EMU, "[PGM] Entering recv function for group %d\n", group); -#endif - - do { - status = pgm_recvfrom(pgm_multicast_group[group].sock, - buffer, - length, - flags, - &num_bytes, - &from, - &fromlen, - &pgm_err); - - if (PGM_IO_STATUS_NORMAL == status) { -#ifdef DEBUG_EMU - LOG_D(EMU, "[PGM] Received %d bytes for group %d\n", num_bytes, group); -#endif - return num_bytes; - } else if (PGM_IO_STATUS_TIMER_PENDING == status) { - if (pgm_would_block == 0) { - /* We sleep for 50 usec */ - usleep(50); - - timeout ++; - - if (timeout == (1000000 / 50)) { - LOG_W(EMU, "[PGM] A packet has been lost -> ask for retransmit\n"); - /* If we do not receive a packet after 10000usec - * -> send a NACK */ - bypass_tx_nack(frame, next_slot); - timeout = 0; - } - } - } else if (PGM_IO_STATUS_RESET == status) { - LOG_W(EMU, "[PGM] Got session reset\n"); - } else { -#ifdef DEBUG_EMU - LOG_D(EMU, "[PGM] Got status %d\n", status); -#endif - - if (pgm_err) { - LOG_E(EMU, "[PGM] recvform failed: %s", pgm_err->message); - pgm_error_free (pgm_err); - pgm_err = NULL; - } - } - } while(status != PGM_IO_STATUS_NORMAL); - - return -1; -} - -int pgm_link_send_msg(int group, uint8_t *data, uint32_t len) -{ - int status; - size_t bytes_written = 0; - - do { - status = pgm_send(pgm_multicast_group[group].sock, data, len, &bytes_written); - } while(status == PGM_IO_STATUS_WOULD_BLOCK); - - if (status != PGM_IO_STATUS_NORMAL) { - return -1; - } - - return bytes_written; -} - -static -int pgm_create_socket(int index, const char *if_addr) -{ - struct pgm_addrinfo_t* res = NULL; - pgm_error_t* pgm_err = NULL; - sa_family_t sa_family = AF_INET; - int udp_encap_port = 46014 + index; - int max_tpdu = 1500; - int sqns = 100; - int port = 0; - struct pgm_sockaddr_t addr; - int blocking = 1; - int multicast_loop = 0; - int multicast_hops = 0; - int dscp, i; - - port = udp_encap_port; - - /* Use PGM */ - udp_encap_port = 0; - - LOG_D(EMU, "[PGM] Preparing socket for group %d and address %s\n", - index, if_addr); - - if (!pgm_getaddrinfo(if_addr, NULL, &res, &pgm_err)) { - LOG_E(EMU, "Parsing network parameter: %s\n", pgm_err->message); - goto err_abort; - } - - if (udp_encap_port) { - LOG_I(EMU, "[PGM] Creating PGM/UDP socket for encapsulated port %d\n", - udp_encap_port); - - if (!pgm_socket (&pgm_multicast_group[index].sock, sa_family, - SOCK_SEQPACKET, IPPROTO_UDP, &pgm_err)) { - LOG_E(EMU, "[PGM] Socket: %s\n", pgm_err->message); - goto err_abort; - } - - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, - sizeof(udp_encap_port)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, - sizeof(udp_encap_port)); - } else { - LOG_I(EMU, "[PGM] Creating PGM/IP socket\n"); - - if (!pgm_socket(&pgm_multicast_group[index].sock, sa_family, - SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { - LOG_E(EMU, "Creating PGM/IP socket: %s\n", pgm_err->message); - goto err_abort; - } - } - - { - /* Use RFC 2113 tagging for PGM Router Assist */ - const int no_router_assist = 0; - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_IP_ROUTER_ALERT, &no_router_assist, - sizeof(no_router_assist)); - } - - // pgm_drop_superuser(); - - { - /* set PGM parameters */ - const int recv_only = 0, - passive = 0, - peer_expiry = pgm_secs (300), - spmr_expiry = pgm_msecs (250), - nak_bo_ivl = pgm_msecs (10), - nak_rpt_ivl = pgm_secs (2), - nak_rdata_ivl = pgm_secs (2), - nak_data_retries = 50, - nak_ncf_retries = 50, - ambient_spm = pgm_secs(30); - const int heartbeat_spm[] = { - pgm_msecs (100), - pgm_msecs (100), - pgm_msecs (100), - pgm_msecs (100), - pgm_msecs (1300), - pgm_secs (7), - pgm_secs (16), - pgm_secs (25), - pgm_secs (30) - }; - - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_PASSIVE, &passive, sizeof(passive)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_MTU, &max_tpdu, sizeof(max_tpdu)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_RXW_SQNS, &sqns, sizeof(sqns)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_TXW_SQNS, &sqns, sizeof(sqns)); - } - - /* create global session identifier */ - memset (&addr, 0, sizeof(addr)); - /* sa_port should be in host byte order */ - addr.sa_port = port; - addr.sa_addr.sport = DEFAULT_DATA_SOURCE_PORT + index; - - if (!pgm_gsi_create_from_hostname(&addr.sa_addr.gsi, &pgm_err)) { - LOG_E(EMU, "[PGM] Creating GSI: %s\n", pgm_err->message); - goto err_abort; - } - - LOG_D(EMU, "[PGM] Created GSI %s\n", pgm_tsi_print(&addr.sa_addr)); - - /* assign socket to specified address */ - { - struct pgm_interface_req_t if_req; - memset (&if_req, 0, sizeof(if_req)); - if_req.ir_interface = res->ai_recv_addrs[0].gsr_interface; - if_req.ir_scope_id = 0; - - if (AF_INET6 == sa_family) { - struct sockaddr_in6 sa6; - memcpy (&sa6, &res->ai_recv_addrs[0].gsr_group, sizeof(sa6)); - if_req.ir_scope_id = sa6.sin6_scope_id; - } - - if (!pgm_bind3(pgm_multicast_group[index].sock, &addr, sizeof(addr), - &if_req, sizeof(if_req), /* tx interface */ - &if_req, sizeof(if_req), /* rx interface */ - &pgm_err)) { - LOG_E(EMU, "[PGM] Error: %s\n", pgm_err->message); - goto err_abort; - } - } - - /* join IP multicast groups */ - { - struct group_req req; - struct sockaddr_in addr_in; - - memset(&req, 0, sizeof(req)); - - /* Interface index */ - req.gr_interface = res->ai_recv_addrs[0].gsr_interface; - - addr_in.sin_family = AF_INET; - addr_in.sin_port = htons(port); - - for (i = 0; i < MULTICAST_LINK_NUM_GROUPS; i++) { - addr_in.sin_addr.s_addr = inet_addr(multicast_group_list[i]); - memcpy(&req.gr_group, &addr_in, sizeof(addr_in)); - - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_JOIN_GROUP, &req, - sizeof(struct group_req)); - } - - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_SEND_GROUP, &req, - sizeof(struct group_req)); - } - - pgm_freeaddrinfo(res); - res = NULL; - - /* set IP parameters */ - multicast_hops = 64; - dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, - PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); - - if (AF_INET6 != sa_family) - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, PGM_TOS, - &dscp, sizeof(dscp)); - - pgm_setsockopt(pgm_multicast_group[index].sock, IPPROTO_PGM, PGM_NOBLOCK, - &blocking, sizeof(blocking)); - - if (!pgm_connect(pgm_multicast_group[index].sock, &pgm_err)) { - LOG_E(EMU, "[PGM] Connecting socket: %s\n", pgm_err->message); - goto err_abort; - } - - return 0; - -err_abort: - - if (NULL != pgm_multicast_group[index].sock) { - pgm_close(pgm_multicast_group[index].sock, FALSE); - pgm_multicast_group[index].sock = NULL; - } - - if (NULL != res) { - pgm_freeaddrinfo(res); - res = NULL; - } - - if (NULL != pgm_err) { - pgm_error_free(pgm_err); - pgm_err = NULL; - } - - exit(EXIT_FAILURE); -} - -#endif diff --git a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h b/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h deleted file mode 100644 index 6fc14fdc99..0000000000 --- a/openair1/SIMULATION/ETH_TRANSPORT/pgm_link.h +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifndef PGM_LINK_H_ -#define PGM_LINK_H_ - -/* Define prototypes only if enabled */ -#if defined(ENABLE_PGM_TRANSPORT) -void bypass_tx_nack(unsigned int frame, unsigned int next_slot); - -int pgm_oai_init(char *if_name); - -int pgm_recv_msg(int group, uint8_t *buffer, uint32_t length, - unsigned int frame, unsigned int next_slot); - -int pgm_link_send_msg(int group, uint8_t *data, uint32_t len); - -#endif - -#endif /* PGM_LINK_H_ */ diff --git a/openair1/SIMULATION/ETH_TRANSPORT/proto.h b/openair1/SIMULATION/ETH_TRANSPORT/proto.h index aa87a53ab7..25b3265757 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/proto.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/proto.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file proto.h * \brief * \author Navid Nikaein @@ -46,14 +39,6 @@ int bypass_rx_data(unsigned int frame, unsigned int last_slot, unsigned int next_slot, uint8_t is_master); void bypass_signal_mac_phy(unsigned int frame, unsigned int last_slot, unsigned int next_slot, uint8_t is_master); -#ifndef USER_MODE -int multicast_link_write_sock (int groupP, char *dataP, unsigned int sizeP); -int bypass_tx_handler(unsigned int fifo, int rw); -int bypass_rx_handler(unsigned int fifo, int rw); -#else -void bypass_rx_handler(unsigned int Num_bytes,char *Rx_buffer); -#endif - void bypass_tx_data (emu_transport_info_t Type, unsigned int frame, unsigned int next_slot); void emulation_tx_rx(void); diff --git a/openair1/SIMULATION/ETH_TRANSPORT/socket.c b/openair1/SIMULATION/ETH_TRANSPORT/socket.c old mode 100755 new mode 100644 index 39195c2206..2b28a66170 --- a/openair1/SIMULATION/ETH_TRANSPORT/socket.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/socket.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file socket.c * \brief * \author Lionel Gauthier @@ -48,9 +41,7 @@ //#include "openair_defs.h" #include "socket.h" -#ifdef USER_MODE #define msg printf -#endif //------------------------------------------------------------------------------ void socket_setnonblocking (int sockP) diff --git a/openair1/SIMULATION/ETH_TRANSPORT/socket.h b/openair1/SIMULATION/ETH_TRANSPORT/socket.h old mode 100755 new mode 100644 index a1cc11e5c2..c7a2224375 --- a/openair1/SIMULATION/ETH_TRANSPORT/socket.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/socket.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file socket.h * \brief * \author Lionel Gauthier diff --git a/openair1/SIMULATION/ETH_TRANSPORT/vars.h b/openair1/SIMULATION/ETH_TRANSPORT/vars.h old mode 100755 new mode 100644 index fecf347d28..f49678642e --- a/openair1/SIMULATION/ETH_TRANSPORT/vars.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/vars.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file vars.h * \brief specifies the variables for phy emulation * \author Navid Nikaein and Raymomd Knopp and Hicham Anouar @@ -35,11 +28,7 @@ * \email: navid.nikaein@eurecom.fr */ -#ifndef USER_MODE -#include -#else #include -#endif #include "defs.h" #ifndef __BYPASS_SESSION_LAYER_VARS_H__ diff --git a/openair1/SIMULATION/LTE_PHY/COPYING b/openair1/SIMULATION/LTE_PHY/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SIMULATION/LTE_PHY/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c index cf6f81597f..c894e49e90 100644 --- a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c +++ b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h index ee5eeb5ae5..06b93650e7 100644 --- a/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h +++ b/openair1/SIMULATION/LTE_PHY/LTE_Configuration.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/Makefile b/openair1/SIMULATION/LTE_PHY/Makefile deleted file mode 100644 index 713bfba370..0000000000 --- a/openair1/SIMULATION/LTE_PHY/Makefile +++ /dev/null @@ -1,202 +0,0 @@ -include $(OPENAIR_DIR)/common/utils/Makefile.inc - -COMMON_UTILS_DIR = $(OPENAIR_DIR)/common/utils -TOP_DIR = $(OPENAIR1_DIR) -OPENAIR1_TOP = $(OPENAIR1_DIR) -OPENAIR2_TOP = $(OPENAIR2_DIR) -OPENAIR3 = $(OPENAIR3_DIR) - -CFLAGS += -DMAX_NUM_CCs=1 -Wall -DPHYSIM -DNODE_RG -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DPHY_CONTEXT=1 -DMALLOC_CHECK_=1 -DENABLE_VCD_FIFO -DLOG_NO_THREAD # -Wno-packed-bitfield-compat - -# enable C99 mode -CFLAGS += -std=gnu99 - -# DCI Debug -# CFLAGS += -DDEBUG_DCI_ENCODING -# TODO: only for framegen -#CFLAGS += -DOPENAIR2 -#CFLAGS += -DDEBUG_PHY_PROC -#CFLAGS += -DDEBUG_GROUPHOP - -ifdef OMP -CFLAGS += -DOMP -fopenmp -endif -ifdef LLR8 -CFLAGS += -DLLR8 -endif -CFLAGS += -DNEW_FFT - -LFLAGS = -lm -lblas -lxml2 -lrt -lpthread $(LFDS_DIR)/bin/liblfds611.a - -ifdef GPIB -LFLAGS += -lgpib -endif - -CFLAGS += -DOPENAIR_LTE #-DOFDMA_ULSCH #-DIFFT_FPGA -DIFFT_FPGA_UE -#CFLAGS += -DTBS_FIX -CFLAGS += -DCELLULAR - -ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES - -ifdef EMOS -CFLAGS += -DEMOS -endif - -ifdef DEBUG_PHY -CFLAGS += -DDEBUG_PHY -endif - -ifdef MeNBMUE -CFLAGS += -DMeNBMUE -endif - -ifdef MU_RECEIVER -CFLAGS += -DMU_RECEIVER -endif - -ifdef ZBF_ENABLED -CFLAGS += -DNULL_SHAPE_BF_ENABLED -endif - -ifdef RANDOM_BF -CFLAGS += -DRANDOM_BF -endif - -ifdef PBS_SIM -CFLAGS += -DPBS_SIM -endif - -ifdef XFORMS -CFLAGS += -DXFORMS -LFLAGS += -lforms -endif - -ifdef SMBV -CFLAGS += -DSMBV -endif - -ifdef PERFECT_CE -CFLAGS += -DPERFECT_CE -endif - -ifdef BIT8_TX -CFLAGS += -DBIT8_TX -endif - -CFLAGS += -DNO_RRM -DOPENAIR1 -DPHY_ABSTRACTION #-DOPENAIR2 - -CFLAGS += -I/usr/include/X11 -I/usr/X11R6/include - -ifdef RTAI -CFLAGS += -DRTAI_ENABLED -D__IN_RTAI__ $(shell rtai-config --lxrt-cflags) -LFLAGS += $(shell rtai-config --lxrt-ldflags) -llxrt -endif - -include $(COMMON_UTILS_DIR)/Makefile.inc -include $(TOP_DIR)/PHY/Makefile.inc -include $(TOP_DIR)/SCHED/Makefile.inc -include $(TOP_DIR)/SIMULATION/Makefile.inc -include $(OPENAIR2_DIR)/LAYER2/Makefile.inc -include $(OPENAIR2_DIR)/UTIL/Makefile.inc -include $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc - -#LOG_OBJS += $(LOG_DIR)/vcd_signal_dumper.o - -CFLAGS += $(L2_incl) -I$(ASN1_MSG_INC) -I$(TOP_DIR) -I$(OPENAIR2_DIR) -I$(OPENAIR3) $(UTIL_incl) $(UTILS_incl) -# EXTRA_CFLAGS = - -#STATS_OBJS += $(TOP_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER/cbmimo1_proc.o - -#LAYER2_OBJ += $(OPENAIR2_DIR)/LAYER2/MAC/rar_tools.o -#LAYER2_OBJ = $(OPENAIR2_DIR)/LAYER2/MAC/lte_transport_init.o - -OBJ = $(PHY_OBJS) $(SIMULATION_OBJS) $(TOOLS_OBJS) $(SCHED_OBJS) $(LAYER2_OBJ) $(LOG_OBJS) $(ITTI_DIR)/backtrace.o -ifdef GPIB -OBJ += LTE_Configuration.o -endif -#OBJ2 = $(PHY_OBJS) $(SIMULATION_OBJS) $(TOOLS_OBJS) - -ifdef XFORMS -OBJ += $(OPENAIR1_DIR)/PHY/TOOLS/lte_phy_scope.o -endif - -ifdef STATIC -LFLAGS += -static -L/usr/lib/libblas -endif - -all: dlsim pbchsim pdcchsim ulsim pucchsim prachsim mbmssim scansim - -$(LFDS_DIR)/bin/liblfds611.a: - $(MAKE) -C $(LFDS_DIR) -f makefile.linux - -test: $(SIMULATION_OBJS) $(TOOLS_OBJS) $(TOP_DIR)/PHY/INIT/lte_init.o test.c - $(CC) test.c -I$(TOP_DIR) -o test $(CFLAGS) $(SIMULATION_OBJS) $(TOOLS_OBJS) -lm - -OBJ += $(LIST_OBJ) -OBJ += $(MEM_OBJ) -$(OBJ) : %.o : %.c - @echo Compiling $< ... - @$(CC) -c $(CFLAGS) -o $@ $< - -dlsim : $(OBJ) dlsim.c $(LFDS_DIR)/bin/liblfds611.a - @echo "Compiling dlsim.c ..." - @$(CC) dlsim.c -o dlsim $(CFLAGS) $(OBJ) $(LFLAGS) - -dlsim2 : $(OBJ) dlsim2.c - @echo "Compiling dlsim2.c ..." - @$(CC) dlsim2.c -o dlsim2 $(CFLAGS) $(OBJ) $(LFLAGS) - -framegen: $(OBJ) framegen.c - @echo "Compiling framegen.c" - @$(CC) framegen.c -o framegen $(CFLAGS) $(OBJ) $(LFLAGS) - -pbchsim : $(OBJ) pbchsim.c $(LFDS_DIR)/bin/liblfds611.a - @echo "Compiling pbchsim.c" - @$(CC) pbchsim.c -o pbchsim $(CFLAGS) $(OBJ) $(LFLAGS) - -scansim : $(OBJ) scansim.c $(LFDS_DIR)/bin/liblfds611.a - @echo "Compiling scansim.c" - @$(CC) scansim.c -o scansim $(CFLAGS) $(OBJ) $(LFLAGS) - -mbmssim : $(OBJ) mbmssim.c $(LFDS_DIR)/bin/liblfds611.a - @echo "Compiling mbmssim.c" - @$(CC) mbmssim.c -o mbmssim $(CFLAGS) $(OBJ) $(LFLAGS) - -pdcchsim : $(OBJ) pdcchsim.c $(LFDS_DIR)/bin/liblfds611.a - @echo "Compiling pdcchsim.c" - @$(CC) pdcchsim.c -o pdcchsim $(CFLAGS) $(OBJ) $(LFLAGS) - -pucchsim : $(OBJ) pucchsim.c $(LFDS_DIR)/bin/liblfds611.a - @echo "Compiling pucchsim.c" - @$(CC) pucchsim.c -o pucchsim $(CFLAGS) $(OBJ) $(LFLAGS) - -prachsim : $(OBJ) prachsim.c $(LFDS_DIR)/bin/liblfds611.a - @echo "Compiling prachsim.c" - @$(CC) prachsim.c -o prachsim $(CFLAGS) $(OBJ) $(LFLAGS) - -ulsim : $(OBJ) ulsim.c $(LFDS_DIR)/bin/liblfds611.a #ulsim_form.c - @echo "Compiling [ulsim.c]" - @$(CC) ulsim.c -o ulsim $(CFLAGS) $(OBJ) $(LFLAGS) - -syncsim : $(OBJ) syncsim.c $(LFDS_DIR)/bin/liblfds611.a - @echo "Compiling syncsim.c" - @$(CC) syncsim.c -o syncsim $(CFLAGS) $(OBJ) $(LFLAGS) - -clean : - rm -f $(OBJ) - rm -f *.o - -cleanall : clean - rm -f dlsim pbchsim pdcchsim ulsim pucchsim mbmssim prachsim - rm -f *.exe* - -showflags : - @echo $(CFLAGS) - @echo $(LFLAGS) - -showobj: - @echo $(SCHED_OBJS) - -cppcheck: - @echo "cppcheck ..." - cppcheck $(INCLUDES) ${OBJ:.o=.c} ${OAISIM_OBJS,.o=.c} ${ASN1_RRC_MSG_OBJS1,.o=.c} diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 02fe3f1d29..34055517b2 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file dlsim.c \brief Top-level DL simulator @@ -57,13 +49,15 @@ #include "UTIL/LOG/log.h" #include "UTIL/LISTS/list.h" -extern unsigned int dlsch_tbs25[27][25],TBStable[27][110]; -extern unsigned char offset_mumimo_llr_drange_fix; +#include "unitary_defs.h" + #include "PHY/TOOLS/lte_phy_scope.h" -PHY_VARS_eNB *PHY_vars_eNB; -PHY_VARS_UE *PHY_vars_UE; +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; + +double cpuf; int otg_enabled=0; /*the following parameters are used to control the processing times calculations*/ @@ -96,7 +90,7 @@ DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_1E[2]; uint64_t DLSCH_alloc_pdu_1[2]; #define UL_RB_ALLOC 0x1ff; -#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2) +#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2) //#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 //#define DLSCH_RB_ALLOC 0x0001 void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms) @@ -129,44 +123,1190 @@ void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_ } +void DL_channel(PHY_VARS_eNB *eNB,PHY_VARS_UE *UE,int subframe,int awgn_flag,double SNR, int tx_lev,int hold_channel,int abstx, int num_rounds, int trials, int round, channel_desc_t *eNB2UE[4], + double *s_re[2],double *s_im[2],double *r_re[2],double *r_im[2],FILE *csv_fd) { + + int i,u; + int aa,aarx,aatx; + double channelx,channely; + double sigma2_dB,sigma2; + double iqim=0.0; + + // printf("Copying tx ..., nsymb %d (n_tx %d), awgn %d\n",nsymb,eNB->frame_parms.nb_antennas_tx,awgn_flag); + for (i=0; i<2*UE->frame_parms.samples_per_tti; i++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + if (awgn_flag == 0) { + s_re[aa][i] = ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + s_im[aa][i] = ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); + } else { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + if (aa==0) { + r_re[aarx][i] = ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]); + r_im[aarx][i] = ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); + } else { + r_re[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]); + r_im[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); + } + + } + } + } + } + + // Multipath channel + if (awgn_flag == 0) { + multipath_channel(eNB2UE[round],s_re,s_im,r_re,r_im, + 2*UE->frame_parms.samples_per_tti,hold_channel); + + // printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset); + if(abstx==1 && num_rounds>1) + if(round==0 && hold_channel==0) { + random_channel(eNB2UE[1],0); + random_channel(eNB2UE[2],0); + random_channel(eNB2UE[3],0); + } + + if (UE->perfect_ce==1) { + // fill in perfect channel estimates + freq_channel(eNB2UE[round],UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1); + /* + write_output("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8); + write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*UE->frame_parms.N_RB_DL + 1,1,8); + */ + } + } + + + if(abstx) { + if (trials==0 && round==0) { + // calculate freq domain representation to compute SINR + freq_channel(eNB2UE[0], eNB->frame_parms.N_RB_DL,2*eNB->frame_parms.N_RB_DL + 1); + // snr=pow(10.0,.1*SNR); + fprintf(csv_fd,"%f,",SNR); + + for (u=0; u<2*eNB->frame_parms.N_RB_DL; u++) { + for (aarx=0; aarxnb_rx; aarx++) { + for (aatx=0; aatxnb_tx; aatx++) { + channelx = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].x; + channely = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + + if(num_rounds>1) { + freq_channel(eNB2UE[1], eNB->frame_parms.N_RB_DL,2*eNB->frame_parms.N_RB_DL + 1); + + for (u=0; u<2*eNB->frame_parms.N_RB_DL; u++) { + for (aarx=0; aarxnb_rx; aarx++) { + for (aatx=0; aatxnb_tx; aatx++) { + channelx = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].x; + channely = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + + freq_channel(eNB2UE[2], eNB->frame_parms.N_RB_DL,2*eNB->frame_parms.N_RB_DL + 1); + + for (u=0; u<2*eNB->frame_parms.N_RB_DL; u++) { + for (aarx=0; aarxnb_rx; aarx++) { + for (aatx=0; aatxnb_tx; aatx++) { + channelx = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].x; + channely = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + + freq_channel(eNB2UE[3], eNB->frame_parms.N_RB_DL,2*eNB->frame_parms.N_RB_DL + 1); + + for (u=0; u<2*eNB->frame_parms.N_RB_DL; u++) { + for (aarx=0; aarxnb_rx; aarx++) { + for (aatx=0; aatxnb_tx; aatx++) { + channelx = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].x; + channely = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + } + } + } + + //AWGN + // tx_lev is the average energy over the whole subframe + // but SNR should be better defined wrt the energy in the reference symbols + sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(eNB->frame_parms.N_RB_DL*12)) - SNR; + sigma2 = pow(10,sigma2_dB/10); + + for (i=0; i<2*UE->frame_parms.samples_per_tti; i++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { + //printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]); + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i] = + (short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i+1] = + (short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); + } + } +} + + +void fill_DCI(PHY_VARS_eNB *eNB, + DCI_ALLOC_t *dci_alloc, + int subframe, + int n_rnti, + int n_users, + int transmission_mode, + int common_flag, + int DLSCH_RB_ALLOC, + int TPC, + int mcs1, + int mcs2, + int ndi, + int rv, + int *num_common_dci, + int *num_ue_spec_dci, + int *num_dci) { + + int k; + int dci_length = -1,dci_length_bytes = -1; + + // printf("Generating DCIs for %d users, TM %d, mcs1 %d\n",n_users,transmission_mode,mcs1); + for(k=0; kframe_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1_1_5MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_1_5MHz_TDD_t); + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = ndi; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = rv; + break; + + case 25: + dci_length = sizeof_DCI1_5MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_5MHz_TDD_t); + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = ndi; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = rv; + break; + + case 50: + dci_length = sizeof_DCI1_10MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_10MHz_TDD_t); + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = ndi; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = rv; + break; + + case 100: + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = ndi; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = rv; + dci_length = sizeof_DCI1_20MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_20MHz_TDD_t); + break; + } + } else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_1_5MHz_FDD_t); + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = ndi; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = rv; + break; + + case 25: + dci_length = sizeof_DCI1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_5MHz_FDD_t); + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = ndi; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = rv; + break; + + case 50: + dci_length = sizeof_DCI1_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_10MHz_FDD_t); + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = ndi; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = rv; + break; + + case 100: + dci_length = sizeof_DCI1_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_20MHz_FDD_t); + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = ndi; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = rv; + break; + } + } + + memcpy(&dci_alloc[*num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[*num_dci].dci_length = dci_length; + dci_alloc[*num_dci].L = 1; + dci_alloc[*num_dci].rnti = n_rnti+k; + dci_alloc[*num_dci].format = format1; + dci_alloc[*num_dci].search_space = DCI_UE_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[*num_dci]); + + // printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format1, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + *num_dci = *num_dci+1; + *num_ue_spec_dci = *num_ue_spec_dci+1; + } else { + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); + break; + } + } else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + dci_length = sizeof_DCI1A_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + + memcpy(&dci_alloc[*num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[*num_dci].dci_length = dci_length; + dci_alloc[*num_dci].L = 1; + dci_alloc[*num_dci].rnti = SI_RNTI; + dci_alloc[*num_dci].format = format1A; + dci_alloc[*num_dci].firstCCE = 0; + dci_alloc[*num_dci].search_space = DCI_COMMON_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[*num_dci]); + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + SI_RNTI, + format1A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + *num_common_dci=*num_common_dci+1; + *num_dci = *num_dci + 1; + + } + + break; + + case 3: + if (common_flag == 0) { + + if (eNB->frame_parms.nb_antennas_tx == 2) { + + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2A_1_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t); + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 25: + dci_length = sizeof_DCI2A_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_5MHz_2A_TDD_t); + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 50: + dci_length = sizeof_DCI2A_10MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_10MHz_2A_TDD_t); + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 100: + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + dci_length = sizeof_DCI2A_20MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_20MHz_2A_TDD_t); + break; + } + } + + else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2A_1_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t); + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 25: + dci_length = sizeof_DCI2A_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_5MHz_2A_FDD_t); + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 50: + dci_length = sizeof_DCI2A_10MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_10MHz_2A_FDD_t); + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 100: + dci_length = sizeof_DCI2A_20MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_20MHz_2A_FDD_t); + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + } + } + } else if (eNB->frame_parms.nb_antennas_tx == 4) { + + } + + memcpy(&dci_alloc[*num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[*num_dci].dci_length = dci_length; + dci_alloc[*num_dci].L = 1; + dci_alloc[*num_dci].rnti = n_rnti+k; + dci_alloc[*num_dci].format = format2A; + dci_alloc[*num_dci].search_space = DCI_UE_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[*num_dci]); + + //printf("Generating dlsch params for user %d / format 2A (%d)\n",k,format2A); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + *num_dci = *num_dci + 1; + *num_ue_spec_dci = *num_ue_spec_dci + 1; + } else { + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); + break; + } + } else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + dci_length = sizeof_DCI1A_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + + memcpy(&dci_alloc[*num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[*num_dci].dci_length = dci_length; + dci_alloc[*num_dci].L = 1; + dci_alloc[*num_dci].rnti = SI_RNTI; + dci_alloc[*num_dci].format = format1A; + dci_alloc[*num_dci].firstCCE = 0; + dci_alloc[*num_dci].search_space = DCI_COMMON_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[*num_dci]); + + //printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + SI_RNTI, + format1A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + *num_common_dci = *num_common_dci + 1; + *num_dci = *num_dci + 1; + + } + + //printf("Generated DCI format 2A (Transmission Mode 3)\n"); + break; + + case 4: + if (common_flag == 0) { + + if (eNB->frame_parms.nb_antennas_tx == 2) { + + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2_1_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_1_5MHz_2A_TDD_t); + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 25: + dci_length = sizeof_DCI2_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_5MHz_2A_TDD_t); + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 50: + dci_length = sizeof_DCI2_10MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_10MHz_2A_TDD_t); + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 100: + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + dci_length = sizeof_DCI2_20MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_20MHz_2A_TDD_t); + break; + } + } + + else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2_1_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_1_5MHz_2A_FDD_t); + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 25: + dci_length = sizeof_DCI2_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_5MHz_2A_FDD_t); + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 50: + dci_length = sizeof_DCI2_10MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_10MHz_2A_FDD_t); + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + + case 100: + dci_length = sizeof_DCI2_20MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_20MHz_2A_FDD_t); + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = ndi; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = rv; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = ndi; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = rv; + break; + } + } + } else if (eNB->frame_parms.nb_antennas_tx == 4) { + + } + + memcpy(&dci_alloc[*num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[*num_dci].dci_length = dci_length; + dci_alloc[*num_dci].L = 1; + dci_alloc[*num_dci].rnti = n_rnti+k; + dci_alloc[*num_dci].format = format2; + dci_alloc[*num_dci].search_space = DCI_UE_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[*num_dci]); + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + *num_dci = *num_dci + 1; + *num_ue_spec_dci = *num_ue_spec_dci + 1; + } else { + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); + break; + } + } else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + dci_length = sizeof_DCI1A_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + + memcpy(&dci_alloc[*num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[*num_dci].dci_length = dci_length; + dci_alloc[*num_dci].L = 1; + dci_alloc[*num_dci].rnti = SI_RNTI; + dci_alloc[*num_dci].format = format1A; + dci_alloc[*num_dci].firstCCE = 0; + dci_alloc[*num_dci].search_space = DCI_COMMON_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[*num_dci]); + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + SI_RNTI, + format1A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + *num_common_dci = *num_common_dci + 1; + *num_dci = *num_dci + 1; + + } + + break; + + case 5: + case 6: + memcpy(&dci_alloc[*num_dci].dci_pdu[0],&DLSCH_alloc_pdu2_1E[k],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + dci_alloc[*num_dci].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + dci_alloc[*num_dci].L = 1; + dci_alloc[*num_dci].rnti = n_rnti+k; + dci_alloc[*num_dci].format = format1E_2A_M10PRB; + dci_alloc[*num_dci].firstCCE = 4*k; + dci_alloc[*num_dci].search_space = DCI_UE_SPACE; + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu2_1E[k], + n_rnti+k, + format1E_2A_M10PRB, + eNB->dlsch[k], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[k].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + dump_dci(&eNB->frame_parms,&dci_alloc[*num_dci]); + *num_ue_spec_dci = *num_ue_spec_dci + 1; + *num_dci = *num_dci + 1; + + break; + + default: + printf("Unsupported Transmission Mode!!!"); + exit(-1); + break; + } + } +} + +int n_users = 1; +sub_frame_t subframe=7; +DCI_PDU DCI_pdu; +int num_common_dci=0,num_ue_spec_dci=0,num_dci=0,num_pdcch_symbols=1; + + +DCI_PDU *get_dci_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subframeP) { + + if (subframeP == subframe) { + DCI_pdu.Num_dci = num_ue_spec_dci + num_common_dci; + DCI_pdu.num_pdcch_symbols = num_pdcch_symbols; + } else { + DCI_pdu.Num_dci = 0; + DCI_pdu.num_pdcch_symbols = num_pdcch_symbols; + } + + return &DCI_pdu; +} + +void eNB_dlsch_ulsch_scheduler(module_id_t module_idP, uint8_t cooperation_flag, frame_t frameP, sub_frame_t subframeP) { + + return; +} + +uint16_t n_rnti=0x1234; +unsigned char *input_buffer0[2],*input_buffer1[2]; +unsigned short input_buffer_length0,input_buffer_length1; + +uint8_t *get_dlsch_sdu(module_id_t module_idP,int CC_id,frame_t frameP,rnti_t rnti,uint8_t TBindex) { + + int k; + + for (k=0;kuse_ia_receiver = 1; - if ((n_tx!=2) || (transmission_mode!=5)) { + if ((n_tx_port!=2) || (transmission_mode!=5)) { msg("IA receiver only supported for TM5!"); exit(-1); } @@ -508,6 +1654,17 @@ int main(int argc, char **argv) print_perf=1; break; + case 'q': + n_tx_port=atoi(optarg); + + if ((n_tx_port==0) || ((n_tx_port>2))) { + msg("Unsupported number of cell specific antennas ports %d\n",n_tx_port); + exit(-1); + } + + break; + + case 'x': transmission_mode=atoi(optarg); @@ -516,25 +1673,37 @@ int main(int argc, char **argv) (transmission_mode!=3) && (transmission_mode!=4) && (transmission_mode!=5) && - (transmission_mode!=6)) { + (transmission_mode!=6) && + (transmission_mode!=7)) { msg("Unsupported transmission mode %d\n",transmission_mode); exit(-1); } - if (transmission_mode>1) { - n_tx = 2; + if (transmission_mode>1 && transmission_mode<7) { + n_tx_port = 2; } break; case 'y': - n_tx=atoi(optarg); + n_tx_phy=atoi(optarg); - if ((n_tx==0) || (n_tx>2)) { - msg("Unsupported number of tx antennas %d\n",n_tx); + if (n_tx_phy < n_tx_port) { + msg("n_tx_phy mush not be smaller than n_tx_port"); exit(-1); } + if ((transmission_mode>1 && transmission_mode<7) && n_tx_port<2) { + msg("n_tx_port must be >1 for transmission_mode %d\n",transmission_mode); + exit(-1); + } + + if (transmission_mode==7 && (n_tx_phy!=1 && n_tx_phy!=2 && n_tx_phy!=4 && n_tx_phy!=8 && n_tx_phy!=16 && n_tx_phy!=64 && n_tx_phy!=128)) { + msg("Physical number of antennas not supported for TM7.\n"); + exit(-1); + } + + break; break; case 'X': @@ -559,26 +1728,34 @@ int main(int argc, char **argv) dump_table=1; break; - + case 'L': + log_level=atoi(optarg); + break; case 'h': default: - printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs1 -M mcs2 -n n_frames -s snr0 -x transmission mode (1,2,5,6) -y TXant -z RXant -I trch_file\n",argv[0]); + printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs1 -M mcs2 -n n_frames -s snr0 -x transmission mode (1,2,5,6,7) -y TXant -z RXant -I trch_file\n",argv[0]); printf("-h This message\n"); printf("-a Use AWGN channel and not multipath\n"); printf("-c Number of PDCCH symbols\n"); printf("-m MCS1 for TB 1\n"); printf("-M MCS2 for TB 2\n"); - printf("-d Transmit the DCI and compute its error statistics and the overall throughput\n"); + printf("-d Transmit the DCI and compute its error statistics\n"); printf("-p Use extended prefix mode\n"); printf("-n Number of frames to simulate\n"); printf("-o Sample offset for receiver\n"); printf("-s Starting SNR, runs from SNR to SNR+%.1fdB in steps of %.1fdB. If n_frames is 1 then just SNR is simulated and MATLAB/OCTAVE output is generated\n", snr_int, snr_step); printf("-f step size of SNR, default value is 1.\n"); + printf("-C cell id\n"); + printf("-S subframe\n"); + printf("-D use TDD mode\n"); + printf("-b TDD config\n"); + printf("-B bandwidth configuration (in number of ressource blocks): 6, 25, 50, 100\n"); printf("-r ressource block allocation (see section 7.1.6.3 in 36.213\n"); printf("-g [A:M] Use 3GPP 25.814 SCM-A/B/C/D('A','B','C','D') or 36-101 EPA('E'), EVA ('F'),ETU('G') models (ignores delay spread and Ricean factor), Rayghleigh8 ('H'), Rayleigh1('I'), Rayleigh1_corr('J'), Rayleigh1_anticorr ('K'), Rice8('L'), Rice1('M')\n"); printf("-F forgetting factor (0 new channel every trial, 1 channel constant\n"); - printf("-x Transmission mode (1,2,6 for the moment)\n"); + printf("-x Transmission mode (1,2,6,7 for the moment)\n"); + printf("-q Number of TX antennas ports used in eNB\n"); printf("-y Number of TX antennas used in eNB\n"); printf("-z Number of RX antennas used in UE\n"); printf("-t MCS of interfering UE\n"); @@ -593,6 +1770,16 @@ int main(int argc, char **argv) } } + logInit(); + // enable these lines if you need debug info + set_comp_log(PHY,LOG_DEBUG,LOG_HIGH,1); + set_glog(log_level,LOG_HIGH); + // moreover you need to init itti with the following line + // however itti will catch all signals, so ctrl-c won't work anymore + // alternatively you can disable ITTI completely in CMakeLists.txt + //itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL); + + if (common_flag == 0) { switch (N_RB_DL) { case 6: @@ -617,17 +1804,14 @@ int main(int argc, char **argv) } else NB_RB = 4; - if ((transmission_mode > 1) && (n_tx != 2)) - printf("n_tx must be >1 for transmission_mode %d\n",transmission_mode); - if (xforms==1) { fl_initialize (&argc, argv, NULL, 0, 0); form_ue = create_lte_phy_scope_ue(); sprintf (title, "LTE PHY SCOPE eNB"); fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - + if (!dual_stream_UE==0) { - openair_daq_vars.use_ia_receiver = 1; + UE->use_ia_receiver = 1; fl_set_button(form_ue->button_0,1); fl_set_object_label(form_ue->button_0, "IA Receiver ON"); fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN); @@ -639,7 +1823,8 @@ int main(int argc, char **argv) printf("dual_stream_UE=%d\n", dual_stream_UE); } - lte_param_init(n_tx, + lte_param_init(n_tx_port, + n_tx_phy, n_rx, transmission_mode, extended_prefix_flag, @@ -651,39 +1836,50 @@ int main(int argc, char **argv) osf, perfect_ce); + if ((transmission_mode==1) || (transmission_mode==7)) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) + for (re=0; reframe_parms.ofdm_symbol_size; re++) + eNB->common_vars.beam_weights[0][0][aa][re] = 0x00007fff/eNB->frame_parms.nb_antennas_tx; + } - - eNB_id_i = PHY_vars_UE->n_connected_eNB; + if (transmission_mode<7) + eNB->do_precoding=0; + else + eNB->do_precoding=1; + + eNB->mac_enabled=1; + if (two_thread_flag == 0) { + eNB->te = dlsch_encoding; + } + else { + eNB->te = dlsch_encoding_2threads; + extern void init_td_thread(PHY_VARS_eNB *, pthread_attr_t *); + extern void init_te_thread(PHY_VARS_eNB *, pthread_attr_t *); + init_td_thread(eNB,NULL); + init_te_thread(eNB,NULL); + } + + // callback functions required for phy_procedures_tx + mac_xface->get_dci_sdu = get_dci_sdu; + mac_xface->get_dlsch_sdu = get_dlsch_sdu; + mac_xface->eNB_dlsch_ulsch_scheduler = eNB_dlsch_ulsch_scheduler; + + // eNB_id_i = UE->n_connected_eNB; printf("Setting mcs1 = %d\n",mcs1); printf("Setting mcs2 = %d\n",mcs2); printf("NPRB = %d\n",NB_RB); printf("n_frames = %d\n",n_frames); - printf("Transmission mode %d with %dx%d antenna configuration, Extended Prefix %d\n",transmission_mode,n_tx,n_rx,extended_prefix_flag); + printf("Transmission mode %d with %dx%d antenna configuration, Extended Prefix %d\n",transmission_mode,n_tx_phy,n_rx,extended_prefix_flag); snr1 = snr0+snr_int; printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - /* - txdataF = (int **)malloc16(2*sizeof(int*)); - txdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - txdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - txdata = (int **)malloc16(2*sizeof(int*)); - txdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - txdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &eNB->frame_parms; - s_re = malloc(2*sizeof(double*)); - s_im = malloc(2*sizeof(double*)); - r_re = malloc(2*sizeof(double*)); - r_im = malloc(2*sizeof(double*)); - // r_re0 = malloc(2*sizeof(double*)); - // r_im0 = malloc(2*sizeof(double*)); - - nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12; + nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; printf("Channel Model= (%s,%d)\n",channel_model_input, channel_model); printf("SCM-A=%d, SCM-B=%d, SCM-C=%d, SCM-D=%d, EPA=%d, EVA=%d, ETU=%d, Rayleigh8=%d, Rayleigh1=%d, Rayleigh1_corr=%d, Rayleigh1_anticorr=%d, Rice1=%d, Rice8=%d\n", @@ -709,7 +1905,7 @@ int main(int argc, char **argv) //char dirname[FILENAME_MAX]; //sprintf(dirname, "%s/SIMU/USER/pre-ci-logs-%s", getenv("OPENAIR_TARGETS"),hostname ); sprintf(time_meas_fname,"time_meas_prb%d_mcs%d_anttx%d_antrx%d_pdcch%d_channel%s_tx%d.csv", - N_RB_DL,mcs1,n_tx,n_rx,num_pdcch_symbols,channel_model_input,transmission_mode); + N_RB_DL,mcs1,n_tx_phy,n_rx,num_pdcch_symbols,channel_model_input,transmission_mode); //mkdir(dirname,0777); time_meas_fd = fopen(time_meas_fname,"w"); if (time_meas_fd==NULL) { @@ -826,19 +2022,7 @@ int main(int argc, char **argv) } */ - for (i=0; i<2; i++) { - s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // r_re0[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // bzero(r_re0[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // r_im0[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // bzero(r_im0[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - } - - - PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = n_rnti; + UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti = n_rnti; // Fill in UL_alloc UL_alloc_pdu.type = 0; @@ -882,22 +2066,22 @@ int main(int argc, char **argv) DLSCH_alloc_pdu2_1E[1].tpmi = (transmission_mode>=5 ? 5 : 0) ; // precoding DLSCH_alloc_pdu2_1E[1].dl_power_off = (transmission_mode==5 ? 0 : 1); - eNB2UE[0] = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE[0] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), forgetting_factor, rx_sample_offset, 0); if(num_rounds>1) { for(n=1; n<4; n++) - eNB2UE[n] = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE[n] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), forgetting_factor, rx_sample_offset, 0); @@ -933,1029 +2117,90 @@ int main(int argc, char **argv) for (k=0; kdlsch_eNB[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0); + eNB->dlsch[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0,&eNB->frame_parms); - if (!PHY_vars_eNB->dlsch_eNB[k][i]) { + if (!eNB->dlsch[k][i]) { printf("Can't get eNB dlsch structures\n"); exit(-1); } - PHY_vars_eNB->dlsch_eNB[k][i]->rnti = n_rnti+k; + eNB->dlsch[k][i]->rnti = n_rnti+k; } } - for (i=0; i<2; i++) { - PHY_vars_UE->dlsch_ue[0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); + /* allocate memory for both subframes (only one is really used + * but there is now "copy_harq_proc_struct" which needs both + * to be valid) + * TODO: refine this somehow (necessary?) + */ + for (sf = 0; sf < 2; sf++) { + for (i=0; i<2; i++) { + UE->dlsch[sf][0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); - if (!PHY_vars_UE->dlsch_ue[0][i]) { - printf("Can't get ue dlsch structures\n"); - exit(-1); + if (!UE->dlsch[sf][0][i]) { + printf("Can't get ue dlsch structures\n"); + exit(-1); + } + + UE->dlsch[sf][0][i]->rnti = n_rnti; } - - PHY_vars_UE->dlsch_ue[0][i]->rnti = n_rnti; } + UE->dlsch_SI[0] = new_ue_dlsch(1,1,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); + UE->dlsch_ra[0] = new_ue_dlsch(1,1,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); + UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0); + // structure for SIC at UE - PHY_vars_UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0); + UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0,&eNB->frame_parms); if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single = (unsigned short)(taus()&0xffff); + eNB->UE_stats[0].DL_pmi_single = (unsigned short)(taus()&0xffff); if (n_users>1) - PHY_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); //opposite PMI + eNB->UE_stats[1].DL_pmi_single = (eNB->UE_stats[0].DL_pmi_single ^ 0x1555); //opposite PMI } else { - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single = 0; + eNB->UE_stats[0].DL_pmi_single = 0; if (n_users>1) - PHY_vars_eNB->eNB_UE_stats[1].DL_pmi_single = 0; + eNB->UE_stats[1].DL_pmi_single = 0; } if (input_fd==NULL) { - /* - // common DCI - memcpy(&dci_alloc[num_dci].dci_pdu[0],&CCCH_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); - dci_alloc[num_dci].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; - dci_alloc[num_dci].L = 2; - dci_alloc[num_dci].rnti = SI_RNTI; - num_dci++; - num_common_dci++; - */ - // UE specific DCI - for(k=0; klte_frame_parms.frame_type == TDD) { + numCCE = get_nCCE(num_pdcch_symbols,&eNB->frame_parms,get_mi(&eNB->frame_parms,subframe)); - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI1_1_5MHz_TDD_t; - dci_length_bytes = sizeof(DCI1_1_5MHz_TDD_t); - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; + if (n_frames==1) printf("num_pdcch_symbols %d, numCCE %d, num_dci %d/%d/%d\n",num_pdcch_symbols,numCCE, num_dci,num_ue_spec_dci,num_common_dci); - case 25: - dci_length = sizeof_DCI1_5MHz_TDD_t; - dci_length_bytes = sizeof(DCI1_5MHz_TDD_t); - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - case 50: - dci_length = sizeof_DCI1_10MHz_TDD_t; - dci_length_bytes = sizeof(DCI1_10MHz_TDD_t); - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - case 100: - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - dci_length = sizeof_DCI1_20MHz_TDD_t; - dci_length_bytes = sizeof(DCI1_20MHz_TDD_t); - break; - } - } else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI1_1_5MHz_FDD_t; - dci_length_bytes = sizeof(DCI1_1_5MHz_FDD_t); - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 25: - dci_length = sizeof_DCI1_5MHz_FDD_t; - dci_length_bytes = sizeof(DCI1_5MHz_FDD_t); - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 50: - dci_length = sizeof_DCI1_10MHz_FDD_t; - dci_length_bytes = sizeof(DCI1_10MHz_FDD_t); - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 100: - dci_length = sizeof_DCI1_20MHz_FDD_t; - dci_length_bytes = sizeof(DCI1_20MHz_FDD_t); - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - } - } - - memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); - dci_alloc[num_dci].dci_length = dci_length; - dci_alloc[num_dci].L = 1; - dci_alloc[num_dci].rnti = n_rnti+k; - dci_alloc[num_dci].format = format1; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); - - printf("Generating dlsch params for user %d\n",k); - generate_eNB_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - n_rnti+k, - format1, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - num_dci++; - num_ue_spec_dci++; - } else { - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { - - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 25: - dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 1; - break; - - case 50: - dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 100: - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); - break; - } - } else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI1A_1_5MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 25: - dci_length = sizeof_DCI1A_5MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 50: - dci_length = sizeof_DCI1A_10MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 100: - dci_length = sizeof_DCI1A_20MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - } - } - - memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); - dci_alloc[num_dci].dci_length = dci_length; - dci_alloc[num_dci].L = 1; - dci_alloc[num_dci].rnti = SI_RNTI; - dci_alloc[num_dci].format = format1A; - dci_alloc[num_dci].firstCCE = 0; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); - - printf("Generating dlsch params for user %d\n",k); - generate_eNB_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - SI_RNTI, - format1A, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - num_common_dci++; - num_dci++; - - } - - break; - - case 3: - if (common_flag == 0) { - - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 2) { - - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { - - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI2A_1_5MHz_2A_TDD_t; - dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t); - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 25: - dci_length = sizeof_DCI2A_5MHz_2A_TDD_t; - dci_length_bytes = sizeof(DCI2A_5MHz_2A_TDD_t); - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 50: - dci_length = sizeof_DCI2A_10MHz_2A_TDD_t; - dci_length_bytes = sizeof(DCI2A_10MHz_2A_TDD_t); - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 100: - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - dci_length = sizeof_DCI2A_20MHz_2A_TDD_t; - dci_length_bytes = sizeof(DCI2A_20MHz_2A_TDD_t); - break; - } - } - - else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI2A_1_5MHz_2A_FDD_t; - dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t); - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 25: - dci_length = sizeof_DCI2A_5MHz_2A_FDD_t; - dci_length_bytes = sizeof(DCI2A_5MHz_2A_FDD_t); - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 50: - dci_length = sizeof_DCI2A_10MHz_2A_FDD_t; - dci_length_bytes = sizeof(DCI2A_10MHz_2A_FDD_t); - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 100: - dci_length = sizeof_DCI2A_20MHz_2A_FDD_t; - dci_length_bytes = sizeof(DCI2A_20MHz_2A_FDD_t); - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - } - } - } else if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 4) { - - } - - memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); - dci_alloc[num_dci].dci_length = dci_length; - dci_alloc[num_dci].L = 1; - dci_alloc[num_dci].rnti = n_rnti+k; - dci_alloc[num_dci].format = format2A; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); - - printf("Generating dlsch params for user %d / format 2A (%d)\n",k,format2A); - generate_eNB_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - n_rnti+k, - format2A, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - num_dci++; - num_ue_spec_dci++; - } else { - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { - - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 25: - dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 1; - break; - - case 50: - dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 100: - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); - break; - } - } else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI1A_1_5MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 25: - dci_length = sizeof_DCI1A_5MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 50: - dci_length = sizeof_DCI1A_10MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 100: - dci_length = sizeof_DCI1A_20MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - } - } - - memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); - dci_alloc[num_dci].dci_length = dci_length; - dci_alloc[num_dci].L = 1; - dci_alloc[num_dci].rnti = SI_RNTI; - dci_alloc[num_dci].format = format1A; - dci_alloc[num_dci].firstCCE = 0; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); - - printf("Generating dlsch params for user %d\n",k); - generate_eNB_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - SI_RNTI, - format1A, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - num_common_dci++; - num_dci++; - - } - - printf("Generated DCI format 2A (Transmission Mode 3)\n"); - break; - - case 4: - if (common_flag == 0) { - - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 2) { - - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { - - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI2_1_5MHz_2A_TDD_t; - dci_length_bytes = sizeof(DCI2_1_5MHz_2A_TDD_t); - ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 25: - dci_length = sizeof_DCI2_5MHz_2A_TDD_t; - dci_length_bytes = sizeof(DCI2_5MHz_2A_TDD_t); - ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 50: - dci_length = sizeof_DCI2_10MHz_2A_TDD_t; - dci_length_bytes = sizeof(DCI2_10MHz_2A_TDD_t); - ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 100: - ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - dci_length = sizeof_DCI2_20MHz_2A_TDD_t; - dci_length_bytes = sizeof(DCI2_20MHz_2A_TDD_t); - break; - } - } - - else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI2_1_5MHz_2A_FDD_t; - dci_length_bytes = sizeof(DCI2_1_5MHz_2A_FDD_t); - ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 25: - dci_length = sizeof_DCI2_5MHz_2A_FDD_t; - dci_length_bytes = sizeof(DCI2_5MHz_2A_FDD_t); - ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 50: - dci_length = sizeof_DCI2_10MHz_2A_FDD_t; - dci_length_bytes = sizeof(DCI2_10MHz_2A_FDD_t); - ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - - case 100: - dci_length = sizeof_DCI2_20MHz_2A_FDD_t; - dci_length_bytes = sizeof(DCI2_20MHz_2A_FDD_t); - ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; - ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; - ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; - ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; - ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; - ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; - ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; - ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; - ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; - break; - } - } - } else if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 4) { - - } - - memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); - dci_alloc[num_dci].dci_length = dci_length; - dci_alloc[num_dci].L = 1; - dci_alloc[num_dci].rnti = n_rnti+k; - dci_alloc[num_dci].format = format2; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); - - printf("Generating dlsch params for user %d\n",k); - generate_eNB_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - n_rnti+k, - format2, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - num_dci++; - num_ue_spec_dci++; - } else { - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { - - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 25: - dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 1; - break; - - case 50: - dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 100: - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; - dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); - break; - } - } else { - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - dci_length = sizeof_DCI1A_1_5MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 25: - dci_length = sizeof_DCI1A_5MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 50: - dci_length = sizeof_DCI1A_10MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - - case 100: - dci_length = sizeof_DCI1A_20MHz_FDD_t; - dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9); - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; - ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; - break; - } - } - - memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); - dci_alloc[num_dci].dci_length = dci_length; - dci_alloc[num_dci].L = 1; - dci_alloc[num_dci].rnti = SI_RNTI; - dci_alloc[num_dci].format = format1A; - dci_alloc[num_dci].firstCCE = 0; - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); - - printf("Generating dlsch params for user %d\n",k); - generate_eNB_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - SI_RNTI, - format1A, - PHY_vars_eNB->dlsch_eNB[0], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - - num_common_dci++; - num_dci++; - - } - - break; - - case 5: - case 6: - memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu2_1E[k],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - dci_alloc[num_dci].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; - dci_alloc[num_dci].L = 1; - dci_alloc[num_dci].rnti = n_rnti+k; - dci_alloc[num_dci].format = format1E_2A_M10PRB; - dci_alloc[num_dci].firstCCE = 4*k; - printf("Generating dlsch params for user %d\n",k); - generate_eNB_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu2_1E[k], - n_rnti+k, - format1E_2A_M10PRB, - PHY_vars_eNB->dlsch_eNB[k], - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI, - PHY_vars_eNB->eNB_UE_stats[k].DL_pmi_single); - - dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]); - num_ue_spec_dci++; - num_dci++; - - break; - - default: - printf("Unsupported Transmission Mode!!!"); - exit(-1); - break; - } - - - - - /* - memcpy(&dci_alloc[1].dci_pdu[0],&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD0_t)); - dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_0_t; - dci_alloc[1].L = 2; - dci_alloc[1].rnti = n_rnti; - */ - } - - if (n_frames==1) printf("num_pdcch_symbols %d, numCCE %d => ",num_pdcch_symbols,numCCE); - - numCCE = get_nCCE(num_pdcch_symbols,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,subframe)); - - if (n_frames==1) printf("%d\n",numCCE); - - // apply RNTI-based nCCE allocation - memset(CCE_table,0,800*sizeof(int)); - - for (i=num_common_dci; idlsch_eNB[k][0]->harq_processes[0]->TBS/8; + input_buffer_length0 = eNB->dlsch[k][0]->harq_processes[0]->TBS/8; input_buffer0[k] = (unsigned char *)malloc(input_buffer_length0+4); memset(input_buffer0[k],0,input_buffer_length0+4); - input_buffer_length1 = PHY_vars_eNB->dlsch_eNB[k][1]->harq_processes[0]->TBS/8; + input_buffer_length1 = eNB->dlsch[k][1]->harq_processes[0]->TBS/8; input_buffer1[k] = (unsigned char *)malloc(input_buffer_length1+4); memset(input_buffer1[k],0,input_buffer_length1+4); @@ -1975,6 +2220,7 @@ int main(int argc, char **argv) while ((!feof(input_trch_fd)) && (i>3]+=(1<<(7-(i&7))); @@ -1994,20 +2240,22 @@ int main(int argc, char **argv) } // this is for user 0 only - coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->nb_rb, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rb_alloc, - get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs), - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Nl, + coded_bits_per_codeword = get_G(&eNB->frame_parms, + eNB->dlsch[0][0]->harq_processes[0]->nb_rb, + eNB->dlsch[0][0]->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs), + eNB->dlsch[0][0]->harq_processes[0]->Nl, num_pdcch_symbols, - 0,subframe); + 0, + subframe, + transmission_mode>=7?transmission_mode:0); uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword); printf("uncoded_ber_bit=%p\n",uncoded_ber_bit); snr_step = input_snr_step; - PHY_vars_UE->high_speed_flag = 1; - PHY_vars_UE->ch_est_alpha=0; + UE->high_speed_flag = 1; + UE->ch_est_alpha=0; for (ch_realization=0; ch_realizationframe_rx=0; + UE->proc.proc_rxtx[UE->current_thread_id[subframe]].frame_rx=0; errs[0]=0; errs[1]=0; errs[2]=0; @@ -2029,38 +2277,42 @@ int main(int argc, char **argv) round_trials[2] = 0; round_trials[3] = 0; - dci_errors=0; + dci_errors[0]=0; + dci_errors[1]=0; + dci_errors[2]=0; + dci_errors[3]=0; // avg_ber = 0; round=0; avg_iter = 0; iter_trials=0; - reset_meas(&PHY_vars_eNB->phy_proc_tx); // total eNB tx - reset_meas(&PHY_vars_eNB->dlsch_scrambling_stats); - reset_meas(&PHY_vars_UE->dlsch_unscrambling_stats); - reset_meas(&PHY_vars_eNB->ofdm_mod_stats); - reset_meas(&PHY_vars_eNB->dlsch_modulation_stats); - reset_meas(&PHY_vars_eNB->dlsch_encoding_stats); - reset_meas(&PHY_vars_eNB->dlsch_interleaving_stats); - reset_meas(&PHY_vars_eNB->dlsch_rate_matching_stats); - reset_meas(&PHY_vars_eNB->dlsch_turbo_encoding_stats); + reset_meas(&eNB->phy_proc_tx); // total eNB tx + reset_meas(&eNB->dlsch_scrambling_stats); + reset_meas(&UE->dlsch_unscrambling_stats); + reset_meas(&eNB->ofdm_mod_stats); + reset_meas(&eNB->dlsch_modulation_stats); + reset_meas(&eNB->dlsch_encoding_stats); + reset_meas(&eNB->dlsch_interleaving_stats); + reset_meas(&eNB->dlsch_rate_matching_stats); + reset_meas(&eNB->dlsch_turbo_encoding_stats); - reset_meas(&PHY_vars_UE->phy_proc_rx); // total UE rx - reset_meas(&PHY_vars_UE->ofdm_demod_stats); - reset_meas(&PHY_vars_UE->dlsch_channel_estimation_stats); - reset_meas(&PHY_vars_UE->dlsch_freq_offset_estimation_stats); - reset_meas(&PHY_vars_UE->rx_dft_stats); - reset_meas(&PHY_vars_UE->dlsch_decoding_stats); - reset_meas(&PHY_vars_UE->dlsch_turbo_decoding_stats); - reset_meas(&PHY_vars_UE->dlsch_deinterleaving_stats); - reset_meas(&PHY_vars_UE->dlsch_rate_unmatching_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_init_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_alpha_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_beta_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_gamma_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_ext_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_intl1_stats); - reset_meas(&PHY_vars_UE->dlsch_tc_intl2_stats); + reset_meas(&UE->phy_proc_rx[UE->current_thread_id[subframe]]); // total UE rx + reset_meas(&UE->ofdm_demod_stats); + reset_meas(&UE->dlsch_channel_estimation_stats); + reset_meas(&UE->dlsch_freq_offset_estimation_stats); + reset_meas(&UE->rx_dft_stats); + reset_meas(&UE->dlsch_decoding_stats[0]); + reset_meas(&UE->dlsch_decoding_stats[1]); + reset_meas(&UE->dlsch_turbo_decoding_stats); + reset_meas(&UE->dlsch_deinterleaving_stats); + reset_meas(&UE->dlsch_rate_unmatching_stats); + reset_meas(&UE->dlsch_tc_init_stats); + reset_meas(&UE->dlsch_tc_alpha_stats); + reset_meas(&UE->dlsch_tc_beta_stats); + reset_meas(&UE->dlsch_tc_gamma_stats); + reset_meas(&UE->dlsch_tc_ext_stats); + reset_meas(&UE->dlsch_tc_intl1_stats); + reset_meas(&UE->dlsch_tc_intl2_stats); // initialization struct list time_vector_tx; initialize(&time_vector_tx); @@ -2080,24 +2332,26 @@ int main(int argc, char **argv) struct list time_vector_rx_dec; initialize(&time_vector_rx_dec); + eNB_rxtx_proc_t *proc_eNB = &eNB->proc.proc_rxtx[UE->current_thread_id[subframe]]; + for (trials = 0; trialsfirst_run = 1; + UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_ack[subframe].ack = 0; + UE->dlsch[UE->current_thread_id[subframe]][eNB_id][1]->harq_ack[subframe].ack = 0; - ret = PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations+1; - - while ((round < num_rounds) && (ret > PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations)) { - // printf("Trial %d, round %d\n",trials,round); + while ((round < num_rounds) && (UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_ack[subframe].ack == 0)) { + // printf("Trial %d, round %d\n",trials,round); round_trials[round]++; - if(transmission_mode>=5) - pmi_feedback=1; - else - pmi_feedback=0; + //if(transmission_mode>=5) + // pmi_feedback=1; + //else + // pmi_feedback=0; if (abstx) { if (trials==0 && round==0 && SNR==snr0) //generate a new channel @@ -2107,583 +2361,58 @@ int main(int argc, char **argv) } else hold_channel = 0;//(round==0) ? 0 : 1; -PMI_FEEDBACK: + //PMI_FEEDBACK: // printf("Trial %d : Round %d, pmi_feedback %d \n",trials,round,pmi_feedback); - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + memset(&eNB->common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); } if (input_fd==NULL) { - start_meas(&PHY_vars_eNB->phy_proc_tx); // Simulate HARQ procedures!!! + memset(CCE_table,0,800*sizeof(int)); if (common_flag == 0) { + num_dci=0; + num_common_dci=0; + num_ue_spec_dci=0; + if (round == 0) { // First round TB0_active = 1; - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3; + eNB->dlsch[0][0]->harq_processes[0]->rvidx = round&3; + + fill_DCI(eNB,&dci_alloc[0],subframe,n_rnti,n_users,transmission_mode,common_flag,DLSCH_RB_ALLOC,TPC, + mcs1,mcs2,!(trials&1),round&3,&num_common_dci,&num_ue_spec_dci,&num_dci); + } + else { + fill_DCI(eNB,&dci_alloc[0],subframe,n_rnti,n_users,transmission_mode,common_flag,DLSCH_RB_ALLOC,TPC, + (TB0_active==1)?mcs1:0,mcs2,!(trials&1),(TB0_active==1)?round&3:0,&num_common_dci,&num_ue_spec_dci,&num_dci); + } + for (i=num_common_dci; ilte_frame_parms.frame_type == TDD) { - switch (transmission_mode) { - case 1: - case 2: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_TDD_t)); - break; - - case 25: - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_TDD_t)); - break; - - case 50: - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_TDD_t)); - break; - - case 100: - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_TDD_t)); - break; - } - - break; - - case 3: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t)); - break; - - case 25: - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t)); - break; - - case 50: - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t)); - break; - - case 100: - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t)); - break; - } - - break; - - case 5: - DLSCH_alloc_pdu2_1E[0].ndi = trials&1; - DLSCH_alloc_pdu2_1E[0].rv = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - break; - } - } else { // FDD - switch (transmission_mode) { - case 1: - case 2: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_FDD_t)); - break; - - case 25: - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_FDD_t)); - break; - - case 50: - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_FDD_t)); - break; - - case 100: - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_FDD_t)); - break; - } - - break; - - case 3: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t)); - break; - - case 25: - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t)); - break; - - case 50: - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t)); - break; - - case 100: - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t)); - break; - } - - break; - - case 5: - DLSCH_alloc_pdu2_1E[0].ndi = trials&1; - DLSCH_alloc_pdu2_1E[0].rv = 0; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - break; - } - - } - } else { - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3; - - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { - - - switch (transmission_mode) { - case 1: - case 2: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_TDD_t)); - break; - - case 25: - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_TDD_t)); - break; - - case 50: - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_TDD_t)); - break; - - case 100: - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_TDD_t)); - break; - } - - break; - - case 3: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - if (TB0_active==1) { - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } else { // deactivate TB0 - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } - - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t)); - break; - - case 25: - if (TB0_active==1) { - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } else { // deactivate TB0 - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } - - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t)); - break; - - case 50: - if (TB0_active==1) { - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } else { // deactivate TB0 - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } - - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t)); - break; - - case 100: - if (TB0_active==1) { - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } else { // deactivate TB0 - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } - - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t)); - break; - } - - break; - - case 5: - DLSCH_alloc_pdu2_1E[0].ndi = trials&1; - DLSCH_alloc_pdu2_1E[0].rv = round&3; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - break; - } - } else { - switch (transmission_mode) { - case 1: - case 2: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_FDD_t)); - break; - - case 25: - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_FDD_t)); - break; - - case 50: - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_FDD_t)); - break; - - case 100: - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_FDD_t)); - break; - } - - break; - - case 3: - switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) { - case 6: - if (TB0_active==1) { - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } else { // deactivate TB0 - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } - - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t)); - break; - - case 25: - if (TB0_active==1) { - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } else { // deactivate TB0 - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } - - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t)); - break; - - case 50: - if (TB0_active==1) { - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } else { // deactivate TB0 - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } - - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t)); - break; - - case 100: - if (TB0_active==1) { - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } else { // deactivate TB0 - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; - ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; - } - - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t)); - break; - } - - break; - - case 5: - DLSCH_alloc_pdu2_1E[0].ndi = trials&1; - DLSCH_alloc_pdu2_1E[0].rv = round&3; - memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - break; - } - } - } - } - - num_pdcch_symbols_2 = generate_dci_top(num_ue_spec_dci, - num_common_dci, - dci_alloc, - 0, - AMP, - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], - subframe); - - if (num_pdcch_symbols_2 > num_pdcch_symbols) { - msg("Error: given num_pdcch_symbols not big enough (%d > %d)\n",num_pdcch_symbols_2,num_pdcch_symbols); - exit(-1); - } - - for (k=0; klte_frame_parms, - PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->nb_rb, - PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->rb_alloc, - get_Qm(PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->mcs), - PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Nl, - num_pdcch_symbols, - 0,subframe); - -#ifdef TBS_FIX // This is for MESH operation!!! - tbs = (double)3*TBStable[get_I_TBS(PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->mcs)][PHY_vars_eNB->dlsch_eNB[k][cw]->nb_rb-1]/4; -#else - tbs = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->TBS; -#endif - rate = (double)tbs/(double)coded_bits_per_codeword; - - if ((SNR==snr0) && (trials==0) && (round==0)) - printf("User %d, cw %d: Rate = %f (%f bits/dim) (G %d, TBS %d, mod %d, pdcch_sym %d, ndi %d)\n", - k,cw,rate,rate*get_Qm(PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->mcs), - coded_bits_per_codeword, - tbs, - get_Qm(PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->mcs), - num_pdcch_symbols, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->round); - - // use the PMI from previous trial - if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL); - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_UE->lte_frame_parms.N_RB_DL); - - if (n_users>1) - PHY_vars_eNB->dlsch_eNB[1][0]->harq_processes[0]->pmi_alloc = (PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555); - - /* - if ((trials<10) && (round==0)) { - printf("tx PMI UE0 %x (pmi_feedback %d)\n",pmi2hex_2Ar1(PHY_vars_eNB->dlsch_eNB[0][0]->pmi_alloc),pmi_feedback); - if (transmission_mode ==5) - printf("tx PMI UE1 %x\n",pmi2hex_2Ar1(PHY_vars_eNB->dlsch_eNB[1][0]->pmi_alloc)); - } - */ - } - - - start_meas(&PHY_vars_eNB->dlsch_encoding_stats); - - if (dlsch_encoding(((cw==0) ? input_buffer0[k] : input_buffer1[k]), - &PHY_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - PHY_vars_eNB->dlsch_eNB[k][cw], - 0,subframe, - &PHY_vars_eNB->dlsch_rate_matching_stats, - &PHY_vars_eNB->dlsch_turbo_encoding_stats, - &PHY_vars_eNB->dlsch_interleaving_stats - )<0) - exit(-1); - - /* - if (transmission_mode == 3) { - if (dlsch_encoding(input_buffer1[k], - &PHY_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - PHY_vars_eNB->dlsch_eNB[k][1], - 0,subframe, - &PHY_vars_eNB->dlsch_rate_matching_stats, - &PHY_vars_eNB->dlsch_turbo_encoding_stats, - &PHY_vars_eNB->dlsch_interleaving_stats - )<0) - exit(-1); - } - */ - stop_meas(&PHY_vars_eNB->dlsch_encoding_stats); - - PHY_vars_eNB->dlsch_eNB[k][cw]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI; - start_meas(&PHY_vars_eNB->dlsch_scrambling_stats); - dlsch_scrambling(&PHY_vars_eNB->lte_frame_parms, - 0, - PHY_vars_eNB->dlsch_eNB[k][cw], - coded_bits_per_codeword, - 0, - subframe<<1); - stop_meas(&PHY_vars_eNB->dlsch_scrambling_stats); - - if (n_frames==1) { - for (s=0; sdlsch_eNB[k][cw]->harq_processes[0]->C; s++) { - if (sdlsch_eNB[k][cw]->harq_processes[0]->Cminus) - Kr = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Kminus; - else - Kr = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Kplus; - - Kr_bytes = Kr>>3; - - for (i=0; idlsch_eNB[k][cw]->harq_processes[0]->c[s][i]); - } - } - } - - start_meas(&PHY_vars_eNB->dlsch_modulation_stats); - - re_allocated = dlsch_modulation(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], - AMP, - subframe, - &PHY_vars_eNB->lte_frame_parms, - num_pdcch_symbols, - PHY_vars_eNB->dlsch_eNB[k][0], - PHY_vars_eNB->dlsch_eNB[k][1]); - /* avoid gcc warnings */ - (void)re_allocated; - - stop_meas(&PHY_vars_eNB->dlsch_modulation_stats); - /* - if (trials==0 && round==0) - printf("RE count %d\n",re_allocated); - */ - } //n_users - - - generate_pilots(PHY_vars_eNB, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], - AMP, - LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); - - start_meas(&PHY_vars_eNB->ofdm_mod_stats); - - do_OFDM_mod_l(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], - PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id], - (subframe*2), - &PHY_vars_eNB->lte_frame_parms); - - do_OFDM_mod_l(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], - PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id], - (subframe*2)+1, - &PHY_vars_eNB->lte_frame_parms); - - stop_meas(&PHY_vars_eNB->ofdm_mod_stats); - stop_meas(&PHY_vars_eNB->phy_proc_tx); - - do_OFDM_mod_l(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], - PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id], - (subframe*2)+2, - &PHY_vars_eNB->lte_frame_parms); - - if (n_frames==1) { - write_output("txsigF0.m","txsF0", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][0][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], - nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); - - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) - write_output("txsigF1.m","txsF1", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][1][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], - nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); - } - tx_lev = 0; - - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - tx_lev += signal_energy(&PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa] - [subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], - PHY_vars_eNB->lte_frame_parms.samples_per_tti); - } - - tx_lev_dB = (unsigned int) dB_fixed(tx_lev); - - if (n_frames==1) { - printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); - write_output("txsig0.m","txs0", &PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][0][subframe* PHY_vars_eNB->lte_frame_parms.samples_per_tti], - - PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); - } - } /* else { // Read signal from file @@ -2710,767 +2439,307 @@ PMI_FEEDBACK: } */ - // printf("Copying tx ..., nsymb %d (n_tx %d), awgn %d\n",nsymb,PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,awgn_flag); - for (i=0; i<2*frame_parms->samples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - if (awgn_flag == 0) { - s_re[aa][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); - s_im[aa][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)+1]); - } else { - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { - if (aa==0) { - r_re[aarx][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)]); - r_im[aarx][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)+1]); - } else { - r_re[aarx][i] += ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)]); - r_im[aarx][i] += ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)+1]); - } - } + proc_eNB->subframe_tx = subframe; + eNB->abstraction_flag=0; + + phy_procedures_eNB_TX(eNB,proc_eNB,no_relay,NULL,1,dci_flag); + + + start_meas(&eNB->ofdm_mod_stats); + + /* + do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], + eNB->common_vars.txdata[eNB_id], + (subframe*2), + &eNB->frame_parms); + + do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], + eNB->common_vars.txdata[eNB_id], + (subframe*2)+1, + &eNB->frame_parms); + */ + + do_OFDM_mod_symbol(&eNB->common_vars, + eNB_id, + (subframe*2), + &eNB->frame_parms, + eNB->do_precoding); + + do_OFDM_mod_symbol(&eNB->common_vars, + eNB_id, + (subframe*2)+1, + &eNB->frame_parms, + eNB->do_precoding); + + + stop_meas(&eNB->ofdm_mod_stats); + + // generate next subframe for channel estimation + + proc_eNB->subframe_tx = subframe+1; + + phy_procedures_eNB_TX(eNB,proc_eNB,no_relay,NULL,0,dci_flag); + + do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], + eNB->common_vars.txdata[eNB_id], + (subframe*2)+2, + &eNB->frame_parms); + + + proc_eNB->frame_tx++; + + tx_lev = 0; + + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa] + [subframe*eNB->frame_parms.samples_per_tti], + eNB->frame_parms.samples_per_tti); + } + + tx_lev_dB = (unsigned int) dB_fixed(tx_lev); + + + if (n_frames==1) { + printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); + + write_output("txsig0.m","txs0", &eNB->common_vars.txdata[eNB_id][0][subframe* eNB->frame_parms.samples_per_tti], eNB->frame_parms.samples_per_tti,1,1); + + if (transmission_mode<7) { + write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); + } else if (transmission_mode == 7) { + write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][5][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); + write_output("txsigF0_BF.m","txsF0_BF", &eNB->common_vars.txdataF_BF[eNB_id][0][0],eNB->frame_parms.ofdm_symbol_size,1,1); } } - } + } - // Multipath channel - if (awgn_flag == 0) { - multipath_channel(eNB2UE[round],s_re,s_im,r_re,r_im, - 2*frame_parms->samples_per_tti,hold_channel); + DL_channel(eNB,UE,subframe,awgn_flag,SNR,tx_lev,hold_channel,abstx,num_rounds,trials,round,eNB2UE,s_re,s_im,r_re,r_im,csv_fd); - // printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset); - if(abstx==1 && num_rounds>1) - if(round==0 && hold_channel==0) { - random_channel(eNB2UE[1],0); - random_channel(eNB2UE[2],0); - random_channel(eNB2UE[3],0); - } - - if (PHY_vars_UE->perfect_ce==1) { - // fill in perfect channel estimates - freq_channel(eNB2UE[round],PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1); - /* - write_output("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8); - write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1,1,8); - */ + + UE_rxtx_proc_t *proc = &UE->proc.proc_rxtx[UE->current_thread_id[subframe]]; + proc->subframe_rx = subframe; + UE->UE_mode[0] = PUSCH; + + // first symbol has to be done separately in one-shot mode + slot_fep(UE, + 0, + (proc->subframe_rx<<1), + UE->rx_offset, + 0, + 0); + + if (n_frames==1) printf("Running phy_procedures_UE_RX\n"); + + if (dci_flag==0) { + if (n_frames==1) + printf("bypassing PDCCH/DCI detection\n"); + if (generate_ue_dlsch_params_from_dci(proc->frame_rx, + proc->subframe_rx, + (void *)&dci_alloc[0].dci_pdu, + n_rnti, + dci_alloc[0].format, + UE->pdcch_vars[UE->current_thread_id[proc->subframe_rx]][eNB_id], + UE->pdsch_vars[UE->current_thread_id[proc->subframe_rx]][eNB_id], + UE->dlsch[UE->current_thread_id[proc->subframe_rx]][0], + &UE->frame_parms, + UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + UE->transmission_mode[eNB_id]<7?0:UE->transmission_mode[eNB_id], + 0)==0) { + + dump_dci(&UE->frame_parms, &dci_alloc[0]); + + //UE->dlsch[UE->current_thread_id[proc->subframe_rx]][eNB_id][0]->active = 1; + //UE->dlsch[UE->current_thread_id[proc->subframe_rx]][eNB_id][1]->active = 1; + + UE->pdcch_vars[UE->current_thread_id[proc->subframe_rx]][eNB_id]->num_pdcch_symbols = num_pdcch_symbols; + + UE->dlsch_received[eNB_id]++; + } else { + LOG_E(PHY,"Problem in DCI!\n"); } } - if(abstx) { - if (trials==0 && round==0) { - // calculate freq domain representation to compute SINR - freq_channel(eNB2UE[0], NB_RB,2*NB_RB + 1); - // snr=pow(10.0,.1*SNR); - fprintf(csv_fd,"%f,",SNR); + dci_received = UE->pdcch_vars[UE->current_thread_id[proc->subframe_rx]][eNB_id]->dci_received; - for (u=0; u<2*NB_RB; u++) { - for (aarx=0; aarxnb_rx; aarx++) { - for (aatx=0; aatxnb_tx; aatx++) { - channelx = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].x; - channely = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].y; - fprintf(csv_fd,"%e+i*(%e),",channelx,channely); - } - } - } + phy_procedures_UE_RX(UE,proc,0,0,dci_flag,normal_txrx,no_relay,NULL); - if(num_rounds>1) { - freq_channel(eNB2UE[1], NB_RB,2*NB_RB + 1); + dci_received = dci_received - UE->pdcch_vars[UE->current_thread_id[proc->subframe_rx]][eNB_id]->dci_received; - for (u=0; u<2*NB_RB; u++) { - for (aarx=0; aarxnb_rx; aarx++) { - for (aatx=0; aatxnb_tx; aatx++) { - channelx = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].x; - channely = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].y; - fprintf(csv_fd,"%e+i*(%e),",channelx,channely); - } - } - } + if (dci_flag && (dci_received == 0)) { + //printf("DCI not received\n"); + dci_errors[round]++; - freq_channel(eNB2UE[2], NB_RB,2*NB_RB + 1); + /* + write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1); + write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],12*UE->frame_parms.N_RB_DL*3,1,1); - for (u=0; u<2*NB_RB; u++) { - for (aarx=0; aarxnb_rx; aarx++) { - for (aatx=0; aatxnb_tx; aatx++) { - channelx = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].x; - channely = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].y; - fprintf(csv_fd,"%e+i*(%e),",channelx,channely); - } - } - } + write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNB_id]->rxdataF_comp[0],4*12*UE->frame_parms.N_RB_DL,1,1); + write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNB_id]->llr,12*UE->frame_parms.N_RB_DL*4*2,1,4); + write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], + nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); - freq_channel(eNB2UE[3], NB_RB,2*NB_RB + 1); + write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); + write_output("rxsigF0.m","rxsF0", &UE->common_vars.rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - for (u=0; u<2*NB_RB; u++) { - for (aarx=0; aarxnb_rx; aarx++) { - for (aatx=0; aatxnb_tx; aatx++) { - channelx = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].x; - channely = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].y; - fprintf(csv_fd,"%e+i*(%e),",channelx,channely); - } - } - } - } - } - } + exit(-1); + */ + } - //AWGN - // This is the SNR on the PDSCH for OFDM symbols without pilots -> rho_A - sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(NB_RB*12)) - SNR - get_pa_dB(PHY_vars_eNB->pdsch_config_dedicated); - sigma2 = pow(10,sigma2_dB/10); + if ((test_perf ==0 ) && (n_frames==1)) { + write_output("ch0.m","ch0",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8); - if (n_frames==1) - printf("Sigma2 %f (sigma2_dB %f,%f,%f )\n",sigma2,sigma2_dB,10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(NB_RB*12)),get_pa_dB(PHY_vars_eNB->pdsch_config_dedicated)); + if (eNB->frame_parms.nb_antennas_tx>1) + write_output("ch1.m","ch1",eNB2UE[0]->ch[eNB->frame_parms.nb_antennas_rx],eNB2UE[0]->channel_length,1,8); - for (i=0; i<2*frame_parms->samples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { - //printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti)+2*i] = - (short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti)+2*i+1] = - (short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); - } - } + //common vars + write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); - // lte_sync_time_init(PHY_vars_eNB->lte_frame_parms,lte_ue_common_vars); - // lte_sync_time(lte_ue_common_vars->rxdata, PHY_vars_eNB->lte_frame_parms); - // lte_sync_time_free(); + write_output("rxsigF0.m","rxsF0", &UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - /* - // optional: read rx_frame from file - if ((rx_frame_file = fopen("rx_frame.dat","r")) == NULL) - { - printf("Cannot open rx_frame.m data file\n"); - exit(0); - } + if (UE->frame_parms.nb_antennas_rx>1) { + write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); + write_output("rxsigF1.m","rxsF1", UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + } - result = fread((void *)PHY_vars->rx_vars[0].RX_DMA_BUFFER,4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); - printf("Read %d bytes\n",result); - result = fread((void *)PHY_vars->rx_vars[1].RX_DMA_BUFFER,4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); - printf("Read %d bytes\n",result); + write_output("dlsch00_r0.m","dl00_r0", + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][0][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - fclose(rx_frame_file); - */ + if (UE->frame_parms.nb_antennas_rx>1) + write_output("dlsch01_r0.m","dl01_r0", + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][1][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - if (n_frames==1) { - printf("RX level in null symbol %d\n",dB_fixed(signal_energy(&PHY_vars_UE->lte_ue_common_vars.rxdata[0][160+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); - printf("RX level in data symbol %d\n",dB_fixed(signal_energy(&PHY_vars_UE->lte_ue_common_vars.rxdata[0][160+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); - printf("rx_level Null symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)))); - printf("rx_level data symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)))); - } + if (eNB->frame_parms.nb_antennas_tx>1) + write_output("dlsch10_r0.m","dl10_r0", + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - if (PHY_vars_eNB->lte_frame_parms.Ncp == 0) { // normal prefix - pilot1 = 4; - pilot2 = 7; - pilot3 = 11; - } else { // extended prefix - pilot1 = 3; - pilot2 = 6; - pilot3 = 9; - } + if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) + write_output("dlsch11_r0.m","dl11_r0", + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][3][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); - start_meas(&PHY_vars_UE->phy_proc_rx); + //pdsch_vars - // Inner receiver scheduling for 3 slots - for (Ns=(2*subframe); Ns<((2*subframe)+3); Ns++) { - for (l=0; ldlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid); - /* - This function implements the OFDM front end processor (FEP). + write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); - Parameters: - frame_parms LTE DL Frame Parameters - ue_common_vars LTE UE Common Vars - l symbol within slot (0..6/7) - Ns Slot number (0..19) - sample_offset offset within rxdata (points to beginning of subframe) - no_prefix if 1 prefix is removed by HW + //pdcch_vars + write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[0][eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1); + write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[0][eNB_id]->dl_ch_estimates_ext[0],300*3,1,1); - */ + write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[0][eNB_id]->rxdataF_comp[0],4*300,1,1); + write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[0][eNB_id]->llr,2400,1,4); - start_meas(&PHY_vars_UE->ofdm_demod_stats); - slot_fep(PHY_vars_UE, - l, - Ns%20, - 0, - 0, - 0); - stop_meas(&PHY_vars_UE->ofdm_demod_stats); + } - if (PHY_vars_UE->perfect_ce==1) { - if (awgn_flag==0) { - for(k=0; knb_antennas_tx; aa++) { - for (aarx=0; aarxnb_antennas_rx; aarx++) { - for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( - eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( - eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); - } - } - } - } - } else { - for(aa=0; aanb_antennas_tx; aa++) { - for (aarx=0; aarxnb_antennas_rx; aarx++) { - for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; - } - } - } - } - } - if ((Ns==((2*subframe))) && (l==0)) { - lte_ue_measurements(PHY_vars_UE, - subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti, - 1, - 0); - /* - debug_msg("RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), avg rx power %d dB (%d lin), RX gain %d dB\n", - PHY_vars_UE->PHY_measurements.rx_rssi_dBm[0] - ((PHY_vars_UE->lte_frame_parms.nb_antennas_rx==2) ? 3 : 0), - PHY_vars_UE->PHY_measurements.wideband_cqi_dB[0][0], - PHY_vars_UE->PHY_measurements.wideband_cqi_dB[0][1], - PHY_vars_UE->PHY_measurements.wideband_cqi[0][0], - PHY_vars_UE->PHY_measurements.wideband_cqi[0][1], - PHY_vars_UE->PHY_measurements.rx_power_avg_dB[0], - PHY_vars_UE->PHY_measurements.rx_power_avg[0], - PHY_vars_UE->rx_total_gain_dB); - debug_msg("N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n", - PHY_vars_UE->PHY_measurements.n0_power_tot_dBm, - PHY_vars_UE->PHY_measurements.n0_power_dB[0], - PHY_vars_UE->PHY_measurements.n0_power_dB[1], - PHY_vars_UE->PHY_measurements.n0_power[0], - PHY_vars_UE->PHY_measurements.n0_power[1], - PHY_vars_UE->PHY_measurements.n0_power_avg_dB, - PHY_vars_UE->PHY_measurements.n0_power_avg); - debug_msg("Wideband CQI tot %d dB, wideband cqi avg %d dB\n", - PHY_vars_UE->PHY_measurements.wideband_cqi_tot[0], - PHY_vars_UE->PHY_measurements.wideband_cqi_avg[0]); - */ - if (transmission_mode==5 || transmission_mode==6) { - if (pmi_feedback == 1) { - pmi_feedback = 0; - hold_channel = 1; - goto PMI_FEEDBACK; - } - } + if (UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_ack[subframe].ack == 1) { - } - - - if ((Ns==(2*subframe)) && (l==pilot1)) {// process symbols 0,1,2 - - if (dci_flag == 1) { - PHY_vars_UE->UE_mode[0] = PUSCH; - start_meas(&PHY_vars_UE->dlsch_rx_pdcch_stats); - rx_pdcch(&PHY_vars_UE->lte_ue_common_vars, - PHY_vars_UE->lte_ue_pdcch_vars, - &PHY_vars_UE->lte_frame_parms, - subframe, - 0, - (PHY_vars_UE->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, - PHY_vars_UE->high_speed_flag, - 0); - stop_meas(&PHY_vars_UE->dlsch_rx_pdcch_stats); - // overwrite number of pdcch symbols - PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; - - dci_cnt = dci_decoding_procedure(PHY_vars_UE, - dci_alloc_rx,1, - eNB_id, - subframe); - //printf("dci_cnt %d\n",dci_cnt); - - if (dci_cnt==0) { - dlsch_active = 0; - - if (round==0) { - dci_errors++; - round=5; - errs[0]++; - //round_trials[0]++; - - if (n_frames==1) - printf("DCI error trial %d errs[0] %d\n",trials,errs[0]); - } - - // for (i=1;i<=round;i++) - // round_trials[i]--; - // round=5; - } - - for (i=0; idlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->first_tx=1; - - if ((dci_alloc_rx[i].rnti == n_rnti) && - (generate_ue_dlsch_params_from_dci(0, - subframe, - dci_alloc_rx[i].dci_pdu, - dci_alloc_rx[i].rnti, - dci_alloc_rx[i].format, - PHY_vars_UE->dlsch_ue[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI)==0)) { - //dump_dci(&PHY_vars_UE->lte_frame_parms,&dci_alloc_rx[i]); - coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms, - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->nb_rb, - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->rb_alloc_even, - get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs), - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->Nl, - PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, - 0,subframe); - /* - rate = (double)dlsch_tbs25[get_I_TBS(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs)][PHY_vars_UE->dlsch_ue[0][0]->nb_rb-1]/(coded_bits_per_codeword); - rate*=get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs); - */ - printf("num_pdcch_symbols %d, G %d, TBS %d\n",PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword, - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->TBS); - - dlsch_active = 1; - } else { - dlsch_active = 0; - - if (round==0) { - dci_errors++; - errs[0]++; - //round_trials[0]++; - round=5; - - if (n_frames==1) - printf("DCI misdetection trial %d\n",trials); - - } - - // for (i=1;i<=round;i++) - // round_trials[i]--; - // round=5; - } - } - } // if dci_flag==1 - else { //dci_flag == 0 - - PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = n_rnti; - PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; - - if (round == 0) PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx=1; - - switch (transmission_mode) { - case 1: - case 2: - generate_ue_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - (common_flag==0)? C_RNTI : SI_RNTI, - (common_flag==0)? format1 : format1A, - PHY_vars_UE->dlsch_ue[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI); - break; - - case 3: - // printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx); - generate_ue_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - (common_flag==0)? C_RNTI : SI_RNTI, - (common_flag==0)? format2A : format1A, - PHY_vars_UE->dlsch_ue[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI); - // printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx); - break; - - case 4: - generate_ue_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu_1[0], - (common_flag==0)? C_RNTI : SI_RNTI, - (common_flag==0)? format2 : format1A, - PHY_vars_UE->dlsch_ue[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI); - break; - - case 5: - case 6: - generate_ue_dlsch_params_from_dci(0, - subframe, - &DLSCH_alloc_pdu2_1E[0], - C_RNTI, - format1E_2A_M10PRB, - PHY_vars_UE->dlsch_ue[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI); - break; - - } - - dlsch_active = 1; - } // if dci_flag == 1 - } - - if (dlsch_active == 1) { - if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix) - - if ((transmission_mode == 5) && - (PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver ==1)) { - dual_stream_UE = 1; - } else { - dual_stream_UE = 0; - } - - - start_meas(&PHY_vars_UE->dlsch_llr_stats); - - for (m=PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols; - mlte_ue_pdcch_vars[0]->num_pdcch_symbols)?1:0, - dual_stream_UE, - i_mod, - PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid)==-1) { - dlsch_active = 0; - break; - } - } - - stop_meas(&PHY_vars_UE->dlsch_llr_stats); - } - - if ((Ns==(1+(2*subframe))) && (l==pilot1)) { - // process symbols (6 Extended Prefix),7,8,9 - start_meas(&PHY_vars_UE->dlsch_llr_stats); - - for (m=pilot2; - mdlsch_ue[0][0]->current_harq_pid)==-1) { - dlsch_active=0; - break; - } - } - - stop_meas(&PHY_vars_UE->dlsch_llr_stats); - } - - if ((Ns==(2+(2*subframe))) && (l==0)) { // process symbols 10,11,(12,13 Normal Prefix) do deinterleaving for TTI - start_meas(&PHY_vars_UE->dlsch_llr_stats); - - for (m=pilot3; - mlte_frame_parms.symbols_per_tti; - m++) { - if (rx_pdsch(PHY_vars_UE, - PDSCH, - eNB_id, - eNB_id_i, - subframe, - m, - 0, - dual_stream_UE, - i_mod, - PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid)==-1) { - dlsch_active=0; - break; - } - } - - stop_meas(&PHY_vars_UE->dlsch_llr_stats); - } - - if (test_perf ==0 ) { - if ((n_frames==1) && (Ns==(2+(2*subframe))) && (l==0)) { - write_output("ch0.m","ch0",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8); - - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) - write_output("ch1.m","ch1",eNB2UE[0]->ch[PHY_vars_eNB->lte_frame_parms.nb_antennas_rx],eNB2UE[0]->channel_length,1,8); - - //common vars - write_output("rxsig0.m","rxs0", &PHY_vars_UE->lte_ue_common_vars.rxdata[0][0],10*PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", &PHY_vars_UE->lte_ue_common_vars.rxdataF[0][0],PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); - - if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) { - write_output("rxsig1.m","rxs1", PHY_vars_UE->lte_ue_common_vars.rxdata[1],PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1); - write_output("rxsigF1.m","rxsF1", PHY_vars_UE->lte_ue_common_vars.rxdataF[1],PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); - } - - write_output("dlsch00_r0.m","dl00_r0", - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); - - if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) - write_output("dlsch01_r0.m","dl01_r0", - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][1][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); - - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) - write_output("dlsch10_r0.m","dl10_r0", - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][2][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); - - if ((PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) && (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)) - write_output("dlsch11_r0.m","dl11_r0", - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][3][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1); - - //pdsch_vars - dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword,round); - //dump_dlsch2(PHY_vars_UE,eNB_id_i,coded_bits_per_codeword); - write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); - - //pdcch_vars - write_output("pdcchF0_ext.m","pdcchF_ext", PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size,1,1); - write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1); - - write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1); - write_output("pdcch_rxF_llr.m","pdcch_llr",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->llr,2400,1,4); - - } - } - } - } - } - - //saving PMI in case of Transmission Mode > 5 - - if(abstx) { - if (trials==0 && round==0 && transmission_mode>=5) { - for (iii=0; iiilte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[iii])); - fprintf(csv_fd,"%x,%x,",(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii])); - printf("%x ",(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii])); - } - } - } - - for (int cw=Kmimo-1; cw>=0; cw--) { - PHY_vars_UE->dlsch_ue[0][cw]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; - coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->nb_rb, - PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->rb_alloc, - get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->mcs), - PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->Nl, - num_pdcch_symbols, - 0,subframe); - - PHY_vars_UE->dlsch_ue[0][cw]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw]->current_harq_pid]->G = coded_bits_per_codeword; - - - - // calculate uncoded BLER - uncoded_ber=0; - for (i=0;idlsch_eNB[0][0]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[0][i]<0)) { - uncoded_ber_bit[i] = 1; - uncoded_ber++; - } - else - uncoded_ber_bit[i] = 0; - - uncoded_ber/=coded_bits_per_codeword; - avg_ber += uncoded_ber; - - if (n_frames==1) - write_output("uncoded_ber_bit.m","uncoded_ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); - - - start_meas(&PHY_vars_UE->dlsch_unscrambling_stats); - dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms, - 0, - PHY_vars_UE->dlsch_ue[0][cw], - coded_bits_per_codeword, - PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw], - 0, - subframe<<1); - stop_meas(&PHY_vars_UE->dlsch_unscrambling_stats); - - start_meas(&PHY_vars_UE->dlsch_decoding_stats); - ret = dlsch_decoding(PHY_vars_UE, - PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->dlsch_ue[0][cw], - PHY_vars_UE->dlsch_ue[0][cw]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw]->current_harq_pid], - subframe, - PHY_vars_UE->dlsch_ue[0][cw]->current_harq_pid, - 1,llr8_flag); - stop_meas(&PHY_vars_UE->dlsch_decoding_stats); - - if (cw==1) { - if (ret <= PHY_vars_UE->dlsch_ue[0][cw]->max_turbo_iterations) { - } else { - errs2[round]++; - } - } - } - - - stop_meas(&PHY_vars_UE->phy_proc_rx); - - - if (ret <= PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations) { - - avg_iter += ret; + avg_iter += UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->last_iteration_cnt; iter_trials++; if (n_frames==1) printf("No DLSCH errors found (round %d),uncoded ber %f\n",round,uncoded_ber); - PHY_vars_UE->total_TBS[eNB_id] = PHY_vars_UE->total_TBS[eNB_id] + PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS; + UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->TBS; TB0_active = 0; - if (PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC - /* - for (round = 0 ; round < PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->round ; round++) { - // re-encoding of first stream - dlsch0_ue_harq = PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]; - dlsch0_eNB_harq = PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]; - dlsch0_eNB_harq->mimo_mode = LARGE_CDD; - dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0]; - dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb; - dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs; - dlsch0_eNB_harq->rvidx = dlsch0_ue_harq->rvidx; - dlsch0_eNB_harq->Nl = dlsch0_ue_harq->Nl; - dlsch0_eNB_harq->TBS = dlsch0_ue_harq->TBS; - dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off; - dlsch0_eNB_harq->status = dlsch0_ue_harq->status; - - PHY_vars_UE->dlsch_eNB[eNB_id]->active = PHY_vars_UE->dlsch_ue[eNB_id][0]->active; - PHY_vars_UE->dlsch_eNB[eNB_id]->rnti = PHY_vars_UE->dlsch_ue[eNB_id][0]->rnti; - - dlsch_encoding(PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->b, - &PHY_vars_UE->lte_frame_parms, - num_pdcch_symbols, - PHY_vars_UE->dlsch_eNB[0], - 0,subframe, - &PHY_vars_UE->dlsch_rate_matching_stats, - &PHY_vars_UE->dlsch_turbo_encoding_stats, - &PHY_vars_UE->dlsch_interleaving_stats - ); - - //scrambling - - //modulation - - //stripping (from matched filter output?) - - //detection of second stream - } - */ - } - } else { + } // DLSCH received ok + else { errs[round]++; - avg_iter += ret-1; + avg_iter += UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->last_iteration_cnt-1; iter_trials++; if (n_frames==1) { //if ((n_frames==1) || (SNR>=30)) { printf("DLSCH errors found (round %d), uncoded ber %f\n",round,uncoded_ber); - for (s=0; sdlsch_ue[0][0]->harq_processes[0]->C; s++) { - if (sdlsch_ue[0][0]->harq_processes[0]->Cminus) - Kr = PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kminus; + for (s=0; sdlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->C; s++) { + if (sdlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Cminus) + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kminus; else - Kr = PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kplus; + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kplus; Kr_bytes = Kr>>3; printf("Decoded_output (Segment %d):\n",s); for (i=0; idlsch_ue[0][0]->harq_processes[0]->c[s][i],PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->c[s][i]); + printf("%d : %x (%x)\n",i,UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->c[s][i],UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->c[s][i]^eNB->dlsch[0][0]->harq_processes[0]->c[s][i]); } sprintf(fname,"rxsig0_r%d.m",round); sprintf(vname,"rxs0_r%d",round); - write_output(fname,vname, &PHY_vars_UE->lte_ue_common_vars.rxdata[0][0],10*PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1); + write_output(fname,vname, &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); sprintf(fname,"rxsigF0_r%d.m",round); sprintf(vname,"rxs0F_r%d",round); - write_output(fname,vname, &PHY_vars_UE->lte_ue_common_vars.rxdataF[0][0],2*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,2,1); - - if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) { + + write_output(fname,vname, &UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + + if (UE->frame_parms.nb_antennas_rx>1) { sprintf(fname,"rxsig1_r%d.m",round); sprintf(vname,"rxs1_r%d.m",round); - write_output(fname,vname, PHY_vars_UE->lte_ue_common_vars.rxdata[1],PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1); - sprintf(fname,"rxsig1F_r%d.m",round); + write_output(fname,vname, UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); + sprintf(fname,"rxsigF1_r%d.m",round); sprintf(vname,"rxs1F_r%d.m",round); - write_output(fname,vname, PHY_vars_UE->lte_ue_common_vars.rxdataF[1],2*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,2,1); + write_output(fname,vname, UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); } sprintf(fname,"dlsch00_r%d.m",round); sprintf(vname,"dl00_r%d",round); write_output(fname,vname, - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][0][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); - if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) { + if (UE->frame_parms.nb_antennas_rx>1) { sprintf(fname,"dlsch01_r%d.m",round); sprintf(vname,"dl01_r%d",round); write_output(fname,vname, - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][1][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1); + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][1][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) { + if (eNB->frame_parms.nb_antennas_tx>1) { sprintf(fname,"dlsch10_r%d.m",round); sprintf(vname,"dl10_r%d",round); write_output(fname,vname, - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][2][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1); + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } - if ((PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) && (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)) { + if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) { sprintf(fname,"dlsch11_r%d.m",round); sprintf(vname,"dl11_r%d",round); write_output(fname,vname, - &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][3][0]), - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1); + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][3][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); } //pdsch_vars - dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword,round); - /* - write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); - write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); - write_output("dlsch_eNB_w.m","w",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4); - write_output("dlsch_UE_w.m","w",PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0); - */ + dump_dlsch2(UE,eNB_id,subframe,&coded_bits_per_codeword,round, UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid); + + + //write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); + //write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); + //write_output("dlsch_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4); + //write_output("dlsch_w.m","w",UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0); + //pdcch_vars + write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[0][eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1); + write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[0][eNB_id]->dl_ch_estimates_ext[0],300*3,1,1); + + write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[0][eNB_id]->rxdataF_comp[0],4*300,1,1); + write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[0][eNB_id]->llr,2400,1,4); if (round == 3) exit(-1); } @@ -3478,18 +2747,19 @@ PMI_FEEDBACK: // printf("round %d errors %d/%d\n",round,errs[round],trials); round++; - // PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round++; + // UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->round++; } if (xforms==1) { phy_scope_UE(form_ue, - PHY_vars_UE, + UE, eNB_id, 0,// UE_id subframe); } - } //round + UE->proc.proc_rxtx[UE->current_thread_id[subframe]].frame_rx++; + } //round // printf("\n"); @@ -3499,29 +2769,29 @@ PMI_FEEDBACK: //len = chbch_stats_read(stats_buffer,NULL,0,4096); //printf("%s\n\n",stats_buffer); - if (PHY_vars_UE->frame_rx % 10 == 0) { - PHY_vars_UE->bitrate[eNB_id] = (PHY_vars_UE->total_TBS[eNB_id] - PHY_vars_UE->total_TBS_last[eNB_id])*10; - LOG_D(PHY,"[UE %d] Calculating bitrate: total_TBS = %d, total_TBS_last = %d, bitrate = %d kbits/s\n",PHY_vars_UE->Mod_id,PHY_vars_UE->total_TBS[eNB_id],PHY_vars_UE->total_TBS_last[eNB_id], - PHY_vars_UE->bitrate[eNB_id]/1000); - PHY_vars_UE->total_TBS_last[eNB_id] = PHY_vars_UE->total_TBS[eNB_id]; + if (UE->proc.proc_rxtx[UE->current_thread_id[subframe]].frame_rx % 10 == 0) { + UE->bitrate[eNB_id] = (UE->total_TBS[eNB_id] - UE->total_TBS_last[eNB_id])*10; + LOG_D(PHY,"[UE %d] Calculating bitrate: total_TBS = %d, total_TBS_last = %d, bitrate = %d kbits/s\n",UE->Mod_id,UE->total_TBS[eNB_id],UE->total_TBS_last[eNB_id], + UE->bitrate[eNB_id]/1000); + UE->total_TBS_last[eNB_id] = UE->total_TBS[eNB_id]; } - PHY_vars_UE->frame_rx++; + /* calculate the total processing time for each packet, * get the max, min, and number of packets that exceed t>2000us */ - double t_tx = (double)PHY_vars_eNB->phy_proc_tx.p_time/cpu_freq_GHz/1000.0; - double t_tx_ifft = (double)PHY_vars_eNB->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0; - double t_tx_mod = (double)PHY_vars_eNB->dlsch_modulation_stats.p_time/cpu_freq_GHz/1000.0; - double t_tx_enc = (double)PHY_vars_eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx = (double)eNB->phy_proc_tx.p_time/cpu_freq_GHz/1000.0; + double t_tx_ifft = (double)eNB->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_mod = (double)eNB->dlsch_modulation_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx = (double)PHY_vars_UE->phy_proc_rx.p_time/cpu_freq_GHz/1000.0; - double t_rx_fft = (double)PHY_vars_UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx_demod = (double)PHY_vars_UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx_dec = (double)PHY_vars_UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx = (double)UE->phy_proc_rx[UE->current_thread_id[subframe]].p_time/cpu_freq_GHz/1000.0; + double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_dec = (double)UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].p_time/cpu_freq_GHz/1000.0; if (t_tx > t_tx_max) t_tx_max = t_tx; @@ -3641,146 +2911,146 @@ PMI_FEEDBACK: double std_phy_proc_rx_demod=0; double std_phy_proc_rx_dec=0; - effective_rate = ((double)(round_trials[0]-dci_errors)/((double)round_trials[0] + round_trials[1] + round_trials[2] + round_trials[3])); + effective_rate = 1.0-((double)(errs[0]+errs[1]+errs[2]+errs[3])/((double)round_trials[0] + round_trials[1] + round_trials[2] + round_trials[3])); - printf("\n**********************SNR = %f dB (tx_lev %f, sigma2_dB %f)**************************\n", + printf("\n**********************SNR = %f dB (tx_lev %f)**************************\n", SNR, - (double)tx_lev_dB+10*log10(PHY_vars_UE->lte_frame_parms.ofdm_symbol_size/(NB_RB*12)), - sigma2_dB); + (double)tx_lev_dB+10*log10(UE->frame_parms.ofdm_symbol_size/(NB_RB*12))); - printf("Errors (%d(%d)/%d %d/%d %d/%d %d/%d), Pe = (%e,%e,%e,%e), dci_errors %d/%d, Pe = %e => effective rate %f (%2.1f%%,%f, %f), normalized delay %f (%f)\n", + printf("Errors (%d(%d)/%d %d/%d %d/%d %d/%d), Pe = (%e,%e,%e,%e), dci_errors %d/%d, Pe = %e => effective rate %f, normalized delay %f (%f)\n", errs[0], errs2[0], round_trials[0], errs[1], - round_trials[0], + round_trials[1], errs[2], - round_trials[0], + round_trials[2], errs[3], - round_trials[0], + round_trials[3], (double)errs[0]/(round_trials[0]), - (double)errs[1]/(round_trials[0]), - (double)errs[2]/(round_trials[0]), - (double)errs[3]/(round_trials[0]), - dci_errors, - round_trials[0], - (double)dci_errors/(round_trials[0]), - rate*effective_rate, + (double)errs[1]/(round_trials[1]), + (double)errs[2]/(round_trials[2]), + (double)errs[3]/(round_trials[3]), + dci_errors[0]+dci_errors[1]+dci_errors[2]+dci_errors[3], + round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3], + (double)(dci_errors[0]+dci_errors[1]+dci_errors[2]+dci_errors[3])/(round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3]), + //rate*effective_rate, 100*effective_rate, - rate, - rate*get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs), + //rate, + //rate*get_Qm(UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->mcs), (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ - (double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + (double)eNB->dlsch[0][0]->harq_processes[0]->TBS, (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); if (print_perf==1) { printf("eNB TX function statistics (per 1ms subframe)\n\n"); - std_phy_proc_tx = sqrt((double)PHY_vars_eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->phy_proc_tx.trials - pow((double)PHY_vars_eNB->phy_proc_tx.diff/PHY_vars_eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2)); - printf("Total PHY proc tx :%f us (%d trials)\n",(double)PHY_vars_eNB->phy_proc_tx.diff/PHY_vars_eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->phy_proc_tx.trials); + std_phy_proc_tx = sqrt((double)eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->phy_proc_tx.trials - pow((double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2)); + std_phy_proc_tx_ifft = sqrt((double)eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->ofdm_mod_stats.trials - pow((double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2)); + printf("OFDM_mod time :%f us (%d trials)\n",(double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,eNB->ofdm_mod_stats.trials); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3); + printf("Total PHY proc tx :%f us (%d trials)\n",(double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_tx.trials); printf("|__ Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, n_tx_dropped); - std_phy_proc_tx_ifft = sqrt((double)PHY_vars_eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->ofdm_mod_stats.trials - pow((double)PHY_vars_eNB->ofdm_mod_stats.diff/PHY_vars_eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2)); - printf("OFDM_mod time :%f us (%d trials)\n",(double)PHY_vars_eNB->ofdm_mod_stats.diff/PHY_vars_eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ofdm_mod_stats.trials); - printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3); - std_phy_proc_tx_mod = sqrt((double)PHY_vars_eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->dlsch_modulation_stats.trials - pow((double)PHY_vars_eNB->dlsch_modulation_stats.diff/PHY_vars_eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2)); - printf("DLSCH modulation time :%f us (%d trials)\n",(double)PHY_vars_eNB->dlsch_modulation_stats.diff/PHY_vars_eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_eNB->dlsch_modulation_stats.trials); + + std_phy_proc_tx_mod = sqrt((double)eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->dlsch_modulation_stats.trials - pow((double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH modulation time :%f us (%d trials)\n",(double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_modulation_stats.trials); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3); - printf("DLSCH scrambling time :%f us (%d trials)\n",(double)PHY_vars_eNB->dlsch_scrambling_stats.diff/PHY_vars_eNB->dlsch_scrambling_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_eNB->dlsch_scrambling_stats.trials); - std_phy_proc_tx_enc = sqrt((double)PHY_vars_eNB->dlsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->dlsch_encoding_stats.trials - pow((double)PHY_vars_eNB->dlsch_encoding_stats.diff/PHY_vars_eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000,2)); - printf("DLSCH encoding time :%f us (%d trials)\n",(double)PHY_vars_eNB->dlsch_encoding_stats.diff/PHY_vars_eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_eNB->dlsch_modulation_stats.trials); + printf("DLSCH scrambling time :%f us (%d trials)\n",(double)eNB->dlsch_scrambling_stats.diff/eNB->dlsch_scrambling_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_scrambling_stats.trials); + std_phy_proc_tx_enc = sqrt((double)eNB->dlsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->dlsch_encoding_stats.trials - pow((double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH encoding time :%f us (%d trials)\n",(double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_modulation_stats.trials); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3); printf("|__ DLSCH turbo encoding time :%f us (%d trials)\n", - ((double)PHY_vars_eNB->dlsch_turbo_encoding_stats.trials/PHY_vars_eNB->dlsch_encoding_stats.trials)*(double) - PHY_vars_eNB->dlsch_turbo_encoding_stats.diff/PHY_vars_eNB->dlsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->dlsch_turbo_encoding_stats.trials); + ((double)eNB->dlsch_turbo_encoding_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_turbo_encoding_stats.diff/eNB->dlsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_turbo_encoding_stats.trials); printf("|__ DLSCH rate-matching time :%f us (%d trials)\n", - ((double)PHY_vars_eNB->dlsch_rate_matching_stats.trials/PHY_vars_eNB->dlsch_encoding_stats.trials)*(double) - PHY_vars_eNB->dlsch_rate_matching_stats.diff/PHY_vars_eNB->dlsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->dlsch_rate_matching_stats.trials); + ((double)eNB->dlsch_rate_matching_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_rate_matching_stats.diff/eNB->dlsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_rate_matching_stats.trials); printf("|__ DLSCH sub-block interleaving time :%f us (%d trials)\n", - ((double)PHY_vars_eNB->dlsch_interleaving_stats.trials/PHY_vars_eNB->dlsch_encoding_stats.trials)*(double) - PHY_vars_eNB->dlsch_interleaving_stats.diff/PHY_vars_eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->dlsch_interleaving_stats.trials); + ((double)eNB->dlsch_interleaving_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials); printf("\n\nUE RX function statistics (per 1ms subframe)\n\n"); - std_phy_proc_rx = sqrt((double)PHY_vars_UE->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->phy_proc_rx.trials - pow((double)PHY_vars_UE->phy_proc_rx.diff/PHY_vars_UE->phy_proc_rx.trials/cpu_freq_GHz/1000,2)); - printf("Total PHY proc rx :%f us (%d trials)\n",(double)PHY_vars_UE->phy_proc_rx.diff/PHY_vars_UE->phy_proc_rx.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->phy_proc_rx.trials*2/3); + std_phy_proc_rx = sqrt((double)UE->phy_proc_rx[UE->current_thread_id[subframe]].diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->phy_proc_rx[UE->current_thread_id[subframe]].trials - pow((double)UE->phy_proc_rx[UE->current_thread_id[subframe]].diff/UE->phy_proc_rx[UE->current_thread_id[subframe]].trials/cpu_freq_GHz/1000,2)); + printf("Total PHY proc rx :%f us (%d trials)\n",(double)UE->phy_proc_rx[UE->current_thread_id[subframe]].diff/UE->phy_proc_rx[UE->current_thread_id[subframe]].trials/cpu_freq_GHz/1000.0, + UE->phy_proc_rx[UE->current_thread_id[subframe]].trials*2/3); printf("|__Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, rx_q1, rx_q3, n_rx_dropped); - std_phy_proc_rx_fft = sqrt((double)PHY_vars_UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->ofdm_demod_stats.trials - pow((double)PHY_vars_UE->ofdm_demod_stats.diff/PHY_vars_UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2)); - printf("DLSCH OFDM demodulation and channel_estimation time :%f us (%d trials)\n",(nsymb)*(double)PHY_vars_UE->ofdm_demod_stats.diff/PHY_vars_UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->ofdm_demod_stats.trials*2/3); + std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->ofdm_demod_stats.trials - pow((double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH OFDM demodulation and channel_estimation time :%f us (%d trials)\n",(nsymb)*(double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0, + UE->ofdm_demod_stats.trials*2/3); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3); printf("|__ DLSCH rx dft :%f us (%d trials)\n", - (nsymb*PHY_vars_UE->lte_frame_parms.nb_antennas_rx)*(double)PHY_vars_UE->rx_dft_stats.diff/PHY_vars_UE->rx_dft_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->rx_dft_stats.trials*2/3); + (nsymb*UE->frame_parms.nb_antennas_rx)*(double)UE->rx_dft_stats.diff/UE->rx_dft_stats.trials/cpu_freq_GHz/1000.0,UE->rx_dft_stats.trials*2/3); printf("|__ DLSCH channel estimation time :%f us (%d trials)\n", - (4.0)*(double)PHY_vars_UE->dlsch_channel_estimation_stats.diff/PHY_vars_UE->dlsch_channel_estimation_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_channel_estimation_stats.trials*2/3); + (4.0)*(double)UE->dlsch_channel_estimation_stats.diff/UE->dlsch_channel_estimation_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_channel_estimation_stats.trials*2/3); printf("|__ DLSCH frequency offset estimation time :%f us (%d trials)\n", - (4.0)*(double)PHY_vars_UE->dlsch_freq_offset_estimation_stats.diff/PHY_vars_UE->dlsch_freq_offset_estimation_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->dlsch_freq_offset_estimation_stats.trials*2/3); - printf("DLSCH rx pdcch :%f us (%d trials)\n",(double)PHY_vars_UE->dlsch_rx_pdcch_stats.diff/PHY_vars_UE->dlsch_rx_pdcch_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->dlsch_rx_pdcch_stats.trials); - std_phy_proc_rx_demod = sqrt((double)PHY_vars_UE->dlsch_llr_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->dlsch_llr_stats.trials - pow((double)PHY_vars_UE->dlsch_llr_stats.diff/PHY_vars_UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000,2)); - printf("DLSCH Channel Compensation and LLR generation time :%f us (%d trials)\n",(3)*(double)PHY_vars_UE->dlsch_llr_stats.diff/PHY_vars_UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->dlsch_llr_stats.trials/3); + (4.0)*(double)UE->dlsch_freq_offset_estimation_stats.diff/UE->dlsch_freq_offset_estimation_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_freq_offset_estimation_stats.trials*2/3); + printf("DLSCH rx pdcch :%f us (%d trials)\n",(double)UE->dlsch_rx_pdcch_stats.diff/UE->dlsch_rx_pdcch_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_rx_pdcch_stats.trials); + std_phy_proc_rx_demod = sqrt((double)UE->dlsch_llr_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->dlsch_llr_stats.trials - pow((double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH Channel Compensation and LLR generation time :%f us (%d trials)\n",(14-num_pdcch_symbols)*(double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_llr_stats.trials/3); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_demod, rx_demod_median, rx_demod_q1, rx_demod_q3); - printf("DLSCH unscrambling time :%f us (%d trials)\n",(double)PHY_vars_UE->dlsch_unscrambling_stats.diff/PHY_vars_UE->dlsch_unscrambling_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->dlsch_unscrambling_stats.trials); - std_phy_proc_rx_dec = sqrt((double)PHY_vars_UE->dlsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->dlsch_decoding_stats.trials - pow((double)PHY_vars_UE->dlsch_decoding_stats.diff/PHY_vars_UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH unscrambling time :%f us (%d trials)\n",(double)UE->dlsch_unscrambling_stats.diff/UE->dlsch_unscrambling_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_unscrambling_stats.trials); + std_phy_proc_rx_dec = sqrt((double)UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials - pow((double)UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].diff/UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials/cpu_freq_GHz/1000,2)); printf("DLSCH Decoding time (%02.2f Mbit/s, avg iter %1.2f) :%f us (%d trials, max %f)\n", - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS/1000.0,(double)avg_iter/iter_trials, - (double)PHY_vars_UE->dlsch_decoding_stats.diff/PHY_vars_UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_decoding_stats.trials, - (double)PHY_vars_UE->dlsch_decoding_stats.max/cpu_freq_GHz/1000.0); + eNB->dlsch[0][0]->harq_processes[0]->TBS/1000.0,(double)avg_iter/iter_trials, + (double)UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].diff/UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials/cpu_freq_GHz/1000.0,UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials, + (double)UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].max/cpu_freq_GHz/1000.0); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3); printf("|__ DLSCH Rate Unmatching :%f us (%d trials)\n", - (double)PHY_vars_UE->dlsch_rate_unmatching_stats.diff/PHY_vars_UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_rate_unmatching_stats.trials); + (double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials); printf("|__ DLSCH Turbo Decoding(%d bits) :%f us (%d trials)\n", - PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Cminus ? PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kminus : PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kplus, - (double)PHY_vars_UE->dlsch_turbo_decoding_stats.diff/PHY_vars_UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_turbo_decoding_stats.trials); + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Cminus ? UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kminus : UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kplus, + (double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials); printf(" |__ init %f us (cycles/iter %f, %d trials)\n", - (double)PHY_vars_UE->dlsch_tc_init_stats.diff/PHY_vars_UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_init_stats.diff/PHY_vars_UE->dlsch_tc_init_stats.trials/((double)avg_iter/iter_trials), - PHY_vars_UE->dlsch_tc_init_stats.trials); + (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/((double)avg_iter/iter_trials), + UE->dlsch_tc_init_stats.trials); printf(" |__ alpha %f us (cycles/iter %f, %d trials)\n", - (double)PHY_vars_UE->dlsch_tc_alpha_stats.diff/PHY_vars_UE->dlsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_alpha_stats.diff/PHY_vars_UE->dlsch_tc_alpha_stats.trials*2, - PHY_vars_UE->dlsch_tc_alpha_stats.trials); + (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials*2, + UE->dlsch_tc_alpha_stats.trials); printf(" |__ beta %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_UE->dlsch_tc_beta_stats.diff/PHY_vars_UE->dlsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_beta_stats.diff/PHY_vars_UE->dlsch_tc_beta_stats.trials*2, - PHY_vars_UE->dlsch_tc_beta_stats.trials); + (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials*2, + UE->dlsch_tc_beta_stats.trials); printf(" |__ gamma %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_UE->dlsch_tc_gamma_stats.diff/PHY_vars_UE->dlsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_gamma_stats.diff/PHY_vars_UE->dlsch_tc_gamma_stats.trials*2, - PHY_vars_UE->dlsch_tc_gamma_stats.trials); + (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials*2, + UE->dlsch_tc_gamma_stats.trials); printf(" |__ ext %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_UE->dlsch_tc_ext_stats.diff/PHY_vars_UE->dlsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_ext_stats.diff/PHY_vars_UE->dlsch_tc_ext_stats.trials*2, - PHY_vars_UE->dlsch_tc_ext_stats.trials); + (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials*2, + UE->dlsch_tc_ext_stats.trials); printf(" |__ intl1 %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_UE->dlsch_tc_intl1_stats.diff/PHY_vars_UE->dlsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_intl1_stats.diff/PHY_vars_UE->dlsch_tc_intl1_stats.trials, - PHY_vars_UE->dlsch_tc_intl1_stats.trials); + (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials, + UE->dlsch_tc_intl1_stats.trials); printf(" |__ intl2+HD+CRC %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_UE->dlsch_tc_intl2_stats.diff/PHY_vars_UE->dlsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_UE->dlsch_tc_intl2_stats.diff/PHY_vars_UE->dlsch_tc_intl2_stats.trials, - PHY_vars_UE->dlsch_tc_intl2_stats.trials); + (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials, + UE->dlsch_tc_intl2_stats.trials); } if ((transmission_mode != 3) && (transmission_mode != 4)) { fprintf(bler_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", SNR, mcs1, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, rate, errs[0], round_trials[0], @@ -3790,13 +3060,13 @@ PMI_FEEDBACK: round_trials[2], errs[3], round_trials[3], - dci_errors); + dci_errors[0]); } else { fprintf(bler_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", SNR, mcs1,mcs2, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, - PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][1]->harq_processes[0]->TBS, rate, errs[0], round_trials[0], @@ -3806,7 +3076,7 @@ PMI_FEEDBACK: round_trials[2], errs[3], round_trials[3], - dci_errors); + dci_errors[0]); } @@ -3829,7 +3099,7 @@ PMI_FEEDBACK: fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;", SNR, mcs1, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, rate, errs[0], round_trials[0], @@ -3839,13 +3109,13 @@ PMI_FEEDBACK: round_trials[2], errs[3], round_trials[3], - dci_errors); + dci_errors[0]); //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n"); fprintf(time_meas_fd,"%f;%d;%d;%f; %2.1f%%;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;", SNR, mcs1, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, rate*effective_rate, 100*effective_rate, rate, @@ -3862,18 +3132,18 @@ PMI_FEEDBACK: (double)errs[1]/(round_trials[0]), (double)errs[2]/(round_trials[0]), (double)errs[3]/(round_trials[0]), - dci_errors, + dci_errors[0], round_trials[0], - (double)dci_errors/(round_trials[0]), + (double)dci_errors[0]/(round_trials[0]), (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ - (double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + (double)eNB->dlsch[0][0]->harq_processes[0]->TBS, (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); } else { fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;", SNR, mcs1,mcs2, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, - PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][1]->harq_processes[0]->TBS, rate, errs[0], round_trials[0], @@ -3883,14 +3153,14 @@ PMI_FEEDBACK: round_trials[2], errs[3], round_trials[3], - dci_errors); + dci_errors[0]); //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n"); fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%2.1f;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;", SNR, mcs1,mcs2, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, - PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][1]->harq_processes[0]->TBS, rate*effective_rate, 100*effective_rate, rate, @@ -3907,40 +3177,40 @@ PMI_FEEDBACK: (double)errs[1]/(round_trials[0]), (double)errs[2]/(round_trials[0]), (double)errs[3]/(round_trials[0]), - dci_errors, + dci_errors[0], round_trials[0], - (double)dci_errors/(round_trials[0]), + (double)dci_errors[0]/(round_trials[0]), (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ - (double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, + (double)eNB->dlsch[0][0]->harq_processes[0]->TBS, (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); } //fprintf(time_meas_fd,"eNB_PROC_TX(%d); OFDM_MOD(%d); DL_MOD(%d); DL_SCR(%d); DL_ENC(%d); UE_PROC_RX(%d); OFDM_DEMOD_CH_EST(%d); RX_PDCCH(%d); CH_COMP_LLR(%d); DL_USCR(%d); DL_DECOD(%d);\n", fprintf(time_meas_fd,"%d; %d; %d; %d; %d; %d; %d; %d; %d; %d; %d;", - PHY_vars_eNB->phy_proc_tx.trials, - PHY_vars_eNB->ofdm_mod_stats.trials, - PHY_vars_eNB->dlsch_modulation_stats.trials, - PHY_vars_eNB->dlsch_scrambling_stats.trials, - PHY_vars_eNB->dlsch_encoding_stats.trials, - PHY_vars_UE->phy_proc_rx.trials, - PHY_vars_UE->ofdm_demod_stats.trials, - PHY_vars_UE->dlsch_rx_pdcch_stats.trials, - PHY_vars_UE->dlsch_llr_stats.trials, - PHY_vars_UE->dlsch_unscrambling_stats.trials, - PHY_vars_UE->dlsch_decoding_stats.trials + eNB->phy_proc_tx.trials, + eNB->ofdm_mod_stats.trials, + eNB->dlsch_modulation_stats.trials, + eNB->dlsch_scrambling_stats.trials, + eNB->dlsch_encoding_stats.trials, + UE->phy_proc_rx[UE->current_thread_id[subframe]].trials, + UE->ofdm_demod_stats.trials, + UE->dlsch_rx_pdcch_stats.trials, + UE->dlsch_llr_stats.trials, + UE->dlsch_unscrambling_stats.trials, + UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials ); fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;", - get_time_meas_us(&PHY_vars_eNB->phy_proc_tx), - get_time_meas_us(&PHY_vars_eNB->ofdm_mod_stats), - get_time_meas_us(&PHY_vars_eNB->dlsch_modulation_stats), - get_time_meas_us(&PHY_vars_eNB->dlsch_scrambling_stats), - get_time_meas_us(&PHY_vars_eNB->dlsch_encoding_stats), - get_time_meas_us(&PHY_vars_UE->phy_proc_rx), - nsymb*get_time_meas_us(&PHY_vars_UE->ofdm_demod_stats), - get_time_meas_us(&PHY_vars_UE->dlsch_rx_pdcch_stats), - 3*get_time_meas_us(&PHY_vars_UE->dlsch_llr_stats), - get_time_meas_us(&PHY_vars_UE->dlsch_unscrambling_stats), - get_time_meas_us(&PHY_vars_UE->dlsch_decoding_stats) + get_time_meas_us(&eNB->phy_proc_tx), + get_time_meas_us(&eNB->ofdm_mod_stats), + get_time_meas_us(&eNB->dlsch_modulation_stats), + get_time_meas_us(&eNB->dlsch_scrambling_stats), + get_time_meas_us(&eNB->dlsch_encoding_stats), + get_time_meas_us(&UE->phy_proc_rx[UE->current_thread_id[subframe]]), + nsymb*get_time_meas_us(&UE->ofdm_demod_stats), + get_time_meas_us(&UE->dlsch_rx_pdcch_stats), + 3*get_time_meas_us(&UE->dlsch_llr_stats), + get_time_meas_us(&UE->dlsch_unscrambling_stats), + get_time_meas_us(&UE->dlsch_decoding_stats[UE->current_thread_id[subframe]]) ); //fprintf(time_meas_fd,"eNB_PROC_TX_STD;eNB_PROC_TX_MAX;eNB_PROC_TX_MIN;eNB_PROC_TX_MED;eNB_PROC_TX_Q1;eNB_PROC_TX_Q3;eNB_PROC_TX_DROPPED;\n"); fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;", std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, n_tx_dropped); @@ -3970,22 +3240,24 @@ PMI_FEEDBACK: /* fprintf(time_meas_fd,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;", - PHY_vars_eNB->phy_proc_tx.trials, - PHY_vars_eNB->ofdm_mod_stats.trials, - PHY_vars_eNB->dlsch_modulation_stats.trials, - PHY_vars_eNB->dlsch_scrambling_stats.trials, - PHY_vars_eNB->dlsch_encoding_stats.trials, - PHY_vars_UE->phy_proc_rx.trials, - PHY_vars_UE->ofdm_demod_stats.trials, - PHY_vars_UE->dlsch_rx_pdcch_stats.trials, - PHY_vars_UE->dlsch_llr_stats.trials, - PHY_vars_UE->dlsch_unscrambling_stats.trials, - PHY_vars_UE->dlsch_decoding_stats.trials); + eNB->phy_proc_tx.trials, + eNB->ofdm_mod_stats.trials, + eNB->dlsch_modulation_stats.trials, + eNB->dlsch_scrambling_stats.trials, + eNB->dlsch_encoding_stats.trials, + UE->phy_proc_rx[UE->current_thread_id[subframe]].trials, + UE->ofdm_demod_stats.trials, + UE->dlsch_rx_pdcch_stats.trials, + UE->dlsch_llr_stats.trials, + UE->dlsch_unscrambling_stats.trials, + UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials); */ printf("[passed] effective rate : %f (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate ); + test_passed = 1; break; } else if (test_perf !=0 ) { printf("[continue] effective rate : %f (%2.1f%%,%f)): increase snr \n",rate*effective_rate, 100*effective_rate, rate); + test_passed = 0; } if (((double)errs[0]/(round_trials[0]))<(10.0/n_frames)) @@ -4031,31 +3303,15 @@ PMI_FEEDBACK: for (i=0; i<2; i++) { printf("eNB %d\n",i); - free_eNB_dlsch(PHY_vars_eNB->dlsch_eNB[0][i]); + free_eNB_dlsch(eNB->dlsch[0][i]); printf("UE %d\n",i); - free_ue_dlsch(PHY_vars_UE->dlsch_ue[0][i]); + free_ue_dlsch(UE->dlsch[UE->current_thread_id[subframe]][0][i]); } - - printf("Freeing channel I/O\n"); - - for (i=0; i<2; i++) { - free(s_re[i]); - free(s_im[i]); - free(r_re[i]); - free(r_im[i]); - } - - free(s_re); - free(s_im); - free(r_re); - free(r_im); - - // lte_sync_time_free(); - - // printf("[MUMIMO] mcs %d, mcsi %d, offset %d, bler %f\n",mcs,mcs_i,offset_mumimo_llr_drange_fix,((double)errs[0])/((double)round_trials[0])); - - return(0); + if (test_perf && !test_passed) + return(-1); + else + return(0); } diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c new file mode 100644 index 0000000000..90ba1ec804 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm4.c @@ -0,0 +1,5936 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file dlsim.c + \brief Top-level DL simulator + \author R. Knopp + \date 2011 - 2014 + \version 0.1 + \company Eurecom + \email: knopp@eurecom.fr + \note + \warning +*/ + +//#define DEBUG_HARQ +//#define PRINT_THROUGHPUT + +#include +#include +#include +#include +#include + +#include +#include "SIMULATION/TOOLS/defs.h" +#include "PHY/types.h" +#include "PHY/defs.h" +#include "PHY/vars.h" + +#include "SCHED/defs.h" +#include "SCHED/vars.h" +#include "LAYER2/MAC/vars.h" +#include "OCG_vars.h" +#include "UTIL/LOG/log.h" +#include "UTIL/LISTS/list.h" + +#include "unitary_defs.h" + +extern unsigned int dlsch_tbs25[27][25],TBStable[27][110]; +extern unsigned char offset_mumimo_llr_drange_fix; +extern int16_t dlsch_demod_shift; +extern int16_t cond_num_threshold; + +#include "PHY/TOOLS/lte_phy_scope.h" + +#define PRINT_BYTES + +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; + +double cpuf; + +int otg_enabled=0; +/*the following parameters are used to control the processing times calculations*/ +double t_tx_max = -1000000000; /*!< \brief initial max process time for tx */ +double t_rx_max = -1000000000; /*!< \brief initial max process time for rx */ +double t_tx_min = 1000000000; /*!< \brief initial min process time for tx */ +double t_rx_min = 1000000000; /*!< \brief initial min process time for rx */ +int n_tx_dropped = 0; /*!< \brief initial max process time for tx */ +int n_rx_dropped = 0; /*!< \brief initial max process time for rx */ + +void handler(int sig) +{ + void *array[10]; + size_t size; + + // get void*'s for all entries on the stack + size = backtrace(array, 10); + + // print out all the frames to stderr + fprintf(stderr, "Error: signal %d:\n", sig); + backtrace_symbols_fd(array, size, 2); + exit(1); +} + + + +//DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_2A[2]; + +DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_1E[2]; +uint64_t DLSCH_alloc_pdu_1[2]; + +#define UL_RB_ALLOC 0x1ff; +#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2) + +//#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 +//#define DLSCH_RB_ALLOC 0x0001 +void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms) +{ + + int aa, slot_offset, slot_offset_F; + + slot_offset_F = (next_slot)*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==1) ? 6 : 7); + slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); + + for (aa=0; aanb_antennas_tx; aa++) { + // printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc()); + + if (frame_parms->Ncp == 1) + PHY_ofdm_mod(&txdataF[aa][slot_offset_F], // input + &txdata[aa][slot_offset], // output + frame_parms->ofdm_symbol_size, + 6, // number of symbols + frame_parms->nb_prefix_samples, // number of prefix samples + CYCLIC_PREFIX); + else { + normal_prefix_mod(&txdataF[aa][slot_offset_F], + &txdata[aa][slot_offset], + 7, + frame_parms); + } + + + } + +} + +int main(int argc, char **argv) +{ + + int c; + int k,i,aa,aarx,aatx; + + int s,Kr,Kr_bytes; + + double sigma2, sigma2_dB=10,SNR,snr0=-2.0,snr1,rate[2]; + double snr_step=1,input_snr_step=1, snr_int=30; + + LTE_DL_FRAME_PARMS *frame_parms; + double **s_re,**s_im,**r_re,**r_im; + double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel + double iqim=0.0; + + extern int use_sic_receiver; + + uint8_t extended_prefix_flag=0,transmission_mode=1,n_tx_port=1, n_tx_phy=1, n_rx=1; + uint16_t Nid_cell=0; + + int8_t eNB_id = 0, eNB_id_i = 1; + unsigned char mcs1=0,mcs2=0,mcs_i=0,awgn_flag=0,dci_flag=0; + unsigned char i_mod = 2; + unsigned short NB_RB; + unsigned char Ns,l,m; + uint16_t tdd_config=3; + uint16_t n_rnti=0x1234; + int n_users = 1; + int active_tb0_sent[4]={0,0,0,0}; + int active_tb1_sent[4]={0,0,0,0}; + int failed_tb0[4]={0,0,0,0}; + int failed_tb1[4]={0,0,0,0}; + + int TB=0; + + RX_type_t rx_type=rx_standard; + unsigned char cur_harq_pid; + int hold_rank1_precoder=0; + int tpmi_retr=0; + bool is_first_time; + int rank_adapt =0; + int updated_csi = 0; + + SCM_t channel_model=Rayleigh1; + // unsigned char *input_data,*decoded_output; + + unsigned char *input_buffer0[2],*input_buffer1[2]; + unsigned short input_buffer_length0,input_buffer_length1; + + /* A variable "ret" is a nuumber of turbo iterations, that are performed in the turbo-decoder for each CW. + The decoder checks CRC, and if CRC test fails, it increments "ret". Ret is between 1 and 4, where 4 is for + the max number of turbo iterations. If the CRC is passed, ret is equal to a current iteration. + This is done separately for each CW inside decoding process. + Again: this is not a HARQ retransmission!*/ + unsigned int ret[2]; + unsigned int coded_bits_per_codeword[2],nsymb,dci_cnt,tbs[2]; + + unsigned int tx_lev=0, tx_lev_dB=0, round=0, trials, errs[2][4]={{0,0,0,0},{0,0,0,0}}, round_trials[2][4]={{0,0,0,0},{0,0,0,0}}, decoded_in_sic[4]={0,0,0,0}, sic_attempt[4]={0,0,0,0}, round_sic=0; + unsigned int dci_errors=0, dlsch_active=0; + unsigned int resend_one[4]={0,0,0,0}, resend_both[4]={0,0,0,0}, TB0_deact[4]={0,0,0,0}, TB1_deact[4]={0,0,0,0}; + + int re_allocated; + char fname[32],vname[32]; + FILE *bler_fd; + char bler_fname[256]; + FILE *time_meas_fd; + char time_meas_fname[256]; + FILE *rankadapt_fd; + char rankadapt_fname[256]; + + FILE *input_trch_fd=NULL; + unsigned char input_trch_file=0; + FILE *input_fd=NULL; + unsigned char input_file=0; + // char input_val_str[50],input_val_str2[50]; + + char input_trch_val[16]; + double channelx,channely; + + // unsigned char pbch_pdu[6]; + + DCI_ALLOC_t dci_alloc[8],dci_alloc_rx[8]; + int num_common_dci=0,num_ue_spec_dci=0,num_dci=0; + + // FILE *rx_frame_file; + + int n_frames; + int n_ch_rlz = 1; + + channel_desc_t *eNB2UE[8]; + + uint8_t num_pdcch_symbols=1,num_pdcch_symbols_2=0; + uint8_t pilot1,pilot2,pilot3; + uint8_t rx_sample_offset = 0; + //char stats_buffer[4096]; + //int len; + + uint8_t num_rounds = 4; + uint8_t subframe=7; + int u; + int n=0; + int abstx=0; + int iii; + FILE *csv_fd=NULL; + char csv_fname[512]; + int ch_realization; + int pmi_feedback=0; + int hold_channel=0; + + // temporarily for retransmissions: + unsigned char resend_cw1=0; //if 0 resend only cw0 + unsigned char resend_cw0_cw1=1; //if 0 resend both cw in a normal way + + // void *data; + // int ii; + int bler; + double blerr[2][4],uncoded_ber,avg_ber; + short *uncoded_ber_bit=NULL; + uint8_t N_RB_DL=25,osf=1; + uint8_t fdd_flag = 0; + frame_t frame_type = FDD; + int xforms=0; + FD_lte_phy_scope_ue *form_ue = NULL; + char title[255]; + uint32_t DLSCH_RB_ALLOC = 0x1fff; + int log_level = LOG_ERR; + int numCCE=0; + int dci_length_bytes=0,dci_length=0; + int common_flag=0,TPC=0; + + double cpu_freq_GHz; + //time_stats_t ts;//,sts,usts; + int avg_iter[2],iter_trials[2]; + int rank_indc[4]={0,0,0,0}; + int rballocset=0; + int print_perf=0; + int test_perf=0; + int dump_table=0; + int llr8_flag=0; + + double effective_rate=0.0; + + double thr_cw0_tm4 = 0.0, throug_tb0=0.0, throug_tb1=0.0, throug_tb0_acc[4]={0,0,0,0}, throug_tb1_acc[4]={0,0,0,0}, throug_tb0_acc_aver[4]={0,0,0,0}, throug_tb1_acc_aver[4]={0,0,0,0}; + double throug_tot_acc_aver[4]={0,0,0,0}, throug_tot_acc_aver_all_rounds=0; + double thr_cw0_tm4_nonconst = 0.0; + double thr_cw0[4]={0,0,0,0}, thr_cw1[4]={0,0,0,0}, thr_cw0_tot = 0.0, thr_cw1_tot = 0.0; + unsigned int tbs0_init=0, tbs1_init=0; + double rate0_init=0.0, rate1_init=0.0; + int mcs0_init=0, mcs1_init=0, mod_order0_init = 0, mod_order1_init=0; + char channel_model_input[17]="I"; + + int TB0_active = 1; + int TB1_active = 1; + int decoded_tb[2]={0,0}; + + uint32_t perfect_ce = 0; + + LTE_DL_UE_HARQ_t *dlsch0_ue_harq; + LTE_DL_eNB_HARQ_t *dlsch0_eNB_harq; + uint8_t Kmimo; + + int32_t **sic_buffer; + int8_t cw_to_decode_interf; + int8_t cw_to_decode_interf_free; + int8_t cw_non_sic; + int8_t cw_sic; + FILE *proc_fd = NULL; + char buf[64]; + uint8_t ue_category=4; + uint32_t Nsoft; + + int CCE_table[800]; + + int threequarter_fs=0; + + opp_enabled=1; // to enable the time meas + +#if defined(__arm__) + FILE *proc_fd = NULL; + char buf[64]; + + proc_fd = fopen("/sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq", "r"); + if(!proc_fd) + printf("cannot open /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq"); + else { + while(fgets(buf, 63, proc_fd)) + printf("%s", buf); + } + fclose(proc_fd); + cpu_freq_GHz = ((double)atof(buf))/1e6; +#else + cpu_freq_GHz = get_cpu_freq_GHz(); +#endif + cpuf = cpu_freq_GHz; + + printf("Detected cpu_freq %f GHz\n",cpu_freq_GHz); + + //signal(SIGSEGV, handler); + //signal(SIGABRT, handler); + + // default parameters + n_frames = 1000; + snr0 = 0; + // num_layers = 1; + perfect_ce = 0; + + + while ((c = getopt (argc, argv, "ahdpZDe:Em:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:Pl:XYWv:V:J:K:UL:")) != -1) { + + switch (c) { + case 'a': + awgn_flag = 1; + channel_model = AWGN; + break; + + case 'A': + abstx = 1; + break; + + case 'b': + tdd_config=atoi(optarg); + break; + + case 'B': + N_RB_DL=atoi(optarg); + break; + + case 'c': + num_pdcch_symbols=atoi(optarg); + break; + + case 'C': + Nid_cell = atoi(optarg); + break; + + case 'd': + dci_flag = 1; + break; + + case 'D': + frame_type=TDD; + break; + + case 'e': + num_rounds=1; + common_flag = 1; + TPC = atoi(optarg); + break; + + case 'E': + threequarter_fs=1; + break; + + case 'f': + input_snr_step= atof(optarg); + break; + + case 'F': + forgetting_factor = atof(optarg); + break; + + case 'i': + input_fd = fopen(optarg,"r"); + input_file=1; + dci_flag = 1; + break; + + case 'I': + input_trch_fd = fopen(optarg,"r"); + input_trch_file=1; + break; + + case 'l': + offset_mumimo_llr_drange_fix=atoi(optarg); + break; + + case 'm': + mcs1 = atoi(optarg); + break; + + case 'M': + mcs2 = atoi(optarg); + //i_mod = get_Qm(mcs2); /// think here again!!! + break; + + case 'O': + test_perf=atoi(optarg); + //print_perf =1; + break; + + case 't': + mcs_i = atoi(optarg); + i_mod = get_Qm(mcs_i); + break; + + case 'n': + n_frames = atoi(optarg); + break; + + case 'o': + rx_sample_offset = atoi(optarg); + break; + + case 'r': + DLSCH_RB_ALLOC = atoi(optarg); + rballocset = 1; + break; + + case 's': + snr0 = atof(optarg); + break; + + case 'w': + snr_int = atof(optarg); + break; + + case 'N': + n_ch_rlz= atof(optarg); + break; + + case 'p': + extended_prefix_flag=1; + break; + + case 'g': + memcpy(channel_model_input,optarg,17); + + switch((char)*optarg) { + case 'A': + channel_model=SCM_A; + break; + case 'B': + channel_model=SCM_B; + break; + case 'C': + channel_model=SCM_C; + break; + case 'D': + channel_model=SCM_D; + break; + case 'E': + channel_model=EPA; + break; + case 'F': + channel_model=EVA; + break; + case 'G': + channel_model=ETU; + break; + case 'H': + channel_model=Rayleigh8; + break; + case 'I': + channel_model=Rayleigh1; + break; + case 'J': + channel_model=Rayleigh1_corr; + break; + case 'K': + channel_model=Rayleigh1_anticorr; + break; + case 'L': + channel_model=Rice8; + break; + case 'M': + channel_model=Rice1; + break; + case 'N': + channel_model=AWGN; + break; + case 'P': + channel_model=Rayleigh1_orthogonal; + break; + case 'Q': + channel_model=Rayleigh1_orth_eff_ch_TM4_prec_real; // for DUALSTREAM_UNIFORM_PRECODING1 when interf is precancelled + break; + case 'R': + channel_model=Rayleigh1_orth_eff_ch_TM4_prec_imag; // for DUALSTREAM_UNIFORM_PRECODINGj when interf is precancelled + break; + case 'S': + channel_model=Rayleigh8_orth_eff_ch_TM4_prec_real;//when interf is precancelled + break; + case 'T': + channel_model=Rayleigh8_orth_eff_ch_TM4_prec_imag;//when interf is precancelled + break; + case 'U': + channel_model = TS_SHIFT; + break; + case 'V': + channel_model=EPA_low; + break; + case 'W': + channel_model=EPA_medium; + break; + case 'X': + channel_model=EPA_high; + break; + default: + msg("Unsupported channel model!\n"); + exit(-1); + } + break; + case 'z': + n_rx=atoi(optarg); + if ((n_rx==0) || (n_rx>2)) { + msg("Unsupported number of rx antennas %d\n",n_rx); + exit(-1); + } + break; + + case 'R': + num_rounds=atoi(optarg); + break; + case 'S': + subframe=atoi(optarg); + break; + case 'T': + n_rnti=atoi(optarg); + break; + case 'u': + rx_type = (RX_type_t) atoi(optarg); + if (rx_typerx_SIC_dual_stream) { + printf("Unsupported rx type %d\n",rx_type); + exit(-1); + } + break; + case 'v': + i_mod = atoi(optarg); + if (i_mod!=2 && i_mod!=4 && i_mod!=6) { + msg("Wrong i_mod %d, should be 2,4 or 6\n",i_mod); + exit(-1); + } + break; + case 'P': + print_perf=1; + break; + case 'q': + n_tx_port=atoi(optarg); + + if ((n_tx_port==0) || ((n_tx_port>2))) { + msg("Unsupported number of cell specific antennas ports %d\n",n_tx_port); + exit(-1); + } + break; + case 'x': + transmission_mode=atoi(optarg); + if ((transmission_mode!=1) && + (transmission_mode!=2) && + (transmission_mode!=3) && + (transmission_mode!=4) && + (transmission_mode!=5) && + (transmission_mode!=6)) { + msg("Unsupported transmission mode %d\n",transmission_mode); + exit(-1); + } + if (transmission_mode>1 && transmission_mode<7) { + n_tx_port = 2; + } + break; + case 'y': + n_tx_phy=atoi(optarg); + + if (n_tx_phy < n_tx_port) { + msg("n_tx_phy mush not be smaller than n_tx_port"); + exit(-1); + } + + if ((transmission_mode>1 && transmission_mode<7) && n_tx_port<2) { + msg("n_tx_port must be >1 for transmission_mode %d\n",transmission_mode); + exit(-1); + } + + if (transmission_mode==7 && (n_tx_phy!=1 && n_tx_phy!=2 && n_tx_phy!=4 && n_tx_phy!=8 && n_tx_phy!=16 && n_tx_phy!=64 && n_tx_phy!=128)) { + msg("Physical number of antennas not supported for TM7.\n"); + exit(-1); + } + + break; + case 'X': + xforms = 1; + break; + case 'Z': + dump_table=1; + break; + case 'Y': + perfect_ce=1; + break; + case 'W': + rank_adapt=1; + break; + case 'V': + cond_num_threshold = atoi(optarg); + break; + case 'J': + dlsch_demod_shift = atoi(optarg); + break; + case 'K': + tpmi_retr = atoi(optarg); + break; + case 'U': + updated_csi=1; + break; + case 'L': + log_level=atoi(optarg); + break; + case 'h': + default: + printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs1 -M mcs2 -n n_frames -s snr0 -x transmission mode (1,2,3,5,6) -y TXant -z RXant -I trch_file\n",argv[0]); + printf("-h This message\n"); + printf("-a Use AWGN channel and not multipath\n"); + printf("-c Number of PDCCH symbols\n"); + printf("-m MCS1 for TB 1\n"); + printf("-M MCS2 for TB 2\n"); + printf("-d Transmit the DCI and compute its error statistics and the overall throughput\n"); + printf("-p Use extended prefix mode\n"); + printf("-n Number of frames to simulate\n"); + printf("-o Sample offset for receiver\n"); + printf("-s Starting SNR, runs from SNR to SNR+%.1fdB in steps of %.1fdB. If n_frames is 1 then just SNR is simulated and MATLAB/OCTAVE output is generated\n", snr_int, snr_step); + printf("-f step size of SNR, default value is 1.\n"); + printf("-r resource block allocation (see section 7.1.6.3 in 36.213\n"); + printf("-g Channel model, possible values are 3GPP 25.814 SCM-A/B/C/D('A','B','C','D'), 36-101 EPA('E'), EVA ('F'),ETU('G'), Rayghleigh8 ('H'), Rayleigh1('I'), Rayleigh1_corr('J'), Rayleigh1_anticorr('K'), Rice8('L'), Rice1('M'), AWGN('N'), Rayleigh1_orthogonal('P'), Rayleigh1_orth_eff_ch_TM4_prec_real ('Q'), Rayleigh1_orth_eff_ch_TM4_prec_imag ('R'), Rayleigh8_orth_eff_ch_TM4_prec_real ('S'),Rayleigh8_orth_eff_ch_TM4_prec_imag ('T'), EPA_low ('V'), EPA_medium ('W'), EPA_high ('X') \n"); + printf("-F forgetting factor (0 new channel every trial, 1 channel constant\n"); + printf("-x Transmission mode (1,2,6 for the moment)\n"); + printf("-y Number of TX antennas used in eNB\n"); + printf("-z Number of RX antennas used in UE\n"); + printf("-t MCS of interfering UE\n"); + printf("-R Number of HARQ rounds (fixed)\n"); + printf("-A Turns on calibration mode for abstraction.\n"); + printf("-N Determines the number of Channel Realizations in Abstraction mode. Default value is 1. \n"); + printf("-O Set the percentage of effective rate to testbench the modem performance (typically 30 and 70, range 1-100) \n"); + printf("-I Input filename for TrCH data (binary)\n"); + printf("-u Receiver type: 0=standard, 1 = single stream IC (for TM3,4,5,6), 2 = dual stream IC (for TM3,4), 3 = SIC (for TM3,4) \n"); + exit(1); + break; + + } + } + + if (dlsch_demod_shift==0) { + if ((transmission_mode==3 || transmission_mode==4) && (rx_type>rx_standard)) { + if (mcs1<17) + dlsch_demod_shift=0; + else + dlsch_demod_shift=-2; + } + } + + + logInit(); + // enable these lines if you need debug info + set_comp_log(PHY,LOG_DEBUG,LOG_HIGH,1); + set_glog(log_level,LOG_HIGH); + // moreover you need to init itti with the following line + // however itti will catch all signals, so ctrl-c won't work anymore + // alternatively you can disable ITTI completely in CMakeLists.txt + //itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL); + + if (common_flag == 0) { + switch (N_RB_DL) { + case 6: + if (rballocset==0) DLSCH_RB_ALLOC = 0x3f; + num_pdcch_symbols = 3; + break; + + case 25: + if (rballocset==0) DLSCH_RB_ALLOC = 0x1fff; + break; + + case 50: + if (rballocset==0) DLSCH_RB_ALLOC = 0x1ffff; + break; + + case 100: + if (rballocset==0) DLSCH_RB_ALLOC = 0x1ffffff; + break; + } + + NB_RB=conv_nprb(0,DLSCH_RB_ALLOC,N_RB_DL); + } else + NB_RB = 4; + + NB_RB=conv_nprb(0,DLSCH_RB_ALLOC,N_RB_DL); + + + if (((transmission_mode==1) || (transmission_mode==2)) && (rx_type != rx_standard)) { + printf("only standard rx available for TM1 and TM2\n"); + exit(-1); + } + if (((transmission_mode==5) || (transmission_mode==6)) && (rx_type > rx_IC_single_stream)) { + printf("only standard rx or single stream IC available for TM5 and TM6\n"); + exit(-1); + } + + if (transmission_mode==4 && rx_type == rx_SIC_dual_stream ) + use_sic_receiver = 1; + else if (transmission_mode==4 && rx_type < rx_SIC_dual_stream ) + use_sic_receiver = 0; + + + + if (xforms==1) { + fl_initialize (&argc, argv, NULL, 0, 0); + form_ue = create_lte_phy_scope_ue(); + sprintf (title, "LTE PHY SCOPE eNB"); + fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); + + + if (transmission_mode==4 && use_sic_receiver == 1) { + use_sic_receiver = 1; + fl_set_button(form_ue->button_0, use_sic_receiver); + fl_set_object_label(form_ue->button_0, "SIC Receiver ON"); + fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN); + }else if (transmission_mode==4 && use_sic_receiver == 0 ){ + use_sic_receiver = 0; + fl_set_button(form_ue->button_0, use_sic_receiver); + fl_set_object_label(form_ue->button_0, "SIC Receiver OFF"); + fl_set_object_color(form_ue->button_0, FL_RED, FL_RED); + } + + + } + + if (transmission_mode==5) { + n_users = 2; + eNB_id_i = UE->n_connected_eNB; + //eNB_id_i=1; + } + else + eNB_id_i = eNB_id; + + lte_param_init(n_tx_port, + n_tx_phy, + n_rx, + transmission_mode, + extended_prefix_flag, + frame_type, + Nid_cell, + tdd_config, + N_RB_DL, + threequarter_fs, + osf, + perfect_ce); + + + printf("Setting mcs1 = %d\n",mcs1); + printf("Setting mcs2 = %d\n",mcs2); + printf("NPRB = %d\n",NB_RB); + printf("n_frames = %d\n",n_frames); + printf("Transmission mode %d with %dx%d antenna configuration, Extended Prefix %d\n",transmission_mode,n_tx_phy,n_rx,extended_prefix_flag); + printf("Using receiver type %d\n", rx_type); + printf("dlsch_demod_shift %d\n", dlsch_demod_shift); + printf("rank adaptation %d\n", rank_adapt); + //printf("Using I_UA rec shift layer 1 %d\n", dlsch_demod_shift0); + //printf("Using I_UA rec shift layer 2 %d\n", dlsch_demod_shift1); + snr1 = snr0+snr_int; + printf("SNR0 %f, SNR1 %f\n",snr0,snr1); + + /* + txdataF = (int **)malloc16(2*sizeof(int*)); + txdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); + txdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); + + txdata = (int **)malloc16(2*sizeof(int*)); + txdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); + txdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); + */ + + frame_parms = &eNB->frame_parms; + + + s_re = malloc(2*sizeof(double*)); //transmitted signal (Sent) + s_im = malloc(2*sizeof(double*)); + r_re = malloc(2*sizeof(double*)); //received signal + r_im = malloc(2*sizeof(double*)); + // r_re0 = malloc(2*sizeof(double*)); + // r_im0 = malloc(2*sizeof(double*)); + + nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; + + + printf("Channel Model= (%s,%d)\n",channel_model_input, channel_model); + printf("SCM-A=%d, SCM-B=%d, SCM-C=%d, SCM-D=%d, EPA=%d, EVA=%d, ETU=%d, Rayleigh8=%d, Rayleigh1=%d, Rayleigh1_corr=%d, Rayleigh1_anticorr=%d, Rice1=%d, Rice8=%d, Rayleigh1_orthogonal=%d, Rayleigh1_orth_eff_ch_TM4_prec_real22=%d, Rayleigh1_orth_eff_ch_TM4_prec_imag=%d, Rayleigh8_orth_eff_ch_TM4_prec_real=%d, Rayleigh8_orth_eff_ch_TM4_prec_imag=%d , TS_SHIFT=%d\n", + SCM_A, SCM_B, SCM_C, SCM_D, EPA, EVA, ETU, Rayleigh8, Rayleigh1, Rayleigh1_corr, Rayleigh1_anticorr, Rice1, Rice8, Rayleigh1_orthogonal, Rayleigh1_orth_eff_ch_TM4_prec_real, Rayleigh1_orth_eff_ch_TM4_prec_imag, Rayleigh8_orth_eff_ch_TM4_prec_real, Rayleigh8_orth_eff_ch_TM4_prec_imag, TS_SHIFT); + if(transmission_mode==5) + sprintf(bler_fname,"bler_tx%d_rec%d_chan%d_nrx%d_mcs%d_mcsi%d_u%d_imod%d.csv",transmission_mode,rx_type,channel_model,n_rx,mcs1,mcs_i,rx_type,i_mod); + else if (abstx == 1){ + if (perfect_ce==1) + sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_ab_pce_sh%d_rpmi%d_n.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2,dlsch_demod_shift, tpmi_retr); + else + sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_ab_sh%d_rtpmi%d_n.csv",transmission_mode,rx_type,channel_model, n_frames, n_rx, num_rounds, mcs1, mcs2,dlsch_demod_shift, tpmi_retr); + } + else {//abstx=0 + if (perfect_ce==1){ + if (updated_csi==1){ + sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_pce_sh%d_up_rtpmi%d_n.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, dlsch_demod_shift, tpmi_retr); + } + else{ + sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_pce_sh%d_rtpmi%d_n.csv",transmission_mode,rx_type, channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, dlsch_demod_shift, tpmi_retr); + } + } + else{ + if (updated_csi==1){ + sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_sh%d_up_rtpmi%d_n.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, dlsch_demod_shift, tpmi_retr); + } + else{ + sprintf(bler_fname,"bler_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_sh%d_rtpmi%csv",transmission_mode,rx_type, channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, dlsch_demod_shift, tpmi_retr); + } + } + } + + if (transmission_mode==3 || transmission_mode==4){ + if (rank_adapt==1){ + if (perfect_ce==1) + sprintf(rankadapt_fname,"rank_adapt1_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_pce_sh%d_connum_%d.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, dlsch_demod_shift, cond_num_threshold); + else + sprintf(rankadapt_fname,"rank_adapt1_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_sh%d_connum_%d.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, dlsch_demod_shift, cond_num_threshold); + } else { + if (perfect_ce==1) + sprintf(rankadapt_fname,"rank_adapt0_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_pce_sh%d_connum_%d.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, dlsch_demod_shift, cond_num_threshold); + else + sprintf(rankadapt_fname,"rank_adapt0_tx%d_r%d_ch%d_%d_nrx%d_rnd%d_mcs%d_mcsi%d_sh%d_connum_%d.csv",transmission_mode,rx_type,channel_model,n_frames, n_rx, num_rounds, mcs1, mcs2, dlsch_demod_shift, cond_num_threshold); + } + + rankadapt_fd = fopen(rankadapt_fname,"w"); + if (rankadapt_fd==NULL) { + fprintf(stderr,"Cannot create file %s!\n",rankadapt_fname); + exit(-1); + } + if (rx_type == rx_SIC_dual_stream) + fprintf(rankadapt_fd,"SNR; rank_adapt; clsm_counter; MCS1; MCS2; TBS1; TBS2; rate 0; rate 1; err0_tb0; err0_tb1; trials_tb0_r0; trials_tb1_r0; sic_att0; sic_suc0; ret_both0; ret_one0; err1_tb0; err1_tb1; trials_tb0_r1; trials_tb1_r1; sic_att1; sic_suc1; ret_both1; ret_one1; err2_tb0; err2_tb1; trials_tb0_r2; trials1_tb1_r2; sic_att2; sic_suc2; ret_both2; ret_one2; err3_tb0; err3_tb1; trials_tb0_r3; trials_tb1_r3; sic_att3; sic_suc3; th_tb0_r0; th_tb1_r0; th_sum_r0; th_tb0_r1; th_tb1_r1; th_sum_r1; th_tb0_r2; th_tb1_r2; th_sum_r2; th_tb0_r3; th_tb1_r3; th_sum_r3; tot_th\n"); + else + fprintf(rankadapt_fd,"SNR; rank_adapt; clsm_counter; MCS1; MCS2; TBS1; TBS2; rate 0; rate 1; err0_tb0; err0_tb1; trials_tb0_r0; trials_tb1_r0; deact_tb0_r0; deact_tb1_r0; ret_both0; ret_one0; err1_tb0; err1_tb1; trials_tb0_r1; trials_tb1_r1; deact_tb0_r1; deact_tb1_r1; ret_both1; ret_one1; err2_tb0; err2_tb1; trials_tb0_r2; trials1_tb1_r2; deact_tb0_r2; deact_tb1_r2; ret_both2; ret_one2; err3_tb0; err3_tb1; trials_tb0_r3; trials_tb1_r3; th_tb0_r0; th_tb1_r0; th_sum_r0; th_tb0_r1; th_tb1_r1; th_sum_r1; th_tb0_r2; th_tb1_r2; th_sum_r2; th_tb0_r3; th_tb1_r3; th_sum_r3; tot_th\n"); + } + + bler_fd = fopen(bler_fname,"w"); + if (bler_fd==NULL) { + fprintf(stderr,"Cannot create file %s!\n",bler_fname); + exit(-1); + } + + if ((transmission_mode != 3) && (transmission_mode != 4)) + fprintf(bler_fd,"SNR; MCS1; TBS1; rate 0; err0; trials0; err1;trials1; err2;trials2; err3; trials3\n"); + else if (rx_type == rx_SIC_dual_stream) + fprintf(bler_fd,"SNR; rank_adapt; rank; MCS1; MCS2; TBS1; TBS2; rate 0; rate 1; err0_tb0; err0_tb1; trials_tb0_r0; trials_tb1_r0; sic_att0; sic_suc0; ret_both0; ret_one0; err1_tb0; err1_tb1; trials_tb0_r1; trials_tb1_r1; sic_att1; sic_suc1; ret_both1; ret_one1; err2_tb0; err2_tb1; trials_tb0_r2; trials1_tb1_r2; sic_att2; sic_suc2; ret_both2; ret_one2; err3_tb0; err3_tb1; trials_tb0_r3; trials_tb1_r3; sic_att3; sic_suc3; th_tb0_r0; th_tb1_r0; th_sum_r0; th_tb0_r1; th_tb1_r1; th_sum_r1; th_tb0_r2; th_tb1_r2; th_sum_r2; th_tb0_r3; th_tb1_r3; th_sum_r3; tot_th\n"); + else + fprintf(bler_fd,"SNR; rank_adapt; clsm_counter; MCS1; MCS2; TBS1; TBS2; rate 0; rate 1; err0_tb0; err0_tb1; trials_tb0_r0; trials_tb1_r0; deact_tb0_r0; deact_tb1_r0; ret_both0; ret_one0; err1_tb0; err1_tb1; trials_tb0_r1; trials_tb1_r1; deact_tb0_r1; deact_tb1_r1; ret_both1; ret_one1; err2_tb0; err2_tb1; trials_tb0_r2; trials1_tb1_r2; deact_tb0_r2; deact_tb1_r2; ret_both2; ret_one2; err3_tb0; err3_tb1; trials_tb0_r3; trials_tb1_r3; th_tb0_r0; th_tb1_r0; th_sum_r0; th_tb0_r1; th_tb1_r1; th_sum_r1; th_tb0_r2; th_tb1_r2; th_sum_r2; th_tb0_r3; th_tb1_r3; th_sum_r3; tot_th\n"); + + + + if (test_perf != 0) { + + char hostname[1024]; + + hostname[1023] = '\0'; + gethostname(hostname, 1023); + printf("Hostname: %s\n", hostname); + //char dirname[FILENAME_MAX]; + //sprintf(dirname, "%s/SIMU/USER/pre-ci-logs-%s", getenv("OPENAIR_TARGETS"),hostname ); + sprintf(time_meas_fname,"time_meas_prb%d_mcs%d_anttx%d_antrx%d_pdcch%d_channel%s_tx%d.csv", + N_RB_DL,mcs1,n_tx_phy,n_rx,num_pdcch_symbols,channel_model_input,transmission_mode); + //mkdir(dirname,0777); + time_meas_fd = fopen(time_meas_fname,"w"); + if (time_meas_fd==NULL) { + fprintf(stderr,"Cannot create file %s!\n",time_meas_fname); + exit(-1); + } + } + + if(abstx){ + // CSV file // add here second stream mcs + + if (transmission_mode == 5) + sprintf(csv_fname,"dataout_tx%d_u2%d_mcs%d_chan%d_nsimus%d_R%d_abstr.m",transmission_mode,rx_type,mcs1,channel_model,n_frames,num_rounds); + + else + if (perfect_ce==1) + sprintf(csv_fname,"dout_tx%d_r%d_ch%d_%d_rnd%d_mcs%d_mcsi%d_pce_sh%d_%d_csi.m",transmission_mode,rx_type, channel_model, n_frames, num_rounds, mcs1, mcs2, dlsch_demod_shift, n_ch_rlz); + else + sprintf(csv_fname,"dout_tx%d_r%d_ch%d_%d_rnd%d_mcs%d_mcsi%d_sh%d_%d_csi.m",transmission_mode,rx_type, channel_model, n_frames, num_rounds, mcs1, mcs2, dlsch_demod_shift, n_ch_rlz); + + csv_fd = fopen(csv_fname,"w"); + fprintf(csv_fd,"data_all%d=[",mcs1); + if (csv_fd==NULL) { + fprintf(stderr,"Cannot create file %s!\n",csv_fname); + exit(-1); + } + } + + for (i=0; i<2; i++) { + s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); + s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); + r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); + r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); + // r_re0[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); + // bzero(r_re0[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); + // r_im0[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); + // bzero(r_im0[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); + } + + UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti = n_rnti; + UE->transmission_mode[eNB_id]=transmission_mode; + if (UE->transmission_mode[eNB_id] !=4) + UE->measurements.rank[eNB_id]=0; + else + UE->measurements.rank[eNB_id]=1; + + // Fill in UL_alloc + UL_alloc_pdu.type = 0; + UL_alloc_pdu.hopping = 0; + UL_alloc_pdu.rballoc = UL_RB_ALLOC; + UL_alloc_pdu.mcs = 1; + UL_alloc_pdu.ndi = 1; + UL_alloc_pdu.TPC = 0; + UL_alloc_pdu.cqi_req = 1; + + CCCH_alloc_pdu.type = 0; + CCCH_alloc_pdu.vrb_type = 0; + CCCH_alloc_pdu.rballoc = CCCH_RB_ALLOC; + CCCH_alloc_pdu.ndi = 1; + CCCH_alloc_pdu.mcs = 1; + CCCH_alloc_pdu.harq_pid = 0; + + DLSCH_alloc_pdu2_1E[0].rah = 0; + DLSCH_alloc_pdu2_1E[0].rballoc = DLSCH_RB_ALLOC; + DLSCH_alloc_pdu2_1E[0].TPC = 0; + DLSCH_alloc_pdu2_1E[0].dai = 0; + DLSCH_alloc_pdu2_1E[0].harq_pid = 0; + //DLSCH_alloc_pdu2_1E[0].tb_swap = 0; + DLSCH_alloc_pdu2_1E[0].mcs = mcs1; + DLSCH_alloc_pdu2_1E[0].ndi = 1; + DLSCH_alloc_pdu2_1E[0].rv = 0; + // Forget second codeword + DLSCH_alloc_pdu2_1E[0].tpmi = (transmission_mode>=5 ? 5 : 0); // precoding + DLSCH_alloc_pdu2_1E[0].dl_power_off = (transmission_mode==5 ? 0 : 1); + + DLSCH_alloc_pdu2_1E[1].rah = 0; + DLSCH_alloc_pdu2_1E[1].rballoc = DLSCH_RB_ALLOC; + DLSCH_alloc_pdu2_1E[1].TPC = 0; + DLSCH_alloc_pdu2_1E[1].dai = 0; + DLSCH_alloc_pdu2_1E[1].harq_pid = 0; + //DLSCH_alloc_pdu2_1E[1].tb_swap = 0; + DLSCH_alloc_pdu2_1E[1].mcs = mcs_i; + DLSCH_alloc_pdu2_1E[1].ndi = 1; + DLSCH_alloc_pdu2_1E[1].rv = 0; + // Forget second codeword + DLSCH_alloc_pdu2_1E[1].tpmi = (transmission_mode>=5 ? 5 : 0) ; // precoding + DLSCH_alloc_pdu2_1E[1].dl_power_off = (transmission_mode==5 ? 0 : 1); + + eNB2UE[0] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, + channel_model, + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), + forgetting_factor, + rx_sample_offset, + 0); + + if(num_rounds>1) { + for(n=1; n<8; n++) + eNB2UE[n] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, + channel_model, + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), + forgetting_factor, + rx_sample_offset, + 0); + } + + if (eNB2UE[0]==NULL) { + msg("Problem generating channel model. Exiting.\n"); + exit(-1); + } + + if ((transmission_mode == 3) && (transmission_mode == 4)) + for (n=0; n<4; ++n) + rank_indc[n]=1; + + if ((transmission_mode == 3) || (transmission_mode==4) || (transmission_mode==8)) + Kmimo=2; + else + Kmimo=1; + + switch (ue_category) { + case 1: + Nsoft = 250368; + break; + case 2: + case 3: + Nsoft = 1237248; + break; + case 4: + Nsoft = 1827072; + break; + default: + printf("Unsupported UE category %d\n",ue_category); + exit(-1); + break; + } + + for (k=0; kdlsch[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0, &eNB->frame_parms); + + if (!eNB->dlsch[k][i]) { + + printf("Can't get eNB dlsch structures\n"); + exit(-1); + } + + eNB->dlsch[k][i]->rnti = n_rnti+k; + } + } + + for (i=0; i<2; i++) { + UE->dlsch[UE->current_thread_id[subframe]][0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); + + if (!UE->dlsch[UE->current_thread_id[subframe]][0][i]) { + + printf("Can't get ue dlsch structures\n"); + exit(-1); + } + + UE->dlsch[UE->current_thread_id[subframe]][0][i]->rnti = n_rnti; + } + + // structure for SIC at UE + UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0, &eNB->frame_parms); + + if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { + + eNB->UE_stats[0].DL_pmi_single = (unsigned short)(taus()&0xffff); + + if (n_users>1) + eNB->UE_stats[1].DL_pmi_single = (eNB->UE_stats[0].DL_pmi_single ^ 0x1555); //opposite PMI + } else { + eNB->UE_stats[0].DL_pmi_single = 0; + + if (n_users>1) + eNB->UE_stats[1].DL_pmi_single = 0; + } + + + sic_buffer = (int32_t **) malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t *) ); + for (i=0; inb_antennas_tx; i++) { + sic_buffer[i] = malloc16_clear(FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + } + + if (input_fd==NULL) { + + // UE specific DCI + for(k=0; kframe_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + + case 6: + dci_length = sizeof_DCI1_1_5MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_1_5MHz_TDD_t); + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 25: + dci_length = sizeof_DCI1_5MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_5MHz_TDD_t); + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 50: + dci_length = sizeof_DCI1_10MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_10MHz_TDD_t); + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 100: + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1_20MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_20MHz_TDD_t); + break; + } + } + else { //fdd + + switch (eNB->frame_parms.N_RB_DL) { + + case 6: + dci_length = sizeof_DCI1_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_1_5MHz_FDD_t); + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 25: + dci_length = sizeof_DCI1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_5MHz_FDD_t); + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 50: + dci_length = sizeof_DCI1_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_10MHz_FDD_t); + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 100: + dci_length = sizeof_DCI1_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_20MHz_FDD_t); + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = n_rnti+k; + dci_alloc[num_dci].format = format1; + dci_alloc[num_dci].search_space = DCI_UE_SPACE; + + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format1, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + num_dci++; + num_ue_spec_dci++; + } + else { //common flag =1 + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + + case 6: + dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 25: + dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 50: + dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); + break; + } + } + else { // fdd + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 25: + dci_length = sizeof_DCI1A_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 50: + dci_length = sizeof_DCI1A_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 100: + dci_length = sizeof_DCI1A_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = SI_RNTI; + dci_alloc[num_dci].format = format1A; + dci_alloc[num_dci].firstCCE = 0; + dci_alloc[num_dci].search_space = DCI_COMMON_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + SI_RNTI, + format1A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + num_common_dci++; + num_dci++; + + } + break; + case 3: //LARGE CDD + if (common_flag == 0) { + + if (eNB->frame_parms.nb_antennas_tx == 2) { + + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2A_1_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t); + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 25: + dci_length = sizeof_DCI2A_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_5MHz_2A_TDD_t); + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 50: + dci_length = sizeof_DCI2A_10MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_10MHz_2A_TDD_t); + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 100: + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + dci_length = sizeof_DCI2A_20MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_20MHz_2A_TDD_t); + break; + } + } + + else { // fdd + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2A_1_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t); + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 25: + dci_length = sizeof_DCI2A_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_5MHz_2A_FDD_t); + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 50: + dci_length = sizeof_DCI2A_10MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_10MHz_2A_FDD_t); + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + case 100: + dci_length = sizeof_DCI2A_20MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_20MHz_2A_FDD_t); + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + } + } + } + else if (eNB->frame_parms.nb_antennas_tx == 4) { //4 antenna, needs diff precoding codebook index depeneding on layers + + + } + + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = n_rnti+k; + dci_alloc[num_dci].format = format2A; + dci_alloc[num_dci].search_space = DCI_UE_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + + + printf("Generating dlsch params for user %d / format 2A (%d)\n",k,format2A); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + num_dci++; + num_ue_spec_dci++; + } + else { //commonn flag 1 + if (eNB->frame_parms.frame_type == TDD) { //tdd + + switch (eNB->frame_parms.N_RB_DL) { + + case 6: + dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 25: + dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 50: + dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); + break; + } + } + else { //fdd + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 25: + dci_length = sizeof_DCI1A_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 50: + dci_length = sizeof_DCI1A_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 100: + dci_length = sizeof_DCI1A_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = SI_RNTI; + dci_alloc[num_dci].format = format1A; + dci_alloc[num_dci].firstCCE = 0; + dci_alloc[num_dci].search_space = DCI_COMMON_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + SI_RNTI, + format1A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + num_common_dci++; + num_dci++; + + } + printf("Generated DCI format 2A (Transmission Mode 3)\n"); + break; + + case 4: // !!! this dci format contains precoder information + if (common_flag == 0) { + + if (eNB->frame_parms.nb_antennas_tx == 2) { + + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + + case 6: + dci_length = sizeof_DCI2_1_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_1_5MHz_2A_TDD_t); + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2; + break; + case 25: + dci_length = sizeof_DCI2_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_5MHz_2A_TDD_t); + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2; + + break; + case 50: + dci_length = sizeof_DCI2_10MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_10MHz_2A_TDD_t); + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2; + + break; + case 100: + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2; + dci_length = sizeof_DCI2_20MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_20MHz_2A_TDD_t); + break; + } + } + + else { + + switch (eNB->frame_parms.N_RB_DL) { + + case 6: + dci_length = sizeof_DCI2_1_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_1_5MHz_2A_FDD_t); + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2; + break; + case 25: + dci_length = sizeof_DCI2_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_5MHz_2A_FDD_t); + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2; + break; + case 50: + dci_length = sizeof_DCI2_10MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_10MHz_2A_FDD_t); + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2; + break; + case 100: + dci_length = sizeof_DCI2_20MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_20MHz_2A_FDD_t); + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tb_swap = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2; + break; + } + } + } + else if (eNB->frame_parms.nb_antennas_tx == 4) { + + + } + + printf ("TM4 with tpmi =%d\n", ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi); + if ((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2) || (((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2)) { + + eNB->UE_stats[0].DL_pmi_single = (unsigned short)(taus()&0xffff); + + + } + + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = n_rnti+k; + dci_alloc[num_dci].format = format2; + dci_alloc[num_dci].search_space = DCI_UE_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + num_dci++; + num_ue_spec_dci++; + } + else { //common_flag==1 + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 25: + dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 50: + dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 100: + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); + break; + } + } + else { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 25: + dci_length = sizeof_DCI1A_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 50: + dci_length = sizeof_DCI1A_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + case 100: + dci_length = sizeof_DCI1A_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = SI_RNTI; + dci_alloc[num_dci].format = format1A; + dci_alloc[num_dci].firstCCE = 0; + dci_alloc[num_dci].search_space = DCI_COMMON_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + SI_RNTI, + format1A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + num_common_dci++; + num_dci++; + + } + break; + + case 5: + case 6: + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu2_1E[k],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + dci_alloc[num_dci].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = n_rnti+k; + dci_alloc[num_dci].format = format1E_2A_M10PRB; + dci_alloc[num_dci].firstCCE = 4*k; + dci_alloc[num_dci].search_space = DCI_UE_SPACE; + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu2_1E[k], + n_rnti+k, + format1E_2A_M10PRB, + eNB->dlsch[k], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[k].DL_pmi_single, + transmission_mode>=7?transmission_mode:0); + + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + num_ue_spec_dci++; + num_dci++; + + break; + + default: + printf("Unsupported Transmission Mode!!!"); + exit(-1); + break; + } + + + + + /* + memcpy(&dci_alloc[1].dci_pdu[0],&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD0_t)); + dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_0_t; + dci_alloc[1].L = 2; + dci_alloc[1].rnti = n_rnti; + */ + } + + if (n_frames==1) + printf("num_pdcch_symbols %d, numCCE %d => ",num_pdcch_symbols,numCCE); + + numCCE = get_nCCE(num_pdcch_symbols,&eNB->frame_parms,get_mi(&eNB->frame_parms,subframe)); + + + if (n_frames==1) + printf("%d\n",numCCE); + + // apply RNTI-based nCCE allocation + memset(CCE_table,0,800*sizeof(int)); + + for (i=num_common_dci; idlsch[k][0]->harq_processes[0]->TBS/8; + input_buffer0[k] = (unsigned char *)malloc(input_buffer_length0+4); + memset(input_buffer0[k],0,input_buffer_length0+4); + input_buffer_length1 = eNB->dlsch[k][1]->harq_processes[0]->TBS/8; + input_buffer1[k] = (unsigned char *)malloc(input_buffer_length1+4); + memset(input_buffer1[k],0,input_buffer_length1+4); + + if (input_trch_file==0) { + for (i=0; i>3]+=(1<<(7-(i&7))); + + if (i<16) + printf("input_trch_val %d : %c\n",i,input_trch_val[0]); + + i++; + + if (((i%8) == 0) && (i<17)) + printf("%x\n",input_buffer0[k][(i-1)>>3]); + } + + printf("Read in %d bits\n",i); + } + } + } + + snr_step = input_snr_step; + UE->high_speed_flag = 1; + UE->ch_est_alpha=0; + + for (ch_realization=0; ch_realizationproc.proc_rxtx[0].frame_rx=0; + for (i=0; i<4; i++) { + errs[0][i]=0; //CW_0 + errs[1][i]=0; //CW_1 + decoded_in_sic[i]=0; + sic_attempt[i]=0; + resend_one[i]=0; + resend_both[i]=0; + + round_trials[0][i] = 0; // CW_0 + round_trials[1][i] = 0; // CW_1 + TB0_deact[i]=0; + TB1_deact[i]=0; + throug_tb0_acc[i] = 0; + throug_tb1_acc[i] = 0; + throug_tb0_acc_aver[i]=0; + throug_tb1_acc_aver[i]=0; + throug_tot_acc_aver[i]=0; + active_tb0_sent[i]=0; + active_tb1_sent[i]=0; + failed_tb0[i]=0; + failed_tb1[i]=0; + throug_tot_acc_aver_all_rounds=0; + + } + dci_errors=0; + + round = 0; + + avg_iter[0] = 0; + avg_iter[1] = 0; + iter_trials[0]=0; + iter_trials[1]=0; + + uint32_t clsm_counter=0; + uint32_t two_tb_flag=0; + + reset_meas(&eNB->phy_proc_tx); // total eNB tx + reset_meas(&eNB->dlsch_scrambling_stats); + reset_meas(&UE->dlsch_unscrambling_stats); + reset_meas(&eNB->ofdm_mod_stats); + reset_meas(&eNB->dlsch_modulation_stats); + reset_meas(&eNB->dlsch_encoding_stats); + reset_meas(&eNB->dlsch_interleaving_stats); + reset_meas(&eNB->dlsch_rate_matching_stats); + reset_meas(&eNB->dlsch_turbo_encoding_stats); + + reset_meas(&UE->phy_proc_rx[UE->current_thread_id[subframe]]); // total UE rx + reset_meas(&UE->ofdm_demod_stats); + reset_meas(&UE->dlsch_channel_estimation_stats); + reset_meas(&UE->dlsch_freq_offset_estimation_stats); + reset_meas(&UE->rx_dft_stats); + reset_meas(&UE->dlsch_llr_stats); + reset_meas(&UE->dlsch_decoding_stats[0]); + reset_meas(&UE->dlsch_decoding_stats[1]); + reset_meas(&UE->dlsch_turbo_decoding_stats); + reset_meas(&UE->dlsch_deinterleaving_stats); + reset_meas(&UE->dlsch_rate_unmatching_stats); + reset_meas(&UE->dlsch_tc_init_stats); + reset_meas(&UE->dlsch_tc_alpha_stats); + reset_meas(&UE->dlsch_tc_beta_stats); + reset_meas(&UE->dlsch_tc_gamma_stats); + reset_meas(&UE->dlsch_tc_ext_stats); + reset_meas(&UE->dlsch_tc_intl1_stats); + reset_meas(&UE->dlsch_tc_intl2_stats); + + // initialization + struct list time_vector_tx; + initialize(&time_vector_tx); + struct list time_vector_tx_ifft; + initialize(&time_vector_tx_ifft); + struct list time_vector_tx_mod; + initialize(&time_vector_tx_mod); + struct list time_vector_tx_enc; + initialize(&time_vector_tx_enc); + + struct list time_vector_rx; + initialize(&time_vector_rx); + struct list time_vector_rx_fft; + initialize(&time_vector_rx_fft); + struct list time_vector_rx_demod; + initialize(&time_vector_rx_demod); + struct list time_vector_rx_dec; + initialize(&time_vector_rx_dec); + + for (trials = 0;trialsnb_antennas_tx; i++) { + memset(sic_buffer[i], 0, FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + } + + eNB2UE[0]->first_run = 1; + + ret[0] = UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations+1; + ret[1] = UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations+1; + + resend_cw0_cw1=1; + resend_cw1=0; + TB0_active=1; + TB1_active=1; + + + if (transmission_mode == 3 || transmission_mode == 4) + rank_indc[0]=1; + + while (((transmission_mode == 3 || transmission_mode == 4) && + ((round < num_rounds) && (((rank_indc[0] == 1) ||((rank_indc[0] == 0) && (rank_adapt==0))) && + ((ret[0] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations) || + (ret[1] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations))|| + (rank_indc[0] ==0 && rank_adapt==1 && ret[0] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations )))) || + ((transmission_mode!=4 && transmission_mode != 3) && ((round< num_rounds) && + (ret[0] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations)))) { + // printf("ret[0] =% d UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations = %d\n", ret[0], UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations); + // printf("ret[1] =% d UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations = %d\n", ret[1], UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations); + +#ifdef DEBUG_HARQ + printf("\n [DLSIM] On top round is %d\n", round); +#endif + + round_trials[0][round]++; + round_trials[1][round]++; + decoded_tb[0]=0; + decoded_tb[1]=0; + + //printf("Trial %d, round %d , ret[0] %d, ret[1] %d, round_trials %d\n",trials,round, ret[0], ret[1], round_trials[round]); + + /*if (ret[0] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations) { + round_trials[0][round]++; + round_trials[1][round]++; + } else if ((ret[1] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations) && (ret[0] <= UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations)) + round_trials[1][round]++;*/ + + +#ifdef DEBUG_HARQ + printf("[DLSIM] Just after while loop TB0 status %d TB1 status %d round %d\n", TB0_active, TB1_active, round); +#endif + + // printf("Trial %d, round %d , ret[0] %d, ret[1] %d, round_trials TB0 = %d, round_trials TB1 = %d \n",trials,round, ret[0], ret[1], round_trials[0][round], round_trials[1][round]); + + + /*printf("Trial %d, round cw0 = %d , round cw1 = %d, ret[0] = %d, ret[1] = %d, round_trials cw0 [%d]= %d, round_trials cw1 [%d]= %d\n",trials, round, round, \ + ret[0], ret[1], round, round_trials[0][round], round, round_trials[1][round]);*/ + + //printf("round_trials %d round %d\n", round_trials[round], round); + + if (transmission_mode == 4 || transmission_mode == 5 || transmission_mode == 6) + pmi_feedback=1; + else + pmi_feedback=0; + + if (abstx) { + if (trials==0 && round==0 && SNR==snr0) //generate a new channel + hold_channel = 0; + else + hold_channel = 1; + } + else + hold_channel = 0;//(round==0) ? 0 : 1; + + PMI_FEEDBACK: + + //printf("Trial %d : Round %d, pmi_feedback %d \n",trials,round,pmi_feedback); + for (aa=0; aaframe_parms.nb_antennas_tx;aa++) { + memset(&eNB->common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + } + + if (input_fd==NULL) { + + start_meas(&eNB->phy_proc_tx); + + // Simulate HARQ procedures!!! + if (common_flag == 0) { + + eNB->dlsch[0][0]->harq_processes[0]->rvidx = round&3; + if (transmission_mode == 3 || transmission_mode == 4) + eNB->dlsch[0][1]->harq_processes[0]->rvidx = round&3; + + if (round == 0) { // First round + if ((rank_indc[0]==1) || (rank_indc[0]==0 && rank_adapt==0)) { + TB0_active = 1; + TB1_active = 1; +#ifdef DEBUG_HARQ + printf("Simulating HARQ both active \n"); +#endif + }else { + TB0_active = 1; + TB1_active = 0; +#ifdef DEBUG_HARQ + printf("Simulating HARQ only TB0 active \n"); +#endif + } + if (eNB->frame_parms.frame_type == TDD) { + + switch (transmission_mode) { + case 1: + case 2: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_TDD_t)); + break; + case 25: + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_TDD_t)); + break; + case 50: + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_TDD_t)); + break; + case 100: + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_TDD_t)); + break; + } + break; + case 3: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t)); + break; + case 25: + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t)); + break; + case 50: + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t)); + break; + case 100: + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t)); + break; + } + break; + case 4: + if ((TB0_active == 1) && (TB1_active == 1)) { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_TDD_t)); + break; + case 25: + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_TDD_t)); + break; + case 50: + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_TDD_t)); + break; + case 100: + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_TDD_t)); + break; + } + } else if ((TB0_active == 1) && (TB1_active == 0)) { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_TDD_t)); + break; + case 25: + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_TDD_t)); + break; + case 50: + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_TDD_t)); + break; + case 100: + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_TDD_t)); + break; + } + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + UE->dlsch[UE->current_thread_id[subframe]][0][1]->pmi_alloc, + transmission_mode>=7?transmission_mode:0 + ); + } + break; + case 5: + case 6: + DLSCH_alloc_pdu2_1E[0].ndi = trials&1; + DLSCH_alloc_pdu2_1E[0].rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + break; + } + } else { // FDD + switch (transmission_mode) { + case 1: + case 2: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_FDD_t)); + break; + case 25: + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_FDD_t)); + break; + case 50: + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_FDD_t)); + break; + case 100: + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_FDD_t)); + break; + } + break; + case 3: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t)); + break; + case 25: + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t)); + break; + case 50: + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t)); + break; + case 100: + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t)); + break; + } + break; + case 4: + if ((TB0_active == 1) && (TB1_active == 1)) { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_FDD_t)); + break; + case 25: + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_FDD_t)); + break; + case 50: + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_FDD_t)); + break; + case 100: + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_FDD_t)); + break; + } + } else if ((TB0_active == 1) && (TB1_active == 0)) { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_FDD_t)); + break; + case 25: + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_FDD_t)); + break; + case 50: + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_FDD_t)); + break; + case 100: + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_FDD_t)); + break; + } + } + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + UE->dlsch[UE->current_thread_id[subframe]][0][1]->pmi_alloc, + transmission_mode>=7?transmission_mode:0 + ); + break; + + case 5: + case 6: + DLSCH_alloc_pdu2_1E[0].ndi = trials&1; + DLSCH_alloc_pdu2_1E[0].rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + break; + } + } + } + else { + + if (eNB->frame_parms.frame_type == TDD) { + switch (transmission_mode) { + case 1: + case 2: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_TDD_t)); + break; + case 25: + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_TDD_t)); + break; + case 50: + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_TDD_t)); + break; + case 100: + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_TDD_t)); + break; + } + break; + case 3: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0) { // deactivate TB0 + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t)); + break; + case 25: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0) { // deactivate TB0 + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t)); + break; + case 50: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0){ // deactivate TB0 + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t)); + break; + case 100: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0){ // deactivate TB0 + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t)); + break; + } + break; + case 4: + if ((rank_indc[0]==1 )|| ((rank_indc[0]==0) && (rank_adapt==0))){ + switch (eNB->frame_parms.N_RB_DL) { + case 6: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; // you have choice + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0){ // deactivate TB0 + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_TDD_t)); + break; + case 25: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0){ // deactivate TB0 + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_TDD_t)); + break; + case 50: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0){ // deactivate TB0 + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_TDD_t)); + break; + case 100: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0){ // deactivate TB0 + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_TDD_t)); + break; + } + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + UE->dlsch[UE->current_thread_id[subframe]][0][1]->pmi_alloc, + transmission_mode>=7?transmission_mode:0 + ); + } else if (rank_indc[0]==0 && rank_adapt==1) { + //in this case only TB0 is active for the retransmissions, deactivatiing TB1 + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; //no choice, only alamouti + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_TDD_t)); + break; + case 25: + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_TDD_t)); + break; + case 50: + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_TDD_t)); + break; + case 100: + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_TDD_t)); + break; + } + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + UE->dlsch[UE->current_thread_id[subframe]][0][1]->pmi_alloc, + transmission_mode>=7?transmission_mode:0 + ); + } + break; + case 5: + case 6: + DLSCH_alloc_pdu2_1E[0].ndi = trials&1; + DLSCH_alloc_pdu2_1E[0].rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + break; + } + } + else { + switch (transmission_mode) { + case 1: + case 2: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_FDD_t)); + break; + case 25: + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_FDD_t)); + break; + case 50: + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_FDD_t)); + break; + case 100: + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_FDD_t)); + break; + } + break; + case 3: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + if (TB0_active==1) { + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t)); + break; + case 25: + if (TB0_active==1) { + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t)); + break; + case 50: + if (TB0_active==1) { + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t)); + break; + case 100: + if (TB0_active==1) { + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB0 + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t)); + break; + } + break; + case 4: + if ((rank_indc[0]==1 )|| ((rank_indc[0]==0) && (rank_adapt==0))){ + switch (eNB->frame_parms.N_RB_DL) { + case 6: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0){ // deactivate TB0 + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_FDD_t)); + break; + case 25: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0){ // deactivate TB0 + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_FDD_t)); + break; + case 50: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0) { // deactivate TB0 + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_FDD_t)); + break; + case 100: + if (TB0_active == 1 && TB1_active == 1) { + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = mcs1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = mcs2; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else if (TB0_active == 0){ // deactivate TB0 + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + else { // deactivate TB1 + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = tpmi_retr; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + } + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_FDD_t)); + break; + } + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + UE->dlsch[UE->current_thread_id[subframe]][0][1]->pmi_alloc, + transmission_mode>=7?transmission_mode:0 + ); + } else if (rank_indc[0]==0 && rank_adapt==1) { + //in this case only TB0 is active for the retransmissions, deactivatiing TB1 + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; //no choice, only alamouti + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_1_5MHz_2A_FDD_t)); + break; + case 25: + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_5MHz_2A_FDD_t)); + break; + case 50: + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_10MHz_2A_FDD_t)); + break; + case 100: + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs2 = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 1; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2_20MHz_2A_FDD_t)); + break; + } + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + UE->dlsch[UE->current_thread_id[subframe]][0][1]->pmi_alloc, + transmission_mode>=7?transmission_mode:0 + ); + } + break; + case 5: + case 6: + DLSCH_alloc_pdu2_1E[0].ndi = trials&1; + DLSCH_alloc_pdu2_1E[0].rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + break; + } + } + } + } + num_pdcch_symbols_2 = generate_dci_top(num_ue_spec_dci + num_common_dci, + dci_alloc, + 0, + AMP, + &eNB->frame_parms, + eNB->common_vars.txdataF[eNB_id], + subframe); + + if (num_pdcch_symbols_2 > num_pdcch_symbols) { + msg("Error: given num_pdcch_symbols not big enough (%d > %d)\n",num_pdcch_symbols_2,num_pdcch_symbols); + exit(-1); + } + + for (k=0;kframe_parms, + eNB->dlsch[k][TB]->harq_processes[0]->nb_rb, + eNB->dlsch[k][TB]->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch[k][TB]->harq_processes[0]->mcs), + eNB->dlsch[k][TB]->harq_processes[0]->Nl, + num_pdcch_symbols, + 0,subframe, + transmission_mode>=7?transmission_mode:0); + #ifdef TBS_FIX // This is for MESH operation!!! + tbs[TB] = (double)3*TBStable[get_I_TBS(eNB->dlsch[k][TB]->harq_processes[0]->mcs)][eNB->dlsch[k][TB]->nb_rb-1]/4; + #else + tbs[TB] = eNB->dlsch[k][TB]->harq_processes[0]->TBS; + #endif + + rate[TB] = (double)tbs[TB]/(double)coded_bits_per_codeword[TB]; + + if ((SNR == snr0) && (trials == 0) && (round == 0) && (pmi_feedback == 0)) + printf("User %d, TB %d: Rate = %f (%f bits/dim) (G %d, TBS %d, mod %d, pdcch_sym %d, ndi %d)\n", + k,TB,rate[TB],rate[TB]*get_Qm(eNB->dlsch[k][TB]->harq_processes[0]->mcs), + coded_bits_per_codeword[TB], + tbs[TB], + get_Qm(eNB->dlsch[k][TB]->harq_processes[0]->mcs), + num_pdcch_symbols, + eNB->dlsch[k][TB]->harq_processes[0]->round); + + // use the PMI from previous trial + if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { + eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL); + UE->dlsch[UE->current_thread_id[subframe]][0][0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); + if (n_users>1) + eNB->dlsch[1][0]->harq_processes[0]->pmi_alloc = (eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555); + /* + if ((trials<10) && (round==0)) { + printf("tx PMI UE0 %x (pmi_feedback %d)\n",pmi2hex_2Ar1(eNB->dlsch[0][0]->pmi_alloc),pmi_feedback); + if (transmission_mode ==5) + printf("tx PMI UE1 %x\n",pmi2hex_2Ar1(eNB->dlsch[1][0]->pmi_alloc)); + } + */ + } +#ifdef DEBUG_HARQ + printf("[DLSIM] UE->dlsch[UE->current_thread_id[subframe]][0][%d]->pmi_alloc %d \n", TB, UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc); +#endif + + //if standard case when both TBs are active + if (transmission_mode == 4) { + if (((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2)) && TB0_active == 1 && TB1_active == 1){ +#ifdef DEBUG_HARQ + printf ("[DLSIM] I am calling from the eNode B 1\n"); +#endif + + eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL); +#ifdef DEBUG_HARQ + printf ("[DLSIM] I am calling from the eNode B 2\n"); +#endif + + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); + } + + else if (updated_csi == 0){ + + if (hold_rank1_precoder == 0 && ((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 5) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 5))){ +#ifdef DEBUG_HARQ + printf ("[DLSIM] I am calling from the eNode B 1\n"); +#endif + eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = pmi_convert_rank1_from_rank2(eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc,5,eNB->frame_parms.N_RB_DL); +#ifdef DEBUG_HARQ + printf ("[DLSIM] I am calling from the eNode B 2\n"); +#endif + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc,5,UE->frame_parms.N_RB_DL); + } + + else if (hold_rank1_precoder == 0 && ((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6))){ +#ifdef DEBUG_HARQ + printf ("[DLSIM] I am calling from the eNode B 1\n"); +#endif + eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = pmi_convert_rank1_from_rank2(eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc,6,eNB->frame_parms.N_RB_DL); +#ifdef DEBUG_HARQ + printf ("[DLSIM] I am calling from the eNode B 2\n"); +#endif + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc,6,UE->frame_parms.N_RB_DL); + } + } else if (updated_csi == 1){ + + if (((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 5) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 5))){ +#ifdef DEBUG_HARQ + printf ("[DLSIM] Updating CSI\n"); + printf ("[DLSIM] I quantize from ENodeB 1\n"); +#endif + + eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL); +#ifdef DEBUG_HARQ + printf ("[DLSIM] I convert pmi to rank1 eNode B 1\n"); +#endif + eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = pmi_convert_rank1_from_rank2(eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc,5,eNB->frame_parms.N_RB_DL); + +#ifdef DEBUG_HARQ + printf ("[DLSIM] I quantize from ENodeB 2\n"); +#endif + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); +#ifdef DEBUG_HARQ + printf ("[DLSIM] I convert pmi to rank1 eNode B 2\n"); +#endif + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc,5,UE->frame_parms.N_RB_DL); + } + else if (((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 6))){ +#ifdef DEBUG_HARQ + printf ("[DLSIM] Updating CSI\n"); + printf ("[DLSIM] I quantize from ENodeB 1\n"); +#endif + + eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL); +#ifdef DEBUG_HARQ + printf ("[DLSIM] I convert pmi to rank1 eNode B 1\n"); +#endif + eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc = pmi_convert_rank1_from_rank2(eNB->dlsch[0][TB]->harq_processes[0]->pmi_alloc,6,eNB->frame_parms.N_RB_DL); +#ifdef DEBUG_HARQ + printf ("[DLSIM] I quantize from ENodeB 2\n"); +#endif + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); +#ifdef DEBUG_HARQ + printf ("[DLSIM] I convert pmi to rank1 eNode B 2\n"); +#endif + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc = pmi_convert_rank1_from_rank2(UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc,6,UE->frame_parms.N_RB_DL); + } + + } + } +#ifdef DEBUG_HARQ + printf("[DLSIM 2 ] UE->dlsch[UE->current_thread_id[subframe]][0][%d]->pmi_alloc %d \n", TB, UE->dlsch[UE->current_thread_id[subframe]][0][TB]->pmi_alloc); +#endif + + start_meas(&eNB->dlsch_encoding_stats); + if (dlsch_encoding(eNB, + (TB==0) ? input_buffer0[k] : input_buffer1[k], + num_pdcch_symbols, + eNB->dlsch[k][TB], + 0, + subframe, + &eNB->dlsch_rate_matching_stats, + &eNB->dlsch_turbo_encoding_stats, + &eNB->dlsch_interleaving_stats)<0) + exit(-1); + + stop_meas(&eNB->dlsch_encoding_stats); + + eNB->dlsch[k][TB]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI; + start_meas(&eNB->dlsch_scrambling_stats); + dlsch_scrambling(&eNB->frame_parms, + 0, + eNB->dlsch[k][TB], + coded_bits_per_codeword[TB], + TB, + subframe<<1); + stop_meas(&eNB->dlsch_scrambling_stats); + + if (n_frames==2) { + for (s=0;sdlsch[k][TB]->harq_processes[0]->C;s++) { + if (sdlsch[k][TB]->harq_processes[0]->Cminus) + Kr = eNB->dlsch[k][TB]->harq_processes[0]->Kminus; + else + Kr = eNB->dlsch[k][TB]->harq_processes[0]->Kplus; + Kr_bytes = Kr>>3; + } + } + } + + start_meas(&eNB->dlsch_modulation_stats); + re_allocated = dlsch_modulation(eNB, + eNB->common_vars.txdataF[eNB_id], + AMP, + subframe, + num_pdcch_symbols, + ((TB0_active == 1)? eNB->dlsch[k][0]: NULL), + ((TB1_active == 1)? eNB->dlsch[k][1]: NULL)); + stop_meas(&eNB->dlsch_modulation_stats); + } //n_users + + + if (((transmission_mode == 3) || (transmission_mode == 4)) && (SNR == snr0) && (trials == 0) && (round == 0)){ + rate0_init = rate[0]; + rate1_init = rate[1]; + tbs0_init=tbs[0]; + tbs1_init=tbs[1]; + mod_order0_init=get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs); + mod_order1_init=get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs); + mcs0_init=eNB->dlsch[0][0]->harq_processes[0]->mcs; + mcs1_init=eNB->dlsch[0][1]->harq_processes[0]->mcs; + } + + generate_pilots(eNB, + eNB->common_vars.txdataF[eNB_id], + AMP, + LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); + + start_meas(&eNB->ofdm_mod_stats); + + do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], + eNB->common_vars.txdata[eNB_id], + (subframe*2), + &eNB->frame_parms); + + do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], + eNB->common_vars.txdata[eNB_id], + (subframe*2)+1, + &eNB->frame_parms); + + stop_meas(&eNB->ofdm_mod_stats); + stop_meas(&eNB->phy_proc_tx); + + do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], + eNB->common_vars.txdata[eNB_id], + (subframe*2)+2, + &eNB->frame_parms); + + if (n_frames==2) { + write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); + if (eNB->frame_parms.nb_antennas_tx>1) + write_output("txsigF1.m","txsF1", &eNB->common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); + } + + tx_lev = 0; + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa] + [subframe*eNB->frame_parms.samples_per_tti], + eNB->frame_parms.samples_per_tti); + } + tx_lev_dB = (unsigned int) dB_fixed(tx_lev); + + if (n_frames==2) { + write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); + if (eNB->frame_parms.nb_antennas_tx>1) + write_output("txsigF1.m","txsF1", &eNB->common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); + } + + tx_lev = 0; + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa] + [subframe*eNB->frame_parms.samples_per_tti], + eNB->frame_parms.samples_per_tti); + } + tx_lev_dB = (unsigned int) dB_fixed(tx_lev); + + if (n_frames==2) { + printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); + write_output("txsig0.m","txs0", &eNB->common_vars.txdata[eNB_id][0][subframe*eNB->frame_parms.samples_per_tti], eNB->frame_parms.samples_per_tti,1,1); + } + } + // printf("Copying tx ..., nsymb %d (n_tx %d), awgn %d\n",nsymb,eNB->frame_parms.nb_antennas_tx,awgn_flag); + for (i=0;i<2*frame_parms->samples_per_tti;i++) { + for (aa=0;aaframe_parms.nb_antennas_tx;aa++) { + if (awgn_flag == 0) { + s_re[aa][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + s_im[aa][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); + } + else { + if (transmission_mode==4) { + r_re[0][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][0]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)])+((double)(((short *)eNB->common_vars.txdata[eNB_id][1]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]); + r_im[0][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][0]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1])+((double)(((short *)eNB->common_vars.txdata[eNB_id][1]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); + + r_re[1][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][0]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)])-((double)(((short *)eNB->common_vars.txdata[eNB_id][1]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]); + r_im[1][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][0]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1])-((double)(((short *)eNB->common_vars.txdata[eNB_id][1]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); + //printf("r_re0 = %d\n",r_re[0][i]); + //printf("r_im0 = %d\n",r_im[0][i]); + //printf("r_re1 = %d\n",r_re[1][i]); + //printf("r_im1 = %d\n",r_im[1][i]); + + } + else { + for (aarx=0;aarxframe_parms.nb_antennas_rx;aarx++) { + if (aa==0) { + r_re[aarx][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]); + r_im[aarx][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); + } + else { + r_re[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]); + r_im[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); + } + } + } + } + } + } + + // Multipath channel + if (awgn_flag == 0) { + multipath_channel(eNB2UE[round],s_re,s_im,r_re,r_im, + 2*frame_parms->samples_per_tti,hold_channel); + // printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset); + if(abstx==1 && num_rounds>1) + if(round==0 && hold_channel==0){ + random_channel(eNB2UE[1],0); + random_channel(eNB2UE[2],0); + random_channel(eNB2UE[3],0); + } + if (UE->perfect_ce==1){ + freq_channel(eNB2UE[round],UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1); + // write_output("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8); + // write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*UE->frame_parms.N_RB_DL +1,1,8); + } + } + + // freq_channel(eNB2UE[0], NB_RB,12*NB_RB + 1); + if(abstx){ + if (trials==0 && round==0) { + // calculate freq domain representation to compute SINR + freq_channel(eNB2UE[0], NB_RB,2*NB_RB + 1); + // snr=pow(10.0,.1*SNR); + fprintf(csv_fd,"%f,",SNR); + + for (u=0;u<2*NB_RB;u++){ + for (aarx=0;aarxnb_rx;aarx++) { + for (aatx=0;aatxnb_tx;aatx++) { + channelx = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].x; + channely = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + + if(num_rounds>1){ + freq_channel(eNB2UE[1], NB_RB,2*NB_RB + 1); + + for (u=0;u<2*NB_RB;u++){ + for (aarx=0;aarxnb_rx;aarx++) { + for (aatx=0;aatxnb_tx;aatx++) { + channelx = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].x; + channely = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + freq_channel(eNB2UE[2], NB_RB,2*NB_RB + 1); + + for (u=0;u<2*NB_RB;u++){ + for (aarx=0;aarxnb_rx;aarx++) { + for (aatx=0;aatxnb_tx;aatx++) { + channelx = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].x; + channely = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + + freq_channel(eNB2UE[3], NB_RB,2*NB_RB + 1); + + for (u=0;u<2*NB_RB;u++){ + for (aarx=0;aarxnb_rx;aarx++) { + for (aatx=0;aatxnb_tx;aatx++) { + channelx = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].x; + channely = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + } + } + } + + //AWGN + // tx_lev is the average energy over the whole subframe + // but SNR should be better defined wrt the energy in the reference symbols + sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(eNB->frame_parms.N_RB_DL*12)) - SNR; + sigma2 = pow(10,sigma2_dB/10); + if (n_frames==1) + printf("Sigma2 %f (sigma2_dB %f,%f,%f )\n",sigma2,sigma2_dB,10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(NB_RB*12)),get_pa_dB(eNB->pdsch_config_dedicated)); + + for (i=0; i<10*frame_parms->samples_per_tti; i++) { + for (aa=0;aaframe_parms.nb_antennas_rx;aa++) { + //printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]); + ((short*) UE->common_vars.rxdata[aa])[2*i] = + (short) (sqrt(sigma2/2)*gaussdouble(0.0,1.0)); + ((short*) UE->common_vars.rxdata[aa])[2*i+1] = + (short) (sqrt(sigma2/2)*gaussdouble(0.0,1.0)); + } + } + + for (i=0; i<2*frame_parms->samples_per_tti; i++) { + for (aa=0;aaframe_parms.nb_antennas_rx;aa++) { + //printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]); + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i] = + (short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i+1] = + (short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); + } + } + + // lte_sync_time_init(eNB->frame_parms,common_vars); + // lte_sync_time(common_vars->rxdata, eNB->frame_parms); + // lte_sync_time_free(); + + /* + // optional: read rx_frame from file + if ((rx_frame_file = fopen("rx_frame.dat","r")) == NULL) + { + printf("Cannot open rx_frame.m data file\n"); + exit(0); + } + + result = fread((void *)PHY_vars->rx_vars[0].RX_DMA_BUFFER,4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); + printf("Read %d bytes\n",result); + result = fread((void *)PHY_vars->rx_vars[1].RX_DMA_BUFFER,4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); + printf("Read %d bytes\n",result); + + fclose(rx_frame_file); + */ + + if (n_frames==1) { + printf("RX level in null symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); + printf("RX level in data symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); + printf("rx_level Null symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)))); + printf("rx_level data symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)))); + } + + if (eNB->frame_parms.Ncp == 0) { // normal prefix + pilot1 = 4; + pilot2 = 7; + pilot3 = 11; + } + else { // extended prefix + pilot1 = 3; + pilot2 = 6; + pilot3 = 9; + } + + start_meas(&UE->phy_proc_rx[UE->current_thread_id[subframe]]); + // Inner receiver scheduling for 3 slots + for (Ns=(2*subframe);Ns<((2*subframe)+3);Ns++) { + for (l=0;lofdm_demod_stats); + slot_fep(UE, + l, + Ns%20, + 0, + 0, + 0); + + stop_meas(&UE->ofdm_demod_stats); + + if (UE->perfect_ce==1) { + + if (awgn_flag==0) { + for(k=0; knb_antennas_tx; aa++) { + for (aarx=0; aarxnb_antennas_rx; aarx++) { + for (i=0; iN_RB_DL*12; i++) { + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]= + (int16_t)(eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]= + (int16_t)(eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); + } + } + } + } + }else { + if (transmission_mode==4) { + for (i=0; iN_RB_DL*12; i++) { + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][0])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][0])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0; + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][1])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][1])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0; + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][2])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][2])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0; + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][3])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=-(short)(AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][3])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0; + } + } else { + for(aa=0; aanb_antennas_tx; aa++) { + for (aarx=0; aarxnb_antennas_rx; aarx++) { + for (i=0; iN_RB_DL*12; i++) { + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; + } + } + } + } + } + } + + if ((Ns==((2*subframe))) && (l==0)) { + /*ue_rrc_measurements(UE, + 0, + 0);*/ + lte_ue_measurements(UE, + subframe*UE->frame_parms.samples_per_tti, + 1, + 0, + rank_adapt, + subframe); + + if ((transmission_mode == 3) || (transmission_mode == 4)) + rank_indc[round] = UE->measurements.rank[0]; + + //printf ("Trial %d, Measurements are done \n", trials); + /* + debug_msg("RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), avg rx power %d dB (%d lin), RX gain %d dB\n", + UE->measurements.rx_rssi_dBm[0] - ((UE->frame_parms.nb_antennas_rx==2) ? 3 : 0), + UE->measurements.wideband_cqi_dB[0][0], + UE->measurements.wideband_cqi_dB[0][1], + UE->measurements.wideband_cqi[0][0], + UE->measurements.wideband_cqi[0][1], + UE->measurements.rx_power_avg_dB[0], + UE->measurements.rx_power_avg[0], + UE->rx_total_gain_dB); + debug_msg("N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n", + UE->measurements.n0_power_tot_dBm, + UE->measurements.n0_power_dB[0], + UE->measurements.n0_power_dB[1], + UE->measurements.n0_power[0], + UE->measurements.n0_power[1], + UE->measurements.n0_power_avg_dB, + UE->measurements.n0_power_avg); + debug_msg("Wideband CQI tot %d dB, wideband cqi avg %d dB\n", + UE->measurements.wideband_cqi_tot[0], + UE->measurements.wideband_cqi_avg[0]); + */ + + if (transmission_mode == 4 || transmission_mode == 5 || transmission_mode == 6) { + if (pmi_feedback == 1) { + pmi_feedback = 0; + hold_channel = 1; + + if (updated_csi==0) { + if (hold_rank1_precoder == 0) + hold_rank1_precoder = 1; + } + //printf ("trial %d pmi_feedback %d \n", trials, pmi_feedback); + //printf ("go to PMI feedback\n"); +#ifdef DEBUG_HARQ + printf ("[DLSIM] I am doing measurements and coming back to reencoding\n"); +#endif + goto PMI_FEEDBACK; + } + } + + } + + + if ((Ns==(2*subframe)) && (l==pilot1)) {// process symbols 0,1,2 + if (dci_flag == 1) { + UE->UE_mode[0] = PUSCH; + start_meas(&UE->dlsch_rx_pdcch_stats); + + rx_pdcch(UE, + trials, + subframe, + 0, + (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, + UE->high_speed_flag, + UE->is_secondary_ue); + + stop_meas(&UE->dlsch_rx_pdcch_stats); + // overwrite number of pdcch symbols + UE->pdcch_vars[UE->current_thread_id[subframe]][0]->num_pdcch_symbols = num_pdcch_symbols; + + dci_cnt = dci_decoding_procedure(UE, + dci_alloc_rx,1, + eNB_id, + subframe); + printf("dci_cnt %d\n",dci_cnt); + + if (dci_cnt==0) { + dlsch_active = 0; + if (round==0) { + dci_errors++; + + round=5; // this is meant to stop the "while" loop if DCI is wrong; + errs[0][0]++; + + if (n_frames==2) + printf("DCI error trial %d errs[0][0] %d\n",trials,errs[0][0]); + } + } + + for (i=0;idlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->first_tx=1; + } + if ((transmission_mode == 3 || transmission_mode ==4) && (round == 0)) { + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->first_tx=1; + } + + if ((dci_alloc_rx[i].rnti == n_rnti) && + (generate_ue_dlsch_params_from_dci(0, + subframe, + dci_alloc_rx[i].dci_pdu, + dci_alloc_rx[i].rnti, + dci_alloc_rx[i].format, + UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->dlsch[UE->current_thread_id[subframe]][0], + &UE->frame_parms, + UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + transmission_mode<7?0:transmission_mode, + UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti_is_temporary? UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti: 0)==0)) { + dump_dci(&UE->frame_parms,&dci_alloc_rx[i]); + coded_bits_per_codeword[0]= get_G(&eNB->frame_parms, + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->nb_rb, + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->rb_alloc_even, + get_Qm(UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->mcs), + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->Nl, + UE->pdcch_vars[UE->current_thread_id[subframe]][0]->num_pdcch_symbols, + 0, + subframe, + transmission_mode>=7?transmission_mode:0); + if (transmission_mode == 3 || transmission_mode == 4) { + coded_bits_per_codeword[1]= get_G(&eNB->frame_parms, + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->nb_rb, + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->rb_alloc_even, + get_Qm(UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->mcs), + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->Nl, + UE->pdcch_vars[UE->current_thread_id[subframe]][1]->num_pdcch_symbols, + 0, + subframe, + transmission_mode>=7?transmission_mode:0); + } + /* + rate = (double)dlsch_tbs25[get_I_TBS(UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->mcs)][UE->dlsch[UE->current_thread_id[subframe]][0][0]->nb_rb-1]/(coded_bits_per_codeword); + rate*=get_Qm(UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->mcs); + */ + printf("num_pdcch_symbols %d, G %d, TBS %d\n",UE->pdcch_vars[UE->current_thread_id[subframe]][0]->num_pdcch_symbols,coded_bits_per_codeword [0],UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->TBS); + + dlsch_active = 1; // what does it indicates??? + } else { + dlsch_active = 0; + if (round==0) { + dci_errors++; + errs[0][0]++; + //round_trials[0]++; + round=5; + + if (n_frames==1) + printf("DCI misdetection trial %d\n",trials); + + } + // for (i=1;i<=round;i++) + // round_trials[i]--; + // round=5; + } + } + } else { //dci_flag == 0 + UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti = n_rnti; + UE->pdcch_vars[UE->current_thread_id[subframe]][0]->num_pdcch_symbols = num_pdcch_symbols; + if (round == 0) { + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->first_tx=1; + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->first_tx=1; + } +#ifdef DEBUG_HARQ + printf("[DLSIM 3 ] UE->dlsch[UE->current_thread_id[subframe]][0][1]->pmi_alloc %d \n", UE->dlsch[UE->current_thread_id[subframe]][0][1]->pmi_alloc); +#endif + + if (transmission_mode==4 && use_sic_receiver==1){ + if (rx_type>rx_IC_single_stream) + rx_type=rx_SIC_dual_stream; + } + else if (transmission_mode==4 && use_sic_receiver==0){ + if (rx_type>rx_IC_single_stream) + rx_type=rx_IC_dual_stream; + } + + switch (transmission_mode) { + case 1: + case 2: + generate_ue_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + (common_flag==0)? C_RNTI : SI_RNTI, + (common_flag==0)? format1 : format1A, + UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->dlsch[UE->current_thread_id[subframe]][0], + &UE->frame_parms, + UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + transmission_mode<7?0:transmission_mode, + UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti_is_temporary? UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti: 0); + break; + case 3: + + //printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->round,UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->first_tx); + + generate_ue_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + (common_flag==0)? C_RNTI : SI_RNTI, + (common_flag==0)? format2A : format1A, + UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->dlsch[UE->current_thread_id[subframe]][0], + &UE->frame_parms, + UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + transmission_mode<7?0:transmission_mode, + UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti_is_temporary? UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti: 0); + //printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->round,UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->first_tx); + break; + case 4: + generate_ue_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + (common_flag==0)? C_RNTI : SI_RNTI, + (common_flag==0)? format2 : format1A,//format1A only for a codeblock + UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->dlsch[UE->current_thread_id[subframe]][0], + &UE->frame_parms, + UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + transmission_mode<7?0:transmission_mode, + UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti_is_temporary? UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti: 0); + break; + case 5: + case 6: + generate_ue_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu2_1E[0], + C_RNTI, + format1E_2A_M10PRB, + UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->dlsch[UE->current_thread_id[subframe]][0], + &UE->frame_parms, + UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + transmission_mode<7?0:transmission_mode, + UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti_is_temporary? UE->pdcch_vars[UE->current_thread_id[subframe]][0]->crnti: 0); + break; + } + dlsch_active = 1; + } // if dci_flag == 1 + } + + if (dlsch_active == 1) { + if (TB0_active==1) + cur_harq_pid =UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid; + else + cur_harq_pid =UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid; + + if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix + /* if (transmission_mode == 5) { + if ((UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[cur_harq_pid]->dl_power_off==0) && + (openair_daq_vars.use_ia_receiver ==1)) { + rx_type = rx_IC_single_stream; + } else { + rx_type = rx_standard; + } + }*/ + + + start_meas(&UE->dlsch_llr_stats); + + for (m=UE->pdcch_vars[UE->current_thread_id[subframe]][0]->num_pdcch_symbols; mpdcch_vars[UE->current_thread_id[subframe]][0]->num_pdcch_symbols)?1:0, + rx_type, + i_mod, + UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid)==-1){ + dlsch_active = 0; + break; + } + } + stop_meas(&UE->dlsch_llr_stats); + } + + if ((Ns==(1+(2*subframe))) && (l==pilot1)){// process symbols (6 Extended Prefix),7,8,9 + start_meas(&UE->dlsch_llr_stats); + for (m=pilot2;mdlsch_llr_stats); + } + + if ((Ns==(2+(2*subframe))) && (l==0)) { // process symbols 10,11,(12,13 Normal Prefix) do deinterleaving for TTI + start_meas(&UE->dlsch_llr_stats); + for (m=pilot3; mframe_parms.symbols_per_tti; m++) { + if (rx_pdsch(UE, + PDSCH, + eNB_id, + eNB_id_i, + 0, + subframe, + m, + 0, + rx_type, + i_mod, + cur_harq_pid)==-1) { + dlsch_active=0; + break; + } + } + stop_meas(&UE->dlsch_llr_stats); + } + } + } + } + + //saving PMI in case of Transmission Mode > 5 + + if(abstx){ + if (trials==0 && round==0 && transmission_mode>=4){ + for (iii=0; iiipdsch_vars[eNB_id]->pmi_ext[iii]),(UE->pdsch_vars[eNB_id_i]->pmi_ext[iii])); + fprintf(csv_fd,"%x,",(UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->pmi_ext[iii])); + //printf("%x ",(UE->pdsch_vars[eNB_id]->pmi_ext[iii])); + } + } + } + + + for (TB=0; TBdlsch[UE->current_thread_id[subframe]][0][TB]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; + coded_bits_per_codeword[TB] = get_G(&eNB->frame_parms, + eNB->dlsch[0][TB]->harq_processes[0]->nb_rb, + eNB->dlsch[0][TB]->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch[0][TB]->harq_processes[0]->mcs), + eNB->dlsch[0][TB]->harq_processes[0]->Nl, + num_pdcch_symbols, + 0,subframe, + transmission_mode>=7?transmission_mode:0); + + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][TB]->current_harq_pid]->G = coded_bits_per_codeword[TB]; + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][TB]->current_harq_pid]->Qm = get_Qm(eNB->dlsch[0][TB]->harq_processes[0]->mcs); + + if (n_frames==2) { + printf("Kmimo=%d, TB=%d, G=%d, TBS=%d\n",Kmimo,TB,coded_bits_per_codeword[TB], + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][TB]->current_harq_pid]->TBS); + + // calculate uncoded BER + uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[TB]); + + AssertFatal(uncoded_ber_bit, "uncoded_ber_bit==NULL"); + + sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round, TB); + sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, TB); + write_output(fname,vname, UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][TB]->current_harq_pid]->codeword],coded_bits_per_codeword[TB],1,0); + sprintf(fname,"dlsch_cw%d_e.m", TB); + sprintf(vname,"dlschcw%d_e", TB); + write_output(fname, vname,eNB->dlsch[0][TB]->harq_processes[0]->e,coded_bits_per_codeword[TB],1,4); + uncoded_ber=0; + printf("trials=%d\n", trials); + + for (i=0;idlsch[0][TB]->harq_processes[0]->e[i] != (UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][TB]->current_harq_pid]->codeword][i]<0)) { + uncoded_ber_bit[i] = 1; + uncoded_ber++; + } + else + uncoded_ber_bit[i] = 0; + + uncoded_ber/=coded_bits_per_codeword[TB]; + avg_ber += uncoded_ber; + sprintf(fname,"cw%d_uncoded_ber_bit.m", TB); + sprintf(vname,"uncoded_ber_bit_cw%d", TB); + write_output(fname, vname,uncoded_ber_bit,coded_bits_per_codeword[TB],1,0); + printf("cw %d, uncoded ber %f\n",TB,uncoded_ber); + + free(uncoded_ber_bit); + uncoded_ber_bit = NULL; + + } + + start_meas(&UE->dlsch_unscrambling_stats); + dlsch_unscrambling(&UE->frame_parms, + 0, + UE->dlsch[UE->current_thread_id[subframe]][0][TB], + coded_bits_per_codeword[TB], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->llr[TB], + TB, + subframe<<1); + stop_meas(&UE->dlsch_unscrambling_stats); + + start_meas(&UE->dlsch_decoding_stats[UE->current_thread_id[subframe]]); +#ifdef DEBUG_HARQ + //printf("non-SIC decoding TB %d LLR is %d\n", TB, UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][TB]->current_harq_pid]->codeword); +#endif + ret[TB] = dlsch_decoding(UE, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->llr[TB], + &UE->frame_parms, + UE->dlsch[UE->current_thread_id[subframe]][0][TB], + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][TB]->current_harq_pid], + 0, + subframe, + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->current_harq_pid, + 1, + llr8_flag); + stop_meas(&UE->dlsch_decoding_stats[UE->current_thread_id[subframe]]); +#ifdef DEBUG_HARQ + printf("[DLSIM] ret[%d] = %d\n", TB, ret[TB]); +#endif + + //printf("retr cw 0 = %d\n", ret[0]); + //printf("current round = %d\n", UE->dlsch[UE->current_thread_id[subframe]][0][cw_non_sic]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][cw_non_sic]->current_harq_pid]->round); + + + + if (ret[TB] <= UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations ) { //if CW0 is decoded, approach CW1 + decoded_tb[TB]=1; +#ifdef DEBUG_HARQ + printf("[DLSIM] TB%d is decoded\n", TB); +#endif + + /*avg_iter[TB] += ret[TB]; + iter_trials[TB]++;*/ + + if (n_frames==1) { + printf("cw non sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",TB,round,uncoded_ber); +#ifdef PRINT_BYTES + for (s=0;sdlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->C;s++) { + if (sdlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->Cminus) + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->Kminus; + else + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->Kplus; + + Kr_bytes = Kr>>3; + + printf("Decoded_output (Segment %d):\n",s); + for (i=0;idlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->c[s][i], + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->c[s][i]^eNB->dlsch[0][TB]->harq_processes[0]->c[s][i]); + } +#endif + } + + UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[UE->current_thread_id[subframe]][eNB_id][TB]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][TB]->current_harq_pid]->TBS; + + // If the receiver is NOT SIC, Here we are done with both CW, now only to calculate BLER + //If the receiver IS SIC, we are done only with CW0, CW1 was only compensated by this moment (y1' obtained) + if (UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC + /* + //for (round = 0 ; round < UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->round ; round++) { + // we assume here that the second stream has a lower MCS and is thus more likely to be decoded + // re-encoding of second stream + dlsch0_ue_harq = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]; + dlsch0_eNB_harq = UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]; + + dlsch0_eNB_harq->mimo_mode = LARGE_CDD; + dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc[0]; + dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb; + dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs; + dlsch0_eNB_harq->rvidx = dlsch0_ue_harq->rvidx; + dlsch0_eNB_harq->Nl = dlsch0_ue_harq->Nl; + dlsch0_eNB_harq->round = dlsch0_ue_harq->round; + + dlsch0_eNB_harq->TBS = dlsch0_ue_harq->TBS; + dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off; + dlsch0_eNB_harq->status = dlsch0_ue_harq->status; + + UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->active = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->active; + UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->rnti = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->rnti; + UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->current_harq_pid = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid; + + dlsch_encoding(UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->b, + &UE->frame_parms, + num_pdcch_symbols, + UE->dlsch[UE->current_thread_id[subframe]][eNB_id], + 0,subframe, + &UE->dlsch_rate_matching_stats, + &UE->dlsch_turbo_encoding_stats, + &UE->dlsch_interleaving_stats + ); + + coded_bits_per_codeword = get_G(&UE->frame_parms, + UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->current_harq_pid]->nb_rb, + UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->current_harq_pid]->rb_alloc, + get_Qm(UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->current_harq_pid]->mcs), + UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->current_harq_pid]->Nl, + num_pdcch_symbols, + 0,subframe); + + + //scrambling + dlsch_scrambling(&UE->frame_parms, + 0, + UE->dlsch[UE->current_thread_id[subframe]][eNB_id], + coded_bits_per_codeword, + 0, + subframe<<1); + + + //modulation + re_allocated = dlsch_modulation(sic_buffer, + AMP, + subframe, + &UE->frame_parms, + num_pdcch_symbols, + &UE->dlsch[UE->current_thread_id[subframe]][0][0], + NULL); + // sic_buffer is a vector of size nb_antennas_tx, but both contain the same signal, since we do modulation without precoding + // precoding is contained in effective channel estimate + // compute the norm of the effective channel for both receive antennas -> alphha[0], alphha[2] + // multiply with the norm of the effective channnel + */ + + //stripping (from matched filter output of first stream = rxdataF_comp0) + // this is pseudocode + /* + for (i=0; inb_antennas_rx; i++) { + UE->pdsch_vars[eNB_id].rxdataF_ext[i] -= alpha[i].*sic_buffer[i]; + } + */ + + //apply rho to output + /* + dlsch_channel_compensation(UE->pdsch_vars[eNB_id].rxdataF_ext, + UE->pdsch_vars[eNB_id].dl_ch_rho_ext[harq_pid][round], + UE->pdsch_vars[eNB_id]->dl_ch_mag1, + UE->pdsch_vars[eNB_id]->dl_ch_magb1, + UE->pdsch_vars[eNB_id]->rxdataF_comp1, + NULL, + frame_parms, + symbol, + first_symbol_flag, + i_mod, + nb_rb, + pdsch_vars[eNB_id]->log2_maxh, + phy_measurements); // log2_maxh+I0_shift + */ + + + //detection of second stream + //} + + } + + + if ((UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && + (UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->mimo_mode <=DUALSTREAM_PUSCH_PRECODING) && (TB0_active == 1) && + (rx_type==rx_SIC_dual_stream)) { +#ifdef DEBUG_HARQ + printf("[DLSIM] Starting SIC procedure\n"); + printf("current round = %d\n", PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->round); + printf("\n CW 0 is decoded, i go for , round %d\n", round); + printf("\n ret[TB0] = %d round %d\n", ret[TB], round); +#endif + sic_attempt[round]++; + + for (round_sic = 0 ; round_sic < (round +1); round_sic++) { + +#ifdef DEBUG_HARQ + printf("[DLSIM] 0 Round sic = %d\n", round_sic); +#endif + //printf("I enter round_sic loop \n"); + //printf("round_sic= %d\n", round_sic); + dlsch0_ue_harq = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]; + dlsch0_eNB_harq = UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]; + + dlsch0_eNB_harq->mimo_mode = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->mimo_mode; + dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0]; + dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb; + dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs; + dlsch0_eNB_harq->rvidx = round_sic;//dlsch0_ue_harq->rvidx; + //printf("dlsch0_eNB_harq->rvidx = %d \n", dlsch0_eNB_harq->rvidx); + dlsch0_eNB_harq->Nl = dlsch0_ue_harq->Nl; + dlsch0_eNB_harq->round = round_sic; //dlsch0_ue_harq->round; + dlsch0_eNB_harq->TBS = dlsch0_ue_harq->TBS; + dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off; + dlsch0_eNB_harq->status = dlsch0_ue_harq->status; + + UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->rvidx = round_sic; + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid]->rvidx=round_sic; + UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->round = round_sic; + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid]->round=round_sic; + + UE->dlsch_eNB[eNB_id]->active = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->active; + UE->dlsch_eNB[eNB_id]->rnti = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->rnti; + UE->dlsch_eNB[eNB_id]->current_harq_pid = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid; +#ifdef DEBUG_HARQ + printf("UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->round = %d\n", UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->round); +#endif + dlsch_encoding_SIC(UE, + input_buffer0[0], //UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->b,, + num_pdcch_symbols, + &UE->dlsch_eNB[0][0], + 0, + subframe, + &UE->dlsch_rate_matching_stats, + &UE->dlsch_turbo_encoding_stats, + &UE->dlsch_interleaving_stats); + + + coded_bits_per_codeword[0]= get_G(&UE->frame_parms, + UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch_eNB[eNB_id]->current_harq_pid]->nb_rb, + UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch_eNB[eNB_id]->current_harq_pid]->rb_alloc, + get_Qm(UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch_eNB[eNB_id]->current_harq_pid]->mcs), + UE->dlsch_eNB[eNB_id]->harq_processes[UE->dlsch_eNB[eNB_id]->current_harq_pid]->Nl, + num_pdcch_symbols, + 0, + subframe, + transmission_mode>=7?transmission_mode:0); + + dlsch_scrambling(&UE->frame_parms, + 0, + &UE->dlsch_eNB[0][0], + coded_bits_per_codeword[0], + 0, + subframe<<1); + + re_allocated = dlsch_modulation_SIC(sic_buffer, + subframe, + &UE->frame_parms, + num_pdcch_symbols, + &UE->dlsch_eNB[0][0], + coded_bits_per_codeword[0]); + + // write_output("sic_buffer.m","sic", *sic_buffer,re_allocated,1,1); + // write_output("rxdataF_comp1.m","rxF_comp1", *UE->pdsch_vars[eNB_id]->rxdataF_comp1[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid][round],14*12*25,1,1); + // write_output("rxdataF_rho.m","rho", *UE->pdsch_vars[eNB_id]->dl_ch_rho_ext[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid][round],14*12*25,1,1); + + + switch (get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)){ + + + + case 2: + + dlsch_qpsk_llr_SIC(&UE->frame_parms, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid][round_sic], + sic_buffer, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->dl_ch_rho_ext[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid][round_sic], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->llr[1], + num_pdcch_symbols, + dlsch0_eNB_harq->nb_rb, + subframe, + get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs), + dlsch0_eNB_harq->rb_alloc[0]); + break; + + case 4: + + dlsch_16qam_llr_SIC(&UE->frame_parms, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid][round_sic], + sic_buffer, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->dl_ch_rho_ext[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid][round_sic], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->llr[1], + num_pdcch_symbols, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->dl_ch_mag1[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid][round_sic], + dlsch0_eNB_harq->nb_rb, + subframe, + get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs), + dlsch0_eNB_harq->rb_alloc[0]); + break; + case 6: + dlsch_64qam_llr_SIC(&UE->frame_parms, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->rxdataF_comp1[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid][round_sic], + sic_buffer, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->dl_ch_rho_ext[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid][round_sic], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->llr[1], + num_pdcch_symbols, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->dl_ch_mag1[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid][round_sic], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->dl_ch_magb1[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid][round_sic], + dlsch0_eNB_harq->nb_rb, + subframe, + get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs), + dlsch0_eNB_harq->rb_alloc[0]); + break; + } + //}// rouns sic +#ifdef DEBUG_HARQ + printf("[DLSIM] TB1 is mapped into CW%d\n", UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid]->codeword); +#endif + + // write_output("rxdata_llr1.m","llr1", UE->pdsch_vars[eNB_id]->llr[1],re_allocated*2,1,0); + + // replace cw_sic with TB+1 + UE->dlsch[UE->current_thread_id[subframe]][0][1]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; + coded_bits_per_codeword[1]= get_G(&eNB->frame_parms, + eNB->dlsch[0][1]->harq_processes[0]->nb_rb, + eNB->dlsch[0][1]->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs), + eNB->dlsch[0][1]->harq_processes[0]->Nl, + num_pdcch_symbols, + 0, + subframe, + transmission_mode>=7?transmission_mode:0); + + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid]->G = coded_bits_per_codeword[1]; + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid]->Qm = get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs); + + if (n_frames==1) { + printf("Kmimo=%d, cw=%d, G=%d, TBS=%d\n",Kmimo,1,coded_bits_per_codeword[1], + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid]->TBS); + + // calculate uncoded BER + uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[1]); + AssertFatal(uncoded_ber_bit, "uncoded_ber_bit==NULL"); + sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round,1); + sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, 1); + write_output(fname,vname, UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[1],coded_bits_per_codeword[1],1,0); + sprintf(fname,"dlsch_cw%d_e.m", 1); + sprintf(vname,"dlschcw%d_e", 1); + write_output(fname, vname,eNB->dlsch[0][1]->harq_processes[0]->e,coded_bits_per_codeword[1],1,4); + uncoded_ber=0; + printf("trials=%d\n", trials); + for (i=0;idlsch[0][1]->harq_processes[0]->e[i] != (UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid]->codeword][i]<0)) { + uncoded_ber_bit[i] = 1; + uncoded_ber++; + } + else + uncoded_ber_bit[i] = 0; + + uncoded_ber/=coded_bits_per_codeword[1]; + avg_ber += uncoded_ber; + sprintf(fname,"cw%d_uncoded_ber_bit.m", 1); + sprintf(vname,"uncoded_ber_bit_cw%d", 1); + write_output(fname, vname,uncoded_ber_bit,coded_bits_per_codeword[1],1,0); + printf("cw %d, uncoded ber %f\n",1,uncoded_ber); + free(uncoded_ber_bit); + uncoded_ber_bit = NULL; + } + + start_meas(&UE->dlsch_unscrambling_stats); + dlsch_unscrambling(&UE->frame_parms, + 0, + UE->dlsch[UE->current_thread_id[subframe]][0][1], + coded_bits_per_codeword[1], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->llr[1], + 1, + subframe<<1); + stop_meas(&UE->dlsch_unscrambling_stats); + + start_meas(&UE->dlsch_decoding_stats[UE->current_thread_id[subframe]]); + + ret[1] = dlsch_decoding(UE, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->llr[1], + &UE->frame_parms, + UE->dlsch[UE->current_thread_id[subframe]][0][1], + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid], + 0, + subframe, + UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid, + 1,llr8_flag); + stop_meas(&UE->dlsch_decoding_stats[UE->current_thread_id[subframe]]); + +#ifdef DEBUG_HARQ + printf("[DLSIM] Decoding TB1 in SIC: ret[1] = %d, round sic %d\n", ret[1], round_sic); +#endif + + //printf("ret TB 1 = %d round %d \n", ret[1], round); + + if (ret[1] <=UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations ) { + decoded_tb[1]=1; + decoded_in_sic[round]++; + round_sic = round+1; // to exit round_sic +#ifdef DEBUG_HARQ + printf("[DLSIM] TB1 is decoded in SIC loop\n"); +#endif + avg_iter[1] += ret[1]; + iter_trials[1]++; + + + if (n_frames==1) { + printf("cw sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",1,round,uncoded_ber); + + #ifdef PRINT_BYTES + for (s=0;sdlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->C;s++) { + if (sdlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->Cminus) + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->Kminus; + else + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->Kplus; + + Kr_bytes = Kr>>3; + + printf("Decoded_output (Segment %d):\n",s); + + for (i=0;idlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->c[s][i], + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->c[s][i]^eNB->dlsch[0][1]->harq_processes[0]->c[s][i]); + } + #endif + } + } + } //round_sic + + + if (ret[1] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations ){ + decoded_tb[1]=0; + errs[1][round]++; +#ifdef DEBUG_HARQ + printf("[DLSIM] TB1 is not decoded in SIC loop, errs[TB1][round %d] = %d\n",round, errs[1][round]); +#endif + + // exit(0); + + avg_iter[1] += ret[1]-1; + iter_trials[1]++; + + if (n_frames==1) { + //if ((n_frames==1) || (SNR>=30)) { + printf("cw sic %d, round %d: DLSCH errors found, uncoded ber %f\n",1,round,uncoded_ber); +#ifdef PRINT_BYTES + for (s=0;sdlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->C;s++) { + if (sdlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->Cminus) + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->Kminus; + else + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->Kplus; + + Kr_bytes = Kr>>3; + + printf("Decoded_output (Segment %d):\n",s); + for (i=0;idlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->c[s][i], + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[0]->c[s][i]^eNB->dlsch[0][1]->harq_processes[0]->c[s][i]); + } +#endif + } //n_frames==1 + // exit(0); + } //if (ret > UE->dlsch[UE->current_thread_id[subframe]][0][1]->max_turbo_iterations ) + }//if SIC + } else { + + if (TB0_active && TB1_active) + UE->dlsch[UE->current_thread_id[subframe]][0][1]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][1]->current_harq_pid]->round++; + + decoded_tb[TB]=0; + errs[TB][round]++; +#ifdef DEBUG_HARQ + printf("[DLSIM] TB%d is not decoded outside SIC loop, errs[TB%d][round %d] = %d\n", TB, TB, round, errs[TB][round]); +#endif + + + /*if (cw_non_sic==0) { + avg_iter[0] += ret[0]-1; + iter_trials[0]++; + }*/ + + if ((UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) && + (UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->mimo_mode <=DUALSTREAM_PUSCH_PRECODING) && + (rx_type==rx_SIC_dual_stream) && (TB0_active ==1)) { + errs[1][round]++; +#ifdef DEBUG_HARQ + printf("[DLSIM] TB%d is not decoded outside SIC loop, errs[TB%d][round %d] = %d\n", 1, 1, round, errs[1][round]); +#endif + } + + + /*if (cw_non_sic==1) { + avg_iter[1] += ret[1]-1; + iter_trials[1]++; + }*/ + + + if (n_frames==1) { + //if ((n_frames==1) || (SNR>=30)) { + printf("cw %d, round %d: DLSCH errors found, uncoded ber %f\n",TB,round,uncoded_ber); +#ifdef PRINT_BYTES + for (s=0;sdlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->C;s++) { + if (sdlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->Cminus) + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->Kminus; + else + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->Kplus; + + Kr_bytes = Kr>>3; + + printf("Decoded_output (Segment %d):\n",s); + for (i=0;idlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->c[s][i], + UE->dlsch[UE->current_thread_id[subframe]][0][TB]->harq_processes[0]->c[s][i]^eNB->dlsch[0][TB]->harq_processes[0]->c[s][i]); + } +#endif + } + } + if (rx_type==rx_SIC_dual_stream) + TB++; // to terminate the loop over TB + } + + stop_meas(&UE->phy_proc_rx[UE->current_thread_id[subframe]]); + + if (n_frames==4) { + + //rxsig + sprintf(fname,"rxsig0_r%d.m",round); + sprintf(vname,"rxs0_r%d",round); + write_output(fname,vname, &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); + sprintf(fname,"rxsigF0_r%d.m",round); + sprintf(vname,"rxs0F_r%d",round); + write_output(fname,vname, &UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].rxdataF[0][0],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1); + if (UE->frame_parms.nb_antennas_rx>1) { + sprintf(fname,"rxsig1_r%d.m",round); + sprintf(vname,"rxs1_r%d",round); + write_output(fname,vname, UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); + sprintf(fname,"rxsig1F_r%d.m",round); + sprintf(vname,"rxs1F_r%d",round); + write_output(fname,vname, UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].rxdataF[1],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1); + } + + //channel + write_output("chanF11.m","chF11",eNB2UE[0]->chF[0],12*NB_RB,1,8); + write_output("chan11.m","ch11",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8); + + if (eNB->frame_parms.nb_antennas_rx==2 && eNB->frame_parms.nb_antennas_tx==1 ){ + write_output("chan21.m","ch21",eNB2UE[0]->ch[1],eNB2UE[0]->channel_length,1,8); + } + if (eNB->frame_parms.nb_antennas_tx>1){ + write_output("chan12.m","ch12",eNB2UE[0]->ch[1],eNB2UE[0]->channel_length,1,8); + if ( eNB->frame_parms.nb_antennas_rx>1){ + write_output("chan21.m","ch21",eNB2UE[0]->ch[2],eNB2UE[0]->channel_length,1,8); + write_output("chan22.m","ch22",eNB2UE[0]->ch[3],eNB2UE[0]->channel_length,1,8); + } + } + + //channel estimates + sprintf(fname,"dlsch00_r%d.m",round); + sprintf(vname,"dl00_r%d",round); + write_output(fname,vname, + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][0][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + if (UE->frame_parms.nb_antennas_rx>1) { + sprintf(fname,"dlsch01_r%d.m",round); + sprintf(vname,"dl01_r%d",round); + write_output(fname,vname, + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][1][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + } + if (eNB->frame_parms.nb_antennas_tx>1) { + sprintf(fname,"dlsch10_r%d.m",round); + sprintf(vname,"dl10_r%d",round); + write_output(fname,vname, + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + } + if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) { + sprintf(fname,"dlsch11_r%d.m",round); + sprintf(vname,"dl11_r%d",round); + write_output(fname,vname, + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][3][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + } + //pdsch_vars + dump_dlsch2(UE,eNB_id,subframe,coded_bits_per_codeword,round, UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid); + /* + write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); + write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); + write_output("dlsch_eNB_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4); + write_output("dlsch_UE_w.m","w",UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0); + */ + + //pdcch_vars + write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1); + write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id]->dl_ch_estimates_ext[0],300*3,1,1); + + write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id]->rxdataF_comp[0],4*300,1,1); + write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id]->llr,2400,1,4); + + if (round == 3) exit(-1); + } + + if (xforms==1) { + phy_scope_UE(form_ue, + UE, + eNB_id, + 0,// UE_id + subframe); + } +#ifdef DEBUG_HARQ + printf("[DLSIM] Errors errs[TB0][round %d] = %d, errs[TB1][round %d] = %d\n ", round, errs[0][round], round, errs[1][round]); +#endif + + if ((transmission_mode != 3) && (transmission_mode !=4) && (ret[0] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations)){ + //printf("flag 1 \n"); + round++; + } + + /* if ((rank_indc[0]==0) && (rank_adapt==1)) + errs[1][0]++;*/ + + + if (transmission_mode == 3 || transmission_mode == 4 ) { + + if (TB0_active==1) + active_tb0_sent[round]++; + + if (TB1_active==1) + active_tb1_sent[round]++; + + if (TB0_active==1 && decoded_tb[0]==0) + failed_tb0[round]++; + + if (TB1_active==1 && decoded_tb[1]==0) + failed_tb1[round]++; + + if (round==0){ + if (rank_adapt==1){ + if (rank_indc[0]==1) + clsm_counter++; + } + } + + if (rank_indc[0]==1 || (rank_indc[0]==0 && rank_adapt==0)){ + if ((TB0_active==1) && (decoded_tb[0]==1)){ + throug_tb0=rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs)/(round+1); +#ifdef DEBUG_HARQ + printf("rank 2 round %d, TB0 contributes to throughput throug_tb0 %f \n", round, throug_tb0 ); +#endif + } else if (((TB0_active==1) && (decoded_tb[0]==0)) || (TB0_active==0)){ + throug_tb0=0; + } + throug_tb0_acc[round]+=throug_tb0; + } else if ((rank_indc[0]==0) && (rank_adapt==1)){ + if ((TB0_active==1) && (decoded_tb[0]==1)){ + throug_tb0=rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs)/(round+1); +#ifdef DEBUG_HARQ + printf("rank 1 round %d, TB0 contributes to throughput throug_tb0 %f \n", round, throug_tb0 ); +#endif + } else if (((TB0_active==1) && (decoded_tb[0]==0)) || (TB0_active==0)){ + throug_tb0=0; + } + throug_tb0_acc[round]+=throug_tb0; + } + + if (rank_indc[0]==1 || (rank_indc[0]==0 && rank_adapt==0)){ + if ((TB1_active==1) && (decoded_tb[1]==1)){ + throug_tb1=rate1_init*get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)/(round+1); +#ifdef DEBUG_HARQ + printf("rank 2 round %d, TB1 contributes to throughput throug_tb1 %f \n", round, throug_tb1 ); +#endif + } else if (((TB1_active==1) && (decoded_tb[1]==0)) || (TB1_active==0)){ + throug_tb1=0; + } + throug_tb1_acc[round]+=throug_tb1; + } + + if (rank_indc[0] == 1 || (rank_indc[0] == 0 && rank_adapt==0)) { + if (ret[0] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations && + ret[1] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations){ + resend_both[round]++; + round++; + resend_cw0_cw1=1; //resend both cws + resend_cw1=0; + TB0_active=1; + TB1_active=1; + } + else if (ret[1] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations && + ret[0] <= UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations){ + resend_one[round]++; + resend_cw0_cw1=0; + TB0_active=0; + TB1_active=1; + if (rx_type == rx_IC_dual_stream) + TB0_deact[round]++; + if(is_first_time) { + hold_rank1_precoder = 0; + is_first_time = false; + } + else + hold_rank1_precoder = 1; + +#ifdef DEBUG_HARQ + printf("[DLSIM] ret[TB0] =%d, ret[TB1] =%d, trial %d \n", ret[0], ret[1], trials); + printf("[DLSIM] TB0 deactivated\n"); +#endif + round++; + } + else if (ret[0] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations && + ret[1] <= UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations){ + resend_one[round]++; + resend_cw0_cw1=0; + TB0_active=1; + TB1_active=0; + if (rx_type == rx_IC_dual_stream) + TB1_deact[round]++; + if(is_first_time) { + hold_rank1_precoder = 0; + is_first_time = false; + } + else + hold_rank1_precoder = 1; + + #ifdef DEBUG_HARQ + printf("[DLSIM] ret[TB0] =%d, ret[TB1] =%d, trial %d \n", ret[0], ret[1], trials); + printf("[DLSIM] TB1 deactivated\n"); + #endif + round++; + } + } else if (rank_indc[0] == 0 && rank_adapt == 1){ +#ifdef DEBUG_HARQ + printf("I am in case rank_indc[0] == 0 && rank_adapt == 1, decoded_tb[0] = %d\n", decoded_tb[0]); +#endif + if (ret[0] > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations){ + resend_one[round]++; + round++; + resend_cw0_cw1=0; //resend both cws + resend_cw1=0; + TB0_active=1; + TB1_active=0; + } + } + + } + + +#ifdef DEBUG_HARQ + printf("[DLSIM] Now round is %d, trial %d\n" , round, trials); +#endif + + } + + if(transmission_mode != 3 && transmission_mode !=4 ){ + if ((errs[0][0]>=n_frames/10) && (trials>(n_frames/2)) ) + break; + } + + //len = chbch_stats_read(stats_buffer,NULL,0,4096); + //printf("%s\n\n",stats_buffer); + + if (UE->proc.proc_rxtx[0].frame_rx % 10 == 0) { + UE->bitrate[eNB_id] = (UE->total_TBS[eNB_id] - UE->total_TBS_last[eNB_id])*10; + LOG_D(PHY,"[UE %d] Calculating bitrate: total_TBS = %d, total_TBS_last = %d, bitrate = %d kbits/s\n",UE->Mod_id,UE->total_TBS[eNB_id],UE->total_TBS_last[eNB_id],UE->bitrate[eNB_id]/1000); + UE->total_TBS_last[eNB_id] = UE->total_TBS[eNB_id]; + } + + + UE->proc.proc_rxtx[0].frame_rx++; + + /* calculate the total processing time for each packet, + * get the max, min, and number of packets that exceed t>2000us + */ + double t_tx = (double)eNB->phy_proc_tx.p_time/cpu_freq_GHz/1000.0; + double t_tx_ifft = (double)eNB->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_mod = (double)eNB->dlsch_modulation_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; + + + double t_rx = (double)UE->phy_proc_rx[UE->current_thread_id[subframe]].p_time/cpu_freq_GHz/1000.0; + double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_dec = (double)UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].p_time/cpu_freq_GHz/1000.0; + + + if (t_tx > t_tx_max) + t_tx_max = t_tx; + if (t_tx < t_tx_min) + t_tx_min = t_tx; + if (t_rx > t_rx_max) + t_rx_max = t_rx; + if (t_rx < t_rx_min) + t_rx_min = t_rx; + if (t_tx > 2000) + n_tx_dropped++; + if (t_rx > 2000) + n_rx_dropped++; + + + push_front(&time_vector_tx, t_tx); + push_front(&time_vector_tx_ifft, t_tx_ifft); + push_front(&time_vector_tx_mod, t_tx_mod); + push_front(&time_vector_tx_enc, t_tx_enc); + + push_front(&time_vector_rx, t_rx); + push_front(&time_vector_rx_fft, t_rx_fft); + push_front(&time_vector_rx_demod, t_rx_demod); + push_front(&time_vector_rx_dec, t_rx_dec); + + } //trials + + +#ifdef DEBUG_HARQ + printf("\n both failed round 0 = %d, both failed round 1 = %d, both failed round 2 = %d, both failed round 3 = %d\n", resend_both[0], resend_both[1], resend_both[2], resend_both[3]); + printf(" only one failed round 0 = %d, only one failed round 1 = %d, only one failed round 2 = %d, only one failed round 3 = %d\n", resend_one[0], resend_one[1], resend_one[2], resend_one[3]); + if (rx_type == rx_SIC_dual_stream){ + printf(" sic attempt round 0 = %d, sic attempt round 1 = %d, sic attempt round 2 = %d, sic attempt round 3 = %d\n", sic_attempt[0], sic_attempt[1], sic_attempt[2], sic_attempt[3]); + printf(" decoded in sic round 0 = %d, decoded in sic round 1 = %d, decoded in sic round 2 = %d, decoded in sic round 3 = %d\n", decoded_in_sic[0], decoded_in_sic[1], decoded_in_sic[2], decoded_in_sic[3]); + } + else if (rx_type == rx_IC_dual_stream){ + printf(" TB0 deactiv round 0 = %d, TB0 deactiv round 1 = %d, TB0 deactiv round 2 = %d, TB0 deactiv round 3 = %d\n", TB0_deact[0], TB0_deact[1], TB0_deact[2], TB0_deact[3]); + printf(" TB1 deactiv round 0 = %d, TB1 deactiv round 1 = %d, TB1 deactiv round 2 = %d, TB1 deactiv round 3 = %d\n", TB1_deact[0], TB1_deact[1], TB1_deact[2], TB1_deact[3]); + } +#endif + // round_trials[0]: number of code word : goodput the protocol + double table_tx[time_vector_tx.size]; + totable(table_tx, &time_vector_tx); + double table_tx_ifft[time_vector_tx_ifft.size]; + totable(table_tx_ifft, &time_vector_tx_ifft); + double table_tx_mod[time_vector_tx_mod.size]; + totable(table_tx_mod, &time_vector_tx_mod); + double table_tx_enc[time_vector_tx_enc.size]; + totable(table_tx_enc, &time_vector_tx_enc); + + double table_rx[time_vector_rx.size]; + totable(table_rx, &time_vector_rx); + double table_rx_fft[time_vector_rx_fft.size]; + totable(table_rx_fft, &time_vector_rx_fft); + double table_rx_demod[time_vector_rx_demod.size]; + totable(table_rx_demod, &time_vector_rx_demod); + double table_rx_dec[time_vector_rx_dec.size]; + totable(table_rx_dec, &time_vector_rx_dec); + + + // sort table + qsort (table_tx, time_vector_tx.size, sizeof(double), &compare); + qsort (table_rx, time_vector_rx.size, sizeof(double), &compare); + + if (dump_table == 1 ) { + set_component_filelog(USIM); // file located in /tmp/usim.txt + int n; + LOG_F(USIM,"The transmitter raw data: \n"); + + for (n=0; n< time_vector_tx.size; n++) { + printf("%f ", table_tx[n]); + LOG_F(USIM,"%f ", table_tx[n]); + } + + LOG_F(USIM,"\n"); + LOG_F(USIM,"The receiver raw data: \n"); + + for (n=0; n< time_vector_rx.size; n++) { + // printf("%f ", table_rx[n]); + LOG_F(USIM,"%f ", table_rx[n]); + } + + LOG_F(USIM,"\n"); + } + + double tx_median = table_tx[time_vector_tx.size/2]; + double tx_q1 = table_tx[time_vector_tx.size/4]; + double tx_q3 = table_tx[3*time_vector_tx.size/4]; + + double tx_ifft_median = table_tx_ifft[time_vector_tx_ifft.size/2]; + double tx_ifft_q1 = table_tx_ifft[time_vector_tx_ifft.size/4]; + double tx_ifft_q3 = table_tx_ifft[3*time_vector_tx_ifft.size/4]; + + double tx_mod_median = table_tx_mod[time_vector_tx_mod.size/2]; + double tx_mod_q1 = table_tx_mod[time_vector_tx_mod.size/4]; + double tx_mod_q3 = table_tx_mod[3*time_vector_tx_mod.size/4]; + + double tx_enc_median = table_tx_enc[time_vector_tx_enc.size/2]; + double tx_enc_q1 = table_tx_enc[time_vector_tx_enc.size/4]; + double tx_enc_q3 = table_tx_enc[3*time_vector_tx_enc.size/4]; + + double rx_median = table_rx[time_vector_rx.size/2]; + double rx_q1 = table_rx[time_vector_rx.size/4]; + double rx_q3 = table_rx[3*time_vector_rx.size/4]; + + double rx_fft_median = table_rx_fft[time_vector_rx_fft.size/2]; + double rx_fft_q1 = table_rx_fft[time_vector_rx_fft.size/4]; + double rx_fft_q3 = table_rx_fft[3*time_vector_rx_fft.size/4]; + + double rx_demod_median = table_rx_demod[time_vector_rx_demod.size/2]; + double rx_demod_q1 = table_rx_demod[time_vector_rx_demod.size/4]; + double rx_demod_q3 = table_rx_demod[3*time_vector_rx_demod.size/4]; + + double rx_dec_median = table_rx_dec[time_vector_rx_dec.size/2]; + double rx_dec_q1 = table_rx_dec[time_vector_rx_dec.size/4]; + double rx_dec_q3 = table_rx_dec[3*time_vector_rx_dec.size/4]; + + double std_phy_proc_tx=0; + double std_phy_proc_tx_ifft=0; + double std_phy_proc_tx_mod=0; + double std_phy_proc_tx_enc=0; + + double std_phy_proc_rx=0; + double std_phy_proc_rx_fft=0; + double std_phy_proc_rx_demod=0; + double std_phy_proc_rx_dec=0; + + + if (transmission_mode != 3 && transmission_mode !=4) { + effective_rate = ((double)(round_trials[0][0]-dci_errors)/((double)round_trials[0][0] + round_trials[0][1] + round_trials[0][2] + round_trials[0][3])); + } + else { + effective_rate = ((double)(round_trials[0][0]-dci_errors)/((double)round_trials[0][0] + round_trials[0][1] + round_trials[0][2] + round_trials[0][3]))+ + ((double)(round_trials[1][0])/((double)round_trials[1][0] + round_trials[1][1] + round_trials[1][2] + round_trials[1][3])); + } + + /* + Here we compute throughput per cw based on the formula + T=P_suc[r1]R(mcs) + sum[r=2 ..r=4] (P_(suc r, fail r-1)*R/r). + The non-constr formula should not be used, when there are some errors on the last round, + meaning when not all the packages are finally decoded. + */ + + if (transmission_mode == 3 || transmission_mode == 4) { + + throug_tb0_acc_aver[0]=throug_tb0_acc[0]/(double)round_trials[1][0];//active_tb0_sent[0]; + + throug_tb0_acc_aver[1]=throug_tb0_acc[1]/(double)round_trials[1][0];//active_tb0_sent[1]; + + throug_tb0_acc_aver[2]=throug_tb0_acc[2]/(double)round_trials[1][0];//active_tb0_sent[2]; + + throug_tb0_acc_aver[3]=throug_tb0_acc[3]/(double)round_trials[1][0];//active_tb0_sent[3]; + + throug_tb1_acc_aver[0]=throug_tb1_acc[0]/(double)round_trials[1][0];//active_tb1_sent[0]; + + throug_tb1_acc_aver[1]=throug_tb1_acc[1]/(double)round_trials[1][0];//active_tb1_sent[1]; + + throug_tb1_acc_aver[2]=throug_tb1_acc[2]/(double)round_trials[1][0];//active_tb1_sent[2]; + + throug_tb1_acc_aver[3]=throug_tb1_acc[3]/(double)round_trials[1][0];//active_tb1_sent[3]; + + throug_tot_acc_aver[0]= throug_tb0_acc_aver[0]+throug_tb1_acc_aver[0]; + throug_tot_acc_aver[1]= throug_tb0_acc_aver[1]+throug_tb1_acc_aver[1]; + throug_tot_acc_aver[2]= throug_tb0_acc_aver[2]+throug_tb1_acc_aver[2]; + throug_tot_acc_aver[3]= throug_tb0_acc_aver[3]+throug_tb1_acc_aver[3]; + throug_tot_acc_aver_all_rounds= throug_tot_acc_aver[0]+throug_tot_acc_aver[1]+throug_tot_acc_aver[2]+throug_tot_acc_aver[3]; + + + + // FOR CW0 + thr_cw0[0] = rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs)*(1-((double)errs[0][0]/(double)round_trials[0][0])); + if (num_rounds > 1) + thr_cw0[1] = (rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs)/2)*(((double)errs[0][0] - (double)errs[0][1])/(double)round_trials[0][0]); + else + thr_cw0[1]=0; + if (num_rounds > 2) + thr_cw0[2] = (rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs)/3)*(((double)errs[0][1] - (double)errs[0][2])/(double)round_trials[0][0]); + else + thr_cw0[2]=0; + if (num_rounds > 3) + thr_cw0[3] = (rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs)/4)*(((double)errs[0][2] - (double)errs[0][3])/(double)round_trials[0][0]); + else + thr_cw0[3]=0; + thr_cw0_tot = (double)thr_cw0[0]+(double)thr_cw0[1]+(double)thr_cw0[2]+(double)thr_cw0[3]; +#ifdef PRINT_THROUGHPUT + printf("rate %f \n", rate0_init); + printf("rate*mod_order %f \n", rate0_init*get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs)); + printf("Throughput cw0 sum = %f \n", thr_cw0_tot); + printf("Throughput cw0 round 0 = %f \n", thr_cw0[0]); + printf("Throughput cw0 round 1 = %f \n", thr_cw0[1]); + printf("Throughput cw0 round 2 = %f \n", thr_cw0[2]); + printf("Throughput cw0 round 3 = %f \n", thr_cw0[3]); + printf("Accumulated throughput TB0 round 0 = %f \n", throug_tb0_acc_aver[0]); + printf("Accumulated throughput TB0 round 1 = %f \n", throug_tb0_acc_aver[1]); + printf("Accumulated throughput TB0 round 2 = %f \n", throug_tb0_acc_aver[2]); + printf("Accumulated throughput TB0 round 3 = %f \n", throug_tb0_acc_aver[3]); + printf("Accumulated throughput TB1 round 0 = %f \n", throug_tb1_acc_aver[0]); + printf("Accumulated throughput TB1 round 1 = %f \n", throug_tb1_acc_aver[1]); + printf("Accumulated throughput TB1 round 2 = %f \n", throug_tb1_acc_aver[2]); + printf("Accumulated throughput TB1 round 3 = %f \n", throug_tb1_acc_aver[3]); + printf("round_trials = %d, errs[0][0] = %d, round_trials[0][1] = %d, errs[0][1] = %d, round_trials[0][2] = %d, errs[0][2] = %d, \ + round_trials[0][3] = %d, errs[0][3] = %d \n", round_trials[0][0], errs[0][0],round_trials[0][1], errs[0][1], round_trials[0][2], \ + errs[0][2], round_trials[0][3], errs[0][3]); +#endif + + + thr_cw1[0] = rate1_init*get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)*(1-((double)errs[1][0]/(double)round_trials[1][0])); + if (num_rounds > 1) + thr_cw1[1] = (rate1_init*get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)/2)*(((double)errs[1][0] - (double)errs[1][1])/(double)round_trials[1][0]); + else + thr_cw1[1] = 0; + if (num_rounds > 2) + thr_cw1[2] = (rate1_init*get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)/3)*(((double)errs[1][1] - (double)errs[1][2])/(double)round_trials[1][0]); + else + thr_cw1[2] = 0; + if (num_rounds > 3) + thr_cw1[3] = (rate1_init*get_Qm(eNB->dlsch[0][1]->harq_processes[0]->mcs)/4)*(((double)errs[1][2] - (double)errs[1][3])/(double)round_trials[1][0]); + else + thr_cw1[3]=0; + thr_cw1_tot = (double)thr_cw1[0]+(double)thr_cw1[1]+(double)thr_cw1[2]+(double)thr_cw1[3]; +#ifdef PRINT_THROUGHPUT + printf("Throughput cw1 sum = %f \n", thr_cw1_tot); + printf("Throughput cw1 round 0 = %f \n", thr_cw1[0]); + printf("Throughput cw1 round 1 = %f \n", thr_cw1[1]); + printf("Throughput cw1 round 2 = %f \n", thr_cw1[2]); + printf("Throughput cw1 round 3 = %f \n", thr_cw1[3]); + printf("round_trials[1][0] = %d, errs[1][0] = %d, round_trials[1][1] = %d, errs[1][1] = %d, round_trials[1][2] = %d, errs[1][2] = %d, \ + round_trials[1][3] = %d, errs[1][3] = %d \n", round_trials[1][0], errs[1][0], round_trials[1][1], errs[1][1], round_trials[1][2], \ + errs[1][2], round_trials[1][3], errs[1][3]); +#endif + } + +#if 0 + thr_cw0_tm4_nonconst = rate[0]*get_Qm(PHY_vars_eNB->dlsch[0][0]->harq_processes[0]->mcs)* \ + ((double)(round_trials[0][0]-dci_errors)/((double)round_trials[0][0] + round_trials[0][1] + round_trials[0][2] + round_trials[0][3])); + printf("Throughput cw0 noncnstr = %f \n", thr_cw0_tm4_nonconst); +#endif + //FOR CW1 + /*thr_cw1[0] = rate[1]*get_Qm(PHY_vars_eNB->dlsch[0][1]->harq_processes[0]->mcs)*(1-((double)errs[0][0]/(double)round_trials[0][0])) \ + *(1-((double)errs[1][0]/(double)round_trials[1][0])); + printf("thr cw1 round 0 = %f\n", thr_cw1[0]); + thr_cw1[1]=(rate[1]*get_Qm(PHY_vars_eNB->dlsch[0][1]->harq_processes[0]->mcs)/2)*\ + (((double)errs[1][0]-(double)errs[1][1])*((double)round_trials[0][0] - (double)errs[0][1])/((double)round_trials[0][0]*(double)round_trials[1][0])); + printf("thr cw1 round 1 = %f\n", thr_cw1[1]); + thr_cw1[2] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch[0][0]->harq_processes[0]->mcs)/3)*\ + ((double)errs[1][1]-(double)errs[1][2])*((double)round_trials[0][0]-(double)errs[0][2])/((double)round_trials[0][0]*(double)round_trials[1][0]); + printf("thr cw1 round 2 = %f\n", thr_cw1[2]); + thr_cw1[3] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch[0][0]->harq_processes[0]->mcs)/4)*\ + ((double)errs[1][2]-(double)errs[1][3])*((double)round_trials[0][0] - (double)errs[0][3])/((double)round_trials[0][0]*(double)round_trials[1][0]); + resid_errs= + printf("thr cw1 round 3 = %f\n", thr_cw1[3]); + thr_cw1_tot =thr_cw1[0]+thr_cw1[1]+thr_cw1[2]+thr_cw1[3]; + printf("Throughput cw1 sum = %f \n", thr_cw1_tot); + printf("round_trials = %d, errs[1][0] = %d, round_trials[1][1] = %d, errs[1][1] = %d, round_trials[1][2] = %d, errs[1][2] = %d, \ + round_trials[1][3] = %d, errs[1][3] = %d \n", round_trials[1][0], errs[1][0],round_trials[1][1], errs[1][1], round_trials[1][2], \ + errs[1][2], round_trials[1][3], errs[1][3]); + }*/ + + + printf("\n**********************SNR = %f dB (tx_lev %f, sigma2_dB %f)**************************\n", + SNR, + (double)tx_lev_dB+10*log10(UE->frame_parms.ofdm_symbol_size/(NB_RB*12)), + sigma2_dB); + if ((transmission_mode != 3) && (transmission_mode != 4)){ + printf("Errors (%d(%d)/%d %d(%d)/%d %d(%d)/%d %d(%d)/%d), Pe = (%e(%e),%e(%e),%e(%e),%e(%e))," + "dci_errors %d/%d, Pe = %e => effective rate %f (%2.1f%%,%f, %f), normalized delay %f (%f), " + "throughput stream 0 = %f , throughput stream 1 = %f, system throughput = %f , rate 0 = %f , rate 1 = %f \n", + errs[0][0], + errs[1][0], + round_trials[0][0], + errs[0][1], + errs[1][1], + round_trials[0][0], + errs[0][2], + errs[1][2], + round_trials[0][0], + errs[0][3], + errs[1][3], + round_trials[0][0], + (double)errs[0][0]/(round_trials[0][0]), + (double)errs[1][0]/(round_trials[0][0]), + (double)errs[0][1]/(round_trials[0][0]), + (double)errs[1][1]/(round_trials[0][0]), + (double)errs[0][2]/(round_trials[0][0]), + (double)errs[1][2]/(round_trials[0][0]), + (double)errs[0][3]/(round_trials[0][0]), + (double)errs[1][3]/(round_trials[0][0]), + dci_errors, + round_trials[0][0], + (double)dci_errors/(round_trials[0][0]), + rate[0]*effective_rate, + 100*effective_rate, + rate[0], + rate[0]*get_Qm(UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->mcs), + (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+ + 4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])/(double)eNB->dlsch[0][0]->harq_processes[0]->TBS, + (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2]) + +4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0]), + thr_cw0_tot, + thr_cw1_tot, + thr_cw0_tot + thr_cw1_tot, + rate[0], + rate[1]); + }else if (((transmission_mode==3) || (transmission_mode==4)) && (rank_adapt==0)){ + printf("Errors (%d(%d)/%d %d(%d)/%d %d(%d)/%d %d(%d)/%d)," + "dci_errors %d/%d, thr TB0 = %f , thr TB1 = %f, overall thr = %f , rate 0 = %f , rate 1 = %f \n", + errs[0][0], + errs[1][0], + round_trials[0][0], + errs[0][1], + errs[1][1], + round_trials[0][0], + errs[0][2], + errs[1][2], + round_trials[0][0], + errs[0][3], + errs[1][3], + round_trials[0][0], + dci_errors, + round_trials[0][0], + thr_cw0_tot, + thr_cw1_tot, + thr_cw0_tot + thr_cw1_tot, + rate0_init, + rate1_init); + } else{ + printf("Errors: r0 TB0 %d/%d TB1 %d/%d, r1 TB0 %d/%d TB1 %d/%d, r2 TB0 %d/%d TB1 %d/%d, r3 TB0 %d/%d TB1 %d/%d," + "Through tot: TB0 = %f, TB1 = %f, overall thr = %f, clsm applied %d times\n", + failed_tb0[0], + active_tb0_sent[0], + failed_tb1[0], + active_tb1_sent[0], + failed_tb0[1], + active_tb0_sent[1], + failed_tb1[1], + active_tb1_sent[1], + failed_tb0[2], + active_tb0_sent[2], + failed_tb1[2], + active_tb1_sent[2], + failed_tb0[3], + active_tb0_sent[3], + failed_tb1[3], + active_tb1_sent[3], + throug_tb0_acc_aver[0]+throug_tb0_acc_aver[1]+throug_tb0_acc_aver[2]+throug_tb0_acc_aver[3], + throug_tb1_acc_aver[0]+throug_tb1_acc_aver[1]+throug_tb1_acc_aver[2]+throug_tb1_acc_aver[3], + throug_tot_acc_aver_all_rounds, + clsm_counter); + } + + if (print_perf==1) { + printf("eNB TX function statistics (per 1ms subframe)\n\n"); + std_phy_proc_tx = sqrt((double)eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->phy_proc_tx.trials - pow((double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2)); + printf("Total PHY proc tx :%f us (%d trials)\n",(double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_tx.trials); + printf("|__ Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, + n_tx_dropped); + std_phy_proc_tx_ifft = sqrt((double)eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->ofdm_mod_stats.trials - pow((double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2)); + printf("OFDM_mod time :%f us (%d trials)\n",(double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,eNB->ofdm_mod_stats.trials); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3); + std_phy_proc_tx_mod = sqrt((double)eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->dlsch_modulation_stats.trials - pow((double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH modulation time :%f us (%d trials)\n",(double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_modulation_stats.trials); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3); + printf("DLSCH scrambling time :%f us (%d trials)\n",(double)eNB->dlsch_scrambling_stats.diff/eNB->dlsch_scrambling_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_scrambling_stats.trials); + std_phy_proc_tx_enc = sqrt((double)eNB->dlsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->dlsch_encoding_stats.trials - pow((double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH encoding time :%f us (%d trials)\n",(double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_modulation_stats.trials); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3); + printf("|__ DLSCH turbo encoding time :%f us (%d trials)\n", + ((double)eNB->dlsch_turbo_encoding_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_turbo_encoding_stats.diff/eNB->dlsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_turbo_encoding_stats.trials); + printf("|__ DLSCH rate-matching time :%f us (%d trials)\n", + ((double)eNB->dlsch_rate_matching_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_rate_matching_stats.diff/eNB->dlsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_rate_matching_stats.trials); + printf("|__ DLSCH sub-block interleaving time :%f us (%d trials)\n", + ((double)eNB->dlsch_interleaving_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials); + + printf("\n\nUE RX function statistics (per 1ms subframe)\n\n"); + std_phy_proc_rx = sqrt((double)UE->phy_proc_rx[UE->current_thread_id[subframe]].diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->phy_proc_rx[UE->current_thread_id[subframe]].trials - pow((double)UE->phy_proc_rx[UE->current_thread_id[subframe]].diff/UE->phy_proc_rx[UE->current_thread_id[subframe]].trials/cpu_freq_GHz/1000,2)); + printf("Total PHY proc rx :%f us (%d trials)\n",(double)UE->phy_proc_rx[UE->current_thread_id[subframe]].diff/UE->phy_proc_rx[UE->current_thread_id[subframe]].trials/cpu_freq_GHz/1000.0, + UE->phy_proc_rx[UE->current_thread_id[subframe]].trials*2/3); + printf("|__Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, + rx_q1, rx_q3, n_rx_dropped); + std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->ofdm_demod_stats.trials - pow((double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH OFDM demodulation and channel_estimation time :%f us (%d trials)\n",(nsymb)*(double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0, + UE->ofdm_demod_stats.trials*2/3); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3); + printf("|__ DLSCH rx dft :%f us (%d trials)\n", + (nsymb*UE->frame_parms.nb_antennas_rx)*(double)UE->rx_dft_stats.diff/UE->rx_dft_stats.trials/cpu_freq_GHz/1000.0,UE->rx_dft_stats.trials*2/3); + printf("|__ DLSCH channel estimation time :%f us (%d trials)\n", + (4.0)*(double)UE->dlsch_channel_estimation_stats.diff/UE->dlsch_channel_estimation_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_channel_estimation_stats.trials*2/3); + printf("|__ DLSCH frequency offset estimation time :%f us (%d trials)\n", + (4.0)*(double)UE->dlsch_freq_offset_estimation_stats.diff/UE->dlsch_freq_offset_estimation_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_freq_offset_estimation_stats.trials*2/3); + printf("DLSCH rx pdcch :%f us (%d trials)\n",(double)UE->dlsch_rx_pdcch_stats.diff/UE->dlsch_rx_pdcch_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_rx_pdcch_stats.trials); + std_phy_proc_rx_demod = sqrt((double)UE->dlsch_llr_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->dlsch_llr_stats.trials - pow((double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH Channel Compensation and LLR generation time :%f us (%d trials)\n",(3)*(double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_llr_stats.trials/3); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_demod, rx_demod_median, rx_demod_q1, rx_demod_q3); + printf("DLSCH unscrambling time :%f us (%d trials)\n",(double)UE->dlsch_unscrambling_stats.diff/UE->dlsch_unscrambling_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_unscrambling_stats.trials); + std_phy_proc_rx_dec = sqrt((double)UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials - pow((double)UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].diff/UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials/cpu_freq_GHz/1000,2)); + printf("DLSCH Decoding time (%02.2f Mbit/s, avg iter %1.2f) :%f us (%d trials, max %f)\n", + eNB->dlsch[0][0]->harq_processes[0]->TBS/1000.0,(double)avg_iter[0]/iter_trials[0], + (double)UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].diff/UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials/cpu_freq_GHz/1000.0,UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials, + (double)UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].max/cpu_freq_GHz/1000.0); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3); + printf("|__ DLSCH Rate Unmatching :%f us (%d trials)\n", + (double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials); + printf("|__ DLSCH Turbo Decoding(%d bits) :%f us (%d trials)\n", + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Cminus ? UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kminus : UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kplus, + (double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials); + printf(" |__ init %f us (cycles/iter %f, %d trials)\n", + (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/((double)avg_iter[0]/iter_trials[0]), + UE->dlsch_tc_init_stats.trials); + printf(" |__ alpha %f us (cycles/iter %f, %d trials)\n", + (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials*2, + UE->dlsch_tc_alpha_stats.trials); + printf(" |__ beta %f us (cycles/iter %f,%d trials)\n", + (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials*2, + UE->dlsch_tc_beta_stats.trials); + printf(" |__ gamma %f us (cycles/iter %f,%d trials)\n", + (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials*2, + UE->dlsch_tc_gamma_stats.trials); + printf(" |__ ext %f us (cycles/iter %f,%d trials)\n", + (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials*2, + UE->dlsch_tc_ext_stats.trials); + printf(" |__ intl1 %f us (cycles/iter %f,%d trials)\n", + (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials, + UE->dlsch_tc_intl1_stats.trials); + printf(" |__ intl2+HD+CRC %f us (cycles/iter %f,%d trials)\n", + (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials, + UE->dlsch_tc_intl2_stats.trials); + } + + if ((transmission_mode != 3) && (transmission_mode != 4)) { + fprintf(bler_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d\n", + SNR, + mcs1, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + rate[0], + errs[0][0], + round_trials[0][0], + errs[0][1], + round_trials[0][1], + errs[0][2], + round_trials[0][2], + errs[0][3], + round_trials[0][3]); + } else if(rx_type== rx_SIC_dual_stream){ + fprintf(bler_fd,"%f;%d;%d;%d;%d;%d;%d;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f\n", + SNR, + rank_adapt, + clsm_counter, + mcs1, + mcs2, + tbs0_init, + tbs1_init, + rate0_init, + rate1_init, + failed_tb0[0], + failed_tb1[0], + active_tb0_sent[0], + active_tb1_sent[0], + sic_attempt[0], + decoded_in_sic[0], + resend_both[0], + resend_one[0], + failed_tb0[1], + failed_tb1[1], + active_tb0_sent[1], + active_tb1_sent[1], + sic_attempt[1], + decoded_in_sic[1], + resend_both[1], + resend_one[1], + failed_tb0[2], + failed_tb1[2], + active_tb0_sent[2], + active_tb1_sent[2], + sic_attempt[2], + decoded_in_sic[2], + resend_both[2], + resend_one[2], + failed_tb0[3], + failed_tb1[3], + active_tb0_sent[3], + active_tb1_sent[3], + sic_attempt[3], + decoded_in_sic[3], + throug_tb0_acc_aver[0], + throug_tb1_acc_aver[0], + throug_tb0_acc_aver[0]+throug_tb1_acc_aver[0], + throug_tb0_acc_aver[1], + throug_tb1_acc_aver[1], + throug_tb0_acc_aver[1]+throug_tb1_acc_aver[1], + throug_tb0_acc_aver[2], + throug_tb1_acc_aver[2], + throug_tb0_acc_aver[2]+throug_tb1_acc_aver[2], + throug_tb0_acc_aver[3], + throug_tb1_acc_aver[3], + throug_tb0_acc_aver[3]+throug_tb1_acc_aver[3], + throug_tot_acc_aver_all_rounds); + } else if ((rx_type!= rx_SIC_dual_stream)){ + fprintf(bler_fd,"%f;%d;%d;%d;%d;%d;%d;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f\n", + SNR, + rank_adapt, + clsm_counter, + mcs1, + mcs2, + tbs0_init, + tbs1_init, + rate0_init, + rate1_init, + failed_tb0[0], + failed_tb1[0], + active_tb0_sent[0], + active_tb1_sent[0], + TB0_deact[0], + TB1_deact[0], + resend_both[0], + resend_one[0], + failed_tb0[1], + failed_tb1[1], + active_tb0_sent[1], + active_tb1_sent[1], + TB0_deact[1], + TB1_deact[1], + resend_both[1], + resend_one[1], + failed_tb0[2], + failed_tb1[2], + active_tb0_sent[2], + active_tb1_sent[2], + TB0_deact[2], + TB1_deact[2], + resend_both[2], + resend_one[2], + failed_tb0[3], + failed_tb1[3], + active_tb0_sent[3], + active_tb1_sent[3], + throug_tb0_acc_aver[0], + throug_tb1_acc_aver[0], + throug_tb0_acc_aver[0]+throug_tb1_acc_aver[0], + throug_tb0_acc_aver[1], + throug_tb1_acc_aver[1], + throug_tb0_acc_aver[1]+throug_tb1_acc_aver[1], + throug_tb0_acc_aver[2], + throug_tb1_acc_aver[2], + throug_tb0_acc_aver[2]+throug_tb1_acc_aver[2], + throug_tb0_acc_aver[3], + throug_tb1_acc_aver[3], + throug_tb0_acc_aver[3]+throug_tb1_acc_aver[3], + throug_tot_acc_aver_all_rounds); + + } + + if (transmission_mode==3 || transmission_mode==4){ + if (rx_type== rx_SIC_dual_stream){ + fprintf(rankadapt_fd,"%f;%d;%d;%d;%d;%d;%d;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f\n", + SNR, + rank_adapt, + clsm_counter, + mcs1, + mcs2, + tbs0_init, + tbs1_init, + rate0_init, + rate1_init, + failed_tb0[0], + failed_tb1[0], + active_tb0_sent[0], + active_tb1_sent[0], + sic_attempt[0], + decoded_in_sic[0], + resend_both[0], + resend_one[0], + failed_tb0[1], + failed_tb1[1], + active_tb0_sent[1], + active_tb1_sent[1], + sic_attempt[1], + decoded_in_sic[1], + resend_both[1], + resend_one[1], + failed_tb0[2], + failed_tb1[2], + active_tb0_sent[2], + active_tb1_sent[2], + sic_attempt[2], + decoded_in_sic[2], + resend_both[2], + resend_one[2], + failed_tb0[3], + failed_tb1[3], + active_tb0_sent[3], + active_tb1_sent[3], + sic_attempt[3], + decoded_in_sic[3], + throug_tb0_acc_aver[0], + throug_tb1_acc_aver[0], + throug_tb0_acc_aver[0]+throug_tb1_acc_aver[0], + throug_tb0_acc_aver[1], + throug_tb1_acc_aver[1], + throug_tb0_acc_aver[1]+throug_tb1_acc_aver[1], + throug_tb0_acc_aver[2], + throug_tb1_acc_aver[2], + throug_tb0_acc_aver[2]+throug_tb1_acc_aver[2], + throug_tb0_acc_aver[3], + throug_tb1_acc_aver[3], + throug_tb0_acc_aver[3]+throug_tb1_acc_aver[3], + throug_tot_acc_aver_all_rounds); + } + else{ + fprintf(rankadapt_fd,"%f;%d;%d;%d;%d;%d;%d;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f\n", + SNR, + rank_adapt, + clsm_counter, + mcs1, + mcs2, + tbs0_init, + tbs1_init, + rate0_init, + rate1_init, + failed_tb0[0], + failed_tb1[0], + active_tb0_sent[0], + active_tb1_sent[0], + TB0_deact[0], + TB1_deact[0], + resend_both[0], + resend_one[0], + failed_tb0[1], + failed_tb1[1], + active_tb0_sent[1], + active_tb1_sent[1], + TB0_deact[1], + TB1_deact[1], + resend_both[1], + resend_one[1], + failed_tb0[2], + failed_tb1[2], + active_tb0_sent[2], + active_tb1_sent[2], + TB0_deact[2], + TB1_deact[2], + resend_both[2], + resend_one[2], + failed_tb0[3], + failed_tb1[3], + active_tb0_sent[3], + active_tb1_sent[3], + throug_tb0_acc_aver[0], + throug_tb1_acc_aver[0], + throug_tb0_acc_aver[0]+throug_tb1_acc_aver[0], + throug_tb0_acc_aver[1], + throug_tb1_acc_aver[1], + throug_tb0_acc_aver[1]+throug_tb1_acc_aver[1], + throug_tb0_acc_aver[2], + throug_tb1_acc_aver[2], + throug_tb0_acc_aver[2]+throug_tb1_acc_aver[2], + throug_tb0_acc_aver[3], + throug_tb1_acc_aver[3], + throug_tb0_acc_aver[3]+throug_tb1_acc_aver[3], + throug_tot_acc_aver_all_rounds); + } + } + + + if(abstx){ //ABSTRACTION + if ((transmission_mode != 3)&& (transmission_mode != 4)) { + + blerr[0][0] = (double)errs[0][0]/(round_trials[0][0]); + + if(num_rounds>1){ + blerr[0][1] = (double)errs[0][1]/(round_trials[0][1]); + + blerr[0][2] = (double)errs[0][2]/(round_trials[0][2]); + + blerr[0][3] = (double)errs[0][3]/(round_trials[0][3]); + + fprintf(csv_fd,"%e;%e;%e;%e;\n",blerr[0][0],blerr[0][1],blerr[0][2],blerr[0][3]); + } + else { + fprintf(csv_fd,"%e;\n",blerr[0][0]); + } + } + else { + blerr[0][0] = (double)errs[0][0]/(round_trials[0][0]); + blerr[1][0] = (double)errs[1][0]/(round_trials[0][0]); + if(num_rounds>1){ + blerr[0][1] = (double)errs[0][1]/(round_trials[0][1]); + blerr[1][1] = (double)errs[1][1]/(round_trials[1][1]); + blerr[0][2] = (double)errs[0][2]/(round_trials[0][2]); + blerr[1][2] = (double)errs[1][2]/(round_trials[1][2]); + blerr[0][3] = (double)errs[0][3]/(round_trials[0][3]); + blerr[1][3] = (double)errs[1][3]/(round_trials[1][3]); + + fprintf(csv_fd,"%e;%e;%e;%e;%e;%e;%e;%e;\n",blerr[0][0],blerr[1][0],blerr[0][1],blerr[1][1],blerr[0][2],blerr[1][2], blerr[0][3], blerr[1][3]); + } + else { + fprintf(csv_fd,"%e,%e;\n",blerr[0][0], blerr[1][0]); + } + } + } + + if ( (test_perf != 0) && (100 * effective_rate > test_perf )) { + //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err\n"); + if ((transmission_mode != 3) && (transmission_mode != 4)) { + fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;", + SNR, + mcs1, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + rate[0], + errs[0][0], + round_trials[0][0], + errs[0][1], + round_trials[0][1], + errs[0][2], + round_trials[0][2], + errs[0][3], + round_trials[0][3], + dci_errors); + + //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n"); + fprintf(time_meas_fd,"%f;%d;%d;%f; %2.1f%%;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;", + SNR, + mcs1, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + rate[0]*effective_rate, + 100*effective_rate, + rate[0], + (double)avg_iter[0]/iter_trials[0], + errs[0][0], + round_trials[0], + errs[0][1], + round_trials[1], + errs[0][2], + round_trials[2], + errs[0][3], + round_trials[3], + (double)errs[0][0]/(round_trials[0][0]), + (double)errs[0][1]/(round_trials[0][0]), + (double)errs[0][2]/(round_trials[0][0]), + (double)errs[0][3]/(round_trials[0][0]), + dci_errors, + round_trials[0], + (double)dci_errors/(round_trials[0][0]), + (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])/(double)eNB->dlsch[0][0]->harq_processes[0]->TBS, + (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])); + } + else { + fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;", + SNR, + mcs1,mcs2, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][1]->harq_processes[0]->TBS, + rate[0], + errs[0][0], + round_trials[0][0], + errs[0][1], + round_trials[0][1], + errs[0][2], + round_trials[0][2], + errs[0][3], + round_trials[0][3], + dci_errors); + + //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n"); + fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%2.1f;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;", + SNR, + mcs1,mcs2, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][1]->harq_processes[0]->TBS, + rate[0]*effective_rate, + 100*effective_rate, + rate[0], + (double)avg_iter[0]/iter_trials[0], + errs[0][0], + round_trials[0][0], + errs[0][1], + round_trials[0][1], + errs[0][2], + round_trials[0][2], + errs[0][3], + round_trials[3], + (double)errs[0][0]/(round_trials[0][0]), + (double)errs[0][1]/(round_trials[0][0]), + (double)errs[0][2]/(round_trials[0][0]), + (double)errs[0][3]/(round_trials[0][0]), + dci_errors, + round_trials[0][0], + (double)dci_errors/(round_trials[0][0]), + (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])/(double)eNB->dlsch[0][0]->harq_processes[0]->TBS, + (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])+4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])); + } + //fprintf(time_meas_fd,"eNB_PROC_TX(%d); OFDM_MOD(%d); DL_MOD(%d); DL_SCR(%d); DL_ENC(%d); UE_PROC_RX(%d); OFDM_DEMOD_CH_EST(%d); RX_PDCCH(%d); CH_COMP_LLR(%d); DL_USCR(%d); DL_DECOD(%d);\n", + fprintf(time_meas_fd,"%d; %d; %d; %d; %d; %d; %d; %d; %d; %d; %d;", + eNB->phy_proc_tx.trials, + eNB->ofdm_mod_stats.trials, + eNB->dlsch_modulation_stats.trials, + eNB->dlsch_scrambling_stats.trials, + eNB->dlsch_encoding_stats.trials, + UE->phy_proc_rx[UE->current_thread_id[subframe]].trials, + UE->ofdm_demod_stats.trials, + UE->dlsch_rx_pdcch_stats.trials, + UE->dlsch_llr_stats.trials, + UE->dlsch_unscrambling_stats.trials, + UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials + ); + fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;", + get_time_meas_us(&eNB->phy_proc_tx), + get_time_meas_us(&eNB->ofdm_mod_stats), + get_time_meas_us(&eNB->dlsch_modulation_stats), + get_time_meas_us(&eNB->dlsch_scrambling_stats), + get_time_meas_us(&eNB->dlsch_encoding_stats), + get_time_meas_us(&UE->phy_proc_rx[UE->current_thread_id[subframe]]), + nsymb*get_time_meas_us(&UE->ofdm_demod_stats), + get_time_meas_us(&UE->dlsch_rx_pdcch_stats), + 3*get_time_meas_us(&UE->dlsch_llr_stats), + get_time_meas_us(&UE->dlsch_unscrambling_stats), + get_time_meas_us(&UE->dlsch_decoding_stats[UE->current_thread_id[subframe]]) + ); + //fprintf(time_meas_fd,"eNB_PROC_TX_STD;eNB_PROC_TX_MAX;eNB_PROC_TX_MIN;eNB_PROC_TX_MED;eNB_PROC_TX_Q1;eNB_PROC_TX_Q3;eNB_PROC_TX_DROPPED;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;", std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, n_tx_dropped); + + //fprintf(time_meas_fd,"IFFT;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3); + + //fprintf(time_meas_fd,"MOD;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3); + + //fprintf(time_meas_fd,"ENC;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3); + + + //fprintf(time_meas_fd,"UE_PROC_RX_STD;UE_PROC_RX_MAX;UE_PROC_RX_MIN;UE_PROC_RX_MED;UE_PROC_RX_Q1;UE_PROC_RX_Q3;UE_PROC_RX_DROPPED;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, rx_q1, rx_q3, n_rx_dropped); + + //fprintf(time_meas_fd,"FFT;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3); + + //fprintf(time_meas_fd,"DEMOD;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_rx_demod,rx_demod_median, rx_demod_q1, rx_demod_q3); + + //fprintf(time_meas_fd,"DEC;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f\n", std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3); + + + /* + fprintf(time_meas_fd,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;", + eNB->phy_proc_tx.trials, + eNB->ofdm_mod_stats.trials, + eNB->dlsch_modulation_stats.trials, + eNB->dlsch_scrambling_stats.trials, + eNB->dlsch_encoding_stats.trials, + UE->phy_proc_rx.trials, + UE->ofdm_demod_stats.trials, + UE->dlsch_rx_pdcch_stats.trials, + UE->dlsch_llr_stats.trials, + UE->dlsch_unscrambling_stats.trials, + UE->dlsch_decoding_stats[UE->current_thread_id[subframe]].trials); + */ + printf("[passed] effective rate : %f (%2.1f%%,%f)): log and break \n",rate[0]*effective_rate, 100*effective_rate, rate[0]); + break; + } else if (test_perf !=0 ){ + printf("[continue] effective rate : %f (%2.1f%%,%f)): increase snr \n",rate[0]*effective_rate, 100*effective_rate, rate[0]); + } + if (abstx == 1) { + if ((rx_type==rx_IC_dual_stream) || (rx_type==rx_SIC_dual_stream)) { + + if ((((double)errs[0][0]/(round_trials[0][0]))<1e-2) && (((double)errs[1][0]/(round_trials[1][0]))<1e-2)) + if ((((double)errs[0][0]/(round_trials[0][0]))<1e-2) && (((double)errs[1][0]/(round_trials[1][0]))<1e-2)) + break; + } + else{ + if (((double)errs[0][0]/(round_trials[0][0]))<1e-2) + break; + + } + } + else { + + if ((rx_type==rx_IC_dual_stream) || (rx_type==rx_SIC_dual_stream)) { + if ((((double)errs[0][0]/(round_trials[0][0]))<1e-3) && (((double)errs[1][0]/(round_trials[1][0]))<1e-3)) + break; + } + else{ + if (((double)errs[0][0]/(round_trials[0][0]))<1e-3) + break; + + } + + } + + if (n_frames==2) + break; + + }// SNR + + } //ch_realization + + fclose(bler_fd); + + if (test_perf !=0) + fclose (time_meas_fd); + + //fprintf(tikz_fd,"};\n"); + //fclose(tikz_fd); + + if (input_trch_file==1) + fclose(input_trch_fd); + + if (input_file==1) + fclose(input_fd); + + if(abstx) { // ABSTRACTION + fprintf(csv_fd,"];"); + fclose(csv_fd); + } + + if (uncoded_ber_bit) + free(uncoded_ber_bit); + + uncoded_ber_bit = NULL; + + for (k=0; kdlsch[0][i]); + printf("UE %d\n",i); + free_ue_dlsch(UE->dlsch[UE->current_thread_id[subframe]][0][i]); + } + + + printf("Freeing channel I/O\n"); + + for (i=0; i<2; i++) { + free(s_re[i]); + free(s_im[i]); + free(r_re[i]); + free(r_im[i]); + } + + free(s_re); + free(s_im); + free(r_re); + free(r_im); + + // lte_sync_time_free(); + + // printf("[MUMIMO] mcs %d, mcsi %d, offset %d, bler %f\n",mcs,mcs_i,offset_mumimo_llr_drange_fix,((double)errs[0])/((double)round_trials[0])); + + return(0); +} + + diff --git a/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c new file mode 100644 index 0000000000..3c4b3d0cd3 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/dlsim_tm7.c @@ -0,0 +1,4336 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file dlsim.c + \brief Top-level DL simulator + \author R. Knopp + \date 2011 - 2014 + \version 0.1 + \company Eurecom + \email: knopp@eurecom.fr + \note + \warning +*/ + +#include +#include +#include +#include +#include + +#include "SIMULATION/TOOLS/defs.h" +#include "PHY/types.h" +#include "PHY/defs.h" +#include "PHY/vars.h" + +#include "SCHED/defs.h" +#include "SCHED/vars.h" +#include "LAYER2/MAC/vars.h" + +#include "OCG_vars.h" +#include "UTIL/LOG/log.h" +#include "UTIL/LISTS/list.h" + +#include "unitary_defs.h" + +extern unsigned int dlsch_tbs25[27][25],TBStable[27][110]; +extern unsigned char offset_mumimo_llr_drange_fix; + +#include "PHY/TOOLS/lte_phy_scope.h" + +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; + +int otg_enabled=0; +/*the following parameters are used to control the processing times calculations*/ +double t_tx_max = -1000000000; /*!< \brief initial max process time for tx */ +double t_rx_max = -1000000000; /*!< \brief initial max process time for rx */ +double t_tx_min = 1000000000; /*!< \brief initial min process time for tx */ +double t_rx_min = 1000000000; /*!< \brief initial min process time for rx */ +int n_tx_dropped = 0; /*!< \brief initial max process time for tx */ +int n_rx_dropped = 0; /*!< \brief initial max process time for rx */ + +void handler(int sig) +{ + void *array[10]; + size_t size; + + // get void*'s for all entries on the stack + size = backtrace(array, 10); + + // print out all the frames to stderr + fprintf(stderr, "Error: signal %d:\n", sig); + backtrace_symbols_fd(array, size, 2); + exit(1); +} + + + +//DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_2A[2]; + +DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_1E[2]; +uint64_t DLSCH_alloc_pdu_1[2]; + +#define UL_RB_ALLOC 0x1ff; +#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2) +//#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 +//#define DLSCH_RB_ALLOC 0x0001 + +int main(int argc, char **argv) +{ + + int c; + int k,i,j,aa,aarx,aatx; + int re; + + int s,Kr,Kr_bytes; + + double sigma2, sigma2_dB=10,SNR,snr0=-2.0,snr1,rate; + double snr_step=1,input_snr_step=1, snr_int=30; + + LTE_DL_FRAME_PARMS *frame_parms; + double **s_re,**s_im,**r_re,**r_im; + double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel + double iqim=0.0; + + uint8_t extended_prefix_flag=0,transmission_mode=1,n_tx_port=1,n_tx_phy=1,n_rx=1; + uint16_t Nid_cell=0; + int32_t **cell_spec_bf_weights; + int32_t *ue_spec_bf_weights; + + int eNB_id = 0, eNB_id_i = 1; + unsigned char mcs1=0,mcs2=0,mcs_i=0,dual_stream_UE = 0,awgn_flag=0,round,dci_flag=0; + unsigned char i_mod = 2; + unsigned short NB_RB; + unsigned char Ns,l,m; + uint16_t tdd_config=3; + uint16_t n_rnti=0x1234; + int n_users = 1; + + SCM_t channel_model=Rayleigh1; + // unsigned char *input_data,*decoded_output; + + unsigned char *input_buffer0[2],*input_buffer1[2]; + unsigned short input_buffer_length0,input_buffer_length1; + unsigned int ret; + unsigned int coded_bits_per_codeword=0,nsymb,dci_cnt,tbs=0; + + unsigned int tx_lev=0,tx_lev_dB=0,trials,errs[4]= {0,0,0,0},errs2[4]= {0,0,0,0},round_trials[4]= {0,0,0,0},dci_errors=0,dlsch_active=0;//,num_layers; + int re_allocated; + char fname[32],vname[32]; + FILE *bler_fd; + char bler_fname[256]; + FILE *time_meas_fd; + char time_meas_fname[256]; + // FILE *tikz_fd; + // char tikz_fname[256]; + + FILE *input_trch_fd=NULL; + unsigned char input_trch_file=0; + FILE *input_fd=NULL; + unsigned char input_file=0; + // char input_val_str[50],input_val_str2[50]; + + char input_trch_val[16]; + double channelx,channely; + + unsigned char pbch_pdu[6]; + + DCI_ALLOC_t dci_alloc[8],dci_alloc_rx[8]; + int num_common_dci=0,num_ue_spec_dci=0,num_dci=0; + + // FILE *rx_frame_file; + + int n_frames; + int n_ch_rlz = 1; + channel_desc_t *eNB2UE[4]; + uint8_t num_pdcch_symbols=1,num_pdcch_symbols_2=0; + uint8_t pilot1,pilot2,pilot3; + uint8_t rx_sample_offset = 0; + //char stats_buffer[4096]; + //int len; + uint8_t num_rounds = 4;//,fix_rounds=0; + uint8_t subframe=7; + int u; + int n=0; + int abstx=0; + int iii; + FILE *csv_fd=NULL; + char csv_fname[512]; + int ch_realization; + int pmi_feedback=0; + int hold_channel=0; + + // void *data; + // int ii; + // int bler; + double blerr[4],uncoded_ber,avg_ber; + short *uncoded_ber_bit=NULL; + uint8_t N_RB_DL=25,osf=1; + frame_t frame_type = FDD; + int xforms=0; + FD_lte_phy_scope_ue *form_ue = NULL; + char title[255]; + uint32_t DLSCH_RB_ALLOC = 0x1fff; + int numCCE=0; + int dci_length_bytes=0,dci_length=0; + //double channel_bandwidth = 5.0, sampling_rate=7.68; + int common_flag=0,TPC=0; + + double cpu_freq_GHz; + // time_stats_t ts;//,sts,usts; + int avg_iter,iter_trials; + int rballocset=0; + int print_perf=0; + int test_perf=0; + int dump_table=0; + int llr8_flag=0; + + double effective_rate=0.0; + char channel_model_input[10]="I"; + + int TB0_active = 1; + uint32_t perfect_ce = 0; + + // LTE_DL_UE_HARQ_t *dlsch0_ue_harq; + // LTE_DL_eNB_HARQ_t *dlsch0_eNB_harq; + uint8_t Kmimo; + uint8_t ue_category=4; + uint32_t Nsoft; + + + + int CCE_table[800]; + + int threequarter_fs=0; + + opp_enabled=1; // to enable the time meas + +#if defined(__arm__) + FILE *proc_fd = NULL; + char buf[64]; + + proc_fd = fopen("/sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq", "r"); + if(!proc_fd) + printf("cannot open /sys/devices/system/cpu/cpu4/cpufreq/cpuinfo_cur_freq"); + else { + while(fgets(buf, 63, proc_fd)) + printf("%s", buf); + } + fclose(proc_fd); + cpu_freq_GHz = ((double)atof(buf))/1e6; +#else + cpu_freq_GHz = get_cpu_freq_GHz(); +#endif + printf("Detected cpu_freq %f GHz\n",cpu_freq_GHz); + + //signal(SIGSEGV, handler); + //signal(SIGABRT, handler); + + logInit(); + + // default parameters + n_frames = 1000; + snr0 = 0; + // num_layers = 1; + perfect_ce = 0; + + while ((c = getopt (argc, argv, "ahdpZDe:Em:n:o:s:f:t:c:g:r:F:x:p:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:XY")) != -1) { + switch (c) { + case 'a': + awgn_flag = 1; + channel_model = AWGN; + break; + + case 'A': + abstx = 1; + break; + + case 'b': + tdd_config=atoi(optarg); + break; + + case 'B': + N_RB_DL=atoi(optarg); + break; + + case 'c': + num_pdcch_symbols=atoi(optarg); + break; + + case 'C': + Nid_cell = atoi(optarg); + break; + + case 'd': + dci_flag = 1; + break; + + case 'D': + frame_type=TDD; + break; + + case 'e': + num_rounds=1; + common_flag = 1; + TPC = atoi(optarg); + break; + + case 'E': + threequarter_fs=1; + break; + + case 'f': + input_snr_step= atof(optarg); + break; + + case 'F': + forgetting_factor = atof(optarg); + break; + + case 'i': + input_fd = fopen(optarg,"r"); + input_file=1; + dci_flag = 1; + break; + + case 'I': + input_trch_fd = fopen(optarg,"r"); + input_trch_file=1; + break; + + case 'L': + llr8_flag=1; + break; + + case 'l': + offset_mumimo_llr_drange_fix=atoi(optarg); + break; + + case 'm': + mcs1 = atoi(optarg); + break; + + case 'M': + mcs2 = atoi(optarg); + break; + + case 'O': + test_perf=atoi(optarg); + //print_perf =1; + break; + + case 't': + mcs_i = atoi(optarg); + i_mod = get_Qm(mcs_i); + break; + + case 'n': + n_frames = atoi(optarg); + break; + + case 'o': + rx_sample_offset = atoi(optarg); + break; + + case 'r': + DLSCH_RB_ALLOC = atoi(optarg); + rballocset = 1; + break; + + case 's': + snr0 = atof(optarg); + break; + + case 'w': + snr_int = atof(optarg); + break; + + case 'N': + n_ch_rlz= atof(optarg); + break; + + case 'p': + extended_prefix_flag=1; + break; + + case 'g': + memcpy(channel_model_input,optarg,10); + + switch((char)*optarg) { + case 'A': + channel_model=SCM_A; + break; + + case 'B': + channel_model=SCM_B; + break; + + case 'C': + channel_model=SCM_C; + break; + + case 'D': + channel_model=SCM_D; + break; + + case 'E': + channel_model=EPA; + break; + + case 'F': + channel_model=EVA; + break; + + case 'G': + channel_model=ETU; + break; + + case 'H': + channel_model=Rayleigh8; + break; + + case 'I': + channel_model=Rayleigh1; + break; + + case 'J': + channel_model=Rayleigh1_corr; + break; + + case 'K': + channel_model=Rayleigh1_anticorr; + break; + + case 'L': + channel_model=Rice8; + break; + + case 'M': + channel_model=Rice1; + break; + + case 'N': + channel_model=AWGN; + break; + default: + msg("Unsupported channel model!\n"); + exit(-1); + } + + break; + + case 'R': + num_rounds=atoi(optarg); + break; + + case 'S': + subframe=atoi(optarg); + break; + + case 'T': + n_rnti=atoi(optarg); + break; + + case 'u': + dual_stream_UE=1; + UE->use_ia_receiver = 1; + + if ((n_tx_port!=2) || (transmission_mode!=5)) { + msg("IA receiver only supported for TM5!"); + exit(-1); + } + + break; + + case 'v': + i_mod = atoi(optarg); + + if (i_mod!=2 && i_mod!=4 && i_mod!=6) { + msg("Wrong i_mod %d, should be 2,4 or 6\n",i_mod); + exit(-1); + } + + break; + + case 'P': + print_perf=1; + break; + + case 'q': + n_tx_port=atoi(optarg); + + if ((n_tx_port==0) || ((n_tx_port>2))) { + msg("Unsupported number of cell specific antennas ports %d\n",n_tx_port); + exit(-1); + } + + break; + + + case 'x': + transmission_mode=atoi(optarg); + + if ((transmission_mode!=1) && + (transmission_mode!=2) && + (transmission_mode!=3) && + (transmission_mode!=4) && + (transmission_mode!=5) && + (transmission_mode!=6) && + (transmission_mode!=7)) { + msg("Unsupported transmission mode %d\n",transmission_mode); + exit(-1); + } + + if (transmission_mode>1 && transmission_mode<7) { + n_tx_port = 2; + } + + break; + + case 'y': + n_tx_phy=atoi(optarg); + + if (transmission_mode>1&&transmission_mode<7) { + if(n_tx_phy==1) { + msg("n_tx_phy must be >1 for transmission_mode %d\n",transmission_mode); + exit(-1); + } + } + + if (transmission_mode==7 && (n_tx_phy!=1 && n_tx_phy!=2 && n_tx_phy!=4 && n_tx_phy!=8 && n_tx_phy!=16 && n_tx_phy!=64 && n_tx_phy!=128)) { + msg("Physical number of antennas not supported for TM7.\n"); + exit(-1); + } + + break; + + case 'X': + xforms=1; + break; + + case 'Y': + perfect_ce=1; + break; + + case 'z': + n_rx=atoi(optarg); + + if ((n_rx==0) || (n_rx>2)) { + msg("Unsupported number of rx antennas %d\n",n_rx); + exit(-1); + } + + break; + + case 'Z': + dump_table=1; + break; + + + + case 'h': + default: + printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs1 -M mcs2 -n n_frames -s snr0 -x transmission mode (1,2,5,6,7) -y TXant -z RXant -I trch_file\n",argv[0]); + printf("-h This message\n"); + printf("-a Use AWGN channel and not multipath\n"); + printf("-c Number of PDCCH symbols\n"); + printf("-m MCS1 for TB 1\n"); + printf("-M MCS2 for TB 2\n"); + printf("-d Transmit the DCI and compute its error statistics and the overall throughput\n"); + printf("-p Use extended prefix mode\n"); + printf("-n Number of frames to simulate\n"); + printf("-o Sample offset for receiver\n"); + printf("-s Starting SNR, runs from SNR to SNR+%.1fdB in steps of %.1fdB. If n_frames is 1 then just SNR is simulated and MATLAB/OCTAVE output is generated\n", snr_int, snr_step); + printf("-f step size of SNR, default value is 1.\n"); + printf("-r ressource block allocation (see section 7.1.6.3 in 36.213\n"); + printf("-g [A:M] Use 3GPP 25.814 SCM-A/B/C/D('A','B','C','D') or 36-101 EPA('E'), EVA ('F'),ETU('G') models (ignores delay spread and Ricean factor), Rayghleigh8 ('H'), Rayleigh1('I'), Rayleigh1_corr('J'), Rayleigh1_anticorr ('K'), Rice8('L'), Rice1('M')\n"); + printf("-F forgetting factor (0 new channel every trial, 1 channel constant\n"); + printf("-x Transmission mode (1,2,6,7 for the moment)\n"); + printf("-q Number of TX antennas ports used in eNB\n"); + printf("-y Number of physical TX antennas used in eNB\n"); + printf("-z Number of RX antennas used in UE\n"); + printf("-t MCS of interfering UE\n"); + printf("-R Number of HARQ rounds (fixed)\n"); + printf("-A Turns on calibration mode for abstraction.\n"); + printf("-N Determines the number of Channel Realizations in Abstraction mode. Default value is 1. \n"); + printf("-O Set the percenatge of effective rate to testbench the modem performance (typically 30 and 70, range 1-100) \n"); + printf("-I Input filename for TrCH data (binary)\n"); + printf("-u Enables the Interference Aware Receiver for TM5 (default is normal receiver)\n"); + exit(1); + break; + } + } + + if (common_flag == 0) { + switch (N_RB_DL) { + case 6: + if (rballocset==0) DLSCH_RB_ALLOC = 0x3f; + num_pdcch_symbols = 3; + break; + + case 25: + if (rballocset==0) DLSCH_RB_ALLOC = 0x1fff; + break; + + case 50: + if (rballocset==0) DLSCH_RB_ALLOC = 0x1ffff; + break; + + case 100: + if (rballocset==0) DLSCH_RB_ALLOC = 0x1ffffff; + break; + } + + NB_RB=conv_nprb(0,DLSCH_RB_ALLOC,N_RB_DL); + } else + NB_RB = 4; + + + if (xforms==1) { + fl_initialize (&argc, argv, NULL, 0, 0); + form_ue = create_lte_phy_scope_ue(); + sprintf (title, "LTE PHY SCOPE eNB"); + fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); + + if (!dual_stream_UE==0) { + UE->use_ia_receiver = 1; + fl_set_button(form_ue->button_0,1); + fl_set_object_label(form_ue->button_0, "IA Receiver ON"); + fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN); + } + } + + if (transmission_mode==5) { + n_users = 2; + printf("dual_stream_UE=%d\n", dual_stream_UE); + } + + lte_param_init(n_tx_port,n_tx_phy,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,tdd_config,N_RB_DL,threequarter_fs,osf,perfect_ce); + + frame_parms = &eNB->frame_parms; + + /* + cell_spec_bf_weights = eNB->common_vars.beam_weights[0][0]; + for(aa=0;aaofdm_symbol_size;re++) { + if (n_tx_phy==1 || n_tx_phy==2) + cell_spec_bf_weights[aa][re] = 0x00007fff; + else if (n_tx_phy==4 || n_tx_phy==8) + cell_spec_bf_weights[aa][re] = 0x00007fff>>1; + else if (n_tx_phy==16) + cell_spec_bf_weights[aa][re] = 0x00007fff>>2; + else if (n_tx_phy==64) + cell_spec_bf_weights[aa][re] = 0x00007fff>>4; + } + } + + if (transmission_mode==7){ + lte_gold_ue_spec_port5(eNB->lte_gold_uespec_port5_table[0],Nid_cell,n_rnti); + lte_gold_ue_spec_port5(UE->lte_gold_uespec_port5_table,Nid_cell,n_rnti); + }*/ + + + eNB_id_i = UE->n_connected_eNB; + + printf("Setting mcs1 = %d\n",mcs1); + printf("Setting mcs2 = %d\n",mcs2); + printf("NPRB = %d\n",NB_RB); + printf("n_frames = %d\n",n_frames); + printf("Transmission mode %d with %dx%d antenna configuration, Extended Prefix %d\n",transmission_mode,n_tx_phy,n_rx,extended_prefix_flag); + + snr1 = snr0+snr_int; + printf("SNR0 %f, SNR1 %f\n",snr0,snr1); + + + s_re = malloc(n_tx_phy*sizeof(double*)); + s_im = malloc(n_tx_phy*sizeof(double*)); + r_re = malloc(2*sizeof(double*)); + r_im = malloc(2*sizeof(double*)); + // r_re0 = malloc(2*sizeof(double*)); + // r_im0 = malloc(2*sizeof(double*)); + + nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; + + printf("Channel Model= (%s,%d)\n",channel_model_input, channel_model); + printf("SCM-A=%d, SCM-B=%d, SCM-C=%d, SCM-D=%d, EPA=%d, EVA=%d, ETU=%d, Rayleigh8=%d, Rayleigh1=%d, Rayleigh1_corr=%d, Rayleigh1_anticorr=%d, Rice1=%d, Rice8=%d\n", + SCM_A, SCM_B, SCM_C, SCM_D, EPA, EVA, ETU, Rayleigh8, Rayleigh1, Rayleigh1_corr, Rayleigh1_anticorr, Rice1, Rice8); + + if(transmission_mode==5) + sprintf(bler_fname,"bler_tm%d_chan%d_perfce%d_ntx%d_nrx%d_mcs%d_mcsi%d_u%d_imod%d.csv",transmission_mode,channel_model,perfect_ce,n_tx_phy,n_rx,mcs1,mcs_i,dual_stream_UE,i_mod); + else + sprintf(bler_fname,"bler_tm%d_chan%d_perfce%d_ntx%d_nrx%d_mcs%d.csv",transmission_mode,channel_model,perfect_ce,n_tx_phy,n_rx,mcs1); + + bler_fd = fopen(bler_fname,"w"); + if (bler_fd==NULL) { + fprintf(stderr,"Cannot create file %s!\n",bler_fname); + exit(-1); + } + fprintf(bler_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err\n"); + + if (test_perf != 0) { + char hostname[1024]; + hostname[1023] = '\0'; + gethostname(hostname, 1023); + printf("Hostname: %s\n", hostname); + //char dirname[FILENAME_MAX]; + //sprintf(dirname, "%s/SIMU/USER/pre-ci-logs-%s", getenv("OPENAIR_TARGETS"),hostname ); + sprintf(time_meas_fname,"time_meas_prb%d_mcs%d_anttx%d_antrx%d_pdcch%d_channel%s_tx%d.csv", + N_RB_DL,mcs1,n_tx_phy,n_rx,num_pdcch_symbols,channel_model_input,transmission_mode); + //mkdir(dirname,0777); + time_meas_fd = fopen(time_meas_fname,"w"); + if (time_meas_fd==NULL) { + fprintf(stderr,"Cannot create file %s!\n",time_meas_fname); + exit(-1); + } + } + + if(abstx) { + // CSV file + sprintf(csv_fname,"dataout_tx%d_u2%d_mcs%d_chan%d_nsimus%d_R%d.m",transmission_mode,dual_stream_UE,mcs1,channel_model,n_frames,num_rounds); + csv_fd = fopen(csv_fname,"w"); + fprintf(csv_fd,"data_all%d=[",mcs1); + if (csv_fd==NULL) { + fprintf(stderr,"Cannot create file %s!\n",csv_fname); + exit(-1); + } + } + + /* + //sprintf(tikz_fname, "second_bler_tx%d_u2=%d_mcs%d_chan%d_nsimus%d.tex",transmission_mode,dual_stream_UE,mcs,channel_model,n_frames); + sprintf(tikz_fname, "second_bler_tx%d_u2%d_mcs%d_chan%d_nsimus%d",transmission_mode,dual_stream_UE,mcs,channel_model,n_frames); + tikz_fd = fopen(tikz_fname,"w"); + //fprintf(tikz_fd,"\\addplot[color=red, mark=o] plot coordinates {"); + switch (mcs) + { + case 0: + fprintf(tikz_fd,"\\addplot[color=blue, mark=star] plot coordinates {"); + break; + case 1: + fprintf(tikz_fd,"\\addplot[color=red, mark=star] plot coordinates {"); + break; + case 2: + fprintf(tikz_fd,"\\addplot[color=green, mark=star] plot coordinates {"); + break; + case 3: + fprintf(tikz_fd,"\\addplot[color=yellow, mark=star] plot coordinates {"); + break; + case 4: + fprintf(tikz_fd,"\\addplot[color=black, mark=star] plot coordinates {"); + break; + case 5: + fprintf(tikz_fd,"\\addplot[color=blue, mark=o] plot coordinates {"); + break; + case 6: + fprintf(tikz_fd,"\\addplot[color=red, mark=o] plot coordinates {"); + break; + case 7: + fprintf(tikz_fd,"\\addplot[color=green, mark=o] plot coordinates {"); + break; + case 8: + fprintf(tikz_fd,"\\addplot[color=yellow, mark=o] plot coordinates {"); + break; + case 9: + fprintf(tikz_fd,"\\addplot[color=black, mark=o] plot coordinates {"); + break; + case 10: + fprintf(tikz_fd,"\\addplot[color=blue, mark=square] plot coordinates {"); + break; + case 11: + fprintf(tikz_fd,"\\addplot[color=red, mark=square] plot coordinates {"); + break; + case 12: + fprintf(tikz_fd,"\\addplot[color=green, mark=square] plot coordinates {"); + break; + case 13: + fprintf(tikz_fd,"\\addplot[color=yellow, mark=square] plot coordinates {"); + break; + case 14: + fprintf(tikz_fd,"\\addplot[color=black, mark=square] plot coordinates {"); + break; + case 15: + fprintf(tikz_fd,"\\addplot[color=blue, mark=diamond] plot coordinates {"); + break; + case 16: + fprintf(tikz_fd,"\\addplot[color=red, mark=diamond] plot coordinates {"); + break; + case 17: + fprintf(tikz_fd,"\\addplot[color=green, mark=diamond] plot coordinates {"); + break; + case 18: + fprintf(tikz_fd,"\\addplot[color=yellow, mark=diamond] plot coordinates {"); + break; + case 19: + fprintf(tikz_fd,"\\addplot[color=black, mark=diamond] plot coordinates {"); + break; + case 20: + fprintf(tikz_fd,"\\addplot[color=blue, mark=x] plot coordinates {"); + break; + case 21: + fprintf(tikz_fd,"\\addplot[color=red, mark=x] plot coordinates {"); + break; + case 22: + fprintf(tikz_fd,"\\addplot[color=green, mark=x] plot coordinates {"); + break; + case 23: + fprintf(tikz_fd,"\\addplot[color=yellow, mark=x] plot coordinates {"); + break; + case 24: + fprintf(tikz_fd,"\\addplot[color=black, mark=x] plot coordinates {"); + break; + case 25: + fprintf(tikz_fd,"\\addplot[color=blue, mark=x] plot coordinates {"); + break; + case 26: + fprintf(tikz_fd,"\\addplot[color=red, mark=+] plot coordinates {"); + break; + case 27: + fprintf(tikz_fd,"\\addplot[color=green, mark=+] plot coordinates {"); + break; + case 28: + fprintf(tikz_fd,"\\addplot[color=yellow, mark=+] plot coordinates {"); + break; + } + */ + + for (i=0; ipdcch_vars[0]->crnti = n_rnti; + + // Fill in UL_alloc + UL_alloc_pdu.type = 0; + UL_alloc_pdu.hopping = 0; + UL_alloc_pdu.rballoc = UL_RB_ALLOC; + UL_alloc_pdu.mcs = 1; + UL_alloc_pdu.ndi = 1; + UL_alloc_pdu.TPC = 0; + UL_alloc_pdu.cqi_req = 1; + + CCCH_alloc_pdu.type = 0; + CCCH_alloc_pdu.vrb_type = 0; + CCCH_alloc_pdu.rballoc = CCCH_RB_ALLOC; + CCCH_alloc_pdu.ndi = 1; + CCCH_alloc_pdu.mcs = 1; + CCCH_alloc_pdu.harq_pid = 0; + + DLSCH_alloc_pdu2_1E[0].rah = 0; + DLSCH_alloc_pdu2_1E[0].rballoc = DLSCH_RB_ALLOC; + DLSCH_alloc_pdu2_1E[0].TPC = 0; + DLSCH_alloc_pdu2_1E[0].dai = 0; + DLSCH_alloc_pdu2_1E[0].harq_pid = 0; + //DLSCH_alloc_pdu2_1E[0].tb_swap = 0; + DLSCH_alloc_pdu2_1E[0].mcs = mcs1; + DLSCH_alloc_pdu2_1E[0].ndi = 1; + DLSCH_alloc_pdu2_1E[0].rv = 0; + // Forget second codeword + DLSCH_alloc_pdu2_1E[0].tpmi = (transmission_mode>=5 ? 5 : 0); // precoding + DLSCH_alloc_pdu2_1E[0].dl_power_off = (transmission_mode==5 ? 0 : 1); + + DLSCH_alloc_pdu2_1E[1].rah = 0; + DLSCH_alloc_pdu2_1E[1].rballoc = DLSCH_RB_ALLOC; + DLSCH_alloc_pdu2_1E[1].TPC = 0; + DLSCH_alloc_pdu2_1E[1].dai = 0; + DLSCH_alloc_pdu2_1E[1].harq_pid = 0; + //DLSCH_alloc_pdu2_1E[1].tb_swap = 0; + DLSCH_alloc_pdu2_1E[1].mcs = mcs_i; + DLSCH_alloc_pdu2_1E[1].ndi = 1; + DLSCH_alloc_pdu2_1E[1].rv = 0; + // Forget second codeword + DLSCH_alloc_pdu2_1E[1].tpmi = (transmission_mode>=5 ? 5 : 0) ; // precoding + DLSCH_alloc_pdu2_1E[1].dl_power_off = (transmission_mode==5 ? 0 : 1); + + eNB2UE[0] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, + channel_model, + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), + forgetting_factor, + rx_sample_offset, + 0); + + if(num_rounds>1) { + for(n=1; n<4; n++) + eNB2UE[n] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, + channel_model, + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), + forgetting_factor, + rx_sample_offset, + 0); + } + + if (eNB2UE[0]==NULL) { + msg("Problem generating channel model. Exiting.\n"); + exit(-1); + } + + if ((transmission_mode == 3) || (transmission_mode==4)) + Kmimo=2; + else + Kmimo=1; + + switch (ue_category) { + case 1: + Nsoft = 250368; + break; + case 2: + case 3: + Nsoft = 1237248; + break; + case 4: + Nsoft = 1827072; + break; + default: + printf("Unsupported UE category %d\n",ue_category); + exit(-1); + break; + } + + for (k=0; kdlsch[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0,&eNB->frame_parms); + + if (!eNB->dlsch[k][i]) { + printf("Can't get eNB dlsch structures\n"); + exit(-1); + } else { + // this initilisation may should be moved to another place + for (j=0; j<4; j++) { + for (aa=0; aadlsch[k][i]->ue_spec_bf_weights[j][aa]; + + for (re=0;re>1; + else if (n_tx_phy==16) + ue_spec_bf_weights[re] = 0x00007fff>>2; + else if (n_tx_phy==64) + ue_spec_bf_weights[re] = 0x00007fff>>4; + } + + } + } + + } + + eNB->dlsch[k][i]->rnti = n_rnti+k; + } + } + + for (i=0; i<2; i++) { + UE->dlsch[UE->current_thread_id[subframe]][0][i] = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0); + + if (!UE->dlsch[UE->current_thread_id[subframe]][0][i]) { + printf("Can't get ue dlsch structures\n"); + exit(-1); + } + + UE->dlsch[UE->current_thread_id[subframe]][0][i]->rnti = n_rnti; + } + + // structure for SIC at UE + UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0,&eNB->frame_parms); + + if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { + + eNB->UE_stats[0].DL_pmi_single = (unsigned short)(taus()&0xffff); + + if (n_users>1) + eNB->UE_stats[1].DL_pmi_single = (eNB->UE_stats[0].DL_pmi_single ^ 0x1555); //opposite PMI + } else { + eNB->UE_stats[0].DL_pmi_single = 0; + + if (n_users>1) + eNB->UE_stats[1].DL_pmi_single = 0; + } + + //TODO: allocate memory for calibration matrix and calib_dl_ch_estimates in init_lte.c + //for first tests initialze calibration matrix with idendity + //read_calibration_matrix(calib_fname, nb_ant, nb_freq, eNB->common_vars.tdd_calib_coeffs[0]); + + if (input_fd==NULL) { + + + /* + // common DCI + memcpy(&dci_alloc[num_dci].dci_pdu[0],&CCCH_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t)); + dci_alloc[num_dci].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + dci_alloc[num_dci].L = 2; + dci_alloc[num_dci].rnti = SI_RNTI; + num_dci++; + num_common_dci++; + */ + + // UE specific DCI + for(k=0; kframe_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1_1_5MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_1_5MHz_TDD_t); + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1_5MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_5MHz_TDD_t); + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 50: + dci_length = sizeof_DCI1_10MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_10MHz_TDD_t); + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1_20MHz_TDD_t; + dci_length_bytes = sizeof(DCI1_20MHz_TDD_t); + break; + } + } else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_1_5MHz_FDD_t); + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_5MHz_FDD_t); + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 50: + dci_length = sizeof_DCI1_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_10MHz_FDD_t); + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + dci_length = sizeof_DCI1_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1_20MHz_FDD_t); + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 1; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = n_rnti+k; + dci_alloc[num_dci].format = format1; + dci_alloc[num_dci].search_space = DCI_UE_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format1, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + transmission_mode<7?0:transmission_mode); + + /*if (transmission_mode == 7) + eNB->dlsch[0][0]->harq_processes[0]->mimo_mode = TM7; //Xiwen: to check about harq_pid*/ + + num_dci++; + num_ue_spec_dci++; + } else { + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 1; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); + break; + } + } else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + dci_length = sizeof_DCI1A_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = SI_RNTI; + dci_alloc[num_dci].format = format1A; + dci_alloc[num_dci].firstCCE = 0; + dci_alloc[num_dci].search_space = DCI_COMMON_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + SI_RNTI, + format1A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + 0); + + num_common_dci++; + num_dci++; + + } + + break; + + case 3: + if (common_flag == 0) { + + if (eNB->frame_parms.nb_antennas_tx == 2) { + + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2A_1_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t); + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 25: + dci_length = sizeof_DCI2A_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_5MHz_2A_TDD_t); + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 50: + dci_length = sizeof_DCI2A_10MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_10MHz_2A_TDD_t); + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 100: + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + dci_length = sizeof_DCI2A_20MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2A_20MHz_2A_TDD_t); + break; + } + } + + else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2A_1_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t); + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 25: + dci_length = sizeof_DCI2A_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_5MHz_2A_FDD_t); + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 50: + dci_length = sizeof_DCI2A_10MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_10MHz_2A_FDD_t); + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 100: + dci_length = sizeof_DCI2A_20MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2A_20MHz_2A_FDD_t); + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + } + } + } else if (eNB->frame_parms.nb_antennas_tx == 4) { + + } + + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = n_rnti+k; + dci_alloc[num_dci].format = format2A; + dci_alloc[num_dci].search_space = DCI_UE_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + + printf("Generating dlsch params for user %d / format 2A (%d)\n",k,format2A); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + 0); + + num_dci++; + num_ue_spec_dci++; + } else { + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 1; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); + break; + } + } else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + dci_length = sizeof_DCI1A_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = SI_RNTI; + dci_alloc[num_dci].format = format1A; + dci_alloc[num_dci].firstCCE = 0; + dci_alloc[num_dci].search_space = DCI_COMMON_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + SI_RNTI, + format1A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + 0); + + num_common_dci++; + num_dci++; + + } + + printf("Generated DCI format 2A (Transmission Mode 3)\n"); + break; + + case 4: + if (common_flag == 0) { + + if (eNB->frame_parms.nb_antennas_tx == 2) { + + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2_1_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_1_5MHz_2A_TDD_t); + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 25: + dci_length = sizeof_DCI2_5MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_5MHz_2A_TDD_t); + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 50: + dci_length = sizeof_DCI2_10MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_10MHz_2A_TDD_t); + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 100: + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + dci_length = sizeof_DCI2_20MHz_2A_TDD_t; + dci_length_bytes = sizeof(DCI2_20MHz_2A_TDD_t); + break; + } + } + + else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI2_1_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_1_5MHz_2A_FDD_t); + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 25: + dci_length = sizeof_DCI2_5MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_5MHz_2A_FDD_t); + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 50: + dci_length = sizeof_DCI2_10MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_10MHz_2A_FDD_t); + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + + case 100: + dci_length = sizeof_DCI2_20MHz_2A_FDD_t; + dci_length_bytes = sizeof(DCI2_20MHz_2A_FDD_t); + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = DLSCH_RB_ALLOC; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1 = mcs1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1 = 1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1 = 0; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2 = mcs2; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2 = 1; + ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2 = 0; + break; + } + } + } else if (eNB->frame_parms.nb_antennas_tx == 4) { + + } + + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = n_rnti+k; + dci_alloc[num_dci].format = format2; + dci_alloc[num_dci].search_space = DCI_UE_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + n_rnti+k, + format2, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + 0); + + num_dci++; + num_ue_spec_dci++; + } else { + if (eNB->frame_parms.frame_type == TDD) { + + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 1; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t; + dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); + break; + } + } else { + switch (eNB->frame_parms.N_RB_DL) { + case 6: + dci_length = sizeof_DCI1A_1_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 25: + dci_length = sizeof_DCI1A_5MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 50: + dci_length = sizeof_DCI1A_10MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + + case 100: + dci_length = sizeof_DCI1A_20MHz_FDD_t; + dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type = 1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc = computeRIV(eNB->frame_parms.N_RB_DL,0,9); + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC = TPC; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs = mcs1; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi = 0; + ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv = 0; + break; + } + } + + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes); + dci_alloc[num_dci].dci_length = dci_length; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = SI_RNTI; + dci_alloc[num_dci].format = format1A; + dci_alloc[num_dci].firstCCE = 0; + dci_alloc[num_dci].search_space = DCI_COMMON_SPACE; + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + SI_RNTI, + format1A, + eNB->dlsch[0], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[0].DL_pmi_single, + 0); + + num_common_dci++; + num_dci++; + + } + + break; + + case 5: + case 6: + memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu2_1E[k],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + dci_alloc[num_dci].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + dci_alloc[num_dci].L = 1; + dci_alloc[num_dci].rnti = n_rnti+k; + dci_alloc[num_dci].format = format1E_2A_M10PRB; + dci_alloc[num_dci].firstCCE = 4*k; + dci_alloc[num_dci].search_space = DCI_UE_SPACE; + printf("Generating dlsch params for user %d\n",k); + generate_eNB_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu2_1E[k], + n_rnti+k, + format1E_2A_M10PRB, + eNB->dlsch[k], + &eNB->frame_parms, + eNB->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + eNB->UE_stats[k].DL_pmi_single, + 0); + + dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]); + num_ue_spec_dci++; + num_dci++; + + break; + + default: + printf("Unsupported Transmission Mode!!!"); + exit(-1); + break; + } + + + + + /* + memcpy(&dci_alloc[1].dci_pdu[0],&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD0_t)); + dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_0_t; + dci_alloc[1].L = 2; + dci_alloc[1].rnti = n_rnti; + */ + } + + if (n_frames==1) printf("num_pdcch_symbols %d, numCCE %d => ",num_pdcch_symbols,numCCE); + + numCCE = get_nCCE(num_pdcch_symbols,&eNB->frame_parms,get_mi(&eNB->frame_parms,subframe)); + + if (n_frames==1) printf("%d\n",numCCE); + + // apply RNTI-based nCCE allocation + memset(CCE_table,0,800*sizeof(int)); + + for (i=num_common_dci; idlsch[k][0]->harq_processes[0]->TBS/8; + input_buffer0[k] = (unsigned char *)malloc(input_buffer_length0+4); + memset(input_buffer0[k],0,input_buffer_length0+4); + input_buffer_length1 = eNB->dlsch[k][1]->harq_processes[0]->TBS/8; + input_buffer1[k] = (unsigned char *)malloc(input_buffer_length1+4); + memset(input_buffer1[k],0,input_buffer_length1+4); + + if (input_trch_file==0) { + for (i=0; i>3]+=(1<<(7-(i&7))); + + if (i<16) + printf("input_trch_val %d : %c\n",i,input_trch_val[0]); + + i++; + + if (((i%8) == 0) && (i<17)) + printf("%x\n",input_buffer0[k][(i-1)>>3]); + } + + printf("Read in %d bits\n",i); + } + } + } + + // this is for user 0 only + coded_bits_per_codeword = get_G(&eNB->frame_parms, + eNB->dlsch[0][0]->harq_processes[0]->nb_rb, + eNB->dlsch[0][0]->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs), + eNB->dlsch[0][0]->harq_processes[0]->Nl, + num_pdcch_symbols, + 0, + subframe, + (transmission_mode<7?0:transmission_mode)); + + uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword); + printf("uncoded_ber_bit=%p\n",uncoded_ber_bit); + + snr_step = input_snr_step; + UE->high_speed_flag = 0; //1 + UE->ch_est_alpha=0; + + for (ch_realization=0; ch_realizationproc.proc_rxtx[UE->current_thread_id[subframe]].frame_rx=0; + errs[0]=0; + errs[1]=0; + errs[2]=0; + errs[3]=0; + errs2[0]=0; + errs2[1]=0; + errs2[2]=0; + errs2[3]=0; + round_trials[0] = 0; + round_trials[1] = 0; + round_trials[2] = 0; + round_trials[3] = 0; + + dci_errors=0; + // avg_ber = 0; + + round=0; + avg_iter = 0; + iter_trials=0; + reset_meas(&eNB->phy_proc_tx); // total eNB tx + reset_meas(&eNB->dlsch_scrambling_stats); + reset_meas(&UE->dlsch_unscrambling_stats); + reset_meas(&eNB->ofdm_mod_stats); + reset_meas(&eNB->dlsch_modulation_stats); + reset_meas(&eNB->dlsch_encoding_stats); + reset_meas(&eNB->dlsch_interleaving_stats); + reset_meas(&eNB->dlsch_rate_matching_stats); + reset_meas(&eNB->dlsch_turbo_encoding_stats); + + reset_meas(&UE->phy_proc_rx[UE->current_thread_id[subframe]]); // total UE rx + reset_meas(&UE->ofdm_demod_stats); + reset_meas(&UE->dlsch_channel_estimation_stats); + reset_meas(&UE->dlsch_freq_offset_estimation_stats); + reset_meas(&UE->rx_dft_stats); + reset_meas(&UE->dlsch_decoding_stats); + reset_meas(&UE->dlsch_turbo_decoding_stats); + reset_meas(&UE->dlsch_deinterleaving_stats); + reset_meas(&UE->dlsch_rate_unmatching_stats); + reset_meas(&UE->dlsch_tc_init_stats); + reset_meas(&UE->dlsch_tc_alpha_stats); + reset_meas(&UE->dlsch_tc_beta_stats); + reset_meas(&UE->dlsch_tc_gamma_stats); + reset_meas(&UE->dlsch_tc_ext_stats); + reset_meas(&UE->dlsch_tc_intl1_stats); + reset_meas(&UE->dlsch_tc_intl2_stats); + // initialization + struct list time_vector_tx; + initialize(&time_vector_tx); + struct list time_vector_tx_ifft; + initialize(&time_vector_tx_ifft); + struct list time_vector_tx_mod; + initialize(&time_vector_tx_mod); + struct list time_vector_tx_enc; + initialize(&time_vector_tx_enc); + + struct list time_vector_rx; + initialize(&time_vector_rx); + struct list time_vector_rx_fft; + initialize(&time_vector_rx_fft); + struct list time_vector_rx_demod; + initialize(&time_vector_rx_demod); + struct list time_vector_rx_dec; + initialize(&time_vector_rx_dec); + + for (trials = 0; trialsfirst_run = 1; + + ret = UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations+1; + + while ((round < num_rounds) && (ret > UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations)) { + //printf("Trial %d, round %d\n",trials,round); + round_trials[round]++; + + if(transmission_mode>=5&&transmission_mode<7) + pmi_feedback=1; + else + pmi_feedback=0; + + if (abstx) { + if (trials==0 && round==0 && SNR==snr0) //generate a new channel + hold_channel = 0; + else + hold_channel = 1; + } else + hold_channel = 0;//(round==0) ? 0 : 1; + +PMI_FEEDBACK: + + //make sure dlsim is called with perfect channel estimation option (for freq_channel) + //fill drs_ch_estimates with data from eNB2UE->chF + for(aa=0; aanb_antenna_ports_eNB; aa++) { + for (aarx=0; aarxnb_antennas_rx; aarx++) { + for (i=0; iN_RB_DL*12; i++) { + for (l=0; lsymbols_per_tti; l++) { + ((int16_t *) eNB->pusch_vars[0]->drs_ch_estimates[0][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size)*2]=(int16_t)(eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); + //printf("x=%d,AMP=%d\n",eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x,AMP); + ((int16_t *) eNB->pusch_vars[0]->drs_ch_estimates[0][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size)*2]=(int16_t)(eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); + } + } + } + } + + estimate_DLCSI_from_ULCSI(eNB->dlsch[0][0]->calib_dl_ch_estimates, + &eNB->pusch_vars[0]->drs_ch_estimates[0][0/*position of second DMRS*/], + eNB->common_vars.tdd_calib_coeffs[0], + frame_parms->nb_antennas_tx, + frame_parms->N_RB_DL*12); + + compute_BF_weights(eNB->dlsch[0][0]->ue_spec_bf_weights[0], + eNB->dlsch[0][0]->calib_dl_ch_estimates, + MRT, + frame_parms->nb_antennas_tx, + frame_parms->N_RB_DL*12); + + //printf("Trial %d : Round %d, pmi_feedback %d \n",trials,round,pmi_feedback); + for (aa=0; aacommon_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + } + + if (input_fd==NULL) { + + start_meas(&eNB->phy_proc_tx); + + // Simulate HARQ procedures!!! + if (common_flag == 0) { + + if (round == 0) { // First round + TB0_active = 1; + + eNB->dlsch[0][0]->harq_processes[0]->rvidx = round&3; + + if (eNB->frame_parms.frame_type == TDD) { + + switch (transmission_mode) { + case 1: + case 2: + case 7: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_TDD_t)); + break; + + case 25: + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_TDD_t)); + break; + + case 50: + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_TDD_t)); + break; + + case 100: + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_TDD_t)); + break; + } + + break; + + case 3: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t)); + break; + + case 25: + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t)); + break; + + case 50: + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t)); + break; + + case 100: + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t)); + break; + } + + break; + + case 5: + DLSCH_alloc_pdu2_1E[0].ndi = trials&1; + DLSCH_alloc_pdu2_1E[0].rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + break; + + } + } else { // FDD + switch (transmission_mode) { + case 1: + case 2: + case 7: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_FDD_t)); + break; + + case 25: + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_FDD_t)); + break; + + case 50: + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_FDD_t)); + break; + + case 100: + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_FDD_t)); + break; + } + + break; + case 3: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t)); + break; + + case 25: + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t)); + break; + + case 50: + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t)); + break; + + case 100: + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t)); + break; + } + + break; + + case 5: + DLSCH_alloc_pdu2_1E[0].ndi = trials&1; + DLSCH_alloc_pdu2_1E[0].rv = 0; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + break; + } + + } + } else { + eNB->dlsch[0][0]->harq_processes[0]->rvidx = round&3; + + if (eNB->frame_parms.frame_type == TDD) { + + + switch (transmission_mode) { + case 1: + case 2: + case 7: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_TDD_t)); + break; + + case 25: + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_TDD_t)); + break; + + case 50: + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_TDD_t)); + break; + + case 100: + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_TDD_t)); + break; + } + + break; + + case 3: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + if (TB0_active==1) { + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } else { // deactivate TB0 + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t)); + break; + + case 25: + if (TB0_active==1) { + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } else { // deactivate TB0 + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t)); + break; + + case 50: + if (TB0_active==1) { + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } else { // deactivate TB0 + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t)); + break; + + case 100: + if (TB0_active==1) { + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } else { // deactivate TB0 + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t)); + break; + } + + break; + + case 5: + DLSCH_alloc_pdu2_1E[0].ndi = trials&1; + DLSCH_alloc_pdu2_1E[0].rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + break; + } + } else { + switch (transmission_mode) { + case 1: + case 2: + case 7: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3;; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_1_5MHz_FDD_t)); + break; + + case 25: + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_5MHz_FDD_t)); + break; + + case 50: + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_10MHz_FDD_t)); + break; + + case 100: + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi = trials&1; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI1_20MHz_FDD_t)); + break; + } + + break; + + case 3: + switch (eNB->frame_parms.N_RB_DL) { + case 6: + if (TB0_active==1) { + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } else { // deactivate TB0 + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t)); + break; + + case 25: + if (TB0_active==1) { + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } else { // deactivate TB0 + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t)); + break; + + case 50: + if (TB0_active==1) { + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } else { // deactivate TB0 + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t)); + break; + + case 100: + if (TB0_active==1) { + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = round&3; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } else { // deactivate TB0 + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; + ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; + } + + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t)); + break; + } + + break; + + case 5: + DLSCH_alloc_pdu2_1E[0].ndi = trials&1; + DLSCH_alloc_pdu2_1E[0].rv = round&3; + memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu2_1E[0],sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); + break; + } + } + } + } + + num_pdcch_symbols_2 = generate_dci_top(num_ue_spec_dci + num_common_dci, + dci_alloc, + 0, + AMP, + &eNB->frame_parms, + eNB->common_vars.txdataF[eNB_id], + subframe); + + if (num_pdcch_symbols_2 > num_pdcch_symbols) { + msg("Error: given num_pdcch_symbols not big enough (%d > %d)\n",num_pdcch_symbols_2,num_pdcch_symbols); + exit(-1); + } + + for (k=0; kframe_parms, + eNB->dlsch[k][cw]->harq_processes[0]->nb_rb, + eNB->dlsch[k][cw]->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch[k][cw]->harq_processes[0]->mcs), + eNB->dlsch[k][cw]->harq_processes[0]->Nl, + num_pdcch_symbols, + 0, + subframe, + (transmission_mode<7?0:transmission_mode)); + +#ifdef TBS_FIX // This is for MESH operation!!! + tbs = (double)3*TBStable[get_I_TBS(eNB->dlsch[k][cw]->harq_processes[0]->mcs)][eNB->dlsch[k][cw]->nb_rb-1]/4; +#else + tbs = eNB->dlsch[k][cw]->harq_processes[0]->TBS; +#endif + rate = (double)tbs/(double)coded_bits_per_codeword; + + if ((SNR==snr0) && (trials==0) && (round==0)) + printf("User %d, cw %d: Rate = %f (%f bits/dim) (G %d, TBS %d, mod %d, pdcch_sym %d, ndi %d)\n", + k,cw,rate,rate*get_Qm(eNB->dlsch[k][0]->harq_processes[0]->mcs), + coded_bits_per_codeword, + tbs, + get_Qm(eNB->dlsch[k][0]->harq_processes[0]->mcs), + num_pdcch_symbols, + eNB->dlsch[0][0]->harq_processes[0]->round); + + // use the PMI from previous trial + if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { + eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL); + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL); + + if (n_users>1) + eNB->dlsch[1][0]->harq_processes[0]->pmi_alloc = (eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555); + + /* + if ((trials<10) && (round==0)) { + printf("tx PMI UE0 %x (pmi_feedback %d)\n",pmi2hex_2Ar1(eNB->dlsch[0][0]->pmi_alloc),pmi_feedback); + if (transmission_mode ==5) + printf("tx PMI UE1 %x\n",pmi2hex_2Ar1(eNB->dlsch[1][0]->pmi_alloc)); + } + */ + } + + + start_meas(&eNB->dlsch_encoding_stats); + + if (dlsch_encoding(eNB, + ((cw==0) ? input_buffer0[k] : input_buffer1[k]), + num_pdcch_symbols, + eNB->dlsch[k][cw], + 0,subframe, + &eNB->dlsch_rate_matching_stats, + &eNB->dlsch_turbo_encoding_stats, + &eNB->dlsch_interleaving_stats)<0) + exit(-1); + + /* + if (transmission_mode == 3) { + if (dlsch_encoding(input_buffer1[k], + &eNB->frame_parms, + num_pdcch_symbols, + eNB->dlsch[k][1], + 0,subframe, + &eNB->dlsch_rate_matching_stats, + &eNB->dlsch_turbo_encoding_stats, + &eNB->dlsch_interleaving_stats + )<0) + exit(-1); + } + */ + stop_meas(&eNB->dlsch_encoding_stats); + + eNB->dlsch[k][cw]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI; + start_meas(&eNB->dlsch_scrambling_stats); + dlsch_scrambling(&eNB->frame_parms, + 0, + eNB->dlsch[k][cw], + coded_bits_per_codeword, + 0, + subframe<<1); + stop_meas(&eNB->dlsch_scrambling_stats); + + if (n_frames==1) { + for (s=0; sdlsch[k][cw]->harq_processes[0]->C; s++) { + if (sdlsch[k][cw]->harq_processes[0]->Cminus) + Kr = eNB->dlsch[k][cw]->harq_processes[0]->Kminus; + else + Kr = eNB->dlsch[k][cw]->harq_processes[0]->Kplus; + + Kr_bytes = Kr>>3; + + for (i=0; idlsch[k][cw]->harq_processes[0]->c[s][i]); + } + } + } + + start_meas(&eNB->dlsch_modulation_stats); + re_allocated = dlsch_modulation(eNB, + eNB->common_vars.txdataF[eNB_id], + AMP, + subframe, + num_pdcch_symbols, + eNB->dlsch[k][0], + eNB->dlsch[k][1]); + /* avoid gcc warnings */ + (void)re_allocated; + + stop_meas(&eNB->dlsch_modulation_stats); + /* + if (trials==0 && round==0) + printf("RE count %d\n",re_allocated); + */ + } //n_users + + + generate_pilots(eNB, + eNB->common_vars.txdataF[eNB_id], + AMP, + LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); +/* + //PSS/SSS + if (eNB->frame_parms.frame_type == FDD) { + generate_pss(eNB->common_vars.txdataF[0], + AMP, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==NORMAL) ? 6 : 5, + 0); + generate_sss(eNB->common_vars.txdataF[0], + AMP, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==NORMAL) ? 5 : 4, + 0); + generate_pss(eNB->common_vars.txdataF[0], + AMP, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==NORMAL) ? 6 : 5, + 10); + generate_sss(eNB->common_vars.txdataF[0], + AMP, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==NORMAL) ? 5 : 4, + 10); + } + else if (eNB->frame_parms.frame_type == TDD) { + generate_sss(eNB->common_vars.txdataF[0], + AMP, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==NORMAL) ? 6 : 5, + 1); + generate_pss(eNB->common_vars.txdataF[0], + AMP, + &eNB->frame_parms, + 2, + 2); + generate_sss(eNB->common_vars.txdataF[0], + AMP, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==NORMAL) ? 6 : 5, + 11); + generate_pss(eNB->common_vars.txdataF[0], + AMP, + &eNB->frame_parms, + 2, + 12); + } + + //PBCH + pbch_pdu[2] = 0; + + // FIXME setting pbch_pdu[2] to zero makes the switch statement easier: remove all the or-operators + switch (eNB->frame_parms.N_RB_DL) { + case 6: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (0<<5); + break; + + case 15: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (1<<5); + break; + + case 25: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); + break; + + case 50: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (3<<5); + break; + + case 75: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (4<<5); + break; + + case 100: + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (5<<5); + break; + + default: + // FIXME if we get here, this should be flagged as an error, right? + pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5); + break; + } + + pbch_pdu[2] = (pbch_pdu[2]&0xef) | + ((eNB->frame_parms.phich_config_common.phich_duration << 4)&0x10); + + switch (eNB->frame_parms.phich_config_common.phich_resource) { + case oneSixth: + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (0<<2); + break; + + case half: + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (1<<2); + break; + + case one: + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (2<<2); + break; + + case two: + pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (3<<2); + break; + + default: + // unreachable + break; + + + pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((0>>8)&0x3); + pbch_pdu[1] = 0&0xfc; + pbch_pdu[0] = 0; + } + + generate_pbch(&eNB->lte_eNB_pbch, + eNB->common_vars.txdataF[0], + AMP, + &eNB->frame_parms, + pbch_pdu, + 0&3); +*/ + + start_meas(&eNB->ofdm_mod_stats); +/* + for(i=0;i<20;i++){ + + do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id], + eNB->common_vars.txdata[eNB_id], + i, + &eNB->frame_parms); + } + +*/ + do_OFDM_mod_symbol(&eNB->common_vars, + eNB_id, + (subframe*2), + &eNB->frame_parms); + + do_OFDM_mod_symbol(&eNB->common_vars, + eNB_id, + (subframe*2)+1, + &eNB->frame_parms); + + stop_meas(&eNB->ofdm_mod_stats); + stop_meas(&eNB->phy_proc_tx); + + /* do_OFDM_mod_l(&eNB->common_vars, + eNB_id, + (subframe*2)+2, + &eNB->frame_parms); */ + + if (n_frames==1) { + if (transmission_mode<7) + write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], + nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); + else if (transmission_mode==7) + write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][5][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], + nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); + write_output("txsigF0_BF.m","txsF0_BF", &eNB->common_vars.txdataF_BF[eNB_id][0][0], + eNB->frame_parms.ofdm_symbol_size,1,1); + + if (eNB->frame_parms.nb_antennas_tx>1)// to be updated + write_output("txsigF1.m","txsF1", &eNB->common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], + nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); + } + tx_lev = 0; + + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa] + [subframe*eNB->frame_parms.samples_per_tti], + eNB->frame_parms.samples_per_tti); + } + + tx_lev_dB = (unsigned int) dB_fixed(tx_lev); + + if (n_frames==1) { + printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); + write_output("txsig0.m","txs0", &eNB->common_vars.txdata[eNB_id][0][subframe*eNB->frame_parms.samples_per_tti],eNB->frame_parms.samples_per_tti,1,1); + // write_output("txsig0.m","txs0",&eNB->common_vars.txdata[eNB_id][0][0*eNB->frame_parms.samples_per_tti],eNB->frame_parms.samples_per_tti*10,1,1); + } + } + + /* + else { // Read signal from file + i=0; + while (!feof(input_fd)) { + fscanf(input_fd,"%s %s",input_val_str,input_val_str2); + + if ((i%4)==0) { + ((short*)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL)); + ((short*)txdata[0])[(i/2)+1] = (short)((1<<15)*strtod(input_val_str2,NULL)); + if ((i/4)<100) + printf("sample %d => %e + j%e (%d +j%d)\n",i/4,strtod(input_val_str,NULL),strtod(input_val_str2,NULL),((short*)txdata[0])[i/4],((short*)txdata[0])[(i/4)+1]);//1,input_val2,); + } + i++; + if (i>(FRAME_LENGTH_SAMPLES)) + break; + } + printf("Read in %d samples\n",i/4); + write_output("txsig0.m","txs0", txdata[0],2*frame_parms->samples_per_tti,1,1); + // write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); + tx_lev = signal_energy(&txdata[0][0], + OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); + tx_lev_dB = (unsigned int) dB_fixed(tx_lev); + } + */ + + // printf("Copying tx ..., nsymb %d (n_tx %d), awgn %d\n",nsymb,eNB->frame_parms.nb_antennas_tx,awgn_flag); + for (i=0; i<2*frame_parms->samples_per_tti; i++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + if (awgn_flag == 0) { + s_re[aa][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + s_im[aa][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); + } else { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + if (aa==0) { + r_re[aarx][i] = (double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]; + r_im[aarx][i] = (double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]; + //printf("r[%d][%d]=> %f, %f\n",aarx,i,r_re[aarx][i],r_im[aarx][i]); + } else { + r_re[aarx][i] += (double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]; + r_im[aarx][i] += (double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]; + } + + } + } + } + } + + // Multipath channel + if (awgn_flag == 0) { + multipath_channel(eNB2UE[round],s_re,s_im,r_re,r_im, + 2*frame_parms->samples_per_tti,hold_channel); + + // printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset); + if(abstx==1 && num_rounds>1) + if(round==0 && hold_channel==0) { + random_channel(eNB2UE[1],0); + random_channel(eNB2UE[2],0); + random_channel(eNB2UE[3],0); + } + + if (UE->perfect_ce==1) { + // fill in perfect channel estimates + freq_channel(eNB2UE[round],UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1); + /* + write_output("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8); + write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*UE->frame_parms.N_RB_DL + 1,1,8); + */ + } + } + + if(abstx) { + if (trials==0 && round==0) { + // calculate freq domain representation to compute SINR + freq_channel(eNB2UE[0], NB_RB,2*NB_RB + 1); + // snr=pow(10.0,.1*SNR); + fprintf(csv_fd,"%f,",SNR); + + for (u=0; u<2*NB_RB; u++) { + for (aarx=0; aarxnb_rx; aarx++) { + for (aatx=0; aatxnb_tx; aatx++) { + channelx = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].x; + channely = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + + if(num_rounds>1) { + freq_channel(eNB2UE[1], NB_RB,2*NB_RB + 1); + + for (u=0; u<2*NB_RB; u++) { + for (aarx=0; aarxnb_rx; aarx++) { + for (aatx=0; aatxnb_tx; aatx++) { + channelx = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].x; + channely = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + + freq_channel(eNB2UE[2], NB_RB,2*NB_RB + 1); + + for (u=0; u<2*NB_RB; u++) { + for (aarx=0; aarxnb_rx; aarx++) { + for (aatx=0; aatxnb_tx; aatx++) { + channelx = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].x; + channely = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + + freq_channel(eNB2UE[3], NB_RB,2*NB_RB + 1); + + for (u=0; u<2*NB_RB; u++) { + for (aarx=0; aarxnb_rx; aarx++) { + for (aatx=0; aatxnb_tx; aatx++) { + channelx = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].x; + channely = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].y; + fprintf(csv_fd,"%e+i*(%e),",channelx,channely); + } + } + } + } + } + } + + //AWGN + // This is the SNR on the PDSCH for OFDM symbols without pilots -> rho_A + sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(NB_RB*12)) - SNR - get_pa_dB(eNB->pdsch_config_dedicated); + sigma2 = pow(10,sigma2_dB/10); + + if (n_frames==1) + printf("Sigma2 %f (sigma2_dB %f,%f,%f )\n",sigma2,sigma2_dB,10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(NB_RB*12)),get_pa_dB(eNB->pdsch_config_dedicated)); + + for (i=0; i<2*frame_parms->samples_per_tti; i++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { + // printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]); + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i] = + (short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i+1] = + (short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); + //((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i] = (short) r_re[aa][i]; + //((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i+1] = (short) r_im[aa][i]; + //printf("rxdata[%d][%d]=> %d, %d\n",aa,subframe*UE->frame_parms.samples_per_tti+i,r_re[aa][i],r_im[aa][i]); + } + } + + + // lte_sync_time_init(eNB->frame_parms,common_vars); + // lte_sync_time(common_vars->rxdata, eNB->frame_parms); + // lte_sync_time_free(); + + /* + // optional: read rx_frame from file + if ((rx_frame_file = fopen("rx_frame.dat","r")) == NULL) + { + printf("Cannot open rx_frame.m data file\n"); + exit(0); + } + + result = fread((void *)PHY_vars->rx_vars[0].RX_DMA_BUFFER,4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); + printf("Read %d bytes\n",result); + result = fread((void *)PHY_vars->rx_vars[1].RX_DMA_BUFFER,4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); + printf("Read %d bytes\n",result); + + fclose(rx_frame_file); + */ + + if (n_frames==1) { + printf("RX level in null symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); + printf("RX level in data symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); + printf("rx_level Null symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)))); + printf("rx_level data symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)))); + } + + if (eNB->frame_parms.Ncp == 0) { // normal prefix + pilot1 = 4; + pilot2 = 7; + pilot3 = 11; + } else { // extended prefix + pilot1 = 3; + pilot2 = 6; + pilot3 = 9; + } + + + start_meas(&UE->phy_proc_rx[UE->current_thread_id[subframe]]); + + // Inner receiver scheduling for 3 slots + + for (Ns=(2*subframe); Ns<((2*subframe)+3); Ns++) { + for (l=0; lofdm_demod_stats); + slot_fep(UE, + l, + Ns%20, + 0, + 0, + 0); + stop_meas(&UE->ofdm_demod_stats); + + if (UE->perfect_ce==1) { + if (awgn_flag==0) { + for(k=0; knb_antenna_ports_eNB; aa++) { + for (aarx=0; aarxnb_antennas_rx; aarx++) { + for (i=0; iN_RB_DL*12; i++) { + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); + //printf("x=%d,AMP=%d\n",eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x,AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); + + if (transmission_mode == 7){ + //this should include the BF weights! Will not work for a random channel + if (UE->high_speed_flag==0) { + ((int16_t *)UE->pdsch_vars[UE->current_thread_id[subframe]][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i]=(int16_t)( + eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); + ((int16_t *)UE->pdsch_vars[UE->current_thread_id[subframe]][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1]=(int16_t)( + eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); + //printf("**,x=%d,AMP=%d\n",eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x,AMP); + } else { + ((int16_t *)UE->pdsch_vars[UE->current_thread_id[subframe]][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=(int16_t)( + eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); + ((int16_t *)UE->pdsch_vars[UE->current_thread_id[subframe]][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=(int16_t)( + eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); + + } + } + } + } + } + } + } else { + for(aa=0; aanb_antenna_ports_eNB; aa++) { + for (aarx=0; aarxnb_antennas_rx; aarx++) { + for (i=0; iN_RB_DL*12; i++) { + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; + if (transmission_mode == 7) { + if (UE->high_speed_flag==0){ + ((int16_t *) UE->pdsch_vars[UE->current_thread_id[subframe]][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i]=(short)(AMP); + ((int16_t *) UE->pdsch_vars[UE->current_thread_id[subframe]][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1]=0/2; + } else { + ((int16_t *) UE->pdsch_vars[UE->current_thread_id[subframe]][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=(short)(AMP); + ((int16_t *) UE->pdsch_vars[UE->current_thread_id[subframe]][0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=0/2; + } + } + } + } + } + } + } + + + if ((Ns==((2*subframe))) && (l==0)) { + lte_ue_measurements(UE, + subframe*UE->frame_parms.samples_per_tti, + 1, + 0); + /* + debug_msg("RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), avg rx power %d dB (%d lin), RX gain %d dB\n", + UE->measurements.rx_rssi_dBm[0] - ((UE->frame_parms.nb_antennas_rx==2) ? 3 : 0), + UE->measurements.wideband_cqi_dB[0][0], + UE->measurements.wideband_cqi_dB[0][1], + UE->measurements.wideband_cqi[0][0], + UE->measurements.wideband_cqi[0][1], + UE->measurements.rx_power_avg_dB[0], + UE->measurements.rx_power_avg[0], + UE->rx_total_gain_dB); + debug_msg("N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n", + UE->measurements.n0_power_tot_dBm, + UE->measurements.n0_power_dB[0], + UE->measurements.n0_power_dB[1], + UE->measurements.n0_power[0], + UE->measurements.n0_power[1], + UE->measurements.n0_power_avg_dB, + UE->measurements.n0_power_avg); + debug_msg("Wideband CQI tot %d dB, wideband cqi avg %d dB\n", + UE->measurements.wideband_cqi_tot[0], + UE->measurements.wideband_cqi_avg[0]); + */ + + if (transmission_mode==5 || transmission_mode==6) { + if (pmi_feedback == 1) { + pmi_feedback = 0; + hold_channel = 1; + goto PMI_FEEDBACK; + } + } + + } + + + if ((Ns==(2*subframe)) && (l==pilot1)) {// process symbols 0,1,2 + + if (dci_flag == 1) { + UE->UE_mode[0] = PUSCH; + start_meas(&UE->dlsch_rx_pdcch_stats); + rx_pdcch(&UE->common_vars, + UE->pdcch_vars, + &UE->frame_parms, + 0, // frame + subframe, + 0, + (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, + UE->high_speed_flag, + 0); + stop_meas(&UE->dlsch_rx_pdcch_stats); + // overwrite number of pdcch symbols + UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; + + dci_cnt = dci_decoding_procedure(UE, + dci_alloc_rx,1, + eNB_id, + subframe); + //printf("dci_cnt %d\n",dci_cnt); + + if (dci_cnt==0) { + dlsch_active = 0; + + if (round==0) { + dci_errors++; + round=5; + errs[0]++; + //round_trials[0]++; + + if (n_frames==1) + printf("DCI error trial %d errs[0] %d\n",trials,errs[0]); + } + + // for (i=1;i<=round;i++) + // round_trials[i]--; + // round=5; + } + + for (i=0; idlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->first_tx=1; + + if ((dci_alloc_rx[i].rnti == n_rnti) && + (generate_ue_dlsch_params_from_dci(0, + subframe, + dci_alloc_rx[i].dci_pdu, + dci_alloc_rx[i].rnti, + dci_alloc_rx[i].format, + UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->dlsch[UE->current_thread_id[subframe]][0], + &UE->frame_parms, + UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI==0, + transmission_mode<7?0:transmission_mode))) { + //dump_dci(&UE->frame_parms,&dci_alloc_rx[i]); + coded_bits_per_codeword = get_G(&eNB->frame_parms, + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->nb_rb, + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->rb_alloc_even, + get_Qm(UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->mcs), + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->Nl, + UE->pdcch_vars[0]->num_pdcch_symbols, + 0, + subframe, + (transmission_mode<7?0:transmission_mode)); + /*if (transmission_mode==7 && common_flag==0) + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->mimo_mode = TM7; */ + + /* + rate = (double)dlsch_tbs25[get_I_TBS(UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->mcs)][UE->dlsch[UE->current_thread_id[subframe]][0][0]->nb_rb-1]/(coded_bits_per_codeword); + rate*=get_Qm(UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->mcs); + */ + printf("num_pdcch_symbols %d, G %d, TBS %d\n",UE->pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword, + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->TBS); + + dlsch_active = 1; + } else { + dlsch_active = 0; + + if (round==0) { + dci_errors++; + errs[0]++; + //round_trials[0]++; + round=5; + + if (n_frames==1) + printf("DCI misdetection trial %d\n",trials); + + } + + // for (i=1;i<=round;i++) + // round_trials[i]--; + // round=5; + } + } + } // if dci_flag==1 + else { //dci_flag == 0 + + UE->pdcch_vars[0]->crnti = n_rnti; + UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols; + + if (round == 0) UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->first_tx=1; + + switch (transmission_mode) { + case 1: + case 2: + case 7: + generate_ue_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + (common_flag==0)? C_RNTI : SI_RNTI, + (common_flag==0)? format1 : format1A, + UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->dlsch[UE->current_thread_id[subframe]][0], + &UE->frame_parms, + UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + transmission_mode<7?0:transmission_mode); + /*if(transmission_mode==7 && common_flag==0) + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->mimo_mode = TM7;*/ + break; + + case 3: + // printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->round,UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->first_tx); + generate_ue_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + (common_flag==0)? C_RNTI : SI_RNTI, + (common_flag==0)? format2A : format1A, + UE->dlsch[UE->current_thread_id[subframe]][0], + &UE->frame_parms, + UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + 0); + // printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->round,UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->first_tx); + break; + + case 4: + generate_ue_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu_1[0], + (common_flag==0)? C_RNTI : SI_RNTI, + (common_flag==0)? format2 : format1A, + UE->pdcch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->dlsch[UE->current_thread_id[subframe]][0], + &UE->frame_parms, + UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + 0); + break; + + case 5: + case 6: + generate_ue_dlsch_params_from_dci(0, + subframe, + &DLSCH_alloc_pdu2_1E[0], + C_RNTI, + format1E_2A_M10PRB, + ue->pdcch_vars[UE->current_thread_id[subframe]][eNB_id], + ue->pdsch_vars[UE->current_thread_id[subframe]][eNB_id], + UE->dlsch[UE->current_thread_id[subframe]][0], + &UE->frame_parms, + UE->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI, + 0); + break; + + } + + dlsch_active = 1; + } // if dci_flag == 1 + } + + if (dlsch_active == 1) { + + if (transmission_mode==7) { + if (UE->frame_parms.Ncp==0) { + if ((Ns==(2*subframe) && ((l==3) || (l==6))) || + (Ns==(1+2*subframe) && ((l==2) || (l==5)))) { + if (perfect_ce==0) + lte_dl_bf_channel_estimation(UE,eNB_id,0,Ns,5,l+7*(Ns%2==1)); + } + } else { + msg("Beamforming channel estimation not supported yet for TM7 extented CP.\n"); + } + } + + if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix) + + if ((transmission_mode == 5) && + (UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->dl_power_off==0) && + (UE->use_ia_receiver ==1)) { + dual_stream_UE = 1; + } else { + dual_stream_UE = 0; + } + + + start_meas(&UE->dlsch_llr_stats); + + for (m=UE->pdcch_vars[0]->num_pdcch_symbols; + mpdcch_vars[0]->num_pdcch_symbols)?1:0, + dual_stream_UE, + i_mod, + UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid)==-1) { + dlsch_active = 0; + break; + } + } + + stop_meas(&UE->dlsch_llr_stats); + } + + if ((Ns==(1+(2*subframe))) && (l==pilot1)) { + // process symbols (6 Extended Prefix),7,8,9 + start_meas(&UE->dlsch_llr_stats); + + for (m=pilot2; + mdlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid)==-1) { + dlsch_active=0; + break; + } + } + + stop_meas(&UE->dlsch_llr_stats); + } + + if ((Ns==(2+(2*subframe))) && (l==0)) { // process symbols 10,11,(12,13 Normal Prefix) do deinterleaving for TTI + start_meas(&UE->dlsch_llr_stats); + + for (m=pilot3; + mframe_parms.symbols_per_tti; + m++) { + //printf("m=%d\n",m); + if (rx_pdsch(UE, + PDSCH, + eNB_id, + eNB_id_i, + 0, // frame + subframe, + m, + 0, + dual_stream_UE, + i_mod, + UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid)==-1) { + dlsch_active=0; + break; + } + } + + stop_meas(&UE->dlsch_llr_stats); + } + + + if (test_perf ==0 ) { + if ((n_frames==1) && (Ns==(2+(2*subframe))) && (l==0)) { + write_output("ch0.m","ch0",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8); + + if (eNB->frame_parms.nb_antennas_tx>1) + write_output("ch1.m","ch1",eNB2UE[0]->ch[eNB->frame_parms.nb_antennas_rx],eNB2UE[0]->channel_length,1,8); + + //common vars + //write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); + write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][subframe*UE->frame_parms.samples_per_tti],UE->frame_parms.samples_per_tti,1,1); + //write_output("rxsigF0.m","rxsF0", &UE->common_vars.rxdataF[0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + write_output("rxsigF0.m","rxsF0", &UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + + if (UE->frame_parms.nb_antennas_rx>1) { + write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); + write_output("rxsigF1.m","rxsF1", UE->common_vars..common_vars_rx_data_per_thread[UE->current_thread_id[subframe]]rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + } + + write_output("dlsch00_r0.m","dl00_r0", + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][0][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + + if (UE->frame_parms.nb_antennas_rx>1) + write_output("dlsch01_r0.m","dl01_r0", + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][1][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + + if (eNB->frame_parms.nb_antennas_tx>1) + write_output("dlsch10_r0.m","dl10_r0", + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + + if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) + write_output("dlsch11_r0.m","dl11_r0", + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][3][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); + + //pdsch_vars + dump_dlsch2(UE,eNB_id,subframe,&coded_bits_per_codeword,round); + //dump_dlsch2(UE,eNB_id_i,coded_bits_per_codeword); + write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); + + //pdcch_vars + write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1); + write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1); + + write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1); + write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNB_id]->llr,2400,1,4); + + } + } + } + } + } + + //saving PMI in case of Transmission Mode > 5 + + if(abstx) { + if (trials==0 && round==0 && transmission_mode>=5 && transmission_mode<7) { + for (iii=0; iiipdsch_vars[eNB_id]->pmi_ext[iii]),(UE->pdsch_vars[eNB_id_i]->pmi_ext[iii])); + fprintf(csv_fd,"%x,%x,",(UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->pmi_ext[iii]),(UE->pdsch_vars[eNB_id]->pmi_ext[iii])); + printf("%x ",(UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->pmi_ext[iii])); + } + } + } + + for (int cw=Kmimo-1; cw>=0; cw--) { + UE->dlsch[UE->current_thread_id[subframe]][0][cw]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; + coded_bits_per_codeword = get_G(&eNB->frame_parms, + eNB->dlsch[0][cw]->harq_processes[0]->nb_rb, + eNB->dlsch[0][cw]->harq_processes[0]->rb_alloc, + get_Qm(eNB->dlsch[0][cw]->harq_processes[0]->mcs), + eNB->dlsch[0][cw]->harq_processes[0]->Nl, + num_pdcch_symbols, + 0, + subframe, + (transmission_mode<7?0:transmission_mode)); + + UE->dlsch[UE->current_thread_id[subframe]][0][cw]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][cw]->current_harq_pid]->G = coded_bits_per_codeword; + + + + // calculate uncoded BLER + uncoded_ber=0; + for (i=0;idlsch[0][0]->harq_processes[0]->e[i] != (UE->pdsch_vars[UE->current_thread_id[subframe]][0]->llr[0][i]<0)) { + uncoded_ber_bit[i] = 1; + uncoded_ber++; + } + else + uncoded_ber_bit[i] = 0; + + uncoded_ber/=coded_bits_per_codeword; + avg_ber += uncoded_ber; + + if (n_frames==1) + write_output("uncoded_ber_bit.m","uncoded_ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); + + + start_meas(&UE->dlsch_unscrambling_stats); + dlsch_unscrambling(&UE->frame_parms, + 0, + UE->dlsch[UE->current_thread_id[subframe]][0][cw], + coded_bits_per_codeword, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->llr[cw], + 0, + subframe<<1); + stop_meas(&UE->dlsch_unscrambling_stats); + + start_meas(&UE->dlsch_decoding_stats); + ret = dlsch_decoding(UE, + UE->pdsch_vars[UE->current_thread_id[subframe]][eNB_id]->llr[cw], + &UE->frame_parms, + UE->dlsch[UE->current_thread_id[subframe]][0][cw], + UE->dlsch[UE->current_thread_id[subframe]][0][cw]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][cw]->current_harq_pid], + subframe, + UE->dlsch[UE->current_thread_id[subframe]][0][cw]->current_harq_pid, + 1,llr8_flag); + stop_meas(&UE->dlsch_decoding_stats); + + if (cw==1) { + if (ret <= UE->dlsch[UE->current_thread_id[subframe]][0][cw]->max_turbo_iterations) { + } else { + errs2[round]++; + } + } + } + + + stop_meas(&UE->phy_proc_rx[UE->current_thread_id[subframe]]); + + + if (ret <= UE->dlsch[UE->current_thread_id[subframe]][0][0]->max_turbo_iterations) { + + avg_iter += ret; + iter_trials++; + + if (n_frames==1) + printf("No DLSCH errors found (round %d),uncoded ber %f\n",round,uncoded_ber); + + UE->total_TBS[eNB_id] = UE->total_TBS[eNB_id] + UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->TBS; + TB0_active = 0; + + if (UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) { //try to decode second stream using SIC + /* + for (round = 0 ; round < UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->round ; round++) { + // re-encoding of first stream + dlsch0_ue_harq = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]; + dlsch0_eNB_harq = UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]; + dlsch0_eNB_harq->mimo_mode = LARGE_CDD; + dlsch0_eNB_harq->rb_alloc[0] = dlsch0_ue_harq->rb_alloc_even[0]; + dlsch0_eNB_harq->nb_rb = dlsch0_ue_harq->nb_rb; + dlsch0_eNB_harq->mcs = dlsch0_ue_harq->mcs; + dlsch0_eNB_harq->rvidx = dlsch0_ue_harq->rvidx; + dlsch0_eNB_harq->Nl = dlsch0_ue_harq->Nl; + + dlsch0_eNB_harq->TBS = dlsch0_ue_harq->TBS; + dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off; + dlsch0_eNB_harq->status = dlsch0_ue_harq->status; + + UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->active = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->active; + UE->dlsch[UE->current_thread_id[subframe]][eNB_id]->rnti = UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->rnti; + + dlsch_encoding(UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][eNB_id][0]->current_harq_pid]->b, + &UE->frame_parms, + num_pdcch_symbols, + UE->dlsch[UE->current_thread_id[subframe]][0], + 0,subframe, + &UE->dlsch_rate_matching_stats, + &UE->dlsch_turbo_encoding_stats, + &UE->dlsch_interleaving_stats + ); + + //scrambling + + //modulation + + //stripping (from matched filter output?) + + //detection of second stream + } + */ + } + } else { + errs[round]++; + + avg_iter += ret-1; + iter_trials++; + + if (n_frames==1) { + //if ((n_frames==1) || (SNR>=30)) + printf("DLSCH errors found (round %d), uncoded ber %f\n",round,uncoded_ber); + + for (s=0; sdlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->C; s++) { + if (sdlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Cminus) + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kminus; + else + Kr = UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kplus; + + Kr_bytes = Kr>>3; + + printf("Decoded_output (Segment %d):\n",s); + + for (i=0; idlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->c[s][i],UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->c[s][i]^eNB->dlsch[0][0]->harq_processes[0]->c[s][i]); + } + + sprintf(fname,"rxsig0_r%d.m",round); + sprintf(vname,"rxs0_r%d",round); + write_output(fname,vname, &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1); + sprintf(fname,"rxsigF0_r%d.m",round); + sprintf(vname,"rxs0F_r%d",round); + write_output(fname,vname, &UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].rxdataF[0][0],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1); + + if (UE->frame_parms.nb_antennas_rx>1) { + sprintf(fname,"rxsig1_r%d.m",round); + sprintf(vname,"rxs1_r%d.m",round); + write_output(fname,vname, UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1); + sprintf(fname,"rxsig1F_r%d.m",round); + sprintf(vname,"rxs1F_r%d.m",round); + write_output(fname,vname, UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].rxdataF[1],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1); + } + + sprintf(fname,"dlsch00_r%d.m",round); + sprintf(vname,"dl00_r%d",round); + write_output(fname,vname, + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][0][0]), + UE->frame_parms.ofdm_symbol_size*nsymb,1,1); + + if (UE->frame_parms.nb_antennas_rx>1) { + sprintf(fname,"dlsch01_r%d.m",round); + sprintf(vname,"dl01_r%d",round); + write_output(fname,vname, + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][1][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); + } + + if (eNB->frame_parms.nb_antennas_tx>1) { + sprintf(fname,"dlsch10_r%d.m",round); + sprintf(vname,"dl10_r%d",round); + write_output(fname,vname, + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][2][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); + } + + if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) { + sprintf(fname,"dlsch11_r%d.m",round); + sprintf(vname,"dl11_r%d",round); + write_output(fname,vname, + &(UE->common_vars.common_vars_rx_data_per_thread[UE->current_thread_id[subframe]].dl_ch_estimates[eNB_id][3][0]), + UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1); + } + + //pdsch_vars + dump_dlsch2(UE,eNB_id,subframe,&coded_bits_per_codeword,round); + /* + write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4); + write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0); + write_output("dlsch_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4); + write_output("dlsch_w.m","w",UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0); + */ + + if (round == 3) exit(-1); + } + + // printf("round %d errors %d/%d\n",round,errs[round],trials); + + round++; + // UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->round++; + } + + if (xforms==1) { + phy_scope_UE(form_ue, + UE, + eNB_id, + 0,// UE_id + subframe); + } + + } //round + + // printf("\n"); + + if ((errs[0]>=n_frames/10) && (trials>(n_frames/2))) + break; + + //len = chbch_stats_read(stats_buffer,NULL,0,4096); + //printf("%s\n\n",stats_buffer); + + if (UE->proc.proc_rxtx[UE->current_thread_id[subframe]].frame_rx % 10 == 0) { + UE->bitrate[eNB_id] = (UE->total_TBS[eNB_id] - UE->total_TBS_last[eNB_id])*10; + LOG_D(PHY,"[UE %d] Calculating bitrate: total_TBS = %d, total_TBS_last = %d, bitrate = %d kbits/s\n",UE->Mod_id,UE->total_TBS[eNB_id],UE->total_TBS_last[eNB_id], + UE->bitrate[eNB_id]/1000); + UE->total_TBS_last[eNB_id] = UE->total_TBS[eNB_id]; + } + + + UE->proc.proc_rxtx[UE->current_thread_id[subframe]].frame_rx++; + + /* calculate the total processing time for each packet, + * get the max, min, and number of packets that exceed t>2000us + */ + double t_tx = (double)eNB->phy_proc_tx.p_time/cpu_freq_GHz/1000.0; + double t_tx_ifft = (double)eNB->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_mod = (double)eNB->dlsch_modulation_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; + + + double t_rx = (double)UE->phy_proc_rx[UE->current_thread_id[subframe]].p_time/cpu_freq_GHz/1000.0; + double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_dec = (double)UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0; + + if (t_tx > t_tx_max) + t_tx_max = t_tx; + + if (t_tx < t_tx_min) + t_tx_min = t_tx; + + if (t_rx > t_rx_max) + t_rx_max = t_rx; + + if (t_rx < t_rx_min) + t_rx_min = t_rx; + + if (t_tx > 2000) + n_tx_dropped++; + + if (t_rx > 2000) + n_rx_dropped++; + + push_front(&time_vector_tx, t_tx); + push_front(&time_vector_tx_ifft, t_tx_ifft); + push_front(&time_vector_tx_mod, t_tx_mod); + push_front(&time_vector_tx_enc, t_tx_enc); + + push_front(&time_vector_rx, t_rx); + push_front(&time_vector_rx_fft, t_rx_fft); + push_front(&time_vector_rx_demod, t_rx_demod); + push_front(&time_vector_rx_dec, t_rx_dec); + + + } //trials + + // round_trials[0]: number of code word : goodput the protocol + double table_tx[time_vector_tx.size]; + totable(table_tx, &time_vector_tx); + double table_tx_ifft[time_vector_tx_ifft.size]; + totable(table_tx_ifft, &time_vector_tx_ifft); + double table_tx_mod[time_vector_tx_mod.size]; + totable(table_tx_mod, &time_vector_tx_mod); + double table_tx_enc[time_vector_tx_enc.size]; + totable(table_tx_enc, &time_vector_tx_enc); + + double table_rx[time_vector_rx.size]; + totable(table_rx, &time_vector_rx); + double table_rx_fft[time_vector_rx_fft.size]; + totable(table_rx_fft, &time_vector_rx_fft); + double table_rx_demod[time_vector_rx_demod.size]; + totable(table_rx_demod, &time_vector_rx_demod); + double table_rx_dec[time_vector_rx_dec.size]; + totable(table_rx_dec, &time_vector_rx_dec); + + + // sort table + qsort (table_tx, time_vector_tx.size, sizeof(double), &compare); + qsort (table_rx, time_vector_rx.size, sizeof(double), &compare); + + if (dump_table == 1 ) { + set_component_filelog(USIM); // file located in /tmp/usim.txt + int n; + LOG_F(USIM,"The transmitter raw data: \n"); + + for (n=0; n< time_vector_tx.size; n++) { + printf("%f ", table_tx[n]); + LOG_F(USIM,"%f ", table_tx[n]); + } + + LOG_F(USIM,"\n"); + LOG_F(USIM,"The receiver raw data: \n"); + + for (n=0; n< time_vector_rx.size; n++) { + // printf("%f ", table_rx[n]); + LOG_F(USIM,"%f ", table_rx[n]); + } + + LOG_F(USIM,"\n"); + } + + double tx_median = table_tx[time_vector_tx.size/2]; + double tx_q1 = table_tx[time_vector_tx.size/4]; + double tx_q3 = table_tx[3*time_vector_tx.size/4]; + + double tx_ifft_median = table_tx_ifft[time_vector_tx_ifft.size/2]; + double tx_ifft_q1 = table_tx_ifft[time_vector_tx_ifft.size/4]; + double tx_ifft_q3 = table_tx_ifft[3*time_vector_tx_ifft.size/4]; + + double tx_mod_median = table_tx_mod[time_vector_tx_mod.size/2]; + double tx_mod_q1 = table_tx_mod[time_vector_tx_mod.size/4]; + double tx_mod_q3 = table_tx_mod[3*time_vector_tx_mod.size/4]; + + double tx_enc_median = table_tx_enc[time_vector_tx_enc.size/2]; + double tx_enc_q1 = table_tx_enc[time_vector_tx_enc.size/4]; + double tx_enc_q3 = table_tx_enc[3*time_vector_tx_enc.size/4]; + + double rx_median = table_rx[time_vector_rx.size/2]; + double rx_q1 = table_rx[time_vector_rx.size/4]; + double rx_q3 = table_rx[3*time_vector_rx.size/4]; + + double rx_fft_median = table_rx_fft[time_vector_rx_fft.size/2]; + double rx_fft_q1 = table_rx_fft[time_vector_rx_fft.size/4]; + double rx_fft_q3 = table_rx_fft[3*time_vector_rx_fft.size/4]; + + double rx_demod_median = table_rx_demod[time_vector_rx_demod.size/2]; + double rx_demod_q1 = table_rx_demod[time_vector_rx_demod.size/4]; + double rx_demod_q3 = table_rx_demod[3*time_vector_rx_demod.size/4]; + + double rx_dec_median = table_rx_dec[time_vector_rx_dec.size/2]; + double rx_dec_q1 = table_rx_dec[time_vector_rx_dec.size/4]; + double rx_dec_q3 = table_rx_dec[3*time_vector_rx_dec.size/4]; + + double std_phy_proc_tx=0; + double std_phy_proc_tx_ifft=0; + double std_phy_proc_tx_mod=0; + double std_phy_proc_tx_enc=0; + + double std_phy_proc_rx=0; + double std_phy_proc_rx_fft=0; + double std_phy_proc_rx_demod=0; + double std_phy_proc_rx_dec=0; + + effective_rate = ((double)(round_trials[0]-dci_errors)/((double)round_trials[0] + round_trials[1] + round_trials[2] + round_trials[3])); + + printf("\n**********************SNR = %f dB (tx_lev %f, sigma2_dB %f)**************************\n", + SNR, + (double)tx_lev_dB+10*log10(UE->frame_parms.ofdm_symbol_size/(NB_RB*12)), + sigma2_dB); + + printf("Errors (%d(%d)/%d %d/%d %d/%d %d/%d), Pe = (%e,%e,%e,%e), dci_errors %d/%d, Pe = %e => effective rate %f (%2.1f%%,%f, %f), normalized delay %f (%f)\n", + errs[0], + errs2[0], + round_trials[0], + errs[1], + round_trials[0], + errs[2], + round_trials[0], + errs[3], + round_trials[0], + (double)errs[0]/(round_trials[0]), + (double)errs[1]/(round_trials[0]), + (double)errs[2]/(round_trials[0]), + (double)errs[3]/(round_trials[0]), + dci_errors, + round_trials[0], + (double)dci_errors/(round_trials[0]), + rate*effective_rate, + 100*effective_rate, + rate, + rate*get_Qm(UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[UE->dlsch[UE->current_thread_id[subframe]][0][0]->current_harq_pid]->mcs), + (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ + (double)eNB->dlsch[0][0]->harq_processes[0]->TBS, + (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); + + if (print_perf==1) { + printf("eNB TX function statistics (per 1ms subframe)\n\n"); + std_phy_proc_tx = sqrt((double)eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->phy_proc_tx.trials - pow((double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2)); + printf("Total PHY proc tx :%f us (%d trials)\n",(double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_tx.trials); + printf("|__ Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, + n_tx_dropped); + std_phy_proc_tx_ifft = sqrt((double)eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->ofdm_mod_stats.trials - pow((double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2)); + printf("OFDM_mod time :%f us (%d trials)\n",(double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,eNB->ofdm_mod_stats.trials); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3); + std_phy_proc_tx_mod = sqrt((double)eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->dlsch_modulation_stats.trials - pow((double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH modulation time :%f us (%d trials)\n",(double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_modulation_stats.trials); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3); + printf("DLSCH scrambling time :%f us (%d trials)\n",(double)eNB->dlsch_scrambling_stats.diff/eNB->dlsch_scrambling_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_scrambling_stats.trials); + std_phy_proc_tx_enc = sqrt((double)eNB->dlsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->dlsch_encoding_stats.trials - pow((double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH encoding time :%f us (%d trials)\n",(double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000.0, + eNB->dlsch_modulation_stats.trials); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3); + printf("|__ DLSCH turbo encoding time :%f us (%d trials)\n", + ((double)eNB->dlsch_turbo_encoding_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_turbo_encoding_stats.diff/eNB->dlsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_turbo_encoding_stats.trials); + printf("|__ DLSCH rate-matching time :%f us (%d trials)\n", + ((double)eNB->dlsch_rate_matching_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_rate_matching_stats.diff/eNB->dlsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_rate_matching_stats.trials); + printf("|__ DLSCH sub-block interleaving time :%f us (%d trials)\n", + ((double)eNB->dlsch_interleaving_stats.trials/eNB->dlsch_encoding_stats.trials)*(double) + eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials); + + printf("\n\nUE RX function statistics (per 1ms subframe)\n\n"); + std_phy_proc_rx = sqrt((double)UE->phy_proc_rx[UE->current_thread_id[subframe]].diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->phy_proc_rx[UE->current_thread_id[subframe]].trials - pow((double)UE->phy_proc_rx[UE->current_thread_id[subframe]].diff/UE->phy_proc_rx[UE->current_thread_id[subframe]].trials/cpu_freq_GHz/1000,2)); + printf("Total PHY proc rx :%f us (%d trials)\n",(double)UE->phy_proc_rx[UE->current_thread_id[subframe]].diff/UE->phy_proc_rx[UE->current_thread_id[subframe]].trials/cpu_freq_GHz/1000.0, + UE->phy_proc_rx[UE->current_thread_id[subframe]].trials*2/3); + printf("|__Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, + rx_q1, rx_q3, n_rx_dropped); + std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->ofdm_demod_stats.trials - pow((double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH OFDM demodulation and channel_estimation time :%f us (%d trials)\n",(nsymb)*(double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0, + UE->ofdm_demod_stats.trials*2/3); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3); + printf("|__ DLSCH rx dft :%f us (%d trials)\n", + (nsymb*UE->frame_parms.nb_antennas_rx)*(double)UE->rx_dft_stats.diff/UE->rx_dft_stats.trials/cpu_freq_GHz/1000.0,UE->rx_dft_stats.trials*2/3); + printf("|__ DLSCH channel estimation time :%f us (%d trials)\n", + (4.0)*(double)UE->dlsch_channel_estimation_stats.diff/UE->dlsch_channel_estimation_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_channel_estimation_stats.trials*2/3); + printf("|__ DLSCH frequency offset estimation time :%f us (%d trials)\n", + (4.0)*(double)UE->dlsch_freq_offset_estimation_stats.diff/UE->dlsch_freq_offset_estimation_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_freq_offset_estimation_stats.trials*2/3); + printf("DLSCH rx pdcch :%f us (%d trials)\n",(double)UE->dlsch_rx_pdcch_stats.diff/UE->dlsch_rx_pdcch_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_rx_pdcch_stats.trials); + std_phy_proc_rx_demod = sqrt((double)UE->dlsch_llr_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->dlsch_llr_stats.trials - pow((double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH Channel Compensation and LLR generation time :%f us (%d trials)\n",(3)*(double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_llr_stats.trials/3); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_demod, rx_demod_median, rx_demod_q1, rx_demod_q3); + printf("DLSCH unscrambling time :%f us (%d trials)\n",(double)UE->dlsch_unscrambling_stats.diff/UE->dlsch_unscrambling_stats.trials/cpu_freq_GHz/1000.0, + UE->dlsch_unscrambling_stats.trials); + std_phy_proc_rx_dec = sqrt((double)UE->dlsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->dlsch_decoding_stats.trials - pow((double)UE->dlsch_decoding_stats.diff/UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000,2)); + printf("DLSCH Decoding time (%02.2f Mbit/s, avg iter %1.2f) :%f us (%d trials, max %f)\n", + eNB->dlsch[0][0]->harq_processes[0]->TBS/1000.0,(double)avg_iter/iter_trials, + (double)UE->dlsch_decoding_stats.diff/UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_decoding_stats.trials, + (double)UE->dlsch_decoding_stats.max/cpu_freq_GHz/1000.0); + printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3); + printf("|__ DLSCH Rate Unmatching :%f us (%d trials)\n", + (double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials); + printf("|__ DLSCH Turbo Decoding(%d bits) :%f us (%d trials)\n", + UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Cminus ? UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kminus : UE->dlsch[UE->current_thread_id[subframe]][0][0]->harq_processes[0]->Kplus, + (double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials); + printf(" |__ init %f us (cycles/iter %f, %d trials)\n", + (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/((double)avg_iter/iter_trials), + UE->dlsch_tc_init_stats.trials); + printf(" |__ alpha %f us (cycles/iter %f, %d trials)\n", + (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials*2, + UE->dlsch_tc_alpha_stats.trials); + printf(" |__ beta %f us (cycles/iter %f,%d trials)\n", + (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials*2, + UE->dlsch_tc_beta_stats.trials); + printf(" |__ gamma %f us (cycles/iter %f,%d trials)\n", + (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials*2, + UE->dlsch_tc_gamma_stats.trials); + printf(" |__ ext %f us (cycles/iter %f,%d trials)\n", + (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials*2, + UE->dlsch_tc_ext_stats.trials); + printf(" |__ intl1 %f us (cycles/iter %f,%d trials)\n", + (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials, + UE->dlsch_tc_intl1_stats.trials); + printf(" |__ intl2+HD+CRC %f us (cycles/iter %f,%d trials)\n", + (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0, + (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials, + UE->dlsch_tc_intl2_stats.trials); + } + + if ((transmission_mode != 3) && (transmission_mode != 4)) { + fprintf(bler_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", + SNR, + mcs1, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + rate, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + dci_errors); + } else { + fprintf(bler_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", + SNR, + mcs1,mcs2, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][1]->harq_processes[0]->TBS, + rate, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + dci_errors); + } + + + if(abstx) { //ABSTRACTION + blerr[0] = (double)errs[0]/(round_trials[0]); + + if(num_rounds>1) { + blerr[1] = (double)errs[1]/(round_trials[1]); + blerr[2] = (double)errs[2]/(round_trials[2]); + blerr[3] = (double)errs[3]/(round_trials[3]); + fprintf(csv_fd,"%e,%e,%e,%e;\n",blerr[0],blerr[1],blerr[2],blerr[3]); + } else { + fprintf(csv_fd,"%e;\n",blerr[0]); + } + } //ABStraction + + if ( (test_perf != 0) && (100 * effective_rate > test_perf )) { + //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err\n"); + if ((transmission_mode != 3) && (transmission_mode != 4)) { + fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;", + SNR, + mcs1, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + rate, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + dci_errors); + + //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n"); + fprintf(time_meas_fd,"%f;%d;%d;%f; %2.1f%%;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;", + SNR, + mcs1, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + rate*effective_rate, + 100*effective_rate, + rate, + (double)avg_iter/iter_trials, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + (double)errs[0]/(round_trials[0]), + (double)errs[1]/(round_trials[0]), + (double)errs[2]/(round_trials[0]), + (double)errs[3]/(round_trials[0]), + dci_errors, + round_trials[0], + (double)dci_errors/(round_trials[0]), + (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ + (double)eNB->dlsch[0][0]->harq_processes[0]->TBS, + (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); + } else { + fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;", + SNR, + mcs1,mcs2, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][1]->harq_processes[0]->TBS, + rate, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + dci_errors); + + //fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n"); + fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%2.1f;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;", + SNR, + mcs1,mcs2, + eNB->dlsch[0][0]->harq_processes[0]->TBS, + eNB->dlsch[0][1]->harq_processes[0]->TBS, + rate*effective_rate, + 100*effective_rate, + rate, + (double)avg_iter/iter_trials, + errs[0], + round_trials[0], + errs[1], + round_trials[1], + errs[2], + round_trials[2], + errs[3], + round_trials[3], + (double)errs[0]/(round_trials[0]), + (double)errs[1]/(round_trials[0]), + (double)errs[2]/(round_trials[0]), + (double)errs[3]/(round_trials[0]), + dci_errors, + round_trials[0], + (double)dci_errors/(round_trials[0]), + (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ + (double)eNB->dlsch[0][0]->harq_processes[0]->TBS, + (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); + } + + //fprintf(time_meas_fd,"eNB_PROC_TX(%d); OFDM_MOD(%d); DL_MOD(%d); DL_SCR(%d); DL_ENC(%d); UE_PROC_RX(%d); OFDM_DEMOD_CH_EST(%d); RX_PDCCH(%d); CH_COMP_LLR(%d); DL_USCR(%d); DL_DECOD(%d);\n", + fprintf(time_meas_fd,"%d; %d; %d; %d; %d; %d; %d; %d; %d; %d; %d;", + eNB->phy_proc_tx.trials, + eNB->ofdm_mod_stats.trials, + eNB->dlsch_modulation_stats.trials, + eNB->dlsch_scrambling_stats.trials, + eNB->dlsch_encoding_stats.trials, + UE->phy_proc_rx[UE->current_thread_id[subframe]].trials, + UE->ofdm_demod_stats.trials, + UE->dlsch_rx_pdcch_stats.trials, + UE->dlsch_llr_stats.trials, + UE->dlsch_unscrambling_stats.trials, + UE->dlsch_decoding_stats.trials + ); + fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;", + get_time_meas_us(&eNB->phy_proc_tx), + get_time_meas_us(&eNB->ofdm_mod_stats), + get_time_meas_us(&eNB->dlsch_modulation_stats), + get_time_meas_us(&eNB->dlsch_scrambling_stats), + get_time_meas_us(&eNB->dlsch_encoding_stats), + get_time_meas_us(&UE->phy_proc_rx[UE->current_thread_id[subframe]]), + nsymb*get_time_meas_us(&UE->ofdm_demod_stats), + get_time_meas_us(&UE->dlsch_rx_pdcch_stats), + 3*get_time_meas_us(&UE->dlsch_llr_stats), + get_time_meas_us(&UE->dlsch_unscrambling_stats), + get_time_meas_us(&UE->dlsch_decoding_stats) + ); + //fprintf(time_meas_fd,"eNB_PROC_TX_STD;eNB_PROC_TX_MAX;eNB_PROC_TX_MIN;eNB_PROC_TX_MED;eNB_PROC_TX_Q1;eNB_PROC_TX_Q3;eNB_PROC_TX_DROPPED;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;", std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, n_tx_dropped); + + //fprintf(time_meas_fd,"IFFT;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3); + + //fprintf(time_meas_fd,"MOD;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3); + + //fprintf(time_meas_fd,"ENC;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3); + + + //fprintf(time_meas_fd,"UE_PROC_RX_STD;UE_PROC_RX_MAX;UE_PROC_RX_MIN;UE_PROC_RX_MED;UE_PROC_RX_Q1;UE_PROC_RX_Q3;UE_PROC_RX_DROPPED;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, rx_q1, rx_q3, n_rx_dropped); + + //fprintf(time_meas_fd,"FFT;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3); + + //fprintf(time_meas_fd,"DEMOD;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f;", std_phy_proc_rx_demod,rx_demod_median, rx_demod_q1, rx_demod_q3); + + //fprintf(time_meas_fd,"DEC;\n"); + fprintf(time_meas_fd,"%f;%f;%f;%f\n", std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3); + + + /* + fprintf(time_meas_fd,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;", + eNB->phy_proc_tx.trials, + eNB->ofdm_mod_stats.trials, + eNB->dlsch_modulation_stats.trials, + eNB->dlsch_scrambling_stats.trials, + eNB->dlsch_encoding_stats.trials, + UE->phy_proc_rx[UE->current_thread_id[subframe]].trials, + UE->ofdm_demod_stats.trials, + UE->dlsch_rx_pdcch_stats.trials, + UE->dlsch_llr_stats.trials, + UE->dlsch_unscrambling_stats.trials, + UE->dlsch_decoding_stats.trials); + */ + printf("[passed] effective rate : %f (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate ); + break; + } else if (test_perf !=0 ) { + printf("[continue] effective rate : %f (%2.1f%%,%f)): increase snr \n",rate*effective_rate, 100*effective_rate, rate); + } + + if (((double)errs[0]/(round_trials[0]))<(10.0/n_frames)) + break; + }// SNR + + + } //ch_realization + + + fclose(bler_fd); + + if (test_perf !=0) + fclose (time_meas_fd); + + //fprintf(tikz_fd,"};\n"); + //fclose(tikz_fd); + + if (input_trch_file==1) + fclose(input_trch_fd); + + if (input_file==1) + fclose(input_fd); + + if(abstx) { // ABSTRACTION + fprintf(csv_fd,"];"); + fclose(csv_fd); + } + + if (uncoded_ber_bit) + free(uncoded_ber_bit); + + uncoded_ber_bit = NULL; + + for (k=0; kdlsch[0][i]); + printf("UE %d\n",i); + free_ue_dlsch(UE->dlsch[UE->current_thread_id[subframe]][0][i]); + } + + + printf("Freeing channel I/O\n"); + + for (i=0; i. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include @@ -73,8 +66,7 @@ DCI_PDU *get_dci(uint8_t Mod_id, uint8_t frame, uint8_t subframe) int dci_length_bytes,dci_length; int BCCH_pdu_size_bits, BCCH_pdu_size_bytes; - DCI_pdu.Num_ue_spec_dci = 0; - DCI_pdu.Num_common_dci = 0; + DCI_pdu.Num_dci = 0; if (subframe_select(&PHY_vars_eNB_g[0]->lte_frame_parms, subframe) == SF_S) { return (&DCI_pdu); @@ -288,28 +280,30 @@ DCI_PDU *get_dci(uint8_t Mod_id, uint8_t frame, uint8_t subframe) } // add common dci - DCI_pdu.dci_alloc[0].dci_length = BCCH_pdu_size_bits; - DCI_pdu.dci_alloc[0].L = 2; - DCI_pdu.dci_alloc[0].rnti = SI_RNTI; - DCI_pdu.dci_alloc[0].format = format1A; - DCI_pdu.dci_alloc[0].ra_flag = 0; + DCI_pdu.dci_alloc[0].dci_length = BCCH_pdu_size_bits; + DCI_pdu.dci_alloc[0].L = 2; + DCI_pdu.dci_alloc[0].rnti = SI_RNTI; + DCI_pdu.dci_alloc[0].format = format1A; + DCI_pdu.dci_alloc[0].ra_flag = 0; + DCI_pdu.dci_alloc[0].search_space = DCI_COMMON_SPACE; memcpy((void*)&DCI_pdu.dci_alloc[0].dci_pdu[0], &BCCH_alloc_pdu[0], BCCH_pdu_size_bytes); - DCI_pdu.Num_common_dci++; + DCI_pdu.Num_dci++; // add ue specific dci - DCI_pdu.dci_alloc[k+DCI_pdu.Num_common_dci].dci_length = dci_length; - DCI_pdu.dci_alloc[k+DCI_pdu.Num_common_dci].L = 0; - DCI_pdu.dci_alloc[k+DCI_pdu.Num_common_dci].rnti = n_rnti+k; - DCI_pdu.dci_alloc[k+DCI_pdu.Num_common_dci].format = format1; - DCI_pdu.dci_alloc[k+DCI_pdu.Num_common_dci].ra_flag = 0; - memcpy((void*)&DCI_pdu.dci_alloc[k+DCI_pdu.Num_common_dci].dci_pdu[0], &DLSCH_alloc_pdu_1[k], dci_length_bytes); - DCI_pdu.Num_ue_spec_dci++; + DCI_pdu.dci_alloc[DCI_pdu.Num_dci].dci_length = dci_length; + DCI_pdu.dci_alloc[DCI_pdu.Num_dci].L = 0; + DCI_pdu.dci_alloc[DCI_pdu.Num_dci].rnti = n_rnti+k; + DCI_pdu.dci_alloc[DCI_pdu.Num_dci].format = format1; + DCI_pdu.dci_alloc[DCI_pdu.Num_dci].ra_flag = 0; + DCI_pdu.dci_alloc[DCI_pdu.Num_dci].search_space = DCI_UE_SPACE; + memcpy((void*)&DCI_pdu.dci_alloc[DCI_pdu.Num_dci].dci_pdu[0], &DLSCH_alloc_pdu_1[k], dci_length_bytes); + DCI_pdu.Num_dci++; } DCI_pdu.nCCE = 0; - for (i=0; iNid_cell = Nid_cell; lte_frame_parms->nushift = Nid_cell%6; lte_frame_parms->nb_antennas_tx = (transmission_mode == 1) ? 1 : 2; - lte_frame_parms->nb_antennas_tx_eNB = (transmission_mode == 1) ? 1 : 2; + lte_frame_parms->nb_antenna_ports_eNB = (transmission_mode == 1) ? 1 : 2; lte_frame_parms->nb_antennas_rx = (transmission_mode == 1) ? 1 : 2; lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0; lte_frame_parms->phich_config_common.phich_resource = oneSixth; diff --git a/openair1/SIMULATION/LTE_PHY/gpib_send.c b/openair1/SIMULATION/LTE_PHY/gpib_send.c index fd9543aa21..a8ae48cdfa 100644 --- a/openair1/SIMULATION/LTE_PHY/gpib_send.c +++ b/openair1/SIMULATION/LTE_PHY/gpib_send.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/gpib_send.h b/openair1/SIMULATION/LTE_PHY/gpib_send.h index 4cc568edc8..b83026296a 100644 --- a/openair1/SIMULATION/LTE_PHY/gpib_send.h +++ b/openair1/SIMULATION/LTE_PHY/gpib_send.h @@ -1,29 +1,22 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ void gpib_send(unsigned int gpib_board, unsigned int gpib_device, char* command_string); diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 2691257895..fbe75fed16 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include @@ -38,9 +31,6 @@ #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/vars.h" -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif #include "SCHED/defs.h" #include "SCHED/vars.h" #include "LAYER2/MAC/vars.h" @@ -51,77 +41,17 @@ #include "OCG_vars.h" +#include "unitary_defs.h" -PHY_VARS_eNB *PHY_vars_eNB; -PHY_VARS_UE *PHY_vars_UE; +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; -void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmission_mode,uint8_t extended_prefix_flag,lte_frame_type_t frame_type, uint16_t Nid_cell,uint8_t tdd_config, - uint8_t N_RB_DL,uint8_t osf,uint32_t perfect_ce) -{ +double cpuf; - LTE_DL_FRAME_PARMS *lte_frame_parms; - - - printf("Start lte_param_init\n"); - PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB)); - PHY_vars_UE = malloc(sizeof(PHY_VARS_UE)); - //PHY_config = malloc(sizeof(PHY_CONFIG)); - mac_xface = malloc(sizeof(MAC_xface)); - - srand(1); - randominit(1); - set_taus_seed(1); - - lte_frame_parms = &(PHY_vars_eNB->lte_frame_parms); - - lte_frame_parms->N_RB_DL = N_RB_DL; //50 for 10MHz and 25 for 5 MHz - lte_frame_parms->N_RB_UL = N_RB_DL; - lte_frame_parms->Ncp = extended_prefix_flag; - lte_frame_parms->Nid_cell = Nid_cell; - lte_frame_parms->Nid_cell_mbsfn = 1; - lte_frame_parms->nushift = Nid_cell%6; - lte_frame_parms->nb_antennas_tx = N_tx; - lte_frame_parms->nb_antennas_rx = N_rx; - lte_frame_parms->phich_config_common.phich_resource = oneSixth; - lte_frame_parms->tdd_config = tdd_config; - lte_frame_parms->frame_type = frame_type; - // lte_frame_parms->Csrs = 2; - // lte_frame_parms->Bsrs = 0; - // lte_frame_parms->kTC = 0;44 - // lte_frame_parms->n_RRC = 0; - lte_frame_parms->mode1_flag = (transmission_mode == 1)? 1 : 0; - - init_frame_parms(lte_frame_parms,osf); - - //copy_lte_parms_to_phy_framing(lte_frame_parms, &(PHY_config->PHY_framing)); - - PHY_vars_UE->is_secondary_ue = 0; - PHY_vars_UE->lte_frame_parms = *lte_frame_parms; - PHY_vars_eNB->lte_frame_parms = *lte_frame_parms; - - phy_init_lte_top(lte_frame_parms); - dump_frame_parms(lte_frame_parms); - - PHY_vars_UE->PHY_measurements.n_adj_cells=2; - PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1; - PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2; - - lte_gold_mbsfn(lte_frame_parms,PHY_vars_UE->lte_gold_mbsfn_table,Nid_cell); - lte_gold_mbsfn(lte_frame_parms,PHY_vars_eNB->lte_gold_mbsfn_table,Nid_cell); - - phy_init_lte_ue(PHY_vars_UE,1,0); - phy_init_lte_eNB(PHY_vars_eNB,0,0,0); - - - PHY_vars_UE->perfect_ce = perfect_ce; - printf("Done lte_param_init\n"); - - -} DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2_1E[2]; #define UL_RB_ALLOC 0x1ff; -#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2) +#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2) int main(int argc, char **argv) { @@ -132,10 +62,11 @@ int main(int argc, char **argv) uint8_t snr1set=0; double snr_step=1,input_snr_step=1; int **txdata; - double **s_re,**s_im,**r_re,**r_im; + double s_re0[2*30720],s_im0[2*30720],s_re1[2*30720],s_im1[2*30720]; + double r_re0[2*30720],r_im0[2*30720],r_re1[2*30720],r_im1[2*30720]; + double *s_re[2]={s_re0,s_re1},*s_im[2]={s_im0,s_im1},*r_re[2]={r_re0,r_re1},*r_im[2]={r_im0,r_im1}; double iqim = 0.0; int subframe=1; - int sched_subframe; char fname[40];//, vname[40]; uint8_t transmission_mode = 1,n_tx=1,n_rx=2; uint16_t Nid_cell=0; @@ -185,19 +116,11 @@ int main(int argc, char **argv) #endif */ + cpuf = get_cpu_freq_GHz(); + logInit(); number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; - /* - rxdataF = (int **)malloc16(2*sizeof(int*)); - rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - - rxdata = (int **)malloc16(2*sizeof(int*)); - rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ while ((c = getopt (argc, argv, "ahA:Cp:n:s:S:t:x:y:z:N:F:R:O:dm:i:Y")) != -1) { switch (c) { case 'a': @@ -297,7 +220,6 @@ int main(int argc, char **argv) } - sched_subframe = (subframe+9)%10; if (awgn_flag == 1) channel_model = AWGN; @@ -315,9 +237,18 @@ int main(int argc, char **argv) if (transmission_mode==2) n_tx=2; - lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,tdd_config,N_RB_DL,osf,perfect_ce); - - + lte_param_init(n_tx, + n_tx, + n_rx, + transmission_mode, + extended_prefix_flag, + frame_type, + Nid_cell, + tdd_config, + N_RB_DL, + 0, + osf, + perfect_ce); if (snr1set==0) { if (n_frames==1) @@ -328,7 +259,7 @@ int main(int argc, char **argv) printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &eNB->frame_parms; if (awgn_flag == 0) sprintf(fname,"embms_%d_%d.m",mcs,N_RB_DL); @@ -354,72 +285,56 @@ int main(int argc, char **argv) fflush(fd); - txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[0]; + txdata = eNB->common_vars.txdata[0]; - s_re = malloc(2*sizeof(double*)); - s_im = malloc(2*sizeof(double*)); - r_re = malloc(2*sizeof(double*)); - r_im = malloc(2*sizeof(double*)); nsymb = 12; printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d, AWGN %d\n",NUMBER_OF_OFDM_CARRIERS, frame_parms->Ncp,frame_parms->samples_per_tti,nsymb,awgn_flag); - for (i=0; i<2; i++) { - - s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(s_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - } - - eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 0, 0); // Create transport channel structures for 2 transport blocks (MIMO) - PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0); + eNB->dlsch_MCH = new_eNB_dlsch(1,8,Nsoft,N_RB_DL,0,&eNB->frame_parms); - if (!PHY_vars_eNB->dlsch_eNB_MCH) { + if (!eNB->dlsch_MCH) { printf("Can't get eNB dlsch structures\n"); exit(-1); } - PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0); + UE->dlsch_MCH[0] = new_ue_dlsch(1,8,Nsoft,MAX_TURBO_ITERATIONS_MBSFN,N_RB_DL,0); - PHY_vars_eNB->lte_frame_parms.num_MBSFN_config = 1; - PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; - PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; - PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].fourFrames_flag = 0; - PHY_vars_eNB->lte_frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes - PHY_vars_UE->lte_frame_parms.num_MBSFN_config = 1; - PHY_vars_UE->lte_frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; - PHY_vars_UE->lte_frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; - PHY_vars_UE->lte_frame_parms.MBSFN_config[0].fourFrames_flag = 0; - PHY_vars_UE->lte_frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes + eNB->frame_parms.num_MBSFN_config = 1; + eNB->frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; + eNB->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; + eNB->frame_parms.MBSFN_config[0].fourFrames_flag = 0; + eNB->frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes + UE->frame_parms.num_MBSFN_config = 1; + UE->frame_parms.MBSFN_config[0].radioframeAllocationPeriod = 0; + UE->frame_parms.MBSFN_config[0].radioframeAllocationOffset = 0; + UE->frame_parms.MBSFN_config[0].fourFrames_flag = 0; + UE->frame_parms.MBSFN_config[0].mbsfn_SubframeConfig=0xff; // activate all possible subframes - fill_eNB_dlsch_MCH(PHY_vars_eNB,mcs,1,0,0); - fill_UE_dlsch_MCH(PHY_vars_UE,mcs,1,0,0); + fill_eNB_dlsch_MCH(eNB,mcs,1,0); + fill_UE_dlsch_MCH(UE,mcs,1,0,0); - if (is_pmch_subframe(0,subframe,&PHY_vars_eNB->lte_frame_parms)==0) { + if (is_pmch_subframe(0,subframe,&eNB->frame_parms)==0) { printf("eNB is not configured for MBSFN in subframe %d\n",subframe); exit(-1); - } else if (is_pmch_subframe(0,subframe,&PHY_vars_UE->lte_frame_parms)==0) { + } else if (is_pmch_subframe(0,subframe,&UE->frame_parms)==0) { printf("UE is not configured for MBSFN in subframe %d\n",subframe); exit(-1); } - input_buffer_length = PHY_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS/8; + input_buffer_length = eNB->dlsch_MCH->harq_processes[0]->TBS/8; input_buffer = (unsigned char *)malloc(input_buffer_length+4); memset(input_buffer,0,input_buffer_length+4); @@ -431,9 +346,9 @@ int main(int argc, char **argv) snr_step = input_snr_step; for (SNR=snr0; SNRframe_tx=0; - PHY_vars_eNB->proc[sched_subframe].frame_tx=0; - PHY_vars_eNB->proc[sched_subframe].subframe_tx=subframe; + UE->proc.proc_rxtx[0].frame_tx=0; + eNB->proc.proc_rxtx[0].frame_tx=0; + eNB->proc.proc_rxtx[0].subframe_tx=subframe; errs[0]=0; errs[1]=0; @@ -454,12 +369,11 @@ int main(int argc, char **argv) //if (trials%100==0) //eNB2UE[0]->first_run = 1; eNB2UE->first_run = 1; - memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); - - generate_mch(PHY_vars_eNB,sched_subframe,input_buffer,0); + memset(&eNB->common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); + generate_mch(eNB,&eNB->proc.proc_rxtx[0],input_buffer); - PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0], // input, + PHY_ofdm_mod(eNB->common_vars.txdataF[0][0], // input, txdata[0], // output frame_parms->ofdm_symbol_size, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols @@ -467,33 +381,34 @@ int main(int argc, char **argv) CYCLIC_PREFIX); if (n_frames==1) { - write_output("txsigF0.m","txsF0", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], - nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); - //if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) - //write_output("txsigF1.m","txsF1", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][1][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); + write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[0][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], + nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); + //if (eNB->frame_parms.nb_antennas_tx>1) + //write_output("txsigF1.m","txsF1", &eNB->lte_eNB_common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],nsymb*eNB->frame_parms.ofdm_symbol_size,1,1); } tx_lev = 0; - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - tx_lev += signal_energy(&PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa] - [subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], - PHY_vars_eNB->lte_frame_parms.samples_per_tti); + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa] + [subframe*eNB->frame_parms.samples_per_tti], + eNB->frame_parms.samples_per_tti); } tx_lev_dB = (unsigned int) dB_fixed(tx_lev); if (n_frames==1) { printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); - // write_output("txsig0.m","txs0", &PHY_vars_eNB->lte_eNB_common_vars.txdata[0][0][subframe* PHY_vars_eNB->lte_frame_parms.samples_per_tti], + // write_output("txsig0.m","txs0", &eNB->common_vars.txdata[0][0][subframe* eNB->frame_parms.samples_per_tti], - // PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); + // eNB->frame_parms.samples_per_tti,1,1); } + for (i=0; i<2*frame_parms->samples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - s_re[aa][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[0][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); - s_im[aa][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[0][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)+1]); + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + s_re[aa][i] = ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + s_im[aa][i] = ((double)(((short *)eNB->common_vars.txdata[0][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]); } } @@ -502,39 +417,38 @@ int main(int argc, char **argv) 2*frame_parms->samples_per_tti,hold_channel); //AWGN - sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(NB_RB*12)) - SNR; + sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(NB_RB*12)) - SNR; sigma2 = pow(10,sigma2_dB/10); if (n_frames==1) printf("Sigma2 %f (sigma2_dB %f)\n",sigma2,sigma2_dB); for (i=0; i<2*frame_parms->samples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { //printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti)+2*i] = + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i] = (short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti)+2*i+1] = + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i+1] = (short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); } } for (l=2; l<12; l++) { - slot_fep_mbsfn(PHY_vars_UE, + slot_fep_mbsfn(UE, l, subframe%10, 0, 0); - - if (PHY_vars_UE->perfect_ce==1) { + if (UE->perfect_ce==1) { // fill in perfect channel estimates - freq_channel(eNB2UE,PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1); + freq_channel(eNB2UE,UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1); for(k=0; knb_antennas_tx; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); } } } @@ -543,52 +457,53 @@ int main(int argc, char **argv) if (l==6) for (l2=2;l2<7;l2++) - rx_pmch(PHY_vars_UE, + rx_pmch(UE, 0, subframe%10, l2); if (l==6) for (l2=2;l2<7;l2++) - rx_pmch(PHY_vars_UE, + rx_pmch(UE, 0, subframe%10, l2); if (l==11) for (l2=7;l2<12;l2++) - rx_pmch(PHY_vars_UE, + rx_pmch(UE, 0, subframe%10, l2); } - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G = get_G(&PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->nb_rb, - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->rb_alloc_even, - get_Qm(PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->mcs), - 1,2, - PHY_vars_UE->frame_tx,subframe); - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->Qm = get_Qm(PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->mcs); + UE->dlsch_MCH[0]->harq_processes[0]->G = get_G(&UE->frame_parms, + UE->dlsch_MCH[0]->harq_processes[0]->nb_rb, + UE->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even, + get_Qm(UE->dlsch_MCH[0]->harq_processes[0]->mcs), + 1,2, + UE->proc.proc_rxtx[0].frame_tx,subframe,0); + UE->dlsch_MCH[0]->harq_processes[0]->Qm = get_Qm(UE->dlsch_MCH[0]->harq_processes[0]->mcs); - dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms,1,PHY_vars_UE->dlsch_ue_MCH[0], - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G, - PHY_vars_UE->lte_ue_pdsch_vars_MCH[0]->llr[0],0,subframe<<1); + dlsch_unscrambling(&UE->frame_parms,1,UE->dlsch_MCH[0], + UE->dlsch_MCH[0]->harq_processes[0]->G, + UE->pdsch_vars_MCH[0]->llr[0],0,subframe<<1); - ret = dlsch_decoding(PHY_vars_UE, - PHY_vars_UE->lte_ue_pdsch_vars_MCH[0]->llr[0], - &PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->dlsch_ue_MCH[0], - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0], + ret = dlsch_decoding(UE, + UE->pdsch_vars_MCH[0]->llr[0], + &UE->frame_parms, + UE->dlsch_MCH[0], + UE->dlsch_MCH[0]->harq_processes[0], + trials, subframe, 0,0,0); if (n_frames==1) printf("MCH decoding returns %d\n",ret); - if (ret == (1+PHY_vars_UE->dlsch_ue_MCH[0]->max_turbo_iterations)) + if (ret == (1+UE->dlsch_MCH[0]->max_turbo_iterations)) errs[0]++; - PHY_vars_UE->frame_tx++; - PHY_vars_eNB->proc[sched_subframe].frame_tx++; + UE->proc.proc_rxtx[0].frame_tx++; + eNB->proc.proc_rxtx[0].frame_tx++; } printf("errors %d/%d (Pe %e)\n",errs[round],trials,(double)errs[round]/trials); @@ -612,34 +527,18 @@ int main(int argc, char **argv) if (n_frames==1) { - printf("Dumping PMCH files ( G %d)\n",PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G); - dump_mch(PHY_vars_UE,0, - PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G, + printf("Dumping PMCH files ( G %d)\n",UE->dlsch_MCH[0]->harq_processes[0]->G); + dump_mch(UE,0, + UE->dlsch_MCH[0]->harq_processes[0]->G, subframe); } printf("Freeing dlsch structures\n"); - free_eNB_dlsch(PHY_vars_eNB->dlsch_eNB_MCH); - free_ue_dlsch(PHY_vars_UE->dlsch_ue_MCH[0]); + free_eNB_dlsch(eNB->dlsch_MCH); + free_ue_dlsch(UE->dlsch_MCH[0]); fclose(fd); - printf("Freeing channel I/O\n"); - - for (i=0; i<2; i++) { - free(s_re[i]); - free(s_im[i]); - free(r_re[i]); - free(r_im[i]); - } - - free(s_re); - free(s_im); - free(r_re); - free(r_im); - - // lte_sync_time_free(); - return(0); } diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index 4a2b3f9351..d1e25da5c3 100644 --- a/openair1/SIMULATION/LTE_PHY/pbchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include @@ -39,9 +32,6 @@ #include "PHY/defs.h" #include "PHY/vars.h" -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif #include "SCHED/defs.h" #include "SCHED/vars.h" #include "LAYER2/MAC/vars.h" @@ -52,8 +42,12 @@ #include "OCG_vars.h" -PHY_VARS_eNB *PHY_vars_eNB,*PHY_vars_eNB1,*PHY_vars_eNB2; -PHY_VARS_UE *PHY_vars_UE; +#include "unitary_defs.h" + +PHY_VARS_eNB *eNB,*eNB1,*eNB2; +PHY_VARS_UE *UE; + +double cpuf; #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 @@ -94,9 +88,6 @@ int main(int argc, char **argv) uint8_t extended_prefix_flag=0; int8_t interf1=-21,interf2=-21; LTE_DL_FRAME_PARMS *frame_parms; -#ifdef EMOS - fifo_dump_emos emos_dump; -#endif FILE *input_fd=NULL,*pbch_file_fd=NULL; char input_val_str[50],input_val_str2[50]; @@ -121,19 +112,11 @@ int main(int argc, char **argv) char title[255]; #endif + cpuf = get_cpu_freq_GHz(); + logInit(); number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; - /* - rxdataF = (int **)malloc16(2*sizeof(int*)); - rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - - rxdata = (int **)malloc16(2*sizeof(int*)); - rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:N:F:GR:O:dP:")) != -1) { switch (c) { case 'f': @@ -340,29 +323,29 @@ int main(int argc, char **argv) if (transmission_mode>=2) n_tx=2; - lte_param_init(n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,N_RB_DL,osf); + lte_param_init(n_tx, n_tx,n_rx,transmission_mode,extended_prefix_flag,frame_type,Nid_cell,3,N_RB_DL,0,osf,0); - PHY_vars_eNB1 = malloc(sizeof(PHY_VARS_eNB)); - PHY_vars_eNB2 = malloc(sizeof(PHY_VARS_eNB)); - PHY_vars_UE->PHY_measurements.n_adj_cells=2; - PHY_vars_UE->PHY_measurements.adj_cell_id[0] = Nid_cell+1; - PHY_vars_UE->PHY_measurements.adj_cell_id[1] = Nid_cell+2; + eNB1 = malloc(sizeof(PHY_VARS_eNB)); + eNB2 = malloc(sizeof(PHY_VARS_eNB)); + UE->measurements.n_adj_cells=2; + UE->measurements.adj_cell_id[0] = Nid_cell+1; + UE->measurements.adj_cell_id[1] = Nid_cell+2; for (i=0; i<3; i++) - lte_gold(&PHY_vars_eNB->lte_frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i); + lte_gold(&eNB->frame_parms,UE->lte_gold_table[i],Nid_cell+i); - memcpy((void*)&PHY_vars_eNB1->lte_frame_parms,(void*)&PHY_vars_eNB->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS)); - PHY_vars_eNB1->lte_frame_parms.Nid_cell=Nid_cell+1; - PHY_vars_eNB1->lte_frame_parms.nushift=(Nid_cell+1)%6; - PHY_vars_eNB1->Mod_id=1; + memcpy((void*)&eNB1->frame_parms,(void*)&eNB->frame_parms,sizeof(LTE_DL_FRAME_PARMS)); + eNB1->frame_parms.Nid_cell=Nid_cell+1; + eNB1->frame_parms.nushift=(Nid_cell+1)%6; + eNB1->Mod_id=1; - memcpy((void*)&PHY_vars_eNB2->lte_frame_parms,(void*)&PHY_vars_eNB->lte_frame_parms,sizeof(LTE_DL_FRAME_PARMS)); - PHY_vars_eNB2->lte_frame_parms.Nid_cell=Nid_cell+2; - PHY_vars_eNB2->lte_frame_parms.nushift=(Nid_cell+2)%6; - PHY_vars_eNB2->Mod_id=2; + memcpy((void*)&eNB2->frame_parms,(void*)&eNB->frame_parms,sizeof(LTE_DL_FRAME_PARMS)); + eNB2->frame_parms.Nid_cell=Nid_cell+2; + eNB2->frame_parms.nushift=(Nid_cell+2)%6; + eNB2->Mod_id=2; - phy_init_lte_eNB(PHY_vars_eNB1,0,0,0); - phy_init_lte_eNB(PHY_vars_eNB2,0,0,0); + phy_init_lte_eNB(eNB1,0,0); + phy_init_lte_eNB(eNB2,0,0); #ifdef XFORMS fl_initialize (&argc, argv, NULL, 0, 0); @@ -380,13 +363,13 @@ int main(int argc, char **argv) printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &eNB->frame_parms; - txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[0]; - txdata1 = PHY_vars_eNB1->lte_eNB_common_vars.txdata[0]; - txdata2 = PHY_vars_eNB2->lte_eNB_common_vars.txdata[0]; + txdata = eNB->common_vars.txdata[0]; + txdata1 = eNB1->common_vars.txdata[0]; + txdata2 = eNB2->common_vars.txdata[0]; s_re = malloc(2*sizeof(double*)); @@ -407,8 +390,8 @@ int main(int argc, char **argv) printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d, interf (%d,%d)\n",NUMBER_OF_OFDM_CARRIERS, frame_parms->Ncp,frame_parms->samples_per_tti,nsymb,interf1,interf2); - printf("PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0] = %p\n", - PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0]); + printf("eNB1->common_vars.txdataF[0][0] = %p\n", + eNB1->common_vars.txdataF[0][0]); DLSCH_alloc_pdu2.rah = 0; @@ -423,31 +406,31 @@ int main(int argc, char **argv) // Forget second codeword DLSCH_alloc_pdu2.tpmi = (transmission_mode==6 ? 5 : 0) ; // precoding - eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 0, 0); if (interf1>-20) - eNB2UE1 = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE1 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 4, 0); if (interf2>-20) - eNB2UE2 = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE2 = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 8, 0); @@ -511,47 +494,47 @@ int main(int argc, char **argv) pbch_pdu[1]=1; pbch_pdu[2]=0; - if (PHY_vars_eNB->lte_frame_parms.frame_type == 0) { - generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + if (eNB->frame_parms.frame_type == 0) { + generate_pss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 6 : 5, 0); - generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_sss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 5 : 4, 0); - generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 6 : 5, 10); - generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_sss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 5 : 4, 10); } else { - generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_sss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 6 : 5, 1); - generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, 2, 2); - generate_sss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_sss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, - (PHY_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, + &eNB->frame_parms, + (eNB->frame_parms.Ncp==0) ? 6 : 5, 11); - generate_pss(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pss(eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, 2, 12); @@ -570,23 +553,22 @@ int main(int argc, char **argv) dci_alloc[1].rnti = 0x1234; */ - printf("Generating PBCH for mode1_flag = %d\n", PHY_vars_eNB->lte_frame_parms.mode1_flag); + printf("Generating PBCH for mode1_flag = %d\n", eNB->frame_parms.mode1_flag); - generate_pilots(PHY_vars_eNB, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pilots(eNB, + eNB->common_vars.txdataF[0], AMP, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); /* num_pdcch_symbols = generate_dci_top(1, - 0, dci_alloc, 0, 1024, - &PHY_vars_eNB->lte_frame_parms, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + &eNB->frame_parms, + eNB->common_vars.txdataF[0], 0); */ @@ -601,47 +583,47 @@ int main(int argc, char **argv) dummybuf[1] = dummy1; dummybuf[2] = dummy2; dummybuf[3] = dummy3; - generate_pbch(&PHY_vars_eNB->lte_eNB_pbch, + generate_pbch(&eNB->pbch, (int32_t**)dummybuf, AMP, - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, pbch_pdu, 0); } - generate_pbch(&PHY_vars_eNB->lte_eNB_pbch, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pbch(&eNB->pbch, + eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, pbch_pdu, pbch_phase); /* - generate_pbch(&PHY_vars_eNB->lte_eNB_pbch, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[0], + generate_pbch(&eNB->pbch, + eNB->common_vars.txdataF[0], AMP, - &PHY_vars_eNB->lte_frame_parms, + &eNB->frame_parms, pbch_pdu, 1); */ if (interf1>-20) { /* - generate_pss(PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0], + generate_pss(eNB1->common_vars.txdataF[0], AMP, - &PHY_vars_eNB1->lte_frame_parms, - (PHY_vars_eNB1->lte_frame_parms.Ncp==0)?6:5, + &eNB1->frame_parms, + (eNB1->frame_parms.Ncp==0)?6:5, 0); */ - generate_pilots(PHY_vars_eNB1, - PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0], + generate_pilots(eNB1, + eNB1->common_vars.txdataF[0], AMP, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); - generate_pbch(&PHY_vars_eNB1->lte_eNB_pbch, - PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0], + generate_pbch(&eNB1->pbch, + eNB1->common_vars.txdataF[0], AMP, - &PHY_vars_eNB1->lte_frame_parms, + &eNB1->frame_parms, pbch_pdu, 0); @@ -649,38 +631,38 @@ int main(int argc, char **argv) if (interf2>-20) { /* - generate_pss(PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0], + generate_pss(eNB2->common_vars.txdataF[0], AMP, - &PHY_vars_eNB2->lte_frame_parms, - (PHY_vars_eNB2->lte_frame_parms.Ncp==0)?6:5, + &eNB2->frame_parms, + (eNB2->frame_parms.Ncp==0)?6:5, 0); */ - generate_pilots(PHY_vars_eNB2, - PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0], + generate_pilots(eNB2, + eNB2->common_vars.txdataF[0], AMP, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); - generate_pbch(&PHY_vars_eNB2->lte_eNB_pbch, - PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0], + generate_pbch(&eNB2->pbch, + eNB2->common_vars.txdataF[0], AMP, - &PHY_vars_eNB2->lte_frame_parms, + &eNB2->frame_parms, pbch_pdu, 0); } - // write_output("pilotsF.m","rsF",txdataF[0],lte_frame_parms->ofdm_symbol_size,1,1); + // write_output("pilotsF.m","rsF",txdataF[0],frame_parms->ofdm_symbol_size,1,1); - write_output("txsigF0.m","txsF0", PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + write_output("txsigF0.m","txsF0", eNB->common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) - write_output("txsigF1.m","txsF1", PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + if (eNB->frame_parms.nb_antennas_tx>1) + write_output("txsigF1.m","txsF1", eNB->common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); tx_lev = 0; tx_lev1 = 0; @@ -689,16 +671,16 @@ int main(int argc, char **argv) - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) - PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][aa], // input, + PHY_ofdm_mod(eNB->common_vars.txdataF[0][aa], // input, txdata[aa], // output frame_parms->ofdm_symbol_size, LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, // number of symbols frame_parms->nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { - normal_prefix_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][aa], + normal_prefix_mod(eNB->common_vars.txdataF[0][aa], txdata[aa], LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb, frame_parms); @@ -709,17 +691,17 @@ int main(int argc, char **argv) } if (interf1>-20) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) - PHY_ofdm_mod(PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][aa], // input, - PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][aa], // output + PHY_ofdm_mod(eNB1->common_vars.txdataF[0][aa], // input, + eNB1->common_vars.txdata[0][aa], // output frame_parms->ofdm_symbol_size, 2*nsymb, // number of symbols frame_parms->nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { - normal_prefix_mod(PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][aa], - PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][aa], + normal_prefix_mod(eNB1->common_vars.txdataF[0][aa], + eNB1->common_vars.txdata[0][aa], 2*nsymb, frame_parms); } @@ -728,24 +710,24 @@ int main(int argc, char **argv) OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); } - write_output("txsigF0_1.m","txsF0_1", PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + write_output("txsigF0_1.m","txsF0_1", eNB1->common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); - if (PHY_vars_eNB1->lte_frame_parms.nb_antennas_tx>1) - write_output("txsigF1_1.m","txsF1_1", PHY_vars_eNB1->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + if (eNB1->frame_parms.nb_antennas_tx>1) + write_output("txsigF1_1.m","txsF1_1", eNB1->common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); } if (interf2>-20) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) - PHY_ofdm_mod(PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][aa], // input, - PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][aa], // output + PHY_ofdm_mod(eNB2->common_vars.txdataF[0][aa], // input, + eNB2->common_vars.txdata[0][aa], // output frame_parms->ofdm_symbol_size, 2*nsymb, // number of symbols frame_parms->nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { - normal_prefix_mod(PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][aa], - PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][aa], + normal_prefix_mod(eNB2->common_vars.txdataF[0][aa], + eNB2->common_vars.txdata[0][aa], 2*nsymb, frame_parms); } @@ -754,10 +736,10 @@ int main(int argc, char **argv) OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); } - write_output("txsigF0_2.m","txsF0_2", PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + write_output("txsigF0_2.m","txsF0_2", eNB2->common_vars.txdataF[0][0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); - if (PHY_vars_eNB2->lte_frame_parms.nb_antennas_tx>1) - write_output("txsigF1_2.m","txsF1_2", PHY_vars_eNB2->lte_eNB_common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); + if (eNB2->frame_parms.nb_antennas_tx>1) + write_output("txsigF1_2.m","txsF1_2", eNB2->common_vars.txdataF[0][1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); } // tx_lev_dB = (unsigned int) dB_fixed(tx_lev); @@ -767,15 +749,15 @@ int main(int argc, char **argv) if (frame_parms->nb_antennas_tx>1) write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); - write_output("txsig0_1.m","txs0_1", PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); + write_output("txsig0_1.m","txs0_1", eNB1->common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); if (frame_parms->nb_antennas_tx>1) - write_output("txsig1_1.m","txs1_1", PHY_vars_eNB1->lte_eNB_common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); + write_output("txsig1_1.m","txs1_1", eNB1->common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); - write_output("txsig0_2.m","txs0_2", PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); + write_output("txsig0_2.m","txs0_2", eNB2->common_vars.txdata[0][0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); if (frame_parms->nb_antennas_tx>1) - write_output("txsig1_2.m","txs1_2", PHY_vars_eNB2->lte_eNB_common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); + write_output("txsig1_2.m","txs1_2", eNB2->common_vars.txdata[0][1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); } else { //read in from file i=0; @@ -811,7 +793,7 @@ int main(int argc, char **argv) // multipath channel for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); @@ -872,7 +854,7 @@ int main(int argc, char **argv) } } - sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(12*NB_RB)) - SNR; + sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(12*NB_RB)) - SNR; if (n_frames==1) printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %f,%f,%f\n",sigma2_dB,SNR, @@ -894,20 +876,20 @@ int main(int argc, char **argv) for (n_trials=0; n_trialslte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { if (n_trials==0) { r_re[aa][i] += (pow(10.0,.05*interf1)*r_re1[aa][i] + pow(10.0,.05*interf2)*r_re2[aa][i]); r_im[aa][i] += (pow(10.0,.05*interf1)*r_im1[aa][i] + pow(10.0,.05*interf2)*r_im2[aa][i]); } - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) UE->common_vars.rxdata[aa])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } } if (n_frames==1) { printf("rx_level data symbol %f\n", - 10*log10(signal_energy(&PHY_vars_UE->lte_ue_common_vars.rxdata[0][frame_parms->samples_per_tti/2],4*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))); + 10*log10(signal_energy(&UE->common_vars.rxdata[0][frame_parms->samples_per_tti/2],4*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))); } @@ -919,10 +901,10 @@ int main(int argc, char **argv) exit(0); } - result = fread((void *)PHY_vars_UE->lte_ue_common_vars.rxdata[0],4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); + result = fread((void *)UE->common_vars.rxdata[0],4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); printf("Read %d bytes\n",result); - if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) { - result = fread((void *)PHY_vars_UE->lte_ue_common_vars.rxdata[1],4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); + if (UE->frame_parms.nb_antennas_rx>1) { + result = fread((void *)UE->common_vars.rxdata[1],4,FRAME_LENGTH_COMPLEX_SAMPLES,rx_frame_file); printf("Read %d bytes\n",result); } @@ -930,41 +912,43 @@ int main(int argc, char **argv) */ - for (l=0; llte_frame_parms.symbols_per_tti; l++) { + for (l=0; lframe_parms.symbols_per_tti; l++) { - // subframe_offset = (l/PHY_vars_eNB->lte_frame_parms.symbols_per_tti)*PHY_vars_eNB->lte_frame_parms.samples_per_tti; + // subframe_offset = (l/eNB->frame_parms.symbols_per_tti)*eNB->frame_parms.samples_per_tti; // printf("subframe_offset = %d\n",subframe_offset); - slot_fep(PHY_vars_UE, - l%(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2), - l/(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2), + slot_fep(UE, + l%(eNB->frame_parms.symbols_per_tti/2), + l/(eNB->frame_parms.symbols_per_tti/2), 0, 0, 0); if (l==0) { - lte_ue_measurements(PHY_vars_UE, + lte_ue_measurements(UE, 0, 1, + 0, + 0, 0); /* if (trial%100 == 0) { msg("[PHY_PROCEDURES_LTE] frame %d, RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), RX gain %d dB\n", trial, - PHY_vars_UE->PHY_measurements.rx_rssi_dBm[0], - PHY_vars_UE->PHY_measurements.rx_power_dB[0][0], - PHY_vars_UE->PHY_measurements.rx_power_dB[0][1], - PHY_vars_UE->PHY_measurements.rx_power[0][0], - PHY_vars_UE->PHY_measurements.rx_power[0][1], - PHY_vars_UE->rx_total_gain_dB); + UE->measurements.rx_rssi_dBm[0], + UE->measurements.rx_power_dB[0][0], + UE->measurements.rx_power_dB[0][1], + UE->measurements.rx_power[0][0], + UE->measurements.rx_power[0][1], + UE->rx_total_gain_dB); msg("[PHY_PROCEDURES_LTE] frame %d, N0 digital (%d, %d) dB, linear (%d, %d)\n", trial, - PHY_vars_UE->PHY_measurements.n0_power_dB[0], - PHY_vars_UE->PHY_measurements.n0_power_dB[1], - PHY_vars_UE->PHY_measurements.n0_power[0], - PHY_vars_UE->PHY_measurements.n0_power[1]); + UE->measurements.n0_power_dB[0], + UE->measurements.n0_power_dB[1], + UE->measurements.n0_power[0], + UE->measurements.n0_power[1]); msg("[PHY_PROCEDURES_LTE] frame %d, freq_offset_filt = %d\n", trial, freq_offset); @@ -973,47 +957,47 @@ int main(int argc, char **argv) */ } - if (l==((PHY_vars_eNB->lte_frame_parms.Ncp==0)?4:3)) { + if (l==((eNB->frame_parms.Ncp==0)?4:3)) { //sprintf(fname,"dl_ch00_%d.m",l); //sprintf(vname,"dl_ch00_%d",l); - //write_output(fname,vname,&(lte_ue_common_vars->dl_ch_estimates[0][lte_frame_parms->ofdm_symbol_size*(l%6)]),lte_frame_parms->ofdm_symbol_size,1,1); + //write_output(fname,vname,&(common_vars->dl_ch_estimates[0][frame_parms->ofdm_symbol_size*(l%6)]),frame_parms->ofdm_symbol_size,1,1); - lte_est_freq_offset(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0], - &PHY_vars_UE->lte_frame_parms, + lte_est_freq_offset(UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].dl_ch_estimates[0], + &UE->frame_parms, l, &freq_offset, 1); } - if (l==((PHY_vars_eNB->lte_frame_parms.Ncp==0)?10:9)) { + if (l==((eNB->frame_parms.Ncp==0)?10:9)) { for (frame_mod4=0; frame_mod4<4; frame_mod4++) { - pbch_tx_ant = rx_pbch(&PHY_vars_UE->lte_ue_common_vars, - PHY_vars_UE->lte_ue_pbch_vars[0], - &PHY_vars_UE->lte_frame_parms, + pbch_tx_ant = rx_pbch(&UE->common_vars, + UE->pbch_vars[0], + &UE->frame_parms, 0, SISO, - PHY_vars_UE->high_speed_flag, + UE->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) { - PHY_vars_UE->lte_frame_parms.mode1_flag = 1; + UE->frame_parms.mode1_flag = 1; break; if (pbch_phase != frame_mod4) printf("pbch_phase different!!!\n"); } - pbch_tx_ant = rx_pbch(&PHY_vars_UE->lte_ue_common_vars, - PHY_vars_UE->lte_ue_pbch_vars[0], - &PHY_vars_eNB->lte_frame_parms, + pbch_tx_ant = rx_pbch(&UE->common_vars, + UE->pbch_vars[0], + &eNB->frame_parms, 0, ALAMOUTI, - PHY_vars_UE->high_speed_flag, + UE->high_speed_flag, frame_mod4); if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) { - PHY_vars_UE->lte_frame_parms.mode1_flag = 0; + UE->frame_parms.mode1_flag = 0; n_alamouti++; break; } @@ -1023,7 +1007,7 @@ int main(int argc, char **argv) if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) { if (n_frames==1) msg("pbch decoded sucessfully mode1_flag %d, frame_mod4 %d, tx_ant %d!\n", - PHY_vars_UE->lte_frame_parms.mode1_flag,frame_mod4,pbch_tx_ant); + UE->frame_parms.mode1_flag,frame_mod4,pbch_tx_ant); } else { n_errors++; n_errors2++; @@ -1036,7 +1020,7 @@ int main(int argc, char **argv) #ifdef XFORMS phy_scope_UE(form_ue, - PHY_vars_UE, + UE, 0,0,1); #endif @@ -1066,16 +1050,16 @@ int main(int argc, char **argv) if (n_frames==1) { - write_output("H00.m","h00",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H00.m","h00",&(UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); if (n_tx==2) - write_output("H10.m","h10",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H10.m","h10",&(UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); - write_output("rxsig0.m","rxs0", PHY_vars_UE->lte_ue_common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); - write_output("rxsigF0.m","rxsF0", PHY_vars_UE->lte_ue_common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); - write_output("PBCH_rxF0_ext.m","pbch0_ext",PHY_vars_UE->lte_ue_pbch_vars[0]->rxdataF_ext[0],12*4*6,1,1); - write_output("PBCH_rxF0_comp.m","pbch0_comp",PHY_vars_UE->lte_ue_pbch_vars[0]->rxdataF_comp[0],12*4*6,1,1); - write_output("PBCH_rxF_llr.m","pbch_llr",PHY_vars_UE->lte_ue_pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); + write_output("rxsig0.m","rxs0", UE->common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); + write_output("rxsigF0.m","rxsF0", UE->common_vars.common_vars_rx_data_per_thread[/*subframe*/0&0x1].rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); + write_output("PBCH_rxF0_ext.m","pbch0_ext",UE->pbch_vars[0]->rxdataF_ext[0],12*4*6,1,1); + write_output("PBCH_rxF0_comp.m","pbch0_comp",UE->pbch_vars[0]->rxdataF_comp[0],12*4*6,1,1); + write_output("PBCH_rxF_llr.m","pbch_llr",UE->pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); } diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index 4691875d3a..ef0e221491 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include @@ -35,44 +28,42 @@ #include "PHY/defs.h" #include "PHY/vars.h" -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif #include "SCHED/defs.h" #include "SCHED/vars.h" #include "LAYER2/MAC/vars.h" #include "OCG_vars.h" - #ifdef XFORMS #include "PHY/TOOLS/lte_phy_scope.h" #endif +#include "unitary_defs.h" #define N_TRIALS 100 -PHY_VARS_eNB *PHY_vars_eNB,*PHY_vars_eNB1,*PHY_vars_eNB2; -PHY_VARS_UE *PHY_vars_UE; +PHY_VARS_eNB *eNB,*eNB1,*eNB2; +PHY_VARS_UE *UE; #define UL_RB_ALLOC 0x1ff; -#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2) +#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2) #define DLSCH_RB_ALLOC ((uint16_t)0x1fbf) // igore DC component,RB13 +double cpuf; + DCI_PDU DCI_pdu; -DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2Lcommon, uint8_t format_selector, uint32_t rnti) +DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2Lcommon, DCI_format_t format_selector[MAX_NUM_DCI], uint8_t num_dci, uint32_t rnti) { uint32_t BCCH_alloc_pdu[2]; uint32_t DLSCH_alloc_pdu[2]; uint32_t UL_alloc_pdu[2]; - int i; + int ind; int dci_length_bytes=0,dci_length=0; int BCCH_pdu_size_bits=0, BCCH_pdu_size_bytes=0; int UL_pdu_size_bits=0, UL_pdu_size_bytes=0; int mcs = 3; - DCI_pdu.Num_ue_spec_dci = 0; - DCI_pdu.Num_common_dci = 0; + DCI_pdu.Num_dci = 0; if (lte_frame_parms->frame_type == TDD) { switch (lte_frame_parms->N_RB_DL) { @@ -90,7 +81,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI1A_1_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->type = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->vrb_type = 0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 0, 4); + ((DCI1A_1_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 0, 4); ((DCI1A_1_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->ndi = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rv = 0; ((DCI1A_1_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->mcs = 2; @@ -101,7 +92,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI0_1_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->type = 0; ((DCI0_1_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->hopping = 0; - ((DCI0_1_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI0_1_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI0_1_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->mcs = mcs; ((DCI0_1_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->ndi = 1; ((DCI0_1_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->TPC = 2; @@ -116,7 +107,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 dci_length = sizeof_DCI1_5MHz_TDD_t; dci_length_bytes = sizeof(DCI1_5MHz_TDD_t); ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu[0])->rah = 0; - ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu[0])->mcs = mcs; ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu[0])->harq_pid = 0; ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu[0])->ndi = 1; @@ -126,7 +117,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI1A_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->type = 1; ((DCI1A_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->vrb_type = 0; - ((DCI1A_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 18, 4); + ((DCI1A_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 18, 4); ((DCI1A_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->ndi = 1; ((DCI1A_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rv = 0; ((DCI1A_5MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->mcs = 2; @@ -137,7 +128,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->type = 0; ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->hopping = 0; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->mcs = mcs; ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->ndi = 1; ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->TPC = 2; @@ -152,7 +143,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 dci_length = sizeof_DCI1_10MHz_TDD_t; dci_length_bytes = sizeof(DCI1_10MHz_TDD_t); ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu[0])->rah = 0; - ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu[0])->mcs = mcs; ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu[0])->harq_pid = 0; ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu[0])->ndi = 1; @@ -162,7 +153,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI1A_10MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->type = 1; ((DCI1A_10MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->vrb_type = 0; - ((DCI1A_10MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 30, 4); + ((DCI1A_10MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 30, 4); ((DCI1A_10MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->ndi = 1; ((DCI1A_10MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rv = 0; ((DCI1A_10MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->mcs = 2; @@ -173,7 +164,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->type = 0; ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->hopping = 0; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->mcs = mcs; ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->ndi = 1; ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->TPC = 2; @@ -188,7 +179,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 dci_length = sizeof_DCI1_20MHz_TDD_t; dci_length_bytes = sizeof(DCI1_20MHz_TDD_t); ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu[0])->rah = 0; - ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu[0])->mcs = mcs; ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu[0])->harq_pid = 0; ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu[0])->ndi = 1; @@ -198,7 +189,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI1A_20MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->type = 1; ((DCI1A_20MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->vrb_type = 0; - ((DCI1A_20MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 70, 4); + ((DCI1A_20MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 70, 4); ((DCI1A_20MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->ndi = 1; ((DCI1A_20MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->rv = 0; ((DCI1A_20MHz_TDD_1_6_t*)&BCCH_alloc_pdu[0])->mcs = 2; @@ -209,7 +200,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->type = 0; ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->hopping = 0; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->mcs = mcs; ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->ndi = 1; ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu[0])->TPC = 2; @@ -226,7 +217,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 dci_length = sizeof_DCI1_1_5MHz_FDD_t; dci_length_bytes = sizeof(DCI1_1_5MHz_FDD_t); ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rah = 0; - ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->mcs = mcs; ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->harq_pid = 0; ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->ndi = 1; @@ -235,7 +226,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI1A_1_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->type = 1; ((DCI1A_1_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->vrb_type = 0; - ((DCI1A_1_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 0, 4); + ((DCI1A_1_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 0, 4); ((DCI1A_1_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->ndi = 1; ((DCI1A_1_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->rv = 0; ((DCI1A_1_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->mcs = 2; @@ -246,7 +237,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI0_1_5MHz_FDD_t*)&UL_alloc_pdu[0])->type = 0; ((DCI0_1_5MHz_FDD_t*)&UL_alloc_pdu[0])->hopping = 0; - ((DCI0_1_5MHz_FDD_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI0_1_5MHz_FDD_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI0_1_5MHz_FDD_t*)&UL_alloc_pdu[0])->mcs = mcs; ((DCI0_1_5MHz_FDD_t*)&UL_alloc_pdu[0])->ndi = 1; ((DCI0_1_5MHz_FDD_t*)&UL_alloc_pdu[0])->TPC = 2; @@ -260,7 +251,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 dci_length = sizeof_DCI1_5MHz_FDD_t; dci_length_bytes = sizeof(DCI1_5MHz_FDD_t); ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rah = 0; - ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->mcs = mcs; ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->harq_pid = 0; ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu[0])->ndi = 1; @@ -269,7 +260,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI1A_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->type = 1; ((DCI1A_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->vrb_type = 0; - ((DCI1A_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 18, 4); + ((DCI1A_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 18, 4); ((DCI1A_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->ndi = 1; ((DCI1A_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->rv = 0; ((DCI1A_5MHz_FDD_t*)&BCCH_alloc_pdu[0])->mcs = 2; @@ -280,7 +271,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu[0])->type = 0; ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu[0])->hopping = 0; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu[0])->mcs = mcs; ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu[0])->ndi = 1; ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu[0])->TPC = 2; @@ -294,7 +285,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 dci_length = sizeof_DCI1_10MHz_FDD_t; dci_length_bytes = sizeof(DCI1_10MHz_FDD_t); ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rah = 0; - ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu[0])->mcs = mcs; ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu[0])->harq_pid = 0; ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu[0])->ndi = 1; @@ -303,7 +294,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI1A_10MHz_FDD_t*)&BCCH_alloc_pdu[0])->type = 1; ((DCI1A_10MHz_FDD_t*)&BCCH_alloc_pdu[0])->vrb_type = 0; - ((DCI1A_10MHz_FDD_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 30, 4); + ((DCI1A_10MHz_FDD_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 30, 4); ((DCI1A_10MHz_FDD_t*)&BCCH_alloc_pdu[0])->ndi = 1; ((DCI1A_10MHz_FDD_t*)&BCCH_alloc_pdu[0])->rv = 0; ((DCI1A_10MHz_FDD_t*)&BCCH_alloc_pdu[0])->mcs = 2; @@ -314,7 +305,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu[0])->type = 0; ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu[0])->hopping = 0; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu[0])->mcs = mcs; ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu[0])->ndi = 1; ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu[0])->TPC = 2; @@ -328,7 +319,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 dci_length = sizeof_DCI1_20MHz_FDD_t; dci_length_bytes = sizeof(DCI1_20MHz_FDD_t); ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rah = 0; - ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu[0])->mcs = mcs; ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu[0])->harq_pid = 0; ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu[0])->ndi = 1; @@ -337,7 +328,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI1A_20MHz_FDD_t*)&BCCH_alloc_pdu[0])->type = 1; ((DCI1A_20MHz_FDD_t*)&BCCH_alloc_pdu[0])->vrb_type = 0; - ((DCI1A_20MHz_FDD_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 70, 4); + ((DCI1A_20MHz_FDD_t*)&BCCH_alloc_pdu[0])->rballoc = computeRIV(lte_frame_parms->N_RB_DL, 70, 4); ((DCI1A_20MHz_FDD_t*)&BCCH_alloc_pdu[0])->ndi = 1; ((DCI1A_20MHz_FDD_t*)&BCCH_alloc_pdu[0])->rv = 0; ((DCI1A_20MHz_FDD_t*)&BCCH_alloc_pdu[0])->mcs = 2; @@ -348,7 +339,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu[0])->type = 0; ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu[0])->hopping = 0; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; + ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu[0])->rballoc = DLSCH_RB_ALLOC; ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu[0])->mcs = mcs; ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu[0])->ndi = 1; ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu[0])->TPC = 2; @@ -360,39 +351,43 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,uint8_t log2L, uint8_t log2 } } + for (ind = 0; indN_RB_DL >= 25) { - // add ue specific dci - DCI_pdu.dci_alloc[1].dci_length = dci_length; - DCI_pdu.dci_alloc[1].L = log2L; - DCI_pdu.dci_alloc[1].rnti = rnti; - DCI_pdu.dci_alloc[1].format = format1; - DCI_pdu.dci_alloc[1].ra_flag = 0; - memcpy((void*)&DCI_pdu.dci_alloc[1].dci_pdu[0], &DLSCH_alloc_pdu[0], dci_length_bytes); - DCI_pdu.Num_ue_spec_dci++; - - if (lte_frame_parms->N_RB_DL >= 50) { - DCI_pdu.dci_alloc[2].dci_length = UL_pdu_size_bits; - DCI_pdu.dci_alloc[2].L = log2L; - DCI_pdu.dci_alloc[2].rnti = rnti; - DCI_pdu.dci_alloc[2].format = format0; - DCI_pdu.dci_alloc[2].ra_flag = 0; - memcpy((void*)&DCI_pdu.dci_alloc[0].dci_pdu[0], &UL_alloc_pdu[0], UL_pdu_size_bytes); - DCI_pdu.Num_ue_spec_dci++; + if (format_selector[ind]==format1) { + DCI_pdu.dci_alloc[ind].dci_length = dci_length; + DCI_pdu.dci_alloc[ind].L = log2L; + DCI_pdu.dci_alloc[ind].rnti = rnti; + DCI_pdu.dci_alloc[ind].format = format1; + DCI_pdu.dci_alloc[ind].ra_flag = 0; + DCI_pdu.dci_alloc[ind].search_space = DCI_UE_SPACE; + memcpy((void*)&DCI_pdu.dci_alloc[ind].dci_pdu[0], &DLSCH_alloc_pdu[0], dci_length_bytes); + DCI_pdu.Num_dci++; + } + + if (format_selector[ind]==format0) { + DCI_pdu.dci_alloc[ind].dci_length = UL_pdu_size_bits; + DCI_pdu.dci_alloc[ind].L = log2L; + DCI_pdu.dci_alloc[ind].rnti = rnti; + DCI_pdu.dci_alloc[ind].format = format0; + DCI_pdu.dci_alloc[ind].ra_flag = 0; + DCI_pdu.dci_alloc[ind].search_space = DCI_UE_SPACE; + memcpy((void*)&DCI_pdu.dci_alloc[ind].dci_pdu[0], &UL_alloc_pdu[0], UL_pdu_size_bytes); + DCI_pdu.Num_dci++; } } - - - - return(&DCI_pdu); } @@ -408,7 +403,7 @@ int main(int argc, char **argv) double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1; int **txdata; - double **s_re,**s_im,**r_re,**r_im; + double s_re[2][30720*2],s_im[2][30720*2],r_re[2][30720*2],r_im[2][30720*2]; double iqim=0.0; // int subframe_offset; uint8_t subframe=0; @@ -428,7 +423,9 @@ int main(int argc, char **argv) // int8_t interf1=-128,interf2=-128; uint8_t dci_cnt=0; LTE_DL_FRAME_PARMS *frame_parms; - uint8_t log2L=2, log2Lcommon=2, format_selector=0; + uint8_t log2L=2, log2Lcommon=2; + DCI_format_t format_selector[MAX_NUM_DCI]; + uint8_t num_dci=0; uint8_t numCCE,common_active=0,ul_active=0,dl_active=0; uint32_t n_trials_common=0,n_trials_ul=0,n_trials_dl=0,false_detection_cnt=0; @@ -459,17 +456,12 @@ int main(int argc, char **argv) int CCE_table[800]; number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; - /* - rxdataF = (int **)malloc16(2*sizeof(int*)); - rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); + cpuf = get_cpu_freq_GHz(); + + logInit(); + - rxdata = (int **)malloc16(2*sizeof(int*)); - rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ while ((c = getopt (argc, argv, "hapFg:R:c:n:s:x:y:z:L:M:N:I:f:i:S:P:Y")) != -1) { switch (c) { case 'a': @@ -526,7 +518,7 @@ int main(int argc, char **argv) break; default: - msg("Unsupported channel model!\n"); + printf("Unsupported channel model!\n"); exit(-1); } @@ -558,7 +550,7 @@ int main(int argc, char **argv) if ((transmission_mode!=1) && (transmission_mode!=2) && (transmission_mode!=6)) { - msg("Unsupported transmission mode %d\n",transmission_mode); + printf("Unsupported transmission mode %d\n",transmission_mode); exit(-1); } @@ -568,7 +560,7 @@ int main(int argc, char **argv) n_tx=atoi(optarg); if ((n_tx==0) || (n_tx>2)) { - msg("Unsupported number of tx antennas %d\n",n_tx); + printf("Unsupported number of tx antennas %d\n",n_tx); exit(-1); } @@ -578,7 +570,7 @@ int main(int argc, char **argv) n_rx=atoi(optarg); if ((n_rx==0) || (n_rx>2)) { - msg("Unsupported number of rx antennas %d\n",n_rx); + printf("Unsupported number of rx antennas %d\n",n_rx); exit(-1); } @@ -595,7 +587,7 @@ int main(int argc, char **argv) (log2L!=1)&& (log2L!=2)&& (log2L!=3)) { - msg("Unsupported DCI aggregation level %d (should be 0,1,2,3)\n",log2L); + printf("Unsupported DCI aggregation level %d (should be 0,1,2,3)\n",log2L); exit(-1); } @@ -606,14 +598,22 @@ int main(int argc, char **argv) if ((log2Lcommon!=2)&& (log2Lcommon!=3)) { - msg("Unsupported Common DCI aggregation level %d (should be 2 or 3)\n",log2Lcommon); + printf("Unsupported Common DCI aggregation level %d (should be 2 or 3)\n",log2Lcommon); exit(-1); } break; case 'N': - format_selector = atoi(optarg); + format_selector[num_dci] = (DCI_format_t) atoi(optarg); + if ((format_selector[num_dci] format1A)) { + printf("only formats 0, 1, and 1A supported for the moment\n"); + exit(-1); + } + if (format_selector[num_dci]==format0) ul_active=1; + if (format_selector[num_dci]==format1A) common_active=1; + if (format_selector[num_dci]==format1) dl_active=1; + num_dci++; break; case 'O': @@ -652,6 +652,7 @@ int main(int argc, char **argv) printf("-h This message\n"); printf("-a Use AWGN channel and not multipath\n"); printf("-c TDD config\n"); + printf("-S Subframe number (0..9)\n"); printf("-R N_RB_DL\n"); printf("-F use FDD frame\n"); printf("-p Use extended prefix mode\n"); @@ -663,25 +664,27 @@ int main(int argc, char **argv) printf("-y Number of TX antennas used in eNB\n"); printf("-z Number of RX antennas used in UE\n"); printf("-P Number of interfering PHICH\n"); - printf("-L log2 of Aggregation level for UE Specific DCI (1,2,4,8)\n"); + printf("-L log2 of Aggregation level for UE Specific DCI (0,1,2,3)\n"); printf("-M log2 Aggregation level for Common DCI (4,8)\n"); - printf("-N Format for UE Spec DCI (0 - format1,\n"); - printf(" 1 - format1A,\n"); - printf(" 2 - format1B_2A,\n"); - printf(" 3 - format1B_4A,\n"); - printf(" 4 - format1C,\n"); - printf(" 5 - format1D_2A,\n"); - printf(" 6 - format1D_4A,\n"); - printf(" 7 - format2A_2A_L10PRB,\n"); - printf(" 8 - format2A_2A_M10PRB,\n"); - printf(" 9 - format2A_4A_L10PRB,\n"); - printf(" 10 - format2A_4A_M10PRB,\n"); - printf(" 11 - format2_2A_L10PRB,\n"); - printf(" 12 - format2_2A_M10PRB,\n"); - printf(" 13 - format2_4A_L10PRB,\n"); - printf(" 14 - format2_4A_M10PRB\n"); - printf(" 15 - format2_2D_M10PRB\n"); - printf(" 16 - format2_2D_L10PRB\n"); + printf("-N Format for UE Spec DCI (0 - format0,\n"); + printf(" 1 - format1,\n"); + printf(" 2 - format1A,\n"); + printf(" 3 - format1B_2A,\n"); + printf(" 4 - format1B_4A,\n"); + printf(" 5 - format1C,\n"); + printf(" 6 - format1D_2A,\n"); + printf(" 7 - format1D_4A,\n"); + printf(" 8 - format2A_2A_L10PRB,\n"); + printf(" 9 - format2A_2A_M10PRB,\n"); + printf(" 10 - format2A_4A_L10PRB,\n"); + printf(" 11 - format2A_4A_M10PRB,\n"); + printf(" 12 - format2_2A_L10PRB,\n"); + printf(" 13 - format2_2A_M10PRB,\n"); + printf(" 14 - format2_4A_L10PRB,\n"); + printf(" 15 - format2_4A_M10PRB\n"); + printf(" 16 - format2_2D_M10PRB\n"); + printf(" 17 - format2_2D_L10PRB\n"); + printf(" can be called multiple times to add more than one DCI\n"); printf("-O Oversampling factor\n"); printf("-I Cell Id\n"); printf("-F Input sample stream\n"); @@ -690,15 +693,11 @@ int main(int argc, char **argv) } } - - - - logInit(); - if ((transmission_mode>1) && (n_tx==1)) n_tx=2; lte_param_init(n_tx, + n_tx, n_rx, transmission_mode, extended_prefix_flag, @@ -719,7 +718,7 @@ int main(int argc, char **argv) mac_xface->computeRIV = computeRIV; - mac_xface->lte_frame_parms = &PHY_vars_eNB->lte_frame_parms; + mac_xface->frame_parms = &eNB->frame_parms; // init_transport_channels(transmission_mode); if (n_frames==1) @@ -729,55 +728,39 @@ int main(int argc, char **argv) printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - frame_parms = &PHY_vars_eNB->lte_frame_parms; - get_dci(frame_parms, log2L, log2Lcommon, format_selector, n_rnti); + frame_parms = &eNB->frame_parms; + printf("Getting %d dcis\n",num_dci); - txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[eNb_id]; + get_dci(frame_parms, log2L, log2Lcommon, format_selector, num_dci, n_rnti); - s_re = malloc(2*sizeof(double*)); - s_im = malloc(2*sizeof(double*)); - r_re = malloc(2*sizeof(double*)); - r_im = malloc(2*sizeof(double*)); + txdata = eNB->common_vars.txdata[eNb_id]; - nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12; + nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12; printf("Subframe %d, FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n", subframe,NUMBER_OF_OFDM_CARRIERS, - PHY_vars_eNB->lte_frame_parms.Ncp,PHY_vars_eNB->lte_frame_parms.samples_per_tti,nsymb); + eNB->frame_parms.Ncp,eNB->frame_parms.samples_per_tti,nsymb); - eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL), 0, 0, 0); - for (i=0; i<2; i++) { + eNB_rxtx_proc_t *proc_rxtx = &eNB->proc.proc_rxtx[subframe&1]; - s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(s_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - } + eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0); + UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0); - - - PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0); - PHY_vars_UE->ulsch_ue[0] = new_ue_ulsch(N_RB_DL,0); - - - PHY_vars_eNB->proc[subframe].frame_tx = 0; - PHY_vars_eNB->proc[subframe].subframe_tx = subframe; + proc_rxtx->frame_tx = 0; + proc_rxtx->subframe_tx = subframe; if (input_fd==NULL) { - msg("No input file, so starting TX\n"); + printf("No input file, so starting TX\n"); } else { i=0; @@ -812,9 +795,9 @@ int main(int argc, char **argv) } - PHY_vars_UE->UE_mode[0] = PUSCH; + UE->UE_mode[0] = PUSCH; - // nCCE_max = get_nCCE(3,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,0)); + // nCCE_max = get_nCCE(3,&eNB->frame_parms,get_mi(&eNB->frame_parms,0)); //printf("nCCE_max %d\n",nCCE_max); //printf("num_phich interferers %d\n",num_phich_interf); @@ -831,32 +814,21 @@ int main(int argc, char **argv) n_trials_dl=0; for (trial=0; trialcommon_vars.txdataF[eNb_id][aa][512*14*subframe],&eNB->common_vars.txdataF[eNb_id][aa][0]); + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + memset(&eNB->common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); - // printf("DCI (SF %d): txdataF %p (0 %p)\n",subframe,&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][512*14*subframe],&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0]); - for (aa=0; aalte_frame_parms.nb_antennas_tx_eNB; aa++) { - memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); - - /* - re_offset = PHY_vars_eNB->lte_frame_parms.first_carrier_offset; - txptr = (uint32_t*)&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti]; - for (i=0;ilte_frame_parms.N_RB_DL*6;i++) { - txptr[re_offset++] = PHY_vars_eNB->lte_frame_parms.mode1_flag==1 ? QPSK[taus()&3] : QPSK2[taus()&3]; - //printf("%i => %d,%d\n",re_offset-1,*(int16_t*)&txptr[re_offset-1],*(1+(int16_t*)&txptr[re_offset-1])); - } - re_offset=1; //skip DC - for (i=0;ilte_frame_parms.N_RB_DL*6;i++) - txptr[re_offset++] = PHY_vars_eNB->lte_frame_parms.mode1_flag==1 ? QPSK[taus()&3] : QPSK2[taus()&3]; - */ } - generate_pilots_slot(PHY_vars_eNB, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id], + generate_pilots_slot(eNB, + eNB->common_vars.txdataF[eNb_id], AMP, //1024, (subframe*2), 0); - generate_pilots_slot(PHY_vars_eNB, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id], + generate_pilots_slot(eNB, + eNB->common_vars.txdataF[eNb_id], AMP, //1024, (subframe*2)+1, 0); @@ -866,29 +838,30 @@ int main(int argc, char **argv) numCCE=0; n_trials_common++; common_active = 1; - if (PHY_vars_eNB->lte_frame_parms.N_RB_DL >= 50) { - n_trials_ul++; - ul_active = 1; + if (eNB->frame_parms.N_RB_DL >= 50) { + if (ul_active==1) { + n_trials_ul++; + } } - if (PHY_vars_eNB->lte_frame_parms.N_RB_DL >= 25) { - n_trials_dl++; - dl_active = 1; + if (eNB->frame_parms.N_RB_DL >= 25) { + if (dl_active==1) { + n_trials_dl++; + } } - - num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu.Num_common_dci+DCI_pdu.Num_ue_spec_dci, + num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu.Num_dci, DCI_pdu.dci_alloc, frame_parms, subframe); - numCCE = get_nCCE(num_pdcch_symbols,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,subframe)); + numCCE = get_nCCE(num_pdcch_symbols,&eNB->frame_parms,get_mi(&eNB->frame_parms,subframe)); if (n_frames==1) { printf("num_dci %d, num_pddch_symbols %d, nCCE %d\n", - DCI_pdu.Num_common_dci+DCI_pdu.Num_ue_spec_dci, + DCI_pdu.Num_dci, num_pdcch_symbols,numCCE); } // apply RNTI-based nCCE allocation memset(CCE_table,0,800*sizeof(int)); - for (i = 0; i < DCI_pdu.Num_common_dci + DCI_pdu.Num_ue_spec_dci; i++) { + for (i = 0; i < DCI_pdu.Num_dci; i++) { // SI RNTI if (DCI_pdu.dci_alloc[i].rnti == SI_RNTI) { DCI_pdu.dci_alloc[i].firstCCE = get_nCCE_offset_l1(CCE_table, @@ -918,123 +891,111 @@ int main(int argc, char **argv) } if (n_frames==1) - printf("dci %d: rnti 0x%x, format %d, L %d, nCCE %d/%d dci_length %d\n",i,DCI_pdu.dci_alloc[i].rnti, DCI_pdu.dci_alloc[i].format, - DCI_pdu.dci_alloc[i].L, DCI_pdu.dci_alloc[i].firstCCE, numCCE, DCI_pdu.dci_alloc[i].dci_length); + printf("dci %d: rnti 0x%x, format %d, L %d (aggreg %d), nCCE %d/%d dci_length %d\n",i,DCI_pdu.dci_alloc[i].rnti, DCI_pdu.dci_alloc[i].format, + DCI_pdu.dci_alloc[i].L, 1<lte_frame_parms, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id], + &eNB->frame_parms, + eNB->common_vars.txdataF[eNb_id], subframe); if (n_frames==1) printf("num_pdcch_symbols at TX %d\n",num_pdcch_symbols); - if (is_phich_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)) { + if (is_phich_subframe(&eNB->frame_parms,subframe)) { if (n_frames==1) printf("generating PHICH\n"); - harq_pid = phich_subframe_to_harq_pid(&PHY_vars_eNB->lte_frame_parms, PHY_vars_eNB->proc[subframe].frame_tx, subframe); + harq_pid = phich_subframe_to_harq_pid(&eNB->frame_parms, proc_rxtx->frame_tx, subframe); phich_ACK = taus()&1; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->phich_active = 1; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 0; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->n_DMRS = 0; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->phich_ACK = phich_ACK; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->dci_alloc = 1; + eNB->ulsch[0]->harq_processes[harq_pid]->phich_active = 1; + eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 0; + eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 0; + eNB->ulsch[0]->harq_processes[harq_pid]->phich_ACK = phich_ACK; + eNB->ulsch[0]->harq_processes[harq_pid]->dci_alloc = 1; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->first_rb = 0; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->n_DMRS = 0; + UE->ulsch[0]->harq_processes[harq_pid]->first_rb = 0; + UE->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 0; - generate_phich_top(PHY_vars_eNB, - subframe,AMP,0,0); + generate_phich_top(eNB,proc_rxtx,AMP,0); // generate 3 interfering PHICH if (num_phich_interf>0) { - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 4; - generate_phich_top(PHY_vars_eNB, - subframe, - 1024, - 0,0); + eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 4; + generate_phich_top(eNB,proc_rxtx,1024,0); } if (num_phich_interf>1) { - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 8; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->n_DMRS = 1; - generate_phich_top(PHY_vars_eNB, - subframe, - 1024,0,0); + eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 8; + eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 1; + generate_phich_top(eNB,proc_rxtx,1024,0); } if (num_phich_interf>2) { - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 12; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->n_DMRS = 1; - generate_phich_top(PHY_vars_eNB, - subframe, - 1024,0,0); + eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 12; + eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 1; + generate_phich_top(eNB,proc_rxtx,1024,0); } - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 0; + eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 0; } - // write_output("pilotsF.m","rsF",txdataF[0],lte_PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); + // write_output("pilotsF.m","rsF",txdataF[0],lte_eNB->frame_parms.ofdm_symbol_size,1,1); if (n_frames==1) { - write_output("txsigF0.m","txsF0", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][0],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); + write_output("txsigF0.m","txsF0", eNB->common_vars.txdataF[eNb_id][0],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB > 1) - write_output("txsigF1.m","txsF1", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][1],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); + if (eNB->frame_parms.nb_antenna_ports_eNB > 1) + write_output("txsigF1.m","txsF1", eNB->common_vars.txdataF[eNb_id][1],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); } tx_lev = 0; - - for (aa=0; aalte_frame_parms.nb_antennas_tx_eNB; aa++) { - if (PHY_vars_eNB->lte_frame_parms.Ncp == 1) - PHY_ofdm_mod(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], // input, - &txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], // output - PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size, + for (aa=0; aaframe_parms.nb_antenna_ports_eNB; aa++) { + if (eNB->frame_parms.Ncp == 1) + PHY_ofdm_mod(&eNB->common_vars.txdataF[eNb_id][aa][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], // input, + &txdata[aa][subframe*eNB->frame_parms.samples_per_tti], // output + eNB->frame_parms.ofdm_symbol_size, 2*nsymb, // number of symbols - PHY_vars_eNB->lte_frame_parms.nb_prefix_samples, // number of prefix samples + eNB->frame_parms.nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { - normal_prefix_mod(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], - &txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], + normal_prefix_mod(&eNB->common_vars.txdataF[eNb_id][aa][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size], + &txdata[aa][subframe*eNB->frame_parms.samples_per_tti], 2*nsymb, frame_parms); } - tx_lev += signal_energy(&txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], - PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size); + tx_lev += signal_energy(&txdata[aa][subframe*eNB->frame_parms.samples_per_tti], + eNB->frame_parms.ofdm_symbol_size); } tx_lev_dB = (unsigned int) dB_fixed(tx_lev); } - - for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_tx_eNB; aa++) { + for (aa=0; aaframe_parms.nb_antenna_ports_eNB; aa++) { if (awgn_flag == 0) { - s_re[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); - s_im[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]); + s_re[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + s_im[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]); } else { - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { if (aa==0) { - r_re[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); - r_im[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]); + r_re[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + r_im[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]); } else { - r_re[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); - r_im[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]); + r_re[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]); + r_im[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]); } } } @@ -1046,7 +1007,6 @@ int main(int argc, char **argv) if (awgn_flag == 0) { multipath_channel(eNB2UE,s_re,s_im,r_re,r_im, 2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0); - } //write_output("channel0.m","chan0",ch[0],channel_length,1,8); @@ -1054,7 +1014,7 @@ int main(int argc, char **argv) // scale by path_loss = NOW - P_noise //sigma2 = pow(10,sigma2_dB/10); //N0W = -95.87; - sigma2_dB = (double)tx_lev_dB +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(12*PHY_vars_eNB->lte_frame_parms.N_RB_DL)) - SNR; + sigma2_dB = (double)tx_lev_dB +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(12*eNB->frame_parms.N_RB_DL)) - SNR; if (n_frames==1) printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %d\n",sigma2_dB,SNR,tx_lev_dB); @@ -1064,37 +1024,37 @@ int main(int argc, char **argv) // printf("Sigma2 %f (sigma2_dB %f)\n",sigma2,sigma2_dB); for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i] = (short) (.667*(r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i+1] = (short) (.667*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble( + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i] = (short) (.667*(r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1] = (short) (.667*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble( 0.0,1.0))); /* - ((short*)PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i] = - ((short*)txdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i]; - ((short*)PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i+1] = - ((short*)txdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i+1]; + ((short*)UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i] = + ((short*)txdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i]; + ((short*)UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1] = + ((short*)txdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1]; */ } } // UE receiver - for (l=0; llte_frame_parms.symbols_per_tti; l++) { + for (l=0; lframe_parms.symbols_per_tti; l++) { - // subframe_offset = (l/PHY_vars_eNB->lte_frame_parms.symbols_per_tti)*PHY_vars_eNB->lte_frame_parms.samples_per_tti; + // subframe_offset = (l/eNB->frame_parms.symbols_per_tti)*eNB->frame_parms.samples_per_tti; // printf("subframe_offset = %d\n",subframe_offset); - slot_fep(PHY_vars_UE, - l%(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2), - (2*subframe)+(l/(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2)), + slot_fep(UE, + l%(eNB->frame_parms.symbols_per_tti/2), + (2*subframe)+(l/(eNB->frame_parms.symbols_per_tti/2)), 0, 0, 0); - if (PHY_vars_UE->perfect_ce == 1) { + if (UE->perfect_ce == 1) { if (awgn_flag==0) { // fill in perfect channel estimates - freq_channel(eNB2UE,PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1); + freq_channel(eNB2UE,UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1); //write_output("channel.m","ch",desc1->ch[0],desc1->channel_length,1,8); //write_output("channelF.m","chF",desc1->chF[0],nb_samples,1,8); @@ -1102,54 +1062,54 @@ int main(int argc, char **argv) for(aa=0; aanb_antennas_tx; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)( eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); } } } } } else { - for(aa=0; aanb_antennas_tx_eNB; aa++) { + for(aa=0; aanb_antenna_ports_eNB; aa++) { for (aarx=0; aarxnb_antennas_rx; aarx++) { for (i=0; iN_RB_DL*12; i++) { - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); - ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); + ((int16_t *) UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; } } } } } - if (l==((PHY_vars_eNB->lte_frame_parms.Ncp==0)?4:3)) { + if (l==((eNB->frame_parms.Ncp==0)?4:3)) { - // write_output("H00.m","h00",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + // write_output("H00.m","h00",&(UE->common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); // do PDCCH procedures here - PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = n_rnti; + UE->pdcch_vars[0][0]->crnti = n_rnti; // printf("Doing RX : num_pdcch_symbols at TX %d\n",num_pdcch_symbols); - rx_pdcch(&PHY_vars_UE->lte_ue_common_vars, - PHY_vars_UE->lte_ue_pdcch_vars, - &PHY_vars_UE->lte_frame_parms, + rx_pdcch(UE, + trial, subframe, 0, - (PHY_vars_UE->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, - PHY_vars_UE->high_speed_flag, - PHY_vars_UE->is_secondary_ue); + (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, + UE->high_speed_flag, + UE->is_secondary_ue); - if (is_phich_subframe(&PHY_vars_UE->lte_frame_parms,subframe)) { - PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms,0,subframe)]->status = ACTIVE; - //PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms,0,subframe)]->Ndi = 1; - rx_phich(PHY_vars_UE, + if (is_phich_subframe(&UE->frame_parms,subframe)) { + UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms,0,subframe)]->status = ACTIVE; + //UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms,0,subframe)]->Ndi = 1; + rx_phich(UE, + &UE->proc.proc_rxtx[subframe&1], subframe, 0); } - // if (PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols) + // if (UE->pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols) // break; - dci_cnt = dci_decoding_procedure(PHY_vars_UE, + dci_cnt = dci_decoding_procedure(UE, dci_alloc_rx,1, 0,subframe); @@ -1158,7 +1118,7 @@ int main(int argc, char **argv) dl_rx=0; if (n_frames==1) { - numCCE = get_nCCE(PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, &PHY_vars_UE->lte_frame_parms, get_mi(&PHY_vars_UE->lte_frame_parms,subframe)); + numCCE = get_nCCE(UE->pdcch_vars[0][0]->num_pdcch_symbols, &UE->frame_parms, get_mi(&UE->frame_parms,subframe)); for (i = 0; i < dci_cnt; i++) printf("dci %d: rnti 0x%x, format %d, L %d, nCCE %d/%d dci_length %d\n",i, dci_alloc_rx[i].rnti, dci_alloc_rx[i].format, @@ -1168,21 +1128,21 @@ int main(int argc, char **argv) for (i=0; ilte_frame_parms, &dci_alloc_rx[i]); + dump_dci(&UE->frame_parms, &dci_alloc_rx[i]); common_rx=1; } if ((dci_alloc_rx[i].rnti == n_rnti) && (dci_alloc_rx[i].format == format0)) { if (n_frames==1) - dump_dci(&PHY_vars_UE->lte_frame_parms, &dci_alloc_rx[i]); + dump_dci(&UE->frame_parms, &dci_alloc_rx[i]); ul_rx=1; } if ((dci_alloc_rx[i].rnti == n_rnti) && ((dci_alloc_rx[i].format == format1))) { if (n_frames==1) - dump_dci(&PHY_vars_UE->lte_frame_parms, &dci_alloc_rx[i]); + dump_dci(&UE->frame_parms, &dci_alloc_rx[i]); dl_rx=1; } @@ -1207,12 +1167,12 @@ int main(int argc, char **argv) // exit(-1); } - if (PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols) + if (UE->pdcch_vars[0][0]->num_pdcch_symbols != num_pdcch_symbols) n_errors_cfi++; /* - if (is_phich_subframe(&PHY_vars_UE->lte_frame_parms,subframe)) - if (PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms, PHY_vars_UE->frame, subframe)]->Ndi != phich_ACK) + if (is_phich_subframe(&UE->frame_parms,subframe)) + if (UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms, UE->frame, subframe)]->Ndi != phich_ACK) n_errors_hi++; */ @@ -1230,19 +1190,20 @@ int main(int argc, char **argv) #ifdef XFORMS phy_scope_UE(form_ue, - PHY_vars_UE, + UE, eNb_id,0,subframe); #endif } //trials - - printf("SNR %f : n_errors_common = %d/%d (%e)\n", SNR,n_errors_common,n_trials_common,(double)n_errors_common/n_trials_common); + + if (common_active) printf("SNR %f : n_errors_common = %d/%d (%e)\n", SNR,n_errors_common,n_trials_common,(double)n_errors_common/n_trials_common); if (ul_active==1) printf("SNR %f : n_errors_ul = %d/%d (%e)\n", SNR,n_errors_ul,n_trials_ul,(double)n_errors_ul/n_trials_ul); if (dl_active==1) printf("SNR %f : n_errors_dl = %d/%d (%e)\n", SNR,n_errors_dl,n_trials_dl,(double)n_errors_dl/n_trials_dl); printf("SNR %f : n_errors_cfi = %d/%d (%e)\n", SNR,n_errors_cfi,trial,(double)n_errors_cfi/trial); printf("SNR %f : n_errors_hi = %d/%d (%e)\n", SNR,n_errors_hi,trial,(double)n_errors_hi/trial); - - } // NSR + + } // SNR + if (n_frames==1) { write_output("txsig0.m","txs0", txdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); @@ -1250,41 +1211,29 @@ int main(int argc, char **argv) if (n_tx>1) write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); - write_output("rxsig0.m","rxs0", PHY_vars_UE->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", PHY_vars_UE->lte_ue_common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); + write_output("rxsig0.m","rxs0", UE->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + write_output("rxsigF0.m","rxsF0", UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); if (n_rx>1) { - write_output("rxsig1.m","rxs1", PHY_vars_UE->lte_ue_common_vars.rxdata[1],10*frame_parms->samples_per_tti,1,1); - write_output("rxsigF1.m","rxsF1", PHY_vars_UE->lte_ue_common_vars.rxdataF[1],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); + write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],10*frame_parms->samples_per_tti,1,1); + write_output("rxsigF1.m","rxsF1", UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[1],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); } - write_output("H00.m","h00",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H00.m","h00",&(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); if (n_tx==2) - write_output("H10.m","h10",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H10.m","h10",&(UE->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1); - write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",PHY_vars_UE->lte_ue_pdcch_vars[eNb_id]->rxdataF_ext[0],3*12*PHY_vars_UE->lte_frame_parms.N_RB_DL,1,1); - write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNb_id]->rxdataF_comp[0],4*12*PHY_vars_UE->lte_frame_parms.N_RB_DL,1,1); - write_output("pdcch_rxF_llr.m","pdcch_llr",PHY_vars_UE->lte_ue_pdcch_vars[eNb_id]->llr,2400,1,4); + write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",UE->pdcch_vars[0][eNb_id]->rxdataF_ext[0],3*12*UE->frame_parms.N_RB_DL,1,1); + write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[0][eNb_id]->rxdataF_comp[0],4*12*UE->frame_parms.N_RB_DL,1,1); + write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[0][eNb_id]->llr,2400,1,4); } - for (i=0; i<2; i++) { - free(s_re[i]); - free(s_im[i]); - free(r_re[i]); - free(r_im[i]); - } - - free(s_re); - free(s_im); - free(r_re); - free(r_im); - lte_sync_time_free(); return(n_errors_ul); -} + } diff --git a/openair1/SIMULATION/LTE_PHY/prachsim.c b/openair1/SIMULATION/LTE_PHY/prachsim.c index 37fc3a6a10..58f89bd65b 100644 --- a/openair1/SIMULATION/LTE_PHY/prachsim.c +++ b/openair1/SIMULATION/LTE_PHY/prachsim.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include @@ -34,23 +27,22 @@ #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/vars.h" -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif #include "SCHED/defs.h" #include "SCHED/vars.h" #include "LAYER2/MAC/vars.h" #include "OCG_vars.h" +#include "unitary_defs.h" + int current_dlsch_cqi; //FIXME! -PHY_VARS_eNB *PHY_vars_eNB; -PHY_VARS_UE *PHY_vars_UE; +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 - +double cpuf; extern uint16_t prach_root_sequence_map0_3[838]; @@ -81,10 +73,6 @@ int main(int argc, char **argv) uint8_t extended_prefix_flag=0; // int8_t interf1=-19,interf2=-19; LTE_DL_FRAME_PARMS *frame_parms; -#ifdef EMOS - fifo_dump_emos emos_dump; -#endif - SCM_t channel_model=Rayleigh1; @@ -102,21 +90,17 @@ int main(int argc, char **argv) double delay_avg=0; double ue_speed = 0; int NCS_config = 1,rootSequenceIndex=0; + int threequarter_fs = 0; + + cpuf = get_cpu_freq_GHz(); + logInit(); number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; - /* - rxdataF = (int **)malloc16(2*sizeof(int*)); - rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata = (int **)malloc16(2*sizeof(int*)); - rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ - while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:")) != -1) { + + while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:E")) != -1) { switch (c) { case 'a': printf("Running AWGN simulation\n"); @@ -188,6 +172,10 @@ int main(int argc, char **argv) break; + case 'E': + threequarter_fs=1; + break; + case 'n': n_frames = atoi(optarg); break; @@ -315,6 +303,7 @@ int main(int argc, char **argv) n_tx=2; lte_param_init(n_tx, + n_tx, n_rx, transmission_mode, extended_prefix_flag, @@ -322,7 +311,7 @@ int main(int argc, char **argv) Nid_cell, 3, N_RB_DL, - 0, + threequarter_fs, osf, 0); @@ -343,10 +332,10 @@ int main(int argc, char **argv) printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &eNB->frame_parms; - txdata = PHY_vars_UE->lte_ue_common_vars.txdata; + txdata = UE->common_vars.txdata; printf("txdata %p\n",&txdata[0][subframe*frame_parms->samples_per_tti]); s_re = malloc(2*sizeof(double*)); @@ -361,11 +350,11 @@ int main(int argc, char **argv) msg("[SIM] Using SCM/101\n"); - UE2eNB = new_channel_desc_scm(PHY_vars_UE->lte_frame_parms.nb_antennas_tx, - PHY_vars_eNB->lte_frame_parms.nb_antennas_rx, + UE2eNB = new_channel_desc_scm(UE->frame_parms.nb_antennas_tx, + eNB->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_UL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL), 0.0, delay, 0); @@ -388,32 +377,36 @@ int main(int argc, char **argv) bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); } - PHY_vars_UE->lte_frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex; - PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; - PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config; - PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag; - PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; + UE->frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex; + UE->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; + UE->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config; + UE->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag; + UE->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; - PHY_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex; - PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; - PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config; - PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag; - PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; + eNB->frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex; + eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; + eNB->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config; + eNB->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag; + eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; + + eNB->node_function = eNodeB_3GPP; + eNB->proc.subframe_rx = subframe; + eNB->proc.subframe_prach = subframe; /* N_ZC not used later, so prach_fmt is also useless, don't set */ - //prach_fmt = get_prach_fmt(PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, - // PHY_vars_eNB->lte_frame_parms.frame_type); + //prach_fmt = get_prach_fmt(eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, + // eNB->frame_parms.frame_type); /* N_ZC not used later, no need to set */ //N_ZC = (prach_fmt <4)?839:139; - compute_prach_seq(&PHY_vars_eNB->lte_frame_parms.prach_config_common,PHY_vars_eNB->lte_frame_parms.frame_type,PHY_vars_eNB->X_u); + compute_prach_seq(&eNB->frame_parms.prach_config_common,eNB->frame_parms.frame_type,eNB->X_u); - compute_prach_seq(&PHY_vars_UE->lte_frame_parms.prach_config_common,PHY_vars_UE->lte_frame_parms.frame_type,PHY_vars_UE->X_u); + compute_prach_seq(&UE->frame_parms.prach_config_common,UE->frame_parms.frame_type,UE->X_u); - PHY_vars_UE->lte_ue_prach_vars[0]->amp = AMP; + UE->prach_vars[0]->amp = AMP; - PHY_vars_UE->prach_resources[0] = &prach_resources; + UE->prach_resources[0] = &prach_resources; if (preamble_tx == 99) preamble_tx = (uint16_t)(taus()&0x3f); @@ -421,10 +414,10 @@ int main(int argc, char **argv) if (n_frames == 1) printf("raPreamble %d\n",preamble_tx); - PHY_vars_UE->prach_resources[0]->ra_PreambleIndex = preamble_tx; - PHY_vars_UE->prach_resources[0]->ra_TDD_map_index = 0; + UE->prach_resources[0]->ra_PreambleIndex = preamble_tx; + UE->prach_resources[0]->ra_TDD_map_index = 0; - tx_lev = generate_prach(PHY_vars_UE, + tx_lev = generate_prach(UE, 0, //eNB_id, subframe, 0); //Nf @@ -436,7 +429,7 @@ int main(int argc, char **argv) //write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); // multipath channel - dump_prach_config(&PHY_vars_eNB->lte_frame_parms,subframe); + dump_prach_config(&eNB->frame_parms,subframe); for (i=0; i<2*frame_parms->samples_per_tti; i++) { for (aa=0; aa<1; aa++) { @@ -444,7 +437,7 @@ int main(int argc, char **argv) s_re[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)]); s_im[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)+1]); } else { - for (aarx=0; aarxlte_frame_parms.nb_antennas_rx; aarx++) { + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { if (aa==0) { r_re[aarx][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)]); r_im[aarx][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)+1]); @@ -491,15 +484,14 @@ int main(int argc, char **argv) } for (i=0; isamples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } } - rx_prach(PHY_vars_eNB, - subframe, + rx_prach(eNB, preamble_energy_list, preamble_delay_list, 0, //Nf @@ -530,12 +522,12 @@ int main(int argc, char **argv) printf("preamble %d : energy %d, delay %d\n",i,preamble_energy_list[i],preamble_delay_list[i]); write_output("prach0.m","prach0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); - write_output("prachF0.m","prachF0", &PHY_vars_eNB->lte_eNB_prach_vars.prachF[0],24576,1,1); + write_output("prachF0.m","prachF0", &eNB->prach_vars.prachF[0],24576,1,1); write_output("rxsig0.m","rxs0", - &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti], + &eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti], frame_parms->samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][0][0],512*nsymb*2,2,1); - write_output("prach_preamble.m","prachp",&PHY_vars_eNB->X_u[0],839,1,1); + write_output("rxsigF0.m","rxsF0", eNB->prach_vars.rxsigF[0],6144,1,1); + write_output("prach_preamble.m","prachp",&eNB->X_u[0],839,1,1); } } diff --git a/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h b/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h index 0fd3dd752d..779b9ed423 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h +++ b/openair1/SIMULATION/LTE_PHY/pucchsignalgegerator.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c b/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c index ce04cb9539..cf8e0b6d4a 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsignalgenerator.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c index c5b3569188..d49367c4db 100644 --- a/openair1/SIMULATION/LTE_PHY/pucchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include @@ -34,9 +27,6 @@ #include "PHY/types.h" #include "PHY/defs.h" #include "PHY/vars.h" -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif #include "SCHED/defs.h" #include "SCHED/vars.h" #include "LAYER2/MAC/vars.h" @@ -45,14 +35,16 @@ #include "OCG_vars.h" #include "UTIL/LOG/log_extern.h" +#include "unitary_defs.h" + int current_dlsch_cqi; //FIXME! -PHY_VARS_eNB *PHY_vars_eNB; -PHY_VARS_UE *PHY_vars_UE; +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 - +double cpuf; int main(int argc, char **argv) { @@ -64,7 +56,11 @@ int main(int argc, char **argv) uint8_t snr1set=0; //mod_sym_t **txdataF; int **txdata; - double **s_re,**s_im,**r_re,**r_im; + double s_re0[30720],s_re1[30720],s_im0[30720],s_im1[30720],r_re0[30720],r_im0[30720],r_re1[30720],r_im1[30720]; + double *s_re[2]={s_re0,s_re1}; + double *s_im[2]={s_im0,s_im1}; + double *r_re[2]={r_re0,r_re1}; + double *r_im[2]={r_im0,r_im1}; double ricean_factor=0.0000005,iqim=0.0; int trial, n_trials, ntrials=1, n_errors; @@ -78,19 +74,18 @@ int main(int argc, char **argv) uint8_t extended_prefix_flag=0; LTE_DL_FRAME_PARMS *frame_parms; -#ifdef EMOS - fifo_dump_emos emos_dump; -#endif SCM_t channel_model=Rayleigh1_corr; // double pucch_sinr; uint8_t osf=1,N_RB_DL=25; - uint32_t pucch_tx=0,pucch1_missed=0,pucch1_false=0,sig; + uint32_t pucch_tx=0,pucch1_missed=0,pucch1_false=0,pucch3_false=0,sig; PUCCH_FMT_t pucch_format = pucch_format1; PUCCH_CONFIG_DEDICATED pucch_config_dedicated; uint8_t subframe=0; uint8_t pucch_payload,pucch_payload_rx; + uint8_t pucch3_payload_size=7; + uint8_t pucch3_payload[21],pucch3_payload_rx[21]; double tx_gain=1.0; int32_t stat; double stat_no_sig,stat_sig; @@ -99,19 +94,13 @@ int main(int argc, char **argv) uint16_t n1_pucch = 0; uint16_t n2_pucch = 0; + uint16_t n3_pucch = 20; + + uint16_t n_rnti=0x1234; number_of_cards = 1; - openair_daq_vars.rx_rf_mode = 1; - /* - rxdataF = (int **)malloc16(2*sizeof(int*)); - rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - - rxdata = (int **)malloc16(2*sizeof(int*)); - rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ + cpuf = get_cpu_freq_GHz(); while ((c = getopt (argc, argv, "har:pf:g:n:s:S:x:y:z:N:F:T:R:")) != -1) { switch (c) { @@ -128,6 +117,8 @@ int main(int argc, char **argv) pucch_format = pucch_format1a; else if (atoi(optarg)==2) pucch_format = pucch_format1b; + else if (atoi(optarg)==6) // 3,4,5 is reserved for format2,2a,2b + pucch_format = pucch_format3; else { printf("Unsupported pucch_format %d\n",atoi(optarg)); exit(-1); @@ -292,7 +283,7 @@ int main(int argc, char **argv) printf("-N Noise variance in dB\n"); printf("-R N_RB_DL\n"); printf("-O oversampling factor (1,2,4,8,16)\n"); - printf("-f PUCCH format (0=1,1=1a,2=1b), formats 2/2a/2b not supported\n"); + printf("-f PUCCH format (0=1,1=1a,2=1b,6=3), formats 2/2a/2b not supported\n"); printf("-F Input filename (.txt format) for RX conformance testing\n"); exit (-1); break; @@ -300,7 +291,7 @@ int main(int argc, char **argv) } logInit(); - itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL); + //itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL); g_log->log_component[PHY].level = LOG_DEBUG; g_log->log_component[PHY].flag = LOG_HIGH; @@ -308,13 +299,15 @@ int main(int argc, char **argv) n_tx=2; lte_param_init(n_tx, + n_tx, n_rx, transmission_mode, extended_prefix_flag, - Nid_cell, FDD, + Nid_cell, 3, N_RB_DL, + 0, osf, 0); @@ -328,15 +321,11 @@ int main(int argc, char **argv) printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - frame_parms = &PHY_vars_eNB->lte_frame_parms; + frame_parms = &eNB->frame_parms; - txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id]; + txdata = eNB->common_vars.txdata[eNB_id]; - s_re = malloc(2*sizeof(double*)); - s_im = malloc(2*sizeof(double*)); - r_re = malloc(2*sizeof(double*)); - r_im = malloc(2*sizeof(double*)); nsymb = (frame_parms->Ncp == 0) ? 14 : 12; printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",NUMBER_OF_OFDM_CARRIERS, @@ -345,11 +334,11 @@ int main(int argc, char **argv) printf("[SIM] Using SCM/101\n"); - UE2eNB = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_UL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL), 0.0, 0, 0); @@ -360,71 +349,76 @@ int main(int argc, char **argv) exit(-1); } - for (i=0; i<2; i++) { + init_ncs_cell(&eNB->frame_parms,eNB->ncs_cell); - s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(s_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(s_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); + init_ncs_cell(&UE->frame_parms,UE->ncs_cell); - r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(r_re[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); + init_ul_hopping(&eNB->frame_parms); + init_ul_hopping(&UE->frame_parms); + + eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 2; + eNB->frame_parms.pucch_config_common.nRB_CQI = 4; + eNB->frame_parms.pucch_config_common.nCS_AN = 6; + UE->frame_parms.pucch_config_common.deltaPUCCH_Shift = 2; + UE->frame_parms.pucch_config_common.nRB_CQI = 4; + UE->frame_parms.pucch_config_common.nCS_AN = 6; + + + if( (pucch_format == pucch_format1) || (pucch_format == pucch_format1a) || (pucch_format == pucch_format1b) ){ + pucch_payload = 0; + generate_pucch1x(UE->common_vars.txdataF, + frame_parms, + UE->ncs_cell, + pucch_format, + &pucch_config_dedicated, + n1_pucch, + 0, //shortened_format, + &pucch_payload, + AMP, //amp, + subframe); //subframe + }else if( pucch_format == pucch_format3){ + for(i=0;icommon_vars.txdataF, + frame_parms, + UE->ncs_cell, + pucch_format, + &pucch_config_dedicated, + n3_pucch, + 0, //shortened_format, + pucch3_payload, + AMP, //amp, + subframe, //subframe + n_rnti); //rnti } - - init_ncs_cell(&PHY_vars_eNB->lte_frame_parms,PHY_vars_eNB->ncs_cell); - - init_ncs_cell(&PHY_vars_UE->lte_frame_parms,PHY_vars_UE->ncs_cell); - - PHY_vars_eNB->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; - PHY_vars_eNB->lte_frame_parms.pucch_config_common.nRB_CQI = 0; - PHY_vars_eNB->lte_frame_parms.pucch_config_common.nCS_AN = 0; - PHY_vars_UE->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; - PHY_vars_UE->lte_frame_parms.pucch_config_common.nRB_CQI = 0; - PHY_vars_UE->lte_frame_parms.pucch_config_common.nCS_AN = 0; - - pucch_payload = 0; - - generate_pucch(PHY_vars_UE->lte_ue_common_vars.txdataF, - frame_parms, - PHY_vars_UE->ncs_cell, - pucch_format, - &pucch_config_dedicated, - n1_pucch, - n2_pucch, - 0, //shortened_format, - &pucch_payload, - AMP, //amp, - subframe); //subframe - write_output("txsigF0.m","txsF0", &PHY_vars_UE->lte_ue_common_vars.txdataF[0][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*nsymb,1,1); + write_output("txsigF0.m","txsF0", &UE->common_vars.txdataF[0][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*nsymb,1,1); tx_lev = 0; - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (frame_parms->Ncp == 1) - PHY_ofdm_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input, - &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], // output + PHY_ofdm_mod(&UE->common_vars.txdataF[aa][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input, + &txdata[aa][eNB->frame_parms.samples_per_tti*subframe], // output frame_parms->ofdm_symbol_size, nsymb, // number of symbols frame_parms->nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else { - normal_prefix_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[eNB_id][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], - &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], + normal_prefix_mod(&UE->common_vars.txdataF[eNB_id][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], + &txdata[aa][eNB->frame_parms.samples_per_tti*subframe], nsymb, frame_parms); - //apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],subframe<<1); - //apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],1+(subframe<<1)); - apply_7_5_kHz(PHY_vars_UE,&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],0); - apply_7_5_kHz(PHY_vars_UE,&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],1); + //apply_7_5_kHz(UE,UE->common_vars.txdata[aa],subframe<<1); + //apply_7_5_kHz(UE,UE->common_vars.txdata[aa],1+(subframe<<1)); + apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],0); + apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],1); } - tx_lev += signal_energy(&txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], + tx_lev += signal_energy(&txdata[aa][subframe*eNB->frame_parms.samples_per_tti], OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES); } @@ -436,7 +430,7 @@ int main(int argc, char **argv) // multipath channel for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { s_re[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)]); s_im[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)+1]); } @@ -452,6 +446,7 @@ int main(int argc, char **argv) pucch_tx = 0; pucch1_missed=0; pucch1_false=0; + pucch3_false=0; stat_no_sig = 0; stat_sig = 0; @@ -461,7 +456,7 @@ int main(int argc, char **argv) multipath_channel(UE2eNB,s_re,s_im,r_re,r_im, - 2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES,0); + eNB->frame_parms.samples_per_tti,0); sigma2_dB = N0;//10*log10((double)tx_lev) - SNR; tx_gain = sqrt(pow(10.0,.1*(N0+SNR))/(double)tx_lev); @@ -498,17 +493,17 @@ int main(int argc, char **argv) //printf("n_trial %d\n",n_trials); // fill measurement symbol (19) with noise for (i=0; ilte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } } for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { if (n_trials==0) { // r_re[aa][i] += (pow(10.0,.05*interf1)*r_re1[aa][i] + pow(10.0,.05*interf2)*r_re2[aa][i]); // r_im[aa][i] += (pow(10.0,.05*interf1)*r_im1[aa][i] + pow(10.0,.05*interf2)*r_im2[aa][i]); @@ -516,31 +511,30 @@ int main(int argc, char **argv) if (sig==1) { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (((tx_gain*r_re[aa][i]) +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble( - 0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (((tx_gain*r_re[aa][i]) +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } else { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } } } - remove_7_5_kHz(PHY_vars_eNB,subframe<<1); - remove_7_5_kHz(PHY_vars_eNB,1+(subframe<<1)); + remove_7_5_kHz(eNB,subframe<<1); + remove_7_5_kHz(eNB,1+(subframe<<1)); - for (l=0; llte_frame_parms.symbols_per_tti/2; l++) { + for (l=0; lframe_parms.symbols_per_tti/2; l++) { - slot_fep_ul(&PHY_vars_eNB->lte_frame_parms, - &PHY_vars_eNB->lte_eNB_common_vars, + slot_fep_ul(&eNB->frame_parms, + &eNB->common_vars, l, subframe*2,// slot 0, 0 ); - slot_fep_ul(&PHY_vars_eNB->lte_frame_parms, - &PHY_vars_eNB->lte_eNB_common_vars, + slot_fep_ul(&eNB->frame_parms, + &eNB->common_vars, l, 1+(subframe*2),//slot 0, @@ -553,18 +547,18 @@ int main(int argc, char **argv) // if (sig == 1) // printf("*"); - lte_eNB_I0_measurements(PHY_vars_eNB, + lte_eNB_I0_measurements(eNB, subframe, 0, 1); - PHY_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dB = N0;//(int8_t)(sigma2_dB-10*log10(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(12*NB_RB))); - stat = rx_pucch(PHY_vars_eNB, + eNB->measurements[0].n0_power_tot_dB = N0;//(int8_t)(sigma2_dB-10*log10(eNB->frame_parms.ofdm_symbol_size/(12*NB_RB))); + stat = rx_pucch(eNB, pucch_format, 0, n1_pucch, n2_pucch, 0, //shortened_format, - &pucch_payload_rx, //payload, + (pucch_format==pucch_format3) ? pucch3_payload_rx : &pucch_payload_rx, //payload, 0 /* frame not defined, let's pass 0 */, subframe, pucch1_thres); @@ -585,8 +579,15 @@ int main(int argc, char **argv) printf("EXIT\n"); exit(-1); }*/ - } else { + } else if( (pucch_format==pucch_format1a) || (pucch_format==pucch_format1b) ) { pucch1_false = (pucch_payload_rx != pucch_payload) ? (pucch1_false+1) : pucch1_false; + } else if (pucch_format==pucch_format3){ + for(i=0;iPHY_measurements_eNB[0].n0_power_tot_dB, + printf("pucch_trials %d : pucch1_false %d,pucch1_missed %d, N0 %d dB, stat_no_sig %f dB, stat_sig %f dB\n",pucch_tx,pucch1_false,pucch1_missed,eNB->measurements[0].n0_power_tot_dB, 10*log10(stat_no_sig),10*log10(stat_sig)); else if (pucch_format==pucch_format1a) printf("pucch_trials %d : pucch1a_errors %d\n",pucch_tx,pucch1_false); else if (pucch_format==pucch_format1b) printf("pucch_trials %d : pucch1b_errors %d\n",pucch_tx,pucch1_false); - + else if (pucch_format==pucch_format3) + printf("pucch_trials %d : pucch3_errors %d\n",pucch_tx,pucch3_false); } if (n_frames==1) { //write_output("txsig0.m","txs0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); write_output("txsig0pucch.m", "txs0", &txdata[0][0], FRAME_LENGTH_COMPLEX_SAMPLES,1,1); - write_output("rxsig0.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); - write_output("rxsigF0.m","rxsF0", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][0][0],512*nsymb*2,2,1); + write_output("rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1); + write_output("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1); } - for (i=0; i<2; i++) { - free(s_re[i]); - free(s_im[i]); - free(r_re[i]); - free(r_im[i]); - } - - free(s_re); - free(s_im); - free(r_re); - free(r_im); - lte_sync_time_free(); return(n_errors); diff --git a/openair1/SIMULATION/LTE_PHY/scansim.c b/openair1/SIMULATION/LTE_PHY/scansim.c index 2cbb7b3e32..69aee01b32 100644 --- a/openair1/SIMULATION/LTE_PHY/scansim.c +++ b/openair1/SIMULATION/LTE_PHY/scansim.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #include #include #include @@ -40,9 +33,6 @@ #include "PHY/vars.h" #include "MAC_INTERFACE/vars.h" -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif #include "SCHED/defs.h" #include "SCHED/vars.h" #include "LAYER2/MAC/vars.h" @@ -98,9 +88,6 @@ int main(int argc, char **argv) uint32_t nsymb,tx_lev,tx_lev1,tx_lev2; uint8_t extended_prefix_flag=0; LTE_DL_FRAME_PARMS *frame_parms; -#ifdef EMOS - fifo_dump_emos emos_dump; -#endif FILE *input_fd=NULL,*pbch_file_fd=NULL; char input_val_str[50],input_val_str2[50]; @@ -500,7 +487,6 @@ int main(int argc, char **argv) num_pdcch_symbols = generate_dci_top(1, - 0, dci_alloc, 0, 1024, diff --git a/openair1/SIMULATION/LTE_PHY/signalanalyzer.c b/openair1/SIMULATION/LTE_PHY/signalanalyzer.c index 2167f52abb..62b0f93624 100644 --- a/openair1/SIMULATION/LTE_PHY/signalanalyzer.c +++ b/openair1/SIMULATION/LTE_PHY/signalanalyzer.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/signalanalyzer.h b/openair1/SIMULATION/LTE_PHY/signalanalyzer.h index d3d82c8aaa..e8aaddb493 100644 --- a/openair1/SIMULATION/LTE_PHY/signalanalyzer.h +++ b/openair1/SIMULATION/LTE_PHY/signalanalyzer.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/syncsim.c b/openair1/SIMULATION/LTE_PHY/syncsim.c index 45b69adcc5..e491944ccf 100644 --- a/openair1/SIMULATION/LTE_PHY/syncsim.c +++ b/openair1/SIMULATION/LTE_PHY/syncsim.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include @@ -37,11 +30,6 @@ #include #include -#ifdef RTAI_ENABLED -#include -#include -#endif - #include "SIMULATION/TOOLS/defs.h" #include "SIMULATION/RF/defs.h" #include "PHY/types.h" @@ -51,9 +39,6 @@ #ifdef IFFT_FPGA #include "PHY/LTE_REFSIG/mod_table.h" #endif -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif #include "SCHED/defs.h" #include "SCHED/vars.h" #include "ARCH/CBMIMO1/DEVICE_DRIVER/vars.h" @@ -388,9 +373,6 @@ int main(int argc, char **argv) uint8_t extended_prefix_flag=0,frame_type=1; int8_t interf1=-21,interf2=-21; LTE_DL_FRAME_PARMS *frame_parms; -#ifdef EMOS - fifo_dump_emos emos_dump; -#endif FILE *input_fd=NULL,*pbch_file_fd=NULL; char input_val_str[50],input_val_str2[50]; @@ -413,7 +395,7 @@ int main(int argc, char **argv) DCI_ALLOC_t dci_alloc[8],dci_alloc_rx[8]; uint16_t n_rnti=1234,dci_cnt; - uint16_t coded_bits_per_codeword; + unsigned int coded_bits_per_codeword; double tmp_re,tmp_im,foff,deltaF=0.0,cs,sn; uint32_t carrier_freq[4]= {1907600000,1907600000,1907600000,1907600000}; uint32_t rf_mode[4] = {55759,55759,55759,55759}; @@ -437,13 +419,6 @@ int main(int argc, char **argv) int rx_offset_mod; -#ifdef RTAI_ENABLED - int period; - RTIME expected; - RT_TASK *task; -#define PERIOD 1000000000 -#endif - logInit(); number_of_cards = 1; @@ -701,23 +676,6 @@ int main(int argc, char **argv) } } -#ifdef RTAI_ENABLED - - if (!(task = rt_task_init_schmod(nam2num("SYNCSIM"), 0, 0, 0, SCHED_FIFO, 0xF))) { - printf("CANNOT INIT MASTER TASK\n"); - exit(1); - } - - rt_set_periodic_mode(); - - period = start_rt_timer(nano2count(PERIOD)); - - mlockall(MCL_CURRENT | MCL_FUTURE); - - rt_make_hard_real_time(); - rt_task_make_periodic(task, expected = rt_get_time() + 10*period, period); -#endif - #ifdef XFORMS if (do_forms==1) { @@ -1108,11 +1066,12 @@ int main(int argc, char **argv) ((DCI1_5MHz_FDD_t*)&DLSCH_alloc_pdu)->mcs = 0; ((DCI1_5MHz_FDD_t*)&DLSCH_alloc_pdu)->ndi = 1; ((DCI1_5MHz_FDD_t*)&DLSCH_alloc_pdu)->rv = 0; - dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; + dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_FDD_t)); - dci_alloc[0].L = 2; - dci_alloc[0].rnti = n_rnti; - dci_alloc[0].format = format1; + dci_alloc[0].L = 2; + dci_alloc[0].rnti = n_rnti; + dci_alloc[0].format = format1; + dci_alloc[0].search_space = DCI_UE_SPACE; } else { ((DCI1E_5MHz_2A_M10PRB_TDD_t*)&DLSCH_alloc_pdu)->rah = 0; ((DCI1E_5MHz_2A_M10PRB_TDD_t*)&DLSCH_alloc_pdu)->rballoc = DLSCH_RB_ALLOC; @@ -1124,15 +1083,15 @@ int main(int argc, char **argv) ((DCI1E_5MHz_2A_M10PRB_TDD_t*)&DLSCH_alloc_pdu)->rv = 0; ((DCI1E_5MHz_2A_M10PRB_TDD_t*)&DLSCH_alloc_pdu)->tpmi = (transmission_mode>=5 ? 5 : 0); // precoding ((DCI1E_5MHz_2A_M10PRB_TDD_t*)&DLSCH_alloc_pdu)->dl_power_off = (transmission_mode==5 ? 0 : 1); - dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; + dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t)); - dci_alloc[0].L = 2; - dci_alloc[0].rnti = n_rnti; - dci_alloc[0].format = format1E_2A_M10PRB; + dci_alloc[0].L = 2; + dci_alloc[0].rnti = n_rnti; + dci_alloc[0].format = format1E_2A_M10PRB; + dci_alloc[0].search_space = DCI_UE_SPACE; } num_pdcch_symbols = generate_dci_top(1, - 0, dci_alloc, 0, AMP, @@ -1141,7 +1100,6 @@ int main(int argc, char **argv) subframe); /* num_pdcch_symbols = generate_dci_top(1, - 0, dci_alloc, 0, AMP, @@ -1381,11 +1339,6 @@ int main(int argc, char **argv) for (trial=0; triallte_ue_common_vars, PHY_vars_UE[UE_idx]->lte_ue_pdcch_vars, &PHY_vars_UE[UE_idx]->lte_frame_parms, + frame, subframe, 0, (PHY_vars_UE[UE_idx]->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, @@ -1541,6 +1495,7 @@ int main(int argc, char **argv) PDSCH, 0, 1, + frame, subframe, // subframe, l, // symbol (l==PHY_vars_UE[UE_idx]->lte_ue_pdcch_vars[0]->num_pdcch_symbols)?1:0, // first_symbol_flag @@ -1571,6 +1526,7 @@ int main(int argc, char **argv) PDSCH, 0, 1, + frame, subframe, // subframe, l, // symbol 0, // first_symbol_flag @@ -1595,6 +1551,7 @@ int main(int argc, char **argv) PDSCH, 0, 1, + frame, subframe, // subframe, l, // symbol 0, // first_symbol_flag @@ -1625,6 +1582,7 @@ int main(int argc, char **argv) PDSCH, 0, 1, + frame, subframe, // subframe, l, // symbol 0, // first_symbol_flag @@ -1658,6 +1616,7 @@ int main(int argc, char **argv) PHY_vars_UE[UE_idx]->lte_ue_pdsch_vars[0]->llr[0], &PHY_vars_UE[UE_idx]->lte_frame_parms, PHY_vars_UE[UE_idx]->dlsch_ue[0][0], + frame, subframe, 0, PHY_vars_UE[UE_idx]->lte_ue_pdcch_vars[0]->num_pdcch_symbols); @@ -1684,9 +1643,9 @@ int main(int argc, char **argv) frame_parms, PHY_vars_UE[0]->lte_ue_pdcch_vars[0]->num_pdcch_symbols, (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.dl_ch_estimates_time, - (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.dl_ch_estimates[0], + (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0], (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.rxdata, - (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.rxdataF, + (int16_t**)PHY_vars_UE[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF, (int16_t*)PHY_vars_UE[0]->lte_ue_pdcch_vars[0]->rxdataF_comp[0], (int16_t*)PHY_vars_UE[0]->lte_ue_pdsch_vars[0]->rxdataF_comp[0], (int16_t*)PHY_vars_UE[0]->lte_ue_pdsch_vars[1]->rxdataF_comp[0], @@ -1700,9 +1659,9 @@ int main(int argc, char **argv) frame_parms, PHY_vars_UE[1]->lte_ue_pdcch_vars[0]->num_pdcch_symbols, (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.dl_ch_estimates_time, - (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.dl_ch_estimates[0], + (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0], (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.rxdata, - (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.rxdataF, + (int16_t**)PHY_vars_UE[1]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF, (int16_t*)PHY_vars_UE[1]->lte_ue_pdcch_vars[0]->rxdataF_comp[0], (int16_t*)PHY_vars_UE[1]->lte_ue_pdsch_vars[0]->rxdataF_comp[0], (int16_t*)PHY_vars_UE[1]->lte_ue_pdsch_vars[3]->rxdataF_comp[0], @@ -1719,10 +1678,10 @@ int main(int argc, char **argv) if (n_frames==1) { - write_output("H00.m","h00",&(PHY_vars_UE[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H00.m","h00",&(PHY_vars_UE[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); if (n_tx==2) - write_output("H10.m","h10",&(PHY_vars_UE[0]->lte_ue_common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); + write_output("H10.m","h10",&(PHY_vars_UE[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); write_output("rxsig0.m","rxs0", PHY_vars_UE[0]->lte_ue_common_vars.rxdata[0],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); write_output("rxsigF0.m","rxsF0", PHY_vars_UE[0]->lte_ue_common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*nsymb,2,1); @@ -1740,7 +1699,7 @@ int main(int argc, char **argv) PHY_vars_UE[0]->lte_ue_pdcch_vars[0]->num_pdcch_symbols, 0); - dump_dlsch2(PHY_vars_UE[0],0,coded_bits_per_codeword); + dump_dlsch2(PHY_vars_UE[0],0,0,&coded_bits_per_codeword); } } else { @@ -1753,11 +1712,6 @@ int main(int argc, char **argv) ioctl(openair_fd,openair_START_TX_SIG,(void *)NULL); } -#ifdef RTAI_ENABLED - rt_make_soft_real_time(); - rt_task_delete(task); -#endif - #ifdef XFORMS if (do_forms==1) { diff --git a/openair1/SIMULATION/LTE_PHY/test.c b/openair1/SIMULATION/LTE_PHY/test.c index abaf917f7a..b7781ce690 100644 --- a/openair1/SIMULATION/LTE_PHY/test.c +++ b/openair1/SIMULATION/LTE_PHY/test.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include "SIMULATION/TOOLS/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c index e2a99dd7a4..70bbda151c 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c +++ b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h index d8d143817c..81777ff958 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h +++ b/openair1/SIMULATION/LTE_PHY/ulsignalgenerator.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include "PHY/types.h" #include "PHY/defs.h" diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 56f8eb146a..cabe966491 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -1,34 +1,26 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file ulsim.c - \brief Top-level DL simulator + \brief Top-level UL simulator \author R. Knopp \date 2011 - 2014 \version 0.1 @@ -50,14 +42,18 @@ #include "SCHED/vars.h" #include "LAYER2/MAC/vars.h" #include "OCG_vars.h" +#include "intertask_interface_init.h" + +#include "unitary_defs.h" #include "PHY/TOOLS/lte_phy_scope.h" -extern unsigned short dftsizes[33]; -extern short *ul_ref_sigs[30][2][33]; +PHY_VARS_eNB *eNB; +PHY_VARS_UE *UE; + +double cpuf; + -PHY_VARS_eNB *PHY_vars_eNB; -PHY_VARS_UE *PHY_vars_UE; //#define MCS_COUNT 23//added for PHY abstraction @@ -83,6 +79,94 @@ double t_rx_min = 1000000000; /*!< \brief initial min process time for tx */ int n_tx_dropped = 0; /*!< \brief initial max process time for tx */ int n_rx_dropped = 0; /*!< \brief initial max process time for rx */ + +void fill_ulsch_dci(PHY_VARS_eNB *eNB,void *UL_dci,int first_rb,int nb_rb,int mcs,int ndi,int cqi_flag) { + + switch (eNB->frame_parms.N_RB_UL) { + case 6: + break; + + case 25: + if (eNB->frame_parms.frame_type == TDD) { + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->type = 0; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + //printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_TDD_1_6_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci); + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->mcs = mcs; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->ndi = ndi; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->TPC = 0; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->cshift = 0; + ((DCI0_5MHz_TDD_1_6_t*)UL_dci)->dai = 1; + } else { + ((DCI0_5MHz_FDD_t*)UL_dci)->type = 0; + ((DCI0_5MHz_FDD_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + // printf("nb_rb %d/%d, rballoc %d (dci %x) (dcip %p)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_FDD_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci,UL_dci); + ((DCI0_5MHz_FDD_t*)UL_dci)->mcs = mcs; + ((DCI0_5MHz_FDD_t*)UL_dci)->ndi = ndi; + ((DCI0_5MHz_FDD_t*)UL_dci)->TPC = 0; + ((DCI0_5MHz_FDD_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_5MHz_FDD_t*)UL_dci)->cshift = 0; + } + + break; + + case 50: + if (eNB->frame_parms.frame_type == TDD) { + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->type = 0; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + // printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_TDD_1_6_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci); + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->mcs = mcs; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->ndi = ndi; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->TPC = 0; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->cshift = 0; + ((DCI0_10MHz_TDD_1_6_t*)UL_dci)->dai = 1; + } else { + ((DCI0_10MHz_FDD_t*)UL_dci)->type = 0; + ((DCI0_10MHz_FDD_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + //printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_FDD_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci); + ((DCI0_10MHz_FDD_t*)UL_dci)->mcs = mcs; + ((DCI0_10MHz_FDD_t*)UL_dci)->ndi = ndi; + ((DCI0_10MHz_FDD_t*)UL_dci)->TPC = 0; + ((DCI0_10MHz_FDD_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_10MHz_FDD_t*)UL_dci)->cshift = 0; + } + + break; + + case 100: + if (eNB->frame_parms.frame_type == TDD) { + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->type = 0; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + // printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_TDD_1_6_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci); + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->mcs = mcs; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->ndi = ndi; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->TPC = 0; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->cshift = 0; + ((DCI0_20MHz_TDD_1_6_t*)UL_dci)->dai = 1; + } else { + ((DCI0_20MHz_FDD_t*)UL_dci)->type = 0; + ((DCI0_20MHz_FDD_t*)UL_dci)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 + // printf("nb_rb %d/%d, rballoc %d (dci %x) (UL_dci %p)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_FDD_t*)UL_dci)->rballoc,*(uint32_t *)UL_dci,(void*)UL_dci); + ((DCI0_20MHz_FDD_t*)UL_dci)->mcs = mcs; + ((DCI0_20MHz_FDD_t*)UL_dci)->ndi = ndi; + ((DCI0_20MHz_FDD_t*)UL_dci)->TPC = 0; + ((DCI0_20MHz_FDD_t*)UL_dci)->cqi_req = cqi_flag&1; + ((DCI0_20MHz_FDD_t*)UL_dci)->cshift = 0; + } + + break; + + default: + break; + } + +} + +extern void eNB_fep_full(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc); +extern void eNB_fep_full_2thread(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc); + int main(int argc, char **argv) { @@ -91,14 +175,19 @@ int main(int argc, char **argv) int aarx,aatx; double channelx,channely; - double sigma2, sigma2_dB=10,SNR,SNR2,snr0=-2.0,snr1,SNRmeas,rate,saving_bler=0; + double sigma2, sigma2_dB=10,SNR,SNR2=0,snr0=-2.0,snr1,SNRmeas,rate,saving_bler=0; double input_snr_step=.2,snr_int=30; double blerr; int **txdata; LTE_DL_FRAME_PARMS *frame_parms; - double **s_re,**s_im,**r_re,**r_im; + double s_re0[30720],s_im0[30720],r_re0[30720],r_im0[30720]; + double s_re1[30720],s_im1[30720],r_re1[30720],r_im1[30720]; + double *s_re[2]={s_re0,s_re1}; + double *s_im[2]={s_im0,s_im1}; + double *r_re[2]={r_re0,r_re1}; + double *r_im[2]={r_im0,r_im1}; double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel double iqim=0.0; uint8_t extended_prefix_flag=0; @@ -108,7 +197,7 @@ int main(int argc, char **argv) int chMod = 0 ; int UE_id = 0; unsigned char nb_rb=25,first_rb=0,mcs=0,round=0,bundling_flag=1; - unsigned char l; + //unsigned char l; unsigned char awgn_flag = 0 ; SCM_t channel_model=Rice1; @@ -157,14 +246,14 @@ int main(int argc, char **argv) int hold_channel=0; channel_desc_t *UE2eNB; - uint8_t control_only_flag = 0; + //uint8_t control_only_flag = 0; int delay = 0; double maxDoppler = 0.0; uint8_t srs_flag = 0; uint8_t N_RB_DL=25,osf=1; - uint8_t cyclic_shift = 0; + //uint8_t cyclic_shift = 0; uint8_t cooperation_flag = 0; //0 no cooperation, 1 delay diversity, 2 Alamouti uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; uint8_t tdd_config=3,frame_type=FDD; @@ -184,19 +273,29 @@ int main(int argc, char **argv) char channel_model_input[10]; uint8_t max_turbo_iterations=4; - uint8_t llr8_flag=0; + uint8_t parallel_flag=0; int nb_rb_set = 0; int sf; int threequarter_fs=0; + int ndi; + opp_enabled=1; // to enable the time meas cpu_freq_GHz = (double)get_cpu_freq_GHz(); + cpuf = cpu_freq_GHz; printf("Detected cpu_freq %f GHz\n",cpu_freq_GHz); - logInit(); + /* + // enable these lines if you need debug info + // however itti will catch all signals, so ctrl-c won't work anymore + // alternatively you can disable ITTI completely in CMakeLists.txt + itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL); + set_comp_log(PHY,LOG_DEBUG,LOG_MED,1); + set_glog(LOG_DEBUG,LOG_MED); + */ while ((c = getopt (argc, argv, "hapZEbm:n:Y:X:x:s:w:e:q:d:D:O:c:r:i:f:y:c:oA:C:R:g:N:l:S:T:QB:PI:LF")) != -1) { switch (c) { @@ -364,9 +463,9 @@ int main(int argc, char **argv) first_rb = atoi(optarg); break; - case 'c': - cyclic_shift = atoi(optarg); - break; + //case 'c': + // cyclic_shift = atoi(optarg); + // break; case 'E': threequarter_fs=1; @@ -441,7 +540,7 @@ int main(int argc, char **argv) break; case 'L': - llr8_flag=1; + parallel_flag=1; break; case 'I': @@ -458,7 +557,9 @@ int main(int argc, char **argv) case 'h': default: - printf("%s -h(elp) -a(wgn on) -m mcs -n n_frames -s snr0 -t delay_spread -p (extended prefix on) -r nb_rb -f first_rb -c cyclic_shift -o (srs on) -g channel_model [A:M] Use 3GPP 25.814 SCM-A/B/C/D('A','B','C','D') or 36-101 EPA('E'), EVA ('F'),ETU('G') models (ignores delay spread and Ricean factor), Rayghleigh8 ('H'), Rayleigh1('I'), Rayleigh1_corr('J'), Rayleigh1_anticorr ('K'), Rice8('L'), Rice1('M'), -d Channel delay, -D maximum Doppler shift \n", + /* option "-c cyclic_shift" is not used, let's remove from documentation */ + //printf("%s -h(elp) -a(wgn on) -m mcs -n n_frames -s snr0 -t delay_spread -p (extended prefix on) -r nb_rb -f first_rb -c cyclic_shift -o (srs on) -g channel_model [A:M] Use 3GPP 25.814 SCM-A/B/C/D('A','B','C','D') or 36-101 EPA('E'), EVA ('F'),ETU('G') models (ignores delay spread and Ricean factor), Rayghleigh8 ('H'), Rayleigh1('I'), Rayleigh1_corr('J'), Rayleigh1_anticorr ('K'), Rice8('L'), Rice1('M'), -d Channel delay, -D maximum Doppler shift \n", + printf("%s -h(elp) -a(wgn on) -m mcs -n n_frames -s snr0 -t delay_spread -p (extended prefix on) -r nb_rb -f first_rb -o (srs on) -g channel_model [A:M] Use 3GPP 25.814 SCM-A/B/C/D('A','B','C','D') or 36-101 EPA('E'), EVA ('F'),ETU('G') models (ignores delay spread and Ricean factor), Rayghleigh8 ('H'), Rayleigh1('I'), Rayleigh1_corr('J'), Rayleigh1_anticorr ('K'), Rice8('L'), Rice1('M'), -d Channel delay, -D maximum Doppler shift \n", argv[0]); exit(1); break; @@ -466,6 +567,7 @@ int main(int argc, char **argv) } lte_param_init(1, + 1, n_rx, 1, extended_prefix_flag, @@ -477,39 +579,26 @@ int main(int argc, char **argv) osf, 0); - if (nb_rb_set == 0) - nb_rb = PHY_vars_eNB->lte_frame_parms.N_RB_UL; + // for a call to phy_reset_ue later we need PHY_vars_UE_g allocated and pointing to UE + PHY_vars_UE_g = (PHY_VARS_UE***)malloc(sizeof(PHY_VARS_UE**)); + PHY_vars_UE_g[0] = (PHY_VARS_UE**) malloc(sizeof(PHY_VARS_UE*)); + PHY_vars_UE_g[0][0] = UE; - printf("1 . rxdataF_comp[0] %p\n",PHY_vars_eNB->lte_eNB_pusch_vars[0]->rxdataF_comp[0][0]); + if (nb_rb_set == 0) + nb_rb = eNB->frame_parms.N_RB_UL; + + printf("1 . rxdataF_comp[0] %p\n",eNB->pusch_vars[0]->rxdataF_comp[0][0]); printf("Setting mcs = %d\n",mcs); printf("n_frames = %d\n", n_frames); snr1 = snr0+snr_int; printf("SNR0 %f, SNR1 %f\n",snr0,snr1); - /* - txdataF = (int **)malloc16(2*sizeof(int*)); - txdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - txdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES); + frame_parms = &eNB->frame_parms; - txdata = (int **)malloc16(2*sizeof(int*)); - txdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - txdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - */ + txdata = UE->common_vars.txdata; - frame_parms = &PHY_vars_eNB->lte_frame_parms; - - txdata = PHY_vars_UE->lte_ue_common_vars.txdata; - - - s_re = malloc(2*sizeof(double*)); - s_im = malloc(2*sizeof(double*)); - r_re = malloc(2*sizeof(double*)); - r_im = malloc(2*sizeof(double*)); - // r_re0 = malloc(2*sizeof(double*)); - // r_im0 = malloc(2*sizeof(double*)); - - nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == NORMAL) ? 14 : 12; + nsymb = (eNB->frame_parms.Ncp == NORMAL) ? 14 : 12; sprintf(bler_fname,"ULbler_mcs%d_nrb%d_ChannelModel%d_nsim%d.csv",mcs,nb_rb,chMod,n_frames); @@ -538,32 +627,6 @@ int main(int argc, char **argv) } } - /* - if(abstx) { - sprintf(fperen_name,"ULchan_estims_F_mcs%d_rb%d_chanMod%d_nframes%d_chanReal%d.m",mcs,nb_rb,chMod,n_frames,n_ch_rlz); - fperen = fopen(fperen_name,"a+"); - fprintf(fperen,"chest_f = ["); - fclose(fperen); - - sprintf(fmageren_name,"ChanMag_F_mcs%d_rb%d_chanMod%d_nframes%d_chanReal%d.m",mcs,nb_rb,chMod,n_frames,n_ch_rlz); - fmageren = fopen(fmageren_name,"a+"); - fprintf(fmageren,"mag_f = ["); - fclose(fmageren); - - sprintf(flogeren_name,"Log2Max_mcs%d_rb%d_chanMod%d_nframes%d_chanReal%d.m",mcs,nb_rb,chMod,n_frames,n_ch_rlz); - flogeren = fopen(flogeren_name,"a+"); - fprintf(flogeren,"mag_f = ["); - fclose(flogeren); - } - */ - - /* - sprintf(ftxlev_name,"txlevel_mcs%d_rb%d_chanMod%d_nframes%d_chanReal%d.m",mcs,nb_rb,chMod,n_frames,n_ch_rlz); - ftxlev = fopen(ftxlev_name,"a+"); - fprintf(ftxlev,"txlev = ["); - fclose(ftexlv); - */ - if(abstx) { // CSV file sprintf(csv_fname,"EULdataout_tx%d_mcs%d_nbrb%d_chan%d_nsimus%d_eren.m",transmission_mode,mcs,nb_rb,chMod,n_frames); @@ -575,17 +638,6 @@ int main(int argc, char **argv) fprintf(csv_fdUL,"data_all%d=[",mcs); } - for (i=0; i<2; i++) { - s_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - s_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_re[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - r_im[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // r_re0[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // bzero(r_re0[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // r_im0[i] = malloc(FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - // bzero(r_im0[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double)); - } - if (xforms==1) { fl_initialize (&argc, argv, NULL, 0, 0); @@ -594,40 +646,53 @@ int main(int argc, char **argv) fl_show_form (form_enb->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); } - PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = 14; + UE->pdcch_vars[0][0]->crnti = 14; - PHY_vars_UE->lte_frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2; - PHY_vars_UE->lte_frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7; - PHY_vars_UE->soundingrs_ul_config_dedicated[eNB_id].srs_Bandwidth = 0; - PHY_vars_UE->soundingrs_ul_config_dedicated[eNB_id].transmissionComb = 0; - PHY_vars_UE->soundingrs_ul_config_dedicated[eNB_id].freqDomainPosition = 0; + UE->frame_parms.soundingrs_ul_config_common.enabled_flag = srs_flag; + UE->frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2; + UE->frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 3; + UE->soundingrs_ul_config_dedicated[eNB_id].srsConfigDedicatedSetup = srs_flag; + UE->soundingrs_ul_config_dedicated[eNB_id].duration = 1; + UE->soundingrs_ul_config_dedicated[eNB_id].srs_ConfigIndex = 2; + UE->soundingrs_ul_config_dedicated[eNB_id].srs_Bandwidth = 0; + UE->soundingrs_ul_config_dedicated[eNB_id].transmissionComb = 0; + UE->soundingrs_ul_config_dedicated[eNB_id].freqDomainPosition = 0; + UE->soundingrs_ul_config_dedicated[eNB_id].cyclicShift = 0; - PHY_vars_eNB->lte_frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2; - PHY_vars_eNB->lte_frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7; + eNB->frame_parms.soundingrs_ul_config_common.enabled_flag = srs_flag; + eNB->frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2; + eNB->frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 3; + eNB->soundingrs_ul_config_dedicated[UE_id].srsConfigDedicatedSetup = srs_flag; + eNB->soundingrs_ul_config_dedicated[UE_id].duration = 1; + eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex = 2; + eNB->soundingrs_ul_config_dedicated[UE_id].srs_Bandwidth = 0; + eNB->soundingrs_ul_config_dedicated[UE_id].transmissionComb = 0; + eNB->soundingrs_ul_config_dedicated[UE_id].freqDomainPosition = 0; + eNB->soundingrs_ul_config_dedicated[UE_id].cyclicShift = 0; - PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex = 1; - PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].srs_Bandwidth = 0; - PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].transmissionComb = 0; - PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].freqDomainPosition = 0; - PHY_vars_eNB->cooperation_flag = cooperation_flag; - // PHY_vars_eNB->eNB_UE_stats[0].SRS_parameters = PHY_vars_UE->SRS_parameters; + eNB->cooperation_flag = cooperation_flag; - PHY_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK; - PHY_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index = beta_RI; - PHY_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI; - PHY_vars_UE->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK; - PHY_vars_UE->pusch_config_dedicated[eNB_id].betaOffset_RI_Index = beta_RI; - PHY_vars_UE->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI; + eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK; + eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index = beta_RI; + eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI; + UE->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK; + UE->pusch_config_dedicated[eNB_id].betaOffset_RI_Index = beta_RI; + UE->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI; + + UE->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled = 1; + + // disable periodic cqi/ri reporting + UE->cqi_report_config[eNB_id].CQI_ReportPeriodic.ri_ConfigIndex = -1; + UE->cqi_report_config[eNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex = -1; - PHY_vars_UE->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled = 1; printf("PUSCH Beta : ACK %f, RI %f, CQI %f\n",(double)beta_ack[beta_ACK]/8,(double)beta_ri[beta_RI]/8,(double)beta_cqi[beta_CQI]/8); - UE2eNB = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE->lte_frame_parms.nb_antennas_rx, + UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx, + UE->frame_parms.nb_antennas_rx, channel_model, - N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL), - N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL), + N_RB2sampling_rate(eNB->frame_parms.N_RB_UL), + N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL), forgetting_factor, delay, 0); @@ -635,152 +700,88 @@ int main(int argc, char **argv) UE2eNB->max_Doppler = maxDoppler; // NN: N_RB_UL has to be defined in ulsim - PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0); - PHY_vars_UE->ulsch_ue[0] = new_ue_ulsch(N_RB_DL,0); + eNB->ulsch[0] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0); + UE->ulsch[0] = new_ue_ulsch(N_RB_DL,0); + if (parallel_flag == 1) { + extern void init_fep_thread(PHY_VARS_eNB *, pthread_attr_t *); + extern void init_td_thread(PHY_VARS_eNB *, pthread_attr_t *); + init_fep_thread(eNB,NULL); + init_td_thread(eNB,NULL); + } // Create transport channel structures for 2 transport blocks (MIMO) for (i=0; i<2; i++) { - PHY_vars_eNB->dlsch_eNB[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0); - PHY_vars_UE->dlsch_ue[0][i] = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0); - - if (!PHY_vars_eNB->dlsch_eNB[0][i]) { + eNB->dlsch[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0,&eNB->frame_parms); + if (!eNB->dlsch[0][i]) { printf("Can't get eNB dlsch structures\n"); exit(-1); } - - if (!PHY_vars_UE->dlsch_ue[0][i]) { - printf("Can't get ue dlsch structures\n"); - exit(-1); + eNB->dlsch[0][i]->rnti = 14; + } + /* allocate memory for both subframes (only one is really used + * but there is now "copy_harq_proc_struct" which needs both + * to be valid) + * TODO: refine this somehow (necessary?) + */ + for (sf = 0; sf < 2; sf++) { + for (i=0; i<2; i++) { + UE->dlsch[sf][0][i] = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0); + if (!UE->dlsch[sf][0][i]) { + printf("Can't get ue dlsch structures\n"); + exit(-1); + } + UE->dlsch[sf][0][i]->rnti = 14; } - - PHY_vars_eNB->dlsch_eNB[0][i]->rnti = 14; - PHY_vars_UE->dlsch_ue[0][i]->rnti = 14; - - } - - - switch (PHY_vars_eNB->lte_frame_parms.N_RB_UL) { - case 6: - break; - - case 25: - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->cshift = 0; - ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai = 1; - } else { - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->cshift = 0; - } - - break; - - case 50: - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->cshift = 0; - ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai = 1; - } else { - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->cshift = 0; - } - - break; - - case 100: - if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->cshift = 0; - ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai = 1; - } else { - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->type = 0; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8 - printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu); - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->mcs = mcs; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->ndi = 1; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->TPC = 0; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->cqi_req = cqi_flag&1; - ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->cshift = 0; - } - - break; - - default: - break; } + UE->dlsch_SI[0] = new_ue_dlsch(1,1,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0); + UE->dlsch_ra[0] = new_ue_dlsch(1,1,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0); - PHY_vars_UE->PHY_measurements.rank[0] = 0; - PHY_vars_UE->transmission_mode[0] = 2; - PHY_vars_UE->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing; - PHY_vars_eNB->transmission_mode[0] = 2; - PHY_vars_eNB->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing; - PHY_vars_UE->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1; - PHY_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1; - PHY_vars_UE->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; - PHY_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; - PHY_vars_UE->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; - PHY_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; - PHY_vars_UE->frame_tx=1; + UE->measurements.rank[0] = 0; + UE->transmission_mode[0] = 2; + UE->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing; + eNB->transmission_mode[0] = 2; + eNB->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing; + UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1; + eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1; + UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; + eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; + UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; + eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; - for (sf=0; sf<10; sf++) { - PHY_vars_eNB->proc[sf].frame_tx=1; - PHY_vars_eNB->proc[sf].subframe_tx=sf; - PHY_vars_eNB->proc[sf].frame_rx=1; - PHY_vars_eNB->proc[sf].subframe_rx=sf; - } + + UE->mac_enabled=0; + + eNB_rxtx_proc_t *proc_rxtx = &eNB->proc.proc_rxtx[subframe&1]; + UE_rxtx_proc_t *proc_rxtx_ue = &UE->proc.proc_rxtx[subframe&1]; + proc_rxtx->frame_rx=1; + proc_rxtx->subframe_rx=subframe; + + proc_rxtx->frame_tx=pdcch_alloc2ul_frame(&eNB->frame_parms,1,subframe); + proc_rxtx->subframe_tx=pdcch_alloc2ul_subframe(&eNB->frame_parms,subframe); + + proc_rxtx_ue->frame_tx = proc_rxtx->frame_rx; + proc_rxtx_ue->frame_rx = proc_rxtx->frame_tx; + proc_rxtx_ue->subframe_tx = proc_rxtx->subframe_rx; + proc_rxtx_ue->subframe_rx = proc_rxtx->subframe_tx; printf("Init UL hopping UE\n"); - init_ul_hopping(&PHY_vars_UE->lte_frame_parms); + init_ul_hopping(&UE->frame_parms); printf("Init UL hopping eNB\n"); - init_ul_hopping(&PHY_vars_eNB->lte_frame_parms); - - PHY_vars_eNB->proc[subframe].frame_rx = PHY_vars_UE->frame_tx; - - if (ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe) > subframe) // allocation was in previous frame - PHY_vars_eNB->proc[ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)].frame_tx = (PHY_vars_UE->frame_tx-1)&1023; - - PHY_vars_UE->dlsch_ue[0][0]->harq_ack[ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)].send_harq_status = 1; + init_ul_hopping(&eNB->frame_parms); - // printf("UE frame %d, eNB frame %d (eNB frame_tx %d)\n",PHY_vars_UE->frame,PHY_vars_eNB->proc[subframe].frame_rx,PHY_vars_eNB->proc[ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)].frame_tx); - PHY_vars_UE->frame_tx = (PHY_vars_UE->frame_tx-1)&1023; + UE->dlsch[subframe&1][0][0]->harq_ack[ul_subframe2pdcch_alloc_subframe(&eNB->frame_parms,subframe)].send_harq_status = 1; + UE->ulsch_Msg3_active[eNB_id] = 0; + UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1; + /* generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu, 14, - ul_subframe2pdcch_alloc_subframe(&PHY_vars_UE->lte_frame_parms,subframe), + proc_rxtx->subframe_tx, format0, - PHY_vars_UE, + UE, + proc_rxtx_ue, SI_RNTI, 0, P_RNTI, @@ -790,29 +791,27 @@ int main(int argc, char **argv) // printf("RIV %d\n",UL_alloc_pdu.rballoc); - generate_eNB_ulsch_params_from_dci((void *)&UL_alloc_pdu, + generate_eNB_ulsch_params_from_dci(eNB,proc_rxtx, + (void *)&UL_alloc_pdu, 14, - ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe), format0, 0, - PHY_vars_eNB, - SI_RNTI, + SI_RNTI, 0, P_RNTI, CBA_RNTI, srs_flag); + */ coded_bits_per_codeword = nb_rb * (12 * get_Qm_ul(mcs)) * nsymb; - if (cqi_flag == 1) coded_bits_per_codeword-=PHY_vars_UE->ulsch_ue[0]->O; + if (cqi_flag == 1) coded_bits_per_codeword-=UE->ulsch[0]->O; rate = (double)dlsch_tbs25[get_I_TBS(mcs)][nb_rb-1]/(coded_bits_per_codeword); printf("Rate = %f (mod %d), coded bits %d\n",rate,get_Qm_ul(mcs),coded_bits_per_codeword); - PHY_vars_UE->frame_tx = (PHY_vars_UE->frame_tx+1)&1023; - for (ch_realization=0; ch_realization5) || (subframe < 4)) - // PHY_vars_UE->frame++; + // UE->frame++; for (SNR=snr0; SNRlte_frame_parms,PHY_vars_UE->frame_tx,subframe); - input_buffer_length = PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->TBS/8; - input_buffer = (unsigned char *)malloc(input_buffer_length+4); - // printf("UL frame %d/subframe %d, harq_pid %d\n",PHY_vars_UE->frame,subframe,harq_pid); + harq_pid = subframe2harq_pid(&UE->frame_parms,proc_rxtx_ue->frame_tx,subframe); + input_buffer_length = UE->ulsch[0]->harq_processes[harq_pid]->TBS/8; + input_buffer = (unsigned char *)memalign(32,input_buffer_length+64); + // printf("UL frame %d/subframe %d, harq_pid %d\n",UE->frame,subframe,harq_pid); if (input_fdUL == NULL) { @@ -878,6 +877,7 @@ int main(int argc, char **argv) while (!feof(input_fdUL)) { ret=fscanf(input_fdUL,"%s %s",input_val_str,input_val_str2);//&input_val1,&input_val2); + if (ret != 2) printf("ERROR: error reading file\n"); if ((i%4)==0) { ((short*)txdata[0])[i/2] = (short)((1<<15)*strtod(input_val_str,NULL)); @@ -904,35 +904,35 @@ int main(int argc, char **argv) avg_iter = 0; iter_trials=0; - reset_meas(&PHY_vars_UE->phy_proc_tx); - reset_meas(&PHY_vars_UE->ofdm_mod_stats); - reset_meas(&PHY_vars_UE->ulsch_modulation_stats); - reset_meas(&PHY_vars_UE->ulsch_encoding_stats); - reset_meas(&PHY_vars_UE->ulsch_interleaving_stats); - reset_meas(&PHY_vars_UE->ulsch_rate_matching_stats); - reset_meas(&PHY_vars_UE->ulsch_turbo_encoding_stats); - reset_meas(&PHY_vars_UE->ulsch_segmentation_stats); - reset_meas(&PHY_vars_UE->ulsch_multiplexing_stats); + reset_meas(&UE->phy_proc_tx); + reset_meas(&UE->ofdm_mod_stats); + reset_meas(&UE->ulsch_modulation_stats); + reset_meas(&UE->ulsch_encoding_stats); + reset_meas(&UE->ulsch_interleaving_stats); + reset_meas(&UE->ulsch_rate_matching_stats); + reset_meas(&UE->ulsch_turbo_encoding_stats); + reset_meas(&UE->ulsch_segmentation_stats); + reset_meas(&UE->ulsch_multiplexing_stats); - reset_meas(&PHY_vars_eNB->phy_proc_rx); - reset_meas(&PHY_vars_eNB->ofdm_demod_stats); - reset_meas(&PHY_vars_eNB->ulsch_channel_estimation_stats); - reset_meas(&PHY_vars_eNB->ulsch_freq_offset_estimation_stats); - reset_meas(&PHY_vars_eNB->rx_dft_stats); - reset_meas(&PHY_vars_eNB->ulsch_decoding_stats); - reset_meas(&PHY_vars_eNB->ulsch_turbo_decoding_stats); - reset_meas(&PHY_vars_eNB->ulsch_deinterleaving_stats); - reset_meas(&PHY_vars_eNB->ulsch_demultiplexing_stats); - reset_meas(&PHY_vars_eNB->ulsch_rate_unmatching_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_init_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_alpha_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_beta_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_gamma_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_ext_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_intl1_stats); - reset_meas(&PHY_vars_eNB->ulsch_tc_intl2_stats); + reset_meas(&eNB->phy_proc_rx); + reset_meas(&eNB->ofdm_demod_stats); + reset_meas(&eNB->ulsch_channel_estimation_stats); + reset_meas(&eNB->ulsch_freq_offset_estimation_stats); + reset_meas(&eNB->rx_dft_stats); + reset_meas(&eNB->ulsch_decoding_stats); + reset_meas(&eNB->ulsch_turbo_decoding_stats); + reset_meas(&eNB->ulsch_deinterleaving_stats); + reset_meas(&eNB->ulsch_demultiplexing_stats); + reset_meas(&eNB->ulsch_rate_unmatching_stats); + reset_meas(&eNB->ulsch_tc_init_stats); + reset_meas(&eNB->ulsch_tc_alpha_stats); + reset_meas(&eNB->ulsch_tc_beta_stats); + reset_meas(&eNB->ulsch_tc_gamma_stats); + reset_meas(&eNB->ulsch_tc_ext_stats); + reset_meas(&eNB->ulsch_tc_intl1_stats); + reset_meas(&eNB->ulsch_tc_intl2_stats); - // initialization + // initialization struct list time_vector_tx; initialize(&time_vector_tx); struct list time_vector_tx_ifft; @@ -951,32 +951,54 @@ int main(int argc, char **argv) struct list time_vector_rx_dec; initialize(&time_vector_rx_dec); + ndi=0; + + phy_reset_ue(0,0,0); + UE->UE_mode[eNB_id]=PUSCH; + for (trials = 0; trialsframe++; - // PHY_vars_eNB->frame++; - + // UE->frame++; + // eNB->frame++; + ndi = (1-ndi); fflush(stdout); round=0; while (round < 4) { - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->round=round; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->round=round; - // printf("Trial %d : Round %d ",trials,round); + eNB->ulsch[0]->harq_processes[harq_pid]->round=round; + UE->ulsch[0]->harq_processes[harq_pid]->round=round; + // printf("Trial %d : Round %d (subframe %d, frame %d)\n",trials,round,proc_rxtx_ue->subframe_rx,proc_rxtx_ue->frame_rx); round_trials[round]++; - if (round == 0) { - //PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Ndi = 1; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->rvidx = round>>1; - //PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->Ndi = 1; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->rvidx = round>>1; - } else { - //PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Ndi = 0; - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->rvidx = round>>1; - //PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->Ndi = 0; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->rvidx = round>>1; - } + fill_ulsch_dci(eNB,(void*)&UL_alloc_pdu,first_rb,nb_rb,mcs,ndi,cqi_flag); + + UE->ulsch_Msg3_active[eNB_id] = 0; + UE->ul_power_control_dedicated[eNB_id].accumulationEnabled=1; + generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu, + 14, + proc_rxtx->subframe_tx, + format0, + UE, + proc_rxtx_ue, + SI_RNTI, + 0, + P_RNTI, + CBA_RNTI, + 0, + srs_flag); + + generate_eNB_ulsch_params_from_dci(eNB,proc_rxtx, + (void *)&UL_alloc_pdu, + 14, + format0, + 0, + SI_RNTI, + 0, + P_RNTI, + CBA_RNTI, + srs_flag); + eNB->ulsch[0]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; ///////////////////// if (abstx) { @@ -996,39 +1018,37 @@ int main(int argc, char **argv) if (input_fdUL == NULL) { - start_meas(&PHY_vars_UE->phy_proc_tx); + eNB->proc.frame_rx = 1; + eNB->proc.subframe_rx = subframe; + proc_rxtx_ue->frame_tx = proc_rxtx->frame_rx; + proc_rxtx_ue->frame_rx = proc_rxtx->frame_tx; + proc_rxtx_ue->subframe_tx = proc_rxtx->subframe_rx; + proc_rxtx_ue->subframe_rx = proc_rxtx->subframe_tx; -#ifdef OFDMA_ULSCH + phy_procedures_UE_TX(UE,proc_rxtx_ue,0,0,normal_txrx,no_relay); + /* if (srs_flag) - generate_srs_tx(PHY_vars_UE,0,AMP,subframe); + generate_srs_tx(UE,0,AMP,subframe); - generate_drs_pusch(PHY_vars_UE,0,AMP,subframe,first_rb,nb_rb,0); - -#else - - if (srs_flag) - generate_srs_tx(PHY_vars_UE,0,AMP,subframe); - - generate_drs_pusch(PHY_vars_UE,0, + generate_drs_pusch(UE,proc_rxtx_ue,0, AMP,subframe, - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->first_rb, - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->nb_rb, + UE->ulsch[0]->harq_processes[harq_pid]->first_rb, + UE->ulsch[0]->harq_processes[harq_pid]->nb_rb, 0); -#endif if ((cqi_flag == 1) && (n_frames == 1) ) { - printf("CQI information (O %d) %d %d\n",PHY_vars_UE->ulsch_ue[0]->O, - PHY_vars_UE->ulsch_ue[0]->o[0],PHY_vars_UE->ulsch_ue[0]->o[1]); - print_CQI(PHY_vars_UE->ulsch_ue[0]->o,PHY_vars_UE->ulsch_ue[0]->uci_format,PHY_vars_UE->lte_frame_parms.N_RB_DL,0); + printf("CQI information (O %d) %d %d\n",UE->ulsch[0]->O, + UE->ulsch[0]->o[0],UE->ulsch[0]->o[1]); + print_CQI(UE->ulsch[0]->o,UE->ulsch[0]->uci_format,UE->frame_parms.N_RB_DL,0); } - PHY_vars_UE->ulsch_ue[0]->o_ACK[0] = taus()&1; + UE->ulsch[0]->o_ACK[0] = taus()&1; - start_meas(&PHY_vars_UE->ulsch_encoding_stats); + start_meas(&UE->ulsch_encoding_stats); if (ulsch_encoding(input_buffer, - PHY_vars_UE, + UE, harq_pid, eNB_id, 2, // transmission mode @@ -1039,101 +1059,96 @@ int main(int argc, char **argv) exit(-1); } - stop_meas(&PHY_vars_UE->ulsch_encoding_stats); + stop_meas(&UE->ulsch_encoding_stats); - start_meas(&PHY_vars_UE->ulsch_modulation_stats); -#ifdef OFDMA_ULSCH - ulsch_modulation(PHY_vars_UE->lte_ue_common_vars.txdataF,AMP, - PHY_vars_UE->frame_tx,subframe,&PHY_vars_UE->lte_frame_parms,PHY_vars_UE->ulsch_ue[0]); -#else - // printf("Generating PUSCH in subframe %d with amp %d, nb_rb %d\n",subframe,AMP,nb_rb); - ulsch_modulation(PHY_vars_UE->lte_ue_common_vars.txdataF,AMP, - PHY_vars_UE->frame_tx,subframe,&PHY_vars_UE->lte_frame_parms, - PHY_vars_UE->ulsch_ue[0]); -#endif - stop_meas(&PHY_vars_UE->ulsch_modulation_stats); + start_meas(&UE->ulsch_modulation_stats); + ulsch_modulation(UE->common_vars.txdataF,AMP, + proc_rxtx_ue->frame_tx,subframe,&UE->frame_parms, + UE->ulsch[0]); + stop_meas(&UE->ulsch_modulation_stats); + */ - if (n_frames==1) { - write_output("txsigF0UL.m","txsF0", &PHY_vars_UE->lte_ue_common_vars.txdataF[0][PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb*subframe],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1, - 1); - //write_output("txsigF1.m","txsF1", PHY_vars_UE->lte_ue_common_vars.txdataF[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); - } - tx_lev=0; - start_meas(&PHY_vars_UE->ofdm_mod_stats); - for (aa=0; aa<1; aa++) { + + /* + for (aa=0; aa<1; aa++) { if (frame_parms->Ncp == EXTENDED) - PHY_ofdm_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input - &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], // output - PHY_vars_UE->lte_frame_parms.ofdm_symbol_size, + PHY_ofdm_mod(&UE->common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], // input + &txdata[aa][eNB->frame_parms.samples_per_tti*subframe], // output + UE->frame_parms.ofdm_symbol_size, nsymb, // number of symbols - PHY_vars_UE->lte_frame_parms.nb_prefix_samples, // number of prefix samples + UE->frame_parms.nb_prefix_samples, // number of prefix samples CYCLIC_PREFIX); else - normal_prefix_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], - &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], + normal_prefix_mod(&UE->common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX], + &txdata[aa][eNB->frame_parms.samples_per_tti*subframe], nsymb, frame_parms); -#ifndef OFDMA_ULSCH - apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],subframe<<1); - apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],1+(subframe<<1)); -#endif - stop_meas(&PHY_vars_UE->ofdm_mod_stats); - stop_meas(&PHY_vars_UE->phy_proc_tx); - tx_lev += signal_energy(&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe], - PHY_vars_eNB->lte_frame_parms.samples_per_tti); + apply_7_5_kHz(UE,UE->common_vars.txdata[aa],subframe<<1); + apply_7_5_kHz(UE,UE->common_vars.txdata[aa],1+(subframe<<1)); +*/ + + tx_lev = signal_energy(&UE->common_vars.txdata[0][eNB->frame_parms.samples_per_tti*subframe], + eNB->frame_parms.samples_per_tti); + + + if (n_frames==1) { + write_output("txsigF0UL.m","txsF0", &UE->common_vars.txdataF[0][eNB->frame_parms.ofdm_symbol_size*nsymb*subframe],eNB->frame_parms.ofdm_symbol_size*nsymb,1, + 1); + //write_output("txsigF1.m","txsF1", UE->common_vars.txdataF[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); } - } // input_fd == NULL - - + + } // input_fd == NULL + tx_lev_dB = (unsigned int) dB_fixed_times10(tx_lev); if (n_frames==1) { - write_output("txsig0UL.m","txs0", &txdata[0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1); - // write_output("txsig1UL.m","txs1", &txdata[1][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1); + write_output("txsig0UL.m","txs0", &txdata[0][eNB->frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1); + // write_output("txsig1UL.m","txs1", &txdata[1][eNB->frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1); } //AWGN //Set target wideband RX noise level to N0 - sigma2_dB = N0;//10*log10((double)tx_lev) +10*log10(PHY_vars_UE->lte_frame_parms.ofdm_symbol_size/(PHY_vars_UE->lte_frame_parms.N_RB_DL*12)) - SNR; + sigma2_dB = N0;//10*log10((double)tx_lev) +10*log10(UE->frame_parms.ofdm_symbol_size/(UE->frame_parms.N_RB_DL*12)) - SNR; sigma2 = pow(10,sigma2_dB/10); // compute tx_gain to achieve target SNR (per resource element!) - tx_gain = sqrt(pow(10.0,.1*(N0+SNR))*(nb_rb*12/(double)PHY_vars_UE->lte_frame_parms.ofdm_symbol_size)/(double)tx_lev); + tx_gain = sqrt(pow(10.0,.1*(N0+SNR))*(nb_rb*12/(double)UE->frame_parms.ofdm_symbol_size)/(double)tx_lev); - if (n_frames==1) + + if (n_frames==1) printf("tx_lev = %d (%d.%d dB,%f), gain %f\n",tx_lev,tx_lev_dB/10,tx_lev_dB,10*log10((double)tx_lev),10*log10(tx_gain)); // fill measurement symbol (19) with noise for (i=0; ilte_frame_parms.nb_antennas_rx; aa++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0))); } } // multipath channel - for (i=0; ilte_frame_parms.samples_per_tti; i++) { + for (i=0; iframe_parms.samples_per_tti; i++) { for (aa=0; aa<1; aa++) { - s_re[aa][i] = ((double)(((short *)&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe]))[(i<<1)]); - s_im[aa][i] = ((double)(((short *)&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe]))[(i<<1)+1]); + s_re[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][eNB->frame_parms.samples_per_tti*subframe]))[(i<<1)]); + s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][eNB->frame_parms.samples_per_tti*subframe]))[(i<<1)+1]); } } if (awgn_flag == 0) { if (UE2eNB->max_Doppler == 0) { multipath_channel(UE2eNB,s_re,s_im,r_re,r_im, - PHY_vars_eNB->lte_frame_parms.samples_per_tti,hold_channel); + eNB->frame_parms.samples_per_tti,hold_channel); } else { multipath_tv_channel(UE2eNB,s_re,s_im,r_re,r_im, - 2*PHY_vars_eNB->lte_frame_parms.samples_per_tti,hold_channel); + 2*eNB->frame_parms.samples_per_tti,hold_channel); } } @@ -1169,111 +1184,49 @@ int main(int argc, char **argv) if (n_frames==1) printf("Sigma2 %f (sigma2_dB %f), tx_gain %f (%f dB)\n",sigma2,sigma2_dB,tx_gain,20*log10(tx_gain)); - for (i=0; ilte_frame_parms.samples_per_tti; i++) { - for (aa=0; aalte_frame_parms.nb_antennas_rx; aa++) { - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe])[2*i] = (short) ((tx_gain*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); - ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe])[2*i+1] = (short) ((tx_gain*r_im[aa][i]) + (iqim*tx_gain*r_re[aa][i]) + sqrt( + for (i=0; iframe_parms.samples_per_tti; i++) { + for (aa=0; aaframe_parms.nb_antennas_rx; aa++) { + ((short*) &eNB->common_vars.rxdata[0][aa][eNB->frame_parms.samples_per_tti*subframe])[2*i] = (short) ((tx_gain*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)); + ((short*) &eNB->common_vars.rxdata[0][aa][eNB->frame_parms.samples_per_tti*subframe])[2*i+1] = (short) ((tx_gain*r_im[aa][i]) + (iqim*tx_gain*r_re[aa][i]) + sqrt( sigma2/2)*gaussdouble(0.0,1.0)); } } if (n_frames==1) { printf("rx_level Null symbol %f\n",10*log10((double)signal_energy((int*) - &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][(PHY_vars_eNB->lte_frame_parms.samples_per_tti<<1) -PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); - printf("rx_level data symbol %f\n",10*log10(signal_energy((int*)&PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][160+(PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe)], + &eNB->common_vars.rxdata[0][0][(eNB->frame_parms.samples_per_tti<<1) -eNB->frame_parms.ofdm_symbol_size],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); + printf("rx_level data symbol %f\n",10*log10(signal_energy((int*)&eNB->common_vars.rxdata[0][0][160+(eNB->frame_parms.samples_per_tti*subframe)], OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))); } - SNRmeas = 10*log10(((double)signal_energy((int*)&PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][160+(PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe)], + SNRmeas = 10*log10(((double)signal_energy((int*)&eNB->common_vars.rxdata[0][0][160+(eNB->frame_parms.samples_per_tti*subframe)], OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))/((double)signal_energy((int*) - &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][(PHY_vars_eNB->lte_frame_parms.samples_per_tti<<1) -PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], - OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)) - 1)+10*log10(PHY_vars_eNB->lte_frame_parms.N_RB_UL/nb_rb); + &eNB->common_vars.rxdata[0][0][(eNB->frame_parms.samples_per_tti<<1) -eNB->frame_parms.ofdm_symbol_size], + OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)) - 1)+10*log10(eNB->frame_parms.N_RB_UL/nb_rb); if (n_frames==1) { printf("SNRmeas %f\n",SNRmeas); - // write_output("rxsig0UL.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); - //write_output("rxsig1UL.m","rxs1", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); + // write_output("rxsig0UL.m","rxs0", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1); + //write_output("rxsig1UL.m","rxs1", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1); } -#ifndef OFDMA_ULSCH - remove_7_5_kHz(PHY_vars_eNB,subframe<<1); - remove_7_5_kHz(PHY_vars_eNB,1+(subframe<<1)); - // write_output("rxsig0_75.m","rxs0_75", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); - // write_output("rxsig1_75.m","rxs1_75", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1); -#endif + eNB->fep = (parallel_flag == 1) ? eNB_fep_full_2thread : eNB_fep_full; + eNB->td = (parallel_flag == 1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->do_prach = NULL; - start_meas(&PHY_vars_eNB->phy_proc_rx); - start_meas(&PHY_vars_eNB->ofdm_demod_stats); - lte_eNB_I0_measurements(PHY_vars_eNB, - subframe, - 0, - 1); + phy_procedures_eNB_common_RX(eNB,proc_rxtx); + phy_procedures_eNB_uespec_RX(eNB,proc_rxtx,no_relay); - for (l=subframe*PHY_vars_UE->lte_frame_parms.symbols_per_tti; l<((1+subframe)*PHY_vars_UE->lte_frame_parms.symbols_per_tti); l++) { - - slot_fep_ul(&PHY_vars_eNB->lte_frame_parms, - &PHY_vars_eNB->lte_eNB_common_vars, - l%(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2), - l/(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2), - 0, - 0); - } - - stop_meas(&PHY_vars_eNB->ofdm_demod_stats); - - PHY_vars_eNB->ulsch_eNB[0]->cyclicShift = cyclic_shift;// cyclic shift for DMRS - - /* - if(abstx) { - namepointer_log2 = &flogeren_name; - namepointer_chMag = &fmageren_name; - //namepointer_txlev = &ftxlev; - } - */ - - start_meas(&PHY_vars_eNB->ulsch_demodulation_stats); - rx_ulsch(PHY_vars_eNB, - subframe, - 0, // this is the effective sector id - 0, // this is the UE_id - PHY_vars_eNB->ulsch_eNB, - cooperation_flag); - stop_meas(&PHY_vars_eNB->ulsch_demodulation_stats); - - /* - if(abstx) { - namepointer_chMag = NULL; - - if(trials==0 && round==0 && SNR==snr0) { - char* namepointer ; - namepointer = &fperen_name; - write_output(namepointer, "xxx" ,PHY_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][0],300,1,10); - namepointer = NULL ; - // flagMag = 1; - } - } - */ - - start_meas(&PHY_vars_eNB->ulsch_decoding_stats); - - ret= ulsch_decoding(PHY_vars_eNB, - 0, // UE_id - subframe, - control_only_flag, - 1, // Nbundled - llr8_flag); - stop_meas(&PHY_vars_eNB->ulsch_decoding_stats); - stop_meas(&PHY_vars_eNB->phy_proc_rx); if (cqi_flag > 0) { cqi_error = 0; - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Or1 < 32) { + if (eNB->ulsch[0]->harq_processes[harq_pid]->Or1 < 32) { for (i=2; i<4; i++) { - // printf("cqi %d : %d (%d)\n",i,PHY_vars_eNB->ulsch_eNB[0]->o[i],PHY_vars_UE->ulsch_ue[0]->o[i]); - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o[i] != PHY_vars_UE->ulsch_ue[0]->o[i]) + // printf("cqi %d : %d (%d)\n",i,eNB->ulsch[0]->o[i],UE->ulsch[0]->o[i]); + if (eNB->ulsch[0]->harq_processes[harq_pid]->o[i] != UE->ulsch[0]->o[i]) cqi_error = 1; } } else { @@ -1283,62 +1236,64 @@ int main(int argc, char **argv) if (cqi_error == 1) { cqi_errors++; - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status == 1) + if (eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status == 1) cqi_crc_falsepositives++; } else { - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status == 0) + if (eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status == 0) cqi_crc_falsenegatives++; } } - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0] != PHY_vars_UE->ulsch_ue[0]->o_ACK[0]) + if (eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0] != UE->ulsch[0]->o_ACK[0]) ack_errors++; // printf("ulsch_coding: O[%d] %d\n",i,o_flip[i]); + + // if (ret <= eNB->ulsch[0]->max_turbo_iterations) { + + if (eNB->ulsch[0]->harq_processes[harq_pid]->round == 0) { - if (ret <= PHY_vars_eNB->ulsch_eNB[0]->max_turbo_iterations) { - - avg_iter += ret; - iter_trials++; + // avg_iter += ret; + iter_trials++; if (n_frames==1) { - printf("No ULSCH errors found, o_ACK[0]= %d, cqi_crc_status=%d\n",PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0],PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status); + printf("No ULSCH errors found, o_ACK[0]= %d, cqi_crc_status=%d\n",eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0],eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status); - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status==1) - print_CQI(PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o, - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->uci_format,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL); + if (eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status==1) + print_CQI(eNB->ulsch[0]->harq_processes[harq_pid]->o, + eNB->ulsch[0]->harq_processes[harq_pid]->uci_format,0,eNB->frame_parms.N_RB_DL); - dump_ulsch(PHY_vars_eNB,subframe,0); + dump_ulsch(eNB,proc_rxtx,0); exit(-1); } round=5; } else { - avg_iter += ret-1; + // avg_iter += ret-1; iter_trials++; errs[round]++; if (n_frames==1) { - printf("ULSCH errors found o_ACK[0]= %d\n",PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0]); + printf("ULSCH errors found o_ACK[0]= %d\n",eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0]); - for (s=0; sulsch_eNB[0]->harq_processes[harq_pid]->C; s++) { - if (sulsch_eNB[0]->harq_processes[harq_pid]->Cminus) - Kr = PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kminus; + for (s=0; sulsch[0]->harq_processes[harq_pid]->C; s++) { + if (sulsch[0]->harq_processes[harq_pid]->Cminus) + Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kminus; else - Kr = PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kplus; + Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kplus; Kr_bytes = Kr>>3; printf("Decoded_output (Segment %d):\n",s); for (i=0; iulsch_eNB[0]->harq_processes[harq_pid]->c[s][i], - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->c[s][i]^PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->c[s][i]); + printf("%d : %x (%x)\n",i,eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i], + eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i]^UE->ulsch[0]->harq_processes[harq_pid]->c[s][i]); } - dump_ulsch(PHY_vars_eNB,subframe,0); + dump_ulsch(eNB,proc_rxtx,0); exit(-1); } @@ -1349,6 +1304,8 @@ int main(int argc, char **argv) printf("ULSCH in error in round %d\n",round); } } // ulsch error + + } // round // printf("\n"); @@ -1356,20 +1313,20 @@ int main(int argc, char **argv) break; if (xforms==1) - phy_scope_eNB(form_enb,PHY_vars_eNB,0); + phy_scope_eNB(form_enb,eNB,0); /*calculate the total processing time for each packet, get the max, min, and number of packets that exceed t>3000us*/ - double t_tx = (double)PHY_vars_UE->phy_proc_tx.p_time/cpu_freq_GHz/1000.0; - double t_tx_ifft = (double)PHY_vars_UE->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0; - double t_tx_mod = (double)PHY_vars_UE->ulsch_modulation_stats.p_time/cpu_freq_GHz/1000.0; - double t_tx_enc = (double)PHY_vars_UE->ulsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx = (double)UE->phy_proc_tx.p_time/cpu_freq_GHz/1000.0; + double t_tx_ifft = (double)UE->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_mod = (double)UE->ulsch_modulation_stats.p_time/cpu_freq_GHz/1000.0; + double t_tx_enc = (double)UE->ulsch_encoding_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx = (double)PHY_vars_eNB->phy_proc_rx.p_time/cpu_freq_GHz/1000.0; - double t_rx_fft = (double)PHY_vars_eNB->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx_demod = (double)PHY_vars_eNB->ulsch_demodulation_stats.p_time/cpu_freq_GHz/1000.0; - double t_rx_dec = (double)PHY_vars_eNB->ulsch_decoding_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx = (double)eNB->phy_proc_rx.p_time/cpu_freq_GHz/1000.0; + double t_rx_fft = (double)eNB->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_demod = (double)eNB->ulsch_demodulation_stats.p_time/cpu_freq_GHz/1000.0; + double t_rx_dec = (double)eNB->ulsch_decoding_stats.p_time/cpu_freq_GHz/1000.0; if (t_tx > t_tx_max) t_tx_max = t_tx; @@ -1492,12 +1449,12 @@ int main(int argc, char **argv) tx_lev_dB, 20*log10(tx_gain), (double)N0, - PHY_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dB, - get_hundred_times_delta_IF(PHY_vars_UE,eNB_id,harq_pid) , - dB_fixed(PHY_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[0]), - dB_fixed(PHY_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[1]), - PHY_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - PHY_vars_eNB->PHY_measurements_eNB->n0_power_dB[1]); + eNB->measurements[0].n0_power_tot_dB, + get_hundred_times_delta_IF(UE,eNB_id,harq_pid) , + dB_fixed(eNB->pusch_vars[0]->ulsch_power[0]), + dB_fixed(eNB->pusch_vars[0]->ulsch_power[1]), + eNB->measurements->n0_power_dB[0], + eNB->measurements->n0_power_dB[1]); effective_rate = ((double)(round_trials[0])/((double)round_trials[0] + round_trials[1] + round_trials[2] + round_trials[3])); @@ -1519,7 +1476,7 @@ int main(int argc, char **argv) rate, rate*get_Qm_ul(mcs), (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ - (double)PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS, + (double)eNB->ulsch[0]->harq_processes[harq_pid]->TBS, (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); if (cqi_flag >0) { @@ -1529,7 +1486,7 @@ int main(int argc, char **argv) cqi_crc_falsenegatives,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3]); } - if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0] > 0) + if (eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0] > 0) printf("ACK/NAK errors %d/%d\n",ack_errors,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3]); @@ -1537,7 +1494,7 @@ int main(int argc, char **argv) SNR, mcs, nb_rb, - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS, + eNB->ulsch[0]->harq_processes[harq_pid]->TBS, rate, errs[0], round_trials[0], @@ -1551,101 +1508,101 @@ int main(int argc, char **argv) if (dump_perf==1) { printf("UE TX function statistics (per 1ms subframe)\n\n"); - std_phy_proc_tx = sqrt((double)PHY_vars_UE->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->phy_proc_tx.trials - pow((double)PHY_vars_UE->phy_proc_tx.diff/PHY_vars_UE->phy_proc_tx.trials/cpu_freq_GHz/1000,2)); - printf("Total PHY proc tx :%f us (%d trials)\n",(double)PHY_vars_UE->phy_proc_tx.diff/PHY_vars_UE->phy_proc_tx.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->phy_proc_tx.trials); + std_phy_proc_tx = sqrt((double)UE->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->phy_proc_tx.trials - pow((double)UE->phy_proc_tx.diff/UE->phy_proc_tx.trials/cpu_freq_GHz/1000,2)); + printf("Total PHY proc tx :%f us (%d trials)\n",(double)UE->phy_proc_tx.diff/UE->phy_proc_tx.trials/cpu_freq_GHz/1000.0,UE->phy_proc_tx.trials); printf("|__ Statistics std: %f us max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, n_tx_dropped); - std_phy_proc_tx_ifft = sqrt((double)PHY_vars_UE->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->ofdm_mod_stats.trials - pow((double)PHY_vars_UE->ofdm_mod_stats.diff/PHY_vars_UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2)); - printf("OFDM_mod time :%f us (%d trials)\n",(double)PHY_vars_UE->ofdm_mod_stats.diff/PHY_vars_UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ofdm_mod_stats.trials); + std_phy_proc_tx_ifft = sqrt((double)UE->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->ofdm_mod_stats.trials - pow((double)UE->ofdm_mod_stats.diff/UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2)); + printf("OFDM_mod time :%f us (%d trials)\n",(double)UE->ofdm_mod_stats.diff/UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,UE->ofdm_mod_stats.trials); printf("|__ Statistics std: %f us median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3); - std_phy_proc_tx_mod = sqrt((double)PHY_vars_UE->ulsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->ulsch_modulation_stats.trials - pow((double)PHY_vars_UE->ulsch_modulation_stats.diff/PHY_vars_UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000,2)); - printf("ULSCH modulation time :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_modulation_stats.diff/PHY_vars_UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->ulsch_modulation_stats.trials); + std_phy_proc_tx_mod = sqrt((double)UE->ulsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->ulsch_modulation_stats.trials - pow((double)UE->ulsch_modulation_stats.diff/UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000,2)); + printf("ULSCH modulation time :%f us (%d trials)\n",(double)UE->ulsch_modulation_stats.diff/UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000.0, + UE->ulsch_modulation_stats.trials); printf("|__ Statistics std: %f us median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3); - std_phy_proc_tx_enc = sqrt((double)PHY_vars_UE->ulsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_UE->ulsch_encoding_stats.trials - pow((double)PHY_vars_UE->ulsch_encoding_stats.diff/PHY_vars_UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000,2)); - printf("ULSCH encoding time :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_encoding_stats.diff/PHY_vars_UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->ulsch_encoding_stats.trials); + std_phy_proc_tx_enc = sqrt((double)UE->ulsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/UE->ulsch_encoding_stats.trials - pow((double)UE->ulsch_encoding_stats.diff/UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000,2)); + printf("ULSCH encoding time :%f us (%d trials)\n",(double)UE->ulsch_encoding_stats.diff/UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000.0, + UE->ulsch_encoding_stats.trials); printf("|__ Statistics std: %f us median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3); - printf("|__ ULSCH segmentation time :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_segmentation_stats.diff/PHY_vars_UE->ulsch_segmentation_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_UE->ulsch_segmentation_stats.trials); + printf("|__ ULSCH segmentation time :%f us (%d trials)\n",(double)UE->ulsch_segmentation_stats.diff/UE->ulsch_segmentation_stats.trials/cpu_freq_GHz/1000.0, + UE->ulsch_segmentation_stats.trials); printf("|__ ULSCH turbo encoding time :%f us (%d trials)\n", - ((double)PHY_vars_UE->ulsch_turbo_encoding_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double) - PHY_vars_UE->ulsch_turbo_encoding_stats.diff/PHY_vars_UE->ulsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_turbo_encoding_stats.trials); + ((double)UE->ulsch_turbo_encoding_stats.trials/UE->ulsch_encoding_stats.trials)*(double) + UE->ulsch_turbo_encoding_stats.diff/UE->ulsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_turbo_encoding_stats.trials); printf("|__ ULSCH rate-matching time :%f us (%d trials)\n", - ((double)PHY_vars_UE->ulsch_rate_matching_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double) - PHY_vars_UE->ulsch_rate_matching_stats.diff/PHY_vars_UE->ulsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_rate_matching_stats.trials); + ((double)UE->ulsch_rate_matching_stats.trials/UE->ulsch_encoding_stats.trials)*(double) + UE->ulsch_rate_matching_stats.diff/UE->ulsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_rate_matching_stats.trials); printf("|__ ULSCH sub-block interleaving time :%f us (%d trials)\n", - ((double)PHY_vars_UE->ulsch_interleaving_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double) - PHY_vars_UE->ulsch_interleaving_stats.diff/PHY_vars_UE->ulsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_interleaving_stats.trials); + ((double)UE->ulsch_interleaving_stats.trials/UE->ulsch_encoding_stats.trials)*(double) + UE->ulsch_interleaving_stats.diff/UE->ulsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_interleaving_stats.trials); printf("|__ ULSCH multiplexing time :%f us (%d trials)\n", - ((double)PHY_vars_UE->ulsch_multiplexing_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double) - PHY_vars_UE->ulsch_multiplexing_stats.diff/PHY_vars_UE->ulsch_multiplexing_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_multiplexing_stats.trials); + ((double)UE->ulsch_multiplexing_stats.trials/UE->ulsch_encoding_stats.trials)*(double) + UE->ulsch_multiplexing_stats.diff/UE->ulsch_multiplexing_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_multiplexing_stats.trials); printf("\n\neNB RX function statistics (per 1ms subframe)\n\n"); - std_phy_proc_rx = sqrt((double)PHY_vars_eNB->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->phy_proc_rx.trials - pow((double)PHY_vars_eNB->phy_proc_rx.diff/PHY_vars_eNB->phy_proc_rx.trials/cpu_freq_GHz/1000,2)); - printf("Total PHY proc rx :%f us (%d trials)\n",(double)PHY_vars_eNB->phy_proc_rx.diff/PHY_vars_eNB->phy_proc_rx.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->phy_proc_rx.trials); + std_phy_proc_rx = sqrt((double)eNB->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->phy_proc_rx.trials - pow((double)eNB->phy_proc_rx.diff/eNB->phy_proc_rx.trials/cpu_freq_GHz/1000,2)); + printf("Total PHY proc rx :%f us (%d trials)\n",(double)eNB->phy_proc_rx.diff/eNB->phy_proc_rx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_rx.trials); printf("|__ Statistcs std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, rx_q1, rx_q3, n_rx_dropped); - std_phy_proc_rx_fft = sqrt((double)PHY_vars_eNB->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->ofdm_demod_stats.trials - pow((double)PHY_vars_eNB->ofdm_demod_stats.diff/PHY_vars_eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2)); - printf("OFDM_demod time :%f us (%d trials)\n",(double)PHY_vars_eNB->ofdm_demod_stats.diff/PHY_vars_eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_eNB->ofdm_demod_stats.trials); + std_phy_proc_rx_fft = sqrt((double)eNB->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->ofdm_demod_stats.trials - pow((double)eNB->ofdm_demod_stats.diff/eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2)); + printf("OFDM_demod time :%f us (%d trials)\n",(double)eNB->ofdm_demod_stats.diff/eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0, + eNB->ofdm_demod_stats.trials); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n", std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3); - std_phy_proc_rx_demod = sqrt((double)PHY_vars_eNB->ulsch_demodulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->ulsch_demodulation_stats.trials - pow((double)PHY_vars_eNB->ulsch_demodulation_stats.diff/PHY_vars_eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000,2)); - printf("ULSCH demodulation time :%f us (%d trials)\n",(double)PHY_vars_eNB->ulsch_demodulation_stats.diff/PHY_vars_eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000.0, - PHY_vars_eNB->ulsch_demodulation_stats.trials); + std_phy_proc_rx_demod = sqrt((double)eNB->ulsch_demodulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->ulsch_demodulation_stats.trials - pow((double)eNB->ulsch_demodulation_stats.diff/eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000,2)); + printf("ULSCH demodulation time :%f us (%d trials)\n",(double)eNB->ulsch_demodulation_stats.diff/eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000.0, + eNB->ulsch_demodulation_stats.trials); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n", std_phy_proc_rx_demod, rx_demod_median, rx_demod_q1, rx_demod_q3); - std_phy_proc_rx_dec = sqrt((double)PHY_vars_eNB->ulsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, - 2)/PHY_vars_eNB->ulsch_decoding_stats.trials - pow((double)PHY_vars_eNB->ulsch_decoding_stats.diff/PHY_vars_eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000,2)); + std_phy_proc_rx_dec = sqrt((double)eNB->ulsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000, + 2)/eNB->ulsch_decoding_stats.trials - pow((double)eNB->ulsch_decoding_stats.diff/eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000,2)); printf("ULSCH Decoding time (%.2f Mbit/s, avg iter %f) :%f us (%d trials, max %f)\n", - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->TBS/1000.0,(double)avg_iter/iter_trials, - (double)PHY_vars_eNB->ulsch_decoding_stats.diff/PHY_vars_eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_decoding_stats.trials, - (double)PHY_vars_eNB->ulsch_decoding_stats.max/cpu_freq_GHz/1000.0); + UE->ulsch[0]->harq_processes[harq_pid]->TBS/1000.0,(double)avg_iter/iter_trials, + (double)eNB->ulsch_decoding_stats.diff/eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_decoding_stats.trials, + (double)eNB->ulsch_decoding_stats.max/cpu_freq_GHz/1000.0); printf("|__ Statistcs std: %fus median %fus q1 %fus q3 %fus \n", std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3); printf("|__ sub-block interleaving %f us (%d trials)\n", - (double)PHY_vars_eNB->ulsch_deinterleaving_stats.diff/PHY_vars_eNB->ulsch_deinterleaving_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_deinterleaving_stats.trials); + (double)eNB->ulsch_deinterleaving_stats.diff/eNB->ulsch_deinterleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_deinterleaving_stats.trials); printf("|__ demultiplexing %f us (%d trials)\n", - (double)PHY_vars_eNB->ulsch_demultiplexing_stats.diff/PHY_vars_eNB->ulsch_demultiplexing_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_demultiplexing_stats.trials); + (double)eNB->ulsch_demultiplexing_stats.diff/eNB->ulsch_demultiplexing_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_demultiplexing_stats.trials); printf("|__ rate-matching %f us (%d trials)\n", - (double)PHY_vars_eNB->ulsch_rate_unmatching_stats.diff/PHY_vars_eNB->ulsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_rate_unmatching_stats.trials); + (double)eNB->ulsch_rate_unmatching_stats.diff/eNB->ulsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_rate_unmatching_stats.trials); printf("|__ turbo_decoder(%d bits) %f us (%d cycles, %d trials)\n", - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Cminus ? PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kminus : PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kplus, - (double)PHY_vars_eNB->ulsch_turbo_decoding_stats.diff/PHY_vars_eNB->ulsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0, - (int)((double)PHY_vars_eNB->ulsch_turbo_decoding_stats.diff/PHY_vars_eNB->ulsch_turbo_decoding_stats.trials),PHY_vars_eNB->ulsch_turbo_decoding_stats.trials); + eNB->ulsch[0]->harq_processes[harq_pid]->Cminus ? eNB->ulsch[0]->harq_processes[harq_pid]->Kminus : eNB->ulsch[0]->harq_processes[harq_pid]->Kplus, + (double)eNB->ulsch_turbo_decoding_stats.diff/eNB->ulsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0, + (int)((double)eNB->ulsch_turbo_decoding_stats.diff/eNB->ulsch_turbo_decoding_stats.trials),eNB->ulsch_turbo_decoding_stats.trials); printf(" |__ init %f us (cycles/iter %f, %d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_init_stats.diff/PHY_vars_eNB->ulsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_init_stats.diff/PHY_vars_eNB->ulsch_tc_init_stats.trials/((double)avg_iter/iter_trials), - PHY_vars_eNB->ulsch_tc_init_stats.trials); + (double)eNB->ulsch_tc_init_stats.diff/eNB->ulsch_tc_init_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_init_stats.diff/eNB->ulsch_tc_init_stats.trials/((double)avg_iter/iter_trials), + eNB->ulsch_tc_init_stats.trials); printf(" |__ alpha %f us (cycles/iter %f, %d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_alpha_stats.diff/PHY_vars_eNB->ulsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_alpha_stats.diff/PHY_vars_eNB->ulsch_tc_alpha_stats.trials*2, - PHY_vars_eNB->ulsch_tc_alpha_stats.trials); + (double)eNB->ulsch_tc_alpha_stats.diff/eNB->ulsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_alpha_stats.diff/eNB->ulsch_tc_alpha_stats.trials*2, + eNB->ulsch_tc_alpha_stats.trials); printf(" |__ beta %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_beta_stats.diff/PHY_vars_eNB->ulsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_beta_stats.diff/PHY_vars_eNB->ulsch_tc_beta_stats.trials*2, - PHY_vars_eNB->ulsch_tc_beta_stats.trials); + (double)eNB->ulsch_tc_beta_stats.diff/eNB->ulsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_beta_stats.diff/eNB->ulsch_tc_beta_stats.trials*2, + eNB->ulsch_tc_beta_stats.trials); printf(" |__ gamma %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_gamma_stats.diff/PHY_vars_eNB->ulsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_gamma_stats.diff/PHY_vars_eNB->ulsch_tc_gamma_stats.trials*2, - PHY_vars_eNB->ulsch_tc_gamma_stats.trials); + (double)eNB->ulsch_tc_gamma_stats.diff/eNB->ulsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_gamma_stats.diff/eNB->ulsch_tc_gamma_stats.trials*2, + eNB->ulsch_tc_gamma_stats.trials); printf(" |__ ext %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_ext_stats.diff/PHY_vars_eNB->ulsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_ext_stats.diff/PHY_vars_eNB->ulsch_tc_ext_stats.trials*2, - PHY_vars_eNB->ulsch_tc_ext_stats.trials); + (double)eNB->ulsch_tc_ext_stats.diff/eNB->ulsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_ext_stats.diff/eNB->ulsch_tc_ext_stats.trials*2, + eNB->ulsch_tc_ext_stats.trials); printf(" |__ intl1 %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_intl1_stats.diff/PHY_vars_eNB->ulsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_intl1_stats.diff/PHY_vars_eNB->ulsch_tc_intl1_stats.trials, - PHY_vars_eNB->ulsch_tc_intl1_stats.trials); + (double)eNB->ulsch_tc_intl1_stats.diff/eNB->ulsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_intl1_stats.diff/eNB->ulsch_tc_intl1_stats.trials, + eNB->ulsch_tc_intl1_stats.trials); printf(" |__ intl2+HD+CRC %f us (cycles/iter %f,%d trials)\n", - (double)PHY_vars_eNB->ulsch_tc_intl2_stats.diff/PHY_vars_eNB->ulsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0, - (double)PHY_vars_eNB->ulsch_tc_intl2_stats.diff/PHY_vars_eNB->ulsch_tc_intl2_stats.trials, - PHY_vars_eNB->ulsch_tc_intl2_stats.trials); + (double)eNB->ulsch_tc_intl2_stats.diff/eNB->ulsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0, + (double)eNB->ulsch_tc_intl2_stats.diff/eNB->ulsch_tc_intl2_stats.trials, + eNB->ulsch_tc_intl2_stats.trials); } if(abstx) { //ABSTRACTION @@ -1673,7 +1630,7 @@ int main(int argc, char **argv) fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;", SNR, mcs, - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS, + eNB->ulsch[0]->harq_processes[harq_pid]->TBS, rate, errs[0], round_trials[0], @@ -1688,7 +1645,7 @@ int main(int argc, char **argv) fprintf(time_meas_fd,"%f;%d;%d;%f;%2.1f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%f;%f;", SNR, mcs, - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS, + eNB->ulsch[0]->harq_processes[harq_pid]->TBS, rate*effective_rate, 100*effective_rate, rate, @@ -1705,29 +1662,29 @@ int main(int argc, char **argv) (double)errs[2]/(round_trials[0]), (double)errs[3]/(round_trials[0]), (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/ - (double)PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS, + (double)eNB->ulsch[0]->harq_processes[harq_pid]->TBS, (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])); //fprintf(time_meas_fd,"UE_PROC_TX(%d); OFDM_MOD(%d); UL_MOD(%d); UL_ENC(%d); eNB_PROC_RX(%d); OFDM_DEMOD(%d); UL_DEMOD(%d); UL_DECOD(%d);\n", fprintf(time_meas_fd,"%d; %d; %d; %d; %d; %d; %d; %d;", - PHY_vars_UE->phy_proc_tx.trials, - PHY_vars_UE->ofdm_mod_stats.trials, - PHY_vars_UE->ulsch_modulation_stats.trials, - PHY_vars_UE->ulsch_encoding_stats.trials, - PHY_vars_eNB->phy_proc_rx.trials, - PHY_vars_eNB->ofdm_demod_stats.trials, - PHY_vars_eNB->ulsch_demodulation_stats.trials, - PHY_vars_eNB->ulsch_decoding_stats.trials + UE->phy_proc_tx.trials, + UE->ofdm_mod_stats.trials, + UE->ulsch_modulation_stats.trials, + UE->ulsch_encoding_stats.trials, + eNB->phy_proc_rx.trials, + eNB->ofdm_demod_stats.trials, + eNB->ulsch_demodulation_stats.trials, + eNB->ulsch_decoding_stats.trials ); fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%f;%f;", - get_time_meas_us(&PHY_vars_UE->phy_proc_tx), - get_time_meas_us(&PHY_vars_UE->ofdm_mod_stats), - get_time_meas_us(&PHY_vars_UE->ulsch_modulation_stats), - get_time_meas_us(&PHY_vars_UE->ulsch_encoding_stats), - get_time_meas_us(&PHY_vars_eNB->phy_proc_rx), - get_time_meas_us(&PHY_vars_eNB->ofdm_demod_stats), - get_time_meas_us(&PHY_vars_eNB->ulsch_demodulation_stats), - get_time_meas_us(&PHY_vars_eNB->ulsch_decoding_stats) + get_time_meas_us(&UE->phy_proc_tx), + get_time_meas_us(&UE->ofdm_mod_stats), + get_time_meas_us(&UE->ulsch_modulation_stats), + get_time_meas_us(&UE->ulsch_encoding_stats), + get_time_meas_us(&eNB->phy_proc_rx), + get_time_meas_us(&eNB->ofdm_demod_stats), + get_time_meas_us(&eNB->ulsch_demodulation_stats), + get_time_meas_us(&eNB->ulsch_decoding_stats) ); //fprintf(time_meas_fd,"UE_PROC_TX_STD;UE_PROC_TX_MAX;UE_PROC_TX_MIN;UE_PROC_TX_MED;UE_PROC_TX_Q1;UE_PROC_TX_Q3;UE_PROC_TX_DROPPED;\n"); @@ -1764,40 +1721,21 @@ int main(int argc, char **argv) if (((double)errs[0]/(round_trials[0]))<1e-2) break; - } // SNR + } // SNR // - //write_output("chestim_f.m","chestf",PHY_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][0],300*12,2,1); - // write_output("chestim_t.m","chestt",PHY_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates_time[0][0], (frame_parms->ofdm_symbol_size)*2,2,1); + //write_output("chestim_f.m","chestf",eNB->pusch_vars[0]->drs_ch_estimates[0][0],300*12,2,1); + // write_output("chestim_t.m","chestt",eNB->pusch_vars[0]->drs_ch_estimates_time[0][0], (frame_parms->ofdm_symbol_size)*2,2,1); }//ch realization - /* - if(abstx) { - fperen = fopen(fperen_name,"a+"); - fprintf(fperen,"];\n"); - fclose(fperen); - fmageren = fopen(fmageren_name,"a+"); - fprintf(fmageren,"];\n"); - fclose(fmageren); + oai_exit=1; + pthread_cond_signal(&eNB->proc.cond_fep); - flogeren = fopen(flogeren_name,"a+"); - fprintf(flogeren,"];\n"); - fclose(flogeren); - } - */ - - // ftxlev = fopen(ftxlev_name,"a+"); - //fprintf(ftxlev,"];\n"); - //fclose(ftxlev); - - - // write_output("chestim_f_dene.m","chestf",ulchestim_f_all,300*12,2,1);*/ - - if(abstx) { // ABSTRACTION + if (abstx) { // ABSTRACTION fprintf(csv_fdUL,"];"); fclose(csv_fdUL); } @@ -1807,22 +1745,6 @@ int main(int argc, char **argv) if (test_perf !=0) fclose (time_meas_fd); - printf("Freeing channel I/O\n"); - - for (i=0; i<2; i++) { - free(s_re[i]); - free(s_im[i]); - free(r_re[i]); - free(r_im[i]); - } - - free(s_re); - free(s_im); - free(r_re); - free(r_im); - - // lte_sync_time_free(); - return(0); } diff --git a/openair1/SIMULATION/LTE_PHY/ulsim2.c b/openair1/SIMULATION/LTE_PHY/ulsim2.c index b6b1852c07..6a474332e8 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim2.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim2.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include "SIMULATION/TOOLS/defs.h" @@ -37,9 +30,6 @@ #ifdef IFFT_FPGA #include "PHY/LTE_REFSIG/mod_table.h" #endif -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif #define BW 10.0 #define Td 1.0 @@ -76,12 +66,6 @@ int main(int argc, char **argv) double ip =0.0; double N0W, path_loss, path_loss_dB; -#ifdef EMOS - fifo_dump_emos emos_dump; -#endif - - - if (argc>1) sigma2_dB = atoi(argv[1]); diff --git a/openair1/SIMULATION/LTE_PHY/unitary_defs.h b/openair1/SIMULATION/LTE_PHY/unitary_defs.h new file mode 100644 index 0000000000..c33b72f649 --- /dev/null +++ b/openair1/SIMULATION/LTE_PHY/unitary_defs.h @@ -0,0 +1,31 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +openair0_device openair0; +int oai_exit=0; + +void exit_fun(const char *s) { exit(-1); } + +extern unsigned int dlsch_tbs25[27][25],TBStable[27][110]; +extern unsigned char offset_mumimo_llr_drange_fix; + +extern unsigned short dftsizes[33]; +extern short *ul_ref_sigs[30][2][33]; diff --git a/openair1/SIMULATION/RF/COPYING b/openair1/SIMULATION/RF/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SIMULATION/RF/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SIMULATION/RF/Makefile b/openair1/SIMULATION/RF/Makefile index 5b713b1d94..c6c03ad8d5 100644 --- a/openair1/SIMULATION/RF/Makefile +++ b/openair1/SIMULATION/RF/Makefile @@ -1,6 +1,6 @@ include $(OPENAIR_DIR)/common/utils/Makefile.inc OBJS = rf.o ../../PHY/TOOLS/file_output.o ../TOOLS/rangen_double.o -CFLAGS += -DRF_MAIN -DUSER_MODE -DDEBUG_PHY +CFLAGS += -DRF_MAIN -DDEBUG_PHY all: $(OBJS) gcc -o rf $(OBJS) -lm diff --git a/openair1/SIMULATION/RF/adc.c b/openair1/SIMULATION/RF/adc.c old mode 100755 new mode 100644 index 6dc1c7f8e6..3bf70a203a --- a/openair1/SIMULATION/RF/adc.c +++ b/openair1/SIMULATION/RF/adc.c @@ -1,33 +1,26 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -void adc(double **r_re, - double **r_im, +void adc(double *r_re[2], + double *r_im[2], unsigned int input_offset, unsigned int output_offset, unsigned int **output, diff --git a/openair1/SIMULATION/RF/dac.c b/openair1/SIMULATION/RF/dac.c old mode 100755 new mode 100644 index 22e286a496..8cf6b49623 --- a/openair1/SIMULATION/RF/dac.c +++ b/openair1/SIMULATION/RF/dac.c @@ -1,38 +1,31 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ //#define DEBUG_DAC 1 #include #include #include "PHY/TOOLS/defs.h" -void dac(double **s_re, - double **s_im, +void dac(double *s_re[2], + double *s_im[2], uint32_t **input, uint32_t input_offset, uint32_t nb_tx_antennas, @@ -81,8 +74,8 @@ void dac(double **s_re, } } -double dac_fixed_gain(double **s_re, - double **s_im, +double dac_fixed_gain(double *s_re[2], + double *s_im[2], uint32_t **input, uint32_t input_offset, uint32_t nb_tx_antennas, @@ -91,24 +84,33 @@ double dac_fixed_gain(double **s_re, uint32_t length_meas, uint8_t B, double txpwr_dBm, + uint8_t do_amp_compute, + double *amp1, int NB_RE) { int i; int aa; - double amp,amp1; + double amp,amp1_local,*amp1p; amp = //sqrt(NB_RE)*pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna - amp1 = 0; - for (aa=0; aa. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /** \brief Apply RF impairments to received signal @param r_re Double two-dimensional array of Real part of received signal @param r_im Double two-dimensional array of Imag part of received signal @@ -64,16 +57,16 @@ void rf_rx(double **r_re, double IQ_imb_dB, double IQ_phase); -void rf_rx_simple(double **r_re, - double **r_im, +void rf_rx_simple(double *r_re[2], + double *r_im[2], unsigned int nb_rx_antennas, unsigned int length, double s_time, double rx_gain_dB); -void adc(double **r_re, - double **r_im, +void adc(double *r_re[2], + double *r_im[2], unsigned int input_offset, unsigned int output_offset, int **output, @@ -81,8 +74,8 @@ void adc(double **r_re, unsigned int length, unsigned char B); -void dac(double **s_re, - double **s_im, +void dac(double *s_re[2], + double *s_im[2], int **input, unsigned int input_offset, unsigned int nb_tx_antennas, @@ -92,8 +85,8 @@ void dac(double **s_re, unsigned int meas_length, unsigned int meas_offset); -double dac_fixed_gain(double **s_re, - double **s_im, +double dac_fixed_gain(double *s_re[2], + double *s_im[2], int **input, unsigned int input_offset, unsigned int nb_tx_antennas, @@ -102,4 +95,6 @@ double dac_fixed_gain(double **s_re, unsigned int length_meas, unsigned char B, double gain, + uint8_t do_amp_compute, + double *amp1, int NB_RE); diff --git a/openair1/SIMULATION/RF/rf.c b/openair1/SIMULATION/RF/rf.c index 1f240595aa..3cf770ac7c 100644 --- a/openair1/SIMULATION/RF/rf.c +++ b/openair1/SIMULATION/RF/rf.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ //#include "defs.h" #include #include @@ -206,8 +199,8 @@ void rf_rx(double **r_re, } } -void rf_rx_simple(double **r_re, - double **r_im, +void rf_rx_simple(double *r_re[2], + double *r_im[2], unsigned int nb_rx_antennas, unsigned int length, double s_time, diff --git a/openair1/SIMULATION/TOOLS/COPYING b/openair1/SIMULATION/TOOLS/COPYING deleted file mode 100644 index 818433ecc0..0000000000 --- a/openair1/SIMULATION/TOOLS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair1/SIMULATION/TOOLS/abstraction.c b/openair1/SIMULATION/TOOLS/abstraction.c index 591b238acf..7e99371c37 100644 --- a/openair1/SIMULATION/TOOLS/abstraction.c +++ b/openair1/SIMULATION/TOOLS/abstraction.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include @@ -122,7 +115,7 @@ int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) start_meas(&desc->interp_freq); - for (f=-n_samples_max/2,f2=-n_samples/2; f<=n_samples_max/2; f+=d,f2++) { + for (f=-n_samples_max/2,f2=-n_samples/2; f. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/TOOLS/defs.h b/openair1/SIMULATION/TOOLS/defs.h index c72ea743b1..a958c6b4eb 100644 --- a/openair1/SIMULATION/TOOLS/defs.h +++ b/openair1/SIMULATION/TOOLS/defs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #ifndef __SIMULATION_TOOLS_DEFS_H__ #define __SIMULATION_TOOLS_DEFS_H__ #include "PHY/defs.h" @@ -176,7 +169,16 @@ typedef enum { Rice1, Rice1_corr, Rice1_anticorr, - AWGN + AWGN, + Rayleigh1_orthogonal, + Rayleigh1_orth_eff_ch_TM4_prec_real, + Rayleigh1_orth_eff_ch_TM4_prec_imag, + Rayleigh8_orth_eff_ch_TM4_prec_real, + Rayleigh8_orth_eff_ch_TM4_prec_imag, + TS_SHIFT, + EPA_low, + EPA_medium, + EPA_high, } SCM_t; /** @@ -219,10 +221,10 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, int random_channel(channel_desc_t *desc, uint8_t abstraction_flag); /**\fn void multipath_channel(channel_desc_t *desc, - double **tx_sig_re, - double **tx_sig_im, - double **rx_sig_re, - double **rx_sig_im, + double tx_sig_re[2], + double tx_sig_im[2], + double rx_sig_re[2], + double rx_sig_im[2], uint32_t length, uint8_t keep_channel) @@ -237,10 +239,10 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag); */ void multipath_channel(channel_desc_t *desc, - double **tx_sig_re, - double **tx_sig_im, - double **rx_sig_re, - double **rx_sig_im, + double *tx_sig_re[2], + double *tx_sig_im[2], + double *rx_sig_re[2], + double *rx_sig_im[2], uint32_t length, uint8_t keep_channel); /* diff --git a/openair1/SIMULATION/TOOLS/gauss.c b/openair1/SIMULATION/TOOLS/gauss.c index 9c3a431bef..f69748270b 100644 --- a/openair1/SIMULATION/TOOLS/gauss.c +++ b/openair1/SIMULATION/TOOLS/gauss.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/TOOLS/llr_quantization.c b/openair1/SIMULATION/TOOLS/llr_quantization.c index e8b4696ba6..57cb61e007 100644 --- a/openair1/SIMULATION/TOOLS/llr_quantization.c +++ b/openair1/SIMULATION/TOOLS/llr_quantization.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ //#include #include //#include diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c index 9a72ca6423..757d5023de 100644 --- a/openair1/SIMULATION/TOOLS/multipath_channel.c +++ b/openair1/SIMULATION/TOOLS/multipath_channel.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include @@ -44,10 +37,10 @@ uint8_t multipath_channel_nosigconv(channel_desc_t *desc) //#define CHANNEL_SSE #ifdef CHANNEL_SSE void multipath_channel(channel_desc_t *desc, - double **tx_sig_re, - double **tx_sig_im, - double **rx_sig_re, - double **rx_sig_im, + double tx_sig_re[2][30720*2], + double tx_sig_im[2][30720*2], + double rx_sig_re[2][30720*2], + double rx_sig_im[2][30720*2], uint32_t length, uint8_t keep_channel) { @@ -150,10 +143,10 @@ void multipath_channel(channel_desc_t *desc, #else void multipath_channel(channel_desc_t *desc, - double **tx_sig_re, - double **tx_sig_im, - double **rx_sig_re, - double **rx_sig_im, + double *tx_sig_re[2], + double *tx_sig_im[2], + double *rx_sig_re[2], + double *rx_sig_im[2], uint32_t length, uint8_t keep_channel) { diff --git a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c index 3568545f29..c2078b91d4 100644 --- a/openair1/SIMULATION/TOOLS/multipath_tv_channel.c +++ b/openair1/SIMULATION/TOOLS/multipath_tv_channel.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c index 417ff29162..222a196e20 100644 --- a/openair1/SIMULATION/TOOLS/random_channel.c +++ b/openair1/SIMULATION/TOOLS/random_channel.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #include #include #include @@ -39,6 +32,8 @@ #include "UTIL/LOG/log.h" //#define DEBUG_CH +extern void print_shorts(char *s,__m128i *x); + void fill_channel_desc(channel_desc_t *chan_desc, uint8_t nb_tx, uint8_t nb_rx, @@ -49,7 +44,7 @@ void fill_channel_desc(channel_desc_t *chan_desc, struct complex** R_sqrt, double Td, double sampling_rate, - double channel_bandwidth, + double channel_bandwidth, double ricean_factor, double aoa, double forgetting_factor, @@ -59,11 +54,12 @@ void fill_channel_desc(channel_desc_t *chan_desc, uint8_t random_aoa) { + uint16_t i,j; double delta_tau; LOG_I(OCM,"[CHANNEL] Getting new channel descriptor, nb_tx %d, nb_rx %d, nb_taps %d, channel_length %d\n", - nb_tx,nb_rx,nb_taps,channel_length); + nb_tx,nb_rx,nb_taps,channel_length); chan_desc->nb_tx = nb_tx; chan_desc->nb_rx = nb_rx; @@ -71,31 +67,29 @@ void fill_channel_desc(channel_desc_t *chan_desc, chan_desc->channel_length = channel_length; chan_desc->amps = amps; LOG_D(OCM,"[CHANNEL] Doing delays ...\n"); - if (delays==NULL) { chan_desc->delays = (double*) malloc(nb_taps*sizeof(double)); delta_tau = Td/nb_taps; - for (i=0; idelays[i] = ((double)i)*delta_tau; - } else - chan_desc->delays = delays; - - chan_desc->Td = Td; - chan_desc->sampling_rate = sampling_rate; - chan_desc->channel_bandwidth = channel_bandwidth; - chan_desc->ricean_factor = ricean_factor; - chan_desc->aoa = aoa; - chan_desc->random_aoa = random_aoa; - chan_desc->forgetting_factor = forgetting_factor; - chan_desc->channel_offset = channel_offset; - chan_desc->path_loss_dB = path_loss_dB; - chan_desc->first_run = 1; - chan_desc->ip = 0.0; - chan_desc->max_Doppler = max_Doppler; - chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); - chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); - chan_desc->a = (struct complex**) malloc(nb_taps*sizeof(struct complex*)); + } + else + chan_desc->delays = delays; + chan_desc->Td = Td; + chan_desc->sampling_rate = sampling_rate; + chan_desc->channel_bandwidth = channel_bandwidth; + chan_desc->ricean_factor = ricean_factor; + chan_desc->aoa = aoa; + chan_desc->random_aoa = random_aoa; + chan_desc->forgetting_factor = forgetting_factor; + chan_desc->channel_offset = channel_offset; + chan_desc->path_loss_dB = path_loss_dB; + chan_desc->first_run = 1; + chan_desc->ip = 0.0; + chan_desc->max_Doppler = max_Doppler; + chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); + chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); + chan_desc->a = (struct complex**) malloc(nb_taps*sizeof(struct complex*)); LOG_D(OCM,"[CHANNEL] Filling ch \n"); @@ -106,27 +100,30 @@ void fill_channel_desc(channel_desc_t *chan_desc, chan_desc->chF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); // allocate for up to 100 RBs, 12 samples per RB LOG_D(OCM,"[CHANNEL] Filling a (nb_taps %d)\n",nb_taps); - for (i = 0; ia[i],nb_tx*nb_rx * sizeof(struct complex)); + LOG_D(OCM,"tap %d (%p,%zu)\n",i,&chan_desc->a[i],nb_tx*nb_rx * sizeof(struct complex)); chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex)); } LOG_D(OCM,"[CHANNEL] Doing R_sqrt ...\n"); - if (R_sqrt == NULL) { - chan_desc->R_sqrt = (struct complex**) calloc(nb_taps,sizeof(struct complex*)); - + chan_desc->R_sqrt = (struct complex**) calloc(nb_taps,sizeof(struct complex*)); for (i = 0; iR_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex)); - + chan_desc->R_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex)); for (j = 0; jR_sqrt[i][j].x = 1.0; chan_desc->R_sqrt[i][j].y = 0.0; } } - } else { - chan_desc->R_sqrt = R_sqrt; + } + else { + chan_desc->R_sqrt = (struct complex**) calloc(nb_taps,sizeof(struct complex*)); + for (i = 0; iR_sqrt[i] = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex)); + //chan_desc->R_sqrt = (struct complex*)&R_sqrt[i][0]; + /* all chan_desc share the same R_sqrt, coming from caller */ + chan_desc->R_sqrt[i] = R_sqrt[0]; + } } for (i = 0; iricean_factor); - - for (i=0; inb_taps; i++) + for (i=0;inb_taps;i++) LOG_D(OCM,"[CHANNEL] tap %d: amp %f, delay %f\n",i,chan_desc->amps[i],chan_desc->delays[i]); chan_desc->nb_paths=10; @@ -167,12 +163,14 @@ double etu_amps_dB[] = {-1.0,-1.0,-1.0,0.0,0.0,0.0,-3.0,-5.0,-7.0}; double default_amps_lin[] = {0.3868472 , 0.3094778 , 0.1547389 , 0.0773694 , 0.0386847 , 0.0193424 , 0.0096712 , 0.0038685}; double default_amp_lin[] = {1}; +double ts_shift_delays[] = {0, 1/7.68}; +double ts_shift_amps[] = {0, 1}; + //correlation matrix for a 2x2 channel with full Tx correlation struct complex R_sqrt_22_corr_tap[16] = {{0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, - {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0}, - {0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, - {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0} -}; + {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0}, + {0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, + {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0}}; struct complex *R_sqrt_22_corr[1] = {R_sqrt_22_corr_tap}; //correlation matrix for a fully correlated 2x1 channel (h1==h2) @@ -181,10 +179,9 @@ struct complex *R_sqrt_21_corr[1] = {R_sqrt_21_corr_tap}; //correlation matrix for a 2x2 channel with full Tx anti-correlation struct complex R_sqrt_22_anticorr_tap[16] = {{0.70711,0}, {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0}, - {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {-0.70711,0}, - {-0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, - {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0}, {0.70711,0} -}; + {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {-0.70711,0}, + {-0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, + {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0}, {0.70711,0}}; struct complex *R_sqrt_22_anticorr[1] = {R_sqrt_22_anticorr_tap}; //correlation matrix for a fully anti-correlated 2x1 channel (h1==-h2) @@ -193,12 +190,62 @@ struct complex *R_sqrt_21_anticorr[1] = {R_sqrt_21_anticorr_tap}; struct complex **R_sqrt_ptr2; +// full correlation matrix in vectorized form for 2x2 channel, where h1 is perfectly orthogonal to h2 + +struct complex R_sqrt_22_orthogonal_tap[16] = {{0.70711,0.0}, {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0}, + {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0}, {0.0,0.0}, + {0.0,0.0}, {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0}, + {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0}, {0.70711,0.0}}; +struct complex *R_sqrt_22_orthogonal[1] = {R_sqrt_22_orthogonal_tap}; + +// full correlation matrix for TM4 to make orthogonal effective channel + + + + +struct complex R_sqrt_22_orth_eff_ch_TM4_prec_real_tap[16] = {{0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0}, + {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0}, {-0.70711,0.0}, + {0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0}, + {0.0, 0.0}, {-0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}}; +struct complex *R_sqrt_22_orth_eff_ch_TM4_prec_real[1] = {R_sqrt_22_orth_eff_ch_TM4_prec_real_tap}; + + + + +struct complex R_sqrt_22_orth_eff_ch_TM4_prec_imag_tap[16] = {{0.70711,0.0}, {0.0,0.0}, {0.0, -0.70711}, {0.0,0.0}, + {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0}, {0.0,0.70711}, + {0.0,-0.70711}, {0.0, 0.0}, {-0.70711,0.0}, {0.0, 0.0}, + {0.0, 0.0}, {0.0,0.70711}, {0.0, 0.0}, {-0.70711,0.0}}; +struct complex *R_sqrt_22_orth_eff_ch_TM4_prec_imag[1] = {R_sqrt_22_orth_eff_ch_TM4_prec_imag_tap}; + +//Correlation matrix for EPA channel +struct complex R_sqrt_22_EPA_low_tap[16] = {{1.0,0.0}, {0.0,0.0}, {0.0,0.0}, {0.0,0.0}, + {0.0,0.0}, {1.0,0.0}, {0.0,0.0}, {0.0,0.0}, + {0.0,0.0}, {0.0,0.0}, {1.0,0.0}, {0.0,0.0}, + {0.0,0.0}, {0.0,0.0}, {0.0,0.0}, {1.0,0.0}}; +struct complex *R_sqrt_22_EPA_low[1] = {R_sqrt_22_EPA_low_tap}; + +struct complex R_sqrt_22_EPA_high_tap[16] = {{0.7179,0.0}, {0.4500,0.0}, {0.4500,0.0}, {0.2821,0.0}, + {0.4500,0.0}, {0.7179,0.0}, {0.2821,0.0}, {0.4500,0.0}, + {0.4500,0.0}, {0.2821,0.0}, {0.7179,0.0}, {0.4500,0.0}, + {0.2821,0.0}, {0.4500,0.0}, {0.4500,0.0}, {0.7179,0.0}}; +struct complex *R_sqrt_22_EPA_high[1] = {R_sqrt_22_EPA_high_tap}; + +struct complex R_sqrt_22_EPA_medium_tap[16] = {{0.8375,0.0}, {0.5249,0.0}, {0.1286,0.0}, {0.0806,0.0}, + {0.5249,0.0}, {0.8375,0.0}, {0.0806,0.0}, {0.1286,0.0}, + {0.1286,0.0}, {0.0806,0.0}, {0.8375,0.0}, {0.5249,0.0}, + {0.0806,0.0}, {0.1286,0.0}, {0.5249,0.0}, {0.8375,0.0}}; +struct complex *R_sqrt_22_EPA_medium[1] = {R_sqrt_22_EPA_medium_tap}; + + + +//Rayleigh1_orth_eff_ch_TM4 channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, uint8_t nb_rx, SCM_t channel_model, double sampling_rate, - double channel_bandwidth, + double channel_bandwidth, double forgetting_factor, int32_t channel_offset, double path_loss_dB) @@ -210,15 +257,15 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, double aoa,ricean_factor,Td,maxDoppler; int channel_length,nb_taps; - chan_desc->nb_tx = nb_tx; - chan_desc->nb_rx = nb_rx; - chan_desc->sampling_rate = sampling_rate; - chan_desc->channel_bandwidth = channel_bandwidth; - chan_desc->forgetting_factor = forgetting_factor; - chan_desc->channel_offset = channel_offset; - chan_desc->path_loss_dB = path_loss_dB; - chan_desc->first_run = 1; - chan_desc->ip = 0.0; + chan_desc->nb_tx = nb_tx; + chan_desc->nb_rx = nb_rx; + chan_desc->sampling_rate = sampling_rate; + chan_desc->channel_bandwidth = channel_bandwidth; + chan_desc->forgetting_factor = forgetting_factor; + chan_desc->channel_offset = channel_offset; + chan_desc->path_loss_dB = path_loss_dB; + chan_desc->first_run = 1; + chan_desc->ip = 0.0; LOG_I(OCM,"Channel Model (inside of new_channel_desc_scm)=%d\n\n", channel_model); @@ -227,27 +274,22 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, LOG_W(OCM,"channel model not yet supported\n"); free(chan_desc); return(NULL); - case SCM_B: LOG_W(OCM,"channel model not yet supported\n"); free(chan_desc); return(NULL); - case SCM_C: chan_desc->nb_taps = 18; chan_desc->Td = 4.625; chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); sum_amps = 0; chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double)); - for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]); sum_amps += chan_desc->amps[i]; } - for (i = 0; inb_taps; i++) chan_desc->amps[i] /= sum_amps; - chan_desc->delays = scm_c_delays; chan_desc->ricean_factor = 1; chan_desc->aoa = 0; @@ -255,42 +297,37 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*)); - for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex)); - for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); - for (i = 0; inb_taps; i++) chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex)); chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**)); - if (nb_tx==2 && nb_rx==2) { for (i = 0; i<6; i++) chan_desc->R_sqrt[i] = (struct complex*) &R22_sqrt[i][0]; - } else if (nb_tx==2 && nb_rx==1) { + } + else if (nb_tx==2 && nb_rx==1) { for (i = 0; i<6; i++) chan_desc->R_sqrt[i] = (struct complex*) &R21_sqrt[i][0]; - } else if (nb_tx==1 && nb_rx==2) { + } + else if (nb_tx==1 && nb_rx==2) { for (i = 0; i<6; i++) chan_desc->R_sqrt[i] = (struct complex*) &R12_sqrt[i][0]; - } else { + } + else { for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); - for (j = 0; jR_sqrt[i][j].x = 1.0; chan_desc->R_sqrt[i][j].y = 0.0; } - LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx); } } - break; - case SCM_D: LOG_W(OCM,"This is not the real SCM-D model! It is just SCM-C with an additional Rice factor!\n"); chan_desc->nb_taps = 18; @@ -298,15 +335,12 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); sum_amps = 0; chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double)); - for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*scm_c_amps_dB[i]); sum_amps += chan_desc->amps[i]; } - for (i = 0; inb_taps; i++) chan_desc->amps[i] /= sum_amps; - chan_desc->delays = scm_c_delays; chan_desc->ricean_factor = 0.1; chan_desc->aoa = 0; @@ -314,57 +348,49 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*)); - for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex)); - for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); - for (i = 0; inb_taps; i++) chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex)); chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**)); - if (nb_tx==2 && nb_rx==2) { for (i = 0; i<6; i++) chan_desc->R_sqrt[i] = (struct complex*) &R22_sqrt[i][0]; - } else if (nb_tx==2 && nb_rx==1) { + } + else if (nb_tx==2 && nb_rx==1) { for (i = 0; i<6; i++) chan_desc->R_sqrt[i] = (struct complex*) &R21_sqrt[i][0]; - } else if (nb_tx==1 && nb_rx==2) { + } + else if (nb_tx==1 && nb_rx==2) { for (i = 0; i<6; i++) chan_desc->R_sqrt[i] = (struct complex*) &R12_sqrt[i][0]; - } else { + } + else { for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); - for (j = 0; jR_sqrt[i][j].x = 1.0; chan_desc->R_sqrt[i][j].y = 0.0; } - LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx); } } - break; - case EPA: chan_desc->nb_taps = 7; chan_desc->Td = .410; chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); sum_amps = 0; chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double)); - for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]); sum_amps += chan_desc->amps[i]; } - for (i = 0; inb_taps; i++) chan_desc->amps[i] /= sum_amps; - chan_desc->delays = epa_delays; chan_desc->ricean_factor = 1; chan_desc->aoa = 0; @@ -372,53 +398,175 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*)); - for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex)); - for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); - for (i = 0; inb_taps; i++) chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex)); - if (nb_tx==2 && nb_rx==2) { chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**)); - for (i = 0; i<6; i++) chan_desc->R_sqrt[i] = (struct complex*) &R22_sqrt[i][0]; - } else { + } + else { chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**)); - for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); - for (j = 0; jR_sqrt[i][j].x = 1.0; chan_desc->R_sqrt[i][j].y = 0.0; } - LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n"); } } - break; - + case EPA_low: + chan_desc->nb_taps = 7; + chan_desc->Td = .410; + chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); + sum_amps = 0; + chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double)); + for (i = 0; inb_taps; i++) { + chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]); + sum_amps += chan_desc->amps[i]; + } + for (i = 0; inb_taps; i++) + chan_desc->amps[i] /= sum_amps; + chan_desc->delays = epa_delays; + chan_desc->ricean_factor = 1; + chan_desc->aoa = 0; + chan_desc->random_aoa = 0; + chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); + chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); + chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*)); + for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex)); + for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); + for (i = 0; inb_taps; i++) + chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex)); + if (nb_tx==2 && nb_rx==2) { + chan_desc->R_sqrt = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex**)); + for (i = 0; inb_taps; i++) + chan_desc->R_sqrt[i] = R_sqrt_22_EPA_low[0]; + } + else { + printf("Correlation matrices are implemented for 2 x 2 only"); + } + /*else { + chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**)); + for (i = 0; i<6; i++) { + chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); + for (j = 0; jR_sqrt[i][j].x = 1.0; + chan_desc->R_sqrt[i][j].y = 0.0; + } + LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n"); + } + }*/ + break; + case EPA_high: + chan_desc->nb_taps = 7; + chan_desc->Td = .410; + chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); + sum_amps = 0; + chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double)); + for (i = 0; inb_taps; i++) { + chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]); + sum_amps += chan_desc->amps[i]; + } + for (i = 0; inb_taps; i++) + chan_desc->amps[i] /= sum_amps; + chan_desc->delays = epa_delays; + chan_desc->ricean_factor = 1; + chan_desc->aoa = 0; + chan_desc->random_aoa = 0; + chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); + chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); + chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*)); + for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex)); + for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); + for (i = 0; inb_taps; i++) + chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex)); + if (nb_tx==2 && nb_rx==2) { + chan_desc->R_sqrt = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex**)); + for (i = 0; inb_taps; i++) + chan_desc->R_sqrt[i] = R_sqrt_22_EPA_high[0]; + } + else { + printf("Correlation matrices are implemented for 2 x 2 only"); + } + /*else { + chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**)); + for (i = 0; i<6; i++) { + chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); + for (j = 0; jR_sqrt[i][j].x = 1.0; + chan_desc->R_sqrt[i][j].y = 0.0; + } + LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n"); + } + }*/ + break; + case EPA_medium: + chan_desc->nb_taps = 7; + chan_desc->Td = .410; + chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); + sum_amps = 0; + chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double)); + for (i = 0; inb_taps; i++) { + chan_desc->amps[i] = pow(10,.1*epa_amps_dB[i]); + sum_amps += chan_desc->amps[i]; + } + for (i = 0; inb_taps; i++) + chan_desc->amps[i] /= sum_amps; + chan_desc->delays = epa_delays; + chan_desc->ricean_factor = 1; + chan_desc->aoa = 0; + chan_desc->random_aoa = 0; + chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); + chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); + chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*)); + for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex)); + for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); + for (i = 0; inb_taps; i++) + chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex)); + if (nb_tx==2 && nb_rx==2) { + chan_desc->R_sqrt = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex**)); + for (i = 0; inb_taps; i++) + chan_desc->R_sqrt[i] = R_sqrt_22_EPA_medium[0]; + } else { + printf("Correlation matrices are implemented for 2 x 2 only"); + } + /*else { + chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**)); + for (i = 0; i<6; i++) { + chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); + for (j = 0; jR_sqrt[i][j].x = 1.0; + chan_desc->R_sqrt[i][j].y = 0.0; + } + LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n"); + } + }*/ + break; case EVA: chan_desc->nb_taps = 9; chan_desc->Td = 2.51; chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); sum_amps = 0; chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double)); - for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*eva_amps_dB[i]); sum_amps += chan_desc->amps[i]; } - for (i = 0; inb_taps; i++) chan_desc->amps[i] /= sum_amps; - chan_desc->delays = eva_delays; chan_desc->ricean_factor = 1; chan_desc->aoa = 0; @@ -426,53 +574,41 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*)); - for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex)); - for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); - for (i = 0; inb_taps; i++) chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex)); - if (nb_tx==2 && nb_rx==2) { chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**)); - for (i = 0; i<6; i++) chan_desc->R_sqrt[i] = (struct complex*) &R22_sqrt[i][0]; - } else { + } + else { chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**)); - for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); - for (j = 0; jR_sqrt[i][j].x = 1.0; chan_desc->R_sqrt[i][j].y = 0.0; } - LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n"); } } - break; - case ETU: chan_desc->nb_taps = 9; chan_desc->Td = 5.0; chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); sum_amps = 0; chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double)); - for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*etu_amps_dB[i]); sum_amps += chan_desc->amps[i]; } - for (i = 0; inb_taps; i++) chan_desc->amps[i] /= sum_amps; - chan_desc->delays = etu_delays; chan_desc->ricean_factor = 1; chan_desc->aoa = 0; @@ -480,53 +616,41 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*)); - for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex)); - for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); - for (i = 0; inb_taps; i++) chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex)); - if (nb_tx==2 && nb_rx==2) { chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**)); - for (i = 0; i<6; i++) chan_desc->R_sqrt[i] = (struct complex*) &R22_sqrt[i][0]; - } else { + } + else { chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex**)); - for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); - for (j = 0; jR_sqrt[i][j].x = 1.0; chan_desc->R_sqrt[i][j].y = 0.0; } - LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n"); } } - break; - case MBSFN: chan_desc->nb_taps = 18; chan_desc->Td = 28.58; chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td)); sum_amps = 0; chan_desc->amps = (double*) malloc(chan_desc->nb_taps*sizeof(double)); - for (i = 0; inb_taps; i++) { chan_desc->amps[i] = pow(10,.1*mbsfn_amps_dB[i]); sum_amps += chan_desc->amps[i]; } - for (i = 0; inb_taps; i++) chan_desc->amps[i] /= sum_amps; - chan_desc->delays = mbsfn_delays; chan_desc->ricean_factor = 1; chan_desc->aoa = 0; @@ -534,341 +658,543 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, chan_desc->ch = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->chF = (struct complex**) malloc(nb_tx*nb_rx*sizeof(struct complex*)); chan_desc->a = (struct complex**) malloc(chan_desc->nb_taps*sizeof(struct complex*)); - for (i = 0; ich[i] = (struct complex*) malloc(chan_desc->channel_length * sizeof(struct complex)); - for (i = 0; ichF[i] = (struct complex*) malloc(1200 * sizeof(struct complex)); - for (i = 0; inb_taps; i++) chan_desc->a[i] = (struct complex*) malloc(nb_tx*nb_rx * sizeof(struct complex)); chan_desc->R_sqrt = (struct complex**) malloc(6*sizeof(struct complex*)); - for (i = 0; i<6; i++) { chan_desc->R_sqrt[i] = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex)); - for (j = 0; jR_sqrt[i][j].x = 1.0; chan_desc->R_sqrt[i][j].y = 0.0; } - LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n"); } - break; - case Rayleigh8: - nb_taps = 8; - Td = 0.8; - channel_length = (int)11+2*sampling_rate*Td; - ricean_factor = 1; - aoa = .03; - maxDoppler = 0; - fill_channel_desc(chan_desc, - nb_tx, - nb_rx, - nb_taps, - channel_length, - default_amps_lin, - NULL, - NULL, - Td, - sampling_rate, - channel_bandwidth, - ricean_factor, - aoa, - forgetting_factor, - maxDoppler, - channel_offset, - path_loss_dB, - 0); - break; + nb_taps = 8; + Td = 0.8; + channel_length = (int)11+2*sampling_rate*Td; + ricean_factor = 1; + aoa = .03; + maxDoppler = 0; + + fill_channel_desc(chan_desc, + nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amps_lin, + NULL, + NULL, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + break; case Rice8: - nb_taps = 8; - Td = 0.8; - channel_length = (int)11+2*sampling_rate*Td; - ricean_factor = 0.1; - aoa = .03; - maxDoppler = 0; + nb_taps = 8; + Td = 0.8; + channel_length = (int)11+2*sampling_rate*Td; + ricean_factor = 0.1; + aoa = 0.7854; + maxDoppler = 0; - fill_channel_desc(chan_desc,nb_tx, - nb_rx, - nb_taps, - channel_length, - default_amps_lin, - NULL, - NULL, - Td, - sampling_rate, - channel_bandwidth, - ricean_factor, - aoa, - forgetting_factor, - maxDoppler, - channel_offset, - path_loss_dB, - 1); - break; + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amps_lin, + NULL, + NULL, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 1); + break; case Rayleigh1: - nb_taps = 1; - Td = 0; - channel_length = 1; - ricean_factor = 1; - aoa = .03; - maxDoppler = 0; + nb_taps = 1; + Td = 0; + channel_length = 1; + ricean_factor = 1; + aoa = .03; + maxDoppler = 0; - fill_channel_desc(chan_desc,nb_tx, - nb_rx, - nb_taps, - channel_length, - default_amp_lin, - NULL, - NULL, - Td, - sampling_rate, - channel_bandwidth, - ricean_factor, - aoa, - forgetting_factor, - maxDoppler, - channel_offset, - path_loss_dB, - 0); - break; + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amp_lin, + NULL, + NULL, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + break; case Rayleigh1_800: - nb_taps = 1; - Td = 0; - channel_length = 1; - ricean_factor = 1; - aoa = .03; - maxDoppler = 800; + nb_taps = 1; + Td = 0; + channel_length = 1; + ricean_factor = 1; + aoa = .03; + maxDoppler = 800; - fill_channel_desc(chan_desc,nb_tx, - nb_rx, - nb_taps, - channel_length, - default_amp_lin, - NULL, - NULL, - Td, - sampling_rate, - channel_bandwidth, - ricean_factor, - aoa, - forgetting_factor, - maxDoppler, - channel_offset, - path_loss_dB, - 0); - break; + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amp_lin, + NULL, + NULL, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + break; case Rayleigh1_corr: - nb_taps = 1; - Td = 0; - channel_length = 1; - ricean_factor = 1; - aoa = .03; - maxDoppler = 0; + nb_taps = 1; + Td = 0; + channel_length = 1; + ricean_factor = 1; + aoa = .03; + maxDoppler = 0; - if ((nb_tx==2) && (nb_rx==1)) { - R_sqrt_ptr2 = R_sqrt_21_corr; - } else if ((nb_tx==2) && (nb_rx==2)) { - R_sqrt_ptr2 = R_sqrt_22_corr; - } else - R_sqrt_ptr2 = NULL; + if ((nb_tx==2) && (nb_rx==1)) { + R_sqrt_ptr2 = R_sqrt_21_corr; + } + else if ((nb_tx==2) && (nb_rx==2)) { + R_sqrt_ptr2 = R_sqrt_22_corr; + } + else + R_sqrt_ptr2 = NULL; - fill_channel_desc(chan_desc,nb_tx, - nb_rx, - nb_taps, - channel_length, - default_amp_lin, - NULL, - R_sqrt_ptr2, - Td, - sampling_rate, - channel_bandwidth, - ricean_factor, - aoa, - forgetting_factor, - maxDoppler, - channel_offset, - path_loss_dB, - 0); - break; + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amp_lin, + NULL, + R_sqrt_ptr2, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + break; case Rayleigh1_anticorr: - nb_taps = 1; - Td = 0; - channel_length = 1; - ricean_factor = 1; - aoa = .03; - maxDoppler = 0; + nb_taps = 1; + Td = 0; + channel_length = 1; + ricean_factor = 1; + aoa = .03; + maxDoppler = 0; - if ((nb_tx==2) && (nb_rx==1)) { - R_sqrt_ptr2 = R_sqrt_21_anticorr; - } else if ((nb_tx==2) && (nb_rx==2)) { - R_sqrt_ptr2 = R_sqrt_22_anticorr; - } else - R_sqrt_ptr2 = NULL; + if ((nb_tx==2) && (nb_rx==1)) { //check this + R_sqrt_ptr2 = R_sqrt_21_anticorr; + } + else if ((nb_tx==2) && (nb_rx==2)) { + R_sqrt_ptr2 = R_sqrt_22_anticorr; + } + else + R_sqrt_ptr2 = NULL; - fill_channel_desc(chan_desc,nb_tx, - nb_rx, - nb_taps, - channel_length, - default_amp_lin, - NULL, - R_sqrt_ptr2, - Td, - sampling_rate, - channel_bandwidth, - ricean_factor, - aoa, - forgetting_factor, - maxDoppler, - channel_offset, - path_loss_dB, - 0); - break; + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amp_lin, + NULL, + R_sqrt_ptr2, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + break; case Rice1: - nb_taps = 1; - Td = 0; - channel_length = 1; - ricean_factor = 0.1; - aoa = .03; - maxDoppler = 0; + nb_taps = 1; + Td = 0; + channel_length = 1; + ricean_factor = 0.1; + aoa = 0.7854; + maxDoppler = 0; - fill_channel_desc(chan_desc,nb_tx, - nb_rx, - nb_taps, - channel_length, - default_amp_lin, - NULL, - NULL, - Td, - sampling_rate, - channel_bandwidth, - ricean_factor, - aoa, - forgetting_factor, - maxDoppler, - channel_offset, - path_loss_dB, - 0); - break; + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amp_lin, + NULL, + NULL, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + break; case AWGN: - nb_taps = 1; - Td = 0; - channel_length = 1; - ricean_factor = 0.0; - aoa = 0.0; - maxDoppler = 0; + nb_taps = 1; + Td = 0; + channel_length = 1; + ricean_factor = 0.0; + aoa = 0.0; + maxDoppler = 0; - fill_channel_desc(chan_desc,nb_tx, - nb_rx, - nb_taps, - channel_length, - default_amp_lin, - NULL, - NULL, - Td, - sampling_rate, - channel_bandwidth, - ricean_factor, - aoa, - forgetting_factor, - maxDoppler, - channel_offset, - path_loss_dB, - 0); - printf("AWGN: ricean_factor %f\n",chan_desc->ricean_factor); + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amp_lin, + NULL, + NULL, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + printf("AWGN: ricean_factor %f\n",chan_desc->ricean_factor); - break; + break; + + case TS_SHIFT: + nb_taps = 2; + Td = ts_shift_delays[1]; + channel_length = 10; + ricean_factor = 0.0; + aoa = 0.0; + maxDoppler = 0; + + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + ts_shift_amps, + ts_shift_delays, + NULL, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + printf("TS_SHIFT: ricean_factor %f\n",chan_desc->ricean_factor); + + break; case Rice1_corr: - nb_taps = 1; - Td = 0; - channel_length = 1; - ricean_factor = 0.1; - aoa = .03; - maxDoppler = 0; + nb_taps = 1; + Td = 0; + channel_length = 1; + ricean_factor = 0.1; + aoa = .03; + maxDoppler = 0; - if ((nb_tx==2) && (nb_rx==1)) { - R_sqrt_ptr2 = R_sqrt_21_corr; - } else if ((nb_tx==2) && (nb_rx==2)) { - R_sqrt_ptr2 = R_sqrt_22_corr; - } else - R_sqrt_ptr2 = NULL; + if ((nb_tx==2) && (nb_rx==1)) { + R_sqrt_ptr2 = R_sqrt_21_corr; + } + else if ((nb_tx==2) && (nb_rx==2)) { + R_sqrt_ptr2 = R_sqrt_22_corr; + } + else + R_sqrt_ptr2 = NULL; - fill_channel_desc(chan_desc,nb_tx, - nb_rx, - nb_taps, - channel_length, - default_amp_lin, - NULL, - R_sqrt_ptr2, - Td, - sampling_rate, - channel_bandwidth, - ricean_factor, - aoa, - forgetting_factor, - maxDoppler, - channel_offset, - path_loss_dB, - 1); - break; + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amp_lin, + NULL, + R_sqrt_ptr2, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 1); + break; case Rice1_anticorr: - nb_taps = 1; - Td = 0; - channel_length = 1; - ricean_factor = 0.1; - aoa = .03; - maxDoppler = 0; + nb_taps = 1; + Td = 0; + channel_length = 1; + ricean_factor = 0.1; + aoa = .03; + maxDoppler = 0; - if ((nb_tx==2) && (nb_rx==1)) { - R_sqrt_ptr2 = R_sqrt_21_anticorr; - } else if ((nb_tx==2) && (nb_rx==2)) { - R_sqrt_ptr2 = R_sqrt_22_anticorr; - } else - R_sqrt_ptr2 = NULL; + if ((nb_tx==2) && (nb_rx==1)) { + R_sqrt_ptr2 = R_sqrt_21_anticorr; + } + else if ((nb_tx==2) && (nb_rx==2)) { + R_sqrt_ptr2 = R_sqrt_22_anticorr; + } + else + R_sqrt_ptr2 = NULL; - fill_channel_desc(chan_desc,nb_tx, - nb_rx, - nb_taps, - channel_length, - default_amp_lin, - NULL, - R_sqrt_ptr2, - Td, - sampling_rate, - channel_bandwidth, - ricean_factor, - aoa, - forgetting_factor, - maxDoppler, - channel_offset, - path_loss_dB, - 1); - break; + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amp_lin, + NULL, + R_sqrt_ptr2, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 1); + break; + + case Rayleigh1_orthogonal: + nb_taps = 1; + Td = 0; + channel_length = 1; + ricean_factor = 1; + aoa = 0.03; + maxDoppler = 0; + + + if ((nb_tx==2) && (nb_rx==2)) { + R_sqrt_ptr2 = R_sqrt_22_orthogonal; + } + else + R_sqrt_ptr2 = NULL; + + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amp_lin, + NULL, + R_sqrt_ptr2, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + break; + + case Rayleigh1_orth_eff_ch_TM4_prec_real: + nb_taps = 1; + Td = 0; + channel_length = 1; + ricean_factor = 1; + aoa = 0.03; + maxDoppler = 0; + + + if ((nb_tx==2) && (nb_rx==2)) { + R_sqrt_ptr2 = R_sqrt_22_orth_eff_ch_TM4_prec_real; + } + else + R_sqrt_ptr2 = NULL; + + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amp_lin, + NULL, + R_sqrt_ptr2, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 1); + break; + + case Rayleigh1_orth_eff_ch_TM4_prec_imag: + nb_taps = 1; + Td = 0; + channel_length = 1; + ricean_factor = 1; + aoa = 0.03; + maxDoppler = 0; + + + if ((nb_tx==2) && (nb_rx==2)) { + R_sqrt_ptr2 = R_sqrt_22_orth_eff_ch_TM4_prec_imag; + } + else + R_sqrt_ptr2 = NULL; + + fill_channel_desc(chan_desc,nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amp_lin, + NULL, + R_sqrt_ptr2, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + break; + + case Rayleigh8_orth_eff_ch_TM4_prec_real: + + if ((nb_tx==2) && (nb_rx==2)) { + R_sqrt_ptr2 = R_sqrt_22_orth_eff_ch_TM4_prec_real; + //R_sqrt_ptr2 = NULL; + } + else + R_sqrt_ptr2 = NULL; + + + nb_taps = 8; + Td = 0.8; + channel_length = (int)11+2*sampling_rate*Td; + ricean_factor = 1; + aoa = .03; + maxDoppler = 0; + + fill_channel_desc(chan_desc, + nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amps_lin, + NULL, + R_sqrt_ptr2, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + + break; + + case Rayleigh8_orth_eff_ch_TM4_prec_imag: + nb_taps = 8; + Td = 0.8; + channel_length = (int)11+2*sampling_rate*Td; + ricean_factor = 1; + aoa = .03; + maxDoppler = 0; + + if ((nb_tx==2) && (nb_rx==2)) { + R_sqrt_ptr2 = R_sqrt_22_orth_eff_ch_TM4_prec_imag; + } + else + R_sqrt_ptr2 = NULL; + + fill_channel_desc(chan_desc, + nb_tx, + nb_rx, + nb_taps, + channel_length, + default_amps_lin, + NULL, + R_sqrt_ptr2, + Td, + sampling_rate, + channel_bandwidth, + ricean_factor, + aoa, + forgetting_factor, + maxDoppler, + channel_offset, + path_loss_dB, + 0); + break; default: LOG_W(OCM,"channel model not yet supported\n"); free(chan_desc); return(NULL); } - LOG_D(OCM,"[CHANNEL] RF %f\n",chan_desc->ricean_factor); - - for (i=0; inb_taps; i++) + for (i=0;inb_taps;i++) LOG_D(OCM,"[CHANNEL] tap %d: amp %f, delay %f\n",i,chan_desc->amps[i],chan_desc->delays[i]); chan_desc->nb_paths = 10; @@ -877,8 +1203,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, } -int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) -{ +int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) { double s; int i,k,l,aarx,aatx; @@ -886,15 +1211,14 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) struct complex phase, alpha, beta; if ((desc->nb_tx>NB_ANTENNAS_TX) || (desc->nb_rx > NB_ANTENNAS_RX)) { - msg("random_channel.c: Error: temporary buffer for channel not big enough (%d,%d)\n",desc->nb_tx,desc->nb_rx); + LOG_E(PHY,"random_channel.c: Error: temporary buffer for channel not big enough (%d,%d)\n",desc->nb_tx,desc->nb_rx); return(-1); } start_meas(&desc->random_channel); - - for (i=0; i<(int)desc->nb_taps; i++) { - for (aarx=0; aarxnb_rx; aarx++) { - for (aatx=0; aatxnb_tx; aatx++) { + for (i=0;i<(int)desc->nb_taps;i++) { + for (aarx=0;aarxnb_rx;aarx++) { + for (aatx=0;aatxnb_tx;aatx++) { anew[aarx+(aatx*desc->nb_rx)].x = sqrt(desc->ricean_factor*desc->amps[i]/2) * gaussdouble(0.0,1.0); anew[aarx+(aatx*desc->nb_rx)].y = sqrt(desc->ricean_factor*desc->amps[i]/2) * gaussdouble(0.0,1.0); @@ -913,7 +1237,6 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) anew[aarx+(aatx*desc->nb_rx)].x += phase.x * sqrt(1.0-desc->ricean_factor); anew[aarx+(aatx*desc->nb_rx)].y += phase.y * sqrt(1.0-desc->ricean_factor); } - #ifdef DEBUG_CH printf("(%d,%d,%d) %f->(%f,%f) (%f,%f) phase (%f,%f)\n",aarx,aatx,i,desc->amps[i],anew[aarx+(aatx*desc->nb_rx)].x,anew[aarx+(aatx*desc->nb_rx)].y,desc->aoa,desc->ricean_factor,phase.x,phase.y); #endif @@ -924,9 +1247,9 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) // for debugging set a=anew; for (aarx=0;aarxnb_rx;aarx++) { for (aatx=0;aatxnb_tx;aatx++) { - desc->a[i][aarx+(aatx*desc->nb_rx)].x = anew[aarx+(aatx*desc->nb_rx)].x; - desc->a[i][aarx+(aatx*desc->nb_rx)].y = anew[aarx+(aatx*desc->nb_rx)].y; - printf("anew(%d,%d) = %f+1j*%f\n",aatx,aarx,anew[aarx+(aatx*desc->nb_rx)].x, anew[aarx+(aatx*desc->nb_rx)].y); + desc->a[i][aarx+(aatx*desc->nb_rx)].x = anew[aarx+(aatx*desc->nb_rx)].x; + desc->a[i][aarx+(aatx*desc->nb_rx)].y = anew[aarx+(aatx*desc->nb_rx)].y; + printf("anew(%d,%d) = %f+1j*%f\n",aatx,aarx,anew[aarx+(aatx*desc->nb_rx)].x, anew[aarx+(aatx*desc->nb_rx)].y); } } */ @@ -944,16 +1267,17 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) /* for (aarx=0;aarxnb_rx;aarx++) { for (aatx=0;aatxnb_tx;aatx++) { - desc->a[i][aarx+(aatx*desc->nb_rx)].x = acorr[aarx+(aatx*desc->nb_rx)].x; - desc->a[i][aarx+(aatx*desc->nb_rx)].y = acorr[aarx+(aatx*desc->nb_rx)].y; - printf("tap %d, acorr1(%d,%d) = %f+1j*%f\n",i,aatx,aarx,acorr[aarx+(aatx*desc->nb_rx)].x, acorr[aarx+(aatx*desc->nb_rx)].y); + desc->a[i][aarx+(aatx*desc->nb_rx)].x = acorr[aarx+(aatx*desc->nb_rx)].x; + desc->a[i][aarx+(aatx*desc->nb_rx)].y = acorr[aarx+(aatx*desc->nb_rx)].y; + printf("tap %d, acorr1(%d,%d) = %f+1j*%f\n",i,aatx,aarx,acorr[aarx+(aatx*desc->nb_rx)].x, acorr[aarx+(aatx*desc->nb_rx)].y); } } */ - if (desc->first_run==1) { + if (desc->first_run==1){ cblas_zcopy(desc->nb_tx*desc->nb_rx, (void*) acorr, 1, (void*) desc->a[i], 1); - } else { + } + else { // a = alpha*acorr+beta*a // a = beta*a // a = a+alpha*acorr @@ -971,15 +1295,14 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) /* for (aarx=0;aarxnb_rx;aarx++) { for (aatx=0;aatxnb_tx;aatx++) { - //desc->a[i][aarx+(aatx*desc->nb_rx)].x = acorr[aarx+(aatx*desc->nb_rx)].x; - //desc->a[i][aarx+(aatx*desc->nb_rx)].y = acorr[aarx+(aatx*desc->nb_rx)].y; - printf("tap %d, a(%d,%d) = %f+1j*%f\n",i,aatx,aarx,desc->a[i][aarx+(aatx*desc->nb_rx)].x, desc->a[i][aarx+(aatx*desc->nb_rx)].y); + //desc->a[i][aarx+(aatx*desc->nb_rx)].x = acorr[aarx+(aatx*desc->nb_rx)].x; + //desc->a[i][aarx+(aatx*desc->nb_rx)].y = acorr[aarx+(aatx*desc->nb_rx)].y; + printf("tap %d, a(%d,%d) = %f+1j*%f\n",i,aatx,aarx,desc->a[i][aarx+(aatx*desc->nb_rx)].x, desc->a[i][aarx+(aatx*desc->nb_rx)].y); } } */ } //nb_taps - stop_meas(&desc->random_channel); //memset((void *)desc->ch[aarx+(aatx*desc->nb_rx)],0,(int)(desc->channel_length)*sizeof(struct complex)); @@ -1012,14 +1335,14 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) } //nb_taps #ifdef DEBUG_CH - printf("(%d,%d,%d)->(%f,%f)\n",k,aarx,aatx,desc->ch[aarx+(aatx*desc->nb_rx)][k].x,desc->ch[aarx+(aatx*desc->nb_rx)][k].y); + k=0; + printf("(%d,%d,%d)->(%f,%f)\n",k,aarx,aatx,desc->ch[aarx+(aatx*desc->nb_rx)][k].x,desc->ch[aarx+(aatx*desc->nb_rx)][k].y); #endif - } - } //channel_length - } //aatx - } //aarx - - stop_meas(&desc->interp_time); + } + } //channel_length + } //aatx + } //aarx + stop_meas(&desc->interp_time); } if (desc->first_run==1) @@ -1035,22 +1358,22 @@ double N_RB2sampling_rate(uint16_t N_RB) case 6: sampling_rate = 1.92; break; - + case 25: sampling_rate = 7.68; break; - + case 50: sampling_rate = 15.36; break; - + case 100: sampling_rate = 30.72; break; - + default: LOG_E(PHY,"Unknown N_PRB\n"); - return(-1); + return(-1); } return(sampling_rate); @@ -1063,22 +1386,22 @@ double N_RB2channel_bandwidth(uint16_t N_RB) case 6: channel_bandwidth = 1.25; break; - + case 25: channel_bandwidth = 5.00; break; - + case 50: channel_bandwidth = 10.00; break; - + case 100: channel_bandwidth = 20.00; break; - + default: LOG_E(PHY,"Unknown N_PRB\n"); - return(-1); + return(-1); } return(channel_bandwidth); } @@ -1086,8 +1409,7 @@ double N_RB2channel_bandwidth(uint16_t N_RB) #ifdef RANDOM_CHANNEL_MAIN #define sampling_rate 5.0 #define Td 2.0 -main(int argc,char **argv) -{ +main(int argc,char **argv) { double amps[8] = {.8,.2,.1,.04,.02,.01,.005}; struct complex ch[(int)(1+2*sampling_rate*Td)],phase; diff --git a/openair1/SIMULATION/TOOLS/rangen_double.c b/openair1/SIMULATION/TOOLS/rangen_double.c index 24de0468c3..0fc01a8d31 100644 --- a/openair1/SIMULATION/TOOLS/rangen_double.c +++ b/openair1/SIMULATION/TOOLS/rangen_double.c @@ -1,37 +1,28 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifdef USER_MODE #include #include #include #include -#endif #include "defs.h" @@ -46,12 +37,40 @@ static unsigned int seed, iy, ir[98]; #define a 1664525lu #define mod 4294967296.0 /* is 2**32 */ - +#if 1 void randominit(unsigned seed_init) { int i; // this need to be integrated with the existing rng, like taus: navid - msg("Initializing random number generator, seed %x\n",seed_init); + printf("Initializing random number generator, seed %x\n",seed_init); + + if (seed_init == 0) { + srand((unsigned)time(NULL)); + + seed = (unsigned int) rand(); + } else { + seed = seed_init; + } + + if (seed % 2 == 0) seed += 1; /* seed and mod are relative prime */ + + for (i=1; i<=97; i++) { + seed = a*seed; /* mod 2**32 */ + ir[i]= seed; /* initialize the shuffle table */ + } + + iy=1; +} +#endif + +#if 0 +void randominit(unsigned seed_init) +{ + int i; + // this need to be integrated with the existing rng, like taus: navid + LOG_D(PHY,"Initializing random number generator, seed %x\n",seed_init); + + seed_init = 62110; if (seed_init == 0) { srand((unsigned)time(NULL)); @@ -70,7 +89,7 @@ void randominit(unsigned seed_init) iy=1; } - +#endif /*!\brief Uniform linear congruential random number generator on \f$[0,1)\f$. Returns a double-precision floating-point number.*/ double uniformrandom(void) diff --git a/openair1/SIMULATION/TOOLS/scm_corrmat.h b/openair1/SIMULATION/TOOLS/scm_corrmat.h index 61fd6a6e11..6ee6567ce9 100644 --- a/openair1/SIMULATION/TOOLS/scm_corrmat.h +++ b/openair1/SIMULATION/TOOLS/scm_corrmat.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ double R22_sqrt[6][32] = { {0.921700, -0.000000, 0.010380, -0.027448, -0.250153, 0.294754, 0.005961, 0.010769, 0.010380, 0.027448, 0.921700, 0.000000, -0.011595, -0.004130, -0.250153, 0.294754, -0.250153, -0.294754, -0.011595, 0.004130, 0.921700, 0.000000, 0.010380, -0.027448, 0.005961, -0.010769, -0.250153, -0.294754, 0.010380, 0.027448, 0.921700, 0.000000}, {0.923810, 0.000000, 0.004069, 0.027832, 0.151730, 0.350180, -0.009882, 0.006114, 0.004069, -0.027832, 0.923810, 0.000000, 0.011218, -0.003029, 0.151730, 0.350180, 0.151730, -0.350180, 0.011218, 0.003029, 0.923810, -0.000000, 0.004069, 0.027832, -0.009882, -0.006114, 0.151730, -0.350180, 0.004069, -0.027832, 0.923810, 0.000000}, diff --git a/openair1/SIMULATION/TOOLS/taus.c b/openair1/SIMULATION/TOOLS/taus.c index 9a2a6f44b3..0be7952da7 100644 --- a/openair1/SIMULATION/TOOLS/taus.c +++ b/openair1/SIMULATION/TOOLS/taus.c @@ -1,111 +1,116 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -#ifdef USER_MODE -#include -#include -#else -#include -#include -#endif -#ifdef RTAI_ENABLED -#include -#include -#define time(x) (unsigned int)(rt_get_time_ns()) -#endif - -unsigned int s0, s1, s2, b; - -//---------------------------------------------- -// -/*! -*/ -// - -unsigned int taus(void) -{ - - b = (((s0 << 13) ^ s0) >> 19); - s0 = (((s0 & 0xFFFFFFFE) << 12)^ b); - b = (((s1 << 2) ^ s1) >> 25); - s1 = (((s1 & 0xFFFFFFF8) << 4)^ b); - b = (((s2 << 3) ^ s2) >> 11); - s2 = (((s2 & 0xFFFFFFF0) << 17)^ b); - return s0 ^ s1 ^ s2; -} - -void set_taus_seed(unsigned int seed_init) -{ - -#ifdef USER_MODE - struct drand48_data buffer; - unsigned long result = 0; -#endif - - if (seed_init == 0) { - s0 = (unsigned int)time(NULL); - s1 = (unsigned int)time(NULL); - s2 = (unsigned int)time(NULL); - } else { -#ifndef USER_MODE - s0 = (unsigned int)0x1e23d852; - s1 = (unsigned int)0x81f38a1c; - s2 = (unsigned int)0xfe1a133e; -#else - /* Use reentrant version of rand48 to ensure that no conflicts with other generators occur */ - srand48_r((long int)seed_init, &buffer); - mrand48_r(&buffer, (long int *)&result); - s0 = result; - mrand48_r(&buffer, (long int *)&result); - s1 = result; - mrand48_r(&buffer, (long int *)&result); - s2 = result; -#endif - } -} - -#ifdef MAIN - -main() -{ - - unsigned int i,rand; - - set_taus_seed(); - - for (i=0; i<10; i++) { - - rand = taus(); - printf("%u\n",rand); - - } -} -#endif //MAIN - - - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include +#include + +unsigned int s0, s1, s2, b; + +//---------------------------------------------- +// +/*! +*/ +// + +unsigned int taus(void) +{ + + b = (((s0 << 13) ^ s0) >> 19); + s0 = (((s0 & 0xFFFFFFFE) << 12)^ b); + b = (((s1 << 2) ^ s1) >> 25); + s1 = (((s1 & 0xFFFFFFF8) << 4)^ b); + b = (((s2 << 3) ^ s2) >> 11); + s2 = (((s2 & 0xFFFFFFF0) << 17)^ b); + return s0 ^ s1 ^ s2; +} +#if 1 +void set_taus_seed(unsigned int seed_init) +{ + + struct drand48_data buffer; + unsigned long result = 0; + + if (seed_init == 0) { + s0 = (unsigned int)time(NULL); + s1 = (unsigned int)time(NULL); + s2 = (unsigned int)time(NULL); + } else { + /* Use reentrant version of rand48 to ensure that no conflicts with other generators occur */ + srand48_r((long int)seed_init, &buffer); + mrand48_r(&buffer, (long int *)&result); + s0 = result; + mrand48_r(&buffer, (long int *)&result); + s1 = result; + mrand48_r(&buffer, (long int *)&result); + s2 = result; + } +} +#endif + +#if 0 + void set_taus_seed(unsigned int seed_init) +{ + + struct drand48_data buffer; + unsigned long result = 0; + s0 = (unsigned int)0x1e23d852; + s1 = (unsigned int)0x81f38a1c; + s2 = (unsigned int)0xfe1a133e; + + return; + + if (seed_init == 0) { + s0 = (unsigned int)time(NULL); + s1 = (unsigned int)time(NULL); + s2 = (unsigned int)time(NULL); + } else { + // Use reentrant version of rand48 to ensure that no conflicts with other generators occur */ + srand48_r((long int)seed_init, &buffer); + mrand48_r(&buffer, (long int *)&result); + s0 = result; + mrand48_r(&buffer, (long int *)&result); + s1 = result; + mrand48_r(&buffer, (long int *)&result); + s2 = result; + } +} +#endif + +#ifdef MAIN + +main() +{ + + unsigned int i,rand; + + set_taus_seed(); + + for (i=0; i<10; i++) { + + rand = taus(); + printf("%u\n",rand); + + } +} +#endif //MAIN + + + diff --git a/openair2/COMMON/COPYING b/openair2/COMMON/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/COMMON/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/COMMON/as_message.h b/openair2/COMMON/as_message.h index 30810a325e..829c3c9e33 100644 --- a/openair2/COMMON/as_message.h +++ b/openair2/COMMON/as_message.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - /***************************************************************************** Source as_message.h @@ -220,6 +211,14 @@ typedef struct broadcast_info_ind_s { #define AS_HSDUPA (1 << NET_ACCESS_HSDUPA) #define AS_EUTRAN (1 << NET_ACCESS_EUTRAN) +/* + * NAS->AS -K_eNB refresh request + * NAS request AS to refresh its KeNB key + */ +typedef struct kenb_refresh_req_s { + Byte_t kenb[32]; +} kenb_refresh_req_t; + /* * NAS->AS - Cell Information request * NAS request AS to search for a suitable cell belonging to the selected diff --git a/openair2/COMMON/commonDef.h b/openair2/COMMON/commonDef.h index 64216b0094..b37230cdd4 100644 --- a/openair2/COMMON/commonDef.h +++ b/openair2/COMMON/commonDef.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /* Source commonDef.h @@ -50,6 +43,13 @@ Description Contains global common definitions #include #include +/* boolean_t is also defined in openair2/COMMON/platform_types.h + * let's protect potential redefinition + */ + +#ifndef _BOOLEAN_T_DEFINED_ +#define _BOOLEAN_T_DEFINED_ + typedef signed char boolean_t; #if !defined(TRUE) @@ -62,6 +62,8 @@ typedef signed char boolean_t; #define BOOL_NOT(b) (b^TRUE) +#endif /* _BOOLEAN_T_DEFINED_ */ + #define NAS_UE_ID_FMT "0x%06x" /****************************************************************************/ @@ -314,15 +316,6 @@ typedef struct { */ #define TAI_LIST_T(SIZE) struct {Byte_t n_tais; tai_t tai[SIZE];} -/* - * User notification callback, executed whenever a change of data with - * respect of network information (e.g. network registration and/or - * location change, new PLMN becomes available) is notified by the - * EPS Mobility Management sublayer - */ -typedef int (*emm_indication_callback_t) (Stat_t, tac_t, ci_t, AcT_t, - const char*, size_t); - typedef enum eps_protocol_discriminator_e { /* Protocol discriminator identifier for EPS Mobility Management */ EPS_MOBILITY_MANAGEMENT_MESSAGE = 0x7, diff --git a/openair2/COMMON/gtpv1_u_messages_def.h b/openair2/COMMON/gtpv1_u_messages_def.h old mode 100755 new mode 100644 index 0e93a917ab..9cc41a70ea --- a/openair2/COMMON/gtpv1_u_messages_def.h +++ b/openair2/COMMON/gtpv1_u_messages_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ MESSAGE_DEF(GTPV1U_ENB_UPDATE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, gtpv1u_enb_update_tunnel_req_t, Gtpv1uUpdateTunnelReq) MESSAGE_DEF(GTPV1U_ENB_UPDATE_TUNNEL_RESP, MESSAGE_PRIORITY_MED, gtpv1u_enb_update_tunnel_resp_t, Gtpv1uUpdateTunnelResp) diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h old mode 100755 new mode 100644 index 2a6dd1bf2c..c3c9c6b7c7 --- a/openair2/COMMON/gtpv1_u_messages_types.h +++ b/openair2/COMMON/gtpv1_u_messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef GTPV1_U_MESSAGES_TYPES_H_ #define GTPV1_U_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/intertask_interface_conf.h b/openair2/COMMON/intertask_interface_conf.h index 9d6a7f9d99..9c108f87e0 100644 --- a/openair2/COMMON/intertask_interface_conf.h +++ b/openair2/COMMON/intertask_interface_conf.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * intertask_interface_conf.h diff --git a/openair2/COMMON/mac_messages_def.h b/openair2/COMMON/mac_messages_def.h index 64aca9911c..fcb4543149 100644 --- a/openair2/COMMON/mac_messages_def.h +++ b/openair2/COMMON/mac_messages_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * mac_messages_def.h @@ -48,3 +40,5 @@ MESSAGE_DEF(RRC_MAC_CCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, RrcMacCcchDat MESSAGE_DEF(RRC_MAC_MCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcMacMcchDataReq, rrc_mac_mcch_data_req) MESSAGE_DEF(RRC_MAC_MCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, RrcMacMcchDataInd, rrc_mac_mcch_data_ind) + +MESSAGE_DEF(RRC_MAC_PCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcMacPcchDataReq, rrc_mac_pcch_data_req) diff --git a/openair2/COMMON/mac_messages_types.h b/openair2/COMMON/mac_messages_types.h index ecc8c67533..d7fd44f072 100644 --- a/openair2/COMMON/mac_messages_types.h +++ b/openair2/COMMON/mac_messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * mac_messages_types.h @@ -51,11 +43,13 @@ #define RRC_MAC_MCCH_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_mcch_data_req #define RRC_MAC_MCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_mcch_data_ind +#define RRC_MAC_PCCH_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_mac_pcch_data_req // Some constants from "LAYER2/MAC/defs.h" #define BCCH_SDU_SIZE (512) #define CCCH_SDU_SIZE (512) #define MCCH_SDU_SIZE (512) +#define PCCH_SDU_SIZE (512) //-------------------------------------------------------------------------------------------// // Messages between RRC and MAC layers @@ -122,4 +116,10 @@ typedef struct RrcMacMcchDataInd_s { uint8_t mbsfn_sync_area; } RrcMacMcchDataInd; +typedef struct RrcMacPcchDataReq_s { + uint32_t frame; + uint32_t sdu_size; + uint8_t sdu[PCCH_SDU_SIZE]; + uint8_t enb_index; +} RrcMacPcchDataReq; #endif /* MAC_MESSAGES_TYPES_H_ */ diff --git a/openair2/COMMON/mac_primitives.h b/openair2/COMMON/mac_primitives.h index a8fc149f47..c901722d5d 100644 --- a/openair2/COMMON/mac_primitives.h +++ b/openair2/COMMON/mac_primitives.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __MAC_PRIMITIVES_H__ #define __MAC_PRIMITIVES_H__ diff --git a/openair2/COMMON/mac_rlc_primitives.h b/openair2/COMMON/mac_rlc_primitives.h index 62913bd842..4e3e22781c 100644 --- a/openair2/COMMON/mac_rlc_primitives.h +++ b/openair2/COMMON/mac_rlc_primitives.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*************************************************************************** mac_rlc_primitives.h - description diff --git a/openair2/COMMON/mac_rrc_primitives.h b/openair2/COMMON/mac_rrc_primitives.h index b7f1450909..3a73000e50 100644 --- a/openair2/COMMON/mac_rrc_primitives.h +++ b/openair2/COMMON/mac_rrc_primitives.h @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __MAC_RRC_PRIMITIVES_H__ # define __MAC_RRC_PRIMITIVES_H__ @@ -42,7 +33,8 @@ #include "RadioResourceConfigCommonSIB.h" #include "RadioResourceConfigDedicated.h" #include "MeasGapConfig.h" -#ifdef Rel10 +#include "TDD-Config.h" +#if defined(Rel10) || defined(Rel14) #include "MBSFN-AreaInfoList-r9.h" #include "MBSFN-SubframeConfigList.h" #endif @@ -100,13 +92,6 @@ result could be based on an event-driven measurement report. #define RRC_RACH_ASS_REQ 0 #define MAC_RACH_BW_REQ 1 -typedef enum { - RRC_OK=0, - RRC_ConnSetup_failed, - RRC_PHY_RESYNCH, - RRC_Handover_failed, - RRC_HO_STARTED -} RRC_status_t; /*! MAC/PHY Measurement Structure*/ @@ -233,17 +218,7 @@ typedef struct { /*! \brief MAC Logical Channel Descriptor */ -typedef struct { - unsigned short transport_block_size; /*!< \brief Minimum PDU size in bytes provided by RLC to MAC layer interface */ - unsigned short max_transport_blocks; /*!< \brief Maximum PDU size in bytes provided by RLC to MAC layer interface */ - unsigned long Guaranteed_bit_rate; /*!< \brief Guaranteed Bit Rate (average) to be offered by MAC layer scheduling*/ - unsigned long Max_bit_rate; /*!< \brief Maximum Bit Rate that can be offered by MAC layer scheduling*/ - uint8_t Delay_class; /*!< \brief Delay class offered by MAC layer scheduling*/ - uint8_t Target_bler; /*!< \brief Target Average Transport Block Error rate*/ - uint8_t Lchan_t; /*!< \brief Logical Channel Type (BCCH,CCCH,DCCH,DTCH_B,DTCH,MRBCH)*/ -} __attribute__ ((__packed__)) LCHAN_DESC; -#define LCHAN_DESC_SIZE sizeof(LCHAN_DESC) /*!\brief This primitive indicates to RRC that a particular logical channel has been established and that successful transmission has been received. The parameter passed is the logical channel id. @@ -269,9 +244,7 @@ typedef struct { LCHAN_DESC Lchan_desc[2]; /*!< \brief Logical Channel QoS Descriptor (MAC component) */ uint8_t L3_info_type; uint8_t L3_info[16]; - //#ifndef CELLULAR unsigned short UE_eNB_index; - //#endif } __attribute__ ((__packed__)) MAC_CONFIG_REQ; #define MAC_CONFIG_REQ_SIZE sizeof(MAC_CONFIG_REQ) @@ -339,18 +312,12 @@ typedef struct { #ifndef OPENAIR2_IN -#ifndef CELLULAR -//#include "L3_rrc_defs.h" -#endif - typedef struct { //RRC_INTERFACE_FUNCTIONS unsigned int Frame_index; unsigned short UE_index[NB_MODULES_MAX][NB_SIG_CNX_UE]; uint8_t eNB_id[NB_MODULES_MAX][NB_CNX_UE]; -#ifndef CELLULAR // L2_ID UE_id[NB_MODULES_MAX][NB_CNX_CH]; uint8_t UE_id[NB_MODULES_MAX][NB_CNX_CH][5]; -#endif void (*openair_rrc_top_init)(void); char (*openair_rrc_eNB_init)(uint8_t ); char (*openair_rrc_UE_init)(uint8_t, uint8_t); @@ -389,7 +356,7 @@ typedef struct { TDD_Config_t *tdd_Config, uint8_t *SIwindowsize, uint16_t *SIperiod -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) , MBMS_flag_t MBMS_Flag, struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList, @@ -397,9 +364,9 @@ typedef struct { struct PMCH_InfoList_r9 *pmch_InfoList #endif ); - unsigned int (*mac_rlc_data_req)(module_id_t, unsigned int, char*); + unsigned int (*mac_rlc_data_req)(module_id_t, unsigned int, const unsigned int,char*); void (*mac_rlc_data_ind)(module_id_t, logical_chan_id_t, char*, tb_size_t, num_tb_t, crc_t* ); - mac_rlc_status_resp_t (*mac_rlc_status_ind) (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t frameP, eNB_flag_t eNB_flagP, MBMS_flag_t MBMS_flagP, + mac_rlc_status_resp_t (*mac_rlc_status_ind) (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t frameP, sub_frame_t subframeP, eNB_flag_t eNB_flagP, MBMS_flag_t MBMS_flagP, logical_chan_id_t channel_idP, tb_size_t tb_sizeP); signed int (*rrc_rlc_data_req)(module_id_t, rb_id_t, mui_t, confirm_t, sdu_size_t, char *); void (*rrc_rlc_register_rrc) (void (*rrc_data_indP)(module_id_t , rb_id_t , sdu_size_t , char* ), diff --git a/openair2/COMMON/messages_def.h b/openair2/COMMON/messages_def.h index 246aa855ec..2434d15776 100644 --- a/openair2/COMMON/messages_def.h +++ b/openair2/COMMON/messages_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // These messages files are mandatory and must always be placed in first position #include "intertask_messages_def.h" diff --git a/openair2/COMMON/messages_types.h b/openair2/COMMON/messages_types.h index b1ff6c3b18..5e5fdadd2a 100644 --- a/openair2/COMMON/messages_types.h +++ b/openair2/COMMON/messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * messages_types.h diff --git a/openair2/COMMON/nas_messages_def.h b/openair2/COMMON/nas_messages_def.h index 0e70564aa9..34d6d64a1f 100644 --- a/openair2/COMMON/nas_messages_def.h +++ b/openair2/COMMON/nas_messages_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * nas_messages_def.h diff --git a/openair2/COMMON/nas_messages_types.h b/openair2/COMMON/nas_messages_types.h index 2251444a01..5cb1927aca 100644 --- a/openair2/COMMON/nas_messages_types.h +++ b/openair2/COMMON/nas_messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * nas_messages_types.h diff --git a/openair2/COMMON/networkDef.h b/openair2/COMMON/networkDef.h index 46716bee24..89f8d5fc44 100644 --- a/openair2/COMMON/networkDef.h +++ b/openair2/COMMON/networkDef.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /***************************************************************************** @@ -260,13 +252,6 @@ typedef struct { network_pkf_t* pkf[NET_PACKET_FILTER_MAX]; } network_tft_t; -/* - * User notification callback, executed whenever a change of status with - * respect of PDN connection or EPS bearer context is notified by the EPS - * Session Management sublayer - */ -typedef int (*esm_indication_callback_t) (int, network_pdn_state_t); - /****************************************************************************/ /******************** G L O B A L V A R I A B L E S ********************/ /****************************************************************************/ diff --git a/openair2/COMMON/openair_defs.h b/openair2/COMMON/openair_defs.h old mode 100755 new mode 100644 index c2dd4d0616..4d8d50606c --- a/openair2/COMMON/openair_defs.h +++ b/openair2/COMMON/openair_defs.h @@ -1,41 +1,27 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __openair_DEFS_H__ #define __openair_DEFS_H__ -#ifndef USER_MODE -#include -#endif //USER_MODE - - -#ifdef USER_MODE #include #include #if !defined (msg) @@ -57,44 +43,7 @@ #define PAGE_MASK 0xfffff000 #define virt_to_phys(x) (x) -#else // USER_MODE -#include -#define msg rt_printk - -#ifdef BIGPHYSAREA - -#define bigmalloc(x) (bigphys_malloc(x)) -#define bigmalloc16(x) (bigphys_malloc(x)) - -#define malloc16(x) (bigphys_malloc(x)) -#define free16(y,x) - -#define bigfree(y,x) - -#else // BIGPHYSAREA - -#define bigmalloc(x) (dma_alloc_coherent(pdev[0],(x),&dummy_dma_ptr,0)) -#define bigmalloc16(x) (dma_alloc_coherent(pdev[0],(x),&dummy_dma_ptr,0)) -#define bigfree(y,x) (dma_free_coherent(pdev[0],(x),(void *)(y),dummy_dma_ptr)) -#define malloc16(x) (kmalloc(x,GFP_KERNEL)) -#define free16(y,x) (kfree(y)) - -#endif // BIGPHYSAREA - - -#ifdef CBMIMO1 -#define openair_get_mbox() (*(unsigned int *)mbox) -#else //CBMIMO1 -#define openair_get_mbox() (*(unsigned int *)PHY_vars->mbox>>1) -#endif //CBMIMO1 - - -#endif // USERMODE - -// #define bzero(s,n) (memset((s),0,(n))) - #define cmax(a,b) ((a>b) ? (a) : (b)) #define cmin(a,b) ((a. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -#ifndef __openair_TYPES_H__ -#define __openair_TYPES_H__ - -//#ifdef USER_MODE -//#include -//typedef int8_t s8; /* 8 bit signed integer */ -//typedef int16_t s16; /* 16 bit signed integer */ -//typedef int32_t s32; /* 32 bit signed integer */ -//typedef int64_t s64; /* 64 bit signed integer */ - -//typedef uint8_t u8; /* 8 bit unsigned integer */ -//typedef uint16_t u16; /* 16 bit unsigned integer */ -//typedef uint32_t u32; /* 32 bit unsigned integer */ -//typedef uint64_t u64; /* 64 bit unsigned integer */ -//#else -//#include -//#endif -#endif /*__openair_TYPES_H__ */ diff --git a/openair2/COMMON/pdcp_messages_def.h b/openair2/COMMON/pdcp_messages_def.h index 28cda8bc1b..c4be4b2957 100644 --- a/openair2/COMMON/pdcp_messages_def.h +++ b/openair2/COMMON/pdcp_messages_def.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /* * pdcp_messages_def.h * @@ -37,3 +30,4 @@ // Messages between RRC and PDCP layers MESSAGE_DEF(RRC_DCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcDcchDataReq, rrc_dcch_data_req) MESSAGE_DEF(RRC_DCCH_DATA_IND, MESSAGE_PRIORITY_MED_PLUS, RrcDcchDataInd, rrc_dcch_data_ind) +MESSAGE_DEF(RRC_PCCH_DATA_REQ, MESSAGE_PRIORITY_MED_PLUS, RrcPcchDataReq, rrc_pcch_data_req) diff --git a/openair2/COMMON/pdcp_messages_types.h b/openair2/COMMON/pdcp_messages_types.h index fc239f529f..c90490b0fd 100644 --- a/openair2/COMMON/pdcp_messages_types.h +++ b/openair2/COMMON/pdcp_messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * pdcp_messages_types.h @@ -41,6 +33,7 @@ // Defines to access message fields. #define RRC_DCCH_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_dcch_data_req #define RRC_DCCH_DATA_IND(mSGpTR) (mSGpTR)->ittiMsg.rrc_dcch_data_ind +#define RRC_PCCH_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_pcch_data_req //-------------------------------------------------------------------------------------------// // Messages between RRC and PDCP layers @@ -68,4 +61,13 @@ typedef struct RrcDcchDataInd_s { uint8_t eNB_index; // LG: needed in UE } RrcDcchDataInd; +typedef struct RrcPcchDataReq_s { + uint32_t sdu_size; + uint8_t *sdu_p; + uint8_t mode; + uint16_t rnti; + uint8_t ue_index; + uint8_t CC_id; +} RrcPcchDataReq; + #endif /* PDCP_MESSAGES_TYPES_H_ */ diff --git a/openair2/COMMON/phy_messages_def.h b/openair2/COMMON/phy_messages_def.h index bc63c28ac3..a2f16e64c8 100644 --- a/openair2/COMMON/phy_messages_def.h +++ b/openair2/COMMON/phy_messages_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * mphy_messages_def.h diff --git a/openair2/COMMON/phy_messages_types.h b/openair2/COMMON/phy_messages_types.h index b8ef212f31..c425efa89c 100644 --- a/openair2/COMMON/phy_messages_types.h +++ b/openair2/COMMON/phy_messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * phy_messages_types.h diff --git a/openair2/COMMON/platform_constants.h b/openair2/COMMON/platform_constants.h old mode 100755 new mode 100644 index ed052fc608..f4004bdbf9 --- a/openair2/COMMON/platform_constants.h +++ b/openair2/COMMON/platform_constants.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* platform_constants.h @@ -51,7 +43,6 @@ #define NL_MAX_PAYLOAD 9000 /* this should cover the max mtu size*/ #endif -#ifdef USER_MODE #ifdef LARGE_SCALE # define NB_MODULES_MAX 128 # define NB_NODE_MAX 128 @@ -59,11 +50,6 @@ # define NB_MODULES_MAX 32 # define NB_NODE_MAX 32 #endif -#else -# define NB_MODULES_MAX 1 -# define NB_NODE_MAX 1 -#endif //PHY_EMUL - #ifdef JUMBO_FRAME # define MAX_IP_PACKET_SIZE 10000 // 9000 @@ -94,7 +80,7 @@ #define DEFAULT_RAB_ID 1 #define NB_RB_MAX (maxDRB + 3) /* was 11, now 14, maxDRB comes from asn1_constants.h, + 3 because of 3 SRB, one invisible id 0, then id 1 and 2 */ -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) #define NB_RB_MBMS_MAX (maxSessionPerPMCH*maxServiceCount) #else // Do not allocate unused memory @@ -140,9 +126,7 @@ #define UNUSED_PARAM_MBMS_SESSION_ID 0 #define UNUSED_PARAM_MBMS_SERVICE_ID 0 -#ifdef USER_MODE #define printk printf -#endif #define UNUSED_VARIABLE(vARIABLE) (void)(vARIABLE) diff --git a/openair2/COMMON/platform_types.h b/openair2/COMMON/platform_types.h old mode 100755 new mode 100644 index 6f7722316f..1ce10c56bc --- a/openair2/COMMON/platform_types.h +++ b/openair2/COMMON/platform_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* platform_types.h @@ -38,7 +30,7 @@ #ifndef __PLATFORM_TYPES_H__ # define __PLATFORM_TYPES_H__ -#ifdef USER_MODE +#if !defined(NAS_NETLINK) #include #endif @@ -48,6 +40,13 @@ //----------------------------------------------------------------------------- // GENERIC TYPES //----------------------------------------------------------------------------- + +/* boolean_t is also defined in openair2/COMMON/commonDef.h, + * let's protect potential redefinition + */ +#ifndef _BOOLEAN_T_DEFINED_ +#define _BOOLEAN_T_DEFINED_ + typedef signed char boolean_t; #if !defined(TRUE) @@ -60,6 +59,8 @@ typedef signed char boolean_t; #define BOOL_NOT(b) (b^TRUE) +#endif /* _BOOLEAN_T_DEFINED_ */ + //----------------------------------------------------------------------------- // GENERIC ACCESS STRATUM TYPES //----------------------------------------------------------------------------- @@ -215,6 +216,7 @@ typedef struct protocol_ctxt_s { frame_t frame; /*!< \brief LTE frame number.*/ sub_frame_t subframe; /*!< \brief LTE sub frame number.*/ eNB_index_t eNB_index; /*!< \brief valid for UE indicating the index of connected eNB(s) */ + boolean_t configured; /*!< \brief flag indicating whether the instance is configured or not */ } protocol_ctxt_t; // warning time hardcoded #define PROTOCOL_CTXT_TIME_MILLI_SECONDS(CtXt_h) ((CtXt_h)->frame*10+(CtXt_h)->subframe) @@ -262,36 +264,12 @@ typedef struct protocol_ctxt_s { (Ctxt_Pp)->subframe = sUBfRAME; \ PROTOCOL_CTXT_COMPUTE_MODULE_ID(Ctxt_Pp) -#define PROTOCOL_CTXT_FMT "[FRAME %05u][%s][MOD %02u][RNTI %"PRIx16"]" +#define PROTOCOL_CTXT_FMT "[FRAME %05u][%s][MOD %02u][RNTI %" PRIx16 "]" #define PROTOCOL_CTXT_ARGS(CTXT_Pp) \ (CTXT_Pp)->frame, \ ((CTXT_Pp)->enb_flag == ENB_FLAG_YES) ? "eNB":" UE", \ (CTXT_Pp)->module_id, \ (CTXT_Pp)->rnti -#ifdef OAI_EMU -#define CHECK_CTXT_ARGS(CTXT_Pp) \ - if ((CTXT_Pp)->enb_flag) {\ - AssertFatal (((CTXT_Pp)->module_id >= oai_emulation.info.first_enb_local) && (oai_emulation.info.nb_enb_local > 0),\ - "eNB module id is too low (%u/%d/%d)!\n",\ - (CTXT_Pp)->module_id,\ - oai_emulation.info.first_enb_local,\ - oai_emulation.info.nb_enb_local);\ - AssertFatal (((CTXT_Pp)->module_id < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local)) && (oai_emulation.info.nb_enb_local > 0),\ - "eNB module id is too high (%u/%d)!\n",\ - (CTXT_Pp)->module_id,\ - oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local);\ - } else {\ - AssertFatal ((CTXT_Pp)->module_id < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local),\ - "UE module id is too high (%u/%d)!\n",\ - (CTXT_Pp)->module_id,\ - oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local);\ - AssertFatal ((CTXT_Pp)->module_id >= oai_emulation.info.first_ue_local,\ - "UE module id is too low (%u/%d)!\n",\ - (CTXT_Pp)->module_id,\ - oai_emulation.info.first_ue_local);\ - } -#else #define CHECK_CTXT_ARGS(CTXT_Pp) #endif -#endif diff --git a/openair2/COMMON/ral_messages_def.h b/openair2/COMMON/ral_messages_def.h old mode 100755 new mode 100644 index 59719663fe..7dd41b5db3 --- a/openair2/COMMON/ral_messages_def.h +++ b/openair2/COMMON/ral_messages_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ MESSAGE_DEF(RRC_RAL_SYSTEM_CONFIGURATION_IND, MESSAGE_PRIORITY_MED, rrc_ral_system_configuration_ind_t, rrc_ral_system_configuration_ind) MESSAGE_DEF(RRC_RAL_SYSTEM_INFORMATION_IND, MESSAGE_PRIORITY_MED, rrc_ral_system_information_ind_t, rrc_ral_system_information_ind) diff --git a/openair2/COMMON/ral_messages_types.h b/openair2/COMMON/ral_messages_types.h old mode 100755 new mode 100644 index 234304004d..22e3b5143f --- a/openair2/COMMON/ral_messages_types.h +++ b/openair2/COMMON/ral_messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef RAL_MESSAGES_TYPES_H_ #define RAL_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/rlc_messages_def.h b/openair2/COMMON/rlc_messages_def.h old mode 100755 new mode 100644 index 990648eff6..af78f2d098 --- a/openair2/COMMON/rlc_messages_def.h +++ b/openair2/COMMON/rlc_messages_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * rlc_messages_def.h diff --git a/openair2/COMMON/rlc_messages_types.h b/openair2/COMMON/rlc_messages_types.h old mode 100755 new mode 100644 index 1399dadade..fe4614f3bc --- a/openair2/COMMON/rlc_messages_types.h +++ b/openair2/COMMON/rlc_messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * rlc_messages_types.h diff --git a/openair2/COMMON/rrc_messages_def.h b/openair2/COMMON/rrc_messages_def.h index 27d3a6bdd4..be3d18c996 100644 --- a/openair2/COMMON/rrc_messages_def.h +++ b/openair2/COMMON/rrc_messages_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * rrc_messages_def.h @@ -64,6 +56,7 @@ MESSAGE_DEF(RRC_STATE_IND, MESSAGE_PRIORITY_MED, RrcStateInd, MESSAGE_DEF(RRC_CONFIGURATION_REQ, MESSAGE_PRIORITY_MED, RrcConfigurationReq, rrc_configuration_req) // UE: NAS -> RRC messages +MESSAGE_DEF(NAS_KENB_REFRESH_REQ, MESSAGE_PRIORITY_MED, NasKenbRefreshReq, nas_kenb_refresh_req) MESSAGE_DEF(NAS_CELL_SELECTION_REQ, MESSAGE_PRIORITY_MED, NasCellSelectionReq, nas_cell_selection_req) MESSAGE_DEF(NAS_CONN_ESTABLI_REQ, MESSAGE_PRIORITY_MED, NasConnEstabliReq, nas_conn_establi_req) MESSAGE_DEF(NAS_UPLINK_DATA_REQ, MESSAGE_PRIORITY_MED, NasUlDataReq, nas_ul_data_req) diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h index 816b936895..6fd0a04113 100644 --- a/openair2/COMMON/rrc_messages_types.h +++ b/openair2/COMMON/rrc_messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * rrc_messages_types.h @@ -70,6 +62,7 @@ typedef UL_DCCH_Message_t RrcUlDcchMessage; #define RRC_CONFIGURATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.rrc_configuration_req +#define NAS_KENB_REFRESH_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_kenb_refresh_req #define NAS_CELL_SELECTION_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_cell_selection_req #define NAS_CONN_ESTABLI_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_conn_establi_req #define NAS_UPLINK_DATA_REQ(mSGpTR) (mSGpTR)->ittiMsg.nas_ul_data_req @@ -100,27 +93,20 @@ typedef struct RrcConfigurationReq_s { uint16_t mnc; uint8_t mnc_digit_length; - /* - paging_drx_t default_drx; - - lte_frame_type_t frame_type; - uint8_t tdd_config; - uint8_t tdd_config_s; - int16_t eutra_band; - */ + + paging_drx_t default_drx; int16_t nb_cc; lte_frame_type_t frame_type[MAX_NUM_CCs]; uint8_t tdd_config[MAX_NUM_CCs]; uint8_t tdd_config_s[MAX_NUM_CCs]; lte_prefix_type_t prefix_type[MAX_NUM_CCs]; + uint8_t pbch_repetition[MAX_NUM_CCs]; int16_t eutra_band[MAX_NUM_CCs]; uint32_t downlink_frequency[MAX_NUM_CCs]; int32_t uplink_frequency_offset[MAX_NUM_CCs]; - int16_t Nid_cell[MAX_NUM_CCs];// for testing, change later int16_t N_RB_DL[MAX_NUM_CCs];// for testing, change later - int nb_antennas_tx[MAX_NUM_CCs]; - int nb_antennas_rx[MAX_NUM_CCs]; + int nb_antenna_ports[MAX_NUM_CCs]; long prach_root[MAX_NUM_CCs]; long prach_config_index[MAX_NUM_CCs]; BOOLEAN_t prach_high_speed[MAX_NUM_CCs]; @@ -129,7 +115,7 @@ typedef struct RrcConfigurationReq_s { long pucch_delta_shift[MAX_NUM_CCs]; long pucch_nRB_CQI[MAX_NUM_CCs]; long pucch_nCS_AN[MAX_NUM_CCs]; -#ifndef Rel10 +#if !defined(Rel10) && !defined(Rel14) long pucch_n1_AN[MAX_NUM_CCs]; #endif long pdsch_referenceSignalPower[MAX_NUM_CCs]; @@ -179,10 +165,11 @@ typedef struct RrcConfigurationReq_s { long ue_TimersAndConstants_t311[MAX_NUM_CCs]; long ue_TimersAndConstants_n310[MAX_NUM_CCs]; long ue_TimersAndConstants_n311[MAX_NUM_CCs]; - + long ue_TransmissionMode[MAX_NUM_CCs]; } RrcConfigurationReq; // UE: NAS -> RRC messages +typedef kenb_refresh_req_t NasKenbRefreshReq; typedef cell_info_req_t NasCellSelectionReq; typedef nas_establish_req_t NasConnEstabliReq; typedef ul_info_transfer_req_t NasUlDataReq; diff --git a/openair2/COMMON/rrm_config_structs.h b/openair2/COMMON/rrm_config_structs.h old mode 100755 new mode 100644 index 55443f497e..9d060d102d --- a/openair2/COMMON/rrm_config_structs.h +++ b/openair2/COMMON/rrm_config_structs.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* rrm_config_structs.h diff --git a/openair2/COMMON/rrm_constants.h b/openair2/COMMON/rrm_constants.h old mode 100755 new mode 100644 index e12608feb2..5da8f773c3 --- a/openair2/COMMON/rrm_constants.h +++ b/openair2/COMMON/rrm_constants.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* rrm_constants.h diff --git a/openair2/COMMON/rtos_header.h b/openair2/COMMON/rtos_header.h old mode 100755 new mode 100644 index ea2783ee6f..05fc33463d --- a/openair2/COMMON/rtos_header.h +++ b/openair2/COMMON/rtos_header.h @@ -1,72 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef _RTOS_HEADER_H_ -# define _RTOS_HEADER_H_ -# if defined(RTAI) && !defined(USER_MODE) -// CONVERSION BETWEEN POSIX PTHREAD AND RTAI FUNCTIONS -/* -# define pthread_mutex_init pthread_mutex_init_rt -# define pthread_mutexattr_init pthread_mutexattr_init_rt -# define pthread_mutex_lock pthread_mutex_lock_rt -# define pthread_mutex_unlock pthread_mutex_unlock_rt -# define pthread_mutex_destroy pthread_mutex_destroy_rt -# define pthread_cond_init pthread_cond_init_rt -# define pthread_cond_wait pthread_cond_wait_rt -# define pthread_cond_signal pthread_cond_signal_rt -# define pthread_cond_destroy pthread_cond_destroy_rt -# define pthread_attr_init pthread_attr_init_rt -# define pthread_attr_setschedparam pthread_attr_setschedparam_rt -# define pthread_create pthread_create_rt -# define pthread_cancel pthread_cancel_rt -# define pthread_delete_np pthread_cancel_rt -# define pthread_attr_setstacksize pthread_attr_setstacksize_rt -# define pthread_self rt_whoami -*/ -# include -# include -# include -# include -# include -# ifdef CONFIG_PROC_FS -# include -# endif -# else -# ifdef USER_MODE -# include -# include -# include -# include -# include -# include -# define rtf_get read -# define rtf_put write -# endif -# endif +#define _RTOS_HEADER_H_ +#include +#include +#include +#include +#include +#include +#define rtf_get read +#define rtf_put write #endif diff --git a/openair2/COMMON/s1ap_messages_def.h b/openair2/COMMON/s1ap_messages_def.h index ce51ac78ca..a39953d8f7 100644 --- a/openair2/COMMON/s1ap_messages_def.h +++ b/openair2/COMMON/s1ap_messages_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* Messages for S1AP logging */ MESSAGE_DEF(S1AP_UPLINK_NAS_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_uplink_nas_log) @@ -39,6 +31,13 @@ MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_REQ_LOG, MESSAGE_PRIORITY_MED, IttiMsgText MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_COMMAND_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_ue_context_release_command_log) MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_COMPLETE_LOG, MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_ue_context_release_complete_log) MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_ue_context_release_log) +MESSAGE_DEF(S1AP_E_RAB_SETUP_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_setup_request_log) +MESSAGE_DEF(S1AP_E_RAB_SETUP_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_setup_response_log) +MESSAGE_DEF(S1AP_E_RAB_MODIFY_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_modify_request_log) +MESSAGE_DEF(S1AP_E_RAB_MODIFY_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_modify_response_log) +MESSAGE_DEF(S1AP_PAGING_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_paging_log) +MESSAGE_DEF(S1AP_E_RAB_RELEASE_REQUEST_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_release_request_log) +MESSAGE_DEF(S1AP_E_RAB_RELEASE_RESPONSE_LOG , MESSAGE_PRIORITY_MED, IttiMsgText , s1ap_e_rab_release_response_log) /* eNB application layer -> S1AP messages */ MESSAGE_DEF(S1AP_REGISTER_ENB_REQ , MESSAGE_PRIORITY_MED, s1ap_register_enb_req_t , s1ap_register_enb_req) @@ -58,12 +57,19 @@ MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_RESP , MESSAGE_PRIORITY_MED, s1ap_ue_relea MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_COMPLETE, MESSAGE_PRIORITY_MED, s1ap_ue_release_complete_t , s1ap_ue_release_complete) MESSAGE_DEF(S1AP_UE_CTXT_MODIFICATION_RESP , MESSAGE_PRIORITY_MED, s1ap_ue_ctxt_modification_resp_t , s1ap_ue_ctxt_modification_resp) MESSAGE_DEF(S1AP_UE_CTXT_MODIFICATION_FAIL , MESSAGE_PRIORITY_MED, s1ap_ue_ctxt_modification_fail_t , s1ap_ue_ctxt_modification_fail) +MESSAGE_DEF(S1AP_E_RAB_SETUP_RESP , MESSAGE_PRIORITY_MED, s1ap_e_rab_setup_resp_t , s1ap_e_rab_setup_resp) +MESSAGE_DEF(S1AP_E_RAB_SETUP_REQUEST_FAIL , MESSAGE_PRIORITY_MED, s1ap_e_rab_setup_req_fail_t , s1ap_e_rab_setup_request_fail) +MESSAGE_DEF(S1AP_E_RAB_MODIFY_RESP , MESSAGE_PRIORITY_MED, s1ap_e_rab_modify_resp_t , s1ap_e_rab_modify_resp) +MESSAGE_DEF(S1AP_E_RAB_RELEASE_RESPONSE , MESSAGE_PRIORITY_MED, s1ap_e_rab_release_resp_t , s1ap_e_rab_release_resp) /* S1AP -> RRC messages */ MESSAGE_DEF(S1AP_DOWNLINK_NAS , MESSAGE_PRIORITY_MED, s1ap_downlink_nas_t , s1ap_downlink_nas ) MESSAGE_DEF(S1AP_INITIAL_CONTEXT_SETUP_REQ , MESSAGE_PRIORITY_MED, s1ap_initial_context_setup_req_t , s1ap_initial_context_setup_req ) MESSAGE_DEF(S1AP_UE_CTXT_MODIFICATION_REQ , MESSAGE_PRIORITY_MED, s1ap_ue_ctxt_modification_req_t , s1ap_ue_ctxt_modification_req) MESSAGE_DEF(S1AP_PAGING_IND , MESSAGE_PRIORITY_MED, s1ap_paging_ind_t , s1ap_paging_ind ) +MESSAGE_DEF(S1AP_E_RAB_SETUP_REQ , MESSAGE_PRIORITY_MED, s1ap_e_rab_setup_req_t , s1ap_e_rab_setup_req ) +MESSAGE_DEF(S1AP_E_RAB_MODIFY_REQ , MESSAGE_PRIORITY_MED, s1ap_e_rab_modify_req_t , s1ap_e_rab_modify_req ) +MESSAGE_DEF(S1AP_E_RAB_RELEASE_COMMAND , MESSAGE_PRIORITY_MED, s1ap_e_rab_release_command_t , s1ap_e_rab_release_command) MESSAGE_DEF(S1AP_UE_CONTEXT_RELEASE_COMMAND, MESSAGE_PRIORITY_MED, s1ap_ue_release_command_t , s1ap_ue_release_command) /* S1AP <-> RRC messages (can be initiated either by MME or eNB) */ diff --git a/openair2/COMMON/s1ap_messages_types.h b/openair2/COMMON/s1ap_messages_types.h index f2c6a2a3a2..4a5f492b0b 100644 --- a/openair2/COMMON/s1ap_messages_types.h +++ b/openair2/COMMON/s1ap_messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef S1AP_MESSAGES_TYPES_H_ #define S1AP_MESSAGES_TYPES_H_ @@ -47,15 +39,22 @@ #define S1AP_NAS_NON_DELIVERY_IND(mSGpTR) (mSGpTR)->ittiMsg.s1ap_nas_non_delivery_ind #define S1AP_UE_CTXT_MODIFICATION_RESP(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_ctxt_modification_resp #define S1AP_UE_CTXT_MODIFICATION_FAIL(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_ctxt_modification_fail +#define S1AP_E_RAB_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_setup_resp +#define S1AP_E_RAB_SETUP_FAIL(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_setup_req_fail +#define S1AP_E_RAB_MODIFY_RESP(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_modify_resp #define S1AP_DOWNLINK_NAS(mSGpTR) (mSGpTR)->ittiMsg.s1ap_downlink_nas #define S1AP_INITIAL_CONTEXT_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_initial_context_setup_req #define S1AP_UE_CTXT_MODIFICATION_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_ctxt_modification_req #define S1AP_UE_CONTEXT_RELEASE_COMMAND(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_release_command #define S1AP_UE_CONTEXT_RELEASE_COMPLETE(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_release_complete -#define S1AP_PAGIND_IND(mSGpTR) (mSGpTR)->ittiMsg.s1ap_paging_ind +#define S1AP_E_RAB_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_setup_req +#define S1AP_E_RAB_MODIFY_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_modify_req +#define S1AP_PAGING_IND(mSGpTR) (mSGpTR)->ittiMsg.s1ap_paging_ind #define S1AP_UE_CONTEXT_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.s1ap_ue_release_req +#define S1AP_E_RAB_RELEASE_COMMAND(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_release_command +#define S1AP_E_RAB_RELEASE_RESPONSE(mSGpTR) (mSGpTR)->ittiMsg.s1ap_e_rab_release_resp //-------------------------------------------------------------------------------------------// /* Maximum number of e-rabs to be setup/deleted in a single message. @@ -76,7 +75,7 @@ * the key length is 32 bytes (256 bits) */ #define SECURITY_KEY_LENGTH 32 - +#ifndef OCP_FRAMEWORK typedef enum cell_type_e { CELL_MACRO_ENB, CELL_HOME_ENB @@ -107,6 +106,7 @@ typedef enum cn_domain_s { CN_DOMAIN_PS = 1, CN_DOMAIN_CS = 2 } cn_domain_t; +#endif typedef struct net_ip_address_s { unsigned ipv4:1; @@ -122,6 +122,7 @@ typedef struct ambr_s { bitrate_t br_dl; } ambr_t; +#ifndef OCP_FRAMEWORK typedef enum priority_level_s { PRIORITY_LEVEL_SPARE = 0, PRIORITY_LEVEL_HIGHEST = 1, @@ -140,6 +141,7 @@ typedef enum pre_emp_vulnerability_e { PRE_EMPTION_VULNERABILITY_DISABLED = 1, PRE_EMPTION_VULNERABILITY_MAX, } pre_emp_vulnerability_t; +#endif typedef struct allocation_retention_priority_s { priority_level_t priority_level; @@ -177,6 +179,11 @@ typedef struct s1ap_gummei_s { uint16_t mme_group_id; } s1ap_gummei_t; +typedef struct s1ap_imsi_s { + uint8_t buffer[S1AP_IMSI_LENGTH]; + uint8_t length; +} s1ap_imsi_t; + typedef struct s_tmsi_s { uint8_t mme_code; uint32_t m_tmsi; @@ -191,7 +198,7 @@ typedef enum ue_paging_identity_presenceMask_e { typedef struct ue_paging_identity_s { ue_paging_identity_presenceMask_t presenceMask; union { - char imsi[S1AP_IMSI_LENGTH]; + s1ap_imsi_t imsi; s_tmsi_t s_tmsi; } choice; } ue_paging_identity_t; @@ -262,11 +269,29 @@ typedef struct e_rab_setup_s { uint32_t gtp_teid; } e_rab_setup_t; +typedef struct e_rab_modify_s { + /* Unique e_rab_id for the UE. */ + uint8_t e_rab_id; +} e_rab_modify_t; + +typedef enum S1ap_Cause_e { + S1AP_CAUSE_NOTHING, /* No components present */ + S1AP_CAUSE_RADIO_NETWORK, + S1AP_CAUSE_TRANSPORT, + S1AP_CAUSE_NAS, + S1AP_CAUSE_PROTOCOL, + S1AP_CAUSE_MISC, + /* Extensions may appear below */ + +} s1ap_Cause_t; + typedef struct e_rab_failed_s { /* Unique e_rab_id for the UE. */ uint8_t e_rab_id; /* Cause of the failure */ // cause_t cause; + s1ap_Cause_t cause; + uint8_t cause_value; } e_rab_failed_t; typedef enum s1ap_ue_ctxt_modification_present_s { @@ -390,7 +415,7 @@ typedef struct s1ap_initial_context_setup_fail_s { unsigned eNB_ue_s1ap_id:24; /* TODO add cause */ -} s1ap_initial_context_setup_fail_t, s1ap_ue_ctxt_modification_fail_t; +} s1ap_initial_context_setup_fail_t, s1ap_ue_ctxt_modification_fail_t, s1ap_e_rab_setup_req_fail_t; typedef struct s1ap_nas_non_delivery_ind_s { unsigned eNB_ue_s1ap_id:24; @@ -439,6 +464,7 @@ typedef struct s1ap_downlink_nas_s { nas_pdu_t nas_pdu; } s1ap_downlink_nas_t; + typedef struct s1ap_initial_context_setup_req_s { /* UE id for initial connection to S1AP */ uint16_t ue_initial_id; @@ -461,6 +487,12 @@ typedef struct s1ap_initial_context_setup_req_s { e_rab_t e_rab_param[S1AP_MAX_E_RAB]; } s1ap_initial_context_setup_req_t; +typedef struct tai_plmn_identity_s { + uint16_t mcc; + uint16_t mnc; + uint8_t mnc_digit_length; +} plmn_identity_t; + typedef struct s1ap_paging_ind_s { /* UE identity index value. * Specified in 3GPP TS 36.304 @@ -473,12 +505,54 @@ typedef struct s1ap_paging_ind_s { /* Indicates origin of paging */ cn_domain_t cn_domain; + /* PLMN_identity in TAI of Paging*/ + plmn_identity_t plmn_identity[256]; + + /* TAC in TAIList of Paging*/ + int16_t tac[256]; + + /* size of TAIList*/ + int16_t tai_size; + /* Optional fields */ paging_drx_t paging_drx; paging_priority_t paging_priority; } s1ap_paging_ind_t; +typedef struct s1ap_e_rab_setup_req_s { + /* UE id for initial connection to S1AP */ + uint16_t ue_initial_id; + + /* MME UE id */ + uint16_t mme_ue_s1ap_id; + + /* eNB ue s1ap id as initialized by S1AP layer */ + unsigned eNB_ue_s1ap_id:24; + + /* Number of e_rab to be setup in the list */ + uint8_t nb_e_rabs_tosetup; + + /* E RAB setup request */ + e_rab_t e_rab_setup_params[S1AP_MAX_E_RAB]; + +} s1ap_e_rab_setup_req_t; + +typedef struct s1ap_e_rab_setup_resp_s { + unsigned eNB_ue_s1ap_id:24; + + /* Number of e_rab setup-ed in the list */ + uint8_t nb_of_e_rabs; + /* list of e_rab setup-ed by RRC layers */ + e_rab_setup_t e_rabs[S1AP_MAX_E_RAB]; + + /* Number of e_rab failed to be setup in list */ + uint8_t nb_of_e_rabs_failed; + /* list of e_rabs that failed to be setup */ + e_rab_failed_t e_rabs_failed[S1AP_MAX_E_RAB]; +} s1ap_e_rab_setup_resp_t; + + // S1AP --> RRC messages typedef struct s1ap_ue_release_command_s { @@ -488,16 +562,6 @@ typedef struct s1ap_ue_release_command_s { //-------------------------------------------------------------------------------------------// -typedef enum S1ap_Cause_e { - S1AP_CAUSE_NOTHING, /* No components present */ - S1AP_CAUSE_RADIO_NETWORK, - S1AP_CAUSE_TRANSPORT, - S1AP_CAUSE_NAS, - S1AP_CAUSE_PROTOCOL, - S1AP_CAUSE_MISC, - /* Extensions may appear below */ - -} s1ap_Cause_t; // S1AP <-- RRC messages typedef struct s1ap_ue_release_req_s { unsigned eNB_ue_s1ap_id:24; @@ -505,4 +569,78 @@ typedef struct s1ap_ue_release_req_s { long cause_value; } s1ap_ue_release_req_t, s1ap_ue_release_resp_t; +typedef struct s1ap_e_rab_modify_req_s { + /* UE id for initial connection to S1AP */ + uint16_t ue_initial_id; + + /* MME UE id */ + uint16_t mme_ue_s1ap_id; + + /* eNB ue s1ap id as initialized by S1AP layer */ + unsigned eNB_ue_s1ap_id:24; + + /* Number of e_rab to be modify in the list */ + uint8_t nb_e_rabs_tomodify; + + /* E RAB modify request */ + e_rab_t e_rab_modify_params[S1AP_MAX_E_RAB]; +} s1ap_e_rab_modify_req_t; + +typedef struct s1ap_e_rab_modify_resp_s { + unsigned eNB_ue_s1ap_id:24; + + /* Number of e_rab modify-ed in the list */ + uint8_t nb_of_e_rabs; + /* list of e_rab modify-ed by RRC layers */ + e_rab_modify_t e_rabs[S1AP_MAX_E_RAB]; + + /* Number of e_rab failed to be modify in list */ + uint8_t nb_of_e_rabs_failed; + /* list of e_rabs that failed to be modify */ + e_rab_failed_t e_rabs_failed[S1AP_MAX_E_RAB]; +} s1ap_e_rab_modify_resp_t; + +typedef struct e_rab_release_s { + /* Unique e_rab_id for the UE. */ + uint8_t e_rab_id; +} e_rab_release_t; + +typedef struct s1ap_e_rab_release_command_s { + /* MME UE id */ + uint16_t mme_ue_s1ap_id; + + /* eNB ue s1ap id as initialized by S1AP layer */ + unsigned eNB_ue_s1ap_id:24; + + /* The NAS PDU should be forwarded by the RRC layer to the NAS layer */ + nas_pdu_t nas_pdu; + + /* Number of e_rab to be released in the list */ + uint8_t nb_e_rabs_torelease; + + /* E RAB release command */ + e_rab_release_t e_rab_release_params[S1AP_MAX_E_RAB]; + +} s1ap_e_rab_release_command_t; + +typedef struct s1ap_e_rab_release_resp_s { + /* MME UE id */ + uint16_t mme_ue_s1ap_id; + + /* eNB ue s1ap id as initialized by S1AP layer */ + unsigned eNB_ue_s1ap_id:24; + + /* Number of e_rab released in the list */ + uint8_t nb_of_e_rabs_released; + + /* list of e_rabs released */ + e_rab_release_t e_rab_release[S1AP_MAX_E_RAB]; + + /* Number of e_rab failed to be released in list */ + uint8_t nb_of_e_rabs_failed; + /* list of e_rabs that failed to be released */ + e_rab_failed_t e_rabs_failed[S1AP_MAX_E_RAB]; + +} s1ap_e_rab_release_resp_t; + #endif /* S1AP_MESSAGES_TYPES_H_ */ diff --git a/openair2/COMMON/sctp_messages_def.h b/openair2/COMMON/sctp_messages_def.h index 8053f47ec9..d4248b7bc3 100644 --- a/openair2/COMMON/sctp_messages_def.h +++ b/openair2/COMMON/sctp_messages_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ MESSAGE_DEF(SCTP_NEW_ASSOCIATION_REQ , MESSAGE_PRIORITY_MED, sctp_new_association_req_t , sctp_new_association_req) MESSAGE_DEF(SCTP_NEW_ASSOCIATION_RESP, MESSAGE_PRIORITY_MED, sctp_new_association_resp_t , sctp_new_association_resp) diff --git a/openair2/COMMON/sctp_messages_types.h b/openair2/COMMON/sctp_messages_types.h index 490e39a8c7..184e951acb 100644 --- a/openair2/COMMON/sctp_messages_types.h +++ b/openair2/COMMON/sctp_messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef SCTP_MESSAGES_TYPES_H_ #define SCTP_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/tasks_def.h b/openair2/COMMON/tasks_def.h index 50823086af..9127901092 100644 --- a/openair2/COMMON/tasks_def.h +++ b/openair2/COMMON/tasks_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // This task is mandatory and must always be placed in first position TASK_DEF(TASK_TIMER, TASK_PRIORITY_MAX, 10) @@ -63,7 +55,9 @@ TASK_DEF(TASK_X2AP, TASK_PRIORITY_MED, 200) TASK_DEF(TASK_SCTP, TASK_PRIORITY_MED, 200) /// eNB APP task TASK_DEF(TASK_ENB_APP, TASK_PRIORITY_MED, 200) - +/// eNB Agent task +TASK_DEF(TASK_FLEXRAN_AGENT, TASK_PRIORITY_MED, 200) +TASK_DEF(TASK_PROTO_AGENT, TASK_PRIORITY_MED, 200) // UE tasks and sub-tasks: //// Layer 2 and Layer 1 sub-tasks SUB_TASK_DEF(TASK_L2L1, TASK_PHY_UE, 200) @@ -80,6 +74,3 @@ TASK_DEF(TASK_RAL_UE, TASK_PRIORITY_MED, 200) //MESSAGE GENERATOR TASK TASK_DEF(TASK_MSC, TASK_PRIORITY_MED, 200) -// Task for PROTO_AGENT -TASK_DEF(TASK_PROTO_AGENT, TASK_PRIORITY_MED, 200) - diff --git a/openair2/COMMON/udp_messages_def.h b/openair2/COMMON/udp_messages_def.h old mode 100755 new mode 100644 index a6341ec880..35322f2450 --- a/openair2/COMMON/udp_messages_def.h +++ b/openair2/COMMON/udp_messages_def.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ MESSAGE_DEF(UDP_INIT, MESSAGE_PRIORITY_MED, udp_init_t, udp_init) MESSAGE_DEF(UDP_DATA_REQ, MESSAGE_PRIORITY_MED, udp_data_req_t, udp_data_req) diff --git a/openair2/COMMON/udp_messages_types.h b/openair2/COMMON/udp_messages_types.h old mode 100755 new mode 100644 index 9491fab65f..7825a924d1 --- a/openair2/COMMON/udp_messages_types.h +++ b/openair2/COMMON/udp_messages_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef UDP_MESSAGES_TYPES_H_ #define UDP_MESSAGES_TYPES_H_ diff --git a/openair2/COMMON/x2ap_messages_def.h b/openair2/COMMON/x2ap_messages_def.h index 4e5bef69d5..4690bba42e 100644 --- a/openair2/COMMON/x2ap_messages_def.h +++ b/openair2/COMMON/x2ap_messages_def.h @@ -1,29 +1,21 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h index 4e22149f3b..4690bba42e 100644 --- a/openair2/COMMON/x2ap_messages_types.h +++ b/openair2/COMMON/x2ap_messages_types.h @@ -1,28 +1,21 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ diff --git a/openair2/DOCS/TEMPLATES/CODE/COPYING b/openair2/DOCS/TEMPLATES/CODE/COPYING deleted file mode 100644 index 623b6258a1..0000000000 --- a/openair2/DOCS/TEMPLATES/CODE/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - 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) - - 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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) year 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. diff --git a/openair2/DOCS/TEMPLATES/CODE/example_doxy.h b/openair2/DOCS/TEMPLATES/CODE/example_doxy.h index 876448ac8c..c51bdbccab 100644 --- a/openair2/DOCS/TEMPLATES/CODE/example_doxy.h +++ b/openair2/DOCS/TEMPLATES/CODE/example_doxy.h @@ -1,32 +1,23 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file doxy_template.h * \brief explain how this block is organized, and how it works diff --git a/openair2/DOCS/TEMPLATES/README/Readme.doxy b/openair2/DOCS/TEMPLATES/README/Readme.doxy index 43e4e3b87a..c87289d678 100644 --- a/openair2/DOCS/TEMPLATES/README/Readme.doxy +++ b/openair2/DOCS/TEMPLATES/README/Readme.doxy @@ -1,31 +1,23 @@ -/******************************************************************************* - - OPENAIRINTERFACE 0/1/2/3 - Copyright(c) 1999 - 2010 EURECOM - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information: - Openair Admin - Mailing List - Forums http://forums.eurecom.fr/openairinterface - Eurecom, 2229, route des cretes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file Readme.doxy * \brief explain how this block is organized, and how it works @@ -33,7 +25,6 @@ * \date 2009 * \version 0.1 * \company Eurecom -* \note This conde is under GNU GENERAL PUBLIC LICENSE, version 2, June 1991 * \email: navid.nikaein@eurecom.fr * \warning */ diff --git a/openair2/DOCS/TEMPLATES/README/readme.txt b/openair2/DOCS/TEMPLATES/README/readme.txt index 12d67a31dc..f31f7cd30e 100644 --- a/openair2/DOCS/TEMPLATES/README/readme.txt +++ b/openair2/DOCS/TEMPLATES/README/readme.txt @@ -1,31 +1,24 @@ -/******************************************************************************* +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OPENAIRINTERFACE 0/1/2/3 - Copyright(c) 1999 - 2010 EURECOM - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information: - Openair Admin - Mailing List - Forums http://forums.eurecom.fr/openairinterface - Eurecom, 2229, route des cretes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ /*________________________OEPNAIR/OPENAIR0/________________________ File : Readme.txt diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c new file mode 100644 index 0000000000..fcf9fb537c --- /dev/null +++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c @@ -0,0 +1,1529 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_mac.c + * \brief FlexRAN agent message handler for MAC layer + * \author Xenofon Foukas, Mohamed Kassem and Navid Nikaein + * \date 2016 + * \version 0.1 + */ + +#include "flexran_agent_mac.h" +#include "flexran_agent_extern.h" +#include "flexran_agent_common.h" +#include "flexran_agent_mac_internal.h" +#include "flexran_agent_net_comm.h" + +#include "LAYER2/MAC/proto.h" +#include "LAYER2/MAC/flexran_agent_mac_proto.h" +#include "LAYER2/MAC/flexran_agent_scheduler_dlsch_ue_remote.h" + +#include "liblfds700.h" + +#include "log.h" + + +/*Flags showing if a mac agent has already been registered*/ +unsigned int mac_agent_registered[NUM_MAX_ENB]; + +/*Array containing the Agent-MAC interfaces*/ +AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]; + +/* Ringbuffer related structs used for maintaining the dl mac config messages */ +//message_queue_t *dl_mac_config_queue; +struct lfds700_misc_prng_state ps[NUM_MAX_ENB]; +struct lfds700_ringbuffer_element *dl_mac_config_array[NUM_MAX_ENB]; +struct lfds700_ringbuffer_state ringbuffer_state[NUM_MAX_ENB]; + + +int flexran_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg){ + + // TODO: Must deal with sanitization of input + // TODO: Must check if RNTIs and cell ids of the request actually exist + // TODO: Must resolve conflicts among stats requests + + int i; + err_code_t err_code; + xid_t xid; + uint32_t usec_interval, sec_interval; + + //TODO: We do not deal with multiple CCs at the moment and eNB id is 0 + int enb_id = mod_id; + + //eNB_MAC_INST *eNB = &eNB_mac_inst[enb_id]; + //UE_list_t *eNB_UE_list= &eNB->UE_list; + + report_config_t report_config; + + uint32_t ue_flags = 0; + uint32_t c_flags = 0; + + Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params; + + Protocol__FlexStatsRequest *stats_req = input->stats_request_msg; + xid = (stats_req->header)->xid; + + // Check the type of request that is made + switch(stats_req->body_case) { + case PROTOCOL__FLEX_STATS_REQUEST__BODY_COMPLETE_STATS_REQUEST: ; + Protocol__FlexCompleteStatsRequest *comp_req = stats_req->complete_stats_request; + if (comp_req->report_frequency == PROTOCOL__FLEX_STATS_REPORT_FREQ__FLSRF_OFF) { + /*Disable both periodic and continuous updates*/ + flexran_agent_disable_cont_mac_stats_update(mod_id); + flexran_agent_destroy_timer_by_task_id(xid); + *msg = NULL; + return 0; + } else { //One-off, periodical or continuous reporting + //Set the proper flags + ue_flags = comp_req->ue_report_flags; + c_flags = comp_req->cell_report_flags; + //Create a list of all eNB RNTIs and cells + + //Set the number of UEs and create list with their RNTIs stats configs + report_config.nr_ue = flexran_get_num_ues(mod_id); //eNB_UE_list->num_UEs + report_config.ue_report_type = (ue_report_type_t *) malloc(sizeof(ue_report_type_t) * report_config.nr_ue); + if (report_config.ue_report_type == NULL) { + // TODO: Add appropriate error code + err_code = -100; + goto error; + } + for (i = 0; i < report_config.nr_ue; i++) { + report_config.ue_report_type[i].ue_rnti = flexran_get_ue_crnti(enb_id, i); //eNB_UE_list->eNB_UE_stats[UE_PCCID(enb_id,i)][i].crnti; + report_config.ue_report_type[i].ue_report_flags = ue_flags; + } + //Set the number of CCs and create a list with the cell stats configs + report_config.nr_cc = MAX_NUM_CCs; + report_config.cc_report_type = (cc_report_type_t *) malloc(sizeof(cc_report_type_t) * report_config.nr_cc); + if (report_config.cc_report_type == NULL) { + // TODO: Add appropriate error code + err_code = -100; + goto error; + } + for (i = 0; i < report_config.nr_cc; i++) { + //TODO: Must fill in the proper cell ids + report_config.cc_report_type[i].cc_id = i; + report_config.cc_report_type[i].cc_report_flags = c_flags; + } + /* Check if request was periodical */ + if (comp_req->report_frequency == PROTOCOL__FLEX_STATS_REPORT_FREQ__FLSRF_PERIODICAL) { + /* Create a one off flexran message as an argument for the periodical task */ + Protocol__FlexranMessage *timer_msg; + stats_request_config_t request_config; + request_config.report_type = PROTOCOL__FLEX_STATS_TYPE__FLST_COMPLETE_STATS; + request_config.report_frequency = PROTOCOL__FLEX_STATS_REPORT_FREQ__FLSRF_ONCE; + request_config.period = 0; + /* Need to make sure that the ue flags are saved (Bug) */ + if (report_config.nr_ue == 0) { + report_config.nr_ue = 1; + report_config.ue_report_type = (ue_report_type_t *) malloc(sizeof(ue_report_type_t)); + if (report_config.ue_report_type == NULL) { + // TODO: Add appropriate error code + err_code = -100; + goto error; + } + report_config.ue_report_type[0].ue_rnti = 0; // Dummy value + report_config.ue_report_type[0].ue_report_flags = ue_flags; + } + request_config.config = &report_config; + flexran_agent_mac_stats_request(enb_id, xid, &request_config, &timer_msg); + /* Create a timer */ + long timer_id = 0; + flexran_agent_timer_args_t *timer_args; + timer_args = malloc(sizeof(flexran_agent_timer_args_t)); + memset (timer_args, 0, sizeof(flexran_agent_timer_args_t)); + timer_args->mod_id = enb_id; + timer_args->msg = timer_msg; + /*Convert subframes to usec time*/ + usec_interval = 1000*comp_req->sf; + sec_interval = 0; + /*add seconds if required*/ + if (usec_interval >= 1000*1000) { + sec_interval = usec_interval/(1000*1000); + usec_interval = usec_interval%(1000*1000); + } + flexran_agent_create_timer(sec_interval, usec_interval, FLEXRAN_AGENT_DEFAULT, enb_id, FLEXRAN_AGENT_TIMER_TYPE_PERIODIC, xid, flexran_agent_handle_timed_task,(void*) timer_args, &timer_id); + } else if (comp_req->report_frequency == PROTOCOL__FLEX_STATS_REPORT_FREQ__FLSRF_CONTINUOUS) { + /*If request was for continuous updates, disable the previous configuration and + set up a new one*/ + flexran_agent_disable_cont_mac_stats_update(mod_id); + stats_request_config_t request_config; + request_config.report_type = PROTOCOL__FLEX_STATS_TYPE__FLST_COMPLETE_STATS; + request_config.report_frequency = PROTOCOL__FLEX_STATS_REPORT_FREQ__FLSRF_ONCE; + request_config.period = 0; + /* Need to make sure that the ue flags are saved (Bug) */ + if (report_config.nr_ue == 0) { + report_config.nr_ue = 1; + report_config.ue_report_type = (ue_report_type_t *) malloc(sizeof(ue_report_type_t)); + if (report_config.ue_report_type == NULL) { + // TODO: Add appropriate error code + err_code = -100; + goto error; + } + report_config.ue_report_type[0].ue_rnti = 0; // Dummy value + report_config.ue_report_type[0].ue_report_flags = ue_flags; + } + request_config.config = &report_config; + flexran_agent_enable_cont_mac_stats_update(enb_id, xid, &request_config); + } + } + break; + case PROTOCOL__FLEX_STATS_REQUEST__BODY_CELL_STATS_REQUEST:; + Protocol__FlexCellStatsRequest *cell_req = stats_req->cell_stats_request; + // UE report config will be blank + report_config.nr_ue = 0; + report_config.ue_report_type = NULL; + report_config.nr_cc = cell_req->n_cell; + report_config.cc_report_type = (cc_report_type_t *) malloc(sizeof(cc_report_type_t) * report_config.nr_cc); + if (report_config.cc_report_type == NULL) { + // TODO: Add appropriate error code + err_code = -100; + goto error; + } + for (i = 0; i < report_config.nr_cc; i++) { + //TODO: Must fill in the proper cell ids + report_config.cc_report_type[i].cc_id = cell_req->cell[i]; + report_config.cc_report_type[i].cc_report_flags = cell_req->flags; + } + break; + case PROTOCOL__FLEX_STATS_REQUEST__BODY_UE_STATS_REQUEST:; + Protocol__FlexUeStatsRequest *ue_req = stats_req->ue_stats_request; + // Cell report config will be blank + report_config.nr_cc = 0; + report_config.cc_report_type = NULL; + report_config.nr_ue = ue_req->n_rnti; + report_config.ue_report_type = (ue_report_type_t *) malloc(sizeof(ue_report_type_t) * report_config.nr_ue); + if (report_config.ue_report_type == NULL) { + // TODO: Add appropriate error code + err_code = -100; + goto error; + } + for (i = 0; i < report_config.nr_ue; i++) { + report_config.ue_report_type[i].ue_rnti = ue_req->rnti[i]; + report_config.ue_report_type[i].ue_report_flags = ue_req->flags; + } + break; + default: + //TODO: Add appropriate error code + err_code = -100; + goto error; + } + + if (flexran_agent_mac_stats_reply(enb_id, xid, &report_config, msg) < 0 ){ + err_code = PROTOCOL__FLEXRAN_ERR__MSG_BUILD; + goto error; + } + + free(report_config.ue_report_type); + free(report_config.cc_report_type); + + return 0; + + error : + LOG_E(FLEXRAN_AGENT, "errno %d occured\n", err_code); + return err_code; +} + +int flexran_agent_mac_stats_request(mid_t mod_id, + xid_t xid, + const stats_request_config_t *report_config, + Protocol__FlexranMessage **msg) { + Protocol__FlexHeader *header; + int i; + + Protocol__FlexStatsRequest *stats_request_msg; + stats_request_msg = malloc(sizeof(Protocol__FlexStatsRequest)); + if(stats_request_msg == NULL) + goto error; + protocol__flex_stats_request__init(stats_request_msg); + + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_STATS_REQUEST, &header) != 0) + goto error; + + stats_request_msg->header = header; + + stats_request_msg->type = report_config->report_type; + stats_request_msg->has_type = 1; + + switch (report_config->report_type) { + case PROTOCOL__FLEX_STATS_TYPE__FLST_COMPLETE_STATS: + stats_request_msg->body_case = PROTOCOL__FLEX_STATS_REQUEST__BODY_COMPLETE_STATS_REQUEST; + Protocol__FlexCompleteStatsRequest *complete_stats; + complete_stats = malloc(sizeof(Protocol__FlexCompleteStatsRequest)); + if(complete_stats == NULL) + goto error; + protocol__flex_complete_stats_request__init(complete_stats); + complete_stats->report_frequency = report_config->report_frequency; + complete_stats->has_report_frequency = 1; + complete_stats->sf = report_config->period; + complete_stats->has_sf = 1; + complete_stats->has_cell_report_flags = 1; + complete_stats->has_ue_report_flags = 1; + if (report_config->config->nr_cc > 0) { + complete_stats->cell_report_flags = report_config->config->cc_report_type[0].cc_report_flags; + } + if (report_config->config->nr_ue > 0) { + complete_stats->ue_report_flags = report_config->config->ue_report_type[0].ue_report_flags; + } + stats_request_msg->complete_stats_request = complete_stats; + break; + case PROTOCOL__FLEX_STATS_TYPE__FLST_CELL_STATS: + stats_request_msg->body_case = PROTOCOL__FLEX_STATS_REQUEST__BODY_CELL_STATS_REQUEST; + Protocol__FlexCellStatsRequest *cell_stats; + cell_stats = malloc(sizeof(Protocol__FlexCellStatsRequest)); + if(cell_stats == NULL) + goto error; + protocol__flex_cell_stats_request__init(cell_stats); + cell_stats->n_cell = report_config->config->nr_cc; + cell_stats->has_flags = 1; + if (cell_stats->n_cell > 0) { + uint32_t *cells; + cells = (uint32_t *) malloc(sizeof(uint32_t)*cell_stats->n_cell); + for (i = 0; i < cell_stats->n_cell; i++) { + cells[i] = report_config->config->cc_report_type[i].cc_id; + } + cell_stats->cell = cells; + cell_stats->flags = report_config->config->cc_report_type[i].cc_report_flags; + } + stats_request_msg->cell_stats_request = cell_stats; + break; + case PROTOCOL__FLEX_STATS_TYPE__FLST_UE_STATS: + stats_request_msg->body_case = PROTOCOL__FLEX_STATS_REQUEST__BODY_UE_STATS_REQUEST; + Protocol__FlexUeStatsRequest *ue_stats; + ue_stats = malloc(sizeof(Protocol__FlexUeStatsRequest)); + if(ue_stats == NULL) + goto error; + protocol__flex_ue_stats_request__init(ue_stats); + ue_stats->n_rnti = report_config->config->nr_ue; + ue_stats->has_flags = 1; + if (ue_stats->n_rnti > 0) { + uint32_t *ues; + ues = (uint32_t *) malloc(sizeof(uint32_t)*ue_stats->n_rnti); + for (i = 0; i < ue_stats->n_rnti; i++) { + ues[i] = report_config->config->ue_report_type[i].ue_rnti; + } + ue_stats->rnti = ues; + ue_stats->flags = report_config->config->ue_report_type[i].ue_report_flags; + } + stats_request_msg->ue_stats_request = ue_stats; + break; + default: + goto error; + } + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if(*msg == NULL) + goto error; + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_STATS_REQUEST_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__INITIATING_MESSAGE; + (*msg)->stats_request_msg = stats_request_msg; + return 0; + + error: + // TODO: Need to make proper error handling + if (header != NULL) + free(header); + if (stats_request_msg != NULL) + free(stats_request_msg); + if(*msg != NULL) + free(*msg); + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_mac_destroy_stats_request(Protocol__FlexranMessage *msg) { + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_STATS_REQUEST_MSG) + goto error; + free(msg->stats_request_msg->header); + if (msg->stats_request_msg->body_case == PROTOCOL__FLEX_STATS_REQUEST__BODY_CELL_STATS_REQUEST) { + free(msg->stats_request_msg->cell_stats_request->cell); + } + if (msg->stats_request_msg->body_case == PROTOCOL__FLEX_STATS_REQUEST__BODY_UE_STATS_REQUEST) { + free(msg->stats_request_msg->ue_stats_request->rnti); + } + free(msg->stats_request_msg); + free(msg); + return 0; + + error: + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_mac_stats_reply(mid_t mod_id, + xid_t xid, + const report_config_t *report_config, + Protocol__FlexranMessage **msg) { + Protocol__FlexHeader *header; + int i, j, k; + int enb_id = mod_id; + //eNB_MAC_INST *eNB = &eNB_mac_inst[enb_id]; + //UE_list_t *eNB_UE_list= &eNB->UE_list; + + Protocol__FlexStatsReply *stats_reply_msg; + stats_reply_msg = malloc(sizeof(Protocol__FlexStatsReply)); + if (stats_reply_msg == NULL) + goto error; + protocol__flex_stats_reply__init(stats_reply_msg); + + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_STATS_REPLY, &header) != 0) + goto error; + + stats_reply_msg->header = header; + + stats_reply_msg->n_ue_report = report_config->nr_ue; + stats_reply_msg->n_cell_report = report_config->nr_cc; + + Protocol__FlexUeStatsReport **ue_report; + Protocol__FlexCellStatsReport **cell_report; + + + /* Allocate memory for list of UE reports */ + if (report_config->nr_ue > 0) { + ue_report = malloc(sizeof(Protocol__FlexUeStatsReport *) * report_config->nr_ue); + if (ue_report == NULL) + goto error; + for (i = 0; i < report_config->nr_ue; i++) { + ue_report[i] = malloc(sizeof(Protocol__FlexUeStatsReport)); + protocol__flex_ue_stats_report__init(ue_report[i]); + ue_report[i]->rnti = report_config->ue_report_type[i].ue_rnti; + ue_report[i]->has_rnti = 1; + ue_report[i]->flags = report_config->ue_report_type[i].ue_report_flags; + ue_report[i]->has_flags = 1; + /* Check the types of reports that need to be constructed based on flag values */ + + /* Check flag for creation of buffer status report */ + if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_BSR) { + ue_report[i]->n_bsr = 4; + uint32_t *elem; + elem = (uint32_t *) malloc(sizeof(uint32_t)*ue_report[i]->n_bsr); + if (elem == NULL) + goto error; + for (j = 0; j < ue_report[i]->n_bsr; j++) { + // NN: we need to know the cc_id here, consider the first one + elem[j] = flexran_get_ue_bsr (enb_id, i, j); + } + ue_report[i]->bsr = elem; + } + + /* Check flag for creation of PRH report */ + if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_PRH) { + ue_report[i]->phr = flexran_get_ue_phr (enb_id, i); // eNB_UE_list->UE_template[UE_PCCID(enb_id,i)][i].phr_info; + ue_report[i]->has_phr = 1; + } + + /* Check flag for creation of RLC buffer status report */ + if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_RLC_BS) { + ue_report[i]->n_rlc_report = 3; // Set this to the number of LCs for this UE. This needs to be generalized for for LCs + Protocol__FlexRlcBsr ** rlc_reports; + rlc_reports = malloc(sizeof(Protocol__FlexRlcBsr *) * ue_report[i]->n_rlc_report); + if (rlc_reports == NULL) + goto error; + + // NN: see LAYER2/openair2_proc.c for rlc status + for (j = 0; j < ue_report[i]->n_rlc_report; j++) { + rlc_reports[j] = malloc(sizeof(Protocol__FlexRlcBsr)); + if (rlc_reports[j] == NULL) + goto error; + protocol__flex_rlc_bsr__init(rlc_reports[j]); + rlc_reports[j]->lc_id = j + 1; + rlc_reports[j]->has_lc_id = 1; + rlc_reports[j]->tx_queue_size = flexran_get_tx_queue_size(enb_id,i,j + 1); + rlc_reports[j]->has_tx_queue_size = 1; + + //TODO:Set tx queue head of line delay in ms + rlc_reports[j]->tx_queue_hol_delay = flexran_get_hol_delay(enb_id, i, j+1); + rlc_reports[j]->has_tx_queue_hol_delay = 1; + //TODO:Set retransmission queue size in bytes + rlc_reports[j]->retransmission_queue_size = 10; + rlc_reports[j]->has_retransmission_queue_size = 0; + //TODO:Set retransmission queue head of line delay in ms + rlc_reports[j]->retransmission_queue_hol_delay = 100; + rlc_reports[j]->has_retransmission_queue_hol_delay = 0; + //TODO:Set current size of the pending message in bytes + rlc_reports[j]->status_pdu_size = 100; + rlc_reports[j]->has_status_pdu_size = 0; + } + // Add RLC buffer status reports to the full report + if (ue_report[i]->n_rlc_report > 0) + ue_report[i]->rlc_report = rlc_reports; + } + + /* Check flag for creation of MAC CE buffer status report */ + if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_MAC_CE_BS) { + // TODO: Fill in the actual MAC CE buffer status report + ue_report[i]->pending_mac_ces = (flexran_get_MAC_CE_bitmap_TA(enb_id,i,0) | (0 << 1) | (0 << 2) | (0 << 3)) & 15; /* Use as bitmap. Set one or more of the + PROTOCOL__FLEX_CE_TYPE__FLPCET_ values + found in stats_common.pb-c.h. See + flex_ce_type in FlexRAN specification */ + ue_report[i]->has_pending_mac_ces = 1; + } + + /* Check flag for creation of DL CQI report */ + if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_DL_CQI) { + // TODO: Fill in the actual DL CQI report for the UE based on its configuration + Protocol__FlexDlCqiReport * dl_report; + dl_report = malloc(sizeof(Protocol__FlexDlCqiReport)); + if (dl_report == NULL) + goto error; + protocol__flex_dl_cqi_report__init(dl_report); + + dl_report->sfn_sn = flexran_get_sfn_sf(enb_id); + dl_report->has_sfn_sn = 1; + //Set the number of DL CQI reports for this UE. One for each CC + dl_report->n_csi_report = flexran_get_active_CC(enb_id,i); + + //Create the actual CSI reports. + Protocol__FlexDlCsi **csi_reports; + csi_reports = malloc(sizeof(Protocol__FlexDlCsi *)*dl_report->n_csi_report); + if (csi_reports == NULL) + goto error; + for (j = 0; j < dl_report->n_csi_report; j++) { + csi_reports[j] = malloc(sizeof(Protocol__FlexDlCsi)); + if (csi_reports[j] == NULL) + goto error; + protocol__flex_dl_csi__init(csi_reports[j]); + //The servCellIndex for this report + csi_reports[j]->serv_cell_index = j; + csi_reports[j]->has_serv_cell_index = 1; + //The rank indicator value for this cc + csi_reports[j]->ri = flexran_get_current_RI(enb_id,i,j); + csi_reports[j]->has_ri = 1; + //TODO: the type of CSI report based on the configuration of the UE + //For now we only support type P10, which only needs a wideband value + //The full set of types can be found in stats_common.pb-c.h and + //in the FlexRAN specifications + csi_reports[j]->type = PROTOCOL__FLEX_CSI_TYPE__FLCSIT_P10; + csi_reports[j]->has_type = 1; + csi_reports[j]->report_case = PROTOCOL__FLEX_DL_CSI__REPORT_P10CSI; + if(csi_reports[j]->report_case == PROTOCOL__FLEX_DL_CSI__REPORT_P10CSI){ + Protocol__FlexCsiP10 *csi10; + csi10 = malloc(sizeof(Protocol__FlexCsiP10)); + if (csi10 == NULL) + goto error; + protocol__flex_csi_p10__init(csi10); + //TODO: set the wideband value + // NN: this is also depends on cc_id + csi10->wb_cqi = flexran_get_ue_wcqi (enb_id, i); //eNB_UE_list->eNB_UE_stats[UE_PCCID(enb_id,i)][i].dl_cqi; + csi10->has_wb_cqi = 1; + //Add the type of measurements to the csi report in the proper union type + csi_reports[j]->p10csi = csi10; + } + else if(csi_reports[j]->report_case == PROTOCOL__FLEX_DL_CSI__REPORT_P11CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__FLEX_DL_CSI__REPORT_P20CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__FLEX_DL_CSI__REPORT_P21CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__FLEX_DL_CSI__REPORT_A12CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__FLEX_DL_CSI__REPORT_A22CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__FLEX_DL_CSI__REPORT_A20CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__FLEX_DL_CSI__REPORT_A30CSI){ + + } + else if(csi_reports[j]->report_case == PROTOCOL__FLEX_DL_CSI__REPORT_A31CSI){ + + } + } + //Add the csi reports to the full DL CQI report + dl_report->csi_report = csi_reports; + //Add the DL CQI report to the stats report + ue_report[i]->dl_cqi_report = dl_report; + } + + /* Check flag for creation of paging buffer status report */ + if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_PBS) { + //TODO: Fill in the actual paging buffer status report. For this field to be valid, the RNTI + //set in the report must be a P-RNTI + Protocol__FlexPagingBufferReport *paging_report; + paging_report = malloc(sizeof(Protocol__FlexPagingBufferReport)); + if (paging_report == NULL) + goto error; + protocol__flex_paging_buffer_report__init(paging_report); + //Set the number of pending paging messages + paging_report->n_paging_info = 1; + //Provide a report for each pending paging message + Protocol__FlexPagingInfo **p_info; + p_info = malloc(sizeof(Protocol__FlexPagingInfo *) * paging_report->n_paging_info); + if (p_info == NULL) + goto error; + for (j = 0; j < paging_report->n_paging_info; j++) { + p_info[j] = malloc(sizeof(Protocol__FlexPagingInfo)); + if(p_info[j] == NULL) + goto error; + protocol__flex_paging_info__init(p_info[j]); + //TODO: Set paging index. This index is the same that will be used for the scheduling of the + //paging message by the controller + p_info[j]->paging_index = 10; + p_info[j]->has_paging_index = 0; + //TODO:Set the paging message size + p_info[j]->paging_message_size = 100; + p_info[j]->has_paging_message_size = 0; + //TODO: Set the paging subframe + p_info[j]->paging_subframe = 10; + p_info[j]->has_paging_subframe = 0; + //TODO: Set the carrier index for the pending paging message + p_info[j]->carrier_index = 0; + p_info[j]->has_carrier_index = 0; + } + //Add all paging info to the paging buffer rerport + paging_report->paging_info = p_info; + //Add the paging report to the UE report + ue_report[i]->pbr = paging_report; + } + + /* Check flag for creation of UL CQI report */ + if (report_config->ue_report_type[i].ue_report_flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_UL_CQI) { + //Fill in the full UL CQI report of the UE + Protocol__FlexUlCqiReport *full_ul_report; + full_ul_report = malloc(sizeof(Protocol__FlexUlCqiReport)); + if(full_ul_report == NULL) + goto error; + protocol__flex_ul_cqi_report__init(full_ul_report); + //TODO:Set the SFN and SF of the generated report + full_ul_report->sfn_sn = flexran_get_sfn_sf(enb_id); + full_ul_report->has_sfn_sn = 1; + //TODO:Set the number of UL measurement reports based on the types of measurements + //configured for this UE and on the servCellIndex + full_ul_report->n_cqi_meas = 1; + Protocol__FlexUlCqi **ul_report; + ul_report = malloc(sizeof(Protocol__FlexUlCqi *) * full_ul_report->n_cqi_meas); + if(ul_report == NULL) + goto error; + //Fill each UL report of the UE for each of the configured report types + for(j = 0; j < full_ul_report->n_cqi_meas; j++) { + ul_report[j] = malloc(sizeof(Protocol__FlexUlCqi)); + if(ul_report[j] == NULL) + goto error; + protocol__flex_ul_cqi__init(ul_report[j]); + //TODO: Set the type of the UL report. As an example set it to SRS UL report + // See enum flex_ul_cqi_type in FlexRAN specification for more details + ul_report[j]->type = PROTOCOL__FLEX_UL_CQI_TYPE__FLUCT_SRS; + ul_report[j]->has_type = 1; + //TODO:Set the number of SINR measurements based on the report type + //See struct flex_ul_cqi in FlexRAN specification for more details + ul_report[j]->n_sinr = 0; + uint32_t *sinr_meas; + sinr_meas = (uint32_t *) malloc(sizeof(uint32_t) * ul_report[j]->n_sinr); + if (sinr_meas == NULL) + goto error; + //TODO:Set the SINR measurements for the specified type + for (k = 0; k < ul_report[j]->n_sinr; k++) { + sinr_meas[k] = 10; + } + ul_report[j]->sinr = sinr_meas; + //TODO: Set the servCellIndex for this report + ul_report[j]->serv_cell_index = 0; + ul_report[j]->has_serv_cell_index = 1; + + //Set the list of UL reports of this UE to the full UL report + full_ul_report->cqi_meas = ul_report; + + full_ul_report->n_pucch_dbm = MAX_NUM_CCs; + full_ul_report->pucch_dbm = malloc(sizeof(Protocol__FlexPucchDbm *) * full_ul_report->n_pucch_dbm); + + for (j = 0; j < MAX_NUM_CCs; j++) { + full_ul_report->pucch_dbm[j] = malloc(sizeof(Protocol__FlexPucchDbm)); + protocol__flex_pucch_dbm__init(full_ul_report->pucch_dbm[j]); + full_ul_report->pucch_dbm[j]->has_serv_cell_index = 1; + full_ul_report->pucch_dbm[j]->serv_cell_index = j; + if(flexran_get_p0_pucch_dbm(enb_id,i, j) != -1){ + full_ul_report->pucch_dbm[j]->p0_pucch_dbm = flexran_get_p0_pucch_dbm(enb_id,i,j); + full_ul_report->pucch_dbm[j]->has_p0_pucch_dbm = 1; + } + full_ul_report->pucch_dbm[j]->has_p0_pucch_updated = 1; + full_ul_report->pucch_dbm[j]->p0_pucch_updated = flexran_get_p0_pucch_status(enb_id, i, j); + } + + //Add full UL CQI report to the UE report + ue_report[i]->ul_cqi_report = full_ul_report; + } + } + } + /* Add list of all UE reports to the message */ + stats_reply_msg->ue_report = ue_report; + } + + /* Allocate memory for list of cell reports */ + if (report_config->nr_cc > 0) { + cell_report = malloc(sizeof(Protocol__FlexCellStatsReport *) * report_config->nr_cc); + if (cell_report == NULL) + goto error; + // Fill in the Cell reports + for (i = 0; i < report_config->nr_cc; i++) { + cell_report[i] = malloc(sizeof(Protocol__FlexCellStatsReport)); + if(cell_report[i] == NULL) + goto error; + protocol__flex_cell_stats_report__init(cell_report[i]); + cell_report[i]->carrier_index = report_config->cc_report_type[i].cc_id; + cell_report[i]->has_carrier_index = 1; + cell_report[i]->flags = report_config->cc_report_type[i].cc_report_flags; + cell_report[i]->has_flags = 1; + + /* Check flag for creation of noise and interference report */ + if(report_config->cc_report_type[i].cc_report_flags & PROTOCOL__FLEX_CELL_STATS_TYPE__FLCST_NOISE_INTERFERENCE) { + // TODO: Fill in the actual noise and interference report for this cell + Protocol__FlexNoiseInterferenceReport *ni_report; + ni_report = malloc(sizeof(Protocol__FlexNoiseInterferenceReport)); + if(ni_report == NULL) + goto error; + protocol__flex_noise_interference_report__init(ni_report); + // Current frame and subframe number + ni_report->sfn_sf = flexran_get_sfn_sf(enb_id); + ni_report->has_sfn_sf = 1; + //TODO:Received interference power in dbm + ni_report->rip = 0; + ni_report->has_rip = 0; + //TODO:Thermal noise power in dbm + ni_report->tnp = 0; + ni_report->has_tnp = 0; + + ni_report->p0_nominal_pucch = flexran_get_p0_nominal_pucch(enb_id, 0); + ni_report->has_p0_nominal_pucch = 1; + cell_report[i]->noise_inter_report = ni_report; + } + } + /* Add list of all cell reports to the message */ + stats_reply_msg->cell_report = cell_report; + } + + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if(*msg == NULL) + goto error; + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_STATS_REPLY_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__SUCCESSFUL_OUTCOME; + (*msg)->stats_reply_msg = stats_reply_msg; + return 0; + + error: + // TODO: Need to make proper error handling + if (header != NULL) + free(header); + if (stats_reply_msg != NULL) + free(stats_reply_msg); + if(*msg != NULL) + free(*msg); + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_mac_destroy_stats_reply(Protocol__FlexranMessage *msg) { + //TODO: Need to deallocate memory for the stats reply message + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_STATS_REPLY_MSG) + goto error; + free(msg->stats_reply_msg->header); + int i, j, k; + + Protocol__FlexStatsReply *reply = msg->stats_reply_msg; + Protocol__FlexDlCqiReport *dl_report; + Protocol__FlexUlCqiReport *ul_report; + Protocol__FlexPagingBufferReport *paging_report; + + // Free the memory for the UE reports + for (i = 0; i < reply->n_ue_report; i++) { + free(reply->ue_report[i]->bsr); + for (j = 0; j < reply->ue_report[i]->n_rlc_report; j++) { + free(reply->ue_report[i]->rlc_report[j]); + } + free(reply->ue_report[i]->rlc_report); + // If DL CQI report flag was set + if (reply->ue_report[i]->flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_DL_CQI) { + dl_report = reply->ue_report[i]->dl_cqi_report; + // Delete all CSI reports + for (j = 0; j < dl_report->n_csi_report; j++) { + //Must free memory based on the type of report + switch(dl_report->csi_report[j]->report_case) { + case PROTOCOL__FLEX_DL_CSI__REPORT_P10CSI: + free(dl_report->csi_report[j]->p10csi); + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_P11CSI: + free(dl_report->csi_report[j]->p11csi->wb_cqi); + free(dl_report->csi_report[j]->p11csi); + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_P20CSI: + free(dl_report->csi_report[j]->p20csi); + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_P21CSI: + free(dl_report->csi_report[j]->p21csi->wb_cqi); + free(dl_report->csi_report[j]->p21csi->sb_cqi); + free(dl_report->csi_report[j]->p21csi); + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_A12CSI: + free(dl_report->csi_report[j]->a12csi->wb_cqi); + free(dl_report->csi_report[j]->a12csi->sb_pmi); + free(dl_report->csi_report[j]->a12csi); + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_A22CSI: + free(dl_report->csi_report[j]->a22csi->wb_cqi); + free(dl_report->csi_report[j]->a22csi->sb_cqi); + free(dl_report->csi_report[j]->a22csi->sb_list); + free(dl_report->csi_report[j]->a22csi); + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_A20CSI: + free(dl_report->csi_report[j]->a20csi->sb_list); + free(dl_report->csi_report[j]->a20csi); + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_A30CSI: + free(dl_report->csi_report[j]->a30csi->sb_cqi); + free(dl_report->csi_report[j]->a30csi); + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_A31CSI: + free(dl_report->csi_report[j]->a31csi->wb_cqi); + for (k = 0; k < dl_report->csi_report[j]->a31csi->n_sb_cqi; k++) { + free(dl_report->csi_report[j]->a31csi->sb_cqi[k]); + } + free(dl_report->csi_report[j]->a31csi->sb_cqi); + break; + default: + break; + } + + free(dl_report->csi_report[j]); + } + free(dl_report->csi_report); + free(dl_report); + } + // If Paging buffer report flag was set + if (reply->ue_report[i]->flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_PBS) { + paging_report = reply->ue_report[i]->pbr; + // Delete all paging buffer reports + for (j = 0; j < paging_report->n_paging_info; j++) { + free(paging_report->paging_info[j]); + } + free(paging_report->paging_info); + free(paging_report); + } + // If UL CQI report flag was set + if (reply->ue_report[i]->flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_UL_CQI) { + ul_report = reply->ue_report[i]->ul_cqi_report; + for (j = 0; j < ul_report->n_cqi_meas; j++) { + free(ul_report->cqi_meas[j]->sinr); + free(ul_report->cqi_meas[j]); + } + free(ul_report->cqi_meas); + for (j = 0; j < ul_report->n_pucch_dbm; j++) { + free(ul_report->pucch_dbm[j]); + } + free(ul_report->pucch_dbm); + } + free(reply->ue_report[i]); + } + free(reply->ue_report); + + // Free memory for all Cell reports + for (i = 0; i < reply->n_cell_report; i++) { + free(reply->cell_report[i]->noise_inter_report); + free(reply->cell_report[i]); + } + free(reply->cell_report); + + free(reply); + free(msg); + return 0; + + error: + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_mac_sr_info(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { + Protocol__FlexHeader *header; + int i; + const int xid = *((int *)params); + + Protocol__FlexUlSrInfo *ul_sr_info_msg; + ul_sr_info_msg = malloc(sizeof(Protocol__FlexUlSrInfo)); + if (ul_sr_info_msg == NULL) { + goto error; + } + protocol__flex_ul_sr_info__init(ul_sr_info_msg); + + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_UL_SR_INFO, &header) != 0) + goto error; + + ul_sr_info_msg->header = header; + ul_sr_info_msg->has_sfn_sf = 1; + ul_sr_info_msg->sfn_sf = flexran_get_sfn_sf(mod_id); + /*TODO: Set the number of UEs that sent an SR */ + ul_sr_info_msg->n_rnti = 1; + ul_sr_info_msg->rnti = (uint32_t *) malloc(ul_sr_info_msg->n_rnti * sizeof(uint32_t)); + + if(ul_sr_info_msg->rnti == NULL) { + goto error; + } + /*TODO:Set the rnti of the UEs that sent an SR */ + for (i = 0; i < ul_sr_info_msg->n_rnti; i++) { + ul_sr_info_msg->rnti[i] = 1; + } + + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if(*msg == NULL) + goto error; + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_UL_SR_INFO_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__INITIATING_MESSAGE; + (*msg)->ul_sr_info_msg = ul_sr_info_msg; + return 0; + + error: + // TODO: Need to make proper error handling + if (header != NULL) + free(header); + if (ul_sr_info_msg != NULL) { + free(ul_sr_info_msg->rnti); + free(ul_sr_info_msg); + } + if(*msg != NULL) + free(*msg); + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_mac_destroy_sr_info(Protocol__FlexranMessage *msg) { + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_UL_SR_INFO_MSG) + goto error; + + free(msg->ul_sr_info_msg->header); + free(msg->ul_sr_info_msg->rnti); + free(msg->ul_sr_info_msg); + free(msg); + return 0; + + error: + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { + Protocol__FlexHeader *header; + int i, j, UE_id; + + int available_harq[NUMBER_OF_UE_MAX]; + + const int xid = *((int *)params); + + + Protocol__FlexSfTrigger *sf_trigger_msg; + sf_trigger_msg = malloc(sizeof(Protocol__FlexSfTrigger)); + if (sf_trigger_msg == NULL) { + goto error; + } + protocol__flex_sf_trigger__init(sf_trigger_msg); + + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_SF_TRIGGER, &header) != 0) + goto error; + + frame_t frame; + sub_frame_t subframe; + + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + available_harq[i] = -1; + } + + int ahead_of_time = 0; + + frame = (frame_t) flexran_get_current_system_frame_num(mod_id); + subframe = (sub_frame_t) flexran_get_current_subframe(mod_id); + + subframe = ((subframe + ahead_of_time) % 10); + + if (subframe < flexran_get_current_subframe(mod_id)) { + frame = (frame + 1) % 1024; + } + + int additional_frames = ahead_of_time / 10; + frame = (frame + additional_frames) % 1024; + + sf_trigger_msg->header = header; + sf_trigger_msg->has_sfn_sf = 1; + sf_trigger_msg->sfn_sf = flexran_get_future_sfn_sf(mod_id, 3); + + sf_trigger_msg->n_dl_info = 0; + + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + for (j = 0; j < 8; j++) { + if (harq_pid_updated[i][j] == 1) { + available_harq[i] = j; + sf_trigger_msg->n_dl_info++; + break; + } + } + } + + + // LOG_I(FLEXRAN_AGENT, "Sending subframe trigger for frame %d and subframe %d\n", flexran_get_current_frame(mod_id), (flexran_get_current_subframe(mod_id) + 1) % 10); + + /*TODO: Fill in the number of dl HARQ related info, based on the number of currently + *transmitting UEs + */ + // sf_trigger_msg->n_dl_info = flexran_get_num_ues(mod_id); + + Protocol__FlexDlInfo **dl_info = NULL; + + if (sf_trigger_msg->n_dl_info > 0) { + dl_info = malloc(sizeof(Protocol__FlexDlInfo *) * sf_trigger_msg->n_dl_info); + if(dl_info == NULL) + goto error; + i = -1; + //Fill the status of the current HARQ process for each UE + for(UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (available_harq[UE_id] < 0) { + continue; + } else { + i++; + } + dl_info[i] = malloc(sizeof(Protocol__FlexDlInfo)); + if(dl_info[i] == NULL) + goto error; + protocol__flex_dl_info__init(dl_info[i]); + dl_info[i]->rnti = flexran_get_ue_crnti(mod_id, UE_id); + dl_info[i]->has_rnti = 1; + /*Fill in the right id of this round's HARQ process for this UE*/ + // uint8_t harq_id; + //uint8_t harq_status; + // flexran_get_harq(mod_id, UE_PCCID(mod_id,i), i, frame, subframe, &harq_id, &harq_status); + + + dl_info[i]->harq_process_id = available_harq[UE_id]; + harq_pid_updated[UE_id][available_harq[UE_id]] = 0; + dl_info[i]->has_harq_process_id = 1; + /* Fill in the status of the HARQ process (2 TBs)*/ + dl_info[i]->n_harq_status = 2; + dl_info[i]->harq_status = malloc(sizeof(uint32_t) * dl_info[i]->n_harq_status); + for (j = 0; j < dl_info[i]->n_harq_status; j++) { + dl_info[i]->harq_status[j] = harq_pid_round[UE_id][available_harq[UE_id]]; + // TODO: This should be different per TB + } + // LOG_I(FLEXRAN_AGENT, "Sending subframe trigger for frame %d and subframe %d and harq %d (round %d)\n", flexran_get_current_frame(mod_id), (flexran_get_current_subframe(mod_id) + 1) % 10, dl_info[i]->harq_process_id, dl_info[i]->harq_status[0]); + if(dl_info[i]->harq_status[0] > 0) { + // LOG_I(FLEXRAN_AGENT, "[Frame %d][Subframe %d]Need to make a retransmission for harq %d (round %d)\n", flexran_get_current_frame(mod_id), flexran_get_current_subframe(mod_id), dl_info[i]->harq_process_id, dl_info[i]->harq_status[0]); + } + /*Fill in the serving cell index for this UE */ + dl_info[i]->serv_cell_index = UE_PCCID(mod_id,i); + dl_info[i]->has_serv_cell_index = 1; + } + } + + sf_trigger_msg->dl_info = dl_info; + + /* Fill in the number of UL reception status related info, based on the number of currently + * transmitting UEs + */ + sf_trigger_msg->n_ul_info = flexran_get_num_ues(mod_id); + + Protocol__FlexUlInfo **ul_info = NULL; + + if (sf_trigger_msg->n_ul_info > 0) { + ul_info = malloc(sizeof(Protocol__FlexUlInfo *) * sf_trigger_msg->n_ul_info); + if(ul_info == NULL) + goto error; + //Fill the reception info for each transmitting UE + for(i = 0; i < sf_trigger_msg->n_ul_info; i++) { + ul_info[i] = malloc(sizeof(Protocol__FlexUlInfo)); + if(ul_info[i] == NULL) + goto error; + protocol__flex_ul_info__init(ul_info[i]); + ul_info[i]->rnti = flexran_get_ue_crnti(mod_id, i); + ul_info[i]->has_rnti = 1; + /*Fill in the Tx power control command for this UE (if available)*/ + if(flexran_get_tpc(mod_id,i) != 1){ + ul_info[i]->tpc = flexran_get_tpc(mod_id,i); + ul_info[i]->has_tpc = 1; + } + else{ + ul_info[i]->tpc = flexran_get_tpc(mod_id,i); + ul_info[i]->has_tpc = 0; + } + /*TODO: fill in the amount of data in bytes in the MAC SDU received in this subframe for the + given logical channel*/ + ul_info[i]->n_ul_reception = 0; + ul_info[i]->ul_reception = malloc(sizeof(uint32_t) * ul_info[i]->n_ul_reception); + for (j = 0; j < ul_info[i]->n_ul_reception; j++) { + ul_info[i]->ul_reception[j] = 100; + } + /*TODO: Fill in the reception status for each UEs data*/ + ul_info[i]->reception_status = PROTOCOL__FLEX_RECEPTION_STATUS__FLRS_OK; + ul_info[i]->has_reception_status = 1; + /*Fill in the serving cell index for this UE */ + ul_info[i]->serv_cell_index = UE_PCCID(mod_id,i); + ul_info[i]->has_serv_cell_index = 1; + } + } + + sf_trigger_msg->ul_info = ul_info; + + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if(*msg == NULL) + goto error; + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_SF_TRIGGER_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__INITIATING_MESSAGE; + (*msg)->sf_trigger_msg = sf_trigger_msg; + return 0; + + error: + if (header != NULL) + free(header); + if (sf_trigger_msg != NULL) { + for (i = 0; i < sf_trigger_msg->n_dl_info; i++) { + free(sf_trigger_msg->dl_info[i]->harq_status); + } + free(sf_trigger_msg->dl_info); + free(sf_trigger_msg->ul_info); + free(sf_trigger_msg); + } + if(*msg != NULL) + free(*msg); + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_mac_destroy_sf_trigger(Protocol__FlexranMessage *msg) { + int i; + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_SF_TRIGGER_MSG) + goto error; + + free(msg->sf_trigger_msg->header); + for (i = 0; i < msg->sf_trigger_msg->n_dl_info; i++) { + free(msg->sf_trigger_msg->dl_info[i]->harq_status); + free(msg->sf_trigger_msg->dl_info[i]); + } + free(msg->sf_trigger_msg->dl_info); + for (i = 0; i < msg->sf_trigger_msg->n_ul_info; i++) { + free(msg->sf_trigger_msg->ul_info[i]->ul_reception); + free(msg->sf_trigger_msg->ul_info[i]); + } + free(msg->sf_trigger_msg->ul_info); + free(msg->sf_trigger_msg); + free(msg); + + return 0; + + error: + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_mac_create_empty_dl_config(mid_t mod_id, Protocol__FlexranMessage **msg) { + + int xid = 0; + Protocol__FlexHeader *header; + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_DL_MAC_CONFIG, &header) != 0) + goto error; + + Protocol__FlexDlMacConfig *dl_mac_config_msg; + dl_mac_config_msg = malloc(sizeof(Protocol__FlexDlMacConfig)); + if (dl_mac_config_msg == NULL) { + goto error; + } + protocol__flex_dl_mac_config__init(dl_mac_config_msg); + + dl_mac_config_msg->header = header; + dl_mac_config_msg->has_sfn_sf = 1; + dl_mac_config_msg->sfn_sf = flexran_get_sfn_sf(mod_id); + + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if(*msg == NULL) + goto error; + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_DL_MAC_CONFIG_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__INITIATING_MESSAGE; + (*msg)->dl_mac_config_msg = dl_mac_config_msg; + + return 0; + + error: + return -1; +} + +int flexran_agent_mac_destroy_dl_config(Protocol__FlexranMessage *msg) { + int i,j, k; + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_DL_MAC_CONFIG_MSG) + goto error; + + Protocol__FlexDlDci *dl_dci; + + free(msg->dl_mac_config_msg->header); + for (i = 0; i < msg->dl_mac_config_msg->n_dl_ue_data; i++) { + free(msg->dl_mac_config_msg->dl_ue_data[i]->ce_bitmap); + for (j = 0; j < msg->dl_mac_config_msg->dl_ue_data[i]->n_rlc_pdu; j++) { + for (k = 0; k < msg->dl_mac_config_msg->dl_ue_data[i]->rlc_pdu[j]->n_rlc_pdu_tb; k++) { + free(msg->dl_mac_config_msg->dl_ue_data[i]->rlc_pdu[j]->rlc_pdu_tb[k]); + } + free(msg->dl_mac_config_msg->dl_ue_data[i]->rlc_pdu[j]->rlc_pdu_tb); + free(msg->dl_mac_config_msg->dl_ue_data[i]->rlc_pdu[j]); + } + free(msg->dl_mac_config_msg->dl_ue_data[i]->rlc_pdu); + dl_dci = msg->dl_mac_config_msg->dl_ue_data[i]->dl_dci; + free(dl_dci->tbs_size); + free(dl_dci->mcs); + free(dl_dci->ndi); + free(dl_dci->rv); + free(dl_dci); + free(msg->dl_mac_config_msg->dl_ue_data[i]); + } + free(msg->dl_mac_config_msg->dl_ue_data); + + for (i = 0; i < msg->dl_mac_config_msg->n_dl_rar; i++) { + dl_dci = msg->dl_mac_config_msg->dl_rar[i]->rar_dci; + free(dl_dci->tbs_size); + free(dl_dci->mcs); + free(dl_dci->ndi); + free(dl_dci->rv); + free(dl_dci); + free(msg->dl_mac_config_msg->dl_rar[i]); + } + free(msg->dl_mac_config_msg->dl_rar); + + for (i = 0; i < msg->dl_mac_config_msg->n_dl_broadcast; i++) { + dl_dci = msg->dl_mac_config_msg->dl_broadcast[i]->broad_dci; + free(dl_dci->tbs_size); + free(dl_dci->mcs); + free(dl_dci->ndi); + free(dl_dci->rv); + free(dl_dci); + free(msg->dl_mac_config_msg->dl_broadcast[i]); + } + free(msg->dl_mac_config_msg->dl_broadcast); + + for ( i = 0; i < msg->dl_mac_config_msg->n_ofdm_sym; i++) { + free(msg->dl_mac_config_msg->ofdm_sym[i]); + } + free(msg->dl_mac_config_msg->ofdm_sym); + free(msg->dl_mac_config_msg); + free(msg); + + return 0; + + error: + return -1; +} + +void flexran_agent_get_pending_dl_mac_config(mid_t mod_id, Protocol__FlexranMessage **msg) { + + struct lfds700_misc_prng_state ls; + + LFDS700_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE; + lfds700_misc_prng_init(&ls); + + if (lfds700_ringbuffer_read(&ringbuffer_state[mod_id], NULL, (void **) msg, &ls) == 0) { + *msg = NULL; + } +} + +int flexran_agent_mac_handle_dl_mac_config(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { + + struct lfds700_misc_prng_state ls; + enum lfds700_misc_flag overwrite_occurred_flag; + Protocol__FlexranMessage *overwritten_dl_config; + + LFDS700_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE; + lfds700_misc_prng_init(&ls); + + lfds700_ringbuffer_write( &ringbuffer_state[mod_id], + NULL, + (void *) params, + &overwrite_occurred_flag, + NULL, + (void **)&overwritten_dl_config, + &ls); + + if (overwrite_occurred_flag == LFDS700_MISC_FLAG_RAISED) { + // Delete unmanaged dl_config + flexran_agent_mac_destroy_dl_config(overwritten_dl_config); + } + *msg = NULL; + return 2; + + // error: + //*msg = NULL; + //return -1; +} + +void flexran_agent_init_mac_agent(mid_t mod_id) { + int i, j; + lfds700_misc_library_init_valid_on_current_logical_core(); + lfds700_misc_prng_init(&ps[mod_id]); + int num_elements = RINGBUFFER_SIZE + 1; + //Allow RINGBUFFER_SIZE messages to be stored in the ringbuffer at any time + dl_mac_config_array[mod_id] = malloc( sizeof(struct lfds700_ringbuffer_element) * num_elements); + lfds700_ringbuffer_init_valid_on_current_logical_core( &ringbuffer_state[mod_id], dl_mac_config_array[mod_id], num_elements, &ps[mod_id], NULL ); + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + for (j = 0; j < 8; j++) { + harq_pid_updated[i][j] = 0; + } + } +} + +/*********************************************** + * FlexRAN agent - technology mac API implementation + ***********************************************/ + +void flexran_agent_send_sr_info(mid_t mod_id) { + int size; + Protocol__FlexranMessage *msg; + void *data; + int priority = 0; + err_code_t err_code; + + int xid = 0; + + /*TODO: Must use a proper xid*/ + err_code = flexran_agent_mac_sr_info(mod_id, (void *) &xid, &msg); + if (err_code < 0) { + goto error; + } + + if (msg != NULL){ + data=flexran_agent_pack_message(msg, &size); + /*Send sr info using the MAC channel of the eNB*/ + if (flexran_agent_msg_send(mod_id, FLEXRAN_AGENT_MAC, data, size, priority)) { + err_code = PROTOCOL__FLEXRAN_ERR__MSG_ENQUEUING; + goto error; + } + + LOG_D(FLEXRAN_AGENT,"sent message with size %d\n", size); + return; + } + error: + LOG_D(FLEXRAN_AGENT, "Could not send sr message\n"); +} + +void flexran_agent_send_sf_trigger(mid_t mod_id) { + int size; + Protocol__FlexranMessage *msg; + void *data; + int priority = 0; + err_code_t err_code; + + int xid = 0; + + /*TODO: Must use a proper xid*/ + err_code = flexran_agent_mac_sf_trigger(mod_id, (void *) &xid, &msg); + if (err_code < 0) { + goto error; + } + + if (msg != NULL){ + data=flexran_agent_pack_message(msg, &size); + /*Send sr info using the MAC channel of the eNB*/ + if (flexran_agent_msg_send(mod_id, FLEXRAN_AGENT_MAC, data, size, priority)) { + err_code = PROTOCOL__FLEXRAN_ERR__MSG_ENQUEUING; + goto error; + } + + LOG_D(FLEXRAN_AGENT,"sent message with size %d\n", size); + return; + } + error: + LOG_D(FLEXRAN_AGENT, "Could not send sf trigger message\n"); +} + +void flexran_agent_send_update_mac_stats(mid_t mod_id) { + + Protocol__FlexranMessage *current_report = NULL; + void *data; + int size; + err_code_t err_code; + int priority = 0; + + if (pthread_mutex_lock(mac_stats_context[mod_id].mutex)) { + goto error; + } + + if (mac_stats_context[mod_id].cont_update == 1) { + + /*Create a fresh report with the required flags*/ + err_code = flexran_agent_mac_handle_stats(mod_id, (void *) mac_stats_context[mod_id].stats_req, ¤t_report); + if (err_code < 0) { + goto error; + } + } + /* /\*TODO:Check if a previous reports exists and if yes, generate a report */ + /* *that is the diff between the old and the new report, */ + /* *respecting the thresholds. Otherwise send the new report*\/ */ + /* if (mac_stats_context[mod_id].prev_stats_reply != NULL) { */ + + /* msg = flexran_agent_generate_diff_mac_stats_report(current_report, mac_stats_context[mod_id].prev_stats_reply); */ + + /* /\*Destroy the old stats*\/ */ + /* flexran_agent_destroy_flexran_message(mac_stats_context[mod_id].prev_stats_reply); */ + /* } */ + /* /\*Use the current report for future comparissons*\/ */ + /* mac_stats_context[mod_id].prev_stats_reply = current_report; */ + + + if (pthread_mutex_unlock(mac_stats_context[mod_id].mutex)) { + goto error; + } + + if (current_report != NULL){ + data=flexran_agent_pack_message(current_report, &size); + /*Send any stats updates using the MAC channel of the eNB*/ + if (flexran_agent_msg_send(mod_id, FLEXRAN_AGENT_MAC, data, size, priority)) { + err_code = PROTOCOL__FLEXRAN_ERR__MSG_ENQUEUING; + goto error; + } + + LOG_D(FLEXRAN_AGENT,"sent message with size %d\n", size); + return; + } + error: + LOG_D(FLEXRAN_AGENT, "Could not send sf trigger message\n"); +} + +int flexran_agent_register_mac_xface(mid_t mod_id, AGENT_MAC_xface *xface) { + if (mac_agent_registered[mod_id]) { + LOG_E(MAC, "MAC agent for eNB %d is already registered\n", mod_id); + return -1; + } + + //xface->agent_ctxt = &shared_ctxt[mod_id]; + xface->flexran_agent_send_sr_info = flexran_agent_send_sr_info; + xface->flexran_agent_send_sf_trigger = flexran_agent_send_sf_trigger; + xface->flexran_agent_send_update_mac_stats = flexran_agent_send_update_mac_stats; + xface->flexran_agent_schedule_ue_spec = flexran_schedule_ue_spec_default; + //xface->flexran_agent_schedule_ue_spec = flexran_schedule_ue_spec_remote; + xface->flexran_agent_get_pending_dl_mac_config = flexran_agent_get_pending_dl_mac_config; + xface->flexran_agent_notify_ue_state_change = flexran_agent_ue_state_change; + + xface->dl_scheduler_loaded_lib = NULL; + + mac_agent_registered[mod_id] = 1; + agent_mac_xface[mod_id] = xface; + + return 0; +} + +int flexran_agent_unregister_mac_xface(mid_t mod_id, AGENT_MAC_xface *xface) { + + //xface->agent_ctxt = NULL; + xface->flexran_agent_send_sr_info = NULL; + xface->flexran_agent_send_sf_trigger = NULL; + xface->flexran_agent_send_update_mac_stats = NULL; + xface->flexran_agent_schedule_ue_spec = NULL; + xface->flexran_agent_get_pending_dl_mac_config = NULL; + xface->flexran_agent_notify_ue_state_change = NULL; + + xface->dl_scheduler_loaded_lib = NULL; + + mac_agent_registered[mod_id] = 0; + agent_mac_xface[mod_id] = NULL; + + return 0; +} + + +/****************************************************** + *Implementations of flexran_agent_mac_internal.h functions + ******************************************************/ + +err_code_t flexran_agent_init_cont_mac_stats_update(mid_t mod_id) { + + /*Initialize the Mac stats update structure*/ + /*Initially the continuous update is set to false*/ + mac_stats_context[mod_id].cont_update = 0; + mac_stats_context[mod_id].is_initialized = 1; + mac_stats_context[mod_id].stats_req = NULL; + mac_stats_context[mod_id].prev_stats_reply = NULL; + mac_stats_context[mod_id].mutex = calloc(1, sizeof(pthread_mutex_t)); + if (mac_stats_context[mod_id].mutex == NULL) + goto error; + if (pthread_mutex_init(mac_stats_context[mod_id].mutex, NULL)) + goto error;; + + return 0; + + error: + return -1; +} + +err_code_t flexran_agent_destroy_cont_mac_stats_update(mid_t mod_id) { + /*Disable the continuous updates for the MAC*/ + mac_stats_context[mod_id].cont_update = 0; + mac_stats_context[mod_id].is_initialized = 0; + flexran_agent_destroy_flexran_message(mac_stats_context[mod_id].stats_req); + flexran_agent_destroy_flexran_message(mac_stats_context[mod_id].prev_stats_reply); + free(mac_stats_context[mod_id].mutex); + + mac_agent_registered[mod_id] = 0; + return 1; +} + + +err_code_t flexran_agent_enable_cont_mac_stats_update(mid_t mod_id, + xid_t xid, stats_request_config_t *stats_req) { + /*Enable the continuous updates for the MAC*/ + if (pthread_mutex_lock(mac_stats_context[mod_id].mutex)) { + goto error; + } + + Protocol__FlexranMessage *req_msg; + + flexran_agent_mac_stats_request(mod_id, xid, stats_req, &req_msg); + mac_stats_context[mod_id].stats_req = req_msg; + mac_stats_context[mod_id].prev_stats_reply = NULL; + + mac_stats_context[mod_id].cont_update = 1; + mac_stats_context[mod_id].xid = xid; + + if (pthread_mutex_unlock(mac_stats_context[mod_id].mutex)) { + goto error; + } + return 0; + + error: + LOG_E(FLEXRAN_AGENT, "mac_stats_context for eNB %d is not initialized\n", mod_id); + return -1; +} + +err_code_t flexran_agent_disable_cont_mac_stats_update(mid_t mod_id) { + /*Disable the continuous updates for the MAC*/ + if (pthread_mutex_lock(mac_stats_context[mod_id].mutex)) { + goto error; + } + mac_stats_context[mod_id].cont_update = 0; + mac_stats_context[mod_id].xid = 0; + if (mac_stats_context[mod_id].stats_req != NULL) { + flexran_agent_destroy_flexran_message(mac_stats_context[mod_id].stats_req); + } + if (mac_stats_context[mod_id].prev_stats_reply != NULL) { + flexran_agent_destroy_flexran_message(mac_stats_context[mod_id].prev_stats_reply); + } + if (pthread_mutex_unlock(mac_stats_context[mod_id].mutex)) { + goto error; + } + return 0; + + error: + LOG_E(FLEXRAN_AGENT, "mac_stats_context for eNB %d is not initialized\n", mod_id); + return -1; + +} diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.h b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.h new file mode 100644 index 0000000000..090a599abe --- /dev/null +++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.h @@ -0,0 +1,122 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_mac.h + * \brief FlexRAN agent message handler APIs for MAC layer + * \author Xenofon Foukas, Mohamed Kassem and Navid Nikaein + * \date 2016 + * \version 0.1 + */ + +#ifndef FLEXRAN_AGENT_MAC_H_ +#define FLEXRAN_AGENT_MAC_H_ + +#include "header.pb-c.h" +#include "flexran.pb-c.h" +#include "stats_messages.pb-c.h" +#include "stats_common.pb-c.h" + +#include "flexran_agent_common.h" +#include "flexran_agent_extern.h" + +/* These types will be used to give + instructions for the type of stats reports + we need to create */ +typedef struct { + uint16_t ue_rnti; + uint32_t ue_report_flags; /* Indicates the report elements + required for this UE id. See + FlexRAN specification 1.2.4.2 */ +} ue_report_type_t; + +typedef struct { + uint16_t cc_id; + uint32_t cc_report_flags; /* Indicates the report elements + required for this CC index. See + FlexRAN specification 1.2.4.3 */ +} cc_report_type_t; + +typedef struct { + int nr_ue; + ue_report_type_t *ue_report_type; + int nr_cc; + cc_report_type_t *cc_report_type; +} report_config_t; + +typedef struct stats_request_config_s{ + uint8_t report_type; + uint8_t report_frequency; + uint16_t period; /*In number of subframes*/ + report_config_t *config; +} stats_request_config_t; + +/* Initialization function for the agent structures etc */ +void flexran_agent_init_mac_agent(mid_t mod_id); + +int flexran_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); + +/* Statistics request protocol message constructor and destructor */ +int flexran_agent_mac_stats_request(mid_t mod_id, xid_t xid, const stats_request_config_t *report_config, Protocol__FlexranMessage **msg); +int flexran_agent_mac_destroy_stats_request(Protocol__FlexranMessage *msg); + +/* Statistics reply protocol message constructor and destructor */ +int flexran_agent_mac_stats_reply(mid_t mod_id, xid_t xid, const report_config_t *report_config, Protocol__FlexranMessage **msg); +int flexran_agent_mac_destroy_stats_reply(Protocol__FlexranMessage *msg); + +/* Scheduling request information protocol message constructor and estructor */ +int flexran_agent_mac_sr_info(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); +int flexran_agent_mac_destroy_sr_info(Protocol__FlexranMessage *msg); + +/* Subframe trigger protocol msssage constructor and destructor */ +int flexran_agent_mac_sf_trigger(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); +int flexran_agent_mac_destroy_sf_trigger(Protocol__FlexranMessage *msg); + +/* DL MAC scheduling decision protocol message constructor (empty command) and destructor */ +int flexran_agent_mac_create_empty_dl_config(mid_t mod_id, Protocol__FlexranMessage **msg); +int flexran_agent_mac_destroy_dl_config(Protocol__FlexranMessage *msg); + +int flexran_agent_mac_handle_dl_mac_config(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); + + +/********************************** + * FlexRAN agent - technology mac API + **********************************/ + +/*Inform controller about received scheduling requests during a subframe*/ +void flexran_agent_send_sr_info(mid_t mod_id); + +/*Inform the controller about the current UL/DL subframe*/ +void flexran_agent_send_sf_trigger(mid_t mod_id); + +/// Send to the controller all the mac stat updates that occured during this subframe +/// based on the stats request configuration +void flexran_agent_send_update_mac_stats(mid_t mod_id); + +/// Provide to the scheduler a pending dl_mac_config message +void flexran_agent_get_pending_dl_mac_config(mid_t mod_id, Protocol__FlexranMessage **msg); + +/*Register technology specific interface callbacks*/ +int flexran_agent_register_mac_xface(mid_t mod_id, AGENT_MAC_xface *xface); + +/*Unregister technology specific callbacks*/ +int flexran_agent_unregister_mac_xface(mid_t mod_id, AGENT_MAC_xface*xface); + +#endif diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_defs.h b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_defs.h new file mode 100644 index 0000000000..70254bd7ba --- /dev/null +++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_defs.h @@ -0,0 +1,75 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_mac_defs.h + * \brief FlexRAN agent - mac interface primitives + * \author Xenofon Foukas + * \date 2016 + * \version 0.1 + * \mail x.foukas@sms.ed.ac.uk + */ + +#ifndef __FLEXRAN_AGENT_MAC_PRIMITIVES_H__ +#define __FLEXRAN_AGENT_MAC_PRIMITIVES_H__ + +#include "flexran_agent_defs.h" +#include "flexran.pb-c.h" +#include "header.pb-c.h" + +#define RINGBUFFER_SIZE 100 + +/* FLEXRAN AGENT-MAC Interface */ +typedef struct { + //msg_context_t *agent_ctxt; + + /// Inform the controller about the scheduling requests received during the subframe + void (*flexran_agent_send_sr_info)(mid_t mod_id); + + /// Inform the controller about the current UL/DL subframe + void (*flexran_agent_send_sf_trigger)(mid_t mod_id); + + /// Send to the controller all the mac stat updates that occured during this subframe + /// based on the stats request configuration + void (*flexran_agent_send_update_mac_stats)(mid_t mod_id); + + /// Provide to the scheduler a pending dl_mac_config message + void (*flexran_agent_get_pending_dl_mac_config)(mid_t mod_id, + Protocol__FlexranMessage **msg); + + /// Run the UE DL scheduler and fill the Protocol__FlexranMessage. Assumes that + /// dl_info is already initialized as flex_dl_mac_config and fills the + /// flex_dl_data part of it + void (*flexran_agent_schedule_ue_spec)(mid_t mod_id, uint32_t frame, uint32_t subframe, + int *mbsfn_flag, Protocol__FlexranMessage **dl_info); + + + /// Notify the controller for a state change of a particular UE, by sending the proper + /// UE state change message (ACTIVATION, DEACTIVATION, HANDOVER) + int (*flexran_agent_notify_ue_state_change)(mid_t mod_id, uint32_t rnti, + uint8_t state_change); + + + void *dl_scheduler_loaded_lib; + /*TODO: Fill in with the rest of the MAC layer technology specific callbacks (UL/DL scheduling, RACH info etc)*/ + +} AGENT_MAC_xface; + +#endif diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c new file mode 100644 index 0000000000..5c37ba8132 --- /dev/null +++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.c @@ -0,0 +1,792 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_mac_internal.c + * \brief Helper functions for the MAC agent + * \author Xenofon Foukas + * \date 2016 + * \version 0.1 + */ + +#include +#include + +#include "flexran_agent_common_internal.h" +#include "flexran_agent_mac_internal.h" + +Protocol__FlexranMessage * flexran_agent_generate_diff_mac_stats_report(Protocol__FlexranMessage *new_message, + Protocol__FlexranMessage *old_message) { + + int i, j; + + Protocol__FlexStatsReply *old_report, *new_report; + + Protocol__FlexStatsReply *stats_reply_msg = NULL; + Protocol__FlexranMessage *msg = NULL; + + Protocol__FlexUeStatsReport **ue_report; + Protocol__FlexUeStatsReport *tmp_ue_report[NUM_MAX_UE]; + Protocol__FlexCellStatsReport **cell_report; + Protocol__FlexCellStatsReport *tmp_cell_report[NUM_MAX_UE]; + + old_report = old_message->stats_reply_msg; + new_report = new_message->stats_reply_msg; + + /*See how many and which UE reports should be included in the final stats message*/ + int n_ue_report = 0; + int ue_found = 0; + + /*Go through each RNTI of the new report and see if it exists in the old one*/ + for (i = 0; i < new_report->n_ue_report; i++) { + for (j = 0; j < old_report->n_ue_report; i++) { + if (new_report->ue_report[i]->rnti == old_report->ue_report[j]->rnti) { + ue_found = 1; + /*Need to check if something changed*/ + if (compare_ue_stats_reports(new_report->ue_report[i], old_report->ue_report[j]) != 0) { + tmp_ue_report[n_ue_report] = copy_ue_stats_report(new_report->ue_report[i]); + n_ue_report++; + } + break; + } + } + if (!ue_found) { + tmp_ue_report[n_ue_report] = copy_ue_stats_report(new_report->ue_report[i]); + n_ue_report++; + } + ue_found = 0; + } + + /*See how many and which cell reports should be included in the final stats message*/ + int n_cell_report = 0; + int cell_found = 0; + + /*Go through each cell of the new report and see if it exists in the old one*/ + for (i = 0; i < new_report->n_cell_report; i++) { + for (j = 0; j < old_report->n_cell_report; i++) { + if (new_report->cell_report[i]->carrier_index == old_report->cell_report[j]->carrier_index) { + cell_found = 1; + /*Need to check if something changed*/ + if (compare_cell_stats_reports(new_report->cell_report[i], old_report->cell_report[j]) != 0) { + tmp_cell_report[n_cell_report] = copy_cell_stats_report(new_report->cell_report[i]); + n_cell_report++; + } + break; + } + } + if (!cell_found) { + tmp_cell_report[n_cell_report] = copy_cell_stats_report(new_report->cell_report[i]); + n_cell_report++; + } + cell_found = 0; + } + + if (n_cell_report > 0 || n_ue_report > 0) { + /*Create header*/ + int xid = old_report->header->xid; + Protocol__FlexHeader *header; + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_STATS_REPLY, &header) != 0) { + goto error; + } + stats_reply_msg = malloc(sizeof(Protocol__FlexStatsReply)); + protocol__flex_stats_reply__init(stats_reply_msg); + + stats_reply_msg->header = header; + + /*TODO: create the reply message based on the findings*/ + /*Create ue report list*/ + stats_reply_msg->n_ue_report = n_ue_report; + if (n_ue_report > 0) { + ue_report = malloc(sizeof(Protocol__FlexUeStatsReport *)); + for (i = 0; iue_report = ue_report; + } + + /*Create cell report list*/ + stats_reply_msg->n_cell_report = n_cell_report; + if (n_cell_report > 0) { + cell_report = malloc(sizeof(Protocol__FlexCellStatsReport *)); + for (i = 0; icell_report = cell_report; + } + + msg = malloc(sizeof(Protocol__FlexranMessage)); + if(msg == NULL) + goto error; + protocol__flexran_message__init(msg); + msg->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_STATS_REPLY_MSG; + msg->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__SUCCESSFUL_OUTCOME; + msg->stats_reply_msg = stats_reply_msg; + } + return msg; + + error: + return NULL; +} + +int compare_ue_stats_reports(Protocol__FlexUeStatsReport *rep1, + Protocol__FlexUeStatsReport *rep2) { + return 1; +} + +int compare_cell_stats_reports(Protocol__FlexCellStatsReport *rep1, + Protocol__FlexCellStatsReport *rep2) { + return 1; +} + +Protocol__FlexUeStatsReport * copy_ue_stats_report(Protocol__FlexUeStatsReport * original) { + int i; + Protocol__FlexUeStatsReport *copy = malloc(sizeof(Protocol__FlexUeStatsReport)); + if (copy == NULL) + goto error; + protocol__flex_ue_stats_report__init(copy); + copy->rnti = original->rnti; + copy->has_rnti = original->has_rnti; + copy->flags = original->flags; + copy->has_flags = original->has_flags; + + if (copy->flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_BSR) { + copy->n_bsr = original->n_bsr; + if (copy->n_bsr > 0) { + uint32_t *elem; + elem = (uint32_t *) malloc(sizeof(uint32_t)*copy->n_bsr); + if (elem == NULL) + goto error; + for (i = 0; i < original->n_bsr; i++) { + elem[i] = original->bsr[i]; + } + copy->bsr = elem; + } + } + + if (copy->flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_PRH) { + copy->has_phr = original->has_phr; + copy->phr = original->phr; + } + + if (copy->flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_RLC_BS) { + copy->n_rlc_report = original->n_rlc_report; + if (copy->n_rlc_report > 0) { + Protocol__FlexRlcBsr ** rlc_reports; + rlc_reports = malloc(sizeof(Protocol__FlexRlcBsr) * copy->n_rlc_report); + if (rlc_reports == NULL) + goto error; + for (i = 0; i < copy->n_rlc_report; i++) { + rlc_reports[i] = copy_rlc_report(original->rlc_report[i]); + } + copy->rlc_report = rlc_reports; + } + } + + if (copy->flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_MAC_CE_BS) { + copy->has_pending_mac_ces = original->has_pending_mac_ces; + copy->pending_mac_ces = original->pending_mac_ces; + + } + + if (copy->flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_DL_CQI) { + copy->dl_cqi_report = copy_dl_cqi_report(original->dl_cqi_report); + } + + if (copy->flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_PBS) { + /*Copy the Paging Buffer report*/ + copy->pbr = copy_paging_buffer_report(original->pbr); + } + + if (copy->flags & PROTOCOL__FLEX_UE_STATS_TYPE__FLUST_UL_CQI) { + /*TODO: Copy the UL report*/ + copy->ul_cqi_report = copy_ul_cqi_report(original->ul_cqi_report); + } + + return copy; + + error: + return NULL; +} + +Protocol__FlexRlcBsr * copy_rlc_report(Protocol__FlexRlcBsr * original) { + Protocol__FlexRlcBsr * copy = malloc(sizeof(Protocol__FlexRlcBsr)); + if (copy == NULL) + goto error; + protocol__flex_rlc_bsr__init(copy); + copy->lc_id = original->lc_id; + copy->has_lc_id = original->has_lc_id; + copy->tx_queue_size = original->tx_queue_size; + copy->has_tx_queue_size = original->has_tx_queue_size; + copy->tx_queue_hol_delay = original->tx_queue_hol_delay; + copy->has_tx_queue_hol_delay = original->has_tx_queue_hol_delay; + copy->retransmission_queue_size = original->retransmission_queue_size; + copy->has_retransmission_queue_size = original->has_retransmission_queue_size; + copy->retransmission_queue_hol_delay = original->retransmission_queue_hol_delay; + copy->has_retransmission_queue_hol_delay = original->has_retransmission_queue_hol_delay; + copy->status_pdu_size = original->status_pdu_size; + copy->has_status_pdu_size = original->has_status_pdu_size; + + return copy; + + error: + return NULL; +} + +Protocol__FlexUlCqiReport * copy_ul_cqi_report(Protocol__FlexUlCqiReport * original) { + int i, j; + + //Fill in the full UL CQI report of the UE + Protocol__FlexUlCqiReport *full_ul_report; + full_ul_report = malloc(sizeof(Protocol__FlexUlCqiReport)); + if(full_ul_report == NULL) { + goto error; + } + protocol__flex_ul_cqi_report__init(full_ul_report); + //TODO:Set the SFN and SF of the generated report + full_ul_report->sfn_sn = original->sfn_sn; + full_ul_report->has_sfn_sn = original->has_sfn_sn; + full_ul_report->n_cqi_meas = original->n_cqi_meas; + + Protocol__FlexUlCqi **ul_report; + ul_report = malloc(sizeof(Protocol__FlexUlCqi *) * full_ul_report->n_cqi_meas); + if(ul_report == NULL) + goto error; + for(i = 0; i < full_ul_report->n_cqi_meas; i++) { + ul_report[i] = malloc(sizeof(Protocol__FlexUlCqi)); + if(ul_report[i] == NULL) + goto error; + protocol__flex_ul_cqi__init(ul_report[i]); + ul_report[i]->type = original->cqi_meas[i]->type; + ul_report[i]->has_type = original->cqi_meas[i]->has_type; + ul_report[i]->n_sinr = original->cqi_meas[i]->n_sinr; + uint32_t *sinr_meas; + sinr_meas = (uint32_t *) malloc(sizeof(uint32_t) * ul_report[i]->n_sinr); + if (sinr_meas == NULL) + goto error; + for (j = 0; j < ul_report[i]->n_sinr; j++) { + sinr_meas[j] = original->cqi_meas[i]->sinr[j]; + } + ul_report[i]->sinr = sinr_meas; + ul_report[i]->serv_cell_index = original->cqi_meas[i]->serv_cell_index; + ul_report[i]->has_serv_cell_index = original->cqi_meas[i]->has_serv_cell_index; + } + full_ul_report->cqi_meas = ul_report; + + return full_ul_report; + + error: + return NULL; +} + +Protocol__FlexDlCqiReport * copy_dl_cqi_report(Protocol__FlexDlCqiReport * original) { + int i; + /*Copy the DL report*/ + Protocol__FlexDlCqiReport * dl_report; + dl_report = malloc(sizeof(Protocol__FlexDlCqiReport)); + if (dl_report == NULL) + goto error; + protocol__flex_dl_cqi_report__init(dl_report); + + dl_report->sfn_sn = original->sfn_sn; + dl_report->has_sfn_sn = original->has_sfn_sn; + dl_report->n_csi_report = original->n_csi_report; + + Protocol__FlexDlCsi **csi_reports; + csi_reports = malloc(sizeof(Protocol__FlexDlCsi *) * dl_report->n_csi_report); + if (csi_reports == NULL) + goto error; + + for (i = 0; i < dl_report->n_csi_report; i++) { + csi_reports[i] = copy_csi_report(original->csi_report[i]); + } + dl_report->csi_report = csi_reports; + return dl_report; + + error: + /*TODO: Must free memory properly*/ + return NULL; +} + +Protocol__FlexPagingBufferReport * copy_paging_buffer_report(Protocol__FlexPagingBufferReport *original) { + + int i; + Protocol__FlexPagingBufferReport *copy; + copy = malloc(sizeof(Protocol__FlexPagingBufferReport)); + if (copy == NULL) + goto error; + + protocol__flex_paging_buffer_report__init(copy); + copy->n_paging_info = original->n_paging_info; + + Protocol__FlexPagingInfo **p_info; + p_info = malloc(sizeof(Protocol__FlexPagingInfo *) * copy->n_paging_info); + if (p_info == NULL) + goto error; + for (i = 0; i < copy->n_paging_info; i++) { + p_info[i] = malloc(sizeof(Protocol__FlexPagingInfo)); + if(p_info[i] == NULL) + goto error; + protocol__flex_paging_info__init(p_info[i]); + p_info[i]->paging_index = original->paging_info[i]->paging_index; + p_info[i]->has_paging_index = original->paging_info[i]->has_paging_index;; + p_info[i]->paging_message_size = original->paging_info[i]->paging_message_size; + p_info[i]->has_paging_message_size = original->paging_info[i]->has_paging_message_size; + p_info[i]->paging_subframe = original->paging_info[i]->paging_subframe; + p_info[i]->has_paging_subframe = original->paging_info[i]->has_paging_subframe; + p_info[i]->carrier_index = original->paging_info[i]->carrier_index; + p_info[i]->has_carrier_index = original->paging_info[i]->has_carrier_index; + } + copy->paging_info = p_info; + return copy; + + error: + /*TODO: free memory properly*/ + return NULL; +} + +Protocol__FlexDlCsi * copy_csi_report(Protocol__FlexDlCsi * original) { + int i, j; + Protocol__FlexDlCsi *copy = malloc(sizeof(Protocol__FlexDlCsi)); + if (copy == NULL) + goto error; + protocol__flex_dl_csi__init(copy); + copy->serv_cell_index = original->serv_cell_index; + copy->has_serv_cell_index = original->has_serv_cell_index; + copy->ri = original->ri; + copy->has_ri = original->ri; + + copy->type = original->type; + copy->has_type = original->has_type; + copy->report_case = original->report_case; + + switch (copy->report_case) { + case PROTOCOL__FLEX_DL_CSI__REPORT_P10CSI: + copy->p10csi->wb_cqi = original->p10csi->wb_cqi; + copy->p10csi->has_wb_cqi = original->p10csi->has_wb_cqi; + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_P11CSI: + copy->p11csi->n_wb_cqi = original->p11csi->n_wb_cqi; + copy->p11csi->wb_cqi = (uint32_t *) malloc(sizeof(uint32_t) * copy->p11csi->n_wb_cqi); + for (i = 0; i < copy->p11csi->n_wb_cqi; i++) { + copy->p11csi->wb_cqi[i] = original->p11csi->wb_cqi[i]; + } + copy->p11csi->has_wb_pmi = original->p11csi->has_wb_pmi; + copy->p11csi->wb_pmi = original->p11csi->wb_pmi; + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_P20CSI: + copy->p20csi->has_wb_cqi = original->p20csi->has_wb_cqi; + copy->p20csi->wb_cqi = original->p20csi->wb_cqi; + copy->p20csi->has_sb_cqi = original->p20csi->has_sb_cqi; + copy->p20csi->sb_cqi = original->p20csi->sb_cqi; + copy->p20csi->has_bandwidth_part_index = original->p20csi->has_bandwidth_part_index; + copy->p20csi->bandwidth_part_index = original->p20csi->bandwidth_part_index; + copy->p20csi->has_sb_index = original->p20csi->has_sb_index; + copy->p20csi->sb_index = original->p20csi->sb_index; + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_P21CSI: + copy->p21csi->n_wb_cqi = original->p21csi->n_wb_cqi; + copy->p21csi->wb_cqi = (uint32_t *) malloc(sizeof(uint32_t) * copy->p21csi->n_wb_cqi); + for (i = 0; i < copy->p21csi->n_wb_cqi; i++) { + copy->p21csi->wb_cqi[i] = original->p21csi->wb_cqi[i]; + } + copy->p21csi->has_wb_pmi = original->p21csi->has_wb_pmi; + copy->p21csi->wb_pmi = original->p21csi->wb_pmi; + copy->p21csi->n_sb_cqi = original->p21csi->n_sb_cqi; + copy->p21csi->sb_cqi = (uint32_t *) malloc(sizeof(uint32_t) * copy->p21csi->n_sb_cqi); + for (i = 0; i < copy->p21csi->n_sb_cqi; i++) { + copy->p21csi->sb_cqi[i] = original->p21csi->sb_cqi[i]; + } + copy->p21csi->has_badwidth_part_index = original->p21csi->has_badwidth_part_index; + copy->p21csi->badwidth_part_index = original->p21csi->badwidth_part_index; + copy->p21csi->has_sb_index = original->p21csi->has_sb_index; + copy->p21csi->sb_index = original->p21csi->sb_index; + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_A12CSI: + copy->a12csi->n_wb_cqi = original->a12csi->n_wb_cqi; + copy->a12csi->wb_cqi = (uint32_t *) malloc(sizeof(uint32_t) * copy->a12csi->n_wb_cqi); + for (i = 0; i < copy->a12csi->n_wb_cqi; i++) { + copy->a12csi->wb_cqi[i] = original->a12csi->wb_cqi[i]; + } + copy->a12csi->n_sb_pmi = original->a12csi->n_sb_pmi; + copy->a12csi->sb_pmi = (uint32_t *) malloc(sizeof(uint32_t) * copy->a12csi->n_sb_pmi); + for (i = 0; i < copy->a12csi->n_sb_pmi; i++) { + copy->a12csi->sb_pmi[i] = original->a12csi->sb_pmi[i]; + } + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_A22CSI: + copy->a22csi->n_wb_cqi = original->a22csi->n_wb_cqi; + copy->a22csi->wb_cqi = (uint32_t *) malloc(sizeof(uint32_t) * copy->a22csi->n_wb_cqi); + for (i = 0; i < copy->a22csi->n_wb_cqi; i++) { + copy->a22csi->wb_cqi[i] = original->a22csi->wb_cqi[i]; + } + copy->a22csi->n_sb_cqi = original->a22csi->n_sb_cqi; + copy->a22csi->sb_cqi = (uint32_t *) malloc(sizeof(uint32_t) * copy->a22csi->n_sb_cqi); + for (i = 0; i < copy->a22csi->n_sb_cqi; i++) { + copy->a22csi->sb_cqi[i] = original->a22csi->sb_cqi[i]; + } + copy->a22csi->has_wb_pmi = original->a22csi->has_wb_pmi; + copy->a22csi->wb_pmi = original->a22csi->wb_pmi; + copy->a22csi->has_sb_pmi = original->a22csi->has_sb_pmi; + copy->a22csi->sb_pmi = original->a22csi->sb_pmi; + copy->a22csi->n_sb_list = original->a22csi->n_sb_list; + copy->a22csi->sb_list = (uint32_t *) malloc(sizeof(uint32_t) * copy->a22csi->n_sb_list); + for (i = 0; i < copy->a22csi->n_sb_list; i++) { + copy->a22csi->sb_list[i] = original->a22csi->sb_list[i]; + } + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_A20CSI: + copy->a20csi->has_wb_cqi = original->a20csi->has_wb_cqi; + copy->a20csi->wb_cqi = original->a20csi->wb_cqi; + copy->a20csi->has_sb_cqi = original->a20csi->has_sb_cqi; + copy->a20csi->sb_cqi = original->a20csi->sb_cqi; + copy->a20csi->n_sb_list = original->a20csi->n_sb_list; + copy->a20csi->sb_list = (uint32_t *) malloc(sizeof(uint32_t) * copy->a20csi->n_sb_list); + for (i = 0; i < copy->a20csi->n_sb_list; i++) { + copy->a20csi->sb_list[i] = original->a20csi->sb_list[i]; + } + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_A30CSI: + copy->a30csi->has_wb_cqi = original->a30csi->has_wb_cqi; + copy->a30csi->wb_cqi = original->a30csi->wb_cqi; + copy->a30csi->n_sb_cqi = original->a30csi->n_sb_cqi; + copy->a30csi->sb_cqi = (uint32_t *) malloc(sizeof(uint32_t) * copy->a30csi->n_sb_cqi); + for (i = 0; i < copy->a30csi->n_sb_cqi; i++) { + copy->a30csi->sb_cqi[i] = original->a30csi->sb_cqi[i]; + } + break; + case PROTOCOL__FLEX_DL_CSI__REPORT_A31CSI: + copy->a31csi->n_wb_cqi = original->a31csi->n_wb_cqi; + copy->a31csi->wb_cqi = (uint32_t *) malloc(sizeof(uint32_t) * copy->a31csi->n_wb_cqi); + for (i = 0; i < copy->a31csi->n_wb_cqi; i++) { + copy->a31csi->wb_cqi[i] = original->a31csi->wb_cqi[i]; + } + copy->a31csi->has_wb_pmi = original->a31csi->has_wb_pmi; + copy->a31csi->wb_pmi = original->a31csi->wb_pmi; + copy->a31csi->n_sb_cqi = original->a31csi->n_sb_cqi; + copy->a31csi->sb_cqi = malloc(sizeof(Protocol__FlexMsbCqi *) * copy->a31csi->n_sb_cqi); + if (copy->a31csi == NULL) { + goto error; + } + for (i = 0; i < copy->a31csi->n_sb_cqi; i++) { + copy->a31csi->sb_cqi[i] = malloc(sizeof(Protocol__FlexMsbCqi)); + if (copy->a31csi->sb_cqi[i] == NULL) { + goto error; + } + protocol__flex_msb_cqi__init(copy->a31csi->sb_cqi[i]); + copy->a31csi->sb_cqi[i]->n_sb_cqi = original->a31csi->sb_cqi[i]->n_sb_cqi; + copy->a31csi->sb_cqi[i]->sb_cqi = (uint32_t *) malloc(sizeof(uint32_t) * copy->a31csi->sb_cqi[i]->n_sb_cqi); + for (j = 0; j < copy->a31csi->sb_cqi[i]->n_sb_cqi; j++) { + copy->a31csi->sb_cqi[i]->sb_cqi[j] = original->a31csi->sb_cqi[i]->sb_cqi[j]; + } + } + break; + default: + goto error; + } + return copy; + + error: + return NULL; +} + +Protocol__FlexCellStatsReport * copy_cell_stats_report(Protocol__FlexCellStatsReport *original) { + + Protocol__FlexCellStatsReport * copy = malloc(sizeof(Protocol__FlexCellStatsReport)); + + if(copy == NULL) { + goto error; + } + protocol__flex_cell_stats_report__init(copy); + copy->carrier_index = original->carrier_index; + copy->has_carrier_index = original->has_carrier_index; + copy->flags = original->flags; + copy->has_flags = original->has_flags; + + if(copy->flags & PROTOCOL__FLEX_CELL_STATS_TYPE__FLCST_NOISE_INTERFERENCE) { + copy->noise_inter_report = copy_noise_inter_report(original->noise_inter_report); + } + + return copy; + + error: + return NULL; +} + +Protocol__FlexNoiseInterferenceReport * copy_noise_inter_report(Protocol__FlexNoiseInterferenceReport *original) { + Protocol__FlexNoiseInterferenceReport *ni_report; + ni_report = malloc(sizeof(Protocol__FlexNoiseInterferenceReport)); + if(ni_report == NULL) { + goto error; + } + protocol__flex_noise_interference_report__init(ni_report); + // Current frame and subframe number + ni_report->sfn_sf = original->sfn_sf; + ni_report->has_sfn_sf = original->sfn_sf; + // Received interference power in dbm + ni_report->rip = original->rip; + ni_report->has_rip = original->has_rip; + // Thermal noise power in dbm + ni_report->tnp = original->tnp; + ni_report->has_tnp = original->has_tnp; + + return ni_report; + + error: + return NULL; +} + + +int parse_mac_config(mid_t mod_id, yaml_parser_t *parser) { + + yaml_event_t event; + + int done = 0; + + int sequence_started = 0; + int mapping_started = 0; + + while (!done) { + + if (!yaml_parser_parse(parser, &event)) + goto error; + + switch (event.type) { + case YAML_SEQUENCE_START_EVENT: + LOG_D(ENB_APP, "A sequence just started as expected\n"); + sequence_started = 1; + break; + case YAML_SEQUENCE_END_EVENT: + LOG_D(ENB_APP, "A sequence ended\n"); + sequence_started = 0; + break; + case YAML_MAPPING_START_EVENT: + if (!sequence_started) { + goto error; + } + LOG_D(ENB_APP, "A mapping started\n"); + mapping_started = 1; + break; + case YAML_MAPPING_END_EVENT: + if (!mapping_started) { + goto error; + } + LOG_D(ENB_APP, "A mapping ended\n"); + mapping_started = 0; + break; + case YAML_SCALAR_EVENT: + if (!mapping_started) { + goto error; + } + // Check the types of subsystems offered and handle their values accordingly + if (strcmp((char *) event.data.scalar.value, "dl_scheduler") == 0) { + LOG_D(ENB_APP, "This is for the dl_scheduler subsystem\n"); + // Call the proper handler + if (parse_dl_scheduler_config(mod_id, parser) == -1) { + LOG_D(ENB_APP, "An error occured\n"); + goto error; + } + } else if (strcmp((char *) event.data.scalar.value, "ul_scheduler") == 0) { + // Call the proper handler + LOG_D(ENB_APP, "This is for the ul_scheduler subsystem\n"); + goto error; + // TODO + } else if (strcmp((char *) event.data.scalar.value, "ra_scheduler") == 0) { + // Call the proper handler + // TODO + } else if (strcmp((char *) event.data.scalar.value, "page_scheduler") == 0) { + // Call the proper handler + // TODO + } else { + // Unknown subsystem + goto error; + } + break; + default: // We expect nothing else at this level of the hierarchy + goto error; + } + + done = (event.type == YAML_SEQUENCE_END_EVENT); + + yaml_event_delete(&event); + + } + + return 0; + + error: + yaml_event_delete(&event); + return -1; + +} + +int parse_dl_scheduler_config(mid_t mod_id, yaml_parser_t *parser) { + + yaml_event_t event; + + int done = 0; + int mapping_started = 0; + + while (!done) { + + if (!yaml_parser_parse(parser, &event)) + goto error; + + switch (event.type) { + // We are expecting a mapping (behavior and parameters) + case YAML_MAPPING_START_EVENT: + LOG_D(ENB_APP, "The mapping of the subsystem started\n"); + mapping_started = 1; + break; + case YAML_MAPPING_END_EVENT: + LOG_D(ENB_APP, "The mapping of the subsystem ended\n"); + mapping_started = 0; + break; + case YAML_SCALAR_EVENT: + if (!mapping_started) { + goto error; + } + // Check what key needs to be set + if (strcmp((char *) event.data.scalar.value, "behavior") == 0) { + LOG_I(ENB_APP, "Time to set the behavior attribute\n"); + yaml_event_delete(&event); + if (!yaml_parser_parse(parser, &event)) { + goto error; + } + if (event.type == YAML_SCALAR_EVENT) { + if (load_dl_scheduler_function(mod_id, (char *) event.data.scalar.value) == -1) { + goto error; + } + } else { + goto error; + } + } else if (strcmp((char *) event.data.scalar.value, "parameters") == 0) { + LOG_D(ENB_APP, "Now it is time to set the parameters for this subsystem\n"); + if (parse_dl_scheduler_parameters(mod_id, parser) == -1) { + goto error; + } + } + break; + default: + goto error; + } + + done = (event.type == YAML_MAPPING_END_EVENT); + yaml_event_delete(&event); + } + + return 0; + + error: + yaml_event_delete(&event); + return -1; +} + +int parse_dl_scheduler_parameters(mid_t mod_id, yaml_parser_t *parser) { + yaml_event_t event; + + void *param; + + int done = 0; + int mapping_started = 0; + + while (!done) { + + if (!yaml_parser_parse(parser, &event)) + goto error; + + switch (event.type) { + // We are expecting a mapping of parameters + case YAML_MAPPING_START_EVENT: + LOG_D(ENB_APP, "The mapping of the parameters started\n"); + mapping_started = 1; + break; + case YAML_MAPPING_END_EVENT: + LOG_D(ENB_APP, "The mapping of the parameters ended\n"); + mapping_started = 0; + break; + case YAML_SCALAR_EVENT: + if (!mapping_started) { + goto error; + } + // Check what key needs to be set + if (mac_agent_registered[mod_id]) { + LOG_D(ENB_APP, "Setting parameter %s\n", event.data.scalar.value); + param = dlsym(agent_mac_xface[mod_id]->dl_scheduler_loaded_lib, + (char *) event.data.scalar.value); + if (param == NULL) { + goto error; + } + apply_parameter_modification(param, parser); + } else { + goto error; + } + break; + default: + goto error; + } + + done = (event.type == YAML_MAPPING_END_EVENT); + yaml_event_delete(&event); + } + + return 0; + + error: + yaml_event_delete(&event); + return -1; +} + +int load_dl_scheduler_function(mid_t mod_id, const char *function_name) { + void *lib; + + char lib_name[120]; + char target[512]; + snprintf(lib_name, sizeof(lib_name), "/%s.so", function_name); + strcpy(target, local_cache); + strcat(target, lib_name); + + LOG_I(FLEXRAN_AGENT, "Opening pushed code: %s\n", target); + lib = dlopen(target, RTLD_NOW); + if (lib == NULL) { + LOG_I(FLEXRAN_AGENT, "Could not load library\n"); + goto error; + } + + LOG_I(FLEXRAN_AGENT, "Loading function: %s\n", function_name); + void *loaded_scheduler = dlsym(lib, function_name); + if (loaded_scheduler) { + if (mac_agent_registered[mod_id]) { + agent_mac_xface[mod_id]->flexran_agent_schedule_ue_spec = loaded_scheduler; + if (agent_mac_xface[mod_id]->dl_scheduler_loaded_lib != NULL) { + dlclose(agent_mac_xface[mod_id]->dl_scheduler_loaded_lib); + } + agent_mac_xface[mod_id]->dl_scheduler_loaded_lib = lib; + LOG_I(FLEXRAN_AGENT, "New DL UE scheduler: %s\n", function_name); + } + } else { + LOG_I(FLEXRAN_AGENT, "Scheduler could not be loaded\n"); + } + + return 0; + + error: + return -1; + +} diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.h b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.h new file mode 100644 index 0000000000..263b85eb87 --- /dev/null +++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac_internal.h @@ -0,0 +1,106 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_mac_internal.h + * \brief Implementation specific definitions for the FlexRAN MAC agent + * \author Xenofon Foukas + * \date 2016 + * \version 0.1 + */ + +#ifndef FLEXRAN_AGENT_MAC_INTERNAL_H_ +#define FLEXRAN_AGENT_MAC_INTERNAL_H_ + +#include + +#include + +#include "flexran_agent_mac.h" +#include "flexran_agent_common.h" +#include "flexran_agent_defs.h" + +/*This will be used for producing continuous status updates for the MAC + *Needs to be thread-safe + */ +typedef struct { + /*Flag showing if continuous mac stats update is enabled*/ + uint8_t is_initialized; + volatile uint8_t cont_update; + xid_t xid; + Protocol__FlexranMessage *stats_req; + Protocol__FlexranMessage *prev_stats_reply; + + pthread_mutex_t *mutex; +} mac_stats_updates_context_t; + +/*Array holding the last stats reports for each eNB. Used for continuous reporting*/ +mac_stats_updates_context_t mac_stats_context[NUM_MAX_ENB]; + +/*Functions to initialize and destroy the struct required for the + *continuous stats update report*/ +err_code_t flexran_agent_init_cont_mac_stats_update(mid_t mod_id); + +err_code_t flexran_agent_destroy_cont_mac_stats_update(mid_t mod_id); + + +/*Enable/Disable the continuous stats update service for the MAC*/ +err_code_t flexran_agent_enable_cont_mac_stats_update(mid_t mod_id, xid_t xid, + stats_request_config_t *stats_req); + +err_code_t flexran_agent_disable_cont_mac_stats_update(mid_t mod_id); + +Protocol__FlexranMessage * flexran_agent_generate_diff_mac_stats_report(Protocol__FlexranMessage *new_report, + Protocol__FlexranMessage *old_report); + +Protocol__FlexUeStatsReport * copy_ue_stats_report(Protocol__FlexUeStatsReport * original); + +Protocol__FlexCellStatsReport * copy_cell_stats_report(Protocol__FlexCellStatsReport *original); + +Protocol__FlexRlcBsr * copy_rlc_report(Protocol__FlexRlcBsr * original); + +Protocol__FlexUlCqiReport * copy_ul_cqi_report(Protocol__FlexUlCqiReport * original); + +Protocol__FlexDlCqiReport * copy_dl_cqi_report(Protocol__FlexDlCqiReport * original); + +Protocol__FlexPagingBufferReport * copy_paging_buffer_report(Protocol__FlexPagingBufferReport *original); + +Protocol__FlexDlCsi * copy_csi_report(Protocol__FlexDlCsi * original); + +Protocol__FlexNoiseInterferenceReport * copy_noise_inter_report(Protocol__FlexNoiseInterferenceReport *original); + +int compare_ue_stats_reports(Protocol__FlexUeStatsReport *rep1, + Protocol__FlexUeStatsReport *rep2); + +int compare_cell_stats_reports(Protocol__FlexCellStatsReport *rep1, + Protocol__FlexCellStatsReport *rep2); + + +/* Functions for parsing the MAC agent policy reconfiguration command */ + +int parse_mac_config(mid_t mod_id, yaml_parser_t *parser); + +int parse_dl_scheduler_config(mid_t mod_id, yaml_parser_t *parser); + +int parse_dl_scheduler_parameters(mid_t mod_id, yaml_parser_t *parser); + +int load_dl_scheduler_function(mid_t mod_id, const char *function_name); + +#endif /*FLEXRAN_AGENT_MAC_INTERNAL_H_*/ diff --git a/openair2/ENB_APP/MESSAGES/V2/config_common.proto b/openair2/ENB_APP/MESSAGES/V2/config_common.proto new file mode 100644 index 0000000000..7b392b6b3b --- /dev/null +++ b/openair2/ENB_APP/MESSAGES/V2/config_common.proto @@ -0,0 +1,180 @@ +syntax = "proto2"; +package protocol; + +// +// Cell config related structures and enums +// + +message flex_si_config { + optional uint32 sfn = 1; + optional uint32 sib1_length = 2; // The length of SIB1 in bytes + optional uint32 si_window_length = 3; // The scheduling window for all SIs in SF + repeated flex_si_message si_message = 4; // List of SI messages to be sent. + // The index identifies the type of an SI message + // 0 - SIB1 + // 1..31 - SIx + // 32..63 - PCCH +} + +message flex_si_message { + optional uint32 periodicity = 1; // Periodicity of SI msg in radio frames + optional uint32 length = 2; // The length of the SI message in bytes +} + +enum flex_hopping_mode { + FLHM_INTER = 0; + FLHM_INTERINTRA = 1; +} + +enum flex_phich_resource { + FLPR_ONE_SIXTH = 0; + FLPR_HALF = 1; + FLPR_ONE = 2; + FLPR_TWO = 3; +} + +enum flex_phich_duration { + FLPD_NORMAL = 0; + FLPD_EXTENDED = 1; +} + +enum flex_ul_cyclic_prefix_length { + FLUCPL_NORMAL = 0; + FLUCPL_EXTENDED = 1; +} + +enum flex_dl_cyclic_prefix_length { + FLDCPL_NORMAL = 0; + FLDCPL_EXTENDED = 1; +} + +enum flex_duplex_mode { + FLDM_TDD = 0; + FLDM_FDD = 1; +} + +enum flex_qam { + FLEQ_MOD_16QAM = 0; + FLEQ_MOD_64QAM = 1; +} + +// +// UE config related structures and enums +// + +message flex_drx_config { + optional uint32 on_duration_timer = 1; // Timer in SF. See TS 36.321 + optional uint32 drx_inactivity_timer = 2; // Timer in SF. See TS 36.321 + optional uint32 drx_retransmission_timer = 3; // Timer in SF. See TS 36.321 + optional uint32 long_drx_cycle = 4; // In SF. See TS 36.321 + optional uint32 long_drx_cycle_start_offset = 5;// See TS 36.321 + optional uint32 short_drx_cycle = 6; // In SF + optional uint32 drx_short_cycle_timer = 7; // Timer in subframes. See TS 36.321 +} + +message flex_sps_config { + optional uint32 semi_persistent_sched_interval_UL = 1; // SPS UL scheduling interval in SF + optional uint32 semi_persistent_sched_interval_DL = 2; // SPS DL scheduling interval in SF + optional uint32 num_of_conf_sps_proc = 3; // Number of SPS HARQ processes. See TS 36.321 + repeated uint32 n1_PUCCH_AN_persistent_element = 4;// See TS36.213. Ignored when config is used + // as part of FLPT_SET_UE_CONFIG + optional uint32 implicit_release_after = 5; // number of empty transmissions before release of SPS +} + +message flex_sr_config { + optional uint32 sr_action = 1; // Indicates if SR config should be changed or released + // One of the FLSRA_* enum values + optional uint32 sched_interval = 2; // SR scheduling interval in SF + optional uint32 dsr_trans_max = 3; // See TS 36.213 +} + +message flex_cqi_config { + optional uint32 cqi_action = 1; // Indicats if CQI changed or released. + // One of the FLSRA_* enum values + optional uint32 cqi_sched_interval = 2; // CQI scheduling interval in SF + optional uint32 ri_sched_interval = 3; // RI scheduling interval in SF +} + +message flex_ue_capabilities { + optional uint32 half_duplex = 1; // Boolean value. Only half duplex support. FDD operation + optional uint32 intra_SF_hopping = 2; // Support for intra-subframe hopping. Boolean value + optional uint32 type2_sb_1 = 3; // Support for type 2 hopping with n_sb > 1 + optional uint32 ue_category = 4; + optional uint32 res_alloc_type1 = 5; // Boolean value. UE support for resource allocation type 1 +} + +message flex_scell_config { + optional uint32 carrier_index = 1; // Id of the carrier component + optional uint32 scell_index = 2; // Index of this Scell (RRC SCellIndex) + optional uint32 use_ccs = 3; // Boolean value. Indicates if cross-carrier scheduling + // is used by this SCell + optional uint32 sched_cell_index = 4; // Index of the cell responsible for scheduling + // this SCell if cross-carrier scheduling is enabled + optional uint32 pdsch_start = 5; // Starting OFDM symbol of PDSCH data region for this SCell +} + +enum flex_meas_gap_config_pattern { + FLMGCP_GP1 = 0; + FLMGCP_GP2 = 1; + FLMGCP_OFF = 2; +} + +enum flex_setup_release_action { + FLSRA_SETUP = 0; + FLSRA_RELEASE = 1; +} + +enum flex_ue_transmission_antenna { + FLUTA_NONE = 0; + FLUTA_OPEN_LOOP = 1; + FLUTA_CLOSED_LOOP = 2; +} + +enum flex_aperiodic_cqi_report_mode { + FLACRM_RM12 = 0; + FLACRM_RM20 = 1; + FLACRM_RM22 = 2; + FLACRM_RM30 = 3; + FLACRM_RM31 = 4; + FLACRM_NONE = 5; +} + +enum flex_tdd_ack_nack_feedback_mode { + FLTANFM_BUNDLING = 0; + FLTANFM_MULTIPLEXING = 1; +} + +// +// Logical channel config related structures and enums +// + +message flex_lc_config { + optional uint32 lcid = 1; // The logical channel id + optional uint32 lcg = 2; // The logical channel group (0..3) the LC is mapped to + optional uint32 direction = 3; // The LC direction. One of the FLLCD_* enum values + optional uint32 qos_bearer_type = 4;// GBR or NGBR bearer. One of the FLQBT_* enum values + optional uint32 qci = 5; // The QCI defined in TS 23.203, coded as defined in TS 36.413 + // One less than the actual QCI value + optional uint64 e_RAB_max_bitrate_UL = 6; // In bps (GBR only) + optional uint64 e_RAB_max_bitrate_DL = 7; // In bps (GBR only) + optional uint64 e_RAB_guaranteed_bitrate_UL = 8; // In bps (GBR only) + optional uint64 e_RAB_guaranteed_bitrate_DL = 9; // In bps (GBR only) +} + +enum flex_lc_direction { + FLLCD_UL = 0; + FLLCD_DL = 1; + FLLCD_BOTH = 2; +} + +enum flex_qos_bearer_type { + FLQBT_NON_GBR = 0; + FLQBT_GBR = 1; +} + +enum flex_ue_state_change_type { + FLUESC_UPDATED = 0; + FLUESC_ACTIVATED = 1; + FLUESC_DEACTIVATED = 2; + FLUESC_MOVED = 3; +} \ No newline at end of file diff --git a/openair2/ENB_APP/MESSAGES/V2/config_messages.proto b/openair2/ENB_APP/MESSAGES/V2/config_messages.proto new file mode 100644 index 0000000000..ac939b828c --- /dev/null +++ b/openair2/ENB_APP/MESSAGES/V2/config_messages.proto @@ -0,0 +1,88 @@ +syntax = "proto2"; +package protocol; + +import "config_common.proto"; + +message flex_cell_config { + optional uint32 phy_cell_id = 1; // The PCI of this cell + optional uint32 cell_id = 2; // The PLMN cell id of this cell + optional uint32 pusch_hopping_offset = 3; // PUSCH resources in RBs for hopping + optional uint32 hopping_mode = 4; // One of the FLHM_* enum values + optional uint32 n_sb = 5; // The number of subbands + optional uint32 phich_resource = 6; // The number of REGs used for PHICH + // One of the FLPR_* enum values + optional uint32 phich_duration = 7; // One of the FLPD_* enum values + optional uint32 init_nr_PDCCH_OFDM_sym = 8; // See TS 36.211, section 6.9 + optional flex_si_config si_config = 9; // The SI configuration + optional uint32 dl_bandwidth = 10; // The DL transmission bandwidth in RBs + optional uint32 ul_bandwidth = 11; // The UL transmission bandwidth in RBs + optional uint32 ul_cyclic_prefix_length = 13; // One of the FLUCPL_* enum values + optional uint32 dl_cyclic_prefix_length = 14; // One of the FLDCPL_* enum values + optional uint32 antenna_ports_count = 15; // Number of cell specific antenna ports + optional uint32 duplex_mode = 16; // One of the FLDM_* enum values + optional uint32 subframe_assignment = 17; // DL/UL subframe assignment. TDD only + optional uint32 special_subframe_patterns = 18; // TDD only. See TS 36.211, table 4.2.1 + repeated uint32 mbsfn_subframe_config_rfperiod = 19; // The MBSFN radio frame period (Optional) + repeated uint32 mbsfn_subframe_config_rfoffset = 20; // The radio frame offset (Optional) + repeated uint32 mbsfn_subframe_config_sfalloc = 21; // Bitmap indicating the MBSFN subframes (Optional) + optional uint32 prach_config_index = 22; // See TS 36.211, section 5.7.1 + optional uint32 prach_freq_offset = 23; // See TS 36.211, section 5.7.1 + optional uint32 ra_response_window_size = 24; // The duration of the RA response window in SF + optional uint32 mac_contention_resolution_timer = 25; // Timer for RA + optional uint32 max_HARQ_Msg3Tx = 26; // See TS 36.321 + optional uint32 n1PUCCH_AN = 27; // See TS 36.213, section 10.1 + optional uint32 deltaPUCCH_shift = 28; // See TS 36.211, section 5.4 + optional uint32 nRB_cqi = 29; // See TS 36.211, section 5.4 + optional uint32 srs_subframe_config = 30; // See TS 36.211, table 5.5.3.3-1 and 2 + optional uint32 srs_bw_config = 31; // See TS 36.211, section 5.5.3.2 + optional uint32 srs_mac_up_pts = 32; // Boolean value. See TS 36.211, section 5.5.3.2. TDD only + optional uint32 enable_64QAM = 33; // One of the FLEQ_* enum values + optional uint32 carrier_index = 34; // Carrier component index +} + +message flex_ue_config { + optional uint32 rnti = 1; + optional flex_drx_config drx_config = 2; // The DRX configuration (Optional) + optional uint32 time_alignment_timer = 3; // Timer in SF. Control the synchronization + // status of the UE, not the actual advance procedure + // See TS 36.321 + optional uint32 meas_gap_config_pattern = 4; // Measurement gap configuration. + // One of the FLMGCP_* enum values + // See TS 36.133 + optional uint32 meas_gap_config_sf_offset = 5; // Measurement gap offset if applicable + optional flex_sps_config sps_config = 6; // The SPS configuration (Optional) + optional flex_sr_config sr_config = 7; // The SR configuration (Optional) + optional flex_cqi_config cqi_config = 8; // The CQI configuration (Optional) + optional uint32 transmission_mode = 9; // The UE transmission mode + optional uint64 ue_aggregated_max_bitrate_UL = 10; // Aggregated bit-rate of non-gbr bearer + // per UE. See TS 36.413 + optional uint64 ue_aggregated_max_bitrate_DL = 11; // Aggregated bit-rate of non-gbr bearer + // per UE. See TS 36.413 + optional flex_ue_capabilities capabilities = 12; + optional uint32 ue_transmission_antenna = 13; // One of the FLUTA_* enum values + optional uint32 tti_bundling = 14; // Boolean value. See TS 36.321 + optional uint32 max_HARQ_tx = 15; // The max HARQ retransmission for UL + optional uint32 beta_offset_ACK_index = 16; // See TS 36.213 + optional uint32 beta_offset_RI_index = 17; // See TS 36.213 + optional uint32 beta_offset_CQI_index = 18; // See TS 36.213 + optional uint32 ack_nack_simultaneous_trans = 19;// Boolean. See TS 36.213 + optional uint32 simultaneous_ack_nack_cqi = 20; // Boolean. See TS 36.213 + optional uint32 aperiodic_cqi_rep_mode = 21; // One of the FLACRM_* enum values + optional uint32 tdd_ack_nack_feedback = 22; // One of the FLTANFM_* enum values + optional uint32 ack_nack_repetition_factor = 23;// See TS 36.213, section 10.1 + optional uint32 extended_bsr_size = 24; // Boolean for extended BSR size + optional uint32 ca_support = 25; // Boolean. Support for carrier aggregation + optional uint32 cross_carrier_sched_support = 26; // Boolean value + optional uint32 pcell_carrier_index = 27; // Index of primary cell + repeated flex_scell_config scell_config = 28; // Secondary cells configuration + optional uint32 scell_deactivation_timer = 29;// Deactivation timer for secondary cell +} + +message flex_lc_ue_config { + optional uint32 rnti = 1; + repeated flex_lc_config lc_config = 2; // A list of LC configurations for the given UE +} + + + + diff --git a/openair2/ENB_APP/MESSAGES/V2/control_delegation.proto b/openair2/ENB_APP/MESSAGES/V2/control_delegation.proto new file mode 100644 index 0000000000..0f7e34de15 --- /dev/null +++ b/openair2/ENB_APP/MESSAGES/V2/control_delegation.proto @@ -0,0 +1,6 @@ +syntax = "proto2"; +package protocol; + +enum flex_control_delegation_type { + FLCDT_MAC_DL_UE_SCHEDULER = 1; // DL UE scheduler delegation +} \ No newline at end of file diff --git a/openair2/ENB_APP/MESSAGES/V2/controller_commands.proto b/openair2/ENB_APP/MESSAGES/V2/controller_commands.proto new file mode 100644 index 0000000000..c92f171b0e --- /dev/null +++ b/openair2/ENB_APP/MESSAGES/V2/controller_commands.proto @@ -0,0 +1,59 @@ +syntax = "proto2"; +package protocol; + +import "mac_primitives.proto"; + +// +// Body of UE DL MAC scheduling configuration info +// + +message flex_dl_data { + optional uint32 rnti = 1; + optional flex_dl_dci dl_dci = 2; + repeated uint32 ce_bitmap = 3; // list of 2 MAC CEs, one for each TB + repeated flex_rlc_pdu rlc_pdu = 4; // list of parameters for the creation of RLC PDUs. One for each lcid + optional uint32 serv_cell_index = 5; + optional uint32 act_deact_ce = 6; //Hex content of MAC CE for Activation/Deactivation in CA +} + +// +// Body of the RAR scheduler configuration +// +message flex_dl_rar { + optional uint32 rnti = 1; + optional uint32 grant = 2; // The 20-bit UL grant. TS 36.213, sec 6.2 + optional flex_dl_dci rar_dci = 3; + optional uint32 carrier_index = 4; // The carrier index for the RAR +} + +// +// Body of the paging/broadcast configuration message +// + +message flex_dl_broadcast { + optional uint32 type = 1; // The FLBT_* values + optional uint32 index = 2; // Index of the broadcast message: + // 0 - SIB1, + // 1..31 - Six, + // 32..63 - PCCH (PCCH index obtained from flex_paging_info) + optional flex_dl_dci broad_dci = 3; + optional uint32 carrier_index = 4; // Index of the carrier for broadcast +} + +// +// Body of the OFDM symbol count message +// + +message flex_pdcch_ofdm_sym_count { + optional uint32 carrier_index = 1; + optional uint32 num_pdcch_ofdm_symbols = 2; +} + +// +// Types of commands related enums +// + +enum flex_broadcast_type { + FLBT_BCCH = 0; + FLBT_PCCH = 1; +} \ No newline at end of file diff --git a/openair2/ENB_APP/MESSAGES/V2/flexran.proto b/openair2/ENB_APP/MESSAGES/V2/flexran.proto new file mode 100644 index 0000000000..8c0c300efe --- /dev/null +++ b/openair2/ENB_APP/MESSAGES/V2/flexran.proto @@ -0,0 +1,210 @@ +syntax = "proto2"; +package protocol; + +import "stats_messages.proto"; +import "header.proto"; +import "time_common.proto"; +import "config_messages.proto"; +import "controller_commands.proto"; +import "control_delegation.proto"; + +message flexran_message { + optional flexran_direction msg_dir = 100; + oneof msg { + flex_hello hello_msg = 1; + flex_echo_request echo_request_msg = 2; + flex_echo_reply echo_reply_msg = 3; + flex_stats_request stats_request_msg = 4; + flex_stats_reply stats_reply_msg = 5; + flex_sf_trigger sf_trigger_msg = 6; + flex_ul_sr_info ul_sr_info_msg = 7; + flex_enb_config_request enb_config_request_msg = 8; + flex_enb_config_reply enb_config_reply_msg = 9; + flex_ue_config_request ue_config_request_msg = 10; + flex_ue_config_reply ue_config_reply_msg = 11; + flex_lc_config_request lc_config_request_msg = 12; + flex_lc_config_reply lc_config_reply_msg = 13; + flex_dl_mac_config dl_mac_config_msg = 14; + flex_ue_state_change ue_state_change_msg = 15; + flex_control_delegation control_delegation_msg = 16; + flex_agent_reconfiguration agent_reconfiguration_msg = 17; + } +} + +enum flexran_direction { + //option allow_alias = true; + NOT_SET = 0; + INITIATING_MESSAGE = 1; + SUCCESSFUL_OUTCOME=2; + UNSUCCESSFUL_OUTCOME=3; +} + +enum flexran_err { + //option allow_alias = true; + // message errors + NO_ERR = 0; + MSG_DEQUEUING = -1; + MSG_ENQUEUING = -2; + MSG_DECODING = -3; + MSG_ENCODING = -4; + MSG_BUILD = -5; + MSG_NOT_SUPPORTED = -6; + MSG_NOT_HANDLED = -7; + MSG_NOT_VALIDATED = -8; + MSG_OUT_DATED = -9; + + + // other erros + UNEXPECTED = -100; +} + +// +// Maintenance and discovery messages +// + +message flex_hello { + optional flex_header header = 1; +} + +message flex_echo_request { + optional flex_header header = 1; + extensions 100 to 199; +} + + +message flex_echo_reply { + optional flex_header header = 1; + extensions 100 to 199; +} + + +// +// Statistics request and reply message +// + +message flex_stats_request { + optional flex_header header = 1; + optional flex_stats_type type = 2; + oneof body { + flex_complete_stats_request complete_stats_request = 3; + flex_cell_stats_request cell_stats_request = 4; + flex_ue_stats_request ue_stats_request = 5; + } +} + +message flex_stats_reply { + optional flex_header header = 1; + repeated flex_ue_stats_report ue_report = 2; + repeated flex_cell_stats_report cell_report = 3; +} + +// +// Time indication messages +// + +message flex_sf_trigger { + optional flex_header header = 1; + optional uint32 sfn_sf = 2; + repeated flex_dl_info dl_info = 3; + repeated flex_ul_info ul_info = 4; +} + +// +// Asynchronous messages +// + +message flex_ul_sr_info { + optional flex_header header = 1; + optional uint32 sfn_sf = 2; + repeated uint32 rnti = 3; +} + +// +// eNB configuration messages +// +message flex_enb_config_request { + optional flex_header header = 1; +} + +message flex_enb_config_reply { + optional flex_header header = 1; + optional uint32 eNB_id = 2; // Unique id to distinguish the eNB + repeated flex_cell_config cell_config = 3; +} + +message flex_ue_config_request { + optional flex_header header = 1; +} + +message flex_ue_config_reply { + optional flex_header header = 1; + repeated flex_ue_config ue_config = 2; +} + +message flex_lc_config_request { + optional flex_header header = 1; +} + +message flex_lc_config_reply { + optional flex_header header = 1; + repeated flex_lc_ue_config lc_ue_config = 2; +} + +// +// Controller command messages +// + +message flex_dl_mac_config { + optional flex_header header = 1; + optional uint32 sfn_sf = 2; + repeated flex_dl_data dl_ue_data = 3; + repeated flex_dl_rar dl_rar = 4; + repeated flex_dl_broadcast dl_broadcast = 5; + repeated flex_pdcch_ofdm_sym_count ofdm_sym = 6; // OFDM symbol count for each CC +} + +// +// UE state change message +// + +message flex_ue_state_change { + optional flex_header header = 1; + optional uint32 type = 2; // One of the FLUESC_* values + optional flex_ue_config config = 3; // Body of the message (based on type) +} + +// +// Control delegation message +// + +message flex_control_delegation { + optional flex_header header = 1; + optional uint32 delegation_type = 2; // Bitmap of FLCDT_* flags + optional bytes payload = 3; // Byte array of shared lib containing the delegated functions + optional string name = 4; // The delegated functions names ordered based on bitmap flags +} + +// +// Agent reconfiguration message +// + +message flex_agent_reconfiguration { + optional flex_header header = 1; + optional string policy = 2; // The policy changes using YAML syntax in string format +} + +// Extensions of the echo request and reply +// messages for carrying a latency value in ms +message flex_echo_request_latency { + extend flex_echo_request { + optional uint32 latency = 100; + } +} + +message flex_echo_reply_latency { + extend flex_echo_reply { + optional uint32 latency = 100; + } +} + + diff --git a/openair2/ENB_APP/MESSAGES/V2/header.proto b/openair2/ENB_APP/MESSAGES/V2/header.proto new file mode 100644 index 0000000000..939429f51f --- /dev/null +++ b/openair2/ENB_APP/MESSAGES/V2/header.proto @@ -0,0 +1,44 @@ +syntax = "proto2"; +package protocol; + +message flex_header { + optional uint32 version = 1; + optional uint32 type = 2; + optional uint32 xid = 4; +} + +enum flex_type { + // Discovery and maintenance messages + FLPT_HELLO = 0; + FLPT_ECHO_REQUEST = 1; + FLPT_ECHO_REPLY = 2; + + // Statistics and measurement messages + FLPT_STATS_REQUEST = 3; + FLPT_STATS_REPLY = 4; + + // Time indication messages + FLPT_SF_TRIGGER = 5; + + // Asynchronous messages + FLPT_UL_SR_INFO = 6; + + // eNB configuration messages + FLPT_GET_ENB_CONFIG_REQUEST = 7; + FLPT_GET_ENB_CONFIG_REPLY = 8; + FLPT_GET_UE_CONFIG_REQUEST = 9; + FLPT_GET_UE_CONFIG_REPLY = 10; + FLPT_GET_LC_CONFIG_REQUEST = 11; + FLPT_GET_LC_CONFIG_REPLY = 12; + + //Controller command messages + FLPT_DL_MAC_CONFIG = 13; + + // UE state change messages + FLPT_UE_STATE_CHANGE = 14; + + // Control delegation messages + FLPT_DELEGATE_CONTROL = 15; + FLPT_RECONFIGURE_AGENT = 16; +} + diff --git a/openair2/ENB_APP/MESSAGES/V2/mac_primitives.proto b/openair2/ENB_APP/MESSAGES/V2/mac_primitives.proto new file mode 100644 index 0000000000..89b8f0e380 --- /dev/null +++ b/openair2/ENB_APP/MESSAGES/V2/mac_primitives.proto @@ -0,0 +1,77 @@ +syntax = "proto2"; +package protocol; + +// +// Message containing the DL DCI info +// + +message flex_dl_dci { + optional uint32 rnti = 1; + optional uint32 res_alloc = 2; // Type of resource allocation + optional uint32 rb_bitmap = 3; // Bitmap for RB allocation + optional uint32 rb_shift = 4; // See TS 36.214, section 7.1.6.2 + repeated uint32 tbs_size = 5; // The size of each TBS + repeated uint32 mcs = 6; // The MCS of each TB + repeated uint32 ndi = 7; // New data indicator of each TB + repeated uint32 rv = 8; // Redundancy version of each TB + optional uint32 cce_index = 9; // CCE index used to send the DCI + optional uint32 aggr_level = 10; + optional uint32 precoding_info = 11; // 2 antenna ports:0..6, + // 4 antenna ports:0..50 + optional uint32 format = 12; // DCI format. A FLDCIF_* value + optional uint32 tpc = 13; // TS 36.213, sec 5.1.1.1 + optional uint32 harq_process = 14; // HARQ process ID + optional uint32 dai = 15; // TDD only + optional uint32 vrb_format = 16; // One of the FLVRBF_* values + optional uint32 tb_swap = 17; // Boolean. TB to codeword swap flag + optional uint32 sps_release = 18; // Flag value + optional uint32 pdcch_order = 19; + optional uint32 preamble_index = 20; // Only valid if pdcch_order = 1 + optional uint32 prach_mask_index = 21; // Only valid if pdcch_order = 1 + optional uint32 n_gap = 22; // One of the FLNGV_* values + optional uint32 tbs_idx = 23; // The TBS index for Format 1A + optional uint32 dl_power_offset = 24; // For format 1D + optional uint32 pdcch_power_offset = 25; // DL PDCCH power boosting in dB + optional uint32 cif_present = 26; // Boolean. Indication of CIF field + optional uint32 cif = 27; // CIF for cross-carrier scheduling +} + +// +// Messages related to the creation of RLC PDUs +// + +message flex_rlc_pdu { + repeated flex_rlc_pdu_tb rlc_pdu_tb = 1; // list of parameters for the creation of RLC PDUs. One for each TB +} + +message flex_rlc_pdu_tb { + optional uint32 logical_channel_id = 1; + optional uint32 size = 2; // Maximum RLC PDU to be created in bytes +} + +// +// MAC content types related enums +// + +enum flex_dci_format { + FLDCIF_1 = 0; + FLDCIF_1A = 1; + FLDCIF_1B = 2; + FLDCIF_1C = 3; + FLDCIF_1D = 4; + FLDCIF_2 = 5; + FLDCIF_2A = 6; + FLDCIF_2B = 7; + FLDCIF_3 = 8; + FLDCIF_3A = 9; +} + +enum flex_vrb_format { + FLVRBF_LOCALIZED = 0; + FLVRBF_DISTRIBUTED = 1; +} + +enum flex_ngap_val { + FLNGV_1 = 0; + FLNGV_2 = 1; +} \ No newline at end of file diff --git a/openair2/ENB_APP/MESSAGES/V2/stats_common.proto b/openair2/ENB_APP/MESSAGES/V2/stats_common.proto new file mode 100644 index 0000000000..fa985bf9cc --- /dev/null +++ b/openair2/ENB_APP/MESSAGES/V2/stats_common.proto @@ -0,0 +1,184 @@ +syntax = "proto2"; +package protocol; + +// +// UE related statistics +// + +// RLC buffer status for a specific logical channel of a UE +message flex_rlc_bsr { + optional uint32 lc_id = 1; + optional uint32 tx_queue_size = 2; + optional uint32 tx_queue_hol_delay = 3; + optional uint32 retransmission_queue_size = 4; + optional uint32 retransmission_queue_hol_delay = 5; + optional uint32 status_pdu_size = 6; +} + +// Flags for MAC Control Elements +enum flex_ce_type { + FLPCET_TA = 1; + FLPCET_DRX = 2; + FLPCET_CR = 4; + FLPCET_CA = 8; +} + +// Types of DL CSI reports +enum flex_csi_type { + FLCSIT_P10 = 0; + FLCSIT_P11 = 1; + FLCSIT_P20 = 2; + FLCSIT_P21 = 3; + FLCSIT_A12 = 4; + FLCSIT_A22 = 5; + FLCSIT_A20 = 6; + FLCSIT_A30 = 7; + FLCSIT_A31 = 8; +} + +// CSI type P10 +message flex_csi_p10 { + optional uint32 wb_cqi = 1; +} + +// CSI type P11 +message flex_csi_p11 { + repeated uint32 wb_cqi = 1; + optional uint32 wb_pmi = 2; +} + +// CSI type P20 +message flex_csi_p20 { + optional uint32 wb_cqi = 1; + optional uint32 sb_cqi = 2; + optional uint32 bandwidth_part_index = 3; + optional uint32 sb_index = 4; +} + +// CSI type P21 +message flex_csi_p21 { + repeated uint32 wb_cqi = 1; + optional uint32 wb_pmi = 2; + repeated uint32 sb_cqi = 3; + optional uint32 badwidth_part_index = 4; + optional uint32 sb_index = 5; +} + +// CSI type A12 +message flex_csi_a12 { + repeated uint32 wb_cqi = 1; + repeated uint32 sb_pmi = 2; +} + +// CSI type A22 +message flex_csi_a22 { + repeated uint32 wb_cqi = 1; + repeated uint32 sb_cqi = 2; + optional uint32 wb_pmi = 3; + optional uint32 sb_pmi = 4; + repeated uint32 sb_list = 5; +} + +// CSI type A20 +message flex_csi_a20 { + optional uint32 wb_cqi = 1; + optional uint32 sb_cqi = 2; + repeated uint32 sb_list = 3; +} + +// CSI type A30 +message flex_csi_a30 { + optional uint32 wb_cqi = 1; + repeated uint32 sb_cqi = 2; +} + +// CSI type A31 +message flex_csi_a31 { + repeated uint32 wb_cqi = 1; + repeated flex_msb_cqi sb_cqi = 2; + optional uint32 wb_pmi = 3; +} + +// The CQI for the M-preffered subband +message flex_msb_cqi { + repeated uint32 sb_cqi = 1; +} + +// The CSI report of the UE for a specific servCellIndex +message flex_dl_csi { + optional uint32 serv_cell_index = 1; + optional uint32 ri = 2; + optional flex_csi_type type = 3; + oneof report { + flex_csi_p10 p10csi = 4; + flex_csi_p11 p11csi = 5; + flex_csi_p20 p20csi = 6; + flex_csi_p21 p21csi = 7; + flex_csi_a12 a12csi = 8; + flex_csi_a22 a22csi = 9; + flex_csi_a20 a20csi = 10; + flex_csi_a30 a30csi = 11; + flex_csi_a31 a31csi = 12; + } +} + +// The full DL CQI report for all CC of a UE +message flex_dl_cqi_report { + optional uint32 sfn_sn = 1; + repeated flex_dl_csi csi_report = 2; +} + +// Paging message info +message flex_paging_info { + optional uint32 paging_index = 1; + optional uint32 paging_message_size = 2; + optional uint32 paging_subframe = 3; + optional uint32 carrier_index = 4; +} + +// Report for the paging buffer status +message flex_paging_buffer_report { + repeated flex_paging_info paging_info = 1; +} + +// The type of UL CQI +enum flex_ul_cqi_type { + FLUCT_SRS = 0; + FLUCT_PUSCH = 1; + FLUCT_PUCCH_1 = 2; + FLUCT_PUCCH_2 = 3; + FLUCT_PRACH = 4; +} + +// UL CQI report for a specific UE for a given report type +message flex_ul_cqi { + optional flex_ul_cqi_type type = 1; + repeated uint32 sinr = 2; + optional uint32 serv_cell_index = 3; +} + +// Full UL CQI report for a specific UE +message flex_ul_cqi_report { + optional uint32 sfn_sn = 1; + repeated flex_ul_cqi cqi_meas = 2; + repeated flex_pucch_dbm pucch_dbm = 3; +} + +message flex_pucch_dbm { + optional int32 p0_pucch_dbm = 1; + optional uint32 serv_cell_index = 2; + optional uint32 p0_pucch_updated = 3; +} + +// +// Cell related statistics +// + +// The UL noise and interference report for a UE +message flex_noise_interference_report { + optional uint32 sfn_sf = 1; + optional uint32 rip = 2; + optional uint32 tnp = 3; + optional int32 p0_nominal_pucch = 4; +} + diff --git a/openair2/ENB_APP/MESSAGES/V2/stats_messages.proto b/openair2/ENB_APP/MESSAGES/V2/stats_messages.proto new file mode 100644 index 0000000000..d8c0651fa1 --- /dev/null +++ b/openair2/ENB_APP/MESSAGES/V2/stats_messages.proto @@ -0,0 +1,87 @@ +syntax = "proto2"; +package protocol; + +//import "header.proto"; +import "stats_common.proto"; + +// +// Bodies of statistics report requests +// + +message flex_complete_stats_request { + optional flex_stats_report_freq report_frequency = 1; + optional uint32 sf = 2; + optional uint32 cell_report_flags = 3; + optional uint32 ue_report_flags = 4; +} + +message flex_cell_stats_request { + repeated uint32 cell = 1; + optional uint32 flags = 2; +} + +message flex_ue_stats_request { + repeated uint32 rnti = 1; + optional uint32 flags = 2; +} + +// +// Bodies of statistics reports +// + +// The full statistics report for a specific cell +message flex_cell_stats_report { + optional uint32 carrier_index = 1; + optional uint32 flags = 2; + optional flex_noise_interference_report noise_inter_report = 3; +} + +// Statistics report for a specific UE +message flex_ue_stats_report { + optional uint32 rnti = 1; + optional uint32 flags = 2; + repeated uint32 bsr = 3; + optional uint32 phr = 4; + repeated flex_rlc_bsr rlc_report = 5; + optional uint32 pending_mac_ces = 6; + optional flex_dl_cqi_report dl_cqi_report = 7; + optional flex_paging_buffer_report pbr = 8; + optional flex_ul_cqi_report ul_cqi_report = 9; +} + +// +// Types of statistics related enums +// + + +//Types of statistics requested by the controller +enum flex_stats_type { + FLST_COMPLETE_STATS = 0; + FLST_CELL_STATS = 1; + FLST_UE_STATS = 2; +} + +// Report frequency for the requested statistics +enum flex_stats_report_freq { + FLSRF_ONCE = 0; + FLSRF_PERIODICAL = 1; + FLSRF_CONTINUOUS = 2; + FLSRF_OFF = 3; +} + +// Flags for cell statistics +enum flex_cell_stats_type { + FLCST_NOISE_INTERFERENCE = 1; +} + +// Flags for UE-related statistics +enum flex_ue_stats_type { + FLUST_BSR = 1; + FLUST_PRH = 2; + FLUST_RLC_BS = 4; + FLUST_MAC_CE_BS = 8; + FLUST_DL_CQI = 16; + FLUST_PBS = 32; + FLUST_UL_CQI = 64; + // To be extended with more types of stats +} \ No newline at end of file diff --git a/openair2/ENB_APP/MESSAGES/V2/time_common.proto b/openair2/ENB_APP/MESSAGES/V2/time_common.proto new file mode 100644 index 0000000000..8bd2497443 --- /dev/null +++ b/openair2/ENB_APP/MESSAGES/V2/time_common.proto @@ -0,0 +1,30 @@ +syntax = "proto2"; +package protocol; + +enum flex_harq_status { + FLHS_ACK = 0; + FLHS_NACK = 1; + FLHS_DTX = 2; +} + +enum flex_reception_status { + FLRS_OK = 0; + FLRS_NOT_OK = 1; + FLRS_NOT_VALID = 2; +} + +message flex_dl_info { + optional uint32 rnti = 1; + optional uint32 harq_process_id = 2; + repeated uint32 harq_status = 3; + optional uint32 serv_cell_index = 4; +} + +message flex_ul_info { + optional uint32 rnti = 1; + repeated uint32 ul_reception = 2; + optional uint32 reception_status = 3; + optional uint32 tpc = 4; + optional uint32 serv_cell_index = 5; +} + diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c index 2098b01ccf..d3e110885a 100644 --- a/openair2/ENB_APP/enb_app.c +++ b/openair2/ENB_APP/enb_app.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* enb_app.c @@ -41,12 +33,9 @@ #include "enb_app.h" #include "enb_config.h" #include "assertions.h" +#include "common/ran_context.h" #include "log.h" -#if defined(OAI_EMU) -# include "OCG.h" -# include "OCG_extern.h" -#endif #if defined(ENABLE_ITTI) # include "intertask_interface.h" @@ -58,9 +47,15 @@ # endif +#if defined(FLEXRAN_AGENT_SB_IF) +# include "flexran_agent.h" +#endif + extern unsigned char NB_eNB_INST; #endif +extern RAN_CONTEXT_t RC; + #if defined(ENABLE_ITTI) #include "LAYER2/PROTO_AGENT/proto_agent.h" @@ -73,6 +68,8 @@ extern unsigned char NB_eNB_INST; # endif /*------------------------------------------------------------------------------*/ + +/* static void configure_phy(module_id_t enb_id, const Enb_properties_array_t* enb_properties) { MessageDef *msg_p; @@ -93,15 +90,20 @@ static void configure_phy(module_id_t enb_id, const Enb_properties_array_t* enb_ itti_send_msg_to_task (TASK_PHY_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); } +*/ /*------------------------------------------------------------------------------*/ -static void configure_rrc(uint32_t enb_id, const Enb_properties_array_t *enb_properties) +static void configure_rrc(uint32_t enb_id) { MessageDef *msg_p = NULL; - int CC_id; + // int CC_id; msg_p = itti_alloc_new_message (TASK_ENB_APP, RRC_CONFIGURATION_REQ); + if (RC.rrc[enb_id]) { + RCconfig_RRC(msg_p,enb_id, RC.rrc[enb_id]); + + /* RRC_CONFIGURATION_REQ (msg_p).cell_identity = enb_properties->properties[enb_id]->eNB_id; RRC_CONFIGURATION_REQ (msg_p).tac = enb_properties->properties[enb_id]->tac; RRC_CONFIGURATION_REQ (msg_p).mcc = enb_properties->properties[enb_id]->mcc; @@ -160,7 +162,7 @@ static void configure_rrc(uint32_t enb_id, const Enb_properties_array_t *enb_pro RRC_CONFIGURATION_REQ (msg_p).pucch_delta_shift[CC_id] = enb_properties->properties[enb_id]->pucch_delta_shift[CC_id]; RRC_CONFIGURATION_REQ (msg_p).pucch_nRB_CQI[CC_id] = enb_properties->properties[enb_id]->pucch_nRB_CQI[CC_id]; RRC_CONFIGURATION_REQ (msg_p).pucch_nCS_AN[CC_id] = enb_properties->properties[enb_id]->pucch_nCS_AN[CC_id]; -#ifndef Rel10 +#if !defined(Rel10) && !defined(Rel14) RRC_CONFIGURATION_REQ (msg_p).pucch_n1_AN[CC_id] = enb_properties->properties[enb_id]->pucch_n1_AN[CC_id]; #endif @@ -192,40 +194,43 @@ static void configure_rrc(uint32_t enb_id, const Enb_properties_array_t *enb_pro RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[CC_id] = enb_properties->properties[enb_id]->ue_TimersAndConstants_n310[CC_id]; RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[CC_id] = enb_properties->properties[enb_id]->ue_TimersAndConstants_t311[CC_id]; RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[CC_id] = enb_properties->properties[enb_id]->ue_TimersAndConstants_n311[CC_id]; - } - itti_send_msg_to_task (TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); + RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[CC_id] = enb_properties->properties[enb_id]->ue_TransmissionMode[CC_id]; + + } + */ + + LOG_I(ENB_APP,"Sending configuration message to RRC task\n"); + itti_send_msg_to_task (TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); + + } + else AssertFatal(0,"RRC context for eNB %d not allocated\n",enb_id); } /*------------------------------------------------------------------------------*/ # if defined(ENABLE_USE_MME) -static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end, const Enb_properties_array_t *enb_properties) +static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end)//, const Enb_properties_array_t *enb_properties) { uint32_t enb_id; - uint32_t mme_id; MessageDef *msg_p; uint32_t register_enb_pending = 0; - char *str = NULL; - struct in_addr addr; - -# if defined(OAI_EMU) - -# endif for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) { -# if defined(OAI_EMU) - - if (oai_emulation.info.cli_start_enb[enb_id] == 1) -# endif { s1ap_register_enb_req_t *s1ap_register_eNB; /* note: there is an implicit relationship between the data structure and the message name */ msg_p = itti_alloc_new_message (TASK_ENB_APP, S1AP_REGISTER_ENB_REQ); - s1ap_register_eNB = &S1AP_REGISTER_ENB_REQ(msg_p); + RCconfig_S1(msg_p, enb_id); - /* Some default/random parameters */ + if (enb_id == 0) RCconfig_gtpu(); + + s1ap_register_eNB = &S1AP_REGISTER_ENB_REQ(msg_p); + LOG_I(ENB_APP,"default drx %d\n",s1ap_register_eNB->default_drx); + + /* + s1ap_register_eNB->eNB_id = enb_properties->properties[enb_id]->eNB_id; s1ap_register_eNB->cell_type = enb_properties->properties[enb_id]->cell_type; s1ap_register_eNB->eNB_name = enb_properties->properties[enb_id]->eNB_name; @@ -236,6 +241,7 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end, con s1ap_register_eNB->default_drx = enb_properties->properties[enb_id]->pcch_defaultPagingCycle[0]; s1ap_register_eNB->nb_mme = enb_properties->properties[enb_id]->nb_mme; + AssertFatal (s1ap_register_eNB->nb_mme <= S1AP_MAX_NB_MME_IP_ADDRESS, "Too many MME for eNB %d (%d/%d)!", enb_id, s1ap_register_eNB->nb_mme, S1AP_MAX_NB_MME_IP_ADDRESS); @@ -260,6 +266,9 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end, con str = inet_ntoa(addr); strcpy(s1ap_register_eNB->enb_ip_address.ipv4_address, str); + */ + LOG_I(ENB_APP,"[eNB %d] eNB_app_register for instance %d\n", enb_id, ENB_MODULE_ID_TO_INSTANCE(enb_id)); + itti_send_msg_to_task (TASK_S1AP, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p); register_enb_pending++; @@ -274,9 +283,8 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end, con /*------------------------------------------------------------------------------*/ void *eNB_app_task(void *args_p) { - const Enb_properties_array_t *enb_properties_p = NULL; #if defined(ENABLE_ITTI) - uint32_t enb_nb = 1; /* Default number of eNB is 1 */ + uint32_t enb_nb = RC.nb_inst; uint32_t enb_id_start = 0; uint32_t enb_id_end = enb_id_start + enb_nb; # if defined(ENABLE_USE_MME) @@ -285,45 +293,55 @@ void *eNB_app_task(void *args_p) long enb_register_retry_timer_id; # endif uint32_t enb_id; - MessageDef *msg_p = NULL; - const char *msg_name = NULL; + MessageDef *msg_p = NULL; + const char *msg_name = NULL; instance_t instance; int result; - /* for no gcc warnings */ (void)instance; itti_mark_task_ready (TASK_ENB_APP); -# if defined(ENABLE_USE_MME) -# if defined(OAI_EMU) - enb_nb = oai_emulation.info.nb_enb_local; - enb_id_start = oai_emulation.info.first_enb_local; - enb_id_end = oai_emulation.info.first_enb_local + enb_nb; + LOG_I(PHY, "%s() Task ready initialise structures\n", __FUNCTION__); - AssertFatal (enb_id_end <= NUMBER_OF_eNB_MAX, - "Last eNB index is greater or equal to maximum eNB index (%d/%d)!", - enb_id_end, NUMBER_OF_eNB_MAX); -# endif -# endif + RCconfig_L1(); - enb_properties_p = enb_config_get(); + RCconfig_macrlc(); - AssertFatal (enb_nb <= enb_properties_p->number, + LOG_I(PHY, "%s() RC.nb_L1_inst:%d\n", __FUNCTION__, RC.nb_L1_inst); + + if (RC.nb_L1_inst>0) AssertFatal(l1_north_init_eNB()==0,"could not initialize L1 north interface\n"); + + AssertFatal (enb_nb <= RC.nb_inst, "Number of eNB is greater than eNB defined in configuration file (%d/%d)!", - enb_nb, enb_properties_p->number); + enb_nb, RC.nb_inst); + + LOG_I(ENB_APP,"Allocating eNB_RRC_INST for %d instances\n",RC.nb_inst); + + RC.rrc = (eNB_RRC_INST **)malloc(RC.nb_inst*sizeof(eNB_RRC_INST *)); + LOG_I(PHY, "%s() RC.nb_inst:%d RC.rrc:%p\n", __FUNCTION__, RC.nb_inst, RC.rrc); for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) { - configure_phy(enb_id, enb_properties_p); - configure_rrc(enb_id, enb_properties_p); - //proto_server_start(enb_id, enb_properties_p); - //proto_agent_start(enb_id, enb_properties_p); + RC.rrc[enb_id] = (eNB_RRC_INST*)malloc(sizeof(eNB_RRC_INST)); + LOG_I(PHY, "%s() Creating RRC instance RC.rrc[%d]:%p (%d of %d)\n", __FUNCTION__, enb_id, RC.rrc[enb_id], enb_id+1, enb_id_end); + memset((void *)RC.rrc[enb_id],0,sizeof(eNB_RRC_INST)); + configure_rrc(enb_id); } + +#if defined (FLEXRAN_AGENT_SB_IF) + + for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) { + printf("\n start enb agent %d\n", enb_id); + flexran_agent_start(enb_id, enb_properties_p); + } +#endif + + # if defined(ENABLE_USE_MME) /* Try to register each eNB */ registered_enb = 0; - register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p); + register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);//, enb_properties_p); # else /* Start L2L1 task */ msg_p = itti_alloc_new_message(TASK_ENB_APP, INITIALIZE_MESSAGE); @@ -369,16 +387,6 @@ void *eNB_app_task(void *args_p) msg_init_p = itti_alloc_new_message (TASK_ENB_APP, INITIALIZE_MESSAGE); itti_send_msg_to_task (TASK_L2L1, INSTANCE_DEFAULT, msg_init_p); -# if defined(OAI_EMU) - - /* Also inform all NAS UE tasks */ - for (instance = NB_eNB_INST + oai_emulation.info.first_ue_local; - instance < (NB_eNB_INST + oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); instance ++) { - msg_init_p = itti_alloc_new_message (TASK_ENB_APP, INITIALIZE_MESSAGE); - itti_send_msg_to_task (TASK_NAS_UE, instance, msg_init_p); - } - -# endif } else { uint32_t not_associated = enb_nb - registered_enb; @@ -393,7 +401,7 @@ void *eNB_app_task(void *args_p) sleep(ENB_REGISTER_RETRY_DELAY); /* Restart the registration process */ registered_enb = 0; - register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p); + register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);//, enb_properties_p); } } } @@ -408,12 +416,12 @@ void *eNB_app_task(void *args_p) break; case TIMER_HAS_EXPIRED: - LOG_I(ENB_APP, " Received %s: timer_id %d\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id); + LOG_I(ENB_APP, " Received %s: timer_id %ld\n", msg_name, TIMER_HAS_EXPIRED(msg_p).timer_id); if (TIMER_HAS_EXPIRED (msg_p).timer_id == enb_register_retry_timer_id) { /* Restart the registration process */ registered_enb = 0; - register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p); + register_enb_pending = eNB_app_register (enb_id_start, enb_id_end);//, enb_properties_p); } break; @@ -430,8 +438,6 @@ void *eNB_app_task(void *args_p) #endif - /* for no gcc warnings */ - (void)enb_properties_p; return NULL; } diff --git a/openair2/ENB_APP/enb_app.h b/openair2/ENB_APP/enb_app.h index 30e3373eac..52f63806e8 100644 --- a/openair2/ENB_APP/enb_app.h +++ b/openair2/ENB_APP/enb_app.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* enb_app.h diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c old mode 100755 new mode 100644 index 95b2f25de7..fdf603d250 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -1,42 +1,33 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* - enb_config.c - ------------------- + enb_config.c + ------------------- AUTHOR : Lionel GAUTHIER, navid nikaein, Laurent Winckel COMPANY : EURECOM EMAIL : Lionel.Gauthier@eurecom.fr, navid.nikaein@eurecom.fr - */ +*/ #include -#include #include #include "log.h" @@ -45,10 +36,6 @@ #include "enb_config.h" #include "UTIL/OTG/otg.h" #include "UTIL/OTG/otg_externs.h" -#if defined(OAI_EMU) -# include "OCG.h" -# include "OCG_extern.h" -#endif #if defined(ENABLE_ITTI) # include "intertask_interface.h" # if defined(ENABLE_USE_MME) @@ -59,394 +46,19 @@ #include "sctp_default_values.h" #include "SystemInformationBlockType2.h" #include "LAYER2/MAC/extern.h" +#include "LAYER2/MAC/proto.h" +#include "PHY/extern.h" +#include "targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h" +#include "nfapi_vnf.h" +#include "nfapi_pnf.h" -#define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" - -#define ENB_CONFIG_STRING_ENB_LIST "eNBs" -#define ENB_CONFIG_STRING_ENB_ID "eNB_ID" -#define ENB_CONFIG_STRING_CELL_TYPE "cell_type" -#define ENB_CONFIG_STRING_ENB_NAME "eNB_name" - -#define ENB_CONFIG_STRING_TRACKING_AREA_CODE "tracking_area_code" -#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE "mobile_country_code" -#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE "mobile_network_code" - -#define ENB_CONFIG_STRING_COMPONENT_CARRIERS "component_carriers" - -#define ENB_CONFIG_STRING_FRAME_TYPE "frame_type" -#define ENB_CONFIG_STRING_TDD_CONFIG "tdd_config" -#define ENB_CONFIG_STRING_TDD_CONFIG_S "tdd_config_s" -#define ENB_CONFIG_STRING_PREFIX_TYPE "prefix_type" -#define ENB_CONFIG_STRING_EUTRA_BAND "eutra_band" -#define ENB_CONFIG_STRING_DOWNLINK_FREQUENCY "downlink_frequency" -#define ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET "uplink_frequency_offset" - -#define ENB_CONFIG_STRING_NID_CELL "Nid_cell" -#define ENB_CONFIG_STRING_N_RB_DL "N_RB_DL" -#define ENB_CONFIG_STRING_CELL_MBSFN "Nid_cell_mbsfn" -#define ENB_CONFIG_STRING_NB_ANT_TX "nb_antennas_tx" -#define ENB_CONFIG_STRING_NB_ANT_RX "nb_antennas_rx" -#define ENB_CONFIG_STRING_TX_GAIN "tx_gain" -#define ENB_CONFIG_STRING_RX_GAIN "rx_gain" -#define ENB_CONFIG_STRING_PRACH_ROOT "prach_root" -#define ENB_CONFIG_STRING_PRACH_CONFIG_INDEX "prach_config_index" -#define ENB_CONFIG_STRING_PRACH_HIGH_SPEED "prach_high_speed" -#define ENB_CONFIG_STRING_PRACH_ZERO_CORRELATION "prach_zero_correlation" -#define ENB_CONFIG_STRING_PRACH_FREQ_OFFSET "prach_freq_offset" -#define ENB_CONFIG_STRING_PUCCH_DELTA_SHIFT "pucch_delta_shift" -#define ENB_CONFIG_STRING_PUCCH_NRB_CQI "pucch_nRB_CQI" -#define ENB_CONFIG_STRING_PUCCH_NCS_AN "pucch_nCS_AN" -#ifndef Rel10 -#define ENB_CONFIG_STRING_PUCCH_N1_AN "pucch_n1_AN" -#endif -#define ENB_CONFIG_STRING_PDSCH_RS_EPRE "pdsch_referenceSignalPower" -#define ENB_CONFIG_STRING_PDSCH_PB "pdsch_p_b" -#define ENB_CONFIG_STRING_PUSCH_N_SB "pusch_n_SB" -#define ENB_CONFIG_STRING_PUSCH_HOPPINGMODE "pusch_hoppingMode" -#define ENB_CONFIG_STRING_PUSCH_HOPPINGOFFSET "pusch_hoppingOffset" -#define ENB_CONFIG_STRING_PUSCH_ENABLE64QAM "pusch_enable64QAM" -#define ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN "pusch_groupHoppingEnabled" -#define ENB_CONFIG_STRING_PUSCH_GROUP_ASSIGNMENT "pusch_groupAssignment" -#define ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN "pusch_sequenceHoppingEnabled" -#define ENB_CONFIG_STRING_PUSCH_NDMRS1 "pusch_nDMRS1" -#define ENB_CONFIG_STRING_PHICH_DURATION "phich_duration" -#define ENB_CONFIG_STRING_PHICH_RESOURCE "phich_resource" -#define ENB_CONFIG_STRING_SRS_ENABLE "srs_enable" -#define ENB_CONFIG_STRING_SRS_BANDWIDTH_CONFIG "srs_BandwidthConfig" -#define ENB_CONFIG_STRING_SRS_SUBFRAME_CONFIG "srs_SubframeConfig" -#define ENB_CONFIG_STRING_SRS_ACKNACKST_CONFIG "srs_ackNackST" -#define ENB_CONFIG_STRING_SRS_MAXUPPTS "srs_MaxUpPts" -#define ENB_CONFIG_STRING_PUSCH_PO_NOMINAL "pusch_p0_Nominal" -#define ENB_CONFIG_STRING_PUSCH_ALPHA "pusch_alpha" -#define ENB_CONFIG_STRING_PUCCH_PO_NOMINAL "pucch_p0_Nominal" -#define ENB_CONFIG_STRING_MSG3_DELTA_PREAMBLE "msg3_delta_Preamble" -#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1 "pucch_deltaF_Format1" -#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1b "pucch_deltaF_Format1b" -#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2 "pucch_deltaF_Format2" -#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2A "pucch_deltaF_Format2a" -#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2B "pucch_deltaF_Format2b" -#define ENB_CONFIG_STRING_RACH_NUM_RA_PREAMBLES "rach_numberOfRA_Preambles" -#define ENB_CONFIG_STRING_RACH_PREAMBLESGROUPACONFIG "rach_preamblesGroupAConfig" -#define ENB_CONFIG_STRING_RACH_SIZEOFRA_PREAMBLESGROUPA "rach_sizeOfRA_PreamblesGroupA" -#define ENB_CONFIG_STRING_RACH_MESSAGESIZEGROUPA "rach_messageSizeGroupA" -#define ENB_CONFIG_STRING_RACH_MESSAGEPOWEROFFSETGROUPB "rach_messagePowerOffsetGroupB" -#define ENB_CONFIG_STRING_RACH_POWERRAMPINGSTEP "rach_powerRampingStep" -#define ENB_CONFIG_STRING_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER "rach_preambleInitialReceivedTargetPower" -#define ENB_CONFIG_STRING_RACH_PREAMBLETRANSMAX "rach_preambleTransMax" -#define ENB_CONFIG_STRING_RACH_RARESPONSEWINDOWSIZE "rach_raResponseWindowSize" -#define ENB_CONFIG_STRING_RACH_MACCONTENTIONRESOLUTIONTIMER "rach_macContentionResolutionTimer" -#define ENB_CONFIG_STRING_RACH_MAXHARQMSG3TX "rach_maxHARQ_Msg3Tx" -#define ENB_CONFIG_STRING_PCCH_DEFAULT_PAGING_CYCLE "pcch_default_PagingCycle" -#define ENB_CONFIG_STRING_PCCH_NB "pcch_nB" -#define ENB_CONFIG_STRING_BCCH_MODIFICATIONPERIODCOEFF "bcch_modificationPeriodCoeff" -#define ENB_CONFIG_STRING_UETIMERS_T300 "ue_TimersAndConstants_t300" -#define ENB_CONFIG_STRING_UETIMERS_T301 "ue_TimersAndConstants_t301" -#define ENB_CONFIG_STRING_UETIMERS_T310 "ue_TimersAndConstants_t310" -#define ENB_CONFIG_STRING_UETIMERS_T311 "ue_TimersAndConstants_t311" -#define ENB_CONFIG_STRING_UETIMERS_N310 "ue_TimersAndConstants_n310" -#define ENB_CONFIG_STRING_UETIMERS_N311 "ue_TimersAndConstants_n311" - -#define ENB_CONFIG_STRING_SRB1 "srb1_parameters" -#define ENB_CONFIG_STRING_SRB1_TIMER_POLL_RETRANSMIT "timer_poll_retransmit" -#define ENB_CONFIG_STRING_SRB1_TIMER_REORDERING "timer_reordering" -#define ENB_CONFIG_STRING_SRB1_TIMER_STATUS_PROHIBIT "timer_status_prohibit" -#define ENB_CONFIG_STRING_SRB1_POLL_PDU "poll_pdu" -#define ENB_CONFIG_STRING_SRB1_POLL_BYTE "poll_byte" -#define ENB_CONFIG_STRING_SRB1_MAX_RETX_THRESHOLD "max_retx_threshold" -#define ENB_CONFIG_STRING_MME_IP_ADDRESS "mme_ip_address" -#define ENB_CONFIG_STRING_MME_IPV4_ADDRESS "ipv4" -#define ENB_CONFIG_STRING_MME_IPV6_ADDRESS "ipv6" -#define ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE "active" -#define ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE "preference" - -#define ENB_CONFIG_STRING_SCTP_CONFIG "SCTP" -#define ENB_CONFIG_STRING_SCTP_INSTREAMS "SCTP_INSTREAMS" -#define ENB_CONFIG_STRING_SCTP_OUTSTREAMS "SCTP_OUTSTREAMS" - -#define ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG "NETWORK_INTERFACES" -#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME "ENB_INTERFACE_NAME_FOR_S1_MME" -#define ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME "ENB_IPV4_ADDRESS_FOR_S1_MME" -#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U "ENB_INTERFACE_NAME_FOR_S1U" -#define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U "ENB_IPV4_ADDRESS_FOR_S1U" -#define ENB_CONFIG_STRING_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U" - -#define ENB_CONFIG_STRING_FLEXSPLIT_INTERFACES_CONFIG "FLEXSPLIT_INTERFACES" -#define ENB_CONFIG_STRING_DU_INTERFACE_NAME_FOR_F1U "DU_INTERFACE_NAME_FOR_F1U" -#define ENB_CONFIG_STRING_DU_IPV4_ADDRESS_FOR_F1U "DU_IPV4_ADDRESS_FOR_F1U" -#define ENB_CONFIG_STRING_DU_PORT_FOR_F1U "DU_PORT_FOR_F1U" -#define ENB_CONFIG_STRING_CU_INTERFACE_NAME_FOR_F1U "CU_INTERFACE_NAME_FOR_F1U" -#define ENB_CONFIG_STRING_CU_IPV4_ADDRESS_FOR_F1U "CU_IPV4_ADDRESS_FOR_F1U" -#define ENB_CONFIG_STRING_CU_PORT_FOR_F1U "CU_PORT_FOR_F1U" -#define ENB_CONFIG_STRING_F1_U_TRANSPORT_TYPE "F1_U_TRANSPORT_TYPE" - -#define ENB_CONFIG_STRING_RRH_GW_CONFIG "rrh_gw_config" -#define ENB_CONFIG_STRING_RRH_GW_LOCAL_IF_NAME "local_if_name" -#define ENB_CONFIG_STRING_RRH_GW_LOCAL_ADDRESS "local_address" -#define ENB_CONFIG_STRING_RRH_GW_REMOTE_ADDRESS "remote_address" -#define ENB_CONFIG_STRING_RRH_GW_LOCAL_PORT "local_port" -#define ENB_CONFIG_STRING_RRH_GW_REMOTE_PORT "remote_port" -#define ENB_CONFIG_STRING_RRH_GW_ACTIVE "rrh_gw_active" -#define ENB_CONFIG_STRING_RRH_GW_TRANSPORT_PREFERENCE "tr_preference" -#define ENB_CONFIG_STRING_RRH_GW_RF_TARGET_PREFERENCE "rf_preference" -#define ENB_CONFIG_STRING_RRH_GW_IQ_TXSHIFT "iq_txshift" -#define ENB_CONFIG_STRING_RRH_GW_TX_SAMPLE_ADVANCE "tx_sample_advance" -#define ENB_CONFIG_STRING_RRH_GW_TX_SCHEDULING_ADVANCE "tx_scheduling_advance" - -#define ENB_CONFIG_STRING_ASN1_VERBOSITY "Asn1_verbosity" -#define ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE "none" -#define ENB_CONFIG_STRING_ASN1_VERBOSITY_ANNOYING "annoying" -#define ENB_CONFIG_STRING_ASN1_VERBOSITY_INFO "info" - -// OTG config per ENB-UE DL -#define ENB_CONF_STRING_OTG_CONFIG "otg_config" -#define ENB_CONF_STRING_OTG_UE_ID "ue_id" -#define ENB_CONF_STRING_OTG_APP_TYPE "app_type" -#define ENB_CONF_STRING_OTG_BG_TRAFFIC "bg_traffic" - -// per eNB configuration -#define ENB_CONFIG_STRING_LOG_CONFIG "log_config" -#define ENB_CONFIG_STRING_GLOBAL_LOG_LEVEL "global_log_level" -#define ENB_CONFIG_STRING_GLOBAL_LOG_VERBOSITY "global_log_verbosity" -#define ENB_CONFIG_STRING_HW_LOG_LEVEL "hw_log_level" -#define ENB_CONFIG_STRING_HW_LOG_VERBOSITY "hw_log_verbosity" -#define ENB_CONFIG_STRING_PHY_LOG_LEVEL "phy_log_level" -#define ENB_CONFIG_STRING_PHY_LOG_VERBOSITY "phy_log_verbosity" -#define ENB_CONFIG_STRING_MAC_LOG_LEVEL "mac_log_level" -#define ENB_CONFIG_STRING_MAC_LOG_VERBOSITY "mac_log_verbosity" -#define ENB_CONFIG_STRING_RLC_LOG_LEVEL "rlc_log_level" -#define ENB_CONFIG_STRING_RLC_LOG_VERBOSITY "rlc_log_verbosity" -#define ENB_CONFIG_STRING_PDCP_LOG_LEVEL "pdcp_log_level" -#define ENB_CONFIG_STRING_PDCP_LOG_VERBOSITY "pdcp_log_verbosity" -#define ENB_CONFIG_STRING_RRC_LOG_LEVEL "rrc_log_level" -#define ENB_CONFIG_STRING_RRC_LOG_VERBOSITY "rrc_log_verbosity" -#define ENB_CONFIG_STRING_GTPU_LOG_LEVEL "gtpu_log_level" -#define ENB_CONFIG_STRING_GTPU_LOG_VERBOSITY "gtpu_log_verbosity" -#define ENB_CONFIG_STRING_UDP_LOG_LEVEL "udp_log_level" -#define ENB_CONFIG_STRING_UDP_LOG_VERBOSITY "udp_log_verbosity" -#define ENB_CONFIG_STRING_OSA_LOG_LEVEL "osa_log_level" -#define ENB_CONFIG_STRING_OSA_LOG_VERBOSITY "osa_log_verbosity" - - -#define KHz (1000UL) -#define MHz (1000 * KHz) - -typedef struct eutra_band_s { - int16_t band; - uint32_t ul_min; - uint32_t ul_max; - uint32_t dl_min; - uint32_t dl_max; - lte_frame_type_t frame_type; -} eutra_band_t; - -static const eutra_band_t eutra_bands[] = { - { 1, 1920 * MHz, 1980 * MHz, 2110 * MHz, 2170 * MHz, FDD}, - { 2, 1850 * MHz, 1910 * MHz, 1930 * MHz, 1990 * MHz, FDD}, - { 3, 1710 * MHz, 1785 * MHz, 1805 * MHz, 1880 * MHz, FDD}, - { 4, 1710 * MHz, 1755 * MHz, 2110 * MHz, 2155 * MHz, FDD}, - { 5, 824 * MHz, 849 * MHz, 869 * MHz, 894 * MHz, FDD}, - { 6, 830 * MHz, 840 * MHz, 875 * MHz, 885 * MHz, FDD}, - { 7, 2500 * MHz, 2570 * MHz, 2620 * MHz, 2690 * MHz, FDD}, - { 8, 880 * MHz, 915 * MHz, 925 * MHz, 960 * MHz, FDD}, - { 9, 1749900 * KHz, 1784900 * KHz, 1844900 * KHz, 1879900 * KHz, FDD}, - {10, 1710 * MHz, 1770 * MHz, 2110 * MHz, 2170 * MHz, FDD}, - {11, 1427900 * KHz, 1452900 * KHz, 1475900 * KHz, 1500900 * KHz, FDD}, - {12, 698 * MHz, 716 * MHz, 728 * MHz, 746 * MHz, FDD}, - {13, 777 * MHz, 787 * MHz, 746 * MHz, 756 * MHz, FDD}, - {14, 788 * MHz, 798 * MHz, 758 * MHz, 768 * MHz, FDD}, - - {17, 704 * MHz, 716 * MHz, 734 * MHz, 746 * MHz, FDD}, - {20, 832 * MHz, 862 * MHz, 791 * MHz, 821 * MHz, FDD}, - {33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD}, - {33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD}, - {34, 2010 * MHz, 2025 * MHz, 2010 * MHz, 2025 * MHz, TDD}, - {35, 1850 * MHz, 1910 * MHz, 1850 * MHz, 1910 * MHz, TDD}, - {36, 1930 * MHz, 1990 * MHz, 1930 * MHz, 1990 * MHz, TDD}, - {37, 1910 * MHz, 1930 * MHz, 1910 * MHz, 1930 * MHz, TDD}, - {38, 2570 * MHz, 2620 * MHz, 2570 * MHz, 2630 * MHz, TDD}, - {39, 1880 * MHz, 1920 * MHz, 1880 * MHz, 1920 * MHz, TDD}, - {40, 2300 * MHz, 2400 * MHz, 2300 * MHz, 2400 * MHz, TDD}, - {41, 2496 * MHz, 2690 * MHz, 2496 * MHz, 2690 * MHz, TDD}, - {42, 3400 * MHz, 3600 * MHz, 3400 * MHz, 3600 * MHz, TDD}, - {43, 3600 * MHz, 3800 * MHz, 3600 * MHz, 3800 * MHz, TDD}, - {44, 703 * MHz, 803 * MHz, 703 * MHz, 803 * MHz, TDD}, -}; - -Enb_properties_array_t enb_properties; - -void enb_config_display(void) -{ - int i,j; - - printf( "\n----------------------------------------------------------------------\n"); - printf( " ENB CONFIG FILE CONTENT LOADED (TBC):\n"); - printf( "----------------------------------------------------------------------\n"); - - for (i = 0; i < enb_properties.number; i++) { - printf( "ENB CONFIG for instance %u:\n\n", i); - printf( "\teNB name: \t%s:\n",enb_properties.properties[i]->eNB_name); - printf( "\teNB ID: \t%"PRIu32":\n",enb_properties.properties[i]->eNB_id); - printf( "\tCell type: \t%s:\n",enb_properties.properties[i]->cell_type == CELL_MACRO_ENB ? "CELL_MACRO_ENB":"CELL_HOME_ENB"); - printf( "\tTAC: \t%"PRIu16":\n",enb_properties.properties[i]->tac); - printf( "\tMCC: \t%"PRIu16":\n",enb_properties.properties[i]->mcc); - - if (enb_properties.properties[i]->mnc_digit_length == 3) { - printf( "\tMNC: \t%03"PRIu16":\n",enb_properties.properties[i]->mnc); - } else { - printf( "\tMNC: \t%02"PRIu16":\n",enb_properties.properties[i]->mnc); - } - - for (j=0; j< enb_properties.properties[i]->nb_rrh_gw; j++) { - if (enb_properties.properties[i]->rrh_gw_config[j].active == 1 ){ - printf( "\n\tRRH GW %d config for eNB %u:\n\n", j, i); - printf( "\tinterface name : \t%s:\n",enb_properties.properties[i]->rrh_gw_if_name); - printf( "\tlocal address : \t%s:\n",enb_properties.properties[i]->rrh_gw_config[j].local_address); - printf( "\tlocal port : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].local_port); - printf( "\tremote address : \t%s:\n",enb_properties.properties[i]->rrh_gw_config[j].remote_address); - printf( "\tremote port : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].remote_port); - printf( "\ttx_scheduling_advance :\t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_scheduling_advance); - printf( "\ttx_sample_advance : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].tx_sample_advance); - printf( "\tiq_txshift : \t%d:\n",enb_properties.properties[i]->rrh_gw_config[j].iq_txshift); - printf( "\ttransport : \t%s Ethernet:\n",(enb_properties.properties[i]->rrh_gw_config[j].raw == 1)? "RAW" : "UDP"); - if (enb_properties.properties[i]->rrh_gw_config[j].exmimo == 1) { - printf( "\tRF target : \tEXMIMO:\n\n"); - } else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_b200 == 1) { - printf( "\tRF target : \tUSRP_B200:\n\n"); - } else if (enb_properties.properties[i]->rrh_gw_config[j].usrp_x300 == 1) { - printf( "\tRF target : \tUSRP_X300:\n\n"); - } else if (enb_properties.properties[i]->rrh_gw_config[j].bladerf == 1) { - printf( "\tRF target : \tBLADERF:\n\n"); - } else if (enb_properties.properties[i]->rrh_gw_config[j].lmssdr == 1) { - printf( "\tRF target : \tLMSSDR:\n\n"); - } else { - printf( "\tRF target : \tNONE:\n\n"); - } - } - } - - - for (j=0; j< enb_properties.properties[i]->nb_cc; j++) { - printf( "\teutra band for CC %d: \t%"PRId16":\n",j,enb_properties.properties[i]->eutra_band[j]); - printf( "\tdownlink freq for CC %d: \t%"PRIu64":\n",j,enb_properties.properties[i]->downlink_frequency[j]); - printf( "\tuplink freq offset for CC %d: \t%"PRId32":\n",j,enb_properties.properties[i]->uplink_frequency_offset[j]); - - printf( "\n\tCell ID for CC %d:\t%"PRId16":\n",j,enb_properties.properties[i]->Nid_cell[j]); - printf( "\tN_RB_DL for CC %d:\t%"PRId16":\n",j,enb_properties.properties[i]->N_RB_DL[j]); - printf( "\tnb_antennas_tx for CC %d:\t%d:\n",j,enb_properties.properties[i]->nb_antennas_tx[j]); - printf( "\tnb_antennas_rx for CC %d:\t%d:\n",j,enb_properties.properties[i]->nb_antennas_rx[j]); - - // RACH-Config - printf( "\trach_numberOfRA_Preambles for CC %d:\t%ld:\n",j,enb_properties.properties[i]->rach_numberOfRA_Preambles[j]); - printf( "\trach_preamblesGroupAConfig for CC %d:\t%d:\n",j,enb_properties.properties[i]->rach_preamblesGroupAConfig[j]); - - if (enb_properties.properties[i]->rach_preamblesGroupAConfig[j]) { - printf( "\trach_sizeOfRA_PreamblesGroupA for CC %d:\t%ld:\n",j,enb_properties.properties[i]->rach_sizeOfRA_PreamblesGroupA[j]); - printf( "\trach_messageSizeGroupA for CC %d:\t%ld:\n",j,enb_properties.properties[i]->rach_messageSizeGroupA[j]); - printf( "\trach_messagePowerOffsetGroupB for CC %d:\t%d:\n",j,enb_properties.properties[i]->rach_messagePowerOffsetGroupB[j]); - } - - printf( "\trach_powerRampingStep for CC %d:\t%ld:\n",j,enb_properties.properties[i]->rach_powerRampingStep[j]); - printf( "\trach_preambleInitialReceivedTargetPower for CC %d:\t%ld:\n",j,enb_properties.properties[i]->rach_preambleInitialReceivedTargetPower[j]); - printf( "\trach_preambleTransMax for CC %d:\t%ld:\n",j,enb_properties.properties[i]->rach_preambleTransMax[j]); - printf( "\trach_raResponseWindowSize for CC %d:\t%ld:\n",j,enb_properties.properties[i]->rach_raResponseWindowSize[j]); - printf( "\trach_macContentionResolutionTimer for CC %d:\t%ld:\n",j,enb_properties.properties[i]->rach_macContentionResolutionTimer[j]); - printf( "\trach_maxHARQ_Msg3Tx for CC %d:\t%ld:\n",j,enb_properties.properties[i]->rach_maxHARQ_Msg3Tx[j]); - - // BCCH-Config - printf( "\tbcch_modificationPeriodCoeff for CC %d:\t%ld:\n",j,enb_properties.properties[i]->bcch_modificationPeriodCoeff[j]); - - // PCCH-Config - printf( "\tpcch_defaultPagingCycle for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pcch_defaultPagingCycle[j]); - printf( "\tpcch_nB for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pcch_nB[j]); - - // PRACH-Config - printf( "\tprach_root for CC %d:\t%ld:\n",j,enb_properties.properties[i]->prach_root[j]); - printf( "\tprach_config_index for CC %d:\t%ld:\n",j,enb_properties.properties[i]->prach_config_index[j]); - printf( "\tprach_high_speed for CC %d:\t%d:\n",j,enb_properties.properties[i]->prach_high_speed[j]); - printf( "\tprach_zero_correlation for CC %d:\t%ld:\n",j,enb_properties.properties[i]->prach_zero_correlation[j]); - printf( "\tprach_freq_offset for CC %d:\t%ld:\n",j,enb_properties.properties[i]->prach_freq_offset[j]); - - // PDSCH-Config - printf( "\tpdsch_referenceSignalPower for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pdsch_referenceSignalPower[j]); - printf( "\tpdsch_p_b for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pdsch_p_b[j]); - - // PUSCH-Config - printf( "\tpusch_n_SB for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pusch_n_SB[j]); - printf( "\tpusch_hoppingMode for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pusch_hoppingMode[j]); - printf( "\tpusch_hoppingOffset for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pusch_hoppingOffset[j]); - printf( "\tpusch_enable64QAM for CC %d:\t%d:\n",j,enb_properties.properties[i]->pusch_enable64QAM[j]); - printf( "\tpusch_groupHoppingEnabled for CC %d:\t%d:\n",j,enb_properties.properties[i]->pusch_groupHoppingEnabled[j]); - printf( "\tpusch_groupAssignment for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pusch_groupAssignment[j]); - printf( "\tpusch_sequenceHoppingEnabled for CC %d:\t%d:\n",j,enb_properties.properties[i]->pusch_sequenceHoppingEnabled[j]); - printf( "\tpusch_nDMRS1 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pusch_nDMRS1[j]); - - // PUCCH-Config - - printf( "\tpucch_delta_shift for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pucch_delta_shift[j]); - printf( "\tpucch_nRB_CQI for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pucch_nRB_CQI[j]); - printf( "\tpucch_nCS_AN for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pucch_nCS_AN[j]); -#ifndef Rel10 - printf( "\tpucch_n1_AN for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pucch_n1_AN[j]); -#endif - - // SRS Config - printf( "\tsrs_enable for CC %d:\t%d:\n",j,enb_properties.properties[i]->srs_enable[j]); - - if (enb_properties.properties[i]->srs_enable[j]) { - printf( "\tsrs_BandwidthConfig for CC %d:\t%ld:\n",j,enb_properties.properties[i]->srs_BandwidthConfig[j]); - printf( "\tsrs_BandwidthConfig for CC %d:\t%ld:\n",j,enb_properties.properties[i]->srs_SubframeConfig[j]); - printf( "\tsrs_ackNackST for CC %d:\t%d:\n",j,enb_properties.properties[i]->srs_ackNackST[j]); - printf( "\tsrs_MaxUpPts for CC %d:\t%d:\n",j,enb_properties.properties[i]->srs_MaxUpPts[j]); - } - - // uplinkPowerControlCommon - - printf( "\tpusch_p0_Nominal for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pusch_p0_Nominal[j]); - printf( "\tpucch_p0_Nominal for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pucch_p0_Nominal[j]); - printf( "\tpusch_alpha for CC %d:\t%ld:\n",j,enb_properties.properties[i]->pusch_alpha[j]); - printf( "\tpucch_deltaF_Format1 for CC %d:\t%d:\n",j,enb_properties.properties[i]->pucch_deltaF_Format1[j]); - printf( "\tpucch_deltaF_Format1b for CC %d:\t%d:\n",j,enb_properties.properties[i]->pucch_deltaF_Format1b[j]); - printf( "\tpucch_deltaF_Format2 for CC %d:\t%d:\n",j,enb_properties.properties[i]->pucch_deltaF_Format2[j]); - printf( "\tpucch_deltaF_Format2a for CC %d:\t%d:\n",j,enb_properties.properties[i]->pucch_deltaF_Format2a[j]); - printf( "\tpucch_deltaF_Format2b for CC %d:\t%d:\n",j,enb_properties.properties[i]->pucch_deltaF_Format2b[j]); - printf( "\tmsg3_delta_Preamble for CC %d:\t%ld:\n",j,enb_properties.properties[i]->msg3_delta_Preamble[j]); - printf( "\tul_CyclicPrefixLength for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ul_CyclicPrefixLength[j]); - - // UE Timers and Constants - - printf( "\tue_TimersAndConstants_t300 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_t300[j]); - printf( "\tue_TimersAndConstants_t301 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_t301[j]); - printf( "\tue_TimersAndConstants_t310 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_t310[j]); - printf( "\tue_TimersAndConstants_n310 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_n310[j]); - printf( "\tue_TimersAndConstants_t311 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_t311[j]); - printf( "\tue_TimersAndConstants_n311 for CC %d:\t%ld:\n",j,enb_properties.properties[i]->ue_TimersAndConstants_n311[j]); - - } - - for (j=0; j < enb_properties.properties[i]->num_otg_elements; j++) { - printf( "\n\tOTG Destination UE ID: \t%"PRIu16, enb_properties.properties[i]->otg_ue_id[j]); - printf( "\n\tOTG App Type: \t%"PRIu8, enb_properties.properties[i]->otg_app_type[j]); - printf( "\n\tOTG Background Traffic: \t%s\n", (enb_properties.properties[i]->otg_bg_traffic[j]==1) ? "Enabled" : "Disabled"); - } - - printf( "\n\tGlobal log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->glog_level)); - printf( "\tHW log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->hw_log_level)); - printf( "\tPHY log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->phy_log_level)); - printf( "\tMAC log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->mac_log_level)); - printf( "\tRLC log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->rlc_log_level)); - printf( "\tPDCP log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->pdcp_log_level)); - printf( "\tRRC log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->rrc_log_level)); - printf( "\tUDP log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->udp_log_level)); - printf( "\tGTP log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->gtpu_log_level)); - printf( "\tOSA log level: \t%s\n", map_int_to_str(log_level_names,enb_properties.properties[i]->osa_log_level)); - - printf( "\n--------------------------------------------------------\n"); - } -} +#include "enb_paramdef.h" +#include "common/config/config_userapi.h" +extern uint16_t sf_ahead; static int enb_check_band_frequencies(char* lib_config_file_name_pP, - int enb_properties_index, + int ind, int16_t band, uint32_t downlink_frequency, int32_t uplink_frequency_offset, @@ -463,195 +75,421 @@ static int enb_check_band_frequencies(char* lib_config_file_name_pP, AssertError (eutra_bands[band_index].dl_min < downlink_frequency, errors ++, "Failed to parse eNB configuration file %s, enb %d downlink frequency %u too low (%u) for band %d!", - lib_config_file_name_pP, enb_properties_index, downlink_frequency, eutra_bands[band_index].dl_min, band); + lib_config_file_name_pP, ind, downlink_frequency, eutra_bands[band_index].dl_min, band); AssertError (downlink_frequency < eutra_bands[band_index].dl_max, errors ++, "Failed to parse eNB configuration file %s, enb %d downlink frequency %u too high (%u) for band %d!", - lib_config_file_name_pP, enb_properties_index, downlink_frequency, eutra_bands[band_index].dl_max, band); + lib_config_file_name_pP, ind, downlink_frequency, eutra_bands[band_index].dl_max, band); AssertError (eutra_bands[band_index].ul_min < uplink_frequency, errors ++, "Failed to parse eNB configuration file %s, enb %d uplink frequency %u too low (%u) for band %d!", - lib_config_file_name_pP, enb_properties_index, uplink_frequency, eutra_bands[band_index].ul_min, band); + lib_config_file_name_pP, ind, uplink_frequency, eutra_bands[band_index].ul_min, band); AssertError (uplink_frequency < eutra_bands[band_index].ul_max, errors ++, "Failed to parse eNB configuration file %s, enb %d uplink frequency %u too high (%u) for band %d!", - lib_config_file_name_pP, enb_properties_index, uplink_frequency, eutra_bands[band_index].ul_max, band); + lib_config_file_name_pP, ind, uplink_frequency, eutra_bands[band_index].ul_max, band); AssertError (eutra_bands[band_index].frame_type == frame_type, errors ++, "Failed to parse eNB configuration file %s, enb %d invalid frame type (%d/%d) for band %d!", - lib_config_file_name_pP, enb_properties_index, eutra_bands[band_index].frame_type, frame_type, band); + lib_config_file_name_pP, ind, eutra_bands[band_index].frame_type, frame_type, band); } } } + return errors; } -#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) -extern int asn_debug; -extern int asn1_xer_print; -#endif -#ifdef LIBCONFIG_LONG -#define libconfig_int long -#else -#define libconfig_int int -#endif -const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP) -{ - config_t cfg; - config_setting_t *setting = NULL; - config_setting_t *subsetting = NULL; - config_setting_t *setting_component_carriers = NULL; - config_setting_t *component_carrier = NULL; - config_setting_t *setting_srb1 = NULL; - config_setting_t *setting_mme_addresses = NULL; - config_setting_t *setting_mme_address = NULL; - config_setting_t *setting_rrh_gws = NULL; - config_setting_t *setting_rrh_gw = NULL; - config_setting_t *setting_enb = NULL; - config_setting_t *setting_otg = NULL; - config_setting_t *subsetting_otg = NULL; - int num_enb_properties = 0; - int enb_properties_index = 0; - int num_enbs = 0; - int num_mme_address = 0; - int num_rrh_gw = 0; - int num_otg_elements = 0; - int num_component_carriers = 0; - int i = 0; - int j = 0; - int parse_errors = 0; - libconfig_int enb_id = 0; - const char* cell_type = NULL; - const char* tac = 0; - const char* enb_name = NULL; - const char* mcc = 0; - const char* mnc = 0; - const char* frame_type = NULL; - libconfig_int tdd_config = 0; - libconfig_int tdd_config_s = 0; - const char* prefix_type = NULL; - libconfig_int eutra_band = 0; - long long int downlink_frequency = 0; - libconfig_int uplink_frequency_offset = 0; - libconfig_int Nid_cell = 0; - libconfig_int Nid_cell_mbsfn = 0; - libconfig_int N_RB_DL = 0; - libconfig_int nb_antennas_tx = 0; - libconfig_int nb_antennas_rx = 0; - libconfig_int tx_gain = 0; - libconfig_int rx_gain = 0; - libconfig_int prach_root = 0; - libconfig_int prach_config_index = 0; - const char* prach_high_speed = NULL; - libconfig_int prach_zero_correlation = 0; - libconfig_int prach_freq_offset = 0; - libconfig_int pucch_delta_shift = 0; - libconfig_int pucch_nRB_CQI = 0; - libconfig_int pucch_nCS_AN = 0; -#ifndef Rel10 - libconfig_int pucch_n1_AN = 0; -#endif - libconfig_int pdsch_referenceSignalPower = 0; - libconfig_int pdsch_p_b = 0; - libconfig_int pusch_n_SB = 0; - const char * pusch_hoppingMode = NULL; - libconfig_int pusch_hoppingOffset = 0; - const char* pusch_enable64QAM = NULL; - const char* pusch_groupHoppingEnabled = NULL; - libconfig_int pusch_groupAssignment = 0; - const char* pusch_sequenceHoppingEnabled = NULL; - libconfig_int pusch_nDMRS1 = 0; - const char* phich_duration = NULL; - const char* phich_resource = NULL; - const char* srs_enable = NULL; - libconfig_int srs_BandwidthConfig = 0; - libconfig_int srs_SubframeConfig = 0; - const char* srs_ackNackST = NULL; - const char* srs_MaxUpPts = NULL; - libconfig_int pusch_p0_Nominal = 0; - const char* pusch_alpha = NULL; - libconfig_int pucch_p0_Nominal = 0; - libconfig_int msg3_delta_Preamble = 0; - //libconfig_int ul_CyclicPrefixLength = 0; - const char* pucch_deltaF_Format1 = NULL; - //const char* pucch_deltaF_Format1a = NULL; - const char* pucch_deltaF_Format1b = NULL; - const char* pucch_deltaF_Format2 = NULL; - const char* pucch_deltaF_Format2a = NULL; - const char* pucch_deltaF_Format2b = NULL; - libconfig_int rach_numberOfRA_Preambles = 0; - const char* rach_preamblesGroupAConfig = NULL; - libconfig_int rach_sizeOfRA_PreamblesGroupA = 0; - libconfig_int rach_messageSizeGroupA = 0; - const char* rach_messagePowerOffsetGroupB = NULL; - libconfig_int rach_powerRampingStep = 0; - libconfig_int rach_preambleInitialReceivedTargetPower = 0; - libconfig_int rach_preambleTransMax = 0; - libconfig_int rach_raResponseWindowSize = 0; - libconfig_int rach_macContentionResolutionTimer = 0; - libconfig_int rach_maxHARQ_Msg3Tx = 0; - libconfig_int pcch_defaultPagingCycle = 0; - const char* pcch_nB = NULL; - libconfig_int bcch_modificationPeriodCoeff = 0; - libconfig_int ue_TimersAndConstants_t300 = 0; - libconfig_int ue_TimersAndConstants_t301 = 0; - libconfig_int ue_TimersAndConstants_t310 = 0; - libconfig_int ue_TimersAndConstants_t311 = 0; - libconfig_int ue_TimersAndConstants_n310 = 0; - libconfig_int ue_TimersAndConstants_n311 = 0; +void RCconfig_L1(void) { + int i,j; + paramdef_t L1_Params[] = L1PARAMS_DESC; + paramlist_def_t L1_ParamList = {CONFIG_STRING_L1_LIST,NULL,0}; + if (RC.eNB == NULL) { + RC.eNB = (PHY_VARS_eNB ***)malloc((1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB**)); + LOG_I(PHY,"RC.eNB = %p\n",RC.eNB); + memset(RC.eNB,0,(1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB**)); + RC.nb_L1_CC = malloc((1+RC.nb_L1_inst)*sizeof(int)); + } - libconfig_int srb1_timer_poll_retransmit = 0; - libconfig_int srb1_timer_reordering = 0; - libconfig_int srb1_timer_status_prohibit = 0; - libconfig_int srb1_poll_pdu = 0; - libconfig_int srb1_poll_byte = 0; - libconfig_int srb1_max_retx_threshold = 0; + config_getlist( &L1_ParamList,L1_Params,sizeof(L1_Params)/sizeof(paramdef_t), NULL); + if (L1_ParamList.numelt > 0) { - libconfig_int my_int; + for (j = 0; j < RC.nb_L1_inst; j++) { + RC.nb_L1_CC[j] = *(L1_ParamList.paramarray[j][L1_CC_IDX].uptr); + + if (RC.eNB[j] == NULL) { + RC.eNB[j] = (PHY_VARS_eNB **)malloc((1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB*)); + LOG_I(PHY,"RC.eNB[%d] = %p\n",j,RC.eNB[j]); + memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB*)); + } + + for (i=0;iMod_id = j; + RC.eNB[j][i]->CC_id = i; + } + } + + if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) { + + sf_ahead = 4; // Need 4 subframe gap between RX and TX + } + else if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) { + RC.eNB[j][0]->eth_params_n.local_if_name = strdup(*(L1_ParamList.paramarray[j][L1_LOCAL_N_IF_NAME_IDX].strptr)); + RC.eNB[j][0]->eth_params_n.my_addr = strdup(*(L1_ParamList.paramarray[j][L1_LOCAL_N_ADDRESS_IDX].strptr)); + RC.eNB[j][0]->eth_params_n.remote_addr = strdup(*(L1_ParamList.paramarray[j][L1_REMOTE_N_ADDRESS_IDX].strptr)); + RC.eNB[j][0]->eth_params_n.my_portc = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTC_IDX].iptr); + RC.eNB[j][0]->eth_params_n.remote_portc = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTC_IDX].iptr); + RC.eNB[j][0]->eth_params_n.my_portd = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTD_IDX].iptr); + RC.eNB[j][0]->eth_params_n.remote_portd = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr); + RC.eNB[j][0]->eth_params_n.transp_preference = ETH_UDP_MODE; + + sf_ahead = 2; // Cannot cope with 4 subframes betweem RX and TX - set it to 2 + + RC.nb_macrlc_inst = 1; // This is used by mac_top_init_eNB() + + // This is used by init_eNB_afterRU() + RC.nb_CC = (int *)malloc((1+RC.nb_inst)*sizeof(int)); + RC.nb_CC[0]=1; + + RC.nb_inst =1; // DJP - feptx_prec uses num_eNB but phy_init_RU uses nb_inst + + LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_inst=1 this is because phy_init_RU() uses that to index and not RC.num_eNB - why the 2 similar variables?\n", __FUNCTION__); + LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_CC[0]=%d for init_eNB_afterRU()\n", __FUNCTION__, RC.nb_CC[0]); + LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_macrlc_inst:%d because used by mac_top_init_eNB()\n", __FUNCTION__, RC.nb_macrlc_inst); + + mac_top_init_eNB(); + + configure_nfapi_pnf(RC.eNB[j][0]->eth_params_n.remote_addr, RC.eNB[j][0]->eth_params_n.remote_portc, RC.eNB[j][0]->eth_params_n.my_addr, RC.eNB[j][0]->eth_params_n.my_portd, RC.eNB[j][0]->eth_params_n .remote_portd); + } + else { // other midhaul + } + }// j=0..num_inst + printf("Initializing northbound interface for L1\n"); + l1_north_init_eNB(); + } else { + LOG_I(PHY,"No " CONFIG_STRING_L1_LIST " configuration found"); + + // DJP need to create some structures for VNF + + j = 0; + + RC.nb_L1_CC = malloc((1+RC.nb_L1_inst)*sizeof(int)); // DJP - 1 lot then??? + + RC.nb_L1_CC[j]=1; // DJP - hmmm + + if (RC.eNB[j] == NULL) { + RC.eNB[j] = (PHY_VARS_eNB **)malloc((1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB**)); + LOG_I(PHY,"RC.eNB[%d] = %p\n",j,RC.eNB[j]); + memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB***)); + } + + for (i=0;iMod_id = j; + RC.eNB[j][i]->CC_id = i; + } + } + } +} + +void RCconfig_macrlc() { + int j; - char* if_name = NULL; - char* ipv4 = NULL; - char* ipv4_remote = NULL; - char* ipv6 = NULL; - char* active = NULL; - char* preference = NULL; + paramdef_t MacRLC_Params[] = MACRLCPARAMS_DESC; + paramlist_def_t MacRLC_ParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0}; - char* tr_preference = NULL; - char* rf_preference = NULL; - libconfig_int tx_scheduling_advance = 0; - libconfig_int tx_sample_advance = 0; - libconfig_int iq_txshift = 0; - libconfig_int local_port = 0; - libconfig_int remote_port = 0; - const char* active_enb[MAX_ENB]; - char* enb_interface_name_for_S1U = NULL; - char* enb_ipv4_address_for_S1U = NULL; - libconfig_int enb_port_for_S1U = 0; - char* enb_interface_name_for_S1_MME = NULL; - char* enb_ipv4_address_for_S1_MME = NULL; - char *address = NULL; - char *cidr = NULL; - char *astring = NULL; + config_getlist( &MacRLC_ParamList,MacRLC_Params,sizeof(MacRLC_Params)/sizeof(paramdef_t), NULL); + + if ( MacRLC_ParamList.numelt > 0) { -// char* proto_agent_interface_name = NULL; -// char* proto_agent_ipv4_address = NULL; -// libconfig_int proto_agent_port = 0; -// char* proto_agent_cache = NULL; + RC.nb_macrlc_inst=MacRLC_ParamList.numelt; + mac_top_init_eNB(); + for (j=0;jeth_params_n.local_if_name = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_IF_NAME_IDX].strptr)); + RC.mac[j]->eth_params_n.my_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_ADDRESS_IDX].strptr)); + RC.mac[j]->eth_params_n.remote_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_ADDRESS_IDX].strptr)); + RC.mac[j]->eth_params_n.my_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTC_IDX].iptr); + RC.mac[j]->eth_params_n.remote_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTC_IDX].iptr); + RC.mac[j]->eth_params_n.my_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTD_IDX].iptr); + RC.mac[j]->eth_params_n.remote_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTD_IDX].iptr);; + RC.mac[j]->eth_params_n.transp_preference = ETH_UDP_MODE; + } else { // other midhaul + AssertFatal(1==0,"MACRLC %d: %s unknown northbound midhaul\n",j, *(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr)); + } + + if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_L1") == 0) { + + + } else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "nfapi") == 0) { + RC.mac[j]->eth_params_s.local_if_name = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_IF_NAME_IDX].strptr)); + RC.mac[j]->eth_params_s.my_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_ADDRESS_IDX].strptr)); + RC.mac[j]->eth_params_s.remote_addr = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_ADDRESS_IDX].strptr)); + RC.mac[j]->eth_params_s.my_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTC_IDX].iptr); + RC.mac[j]->eth_params_s.remote_portc = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTC_IDX].iptr); + RC.mac[j]->eth_params_s.my_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTD_IDX].iptr); + RC.mac[j]->eth_params_s.remote_portd = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTD_IDX].iptr); + RC.mac[j]->eth_params_s.transp_preference = ETH_UDP_MODE; + + sf_ahead = 2; // Cannot cope with 4 subframes betweem RX and TX - set it to 2 + + printf("**************** vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc); + configure_nfapi_vnf(RC.mac[j]->eth_params_s.my_addr, RC.mac[j]->eth_params_s.my_portc); + printf("**************** RETURNED FROM configure_nfapi_vnf() vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc); + } else { // other midhaul + AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr)); + } + }// j=0..num_inst + } else {// MacRLC_ParamList.numelt > 0 + AssertFatal (0, + "No " CONFIG_STRING_MACRLC_LIST " configuration found"); + } +} + + +void RCconfig_cudu() { + int j; + char *transport_type; + char *du_type; + char *balancing; + + + + pthread_t myid = pthread_self(); + printf("CONFIG my id is %u\n", myid); + + paramdef_t DU_Params[] = DUPARAMS_DESC; + paramdef_t CU_Params[] = CUPARAMS_DESC; + paramlist_def_t DU_ParamList = {CONFIG_STRING_DU_LIST,NULL,0}; + paramlist_def_t CU_ParamList = {CONFIG_STRING_CU_LIST,NULL,0}; + + config_getlist( &DU_ParamList,DU_Params,sizeof(DU_Params)/sizeof(paramdef_t), NULL); + config_getlist( &CU_ParamList,CU_Params,sizeof(CU_Params)/sizeof(paramdef_t), NULL); + + paramdef_t CU_Bal[] = CU_BAL_DESC; + paramlist_def_t CU_BalList = {CONFIG_STRING_CU_BALANCING, NULL, 0}; + config_get(&CU_Bal, sizeof(CU_Bal)/sizeof(paramdef_t),NULL); + + //printf("%s\n", strdup(*(CU_Bal[0].strptr))); + + balancing = strdup(*(CU_Bal[0].strptr)); + if (strcmp(balancing, "ALL") == 0) + { + RC.cudu.cu_balancing = CU_BALANCING_ALL; + } + else if (strcmp(balancing, "ROUND_ROBIN") == 0) + { + RC.cudu.cu_balancing = CU_BALANCING_ROUND_ROBIN; + } + else + { + RC.cudu.cu_balancing = atoi(balancing) - 1; + } + + // DU Parameters + RC.cudu.local_du.du_interface = strdup(*(DU_ParamList.paramarray[0][DU_INTERFACE_F1U].strptr)); + RC.cudu.local_du.du_ipv4_address = strdup(*(DU_ParamList.paramarray[0][DU_ADDRESS_F1U].strptr)); + RC.cudu.local_du.du_port = *(DU_ParamList.paramarray[0][DU_PORT_F1U].iptr); + transport_type = strdup(*(DU_ParamList.paramarray[0][DU_TYPE_F1U].strptr)); + + if (strcmp(transport_type, "TCP") == 0) + { + RC.cudu.local_du.tcp = 1; + RC.cudu.local_du.udp = 0; + RC.cudu.local_du.sctp = 0; + } + else if (strcmp(transport_type, "UDP") == 0) + { + RC.cudu.local_du.tcp = 0; + RC.cudu.local_du.udp = 1; + RC.cudu.local_du.sctp = 0; + } + else if (strcmp(transport_type, "SCTP") == 0) + { + RC.cudu.local_du.tcp = 0; + RC.cudu.local_du.udp = 0; + RC.cudu.local_du.sctp = 1; + } + else + { + RC.cudu.local_du.tcp = 1; + RC.cudu.local_du.udp = 0; + RC.cudu.local_du.sctp = 0; + } + + //CU Parameters + j = CU_ParamList.numelt; + RC.cudu.serving_dus = j; + for (int k=0; k0) { + // Output a list of all eNBs. + config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL); + + + + + if (ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr == NULL) { + // Calculate a default eNB ID # if defined(ENABLE_USE_MME) - uint32_t hash; - - hash = s1ap_generate_eNB_id (); - enb_id = i + (hash & 0xFFFF8); + uint32_t hash; + + hash = s1ap_generate_eNB_id (); + enb_id = i + (hash & 0xFFFF8); # else - enb_id = i; + enb_id = i; # endif + } else { + enb_id = *(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr); } - if ( !( config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_CELL_TYPE, &cell_type) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_ENB_NAME, &enb_name) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_TRACKING_AREA_CODE, &tac) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE, &mcc) - && config_setting_lookup_string(setting_enb, ENB_CONFIG_STRING_MOBILE_NETWORK_CODE, &mnc) + + printf("RRC %d: Southbound Transport %s\n",i,*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr)); + + if (strcmp(*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_mac") == 0) { - ) - ) { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, %u th enb\n", - lib_config_file_name_pP, i); - continue; // FIXME this prevents segfaults below, not sure what happens after function exit } + else if (strcmp(*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr), "cudu") == 0) { + rrc->eth_params_s.local_if_name = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_IF_NAME_IDX].strptr)); + rrc->eth_params_s.my_addr = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_ADDRESS_IDX].strptr)); + rrc->eth_params_s.remote_addr = strdup(*(ENBParamList.paramarray[i][ENB_REMOTE_S_ADDRESS_IDX].strptr)); + rrc->eth_params_s.my_portc = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTC_IDX].uptr); + rrc->eth_params_s.remote_portc = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTC_IDX].uptr); + rrc->eth_params_s.my_portd = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTD_IDX].uptr); + rrc->eth_params_s.remote_portd = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTD_IDX].uptr); + rrc->eth_params_s.transp_preference = ETH_UDP_MODE; + } + + else { // other midhaul + } // search if in active list - for (j=0; j < num_enb_properties; j++) { - if (strcmp(active_enb[j], enb_name) == 0) { - enb_properties.properties[enb_properties_index] = calloc(1, sizeof(Enb_properties_t)); - enb_properties.properties[enb_properties_index]->eNB_id = enb_id; + + + + - if (strcmp(cell_type, "CELL_MACRO_ENB") == 0) { - enb_properties.properties[enb_properties_index]->cell_type = CELL_MACRO_ENB; - } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) { - enb_properties.properties[enb_properties_index]->cell_type = CELL_HOME_ENB; - } else { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n", - lib_config_file_name_pP, i, cell_type); - } + for (k=0; k eNB_name = strdup(enb_name); - enb_properties.properties[enb_properties_index]->tac = (uint16_t)atoi(tac); - enb_properties.properties[enb_properties_index]->mcc = (uint16_t)atoi(mcc); - enb_properties.properties[enb_properties_index]->mnc = (uint16_t)atoi(mnc); - enb_properties.properties[enb_properties_index]->mnc_digit_length = strlen(mnc); - AssertFatal((enb_properties.properties[enb_properties_index]->mnc_digit_length == 2) || - (enb_properties.properties[enb_properties_index]->mnc_digit_length == 3), - "BAD MNC DIGIT LENGTH %d", - enb_properties.properties[i]->mnc_digit_length); + + RRC_CONFIGURATION_REQ (msg_p).cell_identity = enb_id; + + /* + if (strcmp(*(ENBParamList.paramarray[i][ENB_CELL_TYPE_IDX].strptr), "CELL_MACRO_ENB") == 0) { + enb_properties_loc.properties[enb_properties_loc_index]->cell_type = CELL_MACRO_ENB; + } else if (strcmp(cell_type, "CELL_HOME_ENB") == 0) { + enb_properties_loc.properties[enb_properties_loc_index]->cell_type = CELL_HOME_ENB; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n", + lib_config_file_name_pP, i, cell_type); + } + + enb_properties_loc.properties[enb_properties_loc_index]->eNB_name = strdup(enb_name); + */ + RRC_CONFIGURATION_REQ (msg_p).tac = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_TRACKING_AREA_CODE_IDX].strptr) ); + RRC_CONFIGURATION_REQ (msg_p).mcc = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_COUNTRY_CODE_IDX].strptr) ); + RRC_CONFIGURATION_REQ (msg_p).mnc = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr) ); + RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr)); + AssertFatal((RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length == 2) || + (RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length == 3), + "BAD MNC DIGIT LENGTH %d", + RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length); + + + // Parse optional physical parameters + sprintf(enbpath,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k), + config_getlist( &CCsParamList,NULL,0,enbpath); + + LOG_I(RRC,"num component carriers %d \n", num_component_carriers); + if ( CCsParamList.numelt> 0) { + char ccspath[MAX_OPTNAME_SIZE*2 + 16]; + + + + + + //enb_properties_loc.properties[enb_properties_loc_index]->nb_cc = num_component_carriers; - // Parse optional physical parameters + for (j = 0; j < CCsParamList.numelt ;j++) { + + sprintf(ccspath,"%s.%s.[%i]",enbpath,ENB_CONFIG_STRING_COMPONENT_CARRIERS,j); + config_get( CCsParams,sizeof(CCsParams)/sizeof(paramdef_t),ccspath); - setting_component_carriers = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_COMPONENT_CARRIERS); - enb_properties.properties[enb_properties_index]->nb_cc = 0; + //printf("Component carrier %d\n",component_carrier); - if (setting_component_carriers != NULL) { + - num_component_carriers = config_setting_length(setting_component_carriers); - printf("num component carrier %d \n", num_component_carriers); - - //enb_properties.properties[enb_properties_index]->nb_cc = num_component_carriers; - for (j = 0; j < num_component_carriers /*&& j < MAX_NUM_CCs*/; j++) { - component_carrier = config_setting_get_elem(setting_component_carriers, j); - - //printf("Component carrier %d\n",component_carrier); - if (!(config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_FRAME_TYPE, &frame_type) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_TDD_CONFIG, &tdd_config) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_TDD_CONFIG_S, &tdd_config_s) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PREFIX_TYPE, &prefix_type) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_EUTRA_BAND, &eutra_band) - && config_setting_lookup_int64(component_carrier, ENB_CONFIG_STRING_DOWNLINK_FREQUENCY, &downlink_frequency) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET, &uplink_frequency_offset) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_NID_CELL, &Nid_cell) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_N_RB_DL, &N_RB_DL) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_CELL_MBSFN, &Nid_cell_mbsfn) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_NB_ANT_TX, &nb_antennas_tx) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_NB_ANT_RX, &nb_antennas_rx) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_TX_GAIN, &tx_gain) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RX_GAIN, &rx_gain) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PRACH_ROOT, &prach_root) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PRACH_CONFIG_INDEX, &prach_config_index) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PRACH_HIGH_SPEED, &prach_high_speed) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PRACH_ZERO_CORRELATION, &prach_zero_correlation) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PRACH_FREQ_OFFSET, &prach_freq_offset) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTA_SHIFT, &pucch_delta_shift) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUCCH_NRB_CQI, &pucch_nRB_CQI) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUCCH_NCS_AN, &pucch_nCS_AN) -#ifndef Rel10 - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUCCH_N1_AN, &pucch_n1_AN) + nb_cc++; + /* + if (strcmp(cc_node_function, "eNodeB_3GPP") == 0) { + enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = eNodeB_3GPP; + } else if (strcmp(cc_node_function, "eNodeB_3GPP_BBU") == 0) { + enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = eNodeB_3GPP_BBU; + } else if (strcmp(cc_node_function, "NGFI_RCC_IF4p5") == 0) { + enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RCC_IF4p5; + } else if (strcmp(cc_node_function, "NGFI_RAU_IF4p5") == 0) { + enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RAU_IF4p5; + } else if (strcmp(cc_node_function, "NGFI_RRU_IF4p5") == 0) { + enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RRU_IF4p5; + } else if (strcmp(cc_node_function, "NGFI_RRU_IF5") == 0) { + enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RRU_IF5; + } else { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for node_function choice: eNodeB_3GPP or eNodeB_3GPP_BBU or NGFI_IF4_RCC or NGFI_IF4_RRU or NGFI_IF5_RRU !\n", + lib_config_file_name_pP, i, cc_node_function); + } + + if (strcmp(cc_node_timing, "synch_to_ext_device") == 0) { + enb_properties_loc.properties[enb_properties_loc_index]->cc_node_timing[j] = synch_to_ext_device; + } else if (strcmp(cc_node_timing, "synch_to_other") == 0) { + enb_properties_loc.properties[enb_properties_loc_index]->cc_node_timing[j] = synch_to_other; + } else { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for node_function choice: SYNCH_TO_DEVICE or SYNCH_TO_OTHER !\n", + lib_config_file_name_pP, i, cc_node_timing); + } + + if ((cc_node_synch_ref >= -1) && (cc_node_synch_ref < num_component_carriers)) { + enb_properties_loc.properties[enb_properties_loc_index]->cc_node_synch_ref[j] = (int16_t) cc_node_synch_ref; + } else { + AssertError (0, parse_errors ++, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for node_synch_ref choice: valid CC_id or -1 !\n", + lib_config_file_name_pP, i, cc_node_synch_ref); + } + */ + + RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config; + + AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6, + "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!", + RC.config_file_name, i, tdd_config, TDD_Config__subframeAssignment_sa6); + + RRC_CONFIGURATION_REQ (msg_p).tdd_config_s[j] = tdd_config_s; + AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8, + "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!", + RC.config_file_name, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8); + + if (!prefix_type) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PREFIX_TYPE); + else if (strcmp(prefix_type, "NORMAL") == 0) { + RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = NORMAL; + } else if (strcmp(prefix_type, "EXTENDED") == 0) { + RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = EXTENDED; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n", + RC.config_file_name, i, prefix_type); + } +#ifdef Rel14 + if (!pbch_repetition) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d define %s: TRUE,FALSE!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PBCH_REPETITION); + else if (strcmp(pbch_repetition, "TRUE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pbch_repetition[j] = 1; + } else if (strcmp(pbch_repetition, "FALSE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pbch_repetition[j] = 0; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pbch_repetition choice: TRUE or FALSE !\n", + RC.config_file_name, i, pbch_repetition); + } #endif - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PDSCH_RS_EPRE, &pdsch_referenceSignalPower) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PDSCH_PB, &pdsch_p_b) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUSCH_N_SB, &pusch_n_SB) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUSCH_HOPPINGMODE, &pusch_hoppingMode) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUSCH_HOPPINGOFFSET, &pusch_hoppingOffset) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM, &pusch_enable64QAM) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN, &pusch_groupHoppingEnabled) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUSCH_GROUP_ASSIGNMENT, &pusch_groupAssignment) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN, &pusch_sequenceHoppingEnabled) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUSCH_NDMRS1, &pusch_nDMRS1) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PHICH_DURATION, &phich_duration) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PHICH_RESOURCE, &phich_resource) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_SRS_ENABLE, &srs_enable) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUSCH_PO_NOMINAL, &pusch_p0_Nominal) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUSCH_ALPHA, &pusch_alpha) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PUCCH_PO_NOMINAL, &pucch_p0_Nominal) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_MSG3_DELTA_PREAMBLE, &msg3_delta_Preamble) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1, &pucch_deltaF_Format1) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1b, &pucch_deltaF_Format1b) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2, &pucch_deltaF_Format2) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2A, &pucch_deltaF_Format2a) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2B, &pucch_deltaF_Format2b) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_NUM_RA_PREAMBLES, &rach_numberOfRA_Preambles) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_RACH_PREAMBLESGROUPACONFIG, &rach_preamblesGroupAConfig) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_POWERRAMPINGSTEP, &rach_powerRampingStep) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER, &rach_preambleInitialReceivedTargetPower) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_PREAMBLETRANSMAX, &rach_preambleTransMax) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_RARESPONSEWINDOWSIZE, &rach_raResponseWindowSize) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_MACCONTENTIONRESOLUTIONTIMER, &rach_macContentionResolutionTimer) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_MAXHARQMSG3TX, &rach_maxHARQ_Msg3Tx) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_MAXHARQMSG3TX, &bcch_modificationPeriodCoeff) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_PCCH_DEFAULT_PAGING_CYCLE, &pcch_defaultPagingCycle) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_PCCH_NB, &pcch_nB) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_BCCH_MODIFICATIONPERIODCOEFF, &bcch_modificationPeriodCoeff) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_T300, &ue_TimersAndConstants_t300) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_T301, &ue_TimersAndConstants_t301) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_T310, &ue_TimersAndConstants_t310) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_T311, &ue_TimersAndConstants_t311) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_N310, &ue_TimersAndConstants_n310) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_UETIMERS_N311, &ue_TimersAndConstants_n311) + + RRC_CONFIGURATION_REQ (msg_p).eutra_band[j] = eutra_band; + RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j] = (uint32_t) downlink_frequency; + RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset; + RRC_CONFIGURATION_REQ (msg_p).Nid_cell[j]= Nid_cell; + + if (Nid_cell>503) { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for Nid_cell choice: 0...503 !\n", + RC.config_file_name, i, Nid_cell); + } + + RRC_CONFIGURATION_REQ (msg_p).N_RB_DL[j]= N_RB_DL; + + if ((N_RB_DL!=6) && (N_RB_DL!=15) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=75) && (N_RB_DL!=100)) { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 6,15,25,50,75,100 !\n", + RC.config_file_name, i, N_RB_DL); + } + + if (strcmp(frame_type, "FDD") == 0) { + RRC_CONFIGURATION_REQ (msg_p).frame_type[j] = FDD; + } else if (strcmp(frame_type, "TDD") == 0) { + RRC_CONFIGURATION_REQ (msg_p).frame_type[j] = TDD; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n", + RC.config_file_name, i, frame_type); + } + + + RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config; + AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6, + "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!", + RC.config_file_name, i, tdd_config, TDD_Config__subframeAssignment_sa6); + + + RRC_CONFIGURATION_REQ (msg_p).tdd_config_s[j] = tdd_config_s; + AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8, + "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!", + RC.config_file_name, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8); + + + + if (!prefix_type) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PREFIX_TYPE); + else if (strcmp(prefix_type, "NORMAL") == 0) { + RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = NORMAL; + } else if (strcmp(prefix_type, "EXTENDED") == 0) { + RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = EXTENDED; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n", + RC.config_file_name, i, prefix_type); + } + + + + RRC_CONFIGURATION_REQ (msg_p).eutra_band[j] = eutra_band; + // printf( "\teutra band:\t%d\n",RRC_CONFIGURATION_REQ (msg_p).eutra_band); + + + + RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j] = (uint32_t) downlink_frequency; + //printf( "\tdownlink freq:\t%u\n",RRC_CONFIGURATION_REQ (msg_p).downlink_frequency); + + + RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset; + + if (enb_check_band_frequencies(RC.config_file_name, + j, + RRC_CONFIGURATION_REQ (msg_p).eutra_band[j], + RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j], + RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j], + RRC_CONFIGURATION_REQ (msg_p).frame_type[j])) { + AssertFatal(0, "error calling enb_check_band_frequencies\n"); + } + + if ((nb_antenna_ports <1) || (nb_antenna_ports > 2)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antenna_ports choice: 1..2 !\n", + RC.config_file_name, i, nb_antenna_ports); + + RRC_CONFIGURATION_REQ (msg_p).nb_antenna_ports[j] = nb_antenna_ports; + + + RRC_CONFIGURATION_REQ (msg_p).prach_root[j] = prach_root; + + if ((prach_root <0) || (prach_root > 1023)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_root choice: 0..1023 !\n", + RC.config_file_name, i, prach_root); + + RRC_CONFIGURATION_REQ (msg_p).prach_config_index[j] = prach_config_index; + + if ((prach_config_index <0) || (prach_config_index > 63)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_config_index choice: 0..1023 !\n", + RC.config_file_name, i, prach_config_index); + + if (!prach_high_speed) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PRACH_HIGH_SPEED); + else if (strcmp(prach_high_speed, "ENABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).prach_high_speed[j] = TRUE; + } else if (strcmp(prach_high_speed, "DISABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).prach_high_speed[j] = FALSE; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n", + RC.config_file_name, i, prach_high_speed); + + RRC_CONFIGURATION_REQ (msg_p).prach_zero_correlation[j] =prach_zero_correlation; + + if ((prach_zero_correlation <0) || (prach_zero_correlation > 15)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n", + RC.config_file_name, i, prach_zero_correlation); + + RRC_CONFIGURATION_REQ (msg_p).prach_freq_offset[j] = prach_freq_offset; + + if ((prach_freq_offset <0) || (prach_freq_offset > 94)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_freq_offset choice: 0..94!\n", + RC.config_file_name, i, prach_freq_offset); + + + RRC_CONFIGURATION_REQ (msg_p).pucch_delta_shift[j] = pucch_delta_shift-1; + + if ((pucch_delta_shift <1) || (pucch_delta_shift > 3)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_delta_shift choice: 1..3!\n", + RC.config_file_name, i, pucch_delta_shift); + + RRC_CONFIGURATION_REQ (msg_p).pucch_nRB_CQI[j] = pucch_nRB_CQI; -#ifdef Rel10 + if ((pucch_nRB_CQI <0) || (pucch_nRB_CQI > 98)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nRB_CQI choice: 0..98!\n", + RC.config_file_name, i, pucch_nRB_CQI); + + RRC_CONFIGURATION_REQ (msg_p).pucch_nCS_AN[j] = pucch_nCS_AN; + + if ((pucch_nCS_AN <0) || (pucch_nCS_AN > 7)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nCS_AN choice: 0..7!\n", + RC.config_file_name, i, pucch_nCS_AN); + +#if !defined(Rel10) && !defined(Rel14) + RRC_CONFIGURATION_REQ (msg_p).pucch_n1_AN[j] = pucch_n1_AN; + + if ((pucch_n1_AN <0) || (pucch_n1_AN > 2047)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_n1_AN choice: 0..2047!\n", + RC.config_file_name, i, pucch_n1_AN); #endif - )) { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, Component Carrier %d!\n", - lib_config_file_name_pP, enb_properties.properties[enb_properties_index]->nb_cc++); - continue; // FIXME this prevents segfaults below, not sure what happens after function exit - } + RRC_CONFIGURATION_REQ (msg_p).pdsch_referenceSignalPower[j] = pdsch_referenceSignalPower; - enb_properties.properties[enb_properties_index]->nb_cc++; + if ((pdsch_referenceSignalPower <-60) || (pdsch_referenceSignalPower > 50)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_referenceSignalPower choice:-60..50!\n", + RC.config_file_name, i, pdsch_referenceSignalPower); - enb_properties.properties[enb_properties_index]->tdd_config[j] = tdd_config; - AssertError (tdd_config <= TDD_Config__subframeAssignment_sa6, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!", - lib_config_file_name_pP, i, tdd_config, TDD_Config__subframeAssignment_sa6); + RRC_CONFIGURATION_REQ (msg_p).pdsch_p_b[j] = pdsch_p_b; - enb_properties.properties[enb_properties_index]->tdd_config_s[j] = tdd_config_s; - AssertError (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!", - lib_config_file_name_pP, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8); + if ((pdsch_p_b <0) || (pdsch_p_b > 3)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_p_b choice: 0..3!\n", + RC.config_file_name, i, pdsch_p_b); - if (!prefix_type) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n", - lib_config_file_name_pP, i, ENB_CONFIG_STRING_PREFIX_TYPE); - else if (strcmp(prefix_type, "NORMAL") == 0) { - enb_properties.properties[enb_properties_index]->prefix_type[j] = NORMAL; - } else if (strcmp(prefix_type, "EXTENDED") == 0) { - enb_properties.properties[enb_properties_index]->prefix_type[j] = EXTENDED; - } else { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n", - lib_config_file_name_pP, i, prefix_type); - } + RRC_CONFIGURATION_REQ (msg_p).pusch_n_SB[j] = pusch_n_SB; - enb_properties.properties[enb_properties_index]->eutra_band[j] = eutra_band; - enb_properties.properties[enb_properties_index]->downlink_frequency[j] = (uint32_t) downlink_frequency; - enb_properties.properties[enb_properties_index]->uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset; - enb_properties.properties[enb_properties_index]->Nid_cell[j]= Nid_cell; + if ((pusch_n_SB <1) || (pusch_n_SB > 4)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_n_SB choice: 1..4!\n", + RC.config_file_name, i, pusch_n_SB); - if (Nid_cell>503) { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for Nid_cell choice: 0...503 !\n", - lib_config_file_name_pP, i, Nid_cell); - } + if (!pusch_hoppingMode) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d define %s: interSubframe,intraAndInterSubframe!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_HOPPINGMODE); + else if (strcmp(pusch_hoppingMode,"interSubFrame")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame; + } else if (strcmp(pusch_hoppingMode,"intraAndInterSubFrame")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_intraAndInterSubFrame; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingMode choice: interSubframe,intraAndInterSubframe!\n", + RC.config_file_name, i, pusch_hoppingMode); - enb_properties.properties[enb_properties_index]->N_RB_DL[j]= N_RB_DL; + RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingOffset[j] = pusch_hoppingOffset; - if ((N_RB_DL!=6) && (N_RB_DL!=15) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=75) && (N_RB_DL!=100)) { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 6,15,25,50,75,100 !\n", - lib_config_file_name_pP, i, N_RB_DL); - } + if ((pusch_hoppingOffset<0) || (pusch_hoppingOffset>98)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingOffset choice: 0..98!\n", + RC.config_file_name, i, pusch_hoppingMode); - if (strcmp(frame_type, "FDD") == 0) { - enb_properties.properties[enb_properties_index]->frame_type[j] = FDD; - } else if (strcmp(frame_type, "TDD") == 0) { - enb_properties.properties[enb_properties_index]->frame_type[j] = TDD; - } else { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n", - lib_config_file_name_pP, i, frame_type); - } + if (!pusch_enable64QAM) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM); + else if (strcmp(pusch_enable64QAM, "ENABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_enable64QAM[j] = TRUE; + } else if (strcmp(pusch_enable64QAM, "DISABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_enable64QAM[j] = FALSE; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n", + RC.config_file_name, i, pusch_enable64QAM); + + if (!pusch_groupHoppingEnabled) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN); + else if (strcmp(pusch_groupHoppingEnabled, "ENABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_groupHoppingEnabled[j] = TRUE; + } else if (strcmp(pusch_groupHoppingEnabled, "DISABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_groupHoppingEnabled[j] = FALSE; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n", + RC.config_file_name, i, pusch_groupHoppingEnabled); - enb_properties.properties[enb_properties_index]->tdd_config[j] = tdd_config; - AssertError (tdd_config <= TDD_Config__subframeAssignment_sa6, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!", - lib_config_file_name_pP, i, tdd_config, TDD_Config__subframeAssignment_sa6); + RRC_CONFIGURATION_REQ (msg_p).pusch_groupAssignment[j] = pusch_groupAssignment; + if ((pusch_groupAssignment<0)||(pusch_groupAssignment>29)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_groupAssignment choice: 0..29!\n", + RC.config_file_name, i, pusch_groupAssignment); - enb_properties.properties[enb_properties_index]->tdd_config_s[j] = tdd_config_s; - AssertError (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!", - lib_config_file_name_pP, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8); + if (!pusch_sequenceHoppingEnabled) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", + RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN); + else if (strcmp(pusch_sequenceHoppingEnabled, "ENABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_sequenceHoppingEnabled[j] = TRUE; + } else if (strcmp(pusch_sequenceHoppingEnabled, "DISABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_sequenceHoppingEnabled[j] = FALSE; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n", + RC.config_file_name, i, pusch_sequenceHoppingEnabled); + RRC_CONFIGURATION_REQ (msg_p).pusch_nDMRS1[j] = pusch_nDMRS1; //cyclic_shift in RRC! + if ((pusch_nDMRS1 <0) || (pusch_nDMRS1>7)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_nDMRS1 choice: 0..7!\n", + RC.config_file_name, i, pusch_nDMRS1); - if (!prefix_type) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n", - lib_config_file_name_pP, i, ENB_CONFIG_STRING_PREFIX_TYPE); - else if (strcmp(prefix_type, "NORMAL") == 0) { - enb_properties.properties[enb_properties_index]->prefix_type[j] = NORMAL; - } else if (strcmp(prefix_type, "EXTENDED") == 0) { - enb_properties.properties[enb_properties_index]->prefix_type[j] = EXTENDED; - } else { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n", - lib_config_file_name_pP, i, prefix_type); - } + if (strcmp(phich_duration,"NORMAL")==0) { + RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_normal; + } else if (strcmp(phich_duration,"EXTENDED")==0) { + RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_extended; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n", + RC.config_file_name, i, phich_duration); + if (strcmp(phich_resource,"ONESIXTH")==0) { + RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_oneSixth ; + } else if (strcmp(phich_resource,"HALF")==0) { + RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_half; + } else if (strcmp(phich_resource,"ONE")==0) { + RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_one; + } else if (strcmp(phich_resource,"TWO")==0) { + RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_two; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n", + RC.config_file_name, i, phich_resource); + printf("phich.resource %ld (%s), phich.duration %ld (%s)\n", + RRC_CONFIGURATION_REQ (msg_p).phich_resource[j],phich_resource, + RRC_CONFIGURATION_REQ (msg_p).phich_duration[j],phich_duration); - enb_properties.properties[enb_properties_index]->eutra_band[j] = eutra_band; - // printf( "\teutra band:\t%d\n",enb_properties.properties[enb_properties_index]->eutra_band); + if (strcmp(srs_enable, "ENABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = TRUE; + } else if (strcmp(srs_enable, "DISABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = FALSE; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", + RC.config_file_name, i, srs_enable); + if (RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] == TRUE) { + RRC_CONFIGURATION_REQ (msg_p).srs_BandwidthConfig[j] = srs_BandwidthConfig; - enb_properties.properties[enb_properties_index]->downlink_frequency[j] = (uint32_t) downlink_frequency; - //printf( "\tdownlink freq:\t%u\n",enb_properties.properties[enb_properties_index]->downlink_frequency); + if ((srs_BandwidthConfig < 0) || (srs_BandwidthConfig >7)) + AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value %d for srs_BandwidthConfig choice: 0...7\n", + RC.config_file_name, i, srs_BandwidthConfig); + RRC_CONFIGURATION_REQ (msg_p).srs_SubframeConfig[j] = srs_SubframeConfig; - enb_properties.properties[enb_properties_index]->uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset; + if ((srs_SubframeConfig<0) || (srs_SubframeConfig>15)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for srs_SubframeConfig choice: 0..15 !\n", + RC.config_file_name, i, srs_SubframeConfig); - parse_errors += enb_check_band_frequencies(lib_config_file_name_pP, - enb_properties_index, - enb_properties.properties[enb_properties_index]->eutra_band[j], - enb_properties.properties[enb_properties_index]->downlink_frequency[j], - enb_properties.properties[enb_properties_index]->uplink_frequency_offset[j], - enb_properties.properties[enb_properties_index]->frame_type[j]); + if (strcmp(srs_ackNackST, "ENABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).srs_ackNackST[j] = TRUE; + } else if (strcmp(srs_ackNackST, "DISABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).srs_ackNackST[j] = FALSE; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", + RC.config_file_name, i, srs_ackNackST); - enb_properties.properties[enb_properties_index]->nb_antennas_tx[j] = nb_antennas_tx; + if (strcmp(srs_MaxUpPts, "ENABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).srs_MaxUpPts[j] = TRUE; + } else if (strcmp(srs_MaxUpPts, "DISABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).srs_MaxUpPts[j] = FALSE; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n", + RC.config_file_name, i, srs_MaxUpPts); + } - if ((nb_antennas_tx <1) || (nb_antennas_tx > 4)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antennas_tx choice: 1..4 !\n", - lib_config_file_name_pP, i, nb_antennas_tx); + RRC_CONFIGURATION_REQ (msg_p).pusch_p0_Nominal[j] = pusch_p0_Nominal; - enb_properties.properties[enb_properties_index]->nb_antennas_rx[j] = nb_antennas_rx; - - if ((nb_antennas_rx <1) || (nb_antennas_rx > 4)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antennas_rx choice: 1..4 !\n", - lib_config_file_name_pP, i, nb_antennas_rx); - - enb_properties.properties[enb_properties_index]->tx_gain[j] = tx_gain; - - if ((tx_gain <0) || (tx_gain > 127)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for tx_gain choice: 0..127 !\n", - lib_config_file_name_pP, i, tx_gain); - - enb_properties.properties[enb_properties_index]->rx_gain[j] = rx_gain; - - if ((rx_gain <0) || (rx_gain > 160)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rx_gain choice: 0..160 !\n", - lib_config_file_name_pP, i, rx_gain); - - enb_properties.properties[enb_properties_index]->prach_root[j] = prach_root; - - if ((prach_root <0) || (prach_root > 1023)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_root choice: 0..1023 !\n", - lib_config_file_name_pP, i, prach_root); - - enb_properties.properties[enb_properties_index]->prach_config_index[j] = prach_config_index; - - if ((prach_config_index <0) || (prach_config_index > 63)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_config_index choice: 0..1023 !\n", - lib_config_file_name_pP, i, prach_config_index); - - if (!prach_high_speed) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", - lib_config_file_name_pP, i, ENB_CONFIG_STRING_PRACH_HIGH_SPEED); - else if (strcmp(prach_high_speed, "ENABLE") == 0) { - enb_properties.properties[enb_properties_index]->prach_high_speed[j] = TRUE; - } else if (strcmp(prach_high_speed, "DISABLE") == 0) { - enb_properties.properties[enb_properties_index]->prach_high_speed[j] = FALSE; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n", - lib_config_file_name_pP, i, prach_high_speed); - - enb_properties.properties[enb_properties_index]->prach_zero_correlation[j] =prach_zero_correlation; - - if ((prach_zero_correlation <0) || (prach_zero_correlation > 15)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n", - lib_config_file_name_pP, i, prach_zero_correlation); - - enb_properties.properties[enb_properties_index]->prach_freq_offset[j] = prach_freq_offset; - - if ((prach_freq_offset <0) || (prach_freq_offset > 94)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_freq_offset choice: 0..94!\n", - lib_config_file_name_pP, i, prach_freq_offset); - - - enb_properties.properties[enb_properties_index]->pucch_delta_shift[j] = pucch_delta_shift-1; - - if ((pucch_delta_shift <1) || (pucch_delta_shift > 3)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_delta_shift choice: 1..3!\n", - lib_config_file_name_pP, i, pucch_delta_shift); - - enb_properties.properties[enb_properties_index]->pucch_nRB_CQI[j] = pucch_nRB_CQI; - - if ((pucch_nRB_CQI <0) || (pucch_nRB_CQI > 98)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nRB_CQI choice: 0..98!\n", - lib_config_file_name_pP, i, pucch_nRB_CQI); - - enb_properties.properties[enb_properties_index]->pucch_nCS_AN[j] = pucch_nCS_AN; - - if ((pucch_nCS_AN <0) || (pucch_nCS_AN > 7)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nCS_AN choice: 0..7!\n", - lib_config_file_name_pP, i, pucch_nCS_AN); - -#ifndef Rel10 - enb_properties.properties[enb_properties_index]->pucch_n1_AN[j] = pucch_n1_AN; - - if ((pucch_n1_AN <0) || (pucch_n1_AN > 2047)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_n1_AN choice: 0..2047!\n", - lib_config_file_name_pP, i, pucch_n1_AN); + if ((pusch_p0_Nominal<-126) || (pusch_p0_Nominal>24)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_p0_Nominal choice: -126..24 !\n", + RC.config_file_name, i, pusch_p0_Nominal); +#ifndef Rel14 + if (strcmp(pusch_alpha,"AL0")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al0; + } else if (strcmp(pusch_alpha,"AL04")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al04; + } else if (strcmp(pusch_alpha,"AL05")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al05; + } else if (strcmp(pusch_alpha,"AL06")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al06; + } else if (strcmp(pusch_alpha,"AL07")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al07; + } else if (strcmp(pusch_alpha,"AL08")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al08; + } else if (strcmp(pusch_alpha,"AL09")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al09; + } else if (strcmp(pusch_alpha,"AL1")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al1; + } +#else + if (strcmp(pusch_alpha,"AL0")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al0; + } else if (strcmp(pusch_alpha,"AL04")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al04; + } else if (strcmp(pusch_alpha,"AL05")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al05; + } else if (strcmp(pusch_alpha,"AL06")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al06; + } else if (strcmp(pusch_alpha,"AL07")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al07; + } else if (strcmp(pusch_alpha,"AL08")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al08; + } else if (strcmp(pusch_alpha,"AL09")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al09; + } else if (strcmp(pusch_alpha,"AL1")==0) { + RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al1; + } #endif - enb_properties.properties[enb_properties_index]->pdsch_referenceSignalPower[j] = pdsch_referenceSignalPower; - - if ((pdsch_referenceSignalPower <-60) || (pdsch_referenceSignalPower > 50)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_referenceSignalPower choice:-60..50!\n", - lib_config_file_name_pP, i, pdsch_referenceSignalPower); - - enb_properties.properties[enb_properties_index]->pdsch_p_b[j] = pdsch_p_b; - - if ((pdsch_p_b <0) || (pdsch_p_b > 3)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_p_b choice: 0..3!\n", - lib_config_file_name_pP, i, pdsch_p_b); - - enb_properties.properties[enb_properties_index]->pusch_n_SB[j] = pusch_n_SB; - - if ((pusch_n_SB <1) || (pusch_n_SB > 4)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_n_SB choice: 1..4!\n", - lib_config_file_name_pP, i, pusch_n_SB); - - if (!pusch_hoppingMode) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d define %s: interSubframe,intraAndInterSubframe!\n", - lib_config_file_name_pP, i, ENB_CONFIG_STRING_PUSCH_HOPPINGMODE); - else if (strcmp(pusch_hoppingMode,"interSubFrame")==0) { - enb_properties.properties[enb_properties_index]->pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame; - } else if (strcmp(pusch_hoppingMode,"intraAndInterSubFrame")==0) { - enb_properties.properties[enb_properties_index]->pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_intraAndInterSubFrame; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingMode choice: interSubframe,intraAndInterSubframe!\n", - lib_config_file_name_pP, i, pusch_hoppingMode); - - enb_properties.properties[enb_properties_index]->pusch_hoppingOffset[j] = pusch_hoppingOffset; - - if ((pusch_hoppingOffset<0) || (pusch_hoppingOffset>98)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingOffset choice: 0..98!\n", - lib_config_file_name_pP, i, pusch_hoppingMode); - - if (!pusch_enable64QAM) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", - lib_config_file_name_pP, i, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM); - else if (strcmp(pusch_enable64QAM, "ENABLE") == 0) { - enb_properties.properties[enb_properties_index]->pusch_enable64QAM[j] = TRUE; - } else if (strcmp(pusch_enable64QAM, "DISABLE") == 0) { - enb_properties.properties[enb_properties_index]->pusch_enable64QAM[j] = FALSE; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n", - lib_config_file_name_pP, i, pusch_enable64QAM); - - if (!pusch_groupHoppingEnabled) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", - lib_config_file_name_pP, i, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN); - else if (strcmp(pusch_groupHoppingEnabled, "ENABLE") == 0) { - enb_properties.properties[enb_properties_index]->pusch_groupHoppingEnabled[j] = TRUE; - } else if (strcmp(pusch_groupHoppingEnabled, "DISABLE") == 0) { - enb_properties.properties[enb_properties_index]->pusch_groupHoppingEnabled[j] = FALSE; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n", - lib_config_file_name_pP, i, pusch_groupHoppingEnabled); - - - enb_properties.properties[enb_properties_index]->pusch_groupAssignment[j] = pusch_groupAssignment; - - if ((pusch_groupAssignment<0)||(pusch_groupAssignment>29)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_groupAssignment choice: 0..29!\n", - lib_config_file_name_pP, i, pusch_groupAssignment); - - if (!pusch_sequenceHoppingEnabled) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n", - lib_config_file_name_pP, i, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN); - else if (strcmp(pusch_sequenceHoppingEnabled, "ENABLE") == 0) { - enb_properties.properties[enb_properties_index]->pusch_sequenceHoppingEnabled[j] = TRUE; - } else if (strcmp(pusch_sequenceHoppingEnabled, "DISABLE") == 0) { - enb_properties.properties[enb_properties_index]->pusch_sequenceHoppingEnabled[j] = FALSE; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n", - lib_config_file_name_pP, i, pusch_sequenceHoppingEnabled); - - enb_properties.properties[enb_properties_index]->pusch_nDMRS1[j] = pusch_nDMRS1; //cyclic_shift in RRC! - - if ((pusch_nDMRS1 <0) || (pusch_nDMRS1>7)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_nDMRS1 choice: 0..7!\n", - lib_config_file_name_pP, i, pusch_nDMRS1); - - if (strcmp(phich_duration,"NORMAL")==0) { - enb_properties.properties[enb_properties_index]->phich_duration[j] = normal; - } else if (strcmp(phich_duration,"EXTENDED")==0) { - enb_properties.properties[enb_properties_index]->phich_duration[j] = extended; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n", - lib_config_file_name_pP, i, phich_duration); - - if (strcmp(phich_resource,"ONESIXTH")==0) { - enb_properties.properties[enb_properties_index]->phich_resource[j] = oneSixth; - } else if (strcmp(phich_resource,"HALF")==0) { - enb_properties.properties[enb_properties_index]->phich_resource[j] = half; - } else if (strcmp(phich_resource,"ONE")==0) { - enb_properties.properties[enb_properties_index]->phich_resource[j] = one; - } else if (strcmp(phich_resource,"TWO")==0) { - enb_properties.properties[enb_properties_index]->phich_resource[j] = two; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n", - lib_config_file_name_pP, i, phich_resource); - - if (strcmp(srs_enable, "ENABLE") == 0) { - enb_properties.properties[enb_properties_index]->srs_enable[j] = TRUE; - } else if (strcmp(srs_enable, "DISABLE") == 0) { - enb_properties.properties[enb_properties_index]->srs_enable[j] = FALSE; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", - lib_config_file_name_pP, i, srs_enable); - - if (enb_properties.properties[enb_properties_index]->srs_enable[j] == TRUE) { - if (!(config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_SRS_BANDWIDTH_CONFIG, &srs_BandwidthConfig) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_SRS_SUBFRAME_CONFIG, &srs_SubframeConfig) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_SRS_ACKNACKST_CONFIG, &srs_ackNackST) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_SRS_MAXUPPTS, &srs_MaxUpPts) - )) - AssertError(0, - parse_errors++, - "Failed to parse eNB configuration file %s, enb %d unknown values for srs_BandwidthConfig, srs_SubframeConfig, srs_ackNackST, srs_MaxUpPts\n", - lib_config_file_name_pP, i); - - enb_properties.properties[enb_properties_index]->srs_BandwidthConfig[j] = srs_BandwidthConfig; - - if ((srs_BandwidthConfig < 0) || (srs_BandwidthConfig >7)) - AssertError (0, parse_errors ++, "Failed to parse eNB configuration file %s, enb %d unknown value %d for srs_BandwidthConfig choice: 0...7\n", - lib_config_file_name_pP, i, srs_BandwidthConfig); - - enb_properties.properties[enb_properties_index]->srs_SubframeConfig[j] = srs_SubframeConfig; - - if ((srs_SubframeConfig<0) || (srs_SubframeConfig>15)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for srs_SubframeConfig choice: 0..15 !\n", - lib_config_file_name_pP, i, srs_SubframeConfig); - - if (strcmp(srs_ackNackST, "ENABLE") == 0) { - enb_properties.properties[enb_properties_index]->srs_ackNackST[j] = TRUE; - } else if (strcmp(srs_ackNackST, "DISABLE") == 0) { - enb_properties.properties[enb_properties_index]->srs_ackNackST[j] = FALSE; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n", - lib_config_file_name_pP, i, srs_ackNackST); - - if (strcmp(srs_MaxUpPts, "ENABLE") == 0) { - enb_properties.properties[enb_properties_index]->srs_MaxUpPts[j] = TRUE; - } else if (strcmp(srs_MaxUpPts, "DISABLE") == 0) { - enb_properties.properties[enb_properties_index]->srs_MaxUpPts[j] = FALSE; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n", - lib_config_file_name_pP, i, srs_MaxUpPts); - } - - enb_properties.properties[enb_properties_index]->pusch_p0_Nominal[j] = pusch_p0_Nominal; - - if ((pusch_p0_Nominal<-126) || (pusch_p0_Nominal>24)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_p0_Nominal choice: -126..24 !\n", - lib_config_file_name_pP, i, pusch_p0_Nominal); - - if (strcmp(pusch_alpha,"AL0")==0) { - enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al0; - } else if (strcmp(pusch_alpha,"AL04")==0) { - enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al04; - } else if (strcmp(pusch_alpha,"AL05")==0) { - enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al05; - } else if (strcmp(pusch_alpha,"AL06")==0) { - enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al06; - } else if (strcmp(pusch_alpha,"AL07")==0) { - enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al07; - } else if (strcmp(pusch_alpha,"AL08")==0) { - enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al08; - } else if (strcmp(pusch_alpha,"AL09")==0) { - enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al09; - } else if (strcmp(pusch_alpha,"AL1")==0) { - enb_properties.properties[enb_properties_index]->pusch_alpha[j] = UplinkPowerControlCommon__alpha_al1; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_Alpha choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!\n", - lib_config_file_name_pP, i, pusch_alpha); - - enb_properties.properties[enb_properties_index]->pucch_p0_Nominal[j] = pucch_p0_Nominal; - - if ((pucch_p0_Nominal<-127) || (pucch_p0_Nominal>-96)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_p0_Nominal choice: -127..-96 !\n", - lib_config_file_name_pP, i, pucch_p0_Nominal); - - enb_properties.properties[enb_properties_index]->msg3_delta_Preamble[j] = msg3_delta_Preamble; - - if ((msg3_delta_Preamble<-1) || (msg3_delta_Preamble>6)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for msg3_delta_Preamble choice: -1..6 !\n", - lib_config_file_name_pP, i, msg3_delta_Preamble); - - - if (strcmp(pucch_deltaF_Format1,"deltaF_2")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF_2; - } else if (strcmp(pucch_deltaF_Format1,"deltaF0")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF0; - } else if (strcmp(pucch_deltaF_Format1,"deltaF2")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1 choice: deltaF_2,dltaF0,deltaF2!\n", - lib_config_file_name_pP, i, pucch_deltaF_Format1); - - if (strcmp(pucch_deltaF_Format1b,"deltaF1")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF1; - } else if (strcmp(pucch_deltaF_Format1b,"deltaF3")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3; - } else if (strcmp(pucch_deltaF_Format1b,"deltaF5")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF5; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1b choice: deltaF1,dltaF3,deltaF5!\n", - lib_config_file_name_pP, i, pucch_deltaF_Format1b); - - - if (strcmp(pucch_deltaF_Format2,"deltaF_2")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF_2; - } else if (strcmp(pucch_deltaF_Format2,"deltaF0")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0; - } else if (strcmp(pucch_deltaF_Format2,"deltaF1")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF1; - } else if (strcmp(pucch_deltaF_Format2,"deltaF2")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF2; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2 choice: deltaF_2,dltaF0,deltaF1,deltaF2!\n", - lib_config_file_name_pP, i, pucch_deltaF_Format2); - - if (strcmp(pucch_deltaF_Format2a,"deltaF_2")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF_2; - } else if (strcmp(pucch_deltaF_Format2a,"deltaF0")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0; - } else if (strcmp(pucch_deltaF_Format2a,"deltaF2")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF2; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2a choice: deltaF_2,dltaF0,deltaF2!\n", - lib_config_file_name_pP, i, pucch_deltaF_Format2a); - - if (strcmp(pucch_deltaF_Format2b,"deltaF_2")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF_2; - } else if (strcmp(pucch_deltaF_Format2b,"deltaF0")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0; - } else if (strcmp(pucch_deltaF_Format2b,"deltaF2")==0) { - enb_properties.properties[enb_properties_index]->pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF2; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2b choice: deltaF_2,dltaF0,deltaF2!\n", - lib_config_file_name_pP, i, pucch_deltaF_Format2b); - - - - - enb_properties.properties[enb_properties_index]->rach_numberOfRA_Preambles[j] = (rach_numberOfRA_Preambles/4)-1; - - if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>64) || ((rach_numberOfRA_Preambles&3)!=0)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_numberOfRA_Preambles choice: 4,8,12,...,64!\n", - lib_config_file_name_pP, i, rach_numberOfRA_Preambles); - - if (strcmp(rach_preamblesGroupAConfig, "ENABLE") == 0) { - enb_properties.properties[enb_properties_index]->rach_preamblesGroupAConfig[j] = TRUE; - - if (!(config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_SIZEOFRA_PREAMBLESGROUPA, &rach_sizeOfRA_PreamblesGroupA) - && config_setting_lookup_int(component_carrier, ENB_CONFIG_STRING_RACH_MESSAGESIZEGROUPA, &rach_messageSizeGroupA) - && config_setting_lookup_string(component_carrier, ENB_CONFIG_STRING_RACH_MESSAGEPOWEROFFSETGROUPB, &rach_messagePowerOffsetGroupB))) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d rach_sizeOfRA_PreamblesGroupA, messageSizeGroupA,messagePowerOffsetGroupB!\n", - lib_config_file_name_pP, i); - - enb_properties.properties[enb_properties_index]->rach_sizeOfRA_PreamblesGroupA[j] = (rach_sizeOfRA_PreamblesGroupA/4)-1; - - if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>60) || ((rach_numberOfRA_Preambles&3)!=0)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_sizeOfRA_PreamblesGroupA choice: 4,8,12,...,60!\n", - lib_config_file_name_pP, i, rach_sizeOfRA_PreamblesGroupA); - - - switch (rach_messageSizeGroupA) { - case 56: - enb_properties.properties[enb_properties_index]->rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b56; - break; - - case 144: - enb_properties.properties[enb_properties_index]->rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b144; - break; - - case 208: - enb_properties.properties[enb_properties_index]->rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b208; - break; - - case 256: - enb_properties.properties[enb_properties_index]->rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b256; - break; - - default: - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_messageSizeGroupA choice: 56,144,208,256!\n", - lib_config_file_name_pP, i, rach_messageSizeGroupA); - break; - } - - if (strcmp(rach_messagePowerOffsetGroupB,"minusinfinity")==0) { - enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_minusinfinity; - } - - else if (strcmp(rach_messagePowerOffsetGroupB,"dB0")==0) { - enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB0; - } - - else if (strcmp(rach_messagePowerOffsetGroupB,"dB5")==0) { - enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB5; - } - - else if (strcmp(rach_messagePowerOffsetGroupB,"dB8")==0) { - enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB8; - } - - else if (strcmp(rach_messagePowerOffsetGroupB,"dB10")==0) { - enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB10; - } - - else if (strcmp(rach_messagePowerOffsetGroupB,"dB12")==0) { - enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB12; - } + else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_Alpha choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!\n", + RC.config_file_name, i, pusch_alpha); + + RRC_CONFIGURATION_REQ (msg_p).pucch_p0_Nominal[j] = pucch_p0_Nominal; + + if ((pucch_p0_Nominal<-127) || (pucch_p0_Nominal>-96)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_p0_Nominal choice: -127..-96 !\n", + RC.config_file_name, i, pucch_p0_Nominal); + + RRC_CONFIGURATION_REQ (msg_p).msg3_delta_Preamble[j] = msg3_delta_Preamble; + + if ((msg3_delta_Preamble<-1) || (msg3_delta_Preamble>6)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for msg3_delta_Preamble choice: -1..6 !\n", + RC.config_file_name, i, msg3_delta_Preamble); + + + if (strcmp(pucch_deltaF_Format1,"deltaF_2")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF_2; + } else if (strcmp(pucch_deltaF_Format1,"deltaF0")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF0; + } else if (strcmp(pucch_deltaF_Format1,"deltaF2")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1 choice: deltaF_2,dltaF0,deltaF2!\n", + RC.config_file_name, i, pucch_deltaF_Format1); + + if (strcmp(pucch_deltaF_Format1b,"deltaF1")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF1; + } else if (strcmp(pucch_deltaF_Format1b,"deltaF3")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3; + } else if (strcmp(pucch_deltaF_Format1b,"deltaF5")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF5; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1b choice: deltaF1,dltaF3,deltaF5!\n", + RC.config_file_name, i, pucch_deltaF_Format1b); + + + if (strcmp(pucch_deltaF_Format2,"deltaF_2")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF_2; + } else if (strcmp(pucch_deltaF_Format2,"deltaF0")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0; + } else if (strcmp(pucch_deltaF_Format2,"deltaF1")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF1; + } else if (strcmp(pucch_deltaF_Format2,"deltaF2")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF2; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2 choice: deltaF_2,dltaF0,deltaF1,deltaF2!\n", + RC.config_file_name, i, pucch_deltaF_Format2); + + if (strcmp(pucch_deltaF_Format2a,"deltaF_2")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF_2; + } else if (strcmp(pucch_deltaF_Format2a,"deltaF0")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0; + } else if (strcmp(pucch_deltaF_Format2a,"deltaF2")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF2; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2a choice: deltaF_2,dltaF0,deltaF2!\n", + RC.config_file_name, i, pucch_deltaF_Format2a); + + if (strcmp(pucch_deltaF_Format2b,"deltaF_2")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF_2; + } else if (strcmp(pucch_deltaF_Format2b,"deltaF0")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0; + } else if (strcmp(pucch_deltaF_Format2b,"deltaF2")==0) { + RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF2; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2b choice: deltaF_2,dltaF0,deltaF2!\n", + RC.config_file_name, i, pucch_deltaF_Format2b); + + + + + RRC_CONFIGURATION_REQ (msg_p).rach_numberOfRA_Preambles[j] = (rach_numberOfRA_Preambles/4)-1; + + if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>64) || ((rach_numberOfRA_Preambles&3)!=0)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_numberOfRA_Preambles choice: 4,8,12,...,64!\n", + RC.config_file_name, i, rach_numberOfRA_Preambles); + + if (strcmp(rach_preamblesGroupAConfig, "ENABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).rach_preamblesGroupAConfig[j] = TRUE; + + + RRC_CONFIGURATION_REQ (msg_p).rach_sizeOfRA_PreamblesGroupA[j] = (rach_sizeOfRA_PreamblesGroupA/4)-1; + + if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>60) || ((rach_numberOfRA_Preambles&3)!=0)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_sizeOfRA_PreamblesGroupA choice: 4,8,12,...,60!\n", + RC.config_file_name, i, rach_sizeOfRA_PreamblesGroupA); + + + switch (rach_messageSizeGroupA) { + case 56: + RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b56; + break; + + case 144: + RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b144; + break; + + case 208: + RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b208; + break; + + case 256: + RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b256; + break; + + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_messageSizeGroupA choice: 56,144,208,256!\n", + RC.config_file_name, i, rach_messageSizeGroupA); + break; + } + + if (strcmp(rach_messagePowerOffsetGroupB,"minusinfinity")==0) { + RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_minusinfinity; + } + + else if (strcmp(rach_messagePowerOffsetGroupB,"dB0")==0) { + RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB0; + } + + else if (strcmp(rach_messagePowerOffsetGroupB,"dB5")==0) { + RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB5; + } + + else if (strcmp(rach_messagePowerOffsetGroupB,"dB8")==0) { + RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB8; + } - else if (strcmp(rach_messagePowerOffsetGroupB,"dB15")==0) { - enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB15; - } + else if (strcmp(rach_messagePowerOffsetGroupB,"dB10")==0) { + RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB10; + } + + else if (strcmp(rach_messagePowerOffsetGroupB,"dB12")==0) { + RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB12; + } - else if (strcmp(rach_messagePowerOffsetGroupB,"dB18")==0) { - enb_properties.properties[enb_properties_index]->rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB18; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n", - lib_config_file_name_pP, i, rach_messagePowerOffsetGroupB); + else if (strcmp(rach_messagePowerOffsetGroupB,"dB15")==0) { + RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB15; + } - } else if (strcmp(rach_preamblesGroupAConfig, "DISABLE") == 0) { - enb_properties.properties[enb_properties_index]->rach_preamblesGroupAConfig[j] = FALSE; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n", - lib_config_file_name_pP, i, rach_preamblesGroupAConfig); + else if (strcmp(rach_messagePowerOffsetGroupB,"dB18")==0) { + RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB18; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n", + RC.config_file_name, i, rach_messagePowerOffsetGroupB); - enb_properties.properties[enb_properties_index]->rach_preambleInitialReceivedTargetPower[j] = (rach_preambleInitialReceivedTargetPower+120)/2; + } else if (strcmp(rach_preamblesGroupAConfig, "DISABLE") == 0) { + RRC_CONFIGURATION_REQ (msg_p).rach_preamblesGroupAConfig[j] = FALSE; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n", + RC.config_file_name, i, rach_preamblesGroupAConfig); - if ((rach_preambleInitialReceivedTargetPower<-120) || (rach_preambleInitialReceivedTargetPower>-90) || ((rach_preambleInitialReceivedTargetPower&1)!=0)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleInitialReceivedTargetPower choice: -120,-118,...,-90 !\n", - lib_config_file_name_pP, i, rach_preambleInitialReceivedTargetPower); + RRC_CONFIGURATION_REQ (msg_p).rach_preambleInitialReceivedTargetPower[j] = (rach_preambleInitialReceivedTargetPower+120)/2; + if ((rach_preambleInitialReceivedTargetPower<-120) || (rach_preambleInitialReceivedTargetPower>-90) || ((rach_preambleInitialReceivedTargetPower&1)!=0)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleInitialReceivedTargetPower choice: -120,-118,...,-90 !\n", + RC.config_file_name, i, rach_preambleInitialReceivedTargetPower); - enb_properties.properties[enb_properties_index]->rach_powerRampingStep[j] = rach_powerRampingStep/2; - if ((rach_powerRampingStep<0) || (rach_powerRampingStep>6) || ((rach_powerRampingStep&1)!=0)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_powerRampingStep choice: 0,2,4,6 !\n", - lib_config_file_name_pP, i, rach_powerRampingStep); + RRC_CONFIGURATION_REQ (msg_p).rach_powerRampingStep[j] = rach_powerRampingStep/2; + if ((rach_powerRampingStep<0) || (rach_powerRampingStep>6) || ((rach_powerRampingStep&1)!=0)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_powerRampingStep choice: 0,2,4,6 !\n", + RC.config_file_name, i, rach_powerRampingStep); - switch (rach_preambleTransMax) { - case 3: - enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3; - break; - case 4: - enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4; - break; + switch (rach_preambleTransMax) { +#ifndef Rel14 + case 3: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3; + break; - case 5: - enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5; - break; - - case 6: - enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6; - break; - - case 7: - enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7; - break; - - case 8: - enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8; - break; - - case 10: - enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10; - break; - - case 20: - enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20; - break; - - case 50: - enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50; - break; - - case 100: - enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100; - break; - - case 200: - enb_properties.properties[enb_properties_index]->rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200; - break; - - default: - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleTransMax choice: 3,4,5,6,7,8,10,20,50,100,200!\n", - lib_config_file_name_pP, i, rach_preambleTransMax); - break; - } - - enb_properties.properties[enb_properties_index]->rach_raResponseWindowSize[j] = (rach_raResponseWindowSize==10)?7:rach_raResponseWindowSize-2; - - if ((rach_raResponseWindowSize<0)||(rach_raResponseWindowSize==9)||(rach_raResponseWindowSize>10)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_raResponseWindowSize choice: 2,3,4,5,6,7,8,10!\n", - lib_config_file_name_pP, i, rach_preambleTransMax); - - - enb_properties.properties[enb_properties_index]->rach_macContentionResolutionTimer[j] = (rach_macContentionResolutionTimer/8)-1; - - if ((rach_macContentionResolutionTimer<8) || (rach_macContentionResolutionTimer>64) || ((rach_macContentionResolutionTimer&7)!=0)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_macContentionResolutionTimer choice: 8,16,...,56,64!\n", - lib_config_file_name_pP, i, rach_preambleTransMax); - - enb_properties.properties[enb_properties_index]->rach_maxHARQ_Msg3Tx[j] = rach_maxHARQ_Msg3Tx; + case 4: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4; + break; - if ((rach_maxHARQ_Msg3Tx<0) || (rach_maxHARQ_Msg3Tx>8)) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n", - lib_config_file_name_pP, i, rach_preambleTransMax); + case 5: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5; + break; + case 6: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6; + break; - switch (pcch_defaultPagingCycle) { - case 32: - enb_properties.properties[enb_properties_index]->pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf32; - break; + case 7: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7; + break; - case 64: - enb_properties.properties[enb_properties_index]->pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf64; - break; + case 8: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8; + break; - case 128: - enb_properties.properties[enb_properties_index]->pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf128; - break; + case 10: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10; + break; - case 256: - enb_properties.properties[enb_properties_index]->pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf256; - break; - - default: - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_defaultPagingCycle choice: 32,64,128,256!\n", - lib_config_file_name_pP, i, pcch_defaultPagingCycle); - break; - } - - if (strcmp(pcch_nB, "fourT") == 0) { - enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_fourT; - } else if (strcmp(pcch_nB, "twoT") == 0) { - enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_twoT; - } else if (strcmp(pcch_nB, "oneT") == 0) { - enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_oneT; - } else if (strcmp(pcch_nB, "halfT") == 0) { - enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_halfT; - } else if (strcmp(pcch_nB, "quarterT") == 0) { - enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_quarterT; - } else if (strcmp(pcch_nB, "oneEighthT") == 0) { - enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_oneEighthT; - } else if (strcmp(pcch_nB, "oneSixteenthT") == 0) { - enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_oneSixteenthT; - } else if (strcmp(pcch_nB, "oneThirtySecondT") == 0) { - enb_properties.properties[enb_properties_index]->pcch_nB[j] = PCCH_Config__nB_oneThirtySecondT; - } else - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n", - lib_config_file_name_pP, i, pcch_defaultPagingCycle); - - - - switch (bcch_modificationPeriodCoeff) { - case 2: - enb_properties.properties[enb_properties_index]->bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n2; - break; - - case 4: - enb_properties.properties[enb_properties_index]->bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n4; - break; - - case 8: - enb_properties.properties[enb_properties_index]->bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n8; - break; - - case 16: - enb_properties.properties[enb_properties_index]->bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n16; - break; - - default: - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for bcch_modificationPeriodCoeff choice: 2,4,8,16", - lib_config_file_name_pP, i, bcch_modificationPeriodCoeff); - - break; - } - - - switch (ue_TimersAndConstants_t300) { - case 100: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms100; - break; - - case 200: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms200; - break; - - case 300: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms300; - break; - - case 400: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms400; - break; - - case 600: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms600; - break; - - case 1000: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms1000; - break; - - case 1500: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms1500; - break; - - case 2000: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms2000; - break; - - default: - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t300 choice: 100,200,300,400,600,1000,1500,2000 ", - lib_config_file_name_pP, i, ue_TimersAndConstants_t300); - break; - - } - - switch (ue_TimersAndConstants_t301) { - case 100: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms100; - break; - - case 200: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms200; - break; - - case 300: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms300; - break; - - case 400: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms400; - break; - - case 600: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms600; - break; - - case 1000: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms1000; - break; + case 20: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20; + break; - case 1500: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms1500; - break; + case 50: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50; + break; - case 2000: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms2000; - break; + case 100: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100; + break; - default: - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t301 choice: 100,200,300,400,600,1000,1500,2000 ", - lib_config_file_name_pP, i, ue_TimersAndConstants_t301); - break; - - } + case 200: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200; + break; - switch (ue_TimersAndConstants_t310) { - case 0: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms0; - break; +#else - case 50: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms50; - break; + case 3: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n3; + break; - case 100: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms100; - break; + case 4: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n4; + break; - case 200: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms200; - break; + case 5: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n5; + break; - case 500: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms500; - break; - - case 1000: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms1000; - break; - - case 2000: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms2000; - break; - - default: - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t310 choice: 0,50,100,200,500,1000,1500,2000 ", - lib_config_file_name_pP, i, ue_TimersAndConstants_t310); - break; - - } - - switch (ue_TimersAndConstants_t311) { - case 1000: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms1000; - break; - - case 3110: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms3000; - break; - - case 5000: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms5000; - break; - - case 10000: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms10000; - break; - - case 15000: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms15000; - break; - - case 20000: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms20000; - break; - - case 31100: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms30000; - break; - - default: - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t311 choice: 1000,3000,5000,10000,150000,20000,30000", - lib_config_file_name_pP, i, ue_TimersAndConstants_t311); - break; - - } - - switch (ue_TimersAndConstants_n310) { - case 1: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n1; - break; - - case 2: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n2; - break; - - case 3: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n3; - break; - - case 4: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n4; - break; - - case 6: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n6; - break; - - case 8: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n8; - break; - - case 10: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n10; - break; - - case 20: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n20; - break; - - default: - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_n310 choice: 1,2,3,4,6,6,8,10,20", - lib_config_file_name_pP, i, ue_TimersAndConstants_n311); - break; - - } - - switch (ue_TimersAndConstants_n311) { - case 1: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n1; - break; - - case 2: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n2; - break; - - case 3: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n3; - break; - - case 4: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n4; - break; - - case 5: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n5; - break; - - case 6: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n6; - break; - - case 8: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n8; - break; - - case 10: - enb_properties.properties[enb_properties_index]->ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n10; - break; - - default: - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t311 choice: 1,2,3,4,5,6,8,10", - lib_config_file_name_pP, i, ue_TimersAndConstants_t311); - break; - - } - } - } - - setting_srb1 = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_SRB1); - - if (setting_srb1 != NULL) { - if (!(config_setting_lookup_int(setting_srb1, ENB_CONFIG_STRING_SRB1_TIMER_POLL_RETRANSMIT, &srb1_timer_poll_retransmit) - && config_setting_lookup_int(setting_srb1, ENB_CONFIG_STRING_SRB1_TIMER_REORDERING, &srb1_timer_reordering) - && config_setting_lookup_int(setting_srb1, ENB_CONFIG_STRING_SRB1_TIMER_STATUS_PROHIBIT, &srb1_timer_status_prohibit) - && config_setting_lookup_int(setting_srb1, ENB_CONFIG_STRING_SRB1_MAX_RETX_THRESHOLD, &srb1_max_retx_threshold) - && config_setting_lookup_int(setting_srb1, ENB_CONFIG_STRING_SRB1_POLL_PDU, &srb1_poll_pdu) - && config_setting_lookup_int(setting_srb1, ENB_CONFIG_STRING_SRB1_POLL_BYTE, &srb1_poll_byte))) - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, enb %d timer_poll_retransmit, timer_reordering, " - "timer_status_prohibit, poll_pdu, poll_byte, max_retx_threshold !\n", - lib_config_file_name_pP, i); - - switch (srb1_max_retx_threshold) { - case 1: - enb_properties.properties[enb_properties_index]->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t1; - break; - - case 2: - enb_properties.properties[enb_properties_index]->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t2; - break; - - case 3: - enb_properties.properties[enb_properties_index]->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t3; - break; - - case 4: - enb_properties.properties[enb_properties_index]->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t4; - break; - - case 6: - enb_properties.properties[enb_properties_index]->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t6; - break; - - case 8: - enb_properties.properties[enb_properties_index]->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t8; - break; - - case 16: - enb_properties.properties[enb_properties_index]->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t16; - break; - - case 32: - enb_properties.properties[enb_properties_index]->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t32; - break; - - default: - AssertError (0, parse_errors ++, - "Bad config value when parsing eNB configuration file %s, enb %d srb1_max_retx_threshold %u!\n", - lib_config_file_name_pP, i, srb1_max_retx_threshold); - } - - switch (srb1_poll_pdu) { - case 4: - enb_properties.properties[enb_properties_index]->srb1_poll_pdu = PollPDU_p4; - break; - - case 8: - enb_properties.properties[enb_properties_index]->srb1_poll_pdu = PollPDU_p8; - break; - - case 16: - enb_properties.properties[enb_properties_index]->srb1_poll_pdu = PollPDU_p16; - break; - - case 32: - enb_properties.properties[enb_properties_index]->srb1_poll_pdu = PollPDU_p32; - break; - - case 64: - enb_properties.properties[enb_properties_index]->srb1_poll_pdu = PollPDU_p64; - break; - - case 128: - enb_properties.properties[enb_properties_index]->srb1_poll_pdu = PollPDU_p128; - break; - - case 256: - enb_properties.properties[enb_properties_index]->srb1_poll_pdu = PollPDU_p256; - break; - - default: - if (srb1_poll_pdu >= 10000) - enb_properties.properties[enb_properties_index]->srb1_poll_pdu = PollPDU_pInfinity; - else - AssertError (0, parse_errors ++, - "Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_pdu %u!\n", - lib_config_file_name_pP, i, srb1_poll_pdu); - } - - enb_properties.properties[enb_properties_index]->srb1_poll_byte = srb1_poll_byte; - - switch (srb1_poll_byte) { - case 25: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB25; - break; - - case 50: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB50; - break; - - case 75: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB75; - break; - - case 100: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB100; - break; - - case 125: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB125; - break; - - case 250: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB250; - break; - - case 375: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB375; - break; - - case 500: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB500; - break; - - case 750: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB750; - break; - - case 1000: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB1000; - break; - - case 1250: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB1250; - break; - - case 1500: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB1500; - break; - - case 2000: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB2000; - break; - - case 3000: - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kB3000; - break; - - default: - if (srb1_poll_byte >= 10000) - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kBinfinity; - else - AssertError (0, parse_errors ++, - "Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_byte %u!\n", - lib_config_file_name_pP, i, srb1_poll_byte); - } - - if (srb1_timer_poll_retransmit <= 250) { - enb_properties.properties[enb_properties_index]->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 5)/5; - } else if (srb1_timer_poll_retransmit <= 500) { - enb_properties.properties[enb_properties_index]->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 300)/50 + 50; - } else { - AssertError (0, parse_errors ++, - "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_poll_retransmit %u!\n", - lib_config_file_name_pP, i, srb1_timer_poll_retransmit); - } - - if (srb1_timer_status_prohibit <= 250) { - enb_properties.properties[enb_properties_index]->srb1_timer_status_prohibit = srb1_timer_status_prohibit/5; - } else if ((srb1_timer_poll_retransmit >= 300) && (srb1_timer_poll_retransmit <= 500)) { - enb_properties.properties[enb_properties_index]->srb1_timer_status_prohibit = (srb1_timer_status_prohibit - 300)/50 + 51; - } else { - AssertError (0, parse_errors ++, - "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_status_prohibit %u!\n", - lib_config_file_name_pP, i, srb1_timer_status_prohibit); - } - - switch (srb1_timer_reordering) { - case 0: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms0; - break; - - case 5: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms5; - break; - - case 10: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms10; - break; - - case 15: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms15; - break; - - case 20: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms20; - break; - - case 25: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms25; - break; - - case 30: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms30; - break; - - case 35: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms35; - break; - - case 40: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms40; - break; - - case 45: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms45; - break; - - case 50: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms50; - break; - - case 55: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms55; - break; - - case 60: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms60; - break; - - case 65: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms65; - break; - - case 70: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms70; - break; - - case 75: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms75; - break; - - case 80: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms80; - break; - - case 85: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms85; - break; - - case 90: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms90; - break; - - case 95: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms95; - break; - - case 100: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms100; - break; - - case 110: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms110; - break; - - case 120: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms120; - break; - - case 130: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms130; - break; - - case 140: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms140; - break; - - case 150: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms150; - break; - - case 160: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms160; - break; - - case 170: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms170; - break; - - case 180: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms180; - break; - - case 190: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms190; - break; - - case 200: - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms200; - break; - - default: - AssertError (0, parse_errors ++, - "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_reordering %u!\n", - lib_config_file_name_pP, i, srb1_timer_reordering); - } - } else { - enb_properties.properties[enb_properties_index]->srb1_timer_poll_retransmit = T_PollRetransmit_ms80; - enb_properties.properties[enb_properties_index]->srb1_timer_reordering = T_Reordering_ms35; - enb_properties.properties[enb_properties_index]->srb1_timer_status_prohibit = T_StatusProhibit_ms0; - enb_properties.properties[enb_properties_index]->srb1_poll_pdu = PollPDU_p4; - enb_properties.properties[enb_properties_index]->srb1_poll_byte = PollByte_kBinfinity; - enb_properties.properties[enb_properties_index]->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t8; - } - - setting_mme_addresses = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_MME_IP_ADDRESS); - num_mme_address = config_setting_length(setting_mme_addresses); - enb_properties.properties[enb_properties_index]->nb_mme = 0; - - for (j = 0; j < num_mme_address; j++) { - setting_mme_address = config_setting_get_elem(setting_mme_addresses, j); - - if ( !( - config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IPV4_ADDRESS, (const char **)&ipv4) - && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IPV6_ADDRESS, (const char **)&ipv6) - && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE, (const char **)&active) - && config_setting_lookup_string(setting_mme_address, ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE, (const char **)&preference) - ) - ) { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, %u th enb %u th mme address !\n", - lib_config_file_name_pP, i, j); - continue; // FIXME will prevent segfaults below, not sure what happens at function exit... - } - - enb_properties.properties[enb_properties_index]->nb_mme += 1; - - enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4_address = strdup(ipv4); - enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6_address = strdup(ipv6); - - if (strcmp(active, "yes") == 0) { - enb_properties.properties[enb_properties_index]->mme_ip_address[j].active = 1; -#if defined(ENABLE_USE_MME) - EPC_MODE_ENABLED = 1; + case 6: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n6; + break; + + case 7: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n7; + break; + + case 8: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n8; + break; + + case 10: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n10; + break; + + case 20: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n20; + break; + + case 50: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n50; + break; + + case 100: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n100; + break; + + case 200: + RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] = PreambleTransMax_n200; + break; #endif - } // else { (calloc) - if (strcmp(preference, "ipv4") == 0) { - enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; - } else if (strcmp(preference, "ipv6") == 0) { - enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; - } else if (strcmp(preference, "no") == 0) { - enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv4 = 1; - enb_properties.properties[enb_properties_index]->mme_ip_address[j].ipv6 = 1; - } - } - // RRH Config - setting_rrh_gws = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_RRH_GW_CONFIG); - if ( setting_rrh_gws != NULL) { - num_rrh_gw = config_setting_length(setting_rrh_gws); - enb_properties.properties[enb_properties_index]->nb_rrh_gw = 0; + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleTransMax choice: 3,4,5,6,7,8,10,20,50,100,200!\n", + RC.config_file_name, i, rach_preambleTransMax); + break; + } - for (j = 0; j < num_rrh_gw; j++) { - setting_rrh_gw = config_setting_get_elem(setting_rrh_gws, j); + RRC_CONFIGURATION_REQ (msg_p).rach_raResponseWindowSize[j] = (rach_raResponseWindowSize==10)?7:rach_raResponseWindowSize-2; - if ( !( - config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_LOCAL_IF_NAME, (const char **)&if_name) - && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_LOCAL_ADDRESS, (const char **)&ipv4) - && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_REMOTE_ADDRESS , (const char **)&ipv4_remote) - && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_LOCAL_PORT, &local_port) - && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_REMOTE_PORT, &remote_port) - && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_ACTIVE, (const char **)&active) - && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TRANSPORT_PREFERENCE, (const char **)&tr_preference) - && config_setting_lookup_string(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_RF_TARGET_PREFERENCE, (const char **)&rf_preference) - && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_IQ_TXSHIFT, &iq_txshift) - && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TX_SAMPLE_ADVANCE, &tx_sample_advance) - && config_setting_lookup_int(setting_rrh_gw, ENB_CONFIG_STRING_RRH_GW_TX_SCHEDULING_ADVANCE, &tx_scheduling_advance) - ) - ) { - AssertError (0, parse_errors ++, - "Failed to parse eNB configuration file %s, %u th enb %u the RRH GW address !\n", - lib_config_file_name_pP, i, j); - continue; // FIXME will prevent segfaults below, not sure what happens at function exit... - } + if ((rach_raResponseWindowSize<0)||(rach_raResponseWindowSize==9)||(rach_raResponseWindowSize>10)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_raResponseWindowSize choice: 2,3,4,5,6,7,8,10!\n", + RC.config_file_name, i, rach_preambleTransMax); - enb_properties.properties[enb_properties_index]->nb_rrh_gw += 1; - enb_properties.properties[enb_properties_index]->rrh_gw_if_name = strdup(if_name); - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_address = strdup(ipv4); - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_address = strdup(ipv4_remote); - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_port = local_port; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_port = remote_port; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].iq_txshift = iq_txshift; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_sample_advance = tx_sample_advance; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_scheduling_advance= tx_scheduling_advance; + RRC_CONFIGURATION_REQ (msg_p).rach_macContentionResolutionTimer[j] = (rach_macContentionResolutionTimer/8)-1; - if (strcmp(active, "yes") == 0) { - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].active = 1; - } + if ((rach_macContentionResolutionTimer<8) || (rach_macContentionResolutionTimer>64) || ((rach_macContentionResolutionTimer&7)!=0)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_macContentionResolutionTimer choice: 8,16,...,56,64!\n", + RC.config_file_name, i, rach_preambleTransMax); - if (strcmp(tr_preference, "udp") == 0) { - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1; - } else if (strcmp(tr_preference, "raw") == 0) { - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1; - } else {//if (strcmp(preference, "no") == 0) - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 1; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 1; - } + RRC_CONFIGURATION_REQ (msg_p).rach_maxHARQ_Msg3Tx[j] = rach_maxHARQ_Msg3Tx; - if (strcmp(rf_preference, "exmimo") == 0) { - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 1; - } else if (strcmp(rf_preference, "usrp_b200") == 0) { - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 1; - } else if (strcmp(rf_preference, "usrp_x300") == 0) { - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 1; - } else if (strcmp(rf_preference, "bladerf") == 0) { - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 1; - } else if (strcmp(rf_preference, "bladerf") == 0) { - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 1; - } else {//if (strcmp(preference, "no") == 0) - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 1; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 1; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 1; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 1; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 1; + if ((rach_maxHARQ_Msg3Tx<0) || (rach_maxHARQ_Msg3Tx>8)) + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n", + RC.config_file_name, i, rach_preambleTransMax); + + + switch (pcch_defaultPagingCycle) { + case 32: + RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf32; + break; + + case 64: + RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf64; + break; + + case 128: + RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf128; + break; + + case 256: + RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf256; + break; + + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_defaultPagingCycle choice: 32,64,128,256!\n", + RC.config_file_name, i, pcch_defaultPagingCycle); + break; + } + + if (strcmp(pcch_nB, "fourT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_fourT; + } else if (strcmp(pcch_nB, "twoT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_twoT; + } else if (strcmp(pcch_nB, "oneT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneT; + } else if (strcmp(pcch_nB, "halfT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_halfT; + } else if (strcmp(pcch_nB, "quarterT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_quarterT; + } else if (strcmp(pcch_nB, "oneEighthT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneEighthT; + } else if (strcmp(pcch_nB, "oneSixteenthT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneSixteenthT; + } else if (strcmp(pcch_nB, "oneThirtySecondT") == 0) { + RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneThirtySecondT; + } else + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n", + RC.config_file_name, i, pcch_defaultPagingCycle); + + + + switch (bcch_modificationPeriodCoeff) { + case 2: + RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n2; + break; + + case 4: + RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n4; + break; + + case 8: + RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n8; + break; + + case 16: + RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n16; + break; + + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for bcch_modificationPeriodCoeff choice: 2,4,8,16", + RC.config_file_name, i, bcch_modificationPeriodCoeff); + + break; + } + + + switch (ue_TimersAndConstants_t300) { + case 100: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms100; + break; + + case 200: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms200; + break; + + case 300: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms300; + break; + + case 400: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms400; + break; + + case 600: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms600; + break; + + case 1000: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms1000; + break; + + case 1500: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms1500; + break; + + case 2000: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms2000; + break; + + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t300 choice: 100,200,300,400,600,1000,1500,2000 ", + RC.config_file_name, i, ue_TimersAndConstants_t300); + break; + + } + + switch (ue_TimersAndConstants_t301) { + case 100: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms100; + break; + + case 200: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms200; + break; + + case 300: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms300; + break; + + case 400: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms400; + break; + + case 600: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms600; + break; + + case 1000: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms1000; + break; + + case 1500: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms1500; + break; + + case 2000: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms2000; + break; + + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t301 choice: 100,200,300,400,600,1000,1500,2000 ", + RC.config_file_name, i, ue_TimersAndConstants_t301); + break; + + } + + switch (ue_TimersAndConstants_t310) { + case 0: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms0; + break; + + case 50: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms50; + break; + + case 100: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms100; + break; + + case 200: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms200; + break; + + case 500: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms500; + break; + + case 1000: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms1000; + break; + + case 2000: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms2000; + break; + + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t310 choice: 0,50,100,200,500,1000,1500,2000 ", + RC.config_file_name, i, ue_TimersAndConstants_t310); + break; + + } + + switch (ue_TimersAndConstants_t311) { + case 1000: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms1000; + break; + + case 3110: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms3000; + break; + + case 5000: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms5000; + break; + + case 10000: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms10000; + break; + + case 15000: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms15000; + break; + + case 20000: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms20000; + break; + + case 31100: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms30000; + break; + + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t311 choice: 1000,3000,5000,10000,150000,20000,30000", + RC.config_file_name, i, ue_TimersAndConstants_t311); + break; + + } + + switch (ue_TimersAndConstants_n310) { + case 1: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n1; + break; + + case 2: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n2; + break; + + case 3: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n3; + break; + + case 4: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n4; + break; + + case 6: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n6; + break; + + case 8: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n8; + break; + + case 10: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n10; + break; + + case 20: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n20; + break; + + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_n310 choice: 1,2,3,4,6,6,8,10,20", + RC.config_file_name, i, ue_TimersAndConstants_n311); + break; + + } + + switch (ue_TimersAndConstants_n311) { + case 1: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n1; + break; + + case 2: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n2; + break; + + case 3: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n3; + break; + + case 4: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n4; + break; + + case 5: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n5; + break; + + case 6: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n6; + break; + + case 8: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n8; + break; + + case 10: + RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n10; + break; + + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t311 choice: 1,2,3,4,5,6,8,10", + RC.config_file_name, i, ue_TimersAndConstants_t311); + break; + + } + + switch (ue_TransmissionMode) { + case 1: + RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm1; + break; + case 2: + RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm2; + break; + case 3: + RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm3; + break; + case 4: + RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm4; + break; + case 5: + RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm5; + break; + case 6: + RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm6; + break; + case 7: + RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm7; + break; + default: + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TransmissionMode choice: 1,2,3,4,5,6,7", + RC.config_file_name, i, ue_TransmissionMode); + break; + } + } + } + char srb1path[MAX_OPTNAME_SIZE*2 + 8]; + sprintf(srb1path,"%s.%s",enbpath,ENB_CONFIG_STRING_SRB1); + int npar = config_get( SRB1Params,sizeof(SRB1Params)/sizeof(paramdef_t), srb1path); + if (npar == sizeof(SRB1Params)/sizeof(paramdef_t)) { + switch (srb1_max_retx_threshold) { + case 1: + rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t1; + break; + + case 2: + rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t2; + break; + + case 3: + rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t3; + break; + + case 4: + rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t4; + break; + + case 6: + rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t6; + break; + + case 8: + rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t8; + break; + + case 16: + rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t16; + break; + + case 32: + rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t32; + break; + + default: + AssertFatal (0, + "Bad config value when parsing eNB configuration file %s, enb %d srb1_max_retx_threshold %u!\n", + RC.config_file_name, i, srb1_max_retx_threshold); + } + + + switch (srb1_poll_pdu) { + case 4: + rrc->srb1_poll_pdu = PollPDU_p4; + break; + + case 8: + rrc->srb1_poll_pdu = PollPDU_p8; + break; + + case 16: + rrc->srb1_poll_pdu = PollPDU_p16; + break; + + case 32: + rrc->srb1_poll_pdu = PollPDU_p32; + break; + + case 64: + rrc->srb1_poll_pdu = PollPDU_p64; + break; + + case 128: + rrc->srb1_poll_pdu = PollPDU_p128; + break; + + case 256: + rrc->srb1_poll_pdu = PollPDU_p256; + break; + + default: + if (srb1_poll_pdu >= 10000) + rrc->srb1_poll_pdu = PollPDU_pInfinity; + else + AssertFatal (0, + "Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_pdu %u!\n", + RC.config_file_name, i, srb1_poll_pdu); + } + + rrc->srb1_poll_byte = srb1_poll_byte; + + switch (srb1_poll_byte) { + case 25: + rrc->srb1_poll_byte = PollByte_kB25; + break; + + case 50: + rrc->srb1_poll_byte = PollByte_kB50; + break; + + case 75: + rrc->srb1_poll_byte = PollByte_kB75; + break; + + case 100: + rrc->srb1_poll_byte = PollByte_kB100; + break; + + case 125: + rrc->srb1_poll_byte = PollByte_kB125; + break; + + case 250: + rrc->srb1_poll_byte = PollByte_kB250; + break; + + case 375: + rrc->srb1_poll_byte = PollByte_kB375; + break; + + case 500: + rrc->srb1_poll_byte = PollByte_kB500; + break; + + case 750: + rrc->srb1_poll_byte = PollByte_kB750; + break; + + case 1000: + rrc->srb1_poll_byte = PollByte_kB1000; + break; + + case 1250: + rrc->srb1_poll_byte = PollByte_kB1250; + break; + + case 1500: + rrc->srb1_poll_byte = PollByte_kB1500; + break; + + case 2000: + rrc->srb1_poll_byte = PollByte_kB2000; + break; + + case 3000: + rrc->srb1_poll_byte = PollByte_kB3000; + break; + + default: + if (srb1_poll_byte >= 10000) + rrc->srb1_poll_byte = PollByte_kBinfinity; + else + AssertFatal (0, + "Bad config value when parsing eNB configuration file %s, enb %d srb1_poll_byte %u!\n", + RC.config_file_name, i, srb1_poll_byte); + } + + if (srb1_timer_poll_retransmit <= 250) { + rrc->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 5)/5; + } else if (srb1_timer_poll_retransmit <= 500) { + rrc->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 300)/50 + 50; + } else { + AssertFatal (0, + "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_poll_retransmit %u!\n", + RC.config_file_name, i, srb1_timer_poll_retransmit); + } + + if (srb1_timer_status_prohibit <= 250) { + rrc->srb1_timer_status_prohibit = srb1_timer_status_prohibit/5; + } else if ((srb1_timer_poll_retransmit >= 300) && (srb1_timer_poll_retransmit <= 500)) { + rrc->srb1_timer_status_prohibit = (srb1_timer_status_prohibit - 300)/50 + 51; + } else { + AssertFatal (0, + "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_status_prohibit %u!\n", + RC.config_file_name, i, srb1_timer_status_prohibit); + } + + switch (srb1_timer_reordering) { + case 0: + rrc->srb1_timer_reordering = T_Reordering_ms0; + break; + + case 5: + rrc->srb1_timer_reordering = T_Reordering_ms5; + break; + + case 10: + rrc->srb1_timer_reordering = T_Reordering_ms10; + break; + + case 15: + rrc->srb1_timer_reordering = T_Reordering_ms15; + break; + + case 20: + rrc->srb1_timer_reordering = T_Reordering_ms20; + break; + + case 25: + rrc->srb1_timer_reordering = T_Reordering_ms25; + break; + + case 30: + rrc->srb1_timer_reordering = T_Reordering_ms30; + break; + + case 35: + rrc->srb1_timer_reordering = T_Reordering_ms35; + break; + + case 40: + rrc->srb1_timer_reordering = T_Reordering_ms40; + break; + + case 45: + rrc->srb1_timer_reordering = T_Reordering_ms45; + break; + + case 50: + rrc->srb1_timer_reordering = T_Reordering_ms50; + break; + + case 55: + rrc->srb1_timer_reordering = T_Reordering_ms55; + break; + + case 60: + rrc->srb1_timer_reordering = T_Reordering_ms60; + break; + + case 65: + rrc->srb1_timer_reordering = T_Reordering_ms65; + break; + + case 70: + rrc->srb1_timer_reordering = T_Reordering_ms70; + break; + + case 75: + rrc->srb1_timer_reordering = T_Reordering_ms75; + break; + + case 80: + rrc->srb1_timer_reordering = T_Reordering_ms80; + break; + + case 85: + rrc->srb1_timer_reordering = T_Reordering_ms85; + break; + + case 90: + rrc->srb1_timer_reordering = T_Reordering_ms90; + break; + + case 95: + rrc->srb1_timer_reordering = T_Reordering_ms95; + break; + + case 100: + rrc->srb1_timer_reordering = T_Reordering_ms100; + break; + + case 110: + rrc->srb1_timer_reordering = T_Reordering_ms110; + break; + + case 120: + rrc->srb1_timer_reordering = T_Reordering_ms120; + break; + + case 130: + rrc->srb1_timer_reordering = T_Reordering_ms130; + break; + + case 140: + rrc->srb1_timer_reordering = T_Reordering_ms140; + break; + + case 150: + rrc->srb1_timer_reordering = T_Reordering_ms150; + break; + + case 160: + rrc->srb1_timer_reordering = T_Reordering_ms160; + break; + + case 170: + rrc->srb1_timer_reordering = T_Reordering_ms170; + break; + + case 180: + rrc->srb1_timer_reordering = T_Reordering_ms180; + break; + + case 190: + rrc->srb1_timer_reordering = T_Reordering_ms190; + break; + + case 200: + rrc->srb1_timer_reordering = T_Reordering_ms200; + break; + + default: + AssertFatal (0, + "Bad config value when parsing eNB configuration file %s, enb %d srb1_timer_reordering %u!\n", + RC.config_file_name, i, srb1_timer_reordering); + } + + } else { + rrc->srb1_timer_poll_retransmit = T_PollRetransmit_ms80; + rrc->srb1_timer_reordering = T_Reordering_ms35; + rrc->srb1_timer_status_prohibit = T_StatusProhibit_ms0; + rrc->srb1_poll_pdu = PollPDU_p4; + rrc->srb1_poll_byte = PollByte_kBinfinity; + rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t8; + } + /* + // Network Controller + subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_CONTROLLER_CONFIG); + + if (subsetting != NULL) { + if ( ( + config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_INTERFACE_NAME, + (const char **)&flexran_agent_interface_name) + && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_IPV4_ADDRESS, + (const char **)&flexran_agent_ipv4_address) + && config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_PORT, + &flexran_agent_port) + && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_CACHE, + (const char **)&flexran_agent_cache) + ) + ) { + enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_interface_name = strdup(flexran_agent_interface_name); + cidr = flexran_agent_ipv4_address; + address = strtok(cidr, "/"); + //enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_ipv4_address = strdup(address); + if (address) { + IPV4_STR_ADDR_TO_INT_NWBO (address, enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_ipv4_address, "BAD IP ADDRESS FORMAT FOR eNB Agent !\n" ); + } + + enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_port = flexran_agent_port; + enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_cache = strdup(flexran_agent_cache); + } + } + */ + + /* + // OTG _CONFIG + setting_otg = config_setting_get_member (setting_enb, ENB_CONF_STRING_OTG_CONFIG); + + if (setting_otg != NULL) { + num_otg_elements = config_setting_length(setting_otg); + printf("num otg elements %d \n", num_otg_elements); + enb_properties_loc.properties[enb_properties_loc_index]->num_otg_elements = 0; + + for (j = 0; j < num_otg_elements; j++) { + subsetting_otg=config_setting_get_elem(setting_otg, j); + + if (config_setting_lookup_int(subsetting_otg, ENB_CONF_STRING_OTG_UE_ID, &otg_ue_id)) { + enb_properties_loc.properties[enb_properties_loc_index]->otg_ue_id[j] = otg_ue_id; + } else { + enb_properties_loc.properties[enb_properties_loc_index]->otg_ue_id[j] = 1; + } + + if (config_setting_lookup_string(subsetting_otg, ENB_CONF_STRING_OTG_APP_TYPE, (const char **)&otg_app_type)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->otg_app_type[j] = map_str_to_int(otg_app_type_names,otg_app_type))== -1) { + enb_properties_loc.properties[enb_properties_loc_index]->otg_app_type[j] = BCBR; + } + } else { + enb_properties_loc.properties[enb_properties_loc_index]->otg_app_type[j] = NO_PREDEFINED_TRAFFIC; // 0 + } + + if (config_setting_lookup_string(subsetting_otg, ENB_CONF_STRING_OTG_BG_TRAFFIC, (const char **)&otg_bg_traffic)) { + + if ((enb_properties_loc.properties[enb_properties_loc_index]->otg_bg_traffic[j] = map_str_to_int(switch_names,otg_bg_traffic)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->otg_bg_traffic[j]=0; + } + } else { + enb_properties_loc.properties[enb_properties_loc_index]->otg_bg_traffic[j] = 0; + printf("otg bg %s\n", otg_bg_traffic); + } + + enb_properties_loc.properties[enb_properties_loc_index]->num_otg_elements+=1; + + } + } + + // log_config + subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_LOG_CONFIG); + + if (subsetting != NULL) { + // global + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GLOBAL_LOG_LEVEL, (const char **) &glog_level)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->glog_level = map_str_to_int(log_level_names, glog_level)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->glog_level = LOG_INFO; + } + + //printf( "\tGlobal log level :\t%s->%d\n",glog_level, enb_properties_loc.properties[enb_properties_loc_index]->glog_level); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->glog_level = LOG_INFO; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GLOBAL_LOG_VERBOSITY,(const char **) &glog_verbosity)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity = map_str_to_int(log_verbosity_names, glog_verbosity)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity = LOG_MED; + } + + //printf( "\tGlobal log verbosity:\t%s->%d\n",glog_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity = LOG_MED; + } + + // HW + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_HW_LOG_LEVEL, (const char **) &hw_log_level)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level = map_str_to_int(log_level_names,hw_log_level)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level = LOG_INFO; + } + + //printf( "\tHW log level :\t%s->%d\n",hw_log_level,enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level = LOG_INFO; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_HW_LOG_VERBOSITY, (const char **) &hw_log_verbosity)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity = map_str_to_int(log_verbosity_names,hw_log_verbosity)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity = LOG_MED; + } + + //printf( "\tHW log verbosity:\t%s->%d\n",hw_log_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity = LOG_MED; + } + + // phy + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PHY_LOG_LEVEL,(const char **) &phy_log_level)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level = map_str_to_int(log_level_names,phy_log_level)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level = LOG_INFO; + } + + //printf( "\tPHY log level :\t%s->%d\n",phy_log_level,enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level = LOG_INFO; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PHY_LOG_VERBOSITY, (const char **)&phy_log_verbosity)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity = map_str_to_int(log_verbosity_names,phy_log_verbosity)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity = LOG_MED; + } + + //printf( "\tPHY log verbosity:\t%s->%d\n",phy_log_level,enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity = LOG_MED; + } + + //mac + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_MAC_LOG_LEVEL, (const char **)&mac_log_level)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level = map_str_to_int(log_level_names,mac_log_level)) == -1 ) { + enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level = LOG_INFO; + } + + //printf( "\tMAC log level :\t%s->%d\n",mac_log_level,enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level = LOG_INFO; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_MAC_LOG_VERBOSITY, (const char **)&mac_log_verbosity)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity = map_str_to_int(log_verbosity_names,mac_log_verbosity)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity = LOG_MED; + } + + //printf( "\tMAC log verbosity:\t%s->%d\n",mac_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity = LOG_MED; + } + + //rlc + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RLC_LOG_LEVEL, (const char **)&rlc_log_level)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level = map_str_to_int(log_level_names,rlc_log_level)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level = LOG_INFO; + } + + //printf( "\tRLC log level :\t%s->%d\n",rlc_log_level, enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level = LOG_INFO; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RLC_LOG_VERBOSITY, (const char **)&rlc_log_verbosity)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity = map_str_to_int(log_verbosity_names,rlc_log_verbosity)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity = LOG_MED; + } + + //printf( "\tRLC log verbosity:\t%s->%d\n",rlc_log_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity = LOG_MED; + } + + //pdcp + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PDCP_LOG_LEVEL, (const char **)&pdcp_log_level)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level = map_str_to_int(log_level_names,pdcp_log_level)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level = LOG_INFO; + } + + //printf( "\tPDCP log level :\t%s->%d\n",pdcp_log_level, enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level = LOG_INFO; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PDCP_LOG_VERBOSITY, (const char **)&pdcp_log_verbosity)) { + enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity = map_str_to_int(log_verbosity_names,pdcp_log_verbosity); + //printf( "\tPDCP log verbosity:\t%s->%d\n",pdcp_log_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity = LOG_MED; + } + + //rrc + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RRC_LOG_LEVEL, (const char **)&rrc_log_level)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level = map_str_to_int(log_level_names,rrc_log_level)) == -1 ) { + enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level = LOG_INFO; + } + + //printf( "\tRRC log level :\t%s->%d\n",rrc_log_level,enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level = LOG_INFO; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RRC_LOG_VERBOSITY, (const char **)&rrc_log_verbosity)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity = map_str_to_int(log_verbosity_names,rrc_log_verbosity)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity = LOG_MED; + } + + //printf( "\tRRC log verbosity:\t%s->%d\n",rrc_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity = LOG_MED; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GTPU_LOG_LEVEL, (const char **)>pu_log_level)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level = map_str_to_int(log_level_names,gtpu_log_level)) == -1 ) { + enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level = LOG_INFO; + } + + //printf( "\tGTPU log level :\t%s->%d\n",gtpu_log_level,enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level = LOG_INFO; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GTPU_LOG_VERBOSITY, (const char **)>pu_log_verbosity)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = map_str_to_int(log_verbosity_names,gtpu_log_verbosity)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = LOG_MED; + } + + //printf( "\tGTPU log verbosity:\t%s->%d\n",gtpu_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = LOG_MED; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_UDP_LOG_LEVEL, (const char **)&udp_log_level)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level = map_str_to_int(log_level_names,udp_log_level)) == -1 ) { + enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level = LOG_INFO; + } + + //printf( "\tUDP log level :\t%s->%d\n",udp_log_level,enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level = LOG_INFO; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_UDP_LOG_VERBOSITY, (const char **)&udp_log_verbosity)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity = map_str_to_int(log_verbosity_names,udp_log_verbosity)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity = LOG_MED; + } + + //printf( "\tUDP log verbosity:\t%s->%d\n",udp_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity = LOG_MED; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_OSA_LOG_LEVEL, (const char **)&osa_log_level)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level = map_str_to_int(log_level_names,osa_log_level)) == -1 ) { + enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level = LOG_INFO; + } + + //printf( "\tOSA log level :\t%s->%d\n",osa_log_level,enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level = LOG_INFO; + } + + if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_OSA_LOG_VERBOSITY, (const char **)&osa_log_verbosity)) { + if ((enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity = map_str_to_int(log_verbosity_names,osa_log_verbosity)) == -1) { + enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity = LOG_MED; + } + + //printf( "\tOSA log verbosity:\t%s->%d\n",osa_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->gosa_log_verbosity); + } else { + enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity = LOG_MED; + } + + } else { // not configuration is given + enb_properties_loc.properties[enb_properties_loc_index]->glog_level = LOG_INFO; + enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity = LOG_MED; + enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level = LOG_INFO; + enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity = LOG_MED; + enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level = LOG_INFO; + enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity = LOG_MED; + enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level = LOG_INFO; + enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity = LOG_MED; + enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level = LOG_INFO; + enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity = LOG_MED; + enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level = LOG_INFO; + enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity = LOG_MED; + enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level = LOG_INFO; + enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity = LOG_MED; + enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level = LOG_INFO; + enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = LOG_MED; + enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level = LOG_INFO; + enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity = LOG_MED; + enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level = LOG_INFO; + enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity = LOG_MED; + } + */ + break; + } + + } + } +return 0; +} + +int RCconfig_gtpu(void ) { + + int num_enbs = 0; + + + + char* enb_interface_name_for_S1U = NULL; + char* enb_ipv4_address_for_S1U = NULL; + uint32_t enb_port_for_S1U = 0; + char *address = NULL; + char *cidr = NULL; + char gtpupath[MAX_OPTNAME_SIZE*2 + 8]; + + + paramdef_t ENBSParams[] = ENBSPARAMS_DESC; + + paramdef_t GTPUParams[] = GTPUPARAMS_DESC; + LOG_I(GTPU,"Configuring GTPu\n"); + +/* get number of active eNodeBs */ + config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); + num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; + AssertFatal (num_enbs >0, + "Failed to parse config file no active eNodeBs in %s \n", ENB_CONFIG_STRING_ACTIVE_ENBS); + + + sprintf(gtpupath,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,0,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); + config_get( GTPUParams,sizeof(GTPUParams)/sizeof(paramdef_t),gtpupath); + + + + cidr = enb_ipv4_address_for_S1U; + address = strtok(cidr, "/"); + + if (address) { + IPV4_STR_ADDR_TO_INT_NWBO ( address, RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); + + LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up); - } - } - } else { - enb_properties.properties[enb_properties_index]->nb_rrh_gw = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_if_name = "none"; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_address = "0.0.0.0"; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_address = "0.0.0.0"; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].local_port= 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].remote_port= 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].active = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].udp = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].raw = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_scheduling_advance = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].tx_sample_advance = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].iq_txshift = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].exmimo = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_b200 = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].usrp_x300 = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].bladerf = 0; - enb_properties.properties[enb_properties_index]->rrh_gw_config[j].lmssdr = 0; } - // SCTP SETTING - enb_properties.properties[enb_properties_index]->sctp_out_streams = SCTP_OUT_STREAMS; - enb_properties.properties[enb_properties_index]->sctp_in_streams = SCTP_IN_STREAMS; + RC.gtpv1u_data_g->enb_port_for_S1u_S12_S4_up = enb_port_for_S1U; +return 0; +} + + +int RCconfig_S1(MessageDef *msg_p, uint32_t i) { + + int j,k = 0; + + + int enb_id; + + int32_t my_int; + + + + const char* active_enb[MAX_ENB]; + + + char *address = NULL; + char *cidr = NULL; + + + // for no gcc warnings + + (void)my_int; + + memset((char*)active_enb, 0 , MAX_ENB * sizeof(char*)); + + paramdef_t ENBSParams[] = ENBSPARAMS_DESC; + + paramdef_t ENBParams[] = ENBPARAMS_DESC; + paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0}; + +/* get global parameters, defined outside any section in the config file */ + + config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); +#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) + if (strcasecmp( *(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr), ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE) == 0) { + asn_debug = 0; + asn1_xer_print = 0; + } else if (strcasecmp( *(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr), ENB_CONFIG_STRING_ASN1_VERBOSITY_INFO) == 0) { + asn_debug = 1; + asn1_xer_print = 1; + } else if (strcasecmp(*(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr) , ENB_CONFIG_STRING_ASN1_VERBOSITY_ANNOYING) == 0) { + asn_debug = 1; + asn1_xer_print = 2; + } else { + asn_debug = 0; + asn1_xer_print = 0; + } + +#endif + AssertFatal (i0) { + // Output a list of all eNBs. + config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL); + + + + + + if (ENBParamList.numelt > 0) { + for (k = 0; k < ENBParamList.numelt; k++) { + if (ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr == NULL) { + // Calculate a default eNB ID + # if defined(ENABLE_USE_MME) - subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_SCTP_CONFIG); + uint32_t hash; + + hash = s1ap_generate_eNB_id (); + enb_id = k + (hash & 0xFFFF8); +# else + enb_id = k; +# endif + } else { + enb_id = *(ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr); + } + + + // search if in active list + for (j=0; j < ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; j++) { + if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[j], *(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr)) == 0) { + paramdef_t S1Params[] = S1PARAMS_DESC; + paramlist_def_t S1ParamList = {ENB_CONFIG_STRING_MME_IP_ADDRESS,NULL,0}; - if (subsetting != NULL) { - if ( (config_setting_lookup_int( subsetting, ENB_CONFIG_STRING_SCTP_INSTREAMS, &my_int) )) { - enb_properties.properties[enb_properties_index]->sctp_in_streams = (uint16_t)my_int; - } + paramdef_t SCTPParams[] = SCTPPARAMS_DESC; + paramdef_t NETParams[] = NETPARAMS_DESC; + char aprefix[MAX_OPTNAME_SIZE*2 + 8]; + + S1AP_REGISTER_ENB_REQ (msg_p).eNB_id = enb_id; + + if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_MACRO_ENB") == 0) { + S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_MACRO_ENB; + } else if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_HOME_ENB") == 0) { + S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_HOME_ENB; + } else { + AssertFatal (0, + "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n", + RC.config_file_name, i, *(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr)); + } + + S1AP_REGISTER_ENB_REQ (msg_p).eNB_name = strdup(*(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr)); + S1AP_REGISTER_ENB_REQ (msg_p).tac = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_TRACKING_AREA_CODE_IDX].strptr)); + S1AP_REGISTER_ENB_REQ (msg_p).mcc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_COUNTRY_CODE_IDX].strptr)); + S1AP_REGISTER_ENB_REQ (msg_p).mnc = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr)); + S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr)); + S1AP_REGISTER_ENB_REQ (msg_p).default_drx = 0; + AssertFatal((S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 2) || + (S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 3), + "BAD MNC DIGIT LENGTH %d", + S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length); + + sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k); + config_getlist( &S1ParamList,S1Params,sizeof(S1Params)/sizeof(paramdef_t),aprefix); + + S1AP_REGISTER_ENB_REQ (msg_p).nb_mme = 0; - if ( (config_setting_lookup_int( subsetting, ENB_CONFIG_STRING_SCTP_OUTSTREAMS, &my_int) )) { - enb_properties.properties[enb_properties_index]->sctp_out_streams = (uint16_t)my_int; - } - } + for (int l = 0; l < S1ParamList.numelt; l++) { + + S1AP_REGISTER_ENB_REQ (msg_p).nb_mme += 1; + + strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4_address,*(S1ParamList.paramarray[l][ENB_MME_IPV4_ADDRESS_IDX].strptr)); + strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6_address,*(S1ParamList.paramarray[l][ENB_MME_IPV6_ADDRESS_IDX].strptr)); + + if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_ACTIVE_IDX].strptr), "yes") == 0) { +#if defined(ENABLE_USE_MME) + EPC_MODE_ENABLED = 1; +#endif + } + if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) { + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1; + } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) { + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1; + } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) { + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1; + S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1; + } + } + + + // SCTP SETTING + S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = SCTP_OUT_STREAMS; + S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = SCTP_IN_STREAMS; +# if defined(ENABLE_USE_MME) + sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_SCTP_CONFIG); + config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix); + S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr); + S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr); #endif - // NETWORK_INTERFACES - subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); + sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); + // NETWORK_INTERFACES + config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix); - if (subsetting != NULL) { - if ( ( - config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME, - (const char **)&enb_interface_name_for_S1_MME) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME, - (const char **)&enb_ipv4_address_for_S1_MME) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U, - (const char **)&enb_interface_name_for_S1U) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U, - (const char **)&enb_ipv4_address_for_S1U) - && config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_ENB_PORT_FOR_S1U, - &enb_port_for_S1U) - ) - ) { - enb_properties.properties[enb_properties_index]->enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U); - cidr = enb_ipv4_address_for_S1U; - address = strtok(cidr, "/"); + // S1AP_REGISTER_ENB_REQ (msg_p).enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U); + cidr = *(NETParams[ENB_IPV4_ADDRESS_FOR_S1_MME_IDX].strptr); + address = strtok(cidr, "/"); - if (address) { - IPV4_STR_ADDR_TO_INT_NWBO ( address, enb_properties.properties[enb_properties_index]->enb_ipv4_address_for_S1U, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); - } - enb_properties.properties[enb_properties_index]->enb_port_for_S1U = enb_port_for_S1U; + S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv6 = 0; + S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4 = 1; - enb_properties.properties[enb_properties_index]->enb_interface_name_for_S1_MME = strdup(enb_interface_name_for_S1_MME); - cidr = enb_ipv4_address_for_S1_MME; - address = strtok(cidr, "/"); + strcpy(S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4_address, address); - if (address) { - IPV4_STR_ADDR_TO_INT_NWBO ( address, enb_properties.properties[enb_properties_index]->enb_ipv4_address_for_S1_MME, "BAD IP ADDRESS FORMAT FOR eNB S1_MME !\n" ); - } - } - } + /* + in_addr_t ipv4_address; -// PROTO_AGENT configuration - subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_FLEXSPLIT_INTERFACES_CONFIG); - //LOG_I(PROTO_AGENT, "HERE\n"); - if (subsetting != NULL) { - if ( ( - config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_DU_INTERFACE_NAME_FOR_F1U, - (const char **)&du_interface_name_for_F1U) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_DU_IPV4_ADDRESS_FOR_F1U, - (const char **)&du_ipv4_address_for_F1U) - && config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_DU_PORT_FOR_F1U, - &du_port_for_F1U) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_CU_INTERFACE_NAME_FOR_F1U, - (const char **)&cu_interface_name_for_F1U) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_CU_IPV4_ADDRESS_FOR_F1U, - (const char **)&cu_ipv4_address_for_F1U) - && config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_CU_PORT_FOR_F1U, - &cu_port_for_F1U) - && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_F1_U_TRANSPORT_TYPE, - (const char **)&transport_type_F1U) - ) - ) { - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.du_interface = strdup(du_interface_name_for_F1U); - cidr = du_ipv4_address_for_F1U; - address = strtok(cidr, "/"); - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.du_ipv4_address = strdup(address); - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.du_port = du_port_for_F1U; + if (address) { + IPV4_STR_ADDR_TO_INT_NWBO ( address, ipv4_address, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" ); + } + strcpy(S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4_address, inet_ntoa(ipv4_address)); + // S1AP_REGISTER_ENB_REQ (msg_p).enb_port_for_S1U = enb_port_for_S1U; - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.cu_interface = strdup(cu_interface_name_for_F1U); - cidr = cu_ipv4_address_for_F1U; - address = strtok(cidr, "/"); - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.cu_ipv4_address = strdup(address); - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.cu_port = cu_port_for_F1U; - - if (strcmp(transport_type_F1U, "UDP") == 0) - { - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.udp = 1; - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.tcp = 0; - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.sctp = 0; - } - else if (strcmp(transport_type_F1U, "TCP") == 0) - { - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.udp = 0; - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.tcp = 1; - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.sctp = 0; - } - - else if (strcmp(transport_type_F1U, "SCTP") == 0) - { - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.udp = 0; - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.tcp = 0; - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.sctp = 1; - } - else - { - // Will be handled by the proto agent functionality - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.udp = 0; - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.tcp = 0; - enb_properties.properties[enb_properties_index]->flexsplit_interfaces.sctp = 0; - } - - } - } + + S1AP_REGISTER_ENB_REQ (msg_p).enb_interface_name_for_S1_MME = strdup(enb_interface_name_for_S1_MME); + cidr = enb_ipv4_address_for_S1_MME; + address = strtok(cidr, "/"); + + if (address) { + IPV4_STR_ADDR_TO_INT_NWBO ( address, S1AP_REGISTER_ENB_REQ(msg_p).enb_ipv4_address_for_S1_MME, "BAD IP ADDRESS FORMAT FOR eNB S1_MME !\n" ); + } +*/ + - - // OTG _CONFIG - setting_otg = config_setting_get_member (setting_enb, ENB_CONF_STRING_OTG_CONFIG); - - if (setting_otg != NULL) { - num_otg_elements = config_setting_length(setting_otg); - printf("num otg elements %d \n", num_otg_elements); - enb_properties.properties[enb_properties_index]->num_otg_elements = 0; - - for (j = 0; j < num_otg_elements; j++) { - subsetting_otg=config_setting_get_elem(setting_otg, j); - - if (config_setting_lookup_int(subsetting_otg, ENB_CONF_STRING_OTG_UE_ID, &otg_ue_id)) { - enb_properties.properties[enb_properties_index]->otg_ue_id[j] = otg_ue_id; - } else { - enb_properties.properties[enb_properties_index]->otg_ue_id[j] = 1; - } - - if (config_setting_lookup_string(subsetting_otg, ENB_CONF_STRING_OTG_APP_TYPE, (const char **)&otg_app_type)) { - if ((enb_properties.properties[enb_properties_index]->otg_app_type[j] = map_str_to_int(otg_app_type_names,otg_app_type))== -1) { - enb_properties.properties[enb_properties_index]->otg_app_type[j] = BCBR; - } - } else { - enb_properties.properties[enb_properties_index]->otg_app_type[j] = NO_PREDEFINED_TRAFFIC; // 0 - } - - if (config_setting_lookup_string(subsetting_otg, ENB_CONF_STRING_OTG_BG_TRAFFIC, (const char **)&otg_bg_traffic)) { - - if ((enb_properties.properties[enb_properties_index]->otg_bg_traffic[j] = map_str_to_int(switch_names,otg_bg_traffic)) == -1) { - enb_properties.properties[enb_properties_index]->otg_bg_traffic[j]=0; - } - } else { - enb_properties.properties[enb_properties_index]->otg_bg_traffic[j] = 0; - printf("otg bg %s\n", otg_bg_traffic); - } - - enb_properties.properties[enb_properties_index]->num_otg_elements+=1; - - } - } - - // log_config - subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_LOG_CONFIG); - - if (subsetting != NULL) { - // global - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GLOBAL_LOG_LEVEL, (const char **) &glog_level)) { - if ((enb_properties.properties[enb_properties_index]->glog_level = map_str_to_int(log_level_names, glog_level)) == -1) { - enb_properties.properties[enb_properties_index]->glog_level = LOG_INFO; - } - - //printf( "\tGlobal log level :\t%s->%d\n",glog_level, enb_properties.properties[enb_properties_index]->glog_level); - } else { - enb_properties.properties[enb_properties_index]->glog_level = LOG_INFO; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GLOBAL_LOG_VERBOSITY,(const char **) &glog_verbosity)) { - if ((enb_properties.properties[enb_properties_index]->glog_verbosity = map_str_to_int(log_verbosity_names, glog_verbosity)) == -1) { - enb_properties.properties[enb_properties_index]->glog_verbosity = LOG_MED; - } - - //printf( "\tGlobal log verbosity:\t%s->%d\n",glog_verbosity, enb_properties.properties[enb_properties_index]->glog_verbosity); - } else { - enb_properties.properties[enb_properties_index]->glog_verbosity = LOG_MED; - } - - // HW - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_HW_LOG_LEVEL, (const char **) &hw_log_level)) { - if ((enb_properties.properties[enb_properties_index]->hw_log_level = map_str_to_int(log_level_names,hw_log_level)) == -1) { - enb_properties.properties[enb_properties_index]->hw_log_level = LOG_INFO; - } - - //printf( "\tHW log level :\t%s->%d\n",hw_log_level,enb_properties.properties[enb_properties_index]->hw_log_level); - } else { - enb_properties.properties[enb_properties_index]->hw_log_level = LOG_INFO; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_HW_LOG_VERBOSITY, (const char **) &hw_log_verbosity)) { - if ((enb_properties.properties[enb_properties_index]->hw_log_verbosity = map_str_to_int(log_verbosity_names,hw_log_verbosity)) == -1) { - enb_properties.properties[enb_properties_index]->hw_log_verbosity = LOG_MED; - } - - //printf( "\tHW log verbosity:\t%s->%d\n",hw_log_verbosity, enb_properties.properties[enb_properties_index]->hw_log_verbosity); - } else { - enb_properties.properties[enb_properties_index]->hw_log_verbosity = LOG_MED; - } - - // phy - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PHY_LOG_LEVEL,(const char **) &phy_log_level)) { - if ((enb_properties.properties[enb_properties_index]->phy_log_level = map_str_to_int(log_level_names,phy_log_level)) == -1) { - enb_properties.properties[enb_properties_index]->phy_log_level = LOG_INFO; - } - - //printf( "\tPHY log level :\t%s->%d\n",phy_log_level,enb_properties.properties[enb_properties_index]->phy_log_level); - } else { - enb_properties.properties[enb_properties_index]->phy_log_level = LOG_INFO; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PHY_LOG_VERBOSITY, (const char **)&phy_log_verbosity)) { - if ((enb_properties.properties[enb_properties_index]->phy_log_verbosity = map_str_to_int(log_verbosity_names,phy_log_verbosity)) == -1) { - enb_properties.properties[enb_properties_index]->phy_log_verbosity = LOG_MED; - } - - //printf( "\tPHY log verbosity:\t%s->%d\n",phy_log_level,enb_properties.properties[enb_properties_index]->phy_log_verbosity); - } else { - enb_properties.properties[enb_properties_index]->phy_log_verbosity = LOG_MED; - } - - //mac - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_MAC_LOG_LEVEL, (const char **)&mac_log_level)) { - if ((enb_properties.properties[enb_properties_index]->mac_log_level = map_str_to_int(log_level_names,mac_log_level)) == -1 ) { - enb_properties.properties[enb_properties_index]->mac_log_level = LOG_INFO; - } - - //printf( "\tMAC log level :\t%s->%d\n",mac_log_level,enb_properties.properties[enb_properties_index]->mac_log_level); - } else { - enb_properties.properties[enb_properties_index]->mac_log_level = LOG_INFO; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_MAC_LOG_VERBOSITY, (const char **)&mac_log_verbosity)) { - if ((enb_properties.properties[enb_properties_index]->mac_log_verbosity = map_str_to_int(log_verbosity_names,mac_log_verbosity)) == -1) { - enb_properties.properties[enb_properties_index]->mac_log_verbosity = LOG_MED; - } - - //printf( "\tMAC log verbosity:\t%s->%d\n",mac_log_verbosity,enb_properties.properties[enb_properties_index]->mac_log_verbosity); - } else { - enb_properties.properties[enb_properties_index]->mac_log_verbosity = LOG_MED; - } - - //rlc - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RLC_LOG_LEVEL, (const char **)&rlc_log_level)) { - if ((enb_properties.properties[enb_properties_index]->rlc_log_level = map_str_to_int(log_level_names,rlc_log_level)) == -1) { - enb_properties.properties[enb_properties_index]->rlc_log_level = LOG_INFO; - } - - //printf( "\tRLC log level :\t%s->%d\n",rlc_log_level, enb_properties.properties[enb_properties_index]->rlc_log_level); - } else { - enb_properties.properties[enb_properties_index]->rlc_log_level = LOG_INFO; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RLC_LOG_VERBOSITY, (const char **)&rlc_log_verbosity)) { - if ((enb_properties.properties[enb_properties_index]->rlc_log_verbosity = map_str_to_int(log_verbosity_names,rlc_log_verbosity)) == -1) { - enb_properties.properties[enb_properties_index]->rlc_log_verbosity = LOG_MED; - } - - //printf( "\tRLC log verbosity:\t%s->%d\n",rlc_log_verbosity, enb_properties.properties[enb_properties_index]->rlc_log_verbosity); - } else { - enb_properties.properties[enb_properties_index]->rlc_log_verbosity = LOG_MED; - } - - //pdcp - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PDCP_LOG_LEVEL, (const char **)&pdcp_log_level)) { - if ((enb_properties.properties[enb_properties_index]->pdcp_log_level = map_str_to_int(log_level_names,pdcp_log_level)) == -1) { - enb_properties.properties[enb_properties_index]->pdcp_log_level = LOG_INFO; - } - - //printf( "\tPDCP log level :\t%s->%d\n",pdcp_log_level, enb_properties.properties[enb_properties_index]->pdcp_log_level); - } else { - enb_properties.properties[enb_properties_index]->pdcp_log_level = LOG_INFO; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PDCP_LOG_VERBOSITY, (const char **)&pdcp_log_verbosity)) { - enb_properties.properties[enb_properties_index]->pdcp_log_verbosity = map_str_to_int(log_verbosity_names,pdcp_log_verbosity); - //printf( "\tPDCP log verbosity:\t%s->%d\n",pdcp_log_verbosity, enb_properties.properties[enb_properties_index]->pdcp_log_verbosity); - } else { - enb_properties.properties[enb_properties_index]->pdcp_log_verbosity = LOG_MED; - } - - //rrc - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RRC_LOG_LEVEL, (const char **)&rrc_log_level)) { - if ((enb_properties.properties[enb_properties_index]->rrc_log_level = map_str_to_int(log_level_names,rrc_log_level)) == -1 ) { - enb_properties.properties[enb_properties_index]->rrc_log_level = LOG_INFO; - } - - //printf( "\tRRC log level :\t%s->%d\n",rrc_log_level,enb_properties.properties[enb_properties_index]->rrc_log_level); - } else { - enb_properties.properties[enb_properties_index]->rrc_log_level = LOG_INFO; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RRC_LOG_VERBOSITY, (const char **)&rrc_log_verbosity)) { - if ((enb_properties.properties[enb_properties_index]->rrc_log_verbosity = map_str_to_int(log_verbosity_names,rrc_log_verbosity)) == -1) { - enb_properties.properties[enb_properties_index]->rrc_log_verbosity = LOG_MED; - } - - //printf( "\tRRC log verbosity:\t%s->%d\n",rrc_log_verbosity,enb_properties.properties[enb_properties_index]->rrc_log_verbosity); - } else { - enb_properties.properties[enb_properties_index]->rrc_log_verbosity = LOG_MED; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GTPU_LOG_LEVEL, (const char **)>pu_log_level)) { - if ((enb_properties.properties[enb_properties_index]->gtpu_log_level = map_str_to_int(log_level_names,gtpu_log_level)) == -1 ) { - enb_properties.properties[enb_properties_index]->gtpu_log_level = LOG_INFO; - } - - //printf( "\tGTPU log level :\t%s->%d\n",gtpu_log_level,enb_properties.properties[enb_properties_index]->gtpu_log_level); - } else { - enb_properties.properties[enb_properties_index]->gtpu_log_level = LOG_INFO; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GTPU_LOG_VERBOSITY, (const char **)>pu_log_verbosity)) { - if ((enb_properties.properties[enb_properties_index]->gtpu_log_verbosity = map_str_to_int(log_verbosity_names,gtpu_log_verbosity)) == -1) { - enb_properties.properties[enb_properties_index]->gtpu_log_verbosity = LOG_MED; - } - - //printf( "\tGTPU log verbosity:\t%s->%d\n",gtpu_log_verbosity,enb_properties.properties[enb_properties_index]->gtpu_log_verbosity); - } else { - enb_properties.properties[enb_properties_index]->gtpu_log_verbosity = LOG_MED; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_UDP_LOG_LEVEL, (const char **)&udp_log_level)) { - if ((enb_properties.properties[enb_properties_index]->udp_log_level = map_str_to_int(log_level_names,udp_log_level)) == -1 ) { - enb_properties.properties[enb_properties_index]->udp_log_level = LOG_INFO; - } - - //printf( "\tUDP log level :\t%s->%d\n",udp_log_level,enb_properties.properties[enb_properties_index]->udp_log_level); - } else { - enb_properties.properties[enb_properties_index]->udp_log_level = LOG_INFO; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_UDP_LOG_VERBOSITY, (const char **)&udp_log_verbosity)) { - if ((enb_properties.properties[enb_properties_index]->udp_log_verbosity = map_str_to_int(log_verbosity_names,udp_log_verbosity)) == -1) { - enb_properties.properties[enb_properties_index]->udp_log_verbosity = LOG_MED; - } - - //printf( "\tUDP log verbosity:\t%s->%d\n",udp_log_verbosity,enb_properties.properties[enb_properties_index]->gtpu_log_verbosity); - } else { - enb_properties.properties[enb_properties_index]->udp_log_verbosity = LOG_MED; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_OSA_LOG_LEVEL, (const char **)&osa_log_level)) { - if ((enb_properties.properties[enb_properties_index]->osa_log_level = map_str_to_int(log_level_names,osa_log_level)) == -1 ) { - enb_properties.properties[enb_properties_index]->osa_log_level = LOG_INFO; - } - - //printf( "\tOSA log level :\t%s->%d\n",osa_log_level,enb_properties.properties[enb_properties_index]->osa_log_level); - } else { - enb_properties.properties[enb_properties_index]->osa_log_level = LOG_INFO; - } - - if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_OSA_LOG_VERBOSITY, (const char **)&osa_log_verbosity)) { - if ((enb_properties.properties[enb_properties_index]->osa_log_verbosity = map_str_to_int(log_verbosity_names,osa_log_verbosity)) == -1) { - enb_properties.properties[enb_properties_index]->osa_log_verbosity = LOG_MED; - } - - //printf( "\tOSA log verbosity:\t%s->%d\n",osa_log_verbosity,enb_properties.properties[enb_properties_index]->gosa_log_verbosity); - } else { - enb_properties.properties[enb_properties_index]->osa_log_verbosity = LOG_MED; - } - - } else { // not configuration is given - enb_properties.properties[enb_properties_index]->glog_level = LOG_INFO; - enb_properties.properties[enb_properties_index]->glog_verbosity = LOG_MED; - enb_properties.properties[enb_properties_index]->hw_log_level = LOG_INFO; - enb_properties.properties[enb_properties_index]->hw_log_verbosity = LOG_MED; - enb_properties.properties[enb_properties_index]->phy_log_level = LOG_INFO; - enb_properties.properties[enb_properties_index]->phy_log_verbosity = LOG_MED; - enb_properties.properties[enb_properties_index]->mac_log_level = LOG_INFO; - enb_properties.properties[enb_properties_index]->mac_log_verbosity = LOG_MED; - enb_properties.properties[enb_properties_index]->rlc_log_level = LOG_INFO; - enb_properties.properties[enb_properties_index]->rlc_log_verbosity = LOG_MED; - enb_properties.properties[enb_properties_index]->pdcp_log_level = LOG_INFO; - enb_properties.properties[enb_properties_index]->pdcp_log_verbosity = LOG_MED; - enb_properties.properties[enb_properties_index]->rrc_log_level = LOG_INFO; - enb_properties.properties[enb_properties_index]->rrc_log_verbosity = LOG_MED; - enb_properties.properties[enb_properties_index]->gtpu_log_level = LOG_INFO; - enb_properties.properties[enb_properties_index]->gtpu_log_verbosity = LOG_MED; - enb_properties.properties[enb_properties_index]->udp_log_level = LOG_INFO; - enb_properties.properties[enb_properties_index]->udp_log_verbosity = LOG_MED; - enb_properties.properties[enb_properties_index]->osa_log_level = LOG_INFO; - enb_properties.properties[enb_properties_index]->osa_log_verbosity = LOG_MED; - } - - enb_properties_index += 1; - break; - } + break; + } + } } } } - - enb_properties.number = num_enb_properties; - - AssertError (enb_properties_index == num_enb_properties, parse_errors ++, - "Failed to parse eNB configuration file %s, mismatch between %u active eNBs and %u corresponding defined eNBs !\n", - lib_config_file_name_pP, num_enb_properties, enb_properties_index); - - AssertFatal (parse_errors == 0, - "Failed to parse eNB configuration file %s, found %d error%s !\n", - lib_config_file_name_pP, parse_errors, parse_errors > 1 ? "s" : ""); - enb_config_display(); - return &enb_properties; - +return 0; } -const Enb_properties_array_t *enb_config_get(void) -{ - return &enb_properties; -} +void RCConfig(void) { + paramlist_def_t MACRLCParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0}; + paramlist_def_t L1ParamList = {CONFIG_STRING_L1_LIST,NULL,0}; + paramlist_def_t RUParamList = {CONFIG_STRING_RU_LIST,NULL,0}; + + paramdef_t ENBSParams[] = ENBSPARAMS_DESC; + paramlist_def_t CCsParamList = {ENB_CONFIG_STRING_COMPONENT_CARRIERS,NULL,0}; + + char aprefix[MAX_OPTNAME_SIZE*2 + 8]; + + RCconfig_cudu(); + +/* get global parameters, defined outside any section in the config file */ + + printf("Getting ENBSParams\n"); + + config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); + RC.nb_inst = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; + + if (RC.nb_inst > 0) { + RC.nb_CC = (int *)malloc((1+RC.nb_inst)*sizeof(int)); + for (int i=0;i. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* enb_config.h @@ -40,17 +32,22 @@ #include #include #include +#include +#include "RRC/LITE/defs.h" #include "commonDef.h" #include "platform_types.h" #include "platform_constants.h" #include "PHY/impl_defs_lte.h" +#include "PHY/defs.h" #include "s1ap_messages_types.h" #ifdef CMAKER #include "SystemInformationBlockType2.h" +#include "rrc_messages_types.h" #else #include "RRC/LITE/MESSAGES/SystemInformationBlockType2.h" #endif +#include "intertask_interface_types.h" #define IPV4_STR_ADDR_TO_INT_NWBO(AdDr_StR,NwBo,MeSsAgE ) do {\ struct in_addr inp;\ @@ -69,6 +66,9 @@ // Hard to find a defined value for max enb... #define MAX_ENB 16 +#define MAX_DU 4 +#define CU_BALANCING_ALL 127 +#define CU_BALANCING_ROUND_ROBIN 126 typedef struct mme_ip_address_s { unsigned ipv4:1; @@ -79,214 +79,71 @@ typedef struct mme_ip_address_s { } mme_ip_address_t; -typedef struct flexplit_interfaces { + + +typedef struct du_interfaces { char *du_interface; char *du_ipv4_address; uint16_t du_port; - - char *cu_interface; - char *cu_ipv4_address; - uint16_t cu_port; + unsigned tcp:1; unsigned udp:1; unsigned sctp:1; -}flexsplit_interfaces_t; +}du_interfaces_t; -typedef struct rrh_gw_config_s { +typedef struct cu_interfaces { + char *cu_interface; + char *cu_ipv4_address; + uint16_t cu_port; + uint8_t du_type; + uint8_t cu_id; + + unsigned tcp:1; + unsigned udp:1; + unsigned sctp:1; + +}cu_interfaces_t; + +typedef struct cudu_params_s { + du_interfaces_t local_du; + cu_interfaces_t cu[MAX_DU]; + uint8_t serving_dus; + uint8_t cu_balancing; +}cudu_params_t; + +typedef struct ru_config_s { + // indicates if local or remote rf is used (1 == LOCAL) + unsigned local_rf:1; + // indicates if UDP socket is used unsigned udp:1; + // indicates if RAW socket is used unsigned raw:1; - unsigned active:1; + char *ru_if_name; char *local_address; char *remote_address; uint16_t local_port; uint16_t remote_port; - int tx_scheduling_advance; - int tx_sample_advance; - int iq_txshift; - unsigned exmimo:1; - unsigned usrp_b200:1; - unsigned usrp_x300:1; - unsigned bladerf:1; - unsigned lmssdr:1; -} rrh_gw_config_t; + uint8_t udpif4p5; + uint8_t rawif4p5; + uint8_t rawif5_mobipass; + uint8_t if_compress; +} ru_config_t; -typedef struct Enb_properties_s { - /* Unique eNB_id to identify the eNB within EPC. - * For macro eNB ids this field should be 20 bits long. - * For home eNB ids this field should be 28 bits long. - */ - uint32_t eNB_id; - - /* The type of the cell */ - enum cell_type_e cell_type; - - /* Optional name for the cell - * NOTE: the name can be NULL (i.e no name) and will be cropped to 150 - * characters. - */ - char *eNB_name; - - /* Tracking area code */ - uint16_t tac; - - /* Mobile Country Code - * Mobile Network Code - */ - uint16_t mcc; - uint16_t mnc; - uint8_t mnc_digit_length; - - - - /* Physical parameters */ - int16_t nb_cc; - lte_frame_type_t frame_type[1+MAX_NUM_CCs]; - uint8_t tdd_config[1+MAX_NUM_CCs]; - uint8_t tdd_config_s[1+MAX_NUM_CCs]; - lte_prefix_type_t prefix_type[1+MAX_NUM_CCs]; - int16_t eutra_band[1+MAX_NUM_CCs]; - uint64_t downlink_frequency[1+MAX_NUM_CCs]; - int32_t uplink_frequency_offset[1+MAX_NUM_CCs]; - - int16_t Nid_cell[1+MAX_NUM_CCs];// for testing, change later - int16_t N_RB_DL[1+MAX_NUM_CCs];// for testing, change later - int nb_antennas_tx[1+MAX_NUM_CCs]; - int nb_antennas_rx[1+MAX_NUM_CCs]; - int tx_gain[1+MAX_NUM_CCs]; - int rx_gain[1+MAX_NUM_CCs]; - long prach_root[1+MAX_NUM_CCs]; - long prach_config_index[1+MAX_NUM_CCs]; - BOOLEAN_t prach_high_speed[1+MAX_NUM_CCs]; - long prach_zero_correlation[1+MAX_NUM_CCs]; - long prach_freq_offset[1+MAX_NUM_CCs]; - long pucch_delta_shift[1+MAX_NUM_CCs]; - long pucch_nRB_CQI[1+MAX_NUM_CCs]; - long pucch_nCS_AN[1+MAX_NUM_CCs]; -#ifndef Rel10 - long pucch_n1_AN[1+MAX_NUM_CCs]; -#endif - long pdsch_referenceSignalPower[1+MAX_NUM_CCs]; - long pdsch_p_b[1+MAX_NUM_CCs]; - long pusch_n_SB[1+MAX_NUM_CCs]; - long pusch_hoppingMode[1+MAX_NUM_CCs]; - long pusch_hoppingOffset[1+MAX_NUM_CCs]; - BOOLEAN_t pusch_enable64QAM[1+MAX_NUM_CCs]; - BOOLEAN_t pusch_groupHoppingEnabled[1+MAX_NUM_CCs]; - long pusch_groupAssignment[1+MAX_NUM_CCs]; - BOOLEAN_t pusch_sequenceHoppingEnabled[1+MAX_NUM_CCs]; - long pusch_nDMRS1[1+MAX_NUM_CCs]; - long phich_duration[1+MAX_NUM_CCs]; - long phich_resource[1+MAX_NUM_CCs]; - BOOLEAN_t srs_enable[1+MAX_NUM_CCs]; - long srs_BandwidthConfig[1+MAX_NUM_CCs]; - long srs_SubframeConfig[1+MAX_NUM_CCs]; - BOOLEAN_t srs_ackNackST[1+MAX_NUM_CCs]; - BOOLEAN_t srs_MaxUpPts[1+MAX_NUM_CCs]; - long pusch_p0_Nominal[1+MAX_NUM_CCs]; - long pusch_alpha[1+MAX_NUM_CCs]; - long pucch_p0_Nominal[1+MAX_NUM_CCs]; - long msg3_delta_Preamble[1+MAX_NUM_CCs]; - long ul_CyclicPrefixLength[1+MAX_NUM_CCs]; - e_DeltaFList_PUCCH__deltaF_PUCCH_Format1 pucch_deltaF_Format1[1+MAX_NUM_CCs]; - e_DeltaFList_PUCCH__deltaF_PUCCH_Format1b pucch_deltaF_Format1b[1+MAX_NUM_CCs]; - e_DeltaFList_PUCCH__deltaF_PUCCH_Format2 pucch_deltaF_Format2[1+MAX_NUM_CCs]; - e_DeltaFList_PUCCH__deltaF_PUCCH_Format2a pucch_deltaF_Format2a[1+MAX_NUM_CCs]; - e_DeltaFList_PUCCH__deltaF_PUCCH_Format2b pucch_deltaF_Format2b[1+MAX_NUM_CCs]; - long rach_numberOfRA_Preambles[1+MAX_NUM_CCs]; - BOOLEAN_t rach_preamblesGroupAConfig[1+MAX_NUM_CCs]; - long rach_sizeOfRA_PreamblesGroupA[1+MAX_NUM_CCs]; - long rach_messageSizeGroupA[1+MAX_NUM_CCs]; - e_RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB rach_messagePowerOffsetGroupB[1+MAX_NUM_CCs]; - long rach_powerRampingStep[1+MAX_NUM_CCs]; - long rach_preambleInitialReceivedTargetPower[1+MAX_NUM_CCs]; - long rach_preambleTransMax[1+MAX_NUM_CCs]; - long rach_raResponseWindowSize[1+MAX_NUM_CCs]; - long rach_macContentionResolutionTimer[1+MAX_NUM_CCs]; - long rach_maxHARQ_Msg3Tx[1+MAX_NUM_CCs]; - long bcch_modificationPeriodCoeff[1+MAX_NUM_CCs]; - long pcch_defaultPagingCycle[1+MAX_NUM_CCs]; - long pcch_nB[1+MAX_NUM_CCs]; - long ue_TimersAndConstants_t300[1+MAX_NUM_CCs]; - long ue_TimersAndConstants_t301[1+MAX_NUM_CCs]; - long ue_TimersAndConstants_t310[1+MAX_NUM_CCs]; - long ue_TimersAndConstants_t311[1+MAX_NUM_CCs]; - long ue_TimersAndConstants_n310[1+MAX_NUM_CCs]; - long ue_TimersAndConstants_n311[1+MAX_NUM_CCs]; - - - long srb1_timer_poll_retransmit; - long srb1_timer_reordering; - long srb1_timer_status_prohibit; - long srb1_poll_pdu; - long srb1_poll_byte; - long srb1_max_retx_threshold; - /* Nb of MME to connect to */ - uint8_t nb_mme; - /* List of MME to connect to */ - mme_ip_address_t mme_ip_address[S1AP_MAX_NB_MME_IP_ADDRESS]; - - int sctp_in_streams; - int sctp_out_streams; - - char *enb_interface_name_for_S1U; - in_addr_t enb_ipv4_address_for_S1U; - tcp_udp_port_t enb_port_for_S1U; - - char *enb_interface_name_for_S1_MME; - in_addr_t enb_ipv4_address_for_S1_MME; - - flexsplit_interfaces_t flexsplit_interfaces; - - - - /* Nb of RRH to connect to */ - uint8_t nb_rrh_gw; - char *rrh_gw_if_name; - /* List of MME to connect to */ - rrh_gw_config_t rrh_gw_config[4]; - - // otg config - /* Nb of OTG elements */ - uint8_t num_otg_elements; - /* element config*/ - uint16_t otg_ue_id[NB_MODULES_MAX+1]; - uint8_t otg_app_type[NB_MODULES_MAX+1]; - uint8_t otg_bg_traffic[NB_MODULES_MAX+1]; - // log config - int16_t glog_level; - int16_t glog_verbosity; - int16_t hw_log_level; - int16_t hw_log_verbosity; - int16_t phy_log_level; - int16_t phy_log_verbosity; - int16_t mac_log_level; - int16_t mac_log_verbosity; - int16_t rlc_log_level; - int16_t rlc_log_verbosity; - int16_t pdcp_log_level; - int16_t pdcp_log_verbosity; - int16_t rrc_log_level; - int16_t rrc_log_verbosity; - int16_t gtpu_log_level; - int16_t gtpu_log_verbosity; - int16_t udp_log_level; - int16_t udp_log_verbosity; - int16_t osa_log_level; - int16_t osa_log_verbosity; - -} Enb_properties_t; - -typedef struct Enb_properties_array_s { - int number; - Enb_properties_t *properties[MAX_ENB]; -} Enb_properties_array_t; +extern void RCconfig_RU(void); +extern void RCconfig_L1(void); +extern void RCconfig_macrlc(void); +extern int RCconfig_gtpu(void ); +extern void RCConfig(void); void enb_config_display(void); -const Enb_properties_array_t *enb_config_init(char* lib_config_file_name_pP); +void ru_config_display(void); -const Enb_properties_array_t *enb_config_get(void); +int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc); +int RCconfig_S1(MessageDef *msg_p, uint32_t i); +void RCconfig_cudu(void); +cudu_params_t *get_cudu_config(void); #endif /* ENB_CONFIG_H_ */ /** @} */ diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h new file mode 100755 index 0000000000..a0cec55c5d --- /dev/null +++ b/openair2/ENB_APP/enb_paramdef.h @@ -0,0 +1,747 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file openair2/ENB_APP/enb_paramdef.f + * \brief definition of configuration parameters for all eNodeB modules + * \author Francois TABURET + * \date 2017 + * \version 0.1 + * \company NOKIA BellLabs France + * \email: francois.taburet@nokia-bell-labs.com + * \note + * \warning + */ + +#include "common/config/config_paramdesc.h" + + + + + + + + + +#define ENB_CONFIG_STRING_CC_NODE_FUNCTION "node_function" +#define ENB_CONFIG_STRING_CC_NODE_TIMING "node_timing" +#define ENB_CONFIG_STRING_CC_NODE_SYNCH_REF "node_synch_ref" + + +// OTG config per ENB-UE DL +#define ENB_CONF_STRING_OTG_CONFIG "otg_config" +#define ENB_CONF_STRING_OTG_UE_ID "ue_id" +#define ENB_CONF_STRING_OTG_APP_TYPE "app_type" +#define ENB_CONF_STRING_OTG_BG_TRAFFIC "bg_traffic" + + + + + + +#define KHz (1000UL) +#define MHz (1000 * KHz) + +typedef struct eutra_band_s { + int16_t band; + uint32_t ul_min; + uint32_t ul_max; + uint32_t dl_min; + uint32_t dl_max; + lte_frame_type_t frame_type; +} eutra_band_t; + +static const eutra_band_t eutra_bands[] = { + { 1, 1920 * MHz, 1980 * MHz, 2110 * MHz, 2170 * MHz, FDD}, + { 2, 1850 * MHz, 1910 * MHz, 1930 * MHz, 1990 * MHz, FDD}, + { 3, 1710 * MHz, 1785 * MHz, 1805 * MHz, 1880 * MHz, FDD}, + { 4, 1710 * MHz, 1755 * MHz, 2110 * MHz, 2155 * MHz, FDD}, + { 5, 824 * MHz, 849 * MHz, 869 * MHz, 894 * MHz, FDD}, + { 6, 830 * MHz, 840 * MHz, 875 * MHz, 885 * MHz, FDD}, + { 7, 2500 * MHz, 2570 * MHz, 2620 * MHz, 2690 * MHz, FDD}, + { 8, 880 * MHz, 915 * MHz, 925 * MHz, 960 * MHz, FDD}, + { 9, 1749900 * KHz, 1784900 * KHz, 1844900 * KHz, 1879900 * KHz, FDD}, + {10, 1710 * MHz, 1770 * MHz, 2110 * MHz, 2170 * MHz, FDD}, + {11, 1427900 * KHz, 1452900 * KHz, 1475900 * KHz, 1500900 * KHz, FDD}, + {12, 698 * MHz, 716 * MHz, 728 * MHz, 746 * MHz, FDD}, + {13, 777 * MHz, 787 * MHz, 746 * MHz, 756 * MHz, FDD}, + {14, 788 * MHz, 798 * MHz, 758 * MHz, 768 * MHz, FDD}, + + {17, 704 * MHz, 716 * MHz, 734 * MHz, 746 * MHz, FDD}, + {20, 832 * MHz, 862 * MHz, 791 * MHz, 821 * MHz, FDD}, + {33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD}, + {33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD}, + {34, 2010 * MHz, 2025 * MHz, 2010 * MHz, 2025 * MHz, TDD}, + {35, 1850 * MHz, 1910 * MHz, 1850 * MHz, 1910 * MHz, TDD}, + {36, 1930 * MHz, 1990 * MHz, 1930 * MHz, 1990 * MHz, TDD}, + {37, 1910 * MHz, 1930 * MHz, 1910 * MHz, 1930 * MHz, TDD}, + {38, 2570 * MHz, 2620 * MHz, 2570 * MHz, 2630 * MHz, TDD}, + {39, 1880 * MHz, 1920 * MHz, 1880 * MHz, 1920 * MHz, TDD}, + {40, 2300 * MHz, 2400 * MHz, 2300 * MHz, 2400 * MHz, TDD}, + {41, 2496 * MHz, 2690 * MHz, 2496 * MHz, 2690 * MHz, TDD}, + {42, 3400 * MHz, 3600 * MHz, 3400 * MHz, 3600 * MHz, TDD}, + {43, 3600 * MHz, 3800 * MHz, 3600 * MHz, 3800 * MHz, TDD}, + {44, 703 * MHz, 803 * MHz, 703 * MHz, 803 * MHz, TDD}, +}; + + + + + + +#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) +extern int asn_debug; +extern int asn1_xer_print; +#endif + +#ifdef LIBCONFIG_LONG +#define libconfig_int long +#else +#define libconfig_int int +#endif + +typedef enum { + RU = 0, + L1 = 1, + L2 = 2, + L3 = 3, + S1 = 4, + lastel = 5 +} RC_config_functions_t; + + +#define CONFIG_STRING_ACTIVE_RUS "Active_RUs" +/*------------------------------------------------------------------------------------------------------------------------------------------*/ +/* RUs configuration section name */ +#define CONFIG_STRING_RU_LIST "RUs" +#define CONFIG_STRING_RU_CONFIG "ru_config" + +/* RUs configuration parameters name */ +#define CONFIG_STRING_RU_LOCAL_IF_NAME "local_if_name" +#define CONFIG_STRING_RU_LOCAL_ADDRESS "local_address" +#define CONFIG_STRING_RU_REMOTE_ADDRESS "remote_address" +#define CONFIG_STRING_RU_LOCAL_PORTC "local_portc" +#define CONFIG_STRING_RU_REMOTE_PORTC "remote_portc" +#define CONFIG_STRING_RU_LOCAL_PORTD "local_portd" +#define CONFIG_STRING_RU_REMOTE_PORTD "remote_portd" +#define CONFIG_STRING_RU_LOCAL_RF "local_rf" +#define CONFIG_STRING_RU_TRANSPORT_PREFERENCE "tr_preference" +#define CONFIG_STRING_RU_BAND_LIST "bands" +#define CONFIG_STRING_RU_ENB_LIST "eNB_instances" +#define CONFIG_STRING_RU_NB_TX "nb_tx" +#define CONFIG_STRING_RU_NB_RX "nb_rx" +#define CONFIG_STRING_RU_ATT_TX "att_tx" +#define CONFIG_STRING_RU_ATT_RX "att_rx" +#define CONFIG_STRING_RU_MAX_RS_EPRE "max_pdschReferenceSignalPower" +#define CONFIG_STRING_RU_MAX_RXGAIN "max_rxgain" +#define CONFIG_STRING_RU_IF_COMPRESSION "if_compression" + + +#define RU_LOCAL_IF_NAME_IDX 0 +#define RU_LOCAL_ADDRESS_IDX 1 +#define RU_REMOTE_ADDRESS_IDX 2 +#define RU_LOCAL_PORTC_IDX 3 +#define RU_REMOTE_PORTC_IDX 4 +#define RU_LOCAL_PORTD_IDX 5 +#define RU_REMOTE_PORTD_IDX 6 +#define RU_TRANSPORT_PREFERENCE_IDX 7 +#define RU_LOCAL_RF_IDX 8 +#define RU_NB_TX_IDX 9 +#define RU_NB_RX_IDX 10 +#define RU_MAX_RS_EPRE_IDX 11 +#define RU_MAX_RXGAIN_IDX 12 +#define RU_BAND_LIST_IDX 13 +#define RU_ENB_LIST_IDX 14 +#define RU_ATT_TX_IDX 15 +#define RU_ATT_RX_IDX 16 + + + + +static int DEFBANDS[] = {7}; +static int DEFENBS[] = {0}; + + +/*-----------------------------------------------------------------------------------------------------------------------------------------*/ +/* RU configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*-----------------------------------------------------------------------------------------------------------------------------------------*/ +#define RUPARAMS_DESC { \ +{CONFIG_STRING_RU_LOCAL_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \ +{CONFIG_STRING_RU_LOCAL_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.2", TYPE_STRING, 0}, \ +{CONFIG_STRING_RU_REMOTE_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \ +{CONFIG_STRING_RU_LOCAL_PORTC, NULL, 0, uptr:NULL, defuintval:50000, TYPE_UINT, 0}, \ +{CONFIG_STRING_RU_REMOTE_PORTC, NULL, 0, uptr:NULL, defuintval:50000, TYPE_UINT, 0}, \ +{CONFIG_STRING_RU_LOCAL_PORTD, NULL, 0, uptr:NULL, defuintval:50001, TYPE_UINT, 0}, \ +{CONFIG_STRING_RU_REMOTE_PORTD, NULL, 0, uptr:NULL, defuintval:50001, TYPE_UINT, 0}, \ +{CONFIG_STRING_RU_TRANSPORT_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"udp_if5", TYPE_STRING, 0}, \ +{CONFIG_STRING_RU_LOCAL_RF, NULL, 0, strptr:NULL, defstrval:"yes", TYPE_STRING, 0}, \ +{CONFIG_STRING_RU_NB_TX, NULL, 0, uptr:NULL, defuintval:1, TYPE_UINT, 0}, \ +{CONFIG_STRING_RU_NB_RX, NULL, 0, uptr:NULL, defuintval:1, TYPE_UINT, 0}, \ +{CONFIG_STRING_RU_MAX_RS_EPRE, NULL, 0, iptr:NULL, defintval:-29, TYPE_INT, 0}, \ +{CONFIG_STRING_RU_MAX_RXGAIN, NULL, 0, iptr:NULL, defintval:120, TYPE_INT, 0}, \ +{CONFIG_STRING_RU_BAND_LIST, NULL, 0, uptr:NULL, defintarrayval:DEFBANDS, TYPE_INTARRAY, 1}, \ +{CONFIG_STRING_RU_ENB_LIST, NULL, 0, uptr:NULL, defintarrayval:DEFENBS, TYPE_INTARRAY, 1}, \ +{CONFIG_STRING_RU_ATT_TX, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ +{CONFIG_STRING_RU_ATT_RX, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0} \ +} + +/*---------------------------------------------------------------------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------------------------------------------------------------------*/ +/* value definitions for ASN1 verbosity parameter */ +#define ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE "none" +#define ENB_CONFIG_STRING_ASN1_VERBOSITY_ANNOYING "annoying" +#define ENB_CONFIG_STRING_ASN1_VERBOSITY_INFO "info" + + +/* global parameters, not under a specific section */ +#define ENB_CONFIG_STRING_ASN1_VERBOSITY "Asn1_verbosity" +#define ENB_CONFIG_STRING_ACTIVE_ENBS "Active_eNBs" +/*--------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* global configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*--------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define ENBSPARAMS_DESC { \ +{ENB_CONFIG_STRING_ASN1_VERBOSITY, NULL, 0, uptr:NULL, defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_ACTIVE_ENBS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRINGLIST, 0} \ +} +#define ENB_ASN1_VERBOSITY_IDX 0 +#define ENB_ACTIVE_ENBS_IDX 1 + + +/* +{ENB_CONFIG_STRING_COMPONENT_CARRIERS,"", "", 0, uptr:NULL,defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE,TYPE_STRING,0}, \ +{ENB_CONFIG_STRING_CC_NODE_FUNCTION,"", "", 0, uptr:NULL,defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE,TYPE_STRING,0}, \ +{ENB_CONFIG_STRING_CC_NODE_TIMING,"", "", 0, uptr:NULL,defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE,TYPE_STRING,0}, \ +{ENB_CONFIG_STRING_CC_NODE_SYNCH_REF,"", "", 0, uptr:NULL,defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE,TYPE_STRING,0}, \ +*/ + + + +/*------------------------------------------------------------------------------------------------------------------------------------------*/ +/*------------------------------------------------------------------------------------------------------------------------------------------*/ +/* cell configuration section name */ +#define ENB_CONFIG_STRING_ENB_LIST "eNBs" + +/* cell configuration parameters names */ +#define ENB_CONFIG_STRING_ENB_ID "eNB_ID" +#define ENB_CONFIG_STRING_CELL_TYPE "cell_type" +#define ENB_CONFIG_STRING_ENB_NAME "eNB_name" +#define ENB_CONFIG_STRING_TRACKING_AREA_CODE "tracking_area_code" +#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE "mobile_country_code" +#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE "mobile_network_code" +#define ENB_CONFIG_STRING_TRANSPORT_S_PREFERENCE "tr_s_preference" +#define ENB_CONFIG_STRING_LOCAL_S_IF_NAME "local_s_if_name" +#define ENB_CONFIG_STRING_LOCAL_S_ADDRESS "local_s_address" +#define ENB_CONFIG_STRING_REMOTE_S_ADDRESS "remote_s_address" +#define ENB_CONFIG_STRING_LOCAL_S_PORTC "local_s_portc" +#define ENB_CONFIG_STRING_REMOTE_S_PORTC "remote_s_portc" +#define ENB_CONFIG_STRING_LOCAL_S_PORTD "local_s_portd" +#define ENB_CONFIG_STRING_REMOTE_S_PORTD "remote_s_portd" + +/*-----------------------------------------------------------------------------------------------------------------------------------------*/ +/* cell configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*-----------------------------------------------------------------------------------------------------------------------------------------*/ +#define ENBPARAMS_DESC {\ +{ENB_CONFIG_STRING_ENB_ID, NULL, 0, uptr:NULL, defintval:0, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_CELL_TYPE, NULL, 0, strptr:NULL, defstrval:"CELL_MACRO_ENB", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_ENB_NAME, NULL, 0, strptr:NULL, defstrval:"OAIeNodeB", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_TRACKING_AREA_CODE, NULL, 0, strptr:NULL, defstrval:"0", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE, NULL, 0, strptr:NULL, defstrval:"0", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_MOBILE_NETWORK_CODE, NULL, 0, strptr:NULL, defstrval:"0", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_TRANSPORT_S_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_mac", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_LOCAL_S_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_LOCAL_S_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_REMOTE_S_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.2", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_LOCAL_S_PORTC, NULL, 0, uptr:NULL, defuintval:50000, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_REMOTE_S_PORTC, NULL, 0, uptr:NULL, defuintval:50000, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_LOCAL_S_PORTD, NULL, 0, uptr:NULL, defuintval:50001, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_REMOTE_S_PORTD, NULL, 0, uptr:NULL, defuintval:50001, TYPE_UINT, 0}, \ +} +#define ENB_ENB_ID_IDX 0 +#define ENB_CELL_TYPE_IDX 1 +#define ENB_ENB_NAME_IDX 2 +#define ENB_TRACKING_AREA_CODE_IDX 3 +#define ENB_MOBILE_COUNTRY_CODE_IDX 4 +#define ENB_MOBILE_NETWORK_CODE_IDX 5 +#define ENB_TRANSPORT_S_PREFERENCE_IDX 6 +#define ENB_LOCAL_S_IF_NAME_IDX 7 +#define ENB_LOCAL_S_ADDRESS_IDX 8 +#define ENB_REMOTE_S_ADDRESS_IDX 9 +#define ENB_LOCAL_S_PORTC_IDX 10 +#define ENB_REMOTE_S_PORTC_IDX 11 +#define ENB_LOCAL_S_PORTD_IDX 12 +#define ENB_REMOTE_S_PORTD_IDX 13 +/*-------------------------------------------------------------------------------------------------------------------------------------------------*/ +/*-------------------------------------------------------------------------------------------------------------------------------------------------*/ + +/* component carriers configuration section name */ +#define ENB_CONFIG_STRING_COMPONENT_CARRIERS "component_carriers" + +/* component carries configuration parameters name */ +#define ENB_CONFIG_STRING_FRAME_TYPE "frame_type" +#define ENB_CONFIG_STRING_PBCH_REPETITION "pbch_repetition" +#define ENB_CONFIG_STRING_TDD_CONFIG "tdd_config" +#define ENB_CONFIG_STRING_TDD_CONFIG_S "tdd_config_s" +#define ENB_CONFIG_STRING_PREFIX_TYPE "prefix_type" +#define ENB_CONFIG_STRING_EUTRA_BAND "eutra_band" +#define ENB_CONFIG_STRING_DOWNLINK_FREQUENCY "downlink_frequency" +#define ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET "uplink_frequency_offset" +#define ENB_CONFIG_STRING_NID_CELL "Nid_cell" +#define ENB_CONFIG_STRING_N_RB_DL "N_RB_DL" +#define ENB_CONFIG_STRING_CELL_MBSFN "Nid_cell_mbsfn" +#define ENB_CONFIG_STRING_NB_ANT_PORTS "nb_antenna_ports" +#define ENB_CONFIG_STRING_NB_ANT_TX "nb_antennas_tx" +#define ENB_CONFIG_STRING_NB_ANT_RX "nb_antennas_rx" +#define ENB_CONFIG_STRING_TX_GAIN "tx_gain" +#define ENB_CONFIG_STRING_RX_GAIN "rx_gain" +#define ENB_CONFIG_STRING_PRACH_ROOT "prach_root" +#define ENB_CONFIG_STRING_PRACH_CONFIG_INDEX "prach_config_index" +#define ENB_CONFIG_STRING_PRACH_HIGH_SPEED "prach_high_speed" +#define ENB_CONFIG_STRING_PRACH_ZERO_CORRELATION "prach_zero_correlation" +#define ENB_CONFIG_STRING_PRACH_FREQ_OFFSET "prach_freq_offset" +#define ENB_CONFIG_STRING_PUCCH_DELTA_SHIFT "pucch_delta_shift" +#define ENB_CONFIG_STRING_PUCCH_NRB_CQI "pucch_nRB_CQI" +#define ENB_CONFIG_STRING_PUCCH_NCS_AN "pucch_nCS_AN" +//#if !defined(Rel10) && !defined(Rel14) +#define ENB_CONFIG_STRING_PUCCH_N1_AN "pucch_n1_AN" +//#endif +#define ENB_CONFIG_STRING_PDSCH_RS_EPRE "pdsch_referenceSignalPower" +#define ENB_CONFIG_STRING_PDSCH_PB "pdsch_p_b" +#define ENB_CONFIG_STRING_PUSCH_N_SB "pusch_n_SB" +#define ENB_CONFIG_STRING_PUSCH_HOPPINGMODE "pusch_hoppingMode" +#define ENB_CONFIG_STRING_PUSCH_HOPPINGOFFSET "pusch_hoppingOffset" +#define ENB_CONFIG_STRING_PUSCH_ENABLE64QAM "pusch_enable64QAM" +#define ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN "pusch_groupHoppingEnabled" +#define ENB_CONFIG_STRING_PUSCH_GROUP_ASSIGNMENT "pusch_groupAssignment" +#define ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN "pusch_sequenceHoppingEnabled" +#define ENB_CONFIG_STRING_PUSCH_NDMRS1 "pusch_nDMRS1" +#define ENB_CONFIG_STRING_PHICH_DURATION "phich_duration" +#define ENB_CONFIG_STRING_PHICH_RESOURCE "phich_resource" +#define ENB_CONFIG_STRING_SRS_ENABLE "srs_enable" +#define ENB_CONFIG_STRING_SRS_BANDWIDTH_CONFIG "srs_BandwidthConfig" +#define ENB_CONFIG_STRING_SRS_SUBFRAME_CONFIG "srs_SubframeConfig" +#define ENB_CONFIG_STRING_SRS_ACKNACKST_CONFIG "srs_ackNackST" +#define ENB_CONFIG_STRING_SRS_MAXUPPTS "srs_MaxUpPts" +#define ENB_CONFIG_STRING_PUSCH_PO_NOMINAL "pusch_p0_Nominal" +#define ENB_CONFIG_STRING_PUSCH_ALPHA "pusch_alpha" +#define ENB_CONFIG_STRING_PUCCH_PO_NOMINAL "pucch_p0_Nominal" +#define ENB_CONFIG_STRING_MSG3_DELTA_PREAMBLE "msg3_delta_Preamble" +#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1 "pucch_deltaF_Format1" +#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1b "pucch_deltaF_Format1b" +#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2 "pucch_deltaF_Format2" +#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2A "pucch_deltaF_Format2a" +#define ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2B "pucch_deltaF_Format2b" +#define ENB_CONFIG_STRING_RACH_NUM_RA_PREAMBLES "rach_numberOfRA_Preambles" +#define ENB_CONFIG_STRING_RACH_PREAMBLESGROUPACONFIG "rach_preamblesGroupAConfig" +#define ENB_CONFIG_STRING_RACH_SIZEOFRA_PREAMBLESGROUPA "rach_sizeOfRA_PreamblesGroupA" +#define ENB_CONFIG_STRING_RACH_MESSAGESIZEGROUPA "rach_messageSizeGroupA" +#define ENB_CONFIG_STRING_RACH_MESSAGEPOWEROFFSETGROUPB "rach_messagePowerOffsetGroupB" +#define ENB_CONFIG_STRING_RACH_POWERRAMPINGSTEP "rach_powerRampingStep" +#define ENB_CONFIG_STRING_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER "rach_preambleInitialReceivedTargetPower" +#define ENB_CONFIG_STRING_RACH_PREAMBLETRANSMAX "rach_preambleTransMax" +#define ENB_CONFIG_STRING_RACH_RARESPONSEWINDOWSIZE "rach_raResponseWindowSize" +#define ENB_CONFIG_STRING_RACH_MACCONTENTIONRESOLUTIONTIMER "rach_macContentionResolutionTimer" +#define ENB_CONFIG_STRING_RACH_MAXHARQMSG3TX "rach_maxHARQ_Msg3Tx" +#define ENB_CONFIG_STRING_PCCH_DEFAULT_PAGING_CYCLE "pcch_default_PagingCycle" +#define ENB_CONFIG_STRING_PCCH_NB "pcch_nB" +#define ENB_CONFIG_STRING_BCCH_MODIFICATIONPERIODCOEFF "bcch_modificationPeriodCoeff" +#define ENB_CONFIG_STRING_UETIMERS_T300 "ue_TimersAndConstants_t300" +#define ENB_CONFIG_STRING_UETIMERS_T301 "ue_TimersAndConstants_t301" +#define ENB_CONFIG_STRING_UETIMERS_T310 "ue_TimersAndConstants_t310" +#define ENB_CONFIG_STRING_UETIMERS_T311 "ue_TimersAndConstants_t311" +#define ENB_CONFIG_STRING_UETIMERS_N310 "ue_TimersAndConstants_n310" +#define ENB_CONFIG_STRING_UETIMERS_N311 "ue_TimersAndConstants_n311" +#define ENB_CONFIG_STRING_UE_TRANSMISSION_MODE "ue_TransmissionMode" + +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* component carriers configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define CCPARAMS_DESC { \ +{ENB_CONFIG_STRING_FRAME_TYPE, NULL, 0, strptr:&frame_type, defstrval:"FDD", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_TDD_CONFIG, NULL, 0, iptr:&tdd_config, defintval:3, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_TDD_CONFIG_S, NULL, 0, iptr:&tdd_config_s, defintval:0, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PREFIX_TYPE, NULL, 0, strptr:&prefix_type, defstrval:"NORMAL", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PBCH_REPETITION, NULL, 0, strptr:&pbch_repetition, defstrval:"FALSE", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_EUTRA_BAND, NULL, 0, iptr:&eutra_band, defintval:7, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_DOWNLINK_FREQUENCY, NULL, 0, i64ptr:(int64_t *)&downlink_frequency, defint64val:2680000000, TYPE_UINT64, 0}, \ +{ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET, NULL, 0, iptr:&uplink_frequency_offset, defintval:-120000000, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_NID_CELL, NULL, 0, iptr:&Nid_cell, defintval:0, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_N_RB_DL, NULL, 0, iptr:&N_RB_DL, defintval:25, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_CELL_MBSFN, NULL, 0, iptr:&Nid_cell_mbsfn, defintval:0, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_NB_ANT_PORTS, NULL, 0, iptr:&nb_antenna_ports, defintval:1, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PRACH_ROOT, NULL, 0, iptr:&prach_root, defintval:0, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PRACH_CONFIG_INDEX, NULL, 0, iptr:&prach_config_index, defintval:0, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_PRACH_HIGH_SPEED, NULL, 0, strptr:&prach_high_speed, defstrval:"DISABLE", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PRACH_ZERO_CORRELATION, NULL, 0, iptr:&prach_zero_correlation, defintval:1, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PRACH_FREQ_OFFSET, NULL, 0, iptr:&prach_freq_offset, defintval:2, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PUCCH_DELTA_SHIFT, NULL, 0, iptr:&pucch_delta_shift, defintval:1, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PUCCH_NRB_CQI, NULL, 0, iptr:&pucch_nRB_CQI, defintval:1, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PUCCH_NCS_AN, NULL, 0, iptr:&pucch_nCS_AN, defintval:0, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PUCCH_N1_AN, NULL, 0, iptr:&pucch_n1_AN, defintval:32, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PDSCH_RS_EPRE, NULL, 0, iptr:&pdsch_referenceSignalPower, defintval:-29, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_PDSCH_PB, NULL, 0, iptr:&pdsch_p_b, defintval:0, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_PUSCH_N_SB, NULL, 0, iptr:&pusch_n_SB, defintval:1, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_PUSCH_HOPPINGMODE, NULL, 0, strptr:&pusch_hoppingMode, defstrval:"interSubFrame", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PUSCH_HOPPINGOFFSET, NULL, 0, iptr:&pusch_hoppingOffset, defintval:0, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PUSCH_ENABLE64QAM, NULL, 0, strptr:&pusch_enable64QAM, defstrval:"DISABLE", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN, NULL, 0, strptr:&pusch_groupHoppingEnabled, defstrval:"ENABLE", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PUSCH_GROUP_ASSIGNMENT, NULL, 0, iptr:&pusch_groupAssignment, defintval:0, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN, NULL, 0, strptr:&pusch_sequenceHoppingEnabled, defstrval:"DISABLE", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PUSCH_NDMRS1, NULL, 0, iptr:&pusch_nDMRS1, defintval:0, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PHICH_DURATION, NULL, 0, strptr:&phich_duration, defstrval:"NORMAL", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PHICH_RESOURCE, NULL, 0, strptr:&phich_resource, defstrval:"ONESIXTH", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_SRS_ENABLE, NULL, 0, strptr:&srs_enable, defstrval:"DISABLE", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_SRS_BANDWIDTH_CONFIG, NULL, 0, iptr:&srs_BandwidthConfig, defintval:0, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_SRS_SUBFRAME_CONFIG, NULL, 0, iptr:&srs_SubframeConfig, defintval:0, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_SRS_ACKNACKST_CONFIG, NULL, 0, strptr:&srs_ackNackST, defstrval:"DISABLE", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_SRS_MAXUPPTS, NULL, 0, strptr:&srs_MaxUpPts, defstrval:"DISABLE", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PUSCH_PO_NOMINAL, NULL, 0, iptr:&pusch_p0_Nominal, defintval:-90, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_PUSCH_ALPHA, NULL, 0, strptr:&pusch_alpha, defstrval:"AL1", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PUCCH_PO_NOMINAL, NULL, 0, iptr:&pucch_p0_Nominal, defintval:-96, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_MSG3_DELTA_PREAMBLE, NULL, 0, iptr:&msg3_delta_Preamble, defintval:6, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1, NULL, 0, strptr:&pucch_deltaF_Format1, defstrval:"DELTAF2", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT1b, NULL, 0, strptr:&pucch_deltaF_Format1b, defstrval:"deltaF3", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2, NULL, 0, strptr:&pucch_deltaF_Format2, defstrval:"deltaF0", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2A, NULL, 0, strptr:&pucch_deltaF_Format2a, defstrval:"deltaF0", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_PUCCH_DELTAF_FORMAT2B, NULL, 0, strptr:&pucch_deltaF_Format2b, defstrval:"deltaF0", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_RACH_NUM_RA_PREAMBLES, NULL, 0, iptr:&rach_numberOfRA_Preambles, defintval:4, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_RACH_PREAMBLESGROUPACONFIG, NULL, 0, strptr:&rach_preamblesGroupAConfig, defstrval:"DISABLE", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_RACH_SIZEOFRA_PREAMBLESGROUPA, NULL, 0, iptr:&rach_sizeOfRA_PreamblesGroupA, defintval:0, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_RACH_MESSAGESIZEGROUPA, NULL, 0, iptr:&rach_messageSizeGroupA, defintval:56, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_RACH_MESSAGEPOWEROFFSETGROUPB, NULL, 0, strptr:&rach_messagePowerOffsetGroupB, defstrval:"minusinfinity", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_RACH_POWERRAMPINGSTEP, NULL, 0, iptr:&rach_powerRampingStep, defintval:4, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER, NULL, 0, iptr:&rach_preambleInitialReceivedTargetPower, defintval:-100, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_RACH_PREAMBLETRANSMAX, NULL, 0, iptr:&rach_preambleTransMax, defintval:10, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_RACH_RARESPONSEWINDOWSIZE, NULL, 0, iptr:&rach_raResponseWindowSize, defintval:10, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_RACH_MACCONTENTIONRESOLUTIONTIMER, NULL, 0, iptr:&rach_macContentionResolutionTimer, defintval:48, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_RACH_MAXHARQMSG3TX, NULL, 0, iptr:&rach_maxHARQ_Msg3Tx, defintval:4, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_PCCH_DEFAULT_PAGING_CYCLE, NULL, 0, iptr:&pcch_defaultPagingCycle, defintval:128, TYPE_INT, 0}, \ +{ENB_CONFIG_STRING_PCCH_NB, NULL, 0, strptr:&pcch_nB, defstrval:"oneT", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_BCCH_MODIFICATIONPERIODCOEFF, NULL, 0, iptr:&bcch_modificationPeriodCoeff, defintval:2, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_UETIMERS_T300, NULL, 0, iptr:&ue_TimersAndConstants_t300, defintval:1000, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_UETIMERS_T301, NULL, 0, iptr:&ue_TimersAndConstants_t301, defintval:1000, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_UETIMERS_T310, NULL, 0, iptr:&ue_TimersAndConstants_t310, defintval:1000, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_UETIMERS_T311, NULL, 0, iptr:&ue_TimersAndConstants_t311, defintval:10000, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_UETIMERS_N310, NULL, 0, iptr:&ue_TimersAndConstants_n310, defintval:20, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_UETIMERS_N311, NULL, 0, iptr:&ue_TimersAndConstants_n311, defintval:1, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_UE_TRANSMISSION_MODE, NULL, 0, iptr:&ue_TransmissionMode, defintval:1, TYPE_UINT, 0} \ +} + +/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* SRB1 configuration parameters section name */ +#define ENB_CONFIG_STRING_SRB1 "srb1_parameters" + +/* SRB1 configuration parameters names */ +#define ENB_CONFIG_STRING_SRB1_TIMER_POLL_RETRANSMIT "timer_poll_retransmit" +#define ENB_CONFIG_STRING_SRB1_TIMER_REORDERING "timer_reordering" +#define ENB_CONFIG_STRING_SRB1_TIMER_STATUS_PROHIBIT "timer_status_prohibit" +#define ENB_CONFIG_STRING_SRB1_POLL_PDU "poll_pdu" +#define ENB_CONFIG_STRING_SRB1_POLL_BYTE "poll_byte" +#define ENB_CONFIG_STRING_SRB1_MAX_RETX_THRESHOLD "max_retx_threshold" + +/*-----------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* SRB1 configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*-----------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define SRB1PARAMS_DESC { \ +{ENB_CONFIG_STRING_SRB1_TIMER_POLL_RETRANSMIT, NULL, 0, iptr:&srb1_timer_poll_retransmit, defintval:80, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_SRB1_TIMER_REORDERING, NULL, 0, iptr:&srb1_timer_reordering, defintval:35, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_SRB1_TIMER_STATUS_PROHIBIT, NULL, 0, iptr:&srb1_timer_status_prohibit, defintval:0, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_SRB1_POLL_PDU, NULL, 0, iptr:&srb1_poll_pdu, defintval:4, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_SRB1_POLL_BYTE, NULL, 0, iptr:&srb1_poll_byte, defintval:99999, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_SRB1_MAX_RETX_THRESHOLD, NULL, 0, iptr:&srb1_max_retx_threshold, defintval:4, TYPE_UINT, 0} \ +} +/*-----------------------------------------------------------------------------------------------------------------------------------------------------------*/ + +/* MME configuration parameters section name */ +#define ENB_CONFIG_STRING_MME_IP_ADDRESS "mme_ip_address" + +/* SRB1 configuration parameters names */ + + +#define ENB_CONFIG_STRING_MME_IPV4_ADDRESS "ipv4" +#define ENB_CONFIG_STRING_MME_IPV6_ADDRESS "ipv6" +#define ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE "active" +#define ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE "preference" + + +/*-------------------------------------------------------------------------------------------------------------------------------------*/ +/* MME configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*-------------------------------------------------------------------------------------------------------------------------------------*/ +#define S1PARAMS_DESC { \ +{ENB_CONFIG_STRING_MME_IPV4_ADDRESS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_MME_IPV6_ADDRESS, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_MME_IP_ADDRESS_ACTIVE, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_MME_IP_ADDRESS_PREFERENCE, NULL, 0, uptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +} + +#define ENB_MME_IPV4_ADDRESS_IDX 0 +#define ENB_MME_IPV6_ADDRESS_IDX 1 +#define ENB_MME_IP_ADDRESS_ACTIVE_IDX 2 +#define ENB_MME_IP_ADDRESS_PREFERENCE_IDX 3 +/*---------------------------------------------------------------------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------------------------------------------------------------------*/ +/* SCTP configuration parameters section name */ +#define ENB_CONFIG_STRING_SCTP_CONFIG "SCTP" + +/* SCTP configuration parameters names */ +#define ENB_CONFIG_STRING_SCTP_INSTREAMS "SCTP_INSTREAMS" +#define ENB_CONFIG_STRING_SCTP_OUTSTREAMS "SCTP_OUTSTREAMS" + + + +/*-----------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* SRB1 configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*-----------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define SCTPPARAMS_DESC { \ +{ENB_CONFIG_STRING_SCTP_INSTREAMS, NULL, 0, uptr:NULL, defintval:-1, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_SCTP_OUTSTREAMS, NULL, 0, uptr:NULL, defintval:-1, TYPE_UINT, 0} \ +} + +#define ENB_SCTP_INSTREAMS_IDX 0 +#define ENB_SCTP_OUTSTREAMS_IDX 1 +/*-----------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/*-----------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* S1 interface configuration parameters section name */ +#define ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG "NETWORK_INTERFACES" + +#define ENB_INTERFACE_NAME_FOR_S1_MME_IDX 0 +#define ENB_IPV4_ADDRESS_FOR_S1_MME_IDX 1 +#define ENB_INTERFACE_NAME_FOR_S1U_IDX 2 +#define ENB_IPV4_ADDR_FOR_S1U_IDX 3 +#define ENB_PORT_FOR_S1U_IDX 4 + +/* S1 interface configuration parameters names */ +#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME "ENB_INTERFACE_NAME_FOR_S1_MME" +#define ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME "ENB_IPV4_ADDRESS_FOR_S1_MME" +#define ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U "ENB_INTERFACE_NAME_FOR_S1U" +#define ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U "ENB_IPV4_ADDRESS_FOR_S1U" +#define ENB_CONFIG_STRING_ENB_PORT_FOR_S1U "ENB_PORT_FOR_S1U" + +/*--------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* S1 interface configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*--------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define NETPARAMS_DESC { \ +{ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1_MME, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_ENB_IPV4_ADDRESS_FOR_S1_MME, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_ENB_PORT_FOR_S1U, NULL, 0, uptr:NULL, defintval:2152L, TYPE_UINT, 0} \ +} + + + +/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* GTPU configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define GTPUPARAMS_DESC { \ +{ENB_CONFIG_STRING_ENB_INTERFACE_NAME_FOR_S1U, NULL, 0, strptr:&enb_interface_name_for_S1U, defstrval:"lo", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_ENB_IPV4_ADDR_FOR_S1U, NULL, 0, strptr:&enb_ipv4_address_for_S1U, defstrval:"127.0.0.1", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_ENB_PORT_FOR_S1U, NULL, 0, uptr:&enb_port_for_S1U, defintval:2152, TYPE_UINT, 0} \ +} +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ + +/* L1 configuration section names */ +#define CONFIG_STRING_L1_LIST "L1s" +#define CONFIG_STRING_L1_CONFIG "l1_config" + + + +/* L1 configuration parameters names */ +#define CONFIG_STRING_L1_CC "num_cc" +#define CONFIG_STRING_L1_LOCAL_N_IF_NAME "local_n_if_name" +#define CONFIG_STRING_L1_LOCAL_N_ADDRESS "local_n_address" +#define CONFIG_STRING_L1_REMOTE_N_ADDRESS "remote_n_address" +#define CONFIG_STRING_L1_LOCAL_N_PORTC "local_n_portc" +#define CONFIG_STRING_L1_REMOTE_N_PORTC "remote_n_portc" +#define CONFIG_STRING_L1_LOCAL_N_PORTD "local_n_portd" +#define CONFIG_STRING_L1_REMOTE_N_PORTD "remote_n_portd" +#define CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE "tr_n_preference" + +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* L1 configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define L1PARAMS_DESC { \ +{CONFIG_STRING_L1_CC, NULL, 0, uptr:NULL, defintval:1, TYPE_UINT, 0}, \ +{CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_mac", TYPE_STRING, 0}, \ +{CONFIG_STRING_L1_LOCAL_N_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \ +{CONFIG_STRING_L1_LOCAL_N_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \ +{CONFIG_STRING_L1_REMOTE_N_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.2", TYPE_STRING, 0}, \ +{CONFIG_STRING_L1_LOCAL_N_PORTC, NULL, 0, uptr:NULL, defintval:50030, TYPE_UINT, 0}, \ +{CONFIG_STRING_L1_REMOTE_N_PORTC, NULL, 0, uptr:NULL, defintval:50030, TYPE_UINT, 0}, \ +{CONFIG_STRING_L1_LOCAL_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \ +{CONFIG_STRING_L1_REMOTE_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \ +} +#define L1_CC_IDX 0 +#define L1_TRANSPORT_N_PREFERENCE_IDX 1 +#define L1_LOCAL_N_IF_NAME_IDX 2 +#define L1_LOCAL_N_ADDRESS_IDX 3 +#define L1_REMOTE_N_ADDRESS_IDX 4 +#define L1_LOCAL_N_PORTC_IDX 5 +#define L1_REMOTE_N_PORTC_IDX 6 +#define L1_LOCAL_N_PORTD_IDX 7 +#define L1_REMOTE_N_PORTD_IDX 8 + +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define ENB_CONFIG_STRING_NETWORK_CONTROLLER_CONFIG "NETWORK_CONTROLLER" + +#define ENB_CONFIG_STRING_FLEXRAN_AGENT_INTERFACE_NAME "FLEXRAN_AGENT_INTERFACE_NAME" +#define ENB_CONFIG_STRING_FLEXRAN_AGENT_IPV4_ADDRESS "FLEXRAN_AGENT_IPV4_ADDRESS" +#define ENB_CONFIG_STRING_FLEXRAN_AGENT_PORT "FLEXRAN_AGENT_PORT" +#define ENB_CONFIG_STRING_FLEXRAN_AGENT_CACHE "FLEXRAN_AGENT_CACHE" + +#define FLEXRANPARAMS_DESC { \ +{ENB_CONFIG_STRING_FLEXRAN_AGENT_INTERFACE_NAME, NULL, 0, uptr:NULL, defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_FLEXRAN_AGENT_IPV4_ADDRESS, NULL, 0, uptr:NULL, defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_FLEXRAN_AGENT_PORT, NULL, 0, uptr:NULL, defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE, TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_FLEXRAN_AGENT_CACHE, NULL, 0, uptr:NULL, defstrval:ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE, TYPE_STRING, 0} \ +} + +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* CU/DU configuration section names*/ +#define CONFIG_STRING_DU_LIST "DU" +#define CONFIG_STRING_CU_LIST "CU" +#define DU_TYPE_LTE 0 +#define DU_TYPE_WIFI 1 +#define ENB_CONFIG_STRING_CU_INTERFACES_CONFIG "CU_INTERFACES" +#define ENB_CONFIG_STRING_CU_INTERFACE_NAME_FOR_F1U "CU_INTERFACE_NAME_FOR_F1U" +#define ENB_CONFIG_STRING_CU_IPV4_ADDRESS_FOR_F1U "CU_IPV4_ADDRESS_FOR_F1U" +#define ENB_CONFIG_STRING_CU_PORT_FOR_F1U "CU_PORT_FOR_F1U" +#define ENB_CONFIG_STRING_DU_TYPE "DU_TYPE" +#define ENB_CONFIG_STRING_F1_U_CU_TRANSPORT_TYPE "F1_U_CU_TRANSPORT_TYPE" + +#define ENB_CONFIG_STRING_DU_INTERFACES_CONFIG "DU_INTERFACES" +#define ENB_CONFIG_STRING_DU_INTERFACE_NAME_FOR_F1U "DU_INTERFACE_NAME_FOR_F1U" +#define ENB_CONFIG_STRING_DU_IPV4_ADDRESS_FOR_F1U "DU_IPV4_ADDRESS_FOR_F1U" +#define ENB_CONFIG_STRING_DU_PORT_FOR_F1U "DU_PORT_FOR_F1U" +#define ENB_CONFIG_STRING_F1_U_DU_TRANSPORT_TYPE "F1_U_DU_TRANSPORT_TYPE" + +#define CONFIG_STRING_CU_BALANCING "CU_BALANCING" + +#define CUPARAMS_DESC { \ +{ENB_CONFIG_STRING_CU_INTERFACE_NAME_FOR_F1U, NULL, 0, strptr:NULL, defstrval:"eth0", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_CU_IPV4_ADDRESS_FOR_F1U, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_CU_PORT_FOR_F1U, NULL, 0, uptr:NULL, defintval:2210, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_F1_U_CU_TRANSPORT_TYPE, NULL, 0, strptr:NULL, defstrval:"TCP", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_DU_TYPE, NULL, 0, strptr:NULL, defstrval:"LTE", TYPE_STRING, 0}, \ +} + +#define DUPARAMS_DESC { \ +{ENB_CONFIG_STRING_DU_INTERFACE_NAME_FOR_F1U, NULL, 0, strptr:NULL, defstrval:"eth0", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_DU_IPV4_ADDRESS_FOR_F1U, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \ +{ENB_CONFIG_STRING_DU_PORT_FOR_F1U, NULL, 0, uptr:NULL, defintval:2210, TYPE_UINT, 0}, \ +{ENB_CONFIG_STRING_F1_U_DU_TRANSPORT_TYPE, NULL, 0, strptr:NULL, defstrval:"TCP", TYPE_STRING, 0}, \ +} + +#define CU_BAL_DESC { \ +{CONFIG_STRING_CU_BALANCING, NULL, 0, strptr:NULL, defstrval:"ALL", TYPE_STRING, 0}, \ +} + +#define CU_INTERFACE_F1U 0 +#define CU_ADDRESS_F1U 1 +#define CU_PORT_F1U 2 +#define CU_TYPE_F1U 3 + +#define DU_INTERFACE_F1U 0 +#define DU_ADDRESS_F1U 1 +#define DU_PORT_F1U 2 +#define DU_TYPE_F1U 3 +#define DU_TECH 4 + +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* MACRLC configuration section names */ +#define CONFIG_STRING_MACRLC_LIST "MACRLCs" +#define CONFIG_STRING_MACRLC_CONFIG "macrlc_config" + + +/* MACRLC configuration parameters names */ +#define CONFIG_STRING_MACRLC_CC "num_cc" +#define CONFIG_STRING_MACRLC_TRANSPORT_N_PREFERENCE "tr_n_preference" +#define CONFIG_STRING_MACRLC_LOCAL_N_IF_NAME "local_n_if_name" +#define CONFIG_STRING_MACRLC_LOCAL_N_ADDRESS "local_n_address" +#define CONFIG_STRING_MACRLC_REMOTE_N_ADDRESS "remote_n_address" +#define CONFIG_STRING_MACRLC_LOCAL_N_PORTC "local_n_portc" +#define CONFIG_STRING_MACRLC_REMOTE_N_PORTC "remote_n_portc" +#define CONFIG_STRING_MACRLC_LOCAL_N_PORTD "local_n_portd" +#define CONFIG_STRING_MACRLC_REMOTE_N_PORTD "remote_n_portd" +#define CONFIG_STRING_MACRLC_TRANSPORT_S_PREFERENCE "tr_s_preference" +#define CONFIG_STRING_MACRLC_LOCAL_S_IF_NAME "local_s_if_name" +#define CONFIG_STRING_MACRLC_LOCAL_S_ADDRESS "local_s_address" +#define CONFIG_STRING_MACRLC_REMOTE_S_ADDRESS "remote_s_address" +#define CONFIG_STRING_MACRLC_LOCAL_S_PORTC "local_s_portc" +#define CONFIG_STRING_MACRLC_REMOTE_S_PORTC "remote_s_portc" +#define CONFIG_STRING_MACRLC_LOCAL_S_PORTD "local_s_portd" +#define CONFIG_STRING_MACRLC_REMOTE_S_PORTD "remote_s_portd" + + +/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* MacRLC configuration parameters */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define MACRLCPARAMS_DESC { \ +{CONFIG_STRING_MACRLC_CC, NULL, 0, uptr:NULL, defintval:50011, TYPE_UINT, 0}, \ +{CONFIG_STRING_MACRLC_TRANSPORT_N_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_L1", TYPE_STRING, 0}, \ +{CONFIG_STRING_MACRLC_LOCAL_N_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \ +{CONFIG_STRING_MACRLC_LOCAL_N_ADDRESS, NULL, 0, strptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \ +{CONFIG_STRING_MACRLC_REMOTE_N_ADDRESS, NULL, 0, uptr:NULL, defstrval:"127.0.0.2", TYPE_STRING, 0}, \ +{CONFIG_STRING_MACRLC_LOCAL_N_PORTC, NULL, 0, uptr:NULL, defintval:50010, TYPE_UINT, 0}, \ +{CONFIG_STRING_MACRLC_REMOTE_N_PORTC, NULL, 0, uptr:NULL, defintval:50010, TYPE_UINT, 0}, \ +{CONFIG_STRING_MACRLC_LOCAL_N_PORTD, NULL, 0, uptr:NULL, defintval:50011, TYPE_UINT, 0}, \ +{CONFIG_STRING_MACRLC_REMOTE_N_PORTD, NULL, 0, uptr:NULL, defintval:50011, TYPE_UINT, 0}, \ +{CONFIG_STRING_MACRLC_TRANSPORT_S_PREFERENCE, NULL, 0, strptr:NULL, defstrval:"local_RRC", TYPE_STRING, 0}, \ +{CONFIG_STRING_MACRLC_LOCAL_S_IF_NAME, NULL, 0, strptr:NULL, defstrval:"lo", TYPE_STRING, 0}, \ +{CONFIG_STRING_MACRLC_LOCAL_S_ADDRESS, NULL, 0, uptr:NULL, defstrval:"127.0.0.1", TYPE_STRING, 0}, \ +{CONFIG_STRING_MACRLC_REMOTE_S_ADDRESS, NULL, 0, uptr:NULL, defstrval:"127.0.0.2", TYPE_STRING, 0}, \ +{CONFIG_STRING_MACRLC_LOCAL_S_PORTC, NULL, 0, uptr:NULL, defintval:50020, TYPE_UINT, 0}, \ +{CONFIG_STRING_MACRLC_REMOTE_S_PORTC, NULL, 0, uptr:NULL, defintval:50020, TYPE_UINT, 0}, \ +{CONFIG_STRING_MACRLC_LOCAL_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \ +{CONFIG_STRING_MACRLC_REMOTE_S_PORTD, NULL, 0, uptr:NULL, defintval:50021, TYPE_UINT, 0}, \ +} +#define MACRLC_CC_IDX 0 +#define MACRLC_TRANSPORT_N_PREFERENCE_IDX 1 +#define MACRLC_LOCAL_N_IF_NAME_IDX 2 +#define MACRLC_LOCAL_N_ADDRESS_IDX 3 +#define MACRLC_REMOTE_N_ADDRESS_IDX 4 +#define MACRLC_LOCAL_N_PORTC_IDX 5 +#define MACRLC_REMOTE_N_PORTC_IDX 6 +#define MACRLC_LOCAL_N_PORTD_IDX 7 +#define MACRLC_REMOTE_N_PORTD_IDX 8 +#define MACRLC_TRANSPORT_S_PREFERENCE_IDX 9 +#define MACRLC_LOCAL_S_IF_NAME_IDX 10 +#define MACRLC_LOCAL_S_ADDRESS_IDX 11 +#define MACRLC_REMOTE_S_ADDRESS_IDX 12 +#define MACRLC_LOCAL_S_PORTC_IDX 13 +#define MACRLC_REMOTE_S_PORTC_IDX 14 +#define MACRLC_LOCAL_S_PORTD_IDX 15 +#define MACRLC_REMOTE_S_PORTD_IDX 16 +/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/ diff --git a/openair2/ENB_APP/flexran_agent.c b/openair2/ENB_APP/flexran_agent.c new file mode 100644 index 0000000000..4faa1f3624 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent.c @@ -0,0 +1,320 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent.h + * \brief top level flexran agent receive thread and itti task + * \author Xenofon Foukas and Navid Nikaein + * \date 2016 + * \version 0.1 + */ + +#include "flexran_agent_common.h" +#include "log.h" +#include "flexran_agent.h" +#include "flexran_agent_mac_defs.h" +#include "flexran_agent_mac.h" +#include "flexran_agent_mac_internal.h" + +#include "flexran_agent_extern.h" + +#include "assertions.h" + +#include "flexran_agent_net_comm.h" +#include "flexran_agent_async.h" + +#include + +//#define TEST_TIMER + +flexran_agent_instance_t flexran_agent[NUM_MAX_ENB]; + +char in_ip[40]; +static uint16_t in_port; +char local_cache[40]; + +void *send_thread(void *args); +void *receive_thread(void *args); +pthread_t new_thread(void *(*f)(void *), void *b); +Protocol__FlexranMessage *flexran_agent_timeout(void* args); + + +int agent_task_created = 0; +/* + * enb agent task mainly wakes up the tx thread for periodic and oneshot messages to the controller + * and can interact with other itti tasks +*/ +void *flexran_agent_task(void *args){ + + //flexran_agent_instance_t *d = (flexran_agent_instance_t *) args; + Protocol__FlexranMessage *msg; + void *data; + int size; + err_code_t err_code; + int priority = 0; + + MessageDef *msg_p = NULL; + const char *msg_name = NULL; + int result; + struct flexran_agent_timer_element_s * elem = NULL; + + itti_mark_task_ready(TASK_FLEXRAN_AGENT); + + do { + // Wait for a message + itti_receive_msg (TASK_FLEXRAN_AGENT, &msg_p); + DevAssert(msg_p != NULL); + msg_name = ITTI_MSG_NAME (msg_p); + + switch (ITTI_MSG_ID(msg_p)) { + case TERMINATE_MESSAGE: + itti_exit_task (); + break; + + case MESSAGE_TEST: + LOG_I(FLEXRAN_AGENT, "Received %s\n", ITTI_MSG_NAME(msg_p)); + break; + + case TIMER_HAS_EXPIRED: + msg = flexran_agent_process_timeout(msg_p->ittiMsg.timer_has_expired.timer_id, msg_p->ittiMsg.timer_has_expired.arg); + if (msg != NULL){ + data=flexran_agent_pack_message(msg,&size); + elem = get_timer_entry(msg_p->ittiMsg.timer_has_expired.timer_id); + if (flexran_agent_msg_send(elem->agent_id, FLEXRAN_AGENT_DEFAULT, data, size, priority)) { + err_code = PROTOCOL__FLEXRAN_ERR__MSG_ENQUEUING; + goto error; + } + + LOG_D(FLEXRAN_AGENT,"sent message with size %d\n", size); + } + break; + + default: + LOG_E(FLEXRAN_AGENT, "Received unexpected message %s\n", msg_name); + break; + } + + result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); + AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + continue; + error: + LOG_E(FLEXRAN_AGENT,"flexran_agent_task: error %d occured\n",err_code); + } while (1); + + return NULL; +} + +void *receive_thread(void *args) { + + flexran_agent_instance_t *d = args; + void *data; + int size; + int priority; + err_code_t err_code; + + Protocol__FlexranMessage *msg; + + while (1) { + + while (flexran_agent_msg_recv(d->enb_id, FLEXRAN_AGENT_DEFAULT, &data, &size, &priority) == 0) { + + LOG_D(FLEXRAN_AGENT,"received message with size %d\n", size); + + // Invoke the message handler + msg=flexran_agent_handle_message(d->enb_id, data, size); + + free(data); + + // check if there is something to send back to the controller + if (msg != NULL){ + data=flexran_agent_pack_message(msg,&size); + + if (flexran_agent_msg_send(d->enb_id, FLEXRAN_AGENT_DEFAULT, data, size, priority)) { + err_code = PROTOCOL__FLEXRAN_ERR__MSG_ENQUEUING; + goto error; + } + + LOG_D(FLEXRAN_AGENT,"sent message with size %d\n", size); + } + } + } + + return NULL; + +error: + LOG_E(FLEXRAN_AGENT,"receive_thread: error %d occured\n",err_code); + return NULL; +} + + +/* utility function to create a thread */ +pthread_t new_thread(void *(*f)(void *), void *b) { + pthread_t t; + pthread_attr_t att; + + if (pthread_attr_init(&att)){ + fprintf(stderr, "pthread_attr_init err\n"); + exit(1); + } + + struct sched_param sched_param_recv_thread; + + sched_param_recv_thread.sched_priority = sched_get_priority_max(SCHED_FIFO) - 1; + pthread_attr_setschedparam(&att, &sched_param_recv_thread); + pthread_attr_setschedpolicy(&att, SCHED_FIFO); + + if (pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED)) { + fprintf(stderr, "pthread_attr_setdetachstate err\n"); + exit(1); + } + if (pthread_create(&t, &att, f, b)) { + fprintf(stderr, "pthread_create err\n"); + exit(1); + } + if (pthread_attr_destroy(&att)) { + fprintf(stderr, "pthread_attr_destroy err\n"); + exit(1); + } + + return t; +} + +int channel_container_init = 0; +int flexran_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties){ + + int channel_id; + + flexran_set_enb_vars(mod_id, RAN_LTE_OAI); + flexran_agent[mod_id].enb_id = mod_id; + + /* + * check the configuration + */ + if (enb_properties->properties[mod_id]->flexran_agent_cache != NULL) { + strncpy(local_cache, enb_properties->properties[mod_id]->flexran_agent_cache, sizeof(local_cache)); + local_cache[sizeof(local_cache) - 1] = 0; + } else { + strcpy(local_cache, DEFAULT_FLEXRAN_AGENT_CACHE); + } + + if (enb_properties->properties[mod_id]->flexran_agent_ipv4_address != 0) { + inet_ntop(AF_INET, &(enb_properties->properties[mod_id]->flexran_agent_ipv4_address), in_ip, INET_ADDRSTRLEN); + } else { + strcpy(in_ip, DEFAULT_FLEXRAN_AGENT_IPv4_ADDRESS ); + } + + if (enb_properties->properties[mod_id]->flexran_agent_port != 0 ) { + in_port = enb_properties->properties[mod_id]->flexran_agent_port; + } else { + in_port = DEFAULT_FLEXRAN_AGENT_PORT ; + } + LOG_I(FLEXRAN_AGENT,"starting enb agent client for module id %d on ipv4 %s, port %d\n", + flexran_agent[mod_id].enb_id, + in_ip, + in_port); + + /* + * Initialize the channel container + */ + if (!channel_container_init) { + flexran_agent_init_channel_container(); + channel_container_init = 1; + } + /*Create the async channel info*/ + flexran_agent_async_channel_t *channel_info = flexran_agent_async_channel_info(mod_id, in_ip, in_port); + + /*Create a channel using the async channel info*/ + channel_id = flexran_agent_create_channel((void *) channel_info, + flexran_agent_async_msg_send, + flexran_agent_async_msg_recv, + flexran_agent_async_release); + + + if (channel_id <= 0) { + goto error; + } + + flexran_agent_channel_t *channel = get_channel(channel_id); + + if (channel == NULL) { + goto error; + } + + /*Register the channel for all underlying agents (use FLEXRAN_AGENT_MAX)*/ + flexran_agent_register_channel(mod_id, channel, FLEXRAN_AGENT_MAX); + + /*Example of registration for a specific agent(MAC): + *flexran_agent_register_channel(mod_id, channel, FLEXRAN_AGENT_MAC); + */ + + /*Initialize the continuous MAC stats update mechanism*/ + flexran_agent_init_cont_mac_stats_update(mod_id); + + new_thread(receive_thread, &flexran_agent[mod_id]); + + /*Initialize and register the mac xface. Must be modified later + *for more flexibility in agent management */ + + AGENT_MAC_xface *mac_agent_xface = (AGENT_MAC_xface *) malloc(sizeof(AGENT_MAC_xface)); + flexran_agent_register_mac_xface(mod_id, mac_agent_xface); + + /* + * initilize a timer + */ + + flexran_agent_init_timer(); + + /* + * Initialize the mac agent + */ + flexran_agent_init_mac_agent(mod_id); + + /* + * start the enb agent task for tx and interaction with the underlying network function + */ + if (!agent_task_created) { + if (itti_create_task (TASK_FLEXRAN_AGENT, flexran_agent_task, (void *) &flexran_agent[mod_id]) < 0) { + LOG_E(FLEXRAN_AGENT, "Create task for FlexRAN Agent failed\n"); + return -1; + } + agent_task_created = 1; + } + + LOG_I(FLEXRAN_AGENT,"client ends\n"); + return 0; + +error: + LOG_I(FLEXRAN_AGENT,"there was an error\n"); + return 1; + +} + +Protocol__FlexranMessage *flexran_agent_timeout(void* args){ + + // flexran_agent_timer_args_t *timer_args = calloc(1, sizeof(*timer_args)); + //memcpy (timer_args, args, sizeof(*timer_args)); + flexran_agent_timer_args_t *timer_args = (flexran_agent_timer_args_t *) args; + + LOG_I(FLEXRAN_AGENT, "flexran_agent %d timeout\n", timer_args->mod_id); + //LOG_I(FLEXRAN_AGENT, "eNB action %d ENB flags %d \n", timer_args->cc_actions,timer_args->cc_report_flags); + //LOG_I(FLEXRAN_AGENT, "UE action %d UE flags %d \n", timer_args->ue_actions,timer_args->ue_report_flags); + + return NULL; +} diff --git a/openair2/ENB_APP/flexran_agent.h b/openair2/ENB_APP/flexran_agent.h new file mode 100644 index 0000000000..579bf3be23 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent.h @@ -0,0 +1,46 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent.h + * \brief top level flexran agent + * \author Navid Nikaein and Xenofon Foukas + * \date 2016 + * \version 0.1 + */ + +#ifndef FLEXRAN_AGENT_H_ +#define FLEXRAN_AGENT_H_ + +#include "enb_config.h" // for enb properties +#include "flexran_agent_common.h" + + +/* Initiation and termination of the eNodeB agent */ +int flexran_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties); +int flexran_agent_stop(mid_t mod_id); + +/* + * enb agent task mainly wakes up the tx thread for periodic and oneshot messages to the controller + * and can interact with other itti tasks +*/ +void *flexran_agent_task(void *args); + +#endif diff --git a/openair2/ENB_APP/flexran_agent_async.c b/openair2/ENB_APP/flexran_agent_async.c new file mode 100644 index 0000000000..f1edc291c9 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_async.c @@ -0,0 +1,99 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_async.c + * \brief channel implementation for async interface + * \author Xenofon Foukas + * \date 2016 + * \version 0.1 + */ + +#include "flexran_agent_async.h" +#include "flexran_agent_defs.h" + +#include "log.h" + +flexran_agent_async_channel_t * flexran_agent_async_channel_info(mid_t mod_id, char *dst_ip, uint16_t dst_port) { + + flexran_agent_async_channel_t *channel; + channel = (flexran_agent_async_channel_t *) malloc(sizeof(flexran_agent_channel_t)); + + if (channel == NULL) + goto error; + + channel->enb_id = mod_id; + /*Create a socket*/ + channel->link = new_link_client(dst_ip, dst_port); + if (channel->link == NULL) goto error; + + LOG_I(FLEXRAN_AGENT,"starting enb agent client for module id %d on ipv4 %s, port %d\n", + channel->enb_id, + dst_ip, + dst_port); + + /* + * create a message queue + */ + // Set size of queues statically for now + channel->send_queue = new_message_queue(500); + if (channel->send_queue == NULL) goto error; + channel->receive_queue = new_message_queue(500); + if (channel->receive_queue == NULL) goto error; + + /* + * create a link manager + */ + channel->manager = create_link_manager(channel->send_queue, channel->receive_queue, channel->link); + if (channel->manager == NULL) goto error; + + return channel; + + error: + LOG_I(FLEXRAN_AGENT,"there was an error\n"); + return 1; +} + +int flexran_agent_async_msg_send(void *data, int size, int priority, void *channel_info) { + flexran_agent_async_channel_t *channel; + channel = (flexran_agent_channel_t *)channel_info; + + return message_put(channel->send_queue, data, size, priority); +} + +int flexran_agent_async_msg_recv(void **data, int *size, int *priority, void *channel_info) { + flexran_agent_async_channel_t *channel; + channel = (flexran_agent_async_channel_t *)channel_info; + + return message_get(channel->receive_queue, data, size, priority); +} + +void flexran_agent_async_release(flexran_agent_channel_t *channel) { + flexran_agent_async_channel_t *channel_info; + channel_info = (flexran_agent_async_channel_t *) channel->channel_info; + + destroy_link_manager(channel_info->manager); + + destroy_message_queue(channel_info->send_queue); + destroy_message_queue(channel_info->receive_queue); + + close_link(channel_info->link); + free(channel_info); +} diff --git a/openair2/ENB_APP/flexran_agent_async.h b/openair2/ENB_APP/flexran_agent_async.h new file mode 100644 index 0000000000..03aebd0058 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_async.h @@ -0,0 +1,55 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_async.h + * \brief channel implementation for async interface + * \author Xenofon Foukas + * \date 2016 + * \version 0.1 + */ + +#ifndef FLEXRAN_AGENT_ASYNC_H_ +#define FLEXRAN_AGENT_ASYNC_H_ + +#include "flexran_agent_net_comm.h" + +typedef struct { + mid_t enb_id; + socket_link_t *link; + message_queue_t *send_queue; + message_queue_t *receive_queue; + link_manager_t *manager; +} flexran_agent_async_channel_t; + +/* Create a new channel for a given destination ip and destination port */ +flexran_agent_async_channel_t * flexran_agent_async_channel_info(mid_t mod_id, char *dst_ip, uint16_t dst_port); + +/* Send a message to the given channel */ +int flexran_agent_async_msg_send(void *data, int size, int priority, void *channel_info); + +/* Receive a message from a given channel */ +int flexran_agent_async_msg_recv(void **data, int *size, int *priority, void *channel_info); + +/* Release a channel */ +void flexran_agent_async_release(flexran_agent_channel_t *channel); + + +#endif /*FLEXRAN_AGENT_ASYNC_H_*/ diff --git a/openair2/ENB_APP/flexran_agent_common.c b/openair2/ENB_APP/flexran_agent_common.c new file mode 100644 index 0000000000..69c786edb3 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_common.c @@ -0,0 +1,2330 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_common.c + * \brief common primitives for all agents + * \author Xenofon Foukas, Mohamed Kassem and Navid Nikaein + * \date 2016 + * \version 0.1 + */ + +#include +#include + +#include "flexran_agent_common.h" +#include "flexran_agent_common_internal.h" +#include "flexran_agent_extern.h" +#include "flexran_agent_net_comm.h" +#include "PHY/extern.h" +#include "log.h" + +#include "SCHED/defs.h" +#include "RRC/LITE/extern.h" +#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" +#include "rrc_eNB_UE_context.h" + +void * enb[NUM_MAX_ENB]; +void * enb_ue[NUM_MAX_ENB]; +void * enb_rrc[NUM_MAX_ENB]; + +/* + * message primitives + */ + +int flexran_agent_serialize_message(Protocol__FlexranMessage *msg, void **buf, int *size) { + + *size = protocol__flexran_message__get_packed_size(msg); + + *buf = malloc(*size); + if (buf == NULL) + goto error; + + protocol__flexran_message__pack(msg, *buf); + + return 0; + + error: + LOG_E(FLEXRAN_AGENT, "an error occured\n"); // change the com + return -1; +} + + + +/* We assume that the buffer size is equal to the message size. + Should be chekced durint Tx/Rx */ +int flexran_agent_deserialize_message(void *data, int size, Protocol__FlexranMessage **msg) { + *msg = protocol__flexran_message__unpack(NULL, size, data); + if (*msg == NULL) + goto error; + + return 0; + + error: + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + + + +int flexran_create_header(xid_t xid, Protocol__FlexType type, Protocol__FlexHeader **header) { + + *header = malloc(sizeof(Protocol__FlexHeader)); + if(*header == NULL) + goto error; + + protocol__flex_header__init(*header); + (*header)->version = FLEXRAN_VERSION; + (*header)->has_version = 1; + // check if the type is set + (*header)->type = type; + (*header)->has_type = 1; + (*header)->xid = xid; + (*header)->has_xid = 1; + return 0; + + error: + LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + + +int flexran_agent_hello(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { + + Protocol__FlexHeader *header; + /*TODO: Need to set random xid or xid from received hello message*/ + xid_t xid = 1; + + Protocol__FlexHello *hello_msg; + hello_msg = malloc(sizeof(Protocol__FlexHello)); + if(hello_msg == NULL) + goto error; + protocol__flex_hello__init(hello_msg); + + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_HELLO, &header) != 0) + goto error; + + hello_msg->header = header; + + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if(*msg == NULL) + goto error; + + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_HELLO_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__SUCCESSFUL_OUTCOME; + (*msg)->has_msg_dir = 1; + (*msg)->hello_msg = hello_msg; + return 0; + + error: + if(header != NULL) + free(header); + if(hello_msg != NULL) + free(hello_msg); + if(*msg != NULL) + free(*msg); + LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + + +int flexran_agent_destroy_hello(Protocol__FlexranMessage *msg) { + + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_HELLO_MSG) + goto error; + + free(msg->hello_msg->header); + free(msg->hello_msg); + free(msg); + return 0; + + error: + LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + + +int flexran_agent_echo_request(mid_t mod_id, const void* params, Protocol__FlexranMessage **msg) { + Protocol__FlexHeader *header; + /*TODO: Need to set a random xid*/ + xid_t xid = 1; + + Protocol__FlexEchoRequest *echo_request_msg = NULL; + echo_request_msg = malloc(sizeof(Protocol__FlexEchoRequest)); + if(echo_request_msg == NULL) + goto error; + protocol__flex_echo_request__init(echo_request_msg); + + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_ECHO_REQUEST, &header) != 0) + goto error; + + echo_request_msg->header = header; + + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if(*msg == NULL) + goto error; + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_ECHO_REQUEST_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__INITIATING_MESSAGE; + (*msg)->echo_request_msg = echo_request_msg; + return 0; + + error: + if(header != NULL) + free(header); + if(echo_request_msg != NULL) + free(echo_request_msg); + if(*msg != NULL) + free(*msg); + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + + +int flexran_agent_destroy_echo_request(Protocol__FlexranMessage *msg) { + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_ECHO_REQUEST_MSG) + goto error; + + free(msg->echo_request_msg->header); + free(msg->echo_request_msg); + free(msg); + return 0; + + error: + LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + + + +int flexran_agent_echo_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { + + xid_t xid; + Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params; + Protocol__FlexEchoRequest *echo_req = input->echo_request_msg; + xid = (echo_req->header)->xid; + + Protocol__FlexEchoReply *echo_reply_msg = NULL; + echo_reply_msg = malloc(sizeof(Protocol__FlexEchoReply)); + if(echo_reply_msg == NULL) + goto error; + protocol__flex_echo_reply__init(echo_reply_msg); + + Protocol__FlexHeader *header; + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_ECHO_REPLY, &header) != 0) + goto error; + + echo_reply_msg->header = header; + + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if(*msg == NULL) + goto error; + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_ECHO_REPLY_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__SUCCESSFUL_OUTCOME; + (*msg)->has_msg_dir = 1; + (*msg)->echo_reply_msg = echo_reply_msg; + return 0; + + error: + if(header != NULL) + free(header); + if(echo_reply_msg != NULL) + free(echo_reply_msg); + if(*msg != NULL) + free(*msg); + LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + + +int flexran_agent_destroy_echo_reply(Protocol__FlexranMessage *msg) { + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_ECHO_REPLY_MSG) + goto error; + + free(msg->echo_reply_msg->header); + free(msg->echo_reply_msg); + free(msg); + return 0; + + error: + LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + + +int flexran_agent_destroy_enb_config_reply(Protocol__FlexranMessage *msg) { + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_ENB_CONFIG_REPLY_MSG) + goto error; + free(msg->enb_config_reply_msg->header); + int i, j; + Protocol__FlexEnbConfigReply *reply = msg->enb_config_reply_msg; + + for(i = 0; i < reply->n_cell_config;i++) { + free(reply->cell_config[i]->mbsfn_subframe_config_rfoffset); + free(reply->cell_config[i]->mbsfn_subframe_config_rfperiod); + free(reply->cell_config[i]->mbsfn_subframe_config_sfalloc); + if (reply->cell_config[i]->si_config != NULL) { + for(j = 0; j < reply->cell_config[i]->si_config->n_si_message;j++){ + free(reply->cell_config[i]->si_config->si_message[j]); + } + free(reply->cell_config[i]->si_config->si_message); + free(reply->cell_config[i]->si_config); + } + free(reply->cell_config[i]); + } + free(reply->cell_config); + free(reply); + free(msg); + + return 0; + error: + //LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_destroy_ue_config_reply(Protocol__FlexranMessage *msg) { + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_UE_CONFIG_REPLY_MSG) + goto error; + free(msg->ue_config_reply_msg->header); + int i; + Protocol__FlexUeConfigReply *reply = msg->ue_config_reply_msg; + + for(i = 0; i < reply->n_ue_config;i++){ + free(reply->ue_config[i]->capabilities); + free(reply->ue_config[i]); + } + free(reply->ue_config); + free(reply); + free(msg); + + return 0; + error: + //LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_destroy_lc_config_reply(Protocol__FlexranMessage *msg) { + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_LC_CONFIG_REPLY_MSG) + goto error; + + int i, j; + free(msg->lc_config_reply_msg->header); + for (i = 0; i < msg->lc_config_reply_msg->n_lc_ue_config; i++) { + for (j = 0; j < msg->lc_config_reply_msg->lc_ue_config[i]->n_lc_config; j++) { + free(msg->lc_config_reply_msg->lc_ue_config[i]->lc_config[j]); + } + free(msg->lc_config_reply_msg->lc_ue_config[i]->lc_config); + free(msg->lc_config_reply_msg->lc_ue_config[i]); + } + free(msg->lc_config_reply_msg->lc_ue_config); + free(msg->lc_config_reply_msg); + free(msg); + return 0; + error: + //LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_destroy_ue_state_change(Protocol__FlexranMessage *msg) { + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_UE_STATE_CHANGE_MSG) + goto error; + free(msg->ue_state_change_msg->header); + //TODO: Free the contents of the UE config structure + free(msg->ue_state_change_msg); + free(msg); + return 0; + + error: + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_destroy_enb_config_request(Protocol__FlexranMessage *msg) { + if(msg->msg_case != PROTOCOL__FLEXRAN_MESSAGE__MSG_ENB_CONFIG_REQUEST_MSG) + goto error; + free(msg->enb_config_request_msg->header); + free(msg->enb_config_request_msg); + free(msg); + return 0; + + error: + //LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_destroy_ue_config_request(Protocol__FlexranMessage *msg) { + /* TODO: Deallocate memory for a dynamically allocated UE config message */ + return 0; +} + +int flexran_agent_destroy_lc_config_request(Protocol__FlexranMessage *msg) { + /* TODO: Deallocate memory for a dynamically allocated LC config message */ + return 0; +} + +// call this function to start a nanosecond-resolution timer +struct timespec timer_start(void) { + struct timespec start_time; + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time); + return start_time; +} + +// call this function to end a timer, returning nanoseconds elapsed as a long +long timer_end(struct timespec start_time){ + struct timespec end_time; + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_time); + long diffInNanos = end_time.tv_nsec - start_time.tv_nsec; + return diffInNanos; +} + +int flexran_agent_control_delegation(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { + + Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params; + Protocol__FlexControlDelegation *control_delegation_msg = input->control_delegation_msg; + + // struct timespec vartime = timer_start(); + + //Write the payload lib into a file in the cache and load the lib + char lib_name[120]; + char target[512]; + snprintf(lib_name, sizeof(lib_name), "/%s.so", control_delegation_msg->name); + strcpy(target, local_cache); + strcat(target, lib_name); + + FILE *f; + f = fopen(target, "wb"); + fwrite(control_delegation_msg->payload.data, control_delegation_msg->payload.len, 1, f); + fclose(f); + + // long time_elapsed_nanos = timer_end(vartime); + *msg = NULL; + return 0; + +} + +int flexran_agent_destroy_control_delegation(Protocol__FlexranMessage *msg) { + /*TODO: Dealocate memory for a dynamically allocated control delegation message*/ + return 0; +} + +int flexran_agent_reconfiguration(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { + Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params; + Protocol__FlexAgentReconfiguration *agent_reconfiguration_msg = input->agent_reconfiguration_msg; + + apply_reconfiguration_policy(mod_id, agent_reconfiguration_msg->policy, strlen(agent_reconfiguration_msg->policy)); + + *msg = NULL; + return 0; +} + +int flexran_agent_destroy_agent_reconfiguration(Protocol__FlexranMessage *msg) { + /*TODO: Dealocate memory for a dynamically allocated agent reconfiguration message*/ + return 0; +} + + +/* + * get generic info from RAN + */ + +void flexran_set_enb_vars(mid_t mod_id, ran_name_t ran){ + + switch (ran){ + case RAN_LTE_OAI : + enb[mod_id] = (void *)&eNB_mac_inst[mod_id]; + enb_ue[mod_id] = (void *)&eNB_mac_inst[mod_id].UE_list; + enb_rrc[mod_id] = (void *)&eNB_rrc_inst[mod_id]; + break; + default : + goto error; + } + + return; + + error: + LOG_E(FLEXRAN_AGENT, "unknown RAN name %d\n", ran); +} + +int flexran_get_current_time_ms (mid_t mod_id, int subframe_flag){ + + if (subframe_flag == 1){ + return ((eNB_MAC_INST *)enb[mod_id])->frame*10 + ((eNB_MAC_INST *)enb[mod_id])->subframe; + }else { + return ((eNB_MAC_INST *)enb[mod_id])->frame*10; + } + +} + +unsigned int flexran_get_current_frame (mid_t mod_id) { + + // #warning "SFN will not be in [0-1023] when oaisim is used" + return ((eNB_MAC_INST *)enb[mod_id])->frame; + +} + +unsigned int flexran_get_current_system_frame_num(mid_t mod_id) { + return (flexran_get_current_frame(mod_id) %1024); +} + +unsigned int flexran_get_current_subframe (mid_t mod_id) { + + return ((eNB_MAC_INST *)enb[mod_id])->subframe; + +} + +uint16_t flexran_get_sfn_sf (mid_t mod_id) { + + frame_t frame; + sub_frame_t subframe; + uint16_t sfn_sf, frame_mask, sf_mask; + + frame = (frame_t) flexran_get_current_system_frame_num(mod_id); + subframe = (sub_frame_t) flexran_get_current_subframe(mod_id); + frame_mask = ((1<<12) - 1); + sf_mask = ((1<<4) - 1); + sfn_sf = (subframe & sf_mask) | ((frame & frame_mask) << 4); + + return sfn_sf; +} + +uint16_t flexran_get_future_sfn_sf (mid_t mod_id, int ahead_of_time) { + + frame_t frame; + sub_frame_t subframe; + uint16_t sfn_sf, frame_mask, sf_mask; + + frame = (frame_t) flexran_get_current_system_frame_num(mod_id); + subframe = (sub_frame_t) flexran_get_current_subframe(mod_id); + + subframe = ((subframe + ahead_of_time) % 10); + + if (subframe < flexran_get_current_subframe(mod_id)) { + frame = (frame + 1) % 1024; + } + + int additional_frames = ahead_of_time / 10; + frame = (frame + additional_frames) % 1024; + + frame_mask = ((1<<12) - 1); + sf_mask = ((1<<4) - 1); + sfn_sf = (subframe & sf_mask) | ((frame & frame_mask) << 4); + + return sfn_sf; +} + +int flexran_get_num_ues (mid_t mod_id){ + + return ((UE_list_t *)enb_ue[mod_id])->num_UEs; +} + +int flexran_get_ue_crnti (mid_t mod_id, mid_t ue_id) { + + return UE_RNTI(mod_id, ue_id); +} + +int flexran_get_ue_bsr (mid_t mod_id, mid_t ue_id, lcid_t lcid) { + + return ((UE_list_t *)enb_ue[mod_id])->UE_template[UE_PCCID(mod_id,ue_id)][ue_id].bsr_info[lcid]; +} + +int flexran_get_ue_phr (mid_t mod_id, mid_t ue_id) { + + return ((UE_list_t *)enb_ue[mod_id])->UE_template[UE_PCCID(mod_id,ue_id)][ue_id].phr_info; +} + +int flexran_get_ue_wcqi (mid_t mod_id, mid_t ue_id) { + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id, 0, UE_RNTI(mod_id, ue_id)); + return eNB_UE_stats->DL_cqi[0]; + + // return ((UE_list_t *)enb_ue[mod_id])->eNB_UE_stats[UE_PCCID(mod_id,ue_id)][ue_id].dl_cqi; +} + +int flexran_get_tx_queue_size(mid_t mod_id, mid_t ue_id, logical_chan_id_t channel_id) { + rnti_t rnti = flexran_get_ue_crnti(mod_id,ue_id); + uint16_t frame = (uint16_t) flexran_get_current_frame(mod_id); + uint16_t subframe = (uint16_t) flexran_get_current_subframe(mod_id); + mac_rlc_status_resp_t rlc_status = mac_rlc_status_ind(mod_id,rnti, mod_id,frame,subframe,ENB_FLAG_YES,MBMS_FLAG_NO, channel_id, 0); + return rlc_status.bytes_in_buffer; +} + +int flexran_get_hol_delay(mid_t mod_id, mid_t ue_id, logical_chan_id_t channel_id) { + rnti_t rnti = flexran_get_ue_crnti(mod_id,ue_id); + uint16_t frame = (uint16_t) flexran_get_current_frame(mod_id); + uint16_t subframe = (uint16_t) flexran_get_current_subframe(mod_id); + mac_rlc_status_resp_t rlc_status = mac_rlc_status_ind(mod_id, rnti, mod_id, frame, subframe, ENB_FLAG_YES, MBMS_FLAG_NO, channel_id, 0); + return rlc_status.head_sdu_creation_time; +} + +short flexran_get_TA(mid_t mod_id, mid_t ue_id, int CC_id) { + + UE_list_t *UE_list=&eNB_mac_inst[mod_id].UE_list; + int rnti; + + rnti = flexran_get_ue_crnti(mod_id, ue_id); + + LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id, CC_id, rnti); + //ue_sched_ctl->ta_timer = 20; // wait 20 subframes before taking TA measurement from PHY + switch (PHY_vars_eNB_g[mod_id][CC_id]->frame_parms.N_RB_DL) { + case 6: + return eNB_UE_stats->timing_advance_update; + case 15: + return eNB_UE_stats->timing_advance_update/2; + case 25: + return eNB_UE_stats->timing_advance_update/4; + case 50: + return eNB_UE_stats->timing_advance_update/8; + case 75: + return eNB_UE_stats->timing_advance_update/12; + case 100: + if (PHY_vars_eNB_g[mod_id][CC_id]->frame_parms.threequarter_fs == 0) { + return eNB_UE_stats->timing_advance_update/16; + } else { + return eNB_UE_stats->timing_advance_update/12; + } + default: + return 0; + } +} + +void flexran_update_TA(mid_t mod_id, mid_t ue_id, int CC_id) { + + UE_list_t *UE_list=&eNB_mac_inst[mod_id].UE_list; + UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[ue_id]; + + if (ue_sched_ctl->ta_timer == 0) { + + // WE SHOULD PROTECT the eNB_UE_stats with a mutex here ... + // LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id, CC_id, rnti); + //ue_sched_ctl->ta_timer = 20; // wait 20 subframes before taking TA measurement from PHY + ue_sched_ctl->ta_update = flexran_get_TA(mod_id, ue_id, CC_id); + + // clear the update in case PHY does not have a new measurement after timer expiry + // eNB_UE_stats->timing_advance_update = 0; + } else { + ue_sched_ctl->ta_timer--; + ue_sched_ctl->ta_update = 0; // don't trigger a timing advance command + } +} + +int flexran_get_MAC_CE_bitmap_TA(mid_t mod_id, mid_t ue_id,int CC_id) { + + UE_list_t *UE_list = &eNB_mac_inst[mod_id].UE_list; + + rnti_t rnti = flexran_get_ue_crnti(mod_id,ue_id); + LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id,CC_id,rnti); + + if (eNB_UE_stats == NULL) { + return 0; + } + + if (flexran_get_TA(mod_id, ue_id, CC_id) != 0) { + return PROTOCOL__FLEX_CE_TYPE__FLPCET_TA; + } else { + return 0; + } + +} + +int flexran_get_active_CC(mid_t mod_id, mid_t ue_id) { + return ((UE_list_t *)enb_ue[mod_id])->numactiveCCs[ue_id]; +} + +int flexran_get_current_RI(mid_t mod_id, mid_t ue_id, int CC_id) { + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + + rnti_t rnti = flexran_get_ue_crnti(mod_id,ue_id); + + eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id,CC_id,rnti); + + if (eNB_UE_stats == NULL) { + return 0; + } + + return eNB_UE_stats[CC_id].rank; +} + +int flexran_get_tpc(mid_t mod_id, mid_t ue_id) { + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + int32_t normalized_rx_power, target_rx_power; + int tpc = 1; + + int pCCid = UE_PCCID(mod_id,ue_id); + rnti_t rnti = flexran_get_ue_crnti(mod_id,ue_id); + + eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id, pCCid, rnti); + + target_rx_power = mac_xface->get_target_pusch_rx_power(mod_id,pCCid); + + if (eNB_UE_stats == NULL) { + normalized_rx_power = target_rx_power; + } else if (eNB_UE_stats->UL_rssi != NULL) { + normalized_rx_power = eNB_UE_stats->UL_rssi[0]; + } else { + normalized_rx_power = target_rx_power; + } + + if (normalized_rx_power>(target_rx_power+1)) { + tpc = 0; //-1 + } else if (normalized_rx_power<(target_rx_power-1)) { + tpc = 2; //+1 + } else { + tpc = 1; //0 + } + return tpc; +} + +int flexran_get_harq(const mid_t mod_id, + const uint8_t CC_id, + const mid_t ue_id, + const int frame, + const uint8_t subframe, + uint8_t *id, + uint8_t *round) { //flag_id_status = 0 then id, else status + /*TODO: Add int TB in function parameters to get the status of the second TB. This can be done to by editing in + * get_ue_active_harq_pid function in line 272 file: phy_procedures_lte_eNB.c to add + * DLSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->dlsch_eNB[(uint32_t)UE_id][1];*/ + + uint8_t harq_pid; + uint8_t harq_round; + + + uint16_t rnti = flexran_get_ue_crnti(mod_id,ue_id); + + mac_xface->get_ue_active_harq_pid(mod_id,CC_id,rnti,frame,subframe,&harq_pid,&harq_round,openair_harq_DL); + + *id = harq_pid; + *round = harq_round; + /* if (round > 0) { */ + /* *status = 1; */ + /* } else { */ + /* *status = 0; */ + /* } */ + + /* return 0; */ + return *round; +} + +int flexran_get_p0_pucch_dbm(mid_t mod_id, mid_t ue_id, int CC_id) { + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + uint32_t rnti = flexran_get_ue_crnti(mod_id,ue_id); + + eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id, CC_id, rnti); + + if (eNB_UE_stats == NULL) { + return -1; + } + + // if(eNB_UE_stats->Po_PUCCH_update == 1) { + return eNB_UE_stats->Po_PUCCH_dBm; + //} + //else + // return -1; +} + +int flexran_get_p0_nominal_pucch(mid_t mod_id, int CC_id) { + int32_t pucch_rx_received = mac_xface->get_target_pucch_rx_power(mod_id, CC_id); + return pucch_rx_received; +} + +int flexran_get_p0_pucch_status(mid_t mod_id, mid_t ue_id, int CC_id) { + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + uint32_t rnti = flexran_get_ue_crnti(mod_id,ue_id); + + eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id, CC_id, rnti); + return eNB_UE_stats->Po_PUCCH_update; +} + +int flexran_update_p0_pucch(mid_t mod_id, mid_t ue_id, int CC_id) { + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + uint32_t rnti = flexran_get_ue_crnti(mod_id,ue_id); + + eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id, CC_id, rnti); + eNB_UE_stats->Po_PUCCH_update = 0; + + return 0; +} + + +/* + * ************************************ + * Get Messages for eNB Configuration Reply + * ************************************ + */ + +int flexran_get_hopping_offset(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->pusch_config_common.pusch_HoppingOffset; +} + +int flexran_get_hopping_mode(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->pusch_config_common.hoppingMode; +} + +int flexran_get_n_SB(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->pusch_config_common.n_SB; +} + +int flexran_get_enable64QAM(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->pusch_config_common.enable64QAM; +} + +int flexran_get_phich_duration(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->phich_config_common.phich_duration; +} + +int flexran_get_phich_resource(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + if(frame_parms->phich_config_common.phich_resource == oneSixth) + return 0; + else if(frame_parms->phich_config_common.phich_resource == half) + return 1; + else if(frame_parms->phich_config_common.phich_resource == one) + return 2; + else if(frame_parms->phich_config_common.phich_resource == two) + return 3; + + return -1; +} + +int flexran_get_n1pucch_an(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->pucch_config_common.n1PUCCH_AN; +} + +int flexran_get_nRB_CQI(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->pucch_config_common.nRB_CQI; +} + +int flexran_get_deltaPUCCH_Shift(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->pucch_config_common.deltaPUCCH_Shift; +} + +int flexran_get_prach_ConfigIndex(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex; +} + +int flexran_get_prach_FreqOffset(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset; +} + +int flexran_get_maxHARQ_Msg3Tx(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->maxHARQ_Msg3Tx; +} + +int flexran_get_ul_cyclic_prefix_length(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->Ncp_UL; +} + +int flexran_get_dl_cyclic_prefix_length(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->Ncp; +} + +int flexran_get_cell_id(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->Nid_cell; +} + +int flexran_get_srs_BandwidthConfig(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig; +} + +int flexran_get_srs_SubframeConfig(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->soundingrs_ul_config_common.srs_SubframeConfig; +} + +int flexran_get_srs_MaxUpPts(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->soundingrs_ul_config_common.srs_MaxUpPts; +} + +int flexran_get_N_RB_DL(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->N_RB_DL; +} + +int flexran_get_N_RB_UL(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->N_RB_UL; +} + +int flexran_get_N_RBG(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->N_RBG; +} + +int flexran_get_subframe_assignment(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->tdd_config; +} + +int flexran_get_special_subframe_assignment(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + return frame_parms->tdd_config_S; +} + +int flexran_get_ra_ResponseWindowSize(mid_t mod_id, int CC_id) { + return enb_config_get()->properties[mod_id]->rach_raResponseWindowSize[CC_id]; +} + +int flexran_get_mac_ContentionResolutionTimer(mid_t mod_id, int CC_id) { + return enb_config_get()->properties[mod_id]->rach_macContentionResolutionTimer[CC_id]; +} + +int flexran_get_duplex_mode(mid_t mod_id, int CC_id) { + LTE_DL_FRAME_PARMS *frame_parms; + + frame_parms = mac_xface->get_lte_frame_parms(mod_id, CC_id); + if(frame_parms->frame_type == TDD) + return PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD; + else if (frame_parms->frame_type == FDD) + return PROTOCOL__FLEX_DUPLEX_MODE__FLDM_FDD; + + return -1; +} + +long flexran_get_si_window_length(mid_t mod_id, int CC_id) { + return ((eNB_RRC_INST *)enb_rrc[mod_id])->carrier[CC_id].sib1->si_WindowLength; +} + +int flexran_get_sib1_length(mid_t mod_id, int CC_id) { + return ((eNB_RRC_INST *)enb_rrc[mod_id])->carrier[CC_id].sizeof_SIB1; +} + +int flexran_get_num_pdcch_symb(mid_t mod_id, int CC_id) { + /* TODO: This should return the number of PDCCH symbols initially used by the cell CC_id */ + return 0; + //(PHY_vars_UE_g[mod_id][CC_id]->lte_ue_pdcch_vars[mod_id]->num_pdcch_symbols); +} + + + +/* + * ************************************ + * Get Messages for UE Configuration Reply + * ************************************ + */ + + +int flexran_get_time_alignment_timer(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.mac_MainConfig != NULL) { + return ue_context_p->ue_context.mac_MainConfig->timeAlignmentTimerDedicated; + } else { + return -1; + } + } else { + return -1; + } +} + +int flexran_get_meas_gap_config(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.measGapConfig != NULL) { + if(ue_context_p->ue_context.measGapConfig->present == MeasGapConfig_PR_setup) { + if (ue_context_p->ue_context.measGapConfig->choice.setup.gapOffset.present == MeasGapConfig__setup__gapOffset_PR_gp0) { + return PROTOCOL__FLEX_MEAS_GAP_CONFIG_PATTERN__FLMGCP_GP1; + } else if (ue_context_p->ue_context.measGapConfig->choice.setup.gapOffset.present == MeasGapConfig__setup__gapOffset_PR_gp1) { + return PROTOCOL__FLEX_MEAS_GAP_CONFIG_PATTERN__FLMGCP_GP2; + } else { + return PROTOCOL__FLEX_MEAS_GAP_CONFIG_PATTERN__FLMGCP_OFF; + } + } + } + } + return -1; +} + + +int flexran_get_meas_gap_config_offset(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.measGapConfig != NULL){ + if(ue_context_p->ue_context.measGapConfig->present == MeasGapConfig_PR_setup) { + if (ue_context_p->ue_context.measGapConfig->choice.setup.gapOffset.present == MeasGapConfig__setup__gapOffset_PR_gp0) { + return ue_context_p->ue_context.measGapConfig->choice.setup.gapOffset.choice.gp0; + } else if (ue_context_p->ue_context.measGapConfig->choice.setup.gapOffset.present == MeasGapConfig__setup__gapOffset_PR_gp1) { + return ue_context_p->ue_context.measGapConfig->choice.setup.gapOffset.choice.gp0; + } + } + } + } + return -1; +} + +int flexran_get_ue_aggregated_max_bitrate_dl (mid_t mod_id, mid_t ue_id) { + return ((UE_list_t *)enb_ue[mod_id])->UE_sched_ctrl[ue_id].ue_AggregatedMaximumBitrateDL; +} + +int flexran_get_ue_aggregated_max_bitrate_ul (mid_t mod_id, mid_t ue_id) { + return ((UE_list_t *)enb_ue[mod_id])->UE_sched_ctrl[ue_id].ue_AggregatedMaximumBitrateUL; +} + +int flexran_get_half_duplex(mid_t ue_id) { + // TODO + //int halfduplex = 0; + //int bands_to_scan = ((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list.count; + //for (int i =0; i < bands_to_scan; i++){ + //if(((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list.array[i]->halfDuplex > 0) + // halfduplex = 1; + //} + //return halfduplex; + return 0; +} + +int flexran_get_intra_sf_hopping(mid_t ue_id) { + //TODO:Get proper value + //temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf); + //return (0 & ( 1 << (31))); + return 0; +} + +int flexran_get_type2_sb_1(mid_t ue_id) { + //TODO:Get proper value + //uint8_t temp = 0; + //temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf); + //return (temp & ( 1 << (11))); + return 0; +} + +int flexran_get_ue_category(mid_t ue_id) { + //TODO:Get proper value + //return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->ue_Category); + return 0; +} + +int flexran_get_res_alloc_type1(mid_t ue_id) { + //TODO:Get proper value + //uint8_t temp = 0; + //temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf); + //return (temp & ( 1 << (30))); + return 0; +} + +int flexran_get_ue_transmission_mode(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + return ue_context_p->ue_context.physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode; + } else { + return -1; + } + } else { + return -1; + } +} + +int flexran_get_tti_bundling(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.mac_MainConfig != NULL){ + return ue_context_p->ue_context.mac_MainConfig->ul_SCH_Config->ttiBundling; + } else { + return -1; + } + } + else { + return -1; + } +} + +int flexran_get_maxHARQ_TX(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.mac_MainConfig != NULL){ + return *ue_context_p->ue_context.mac_MainConfig->ul_SCH_Config->maxHARQ_Tx; + } + } + return -1; +} + +int flexran_get_beta_offset_ack_index(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + return ue_context_p->ue_context.physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_ACK_Index; + } else { + return -1; + } + } else { + return -1; + } +} + +int flexran_get_beta_offset_ri_index(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + return ue_context_p->ue_context.physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_RI_Index; + } else { + return -1; + } + } else { + return -1; + } +} + +int flexran_get_beta_offset_cqi_index(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + return ue_context_p->ue_context.physicalConfigDedicated->pusch_ConfigDedicated->betaOffset_CQI_Index; + } else { + return -1; + } + } + else { + return -1; + } +} + +int flexran_get_simultaneous_ack_nack_cqi(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + if (ue_context_p->ue_context.physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic != NULL) { + return ue_context_p->ue_context.physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.simultaneousAckNackAndCQI; + } + } + } + return -1; +} + +int flexran_get_ack_nack_simultaneous_trans(mid_t mod_id,mid_t ue_id) { + return (&eNB_rrc_inst[mod_id])->carrier[0].sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; +} + +int flexran_get_aperiodic_cqi_rep_mode(mid_t mod_id,mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + return *ue_context_p->ue_context.physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic; + } + } + return -1; +} + +int flexran_get_tdd_ack_nack_feedback(mid_t mod_id, mid_t ue_id) { + // TODO: This needs fixing + return -1; + + /* struct rrc_eNB_ue_context_s* ue_context_p = NULL; */ + /* uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); */ + + /* ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); */ + + /* if(ue_context_p != NULL) { */ + /* if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ */ + /* return ue_context_p->ue_context.physicalConfigDedicated->pucch_ConfigDedicated->tdd_AckNackFeedbackMode; */ + /* } else { */ + /* return -1; */ + /* } */ + /* } else { */ + /* return -1; */ + /* } */ +} + +int flexran_get_ack_nack_repetition_factor(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + return ue_context_p->ue_context.physicalConfigDedicated->pucch_ConfigDedicated->ackNackRepetition.choice.setup.repetitionFactor; + } else { + return -1; + } + } else { + return -1; + } +} + +int flexran_get_extended_bsr_size(mid_t mod_id, mid_t ue_id) { + //TODO: need to double check + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.mac_MainConfig != NULL){ + if(ue_context_p->ue_context.mac_MainConfig->ext2 != NULL){ + long val = (*(ue_context_p->ue_context.mac_MainConfig->ext2->mac_MainConfig_v1020->extendedBSR_Sizes_r10)); + if (val > 0) { + return 1; + } + } + } + } + return -1; +} + +int flexran_get_ue_transmission_antenna(mid_t mod_id, mid_t ue_id) { + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + uint32_t rntiP = flexran_get_ue_crnti(mod_id,ue_id); + + ue_context_p = rrc_eNB_get_ue_context(&eNB_rrc_inst[mod_id],rntiP); + + if(ue_context_p != NULL) { + if(ue_context_p->ue_context.physicalConfigDedicated != NULL){ + if(ue_context_p->ue_context.physicalConfigDedicated->antennaInfo->choice.explicitValue.ue_TransmitAntennaSelection.choice.setup == AntennaInfoDedicated__ue_TransmitAntennaSelection__setup_closedLoop) { + return 2; + } else if(ue_context_p->ue_context.physicalConfigDedicated->antennaInfo->choice.explicitValue.ue_TransmitAntennaSelection.choice.setup == AntennaInfoDedicated__ue_TransmitAntennaSelection__setup_openLoop) { + return 1; + } else { + return 0; + } + } else { + return -1; + } + } else { + return -1; + } +} + +int flexran_get_lcg(mid_t ue_id, mid_t lc_id) { + if (UE_mac_inst == NULL) { + return -1; + } + if(UE_mac_inst[ue_id].logicalChannelConfig[lc_id] != NULL) { + return *UE_mac_inst[ue_id].logicalChannelConfig[lc_id]->ul_SpecificParameters->logicalChannelGroup; + } else { + return -1; + } +} + +int flexran_get_direction(mid_t ue_id, mid_t lc_id) { + /*TODO: fill with the value for the rest of LCID*/ + if(lc_id == DCCH || lc_id == DCCH1) { + return 2; + } else if(lc_id == DTCH) { + return 1; + } else { + return -1; + } +} + +int flexran_agent_ue_state_change(mid_t mod_id, uint32_t rnti, uint8_t state_change) { + int size; + Protocol__FlexranMessage *msg; + Protocol__FlexHeader *header; + void *data; + int priority = 0; + + int xid = 0; + + if (flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_UE_STATE_CHANGE, &header) != 0) + goto error; + + Protocol__FlexUeStateChange *ue_state_change_msg; + ue_state_change_msg = malloc(sizeof(Protocol__FlexUeStateChange)); + if(ue_state_change_msg == NULL) { + goto error; + } + protocol__flex_ue_state_change__init(ue_state_change_msg); + ue_state_change_msg->has_type = 1; + ue_state_change_msg->type = state_change; + + Protocol__FlexUeConfig *config; + config = malloc(sizeof(Protocol__FlexUeConfig)); + if (config == NULL) { + goto error; + } + protocol__flex_ue_config__init(config); + if (state_change == PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_DEACTIVATED) { + // Simply set the rnti of the UE + config->has_rnti = 1; + config->rnti = rnti; + } else if (state_change == PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_UPDATED + || state_change == PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_ACTIVATED) { + int i = find_UE_id(mod_id, rnti); + config->has_rnti = 1; + config->rnti = rnti; + if(flexran_get_time_alignment_timer(mod_id,i) != -1) { + config->time_alignment_timer = flexran_get_time_alignment_timer(mod_id,i); + config->has_time_alignment_timer = 1; + } + if(flexran_get_meas_gap_config(mod_id,i) != -1){ + config->meas_gap_config_pattern = flexran_get_meas_gap_config(mod_id,i); + config->has_meas_gap_config_pattern = 1; + } + if(config->has_meas_gap_config_pattern == 1 && + config->meas_gap_config_pattern != PROTOCOL__FLEX_MEAS_GAP_CONFIG_PATTERN__FLMGCP_OFF) { + config->meas_gap_config_sf_offset = flexran_get_meas_gap_config_offset(mod_id,i); + config->has_meas_gap_config_sf_offset = 1; + } + //TODO: Set the SPS configuration (Optional) + //Not supported for now, so we do not set it + + //TODO: Set the SR configuration (Optional) + //We do not set it for now + + //TODO: Set the CQI configuration (Optional) + //We do not set it for now + + if(flexran_get_ue_transmission_mode(mod_id,i) != -1) { + config->transmission_mode = flexran_get_ue_transmission_mode(mod_id,i); + config->has_transmission_mode = 1; + } + + config->ue_aggregated_max_bitrate_ul = flexran_get_ue_aggregated_max_bitrate_ul(mod_id,i); + config->has_ue_aggregated_max_bitrate_ul = 1; + + config->ue_aggregated_max_bitrate_dl = flexran_get_ue_aggregated_max_bitrate_dl(mod_id,i); + config->has_ue_aggregated_max_bitrate_dl = 1; + + //TODO: Set the UE capabilities + Protocol__FlexUeCapabilities *c_capabilities; + c_capabilities = malloc(sizeof(Protocol__FlexUeCapabilities)); + protocol__flex_ue_capabilities__init(c_capabilities); + //TODO: Set half duplex (FDD operation) + c_capabilities->has_half_duplex = 0; + c_capabilities->half_duplex = 1;//flexran_get_half_duplex(i); + //TODO: Set intra-frame hopping flag + c_capabilities->has_intra_sf_hopping = 0; + c_capabilities->intra_sf_hopping = 1;//flexran_get_intra_sf_hopping(i); + //TODO: Set support for type 2 hopping with n_sb > 1 + c_capabilities->has_type2_sb_1 = 0; + c_capabilities->type2_sb_1 = 1;//flexran_get_type2_sb_1(i); + //TODO: Set ue category + c_capabilities->has_ue_category = 0; + c_capabilities->ue_category = 1;//flexran_get_ue_category(i); + //TODO: Set UE support for resource allocation type 1 + c_capabilities->has_res_alloc_type1 = 0; + c_capabilities->res_alloc_type1 = 1;//flexran_get_res_alloc_type1(i); + //Set the capabilites to the message + config->capabilities = c_capabilities; + + if(flexran_get_ue_transmission_antenna(mod_id,i) != -1) { + config->has_ue_transmission_antenna = 1; + config->ue_transmission_antenna = flexran_get_ue_transmission_antenna(mod_id,i); + } + + if(flexran_get_tti_bundling(mod_id,i) != -1) { + config->has_tti_bundling = 1; + config->tti_bundling = flexran_get_tti_bundling(mod_id,i); + } + + if(flexran_get_maxHARQ_TX(mod_id,i) != -1){ + config->has_max_harq_tx = 1; + config->max_harq_tx = flexran_get_maxHARQ_TX(mod_id,i); + } + + if(flexran_get_beta_offset_ack_index(mod_id,i) != -1) { + config->has_beta_offset_ack_index = 1; + config->beta_offset_ack_index = flexran_get_beta_offset_ack_index(mod_id,i); + } + + if(flexran_get_beta_offset_ri_index(mod_id,i) != -1) { + config->has_beta_offset_ri_index = 1; + config->beta_offset_ri_index = flexran_get_beta_offset_ri_index(mod_id,i); + } + + if(flexran_get_beta_offset_cqi_index(mod_id,i) != -1) { + config->has_beta_offset_cqi_index = 1; + config->beta_offset_cqi_index = flexran_get_beta_offset_cqi_index(mod_id,i); + } + + if(flexran_get_ack_nack_simultaneous_trans(mod_id,i) != -1) { + config->has_ack_nack_simultaneous_trans = 1; + config->ack_nack_simultaneous_trans = flexran_get_ack_nack_simultaneous_trans(mod_id,i); + } + + if(flexran_get_simultaneous_ack_nack_cqi(mod_id,i) != -1) { + config->has_simultaneous_ack_nack_cqi = 1; + config->simultaneous_ack_nack_cqi = flexran_get_simultaneous_ack_nack_cqi(mod_id,i); + } + + if(flexran_get_aperiodic_cqi_rep_mode(mod_id,i) != -1) { + config->has_aperiodic_cqi_rep_mode = 1; + int mode = flexran_get_aperiodic_cqi_rep_mode(mod_id,i); + if (mode > 4) { + config->aperiodic_cqi_rep_mode = PROTOCOL__FLEX_APERIODIC_CQI_REPORT_MODE__FLACRM_NONE; + } else { + config->aperiodic_cqi_rep_mode = mode; + } + } + + if(flexran_get_tdd_ack_nack_feedback(mod_id, i) != -1) { + config->has_tdd_ack_nack_feedback = 1; + config->tdd_ack_nack_feedback = flexran_get_tdd_ack_nack_feedback(mod_id,i); + } + + if(flexran_get_ack_nack_repetition_factor(mod_id, i) != -1) { + config->has_ack_nack_repetition_factor = 1; + config->ack_nack_repetition_factor = flexran_get_ack_nack_repetition_factor(mod_id,i); + } + + if(flexran_get_extended_bsr_size(mod_id, i) != -1) { + config->has_extended_bsr_size = 1; + config->extended_bsr_size = flexran_get_extended_bsr_size(mod_id,i); + } + + config->has_pcell_carrier_index = 1; + config->pcell_carrier_index = UE_PCCID(mod_id, i); + //TODO: Set carrier aggregation support (boolean) + config->has_ca_support = 0; + config->ca_support = 0; + if(config->has_ca_support){ + //TODO: Set cross carrier scheduling support (boolean) + config->has_cross_carrier_sched_support = 1; + config->cross_carrier_sched_support = 0; + //TODO: Set secondary cells configuration + // We do not set it for now. No carrier aggregation support + + //TODO: Set deactivation timer for secondary cell + config->has_scell_deactivation_timer = 0; + config->scell_deactivation_timer = 0; + } + } else if (state_change == PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_MOVED) { + // TODO: Not supported for now. Leave blank + } + + ue_state_change_msg->config = config; + msg = malloc(sizeof(Protocol__FlexranMessage)); + if (msg == NULL) { + goto error; + } + protocol__flexran_message__init(msg); + msg->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_UE_STATE_CHANGE_MSG; + msg->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__INITIATING_MESSAGE; + msg->ue_state_change_msg = ue_state_change_msg; + + data = flexran_agent_pack_message(msg, &size); + /*Send sr info using the MAC channel of the eNB*/ + if (flexran_agent_msg_send(mod_id, FLEXRAN_AGENT_DEFAULT, data, size, priority)) { + goto error; + } + + LOG_D(FLEXRAN_AGENT,"sent message with size %d\n", size); + return 0; + error: + LOG_D(FLEXRAN_AGENT, "Could not send UE state message\n"); + return -1; +} + + + +int flexran_agent_lc_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { + + xid_t xid; + Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params; + Protocol__FlexLcConfigRequest *lc_config_request_msg = input->lc_config_request_msg; + xid = (lc_config_request_msg->header)->xid; + + int i, j; + + Protocol__FlexLcConfigReply *lc_config_reply_msg; + lc_config_reply_msg = malloc(sizeof(Protocol__FlexLcConfigReply)); + if(lc_config_reply_msg == NULL) + goto error; + protocol__flex_lc_config_reply__init(lc_config_reply_msg); + + Protocol__FlexHeader *header; + if(flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_GET_LC_CONFIG_REPLY, &header) != 0) + goto error; + + lc_config_reply_msg->header = header; + + lc_config_reply_msg->n_lc_ue_config = flexran_get_num_ues(mod_id); + + Protocol__FlexLcUeConfig **lc_ue_config; + if (lc_config_reply_msg->n_lc_ue_config > 0) { + lc_ue_config = malloc(sizeof(Protocol__FlexLcUeConfig *) * lc_config_reply_msg->n_lc_ue_config); + if (lc_ue_config == NULL) { + goto error; + } + // Fill the config for each UE + for (i = 0; i < lc_config_reply_msg->n_lc_ue_config; i++) { + lc_ue_config[i] = malloc(sizeof(Protocol__FlexLcUeConfig)); + protocol__flex_lc_ue_config__init(lc_ue_config[i]); + + lc_ue_config[i]->has_rnti = 1; + lc_ue_config[i]->rnti = flexran_get_ue_crnti(mod_id,i); + + //TODO: Set the number of LC configurations that will be reported for this UE + //Set this according to the current state of the UE. This is only a temporary fix + int status = 0; + status = mac_eNB_get_rrc_status(mod_id, flexran_get_ue_crnti(mod_id, i)); + if (status < RRC_CONNECTED) { + lc_ue_config[i]->n_lc_config = 0; + } else if (status == RRC_CONNECTED) { + lc_ue_config[i]->n_lc_config = 1; + } else { + lc_ue_config[i]->n_lc_config = 3; + } + + Protocol__FlexLcConfig **lc_config; + if (lc_ue_config[i]->n_lc_config > 0) { + lc_config = malloc(sizeof(Protocol__FlexLcConfig *) * lc_ue_config[i]->n_lc_config); + if (lc_config == NULL) { + goto error; + } + for (j = 0; j < lc_ue_config[i]->n_lc_config; j++) { + lc_config[j] = malloc(sizeof(Protocol__FlexLcConfig)); + protocol__flex_lc_config__init(lc_config[j]); + + lc_config[j]->has_lcid = 1; + lc_config[j]->lcid = j+1; + + int lcg = flexran_get_lcg(i, j+1); + if (lcg >= 0 && lcg <= 3) { + lc_config[j]->has_lcg = 1; + lc_config[j]->lcg = flexran_get_lcg(i,j+1); + } + + lc_config[j]->has_direction = 1; + lc_config[j]->direction = flexran_get_direction(i,j+1); + //TODO: Bearer type. One of FLQBT_* values. Currently only default bearer supported + lc_config[j]->has_qos_bearer_type = 1; + lc_config[j]->qos_bearer_type = PROTOCOL__FLEX_QOS_BEARER_TYPE__FLQBT_NON_GBR; + + //TODO: Set the QCI defined in TS 23.203, coded as defined in TS 36.413 + // One less than the actual QCI value. Needs to be generalized + lc_config[j]->has_qci = 1; + lc_config[j]->qci = 1; + if (lc_config[j]->direction == PROTOCOL__FLEX_QOS_BEARER_TYPE__FLQBT_GBR) { + //TODO: Set the max bitrate (UL) + lc_config[j]->has_e_rab_max_bitrate_ul = 0; + lc_config[j]->e_rab_max_bitrate_ul = 0; + //TODO: Set the max bitrate (DL) + lc_config[j]->has_e_rab_max_bitrate_dl = 0; + lc_config[j]->e_rab_max_bitrate_dl = 0; + //TODO: Set the guaranteed bitrate (UL) + lc_config[j]->has_e_rab_guaranteed_bitrate_ul = 0; + lc_config[j]->e_rab_guaranteed_bitrate_ul = 0; + //TODO: Set the guaranteed bitrate (DL) + lc_config[j]->has_e_rab_guaranteed_bitrate_dl = 0; + lc_config[j]->e_rab_guaranteed_bitrate_dl = 0; + } + } + lc_ue_config[i]->lc_config = lc_config; + } + } // end for UE + lc_config_reply_msg->lc_ue_config = lc_ue_config; + } // lc_config_reply_msg->n_lc_ue_config > 0 + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if (*msg == NULL) + goto error; + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_LC_CONFIG_REPLY_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__SUCCESSFUL_OUTCOME; + (*msg)->lc_config_reply_msg = lc_config_reply_msg; + + return 0; + + error: + // TODO: Need to make proper error handling + if (header != NULL) + free(header); + if (lc_config_reply_msg != NULL) + free(lc_config_reply_msg); + if(*msg != NULL) + free(*msg); + //LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +/* + * ************************************ + * UE Configuration Reply + * ************************************ + */ + +int flexran_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { + + xid_t xid; + Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params; + Protocol__FlexUeConfigRequest *ue_config_request_msg = input->ue_config_request_msg; + xid = (ue_config_request_msg->header)->xid; + + int i; + + Protocol__FlexUeConfigReply *ue_config_reply_msg; + ue_config_reply_msg = malloc(sizeof(Protocol__FlexUeConfigReply)); + if(ue_config_reply_msg == NULL) + goto error; + protocol__flex_ue_config_reply__init(ue_config_reply_msg); + + Protocol__FlexHeader *header; + if(flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_GET_UE_CONFIG_REPLY, &header) != 0) + goto error; + + ue_config_reply_msg->header = header; + + ue_config_reply_msg->n_ue_config = flexran_get_num_ues(mod_id); + + Protocol__FlexUeConfig **ue_config; + if (ue_config_reply_msg->n_ue_config > 0) { + ue_config = malloc(sizeof(Protocol__FlexUeConfig *) * ue_config_reply_msg->n_ue_config); + if (ue_config == NULL) { + goto error; + } + for (i = 0; i < ue_config_reply_msg->n_ue_config; i++) { + ue_config[i] = malloc(sizeof(Protocol__FlexUeConfig)); + protocol__flex_ue_config__init(ue_config[i]); + + ue_config[i]->rnti = flexran_get_ue_crnti(mod_id,i); + ue_config[i]->has_rnti = 1; + //TODO: Set the DRX configuration (optional) + //Not supported for now, so we do not set it + + if (flexran_get_time_alignment_timer(mod_id,i) != -1) { + ue_config[i]->time_alignment_timer = flexran_get_time_alignment_timer(mod_id,i); + ue_config[i]->has_time_alignment_timer = 1; + } + + if (flexran_get_meas_gap_config(mod_id,i) != -1) { + ue_config[i]->meas_gap_config_pattern = flexran_get_meas_gap_config(mod_id,i); + ue_config[i]->has_meas_gap_config_pattern = 1; + } + + if (ue_config[i]->has_meas_gap_config_pattern == 1 && + ue_config[i]->meas_gap_config_pattern != PROTOCOL__FLEX_MEAS_GAP_CONFIG_PATTERN__FLMGCP_OFF) { + ue_config[i]->meas_gap_config_sf_offset = flexran_get_meas_gap_config_offset(mod_id,i); + ue_config[i]->has_meas_gap_config_sf_offset = 1; + } + //TODO: Set the SPS configuration (Optional) + //Not supported for noe, so we do not set it + + //TODO: Set the SR configuration (Optional) + //We do not set it for now + + //TODO: Set the CQI configuration (Optional) + //We do not set it for now + + if (flexran_get_ue_transmission_mode(mod_id,i) != -1) { + ue_config[i]->transmission_mode = flexran_get_ue_transmission_mode(mod_id,i); + ue_config[i]->has_transmission_mode = 1; + } + + ue_config[i]->ue_aggregated_max_bitrate_ul = flexran_get_ue_aggregated_max_bitrate_ul(mod_id,i); + ue_config[i]->has_ue_aggregated_max_bitrate_ul = 1; + + ue_config[i]->ue_aggregated_max_bitrate_dl = flexran_get_ue_aggregated_max_bitrate_dl(mod_id,i); + ue_config[i]->has_ue_aggregated_max_bitrate_dl = 1; + + Protocol__FlexUeCapabilities *capabilities; + capabilities = malloc(sizeof(Protocol__FlexUeCapabilities)); + protocol__flex_ue_capabilities__init(capabilities); + //TODO: Set half duplex (FDD operation) + capabilities->has_half_duplex = 0; + capabilities->half_duplex = 0;//flexran_get_half_duplex(i); + //TODO: Set intra-frame hopping flag + capabilities->has_intra_sf_hopping = 0; + capabilities->intra_sf_hopping = 1;//flexran_get_intra_sf_hopping(i); + //TODO: Set support for type 2 hopping with n_sb > 1 + capabilities->has_type2_sb_1 = 0; + capabilities->type2_sb_1 = 1;//flexran_get_type2_sb_1(i); + //TODO: Set ue category + capabilities->has_ue_category = 0; + capabilities->ue_category = 1;//flexran_get_ue_category(i); + //TODO: Set UE support for resource allocation type 1 + capabilities->has_res_alloc_type1 = 0; + capabilities->res_alloc_type1 = 1;//flexran_get_res_alloc_type1(i); + //Set the capabilites to the message + ue_config[i]->capabilities = capabilities; + + if (flexran_get_ue_transmission_antenna(mod_id,i) != -1) { + ue_config[i]->has_ue_transmission_antenna = 1; + ue_config[i]->ue_transmission_antenna = flexran_get_ue_transmission_antenna(mod_id,i); + } + + if (flexran_get_tti_bundling(mod_id,i) != -1) { + ue_config[i]->has_tti_bundling = 1; + ue_config[i]->tti_bundling = flexran_get_tti_bundling(mod_id,i); + } + + if (flexran_get_maxHARQ_TX(mod_id,i) != -1) { + ue_config[i]->has_max_harq_tx = 1; + ue_config[i]->max_harq_tx = flexran_get_maxHARQ_TX(mod_id,i); + } + + if (flexran_get_beta_offset_ack_index(mod_id,i) != -1) { + ue_config[i]->has_beta_offset_ack_index = 1; + ue_config[i]->beta_offset_ack_index = flexran_get_beta_offset_ack_index(mod_id,i); + } + + if (flexran_get_beta_offset_ri_index(mod_id,i) != -1) { + ue_config[i]->has_beta_offset_ri_index = 1; + ue_config[i]->beta_offset_ri_index = flexran_get_beta_offset_ri_index(mod_id,i); + } + + if (flexran_get_beta_offset_cqi_index(mod_id,i) != -1) { + ue_config[i]->has_beta_offset_cqi_index = 1; + ue_config[i]->beta_offset_cqi_index = flexran_get_beta_offset_cqi_index(mod_id,i); + } + + if (flexran_get_ack_nack_simultaneous_trans(mod_id,i) != -1) { + ue_config[i]->has_ack_nack_simultaneous_trans = 1; + ue_config[i]->ack_nack_simultaneous_trans = flexran_get_ack_nack_simultaneous_trans(mod_id,i); + } + + if (flexran_get_simultaneous_ack_nack_cqi(mod_id,i) != -1) { + ue_config[i]->has_simultaneous_ack_nack_cqi = 1; + ue_config[i]->simultaneous_ack_nack_cqi = flexran_get_simultaneous_ack_nack_cqi(mod_id,i); + } + + if (flexran_get_aperiodic_cqi_rep_mode(mod_id,i) != -1) { + ue_config[i]->has_aperiodic_cqi_rep_mode = 1; + int mode = flexran_get_aperiodic_cqi_rep_mode(mod_id,i); + if (mode > 4) { + ue_config[i]->aperiodic_cqi_rep_mode = PROTOCOL__FLEX_APERIODIC_CQI_REPORT_MODE__FLACRM_NONE; + } else { + ue_config[i]->aperiodic_cqi_rep_mode = mode; + } + } + + if (flexran_get_tdd_ack_nack_feedback(mod_id, i) != -1) { + ue_config[i]->has_tdd_ack_nack_feedback = 1; + ue_config[i]->tdd_ack_nack_feedback = flexran_get_tdd_ack_nack_feedback(mod_id,i); + } + + if(flexran_get_ack_nack_repetition_factor(mod_id, i) != -1) { + ue_config[i]->has_ack_nack_repetition_factor = 1; + ue_config[i]->ack_nack_repetition_factor = flexran_get_ack_nack_repetition_factor(mod_id,i); + } + + if (flexran_get_extended_bsr_size(mod_id, i) != -1) { + ue_config[i]->has_extended_bsr_size = 1; + ue_config[i]->extended_bsr_size = flexran_get_extended_bsr_size(mod_id,i); + } + //TODO: Set carrier aggregation support (boolean) + ue_config[i]->has_ca_support = 0; + ue_config[i]->ca_support = 0; + + ue_config[i]->has_pcell_carrier_index = 1; + ue_config[i]->pcell_carrier_index = UE_PCCID(mod_id, i); + if(ue_config[i]->has_ca_support){ + //TODO: Set cross carrier scheduling support (boolean) + ue_config[i]->has_cross_carrier_sched_support = 0; + ue_config[i]->cross_carrier_sched_support = 0; + //TODO: Set secondary cells configuration + // We do not set it for now. No carrier aggregation support + //TODO: Set deactivation timer for secondary cell + ue_config[i]->has_scell_deactivation_timer = 0; + ue_config[i]->scell_deactivation_timer = 0; + } + } + ue_config_reply_msg->ue_config = ue_config; + } + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if (*msg == NULL) + goto error; + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_UE_CONFIG_REPLY_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__SUCCESSFUL_OUTCOME; + (*msg)->ue_config_reply_msg = ue_config_reply_msg; + return 0; + + error: + // TODO: Need to make proper error handling + if (header != NULL) + free(header); + if (ue_config_reply_msg != NULL) + free(ue_config_reply_msg); + if(*msg != NULL) + free(*msg); + //LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + + +/* + * ************************************ + * eNB Configuration Request and Reply + * ************************************ + */ + +int flexran_agent_enb_config_request(mid_t mod_id, const void* params, Protocol__FlexranMessage **msg) { + + Protocol__FlexHeader *header; + xid_t xid = 1; + + Protocol__FlexEnbConfigRequest *enb_config_request_msg; + enb_config_request_msg = malloc(sizeof(Protocol__FlexEnbConfigRequest)); + if(enb_config_request_msg == NULL) + goto error; + protocol__flex_enb_config_request__init(enb_config_request_msg); + + if(flexran_create_header(xid,PROTOCOL__FLEX_TYPE__FLPT_GET_ENB_CONFIG_REQUEST, &header) != 0) + goto error; + + enb_config_request_msg->header = header; + + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if(*msg == NULL) + goto error; + + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_ENB_CONFIG_REQUEST_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__INITIATING_MESSAGE; + (*msg)->enb_config_request_msg = enb_config_request_msg; + return 0; + + error: + // TODO: Need to make proper error handling + if (header != NULL) + free(header); + if (enb_config_request_msg != NULL) + free(enb_config_request_msg); + if(*msg != NULL) + free(*msg); + //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int flexran_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { + + xid_t xid; + Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params; + Protocol__FlexEnbConfigRequest *enb_config_req_msg = input->enb_config_request_msg; + xid = (enb_config_req_msg->header)->xid; + + int i, j; + int enb_id = mod_id; + + Protocol__FlexEnbConfigReply *enb_config_reply_msg; + enb_config_reply_msg = malloc(sizeof(Protocol__FlexEnbConfigReply)); + if(enb_config_reply_msg == NULL) + goto error; + protocol__flex_enb_config_reply__init(enb_config_reply_msg); + + Protocol__FlexHeader *header; + if(flexran_create_header(xid, PROTOCOL__FLEX_TYPE__FLPT_GET_ENB_CONFIG_REPLY, &header) != 0) + goto error; + + enb_config_reply_msg->header = header; + + enb_config_reply_msg->enb_id = mod_id; + + + enb_config_reply_msg->n_cell_config = MAX_NUM_CCs; + + Protocol__FlexCellConfig **cell_conf; + if(enb_config_reply_msg->n_cell_config > 0){ + cell_conf = malloc(sizeof(Protocol__FlexCellConfig *) * enb_config_reply_msg->n_cell_config); + if(cell_conf == NULL) + goto error; + for(i = 0; i < enb_config_reply_msg->n_cell_config; i++){ + cell_conf[i] = malloc(sizeof(Protocol__FlexCellConfig)); + protocol__flex_cell_config__init(cell_conf[i]); + + cell_conf[i]->phy_cell_id = 1; + cell_conf[i]->has_phy_cell_id = flexran_get_cell_id(enb_id,i); + + cell_conf[i]->cell_id = i; + cell_conf[i]->has_cell_id = 1; + + cell_conf[i]->pusch_hopping_offset = flexran_get_hopping_offset(enb_id,i); + cell_conf[i]->has_pusch_hopping_offset = 1; + + if (flexran_get_hopping_mode(enb_id,i) == 0) { + cell_conf[i]->hopping_mode = PROTOCOL__FLEX_HOPPING_MODE__FLHM_INTER; + } else if(flexran_get_hopping_mode(enb_id,i) == 1) { + cell_conf[i]->hopping_mode = PROTOCOL__FLEX_HOPPING_MODE__FLHM_INTERINTRA; + } + cell_conf[i]->has_hopping_mode = 1; + + cell_conf[i]->n_sb = flexran_get_n_SB(enb_id,i); + cell_conf[i]->has_n_sb = 1; + + if (flexran_get_phich_resource(enb_id,i) == 0) { + cell_conf[i]->phich_resource = PROTOCOL__FLEX_PHICH_RESOURCE__FLPR_ONE_SIXTH; //0 + } else if (flexran_get_phich_resource(enb_id,i) == 1) { + cell_conf[i]->phich_resource = PROTOCOL__FLEX_PHICH_RESOURCE__FLPR_HALF; //1 + } else if (flexran_get_phich_resource(enb_id,i) == 2) { + cell_conf[i]->phich_resource = PROTOCOL__FLEX_PHICH_RESOURCE__FLPR_ONE; // 2 + } else if (flexran_get_phich_resource(enb_id,i) == 3) { + cell_conf[i]->phich_resource = PROTOCOL__FLEX_PHICH_RESOURCE__FLPR_TWO;//3 + } + cell_conf[i]->has_phich_resource = 1; + + if (flexran_get_phich_duration(enb_id,i) == 0) { + cell_conf[i]->phich_duration = PROTOCOL__FLEX_PHICH_DURATION__FLPD_NORMAL; + } else if(flexran_get_phich_duration(enb_id,i) == 1) { + cell_conf[i]->phich_duration = PROTOCOL__FLEX_PHICH_DURATION__FLPD_EXTENDED; + } + cell_conf[i]->has_phich_duration = 1; + //TODO: Fill in with actual value, See TS 36.211, section 6.9 + cell_conf[i]->init_nr_pdcch_ofdm_sym = flexran_get_num_pdcch_symb(enb_id,i); + cell_conf[i]->has_init_nr_pdcch_ofdm_sym = 0; + //TODO: Fill in with actual value + /* Protocol__FlexSiConfig *si_config; */ + /* si_config = malloc(sizeof(Protocol__FlexSiConfig)); */ + /* if(si_config == NULL) */ + /* goto error; */ + /* protocol__flex_si_config__init(si_config); */ + /* //TODO: Fill in with actual value, Frame number to apply the SI configuration */ + /* si_config->sfn = 1; */ + /* si_config->has_sfn = 1; */ + /* //TODO: Fill in with actual value, the length of SIB1 in bytes */ + /* si_config->sib1_length = get_sib1_length(enb_id,i); */ + /* si_config->has_sib1_length = 1; */ + /* //TODO: Fill in with actual value, Scheduling window for all SIs in SF */ + /* si_config->si_window_length = (uint32_t) get_si_window_length(enb_id,i); */ + /* si_config->has_si_window_length = 1; */ + /* //TODO: Fill in with actual value, the number of SI messages */ + /* si_config->n_si_message=1; */ + /* Protocol__FlexSiMessage **si_message; */ + /* si_message = malloc(sizeof(Protocol__FlexSiMessage *) * si_config->n_si_message); */ + /* if(si_message == NULL) */ + /* goto error; */ + /* for(j = 0; j < si_config->n_si_message; j++){ */ + /* si_message[j] = malloc(sizeof(Protocol__FlexSiMessage)); */ + /* if(si_message[j] == NULL) */ + /* goto error; */ + /* protocol__flex_si_message__init(si_message[j]); */ + /* //TODO: Fill in with actual value, Periodicity of SI msg in radio frames */ + /* si_message[j]->periodicity = 1; //SIPeriod */ + /* si_message[j]->has_periodicity = 1; */ + /* //TODO: Fill in with actual value, rhe length of the SI message in bytes */ + /* si_message[j]->length = 10; */ + /* si_message[j]->has_length = 1; */ + /* } */ + /* if(si_config->n_si_message > 0){ */ + /* si_config->si_message = si_message; */ + /* } */ + /* cell_conf[i]->si_config = si_config; */ + + cell_conf[i]->dl_bandwidth = flexran_get_N_RB_DL(enb_id,i); + cell_conf[i]->has_dl_bandwidth = 1; + + cell_conf[i]->ul_bandwidth = flexran_get_N_RB_UL(enb_id,i); + cell_conf[i]->has_ul_bandwidth = 1; + + if (flexran_get_ul_cyclic_prefix_length(enb_id, i) == 0) { + cell_conf[i]->ul_cyclic_prefix_length = PROTOCOL__FLEX_UL_CYCLIC_PREFIX_LENGTH__FLUCPL_NORMAL; + } else if(flexran_get_ul_cyclic_prefix_length(enb_id, i) == 1) { + cell_conf[i]->ul_cyclic_prefix_length = PROTOCOL__FLEX_UL_CYCLIC_PREFIX_LENGTH__FLUCPL_EXTENDED; + } + cell_conf[i]->has_ul_cyclic_prefix_length = 1; + + if (flexran_get_ul_cyclic_prefix_length(enb_id,i) == 0) { + cell_conf[i]->ul_cyclic_prefix_length = PROTOCOL__FLEX_DL_CYCLIC_PREFIX_LENGTH__FLDCPL_NORMAL; + } else if (flexran_get_ul_cyclic_prefix_length(enb_id,i) == 1) { + cell_conf[i]->ul_cyclic_prefix_length = PROTOCOL__FLEX_DL_CYCLIC_PREFIX_LENGTH__FLDCPL_EXTENDED; + } + + cell_conf[i]->has_dl_cyclic_prefix_length = 1; + //TODO: Fill in with actual value, number of cell specific antenna ports. Currently single port support + cell_conf[i]->antenna_ports_count = 1; + cell_conf[i]->has_antenna_ports_count = 1; + + if (flexran_get_duplex_mode(enb_id,i) == 1) { + cell_conf[i]->duplex_mode = PROTOCOL__FLEX_DUPLEX_MODE__FLDM_FDD; + } else if(flexran_get_duplex_mode(enb_id,i) == 0) { + cell_conf[i]->duplex_mode = PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD; + } + cell_conf[i]->has_duplex_mode = 1; + //TODO: Fill in with actual value, DL/UL subframe assignment. TDD only + cell_conf[i]->subframe_assignment = flexran_get_subframe_assignment(enb_id, i); + cell_conf[i]->has_subframe_assignment = 0; + //TODO: Fill in with actual value, TDD only. See TS 36.211, table 4.2.1 + cell_conf[i]->special_subframe_patterns = flexran_get_special_subframe_assignment(enb_id,i); + cell_conf[i]->has_special_subframe_patterns = 0; + //TODO: Fill in with actual value, The MBSFN radio frame period + cell_conf[i]->n_mbsfn_subframe_config_rfperiod = 0; + uint32_t *elem_rfperiod; + elem_rfperiod = (uint32_t *) malloc(sizeof(uint32_t) *cell_conf[i]->n_mbsfn_subframe_config_rfperiod); + if(elem_rfperiod == NULL) + goto error; + for(j = 0; j < cell_conf[i]->n_mbsfn_subframe_config_rfperiod; j++){ + elem_rfperiod[j] = 1; + } + cell_conf[i]->mbsfn_subframe_config_rfperiod = elem_rfperiod; + + //TODO: Fill in with actual value, The MBSFN radio frame offset + cell_conf[i]->n_mbsfn_subframe_config_rfoffset = 0; + uint32_t *elem_rfoffset; + elem_rfoffset = (uint32_t *) malloc(sizeof(uint32_t) *cell_conf[i]->n_mbsfn_subframe_config_rfoffset); + if(elem_rfoffset == NULL) + goto error; + for(j = 0; j < cell_conf[i]->n_mbsfn_subframe_config_rfoffset; j++){ + elem_rfoffset[j] = 1; + } + cell_conf[i]->mbsfn_subframe_config_rfoffset = elem_rfoffset; + + //TODO: Fill in with actual value, Bitmap indicating the MBSFN subframes + cell_conf[i]->n_mbsfn_subframe_config_sfalloc = 0; + uint32_t *elem_sfalloc; + elem_sfalloc = (uint32_t *) malloc(sizeof(uint32_t) *cell_conf[i]->n_mbsfn_subframe_config_sfalloc); + if(elem_sfalloc == NULL) + goto error; + for(j = 0; j < cell_conf[i]->n_mbsfn_subframe_config_sfalloc; j++){ + elem_sfalloc[j] = 1; + } + cell_conf[i]->mbsfn_subframe_config_sfalloc = elem_sfalloc; + + cell_conf[i]->prach_config_index = flexran_get_prach_ConfigIndex(enb_id,i); + cell_conf[i]->has_prach_config_index = 1; + + cell_conf[i]->prach_freq_offset = flexran_get_prach_FreqOffset(enb_id,i); + cell_conf[i]->has_prach_freq_offset = 1; + + cell_conf[i]->ra_response_window_size = flexran_get_ra_ResponseWindowSize(enb_id,i); + cell_conf[i]->has_ra_response_window_size = 1; + + cell_conf[i]->mac_contention_resolution_timer = flexran_get_mac_ContentionResolutionTimer(enb_id,i); + cell_conf[i]->has_mac_contention_resolution_timer = 1; + + cell_conf[i]->max_harq_msg3tx = flexran_get_maxHARQ_Msg3Tx(enb_id,i); + cell_conf[i]->has_max_harq_msg3tx = 1; + + cell_conf[i]->n1pucch_an = flexran_get_n1pucch_an(enb_id,i); + cell_conf[i]->has_n1pucch_an = 1; + + cell_conf[i]->deltapucch_shift = flexran_get_deltaPUCCH_Shift(enb_id,i); + cell_conf[i]->has_deltapucch_shift = 1; + + cell_conf[i]->nrb_cqi = flexran_get_nRB_CQI(enb_id,i); + cell_conf[i]->has_nrb_cqi = 1; + + cell_conf[i]->srs_subframe_config = flexran_get_srs_SubframeConfig(enb_id,i); + cell_conf[i]->has_srs_subframe_config = 1; + + cell_conf[i]->srs_bw_config = flexran_get_srs_BandwidthConfig(enb_id,i); + cell_conf[i]->has_srs_bw_config = 1; + + cell_conf[i]->srs_mac_up_pts = flexran_get_srs_MaxUpPts(enb_id,i); + cell_conf[i]->has_srs_mac_up_pts = 1; + + if (flexran_get_enable64QAM(enb_id,i) == 0) { + cell_conf[i]->enable_64qam = PROTOCOL__FLEX_QAM__FLEQ_MOD_16QAM; + } else if(flexran_get_enable64QAM(enb_id,i) == 1) { + cell_conf[i]->enable_64qam = PROTOCOL__FLEX_QAM__FLEQ_MOD_64QAM; + } + cell_conf[i]->has_enable_64qam = 1; + + cell_conf[i]->carrier_index = i; + cell_conf[i]->has_carrier_index = 1; + } + enb_config_reply_msg->cell_config=cell_conf; + } + *msg = malloc(sizeof(Protocol__FlexranMessage)); + if(*msg == NULL) + goto error; + protocol__flexran_message__init(*msg); + (*msg)->msg_case = PROTOCOL__FLEXRAN_MESSAGE__MSG_ENB_CONFIG_REPLY_MSG; + (*msg)->msg_dir = PROTOCOL__FLEXRAN_DIRECTION__SUCCESSFUL_OUTCOME; + (*msg)->enb_config_reply_msg = enb_config_reply_msg; + + return 0; + + error: + // TODO: Need to make proper error handling + if (header != NULL) + free(header); + if (enb_config_reply_msg != NULL) + free(enb_config_reply_msg); + if(*msg != NULL) + free(*msg); + //LOG_E(FLEXRAN_AGENT, "%s: an error occured\n", __FUNCTION__); + return -1; +} + + + +/* + * timer primitives + */ + +//struct flexran_agent_map agent_map; +flexran_agent_timer_instance_t timer_instance; +int agent_timer_init = 0; +err_code_t flexran_agent_init_timer(void){ + + LOG_I(FLEXRAN_AGENT, "init RB tree\n"); + if (!agent_timer_init) { + RB_INIT(&timer_instance.flexran_agent_head); + agent_timer_init = 1; + } + + return PROTOCOL__FLEXRAN_ERR__NO_ERR; +} + +RB_GENERATE(flexran_agent_map, flexran_agent_timer_element_s, entry, flexran_agent_compare_timer); + +/* The timer_id might not be the best choice for the comparison */ +int flexran_agent_compare_timer(struct flexran_agent_timer_element_s *a, struct flexran_agent_timer_element_s *b){ + + if (a->timer_id < b->timer_id) return -1; + if (a->timer_id > b->timer_id) return 1; + + // equal timers + return 0; +} + +err_code_t flexran_agent_create_timer(uint32_t interval_sec, + uint32_t interval_usec, + agent_id_t agent_id, + instance_t instance, + uint32_t timer_type, + xid_t xid, + flexran_agent_timer_callback_t cb, + void* timer_args, + long *timer_id){ + + struct flexran_agent_timer_element_s *e = calloc(1, sizeof(*e)); + DevAssert(e != NULL); + +//uint32_t timer_id; + int ret=-1; + + if ((interval_sec == 0) && (interval_usec == 0 )) + return TIMER_NULL; + + if (timer_type >= FLEXRAN_AGENT_TIMER_TYPE_MAX) + return TIMER_TYPE_INVALIDE; + + if (timer_type == FLEXRAN_AGENT_TIMER_TYPE_ONESHOT){ + ret = timer_setup(interval_sec, + interval_usec, + TASK_FLEXRAN_AGENT, + instance, + TIMER_ONE_SHOT, + timer_args, + timer_id); + + e->type = TIMER_ONE_SHOT; + } + else if (timer_type == FLEXRAN_AGENT_TIMER_TYPE_PERIODIC ){ + ret = timer_setup(interval_sec, + interval_usec, + TASK_FLEXRAN_AGENT, + instance, + TIMER_PERIODIC, + timer_args, + timer_id); + + e->type = TIMER_PERIODIC; + } + + if (ret < 0 ) { + return TIMER_SETUP_FAILED; + } + + e->agent_id = agent_id; + e->instance = instance; + e->state = FLEXRAN_AGENT_TIMER_STATE_ACTIVE; + e->timer_id = *timer_id; + e->xid = xid; + e->timer_args = timer_args; + e->cb = cb; + /*element should be a real pointer*/ + RB_INSERT(flexran_agent_map, &timer_instance.flexran_agent_head, e); + + LOG_I(FLEXRAN_AGENT,"Created a new timer with id 0x%lx for agent %d, instance %d \n", + e->timer_id, e->agent_id, e->instance); + + return 0; +} + +err_code_t flexran_agent_destroy_timer(long timer_id){ + + struct flexran_agent_timer_element_s *e = get_timer_entry(timer_id); + + if (e != NULL ) { + RB_REMOVE(flexran_agent_map, &timer_instance.flexran_agent_head, e); + flexran_agent_destroy_flexran_message(e->timer_args->msg); + free(e); + } + + if (timer_remove(timer_id) < 0 ) + goto error; + + return 0; + + error: + LOG_E(FLEXRAN_AGENT, "timer can't be removed\n"); + return TIMER_REMOVED_FAILED ; +} + +err_code_t flexran_agent_destroy_timer_by_task_id(xid_t xid) { + struct flexran_agent_timer_element_s *e = NULL; + long timer_id; + RB_FOREACH(e, flexran_agent_map, &timer_instance.flexran_agent_head) { + if (e->xid == xid) { + timer_id = e->timer_id; + RB_REMOVE(flexran_agent_map, &timer_instance.flexran_agent_head, e); + flexran_agent_destroy_flexran_message(e->timer_args->msg); + free(e); + if (timer_remove(timer_id) < 0 ) { + goto error; + } + } + } + return 0; + + error: + LOG_E(FLEXRAN_AGENT, "timer can't be removed\n"); + return TIMER_REMOVED_FAILED ; +} + +err_code_t flexran_agent_destroy_timers(void){ + + struct flexran_agent_timer_element_s *e = NULL; + + RB_FOREACH(e, flexran_agent_map, &timer_instance.flexran_agent_head) { + RB_REMOVE(flexran_agent_map, &timer_instance.flexran_agent_head, e); + timer_remove(e->timer_id); + flexran_agent_destroy_flexran_message(e->timer_args->msg); + free(e); + } + + return 0; + +} + +void flexran_agent_sleep_until(struct timespec *ts, int delay) { + ts->tv_nsec += delay; + if(ts->tv_nsec >= 1000*1000*1000){ + ts->tv_nsec -= 1000*1000*1000; + ts->tv_sec++; + } + clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, ts, NULL); +} + + +err_code_t flexran_agent_stop_timer(long timer_id){ + + struct flexran_agent_timer_element_s *e=NULL; + struct flexran_agent_timer_element_s search; + memset(&search, 0, sizeof(struct flexran_agent_timer_element_s)); + search.timer_id = timer_id; + + e = RB_FIND(flexran_agent_map, &timer_instance.flexran_agent_head, &search); + + if (e != NULL ) { + e->state = FLEXRAN_AGENT_TIMER_STATE_STOPPED; + } + + timer_remove(timer_id); + + return 0; +} + +struct flexran_agent_timer_element_s * get_timer_entry(long timer_id) { + + struct flexran_agent_timer_element_s search; + memset(&search, 0, sizeof(struct flexran_agent_timer_element_s)); + search.timer_id = timer_id; + + return RB_FIND(flexran_agent_map, &timer_instance.flexran_agent_head, &search); +} diff --git a/openair2/ENB_APP/flexran_agent_common.h b/openair2/ENB_APP/flexran_agent_common.h new file mode 100644 index 0000000000..7ab89acb4b --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_common.h @@ -0,0 +1,502 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_common.h + * \brief common message primitves and utilities + * \author Xenofon Foukas, Mohamed Kassem and Navid Nikaein + * \date 2016 + * \version 0.1 + */ + + + +#ifndef FLEXRAN_AGENT_COMMON_H_ +#define FLEXRAN_AGENT_COMMON_H_ + +#include + +#include "header.pb-c.h" +#include "flexran.pb-c.h" +#include "stats_messages.pb-c.h" +#include "stats_common.pb-c.h" + +#include "flexran_agent_defs.h" +#include "enb_config.h" + +#include "LAYER2/MAC/extern.h" +#include "LAYER2/RLC/rlc.h" + +# include "tree.h" +# include "intertask_interface.h" +# include "timer.h" + +#define FLEXRAN_VERSION 0 + +typedef int (*flexran_agent_message_decoded_callback)( + mid_t mod_id, + const void *params, + Protocol__FlexranMessage **msg +); + +typedef int (*flexran_agent_message_destruction_callback)( + Protocol__FlexranMessage *msg +); + +/********************************** + * FlexRAN protocol messages helper + * functions and generic handlers + **********************************/ + +/* Helper functions for message (de)serialization */ +int flexran_agent_serialize_message(Protocol__FlexranMessage *msg, void **buf, int *size); +int flexran_agent_deserialize_message(void *data, int size, Protocol__FlexranMessage **msg); + +/* Serialize message and then destroy the input flexran msg. Should be called when protocol + message is created dynamically */ +void * flexran_agent_pack_message(Protocol__FlexranMessage *msg, + int * size); + +/* Calls destructor of the given message */ +err_code_t flexran_agent_destroy_flexran_message(Protocol__FlexranMessage *msg); + +/* Function to create the header for any FlexRAN protocol message */ +int flexran_create_header(xid_t xid, Protocol__FlexType type, Protocol__FlexHeader **header); + +/* Hello protocol message constructor and destructor */ +int flexran_agent_hello(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); +int flexran_agent_destroy_hello(Protocol__FlexranMessage *msg); + +/* Echo request protocol message constructor and destructor */ +int flexran_agent_echo_request(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); +int flexran_agent_destroy_echo_request(Protocol__FlexranMessage *msg); + +/* Echo reply protocol message constructor and destructor */ +int flexran_agent_echo_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); +int flexran_agent_destroy_echo_reply(Protocol__FlexranMessage *msg); + +/* eNodeB configuration reply message constructor and destructor */ +int flexran_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); +int flexran_agent_destroy_enb_config_reply(Protocol__FlexranMessage *msg); + +/* UE configuration reply message constructor and destructor */ +int flexran_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); +int flexran_agent_destroy_ue_config_reply(Protocol__FlexranMessage *msg); + +/* Logical channel reply configuration message constructor and destructor */ +int flexran_agent_lc_config_reply(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); +int flexran_agent_destroy_lc_config_reply(Protocol__FlexranMessage *msg); + +/* eNodeB configuration request message constructor and destructor */ +int flexran_agent_enb_config_request(mid_t mod_id, const void* params, Protocol__FlexranMessage **msg); +int flexran_agent_destroy_enb_config_request(Protocol__FlexranMessage *msg); + +/* UE configuration request message constructor */ +/* TODO: Need to define and implement destructor */ +int flexran_agent_destroy_ue_config_request(Protocol__FlexranMessage *msg); + +/* Logical channel configuration request message constructor */ +/* TODO: Need to define and implement destructor */ +int flexran_agent_destroy_lc_config_request(Protocol__FlexranMessage *msg); + +/* UE state change message constructor and destructor */ +int flexran_agent_ue_state_change(mid_t mod_id, uint32_t rnti, uint8_t state_change); +int flexran_agent_destroy_ue_state_change(Protocol__FlexranMessage *msg); + +/* Control delegation message constructor and destructor */ +int flexran_agent_control_delegation(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); +int flexran_agent_destroy_control_delegation(Protocol__FlexranMessage *msg); + +/* Policy reconfiguration message constructor and destructor */ +int flexran_agent_reconfiguration(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); +int flexran_agent_destroy_agent_reconfiguration(Protocol__FlexranMessage *msg); + +/* FlexRAN protocol message dispatcher function */ +Protocol__FlexranMessage* flexran_agent_handle_message (mid_t mod_id, + uint8_t *data, + uint32_t size); + +/* Function to be used to send a message to a dispatcher once the appropriate event is triggered. */ +Protocol__FlexranMessage *flexran_agent_handle_timed_task(void *args); + + + + +/**************************** + * get generic info from RAN + ****************************/ + +void flexran_set_enb_vars(mid_t mod_id, ran_name_t ran); + +int flexran_get_current_time_ms (mid_t mod_id, int subframe_flag); + +/*Return the current frame number + *Could be using implementation specific numbering of frames + */ +unsigned int flexran_get_current_frame(mid_t mod_id); + +/*Return the current SFN (0-1023)*/ +unsigned int flexran_get_current_system_frame_num(mid_t mod_id); + +unsigned int flexran_get_current_subframe(mid_t mod_id); + +/*Return the frame and subframe number in compact 16-bit format. + Bits 0-3 subframe, rest for frame. Required by FlexRAN protocol*/ +uint16_t flexran_get_sfn_sf (mid_t mod_id); + +/* Return a future frame and subframe number that is ahead_of_time + subframes later in compact 16-bit format. Bits 0-3 subframe, + rest for frame */ +uint16_t flexran_get_future_sfn_sf(mid_t mod_id, int ahead_of_time); + +/* Return the number of attached UEs */ +int flexran_get_num_ues(mid_t mod_id); + +/* Get the rnti of a UE with id ue_id */ +int flexran_get_ue_crnti (mid_t mod_id, mid_t ue_id); + +/* Get the RLC buffer status report of a ue for a designated + logical channel id */ +int flexran_get_ue_bsr (mid_t mod_id, mid_t ue_id, lcid_t lcid); + +/* Get power headroom of UE with id ue_id */ +int flexran_get_ue_phr (mid_t mod_id, mid_t ue_id); + +/* Get the UE wideband CQI */ +int flexran_get_ue_wcqi (mid_t mod_id, mid_t ue_id); + +/* Get the transmission queue size for a UE with a channel_id logical channel id */ +int flexran_get_tx_queue_size(mid_t mod_id, mid_t ue_id, logical_chan_id_t channel_id); + +/* Get the head of line delay for a UE with a channel_id logical channel id */ +int flexran_get_hol_delay(mid_t mod_id, mid_t ue_id, logical_chan_id_t channel_id); + +/* Check the status of the timing advance for a UE */ +short flexran_get_TA(mid_t mod_id, mid_t ue_id, int CC_id); + +/* Update the timing advance status (find out whether a timing advance command is required) */ +void flexran_update_TA(mid_t mod_id, mid_t ue_id, int CC_id); + +/* Return timing advance MAC control element for a designated cell and UE */ +int flexran_get_MAC_CE_bitmap_TA(mid_t mod_id, mid_t ue_id, int CC_id); + +/* Get the number of active component carriers for a specific UE */ +int flexran_get_active_CC(mid_t mod_id, mid_t ue_id); + +/* Get the rank indicator for a designated cell and UE */ +int flexran_get_current_RI(mid_t mod_id, mid_t ue_id, int CC_id); + +/* See TS 36.213, section 10.1 */ +int flexran_get_n1pucch_an(mid_t mod_id, int CC_id); + +/* See TS 36.211, section 5.4 */ +int flexran_get_nRB_CQI(mid_t mod_id, int CC_id); + +/* See TS 36.211, section 5.4 */ +int flexran_get_deltaPUCCH_Shift(mid_t mod_id, int CC_id); + +/* See TS 36.211, section 5.7.1 */ +int flexran_get_prach_ConfigIndex(mid_t mod_id, int CC_id); + +/* See TS 36.211, section 5.7.1 */ +int flexran_get_prach_FreqOffset(mid_t mod_id, int CC_id); + +/* See TS 36.321 */ +int flexran_get_maxHARQ_Msg3Tx(mid_t mod_id, int CC_id); + +/* Get the length of the UL cyclic prefix */ +int flexran_get_ul_cyclic_prefix_length(mid_t mod_id, int CC_id); + +/* Get the length of the DL cyclic prefix */ +int flexran_get_dl_cyclic_prefix_length(mid_t mod_id, int CC_id); + +/* Get the physical cell id of a cell */ +int flexran_get_cell_id(mid_t mod_id, int CC_id); + +/* See TS 36.211, section 5.5.3.2 */ +int flexran_get_srs_BandwidthConfig(mid_t mod_id, int CC_id); + +/* See TS 36.211, table 5.5.3.3-1 and 2 */ +int flexran_get_srs_SubframeConfig(mid_t mod_id, int CC_id); + +/* Boolean value. See TS 36.211, + section 5.5.3.2. TDD only */ +int flexran_get_srs_MaxUpPts(mid_t mod_id, int CC_id); + +/* Get number of DL resource blocks */ +int flexran_get_N_RB_DL(mid_t mod_id, int CC_id); + +/* Get number of UL resource blocks */ +int flexran_get_N_RB_UL(mid_t mod_id, int CC_id); + +/* Get number of resource block groups */ +int flexran_get_N_RBG(mid_t mod_id, int CC_id); + +/* Get DL/UL subframe assignment. TDD only */ +int flexran_get_subframe_assignment(mid_t mod_id, int CC_id); + +/* TDD only. See TS 36.211, table 4.2.1 */ +int flexran_get_special_subframe_assignment(mid_t mod_id, int CC_id); + +/* Get the duration of the random access response window in subframes */ +int flexran_get_ra_ResponseWindowSize(mid_t mod_id, int CC_id); + +/* Get timer used for random access */ +int flexran_get_mac_ContentionResolutionTimer(mid_t mod_id, int CC_id); + +/* Get type of duplex mode (FDD/TDD) */ +int flexran_get_duplex_mode(mid_t mod_id, int CC_id); + +/* Get the SI window length */ +long flexran_get_si_window_length(mid_t mod_id, int CC_id); + +/* Get the number of PDCCH symbols configured for the cell */ +int flexran_get_num_pdcch_symb(mid_t mod_id, int CC_id); + +/* See TS 36.213, sec 5.1.1.1 */ +int flexran_get_tpc(mid_t mod_id, mid_t ue_id); + +/* Get the first available HARQ process for a specific cell and UE during + a designated frame and subframe. Returns 0 for success. The id and the + status of the HARQ process are stored in id and status respectively */ +int flexran_get_harq(const mid_t mod_id, const uint8_t CC_id, const mid_t ue_id, + const int frame, const uint8_t subframe, unsigned char *id, unsigned char *round); + +/* Uplink power control management*/ +int flexran_get_p0_pucch_dbm(mid_t mod_id, mid_t ue_id, int CC_id); + +int flexran_get_p0_nominal_pucch(mid_t mod_id, int CC_id); + +int flexran_get_p0_pucch_status(mid_t mod_id, mid_t ue_id, int CC_id); + +int flexran_update_p0_pucch(mid_t mod_id, mid_t ue_id, int CC_id); + + +/* + * ************************************ + * Get Messages for UE Configuration Reply + * ************************************ + */ + +/* Get timer in subframes. Controls the synchronization + status of the UE, not the actual timing + advance procedure. See TS 36.321 */ +int flexran_get_time_alignment_timer(mid_t mod_id, mid_t ue_id); + +/* Get measurement gap configuration. See TS 36.133 */ +int flexran_get_meas_gap_config(mid_t mod_id, mid_t ue_id); + +/* Get measurement gap configuration offset if applicable */ +int flexran_get_meas_gap_config_offset(mid_t mod_id, mid_t ue_id); + +/* DL aggregated bit-rate of non-gbr bearer + per UE. See TS 36.413 */ +int flexran_get_ue_aggregated_max_bitrate_dl (mid_t mod_id, mid_t ue_id); + +/* UL aggregated bit-rate of non-gbr bearer + per UE. See TS 36.413 */ +int flexran_get_ue_aggregated_max_bitrate_ul (mid_t mod_id, mid_t ue_id); + +/* Only half-duplex support. FDD + operation. Boolean value */ +int flexran_get_half_duplex(mid_t ue_id); + +/* Support of intra-subframe hopping. + Boolean value */ +int flexran_get_intra_sf_hopping(mid_t ue_id); + +/* UE support for type 2 hopping with + n_sb>1 */ +int flexran_get_type2_sb_1(mid_t ue_id); + +/* Get the UE category */ +int flexran_get_ue_category(mid_t ue_id); + +/* UE support for resource allocation + type 1 */ +int flexran_get_res_alloc_type1(mid_t ue_id); + +/* Get UE transmission mode */ +int flexran_get_ue_transmission_mode(mid_t mod_id, mid_t ue_id); + +/* Boolean value. See TS 36.321 */ +int flexran_get_tti_bundling(mid_t mod_id, mid_t ue_id); + +/* The max HARQ retransmission for UL. + See TS 36.321 */ +int flexran_get_maxHARQ_TX(mid_t mod_id, mid_t ue_id); + +/* See TS 36.213 */ +int flexran_get_beta_offset_ack_index(mid_t mod_id, mid_t ue_id); + +/* See TS 36.213 */ +int flexran_get_beta_offset_ri_index(mid_t mod_id, mid_t ue_id); + +/* See TS 36.213 */ +int flexran_get_beta_offset_cqi_index(mid_t mod_id, mid_t ue_id); + +/* Boolean. See TS36.213, Section 10.1 */ +int flexran_get_simultaneous_ack_nack_cqi(mid_t mod_id, mid_t ue_id); + +/* Boolean. See TS 36.213, Section 8.2 */ +int flexran_get_ack_nack_simultaneous_trans(mid_t mod_id,mid_t ue_id); + +/* Get aperiodic CQI report mode */ +int flexran_get_aperiodic_cqi_rep_mode(mid_t mod_id,mid_t ue_id); + +/* Get ACK/NACK feedback mode. TDD only */ +int flexran_get_tdd_ack_nack_feedback(mid_t mod_id, mid_t ue_id); + +/* See TS36.213, section 10.1 */ +int flexran_get_ack_nack_repetition_factor(mid_t mod_id, mid_t ue_id); + +/* Boolean. Extended buffer status report size */ +int flexran_get_extended_bsr_size(mid_t mod_id, mid_t ue_id); + +/* Get number of UE transmission antennas */ +int flexran_get_ue_transmission_antenna(mid_t mod_id, mid_t ue_id); + +/* Get logical channel group of a channel with id lc_id */ +int flexran_get_lcg(mid_t ue_id, mid_t lc_id); + +/* Get direction of logical channel with id lc_id */ +int flexran_get_direction(mid_t ue_id, mid_t lc_id); + +/******************* + * timer primitves + *******************/ + +#define TIMER_NULL -1 +#define TIMER_TYPE_INVALIDE -2 +#define TIMER_SETUP_FAILED -3 +#define TIMER_REMOVED_FAILED -4 +#define TIMER_ELEMENT_NOT_FOUND -5 + + +/* Type of the callback executed when the timer expired */ +typedef Protocol__FlexranMessage *(*flexran_agent_timer_callback_t)(void*); + +typedef enum { + /* oneshot timer: */ + FLEXRAN_AGENT_TIMER_TYPE_ONESHOT = 0x0, + + /* periodic timer */ + FLEXRAN_AGENT_TIMER_TYPE_PERIODIC = 0x1, + + /* Inactive state: initial state for any timer. */ + FLEXRAN_AGENT_TIMER_TYPE_EVENT_DRIVEN = 0x2, + + /* Max number of states available */ + FLEXRAN_AGENT_TIMER_TYPE_MAX, +} flexran_agent_timer_type_t; + +typedef enum { + /* Inactive state: initial state for any timer. */ + FLEXRAN_AGENT_TIMER_STATE_INACTIVE = 0x0, + + /* Inactive state: initial state for any timer. */ + FLEXRAN_AGENT_TIMER_STATE_ACTIVE = 0x1, + + /* Inactive state: initial state for any timer. */ + FLEXRAN_AGENT_TIMER_STATE_STOPPED = 0x2, + + /* Max number of states available */ + FLEXRAN_AGENT_TIMER_STATE_MAX, +} flexran_agent_timer_state_t; + +typedef struct flexran_agent_timer_args_s{ + mid_t mod_id; + Protocol__FlexranMessage *msg; +} flexran_agent_timer_args_t; + + + +typedef struct flexran_agent_timer_element_s{ + RB_ENTRY(flexran_agent_timer_element_s) entry; + + agent_id_t agent_id; + instance_t instance; + + flexran_agent_timer_type_t type; + flexran_agent_timer_state_t state; + + uint32_t interval_sec; + uint32_t interval_usec; + + long timer_id; /* Timer id returned by the timer API*/ + xid_t xid; /*The id of the task as received by the controller + message*/ + + flexran_agent_timer_callback_t cb; + flexran_agent_timer_args_t *timer_args; + +} flexran_agent_timer_element_t; + +typedef struct flexran_agent_timer_instance_s{ + RB_HEAD(flexran_agent_map, flexran_agent_timer_element_s) flexran_agent_head; +}flexran_agent_timer_instance_t; + + +err_code_t flexran_agent_init_timer(void); + +/* Create a timer for some agent related event with id xid. Will store the id + of the generated timer in timer_id */ +err_code_t flexran_agent_create_timer(uint32_t interval_sec, + uint32_t interval_usec, + agent_id_t agent_id, + instance_t instance, + uint32_t timer_type, + xid_t xid, + flexran_agent_timer_callback_t cb, + void* timer_args, + long *timer_id); + +/* Destroy all existing timers */ +err_code_t flexran_agent_destroy_timers(void); + +/* Destroy the timer with the given timer_id */ +err_code_t flexran_agent_destroy_timer(long timer_id); + +/* Destroy the timer for task with id xid */ +err_code_t flexran_agent_destroy_timer_by_task_id(xid_t xid); + +/* Stop a timer */ +err_code_t flexran_agent_stop_timer(long timer_id); + +/* Restart the given timer */ +err_code_t flexran_agent_restart_timer(long *timer_id); + +/* Find the timer with the given timer_id */ +struct flexran_agent_timer_element_s * get_timer_entry(long timer_id); + +/* Obtain the protocol message stored in the given expired timer */ +Protocol__FlexranMessage * flexran_agent_process_timeout(long timer_id, void* timer_args); + +/* Comparator function comparing two timers. Decides the ordering of the timers */ +int flexran_agent_compare_timer(struct flexran_agent_timer_element_s *a, struct flexran_agent_timer_element_s *b); + +/*Specify a delay in nanoseconds to timespec and sleep until then*/ +void flexran_agent_sleep_until(struct timespec *ts, int delay); + +/* RB_PROTOTYPE is for .h files */ +RB_PROTOTYPE(flexran_agent_map, flexran_agent_timer_element_s, entry, flexran_agent_compare_timer); + + +#endif diff --git a/openair2/ENB_APP/flexran_agent_common_internal.c b/openair2/ENB_APP/flexran_agent_common_internal.c new file mode 100644 index 0000000000..240856b948 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_common_internal.c @@ -0,0 +1,391 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_common_internal.c + * \brief internal functions for common message primitves and utilities + * \author Xenofon Foukas + * \date 2016 + * \version 0.1 + */ + +#include +#include + +#include "flexran_agent_common_internal.h" +#include "flexran_agent_mac_internal.h" + +int apply_reconfiguration_policy(mid_t mod_id, const char *policy, size_t policy_length) { + + yaml_parser_t parser; + yaml_event_t event; + + int done = 0; + + LOG_I(ENB_APP, "Time to apply a new policy \n"); + + yaml_parser_initialize(&parser); + + yaml_parser_set_input_string(&parser, (unsigned char *) policy, strlen(policy)); + + while (!done) { + if (!yaml_parser_parse(&parser, &event)) + goto error; + + switch (event.type) { + case YAML_STREAM_START_EVENT: + break; + case YAML_STREAM_END_EVENT: + break; + case YAML_DOCUMENT_START_EVENT: + break; + case YAML_DOCUMENT_END_EVENT: + break; + case YAML_MAPPING_START_EVENT: + break; + case YAML_MAPPING_END_EVENT: + break; + case YAML_SCALAR_EVENT: + // Check the system name and call the proper handler + if (strcmp((char *) event.data.scalar.value, "mac") == 0) { + LOG_D(ENB_APP, "This is intended for the mac system\n"); + // Call the mac handler + if (parse_mac_config(mod_id, &parser) == -1) { + goto error; + } + } else if (strcmp((char *) event.data.scalar.value, "rlc") == 0) { + // Call the RLC handler + LOG_D(ENB_APP, "This is intended for the rlc system\n"); + // TODO : Just skip it for now + if (skip_system_section(&parser) == -1) { + goto error; + } + } else if (strcmp((char *) event.data.scalar.value, "pdcp") == 0) { + // Call the PDCP handler + LOG_D(ENB_APP, "This is intended for the pdcp system\n"); + // TODO : Just skip it for now + if (skip_system_section(&parser) == -1) { + goto error; + } + } else if (strcmp((char *) event.data.scalar.value, "rrc") == 0) { + // Call the RRC handler + LOG_D(ENB_APP, "This is intended for the rrc system\n"); + // TODO : Just skip it for now + if (skip_system_section(&parser) == -1) { + goto error; + } + } else { + goto error; + } + break; + default: + // We are not expecting to find any other type of event at this level + // of the hierarchy + yaml_event_delete(&event); + goto error; + } + + done = (event.type == YAML_STREAM_END_EVENT); + + yaml_event_delete(&event); + } + + return 0; + + error: + yaml_parser_delete(&parser); + return -1; + +} + +int skip_system_section(yaml_parser_t *parser) { + yaml_event_t event; + + int done = 0; + + int sequence_started = 0; + int mapping_started = 0; + + while (!done) { + if (!yaml_parser_parse(parser, &event)) + goto error; + + switch (event.type) { + + case YAML_SEQUENCE_START_EVENT: + LOG_D(ENB_APP, "A sequence just started as expected\n"); + sequence_started = 1; + break; + case YAML_SEQUENCE_END_EVENT: + LOG_D(ENB_APP, "A sequence ended\n"); + sequence_started = 0; + break; + case YAML_MAPPING_START_EVENT: + if (!sequence_started) { + goto error; + } + LOG_D(ENB_APP, "A mapping started\n"); + mapping_started = 1; + break; + case YAML_MAPPING_END_EVENT: + if (!mapping_started) { + goto error; + } + LOG_D(ENB_APP, "A mapping ended\n"); + mapping_started = 0; + break; + case YAML_SCALAR_EVENT: + if (!mapping_started) { + goto error; + } + // Entered a subsystem section. Let's skip it + if (skip_subsystem_section(parser) == -1) { + goto error; + } + default: + break; + } + done = (event.type == YAML_SEQUENCE_END_EVENT); + + yaml_event_delete(&event); + + } + + return 0; + + error: + yaml_event_delete(&event); + return -1; +} + +int skip_subsystem_section(yaml_parser_t *parser) { + + yaml_event_t event; + + int done = 0; + int mapping_started = 0; + + while (!done) { + if (!yaml_parser_parse(parser, &event)) + goto error; + + switch (event.type) { + case YAML_MAPPING_START_EVENT: + LOG_D(ENB_APP, "The mapping of the subsystem started\n"); + mapping_started = 1; + break; + case YAML_MAPPING_END_EVENT: + LOG_D(ENB_APP, "The mapping of the subsystem ended\n"); + mapping_started = 0; + break; + case YAML_SCALAR_EVENT: + if (!mapping_started) { + goto error; + } + // Check what key needs to be set + if (strcmp((char *) event.data.scalar.value, "behavior") == 0) { + LOG_D(ENB_APP, "Skipping the behavior attribute\n"); + yaml_event_delete(&event); + if (!yaml_parser_parse(parser, &event)) { + goto error; + } + if (event.type == YAML_SCALAR_EVENT) { + break; + } else { + goto error; + } + } else if (strcmp((char *) event.data.scalar.value, "parameters") == 0) { + LOG_D(ENB_APP, "Skipping the parameters for this subsystem\n"); + if (skip_subsystem_parameters_config(parser) == -1) { + goto error; + } + } + break; + default: + goto error; + } + + done = (event.type == YAML_MAPPING_END_EVENT); + yaml_event_delete(&event); + } + + return 0; + + error: + yaml_event_delete(&event); + return -1; +} + +int skip_subsystem_parameters_config(yaml_parser_t *parser) { + yaml_event_t event; + + int done = 0; + int mapping_started = 0; + + while (!done) { + + if (!yaml_parser_parse(parser, &event)) + goto error; + + switch (event.type) { + // We are expecting a mapping of parameters + case YAML_MAPPING_START_EVENT: + LOG_D(ENB_APP, "The mapping of the parameters started\n"); + mapping_started = 1; + break; + case YAML_MAPPING_END_EVENT: + LOG_D(ENB_APP, "The mapping of the parameters ended\n"); + mapping_started = 0; + break; + case YAML_SCALAR_EVENT: + if (!mapping_started) { + goto error; + } + // Check what key needs to be set + LOG_D(ENB_APP, "Skipping parameter %s\n", event.data.scalar.value); + if (skip_parameter_modification(parser) == -1 ) { + goto error; + } + break; + default: + goto error; + } + + done = (event.type == YAML_MAPPING_END_EVENT); + yaml_event_delete(&event); + } + + return 0; + + error: + yaml_event_delete(&event); + return -1; +} + + +int skip_parameter_modification(yaml_parser_t *parser) { + yaml_event_t event; + + int done = 0; + int is_array = 0; + int i = 0; + + while (!done) { + if (!yaml_parser_parse(parser, &event)) { + goto error; + } + + // Expecting either a scalar or a sequence + switch (event.type) { + case YAML_SEQUENCE_START_EVENT: + is_array = 1; + break; + case YAML_SCALAR_EVENT: + if ((strcmp((char *) event.data.scalar.tag, YAML_INT_TAG) == 0) || + (strcmp((char *) event.data.scalar.tag, YAML_FLOAT_TAG) == 0) || + (strcmp((char *) event.data.scalar.tag, YAML_STR_TAG) == 0) || + (strcmp((char *) event.data.scalar.tag, YAML_BOOL_TAG) == 0)) { + // Do nothing + } else { + // No other type is supported at the moment, so it should be considered an error + // if we reach here + goto error; + } + if (is_array) { + i++; + } else { + done = 1; + } + break; + case YAML_SEQUENCE_END_EVENT: + done = 1; + break; + default: + goto error; + } + yaml_event_delete(&event); + } + + return 0; + + error: + yaml_event_delete(&event); + return -1; +} + +int apply_parameter_modification(void *parameter, yaml_parser_t *parser) { + yaml_event_t event; + + int done = 0; + int is_array = 0; + int i = 0; + + char *endptr; + + while (!done) { + if (!yaml_parser_parse(parser, &event)) { + goto error; + } + + // Expecting either a scalar or a sequence + switch (event.type) { + case YAML_SEQUENCE_START_EVENT: + is_array = 1; + break; + case YAML_SCALAR_EVENT: + if (strcmp((char *) event.data.scalar.tag, YAML_INT_TAG) == 0) { + ((int *) parameter)[i] = strtol((char *) event.data.scalar.value, &endptr, 10); + } else if (strcmp((char *) event.data.scalar.tag, YAML_FLOAT_TAG) == 0) { + ((float *) parameter)[i] = strtof((char *) event.data.scalar.value, &endptr); + } else if (strcmp((char *) event.data.scalar.tag, YAML_STR_TAG) == 0) { + strncpy(&((char *) parameter)[i], (char *) event.data.scalar.value, event.data.scalar.length); + } else if (strcmp((char *) event.data.scalar.tag, YAML_BOOL_TAG) == 0) { + if (strcmp((char *) event.data.scalar.value, "true") == 0) { + ((int *) parameter)[i] = 1; + } else { + ((int *) parameter)[i] = 0; + } + } else { + // No other type is supported at the moment, so it should be considered an error + // if we reach here + goto error; + } + if (is_array) { + i++; + } else { + done = 1; + } + break; + case YAML_SEQUENCE_END_EVENT: + done = 1; + break; + default: + goto error; + } + yaml_event_delete(&event); + } + + return 0; + + error: + yaml_event_delete(&event); + return -1; + +} diff --git a/openair2/ENB_APP/flexran_agent_common_internal.h b/openair2/ENB_APP/flexran_agent_common_internal.h new file mode 100644 index 0000000000..d91c2dc7f6 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_common_internal.h @@ -0,0 +1,56 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_common_internal.h + * \brief internal agent functions for common message primitves and utilities + * \author Xenofon Foukas + * \date 2016 + * \version 0.1 + */ + +#ifndef FLEXRAN_AGENT_COMMON_INTERNAL_H_ +#define FLEXRAN_AGENT_COMMON_INTERNAL_H_ + +#include + +#include "flexran_agent_defs.h" + +int apply_reconfiguration_policy(mid_t mod_id, const char *policy, size_t policy_length); + +int apply_parameter_modification(void *parameter, yaml_parser_t *parser); + +// This can be used when parsing for a specific system that is not yet implmeneted +// in order to skip its configuration, without affecting the rest +int skip_system_section(yaml_parser_t *parser); + +// This can be used when parsing for a specific subsystem that is not yet implmeneted +// in order to skip its configuration, without affecting the rest +int skip_subsystem_section(yaml_parser_t *parser); + +// This can be used when parsing for the parameters of a specific subsystem +//that is not yet implmeneted in order to skip its configuration, without affecting the rest +int skip_subsystem_parameters_config(yaml_parser_t *parser); + +// This can be used when configuring the parameters of a specific subsystem +//that is not yet implmeneted in order to skip its configuration, without affecting the rest +int skip_parameter_modification(yaml_parser_t *parser); + +#endif diff --git a/openair2/ENB_APP/flexran_agent_defs.h b/openair2/ENB_APP/flexran_agent_defs.h new file mode 100644 index 0000000000..12e3c56dff --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_defs.h @@ -0,0 +1,125 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_defs.h + * \brief FlexRAN agent common definitions + * \author Navid Nikaein and Xenofon Foukas + * \date 2016 + * \version 0.1 + */ +#ifndef FLEXRAN_AGENT_DEFS_H_ +#define FLEXRAN_AGENT_DEFS_H_ + +#include +#include +#include +#include + +#include "link_manager.h" + +#define NUM_MAX_ENB 2 +#define NUM_MAX_UE 2048 +#define DEFAULT_FLEXRAN_AGENT_IPv4_ADDRESS "127.0.0.1" +#define DEFAULT_FLEXRAN_AGENT_PORT 2210 +#define DEFAULT_FLEXRAN_AGENT_CACHE "/mnt/oai_agent_cache" + +typedef enum { + + FLEXRAN_AGENT_DEFAULT=0, + + FLEXRAN_AGENT_PHY=1, + FLEXRAN_AGENT_MAC=2, + FLEXRAN_AGENT_RLC=3, + FLEXRAN_AGENT_PDCP=4, + FLEXRAN_AGENT_RRC=5, + FLEXRAN_AGENT_S1AP=6, + FLEXRAN_AGENT_GTP=7, + FLEXRAN_AGENT_X2AP=8, + + FLEXRAN_AGENT_MAX=9, + +} agent_id_t; + +typedef enum { + /* no action */ + FLEXRAN_AGENT_ACTION_NONE = 0x0, + + /* send action */ + FLEXRAN_AGENT_ACTION_SEND = 0x1, + + /* apply action */ + FLEXRAN_AGENT_ACTION_APPLY = 0x2, + + /* clear action */ + FLEXRAN_AGENT_ACTION_CLEAR = 0x4, + + /* write action */ + FLEXRAN_AGENT_ACTION_WRITE = 0x8, + + /* filter action */ + FLEXRAN_AGENT_ACTION_FILTER = 0x10, + + /* preprocess action */ + FLEXRAN_AGENT_ACTION_PREPROCESS = 0x20, + + /* meter action */ + FLEXRAN_AGENT_ACTION_METER = 0x40, + + /* Max number of states available */ + FLEXRAN_AGENT_ACTION_MAX = 0x7f, +} agent_action_t; + + +typedef enum { + + RAN_LTE_OAI= 0, + + /* Max number of states available */ + RAN_NAME_MAX = 0x7f, +} ran_name_t; + +typedef uint8_t xid_t; +typedef uint8_t mid_t; // module or enb id +typedef uint8_t lcid_t; +typedef int32_t err_code_t; + + + +typedef struct { + /* general info */ + + /* stats */ + + uint32_t total_rx_msg; + uint32_t total_tx_msg; + + uint32_t rx_msg[NUM_MAX_ENB]; + uint32_t tx_msg[NUM_MAX_ENB]; + +} flexran_agent_info_t; + +typedef struct { + mid_t enb_id; + flexran_agent_info_t agent_info; + +} flexran_agent_instance_t; + +#endif diff --git a/openair2/ENB_APP/flexran_agent_extern.h b/openair2/ENB_APP/flexran_agent_extern.h new file mode 100644 index 0000000000..6237f78367 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_extern.h @@ -0,0 +1,52 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file ENB_APP/extern.h + * \brief FlexRAN agent - mac interface primitives + * \author Xenofon Foukas + * \date 2016 + * \version 0.1 + * \mail x.foukas@sms.ed.ac.uk + */ + +#ifndef __FLEXRAN_AGENT_EXTERN_H__ +#define __FLEXRAN_AGENT_EXTERN_H__ + +#include "flexran_agent_defs.h" +#include "flexran_agent_mac_defs.h" + + +//extern msg_context_t shared_ctxt[NUM_MAX_ENB][FLEXRAN_AGENT_MAX]; + +/* full path of the local cache for storing VSFs */ +extern char local_cache[40]; + +/* Control module interface for the communication of the MAC Control Module with the agent */ +extern AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB]; + +/* Flag indicating whether the VSFs for the MAC control module have been registered */ +extern unsigned int mac_agent_registered[NUM_MAX_ENB]; + +/* Requried to know which UEs had a harq updated over some subframe */ +extern int harq_pid_updated[NUMBER_OF_UE_MAX][8]; +extern int harq_pid_round[NUMBER_OF_UE_MAX][8]; + +#endif diff --git a/openair2/ENB_APP/flexran_agent_handler.c b/openair2/ENB_APP/flexran_agent_handler.c new file mode 100644 index 0000000000..51188bea86 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_handler.c @@ -0,0 +1,189 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_handler.c + * \brief FlexRAN agent tx and rx message handler + * \author Xenofon Foukas and Navid Nikaein + * \date 2016 + * \version 0.1 + */ + + +#include "flexran_agent_common.h" +#include "flexran_agent_mac.h" +#include "log.h" + +#include "assertions.h" + +flexran_agent_message_decoded_callback agent_messages_callback[][3] = { + {flexran_agent_hello, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_HELLO_MSG*/ + {flexran_agent_echo_reply, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_ECHO_REQUEST_MSG*/ + {0, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_ECHO_REPLY_MSG*/ //Must add handler when receiving echo reply + {flexran_agent_mac_handle_stats, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_STATS_REQUEST_MSG*/ + {0, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_STATS_REPLY_MSG*/ + {0, 0, 0}, /*PROTOCOK__FLEXRAN_MESSAGE__MSG_SF_TRIGGER_MSG*/ + {0, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_UL_SR_INFO_MSG*/ + {flexran_agent_enb_config_reply, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_ENB_CONFIG_REQUEST_MSG*/ + {0, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_ENB_CONFIG_REPLY_MSG*/ + {flexran_agent_ue_config_reply, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_UE_CONFIG_REQUEST_MSG*/ + {0, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_UE_CONFIG_REPLY_MSG*/ + {flexran_agent_lc_config_reply, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_LC_CONFIG_REQUEST_MSG*/ + {0, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_LC_CONFIG_REPLY_MSG*/ + {flexran_agent_mac_handle_dl_mac_config, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_DL_MAC_CONFIG_MSG*/ + {0, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_UE_STATE_CHANGE_MSG*/ + {flexran_agent_control_delegation, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_CONTROL_DELEGATION_MSG*/ + {flexran_agent_reconfiguration, 0, 0}, /*PROTOCOL__FLEXRAN_MESSAGE__MSG_AGENT_RECONFIGURATION_MSG*/ +}; + +flexran_agent_message_destruction_callback message_destruction_callback[] = { + flexran_agent_destroy_hello, + flexran_agent_destroy_echo_request, + flexran_agent_destroy_echo_reply, + flexran_agent_mac_destroy_stats_request, + flexran_agent_mac_destroy_stats_reply, + flexran_agent_mac_destroy_sf_trigger, + flexran_agent_mac_destroy_sr_info, + flexran_agent_destroy_enb_config_request, + flexran_agent_destroy_enb_config_reply, + flexran_agent_destroy_ue_config_request, + flexran_agent_destroy_ue_config_reply, + flexran_agent_destroy_lc_config_request, + flexran_agent_destroy_lc_config_reply, + flexran_agent_mac_destroy_dl_config, + flexran_agent_destroy_ue_state_change, + flexran_agent_destroy_control_delegation, + flexran_agent_destroy_agent_reconfiguration, +}; + +/* static const char *flexran_agent_direction2String[] = { */ +/* "", /\* not_set *\/ */ +/* "originating message", /\* originating message *\/ */ +/* "successfull outcome", /\* successfull outcome *\/ */ +/* "unsuccessfull outcome", /\* unsuccessfull outcome *\/ */ +/* }; */ + + +Protocol__FlexranMessage* flexran_agent_handle_message (mid_t mod_id, + uint8_t *data, + uint32_t size){ + + Protocol__FlexranMessage *decoded_message, *reply_message; + err_code_t err_code; + DevAssert(data != NULL); + + if (flexran_agent_deserialize_message(data, size, &decoded_message) < 0) { + err_code= PROTOCOL__FLEXRAN_ERR__MSG_DECODING; + goto error; + } + + if ((decoded_message->msg_case > sizeof(agent_messages_callback) / (3 * sizeof(flexran_agent_message_decoded_callback))) || + (decoded_message->msg_dir > PROTOCOL__FLEXRAN_DIRECTION__UNSUCCESSFUL_OUTCOME)){ + err_code= PROTOCOL__FLEXRAN_ERR__MSG_NOT_HANDLED; + goto error; + } + + if (agent_messages_callback[decoded_message->msg_case-1][decoded_message->msg_dir-1] == NULL) { + err_code= PROTOCOL__FLEXRAN_ERR__MSG_NOT_SUPPORTED; + goto error; + + } + + err_code = ((*agent_messages_callback[decoded_message->msg_case-1][decoded_message->msg_dir-1])(mod_id, (void *) decoded_message, &reply_message)); + if ( err_code < 0 ){ + goto error; + } else if (err_code == 1) { //If err_code > 1, we do not want to dispose the message yet + protocol__flexran_message__free_unpacked(decoded_message, NULL); + } + return reply_message; + +error: + LOG_E(FLEXRAN_AGENT,"errno %d occured\n",err_code); + return NULL; + +} + + + +void * flexran_agent_pack_message(Protocol__FlexranMessage *msg, + int * size){ + + void * buffer; + err_code_t err_code = PROTOCOL__FLEXRAN_ERR__NO_ERR; + + if (flexran_agent_serialize_message(msg, &buffer, size) < 0 ) { + err_code = PROTOCOL__FLEXRAN_ERR__MSG_ENCODING; + goto error; + } + + // free the msg --> later keep this in the data struct and just update the values + //TODO call proper destroy function + err_code = ((*message_destruction_callback[msg->msg_case-1])(msg)); + + DevAssert(buffer !=NULL); + + LOG_D(FLEXRAN_AGENT,"Serilized the enb mac stats reply (size %d)\n", *size); + + return buffer; + + error : + LOG_E(FLEXRAN_AGENT,"errno %d occured\n",err_code); + + return NULL; +} + +Protocol__FlexranMessage *flexran_agent_handle_timed_task(void *args) { + err_code_t err_code; + flexran_agent_timer_args_t *timer_args = (flexran_agent_timer_args_t *) args; + + Protocol__FlexranMessage *timed_task, *reply_message; + timed_task = timer_args->msg; + err_code = ((*agent_messages_callback[timed_task->msg_case-1][timed_task->msg_dir-1])(timer_args->mod_id, (void *) timed_task, &reply_message)); + if ( err_code < 0 ){ + goto error; + } + + return reply_message; + + error: + LOG_E(FLEXRAN_AGENT,"errno %d occured\n",err_code); + return NULL; +} + +Protocol__FlexranMessage* flexran_agent_process_timeout(long timer_id, void* timer_args){ + + struct flexran_agent_timer_element_s *found = get_timer_entry(timer_id); + + if (found == NULL ) goto error; + LOG_D(FLEXRAN_AGENT, "Found the entry (%p): timer_id is 0x%lx 0x%lx\n", found, timer_id, found->timer_id); + + if (timer_args == NULL) + LOG_W(FLEXRAN_AGENT,"null timer args\n"); + + return found->cb(timer_args); + + error: + LOG_E(FLEXRAN_AGENT, "can't get the timer element\n"); + return NULL; +} + +err_code_t flexran_agent_destroy_flexran_message(Protocol__FlexranMessage *msg) { + return ((*message_destruction_callback[msg->msg_case-1])(msg)); +} diff --git a/openair2/ENB_APP/flexran_agent_net_comm.c b/openair2/ENB_APP/flexran_agent_net_comm.c new file mode 100644 index 0000000000..e644251209 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_net_comm.c @@ -0,0 +1,192 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_net_comm.c + * \brief FlexRAN agent network interface abstraction + * \author Xenofon Foukas + * \date 2016 + * \version 0.1 + */ + +#include "flexran_agent_net_comm.h" +#include "log.h" + +flexran_agent_channel_t *agent_channel[NUM_MAX_ENB][FLEXRAN_AGENT_MAX]; +flexran_agent_channel_instance_t channel_instance; +int flexran_agent_channel_id = 0; + +int flexran_agent_msg_send(mid_t mod_id, agent_id_t agent_id, void *data, int size, int priority) { + /*Check if agent id is valid*/ + if (agent_id >= FLEXRAN_AGENT_MAX || agent_id < 0) { + goto error; + } + flexran_agent_channel_t *channel; + channel = agent_channel[mod_id][agent_id]; + + /*Check if agent has a channel registered*/ + if (channel == NULL) { + goto error; + } + + return channel->msg_send(data, size, priority, channel->channel_info); + + error: + LOG_E(FLEXRAN_AGENT, "No channel registered for agent with id %d\n", agent_id); + return -1; +} + +int flexran_agent_msg_recv(mid_t mod_id, agent_id_t agent_id, void **data, int *size, int *priority) { + /*Check if agent id is valid*/ + if (agent_id >= FLEXRAN_AGENT_MAX || agent_id < 0) { + goto error; + } + flexran_agent_channel_t *channel; + channel = agent_channel[mod_id][agent_id]; + + /*Check if agent has a channel registered*/ + if (channel == NULL) { + goto error; + } + + return channel->msg_recv(data, size, priority, channel->channel_info); + + error: + LOG_E(FLEXRAN_AGENT, "No channel registered for agent with id %d\n", agent_id); + return -1; +} + +int flexran_agent_register_channel(mid_t mod_id, flexran_agent_channel_t *channel, agent_id_t agent_id) { + int i; + + if (channel == NULL) { + return -1; + } + + if (agent_id == FLEXRAN_AGENT_MAX) { + for (i = 0; i < FLEXRAN_AGENT_MAX; i++) { + agent_channel[mod_id][i] = channel; + } + } else { + agent_channel[mod_id][agent_id] = channel; + } + return 0; +} + +void flexran_agent_unregister_channel(mid_t mod_id, agent_id_t agent_id) { + int i; + + if (agent_id == FLEXRAN_AGENT_MAX) { + for (i = 0; i < FLEXRAN_AGENT_MAX; i++) { + agent_channel[mod_id][i] = NULL; + } + } else { + agent_channel[mod_id][agent_id] = NULL; + } +} + +int flexran_agent_create_channel(void *channel_info, + int (*msg_send)(void *data, int size, int priority, void *channel_info), + int (*msg_recv)(void **data, int *size, int *priority, void *channel_info), + void (*release)(flexran_agent_channel_t *channel)) { + + int channel_id = ++flexran_agent_channel_id; + flexran_agent_channel_t *channel = (flexran_agent_channel_t *) malloc(sizeof(flexran_agent_channel_t)); + channel->channel_id = channel_id; + channel->channel_info = channel_info; + channel->msg_send = msg_send; + channel->msg_recv = msg_recv; + channel->release = release; + + /*element should be a real pointer*/ + RB_INSERT(flexran_agent_channel_map, &channel_instance.flexran_agent_head, channel); + + LOG_I(FLEXRAN_AGENT,"Created a new channel with id 0x%lx\n", channel->channel_id); + + return channel_id; +} + +int flexran_agent_destroy_channel(int channel_id) { + int i, j; + + /*Check to see if channel exists*/ + struct flexran_agent_channel_s *e = NULL; + struct flexran_agent_channel_s search; + memset(&search, 0, sizeof(struct flexran_agent_channel_s)); + + e = RB_FIND(flexran_agent_channel_map, &channel_instance.flexran_agent_head, &search); + + if (e == NULL) { + return -1; + } + + /*Unregister the channel from all agents*/ + for (i = 0; i < NUM_MAX_ENB; i++) { + for (j = 0; j < FLEXRAN_AGENT_MAX; j++) { + if (agent_channel[i][j] != NULL) { + if (agent_channel[i][j]->channel_id == e->channel_id) { + agent_channel[i][j] == NULL; + } + } + } + } + + /*Remove the channel from the tree and free memory*/ + RB_REMOVE(flexran_agent_channel_map, &channel_instance.flexran_agent_head, e); + e->release(e); + free(e); + + return 0; +} + +err_code_t flexran_agent_init_channel_container(void) { + int i, j; + LOG_I(FLEXRAN_AGENT, "init RB tree for channel container\n"); + + RB_INIT(&channel_instance.flexran_agent_head); + + for (i = 0; i < NUM_MAX_ENB; i++) { + for (j = 0; j < FLEXRAN_AGENT_MAX; j++) { + agent_channel[i][j] == NULL; + } + } + + return 0; +} + +RB_GENERATE(flexran_agent_channel_map, flexran_agent_channel_s, entry, flexran_agent_compare_channel); + +int flexran_agent_compare_channel(struct flexran_agent_channel_s *a, struct flexran_agent_channel_s *b) { + if (a->channel_id < b->channel_id) return -1; + if (a->channel_id > b->channel_id) return 1; + + // equal timers + return 0; +} + +flexran_agent_channel_t * get_channel(int channel_id) { + + struct flexran_agent_channel_s search; + memset(&search, 0, sizeof(struct flexran_agent_channel_s)); + search.channel_id = channel_id; + + return RB_FIND(flexran_agent_channel_map, &channel_instance.flexran_agent_head, &search); + +} diff --git a/openair2/ENB_APP/flexran_agent_net_comm.h b/openair2/ENB_APP/flexran_agent_net_comm.h new file mode 100644 index 0000000000..2f59b0f7a3 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_net_comm.h @@ -0,0 +1,81 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_net_comm.h + * \brief FlexRAN agent network interface abstraction + * \autho Xenofon Foukas + * \date 2016 + * \version 0.1 + */ +#ifndef FLEXRAN_AGENT_NET_COMM_H_ +#define FLEXRAN_AGENT_NET_COMM_H_ + +#include "flexran_agent_defs.h" + +#include "tree.h" + +/*Channel related information used for Tx/Rx of protocol messages*/ +typedef struct flexran_agent_channel_s { + RB_ENTRY(flexran_agent_channel_s) entry; +int channel_id; +void *channel_info; +/*Callbacks for channel message Tx and Rx*/ +int (*msg_send)(void *data, int size, int priority, void *channel_info); +int (*msg_recv)(void **data, int *size, int *priority, void *channel_info); +void (*release)(struct flexran_agent_channel_s *channel); +} flexran_agent_channel_t; + +typedef struct flexran_agent_channel_instance_s{ + RB_HEAD(flexran_agent_channel_map, flexran_agent_channel_s) flexran_agent_head; +} flexran_agent_channel_instance_t; + +/*Send and receive messages using the channel registered for a specific agent*/ +int flexran_agent_msg_send(mid_t mod_id, agent_id_t agent_id, void *data, int size, int priority); +int flexran_agent_msg_recv(mid_t mod_id, agent_id_t agent_id, void **data, int *size, int *priority); + +/*Register a channel to an agent. Use FLEXRAN_AGENT_MAX to register the + *same channel to all agents*/ +int flexran_agent_register_channel(mid_t mod_id, flexran_agent_channel_t *channel, agent_id_t agent_id); + +/*Unregister the current channel of an agent. Use FLEXRAN_AGENT_MAX to unregister all channels*/ +void flexran_agent_unregister_channel(mid_t mod_id, agent_id_t agent_id); + +/*Create a new channel. Returns the id of the new channel or negative number otherwise*/ +int flexran_agent_create_channel(void *channel_info, + int (*msg_send)(void *data, int size, int priority, void *channel_info), + int (*msg_recv)(void **data, int *size, int *priority, void *channel_info), + void (*release)(flexran_agent_channel_t *channel)); + +/*Unregister a channel from all agents and destroy it. Returns 0 in case of success*/ +int flexran_agent_destroy_channel(int channel_id); + +/*Return an agent communication channel based on its id*/ +flexran_agent_channel_t * get_channel(int channel_id); + +/*Should be called before performing any channel operations*/ +err_code_t flexran_agent_init_channel_container(void); + +int flexran_agent_compare_channel(struct flexran_agent_channel_s *a, struct flexran_agent_channel_s *b); + +/* RB_PROTOTYPE is for .h files */ +RB_PROTOTYPE(flexran_agent_channel_map, flexran_agent_channel_s, entry, flexran_agent_compare_channel); + +#endif /*FLEXRAN_AGENT_COMM_H_*/ diff --git a/openair2/ENB_APP/flexran_agent_task_manager.c b/openair2/ENB_APP/flexran_agent_task_manager.c new file mode 100644 index 0000000000..088ec618c7 --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_task_manager.c @@ -0,0 +1,304 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_task_manager.h + * \brief Implementation of scheduled tasks manager for the FlexRAN agent + * \author Xenofon Foukas + * \date January 2016 + * \version 0.1 + * \email: x.foukas@sms.ed.ac.uk + * @ingroup _mac + */ + +#include +#include +#include + +#include "flexran_agent_task_manager.h" +#include "flexran_agent_common.c" + + +/* Util macros */ +#define LEFT(x) (2 * (x) + 1) +#define RIGHT(x) (2 * (x) + 2) +#define PARENT(x) ((x - 1) / 2) + +flexran_agent_task_t *flexran_agent_task_create(Protocol__FlexranMessage *msg, + uint16_t frame_num, uint8_t subframe_num) { + flexran_agent_task_t *task = NULL; + task = malloc(sizeof(flexran_agent_task_t)); + + if (task == NULL) + goto error; + + task->frame_num = frame_num; + task->subframe_num = subframe_num; + task->task = msg; + + return task; + + error: + return NULL; +} + +void flexran_agent_task_destroy(flexran_agent_task_t *task) { + if (task == NULL) + return; + + /* TODO: must free the task properly */ + free(task->task); + free(task); +} + +flexran_agent_task_queue_t *flexran_agent_task_queue_init(mid_t mod_id, size_t capacity, + int (*cmp)(mid_t mod_id, const flexran_agent_task_t *t1, + const flexran_agent_task_t *t2)) { + flexran_agent_task_queue_t *queue = NULL; + + queue = malloc(sizeof(flexran_agent_task_queue_t)); + if (queue == NULL) + goto error; + + /* If no comparator was given, use the default one */ + if (cmp == NULL) + queue->cmp = _flexran_agent_task_queue_cmp; + else + queue->cmp = cmp; + + queue->mod_id = mod_id; + + queue->first_frame = 0; + queue->first_subframe = 0; + + queue->task = malloc(capacity * sizeof(flexran_agent_task_t *)); + if (queue->task == NULL) + goto error; + + queue->count = 0; + queue->capacity = capacity; + + queue->mutex = malloc(sizeof(pthread_mutex_t)); + if (queue->mutex == NULL) + goto error; + if (pthread_mutex_init(queue->mutex, NULL)) + goto error; + + return queue; + + error: + if (queue != NULL) { + free(queue->mutex); + free(queue->task); + free(queue); + } + return NULL; +} + +flexran_agent_task_queue_t *flexran_agent_task_queue_default_init(mid_t mod_id) { + return flexran_agent_task_queue_init(mod_id, DEFAULT_CAPACITY, NULL); +} + +void flexran_agent_task_queue_destroy(flexran_agent_task_queue_t *queue) { + int i; + + if (queue == NULL) + return; + + for (i = 0; i < queue->count; i++) { + flexran_agent_task_destroy(queue->task[i]); + } + free(queue->task); + free(queue->mutex); + free(queue); +} + +int flexran_agent_task_queue_put(flexran_agent_task_queue_t *queue, flexran_agent_task_t *task) { + size_t i; + flexran_agent_task_t *tmp = NULL; + int realloc_status, err_code; + + if (pthread_mutex_lock(queue->mutex)) { + /*TODO*/ + err_code = -1; + goto error; + } + + if (queue->count >= queue->capacity) { + /*TODO: need to call realloc heap*/ + realloc_status = _flexran_agent_task_queue_realloc_heap(queue); + if (realloc_status != HEAP_OK) { + err_code = realloc_status; + goto error; + } + } + + queue->task[queue->count] = task; + i = queue->count; + queue->count++; + /*Swap elements to maintain heap properties*/ + while(i > 0 && queue->cmp(queue->mod_id, queue->task[i], queue->task[PARENT(i)]) > 0) { + tmp = queue->task[i]; + queue->task[i] = queue->task[PARENT(i)]; + queue->task[PARENT(i)] = tmp; + i = PARENT(i); + } + + if (pthread_mutex_unlock(queue->mutex)) { + // LOG_E(MAC, "%s:%d:%s: fatal error\n", __FILE__, __LINE__, __FUNCTION__); + exit(1); + } + return 0; + + error: + /*TODO*/ + return err_code; +} + + +int flexran_agent_task_queue_get_current_task(flexran_agent_task_queue_t *queue, flexran_agent_task_t **task) { + int err_code; + + if (pthread_mutex_lock(queue->mutex)) { + /*TODO*/ + err_code = -1; + goto error; + } + + if (queue->count < 1) { + /* Priority Queue is empty */ + err_code = HEAP_EMPTY; + goto error; + } + + /* Find current frame and subframe number */ + uint16_t curr_frame = flexran_get_current_frame(queue->mod_id); + uint8_t curr_subframe = flexran_get_current_subframe(queue->mod_id); + + /* If no task is scheduled for the current subframe, return without any task */ + if(queue->task[0]->frame_num != curr_frame || queue->task[0]->subframe_num != curr_subframe) { + *task = NULL; + return 0; + } + /* Otherwise, the first task should be returned */ + *task = queue->task[0]; + queue->task[0] = queue->task[queue->count-1]; + queue->count--; + /* Restore heap property */ + _flexran_agent_task_queue_heapify(queue, 0); + + /*If queue has no element*/ + if (queue->count < 1) { + queue->first_frame = 0; + queue->first_subframe = 0; + } else { + queue->first_frame = queue->task[0]->frame_num; + queue->first_subframe = queue->task[0]->subframe_num; + } + + if (pthread_mutex_unlock(queue->mutex)) { + // LOG_E(MAC, "%s:%d:%s: fatal error\n", __FILE__, __LINE__, __FUNCTION__); + exit(1); + } + return HEAP_OK; + + error: + /*TODO*/ + return err_code; +} + +/*Warning: Internal function. Should not be called as API function. Not thread safe*/ +void _flexran_agent_task_queue_heapify(flexran_agent_task_queue_t *queue, size_t idx) { + /* left index, right index, largest */ + flexran_agent_task_t *tmp = NULL; + size_t l_idx, r_idx, lrg_idx; + + l_idx = LEFT(idx); + r_idx = RIGHT(idx); + + /* Left child exists, compare left child with its parent */ + if (l_idx < queue->count && queue->cmp(queue->mod_id, queue->task[l_idx], queue->task[idx]) > 0) { + lrg_idx = l_idx; + } else { + lrg_idx = idx; + } + + /* Right child exists, compare right child with the largest element */ + if (r_idx < queue->count && queue->cmp(queue->mod_id, queue->task[r_idx], queue->task[lrg_idx]) > 0) { + lrg_idx = r_idx; + } + + /* At this point largest element was determined */ + if (lrg_idx != idx) { + /* Swap between the index at the largest element */ + tmp = queue->task[lrg_idx]; + queue->task[lrg_idx] = queue->task[idx]; + queue->task[idx] = tmp; + /* Heapify again */ + _flexran_agent_task_queue_heapify(queue, lrg_idx); + } +} + +/*Warning: Internal function. Should not be called as API function. Not thread safe*/ +int _flexran_agent_task_queue_realloc_heap(flexran_agent_task_queue_t *queue) { + flexran_agent_task_t **resized_task_heap; + if (queue->count >= queue->capacity) { + size_t task_size = sizeof(flexran_agent_task_t); + + resized_task_heap = realloc(queue->task, (2*queue->capacity) * task_size); + if (resized_task_heap != NULL) { + queue->capacity *= 2; + queue->task = (flexran_agent_task_t **) resized_task_heap; + return HEAP_OK; + } else return HEAP_REALLOCERROR; + } + return HEAP_NOREALLOC; +} + +int _flexran_agent_task_queue_cmp(mid_t mod_id, const flexran_agent_task_t *t1, const flexran_agent_task_t *t2) { + if ((t1->frame_num == t2->frame_num) && (t1->subframe_num == t2->subframe_num)) + return 0; + + uint16_t curr_frame = flexran_get_current_frame(mod_id); + uint8_t curr_subframe = flexran_get_current_subframe(mod_id); + + int f_offset, sf_offset, tmp1, tmp2; + + /*Check if the offsets have the same sign and compare the tasks position frame-wise*/ + tmp1 = t1->frame_num - curr_frame; + tmp2 = t2->frame_num - curr_frame; + if ((tmp1 >= 0) ^ (tmp2 < 0)) { + f_offset = tmp2 - tmp1; + } + else { + f_offset = tmp1 - tmp2; + } + /*Do the same for the subframe*/ + tmp1 = t1->subframe_num - curr_subframe; + tmp2 = t2->subframe_num - curr_subframe; + if ((tmp1 >= 0) ^ (tmp2 < 0)) + sf_offset = tmp2 - tmp1; + else + sf_offset = tmp1 - tmp2; + + /*Subframe position matters only if f_offset is 0. Multiply f_offset by 100 + to be the only comparisson parameter in all other cases */ + return f_offset*100 + sf_offset; +} diff --git a/openair2/ENB_APP/flexran_agent_task_manager.h b/openair2/ENB_APP/flexran_agent_task_manager.h new file mode 100644 index 0000000000..165b9dda1c --- /dev/null +++ b/openair2/ENB_APP/flexran_agent_task_manager.h @@ -0,0 +1,156 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_task_manager.h + * \brief Implementation of scheduled tasks manager for the FlexRAN agent + * \author Xenofon Foukas + * \date January 2016 + * \version 0.1 + * \email: x.foukas@sms.ed.ac.uk + * @ingroup _mac + */ + +#ifndef FLEXRAN_AGENT_TASK_MANAGER_ +#define FLEXRAN_AGENT_TASK_MANAGER_ + +#include +#include + +#include "flexran.pb-c.h" + +#include "flexran_agent_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define DEFAULT_CAPACITY 512 + +/** + * The structure containing the enb agent task to be executed + */ +typedef struct flexran_agent_task_s { + /* The frame in which the task needs to be executed */ + uint16_t frame_num; + /* The subframe in which the task needs to be executed */ + uint8_t subframe_num; + /* The task to be executed in the form of a Protocol__FlexranMessage */ + Protocol__FlexranMessage *task; +} flexran_agent_task_t; + +/** + * Priority Queue Structure for tasks + */ +typedef struct flexran_agent_task_queue_s { + mid_t mod_id; + /* The amount of allocated memory for agent tasks in the heap*/ + volatile size_t capacity; + /* The actual size of the tasks heap at a certain time */ + volatile size_t count; + /* The earliest frame that has a pending task */ + volatile uint16_t first_frame; + /* The earliest subframe within the frame that has a pending task */ + volatile uint8_t first_subframe; + /* An array of prioritized tasks stored in a heap */ + flexran_agent_task_t **task; + /* A pointer to a comparator function, used to prioritize elements */ + int (*cmp)(mid_t mod_id, const flexran_agent_task_t *t1, const flexran_agent_task_t *t2); + pthread_mutex_t *mutex; +} flexran_agent_task_queue_t; + +typedef enum { + HEAP_OK = 0, + HEAP_EMPTY, + HEAP_FAILED, + HEAP_REALLOCERROR, + HEAP_NOREALLOC, + HEAP_FATAL, +} heapstatus_e; + +/** + * Allocate memory for a task in the queue + */ +flexran_agent_task_t *flexran_agent_task_create(Protocol__FlexranMessage *msg, + uint16_t frame_num, uint8_t subframe_num); + +/** + * Free memory for a task of the queue + */ +void flexran_agent_task_destroy(flexran_agent_task_t *task); + +/** + * Allocate initial memory for storing the tasks + */ + flexran_agent_task_queue_t *flexran_agent_task_queue_init(mid_t mod_id, size_t capacity, + int (*cmp)(mid_t mod_id, const flexran_agent_task_t *t1, + const flexran_agent_task_t *t2)); + +/** + * Allocate initial memory for storing the tasks using default parameters + */ +flexran_agent_task_queue_t *flexran_agent_task_queue_default_init(mid_t mod_id); + +/** + * De-allocate memory for the tasks queue + */ +void flexran_agent_task_queue_destroy(flexran_agent_task_queue_t *queue); + +/** + * Insert task into the queue + */ +int flexran_agent_task_queue_put(flexran_agent_task_queue_t *queue, flexran_agent_task_t *task); + +/** + * Remove the task with the highest priority from the queue + * task becomes NULL if there is no task for the current frame and subframe + */ +int flexran_agent_task_queue_get_current_task(flexran_agent_task_queue_t *queue, flexran_agent_task_t **task); + +/** + * Check if the top priority task is for a specific frame and subframe + */ +int flexran_agent_task_queue_has_upcoming_task (flexran_agent_task_queue_t *queue, + const uint16_t frame, const uint8_t subframe); + +/** + * Restructure heap after modifications + */ +void _flexran_agent_task_queue_heapify(flexran_agent_task_queue_t *queue, size_t idx); + +/** + * Reallocate memory once the heap reaches max size + */ +int _flexran_agent_task_queue_realloc_heap(flexran_agent_task_queue_t *queue); + +/** + * Compare two agent tasks based on frame and subframe + * returns 0 if tasks t1, t2 have the same priority + * return negative value if t1 needs to be executed after t2 + * return positive value if t1 preceeds t2 + * Need to give eNB id for the comparisson based on the current frame-subframe + */ + int _flexran_agent_task_queue_cmp(mid_t mod_id, const flexran_agent_task_t *t1, const flexran_agent_task_t *t2); + +#ifdef __cplusplus +} +#endif + +#endif /*FLEXRAN_AGENT_TASK_MANAGER_*/ diff --git a/openair2/LAYER2/COPYING b/openair2/LAYER2/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/MAC/COPYING b/openair2/LAYER2/MAC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/MAC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index 2c5a0799d2..d5a09bef85 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -1,31 +1,25 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - OpenAirInterface 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 3 of the License, or - (at your option) any later version. +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file config.c * \brief UE and eNB configuration performed by RRC or as a consequence of RRC procedures * \author Navid Nikaein and Raymond Knopp @@ -38,538 +32,897 @@ #include "COMMON/platform_types.h" #include "COMMON/platform_constants.h" +#include "SCHED/defs.h" #include "SystemInformationBlockType2.h" //#include "RadioResourceConfigCommonSIB.h" #include "RadioResourceConfigDedicated.h" +#ifdef Rel14 +#include "PRACH-ConfigSIB-v1310.h" +#endif #include "MeasGapConfig.h" #include "MeasObjectToAddModList.h" #include "TDD-Config.h" +#include "MAC-MainConfig.h" #include "defs.h" #include "proto.h" #include "extern.h" #include "UTIL/LOG/log.h" #include "UTIL/LOG/vcd_signal_dumper.h" -#ifdef Rel10 + +#include "common/ran_context.h" +#if defined(Rel10) || defined(Rel14) #include "MBSFN-AreaInfoList-r9.h" #include "MBSFN-AreaInfo-r9.h" #include "MBSFN-SubframeConfigList.h" #include "PMCH-InfoList-r9.h" #endif -/* sec 5.9, 36.321: MAC Reset Procedure */ -void ue_mac_reset(module_id_t module_idP,uint8_t eNB_index) +extern RAN_CONTEXT_t RC; +extern int l2_init_eNB(void); +extern void mac_top_init_eNB(void); +extern void mac_init_cell_params(int Mod_idP,int CC_idP); + +extern uint8_t nfapi_mode; + +int32_t **rxdata; +int32_t **txdata; + + +typedef struct eutra_bandentry_s { + int16_t band; + uint32_t ul_min; + uint32_t ul_max; + uint32_t dl_min; + uint32_t dl_max; + uint32_t N_OFFs_DL; +} eutra_bandentry_t; + +typedef struct band_info_s { + int nbands; + eutra_bandentry_t band_info[100]; +} band_info_t; + + + +static const eutra_bandentry_t eutra_bandtable[] = { + {1, 19200, 19800, 21100, 21700, 0}, + {2, 18500, 19100, 19300, 19900, 6000}, + {3, 17100, 17850, 18050, 18800, 12000}, + {4, 17100, 17550, 21100, 21550, 19500}, + {5, 8240, 8490, 8690, 8940, 24000}, + {6, 8300, 8400, 8750, 8850, 26500}, + {7, 25000, 25700, 26200, 26900, 27500}, + {8, 8800, 9150, 9250, 9600, 34500}, + {9, 17499, 17849, 18449, 18799, 38000}, + {10, 17100, 17700, 21100, 21700, 41500}, + {11, 14279, 14529, 14759, 15009, 47500}, + {12, 6980, 7160, 7280, 7460, 50100}, + {13, 7770, 7870, 7460, 7560, 51800}, + {14, 7880, 7980, 7580, 7680, 52800}, + {17, 7040, 7160, 7340, 7460, 57300}, + {18, 8150, 9650, 8600, 10100, 58500}, + {19, 8300, 8450, 8750, 8900, 60000}, + {20, 8320, 8620, 7910, 8210, 61500}, + {21, 14479, 14629, 14959, 15109, 64500}, + {22, 34100, 34900, 35100, 35900, 66000}, + {23, 20000, 20200, 21800, 22000, 75000}, + {24, 16126, 16605, 15250, 15590, 77000}, + {25, 18500, 19150, 19300, 19950, 80400}, + {26, 8140, 8490, 8590, 8940, 86900}, + {27, 8070, 8240, 8520, 8690, 90400}, + {28, 7030, 7580, 7580, 8130, 92100}, + {29, 0, 0, 7170, 7280, 96600}, + {30, 23050, 23250, 23500, 23600, 97700}, + {31, 45250, 34900, 46250, 35900, 98700}, + {32, 0, 0, 14520, 14960, 99200}, + {33, 19000, 19200, 19000, 19200, 36000}, + {34, 20100, 20250, 20100, 20250, 36200}, + {35, 18500, 19100, 18500, 19100, 36350}, + {36, 19300, 19900, 19300, 19900, 36950}, + {37, 19100, 19300, 19100, 19300, 37550}, + {38, 25700, 26200, 25700, 26300, 37750}, + {39, 18800, 19200, 18800, 19200, 38250}, + {40, 23000, 24000, 23000, 24000, 38650}, + {41, 24960, 26900, 24960, 26900, 39650}, + {42, 34000, 36000, 34000, 36000, 41590}, + {43, 36000, 38000, 36000, 38000, 43590}, + {44, 7030, 8030, 7030, 8030, 45590}, + {45, 14470, 14670, 14470, 14670, 46590}, + {46, 51500, 59250, 51500, 59250, 46790}, + {65, 19200, 20100, 21100, 22000, 65536}, + {66, 17100, 18000, 21100, 22000, 66436}, + {67, 0, 0, 7380, 7580, 67336}, + {68, 6980, 7280, 7530, 7830, 67536} +}; + +uint32_t to_earfcn(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t bw) { - //Resetting Bj - UE_mac_inst[module_idP].scheduling_info.Bj[0] = 0; - UE_mac_inst[module_idP].scheduling_info.Bj[1] = 0; - UE_mac_inst[module_idP].scheduling_info.Bj[2] = 0; + uint32_t dl_CarrierFreq_by_100k = dl_CarrierFreq / 100000; + int bw_by_100 = bw / 100; - //Stopping all timers + int i; - //timeAlignmentTimer expires + AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP); + for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++); - // PHY changes for UE MAC reset - mac_xface->phy_reset_ue(module_idP,0,eNB_index); - - // notify RRC to relase PUCCH/SRS - // cancel all pending SRs - UE_mac_inst[module_idP].scheduling_info.SR_pending=0; - UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0; - - // stop ongoing RACH procedure - - // discard explicitly signaled ra_PreambleIndex and ra_RACH_MaskIndex, if any - UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = 0; // check! - UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; + AssertFatal(dl_CarrierFreq_by_100k >= eutra_bandtable[i].dl_min, + "Band %d, bw %u : DL carrier frequency %u Hz < %u\n", + eutra_bandP, bw, dl_CarrierFreq, + eutra_bandtable[i].dl_min); + AssertFatal(dl_CarrierFreq_by_100k <= + (eutra_bandtable[i].dl_max - bw_by_100), + "Band %d, bw %u: DL carrier frequency %u Hz > %d\n", + eutra_bandP, bw, dl_CarrierFreq, + eutra_bandtable[i].dl_max - bw_by_100); - ue_init_mac(module_idP); //This will hopefully do the rest of the MAC reset procedure - + return (dl_CarrierFreq_by_100k - eutra_bandtable[i].dl_min + + (eutra_bandtable[i].N_OFFs_DL / 10)); } -int -rrc_mac_config_req( - module_id_t Mod_idP, - int CC_idP, - eNB_flag_t eNB_flagP, - rnti_t rntiP, - uint8_t eNB_index, - RadioResourceConfigCommonSIB_t *radioResourceConfigCommon, - struct PhysicalConfigDedicated *physicalConfigDedicated, -#ifdef Rel10 - SCellToAddMod_r10_t *sCellToAddMod_r10, - //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, -#endif - MeasObjectToAddMod_t **measObj, - MAC_MainConfig_t *mac_MainConfig, - long logicalChannelIdentity, - LogicalChannelConfig_t *logicalChannelConfig, - MeasGapConfig_t *measGapConfig, - TDD_Config_t *tdd_Config, - MobilityControlInfo_t *mobilityControlInfo, - uint8_t *SIwindowsize, - uint16_t *SIperiod, - ARFCN_ValueEUTRA_t *ul_CarrierFreq, - long *ul_Bandwidth, - AdditionalSpectrumEmission_t *additionalSpectrumEmission, - struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList -#ifdef Rel10 - ,uint8_t MBMS_Flag, - MBSFN_AreaInfoList_r9_t *mbsfn_AreaInfoList, - PMCH_InfoList_r9_t *pmch_InfoList -#endif -#ifdef CBA - ,uint8_t num_active_cba_groups, - uint16_t cba_rnti -#endif - ) +uint32_t from_earfcn(int eutra_bandP, uint32_t dl_earfcn) { int i; + AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP); + for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++); + + return (eutra_bandtable[i].dl_min + + (dl_earfcn - (eutra_bandtable[i].N_OFFs_DL / 10))) * 100000; +} + + +int32_t get_uldl_offset(int eutra_bandP) +{ + int i; + + for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++); + return (eutra_bandtable[i].dl_min - eutra_bandtable[i].ul_min); +} + +uint32_t bw_table[6] = {6*180,15*180,25*180,50*180,75*180,100*180}; + +void config_mib(int Mod_idP, + int CC_idP, + int eutra_bandP, + int dl_BandwidthP, + PHICH_Config_t *phich_configP, + int Nid_cellP, + int NcpP, + int p_eNBP, + uint32_t dl_CarrierFreqP, + uint32_t ul_CarrierFreqP, + uint32_t pbch_repetitionP) { + + nfapi_config_request_t *cfg = &RC.mac[Mod_idP]->config[CC_idP]; + + cfg->num_tlv=0; + + cfg->subframe_config.pcfich_power_offset.value = 6000; // 0dB + cfg->subframe_config.pcfich_power_offset.tl.tag = NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG; + cfg->num_tlv++; + + cfg->subframe_config.dl_cyclic_prefix_type.value = NcpP; + cfg->subframe_config.dl_cyclic_prefix_type.tl.tag = NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG; + cfg->num_tlv++; + + cfg->subframe_config.ul_cyclic_prefix_type.value = NcpP; + cfg->subframe_config.ul_cyclic_prefix_type.tl.tag = NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG; + cfg->num_tlv++; + + cfg->rf_config.dl_channel_bandwidth.value = to_prb(dl_BandwidthP); + cfg->rf_config.dl_channel_bandwidth.tl.tag = NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG; + cfg->num_tlv++; +LOG_E(PHY,"%s() dl_BandwidthP:%d\n", __FUNCTION__, dl_BandwidthP); + + cfg->rf_config.ul_channel_bandwidth.value = to_prb(dl_BandwidthP); + cfg->rf_config.ul_channel_bandwidth.tl.tag = NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG; + cfg->num_tlv++; + + cfg->rf_config.tx_antenna_ports.value = p_eNBP; + cfg->rf_config.tx_antenna_ports.tl.tag = NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG; + cfg->num_tlv++; + + cfg->rf_config.rx_antenna_ports.value = 2; + cfg->rf_config.rx_antenna_ports.tl.tag = NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG; + cfg->num_tlv++; + + cfg->nfapi_config.earfcn.value = to_earfcn(eutra_bandP,dl_CarrierFreqP,bw_table[dl_BandwidthP]/100); + cfg->nfapi_config.earfcn.tl.tag = NFAPI_NFAPI_EARFCN_TAG; + cfg->num_tlv++; + + cfg->nfapi_config.rf_bands.number_rf_bands = 1; + cfg->nfapi_config.rf_bands.rf_band[0] = eutra_bandP; + cfg->nfapi_config.rf_bands.tl.tag = NFAPI_PHY_RF_BANDS_TAG; + cfg->num_tlv++; + + cfg->phich_config.phich_resource.value = phich_configP->phich_Resource; + cfg->phich_config.phich_resource.tl.tag = NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG; + cfg->num_tlv++; + + cfg->phich_config.phich_duration.value = phich_configP->phich_Duration; + cfg->phich_config.phich_duration.tl.tag = NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG; + cfg->num_tlv++; + + cfg->phich_config.phich_power_offset.value = 6000; // 0dB + cfg->phich_config.phich_power_offset.tl.tag = NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG; + cfg->num_tlv++; + + cfg->sch_config.primary_synchronization_signal_epre_eprers.value = 6000; // 0dB + cfg->sch_config.primary_synchronization_signal_epre_eprers.tl.tag = NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG; + cfg->num_tlv++; + + cfg->sch_config.secondary_synchronization_signal_epre_eprers.value = 6000; // 0dB + cfg->sch_config.secondary_synchronization_signal_epre_eprers.tl.tag = NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG; + cfg->num_tlv++; + + cfg->sch_config.physical_cell_id.value = Nid_cellP; + cfg->sch_config.physical_cell_id.tl.tag = NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG; + cfg->num_tlv++; + +#ifdef Rel14 + cfg->emtc_config.pbch_repetitions_enable_r13.value = pbch_repetitionP; + cfg->emtc_config.pbch_repetitions_enable_r13.tl.tag = NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG; + cfg->num_tlv++; +#endif + + LOG_I(MAC, + "%s() NFAPI_CONFIG_REQUEST(num_tlv:%u) DL_BW:%u UL_BW:%u Ncp %d,p_eNB %d,earfcn %d,band %d,phich_resource %u phich_duration %u phich_power_offset %u PSS %d SSS %d PCI %d" +#ifdef Rel14 + " PBCH repetition %d" +#endif + "\n" + ,__FUNCTION__ + ,cfg->num_tlv + ,cfg->rf_config.dl_channel_bandwidth.value + ,cfg->rf_config.ul_channel_bandwidth.value + ,NcpP,p_eNBP + ,cfg->nfapi_config.earfcn.value + ,cfg->nfapi_config.rf_bands.rf_band[0] + ,cfg->phich_config.phich_resource.value + ,cfg->phich_config.phich_duration.value + ,cfg->phich_config.phich_power_offset.value + ,cfg->sch_config.primary_synchronization_signal_epre_eprers.value + ,cfg->sch_config.secondary_synchronization_signal_epre_eprers.value + ,cfg->sch_config.physical_cell_id.value +#ifdef Rel14 + ,cfg->emtc_config.pbch_repetitions_enable_r13.value +#endif + ); +} + +void config_sib1(int Mod_idP, int CC_idP, TDD_Config_t * tdd_ConfigP) +{ + + nfapi_config_request_t *cfg = &RC.mac[Mod_idP]->config[CC_idP]; + + if (tdd_ConfigP) { //TDD + cfg->subframe_config.duplex_mode.value = 0; + cfg->subframe_config.duplex_mode.tl.tag = NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG; + cfg->num_tlv++; + + cfg->tdd_frame_structure_config.subframe_assignment.value = tdd_ConfigP->subframeAssignment; + cfg->tdd_frame_structure_config.subframe_assignment.tl.tag = NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG; + cfg->num_tlv++; + + cfg->tdd_frame_structure_config.special_subframe_patterns.value = tdd_ConfigP->specialSubframePatterns; + cfg->tdd_frame_structure_config.special_subframe_patterns.tl.tag = NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG; + cfg->num_tlv++; + } + else { // FDD + cfg->subframe_config.duplex_mode.value = 1; + cfg->subframe_config.duplex_mode.tl.tag = NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG; + cfg->num_tlv++; + // Note no half-duplex here + } +} + +int power_off_dB[6] = { 78, 118, 140, 170, 188, 200 }; + +void +config_sib2(int Mod_idP, + int CC_idP, + RadioResourceConfigCommonSIB_t * radioResourceConfigCommonP, +#ifdef Rel14 + RadioResourceConfigCommonSIB_t * radioResourceConfigCommon_BRP, +#endif + ARFCN_ValueEUTRA_t *ul_CArrierFreqP, + long *ul_BandwidthP, + AdditionalSpectrumEmission_t *additionalSpectrumEmissionP, + struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigListP) { + + nfapi_config_request_t *cfg = &RC.mac[Mod_idP]->config[CC_idP]; + + cfg->subframe_config.pb.value = radioResourceConfigCommonP->pdsch_ConfigCommon.p_b; + cfg->subframe_config.pb.tl.tag = NFAPI_SUBFRAME_CONFIG_PB_TAG; + cfg->num_tlv++; + + cfg->rf_config.reference_signal_power.value = radioResourceConfigCommonP->pdsch_ConfigCommon.referenceSignalPower; + cfg->rf_config.reference_signal_power.tl.tag = NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG; + cfg->num_tlv++; + + cfg->nfapi_config.max_transmit_power.value = cfg->rf_config.reference_signal_power.value + power_off_dB[cfg->rf_config.dl_channel_bandwidth.value]; + cfg->nfapi_config.max_transmit_power.tl.tag = NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG; + cfg->num_tlv++; + + cfg->prach_config.configuration_index.value = radioResourceConfigCommonP->prach_Config.prach_ConfigInfo.prach_ConfigIndex; + cfg->prach_config.configuration_index.tl.tag = NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG; + cfg->num_tlv++; + + cfg->prach_config.root_sequence_index.value = radioResourceConfigCommonP->prach_Config.rootSequenceIndex; + cfg->prach_config.root_sequence_index.tl.tag = NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG; + cfg->num_tlv++; + + cfg->prach_config.zero_correlation_zone_configuration.value = radioResourceConfigCommonP->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; + cfg->prach_config.zero_correlation_zone_configuration.tl.tag = NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG; + cfg->num_tlv++; + + cfg->prach_config.high_speed_flag.value = radioResourceConfigCommonP->prach_Config.prach_ConfigInfo.highSpeedFlag; + cfg->prach_config.high_speed_flag.tl.tag = NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG; + cfg->num_tlv++; + + cfg->prach_config.frequency_offset.value = radioResourceConfigCommonP->prach_Config.prach_ConfigInfo.prach_FreqOffset; + cfg->prach_config.frequency_offset.tl.tag = NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG; + cfg->num_tlv++; + + + cfg->pusch_config.hopping_mode.value = radioResourceConfigCommonP->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; + cfg->pusch_config.hopping_mode.tl.tag = NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG; + cfg->num_tlv++; + + cfg->pusch_config.number_of_subbands.value = radioResourceConfigCommonP->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; + cfg->pusch_config.number_of_subbands.tl.tag = NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG; + cfg->num_tlv++; + + cfg->pusch_config.hopping_offset.value = radioResourceConfigCommonP->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; + cfg->pusch_config.hopping_offset.tl.tag = NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG; + cfg->num_tlv++; + + cfg->pucch_config.delta_pucch_shift.value = radioResourceConfigCommonP->pucch_ConfigCommon.deltaPUCCH_Shift; + cfg->pucch_config.delta_pucch_shift.tl.tag = NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG; + cfg->num_tlv++; + + cfg->pucch_config.n_cqi_rb.value = radioResourceConfigCommonP->pucch_ConfigCommon.nRB_CQI; + cfg->pucch_config.n_cqi_rb.tl.tag = NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG; + cfg->num_tlv++; + + cfg->pucch_config.n_an_cs.value = radioResourceConfigCommonP->pucch_ConfigCommon.nCS_AN; + cfg->pucch_config.n_an_cs.tl.tag = NFAPI_PUCCH_CONFIG_N_AN_CS_TAG; + cfg->num_tlv++; + + cfg->pucch_config.n1_pucch_an.value = radioResourceConfigCommonP->pucch_ConfigCommon.n1PUCCH_AN; + cfg->pucch_config.n1_pucch_an.tl.tag = NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG; + cfg->num_tlv++; + + if (radioResourceConfigCommonP->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled == true) + { + cfg->uplink_reference_signal_config.uplink_rs_hopping.value = 1; + } + else if (radioResourceConfigCommonP->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled == true) + { + cfg->uplink_reference_signal_config.uplink_rs_hopping.value = 2; + } + else // No hopping + { + cfg->uplink_reference_signal_config.uplink_rs_hopping.value = 0; + } + cfg->uplink_reference_signal_config.uplink_rs_hopping.tl.tag = NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG; + cfg->num_tlv++; + + cfg->uplink_reference_signal_config.group_assignment.value = radioResourceConfigCommonP->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + cfg->uplink_reference_signal_config.group_assignment.tl.tag = NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG; + cfg->num_tlv++; + + cfg->uplink_reference_signal_config.cyclic_shift_1_for_drms.value = radioResourceConfigCommonP->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift; + cfg->uplink_reference_signal_config.cyclic_shift_1_for_drms.tl.tag = NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG; + cfg->num_tlv++; + + + // how to enable/disable SRS? + if (radioResourceConfigCommonP->soundingRS_UL_ConfigCommon.present==SoundingRS_UL_ConfigCommon_PR_setup) { + cfg->srs_config.bandwidth_configuration.value = radioResourceConfigCommonP->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; + cfg->srs_config.bandwidth_configuration.tl.tag = NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG; + cfg->num_tlv++; + + cfg->srs_config.srs_subframe_configuration.value = radioResourceConfigCommonP->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; + cfg->srs_config.srs_subframe_configuration.tl.tag = NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG; + cfg->num_tlv++; + + cfg->srs_config.srs_acknack_srs_simultaneous_transmission.value = radioResourceConfigCommonP->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; + cfg->srs_config.srs_acknack_srs_simultaneous_transmission.tl.tag = NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG; + cfg->num_tlv++; + + + nfapi_config_request_t *cfg = &RC.mac[Mod_idP]->config[CC_idP]; + + cfg->subframe_config.pb.value = radioResourceConfigCommonP->pdsch_ConfigCommon.p_b; + cfg->rf_config.reference_signal_power.value = radioResourceConfigCommonP->pdsch_ConfigCommon.referenceSignalPower; + cfg->nfapi_config.max_transmit_power.value = cfg->rf_config.reference_signal_power.value + + power_off_dB[cfg->rf_config.dl_channel_bandwidth.value]; + + cfg->prach_config.configuration_index.value = radioResourceConfigCommonP->prach_Config.prach_ConfigInfo.prach_ConfigIndex; + cfg->prach_config.root_sequence_index.value = radioResourceConfigCommonP->prach_Config.rootSequenceIndex; + cfg->prach_config.zero_correlation_zone_configuration.value = radioResourceConfigCommonP->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; + cfg->prach_config.high_speed_flag.value = radioResourceConfigCommonP->prach_Config.prach_ConfigInfo.highSpeedFlag; + cfg->prach_config.frequency_offset.value = radioResourceConfigCommonP->prach_Config.prach_ConfigInfo.prach_FreqOffset; + + cfg->pusch_config.hopping_mode.value = radioResourceConfigCommonP->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode; + cfg->pusch_config.number_of_subbands.value = radioResourceConfigCommonP->pusch_ConfigCommon.pusch_ConfigBasic.n_SB; + cfg->pusch_config.hopping_offset.value = radioResourceConfigCommonP->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset; + + cfg->pucch_config.delta_pucch_shift.value = radioResourceConfigCommonP->pucch_ConfigCommon.deltaPUCCH_Shift; + cfg->pucch_config.n_cqi_rb.value = radioResourceConfigCommonP->pucch_ConfigCommon.nRB_CQI; + cfg->pucch_config.n_an_cs.value = radioResourceConfigCommonP->pucch_ConfigCommon.nCS_AN; + cfg->pucch_config.n1_pucch_an.value = radioResourceConfigCommonP->pucch_ConfigCommon.n1PUCCH_AN; + + if (radioResourceConfigCommonP->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled == true) + cfg->uplink_reference_signal_config.uplink_rs_hopping.value = 1; + else if (radioResourceConfigCommonP->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled == true) + cfg->uplink_reference_signal_config.uplink_rs_hopping.value = 2; + else // No hopping + cfg->uplink_reference_signal_config.uplink_rs_hopping.value = 0; + + cfg->uplink_reference_signal_config.group_assignment.value = radioResourceConfigCommonP->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH; + cfg->uplink_reference_signal_config.cyclic_shift_1_for_drms.value = radioResourceConfigCommonP->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift; + + // how to enable/disable SRS? + if (radioResourceConfigCommonP->soundingRS_UL_ConfigCommon.present == SoundingRS_UL_ConfigCommon_PR_setup) { + cfg->srs_config.bandwidth_configuration.value = radioResourceConfigCommonP->soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig; + cfg->srs_config.srs_subframe_configuration.value = radioResourceConfigCommonP->soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig; + cfg->srs_config.srs_acknack_srs_simultaneous_transmission.value = radioResourceConfigCommonP->soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission; + + if (radioResourceConfigCommonP->soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts) + cfg->srs_config.max_up_pts.value = 1; + else + cfg->srs_config.max_up_pts.value = 0; + } + } +#ifdef Rel14 + if (RC.mac[Mod_idP]->common_channels[CC_idP].mib->message.schedulingInfoSIB1_BR_r13 > 0) { + AssertFatal(radioResourceConfigCommon_BRP != NULL, + "radioResource rou is missing\n"); + AssertFatal(radioResourceConfigCommon_BRP->ext4 != NULL, + "ext4 is missing\n"); + cfg->emtc_config.prach_catm_root_sequence_index.value = radioResourceConfigCommon_BRP->prach_Config.rootSequenceIndex; + cfg->emtc_config.prach_catm_zero_correlation_zone_configuration.value = radioResourceConfigCommon_BRP->prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig; + cfg->emtc_config.prach_catm_high_speed_flag.value = radioResourceConfigCommon_BRP->prach_Config.prach_ConfigInfo.highSpeedFlag; + + struct PRACH_ConfigSIB_v1310 *ext4_prach = radioResourceConfigCommon_BRP->ext4->prach_ConfigCommon_v1310; + + PRACH_ParametersListCE_r13_t *prach_ParametersListCE_r13 = &ext4_prach->prach_ParametersListCE_r13; + + PRACH_ParametersCE_r13_t *p; + cfg->emtc_config.prach_ce_level_0_enable.value = 0; + cfg->emtc_config.prach_ce_level_1_enable.value = 0; + cfg->emtc_config.prach_ce_level_2_enable.value = 0; + cfg->emtc_config.prach_ce_level_3_enable.value = 0; + switch (prach_ParametersListCE_r13->list.count) { + case 4: + p = prach_ParametersListCE_r13->list.array[3]; + cfg->emtc_config.prach_ce_level_3_enable.value = 1; + cfg->emtc_config.prach_ce_level_3_configuration_index.value = p->prach_ConfigIndex_r13; + cfg->emtc_config.prach_ce_level_3_frequency_offset.value = p->prach_FreqOffset_r13; + cfg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt.value = p->numRepetitionPerPreambleAttempt_r13; + if (p->prach_StartingSubframe_r13) + cfg->emtc_config.prach_ce_level_3_starting_subframe_periodicity.value = *p->prach_StartingSubframe_r13; + cfg->emtc_config.prach_ce_level_3_hopping_enable.value = p->prach_HoppingConfig_r13; + cfg->emtc_config.prach_ce_level_3_hopping_offset.value = cfg->rf_config.ul_channel_bandwidth.value - 6; + case 3: + p = prach_ParametersListCE_r13->list.array[2]; + cfg->emtc_config.prach_ce_level_2_enable.value = 1; + cfg->emtc_config.prach_ce_level_2_configuration_index.value = p->prach_ConfigIndex_r13; + cfg->emtc_config.prach_ce_level_2_frequency_offset.value = p->prach_FreqOffset_r13; + cfg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt.value = p->numRepetitionPerPreambleAttempt_r13; + if (p->prach_StartingSubframe_r13) + cfg->emtc_config.prach_ce_level_2_starting_subframe_periodicity.value = *p->prach_StartingSubframe_r13; + cfg->emtc_config.prach_ce_level_2_hopping_enable.value = p->prach_HoppingConfig_r13; + cfg->emtc_config.prach_ce_level_2_hopping_offset.value = cfg->rf_config.ul_channel_bandwidth.value - 6; + case 2: + p = prach_ParametersListCE_r13->list.array[1]; + cfg->emtc_config.prach_ce_level_1_enable.value = 1; + cfg->emtc_config.prach_ce_level_1_configuration_index.value = p->prach_ConfigIndex_r13; + cfg->emtc_config.prach_ce_level_1_frequency_offset.value = p->prach_FreqOffset_r13; + cfg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt.value = p->numRepetitionPerPreambleAttempt_r13; + if (p->prach_StartingSubframe_r13) + cfg->emtc_config.prach_ce_level_1_starting_subframe_periodicity.value = *p->prach_StartingSubframe_r13; + cfg->emtc_config.prach_ce_level_1_hopping_enable.value = p->prach_HoppingConfig_r13; + cfg->emtc_config.prach_ce_level_1_hopping_offset.value = cfg->rf_config.ul_channel_bandwidth.value - 6; + case 1: + p = prach_ParametersListCE_r13->list.array[0]; + cfg->emtc_config.prach_ce_level_0_enable.value = 1; + cfg->emtc_config.prach_ce_level_0_configuration_index.value = p->prach_ConfigIndex_r13; + cfg->emtc_config.prach_ce_level_0_frequency_offset.value = p->prach_FreqOffset_r13; + cfg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt.value = p->numRepetitionPerPreambleAttempt_r13; + if (p->prach_StartingSubframe_r13) + cfg->emtc_config.prach_ce_level_0_starting_subframe_periodicity.value = *p->prach_StartingSubframe_r13; + cfg->emtc_config.prach_ce_level_0_hopping_enable.value = p->prach_HoppingConfig_r13; + cfg->emtc_config.prach_ce_level_0_hopping_offset.value = cfg->rf_config.ul_channel_bandwidth.value - 6; + } + + struct FreqHoppingParameters_r13 *ext4_freqHoppingParameters = radioResourceConfigCommonP->ext4->freqHoppingParameters_r13; + if ((ext4_freqHoppingParameters)&& + (ext4_freqHoppingParameters->interval_ULHoppingConfigCommonModeA_r13)) + { + switch (ext4_freqHoppingParameters->interval_ULHoppingConfigCommonModeA_r13->present) { + case FreqHoppingParameters_r13__interval_ULHoppingConfigCommonModeA_r13_PR_NOTHING: /* No components present */ + break; + case FreqHoppingParameters_r13__interval_ULHoppingConfigCommonModeA_r13_PR_interval_FDD_r13: + cfg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea.value = + ext4_freqHoppingParameters->interval_ULHoppingConfigCommonModeA_r13-> + choice.interval_FDD_r13; + break; + case FreqHoppingParameters_r13__interval_ULHoppingConfigCommonModeA_r13_PR_interval_TDD_r13: + cfg->emtc_config. + pucch_interval_ulhoppingconfigcommonmodea.value = + ext4_freqHoppingParameters->interval_ULHoppingConfigCommonModeA_r13-> + choice.interval_TDD_r13; + break; + } + } + if ((ext4_freqHoppingParameters) && + (ext4_freqHoppingParameters->interval_ULHoppingConfigCommonModeB_r13)) + { + switch + (ext4_freqHoppingParameters->interval_ULHoppingConfigCommonModeB_r13-> + present) { + case FreqHoppingParameters_r13__interval_ULHoppingConfigCommonModeB_r13_PR_NOTHING: /* No components present */ + break; + case FreqHoppingParameters_r13__interval_ULHoppingConfigCommonModeB_r13_PR_interval_FDD_r13: + cfg->emtc_config. + pucch_interval_ulhoppingconfigcommonmodeb.value = + ext4_freqHoppingParameters->interval_ULHoppingConfigCommonModeB_r13-> + choice.interval_FDD_r13; + break; + case FreqHoppingParameters_r13__interval_ULHoppingConfigCommonModeB_r13_PR_interval_TDD_r13: + cfg->emtc_config. + pucch_interval_ulhoppingconfigcommonmodeb.value = + ext4_freqHoppingParameters->interval_ULHoppingConfigCommonModeB_r13-> + choice.interval_TDD_r13; + break; + } + } + } +#endif + +} + +void +config_dedicated(int Mod_idP, + int CC_idP, + uint16_t rnti, + struct PhysicalConfigDedicated *physicalConfigDedicated) +{ + +} + +void +config_dedicated_scell(int Mod_idP, + uint16_t rnti, + SCellToAddMod_r10_t * sCellToAddMod_r10) +{ + +} + + +int +rrc_mac_config_req_eNB(module_id_t Mod_idP, + int CC_idP, + int physCellId, + int p_eNB, + int Ncp, int eutra_band, uint32_t dl_CarrierFreq, +#ifdef Rel14 + int pbch_repetition, +#endif + rnti_t rntiP, + BCCH_BCH_Message_t * mib, + RadioResourceConfigCommonSIB_t * + radioResourceConfigCommon, +#ifdef Rel14 + RadioResourceConfigCommonSIB_t * + radioResourceConfigCommon_BR, +#endif + struct PhysicalConfigDedicated + *physicalConfigDedicated, +#if defined(Rel10) || defined(Rel14) + SCellToAddMod_r10_t * sCellToAddMod_r10, + //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, +#endif + MeasObjectToAddMod_t ** measObj, + MAC_MainConfig_t * mac_MainConfig, + long logicalChannelIdentity, + LogicalChannelConfig_t * logicalChannelConfig, + MeasGapConfig_t * measGapConfig, + TDD_Config_t * tdd_Config, + MobilityControlInfo_t * mobilityControlInfo, + SchedulingInfoList_t * schedulingInfoList, + uint32_t ul_CarrierFreq, + long *ul_Bandwidth, + AdditionalSpectrumEmission_t * + additionalSpectrumEmission, + struct MBSFN_SubframeConfigList + *mbsfn_SubframeConfigList +#if defined(Rel10) || defined(Rel14) + , uint8_t MBMS_Flag, + MBSFN_AreaInfoList_r9_t * mbsfn_AreaInfoList, + PMCH_InfoList_r9_t * pmch_InfoList +#endif +#ifdef Rel14 + , + SystemInformationBlockType1_v1310_IEs_t * + sib1_v13ext +#endif + ) { + + int i; + int UE_id = -1; - eNB_MAC_INST *eNB = &eNB_mac_inst[Mod_idP]; + eNB_MAC_INST *eNB = RC.mac[Mod_idP]; UE_list_t *UE_list= &eNB->UE_list; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_IN); - if (eNB_flagP==0) { - LOG_I(MAC,"[CONFIG][UE %d] Configuring MAC/PHY from eNB %d\n",Mod_idP,eNB_index); + LOG_E(MAC, "RC.mac:%p mib:%p\n", RC.mac, mib); - if (tdd_Config != NULL) { - UE_mac_inst[Mod_idP].tdd_Config = tdd_Config; - } - } else { - UE_id = find_UE_id(Mod_idP, rntiP); - if (physicalConfigDedicated == NULL) { - LOG_I(MAC,"[CONFIG][eNB %d/%d] Configuring MAC/PHY\n", Mod_idP, CC_idP); - } else { - LOG_I(MAC,"[CONFIG][eNB %d/%d] Configuring MAC/PHY for UE %d (%x)\n", Mod_idP, CC_idP, UE_id, UE_RNTI(Mod_idP, UE_id)); - } - } + if (mib != NULL) { + if (RC.mac == NULL) + l2_init_eNB(); - if (tdd_Config && SIwindowsize && SIperiod) { - if (eNB_flagP == ENB_FLAG_YES) { - mac_xface->phy_config_sib1_eNB(Mod_idP, CC_idP, tdd_Config, *SIwindowsize, *SIperiod); - } else { - mac_xface->phy_config_sib1_ue(Mod_idP,0,eNB_index,tdd_Config,*SIwindowsize,*SIperiod); - } - } + mac_top_init_eNB(); - if (radioResourceConfigCommon!=NULL) { - if (eNB_flagP==1) { - LOG_I(MAC,"[CONFIG]SIB2/3 Contents (partial)\n"); - LOG_I(MAC,"[CONFIG]pusch_config_common.n_SB = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB); - LOG_I(MAC,"[CONFIG]pusch_config_common.hoppingMode = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode); - LOG_I(MAC,"[CONFIG]pusch_config_common.pusch_HoppingOffset = %ld\n", radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset); - LOG_I(MAC,"[CONFIG]pusch_config_common.enable64QAM = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM); - LOG_I(MAC,"[CONFIG]pusch_config_common.groupHoppingEnabled = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled); - LOG_I(MAC,"[CONFIG]pusch_config_common.groupAssignmentPUSCH = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); - LOG_I(MAC,"[CONFIG]pusch_config_common.sequenceHoppingEnabled = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); - LOG_I(MAC,"[CONFIG]pusch_config_common.cyclicShift = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift); - mac_xface->phy_config_sib2_eNB(Mod_idP, CC_idP, radioResourceConfigCommon, ul_CarrierFreq, ul_Bandwidth, additionalSpectrumEmission, mbsfn_SubframeConfigList); - } else { - UE_mac_inst[Mod_idP].radioResourceConfigCommon = radioResourceConfigCommon; - mac_xface->phy_config_sib2_ue(Mod_idP,0,eNB_index,radioResourceConfigCommon,ul_CarrierFreq,ul_Bandwidth,additionalSpectrumEmission,mbsfn_SubframeConfigList); + RC.mac[Mod_idP]->common_channels[CC_idP].mib = mib; + RC.mac[Mod_idP]->common_channels[CC_idP].physCellId = physCellId; + RC.mac[Mod_idP]->common_channels[CC_idP].p_eNB = p_eNB; + RC.mac[Mod_idP]->common_channels[CC_idP].Ncp = Ncp; + RC.mac[Mod_idP]->common_channels[CC_idP].eutra_band = eutra_band; + RC.mac[Mod_idP]->common_channels[CC_idP].dl_CarrierFreq = dl_CarrierFreq; + + LOG_I(MAC, + "Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d,Nid_cell %d,p %d,DL freq %u,phich_config.resource %d, phich_config.duration %d)\n", + Mod_idP, + CC_idP, + eutra_band, + to_prb((int)mib->message.dl_Bandwidth), + physCellId, + p_eNB, + dl_CarrierFreq, + (int)mib->message.phich_Config.phich_Resource, + (int)mib->message.phich_Config.phich_Duration); + + config_mib(Mod_idP,CC_idP, + eutra_band, + mib->message.dl_Bandwidth, + &mib->message.phich_Config, + physCellId, + Ncp, + p_eNB, + dl_CarrierFreq, + ul_CarrierFreq +#ifdef Rel14 + , pbch_repetition +#endif + ); + + + mac_init_cell_params(Mod_idP,CC_idP); + + if (schedulingInfoList!=NULL) { + RC.mac[Mod_idP]->common_channels[CC_idP].tdd_Config = tdd_Config; + RC.mac[Mod_idP]->common_channels[CC_idP].schedulingInfoList = schedulingInfoList; + config_sib1(Mod_idP,CC_idP,tdd_Config); } - } +#ifdef Rel14 + if (sib1_v13ext != NULL) { + RC.mac[Mod_idP]->common_channels[CC_idP].sib1_v13ext = sib1_v13ext; + } +#endif + if (radioResourceConfigCommon != NULL) { + LOG_I(MAC, "[CONFIG]SIB2/3 Contents (partial)\n"); + LOG_I(MAC, "[CONFIG]pusch_config_common.n_SB = %ld\n", + radioResourceConfigCommon-> + pusch_ConfigCommon.pusch_ConfigBasic.n_SB); + LOG_I(MAC, "[CONFIG]pusch_config_common.hoppingMode = %ld\n", + radioResourceConfigCommon-> + pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode); + LOG_I(MAC, + "[CONFIG]pusch_config_common.pusch_HoppingOffset = %ld\n", + radioResourceConfigCommon-> + pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset); + LOG_I(MAC, "[CONFIG]pusch_config_common.enable64QAM = %d\n", + radioResourceConfigCommon-> + pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM); + LOG_I(MAC, + "[CONFIG]pusch_config_common.groupHoppingEnabled = %d\n", + radioResourceConfigCommon-> + pusch_ConfigCommon.ul_ReferenceSignalsPUSCH. + groupHoppingEnabled); + LOG_I(MAC, + "[CONFIG]pusch_config_common.groupAssignmentPUSCH = %ld\n", + radioResourceConfigCommon-> + pusch_ConfigCommon.ul_ReferenceSignalsPUSCH. + groupAssignmentPUSCH); + LOG_I(MAC, + "[CONFIG]pusch_config_common.sequenceHoppingEnabled = %d\n", + radioResourceConfigCommon-> + pusch_ConfigCommon.ul_ReferenceSignalsPUSCH. + sequenceHoppingEnabled); + LOG_I(MAC, "[CONFIG]pusch_config_common.cyclicShift = %ld\n", + radioResourceConfigCommon-> + pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift); + + AssertFatal(radioResourceConfigCommon-> + rach_ConfigCommon.maxHARQ_Msg3Tx > 0, + "radioResourceconfigCommon %d == 0\n", + (int) radioResourceConfigCommon-> + rach_ConfigCommon.maxHARQ_Msg3Tx); + + RC.mac[Mod_idP]->common_channels[CC_idP]. + radioResourceConfigCommon = radioResourceConfigCommon; + if (ul_CarrierFreq > 0) + RC.mac[Mod_idP]->common_channels[CC_idP].ul_CarrierFreq = + ul_CarrierFreq; + if (ul_Bandwidth) + RC.mac[Mod_idP]->common_channels[CC_idP].ul_Bandwidth = + *ul_Bandwidth; + else + RC.mac[Mod_idP]->common_channels[CC_idP].ul_Bandwidth = + RC.mac[Mod_idP]->common_channels[CC_idP].mib->message. + dl_Bandwidth; + + config_sib2(Mod_idP, CC_idP, radioResourceConfigCommon, +#ifdef Rel14 + radioResourceConfigCommon_BR, +#endif + NULL, ul_Bandwidth, additionalSpectrumEmission, + mbsfn_SubframeConfigList); + + } + } // mib != NULL // SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters->logicalChannelGroup - if (logicalChannelConfig!= NULL) { - if (eNB_flagP==0) { - LOG_I(MAC,"[CONFIG][UE %d] Applying RRC logicalChannelConfig from eNB%d\n",Mod_idP,eNB_index); - UE_mac_inst[Mod_idP].logicalChannelConfig[logicalChannelIdentity]=logicalChannelConfig; - UE_mac_inst[Mod_idP].scheduling_info.Bj[logicalChannelIdentity]=0; // initilize the bucket for this lcid + if (logicalChannelConfig != NULL) { // check for eMTC specific things + UE_id = find_UE_id(Mod_idP, rntiP); - if (logicalChannelConfig->ul_SpecificParameters) { - UE_mac_inst[Mod_idP].scheduling_info.bucket_size[logicalChannelIdentity]=logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate * - logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration; // set the max bucket size - UE_mac_inst[Mod_idP].scheduling_info.LCGID[logicalChannelIdentity]=*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup; - LOG_D(MAC,"[CONFIG][UE %d] LCID %d is attached to the LCGID %d\n",Mod_idP,logicalChannelIdentity,*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup); - } else { - LOG_E(MAC,"[CONFIG][UE %d] LCID %d NULL ul_SpecificParameters\n",Mod_idP,logicalChannelIdentity); - mac_xface->macphy_exit("NULL ul_SpecificParameters"); - } - } - else { + if (UE_id == -1) { + LOG_E(MAC, "%s:%d:%s: ERROR, UE_id == -1\n", __FILE__, + __LINE__, __FUNCTION__); + } else { if (logicalChannelConfig) - UE_list->UE_template[CC_idP][UE_id].lcgidmap[logicalChannelIdentity] = *logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup; + UE_list-> + UE_template[CC_idP][UE_id].lcgidmap + [logicalChannelIdentity] = + *logicalChannelConfig-> + ul_SpecificParameters->logicalChannelGroup; else - UE_list->UE_template[CC_idP][UE_id].lcgidmap[logicalChannelIdentity] = 0; + UE_list-> + UE_template[CC_idP][UE_id].lcgidmap + [logicalChannelIdentity] = 0; } } - if (mac_MainConfig != NULL) { - if (eNB_flagP==0) { - LOG_I(MAC,"[CONFIG][UE%d] Applying RRC macMainConfig from eNB%d\n",Mod_idP,eNB_index); - UE_mac_inst[Mod_idP].macConfig=mac_MainConfig; - UE_mac_inst[Mod_idP].measGapConfig=measGapConfig; - - if (mac_MainConfig->ul_SCH_Config) { - - if (mac_MainConfig->ul_SCH_Config->periodicBSR_Timer) { - UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer = (uint16_t) *mac_MainConfig->ul_SCH_Config->periodicBSR_Timer; - } else { - UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer = (uint16_t) MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity; - } - - if (mac_MainConfig->ul_SCH_Config->maxHARQ_Tx) { - UE_mac_inst[Mod_idP].scheduling_info.maxHARQ_Tx = (uint16_t) *mac_MainConfig->ul_SCH_Config->maxHARQ_Tx; - } else { - UE_mac_inst[Mod_idP].scheduling_info.maxHARQ_Tx = (uint16_t) MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5; - } - - if (mac_MainConfig->ul_SCH_Config->retxBSR_Timer) { - UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer = (uint16_t) mac_MainConfig->ul_SCH_Config->retxBSR_Timer; - } else { - UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer = (uint16_t)MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560; - } - } - -#ifdef Rel10 - - if (mac_MainConfig->ext1 && mac_MainConfig->ext1->sr_ProhibitTimer_r9) { - UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = (uint16_t) *mac_MainConfig->ext1->sr_ProhibitTimer_r9; - } else { - UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = (uint16_t) 0; - } - -#endif - UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_SF = get_sf_periodicBSRTimer(UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer); - UE_mac_inst[Mod_idP].scheduling_info.retxBSR_SF = get_sf_retxBSRTimer(UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer); - - UE_mac_inst[Mod_idP].scheduling_info.drx_config = mac_MainConfig->drx_Config; - UE_mac_inst[Mod_idP].scheduling_info.phr_config = mac_MainConfig->phr_Config; - - if (mac_MainConfig->phr_Config) { - UE_mac_inst[Mod_idP].PHR_state = mac_MainConfig->phr_Config->present; - UE_mac_inst[Mod_idP].PHR_reconfigured = 1; - UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer = mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer; - UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer = mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer; - UE_mac_inst[Mod_idP].scheduling_info.PathlossChange = mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange; - } else { - UE_mac_inst[Mod_idP].PHR_reconfigured = 0; - UE_mac_inst[Mod_idP].PHR_state = MAC_MainConfig__phr_Config_PR_setup; - UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer = MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20; - UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer = MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20; - UE_mac_inst[Mod_idP].scheduling_info.PathlossChange = MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; - } - - UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer); - UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer); - UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[Mod_idP].scheduling_info.PathlossChange); - LOG_D(MAC,"[UE %d] config PHR (%d): periodic %d (SF) prohibit %d (SF) pathlosschange %d (db) \n", - Mod_idP, - (mac_MainConfig->phr_Config)?mac_MainConfig->phr_Config->present:-1, - UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF, - UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF, - UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db); - } - } if (physicalConfigDedicated != NULL) { - if (eNB_flagP==1) { - mac_xface->phy_config_dedicated_eNB(Mod_idP, CC_idP, UE_RNTI(Mod_idP, UE_id), physicalConfigDedicated); - } else { - mac_xface->phy_config_dedicated_ue(Mod_idP,0,eNB_index,physicalConfigDedicated); - UE_mac_inst[Mod_idP].physicalConfigDedicated=physicalConfigDedicated; // for SR proc - } + UE_id = find_UE_id(Mod_idP, rntiP); + + if (UE_id == -1) + LOG_E(MAC, "%s:%d:%s: ERROR, UE_id == -1\n", __FILE__, __LINE__, __FUNCTION__); + else + UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated = physicalConfigDedicated; } -#ifdef Rel10 + +#if defined(Rel10) || defined(Rel14) if (sCellToAddMod_r10 != NULL) { - - if (eNB_flagP==1) { - mac_xface->phy_config_dedicated_scell_eNB(Mod_idP,UE_RNTI(Mod_idP,UE_id),sCellToAddMod_r10,1); - } else { - - //#warning "phy_config_dedicated_scell_ue is empty" - mac_xface->phy_config_dedicated_scell_ue(Mod_idP,eNB_index,sCellToAddMod_r10,1); - UE_mac_inst[Mod_idP].physicalConfigDedicatedSCell_r10 = sCellToAddMod_r10->radioResourceConfigDedicatedSCell_r10->physicalConfigDedicatedSCell_r10; // using SCell index 0 - } + UE_id = find_UE_id(Mod_idP, rntiP); + if (UE_id == -1) + LOG_E(MAC, "%s:%d:%s: ERROR, UE_id == -1\n", __FILE__, + __LINE__, __FUNCTION__); + else + config_dedicated_scell(Mod_idP, rntiP, sCellToAddMod_r10); } - #endif - if (eNB_flagP == 0) { - if (measObj!= NULL) { - if (measObj[0]!= NULL) { - UE_mac_inst[Mod_idP].n_adj_cells = measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList->list.count; - LOG_I(MAC,"Number of adjacent cells %d\n",UE_mac_inst[Mod_idP].n_adj_cells); - for (i=0; imeasObject.choice.measObjectEUTRA.cellsToAddModList->list.array[i]->physCellId; - LOG_I(MAC,"Cell %d : Nid_cell %d\n",i,UE_mac_inst[Mod_idP].adj_cell_id[i]); - } - mac_xface->phy_config_meas_ue(Mod_idP,0,eNB_index,UE_mac_inst[Mod_idP].n_adj_cells,UE_mac_inst[Mod_idP].adj_cell_id); - } - - /* - if (quantityConfig != NULL) { - if (quantityConfig[0] != NULL) { - UE_mac_inst[Mod_idP].quantityConfig = quantityConfig[0]; - LOG_I(MAC,"UE %d configured filterCoeff.",UE_mac_inst[Mod_idP].crnti); - mac_xface->phy_config_meas_ue - } - } - */ - } - } - - if (eNB_flagP==0) { - if(mobilityControlInfo != NULL) { - - LOG_D(MAC,"[UE%d] MAC Reset procedure triggered by RRC eNB %d \n",Mod_idP,eNB_index); - ue_mac_reset(Mod_idP,eNB_index); - - if(mobilityControlInfo->radioResourceConfigCommon.rach_ConfigCommon) { - memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->rach_ConfigCommon, - (void *)mobilityControlInfo->radioResourceConfigCommon.rach_ConfigCommon, - sizeof(RACH_ConfigCommon_t)); - } - - memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->prach_Config.prach_ConfigInfo, - (void *)mobilityControlInfo->radioResourceConfigCommon.prach_Config.prach_ConfigInfo, - sizeof(PRACH_ConfigInfo_t)); - UE_mac_inst[Mod_idP].radioResourceConfigCommon->prach_Config.rootSequenceIndex = mobilityControlInfo->radioResourceConfigCommon.prach_Config.rootSequenceIndex; - - if(mobilityControlInfo->radioResourceConfigCommon.pdsch_ConfigCommon) { - memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->pdsch_ConfigCommon, - (void *)mobilityControlInfo->radioResourceConfigCommon.pdsch_ConfigCommon, - sizeof(PDSCH_ConfigCommon_t)); - } - - // not a pointer: mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon - memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->pusch_ConfigCommon, - (void *)&mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon, - sizeof(PUSCH_ConfigCommon_t)); - - if(mobilityControlInfo->radioResourceConfigCommon.phich_Config) { - /* memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->phich_Config, - (void *)mobilityControlInfo->radioResourceConfigCommon.phich_Config, - sizeof(PHICH_Config_t)); */ - } - - if(mobilityControlInfo->radioResourceConfigCommon.pucch_ConfigCommon) { - memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->pucch_ConfigCommon, - (void *)mobilityControlInfo->radioResourceConfigCommon.pucch_ConfigCommon, - sizeof(PUCCH_ConfigCommon_t)); - } - - if(mobilityControlInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon) { - memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->soundingRS_UL_ConfigCommon, - (void *)mobilityControlInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon, - sizeof(SoundingRS_UL_ConfigCommon_t)); - } - - if(mobilityControlInfo->radioResourceConfigCommon.uplinkPowerControlCommon) { - memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->uplinkPowerControlCommon, - (void *)mobilityControlInfo->radioResourceConfigCommon.uplinkPowerControlCommon, - sizeof(UplinkPowerControlCommon_t)); - } - - //configure antennaInfoCommon somewhere here.. - if(mobilityControlInfo->radioResourceConfigCommon.p_Max) { - //to be configured - } - - if(mobilityControlInfo->radioResourceConfigCommon.tdd_Config) { - UE_mac_inst[Mod_idP].tdd_Config = mobilityControlInfo->radioResourceConfigCommon.tdd_Config; - } - - if(mobilityControlInfo->radioResourceConfigCommon.ul_CyclicPrefixLength) { - memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->ul_CyclicPrefixLength, - (void *)mobilityControlInfo->radioResourceConfigCommon.ul_CyclicPrefixLength, - sizeof(UL_CyclicPrefixLength_t)); - } - - // store the previous rnti in case of failure, and set thenew rnti - UE_mac_inst[Mod_idP].crnti_before_ho = UE_mac_inst[Mod_idP].crnti; - UE_mac_inst[Mod_idP].crnti = ((mobilityControlInfo->newUE_Identity.buf[0])|(mobilityControlInfo->newUE_Identity.buf[1]<<8)); - LOG_I(MAC,"[UE %d] Received new identity %x from %d\n", Mod_idP, UE_mac_inst[Mod_idP].crnti, eNB_index); - UE_mac_inst[Mod_idP].rach_ConfigDedicated = malloc(sizeof(*mobilityControlInfo->rach_ConfigDedicated)); - - if (mobilityControlInfo->rach_ConfigDedicated) { - memcpy((void*)UE_mac_inst[Mod_idP].rach_ConfigDedicated, - (void*)mobilityControlInfo->rach_ConfigDedicated, - sizeof(*mobilityControlInfo->rach_ConfigDedicated)); - } - - mac_xface->phy_config_afterHO_ue(Mod_idP,0,eNB_index,mobilityControlInfo,0); - } - } if (mbsfn_SubframeConfigList != NULL) { - if (eNB_flagP == 1) { - LOG_I(MAC,"[eNB %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_idP, mbsfn_SubframeConfigList->list.count); - eNB_mac_inst[Mod_idP].common_channels[0].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count; + LOG_I(MAC, + "[eNB %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", + Mod_idP, mbsfn_SubframeConfigList->list.count); + RC.mac[Mod_idP]->common_channels[0].num_sf_allocation_pattern = + mbsfn_SubframeConfigList->list.count; - for (i=0; ilist.count; i++) { - eNB_mac_inst[Mod_idP].common_channels[0].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i]; - LOG_I(MAC, "[eNB %d][CONFIG] MBSFN_SubframeConfig[%d] pattern is %x\n", Mod_idP, i, - eNB_mac_inst[Mod_idP].common_channels[0].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]); - } - -#ifdef Rel10 - eNB_mac_inst[Mod_idP].common_channels[0].MBMS_flag = MBMS_Flag; -#endif - } else { // UE - LOG_I(MAC,"[UE %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_idP, mbsfn_SubframeConfigList->list.count); - UE_mac_inst[Mod_idP].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count; - - for (i=0; ilist.count; i++) { - LOG_I(MAC, "[UE %d] Configuring MBSFN_SubframeConfig %d from received SIB2 \n", Mod_idP, i); - UE_mac_inst[Mod_idP].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i]; - // LOG_I("[UE %d] MBSFN_SubframeConfig[%d] pattern is %ld\n", Mod_idP, - // UE_mac_inst[Mod_idP].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]); - } + for (i = 0; i < mbsfn_SubframeConfigList->list.count; i++) { + RC.mac[Mod_idP]->common_channels[0].mbsfn_SubframeConfig[i] = + mbsfn_SubframeConfigList->list.array[i]; + LOG_I(MAC, + "[eNB %d][CONFIG] MBSFN_SubframeConfig[%d] pattern is %x\n", + Mod_idP, i, + RC.mac[Mod_idP]-> + common_channels[0].mbsfn_SubframeConfig[i]-> + subframeAllocation.choice.oneFrame.buf[0]); } - } #ifdef Rel10 + RC.mac[Mod_idP]->common_channels[0].MBMS_flag = MBMS_Flag; +#endif + } +#if defined(Rel10) || defined(Rel14) if (mbsfn_AreaInfoList != NULL) { - if (eNB_flagP == 1) { // One eNB could be part of multiple mbsfn syc area, this could change over time so reset each time - LOG_I(MAC,"[eNB %d][CONFIG] Received %d MBSFN Area Info\n", Mod_idP, mbsfn_AreaInfoList->list.count); - eNB_mac_inst[Mod_idP].common_channels[0].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count; - - for (i =0; i< mbsfn_AreaInfoList->list.count; i++) { - eNB_mac_inst[Mod_idP].common_channels[0].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i]; - LOG_I(MAC,"[eNB %d][CONFIG] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n", Mod_idP,i, - eNB_mac_inst[Mod_idP].common_channels[0].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - mac_xface->phy_config_sib13_eNB(Mod_idP,0,i,eNB_mac_inst[Mod_idP].common_channels[0].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9); - } - } else { // UE - LOG_I(MAC,"[UE %d][CONFIG] Received %d MBSFN Area Info\n", Mod_idP, mbsfn_AreaInfoList->list.count); - UE_mac_inst[Mod_idP].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count; - - for (i =0; i< mbsfn_AreaInfoList->list.count; i++) { - UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i]; - LOG_I(MAC,"[UE %d] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n",Mod_idP, i, - UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - mac_xface->phy_config_sib13_ue(Mod_idP,0,eNB_index,i,UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9); - } + LOG_I(MAC,"[eNB %d][CONFIG] Received %d MBSFN Area Info\n", Mod_idP, mbsfn_AreaInfoList->list.count); + RC.mac[Mod_idP]->common_channels[0].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count; + + for (i =0; i< mbsfn_AreaInfoList->list.count; i++) { + RC.mac[Mod_idP]->common_channels[0].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i]; + LOG_I(MAC,"[eNB %d][CONFIG] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n", Mod_idP,i, + RC.mac[Mod_idP]->common_channels[0].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + // config_sib13(Mod_idP,0,i,RC.mac[Mod_idP]->common_channels[0].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9); } - } - + } if (pmch_InfoList != NULL) { - + // LOG_I(MAC,"DUY: lcid when entering rrc_mac config_req is %02d\n",(pmch_InfoList->list.array[0]->mbms_SessionInfoList_r9.list.array[0]->logicalChannelIdentity_r9)); - - if (eNB_flagP == 1) { - - LOG_I(MAC, "[CONFIG] Number of PMCH in this MBSFN Area %d\n", pmch_InfoList->list.count); - - for (i =0; i< pmch_InfoList->list.count; i++) { - eNB_mac_inst[Mod_idP].common_channels[0].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9; - - LOG_I(MAC, "[CONFIG] PMCH[%d]: This PMCH stop (sf_AllocEnd_r9) at subframe %ldth\n", i, - eNB_mac_inst[Mod_idP].common_channels[0].pmch_Config[i]->sf_AllocEnd_r9); - LOG_I(MAC, "[CONFIG] PMCH[%d]: mch_Scheduling_Period = %ld\n", i, - eNB_mac_inst[Mod_idP].common_channels[0].pmch_Config[i]->mch_SchedulingPeriod_r9); - LOG_I(MAC, "[CONFIG] PMCH[%d]: dataMCS = %ld\n", i, - eNB_mac_inst[Mod_idP].common_channels[0].pmch_Config[i]->dataMCS_r9); - - // MBMS session info list in each MCH - eNB_mac_inst[Mod_idP].common_channels[0].mbms_SessionList[i] = &pmch_InfoList->list.array[i]->mbms_SessionInfoList_r9; - LOG_I(MAC, "PMCH[%d] Number of session (MTCH) is: %d\n",i, eNB_mac_inst[Mod_idP].common_channels[0].mbms_SessionList[i]->list.count); - } - } else { // UE - LOG_I(MAC, "[UE %d] Configuring PMCH_config from MCCH MESSAGE \n",Mod_idP); - - for (i =0; i< pmch_InfoList->list.count; i++) { - UE_mac_inst[Mod_idP].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9; - LOG_I(MAC, "[UE %d] PMCH[%d]: MCH_Scheduling_Period = %ld\n", Mod_idP, i, - UE_mac_inst[Mod_idP].pmch_Config[i]->mch_SchedulingPeriod_r9); - } - - UE_mac_inst[Mod_idP].mcch_status = 1; + + LOG_I(MAC, "[CONFIG] Number of PMCH in this MBSFN Area %d\n", + pmch_InfoList->list.count); + + for (i = 0; i < pmch_InfoList->list.count; i++) { + RC.mac[Mod_idP]->common_channels[0].pmch_Config[i] = + &pmch_InfoList->list.array[i]->pmch_Config_r9; + + LOG_I(MAC, + "[CONFIG] PMCH[%d]: This PMCH stop (sf_AllocEnd_r9) at subframe %ldth\n", + i, + RC.mac[Mod_idP]->common_channels[0]. + pmch_Config[i]->sf_AllocEnd_r9); + LOG_I(MAC, "[CONFIG] PMCH[%d]: mch_Scheduling_Period = %ld\n", + i, + RC.mac[Mod_idP]->common_channels[0]. + pmch_Config[i]->mch_SchedulingPeriod_r9); + LOG_I(MAC, "[CONFIG] PMCH[%d]: dataMCS = %ld\n", i, + RC.mac[Mod_idP]->common_channels[0]. + pmch_Config[i]->dataMCS_r9); + + // MBMS session info list in each MCH + RC.mac[Mod_idP]->common_channels[0].mbms_SessionList[i] = + &pmch_InfoList->list.array[i]->mbms_SessionInfoList_r9; + LOG_I(MAC, "PMCH[%d] Number of session (MTCH) is: %d\n", i, + RC.mac[Mod_idP]->common_channels[0]. + mbms_SessionList[i]->list.count); } } #endif -#ifdef CBA + + LOG_E(MAC, "%s() %s:%d RC.mac[Mod_idP]->if_inst->PHY_config_req:%p\n", __FUNCTION__, __FILE__, __LINE__, RC.mac[Mod_idP]->if_inst->PHY_config_req); - if (eNB_flagP == 0) { - if (cba_rnti) { - UE_mac_inst[Mod_idP].cba_rnti[num_active_cba_groups-1] = cba_rnti; - LOG_D(MAC,"[UE %d] configure CBA group %d RNTI %x for eNB %d (total active cba group %d)\n", - Mod_idP,Mod_idP%num_active_cba_groups, cba_rnti,eNB_index,num_active_cba_groups); - mac_xface->phy_config_cba_rnti(Mod_idP,CC_idP,eNB_flagP,eNB_index,cba_rnti,num_active_cba_groups-1, num_active_cba_groups); - } - } else { - if (cba_rnti) { - LOG_D(MAC,"[eNB %d] configure CBA RNTI for UE %d (total active cba groups %d)\n", - Mod_idP, UE_id, num_active_cba_groups); - eNB_mac_inst[Mod_idP].common_channels[CC_idP].num_active_cba_groups=num_active_cba_groups; - - for (i=0; i < num_active_cba_groups; i ++) { - if (eNB_mac_inst[Mod_idP].common_channels[CC_idP].cba_rnti[i] != cba_rnti + i) { - eNB_mac_inst[Mod_idP].common_channels[CC_idP].cba_rnti[i] = cba_rnti + i; - } - - //only configure UE ids up to num_active_cba_groups - //we use them as candidates for the transmission of dci format0) - if (UE_id%num_active_cba_groups == i) { - mac_xface->phy_config_cba_rnti(Mod_idP,CC_idP,eNB_flagP,UE_id,cba_rnti + i,i,num_active_cba_groups ); - LOG_D(MAC,"[eNB %d] configure CBA groups %d with RNTI %x for UE %d (total active cba groups %d)\n", - Mod_idP, i, eNB_mac_inst[Mod_idP].common_channels[CC_idP].cba_rnti[i],UE_id, num_active_cba_groups); - } + // if in nFAPI mode + if ( + (nfapi_mode == 1 || nfapi_mode == 2) && + (RC.mac[Mod_idP]->if_inst->PHY_config_req == NULL) + ) { + while(RC.mac[Mod_idP]->if_inst->PHY_config_req == NULL) { + // DJP AssertFatal(RC.mac[Mod_idP]->if_inst->PHY_config_req != NULL,"if_inst->phy_config_request is null\n"); + usleep(100 * 1000); + printf("Waiting for PHY_config_req\n"); } } - } -#endif - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT); + if (radioResourceConfigCommon != NULL) { + PHY_Config_t phycfg; + phycfg.Mod_id = Mod_idP; + phycfg.CC_id = CC_idP; + phycfg.cfg = &RC.mac[Mod_idP]->config[CC_idP]; - return(0); + if (RC.mac[Mod_idP]->if_inst->PHY_config_req) RC.mac[Mod_idP]->if_inst->PHY_config_req(&phycfg); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT); + } + + return(0); } -#ifdef LOCALIZATION -//------------------------------------------------------------------------------ -double -rrc_get_estimated_ue_distance( - const protocol_ctxt_t* const ctxt_pP, - const int CC_idP, - const uint8_t loc_typeP -) -//------------------------------------------------------------------------------ -{ - // localization types: - // 0: power based - // 1: time based - LTE_eNB_UE_stats *eNB_UE_stats = NULL; - UE_list_t* UE_list = &eNB_mac_inst[ctxt_pP->module_id].UE_list; - int pCCid; - int UE_id; - - if(ctxt_pP->rnti == NOT_A_RNTI) { - return -1; - } - - UE_id = find_UE_id(ctxt_pP->module_id,ctxt_pP->rnti); - pCCid = UE_PCCID(ctxt_pP->module_id,UE_id); - eNB_UE_stats = mac_xface->get_eNB_UE_stats(ctxt_pP->module_id,pCCid,ctxt_pP->rnti); - - switch (loc_typeP) { - case 0: - return eNB_UE_stats->distance.power_based; - break; - - case 1: - return eNB_UE_stats->distance.time_based; - break; - - default: - return eNB_UE_stats->distance.power_based; - } - - // LOG_D(LOCALIZE, "DEBUG ME, dist = %d\n", &eNB_mac_inst[ctxt_pP->module_id].UE_list.UE_template[CC_idP][UE_id].distance.power_based); - -} - -#endif diff --git a/openair2/LAYER2/MAC/config_ue.c b/openair2/LAYER2/MAC/config_ue.c new file mode 100644 index 0000000000..5ef18f5bda --- /dev/null +++ b/openair2/LAYER2/MAC/config_ue.c @@ -0,0 +1,584 @@ + +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file config.c + * \brief UE and eNB configuration performed by RRC or as a consequence of RRC procedures + * \author Navid Nikaein and Raymond Knopp + * \date 2010 - 2014 + * \version 0.1 + * \email: navid.nikaein@eurecom.fr + * @ingroup _mac + + */ + +#include "COMMON/platform_types.h" +#include "COMMON/platform_constants.h" +#include "SCHED/defs.h" +#include "SystemInformationBlockType2.h" +//#include "RadioResourceConfigCommonSIB.h" +#include "RadioResourceConfigDedicated.h" +#ifdef Rel14 +#include "PRACH-ConfigSIB-v1310.h" +#endif +#include "MeasGapConfig.h" +#include "MeasObjectToAddModList.h" +#include "TDD-Config.h" +#include "MAC-MainConfig.h" +#include "defs.h" +#include "proto.h" +#include "extern.h" +#include "UTIL/LOG/log.h" +#include "UTIL/LOG/vcd_signal_dumper.h" + +#include "common/ran_context.h" +#if defined(Rel10) || defined(Rel14) +#include "MBSFN-AreaInfoList-r9.h" +#include "MBSFN-AreaInfo-r9.h" +#include "MBSFN-SubframeConfigList.h" +#include "PMCH-InfoList-r9.h" +#endif + +extern void mac_init_cell_params(int Mod_idP,int CC_idP); +extern void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index); + + +/* sec 5.9, 36.321: MAC Reset Procedure */ +void ue_mac_reset(module_id_t module_idP, uint8_t eNB_index) +{ + + //Resetting Bj + UE_mac_inst[module_idP].scheduling_info.Bj[0] = 0; + UE_mac_inst[module_idP].scheduling_info.Bj[1] = 0; + UE_mac_inst[module_idP].scheduling_info.Bj[2] = 0; + + //Stopping all timers + + //timeAlignmentTimer expires + + // PHY changes for UE MAC reset + phy_reset_ue(module_idP, 0, eNB_index); + + // notify RRC to relase PUCCH/SRS + // cancel all pending SRs + UE_mac_inst[module_idP].scheduling_info.SR_pending = 0; + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER = 0; + + //Set BSR Trigger Bmp and remove timer flags + UE_mac_inst[module_idP].BSR_reporting_active = BSR_TRIGGER_NONE; + + // stop ongoing RACH procedure + + // discard explicitly signaled ra_PreambleIndex and ra_RACH_MaskIndex, if any + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = 0; // check! + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; + + + ue_init_mac(module_idP); //This will hopefully do the rest of the MAC reset procedure + +} + +int32_t **rxdata; +int32_t **txdata; + + +int +rrc_mac_config_req_ue(module_id_t Mod_idP, + int CC_idP, + uint8_t eNB_index, + RadioResourceConfigCommonSIB_t * + radioResourceConfigCommon, + struct PhysicalConfigDedicated + *physicalConfigDedicated, +#if defined(Rel10) || defined(Rel14) + SCellToAddMod_r10_t * sCellToAddMod_r10, + //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, +#endif + MeasObjectToAddMod_t ** measObj, + MAC_MainConfig_t * mac_MainConfig, + long logicalChannelIdentity, + LogicalChannelConfig_t * logicalChannelConfig, + MeasGapConfig_t * measGapConfig, + TDD_Config_t * tdd_Config, + MobilityControlInfo_t * mobilityControlInfo, + uint8_t * SIwindowsize, + uint16_t * SIperiod, + ARFCN_ValueEUTRA_t * ul_CarrierFreq, + long *ul_Bandwidth, + AdditionalSpectrumEmission_t * + additionalSpectrumEmission, + struct MBSFN_SubframeConfigList + *mbsfn_SubframeConfigList +#if defined(Rel10) || defined(Rel14) + , uint8_t MBMS_Flag, + MBSFN_AreaInfoList_r9_t * mbsfn_AreaInfoList, + PMCH_InfoList_r9_t * pmch_InfoList +#endif +#ifdef CBA + , uint8_t num_active_cba_groups, uint16_t cba_rnti +#endif + ) +{ + + int i; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_IN); + + LOG_I(MAC, "[CONFIG][UE %d] Configuring MAC/PHY from eNB %d\n", + Mod_idP, eNB_index); + + if (tdd_Config != NULL) { + UE_mac_inst[Mod_idP].tdd_Config = tdd_Config; + } + + + if (tdd_Config && SIwindowsize && SIperiod) { + phy_config_sib1_ue(Mod_idP, 0, eNB_index, tdd_Config, + *SIwindowsize, *SIperiod); + } + + if (radioResourceConfigCommon != NULL) { + UE_mac_inst[Mod_idP].radioResourceConfigCommon = + radioResourceConfigCommon; + phy_config_sib2_ue(Mod_idP, 0, eNB_index, + radioResourceConfigCommon, ul_CarrierFreq, + ul_Bandwidth, additionalSpectrumEmission, + mbsfn_SubframeConfigList); + } + // SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters->logicalChannelGroup + if (logicalChannelConfig != NULL) { + LOG_I(MAC, + "[CONFIG][UE %d] Applying RRC logicalChannelConfig from eNB%d\n", + Mod_idP, eNB_index); + UE_mac_inst[Mod_idP].logicalChannelConfig[logicalChannelIdentity] = + logicalChannelConfig; + UE_mac_inst[Mod_idP].scheduling_info.Bj[logicalChannelIdentity] = 0; // initilize the bucket for this lcid + + AssertFatal(logicalChannelConfig->ul_SpecificParameters != NULL, + "[UE %d] LCID %ld NULL ul_SpecificParameters\n", + Mod_idP, logicalChannelIdentity); + UE_mac_inst[Mod_idP].scheduling_info.bucket_size[logicalChannelIdentity] = logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate * logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration; // set the max bucket size + if (logicalChannelConfig->ul_SpecificParameters-> + logicalChannelGroup != NULL) { + UE_mac_inst[Mod_idP].scheduling_info. + LCGID[logicalChannelIdentity] = + *logicalChannelConfig->ul_SpecificParameters-> + logicalChannelGroup; + LOG_D(MAC, + "[CONFIG][UE %d] LCID %ld is attached to the LCGID %ld\n", + Mod_idP, logicalChannelIdentity, + *logicalChannelConfig-> + ul_SpecificParameters->logicalChannelGroup); + } else { + UE_mac_inst[Mod_idP].scheduling_info. + LCGID[logicalChannelIdentity] = MAX_NUM_LCGID; + } + UE_mac_inst[Mod_idP]. + scheduling_info.LCID_buffer_remain[logicalChannelIdentity] = 0; + } + + if (mac_MainConfig != NULL) { + LOG_I(MAC, + "[CONFIG][UE%d] Applying RRC macMainConfig from eNB%d\n", + Mod_idP, eNB_index); + UE_mac_inst[Mod_idP].macConfig = mac_MainConfig; + UE_mac_inst[Mod_idP].measGapConfig = measGapConfig; + + if (mac_MainConfig->ul_SCH_Config) { + + if (mac_MainConfig->ul_SCH_Config->periodicBSR_Timer) { + UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer = + (uint16_t) * + mac_MainConfig->ul_SCH_Config->periodicBSR_Timer; + } else { + UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_Timer = +#ifndef Rel14 + (uint16_t) + MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity +#else + (uint16_t) PeriodicBSR_Timer_r12_infinity; +#endif + ; + } + + if (mac_MainConfig->ul_SCH_Config->maxHARQ_Tx) { + UE_mac_inst[Mod_idP].scheduling_info.maxHARQ_Tx = + (uint16_t) * mac_MainConfig->ul_SCH_Config->maxHARQ_Tx; + } else { + UE_mac_inst[Mod_idP].scheduling_info.maxHARQ_Tx = + (uint16_t) + MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5; + } + phy_config_harq_ue(Mod_idP, 0, eNB_index, + UE_mac_inst[Mod_idP]. + scheduling_info.maxHARQ_Tx); + + if (mac_MainConfig->ul_SCH_Config->retxBSR_Timer) { + UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer = + (uint16_t) mac_MainConfig->ul_SCH_Config-> + retxBSR_Timer; + } else { +#ifndef Rel14 + UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer = + (uint16_t) + MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560; +#else + UE_mac_inst[Mod_idP].scheduling_info.retxBSR_Timer = + (uint16_t) RetxBSR_Timer_r12_sf2560; +#endif + } + } +#if defined(Rel10) || defined(Rel14) + + if (mac_MainConfig->ext1 + && mac_MainConfig->ext1->sr_ProhibitTimer_r9) { + UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = + (uint16_t) * mac_MainConfig->ext1->sr_ProhibitTimer_r9; + } else { + UE_mac_inst[Mod_idP].scheduling_info.sr_ProhibitTimer = 0; + } + + if (mac_MainConfig->ext2 + && mac_MainConfig->ext2->mac_MainConfig_v1020) { + if (mac_MainConfig->ext2-> + mac_MainConfig_v1020->extendedBSR_Sizes_r10) { + UE_mac_inst[Mod_idP].scheduling_info. + extendedBSR_Sizes_r10 = + (uint16_t) * + mac_MainConfig->ext2-> + mac_MainConfig_v1020->extendedBSR_Sizes_r10; + } else { + UE_mac_inst[Mod_idP].scheduling_info. + extendedBSR_Sizes_r10 = (uint16_t) 0; + } + if (mac_MainConfig->ext2->mac_MainConfig_v1020-> + extendedPHR_r10) { + UE_mac_inst[Mod_idP].scheduling_info.extendedPHR_r10 = + (uint16_t) * + mac_MainConfig->ext2->mac_MainConfig_v1020-> + extendedPHR_r10; + } else { + UE_mac_inst[Mod_idP].scheduling_info.extendedPHR_r10 = + (uint16_t) 0; + } + } else { + UE_mac_inst[Mod_idP].scheduling_info.extendedBSR_Sizes_r10 = + (uint16_t) 0; + UE_mac_inst[Mod_idP].scheduling_info.extendedPHR_r10 = + (uint16_t) 0; + } +#endif + UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_SF = + MAC_UE_BSR_TIMER_NOT_RUNNING; + UE_mac_inst[Mod_idP].scheduling_info.retxBSR_SF = + MAC_UE_BSR_TIMER_NOT_RUNNING; + + UE_mac_inst[Mod_idP].BSR_reporting_active = BSR_TRIGGER_NONE; + + LOG_D(MAC, "[UE %d]: periodic BSR %d (SF), retx BSR %d (SF)\n", + Mod_idP, + UE_mac_inst[Mod_idP].scheduling_info.periodicBSR_SF, + UE_mac_inst[Mod_idP].scheduling_info.retxBSR_SF); + + UE_mac_inst[Mod_idP].scheduling_info.drx_config = + mac_MainConfig->drx_Config; + UE_mac_inst[Mod_idP].scheduling_info.phr_config = + mac_MainConfig->phr_Config; + + if (mac_MainConfig->phr_Config) { + UE_mac_inst[Mod_idP].PHR_state = + mac_MainConfig->phr_Config->present; + UE_mac_inst[Mod_idP].PHR_reconfigured = 1; + UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer = + mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer; + UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer = + mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer; + UE_mac_inst[Mod_idP].scheduling_info.PathlossChange = + mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange; + } else { + UE_mac_inst[Mod_idP].PHR_reconfigured = 0; + UE_mac_inst[Mod_idP].PHR_state = + MAC_MainConfig__phr_Config_PR_setup; + UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_Timer = + MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20; + UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_Timer = + MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20; + UE_mac_inst[Mod_idP].scheduling_info.PathlossChange = + MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; + } + + UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF = + get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_idP]. + scheduling_info.periodicPHR_Timer); + UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF = + get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_idP]. + scheduling_info.prohibitPHR_Timer); + UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db = + get_db_dl_PathlossChange(UE_mac_inst[Mod_idP]. + scheduling_info.PathlossChange); + UE_mac_inst[Mod_idP].PHR_reporting_active = 0; + LOG_D(MAC, + "[UE %d] config PHR (%d): periodic %d (SF) prohibit %d (SF) pathlosschange %d (db) \n", + Mod_idP, + (mac_MainConfig->phr_Config) ? mac_MainConfig-> + phr_Config->present : -1, + UE_mac_inst[Mod_idP].scheduling_info.periodicPHR_SF, + UE_mac_inst[Mod_idP].scheduling_info.prohibitPHR_SF, + UE_mac_inst[Mod_idP].scheduling_info.PathlossChange_db); + } + + + if (physicalConfigDedicated != NULL) { + phy_config_dedicated_ue(Mod_idP, 0, eNB_index, + physicalConfigDedicated); + UE_mac_inst[Mod_idP].physicalConfigDedicated = physicalConfigDedicated; // for SR proc + } +#if defined(Rel10) || defined(Rel14) + + if (sCellToAddMod_r10 != NULL) { + + + phy_config_dedicated_scell_ue(Mod_idP, eNB_index, + sCellToAddMod_r10, 1); + UE_mac_inst[Mod_idP].physicalConfigDedicatedSCell_r10 = sCellToAddMod_r10->radioResourceConfigDedicatedSCell_r10->physicalConfigDedicatedSCell_r10; // using SCell index 0 + } +#endif + + if (measObj != NULL) { + if (measObj[0] != NULL) { + UE_mac_inst[Mod_idP].n_adj_cells = + measObj[0]->measObject.choice. + measObjectEUTRA.cellsToAddModList->list.count; + LOG_I(MAC, "Number of adjacent cells %d\n", + UE_mac_inst[Mod_idP].n_adj_cells); + + for (i = 0; i < UE_mac_inst[Mod_idP].n_adj_cells; i++) { + UE_mac_inst[Mod_idP].adj_cell_id[i] = + measObj[0]->measObject.choice. + measObjectEUTRA.cellsToAddModList->list.array[i]-> + physCellId; + LOG_I(MAC, "Cell %d : Nid_cell %d\n", i, + UE_mac_inst[Mod_idP].adj_cell_id[i]); + } + + phy_config_meas_ue(Mod_idP, 0, eNB_index, + UE_mac_inst[Mod_idP].n_adj_cells, + UE_mac_inst[Mod_idP].adj_cell_id); + } + } + + + if (mobilityControlInfo != NULL) { + + LOG_D(MAC, "[UE%d] MAC Reset procedure triggered by RRC eNB %d \n", + Mod_idP, eNB_index); + ue_mac_reset(Mod_idP, eNB_index); + + if (mobilityControlInfo->radioResourceConfigCommon. + rach_ConfigCommon) { + memcpy((void *) + &UE_mac_inst[Mod_idP].radioResourceConfigCommon-> + rach_ConfigCommon, + (void *) mobilityControlInfo-> + radioResourceConfigCommon.rach_ConfigCommon, + sizeof(RACH_ConfigCommon_t)); + } + + memcpy((void *) &UE_mac_inst[Mod_idP]. + radioResourceConfigCommon->prach_Config.prach_ConfigInfo, + (void *) mobilityControlInfo-> + radioResourceConfigCommon.prach_Config.prach_ConfigInfo, + sizeof(PRACH_ConfigInfo_t)); + UE_mac_inst[Mod_idP].radioResourceConfigCommon-> + prach_Config.rootSequenceIndex = + mobilityControlInfo->radioResourceConfigCommon. + prach_Config.rootSequenceIndex; + + if (mobilityControlInfo->radioResourceConfigCommon. + pdsch_ConfigCommon) { + memcpy((void *) + &UE_mac_inst[Mod_idP].radioResourceConfigCommon-> + pdsch_ConfigCommon, + (void *) mobilityControlInfo-> + radioResourceConfigCommon.pdsch_ConfigCommon, + sizeof(PDSCH_ConfigCommon_t)); + } + // not a pointer: mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon + memcpy((void *) &UE_mac_inst[Mod_idP]. + radioResourceConfigCommon->pusch_ConfigCommon, + (void *) &mobilityControlInfo-> + radioResourceConfigCommon.pusch_ConfigCommon, + sizeof(PUSCH_ConfigCommon_t)); + + if (mobilityControlInfo->radioResourceConfigCommon.phich_Config) { + /* memcpy((void *)&UE_mac_inst[Mod_idP].radioResourceConfigCommon->phich_Config, + (void *)mobilityControlInfo->radioResourceConfigCommon.phich_Config, + sizeof(PHICH_Config_t)); */ + } + + if (mobilityControlInfo->radioResourceConfigCommon. + pucch_ConfigCommon) { + memcpy((void *) + &UE_mac_inst[Mod_idP].radioResourceConfigCommon-> + pucch_ConfigCommon, + (void *) mobilityControlInfo-> + radioResourceConfigCommon.pucch_ConfigCommon, + sizeof(PUCCH_ConfigCommon_t)); + } + + if (mobilityControlInfo-> + radioResourceConfigCommon.soundingRS_UL_ConfigCommon) { + memcpy((void *) + &UE_mac_inst[Mod_idP].radioResourceConfigCommon-> + soundingRS_UL_ConfigCommon, + (void *) mobilityControlInfo-> + radioResourceConfigCommon.soundingRS_UL_ConfigCommon, + sizeof(SoundingRS_UL_ConfigCommon_t)); + } + + if (mobilityControlInfo-> + radioResourceConfigCommon.uplinkPowerControlCommon) { + memcpy((void *) + &UE_mac_inst[Mod_idP].radioResourceConfigCommon-> + uplinkPowerControlCommon, + (void *) mobilityControlInfo-> + radioResourceConfigCommon.uplinkPowerControlCommon, + sizeof(UplinkPowerControlCommon_t)); + } + //configure antennaInfoCommon somewhere here.. + if (mobilityControlInfo->radioResourceConfigCommon.p_Max) { + //to be configured + } + + if (mobilityControlInfo->radioResourceConfigCommon.tdd_Config) { + UE_mac_inst[Mod_idP].tdd_Config = + mobilityControlInfo->radioResourceConfigCommon.tdd_Config; + } + + if (mobilityControlInfo-> + radioResourceConfigCommon.ul_CyclicPrefixLength) { + memcpy((void *) + &UE_mac_inst[Mod_idP].radioResourceConfigCommon-> + ul_CyclicPrefixLength, + (void *) mobilityControlInfo-> + radioResourceConfigCommon.ul_CyclicPrefixLength, + sizeof(UL_CyclicPrefixLength_t)); + } + // store the previous rnti in case of failure, and set thenew rnti + UE_mac_inst[Mod_idP].crnti_before_ho = UE_mac_inst[Mod_idP].crnti; + UE_mac_inst[Mod_idP].crnti = + ((mobilityControlInfo-> + newUE_Identity.buf[0]) | (mobilityControlInfo-> + newUE_Identity.buf[1] << 8)); + LOG_I(MAC, "[UE %d] Received new identity %x from %d\n", Mod_idP, + UE_mac_inst[Mod_idP].crnti, eNB_index); + UE_mac_inst[Mod_idP].rach_ConfigDedicated = + malloc(sizeof(*mobilityControlInfo->rach_ConfigDedicated)); + + if (mobilityControlInfo->rach_ConfigDedicated) { + memcpy((void *) UE_mac_inst[Mod_idP].rach_ConfigDedicated, + (void *) mobilityControlInfo->rach_ConfigDedicated, + sizeof(*mobilityControlInfo->rach_ConfigDedicated)); + } + + phy_config_afterHO_ue(Mod_idP, 0, eNB_index, mobilityControlInfo, + 0); + } + + + if (mbsfn_SubframeConfigList != NULL) { + LOG_I(MAC, + "[UE %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", + Mod_idP, mbsfn_SubframeConfigList->list.count); + UE_mac_inst[Mod_idP].num_sf_allocation_pattern = + mbsfn_SubframeConfigList->list.count; + + for (i = 0; i < mbsfn_SubframeConfigList->list.count; i++) { + LOG_I(MAC, + "[UE %d] Configuring MBSFN_SubframeConfig %d from received SIB2 \n", + Mod_idP, i); + UE_mac_inst[Mod_idP].mbsfn_SubframeConfig[i] = + mbsfn_SubframeConfigList->list.array[i]; + // LOG_I("[UE %d] MBSFN_SubframeConfig[%d] pattern is %ld\n", Mod_idP, + // UE_mac_inst[Mod_idP].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]); + } + } +#if defined(Rel10) || defined(Rel14) + + if (mbsfn_AreaInfoList != NULL) { + LOG_I(MAC, "[UE %d][CONFIG] Received %d MBSFN Area Info\n", + Mod_idP, mbsfn_AreaInfoList->list.count); + UE_mac_inst[Mod_idP].num_active_mbsfn_area = + mbsfn_AreaInfoList->list.count; + + for (i = 0; i < mbsfn_AreaInfoList->list.count; i++) { + UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i] = + mbsfn_AreaInfoList->list.array[i]; + LOG_I(MAC, + "[UE %d] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n", + Mod_idP, i, + UE_mac_inst[Mod_idP].mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_RepetitionPeriod_r9); + phy_config_sib13_ue(Mod_idP, 0, eNB_index, i, + UE_mac_inst[Mod_idP]. + mbsfn_AreaInfo[i]->mbsfn_AreaId_r9); + } + } + + if (pmch_InfoList != NULL) { + + // LOG_I(MAC,"DUY: lcid when entering rrc_mac config_req is %02d\n",(pmch_InfoList->list.array[0]->mbms_SessionInfoList_r9.list.array[0]->logicalChannelIdentity_r9)); + + LOG_I(MAC, "[UE %d] Configuring PMCH_config from MCCH MESSAGE \n", + Mod_idP); + + for (i = 0; i < pmch_InfoList->list.count; i++) { + UE_mac_inst[Mod_idP].pmch_Config[i] = + &pmch_InfoList->list.array[i]->pmch_Config_r9; + LOG_I(MAC, "[UE %d] PMCH[%d]: MCH_Scheduling_Period = %ld\n", + Mod_idP, i, + UE_mac_inst[Mod_idP]. + pmch_Config[i]->mch_SchedulingPeriod_r9); + } + + UE_mac_inst[Mod_idP].mcch_status = 1; + } +#endif +#ifdef CBA + + if (cba_rnti) { + UE_mac_inst[Mod_idP].cba_rnti[num_active_cba_groups - 1] = + cba_rnti; + LOG_D(MAC, + "[UE %d] configure CBA group %d RNTI %x for eNB %d (total active cba group %d)\n", + Mod_idP, Mod_idP % num_active_cba_groups, cba_rnti, + eNB_index, num_active_cba_groups); + phy_config_cba_rnti(Mod_idP, CC_idP, eNB_flagP, eNB_index, + cba_rnti, num_active_cba_groups - 1, + num_active_cba_groups); + } +#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT); + + return (0); +} diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index bf166f6d64..1afb0d6c43 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file LAYER2/MAC/defs.h * \brief MAC data structures, constant, and function prototype * \author Navid Nikaein and Raymond Knopp @@ -46,34 +39,34 @@ -#ifdef USER_MODE #include #include #include -#endif -//#include "COMMON/openair_defs.h" - -#include "COMMON/platform_constants.h" -#include "COMMON/mac_rrc_primitives.h" #include "PHY/defs.h" +#include "PHY/LTE_TRANSPORT/defs.h" +#include "COMMON/platform_constants.h" +#include "BCCH-BCH-Message.h" #include "RadioResourceConfigCommon.h" #include "RadioResourceConfigDedicated.h" #include "MeasGapConfig.h" +#include "SchedulingInfoList.h" #include "TDD-Config.h" #include "RACH-ConfigCommon.h" #include "MeasObjectToAddModList.h" #include "MobilityControlInfo.h" -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) #include "MBSFN-AreaInfoList-r9.h" #include "MBSFN-SubframeConfigList.h" #include "PMCH-InfoList-r9.h" #include "SCellToAddMod-r10.h" #endif +#ifdef Rel14 +#include "SystemInformationBlockType1-v1310-IEs.h" +#endif -//#ifdef PHY_EMUL -//#include "SIMULATION/PHY_EMULATION/impl_defs.h" -//#endif +#include "nfapi_interface.h" +#include "PHY_INTERFACE/IF_Module.h" /** @defgroup _mac MAC * @ingroup _oai2 @@ -82,19 +75,21 @@ #define BCCH_PAYLOAD_SIZE_MAX 128 #define CCCH_PAYLOAD_SIZE_MAX 128 +#define PCCH_PAYLOAD_SIZE_MAX 128 +#define RAR_PAYLOAD_SIZE_MAX 128 #define SCH_PAYLOAD_SIZE_MAX 4096 /// Logical channel ids from 36-311 (Note BCCH is not specified in 36-311, uses the same as first DRB) -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) // Mask for identifying subframe for MBMS -#define MBSFN_TDD_SF3 0x80// for TDD +#define MBSFN_TDD_SF3 0x80 // for TDD #define MBSFN_TDD_SF4 0x40 #define MBSFN_TDD_SF7 0x20 #define MBSFN_TDD_SF8 0x10 #define MBSFN_TDD_SF9 0x08 -#define MBSFN_FDD_SF1 0x80// for FDD +#define MBSFN_FDD_SF1 0x80 // for FDD #define MBSFN_FDD_SF2 0x40 #define MBSFN_FDD_SF3 0x20 #define MBSFN_FDD_SF6 0x10 @@ -108,9 +103,7 @@ //#define MCH_PAYLOAD_SIZE_MAX 16384// this value is using in case mcs and TBS index are high #endif -#ifdef USER_MODE #define printk printf -#endif //USER_MODE /*!\brief Maximum number of logical channl group IDs */ #define MAX_NUM_LCGID 4 @@ -127,44 +120,65 @@ /*!\brief Maximum number od control elemenets */ #define MAX_NUM_CE 5 /*!\brief Maximum number of random access process */ +#if defined(USRP_REC_PLAY) +#define NB_RA_PROC_MAX 1 +#else #define NB_RA_PROC_MAX 4 +#endif /*!\brief size of buffer status report table */ #define BSR_TABLE_SIZE 64 /*!\brief The power headroom reporting range is from -23 ...+40 dB and beyond, with step 1 */ -#define PHR_MAPPING_OFFSET 23 // if ( x>= -23 ) val = floor (x + 23) +#define PHR_MAPPING_OFFSET 23 // if ( x>= -23 ) val = floor (x + 23) /*!\brief maximum number of resource block groups */ -#define N_RBG_MAX 25 // for 20MHz channel BW +#define N_RBG_MAX 25 // for 20MHz channel BW /*!\brief minimum value for channel quality indicator */ #define MIN_CQI_VALUE 0 /*!\brief maximum value for channel quality indicator */ #define MAX_CQI_VALUE 15 +/*!\briefmaximum number of supported bandwidth (1.4, 5, 10, 20 MHz) */ +#define MAX_SUPPORTED_BW 4 +/*!\brief CQI values range from 1 to 15 (4 bits) */ +#define CQI_VALUE_RANGE 16 +/*!\brief value for indicating BSR Timer is not running */ +#define MAC_UE_BSR_TIMER_NOT_RUNNING (0xFFFF) #define LCID_EMPTY 0 #define LCID_NOT_EMPTY 1 +/*!\brief minimum RLC PDU size to be transmitted = min RLC Status PDU or RLC UM PDU SN 5 bits */ +#define MIN_RLC_PDU_SIZE (2) + +/*!\brief minimum MAC data needed for transmitting 1 min RLC PDU size + 1 byte MAC subHeader */ +#define MIN_MAC_HDR_RLC_SIZE (1 + MIN_RLC_PDU_SIZE) + +/*!\brief maximum number of slices / groups */ +#define MAX_NUM_SLICES 4 + +#define U_PLANE_INACTIVITY_VALUE 6000 + /* * eNB part - */ + */ /* * UE/ENB common part - */ + */ /*!\brief MAC header of Random Access Response for Random access preamble identifier (RAPID) */ typedef struct { - uint8_t RAPID:6; - uint8_t T:1; - uint8_t E:1; -} __attribute__((__packed__))RA_HEADER_RAPID; + uint8_t RAPID:6; + uint8_t T:1; + uint8_t E:1; +} __attribute__ ((__packed__)) RA_HEADER_RAPID; /*!\brief MAC header of Random Access Response for backoff indicator (BI)*/ typedef struct { - uint8_t BI:4; - uint8_t R:2; - uint8_t T:1; - uint8_t E:1; -} __attribute__((__packed__))RA_HEADER_BI; + uint8_t BI:4; + uint8_t R:2; + uint8_t T:1; + uint8_t E:1; +} __attribute__ ((__packed__)) RA_HEADER_BI; /* typedef struct { uint64_t padding:16; @@ -196,113 +210,124 @@ typedef struct { */ /*!\brief MAC subheader short with 7bit Length field */ typedef struct { - uint8_t LCID:5; // octet 1 LSB - uint8_t E:1; - uint8_t R:2; // octet 1 MSB - uint8_t L:7; // octet 2 LSB - uint8_t F:1; // octet 2 MSB -} __attribute__((__packed__))SCH_SUBHEADER_SHORT; + uint8_t LCID:5; // octet 1 LSB + uint8_t E:1; + uint8_t R:2; // octet 1 MSB + uint8_t L:7; // octet 2 LSB + uint8_t F:1; // octet 2 MSB +} __attribute__ ((__packed__)) SCH_SUBHEADER_SHORT; /*!\brief MAC subheader long with 15bit Length field */ typedef struct { - uint8_t LCID:5; // octet 1 LSB - uint8_t E:1; - uint8_t R:2; // octet 1 MSB - uint8_t L_MSB:7; - uint8_t F:1; // octet 2 MSB - uint8_t L_LSB:8; - uint8_t padding; -} __attribute__((__packed__))SCH_SUBHEADER_LONG; + uint8_t LCID:5; // octet 1 LSB + uint8_t E:1; + uint8_t R:2; // octet 1 MSB + uint8_t L_MSB:7; + uint8_t F:1; // octet 2 MSB + uint8_t L_LSB:8; + uint8_t padding; +} __attribute__ ((__packed__)) SCH_SUBHEADER_LONG; /*!\brief MAC subheader short without length field */ typedef struct { - uint8_t LCID:5; - uint8_t E:1; - uint8_t R:2; -} __attribute__((__packed__))SCH_SUBHEADER_FIXED; + uint8_t LCID:5; + uint8_t E:1; + uint8_t R:2; +} __attribute__ ((__packed__)) SCH_SUBHEADER_FIXED; /*!\brief mac control element: short buffer status report for a specific logical channel group ID*/ typedef struct { - uint8_t Buffer_size:6; // octet 1 LSB - uint8_t LCGID:2; // octet 1 MSB -} __attribute__((__packed__))BSR_SHORT; + uint8_t Buffer_size:6; // octet 1 LSB + uint8_t LCGID:2; // octet 1 MSB +} __attribute__ ((__packed__)) BSR_SHORT; typedef BSR_SHORT BSR_TRUNCATED; /*!\brief mac control element: long buffer status report for all logical channel group ID*/ typedef struct { - uint32_t Buffer_size3:6; - uint32_t Buffer_size2:6; - uint32_t Buffer_size1:6; - uint32_t Buffer_size0:6; - uint32_t padding:8; -} __attribute__((__packed__))BSR_LONG; + uint8_t Buffer_size3:6; + uint8_t Buffer_size2:6; + uint8_t Buffer_size1:6; + uint8_t Buffer_size0:6; +} __attribute__ ((__packed__)) BSR_LONG; #define BSR_LONG_SIZE (sizeof(BSR_LONG)) /*!\brief mac control element: timing advance */ typedef struct { - uint8_t TA:6; - uint8_t R:2; -} __attribute__((__packed__))TIMING_ADVANCE_CMD; + uint8_t TA:6; + uint8_t R:2; +} __attribute__ ((__packed__)) TIMING_ADVANCE_CMD; /*!\brief mac control element: power headroom report */ typedef struct { - uint8_t PH:6; - uint8_t R:2; -} __attribute__((__packed__))POWER_HEADROOM_CMD; + uint8_t PH:6; + uint8_t R:2; +} __attribute__ ((__packed__)) POWER_HEADROOM_CMD; -/*!\brief DCI PDU filled by MAC for the PHY */ +/*! \brief MIB payload */ typedef struct { - uint8_t Num_ue_spec_dci ; - uint8_t Num_common_dci ; - // uint32_t nCCE; - uint32_t num_pdcch_symbols; - DCI_ALLOC_t dci_alloc[NUM_DCI_MAX] ; -} DCI_PDU; + uint8_t payload[3]; +} __attribute__ ((__packed__)) MIB_PDU; /*! \brief CCCH payload */ typedef struct { - uint8_t payload[CCCH_PAYLOAD_SIZE_MAX] ; -} __attribute__((__packed__))CCCH_PDU; + uint8_t payload[CCCH_PAYLOAD_SIZE_MAX]; +} __attribute__ ((__packed__)) CCCH_PDU; /*! \brief BCCH payload */ typedef struct { - uint8_t payload[BCCH_PAYLOAD_SIZE_MAX] ; -} __attribute__((__packed__))BCCH_PDU; + uint8_t payload[BCCH_PAYLOAD_SIZE_MAX]; +} __attribute__ ((__packed__)) BCCH_PDU; +/*! \brief RAR payload */ +typedef struct { + uint8_t payload[RAR_PAYLOAD_SIZE_MAX]; +} __attribute__ ((__packed__)) RAR_PDU; +/*! \brief BCCH payload */ +typedef struct { + uint8_t payload[PCCH_PAYLOAD_SIZE_MAX]; +} __attribute__ ((__packed__)) PCCH_PDU; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) /*! \brief MCCH payload */ typedef struct { - uint8_t payload[MCCH_PAYLOAD_SIZE_MAX] ; -} __attribute__((__packed__))MCCH_PDU; + uint8_t payload[MCCH_PAYLOAD_SIZE_MAX]; +} __attribute__ ((__packed__)) MCCH_PDU; /*!< \brief MAC control element for activation and deactivation of component carriers */ typedef struct { - uint8_t C7:1;/*!< \brief Component carrier 7 */ - uint8_t C6:1;/*!< \brief Component carrier 6 */ - uint8_t C5:1;/*!< \brief Component carrier 5 */ - uint8_t C4:1;/*!< \brief Component carrier 4 */ - uint8_t C3:1;/*!< \brief Component carrier 3 */ - uint8_t C2:1;/*!< \brief Component carrier 2 */ - uint8_t C1:1;/*!< \brief Component carrier 1 */ - uint8_t R:1;/*!< \brief Reserved */ -} __attribute__((__packed__))CC_ELEMENT; + uint8_t C7:1; /*!< \brief Component carrier 7 */ + uint8_t C6:1; /*!< \brief Component carrier 6 */ + uint8_t C5:1; /*!< \brief Component carrier 5 */ + uint8_t C4:1; /*!< \brief Component carrier 4 */ + uint8_t C3:1; /*!< \brief Component carrier 3 */ + uint8_t C2:1; /*!< \brief Component carrier 2 */ + uint8_t C1:1; /*!< \brief Component carrier 1 */ + uint8_t R:1; /*!< \brief Reserved */ +} __attribute__ ((__packed__)) CC_ELEMENT; /*! \brief MAC control element: MCH Scheduling Information */ typedef struct { - uint8_t stop_sf_MSB:3; // octet 1 LSB - uint8_t lcid:5; // octet 2 MSB - uint8_t stop_sf_LSB:8; -} __attribute__((__packed__))MSI_ELEMENT; + uint8_t stop_sf_MSB:3; // octet 1 LSB + uint8_t lcid:5; // octet 2 MSB + uint8_t stop_sf_LSB:8; +} __attribute__ ((__packed__)) MSI_ELEMENT; #endif -/*! \brief Values of CCCH LCID for DLSCH */ +/*! \brief Values of CCCH LCID for DLSCH */ #define CCCH_LCHANID 0 -/*!\brief Values of BCCH logical channel */ -#define BCCH 3 // SI +/*!\brief Values of BCCH logical channel (fake)*/ +#define BCCH 3 // SI +/*!\brief Values of PCCH logical channel (fake)*/ +#define PCCH 4 // Paging +/*!\brief Values of PCCH logical channel (fake) */ +#define MIBCH 5 // MIB +/*!\brief Values of BCCH SIB1_BR logical channel (fake) */ +#define BCCH_SIB1_BR 6 // SIB1_BR +/*!\brief Values of BCCH SIB_BR logical channel (fake) */ +#define BCCH_SI_BR 7 // SI-BR /*!\brief Value of CCCH / SRB0 logical channel */ -#define CCCH 0 // srb0 +#define CCCH 0 // srb0 /*!\brief DCCH / SRB1 logical channel */ -#define DCCH 1 // srb1 +#define DCCH 1 // srb1 /*!\brief DCCH1 / SRB2 logical channel */ -#define DCCH1 2 // srb2 +#define DCCH1 2 // srb2 /*!\brief DTCH DRB1 logical channel */ -#define DTCH 3 // LCID +#define DTCH 3 // LCID /*!\brief MCCH logical channel */ -#define MCCH 4 +#define MCCH 4 /*!\brief MTCH logical channel */ -#define MTCH 1 +#define MTCH 1 // DLSCH LCHAN ID /*!\brief LCID of UE contention resolution identity for DLSCH*/ #define UE_CONT_RES 28 @@ -313,7 +338,7 @@ typedef struct { /*!\brief LCID of padding LCID for DLSCH */ #define SHORT_PADDING 31 -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) // MCH LCHAN IDs (table6.2.1-4 TS36.321) /*!\brief LCID of MCCH for DL */ #define MCCH_LCHANID 0 @@ -336,784 +361,982 @@ typedef struct { #define SHORT_BSR 29 /*!\brief LCID of long BSR for ULSCH */ #define LONG_BSR 30 +/*!\bitmaps for BSR Triggers */ +#define BSR_TRIGGER_NONE (0) /* No BSR Trigger */ +#define BSR_TRIGGER_REGULAR (1) /* For Regular and ReTxBSR Expiry Triggers */ +#define BSR_TRIGGER_PERIODIC (2) /* For BSR Periodic Timer Expiry Trigger */ +#define BSR_TRIGGER_PADDING (4) /* For Padding BSR Trigger */ + /*! \brief Downlink SCH PDU Structure */ typedef struct { - int8_t payload[8][SCH_PAYLOAD_SIZE_MAX]; - uint16_t Pdu_size[8]; + uint8_t payload[8][SCH_PAYLOAD_SIZE_MAX]; + uint16_t Pdu_size[8]; } __attribute__ ((__packed__)) DLSCH_PDU; + /*! \brief MCH PDU Structure */ typedef struct { - int8_t payload[SCH_PAYLOAD_SIZE_MAX]; - uint16_t Pdu_size; - uint8_t mcs; - uint8_t sync_area; - uint8_t msi_active; - uint8_t mcch_active; - uint8_t mtch_active; + int8_t payload[SCH_PAYLOAD_SIZE_MAX]; + uint16_t Pdu_size; + uint8_t mcs; + uint8_t sync_area; + uint8_t msi_active; + uint8_t mcch_active; + uint8_t mtch_active; } __attribute__ ((__packed__)) MCH_PDU; /*! \brief Uplink SCH PDU Structure */ typedef struct { - int8_t payload[SCH_PAYLOAD_SIZE_MAX]; /*!< \brief SACH payload */ - uint16_t Pdu_size; + int8_t payload[SCH_PAYLOAD_SIZE_MAX]; /*!< \brief SACH payload */ + uint16_t Pdu_size; } __attribute__ ((__packed__)) ULSCH_PDU; #include "PHY/impl_defs_top.h" +/*!\brief RA process state*/ +typedef enum { + IDLE = 0, + MSG2, + WAITMSG3, + MSG4, + WAITMSG4ACK +} RA_state; + /*!\brief UE ULSCH scheduling states*/ typedef enum { - S_UL_NONE =0, - S_UL_WAITING, - S_UL_SCHEDULED, - S_UL_BUFFERED, - S_UL_NUM_STATUS + S_UL_NONE = 0, + S_UL_WAITING, + S_UL_SCHEDULED, + S_UL_BUFFERED, + S_UL_NUM_STATUS } UE_ULSCH_STATUS; /*!\brief UE DLSCH scheduling states*/ typedef enum { - S_DL_NONE =0, - S_DL_WAITING, - S_DL_SCHEDULED, - S_DL_BUFFERED, - S_DL_NUM_STATUS + S_DL_NONE = 0, + S_DL_WAITING, + S_DL_SCHEDULED, + S_DL_BUFFERED, + S_DL_NUM_STATUS } UE_DLSCH_STATUS; /*!\brief scheduling policy for the contention-based access */ typedef enum { - CBA_ES=0, /// equal share of RB among groups w - CBA_ES_S, /// equal share of RB among groups with small allocation - CBA_PF, /// proportional fair (kind of) - CBA_PF_S, /// proportional fair (kind of) with small RB allocation - CBA_RS /// random allocation + CBA_ES = 0, /// equal share of RB among groups w + CBA_ES_S, /// equal share of RB among groups with small allocation + CBA_PF, /// proportional fair (kind of) + CBA_PF_S, /// proportional fair (kind of) with small RB allocation + CBA_RS /// random allocation } CBA_POLICY; /*! \brief temporary struct for ULSCH sched */ typedef struct { - rnti_t rnti; - uint16_t subframe; - uint16_t serving_num; - UE_ULSCH_STATUS status; + rnti_t rnti; + uint16_t subframe; + uint16_t serving_num; + UE_ULSCH_STATUS status; } eNB_ULSCH_INFO; /*! \brief temp struct for DLSCH sched */ typedef struct { - rnti_t rnti; - uint16_t weight; - uint16_t subframe; - uint16_t serving_num; - UE_DLSCH_STATUS status; + rnti_t rnti; + uint16_t weight; + uint16_t subframe; + uint16_t serving_num; + UE_DLSCH_STATUS status; } eNB_DLSCH_INFO; /*! \brief eNB overall statistics */ typedef struct { - /// num BCCH PDU per CC - uint32_t total_num_bcch_pdu; - /// BCCH buffer size - uint32_t bcch_buffer; - /// total BCCH buffer size - uint32_t total_bcch_buffer; - /// BCCH MCS - uint32_t bcch_mcs; + /// num BCCH PDU per CC + uint32_t total_num_bcch_pdu; + /// BCCH buffer size + uint32_t bcch_buffer; + /// total BCCH buffer size + uint32_t total_bcch_buffer; + /// BCCH MCS + uint32_t bcch_mcs; - /// num CCCH PDU per CC - uint32_t total_num_ccch_pdu; - /// BCCH buffer size - uint32_t ccch_buffer; - /// total BCCH buffer size - uint32_t total_ccch_buffer; + /// num CCCH PDU per CC + uint32_t total_num_ccch_pdu; + /// BCCH buffer size + uint32_t ccch_buffer; + /// total BCCH buffer size + uint32_t total_ccch_buffer; + /// BCCH MCS + uint32_t ccch_mcs; + + /// num PCCH PDU per CC + uint32_t total_num_pcch_pdu; + /// PCCH buffer size + uint32_t pcch_buffer; + /// total PCCH buffer size + uint32_t total_pcch_buffer; /// BCCH MCS - uint32_t ccch_mcs; + uint32_t pcch_mcs; /// num active users - uint16_t num_dlactive_UEs; - /// available number of PRBs for a give SF - uint16_t available_prbs; - /// total number of PRB available for the user plane - uint32_t total_available_prbs; - /// aggregation - /// total avilable nccc : num control channel element - uint16_t available_ncces; - // only for a new transmission, should be extended for retransmission - // current dlsch bit rate for all transport channels - uint32_t dlsch_bitrate; - // - uint32_t dlsch_bytes_tx; - // - uint32_t dlsch_pdus_tx; - // - uint32_t total_dlsch_bitrate; - // - uint32_t total_dlsch_bytes_tx; - // - uint32_t total_dlsch_pdus_tx; - - // here for RX - // - uint32_t ulsch_bitrate; - // - uint32_t ulsch_bytes_rx; - // - uint64_t ulsch_pdus_rx; + uint16_t num_dlactive_UEs; + /// available number of PRBs for a give SF + uint16_t available_prbs; + /// total number of PRB available for the user plane + uint32_t total_available_prbs; + /// aggregation + /// total avilable nccc : num control channel element + uint16_t available_ncces; + // only for a new transmission, should be extended for retransmission + // current dlsch bit rate for all transport channels + uint32_t dlsch_bitrate; + // + uint32_t dlsch_bytes_tx; + // + uint32_t dlsch_pdus_tx; + // + uint32_t total_dlsch_bitrate; + // + uint32_t total_dlsch_bytes_tx; + // + uint32_t total_dlsch_pdus_tx; + + // here for RX + // + uint32_t ulsch_bitrate; + // + uint32_t ulsch_bytes_rx; + // + uint64_t ulsch_pdus_rx; + + uint32_t total_ulsch_bitrate; + // + uint32_t total_ulsch_bytes_rx; + // + uint32_t total_ulsch_pdus_rx; + + + /// MAC agent-related stats + /// total number of scheduling decisions + int sched_decisions; + /// missed deadlines + int missed_deadlines; - uint32_t total_ulsch_bitrate; - // - uint32_t total_ulsch_bytes_rx; - // - uint32_t total_ulsch_pdus_rx; - } eNB_STATS; /*! \brief eNB statistics for the connected UEs*/ typedef struct { - /// CRNTI of UE - rnti_t crnti; ///user id (rnti) of connected UEs - // rrc status - uint8_t rrc_status; - /// harq pid - uint8_t harq_pid; - /// harq rounf - uint8_t harq_round; - /// DL Wideband CQI index (2 TBs) - uint8_t dl_cqi; - /// total available number of PRBs for a new transmission - uint16_t rbs_used; - /// total available number of PRBs for a retransmission - uint16_t rbs_used_retx; - /// total nccc used for a new transmission: num control channel element - uint16_t ncce_used; - /// total avilable nccc for a retransmission: num control channel element - uint16_t ncce_used_retx; + /// CRNTI of UE + rnti_t crnti; ///user id (rnti) of connected UEs + // rrc status + uint8_t rrc_status; + /// harq pid + uint8_t harq_pid; + /// harq rounf + uint8_t harq_round; + /// total available number of PRBs for a new transmission + uint16_t rbs_used; + /// total available number of PRBs for a retransmission + uint16_t rbs_used_retx; + /// total nccc used for a new transmission: num control channel element + uint16_t ncce_used; + /// total avilable nccc for a retransmission: num control channel element + uint16_t ncce_used_retx; - // mcs1 before the rate adaptaion - uint8_t dlsch_mcs1; - /// Target mcs2 after rate-adaptation - uint8_t dlsch_mcs2; - // current TBS with mcs2 - uint32_t TBS; - // total TBS with mcs2 - // uint32_t total_TBS; - // total rb used for a new transmission - uint32_t total_rbs_used; - // total rb used for retransmission - uint32_t total_rbs_used_retx; + // mcs1 before the rate adaptaion + uint8_t dlsch_mcs1; + /// Target mcs2 after rate-adaptation + uint8_t dlsch_mcs2; + // current TBS with mcs2 + uint32_t TBS; + // total TBS with mcs2 + // uint32_t total_TBS; + // total rb used for a new transmission + uint32_t total_rbs_used; + // total rb used for retransmission + uint32_t total_rbs_used_retx; - /// TX - /// Num pkt - uint32_t num_pdu_tx[NB_RB_MAX]; - /// num bytes - uint32_t num_bytes_tx[NB_RB_MAX]; - /// num retransmission / harq - uint32_t num_retransmission; - /// instantaneous tx throughput for each TTI - // uint32_t tti_throughput[NB_RB_MAX]; + /// TX + /// Num pkt + uint32_t num_pdu_tx[NB_RB_MAX]; + /// num bytes + uint32_t num_bytes_tx[NB_RB_MAX]; + /// num retransmission / harq + uint32_t num_retransmission; + /// instantaneous tx throughput for each TTI + // uint32_t tti_throughput[NB_RB_MAX]; - /// overall - // - uint32_t dlsch_bitrate; - //total - uint32_t total_dlsch_bitrate; - /// headers+ CE + padding bytes for a MAC PDU - uint64_t overhead_bytes; - /// headers+ CE + padding bytes for a MAC PDU - uint64_t total_overhead_bytes; - /// headers+ CE + padding bytes for a MAC PDU - uint64_t avg_overhead_bytes; - // MAC multiplexed payload - uint64_t total_sdu_bytes; - // total MAC pdu bytes - uint64_t total_pdu_bytes; + /// overall + // + uint32_t dlsch_bitrate; + //total + uint32_t total_dlsch_bitrate; + /// headers+ CE + padding bytes for a MAC PDU + uint64_t overhead_bytes; + /// headers+ CE + padding bytes for a MAC PDU + uint64_t total_overhead_bytes; + /// headers+ CE + padding bytes for a MAC PDU + uint64_t avg_overhead_bytes; + // MAC multiplexed payload + uint64_t total_sdu_bytes; + // total MAC pdu bytes + uint64_t total_pdu_bytes; - // total num pdu - uint32_t total_num_pdus; - // - // uint32_t avg_pdu_size; + // total num pdu + uint32_t total_num_pdus; + // + // uint32_t avg_pdu_size; - /// RX + /// RX - /// preassigned mcs after rate adaptation - uint8_t ulsch_mcs1; - /// adjusted mcs - uint8_t ulsch_mcs2; + /// PUCCH1a/b power (dBm) + int32_t Po_PUCCH_dBm; + /// Indicator that Po_PUCCH has been updated by PHY + int32_t Po_PUCCH_update; + /// Uplink measured RSSI + int32_t UL_rssi; + /// preassigned mcs after rate adaptation + uint8_t ulsch_mcs1; + /// adjusted mcs + uint8_t ulsch_mcs2; - /// estimated average pdu inter-departure time - uint32_t avg_pdu_idt; - /// estimated average pdu size - uint32_t avg_pdu_ps; - /// - uint32_t aggregated_pdu_size; - uint32_t aggregated_pdu_arrival; + /// estimated average pdu inter-departure time + uint32_t avg_pdu_idt; + /// estimated average pdu size + uint32_t avg_pdu_ps; + /// + uint32_t aggregated_pdu_size; + uint32_t aggregated_pdu_arrival; - /// uplink transport block size - uint32_t ulsch_TBS; + /// uplink transport block size + uint32_t ulsch_TBS; - /// total rb used for a new uplink transmission - uint32_t num_retransmission_rx; - /// total rb used for a new uplink transmission - uint32_t rbs_used_rx; - /// total rb used for a new uplink retransmission - uint32_t rbs_used_retx_rx; - /// total rb used for a new uplink transmission - uint32_t total_rbs_used_rx; - /// normalized rx power - int32_t normalized_rx_power; - /// target rx power - int32_t target_rx_power; + /// total rb used for a new uplink transmission + uint32_t num_retransmission_rx; + /// total rb used for a new uplink transmission + uint32_t rbs_used_rx; + /// total rb used for a new uplink retransmission + uint32_t rbs_used_retx_rx; + /// total rb used for a new uplink transmission + uint32_t total_rbs_used_rx; + /// normalized rx power + int32_t normalized_rx_power; + /// target rx power + int32_t target_rx_power; - /// num rx pdu - uint32_t num_pdu_rx[NB_RB_MAX]; - /// num bytes rx - uint32_t num_bytes_rx[NB_RB_MAX]; - /// instantaneous rx throughput for each TTI - // uint32_t tti_goodput[NB_RB_MAX]; - /// errors - uint32_t num_errors_rx; - - uint64_t overhead_bytes_rx; - /// headers+ CE + padding bytes for a MAC PDU - uint64_t total_overhead_bytes_rx; - /// headers+ CE + padding bytes for a MAC PDU - uint64_t avg_overhead_bytes_rx; - // - uint32_t ulsch_bitrate; - //total - uint32_t total_ulsch_bitrate; - /// overall - /// MAC pdu bytes - uint64_t pdu_bytes_rx; - /// total MAC pdu bytes - uint64_t total_pdu_bytes_rx; - /// total num pdu - uint32_t total_num_pdus_rx; - /// num of error pdus - uint32_t total_num_errors_rx; + /// num rx pdu + uint32_t num_pdu_rx[NB_RB_MAX]; + /// num bytes rx + uint32_t num_bytes_rx[NB_RB_MAX]; + /// instantaneous rx throughput for each TTI + // uint32_t tti_goodput[NB_RB_MAX]; + /// errors + uint32_t num_errors_rx; + + uint64_t overhead_bytes_rx; + /// headers+ CE + padding bytes for a MAC PDU + uint64_t total_overhead_bytes_rx; + /// headers+ CE + padding bytes for a MAC PDU + uint64_t avg_overhead_bytes_rx; + // + uint32_t ulsch_bitrate; + //total + uint32_t total_ulsch_bitrate; + /// overall + /// MAC pdu bytes + uint64_t pdu_bytes_rx; + /// total MAC pdu bytes + uint64_t total_pdu_bytes_rx; + /// total num pdu + uint32_t total_num_pdus_rx; + /// num of error pdus + uint32_t total_num_errors_rx; } eNB_UE_STATS; /*! \brief eNB template for UE context information */ typedef struct { - /// C-RNTI of UE - rnti_t rnti; - /// NDI from last scheduling - uint8_t oldNDI[8]; - /// NDI from last UL scheduling - uint8_t oldNDI_UL[8]; - /// Flag to indicate UL has been scheduled at least once - boolean_t ul_active; - /// Flag to indicate UE has been configured (ACK from RRCConnectionSetup received) - boolean_t configured; + /// C-RNTI of UE + rnti_t rnti; + /// NDI from last scheduling + uint8_t oldNDI[8]; + /// mcs1 from last scheduling + uint8_t oldmcs1[8]; + /// mcs2 from last scheduling + uint8_t oldmcs2[8]; + /// NDI from last UL scheduling + uint8_t oldNDI_UL[8]; + /// mcs from last UL scheduling + uint8_t mcs_UL[8]; + /// TBS from last UL scheduling + uint8_t TBS_UL[8]; + /// Flag to indicate UL has been scheduled at least once + boolean_t ul_active; + /// Flag to indicate UE has been configured (ACK from RRCConnectionSetup received) + boolean_t configured; - // PHY interface info + /// MCS from last scheduling + uint8_t mcs[8]; - /// DCI format for DLSCH - uint16_t DLSCH_dci_fmt; + /// TPC from last scheduling + uint8_t oldTPC[8]; - /// Current Aggregation Level for DCI - uint8_t DCI_aggregation_min; + // PHY interface info - /// size of DLSCH size in bit - uint8_t DLSCH_dci_size_bits; + /// Number of Allocated RBs for DL after scheduling (prior to frequency allocation) + uint16_t nb_rb[8]; // num_max_harq - /// DCI buffer for DLSCH - uint8_t DLSCH_DCI[8][(MAX_DCI_SIZE_BITS>>3)+1]; + /// Number of Allocated RBs for UL after scheduling + uint16_t nb_rb_ul[8]; // num_max_harq - /// Number of Allocated RBs for DL after scheduling (prior to frequency allocation) - uint16_t nb_rb[8]; // num_max_harq + /// Number of Allocated RBs for UL after scheduling + uint16_t first_rb_ul[8]; // num_max_harq - /// Number of Allocated RBs for UL after scheduling (prior to frequency allocation) - uint16_t nb_rb_ul[8]; // num_max_harq + /// Cyclic shift for DMRS after scheduling + uint16_t cshift[8]; // num_max_harq - /// Number of Allocated RBs by the ulsch preprocessor - uint8_t pre_allocated_nb_rb_ul; + /// Number of Allocated RBs by the ulsch preprocessor + uint8_t pre_allocated_nb_rb_ul; - /// index of Allocated RBs by the ulsch preprocessor - int8_t pre_allocated_rb_table_index_ul; + /// index of Allocated RBs by the ulsch preprocessor + int8_t pre_allocated_rb_table_index_ul; - /// total allocated RBs - int8_t total_allocated_rbs; + /// total allocated RBs + int8_t total_allocated_rbs; - /// pre-assigned MCS by the ulsch preprocessor - uint8_t pre_assigned_mcs_ul; + /// pre-assigned MCS by the ulsch preprocessor + uint8_t pre_assigned_mcs_ul; - /// assigned MCS by the ulsch scheduler - uint8_t assigned_mcs_ul; + /// assigned MCS by the ulsch scheduler + uint8_t assigned_mcs_ul; - /// DCI buffer for ULSCH - uint8_t ULSCH_DCI[8][(MAX_DCI_SIZE_BITS>>3)+1]; + /// DL DAI + uint8_t DAI; - /// DL DAI - uint8_t DAI; + /// UL DAI + uint8_t DAI_ul[10]; - /// UL DAI - uint8_t DAI_ul[10]; + /// UL Scheduling Request Received + uint8_t ul_SR; - /// UL Scheduling Request Received - uint8_t ul_SR; + ///Resource Block indication for each sub-band in MU-MIMO + uint8_t rballoc_subband[8][50]; - ///Resource Block indication for each sub-band in MU-MIMO - uint8_t rballoc_subband[8][50]; + // Logical channel info for link with RLC - // Logical channel info for link with RLC + /// Last received UE BSR info for each logical channel group id + uint8_t bsr_info[MAX_NUM_LCGID]; - /// Last received UE BSR info for each logical channel group id - uint8_t bsr_info[MAX_NUM_LCGID]; + /// LCGID mapping + long lcgidmap[11]; - /// LCGID mapping - long lcgidmap[11]; + /// phr information + int8_t phr_info; - /// phr information - int8_t phr_info; + /// phr information + int8_t phr_info_configured; - /// phr information - int8_t phr_info_configured; + ///dl buffer info + uint32_t dl_buffer_info[MAX_NUM_LCID]; + /// total downlink buffer info + uint32_t dl_buffer_total; + /// total downlink pdus + uint32_t dl_pdus_total; + /// downlink pdus for each LCID + uint32_t dl_pdus_in_buffer[MAX_NUM_LCID]; + /// creation time of the downlink buffer head for each LCID + uint32_t dl_buffer_head_sdu_creation_time[MAX_NUM_LCID]; + /// maximum creation time of the downlink buffer head across all LCID + uint32_t dl_buffer_head_sdu_creation_time_max; + /// a flag indicating that the downlink head SDU is segmented + uint8_t dl_buffer_head_sdu_is_segmented[MAX_NUM_LCID]; + /// size of remaining size to send for the downlink head SDU + uint32_t dl_buffer_head_sdu_remaining_size_to_send[MAX_NUM_LCID]; - ///dl buffer info - uint32_t dl_buffer_info[MAX_NUM_LCID]; - /// total downlink buffer info - uint32_t dl_buffer_total; - /// total downlink pdus - uint32_t dl_pdus_total; - /// downlink pdus for each LCID - uint32_t dl_pdus_in_buffer[MAX_NUM_LCID]; - /// creation time of the downlink buffer head for each LCID - uint32_t dl_buffer_head_sdu_creation_time[MAX_NUM_LCID]; - /// maximum creation time of the downlink buffer head across all LCID - uint32_t dl_buffer_head_sdu_creation_time_max; - /// a flag indicating that the downlink head SDU is segmented - uint8_t dl_buffer_head_sdu_is_segmented[MAX_NUM_LCID]; - /// size of remaining size to send for the downlink head SDU - uint32_t dl_buffer_head_sdu_remaining_size_to_send[MAX_NUM_LCID]; + /// total uplink buffer size + uint32_t ul_total_buffer; + /// uplink buffer creation time for each LCID + uint32_t ul_buffer_creation_time[MAX_NUM_LCGID]; + /// maximum uplink buffer creation time across all the LCIDs + uint32_t ul_buffer_creation_time_max; + /// uplink buffer size per LCID + uint32_t ul_buffer_info[MAX_NUM_LCGID]; - /// total uplink buffer size - uint32_t ul_total_buffer; - /// uplink buffer creation time for each LCID - uint32_t ul_buffer_creation_time[MAX_NUM_LCGID]; - /// maximum uplink buffer creation time across all the LCIDs - uint32_t ul_buffer_creation_time_max; - /// uplink buffer size per LCID - uint32_t ul_buffer_info[MAX_NUM_LCGID]; + /// UE tx power + int32_t ue_tx_power; - /// UE tx power - int32_t ue_tx_power; - - /// stores the frame where the last TPC was transmitted - uint32_t pusch_tpc_tx_frame; - uint32_t pusch_tpc_tx_subframe; - uint32_t pucch_tpc_tx_frame; - uint32_t pucch_tpc_tx_subframe; + /// stores the frame where the last TPC was transmitted + uint32_t pusch_tpc_tx_frame; + uint32_t pusch_tpc_tx_subframe; + uint32_t pucch_tpc_tx_frame; + uint32_t pucch_tpc_tx_subframe; #ifdef LOCALIZATION - eNB_UE_estimated_distances distance; + eNB_UE_estimated_distances distance; #endif + +#ifdef Rel14 + uint8_t rach_resource_type; + uint16_t mpdcch_repetition_cnt; + frame_t Msg2_frame; +#endif + sub_frame_t Msg2_subframe; + + PhysicalConfigDedicated_t *physicalConfigDedicated; + } UE_TEMPLATE; /*! \brief scheduling control information set through an API (not used)*/ typedef struct { - ///UL transmission bandwidth in RBs - uint8_t ul_bandwidth[MAX_NUM_LCID]; - ///DL transmission bandwidth in RBs - uint8_t dl_bandwidth[MAX_NUM_LCID]; + ///UL transmission bandwidth in RBs + uint8_t ul_bandwidth[MAX_NUM_LCID]; + ///DL transmission bandwidth in RBs + uint8_t dl_bandwidth[MAX_NUM_LCID]; - //To do GBR bearer - uint8_t min_ul_bandwidth[MAX_NUM_LCID]; + //To do GBR bearer + uint8_t min_ul_bandwidth[MAX_NUM_LCID]; - uint8_t min_dl_bandwidth[MAX_NUM_LCID]; + uint8_t min_dl_bandwidth[MAX_NUM_LCID]; - ///aggregated bit rate of non-gbr bearer per UE - uint64_t ue_AggregatedMaximumBitrateDL; - ///aggregated bit rate of non-gbr bearer per UE - uint64_t ue_AggregatedMaximumBitrateUL; - ///CQI scheduling interval in subframes. - uint16_t cqiSchedInterval; - ///Contention resolution timer used during random access - uint8_t mac_ContentionResolutionTimer; + ///aggregated bit rate of non-gbr bearer per UE + uint64_t ue_AggregatedMaximumBitrateDL; + ///aggregated bit rate of non-gbr bearer per UE + uint64_t ue_AggregatedMaximumBitrateUL; + ///CQI scheduling interval in subframes. + uint16_t cqiSchedInterval; + ///Contention resolution timer used during random access + uint8_t mac_ContentionResolutionTimer; - uint16_t max_allowed_rbs[MAX_NUM_LCID]; + uint16_t max_allowed_rbs[MAX_NUM_LCID]; - uint8_t max_mcs[MAX_NUM_LCID]; + uint8_t max_mcs[MAX_NUM_LCID]; - uint16_t priority[MAX_NUM_LCID]; + uint16_t priority[MAX_NUM_LCID]; - // resource scheduling information - uint8_t harq_pid[MAX_NUM_CCs]; - uint8_t round[MAX_NUM_CCs]; - uint8_t dl_pow_off[MAX_NUM_CCs]; - uint16_t pre_nb_available_rbs[MAX_NUM_CCs]; - unsigned char rballoc_sub_UE[MAX_NUM_CCs][N_RBG_MAX]; - uint16_t ta_timer; - int16_t ta_update; - int32_t context_active_timer; - int32_t cqi_req_timer; - int32_t ul_inactivity_timer; - int32_t ul_failure_timer; - int32_t ul_scheduled; - int32_t ra_pdcch_order_sent; - int32_t ul_out_of_sync; - int32_t phr_received; + // resource scheduling information + + /// Current DL harq round per harq_pid on each CC + uint8_t round[MAX_NUM_CCs][10]; + /// Current Active TBs per harq_pid on each CC + uint8_t tbcnt[MAX_NUM_CCs][10]; + /// Current UL harq round per harq_pid on each CC + uint8_t round_UL[MAX_NUM_CCs][8]; + uint8_t dl_pow_off[MAX_NUM_CCs]; + uint16_t pre_nb_available_rbs[MAX_NUM_CCs]; + unsigned char rballoc_sub_UE[MAX_NUM_CCs][N_RBG_MAX]; + uint16_t ta_timer; + int16_t ta_update; + uint16_t ul_consecutive_errors; + int32_t context_active_timer; + int32_t cqi_req_timer; + int32_t ul_inactivity_timer; + int32_t ul_failure_timer; + uint32_t ue_reestablishment_reject_timer; + uint32_t ue_reestablishment_reject_timer_thres; + int32_t ul_scheduled; + int32_t ra_pdcch_order_sent; + int32_t ul_out_of_sync; + int32_t phr_received; + uint8_t periodic_ri_received[NFAPI_CC_MAX]; + uint8_t aperiodic_ri_received[NFAPI_CC_MAX]; + uint8_t pucch1_cqi_update[NFAPI_CC_MAX]; + uint8_t pucch1_snr[NFAPI_CC_MAX]; + uint8_t pucch2_cqi_update[NFAPI_CC_MAX]; + uint8_t pucch2_snr[NFAPI_CC_MAX]; + uint8_t pucch3_cqi_update[NFAPI_CC_MAX]; + uint8_t pucch3_snr[NFAPI_CC_MAX]; + uint8_t pusch_snr[NFAPI_CC_MAX]; + uint16_t feedback_cnt[NFAPI_CC_MAX]; + uint16_t timing_advance; + uint16_t timing_advance_r9; + uint8_t periodic_wideband_cqi[NFAPI_CC_MAX]; + uint8_t periodic_wideband_spatial_diffcqi[NFAPI_CC_MAX]; + uint8_t periodic_wideband_pmi[NFAPI_CC_MAX]; + uint8_t periodic_subband_cqi[NFAPI_CC_MAX][16]; + uint8_t periodic_subband_spatial_diffcqi[NFAPI_CC_MAX][16]; + uint8_t aperiodic_subband_cqi0[NFAPI_CC_MAX][25]; + uint8_t aperiodic_subband_pmi[NFAPI_CC_MAX][25]; + uint8_t aperiodic_subband_diffcqi0[NFAPI_CC_MAX][25]; + uint8_t aperiodic_subband_cqi1[NFAPI_CC_MAX][25]; + uint8_t aperiodic_subband_diffcqi1[NFAPI_CC_MAX][25]; + uint8_t aperiodic_wideband_cqi0[NFAPI_CC_MAX]; + uint8_t aperiodic_wideband_pmi[NFAPI_CC_MAX]; + uint8_t aperiodic_wideband_cqi1[NFAPI_CC_MAX]; + uint8_t aperiodic_wideband_pmi1[NFAPI_CC_MAX]; + uint8_t dl_cqi[NFAPI_CC_MAX]; + int32_t uplane_inactivity_timer; } UE_sched_ctrl; /*! \brief eNB template for the Random access information */ typedef struct { - /// Flag to indicate this process is active - boolean_t RA_active; - /// Size of DCI for RA-Response (bytes) - uint8_t RA_dci_size_bytes1; - /// Size of DCI for RA-Response (bits) - uint8_t RA_dci_size_bits1; - /// Actual DCI to transmit for RA-Response - uint8_t RA_alloc_pdu1[(MAX_DCI_SIZE_BITS>>3)+1]; - /// DCI format for RA-Response (should be 1A) - uint8_t RA_dci_fmt1; - /// Size of DCI for Msg4/ContRes (bytes) - uint8_t RA_dci_size_bytes2; - /// Size of DCI for Msg4/ContRes (bits) - uint8_t RA_dci_size_bits2; - /// Actual DCI to transmit for Msg4/ContRes - uint8_t RA_alloc_pdu2[(MAX_DCI_SIZE_BITS>>3)+1]; - /// DCI format for Msg4/ContRes (should be 1A) - uint8_t RA_dci_fmt2; - /// Flag to indicate the eNB should generate RAR. This is triggered by detection of PRACH - uint8_t generate_rar; - /// Subframe where preamble was received - uint8_t preamble_subframe; - /// Subframe where Msg3 is to be sent - uint8_t Msg3_subframe; - /// Flag to indicate the eNB should generate Msg4 upon reception of SDU from RRC. This is triggered by first ULSCH reception at eNB for new user. - uint8_t generate_Msg4; - /// Flag to indicate that eNB is waiting for ACK that UE has received Msg3. - uint8_t wait_ack_Msg4; - /// UE RNTI allocated during RAR - rnti_t rnti; - /// RA RNTI allocated from received PRACH - uint16_t RA_rnti; - /// Received preamble_index - uint8_t preamble_index; - /// Received UE Contention Resolution Identifier - uint8_t cont_res_id[6]; - /// Timing offset indicated by PHY - int16_t timing_offset; - /// Timeout for RRC connection - int16_t RRC_timer; -} RA_TEMPLATE; + /// Flag to indicate this process is active + RA_state state; + /// Subframe where preamble was received + uint8_t preamble_subframe; + /// Subframe where Msg2 is to be sent + uint8_t Msg2_subframe; + /// Frame where Msg2 is to be sent + frame_t Msg2_frame; + /// Subframe where Msg3 is to be sent + sub_frame_t Msg3_subframe; + /// Frame where Msg3 is to be sent + frame_t Msg3_frame; + /// Subframe where Msg4 is to be sent + sub_frame_t Msg4_subframe; + /// Frame where Msg4 is to be sent + frame_t Msg4_frame; + /// harq_pid used for Msg4 transmission + uint8_t harq_pid; + /// UE RNTI allocated during RAR + rnti_t rnti; + /// RA RNTI allocated from received PRACH + uint16_t RA_rnti; + /// Received preamble_index + uint8_t preamble_index; + /// Received UE Contention Resolution Identifier + uint8_t cont_res_id[6]; + /// Timing offset indicated by PHY + int16_t timing_offset; + /// Timeout for RRC connection + int16_t RRC_timer; + /// Msg3 first RB + uint8_t msg3_first_rb; + /// Msg3 number of RB + uint8_t msg3_nb_rb; + /// Msg3 MCS + uint8_t msg3_mcs; + /// Msg3 TPC command + uint8_t msg3_TPC; + /// Msg3 ULdelay command + uint8_t msg3_ULdelay; + /// Msg3 cqireq command + uint8_t msg3_cqireq; + /// Round of Msg3 HARQ + uint8_t msg3_round; + /// TBS used for Msg4 + int msg4_TBsize; + /// MCS used for Msg4 + int msg4_mcs; +#ifdef Rel14 + uint8_t rach_resource_type; + uint8_t msg2_mpdcch_repetition_cnt; + uint8_t msg4_mpdcch_repetition_cnt; + uint8_t msg2_narrowband; + uint8_t msg34_narrowband; +#endif +} RA_t; /*! \brief subband bitmap confguration (for ALU icic algo purpose), in test phase */ typedef struct { - uint8_t sbmap[NUMBER_OF_SUBBANDS_MAX]; //13 = number of SB MAX for 100 PRB - uint8_t periodicity; - uint8_t first_subframe; - uint8_t sb_size; - uint8_t nb_active_sb; + uint8_t sbmap[NUMBER_OF_SUBBANDS_MAX]; //13 = number of SB MAX for 100 PRB + uint8_t periodicity; + uint8_t first_subframe; + uint8_t sb_size; + uint8_t nb_active_sb; } SBMAP_CONF; -/*! \brief UE list used by eNB to order UEs/CC for scheduling*/ +/*! \brief UE list used by eNB to order UEs/CC for scheduling*/ typedef struct { - /// DLSCH pdu - DLSCH_PDU DLSCH_pdu[MAX_NUM_CCs][2][NUMBER_OF_UE_MAX]; - /// DCI template and MAC connection parameters for UEs - UE_TEMPLATE UE_template[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - /// DCI template and MAC connection for RA processes - int pCC_id[NUMBER_OF_UE_MAX]; - /// sorted downlink component carrier for the scheduler - int ordered_CCids[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - /// number of downlink active component carrier - int numactiveCCs[NUMBER_OF_UE_MAX]; - /// sorted uplink component carrier for the scheduler - int ordered_ULCCids[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - /// number of uplink active component carrier - int numactiveULCCs[NUMBER_OF_UE_MAX]; - /// number of downlink active component carrier - uint8_t dl_CC_bitmap[NUMBER_OF_UE_MAX]; - /// eNB to UE statistics - eNB_UE_STATS eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - /// scheduling control info - UE_sched_ctrl UE_sched_ctrl[NUMBER_OF_UE_MAX]; - - int next[NUMBER_OF_UE_MAX]; - int head; - int next_ul[NUMBER_OF_UE_MAX]; - int head_ul; - int avail; - int num_UEs; - boolean_t active[NUMBER_OF_UE_MAX]; + /// Dedicated information for UEs + struct PhysicalConfigDedicated + *physicalConfigDedicated[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + /// DLSCH pdu + DLSCH_PDU DLSCH_pdu[MAX_NUM_CCs][2][NUMBER_OF_UE_MAX]; + /// DCI template and MAC connection parameters for UEs + UE_TEMPLATE UE_template[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + /// DCI template and MAC connection for RA processes + int pCC_id[NUMBER_OF_UE_MAX]; + /// sorted downlink component carrier for the scheduler + int ordered_CCids[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + /// number of downlink active component carrier + int numactiveCCs[NUMBER_OF_UE_MAX]; + /// sorted uplink component carrier for the scheduler + int ordered_ULCCids[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + /// number of uplink active component carrier + int numactiveULCCs[NUMBER_OF_UE_MAX]; + /// number of downlink active component carrier + uint8_t dl_CC_bitmap[NUMBER_OF_UE_MAX]; + /// eNB to UE statistics + eNB_UE_STATS eNB_UE_stats[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + /// scheduling control info + UE_sched_ctrl UE_sched_ctrl[NUMBER_OF_UE_MAX]; + int next[NUMBER_OF_UE_MAX]; + int head; + int next_ul[NUMBER_OF_UE_MAX]; + int head_ul; + int avail; + int num_UEs; + boolean_t active[NUMBER_OF_UE_MAX]; } UE_list_t; -/*! \brief eNB common channels */ +/*! \brief eNB common channels */ typedef struct { - /// Outgoing DCI for PHY generated by eNB scheduler - DCI_PDU DCI_pdu; - /// Outgoing BCCH pdu for PHY - BCCH_PDU BCCH_pdu; - /// Outgoing BCCH DCI allocation - uint32_t BCCH_alloc_pdu; - /// Outgoing CCCH pdu for PHY - CCCH_PDU CCCH_pdu; - RA_TEMPLATE RA_template[NB_RA_PROC_MAX]; - /// VRB map for common channels - uint8_t vrb_map[100]; - /// MBSFN SubframeConfig - struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8]; - /// number of subframe allocation pattern available for MBSFN sync area - uint8_t num_sf_allocation_pattern; -#ifdef Rel10 - /// MBMS Flag - uint8_t MBMS_flag; - /// Outgoing MCCH pdu for PHY - MCCH_PDU MCCH_pdu; - /// MCCH active flag - uint8_t msi_active; - /// MCCH active flag - uint8_t mcch_active; - /// MTCH active flag - uint8_t mtch_active; - /// number of active MBSFN area - uint8_t num_active_mbsfn_area; - /// MBSFN Area Info - struct MBSFN_AreaInfo_r9 *mbsfn_AreaInfo[MAX_MBSFN_AREA]; - /// PMCH Config - struct PMCH_Config_r9 *pmch_Config[MAX_PMCH_perMBSFN]; - /// MBMS session info list - struct MBMS_SessionInfoList_r9 *mbms_SessionList[MAX_PMCH_perMBSFN]; - /// Outgoing MCH pdu for PHY - MCH_PDU MCH_pdu; + int physCellId; + int p_eNB; + int Ncp; + int eutra_band; + uint32_t dl_CarrierFreq; + BCCH_BCH_Message_t *mib; + RadioResourceConfigCommonSIB_t *radioResourceConfigCommon; +#ifdef Rel14 + RadioResourceConfigCommonSIB_t *radioResourceConfigCommon_BR; #endif -#ifdef CBA - /// number of CBA groups - uint8_t num_active_cba_groups; - /// RNTI for each CBA group - uint16_t cba_rnti[NUM_MAX_CBA_GROUP]; - /// MCS for each CBA group - uint8_t group_mcs[NUM_MAX_CBA_GROUP]; + TDD_Config_t *tdd_Config; + SchedulingInfoList_t *schedulingInfoList; + ARFCN_ValueEUTRA_t ul_CarrierFreq; + long ul_Bandwidth; + /// Outgoing MIB PDU for PHY + MIB_PDU MIB_pdu; + /// Outgoing BCCH pdu for PHY + BCCH_PDU BCCH_pdu; + /// Outgoing BCCH DCI allocation + uint32_t BCCH_alloc_pdu; + /// Outgoing CCCH pdu for PHY + CCCH_PDU CCCH_pdu; + /// Outgoing PCCH DCI allocation + uint32_t PCCH_alloc_pdu; + /// Outgoing PCCH pdu for PHY + PCCH_PDU PCCH_pdu; + /// Outgoing RAR pdu for PHY + RAR_PDU RAR_pdu; + /// Template for RA computations + RA_t ra[NB_RA_PROC_MAX]; + /// VRB map for common channels + uint8_t vrb_map[100]; + /// VRB map for common channels and retransmissions by PHICH + uint8_t vrb_map_UL[100]; + /// MBSFN SubframeConfig + struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8]; + /// number of subframe allocation pattern available for MBSFN sync area + uint8_t num_sf_allocation_pattern; +#if defined(Rel10) || defined(Rel14) + /// MBMS Flag + uint8_t MBMS_flag; + /// Outgoing MCCH pdu for PHY + MCCH_PDU MCCH_pdu; + /// MCCH active flag + uint8_t msi_active; + /// MCCH active flag + uint8_t mcch_active; + /// MTCH active flag + uint8_t mtch_active; + /// number of active MBSFN area + uint8_t num_active_mbsfn_area; + /// MBSFN Area Info + struct MBSFN_AreaInfo_r9 *mbsfn_AreaInfo[MAX_MBSFN_AREA]; + /// PMCH Config + struct PMCH_Config_r9 *pmch_Config[MAX_PMCH_perMBSFN]; + /// MBMS session info list + struct MBMS_SessionInfoList_r9 *mbms_SessionList[MAX_PMCH_perMBSFN]; + /// Outgoing MCH pdu for PHY + MCH_PDU MCH_pdu; +#endif +#ifdef Rel14 + /// Rel13 parameters from SIB1 + SystemInformationBlockType1_v1310_IEs_t *sib1_v13ext; + /// Counter for SIB1-BR scheduling + int SIB1_BR_cnt; + /// Outgoing BCCH-BR pdu for PHY + BCCH_PDU BCCH_BR_pdu[20]; #endif } COMMON_channels_t; -/*! \brief top level eNB MAC structure */ -typedef struct { - /// - uint16_t Node_id; - /// frame counter - frame_t frame; - /// subframe counter - sub_frame_t subframe; - /// Common cell resources - COMMON_channels_t common_channels[MAX_NUM_CCs]; - UE_list_t UE_list; +/*! \brief top level eNB MAC structure */ +typedef struct eNB_MAC_INST_s { + /// Ethernet parameters for northbound midhaul interface + eth_params_t eth_params_n; + /// Ethernet parameters for fronthaul interface + eth_params_t eth_params_s; + /// + module_id_t Mod_id; + /// frame counter + frame_t frame; + /// subframe counter + sub_frame_t subframe; + /// Pointer to IF module instance for PHY + IF_Module_t *if_inst; + /// Common cell resources + COMMON_channels_t common_channels[MAX_NUM_CCs]; + /// current PDU index (BCH,MCH,DLSCH) + uint16_t pdu_index[MAX_NUM_CCs]; - ///subband bitmap configuration - SBMAP_CONF sbmap_conf; - /// CCE table used to build DCI scheduling information - int CCE_table[MAX_NUM_CCs][800]; - /// active flag for Other lcid - // uint8_t lcid_active[NB_RB_MAX]; - /// eNB stats - eNB_STATS eNB_stats[MAX_NUM_CCs]; - // MAC function execution peformance profiler - /// processing time of eNB scheduler - time_stats_t eNB_scheduler; - /// processing time of eNB scheduler for SI - time_stats_t schedule_si; - /// processing time of eNB scheduler for Random access - time_stats_t schedule_ra; - /// processing time of eNB ULSCH scheduler - time_stats_t schedule_ulsch; - /// processing time of eNB DCI generation - time_stats_t fill_DLSCH_dci; - /// processing time of eNB MAC preprocessor - time_stats_t schedule_dlsch_preprocessor; - /// processing time of eNB DLSCH scheduler - time_stats_t schedule_dlsch; // include rlc_data_req + MAC header + preprocessor - /// processing time of eNB MCH scheduler - time_stats_t schedule_mch; - /// processing time of eNB ULSCH reception - time_stats_t rx_ulsch_sdu; // include rlc_data_ind + /// NFAPI Config Request Structure + nfapi_config_request_t config[MAX_NUM_CCs]; + /// Preallocated DL pdu list + nfapi_dl_config_request_pdu_t + dl_config_pdu_list[MAX_NUM_CCs][MAX_NUM_DL_PDU]; + /// NFAPI DL Config Request Structure + nfapi_dl_config_request_t DL_req[MAX_NUM_CCs]; + /// Preallocated UL pdu list + nfapi_ul_config_request_pdu_t + ul_config_pdu_list[MAX_NUM_CCs][MAX_NUM_UL_PDU]; + /// Preallocated UL pdu list for ULSCH (n+k delay) + nfapi_ul_config_request_pdu_t + ul_config_pdu_list_tmp[MAX_NUM_CCs][10][MAX_NUM_UL_PDU]; + /// NFAPI UL Config Request Structure, send to L1 4 subframes before processing takes place + nfapi_ul_config_request_t UL_req[MAX_NUM_CCs]; + /// NFAPI "Temporary" UL Config Request Structure, holds future UL_config requests + nfapi_ul_config_request_t UL_req_tmp[MAX_NUM_CCs][10]; + /// Preallocated HI_DCI0 pdu list + nfapi_hi_dci0_request_pdu_t + hi_dci0_pdu_list[MAX_NUM_CCs][MAX_NUM_HI_DCI0_PDU]; + /// NFAPI HI/DCI0 Config Request Structure + nfapi_hi_dci0_request_t HI_DCI0_req[MAX_NUM_CCs]; + /// Prealocated TX pdu list + nfapi_tx_request_pdu_t + tx_request_pdu[MAX_NUM_CCs][MAX_NUM_TX_REQUEST_PDU]; + /// NFAPI DL PDU structure + nfapi_tx_request_t TX_req[MAX_NUM_CCs]; + /// UL handle + uint32_t ul_handle; + UE_list_t UE_list; + ///subband bitmap configuration + SBMAP_CONF sbmap_conf; + /// CCE table used to build DCI scheduling information + int CCE_table[MAX_NUM_CCs][800]; + /// active flag for Other lcid + uint8_t lcid_active[NB_RB_MAX]; + /// eNB stats + eNB_STATS eNB_stats[MAX_NUM_CCs]; + // MAC function execution peformance profiler + /// processing time of eNB scheduler + time_stats_t eNB_scheduler; + /// processing time of eNB scheduler for SI + time_stats_t schedule_si; + /// processing time of eNB scheduler for Random access + time_stats_t schedule_ra; + /// processing time of eNB ULSCH scheduler + time_stats_t schedule_ulsch; + /// processing time of eNB DCI generation + time_stats_t fill_DLSCH_dci; + /// processing time of eNB MAC preprocessor + time_stats_t schedule_dlsch_preprocessor; + /// processing time of eNB DLSCH scheduler + time_stats_t schedule_dlsch; // include rlc_data_req + MAC header + preprocessor + /// processing time of eNB MCH scheduler + time_stats_t schedule_mch; + /// processing time of eNB ULSCH reception + time_stats_t rx_ulsch_sdu; // include rlc_data_ind + /// processing time of eNB PCH scheduler + time_stats_t schedule_pch; } eNB_MAC_INST; /* * UE part - */ + */ + +typedef enum { + TYPE0, + TYPE1, + TYPE1A, + TYPE2, + TYPE2A, + TYPEUESPEC +} MPDCCH_TYPES_t; /*!\brief UE layer 2 status */ typedef enum { - CONNECTION_OK=0, - CONNECTION_LOST, - PHY_RESYNCH, - PHY_HO_PRACH + CONNECTION_OK = 0, + CONNECTION_LOST, + PHY_RESYNCH, + PHY_HO_PRACH } UE_L2_STATE_t; /*!\brief UE scheduling info */ typedef struct { - /// buffer status for each lcgid - uint8_t BSR[MAX_NUM_LCGID]; // should be more for mesh topology - /// keep the number of bytes in rlc buffer for each lcid - uint16_t BSR_bytes[MAX_NUM_LCGID]; - /// buffer status for each lcid - uint8_t LCID_status[MAX_NUM_LCID]; - /// SR pending as defined in 36.321 - uint8_t SR_pending; - /// SR_COUNTER as defined in 36.321 - uint16_t SR_COUNTER; - /// logical channel group ide for each LCID - uint8_t LCGID[MAX_NUM_LCID]; - /// retxBSR-Timer, default value is sf2560 - uint16_t retxBSR_Timer; - /// retxBSR_SF, number of subframe before triggering a regular BSR - int16_t retxBSR_SF; - /// periodicBSR-Timer, default to infinity - uint16_t periodicBSR_Timer; - /// periodicBSR_SF, number of subframe before triggering a periodic BSR - int16_t periodicBSR_SF; - /// default value is 0: not configured - uint16_t sr_ProhibitTimer; - /// sr ProhibitTime running - uint8_t sr_ProhibitTimer_Running; - /// default value to n5 - uint16_t maxHARQ_Tx; - /// default value is false - uint16_t ttiBundling; - /// default value is release - struct DRX_Config *drx_config; - /// default value is release - struct MAC_MainConfig__phr_Config *phr_config; - ///timer before triggering a periodic PHR - uint16_t periodicPHR_Timer; - ///timer before triggering a prohibit PHR - uint16_t prohibitPHR_Timer; - ///DL Pathloss change value - uint16_t PathlossChange; - ///number of subframe before triggering a periodic PHR - int16_t periodicPHR_SF; - ///number of subframe before triggering a prohibit PHR - int16_t prohibitPHR_SF; - ///DL Pathloss Change in db - uint16_t PathlossChange_db; - //Bj bucket usage per lcid - int16_t Bj[MAX_NUM_LCID]; - // Bucket size per lcid - int16_t bucket_size[MAX_NUM_LCID]; + /// buffer status for each lcgid + uint8_t BSR[MAX_NUM_LCGID]; // should be more for mesh topology + /// keep the number of bytes in rlc buffer for each lcgid + int32_t BSR_bytes[MAX_NUM_LCGID]; + /// after multiplexing buffer remain for each lcid + int32_t LCID_buffer_remain[MAX_NUM_LCID]; + /// sum of all lcid buffer size + uint16_t All_lcid_buffer_size_lastTTI; + /// buffer status for each lcid + uint8_t LCID_status[MAX_NUM_LCID]; + /// SR pending as defined in 36.321 + uint8_t SR_pending; + /// SR_COUNTER as defined in 36.321 + uint16_t SR_COUNTER; + /// logical channel group ide for each LCID + uint8_t LCGID[MAX_NUM_LCID]; + /// retxBSR-Timer, default value is sf2560 + uint16_t retxBSR_Timer; + /// retxBSR_SF, number of subframe before triggering a regular BSR + uint16_t retxBSR_SF; + /// periodicBSR-Timer, default to infinity + uint16_t periodicBSR_Timer; + /// periodicBSR_SF, number of subframe before triggering a periodic BSR + uint16_t periodicBSR_SF; + /// default value is 0: not configured + uint16_t sr_ProhibitTimer; + /// sr ProhibitTime running + uint8_t sr_ProhibitTimer_Running; + /// default value to n5 + uint16_t maxHARQ_Tx; + /// default value is false + uint16_t ttiBundling; + /// default value is release + struct DRX_Config *drx_config; + /// default value is release + struct MAC_MainConfig__phr_Config *phr_config; + ///timer before triggering a periodic PHR + uint16_t periodicPHR_Timer; + ///timer before triggering a prohibit PHR + uint16_t prohibitPHR_Timer; + ///DL Pathloss change value + uint16_t PathlossChange; + ///number of subframe before triggering a periodic PHR + int16_t periodicPHR_SF; + ///number of subframe before triggering a prohibit PHR + int16_t prohibitPHR_SF; + ///DL Pathloss Change in db + uint16_t PathlossChange_db; + + /// default value is false + uint16_t extendedBSR_Sizes_r10; + /// default value is false + uint16_t extendedPHR_r10; + + //Bj bucket usage per lcid + int16_t Bj[MAX_NUM_LCID]; + // Bucket size per lcid + int16_t bucket_size[MAX_NUM_LCID]; } UE_SCHEDULING_INFO; /*!\brief Top level UE MAC structure */ typedef struct { - uint16_t Node_id; - /// frame counter - frame_t frame; - /// subframe counter - sub_frame_t subframe; - /// C-RNTI of UE - uint16_t crnti; - /// C-RNTI of UE before HO - rnti_t crnti_before_ho; ///user id (rnti) of connected UEs - /// uplink active flag - uint8_t ul_active; - /// pointer to RRC PHY configuration - RadioResourceConfigCommonSIB_t *radioResourceConfigCommon; - /// pointer to RACH_ConfigDedicated (NULL when not active, i.e. upon HO completion or T304 expiry) - struct RACH_ConfigDedicated *rach_ConfigDedicated; - /// pointer to RRC PHY configuration - struct PhysicalConfigDedicated *physicalConfigDedicated; -#ifdef Rel10 - /// pointer to RRC PHY configuration SCEll - struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10; + uint16_t Node_id; + /// RX frame counter + frame_t rxFrame; + /// RX subframe counter + sub_frame_t rxSubframe; + /// TX frame counter + frame_t txFrame; + /// TX subframe counter + sub_frame_t txSubframe; + /// C-RNTI of UE + uint16_t crnti; + /// C-RNTI of UE before HO + rnti_t crnti_before_ho; ///user id (rnti) of connected UEs + /// uplink active flag + uint8_t ul_active; + /// pointer to RRC PHY configuration + RadioResourceConfigCommonSIB_t *radioResourceConfigCommon; + /// pointer to RACH_ConfigDedicated (NULL when not active, i.e. upon HO completion or T304 expiry) + struct RACH_ConfigDedicated *rach_ConfigDedicated; + /// pointer to RRC PHY configuration + struct PhysicalConfigDedicated *physicalConfigDedicated; +#if defined(Rel10) || defined(Rel14) + /// pointer to RRC PHY configuration SCEll + struct PhysicalConfigDedicatedSCell_r10 + *physicalConfigDedicatedSCell_r10; #endif - /// pointer to TDD Configuration (NULL for FDD) - TDD_Config_t *tdd_Config; - /// Number of adjacent cells to measure - uint8_t n_adj_cells; - /// Array of adjacent physical cell ids - uint32_t adj_cell_id[6]; - /// Pointer to RRC MAC configuration - MAC_MainConfig_t *macConfig; - /// Pointer to RRC Measurement gap configuration - MeasGapConfig_t *measGapConfig; - /// Pointers to LogicalChannelConfig indexed by LogicalChannelIdentity. Note NULL means LCHAN is inactive. - LogicalChannelConfig_t *logicalChannelConfig[MAX_NUM_LCID]; - /// Scheduling Information - UE_SCHEDULING_INFO scheduling_info; - /// Outgoing CCCH pdu for PHY - CCCH_PDU CCCH_pdu; - /// Incoming DLSCH pdu for PHY - //DLSCH_PDU DLSCH_pdu[NUMBER_OF_UE_MAX][2]; - /// number of attempt for rach - uint8_t RA_attempt_number; - /// Random-access procedure flag - uint8_t RA_active; - /// Random-access window counter - int8_t RA_window_cnt; - /// Random-access Msg3 size in bytes - uint8_t RA_Msg3_size; - /// Random-access prachMaskIndex - uint8_t RA_prachMaskIndex; - /// Flag indicating Preamble set (A,B) used for first Msg3 transmission - uint8_t RA_usedGroupA; - /// Random-access Resources - PRACH_RESOURCES_t RA_prach_resources; - /// Random-access PREAMBLE_TRANSMISSION_COUNTER - uint8_t RA_PREAMBLE_TRANSMISSION_COUNTER; - /// Random-access backoff counter - int16_t RA_backoff_cnt; - /// Random-access variable for window calculation (frame of last change in window counter) - uint32_t RA_tx_frame; - /// Random-access variable for window calculation (subframe of last change in window counter) - uint8_t RA_tx_subframe; - /// Random-access Group B maximum path-loss - /// Random-access variable for backoff (frame of last change in backoff counter) - uint32_t RA_backoff_frame; - /// Random-access variable for backoff (subframe of last change in backoff counter) - uint8_t RA_backoff_subframe; - /// Random-access Group B maximum path-loss - uint16_t RA_maxPL; - /// Random-access Contention Resolution Timer active flag - uint8_t RA_contention_resolution_timer_active; - /// Random-access Contention Resolution Timer count value - uint8_t RA_contention_resolution_cnt; - /// power headroom reporitng reconfigured - uint8_t PHR_reconfigured; - /// power headroom state as configured by the higher layers - uint8_t PHR_state; - /// power backoff due to power management (as allowed by P-MPRc) for this cell - uint8_t PHR_reporting_active; - /// power backoff due to power management (as allowed by P-MPRc) for this cell - uint8_t power_backoff_db[NUMBER_OF_eNB_MAX]; - /// MBSFN_Subframe Configuration - struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8]; // FIXME replace 8 by MAX_MBSFN_AREA? - /// number of subframe allocation pattern available for MBSFN sync area - uint8_t num_sf_allocation_pattern; -#ifdef Rel10 - /// number of active MBSFN area - uint8_t num_active_mbsfn_area; - /// MBSFN Area Info - struct MBSFN_AreaInfo_r9 *mbsfn_AreaInfo[MAX_MBSFN_AREA]; - /// PMCH Config - struct PMCH_Config_r9 *pmch_Config[MAX_PMCH_perMBSFN]; - /// MCCH status - uint8_t mcch_status; - /// MSI status - uint8_t msi_status;// could be an array if there are >1 MCH in one MBSFN area + /// pointer to TDD Configuration (NULL for FDD) + TDD_Config_t *tdd_Config; + /// Number of adjacent cells to measure + uint8_t n_adj_cells; + /// Array of adjacent physical cell ids + uint32_t adj_cell_id[6]; + /// Pointer to RRC MAC configuration + MAC_MainConfig_t *macConfig; + /// Pointer to RRC Measurement gap configuration + MeasGapConfig_t *measGapConfig; + /// Pointers to LogicalChannelConfig indexed by LogicalChannelIdentity. Note NULL means LCHAN is inactive. + LogicalChannelConfig_t *logicalChannelConfig[MAX_NUM_LCID]; + /// Scheduling Information + UE_SCHEDULING_INFO scheduling_info; + /// Outgoing CCCH pdu for PHY + CCCH_PDU CCCH_pdu; + /// Outgoing RAR pdu for PHY + RAR_PDU RAR_pdu; + /// Incoming DLSCH pdu for PHY + DLSCH_PDU DLSCH_pdu[NUMBER_OF_UE_MAX][2]; + /// number of attempt for rach + uint8_t RA_attempt_number; + /// Random-access procedure flag + uint8_t RA_active; + /// Random-access window counter + int8_t RA_window_cnt; + /// Random-access Msg3 size in bytes + uint8_t RA_Msg3_size; + /// Random-access prachMaskIndex + uint8_t RA_prachMaskIndex; + /// Flag indicating Preamble set (A,B) used for first Msg3 transmission + uint8_t RA_usedGroupA; + /// Random-access Resources + PRACH_RESOURCES_t RA_prach_resources; + /// Random-access PREAMBLE_TRANSMISSION_COUNTER + uint8_t RA_PREAMBLE_TRANSMISSION_COUNTER; + /// Random-access backoff counter + int16_t RA_backoff_cnt; + /// Random-access variable for window calculation (frame of last change in window counter) + uint32_t RA_tx_frame; + /// Random-access variable for window calculation (subframe of last change in window counter) + uint8_t RA_tx_subframe; + /// Random-access Group B maximum path-loss + /// Random-access variable for backoff (frame of last change in backoff counter) + uint32_t RA_backoff_frame; + /// Random-access variable for backoff (subframe of last change in backoff counter) + uint8_t RA_backoff_subframe; + /// Random-access Group B maximum path-loss + uint16_t RA_maxPL; + /// Random-access Contention Resolution Timer active flag + uint8_t RA_contention_resolution_timer_active; + /// Random-access Contention Resolution Timer count value + uint8_t RA_contention_resolution_cnt; + /// power headroom reporitng reconfigured + uint8_t PHR_reconfigured; + /// power headroom state as configured by the higher layers + uint8_t PHR_state; + /// power backoff due to power management (as allowed by P-MPRc) for this cell + uint8_t PHR_reporting_active; + /// power backoff due to power management (as allowed by P-MPRc) for this cell + uint8_t power_backoff_db[NUMBER_OF_eNB_MAX]; + /// BSR report falg management + uint8_t BSR_reporting_active; + /// retxBSR-Timer expires flag + uint8_t retxBSRTimer_expires_flag; + /// periodBSR-Timer expires flag + uint8_t periodBSRTimer_expires_flag; + + /// MBSFN_Subframe Configuration + struct MBSFN_SubframeConfig *mbsfn_SubframeConfig[8]; // FIXME replace 8 by MAX_MBSFN_AREA? + /// number of subframe allocation pattern available for MBSFN sync area + uint8_t num_sf_allocation_pattern; +#if defined(Rel10) || defined(Rel14) + /// number of active MBSFN area + uint8_t num_active_mbsfn_area; + /// MBSFN Area Info + struct MBSFN_AreaInfo_r9 *mbsfn_AreaInfo[MAX_MBSFN_AREA]; + /// PMCH Config + struct PMCH_Config_r9 *pmch_Config[MAX_PMCH_perMBSFN]; + /// MCCH status + uint8_t mcch_status; + /// MSI status + uint8_t msi_status; // could be an array if there are >1 MCH in one MBSFN area #endif - //#ifdef CBA - /// CBA RNTI for each group - uint16_t cba_rnti[NUM_MAX_CBA_GROUP]; - /// last SFN for CBA channel access - uint8_t cba_last_access[NUM_MAX_CBA_GROUP]; - //#endif - /// total UE scheduler processing time - time_stats_t ue_scheduler; // total - /// UE ULSCH tx processing time inlcuding RLC interface (rlc_data_req) and mac header generation - time_stats_t tx_ulsch_sdu; - /// UE DLSCH rx processing time inlcuding RLC interface (mac_rrc_data_ind or mac_rlc_status_ind+mac_rlc_data_ind) and mac header parser - time_stats_t rx_dlsch_sdu ; - /// UE query for MCH subframe processing time - time_stats_t ue_query_mch; - /// UE MCH rx processing time - time_stats_t rx_mch_sdu; - /// UE BCCH rx processing time including RLC interface (mac_rrc_data_ind) - time_stats_t rx_si; + //#ifdef CBA + /// CBA RNTI for each group + uint16_t cba_rnti[NUM_MAX_CBA_GROUP]; + /// last SFN for CBA channel access + uint8_t cba_last_access[NUM_MAX_CBA_GROUP]; + //#endif + /// total UE scheduler processing time + time_stats_t ue_scheduler; // total + /// UE ULSCH tx processing time inlcuding RLC interface (rlc_data_req) and mac header generation + time_stats_t tx_ulsch_sdu; + /// UE DLSCH rx processing time inlcuding RLC interface (mac_rrc_data_ind or mac_rlc_status_ind+mac_rlc_data_ind) and mac header parser + time_stats_t rx_dlsch_sdu; + /// UE query for MCH subframe processing time + time_stats_t ue_query_mch; + /// UE MCH rx processing time + time_stats_t rx_mch_sdu; + /// UE BCCH rx processing time including RLC interface (mac_rrc_data_ind) + time_stats_t rx_si; + /// UE PCCH rx processing time including RLC interface (mac_rrc_data_ind) + time_stats_t rx_p; } UE_MAC_INST; /*! \brief ID of the neighboring cells used for HO*/ typedef struct { - uint16_t cell_ids[6]; - uint8_t n_adj_cells; + uint16_t cell_ids[6]; + uint8_t n_adj_cells; } neigh_cell_id_t; #include "proto.h" /*@}*/ #endif /*__LAYER2_MAC_DEFS_H__ */ - - - diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index a6c4eaeb16..bfde1700ee 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file eNB_scheduler.c * \brief eNB scheduler top level function operates on per subframe basis * \author Navid Nikaein and Raymond Knopp @@ -59,633 +52,765 @@ //#include "LAYER2/MAC/pre_processor.c" #include "pdcp.h" +#if defined(FLEXRAN_AGENT_SB_IF) +//Agent-related headers +#include "flexran_agent_extern.h" +#include "flexran_agent_mac.h" +#include "flexran_agent_mac_proto.h" +#endif + #if defined(ENABLE_ITTI) -# include "intertask_interface.h" +#include "intertask_interface.h" #endif #define ENABLE_MAC_PAYLOAD_DEBUG #define DEBUG_eNB_SCHEDULER 1 -//#define DEBUG_HEADER_PARSING 1 -//#define DEBUG_PACKET_TRACE 1 -/* - #ifndef USER_MODE - #define msg debug_msg - #endif - */ +extern RAN_CONTEXT_t RC; + +uint16_t pdcch_order_table[6] = { 31, 31, 511, 2047, 2047, 8191 }; - - - - - -void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, frame_t frameP, sub_frame_t subframeP) //, int calibration_flag) { +void +schedule_SRS(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) { + eNB_MAC_INST *eNB = RC.mac[module_idP]; + UE_list_t *UE_list = &eNB->UE_list; + nfapi_ul_config_request_body_t *ul_req; + int CC_id, UE_id; + COMMON_channels_t *cc = RC.mac[module_idP]->common_channels; + SoundingRS_UL_ConfigCommon_t *soundingRS_UL_ConfigCommon; + struct SoundingRS_UL_ConfigDedicated *soundingRS_UL_ConfigDedicated; + uint8_t TSFC; + uint16_t deltaTSFC; // bitmap + uint8_t srs_SubframeConfig; - int mbsfn_status[MAX_NUM_CCs]; - protocol_ctxt_t ctxt; -#ifdef EXMIMO - //int ret; -#endif -#if defined(ENABLE_ITTI) - MessageDef *msg_p; - const char *msg_name; - instance_t instance; - int result; -#endif - DCI_PDU *DCI_pdu[MAX_NUM_CCs]; - int CC_id,i,next_i; - UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list; - rnti_t rnti; - void *DLSCH_dci=NULL; - int size_bits=0,size_bytes=0; + // table for TSFC (Period) and deltaSFC (offset) + const uint16_t deltaTSFCTabType1[15][2] = { {1, 1}, {1, 2}, {2, 2}, {1, 5}, {2, 5}, {4, 5}, {8, 5}, {3, 5}, {12, 5}, {1, 10}, {2, 10}, {4, 10}, {8, 10}, {351, 10}, {383, 10} }; // Table 5.5.3.3-2 3GPP 36.211 FDD + const uint16_t deltaTSFCTabType2[14][2] = { {2, 5}, {6, 5}, {10, 5}, {18, 5}, {14, 5}, {22, 5}, {26, 5}, {30, 5}, {70, 10}, {74, 10}, {194, 10}, {326, 10}, {586, 10}, {210, 10} }; // Table 5.5.3.3-2 3GPP 36.211 TDD - LOG_D(MAC,"[eNB %d] Frame %d, Subframe %d, entering MAC scheduler (UE_list->head %d)\n",module_idP, frameP, subframeP,UE_list->head); + uint16_t srsPeriodicity, srsOffset; - start_meas(&eNB_mac_inst[module_idP].eNB_scheduler); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_IN); - - for (CC_id=0; CC_idhead; - - while (i>=0) { - rnti = UE_RNTI(module_idP, i); - CC_id = UE_PCCID(module_idP, i); - LOG_D(MAC,"UE %d: rnti %x (%p)\n", i, rnti, - mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)); - next_i= UE_list->next[i]; - - PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]=-63; - if (i==UE_list->head) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR,PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_bsr[i][(frameP*10)+subframeP]); - // increment this, it is cleared when we receive an sdu - eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].ul_inactivity_timer++; - - eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].cqi_req_timer++; - - if (mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)==NULL) { - // mac_remove_ue(module_idP, i, frameP, subframeP); - } - else { - // check uplink failure - if ((UE_list->UE_sched_ctrl[i].ul_failure_timer>0)&& - (UE_list->UE_sched_ctrl[i].ul_out_of_sync==0)) { - LOG_D(MAC,"UE %d rnti %x: UL Failure timer %d \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer); - if (UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent==0) { - UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent=1; - - // add a format 1A dci for this UE to request an RA procedure (only one UE per subframe) - LOG_D(MAC,"UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d) \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer); - DLSCH_dci = (void *)UE_list->UE_template[CC_id][i].DLSCH_DCI[0]; - *(uint32_t*)DLSCH_dci = 0; - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->type = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 31; - size_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - size_bits = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - break; - case 25: - ((DCI1A_5MHz_TDD_1_6_t*)DLSCH_dci)->type = 1; - ((DCI1A_5MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 511; - size_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); - size_bits = sizeof_DCI1A_5MHz_TDD_1_6_t; - break; - case 50: - ((DCI1A_10MHz_TDD_1_6_t*)DLSCH_dci)->type = 1; - ((DCI1A_10MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 2047; - size_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); - size_bits = sizeof_DCI1A_10MHz_TDD_1_6_t; - break; - case 100: - ((DCI1A_20MHz_TDD_1_6_t*)DLSCH_dci)->type = 1; - ((DCI1A_20MHz_TDD_1_6_t*)DLSCH_dci)->rballoc = 8191; - size_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); - size_bits = sizeof_DCI1A_20MHz_TDD_1_6_t; - break; + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + soundingRS_UL_ConfigCommon = + &cc[CC_id].radioResourceConfigCommon-> + soundingRS_UL_ConfigCommon; + // check if SRS is enabled in this frame/subframe + if (soundingRS_UL_ConfigCommon) { + srs_SubframeConfig = + soundingRS_UL_ConfigCommon->choice.setup. + srs_SubframeConfig; + if (cc[CC_id].tdd_Config == NULL) { // FDD + deltaTSFC = deltaTSFCTabType1[srs_SubframeConfig][0]; + TSFC = deltaTSFCTabType1[srs_SubframeConfig][1]; + } else { // TDD + deltaTSFC = deltaTSFCTabType2[srs_SubframeConfig][0]; + TSFC = deltaTSFCTabType2[srs_SubframeConfig][1]; } - } - else { // FDD - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->type = 1; - ((DCI1A_1_5MHz_FDD_t*)DLSCH_dci)->rballoc = 31; - size_bytes = sizeof(DCI1A_1_5MHz_FDD_t); - size_bits = sizeof_DCI1A_1_5MHz_FDD_t; - break; - case 15:/* - ((DCI1A_2_5MHz_FDD_t*)DLSCH_dci)->type = 1; - ((DCI1A_2_5MHz_FDD_t*)DLSCH_dci)->rballoc = 31; - size_bytes = sizeof(DCI1A_1_5MHz_FDD_t); - size_bits = sizeof_DCI1A_1_5MHz_FDD_t;*/ - break; - case 25: - ((DCI1A_5MHz_FDD_t*)DLSCH_dci)->type = 1; - ((DCI1A_5MHz_FDD_t*)DLSCH_dci)->rballoc = 511; - size_bytes = sizeof(DCI1A_5MHz_FDD_t); - size_bits = sizeof_DCI1A_5MHz_FDD_t; - break; - case 50: - ((DCI1A_10MHz_FDD_t*)DLSCH_dci)->type = 1; - ((DCI1A_10MHz_FDD_t*)DLSCH_dci)->rballoc = 2047; - size_bytes = sizeof(DCI1A_10MHz_FDD_t); - size_bits = sizeof_DCI1A_10MHz_FDD_t; - break; - case 75: - /* ((DCI1A_15MHz_FDD_t*)DLSCH_dci)->type = 1; - ((DCI1A_15MHz_FDD_t*)DLSCH_dci)->rballoc = 2047; - size_bytes = sizeof(DCI1A_10MHz_FDD_t); - size_bits = sizeof_DCI1A_10MHz_FDD_t;*/ - break; - case 100: - ((DCI1A_20MHz_FDD_t*)DLSCH_dci)->type = 1; - ((DCI1A_20MHz_FDD_t*)DLSCH_dci)->rballoc = 8191; - size_bytes = sizeof(DCI1A_20MHz_FDD_t); - size_bits = sizeof_DCI1A_20MHz_FDD_t; - break; - } - } - - add_ue_spec_dci(DCI_pdu[CC_id], - DLSCH_dci, - rnti, - size_bytes, - process_ue_cqi (module_idP,i),//aggregation, - size_bits, - format1A, - 0); - } - else { // ra_pdcch_sent==1 - LOG_D(MAC,"UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer); - if ((UE_list->UE_sched_ctrl[i].ul_failure_timer % 40) == 0) - UE_list->UE_sched_ctrl[i].ra_pdcch_order_sent=0; // resend every 4 frames - } - - UE_list->UE_sched_ctrl[i].ul_failure_timer++; - // check threshold - if (UE_list->UE_sched_ctrl[i].ul_failure_timer > 200) { - // inform RRC of failure and clear timer - LOG_I(MAC,"UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n",i,rnti,UE_list->UE_sched_ctrl[i].ul_failure_timer); - mac_eNB_rrc_ul_failure(module_idP,CC_id,frameP,subframeP,rnti); - UE_list->UE_sched_ctrl[i].ul_failure_timer=0; - UE_list->UE_sched_ctrl[i].ul_out_of_sync=1; - } - } - } // ul_failure_timer>0 - - i = next_i; - } + // Sounding reference signal subframes are the subframes satisfying ns/2 mod TSFC (- deltaTSFC + uint16_t tmp = (subframeP % TSFC); -#if defined(ENABLE_ITTI) + if ((1 << tmp) & deltaTSFC) { + // This is an SRS subframe, loop over UEs + for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (RC.mac[module_idP]->UE_list.active[UE_id] != TRUE) + continue; + ul_req = + &RC.mac[module_idP]->UL_req[CC_id]. + ul_config_request_body; - do { - // Checks if a message has been sent to MAC sub-task - itti_poll_msg (TASK_MAC_ENB, &msg_p); - if (msg_p != NULL) { - msg_name = ITTI_MSG_NAME (msg_p); - instance = ITTI_MSG_INSTANCE (msg_p); + // drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet + if (mac_eNB_get_rrc_status + (module_idP, + UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) + continue; - switch (ITTI_MSG_ID(msg_p)) { - case MESSAGE_TEST: - LOG_D(MAC, "Received %s\n", ITTI_MSG_NAME(msg_p)); - break; + AssertFatal(UE_list->UE_template[CC_id] + [UE_id].physicalConfigDedicated != NULL, + "physicalConfigDedicated is null for UE %d\n", + UE_id); - case RRC_MAC_BCCH_DATA_REQ: - LOG_D(MAC, "Received %s from %s: instance %d, frameP %d, eNB_index %d\n", - msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance, - RRC_MAC_BCCH_DATA_REQ (msg_p).frame, RRC_MAC_BCCH_DATA_REQ (msg_p).enb_index); + if ((soundingRS_UL_ConfigDedicated = + UE_list->UE_template[CC_id] + [UE_id]. + physicalConfigDedicated->soundingRS_UL_ConfigDedicated) + != NULL) { + if (soundingRS_UL_ConfigDedicated->present == + SoundingRS_UL_ConfigDedicated_PR_setup) { + get_srs_pos(&cc[CC_id], + soundingRS_UL_ConfigDedicated->choice. + setup.srs_ConfigIndex, + &srsPeriodicity, &srsOffset); + if (((10 * frameP + + subframeP) % srsPeriodicity) == + srsOffset) { + // Program SRS + ul_req->srs_present = 1; + nfapi_ul_config_request_pdu_t + * ul_config_pdu = + &ul_req-> + ul_config_pdu_list + [ul_req->number_of_pdus]; + memset((void *) ul_config_pdu, 0, + sizeof + (nfapi_ul_config_request_pdu_t)); + ul_config_pdu->pdu_type = + NFAPI_UL_CONFIG_SRS_PDU_TYPE; + ul_config_pdu->pdu_size = + 2 + (uint8_t) (2 + + sizeof + (nfapi_ul_config_srs_pdu)); + ul_config_pdu->srs_pdu.srs_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG; + ul_config_pdu->srs_pdu.srs_pdu_rel8.size = + (uint8_t) + sizeof(nfapi_ul_config_srs_pdu); + ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti = + UE_list->UE_template[CC_id][UE_id]. + rnti; + ul_config_pdu->srs_pdu. + srs_pdu_rel8.srs_bandwidth = + soundingRS_UL_ConfigDedicated-> + choice.setup.srs_Bandwidth; + ul_config_pdu->srs_pdu. + srs_pdu_rel8.frequency_domain_position + = + soundingRS_UL_ConfigDedicated-> + choice.setup.freqDomainPosition; + ul_config_pdu->srs_pdu. + srs_pdu_rel8.srs_hopping_bandwidth = + soundingRS_UL_ConfigDedicated-> + choice.setup.srs_HoppingBandwidth;; + ul_config_pdu->srs_pdu. + srs_pdu_rel8.transmission_comb = + soundingRS_UL_ConfigDedicated-> + choice.setup.transmissionComb; + ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs = + soundingRS_UL_ConfigDedicated-> + choice.setup.srs_ConfigIndex; + ul_config_pdu->srs_pdu. + srs_pdu_rel8.sounding_reference_cyclic_shift + = + soundingRS_UL_ConfigDedicated-> + choice.setup.cyclicShift; + // ul_config_pdu->srs_pdu.srs_pdu_rel10.antenna_port = ;// + // ul_config_pdu->srs_pdu.srs_pdu_rel13.number_of_combs = ;// + RC.mac[module_idP]->UL_req[CC_id].sfn_sf = + (frameP << 4) + subframeP; + RC.mac[module_idP]->UL_req[CC_id].header.message_id = NFAPI_UL_CONFIG_REQUEST; + ul_req->number_of_pdus++; + } // if (((10*frameP+subframeP) % srsPeriodicity) == srsOffset) + } // if (soundingRS_UL_ConfigDedicated->present == SoundingRS_UL_ConfigDedicated_PR_setup) + } // if ((soundingRS_UL_ConfigDedicated = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->soundingRS_UL_ConfigDedicated)!=NULL) + } // for (UE_id ... + } // if((1<Num_common_dci = 0; - DCI_pdu[CC_id]->Num_ue_spec_dci = 0; - - -#ifdef Rel10 - eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active =0; -#endif - - eNB_mac_inst[module_idP].frame = frameP; - eNB_mac_inst[module_idP].subframe = subframeP; - - - } - - //if (subframeP%5 == 0) - //#ifdef EXMIMO - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, 0,module_idP); - pdcp_run(&ctxt); - //#endif - - // check HO - rrc_rx_tx(&ctxt, - 0, // eNB index, unused in eNB - CC_id); - -#ifdef Rel10 - - for (CC_id=0; CC_id0) { - start_meas(&eNB_mac_inst[module_idP].schedule_mch); - mbsfn_status[CC_id] = schedule_MBMS(module_idP,CC_id,frameP,subframeP); - stop_meas(&eNB_mac_inst[module_idP].schedule_mch); - } - } - -#endif - // refresh UE list based on UEs dropped by PHY in previous subframe - /* - i=UE_list->head; - while (i>=0) { - next_i = UE_list->next[i]; - LOG_T(MAC,"UE %d : rnti %x, stats %p\n",i,UE_RNTI(module_idP,i),mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))); - if (mac_xface->get_eNB_UE_stats(module_idP,0,UE_RNTI(module_idP,i))==NULL) { - mac_remove_ue(module_idP,i,frameP); - } - i=next_i; - } - */ - - switch (subframeP) { - case 0: - - // FDD/TDD Schedule Downlink RA transmissions (RA response, Msg4 Contention resolution) - // Schedule ULSCH for FDD or subframeP 4 (TDD config 0,3,6) - // Schedule Normal DLSCH - - - schedule_RA(module_idP,frameP,subframeP,2); - - - if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,0,4);//,calibration_flag); - } else if ((mac_xface->lte_frame_parms->tdd_config == TDD) || //TDD - (mac_xface->lte_frame_parms->tdd_config == 3) || - (mac_xface->lte_frame_parms->tdd_config == 6)) { - //schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4);//,calibration_flag); - } - - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - - break; - - case 1: - - // TDD, schedule UL for subframeP 7 (TDD config 0,1) / subframeP 8 (TDD Config 6) - // FDD, schedule normal UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 0: - case 1: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - case 6: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - default: - break; - } - } else { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,1,5); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - } - - break; - - case 2: - - // TDD, nothing - // FDD, normal UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,2,6); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - } - - break; - - case 3: - - // TDD Config 2, ULSCH for subframeP 7 - // TDD Config 2/5 normal DLSCH - // FDD, normal UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->tdd_config) { - case 2: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,7); - - // no break here! - case 5: - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - default: - break; - } - } else { //FDD - - schedule_ulsch(module_idP,frameP,cooperation_flag,3,7); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - } - - break; - - case 4: - - // TDD Config 1, ULSCH for subframeP 8 - // TDD Config 1/2/4/5 DLSCH - // FDD UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == 1) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 1: - // schedule_RA(module_idP,frameP,subframeP); - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,8); - - // no break here! - case 2: - - // no break here! - case 4: - - // no break here! - case 5: - - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - default: - break; - } - } else { - if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD - - schedule_ulsch(module_idP, frameP, cooperation_flag, 4, 8); - schedule_ue_spec(module_idP, frameP, subframeP, mbsfn_status); - fill_DLSCH_dci(module_idP, frameP, subframeP, mbsfn_status); - } - } - - break; - - case 5: - // TDD/FDD Schedule SI - // TDD Config 0,6 ULSCH for subframes 9,3 resp. - // TDD normal DLSCH - // FDD normal UL/DLSCH - schedule_SI(module_idP,frameP,subframeP); - - //schedule_RA(module_idP,frameP,subframeP,5); - if (mac_xface->lte_frame_parms->frame_type == FDD) { - schedule_RA(module_idP,frameP,subframeP,1); - schedule_ulsch(module_idP,frameP,cooperation_flag,5,9); - schedule_ue_spec(module_idP, frameP, subframeP, mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - } else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0 - (mac_xface->lte_frame_parms->tdd_config == 6)) { // TDD Config 6 - //schedule_ulsch(module_idP,cooperation_flag,subframeP); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - } else { - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - } - - break; - - case 6: - - // TDD Config 0,1,6 ULSCH for subframes 2,3 - // TDD Config 3,4,5 Normal DLSCH - // FDD normal ULSCH/DLSCH - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 0: - break; - - case 1: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2); - // schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - case 6: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3); - // schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - case 5: - schedule_RA(module_idP,frameP,subframeP,2); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - case 3: - case 4: - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - default: - break; - } - } else { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,6,0); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - } - - break; - - case 7: - - // TDD Config 3,4,5 Normal DLSCH - // FDD Normal UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 3: - case 4: - schedule_RA(module_idP,frameP,subframeP,3); // 3 = Msg3 subframeP, not - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - case 5: - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - default: - break; - } - } else { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,7,1); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - } - - break; - - case 8: - - // TDD Config 2,3,4,5 ULSCH for subframeP 2 - // - // FDD Normal UL/DLSCH - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - switch (mac_xface->lte_frame_parms->tdd_config) { - case 2: - case 3: - case 4: - case 5: - - // schedule_RA(module_idP,subframeP); - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,2); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - default: - break; - } - } else { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,8,2); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - } - - break; - - case 9: - - // TDD Config 1,3,4,6 ULSCH for subframes 3,3,3,4 - if (mac_xface->lte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->tdd_config) { - case 1: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3); - schedule_RA(module_idP,frameP,subframeP,7); // 7 = Msg3 subframeP, not - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - case 3: - case 4: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,3); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - case 6: - schedule_ulsch(module_idP,frameP,cooperation_flag,subframeP,4); - //schedule_RA(module_idP,frameP,subframeP); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - case 2: - case 5: - //schedule_RA(module_idP,frameP,subframeP); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - break; - - default: - break; - } - } else { //FDD - schedule_ulsch(module_idP,frameP,cooperation_flag,9,3); - schedule_ue_spec(module_idP,frameP,subframeP,mbsfn_status); - fill_DLSCH_dci(module_idP,frameP,subframeP,mbsfn_status); - } - - break; - - } - - LOG_D(MAC,"FrameP %d, subframeP %d : Scheduling CCEs\n",frameP,subframeP); - - // Allocate CCEs for good after scheduling is done - for (CC_id=0;CC_idNum_common_dci+DCI_pdu[CC_id]->Num_ue_spec_dci; - i++) - if (DCI_pdu[CC_id]->dci_alloc[i].rnti==2) - dummy=1; - - if (dummy==1) - for (i=0; - iNum_common_dci+DCI_pdu[CC_id]->Num_ue_spec_dci; - i++) - LOG_I(MAC,"Frame %d, subframe %d: DCI %d/%d, format %d, rnti %x, NCCE %d(num_pdcch_symb %d)\n", - frameP,subframeP,i,DCI_pdu[CC_id]->Num_common_dci+DCI_pdu[CC_id]->Num_ue_spec_dci, - DCI_pdu[CC_id]->dci_alloc[i].format, - DCI_pdu[CC_id]->dci_alloc[i].rnti, - DCI_pdu[CC_id]->dci_alloc[i].firstCCE, - DCI_pdu[CC_id]->num_pdcch_symbols); - - - LOG_D(MAC,"frameP %d, subframeP %d\n",frameP,subframeP); - */ - - stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT); - } +void +schedule_CSI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) +{ + eNB_MAC_INST *eNB = RC.mac[module_idP]; + UE_list_t *UE_list = &eNB->UE_list; + COMMON_channels_t *cc; + nfapi_ul_config_request_body_t *ul_req; + int CC_id, UE_id; + struct CQI_ReportPeriodic *cqi_ReportPeriodic; + uint16_t Npd, N_OFFSET_CQI; + int H; + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + + cc = &eNB->common_channels[CC_id]; + for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (UE_list->active[UE_id] != TRUE) + continue; + + ul_req = + &RC.mac[module_idP]->UL_req[CC_id].ul_config_request_body; + + // drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet + if (mac_eNB_get_rrc_status + (module_idP, UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) + continue; + + AssertFatal(UE_list-> + UE_template[CC_id][UE_id].physicalConfigDedicated + != NULL, + "physicalConfigDedicated is null for UE %d\n", + UE_id); + + if (UE_list-> + UE_template[CC_id][UE_id].physicalConfigDedicated-> + cqi_ReportConfig) { + if ((cqi_ReportPeriodic = + UE_list-> + UE_template[CC_id][UE_id].physicalConfigDedicated-> + cqi_ReportConfig->cqi_ReportPeriodic) != NULL + && (cqi_ReportPeriodic->present != + CQI_ReportPeriodic_PR_release)) { + //Rel8 Periodic CQI/PMI/RI reporting + + get_csi_params(cc, cqi_ReportPeriodic, &Npd, + &N_OFFSET_CQI, &H); + + if ((((frameP * 10) + subframeP) % Npd) == N_OFFSET_CQI) { // CQI opportunity + UE_list->UE_sched_ctrl[UE_id].feedback_cnt[CC_id] = + (((frameP * 10) + subframeP) / Npd) % H; + // Program CQI + nfapi_ul_config_request_pdu_t *ul_config_pdu = + &ul_req->ul_config_pdu_list[ul_req-> + number_of_pdus]; + memset((void *) ul_config_pdu, 0, + sizeof(nfapi_ul_config_request_pdu_t)); + ul_config_pdu->pdu_type = + NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE; + ul_config_pdu->pdu_size = + 2 + (uint8_t) (2 + + sizeof + (nfapi_ul_config_uci_cqi_pdu)); + ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; + ul_config_pdu->uci_cqi_pdu. + ue_information.ue_information_rel8.rnti = + UE_list->UE_template[CC_id][UE_id].rnti; + ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG; + ul_config_pdu->uci_cqi_pdu. + cqi_information.cqi_information_rel8. + pucch_index = + cqi_ReportPeriodic->choice. + setup.cqi_PUCCH_ResourceIndex; + ul_config_pdu->uci_cqi_pdu. + cqi_information.cqi_information_rel8. + dl_cqi_pmi_size = + get_rel8_dl_cqi_pmi_size + (&UE_list->UE_sched_ctrl[UE_id], CC_id, cc, + get_tmode(module_idP, CC_id, UE_id), + cqi_ReportPeriodic); + ul_req->number_of_pdus++; + ul_req->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + +#if defined(Rel10) || defined(Rel14) + // PUT rel10-13 UCI options here +#endif + } else + if ((cqi_ReportPeriodic->choice.setup. + ri_ConfigIndex) + && ((((frameP * 10) + subframeP) % ((H * Npd) << (*cqi_ReportPeriodic->choice.setup.ri_ConfigIndex / 161))) == N_OFFSET_CQI + (*cqi_ReportPeriodic->choice.setup.ri_ConfigIndex % 161))) { // RI opportunity + // Program RI + nfapi_ul_config_request_pdu_t *ul_config_pdu = + &ul_req->ul_config_pdu_list[ul_req-> + number_of_pdus]; + memset((void *) ul_config_pdu, 0, + sizeof(nfapi_ul_config_request_pdu_t)); + ul_config_pdu->pdu_type = + NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE; + ul_config_pdu->pdu_size = + 2 + (uint8_t) (2 + + sizeof + (nfapi_ul_config_uci_cqi_pdu)); + ul_config_pdu->uci_cqi_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; + ul_config_pdu->uci_cqi_pdu. + ue_information.ue_information_rel8.rnti = + UE_list->UE_template[CC_id][UE_id].rnti; + ul_config_pdu->uci_cqi_pdu.cqi_information.cqi_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG; + ul_config_pdu->uci_cqi_pdu. + cqi_information.cqi_information_rel8. + pucch_index = + cqi_ReportPeriodic->choice. + setup.cqi_PUCCH_ResourceIndex; + ul_config_pdu->uci_cqi_pdu. + cqi_information.cqi_information_rel8. + dl_cqi_pmi_size = (cc->p_eNB == 2) ? 1 : 2; + RC.mac[module_idP]->UL_req[CC_id].sfn_sf = + (frameP << 4) + subframeP; + ul_req->number_of_pdus++; + ul_req->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + } + + } // if ((cqi_ReportPeriodic = cqi_ReportConfig->cqi_ReportPeriodic)!=NULL) { + } // if (UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->cqi_ReportConfig) + } // for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { + } // for (CC_id=0; CC_idUE_list; + nfapi_ul_config_request_t *ul_req; + nfapi_ul_config_request_body_t *ul_req_body; + int CC_id; + int UE_id; + SchedulingRequestConfig_t *SRconfig; + int skip_ue; + int is_harq; + nfapi_ul_config_sr_information sr; + int i; + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + RC.mac[module_idP]->UL_req[CC_id].sfn_sf = + (frameP << 4) + subframeP; + + for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (RC.mac[module_idP]->UE_list.active[UE_id] != TRUE) + continue; + + ul_req = &RC.mac[module_idP]->UL_req[CC_id]; + ul_req_body = &ul_req->ul_config_request_body; + + // drop the allocation if the UE hasn't send RRCConnectionSetupComplete yet + if (mac_eNB_get_rrc_status + (module_idP, UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED) + continue; + + AssertFatal(UE_list-> + UE_template[CC_id][UE_id].physicalConfigDedicated + != NULL, + "physicalConfigDedicated is null for UE %d\n", + UE_id); + + if ((SRconfig = + UE_list-> + UE_template[CC_id][UE_id].physicalConfigDedicated-> + schedulingRequestConfig) != NULL) { + if (SRconfig->present == SchedulingRequestConfig_PR_setup) { + if (SRconfig->choice.setup.sr_ConfigIndex <= 4) { // 5 ms SR period + if ((subframeP % 5) != + SRconfig->choice.setup.sr_ConfigIndex) + continue; + } else if (SRconfig->choice.setup.sr_ConfigIndex <= 14) { // 10 ms SR period + if (subframeP != + (SRconfig->choice.setup.sr_ConfigIndex - 5)) + continue; + } else if (SRconfig->choice.setup.sr_ConfigIndex <= 34) { // 20 ms SR period + if ((10 * (frameP & 1) + subframeP) != + (SRconfig->choice.setup.sr_ConfigIndex - 15)) + continue; + } else if (SRconfig->choice.setup.sr_ConfigIndex <= 74) { // 40 ms SR period + if ((10 * (frameP & 3) + subframeP) != + (SRconfig->choice.setup.sr_ConfigIndex - 35)) + continue; + } else if (SRconfig->choice.setup.sr_ConfigIndex <= 154) { // 80 ms SR period + if ((10 * (frameP & 7) + subframeP) != + (SRconfig->choice.setup.sr_ConfigIndex - 75)) + continue; + } + } // SRconfig->present == SchedulingRequestConfig_PR_setup) + } // SRconfig = UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->schedulingRequestConfig)!=NULL) + + // if we get here there is some PUCCH1 reception to schedule for SR + + skip_ue = 0; + is_harq = 0; + // check that there is no existing UL grant for ULSCH which overrides the SR + for (i = 0; i < ul_req_body->number_of_pdus; i++) { + if (((ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) || + (ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE) || + (ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) || + (ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE)) && + (ul_req_body->ul_config_pdu_list[i].ulsch_pdu.ulsch_pdu_rel8.rnti == UE_list->UE_template[CC_id][UE_id].rnti)) { + skip_ue = 1; + break; + } + /* if there is already an HARQ pdu, convert to SR_HARQ */ + else if ((ul_req_body->ul_config_pdu_list[i].pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) && + (ul_req_body->ul_config_pdu_list[i].uci_harq_pdu.ue_information.ue_information_rel8.rnti == UE_list->UE_template[CC_id][UE_id].rnti)) { + is_harq = 1; + break; + } + } + + // drop the allocation because ULSCH with handle it with BSR + if (skip_ue == 1) + continue; + + LOG_D(MAC,"Frame %d, Subframe %d : Scheduling SR for UE %d/%x is_harq:%d\n",frameP,subframeP,UE_id,UE_list->UE_template[CC_id][UE_id].rnti, is_harq); + + // check Rel10 or Rel8 SR +#if defined(Rel10) || defined(Rel14) + if ((UE_list-> + UE_template[CC_id][UE_id].physicalConfigDedicated->ext2) + && (UE_list-> + UE_template[CC_id][UE_id].physicalConfigDedicated-> + ext2->schedulingRequestConfig_v1020) + && (UE_list-> + UE_template[CC_id][UE_id].physicalConfigDedicated-> + ext2->schedulingRequestConfig_v1020)) { + sr.sr_information_rel10.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG; + sr.sr_information_rel10.number_of_pucch_resources = 1; + sr.sr_information_rel10.pucch_index_p1 = + *UE_list-> + UE_template[CC_id][UE_id].physicalConfigDedicated-> + ext2-> + schedulingRequestConfig_v1020->sr_PUCCH_ResourceIndexP1_r10; + LOG_D(MAC,"REL10 PUCCH INDEX P1:%d\n", sr.sr_information_rel10.pucch_index_p1); + } else +#endif + { + sr.sr_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG; + sr.sr_information_rel8.pucch_index = + UE_list-> + UE_template[CC_id][UE_id].physicalConfigDedicated-> + schedulingRequestConfig->choice.setup. + sr_PUCCH_ResourceIndex; + LOG_D(MAC,"REL8 PUCCH INDEX:%d\n", sr.sr_information_rel8.pucch_index); + } + + /* if there is already an HARQ pdu, convert to SR_HARQ */ + if (is_harq) { + nfapi_ul_config_harq_information h = ul_req_body->ul_config_pdu_list[i].uci_harq_pdu.harq_information; + ul_req_body->ul_config_pdu_list[i].pdu_type = NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE; + ul_req_body->ul_config_pdu_list[i].uci_sr_harq_pdu.sr_information = sr; + ul_req_body->ul_config_pdu_list[i].uci_sr_harq_pdu.harq_information = h; + } else { + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].pdu_type = NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE; + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel8.rnti = UE_list->UE_template[CC_id][UE_id].rnti; + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel11.tl.tag = 0; + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.ue_information.ue_information_rel13.tl.tag = 0; + ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus].uci_sr_pdu.sr_information = sr; + ul_req_body->number_of_pdus++; + } /* if (is_harq) */ + ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + } // for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) + } // for (CC_id=0; CC_idUE_list; + nfapi_dl_config_request_t *DL_req = &RC.mac[module_idP]->DL_req[0]; + uint16_t rnti = UE_RNTI(module_idP, UE_id); + COMMON_channels_t *cc = RC.mac[module_idP]->common_channels; + + // check uplink failure + if ((UE_list->UE_sched_ctrl[UE_id].ul_failure_timer > 0) && + (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 0)) { + LOG_I(MAC, "UE %d rnti %x: UL Failure timer %d \n", UE_id, rnti, + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer); + if (UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent == 0) { + UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 1; + + // add a format 1A dci for this UE to request an RA procedure (only one UE per subframe) + nfapi_dl_config_request_pdu_t *dl_config_pdu = + &DL_req[CC_id]. + dl_config_request_body.dl_config_pdu_list[DL_req[CC_id]. + dl_config_request_body.number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = + NFAPI_DL_DCI_FORMAT_1A; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = + get_aggregation(get_bw_index(module_idP, CC_id), + UE_list->UE_sched_ctrl[UE_id]. + dl_cqi[CC_id], format1A); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = rnti; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 1; // CRNTI : see Table 4-10 from SCF082 - nFAPI specifications + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power + + AssertFatal((cc[CC_id].mib->message.dl_Bandwidth >= 0) + && (cc[CC_id].mib->message.dl_Bandwidth < 6), + "illegal dl_Bandwidth %d\n", + (int) cc[CC_id].mib->message.dl_Bandwidth); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + resource_block_coding = + pdcch_order_table[cc[CC_id].mib->message.dl_Bandwidth]; + DL_req[CC_id].dl_config_request_body.number_dci++; + DL_req[CC_id].dl_config_request_body.number_pdu++; + DL_req[CC_id].dl_config_request_body.tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + LOG_I(MAC, + "UE %d rnti %x: sending PDCCH order for RAPROC (failure timer %d), resource_block_coding %d \n", + UE_id, rnti, + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer, + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.resource_block_coding); + } else { // ra_pdcch_sent==1 + LOG_I(MAC, + "UE %d rnti %x: sent PDCCH order for RAPROC waiting (failure timer %d) \n", + UE_id, rnti, + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer); + if ((UE_list->UE_sched_ctrl[UE_id].ul_failure_timer % 40) == 0) + UE_list->UE_sched_ctrl[UE_id].ra_pdcch_order_sent = 0; // resend every 4 frames + } + + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer++; + // check threshold + if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer > 20000) { + // inform RRC of failure and clear timer + LOG_I(MAC, + "UE %d rnti %x: UL Failure after repeated PDCCH orders: Triggering RRC \n", + UE_id, rnti); + mac_eNB_rrc_ul_failure(module_idP, CC_id, frameP, subframeP, + rnti); + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0; + UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 1; + } + } // ul_failure_timer>0 + + UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer++; + if(UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer > (U_PLANE_INACTIVITY_VALUE*subframe_num(&RC.eNB[module_idP][CC_id]->frame_parms))){ + LOG_D(MAC,"UE %d rnti %x: U-Plane Failure after repeated PDCCH orders: Triggering RRC \n",UE_id,rnti); + mac_eNB_rrc_uplane_failure(module_idP,CC_id,frameP,subframeP,rnti); + UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer = 0; + }// time > 60s +} + +void +clear_nfapi_information(eNB_MAC_INST * eNB, int CC_idP, + frame_t frameP, sub_frame_t subframeP) +{ + nfapi_dl_config_request_t *DL_req = &eNB->DL_req[0]; + nfapi_ul_config_request_t *UL_req = &eNB->UL_req[0]; + nfapi_hi_dci0_request_t *HI_DCI0_req = &eNB->HI_DCI0_req[0]; + nfapi_tx_request_t *TX_req = &eNB->TX_req[0]; + + eNB->pdu_index[CC_idP] = 0; + + if (nfapi_mode==0 || nfapi_mode == 1) { // monolithic or PNF + + DL_req[CC_idP].dl_config_request_body.number_pdcch_ofdm_symbols = 1; + DL_req[CC_idP].dl_config_request_body.number_dci = 0; + DL_req[CC_idP].dl_config_request_body.number_pdu = 0; + DL_req[CC_idP].dl_config_request_body.number_pdsch_rnti = 0; + DL_req[CC_idP].dl_config_request_body.transmission_power_pcfich = 6000; + + HI_DCI0_req[CC_idP].hi_dci0_request_body.sfnsf = subframeP + (frameP<<4); + HI_DCI0_req[CC_idP].hi_dci0_request_body.number_of_dci = 0; + UL_req[CC_idP].ul_config_request_body.number_of_pdus = 0; + UL_req[CC_idP].ul_config_request_body.rach_prach_frequency_resources = 0; // ignored, handled by PHY for now + UL_req[CC_idP].ul_config_request_body.srs_present = 0; // ignored, handled by PHY for now + + TX_req[CC_idP].tx_request_body.number_of_pdus = 0; + + } +} + +void +copy_ulreq(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) +{ + int CC_id; + eNB_MAC_INST *mac = RC.mac[module_idP]; + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + + nfapi_ul_config_request_t *ul_req_tmp = &mac->UL_req_tmp[CC_id][subframeP]; + nfapi_ul_config_request_t *ul_req = &mac->UL_req[CC_id]; + nfapi_ul_config_request_pdu_t *ul_req_pdu = ul_req->ul_config_request_body.ul_config_pdu_list; + + *ul_req = *ul_req_tmp; + + // Restore the pointer + ul_req->ul_config_request_body.ul_config_pdu_list = ul_req_pdu; + + ul_req->sfn_sf = (frameP<<4) + subframeP; + + ul_req_tmp->ul_config_request_body.number_of_pdus = 0; + + if (ul_req->ul_config_request_body.number_of_pdus>0) + { + LOG_D(PHY, "%s() active NOW (frameP:%d subframeP:%d) pdus:%d\n", __FUNCTION__, frameP, subframeP, ul_req->ul_config_request_body.number_of_pdus); + } + + memcpy((void*)ul_req->ul_config_request_body.ul_config_pdu_list, + (void*)ul_req_tmp->ul_config_request_body.ul_config_pdu_list, + ul_req->ul_config_request_body.number_of_pdus*sizeof(nfapi_ul_config_request_pdu_t)); + } +} + +void +eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP, + sub_frame_t subframeP) +{ + + int mbsfn_status[MAX_NUM_CCs]; + protocol_ctxt_t ctxt; + + int CC_id, i; //,next_i; + UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; + rnti_t rnti; + + COMMON_channels_t *cc = RC.mac[module_idP]->common_channels; + +#if defined(FLEXRAN_AGENT_SB_IF) + Protocol__FlexranMessage *msg; +#endif + + + start_meas(&RC.mac[module_idP]->eNB_scheduler); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER, + VCD_FUNCTION_IN); + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + mbsfn_status[CC_id] = 0; + + // clear vrb_maps + memset(cc[CC_id].vrb_map, 0, 100); + memset(cc[CC_id].vrb_map_UL, 0, 100); + + +#if defined(Rel10) || defined(Rel14) + cc[CC_id].mcch_active = 0; +#endif + RC.mac[module_idP]->frame = frameP; + RC.mac[module_idP]->subframe = subframeP; + + clear_nfapi_information(RC.mac[module_idP], CC_id, frameP, + subframeP); + } + + // refresh UE list based on UEs dropped by PHY in previous subframe + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (UE_list->active[i] != TRUE) + continue; + + rnti = UE_RNTI(module_idP, i); + CC_id = UE_PCCID(module_idP, i); + + if ((frameP == 0) && (subframeP == 0)) { + LOG_I(MAC, + "UE rnti %x : %s, PHR %d dB DL CQI %d PUSCH SNR %d PUCCH SNR %d\n", + rnti, + UE_list->UE_sched_ctrl[i].ul_out_of_sync == + 0 ? "in synch" : "out of sync", + UE_list->UE_template[CC_id][i].phr_info, + UE_list->UE_sched_ctrl[i].dl_cqi[CC_id], + (UE_list->UE_sched_ctrl[i].pusch_snr[CC_id] - 128) / 2, + (UE_list->UE_sched_ctrl[i].pucch1_snr[CC_id] - 128) / 2); + } + + RC.eNB[module_idP][CC_id]->pusch_stats_bsr[i][(frameP * 10) + + subframeP] = -63; + if (i == UE_list->head) + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME + (VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR, + RC.eNB[module_idP][CC_id]-> + pusch_stats_bsr[i][(frameP * 10) + subframeP]); + // increment this, it is cleared when we receive an sdu + RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ul_inactivity_timer++; + + RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].cqi_req_timer++; + LOG_D(MAC, "UE %d/%x : ul_inactivity %d, cqi_req %d\n", i, rnti, + RC.mac[module_idP]->UE_list.UE_sched_ctrl[i]. + ul_inactivity_timer, + RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].cqi_req_timer); + check_ul_failure(module_idP, CC_id, i, frameP, subframeP); + + if (RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer > 0) { + RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer++; + if(RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer >= + RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer_thres) { + RC.mac[module_idP]->UE_list.UE_sched_ctrl[i].ue_reestablishment_reject_timer = 0; + for (int ue_id_l = 0; ue_id_l < NUMBER_OF_UE_MAX; ue_id_l++) { + if (reestablish_rnti_map[ue_id_l][0] == rnti) { + // clear currentC-RNTI from map + reestablish_rnti_map[ue_id_l][0] = 0; + reestablish_rnti_map[ue_id_l][1] = 0; + break; + } + } + for (int ii=0; iiulsch[ii]; + if((ulsch != NULL) && (ulsch->rnti == rnti)){ + LOG_I(MAC, "clean_eNb_ulsch UE %x \n", rnti); + clean_eNb_ulsch(ulsch); + } + } + for (int ii=0; iidlsch[ii][0]; + if((dlsch != NULL) && (dlsch->rnti == rnti)){ + LOG_I(MAC, "clean_eNb_dlsch UE %x \n", rnti); + clean_eNb_dlsch(dlsch); + } + } + + for(int j = 0; j < 10; j++){ + nfapi_ul_config_request_body_t *ul_req_tmp = NULL; + ul_req_tmp = &RC.mac[module_idP]->UL_req_tmp[CC_id][j].ul_config_request_body; + if(ul_req_tmp){ + int pdu_number = ul_req_tmp->number_of_pdus; + for(int pdu_index = pdu_number-1; pdu_index >= 0; pdu_index--){ + if(ul_req_tmp->ul_config_pdu_list[pdu_index].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti){ + LOG_I(MAC, "remove UE %x from ul_config_pdu_list %d/%d\n", rnti, pdu_index, pdu_number); + if(pdu_index < pdu_number -1){ + memcpy(&ul_req_tmp->ul_config_pdu_list[pdu_index], &ul_req_tmp->ul_config_pdu_list[pdu_index+1], (pdu_number-1-pdu_index) * sizeof(nfapi_ul_config_request_pdu_t)); + } + ul_req_tmp->number_of_pdus--; + } + } + } + } + rrc_mac_remove_ue(module_idP,rnti); + } + } + + } + + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, + NOT_A_RNTI, frameP, subframeP, + module_idP); + pdcp_run(&ctxt); + + rrc_rx_tx(&ctxt, CC_id); + +#if defined(Rel10) || defined(Rel14) + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + if (cc[CC_id].MBMS_flag > 0) { + start_meas(&RC.mac[module_idP]->schedule_mch); + mbsfn_status[CC_id] = + schedule_MBMS(module_idP, CC_id, frameP, subframeP); + stop_meas(&RC.mac[module_idP]->schedule_mch); + } + } + +#endif + + // This schedules MIB + if ((subframeP == 0) && (frameP & 3) == 0) + schedule_mib(module_idP, frameP, subframeP); + // This schedules SI for legacy LTE and eMTC starting in subframeP + schedule_SI(module_idP, frameP, subframeP); + // This schedules Paging in subframeP + schedule_PCH(module_idP,frameP,subframeP); + // This schedules Random-Access for legacy LTE and eMTC starting in subframeP + schedule_RA(module_idP, frameP, subframeP); + // copy previously scheduled UL resources (ULSCH + HARQ) + copy_ulreq(module_idP, frameP, subframeP); + // This schedules SRS in subframeP + schedule_SRS(module_idP, frameP, subframeP); + // This schedules ULSCH in subframeP (dci0) + schedule_ulsch(module_idP, frameP, subframeP); + // This schedules UCI_SR in subframeP + schedule_SR(module_idP, frameP, subframeP); + // This schedules UCI_CSI in subframeP + schedule_CSI(module_idP, frameP, subframeP); + + // This schedules DLSCH in subframeP + schedule_ue_spec(module_idP, frameP, subframeP, mbsfn_status); + + // Allocate CCEs for good after scheduling is done + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) + allocate_CCEs(module_idP, CC_id, subframeP, 0); + + + stop_meas(&RC.mac[module_idP]->eNB_scheduler); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER, + VCD_FUNCTION_OUT); +} diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c index c3a2aea0a5..4bf96d3bce 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file eNB_scheduler_RA.c * \brief primitives used for random access @@ -37,6 +29,9 @@ */ +/* indented with: indent -kr eNB_scheduler_RA.c */ + + #include "assertions.h" #include "platform_types.h" #include "PHY/defs.h" @@ -63,729 +58,1727 @@ #include "pdcp.h" #if defined(ENABLE_ITTI) -# include "intertask_interface.h" +#include "intertask_interface.h" #endif -#include "SIMULATION/TOOLS/defs.h" // for taus +#include "SIMULATION/TOOLS/defs.h" // for taus #include "T.h" -void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,unsigned char Msg3_subframe) +extern uint8_t nfapi_mode; +extern int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req); + +void add_subframe(uint16_t *frameP, uint16_t *subframeP, int offset) +{ + *frameP = (*frameP + ((*subframeP + offset) / 10)) % 1024; + + *subframeP = ((*subframeP + offset) % 10); +} + +uint16_t sfnsf_add_subframe(uint16_t frameP, uint16_t subframeP, int offset) +{ + add_subframe(&frameP, &subframeP, offset); + return frameP<<4|subframeP; +} + +void subtract_subframe(uint16_t *frameP, uint16_t *subframeP, int offset) +{ + if (*subframeP < offset) + { + *frameP = (*frameP+1024-1)%1024; + } + *subframeP = (*subframeP+10-offset)%10; +} + +uint16_t sfnsf_subtract_subframe(uint16_t frameP, uint16_t subframeP, int offset) +{ + subtract_subframe(&frameP, &subframeP, offset); + return frameP<<4|subframeP; +} + +void +add_msg3(module_id_t module_idP, int CC_id, RA_t * ra, frame_t frameP, + sub_frame_t subframeP) +{ + eNB_MAC_INST *mac = RC.mac[module_idP]; + COMMON_channels_t *cc = &mac->common_channels[CC_id]; + uint8_t j; + nfapi_ul_config_request_t *ul_req; + nfapi_ul_config_request_body_t *ul_req_body; + nfapi_ul_config_request_pdu_t *ul_config_pdu; + nfapi_hi_dci0_request_t *hi_dci0_req = &mac->HI_DCI0_req[CC_id]; + nfapi_hi_dci0_request_body_t *hi_dci0_req_body = &hi_dci0_req->hi_dci0_request_body; + nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu; + + uint8_t rvseq[4] = { 0, 2, 3, 1 }; + + + ul_req = &mac->UL_req_tmp[CC_id][ra->Msg3_subframe]; + ul_req_body = &ul_req->ul_config_request_body; + AssertFatal(ra->state != IDLE, "RA is not active for RA %X\n", + ra->rnti); + +#ifdef Rel14 + if (ra->rach_resource_type > 0) { + LOG_D(MAC, + "[eNB %d][RAPROC] Frame %d, Subframe %d : CC_id %d CE level %d is active, Msg3 in (%d,%d)\n", + module_idP, frameP, subframeP, CC_id, + ra->rach_resource_type - 1, ra->Msg3_frame, + ra->Msg3_subframe); + LOG_D(MAC, + "Frame %d, Subframe %d Adding Msg3 UL Config Request for (%d,%d) : (%d,%d)\n", + frameP, subframeP, ra->Msg3_frame, ra->Msg3_subframe, + ra->msg3_nb_rb, ra->msg3_round); + + ul_config_pdu = + &ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus]; + + memset((void *) ul_config_pdu, 0, + sizeof(nfapi_ul_config_request_pdu_t)); + ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_ULSCH_PDU_TYPE; + ul_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_ul_config_ulsch_pdu)); + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.handle = mac->ul_handle++; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.rnti = ra->rnti; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.resource_block_start = + narrowband_to_first_rb(cc, + ra->msg34_narrowband) + + ra->msg3_first_rb; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.number_of_resource_blocks = + ra->msg3_nb_rb; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.modulation_type = 2; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.cyclic_shift_2_for_drms = + 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8. + frequency_hopping_enabled_flag = 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.frequency_hopping_bits = 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.new_data_indication = 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.redundancy_version = + rvseq[ra->msg3_round]; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.harq_process_number = + ((10 * ra->Msg3_frame) + ra->Msg3_subframe) & 7; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.ul_tx_mode = 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.current_tx_nb = 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.n_srs = 1; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.size = + get_TBS_UL(ra->msg3_mcs, ra->msg3_nb_rb); + // Re13 fields + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.ue_type = + ra->rach_resource_type > 2 ? 2 : 1; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13. + total_number_of_repetitions = 1; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.repetition_number = 1; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13. + initial_transmission_sf_io = + (ra->Msg3_frame * 10) + ra->Msg3_subframe; + ul_req_body->number_of_pdus++; + ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + ul_req->sfn_sf = ra->Msg3_frame<<4|ra->Msg3_subframe; + ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST; + } // if (ra->rach_resource_type>0) { + else +#endif + { + LOG_D(MAC, + "[eNB %d][RAPROC] Frame %d, Subframe %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", + module_idP, frameP, subframeP, CC_id, ra->Msg3_frame, + ra->Msg3_subframe); + + LOG_D(MAC, + "Frame %d, Subframe %d Adding Msg3 UL Config Request for (%d,%d) : (%d,%d,%d)\n", + frameP, subframeP, ra->Msg3_frame, ra->Msg3_subframe, + ra->msg3_nb_rb, ra->msg3_first_rb, ra->msg3_round); + + ul_config_pdu = + &ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus]; + + memset((void *) ul_config_pdu, 0, + sizeof(nfapi_ul_config_request_pdu_t)); + ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_ULSCH_PDU_TYPE; + ul_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_ul_config_ulsch_pdu)); + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.handle = mac->ul_handle++; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.rnti = ra->rnti; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.resource_block_start = + ra->msg3_first_rb; + AssertFatal(ra->msg3_nb_rb > 0, "nb_rb = 0\n"); + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.number_of_resource_blocks = + ra->msg3_nb_rb; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.modulation_type = 2; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.cyclic_shift_2_for_drms = + 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8. + frequency_hopping_enabled_flag = 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.frequency_hopping_bits = 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.new_data_indication = 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.redundancy_version = + rvseq[ra->msg3_round]; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.harq_process_number = + subframe2harqpid(cc, ra->Msg3_frame, ra->Msg3_subframe); + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.ul_tx_mode = 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.current_tx_nb = 0; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.n_srs = 1; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.size = + get_TBS_UL(10, ra->msg3_nb_rb); + ul_req_body->number_of_pdus++; + ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + ul_req->sfn_sf = ra->Msg3_frame<<4|ra->Msg3_subframe; + ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST; + // save UL scheduling information for preprocessor + for (j = 0; j < ra->msg3_nb_rb; j++) + cc->vrb_map_UL[ra->msg3_first_rb + j] = 1; + + LOG_D(MAC, "MSG3: UL_CONFIG SFN/SF:%d number_of_pdus:%d ra->msg3_round:%d\n", NFAPI_SFNSF2DEC(ul_req->sfn_sf), ul_req_body->number_of_pdus, ra->msg3_round); + + if (ra->msg3_round != 0) { // program HI too + hi_dci0_pdu = &hi_dci0_req_body->hi_dci0_pdu_list[hi_dci0_req_body->number_of_dci + hi_dci0_req_body->number_of_hi]; + memset((void *) hi_dci0_pdu, 0, + sizeof(nfapi_hi_dci0_request_pdu_t)); + hi_dci0_pdu->pdu_type = NFAPI_HI_DCI0_HI_PDU_TYPE; + hi_dci0_pdu->pdu_size = 2 + sizeof(nfapi_hi_dci0_hi_pdu); + hi_dci0_pdu->hi_pdu.hi_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG; + hi_dci0_pdu->hi_pdu.hi_pdu_rel8.resource_block_start = + ra->msg3_first_rb; + hi_dci0_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms = 0; + hi_dci0_pdu->hi_pdu.hi_pdu_rel8.hi_value = 0; + hi_dci0_req_body->number_of_hi++; + + hi_dci0_req_body->sfnsf = sfnsf_add_subframe(ra->Msg3_frame, ra->Msg3_subframe, 0); + hi_dci0_req_body->tl.tag = NFAPI_HI_DCI0_REQUEST_BODY_TAG; + + hi_dci0_req->sfn_sf = sfnsf_add_subframe(ra->Msg3_frame, ra->Msg3_subframe, 4); + hi_dci0_req->header.message_id = NFAPI_HI_DCI0_REQUEST; + + if (nfapi_mode) { + oai_nfapi_hi_dci0_req(hi_dci0_req); + hi_dci0_req_body->number_of_hi=0; + } + + LOG_D(MAC, "MSG3: HI_DCI0 SFN/SF:%d number_of_dci:%d number_of_hi:%d\n", NFAPI_SFNSF2DEC(hi_dci0_req->sfn_sf), hi_dci0_req_body->number_of_dci, hi_dci0_req_body->number_of_hi); + + // save UL scheduling information for preprocessor + for (j = 0; j < ra->msg3_nb_rb; j++) + cc->vrb_map_UL[ra->msg3_first_rb + j] = 1; + + LOG_D(MAC, + "[eNB %d][PUSCH-RA %x] CC_id %d Frame %d subframeP %d Scheduled (PHICH) RA (mcs %d, first rb %d, nb_rb %d,round %d)\n", + module_idP, ra->rnti, CC_id, frameP, subframeP, 10, 1, 1, + ra->msg3_round - 1); + } // if (ra->msg3_round != 0) { // program HI too + } // non-BL/CE UE case +} + +void +generate_Msg2(module_id_t module_idP, int CC_idP, frame_t frameP, + sub_frame_t subframeP, RA_t * ra) { - int CC_id; - eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP]; + eNB_MAC_INST *mac = RC.mac[module_idP]; + COMMON_channels_t *cc = mac->common_channels; + + uint8_t *vrb_map; + int first_rb; + int N_RB_DL; + nfapi_dl_config_request_pdu_t *dl_config_pdu; + nfapi_tx_request_pdu_t *TX_req; + nfapi_dl_config_request_body_t *dl_req; + + vrb_map = cc[CC_idP].vrb_map; + dl_req = &mac->DL_req[CC_idP].dl_config_request_body; + dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + N_RB_DL = to_prb(cc[CC_idP].mib->message.dl_Bandwidth); + +#ifdef Rel14 + int rmax = 0; + int rep = 0; + int reps = 0; + int num_nb = 0; + + first_rb = 0; + struct PRACH_ConfigSIB_v1310 *ext4_prach; + PRACH_ParametersListCE_r13_t *prach_ParametersListCE_r13; + PRACH_ParametersCE_r13_t *p[4] = { NULL, NULL, NULL, NULL }; + + uint16_t absSF = (10 * frameP) + subframeP; + uint16_t absSF_Msg2 = (10 * ra->Msg2_frame) + ra->Msg2_subframe; + + LOG_D(MAC,"absSF:%d absSF_Msg2:%d ra->rach_resource_type:%d\n",absSF,absSF_Msg2,ra->rach_resource_type); + + if (absSF > absSF_Msg2) + return; // we're not ready yet, need to be to start == + + if (cc[CC_idP].radioResourceConfigCommon_BR) { + + ext4_prach = + cc[CC_idP].radioResourceConfigCommon_BR->ext4-> + prach_ConfigCommon_v1310; + prach_ParametersListCE_r13 = + &ext4_prach->prach_ParametersListCE_r13; + + switch (prach_ParametersListCE_r13->list.count) { + case 4: + p[3] = prach_ParametersListCE_r13->list.array[3]; + case 3: + p[2] = prach_ParametersListCE_r13->list.array[2]; + case 2: + p[1] = prach_ParametersListCE_r13->list.array[1]; + case 1: + p[0] = prach_ParametersListCE_r13->list.array[0]; + break; + default: + AssertFatal(1 == 0, + "Illegal count for prach_ParametersListCE_r13 %d\n", + (int) prach_ParametersListCE_r13->list.count); + break; + } + } + + if (ra->rach_resource_type > 0) { + + // This uses an MPDCCH Type 2 common allocation according to Section 9.1.5 36-213 + // Parameters: + // p=2+4 PRB set (number of PRB pairs 3) + // rmax = mpdcch-NumRepetition-RA-r13 => Table 9.1.5-3 + // if CELevel = 0,1 => Table 9.1.5-1b for MPDCCH candidates + // if CELevel = 2,3 => Table 9.1.5-2b for MPDCCH candidates + // distributed transmission + + // rmax from SIB2 information + AssertFatal(rmax < 9, "rmax>8!\n"); + rmax = + 1 << p[ra->rach_resource_type - + 1]->mpdcch_NumRepetition_RA_r13; + // choose r1 by default for RAR (Table 9.1.5-5) + rep = 0; + // get actual repetition count from Table 9.1.5-3 + reps = (rmax <= 8) ? (1 << rep) : (rmax >> (3 - rep)); + // get narrowband according to higher-layer config + num_nb = + p[ra->rach_resource_type - + 1]->mpdcch_NarrowbandsToMonitor_r13.list.count; + ra->msg2_narrowband = + *p[ra->rach_resource_type - + 1]->mpdcch_NarrowbandsToMonitor_r13.list.array[ra-> + preamble_index + % num_nb]; + first_rb = + narrowband_to_first_rb(&cc[CC_idP], ra->msg2_narrowband); + + if ((ra->msg2_mpdcch_repetition_cnt == 0) && + (mpdcch_sf_condition + (mac, CC_idP, frameP, subframeP, rmax, TYPE2, -1) > 0)) { + // MPDCCH configuration for RAR + LOG_D(MAC, + "[eNB %d][RAPROC] Frame %d, Subframe %d : In generate_Msg2, Programming MPDCCH %d repetitions\n", + module_idP, frameP, subframeP, reps); - RA_TEMPLATE *RA_template; - unsigned char i,harq_pid,round; - int16_t rrc_sdu_length; - unsigned char lcid,offset; - module_id_t UE_id= UE_INDEX_INVALID; - unsigned short TBsize = -1; - unsigned short msg4_padding,msg4_post_padding,msg4_header; - uint8_t *vrb_map; - int first_rb; - int rballoc[MAX_NUM_CCs]; - DCI_PDU *DCI_pdu; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_mpdcch_pdu)); + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.dci_format = + (ra->rach_resource_type > 1) ? 11 : 10; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.mpdcch_narrow_band = + ra->msg2_narrowband; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + number_of_prb_pairs = 6; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.resource_block_assignment = 0; // Note: this can be dynamic + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.mpdcch_tansmission_type = 1; // imposed (9.1.5 in 213) for Type 2 Common search space + AssertFatal(cc[CC_idP]. + sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13 + != NULL, + "cc[CC_id].sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13 is null\n"); + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.start_symbol = + cc[CC_idP].sib1_v13ext-> + bandwidthReducedAccessRelatedInfo_r13->startSymbolBR_r13; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.ecce_index = 0; // Note: this should be dynamic + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.aggregation_level = 16; // OK for CEModeA r1-3 (9.1.5-1b) or CEModeB r1-4 + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.rnti_type = 2; // RA-RNTI + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.rnti = ra->RA_rnti; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.ce_mode = + (ra->rach_resource_type < 3) ? 1 : 2; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + drms_scrambling_init = cc[CC_idP].physCellId; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + initial_transmission_sf_io = (frameP * 10) + subframeP; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.transmission_power = 6000; // 0dB + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.resource_block_coding = getRIV(6, 0, 6); // Note: still to be checked if it should not be (getRIV(N_RB_DL,first_rb,6)) : Check nFAPI specifications and what is done L1 with this parameter + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.mcs = 4; // adjust according to size of RAR, 208 bits with N1A_PRB=3 + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.pdsch_reptition_levels = 4; // fix to 4 for now + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.redundancy_version = + 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.new_data_indicator = + 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.harq_process = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.tpmi_length = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.tpmi = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.pmi_flag = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.pmi = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + harq_resource_offset = 0; + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.dci_subframe_repetition_number = rep; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.tpc = 1; // N1A_PRB=3 (36.212); => 208 bits for mcs=4, choose mcs according t message size TBD + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.downlink_assignment_index_length = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + downlink_assignment_index = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + allocate_prach_flag = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.preamble_index = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.prach_mask_index = + 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.starting_ce_level = + 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.srs_request = 0; + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.antenna_ports_and_scrambling_identity_flag + = 0; + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.antenna_ports_and_scrambling_identity = 0; + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.frequency_hopping_enabled_flag = 0; + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.paging_direct_indication_differentiation_flag + = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.direct_indication = + 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.total_dci_length_including_padding = 0; // this is not needed by OAI L1, but should be filled in + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + number_of_tx_antenna_ports = 1; + ra->msg2_mpdcch_repetition_cnt++; + dl_req->number_pdu++; + dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + ra->Msg2_subframe = (ra->Msg2_subframe + 9) % 10; - start_meas(&eNB->schedule_ra); + mac->DL_req[CC_idP].sfn_sf = sfnsf_add_subframe(ra->Msg2_frame, ra->Msg2_subframe, 4); // nFAPI is runnning at TX SFN/SF - ie 4 ahead + mac->DL_req[CC_idP].header.message_id = NFAPI_DL_CONFIG_REQUEST; + } //repetition_count==0 && SF condition met + if (ra->msg2_mpdcch_repetition_cnt > 0) { // we're in a stream of repetitions + LOG_D(MAC, + "[eNB %d][RAPROC] Frame %d, Subframe %d : In generate_Msg2, MPDCCH repetition %d\n", + module_idP, frameP, subframeP, + ra->msg2_mpdcch_repetition_cnt); - for (CC_id=0; CC_idmsg2_mpdcch_repetition_cnt == reps) { // this is the last mpdcch repetition + if (cc[CC_idP].tdd_Config == NULL) { // FDD case + // wait 2 subframes for PDSCH transmission + if (subframeP > 7) + ra->Msg2_frame = (frameP + 1) & 1023; + else + ra->Msg2_frame = frameP; + ra->Msg2_subframe = (subframeP + 2) % 10; // +2 is the "n+x" from Section 7.1.11 in 36.213 + } else { + AssertFatal(1 == 0, "TDD case not done yet\n"); + } + } // mpdcch_repetition_count == reps + ra->msg2_mpdcch_repetition_cnt++; + if ((ra->Msg2_frame == frameP) + && (ra->Msg2_subframe == subframeP)) { + // Program PDSCH + LOG_D(MAC, + "[eNB %d][RAPROC] Frame %d, Subframe %d : In generate_Msg2, Programming PDSCH\n", + module_idP, frameP, subframeP); + ra->state = WAITMSG3; + LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, Subframe %d: state:WAITMSG3\n", module_idP, frameP, subframeP); - vrb_map = eNB->common_channels[CC_id].vrb_map; - DCI_pdu = &eNB->common_channels[CC_id].DCI_pdu; + dl_config_pdu = + &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_dlsch_pdu)); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index = + mac->pdu_index[CC_idP]; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti = ra->RA_rnti; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + resource_allocation_type = 2; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.virtual_resource_block_assignment_flag = 0; // localized + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + resource_block_coding = getRIV(N_RB_DL, first_rb, 6); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.modulation = 2; //QPSK + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + redundancy_version = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = 1; // first block + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.transport_block_to_codeword_swap_flag = + 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + transmission_scheme = (cc->p_eNB == 1) ? 0 : 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.number_of_layers = + 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + number_of_subbands = 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.codebook_index = ; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + ue_category_capacity = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pa = 4; // 0 dB + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + delta_power_offset_index = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ngap = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.nprb = get_subbandsize(cc->mib->message.dl_Bandwidth); // ignored + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_mode = + (cc->p_eNB == 1) ? 1 : 2; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + num_bf_prb_per_subband = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_vector = 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.bf_vector = ; - for (i=0; idlsch_pdu.dlsch_pdu_rel10.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10.pdsch_start = + cc[CC_idP]. + sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13-> + startSymbolBR_r13; + // Rel13 fields + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.ue_type = + (ra->rach_resource_type < 3) ? 1 : 2;; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.pdsch_payload_type = 2; // not SI message + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13. + initial_transmission_sf_io = (10 * frameP) + subframeP; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.drms_table_flag = + 0; + dl_req->number_pdu++; - RA_template = (RA_TEMPLATE *)&eNB->common_channels[CC_id].RA_template[i]; + mac->DL_req[CC_idP].sfn_sf = (frameP<<4)+subframeP; + mac->DL_req[CC_idP].header.message_id = NFAPI_DL_CONFIG_REQUEST; - if (RA_template->RA_active == TRUE) { + LOG_D(MAC,"DL_CONFIG SFN/SF:%d/%d MESSAGE2\n", frameP, subframeP); - LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d RA %d is active (generate RAR %d, generate_Msg4 %d, wait_ack_Msg4 %d, rnti %x)\n", - module_idP,CC_id,i,RA_template->generate_rar,RA_template->generate_Msg4,RA_template->wait_ack_Msg4, RA_template->rnti); - - if (RA_template->generate_rar == 1) { - - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframeP %d: Generating RAR DCI (proc %d), RA_active %d format 1A (%d,%d))\n", - module_idP, CC_id, frameP, subframeP,i, - RA_template->RA_active, - RA_template->RA_dci_fmt1, - RA_template->RA_dci_size_bits1); - - - - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); - break; - - case 25: - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); - break; - - case 50: - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); - break; - - case 100: - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); - break; - - default: - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->type=1; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rv=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); - break; - } - } else { - switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); - break; - - case 25: - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); - break; - - case 50: - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); - break; - - case 100: - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->type=1; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type=0; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->ndi=1; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rv=0; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->mcs=0; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->harq_pid=0; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->TPC=1; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->padding=0; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->vrb_type, - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu1[0])->rballoc); - break; - - default: - break; - } - } - - if (!CCE_allocation_infeasible(module_idP,CC_id,1,subframeP,2,RA_template->RA_rnti)) { - LOG_D(MAC,"Frame %d: Subframe %d : Adding common DCI for RA_RNTI %x\n", - frameP,subframeP,RA_template->RA_rnti); - add_common_dci(DCI_pdu, - (void*)&RA_template->RA_alloc_pdu1[0], - RA_template->RA_rnti, - RA_template->RA_dci_size_bytes1, - 2, - RA_template->RA_dci_size_bits1, - RA_template->RA_dci_fmt1, - 1); - - RA_template->Msg3_subframe=Msg3_subframe; - } - } else if (RA_template->generate_Msg4 == 1) { - - // check for Msg4 Message - UE_id = find_UE_id(module_idP,RA_template->rnti); - - if (Is_rrc_registered == 1) { - - // Get RRCConnectionSetup for Piggyback - rrc_sdu_length = mac_rrc_data_req(module_idP, - CC_id, - frameP, - CCCH, - 1, // 1 transport block - &eNB->common_channels[CC_id].CCCH_pdu.payload[0], - ENB_FLAG_YES, - module_idP, - 0); // not used in this case - - if (rrc_sdu_length == -1) { - mac_xface->macphy_exit("[MAC][eNB Scheduler] CCCH not allocated\n"); - return; // not reached - } else { - //msg("[MAC][eNB %d] Frame %d, subframeP %d: got %d bytes from RRC\n",module_idP,frameP, subframeP,rrc_sdu_length); - } - } - - LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: UE_id %d, Is_rrc_registered %d, rrc_sdu_length %d\n", - module_idP, CC_id, frameP, subframeP,UE_id, Is_rrc_registered,rrc_sdu_length); - - if (rrc_sdu_length>0) { - LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Generating Msg4 with RRC Piggyback (RA proc %d, RNTI %x)\n", - module_idP, CC_id, frameP, subframeP,i,RA_template->rnti); - - //msg("[MAC][eNB %d][RAPROC] Frame %d, subframeP %d: Received %d bytes for Msg4: \n",module_idP,frameP,subframeP,rrc_sdu_length); - // for (j=0;jlte_frame_parms.N_RB_DL-4)); - - if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1)) - break; + // Program UL processing for Msg3, same as regular LTE + get_Msg3alloc(&cc[CC_idP], subframeP, frameP, + &ra->Msg3_frame, &ra->Msg3_subframe); + add_msg3(module_idP, CC_idP, ra, frameP, subframeP); + fill_rar_br(mac, CC_idP, ra, frameP, subframeP, + cc[CC_idP].RAR_pdu.payload, + ra->rach_resource_type - 1); + // DL request + mac->TX_req[CC_idP].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + mac->TX_req[CC_idP].header.message_id = NFAPI_TX_REQUEST; + mac->TX_req[CC_idP].sfn_sf = (frameP << 4) + subframeP; + TX_req = + &mac->TX_req[CC_idP].tx_request_body.tx_pdu_list[mac-> + TX_req + [CC_idP]. + tx_request_body.number_of_pdus]; + TX_req->pdu_length = 7; // This should be changed if we have more than 1 preamble + TX_req->pdu_index = mac->pdu_index[CC_idP]++; + TX_req->num_segments = 1; + TX_req->segments[0].segment_length = 7; + TX_req->segments[0].segment_data = + cc[CC_idP].RAR_pdu.payload; + mac->TX_req[CC_idP].tx_request_body.number_of_pdus++; } - */ - first_rb=0; + } + + } else +#endif + { + + if ((ra->Msg2_frame == frameP) && (ra->Msg2_subframe == subframeP)) { + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d, subframeP %d: Generating RAR DCI, state %d\n", + module_idP, CC_idP, frameP, subframeP, ra->state); + + // Allocate 4 PRBS starting in RB 0 + first_rb = 0; + vrb_map[first_rb] = 1; + vrb_map[first_rb + 1] = 1; + vrb_map[first_rb + 2] = 1; + vrb_map[first_rb + 3] = 1; + + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = + NFAPI_DL_DCI_FORMAT_1A; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = + 4; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = ra->RA_rnti; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 2; // RA-RNTI : see Table 4-10 from SCF082 - nFAPI specifications + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power + + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = 0; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = 1; // no TPC + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + new_data_indicator_1 = 1; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = 0; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + redundancy_version_1 = 0; + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.virtual_resource_block_assignment_flag = 0; + + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + resource_block_coding = getRIV(N_RB_DL, first_rb, 4); + + // This checks if the above DCI allocation is feasible in current subframe + if (!CCE_allocation_infeasible + (module_idP, CC_idP, 0, subframeP, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + aggregation_level, ra->RA_rnti)) { + LOG_D(MAC, + "Frame %d: Subframe %d : Adding common DCI for RA_RNTI %x\n", + frameP, subframeP, ra->RA_rnti); + dl_req->number_dci++; + dl_req->number_pdu++; + + dl_config_pdu = + &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_dlsch_pdu)); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index = + mac->pdu_index[CC_idP]; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti = ra->RA_rnti; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 2; // format 1A/1B/1D + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.virtual_resource_block_assignment_flag = 0; // localized + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + resource_block_coding = getRIV(N_RB_DL, first_rb, 4); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.modulation = 2; //QPSK + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + redundancy_version = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = 1; // first block + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.transport_block_to_codeword_swap_flag = + 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + transmission_scheme = (cc->p_eNB == 1) ? 0 : 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.number_of_layers = + 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + number_of_subbands = 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.codebook_index = ; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + ue_category_capacity = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pa = 4; // 0 dB + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + delta_power_offset_index = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ngap = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.nprb = get_subbandsize(cc->mib->message.dl_Bandwidth); // ignored + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_mode = + (cc->p_eNB == 1) ? 1 : 2; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + num_bf_prb_per_subband = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_vector = 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.bf_vector = ; + dl_req->number_pdu++; + mac->DL_req[CC_idP].sfn_sf = frameP<<4 | subframeP; + + // Program UL processing for Msg3 + get_Msg3alloc(&cc[CC_idP], subframeP, frameP, + &ra->Msg3_frame, &ra->Msg3_subframe); + + LOG_D(MAC, + "Frame %d, Subframe %d: Setting Msg3 reception for Frame %d Subframe %d\n", + frameP, subframeP, ra->Msg3_frame, + ra->Msg3_subframe); + + fill_rar(module_idP, CC_idP, ra, frameP, + cc[CC_idP].RAR_pdu.payload, N_RB_DL, 7); + add_msg3(module_idP, CC_idP, ra, frameP, subframeP); + ra->state = WAITMSG3; + LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, Subframe %d: state:WAITMSG3\n", module_idP, frameP, subframeP); + + // DL request + mac->TX_req[CC_idP].sfn_sf = (frameP << 4) + subframeP; + TX_req = + &mac->TX_req[CC_idP].tx_request_body.tx_pdu_list[mac-> + TX_req + [CC_idP]. + tx_request_body.number_of_pdus]; + TX_req->pdu_length = 7; // This should be changed if we have more than 1 preamble + TX_req->pdu_index = mac->pdu_index[CC_idP]++; + TX_req->num_segments = 1; + TX_req->segments[0].segment_length = 7; + TX_req->segments[0].segment_data = + cc[CC_idP].RAR_pdu.payload; + mac->TX_req[CC_idP].tx_request_body.number_of_pdus++; + } // PDCCH CCE allocation is feasible + } // Msg2 frame/subframe condition + } // else BL/CE +} +void +generate_Msg4(module_id_t module_idP, int CC_idP, frame_t frameP, + sub_frame_t subframeP, RA_t * ra) +{ + + + eNB_MAC_INST *mac = RC.mac[module_idP]; + COMMON_channels_t *cc = mac->common_channels; + int16_t rrc_sdu_length; + int UE_id = -1; + uint16_t msg4_padding; + uint16_t msg4_post_padding; + uint16_t msg4_header; + + uint8_t *vrb_map; + int first_rb; + int N_RB_DL; + nfapi_dl_config_request_pdu_t *dl_config_pdu; + nfapi_ul_config_request_pdu_t *ul_config_pdu; + nfapi_tx_request_pdu_t *TX_req; + UE_list_t *UE_list=&mac->UE_list; + nfapi_dl_config_request_t *dl_req; + nfapi_dl_config_request_body_t *dl_req_body; + nfapi_ul_config_request_body_t *ul_req_body; + nfapi_ul_config_request_t *ul_req; + uint8_t lcid; + uint8_t offset; + + +#ifdef Rel14 + int rmax = 0; + int rep = 0; + int reps = 0; + + + first_rb = 0; + struct PRACH_ConfigSIB_v1310 *ext4_prach; + struct PUCCH_ConfigCommon_v1310 *ext4_pucch; + PRACH_ParametersListCE_r13_t *prach_ParametersListCE_r13; + struct N1PUCCH_AN_InfoList_r13 *pucch_N1PUCCH_AN_InfoList_r13; + PRACH_ParametersCE_r13_t *p[4] = { NULL, NULL, NULL, NULL }; + int pucchreps[4] = { 1, 1, 1, 1 }; + int n1pucchan[4] = { 0, 0, 0, 0 }; + + if (cc[CC_idP].radioResourceConfigCommon_BR) { + + ext4_prach = + cc[CC_idP].radioResourceConfigCommon_BR->ext4-> + prach_ConfigCommon_v1310; + ext4_pucch = + cc[CC_idP].radioResourceConfigCommon_BR->ext4-> + pucch_ConfigCommon_v1310; + prach_ParametersListCE_r13 = + &ext4_prach->prach_ParametersListCE_r13; + pucch_N1PUCCH_AN_InfoList_r13 = + ext4_pucch->n1PUCCH_AN_InfoList_r13; + AssertFatal(prach_ParametersListCE_r13 != NULL, + "prach_ParametersListCE_r13 is null\n"); + AssertFatal(pucch_N1PUCCH_AN_InfoList_r13 != NULL, + "pucch_N1PUCCH_AN_InfoList_r13 is null\n"); + // check to verify CE-Level compatibility in SIB2_BR + AssertFatal(prach_ParametersListCE_r13->list.count == + pucch_N1PUCCH_AN_InfoList_r13->list.count, + "prach_ParametersListCE_r13->list.count!= pucch_N1PUCCH_AN_InfoList_r13->list.count\n"); + + switch (prach_ParametersListCE_r13->list.count) { + case 4: + p[3] = prach_ParametersListCE_r13->list.array[3]; + n1pucchan[3] = *pucch_N1PUCCH_AN_InfoList_r13->list.array[3]; + AssertFatal(ext4_pucch->pucch_NumRepetitionCE_Msg4_Level3_r13 + != NULL, + "pucch_NumRepetitionCE_Msg4_Level3 shouldn't be NULL\n"); + pucchreps[3] = + (int) (4 << *ext4_pucch-> + pucch_NumRepetitionCE_Msg4_Level3_r13); + + case 3: + p[2] = prach_ParametersListCE_r13->list.array[2]; + n1pucchan[2] = *pucch_N1PUCCH_AN_InfoList_r13->list.array[2]; + AssertFatal(ext4_pucch->pucch_NumRepetitionCE_Msg4_Level2_r13 + != NULL, + "pucch_NumRepetitionCE_Msg4_Level2 shouldn't be NULL\n"); + pucchreps[2] = + (int) (4 << *ext4_pucch-> + pucch_NumRepetitionCE_Msg4_Level2_r13); + case 2: + p[1] = prach_ParametersListCE_r13->list.array[1]; + n1pucchan[1] = *pucch_N1PUCCH_AN_InfoList_r13->list.array[1]; + AssertFatal(ext4_pucch->pucch_NumRepetitionCE_Msg4_Level2_r13 + != NULL, + "pucch_NumRepetitionCE_Msg4_Level1 shouldn't be NULL\n"); + pucchreps[1] = + (int) (1 << *ext4_pucch-> + pucch_NumRepetitionCE_Msg4_Level1_r13); + case 1: + p[0] = prach_ParametersListCE_r13->list.array[0]; + n1pucchan[0] = *pucch_N1PUCCH_AN_InfoList_r13->list.array[0]; + AssertFatal(ext4_pucch->pucch_NumRepetitionCE_Msg4_Level2_r13 + != NULL, + "pucch_NumRepetitionCE_Msg4_Level0 shouldn't be NULL\n"); + pucchreps[0] = + (int) (1 << *ext4_pucch-> + pucch_NumRepetitionCE_Msg4_Level0_r13); + default: + AssertFatal(1 == 0, + "Illegal count for prach_ParametersListCE_r13 %d\n", + prach_ParametersListCE_r13->list.count); + } + } +#endif + + vrb_map = cc[CC_idP].vrb_map; + + dl_req = &mac->DL_req[CC_idP]; + dl_req_body = &dl_req->dl_config_request_body; + dl_config_pdu = &dl_req_body->dl_config_pdu_list[dl_req_body->number_pdu]; + N_RB_DL = to_prb(cc[CC_idP].mib->message.dl_Bandwidth); + + UE_id = find_UE_id(module_idP, ra->rnti); + AssertFatal(UE_id >= 0, "Can't find UE for t-crnti\n"); + + // set HARQ process round to 0 for this UE + + if (cc->tdd_Config) + ra->harq_pid = ((frameP * 10) + subframeP) % 10; + else + ra->harq_pid = ((frameP * 10) + subframeP) & 7; + + // Get RRCConnectionSetup for Piggyback + rrc_sdu_length = mac_rrc_data_req(module_idP, CC_idP, frameP, CCCH, 1, // 1 transport block + &cc[CC_idP].CCCH_pdu.payload[0], 0); // not used in this case + + AssertFatal(rrc_sdu_length > 0, + "[MAC][eNB Scheduler] CCCH not allocated\n"); + + + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: UE_id %d, rrc_sdu_length %d\n", + module_idP, CC_idP, frameP, subframeP, UE_id, rrc_sdu_length); + + +#ifdef Rel14 + if (ra->rach_resource_type > 0) { + + // Generate DCI + repetitions first + // This uses an MPDCCH Type 2 allocation according to Section 9.1.5 36-213, Type2 common allocation according to Table 7.1-8 (36-213) + // Parameters: + // p=2+4 PRB set (number of PRB pairs 6) + // rmax = mpdcch-NumRepetition-RA-r13 => Table 9.1.5-3 + // if CELevel = 0,1 => Table 9.1.5-1b for MPDCCH candidates + // if CELevel = 2,3 => Table 9.1.5-2b for MPDCCH candidates + // distributed transmission + + // rmax from SIB2 information + rmax = p[ra->rach_resource_type - 1]->mpdcch_NumRepetition_RA_r13; + AssertFatal(rmax >= 4, + "choose rmax>=4 for enough repeititions, or reduce rep to 1 or 2\n"); + + // choose r3 by default for Msg4 (this is ok from table 9.1.5-3 for rmax = >=4, if we choose rmax <4 it has to be less + rep = 2; + // get actual repetition count from Table 9.1.5-3 + reps = (rmax <= 8) ? (1 << rep) : (rmax >> (3 - rep)); + // get first narrowband + first_rb = + narrowband_to_first_rb(&cc[CC_idP], ra->msg34_narrowband); + + if ((ra->msg4_mpdcch_repetition_cnt == 0) && + (mpdcch_sf_condition + (mac, CC_idP, frameP, subframeP, rmax, TYPE2, -1) > 0)) { + // MPDCCH configuration for RAR + + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_mpdcch_pdu)); + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.dci_format = + (ra->rach_resource_type > 1) ? 11 : 10; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.mpdcch_narrow_band = + ra->msg34_narrowband; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + number_of_prb_pairs = 6; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.resource_block_assignment = 0; // Note: this can be dynamic + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + mpdcch_tansmission_type = 1; + AssertFatal(cc[CC_idP]. + sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13 + != NULL, + "cc[CC_idP].sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13 is null\n"); + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.start_symbol = + cc[CC_idP].sib1_v13ext-> + bandwidthReducedAccessRelatedInfo_r13->startSymbolBR_r13; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.ecce_index = 0; // Note: this should be dynamic + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.aggregation_level = 16; // OK for CEModeA r1-3 (9.1.5-1b) or CEModeB r1-4 + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.rnti_type = 0; // t-C-RNTI + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.rnti = ra->RA_rnti; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.ce_mode = + (ra->rach_resource_type < 3) ? 1 : 2; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.drms_scrambling_init = cc[CC_idP].physCellId; /// Check this is still N_id_cell for type2 common + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + initial_transmission_sf_io = (frameP * 10) + subframeP; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.transmission_power = 6000; // 0dB + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.resource_block_coding = getRIV(6, 0, 6); // check if not getRIV(N_RB_DL,first_rb,6); + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.mcs = 4; // adjust according to size of Msg4, 208 bits with N1A_PRB=3 + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.pdsch_reptition_levels = 4; // fix to 4 for now + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.redundancy_version = + 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.new_data_indicator = + 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.harq_process = + ra->harq_pid; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.tpmi_length = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.tpmi = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.pmi_flag = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.pmi = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + harq_resource_offset = 0; + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.dci_subframe_repetition_number = rep; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.tpc = 1; // N1A_PRB=3; => 208 bits + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.downlink_assignment_index_length = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + downlink_assignment_index = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + allocate_prach_flag = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.preamble_index = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.prach_mask_index = + 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.starting_ce_level = + 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.srs_request = 0; + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.antenna_ports_and_scrambling_identity_flag + = 0; + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.antenna_ports_and_scrambling_identity = 0; + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.frequency_hopping_enabled_flag = 0; + dl_config_pdu->mpdcch_pdu. + mpdcch_pdu_rel13.paging_direct_indication_differentiation_flag + = 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.direct_indication = + 0; + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13.total_dci_length_including_padding = 0; // this is not needed by OAI L1, but should be filled in + dl_config_pdu->mpdcch_pdu.mpdcch_pdu_rel13. + number_of_tx_antenna_ports = 1; + ra->msg4_mpdcch_repetition_cnt++; + dl_req_body->number_pdu++; + dl_req_body->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + + dl_req->sfn_sf = (ra->Msg4_frame<<4)+ra->Msg4_subframe; + dl_req->header.message_id = NFAPI_DL_CONFIG_REQUEST; + + } //repetition_count==0 && SF condition met + else if (ra->msg4_mpdcch_repetition_cnt > 0) { // we're in a stream of repetitions + ra->msg4_mpdcch_repetition_cnt++; + if (ra->msg4_mpdcch_repetition_cnt == reps) { // this is the last mpdcch repetition + if (cc[CC_idP].tdd_Config == NULL) { // FDD case + // wait 2 subframes for PDSCH transmission + if (subframeP > 7) + ra->Msg4_frame = (frameP + 1) & 1023; + else + ra->Msg4_frame = frameP; + ra->Msg4_subframe = (subframeP + 2) % 10; + } else { + AssertFatal(1 == 0, "TDD case not done yet\n"); + } + } // mpdcch_repetition_count == reps + if ((ra->Msg4_frame == frameP) + && (ra->Msg4_subframe == subframeP)) { + + // Program PDSCH + + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Generating Msg4 BR with RRC Piggyback (ce_level %d RNTI %x)\n", + module_idP, CC_idP, frameP, subframeP, + ra->rach_resource_type - 1, ra->rnti); + + AssertFatal(1 == 0, + "Msg4 generation not finished for BL/CE UE\n"); + dl_config_pdu = + &dl_req_body->dl_config_pdu_list[dl_req_body->number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_dlsch_pdu)); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index = + mac->pdu_index[CC_idP]; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti = ra->rnti; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 2; // format 1A/1B/1D + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.virtual_resource_block_assignment_flag = 0; // localized + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = getRIV(N_RB_DL, first_rb, 6); // check that this isn't getRIV(6,0,6) + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.modulation = 2; //QPSK + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + redundancy_version = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = 1; // first block + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.transport_block_to_codeword_swap_flag = + 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + transmission_scheme = (cc->p_eNB == 1) ? 0 : 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.number_of_layers = + 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + number_of_subbands = 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.codebook_index = ; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + ue_category_capacity = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pa = 4; // 0 dB + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + delta_power_offset_index = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ngap = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.nprb = get_subbandsize(cc->mib->message.dl_Bandwidth); // ignored + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_mode = + (cc->p_eNB == 1) ? 1 : 2; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + num_bf_prb_per_subband = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_vector = 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.bf_vector = ; + + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10.pdsch_start = + cc[CC_idP]. + sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13-> + startSymbolBR_r13; + + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.ue_type = + (ra->rach_resource_type < 3) ? 1 : 2; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.pdsch_payload_type = 2; // not SI message + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13. + initial_transmission_sf_io = (10 * frameP) + subframeP; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.drms_table_flag = + 0; + dl_req_body->number_pdu++; + dl_req_body->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + + mac->DL_req[CC_idP].sfn_sf = (frameP<<4)+subframeP; + mac->DL_req[CC_idP].header.message_id = NFAPI_DL_CONFIG_REQUEST; + + ra->state = WAITMSG4ACK; + LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, Subframe %d: state:WAITMSG4ACK\n", module_idP, frameP, subframeP); + + lcid = 0; + + UE_list->UE_sched_ctrl[UE_id].round[CC_idP][ra->harq_pid] = + 0; + msg4_header = 1 + 6 + 1; // CR header, CR CE, SDU header + + if ((ra->msg4_TBsize - rrc_sdu_length - msg4_header) <= 2) { + msg4_padding = + ra->msg4_TBsize - rrc_sdu_length - msg4_header; + msg4_post_padding = 0; + } else { + msg4_padding = 0; + msg4_post_padding = + ra->msg4_TBsize - rrc_sdu_length - msg4_header - 1; + } + + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d subframeP %d Msg4 : TBS %d, sdu_len %d, msg4_header %d, msg4_padding %d, msg4_post_padding %d\n", + module_idP, CC_idP, frameP, subframeP, + ra->msg4_TBsize, rrc_sdu_length, msg4_header, + msg4_padding, msg4_post_padding); + DevAssert(UE_id != UE_INDEX_INVALID); // FIXME not sure how to gracefully return + // CHECK THIS: &cc[CC_idP].CCCH_pdu.payload[0] + offset = generate_dlsch_header((unsigned char *) mac->UE_list.DLSCH_pdu[CC_idP][0][(unsigned char) UE_id].payload[0], 1, //num_sdus + (unsigned short *) &rrc_sdu_length, // + &lcid, // sdu_lcid + 255, // no drx + 31, // no timing advance + ra->cont_res_id, // contention res id + msg4_padding, // no padding + msg4_post_padding); + + memcpy((void *) &mac->UE_list. + DLSCH_pdu[CC_idP][0][(unsigned char) + UE_id].payload[0][(unsigned + char) + offset], + &cc[CC_idP].CCCH_pdu.payload[0], rrc_sdu_length); + + // DL request + mac->TX_req[CC_idP].sfn_sf = (frameP << 4) + subframeP; + mac->TX_req[CC_idP].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + mac->TX_req[CC_idP].header.message_id = NFAPI_TX_REQUEST; + + TX_req = + &mac->TX_req[CC_idP].tx_request_body.tx_pdu_list[mac-> + TX_req + [CC_idP]. + tx_request_body.number_of_pdus]; + TX_req->pdu_length = rrc_sdu_length; + TX_req->pdu_index = mac->pdu_index[CC_idP]++; + TX_req->num_segments = 1; + TX_req->segments[0].segment_length = rrc_sdu_length; + TX_req->segments[0].segment_data = + mac->UE_list. + DLSCH_pdu[CC_idP][0][(unsigned char) UE_id].payload[0]; + mac->TX_req[CC_idP].tx_request_body.number_of_pdus++; + + // Program ACK/NAK for Msg4 PDSCH + int absSF = (ra->Msg3_frame * 10) + ra->Msg3_subframe; + // see Section 10.2 from 36.213 + int ackNAK_absSF = absSF + reps + 4; + AssertFatal(reps > 2, + "Have to handle programming of ACK when PDSCH repetitions is > 2\n"); + ul_req = &mac->UL_req_tmp[CC_idP][ackNAK_absSF % 10]; + ul_req_body = &ul_req->ul_config_request_body; + ul_config_pdu = &ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus]; + + ul_config_pdu->pdu_type = + NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE; + ul_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_ul_config_uci_harq_pdu)); + ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; + ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.handle = 0; // don't know how to use this + ul_config_pdu->uci_harq_pdu. + ue_information.ue_information_rel8.rnti = ra->rnti; + ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG; + ul_config_pdu->uci_harq_pdu. + ue_information.ue_information_rel13.ue_type = + (ra->rach_resource_type < 3) ? 1 : 2; + ul_config_pdu->uci_harq_pdu. + ue_information.ue_information_rel13.empty_symbols = 0; + ul_config_pdu->uci_harq_pdu.ue_information. + ue_information_rel13.total_number_of_repetitions = + pucchreps[ra->rach_resource_type - 1]; + ul_config_pdu->uci_harq_pdu. + ue_information.ue_information_rel13.repetition_number = + 0; + + ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + + ul_req->sfn_sf = sfnsf_add_subframe(ra->Msg3_frame, ra->Msg3_subframe, 4); + ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST; + + LOG_D(MAC,"UL_req_tmp[CC_idP:%d][ackNAK_absSF mod 10:%d] ra->Msg3_frame:%d ra->Msg3_subframe:%d + 4 sfn_sf:%d\n", CC_idP, ackNAK_absSF%10, ra->Msg3_frame, ra->Msg3_subframe, NFAPI_SFNSF2DEC(ul_req->sfn_sf)); + + // Note need to keep sending this across reptitions!!!! Not really for PUCCH, to ask small-cell forum, we'll see for the other messages, maybe parameters change across repetitions and FAPI has to provide for that + if (cc[CC_idP].tdd_Config == NULL) { // FDD case + ul_config_pdu->uci_harq_pdu.harq_information.harq_information_rel8_fdd.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG; + ul_config_pdu->uci_harq_pdu. + harq_information.harq_information_rel8_fdd. + n_pucch_1_0 = + n1pucchan[ra->rach_resource_type - 1]; + // NOTE: How to fill in the rest of the n_pucch_1_0 information 213 Section 10.1.2.1 in the general case + // = N_ECCE_q + Delta_ARO + n1pucchan[ce_level] + // higher in the MPDCCH configuration, N_ECCE_q is hard-coded to 0, and harq resource offset to 0 => + // Delta_ARO = 0 from Table 10.1.2.1-1 + ul_config_pdu->uci_harq_pdu.harq_information.harq_information_rel8_fdd.harq_size = 1; // 1-bit ACK/NAK + } else { + AssertFatal(1 == 0, + "PUCCH configuration for ACK/NAK not handled yet for TDD BL/CE case\n"); + } + ul_req_body->number_of_pdus++; + T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, T_INT(module_idP), + T_INT(CC_idP), T_INT(ra->rnti), T_INT(frameP), + T_INT(subframeP), T_INT(0 /*harq_pid always 0? */ ), + T_BUFFER(&mac->UE_list.DLSCH_pdu[CC_idP][0][UE_id]. + payload[0], ra->msg4_TBsize)); + + if (opt_enabled == 1) { + trace_pdu(1, + (uint8_t *) mac-> + UE_list.DLSCH_pdu[CC_idP][0][(unsigned char) + UE_id].payload + [0], rrc_sdu_length, UE_id, 3, + UE_RNTI(module_idP, UE_id), mac->frame, + mac->subframe, 0, 0); + LOG_D(OPT, + "[eNB %d][DLSCH] CC_id %d Frame %d trace pdu for rnti %x with size %d\n", + module_idP, CC_idP, frameP, UE_RNTI(module_idP, + UE_id), + rrc_sdu_length); + } + } // Msg4 frame/subframe + } // msg4_mpdcch_repetition_count + } // rach_resource_type > 0 + else +#endif + { // This is normal LTE case + if ((ra->Msg4_frame == frameP) && (ra->Msg4_subframe == subframeP)) { + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Generating Msg4 with RRC Piggyback (RNTI %x)\n", + module_idP, CC_idP, frameP, subframeP, ra->rnti); + + /// Choose first 4 RBs for Msg4, should really check that these are free! + first_rb = 0; vrb_map[first_rb] = 1; - vrb_map[first_rb+1] = 1; - vrb_map[first_rb+2] = 1; - vrb_map[first_rb+3] = 1; + vrb_map[first_rb + 1] = 1; + vrb_map[first_rb + 2] = 1; + vrb_map[first_rb + 3] = 1; - // Compute MCS for 3 PRB - msg4_header = 1+6+1; // CR header, CR CE, SDU header + // Compute MCS/TBS for 3 PRB (coded on 4 vrb) + msg4_header = 1 + 6 + 1; // CR header, CR CE, SDU header - if (mac_xface->lte_frame_parms->frame_type == TDD) { - - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_1_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); - - break; - - case 25: - - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); - break; - - case 50: - - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_10MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); - - break; - - case 100: - - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->type=1; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rv=0; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_20MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); - break; - } - } else { // FDD DCI - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_1_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); - break; - - case 25: - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); - break; - - case 50: - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_10MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); - break; - - case 100: - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; - - if ((rrc_sdu_length+msg4_header) <= 22) { - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=4; - TBsize = 22; - } else if ((rrc_sdu_length+msg4_header) <= 28) { - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=5; - TBsize = 28; - } else if ((rrc_sdu_length+msg4_header) <= 32) { - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=6; - TBsize = 32; - } else if ((rrc_sdu_length+msg4_header) <= 41) { - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=7; - TBsize = 41; - } else if ((rrc_sdu_length+msg4_header) <= 49) { - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=8; - TBsize = 49; - } else if ((rrc_sdu_length+msg4_header) <= 57) { - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->mcs=9; - TBsize = 57; - } - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->type=1; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type=0; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rv=0; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->harq_pid=0; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->TPC=1; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->padding=0; - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc= mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_20MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); - break; - } - } - - if (!CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,2,RA_template->rnti)) { - add_ue_spec_dci(DCI_pdu, - (void*)&RA_template->RA_alloc_pdu2[0], - RA_template->rnti, - RA_template->RA_dci_size_bytes2, - 2, - RA_template->RA_dci_size_bits2, - RA_template->RA_dci_fmt2, - 0); - - RA_template->generate_Msg4=0; - RA_template->wait_ack_Msg4=1; - RA_template->RA_active = FALSE; - lcid=0; - - if ((TBsize - rrc_sdu_length - msg4_header) <= 2) { - msg4_padding = TBsize - rrc_sdu_length - msg4_header; - msg4_post_padding = 0; - } else { - msg4_padding = 0; - msg4_post_padding = TBsize - rrc_sdu_length - msg4_header -1; - } - - LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d subframeP %d Msg4 : TBS %d, sdu_len %d, msg4_header %d, msg4_padding %d, msg4_post_padding %d\n", - module_idP,CC_id,frameP,subframeP,TBsize,rrc_sdu_length,msg4_header,msg4_padding,msg4_post_padding); - DevAssert( UE_id != UE_INDEX_INVALID ); // FIXME not sure how to gracefully return - offset = generate_dlsch_header((unsigned char*)eNB->UE_list.DLSCH_pdu[CC_id][0][(unsigned char)UE_id].payload[0], - 1, //num_sdus - (unsigned short*)&rrc_sdu_length, // - &lcid, // sdu_lcid - 255, // no drx - 0, // no timing advance - RA_template->cont_res_id, // contention res id - msg4_padding, // no padding - msg4_post_padding); - - memcpy((void*)&eNB->UE_list.DLSCH_pdu[CC_id][0][(unsigned char)UE_id].payload[0][(unsigned char)offset], - &eNB->common_channels[CC_id].CCCH_pdu.payload[0], - rrc_sdu_length); - - T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(RA_template->rnti), T_INT(frameP), T_INT(subframeP), - T_INT(0 /*harq_pid always 0?*/), T_BUFFER(&eNB->UE_list.DLSCH_pdu[CC_id][0][UE_id].payload[0], TBsize)); - - if (opt_enabled==1) { - trace_pdu(1, (uint8_t *)eNB->UE_list.DLSCH_pdu[CC_id][0][(unsigned char)UE_id].payload[0], - rrc_sdu_length, UE_id, 3, UE_RNTI(module_idP, UE_id), - eNB->subframe,0,0); - LOG_D(OPT,"[eNB %d][DLSCH] CC_id %d Frame %d trace pdu for rnti %x with size %d\n", - module_idP, CC_id, frameP, UE_RNTI(module_idP,UE_id), rrc_sdu_length); - } - + if ((rrc_sdu_length + msg4_header) <= 22) { + ra->msg4_mcs = 4; + ra->msg4_TBsize = 22; + } else if ((rrc_sdu_length + msg4_header) <= 28) { + ra->msg4_mcs = 5; + ra->msg4_TBsize = 28; + } else if ((rrc_sdu_length + msg4_header) <= 32) { + ra->msg4_mcs = 6; + ra->msg4_TBsize = 32; + } else if ((rrc_sdu_length + msg4_header) <= 41) { + ra->msg4_mcs = 7; + ra->msg4_TBsize = 41; + } else if ((rrc_sdu_length + msg4_header) <= 49) { + ra->msg4_mcs = 8; + ra->msg4_TBsize = 49; + } else if ((rrc_sdu_length + msg4_header) <= 57) { + ra->msg4_mcs = 9; + ra->msg4_TBsize = 57; } - } - //try here - } + fill_nfapi_dl_dci_1A(dl_config_pdu, 4, // aggregation_level + ra->rnti, // rnti + 1, // rnti_type, CRNTI + ra->harq_pid, // harq_process + 1, // tpc, none + getRIV(N_RB_DL, first_rb, 4), // resource_block_coding + ra->msg4_mcs, // mcs + 1, // ndi + 0, // rv + 0); // vrb_flag - } else if (RA_template->wait_ack_Msg4==1) { - // check HARQ status and retransmit if necessary - LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Checking if Msg4 was acknowledged: \n", - module_idP,CC_id,frameP,subframeP); - // Get candidate harq_pid from PHY - mac_xface->get_ue_active_harq_pid(module_idP,CC_id,RA_template->rnti,frameP,subframeP,&harq_pid,&round,0); - - if (round>0) { - //RA_template->wait_ack_Msg4++; - // we have to schedule a retransmission - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; - } else { - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->ndi=1; - } - - /* - // randomize frequency allocation for RA - while (1) { - first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4)); - - if ((vrb_map[first_rb] != 1) && (vrb_map[first_rb+3] != 1)) - break; - } - */ - first_rb=0; - vrb_map[first_rb] = 1; - vrb_map[first_rb+1] = 1; - vrb_map[first_rb+2] = 1; - vrb_map[first_rb+3] = 1; - - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_TDD_1_6_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); - } else { - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_UL,first_rb,4); - rballoc[CC_id] |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->vrb_type, - ((DCI1A_5MHz_FDD_t*)&RA_template->RA_alloc_pdu2[0])->rballoc); - } - - if (!CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,2,RA_template->rnti)) { - add_ue_spec_dci(DCI_pdu, - (void*)&RA_template->RA_alloc_pdu2[0], - RA_template->rnti, - RA_template->RA_dci_size_bytes2, - 2, - RA_template->RA_dci_size_bits2, - RA_template->RA_dci_fmt2, - 0); - } - LOG_W(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Msg4 not acknowledged, adding ue specific dci (rnti %x) for RA (Msg4 Retransmission)\n", - module_idP,CC_id,frameP,subframeP,RA_template->rnti); - } else { - /* msg4 not received - if ((round == 0) && (RA_template->wait_ack_Msg4>1){ - remove UE instance across all the layers: mac_xface->cancel_RA(); - } - */ - LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d : Msg4 acknowledged\n",module_idP,CC_id,frameP,subframeP); - RA_template->wait_ack_Msg4=0; - RA_template->RA_active=FALSE; - UE_id = find_UE_id(module_idP,RA_template->rnti); - DevAssert( UE_id != -1 ); - eNB_mac_inst[module_idP].UE_list.UE_template[UE_PCCID(module_idP,UE_id)][UE_id].configured=TRUE; - + LOG_D(MAC, + "Frame %d, subframe %d: Msg4 DCI pdu_num %d (rnti %x,rnti_type %d,harq_pid %d, resource_block_coding (%p) %d\n", + frameP, subframeP, dl_req_body->number_pdu, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process, + &dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + resource_block_coding, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + resource_block_coding); + AssertFatal(dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.resource_block_coding < 8192, + "resource_block_coding %u < 8192\n", + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.resource_block_coding); + if (!CCE_allocation_infeasible + (module_idP, CC_idP, 1, subframeP, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + aggregation_level, ra->rnti)) { + dl_req_body->number_dci++; + dl_req_body->number_pdu++; + + ra->state = WAITMSG4ACK; + LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, Subframe %d: state:WAITMSG4ACK\n", module_idP, frameP, subframeP); + + // increment Absolute subframe by 8 for Msg4 retransmission + LOG_D(MAC, + "Frame %d, Subframe %d: Preparing for Msg4 retransmission currently %d.%d\n", + frameP, subframeP, ra->Msg4_frame, + ra->Msg4_subframe); + if (ra->Msg4_subframe > 1) + ra->Msg4_frame++; + ra->Msg4_frame &= 1023; + ra->Msg4_subframe = (ra->Msg4_subframe + 8) % 10; + LOG_D(MAC, + "Frame %d, Subframe %d: Msg4 retransmission in %d.%d\n", + frameP, subframeP, ra->Msg4_frame, + ra->Msg4_subframe); + lcid = 0; + + // put HARQ process round to 0 + if (cc->tdd_Config) + ra->harq_pid = ((frameP * 10) + subframeP) % 10; + else + ra->harq_pid = ((frameP * 10) + subframeP) & 7; + UE_list->UE_sched_ctrl[UE_id].round[CC_idP][ra->harq_pid] = + 0; + + if ((ra->msg4_TBsize - rrc_sdu_length - msg4_header) <= 2) { + msg4_padding = + ra->msg4_TBsize - rrc_sdu_length - msg4_header; + msg4_post_padding = 0; + } else { + msg4_padding = 0; + msg4_post_padding = + ra->msg4_TBsize - rrc_sdu_length - msg4_header - 1; + } + + LOG_D(MAC, + "[eNB %d][RAPROC] CC_idP %d Frame %d subframeP %d Msg4 : TBS %d, sdu_len %d, msg4_header %d, msg4_padding %d, msg4_post_padding %d\n", + module_idP, CC_idP, frameP, subframeP, + ra->msg4_TBsize, rrc_sdu_length, msg4_header, + msg4_padding, msg4_post_padding); + DevAssert(UE_id != UE_INDEX_INVALID); // FIXME not sure how to gracefully return + // CHECK THIS: &cc[CC_idP].CCCH_pdu.payload[0] + offset = generate_dlsch_header((unsigned char *) mac->UE_list.DLSCH_pdu[CC_idP][0][(unsigned char) UE_id].payload[0], 1, //num_sdus + (unsigned short *) &rrc_sdu_length, // + &lcid, // sdu_lcid + 255, // no drx + 31, // no timing advance + ra->cont_res_id, // contention res id + msg4_padding, // no padding + msg4_post_padding); + + memcpy((void *) &mac->UE_list. + DLSCH_pdu[CC_idP][0][(unsigned char) + UE_id].payload[0][(unsigned + char) + offset], + &cc[CC_idP].CCCH_pdu.payload[0], rrc_sdu_length); + + // DLSCH Config + fill_nfapi_dlsch_config(mac, dl_req_body, ra->msg4_TBsize, mac->pdu_index[CC_idP], ra->rnti, 2, // resource_allocation_type : format 1A/1B/1D + 0, // virtual_resource_block_assignment_flag : localized + getRIV(N_RB_DL, first_rb, 4), // resource_block_coding : RIV, 4 PRB + 2, // modulation: QPSK + 0, // redundancy version + 1, // transport_blocks + 0, // transport_block_to_codeword_swap_flag (0) + (cc->p_eNB == 1) ? 0 : 1, // transmission_scheme + 1, // number of layers + 1, // number of subbands + //0, // codebook index + 1, // ue_category_capacity + 4, // pa: 0 dB + 0, // delta_power_offset_index + 0, // ngap + 1, // NPRB = 3 like in DCI + (cc->p_eNB == 1) ? 1 : 2, // transmission mode + 1, // num_bf_prb_per_subband + 1); // num_bf_vector + LOG_D(MAC, + "Filled DLSCH config, pdu number %d, non-dci pdu_index %d\n", + dl_req_body->number_pdu, mac->pdu_index[CC_idP]); + + // Tx request + mac->TX_req[CC_idP].sfn_sf = + fill_nfapi_tx_req(&mac->TX_req[CC_idP].tx_request_body, + (frameP * 10) + subframeP, + rrc_sdu_length, + mac->pdu_index[CC_idP], + mac->UE_list. + DLSCH_pdu[CC_idP][0][(unsigned char) + UE_id].payload + [0]); + mac->pdu_index[CC_idP]++; + + dl_req->sfn_sf = mac->TX_req[CC_idP].sfn_sf; + + LOG_D(MAC, "Filling UCI ACK/NAK information, cce_idx %d\n", + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.cce_idx); + // Program PUCCH1a for ACK/NAK + // Program ACK/NAK for Msg4 PDSCH + fill_nfapi_uci_acknak(module_idP, + CC_idP, + ra->rnti, + (frameP * 10) + subframeP, + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.cce_idx); + + + T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, T_INT(module_idP), + T_INT(CC_idP), T_INT(ra->rnti), T_INT(frameP), + T_INT(subframeP), T_INT(0 /*harq_pid always 0? */ ), + T_BUFFER(&mac->UE_list.DLSCH_pdu[CC_idP][0][UE_id]. + payload[0], ra->msg4_TBsize)); + + if (opt_enabled == 1) { + trace_pdu(1, + (uint8_t *) mac-> + UE_list.DLSCH_pdu[CC_idP][0][(unsigned char) + UE_id].payload + [0], rrc_sdu_length, UE_id, 3, + UE_RNTI(module_idP, UE_id), mac->frame, + mac->subframe, 0, 0); + LOG_D(OPT, + "[eNB %d][DLSCH] CC_id %d Frame %d trace pdu for rnti %x with size %d\n", + module_idP, CC_idP, frameP, UE_RNTI(module_idP, + UE_id), + rrc_sdu_length); + } + + } // CCE Allocation feasible + } // msg4 frame/subframe + } // else rach_resource_type +} + +void +check_Msg4_retransmission(module_id_t module_idP, int CC_idP, + frame_t frameP, sub_frame_t subframeP, RA_t * ra) +{ + + eNB_MAC_INST *mac = RC.mac[module_idP]; + COMMON_channels_t *cc = mac->common_channels; + int UE_id = -1; + uint8_t *vrb_map; + int first_rb; + int N_RB_DL; + nfapi_dl_config_request_pdu_t *dl_config_pdu; + UE_list_t *UE_list = &mac->UE_list; + nfapi_dl_config_request_t *dl_req; + nfapi_dl_config_request_body_t *dl_req_body; + + int round; + /* + #ifdef Rel14 + COMMON_channels_t *cc = mac->common_channels; + + int rmax = 0; + int rep = 0; + int reps = 0; + + first_rb = 0; + struct PRACH_ConfigSIB_v1310 *ext4_prach; + PRACH_ParametersListCE_r13_t *prach_ParametersListCE_r13; + PRACH_ParametersCE_r13_t *p[4]; + + if (cc[CC_idP].radioResourceConfigCommon_BR) { + + ext4_prach = cc[CC_idP].radioResourceConfigCommon_BR->ext4->prach_ConfigCommon_v1310; + prach_ParametersListCE_r13 = &ext4_prach->prach_ParametersListCE_r13; + + switch (prach_ParametersListCE_r13->list.count) { + case 4: + p[3]=prach_ParametersListCE_r13->list.array[3]; + case 3: + p[2]=prach_ParametersListCE_r13->list.array[2]; + case 2: + p[1]=prach_ParametersListCE_r13->list.array[1]; + case 1: + p[0]=prach_ParametersListCE_r13->list.array[0]; + default: + AssertFatal(1==0,"Illegal count for prach_ParametersListCE_r13 %d\n",prach_ParametersListCE_r13->list.count); + } + } + #endif + */ + + // check HARQ status and retransmit if necessary + + + UE_id = find_UE_id(module_idP, ra->rnti); + AssertFatal(UE_id >= 0, "Can't find UE for t-crnti\n"); + + round = UE_list->UE_sched_ctrl[UE_id].round[CC_idP][ra->harq_pid]; + vrb_map = cc[CC_idP].vrb_map; + + dl_req = &mac->DL_req[CC_idP]; + dl_req_body = &dl_req->dl_config_request_body; + dl_config_pdu = &dl_req_body->dl_config_pdu_list[dl_req_body->number_pdu]; + N_RB_DL = to_prb(cc[CC_idP].mib->message.dl_Bandwidth); + + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Checking if Msg4 for harq_pid %d was acknowledged (round %d)\n", + module_idP, CC_idP, frameP, subframeP, ra->harq_pid, round); + + if (round != 8) { + +#ifdef Rel14 + if (ra->rach_resource_type > 0) { + AssertFatal(1 == 0, + "Msg4 Retransmissions not handled yet for BL/CE UEs\n"); + } else +#endif + { + if ((ra->Msg4_frame == frameP) + && (ra->Msg4_subframe == subframeP)) { + + //ra->wait_ack_Msg4++; + // we have to schedule a retransmission + + dl_req->sfn_sf = frameP<<4 | subframeP; + + first_rb = 0; + vrb_map[first_rb] = 1; + vrb_map[first_rb + 1] = 1; + vrb_map[first_rb + 2] = 1; + vrb_map[first_rb + 3] = 1; + + fill_nfapi_dl_dci_1A(dl_config_pdu, 4, // aggregation_level + ra->rnti, // rnti + 1, // rnti_type, CRNTI + ra->harq_pid, // harq_process + 1, // tpc, none + getRIV(N_RB_DL, first_rb, 4), // resource_block_coding + ra->msg4_mcs, // mcs + 1, // ndi + round & 3, // rv + 0); // vrb_flag + + if (!CCE_allocation_infeasible + (module_idP, CC_idP, 1, subframeP, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + aggregation_level, ra->rnti)) { + dl_req_body->number_dci++; + dl_req_body->number_pdu++; + dl_req_body->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + + LOG_D(MAC, + "msg4 retransmission for rnti %x (round %d) fsf %d/%d\n", + ra->rnti, round, frameP, subframeP); + // DLSCH Config + //DJP - fix this pdu_index = -1 + fill_nfapi_dlsch_config(mac, dl_req_body, ra->msg4_TBsize, + -1 + /* retransmission, no pdu_index */ + , ra->rnti, 2, // resource_allocation_type : format 1A/1B/1D + 0, // virtual_resource_block_assignment_flag : localized + getRIV(N_RB_DL, first_rb, 4), // resource_block_coding : RIV, 4 PRB + 2, // modulation: QPSK + round & 3, // redundancy version + 1, // transport_blocks + 0, // transport_block_to_codeword_swap_flag (0) + (cc->p_eNB == 1) ? 0 : 1, // transmission_scheme + 1, // number of layers + 1, // number of subbands + //0, // codebook index + 1, // ue_category_capacity + 4, // pa: 0 dB + 0, // delta_power_offset_index + 0, // ngap + 1, // NPRB = 3 like in DCI + (cc->p_eNB == 1) ? 1 : 2, // transmission mode + 1, // num_bf_prb_per_subband + 1); // num_bf_vector + } else + LOG_D(MAC, + "msg4 retransmission for rnti %x (round %d) fsf %d/%d CCE allocation failed!\n", + ra->rnti, round, frameP, subframeP); + + + // Program PUCCH1a for ACK/NAK + + + fill_nfapi_uci_acknak(module_idP, CC_idP, + ra->rnti, + (frameP * 10) + subframeP, + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.cce_idx); + + // prepare frame for retransmission + if (ra->Msg4_subframe > 1) + ra->Msg4_frame++; + ra->Msg4_frame &= 1023; + ra->Msg4_subframe = (ra->Msg4_subframe + 8) % 10; + + LOG_W(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Msg4 not acknowledged, adding ue specific dci (rnti %x) for RA (Msg4 Retransmission round %d in %d.%d)\n", + module_idP, CC_idP, frameP, subframeP, ra->rnti, + round, ra->Msg4_frame, ra->Msg4_subframe); + + } // Msg4 frame/subframe + } // regular LTE case + } else { + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d : Msg4 acknowledged\n", + module_idP, CC_idP, frameP, subframeP); + ra->state = IDLE; + LOG_D(MAC,"[eNB %d][RAPROC] Frame %d, Subframe %d: state:IDLE\n", module_idP, frameP, subframeP); + UE_id = find_UE_id(module_idP, ra->rnti); + DevAssert(UE_id != -1); + mac->UE_list.UE_template[UE_PCCID(module_idP, UE_id)][UE_id]. + configured = TRUE; + } +} + +void +schedule_RA(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) +{ + + int CC_id; + eNB_MAC_INST *mac = RC.mac[module_idP]; + COMMON_channels_t *cc = mac->common_channels; + RA_t *ra; + uint8_t i; + + start_meas(&mac->schedule_ra); + + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + // skip UL component carriers if TDD + if (is_UL_sf(&cc[CC_id], subframeP) == 1) + continue; + + + for (i = 0; i < NB_RA_PROC_MAX; i++) { + + ra = (RA_t *) & cc[CC_id].ra[i]; + + //LOG_D(MAC,"RA[state:%d]\n",ra->state); + + if (ra->state == MSG2) + generate_Msg2(module_idP, CC_id, frameP, subframeP, ra); + else if (ra->state == MSG4) + generate_Msg4(module_idP, CC_id, frameP, subframeP, ra); + else if (ra->state == WAITMSG4ACK) + check_Msg4_retransmission(module_idP, CC_id, frameP, + subframeP, ra); + + } // for i=0 .. N_RA_PROC-1 + } // CC_id + + stop_meas(&mac->schedule_ra); +} + + +// handles the event of MSG1 reception +void +initiate_ra_proc(module_id_t module_idP, + int CC_id, + frame_t frameP, + sub_frame_t subframeP, + uint16_t preamble_index, + int16_t timing_offset, uint16_t ra_rnti +#ifdef Rel14 + , uint8_t rach_resource_type +#endif + ) +{ + + uint8_t i; + + COMMON_channels_t *cc = &RC.mac[module_idP]->common_channels[CC_id]; + RA_t *ra = &cc->ra[0]; + + struct PRACH_ConfigSIB_v1310 *ext4_prach = NULL; + PRACH_ParametersListCE_r13_t *prach_ParametersListCE_r13 = NULL; + + if (cc->radioResourceConfigCommon_BR + && cc->radioResourceConfigCommon_BR->ext4) { + ext4_prach = + cc->radioResourceConfigCommon_BR->ext4-> + prach_ConfigCommon_v1310; + prach_ParametersListCE_r13 = + &ext4_prach->prach_ParametersListCE_r13; + } + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d, Subframe %d Initiating RA procedure for preamble index %d\n", + module_idP, CC_id, frameP, subframeP, preamble_index); +#ifdef Rel14 + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d, Subframe %d PRACH resource type %d\n", + module_idP, CC_id, frameP, subframeP, rach_resource_type); +#endif + + uint16_t msg2_frame = frameP; + uint16_t msg2_subframe = subframeP; + int offset; + + if (prach_ParametersListCE_r13 && + prach_ParametersListCE_r13->list.count < rach_resource_type) { + LOG_E(MAC, + "[eNB %d][RAPROC] CC_id %d Received impossible PRACH resource type %d, only %d CE levels configured\n", + module_idP, CC_id, rach_resource_type, + (int) prach_ParametersListCE_r13->list.count); + return; + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 0); + + for (i = 0; i < NB_RA_PROC_MAX; i++) { + if (ra[i].state == IDLE) { + int loop = 0; + LOG_D(MAC, "Frame %d, Subframe %d: Activating RA process %d\n", + frameP, subframeP, i); + ra[i].state = MSG2; + ra[i].timing_offset = timing_offset; + ra[i].preamble_subframe = subframeP; +#ifdef Rel14 + ra[i].rach_resource_type = rach_resource_type; + ra[i].msg2_mpdcch_repetition_cnt = 0; + ra[i].msg4_mpdcch_repetition_cnt = 0; +#endif + + // DJP - this is because VNF is 2 subframes ahead of PNF and TX needs 4 subframes + if (nfapi_mode) + offset = 7; + else + offset = 5; + + add_subframe(&msg2_frame, &msg2_subframe, offset); + + ra[i].Msg2_frame = msg2_frame; + ra[i].Msg2_subframe = msg2_subframe; + + LOG_D(MAC,"%s() Msg2[%04d%d] SFN/SF:%04d%d offset:%d\n", __FUNCTION__,ra[i].Msg2_frame,ra[i].Msg2_subframe,frameP,subframeP,offset); + + ra[i].Msg2_subframe = (subframeP + offset) % 10; + /* TODO: find better procedure to allocate RNTI */ + do { +#if defined(USRP_REC_PLAY) // deterministic rnti in usrp record/playback mode + static int drnti[NUMBER_OF_UE_MAX] = { 0xbda7, 0x71da, 0x9c40, 0xc350, 0x2710, 0x4e20, 0x7530, 0x1388, 0x3a98, 0x61a8, 0x88b8, 0xafc8, 0xd6d8, 0x1b58, 0x4268, 0x6978 }; + int j = 0; + int nb_ue = 0; + for (j = 0; j < NUMBER_OF_UE_MAX; j++) { + if (UE_RNTI(module_idP, j) > 0) { + nb_ue++; + } else { + break; + } + } + if (nb_ue >= NUMBER_OF_UE_MAX) { + printf("No more free RNTI available, increase NUMBER_OF_UE_MAX\n"); + abort(); + } + ra[i].rnti = drnti[nb_ue]; +#else + ra[i].rnti = taus(); +#endif + loop++; + } + while (loop != 100 && + /* TODO: this is not correct, the rnti may be in use without + * being in the MAC yet. To be refined. + */ + !(find_UE_id(module_idP, ra[i].rnti) == -1 && + /* 1024 and 60000 arbirarily chosen, not coming from standard */ + ra[i].rnti >= 1024 && ra[i].rnti < 60000)); + if (loop == 100) { + printf("%s:%d:%s: FATAL ERROR! contact the authors\n", + __FILE__, __LINE__, __FUNCTION__); + abort(); + } + ra[i].RA_rnti = ra_rnti; + ra[i].preamble_index = preamble_index; + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d Activating RAR generation in Frame %d, subframe %d for process %d, rnti %x, state %d\n", + module_idP, CC_id, frameP, ra[i].Msg2_frame, + ra[i].Msg2_subframe, i, ra[i].rnti, ra[i].state); + + return; } - } - } // for i=0 .. N_RA_PROC-1 - } // CC_id - - stop_meas(&eNB->schedule_ra); -} - -void initiate_ra_proc(module_id_t module_idP, int CC_id,frame_t frameP, uint16_t preamble_index,int16_t timing_offset,uint8_t sect_id,sub_frame_t subframeP, - uint8_t f_id) -{ - - uint8_t i; - RA_TEMPLATE *RA_template = (RA_TEMPLATE *)&eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[0]; - - LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Initiating RA procedure for preamble index %d\n",module_idP,CC_id,frameP,preamble_index); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC,1); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC,0); - - for (i=0; icommon_channels[CC_id].ra[0]; - MSC_LOG_EVENT(MSC_PHY_ENB, "RA Cancelling procedure ue %"PRIx16" ", rnti); - LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Cancelling RA procedure for UE rnti %x\n",module_idP,CC_id,frameP,rnti); + MSC_LOG_EVENT(MSC_PHY_ENB, "RA Cancelling procedure ue %" PRIx16 " ", + rnti); + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d Cancelling RA procedure for UE rnti %x\n", + module_idP, CC_id, frameP, rnti); - for (i=0; i. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file eNB_scheduler_bch.c * \brief procedures related to eNB for the BCH transport channel @@ -60,299 +52,860 @@ #include "pdcp.h" #if defined(ENABLE_ITTI) -# include "intertask_interface.h" +#include "intertask_interface.h" #endif #define ENABLE_MAC_PAYLOAD_DEBUG #define DEBUG_eNB_SCHEDULER 1 +// NEED TO ADD schedule_SI_BR for SIB1_BR and SIB23_BR +// CCE_allocation_infeasible to be done for EPDCCH/MPDCCH + +#ifdef Rel14 + +#define size_Sj25 2 +int Sj25[size_Sj25] = { 0, 3 }; + +#define size_Sj50 6 +int Sj50[size_Sj50] = { 0, 1, 2, 5, 6, 7 }; + +#define size_Sj75 10 +int Sj75[size_Sj75] = { 0, 1, 2, 3, 4, 7, 8, 9, 10, 11 }; + +#define size_Sj100 14 +int Sj100[size_Sj100] = { 0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 15 }; + +int SIB1_BR_TBS_table[6] = { 208, 256, 328, 504, 712, 936 }; + //------------------------------------------------------------------------------ void -schedule_SI( - module_id_t module_idP, - frame_t frameP, - sub_frame_t subframeP) - +schedule_SIB1_BR(module_id_t module_idP, + frame_t frameP, sub_frame_t subframeP) //------------------------------------------------------------------------------ { + int8_t bcch_sdu_length; + int CC_id; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc; + uint8_t *vrb_map; + int first_rb = -1; + int N_RB_DL; + nfapi_dl_config_request_pdu_t *dl_config_pdu; + nfapi_tx_request_pdu_t *TX_req; + nfapi_dl_config_request_body_t *dl_req; + int m, i, N_S_NB; + int *Sj; + int n_NB = 0; + int TBS; + int k = 0, rvidx; + uint16_t sfn_sf = frameP<<4|subframeP; + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + + cc = &eNB->common_channels[CC_id]; + vrb_map = (void *) &cc->vrb_map; + N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth); + dl_req = &eNB->DL_req[CC_id].dl_config_request_body; + + int foffset = cc->physCellId & 1; + int sfoffset = (cc->tdd_Config == NULL) ? 0 : 1; + + // Time-domain scheduling + if (cc->mib->message.schedulingInfoSIB1_BR_r13 == 0) + continue; + else + switch ((cc->mib->message.schedulingInfoSIB1_BR_r13 - 1) % 3) { + case 0: // repetition 4 + k = (frameP >> 1) & 3; + if ((subframeP != (4 + sfoffset)) + || ((frameP & 1) != foffset)) + continue; + break; + case 1: // repetition 8 + k = frameP & 3; + AssertFatal(N_RB_DL > 15, + "SIB1-BR repetition 8 not allowed for N_RB_DL= %d\n", + N_RB_DL); + if ((foffset == 0) && (subframeP != (4 + sfoffset))) + continue; + else if ((foffset == 1) + && (subframeP != ((9 + sfoffset) % 10))) + continue; + break; + case 2: // repetition 16 + k = ((10 * frameP) + subframeP) & 3; + AssertFatal(N_RB_DL > 15, + "SIB1-BR repetition 16 not allowed for N_RB_DL= %d\n", + N_RB_DL); + if ((sfoffset == 1) + && ((subframeP != 0) || (subframeP != 5))) + continue; + else if ((sfoffset == 0) && (foffset == 0) + && (subframeP != 4) && (subframeP != 9)) + continue; + else if ((sfoffset == 0) && (foffset == 1) + && (subframeP != 0) && (subframeP != 9)) + continue; + break; + } + // if we get here we have to schedule SIB1_BR in this frame/subframe + + // keep counter of SIB1_BR repetitions in 8 frame period to choose narrowband on which to transmit + if ((frameP & 7) == 0) + cc->SIB1_BR_cnt = 0; + else + cc->SIB1_BR_cnt++; + + // Frequency-domain scheduling + switch (N_RB_DL) { + case 6: + case 15: + default: + m = 1; + n_NB = 0; + N_S_NB = 0; + Sj = NULL; + break; + case 25: + m = 2; + N_S_NB = 2; + Sj = Sj25; + break; + case 50: + m = 2; + N_S_NB = 6; + Sj = Sj50; + break; + case 75: + m = 4; + N_S_NB = 10; + Sj = Sj75; + break; + case 100: + m = 4; + N_S_NB = 14; + Sj = Sj100; + break; + } + // Note: definition of k above and rvidx from 36.321 section 5.3.1 + rvidx = (((3 * k) >> 1) + (k & 1)) & 3; + + i = cc->SIB1_BR_cnt & (m - 1); + + n_NB = Sj[((cc->physCellId % N_S_NB) + (i * N_S_NB / m)) % N_S_NB]; - int8_t bcch_sdu_length; - int mcs = -1; - void *BCCH_alloc_pdu; - int CC_id; - eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP]; - uint8_t *vrb_map; - int first_rb = -1; - int rballoc[MAX_NUM_CCs]; - int sizeof1A_bytes,sizeof1A_bits = -1; - DCI_PDU *DCI_pdu; + bcch_sdu_length = mac_rrc_data_req(module_idP, CC_id, frameP, BCCH_SIB1_BR, 1, &cc->BCCH_BR_pdu[0].payload[0], 0); // not used in this case - start_meas(&eNB->schedule_si); + AssertFatal(cc->mib->message.schedulingInfoSIB1_BR_r13 < 19, + "schedulingInfoSIB1_BR_r13 %d > 18\n", + (int) cc->mib->message.schedulingInfoSIB1_BR_r13); - for (CC_id=0; CC_idcommon_channels[CC_id].BCCH_alloc_pdu; - DCI_pdu = (void*)&eNB->common_channels[CC_id].DCI_pdu; - vrb_map = (void*)&eNB->common_channels[CC_id].vrb_map; + AssertFatal(bcch_sdu_length > 0, + "RRC returned 0 bytes for SIB1-BR\n"); - bcch_sdu_length = mac_rrc_data_req(module_idP, - CC_id, - frameP, - BCCH,1, - &eNB->common_channels[CC_id].BCCH_pdu.payload[0], - 1, - module_idP, - 0); // not used in this case + TBS = + SIB1_BR_TBS_table[(cc->mib->message.schedulingInfoSIB1_BR_r13 - + 1) / 3] >> 3; - if (bcch_sdu_length > 0) { - LOG_D(MAC,"[eNB %d] Frame %d : BCCH->DLSCH CC_id %d, Received %d bytes \n",module_idP,frameP,CC_id,bcch_sdu_length); + AssertFatal(bcch_sdu_length <= TBS, + "length returned by RRC %d is not compatible with the TBS %d from MIB\n", + bcch_sdu_length, TBS); - // Allocate 4 PRBs in a random location - /* - while (1) { - first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL-4)); - if ((vrb_map[first_rb] != 1) && - (vrb_map[first_rb+1] != 1) && - (vrb_map[first_rb+2] != 1) && - (vrb_map[first_rb+3] != 1)) - break; - } - */ - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - first_rb = 0; - break; - case 15: - first_rb = 6; - break; - case 25: - first_rb = 11; - break; - case 50: - first_rb = 23; - break; - case 100: - first_rb = 48; - break; - } + if ((frameP & 1023) < 200) + LOG_D(MAC, + "[eNB %d] Frame %d Subframe %d: SIB1_BR->DLSCH CC_id %d, Received %d bytes, scheduling on NB %d (i %d,m %d,N_S_NB %d) rvidx %d\n", + module_idP, frameP, subframeP, CC_id, bcch_sdu_length, + n_NB, i, m, N_S_NB, rvidx); - vrb_map[first_rb] = 1; - vrb_map[first_rb+1] = 1; - vrb_map[first_rb+2] = 1; - vrb_map[first_rb+3] = 1; + // allocate all 6 PRBs in narrowband for SIB1_BR - // Get MCS for length of SI - if (bcch_sdu_length <= (mac_xface->get_TBS_DL(0,3))) { - mcs=0; - } else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(1,3))) { - mcs=1; - } else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(2,3))) { - mcs=2; - } else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(3,3))) { - mcs=3; - } else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(4,3))) { - mcs=4; - } else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(5,3))) { - mcs=5; - } else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(6,3))) { - mcs=6; - } else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(7,3))) { - mcs=7; - } else if (bcch_sdu_length <= (mac_xface->get_TBS_DL(8,3))) { - mcs=8; - } + first_rb = narrowband_to_first_rb(cc, n_NB); + vrb_map[first_rb] = 1; + vrb_map[first_rb + 1] = 1; + vrb_map[first_rb + 2] = 1; + vrb_map[first_rb + 3] = 1; + vrb_map[first_rb + 4] = 1; + vrb_map[first_rb + 5] = 1; + dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_dlsch_pdu)); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.length = TBS; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index = + eNB->pdu_index[CC_id]; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti = 0xFFFF; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 2; // format 1A/1B/1D + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.virtual_resource_block_assignment_flag = 0; // localized + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = + getRIV(N_RB_DL, first_rb, 6); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.modulation = 2; //QPSK + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.redundancy_version = rvidx; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = 1; // first block + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.transport_block_to_codeword_swap_flag = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_scheme = + (cc->p_eNB == 1) ? 0 : 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.number_of_layers = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.number_of_subbands = 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.codebook_index = ; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ue_category_capacity = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pa = 4; // 0 dB + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.delta_power_offset_index = + 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ngap = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.nprb = get_subbandsize(cc->mib->message.dl_Bandwidth); // ignored + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_mode = + (cc->p_eNB == 1) ? 1 : 2; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_prb_per_subband = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_vector = 1; + // Rel10 fields + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10.pdsch_start = 3; + // Rel13 fields + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.ue_type = 1; // CEModeA UE + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.pdsch_payload_type = 0; // SIB1-BR + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.initial_transmission_sf_io = 0xFFFF; // absolute SFx - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; - rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); - sizeof1A_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - sizeof1A_bits = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - break; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.bf_vector = ; + dl_req->number_pdu++; + dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; - case 25: - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; - rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); - sizeof1A_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t); - sizeof1A_bits = sizeof_DCI1A_5MHz_TDD_1_6_t; - break; + // Program TX Request + TX_req = + &eNB->TX_req[CC_id].tx_request_body.tx_pdu_list[eNB-> + TX_req + [CC_id].tx_request_body.number_of_pdus]; + TX_req->pdu_length = bcch_sdu_length; + TX_req->pdu_index = eNB->pdu_index[CC_id]++; + TX_req->num_segments = 1; + TX_req->segments[0].segment_length = bcch_sdu_length; + TX_req->segments[0].segment_data = cc->BCCH_BR_pdu[0].payload; + eNB->TX_req[CC_id].sfn_sf = sfn_sf; + eNB->TX_req[CC_id].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + eNB->TX_req[CC_id].tx_request_body.number_of_pdus++; + eNB->TX_req[CC_id].header.message_id = NFAPI_TX_REQUEST; - case 50: - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; - rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); - sizeof1A_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t); - sizeof1A_bits = sizeof_DCI1A_10MHz_TDD_1_6_t; - break; - - case 100: - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; - rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); - sizeof1A_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t); - sizeof1A_bits = sizeof_DCI1A_20MHz_TDD_1_6_t; - break; - } - - } else { - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; - - rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); - sizeof1A_bytes = sizeof(DCI1A_1_5MHz_FDD_t); - sizeof1A_bits = sizeof_DCI1A_1_5MHz_FDD_t; - break; - - case 25: - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; - - rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); - sizeof1A_bytes = sizeof(DCI1A_5MHz_FDD_t); - sizeof1A_bits = sizeof_DCI1A_5MHz_FDD_t; - break; - - case 50: - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; - - rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); - sizeof1A_bytes = sizeof(DCI1A_10MHz_FDD_t); - sizeof1A_bits = sizeof_DCI1A_10MHz_FDD_t; - break; - - case 100: - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->mcs = mcs; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc = mac_xface->computeRIV(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL,first_rb,4); - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->type = 1; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->vrb_type = 0; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->ndi = 1; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; - ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; - - rballoc[CC_id] |= mac_xface->get_rballoc(0,((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); - sizeof1A_bytes = sizeof(DCI1A_20MHz_FDD_t); - sizeof1A_bits = sizeof_DCI1A_20MHz_FDD_t; - break; - - } - } - - if (!CCE_allocation_infeasible(module_idP,CC_id,1,subframeP,2,SI_RNTI)) { - add_common_dci(DCI_pdu, - BCCH_alloc_pdu, - SI_RNTI, - sizeof1A_bytes, - 2, - sizeof1A_bits, - format1A,0); - } - else { - LOG_E(MAC,"[eNB %d] CCid %d Frame %d, subframe %d : Cannot add DCI 1A for SI\n",module_idP, CC_id,frameP,subframeP); - } - - if (opt_enabled == 1) { - trace_pdu(1, - &eNB->common_channels[CC_id].BCCH_pdu.payload[0], - bcch_sdu_length, - 0xffff, - 4, - 0xffff, - eNB->subframe, - 0, - 0); - LOG_D(OPT,"[eNB %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", - module_idP, frameP, CC_id, 0xffff, bcch_sdu_length); - } - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - LOG_D(MAC,"[eNB] Frame %d : Scheduling BCCH->DLSCH (TDD) for CC_id %d SI %d bytes (mcs %d, rb 3, TBS %d)\n", - frameP, - CC_id, - bcch_sdu_length, - mcs, - mac_xface->get_TBS_DL(mcs,3)); - } else { - LOG_D(MAC,"[eNB] Frame %d : Scheduling BCCH->DLSCH (FDD) for CC_id %d SI %d bytes (mcs %d, rb 3, TBS %d)\n", - frameP, - CC_id, - bcch_sdu_length, - mcs, - mac_xface->get_TBS_DL(mcs,3)); - } - - - eNB->eNB_stats[CC_id].total_num_bcch_pdu+=1; - eNB->eNB_stats[CC_id].bcch_buffer=bcch_sdu_length; - eNB->eNB_stats[CC_id].total_bcch_buffer+=bcch_sdu_length; - eNB->eNB_stats[CC_id].bcch_mcs=mcs; - } else { - - //LOG_D(MAC,"[eNB %d] Frame %d : BCCH not active \n",Mod_id,frame); + if (opt_enabled == 1) { + trace_pdu(1, + &cc->BCCH_BR_pdu[0].payload[0], + bcch_sdu_length, + 0xffff, 4, 0xffff, eNB->frame, eNB->subframe, 0, 0); + LOG_D(OPT, + "[eNB %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", + module_idP, frameP, CC_id, 0xffff, bcch_sdu_length); + } + if (cc->tdd_Config != NULL) { //TDD + LOG_D(MAC, + "[eNB] Frame %d : Scheduling BCCH-BR 0->DLSCH (TDD) for CC_id %d SIB1-BR %d bytes\n", + frameP, CC_id, bcch_sdu_length); + } else { + LOG_D(MAC, + "[eNB] Frame %d : Scheduling BCCH-BR 0->DLSCH (FDD) for CC_id %d SIB1-BR %d bytes\n", + frameP, CC_id, bcch_sdu_length); + } } - } +} - // this might be misleading when bcch is inactive +int si_WindowLength_BR_r13tab + [SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__si_WindowLength_BR_r13_spare] += { 20, 40, 60, 80, 120, 160, 200 }; +int si_TBS_r13tab[SchedulingInfo_BR_r13__si_TBS_r13_b936 + 1] = + { 152, 208, 256, 328, 408, 504, 600, 712, 808, 936 }; + +//------------------------------------------------------------------------------ +void +schedule_SI_BR(module_id_t module_idP, frame_t frameP, + sub_frame_t subframeP) +//------------------------------------------------------------------------------ +{ + int8_t bcch_sdu_length; + int CC_id; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc; + uint8_t *vrb_map; + int first_rb = -1; + int N_RB_DL; + nfapi_dl_config_request_pdu_t *dl_config_pdu; + nfapi_tx_request_pdu_t *TX_req; + nfapi_dl_config_request_body_t *dl_req; + int i; + int rvidx; + int absSF = (frameP * 10) + subframeP; + uint16_t sfn_sf = frameP << 4 | subframeP; + + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + + cc = &eNB->common_channels[CC_id]; + vrb_map = (void *) &cc->vrb_map; + N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth); + dl_req = &eNB->DL_req[CC_id].dl_config_request_body; + + // Time-domain scheduling + if (cc->mib->message.schedulingInfoSIB1_BR_r13 == 0) + continue; + else { + + + AssertFatal(cc-> + sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13 + != NULL, + "sib_v13ext->bandwidthReducedAccessRelatedInfo_r13 is null\n"); + + SchedulingInfoList_BR_r13_t *schedulingInfoList_BR_r13 = + cc->sib1_v13ext-> + bandwidthReducedAccessRelatedInfo_r13->schedulingInfoList_BR_r13; + AssertFatal(schedulingInfoList_BR_r13 != NULL, + "sib_v13ext->schedulingInfoList_BR_r13 is null\n"); + + SchedulingInfoList_t *schedulingInfoList = + cc->schedulingInfoList; + AssertFatal(schedulingInfoList_BR_r13->list.count == + schedulingInfoList->list.count, + "schedulingInfolist_BR.r13->list.count %d != schedulingInfoList.list.count %d\n", + schedulingInfoList_BR_r13->list.count, + schedulingInfoList->list.count); + + AssertFatal(cc-> + sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13->si_WindowLength_BR_r13 + <= + SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__si_WindowLength_BR_r13_ms200, + "si_WindowLength_BR_r13 %d > %d\n", + (int) cc-> + sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13->si_WindowLength_BR_r13, + SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__si_WindowLength_BR_r13_ms200); + + // check that SI frequency-hopping is disabled + AssertFatal(cc-> + sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13->si_HoppingConfigCommon_r13 + == + SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__si_HoppingConfigCommon_r13_off, + "Deactivate SI_HoppingConfigCommon_r13 in configuration file, not supported for now\n"); + long si_WindowLength_BR_r13 = + si_WindowLength_BR_r13tab[cc-> + sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13->si_WindowLength_BR_r13]; + + long si_RepetitionPattern_r13 = + cc->sib1_v13ext-> + bandwidthReducedAccessRelatedInfo_r13->si_RepetitionPattern_r13; + AssertFatal(si_RepetitionPattern_r13 <= + SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__si_RepetitionPattern_r13_every8thRF, + "si_RepetitionPattern_r13 %d > %d\n", + (int) si_RepetitionPattern_r13, + SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__si_RepetitionPattern_r13_every8thRF); + // cycle through SIB list + + for (i = 0; i < schedulingInfoList_BR_r13->list.count; i++) { + long si_Periodicity = + schedulingInfoList->list.array[i]->si_Periodicity; + long si_Narrowband_r13 = + schedulingInfoList_BR_r13->list.array[i]-> + si_Narrowband_r13; + long si_TBS_r13 = + si_TBS_r13tab[schedulingInfoList_BR_r13-> + list.array[i]->si_TBS_r13]; + + // check if the SI is to be scheduled now + int period_in_sf = 80 << si_Periodicity; // 2^i * 80 subframes, note: si_Periodicity is 2^i * 80ms + int sf_mod_period = absSF % period_in_sf; + int k = sf_mod_period & 3; + // Note: definition of k and rvidx from 36.321 section 5.3.1 + rvidx = (((3 * k) >> 1) + (k & 1)) & 3; + + if ((sf_mod_period < si_WindowLength_BR_r13) + && ((frameP & (((1 << si_RepetitionPattern_r13) - 1))) == 0)) { // this SIB is to be scheduled + + bcch_sdu_length = mac_rrc_data_req(module_idP, CC_id, frameP, BCCH_SI_BR + i, 1, &cc->BCCH_BR_pdu[i + 1].payload[0], 0); // not used in this case + + AssertFatal(bcch_sdu_length > 0, + "RRC returned 0 bytes for SI-BR %d\n", i); + + if (bcch_sdu_length > 0) { + AssertFatal(bcch_sdu_length <= (si_TBS_r13 >> 3), + "RRC provided bcch with length %d > %d (si_TBS_r13 %d)\n", + bcch_sdu_length, + (int) (si_TBS_r13 >> 3), + (int) schedulingInfoList_BR_r13-> + list.array[i]->si_TBS_r13); + + // allocate all 6 PRBs in narrowband for SIB1_BR + + // check that SIB1 didn't take this narrowband + if (vrb_map[first_rb] > 0) + continue; + + first_rb = + narrowband_to_first_rb(cc, + si_Narrowband_r13 - 1); + vrb_map[first_rb] = 1; + vrb_map[first_rb + 1] = 1; + vrb_map[first_rb + 2] = 1; + vrb_map[first_rb + 4] = 1; + vrb_map[first_rb + 5] = 1; + + if ((frameP & 1023) < 200) + LOG_D(MAC, + "[eNB %d] Frame %d Subframe %d: SI_BR->DLSCH CC_id %d, Narrowband %d rvidx %d (sf_mod_period %d : si_WindowLength_BR_r13 %d : si_RepetitionPattern_r13 %d) bcch_sdu_length %d\n", + module_idP, frameP, subframeP, CC_id, + (int) si_Narrowband_r13 - 1, rvidx, + sf_mod_period, + (int) si_WindowLength_BR_r13, + (int) si_RepetitionPattern_r13, + bcch_sdu_length); + + + + + dl_config_pdu = + &dl_req->dl_config_pdu_list[dl_req-> + number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = + NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + + sizeof(nfapi_dl_config_dlsch_pdu)); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.length = + si_TBS_r13 >> 3; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index = + eNB->pdu_index[CC_id]; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti = + 0xFFFF; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 2; // format 1A/1B/1D + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.virtual_resource_block_assignment_flag = 0; // localized + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.resource_block_coding = + getRIV(N_RB_DL, first_rb, 6); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.modulation = 2; //QPSK + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.redundancy_version = rvidx; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = 1; // first block + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.transport_block_to_codeword_swap_flag + = 0; + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.transmission_scheme = + (cc->p_eNB == 1) ? 0 : 1; + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.number_of_layers = 1; + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.number_of_subbands = 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.codebook_index = ; + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.ue_category_capacity = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pa = 4; // 0 dB + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.delta_power_offset_index = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ngap = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.nprb = get_subbandsize(cc->mib->message.dl_Bandwidth); // ignored + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.transmission_mode = + (cc->p_eNB == 1) ? 1 : 2; + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.num_bf_prb_per_subband = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + num_bf_vector = 1; + // Rel10 fields (for PDSCH starting symbol) + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10. + pdsch_start = + cc[CC_id]. + sib1_v13ext->bandwidthReducedAccessRelatedInfo_r13->startSymbolBR_r13; + // Rel13 fields + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.ue_type = 1; // CEModeA UE + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.pdsch_payload_type = 1; // SI-BR + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel13.initial_transmission_sf_io = + absSF - sf_mod_period; + + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.bf_vector = ; + dl_req->number_pdu++; + dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + + // Program TX Request + TX_req = + &eNB->TX_req[CC_id]. + tx_request_body.tx_pdu_list[eNB->TX_req[CC_id]. + tx_request_body.number_of_pdus]; + TX_req->pdu_length = bcch_sdu_length; + TX_req->pdu_index = eNB->pdu_index[CC_id]++; + TX_req->num_segments = 1; + TX_req->segments[0].segment_length = + bcch_sdu_length; + TX_req->segments[0].segment_data = + cc->BCCH_BR_pdu[i + 1].payload; + eNB->TX_req[CC_id].tx_request_body. + number_of_pdus++; + eNB->TX_req[CC_id].sfn_sf = sfn_sf; + eNB->TX_req[CC_id].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + eNB->TX_req[CC_id].header.message_id = NFAPI_TX_REQUEST; + + if (opt_enabled == 1) { + trace_pdu(1, + &cc->BCCH_BR_pdu[i + 1].payload[0], + bcch_sdu_length, + 0xffff, + 4, + 0xffff, eNB->frame, eNB->subframe, 0, + 0); + LOG_D(OPT, + "[eNB %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", + module_idP, frameP, CC_id, 0xffff, + bcch_sdu_length); + } + if (cc->tdd_Config != NULL) { //TDD + LOG_D(MAC, + "[eNB] Frame %d : Scheduling BCCH-BR %d->DLSCH (TDD) for CC_id %d SI-BR %d bytes\n", + frameP, i, CC_id, bcch_sdu_length); + } else { + LOG_D(MAC, + "[eNB] Frame %d : Scheduling BCCH-BR %d->DLSCH (FDD) for CC_id %d SI-BR %d bytes\n", + frameP, i, CC_id, bcch_sdu_length); + } + } + } // scheduling in current frame/subframe + } //for SI List + } // eMTC is activated + } // CC_id + return; +} +#endif + +void +schedule_mib(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) +{ + + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc; + nfapi_dl_config_request_pdu_t *dl_config_pdu; + nfapi_tx_request_pdu_t *TX_req; + int mib_sdu_length; + int CC_id; + nfapi_dl_config_request_t *dl_config_request; + nfapi_dl_config_request_body_t *dl_req; + uint16_t sfn_sf = frameP << 4 | subframeP; + + AssertFatal(subframeP == 0, "Subframe must be 0\n"); + AssertFatal((frameP & 3) == 0, "Frame must be a multiple of 4\n"); + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + + dl_config_request = &eNB->DL_req[CC_id]; + dl_req = &dl_config_request->dl_config_request_body; + cc = &eNB->common_channels[CC_id]; + + mib_sdu_length = mac_rrc_data_req(module_idP, CC_id, frameP, MIBCH, 1, &cc->MIB_pdu.payload[0], 0); // not used in this case + + LOG_D(MAC, "Frame %d, subframe %d: BCH PDU length %d\n", frameP, subframeP, mib_sdu_length); + + if (mib_sdu_length > 0) { + + LOG_D(MAC, "Frame %d, subframe %d: Adding BCH PDU in position %d (length %d)\n", frameP, subframeP, dl_req->number_pdu, mib_sdu_length); + + if ((frameP & 1023) < 40) + LOG_D(MAC, + "[eNB %d] Frame %d : MIB->BCH CC_id %d, Received %d bytes (cc->mib->message.schedulingInfoSIB1_BR_r13 %d)\n", + module_idP, frameP, CC_id, mib_sdu_length, + (int) cc->mib->message.schedulingInfoSIB1_BR_r13); + + dl_config_pdu = + &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = + NFAPI_DL_CONFIG_BCH_PDU_TYPE, dl_config_pdu->pdu_size = + 2 + sizeof(nfapi_dl_config_bch_pdu); + dl_config_pdu->bch_pdu.bch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG; + dl_config_pdu->bch_pdu.bch_pdu_rel8.length = mib_sdu_length; + dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index = + eNB->pdu_index[CC_id]; + dl_config_pdu->bch_pdu.bch_pdu_rel8.transmission_power = 6000; + dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + dl_req->number_pdu++; + + dl_config_request->header.message_id = NFAPI_DL_CONFIG_REQUEST; + dl_config_request->sfn_sf = sfn_sf; + + LOG_D(MAC, "eNB->DL_req[0].number_pdu %d (%p)\n", dl_req->number_pdu, &dl_req->number_pdu); + // DL request + + TX_req = + &eNB->TX_req[CC_id].tx_request_body.tx_pdu_list[eNB->TX_req + [CC_id].tx_request_body.number_of_pdus]; + TX_req->pdu_length = 3; + TX_req->pdu_index = eNB->pdu_index[CC_id]++; + TX_req->num_segments = 1; + TX_req->segments[0].segment_length = 3; + TX_req->segments[0].segment_data = cc[CC_id].MIB_pdu.payload; + eNB->TX_req[CC_id].tx_request_body.number_of_pdus++; + eNB->TX_req[CC_id].sfn_sf = sfn_sf; + eNB->TX_req[CC_id].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + eNB->TX_req[CC_id].header.message_id = NFAPI_TX_REQUEST; + } + } +} + + +//------------------------------------------------------------------------------ +void +schedule_SI(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) +//------------------------------------------------------------------------------ +{ + + int8_t bcch_sdu_length; + int mcs = -1; + int CC_id; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc; + uint8_t *vrb_map; + int first_rb = -1; + int N_RB_DL; + nfapi_dl_config_request_t *dl_config_request; + nfapi_dl_config_request_pdu_t *dl_config_pdu; + nfapi_tx_request_pdu_t *TX_req; + nfapi_dl_config_request_body_t *dl_req; + uint16_t sfn_sf = frameP << 4 | subframeP; + + start_meas(&eNB->schedule_si); + + // Only schedule LTE System Information in subframe 5 + if (subframeP == 5) { + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + + cc = &eNB->common_channels[CC_id]; + vrb_map = (void *) &cc->vrb_map; + N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth); + dl_config_request = &eNB->DL_req[CC_id]; + dl_req = &eNB->DL_req[CC_id].dl_config_request_body; + + + bcch_sdu_length = mac_rrc_data_req(module_idP, CC_id, frameP, BCCH, 1, &cc->BCCH_pdu.payload[0], 0); // not used in this case + + if (bcch_sdu_length > 0) { + LOG_D(MAC, "[eNB %d] Frame %d : BCCH->DLSCH CC_id %d, Received %d bytes \n", module_idP, frameP, CC_id, bcch_sdu_length); + + // Allocate 4 PRBs in a random location + /* + while (1) { + first_rb = (unsigned char)(taus()%(PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL-4)); + if ((vrb_map[first_rb] != 1) && + (vrb_map[first_rb+1] != 1) && + (vrb_map[first_rb+2] != 1) && + (vrb_map[first_rb+3] != 1)) + break; + } + */ + switch (N_RB_DL) { + case 6: + first_rb = 0; + break; + case 15: + first_rb = 6; + break; + case 25: + first_rb = 11; + break; + case 50: + first_rb = 23; + break; + case 100: + first_rb = 48; + break; + } + + vrb_map[first_rb] = 1; + vrb_map[first_rb + 1] = 1; + vrb_map[first_rb + 2] = 1; + vrb_map[first_rb + 3] = 1; + + // Get MCS for length of SI, 3 PRBs + if (bcch_sdu_length <= 7) { + mcs = 0; + } else if (bcch_sdu_length <= 11) { + mcs = 1; + } else if (bcch_sdu_length <= 18) { + mcs = 2; + } else if (bcch_sdu_length <= 22) { + mcs = 3; + } else if (bcch_sdu_length <= 26) { + mcs = 4; + } else if (bcch_sdu_length <= 28) { + mcs = 5; + } else if (bcch_sdu_length <= 32) { + mcs = 6; + } else if (bcch_sdu_length <= 41) { + mcs = 7; + } else if (bcch_sdu_length <= 49) { + mcs = 8; + } + + + dl_config_pdu = + &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = + NFAPI_DL_DCI_FORMAT_1A; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + aggregation_level = 4; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = 0xFFFF; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 2; // S-RNTI : see Table 4-10 from SCF082 - nFAPI specifications + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power + + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = 0; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = 1; // no TPC + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + new_data_indicator_1 = 0; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = mcs; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + redundancy_version_1 = 0; + + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.resource_block_coding = + getRIV(N_RB_DL, first_rb, 4); + dl_config_request->sfn_sf = sfn_sf; + + if (!CCE_allocation_infeasible + (module_idP, CC_id, 0, subframeP, + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.aggregation_level, SI_RNTI)) { + LOG_D(MAC, "Frame %d: Subframe %d : Adding common DCI for S_RNTI\n", frameP, subframeP); + dl_req->number_dci++; + dl_req->number_pdu++; + dl_config_pdu = + &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = + NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_dlsch_pdu)); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index = + eNB->pdu_index[CC_id]; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.length = bcch_sdu_length; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti = 0xFFFF; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 2; // format 1A/1B/1D + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.virtual_resource_block_assignment_flag = 0; // localized + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.resource_block_coding = + getRIV(N_RB_DL, first_rb, 4); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.modulation = 2; //QPSK + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + redundancy_version = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = 1; // first block + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.transport_block_to_codeword_swap_flag + = 0; + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.transmission_scheme = + (cc->p_eNB == 1) ? 0 : 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + number_of_layers = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + number_of_subbands = 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.codebook_index = ; + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.ue_category_capacity = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pa = 4; // 0 dB + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.delta_power_offset_index = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ngap = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.nprb = get_subbandsize(cc->mib->message.dl_Bandwidth); // ignored + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + transmission_mode = (cc->p_eNB == 1) ? 1 : 2; + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.num_bf_prb_per_subband = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_vector = + 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.bf_vector = ; + dl_req->number_pdu++; + + // Rel10 fields + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10.pdsch_start = 3; + // Rel13 fields + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.ue_type = 0; // regular UE + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.pdsch_payload_type = 2; // not BR + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.initial_transmission_sf_io = 0xFFFF; // absolute SF + + dl_config_request->header.message_id = NFAPI_DL_CONFIG_REQUEST; + dl_config_request->sfn_sf = sfn_sf; + + // Program TX Request + TX_req = + &eNB->TX_req[CC_id]. + tx_request_body.tx_pdu_list[eNB->TX_req[CC_id]. + tx_request_body.number_of_pdus]; + TX_req->pdu_length = bcch_sdu_length; + TX_req->pdu_index = eNB->pdu_index[CC_id]++; + TX_req->num_segments = 1; + TX_req->segments[0].segment_length = bcch_sdu_length; + TX_req->segments[0].segment_data = + cc->BCCH_pdu.payload; + eNB->TX_req[CC_id].tx_request_body.number_of_pdus++; + eNB->TX_req[CC_id].sfn_sf = sfn_sf; + eNB->TX_req[CC_id].tx_request_body.tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + eNB->TX_req[CC_id].header.message_id = NFAPI_TX_REQUEST; + + } else { + LOG_E(MAC, + "[eNB %d] CCid %d Frame %d, subframe %d : Cannot add DCI 1A for SI\n", + module_idP, CC_id, frameP, subframeP); + } + + if (opt_enabled == 1) { + trace_pdu(1, + &cc->BCCH_pdu.payload[0], + bcch_sdu_length, + 0xffff, + 4, 0xffff, eNB->frame, eNB->subframe, 0, 0); + LOG_D(OPT, + "[eNB %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", + module_idP, frameP, CC_id, 0xffff, + bcch_sdu_length); + } + if (cc->tdd_Config != NULL) { //TDD + LOG_D(MAC, + "[eNB] Frame %d : Scheduling BCCH->DLSCH (TDD) for CC_id %d SI %d bytes (mcs %d, rb 3)\n", + frameP, CC_id, bcch_sdu_length, mcs); + } else { + LOG_D(MAC, "[eNB] Frame %d : Scheduling BCCH->DLSCH (FDD) for CC_id %d SI %d bytes (mcs %d, rb 3)\n", frameP, CC_id, bcch_sdu_length, mcs); + } + + + eNB->eNB_stats[CC_id].total_num_bcch_pdu += 1; + eNB->eNB_stats[CC_id].bcch_buffer = bcch_sdu_length; + eNB->eNB_stats[CC_id].total_bcch_buffer += bcch_sdu_length; + eNB->eNB_stats[CC_id].bcch_mcs = mcs; + } else { + + //LOG_D(MAC,"[eNB %d] Frame %d : BCCH not active \n",Mod_id,frame); + } + } + } +#ifdef Rel14 + schedule_SIB1_BR(module_idP, frameP, subframeP); + schedule_SI_BR(module_idP, frameP, subframeP); +#endif + stop_meas(&eNB->schedule_si); - return; } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c index 990542a771..9f2ab1cba8 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file eNB_scheduler_dlsch.c * \brief procedures related to eNB for the DLSCH transport channel @@ -59,10 +51,10 @@ //#include "LAYER2/MAC/pre_processor.c" #include "pdcp.h" -#include "SIMULATION/TOOLS/defs.h" // for taus +#include "SIMULATION/TOOLS/defs.h" // for taus #if defined(ENABLE_ITTI) -# include "intertask_interface.h" +#include "intertask_interface.h" #endif #include "T.h" @@ -70,1870 +62,2064 @@ #define ENABLE_MAC_PAYLOAD_DEBUG //#define DEBUG_eNB_SCHEDULER 1 - +extern RAN_CONTEXT_t RC; +extern uint8_t nfapi_mode; //------------------------------------------------------------------------------ void -add_ue_dlsch_info( - module_id_t module_idP, - int CC_id, - int UE_id, - sub_frame_t subframeP, - UE_DLSCH_STATUS status -) +add_ue_dlsch_info(module_id_t module_idP, + int CC_id, + int UE_id, sub_frame_t subframeP, UE_DLSCH_STATUS status) //------------------------------------------------------------------------------ { + //LOG_D(MAC, "%s(module_idP:%d, CC_id:%d, UE_id:%d, subframeP:%d, status:%d) serving_num:%d rnti:%x\n", __FUNCTION__, module_idP, CC_id, UE_id, subframeP, status, eNB_dlsch_info[module_idP][CC_id][UE_id].serving_num, UE_RNTI(module_idP,UE_id)); - eNB_dlsch_info[module_idP][CC_id][UE_id].rnti = UE_RNTI(module_idP,UE_id); - // eNB_dlsch_info[module_idP][CC_id][ue_mod_idP].weight = weight; - eNB_dlsch_info[module_idP][CC_id][UE_id].subframe = subframeP; - eNB_dlsch_info[module_idP][CC_id][UE_id].status = status; + eNB_dlsch_info[module_idP][CC_id][UE_id].rnti = + UE_RNTI(module_idP, UE_id); + // eNB_dlsch_info[module_idP][CC_id][ue_mod_idP].weight = weight; + eNB_dlsch_info[module_idP][CC_id][UE_id].subframe = subframeP; + eNB_dlsch_info[module_idP][CC_id][UE_id].status = status; - eNB_dlsch_info[module_idP][CC_id][UE_id].serving_num++; + eNB_dlsch_info[module_idP][CC_id][UE_id].serving_num++; } //------------------------------------------------------------------------------ int -schedule_next_dlue( - module_id_t module_idP, - int CC_id, - sub_frame_t subframeP -) +schedule_next_dlue(module_id_t module_idP, int CC_id, + sub_frame_t subframeP) //------------------------------------------------------------------------------ { - int next_ue; - UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list; + int next_ue; + UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; - for (next_ue=UE_list->head; next_ue>=0; next_ue=UE_list->next[next_ue] ) { - if (eNB_dlsch_info[module_idP][CC_id][next_ue].status == S_DL_WAITING) { - return next_ue; + for (next_ue = UE_list->head; next_ue >= 0; + next_ue = UE_list->next[next_ue]) { + if (eNB_dlsch_info[module_idP][CC_id][next_ue].status == + S_DL_WAITING) { + return next_ue; + } } - } - for (next_ue=UE_list->head; next_ue>=0; next_ue=UE_list->next[next_ue] ) { - if (eNB_dlsch_info[module_idP][CC_id][next_ue].status == S_DL_BUFFERED) { - eNB_dlsch_info[module_idP][CC_id][next_ue].status = S_DL_WAITING; + for (next_ue = UE_list->head; next_ue >= 0; + next_ue = UE_list->next[next_ue]) { + if (eNB_dlsch_info[module_idP][CC_id][next_ue].status == + S_DL_BUFFERED) { + eNB_dlsch_info[module_idP][CC_id][next_ue].status = + S_DL_WAITING; + } } - } - return(-1);//next_ue; + return (-1); //next_ue; } //------------------------------------------------------------------------------ unsigned char -generate_dlsch_header( - unsigned char* mac_header, - unsigned char num_sdus, - unsigned short *sdu_lengths, - unsigned char *sdu_lcids, - unsigned char drx_cmd, - short timing_advance_cmd, - unsigned char *ue_cont_res_id, - unsigned char short_padding, - unsigned short post_padding -) +generate_dlsch_header(unsigned char *mac_header, + unsigned char num_sdus, + unsigned short *sdu_lengths, + unsigned char *sdu_lcids, + unsigned char drx_cmd, + unsigned short timing_advance_cmd, + unsigned char *ue_cont_res_id, + unsigned char short_padding, + unsigned short post_padding) //------------------------------------------------------------------------------ { - SCH_SUBHEADER_FIXED *mac_header_ptr = (SCH_SUBHEADER_FIXED *)mac_header; - uint8_t first_element=0,last_size=0,i; - uint8_t mac_header_control_elements[16],*ce_ptr; + SCH_SUBHEADER_FIXED *mac_header_ptr = + (SCH_SUBHEADER_FIXED *) mac_header; + uint8_t first_element = 0, last_size = 0, i; + uint8_t mac_header_control_elements[16], *ce_ptr; - ce_ptr = &mac_header_control_elements[0]; + ce_ptr = &mac_header_control_elements[0]; - // compute header components + // compute header components - if ((short_padding == 1) || (short_padding == 2)) { - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - first_element=1; - last_size=1; - } - - if (short_padding == 2) { - mac_header_ptr->E = 1; - mac_header_ptr++; - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - last_size=1; - } - - if (drx_cmd != 255) { - if (first_element>0) { - mac_header_ptr->E = 1; - mac_header_ptr++; - } else { - first_element=1; + if ((short_padding == 1) || (short_padding == 2)) { + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + first_element = 1; + last_size = 1; } - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = DRX_CMD; - last_size=1; - } - - if (timing_advance_cmd != 0) { - if (first_element>0) { - mac_header_ptr->E = 1; - mac_header_ptr++; - } else { - first_element=1; + if (short_padding == 2) { + mac_header_ptr->E = 1; + mac_header_ptr++; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + last_size = 1; } - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = TIMING_ADV_CMD; - last_size=1; - // msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); - ((TIMING_ADVANCE_CMD *)ce_ptr)->R=0; - ((TIMING_ADVANCE_CMD *)ce_ptr)->TA=(timing_advance_cmd+31)&0x3f; - LOG_D(MAC,"timing advance =%d (%d)\n",timing_advance_cmd,((TIMING_ADVANCE_CMD *)ce_ptr)->TA); - ce_ptr+=sizeof(TIMING_ADVANCE_CMD); - //msg("offset %d\n",ce_ptr-mac_header_control_elements); - } + if (drx_cmd != 255) { + if (first_element > 0) { + mac_header_ptr->E = 1; + mac_header_ptr++; + } else { + first_element = 1; + } - if (ue_cont_res_id) { - if (first_element>0) { - mac_header_ptr->E = 1; - /* - printf("[eNB][MAC] last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); - */ - mac_header_ptr++; - } else { - first_element=1; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = DRX_CMD; + last_size = 1; } - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = UE_CONT_RES; - last_size=1; + if (timing_advance_cmd != 31) { + if (first_element > 0) { + mac_header_ptr->E = 1; + mac_header_ptr++; + } else { + first_element = 1; + } - LOG_T(MAC,"[eNB ][RAPROC] Generate contention resolution msg: %x.%x.%x.%x.%x.%x\n", - ue_cont_res_id[0], - ue_cont_res_id[1], - ue_cont_res_id[2], - ue_cont_res_id[3], - ue_cont_res_id[4], - ue_cont_res_id[5]); - - memcpy(ce_ptr,ue_cont_res_id,6); - ce_ptr+=6; - // msg("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); - } - - //msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); - - for (i=0; i0) { - mac_header_ptr->E = 1; - /*msg("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); - */ - mac_header_ptr+=last_size; - //msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); - } else { - first_element=1; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = TIMING_ADV_CMD; + last_size = 1; + // msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); + ((TIMING_ADVANCE_CMD *) ce_ptr)->R = 0; + AssertFatal(timing_advance_cmd < 64, + "timing_advance_cmd %d > 63\n", timing_advance_cmd); + ((TIMING_ADVANCE_CMD *) ce_ptr)->TA = timing_advance_cmd; //(timing_advance_cmd+31)&0x3f; + LOG_D(MAC, "timing advance =%d (%d)\n", timing_advance_cmd, + ((TIMING_ADVANCE_CMD *) ce_ptr)->TA); + ce_ptr += sizeof(TIMING_ADVANCE_CMD); + //msg("offset %d\n",ce_ptr-mac_header_control_elements); } - if (sdu_lengths[i] < 128) { - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID = sdu_lcids[i]; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L = (unsigned char)sdu_lengths[i]; - last_size=2; - } else { - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->R = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->F = 1; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->LCID = sdu_lcids[i]; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB = ((unsigned short) sdu_lengths[i]>>8)&0x7f; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB = (unsigned short) sdu_lengths[i]&0xff; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->padding = 0x00; - last_size=3; + if (ue_cont_res_id) { + if (first_element > 0) { + mac_header_ptr->E = 1; + /* + printf("[eNB][MAC] last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); + */ + mac_header_ptr++; + } else { + first_element = 1; + } + + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = UE_CONT_RES; + last_size = 1; + + LOG_T(MAC, + "[eNB ][RAPROC] Generate contention resolution msg: %x.%x.%x.%x.%x.%x\n", + ue_cont_res_id[0], ue_cont_res_id[1], ue_cont_res_id[2], + ue_cont_res_id[3], ue_cont_res_id[4], ue_cont_res_id[5]); + + memcpy(ce_ptr, ue_cont_res_id, 6); + ce_ptr += 6; + // msg("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); + } + //msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); + + for (i = 0; i < num_sdus; i++) { + LOG_T(MAC, "[eNB] Generate DLSCH header num sdu %d len sdu %d\n", + num_sdus, sdu_lengths[i]); + + if (first_element > 0) { + mac_header_ptr->E = 1; + /*msg("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); + */ + mac_header_ptr += last_size; + //msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); + } else { + first_element = 1; + } + + if (sdu_lengths[i] < 128) { + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->R = 0; + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->F = 0; + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->LCID = sdu_lcids[i]; + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->L = + (unsigned char) sdu_lengths[i]; + last_size = 2; + } else { + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->R = 0; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->F = 1; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->LCID = sdu_lcids[i]; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->L_MSB = + ((unsigned short) sdu_lengths[i] >> 8) & 0x7f; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->L_LSB = + (unsigned short) sdu_lengths[i] & 0xff; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->padding = 0x00; + last_size = 3; #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[eNB] generate long sdu, size %x (MSB %x, LSB %x)\n", - sdu_lengths[i], - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB, - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB); + LOG_D(MAC, + "[eNB] generate long sdu, size %x (MSB %x, LSB %x)\n", + sdu_lengths[i], + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->L_MSB, + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->L_LSB); #endif + } } - } - /* + /* - printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); + printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); - printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); + printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); - if (((SCH_SUBHEADER_FIXED*)mac_header_ptr)->LCID < UE_CONT_RES) { - if (((SCH_SUBHEADER_SHORT*)mac_header_ptr)->F == 0) - printf("F = 0, sdu len (L field) %d\n",(((SCH_SUBHEADER_SHORT*)mac_header_ptr)->L)); - else - printf("F = 1, sdu len (L field) %d\n",(((SCH_SUBHEADER_LONG*)mac_header_ptr)->L)); + if (((SCH_SUBHEADER_FIXED*)mac_header_ptr)->LCID < UE_CONT_RES) { + if (((SCH_SUBHEADER_SHORT*)mac_header_ptr)->F == 0) + printf("F = 0, sdu len (L field) %d\n",(((SCH_SUBHEADER_SHORT*)mac_header_ptr)->L)); + else + printf("F = 1, sdu len (L field) %d\n",(((SCH_SUBHEADER_LONG*)mac_header_ptr)->L)); + } + */ + if (post_padding > 0) { // we have lots of padding at the end of the packet + mac_header_ptr->E = 1; + mac_header_ptr += last_size; + // add a padding element + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + mac_header_ptr++; + } else { // no end of packet padding + // last SDU subhead is of fixed type (sdu length implicitly to be computed at UE) + mac_header_ptr++; } - */ - if (post_padding>0) {// we have lots of padding at the end of the packet - mac_header_ptr->E = 1; - mac_header_ptr+=last_size; - // add a padding element - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - mac_header_ptr++; - } else { // no end of packet padding - // last SDU subhead is of fixed type (sdu length implicitly to be computed at UE) - mac_header_ptr++; - } - //msg("After subheaders %d\n",(uint8_t*)mac_header_ptr - mac_header); + //msg("After subheaders %d\n",(uint8_t*)mac_header_ptr - mac_header); - if ((ce_ptr-mac_header_control_elements) > 0) { - // printf("Copying %d bytes for control elements\n",ce_ptr-mac_header_control_elements); - memcpy((void*)mac_header_ptr,mac_header_control_elements,ce_ptr-mac_header_control_elements); - mac_header_ptr+=(unsigned char)(ce_ptr-mac_header_control_elements); - } + if ((ce_ptr - mac_header_control_elements) > 0) { + // printf("Copying %d bytes for control elements\n",ce_ptr-mac_header_control_elements); + memcpy((void *) mac_header_ptr, mac_header_control_elements, + ce_ptr - mac_header_control_elements); + mac_header_ptr += + (unsigned char) (ce_ptr - mac_header_control_elements); + } + //msg("After CEs %d\n",(uint8_t*)mac_header_ptr - mac_header); - //msg("After CEs %d\n",(uint8_t*)mac_header_ptr - mac_header); - - return((unsigned char*)mac_header_ptr - mac_header); + return ((unsigned char *) mac_header_ptr - mac_header); } //------------------------------------------------------------------------------ void -set_ul_DAI( - int module_idP, - int UE_idP, - int CC_idP, - int frameP, - int subframeP, - LTE_DL_FRAME_PARMS* frame_parms[MAX_NUM_CCs] -) +set_ul_DAI(int module_idP, int UE_idP, int CC_idP, int frameP, + int subframeP) //------------------------------------------------------------------------------ { - eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP]; - UE_list_t *UE_list = &eNB->UE_list; - unsigned char DAI; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + UE_list_t *UE_list = &eNB->UE_list; + unsigned char DAI; + COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; + if (cc->tdd_Config != NULL) { //TDD + DAI = (UE_list->UE_template[CC_idP][UE_idP].DAI - 1) & 3; + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d, subframe %d: DAI %d for UE %d\n", + module_idP, CC_idP, frameP, subframeP, DAI, UE_idP); + // Save DAI for Format 0 DCI - if (frame_parms[CC_idP]->frame_type == TDD) { - DAI = (UE_list->UE_template[CC_idP][UE_idP].DAI-1)&3; - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframe %d: DAI %d for UE %d\n",module_idP,CC_idP,frameP,subframeP,DAI,UE_idP); - // Save DAI for Format 0 DCI + switch (cc->tdd_Config->subframeAssignment) { + case 0: + // if ((subframeP==0)||(subframeP==1)||(subframeP==5)||(subframeP==6)) + break; - switch (frame_parms[CC_idP]->tdd_config) { - case 0: - // if ((subframeP==0)||(subframeP==1)||(subframeP==5)||(subframeP==6)) - break; + case 1: + switch (subframeP) { + case 1: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[7] = DAI; + break; - case 1: - switch (subframeP) { - case 1: - UE_list->UE_template[CC_idP][UE_idP].DAI_ul[7] = DAI; - break; + case 4: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[8] = DAI; + break; - case 4: - UE_list->UE_template[CC_idP][UE_idP].DAI_ul[8] = DAI; - break; + case 6: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[2] = DAI; + break; - case 6: - UE_list->UE_template[CC_idP][UE_idP].DAI_ul[2] = DAI; - break; + case 9: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI; + break; + } - case 9: - UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI; - break; - } + case 2: + // if ((subframeP==3)||(subframeP==8)) + // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; + break; - case 2: - // if ((subframeP==3)||(subframeP==8)) - // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; - break; + case 3: - case 3: + //if ((subframeP==6)||(subframeP==8)||(subframeP==0)) { + // LOG_D(MAC,"schedule_ue_spec: setting UL DAI to %d for subframeP %d => %d\n",DAI,subframeP, ((subframeP+8)%10)>>1); + // UE_list->UE_template[CC_idP][UE_idP].DAI_ul[((subframeP+8)%10)>>1] = DAI; + //} + switch (subframeP) { + case 5: + case 6: + case 1: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[2] = DAI; + break; - //if ((subframeP==6)||(subframeP==8)||(subframeP==0)) { - // LOG_D(MAC,"schedule_ue_spec: setting UL DAI to %d for subframeP %d => %d\n",DAI,subframeP, ((subframeP+8)%10)>>1); - // UE_list->UE_template[CC_idP][UE_idP].DAI_ul[((subframeP+8)%10)>>1] = DAI; - //} - switch (subframeP) { - case 5: - case 6: - case 1: - UE_list->UE_template[CC_idP][UE_idP].DAI_ul[2] = DAI; - break; + case 7: + case 8: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI; + break; - case 7: - case 8: - UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI; - break; + case 9: + case 0: + UE_list->UE_template[CC_idP][UE_idP].DAI_ul[4] = DAI; + break; - case 9: - case 0: - UE_list->UE_template[CC_idP][UE_idP].DAI_ul[4] = DAI; - break; + default: + break; + } - default: - break; - } + break; - break; + case 4: + // if ((subframeP==8)||(subframeP==9)) + // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; + break; - case 4: - // if ((subframeP==8)||(subframeP==9)) - // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; - break; + case 5: + // if (subframeP==8) + // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; + break; - case 5: - // if (subframeP==8) - // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; - break; + case 6: + // if ((subframeP==1)||(subframeP==4)||(subframeP==6)||(subframeP==9)) + // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; + break; - case 6: - // if ((subframeP==1)||(subframeP==4)||(subframeP==6)||(subframeP==9)) - // UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI; - break; - - default: - break; + default: + break; + } } - } } -//------------------------------------------------------------------------------ -void -schedule_ue_spec( - module_id_t module_idP, - frame_t frameP, - sub_frame_t subframeP, - int* mbsfn_flag -) -//------------------------------------------------------------------------------ -{ - - uint8_t CC_id; - int UE_id; - int N_RBG[MAX_NUM_CCs]; - unsigned char aggregation; - mac_rlc_status_resp_t rlc_status; - unsigned char header_len_dcch=0, header_len_dcch_tmp=0,header_len_dtch=0,header_len_dtch_tmp=0, ta_len=0; - unsigned char sdu_lcids[11],offset,num_sdus=0; - uint16_t nb_rb,nb_rb_temp,total_nb_available_rb[MAX_NUM_CCs],nb_available_rb; - uint16_t TBS,j,sdu_lengths[11],rnti,padding=0,post_padding=0; - unsigned char dlsch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; - unsigned char round = 0; - unsigned char harq_pid = 0; - void *DLSCH_dci = NULL; - LTE_eNB_UE_stats *eNB_UE_stats = NULL; - uint16_t sdu_length_total = 0; - // uint8_t dl_pow_off[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - // unsigned char rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX]; - // uint16_t pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - int mcs; - uint16_t min_rb_unit[MAX_NUM_CCs]; - eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP]; - UE_list_t *UE_list = &eNB->UE_list; - LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; - int continue_flag=0; - int32_t normalized_rx_power, target_rx_power; - int32_t tpc=1; - static int32_t tpc_accumulated=0; - UE_sched_ctrl *ue_sched_ctl; - int i; - - if (UE_list->head==-1) { - return; - } - - start_meas(&eNB->schedule_dlsch); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH,VCD_FUNCTION_IN); - - //weight = get_ue_weight(module_idP,UE_id); - aggregation = 1; // set to the maximum aggregation level - - for (CC_id=0; CC_idget_lte_frame_parms(module_idP,CC_id); - // get number of PRBs less those used by common channels - total_nb_available_rb[CC_id] = frame_parms[CC_id]->N_RB_DL; - for (i=0;iN_RB_DL;i++) - if (eNB->common_channels[CC_id].vrb_map[i]!=0) - total_nb_available_rb[CC_id]--; - - N_RBG[CC_id] = frame_parms[CC_id]->N_RBG; - - // store the global enb stats: - eNB->eNB_stats[CC_id].num_dlactive_UEs = UE_list->num_UEs; - eNB->eNB_stats[CC_id].available_prbs = total_nb_available_rb[CC_id]; - eNB->eNB_stats[CC_id].total_available_prbs += total_nb_available_rb[CC_id]; - eNB->eNB_stats[CC_id].dlsch_bytes_tx=0; - eNB->eNB_stats[CC_id].dlsch_pdus_tx=0; - } - - /// CALLING Pre_Processor for downlink scheduling (Returns estimation of RBs required by each UE and the allocation on sub-band) - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR,VCD_FUNCTION_IN); - start_meas(&eNB->schedule_dlsch_preprocessor); - dlsch_scheduler_pre_processor(module_idP, - frameP, - subframeP, - N_RBG, - mbsfn_flag); - stop_meas(&eNB->schedule_dlsch_preprocessor); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR,VCD_FUNCTION_OUT); - - - for (CC_id=0; CC_id0) - continue; - - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { - continue_flag=0; // reset the flag to allow allocation for the remaining UEs - rnti = UE_RNTI(module_idP,UE_id); - eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); - ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; - - if (rnti==NOT_A_RNTI) { - LOG_D(MAC,"Cannot find rnti for UE_id %d (num_UEs %d)\n",UE_id,UE_list->num_UEs); - // mac_xface->macphy_exit("Cannot find rnti for UE_id"); - continue_flag=1; - } - - if (eNB_UE_stats==NULL) { - LOG_D(MAC,"[eNB] Cannot find eNB_UE_stats\n"); - // mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); - continue_flag=1; - } - - if ((ue_sched_ctl->pre_nb_available_rbs[CC_id] == 0) || // no RBs allocated - CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,aggregation,rnti) - ) { - LOG_D(MAC,"[eNB %d] Frame %d : no RB allocated for UE %d on CC_id %d: continue \n", - module_idP, frameP, UE_id, CC_id); - //if(mac_xface->get_transmission_mode(module_idP,rnti)==5) - continue_flag=1; //to next user (there might be rbs availiable for other UEs in TM5 - // else - // break; - } - - if (frame_parms[CC_id]->frame_type == TDD) { - set_ue_dai (subframeP, - frame_parms[CC_id]->tdd_config, - UE_id, - CC_id, - UE_list); - // update UL DAI after DLSCH scheduling - set_ul_DAI(module_idP,UE_id,CC_id,frameP,subframeP,frame_parms); - } - - if (continue_flag == 1 ) { - add_ue_dlsch_info(module_idP, - CC_id, - UE_id, - subframeP, - S_DL_NONE); - continue; - } - - nb_available_rb = ue_sched_ctl->pre_nb_available_rbs[CC_id]; - harq_pid = ue_sched_ctl->harq_pid[CC_id]; - round = ue_sched_ctl->round[CC_id]; - UE_list->eNB_UE_stats[CC_id][UE_id].crnti= rnti; - UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status=mac_eNB_get_rrc_status(module_idP,rnti); - UE_list->eNB_UE_stats[CC_id][UE_id].harq_pid = harq_pid; - UE_list->eNB_UE_stats[CC_id][UE_id].harq_round = round; - - sdu_length_total=0; - num_sdus=0; - - /* - DevCheck(((eNB_UE_stats->DL_cqi[0] < MIN_CQI_VALUE) || (eNB_UE_stats->DL_cqi[0] > MAX_CQI_VALUE)), - eNB_UE_stats->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE); - */ - eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]]; - eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs); - - -#ifdef EXMIMO - - if (mac_xface->get_transmission_mode(module_idP,CC_id, rnti)==5) { - eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16); - } - -#endif - - // store stats - UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->DL_cqi[0]; - - // initializing the rb allocation indicator for each UE - for(j=0; jN_RBG; j++) { - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = 0; - } - - LOG_D(MAC,"[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, rrc %d)\n", - module_idP, frameP, UE_id,CC_id,rnti,harq_pid, round,nb_available_rb, - eNB_UE_stats->DL_cqi[0], eNB_UE_stats->dlsch_mcs1, - UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status); - - - // Note this code is for a specific DCI format - DLSCH_dci = (void *)UE_list->UE_template[CC_id][UE_id].DLSCH_DCI[harq_pid]; - - - /* process retransmission */ - - if (round > 0) { - - if (frame_parms[CC_id]->frame_type == TDD) { - UE_list->UE_template[CC_id][UE_id].DAI++; - update_ul_dci(module_idP,CC_id,rnti,UE_list->UE_template[CC_id][UE_id].DAI); - LOG_D(MAC,"DAI update: CC_id %d subframeP %d: UE %d, DAI %d\n", - CC_id,subframeP,UE_id,UE_list->UE_template[CC_id][UE_id].DAI); - } - - // get freq_allocation - nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; - - if (nb_rb <= nb_available_rb) { - - if(nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { - for(j=0; jN_RBG; j++) { // for indicating the rballoc for each sub-band - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; - } - } else { - nb_rb_temp = nb_rb; - j = 0; - - while((nb_rb_temp > 0) && (jN_RBG)) { - if(ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 1) { - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; - - if((j == frame_parms[CC_id]->N_RBG-1) && - ((frame_parms[CC_id]->N_RB_DL == 25)|| - (frame_parms[CC_id]->N_RB_DL == 50))) { - nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id]+1; - } else { - nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id]; - } - } - - j = j+1; - } - } - - nb_available_rb -= nb_rb; - aggregation = process_ue_cqi(module_idP,UE_id); - - - PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb; - PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].dl_pow_off = ue_sched_ctl->dl_pow_off[CC_id]; - - for(j=0; jN_RBG; j++) { - PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j]; - } - - switch (mac_xface->get_transmission_mode(module_idP,CC_id,rnti)) { - case 1: - case 2: - default: - switch (frame_parms[CC_id]->N_RB_DL) { - case 6: - if (frame_parms[CC_id]->frame_type == TDD) { - // ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - LOG_D(MAC,"[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, dai %d, mcs %d\n", - module_idP,CC_id,harq_pid,round,(UE_list->UE_template[CC_id][UE_id].DAI-1), - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->mcs); - } else { - // ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rv = round&3; - LOG_D(MAC,"[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, mcs %d\n", - module_idP,CC_id,harq_pid,round,((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->mcs); - - } - - break; - - case 25: - if (frame_parms[CC_id]->frame_type == TDD) { - // ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - LOG_D(MAC,"[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, dai %d, mcs %d\n", - module_idP,CC_id,harq_pid,round,(UE_list->UE_template[CC_id][UE_id].DAI-1), - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs); - } else { - // ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = round&3; - LOG_D(MAC,"[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, mcs %d\n", - module_idP,CC_id,harq_pid,round,((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs); - - } - - break; - - case 50: - if (frame_parms[CC_id]->frame_type == TDD) { - // ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - LOG_D(MAC,"[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, dai %d, mcs %d\n", - module_idP,CC_id,harq_pid,round,(UE_list->UE_template[CC_id][UE_id].DAI-1), - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->mcs); - } else { - // ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rv = round&3; - LOG_D(MAC,"[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, mcs %d\n", - module_idP,CC_id,harq_pid,round,((DCI1_10MHz_FDD_t*)DLSCH_dci)->mcs); - - } - - break; - - case 100: - if (frame_parms[CC_id]->frame_type == TDD) { - // ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - LOG_D(MAC,"[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, dai %d, mcs %d\n", - module_idP,CC_id,harq_pid,round,(UE_list->UE_template[CC_id][UE_id].DAI-1), - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->mcs); - } else { - // ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rv = round&3; - LOG_D(MAC,"[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, mcs %d\n", - module_idP,CC_id,harq_pid,round,((DCI1_20MHz_FDD_t*)DLSCH_dci)->mcs); - - } - - break; - } - - break; - - case 4: - // if (nb_rb>10) { - ((DCI2_5MHz_2A_TDD_t*)DLSCH_dci)->ndi1 = 0; - ((DCI2_5MHz_2A_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2_5MHz_2A_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - // } - //else { - // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->ndi1 = 0; - // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->rv1 = round&3; - // ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - // } - break; - - case 5: - // if(nb_rb>10){ - //((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->mcs = eNB_UE_stats->DL_cqi[0]<<1; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - - if(ue_sched_ctl->dl_pow_off[CC_id] == 2) { - ue_sched_ctl->dl_pow_off[CC_id] = 1; - } - - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = ue_sched_ctl->dl_pow_off[CC_id]; - // } - break; - - case 6: - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 0; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = 1;//dl_pow_off[UE_id]; - break; - } - - add_ue_dlsch_info(module_idP, - CC_id, - UE_id, - subframeP, - S_DL_SCHEDULED); - - //eNB_UE_stats->dlsch_trials[round]++; - UE_list->eNB_UE_stats[CC_id][UE_id].num_retransmission+=1; - UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used_retx=nb_rb; - UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_retx+=nb_rb; - UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1=eNB_UE_stats->dlsch_mcs1; - UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2=eNB_UE_stats->dlsch_mcs1; - } else { - LOG_D(MAC,"[eNB %d] Frame %d CC_id %d : don't schedule UE %d, its retransmission takes more resources than we have\n", - module_idP, frameP, CC_id, UE_id); - } - } else { /* This is a potentially new SDU opportunity */ - - rlc_status.bytes_in_buffer = 0; - // Now check RLC information to compute number of required RBs - // get maximum TBS size for RLC request - //TBS = mac_xface->get_TBS(eNB_UE_stats->DL_cqi[0]<<1,nb_available_rb); - TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_available_rb); - // check first for RLC data on DCCH - // add the length for all the control elements (timing adv, drx, etc) : header + payload - - ta_len = (ue_sched_ctl->ta_update!=0) ? 2 : 0; - - header_len_dcch = 2; // 2 bytes DCCH SDU subheader - - if ( TBS-ta_len-header_len_dcch > 0 ) { - rlc_status = mac_rlc_status_ind( - module_idP, - rnti, - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DCCH, - (TBS-ta_len-header_len_dcch)); // transport block set size - - sdu_lengths[0]=0; - - if (rlc_status.bytes_in_buffer > 0) { // There is DCCH to transmit - LOG_D(MAC,"[eNB %d] Frame %d, DL-DCCH->DLSCH CC_id %d, Requesting %d bytes from RLC (RRC message)\n", - module_idP,frameP,CC_id,TBS-header_len_dcch); - sdu_lengths[0] += mac_rlc_data_req( - module_idP, - rnti, - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DCCH, - (char *)&dlsch_buffer[sdu_lengths[0]]); - - T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), T_INT(subframeP), - T_INT(harq_pid), T_INT(DCCH), T_INT(sdu_lengths[0])); - - LOG_D(MAC,"[eNB %d][DCCH] CC_id %d Got %d bytes from RLC\n",module_idP,CC_id,sdu_lengths[0]); - sdu_length_total = sdu_lengths[0]; - sdu_lcids[0] = DCCH; - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH]+=1; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH]+=sdu_lengths[0]; - num_sdus = 1; -#ifdef DEBUG_eNB_SCHEDULER - LOG_T(MAC,"[eNB %d][DCCH] CC_id %d Got %d bytes :",module_idP,CC_id,sdu_lengths[0]); - - for (j=0; j 0 ) { - rlc_status = mac_rlc_status_ind( - module_idP, - rnti, - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DCCH+1, - (TBS-ta_len-header_len_dcch-sdu_length_total)); // transport block set size less allocations for timing advance and - // DCCH SDU - - if (rlc_status.bytes_in_buffer > 0) { - LOG_D(MAC,"[eNB %d], Frame %d, DCCH1->DLSCH, CC_id %d, Requesting %d bytes from RLC (RRC message)\n", - module_idP,frameP,CC_id,TBS-header_len_dcch-sdu_length_total); - sdu_lengths[num_sdus] += mac_rlc_data_req( - module_idP, - rnti, - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DCCH+1, - (char *)&dlsch_buffer[sdu_lengths[0]]); - - T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), T_INT(subframeP), - T_INT(harq_pid), T_INT(DCCH+1), T_INT(sdu_lengths[num_sdus])); - - sdu_lcids[num_sdus] = DCCH1; - sdu_length_total += sdu_lengths[num_sdus]; - header_len_dcch += 2; - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DCCH1]+=1; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH1]+=sdu_lengths[num_sdus]; - num_sdus++; - LOG_D(MAC,"[eNB %d] CC_id %d Got %d bytes for DCCH from RLC\n",module_idP,CC_id,sdu_lengths[0]); - } - } - - // check for DTCH and update header information - // here we should loop over all possible DTCH - - header_len_dtch = 3; // 3 bytes DTCH SDU subheader - - LOG_D(MAC,"[eNB %d], Frame %d, DTCH->DLSCH, CC_id %d, Checking RLC status (rab %d, tbs %d, len %d)\n", - module_idP,frameP,CC_id,DTCH,TBS, - TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); - - if (TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch > 0 ) { - rlc_status = mac_rlc_status_ind( - module_idP, - rnti, - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DTCH, - TBS-ta_len-header_len_dcch-sdu_length_total-header_len_dtch); - - if (rlc_status.bytes_in_buffer > 0) { - - LOG_D(MAC,"[eNB %d][USER-PLANE DEFAULT DRB], Frame %d, DTCH->DLSCH, CC_id %d, Requesting %d bytes from RLC (hdr len dtch %d)\n", - module_idP,frameP,CC_id,TBS-header_len_dcch-sdu_length_total-header_len_dtch,header_len_dtch); - sdu_lengths[num_sdus] = mac_rlc_data_req( - module_idP, - rnti, - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DTCH, - (char*)&dlsch_buffer[sdu_length_total]); - - T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), T_INT(subframeP), - T_INT(harq_pid), T_INT(DTCH), T_INT(sdu_lengths[num_sdus])); - - LOG_D(MAC,"[eNB %d][USER-PLANE DEFAULT DRB] CC_id %d Got %d bytes for DTCH %d \n", - module_idP,CC_id,sdu_lengths[num_sdus],DTCH); - sdu_lcids[num_sdus] = DTCH; - sdu_length_total += sdu_lengths[num_sdus]; - UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_tx[DTCH]+=1; - UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DTCH]+=sdu_lengths[num_sdus]; - - if (sdu_lengths[num_sdus] < 128) { - header_len_dtch=2; - } - - num_sdus++; - } else { - header_len_dtch = 0; - } - } - - // there is a payload - if (((sdu_length_total + header_len_dcch + header_len_dtch )> 0)) { - - // Now compute number of required RBs for total sdu length - // Assume RAH format 2 - // adjust header lengths - header_len_dcch_tmp = header_len_dcch; - header_len_dtch_tmp = header_len_dtch; - - if (header_len_dtch==0) { - header_len_dcch = (header_len_dcch >0) ? 1 : header_len_dcch; // remove length field - } else { - header_len_dtch = (header_len_dtch > 0) ? 1 :header_len_dtch; // remove length field for the last SDU - } - - - mcs = eNB_UE_stats->dlsch_mcs1; - - if (mcs==0) { - nb_rb = 4; // don't let the TBS get too small - } else { - nb_rb=min_rb_unit[CC_id]; - } - - TBS = mac_xface->get_TBS_DL(mcs,nb_rb); - - while (TBS < (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) { - nb_rb += min_rb_unit[CC_id]; // - - if (nb_rb>nb_available_rb) { // if we've gone beyond the maximum number of RBs - // (can happen if N_RB_DL is odd) - TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_available_rb); - nb_rb = nb_available_rb; - break; - } - - TBS = mac_xface->get_TBS_DL(eNB_UE_stats->dlsch_mcs1,nb_rb); - } - - if(nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { - for(j=0; jN_RBG; j++) { // for indicating the rballoc for each sub-band - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; - } - } else { - nb_rb_temp = nb_rb; - j = 0; - - while((nb_rb_temp > 0) && (jN_RBG)) { - if(ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 1) { - UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] = ue_sched_ctl->rballoc_sub_UE[CC_id][j]; - - if ((j == frame_parms[CC_id]->N_RBG-1) && - ((frame_parms[CC_id]->N_RB_DL == 25)|| - (frame_parms[CC_id]->N_RB_DL == 50))) { - nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id]+1; - } else { - nb_rb_temp = nb_rb_temp - min_rb_unit[CC_id]; - } - } - - j = j+1; - } - } - - PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb; - PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].dl_pow_off = ue_sched_ctl->dl_pow_off[CC_id]; - - for(j=0; jN_RBG; j++) { - PHY_vars_eNB_g[module_idP][CC_id]->mu_mimo_mode[UE_id].rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j]; - - } - - // decrease mcs until TBS falls below required length - while ((TBS > (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) && (mcs>0)) { - mcs--; - TBS = mac_xface->get_TBS_DL(mcs,nb_rb); - } - - // if we have decreased too much or we don't have enough RBs, increase MCS - while ((TBS < (sdu_length_total + header_len_dcch + header_len_dtch + ta_len)) && ((( ue_sched_ctl->dl_pow_off[CC_id]>0) && (mcs<28)) - || ( (ue_sched_ctl->dl_pow_off[CC_id]==0) && (mcs<=15)))) { - mcs++; - TBS = mac_xface->get_TBS_DL(mcs,nb_rb); - } - - LOG_D(MAC,"dlsch_mcs before and after the rate matching = (%d, %d)\n",eNB_UE_stats->dlsch_mcs1, mcs); - -#ifdef DEBUG_eNB_SCHEDULER - LOG_D(MAC,"[eNB %d] CC_id %d Generated DLSCH header (mcs %d, TBS %d, nb_rb %d)\n", - module_idP,CC_id,mcs,TBS,nb_rb); - // msg("[MAC][eNB ] Reminder of DLSCH with random data %d %d %d %d \n", - // TBS, sdu_length_total, offset, TBS-sdu_length_total-offset); -#endif - - if ((TBS - header_len_dcch - header_len_dtch - sdu_length_total - ta_len) <= 2) { - padding = (TBS - header_len_dcch - header_len_dtch - sdu_length_total - ta_len); - post_padding = 0; - } else { - padding = 0; - - // adjust the header len - if (header_len_dtch==0) { - header_len_dcch = header_len_dcch_tmp; - } else { //if (( header_len_dcch==0)&&((header_len_dtch==1)||(header_len_dtch==2))) - header_len_dtch = header_len_dtch_tmp; - } - - post_padding = TBS - sdu_length_total - header_len_dcch - header_len_dtch - ta_len ; // 1 is for the postpadding header - } - - - offset = generate_dlsch_header((unsigned char*)UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], - // offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0], - num_sdus, //num_sdus - sdu_lengths, // - sdu_lcids, - 255, // no drx - ue_sched_ctl->ta_update, // timing advance - NULL, // contention res id - padding, - post_padding); - - //#ifdef DEBUG_eNB_SCHEDULER - if (ue_sched_ctl->ta_update) { - LOG_I(MAC, - "[eNB %d][DLSCH] Frame %d Generate header for UE_id %d on CC_id %d: sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_dcch %d, header_dtch %d\n", - module_idP,frameP, UE_id, CC_id, sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset, - ue_sched_ctl->ta_update,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch); - } - - //#endif -#ifdef DEBUG_eNB_SCHEDULER - LOG_T(MAC,"[eNB %d] First 16 bytes of DLSCH : \n"); - - for (i=0; i<16; i++) { - LOG_T(MAC,"%x.",dlsch_buffer[i]); - } - - LOG_T(MAC,"\n"); -#endif - // cycle through SDUs and place in dlsch_buffer - memcpy(&UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0][offset],dlsch_buffer,sdu_length_total); - // memcpy(&eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0][offset],dcch_buffer,sdu_lengths[0]); - - // fill remainder of DLSCH with random data - for (j=0; j<(TBS-sdu_length_total-offset); j++) { - UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0][offset+sdu_length_total+j] = (char)(taus()&0xff); - } - - //eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0][offset+sdu_lengths[0]+j] = (char)(taus()&0xff); - if (opt_enabled == 1) { - trace_pdu(1, (uint8_t *)UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], - TBS, module_idP, 3, UE_RNTI(module_idP,UE_id), - eNB->subframe,0,0); - LOG_D(OPT,"[eNB %d][DLSCH] CC_id %d Frame %d rnti %x with size %d\n", - module_idP, CC_id, frameP, UE_RNTI(module_idP,UE_id), TBS); - } - - T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), T_INT(subframeP), - T_INT(harq_pid), T_BUFFER(UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], TBS)); - - aggregation = process_ue_cqi(module_idP,UE_id); - UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid] = nb_rb; - - add_ue_dlsch_info(module_idP, - CC_id, - UE_id, - subframeP, - S_DL_SCHEDULED); - // store stats - eNB->eNB_stats[CC_id].dlsch_bytes_tx+=sdu_length_total; - eNB->eNB_stats[CC_id].dlsch_pdus_tx+=1; - - UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used = nb_rb; - UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used += nb_rb; - UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1=eNB_UE_stats->dlsch_mcs1; - UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2=mcs; - UE_list->eNB_UE_stats[CC_id][UE_id].TBS = TBS; - - UE_list->eNB_UE_stats[CC_id][UE_id].overhead_bytes= TBS- sdu_length_total; - UE_list->eNB_UE_stats[CC_id][UE_id].total_sdu_bytes+= sdu_length_total; - UE_list->eNB_UE_stats[CC_id][UE_id].total_pdu_bytes+= TBS; - UE_list->eNB_UE_stats[CC_id][UE_id].total_num_pdus+=1; - - if (frame_parms[CC_id]->frame_type == TDD) { - UE_list->UE_template[CC_id][UE_id].DAI++; - // printf("DAI update: subframeP %d: UE %d, DAI %d\n",subframeP,UE_id,UE_list->UE_template[CC_id][UE_id].DAI); -//#warning only for 5MHz channel - update_ul_dci(module_idP,CC_id,rnti,UE_list->UE_template[CC_id][UE_id].DAI); - } - - // do PUCCH power control - // this is the normalized RX power - eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); - normalized_rx_power = eNB_UE_stats->Po_PUCCH_dBm; - target_rx_power = mac_xface->get_target_pucch_rx_power(module_idP,CC_id) + 20; - - // this assumes accumulated tpc - // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out - int32_t framex10psubframe = UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame*10+UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe; - if (((framex10psubframe+10)<=(frameP*10+subframeP)) || //normal case - ((framex10psubframe>(frameP*10+subframeP)) && (((10240-framex10psubframe+frameP*10+subframeP)>=10)))) //frame wrap-around - if (eNB_UE_stats->Po_PUCCH_update == 1) { - eNB_UE_stats->Po_PUCCH_update = 0; - - UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame=frameP; - UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe=subframeP; - - if (normalized_rx_power>(target_rx_power+1)) { - tpc = 0; //-1 - tpc_accumulated--; - } else if (normalized_rx_power<(target_rx_power-1)) { - tpc = 2; //+1 - tpc_accumulated++; - } else { - tpc = 1; //0 - } - /* - LOG_I(MAC,"[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n", - module_idP,frameP, subframeP,harq_pid,tpc, - tpc_accumulated,normalized_rx_power,target_rx_power);*/ - - } // Po_PUCCH has been updated - else { - tpc = 1; //0 - } // time to do TPC update - else { - tpc = 1; //0 - } - - switch (mac_xface->get_transmission_mode(module_idP,CC_id,rnti)) { - case 1: - case 2: - default: - if (frame_parms[CC_id]->frame_type == TDD) { - switch (frame_parms[CC_id]->N_RB_DL) { - case 6: - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->TPC = tpc; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - break; - - case 25: - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->TPC = tpc; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - LOG_D(MAC,"Format1 DCI: harq_pid %d, ndi %d\n",harq_pid,((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi); - break; - - case 50: - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->TPC = tpc; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - break; - - case 100: - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->TPC = tpc; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - break; - - default: - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->TPC = tpc; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - break; - } - } else { - switch (frame_parms[CC_id]->N_RB_DL) { - case 6: - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->TPC = tpc; - break; - - case 25: - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->TPC = tpc; - break; - - case 50: - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->TPC = tpc; - break; - - case 100: - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->TPC = tpc; - break; - - default: - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->TPC = tpc; - break; - } - } - - break; - - case 3: - if (frame_parms[CC_id]->frame_type == TDD) { - switch (frame_parms[CC_id]->N_RB_DL) { - case 6: - ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->ndi1 = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->rv1 = 0; - - // deactivate TB2 - ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->mcs2 = 0; - ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->rv2 = 1; - - ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->TPC = tpc; - break; - - case 25: - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->ndi1 = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->rv1 = 0; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->TPC = tpc; - - // deactivate TB2 - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->mcs2 = 0; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->rv2 = 1; - - LOG_D(MAC,"Format1 DCI: harq_pid %d, ndi %d\n",harq_pid,((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->ndi1); - break; - - case 50: - ((DCI2A_10MHz_2A_TDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2A_10MHz_2A_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2A_10MHz_2A_TDD_t*)DLSCH_dci)->ndi1 = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI2A_10MHz_2A_TDD_t*)DLSCH_dci)->rv1 = 0; - ((DCI2A_10MHz_2A_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - ((DCI2A_10MHz_2A_TDD_t*)DLSCH_dci)->TPC = tpc; - - // deactivate TB2 - ((DCI2A_10MHz_2A_TDD_t*)DLSCH_dci)->mcs2 = 0; - ((DCI2A_10MHz_2A_TDD_t*)DLSCH_dci)->rv2 = 1; - break; - - case 100: - ((DCI2A_20MHz_2A_TDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2A_20MHz_2A_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2A_20MHz_2A_TDD_t*)DLSCH_dci)->ndi1 = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI2A_20MHz_2A_TDD_t*)DLSCH_dci)->rv1 = 0; - ((DCI2A_20MHz_2A_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - ((DCI2A_20MHz_2A_TDD_t*)DLSCH_dci)->TPC = tpc; - - // deactivate TB2 - ((DCI2A_20MHz_2A_TDD_t*)DLSCH_dci)->mcs2 = 0; - ((DCI2A_20MHz_2A_TDD_t*)DLSCH_dci)->rv2 = 1; - break; - - default: - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->ndi1 = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->rv1 = 0; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->TPC = tpc; - - // deactivate TB2 - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->mcs2 = 0; - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->rv2 = 1; - break; - } - } else { - switch (frame_parms[CC_id]->N_RB_DL) { - case 6: - ((DCI2A_1_5MHz_2A_FDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2A_1_5MHz_2A_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2A_1_5MHz_2A_FDD_t*)DLSCH_dci)->ndi1 = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI2A_1_5MHz_2A_FDD_t*)DLSCH_dci)->rv1 = 0; - ((DCI2A_1_5MHz_2A_FDD_t*)DLSCH_dci)->TPC = tpc; - - // deactivate TB2 - ((DCI2A_1_5MHz_2A_FDD_t*)DLSCH_dci)->mcs2 = 0; - ((DCI2A_1_5MHz_2A_FDD_t*)DLSCH_dci)->rv2 = 1; - break; - - case 25: - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->ndi1 = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->rv1 = 0; - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->TPC = tpc; - - // deactivate TB2 - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->mcs2 = 0; - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->rv2 = 1; - break; - - case 50: - ((DCI2A_10MHz_2A_FDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2A_10MHz_2A_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2A_10MHz_2A_FDD_t*)DLSCH_dci)->ndi1 = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI2A_10MHz_2A_FDD_t*)DLSCH_dci)->rv1 = 0; - ((DCI2A_10MHz_2A_FDD_t*)DLSCH_dci)->TPC = tpc; - // deactivate TB2 - ((DCI2A_10MHz_2A_FDD_t*)DLSCH_dci)->mcs2 = 0; - ((DCI2A_10MHz_2A_FDD_t*)DLSCH_dci)->rv2 = 1; - break; - - case 100: - ((DCI2A_20MHz_2A_FDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2A_20MHz_2A_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2A_20MHz_2A_FDD_t*)DLSCH_dci)->ndi1 = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI2A_20MHz_2A_FDD_t*)DLSCH_dci)->rv1 = 0; - ((DCI2A_20MHz_2A_FDD_t*)DLSCH_dci)->TPC = tpc; - - // deactivate TB2 - ((DCI2A_20MHz_2A_FDD_t*)DLSCH_dci)->mcs2 = 0; - ((DCI2A_20MHz_2A_FDD_t*)DLSCH_dci)->rv2 = 1; - break; - - default: - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->ndi1 = 1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->rv1 = 0; - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->TPC = tpc; - - // deactivate TB2 - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->mcs2 = 0; - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->rv2 = 1; - break; - } - } - - break; - - case 4: - // if (nb_rb>10) { - ((DCI2_5MHz_2A_TDD_t*)DLSCH_dci)->mcs1 = mcs; - ((DCI2_5MHz_2A_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2_5MHz_2A_TDD_t*)DLSCH_dci)->ndi1 = 1; - ((DCI2_5MHz_2A_TDD_t*)DLSCH_dci)->rv1 = round&3; - ((DCI2_5MHz_2A_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - ((DCI2_5MHz_2A_TDD_t*)DLSCH_dci)->TPC = tpc; - - //} - /* else { - ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->mcs1 = eNB_UE_stats->DL_cqi[0]; - ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->ndi1 = 1; - ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->rv1 = round&3; - ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->tpmi = 5; - ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - }*/ - break; - - case 5: - - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 1; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->TPC = tpc; - - if(ue_sched_ctl->dl_pow_off[CC_id] == 2) { - ue_sched_ctl->dl_pow_off[CC_id] = 1; - } - - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = ue_sched_ctl->dl_pow_off[CC_id]; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->tpmi = 5; - break; - - case 6: - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->mcs = mcs; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->ndi = 1; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rv = round&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dai = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->dl_power_off = 1; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->tpmi = 5; - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->TPC = tpc; - - break; - } - - // Toggle NDI for next time - LOG_D(MAC,"CC_id %d Frame %d, subframeP %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n", - CC_id, frameP,subframeP,UE_id, - UE_list->UE_template[CC_id][UE_id].rnti,harq_pid,UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]); - UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]=1-UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid]; - } else { // There is no data from RLC or MAC header, so don't schedule - - } - } - - if (frame_parms[CC_id]->frame_type == TDD) { - set_ul_DAI(module_idP,UE_id,CC_id,frameP,subframeP,frame_parms); - } - - } // UE_id loop - } // CC_id loop - - - stop_meas(&eNB->schedule_dlsch); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH,VCD_FUNCTION_OUT); - -} +// changes to pre-processor for eMTC //------------------------------------------------------------------------------ void -fill_DLSCH_dci( - module_id_t module_idP, - frame_t frameP, - sub_frame_t subframeP, - int* mbsfn_flagP - ) +schedule_ue_spec(module_id_t module_idP, + frame_t frameP, sub_frame_t subframeP, int *mbsfn_flag) //------------------------------------------------------------------------------ { - // loop over all allocated UEs and compute frequency allocations for PDSCH - int UE_id = -1; - uint8_t /* first_rb, */ nb_rb=3; - rnti_t rnti; - //unsigned char *vrb_map; - uint8_t rballoc_sub[25]; - //uint8_t number_of_subbands=13; - //unsigned char round; - unsigned char harq_pid; - void *DLSCH_dci=NULL; - DCI_PDU *DCI_pdu; - int i; - //void *BCCH_alloc_pdu; - int size_bits,size_bytes; - int CC_id; - eNB_MAC_INST *eNB =&eNB_mac_inst[module_idP]; - UE_list_t *UE_list = &eNB->UE_list; - //RA_TEMPLATE *RA_template; + uint8_t CC_id; + int UE_id; + unsigned char aggregation; + mac_rlc_status_resp_t rlc_status; + unsigned char header_len_dcch = 0, header_len_dcch_tmp = 0; + unsigned char header_len_dtch = 0, header_len_dtch_tmp = + 0, header_len_dtch_last = 0; + unsigned char ta_len = 0; + unsigned char sdu_lcids[NB_RB_MAX], lcid, offset, num_sdus = 0; + uint16_t nb_rb, nb_rb_temp, nb_available_rb; + uint16_t TBS, j, sdu_lengths[NB_RB_MAX], rnti, padding = + 0, post_padding = 0; + unsigned char dlsch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; + unsigned char round = 0; + unsigned char harq_pid = 0; + eNB_UE_STATS *eNB_UE_stats = NULL; + uint16_t sdu_length_total = 0; - start_meas(&eNB->fill_DLSCH_dci); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_FILL_DLSCH_DCI,VCD_FUNCTION_IN); + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc = eNB->common_channels; + UE_list_t *UE_list = &eNB->UE_list; + int continue_flag = 0; + int32_t normalized_rx_power, target_rx_power; + int32_t tpc = 1; + static int32_t tpc_accumulated = 0; + UE_sched_ctrl *ue_sched_ctl; + int mcs; + int i; + int min_rb_unit[MAX_NUM_CCs]; + int N_RB_DL[MAX_NUM_CCs]; + int total_nb_available_rb[MAX_NUM_CCs]; + int N_RBG[MAX_NUM_CCs]; + nfapi_dl_config_request_body_t *dl_req; + nfapi_dl_config_request_pdu_t *dl_config_pdu; + int tdd_sfa; + int ta_update; - for (CC_id=0; CC_idhead == -1) { + return; + } +#endif - if (mbsfn_flagP[CC_id]>0) - continue; - - DCI_pdu = &eNB->common_channels[CC_id].DCI_pdu; - - - // UE specific DCIs - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { - LOG_T(MAC,"CC_id %d, UE_id: %d => status %d\n",CC_id,UE_id,eNB_dlsch_info[module_idP][CC_id][UE_id].status); - - if (eNB_dlsch_info[module_idP][CC_id][UE_id].status == S_DL_SCHEDULED) { - - // clear scheduling flag - eNB_dlsch_info[module_idP][CC_id][UE_id].status = S_DL_WAITING; - rnti = UE_RNTI(module_idP,UE_id); - // mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0); - harq_pid = UE_list->UE_sched_ctrl[UE_id].harq_pid[CC_id]; - nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; - - DLSCH_dci = (void *)UE_list->UE_template[CC_id][UE_id].DLSCH_DCI[harq_pid]; + start_meas(&eNB->schedule_dlsch); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH, VCD_FUNCTION_IN); - /// Synchronizing rballoc with rballoc_sub - for(i=0; ilte_frame_parms.N_RBG; i++) { - rballoc_sub[i] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][i]; - } + // for TDD: check that we have to act here, otherwise return + if (cc[0].tdd_Config) { + tdd_sfa = cc[0].tdd_Config->subframeAssignment; + switch (subframeP) { + case 0: + // always continue + break; + case 1: + return; + break; + case 2: + return; + break; + case 3: + if ((tdd_sfa != 2) && (tdd_sfa != 5)) + return; + break; + case 4: + if ((tdd_sfa != 1) && (tdd_sfa != 2) && (tdd_sfa != 4) + && (tdd_sfa != 5)) + return; + break; + case 5: + break; + case 6: + case 7: + if ((tdd_sfa != 1) && (tdd_sfa != 2) && (tdd_sfa != 4) + && (tdd_sfa != 5)) + return; + break; + case 8: + if ((tdd_sfa != 2) && (tdd_sfa != 3) && (tdd_sfa != 4) + && (tdd_sfa != 5)) + return; + break; + case 9: + if ((tdd_sfa != 1) && (tdd_sfa != 3) && (tdd_sfa != 4) + && (tdd_sfa != 6)) + return; + break; - switch(mac_xface->get_transmission_mode(module_idP,CC_id,rnti)) { - default: + } + } + //weight = get_ue_weight(module_idP,UE_id); + aggregation = 2; + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + N_RB_DL[CC_id] = to_prb(cc[CC_id].mib->message.dl_Bandwidth); + min_rb_unit[CC_id] = get_min_rb_unit(module_idP, CC_id); + // get number of PRBs less those used by common channels + total_nb_available_rb[CC_id] = N_RB_DL[CC_id]; + for (i = 0; i < N_RB_DL[CC_id]; i++) + if (cc[CC_id].vrb_map[i] != 0) + total_nb_available_rb[CC_id]--; - case 1: + N_RBG[CC_id] = to_rbg(cc[CC_id].mib->message.dl_Bandwidth); - case 2: - LOG_D(MAC,"[eNB %d] CC_id %d Adding UE %d spec DCI for %d PRBS \n",module_idP, CC_id, UE_id, nb_rb); + // store the global enb stats: + eNB->eNB_stats[CC_id].num_dlactive_UEs = UE_list->num_UEs; + eNB->eNB_stats[CC_id].available_prbs = + total_nb_available_rb[CC_id]; + eNB->eNB_stats[CC_id].total_available_prbs += + total_nb_available_rb[CC_id]; + eNB->eNB_stats[CC_id].dlsch_bytes_tx = 0; + eNB->eNB_stats[CC_id].dlsch_pdus_tx = 0; + } - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI1_1_5MHz_TDD_t); - size_bits = sizeof_DCI1_1_5MHz_TDD_t; - break; + /// CALLING Pre_Processor for downlink scheduling (Returns estimation of RBs required by each UE and the allocation on sub-band) - case 25: - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI1_5MHz_TDD_t); - size_bits = sizeof_DCI1_5MHz_TDD_t; - break; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR, VCD_FUNCTION_IN); + start_meas(&eNB->schedule_dlsch_preprocessor); + dlsch_scheduler_pre_processor(module_idP, + frameP, subframeP, N_RBG, mbsfn_flag); + stop_meas(&eNB->schedule_dlsch_preprocessor); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR, VCD_FUNCTION_OUT); - case 50: - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI1_10MHz_TDD_t); - size_bits = sizeof_DCI1_10MHz_TDD_t; - break; + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + LOG_D(MAC, "doing schedule_ue_spec for CC_id %d\n", CC_id); - case 100: - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI1_20MHz_TDD_t); - size_bits = sizeof_DCI1_20MHz_TDD_t; - break; + dl_req = &eNB->DL_req[CC_id].dl_config_request_body; - default: - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI1_5MHz_TDD_t); - size_bits = sizeof_DCI1_5MHz_TDD_t; - break; + if (mbsfn_flag[CC_id] > 0) + continue; + + for (UE_id = UE_list->head; UE_id >= 0; + UE_id = UE_list->next[UE_id]) { + continue_flag = 0; // reset the flag to allow allocation for the remaining UEs + rnti = UE_RNTI(module_idP, UE_id); + eNB_UE_stats = &UE_list->eNB_UE_stats[CC_id][UE_id]; + ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + + + if (rnti == NOT_A_RNTI) { + LOG_D(MAC, "Cannot find rnti for UE_id %d (num_UEs %d)\n", + UE_id, UE_list->num_UEs); + continue_flag = 1; + } + + if (eNB_UE_stats == NULL) { + LOG_D(MAC, "[eNB] Cannot find eNB_UE_stats\n"); + continue_flag = 1; + } + + if (continue_flag != 1) { + switch (get_tmode(module_idP, CC_id, UE_id)) { + case 1: + case 2: + case 7: + aggregation = + get_aggregation(get_bw_index(module_idP, CC_id), + ue_sched_ctl->dl_cqi[CC_id], + format1); + break; + case 3: + aggregation = + get_aggregation(get_bw_index(module_idP, CC_id), + ue_sched_ctl->dl_cqi[CC_id], + format2A); + break; + default: + LOG_W(MAC, "Unsupported transmission mode %d\n", + get_tmode(module_idP, CC_id, UE_id)); + aggregation = 2; + } + } + /* if (continue_flag != 1 */ + if ((ue_sched_ctl->pre_nb_available_rbs[CC_id] == 0) || // no RBs allocated + CCE_allocation_infeasible(module_idP, CC_id, 1, subframeP, + aggregation, rnti)) { + LOG_D(MAC, + "[eNB %d] Frame %d : no RB allocated for UE %d on CC_id %d: continue \n", + module_idP, frameP, UE_id, CC_id); + continue_flag = 1; //to next user (there might be rbs availiable for other UEs in TM5 + } + + if (cc[CC_id].tdd_Config != NULL) { //TDD + set_ue_dai(subframeP, + UE_id, + CC_id, + cc[CC_id].tdd_Config->subframeAssignment, + UE_list); + // update UL DAI after DLSCH scheduling + set_ul_DAI(module_idP, UE_id, CC_id, frameP, subframeP); + } + + if (continue_flag == 1) { + add_ue_dlsch_info(module_idP, + CC_id, UE_id, subframeP, S_DL_NONE); + continue; + } +#warning RK->CR This old API call has to be revisited for FAPI, or logic must be changed +#if 0 + /* add "fake" DCI to have CCE_allocation_infeasible work properly for next allocations */ + /* if we don't add it, next allocations may succeed but overall allocations may fail */ + /* will be removed at the end of this function */ + add_ue_spec_dci(&eNB->common_channels[CC_id].DCI_pdu, &(char[]) { + 0}, rnti, 1, aggregation, 1, format1, 0); +#endif + + nb_available_rb = ue_sched_ctl->pre_nb_available_rbs[CC_id]; + + if (cc->tdd_Config) + harq_pid = ((frameP * 10) + subframeP) % 10; + else + harq_pid = ((frameP * 10) + subframeP) & 7; + + round = ue_sched_ctl->round[CC_id][harq_pid]; + + UE_list->eNB_UE_stats[CC_id][UE_id].crnti = rnti; + UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status = + mac_eNB_get_rrc_status(module_idP, rnti); + UE_list->eNB_UE_stats[CC_id][UE_id].harq_pid = harq_pid; + UE_list->eNB_UE_stats[CC_id][UE_id].harq_round = round; + + + if (UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status < + RRC_CONNECTED) + continue; + + sdu_length_total = 0; + num_sdus = 0; + + /* + DevCheck(((eNB_UE_stats->dl_cqi < MIN_CQI_VALUE) || (eNB_UE_stats->dl_cqi > MAX_CQI_VALUE)), + eNB_UE_stats->dl_cqi, MIN_CQI_VALUE, MAX_CQI_VALUE); + */ + if (nfapi_mode) { + eNB_UE_stats->dlsch_mcs1 = 10;//cqi_to_mcs[ue_sched_ctl->dl_cqi[CC_id]]; } - - - } else { - switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI1_1_5MHz_FDD_t); - size_bits=sizeof_DCI1_1_5MHz_FDD_t; - break; - - case 25: - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI1_5MHz_FDD_t); - size_bits=sizeof_DCI1_5MHz_FDD_t; - break; - - case 50: - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI1_10MHz_FDD_t); - size_bits=sizeof_DCI1_10MHz_FDD_t; - break; - - case 100: - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI1_20MHz_FDD_t); - size_bits=sizeof_DCI1_20MHz_FDD_t; - break; - - default: - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI1_5MHz_FDD_t); - size_bits=sizeof_DCI1_5MHz_FDD_t; - break; - } - } - - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - size_bytes, - process_ue_cqi (module_idP,UE_id),//aggregation, - size_bits, - format1, - 0); - - break; - - case 3: - LOG_D(MAC,"[eNB %d] CC_id %d Adding Format 2A UE %d spec DCI for %d PRBS (rb alloc: %x) \n", - module_idP, CC_id, UE_id, nb_rb); - - if (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.frame_type == TDD) { - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2A_1_5MHz_2A_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t); - size_bits = sizeof_DCI2A_1_5MHz_2A_TDD_t; - break; - - case 25: - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI2A_5MHz_2A_TDD_t); - size_bits = sizeof_DCI2A_5MHz_2A_TDD_t; - break; - - case 50: - ((DCI2A_10MHz_2A_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2A_10MHz_2A_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI2A_10MHz_2A_TDD_t); - size_bits = sizeof_DCI2A_10MHz_2A_TDD_t; - break; - - case 100: - ((DCI2A_20MHz_2A_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2A_20MHz_2A_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI2A_20MHz_2A_TDD_t); - size_bits = sizeof_DCI2A_20MHz_2A_TDD_t; - break; - - default: - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2A_5MHz_2A_TDD_t*)DLSCH_dci)->rah = 0; - size_bytes = sizeof(DCI2A_5MHz_2A_TDD_t); - size_bits = sizeof_DCI2A_5MHz_2A_TDD_t; - break; - } - - - } else { - switch(PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - ((DCI2A_1_5MHz_2A_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2A_1_5MHz_2A_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI2A_1_5MHz_2A_FDD_t); - size_bits=sizeof_DCI2A_1_5MHz_2A_FDD_t; - break; - - case 25: - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI2A_5MHz_2A_FDD_t); - size_bits=sizeof_DCI2A_5MHz_2A_FDD_t; - break; - - case 50: - ((DCI2A_10MHz_2A_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2A_10MHz_2A_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI2A_10MHz_2A_FDD_t); - size_bits=sizeof_DCI2A_10MHz_2A_FDD_t; - break; - - case 100: - ((DCI2A_20MHz_2A_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2A_20MHz_2A_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI2A_20MHz_2A_FDD_t); - size_bits=sizeof_DCI2A_20MHz_2A_FDD_t; - break; - - default: - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2A_5MHz_2A_FDD_t*)DLSCH_dci)->rah = 0; - size_bytes=sizeof(DCI2A_5MHz_2A_FDD_t); - size_bits=sizeof_DCI2A_5MHz_2A_FDD_t; - break; - } - } - - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - size_bytes, - process_ue_cqi (module_idP,UE_id),//aggregation, - size_bits, - format2A, - 0); - - break; - - case 4: - - //if (nb_rb>10) { - // DCI format 2_2A - ((DCI2_5MHz_2A_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI2_5MHz_2A_TDD_t*)DLSCH_dci)->rah = 0; - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - sizeof(DCI2_5MHz_2A_TDD_t), - process_ue_cqi (module_idP,UE_id),//aggregation, - sizeof_DCI2_5MHz_2A_TDD_t, - format2, - 0); - /*} else { - ((DCI2_5MHz_2A_L10PRB_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - sizeof(DCI2_5MHz_2A_L10PRB_TDD_t), - 2,//aggregation, - sizeof_DCI2_5MHz_2A_L10PRB_TDD_t, - format2_2A_L10PRB); - }*/ - break; + eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[ue_sched_ctl->dl_cqi[CC_id]]; + } + eNB_UE_stats->dlsch_mcs1 = eNB_UE_stats->dlsch_mcs1; //cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs); - case 5: - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rah = 0; - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), - process_ue_cqi (module_idP,UE_id),//aggregation, - sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, - format1E_2A_M10PRB, - 0); - break; + // store stats + //UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->dl_cqi; - case 6: - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rballoc = allocate_prbs_sub(nb_rb,rballoc_sub); - ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->rah = 0; + // initializing the rb allocation indicator for each UE + for (j = 0; j < N_RBG[CC_id]; j++) { + UE_list-> + UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] + = 0; + } - add_ue_spec_dci(DCI_pdu, - DLSCH_dci, - rnti, - sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t), - process_ue_cqi (module_idP,UE_id),//aggregation - sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t, - format1E_2A_M10PRB, - 0); - break; + LOG_D(MAC, + "[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, rrc %d)\n", + module_idP, frameP, UE_id, CC_id, rnti, harq_pid, round, + nb_available_rb, ue_sched_ctl->dl_cqi[CC_id], + eNB_UE_stats->dlsch_mcs1, + UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status); - } - } - } - } - stop_meas(&eNB->fill_DLSCH_dci); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_FILL_DLSCH_DCI,VCD_FUNCTION_OUT); + /* process retransmission */ + + if (round != 8) { + + // get freq_allocation + nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; + TBS = + get_TBS_DL(UE_list-> + UE_template[CC_id][UE_id].oldmcs1[harq_pid], + nb_rb); + + if (nb_rb <= nb_available_rb) { + if (cc[CC_id].tdd_Config != NULL) { + UE_list->UE_template[CC_id][UE_id].DAI++; + update_ul_dci(module_idP, CC_id, rnti, + UE_list->UE_template[CC_id][UE_id]. + DAI); + LOG_D(MAC, + "DAI update: CC_id %d subframeP %d: UE %d, DAI %d\n", + CC_id, subframeP, UE_id, + UE_list->UE_template[CC_id][UE_id].DAI); + } + + if (nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { + for (j = 0; j < N_RBG[CC_id]; j++) { // for indicating the rballoc for each sub-band + UE_list->UE_template[CC_id][UE_id]. + rballoc_subband[harq_pid][j] = + ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + } + } else { + nb_rb_temp = nb_rb; + j = 0; + + while ((nb_rb_temp > 0) && (j < N_RBG[CC_id])) { + if (ue_sched_ctl->rballoc_sub_UE[CC_id][j] == + 1) { + if (UE_list-> + UE_template[CC_id] + [UE_id].rballoc_subband[harq_pid][j]) + printf + ("WARN: rballoc_subband not free for retrans?\n"); + UE_list-> + UE_template[CC_id] + [UE_id].rballoc_subband[harq_pid][j] = + ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + + if ((j == N_RBG[CC_id] - 1) && + ((N_RB_DL[CC_id] == 25) || + (N_RB_DL[CC_id] == 50))) { + nb_rb_temp = + nb_rb_temp - min_rb_unit[CC_id] + + 1; + } else { + nb_rb_temp = + nb_rb_temp - min_rb_unit[CC_id]; + } + } + + j = j + 1; + } + } + + nb_available_rb -= nb_rb; + /* + eNB->mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb; + eNB->mu_mimo_mode[UE_id].dl_pow_off = ue_sched_ctl->dl_pow_off[CC_id]; + + for(j=0; jmu_mimo_mode[UE_id].rballoc_sub[j] = UE_list->UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j]; + } + */ + + switch (get_tmode(module_idP, CC_id, UE_id)) { + case 1: + case 2: + case 7: + default: + LOG_D(MAC,"retransmission DL_REQ: rnti:%x\n",rnti); + + dl_config_pdu = + &dl_req->dl_config_pdu_list[dl_req-> + number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = + NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + + sizeof(nfapi_dl_config_dci_dl_pdu)); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + dci_format = NFAPI_DL_DCI_FORMAT_1; + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.aggregation_level = + get_aggregation(get_bw_index + (module_idP, CC_id), + ue_sched_ctl->dl_cqi[CC_id], + format1); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = + rnti; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 1; // CRNTI : see Table 4-10 from SCF082 - nFAPI specifications + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power + + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + harq_process = harq_pid; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = 1; // dont adjust power when retransmitting + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.new_data_indicator_1 = + UE_list->UE_template[CC_id][UE_id]. + oldNDI[harq_pid]; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = + UE_list->UE_template[CC_id][UE_id]. + oldmcs1[harq_pid]; + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.redundancy_version_1 = + round & 3; + + if (cc[CC_id].tdd_Config != NULL) { //TDD + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.downlink_assignment_index = + (UE_list->UE_template[CC_id][UE_id].DAI - + 1) & 3; + LOG_D(MAC, + "[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, dai %d, mcs %d\n", + module_idP, CC_id, harq_pid, round, + (UE_list->UE_template[CC_id][UE_id].DAI - + 1), + UE_list-> + UE_template[CC_id][UE_id].oldmcs1 + [harq_pid]); + } else { + LOG_D(MAC, + "[eNB %d] Retransmission CC_id %d : harq_pid %d, round %d, mcs %d\n", + module_idP, CC_id, harq_pid, round, + UE_list-> + UE_template[CC_id][UE_id].oldmcs1 + [harq_pid]); + + } + if (!CCE_allocation_infeasible + (module_idP, CC_id, 1, subframeP, + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.aggregation_level, rnti)) { + dl_req->number_dci++; + dl_req->number_pdu++; + dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + + eNB->DL_req[CC_id].sfn_sf = frameP<<4 | subframeP; + eNB->DL_req[CC_id].header.message_id = NFAPI_DL_CONFIG_REQUEST; + + fill_nfapi_dlsch_config(eNB, dl_req, TBS, -1 + /* retransmission, no pdu_index */ + , rnti, 0, // type 0 allocation from 7.1.6 in 36.213 + 0, // virtual_resource_block_assignment_flag, unused here + 0, // resource_block_coding, to be filled in later + getQm(UE_list->UE_template[CC_id][UE_id].oldmcs1[harq_pid]), round & 3, // redundancy version + 1, // transport blocks + 0, // transport block to codeword swap flag + cc[CC_id].p_eNB == 1 ? 0 : 1, // transmission_scheme + 1, // number of layers + 1, // number of subbands + // uint8_t codebook_index, + 4, // UE category capacity + UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->pdsch_ConfigDedicated->p_a, 0, // delta_power_offset for TM5 + 0, // ngap + 0, // nprb + cc[CC_id].p_eNB == 1 ? 1 : 2, // transmission mode + 0, //number of PRBs treated as one subband, not used here + 0 // number of beamforming vectors, not used here + ); + + LOG_D(MAC, + "Filled NFAPI configuration for DCI/DLSCH %d, retransmission round %d\n", + eNB->pdu_index[CC_id], round); + + program_dlsch_acknak(module_idP, CC_id, UE_id, + frameP, subframeP, + dl_config_pdu-> + dci_dl_pdu.dci_dl_pdu_rel8. + cce_idx); + // No TX request for retransmission (check if null request for FAPI) + } else { + LOG_W(MAC, + "Frame %d, Subframe %d: Dropping DLSCH allocation for UE %d\%x, infeasible CCE allocation\n", + frameP, subframeP, UE_id, rnti); + } + } + + + add_ue_dlsch_info(module_idP, + CC_id, UE_id, subframeP, + S_DL_SCHEDULED); + + //eNB_UE_stats->dlsch_trials[round]++; + UE_list->eNB_UE_stats[CC_id][UE_id]. + num_retransmission += 1; + UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used_retx = + nb_rb; + UE_list->eNB_UE_stats[CC_id][UE_id]. + total_rbs_used_retx += nb_rb; + UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1 = + eNB_UE_stats->dlsch_mcs1; + UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2 = + eNB_UE_stats->dlsch_mcs1; + } else { + LOG_D(MAC, + "[eNB %d] Frame %d CC_id %d : don't schedule UE %d, its retransmission takes more resources than we have\n", + module_idP, frameP, CC_id, UE_id); + } + } else { /* This is a potentially new SDU opportunity */ + + rlc_status.bytes_in_buffer = 0; + // Now check RLC information to compute number of required RBs + // get maximum TBS size for RLC request + TBS = + get_TBS_DL(eNB_UE_stats->dlsch_mcs1, nb_available_rb); + // check first for RLC data on DCCH + // add the length for all the control elements (timing adv, drx, etc) : header + payload + + if (ue_sched_ctl->ta_timer == 0) { + ta_update = ue_sched_ctl->ta_update; + /* if we send TA then set timer to not send it for a while */ + if (ta_update != 31) + ue_sched_ctl->ta_timer = 20; + /* reset ta_update */ + ue_sched_ctl->ta_update = 31; + } else { + ta_update = 31; + } + + ta_len = (ta_update != 31) ? 2 : 0; + + header_len_dcch = 2; // 2 bytes DCCH SDU subheader + + if (TBS - ta_len - header_len_dcch > 0) { + rlc_status = mac_rlc_status_ind(module_idP, rnti, module_idP, frameP, subframeP, ENB_FLAG_YES, MBMS_FLAG_NO, DCCH, (TBS - ta_len - header_len_dcch)); // transport block set size + + sdu_lengths[0] = 0; + + if (rlc_status.bytes_in_buffer > 0) { // There is DCCH to transmit + LOG_D(MAC, + "[eNB %d] SFN/SF %d.%d, DL-DCCH->DLSCH CC_id %d, Requesting %d bytes from RLC (RRC message)\n", + module_idP, frameP, subframeP, CC_id, + TBS - header_len_dcch); + sdu_lengths[0] = mac_rlc_data_req(module_idP, rnti, module_idP, frameP, ENB_FLAG_YES, MBMS_FLAG_NO, DCCH, TBS, //not used + (char *) + &dlsch_buffer + [0]); + + T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), + T_INT(CC_id), T_INT(rnti), T_INT(frameP), + T_INT(subframeP), T_INT(harq_pid), T_INT(DCCH), + T_INT(sdu_lengths[0])); + + LOG_D(MAC, + "[eNB %d][DCCH] CC_id %d Got %d bytes from RLC\n", + module_idP, CC_id, sdu_lengths[0]); + sdu_length_total = sdu_lengths[0]; + sdu_lcids[0] = DCCH; + UE_list->eNB_UE_stats[CC_id][UE_id]. + num_pdu_tx[DCCH] += 1; + UE_list-> + eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH] + += sdu_lengths[0]; + num_sdus = 1; +#ifdef DEBUG_eNB_SCHEDULER + LOG_T(MAC, + "[eNB %d][DCCH] CC_id %d Got %d bytes :", + module_idP, CC_id, sdu_lengths[0]); + + for (j = 0; j < sdu_lengths[0]; j++) { + LOG_T(MAC, "%x ", dlsch_buffer[j]); + } + + LOG_T(MAC, "\n"); +#endif + } else { + header_len_dcch = 0; + sdu_length_total = 0; + } + } + // check for DCCH1 and update header information (assume 2 byte sub-header) + if (TBS - ta_len - header_len_dcch - sdu_length_total > 0) { + rlc_status = mac_rlc_status_ind(module_idP, rnti, module_idP, frameP, subframeP, ENB_FLAG_YES, MBMS_FLAG_NO, DCCH + 1, (TBS - ta_len - header_len_dcch - sdu_length_total)); // transport block set size less allocations for timing advance and + // DCCH SDU + sdu_lengths[num_sdus] = 0; + + if (rlc_status.bytes_in_buffer > 0) { + LOG_D(MAC, + "[eNB %d], Frame %d, DCCH1->DLSCH, CC_id %d, Requesting %d bytes from RLC (RRC message)\n", + module_idP, frameP, CC_id, + TBS - header_len_dcch - sdu_length_total); + sdu_lengths[num_sdus] += mac_rlc_data_req(module_idP, rnti, module_idP, frameP, ENB_FLAG_YES, MBMS_FLAG_NO, DCCH + 1, TBS, //not used + (char *) + &dlsch_buffer + [sdu_length_total]); + + T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), + T_INT(CC_id), T_INT(rnti), T_INT(frameP), + T_INT(subframeP), T_INT(harq_pid), + T_INT(DCCH + 1), T_INT(sdu_lengths[num_sdus])); + + sdu_lcids[num_sdus] = DCCH1; + sdu_length_total += sdu_lengths[num_sdus]; + header_len_dcch += 2; + UE_list->eNB_UE_stats[CC_id][UE_id]. + num_pdu_tx[DCCH1] += 1; + UE_list-> + eNB_UE_stats[CC_id][UE_id].num_bytes_tx[DCCH1] + += sdu_lengths[num_sdus]; + num_sdus++; +#ifdef DEBUG_eNB_SCHEDULER + LOG_T(MAC, + "[eNB %d][DCCH1] CC_id %d Got %d bytes :", + module_idP, CC_id, sdu_lengths[num_sdus]); + + for (j = 0; j < sdu_lengths[num_sdus]; j++) { + LOG_T(MAC, "%x ", dlsch_buffer[j]); + } + + LOG_T(MAC, "\n"); +#endif + + } + } + // assume the max dtch header size, and adjust it later + header_len_dtch = 0; + header_len_dtch_last = 0; // the header length of the last mac sdu + // lcid has to be sorted before the actual allocation (similar struct as ue_list). + for (lcid = NB_RB_MAX - 1; lcid >= DTCH; lcid--) { + // TBD: check if the lcid is active + + header_len_dtch += 3; + header_len_dtch_last = 3; + LOG_D(MAC, + "[eNB %d], Frame %d, DTCH%d->DLSCH, Checking RLC status (tbs %d, len %d)\n", + module_idP, frameP, lcid, TBS, + TBS - ta_len - header_len_dcch - + sdu_length_total - header_len_dtch); + + if (TBS - ta_len - header_len_dcch - sdu_length_total - header_len_dtch > 0) { // NN: > 2 ? + rlc_status = mac_rlc_status_ind(module_idP, + rnti, + module_idP, + frameP, + subframeP, + ENB_FLAG_YES, + MBMS_FLAG_NO, + lcid, + TBS - ta_len - + header_len_dcch - + sdu_length_total - + header_len_dtch); + + + if (rlc_status.bytes_in_buffer > 0) { + + LOG_D(MAC, + "[eNB %d][USER-PLANE DEFAULT DRB] Frame %d : DTCH->DLSCH, Requesting %d bytes from RLC (lcid %d total hdr len %d)\n", + module_idP, frameP, + TBS - header_len_dcch - + sdu_length_total - header_len_dtch, lcid, + header_len_dtch); + sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, rnti, module_idP, frameP, ENB_FLAG_YES, MBMS_FLAG_NO, lcid, TBS, //not used + (char + *) + &dlsch_buffer + [sdu_length_total]); + T(T_ENB_MAC_UE_DL_SDU, T_INT(module_idP), + T_INT(CC_id), T_INT(rnti), T_INT(frameP), + T_INT(subframeP), T_INT(harq_pid), + T_INT(lcid), T_INT(sdu_lengths[num_sdus])); + + LOG_D(MAC, + "[eNB %d][USER-PLANE DEFAULT DRB] Got %d bytes for DTCH %d \n", + module_idP, sdu_lengths[num_sdus], lcid); + sdu_lcids[num_sdus] = lcid; + sdu_length_total += sdu_lengths[num_sdus]; + UE_list-> + eNB_UE_stats[CC_id][UE_id].num_pdu_tx[lcid] + += 1; + UE_list-> + eNB_UE_stats[CC_id][UE_id].num_bytes_tx + [lcid] += sdu_lengths[num_sdus]; + if (sdu_lengths[num_sdus] < 128) { + header_len_dtch--; + header_len_dtch_last--; + } + num_sdus++; + UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer = 0; + } // no data for this LCID + else { + header_len_dtch -= 3; + } + } // no TBS left + else { + header_len_dtch -= 3; + break; + } + } + if (header_len_dtch == 0) + header_len_dtch_last = 0; + // there is at least one SDU + // if (num_sdus > 0 ){ + if ((sdu_length_total + header_len_dcch + + header_len_dtch) > 0) { + + // Now compute number of required RBs for total sdu length + // Assume RAH format 2 + // adjust header lengths + header_len_dcch_tmp = header_len_dcch; + header_len_dtch_tmp = header_len_dtch; + if (header_len_dtch == 0) { + header_len_dcch = (header_len_dcch > 0) ? 1 : 0; //header_len_dcch; // remove length field + } else { + header_len_dtch_last -= 1; // now use it to find how many bytes has to be removed for the last MAC SDU + header_len_dtch = (header_len_dtch > 0) ? header_len_dtch - header_len_dtch_last : header_len_dtch; // remove length field for the last SDU + } + + mcs = eNB_UE_stats->dlsch_mcs1; + + if (mcs == 0) { + nb_rb = 4; // don't let the TBS get too small + } else { + nb_rb = min_rb_unit[CC_id]; + } + + TBS = get_TBS_DL(mcs, nb_rb); + + while (TBS < + (sdu_length_total + header_len_dcch + + header_len_dtch + ta_len)) { + nb_rb += min_rb_unit[CC_id]; // + + if (nb_rb > nb_available_rb) { // if we've gone beyond the maximum number of RBs + // (can happen if N_RB_DL is odd) + TBS = + get_TBS_DL(eNB_UE_stats->dlsch_mcs1, + nb_available_rb); + nb_rb = nb_available_rb; + break; + } + + TBS = get_TBS_DL(eNB_UE_stats->dlsch_mcs1, nb_rb); + } + + if (nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { + for (j = 0; j < N_RBG[CC_id]; j++) { // for indicating the rballoc for each sub-band + UE_list->UE_template[CC_id][UE_id]. + rballoc_subband[harq_pid][j] = + ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + } + } else { + nb_rb_temp = nb_rb; + j = 0; + + while ((nb_rb_temp > 0) && (j < N_RBG[CC_id])) { + if (ue_sched_ctl->rballoc_sub_UE[CC_id][j] == + 1) { + UE_list-> + UE_template[CC_id] + [UE_id].rballoc_subband[harq_pid][j] = + ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + + if ((j == N_RBG[CC_id] - 1) && + ((N_RB_DL[CC_id] == 25) || + (N_RB_DL[CC_id] == 50))) { + nb_rb_temp = + nb_rb_temp - min_rb_unit[CC_id] + + 1; + } else { + nb_rb_temp = + nb_rb_temp - min_rb_unit[CC_id]; + } + } + + j = j + 1; + } + } + + // decrease mcs until TBS falls below required length + while ((TBS > + (sdu_length_total + header_len_dcch + + header_len_dtch + ta_len)) && (mcs > 0)) { + mcs--; + TBS = get_TBS_DL(mcs, nb_rb); + } + + // if we have decreased too much or we don't have enough RBs, increase MCS + while ((TBS < + (sdu_length_total + header_len_dcch + + header_len_dtch + ta_len)) + && (((ue_sched_ctl->dl_pow_off[CC_id] > 0) + && (mcs < 28)) + || ((ue_sched_ctl->dl_pow_off[CC_id] == 0) + && (mcs <= 15)))) { + mcs++; + TBS = get_TBS_DL(mcs, nb_rb); + } + + LOG_D(MAC, + "dlsch_mcs before and after the rate matching = (%d, %d)\n", + eNB_UE_stats->dlsch_mcs1, mcs); + +#ifdef DEBUG_eNB_SCHEDULER + LOG_D(MAC, + "[eNB %d] CC_id %d Generated DLSCH header (mcs %d, TBS %d, nb_rb %d)\n", + module_idP, CC_id, mcs, TBS, nb_rb); + // msg("[MAC][eNB ] Reminder of DLSCH with random data %d %d %d %d \n", + // TBS, sdu_length_total, offset, TBS-sdu_length_total-offset); +#endif + + if ((TBS - header_len_dcch - header_len_dtch - + sdu_length_total - ta_len) <= 2) { + padding = + (TBS - header_len_dcch - header_len_dtch - + sdu_length_total - ta_len); + post_padding = 0; + } else { + padding = 0; + + // adjust the header len + if (header_len_dtch == 0) { + header_len_dcch = header_len_dcch_tmp; + } else { //if (( header_len_dcch==0)&&((header_len_dtch==1)||(header_len_dtch==2))) + header_len_dtch = header_len_dtch_tmp; + } + + post_padding = TBS - sdu_length_total - header_len_dcch - header_len_dtch - ta_len; // 1 is for the postpadding header + } + + + offset = generate_dlsch_header((unsigned char *) UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], num_sdus, //num_sdus + sdu_lengths, // + sdu_lcids, 255, // no drx + ta_update, // timing advance + NULL, // contention res id + padding, post_padding); + + //#ifdef DEBUG_eNB_SCHEDULER + if (ta_update != 31) { + LOG_D(MAC, + "[eNB %d][DLSCH] Frame %d Generate header for UE_id %d on CC_id %d: sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_dcch %d, header_dtch %d\n", + module_idP, frameP, UE_id, CC_id, + sdu_length_total, num_sdus, sdu_lengths[0], + sdu_lcids[0], offset, ta_update, padding, + post_padding, mcs, TBS, nb_rb, + header_len_dcch, header_len_dtch); + } + //#endif +#ifdef DEBUG_eNB_SCHEDULER + LOG_T(MAC, "[eNB %d] First 16 bytes of DLSCH : \n"); + + for (i = 0; i < 16; i++) { + LOG_T(MAC, "%x.", dlsch_buffer[i]); + } + + LOG_T(MAC, "\n"); +#endif + + // cycle through SDUs and place in dlsch_buffer + memcpy(&UE_list-> + DLSCH_pdu[CC_id][0][UE_id].payload[0][offset], + dlsch_buffer, sdu_length_total); + // memcpy(RC.mac[0].DLSCH_pdu[0][0].payload[0][offset],dcch_buffer,sdu_lengths[0]); + + // fill remainder of DLSCH with random data + for (j = 0; j < (TBS - sdu_length_total - offset); j++) { + UE_list->DLSCH_pdu[CC_id][0][UE_id]. + payload[0][offset + sdu_length_total + j] = + (char) (taus() & 0xff); + } + + + if (opt_enabled == 1) { + trace_pdu(1, (uint8_t *) + UE_list->DLSCH_pdu[CC_id][0][UE_id]. + payload[0], TBS, module_idP, 3, + UE_RNTI(module_idP, UE_id), eNB->frame, + eNB->subframe, 0, 0); + LOG_D(OPT, + "[eNB %d][DLSCH] CC_id %d Frame %d rnti %x with size %d\n", + module_idP, CC_id, frameP, + UE_RNTI(module_idP, UE_id), TBS); + } + + T(T_ENB_MAC_UE_DL_PDU_WITH_DATA, T_INT(module_idP), + T_INT(CC_id), T_INT(rnti), T_INT(frameP), + T_INT(subframeP), T_INT(harq_pid), + T_BUFFER(UE_list->DLSCH_pdu[CC_id][0][UE_id]. + payload[0], TBS)); + + UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid] = + nb_rb; + + add_ue_dlsch_info(module_idP, + CC_id, UE_id, subframeP, + S_DL_SCHEDULED); + // store stats + eNB->eNB_stats[CC_id].dlsch_bytes_tx += + sdu_length_total; + eNB->eNB_stats[CC_id].dlsch_pdus_tx += 1; + + UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used = nb_rb; + UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used += + nb_rb; + UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1 = + eNB_UE_stats->dlsch_mcs1; + UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2 = mcs; + UE_list->eNB_UE_stats[CC_id][UE_id].TBS = TBS; + + UE_list->eNB_UE_stats[CC_id][UE_id].overhead_bytes = + TBS - sdu_length_total; + UE_list->eNB_UE_stats[CC_id][UE_id].total_sdu_bytes += + sdu_length_total; + UE_list->eNB_UE_stats[CC_id][UE_id].total_pdu_bytes += + TBS; + UE_list->eNB_UE_stats[CC_id][UE_id].total_num_pdus += + 1; + + if (cc[CC_id].tdd_Config != NULL) { // TDD + UE_list->UE_template[CC_id][UE_id].DAI++; + update_ul_dci(module_idP, CC_id, rnti, + UE_list->UE_template[CC_id][UE_id]. + DAI); + } + // do PUCCH power control + // this is the normalized RX power + eNB_UE_stats = &UE_list->eNB_UE_stats[CC_id][UE_id]; + + /* TODO: fix how we deal with power, unit is not dBm, it's special from nfapi */ + normalized_rx_power = ue_sched_ctl->pucch1_snr[CC_id]; + target_rx_power = 208; + + // this assumes accumulated tpc + // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out + int32_t framex10psubframe = + UE_list->UE_template[CC_id][UE_id]. + pucch_tpc_tx_frame * 10 + + UE_list->UE_template[CC_id][UE_id]. + pucch_tpc_tx_subframe; + if (((framex10psubframe + 10) <= (frameP * 10 + subframeP)) || //normal case + ((framex10psubframe > (frameP * 10 + subframeP)) && (((10240 - framex10psubframe + frameP * 10 + subframeP) >= 10)))) //frame wrap-around + if (ue_sched_ctl->pucch1_cqi_update[CC_id] == 1) { + ue_sched_ctl->pucch1_cqi_update[CC_id] = 0; + + UE_list-> + UE_template[CC_id] + [UE_id].pucch_tpc_tx_frame = frameP; + UE_list-> + UE_template[CC_id] + [UE_id].pucch_tpc_tx_subframe = subframeP; + + if (normalized_rx_power > + (target_rx_power + 4)) { + tpc = 0; //-1 + tpc_accumulated--; + } else if (normalized_rx_power < + (target_rx_power - 4)) { + tpc = 2; //+1 + tpc_accumulated++; + } else { + tpc = 1; //0 + } + + LOG_D(MAC, + "[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n", + module_idP, frameP, subframeP, harq_pid, + tpc, tpc_accumulated, + normalized_rx_power, target_rx_power); + + } // Po_PUCCH has been updated + else { + tpc = 1; //0 + } // time to do TPC update + else { + tpc = 1; //0 + } + + dl_config_pdu = + &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = + NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = + NFAPI_DL_DCI_FORMAT_1; + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.aggregation_level = + get_aggregation(get_bw_index(module_idP, CC_id), + ue_sched_ctl->dl_cqi[CC_id], + format1); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = rnti; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 1; // CRNTI : see Table 4-10 from SCF082 - nFAPI specifications + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power + + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + harq_process = harq_pid; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = tpc; // dont adjust power when retransmitting + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.new_data_indicator_1 = + 1 - + UE_list->UE_template[CC_id][UE_id]. + oldNDI[harq_pid]; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = mcs; + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.redundancy_version_1 = 0; + //deactivate second codeword + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_2 = 0; + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.redundancy_version_2 = 1; + if (cc[CC_id].tdd_Config != NULL) { //TDD + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.downlink_assignment_index = + (UE_list->UE_template[CC_id][UE_id].DAI - + 1) & 3; + LOG_D(MAC, + "[eNB %d] Initial transmission CC_id %d : harq_pid %d, dai %d, mcs %d\n", + module_idP, CC_id, harq_pid, + (UE_list->UE_template[CC_id][UE_id].DAI - 1), + mcs); + } else { + LOG_D(MAC, + "[eNB %d] Initial transmission CC_id %d : harq_pid %d, mcs %d\n", + module_idP, CC_id, harq_pid, mcs); + + } + LOG_D(MAC, "Checking feasibility pdu %d (new sdu)\n", + dl_req->number_pdu); + if (!CCE_allocation_infeasible + (module_idP, CC_id, 1, subframeP, + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.aggregation_level, rnti)) { + + + ue_sched_ctl->round[CC_id][harq_pid] = 0; + dl_req->number_dci++; + dl_req->number_pdu++; + dl_req->tl.tag = NFAPI_DL_CONFIG_REQUEST_BODY_TAG; + + eNB->DL_req[CC_id].sfn_sf = frameP<<4 | subframeP; + eNB->DL_req[CC_id].header.message_id = NFAPI_DL_CONFIG_REQUEST; + + // Toggle NDI for next time + LOG_D(MAC, + "CC_id %d Frame %d, subframeP %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n", + CC_id, frameP, subframeP, UE_id, rnti, + harq_pid, + UE_list-> + UE_template[CC_id][UE_id].oldNDI[harq_pid]); + + UE_list->UE_template[CC_id][UE_id]. + oldNDI[harq_pid] = + 1 - + UE_list->UE_template[CC_id][UE_id]. + oldNDI[harq_pid]; + UE_list->UE_template[CC_id][UE_id]. + oldmcs1[harq_pid] = mcs; + UE_list->UE_template[CC_id][UE_id]. + oldmcs2[harq_pid] = 0; + AssertFatal(UE_list->UE_template[CC_id] + [UE_id].physicalConfigDedicated != + NULL, + "physicalConfigDedicated is NULL\n"); + AssertFatal(UE_list->UE_template[CC_id] + [UE_id]. + physicalConfigDedicated->pdsch_ConfigDedicated + != NULL, + "physicalConfigDedicated->pdsch_ConfigDedicated is NULL\n"); + + fill_nfapi_dlsch_config(eNB, dl_req, TBS, eNB->pdu_index[CC_id], rnti, 0, // type 0 allocation from 7.1.6 in 36.213 + 0, // virtual_resource_block_assignment_flag, unused here + 0, // resource_block_coding, to be filled in later + getQm(mcs), 0, // redundancy version + 1, // transport blocks + 0, // transport block to codeword swap flag + cc[CC_id].p_eNB == 1 ? 0 : 1, // transmission_scheme + 1, // number of layers + 1, // number of subbands + // uint8_t codebook_index, + 4, // UE category capacity + UE_list->UE_template[CC_id][UE_id].physicalConfigDedicated->pdsch_ConfigDedicated->p_a, 0, // delta_power_offset for TM5 + 0, // ngap + 0, // nprb + cc[CC_id].p_eNB == 1 ? 1 : 2, // transmission mode + 0, //number of PRBs treated as one subband, not used here + 0 // number of beamforming vectors, not used here + ); + eNB->TX_req[CC_id].sfn_sf = + fill_nfapi_tx_req(&eNB-> + TX_req + [CC_id].tx_request_body, + (frameP * 10) + subframeP, + TBS, eNB->pdu_index[CC_id], + eNB-> + UE_list.DLSCH_pdu[CC_id][0][(unsigned char) + UE_id].payload + [0]); + + LOG_D(MAC, + "Filled NFAPI configuration for DCI/DLSCH/TXREQ %d, new SDU\n", + eNB->pdu_index[CC_id]); + + eNB->pdu_index[CC_id]++; + program_dlsch_acknak(module_idP, CC_id, UE_id, + frameP, subframeP, + dl_config_pdu-> + dci_dl_pdu.dci_dl_pdu_rel8. + cce_idx); + + } else { + LOG_W(MAC, + "Frame %d, Subframe %d: Dropping DLSCH allocation for UE %d/%x, infeasible CCE allocations\n", + frameP, subframeP, UE_id, rnti); + } + } else { // There is no data from RLC or MAC header, so don't schedule + + } + } + + if (cc[CC_id].tdd_Config != NULL) { // TDD + set_ul_DAI(module_idP, UE_id, CC_id, frameP, subframeP); + } + + } // UE_id loop + } // CC_id loop + + + + fill_DLSCH_dci(module_idP, frameP, subframeP, mbsfn_flag); + + stop_meas(&eNB->schedule_dlsch); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH, VCD_FUNCTION_OUT); + } //------------------------------------------------------------------------------ -unsigned char* -get_dlsch_sdu( - module_id_t module_idP, - int CC_id, - frame_t frameP, - rnti_t rntiP, - uint8_t TBindex -) +void +fill_DLSCH_dci(module_id_t module_idP, + frame_t frameP, sub_frame_t subframeP, int *mbsfn_flagP) //------------------------------------------------------------------------------ { - int UE_id; - eNB_MAC_INST *eNB=&eNB_mac_inst[module_idP]; + // loop over all allocated UEs and compute frequency allocations for PDSCH + int UE_id = -1; + uint8_t /* first_rb, */ nb_rb = 3; + rnti_t rnti; + //unsigned char *vrb_map; + uint8_t rballoc_sub[25]; + //uint8_t number_of_subbands=13; - if (rntiP==SI_RNTI) { - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d Get DLSCH sdu for BCCH \n", module_idP, CC_id, frameP); + //unsigned char round; + unsigned char harq_pid; + int i; + int CC_id; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + UE_list_t *UE_list = &eNB->UE_list; + int N_RBG; + int N_RB_DL; + COMMON_channels_t *cc; - return((unsigned char *)&eNB->common_channels[CC_id].BCCH_pdu.payload[0]); - } + start_meas(&eNB->fill_DLSCH_dci); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_FILL_DLSCH_DCI, VCD_FUNCTION_IN); + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + LOG_D(MAC, "Doing fill DCI for CC_id %d\n", CC_id); + + if (mbsfn_flagP[CC_id] > 0) + continue; + + cc = &eNB->common_channels[CC_id]; + N_RBG = to_rbg(cc->mib->message.dl_Bandwidth); + N_RB_DL = to_prb(cc->mib->message.dl_Bandwidth); + + // UE specific DCIs + for (UE_id = UE_list->head; UE_id >= 0; + UE_id = UE_list->next[UE_id]) { + LOG_T(MAC, "CC_id %d, UE_id: %d => status %d\n", CC_id, UE_id, + eNB_dlsch_info[module_idP][CC_id][UE_id].status); + + if (eNB_dlsch_info[module_idP][CC_id][UE_id].status == + S_DL_SCHEDULED) { + + // clear scheduling flag + eNB_dlsch_info[module_idP][CC_id][UE_id].status = + S_DL_WAITING; + rnti = UE_RNTI(module_idP, UE_id); + if (cc->tdd_Config) + harq_pid = ((frameP * 10) + subframeP) % 10; + else + harq_pid = ((frameP * 10) + subframeP) & 7; + nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; + + + + /// Synchronizing rballoc with rballoc_sub + for (i = 0; i < N_RBG; i++) { + rballoc_sub[i] = + UE_list-> + UE_template[CC_id][UE_id].rballoc_subband[harq_pid] + [i]; + } + + nfapi_dl_config_request_t *DL_req = + &RC.mac[module_idP]->DL_req[0]; + nfapi_dl_config_request_pdu_t *dl_config_pdu; + + for (i = 0; + i < DL_req[CC_id].dl_config_request_body.number_pdu; + i++) { + dl_config_pdu = + &DL_req[CC_id]. + dl_config_request_body.dl_config_pdu_list[i]; + if ((dl_config_pdu->pdu_type == + NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) + && (dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + rnti == rnti) + && (dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.dci_format != 1)) { + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.resource_block_coding = + allocate_prbs_sub(nb_rb, N_RB_DL, N_RBG, + rballoc_sub); + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.resource_allocation_type = 0; + } else + if ((dl_config_pdu->pdu_type == + NFAPI_DL_CONFIG_DLSCH_PDU_TYPE) + && (dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8. + rnti == rnti) + && (dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.resource_allocation_type == + 0)) { + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.resource_block_coding = + allocate_prbs_sub(nb_rb, N_RB_DL, N_RBG, + rballoc_sub); + } + } + } + } + + } + + stop_meas(&eNB->fill_DLSCH_dci); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_FILL_DLSCH_DCI, VCD_FUNCTION_OUT); +} + +//------------------------------------------------------------------------------ +unsigned char *get_dlsch_sdu(module_id_t module_idP, + int CC_id, frame_t frameP, rnti_t rntiP, + uint8_t TBindex) +//------------------------------------------------------------------------------ +{ + + int UE_id; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + + if (rntiP == SI_RNTI) { + LOG_D(MAC, "[eNB %d] CC_id %d Frame %d Get DLSCH sdu for BCCH \n", + module_idP, CC_id, frameP); + + return ((unsigned char *) &eNB->common_channels[CC_id]. + BCCH_pdu.payload[0]); + } + + if (rntiP==P_RNTI) { + LOG_D(MAC,"[eNB %d] CC_id %d Frame %d Get PCH sdu for PCCH \n", module_idP, CC_id, frameP); + + return((unsigned char *)&eNB->common_channels[CC_id].PCCH_pdu.payload[0]); + } UE_id = find_UE_id(module_idP,rntiP); - if (UE_id != -1) { - LOG_D(MAC,"[eNB %d] Frame %d: CC_id %d Get DLSCH sdu for rnti %x => UE_id %d\n",module_idP,frameP,CC_id,rntiP,UE_id); - return((unsigned char *)&eNB->UE_list.DLSCH_pdu[CC_id][TBindex][UE_id].payload[0]); - } else { - LOG_E(MAC,"[eNB %d] Frame %d: CC_id %d UE with RNTI %x does not exist\n", module_idP,frameP,CC_id,rntiP); - return NULL; - } + if (UE_id != -1) { + LOG_D(MAC, + "[eNB %d] Frame %d: CC_id %d Get DLSCH sdu for rnti %x => UE_id %d\n", + module_idP, frameP, CC_id, rntiP, UE_id); + return ((unsigned char *) &eNB-> + UE_list.DLSCH_pdu[CC_id][TBindex][UE_id].payload[0]); + } else { + LOG_E(MAC, + "[eNB %d] Frame %d: CC_id %d UE with RNTI %x does not exist\n", + module_idP, frameP, CC_id, rntiP); + return NULL; + } } //------------------------------------------------------------------------------ void -update_ul_dci( - module_id_t module_idP, - uint8_t CC_id, - rnti_t rnti, - uint8_t dai) +update_ul_dci(module_id_t module_idP, + uint8_t CC_idP, rnti_t rntiP, uint8_t daiP) //------------------------------------------------------------------------------ { - DCI_PDU *DCI_pdu = &eNB_mac_inst[module_idP].common_channels[CC_id].DCI_pdu; - int i; - DCI0_5MHz_TDD_1_6_t *ULSCH_dci = NULL;; + nfapi_hi_dci0_request_t *HI_DCI0_req = + &RC.mac[module_idP]->HI_DCI0_req[CC_idP]; + nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = + &HI_DCI0_req->hi_dci0_request_body.hi_dci0_pdu_list[0]; + COMMON_channels_t *cc = &RC.mac[module_idP]->common_channels[CC_idP]; + int i; - if (mac_xface->lte_frame_parms->frame_type == TDD) { - for (i=0; iNum_common_dci+DCI_pdu->Num_ue_spec_dci; i++) { - ULSCH_dci = (DCI0_5MHz_TDD_1_6_t *)DCI_pdu->dci_alloc[i].dci_pdu; - if ((DCI_pdu->dci_alloc[i].format == format0) && (DCI_pdu->dci_alloc[i].rnti == rnti)) { - ULSCH_dci->dai = (dai-1)&3; + if (cc->tdd_Config != NULL) { // TDD + for (i = 0; + i < + HI_DCI0_req->hi_dci0_request_body.number_of_dci + + HI_DCI0_req->hi_dci0_request_body.number_of_dci; i++) { + + if ((hi_dci0_pdu[i].pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE) && + (hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.rnti == rntiP)) + hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.dl_assignment_index = + (daiP - 1) & 3; + + } + } +} + + +//------------------------------------------------------------------------------ +void +set_ue_dai(sub_frame_t subframeP, + int UE_id, uint8_t CC_id, uint8_t tdd_config, + UE_list_t * UE_list) +//------------------------------------------------------------------------------ +{ + switch (tdd_config) { + case 0: + if ((subframeP == 0) || (subframeP == 1) || (subframeP == 3) + || (subframeP == 5) || (subframeP == 6) || (subframeP == 8)) { + UE_list->UE_template[CC_id][UE_id].DAI = 0; + } + + break; + + case 1: + if ((subframeP == 0) || (subframeP == 4) || (subframeP == 5) + || (subframeP == 9)) { + UE_list->UE_template[CC_id][UE_id].DAI = 0; + } + + break; + + case 2: + if ((subframeP == 4) || (subframeP == 5)) { + UE_list->UE_template[CC_id][UE_id].DAI = 0; + } + + break; + + case 3: + if ((subframeP == 5) || (subframeP == 7) || (subframeP == 9)) { + UE_list->UE_template[CC_id][UE_id].DAI = 0; + } + + break; + + case 4: + if ((subframeP == 0) || (subframeP == 6)) { + UE_list->UE_template[CC_id][UE_id].DAI = 0; + } + + break; + + case 5: + if (subframeP == 9) { + UE_list->UE_template[CC_id][UE_id].DAI = 0; + } + + break; + + case 6: + if ((subframeP == 0) || (subframeP == 1) || (subframeP == 5) + || (subframeP == 6) || (subframeP == 9)) { + UE_list->UE_template[CC_id][UE_id].DAI = 0; + } + + break; + + default: + UE_list->UE_template[CC_id][UE_id].DAI = 0; + LOG_N(MAC, "unknow TDD config %d\n", tdd_config); + break; + } +} + +void schedule_PCH(module_id_t module_idP,frame_t frameP,sub_frame_t subframeP) +{ + /* DCI:format 1A/1C P-RNTI:0xFFFE */ + /* PDU:eNB_rrc_inst[Mod_idP].common_channels[CC_id].PCCH_pdu.payload */ + uint16_t pcch_sdu_length; + int mcs = -1; + int CC_id; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc; + uint8_t *vrb_map; + int n_rb_dl; + int first_rb = -1; + nfapi_dl_config_request_pdu_t *dl_config_pdu; + nfapi_tx_request_pdu_t *TX_req; + nfapi_dl_config_request_body_t *dl_req; +#ifdef FORMAT1C + int gap_index = 0; /* indicate which gap(1st or 2nd) is used (0:1st) */ + const int GAP_MAP [9][2] = { + {-1, 0}, /* N_RB_DL [6-10] -1: |N_RB/2| 0: N/A*/ + {4, 0}, /* N_RB_DL [11] */ + {8, 0}, /* N_RB_DL [12-19] */ + {12, 0}, /* N_RB_DL [20-26] */ + {18, 0}, /* N_RB_DL [27-44] */ + {27, 0}, /* N_RB_DL [45-49] */ + {27, 9}, /* N_RB_DL [50-63] */ + {32, 16}, /* N_RB_DL [64-79] */ + {48, 16} /* N_RB_DL [80-110] */ + }; + uint8_t n_rb_step = 0; + uint8_t n_gap = 0; + uint8_t n_vrb_dl = 0; + uint8_t Lcrbs = 0; + uint16_t rb_bit = 168; /* RB bit number value is unsure */ + #endif + + start_meas(&eNB->schedule_pch); + + for (CC_id=0; CC_idcommon_channels[CC_id]; + vrb_map = (void*)&cc->vrb_map; + n_rb_dl = to_prb(cc->mib->message.dl_Bandwidth); + dl_req = &eNB->DL_req[CC_id].dl_config_request_body; + for (uint16_t i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (UE_PF_PO[CC_id][i].enable_flag != TRUE) { + continue; } + if (frameP % UE_PF_PO[CC_id][i].T == UE_PF_PO[CC_id][i].PF_min && subframeP == UE_PF_PO[CC_id][i].PO) { + pcch_sdu_length = mac_rrc_data_req(module_idP, + CC_id, + frameP, + PCCH,1, + &cc->PCCH_pdu.payload[0], + i); // used for ue index + if (pcch_sdu_length == 0) { + LOG_D(MAC,"[eNB %d] Frame %d subframe %d: PCCH not active(size = 0 byte)\n", module_idP,frameP, subframeP); + continue; + } + LOG_D(MAC,"[eNB %d] Frame %d subframe %d: PCCH->PCH CC_id %d UE_id %d, Received %d bytes \n", module_idP, frameP, subframeP, CC_id,i, pcch_sdu_length); +#ifdef FORMAT1C + //NO SIB + if ((subframeP == 1 || subframeP == 2 || subframeP == 4 || subframeP == 6 || subframeP == 9) || + (subframeP == 5 && ((frameP % 2) != 0 && (frameP % 8) != 1))) { + switch (n_rb_dl) { +#if 0 + case 6: + n_gap = n_rb_dl/2; /* expect: 3 */ + n_vrb_dl = 2*((n_gap < (n_rb_dl - n_gap)) ? n_gap : (n_rb_dl - n_gap));; /* expect: 6 */ + first_rb = 0; + break; + case 15: + n_gap = GAP_MAP[2][0]; /* expect: 8 */ + n_vrb_dl = 2*((n_gap < (n_rb_dl - n_gap)) ? n_gap : (n_rb_dl - n_gap)); /* expect: 14 */ + first_rb = 6; + break; +#endif + case 25: + n_gap = GAP_MAP[3][0]; /* expect: 12 */ + n_vrb_dl = 2*((n_gap < (n_rb_dl - n_gap)) ? n_gap : (n_rb_dl - n_gap)); /* expect: 24 */ + first_rb = 10; + break; + case 50: + n_gap = GAP_MAP[6][gap_index]; /* expect: 27 or 9 */ + if (gap_index > 0) { + n_vrb_dl = (n_rb_dl / (2*n_gap)) * (2*n_gap); /* 36 */ + } else { + n_vrb_dl = 2*((n_gap < (n_rb_dl - n_gap)) ? n_gap : (n_rb_dl - n_gap)); /* expect: 46 */ + } + first_rb = 24; + break; + case 100: + n_gap = GAP_MAP[8][gap_index]; /* expect: 48 or 16 */ + if (gap_index > 0) { + n_vrb_dl = (n_rb_dl / (2*n_gap)) * (2*n_gap); /* expect: 96 */ + } else { + n_vrb_dl = 2*((n_gap < (n_rb_dl - n_gap)) ? n_gap : (n_rb_dl - n_gap)); /* expect: 96 */ + } + first_rb = 48; + break; + } + } else if (subframeP == 5 && ((frameP % 2) == 0 || (frameP % 8) == 1)) { // SIB + paging + switch (n_rb_dl) { +#if 0 + case 6: + n_gap = n_rb_dl/2; /* expect: 3 */ + n_vrb_dl = 2*((n_gap < (n_rb_dl - n_gap)) ? n_gap : (n_rb_dl - n_gap));; /* expect: 6 */ + first_rb = 0; + break; + case 15: + n_gap = GAP_MAP[2][0]; /* expect: 8 */ + n_vrb_dl = 2*((n_gap < (n_rb_dl - n_gap)) ? n_gap : (n_rb_dl - n_gap)); /* expect: 14 */ + first_rb = 10; + break; +#endif + case 25: + n_gap = GAP_MAP[3][0]; /* expect: 12 */ + n_vrb_dl = 2*((n_gap < (n_rb_dl - n_gap)) ? n_gap : (n_rb_dl - n_gap)); /* expect: 24 */ + first_rb = 14; + break; + case 50: + n_gap = GAP_MAP[6][gap_index]; /* expect: 27 or 9 */ + if (gap_index > 0) { + n_vrb_dl = (n_rb_dl / (2*n_gap)) * (2*n_gap); /* 36 */ + } else { + n_vrb_dl = 2*((n_gap < (n_rb_dl - n_gap)) ? n_gap : (n_rb_dl - n_gap)); /* expect: 46 */ + } + first_rb = 28; + break; + case 100: + n_gap = GAP_MAP[8][gap_index]; /* expect: 48 or 16 */ + if (gap_index > 0) { + n_vrb_dl = (n_rb_dl / (2*n_gap)) * (2*n_gap); /* expect: 96 */ + } else { + n_vrb_dl = 2*((n_gap < (n_rb_dl - n_gap)) ? n_gap : (n_rb_dl - n_gap)); /* expect: 96 */ + } + first_rb = 52; + break; + } + } + /* Get MCS for length of PCH */ + if (pcch_sdu_length <= TBStable1C[0]) { + mcs=0; + } else if (pcch_sdu_length <= TBStable1C[1]) { + mcs=1; + } else if (pcch_sdu_length <= TBStable1C[2]) { + mcs=2; + } else if (pcch_sdu_length <= TBStable1C[3]) { + mcs=3; + } else if (pcch_sdu_length <= TBStable1C[4]) { + mcs=4; + } else if (pcch_sdu_length <= TBStable1C[5]) { + mcs=5; + } else if (pcch_sdu_length <= TBStable1C[6]) { + mcs=6; + } else if (pcch_sdu_length <= TBStable1C[7]) { + mcs=7; + } else if (pcch_sdu_length <= TBStable1C[8]) { + mcs=8; + } else if (pcch_sdu_length <= TBStable1C[9]) { + mcs=9; + } else { + /* unexpected: pcch sdb size is over max value*/ + LOG_E(MAC,"[eNB %d] Frame %d : PCCH->PCH CC_id %d, Received %d bytes is over max length(256) \n", + module_idP, frameP,CC_id, pcch_sdu_length); + return; + } + rb_num = TBStable1C[mcs] / rb_bit + ( (TBStable1C[mcs] % rb_bit == 0)? 0: 1) + 1; + /* calculate N_RB_STEP and Lcrbs */ + if (n_rb_dl < 50) { + n_rb_step = 2; + Lcrbs = rb_num / 2 + ((rb_num % 2 == 0) ? 0:2); + } else { + n_rb_step = 4; + Lcrbs = rb_num / 4 + ((rb_num % 4 == 0) ? 0:4); + } + for(i = 0;i < Lcrbs ;i++){ + vrb_map[first_rb+i] = 1; + } +#else + //NO SIB + if ((subframeP == 1 || subframeP == 2 || subframeP == 4 || subframeP == 6 || subframeP == 9) || + (subframeP == 5 && ((frameP % 2) != 0 && (frameP % 8) != 1))) { + switch (n_rb_dl) { + case 25: + first_rb = 10; + break; + case 50: + first_rb = 24; + break; + case 100: + first_rb = 48; + break; + } + } else if (subframeP == 5 && ((frameP % 2) == 0 || (frameP % 8) == 1)) { // SIB + paging + switch (n_rb_dl) { + case 25: + first_rb = 14; + break; + case 50: + first_rb = 28; + break; + case 100: + first_rb = 52; + break; + } + } + + vrb_map[first_rb] = 1; + vrb_map[first_rb+1] = 1; + vrb_map[first_rb+2] = 1; + vrb_map[first_rb+3] = 1; + /* Get MCS for length of PCH */ + if (pcch_sdu_length <= get_TBS_DL(0,3)) { + mcs=0; + } else if (pcch_sdu_length <= get_TBS_DL(1,3)) { + mcs=1; + } else if (pcch_sdu_length <= get_TBS_DL(2,3)) { + mcs=2; + } else if (pcch_sdu_length <= get_TBS_DL(3,3)) { + mcs=3; + } else if (pcch_sdu_length <= get_TBS_DL(4,3)) { + mcs=4; + } else if (pcch_sdu_length <= get_TBS_DL(5,3)) { + mcs=5; + } else if (pcch_sdu_length <= get_TBS_DL(6,3)) { + mcs=6; + } else if (pcch_sdu_length <= get_TBS_DL(7,3)) { + mcs=7; + } else if (pcch_sdu_length <= get_TBS_DL(8,3)) { + mcs=8; + } else if (pcch_sdu_length <= get_TBS_DL(9,3)) { + mcs=9; + } +#endif + dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void*)dl_config_pdu,0,sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; + dl_config_pdu->pdu_size = (uint8_t)(2+sizeof(nfapi_dl_config_dci_dl_pdu)); +#ifdef FORMAT1C + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1C; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = getRIV(n_vrb_dl/n_rb_step, first_rb/n_rb_step, Lcrbs/n_rb_step); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.ngap = n_gap; +#else + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = NFAPI_DL_DCI_FORMAT_1A; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = 0; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = 1; // no TPC + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = 1; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = 1; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = getRIV(n_rb_dl,first_rb,4); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.virtual_resource_block_assignment_flag = 0; +#endif + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = 4; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = 0xFFFE; // P-RNTI + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = 2; // P-RNTI : see Table 4-10 from SCF082 - nFAPI specifications + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = mcs; + + // Rel10 fields + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10.pdsch_start = 3; + // Rel13 fields + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.ue_type = 0; // regular UE + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.pdsch_payload_type = 2; // not BR + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13.initial_transmission_sf_io = 0xFFFF; + + if (!CCE_allocation_infeasible(module_idP, CC_id, 0, subframeP, dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level, P_RNTI)) { + LOG_D(MAC,"Frame %d: Subframe %d : Adding common DCI for P_RNTI\n", frameP,subframeP); + dl_req->number_dci++; + dl_req->number_pdu++; + dl_config_pdu = &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void*)dl_config_pdu,0,sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; + dl_config_pdu->pdu_size = (uint8_t)(2+sizeof(nfapi_dl_config_dlsch_pdu)); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index = eNB->pdu_index[CC_id]; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti = 0xFFFE; +#ifdef FORMAT1C + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 3; // format 1C + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = getRIV(n_vrb_dl/n_rb_step, first_rb/n_rb_step, Lcrbs/n_rb_step); +#else + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = 2; // format 1A/1B/1D + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = getRIV(n_rb_dl,first_rb,4); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.virtual_resource_block_assignment_flag = 0; // localized +#endif + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.modulation = 2; //QPSK + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.redundancy_version = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = 1;// first block + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_block_to_codeword_swap_flag = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_scheme = (cc->p_eNB==1 ) ? 0 : 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.number_of_layers = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.number_of_subbands = 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.codebook_index = ; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ue_category_capacity = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pa = 4; // 0 dB + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.delta_power_offset_index = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ngap = 0; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.nprb = get_subbandsize(cc->mib->message.dl_Bandwidth); // ignored + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_mode = (cc->p_eNB==1 ) ? 1 : 2; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_prb_per_subband = 1; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_vector = 1; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.bf_vector = ; + dl_req->number_pdu++; + + eNB->TX_req[CC_id].sfn_sf = (frameP<<4)+subframeP; + TX_req = &eNB->TX_req[CC_id].tx_request_body.tx_pdu_list[eNB->TX_req[CC_id].tx_request_body.number_of_pdus]; + TX_req->pdu_length = pcch_sdu_length; + TX_req->pdu_index = eNB->pdu_index[CC_id]++; + TX_req->num_segments = 1; + TX_req->segments[0].segment_length = pcch_sdu_length; + TX_req->segments[0].segment_data = cc[CC_id].PCCH_pdu.payload; + eNB->TX_req[CC_id].tx_request_body.number_of_pdus++; + } else { + LOG_E(MAC,"[eNB %d] CCid %d Frame %d, subframe %d : Cannot add DCI 1A/1C for Paging\n",module_idP, CC_id, frameP, subframeP); + continue; + } + + if (opt_enabled == 1) { + trace_pdu(1, + &eNB->common_channels[CC_id].PCCH_pdu.payload[0], + pcch_sdu_length, + 0xffff, + PCCH, + P_RNTI, + eNB->frame, + eNB->subframe, + 0, + 0); + LOG_D(OPT,"[eNB %d][PCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", + module_idP, frameP, CC_id, 0xffff, pcch_sdu_length); + } + eNB->eNB_stats[CC_id].total_num_pcch_pdu+=1; + eNB->eNB_stats[CC_id].pcch_buffer=pcch_sdu_length; + eNB->eNB_stats[CC_id].total_pcch_buffer+=pcch_sdu_length; + eNB->eNB_stats[CC_id].pcch_mcs=mcs; + //paging first_rb log + LOG_D(MAC,"[eNB %d] Frame %d subframe %d PCH: paging_ue_index %d pcch_sdu_length %d mcs %d first_rb %d\n", + module_idP, frameP, subframeP, UE_PF_PO[CC_id][i].ue_index_value, pcch_sdu_length, mcs, first_rb); + + pthread_mutex_lock(&ue_pf_po_mutex); + memset(&UE_PF_PO[CC_id][i], 0, sizeof(UE_PF_PO_t)); + pthread_mutex_unlock(&ue_pf_po_mutex); + } } } - - // printf("Update UL DCI: DAI %d\n",dai); -} - - -//------------------------------------------------------------------------------ -void set_ue_dai( - sub_frame_t subframeP, - uint8_t tdd_config, - int UE_id, - uint8_t CC_id, - UE_list_t* UE_list -) -//------------------------------------------------------------------------------ -{ - - switch (tdd_config) { - case 0: - if ((subframeP==0)||(subframeP==1)||(subframeP==3)||(subframeP==5)||(subframeP==6)||(subframeP==8)) { - UE_list->UE_template[CC_id][UE_id].DAI = 0; - } - - break; - - case 1: - if ((subframeP==0)||(subframeP==4)||(subframeP==5)||(subframeP==9)) { - UE_list->UE_template[CC_id][UE_id].DAI = 0; - } - - break; - - case 2: - if ((subframeP==4)||(subframeP==5)) { - UE_list->UE_template[CC_id][UE_id].DAI = 0; - } - - break; - - case 3: - if ((subframeP==5)||(subframeP==7)||(subframeP==9)) { - UE_list->UE_template[CC_id][UE_id].DAI = 0; - } - - break; - - case 4: - if ((subframeP==0)||(subframeP==6)) { - UE_list->UE_template[CC_id][UE_id].DAI = 0; - } - - break; - - case 5: - if (subframeP==9) { - UE_list->UE_template[CC_id][UE_id].DAI = 0; - } - - break; - - case 6: - if ((subframeP==0)||(subframeP==1)||(subframeP==5)||(subframeP==6)||(subframeP==9)) { - UE_list->UE_template[CC_id][UE_id].DAI = 0; - } - - break; - - default: - UE_list->UE_template[CC_id][UE_id].DAI = 0; - LOG_N(MAC,"unknow TDD config %d\n",tdd_config); - break; - } + /* this might be misleading when pcch is inactive */ + stop_meas(&eNB->schedule_pch); + return; } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c index a6926e15ad..37b13d2de7 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file eNB_scheduler_mch.c * \brief procedures related to eNB for the MCH transport channel @@ -60,614 +52,756 @@ #include "pdcp.h" #if defined(ENABLE_ITTI) -# include "intertask_interface.h" +#include "intertask_interface.h" #endif -#include "SIMULATION/TOOLS/defs.h" // for taus +#include "SIMULATION/TOOLS/defs.h" // for taus #define ENABLE_MAC_PAYLOAD_DEBUG #define DEBUG_eNB_SCHEDULER 1 +extern RAN_CONTEXT_t RC; -#ifdef Rel10 -int8_t get_mbsfn_sf_alloction (module_id_t module_idP, uint8_t CC_id, uint8_t mbsfn_sync_area) +#if defined(Rel10) || defined(Rel14) +int8_t +get_mbsfn_sf_alloction(module_id_t module_idP, uint8_t CC_id, + uint8_t mbsfn_sync_area) { - // currently there is one-to-one mapping between sf allocation pattern and sync area - if (mbsfn_sync_area > MAX_MBSFN_AREA) { - LOG_W(MAC,"[eNB %d] CC_id %d MBSFN synchronization area %d out of range\n ", module_idP, CC_id, mbsfn_sync_area); - return -1; - } else if (eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[mbsfn_sync_area] != NULL) { - return mbsfn_sync_area; - } else { - LOG_W(MAC,"[eNB %d] CC_id %d MBSFN Subframe Config pattern %d not found \n ", module_idP, CC_id, mbsfn_sync_area); - return -1; - } + // currently there is one-to-one mapping between sf allocation pattern and sync area + if (mbsfn_sync_area > MAX_MBSFN_AREA) { + LOG_W(MAC, + "[eNB %d] CC_id %d MBSFN synchronization area %d out of range\n ", + module_idP, CC_id, mbsfn_sync_area); + return -1; + } else if (RC.mac[module_idP]-> + common_channels[CC_id].mbsfn_SubframeConfig[mbsfn_sync_area] + != NULL) { + return mbsfn_sync_area; + } else { + LOG_W(MAC, + "[eNB %d] CC_id %d MBSFN Subframe Config pattern %d not found \n ", + module_idP, CC_id, mbsfn_sync_area); + return -1; + } } -int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, sub_frame_t subframeP) +int +schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, + sub_frame_t subframeP) { - int mcch_flag=0,mtch_flag=0, msi_flag=0; - int mbsfn_period =0;// 1<<(eNB_mac_inst[module_idP].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); - int mcch_period = 0;//32<<(eNB_mac_inst[module_idP].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - int mch_scheduling_period = 8<<(eNB_mac_inst[module_idP].common_channels[CC_id].pmch_Config[0]->mch_SchedulingPeriod_r9); - unsigned char mcch_sdu_length; - unsigned char header_len_mcch=0,header_len_msi=0,header_len_mtch=0, header_len_mtch_temp=0, header_len_mcch_temp=0, header_len_msi_temp=0; - int ii=0, msi_pos=0; - int mcch_mcs = -1; - uint16_t TBS,j,padding=0,post_padding=0; - mac_rlc_status_resp_t rlc_status; - int num_mtch; - int msi_length,i,k; - unsigned char sdu_lcids[11], num_sdus=0, offset=0; - uint16_t sdu_lengths[11], sdu_length_total=0; - unsigned char mch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; // check the max value, this is for dlsch only + int mcch_flag = 0, mtch_flag = 0, msi_flag = 0; + int mbsfn_period = 0; // 1<<(RC.mac[module_idP]->mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); + int mcch_period = 0; //32<<(RC.mac[module_idP]->mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + int mch_scheduling_period = + 8 << (RC.mac[module_idP]->common_channels[CC_id]. + pmch_Config[0]->mch_SchedulingPeriod_r9); + unsigned char mcch_sdu_length; + unsigned char header_len_mcch = 0, header_len_msi = + 0, header_len_mtch = 0, header_len_mtch_temp = + 0, header_len_mcch_temp = 0, header_len_msi_temp = 0; + int ii = 0, msi_pos = 0; + int mcch_mcs = -1; + uint16_t TBS, j = -1, padding = 0, post_padding = 0; + mac_rlc_status_resp_t rlc_status; + int num_mtch; + int msi_length, i, k; + unsigned char sdu_lcids[11], num_sdus = 0, offset = 0; + uint16_t sdu_lengths[11], sdu_length_total = 0; + unsigned char mch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; // check the max value, this is for dlsch only - eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.Pdu_size=0; + COMMON_channels_t *cc = &RC.mac[module_idP]->common_channels[CC_id]; - for (i=0; - i< eNB_mac_inst[module_idP].common_channels[CC_id].num_active_mbsfn_area; - i++ ) { - // assume, that there is always a mapping - if ((j=get_mbsfn_sf_alloction(module_idP,CC_id,i)) == -1) { - return 0; + cc->MCH_pdu.Pdu_size = 0; + + for (i = 0; i < cc->num_active_mbsfn_area; i++) { + // assume, that there is always a mapping + if ((j = get_mbsfn_sf_alloction(module_idP, CC_id, i)) == -1) { + return 0; + } + + mbsfn_period = + 1 << (cc->mbsfn_SubframeConfig[j]->radioframeAllocationPeriod); + mcch_period = + 32 << (cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_RepetitionPeriod_r9); + msi_pos = 0; + ii = 0; + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d subframeP %d : Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %d, mcch period %d)\n", + module_idP, CC_id, frameP, subframeP, i, + cc->num_active_mbsfn_area, j, cc->num_sf_allocation_pattern, + mbsfn_period, mcch_period); + + + switch (cc->mbsfn_AreaInfo[i]->mcch_Config_r9.signallingMCS_r9) { + case 0: + mcch_mcs = 2; + break; + + case 1: + mcch_mcs = 7; + break; + + case 2: + mcch_mcs = 13; + break; + + case 3: + mcch_mcs = 19; + break; + } + + // 1st: Check the MBSFN subframes from SIB2 info (SF allocation pattern i, max 8 non-overlapping patterns exist) + if (frameP % mbsfn_period == cc->mbsfn_SubframeConfig[j]->radioframeAllocationOffset) { // MBSFN frameP + if (cc->mbsfn_SubframeConfig[j]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { // one-frameP format + + // Find the first subframeP in this MCH to transmit MSI + if (frameP % mch_scheduling_period == + cc->mbsfn_SubframeConfig[j]-> + radioframeAllocationOffset) { + while (ii == 0) { + ii = cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & (0x80 >> msi_pos); + msi_pos++; + } + + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d subframeP %d : sync area %d sf allocation pattern %d sf alloc %x msi pos is %d \n", + module_idP, CC_id, frameP, subframeP, i, j, + cc->mbsfn_SubframeConfig[j]-> + subframeAllocation.choice.oneFrame.buf[0], + msi_pos); + } + // Check if the subframeP is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 + switch (subframeP) { + case 1: + if (cc->tdd_Config == NULL) { + if ((cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & MBSFN_FDD_SF1) == + MBSFN_FDD_SF1) { + if (msi_pos == 1) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_Offset_r9) + && + ((cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF1) == + MBSFN_FDD_SF1)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 2: + if (cc->tdd_Config == NULL) { + if ((cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & MBSFN_FDD_SF2) == + MBSFN_FDD_SF2) { + if (msi_pos == 2) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_Offset_r9) + && + ((cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF2) == + MBSFN_FDD_SF2)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 3: + if (cc->tdd_Config != NULL) { // TDD + if ((cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & MBSFN_TDD_SF3) == + MBSFN_TDD_SF3) { + if (msi_pos == 1) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_Offset_r9) + && + ((cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_TDD_SF3) == + MBSFN_TDD_SF3)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } else { // FDD + if ((cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & MBSFN_FDD_SF3) == + MBSFN_FDD_SF3) { + if (msi_pos == 3) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_Offset_r9) + && + ((cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF3) == + MBSFN_FDD_SF3)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 4: + if (cc->tdd_Config != NULL) { + if ((cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & MBSFN_TDD_SF4) == + MBSFN_TDD_SF4) { + if (msi_pos == 2) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_Offset_r9) + && + ((cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_TDD_SF4) == + MBSFN_TDD_SF4)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 6: + if (cc->tdd_Config == NULL) { + if ((cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & MBSFN_FDD_SF6) == + MBSFN_FDD_SF6) { + if (msi_pos == 4) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_Offset_r9) + && + ((cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF6) == + MBSFN_FDD_SF6)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 7: + if (cc->tdd_Config != NULL) { // TDD + if ((cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & MBSFN_TDD_SF7) == + MBSFN_TDD_SF7) { + if (msi_pos == 3) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_Offset_r9) + && + ((cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_TDD_SF7) == + MBSFN_TDD_SF7)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } else { // FDD + if ((cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & MBSFN_FDD_SF7) == + MBSFN_FDD_SF7) { + if (msi_pos == 5) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_Offset_r9) + && + ((cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF7) == + MBSFN_FDD_SF7)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 8: + if (cc->tdd_Config != NULL) { //TDD + if ((cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & MBSFN_TDD_SF8) == + MBSFN_TDD_SF8) { + if (msi_pos == 4) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_Offset_r9) + && + ((cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_TDD_SF8) == + MBSFN_TDD_SF8)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } else { // FDD + if ((cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & MBSFN_FDD_SF8) == + MBSFN_FDD_SF8) { + if (msi_pos == 6) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_Offset_r9) + && + ((cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF8) == + MBSFN_FDD_SF8)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 9: + if (cc->tdd_Config != NULL) { + if ((cc-> + mbsfn_SubframeConfig[j]->subframeAllocation. + choice.oneFrame.buf[0] & MBSFN_TDD_SF9) == + MBSFN_TDD_SF9) { + if (msi_pos == 5) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.mcch_Offset_r9) + && + ((cc->mbsfn_AreaInfo[i]-> + mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_TDD_SF9) == + MBSFN_TDD_SF9)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + } // end switch + + // sf allocation is non-overlapping + if ((msi_flag == 1) || (mcch_flag == 1) + || (mtch_flag == 1)) { + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d Subframe %d: sync area %d SF alloc %d: msi flag %d, mcch flag %d, mtch flag %d\n", + module_idP, CC_id, frameP, subframeP, i, j, + msi_flag, mcch_flag, mtch_flag); + break; + } + } else { // four-frameP format + } + } + } // end of for loop + + cc->msi_active = 0; + cc->mcch_active = 0; + cc->mtch_active = 0; + + // Calculate the mcs + if ((msi_flag == 1) || (mcch_flag == 1)) { + cc->MCH_pdu.mcs = mcch_mcs; + } else if (mtch_flag == 1) { // only MTCH in this subframeP + cc->MCH_pdu.mcs = cc->pmch_Config[0]->dataMCS_r9; + } + // 2nd: Create MSI, get MCCH from RRC and MTCHs from RLC + + // there is MSI (MCH Scheduling Info) + if (msi_flag == 1) { + // Create MSI here + uint16_t msi_control_element[29], *msi_ptr; + + msi_ptr = &msi_control_element[0]; + ((MSI_ELEMENT *) msi_ptr)->lcid = MCCH_LCHANID; //MCCH + + if (mcch_flag == 1) { + ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0; + ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0; + } else { // no mcch for this MSP + ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0x7; // stop value is 2047 + ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0xff; + } + + msi_ptr += sizeof(MSI_ELEMENT); + + //Header for MTCHs + num_mtch = cc->mbms_SessionList[0]->list.count; + + for (k = 0; k < num_mtch; k++) { // loop for all session in this MCH (MCH[0]) at this moment + ((MSI_ELEMENT *) msi_ptr)->lcid = cc->mbms_SessionList[0]->list.array[k]->logicalChannelIdentity_r9; //mtch_lcid; + ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0; // last subframeP of this mtch (only one mtch now) + ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0xB; + msi_ptr += sizeof(MSI_ELEMENT); + } + + msi_length = msi_ptr - msi_control_element; + + if (msi_length < 128) { + header_len_msi = 2; + } else { + header_len_msi = 3; + } + + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d : MSI->MCH, length of MSI is %d bytes \n", + module_idP, CC_id, frameP, msi_length); + //LOG_D(MAC,"Scheduler: MSI is transmitted in this subframeP \n" ); + + // LOG_D(MAC,"Scheduler: MSI length is %d bytes\n",msi_length); + // Store MSI data to mch_buffer[0] + memcpy((char *) &mch_buffer[sdu_length_total], + msi_control_element, msi_length); + + sdu_lcids[num_sdus] = MCH_SCHDL_INFO; + sdu_lengths[num_sdus] = msi_length; + sdu_length_total += sdu_lengths[num_sdus]; + LOG_I(MAC, "[eNB %d] CC_id %d Create %d bytes for MSI\n", + module_idP, CC_id, sdu_lengths[num_sdus]); + num_sdus++; + cc->msi_active = 1; + } + // there is MCCH + if (mcch_flag == 1) { + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d Subframe %d: Schedule MCCH MESSAGE (area %d, sfAlloc %d)\n", + module_idP, CC_id, frameP, subframeP, i, j); + + mcch_sdu_length = mac_rrc_data_req(module_idP, CC_id, frameP, MCCH, 1, &cc->MCCH_pdu.payload[0], + i); // this is the mbsfn sync area index + + if (mcch_sdu_length > 0) { + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d subframeP %d : MCCH->MCH, Received %d bytes from RRC \n", + module_idP, CC_id, frameP, subframeP, mcch_sdu_length); + + header_len_mcch = 2; + + if (cc->tdd_Config != NULL) { + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d subframeP %d: Scheduling MCCH->MCH (TDD) for MCCH message %d bytes (mcs %d )\n", + module_idP, CC_id, frameP, subframeP, + mcch_sdu_length, mcch_mcs); + } else { + LOG_I(MAC, + "[eNB %d] CC_id %d Frame %d subframeP %d: Scheduling MCCH->MCH (FDD) for MCCH message %d bytes (mcs %d)\n", + module_idP, CC_id, frameP, subframeP, + mcch_sdu_length, mcch_mcs); + } + + cc->mcch_active = 1; + + memcpy((char *) &mch_buffer[sdu_length_total], + &cc->MCCH_pdu.payload[0], mcch_sdu_length); + sdu_lcids[num_sdus] = MCCH_LCHANID; + sdu_lengths[num_sdus] = mcch_sdu_length; + + if (sdu_lengths[num_sdus] > 128) { + header_len_mcch = 3; + } + + sdu_length_total += sdu_lengths[num_sdus]; + LOG_D(MAC, + "[eNB %d] CC_id %d Got %d bytes for MCCH from RRC \n", + module_idP, CC_id, sdu_lengths[num_sdus]); + num_sdus++; + } } - mbsfn_period = 1<<(eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->radioframeAllocationPeriod); - mcch_period = 32<<(eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - msi_pos=0; - ii=0; - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d subframeP %d : Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %d, mcch period %d)\n", - module_idP, CC_id, frameP, subframeP,i,eNB_mac_inst[module_idP].common_channels[CC_id].num_active_mbsfn_area, - j,eNB_mac_inst[module_idP].common_channels[CC_id].num_sf_allocation_pattern,mbsfn_period,mcch_period); - - - switch (eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.signallingMCS_r9) { - case 0: - mcch_mcs = 2; - break; - - case 1: - mcch_mcs = 7; - break; - - case 2: - mcch_mcs = 13; - break; - - case 3: - mcch_mcs = 19; - break; - } - - // 1st: Check the MBSFN subframes from SIB2 info (SF allocation pattern i, max 8 non-overlapping patterns exist) - if (frameP % mbsfn_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->radioframeAllocationOffset) { // MBSFN frameP - if (eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { // one-frameP format - - // Find the first subframeP in this MCH to transmit MSI - if (frameP % mch_scheduling_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->radioframeAllocationOffset ) { - while (ii == 0) { - ii = eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & (0x80>>msi_pos); - msi_pos++; - } - - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d subframeP %d : sync area %d sf allocation pattern %d sf alloc %x msi pos is %d \n", - module_idP, CC_id, frameP, subframeP,i,j, - eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0], msi_pos); - } - - // Check if the subframeP is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 - switch (subframeP) { - case 1: - if (mac_xface->lte_frame_parms->frame_type == FDD) { - if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) { - if (msi_pos == 1) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 2: - if (mac_xface->lte_frame_parms->frame_type == FDD) { - if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) { - if (msi_pos == 2) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 3: - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) { - if (msi_pos == 1) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } else { // FDD - if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) { - if (msi_pos == 3) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 4: - if (mac_xface->lte_frame_parms->frame_type == TDD) { - if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) { - if (msi_pos == 2) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 6: - if (mac_xface->lte_frame_parms->frame_type == FDD) { - if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) { - if (msi_pos == 4) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 7: - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) { - if (msi_pos == 3) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } else { // FDD - if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) { - if (msi_pos == 5) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 8: - if (mac_xface->lte_frame_parms->frame_type == TDD) { //TDD - if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) { - if (msi_pos == 4) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } else { // FDD - if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) { - if (msi_pos == 6) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 9: - if (mac_xface->lte_frame_parms->frame_type == TDD) { - if ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) { - if (msi_pos == 5) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((eNB_mac_inst[module_idP].common_channels[CC_id].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - }// end switch - - // sf allocation is non-overlapping - if ((msi_flag==1) || (mcch_flag==1) || (mtch_flag==1)) { - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d Subframe %d: sync area %d SF alloc %d: msi flag %d, mcch flag %d, mtch flag %d\n", - module_idP, CC_id, frameP, subframeP,i,j,msi_flag,mcch_flag,mtch_flag); - break; - } - } else { // four-frameP format - } - } - } // end of for loop - - eNB_mac_inst[module_idP].common_channels[CC_id].msi_active=0; - eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active=0; - eNB_mac_inst[module_idP].common_channels[CC_id].mtch_active=0; - - // Calculate the mcs - if ((msi_flag==1) || (mcch_flag==1)) { - eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.mcs = mcch_mcs; - } else if (mtch_flag == 1) { // only MTCH in this subframeP - eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.mcs = eNB_mac_inst[module_idP].common_channels[CC_id].pmch_Config[0]->dataMCS_r9; - } - - - // 2nd: Create MSI, get MCCH from RRC and MTCHs from RLC - - // there is MSI (MCH Scheduling Info) - if (msi_flag == 1) { - // Create MSI here - uint16_t msi_control_element[29], *msi_ptr; - - msi_ptr = &msi_control_element[0]; - ((MSI_ELEMENT *) msi_ptr)->lcid = MCCH_LCHANID; //MCCH - - if (mcch_flag==1) { - ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0; - ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0; - } else { // no mcch for this MSP - ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0x7;// stop value is 2047 - ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0xff; - } - - msi_ptr+= sizeof(MSI_ELEMENT); - - //Header for MTCHs - num_mtch = eNB_mac_inst[module_idP].common_channels[CC_id].mbms_SessionList[0]->list.count; - - for (k=0; klcid = eNB_mac_inst[module_idP].common_channels[CC_id].mbms_SessionList[0]->list.array[k]->logicalChannelIdentity_r9;//mtch_lcid; - ((MSI_ELEMENT *) msi_ptr)->stop_sf_MSB = 0; // last subframeP of this mtch (only one mtch now) - ((MSI_ELEMENT *) msi_ptr)->stop_sf_LSB = 0xB; - msi_ptr+=sizeof(MSI_ELEMENT); - } - - msi_length = msi_ptr-msi_control_element; - - if (msi_length<128) { - header_len_msi = 2; - } else { - header_len_msi = 3; - } - - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : MSI->MCH, length of MSI is %d bytes \n", - module_idP,CC_id,frameP,msi_length); - //LOG_D(MAC,"Scheduler: MSI is transmitted in this subframeP \n" ); - - // LOG_D(MAC,"Scheduler: MSI length is %d bytes\n",msi_length); - // Store MSI data to mch_buffer[0] - memcpy((char *)&mch_buffer[sdu_length_total], - msi_control_element, - msi_length); - - sdu_lcids[num_sdus] = MCH_SCHDL_INFO; - sdu_lengths[num_sdus] = msi_length; - sdu_length_total += sdu_lengths[num_sdus]; - LOG_I(MAC,"[eNB %d] CC_id %d Create %d bytes for MSI\n", module_idP, CC_id, sdu_lengths[num_sdus]); - num_sdus++; - eNB_mac_inst[module_idP].common_channels[CC_id].msi_active=1; - } - - // there is MCCH - if (mcch_flag == 1) { - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d Subframe %d: Schedule MCCH MESSAGE (area %d, sfAlloc %d)\n", - module_idP, CC_id, frameP, subframeP, i, j); - - mcch_sdu_length = mac_rrc_data_req(module_idP, - CC_id, - frameP, - MCCH,1, - &eNB_mac_inst[module_idP].common_channels[CC_id].MCCH_pdu.payload[0], - 1,// this is eNB - module_idP, // index - i); // this is the mbsfn sync area index - - if (mcch_sdu_length > 0) { - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d subframeP %d : MCCH->MCH, Received %d bytes from RRC \n", - module_idP,CC_id,frameP,subframeP,mcch_sdu_length); - - header_len_mcch = 2; - - if (mac_xface->lte_frame_parms->frame_type == TDD) { - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d subframeP %d: Scheduling MCCH->MCH (TDD) for MCCH message %d bytes (mcs %d )\n", - module_idP, CC_id, - frameP,subframeP, - mcch_sdu_length, - mcch_mcs); - } else { - LOG_I(MAC,"[eNB %d] CC_id %d Frame %d subframeP %d: Scheduling MCCH->MCH (FDD) for MCCH message %d bytes (mcs %d)\n", - module_idP, CC_id, - frameP, subframeP, - mcch_sdu_length, - mcch_mcs); - } - - eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active=1; - - memcpy((char *)&mch_buffer[sdu_length_total], - &eNB_mac_inst[module_idP].common_channels[CC_id].MCCH_pdu.payload[0], - mcch_sdu_length); - sdu_lcids[num_sdus] = MCCH_LCHANID; - sdu_lengths[num_sdus] = mcch_sdu_length; - - if (sdu_lengths[num_sdus]>128) { - header_len_mcch = 3; - } - - sdu_length_total += sdu_lengths[num_sdus]; - LOG_D(MAC,"[eNB %d] CC_id %d Got %d bytes for MCCH from RRC \n",module_idP,CC_id,sdu_lengths[num_sdus]); - num_sdus++; - } - } - - TBS = mac_xface->get_TBS_DL(eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.mcs, mac_xface->lte_frame_parms->N_RB_DL); -#ifdef Rel10 - // do not let mcch and mtch multiplexing when relaying is active - // for sync area 1, so not transmit data - //if ((i == 0) && ((eNB_mac_inst[module_idP].MBMS_flag != multicast_relay) || (eNB_mac_inst[module_idP].mcch_active==0))) { + TBS = + get_TBS_DL(cc->MCH_pdu.mcs, to_prb(cc->mib->message.dl_Bandwidth)); +#if defined(Rel10) || defined(Rel14) + // do not let mcch and mtch multiplexing when relaying is active + // for sync area 1, so not transmit data + //if ((i == 0) && ((RC.mac[module_idP]->MBMS_flag != multicast_relay) || (RC.mac[module_idP]->mcch_active==0))) { #endif - // there is MTCHs, loop if there are more than 1 - if (mtch_flag == 1) { - // Calculate TBS - /* if ((msi_flag==1) || (mcch_flag==1)) { - TBS = mac_xface->get_TBS(mcch_mcs, mac_xface->lte_frame_parms->N_RB_DL); - } - else { // only MTCH in this subframeP - TBS = mac_xface->get_TBS(eNB_mac_inst[module_idP].pmch_Config[0]->dataMCS_r9, mac_xface->lte_frame_parms->N_RB_DL); - } + // there is MTCHs, loop if there are more than 1 + if (mtch_flag == 1) { + // Calculate TBS + /* if ((msi_flag==1) || (mcch_flag==1)) { + TBS = mac_xface->get_TBS(mcch_mcs, mac_xface->frame_parms->N_RB_DL); + } + else { // only MTCH in this subframeP + TBS = mac_xface->get_TBS(RC.mac[module_idP]->pmch_Config[0]->dataMCS_r9, mac_xface->frame_parms->N_RB_DL); + } - // get MTCH data from RLC (like for DTCH) - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d subframe %d: Schedule MTCH (area %d, sfAlloc %d)\n",Mod_id,CC_id,frame,subframe,i,j); + // get MTCH data from RLC (like for DTCH) + LOG_D(MAC,"[eNB %d] CC_id %d Frame %d subframe %d: Schedule MTCH (area %d, sfAlloc %d)\n",Mod_id,CC_id,frame,subframe,i,j); - header_len_mtch = 3; - LOG_D(MAC,"[eNB %d], CC_id %d, Frame %d, MTCH->MCH, Checking RLC status (rab %d, tbs %d, len %d)\n", - Mod_id,CC_id,frame,MTCH,TBS, - TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); + header_len_mtch = 3; + LOG_D(MAC,"[eNB %d], CC_id %d, Frame %d, MTCH->MCH, Checking RLC status (rab %d, tbs %d, len %d)\n", + Mod_id,CC_id,frame,MTCH,TBS, + TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); - rlc_status = mac_rlc_status_ind(Mod_id,frame,1,RLC_MBMS_YES,MTCH+ (maxDRB + 3) * MAX_MOBILES_PER_RG, - TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); - printf("frame %d, subframe %d, rlc_status.bytes_in_buffer is %d\n",frame,subframe, rlc_status.bytes_in_buffer); + rlc_status = mac_rlc_status_ind(Mod_id,frame,1,RLC_MBMS_YES,MTCH+ (maxDRB + 3) * MAX_MOBILES_PER_RG, + TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); + printf("frame %d, subframe %d, rlc_status.bytes_in_buffer is %d\n",frame,subframe, rlc_status.bytes_in_buffer); - */ + */ - // get MTCH data from RLC (like for DTCH) - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d subframeP %d: Schedule MTCH (area %d, sfAlloc %d)\n",module_idP,CC_id,frameP,subframeP,i,j); + // get MTCH data from RLC (like for DTCH) + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d subframeP %d: Schedule MTCH (area %d, sfAlloc %d)\n", + module_idP, CC_id, frameP, subframeP, i, j); - header_len_mtch = 3; - LOG_D(MAC,"[eNB %d], CC_id %d, Frame %d, MTCH->MCH, Checking RLC status (rab %d, tbs %d, len %d)\n", - module_idP,CC_id,frameP,MTCH,TBS, - TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); + header_len_mtch = 3; + LOG_D(MAC, + "[eNB %d], CC_id %d, Frame %d, MTCH->MCH, Checking RLC status (rab %d, tbs %d, len %d)\n", + module_idP, CC_id, frameP, MTCH, TBS, + TBS - header_len_mcch - header_len_msi - sdu_length_total - + header_len_mtch); - rlc_status = mac_rlc_status_ind(module_idP,0,frameP,module_idP,ENB_FLAG_YES,MBMS_FLAG_YES,MTCH, - TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch); - LOG_D(MAC,"e-MBMS log channel %u frameP %d, subframeP %d, rlc_status.bytes_in_buffer is %d\n", - MTCH,frameP,subframeP, rlc_status.bytes_in_buffer); + rlc_status = + mac_rlc_status_ind(module_idP, 0, frameP, subframeP, + module_idP, ENB_FLAG_YES, MBMS_FLAG_YES, + MTCH, + TBS - header_len_mcch - header_len_msi - + sdu_length_total - header_len_mtch); + LOG_D(MAC, + "e-MBMS log channel %u frameP %d, subframeP %d, rlc_status.bytes_in_buffer is %d\n", + MTCH, frameP, subframeP, rlc_status.bytes_in_buffer); - if (rlc_status.bytes_in_buffer >0) { - LOG_I(MAC,"[eNB %d][MBMS USER-PLANE], CC_id %d, Frame %d, MTCH->MCH, Requesting %d bytes from RLC (header len mtch %d)\n", - module_idP,CC_id,frameP,TBS-header_len_mcch-header_len_msi-sdu_length_total-header_len_mtch,header_len_mtch); + if (rlc_status.bytes_in_buffer > 0) { + LOG_I(MAC, + "[eNB %d][MBMS USER-PLANE], CC_id %d, Frame %d, MTCH->MCH, Requesting %d bytes from RLC (header len mtch %d)\n", + module_idP, CC_id, frameP, + TBS - header_len_mcch - header_len_msi - + sdu_length_total - header_len_mtch, header_len_mtch); - sdu_lengths[num_sdus] = mac_rlc_data_req( - module_idP, - 0, - module_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_YES, - MTCH, - (char*)&mch_buffer[sdu_length_total]); - //sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP,frameP, MBMS_FLAG_NO, MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)), (char*)&mch_buffer[sdu_length_total]); - LOG_I(MAC,"[eNB %d][MBMS USER-PLANE] CC_id %d Got %d bytes for MTCH %d\n",module_idP,CC_id,sdu_lengths[num_sdus],MTCH); - eNB_mac_inst[module_idP].common_channels[CC_id].mtch_active=1; - sdu_lcids[num_sdus] = MTCH; - sdu_length_total += sdu_lengths[num_sdus]; + sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, 0, module_idP, frameP, ENB_FLAG_YES, MBMS_FLAG_YES, MTCH, 0, //not used + (char *) + &mch_buffer + [sdu_length_total]); + //sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP,frameP, MBMS_FLAG_NO, MTCH+(MAX_NUM_RB*(NUMBER_OF_UE_MAX+1)), (char*)&mch_buffer[sdu_length_total]); + LOG_I(MAC, + "[eNB %d][MBMS USER-PLANE] CC_id %d Got %d bytes for MTCH %d\n", + module_idP, CC_id, sdu_lengths[num_sdus], MTCH); + cc->mtch_active = 1; + sdu_lcids[num_sdus] = MTCH; + sdu_length_total += sdu_lengths[num_sdus]; - if (sdu_lengths[num_sdus] < 128) { - header_len_mtch = 2; - } + if (sdu_lengths[num_sdus] < 128) { + header_len_mtch = 2; + } - num_sdus++; - } else { - header_len_mtch = 0; + num_sdus++; + } else { + header_len_mtch = 0; + } } - } - -#ifdef Rel10 - // } +#if defined(Rel10) || defined(Rel14) + // } #endif - // FINAL STEP: Prepare and multiplexe MSI, MCCH and MTCHs - if ((sdu_length_total + header_len_msi + header_len_mcch + header_len_mtch) >0) { - // Adjust the last subheader - /* if ((msi_flag==1) || (mcch_flag==1)) { - eNB_mac_inst[module_idP].MCH_pdu.mcs = mcch_mcs; - } - else if (mtch_flag == 1) { // only MTCH in this subframeP - eNB_mac_inst[module_idP].MCH_pdu.mcs = eNB_mac_inst[module_idP].pmch_Config[0]->dataMCS_r9; - } - */ - header_len_mtch_temp = header_len_mtch; - header_len_mcch_temp = header_len_mcch; - header_len_msi_temp = header_len_msi; + // FINAL STEP: Prepare and multiplexe MSI, MCCH and MTCHs + if ((sdu_length_total + header_len_msi + header_len_mcch + + header_len_mtch) > 0) { + // Adjust the last subheader + /* if ((msi_flag==1) || (mcch_flag==1)) { + RC.mac[module_idP]->MCH_pdu.mcs = mcch_mcs; + } + else if (mtch_flag == 1) { // only MTCH in this subframeP + RC.mac[module_idP]->MCH_pdu.mcs = RC.mac[module_idP]->pmch_Config[0]->dataMCS_r9; + } + */ + header_len_mtch_temp = header_len_mtch; + header_len_mcch_temp = header_len_mcch; + header_len_msi_temp = header_len_msi; - if (header_len_mtch>0) { - header_len_mtch=1; // remove Length field in the subheader for the last PDU - } else if (header_len_mcch>0) { - header_len_mcch=1; + if (header_len_mtch > 0) { + header_len_mtch = 1; // remove Length field in the subheader for the last PDU + } else if (header_len_mcch > 0) { + header_len_mcch = 1; + } else { + header_len_msi = 1; + } + + // Calculate the padding + if ((TBS - header_len_mtch - header_len_mcch - header_len_msi - + sdu_length_total) < 0) { + LOG_E(MAC, "Error in building MAC PDU, TBS %d < PDU %d \n", + TBS, + header_len_mtch + header_len_mcch + header_len_msi + + sdu_length_total); + return 0; + } else + if ((TBS - header_len_mtch - header_len_mcch - header_len_msi - + sdu_length_total) <= 2) { + padding = + (TBS - header_len_mtch - header_len_mcch - header_len_msi - + sdu_length_total); + post_padding = 0; + } else { // using post_padding, give back the Length field of subheader for the last PDU + padding = 0; + + if (header_len_mtch > 0) { + header_len_mtch = header_len_mtch_temp; + } else if (header_len_mcch > 0) { + header_len_mcch = header_len_mcch_temp; + } else { + header_len_msi = header_len_msi_temp; + } + + post_padding = + TBS - sdu_length_total - header_len_msi - header_len_mcch - + header_len_mtch; + } + + // Generate the MAC Header for MCH + // here we use the function for DLSCH because DLSCH & MCH have the same Header structure + offset = generate_dlsch_header((unsigned char *) cc->MCH_pdu.payload, num_sdus, sdu_lengths, sdu_lcids, 255, // no drx + 31, // no timing advance + NULL, // no contention res id + padding, post_padding); + + cc->MCH_pdu.Pdu_size = TBS; + cc->MCH_pdu.sync_area = i; + cc->MCH_pdu.msi_active = cc->msi_active; + cc->MCH_pdu.mcch_active = cc->mcch_active; + cc->MCH_pdu.mtch_active = cc->mtch_active; + LOG_D(MAC, + " MCS for this sf is %d (mcch active %d, mtch active %d)\n", + cc->MCH_pdu.mcs, cc->MCH_pdu.mcch_active, + cc->MCH_pdu.mtch_active); + LOG_I(MAC, + "[eNB %d][MBMS USER-PLANE ] CC_id %d Generate header : sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,padding %d,post_padding %d (mcs %d, TBS %d), header MTCH %d, header MCCH %d, header MSI %d\n", + module_idP, CC_id, sdu_length_total, num_sdus, + sdu_lengths[0], sdu_lcids[0], offset, padding, post_padding, + cc->MCH_pdu.mcs, TBS, header_len_mtch, header_len_mcch, + header_len_msi); + // copy SDU to mch_pdu after the MAC Header + memcpy(&cc->MCH_pdu.payload[offset], mch_buffer, sdu_length_total); + + // filling remainder of MCH with random data if necessery + for (j = 0; j < (TBS - sdu_length_total - offset); j++) { + cc->MCH_pdu.payload[offset + sdu_length_total + j] = + (char) (taus() & 0xff); + } + + /* Tracing of PDU is done on UE side */ + if (opt_enabled == 1) { + trace_pdu(1, (uint8_t *) cc->MCH_pdu.payload, TBS, module_idP, 6, 0xffff, // M_RNTI = 6 in wirehsark + RC.mac[module_idP]->frame, + RC.mac[module_idP]->subframe, 0, 0); + LOG_D(OPT, + "[eNB %d][MCH] CC_id %d Frame %d : MAC PDU with size %d\n", + module_idP, CC_id, frameP, TBS); + } + + /* + for (j=0;jMCH_pdu.payload[j+offset]); + printf(" \n"); */ + return 1; } else { - header_len_msi=1; - } - - // Calculate the padding - if ((TBS - header_len_mtch - header_len_mcch - header_len_msi - sdu_length_total) < 0) { - LOG_E(MAC,"Error in building MAC PDU, TBS %d < PDU %d \n", - TBS, header_len_mtch + header_len_mcch + header_len_msi + sdu_length_total); - return 0; - } else if ((TBS - header_len_mtch - header_len_mcch - header_len_msi - sdu_length_total) <= 2) { - padding = (TBS - header_len_mtch - header_len_mcch - header_len_msi - sdu_length_total); - post_padding = 0; - } else { // using post_padding, give back the Length field of subheader for the last PDU - padding = 0; - - if (header_len_mtch>0) { - header_len_mtch = header_len_mtch_temp; - } else if (header_len_mcch>0) { - header_len_mcch = header_len_mcch_temp; - } else { - header_len_msi = header_len_msi_temp; - } - - post_padding = TBS - sdu_length_total - header_len_msi - header_len_mcch - header_len_mtch; - } - - // Generate the MAC Header for MCH - // here we use the function for DLSCH because DLSCH & MCH have the same Header structure - offset = generate_dlsch_header((unsigned char*)eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.payload, - num_sdus, - sdu_lengths, - sdu_lcids, - 255, // no drx - 0, // no timing advance - NULL, // no contention res id - padding, - post_padding); - - eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.Pdu_size=TBS; - eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.sync_area=i; - eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.msi_active= eNB_mac_inst[module_idP].common_channels[CC_id].msi_active; - eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.mcch_active= eNB_mac_inst[module_idP].common_channels[CC_id].mcch_active; - eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.mtch_active= eNB_mac_inst[module_idP].common_channels[CC_id].mtch_active; - LOG_D(MAC," MCS for this sf is %d (mcch active %d, mtch active %d)\n", eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.mcs, - eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.mcch_active,eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.mtch_active ); - LOG_I(MAC, - "[eNB %d][MBMS USER-PLANE ] CC_id %d Generate header : sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,padding %d,post_padding %d (mcs %d, TBS %d), header MTCH %d, header MCCH %d, header MSI %d\n", - module_idP,CC_id,sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset,padding,post_padding,eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.mcs,TBS, - header_len_mtch, header_len_mcch, header_len_msi); - // copy SDU to mch_pdu after the MAC Header - memcpy(&eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.payload[offset],mch_buffer,sdu_length_total); - - // filling remainder of MCH with random data if necessery - for (j=0; j<(TBS-sdu_length_total-offset); j++) { - eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.payload[offset+sdu_length_total+j] = (char)(taus()&0xff); - } - - /* Tracing of PDU is done on UE side */ - if (opt_enabled ==1 ) { - trace_pdu(1, (uint8_t *)eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu.payload, - TBS, module_idP, 6, 0xffff, // M_RNTI = 6 in wirehsark - eNB_mac_inst[module_idP].subframe,0,0); - LOG_D(OPT,"[eNB %d][MCH] CC_id %d Frame %d : MAC PDU with size %d\n", - module_idP, CC_id, frameP, TBS); + cc->MCH_pdu.Pdu_size = 0; + cc->MCH_pdu.sync_area = 0; + cc->MCH_pdu.msi_active = 0; + cc->MCH_pdu.mcch_active = 0; + cc->MCH_pdu.mtch_active = 0; + // for testing purpose, fill with random data + //for (j=0;j<(TBS-sdu_length_total-offset);j++) + // RC.mac[module_idP]->MCH_pdu.payload[offset+sdu_length_total+j] = (char)(taus()&0xff); + return 0; } + //this is for testing /* - for (j=0;jMCH_pdu.mcs=0; + //LOG_D(MAC," MCH_pdu.mcs is %d\n", RC.mac[module_idP]->MCH_pdu.mcs); //#warning "MCH pdu should take the CC_id index" - return(&eNB_mac_inst[module_idP].common_channels[CC_id].MCH_pdu); + return (&RC.mac[module_idP]->common_channels[CC_id].MCH_pdu); } #endif diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c index bb9e7b3d30..3e574a56c3 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file eNB_scheduler_primitives.c * \brief primitives used by eNB for BCH, RACH, ULSCH, DLSCH scheduling @@ -61,109 +53,1925 @@ #include "pdcp.h" #if defined(ENABLE_ITTI) -# include "intertask_interface.h" +#include "intertask_interface.h" #endif +#include "T.h" + #define ENABLE_MAC_PAYLOAD_DEBUG #define DEBUG_eNB_SCHEDULER 1 +int choose(int n, int k) +{ + int res = 1; + int res2 = 1; + int i; + + if (k > n) + return (0); + if (n == k) + return (1); + + for (i = n; i > k; i--) + res *= i; + for (i = 2; i <= (n - k); i++) + res2 *= i; + + return (res / res2); +} + +// Patented algorithm from Yang et al, US Patent 2009, "Channel Quality Indexing and Reverse Indexing" +void reverse_index(int N, int M, int r, int *v) +{ + int BaseValue = 0; + int IncreaseValue, ThresholdValue; + int sumV; + int i; + + r = choose(N, M) - 1 - r; + memset((void *) v, 0, M * sizeof(int)); + + sumV = 0; + i = M; + while (i > 0 && r > 0) { + IncreaseValue = choose(N - M + 1 - sumV - v[i - 1] + i - 2, i - 1); + ThresholdValue = BaseValue + IncreaseValue; + if (r >= ThresholdValue) { + v[i - 1]++; + BaseValue = ThresholdValue; + } else { + r = r - BaseValue; + sumV += v[i - 1]; + i--; + BaseValue = 0; + } + } +} + +int to_prb(int dl_Bandwidth) +{ + int prbmap[6] = { 6, 15, 25, 50, 75, 100 }; + + AssertFatal(dl_Bandwidth < 6, "dl_Bandwidth is 0..5\n"); + return (prbmap[dl_Bandwidth]); +} + +int to_rbg(int dl_Bandwidth) +{ + int rbgmap[6] = { 6, 8, 13, 17, 19, 25 }; + + AssertFatal(dl_Bandwidth < 6, "dl_Bandwidth is 0..5\n"); + return (rbgmap[dl_Bandwidth]); +} + +int get_phich_resource_times6(COMMON_channels_t * cc) +{ + int phichmap[4] = { 1, 3, 6, 12 }; + AssertFatal(cc != NULL, "cc is null\n"); + AssertFatal(cc->mib != NULL, "cc->mib is null\n"); + AssertFatal((cc->mib->message.phich_Config.phich_Resource >= 0) && + (cc->mib->message.phich_Config.phich_Resource < 4), + "phich_Resource %d not in 0..3\n", + (int) cc->mib->message.phich_Config.phich_Resource); + + return (phichmap[cc->mib->message.phich_Config.phich_Resource]); +} + +uint16_t mac_computeRIV(uint16_t N_RB_DL, uint16_t RBstart, uint16_t Lcrbs) +{ + uint16_t RIV; + + if (Lcrbs <= (1 + (N_RB_DL >> 1))) + RIV = (N_RB_DL * (Lcrbs - 1)) + RBstart; + else + RIV = (N_RB_DL * (N_RB_DL + 1 - Lcrbs)) + (N_RB_DL - 1 - RBstart); + + return (RIV); +} + +uint8_t getQm(uint8_t mcs) +{ + if (mcs < 10) + return (2); + else if (mcs < 17) + return (4); + else + return (6); +} + +void +get_Msg3alloc(COMMON_channels_t * cc, + sub_frame_t current_subframe, + frame_t current_frame, frame_t * frame, + sub_frame_t * subframe) +{ + // Fill in other TDD Configuration!!!! + + if (cc->tdd_Config == NULL) { // FDD + *subframe = current_subframe + 6; + + if (*subframe > 9) { + *subframe = *subframe - 10; + *frame = (current_frame + 1) & 1023; + } else { + *frame = current_frame; + } + } else { // TDD + if (cc->tdd_Config->subframeAssignment == 1) { + switch (current_subframe) { + + case 0: + *subframe = 7; + *frame = current_frame; + break; + + case 4: + *subframe = 2; + *frame = (current_frame + 1) & 1023; + break; + + case 5: + *subframe = 2; + *frame = (current_frame + 1) & 1023; + break; + + case 9: + *subframe = 7; + *frame = (current_frame + 1) & 1023; + break; + } + } else if (cc->tdd_Config->subframeAssignment == 3) { + switch (current_subframe) { + + case 0: + case 5: + case 6: + *subframe = 2; + *frame = (current_frame + 1) & 1023; + break; + + case 7: + *subframe = 3; + *frame = (current_frame + 1) & 1023; + break; + + case 8: + *subframe = 4; + *frame = (current_frame + 1) & 1023; + break; + + case 9: + *subframe = 2; + *frame = (current_frame + 2) & 1023; + break; + } + } else if (cc->tdd_Config->subframeAssignment == 4) { + switch (current_subframe) { + + case 0: + case 4: + case 5: + case 6: + *subframe = 2; + *frame = (current_frame + 1) & 1023; + break; + + case 7: + *subframe = 3; + *frame = (current_frame + 1) & 1023; + break; + + case 8: + case 9: + *subframe = 2; + *frame = (current_frame + 2) & 1023; + break; + } + } else if (cc->tdd_Config->subframeAssignment == 5) { + switch (current_subframe) { + + case 0: + case 4: + case 5: + case 6: + *subframe = 2; + *frame = (current_frame + 1) & 1023; + break; + + case 7: + case 8: + case 9: + *subframe = 2; + *frame = (current_frame + 2) & 1023; + break; + } + } + } +} + + + +void +get_Msg3allocret(COMMON_channels_t * cc, + sub_frame_t current_subframe, + frame_t current_frame, + frame_t * frame, sub_frame_t * subframe) +{ + if (cc->tdd_Config == NULL) { //FDD + /* always retransmit in n+8 */ + *subframe = current_subframe + 8; + + if (*subframe > 9) { + *subframe = *subframe - 10; + *frame = (current_frame + 1) & 1023; + } else { + *frame = current_frame; + } + } else { + if (cc->tdd_Config->subframeAssignment == 1) { + // original PUSCH in 2, PHICH in 6 (S), ret in 2 + // original PUSCH in 3, PHICH in 9, ret in 3 + // original PUSCH in 7, PHICH in 1 (S), ret in 7 + // original PUSCH in 8, PHICH in 4, ret in 8 + *frame = (current_frame + 1) & 1023; + } else if (cc->tdd_Config->subframeAssignment == 3) { + // original PUSCH in 2, PHICH in 8, ret in 2 next frame + // original PUSCH in 3, PHICH in 9, ret in 3 next frame + // original PUSCH in 4, PHICH in 0, ret in 4 next frame + *frame = (current_frame + 1) & 1023; + } else if (cc->tdd_Config->subframeAssignment == 4) { + // original PUSCH in 2, PHICH in 8, ret in 2 next frame + // original PUSCH in 3, PHICH in 9, ret in 3 next frame + *frame = (current_frame + 1) & 1023; + } else if (cc->tdd_Config->subframeAssignment == 5) { + // original PUSCH in 2, PHICH in 8, ret in 2 next frame + *frame = (current_frame + 1) & 1023; + } + } +} + +uint8_t +subframe2harqpid(COMMON_channels_t * cc, frame_t frame, + sub_frame_t subframe) +{ + uint8_t ret = 255; + + AssertFatal(cc != NULL, "cc is null\n"); + + if (cc->tdd_Config == NULL) { // FDD + ret = (((frame << 1) + subframe) & 7); + } else { + switch (cc->tdd_Config->subframeAssignment) { + case 1: + if ((subframe == 2) || + (subframe == 3) || (subframe == 7) || (subframe == 8)) + switch (subframe) { + case 2: + case 3: + ret = (subframe - 2); + break; + + case 7: + case 8: + ret = (subframe - 5); + break; + + default: + AssertFatal(1 == 0, + "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframe, + (int) cc->tdd_Config->subframeAssignment); + break; + } + + break; + + case 2: + AssertFatal((subframe == 2) || (subframe == 7), + "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframe, + (int) cc->tdd_Config->subframeAssignment); + + ret = (subframe / 7); + break; + + case 3: + AssertFatal((subframe > 1) && (subframe < 5), + "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframe, + (int) cc->tdd_Config->subframeAssignment); + ret = (subframe - 2); + break; + + case 4: + AssertFatal((subframe > 1) && (subframe < 4), + "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframe, + (int) cc->tdd_Config->subframeAssignment); + ret = (subframe - 2); + break; + + case 5: + AssertFatal(subframe == 2, + "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframe, + (int) cc->tdd_Config->subframeAssignment); + ret = (subframe - 2); + break; + + default: + AssertFatal(1 == 0, + "subframe2_harq_pid, Unsupported TDD mode %d\n", + (int) cc->tdd_Config->subframeAssignment); + } + } + return ret; +} + +uint8_t +get_Msg3harqpid(COMMON_channels_t * cc, + frame_t frame, sub_frame_t current_subframe) +{ + uint8_t ul_subframe = 0; + uint32_t ul_frame = 0; + + if (cc->tdd_Config == NULL) { // FDD + ul_subframe = + (current_subframe > + 3) ? (current_subframe - 4) : (current_subframe + 6); + ul_frame = (current_subframe > 3) ? ((frame + 1) & 1023) : frame; + } else { + switch (cc->tdd_Config->subframeAssignment) { + case 1: + switch (current_subframe) { + case 9: + case 0: + ul_subframe = 7; + break; + + case 5: + case 7: + ul_subframe = 2; + break; + + } + + break; + + case 3: + switch (current_subframe) { + case 0: + case 5: + case 6: + ul_subframe = 2; + break; + + case 7: + ul_subframe = 3; + break; + + case 8: + ul_subframe = 4; + break; + + case 9: + ul_subframe = 2; + break; + } + + break; + + case 4: + switch (current_subframe) { + case 0: + case 5: + case 6: + case 8: + case 9: + ul_subframe = 2; + break; + + case 7: + ul_subframe = 3; + break; + } + + break; + + case 5: + ul_subframe = 2; + break; + + default: + LOG_E(PHY, + "get_Msg3_harq_pid: Unsupported TDD configuration %d\n", + (int) cc->tdd_Config->subframeAssignment); + AssertFatal(1 == 0, + "get_Msg3_harq_pid: Unsupported TDD configuration"); + break; + } + } + + return (subframe2harqpid(cc, ul_frame, ul_subframe)); +} + +uint32_t +pdcchalloc2ulframe(COMMON_channels_t * ccP, uint32_t frame, uint8_t n) +{ + uint32_t ul_frame; + + if ((ccP->tdd_Config) && (ccP->tdd_Config->subframeAssignment == 1) && ((n == 1) || (n == 6))) // tdd_config 0,1 SF 1,5 + ul_frame = (frame + (n == 1 ? 0 : 1)); + else if ((ccP->tdd_Config) && + (ccP->tdd_Config->subframeAssignment == 6) && + ((n == 0) || (n == 1) || (n == 5) || (n == 6))) + ul_frame = (frame + (n >= 5 ? 1 : 0)); + else if ((ccP->tdd_Config) && (ccP->tdd_Config->subframeAssignment == 6) && (n == 9)) // tdd_config 6 SF 9 + ul_frame = (frame + 1); + else + ul_frame = (frame + (n >= 6 ? 1 : 0)); + + LOG_D(PHY, "frame %d subframe %d: PUSCH frame = %d\n", frame, n, + ul_frame); + return ul_frame; +} + +uint8_t pdcchalloc2ulsubframe(COMMON_channels_t * ccP, uint8_t n) +{ + uint8_t ul_subframe; + + if ((ccP->tdd_Config) && (ccP->tdd_Config->subframeAssignment == 1) && ((n == 1) || (n == 6))) // tdd_config 0,1 SF 1,5 + ul_subframe = ((n + 6) % 10); + else if ((ccP->tdd_Config) && + (ccP->tdd_Config->subframeAssignment == 6) && + ((n == 0) || (n == 1) || (n == 5) || (n == 6))) + ul_subframe = ((n + 7) % 10); + else if ((ccP->tdd_Config) && (ccP->tdd_Config->subframeAssignment == 6) && (n == 9)) // tdd_config 6 SF 9 + ul_subframe = ((n + 5) % 10); + else + ul_subframe = ((n + 4) % 10); + + LOG_D(PHY, "subframe %d: PUSCH subframe = %d\n", n, ul_subframe); + return ul_subframe; +} + +int is_UL_sf(COMMON_channels_t * ccP, sub_frame_t subframeP) +{ + // if FDD return dummy value + if (ccP->tdd_Config == NULL) + return (0); + + switch (ccP->tdd_Config->subframeAssignment) { + case 1: + switch (subframeP) { + case 0: + case 4: + case 5: + case 9: + return (0); + break; + + case 2: + case 3: + case 7: + case 8: + return (1); + break; + + default: + return (0); + break; + } + break; + + case 3: + if ((subframeP <= 1) || (subframeP >= 5)) + return (0); + else if ((subframeP > 1) && (subframeP < 5)) + return (1); + else + AssertFatal(1 == 0, "Unknown subframe number\n"); + break; + + case 4: + if ((subframeP <= 1) || (subframeP >= 4)) + return (0); + else if ((subframeP > 1) && (subframeP < 4)) + return (1); + else + AssertFatal(1 == 0, "Unknown subframe number\n"); + break; + + case 5: + if ((subframeP <= 1) || (subframeP >= 3)) + return (0); + else if ((subframeP > 1) && (subframeP < 3)) + return (1); + else + AssertFatal(1 == 0, "Unknown subframe number\n"); + break; + + default: + AssertFatal(1 == 0, + "subframe %d Unsupported TDD configuration %d\n", + subframeP, (int) ccP->tdd_Config->subframeAssignment); + break; + } +} + +uint16_t get_pucch1_absSF(COMMON_channels_t * cc, uint16_t dlsch_absSF) +{ + uint16_t sf, f, nextf; + + if (cc->tdd_Config == NULL) { //FDD n+4 + return ((dlsch_absSF + 4) % 10240); + } else { + sf = dlsch_absSF % 10; + f = dlsch_absSF / 10; + nextf = (f + 1) & 1023; + + switch (cc->tdd_Config->subframeAssignment) { + case 0: + AssertFatal(1 == 0, "SFA 0 to be filled in now, :-)\n"); + break; + case 1: + if ((sf == 5) || (sf == 6)) + return ((10 * nextf) + 2); // ACK/NAK in SF 2 next frame + else if (sf == 9) + return ((10 * nextf) + 3); // ACK/NAK in SF 3 next frame + else if ((sf == 0) || (sf == 1)) + return ((10 * f) + 2); // ACK/NAK in SF 7 same frame + else + AssertFatal(1 == 0, + "Impossible dlsch subframe %d for TDD configuration 3\n", + sf); + break; + case 2: + if ((sf == 4) || (sf == 5) || (sf == 6) || (sf == 8)) + return ((10 * nextf) + 2); // ACK/NAK in SF 2 next frame + else if (sf == 9) + return ((10 * nextf) + 7); // ACK/NAK in SF 7 next frame + else if ((sf == 0) || (sf == 1) || (sf == 3)) + return ((10 * f) + 7); // ACK/NAK in SF 7 same frame + else + AssertFatal(1 == 0, + "Impossible dlsch subframe %d for TDD configuration 3\n", + sf); + break; + case 3: + if ((sf == 5) || (sf == 6) || (sf == 7) || (sf == 8) + || (sf == 9)) + return ((10 * nextf) + (sf >> 1)); // ACK/NAK in 2,3,4 resp. next frame + else if (sf == 1) + return ((10 * nextf) + 2); // ACK/NAK in 2 next frame + else if (sf == 0) + return ((10 * f) + 4); // ACK/NAK in 4 same frame + else + AssertFatal(1 == 0, + "Impossible dlsch subframe %d for TDD configuration 3\n", + sf); + break; + case 4: + if ((sf == 6) || (sf == 7) || (sf == 8) || (sf == 9)) + return (((10 * nextf) + 3) % 10240); // ACK/NAK in SF 3 next frame + else if ((sf == 0) || (sf == 1) || (sf == 4) || (sf == 5)) + return (((10 * nextf) + 2) % 10240); // ACK/NAK in SF 2 next frame + else + AssertFatal(1 == 0, + "Impossible dlsch subframe %d for TDD configuration 4\n", + sf); + break; + case 5: + if ((sf == 0) || (sf == 1) || (sf == 3) || (sf == 4) + || (sf == 5) || (sf == 6) || (sf == 7) || (sf == 8)) + return (((10 * nextf) + 2) % 10240); // ACK/NAK in SF 3 next frame + else if (sf == 9) + return (((10 * (1 + nextf)) + 2) % 10240); // ACK/NAK in SF 2 next frame + else + AssertFatal(1 == 0, + "Impossible dlsch subframe %d for TDD configuration 5\n", + sf); + break; + case 6: + AssertFatal(1 == 0, "SFA 6 To be filled in now, :-)\n"); + break; + default: + AssertFatal(1 == 0, "Illegal TDD subframe Assigment %d\n", + (int) cc->tdd_Config->subframeAssignment); + break; + } + } + AssertFatal(1 == 0, "Shouldn't get here\n"); +} + +void +get_srs_pos(COMMON_channels_t * cc, uint16_t isrs, + uint16_t * psrsPeriodicity, uint16_t * psrsOffset) +{ + if (cc->tdd_Config) { // TDD + AssertFatal(isrs >= 10, "2 ms SRS periodicity not supported"); + + if ((isrs > 9) && (isrs < 15)) { + *psrsPeriodicity = 5; + *psrsOffset = isrs - 10; + } + if ((isrs > 14) && (isrs < 25)) { + *psrsPeriodicity = 10; + *psrsOffset = isrs - 15; + } + if ((isrs > 24) && (isrs < 45)) { + *psrsPeriodicity = 20; + *psrsOffset = isrs - 25; + } + if ((isrs > 44) && (isrs < 85)) { + *psrsPeriodicity = 40; + *psrsOffset = isrs - 45; + } + if ((isrs > 84) && (isrs < 165)) { + *psrsPeriodicity = 80; + *psrsOffset = isrs - 85; + } + if ((isrs > 164) && (isrs < 325)) { + *psrsPeriodicity = 160; + *psrsOffset = isrs - 165; + } + if ((isrs > 324) && (isrs < 645)) { + *psrsPeriodicity = 320; + *psrsOffset = isrs - 325; + } + + AssertFatal(isrs <= 644, "Isrs out of range %d>644\n", isrs); + } // TDD + else { // FDD + if (isrs < 2) { + *psrsPeriodicity = 2; + *psrsOffset = isrs; + } + if ((isrs > 1) && (isrs < 7)) { + *psrsPeriodicity = 5; + *psrsOffset = isrs - 2; + } + if ((isrs > 6) && (isrs < 17)) { + *psrsPeriodicity = 10; + *psrsOffset = isrs - 7; + } + if ((isrs > 16) && (isrs < 37)) { + *psrsPeriodicity = 20; + *psrsOffset = isrs - 17; + } + if ((isrs > 36) && (isrs < 77)) { + *psrsPeriodicity = 40; + *psrsOffset = isrs - 37; + } + if ((isrs > 76) && (isrs < 157)) { + *psrsPeriodicity = 80; + *psrsOffset = isrs - 77; + } + if ((isrs > 156) && (isrs < 317)) { + *psrsPeriodicity = 160; + *psrsOffset = isrs - 157; + } + if ((isrs > 316) && (isrs < 637)) { + *psrsPeriodicity = 320; + *psrsOffset = isrs - 317; + } + AssertFatal(isrs <= 636, "Isrs out of range %d>636\n", isrs); + } +} + +void +get_csi_params(COMMON_channels_t * cc, + struct CQI_ReportPeriodic *cqi_ReportPeriodic, + uint16_t * Npd, uint16_t * N_OFFSET_CQI, int *H) +{ + uint16_t cqi_PMI_ConfigIndex = + cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex; + uint8_t Jtab[6] = { 0, 2, 2, 3, 4, 4 }; + + AssertFatal(cqi_ReportPeriodic != NULL, + "cqi_ReportPeriodic is null!\n"); + + if (cc->tdd_Config == NULL) { //FDD + if (cqi_PMI_ConfigIndex <= 1) { // 2 ms CQI_PMI period + *Npd = 2; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex; + } else if (cqi_PMI_ConfigIndex <= 6) { // 5 ms CQI_PMI period + *Npd = 5; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 2; + } else if (cqi_PMI_ConfigIndex <= 16) { // 10ms CQI_PMI period + *Npd = 10; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 7; + } else if (cqi_PMI_ConfigIndex <= 36) { // 20 ms CQI_PMI period + *Npd = 20; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 17; + } else if (cqi_PMI_ConfigIndex <= 76) { // 40 ms CQI_PMI period + *Npd = 40; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 37; + } else if (cqi_PMI_ConfigIndex <= 156) { // 80 ms CQI_PMI period + *Npd = 80; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 77; + } else if (cqi_PMI_ConfigIndex <= 316) { // 160 ms CQI_PMI period + *Npd = 160; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 157; + } else if (cqi_PMI_ConfigIndex > 317) { + + if (cqi_PMI_ConfigIndex <= 349) { // 32 ms CQI_PMI period + *Npd = 32; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 318; + } else if (cqi_PMI_ConfigIndex <= 413) { // 64 ms CQI_PMI period + *Npd = 64; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 350; + } else if (cqi_PMI_ConfigIndex <= 541) { // 128 ms CQI_PMI period + *Npd = 128; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 414; + } + } + } else { // TDD + if (cqi_PMI_ConfigIndex == 0) { // all UL subframes + *Npd = 1; + *N_OFFSET_CQI = 0; + } else if (cqi_PMI_ConfigIndex <= 6) { // 5 ms CQI_PMI period + *Npd = 5; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 1; + } else if (cqi_PMI_ConfigIndex <= 16) { // 10ms CQI_PMI period + *Npd = 10; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 6; + } else if (cqi_PMI_ConfigIndex <= 36) { // 20 ms CQI_PMI period + *Npd = 20; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 16; + } else if (cqi_PMI_ConfigIndex <= 76) { // 40 ms CQI_PMI period + *Npd = 40; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 36; + } else if (cqi_PMI_ConfigIndex <= 156) { // 80 ms CQI_PMI period + *Npd = 80; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 76; + } else if (cqi_PMI_ConfigIndex <= 316) { // 160 ms CQI_PMI period + *Npd = 160; + *N_OFFSET_CQI = cqi_PMI_ConfigIndex - 156; + } + } + + // get H + if (cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic. + present == + CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_subbandCQI) + *H = 1 + + (Jtab[cc->mib->message.dl_Bandwidth] * + cqi_ReportPeriodic->choice.setup. + cqi_FormatIndicatorPeriodic.choice.subbandCQI.k); + else + *H = 1; +} + +uint8_t +get_dl_cqi_pmi_size_pusch(COMMON_channels_t * cc, uint8_t tmode, + uint8_t ri, + CQI_ReportModeAperiodic_t * + cqi_ReportModeAperiodic) +{ + int Ntab[6] = { 0, 4, 7, 9, 10, 13 }; + int N = Ntab[cc->mib->message.dl_Bandwidth]; + int Ltab_uesel[6] = { 0, 6, 9, 13, 15, 18 }; + int L = Ltab_uesel[cc->mib->message.dl_Bandwidth]; + + AssertFatal(cqi_ReportModeAperiodic != NULL, + "cqi_ReportPeriodic is null!\n"); + + switch (*cqi_ReportModeAperiodic) { + case CQI_ReportModeAperiodic_rm12: + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 + || tmode == 10, + "Illegal TM (%d) for CQI_ReportModeAperiodic_rm12\n", + tmode); + AssertFatal(cc->p_eNB <= 4, + "only up to 4 antenna ports supported here\n"); + if (ri == 1 && cc->p_eNB == 2) + return (4 + (N << 1)); + else if (ri == 2 && cc->p_eNB == 2) + return (8 + N); + else if (ri == 1 && cc->p_eNB == 4) + return (4 + (N << 2)); + else if (ri > 1 && cc->p_eNB == 4) + return (8 + (N << 2)); + break; + case CQI_ReportModeAperiodic_rm20: + // Table 5.2.2.6.3-1 (36.212) + AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 || tmode == 7 + || tmode == 9 + || tmode == 10, + "Illegal TM (%d) for CQI_ReportModeAperiodic_rm20\n", + tmode); + AssertFatal(tmode != 9 + && tmode != 10, + "TM9/10 will be handled later for CQI_ReportModeAperiodic_rm20\n"); + return (4 + 2 + L); + break; + case CQI_ReportModeAperiodic_rm22: + // Table 5.2.2.6.3-2 (36.212) + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 + || tmode == 10, + "Illegal TM (%d) for CQI_ReportModeAperiodic_rm22\n", + tmode); + AssertFatal(tmode != 9 + && tmode != 10, + "TM9/10 will be handled later for CQI_ReportModeAperiodic_rm22\n"); + if (ri == 1 && cc->p_eNB == 2) + return (4 + 2 + 0 + 0 + L + 4); + if (ri == 2 && cc->p_eNB == 2) + return (4 + 2 + 4 + 2 + L + 2); + if (ri == 1 && cc->p_eNB == 4) + return (4 + 2 + 0 + 0 + L + 8); + if (ri >= 2 && cc->p_eNB == 4) + return (4 + 2 + 4 + 2 + L + 8); + break; + case CQI_ReportModeAperiodic_rm30: + // Table 5.2.2.6.2-1 (36.212) + AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 || tmode == 7 + || tmode == 8 || tmode == 9 + || tmode == 10, + "Illegal TM (%d) for CQI_ReportModeAperiodic_rm30\n", + tmode); + AssertFatal(tmode != 8 && tmode != 9 + && tmode != 10, + "TM8/9/10 will be handled later for CQI_ReportModeAperiodic_rm30\n"); + return (4 + (N << 1)); + break; + case CQI_ReportModeAperiodic_rm31: + // Table 5.2.2.6.2-2 (36.212) + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 + || tmode == 10, + "Illegal TM (%d) for CQI_ReportModeAperiodic_rm31\n", + tmode); + AssertFatal(tmode != 8 && tmode != 9 + && tmode != 10, + "TM8/9/10 will be handled later for CQI_ReportModeAperiodic_rm31\n"); + if (ri == 1 && cc->p_eNB == 2) + return (4 + (N << 1) + 0 + 0 + 2); + else if (ri == 2 && cc->p_eNB == 2) + return (4 + (N << 1) + 4 + (N << 1) + 1); + else if (ri == 1 && cc->p_eNB == 4) + return (4 + (N << 1) + 0 + 0 + 4); + else if (ri >= 2 && cc->p_eNB == 4) + return (4 + (N << 1) + 4 + (N << 1) + 4); + break; + case CQI_ReportModeAperiodic_rm32_v1250: + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 + || tmode == 10, + "Illegal TM (%d) for CQI_ReportModeAperiodic_rm32\n", + tmode); + AssertFatal(1 == 0, + "CQI_ReportModeAperiodic_rm32_v1250 not supported yet\n"); + break; + case CQI_ReportModeAperiodic_rm10_v1310: + // Table 5.2.2.6.1-1F/G (36.212) + if (ri == 1) + return (4); // F + else + return (7); // G + break; + case CQI_ReportModeAperiodic_rm11_v1310: + // Table 5.2.2.6.1-1H (36.212) + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 + || tmode == 10, + "Illegal TM (%d) for CQI_ReportModeAperiodic_rm11\n", + tmode); + AssertFatal(cc->p_eNB <= 4, + "only up to 4 antenna ports supported here\n"); + if (ri == 1 && cc->p_eNB == 2) + return (4 + 0 + 2); + else if (ri == 2 && cc->p_eNB == 2) + return (4 + 4 + 1); + else if (ri == 1 && cc->p_eNB == 4) + return (4 + 0 + 4); + else if (ri > 1 && cc->p_eNB == 4) + return (4 + 4 + 4); + + break; + } + AssertFatal(1 == 0, "Shouldn't get here\n"); + return (0); +} + +uint8_t +get_rel8_dl_cqi_pmi_size(UE_sched_ctrl * sched_ctl, int CC_idP, + COMMON_channels_t * cc, uint8_t tmode, + struct CQI_ReportPeriodic * cqi_ReportPeriodic) +{ + int no_pmi = 0; + // Ltab[6] = {0,log2(15/4/2),log2(25/4/2),log2(50/6/3),log2(75/8/4),log2(100/8/4)}; + + uint8_t Ltab[6] = { 0, 1, 2, 2, 2, 2 }; + uint8_t ri = sched_ctl->periodic_ri_received[CC_idP]; + + AssertFatal(cqi_ReportPeriodic != NULL, + "cqi_ReportPeriodic is null!\n"); + AssertFatal(cqi_ReportPeriodic->present != + CQI_ReportPeriodic_PR_NOTHING, + "cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_NOTHING!\n"); + AssertFatal(cqi_ReportPeriodic->choice. + setup.cqi_FormatIndicatorPeriodic.present != + CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_NOTHING, + "cqi_ReportPeriodic->cqi_FormatIndicatorPeriodic.choice.setup.present == CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_NOTHING!\n"); + + switch (tmode) { + case 1: + case 2: + case 5: + case 6: + case 7: + no_pmi = 1; + break; + default: + no_pmi = 0; + } + + if ((cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic. + present == + CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_widebandCQI) + || (sched_ctl->feedback_cnt[CC_idP] == 0)) { + // send wideband report every opportunity if wideband reporting mode is selected, else every H opportunities + if (no_pmi == 1) + return (4); + else if ((cc->p_eNB == 2) && (ri == 1)) + return (6); + else if ((cc->p_eNB == 2) && (ri == 2)) + return (8); + else if ((cc->p_eNB == 4) && (ri == 1)) + return (8); + else if ((cc->p_eNB == 4) && (ri == 2)) + return (11); + else + AssertFatal(1 == 0, + "illegal combination p %d, ri %d, no_pmi %d\n", + cc->p_eNB, ri, no_pmi); + } else if (cqi_ReportPeriodic->choice. + setup.cqi_FormatIndicatorPeriodic.present == + CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_subbandCQI) + { + if ((no_pmi == 1) || ri == 1) + return (4 + Ltab[cc->mib->message.dl_Bandwidth]); + else + return (7 + Ltab[cc->mib->message.dl_Bandwidth]); + } + + AssertFatal(1 == 0, + "Shouldn't get here : cqi_ReportPeriodic->present %d\n", + cqi_ReportPeriodic->choice. + setup.cqi_FormatIndicatorPeriodic.present); +} + +void +fill_nfapi_dl_dci_1A(nfapi_dl_config_request_pdu_t * dl_config_pdu, + uint8_t aggregation_level, + uint16_t rnti, + uint8_t rnti_type, + uint8_t harq_process, + uint8_t tpc, + uint16_t resource_block_coding, + uint8_t mcs, uint8_t ndi, uint8_t rv, + uint8_t vrb_flag) +{ + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_dci_dl_pdu)); + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = + NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.dci_format = + NFAPI_DL_DCI_FORMAT_1A; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = + aggregation_level; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = rnti; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = rnti_type; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.transmission_power = 6000; // equal to RS power + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.harq_process = harq_process; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tpc = tpc; // no TPC + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.resource_block_coding = + resource_block_coding; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.mcs_1 = mcs; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.new_data_indicator_1 = ndi; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.redundancy_version_1 = rv; + dl_config_pdu->dci_dl_pdu. + dci_dl_pdu_rel8.virtual_resource_block_assignment_flag = vrb_flag; +} + +void +program_dlsch_acknak(module_id_t module_idP, int CC_idP, int UE_idP, + frame_t frameP, sub_frame_t subframeP, + uint8_t cce_idx) +{ + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc = eNB->common_channels; + UE_list_t *UE_list = &eNB->UE_list; + rnti_t rnti = UE_RNTI(module_idP, UE_idP); + nfapi_ul_config_request_body_t *ul_req; + nfapi_ul_config_request_pdu_t *ul_config_pdu; + + int use_simultaneous_pucch_pusch = 0; + nfapi_ul_config_ulsch_harq_information *ulsch_harq_information = NULL; + nfapi_ul_config_harq_information *harq_information = NULL; + +#if defined(Rel10) || defined(Rel14) + + if ((UE_list->UE_template[CC_idP][UE_idP].physicalConfigDedicated-> + ext2) + && (UE_list->UE_template[CC_idP][UE_idP]. + physicalConfigDedicated->ext2->pucch_ConfigDedicated_v1020) + && (UE_list->UE_template[CC_idP][UE_idP]. + physicalConfigDedicated->ext2->pucch_ConfigDedicated_v1020-> + simultaneousPUCCH_PUSCH_r10) + && (*UE_list->UE_template[CC_idP][UE_idP]. + physicalConfigDedicated->ext2->pucch_ConfigDedicated_v1020-> + simultaneousPUCCH_PUSCH_r10 == + PUCCH_ConfigDedicated_v1020__simultaneousPUCCH_PUSCH_r10_true)) + use_simultaneous_pucch_pusch = 1; +#endif + + // pucch1 and pusch feedback is similar, namely in n+k subframes from now + // This is used in the following "if/else" condition to check if there isn't or is already an UL grant in n+k + int16_t ul_absSF = + get_pucch1_absSF(&cc[CC_idP], subframeP + (10 * frameP)); + + if ((ul_config_pdu = has_ul_grant(module_idP, CC_idP, + ul_absSF, rnti)) == NULL) { + // no UL grant so + // Program ACK/NAK alone Format 1a/b or 3 + + ul_req = + &RC.mac[module_idP]->UL_req_tmp[CC_idP][ul_absSF % + 10]. + ul_config_request_body; + ul_config_pdu = + &ul_req->ul_config_pdu_list[ul_req->number_of_pdus]; + // Do PUCCH + fill_nfapi_uci_acknak(module_idP, + CC_idP, + rnti, (frameP * 10) + subframeP, cce_idx); + } else { + /* there is already an existing UL grant so update it if needed + * on top of some other UL resource (PUSCH,combined SR/CQI/HARQ on PUCCH, etc) + */ + switch (ul_config_pdu->pdu_type) { + + /* [ulsch] to [ulsch + harq] or [ulsch + harq on pucch] */ + + case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: + if (use_simultaneous_pucch_pusch == 1) { + // Convert it to an NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE + harq_information = + &ul_config_pdu->ulsch_uci_harq_pdu.harq_information; + ul_config_pdu->pdu_type = + NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE; + LOG_D(MAC, + "Frame %d, Subframe %d: Switched UCI HARQ to ULSCH UCI HARQ\n", + frameP, subframeP); + } else { + // Convert it to an NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE + ulsch_harq_information = + &ul_config_pdu->ulsch_harq_pdu.harq_information; + ul_config_pdu->pdu_type = + NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE; + ul_config_pdu->ulsch_harq_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.tl.tag=NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG; + ul_config_pdu->ulsch_harq_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.n_srs_initial = 0; // last symbol not punctured + ul_config_pdu->ulsch_harq_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.initial_number_of_resource_blocks = ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.number_of_resource_blocks; // we don't change the number of resource blocks across retransmissions yet + LOG_D(MAC, + "Frame %d, Subframe %d: Switched UCI HARQ to ULSCH HARQ\n", + frameP, subframeP); + } + break; + case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: + AssertFatal(use_simultaneous_pucch_pusch == 1, + "Cannot be NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE, simultaneous_pucch_pusch is active"); + break; + case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: + AssertFatal(use_simultaneous_pucch_pusch == 0, + "Cannot be NFAPI_UL_CONFIG_ULSCH_UCI_PDU_TYPE, simultaneous_pucch_pusch is inactive\n"); + break; + + /* [ulsch + cqi] to [ulsch + cqi + harq] */ + + case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: + // Convert it to an NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE + ulsch_harq_information = + &ul_config_pdu->ulsch_cqi_harq_ri_pdu.harq_information; + ul_config_pdu->pdu_type = + NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE; + /* TODO: check this - when converting from nfapi_ul_config_ulsch_cqi_ri_pdu to + * nfapi_ul_config_ulsch_cqi_harq_ri_pdu, shouldn't we copy initial_transmission_parameters + * from the one to the other? + * Those two types are not compatible. 'initial_transmission_parameters' is not at the + * place in both. + */ + ul_config_pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.tl.tag=NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG; + ul_config_pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.n_srs_initial = 0; // last symbol not punctured + ul_config_pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters.initial_transmission_parameters_rel8.initial_number_of_resource_blocks = ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.number_of_resource_blocks; // we don't change the number of resource blocks across retransmissions yet + break; + case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: + AssertFatal(use_simultaneous_pucch_pusch == 0, + "Cannot be NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE, simultaneous_pucch_pusch is active\n"); + break; + + /* [ulsch + cqi on pucch] to [ulsch + cqi on pucch + harq on pucch] */ + + case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: + // convert it to an NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE + harq_information = + &ul_config_pdu->ulsch_csi_uci_harq_pdu.harq_information; + ul_config_pdu->pdu_type = + NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE; + break; + case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: + AssertFatal(use_simultaneous_pucch_pusch == 1, + "Cannot be NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE, simultaneous_pucch_pusch is inactive\n"); + break; + + /* [sr] to [sr + harq] */ + + case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: + // convert to NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE + ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE; + harq_information = + &ul_config_pdu->uci_sr_harq_pdu.harq_information; + break; + case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: + /* nothing to do */ + break; + + /* [cqi] to [cqi + harq] */ + + case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: + // convert to NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE + ul_config_pdu->pdu_type = + NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE; + harq_information = + &ul_config_pdu->uci_cqi_harq_pdu.harq_information; + break; + case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: + /* nothing to do */ + break; + + /* [cqi + sr] to [cqr + sr + harq] */ + + case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: + // convert to NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE + ul_config_pdu->pdu_type = + NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE; + harq_information = + &ul_config_pdu->uci_cqi_sr_harq_pdu.harq_information; + break; + case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: + /* nothing to do */ + break; + } + } + + if (ulsch_harq_information) + fill_nfapi_ulsch_harq_information(module_idP, CC_idP, + rnti, ulsch_harq_information); + + if (harq_information) + fill_nfapi_harq_information(module_idP, CC_idP, + rnti, + (frameP * 10) + subframeP, + harq_information, cce_idx); +} + +uint8_t get_V_UL_DAI(module_id_t module_idP, int CC_idP, uint16_t rntiP) +{ + nfapi_hi_dci0_request_body_t *HI_DCI0_req = + &RC.mac[module_idP]->HI_DCI0_req[CC_idP].hi_dci0_request_body; + nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = + &HI_DCI0_req->hi_dci0_pdu_list[0]; + + for (int i = 0; i < HI_DCI0_req->number_of_dci; i++) { + if ((hi_dci0_pdu[i].pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE) && + (hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.rnti == rntiP)) + return (hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8. + dl_assignment_index); + } + return (4); // this is rule from Section 7.3 in 36.213 +} + +void +fill_nfapi_ulsch_harq_information(module_id_t module_idP, + int CC_idP, + uint16_t rntiP, + nfapi_ul_config_ulsch_harq_information + * harq_information) +{ + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; + UE_list_t *UE_list = &eNB->UE_list; + + int UE_id = find_UE_id(module_idP, rntiP); + + PUSCH_ConfigDedicated_t *puschConfigDedicated; + // PUSCH_ConfigDedicated_v1020_t *puschConfigDedicated_v1020; + // PUSCH_ConfigDedicated_v1130_t *puschConfigDedicated_v1130; + // PUSCH_ConfigDedicated_v1250_t *puschConfigDedicated_v1250; + + AssertFatal(UE_id >= 0, "UE_id cannot be found, impossible\n"); + AssertFatal(UE_list != NULL, "UE_list is null\n"); + AssertFatal(UE_list->UE_template[CC_idP][UE_id]. + physicalConfigDedicated != NULL, + "physicalConfigDedicated for rnti %x is null\n", rntiP); + AssertFatal((puschConfigDedicated = (PUSCH_ConfigDedicated_t *) + UE_list->UE_template[CC_idP][UE_id]. + physicalConfigDedicated->pusch_ConfigDedicated) != NULL, + "physicalConfigDedicated->puschConfigDedicated for rnti %x is null\n", + rntiP); +#if defined(Rel14) || defined(Rel14) + /* if (UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->ext2) puschConfigDedicated_v1020 = UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->ext2->pusch_ConfigDedicated_v1020; + #endif + #ifdef Rel14 + if (UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->ext4) puschConfigDedicated_v1130 = UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->ext4->pusch_ConfigDedicated_v1130; + if (UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->ext5) puschConfigDedicated_v1250 = UE_list->UE_template[CC_idP][UE_id].physicalConfigDedicated->ext5->pusch_ConfigDedicated_v1250; + */ +#endif + harq_information->harq_information_rel10.delta_offset_harq = + puschConfigDedicated->betaOffset_ACK_Index; + AssertFatal(UE_list-> + UE_template[CC_idP][UE_id].physicalConfigDedicated-> + pucch_ConfigDedicated != NULL, + "pucch_ConfigDedicated is null!\n"); + if ((UE_list->UE_template[CC_idP][UE_id]. + physicalConfigDedicated->pucch_ConfigDedicated-> + tdd_AckNackFeedbackMode != NULL) + && (*UE_list->UE_template[CC_idP][UE_id]. + physicalConfigDedicated->pucch_ConfigDedicated-> + tdd_AckNackFeedbackMode == + PUCCH_ConfigDedicated__tdd_AckNackFeedbackMode_multiplexing)) + harq_information->harq_information_rel10.ack_nack_mode = 1; // multiplexing + else + harq_information->harq_information_rel10.ack_nack_mode = 0; // bundling + + switch (get_tmode(module_idP, CC_idP, UE_id)) { + case 1: + case 2: + case 5: + case 6: + case 7: + if (cc->tdd_Config == NULL) // FDD + harq_information->harq_information_rel10.harq_size = 1; + else { + if (harq_information->harq_information_rel10.ack_nack_mode == + 1) + harq_information->harq_information_rel10.harq_size = + get_V_UL_DAI(module_idP, CC_idP, rntiP); + else + harq_information->harq_information_rel10.harq_size = 1; + } + break; + default: // for any other TM we need 2 bits harq + if (cc->tdd_Config == NULL) { + harq_information->harq_information_rel10.harq_size = 2; + } else { + if (harq_information->harq_information_rel10.ack_nack_mode == + 1) + harq_information->harq_information_rel10.harq_size = + get_V_UL_DAI(module_idP, CC_idP, rntiP); + else + harq_information->harq_information_rel10.harq_size = 2; + } + break; + } // get Tmode +} + +void +fill_nfapi_harq_information(module_id_t module_idP, + int CC_idP, + uint16_t rntiP, + uint16_t absSFP, + nfapi_ul_config_harq_information * + harq_information, uint8_t cce_idxP) +{ + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; + UE_list_t *UE_list = &eNB->UE_list; + + int UE_id = find_UE_id(module_idP, rntiP); + + AssertFatal(UE_id >= 0, "UE_id cannot be found, impossible\n"); + AssertFatal(UE_list != NULL, "UE_list is null\n"); +#if 0 + /* TODO: revisit, don't use Assert, it's perfectly possible to + * have physicalConfigDedicated NULL here + */ + AssertFatal(UE_list->UE_template[CC_idP][UE_id]. + physicalConfigDedicated != NULL, + "physicalConfigDedicated for rnti %x is null\n", rntiP); +#endif + + harq_information->harq_information_rel11.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG; + harq_information->harq_information_rel11.num_ant_ports = 1; + + switch (get_tmode(module_idP, CC_idP, UE_id)) { + case 1: + case 2: + case 5: + case 6: + case 7: + if (cc->tdd_Config != NULL) { + AssertFatal(UE_list-> + UE_template[CC_idP] + [UE_id].physicalConfigDedicated-> + pucch_ConfigDedicated != NULL, + "pucch_ConfigDedicated is null for TDD!\n"); + if ((UE_list-> + UE_template[CC_idP][UE_id].physicalConfigDedicated-> + pucch_ConfigDedicated->tdd_AckNackFeedbackMode != NULL) + && (*UE_list-> + UE_template[CC_idP][UE_id].physicalConfigDedicated-> + pucch_ConfigDedicated->tdd_AckNackFeedbackMode == + PUCCH_ConfigDedicated__tdd_AckNackFeedbackMode_multiplexing)) + { + harq_information->harq_information_rel10_tdd.harq_size = 2; // 2-bit ACK/NAK + harq_information->harq_information_rel10_tdd.ack_nack_mode = 1; // multiplexing + } else { + harq_information->harq_information_rel10_tdd.harq_size = 1; // 1-bit ACK/NAK + harq_information->harq_information_rel10_tdd.ack_nack_mode = 0; // bundling + } + harq_information->harq_information_rel10_tdd.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG; + harq_information->harq_information_rel10_tdd.n_pucch_1_0 = + cc->radioResourceConfigCommon->pucch_ConfigCommon. + n1PUCCH_AN + cce_idxP; + harq_information-> + harq_information_rel10_tdd.number_of_pucch_resources = 1; + } else { + harq_information->harq_information_rel9_fdd.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG; + harq_information-> + harq_information_rel9_fdd.number_of_pucch_resources = 1; + harq_information->harq_information_rel9_fdd.harq_size = 1; // 1-bit ACK/NAK + harq_information->harq_information_rel9_fdd.n_pucch_1_0 = + cc->radioResourceConfigCommon->pucch_ConfigCommon. + n1PUCCH_AN + cce_idxP; + } + break; + default: // for any other TM we need 2 bits harq + if (cc->tdd_Config != NULL) { + AssertFatal(UE_list-> + UE_template[CC_idP] + [UE_id].physicalConfigDedicated-> + pucch_ConfigDedicated != NULL, + "pucch_ConfigDedicated is null for TDD!\n"); + if ((UE_list-> + UE_template[CC_idP][UE_id].physicalConfigDedicated-> + pucch_ConfigDedicated->tdd_AckNackFeedbackMode != NULL) + && (*UE_list-> + UE_template[CC_idP][UE_id].physicalConfigDedicated-> + pucch_ConfigDedicated->tdd_AckNackFeedbackMode == + PUCCH_ConfigDedicated__tdd_AckNackFeedbackMode_multiplexing)) + { + harq_information->harq_information_rel10_tdd.ack_nack_mode = 1; // multiplexing + } else { + harq_information->harq_information_rel10_tdd.ack_nack_mode = 0; // bundling + } + harq_information->harq_information_rel10_tdd.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG; + harq_information->harq_information_rel10_tdd.harq_size = 2; + harq_information->harq_information_rel10_tdd.n_pucch_1_0 = + cc->radioResourceConfigCommon->pucch_ConfigCommon. + n1PUCCH_AN + cce_idxP; + harq_information-> + harq_information_rel10_tdd.number_of_pucch_resources = 1; + } else { + harq_information->harq_information_rel9_fdd.tl.tag = NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG; + harq_information-> + harq_information_rel9_fdd.number_of_pucch_resources = 1; + harq_information->harq_information_rel9_fdd.ack_nack_mode = 0; // 1a/b + harq_information->harq_information_rel9_fdd.harq_size = 2; + harq_information->harq_information_rel9_fdd.n_pucch_1_0 = + cc->radioResourceConfigCommon->pucch_ConfigCommon. + n1PUCCH_AN + cce_idxP; + } + break; + } // get Tmode +} + +uint16_t +fill_nfapi_uci_acknak(module_id_t module_idP, + int CC_idP, + uint16_t rntiP, uint16_t absSFP, uint8_t cce_idxP) +{ + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; + + int ackNAK_absSF = get_pucch1_absSF(cc, absSFP); + nfapi_ul_config_request_t *ul_req = &eNB->UL_req_tmp[CC_idP][ackNAK_absSF % 10]; + nfapi_ul_config_request_body_t *ul_req_body = &ul_req->ul_config_request_body; + nfapi_ul_config_request_pdu_t *ul_config_pdu = + &ul_req_body->ul_config_pdu_list[ul_req_body->number_of_pdus]; + + memset((void *) ul_config_pdu, 0, + sizeof(nfapi_ul_config_request_pdu_t)); + ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE; + ul_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_ul_config_uci_harq_pdu)); + ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG; + ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.handle = 0; // don't know how to use this + ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti = + rntiP; + + fill_nfapi_harq_information(module_idP, CC_idP, + rntiP, + absSFP, + &ul_config_pdu->uci_harq_pdu. + harq_information, cce_idxP); + LOG_D(MAC, + "Filled in UCI HARQ request for rnti %x SF %d.%d acknakSF %d.%d, cce_idxP %d-> n1_pucch %d\n", + rntiP, absSFP / 10, absSFP % 10, ackNAK_absSF / 10, + ackNAK_absSF % 10, cce_idxP, + ul_config_pdu->uci_harq_pdu. + harq_information.harq_information_rel9_fdd.n_pucch_1_0); + + ul_req_body->number_of_pdus++; + ul_req_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + + ul_req->header.message_id = NFAPI_UL_CONFIG_REQUEST; + ul_req->sfn_sf = (ackNAK_absSF/10) << 4 | ackNAK_absSF%10; + + return (((ackNAK_absSF / 10) << 4) + (ackNAK_absSF % 10)); +} + +void +fill_nfapi_dlsch_config(eNB_MAC_INST * eNB, + nfapi_dl_config_request_body_t * dl_req, + uint16_t length, + uint16_t pdu_index, + uint16_t rnti, + uint8_t resource_allocation_type, + uint8_t + virtual_resource_block_assignment_flag, + uint16_t resource_block_coding, + uint8_t modulation, + uint8_t redundancy_version, + uint8_t transport_blocks, + uint8_t transport_block_to_codeword_swap_flag, + uint8_t transmission_scheme, + uint8_t number_of_layers, + uint8_t number_of_subbands, + // uint8_t codebook_index, + uint8_t ue_category_capacity, + uint8_t pa, + uint8_t delta_power_offset_index, + uint8_t ngap, + uint8_t nprb, + uint8_t transmission_mode, + uint8_t num_bf_prb_per_subband, + uint8_t num_bf_vector) +{ + nfapi_dl_config_request_pdu_t *dl_config_pdu = + &dl_req->dl_config_pdu_list[dl_req->number_pdu]; + memset((void *) dl_config_pdu, 0, + sizeof(nfapi_dl_config_request_pdu_t)); + + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DLSCH_PDU_TYPE; + dl_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_dl_config_dlsch_pdu)); + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.length = length; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index = pdu_index; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti = rnti; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_allocation_type = + resource_allocation_type; + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.virtual_resource_block_assignment_flag = + virtual_resource_block_assignment_flag; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.resource_block_coding = + resource_block_coding; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.modulation = modulation; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.redundancy_version = + redundancy_version; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transport_blocks = + transport_blocks; + dl_config_pdu->dlsch_pdu. + dlsch_pdu_rel8.transport_block_to_codeword_swap_flag = + transport_block_to_codeword_swap_flag; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_scheme = + transmission_scheme; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.number_of_layers = + number_of_layers; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.number_of_subbands = + number_of_subbands; + // dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.codebook_index = codebook_index; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ue_category_capacity = + ue_category_capacity; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pa = pa; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.delta_power_offset_index = + delta_power_offset_index; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.ngap = ngap; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.nprb = nprb; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.transmission_mode = + transmission_mode; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_prb_per_subband = + num_bf_prb_per_subband; + dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.num_bf_vector = num_bf_vector; + dl_req->number_pdu++; +} + +uint16_t +fill_nfapi_tx_req(nfapi_tx_request_body_t * tx_req_body, + uint16_t absSF, uint16_t pdu_length, + uint16_t pdu_index, uint8_t * pdu) +{ + nfapi_tx_request_pdu_t *TX_req = + &tx_req_body->tx_pdu_list[tx_req_body->number_of_pdus]; + LOG_D(MAC, "Filling TX_req %d for pdu length %d\n", + tx_req_body->number_of_pdus, pdu_length); + TX_req->pdu_length = pdu_length; + TX_req->pdu_index = pdu_index; + TX_req->num_segments = 1; + TX_req->segments[0].segment_length = pdu_length; + TX_req->segments[0].segment_data = pdu; + tx_req_body->tl.tag = NFAPI_TX_REQUEST_BODY_TAG; + tx_req_body->number_of_pdus++; + + return (((absSF / 10) << 4) + (absSF % 10)); +} + +void +fill_nfapi_ulsch_config_request_rel8(nfapi_ul_config_request_pdu_t * + ul_config_pdu, uint8_t cqi_req, + COMMON_channels_t * cc, + struct PhysicalConfigDedicated + *physicalConfigDedicated, + uint8_t tmode, uint32_t handle, + uint16_t rnti, + uint8_t resource_block_start, + uint8_t + number_of_resource_blocks, + uint8_t mcs, + uint8_t cyclic_shift_2_for_drms, + uint8_t + frequency_hopping_enabled_flag, + uint8_t frequency_hopping_bits, + uint8_t new_data_indication, + uint8_t redundancy_version, + uint8_t harq_process_number, + uint8_t ul_tx_mode, + uint8_t current_tx_nb, + uint8_t n_srs, uint16_t size) +{ + memset((void *) ul_config_pdu, 0, + sizeof(nfapi_ul_config_request_pdu_t)); + + ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_ULSCH_PDU_TYPE; + ul_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_ul_config_ulsch_pdu)); + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.handle = handle; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.rnti = rnti; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.resource_block_start = + resource_block_start; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.number_of_resource_blocks = + number_of_resource_blocks; + if (mcs < 11) + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.modulation_type = 2; + else if (mcs < 21) + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.modulation_type = 4; + else + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.modulation_type = 6; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.cyclic_shift_2_for_drms = + cyclic_shift_2_for_drms; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8. + frequency_hopping_enabled_flag = frequency_hopping_enabled_flag; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.frequency_hopping_bits = + frequency_hopping_bits; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.new_data_indication = + new_data_indication; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.redundancy_version = + redundancy_version; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.harq_process_number = + harq_process_number; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.ul_tx_mode = ul_tx_mode; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.current_tx_nb = current_tx_nb; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.n_srs = n_srs; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.size = size; + + if (cqi_req == 1) { + // Add CQI portion + ul_config_pdu->pdu_type = NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE; + ul_config_pdu->pdu_size = + (uint8_t) (2 + sizeof(nfapi_ul_config_ulsch_cqi_ri_pdu)); + ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG; + ul_config_pdu->ulsch_cqi_ri_pdu. + cqi_ri_information.cqi_ri_information_rel9.report_type = 1; + ul_config_pdu->ulsch_cqi_ri_pdu. + cqi_ri_information.cqi_ri_information_rel9. + aperiodic_cqi_pmi_ri_report.number_of_cc = 1; + LOG_D(MAC, "report_type %d\n", + ul_config_pdu->ulsch_cqi_ri_pdu. + cqi_ri_information.cqi_ri_information_rel9.report_type); + + if (cc->p_eNB <= 2 + && (tmode == 3 || tmode == 4 || tmode == 8 || tmode == 9 + || tmode == 10)) + ul_config_pdu->ulsch_cqi_ri_pdu. + cqi_ri_information.cqi_ri_information_rel9. + aperiodic_cqi_pmi_ri_report.cc[0].ri_size = 1; + else if (cc->p_eNB <= 2) + ul_config_pdu->ulsch_cqi_ri_pdu. + cqi_ri_information.cqi_ri_information_rel9. + aperiodic_cqi_pmi_ri_report.cc[0].ri_size = 0; + else if (cc->p_eNB == 4) + ul_config_pdu->ulsch_cqi_ri_pdu. + cqi_ri_information.cqi_ri_information_rel9. + aperiodic_cqi_pmi_ri_report.cc[0].ri_size = 2; + + AssertFatal(physicalConfigDedicated->cqi_ReportConfig != NULL, + "physicalConfigDedicated->cqi_ReportConfig is null!\n"); + AssertFatal(physicalConfigDedicated-> + cqi_ReportConfig->cqi_ReportModeAperiodic != NULL, + "physicalConfigDedicated->cqi_ReportModeAperiodic is null!\n"); + AssertFatal(physicalConfigDedicated->pusch_ConfigDedicated != NULL, + "physicalConfigDedicated->puschConfigDedicated is null!\n"); + + for (int ri = 0; + ri < + (1 << ul_config_pdu->ulsch_cqi_ri_pdu. + cqi_ri_information.cqi_ri_information_rel9. + aperiodic_cqi_pmi_ri_report.cc[0].ri_size); ri++) + ul_config_pdu->ulsch_cqi_ri_pdu. + cqi_ri_information.cqi_ri_information_rel9. + aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[ri] = + get_dl_cqi_pmi_size_pusch(cc, tmode, 1 + ri, + physicalConfigDedicated->cqi_ReportConfig->cqi_ReportModeAperiodic); + + ul_config_pdu->ulsch_cqi_ri_pdu. + cqi_ri_information.cqi_ri_information_rel9.delta_offset_cqi = + physicalConfigDedicated->pusch_ConfigDedicated-> + betaOffset_CQI_Index; + ul_config_pdu->ulsch_cqi_ri_pdu. + cqi_ri_information.cqi_ri_information_rel9.delta_offset_ri = + physicalConfigDedicated->pusch_ConfigDedicated-> + betaOffset_RI_Index; + } +} + +#ifdef Rel14 +void +fill_nfapi_ulsch_config_request_emtc(nfapi_ul_config_request_pdu_t * + ul_config_pdu, uint8_t ue_type, + uint16_t + total_number_of_repetitions, + uint16_t repetition_number, + uint16_t initial_transmission_sf_io) +{ + // Re13 fields + + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.ue_type = ue_type; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.total_number_of_repetitions = + total_number_of_repetitions; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.repetition_number = + repetition_number; + ul_config_pdu->ulsch_pdu.ulsch_pdu_rel13.initial_transmission_sf_io = + initial_transmission_sf_io; +} + +int get_numnarrowbands(long dl_Bandwidth) +{ + int nb_tab[6] = { 1, 2, 4, 8, 12, 16 }; + + AssertFatal(dl_Bandwidth < 7 + || dl_Bandwidth >= 0, "dl_Bandwidth not in [0..6]\n"); + return (nb_tab[dl_Bandwidth]); +} + +int get_numnarrowbandbits(long dl_Bandwidth) +{ + int nbbits_tab[6] = { 0, 1, 2, 3, 4, 4 }; + + AssertFatal(dl_Bandwidth < 7 + || dl_Bandwidth >= 0, "dl_Bandwidth not in [0..6]\n"); + return (nbbits_tab[dl_Bandwidth]); +} + +//This implements the frame/subframe condition for first subframe of MPDCCH transmission (Section 9.1.5 36.213, Rel 13/14) +int startSF_fdd_RA_times2[8] = { 2, 3, 4, 5, 8, 10, 16, 20 }; +int startSF_tdd_RA[7] = { 1, 2, 4, 5, 8, 10, 20 }; + +int +mpdcch_sf_condition(eNB_MAC_INST * eNB, int CC_id, frame_t frameP, + sub_frame_t subframeP, int rmax, + MPDCCH_TYPES_t mpdcch_type, int UE_id) +{ + struct PRACH_ConfigSIB_v1310 *ext4_prach = + eNB->common_channels[CC_id].radioResourceConfigCommon_BR-> + ext4->prach_ConfigCommon_v1310; + + int T; + EPDCCH_SetConfig_r11_t *epdcch_setconfig_r11; + + switch (mpdcch_type) { + case TYPE0: + AssertFatal(1 == 0, "MPDCCH Type 0 not handled yet\n"); + break; + case TYPE1: + AssertFatal(1 == 0, "MPDCCH Type 1 not handled yet\n"); + break; + case TYPE1A: + AssertFatal(1 == 0, "MPDCCH Type 1A not handled yet\n"); + break; + case TYPE2: // RAR + AssertFatal(ext4_prach->mpdcch_startSF_CSS_RA_r13 != NULL, + "mpdcch_startSF_CSS_RA_r13 is null\n"); + AssertFatal(rmax > 0, "rmax is 0!\b"); + if (eNB->common_channels[CC_id].tdd_Config == NULL) //FDD + T = rmax * + startSF_fdd_RA_times2[ext4_prach-> + mpdcch_startSF_CSS_RA_r13-> + choice.fdd_r13] >> 1; + else //TDD + T = rmax * + startSF_tdd_RA[ext4_prach-> + mpdcch_startSF_CSS_RA_r13->choice.tdd_r13]; + break; + case TYPE2A: + AssertFatal(1 == 0, "MPDCCH Type 2A not handled yet\n"); + break; + case TYPEUESPEC: + epdcch_setconfig_r11 = + eNB->UE_list.UE_template[CC_id][UE_id]. + physicalConfigDedicated->ext4->epdcch_Config_r11->config_r11. + choice.setup.setConfigToAddModList_r11->list.array[0]; + + AssertFatal(epdcch_setconfig_r11 != NULL, + " epdcch_setconfig_r11 is null for UE specific \n"); + AssertFatal(epdcch_setconfig_r11->ext2 != NULL, + " ext2 doesn't exist in epdcch config ' \n"); + + if (eNB->common_channels[CC_id].tdd_Config == NULL) //FDD + T = rmax * + startSF_fdd_RA_times2[epdcch_setconfig_r11-> + ext2->mpdcch_config_r13->choice. + setup.mpdcch_StartSF_UESS_r13.choice. + fdd_r13] >> 1; + else //TDD + T = rmax * + startSF_tdd_RA[epdcch_setconfig_r11-> + ext2->mpdcch_config_r13->choice. + setup.mpdcch_StartSF_UESS_r13.choice. + tdd_r13]; + + break; + default: + return (0); + } + + AssertFatal(T > 0, "T is 0!\n"); + if (((10 * frameP) + subframeP) % T == 0) + return (1); + else + return (0); +} + +int narrowband_to_first_rb(COMMON_channels_t * cc, int nb_index) +{ + switch (cc->mib->message.dl_Bandwidth) { + case 0: // 6 PRBs, N_NB=1, i_0=0 + return (0); + break; + case 3: // 50 PRBs, N_NB=8, i_0=1 + return ((int) (1 + (6 * nb_index))); + break; + case 5: // 100 PRBs, N_NB=16, i_0=2 + return ((int) (2 + (6 * nb_index))); + break; + case 1: // 15 PRBs N_NB=2, i_0=1 + if (nb_index > 0) + return (1); + else + return (0); + break; + case 2: // 25 PRBs, N_NB=4, i_0=0 + if (nb_index > 1) + return (1 + (6 * nb_index)); + else + return ((6 * nb_index)); + break; + case 4: // 75 PRBs, N_NB=12, i_0=1 + if (nb_index > 5) + return (2 + (6 * nb_index)); + else + return (1 + (6 * nb_index)); + break; + default: + AssertFatal(1 == 0, "Impossible dl_Bandwidth %d\n", + (int) cc->mib->message.dl_Bandwidth); + break; + } +} +#endif //------------------------------------------------------------------------------ void init_ue_sched_info(void) //------------------------------------------------------------------------------ { - module_id_t i,j,k; + module_id_t i, j, k; - for (i=0; iUE_list; - int UE_id; - UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list; - - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { - if (UE_list->UE_template[UE_PCCID(mod_idP,UE_id)][UE_id].rnti==rntiP) { - return(UE_id); + for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (UE_list->active[UE_id] != TRUE) + continue; + if (UE_list->UE_template[UE_PCCID(mod_idP, UE_id)][UE_id].rnti == + rntiP) { + return (UE_id); + } } - } - - return(-1); + return (-1); } //------------------------------------------------------------------------------ -int UE_num_active_CC(UE_list_t *listP,int ue_idP) +int find_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP) //------------------------------------------------------------------------------ { - return(listP->numactiveCCs[ue_idP]); + int RA_id; + AssertFatal(RC.mac[mod_idP], "RC.mac[%d] is null\n", mod_idP); + + RA_t *ra = (RA_t *) & RC.mac[mod_idP]->common_channels[CC_idP].ra[0]; + + for (RA_id = 0; RA_id < NB_RA_PROC_MAX; RA_id++) { + LOG_D(MAC, + "Checking RA_id %d for %x : state %d\n", + RA_id, rntiP, ra[RA_id].state); + + if (ra[RA_id].state != IDLE && + ra[RA_id].rnti == rntiP) + return (RA_id); + } + return (-1); } //------------------------------------------------------------------------------ -int UE_PCCID(module_id_t mod_idP,int ue_idP) +int UE_num_active_CC(UE_list_t * listP, int ue_idP) //------------------------------------------------------------------------------ { - return(eNB_mac_inst[mod_idP].UE_list.pCC_id[ue_idP]); + return (listP->numactiveCCs[ue_idP]); +} + +//------------------------------------------------------------------------------ +int UE_PCCID(module_id_t mod_idP, int ue_idP) +//------------------------------------------------------------------------------ +{ + return (RC.mac[mod_idP]->UE_list.pCC_id[ue_idP]); } //------------------------------------------------------------------------------ rnti_t UE_RNTI(module_id_t mod_idP, int ue_idP) //------------------------------------------------------------------------------ { + rnti_t rnti = + RC.mac[mod_idP]-> + UE_list.UE_template[UE_PCCID(mod_idP, ue_idP)][ue_idP].rnti; - rnti_t rnti = eNB_mac_inst[mod_idP].UE_list.UE_template[UE_PCCID(mod_idP,ue_idP)][ue_idP].rnti; + if (rnti > 0) { + return (rnti); + } - if (rnti>0) { - return (rnti); - } - - LOG_E(MAC,"[eNB %d] Couldn't find RNTI for UE %d\n",mod_idP,ue_idP); - //display_backtrace(); - return(NOT_A_RNTI); + LOG_D(MAC, "[eNB %d] Couldn't find RNTI for UE %d\n", mod_idP, ue_idP); + //display_backtrace(); + return (NOT_A_RNTI); } //------------------------------------------------------------------------------ boolean_t is_UE_active(module_id_t mod_idP, int ue_idP) //------------------------------------------------------------------------------ { - return(eNB_mac_inst[mod_idP].UE_list.active[ue_idP]); + return (RC.mac[mod_idP]->UE_list.active[ue_idP]); } /* @@ -190,356 +1998,362 @@ uint8_t find_active_UEs(module_id_t module_idP,int CC_id){ */ -// get aggregatiob form phy for a give UE -unsigned char process_ue_cqi (module_id_t module_idP, int ue_idP) +// get aggregation (L) form phy for a give UE +unsigned char +get_aggregation(uint8_t bw_index, uint8_t cqi, uint8_t dci_fmt) { - unsigned char aggregation=1; - // check the MCS and SNR and set the aggregation accordingly - return aggregation; -} -#ifdef CBA -/* -uint8_t find_num_active_UEs_in_cbagroup(module_id_t module_idP, int CC_id,unsigned char group_id){ + unsigned char aggregation = 3; - module_id_t UE_id; - rnti_t rnti; - unsigned char nb_ue_in_pusch=0; - LTE_eNB_UE_stats* eNB_UE_stats; - - for (UE_id=group_id;UE_id RRC_CONNECTED)){ - // && (UE_is_to_be_scheduled(module_idP,UE_id))) - // check at the phy enb_ue state for this rnti - if ((eNB_UE_stats= mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti)) != NULL){ - if ((eNB_UE_stats->mode == PUSCH) && (UE_is_to_be_scheduled(module_idP,UE_id) == 0)){ - nb_ue_in_pusch++; + switch (dci_fmt) { + case format0: + aggregation = cqi2fmt0_agg[bw_index][cqi]; + break; + case format1: + case format1A: + case format1B: + case format1D: + aggregation = cqi2fmt1x_agg[bw_index][cqi]; + break; + case format2: + case format2A: + case format2B: + case format2C: + case format2D: + aggregation = cqi2fmt2x_agg[bw_index][cqi]; + break; + case format1C: + case format1E_2A_M10PRB: + case format3: + case format3A: + case format4: + default: + LOG_W(MAC, "unsupported DCI format %d\n", dci_fmt); } - } - } - } - return(nb_ue_in_pusch); + + LOG_D(MAC, "Aggregation level %d (cqi %d, bw_index %d, format %d)\n", 1 << aggregation, cqi, bw_index, dci_fmt); + + return 1 << aggregation; } -*/ + +void dump_ue_list(UE_list_t * listP, int ul_flag) +{ + int j; + + if (ul_flag == 0) { + for (j = listP->head; j >= 0; j = listP->next[j]) { + LOG_T(MAC, "node %d => %d\n", j, listP->next[j]); + } + } else { + for (j = listP->head_ul; j >= 0; j = listP->next_ul[j]) { + LOG_T(MAC, "node %d => %d\n", j, listP->next_ul[j]); + } + } +} + +int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP, int harq_pidP +#ifdef Rel14 + , uint8_t rach_resource_type +#endif + ) +{ + int UE_id; + int i, j; + + UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; + + LOG_D(MAC, + "[eNB %d, CC_id %d] Adding UE with rnti %x (next avail %d, num_UEs %d)\n", + mod_idP, cc_idP, rntiP, UE_list->avail, UE_list->num_UEs); + dump_ue_list(UE_list, 0); + + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (UE_list->active[i] == TRUE) + continue; + UE_id = i; + memset(&UE_list->UE_template[cc_idP][UE_id], 0, + sizeof(UE_TEMPLATE)); + UE_list->UE_template[cc_idP][UE_id].rnti = rntiP; + UE_list->UE_template[cc_idP][UE_id].configured = FALSE; + UE_list->numactiveCCs[UE_id] = 1; + UE_list->numactiveULCCs[UE_id] = 1; + UE_list->pCC_id[UE_id] = cc_idP; + UE_list->ordered_CCids[0][UE_id] = cc_idP; + UE_list->ordered_ULCCids[0][UE_id] = cc_idP; + UE_list->num_UEs++; + UE_list->active[UE_id] = TRUE; +#if defined(USRP_REC_PLAY) // not specific to record/playback ? + UE_list->UE_template[cc_idP][UE_id].pre_assigned_mcs_ul = 0; +#endif + +#ifdef Rel14 + UE_list->UE_template[cc_idP][UE_id].rach_resource_type = + rach_resource_type; #endif -void dump_ue_list(UE_list_t *listP, int ul_flag) -{ - int j; + memset((void *) &UE_list->UE_sched_ctrl[UE_id], 0, + sizeof(UE_sched_ctrl)); + memset((void *) &UE_list->eNB_UE_stats[cc_idP][UE_id], 0, + sizeof(eNB_UE_STATS)); + UE_list->UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 0; - if ( ul_flag == 0 ) { - for (j=listP->head; j>=0; j=listP->next[j]) { - LOG_T(MAC,"node %d => %d\n",j,listP->next[j]); + UE_list->UE_sched_ctrl[UE_id].ta_update = 31; + + for (j = 0; j < 8; j++) { + UE_list->UE_template[cc_idP][UE_id].oldNDI[j] = (j == 0) ? 1 : 0; // 1 because first transmission is with format1A (Msg4) for harq_pid 0 + UE_list->UE_template[cc_idP][UE_id].oldNDI_UL[j] = (j == harq_pidP) ? 0 : 1; // 1st transmission is with Msg3; + UE_list->UE_sched_ctrl[UE_id].round[cc_idP][j] = 8; + UE_list->UE_sched_ctrl[UE_id].round_UL[cc_idP][j] = 0; + } + + eNB_ulsch_info[mod_idP][cc_idP][UE_id].status = S_UL_WAITING; + eNB_dlsch_info[mod_idP][cc_idP][UE_id].status = S_DL_WAITING; + LOG_D(MAC, "[eNB %d] Add UE_id %d on Primary CC_id %d: rnti %x\n", + mod_idP, UE_id, cc_idP, rntiP); + dump_ue_list(UE_list, 0); + return (UE_id); } - } else { - for (j=listP->head_ul; j>=0; j=listP->next_ul[j]) { - LOG_T(MAC,"node %d => %d\n",j,listP->next_ul[j]); - } - } + + printf("MAC: cannot add new UE for rnti %x\n", rntiP); + LOG_E(MAC, + "error in add_new_ue(), could not find space in UE_list, Dumping UE list\n"); + dump_ue_list(UE_list, 0); + return (-1); } -int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP) +//------------------------------------------------------------------------------ +int rrc_mac_remove_ue(module_id_t mod_idP, rnti_t rntiP) +//------------------------------------------------------------------------------ { - int UE_id; - int j; + int i; + int j; + UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; + int UE_id = find_UE_id(mod_idP,rntiP); + int pCC_id; - UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list; - - LOG_D(MAC,"[eNB %d, CC_id %d] Adding UE with rnti %x (next avail %d, num_UEs %d)\n",mod_idP,cc_idP,rntiP,UE_list->avail,UE_list->num_UEs); - dump_ue_list(UE_list,0); - - if (UE_list->avail>=0) { - UE_id = UE_list->avail; - AssertFatal( UE_id < NUMBER_OF_UE_MAX, "BAD UE_id %u > NUMBER_OF_UE_MAX",UE_id ); - UE_list->avail = UE_list->next[UE_list->avail]; - UE_list->next[UE_id] = UE_list->head; - UE_list->next_ul[UE_id] = UE_list->head_ul; - UE_list->head = UE_id; - UE_list->head_ul = UE_id; - UE_list->UE_template[cc_idP][UE_id].rnti = rntiP; - UE_list->UE_template[cc_idP][UE_id].configured = FALSE; - UE_list->numactiveCCs[UE_id] = 1; - UE_list->numactiveULCCs[UE_id] = 1; - UE_list->pCC_id[UE_id] = cc_idP; - UE_list->ordered_CCids[0][UE_id] = cc_idP; - UE_list->ordered_ULCCids[0][UE_id] = cc_idP; - UE_list->num_UEs++; - UE_list->active[UE_id] = TRUE; - memset((void*)&UE_list->UE_sched_ctrl[UE_id],0,sizeof(UE_sched_ctrl)); - - for (j=0; j<8; j++) { - UE_list->UE_template[cc_idP][UE_id].oldNDI[j] = (j==0)?1:0; // 1 because first transmission is with format1A (Msg4) for harq_pid 0 - UE_list->UE_template[cc_idP][UE_id].oldNDI_UL[j] = (j==harq_pidP)?0:1; // 1st transmission is with Msg3; + if (UE_id == -1) { + LOG_W(MAC,"rrc_mac_remove_ue: UE %x not found\n", rntiP); + return 0; } - eNB_ulsch_info[mod_idP][cc_idP][UE_id].status = S_UL_WAITING; - eNB_dlsch_info[mod_idP][cc_idP][UE_id].status = S_DL_WAITING; - LOG_D(MAC,"[eNB %d] Add UE_id %d on Primary CC_id %d: rnti %x\n",mod_idP,UE_id,cc_idP,rntiP); + pCC_id = UE_PCCID(mod_idP,UE_id); + + LOG_I(MAC,"Removing UE %d from Primary CC_id %d (rnti %x)\n",UE_id,pCC_id, rntiP); dump_ue_list(UE_list,0); - return(UE_id); - } - LOG_E(MAC,"error in add_new_ue(), could not find space in UE_list, Dumping UE list\n"); - dump_ue_list(UE_list,0); - return(-1); -} + UE_list->active[UE_id] = FALSE; + UE_list->num_UEs--; -//------------------------------------------------------------------------------ -int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP) -//------------------------------------------------------------------------------ -{ + if (UE_list->head == UE_id) UE_list->head=UE_list->next[UE_id]; + else UE_list->next[prev(UE_list,UE_id,0)]=UE_list->next[UE_id]; + if (UE_list->head_ul == UE_id) UE_list->head_ul=UE_list->next_ul[UE_id]; + else UE_list->next_ul[prev(UE_list,UE_id,0)]=UE_list->next_ul[UE_id]; - int prev,i, ret=-1; + // clear all remaining pending transmissions + /* UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID0] = 0; + UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID1] = 0; + UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID2] = 0; + UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID3] = 0; + UE_list->UE_template[pCC_id][UE_id].ul_SR = 0; + UE_list->UE_template[pCC_id][UE_id].rnti = NOT_A_RNTI; + UE_list->UE_template[pCC_id][UE_id].ul_active = FALSE; + */ + memset (&UE_list->UE_template[pCC_id][UE_id],0,sizeof(UE_TEMPLATE)); - UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list; - int UE_id = find_UE_id(mod_idP,rntiP); - int pCC_id = UE_PCCID(mod_idP,UE_id); + UE_list->eNB_UE_stats[pCC_id][UE_id].total_rbs_used = 0; + UE_list->eNB_UE_stats[pCC_id][UE_id].total_rbs_used_retx = 0; + for ( j = 0; j < NB_RB_MAX; j++ ) { + UE_list->eNB_UE_stats[pCC_id][UE_id].num_pdu_tx[j] = 0; + UE_list->eNB_UE_stats[pCC_id][UE_id].num_bytes_tx[j] = 0; + } + UE_list->eNB_UE_stats[pCC_id][UE_id].num_retransmission = 0; + UE_list->eNB_UE_stats[pCC_id][UE_id].total_sdu_bytes = 0; + UE_list->eNB_UE_stats[pCC_id][UE_id].total_pdu_bytes = 0; + UE_list->eNB_UE_stats[pCC_id][UE_id].total_num_pdus = 0; + UE_list->eNB_UE_stats[pCC_id][UE_id].total_rbs_used_rx = 0; + for ( j = 0; j < NB_RB_MAX; j++ ) { + UE_list->eNB_UE_stats[pCC_id][UE_id].num_pdu_rx[j] = 0; + UE_list->eNB_UE_stats[pCC_id][UE_id].num_bytes_rx[j] = 0; + } + UE_list->eNB_UE_stats[pCC_id][UE_id].num_errors_rx = 0; + UE_list->eNB_UE_stats[pCC_id][UE_id].total_pdu_bytes_rx = 0; + UE_list->eNB_UE_stats[pCC_id][UE_id].total_num_pdus_rx = 0; + UE_list->eNB_UE_stats[pCC_id][UE_id].total_num_errors_rx = 0; + + eNB_ulsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI; + eNB_ulsch_info[mod_idP][pCC_id][UE_id].status = S_UL_NONE; + eNB_dlsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI; + eNB_dlsch_info[mod_idP][pCC_id][UE_id].status = S_DL_NONE; + + eNB_ulsch_info[mod_idP][pCC_id][UE_id].serving_num = 0; + eNB_dlsch_info[mod_idP][pCC_id][UE_id].serving_num = 0; + + // check if this has an RA process active + RA_t *ra; + for (i = 0; i < NB_RA_PROC_MAX; i++) { + ra = (RA_t *) & RC.mac[mod_idP]->common_channels[pCC_id].ra[i]; + if (ra->rnti == rntiP) { + ra->state = IDLE; + ra->timing_offset = 0; + ra->RRC_timer = 20; + ra->rnti = 0; + //break; + } + } - if (UE_id == -1) { - LOG_W(MAC,"rrc_mac_remove_ue: UE %x not found\n", rntiP); - mac_phy_remove_ue(mod_idP,rntiP); return 0; - } - - LOG_I(MAC,"Removing UE %d from Primary CC_id %d (rnti %x)\n",UE_id,pCC_id, rntiP); - dump_ue_list(UE_list,0); - - // clear all remaining pending transmissions - UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID0] = 0; - UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID1] = 0; - UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID2] = 0; - UE_list->UE_template[pCC_id][UE_id].bsr_info[LCGID3] = 0; - - UE_list->UE_template[pCC_id][UE_id].ul_SR = 0; - UE_list->UE_template[pCC_id][UE_id].rnti = NOT_A_RNTI; - UE_list->UE_template[pCC_id][UE_id].ul_active = FALSE; - eNB_ulsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI; - eNB_ulsch_info[mod_idP][pCC_id][UE_id].status = S_UL_NONE; - eNB_dlsch_info[mod_idP][pCC_id][UE_id].rnti = NOT_A_RNTI; - eNB_dlsch_info[mod_idP][pCC_id][UE_id].status = S_DL_NONE; - - prev = UE_list->head; - - for (i=UE_list->head; i>=0; i=UE_list->next[i]) { - if (i == UE_id) { - // link prev to next in Active list - if (i==UE_list->head) { - UE_list->head = UE_list->next[i]; - } else { - UE_list->next[prev] = UE_list->next[i]; - } - - // add UE id (i)to available - UE_list->next[i] = UE_list->avail; - UE_list->avail = i; - UE_list->active[i] = FALSE; - UE_list->num_UEs--; - ret=0; - break; - } - - prev=i; - } - - // do the same for UL - prev = UE_list->head_ul; - - for (i=UE_list->head_ul; i>=0; i=UE_list->next_ul[i]) { - if (i == UE_id) { - // link prev to next in Active list - if (i==UE_list->head_ul) { - UE_list->head_ul = UE_list->next_ul[i]; - } else { - UE_list->next_ul[prev] = UE_list->next_ul[i]; - } - - // add UE id (i)to available - UE_list->next_ul[i] = UE_list->avail; - ret = 0; - break; - } - - prev=i; - } - - mac_phy_remove_ue(mod_idP,rntiP); - - if (ret == 0) { - return (0); - } - - LOG_E(MAC,"error in mac_remove_ue(), could not find previous to %d in UE_list, should never happen, Dumping UE list\n",UE_id); - dump_ue_list(UE_list,0); - mac_xface->macphy_exit("mac_remove_ue: Problem in UE_list"); - return(-1); - } - - -int prev(UE_list_t *listP, int nodeP, int ul_flag) +int prev(UE_list_t * listP, int nodeP, int ul_flag) { - int j; + int j; - if (ul_flag == 0 ) { - if (nodeP==listP->head) { - return(nodeP); + if (ul_flag == 0) { + if (nodeP == listP->head) { + return (nodeP); + } + + for (j = listP->head; j >= 0; j = listP->next[j]) { + if (listP->next[j] == nodeP) { + return (j); + } + } + } else { + if (nodeP == listP->head_ul) { + return (nodeP); + } + + for (j = listP->head_ul; j >= 0; j = listP->next_ul[j]) { + if (listP->next_ul[j] == nodeP) { + return (j); + } + } } - for (j=listP->head; j>=0; j=listP->next[j]) { - if (listP->next[j]==nodeP) { - return(j); - } - } - } else { - if (nodeP==listP->head_ul) { - return(nodeP); - } + LOG_E(MAC, + "error in prev(), could not find previous to %d in UE_list %s, should never happen, Dumping UE list\n", + nodeP, (ul_flag == 0) ? "DL" : "UL"); + dump_ue_list(listP, ul_flag); - for (j=listP->head_ul; j>=0; j=listP->next_ul[j]) { - if (listP->next_ul[j]==nodeP) { - return(j); - } - } - } - - LOG_E(MAC,"error in prev(), could not find previous to %d in UE_list %s, should never happen, Dumping UE list\n", - nodeP, (ul_flag == 0)? "DL" : "UL"); - dump_ue_list(listP, ul_flag); - - - return(-1); + return (-1); } -void swap_UEs(UE_list_t *listP,int nodeiP, int nodejP, int ul_flag) +void swap_UEs(UE_list_t * listP, int nodeiP, int nodejP, int ul_flag) { + int prev_i, prev_j, next_i, next_j; - int prev_i,prev_j,next_i,next_j; + LOG_T(MAC, "Swapping UE %d,%d\n", nodeiP, nodejP); + dump_ue_list(listP, ul_flag); - LOG_T(MAC,"Swapping UE %d,%d\n",nodeiP,nodejP); - dump_ue_list(listP,ul_flag); + prev_i = prev(listP, nodeiP, ul_flag); + prev_j = prev(listP, nodejP, ul_flag); - prev_i = prev(listP,nodeiP,ul_flag); - prev_j = prev(listP,nodejP,ul_flag); + AssertFatal((prev_i >= 0) && (prev_j >= 0), "swap_UEs: problem"); - if ((prev_i<0) || (prev_j<0)) { - mac_xface->macphy_exit("swap_UEs: problem"); - return; // not reached - } - - if (ul_flag == 0) { - next_i = listP->next[nodeiP]; - next_j = listP->next[nodejP]; - } else { - next_i = listP->next_ul[nodeiP]; - next_j = listP->next_ul[nodejP]; - } - - LOG_T(MAC,"[%s] next_i %d, next_i, next_j %d, head %d \n", - (ul_flag == 0)? "DL" : "UL", - next_i,next_j,listP->head); - - if (ul_flag == 0 ) { - - if (next_i == nodejP) { // case ... p(i) i j n(j) ... => ... p(j) j i n(i) ... - LOG_T(MAC,"Case ... p(i) i j n(j) ... => ... p(j) j i n(i) ...\n"); - - listP->next[nodeiP] = next_j; - listP->next[nodejP] = nodeiP; - - if (nodeiP==listP->head) { // case i j n(j) - listP->head = nodejP; - } else { - listP->next[prev_i] = nodejP; - } - } else if (next_j == nodeiP) { // case ... p(j) j i n(i) ... => ... p(i) i j n(j) ... - LOG_T(MAC,"Case ... p(j) j i n(i) ... => ... p(i) i j n(j) ...\n"); - listP->next[nodejP] = next_i; - listP->next[nodeiP] = nodejP; - - if (nodejP==listP->head) { // case j i n(i) - listP->head = nodeiP; - } else { - listP->next[prev_j] = nodeiP; - } - } else { // case ... p(i) i n(i) ... p(j) j n(j) ... - listP->next[nodejP] = next_i; - listP->next[nodeiP] = next_j; - - - if (nodeiP==listP->head) { - LOG_T(MAC,"changing head to %d\n",nodejP); - listP->head=nodejP; - listP->next[prev_j] = nodeiP; - } else if (nodejP==listP->head) { - LOG_D(MAC,"changing head to %d\n",nodeiP); - listP->head=nodeiP; - listP->next[prev_i] = nodejP; - } else { - listP->next[prev_i] = nodejP; - listP->next[prev_j] = nodeiP; - } + if (ul_flag == 0) { + next_i = listP->next[nodeiP]; + next_j = listP->next[nodejP]; + } else { + next_i = listP->next_ul[nodeiP]; + next_j = listP->next_ul[nodejP]; } - } else { // ul_flag - if (next_i == nodejP) { // case ... p(i) i j n(j) ... => ... p(j) j i n(i) ... - LOG_T(MAC,"[UL] Case ... p(i) i j n(j) ... => ... p(j) j i n(i) ...\n"); + LOG_T(MAC, "[%s] next_i %d, next_i, next_j %d, head %d \n", + (ul_flag == 0) ? "DL" : "UL", next_i, next_j, listP->head); - listP->next_ul[nodeiP] = next_j; - listP->next_ul[nodejP] = nodeiP; + if (ul_flag == 0) { - if (nodeiP==listP->head_ul) { // case i j n(j) - listP->head_ul = nodejP; - } else { - listP->next_ul[prev_i] = nodejP; - } - } else if (next_j == nodeiP) { // case ... p(j) j i n(i) ... => ... p(i) i j n(j) ... - LOG_T(MAC,"[UL]Case ... p(j) j i n(i) ... => ... p(i) i j n(j) ...\n"); - listP->next_ul[nodejP] = next_i; - listP->next_ul[nodeiP] = nodejP; + if (next_i == nodejP) { // case ... p(i) i j n(j) ... => ... p(j) j i n(i) ... + LOG_T(MAC, + "Case ... p(i) i j n(j) ... => ... p(j) j i n(i) ...\n"); - if (nodejP==listP->head_ul) { // case j i n(i) - listP->head_ul = nodeiP; - } else { - listP->next_ul[prev_j] = nodeiP; - } - } else { // case ... p(i) i n(i) ... p(j) j n(j) ... + listP->next[nodeiP] = next_j; + listP->next[nodejP] = nodeiP; - listP->next_ul[nodejP] = next_i; - listP->next_ul[nodeiP] = next_j; + if (nodeiP == listP->head) { // case i j n(j) + listP->head = nodejP; + } else { + listP->next[prev_i] = nodejP; + } + } else if (next_j == nodeiP) { // case ... p(j) j i n(i) ... => ... p(i) i j n(j) ... + LOG_T(MAC, + "Case ... p(j) j i n(i) ... => ... p(i) i j n(j) ...\n"); + listP->next[nodejP] = next_i; + listP->next[nodeiP] = nodejP; + if (nodejP == listP->head) { // case j i n(i) + listP->head = nodeiP; + } else { + listP->next[prev_j] = nodeiP; + } + } else { // case ... p(i) i n(i) ... p(j) j n(j) ... + listP->next[nodejP] = next_i; + listP->next[nodeiP] = next_j; - if (nodeiP==listP->head_ul) { - LOG_T(MAC,"[UL]changing head to %d\n",nodejP); - listP->head_ul=nodejP; - listP->next_ul[prev_j] = nodeiP; - } else if (nodejP==listP->head_ul) { - LOG_T(MAC,"[UL]changing head to %d\n",nodeiP); - listP->head_ul=nodeiP; - listP->next_ul[prev_i] = nodejP; - } else { - listP->next_ul[prev_i] = nodejP; - listP->next_ul[prev_j] = nodeiP; - } + if (nodeiP == listP->head) { + LOG_T(MAC, "changing head to %d\n", nodejP); + listP->head = nodejP; + listP->next[prev_j] = nodeiP; + } else if (nodejP == listP->head) { + LOG_D(MAC, "changing head to %d\n", nodeiP); + listP->head = nodeiP; + listP->next[prev_i] = nodejP; + } else { + listP->next[prev_i] = nodejP; + listP->next[prev_j] = nodeiP; + } + } + } else { // ul_flag + + if (next_i == nodejP) { // case ... p(i) i j n(j) ... => ... p(j) j i n(i) ... + LOG_T(MAC, + "[UL] Case ... p(i) i j n(j) ... => ... p(j) j i n(i) ...\n"); + + listP->next_ul[nodeiP] = next_j; + listP->next_ul[nodejP] = nodeiP; + + if (nodeiP == listP->head_ul) { // case i j n(j) + listP->head_ul = nodejP; + } else { + listP->next_ul[prev_i] = nodejP; + } + } else if (next_j == nodeiP) { // case ... p(j) j i n(i) ... => ... p(i) i j n(j) ... + LOG_T(MAC, + "[UL]Case ... p(j) j i n(i) ... => ... p(i) i j n(j) ...\n"); + listP->next_ul[nodejP] = next_i; + listP->next_ul[nodeiP] = nodejP; + + if (nodejP == listP->head_ul) { // case j i n(i) + listP->head_ul = nodeiP; + } else { + listP->next_ul[prev_j] = nodeiP; + } + } else { // case ... p(i) i n(i) ... p(j) j n(j) ... + + listP->next_ul[nodejP] = next_i; + listP->next_ul[nodeiP] = next_j; + + if (nodeiP == listP->head_ul) { + LOG_T(MAC, "[UL]changing head to %d\n", nodejP); + listP->head_ul = nodejP; + listP->next_ul[prev_j] = nodeiP; + } else if (nodejP == listP->head_ul) { + LOG_T(MAC, "[UL]changing head to %d\n", nodeiP); + listP->head_ul = nodeiP; + listP->next_ul[prev_i] = nodejP; + } else { + listP->next_ul[prev_i] = nodejP; + listP->next_ul[prev_j] = nodeiP; + } + } } - } - LOG_T(MAC,"After swap\n"); - dump_ue_list(listP,ul_flag); + LOG_T(MAC, "After swap\n"); + dump_ue_list(listP, ul_flag); } - - - - - - - /* - #ifdef Rel10 + #if defined(Rel10) || defined(Rel14) unsigned char generate_mch_header( unsigned char *mac_header, unsigned char num_sdus, unsigned short *sdu_lengths, @@ -650,493 +2464,2044 @@ void swap_UEs(UE_list_t *listP,int nodeiP, int nodejP, int ul_flag) } #endif */ -void add_common_dci(DCI_PDU *DCI_pdu, - void *pdu, - rnti_t rnti, - unsigned char dci_size_bytes, - unsigned char aggregation, - unsigned char dci_size_bits, - unsigned char dci_fmt, - uint8_t ra_flag) -{ - - memcpy(&DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci].dci_pdu[0],pdu,dci_size_bytes); - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci].dci_length = dci_size_bits; - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci].L = aggregation; - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci].rnti = rnti; - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci].format = dci_fmt; - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci].ra_flag = ra_flag; - - - DCI_pdu->Num_common_dci++; - LOG_D(MAC,"add common dci format %d for rnti %x \n",dci_fmt,rnti); -} - -void add_ue_spec_dci(DCI_PDU *DCI_pdu,void *pdu,rnti_t rnti,unsigned char dci_size_bytes,unsigned char aggregation,unsigned char dci_size_bits,unsigned char dci_fmt,uint8_t ra_flag) -{ - - memcpy(&DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci].dci_pdu[0],pdu,dci_size_bytes); - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci].dci_length = dci_size_bits; - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci].L = aggregation; - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci].rnti = rnti; - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci].format = dci_fmt; - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci].ra_flag = ra_flag; - - DCI_pdu->Num_ue_spec_dci++; - - LOG_D(MAC,"add ue specific dci format %d for rnti %x \n",dci_fmt,rnti); -} - - - - // This has to be updated to include BSR information -uint8_t UE_is_to_be_scheduled(module_id_t module_idP,int CC_id,uint8_t UE_id) +uint8_t +UE_is_to_be_scheduled(module_id_t module_idP, int CC_id, uint8_t UE_id) { + UE_TEMPLATE *UE_template = + &RC.mac[module_idP]->UE_list.UE_template[CC_id][UE_id]; + UE_sched_ctrl *UE_sched_ctl = + &RC.mac[module_idP]->UE_list.UE_sched_ctrl[UE_id]; - UE_TEMPLATE *UE_template = &eNB_mac_inst[module_idP].UE_list.UE_template[CC_id][UE_id]; - UE_sched_ctrl *UE_sched_ctl = &eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[UE_id]; + // do not schedule UE if UL is not working + if (UE_sched_ctl->ul_failure_timer > 0) + return (0); + if (UE_sched_ctl->ul_out_of_sync > 0) + return (0); + LOG_D(MAC, "[eNB %d][PUSCH] Checking UL requirements UE %d/%x\n", + module_idP, UE_id, UE_RNTI(module_idP, UE_id)); - // do not schedule UE if UL is not working - if (UE_sched_ctl->ul_failure_timer>0) - return(0); - if (UE_sched_ctl->ul_out_of_sync>0) - return(0); + if ((UE_template->bsr_info[LCGID0] > 0) || (UE_template->bsr_info[LCGID1] > 0) || (UE_template->bsr_info[LCGID2] > 0) || (UE_template->bsr_info[LCGID3] > 0) || (UE_template->ul_SR > 0) || // uplink scheduling request + ((UE_sched_ctl->ul_inactivity_timer > 20) && (UE_sched_ctl->ul_scheduled == 0)) || // every 2 frames when RRC_CONNECTED + ((UE_sched_ctl->ul_inactivity_timer > 10) && (UE_sched_ctl->ul_scheduled == 0) && (mac_eNB_get_rrc_status(module_idP, UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED))) // every Frame when not RRC_CONNECTED + { + LOG_D(MAC, + "[eNB %d][PUSCH] UE %d/%x should be scheduled (BSR0 %d,SR %d)\n", + module_idP, UE_id, UE_RNTI(module_idP, UE_id), + UE_template->bsr_info[LCGID0], UE_template->ul_SR); + return (1); + } else { + return (0); + } +} - LOG_D(MAC,"[eNB %d][PUSCH] Checking UL requirements UE %d/%x\n",module_idP,UE_id,UE_RNTI(module_idP,UE_id)); +uint8_t get_tmode(module_id_t module_idP, int CC_idP, int UE_idP) +{ + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; - if ((UE_template->bsr_info[LCGID0]>0) || - (UE_template->bsr_info[LCGID1]>0) || - (UE_template->bsr_info[LCGID2]>0) || - (UE_template->bsr_info[LCGID3]>0) || - (UE_template->ul_SR>0) || // uplink scheduling request - ((UE_sched_ctl->ul_inactivity_timer>20)&& - (UE_sched_ctl->ul_scheduled==0))|| // every 2 frames when RRC_CONNECTED - ((UE_sched_ctl->ul_inactivity_timer>10)&& - (UE_sched_ctl->ul_scheduled==0)&& - (mac_eNB_get_rrc_status(module_idP,UE_RNTI(module_idP,UE_id)) < RRC_CONNECTED))) // every Frame when not RRC_CONNECTED - { + struct PhysicalConfigDedicated *physicalConfigDedicated = + eNB->UE_list.physicalConfigDedicated[CC_idP][UE_idP]; - LOG_D(MAC,"[eNB %d][PUSCH] UE %d/%x should be scheduled\n",module_idP,UE_id,UE_RNTI(module_idP,UE_id)); - return(1); - } else { - return(0); - } + if (physicalConfigDedicated == NULL) { // RRCConnectionSetup not received by UE yet + AssertFatal(cc->p_eNB <= 2, "p_eNB is %d, should be <2\n", + cc->p_eNB); + return (cc->p_eNB); + } else { + AssertFatal(physicalConfigDedicated->antennaInfo != NULL, + "antennaInfo is null for CCId %d, UEid %d\n", CC_idP, + UE_idP); + + AssertFatal(physicalConfigDedicated->antennaInfo->present != + PhysicalConfigDedicated__antennaInfo_PR_NOTHING, + "antennaInfo (mod_id %d, CC_id %d) is set to NOTHING\n", + module_idP, CC_idP); + + if (physicalConfigDedicated->antennaInfo->present == + PhysicalConfigDedicated__antennaInfo_PR_explicitValue) { + return (physicalConfigDedicated->antennaInfo-> + choice.explicitValue.transmissionMode); + } else if (physicalConfigDedicated->antennaInfo->present == + PhysicalConfigDedicated__antennaInfo_PR_defaultValue) { + AssertFatal(cc->p_eNB <= 2, "p_eNB is %d, should be <2\n", + cc->p_eNB); + return (cc->p_eNB); + } else + AssertFatal(1 == 0, "Shouldn't be here\n"); + } +} + +int8_t +get_ULharq(module_id_t module_idP, int CC_idP, uint16_t frameP, + uint8_t subframeP) +{ + uint8_t ret = -1; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + COMMON_channels_t *cc = &eNB->common_channels[CC_idP]; + + if (cc->tdd_Config == NULL) { // FDD + ret = (((frameP << 1) + subframeP) & 7); + } else { + switch (cc->tdd_Config->subframeAssignment) { + case 1: + if ((subframeP == 2) || + (subframeP == 3) || (subframeP == 7) || (subframeP == 8)) + switch (subframeP) { + case 2: + case 3: + ret = (subframeP - 2); + break; + + case 7: + case 8: + ret = (subframeP - 5); + break; + + default: + AssertFatal(1 == 0, + "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframeP, + (int) cc->tdd_Config->subframeAssignment); + break; + } + + break; + + case 2: + AssertFatal((subframeP == 2) || (subframeP == 7), + "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframeP, + (int) cc->tdd_Config->subframeAssignment); + ret = (subframeP / 7); + break; + + case 3: + AssertFatal((subframeP > 1) && (subframeP < 5), + "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframeP, + (int) cc->tdd_Config->subframeAssignment); + ret = (subframeP - 2); + break; + + case 4: + AssertFatal((subframeP > 1) && (subframeP < 4), + "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframeP, + (int) cc->tdd_Config->subframeAssignment); + ret = (subframeP - 2); + break; + + case 5: + AssertFatal(subframeP == 2, + "subframe2_harq_pid, Illegal subframe %d for TDD mode %d\n", + subframeP, + (int) cc->tdd_Config->subframeAssignment); + ret = (subframeP - 2); + break; + + default: + AssertFatal(1 == 0, + "subframe2_harq_pid, Unsupported TDD mode %d\n", + (int) cc->tdd_Config->subframeAssignment); + break; + } + } + + AssertFatal(ret != -1, + "invalid harq_pid(%d) at SFN/SF = %d/%d\n", (int8_t) ret, + frameP, subframeP); + return ret; } - - -uint32_t allocate_prbs(int UE_id,unsigned char nb_rb, uint32_t *rballoc) +uint16_t getRIV(uint16_t N_RB_DL, uint16_t RBstart, uint16_t Lcrbs) { + uint16_t RIV; - int i; - uint32_t rballoc_dci=0; - unsigned char nb_rb_alloc=0; + if (Lcrbs <= (1 + (N_RB_DL >> 1))) + RIV = (N_RB_DL * (Lcrbs - 1)) + RBstart; + else + RIV = (N_RB_DL * (N_RB_DL + 1 - Lcrbs)) + (N_RB_DL - 1 - RBstart); - for (i=0; i<(mac_xface->lte_frame_parms->N_RB_DL-2); i+=2) { - if (((*rballoc>>i)&3)==0) { - *rballoc |= (3<>1)); - nb_rb_alloc+=2; + return (RIV); +} + +uint32_t +allocate_prbs(int UE_id, unsigned char nb_rb, int N_RB_DL, + uint32_t * rballoc) +{ + int i; + uint32_t rballoc_dci = 0; + unsigned char nb_rb_alloc = 0; + + for (i = 0; i < (N_RB_DL - 2); i += 2) { + if (((*rballoc >> i) & 3) == 0) { + *rballoc |= (3 << i); + rballoc_dci |= (1 << ((12 - i) >> 1)); + nb_rb_alloc += 2; + } + + if (nb_rb_alloc == nb_rb) { + return (rballoc_dci); + } } - if (nb_rb_alloc==nb_rb) { - return(rballoc_dci); + if ((N_RB_DL & 1) == 1) { + if ((*rballoc >> (N_RB_DL - 1) & 1) == 0) { + *rballoc |= (1 << (N_RB_DL - 1)); + rballoc_dci |= 1; + } } - } - if ((mac_xface->lte_frame_parms->N_RB_DL&1)==1) { - if ((*rballoc>>(mac_xface->lte_frame_parms->N_RB_DL-1)&1)==0) { - *rballoc |= (1<<(mac_xface->lte_frame_parms->N_RB_DL-1)); - rballoc_dci |= 1;//(1<<(mac_xface->lte_frame_parms->N_RB_DL>>1)); + return (rballoc_dci); +} + +int get_bw_index(module_id_t module_id, uint8_t CC_id) +{ + int bw_index = 0; + + int N_RB_DL = + to_prb(RC.mac[module_id]->common_channels[CC_id].mib-> + message.dl_Bandwidth); + + switch (N_RB_DL) { + case 6: // 1.4 MHz + bw_index = 0; + break; + + case 25: // 5HMz + bw_index = 1; + break; + + case 50: // 10HMz + bw_index = 2; + break; + + case 100: // 20HMz + bw_index = 3; + break; + + default: + bw_index = 1; + LOG_W(MAC, + "[eNB %d] N_RB_DL %d unknown for CC_id %d, setting bw_index to 1\n", + module_id, N_RB_DL, CC_id); + break; } - } - return(rballoc_dci); + return bw_index; } int get_min_rb_unit(module_id_t module_id, uint8_t CC_id) { + int min_rb_unit = 0; + int N_RB_DL = + to_prb(RC.mac[module_id]->common_channels[CC_id].mib-> + message.dl_Bandwidth); - int min_rb_unit=0; - LTE_DL_FRAME_PARMS* frame_parms = mac_xface->get_lte_frame_parms(module_id,CC_id); + switch (N_RB_DL) { + case 6: // 1.4 MHz + min_rb_unit = 1; + break; - switch (frame_parms->N_RB_DL) { - case 6: // 1.4 MHz - min_rb_unit=1; - break; + case 25: // 5HMz + min_rb_unit = 2; + break; - case 25: // 5HMz - min_rb_unit=2; - break; + case 50: // 10HMz + min_rb_unit = 3; + break; - case 50: // 10HMz - min_rb_unit=3; - break; + case 100: // 20HMz + min_rb_unit = 4; + break; - case 100: // 20HMz - min_rb_unit=4; - break; - - default: - min_rb_unit=2; - LOG_W(MAC,"[eNB %d] N_DL_RB %d unknown for CC_id %d, setting min_rb_unit to 2\n", module_id, CC_id); - break; - } - - return min_rb_unit; -} - -uint32_t allocate_prbs_sub(int nb_rb, uint8_t *rballoc) -{ - - int check=0;//check1=0,check2=0; - uint32_t rballoc_dci=0; - //uint8_t number_of_subbands=13; - - LOG_T(MAC,"*****Check1RBALLOC****: %d%d%d%d (nb_rb %d,N_RBG %d)\n", - rballoc[3],rballoc[2],rballoc[1],rballoc[0],nb_rb,mac_xface->lte_frame_parms->N_RBG); - - while((nb_rb >0) && (check < mac_xface->lte_frame_parms->N_RBG)) { - //printf("rballoc[%d] %d\n",check,rballoc[check]); - if(rballoc[check] == 1) { - rballoc_dci |= (1<<((mac_xface->lte_frame_parms->N_RBG-1)-check)); - - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - nb_rb--; - break; - - case 25: - if ((check == mac_xface->lte_frame_parms->N_RBG-1)) { - nb_rb--; - } else { - nb_rb-=2; - } - - break; - - case 50: - if ((check == mac_xface->lte_frame_parms->N_RBG-1)) { - nb_rb-=2; - } else { - nb_rb-=3; - } - - break; - - case 100: - nb_rb-=4; - break; - } + default: + min_rb_unit = 2; + LOG_W(MAC, + "[eNB %d] N_DL_RB %d unknown for CC_id %d, setting min_rb_unit to 2\n", + module_id, N_RB_DL, CC_id); + break; } - // printf("rb_alloc %x\n",rballoc_dci); - check = check+1; - // check1 = check1+2; - } - - // rballoc_dci = (rballoc_dci)&(0x1fff); - LOG_T(MAC,"*********RBALLOC : %x\n",rballoc_dci); - // exit(-1); - return (rballoc_dci); + return min_rb_unit; } - -int get_nb_subband(void) +uint32_t +allocate_prbs_sub(int nb_rb, int N_RB_DL, int N_RBG, uint8_t * rballoc) { + int check = 0; //check1=0,check2=0; + uint32_t rballoc_dci = 0; + //uint8_t number_of_subbands=13; - int nb_sb=0; + LOG_T(MAC, "*****Check1RBALLOC****: %d%d%d%d (nb_rb %d,N_RBG %d)\n", + rballoc[3], rballoc[2], rballoc[1], rballoc[0], nb_rb, N_RBG); - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - nb_sb=0; - break; + while ((nb_rb > 0) && (check < N_RBG)) { + //printf("rballoc[%d] %d\n",check,rballoc[check]); + if (rballoc[check] == 1) { + rballoc_dci |= (1 << ((N_RBG - 1) - check)); - case 15: - nb_sb = 4; // sb_size =4 + switch (N_RB_DL) { + case 6: + nb_rb--; + break; - case 25: - nb_sb = 7; // sb_size =4, 1 sb with 1PRB, 6 with 2 RBG, each has 2 PRBs - break; + case 25: + if ((check == N_RBG - 1)) { + nb_rb--; + } else { + nb_rb -= 2; + } - case 50: // sb_size =6 - nb_sb = 9; - break; + break; - case 75: // sb_size =8 - nb_sb = 10; - break; + case 50: + if ((check == N_RBG - 1)) { + nb_rb -= 2; + } else { + nb_rb -= 3; + } - case 100: // sb_size =8 , 1 sb with 1 RBG + 12 sb with 2RBG, each RBG has 4 PRBs - nb_sb = 13; - break; + break; - default: - nb_sb=0; - break; - } - - return nb_sb; - -} - -void init_CCE_table(int module_idP,int CC_idP) -{ - memset(eNB_mac_inst[module_idP].CCE_table[CC_idP],0,800*sizeof(int)); -} - - -int get_nCCE_offset(int *CCE_table, - const unsigned char L, - const int nCCE, - const int common_dci, - const unsigned short rnti, - const unsigned char subframe) -{ - - int search_space_free,m,nb_candidates = 0,l,i; - unsigned int Yk; - /* - printf("CCE Allocation: "); - for (i=0;i=0 ; m--) { - - search_space_free = 1; - for (l=0; lCCE_table[CC_idP], 0, 800 * sizeof(int)); +} + + +int +get_nCCE_offset(int *CCE_table, + const unsigned char L, + const int nCCE, + const int common_dci, + const unsigned short rnti, const unsigned char subframe) +{ + int search_space_free, m, nb_candidates = 0, l, i; + unsigned int Yk; + /* + printf("CCE Allocation: "); + for (i=0;i= 0; m--) { + + search_space_free = 1; + for (l = 0; l < L; l++) { + + // printf("CCE_table[%d] %d\n",(m*L)+l,CCE_table[(m*L)+l]); + if (CCE_table[(m * L) + l] == 1) { + search_space_free = 0; + break; + } + } + + if (search_space_free == 1) { + + // printf("returning %d\n",m*L); + + for (l = 0; l < L; l++) + CCE_table[(m * L) + l] = 1; + return (m * L); + } + } + + return (-1); + + } else { // Find first available in ue specific search space + // according to procedure in Section 9.1.1 of 36.213 (v. 8.6) + // compute Yk + Yk = (unsigned int) rnti; + + for (i = 0; i <= subframe; i++) + Yk = (Yk * 39827) % 65537; + + Yk = Yk % (nCCE / L); + + switch (L) { + case 1: + case 2: + nb_candidates = 6; + break; + + case 4: + case 8: + nb_candidates = 2; + break; + + default: + DevParam(L, nCCE, rnti); + break; + } + + LOG_D(MAC, "rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n", + rnti, Yk, nCCE, nCCE / L, nb_candidates); + + for (m = 0; m < nb_candidates; m++) { + search_space_free = 1; + + for (l = 0; l < L; l++) { + int cce = (((Yk + m) % (nCCE / L)) * L) + l; + if (cce >= nCCE || CCE_table[cce] == 1) { + search_space_free = 0; + break; + } + } + + if (search_space_free == 1) { + for (l = 0; l < L; l++) + CCE_table[(((Yk + m) % (nCCE / L)) * L) + l] = 1; + + return (((Yk + m) % (nCCE / L)) * L); + } + } + + return (-1); + } +} + +void +dump_CCE_table(int *CCE_table, const int nCCE, + const unsigned short rnti, const int subframe, int L) +{ + int nb_candidates = 0, i; + unsigned int Yk; + + printf("CCE 0: "); + for (i = 0; i < nCCE; i++) { + printf("%1d.", CCE_table[i]); + if ((i & 7) == 7) + printf("\n CCE %d: ", i); + } + + Yk = (unsigned int) rnti; + + for (i = 0; i <= subframe; i++) + Yk = (Yk * 39827) % 65537; + + Yk = Yk % (nCCE / L); switch (L) { case 1: case 2: - nb_candidates = 6; - break; + nb_candidates = 6; + break; case 4: case 8: - nb_candidates = 2; - break; + nb_candidates = 2; + break; default: - DevParam(L, nCCE, rnti); - break; + DevParam(L, nCCE, rnti); + break; } + printf("rnti %x, Yk*L = %d, nCCE %d (nCCE/L %d),nb_cand*L %d\n", rnti, + Yk * L, nCCE, nCCE / L, nb_candidates * L); +} - LOG_D(MAC,"rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n",rnti,Yk,nCCE,nCCE/L,nb_candidates); +uint16_t +getnquad(COMMON_channels_t * cc, uint8_t num_pdcch_symbols, uint8_t mi) +{ + uint16_t Nreg = 0; - for (m = 0 ; m < nb_candidates ; m++) { - search_space_free = 1; + AssertFatal(cc != NULL, "cc is null\n"); + AssertFatal(cc->mib != NULL, "cc->mib is null\n"); - for (l=0; lmib->message.dl_Bandwidth); + int phich_resource = get_phich_resource_times6(cc); - if (search_space_free == 1) { - for (l=0; l 0) + Ngroup_PHICH++; + + if (cc->Ncp == 1) { + Ngroup_PHICH <<= 1; } - return(-1); - } + Ngroup_PHICH *= mi; + + if ((num_pdcch_symbols > 0) && (num_pdcch_symbols < 4)) + switch (N_RB_DL) { + case 6: + Nreg = 12 + (num_pdcch_symbols - 1) * 18; + break; + + case 25: + Nreg = 50 + (num_pdcch_symbols - 1) * 75; + break; + + case 50: + Nreg = 100 + (num_pdcch_symbols - 1) * 150; + break; + + case 100: + Nreg = 200 + (num_pdcch_symbols - 1) * 300; + break; + + default: + return (0); + } + // printf("Nreg %d (%d)\n",Nreg,Nreg - 4 - (3*Ngroup_PHICH)); + return (Nreg - 4 - (3 * Ngroup_PHICH)); +} + +uint16_t +getnCCE(COMMON_channels_t * cc, uint8_t num_pdcch_symbols, uint8_t mi) +{ + AssertFatal(cc != NULL, "cc is null\n"); + return (getnquad(cc, num_pdcch_symbols, mi) / 9); +} + +uint8_t getmi(COMMON_channels_t * cc, int subframe) +{ + AssertFatal(cc != NULL, "cc is null\n"); + + // for FDD + if (cc->tdd_Config == NULL) // FDD + return 1; + + // for TDD + switch (cc->tdd_Config->subframeAssignment) { + case 0: + if ((subframe == 0) || (subframe == 5)) + return (2); + else + return (1); + + break; + + case 1: + if ((subframe == 0) || (subframe == 5)) + return (0); + else + return (1); + + break; + + case 2: + if ((subframe == 3) || (subframe == 8)) + return (1); + else + return (0); + + break; + + case 3: + if ((subframe == 0) || (subframe == 8) || (subframe == 9)) + return (1); + else + return (0); + + break; + + case 4: + if ((subframe == 8) || (subframe == 9)) + return (1); + else + return (0); + + break; + + case 5: + if (subframe == 8) + return (1); + else + return (0); + + break; + + case 6: + return (1); + break; + + default: + return (0); + } +} + +uint16_t +get_nCCE_max(COMMON_channels_t * cc, int num_pdcch_symbols, int subframe) +{ + AssertFatal(cc != NULL, "cc is null\n"); + return (getnCCE(cc, num_pdcch_symbols, getmi(cc, subframe))); } // Allocate the CCEs -int allocate_CCEs(int module_idP, - int CC_idP, - int subframeP, - int test_onlyP) { +int +allocate_CCEs(int module_idP, int CC_idP, int subframeP, int test_onlyP) +{ + int *CCE_table = RC.mac[module_idP]->CCE_table[CC_idP]; + nfapi_dl_config_request_body_t *DL_req = + &RC.mac[module_idP]->DL_req[CC_idP].dl_config_request_body; + nfapi_hi_dci0_request_body_t *HI_DCI0_req = + &RC.mac[module_idP]->HI_DCI0_req[CC_idP].hi_dci0_request_body; + nfapi_dl_config_request_pdu_t *dl_config_pdu = + &DL_req->dl_config_pdu_list[0]; + nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = + &HI_DCI0_req->hi_dci0_pdu_list[0]; + int nCCE_max = + get_nCCE_max(&RC.mac[module_idP]->common_channels[CC_idP], 1, + subframeP); + int fCCE; + int i, j, idci; + int nCCE = 0; + LOG_D(MAC, + "Allocate CCEs subframe %d, test %d : (DL PDU %d, DL DCI %d, UL %d)\n", + subframeP, test_onlyP, DL_req->number_pdu, DL_req->number_dci, + HI_DCI0_req->number_of_dci); + DL_req->number_pdcch_ofdm_symbols = 1; - int *CCE_table = eNB_mac_inst[module_idP].CCE_table[CC_idP]; - DCI_PDU *DCI_pdu = &eNB_mac_inst[module_idP].common_channels[CC_idP].DCI_pdu; - int nCCE_max = mac_xface->get_nCCE_max(module_idP,CC_idP,1,subframeP); - int fCCE; - int i,j; - DCI_ALLOC_t *dci_alloc; - int nCCE=0; + try_again: + init_CCE_table(module_idP, CC_idP); + nCCE = 0; - LOG_D(MAC,"Allocate CCEs subframe %d, test %d : (common %d,uspec %d)\n",subframeP,test_onlyP,DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); - DCI_pdu->num_pdcch_symbols=1; + for (i = 0, idci = 0; i < DL_req->number_pdu; i++) { + // allocate DL common DCIs first + if ((dl_config_pdu[i].pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) + && (dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.rnti_type == + 2)) { + LOG_D(MAC, + "Trying to allocate COMMON DCI %d/%d (%d,%d) : rnti %x, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", + idci, DL_req->number_dci + HI_DCI0_req->number_of_dci, + DL_req->number_dci, HI_DCI0_req->number_of_dci, + dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.rnti, + dl_config_pdu[i].dci_dl_pdu. + dci_dl_pdu_rel8.aggregation_level, nCCE, nCCE_max, + DL_req->number_pdcch_ofdm_symbols); -try_again: - init_CCE_table(module_idP,CC_idP); - nCCE=0; + if (nCCE + + (dl_config_pdu[i].dci_dl_pdu. + dci_dl_pdu_rel8.aggregation_level) > nCCE_max) { + if (DL_req->number_pdcch_ofdm_symbols == 3) + goto failed; + LOG_D(MAC, + "Can't fit DCI allocations with %d PDCCH symbols, increasing by 1\n", + DL_req->number_pdcch_ofdm_symbols); + DL_req->number_pdcch_ofdm_symbols++; + nCCE_max = + get_nCCE_max(&RC.mac[module_idP]-> + common_channels[CC_idP], + DL_req->number_pdcch_ofdm_symbols, + subframeP); + goto try_again; + } + // number of CCEs left can potentially hold this allocation + fCCE = get_nCCE_offset(CCE_table, + dl_config_pdu[i]. + dci_dl_pdu.dci_dl_pdu_rel8. + aggregation_level, nCCE_max, 1, + dl_config_pdu[i]. + dci_dl_pdu.dci_dl_pdu_rel8.rnti, + subframeP); + if (fCCE == -1) { + if (DL_req->number_pdcch_ofdm_symbols == 3) { + LOG_D(MAC, + "subframe %d: Dropping Allocation for RNTI %x\n", + subframeP, + dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8. + rnti); + for (j = 0; j <= i; j++) { + if (dl_config_pdu[j].pdu_type == + NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) + LOG_D(MAC, + "DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", + j, + DL_req->number_dci + + HI_DCI0_req->number_of_dci, + DL_req->number_dci, + HI_DCI0_req->number_of_dci, + dl_config_pdu[j]. + dci_dl_pdu.dci_dl_pdu_rel8.rnti, + dl_config_pdu[j]. + dci_dl_pdu.dci_dl_pdu_rel8.dci_format, + dl_config_pdu[j]. + dci_dl_pdu.dci_dl_pdu_rel8. + aggregation_level, nCCE, nCCE_max, + DL_req->number_pdcch_ofdm_symbols); + } + //dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,1<L); + goto failed; + } + LOG_D(MAC, + "Can't fit DCI allocations with %d PDCCH symbols (rnti condition), increasing by 1\n", + DL_req->number_pdcch_ofdm_symbols); - for (i=0;iNum_common_dci + DCI_pdu->Num_ue_spec_dci;i++) { - dci_alloc = &DCI_pdu->dci_alloc[i]; - LOG_D(MAC,"Trying to allocate DCI %d/%d (%d,%d) : rnti %x, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", - i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci, - DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci, - dci_alloc->rnti,1<L, - nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols); + DL_req->number_pdcch_ofdm_symbols++; + nCCE_max = + get_nCCE_max(&RC.mac[module_idP]-> + common_channels[CC_idP], + DL_req->number_pdcch_ofdm_symbols, + subframeP); + goto try_again; + } // fCCE==-1 - if (nCCE + (1<L) > nCCE_max) { - if (DCI_pdu->num_pdcch_symbols == 3) - goto failed; - DCI_pdu->num_pdcch_symbols++; - nCCE_max = mac_xface->get_nCCE_max(module_idP,CC_idP,DCI_pdu->num_pdcch_symbols,subframeP); - goto try_again; + // the allocation is feasible, rnti rule passes + nCCE += + dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8. + aggregation_level; + LOG_D(MAC, "Allocating at nCCE %d\n", fCCE); + if (test_onlyP == 0) { + dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.cce_idx = fCCE; + LOG_D(MAC, + "Allocate COMMON DCI CCEs subframe %d, test %d => L %d fCCE %d\n", + subframeP, test_onlyP, + dl_config_pdu[i].dci_dl_pdu. + dci_dl_pdu_rel8.aggregation_level, fCCE); + } + idci++; + } + } // for i = 0 ... num_DL_DCIs + + // no try to allocate UL DCIs + for (i = 0; i < HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi; + i++) { + + // allocate UL DCIs + if (hi_dci0_pdu[i].pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE) { + + LOG_D(MAC, + "Trying to allocate format 0 DCI %d/%d (%d,%d) : rnti %x, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", + idci, DL_req->number_dci + HI_DCI0_req->number_of_dci, + DL_req->number_dci, HI_DCI0_req->number_of_dci, + hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.rnti, + hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.aggregation_level, + nCCE, nCCE_max, DL_req->number_pdcch_ofdm_symbols); + + if (nCCE + + (hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.aggregation_level) > + nCCE_max) { + if (DL_req->number_pdcch_ofdm_symbols == 3) + goto failed; + LOG_D(MAC, + "Can't fit DCI allocations with %d PDCCH symbols, increasing by 1\n", + DL_req->number_pdcch_ofdm_symbols); + + DL_req->number_pdcch_ofdm_symbols++; + nCCE_max = + get_nCCE_max(&RC.mac[module_idP]-> + common_channels[CC_idP], + DL_req->number_pdcch_ofdm_symbols, + subframeP); + goto try_again; + } + // number of CCEs left can potentially hold this allocation + fCCE = get_nCCE_offset(CCE_table, + hi_dci0_pdu[i].dci_pdu. + dci_pdu_rel8.aggregation_level, + nCCE_max, 0, + hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8. + rnti, subframeP); + if (fCCE == -1) { + if (DL_req->number_pdcch_ofdm_symbols == 3) { + LOG_D(MAC, + "subframe %d: Dropping Allocation for RNTI %x\n", + subframeP, + hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.rnti); + for (j = 0; j <= i; j++) { + if (hi_dci0_pdu[j].pdu_type == + NFAPI_HI_DCI0_DCI_PDU_TYPE) + LOG_D(MAC, + "DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", + j, + DL_req->number_dci + + HI_DCI0_req->number_of_dci, + DL_req->number_dci, + HI_DCI0_req->number_of_dci, + hi_dci0_pdu[j].dci_pdu.dci_pdu_rel8.rnti, + hi_dci0_pdu[j].dci_pdu.dci_pdu_rel8. + dci_format, + hi_dci0_pdu[j].dci_pdu. + dci_pdu_rel8.aggregation_level, nCCE, + nCCE_max, + DL_req->number_pdcch_ofdm_symbols); + } + //dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,1<L); + goto failed; + } + LOG_D(MAC, + "Can't fit DCI allocations with %d PDCCH symbols (rnti condition), increasing by 1\n", + DL_req->number_pdcch_ofdm_symbols); + + DL_req->number_pdcch_ofdm_symbols++; + nCCE_max = + get_nCCE_max(&RC.mac[module_idP]-> + common_channels[CC_idP], + DL_req->number_pdcch_ofdm_symbols, + subframeP); + goto try_again; + } // fCCE==-1 + + // the allocation is feasible, rnti rule passes + nCCE += hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.aggregation_level; + LOG_D(MAC, "Allocating at nCCE %d\n", fCCE); + if (test_onlyP == 0) { + hi_dci0_pdu[i].dci_pdu.dci_pdu_rel8.cce_index = fCCE; + LOG_D(MAC, "Allocate CCEs subframe %d, test %d\n", + subframeP, test_onlyP); + } + idci++; + } + } // for i = 0 ... num_UL_DCIs + + for (i = 0; i < DL_req->number_pdu; i++) { + // allocate DL UE specific DCIs + if ((dl_config_pdu[i].pdu_type == NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) + && (dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.rnti_type == + 1)) { + LOG_D(MAC, + "Trying to allocate DL UE-SPECIFIC DCI %d/%d (%d,%d) : rnti %x, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", + idci, DL_req->number_dci + HI_DCI0_req->number_of_dci, + DL_req->number_dci, HI_DCI0_req->number_of_dci, + dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.rnti, + dl_config_pdu[i].dci_dl_pdu. + dci_dl_pdu_rel8.aggregation_level, nCCE, nCCE_max, + DL_req->number_pdcch_ofdm_symbols); + + if (nCCE + + (dl_config_pdu[i].dci_dl_pdu. + dci_dl_pdu_rel8.aggregation_level) > nCCE_max) { + if (DL_req->number_pdcch_ofdm_symbols == 3) + goto failed; + LOG_D(MAC, + "Can't fit DCI allocations with %d PDCCH symbols, increasing by 1\n", + DL_req->number_pdcch_ofdm_symbols); + + DL_req->number_pdcch_ofdm_symbols++; + nCCE_max = + get_nCCE_max(&RC.mac[module_idP]-> + common_channels[CC_idP], + DL_req->number_pdcch_ofdm_symbols, + subframeP); + goto try_again; + } + // number of CCEs left can potentially hold this allocation + fCCE = get_nCCE_offset(CCE_table, + dl_config_pdu[i]. + dci_dl_pdu.dci_dl_pdu_rel8. + aggregation_level, nCCE_max, 0, + dl_config_pdu[i]. + dci_dl_pdu.dci_dl_pdu_rel8.rnti, + subframeP); + if (fCCE == -1) { + if (DL_req->number_pdcch_ofdm_symbols == 3) { + LOG_I(MAC, + "subframe %d: Dropping Allocation for RNTI %x\n", + subframeP, + dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8. + rnti); + for (j = 0; j <= i; j++) { + if (dl_config_pdu[j].pdu_type == + NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE) + LOG_I(MAC, + "DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", + j, + DL_req->number_dci + + HI_DCI0_req->number_of_dci, + DL_req->number_dci, + HI_DCI0_req->number_of_dci, + dl_config_pdu[j]. + dci_dl_pdu.dci_dl_pdu_rel8.rnti, + dl_config_pdu[j]. + dci_dl_pdu.dci_dl_pdu_rel8.dci_format, + dl_config_pdu[j]. + dci_dl_pdu.dci_dl_pdu_rel8. + aggregation_level, nCCE, nCCE_max, + DL_req->number_pdcch_ofdm_symbols); + } + //dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,1<L); + goto failed; + } + LOG_D(MAC, + "Can't fit DCI allocations with %d PDCCH symbols (rnti condition), increasing by 1\n", + DL_req->number_pdcch_ofdm_symbols); + + DL_req->number_pdcch_ofdm_symbols++; + nCCE_max = + get_nCCE_max(&RC.mac[module_idP]-> + common_channels[CC_idP], + DL_req->number_pdcch_ofdm_symbols, + subframeP); + goto try_again; + } // fCCE==-1 + + // the allocation is feasible, rnti rule passes + nCCE += + dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8. + aggregation_level; + LOG_D(MAC, "Allocating at nCCE %d\n", fCCE); + if (test_onlyP == 0) { + dl_config_pdu[i].dci_dl_pdu.dci_dl_pdu_rel8.cce_idx = fCCE; + LOG_D(MAC, "Allocate CCEs subframe %d, test %d\n", + subframeP, test_onlyP); + } + idci++; + } + } // for i = 0 ... num_DL_DCIs + + return 0; + + failed: + return -1; +} + +/* +uint8_t get_ul_req_index(module_id_t module_idP, int CC_idP, sub_frame_t subframeP) +{ + if (RC.mac[module_idP]->common_channels[CC_idP].tdd_Config == NULL) + return(0); + + switch (RC.mac[module_idP]->common_channels[CC_idP].tdd_Config->subframeAssignment) { + case 0: + case 1: + case 2: + case 6: + return(0); + case 3: + // 1,5,6 -> 2, prog. 8, buffer 0 + // 7,8 -> 3, prog. 9, buffer 1 + // 9,0 -> 4, prog. 0, buffer 0 + if ((subframeP == 7) || (subframeP == 8)) return(1); + else return(0); + case 4: + // 0,1,4,5 -> 2, prog. 8, buffer 0 + // 6,7,8,9 -> 3, prog. 9, buffer 1 + if (subframeP<6) return(0); + else return(1); + return(1); + break; + case 5: + // 9(-1),0,1,3,4,5,6,7,8,9 -> 2, prog 8, buffer 0 + return(0); + break; + default: + AssertFatal(1==0,"Should not get here, why is tdd_Config->subframeAssignment = %d\n",(int)RC.mac[module_idP]->common_channels[CC_idP].tdd_Config->subframeAssignment); + break; + } + return(0); +} +*/ + +nfapi_ul_config_request_pdu_t *has_ul_grant(module_id_t module_idP, + int CC_idP, uint16_t absSFP, + uint16_t rnti) +{ + nfapi_ul_config_request_body_t *ul_req; + nfapi_ul_config_request_pdu_t *ul_config_pdu; + + ul_req = + &RC.mac[module_idP]->UL_req_tmp[CC_idP][absSFP % + 10].ul_config_request_body; + ul_config_pdu = &ul_req->ul_config_pdu_list[0]; + LOG_D(MAC, + "Checking for rnti %x UL grant in subframeP %d (num pdu %d)\n", + rnti, absSFP % 10, ul_req->number_of_pdus); + + for (int i = 0; i < ul_req->number_of_pdus; i++) { + LOG_D(MAC, "PDU %d : type %d,rnti %x\n", i, + ul_config_pdu[i].pdu_type, rnti); + if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) + && (ul_config_pdu[i].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + if ((ul_config_pdu[i].pdu_type == + NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) + && (ul_config_pdu[i].ulsch_cqi_ri_pdu.ulsch_pdu. + ulsch_pdu_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + if ((ul_config_pdu[i].pdu_type == + NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE) + && (ul_config_pdu[i].ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8. + rnti == rnti)) + return (&ul_config_pdu[i]); + if ((ul_config_pdu[i].pdu_type == + NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE) + && (ul_config_pdu[i].ulsch_cqi_harq_ri_pdu. + ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + + if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE) + && (ul_config_pdu[i].uci_cqi_pdu. + ue_information.ue_information_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + if ((ul_config_pdu[i].pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE) + && (ul_config_pdu[i].uci_sr_pdu. + ue_information.ue_information_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + if ((ul_config_pdu[i].pdu_type == + NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) + && (ul_config_pdu[i].uci_harq_pdu. + ue_information.ue_information_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + if ((ul_config_pdu[i].pdu_type == + NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE) + && (ul_config_pdu[i].uci_sr_harq_pdu. + ue_information.ue_information_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + if ((ul_config_pdu[i].pdu_type == + NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE) + && (ul_config_pdu[i].uci_cqi_harq_pdu. + ue_information.ue_information_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + if ((ul_config_pdu[i].pdu_type == + NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE) + && (ul_config_pdu[i].uci_cqi_sr_pdu. + ue_information.ue_information_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + if ((ul_config_pdu[i].pdu_type == + NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE) + && (ul_config_pdu[i].uci_cqi_sr_harq_pdu. + ue_information.ue_information_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + + if ((ul_config_pdu[i].pdu_type == + NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE) + && (ul_config_pdu[i].ulsch_uci_csi_pdu. + ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + if ((ul_config_pdu[i].pdu_type == + NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE) + && (ul_config_pdu[i].ulsch_uci_harq_pdu. + ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); + if ((ul_config_pdu[i].pdu_type == + NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE) + && (ul_config_pdu[i].ulsch_csi_uci_harq_pdu. + ulsch_pdu.ulsch_pdu_rel8.rnti == rnti)) + return (&ul_config_pdu[i]); } - // number of CCEs left can potentially hold this allocation - fCCE = get_nCCE_offset(CCE_table, - 1<<(dci_alloc->L), - nCCE_max, - (iNum_common_dci) ? 1 : 0, - dci_alloc->rnti, - subframeP); - if (fCCE == -1) { - if (DCI_pdu->num_pdcch_symbols == 3) { - LOG_I(MAC,"subframe %d: Dropping Allocation for RNTI %x\n", - subframeP,dci_alloc->rnti); - for (j=0;j<=i;j++){ - LOG_I(MAC,"DCI %d/%d (%d,%d) : rnti %x dci format %d, aggreg %d nCCE %d / %d (num_pdcch_symbols %d)\n", - i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci, - DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci, - DCI_pdu->dci_alloc[j].rnti,DCI_pdu->dci_alloc[j].format, - 1<dci_alloc[j].L, - nCCE,nCCE_max,DCI_pdu->num_pdcch_symbols); - } - goto failed; - } - DCI_pdu->num_pdcch_symbols++; - nCCE_max = mac_xface->get_nCCE_max(module_idP,CC_idP,DCI_pdu->num_pdcch_symbols,subframeP); - goto try_again; - } // fCCE==-1 + return (NULL); // no ul grant at all for this UE +} - // the allocation is feasible, rnti rule passes - nCCE += (1<L); - LOG_D(MAC,"Allocating at nCCE %d\n",fCCE); - if (test_onlyP == 0) { - dci_alloc->firstCCE=fCCE; - LOG_D(MAC,"Allocate CCEs subframe %d, test %d\n",subframeP,test_onlyP); +boolean_t +CCE_allocation_infeasible(int module_idP, + int CC_idP, + int format_flag, + int subframe, int aggregation, int rnti) +{ + nfapi_dl_config_request_body_t *DL_req = + &RC.mac[module_idP]->DL_req[CC_idP].dl_config_request_body; + nfapi_dl_config_request_pdu_t *dl_config_pdu = + &DL_req->dl_config_pdu_list[DL_req->number_pdu]; + nfapi_hi_dci0_request_body_t *HI_DCI0_req = + &RC.mac[module_idP]->HI_DCI0_req[CC_idP].hi_dci0_request_body; + nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = + &HI_DCI0_req->hi_dci0_pdu_list[HI_DCI0_req->number_of_dci + + HI_DCI0_req->number_of_hi]; + int ret; + boolean_t res = FALSE; + + if (format_flag != 2) { // DL DCI + if (DL_req->number_pdu == MAX_NUM_DL_PDU) { + LOG_W(MAC, + "Subframe %d: FAPI DL structure is full, skip scheduling UE %d\n", + subframe, rnti); + } else { + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.tl.tag = NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG; + dl_config_pdu->pdu_type = NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti = rnti; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type = + (format_flag == 0) ? 2 : 1; + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.aggregation_level = + aggregation; + DL_req->number_pdu++; + LOG_D(MAC, + "Subframe %d: Checking CCE feasibility format %d : (%x,%d) (%x,%d,%d)\n", + subframe, format_flag, rnti, aggregation, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8. + aggregation_level, + dl_config_pdu->dci_dl_pdu.dci_dl_pdu_rel8.rnti_type); + ret = allocate_CCEs(module_idP, CC_idP, subframe, 0); + if (ret == -1) + res = TRUE; + DL_req->number_pdu--; + } + } else { // ue-specific UL DCI + if (HI_DCI0_req->number_of_dci + HI_DCI0_req->number_of_hi == + MAX_NUM_HI_DCI0_PDU) { + LOG_W(MAC, + "Subframe %d: FAPI UL structure is full, skip scheduling UE %d\n", + subframe, rnti); + } else { + hi_dci0_pdu->pdu_type = NFAPI_HI_DCI0_DCI_PDU_TYPE; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.rnti = rnti; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.aggregation_level = + aggregation; + HI_DCI0_req->number_of_dci++; + ret = allocate_CCEs(module_idP, CC_idP, subframe, 0); + if (ret == -1) + res = TRUE; + HI_DCI0_req->number_of_dci--; + } } - } // for i = 0 ... num_dcis - return 0; - -failed: - return -1; + return res; } -boolean_t CCE_allocation_infeasible(int module_idP, - int CC_idP, - int common_flag, - int subframe, - int aggregation, - int rnti) { - - - DCI_PDU *DCI_pdu = &eNB_mac_inst[module_idP].common_channels[CC_idP].DCI_pdu; - //DCI_ALLOC_t *dci_alloc; - int ret; - boolean_t res=FALSE; - - if (common_flag==1) { - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci].rnti = rnti; - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci].L = aggregation; - DCI_pdu->Num_common_dci++; - ret = allocate_CCEs(module_idP,CC_idP,subframe,1); - if (ret==-1) - res = TRUE; - DCI_pdu->Num_common_dci--; - } - else { - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci].rnti = rnti; - DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci].L = aggregation; - DCI_pdu->Num_ue_spec_dci++; - ret = allocate_CCEs(module_idP,CC_idP,subframe,1); - if (ret==-1) - res = TRUE; - DCI_pdu->Num_ue_spec_dci--; - } - return(res); -} - -void SR_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, rnti_t rntiP, sub_frame_t subframeP) +void +extract_harq(module_id_t mod_idP, int CC_idP, int UE_id, + frame_t frameP, sub_frame_t subframeP, + void *harq_indication, int format) { - - int UE_id = find_UE_id(mod_idP, rntiP); - UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list; - - if (UE_id != -1) { - if (mac_eNB_get_rrc_status(mod_idP,UE_RNTI(mod_idP,UE_id)) < RRC_CONNECTED) - LOG_I(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP); - UE_list->UE_template[cc_idP][UE_id].ul_SR = 1; - UE_list->UE_template[cc_idP][UE_id].ul_active = TRUE; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION,1); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION,0); - } else { - // AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP); - // AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP); - LOG_D(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d (unknown UEid) on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP); - } + UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; + UE_sched_ctrl *sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + rnti_t rnti = UE_RNTI(mod_idP, UE_id); + COMMON_channels_t *cc = &RC.mac[mod_idP]->common_channels[CC_idP]; + nfapi_harq_indication_fdd_rel13_t *harq_indication_fdd; + nfapi_harq_indication_tdd_rel13_t *harq_indication_tdd; + uint16_t num_ack_nak; + int numCC = UE_list->numactiveCCs[UE_id]; + int pCCid = UE_list->pCC_id[UE_id]; + int spatial_bundling = 0; + int tmode[5]; + int i, j; + uint8_t *pdu; + +#ifdef Rel14 + if (UE_list->UE_template[pCCid][UE_id].physicalConfigDedicated != NULL && + UE_list->UE_template[pCCid][UE_id].physicalConfigDedicated->pucch_ConfigDedicated != NULL && + (UE_list->UE_template[pCCid][UE_id].physicalConfigDedicated->ext7) + && (UE_list->UE_template[pCCid][UE_id]. + physicalConfigDedicated->ext7->pucch_ConfigDedicated_r13) + && + (((UE_list->UE_template[pCCid][UE_id]. + physicalConfigDedicated->ext7->pucch_ConfigDedicated_r13-> + spatialBundlingPUCCH_r13) + && (format == 0)) + || + ((UE_list->UE_template[pCCid][UE_id]. + physicalConfigDedicated->ext7->pucch_ConfigDedicated_r13-> + spatialBundlingPUSCH_r13) + && (format == 1)))) + spatial_bundling = 1; +#endif + + for (i = 0; i < numCC; i++) + tmode[i] = get_tmode(mod_idP, i, UE_id); + + if (cc->tdd_Config) { + harq_indication_tdd = + (nfapi_harq_indication_tdd_rel13_t *) harq_indication; + // pdu = &harq_indication_tdd->harq_tb_n[0]; + + num_ack_nak = harq_indication_tdd->number_of_ack_nack; + + switch (harq_indication_tdd->mode) { + case 0: // Format 1a/b + AssertFatal(numCC == 1, + "numCC %d > 1, should not be using Format1a/b\n", + numCC); + break; + case 1: // Channel Selection + break; + case 2: // Format 3 + break; + case 3: // Format 4 + break; + case 4: // Format 5 + break; + } + } else { + harq_indication_fdd = + (nfapi_harq_indication_fdd_rel13_t *) harq_indication; + num_ack_nak = harq_indication_fdd->number_of_ack_nack; + pdu = &harq_indication_fdd->harq_tb_n[0]; + + uint8_t harq_pid = ((10 * frameP) + subframeP + 10236) & 7; + + LOG_D(MAC,"frame %d subframe %d harq_pid %d mode %d tmode[0] %d num_ack_nak %d round %d\n",frameP,subframeP,harq_pid,harq_indication_fdd->mode,tmode[0],num_ack_nak,sched_ctl->round[CC_idP][harq_pid]); + + switch (harq_indication_fdd->mode) { + case 0: // Format 1a/b (10.1.2.1) + AssertFatal(numCC == 1, + "numCC %d > 1, should not be using Format1a/b\n", + numCC); + if (tmode[0] == 1 || tmode[0] == 2 || tmode[0] == 5 || tmode[0] == 6 || tmode[0] == 7) { // NOTE: have to handle the case of TM9-10 with 1 antenna port + // single ACK/NAK bit + AssertFatal(num_ack_nak == 1, + "num_ack_nak %d > 1 for 1 CC and single-layer transmission frame:%d subframe:%d\n", + num_ack_nak,frameP,subframeP); + AssertFatal(sched_ctl->round[CC_idP][harq_pid] < 8, + "Got ACK/NAK for inactive harq_pid %d for UE %d/%x\n", + harq_pid, UE_id, rnti); + AssertFatal(pdu[0] == 1 || pdu[0] == 2 + || pdu[0] == 4, + "Received ACK/NAK %d which is not 1 or 2 for harq_pid %d from UE %d/%x\n", + pdu[0], harq_pid, UE_id, rnti); + LOG_D(MAC, "Received %d for harq_pid %d\n", pdu[0], + harq_pid); + + if (pdu[0] == 1) { // ACK + sched_ctl->round[CC_idP][harq_pid] = 8; // release HARQ process + sched_ctl->tbcnt[CC_idP][harq_pid] = 0; + } else if (pdu[0] == 2 || pdu[0] == 4) // NAK (treat DTX as NAK) + sched_ctl->round[CC_idP][harq_pid]++; // increment round + } else { + // one or two ACK/NAK bits + AssertFatal(num_ack_nak > 2, + "num_ack_nak %d > 2 for 1 CC and TM3/4/8/9/10\n", + num_ack_nak); + if ((num_ack_nak == 2) + && (sched_ctl->round[CC_idP][harq_pid] < 8) + && (sched_ctl->tbcnt[CC_idP][harq_pid] == 1) + && (pdu[0] == 1) && (pdu[1] == 1)) { + sched_ctl->round[CC_idP][harq_pid] = 8; + sched_ctl->tbcnt[CC_idP][harq_pid] = 0; + } + if ((num_ack_nak == 2) + && (sched_ctl->round[CC_idP][harq_pid] < 8) + && (sched_ctl->tbcnt[CC_idP][harq_pid] == 1) + && (pdu[0] == 2) && (pdu[1] == 2)) + sched_ctl->round[CC_idP][harq_pid]++; + else if (((num_ack_nak == 2) + && (sched_ctl->round[CC_idP][harq_pid] < 8) + && (sched_ctl->tbcnt[0][harq_pid] == 2) + && (pdu[0] == 1) && (pdu[1] == 2)) + || ((num_ack_nak == 2) + && (sched_ctl->round[CC_idP][harq_pid] < 8) + && (sched_ctl->tbcnt[CC_idP][harq_pid] == 2) + && (pdu[0] == 2) && (pdu[1] == 1))) { + sched_ctl->round[CC_idP][harq_pid]++; + sched_ctl->tbcnt[CC_idP][harq_pid] = 1; + } else if ((num_ack_nak == 2) + && (sched_ctl->round[CC_idP][harq_pid] < 8) + && (sched_ctl->tbcnt[CC_idP][harq_pid] == 2) + && (pdu[0] == 2) && (pdu[1] == 2)) + sched_ctl->round[CC_idP][harq_pid]++; + else + AssertFatal(1 == 0, + "Illegal ACK/NAK/round combination (%d,%d,%d,%d,%d) for harq_pid %d, UE %d/%x\n", + num_ack_nak, + sched_ctl->round[CC_idP][harq_pid], + sched_ctl->round[CC_idP][harq_pid], pdu[0], + pdu[1], harq_pid, UE_id, rnti); + } + break; + case 1: // FDD Channel Selection (10.1.2.2.1), must be received for 2 serving cells + AssertFatal(numCC == 2, + "Should not receive harq indication with channel selection with %d active CCs\n", + numCC); + + if ((num_ack_nak == 2) + && (sched_ctl->round[pCCid][harq_pid] < 8) + && (sched_ctl->round[1 - pCCid][harq_pid] < 8) + && (sched_ctl->tbcnt[pCCid][harq_pid] == 1) + && (sched_ctl->tbcnt[1 - pCCid][harq_pid] == 1)) { + AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n", + pdu[0]); + AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n", + pdu[1]); + if (pdu[0] == 1) + sched_ctl->round[pCCid][harq_pid] = 8; + else + sched_ctl->round[pCCid][harq_pid]++; + if (pdu[1] == 1) + sched_ctl->round[1 - pCCid][harq_pid] = 8; + else + sched_ctl->round[1 - pCCid][harq_pid]++; + } // A=2 + else if ((num_ack_nak == 3) + && (sched_ctl->round[pCCid][harq_pid] < 8) + && (sched_ctl->tbcnt[pCCid][harq_pid] == 2) + && (sched_ctl->round[1 - pCCid][harq_pid] < 8) + && (sched_ctl->tbcnt[1 - pCCid][harq_pid] == 1)) { + AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n", + pdu[0]); + AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n", + pdu[1]); + AssertFatal(pdu[2] <= 3, "pdu[2] %d is not ACK/NAK/DTX\n", + pdu[2]); + AssertFatal(sched_ctl->tbcnt[pCCid][harq_pid] == 2, + "sched_ctl->tbcnt[%d][%d] != 2 for UE %d/%x\n", + pCCid, harq_pid, UE_id, rnti); + AssertFatal(sched_ctl->tbcnt[1 - pCCid][harq_pid] == 1, + "sched_ctl->tbcnt[%d][%d] != 1 for UE %d/%x\n", + 1 - pCCid, harq_pid, UE_id, rnti); + if ((pdu[0] == 1) && (pdu[1] == 1)) { // both ACK + sched_ctl->round[pCCid][harq_pid] = 8; + sched_ctl->tbcnt[pCCid][harq_pid] = 0; + } else if (((pdu[0] == 2) && (pdu[1] == 1)) || + ((pdu[0] == 1) && (pdu[1] == 2))) { + sched_ctl->round[pCCid][harq_pid]++; + sched_ctl->tbcnt[pCCid][harq_pid] = 1; + } else + sched_ctl->round[pCCid][harq_pid]++; + + if (pdu[2] == 1) + sched_ctl->round[1 - pCCid][harq_pid] = 8; + else + sched_ctl->round[1 - pCCid][harq_pid]++; + } // A=3 primary cell has 2 TBs + else if ((num_ack_nak == 3) + && (sched_ctl->round[1 - pCCid][harq_pid] < 8) + && (sched_ctl->round[pCCid][harq_pid] < 8) + && (sched_ctl->tbcnt[1 - pCCid][harq_pid] == 2) + && (sched_ctl->tbcnt[pCCid][harq_pid] == 1)) { + AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n", + pdu[0]); + AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n", + pdu[1]); + AssertFatal(pdu[2] <= 3, "pdu[2] %d is not ACK/NAK/DTX\n", + pdu[2]); + AssertFatal(sched_ctl->tbcnt[1 - pCCid][harq_pid] == 2, + "sched_ctl->tbcnt[%d][%d] != 2 for UE %d/%x\n", + 1 - pCCid, harq_pid, UE_id, rnti); + AssertFatal(sched_ctl->tbcnt[pCCid][harq_pid] == 1, + "sched_ctl->tbcnt[%d][%d] != 1 for UE %d/%x\n", + pCCid, harq_pid, UE_id, rnti); + if ((pdu[0] == 1) && (pdu[1] == 1)) { // both ACK + sched_ctl->round[1 - pCCid][harq_pid] = 8; + sched_ctl->tbcnt[1 - pCCid][harq_pid] = 0; + } else if (((pdu[0] >= 2) && (pdu[1] == 1)) + || ((pdu[0] == 1) && (pdu[1] >= 2))) { // one ACK + sched_ctl->round[1 - pCCid][harq_pid]++; + sched_ctl->tbcnt[1 - pCCid][harq_pid] = 1; + } else // both NAK/DTX + sched_ctl->round[1 - pCCid][harq_pid]++; + + if (pdu[2] == 1) + sched_ctl->round[pCCid][harq_pid] = 8; + else + sched_ctl->round[pCCid][harq_pid]++; + } // A=3 secondary cell has 2 TBs +#if MAX_NUM_CCs>1 + else if ((num_ack_nak == 4) + && (sched_ctl->round[0][harq_pid] < 8) + && (sched_ctl->round[1][harq_pid] < 8) + && (sched_ctl->tbcnt[1 - pCCid][harq_pid] == 2) + && (sched_ctl->tbcnt[pCCid][harq_pid] == 2)) { + AssertFatal(pdu[0] <= 3, "pdu[0] %d is not ACK/NAK/DTX\n", + pdu[0]); + AssertFatal(pdu[1] <= 3, "pdu[1] %d is not ACK/NAK/DTX\n", + pdu[1]); + AssertFatal(pdu[2] <= 3, "pdu[2] %d is not ACK/NAK/DTX\n", + pdu[2]); + AssertFatal(pdu[3] <= 3, "pdu[3] %d is not ACK/NAK/DTX\n", + pdu[3]); + AssertFatal(sched_ctl->tbcnt[0][harq_pid] == 2, + "sched_ctl->tbcnt[0][%d] != 2 for UE %d/%x\n", + harq_pid, UE_id, rnti); + AssertFatal(sched_ctl->tbcnt[1][harq_pid] == 2, + "sched_ctl->tbcnt[1][%d] != 2 for UE %d/%x\n", + harq_pid, UE_id, rnti); + if ((pdu[0] == 1) && (pdu[1] == 1)) { // both ACK + sched_ctl->round[0][harq_pid] = 8; + sched_ctl->tbcnt[0][harq_pid] = 0; + } else if (((pdu[0] >= 2) && (pdu[1] == 1)) + || ((pdu[0] == 1) && (pdu[1] >= 2))) { // one ACK + sched_ctl->round[0][harq_pid]++; + sched_ctl->tbcnt[0][harq_pid] = 1; + } else // both NAK/DTX + sched_ctl->round[0][harq_pid]++; + + if ((pdu[2] == 1) && (pdu[3] == 1)) { // both ACK + sched_ctl->round[1][harq_pid] = 8; + sched_ctl->tbcnt[1][harq_pid] = 0; + } else if (((pdu[2] >= 2) && (pdu[3] == 1)) + || ((pdu[2] == 1) && (pdu[3] >= 2))) { // one ACK + sched_ctl->round[1][harq_pid]++; + sched_ctl->tbcnt[1][harq_pid] = 1; + } else // both NAK/DTX + sched_ctl->round[1][harq_pid]++; + } // A=4 both serving cells have 2 TBs +#endif + break; + case 2: // Format 3 + AssertFatal(numCC > 2, + "Should not receive harq indication with FDD format 3 with %d < 3 active CCs\n", + numCC); + for (i = 0, j = 0; i < numCC; i++) { + if ((sched_ctl->round[i][harq_pid] < 8)) { + if (tmode[i] == 1 || tmode[i] == 2 || tmode[0] == 5 + || tmode[0] == 6 || tmode[0] == 7) { + if (pdu[j] == 1) { + sched_ctl->round[i][harq_pid] = 8; + sched_ctl->tbcnt[i][harq_pid] = 0; + } else if (pdu[j] == 2) + sched_ctl->round[i][harq_pid]++; + else + AssertFatal(1 == 0, + "Illegal harq_ack value for CC %d harq_pid %d (%d) UE %d/%x\n", + i, harq_pid, pdu[j], UE_id, rnti); + j++; + } else if (spatial_bundling == 0) { + if ((sched_ctl->tbcnt[i][harq_pid] == 2) + && (pdu[j] == 1) && (pdu[j + 1] == 1)) { + sched_ctl->round[i][harq_pid] = 8; + sched_ctl->tbcnt[i][harq_pid] = 0; + } else if ((sched_ctl->tbcnt[i][harq_pid] == 2) + && (pdu[j] == 1) && (pdu[j + 1] == 2)) { + sched_ctl->round[i][harq_pid]++; + sched_ctl->tbcnt[i][harq_pid] = 1; + } else if ((sched_ctl->tbcnt[i][harq_pid] == 2) + && (pdu[j] == 2) && (pdu[j + 1] == 1)) { + sched_ctl->round[i][harq_pid]++; + sched_ctl->tbcnt[i][harq_pid] = 1; + } else if ((sched_ctl->tbcnt[i][harq_pid] == 2) + && (pdu[j] == 2) && (pdu[j + 1] == 2)) { + sched_ctl->round[i][harq_pid]++; + } else + AssertFatal(1 == 0, + "Illegal combination for CC %d harq_pid %d (%d,%d,%d) UE %d/%x\n", + i, harq_pid, + sched_ctl->tbcnt[i][harq_pid], + pdu[j], pdu[j + 1], UE_id, rnti); + j += 2; + } else if (spatial_bundling == 1) { + if (pdu[j] == 1) { + sched_ctl->round[i][harq_pid] = 8; + sched_ctl->tbcnt[i][harq_pid] = 0; + } else if (pdu[j] == 2) { + sched_ctl->round[i][harq_pid]++; + } else + AssertFatal(1 == 0, + "Illegal hack_nak value %d for CC %d harq_pid %d UE %d/%x\n", + pdu[j], i, harq_pid, UE_id, rnti); + j++; + } else + AssertFatal(1 == 0, + "Illegal value for spatial_bundling %d\n", + spatial_bundling); + } + } + break; + case 3: // Format 4 + AssertFatal(1 == 0, + "Should not receive harq indication with Format 4\n"); + break; + case 4: // Format 5 + AssertFatal(1 == 0, + "Should not receive harq indication with Format 5\n"); + break; + } + } } -void UL_failure_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, rnti_t rntiP, sub_frame_t subframeP) +void +extract_pucch_csi(module_id_t mod_idP, int CC_idP, int UE_id, + frame_t frameP, sub_frame_t subframeP, + uint8_t * pdu, uint8_t length) { + UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; + UE_sched_ctrl *sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + COMMON_channels_t *cc = &RC.mac[mod_idP]->common_channels[CC_idP]; + struct CQI_ReportPeriodic *cqi_ReportPeriodic; + int no_pmi; + uint8_t Ltab[6] = { 0, 2, 4, 4, 4, 4 }; + uint8_t Jtab[6] = { 0, 2, 2, 3, 4, 4 }; + int feedback_cnt; - int UE_id = find_UE_id(mod_idP, rntiP); - UE_list_t *UE_list = &eNB_mac_inst[mod_idP].UE_list; + AssertFatal(UE_list->UE_template[CC_idP][UE_id]. + physicalConfigDedicated != NULL, + "physicalConfigDedicated is null for UE %d\n", UE_id); + AssertFatal(UE_list-> + UE_template[CC_idP][UE_id].physicalConfigDedicated-> + cqi_ReportConfig != NULL, + "cqi_ReportConfig is null for UE %d\n", UE_id); + AssertFatal((cqi_ReportPeriodic = + UE_list-> + UE_template[CC_idP][UE_id].physicalConfigDedicated-> + cqi_ReportConfig->cqi_ReportPeriodic) != NULL, + "cqi_ReportPeriodic is null for UE %d\n", UE_id); - if (UE_id != -1) { - LOG_I(MAC,"[eNB %d][UE %d/%x] Frame %d subframeP %d Signaling UL Failure for UE %d on CC_id %d (timer %d)\n", - mod_idP,UE_id,rntiP,frameP,subframeP, UE_id,cc_idP, - UE_list->UE_sched_ctrl[UE_id].ul_failure_timer); - if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer == 0) - UE_list->UE_sched_ctrl[UE_id].ul_failure_timer=1; - } else { - // AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP); - // AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP); - LOG_W(MAC,"[eNB %d][SR %x] Frame %d subframeP %d Signaling UL Failure for UE %d (unknown UEid) on CC_id %d\n",mod_idP,rntiP,frameP,subframeP, UE_id,cc_idP); - } + // determine feedback mode + AssertFatal(cqi_ReportPeriodic->present != + CQI_ReportPeriodic_PR_NOTHING, + "cqi_ReportPeriodic->present == CQI_ReportPeriodic_PR_NOTHING!\n"); + AssertFatal(cqi_ReportPeriodic->choice. + setup.cqi_FormatIndicatorPeriodic.present != + CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_NOTHING, + "cqi_ReportPeriodic->cqi_FormatIndicatorPeriodic.choice.setup.present == CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_NOTHING!\n"); + + uint16_t Npd, N_OFFSET_CQI; + int H, K, bandwidth_part, L, Lmask; + int ri = sched_ctl->periodic_ri_received[CC_idP]; + + get_csi_params(cc, cqi_ReportPeriodic, &Npd, &N_OFFSET_CQI, &H); + K = (H - 1) / Jtab[cc->mib->message.dl_Bandwidth]; + L = Ltab[cc->mib->message.dl_Bandwidth]; + Lmask = L - 1; + feedback_cnt = (((frameP * 10) + subframeP) / Npd) % H; + + if (feedback_cnt > 0) + bandwidth_part = (feedback_cnt - 1) % K; + else + bandwidth_part = 0; + + switch (get_tmode(mod_idP, CC_idP, UE_id)) { + case 1: + case 2: + case 3: + case 7: + no_pmi = 1; + break; + case 4: + case 5: + case 6: + no_pmi = 0; + break; + default: + // note: need to check TM8-10 without PMI/RI or with 1 antenna port (see Section 5.2.3.3.1 from 36.213) + no_pmi = 0; + } + + if ((cqi_ReportPeriodic->choice.setup.cqi_FormatIndicatorPeriodic. + present == + CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_widebandCQI) + || (feedback_cnt == 0)) { + // Note: This implements only Tables: 5.3.3.1-1,5.3.3.1-1A and 5.3.3.1-2 from 36.213 (1,2,4 antenna ports Wideband CQI/PMI) + + if (no_pmi == 1) { // get spatial_diffcqi if needed + sched_ctl->periodic_wideband_cqi[CC_idP] = pdu[0] & 0xF; + sched_ctl->periodic_wideband_spatial_diffcqi[CC_idP] = + (pdu[0] >> 4) & 7; + } else if ((cc->p_eNB == 2) && (ri == 1)) { + // p=2 Rank 1 wideband CQI/PMI 6 bits + sched_ctl->periodic_wideband_cqi[CC_idP] = pdu[0] & 0xF; + sched_ctl->periodic_wideband_pmi[CC_idP] = (pdu[0] >> 4) & 3; + } else if ((cc->p_eNB == 2) && (ri > 1)) { + // p=2 Rank 2 wideband CQI/PMI 8 bits + sched_ctl->periodic_wideband_cqi[CC_idP] = pdu[0] & 0xF; + sched_ctl->periodic_wideband_spatial_diffcqi[CC_idP] = + (pdu[0] >> 4) & 7; + sched_ctl->periodic_wideband_pmi[CC_idP] = (pdu[0] >> 7) & 1; + } else if ((cc->p_eNB == 4) && (ri == 1)) { + // p=4 Rank 1 wideband CQI/PMI 8 bits + sched_ctl->periodic_wideband_cqi[CC_idP] = pdu[0] & 0xF; + sched_ctl->periodic_wideband_pmi[CC_idP] = + (pdu[0] >> 4) & 0x0F; + + } else if ((cc->p_eNB == 4) && (ri > 1)) { + // p=4 Rank 2 wideband CQI/PMI 11 bits + sched_ctl->periodic_wideband_cqi[CC_idP] = pdu[0] & 0xF; + sched_ctl->periodic_wideband_spatial_diffcqi[CC_idP] = + (pdu[0] >> 4) & 7; + sched_ctl->periodic_wideband_pmi[CC_idP] = (pdu[0] >> 7) & 0xF; + } else + AssertFatal(1 == 0, + "illegal combination p %d, ri %d, no_pmi %d\n", + cc->p_eNB, ri, no_pmi); + } else if (cqi_ReportPeriodic->choice. + setup.cqi_FormatIndicatorPeriodic.present == + CQI_ReportPeriodic__setup__cqi_FormatIndicatorPeriodic_PR_subbandCQI) + { + // This is Table 5.2.3.3.2-2 for 36.213 + if (ri == 1) { + //4+Ltab[cc->mib->message.dl_Bandwidth] bits + sched_ctl->periodic_subband_cqi[CC_idP][(bandwidth_part * L) + + ((pdu[0] >> 4) & + Lmask)] = + pdu[0] & 0xF; + } else if (ri > 1) { + //7+Ltab[cc->mib->message.dl_Bandwidth] bits; + sched_ctl-> + periodic_subband_spatial_diffcqi[CC_idP][(bandwidth_part * + L) + + ((pdu[0] >> 7) & + Lmask)] = + (pdu[0] >> 4) & 7; + sched_ctl->periodic_subband_cqi[CC_idP][(bandwidth_part * L) + + ((pdu[0] >> 7) & + Lmask)] = + pdu[0] & 0xF; + } + } +} + +void +extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, + frame_t frameP, sub_frame_t subframeP, + uint8_t * pdu, uint8_t length) +{ + UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; + COMMON_channels_t *cc = &RC.mac[mod_idP]->common_channels[CC_idP]; + UE_sched_ctrl *sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + int Ntab[6] = { 0, 4, 7, 9, 10, 13 }; + int Ntab_uesel[6] = { 0, 8, 13, 17, 19, 25 }; + int Ltab_uesel[6] = { 0, 6, 9, 13, 15, 18 }; + int Mtab_uesel[6] = { 0, 1, 3, 5, 6, 6 }; + int v[6]; + int i; + uint64_t p = *(uint64_t *) pdu; + int curbyte, curbit; + CQI_ReportModeAperiodic_t *cqi_ReportModeAperiodic; + + AssertFatal(UE_list->UE_template[CC_idP][UE_id]. + physicalConfigDedicated != NULL, + "physicalConfigDedicated is null for UE %d\n", UE_id); + AssertFatal(UE_list-> + UE_template[CC_idP][UE_id].physicalConfigDedicated-> + cqi_ReportConfig != NULL, + "cqi_ReportConfig is null for UE %d\n", UE_id); + AssertFatal((cqi_ReportModeAperiodic = + UE_list-> + UE_template[CC_idP][UE_id].physicalConfigDedicated-> + cqi_ReportConfig->cqi_ReportModeAperiodic) != NULL, + "cqi_ReportModeAperiodic is null for UE %d\n", UE_id); + + int N = Ntab[cc->mib->message.dl_Bandwidth]; + int tmode = get_tmode(mod_idP, CC_idP, UE_id); + int ri = sched_ctl->aperiodic_ri_received[CC_idP]; + int r, diffcqi0 = 0, diffcqi1 = 0, pmi_uesel = 0; + int bw = cc->mib->message.dl_Bandwidth; + int m; + + switch (*cqi_ReportModeAperiodic) { + case CQI_ReportModeAperiodic_rm12: + AssertFatal(0 == 1, "to be fixed, don't use p but pdu directly\n"); + // wideband multiple PMI (TM4/6), Table 5.2.2.6.1-1 (for TM4/6) + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 + || tmode == 10, + "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm12\n", + tmode); + if (tmode <= 6) { //Table 5.2.2.6.1-1 36.213 + if ((ri == 1) && (cc->p_eNB == 2)) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + for (i = 0; i < N; i++) { + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = + (uint8_t) (p & 0x03); + p >>= 2; + } + } + if ((ri == 2) && (cc->p_eNB == 2)) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + sched_ctl->aperiodic_wideband_cqi1[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + for (i = 0; i < N; i++) { + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = + (uint8_t) (p & 0x01); + p >>= 1; + } + } + if ((ri == 1) && (cc->p_eNB == 4)) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + for (i = 0; i < N; i++) { + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = + (uint8_t) (p & 0x03); + p >>= 4; + } + } + if ((ri == 2) && (cc->p_eNB == 4)) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + sched_ctl->aperiodic_wideband_cqi1[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + for (i = 0; i < N; i++) { + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = + (uint8_t) (p & 0x01); + p >>= 4; + } + } + } // if (tmode <= 6) { //Table 5.2.2.6.1-1 36.213 + else { + AssertFatal(1 == 0, "support for TM 8-10 to be done\n"); + } + + break; + case CQI_ReportModeAperiodic_rm20: + AssertFatal(0 == 1, "to be fixed, don't use p but pdu directly\n"); + // UE-selected subband CQI no PMI (TM1/2/3/7) , Table 5.2.2.6.3-1 from 36.213 + AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 + || tmode == 7, + "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm20\n", + tmode); + + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); + p >>= 4; + diffcqi0 = (uint8_t) (p & 0x03); + p >>= 2; + r = (uint8_t) (p & ((1 >> Ltab_uesel[bw]) - 1)); + reverse_index(Ntab_uesel[bw], Mtab_uesel[bw], r, v); + for (m = 0; m < Mtab_uesel[bw]; m++) + sched_ctl->aperiodic_subband_diffcqi0[CC_idP][v[m]] = diffcqi0; + break; + case CQI_ReportModeAperiodic_rm22: + AssertFatal(0 == 1, "to be fixed, don't use p but pdu directly\n"); + // UE-selected subband CQI multiple PMI (TM4/6) Table 5.2.2.6.3-2 from 36.213 + + AssertFatal(tmode == 4 || tmode == 6 || tmode == 8 || tmode == 9 + || tmode == 10, + "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm22\n", + tmode); + + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = (uint8_t) (p & 0x0F); + p >>= 4; + diffcqi0 = (uint8_t) (p & 0x03); + p >>= 2; + + if (ri > 1) { + sched_ctl->aperiodic_wideband_cqi1[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + diffcqi1 = (uint8_t) (p & 0x03); + p >>= 2; + } + r = (uint8_t) (p & ((1 >> Ltab_uesel[bw]) - 1)); + p >>= Ltab_uesel[bw]; + reverse_index(Ntab_uesel[bw], Mtab_uesel[bw], r, v); + if ((ri == 1) && (cc->p_eNB == 2)) { + pmi_uesel = p & 0x3; + p >>= 2; + sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x3; + } else if ((ri == 2) && (cc->p_eNB == 2)) { + pmi_uesel = p & 0x1; + p >>= 1; + sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x1; + } else if (cc->p_eNB == 4) { + pmi_uesel = p & 0x0F; + p >>= 4; + sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x0F; + } + for (m = 0; m < Mtab_uesel[bw]; m++) { + sched_ctl->aperiodic_subband_diffcqi0[CC_idP][v[m]] = diffcqi0; + if (ri > 1) + sched_ctl->aperiodic_subband_diffcqi1[CC_idP][v[m]] = + diffcqi1; + sched_ctl->aperiodic_subband_pmi[CC_idP][v[m]] = pmi_uesel; + } + break; + case CQI_ReportModeAperiodic_rm30: + //subband CQI no PMI (TM1/2/3/7) + AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 + || tmode == 7, + "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm30\n", + tmode); + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = pdu[0] >> 4; + curbyte = 0; + curbit = 3; + for (i = 0; i < N; i++) { + sched_ctl->aperiodic_subband_diffcqi0[CC_idP][i] = + (pdu[curbyte] >> (curbit - 1)) & 0x03; + curbit -= 2; + if (curbit < 0) { + curbit = 7; + curbyte++; + } + } + sched_ctl->dl_cqi[CC_idP] = + sched_ctl->aperiodic_wideband_cqi0[CC_idP]; + break; + case CQI_ReportModeAperiodic_rm31: + AssertFatal(0 == 1, "to be fixed, don't use p but pdu directly\n"); + //subband CQI single PMI (TM4/5/6) + AssertFatal(tmode == 4 || tmode == 5 || tmode == 6 || tmode == 8 + || tmode == 9 + || tmode == 10, + "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm31\n", + tmode); + + if ((ri == 1) && (cc->p_eNB == 2)) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + for (i = 0; i < N; i++) { + sched_ctl->aperiodic_subband_diffcqi0[CC_idP][i] = + (uint8_t) (p & 0x03); + p >>= 2; + } + sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x03; + } + if ((ri == 2) && (cc->p_eNB == 2)) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + for (i = 0; i < N; i++) { + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = + (uint8_t) (p & 0x01); + p >>= 1; + } + sched_ctl->aperiodic_wideband_cqi1[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + for (i = 0; i < N; i++) { + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = + (uint8_t) (p & 0x01); + p >>= 1; + } + sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x01; + } + if ((ri == 1) && (cc->p_eNB == 4)) { + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + for (i = 0; i < N; i++) { + sched_ctl->aperiodic_subband_diffcqi0[CC_idP][i] = + (uint8_t) (p & 0x03); + p >>= 2; + } + sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x0F; + } + if ((ri > 1) && (cc->p_eNB == 4)) { // Note : 64 bits for 20 MHz + sched_ctl->aperiodic_wideband_cqi0[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + for (i = 0; i < N; i++) { + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = + (uint8_t) (p & 0x01); + p >>= 1; + } + sched_ctl->aperiodic_wideband_cqi1[CC_idP] = + (uint8_t) (p & 0x0F); + p >>= 4; + for (i = 0; i < N; i++) { + sched_ctl->aperiodic_subband_pmi[CC_idP][i] = + (uint8_t) (p & 0x01); + p >>= 2; + } + sched_ctl->aperiodic_wideband_pmi[CC_idP] = p & 0x0F; + } + + break; + case CQI_ReportModeAperiodic_rm32_v1250: + AssertFatal(tmode == 4 || tmode == 5 || tmode == 6 || tmode == 8 + || tmode == 9 + || tmode == 10, + "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm32\n", + tmode); + AssertFatal(1 == 0, "CQI_ReportModeAperiodic_rm32 to be done\n"); + break; + case CQI_ReportModeAperiodic_rm10_v1310: + AssertFatal(tmode == 1 || tmode == 2 || tmode == 3 + || tmode == 7, + "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm10\n", + tmode); + AssertFatal(1 == 0, "CQI_ReportModeAperiodic_rm10 to be done\n"); + break; + case CQI_ReportModeAperiodic_rm11_v1310: + AssertFatal(tmode == 4 || tmode == 5 || tmode == 6 || tmode == 8 + || tmode == 9 + || tmode == 10, + "Illegal transmission mode %d for CQI_ReportModeAperiodic_rm11\n", + tmode); + AssertFatal(1 == 0, "CQI_ReportModeAperiodic_rm11 to be done\n"); + break; + } +} + +void +cqi_indication(module_id_t mod_idP, int CC_idP, frame_t frameP, + sub_frame_t subframeP, rnti_t rntiP, + nfapi_cqi_indication_rel9_t * rel9, uint8_t * pdu, + nfapi_ul_cqi_information_t * ul_cqi_information) +{ + int UE_id = find_UE_id(mod_idP, rntiP); + UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; + if (UE_id == -1) { + LOG_W(MAC, "cqi_indication: UE %x not found\n", rntiP); + return; + } + UE_sched_ctrl *sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + + if (UE_id >= 0) { + + LOG_D(MAC,"%s() UE_id:%d channel:%d cqi:%d\n", __FUNCTION__, UE_id, ul_cqi_information->channel, ul_cqi_information->ul_cqi); + + if (ul_cqi_information->channel == 0) { // PUCCH + + // extract pucch csi information before changing RI information + extract_pucch_csi(mod_idP, CC_idP, UE_id, frameP, subframeP, + pdu, rel9->length); + + memcpy((void *) sched_ctl->periodic_ri_received, + (void *) rel9->ri, rel9->number_of_cc_reported); + + // SNR for PUCCH2 + sched_ctl->pucch2_snr[CC_idP] = ul_cqi_information->ul_cqi; + } else { //PUSCH + memcpy((void *) sched_ctl->aperiodic_ri_received, + (void *) rel9->ri, rel9->number_of_cc_reported); + + extract_pusch_csi(mod_idP, CC_idP, UE_id, frameP, subframeP, + pdu, rel9->length); + + } + + // timing advance + sched_ctl->timing_advance = rel9->timing_advance; + sched_ctl->timing_advance_r9 = rel9->timing_advance_r9; + } +} + +void +SR_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, + sub_frame_t subframeP, rnti_t rntiP, uint8_t ul_cqi) +{ + T(T_ENB_MAC_SCHEDULING_REQUEST, T_INT(mod_idP), T_INT(cc_idP), + T_INT(frameP), T_INT(subframeP), T_INT(rntiP)); + + int UE_id = find_UE_id(mod_idP, rntiP); + UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; + + if (UE_id != -1) { + if (mac_eNB_get_rrc_status(mod_idP, UE_RNTI(mod_idP, UE_id)) < + RRC_CONNECTED) + LOG_D(MAC, + "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d on CC_id %d\n", + mod_idP, rntiP, frameP, subframeP, UE_id, cc_idP); + +#if 0 + UE_sched_ctrl *sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + + /* for the moment don't use ul_cqi from SR, value is too different from harq */ + sched_ctl->pucch1_snr[cc_idP] = ul_cqi; + sched_ctl->pucch1_cqi_update[cc_idP] = 1; +#endif + + UE_list->UE_template[cc_idP][UE_id].ul_SR = 1; + UE_list->UE_template[cc_idP][UE_id].ul_active = TRUE; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 1); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_SR_INDICATION, 0); + } else { + // AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP); + // AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP); + LOG_D(MAC, + "[eNB %d][SR %x] Frame %d subframeP %d Signaling SR for UE %d (unknown UEid) on CC_id %d\n", + mod_idP, rntiP, frameP, subframeP, UE_id, cc_idP); + } +} + +void +UL_failure_indication(module_id_t mod_idP, int cc_idP, frame_t frameP, + rnti_t rntiP, sub_frame_t subframeP) +{ + int UE_id = find_UE_id(mod_idP, rntiP); + UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; + + if (UE_id != -1) { + LOG_D(MAC, + "[eNB %d][UE %d/%x] Frame %d subframeP %d Signaling UL Failure for UE %d on CC_id %d (timer %d)\n", + mod_idP, UE_id, rntiP, frameP, subframeP, UE_id, cc_idP, + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer); + if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer == 0) + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 1; + } else { + // AssertFatal(0, "find_UE_id(%u,rnti %d) not found", enb_mod_idP, rntiP); + // AssertError(0, 0, "Frame %d: find_UE_id(%u,rnti %d) not found\n", frameP, enb_mod_idP, rntiP); + LOG_W(MAC, + "[eNB %d][SR %x] Frame %d subframeP %d Signaling UL Failure for UE %d (unknown UEid) on CC_id %d\n", + mod_idP, rntiP, frameP, subframeP, UE_id, cc_idP); + } +} + +void +harq_indication(module_id_t mod_idP, int CC_idP, frame_t frameP, + sub_frame_t subframeP, + nfapi_harq_indication_pdu_t * harq_pdu) +{ + rnti_t rnti = harq_pdu->rx_ue_information.rnti; + uint8_t ul_cqi = harq_pdu->ul_cqi_information.ul_cqi; + uint8_t channel = harq_pdu->ul_cqi_information.channel; + int UE_id = find_UE_id(mod_idP, rnti); + if (UE_id == -1) { + LOG_W(MAC, "harq_indication: UE %x not found\n", rnti); + return; + } + UE_list_t *UE_list = &RC.mac[mod_idP]->UE_list; + UE_sched_ctrl *sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + COMMON_channels_t *cc = &RC.mac[mod_idP]->common_channels[CC_idP]; + // extract HARQ Information + LOG_D(MAC, + "Frame %d, subframe %d: Received harq indication (%d) from UE %d/%x, ul_cqi %d\n", + frameP, subframeP, channel, UE_id, rnti, ul_cqi); + if (cc->tdd_Config) + extract_harq(mod_idP, CC_idP, UE_id, frameP, subframeP, + (void *) &harq_pdu->harq_indication_tdd_rel13, + channel); + else + extract_harq(mod_idP, CC_idP, UE_id, frameP, subframeP, + (void *) &harq_pdu->harq_indication_fdd_rel13, + channel); + if (channel == 0) { + sched_ctl->pucch1_snr[CC_idP] = ul_cqi; + sched_ctl->pucch1_cqi_update[CC_idP] = 1; + } } diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 1f488687a3..f841d9d55a 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file eNB_scheduler_ulsch.c * \brief eNB procedures for the ULSCH transport channel @@ -37,6 +29,8 @@ */ +/* indented with: indent -kr eNB_scheduler_RA.c */ + #include "assertions.h" #include "PHY/defs.h" #include "PHY/extern.h" @@ -60,7 +54,7 @@ #include "pdcp.h" #if defined(ENABLE_ITTI) -# include "intertask_interface.h" +#include "intertask_interface.h" #endif #include "T.h" @@ -68,1410 +62,1497 @@ #define ENABLE_MAC_PAYLOAD_DEBUG #define DEBUG_eNB_SCHEDULER 1 +extern int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req); +extern void add_subframe(uint16_t *frameP, uint16_t *subframeP, int offset); +extern uint16_t sfnsf_add_subframe(uint16_t frameP, uint16_t subframeP, int offset); +extern int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req); +extern uint8_t nfapi_mode; + +extern uint8_t nfapi_mode; + // This table holds the allowable PRB sizes for ULSCH transmissions -uint8_t rb_table[33] = {1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30,32,36,40,45,48,50,54,60,72,75,80,81,90,96,100}; +uint8_t rb_table[34] = + { 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, + 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 96, 100 +}; -void rx_sdu( - const module_id_t enb_mod_idP, - const int CC_idP, - const frame_t frameP, - const sub_frame_t subframeP, - const rnti_t rntiP, - uint8_t *sduP, - const uint16_t sdu_lenP, - const int harq_pidP, - uint8_t *msg3_flagP) +void +rx_sdu(const module_id_t enb_mod_idP, + const int CC_idP, + const frame_t frameP, + const sub_frame_t subframeP, + const rnti_t rntiP, + uint8_t * sduP, + const uint16_t sdu_lenP, + const uint16_t timing_advance, const uint8_t ul_cqi) { + int current_rnti = rntiP; + unsigned char rx_ces[MAX_NUM_CE], num_ce, num_sdu, i, *payload_ptr; + unsigned char rx_lcids[NB_RB_MAX]; + unsigned short rx_lengths[NB_RB_MAX]; + int UE_id = find_UE_id(enb_mod_idP, current_rnti); + int RA_id; + int ii, j; + eNB_MAC_INST *mac = RC.mac[enb_mod_idP]; + int harq_pid = + subframe2harqpid(&mac->common_channels[CC_idP], frameP, subframeP); - unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr; - unsigned char rx_lcids[NB_RB_MAX]; - unsigned short rx_lengths[NB_RB_MAX]; - int UE_id = find_UE_id(enb_mod_idP,rntiP); - int ii,j; - eNB_MAC_INST *eNB = &eNB_mac_inst[enb_mod_idP]; - UE_list_t *UE_list= &eNB->UE_list; - int crnti_rx=0; - int old_buffer_info; + UE_list_t *UE_list = &mac->UE_list; + int crnti_rx = 0; + int old_buffer_info; + RA_t *ra = + (RA_t *) & RC.mac[enb_mod_idP]->common_channels[CC_idP].ra[0]; + int first_rb = 0; - start_meas(&eNB->rx_ulsch_sdu); + start_meas(&mac->rx_ulsch_sdu); - if ((UE_id > NUMBER_OF_UE_MAX) || (UE_id == -1) ) - for(ii=0; iiUE_sched_ctrl[UE_id].ul_scheduled &= (~(1<UE_sched_ctrl[UE_id].ul_inactivity_timer=0; - UE_list->UE_sched_ctrl[UE_id].ul_failure_timer =0; - UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= (~(1<UE_sched_ctrl[UE_id].ul_out_of_sync > 0) { - UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync=0; - mac_eNB_rrc_ul_in_sync(enb_mod_idP,CC_idP,frameP,subframeP,UE_RNTI(enb_mod_idP,UE_id)); - } - } - - - payload_ptr = parse_ulsch_header(sduP,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,sdu_lenP); - - T(T_ENB_MAC_UE_UL_PDU, T_INT(enb_mod_idP), T_INT(CC_idP), T_INT(rntiP), T_INT(frameP), T_INT(subframeP), - T_INT(harq_pidP), T_INT(sdu_lenP), T_INT(num_ce), T_INT(num_sdu)); - T(T_ENB_MAC_UE_UL_PDU_WITH_DATA, T_INT(enb_mod_idP), T_INT(CC_idP), T_INT(rntiP), T_INT(frameP), T_INT(subframeP), - T_INT(harq_pidP), T_INT(sdu_lenP), T_INT(num_ce), T_INT(num_sdu), T_BUFFER(sduP, sdu_lenP)); - - eNB->eNB_stats[CC_idP].ulsch_bytes_rx=sdu_lenP; - eNB->eNB_stats[CC_idP].total_ulsch_bytes_rx+=sdu_lenP; - eNB->eNB_stats[CC_idP].total_ulsch_pdus_rx+=1; - // control element - for (i=0; iUE_template[CC_idP][UE_id].phr_info = (payload_ptr[0] & 0x3f) - PHR_MAPPING_OFFSET; - LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : Received PHR PH = %d (db)\n", - enb_mod_idP, CC_idP, rx_ces[i], UE_list->UE_template[CC_idP][UE_id].phr_info); - UE_list->UE_template[CC_idP][UE_id].phr_info_configured=1; - } - UE_list->UE_sched_ctrl[UE_id].phr_received = 1; - - payload_ptr+=sizeof(POWER_HEADROOM_CMD); - break; - - case CRNTI: - UE_id = find_UE_id(enb_mod_idP,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1]); - LOG_I(MAC, "[eNB %d] Frame %d, Subframe %d CC_id %d MAC CE_LCID %d (ce %d/%d): CRNTI %x (UE_id %d) in Msg3\n", - frameP,subframeP,enb_mod_idP, CC_idP, rx_ces[i], i,num_ce,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1],UE_id); - if (UE_id!=-1) { - UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer=0; - UE_list->UE_sched_ctrl[UE_id].ul_failure_timer=0; - if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync > 0) { - UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync=0; - mac_eNB_rrc_ul_in_sync(enb_mod_idP,CC_idP,frameP,subframeP,(((uint16_t)payload_ptr[0])<<8) + payload_ptr[1]); + if ((UE_id > NUMBER_OF_UE_MAX) || (UE_id == -1)) + for (ii = 0; ii < NB_RB_MAX; ii++) { + rx_lengths[ii] = 0; } - } - crnti_rx=1; - payload_ptr+=2; - if (msg3_flagP != NULL) { - *msg3_flagP = 0; - } - break; - - case TRUNCATED_BSR: - case SHORT_BSR: { - uint8_t lcgid; - lcgid = (payload_ptr[0] >> 6); - - LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n", - enb_mod_idP, CC_idP, rx_ces[i], lcgid, payload_ptr[0] & 0x3f); - - if (crnti_rx==1) - LOG_I(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n", - enb_mod_idP, CC_idP, rx_ces[i], lcgid, payload_ptr[0] & 0x3f); - if (UE_id != -1) { - - UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f); - - // update buffer info - - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid]]; - - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]; - - PHY_vars_eNB_g[enb_mod_idP][CC_idP]->pusch_stats_bsr[UE_id][(frameP*10)+subframeP] = (payload_ptr[0] & 0x3f); - if (UE_id == UE_list->head) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR,PHY_vars_eNB_g[enb_mod_idP][CC_idP]->pusch_stats_bsr[UE_id][(frameP*10)+subframeP]); - if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[lcgid] == 0 ) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[lcgid]=frameP; - } - if (mac_eNB_get_rrc_status(enb_mod_idP,UE_RNTI(enb_mod_idP,UE_id)) < RRC_CONNECTED) - LOG_I(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d : ul_total_buffer = %d (lcg increment %d)\n", - enb_mod_idP, CC_idP, rx_ces[i], UE_list->UE_template[CC_idP][UE_id].ul_total_buffer, - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]); - } - else { - - } - payload_ptr += 1;//sizeof(SHORT_BSR); // fixme - } - break; - - case LONG_BSR: - if (UE_id != -1) { - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0] = ((payload_ptr[0] & 0xFC) >> 2); - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1] = - ((payload_ptr[0] & 0x03) << 4) | ((payload_ptr[1] & 0xF0) >> 4); - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2] = - ((payload_ptr[1] & 0x0F) << 2) | ((payload_ptr[2] & 0xC0) >> 6); - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3] = (payload_ptr[2] & 0x3F); - - // update buffer info - old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0]; - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0]]; - - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer+= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0]; - if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info) - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info; - else - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0; - - old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1]; - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1]]; - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer+= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1]; - if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info) - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info; - else - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0; - - old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2]; - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2]]; - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer+= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2]; - if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info) - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info; - else - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0; - - old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3]; - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3]]; - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer+= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3]; - if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info) - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info; - else - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0; - - LOG_D(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = " - "%u LCGID2 = %u LCGID3 = %u\n", - enb_mod_idP, CC_idP, - rx_ces[i], - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0], - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1], - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2], - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3]); - if (crnti_rx==1) - LOG_I(MAC, "[eNB %d] CC_id %d MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = " - "%u LCGID2 = %u LCGID3 = %u\n", - enb_mod_idP, CC_idP, - rx_ces[i], - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0], - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1], - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2], - UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3]); - - if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0] == 0 ) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID0]=0; - } else if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID0] == 0) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID0]=frameP; - } - - if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1] == 0 ) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID1]=0; - } else if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID1] == 0) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID1]=frameP; - } - - if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2] == 0 ) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID2]=0; - } else if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID2] == 0) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID2]=frameP; - } - - if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3] == 0 ) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID3]= 0; - } else if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID3] == 0) { - UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID3]=frameP; - - } - } - - payload_ptr += 3;////sizeof(LONG_BSR); - break; - - default: - LOG_E(MAC, "[eNB %d] CC_id %d Received unknown MAC header (0x%02x)\n", enb_mod_idP, CC_idP, rx_ces[i]); - break; - } - } - - for (i=0; i CCCH_PAYLOAD_SIZE_MAX) { - LOG_E(MAC, "[eNB %d/%d] frame %d received CCCH of size %d (too big, maximum allowed is %d), dropping packet\n", - enb_mod_idP, CC_idP, frameP, rx_lengths[i], CCCH_PAYLOAD_SIZE_MAX); - break; - } - - LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d, Received CCCH: %x.%x.%x.%x.%x.%x, Terminating RA procedure for UE rnti %x\n", - enb_mod_idP,CC_idP,frameP, - payload_ptr[0],payload_ptr[1],payload_ptr[2],payload_ptr[3],payload_ptr[4], payload_ptr[5], rntiP); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_TERMINATE_RA_PROC,1); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_TERMINATE_RA_PROC,0); - for (ii=0; iicommon_channels[CC_idP].RA_template[ii].rnti, rntiP, - eNB->common_channels[CC_idP].RA_template[ii].RA_active); - - if ((eNB->common_channels[CC_idP].RA_template[ii].rnti==rntiP) && - (eNB->common_channels[CC_idP].RA_template[ii].RA_active==TRUE)) { - - //payload_ptr = parse_ulsch_header(msg3,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,msg3_len); - - if (UE_id < 0) { - memcpy(&eNB->common_channels[CC_idP].RA_template[ii].cont_res_id[0],payload_ptr,6); - LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3: length %d, offset %d\n", - enb_mod_idP,CC_idP,frameP,rx_lengths[i],payload_ptr-sduP); - - if ((UE_id=add_new_ue(enb_mod_idP,CC_idP,eNB->common_channels[CC_idP].RA_template[ii].rnti,harq_pidP)) == -1 ) { - mac_xface->macphy_exit("[MAC][eNB] Max user count reached\n"); - // kill RA procedure - } else - LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Added user with rnti %x => UE %d\n", - enb_mod_idP,CC_idP,frameP,eNB->common_channels[CC_idP].RA_template[ii].rnti,UE_id); - } else { - LOG_I(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3 from already registered UE %d: length %d, offset %d\n", - enb_mod_idP,CC_idP,frameP,UE_id,rx_lengths[i],payload_ptr-sduP); - // kill RA procedure - } - - if (Is_rrc_registered == 1) - mac_rrc_data_ind( - enb_mod_idP, - CC_idP, - frameP,subframeP, - rntiP, - CCCH, - (uint8_t*)payload_ptr, - rx_lengths[i], - ENB_FLAG_YES, - enb_mod_idP, - 0); - - - if (num_ce >0) { // handle msg3 which is not RRCConnectionRequest - // process_ra_message(msg3,num_ce,rx_lcids,rx_ces); - } - - eNB->common_channels[CC_idP].RA_template[ii].generate_Msg4 = 1; - eNB->common_channels[CC_idP].RA_template[ii].wait_ack_Msg4 = 0; - - } // if process is active - } // loop on RA processes - - break; - - case DCCH : - case DCCH1 : - // if(eNB_mac_inst[module_idP][CC_idP].Dcch_lchan[UE_id].Active==1){ - - -#if defined(ENABLE_MAC_PAYLOAD_DEBUG) - LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sduP)); - - for (j=0; j<32; j++) { - LOG_T(MAC,"%x ",payload_ptr[j]); - } - - LOG_T(MAC,"\n"); -#endif - - if (UE_id != -1) { - // adjust buffer occupancy of the correponding logical channel group - if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] >= rx_lengths[i]) - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] -= rx_lengths[i]; - else - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] = 0; - - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DCCH, received %d bytes form UE %d on LCID %d \n", - enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id, rx_lcids[i]); - - mac_rlc_data_ind( - enb_mod_idP, - rntiP, - enb_mod_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - rx_lcids[i], - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL);//(unsigned int*)crc_status); - UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1; - UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; - } /* UE_id != -1 */ - - // } - break; - - case DTCH: // default DRB - // if(eNB_mac_inst[module_idP][CC_idP].Dcch_lchan[UE_id].Active==1){ - -#if defined(ENABLE_MAC_PAYLOAD_DEBUG) - LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sduP)); - - for (j=0; j<32; j++) { - LOG_T(MAC,"%x ",payload_ptr[j]); - } - - LOG_T(MAC,"\n"); -#endif - - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DTCH, received %d bytes from UE %d for lcid %d\n", - enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id,rx_lcids[i]); - - if (UE_id != -1) { - // adjust buffer occupancy of the correponding logical channel group - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DTCH, received %d bytes from UE %d for lcid %d, removing from LCGID %d, %d\n", - enb_mod_idP,CC_idP,frameP, rx_lengths[i], UE_id,rx_lcids[i], - UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]], - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]]); - - if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] >= rx_lengths[i]) - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] -= rx_lengths[i]; - else - UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] = 0; - - if ((rx_lengths[i] 0) ) { // MAX SIZE OF transport block - mac_rlc_data_ind( - enb_mod_idP, - rntiP, - enb_mod_idP, - frameP, - ENB_FLAG_YES, - MBMS_FLAG_NO, - DTCH, - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL);//(unsigned int*)crc_status); - UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1; - UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i]; - } - } /* UE_id != -1 */ - - // } - break; - - default : //if (rx_lcids[i] >= DTCH) { - if (UE_id != -1) - UE_list->eNB_UE_stats[CC_idP][UE_id].num_errors_rx+=1; - LOG_E(MAC,"[eNB %d] CC_id %d Frame %d : received unsupported or unknown LCID %d from UE %d ", - enb_mod_idP, CC_idP, frameP, rx_lcids[i], UE_id); - break; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU, 1); + if (opt_enabled == 1) { + trace_pdu(0, sduP, sdu_lenP, 0, 3, current_rnti, frameP, subframeP, + 0, 0); + LOG_D(OPT, "[eNB %d][ULSCH] Frame %d rnti %x with size %d\n", + enb_mod_idP, frameP, current_rnti, sdu_lenP); } - payload_ptr+=rx_lengths[i]; - } - - /* NN--> FK: we could either check the payload, or use a phy helper to detect a false msg3 */ - if ((num_sdu == 0) && (num_ce==0)) { - if (UE_id != -1) - UE_list->eNB_UE_stats[CC_idP][UE_id].total_num_errors_rx+=1; - - if (msg3_flagP != NULL) { - if( *msg3_flagP == 1 ) { - LOG_N(MAC,"[eNB %d] CC_id %d frame %d : false msg3 detection: signal phy to canceling RA and remove the UE\n", enb_mod_idP, CC_idP, frameP); - *msg3_flagP=0; - } - } - } else { if (UE_id != -1) { - UE_list->eNB_UE_stats[CC_idP][UE_id].pdu_bytes_rx=sdu_lenP; - UE_list->eNB_UE_stats[CC_idP][UE_id].total_pdu_bytes_rx+=sdu_lenP; - UE_list->eNB_UE_stats[CC_idP][UE_id].total_num_pdus_rx+=1; + LOG_D(MAC, + "[eNB %d][PUSCH %d] CC_id %d Received ULSCH sdu round %d from PHY (rnti %x, UE_id %d) ul_cqi %d\n", + enb_mod_idP, harq_pid, CC_idP, + UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid], + current_rnti, UE_id, ul_cqi); + + AssertFatal(UE_list->UE_sched_ctrl[UE_id]. + round_UL[CC_idP][harq_pid] < 8, "round >= 8\n"); + if (sduP != NULL) { + UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer = 0; + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0; + UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= + (~(1 << harq_pid)); + /* Update with smoothing: 3/4 of old value and 1/4 of new. + * This is the logic that was done in the function + * lte_est_timing_advance_pusch, maybe it's not necessary? + * maybe it's even not correct at all? + */ + UE_list->UE_sched_ctrl[UE_id].ta_update = + (UE_list->UE_sched_ctrl[UE_id].ta_update * 3 + + timing_advance) / 4; + UE_list->UE_sched_ctrl[UE_id].pusch_snr[CC_idP] = ul_cqi; + UE_list->UE_sched_ctrl[UE_id].ul_consecutive_errors = 0; + first_rb = + UE_list->UE_template[CC_idP][UE_id].first_rb_ul[harq_pid]; + + if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync > 0) { + UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 0; + mac_eNB_rrc_ul_in_sync(enb_mod_idP, CC_idP, frameP, + subframeP, UE_RNTI(enb_mod_idP, + UE_id)); + } + } else { // we've got an error + LOG_D(MAC, + "[eNB %d][PUSCH %d] CC_id %d ULSCH in error in round %d, ul_cqi %d\n", + enb_mod_idP, harq_pid, CC_idP, + UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid], + ul_cqi); + + // AssertFatal(1==0,"ulsch in error\n"); + if (UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid] == + 3) { + UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= + (~(1 << harq_pid)); + UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid] = + 0; + if (UE_list->UE_sched_ctrl[UE_id]. + ul_consecutive_errors++ == 10) + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 1; + } else + UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid]++; + return; + + } + } else if ((RA_id = find_RA_id(enb_mod_idP, CC_idP, current_rnti)) != -1) { // Check if this is an RA process for the rnti + AssertFatal(mac->common_channels[CC_idP]. + radioResourceConfigCommon->rach_ConfigCommon. + maxHARQ_Msg3Tx > 1, + "maxHARQ %d should be greater than 1\n", + (int) mac->common_channels[CC_idP]. + radioResourceConfigCommon->rach_ConfigCommon. + maxHARQ_Msg3Tx); + + LOG_D(MAC, + "[eNB %d][PUSCH %d] CC_id %d [RAPROC Msg3] Received ULSCH sdu round %d from PHY (rnti %x, RA_id %d) ul_cqi %d\n", + enb_mod_idP, harq_pid, CC_idP, ra[RA_id].msg3_round, + current_rnti, RA_id, ul_cqi); + + first_rb = ra->msg3_first_rb; + + if (sduP == NULL) { // we've got an error on Msg3 + LOG_D(MAC, + "[eNB %d] CC_id %d, RA %d ULSCH in error in round %d/%d\n", + enb_mod_idP, CC_idP, RA_id, + ra[RA_id].msg3_round, + (int) mac->common_channels[CC_idP]. + radioResourceConfigCommon->rach_ConfigCommon. + maxHARQ_Msg3Tx); + if (ra[RA_id].msg3_round == + mac->common_channels[CC_idP].radioResourceConfigCommon-> + rach_ConfigCommon.maxHARQ_Msg3Tx - 1) { + cancel_ra_proc(enb_mod_idP, CC_idP, frameP, current_rnti); + } + + else { + first_rb = + UE_list->UE_template[CC_idP][UE_id]. + first_rb_ul[harq_pid]; + ra[RA_id].msg3_round++; + // prepare handling of retransmission + ra[RA_id].Msg3_frame = (ra[RA_id].Msg3_frame + ((ra[RA_id].Msg3_subframe > 1) ? 1 : 0)) % 1024; + ra[RA_id].Msg3_subframe = (ra[RA_id].Msg3_subframe + 8) % 10; + add_msg3(enb_mod_idP, CC_idP, &ra[RA_id], frameP, + subframeP); + } + return; + } + } else { + LOG_W(MAC, + "Cannot find UE or RA corresponding to ULSCH rnti %x, dropping it\n", + current_rnti); + return; } - } + payload_ptr = + parse_ulsch_header(sduP, &num_ce, &num_sdu, rx_ces, rx_lcids, + rx_lengths, sdu_lenP); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU,0); - stop_meas(&eNB->rx_ulsch_sdu); + T(T_ENB_MAC_UE_UL_PDU, T_INT(enb_mod_idP), T_INT(CC_idP), + T_INT(current_rnti), T_INT(frameP), T_INT(subframeP), + T_INT(harq_pid), T_INT(sdu_lenP), T_INT(num_ce), T_INT(num_sdu)); + T(T_ENB_MAC_UE_UL_PDU_WITH_DATA, T_INT(enb_mod_idP), T_INT(CC_idP), + T_INT(current_rnti), T_INT(frameP), T_INT(subframeP), + T_INT(harq_pid), T_INT(sdu_lenP), T_INT(num_ce), T_INT(num_sdu), + T_BUFFER(sduP, sdu_lenP)); + + mac->eNB_stats[CC_idP].ulsch_bytes_rx = sdu_lenP; + mac->eNB_stats[CC_idP].total_ulsch_bytes_rx += sdu_lenP; + mac->eNB_stats[CC_idP].total_ulsch_pdus_rx += 1; + + UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid] = 0; + + // control element + for (i = 0; i < num_ce; i++) { + + T(T_ENB_MAC_UE_UL_CE, T_INT(enb_mod_idP), T_INT(CC_idP), + T_INT(current_rnti), T_INT(frameP), T_INT(subframeP), + T_INT(rx_ces[i])); + + switch (rx_ces[i]) { // implement and process BSR + CRNTI + + case POWER_HEADROOM: + if (UE_id != -1) { + UE_list->UE_template[CC_idP][UE_id].phr_info = + (payload_ptr[0] & 0x3f) - PHR_MAPPING_OFFSET; + LOG_D(MAC, + "[eNB %d] CC_id %d MAC CE_LCID %d : Received PHR PH = %d (db)\n", + enb_mod_idP, CC_idP, rx_ces[i], + UE_list->UE_template[CC_idP][UE_id].phr_info); + UE_list->UE_template[CC_idP][UE_id].phr_info_configured = + 1; + UE_list->UE_sched_ctrl[UE_id].phr_received = 1; + } + payload_ptr += sizeof(POWER_HEADROOM_CMD); + break; + + case CRNTI: + { + int old_rnti = + (((uint16_t) payload_ptr[0]) << 8) + payload_ptr[1]; + int old_UE_id = find_UE_id(enb_mod_idP, old_rnti); + LOG_D(MAC, + "[eNB %d] Frame %d, Subframe %d CC_id %d MAC CE_LCID %d (ce %d/%d): CRNTI %x (UE_id %d) in Msg3\n", + enb_mod_idP, frameP, subframeP, CC_idP, rx_ces[i], i, + num_ce, old_rnti, old_UE_id); + /* receiving CRNTI means that the current rnti has to go away */ + cancel_ra_proc(enb_mod_idP, CC_idP, frameP, + current_rnti); + if (old_UE_id != -1) { + /* TODO: if the UE did random access (followed by a MAC uplink with + * CRNTI) because none of its scheduling request was granted, then + * according to 36.321 5.4.4 the UE's MAC will notify RRC to release + * PUCCH/SRS. According to 36.331 5.3.13 the UE will then apply + * default configuration for CQI reporting and scheduling requests, + * which basically means that the CQI requests won't work anymore and + * that the UE won't do any scheduling request anymore as long as the + * eNB doesn't reconfigure the UE. + * We have to take care of this. As the code is, nothing is done and + * the UE state in the eNB is wrong. + */ + UE_id = old_UE_id; + UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer = 0; + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0; + if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync > 0) { + UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 0; + mac_eNB_rrc_ul_in_sync(enb_mod_idP, CC_idP, frameP, + subframeP, old_rnti); + } + current_rnti = old_rnti; + } + crnti_rx = 1; + payload_ptr += 2; + break; + } + + case TRUNCATED_BSR: + case SHORT_BSR: + { + uint8_t lcgid; + lcgid = (payload_ptr[0] >> 6); + + LOG_D(MAC, + "[eNB %d] CC_id %d MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n", + enb_mod_idP, CC_idP, rx_ces[i], lcgid, + payload_ptr[0] & 0x3f); + + if (crnti_rx == 1) + LOG_D(MAC, + "[eNB %d] CC_id %d MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n", + enb_mod_idP, CC_idP, rx_ces[i], lcgid, + payload_ptr[0] & 0x3f); + if (UE_id != -1) { + + UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = + (payload_ptr[0] & 0x3f); + + // update buffer info + + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[lcgid] = + BSR_TABLE[UE_list->UE_template[CC_idP][UE_id]. + bsr_info[lcgid]]; + + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[lcgid]; + + RC.eNB[enb_mod_idP][CC_idP]-> + pusch_stats_bsr[UE_id][(frameP * 10) + subframeP] + = (payload_ptr[0] & 0x3f); + if (UE_id == UE_list->head) + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME + (VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR, + RC.eNB[enb_mod_idP][CC_idP]->pusch_stats_bsr + [UE_id][(frameP * 10) + subframeP]); + if (UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_creation_time[lcgid] + == 0) { + UE_list->UE_template[CC_idP] + [UE_id].ul_buffer_creation_time[lcgid] = + frameP; + } + if (mac_eNB_get_rrc_status + (enb_mod_idP, + UE_RNTI(enb_mod_idP, UE_id)) < RRC_CONNECTED) + LOG_D(MAC, + "[eNB %d] CC_id %d MAC CE_LCID %d : ul_total_buffer = %d (lcg increment %d)\n", + enb_mod_idP, CC_idP, rx_ces[i], + UE_list->UE_template[CC_idP][UE_id]. + ul_total_buffer, + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[lcgid]); + } else { + + } + payload_ptr += 1; //sizeof(SHORT_BSR); // fixme + } + break; + + case LONG_BSR: + if (UE_id != -1) { + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0] = + ((payload_ptr[0] & 0xFC) >> 2); + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1] = + ((payload_ptr[0] & 0x03) << 4) | + ((payload_ptr[1] & 0xF0) >> 4); + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2] = + ((payload_ptr[1] & 0x0F) << 2) | + ((payload_ptr[2] & 0xC0) >> 6); + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3] = + (payload_ptr[2] & 0x3F); + + // update buffer info + old_buffer_info = + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID0]; + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID0] = + BSR_TABLE[UE_list->UE_template[CC_idP][UE_id]. + bsr_info[LCGID0]]; + + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer += + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID0]; + if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= + old_buffer_info) + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= + old_buffer_info; + else + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = + 0; + + old_buffer_info = + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID1]; + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID1] = + BSR_TABLE[UE_list->UE_template[CC_idP][UE_id]. + bsr_info[LCGID1]]; + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer += + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID1]; + if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= + old_buffer_info) + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= + old_buffer_info; + else + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = + 0; + + old_buffer_info = + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID2]; + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID2] = + BSR_TABLE[UE_list->UE_template[CC_idP][UE_id]. + bsr_info[LCGID2]]; + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer += + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID2]; + if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= + old_buffer_info) + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= + old_buffer_info; + else + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = + 0; + + old_buffer_info = + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID3]; + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID3] = + BSR_TABLE[UE_list->UE_template[CC_idP][UE_id]. + bsr_info[LCGID3]]; + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer += + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[LCGID3]; + if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= + old_buffer_info) + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= + old_buffer_info; + else + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = + 0; + + LOG_D(MAC, + "[eNB %d] CC_id %d MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = " + "%u LCGID2 = %u LCGID3 = %u\n", enb_mod_idP, CC_idP, + rx_ces[i], + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0], + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1], + UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2], + UE_list->UE_template[CC_idP][UE_id]. + bsr_info[LCGID3]); + if (crnti_rx == 1) + LOG_D(MAC, + "[eNB %d] CC_id %d MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = " + "%u LCGID2 = %u LCGID3 = %u\n", enb_mod_idP, + CC_idP, rx_ces[i], + UE_list->UE_template[CC_idP][UE_id]. + bsr_info[LCGID0], + UE_list->UE_template[CC_idP][UE_id]. + bsr_info[LCGID1], + UE_list->UE_template[CC_idP][UE_id]. + bsr_info[LCGID2], + UE_list->UE_template[CC_idP][UE_id]. + bsr_info[LCGID3]); + + if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0] == + 0) { + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_creation_time[LCGID0] = 0; + } else if (UE_list->UE_template[CC_idP] + [UE_id].ul_buffer_creation_time[LCGID0] == 0) { + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_creation_time[LCGID0] = frameP; + } + + if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1] == + 0) { + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_creation_time[LCGID1] = 0; + } else if (UE_list->UE_template[CC_idP] + [UE_id].ul_buffer_creation_time[LCGID1] == 0) { + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_creation_time[LCGID1] = frameP; + } + + if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2] == + 0) { + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_creation_time[LCGID2] = 0; + } else if (UE_list->UE_template[CC_idP] + [UE_id].ul_buffer_creation_time[LCGID2] == 0) { + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_creation_time[LCGID2] = frameP; + } + + if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3] == + 0) { + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_creation_time[LCGID3] = 0; + } else if (UE_list->UE_template[CC_idP] + [UE_id].ul_buffer_creation_time[LCGID3] == 0) { + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_creation_time[LCGID3] = frameP; + + } + } + + payload_ptr += 3; ////sizeof(LONG_BSR); + break; + + default: + LOG_E(MAC, + "[eNB %d] CC_id %d Received unknown MAC header (0x%02x)\n", + enb_mod_idP, CC_idP, rx_ces[i]); + break; + } + } + + for (i = 0; i < num_sdu; i++) { + LOG_D(MAC, "SDU Number %d MAC Subheader SDU_LCID %d, length %d\n", + i, rx_lcids[i], rx_lengths[i]); + + T(T_ENB_MAC_UE_UL_SDU, T_INT(enb_mod_idP), T_INT(CC_idP), + T_INT(current_rnti), T_INT(frameP), T_INT(subframeP), + T_INT(rx_lcids[i]), T_INT(rx_lengths[i])); + T(T_ENB_MAC_UE_UL_SDU_WITH_DATA, T_INT(enb_mod_idP), T_INT(CC_idP), + T_INT(current_rnti), T_INT(frameP), T_INT(subframeP), + T_INT(rx_lcids[i]), T_INT(rx_lengths[i]), T_BUFFER(payload_ptr, + rx_lengths + [i])); + + switch (rx_lcids[i]) { + case CCCH: + if (rx_lengths[i] > CCCH_PAYLOAD_SIZE_MAX) { + LOG_E(MAC, + "[eNB %d/%d] frame %d received CCCH of size %d (too big, maximum allowed is %d, sdu_len %d), dropping packet\n", + enb_mod_idP, CC_idP, frameP, rx_lengths[i], + CCCH_PAYLOAD_SIZE_MAX, sdu_lenP); + break; + } + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d, Received CCCH: %x.%x.%x.%x.%x.%x, Terminating RA procedure for UE rnti %x\n", + enb_mod_idP, CC_idP, frameP, payload_ptr[0], + payload_ptr[1], payload_ptr[2], payload_ptr[3], + payload_ptr[4], payload_ptr[5], current_rnti); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_TERMINATE_RA_PROC, 1); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_TERMINATE_RA_PROC, 0); + for (ii = 0; ii < NB_RA_PROC_MAX; ii++) { + RA_t *ra = &mac->common_channels[CC_idP].ra[ii]; + + LOG_D(MAC, + "[mac %d][RAPROC] CC_id %d Checking proc %d : rnti (%x, %x), state %d\n", + enb_mod_idP, CC_idP, ii, ra->rnti, + current_rnti, ra->state); + + if ((ra->rnti == current_rnti) && (ra->state != IDLE)) { + + //payload_ptr = parse_ulsch_header(msg3,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,msg3_len); + + if (UE_id < 0) { + memcpy(&ra->cont_res_id[0], payload_ptr, 6); + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3: length %d, offset %ld\n", + enb_mod_idP, CC_idP, frameP, rx_lengths[i], + payload_ptr - sduP); + + if ((UE_id = + add_new_ue(enb_mod_idP, CC_idP, + mac->common_channels[CC_idP]. + ra[ii].rnti, harq_pid +#ifdef Rel14 + , + mac->common_channels[CC_idP]. + ra[ii].rach_resource_type +#endif + )) == -1) { + AssertFatal(1 == 0, + "[MAC][eNB] Max user count reached\n"); + // kill RA procedure + } else + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d Added user with rnti %x => UE %d\n", + enb_mod_idP, CC_idP, frameP, ra->rnti, + UE_id); + } else { + LOG_D(MAC, + "[eNB %d][RAPROC] CC_id %d Frame %d CCCH: Received Msg3 from already registered UE %d: length %d, offset %ld\n", + enb_mod_idP, CC_idP, frameP, UE_id, + rx_lengths[i], payload_ptr - sduP); + // kill RA procedure + } + + mac_rrc_data_ind(enb_mod_idP, + CC_idP, + frameP, subframeP, + current_rnti, + CCCH, + (uint8_t *) payload_ptr, + rx_lengths[i], + 0); + + + if (num_ce > 0) { // handle msg3 which is not RRCConnectionRequest + // process_ra_message(msg3,num_ce,rx_lcids,rx_ces); + } + // prepare transmission of Msg4 + ra->state = MSG4; + + + + // Program Msg4 PDCCH+DLSCH/MPDCCH transmission 4 subframes from now, // Check if this is ok for BL/CE, or if the rule is different + ra->Msg4_frame = frameP + ((subframeP > 5) ? 1 : 0); + ra->Msg4_subframe = (subframeP + 4) % 10; + + } // if process is active + } // loop on RA processes + + break; + + case DCCH: + case DCCH1: + // if(eNB_mac_inst[module_idP][CC_idP].Dcch_lchan[UE_id].Active==1){ + + +#if defined(ENABLE_MAC_PAYLOAD_DEBUG) + LOG_T(MAC, "offset: %d\n", + (unsigned char) ((unsigned char *) payload_ptr - sduP)); + for (j = 0; j < 32; j++) { + LOG_T(MAC, "%x ", payload_ptr[j]); + } + LOG_T(MAC, "\n"); +#endif + + if (UE_id != -1) { + // adjust buffer occupancy of the correponding logical channel group + if (UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[UE_list->UE_template[CC_idP] + [UE_id].lcgidmap[rx_lcids[i]]] >= + rx_lengths[i]) + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[UE_list->UE_template[CC_idP] + [UE_id].lcgidmap[rx_lcids[i]]] -= + rx_lengths[i]; + else + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[UE_list->UE_template[CC_idP] + [UE_id].lcgidmap[rx_lcids[i]]] = 0; + + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DCCH, received %d bytes form UE %d on LCID %d \n", + enb_mod_idP, CC_idP, frameP, rx_lengths[i], UE_id, + rx_lcids[i]); + + mac_rlc_data_ind(enb_mod_idP, current_rnti, enb_mod_idP, frameP, ENB_FLAG_YES, MBMS_FLAG_NO, rx_lcids[i], (char *) payload_ptr, rx_lengths[i], 1, NULL); //(unsigned int*)crc_status); + UE_list->eNB_UE_stats[CC_idP][UE_id]. + num_pdu_rx[rx_lcids[i]] += 1; + UE_list->eNB_UE_stats[CC_idP][UE_id]. + num_bytes_rx[rx_lcids[i]] + += rx_lengths[i]; + + + } + + /* UE_id != -1 */ + // } + break; + + // all the DRBS + case DTCH: + default: + +#if defined(ENABLE_MAC_PAYLOAD_DEBUG) + LOG_T(MAC, "offset: %d\n", + (unsigned char) ((unsigned char *) payload_ptr - sduP)); + for (j = 0; j < 32; j++) { + LOG_T(MAC, "%x ", payload_ptr[j]); + } + LOG_T(MAC, "\n"); +#endif + if (rx_lcids[i] < NB_RB_MAX) { + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DTCH, received %d bytes from UE %d for lcid %d\n", + enb_mod_idP, CC_idP, frameP, rx_lengths[i], UE_id, + rx_lcids[i]); + + if (UE_id != -1) { + // adjust buffer occupancy of the correponding logical channel group + LOG_D(MAC, + "[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DTCH, received %d bytes from UE %d for lcid %d, removing from LCGID %ld, %d\n", + enb_mod_idP, CC_idP, frameP, rx_lengths[i], + UE_id, rx_lcids[i], + UE_list->UE_template[CC_idP][UE_id]. + lcgidmap[rx_lcids[i]], + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[UE_list->UE_template[CC_idP] + [UE_id].lcgidmap[rx_lcids[i]]]); + + if (UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[UE_list->UE_template[CC_idP] + [UE_id].lcgidmap[rx_lcids[i]]] + >= rx_lengths[i]) + UE_list->UE_template[CC_idP][UE_id]. + ul_buffer_info[UE_list->UE_template[CC_idP] + [UE_id].lcgidmap[rx_lcids[i]]] + -= rx_lengths[i]; + else + UE_list->UE_template[CC_idP][UE_id].ul_buffer_info + [UE_list->UE_template[CC_idP][UE_id].lcgidmap + [rx_lcids[i]]] = 0; + if ((rx_lengths[i] < SCH_PAYLOAD_SIZE_MAX) + && (rx_lengths[i] > 0)) { // MAX SIZE OF transport block + mac_rlc_data_ind(enb_mod_idP, current_rnti, enb_mod_idP, frameP, ENB_FLAG_YES, MBMS_FLAG_NO, rx_lcids[i], (char *) payload_ptr, rx_lengths[i], 1, NULL); //(unsigned int*)crc_status); + + UE_list->eNB_UE_stats[CC_idP][UE_id]. + num_pdu_rx[rx_lcids[i]] += 1; + UE_list->eNB_UE_stats[CC_idP][UE_id]. + num_bytes_rx[rx_lcids[i]] += rx_lengths[i]; + //clear uplane_inactivity_timer + UE_list->UE_sched_ctrl[UE_id].uplane_inactivity_timer = 0; + } else { /* rx_length[i] */ + UE_list->eNB_UE_stats[CC_idP][UE_id]. + num_errors_rx += 1; + LOG_E(MAC, + "[eNB %d] CC_id %d Frame %d : Max size of transport block reached LCID %d from UE %d ", + enb_mod_idP, CC_idP, frameP, rx_lcids[i], + UE_id); + } + } else { /*(UE_id != -1 */ + LOG_E(MAC, + "[eNB %d] CC_id %d Frame %d : received unsupported or unknown LCID %d from UE %d ", + enb_mod_idP, CC_idP, frameP, rx_lcids[i], UE_id); + } + } + + break; + } + + payload_ptr += rx_lengths[i]; + } + + // Program ACK for PHICH + LOG_D(MAC, + "Programming PHICH ACK for rnti %x harq_pid %d (first_rb %d)\n", + current_rnti, harq_pid, first_rb); + nfapi_hi_dci0_request_t *hi_dci0_req = &mac->HI_DCI0_req[CC_idP]; + nfapi_hi_dci0_request_body_t *hi_dci0_req_body = &hi_dci0_req->hi_dci0_request_body; + nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu = + &hi_dci0_req_body->hi_dci0_pdu_list[hi_dci0_req_body->number_of_dci + hi_dci0_req_body->number_of_hi]; + memset((void *) hi_dci0_pdu, 0, sizeof(nfapi_hi_dci0_request_pdu_t)); + hi_dci0_pdu->pdu_type = NFAPI_HI_DCI0_HI_PDU_TYPE; + hi_dci0_pdu->pdu_size = 2 + sizeof(nfapi_hi_dci0_hi_pdu); + hi_dci0_pdu->hi_pdu.hi_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG; + hi_dci0_pdu->hi_pdu.hi_pdu_rel8.resource_block_start = first_rb; + hi_dci0_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms = 0; + hi_dci0_pdu->hi_pdu.hi_pdu_rel8.hi_value = 1; + hi_dci0_req_body->number_of_hi++; + hi_dci0_req_body->sfnsf = sfnsf_add_subframe(frameP,subframeP, 0); + hi_dci0_req_body->tl.tag = NFAPI_HI_DCI0_REQUEST_BODY_TAG; + hi_dci0_req->sfn_sf = sfnsf_add_subframe(frameP,subframeP, 4); + hi_dci0_req->header.message_id = NFAPI_HI_DCI0_REQUEST; + + /* NN--> FK: we could either check the payload, or use a phy helper to detect a false msg3 */ + if ((num_sdu == 0) && (num_ce == 0)) { + if (UE_id != -1) + UE_list->eNB_UE_stats[CC_idP][UE_id].total_num_errors_rx += 1; + /* + if (msg3_flagP != NULL) { + if( *msg3_flagP == 1 ) { + LOG_N(MAC,"[eNB %d] CC_id %d frame %d : false msg3 detection: signal phy to canceling RA and remove the UE\n", enb_mod_idP, CC_idP, frameP); + *msg3_flagP=0; + } + } */ + } else { + if (UE_id != -1) { + UE_list->eNB_UE_stats[CC_idP][UE_id].pdu_bytes_rx = sdu_lenP; + UE_list->eNB_UE_stats[CC_idP][UE_id].total_pdu_bytes_rx += + sdu_lenP; + UE_list->eNB_UE_stats[CC_idP][UE_id].total_num_pdus_rx += 1; + } + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU, 0); + stop_meas(&mac->rx_ulsch_sdu); } - uint32_t bytes_to_bsr_index(int32_t nbytes) { + uint32_t i = 0; - uint32_t i=0; + if (nbytes < 0) { + return (0); + } - if (nbytes<0) { - return(0); - } + while ((i < BSR_TABLE_SIZE) && (BSR_TABLE[i] <= nbytes)) { + i++; + } - while ((iE == 0) { + not_done = 0; + } - if (((SCH_SUBHEADER_FIXED*)mac_header_ptr)->E == 0) { - not_done = 0; + lcid = ((SCH_SUBHEADER_FIXED *) mac_header_ptr)->LCID; + + if (lcid < EXTENDED_POWER_HEADROOM) { + if (not_done == 0) { // last MAC SDU, length is implicit + mac_header_ptr++; + length = + tb_length - (mac_header_ptr - mac_header) - ce_len; + + for (num_sdu_cnt = 0; num_sdu_cnt < num_sdus; + num_sdu_cnt++) { + length -= rx_lengths[num_sdu_cnt]; + } + } else { + if (((SCH_SUBHEADER_SHORT *) mac_header_ptr)->F == 0) { + length = ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->L; + mac_header_ptr += 2; //sizeof(SCH_SUBHEADER_SHORT); + } else { // F = 1 + length = + ((((SCH_SUBHEADER_LONG *) mac_header_ptr)->L_MSB & + 0x7f) << 8) | (((SCH_SUBHEADER_LONG *) + mac_header_ptr)->L_LSB & 0xff); + mac_header_ptr += 3; //sizeof(SCH_SUBHEADER_LONG); + } + } + + LOG_D(MAC, + "[eNB] sdu %d lcid %d tb_length %d length %d (offset now %ld)\n", + num_sdus, lcid, tb_length, length, + mac_header_ptr - mac_header); + rx_lcids[num_sdus] = lcid; + rx_lengths[num_sdus] = length; + num_sdus++; + } else { // This is a control element subheader POWER_HEADROOM, BSR and CRNTI + if (lcid == SHORT_PADDING) { + mac_header_ptr++; + } else { + rx_ces[num_ces] = lcid; + num_ces++; + mac_header_ptr++; + + if (lcid == LONG_BSR) { + ce_len += 3; + } else if (lcid == CRNTI) { + ce_len += 2; + } else if ((lcid == POWER_HEADROOM) + || (lcid == TRUNCATED_BSR) + || (lcid == SHORT_BSR)) { + ce_len++; + } else { + LOG_E(MAC, "unknown CE %d \n", lcid); + AssertFatal(1 == 0, "unknown CE"); + } + } + } } - lcid = ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID; + *num_ce = num_ces; + *num_sdu = num_sdus; - if (lcid < EXTENDED_POWER_HEADROOM) { - if (not_done==0) { // last MAC SDU, length is implicit - mac_header_ptr++; - length = tb_length-(mac_header_ptr-mac_header)-ce_len; + return (mac_header_ptr); +} - for (num_sdu_cnt=0; num_sdu_cnt < num_sdus ; num_sdu_cnt++) { - length -= rx_lengths[num_sdu_cnt]; - } - } else { - if (((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F == 0) { - length = ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L; - mac_header_ptr += 2;//sizeof(SCH_SUBHEADER_SHORT); - } else { // F = 1 - length = ((((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB & 0x7f ) << 8 ) | (((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB & 0xff); - mac_header_ptr += 3;//sizeof(SCH_SUBHEADER_LONG); - } - } - - LOG_D(MAC,"[eNB] sdu %d lcid %d tb_length %d length %d (offset now %d)\n", - num_sdus,lcid,tb_length, length,mac_header_ptr-mac_header); - rx_lcids[num_sdus] = lcid; - rx_lengths[num_sdus] = length; - num_sdus++; - } else { // This is a control element subheader POWER_HEADROOM, BSR and CRNTI - if (lcid == SHORT_PADDING) { - mac_header_ptr++; - } else { - rx_ces[num_ces] = lcid; - num_ces++; - mac_header_ptr++; - - if (lcid==LONG_BSR) { - ce_len+=3; - } else if (lcid==CRNTI) { - ce_len+=2; - } else if ((lcid==POWER_HEADROOM) || (lcid==TRUNCATED_BSR)|| (lcid== SHORT_BSR)) { - ce_len++; - } else { - LOG_E(MAC,"unknown CE %d \n", lcid); - mac_xface->macphy_exit("unknown CE"); - } - } +/* This function is called by PHY layer when it schedules some + * uplink for a random access message 3. + * The MAC scheduler has to skip the RBs used by this message 3 + * (done below in schedule_ulsch). + */ +void +set_msg3_subframe(module_id_t Mod_id, + int CC_id, + int frame, + int subframe, int rnti, int Msg3_frame, + int Msg3_subframe) +{ + eNB_MAC_INST *mac = RC.mac[Mod_id]; + int i; + for (i = 0; i < NB_RA_PROC_MAX; i++) { + if (mac->common_channels[CC_id].ra[i].state != IDLE && + mac->common_channels[CC_id].ra[i].rnti == rnti) { + mac->common_channels[CC_id].ra[i].Msg3_subframe = + Msg3_subframe; + break; + } } - } - - *num_ce = num_ces; - *num_sdu = num_sdus; - - return(mac_header_ptr); } -void schedule_ulsch(module_id_t module_idP, - frame_t frameP, - unsigned char cooperation_flag, - sub_frame_t subframeP, - unsigned char sched_subframe) { - - - - uint16_t first_rb[MAX_NUM_CCs],i; - int CC_id; - eNB_MAC_INST *eNB=&eNB_mac_inst[module_idP]; - - start_meas(&eNB->schedule_ulsch); - - - for (CC_id=0; CC_idcommon_channels[CC_id].RA_template[i].RA_active == TRUE) && - (eNB->common_channels[CC_id].RA_template[i].generate_rar == 0) && - (eNB->common_channels[CC_id].RA_template[i].Msg3_subframe == sched_subframe)) { - //leave out first RB for PUCCH - first_rb[CC_id]++; - break; - } - } - - /* - if (mac_xface->is_prach_subframe(&(mac_xface->lte_frame_parms),frameP,subframeP)) { - first_rb[CC_id] = (mac_xface->get_prach_prb_offset(&(mac_xface->lte_frame_parms), - */ - - } - - schedule_ulsch_rnti(module_idP, cooperation_flag, frameP, subframeP, sched_subframe,first_rb); - -#ifdef CBA - schedule_ulsch_cba_rnti(module_idP, cooperation_flag, frameP, subframeP, sched_subframe, first_rb); -#endif - - - stop_meas(&eNB->schedule_ulsch); - -} - - - -void schedule_ulsch_rnti(module_id_t module_idP, - unsigned char cooperation_flag, - frame_t frameP, - sub_frame_t subframeP, - unsigned char sched_subframe, - uint16_t *first_rb) +void +schedule_ulsch(module_id_t module_idP, frame_t frameP, + sub_frame_t subframeP) { + uint16_t first_rb[MAX_NUM_CCs], i; + int CC_id; + eNB_MAC_INST *mac = RC.mac[module_idP]; + COMMON_channels_t *cc; - int UE_id; - uint8_t aggregation = 2; - rnti_t rnti = -1; - uint8_t round = 0; - uint8_t harq_pid = 0; - void *ULSCH_dci = NULL; - LTE_eNB_UE_stats *eNB_UE_stats = NULL; - DCI_PDU *DCI_pdu; - uint8_t status = 0; - uint8_t rb_table_index = -1; - uint16_t TBS = 0; - // int32_t buffer_occupancy=0; - uint32_t cqi_req,cshift,ndi,mcs=0,rballoc,tpc; - int32_t normalized_rx_power, target_rx_power=-90; - static int32_t tpc_accumulated=0; + start_meas(&mac->schedule_ulsch); - int n,CC_id = 0; - eNB_MAC_INST *eNB=&eNB_mac_inst[module_idP]; - UE_list_t *UE_list=&eNB->UE_list; - UE_TEMPLATE *UE_template; - UE_sched_ctrl *UE_sched_ctrl; + int sched_subframe = (subframeP + 4) % 10; - // int rvidx_tab[4] = {0,2,3,1}; - LTE_DL_FRAME_PARMS *frame_parms; - int drop_ue=0; - - // LOG_I(MAC,"entering ulsch preprocesor\n"); - - ulsch_scheduler_pre_processor(module_idP, - frameP, - subframeP, - first_rb, - aggregation); - - // LOG_I(MAC,"exiting ulsch preprocesor\n"); - - // loop over all active UEs - for (UE_id=UE_list->head_ul; UE_id>=0; UE_id=UE_list->next_ul[UE_id]) { - - // don't schedule if Msg4 is not received yet - if (UE_list->UE_template[UE_PCCID(module_idP,UE_id)][UE_id].configured==FALSE) { - LOG_I(MAC,"[eNB %d] frame %d subfarme %d, UE %d: not configured, skipping UE scheduling \n", - module_idP,frameP,subframeP,UE_id); - continue; - } - - rnti = UE_RNTI(module_idP,UE_id); - - if (rnti==NOT_A_RNTI) { - LOG_W(MAC,"[eNB %d] frame %d subfarme %d, UE %d: no RNTI \n", module_idP,frameP,subframeP,UE_id); - continue; - } - - // loop over all active UL CC_ids for this UE - for (n=0; nnumactiveULCCs[UE_id]; n++) { - // This is the actual CC_id in the list - CC_id = UE_list->ordered_ULCCids[n][UE_id]; - frame_parms = mac_xface->get_lte_frame_parms(module_idP,CC_id); - eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); - - if (eNB_UE_stats==NULL) { - LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: no PHY context\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id); - drop_ue=1; - continue; // mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); - } - - if (drop_ue==1) - continue; - - if (CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,aggregation,rnti)) { - LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: not enough nCCE\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id); - continue; // break; - } - - - // printf("UE %d/%x is feasible, mode %s\n",UE_id,rnti,mode_string[eNB_UE_stats->mode]); - - if (eNB_UE_stats->mode == PUSCH) { // ue has a ulsch channel - - DCI_pdu = &eNB->common_channels[CC_id].DCI_pdu; - UE_template = &UE_list->UE_template[CC_id][UE_id]; - UE_sched_ctrl = &UE_list->UE_sched_ctrl[UE_id]; - - if (mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,1) == -1 ) { - LOG_W(MAC,"[eNB %d] Scheduler Frame %d, subframeP %d: candidate harq_pid from PHY for UE %d CC %d RNTI %x\n", - module_idP,frameP,subframeP, UE_id, CC_id, rnti); - continue; - } else - LOG_T(MAC,"[eNB %d] Frame %d, subframeP %d, UE %d CC %d : got harq pid %d round %d (rnti %x,mode %s)\n", - module_idP,frameP,subframeP,UE_id,CC_id, harq_pid, round,rnti,mode_string[eNB_UE_stats->mode]); - - PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP*10)+subframeP] = UE_template->ul_total_buffer; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BO,PHY_vars_eNB_g[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP*10)+subframeP]); - if (((UE_is_to_be_scheduled(module_idP,CC_id,UE_id)>0)) || (round>0))// || ((frameP%10)==0)) - // if there is information on bsr of DCCH, DTCH or if there is UL_SR, or if there is a packet to retransmit, or we want to schedule a periodic feedback every 10 frames - { - LOG_D(MAC,"[eNB %d][PUSCH] Frame %d subframe %d Scheduling UE %d/%x in round %d(SR %d,UL_inactivity timer %d,UL_failure timer %d)\n", - module_idP,frameP,subframeP,UE_id,rnti,round,UE_template->ul_SR, - UE_sched_ctrl->ul_inactivity_timer, - UE_sched_ctrl->ul_failure_timer); - // reset the scheduling request - UE_template->ul_SR = 0; - aggregation = process_ue_cqi(module_idP,UE_id); - status = mac_eNB_get_rrc_status(module_idP,rnti); - if (status < RRC_CONNECTED) - cqi_req = 0; - else if (UE_sched_ctrl->cqi_req_timer>30) { - cqi_req = 1; - UE_sched_ctrl->cqi_req_timer=0; - } - else - cqi_req = 0; - - //power control - //compute the expected ULSCH RX power (for the stats) - - // this is the normalized RX power and this should be constant (regardless of mcs - normalized_rx_power = eNB_UE_stats->UL_rssi[0]; - target_rx_power = mac_xface->get_target_pusch_rx_power(module_idP,CC_id); - - // this assumes accumulated tpc - // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out - int32_t framex10psubframe = UE_template->pusch_tpc_tx_frame*10+UE_template->pusch_tpc_tx_subframe; - if (((framex10psubframe+10)<=(frameP*10+subframeP)) || //normal case - ((framex10psubframe>(frameP*10+subframeP)) && (((10240-framex10psubframe+frameP*10+subframeP)>=10)))) //frame wrap-around - { - UE_template->pusch_tpc_tx_frame=frameP; - UE_template->pusch_tpc_tx_subframe=subframeP; - if (normalized_rx_power>(target_rx_power+1)) { - tpc = 0; //-1 - tpc_accumulated--; - } else if (normalized_rx_power<(target_rx_power-1)) { - tpc = 2; //+1 - tpc_accumulated++; - } else { - tpc = 1; //0 - } - } else { - tpc = 1; //0 - } - - if (tpc!=1) { - LOG_D(MAC,"[eNB %d] ULSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n", - module_idP,frameP,subframeP,harq_pid,tpc, - tpc_accumulated,normalized_rx_power,target_rx_power); - } - - // new transmission - if (round==0) { - - ndi = 1-UE_template->oldNDI_UL[harq_pid]; - UE_template->oldNDI_UL[harq_pid]=ndi; - UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power=normalized_rx_power; - UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power; - UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul; - mcs = cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS - if ((cqi_req==1) && (mcs>19)) { - mcs=19; - } - if (UE_template->pre_allocated_rb_table_index_ul >=0) { - rb_table_index=UE_template->pre_allocated_rb_table_index_ul; - } else { - mcs=cmin (10, openair_daq_vars.target_ue_ul_mcs); - rb_table_index=5; // for PHR - } - - UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2=mcs; - // buffer_occupancy = UE_template->ul_total_buffer; - - while (((rb_table[rb_table_index]>(frame_parms->N_RB_UL-1-first_rb[CC_id])) || - (rb_table[rb_table_index]>45)) && - (rb_table_index>0)) { - rb_table_index--; - } - - TBS = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); - UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_rx+=rb_table[rb_table_index]; - UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_TBS=TBS; - // buffer_occupancy -= TBS; - rballoc = mac_xface->computeRIV(frame_parms->N_RB_UL, - first_rb[CC_id], - rb_table[rb_table_index]); - - T(T_ENB_MAC_UE_UL_SCHEDULE, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), - T_INT(subframeP), T_INT(harq_pid), T_INT(mcs), T_INT(first_rb[CC_id]), T_INT(rb_table[rb_table_index]), - T_INT(TBS)); - - // bad indices : 20 (40 PRB), 21 (45 PRB), 22 (48 PRB) - // increment for next UE allocation - first_rb[CC_id]+=rb_table[rb_table_index]; - //store for possible retransmission - UE_template->nb_rb_ul[harq_pid] = rb_table[rb_table_index]; - UE_sched_ctrl->ul_scheduled |= (1<head) - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SCHEDULED,UE_sched_ctrl->ul_scheduled); - - if (mac_eNB_get_rrc_status(module_idP,rnti) < RRC_CONNECTED) - LOG_I(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n", - module_idP,harq_pid,rnti,CC_id,frameP,subframeP,UE_id,mcs, - first_rb[CC_id],rb_table[rb_table_index], - rb_table_index,TBS,harq_pid); - - // adjust total UL buffer status by TBS, wait for UL sdus to do final update - LOG_D(MAC,"[eNB %d] CC_id %d UE %d/%x : adjusting ul_total_buffer, old %d, TBS %d\n", module_idP,CC_id,UE_id,rnti,UE_template->ul_total_buffer,TBS); - if (UE_template->ul_total_buffer > TBS) - UE_template->ul_total_buffer -= TBS; + cc = &mac->common_channels[0]; + int tdd_sfa; + // for TDD: check subframes where we have to act and return if nothing should be done now + if (cc->tdd_Config) { + tdd_sfa = cc->tdd_Config->subframeAssignment; + switch (subframeP) { + case 0: + if ((tdd_sfa == 0) || (tdd_sfa == 3) || (tdd_sfa == 6)) + sched_subframe = 4; else - UE_template->ul_total_buffer = 0; - LOG_D(MAC,"ul_total_buffer, new %d\n", UE_template->ul_total_buffer); - // Cyclic shift for DM RS - cshift = 0;// values from 0 to 7 can be used for mapping the cyclic shift (36.211 , Table 5.5.2.1.1-1) - - if (frame_parms->frame_type == TDD) { - switch (frame_parms->N_RB_UL) { - case 6: - ULSCH_dci = UE_template->ULSCH_DCI[harq_pid]; - - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe]; - ((DCI0_1_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_1_5MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_1_5MHz_TDD_1_6_t, - format0, - 0); + return; + break; + case 1: + if ((tdd_sfa == 0) || (tdd_sfa == 1)) + sched_subframe = 7; + else if (tdd_sfa == 6) + sched_subframe = 8; + break; + default: + return; + + case 2: // Don't schedule UL in subframe 2 for TDD + return; + case 3: + if (tdd_sfa == 2) + sched_subframe = 7; + else + return; + break; + case 4: + if (tdd_sfa == 1) + sched_subframe = 8; + else + return; + break; + case 5: + if (tdd_sfa == 0) + sched_subframe = 9; + else if (tdd_sfa == 6) + sched_subframe = 3; + else + return; + break; + case 6: + if (tdd_sfa == 1) + sched_subframe = 2; + else if (tdd_sfa == 6) + sched_subframe = 3; + else + return; + break; + case 7: + return; + case 8: + if ((tdd_sfa >= 2) || (tdd_sfa <= 5)) + sched_subframe = 2; + else + return; + break; + case 9: + if ((tdd_sfa == 1) || (tdd_sfa == 3) || (tdd_sfa == 4)) + sched_subframe = 3; + else if (tdd_sfa == 6) + sched_subframe = 4; + else + return; + break; + } + } + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + + + + //leave out first RB for PUCCH + first_rb[CC_id] = 1; + + // UE data info; + // check which UE has data to transmit + // function to decide the scheduling + // e.g. scheduling_rslt = Greedy(granted_UEs, nb_RB) + + // default function for default scheduling + // + + // output of scheduling, the UE numbers in RBs, where it is in the code??? + // check if RA (Msg3) is active in this subframeP, if so skip the PRBs used for Msg3 + // Msg3 is using 1 PRB so we need to increase first_rb accordingly + // not sure about the break (can there be more than 1 active RA procedure?) + + for (i = 0; i < NB_RA_PROC_MAX; i++) { + if ((cc->ra[i].state == WAITMSG3) && + (cc->ra[i].Msg3_subframe == sched_subframe)) { + first_rb[CC_id]++; + // cc->ray[i].Msg3_subframe = -1; break; - - default: - case 25: - ULSCH_dci = UE_template->ULSCH_DCI[harq_pid]; - - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe]; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_5MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_5MHz_TDD_1_6_t, - format0, - 0); - break; - - case 50: - ULSCH_dci = UE_template->ULSCH_DCI[harq_pid]; - - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe]; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_10MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_10MHz_TDD_1_6_t, - format0, - 0); - break; - - case 100: - ULSCH_dci = UE_template->ULSCH_DCI[harq_pid]; - - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->TPC = tpc; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->padding = 0; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_template->DAI_ul[sched_subframe]; - ((DCI0_20MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_20MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_20MHz_TDD_1_6_t, - format0, - 0); - break; - } - } // TDD - else { //FDD - switch (frame_parms->N_RB_UL) { - case 25: - default: - - ULSCH_dci = UE_template->ULSCH_DCI[harq_pid]; - - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->type = 0; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->hopping = 0; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->TPC = tpc; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->padding = 0; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_5MHz_FDD_t), - aggregation, - sizeof_DCI0_5MHz_FDD_t, - format0, - 0); - break; - - case 6: - ULSCH_dci = UE_template->ULSCH_DCI[harq_pid]; - - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->type = 0; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->hopping = 0; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->TPC = tpc; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->padding = 0; - ((DCI0_1_5MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_1_5MHz_FDD_t), - aggregation, - sizeof_DCI0_1_5MHz_FDD_t, - format0, - 0); - break; - - case 50: - ULSCH_dci = UE_template->ULSCH_DCI[harq_pid]; - - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->type = 0; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->hopping = 0; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->TPC = tpc; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->padding = 0; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_10MHz_FDD_t), - aggregation, - sizeof_DCI0_10MHz_FDD_t, - format0, - 0); - break; - - case 100: - ULSCH_dci = UE_template->ULSCH_DCI[harq_pid]; - - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->type = 0; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->hopping = 0; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->mcs = mcs; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->ndi = ndi; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->TPC = tpc; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->padding = 0; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->cshift = cshift; - ((DCI0_20MHz_FDD_t *)ULSCH_dci)->cqi_req = cqi_req; - - add_ue_spec_dci(DCI_pdu, - ULSCH_dci, - rnti, - sizeof(DCI0_20MHz_FDD_t), - aggregation, - sizeof_DCI0_20MHz_FDD_t, - format0, - 0); - break; - - } + } + } + } + + schedule_ulsch_rnti(module_idP, frameP, subframeP, sched_subframe, + first_rb); + + stop_meas(&mac->schedule_ulsch); +} + +void +schedule_ulsch_rnti(module_id_t module_idP, + frame_t frameP, + sub_frame_t subframeP, + unsigned char sched_subframeP, uint16_t * first_rb) +{ + int UE_id; + uint8_t aggregation = 2; + rnti_t rnti = -1; + uint8_t round = 0; + uint8_t harq_pid = 0; + uint8_t status = 0; + uint8_t rb_table_index = -1; + uint32_t cqi_req, cshift, ndi, tpc; + int32_t normalized_rx_power; + int32_t target_rx_power = -90; + static int32_t tpc_accumulated = 0; + int n; + int CC_id = 0; + int drop_ue = 0; + int N_RB_UL; + eNB_MAC_INST *mac = RC.mac[module_idP]; + COMMON_channels_t *cc = mac->common_channels; + UE_list_t *UE_list = &mac->UE_list; + UE_TEMPLATE *UE_template; + UE_sched_ctrl *UE_sched_ctrl; + int sched_frame = frameP; + int rvidx_tab[4] = { 0, 2, 3, 1 }; + + if (sched_subframeP < subframeP) + sched_frame++; + + nfapi_hi_dci0_request_t *hi_dci0_req = &mac->HI_DCI0_req[CC_id]; + nfapi_hi_dci0_request_body_t *hi_dci0_req_body = &hi_dci0_req->hi_dci0_request_body; + nfapi_hi_dci0_request_pdu_t *hi_dci0_pdu; + + nfapi_ul_config_request_t *ul_req_tmp = &mac->UL_req_tmp[CC_id][sched_subframeP]; + nfapi_ul_config_request_body_t *ul_req_tmp_body = &ul_req_tmp->ul_config_request_body; + + //LOG_D(MAC, "entering ulsch preprocesor\n"); + ulsch_scheduler_pre_processor(module_idP, frameP, subframeP, first_rb); + + //LOG_D(MAC, "exiting ulsch preprocesor\n"); + + hi_dci0_req->sfn_sf = (frameP << 4) + subframeP; + + // loop over all active UEs + for (UE_id = UE_list->head_ul; UE_id >= 0; + UE_id = UE_list->next_ul[UE_id]) { + + // don't schedule if Msg4 is not received yet + if (UE_list->UE_template[UE_PCCID(module_idP, UE_id)][UE_id]. + configured == FALSE) { + LOG_D(MAC, + "[eNB %d] frame %d subfarme %d, UE %d: not configured, skipping UE scheduling \n", + module_idP, frameP, subframeP, UE_id); + continue; + } + + rnti = UE_RNTI(module_idP, UE_id); + + if (rnti == NOT_A_RNTI) { + LOG_W(MAC, "[eNB %d] frame %d subfarme %d, UE %d: no RNTI \n", + module_idP, frameP, subframeP, UE_id); + continue; + } + + drop_ue = 0; + /* let's drop the UE if get_eNB_UE_stats returns NULL when calling it with any of the UE's active UL CCs */ + /* TODO: refine? + + for (n=0; nnumactiveULCCs[UE_id]; n++) { + CC_id = UE_list->ordered_ULCCids[n][UE_id]; + + if (mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti) == NULL) { + LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: no PHY context\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id); + drop_ue = 1; + break; + } + } */ + if (drop_ue == 1) { +/* we can't come here, ulsch_scheduler_pre_processor won't put in the list a UE with no PHY context */ + abort(); + /* TODO: this is a hack. Sometimes the UE has no PHY context but + * is still present in the MAC with 'ul_failure_timer' = 0 and + * 'ul_out_of_sync' = 0. It seems wrong and the UE stays there forever. Let's + * start an UL out of sync procedure in this case. + * The root cause of this problem has to be found and corrected. + * In the meantime, this hack... + */ + if (UE_list->UE_sched_ctrl[UE_id].ul_failure_timer == 0 && + UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 0) { + LOG_W(MAC, + "[eNB %d] frame %d subframe %d, UE %d/%x CC %d: UE in weird state, let's put it 'out of sync'\n", + module_idP, frameP, subframeP, UE_id, rnti, CC_id); + // inform RRC of failure and clear timer + mac_eNB_rrc_ul_failure(module_idP, CC_id, frameP, + subframeP, rnti); + UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0; + UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync = 1; + } + continue; + } + // loop over all active UL CC_ids for this UE + for (n = 0; n < UE_list->numactiveULCCs[UE_id]; n++) { + // This is the actual CC_id in the list + CC_id = UE_list->ordered_ULCCids[n][UE_id]; + N_RB_UL = to_prb(cc[CC_id].ul_Bandwidth); + + /* + aggregation=get_aggregation(get_bw_index(module_idP,CC_id), + eNB_UE_stats->dl_cqi, + format0); + */ + + if (CCE_allocation_infeasible + (module_idP, CC_id, 1, subframeP, aggregation, rnti)) { + LOG_W(MAC, + "[eNB %d] frame %d subframe %d, UE %d/%x CC %d: not enough nCCE\n", + module_idP, frameP, subframeP, UE_id, rnti, CC_id); + continue; // break; } + /* be sure that there are some free RBs */ + if (first_rb[CC_id] >= N_RB_UL - 1) { + LOG_W(MAC, + "[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n", + module_idP, frameP, subframeP, UE_id, rnti, CC_id); + continue; + } + // if (eNB_UE_stats->mode == PUSCH) { // ue has a ulsch channel - add_ue_ulsch_info(module_idP, - CC_id, - UE_id, - subframeP, - S_UL_SCHEDULED); - - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframeP %d: Generated ULSCH DCI for next UE_id %d, format 0\n", module_idP,CC_id,frameP,subframeP,UE_id); -#ifdef DEBUG - dump_dci(frame_parms, &DCI_pdu->dci_alloc[DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci-1]); + UE_template = &UE_list->UE_template[CC_id][UE_id]; + UE_sched_ctrl = &UE_list->UE_sched_ctrl[UE_id]; + harq_pid = + subframe2harqpid(&cc[CC_id], sched_frame, sched_subframeP); + round = UE_sched_ctrl->round_UL[CC_id][harq_pid]; + AssertFatal(round < 8, "round %d > 7 for UE %d/%x\n", round, + UE_id, rnti); + LOG_D(MAC, + "[eNB %d] frame %d subframe %d (sched_frame %d, sched_subframe %d), Checking PUSCH %d for UE %d/%x CC %d : aggregation level %d, N_RB_UL %d\n", + module_idP, frameP, subframeP, sched_frame, sched_subframeP, harq_pid, UE_id, rnti, + CC_id, aggregation, N_RB_UL); + + RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP * + 10) + + subframeP] = + UE_template->ul_total_buffer; + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME + (VCD_SIGNAL_DUMPER_VARIABLES_UE0_BO, + RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP * + 10) + + subframeP]); + if (UE_is_to_be_scheduled(module_idP, CC_id, UE_id) > 0 || round > 0) // || ((frameP%10)==0)) + // if there is information on bsr of DCCH, DTCH or if there is UL_SR, or if there is a packet to retransmit, or we want to schedule a periodic feedback every 10 frames + { + LOG_D(MAC, + "[eNB %d][PUSCH %d] Frame %d subframe %d Scheduling UE %d/%x in round %d(SR %d,UL_inactivity timer %d,UL_failure timer %d,cqi_req_timer %d)\n", + module_idP, harq_pid, frameP, subframeP, UE_id, rnti, + round, UE_template->ul_SR, + UE_sched_ctrl->ul_inactivity_timer, + UE_sched_ctrl->ul_failure_timer, + UE_sched_ctrl->cqi_req_timer); + // reset the scheduling request + UE_template->ul_SR = 0; + status = mac_eNB_get_rrc_status(module_idP, rnti); + if (status < RRC_CONNECTED) + cqi_req = 0; + else if (UE_sched_ctrl->cqi_req_timer > 30) { + if (nfapi_mode) { + cqi_req = 0; + } else { + cqi_req = 1; + } + UE_sched_ctrl->cqi_req_timer = 0; + } else + cqi_req = 0; + + //power control + //compute the expected ULSCH RX power (for the stats) + + // this is the normalized RX power and this should be constant (regardless of mcs + normalized_rx_power = UE_sched_ctrl->pusch_snr[CC_id]; + target_rx_power = 178; + + // this assumes accumulated tpc + // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out + int32_t framex10psubframe = + UE_template->pusch_tpc_tx_frame * 10 + + UE_template->pusch_tpc_tx_subframe; + if (((framex10psubframe + 10) <= (frameP * 10 + subframeP)) || //normal case + ((framex10psubframe > (frameP * 10 + subframeP)) && (((10240 - framex10psubframe + frameP * 10 + subframeP) >= 10)))) //frame wrap-around + { + UE_template->pusch_tpc_tx_frame = frameP; + UE_template->pusch_tpc_tx_subframe = subframeP; + if (normalized_rx_power > (target_rx_power + 4)) { + tpc = 0; //-1 + tpc_accumulated--; + } else if (normalized_rx_power < (target_rx_power - 4)) { + tpc = 2; //+1 + tpc_accumulated++; + } else { + tpc = 1; //0 + } + } else { + tpc = 1; //0 + } + //tpc = 1; + if (tpc != 1) { + LOG_D(MAC, + "[eNB %d] ULSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n", + module_idP, frameP, subframeP, harq_pid, tpc, + tpc_accumulated, normalized_rx_power, + target_rx_power); + } + // new transmission + if (round == 0) { + + ndi = 1 - UE_template->oldNDI_UL[harq_pid]; + UE_template->oldNDI_UL[harq_pid] = ndi; + UE_list->eNB_UE_stats[CC_id][UE_id]. + normalized_rx_power = normalized_rx_power; + UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power = + target_rx_power; + UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1 = + UE_template->pre_assigned_mcs_ul; + UE_template->mcs_UL[harq_pid] = UE_template->pre_assigned_mcs_ul; //cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS + if (UE_template->pre_allocated_rb_table_index_ul >= 0) { + rb_table_index = + UE_template->pre_allocated_rb_table_index_ul; + } else { + UE_template->mcs_UL[harq_pid] = 10; //cmin (10, openair_daq_vars.target_ue_ul_mcs); + rb_table_index = 5; // for PHR + } + + UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2 = + UE_template->mcs_UL[harq_pid]; + // buffer_occupancy = UE_template->ul_total_buffer; + + + while (((rb_table[rb_table_index] > + (N_RB_UL - 1 - first_rb[CC_id])) + || (rb_table[rb_table_index] > 45)) + && (rb_table_index > 0)) { + rb_table_index--; + } + + UE_template->TBS_UL[harq_pid] = + get_TBS_UL(UE_template->mcs_UL[harq_pid], + rb_table[rb_table_index]); + UE_list->eNB_UE_stats[CC_id][UE_id]. + total_rbs_used_rx += rb_table[rb_table_index]; + UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_TBS = + UE_template->TBS_UL[harq_pid]; + // buffer_occupancy -= TBS; + + T(T_ENB_MAC_UE_UL_SCHEDULE, T_INT(module_idP), + T_INT(CC_id), T_INT(rnti), T_INT(frameP), + T_INT(subframeP), T_INT(harq_pid), + T_INT(UE_template->mcs_UL[harq_pid]), + T_INT(first_rb[CC_id]), + T_INT(rb_table[rb_table_index]), + T_INT(UE_template->TBS_UL[harq_pid]), T_INT(ndi)); + + if (mac_eNB_get_rrc_status(module_idP, rnti) < + RRC_CONNECTED) + LOG_D(MAC, + "[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n", + module_idP, harq_pid, rnti, CC_id, frameP, + subframeP, UE_id, + UE_template->mcs_UL[harq_pid], + first_rb[CC_id], rb_table[rb_table_index], + rb_table_index, + UE_template->TBS_UL[harq_pid], harq_pid); + + // bad indices : 20 (40 PRB), 21 (45 PRB), 22 (48 PRB) + //store for possible retransmission + UE_template->nb_rb_ul[harq_pid] = + rb_table[rb_table_index]; + UE_template->first_rb_ul[harq_pid] = first_rb[CC_id]; + + UE_sched_ctrl->ul_scheduled |= (1 << harq_pid); + if (UE_id == UE_list->head) + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME + (VCD_SIGNAL_DUMPER_VARIABLES_UE0_SCHEDULED, + UE_sched_ctrl->ul_scheduled); + + // adjust total UL buffer status by TBS, wait for UL sdus to do final update + LOG_D(MAC, + "[eNB %d] CC_id %d UE %d/%x : adjusting ul_total_buffer, old %d, TBS %d\n", + module_idP, CC_id, UE_id, rnti, + UE_template->ul_total_buffer, + UE_template->TBS_UL[harq_pid]); + if (UE_template->ul_total_buffer > + UE_template->TBS_UL[harq_pid]) + UE_template->ul_total_buffer -= + UE_template->TBS_UL[harq_pid]; + else + UE_template->ul_total_buffer = 0; + LOG_D(MAC, "ul_total_buffer, new %d\n", + UE_template->ul_total_buffer); + // Cyclic shift for DM RS + cshift = 0; // values from 0 to 7 can be used for mapping the cyclic shift (36.211 , Table 5.5.2.1.1-1) + // save it for a potential retransmission + UE_template->cshift[harq_pid] = cshift; + + hi_dci0_pdu = &hi_dci0_req_body->hi_dci0_pdu_list[hi_dci0_req_body->number_of_dci + hi_dci0_req_body->number_of_hi]; + memset((void *) hi_dci0_pdu, 0, + sizeof(nfapi_hi_dci0_request_pdu_t)); + hi_dci0_pdu->pdu_type = NFAPI_HI_DCI0_DCI_PDU_TYPE; + hi_dci0_pdu->pdu_size = + 2 + sizeof(nfapi_hi_dci0_dci_pdu); + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.dci_format = + NFAPI_UL_DCI_FORMAT_0; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.aggregation_level = + aggregation; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.rnti = rnti; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.transmission_power = + 6000; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8. + resource_block_start = first_rb[CC_id]; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8. + number_of_resource_block = + rb_table[rb_table_index]; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.mcs_1 = + UE_template->mcs_UL[harq_pid]; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8. + cyclic_shift_2_for_drms = cshift; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8. + frequency_hopping_enabled_flag = 0; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8. + new_data_indication_1 = ndi; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.tpc = tpc; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.cqi_csi_request = + cqi_req; + hi_dci0_pdu->dci_pdu.dci_pdu_rel8.dl_assignment_index = + UE_template->DAI_ul[sched_subframeP]; + + hi_dci0_req_body->number_of_dci++; + hi_dci0_req_body->sfnsf = sfnsf_add_subframe(frameP, subframeP, 4); + hi_dci0_req_body->tl.tag = NFAPI_HI_DCI0_REQUEST_BODY_TAG; + + hi_dci0_req->sfn_sf = frameP<<4|subframeP; // sfnsf_add_subframe(sched_frame, sched_subframeP, 0); // sunday! + hi_dci0_req->header.message_id = NFAPI_HI_DCI0_REQUEST; + + + LOG_D(MAC, + "[PUSCH %d] Frame %d, Subframe %d: Adding UL CONFIG.Request for UE %d/%x, ulsch_frame %d, ulsch_subframe %d\n", + harq_pid, frameP, subframeP, UE_id, rnti, + sched_frame, sched_subframeP); + + // Add UL_config PDUs + fill_nfapi_ulsch_config_request_rel8(&ul_req_tmp_body->ul_config_pdu_list[ul_req_tmp_body->number_of_pdus], cqi_req, cc, UE_template->physicalConfigDedicated, get_tmode(module_idP, CC_id, UE_id), mac->ul_handle, rnti, first_rb[CC_id], // resource_block_start + rb_table[rb_table_index], // number_of_resource_blocks + UE_template->mcs_UL[harq_pid], cshift, // cyclic_shift_2_for_drms + 0, // frequency_hopping_enabled_flag + 0, // frequency_hopping_bits + ndi, // new_data_indication + 0, // redundancy_version + harq_pid, // harq_process_number + 0, // ul_tx_mode + 0, // current_tx_nb + 0, // n_srs + get_TBS_UL + (UE_template-> + mcs_UL[harq_pid], + rb_table + [rb_table_index])); +#ifdef Rel14 + if (UE_template->rach_resource_type > 0) { // This is a BL/CE UE allocation + fill_nfapi_ulsch_config_request_emtc(&ul_req_tmp_body->ul_config_pdu_list[ul_req_tmp_body->number_of_pdus], UE_template->rach_resource_type > 2 ? 2 : 1, 1, //total_number_of_repetitions + 1, //repetition_number + (frameP * + 10) + + subframeP); + } #endif - - } - else { - T(T_ENB_MAC_UE_UL_SCHEDULE_RETRANSMISSION, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), - T_INT(subframeP), T_INT(harq_pid), T_INT(mcs), T_INT(first_rb[CC_id]), T_INT(rb_table[rb_table_index]), - T_INT(round)); + ul_req_tmp->header.message_id = NFAPI_UL_CONFIG_REQUEST; + ul_req_tmp_body->number_of_pdus++; + ul_req_tmp_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + mac->ul_handle++; - LOG_D(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled (PHICH) UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d,round %d)\n", - module_idP,harq_pid,rnti,CC_id,frameP,subframeP,UE_id,mcs, - first_rb[CC_id],rb_table[rb_table_index], - rb_table_index,TBS,harq_pid,round); - }/* - else if (round > 0) { //we schedule a retransmission + uint16_t ul_sched_frame = sched_frame; + uint16_t ul_sched_subframeP = sched_subframeP; - ndi = UE_template->oldNDI_UL[harq_pid]; + add_subframe(&ul_sched_frame, &ul_sched_subframeP, 2); + ul_req_tmp->sfn_sf = ul_sched_frame<<4|ul_sched_subframeP; - if ((round&3)==0) { - mcs = openair_daq_vars.target_ue_ul_mcs; - } else { - mcs = rvidx_tab[round&3] + 28; //not correct for round==4! + add_ue_ulsch_info(module_idP, + CC_id, UE_id, subframeP, + S_UL_SCHEDULED); - } + //LOG_D(MAC, "[eNB %d] CC_id %d Frame %d, subframeP %d: Generated ULSCH DCI for next UE_id %d, format 0\n", module_idP, CC_id, frameP, subframeP, UE_id); + LOG_D(MAC,"[PUSCH %d] SFN/SF:%04d%d UL_CFG:SFN/SF:%04d%d CQI:%d for UE %d/%x\n", harq_pid,frameP,subframeP,ul_sched_frame,ul_sched_subframeP,cqi_req,UE_id,rnti); - LOG_I(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE retransmission (mcs %d, first rb %d, nb_rb %d, harq_pid %d, round %d)\n", - module_idP,UE_id,rnti,CC_id,frameP,subframeP,mcs, - first_rb[CC_id],UE_template->nb_rb_ul[harq_pid], - harq_pid, round); + // increment first rb for next UE allocation + first_rb[CC_id] += rb_table[rb_table_index]; + } else { // round > 0 => retransmission + T(T_ENB_MAC_UE_UL_SCHEDULE_RETRANSMISSION, + T_INT(module_idP), T_INT(CC_id), T_INT(rnti), + T_INT(frameP), T_INT(subframeP), T_INT(harq_pid), + T_INT(UE_template->mcs_UL[harq_pid]), + T_INT(first_rb[CC_id]), + T_INT(rb_table[rb_table_index]), T_INT(round)); - rballoc = mac_xface->computeRIV(frame_parms->N_RB_UL, - first_rb[CC_id], - UE_template->nb_rb_ul[harq_pid]); - first_rb[CC_id]+=UE_template->nb_rb_ul[harq_pid]; // increment for next UE allocation - - UE_list->eNB_UE_stats[CC_id][UE_id].num_retransmission_rx+=1; - UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used_retx_rx=UE_template->nb_rb_ul[harq_pid]; - UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_rx+=UE_template->nb_rb_ul[harq_pid]; - UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=mcs; - UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2=mcs; - } - */ + // fill in NAK information - } // UE_is_to_be_scheduled - } // UE is in PUSCH - } // loop over UE_id - } // loop of CC_id -} + hi_dci0_pdu = &hi_dci0_req_body->hi_dci0_pdu_list[hi_dci0_req_body->number_of_dci + hi_dci0_req_body->number_of_hi]; + memset((void *) hi_dci0_pdu, 0, + sizeof(nfapi_hi_dci0_request_pdu_t)); + hi_dci0_pdu->pdu_type = NFAPI_HI_DCI0_HI_PDU_TYPE; + hi_dci0_pdu->pdu_size = + 2 + sizeof(nfapi_hi_dci0_hi_pdu); + hi_dci0_pdu->hi_pdu.hi_pdu_rel8.tl.tag = NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG; + hi_dci0_pdu->hi_pdu.hi_pdu_rel8.resource_block_start = + UE_template->first_rb_ul[harq_pid]; + hi_dci0_pdu->hi_pdu.hi_pdu_rel8. + cyclic_shift_2_for_drms = + UE_template->cshift[harq_pid]; + hi_dci0_pdu->hi_pdu.hi_pdu_rel8.hi_value = 0; + hi_dci0_req_body->number_of_hi++; + hi_dci0_req_body->sfnsf = sfnsf_add_subframe(sched_frame, sched_subframeP, 0); + hi_dci0_req->sfn_sf = frameP<<4|subframeP; + hi_dci0_req->header.message_id = NFAPI_HI_DCI0_REQUEST; -#ifdef CBA -void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_flag, frame_t frameP, sub_frame_t subframeP, unsigned char sched_subframe, uint16_t *first_rb) -{ - - eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP]; - UE_list_t *UE_list=&eNB->UE_list; - //UE_TEMPLATE *UE_template; - void *ULSCH_dci = NULL; - DCI_PDU *DCI_pdu; - uint8_t CC_id=0; - uint8_t rb_table_index=0, aggregation=2; - uint32_t rballoc; - uint8_t cba_group, cba_resources; - uint8_t required_rbs[NUM_MAX_CBA_GROUP]; - int8_t num_cba_resources[NUM_MAX_CBA_GROUP];// , weight[NUM_MAX_CBA_GROUP] - // the following vars should become a vector [MAX_NUM_CCs] - LTE_DL_FRAME_PARMS *frame_parms; - int8_t available_rbs=0; - uint8_t remaining_rbs=0; - uint8_t allocated_rbs=0; - uint8_t total_UEs=UE_list->num_UEs; - uint8_t active_UEs[NUM_MAX_CBA_GROUP]; - uint8_t total_groups=eNB_mac_inst[module_idP].common_channels[CC_id].num_active_cba_groups; - int min_rb_unit=2; - uint8_t cba_policy=CBA_ES; - int UE_id; - uint8_t mcs[NUM_MAX_CBA_GROUP]; - uint32_t total_cba_resources=0; - uint32_t total_rbs=0; - // We compute the weight of each group and initialize some variables - - // loop over all active UEs - // for (UE_id=UE_list->head_ul;UE_id>=0;UE_id=UE_list->next_ul[UE_id]) { - - for (cba_group=0; cba_groupget_lte_frame_parms(module_idP,CC_id); - available_rbs=frame_parms->N_RB_DL-1-first_rb[CC_id]; - remaining_rbs=available_rbs; - total_groups=eNB_mac_inst[module_idP].common_channels[CC_id].num_active_cba_groups; - min_rb_unit=get_min_rb_unit(module_idP,CC_id); - - if (available_rbs < min_rb_unit ) - continue; - - // remove this condition later - // cba group template uses the exisitng UE template, and thus if a UE - // is scheduled, the correspodning group can't be used for CBA - // this can be fixed later - if (total_groups > 0) { - DCI_pdu = &eNB_mac_inst[module_idP].common_channels[CC_id].DCI_pdu; - - for (cba_group=0; - (cba_group (1<head_ul; UE_id>=0; UE_id=UE_list->next_ul[UE_id]) { - if (UE_RNTI(module_idP,UE_id)==NOT_A_RNTI) - continue; - - // simple UE identity based grouping - if ((UE_id % total_groups) == cba_group) { // this could be simplifed to active_UEs[UE_id % total_groups]++; - if ((mac_eNB_get_rrc_status(module_idP,rnti) > RRC_CONNECTED) && - (UE_is_to_be_scheduled(module_idP,CC_id,UE_id) == 0)) { - active_UEs[cba_group]++; - } - } - - if (UE_list->UE_template[CC_id][UE_id].pre_assigned_mcs_ul <= 2) { - mcs[cba_group]= 8; // apply fixed scheduling - } else if ((UE_id % total_groups) == cba_group) { - mcs[cba_group]= cmin(mcs[cba_group],UE_list->UE_template[CC_id][UE_id].pre_assigned_mcs_ul); - } - } - - mcs[cba_group]= cmin(mcs[cba_group],openair_daq_vars.target_ue_ul_mcs); - - if (available_rbs < min_rb_unit ) - break; - - // If the group needs some resource - // determine the total number of allocations (one or multiple DCIs): to be refined - if ((active_UEs[cba_group] > 0) && (eNB_mac_inst[module_idP].common_channels[CC_id].cba_rnti[cba_group] != 0)) { - // to be refined in case of : total_UEs >> weight[cba_group]*available_rbs - - switch(cba_policy) { - case CBA_ES: - required_rbs[cba_group] = (uint8_t)floor(available_rbs/total_groups); // allocate equally among groups - num_cba_resources[cba_group]=1; - break; - - // can't have more than one allocation for the same group/UE - /* case CBA_ES_S: - required_rbs[cba_group] = (uint8_t)floor(available_rbs/total_groups); // allocate equally among groups - if (required_rbs[cba_group] > min_rb_unit) - num_cba_resources[cba_group]=(uint8_t)(required_rbs[cba_group]/ min_rb_unit); - break;*/ - case CBA_PF: - required_rbs[cba_group] = (uint8_t)floor((active_UEs[cba_group]*available_rbs)/total_UEs); - num_cba_resources[cba_group]=1; - break; - /* case CBA_PF_S: - required_rbs[cba_group] = (uint8_t)ceil((active_UEs[cba_group]*available_rbs)/total_UEs); - if (required_rbs[cba_group] > min_rb_unit) - num_cba_resources[cba_group]=(uint8_t) floor(required_rbs[cba_group] / min_rb_unit); - break;*/ - - default: - LOG_W(MAC,"unknown CBA policy\n"); - break; - } - - total_cba_resources+=num_cba_resources[cba_group]; - total_rbs+=required_rbs[cba_group]; - - /* while ((remaining_rbs < required_rbs[cba_group]) && - (required_rbs[cba_group] > 0) && - (required_rbs[cba_group] < min_rb_unit )) - required_rbs[cba_group]--; - */ - - /* - while (rb_table[rb_table_index] < required_rbs[cba_group]) - rb_table_index++; - - while (rb_table[rb_table_index] > remaining_rbs ) - rb_table_index--; - - remaining_rbs-=rb_table[rb_table_index]; - required_rbs[cba_group]=rb_table[rb_table_index]; - */ - // num_cba_resources[cba_group]=1; - - } - } - - // phase 2 reduce the number of cba allocations among the groups - cba_group=0; - - if (total_cba_resources <= 0) { - return; - } - - // increase rb if any left: to be done - cba_group=0; - - while (total_rbs < available_rbs - 1 ) { - required_rbs[cba_group%total_groups]++; - total_rbs++; - cba_group++; - } - - // phase 3: - for (cba_group=0; cba_group remaining_rbs ) { - rb_table_index--; - } - - remaining_rbs-=rb_table[rb_table_index]; - allocated_rbs=rb_table[rb_table_index]; - - rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL, - first_rb[CC_id], - rb_table[rb_table_index]); - - first_rb[CC_id]+=rb_table[rb_table_index]; - LOG_N(MAC, - "[eNB %d] CC_id %d Frame %d, subframeP %d: schedule CBA access %d rnti %x, total/required/allocated/remaining rbs (%d/%d/%d/%d), mcs %d, rballoc %d\n", - module_idP, CC_id, frameP, subframeP, cba_group,eNB_mac_inst[module_idP].common_channels[CC_id].cba_rnti[cba_group], - available_rbs, required_rbs[cba_group], allocated_rbs, remaining_rbs, - mcs[cba_group],rballoc); - - switch (frame_parms->N_RB_UL) { - case 6: - mac_xface->macphy_exit("[MAC][eNB] CBA RB=6 not supported \n"); - break; - - case 25: - if (frame_parms->frame_type == TDD) { - ULSCH_dci = UE_list->UE_template[CC_id][cba_group].ULSCH_DCI[0]; - - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs[cba_group]; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->ndi = 1; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1;//tpc; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cba_group; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_list->UE_template[CC_id][cba_group].DAI_ul[sched_subframe]; - ((DCI0_5MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = 1; - - //add_ue_spec_dci - add_common_dci(DCI_pdu, - ULSCH_dci, - eNB_mac_inst[module_idP].common_channels[CC_id].cba_rnti[cba_group], - sizeof(DCI0_5MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_5MHz_TDD_1_6_t, - format0, - 0); - } else { - ULSCH_dci = UE_list->UE_template[CC_id][cba_group].ULSCH_DCI[0]; - - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->type = 0; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->hopping = 0; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->mcs = mcs[cba_group]; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->ndi = 1; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->TPC = 1;//tpc; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->cshift = cba_group; - ((DCI0_5MHz_FDD_t *)ULSCH_dci)->cqi_req = 1; - - //add_ue_spec_dci - add_common_dci(DCI_pdu, - ULSCH_dci, - eNB_mac_inst[module_idP].common_channels[CC_id].cba_rnti[cba_group], - sizeof(DCI0_5MHz_FDD_t), - aggregation, - sizeof_DCI0_5MHz_FDD_t, - format0, - 0); - } - - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframeP %d: Generated ULSCH DCI for CBA group %d, RB 25 format 0\n", module_idP,CC_id,frameP,subframeP,cba_group); - break; - - case 50: - if (frame_parms->frame_type == TDD) { - ULSCH_dci = UE_list->UE_template[CC_id][cba_group].ULSCH_DCI[0]; - - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->type = 0; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->hopping = 0; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->mcs = mcs[cba_group]; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->ndi = 1; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->TPC = 1;//tpc; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cshift = cba_group; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->dai = UE_list->UE_template[CC_id][cba_group].DAI_ul[sched_subframe]; - ((DCI0_10MHz_TDD_1_6_t *)ULSCH_dci)->cqi_req = 1; - - //add_ue_spec_dci - add_common_dci(DCI_pdu, - ULSCH_dci, - eNB_mac_inst[module_idP].common_channels[CC_id].cba_rnti[cba_group], - sizeof(DCI0_10MHz_TDD_1_6_t), - aggregation, - sizeof_DCI0_10MHz_TDD_1_6_t, - format0, - 0); - } else { - ULSCH_dci = UE_list->UE_template[CC_id][cba_group].ULSCH_DCI[0]; - - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->type = 0; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->hopping = 0; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->rballoc = rballoc; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->mcs = mcs[cba_group]; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->ndi = 1; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->TPC = 1;//tpc; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->cshift = cba_group; - ((DCI0_10MHz_FDD_t *)ULSCH_dci)->cqi_req = 1; - - //add_ue_spec_dci - add_common_dci(DCI_pdu, - ULSCH_dci, - eNB_mac_inst[module_idP].common_channels[CC_id].cba_rnti[cba_group], - sizeof(DCI0_10MHz_FDD_t), - aggregation, - sizeof_DCI0_10MHz_FDD_t, - format0, - 0); - } - - LOG_D(MAC,"[eNB %d] CC_id %d Frame %d, subframeP %d: Generated ULSCH DCI for CBA group %d, RB 50 format 0\n", module_idP,CC_id,frameP,subframeP,cba_group); - break; - - case 100: - mac_xface->macphy_exit("[MAC][eNB] CBA RB=100 not supported \n"); - break; - - default: - break; - } - - // break;// for the moment only schedule one - } - } - } - } -} + LOG_D(MAC, + "[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled (PHICH) UE %d (mcs %d, first rb %d, nb_rb %d, TBS %d, round %d)\n", + module_idP, harq_pid, rnti, CC_id, frameP, + subframeP, UE_id, UE_template->mcs_UL[harq_pid], + UE_template->first_rb_ul[harq_pid], + UE_template->nb_rb_ul[harq_pid], + UE_template->TBS_UL[harq_pid], round); + // Add UL_config PDUs + LOG_D(MAC, + "[PUSCH %d] Frame %d, Subframe %d: Adding UL CONFIG.Request for UE %d/%x, ulsch_frame %d, ulsch_subframe %d\n", + harq_pid, frameP, subframeP, UE_id, rnti, + sched_frame, sched_subframeP); + fill_nfapi_ulsch_config_request_rel8(&ul_req_tmp_body->ul_config_pdu_list[ul_req_tmp_body->number_of_pdus], cqi_req, cc, UE_template->physicalConfigDedicated, get_tmode(module_idP, CC_id, UE_id), mac->ul_handle, rnti, UE_template->first_rb_ul[harq_pid], // resource_block_start + UE_template->nb_rb_ul[harq_pid], // number_of_resource_blocks + UE_template->mcs_UL[harq_pid], cshift, // cyclic_shift_2_for_drms + 0, // frequency_hopping_enabled_flag + 0, // frequency_hopping_bits + UE_template->oldNDI_UL[harq_pid], // new_data_indication + rvidx_tab[round & 3], // redundancy_version + harq_pid, // harq_process_number + 0, // ul_tx_mode + 0, // current_tx_nb + 0, // n_srs + UE_template-> + TBS_UL[harq_pid]); +#ifdef Rel14 + if (UE_template->rach_resource_type > 0) { // This is a BL/CE UE allocation + fill_nfapi_ulsch_config_request_emtc(&ul_req_tmp_body->ul_config_pdu_list[ul_req_tmp_body->number_of_pdus], UE_template->rach_resource_type > 2 ? 2 : 1, 1, //total_number_of_repetitions + 1, //repetition_number + (frameP * + 10) + + subframeP); + } #endif + ul_req_tmp_body->number_of_pdus++; + mac->ul_handle++; + + ul_req_tmp_body->tl.tag = NFAPI_UL_CONFIG_REQUEST_BODY_TAG; + + ul_req_tmp->sfn_sf = sched_frame<<4|sched_subframeP; + ul_req_tmp->header.message_id = NFAPI_UL_CONFIG_REQUEST; + + LOG_D(MAC,"[PUSCH %d] Frame %d, Subframe %d: Adding UL CONFIG.Request for UE %d/%x, ulsch_frame %d, ulsch_subframe %d cqi_req %d\n", + harq_pid,frameP,subframeP,UE_id,rnti,sched_frame,sched_subframeP,cqi_req); + } /* + else if (round > 0) { //we schedule a retransmission + + ndi = UE_template->oldNDI_UL[harq_pid]; + + if ((round&3)==0) { + mcs = openair_daq_vars.target_ue_ul_mcs; + } else { + mcs = rvidx_tab[round&3] + 28; //not correct for round==4! + + } + + LOG_I(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE retransmission (mcs %d, first rb %d, nb_rb %d, harq_pid %d, round %d)\n", + module_idP,UE_id,rnti,CC_id,frameP,subframeP,mcs, + first_rb[CC_id],UE_template->nb_rb_ul[harq_pid], + harq_pid, round); + + rballoc = mac_xface->computeRIV(frame_parms->N_RB_UL, + first_rb[CC_id], + UE_template->nb_rb_ul[harq_pid]); + first_rb[CC_id]+=UE_template->nb_rb_ul[harq_pid]; // increment for next UE allocation + + UE_list->eNB_UE_stats[CC_id][UE_id].num_retransmission_rx+=1; + UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used_retx_rx=UE_template->nb_rb_ul[harq_pid]; + UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_rx+=UE_template->nb_rb_ul[harq_pid]; + UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=mcs; + UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2=mcs; + } + */ + + } // UE_is_to_be_scheduled + } // loop over UE_id + } // loop of CC_id +} diff --git a/openair2/LAYER2/MAC/extern.h b/openair2/LAYER2/MAC/extern.h index ca847acf4c..e7489ca8e6 100644 --- a/openair2/LAYER2/MAC/extern.h +++ b/openair2/LAYER2/MAC/extern.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file extern.h * \brief mac externs * \author Navid Nikaein and Raymond Knopp @@ -39,38 +32,32 @@ #ifndef __MAC_EXTERN_H__ #define __MAC_EXTERN_H__ - -#ifdef USER_MODE -//#include "stdio.h" -#endif //USER_MODE #include "PHY/defs.h" #include "defs.h" -#include "COMMON/mac_rrc_primitives.h" -#ifdef PHY_EMUL -//#include "SIMULATION/simulation_defs.h" -#endif //PHY_EMUL -#include "PHY_INTERFACE/defs.h" + +#include "RRC/LITE/defs.h" extern const uint32_t BSR_TABLE[BSR_TABLE_SIZE]; //extern uint32_t EBSR_Level[63]; +extern const uint32_t Extended_BSR_TABLE[BSR_TABLE_SIZE]; +//extern uint32_t Extended_BSR_TABLE[63]; ----currently not used +extern const uint8_t cqi2fmt0_agg[MAX_SUPPORTED_BW][CQI_VALUE_RANGE]; + +extern const uint8_t cqi2fmt1x_agg[MAX_SUPPORTED_BW][CQI_VALUE_RANGE]; + +extern const uint8_t cqi2fmt2x_agg[MAX_SUPPORTED_BW][CQI_VALUE_RANGE]; + +extern UE_RRC_INST *UE_rrc_inst; extern UE_MAC_INST *UE_mac_inst; -extern eNB_MAC_INST *eNB_mac_inst; -extern MAC_RLC_XFACE *Mac_rlc_xface; -extern uint8_t Is_rrc_registered; -extern eNB_ULSCH_INFO eNB_ulsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][NUMBER_OF_UE_MAX]; // eNBxUE = 8x8 -extern eNB_DLSCH_INFO eNB_dlsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][NUMBER_OF_UE_MAX]; // eNBxUE = 8x8 + +extern eNB_ULSCH_INFO eNB_ulsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][NUMBER_OF_UE_MAX]; // eNBxUE = 8x8 +extern eNB_DLSCH_INFO eNB_dlsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][NUMBER_OF_UE_MAX]; // eNBxUE = 8x8 -//#ifndef USER_MODE -extern MAC_xface *mac_xface; -extern RRC_XFACE *Rrc_xface; -extern uint8_t Is_rrc_registered; - -#ifndef PHY_EMUL #ifndef PHYSIM #define NB_INST 1 #else @@ -80,40 +67,34 @@ extern unsigned char NB_eNB_INST; extern unsigned char NB_UE_INST; extern unsigned char NB_RN_INST; extern unsigned short NODE_ID[1]; -extern void* bigphys_malloc(int); -#else -extern EMULATION_VARS *Emul_vars; -#endif //PHY_EMUL extern int cqi_to_mcs[16]; extern uint32_t RRC_CONNECTION_FLAG; -extern uint8_t rb_table[33]; +extern uint8_t rb_table[34]; -extern DCI0_5MHz_TDD_1_6_t UL_alloc_pdu; +extern DCI0_5MHz_TDD_1_6_t UL_alloc_pdu; -extern DCI1A_5MHz_TDD_1_6_t RA_alloc_pdu; -extern DCI1A_5MHz_TDD_1_6_t DLSCH_alloc_pdu1A; -extern DCI1A_5MHz_TDD_1_6_t BCCH_alloc_pdu; +extern DCI1A_5MHz_TDD_1_6_t RA_alloc_pdu; +extern DCI1A_5MHz_TDD_1_6_t DLSCH_alloc_pdu1A; +extern DCI1A_5MHz_TDD_1_6_t BCCH_alloc_pdu; -extern DCI1A_5MHz_TDD_1_6_t CCCH_alloc_pdu; -extern DCI1_5MHz_TDD_t DLSCH_alloc_pdu; +extern DCI1A_5MHz_TDD_1_6_t CCCH_alloc_pdu; +extern DCI1_5MHz_TDD_t DLSCH_alloc_pdu; -extern DCI0_5MHz_FDD_t UL_alloc_pdu_fdd; +extern DCI0_5MHz_FDD_t UL_alloc_pdu_fdd; -extern DCI1A_5MHz_FDD_t DLSCH_alloc_pdu1A_fdd; -extern DCI1A_5MHz_FDD_t RA_alloc_pdu_fdd; -extern DCI1A_5MHz_FDD_t BCCH_alloc_pdu_fdd; +extern DCI1A_5MHz_FDD_t DLSCH_alloc_pdu1A_fdd; +extern DCI1A_5MHz_FDD_t RA_alloc_pdu_fdd; +extern DCI1A_5MHz_FDD_t BCCH_alloc_pdu_fdd; -extern DCI1A_5MHz_FDD_t CCCH_alloc_pdu_fdd; -extern DCI1_5MHz_FDD_t DLSCH_alloc_pdu_fdd; +extern DCI1A_5MHz_FDD_t CCCH_alloc_pdu_fdd; +extern DCI1_5MHz_FDD_t DLSCH_alloc_pdu_fdd; extern DCI2_5MHz_2A_TDD_t DLSCH_alloc_pdu1; extern DCI2_5MHz_2A_TDD_t DLSCH_alloc_pdu2; extern DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu1E; #endif //DEF_H - - diff --git a/openair2/LAYER2/MAC/flexran_agent_mac_proto.h b/openair2/LAYER2/MAC/flexran_agent_mac_proto.h new file mode 100644 index 0000000000..d3170aaf91 --- /dev/null +++ b/openair2/LAYER2/MAC/flexran_agent_mac_proto.h @@ -0,0 +1,216 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_mac_proto.h + * \brief MAC functions for FlexRAN agent + * \author Xenofon Foukas and Navid Nikaein + * \date 2016 + * \email: x.foukas@sms.ed.ac.uk + * \version 0.1 + * @ingroup _mac + + */ + +#ifndef __LAYER2_MAC_FLEXRAN_AGENT_MAC_PROTO_H__ +#define __LAYER2_MAC_FLEXRAN_AGENT_MAC_PROTO_H__ + +#include "flexran_agent_defs.h" +#include "header.pb-c.h" +#include "flexran.pb-c.h" + +/* + * slice specific scheduler + */ +typedef void (*slice_scheduler) (module_id_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info); + + + +/* + * top level flexran scheduler used by the eNB scheduler + */ +void flexran_schedule_ue_spec_default(mid_t mod_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info); +/* + * slice specific scheduler for embb + */ +void +flexran_schedule_ue_spec_embb(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info); +/* + * slice specific scheduler for urllc + */ +void +flexran_schedule_ue_spec_urllc(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info); + +/* + * slice specific scheduler for mmtc + */ +void +flexran_schedule_ue_spec_mmtc(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info); +/* + * slice specific scheduler for best effort traffic + */ +void +flexran_schedule_ue_spec_be(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info); + +/* + * common flexran scheduler function + */ +void +flexran_schedule_ue_spec_common(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info); + +uint16_t flexran_nb_rbs_allowed_slice(float rb_percentage, int total_rbs); + +int flexran_slice_member(int UE_id, int slice_id); + +int flexran_slice_maxmcs(int slice_id); + +void _store_dlsch_buffer(module_id_t Mod_id, + int slice_id, + frame_t frameP, sub_frame_t subframeP); + + +void _assign_rbs_required(module_id_t Mod_id, + int slice_id, + frame_t frameP, + sub_frame_t subframe, + uint16_t + nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t + nb_rbs_allowed_slice[MAX_NUM_CCs] + [MAX_NUM_SLICES], int min_rb_unit[MAX_NUM_CCs]); + +void _dlsch_scheduler_pre_processor(module_id_t Mod_id, + int slice_id, + frame_t frameP, + sub_frame_t subframeP, + int N_RBG[MAX_NUM_CCs], + int *mbsfn_flag); + +void _dlsch_scheduler_pre_processor_reset(int module_idP, + int UE_id, + uint8_t CC_id, + int frameP, + int subframeP, + int N_RBG, + uint16_t + nb_rbs_required[MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], + uint16_t + nb_rbs_required_remaining + [MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t + nb_rbs_allowed_slice[MAX_NUM_CCs] + [MAX_NUM_SLICES], + unsigned char + rballoc_sub[MAX_NUM_CCs] + [N_RBG_MAX], + unsigned char + MIMO_mode_indicator[MAX_NUM_CCs] + [N_RBG_MAX]); + +void _dlsch_scheduler_pre_processor_allocate(module_id_t Mod_id, + int UE_id, + uint8_t CC_id, + int N_RBG, + int transmission_mode, + int min_rb_unit, + uint8_t N_RB_DL, + uint16_t + nb_rbs_required[MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], + uint16_t + nb_rbs_required_remaining + [MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], + unsigned char + rballoc_sub[MAX_NUM_CCs] + [N_RBG_MAX], + unsigned char + MIMO_mode_indicator + [MAX_NUM_CCs][N_RBG_MAX]); + +/* + * Default scheduler used by the eNB agent + */ +void flexran_schedule_ue_spec_default(mid_t mod_id, uint32_t frame, + uint32_t subframe, int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info); + +/* + * Data plane function for applying the DL decisions of the scheduler + */ +void flexran_apply_dl_scheduling_decisions(mid_t mod_id, uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage * + dl_scheduling_info); + +/* + * Data plane function for applying the UE specific DL decisions of the scheduler + */ +void flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + uint32_t n_dl_ue_data, + Protocol__FlexDlData ** + dl_ue_data); + +/* + * Data plane function for filling the DCI structure + */ +void flexran_fill_oai_dci(mid_t mod_id, uint32_t CC_id, uint32_t rnti, + Protocol__FlexDlDci * dl_dci); + +#endif diff --git a/openair2/LAYER2/MAC/flexran_agent_scheduler_dataplane.c b/openair2/LAYER2/MAC/flexran_agent_scheduler_dataplane.c new file mode 100644 index 0000000000..44052a8749 --- /dev/null +++ b/openair2/LAYER2/MAC/flexran_agent_scheduler_dataplane.c @@ -0,0 +1,588 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_scheduler_dataplane.c + * \brief data plane procedures related to eNB scheduling + * \author Xenofon Foukas + * \date 2016 + * \email: x.foukas@sms.ed.ac.uk + * \version 0.1 + * @ingroup _mac + + */ + +#include "assertions.h" +#include "PHY/defs.h" +#include "PHY/extern.h" + +#include "SCHED/defs.h" +#include "SCHED/extern.h" + +#include "LAYER2/MAC/flexran_agent_mac_proto.h" +#include "LAYER2/MAC/defs.h" +#include "LAYER2/MAC/proto.h" +#include "LAYER2/MAC/extern.h" +#include "LAYER2/MAC/flexran_dci_conversions.h" + +#include "UTIL/LOG/log.h" +#include "UTIL/LOG/vcd_signal_dumper.h" +#include "UTIL/OPT/opt.h" +#include "OCG.h" +#include "OCG_extern.h" + +#include "RRC/LITE/extern.h" +#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" + +#include "header.pb-c.h" +#include "flexran.pb-c.h" +#include "flexran_agent_extern.h" + +#include "flexran_agent_common.h" + +#include "SIMULATION/TOOLS/defs.h" // for taus + +void +flexran_apply_dl_scheduling_decisions(mid_t mod_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage * + dl_scheduling_info) +{ + + Protocol__FlexDlMacConfig *mac_config = + dl_scheduling_info->dl_mac_config_msg; + + // Check if there is anything to schedule for random access + if (mac_config->n_dl_rar > 0) { + /*TODO: call the random access data plane function */ + } + // Check if there is anything to schedule for paging/broadcast + if (mac_config->n_dl_broadcast > 0) { + /*TODO: call the broadcast/paging data plane function */ + } + // Check if there is anything to schedule for the UEs + if (mac_config->n_dl_ue_data > 0) { + flexran_apply_ue_spec_scheduling_decisions(mod_id, frame, subframe, + mbsfn_flag, + mac_config-> + n_dl_ue_data, + mac_config->dl_ue_data); + } + +} + + +void +flexran_apply_ue_spec_scheduling_decisions(mid_t mod_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + uint32_t n_dl_ue_data, + Protocol__FlexDlData ** + dl_ue_data) +{ + + uint8_t CC_id; + int UE_id; + mac_rlc_status_resp_t rlc_status; + unsigned char ta_len = 0; + unsigned char header_len = 0, header_len_tmp = 0; + unsigned char sdu_lcids[11], offset, num_sdus = 0; + uint16_t nb_rb; + uint16_t TBS, sdu_lengths[11], rnti, padding = 0, post_padding = 0; + unsigned char dlsch_buffer[MAX_DLSCH_PAYLOAD_BYTES]; + uint8_t round = 0; + uint8_t harq_pid = 0; + // LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + uint16_t sdu_length_total = 0; + short ta_update = 0; + eNB_MAC_INST *eNB = &eNB_mac_inst[mod_id]; + UE_list_t *UE_list = &eNB->UE_list; + // static int32_t tpc_accumulated=0; + UE_sched_ctrl *ue_sched_ctl; + + int last_sdu_header_len = 0; + + int i, j; + + Protocol__FlexDlData *dl_data; + Protocol__FlexDlDci *dl_dci; + + uint32_t rlc_size, n_lc, lcid; + + // For each UE-related command + for (i = 0; i < n_dl_ue_data; i++) { + + dl_data = dl_ue_data[i]; + dl_dci = dl_data->dl_dci; + + CC_id = dl_data->serv_cell_index; + // frame_parms[CC_id] = mac_xface->get_lte_frame_parms(mod_id, CC_id); + + rnti = dl_data->rnti; + UE_id = find_ue(rnti, PHY_vars_eNB_g[mod_id][CC_id]); + + ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + eNB_UE_stats = mac_xface->get_eNB_UE_stats(mod_id, CC_id, rnti); + + round = dl_dci->rv[0]; + harq_pid = dl_dci->harq_process; + + //LOG_I(FLEXRAN_AGENT, "[Frame %d][Subframe %d] Scheduling harq %d\n", frame, subframe, harq_pid); + // LOG_I(FLEXRAN_AGENT, "[Frame %d][Subframe %d]Now scheduling harq_pid %d (round %d)\n", frame, subframe, harq_pid, round); + + // If this is a new transmission + if (round == 0) { + // First we have to deal with the creation of the PDU based on the message instructions + rlc_status.bytes_in_buffer = 0; + + TBS = dl_dci->tbs_size[0]; + + if (dl_data->n_ce_bitmap > 0) { + //Check if there is TA command and set the length appropriately + ta_len = + (dl_data-> + ce_bitmap[0] & PROTOCOL__FLEX_CE_TYPE__FLPCET_TA) ? 2 + : 0; + } + + num_sdus = 0; + sdu_length_total = 0; + + n_lc = dl_data->n_rlc_pdu; + // Go through each one of the channel commands and create SDUs + header_len = 0; + last_sdu_header_len = 0; + for (j = 0; j < n_lc; j++) { + sdu_lengths[j] = 0; + lcid = + dl_data->rlc_pdu[j]->rlc_pdu_tb[0]->logical_channel_id; + rlc_size = dl_data->rlc_pdu[j]->rlc_pdu_tb[0]->size; + LOG_D(MAC, + "[TEST] [eNB %d] [Frame %d] [Subframe %d], LCID %d, CC_id %d, Requesting %d bytes from RLC (RRC message)\n", + mod_id, frame, subframe, lcid, CC_id, rlc_size); + if (rlc_size > 0) { + + rlc_status = mac_rlc_status_ind(mod_id, + rnti, + mod_id, + frame, + subframe, + ENB_FLAG_YES, + MBMS_FLAG_NO, lcid, 0); + + if (rlc_status.bytes_in_buffer > 0) { + + if (rlc_status.bytes_in_buffer < rlc_size) { + rlc_size = rlc_status.bytes_in_buffer; + } + + if (rlc_size <= 2) { + rlc_size = 3; + } + + rlc_status = mac_rlc_status_ind(mod_id, rnti, mod_id, frame, subframe, ENB_FLAG_YES, MBMS_FLAG_NO, lcid, rlc_size); // transport block set size + + LOG_D(MAC, + "[TEST] RLC can give %d bytes for LCID %d during second call\n", + rlc_status.bytes_in_buffer, lcid); + + if (rlc_status.bytes_in_buffer > 0) { + + sdu_lengths[j] = mac_rlc_data_req(mod_id, rnti, mod_id, frame, ENB_FLAG_YES, MBMS_FLAG_NO, lcid, rlc_size, //not used + (char *) + &dlsch_buffer + [sdu_length_total]); + + LOG_D(MAC, + "[eNB %d][LCID %d] CC_id %d Got %d bytes from RLC\n", + mod_id, lcid, CC_id, sdu_lengths[j]); + sdu_length_total += sdu_lengths[j]; + sdu_lcids[j] = lcid; + + UE_list-> + eNB_UE_stats[CC_id][UE_id].num_pdu_tx[lcid] + += 1; + UE_list-> + eNB_UE_stats[CC_id][UE_id].num_bytes_tx + [lcid] += sdu_lengths[j]; + + if (sdu_lengths[j] < 128) { + header_len += 2; + last_sdu_header_len = 2; + } else { + header_len += 3; + last_sdu_header_len = 3; + } + num_sdus++; + } + } + } + } // SDU creation end + + + if (((sdu_length_total + header_len + ta_len) > 0)) { + + header_len_tmp = header_len; + + // If we have only a single SDU, header length becomes 1 + if ((num_sdus) == 1) { + //if (header_len == 2 || header_len == 3) { + header_len = 1; + } else { + header_len = (header_len - last_sdu_header_len) + 1; + } + + // If we need a 1 or 2 bit padding or no padding at all + if ((TBS - header_len - sdu_length_total - ta_len) <= 2 || (TBS - header_len - sdu_length_total - ta_len) > TBS) { //protect from overflow + padding = + (TBS - header_len - sdu_length_total - ta_len); + post_padding = 0; + } else { // The last sdu needs to have a length field, since we add padding + padding = 0; + header_len = header_len_tmp; + post_padding = TBS - sdu_length_total - header_len - ta_len; // 1 is for the postpadding header + } + + if (ta_len > 0) { + // Reset the measurement + ta_update = flexran_get_TA(mod_id, UE_id, CC_id); + ue_sched_ctl->ta_timer = 20; + eNB_UE_stats->timing_advance_update = 0; + } else { + ta_update = 0; + } + + // If there is nothing to schedule, just leave + if ((sdu_length_total) <= 0) { + harq_pid_updated[UE_id][harq_pid] = 1; + harq_pid_round[UE_id][harq_pid] = 0; + continue; + } + // LOG_I(FLEXRAN_AGENT, "[Frame %d][Subframe %d] TBS is %d and bytes are %d\n", frame, subframe, TBS, sdu_length_total); + + offset = generate_dlsch_header((unsigned char *) UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], num_sdus, //num_sdus + sdu_lengths, // + sdu_lcids, 255, // no drx + ta_update, // timing advance + NULL, // contention res id + padding, post_padding); + + + + + +#ifdef DEBUG_eNB_SCHEDULER + LOG_T(MAC, "[eNB %d] First 16 bytes of DLSCH : \n"); + + for (i = 0; i < 16; i++) { + LOG_T(MAC, "%x.", dlsch_buffer[i]); + } + + LOG_T(MAC, "\n"); +#endif + // cycle through SDUs and place in dlsch_buffer + memcpy(&UE_list->DLSCH_pdu[CC_id][0][UE_id]. + payload[0][offset], dlsch_buffer, sdu_length_total); + // memcpy(&eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0][offset],dcch_buffer,sdu_lengths[0]); + + // fill remainder of DLSCH with random data + for (j = 0; j < (TBS - sdu_length_total - offset); j++) { + UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0][offset + + sdu_length_total + + j] = + (char) (taus() & 0xff); + } + + //eNB_mac_inst[0].DLSCH_pdu[0][0].payload[0][offset+sdu_lengths[0]+j] = (char)(taus()&0xff); + if (opt_enabled == 1) { + trace_pdu(1, + (uint8_t *) + UE_list->DLSCH_pdu[CC_id][0][UE_id]. + payload[0], TBS, mod_id, 3, UE_RNTI(mod_id, + UE_id), + eNB->frame, eNB->subframe, 0, 0); + LOG_D(OPT, + "[eNB %d][DLSCH] CC_id %d Frame %d rnti %x with size %d\n", + mod_id, CC_id, frame, UE_RNTI(mod_id, UE_id), + TBS); + } + // store stats + eNB->eNB_stats[CC_id].dlsch_bytes_tx += sdu_length_total; + eNB->eNB_stats[CC_id].dlsch_pdus_tx += 1; + UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi = + eNB_UE_stats->DL_cqi[0]; + + UE_list->eNB_UE_stats[CC_id][UE_id].crnti = rnti; + UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status = + mac_eNB_get_rrc_status(mod_id, rnti); + UE_list->eNB_UE_stats[CC_id][UE_id].harq_pid = harq_pid; + UE_list->eNB_UE_stats[CC_id][UE_id].harq_round = round; + + //nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; + //Find the number of resource blocks and set them to the template for retransmissions + nb_rb = get_min_rb_unit(mod_id, CC_id); + uint16_t stats_tbs = + mac_xface->get_TBS_DL(dl_dci->mcs[0], nb_rb); + + while (stats_tbs < TBS) { + nb_rb += get_min_rb_unit(mod_id, CC_id); + stats_tbs = + mac_xface->get_TBS_DL(dl_dci->mcs[0], nb_rb); + } + + // LOG_I(FLEXRAN_AGENT, "The MCS was %d\n", dl_dci->mcs[0]); + + UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used = nb_rb; + UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used += + nb_rb; + UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1 = + dl_dci->mcs[0]; + UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2 = + dl_dci->mcs[0]; + UE_list->eNB_UE_stats[CC_id][UE_id].TBS = TBS; + + UE_list->eNB_UE_stats[CC_id][UE_id].overhead_bytes = + TBS - sdu_length_total; + UE_list->eNB_UE_stats[CC_id][UE_id].total_sdu_bytes += + sdu_length_total; + UE_list->eNB_UE_stats[CC_id][UE_id].total_pdu_bytes += TBS; + UE_list->eNB_UE_stats[CC_id][UE_id].total_num_pdus += 1; + + //eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]]; + //eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs); + } else { + LOG_D(FLEXRAN_AGENT, + "No need to schedule a dci after all. Just drop it\n"); + harq_pid_updated[UE_id][harq_pid] = 1; + harq_pid_round[UE_id][harq_pid] = 0; + continue; + } + } else { + // No need to create anything apart of DCI in case of retransmission + /*TODO: Must add these */ + // eNB_UE_stats->dlsch_trials[round]++; + //UE_list->eNB_UE_stats[CC_id][UE_id].num_retransmission+=1; + //UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used_retx=nb_rb; + //UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_retx+=nb_rb; + //UE_list->eNB_UE_stats[CC_id][UE_id].ncce_used_retx=nCCECC_id]; + } + + // UE_list->UE_template[CC_id][UE_id].oldNDI[dl_dci->harq_process] = dl_dci->ndi[0]; + // eNB_UE_stats->dlsch_mcs1 = dl_dci->mcs[0]; + + //Fill the proper DCI of OAI + flexran_fill_oai_dci(mod_id, CC_id, rnti, dl_dci); + } +} + +void +flexran_fill_oai_dci(mid_t mod_id, uint32_t CC_id, uint32_t rnti, + Protocol__FlexDlDci * dl_dci) +{ + + void *DLSCH_dci = NULL; + DCI_PDU *DCI_pdu; + + unsigned char harq_pid = 0; + // unsigned char round = 0; + LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; + int size_bits = 0, size_bytes = 0; + eNB_MAC_INST *eNB = &eNB_mac_inst[mod_id]; + UE_list_t *UE_list = &eNB->UE_list; + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + + int UE_id = find_ue(rnti, PHY_vars_eNB_g[mod_id][CC_id]); + + uint32_t format; + + harq_pid = dl_dci->harq_process; + // round = dl_dci->rv[0]; + + // Note this code is for a specific DCI format + DLSCH_dci = + (void *) UE_list->UE_template[CC_id][UE_id].DLSCH_DCI[harq_pid]; + DCI_pdu = &eNB->common_channels[CC_id].DCI_pdu; + + frame_parms[CC_id] = mac_xface->get_lte_frame_parms(mod_id, CC_id); + + if (dl_dci->has_tpc == 1) { + // Check if tpc has been set and reset measurement */ + if ((dl_dci->tpc == 0) || (dl_dci->tpc == 2)) { + eNB_UE_stats = + mac_xface->get_eNB_UE_stats(mod_id, CC_id, rnti); + eNB_UE_stats->Po_PUCCH_update = 0; + } + } + + + switch (frame_parms[CC_id]->N_RB_DL) { + case 6: + if (frame_parms[CC_id]->frame_type == TDD) { + if (dl_dci->format == PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1) { + FILL_DCI_TDD_1(DCI1_1_5MHz_TDD_t, DLSCH_dci, dl_dci); + size_bytes = sizeof(DCI1_1_5MHz_TDD_t); + size_bits = sizeof_DCI1_1_5MHz_TDD_t; + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A) { + //TODO + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D) { + //TODO + } + } else { + if (dl_dci->format == PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1) { + FILL_DCI_FDD_1(DCI1_1_5MHz_FDD_t, DLSCH_dci, dl_dci); + size_bytes = sizeof(DCI1_1_5MHz_FDD_t); + size_bits = sizeof_DCI1_1_5MHz_FDD_t; + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A) { + //TODO + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D) { + //TODO + } + } + break; + case 25: + if (frame_parms[CC_id]->frame_type == TDD) { + if (dl_dci->format == PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1) { + FILL_DCI_TDD_1(DCI1_5MHz_TDD_t, DLSCH_dci, dl_dci); + size_bytes = sizeof(DCI1_5MHz_TDD_t); + size_bits = sizeof_DCI1_5MHz_TDD_t; + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A) { + //TODO + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D) { + //TODO + } + } else { + if (dl_dci->format == PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1) { + FILL_DCI_FDD_1(DCI1_5MHz_FDD_t, DLSCH_dci, dl_dci); + size_bytes = sizeof(DCI1_5MHz_FDD_t); + size_bits = sizeof_DCI1_5MHz_FDD_t; + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A) { + //TODO + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D) { + //TODO + } + } + break; + case 50: + if (frame_parms[CC_id]->frame_type == TDD) { + if (dl_dci->format == PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1) { + FILL_DCI_TDD_1(DCI1_10MHz_TDD_t, DLSCH_dci, dl_dci); + size_bytes = sizeof(DCI1_10MHz_TDD_t); + size_bits = sizeof_DCI1_10MHz_TDD_t; + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A) { + //TODO + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D) { + //TODO + } + } else { + if (dl_dci->format == PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1) { + FILL_DCI_FDD_1(DCI1_10MHz_FDD_t, DLSCH_dci, dl_dci); + size_bytes = sizeof(DCI1_10MHz_FDD_t); + size_bits = sizeof_DCI1_10MHz_FDD_t; + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A) { + //TODO + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D) { + //TODO + } + } + break; + case 100: + if (frame_parms[CC_id]->frame_type == TDD) { + if (dl_dci->format == PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1) { + FILL_DCI_TDD_1(DCI1_20MHz_TDD_t, DLSCH_dci, dl_dci); + size_bytes = sizeof(DCI1_20MHz_TDD_t); + size_bits = sizeof_DCI1_20MHz_TDD_t; + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A) { + //TODO + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D) { + //TODO + } + } else { + if (dl_dci->format == PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1) { + FILL_DCI_FDD_1(DCI1_20MHz_FDD_t, DLSCH_dci, dl_dci); + size_bytes = sizeof(DCI1_20MHz_FDD_t); + size_bits = sizeof_DCI1_20MHz_FDD_t; + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A) { + //TODO + } else if (dl_dci->format == + PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D) { + //TODO + } + } + break; + } + + //Set format to the proper type + switch (dl_dci->format) { + case PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1: + format = format1; + break; + case PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1A: + format = format1A; + break; + case PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1B: + format = format1B; + break; + case PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1C: + format = format1C; + break; + case PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D: + format = format1E_2A_M10PRB; + break; + case PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2: + format = format2; + break; + case PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A: + format = format2A; + break; + case PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2B: + format = format2B; + break; + case PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_3: + format = 3; + break; + default: + /*TODO: Need to deal with unsupported DCI type */ + return; + } + + add_ue_spec_dci(DCI_pdu, + DLSCH_dci, + rnti, + size_bytes, dl_dci->aggr_level, size_bits, format, 0); +} diff --git a/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c new file mode 100644 index 0000000000..3a491bd7ea --- /dev/null +++ b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue.c @@ -0,0 +1,2005 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_scheduler_dlsch_ue.c + * \brief procedures related to eNB for the DLSCH transport channel + * \author Xenofon Foukas, Navid Nikaein and Raymond Knopp + * \date 2016 + * \email: x.foukas@sms.ed.ac.uk + * \version 0.1 + * @ingroup _mac + + */ + +#include "assertions.h" +#include "PHY/defs.h" +#include "PHY/extern.h" + +#include "SCHED/defs.h" +#include "SCHED/extern.h" + +#include "LAYER2/MAC/flexran_agent_mac_proto.h" +#include "LAYER2/MAC/defs.h" +#include "LAYER2/MAC/proto.h" +#include "LAYER2/MAC/extern.h" +#include "UTIL/LOG/log.h" +#include "UTIL/LOG/vcd_signal_dumper.h" +#include "UTIL/OPT/opt.h" +#include "OCG.h" +#include "OCG_extern.h" + +#include "RRC/LITE/extern.h" +#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" + +#include "ENB_APP/flexran_agent_defs.h" + +#include "pdcp.h" + +#include "header.pb-c.h" +#include "flexran.pb-c.h" +#include "flexran_agent_mac.h" +#include + +#include "SIMULATION/TOOLS/defs.h" // for taus + +#if defined(ENABLE_ITTI) +#include "intertask_interface.h" +#endif + +#define ENABLE_MAC_PAYLOAD_DEBUG + +/** + * Local variables to support slicing + * + */ + + +/*!\brief UE ULSCH scheduling states*/ +typedef enum { + MIN_SLICE_STRATEGY = 0, + SLICE_MASK, + UEID_TO_SLICEID, + MAX_SLICE_STRATEGY +} SLICING_STRATEGY; + +// this assumes a max of of 16 UE per eNB/CC +#define SLICE0_MASK 0x000f +#define SLICE1_MASK 0x00f0 +#define SLICE2_MASK 0x0f00 +#define SLICE3_MASK 0xf000 + + +// number of active slices for past and current time +int n_active_slices = 1; +int n_active_slices_current = 1; + +// ue to slice mapping +int slicing_strategy = UEID_TO_SLICEID; +int slicing_strategy_current = UEID_TO_SLICEID; + +// RB share for each slice for past and current time +float slice_percentage[MAX_NUM_SLICES] = { 1.0, 0.0, 0.0, 0.0 }; +float slice_percentage_current[MAX_NUM_SLICES] = { 1.0, 0.0, 0.0, 0.0 }; + +float total_slice_percentage = 0; + +// MAX MCS for each slice for past and current time +int slice_maxmcs[MAX_NUM_SLICES] = { 28, 28, 28, 28 }; +int slice_maxmcs_current[MAX_NUM_SLICES] = { 28, 28, 28, 28 }; + +int update_dl_scheduler[MAX_NUM_SLICES] = { 1, 1, 1, 1 }; +int update_dl_scheduler_current[MAX_NUM_SLICES] = { 1, 1, 1, 1 }; + +// name of available scheduler +char *dl_scheduler_type[MAX_NUM_SLICES] = + { "flexran_schedule_ue_spec_embb", + "flexran_schedule_ue_spec_urllc", + "flexran_schedule_ue_spec_mmtc", + "flexran_schedule_ue_spec_be" // best effort +}; + +// pointer to the slice specific scheduler +slice_scheduler slice_sched[MAX_NUM_SLICES] = { 0 }; + + +/** + * preprocessor functions for scheduling + * + */ + + +// This function stores the downlink buffer for all the logical channels +void +_store_dlsch_buffer(module_id_t Mod_id, + int slice_id, frame_t frameP, sub_frame_t subframeP) +{ + + int UE_id, i; + rnti_t rnti; + mac_rlc_status_resp_t rlc_status; + UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; + UE_TEMPLATE *UE_template; + + for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (UE_list->active[UE_id] != TRUE) + continue; + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; + + UE_template = + &UE_list->UE_template[UE_PCCID(Mod_id, UE_id)][UE_id]; + + // clear logical channel interface variables + UE_template->dl_buffer_total = 0; + UE_template->dl_pdus_total = 0; + + for (i = 0; i < MAX_NUM_LCID; i++) { + UE_template->dl_buffer_info[i] = 0; + UE_template->dl_pdus_in_buffer[i] = 0; + UE_template->dl_buffer_head_sdu_creation_time[i] = 0; + UE_template->dl_buffer_head_sdu_remaining_size_to_send[i] = 0; + } + + rnti = UE_RNTI(Mod_id, UE_id); + + for (i = 0; i < MAX_NUM_LCID; i++) { // loop over all the logical channels + + rlc_status = + mac_rlc_status_ind(Mod_id, rnti, Mod_id, frameP, subframeP, + ENB_FLAG_YES, MBMS_FLAG_NO, i, 0); + UE_template->dl_buffer_info[i] = rlc_status.bytes_in_buffer; //storing the dlsch buffer for each logical channel + UE_template->dl_pdus_in_buffer[i] = rlc_status.pdus_in_buffer; + UE_template->dl_buffer_head_sdu_creation_time[i] = + rlc_status.head_sdu_creation_time; + UE_template->dl_buffer_head_sdu_creation_time_max = + cmax(UE_template->dl_buffer_head_sdu_creation_time_max, + rlc_status.head_sdu_creation_time); + UE_template->dl_buffer_head_sdu_remaining_size_to_send[i] = + rlc_status.head_sdu_remaining_size_to_send; + UE_template->dl_buffer_head_sdu_is_segmented[i] = + rlc_status.head_sdu_is_segmented; + UE_template->dl_buffer_total += UE_template->dl_buffer_info[i]; //storing the total dlsch buffer + UE_template->dl_pdus_total += + UE_template->dl_pdus_in_buffer[i]; + +#ifdef DEBUG_eNB_SCHEDULER + + /* note for dl_buffer_head_sdu_remaining_size_to_send[i] : + * 0 if head SDU has not been segmented (yet), else remaining size not already segmented and sent + */ + if (UE_template->dl_buffer_info[i] > 0) + LOG_D(MAC, + "[eNB %d][SLICE %d] Frame %d Subframe %d : RLC status for UE %d in LCID%d: total of %d pdus and size %d, head sdu queuing time %d, remaining size %d, is segmeneted %d \n", + Mod_id, slice_id, frameP, subframeP, UE_id, + i, UE_template->dl_pdus_in_buffer[i], + UE_template->dl_buffer_info[i], + UE_template->dl_buffer_head_sdu_creation_time[i], + UE_template-> + dl_buffer_head_sdu_remaining_size_to_send[i], + UE_template->dl_buffer_head_sdu_is_segmented[i]); + +#endif + + } + + //#ifdef DEBUG_eNB_SCHEDULER + if (UE_template->dl_buffer_total > 0) + LOG_D(MAC, + "[eNB %d] Frame %d Subframe %d : RLC status for UE %d : total DL buffer size %d and total number of pdu %d \n", + Mod_id, frameP, subframeP, UE_id, + UE_template->dl_buffer_total, + UE_template->dl_pdus_total); + + //#endif + } +} + + +// This function returns the estimated number of RBs required by each UE for downlink scheduling +void +_assign_rbs_required(module_id_t Mod_id, + int slice_id, + frame_t frameP, + sub_frame_t subframe, + uint16_t + nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t nb_rbs_allowed_slice[MAX_NUM_CCs] + [MAX_NUM_SLICES], int min_rb_unit[MAX_NUM_CCs]) +{ + + + rnti_t rnti; + uint16_t TBS = 0; + LTE_eNB_UE_stats *eNB_UE_stats[MAX_NUM_CCs]; + int UE_id, n, i, j, CC_id, pCCid, tmp; + UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; + // UE_TEMPLATE *UE_template; + + // clear rb allocations across all CC_ids + for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (UE_list->active[UE_id] != TRUE) + continue; + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; + + pCCid = UE_PCCID(Mod_id, UE_id); + rnti = UE_list->UE_template[pCCid][UE_id].rnti; + + /* skip UE not present in PHY (for any of its active CCs) */ + if (!phy_stats_exist(Mod_id, rnti)) + continue; + + //update CQI information across component carriers + for (n = 0; n < UE_list->numactiveCCs[UE_id]; n++) { + CC_id = UE_list->ordered_CCids[n][UE_id]; + eNB_UE_stats[CC_id] = + mac_xface->get_eNB_UE_stats(Mod_id, CC_id, rnti); + eNB_UE_stats[CC_id]->dlsch_mcs1 = + cqi_to_mcs[flexran_get_ue_wcqi(Mod_id, UE_id)]; + } + + // provide the list of CCs sorted according to MCS + for (i = 0; i < UE_list->numactiveCCs[UE_id]; i++) { + for (j = i + 1; j < UE_list->numactiveCCs[UE_id]; j++) { + DevAssert(j < MAX_NUM_CCs); + + if (eNB_UE_stats[UE_list->ordered_CCids[i][UE_id]]-> + dlsch_mcs1 > + eNB_UE_stats[UE_list->ordered_CCids[j][UE_id]]-> + dlsch_mcs1) { + tmp = UE_list->ordered_CCids[i][UE_id]; + UE_list->ordered_CCids[i][UE_id] = + UE_list->ordered_CCids[j][UE_id]; + UE_list->ordered_CCids[j][UE_id] = tmp; + } + } + } + + /* NN --> RK + * check the index of UE_template" + */ + if (UE_list->UE_template[pCCid][UE_id].dl_buffer_total > 0) { + LOG_D(MAC, "[preprocessor] assign RB for UE %d\n", UE_id); + + for (i = 0; i < UE_list->numactiveCCs[UE_id]; i++) { + CC_id = UE_list->ordered_CCids[i][UE_id]; + eNB_UE_stats[CC_id] = + mac_xface->get_eNB_UE_stats(Mod_id, CC_id, rnti); + + if (cqi_to_mcs[flexran_get_ue_wcqi(Mod_id, UE_id)] == 0) { //eNB_UE_stats[CC_id]->dlsch_mcs1==0) { + nb_rbs_required[CC_id][UE_id] = 4; // don't let the TBS get too small + } else { + nb_rbs_required[CC_id][UE_id] = min_rb_unit[CC_id]; + } + + TBS = + mac_xface->get_TBS_DL(cqi_to_mcs + [flexran_get_ue_wcqi + (Mod_id, UE_id)], + nb_rbs_required[CC_id][UE_id]); + nb_rbs_allowed_slice[CC_id][slice_id] = + flexran_nb_rbs_allowed_slice(slice_percentage + [slice_id], + flexran_get_N_RB_DL + (Mod_id, CC_id)); + LOG_D(MAC, + "[preprocessor] start RB assignement for UE %d CC_id %d dl buffer %d (RB unit %d, MCS %d, TBS %d) \n", + UE_id, CC_id, + UE_list->UE_template[pCCid][UE_id].dl_buffer_total, + nb_rbs_required[CC_id][UE_id], + flexran_get_ue_wcqi(Mod_id, UE_id), TBS); + + /* calculating required number of RBs for each UE */ + while (TBS < + UE_list->UE_template[pCCid][UE_id]. + dl_buffer_total) { + nb_rbs_required[CC_id][UE_id] += min_rb_unit[CC_id]; + + if (nb_rbs_required[CC_id][UE_id] > + nb_rbs_allowed_slice[CC_id][slice_id]) { + TBS = + mac_xface->get_TBS_DL(flexran_get_ue_wcqi + (Mod_id, UE_id), + nb_rbs_allowed_slice + [CC_id] + [slice_id]); + nb_rbs_required[CC_id][UE_id] = + nb_rbs_allowed_slice[CC_id][slice_id]; + break; + } + + TBS = + mac_xface->get_TBS_DL(cqi_to_mcs + [flexran_get_ue_wcqi + (Mod_id, UE_id)], + nb_rbs_required[CC_id] + [UE_id]); + } // end of while + + LOG_D(MAC, + "[eNB %d][SLICE %d] Frame %d: UE %d on CC %d: RB unit %d, nb_required RB %d (TBS %d, mcs %d)\n", + Mod_id, slice_id, frameP, UE_id, CC_id, + min_rb_unit[CC_id], nb_rbs_required[CC_id][UE_id], + TBS, cqi_to_mcs[flexran_get_ue_wcqi(Mod_id, UE_id)]); + } + } + } +} + +void +_dlsch_scheduler_pre_processor_allocate(module_id_t Mod_id, + int UE_id, + uint8_t CC_id, + int N_RBG, + int transmission_mode, + int min_rb_unit, + uint8_t N_RB_DL, + uint16_t + nb_rbs_required[MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], + uint16_t + nb_rbs_required_remaining + [MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], unsigned char + rballoc_sub[MAX_NUM_CCs] + [N_RBG_MAX], unsigned char + MIMO_mode_indicator + [MAX_NUM_CCs][N_RBG_MAX]) +{ + int i; + UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; + UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + + for (i = 0; i < N_RBG; i++) { + + if ((rballoc_sub[CC_id][i] == 0) && + (ue_sched_ctl->rballoc_sub_UE[CC_id][i] == 0) && + (nb_rbs_required_remaining[CC_id][UE_id] > 0) && + (ue_sched_ctl->pre_nb_available_rbs[CC_id] < + nb_rbs_required[CC_id][UE_id])) { + + // if this UE is not scheduled for TM5 + if (ue_sched_ctl->dl_pow_off[CC_id] != 0) { + + if ((i == N_RBG - 1) + && ((N_RB_DL == 25) || (N_RB_DL == 50))) { + rballoc_sub[CC_id][i] = 1; + ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; + MIMO_mode_indicator[CC_id][i] = 1; + if (transmission_mode == 5) { + ue_sched_ctl->dl_pow_off[CC_id] = 1; + } + nb_rbs_required_remaining[CC_id][UE_id] = + nb_rbs_required_remaining[CC_id][UE_id] - + min_rb_unit + 1; + ue_sched_ctl->pre_nb_available_rbs[CC_id] = + ue_sched_ctl->pre_nb_available_rbs[CC_id] + + min_rb_unit - 1; + } else { + if (nb_rbs_required_remaining[CC_id][UE_id] >= + min_rb_unit) { + rballoc_sub[CC_id][i] = 1; + ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; + MIMO_mode_indicator[CC_id][i] = 1; + if (transmission_mode == 5) { + ue_sched_ctl->dl_pow_off[CC_id] = 1; + } + nb_rbs_required_remaining[CC_id][UE_id] = + nb_rbs_required_remaining[CC_id][UE_id] - + min_rb_unit; + ue_sched_ctl->pre_nb_available_rbs[CC_id] = + ue_sched_ctl->pre_nb_available_rbs[CC_id] + + min_rb_unit; + } + } + } // dl_pow_off[CC_id][UE_id] ! = 0 + } + } +} + +void +_dlsch_scheduler_pre_processor_reset(int module_idP, + int UE_id, + uint8_t CC_id, + int frameP, + int subframeP, + int N_RBG, + uint16_t nb_rbs_required[MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], + uint16_t + nb_rbs_required_remaining + [MAX_NUM_CCs][NUMBER_OF_UE_MAX], + uint16_t + nb_rbs_allowed_slice[MAX_NUM_CCs] + [MAX_NUM_SLICES], unsigned char + rballoc_sub[MAX_NUM_CCs] + [N_RBG_MAX], unsigned char + MIMO_mode_indicator[MAX_NUM_CCs] + [N_RBG_MAX]) +{ + int i, j; + UE_list_t *UE_list = &eNB_mac_inst[module_idP].UE_list; + UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + uint8_t *vrb_map = + eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map; + int RBGsize = + PHY_vars_eNB_g[module_idP][CC_id]->frame_parms.N_RB_DL / N_RBG; +#ifdef SF05_LIMIT + //int subframe05_limit=0; + int sf05_upper = -1, sf05_lower = -1; +#endif + // LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); + + flexran_update_TA(module_idP, UE_id, CC_id); + + if (UE_id == 0) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME + (VCD_SIGNAL_DUMPER_VARIABLES_UE0_TIMING_ADVANCE, + ue_sched_ctl->ta_update); + } + nb_rbs_required[CC_id][UE_id] = 0; + ue_sched_ctl->pre_nb_available_rbs[CC_id] = 0; + ue_sched_ctl->dl_pow_off[CC_id] = 2; + nb_rbs_required_remaining[CC_id][UE_id] = 0; + for (i = 0; i < n_active_slices; i++) + nb_rbs_allowed_slice[CC_id][i] = 0; +#ifdef SF05_LIMIT + switch (N_RBG) { + case 6: + sf05_lower = 0; + sf05_upper = 5; + break; + case 8: + sf05_lower = 2; + sf05_upper = 5; + break; + case 13: + sf05_lower = 4; + sf05_upper = 7; + break; + case 17: + sf05_lower = 7; + sf05_upper = 9; + break; + case 25: + sf05_lower = 11; + sf05_upper = 13; + break; + } +#endif + // Initialize Subbands according to VRB map + for (i = 0; i < N_RBG; i++) { + ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 0; + rballoc_sub[CC_id][i] = 0; +#ifdef SF05_LIMIT + // for avoiding 6+ PRBs around DC in subframe 0-5 (avoid excessive errors) + + if ((subframeP == 0 || subframeP == 5) && + (i >= sf05_lower && i <= sf05_upper)) + rballoc_sub[CC_id][i] = 1; +#endif + // for SI-RNTI,RA-RNTI and P-RNTI allocations + for (j = 0; j < RBGsize; j++) { + if (vrb_map[j + (i * RBGsize)] != 0) { + rballoc_sub[CC_id][i] = 1; + LOG_D(MAC, "Frame %d, subframe %d : vrb %d allocated\n", + frameP, subframeP, j + (i * RBGsize)); + break; + } + } + LOG_D(MAC, "Frame %d Subframe %d CC_id %d RBG %i : rb_alloc %d\n", + frameP, subframeP, CC_id, i, rballoc_sub[CC_id][i]); + MIMO_mode_indicator[CC_id][i] = 2; + } +} + +// This function assigns pre-available RBS to each UE in specified sub-bands before scheduling is done +void +_dlsch_scheduler_pre_processor(module_id_t Mod_id, + int slice_id, + frame_t frameP, + sub_frame_t subframeP, + int N_RBG[MAX_NUM_CCs], int *mbsfn_flag) +{ + + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], total_ue_count; + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]; + int UE_id, i; + uint8_t round = 0; + uint8_t harq_pid = 0; + uint16_t ii, j; + uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + uint16_t nb_rbs_allowed_slice[MAX_NUM_CCs][MAX_NUM_SLICES]; + uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + uint16_t nb_rbs_required_remaining_1[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + uint16_t average_rbs_per_user[MAX_NUM_CCs] = { 0 }; + rnti_t rnti; + int min_rb_unit[MAX_NUM_CCs]; + uint16_t r1 = 0; + uint8_t CC_id; + UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; + LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs] = { 0 }; + + int transmission_mode = 0; + UE_sched_ctrl *ue_sched_ctl; + + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + + if (mbsfn_flag[CC_id] > 0) // If this CC is allocated for MBSFN skip it here + continue; + + frame_parms[CC_id] = mac_xface->get_lte_frame_parms(Mod_id, CC_id); + + + min_rb_unit[CC_id] = get_min_rb_unit(Mod_id, CC_id); + + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (UE_list->active[i] != TRUE) + continue; + + UE_id = i; + // Initialize scheduling information for all active UEs + + //if (flexran_slice_member(UE_id, slice_id) == 0) + //continue; + _dlsch_scheduler_pre_processor_reset(Mod_id, + UE_id, + CC_id, + frameP, + subframeP, + N_RBG[CC_id], + nb_rbs_required, + nb_rbs_required_remaining, + nb_rbs_allowed_slice, + rballoc_sub, + MIMO_mode_indicator); + + } + } + + // Store the DLSCH buffer for each logical channel + _store_dlsch_buffer(Mod_id, slice_id, frameP, subframeP); + + // Calculate the number of RBs required by each UE on the basis of logical channel's buffer + _assign_rbs_required(Mod_id, slice_id, frameP, subframeP, + nb_rbs_required, nb_rbs_allowed_slice, + min_rb_unit); + + // Sorts the user on the basis of dlsch logical channel buffer and CQI + sort_UEs(Mod_id, frameP, subframeP); + + total_ue_count = 0; + + // loop over all active UEs + for (i = UE_list->head; i >= 0; i = UE_list->next[i]) { + rnti = flexran_get_ue_crnti(Mod_id, i); + if (rnti == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; + + UE_id = i; + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; + + if (!phy_stats_exist(Mod_id, rnti)) + continue; + + for (ii = 0; ii < UE_num_active_CC(UE_list, UE_id); ii++) { + CC_id = UE_list->ordered_CCids[ii][UE_id]; + ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + ue_sched_ctl->max_allowed_rbs[CC_id] = + nb_rbs_allowed_slice[CC_id][slice_id]; + flexran_get_harq(Mod_id, CC_id, UE_id, frameP, subframeP, + &harq_pid, &round); + + // if there is no available harq_process, skip the UE + if (UE_list->UE_sched_ctrl[UE_id].harq_pid[CC_id] < 0) + continue; + + average_rbs_per_user[CC_id] = 0; + + frame_parms[CC_id] = + mac_xface->get_lte_frame_parms(Mod_id, CC_id); + + // mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0); + + if (round > 0) { + nb_rbs_required[CC_id][UE_id] = + UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; + } + //nb_rbs_required_remaining[UE_id] = nb_rbs_required[UE_id]; + if (nb_rbs_required[CC_id][UE_id] > 0) { + total_ue_count = total_ue_count + 1; + } + // hypotetical assignement + /* + * If schedule is enabled and if the priority of the UEs is modified + * The average rbs per logical channel per user will depend on the level of + * priority. Concerning the hypothetical assignement, we should assign more + * rbs to prioritized users. Maybe, we can do a mapping between the + * average rbs per user and the level of priority or multiply the average rbs + * per user by a coefficient which represents the degree of priority. + */ + + if (total_ue_count == 0) { + average_rbs_per_user[CC_id] = 0; + } else if ((min_rb_unit[CC_id] * total_ue_count) <= + nb_rbs_allowed_slice[CC_id][slice_id]) { + average_rbs_per_user[CC_id] = + (uint16_t) floor(nb_rbs_allowed_slice[CC_id][slice_id] + / total_ue_count); + } else { + average_rbs_per_user[CC_id] = min_rb_unit[CC_id]; // consider the total number of use that can be scheduled UE + } + } + } + + // note: nb_rbs_required is assigned according to total_buffer_dl + // extend nb_rbs_required to capture per LCID RB required + for (i = UE_list->head; i >= 0; i = UE_list->next[i]) { + rnti = UE_RNTI(Mod_id, i); + + if (rnti == NOT_A_RNTI) + continue; + + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; + + if (!phy_stats_exist(Mod_id, rnti)) + continue; + + if (flexran_slice_member(i, slice_id) == 0) + continue; + + for (ii = 0; ii < UE_num_active_CC(UE_list, i); ii++) { + CC_id = UE_list->ordered_CCids[ii][i]; + + // control channel + if (mac_eNB_get_rrc_status(Mod_id, rnti) < RRC_RECONFIGURED) { + nb_rbs_required_remaining_1[CC_id][i] = + nb_rbs_required[CC_id][i]; + } else { + nb_rbs_required_remaining_1[CC_id][i] = + cmin(average_rbs_per_user[CC_id], + nb_rbs_required[CC_id][i]); + + } + } + } + + //Allocation to UEs is done in 2 rounds, + // 1st stage: average number of RBs allocated to each UE + // 2nd stage: remaining RBs are allocated to high priority UEs + for (r1 = 0; r1 < 2; r1++) { + + for (i = UE_list->head; i >= 0; i = UE_list->next[i]) { + + if (flexran_slice_member(i, slice_id) == 0) + continue; + + for (ii = 0; ii < UE_num_active_CC(UE_list, i); ii++) { + CC_id = UE_list->ordered_CCids[ii][i]; + + if (r1 == 0) { + nb_rbs_required_remaining[CC_id][i] = + nb_rbs_required_remaining_1[CC_id][i]; + } else { // rb required based only on the buffer - rb allloctaed in the 1st round + extra reaming rb form the 1st round + nb_rbs_required_remaining[CC_id][i] = + nb_rbs_required[CC_id][i] - + nb_rbs_required_remaining_1[CC_id][i] + + nb_rbs_required_remaining[CC_id][i]; + } + + if (nb_rbs_required[CC_id][i] > 0) + LOG_D(MAC, + "round %d : nb_rbs_required_remaining[%d][%d]= %d (remaining_1 %d, required %d, pre_nb_available_rbs %d, N_RBG %d, rb_unit %d)\n", + r1, CC_id, i, + nb_rbs_required_remaining[CC_id][i], + nb_rbs_required_remaining_1[CC_id][i], + nb_rbs_required[CC_id][i], + UE_list->UE_sched_ctrl[i]. + pre_nb_available_rbs[CC_id], N_RBG[CC_id], + min_rb_unit[CC_id]); + + } + } + + if (total_ue_count > 0) { + for (i = UE_list->head; i >= 0; i = UE_list->next[i]) { + UE_id = i; + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; + + for (ii = 0; ii < UE_num_active_CC(UE_list, UE_id); ii++) { + CC_id = UE_list->ordered_CCids[ii][UE_id]; + ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + flexran_get_harq(Mod_id, CC_id, UE_id, frameP, + subframeP, &harq_pid, &round); + rnti = UE_RNTI(Mod_id, UE_id); + + // LOG_D(MAC,"UE %d rnti 0x\n", UE_id, rnti ); + if (rnti == NOT_A_RNTI) + continue; + + if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 1) + continue; + + if (!phy_stats_exist(Mod_id, rnti)) + continue; + + transmission_mode = + mac_xface->get_transmission_mode(Mod_id, CC_id, + rnti); + //rrc_status = mac_eNB_get_rrc_status(Mod_id,rnti); + /* 1st allocate for the retx */ + + // retransmission in data channels + // control channel in the 1st transmission + // data channel for all TM + LOG_T(MAC, + "calling dlsch_scheduler_pre_processor_allocate .. \n "); + _dlsch_scheduler_pre_processor_allocate(Mod_id, UE_id, + CC_id, + N_RBG[CC_id], + transmission_mode, + min_rb_unit + [CC_id], + frame_parms + [CC_id]-> + N_RB_DL, + nb_rbs_required, + nb_rbs_required_remaining, + rballoc_sub, + MIMO_mode_indicator); + } + } + } // total_ue_count + } // end of for for r1 and r2 + + for (i = UE_list->head; i >= 0; i = UE_list->next[i]) { + UE_id = i; + ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; + + for (ii = 0; ii < UE_num_active_CC(UE_list, UE_id); ii++) { + CC_id = UE_list->ordered_CCids[ii][UE_id]; + //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].dl_pow_off = dl_pow_off[UE_id]; + + if (ue_sched_ctl->pre_nb_available_rbs[CC_id] > 0) { + LOG_D(MAC, + "******************DL Scheduling Information for UE%d ************************\n", + UE_id); + LOG_D(MAC, "dl power offset UE%d = %d \n", UE_id, + ue_sched_ctl->dl_pow_off[CC_id]); + LOG_D(MAC, + "***********RB Alloc for every subband for UE%d ***********\n", + UE_id); + + for (j = 0; j < N_RBG[CC_id]; j++) { + //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].rballoc_sub[i] = rballoc_sub_UE[CC_id][UE_id][i]; + LOG_D(MAC, "RB Alloc for UE%d and Subband%d = %d\n", + UE_id, j, + ue_sched_ctl->rballoc_sub_UE[CC_id][j]); + } + + //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = pre_nb_available_rbs[CC_id][UE_id]; + LOG_D(MAC, + "[eNB %d][SLICE %d] Total RBs allocated for UE%d = %d\n", + Mod_id, slice_id, UE_id, + ue_sched_ctl->pre_nb_available_rbs[CC_id]); + } + } + } +} + +#define SF05_LIMIT 1 + +/* + * Main scheduling functions to support slicing + * + */ + +void +flexran_schedule_ue_spec_default(mid_t mod_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info) +//------------------------------------------------------------------------------ +{ + int i = 0; + + flexran_agent_mac_create_empty_dl_config(mod_id, dl_info); + + for (i = 0; i < n_active_slices; i++) { + + // Load any updated functions + if (update_dl_scheduler[i] > 0) { + slice_sched[i] = dlsym(NULL, dl_scheduler_type[i]); + update_dl_scheduler[i] = 0; + update_dl_scheduler_current[i] = 0; + slice_percentage_current[i] = slice_percentage[i]; + total_slice_percentage += slice_percentage[i]; + LOG_N(MAC, "update dl scheduler slice %d\n", i); + } + // check if the number of slices has changed, and log + if (n_active_slices_current != n_active_slices) { + if ((n_active_slices > 0) + && (n_active_slices <= MAX_NUM_SLICES)) { + LOG_N(MAC, + "[eNB %d]frame %d subframe %d: number of active slices has changed: %d-->%d\n", + mod_id, frame, subframe, n_active_slices_current, + n_active_slices); + n_active_slices_current = n_active_slices; + } else { + LOG_W(MAC, + "invalid number of slices %d, revert to the previous value %d\n", + n_active_slices, n_active_slices_current); + n_active_slices = n_active_slices_current; + } + } + // check if the slice rb share has changed, and log the console + if (slice_percentage_current[i] != slice_percentage[i]) { + if ((slice_percentage[i] >= 0.0) + && (slice_percentage[i] <= 1.0)) { + if ((total_slice_percentage - slice_percentage_current[i] + + slice_percentage[i]) <= 1.0) { + total_slice_percentage = + total_slice_percentage - + slice_percentage_current[i] + slice_percentage[i]; + LOG_N(MAC, + "[eNB %d][SLICE %d] frame %d subframe %d: total percentage %f, slice RB percentage has changed: %f-->%f\n", + mod_id, i, frame, subframe, + total_slice_percentage, + slice_percentage_current[i], + slice_percentage[i]); + slice_percentage_current[i] = slice_percentage[i]; + } else { + LOG_W(MAC, + "[eNB %d][SLICE %d] invalid total RB share (%f->%f), revert the previous value (%f->%f)\n", + mod_id, i, total_slice_percentage, + total_slice_percentage - + slice_percentage_current[i] + + slice_percentage[i], slice_percentage[i], + slice_percentage_current[i]); + slice_percentage[i] = slice_percentage_current[i]; + + } + } else { + LOG_W(MAC, + "[eNB %d][SLICE %d] invalid slice RB share, revert the previous value (%f->%f)\n", + mod_id, i, slice_percentage[i], + slice_percentage_current[i]); + slice_percentage[i] = slice_percentage_current[i]; + + } + } + // check if the slice max MCS, and log the console + if (slice_maxmcs_current[i] != slice_maxmcs[i]) { + if ((slice_maxmcs[i] >= 0) && (slice_maxmcs[i] < 29)) { + LOG_N(MAC, + "[eNB %d][SLICE %d] frame %d subframe %d: slice MAX MCS has changed: %d-->%d\n", + mod_id, i, frame, subframe, slice_maxmcs_current[i], + slice_maxmcs[i]); + slice_maxmcs_current[i] = slice_maxmcs[i]; + } else { + LOG_W(MAC, + "[eNB %d][SLICE %d] invalid slice max mcs %d, revert the previous value %d\n", + mod_id, i, slice_percentage[i], slice_percentage[i]); + slice_maxmcs[i] = slice_maxmcs_current[i]; + } + } + // check if a new scheduler, and log the console + if (update_dl_scheduler_current[i] != update_dl_scheduler[i]) { + LOG_N(MAC, + "[eNB %d][SLICE %d] frame %d subframe %d: DL scheduler for this slice is updated: %s \n", + mod_id, i, frame, subframe, dl_scheduler_type[i]); + update_dl_scheduler_current[i] = update_dl_scheduler[i]; + } + // Run each enabled slice-specific schedulers one by one + //LOG_N(MAC,"[eNB %d]frame %d subframe %d slice %d: calling the scheduler\n", mod_id, frame, subframe,i); + slice_sched[i] (mod_id, i, frame, subframe, mbsfn_flag, dl_info); + + } + +} + +uint16_t flexran_nb_rbs_allowed_slice(float rb_percentage, int total_rbs) +{ + return (uint16_t) floor(rb_percentage * total_rbs); +} + +int flexran_slice_maxmcs(int slice_id) +{ + return slice_maxmcs[slice_id]; +} + +int flexran_slice_member(int UE_id, int slice_id) +{ + // group membership definition + int slice_member = 0; + + if ((slice_id < 0) || (slice_id > n_active_slices)) + LOG_W(MAC, "out of range slice id %d\n", slice_id); + + switch (slicing_strategy) { + case SLICE_MASK: + switch (slice_id) { + case 0: + if (SLICE0_MASK & UE_id) { + slice_member = 1; + } + break; + case 1: + if (SLICE1_MASK & UE_id) { + slice_member = 1; + } + break; + case 2: + if (SLICE2_MASK & UE_id) { + slice_member = 1; + } + break; + case 3: + if (SLICE3_MASK & UE_id) { + slice_member = 1; + } + break; + default: + LOG_W(MAC, "unknown slice_id %d\n", slice_id); + break; + + } + break; + case UEID_TO_SLICEID: + default: + if ((UE_id % n_active_slices) == slice_id) { + slice_member = 1; // this ue is a member of this slice + } + break; + } + + return slice_member; +} + +/* more aggressive rb and mcs allocation with medium priority and the traffic qci */ +void +flexran_schedule_ue_spec_embb(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info) +{ + flexran_schedule_ue_spec_common(mod_id, + slice_id, + frame, subframe, mbsfn_flag, dl_info); + +} + +/* more conservative mcs allocation with high priority and the traffic qci */ +void +flexran_schedule_ue_spec_urllc(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info) +{ + flexran_schedule_ue_spec_common(mod_id, + slice_id, + frame, subframe, mbsfn_flag, dl_info); + +} + +/* constant rb allocation with low mcs with low priority and given the UE capabilities */ +void +flexran_schedule_ue_spec_mmtc(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info) +{ + + flexran_schedule_ue_spec_common(mod_id, + slice_id, + frame, subframe, mbsfn_flag, dl_info); + +} + +/* regular rb and mcs allocation with low priority */ +void +flexran_schedule_ue_spec_be(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info) +{ + + flexran_schedule_ue_spec_common(mod_id, + slice_id, + frame, subframe, mbsfn_flag, dl_info); + +} + +//------------------------------------------------------------------------------ +void +flexran_schedule_ue_spec_common(mid_t mod_id, + int slice_id, + uint32_t frame, + uint32_t subframe, + int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info) +//------------------------------------------------------------------------------ +{ + uint8_t CC_id; + int UE_id; + int N_RBG[MAX_NUM_CCs]; + unsigned char aggregation; + mac_rlc_status_resp_t rlc_status; + unsigned char header_len = 0, header_len_last = 0, ta_len = 0; + uint16_t nb_rb, nb_rb_temp, total_nb_available_rb[MAX_NUM_CCs], + nb_available_rb; + uint16_t TBS, j, rnti; + uint8_t round = 0; + uint8_t harq_pid = 0; + uint16_t sdu_length_total = 0; + int mcs, mcs_tmp; + uint16_t min_rb_unit[MAX_NUM_CCs]; + eNB_MAC_INST *eNB = &eNB_mac_inst[mod_id]; + /* TODO: Must move the helper structs to scheduler implementation */ + UE_list_t *UE_list = &eNB->UE_list; + int32_t normalized_rx_power, target_rx_power; + int32_t tpc = 1; + static int32_t tpc_accumulated = 0; + UE_sched_ctrl *ue_sched_ctl; + LTE_eNB_UE_stats *eNB_UE_stats = NULL; + Protocol__FlexDlData *dl_data[NUM_MAX_UE]; + int num_ues_added = 0; + int channels_added = 0; + + Protocol__FlexDlDci *dl_dci; + Protocol__FlexRlcPdu *rlc_pdus[11]; + uint32_t ce_flags = 0; + + uint8_t rballoc_sub[25]; + int i; + uint32_t data_to_request; + uint32_t dci_tbs; + uint8_t ue_has_transmission = 0; + uint32_t ndi; + +#if 0 + + if (UE_list->head == -1) { + return; + } +#endif + + start_meas(&eNB->schedule_dlsch); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH, VCD_FUNCTION_IN); + + //weight = get_ue_weight(module_idP,UE_id); + aggregation = 1; // set to the maximum aggregation level + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + min_rb_unit[CC_id] = get_min_rb_unit(mod_id, CC_id); + // get number of PRBs less those used by common channels + total_nb_available_rb[CC_id] = flexran_get_N_RB_DL(mod_id, CC_id); + for (i = 0; i < flexran_get_N_RB_DL(mod_id, CC_id); i++) + if (eNB->common_channels[CC_id].vrb_map[i] != 0) + total_nb_available_rb[CC_id]--; + + N_RBG[CC_id] = flexran_get_N_RBG(mod_id, CC_id); + + // store the global enb stats: + eNB->eNB_stats[CC_id].num_dlactive_UEs = UE_list->num_UEs; + eNB->eNB_stats[CC_id].available_prbs = + total_nb_available_rb[CC_id]; + eNB->eNB_stats[CC_id].total_available_prbs += + total_nb_available_rb[CC_id]; + eNB->eNB_stats[CC_id].dlsch_bytes_tx = 0; + eNB->eNB_stats[CC_id].dlsch_pdus_tx = 0; + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR, VCD_FUNCTION_IN); + + start_meas(&eNB->schedule_dlsch_preprocessor); + _dlsch_scheduler_pre_processor(mod_id, + slice_id, + frame, subframe, N_RBG, mbsfn_flag); + stop_meas(&eNB->schedule_dlsch_preprocessor); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_PREPROCESSOR, VCD_FUNCTION_OUT); + + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + LOG_D(MAC, "doing schedule_ue_spec for CC_id %d\n", CC_id); + + if (mbsfn_flag[CC_id] > 0) + continue; + + for (UE_id = UE_list->head; UE_id >= 0; + UE_id = UE_list->next[UE_id]) { + + rnti = flexran_get_ue_crnti(mod_id, UE_id); + eNB_UE_stats = + mac_xface->get_eNB_UE_stats(mod_id, CC_id, rnti); + ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + + if (eNB_UE_stats == NULL) { + LOG_D(MAC, "[eNB] Cannot find eNB_UE_stats\n"); + // mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n"); + continue; + } + + if (flexran_slice_member(UE_id, slice_id) == 0) + continue; + + if (rnti == NOT_A_RNTI) { + LOG_D(MAC, "Cannot find rnti for UE_id %d (num_UEs %d)\n", + UE_id, UE_list->num_UEs); + // mac_xface->macphy_exit("Cannot find rnti for UE_id"); + continue; + } + + switch (mac_xface->get_transmission_mode(mod_id, CC_id, rnti)) { + case 1: + case 2: + case 7: + aggregation = get_aggregation(get_bw_index(mod_id, CC_id), + eNB_UE_stats->DL_cqi[0], + format1); + break; + case 3: + aggregation = get_aggregation(get_bw_index(mod_id, CC_id), + eNB_UE_stats->DL_cqi[0], + format2A); + break; + default: + LOG_W(MAC, "Unsupported transmission mode %d\n", + mac_xface->get_transmission_mode(mod_id, CC_id, + rnti)); + aggregation = 2; + } + + if ((ue_sched_ctl->pre_nb_available_rbs[CC_id] == 0) || // no RBs allocated + CCE_allocation_infeasible(mod_id, CC_id, 0, subframe, + aggregation, rnti)) { + LOG_D(MAC, + "[eNB %d] Frame %d : no RB allocated for UE %d on CC_id %d: continue \n", + mod_id, frame, UE_id, CC_id); + //if(mac_xface->get_transmission_mode(module_idP,rnti)==5) + continue; //to next user (there might be rbs availiable for other UEs in TM5 + // else + // break; + } + + if (flexran_get_duplex_mode(mod_id, CC_id) == + PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + set_ue_dai(subframe, + flexran_get_subframe_assignment(mod_id, CC_id), + UE_id, CC_id, UE_list); + //TODO: update UL DAI after DLSCH scheduling + //set_ul_DAI(mod_id, UE_id, CC_id, frame, subframe,frame_parms); + } + + channels_added = 0; + + // After this point all the UEs will be scheduled + dl_data[num_ues_added] = + (Protocol__FlexDlData *) + malloc(sizeof(Protocol__FlexDlData)); + protocol__flex_dl_data__init(dl_data[num_ues_added]); + dl_data[num_ues_added]->has_rnti = 1; + dl_data[num_ues_added]->rnti = rnti; + dl_data[num_ues_added]->n_rlc_pdu = 0; + dl_data[num_ues_added]->has_serv_cell_index = 1; + dl_data[num_ues_added]->serv_cell_index = CC_id; + + nb_available_rb = ue_sched_ctl->pre_nb_available_rbs[CC_id]; + flexran_get_harq(mod_id, CC_id, UE_id, frame, subframe, + &harq_pid, &round); + sdu_length_total = 0; + mcs = cqi_to_mcs[flexran_get_ue_wcqi(mod_id, UE_id)]; + // LOG_I(FLEXRAN_AGENT, "The MCS is %d\n", mcs); + mcs = cmin(mcs, flexran_slice_maxmcs(slice_id)); +#ifdef EXMIMO + + if (mac_xface->get_transmission_mode(mod_id, CC_id, rnti) == 5) { + mcs = cqi_to_mcs[flexran_get_ue_wcqi(mod_id, UE_id)]; + mcs = cmin(mcs, 16); + } +#endif + + // initializing the rb allocation indicator for each UE + for (j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { + UE_list-> + UE_template[CC_id][UE_id].rballoc_subband[harq_pid][j] + = 0; + rballoc_sub[j] = 0; + } + + /* LOG_D(MAC,"[eNB %d] Frame %d: Scheduling UE %d on CC_id %d (rnti %x, harq_pid %d, round %d, rb %d, cqi %d, mcs %d, rrc %d)\n", */ + /* mod_id, frame, UE_id, CC_id, rnti, harq_pid, round, nb_available_rb, */ + /* eNB_UE_stats->DL_cqi[0], mcs, */ + /* UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status); */ + + dl_dci = + (Protocol__FlexDlDci *) + malloc(sizeof(Protocol__FlexDlDci)); + protocol__flex_dl_dci__init(dl_dci); + dl_data[num_ues_added]->dl_dci = dl_dci; + + + dl_dci->has_rnti = 1; + dl_dci->rnti = rnti; + dl_dci->has_harq_process = 1; + dl_dci->harq_process = harq_pid; + + /* process retransmission */ + if (round > 0) { + + LOG_D(FLEXRAN_AGENT, + "There was a retransmission just now and the round was %d\n", + round); + + if (flexran_get_duplex_mode(mod_id, CC_id) == + PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + UE_list->UE_template[CC_id][UE_id].DAI++; + update_ul_dci(mod_id, CC_id, rnti, + UE_list->UE_template[CC_id][UE_id].DAI); + LOG_D(MAC, + "DAI update: CC_id %d subframeP %d: UE %d, DAI %d\n", + CC_id, subframe, UE_id, + UE_list->UE_template[CC_id][UE_id].DAI); + } + + mcs = UE_list->UE_template[CC_id][UE_id].mcs[harq_pid]; + + // get freq_allocation + nb_rb = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; + + /*TODO: Must add this to FlexRAN agent API */ + dci_tbs = mac_xface->get_TBS_DL(mcs, nb_rb); + + if (nb_rb <= nb_available_rb) { + + if (nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { + for (j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { // for indicating the rballoc for each sub-band + UE_list->UE_template[CC_id][UE_id]. + rballoc_subband[harq_pid][j] = + ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + } + } else { + nb_rb_temp = nb_rb; + j = 0; + + while ((nb_rb_temp > 0) + && (j < flexran_get_N_RBG(mod_id, CC_id))) { + if (ue_sched_ctl->rballoc_sub_UE[CC_id][j] == + 1) { + UE_list-> + UE_template[CC_id] + [UE_id].rballoc_subband[harq_pid][j] = + ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + + if ((j == + flexran_get_N_RBG(mod_id, CC_id) - 1) + && + ((flexran_get_N_RB_DL(mod_id, CC_id) == + 25) + || (flexran_get_N_RB_DL(mod_id, CC_id) + == 50))) { + nb_rb_temp = + nb_rb_temp - min_rb_unit[CC_id] + + 1; + } else { + nb_rb_temp = + nb_rb_temp - min_rb_unit[CC_id]; + } + } + j = j + 1; + } + } + + nb_available_rb -= nb_rb; + PHY_vars_eNB_g[mod_id][CC_id]-> + mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb; + PHY_vars_eNB_g[mod_id][CC_id]-> + mu_mimo_mode[UE_id].dl_pow_off = + ue_sched_ctl->dl_pow_off[CC_id]; + + for (j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { + PHY_vars_eNB_g[mod_id][CC_id]-> + mu_mimo_mode[UE_id].rballoc_sub[j] = + UE_list-> + UE_template[CC_id][UE_id].rballoc_subband + [harq_pid][j]; + rballoc_sub[j] = + UE_list-> + UE_template[CC_id][UE_id].rballoc_subband + [harq_pid][j]; + } + + // Keep the old NDI, do not toggle + ndi = + UE_list->UE_template[CC_id][UE_id]. + oldNDI[harq_pid]; + tpc = + UE_list->UE_template[CC_id][UE_id]. + oldTPC[harq_pid]; + UE_list->UE_template[CC_id][UE_id].mcs[harq_pid] = mcs; + + ue_has_transmission = 1; + num_ues_added++; + } else { + LOG_D(MAC, + "[eNB %d] Frame %d CC_id %d : don't schedule UE %d, its retransmission takes more resources than we have\n", + mod_id, frame, CC_id, UE_id); + ue_has_transmission = 0; + } + //End of retransmission + } else { /* This is a potentially new SDU opportunity */ + rlc_status.bytes_in_buffer = 0; + // Now check RLC information to compute number of required RBs + // get maximum TBS size for RLC request + //TBS = mac_xface->get_TBS(eNB_UE_stats->DL_cqi[0]<<1,nb_available_rb); + TBS = mac_xface->get_TBS_DL(mcs, nb_available_rb); + dci_tbs = TBS; + LOG_D(FLEXRAN_AGENT, "TBS is %d\n", TBS); + + // check first for RLC data on DCCH + // add the length for all the control elements (timing adv, drx, etc) : header + payload + + ta_len = (ue_sched_ctl->ta_update != 0) ? 2 : 0; + + dl_data[num_ues_added]->n_ce_bitmap = 2; + dl_data[num_ues_added]->ce_bitmap = + (uint32_t *) calloc(2, sizeof(uint32_t)); + + if (ta_len > 0) { + ce_flags |= PROTOCOL__FLEX_CE_TYPE__FLPCET_TA; + } + + /*TODO: Add other flags if DRX and other CE are required */ + + // Add the control element flags to the flexran message + dl_data[num_ues_added]->ce_bitmap[0] = ce_flags; + dl_data[num_ues_added]->ce_bitmap[1] = ce_flags; + + // TODO : Need to prioritize DRBs + // Loop through the UE logical channels (DCCH, DCCH1, DTCH for now) + header_len = 0; + header_len_last = 0; + sdu_length_total = 0; + for (j = 1; j < NB_RB_MAX; j++) { + header_len += 3; + // Need to see if we have space for data from this channel + if (dci_tbs - ta_len - header_len - sdu_length_total > + 0) { + LOG_D(MAC, + "[TEST]Requested %d bytes from RLC buffer on channel %d during first call\n", + dci_tbs - ta_len - header_len); + //If we have space, we need to see how much data we can request at most (if any available) + rlc_status = mac_rlc_status_ind(mod_id, rnti, mod_id, frame, subframe, ENB_FLAG_YES, MBMS_FLAG_NO, j, (dci_tbs - ta_len - header_len - sdu_length_total)); // transport block set size + + //If data are available in channel j + if (rlc_status.bytes_in_buffer > 0) { + LOG_D(MAC, + "[TEST]Have %d bytes in DCCH buffer during first call\n", + rlc_status.bytes_in_buffer); + //Fill in as much as possible + data_to_request = + cmin(dci_tbs - ta_len - header_len - + sdu_length_total, + rlc_status.bytes_in_buffer); + LOG_D(FLEXRAN_AGENT, + "Will request %d bytes from channel %d\n", + data_to_request, j); + if (data_to_request < 128) { //The header will be one byte less + header_len--; + header_len_last = 2; + } else { + header_len_last = 3; + } + /* if (j == 1 || j == 2) { + data_to_request+=0; + } */ + LOG_D(MAC, + "[TEST]Will request %d from channel %d\n", + data_to_request, j); + rlc_pdus[channels_added] = + (Protocol__FlexRlcPdu *) + malloc(sizeof(Protocol__FlexRlcPdu)); + protocol__flex_rlc_pdu__init(rlc_pdus + [channels_added]); + rlc_pdus[channels_added]->n_rlc_pdu_tb = 2; + rlc_pdus[channels_added]->rlc_pdu_tb = + (Protocol__FlexRlcPduTb **) + malloc(sizeof(Protocol__FlexRlcPduTb *) * + 2); + rlc_pdus[channels_added]->rlc_pdu_tb[0] = + (Protocol__FlexRlcPduTb *) + malloc(sizeof(Protocol__FlexRlcPduTb)); + protocol__flex_rlc_pdu_tb__init(rlc_pdus + [channels_added]->rlc_pdu_tb + [0]); + rlc_pdus[channels_added]-> + rlc_pdu_tb[0]->has_logical_channel_id = 1; + rlc_pdus[channels_added]-> + rlc_pdu_tb[0]->logical_channel_id = j; + rlc_pdus[channels_added]->rlc_pdu_tb[0]-> + has_size = 1; + rlc_pdus[channels_added]->rlc_pdu_tb[0]->size = + data_to_request; + rlc_pdus[channels_added]->rlc_pdu_tb[1] = + (Protocol__FlexRlcPduTb *) + malloc(sizeof(Protocol__FlexRlcPduTb)); + protocol__flex_rlc_pdu_tb__init(rlc_pdus + [channels_added]->rlc_pdu_tb + [1]); + rlc_pdus[channels_added]-> + rlc_pdu_tb[1]->has_logical_channel_id = 1; + rlc_pdus[channels_added]-> + rlc_pdu_tb[1]->logical_channel_id = j; + rlc_pdus[channels_added]->rlc_pdu_tb[1]-> + has_size = 1; + rlc_pdus[channels_added]->rlc_pdu_tb[1]->size = + data_to_request; + dl_data[num_ues_added]->n_rlc_pdu++; + channels_added++; + //Set this to the max value that we might request + sdu_length_total += data_to_request; + } else { + //Take back the assumption of a header for this channel + header_len -= 3; + } //End rlc_status.bytes_in_buffer <= 0 + } //end of if dci_tbs - ta_len - header_len > 0 + } // End of iterating the logical channels + + // Add rlc_pdus to the dl_data message + dl_data[num_ues_added]->rlc_pdu = (Protocol__FlexRlcPdu **) + malloc(sizeof(Protocol__FlexRlcPdu *) * + dl_data[num_ues_added]->n_rlc_pdu); + for (i = 0; i < dl_data[num_ues_added]->n_rlc_pdu; i++) { + dl_data[num_ues_added]->rlc_pdu[i] = rlc_pdus[i]; + } + + if (header_len == 0) { + LOG_D(FLEXRAN_AGENT, "Header was empty\n"); + header_len_last = 0; + } + // there is a payload + if ((dl_data[num_ues_added]->n_rlc_pdu > 0)) { + // Now compute number of required RBs for total sdu length + // Assume RAH format 2 + // adjust header lengths + LOG_D(FLEXRAN_AGENT, "We have %d bytes to transfer\n", + sdu_length_total); + if (header_len != 0) { + LOG_D(FLEXRAN_AGENT, "Header length was %d ", + header_len); + header_len_last--; + header_len -= header_len_last; + LOG_D(FLEXRAN_AGENT, "so we resized it to %d\n", + header_len); + } + + /* if (header_len == 2 || header_len == 3) { //Only one SDU, remove length field */ + /* header_len = 1; */ + /* } else { //Remove length field from the last SDU */ + /* header_len--; */ + /* } */ + + mcs_tmp = mcs; + if (mcs_tmp == 0) { + nb_rb = 4; // don't let the TBS get too small + } else { + nb_rb = min_rb_unit[CC_id]; + } + + LOG_D(MAC, + "[TEST]The initial number of resource blocks was %d\n", + nb_rb); + LOG_D(MAC, "[TEST] The initial mcs was %d\n", mcs_tmp); + + TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); + LOG_D(MAC, + "[TEST]The TBS during rate matching was %d\n", + TBS); + + while (TBS < (sdu_length_total + header_len + ta_len)) { + nb_rb += min_rb_unit[CC_id]; // + LOG_D(MAC, + "[TEST]Had to increase the number of RBs\n"); + if (nb_rb > nb_available_rb) { // if we've gone beyond the maximum number of RBs + // (can happen if N_RB_DL is odd) + TBS = + mac_xface->get_TBS_DL(mcs_tmp, + nb_available_rb); + nb_rb = nb_available_rb; + break; + } + + TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); + } + + if (nb_rb == ue_sched_ctl->pre_nb_available_rbs[CC_id]) { + LOG_D(MAC, + "[TEST]We had the exact number of rbs. Time to fill the rballoc subband\n"); + for (j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { // for indicating the rballoc for each sub-band + UE_list->UE_template[CC_id][UE_id]. + rballoc_subband[harq_pid][j] = + ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + } + } else { + nb_rb_temp = nb_rb; + j = 0; + LOG_D(MAC, + "[TEST]Will only partially fill the bitmap\n"); + while ((nb_rb_temp > 0) + && (j < flexran_get_N_RBG(mod_id, CC_id))) { + if (ue_sched_ctl->rballoc_sub_UE[CC_id][j] == + 1) { + UE_list-> + UE_template[CC_id] + [UE_id].rballoc_subband[harq_pid][j] = + ue_sched_ctl->rballoc_sub_UE[CC_id][j]; + if ((j == + flexran_get_N_RBG(mod_id, CC_id) - 1) + && + ((flexran_get_N_RB_DL(mod_id, CC_id) == + 25) + || (flexran_get_N_RB_DL(mod_id, CC_id) + == 50))) { + nb_rb_temp = + nb_rb_temp - min_rb_unit[CC_id] + + 1; + } else { + nb_rb_temp = + nb_rb_temp - min_rb_unit[CC_id]; + } + } + j = j + 1; + } + } + + PHY_vars_eNB_g[mod_id][CC_id]-> + mu_mimo_mode[UE_id].pre_nb_available_rbs = nb_rb; + PHY_vars_eNB_g[mod_id][CC_id]-> + mu_mimo_mode[UE_id].dl_pow_off = + ue_sched_ctl->dl_pow_off[CC_id]; + + for (j = 0; j < flexran_get_N_RBG(mod_id, CC_id); j++) { + PHY_vars_eNB_g[mod_id][CC_id]-> + mu_mimo_mode[UE_id].rballoc_sub[j] = + UE_list-> + UE_template[CC_id][UE_id].rballoc_subband + [harq_pid][j]; + } + + // decrease mcs until TBS falls below required length + while ((TBS > (sdu_length_total + header_len + ta_len)) + && (mcs_tmp > 0)) { + mcs_tmp--; + TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); + } + + // if we have decreased too much or we don't have enough RBs, increase MCS + while ((TBS < (sdu_length_total + header_len + ta_len)) + && (((ue_sched_ctl->dl_pow_off[CC_id] > 0) + && (mcs_tmp < 28)) + || ((ue_sched_ctl->dl_pow_off[CC_id] == 0) + && (mcs_tmp <= 15)))) { + mcs_tmp++; + TBS = mac_xface->get_TBS_DL(mcs_tmp, nb_rb); + } + + dci_tbs = TBS; + mcs = mcs_tmp; + LOG_D(FLEXRAN_AGENT, "Final mcs was %d\n", mcs); + + dl_dci->has_aggr_level = 1; + dl_dci->aggr_level = aggregation; + + UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid] = + nb_rb; + + if (flexran_get_duplex_mode(mod_id, CC_id) == + PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + UE_list->UE_template[CC_id][UE_id].DAI++; + // printf("DAI update: subframeP %d: UE %d, DAI %d\n",subframeP,UE_id,UE_list->UE_template[CC_id][UE_id].DAI); + //#warning only for 5MHz channel + update_ul_dci(mod_id, CC_id, rnti, + UE_list->UE_template[CC_id][UE_id]. + DAI); + } + // do PUCCH power control + // this is the normalized RX power + normalized_rx_power = flexran_get_p0_pucch_dbm(mod_id, UE_id, CC_id); //eNB_UE_stats->Po_PUCCH_dBm; + target_rx_power = flexran_get_p0_nominal_pucch(mod_id, CC_id) + 20; //mac_xface->get_target_pucch_rx_power(mod_id, CC_id) + 20; + // this assumes accumulated tpc + // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out + int32_t framex10psubframe = + UE_list->UE_template[CC_id][UE_id]. + pucch_tpc_tx_frame * 10 + + UE_list->UE_template[CC_id][UE_id]. + pucch_tpc_tx_subframe; + + if (((framex10psubframe + 10) <= (frame * 10 + subframe)) || //normal case + ((framex10psubframe > (frame * 10 + subframe)) && (((10240 - framex10psubframe + frame * 10 + subframe) >= 10)))) //frame wrap-around + if (flexran_get_p0_pucch_status + (mod_id, UE_id, CC_id) == 1) { + flexran_update_p0_pucch(mod_id, UE_id, CC_id); + + UE_list-> + UE_template[CC_id] + [UE_id].pucch_tpc_tx_frame = frame; + UE_list-> + UE_template[CC_id] + [UE_id].pucch_tpc_tx_subframe = subframe; + if (normalized_rx_power > + (target_rx_power + 1)) { + tpc = 0; //-1 + tpc_accumulated--; + } else if (normalized_rx_power < + (target_rx_power - 1)) { + tpc = 2; //+1 + tpc_accumulated++; + } else { + tpc = 1; //0 + } + LOG_D(MAC, + "[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n", + mod_id, frame, subframe, harq_pid, tpc, + tpc_accumulated, normalized_rx_power, + target_rx_power); + } // Po_PUCCH has been updated + else { + tpc = 1; //0 + } // time to do TPC update + else { + tpc = 1; //0 + } + + for (i = 0; + i < + PHY_vars_eNB_g[mod_id][CC_id]->frame_parms.N_RBG; + i++) { + rballoc_sub[i] = + UE_list-> + UE_template[CC_id][UE_id].rballoc_subband + [harq_pid][i]; + } + + // Toggle NDI + LOG_D(MAC, + "CC_id %d Frame %d, subframeP %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n", + CC_id, frame, subframe, UE_id, + UE_list->UE_template[CC_id][UE_id].rnti, + harq_pid, + UE_list->UE_template[CC_id][UE_id]. + oldNDI[harq_pid]); + UE_list->UE_template[CC_id][UE_id].oldNDI[harq_pid] = + 1 - + UE_list->UE_template[CC_id][UE_id]. + oldNDI[harq_pid]; + ndi = + UE_list->UE_template[CC_id][UE_id]. + oldNDI[harq_pid]; + + UE_list->UE_template[CC_id][UE_id].mcs[harq_pid] = mcs; + UE_list->UE_template[CC_id][UE_id].oldTPC[harq_pid] = + tpc; + + // Increase the pointer for the number of scheduled UEs + num_ues_added++; + ue_has_transmission = 1; + } else { // There is no data from RLC or MAC header, so don't schedule + ue_has_transmission = 0; + } + } // End of new scheduling + + // If we has transmission or retransmission + if (ue_has_transmission) { + switch (mac_xface-> + get_transmission_mode(mod_id, CC_id, rnti)) { + case 1: + case 2: + default: + dl_dci->has_res_alloc = 1; + dl_dci->res_alloc = 0; + dl_dci->has_vrb_format = 1; + dl_dci->vrb_format = + PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; + dl_dci->has_format = 1; + dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1; + dl_dci->has_rb_bitmap = 1; + dl_dci->rb_bitmap = + allocate_prbs_sub(nb_rb, rballoc_sub); + dl_dci->has_rb_shift = 1; + dl_dci->rb_shift = 0; + dl_dci->n_ndi = 1; + dl_dci->ndi = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_ndi); + dl_dci->ndi[0] = ndi; + dl_dci->n_rv = 1; + dl_dci->rv = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_rv); + dl_dci->rv[0] = round & 3; + dl_dci->has_tpc = 1; + dl_dci->tpc = tpc; + dl_dci->n_mcs = 1; + dl_dci->mcs = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_mcs); + dl_dci->mcs[0] = mcs; + dl_dci->n_tbs_size = 1; + dl_dci->tbs_size = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_tbs_size); + dl_dci->tbs_size[0] = dci_tbs; + if (flexran_get_duplex_mode(mod_id, CC_id) == + PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + dl_dci->has_dai = 1; + dl_dci->dai = + (UE_list->UE_template[CC_id][UE_id].DAI - + 1) & 3; + } + break; + case 3: + dl_dci->has_res_alloc = 1; + dl_dci->res_alloc = 0; + dl_dci->has_vrb_format = 1; + dl_dci->vrb_format = + PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; + dl_dci->has_format = 1; + dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A; + dl_dci->has_rb_bitmap = 1; + dl_dci->rb_bitmap = + allocate_prbs_sub(nb_rb, rballoc_sub); + dl_dci->has_rb_shift = 1; + dl_dci->rb_shift = 0; + dl_dci->n_ndi = 2; + dl_dci->ndi = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_ndi); + dl_dci->ndi[0] = ndi; + dl_dci->ndi[1] = ndi; + dl_dci->n_rv = 2; + dl_dci->rv = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_rv); + dl_dci->rv[0] = round & 3; + dl_dci->rv[1] = round & 3; + dl_dci->has_tpc = 1; + dl_dci->tpc = tpc; + dl_dci->n_mcs = 2; + dl_dci->mcs = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_mcs); + dl_dci->mcs[0] = mcs; + dl_dci->mcs[1] = mcs; + dl_dci->n_tbs_size = 2; + dl_dci->tbs_size = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_tbs_size); + dl_dci->tbs_size[0] = dci_tbs; + dl_dci->tbs_size[1] = dci_tbs; + if (flexran_get_duplex_mode(mod_id, CC_id) == + PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + dl_dci->has_dai = 1; + dl_dci->dai = + (UE_list->UE_template[CC_id][UE_id].DAI - + 1) & 3; + } + break; + case 4: + dl_dci->has_res_alloc = 1; + dl_dci->res_alloc = 0; + dl_dci->has_vrb_format = 1; + dl_dci->vrb_format = + PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; + dl_dci->has_format = 1; + dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_2A; + dl_dci->has_rb_bitmap = 1; + dl_dci->rb_bitmap = + allocate_prbs_sub(nb_rb, rballoc_sub); + dl_dci->has_rb_shift = 1; + dl_dci->rb_shift = 0; + dl_dci->n_ndi = 2; + dl_dci->ndi = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_ndi); + dl_dci->ndi[0] = ndi; + dl_dci->ndi[1] = ndi; + dl_dci->n_rv = 2; + dl_dci->rv = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_rv); + dl_dci->rv[0] = round & 3; + dl_dci->rv[1] = round & 3; + dl_dci->has_tpc = 1; + dl_dci->tpc = tpc; + dl_dci->n_mcs = 2; + dl_dci->mcs = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_mcs); + dl_dci->mcs[0] = mcs; + dl_dci->mcs[1] = mcs; + dl_dci->n_tbs_size = 2; + dl_dci->tbs_size = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_tbs_size); + dl_dci->tbs_size[0] = dci_tbs; + dl_dci->tbs_size[1] = dci_tbs; + if (flexran_get_duplex_mode(mod_id, CC_id) == + PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + dl_dci->has_dai = 1; + dl_dci->dai = + (UE_list->UE_template[CC_id][UE_id].DAI - + 1) & 3; + } + break; + case 5: + dl_dci->has_res_alloc = 1; + dl_dci->res_alloc = 0; + dl_dci->has_vrb_format = 1; + dl_dci->vrb_format = + PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; + dl_dci->has_format = 1; + dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D; + dl_dci->has_rb_bitmap = 1; + dl_dci->rb_bitmap = + allocate_prbs_sub(nb_rb, rballoc_sub); + dl_dci->has_rb_shift = 1; + dl_dci->rb_shift = 0; + dl_dci->n_ndi = 1; + dl_dci->ndi[0] = ndi; + dl_dci->n_rv = 1; + dl_dci->rv = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_rv); + dl_dci->rv[0] = round & 3; + dl_dci->has_tpc = 1; + dl_dci->tpc = tpc; + dl_dci->n_mcs = 1; + dl_dci->mcs = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_mcs); + dl_dci->mcs[0] = mcs; + dl_dci->n_tbs_size = 1; + dl_dci->tbs_size = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_tbs_size); + dl_dci->tbs_size[0] = dci_tbs; + if (flexran_get_duplex_mode(mod_id, CC_id) == + PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + dl_dci->has_dai = 1; + dl_dci->dai = + (UE_list->UE_template[CC_id][UE_id].DAI - + 1) & 3; + } + + if (ue_sched_ctl->dl_pow_off[CC_id] == 2) { + ue_sched_ctl->dl_pow_off[CC_id] = 1; + } + + dl_dci->has_dl_power_offset = 1; + dl_dci->dl_power_offset = + ue_sched_ctl->dl_pow_off[CC_id]; + dl_dci->has_precoding_info = 1; + dl_dci->precoding_info = 5; // Is this right?? + + break; + case 6: + dl_dci->has_res_alloc = 1; + dl_dci->res_alloc = 0; + dl_dci->has_vrb_format = 1; + dl_dci->vrb_format = + PROTOCOL__FLEX_VRB_FORMAT__FLVRBF_LOCALIZED; + dl_dci->has_format = 1; + dl_dci->format = PROTOCOL__FLEX_DCI_FORMAT__FLDCIF_1D; + dl_dci->has_rb_bitmap = 1; + dl_dci->rb_bitmap = + allocate_prbs_sub(nb_rb, rballoc_sub); + dl_dci->has_rb_shift = 1; + dl_dci->rb_shift = 0; + dl_dci->n_ndi = 1; + dl_dci->ndi = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_ndi); + dl_dci->ndi[0] = ndi; + dl_dci->n_rv = 1; + dl_dci->rv = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_rv); + dl_dci->rv[0] = round & 3; + dl_dci->has_tpc = 1; + dl_dci->tpc = tpc; + dl_dci->n_mcs = 1; + dl_dci->mcs = + (uint32_t *) malloc(sizeof(uint32_t) * + dl_dci->n_mcs); + dl_dci->mcs[0] = mcs; + if (flexran_get_duplex_mode(mod_id, CC_id) == + PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + dl_dci->has_dai = 1; + dl_dci->dai = + (UE_list->UE_template[CC_id][UE_id].DAI - + 1) & 3; + } + + dl_dci->has_dl_power_offset = 1; + dl_dci->dl_power_offset = + ue_sched_ctl->dl_pow_off[CC_id]; + dl_dci->has_precoding_info = 1; + dl_dci->precoding_info = 5; // Is this right?? + break; + } + } + + if (flexran_get_duplex_mode(mod_id, CC_id) == + PROTOCOL__FLEX_DUPLEX_MODE__FLDM_TDD) { + + /* TODO */ + //set_ul_DAI(mod_id, UE_id, CC_id, frame, subframe, frame_parms); + } + } // UE_id loop + } // CC_id loop + + // Add all the dl_data elements to the flexran message + int offset = (*dl_info)->dl_mac_config_msg->n_dl_ue_data; + (*dl_info)->dl_mac_config_msg->n_dl_ue_data += num_ues_added; + if (num_ues_added > 0) { + (*dl_info)->dl_mac_config_msg->dl_ue_data = + (Protocol__FlexDlData **) + realloc((*dl_info)->dl_mac_config_msg->dl_ue_data, + sizeof(Protocol__FlexDlData *) * + ((*dl_info)->dl_mac_config_msg->n_dl_ue_data)); + if ((*dl_info)->dl_mac_config_msg->dl_ue_data == NULL) { + LOG_E(MAC, "Request for memory reallocation failed\n"); + return; + } + for (i = 0; i < num_ues_added; i++) { + (*dl_info)->dl_mac_config_msg->dl_ue_data[offset + i] = + dl_data[i]; + } + } + + stop_meas(&eNB->schedule_dlsch); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH, VCD_FUNCTION_OUT); +} diff --git a/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue_remote.c b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue_remote.c new file mode 100644 index 0000000000..68c86f1da5 --- /dev/null +++ b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue_remote.c @@ -0,0 +1,202 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_scheduler_dlsch_ue_remote.c + * \brief procedures related to remote scheduling in the DLSCH transport channel + * \author Xenofon Foukas + * \date 2016 + * \email: x.foukas@sms.ed.ac.uk + * \version 0.1 + * @ingroup _mac + + */ + +#include "flexran_agent_common_internal.h" + +#include "flexran_agent_scheduler_dlsch_ue_remote.h" + +#include "LAYER2/MAC/defs.h" +#include "LAYER2/MAC/extern.h" + +struct DlMacConfigHead queue_head; + +int queue_initialized = 0; + +//uint32_t skip_subframe = 1; +//uint32_t period = 10; +//uint32_t sched [] = {1, 2, 3}; + +void +flexran_schedule_ue_spec_remote(mid_t mod_id, uint32_t frame, + uint32_t subframe, int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info) +{ + + + //if ((subframe == skip_subframe) && (frame % period == 0)) { + // LOG_I(MAC, "Will skip subframe %d %d\n", subframe, frame); + // for (int i = 0; i < 3; i++) { + // LOG_I(MAC, "%d\n", sched[i]); + // } + //} + + /* if (frame == 500 && subframe == 1) { */ + /* char policy[] = "rrc: \n - ul_scheduler: \n behavior : tester_function\n parameters:\n period: !!int 3\nmac: \n - dl_scheduler: \n parameters: \n period : !!int 40\n skip_subframe : !!int 3\n sched : [!!int 4, !!int 5, !!int 6]"; */ + /* apply_reconfiguration_policy(mod_id, policy, strlen(policy)); */ + /* } */ + + eNB_MAC_INST *eNB; + + if (!queue_initialized) { + TAILQ_INIT(&queue_head); + queue_initialized = 1; + } + + eNB = &eNB_mac_inst[mod_id]; + + dl_mac_config_element_t *dl_config_elem; + + int diff; + LOG_D(MAC, "[TEST] Current frame and subframe %d, %d\n", frame, + subframe); + // First we check to see if we have a scheduling decision for this sfn_sf already in our queue + while (queue_head.tqh_first != NULL) { + dl_config_elem = queue_head.tqh_first; + + diff = + get_sf_difference(mod_id, + dl_config_elem->dl_info-> + dl_mac_config_msg->sfn_sf); + // Check if this decision is for now, for a later or a previous subframe + if (diff == 0) { // Now + LOG_D(MAC, + "Found a decision for this subframe in the queue. Let's use it!\n"); + TAILQ_REMOVE(&queue_head, queue_head.tqh_first, configs); + *dl_info = dl_config_elem->dl_info; + free(dl_config_elem); + eNB->eNB_stats[mod_id].sched_decisions++; + return; + } else if (diff < 0) { //previous subframe , delete message and free memory + LOG_D(MAC, + "Found a decision for a previous subframe in the queue. Let's get rid of it\n"); + TAILQ_REMOVE(&queue_head, queue_head.tqh_first, configs); + flexran_agent_mac_destroy_dl_config(dl_config_elem->dl_info); + free(dl_config_elem); + eNB->eNB_stats[mod_id].sched_decisions++; + eNB->eNB_stats[mod_id].missed_deadlines++; + } else { // next subframe, nothing to do now + LOG_D(MAC, + "Found a decision for a future subframe in the queue. Nothing to do now\n"); + flexran_agent_mac_create_empty_dl_config(mod_id, dl_info); + return; + } + } + + //Done with the local cache. Now we need to check if something new arrived + flexran_agent_get_pending_dl_mac_config(mod_id, dl_info); + while (*dl_info != NULL) { + + diff = + get_sf_difference(mod_id, + (*dl_info)->dl_mac_config_msg->sfn_sf); + if (diff == 0) { // Got a command for this sfn_sf + LOG_D(MAC, + "Found a decision for this subframe pending. Let's use it\n"); + eNB->eNB_stats[mod_id].sched_decisions++; + return; + } else if (diff < 0) { + LOG_D(MAC, + "Found a decision for a previous subframe. Let's get rid of it\n"); + flexran_agent_mac_destroy_dl_config(*dl_info); + *dl_info = NULL; + flexran_agent_get_pending_dl_mac_config(mod_id, dl_info); + eNB->eNB_stats[mod_id].sched_decisions++; + eNB->eNB_stats[mod_id].missed_deadlines++; + } else { // Intended for future subframe. Store it in local cache + LOG_D(MAC, + "Found a decision for a future subframe in the queue. Let's store it in the cache\n"); + dl_mac_config_element_t *e = + malloc(sizeof(dl_mac_config_element_t)); + e->dl_info = *dl_info; + TAILQ_INSERT_TAIL(&queue_head, e, configs); + flexran_agent_mac_create_empty_dl_config(mod_id, dl_info); + // No need to look for another. Messages arrive ordered + return; + } + } + + // We found no pending command, so we will simply pass an empty one + flexran_agent_mac_create_empty_dl_config(mod_id, dl_info); +} + +int get_sf_difference(mid_t mod_id, uint32_t sfn_sf) +{ + int diff_in_subframes; + + uint16_t current_frame = flexran_get_current_system_frame_num(mod_id); + uint16_t current_subframe = flexran_get_current_subframe(mod_id); + uint32_t current_sfn_sf = flexran_get_sfn_sf(mod_id); + + if (sfn_sf == current_sfn_sf) { + return 0; + } + + uint16_t frame_mask = ((1 << 12) - 1); + uint16_t frame = (sfn_sf & (frame_mask << 4)) >> 4; + + uint16_t sf_mask = ((1 << 4) - 1); + uint16_t subframe = (sfn_sf & sf_mask); + + LOG_D(MAC, "[TEST] Target frame and subframe %d, %d\n", frame, + subframe); + + if (frame == current_frame) { + return subframe - current_subframe; + } else if (frame > current_frame) { + diff_in_subframes = + ((frame * 10) + subframe) - ((current_frame * 10) + + current_subframe); + + // diff_in_subframes = 9 - current_subframe; + //diff_in_subframes += (subframe + 1); + //diff_in_subframes += (frame-2) * 10; + if (diff_in_subframes > SCHED_AHEAD_SUBFRAMES) { + return -1; + } else { + return 1; + } + } else { //frame < current_frame + //diff_in_subframes = 9 - current_subframe; + //diff_in_subframes += (subframe + 1); + //if (frame > 0) { + // diff_in_subframes += (frame - 1) * 10; + //} + //diff_in_subframes += (1023 - current_frame) * 10; + diff_in_subframes = + 10240 - ((current_frame * 10) + current_subframe) + + ((frame * 10) + subframe); + if (diff_in_subframes > SCHED_AHEAD_SUBFRAMES) { + return -1; + } else { + return 1; + } + } +} diff --git a/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue_remote.h b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue_remote.h new file mode 100644 index 0000000000..449ba1e8cd --- /dev/null +++ b/openair2/LAYER2/MAC/flexran_agent_scheduler_dlsch_ue_remote.h @@ -0,0 +1,70 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_agent_scheduler_dlsch_ue_remote.h + * \brief Local stub for remote scheduler used by the controller + * \author Xenofon Foukas + * \date 2016 + * \email: x.foukas@sms.ed.ac.uk + * \version 0.1 + * @ingroup _mac + + */ + +#ifndef __LAYER2_MAC_FLEXRAN_AGENT_SCHEDULER_DLSCH_UE_REMOTE_H__ +#define __LAYER2_MAC_FLEXRAN_AGENT_SCHEDULER_DLSCH_UE_REMOTE_H___ + +#include "flexran.pb-c.h" +#include "header.pb-c.h" + +#include "ENB_APP/flexran_agent_defs.h" +#include "flexran_agent_mac.h" +#include "LAYER2/MAC/flexran_agent_mac_proto.h" + +#include + +// Maximum value of schedule ahead of time +// Required to identify if a dl_command is for the future or not +#define SCHED_AHEAD_SUBFRAMES 20 + +typedef struct dl_mac_config_element_s { + Protocol__FlexranMessage *dl_info; + TAILQ_ENTRY(dl_mac_config_element_s) configs; +} dl_mac_config_element_t; + +TAILQ_HEAD(DlMacConfigHead, dl_mac_config_element_s); + +/* + * Default scheduler used by the eNB agent + */ +void flexran_schedule_ue_spec_remote(mid_t mod_id, uint32_t frame, + uint32_t subframe, int *mbsfn_flag, + Protocol__FlexranMessage ** dl_info); + + +// Find the difference in subframes from the given subframe +// negative for older value +// 0 for equal +// positive for future value +// Based on +int get_sf_difference(mid_t mod_id, uint32_t sfn_sf); + +#endif diff --git a/openair2/LAYER2/MAC/flexran_dci_conversions.h b/openair2/LAYER2/MAC/flexran_dci_conversions.h new file mode 100644 index 0000000000..5c18b43104 --- /dev/null +++ b/openair2/LAYER2/MAC/flexran_dci_conversions.h @@ -0,0 +1,51 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file flexran_dci_conversions.h + * \brief Conversion helpers from flexran messages to OAI formats DCI + * \author Xenofon Foukas + * \date 2016 + * \version 0.1 + */ + +#ifndef LAYER2_MAC_FLEXRAN_DCI_CONVERISIONS_H__ +#define LAYER2_MAC_DCI_FLEXRAN_CONVERISIONS_H__ + +#define FILL_DCI_FDD_1(TYPE, DCI, FLEXRAN_DCI) \ + ((TYPE*)DCI)->harq_pid = FLEXRAN_DCI->harq_process; \ + ((TYPE*)DCI)->rv = FLEXRAN_DCI->rv[0]; \ + ((TYPE*)DCI)->rballoc = FLEXRAN_DCI->rb_bitmap; \ + ((TYPE*)DCI)->rah = FLEXRAN_DCI->res_alloc; \ + ((TYPE*)DCI)->mcs = FLEXRAN_DCI->mcs[0]; \ + ((TYPE*)DCI)->TPC = FLEXRAN_DCI->tpc; \ + ((TYPE*)DCI)->ndi = FLEXRAN_DCI->ndi[0]; + +#define FILL_DCI_TDD_1(TYPE, DCI, FLEXRAN_DCI) \ + ((TYPE*)DCI)->harq_pid = FLEXRAN_DCI->harq_process; \ + ((TYPE*)DCI)->rv = FLEXRAN_DCI->rv[0]; \ + ((TYPE*)DCI)->dai = FLEXRAN_DCI->dai; \ + ((TYPE*)DCI)->rballoc = FLEXRAN_DCI->rb_bitmap; \ + ((TYPE*)DCI)->rah = FLEXRAN_DCI->res_alloc; \ + ((TYPE*)DCI)->mcs = FLEXRAN_DCI->mcs[0]; \ + ((TYPE*)DCI)->TPC = FLEXRAN_DCI->tpc; \ + ((TYPE*)DCI)->ndi = FLEXRAN_DCI->ndi[0]; + +#endif diff --git a/openair2/LAYER2/MAC/l1_helpers.c b/openair2/LAYER2/MAC/l1_helpers.c index 44bdbfe00e..6e71f66ec5 100644 --- a/openair2/LAYER2/MAC/l1_helpers.c +++ b/openair2/LAYER2/MAC/l1_helpers.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file l1_helper.c * \brief phy helper function * \author Navid Nikaein, Raymond Knopp @@ -41,39 +34,36 @@ #include "UTIL/LOG/log.h" #include "proto.h" -int8_t get_Po_NOMINAL_PUSCH(module_id_t module_idP,uint8_t CC_id) +int8_t get_Po_NOMINAL_PUSCH(module_id_t module_idP, uint8_t CC_id) { - RACH_ConfigCommon_t *rach_ConfigCommon = NULL; + RACH_ConfigCommon_t *rach_ConfigCommon = NULL; - if (CC_id>0) { - LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - //mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return 0; - } + AssertFatal(CC_id == 0, + "Transmission on secondary CCs is not supported yet\n"); + AssertFatal(UE_mac_inst[module_idP].radioResourceConfigCommon != NULL, + "[UE %d] CCid %d FATAL radioResourceConfigCommon is NULL !!!\n", + module_idP, CC_id); - if (UE_mac_inst[module_idP].radioResourceConfigCommon) { - rach_ConfigCommon = &UE_mac_inst[module_idP].radioResourceConfigCommon->rach_ConfigCommon; - } - else { - LOG_E(MAC,"[UE %d] CCid %d FATAL radioResourceConfigCommon is NULL !!!\n",module_idP,CC_id); - //mac_xface->macphy_exit("FATAL radioResourceConfigCommon is NULL"); - return 0; - } + rach_ConfigCommon = + &UE_mac_inst[module_idP].radioResourceConfigCommon-> + rach_ConfigCommon; - return(-120 + (rach_ConfigCommon->powerRampingParameters.preambleInitialReceivedTargetPower<<1) + - get_DELTA_PREAMBLE(module_idP,CC_id)); + return (-120 + + (rach_ConfigCommon-> + powerRampingParameters.preambleInitialReceivedTargetPower << + 1) + get_DELTA_PREAMBLE(module_idP, CC_id)); } -int8_t get_deltaP_rampup(module_id_t module_idP,uint8_t CC_id) +int8_t get_deltaP_rampup(module_id_t module_idP, uint8_t CC_id) { - if (CC_id>0) { - LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return 0; // not reached - } + AssertFatal(CC_id == 0, + "Transmission on secondary CCs is not supported yet\n"); - LOG_D(MAC,"[PUSCH]%d dB\n",UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER<<1); - return((int8_t)(UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER<<1)); + LOG_D(MAC, "[PUSCH]%d dB\n", + UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER << 1); + return ((int8_t) + (UE_mac_inst[module_idP]. + RA_PREAMBLE_TRANSMISSION_COUNTER << 1)); } diff --git a/openair2/LAYER2/MAC/lte_transport_init.c b/openair2/LAYER2/MAC/lte_transport_init.c old mode 100755 new mode 100644 index fa446a4aee..e1f21f21e4 --- a/openair2/LAYER2/MAC/lte_transport_init.c +++ b/openair2/LAYER2/MAC/lte_transport_init.c @@ -1,35 +1,27 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -#define UL_RB_ALLOC mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,0,24) -#define BCCH_RB_ALLOC mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,0,4) -#define RA_RB_ALLOC mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,0,4) +#define UL_RB_ALLOC mac_xface->computeRIV(mac_xface->frame_parms->N_RB_UL,0,24) +#define BCCH_RB_ALLOC mac_xface->computeRIV(mac_xface->frame_parms->N_RB_UL,0,4) +#define RA_RB_ALLOC mac_xface->computeRIV(mac_xface->frame_parms->N_RB_UL,0,4) #define DLSCH_RB_ALLOC 0x1fff #include "extern.h" @@ -37,104 +29,104 @@ void init_transport_channels(unsigned char transmission_mode) { - // init DCI structures for testing + // init DCI structures for testing - UL_alloc_pdu.type = 0; - UL_alloc_pdu.hopping = 0; - UL_alloc_pdu.rballoc = UL_RB_ALLOC; - UL_alloc_pdu.mcs = 2; - UL_alloc_pdu.ndi = 1; - UL_alloc_pdu.TPC = 0; - UL_alloc_pdu.cqi_req = 1; + UL_alloc_pdu.type = 0; + UL_alloc_pdu.hopping = 0; + UL_alloc_pdu.rballoc = UL_RB_ALLOC; + UL_alloc_pdu.mcs = 2; + UL_alloc_pdu.ndi = 1; + UL_alloc_pdu.TPC = 0; + UL_alloc_pdu.cqi_req = 1; - /* - BCCH_alloc_pdu.type = 1; - BCCH_alloc_pdu.vrb_type = 0; - BCCH_alloc_pdu.rballoc = BCCH_RB_ALLOC; - BCCH_alloc_pdu.ndi = 1; - BCCH_alloc_pdu.rv = 1; - BCCH_alloc_pdu.mcs = 1; - BCCH_alloc_pdu.harq_pid = 0; - BCCH_alloc_pdu.TPC = 1; // set to 3 PRB + /* + BCCH_alloc_pdu.type = 1; + BCCH_alloc_pdu.vrb_type = 0; + BCCH_alloc_pdu.rballoc = BCCH_RB_ALLOC; + BCCH_alloc_pdu.ndi = 1; + BCCH_alloc_pdu.rv = 1; + BCCH_alloc_pdu.mcs = 1; + BCCH_alloc_pdu.harq_pid = 0; + BCCH_alloc_pdu.TPC = 1; // set to 3 PRB - // for FDD mode - BCCH_alloc_pdu_fdd.type = 1; - BCCH_alloc_pdu_fdd.vrb_type = 0; - BCCH_alloc_pdu_fdd.rballoc = BCCH_RB_ALLOC; - BCCH_alloc_pdu_fdd.ndi = 1; - BCCH_alloc_pdu_fdd.rv = 1; - BCCH_alloc_pdu_fdd.mcs = 1; - BCCH_alloc_pdu_fdd.harq_pid = 0; - BCCH_alloc_pdu_fdd.TPC = 1; // set to 3 PRB - */ + // for FDD mode + BCCH_alloc_pdu_fdd.type = 1; + BCCH_alloc_pdu_fdd.vrb_type = 0; + BCCH_alloc_pdu_fdd.rballoc = BCCH_RB_ALLOC; + BCCH_alloc_pdu_fdd.ndi = 1; + BCCH_alloc_pdu_fdd.rv = 1; + BCCH_alloc_pdu_fdd.mcs = 1; + BCCH_alloc_pdu_fdd.harq_pid = 0; + BCCH_alloc_pdu_fdd.TPC = 1; // set to 3 PRB + */ - DLSCH_alloc_pdu1A.type = 1; - DLSCH_alloc_pdu1A.vrb_type = 0; - DLSCH_alloc_pdu1A.rballoc = BCCH_RB_ALLOC; - DLSCH_alloc_pdu1A.ndi = 1; - DLSCH_alloc_pdu1A.rv = 1; - DLSCH_alloc_pdu1A.mcs = 2; - DLSCH_alloc_pdu1A.harq_pid = 0; - DLSCH_alloc_pdu1A.TPC = 1; // set to 3 PRB + DLSCH_alloc_pdu1A.type = 1; + DLSCH_alloc_pdu1A.vrb_type = 0; + DLSCH_alloc_pdu1A.rballoc = BCCH_RB_ALLOC; + DLSCH_alloc_pdu1A.ndi = 1; + DLSCH_alloc_pdu1A.rv = 1; + DLSCH_alloc_pdu1A.mcs = 2; + DLSCH_alloc_pdu1A.harq_pid = 0; + DLSCH_alloc_pdu1A.TPC = 1; // set to 3 PRB - DLSCH_alloc_pdu1A_fdd.type = 1; - DLSCH_alloc_pdu1A_fdd.vrb_type = 0; - DLSCH_alloc_pdu1A_fdd.rballoc = BCCH_RB_ALLOC; - DLSCH_alloc_pdu1A_fdd.ndi = 1; - DLSCH_alloc_pdu1A_fdd.rv = 1; - DLSCH_alloc_pdu1A_fdd.mcs = 2; - DLSCH_alloc_pdu1A_fdd.harq_pid = 0; - DLSCH_alloc_pdu1A_fdd.TPC = 1; // set to 3 PRB + DLSCH_alloc_pdu1A_fdd.type = 1; + DLSCH_alloc_pdu1A_fdd.vrb_type = 0; + DLSCH_alloc_pdu1A_fdd.rballoc = BCCH_RB_ALLOC; + DLSCH_alloc_pdu1A_fdd.ndi = 1; + DLSCH_alloc_pdu1A_fdd.rv = 1; + DLSCH_alloc_pdu1A_fdd.mcs = 2; + DLSCH_alloc_pdu1A_fdd.harq_pid = 0; + DLSCH_alloc_pdu1A_fdd.TPC = 1; // set to 3 PRB - RA_alloc_pdu.type = 1; - RA_alloc_pdu.vrb_type = 0; - RA_alloc_pdu.rballoc = RA_RB_ALLOC; - RA_alloc_pdu.ndi = 1; - RA_alloc_pdu.rv = 0; - RA_alloc_pdu.mcs = 0; - RA_alloc_pdu.harq_pid = 0; - RA_alloc_pdu.TPC = 1; + RA_alloc_pdu.type = 1; + RA_alloc_pdu.vrb_type = 0; + RA_alloc_pdu.rballoc = RA_RB_ALLOC; + RA_alloc_pdu.ndi = 1; + RA_alloc_pdu.rv = 0; + RA_alloc_pdu.mcs = 0; + RA_alloc_pdu.harq_pid = 0; + RA_alloc_pdu.TPC = 1; - RA_alloc_pdu_fdd.type = 1; - RA_alloc_pdu_fdd.vrb_type = 0; - RA_alloc_pdu_fdd.rballoc = RA_RB_ALLOC; - RA_alloc_pdu_fdd.ndi = 1; - RA_alloc_pdu_fdd.rv = 1; - RA_alloc_pdu_fdd.mcs = 1; - RA_alloc_pdu_fdd.harq_pid = 0; - RA_alloc_pdu_fdd.TPC = 1; + RA_alloc_pdu_fdd.type = 1; + RA_alloc_pdu_fdd.vrb_type = 0; + RA_alloc_pdu_fdd.rballoc = RA_RB_ALLOC; + RA_alloc_pdu_fdd.ndi = 1; + RA_alloc_pdu_fdd.rv = 1; + RA_alloc_pdu_fdd.mcs = 1; + RA_alloc_pdu_fdd.harq_pid = 0; + RA_alloc_pdu_fdd.TPC = 1; - DLSCH_alloc_pdu1.rballoc = 0xf; - DLSCH_alloc_pdu1.TPC = 0; - DLSCH_alloc_pdu1.dai = 0; - DLSCH_alloc_pdu1.harq_pid = 0; - DLSCH_alloc_pdu1.tb_swap = 0; - DLSCH_alloc_pdu1.mcs1 = 4; - DLSCH_alloc_pdu1.ndi1 = 1; - DLSCH_alloc_pdu1.rv1 = 0; + DLSCH_alloc_pdu1.rballoc = 0xf; + DLSCH_alloc_pdu1.TPC = 0; + DLSCH_alloc_pdu1.dai = 0; + DLSCH_alloc_pdu1.harq_pid = 0; + DLSCH_alloc_pdu1.tb_swap = 0; + DLSCH_alloc_pdu1.mcs1 = 4; + DLSCH_alloc_pdu1.ndi1 = 1; + DLSCH_alloc_pdu1.rv1 = 0; - // Forget second codeword - if (transmission_mode == 6) { - DLSCH_alloc_pdu1.tpmi = 5; // PUSCH_PRECODING0 - } else { - DLSCH_alloc_pdu1.tpmi = 0; - } + // Forget second codeword + if (transmission_mode == 6) { + DLSCH_alloc_pdu1.tpmi = 5; // PUSCH_PRECODING0 + } else { + DLSCH_alloc_pdu1.tpmi = 0; + } - DLSCH_alloc_pdu2.rah = 0; - DLSCH_alloc_pdu2.rballoc = DLSCH_RB_ALLOC; - DLSCH_alloc_pdu2.TPC = 0; - DLSCH_alloc_pdu2.dai = 0; - DLSCH_alloc_pdu2.harq_pid = 0; - DLSCH_alloc_pdu2.tb_swap = 0; - DLSCH_alloc_pdu2.mcs1 = 4; - DLSCH_alloc_pdu2.ndi1 = 1; - DLSCH_alloc_pdu2.rv1 = 0; + DLSCH_alloc_pdu2.rah = 0; + DLSCH_alloc_pdu2.rballoc = DLSCH_RB_ALLOC; + DLSCH_alloc_pdu2.TPC = 0; + DLSCH_alloc_pdu2.dai = 0; + DLSCH_alloc_pdu2.harq_pid = 0; + DLSCH_alloc_pdu2.tb_swap = 0; + DLSCH_alloc_pdu2.mcs1 = 4; + DLSCH_alloc_pdu2.ndi1 = 1; + DLSCH_alloc_pdu2.rv1 = 0; - // Forget second codeword - if (transmission_mode == 6) { - DLSCH_alloc_pdu2.tpmi = 5; // PUSCH_PRECODING0 - } else { - DLSCH_alloc_pdu2.tpmi = 0; - } + // Forget second codeword + if (transmission_mode == 6) { + DLSCH_alloc_pdu2.tpmi = 5; // PUSCH_PRECODING0 + } else { + DLSCH_alloc_pdu2.tpmi = 0; + } } diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index d5a445744d..afee163203 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file main.c * \brief top init of Layer 2 * \author Navid Nikaein and Raymond Knopp @@ -36,529 +29,176 @@ */ -#ifdef USER_MODE -#include "LAYER2/register.h" -#else -#ifdef KERNEL2_6 -//#include -#include -#endif - -#ifdef KERNEL2_4 -#include -#include -#endif - - -#endif //USER_MODE - #include "defs.h" #include "proto.h" #include "extern.h" #include "assertions.h" #include "PHY_INTERFACE/extern.h" -#include "PHY_INTERFACE/defs.h" #include "PHY/defs.h" #include "SCHED/defs.h" #include "LAYER2/PDCP_v10.1.0/pdcp.h" #include "RRC/LITE/defs.h" #include "UTIL/LOG/log.h" #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" -#ifdef PHY_EMUL -#include "SIMULATION/simulation_defs.h" -#endif //PHY_EMUL #include "SCHED/defs.h" -void dl_phy_sync_success(module_id_t module_idP, - frame_t frameP, - unsigned char eNB_index, - uint8_t first_sync) //init as MR -{ - LOG_D(MAC,"[UE %d] Frame %d: PHY Sync to eNB_index %d successful \n", module_idP, frameP, eNB_index); -#if ! defined(ENABLE_USE_MME) - if (first_sync==1) { - layer2_init_UE(module_idP); - openair_rrc_ue_init(module_idP,eNB_index); - } else -#endif - { - rrc_in_sync_ind(module_idP,frameP,eNB_index); - } +#include "common/ran_context.h" -} +extern RAN_CONTEXT_t RC; -void mrbch_phy_sync_failure(module_id_t module_idP, frame_t frameP, uint8_t free_eNB_index) //init as CH + +void mac_top_init_eNB(void) { - LOG_I(MAC,"[eNB %d] Frame %d: PHY Sync failure \n",module_idP,frameP); - layer2_init_eNB(module_idP, free_eNB_index); - openair_rrc_eNB_init(module_idP); -} + module_id_t i, j; + int list_el; + UE_list_t *UE_list; + eNB_MAC_INST *mac; -char layer2_init_eNB(module_id_t module_idP, unsigned char eNB_index) -{ + LOG_I(MAC, "[MAIN] Init function start:nb_macrlc_inst=%d\n", + RC.nb_macrlc_inst); - return 0; + if (RC.nb_macrlc_inst > 0) { + RC.mac = + (eNB_MAC_INST **) malloc16(RC.nb_macrlc_inst * + sizeof(eNB_MAC_INST *)); + AssertFatal(RC.mac != NULL, + "can't ALLOCATE %zu Bytes for %d eNB_MAC_INST with size %zu \n", + RC.nb_macrlc_inst * sizeof(eNB_MAC_INST *), + RC.nb_macrlc_inst, sizeof(eNB_MAC_INST)); + for (i = 0; i < RC.nb_macrlc_inst; i++) { + RC.mac[i] = (eNB_MAC_INST *) malloc16(sizeof(eNB_MAC_INST)); + AssertFatal(RC.mac != NULL, + "can't ALLOCATE %zu Bytes for %d eNB_MAC_INST with size %zu \n", + RC.nb_macrlc_inst * sizeof(eNB_MAC_INST *), + RC.nb_macrlc_inst, sizeof(eNB_MAC_INST)); + LOG_D(MAC, + "[MAIN] ALLOCATE %zu Bytes for %d eNB_MAC_INST @ %p\n", + sizeof(eNB_MAC_INST), RC.nb_macrlc_inst, RC.mac); + bzero(RC.mac[i], sizeof(eNB_MAC_INST)); + RC.mac[i]->Mod_id = i; + for (j = 0; j < MAX_NUM_CCs; j++) { + RC.mac[i]->DL_req[j].dl_config_request_body. + dl_config_pdu_list = RC.mac[i]->dl_config_pdu_list[j]; + RC.mac[i]->UL_req[j].ul_config_request_body. + ul_config_pdu_list = RC.mac[i]->ul_config_pdu_list[j]; + for (int k = 0; k < 10; k++) + RC.mac[i]->UL_req_tmp[j][k]. + ul_config_request_body.ul_config_pdu_list = + RC.mac[i]->ul_config_pdu_list_tmp[j][k]; + RC.mac[i]->HI_DCI0_req[j]. + hi_dci0_request_body.hi_dci0_pdu_list = + RC.mac[i]->hi_dci0_pdu_list[j]; + RC.mac[i]->TX_req[j].tx_request_body.tx_pdu_list = + RC.mac[i]->tx_request_pdu[j]; + RC.mac[i]->ul_handle = 0; + } + } -} + AssertFatal(rlc_module_init() == 0, + "Could not initialize RLC layer\n"); -char layer2_init_UE(module_id_t module_idP) -{ + // These should be out of here later + pdcp_layer_init(); - return 0; -} + rrc_init_global_param(); -void mac_UE_out_of_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t eNB_index) -{ - - // Mac_rlc_xface->mac_out_of_sync_ind(Mod_id, frameP, eNB_index); -} - - -int mac_top_init(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, uint8_t HO_active) -{ - - module_id_t Mod_id,i,j; - RA_TEMPLATE *RA_template; - UE_TEMPLATE *UE_template; - int size_bytes1,size_bytes2,size_bits1,size_bits2; - int CC_id; - int list_el; - UE_list_t *UE_list; - - LOG_I(MAC,"[MAIN] Init function start:Nb_UE_INST=%d\n",NB_UE_INST); - - if (NB_UE_INST>0) { - UE_mac_inst = (UE_MAC_INST*)malloc16(NB_UE_INST*sizeof(UE_MAC_INST)); - - if (UE_mac_inst == NULL) { - LOG_C(MAC,"[MAIN] Can't ALLOCATE %d Bytes for %d UE_MAC_INST with size %d \n",NB_UE_INST*sizeof(UE_MAC_INST),NB_UE_INST,sizeof(UE_MAC_INST)); - mac_xface->macphy_exit("[MAC][MAIN] not enough memory for UEs \n"); - } - - LOG_D(MAC,"[MAIN] ALLOCATE %d Bytes for %d UE_MAC_INST @ %p\n",NB_UE_INST*sizeof(UE_MAC_INST),NB_UE_INST,UE_mac_inst); - - bzero(UE_mac_inst,NB_UE_INST*sizeof(UE_MAC_INST)); - - for(i=0; i0) { - eNB_mac_inst = (eNB_MAC_INST*)malloc16(NB_eNB_INST*sizeof(eNB_MAC_INST)); - - if (eNB_mac_inst == NULL) { - LOG_D(MAC,"[MAIN] can't ALLOCATE %d Bytes for %d eNB_MAC_INST with size %d \n",NB_eNB_INST*sizeof(eNB_MAC_INST*),NB_eNB_INST,sizeof(eNB_MAC_INST)); - mac_xface->macphy_exit("[MAC][MAIN] not enough memory for eNB \n"); } else { - LOG_D(MAC,"[MAIN] ALLOCATE %d Bytes for %d eNB_MAC_INST @ %p\n",sizeof(eNB_MAC_INST),NB_eNB_INST,eNB_mac_inst); - bzero(eNB_mac_inst,NB_eNB_INST*sizeof(eNB_MAC_INST)); - } - } else { - eNB_mac_inst = NULL; - } - - // Initialize Linked-List for Active UEs - for(Mod_id=0; Mod_idnum_UEs=0; - UE_list->head=-1; - UE_list->head_ul=-1; - UE_list->avail=0; - - for (list_el=0; list_elnext[list_el]=list_el+1; - UE_list->next_ul[list_el]=list_el+1; + RC.mac = NULL; } - UE_list->next[list_el]=-1; - UE_list->next_ul[list_el]=-1; - -#ifdef PHY_EMUL - Mac_rlc_xface->Is_cluster_head[Mod_id]=2;//0: MR, 1: CH, 2: not CH neither MR -#endif - /*#ifdef Rel10 - int n; - for (n=0;n<4096;n++) - eNB_mac_inst[Mod_id].MCH_pdu.payload[n] = taus(); - // Mac_rlc_xface->Node_id[Mod_id]=NODE_ID[Mod_id]; - #endif*/ - } - - // Mac_rlc_xface->frame=Mac_rlc_xface->frame; + // Initialize Linked-List for Active UEs + for (i = 0; i < RC.nb_macrlc_inst; i++) { + mac = RC.mac[i]; - if (Is_rrc_registered == 1) { - LOG_I(MAC,"[MAIN] calling RRC\n"); -#ifndef CELLULAR //nothing to be done yet for cellular - openair_rrc_top_init(eMBMS_active, uecap_xer, cba_group_active,HO_active); -#endif - } else { - LOG_I(MAC,"[MAIN] Running without an RRC\n"); - } + mac->if_inst = IF_Module_init(i); -#ifndef USER_MODE -#ifndef PHY_EMUL - LOG_I(MAC,"[MAIN] add openair2 proc\n"); - //// add_openair2_stats(); -#endif -#endif + UE_list = &mac->UE_list; - //init_transport_channels(2); + UE_list->num_UEs = 0; + UE_list->head = -1; + UE_list->head_ul = -1; + UE_list->avail = 0; - // Set up DCIs for TDD 5MHz Config 1..6 + for (list_el = 0; list_el < NUMBER_OF_UE_MAX - 1; list_el++) { + UE_list->next[list_el] = list_el + 1; + UE_list->next_ul[list_el] = list_el + 1; + } - for (i=0; ilte_frame_parms->frame_type == TDD) { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - size_bytes1 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - size_bytes2 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - size_bits1 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - size_bits2 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - break; - - case 25: - size_bytes1 = sizeof(DCI1A_5MHz_TDD_1_6_t); - size_bytes2 = sizeof(DCI1A_5MHz_TDD_1_6_t); - size_bits1 = sizeof_DCI1A_5MHz_TDD_1_6_t; - size_bits2 = sizeof_DCI1A_5MHz_TDD_1_6_t; - break; - - case 50: - size_bytes1 = sizeof(DCI1A_10MHz_TDD_1_6_t); - size_bytes2 = sizeof(DCI1A_10MHz_TDD_1_6_t); - size_bits1 = sizeof_DCI1A_10MHz_TDD_1_6_t; - size_bits2 = sizeof_DCI1A_10MHz_TDD_1_6_t; - break; - - case 100: - size_bytes1 = sizeof(DCI1A_20MHz_TDD_1_6_t); - size_bytes2 = sizeof(DCI1A_20MHz_TDD_1_6_t); - size_bits1 = sizeof_DCI1A_20MHz_TDD_1_6_t; - size_bits2 = sizeof_DCI1A_20MHz_TDD_1_6_t; - break; - - default: - size_bytes1 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - size_bytes2 = sizeof(DCI1A_1_5MHz_TDD_1_6_t); - size_bits1 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - size_bits2 = sizeof_DCI1A_1_5MHz_TDD_1_6_t; - break; - } - - } else { - switch (mac_xface->lte_frame_parms->N_RB_DL) { - case 6: - size_bytes1 = sizeof(DCI1A_1_5MHz_FDD_t); - size_bytes2 = sizeof(DCI1A_1_5MHz_FDD_t); - size_bits1 = sizeof_DCI1A_1_5MHz_FDD_t; - size_bits2 = sizeof_DCI1A_1_5MHz_FDD_t; - break; - - case 25: - size_bytes1 = sizeof(DCI1A_5MHz_FDD_t); - size_bytes2 = sizeof(DCI1A_5MHz_FDD_t); - size_bits1 = sizeof_DCI1A_5MHz_FDD_t; - size_bits2 = sizeof_DCI1A_5MHz_FDD_t; - break; - - case 50: - size_bytes1 = sizeof(DCI1A_10MHz_FDD_t); - size_bytes2 = sizeof(DCI1A_10MHz_FDD_t); - size_bits1 = sizeof_DCI1A_10MHz_FDD_t; - size_bits2 = sizeof_DCI1A_10MHz_FDD_t; - break; - - case 100: - size_bytes1 = sizeof(DCI1A_20MHz_FDD_t); - size_bytes2 = sizeof(DCI1A_20MHz_FDD_t); - size_bits1 = sizeof_DCI1A_20MHz_FDD_t; - size_bits2 = sizeof_DCI1A_20MHz_FDD_t; - break; - - default: - size_bytes1 = sizeof(DCI1A_1_5MHz_FDD_t); - size_bytes2 = sizeof(DCI1A_1_5MHz_FDD_t); - size_bits1 = sizeof_DCI1A_1_5MHz_FDD_t; - size_bits2 = sizeof_DCI1A_1_5MHz_FDD_t; - break; - } - } - - memcpy((void *)&RA_template[j].RA_alloc_pdu1[0],(void *)&RA_alloc_pdu,size_bytes1); - memcpy((void *)&RA_template[j].RA_alloc_pdu2[0],(void *)&DLSCH_alloc_pdu1A,size_bytes2); - RA_template[j].RA_dci_size_bytes1 = size_bytes1; - RA_template[j].RA_dci_size_bytes2 = size_bytes2; - RA_template[j].RA_dci_size_bits1 = size_bits1; - RA_template[j].RA_dci_size_bits2 = size_bits2; - - RA_template[j].RA_dci_fmt1 = format1A; - RA_template[j].RA_dci_fmt2 = format1A; - } - - memset (&eNB_mac_inst[i].eNB_stats,0,sizeof(eNB_STATS)); - UE_template = (UE_TEMPLATE *)&eNB_mac_inst[i].UE_list.UE_template[CC_id][0]; - - for (j=0; jnext[list_el] = -1; + UE_list->next_ul[list_el] = -1; } +} - //ICIC init param -#ifdef ICIC - uint8_t SB_size; - SB_size=mac_xface->get_SB_size(mac_xface->lte_frame_parms->N_RB_DL); +void mac_init_cell_params(int Mod_idP, int CC_idP) +{ - srand (time(NULL)); + int j; + UE_TEMPLATE *UE_template; - for(j=0; jcommon_channels[CC_idP]; - for(i=0; ieNB_stats, 0, sizeof(eNB_STATS)); + UE_template = + (UE_TEMPLATE *) & RC.mac[Mod_idP]->UE_list.UE_template[CC_idP][0]; + for (j = 0; j < NUMBER_OF_UE_MAX; j++) { + UE_template[j].rnti = 0; + // initiallize the eNB to UE statistics + memset(&RC.mac[Mod_idP]->UE_list.eNB_UE_stats[CC_idP][j], 0, + sizeof(eNB_UE_STATS)); } -#endif - //end ALU's algo - - LOG_I(MAC,"[MAIN][INIT] Init function finished\n"); - - return(0); - } -int mac_init_global_param(void) +int rlcmac_init_global_param(void) { - Mac_rlc_xface = NULL; - LOG_I(MAC,"[MAIN] CALLING RLC_MODULE_INIT...\n"); + LOG_I(MAC, "[MAIN] CALLING RLC_MODULE_INIT...\n"); - if (rlc_module_init()!=0) { - return(-1); - } + if (rlc_module_init() != 0) { + return (-1); + } - LOG_I(MAC,"[MAIN] RLC_MODULE_INIT OK, malloc16 for mac_rlc_xface...\n"); + pdcp_layer_init(); - Mac_rlc_xface = (MAC_RLC_XFACE*)malloc16(sizeof(MAC_RLC_XFACE)); - bzero(Mac_rlc_xface,sizeof(MAC_RLC_XFACE)); + LOG_I(MAC, "[MAIN] Init Global Param Done\n"); - if(Mac_rlc_xface == NULL) { - LOG_E(MAC,"[MAIN] FATAL EROOR: Could not allocate memory for Mac_rlc_xface !!!\n"); - return (-1); - - } - - LOG_I(MAC,"[MAIN] malloc16 OK, mac_rlc_xface @ %p\n",(void *)Mac_rlc_xface); - - // mac_xface->macphy_data_ind=macphy_data_ind; - mac_xface->mrbch_phy_sync_failure=mrbch_phy_sync_failure; - mac_xface->dl_phy_sync_success=dl_phy_sync_success; - mac_xface->out_of_sync_ind=rrc_out_of_sync_ind; - - // Mac_rlc_xface->macphy_exit= mac_xface->macphy_exit; - // Mac_rlc_xface->frame = 0; - // Mac_rlc_xface->mac_config_req=mac_config_req; - // Mac_rlc_xface->mac_meas_req=mac_meas_req; - // Mac_rlc_xface->rrc_rlc_config_req=rrc_rlc_config_req; - // Mac_rlc_xface->rrc_rlc_data_req=rrc_rlc_data_req; - // Mac_rlc_xface->rrc_rlc_register_rrc=rrc_rlc_register_rrc; - - // Mac_rlc_xface->rrc_mac_config_req=rrc_mac_config_req; - - // LOG_I(MAC,"[MAIN] INIT_GLOBAL_PARAM: Mac_rlc_xface=%p,rrc_rlc_register_rrc =%p\n",Mac_rlc_xface,Mac_rlc_xface->rrc_rlc_register_rrc); - - // Mac_rlc_xface->mac_rlc_data_req=mac_rlc_data_req; - // Mac_rlc_xface->mac_rlc_data_ind=mac_rlc_data_ind; - // Mac_rlc_xface->mac_rlc_status_ind=mac_rlc_status_ind; - // Mac_rlc_xface->pdcp_data_req=pdcp_data_req; - // Mac_rlc_xface->mrbch_phy_sync_failure=mrbch_phy_sync_failure; - // Mac_rlc_xface->dl_phy_sync_success=dl_phy_sync_success; - - LOG_I(MAC,"[MAIN] RLC interface setup and init\n"); - rrc_init_global_param(); - -#ifdef USER_MODE - pdcp_layer_init (); -#else - pdcp_module_init (); -#endif - - LOG_I(MAC,"[MAIN] Init Global Param Done\n"); - - return 0; + return 0; } void mac_top_cleanup(void) { -#ifndef USER_MODE - pdcp_module_cleanup (); -#endif + if (NB_UE_INST > 0) { + free(UE_mac_inst); + } - if (NB_UE_INST>0) { - free (UE_mac_inst); - } + if (RC.nb_macrlc_inst > 0) { + free(RC.mac); + } - if (NB_eNB_INST>0) { - free(eNB_mac_inst); - } - - free( Mac_rlc_xface); } -int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,uint8_t cba_group_active, uint8_t HO_active) +int l2_init_eNB(void) { - LOG_I(MAC,"[MAIN] MAC_INIT_GLOBAL_PARAM IN...\n"); - // NB_NODE=2; - // NB_INST=2; + LOG_I(MAC, "[MAIN] MAC_INIT_GLOBAL_PARAM IN...\n"); - Is_rrc_registered=0; - mac_init_global_param(); - Is_rrc_registered=1; + rlcmac_init_global_param(); - mac_xface->macphy_init = mac_top_init; -#ifndef USER_MODE - mac_xface->macphy_exit = openair_sched_exit; -#else - mac_xface->macphy_exit=(void (*)(const char*)) exit; -#endif - LOG_I(MAC,"[MAIN] init eNB MAC functions \n"); - mac_xface->eNB_dlsch_ulsch_scheduler = eNB_dlsch_ulsch_scheduler; - mac_xface->get_dci_sdu = get_dci_sdu; - mac_xface->fill_rar = fill_rar; - mac_xface->initiate_ra_proc = initiate_ra_proc; - mac_xface->cancel_ra_proc = cancel_ra_proc; - mac_xface->SR_indication = SR_indication; - mac_xface->UL_failure_indication = UL_failure_indication; - mac_xface->rx_sdu = rx_sdu; - mac_xface->get_dlsch_sdu = get_dlsch_sdu; - mac_xface->get_eNB_UE_stats = get_eNB_UE_stats; - mac_xface->get_transmission_mode = get_transmission_mode; - mac_xface->get_rballoc = get_rballoc; - mac_xface->get_nb_rb = conv_nprb; - mac_xface->get_prb = get_prb; - // mac_xface->get_SB_size = Get_SB_size; - mac_xface->get_subframe_direction = get_subframe_direction; - mac_xface->Msg3_transmitted = Msg3_tx; - mac_xface->Msg1_transmitted = Msg1_tx; - mac_xface->ra_failed = ra_failed; - mac_xface->ra_succeeded = ra_succeeded; - mac_xface->mac_phy_remove_ue = mac_phy_remove_ue; - - LOG_I(MAC,"[MAIN] init UE MAC functions \n"); - mac_xface->ue_decode_si = ue_decode_si; - mac_xface->ue_send_sdu = ue_send_sdu; -#ifdef Rel10 - mac_xface->ue_send_mch_sdu = ue_send_mch_sdu; - mac_xface->ue_query_mch = ue_query_mch; -#endif - mac_xface->ue_get_SR = ue_get_SR; - mac_xface->ue_get_sdu = ue_get_sdu; - mac_xface->ue_get_rach = ue_get_rach; - mac_xface->ue_process_rar = ue_process_rar; - mac_xface->ue_scheduler = ue_scheduler; - mac_xface->process_timing_advance = process_timing_advance; + LOG_D(MAC, "[MAIN] ALL INIT OK\n"); - LOG_I(MAC,"[MAIN] PHY Frame configuration \n"); - mac_xface->lte_frame_parms = frame_parms; - - mac_xface->get_ue_active_harq_pid = get_ue_active_harq_pid; - mac_xface->get_PL = get_PL; - mac_xface->get_RSRP = get_RSRP; - mac_xface->get_RSRQ = get_RSRQ; - mac_xface->get_RSSI = get_RSSI; - mac_xface->get_n_adj_cells = get_n_adj_cells; - mac_xface->get_rx_total_gain_dB = get_rx_total_gain_dB; - mac_xface->get_Po_NOMINAL_PUSCH = get_Po_NOMINAL_PUSCH; - mac_xface->get_num_prach_tdd = get_num_prach_tdd; - mac_xface->get_fid_prach_tdd = get_fid_prach_tdd; - mac_xface->get_deltaP_rampup = get_deltaP_rampup; - mac_xface->computeRIV = computeRIV; - mac_xface->get_TBS_DL = get_TBS_DL; - mac_xface->get_TBS_UL = get_TBS_UL; - mac_xface->get_nCCE_max = get_nCCE_mac; - mac_xface->get_nCCE_offset = get_nCCE_offset; - mac_xface->get_ue_mode = get_ue_mode; - mac_xface->phy_config_sib1_eNB = phy_config_sib1_eNB; - mac_xface->phy_config_sib1_ue = phy_config_sib1_ue; - - mac_xface->phy_config_sib2_eNB = phy_config_sib2_eNB; - mac_xface->phy_config_sib2_ue = phy_config_sib2_ue; - mac_xface->phy_config_afterHO_ue = phy_config_afterHO_ue; -#ifdef Rel10 - mac_xface->phy_config_sib13_eNB = phy_config_sib13_eNB; - mac_xface->phy_config_sib13_ue = phy_config_sib13_ue; -#endif -#ifdef CBA - mac_xface->phy_config_cba_rnti = phy_config_cba_rnti ; -#endif - mac_xface->estimate_ue_tx_power = estimate_ue_tx_power; - mac_xface->phy_config_meas_ue = phy_config_meas_ue; - mac_xface->phy_reset_ue = phy_reset_ue; - - mac_xface->phy_config_dedicated_eNB = phy_config_dedicated_eNB; - mac_xface->phy_config_dedicated_ue = phy_config_dedicated_ue; - - mac_xface->get_lte_frame_parms = get_lte_frame_parms; - mac_xface->get_mu_mimo_mode = get_mu_mimo_mode; - - mac_xface->get_hundred_times_delta_TF = get_hundred_times_delta_IF_mac; - mac_xface->get_target_pusch_rx_power = get_target_pusch_rx_power; - mac_xface->get_target_pucch_rx_power = get_target_pucch_rx_power; - - mac_xface->get_prach_prb_offset = get_prach_prb_offset; - mac_xface->is_prach_subframe = is_prach_subframe; - -#ifdef Rel10 - mac_xface->get_mch_sdu = get_mch_sdu; - mac_xface->phy_config_dedicated_scell_eNB= phy_config_dedicated_scell_eNB; - mac_xface->phy_config_dedicated_scell_ue= phy_config_dedicated_scell_ue; - -#endif - - mac_xface->get_PHR = get_PHR; - LOG_D(MAC,"[MAIN] ALL INIT OK\n"); - - mac_xface->macphy_init(eMBMS_active,uecap_xer,cba_group_active,HO_active); - - //Mac_rlc_xface->Is_cluster_head[0] = 1; - //Mac_rlc_xface->Is_cluster_head[1] = 0; - - - return(1); + return (1); } - diff --git a/openair2/LAYER2/MAC/main_ue.c b/openair2/LAYER2/MAC/main_ue.c new file mode 100644 index 0000000000..64326dec61 --- /dev/null +++ b/openair2/LAYER2/MAC/main_ue.c @@ -0,0 +1,150 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file main.c + * \brief top init of Layer 2 + * \author Navid Nikaein and Raymond Knopp + * \date 2010 - 2014 + * \version 1.0 + * \email: navid.nikaein@eurecom.fr + * @ingroup _mac + + */ + +#include "defs.h" +#include "proto.h" +#include "extern.h" +#include "assertions.h" +#include "PHY_INTERFACE/extern.h" +#include "PHY/defs.h" +#include "SCHED/defs.h" +#include "LAYER2/PDCP_v10.1.0/pdcp.h" +#include "RRC/LITE/defs.h" +#include "UTIL/LOG/log.h" +#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" + +#include "SCHED/defs.h" + + +#include "common/ran_context.h" + +extern void openair_rrc_top_init_ue( int eMBMS_active, char* uecap_xer, uint8_t cba_group_active, uint8_t HO_active); + +void dl_phy_sync_success(module_id_t module_idP, frame_t frameP, unsigned char eNB_index, uint8_t first_sync) //init as MR +{ + LOG_D(MAC, "[UE %d] Frame %d: PHY Sync to eNB_index %d successful \n", + module_idP, frameP, eNB_index); +#if defined(ENABLE_USE_MME) + int mme_enabled = 1; +#else + int mme_enabled = 0; +#endif + + if (first_sync == 1 && !(mme_enabled == 1)) { + //layer2_init_UE(module_idP); + openair_rrc_ue_init(module_idP, eNB_index); + } else { + rrc_in_sync_ind(module_idP, frameP, eNB_index); + } +} + +void +mac_UE_out_of_sync_ind(module_id_t module_idP, frame_t frameP, + uint16_t eNB_index) +{ + + // Mac_rlc_xface->mac_out_of_sync_ind(Mod_id, frameP, eNB_index); +} + + +int +mac_top_init_ue(int eMBMS_active, char *uecap_xer, + uint8_t cba_group_active, uint8_t HO_active) +{ + + int i; + + LOG_I(MAC, "[MAIN] Init function start:Nb_UE_INST=%d\n", NB_UE_INST); + + if (NB_UE_INST > 0) { + UE_mac_inst = + (UE_MAC_INST *) malloc16(NB_UE_INST * sizeof(UE_MAC_INST)); + + AssertFatal(UE_mac_inst != NULL, + "[MAIN] Can't ALLOCATE %zu Bytes for %d UE_MAC_INST with size %zu \n", + NB_UE_INST * sizeof(UE_MAC_INST), NB_UE_INST, + sizeof(UE_MAC_INST)); + + LOG_D(MAC, "[MAIN] ALLOCATE %zu Bytes for %d UE_MAC_INST @ %p\n", + NB_UE_INST * sizeof(UE_MAC_INST), NB_UE_INST, UE_mac_inst); + + bzero(UE_mac_inst, NB_UE_INST * sizeof(UE_MAC_INST)); + + for (i = 0; i < NB_UE_INST; i++) { + ue_init_mac(i); + } + } else { + UE_mac_inst = NULL; + } + + + LOG_I(MAC, "[MAIN] calling RRC\n"); + openair_rrc_top_init_ue(eMBMS_active, uecap_xer, cba_group_active, + HO_active); + + + LOG_I(MAC, "[MAIN][INIT] Init function finished\n"); + + return (0); + +} + +int rlcmac_init_global_param_ue(void) +{ + + + LOG_I(MAC, "[MAIN] CALLING RLC_MODULE_INIT...\n"); + + if (rlc_module_init() != 0) { + return (-1); + } + + pdcp_layer_init(); + + LOG_I(MAC, "[MAIN] Init Global Param Done\n"); + + return 0; +} + +int +l2_init_ue(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, + uint8_t HO_active) +{ + LOG_I(MAC, "[MAIN] MAC_INIT_GLOBAL_PARAM IN...\n"); + // NB_NODE=2; + // NB_INST=2; + + rlcmac_init_global_param_ue(); + LOG_I(MAC, "[MAIN] init UE MAC functions \n"); + mac_top_init_ue(eMBMS_active, uecap_xer, cba_group_active, HO_active); + return (1); +} + diff --git a/openair2/LAYER2/MAC/openair2_proc.c b/openair2/LAYER2/MAC/openair2_proc.c deleted file mode 100644 index bb4a994a8a..0000000000 --- a/openair2/LAYER2/MAC/openair2_proc.c +++ /dev/null @@ -1,412 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ -/* \file openair2_proc.c - \brief MAC layer online statistics - \author Navid Nikaein - \date 2013 - 2014 - \version 1.0 - @ingroup _mac -*/ - -#ifndef USER_MODE -#include -#include -#include - -#endif -#include "LAYER2/MAC/defs.h" -#include "LAYER2/MAC/extern.h" -//#include "RRC/LITE/extern.h" -//#include "LAYER2/PDCP/pdcp.h" -#include "proto.h" -#ifndef USER_MODE -static int openair2_stats_read(char *buffer, char **my_buffer, off_t off, int length) -#else -int openair2_stats_read(char *buffer, char **my_buffer, off_t off, int length) -#endif -{ - - int len = 0,fg,Overhead, Sign; - unsigned int i,j,k,kk; - unsigned int ue_id, eNB_id; - unsigned int Mod_id = 0,CH_index; - unsigned int stat_tx_pdcp_sdu; - unsigned int stat_tx_pdcp_bytes; - unsigned int stat_tx_pdcp_sdu_discarded; - unsigned int stat_tx_pdcp_bytes_discarded; - unsigned int stat_tx_data_pdu; - unsigned int stat_tx_data_bytes; - unsigned int stat_tx_retransmit_pdu_by_status; - unsigned int stat_tx_retransmit_bytes_by_status; - unsigned int stat_tx_retransmit_pdu; - unsigned int stat_tx_retransmit_bytes; - unsigned int stat_tx_control_pdu; - unsigned int stat_tx_control_bytes; - unsigned int stat_rx_pdcp_sdu; - unsigned int stat_rx_pdcp_bytes; - unsigned int stat_rx_data_pdus_duplicate; - unsigned int stat_rx_data_bytes_duplicate; - unsigned int stat_rx_data_pdu; - unsigned int stat_rx_data_bytes; - unsigned int stat_rx_data_pdu_dropped; - unsigned int stat_rx_data_bytes_dropped; - unsigned int stat_rx_data_pdu_out_of_window; - unsigned int stat_rx_data_bytes_out_of_window; - unsigned int stat_rx_control_pdu; - unsigned int stat_rx_control_bytes; - unsigned int stat_timer_reordering_timed_out; - unsigned int stat_timer_poll_retransmit_timed_out; - unsigned int stat_timer_status_prohibit_timed_out; - - // UE part - for (ue_id=0; ue_id RRC_CONNECTED) { - case RRC_RECONFIGURED : - case RRC_CONNECTED: - case RRC_SI_RECEIVED: - case RRC_IDLE: - break; - - if (mac_get_rrc_status(ue_id,0,enb_id) > RRC_CONNECTED) { - // if (UE_mac_inst[ue_id].Dcch_lchan[CH_index].Active==1) { - len+=sprintf(&buffer[len],"eNB %d: Wideband SINR %d dB---\n", - CH_index,UE_mac_inst[Mod_id].Def_meas[CH_index].Wideband_sinr); - len+=sprintf(&buffer[len],"CH %d: Subband SINR (dB) :", - CH_index); - - for (fg=0; fg>5, - UE_mac_inst[Mod_id].Dcch_lchan[CH_index].Lchan_info.NB_RX, - UE_mac_inst[Mod_id].Dcch_lchan[CH_index].Lchan_info.NB_RX_ERRORS); - - for(i=1; i>5, - Pdcp_stats_rx[k][CH_index][i], - Pdcp_stats_rx_rate[k][CH_index][i], - (10*Pdcp_stats_rx_rate[k][CH_index][i])>>5, - Sign*(10*Overhead)>>5); - - - int status = rlc_stat_req (k, - UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index, - &stat_tx_pdcp_sdu, - &stat_tx_pdcp_bytes, - &stat_tx_pdcp_sdu_discarded, - &stat_tx_pdcp_bytes_discarded, - &stat_tx_data_pdu, - &stat_tx_data_bytes, - &stat_tx_retransmit_pdu_by_status, - &stat_tx_retransmit_bytes_by_status, - &stat_tx_retransmit_pdu, - &stat_tx_retransmit_bytes, - &stat_tx_control_pdu, - &stat_tx_control_bytes, - &stat_rx_pdcp_sdu, - &stat_rx_pdcp_bytes, - &stat_rx_data_pdus_duplicate, - &stat_rx_data_bytes_duplicate, - &stat_rx_data_pdu, - &stat_rx_data_bytes, - &stat_rx_data_pdu_dropped, - &stat_rx_data_bytes_dropped, - &stat_rx_data_pdu_out_of_window, - &stat_rx_data_bytes_out_of_window, - &stat_rx_control_pdu, - &stat_rx_control_bytes, - &stat_timer_reordering_timed_out, - &stat_timer_poll_retransmit_timed_out, - &stat_timer_status_prohibit_timed_out) ; - - if (status == RLC_OP_STATUS_OK) { - len+=sprintf(&buffer[len],"RLC LCHAN %d, NB_SDU_TO_TX = %d\tNB_SDU_DISC %d\tNB_RX_SDU %d\n", - UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index, - tx_pdcp_sdu, - tx_pdcp_sdu_discarded, - rx_sdu); - len+=sprintf(&buffer[len],"RLC LCHAN %d, NB_TB_TX_DATA = %d\tNB_TB_TX_CONTROL %d\tNB_TX_TB_RETRANS %d", - UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index, - tx_data_pdu, - tx_control_pdu, - tx_retransmit_pdu); - len+=sprintf(&buffer[len],"\tRLC LCHAN %d, NB_TX_TB_RETRANS_BY_STATUS = %d\tNB_TX_TB_RETRANS_PADD %d\n", - UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index, - tx_retransmit_pdu_by_status, - tx_retransmit_pdu_unblock); - len+=sprintf(&buffer[len],"RLC LCHAN %d, NB_RX_DATA = %d\tNB_RX_TB_OUT_WIN %d\tNB_RX_TB_CORRUPT %d\n", - UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index, - rx_data_pdu, - rx_data_pdu_out_of_window, - rx_error_pdu); - } - - len+=sprintf(&buffer[len],"[MAC]: LCHAN %d, NB_TX_MAC = %d (%d bits/TTI, %d kbits/s), NB_RX_MAC = %d (%d errors)\n", - UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.Lchan_id.Index, - UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_TX, - UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.output_rate, - (10*UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.output_rate)>>5, - UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_RX, - UE_mac_inst[Mod_id].Dtch_lchan[i][CH_index].Lchan_info.NB_RX_ERRORS); - len+=sprintf(&buffer[len]," TX per TB: "); - - for(kk=0; kkIs_cluster_head[k] ==1) { - - Mod_id=k; - len+=sprintf(&buffer[len], - "-------------------------------------------------------------------CH %d: TTI: %d------------------------------------------------------------------\n", - NODE_ID[Mod_id],Mac_rlc_xface->frame); - - for(i=1; i<=NB_CNX_CH; i++) { - if (CH_mac_inst[Mod_id].Dcch_lchan[i].Active==1) { - len+=sprintf(&buffer[len],"\nMR index %d: DL SINR (feedback) %d dB, CQI: %s\n\n", - i,//CH_rrc_inst[Mod_id].Info.UE_list[i].L2_id[0], - CH_mac_inst[Mod_id].Def_meas[i].Wideband_sinr); - //print_cqi(CH_mac_inst[Mod_id].Def_meas[i].cqi)); - - len+=sprintf(&buffer[len], - "[MAC] LCHAN %d (DCCH), NB_TX_MAC= %d (%d bits/TTI, %d kbits/s), NB_RX_MAC= %d (errors %d, sacch errors %d, sach errors %d, sach_missing %d)\n\n", - CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.Lchan_id.Index, - CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_TX, - CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.output_rate, - (10*CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.output_rate)>>5, - CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX, - CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_ERRORS, - CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_SACCH_ERRORS, - CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_SACH_ERRORS, - CH_mac_inst[Mod_id].Dcch_lchan[i].Lchan_info.NB_RX_SACH_MISSING); - - for(j=0; j>5, - Pdcp_stats_rx[k][i][j], - Pdcp_stats_rx_rate[k][i][j], - (10*Pdcp_stats_rx_rate[k][i][j])>>5, - Sign*(10*Overhead)>>5); - int status = rlc_stat_req (k, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index, - &tx_pdcp_sdu, - &tx_pdcp_sdu_discarded, - &tx_retransmit_pdu_unblock, - &tx_retransmit_pdu_by_status, - &tx_retransmit_pdu, - &tx_data_pdu, - &tx_control_pdu, - &rx_sdu, - &rx_error_pdu, - &rx_data_pdu, - &rx_data_pdu_out_of_window, - &rx_control_pdu) ; - /* - if (status == RLC_OP_STATUS_OK) { - len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_SDU_TO_TX = %d\tNB_SDU_DISC %d\tNB_RX_SDU %d\n", - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index, - tx_pdcp_sdu, - tx_pdcp_sdu_discarded, - rx_sdu); - len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_TB_TX_DATA = %d\tNB_TB_TX_CONTROL %d\tNB_TX_TB_RETRANS %\n", - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index, - tx_data_pdu, - tx_control_pdu, - tx_retransmit_pdu); - len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_TX_TB_RETRANS_BY_STATUS = %d\tNB_TX_TB_RETRANS_PADD %d\n", - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index, - tx_retransmit_pdu_by_status, - tx_retransmit_pdu_unblock); - len+=sprintf(&buffer[len],"\t[RLC] LCHAN %d, NB_RX_DATA = %d\tNB_RX_TB_OUT_WIN %d\tNB_RX_TB_CORRUPT %d\n", - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index, - rx_data_pdu, - rx_data_pdu_out_of_window, - rx_error_pdu); - } - */ - len+=sprintf(&buffer[len], - "[MAC]LCHAN %d (CNX %d,RAB %d), NB_TX_MAC= %d (%d bits/TTI, %d kbit/s), NB_RX_MAC= %d (errors %d, sacch_errors %d, sach_errors %d, sach_missing %d)\n", - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Lchan_id.Index, - i,j, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_TX, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.output_rate, - (10*CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.output_rate)>>5, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_ERRORS, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_SACCH_ERRORS, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_SACH_ERRORS, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_RX_SACH_MISSING); - len+=sprintf(&buffer[len],"[MAC][SCHEDULER] TX Arrival Rate %d, TX Service Rate %d, RX Arrival rate %d, RX Service rate %d, NB_BW_REQ_RX %d\n\n", - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Arrival_rate, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Tx_rate, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Req_rate, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.Rx_rate, - CH_mac_inst[Mod_id].Dtch_lchan[j][i].Lchan_info.NB_BW_REQ_RX); - - /* - len+=sprintf(&buffer[len]," TX per TB: "); - for(kk=0;kk. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file pre_processor.c * \brief eNB scheduler preprocessing fuction prior to scheduling * \author Navid Nikaein and Ankit Bhamri @@ -36,6 +29,9 @@ */ +#define _GNU_SOURCE +#include + #include "assertions.h" #include "PHY/defs.h" #include "PHY/extern.h" @@ -63,1202 +59,1786 @@ //#define ICIC 0 +/* this function checks that get_eNB_UE_stats returns + * a non-NULL pointer for all the active CCs of an UE + */ /* - #ifndef USER_MODE - #define msg debug_msg - #endif +int phy_stats_exist(module_id_t Mod_id, int rnti) +{ + int CC_id; + int i; + int UE_id = find_UE_id(Mod_id, rnti); + UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list; + if (UE_id == -1) { + LOG_W(MAC, "[eNB %d] UE %x not found, should be there (in phy_stats_exist)\n", + Mod_id, rnti); + return 0; + } + if (UE_list->numactiveCCs[UE_id] == 0) { + LOG_W(MAC, "[eNB %d] UE %x has no active CC (in phy_stats_exist)\n", + Mod_id, rnti); + return 0; + } + for (i = 0; i < UE_list->numactiveCCs[UE_id]; i++) { + CC_id = UE_list->ordered_CCids[i][UE_id]; + if (mac_xface->get_eNB_UE_stats(Mod_id, CC_id, rnti) == NULL) + return 0; + } + return 1; +} */ - // This function stores the downlink buffer for all the logical channels -void store_dlsch_buffer (module_id_t Mod_id, - frame_t frameP, - sub_frame_t subframeP) +void +store_dlsch_buffer(module_id_t Mod_id, frame_t frameP, + sub_frame_t subframeP) { - int UE_id,i; - rnti_t rnti; - mac_rlc_status_resp_t rlc_status; - UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; - UE_TEMPLATE *UE_template; + int UE_id, i; + rnti_t rnti; + mac_rlc_status_resp_t rlc_status; + UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list; + UE_TEMPLATE *UE_template; - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { + for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (UE_list->active[UE_id] != TRUE) + continue; - UE_template = &UE_list->UE_template[UE_PCCID(Mod_id,UE_id)][UE_id]; + UE_template = + &UE_list->UE_template[UE_PCCID(Mod_id, UE_id)][UE_id]; - // clear logical channel interface variables - UE_template->dl_buffer_total = 0; - UE_template->dl_pdus_total = 0; + // clear logical channel interface variables + UE_template->dl_buffer_total = 0; + UE_template->dl_pdus_total = 0; - for(i=0; i< MAX_NUM_LCID; i++) { - UE_template->dl_buffer_info[i]=0; - UE_template->dl_pdus_in_buffer[i]=0; - UE_template->dl_buffer_head_sdu_creation_time[i]=0; - UE_template->dl_buffer_head_sdu_remaining_size_to_send[i]=0; - } + for (i = 0; i < MAX_NUM_LCID; i++) { + UE_template->dl_buffer_info[i] = 0; + UE_template->dl_pdus_in_buffer[i] = 0; + UE_template->dl_buffer_head_sdu_creation_time[i] = 0; + UE_template->dl_buffer_head_sdu_remaining_size_to_send[i] = 0; + } - rnti = UE_RNTI(Mod_id,UE_id); + rnti = UE_RNTI(Mod_id, UE_id); - for(i=0; i< MAX_NUM_LCID; i++) { // loop over all the logical channels + for (i = 0; i < MAX_NUM_LCID; i++) { // loop over all the logical channels - rlc_status = mac_rlc_status_ind(Mod_id,rnti, Mod_id,frameP,ENB_FLAG_YES,MBMS_FLAG_NO,i,0 ); - UE_template->dl_buffer_info[i] = rlc_status.bytes_in_buffer; //storing the dlsch buffer for each logical channel - UE_template->dl_pdus_in_buffer[i] = rlc_status.pdus_in_buffer; - UE_template->dl_buffer_head_sdu_creation_time[i] = rlc_status.head_sdu_creation_time ; - UE_template->dl_buffer_head_sdu_creation_time_max = cmax(UE_template->dl_buffer_head_sdu_creation_time_max, - rlc_status.head_sdu_creation_time ); - UE_template->dl_buffer_head_sdu_remaining_size_to_send[i] = rlc_status.head_sdu_remaining_size_to_send; - UE_template->dl_buffer_head_sdu_is_segmented[i] = rlc_status.head_sdu_is_segmented; - UE_template->dl_buffer_total += UE_template->dl_buffer_info[i];//storing the total dlsch buffer - UE_template->dl_pdus_total += UE_template->dl_pdus_in_buffer[i]; + rlc_status = + mac_rlc_status_ind(Mod_id, rnti, Mod_id, frameP, subframeP, + ENB_FLAG_YES, MBMS_FLAG_NO, i, 0); + UE_template->dl_buffer_info[i] = rlc_status.bytes_in_buffer; //storing the dlsch buffer for each logical channel + UE_template->dl_pdus_in_buffer[i] = rlc_status.pdus_in_buffer; + UE_template->dl_buffer_head_sdu_creation_time[i] = + rlc_status.head_sdu_creation_time; + UE_template->dl_buffer_head_sdu_creation_time_max = + cmax(UE_template->dl_buffer_head_sdu_creation_time_max, + rlc_status.head_sdu_creation_time); + UE_template->dl_buffer_head_sdu_remaining_size_to_send[i] = + rlc_status.head_sdu_remaining_size_to_send; + UE_template->dl_buffer_head_sdu_is_segmented[i] = + rlc_status.head_sdu_is_segmented; + UE_template->dl_buffer_total += UE_template->dl_buffer_info[i]; //storing the total dlsch buffer + UE_template->dl_pdus_total += + UE_template->dl_pdus_in_buffer[i]; #ifdef DEBUG_eNB_SCHEDULER - /* note for dl_buffer_head_sdu_remaining_size_to_send[i] : - * 0 if head SDU has not been segmented (yet), else remaining size not already segmented and sent - */ - if (UE_template->dl_buffer_info[i]>0) - LOG_D(MAC, - "[eNB %d] Frame %d Subframe %d : RLC status for UE %d in LCID%d: total of %d pdus and size %d, head sdu queuing time %d, remaining size %d, is segmeneted %d \n", - Mod_id, frameP, subframeP, UE_id, - i, UE_template->dl_pdus_in_buffer[i],UE_template->dl_buffer_info[i], - UE_template->dl_buffer_head_sdu_creation_time[i], - UE_template->dl_buffer_head_sdu_remaining_size_to_send[i], - UE_template->dl_buffer_head_sdu_is_segmented[i] - ); + /* note for dl_buffer_head_sdu_remaining_size_to_send[i] : + * 0 if head SDU has not been segmented (yet), else remaining size not already segmented and sent + */ + if (UE_template->dl_buffer_info[i] > 0) + LOG_D(MAC, + "[eNB %d] Frame %d Subframe %d : RLC status for UE %d in LCID%d: total of %d pdus and size %d, head sdu queuing time %d, remaining size %d, is segmeneted %d \n", + Mod_id, frameP, subframeP, UE_id, + i, UE_template->dl_pdus_in_buffer[i], + UE_template->dl_buffer_info[i], + UE_template->dl_buffer_head_sdu_creation_time[i], + UE_template-> + dl_buffer_head_sdu_remaining_size_to_send[i], + UE_template->dl_buffer_head_sdu_is_segmented[i]); #endif + } + + //#ifdef DEBUG_eNB_SCHEDULER + if (UE_template->dl_buffer_total > 0) + LOG_D(MAC, + "[eNB %d] Frame %d Subframe %d : RLC status for UE %d : total DL buffer size %d and total number of pdu %d \n", + Mod_id, frameP, subframeP, UE_id, + UE_template->dl_buffer_total, + UE_template->dl_pdus_total); + + //#endif } - - //#ifdef DEBUG_eNB_SCHEDULER - if ( UE_template->dl_buffer_total>0) - LOG_D(MAC,"[eNB %d] Frame %d Subframe %d : RLC status for UE %d : total DL buffer size %d and total number of pdu %d \n", - Mod_id, frameP, subframeP, UE_id, - UE_template->dl_buffer_total, - UE_template->dl_pdus_total - ); - - //#endif - } } // This function returns the estimated number of RBs required by each UE for downlink scheduling -void assign_rbs_required (module_id_t Mod_id, - frame_t frameP, - sub_frame_t subframe, - uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - int min_rb_unit[MAX_NUM_CCs]) +void +assign_rbs_required(module_id_t Mod_id, + frame_t frameP, + sub_frame_t subframe, + uint16_t + nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + int min_rb_unit[MAX_NUM_CCs]) { + uint16_t TBS = 0; - rnti_t rnti; - uint16_t TBS = 0; - LTE_eNB_UE_stats *eNB_UE_stats[MAX_NUM_CCs]; - int UE_id,n,i,j,CC_id,pCCid,tmp; - UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; - // UE_TEMPLATE *UE_template; - LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; + int UE_id, n, i, j, CC_id, pCCid, tmp; + UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list; + eNB_UE_STATS *eNB_UE_stats, *eNB_UE_stats_i, *eNB_UE_stats_j; + int N_RB_DL; - // clear rb allocations across all CC_ids - for (UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { - pCCid = UE_PCCID(Mod_id,UE_id); - rnti = UE_list->UE_template[pCCid][UE_id].rnti; + // clear rb allocations across all CC_id + for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) { + if (UE_list->active[UE_id] != TRUE) + continue; - //update CQI information across component carriers - for (n=0; nnumactiveCCs[UE_id]; n++) { + pCCid = UE_PCCID(Mod_id, UE_id); - CC_id = UE_list->ordered_CCids[n][UE_id]; - frame_parms[CC_id] = mac_xface->get_lte_frame_parms(Mod_id,CC_id); - eNB_UE_stats[CC_id] = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti); - /* - DevCheck(((eNB_UE_stats[CC_id]->DL_cqi[0] < MIN_CQI_VALUE) || (eNB_UE_stats[CC_id]->DL_cqi[0] > MAX_CQI_VALUE)), - eNB_UE_stats[CC_id]->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE); - */ - eNB_UE_stats[CC_id]->dlsch_mcs1=cqi_to_mcs[eNB_UE_stats[CC_id]->DL_cqi[0]]; + //update CQI information across component carriers + for (n = 0; n < UE_list->numactiveCCs[UE_id]; n++) { - eNB_UE_stats[CC_id]->dlsch_mcs1 = cmin(eNB_UE_stats[CC_id]->dlsch_mcs1,openair_daq_vars.target_ue_dl_mcs); + CC_id = UE_list->ordered_CCids[n][UE_id]; + eNB_UE_stats = &UE_list->eNB_UE_stats[CC_id][UE_id]; + eNB_UE_stats->dlsch_mcs1 = + cqi_to_mcs[UE_list->UE_sched_ctrl[UE_id].dl_cqi[CC_id]]; + + } + + // provide the list of CCs sorted according to MCS + for (i = 0; i < UE_list->numactiveCCs[UE_id]; i++) { + eNB_UE_stats_i = + &UE_list->eNB_UE_stats[UE_list-> + ordered_CCids[i][UE_id]][UE_id]; + for (j = i + 1; j < UE_list->numactiveCCs[UE_id]; j++) { + DevAssert(j < MAX_NUM_CCs); + eNB_UE_stats_j = + &UE_list-> + eNB_UE_stats[UE_list->ordered_CCids[j][UE_id]][UE_id]; + if (eNB_UE_stats_j->dlsch_mcs1 > + eNB_UE_stats_i->dlsch_mcs1) { + tmp = UE_list->ordered_CCids[i][UE_id]; + UE_list->ordered_CCids[i][UE_id] = + UE_list->ordered_CCids[j][UE_id]; + UE_list->ordered_CCids[j][UE_id] = tmp; + } + } + } + + if (UE_list->UE_template[pCCid][UE_id].dl_buffer_total > 0) { + LOG_D(MAC, "[preprocessor] assign RB for UE %d\n", UE_id); + + for (i = 0; i < UE_list->numactiveCCs[UE_id]; i++) { + CC_id = UE_list->ordered_CCids[i][UE_id]; + eNB_UE_stats = &UE_list->eNB_UE_stats[CC_id][UE_id]; + + if (eNB_UE_stats->dlsch_mcs1 == 0) { + nb_rbs_required[CC_id][UE_id] = 4; // don't let the TBS get too small + } else { + nb_rbs_required[CC_id][UE_id] = min_rb_unit[CC_id]; + } + + TBS = + get_TBS_DL(eNB_UE_stats->dlsch_mcs1, + nb_rbs_required[CC_id][UE_id]); + + LOG_D(MAC, + "[preprocessor] start RB assignement for UE %d CC_id %d dl buffer %d (RB unit %d, MCS %d, TBS %d) \n", + UE_id, CC_id, + UE_list->UE_template[pCCid][UE_id].dl_buffer_total, + nb_rbs_required[CC_id][UE_id], + eNB_UE_stats->dlsch_mcs1, TBS); + + N_RB_DL = + to_prb(RC.mac[Mod_id]->common_channels[CC_id]. + mib->message.dl_Bandwidth); + + /* calculating required number of RBs for each UE */ + while (TBS < + UE_list->UE_template[pCCid][UE_id]. + dl_buffer_total) { + nb_rbs_required[CC_id][UE_id] += min_rb_unit[CC_id]; + + if (nb_rbs_required[CC_id][UE_id] > N_RB_DL) { + TBS = + get_TBS_DL(eNB_UE_stats->dlsch_mcs1, N_RB_DL); + nb_rbs_required[CC_id][UE_id] = N_RB_DL; + break; + } + + TBS = + get_TBS_DL(eNB_UE_stats->dlsch_mcs1, + nb_rbs_required[CC_id][UE_id]); + } // end of while + + LOG_D(MAC, + "[eNB %d] Frame %d: UE %d on CC %d: RB unit %d, nb_required RB %d (TBS %d, mcs %d)\n", + Mod_id, frameP, UE_id, CC_id, min_rb_unit[CC_id], + nb_rbs_required[CC_id][UE_id], TBS, + eNB_UE_stats->dlsch_mcs1); + } + } } - - // provide the list of CCs sorted according to MCS - for (i=0; inumactiveCCs[UE_id]; i++) { - for (j=i+1; jnumactiveCCs[UE_id]; j++) { - DevAssert( j < MAX_NUM_CCs ); - - if (eNB_UE_stats[UE_list->ordered_CCids[i][UE_id]]->dlsch_mcs1 > - eNB_UE_stats[UE_list->ordered_CCids[j][UE_id]]->dlsch_mcs1) { - tmp = UE_list->ordered_CCids[i][UE_id]; - UE_list->ordered_CCids[i][UE_id] = UE_list->ordered_CCids[j][UE_id]; - UE_list->ordered_CCids[j][UE_id] = tmp; - } - } - } - - /* - if ((mac_get_rrc_status(Mod_id,1,UE_id) < RRC_RECONFIGURED)){ // If we still don't have a default radio bearer - nb_rbs_required[pCCid][UE_id] = PHY_vars_eNB_g[Mod_id][pCCid]->lte_frame_parms.N_RB_DL; - continue; - } - */ - /* NN --> RK - * check the index of UE_template" - */ - // if (UE_list->UE_template[UE_id]->dl_buffer_total> 0) { - if (UE_list->UE_template[pCCid][UE_id].dl_buffer_total> 0) { - LOG_D(MAC,"[preprocessor] assign RB for UE %d\n",UE_id); - - for (i=0; inumactiveCCs[UE_id]; i++) { - CC_id = UE_list->ordered_CCids[i][UE_id]; - frame_parms[CC_id] = mac_xface->get_lte_frame_parms(Mod_id,CC_id); - eNB_UE_stats[CC_id] = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti); - - if (eNB_UE_stats[CC_id]->dlsch_mcs1==0) { - nb_rbs_required[CC_id][UE_id] = 4; // don't let the TBS get too small - } else { - nb_rbs_required[CC_id][UE_id] = min_rb_unit[CC_id]; - } - - TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]); - - LOG_D(MAC,"[preprocessor] start RB assignement for UE %d CC_id %d dl buffer %d (RB unit %d, MCS %d, TBS %d) \n", - UE_id, CC_id, UE_list->UE_template[pCCid][UE_id].dl_buffer_total, - nb_rbs_required[CC_id][UE_id],eNB_UE_stats[CC_id]->dlsch_mcs1,TBS); - - /* calculating required number of RBs for each UE */ - while (TBS < UE_list->UE_template[pCCid][UE_id].dl_buffer_total) { - nb_rbs_required[CC_id][UE_id] += min_rb_unit[CC_id]; - - if (nb_rbs_required[CC_id][UE_id] > frame_parms[CC_id]->N_RB_DL) { - TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,frame_parms[CC_id]->N_RB_DL); - nb_rbs_required[CC_id][UE_id] = frame_parms[CC_id]->N_RB_DL; - break; - } - - TBS = mac_xface->get_TBS_DL(eNB_UE_stats[CC_id]->dlsch_mcs1,nb_rbs_required[CC_id][UE_id]); - } // end of while - - LOG_D(MAC,"[eNB %d] Frame %d: UE %d on CC %d: RB unit %d, nb_required RB %d (TBS %d, mcs %d)\n", - Mod_id, frameP,UE_id, CC_id, min_rb_unit[CC_id], nb_rbs_required[CC_id][UE_id], TBS, eNB_UE_stats[CC_id]->dlsch_mcs1); - } - } - } } // This function scans all CC_ids for a particular UE to find the maximum round index of its HARQ processes -int maxround(module_id_t Mod_id,uint16_t rnti,int frame,sub_frame_t subframe,uint8_t ul_flag ) +int +maxround(module_id_t Mod_id, uint16_t rnti, int frame, + sub_frame_t subframe, uint8_t ul_flag) { - uint8_t round,round_max=0,UE_id; - int CC_id; - UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; + uint8_t round, round_max = 0, UE_id; + int CC_id, harq_pid; + UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list; + COMMON_channels_t *cc; - for (CC_id=0; CC_idUE_sched_ctrl[UE_id].round[CC_id]; - if (round > round_max) { - round_max = round; + cc = &RC.mac[Mod_id]->common_channels[CC_id]; + + UE_id = find_UE_id(Mod_id, rnti); + if (cc->tdd_Config) + harq_pid = ((frame * 10) + subframe) % 10; + else + harq_pid = ((frame * 10) + subframe) & 7; + + round = UE_list->UE_sched_ctrl[UE_id].round[CC_id][harq_pid]; + if (round > round_max) { + round_max = round; + } } - } - return round_max; + return round_max; } // This function scans all CC_ids for a particular UE to find the maximum DL CQI - -int maxcqi(module_id_t Mod_id,int32_t UE_id) +// it returns -1 if the UE is not found in PHY layer (get_eNB_UE_stats gives NULL) +int maxcqi(module_id_t Mod_id, int32_t UE_id) { + UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list; + int CC_id, n; + int CQI = 0; - LTE_eNB_UE_stats *eNB_UE_stats = NULL; - UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; - int CC_id,n; - int CQI = 0; + for (n = 0; n < UE_list->numactiveCCs[UE_id]; n++) { + CC_id = UE_list->ordered_CCids[n][UE_id]; - for (n=0; nnumactiveCCs[UE_id]; n++) { - CC_id = UE_list->ordered_CCids[n][UE_id]; - eNB_UE_stats = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,UE_RNTI(Mod_id,UE_id)); - - if (eNB_UE_stats==NULL) { - mac_xface->macphy_exit("maxcqi: could not get eNB_UE_stats\n"); - return 0; // not reached + if (UE_list->UE_sched_ctrl[UE_id].dl_cqi[CC_id] > CQI) { + CQI = UE_list->UE_sched_ctrl[UE_id].dl_cqi[CC_id]; + } } - if (eNB_UE_stats->DL_cqi[0] > CQI) { - CQI = eNB_UE_stats->DL_cqi[0]; - } - } - - return(CQI); + return CQI; } +struct sort_ue_dl_params { + int Mod_idP; + int frameP; + int subframeP; +}; +static int ue_dl_compare(const void *_a, const void *_b, void *_params) +{ + struct sort_ue_dl_params *params = _params; + UE_list_t *UE_list = &RC.mac[params->Mod_idP]->UE_list; + + int UE_id1 = *(const int *) _a; + int UE_id2 = *(const int *) _b; + + int rnti1 = UE_RNTI(params->Mod_idP, UE_id1); + int pCC_id1 = UE_PCCID(params->Mod_idP, UE_id1); + int round1 = + maxround(params->Mod_idP, rnti1, params->frameP, params->subframeP, + 1); + + int rnti2 = UE_RNTI(params->Mod_idP, UE_id2); + int pCC_id2 = UE_PCCID(params->Mod_idP, UE_id2); + int round2 = + maxround(params->Mod_idP, rnti2, params->frameP, params->subframeP, + 1); + + int cqi1 = maxcqi(params->Mod_idP, UE_id1); + int cqi2 = maxcqi(params->Mod_idP, UE_id2); + + if (round1 > round2) + return -1; + if (round1 < round2) + return 1; + + if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[1] + + UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[2] > + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[1] + + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[2]) + return -1; + if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[1] + + UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[2] < + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[1] + + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[2]) + return 1; + + if (UE_list-> + UE_template[pCC_id1][UE_id1].dl_buffer_head_sdu_creation_time_max > + UE_list-> + UE_template[pCC_id2][UE_id2].dl_buffer_head_sdu_creation_time_max) + return -1; + if (UE_list-> + UE_template[pCC_id1][UE_id1].dl_buffer_head_sdu_creation_time_max < + UE_list-> + UE_template[pCC_id2][UE_id2].dl_buffer_head_sdu_creation_time_max) + return 1; + + if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_total > + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_total) + return -1; + if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_total < + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_total) + return 1; + + if (cqi1 > cqi2) + return -1; + if (cqi1 < cqi2) + return 1; + + return 0; +#if 0 + /* The above order derives from the following. */ + if (round2 > round1) { // Check first if one of the UEs has an active HARQ process which needs service and swap order + swap_UEs(UE_list, UE_id1, UE_id2, 0); + } else if (round2 == round1) { + // RK->NN : I guess this is for fairness in the scheduling. This doesn't make sense unless all UEs have the same configuration of logical channels. This should be done on the sum of all information that has to be sent. And still it wouldn't ensure fairness. It should be based on throughput seen by each UE or maybe using the head_sdu_creation_time, i.e. swap UEs if one is waiting longer for service. + // for(j=0;jUE_template[pCC_id1][UE_id1].dl_buffer_info[1] + + UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[2]) < + (UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[1] + + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[2])) { + swap_UEs(UE_list, UE_id1, UE_id2, 0); + } else if (UE_list->UE_template[pCC_id1] + [UE_id1].dl_buffer_head_sdu_creation_time_max < + UE_list->UE_template[pCC_id2] + [UE_id2].dl_buffer_head_sdu_creation_time_max) { + swap_UEs(UE_list, UE_id1, UE_id2, 0); + } else if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_total < + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_total) { + swap_UEs(UE_list, UE_id1, UE_id2, 0); + } else if (cqi1 < cqi2) { + swap_UEs(UE_list, UE_id1, UE_id2, 0); + } + } +#endif +} // This fuction sorts the UE in order their dlsch buffer and CQI -void sort_UEs (module_id_t Mod_idP, - int frameP, - sub_frame_t subframeP) +void sort_UEs(module_id_t Mod_idP, int frameP, sub_frame_t subframeP) { + int i; + int list[NUMBER_OF_UE_MAX]; + int list_size = 0; + int rnti; + struct sort_ue_dl_params params = { Mod_idP, frameP, subframeP }; + UE_list_t *UE_list = &RC.mac[Mod_idP]->UE_list; - int UE_id1,UE_id2; - int pCC_id1,pCC_id2; - int cqi1,cqi2,round1,round2; - int i=0,ii=0;//,j=0; - rnti_t rnti1,rnti2; + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { - UE_list_t *UE_list = &eNB_mac_inst[Mod_idP].UE_list; + if (UE_list->active[i] == FALSE) + continue; + if ((rnti = UE_RNTI(Mod_idP, i)) == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; - for (i=UE_list->head; i>=0; i=UE_list->next[i]) { - - for(ii=UE_list->next[i]; ii>=0; ii=UE_list->next[ii]) { - - UE_id1 = i; - rnti1 = UE_RNTI(Mod_idP,UE_id1); - if(rnti1 == NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[UE_id1].ul_out_of_sync == 1) - continue; - pCC_id1 = UE_PCCID(Mod_idP,UE_id1); - cqi1 = maxcqi(Mod_idP,UE_id1); // - round1 = maxround(Mod_idP,rnti1,frameP,subframeP,0); - - UE_id2 = ii; - rnti2 = UE_RNTI(Mod_idP,UE_id2); - if(rnti2 == NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[UE_id2].ul_out_of_sync == 1) - continue; - cqi2 = maxcqi(Mod_idP,UE_id2); - round2 = maxround(Mod_idP,rnti2,frameP,subframeP,0); //mac_xface->get_ue_active_harq_pid(Mod_id,rnti2,subframe,&harq_pid2,&round2,0); - pCC_id2 = UE_PCCID(Mod_idP,UE_id2); - - if(round2 > round1) { // Check first if one of the UEs has an active HARQ process which needs service and swap order - swap_UEs(UE_list,UE_id1,UE_id2,0); - } else if (round2 == round1) { - // RK->NN : I guess this is for fairness in the scheduling. This doesn't make sense unless all UEs have the same configuration of logical channels. This should be done on the sum of all information that has to be sent. And still it wouldn't ensure fairness. It should be based on throughput seen by each UE or maybe using the head_sdu_creation_time, i.e. swap UEs if one is waiting longer for service. - // for(j=0;jUE_template[pCC_id1][UE_id1].dl_buffer_info[1] + UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_info[2]) < - (UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[1] + UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_info[2]) ) { - swap_UEs(UE_list,UE_id1,UE_id2,0); - } else if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_head_sdu_creation_time_max < - UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_head_sdu_creation_time_max ) { - swap_UEs(UE_list,UE_id1,UE_id2,0); - } else if (UE_list->UE_template[pCC_id1][UE_id1].dl_buffer_total < - UE_list->UE_template[pCC_id2][UE_id2].dl_buffer_total ) { - swap_UEs(UE_list,UE_id1,UE_id2,0); - } else if (cqi1 < cqi2) { - swap_UEs(UE_list,UE_id1,UE_id2,0); - } - } + list[list_size] = i; + list_size++; } - } + + qsort_r(list, list_size, sizeof(int), ue_dl_compare, ¶ms); + + if (list_size) { + for (i = 0; i < list_size - 1; i++) + UE_list->next[list[i]] = list[i + 1]; + UE_list->next[list[list_size - 1]] = -1; + UE_list->head = list[0]; + } else { + UE_list->head = -1; + } + +#if 0 + + + int UE_id1, UE_id2; + int pCC_id1, pCC_id2; + int cqi1, cqi2, round1, round2; + int i = 0, ii = 0; //,j=0; + rnti_t rnti1, rnti2; + + UE_list_t *UE_list = &RC.mac[Mod_idP]->UE_list; + + for (i = UE_list->head; i >= 0; i = UE_list->next[i]) { + + for (ii = UE_list->next[i]; ii >= 0; ii = UE_list->next[ii]) { + + UE_id1 = i; + rnti1 = UE_RNTI(Mod_idP, UE_id1); + if (rnti1 == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[UE_id1].ul_out_of_sync == 1) + continue; + pCC_id1 = UE_PCCID(Mod_idP, UE_id1); + cqi1 = maxcqi(Mod_idP, UE_id1); // + round1 = maxround(Mod_idP, rnti1, frameP, subframeP, 0); + + UE_id2 = ii; + rnti2 = UE_RNTI(Mod_idP, UE_id2); + if (rnti2 == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[UE_id2].ul_out_of_sync == 1) + continue; + cqi2 = maxcqi(Mod_idP, UE_id2); + round2 = maxround(Mod_idP, rnti2, frameP, subframeP, 0); //mac_xface->get_ue_active_harq_pid(Mod_id,rnti2,subframe,&harq_pid2,&round2,0); + pCC_id2 = UE_PCCID(Mod_idP, UE_id2); + + if (round2 > round1) { // Check first if one of the UEs has an active HARQ process which needs service and swap order + swap_UEs(UE_list, UE_id1, UE_id2, 0); + } else if (round2 == round1) { + // RK->NN : I guess this is for fairness in the scheduling. This doesn't make sense unless all UEs have the same configuration of logical channels. This should be done on the sum of all information that has to be sent. And still it wouldn't ensure fairness. It should be based on throughput seen by each UE or maybe using the head_sdu_creation_time, i.e. swap UEs if one is waiting longer for service. + // for(j=0;jUE_template[pCC_id1][UE_id1]. + dl_buffer_info[1] + + UE_list->UE_template[pCC_id1][UE_id1]. + dl_buffer_info[2]) < + (UE_list->UE_template[pCC_id2][UE_id2]. + dl_buffer_info[1] + + UE_list->UE_template[pCC_id2][UE_id2]. + dl_buffer_info[2])) { + swap_UEs(UE_list, UE_id1, UE_id2, 0); + } else if (UE_list->UE_template[pCC_id1] + [UE_id1].dl_buffer_head_sdu_creation_time_max < + UE_list->UE_template[pCC_id2] + [UE_id2].dl_buffer_head_sdu_creation_time_max) { + swap_UEs(UE_list, UE_id1, UE_id2, 0); + } else if (UE_list->UE_template[pCC_id1][UE_id1]. + dl_buffer_total < + UE_list->UE_template[pCC_id2][UE_id2]. + dl_buffer_total) { + swap_UEs(UE_list, UE_id1, UE_id2, 0); + } else if (cqi1 < cqi2) { + swap_UEs(UE_list, UE_id1, UE_id2, 0); + } + } + } + } +#endif } // This function assigns pre-available RBS to each UE in specified sub-bands before scheduling is done -void dlsch_scheduler_pre_processor (module_id_t Mod_id, - frame_t frameP, - sub_frame_t subframeP, - int N_RBG[MAX_NUM_CCs], - int *mbsfn_flag) +void +dlsch_scheduler_pre_processor(module_id_t Mod_id, + frame_t frameP, + sub_frame_t subframeP, + int N_RBG[MAX_NUM_CCs], int *mbsfn_flag) { - unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX],harq_pid=0,round=0,total_ue_count; - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]; - int UE_id, i; - uint16_t ii,j; - uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - uint16_t nb_rbs_required_remaining_1[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; - uint16_t average_rbs_per_user[MAX_NUM_CCs] = {0}; - rnti_t rnti; - int min_rb_unit[MAX_NUM_CCs]; - uint16_t r1=0; - uint8_t CC_id; - UE_list_t *UE_list = &eNB_mac_inst[Mod_id].UE_list; - LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs] = {0}; + unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], harq_pid = + 0, round = 0, total_ue_count; + unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]; + int UE_id, i; + uint16_t ii, j; + uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + uint16_t nb_rbs_required_remaining_1[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; + uint16_t average_rbs_per_user[MAX_NUM_CCs] = { 0 }; + rnti_t rnti; + int min_rb_unit[MAX_NUM_CCs]; + uint16_t r1 = 0; + uint8_t CC_id; + UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list; - int transmission_mode = 0; - UE_sched_ctrl *ue_sched_ctl; - // int rrc_status = RRC_IDLE; + int N_RB_DL; + int transmission_mode = 0; + UE_sched_ctrl *ue_sched_ctl; + // int rrc_status = RRC_IDLE; + COMMON_channels_t *cc; #ifdef TM5 - int harq_pid1=0,harq_pid2=0; - int round1=0,round2=0; - int UE_id2; - uint16_t i1,i2,i3; - rnti_t rnti1,rnti2; - LTE_eNB_UE_stats *eNB_UE_stats1 = NULL; - LTE_eNB_UE_stats *eNB_UE_stats2 = NULL; - UE_sched_ctrl *ue_sched_ctl1,*ue_sched_ctl2; + int harq_pid1 = 0; + int round1 = 0, round2 = 0; + int UE_id2; + uint16_t i1, i2, i3; + rnti_t rnti1, rnti2; + LTE_eNB_UE_stats *eNB_UE_stats1 = NULL; + LTE_eNB_UE_stats *eNB_UE_stats2 = NULL; + UE_sched_ctrl *ue_sched_ctl1, *ue_sched_ctl2; #endif - for (CC_id=0; CC_id0) // If this CC is allocated for MBSFN skip it here - continue; - - frame_parms[CC_id] = mac_xface->get_lte_frame_parms(Mod_id,CC_id); - - - min_rb_unit[CC_id]=get_min_rb_unit(Mod_id,CC_id); - - for (i=UE_list->head; i>=0; i=UE_list->next[i]) { - UE_id = i; - // Initialize scheduling information for all active UEs - - - - dlsch_scheduler_pre_processor_reset(Mod_id, - UE_id, - CC_id, - frameP, - subframeP, - N_RBG[CC_id], - nb_rbs_required, - nb_rbs_required_remaining, - rballoc_sub, - MIMO_mode_indicator); - - } - } - - - // Store the DLSCH buffer for each logical channel - store_dlsch_buffer (Mod_id,frameP,subframeP); - - - - // Calculate the number of RBs required by each UE on the basis of logical channel's buffer - assign_rbs_required (Mod_id,frameP,subframeP,nb_rbs_required,min_rb_unit); - - - - // Sorts the user on the basis of dlsch logical channel buffer and CQI - sort_UEs (Mod_id,frameP,subframeP); - - - - total_ue_count =0; - - // loop over all active UEs - for (i=UE_list->head; i>=0; i=UE_list->next[i]) { - rnti = UE_RNTI(Mod_id,i); - - if(rnti == NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) - continue; - UE_id = i; - - // if there is no available harq_process, skip the UE - if (UE_list->UE_sched_ctrl[UE_id].harq_pid[CC_id]<0) - continue; - - for (ii=0; iiordered_CCids[ii][UE_id]; - ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; - harq_pid = ue_sched_ctl->harq_pid[CC_id]; - round = ue_sched_ctl->round[CC_id]; - - average_rbs_per_user[CC_id]=0; - - frame_parms[CC_id] = mac_xface->get_lte_frame_parms(Mod_id,CC_id); - - // mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0); - - if(round>0) { - nb_rbs_required[CC_id][UE_id] = UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; - } - - //nb_rbs_required_remaining[UE_id] = nb_rbs_required[UE_id]; - if (nb_rbs_required[CC_id][UE_id] > 0) { - total_ue_count = total_ue_count + 1; - } - - - // hypotetical assignement - /* - * If schedule is enabled and if the priority of the UEs is modified - * The average rbs per logical channel per user will depend on the level of - * priority. Concerning the hypothetical assignement, we should assign more - * rbs to prioritized users. Maybe, we can do a mapping between the - * average rbs per user and the level of priority or multiply the average rbs - * per user by a coefficient which represents the degree of priority. - */ - - if (total_ue_count == 0) { - average_rbs_per_user[CC_id] = 0; - } else if( (min_rb_unit[CC_id] * total_ue_count) <= (frame_parms[CC_id]->N_RB_DL) ) { - average_rbs_per_user[CC_id] = (uint16_t) floor(frame_parms[CC_id]->N_RB_DL/total_ue_count); - } else { - average_rbs_per_user[CC_id] = min_rb_unit[CC_id]; // consider the total number of use that can be scheduled UE - } - } - } - - // note: nb_rbs_required is assigned according to total_buffer_dl - // extend nb_rbs_required to capture per LCID RB required - for(i=UE_list->head; i>=0; i=UE_list->next[i]) { - rnti = UE_RNTI(Mod_id,i); - - for (ii=0; iiordered_CCids[ii][i]; - - // control channel - if (mac_eNB_get_rrc_status(Mod_id,rnti) < RRC_RECONFIGURED) { - nb_rbs_required_remaining_1[CC_id][i] = nb_rbs_required[CC_id][i]; - } else { - nb_rbs_required_remaining_1[CC_id][i] = cmin(average_rbs_per_user[CC_id],nb_rbs_required[CC_id][i]); - - } - } - } - - //Allocation to UEs is done in 2 rounds, - // 1st stage: average number of RBs allocated to each UE - // 2nd stage: remaining RBs are allocated to high priority UEs - for(r1=0; r1<2; r1++) { - - for(i=UE_list->head; i>=0; i=UE_list->next[i]) { - for (ii=0; iiordered_CCids[ii][i]; - - if(r1 == 0) { - nb_rbs_required_remaining[CC_id][i] = nb_rbs_required_remaining_1[CC_id][i]; - } else { // rb required based only on the buffer - rb allloctaed in the 1st round + extra reaming rb form the 1st round - nb_rbs_required_remaining[CC_id][i] = nb_rbs_required[CC_id][i]-nb_rbs_required_remaining_1[CC_id][i]+nb_rbs_required_remaining[CC_id][i]; - } - - if (nb_rbs_required[CC_id][i]> 0 ) - LOG_D(MAC,"round %d : nb_rbs_required_remaining[%d][%d]= %d (remaining_1 %d, required %d, pre_nb_available_rbs %d, N_RBG %d, rb_unit %d)\n", - r1, CC_id, i, - nb_rbs_required_remaining[CC_id][i], - nb_rbs_required_remaining_1[CC_id][i], - nb_rbs_required[CC_id][i], - UE_list->UE_sched_ctrl[i].pre_nb_available_rbs[CC_id], - N_RBG[CC_id], - min_rb_unit[CC_id]); - - } - } - - if (total_ue_count > 0 ) { - for(i=UE_list->head; i>=0; i=UE_list->next[i]) { - UE_id = i; - - for (ii=0; iiordered_CCids[ii][UE_id]; - ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; - harq_pid = ue_sched_ctl->harq_pid[CC_id]; - round = ue_sched_ctl->round[CC_id]; - - rnti = UE_RNTI(Mod_id,UE_id); - - // LOG_D(MAC,"UE %d rnti 0x\n", UE_id, rnti ); - if(rnti == NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 1) + if (mbsfn_flag[CC_id] > 0) // If this CC is allocated for MBSFN skip it here continue; - transmission_mode = mac_xface->get_transmission_mode(Mod_id,CC_id,rnti); - // mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0); - //rrc_status = mac_eNB_get_rrc_status(Mod_id,rnti); - /* 1st allocate for the retx */ - - // retransmission in data channels - // control channel in the 1st transmission - // data channel for all TM - LOG_T(MAC,"calling dlsch_scheduler_pre_processor_allocate .. \n "); - dlsch_scheduler_pre_processor_allocate (Mod_id, - UE_id, - CC_id, - N_RBG[CC_id], - transmission_mode, - min_rb_unit[CC_id], - frame_parms[CC_id]->N_RB_DL, - nb_rbs_required, - nb_rbs_required_remaining, - rballoc_sub, - MIMO_mode_indicator); - -#ifdef TM5 - - // data chanel TM5: to be revisted - if ((round == 0 ) && - (transmission_mode == 5) && - (ue_sched_ctl->dl_pow_off[CC_id] != 1)) { - - for(j=0; jrballoc_sub_UE[CC_id][j] == 0)) || - ((j < (N_RBG[CC_id]-1)) && (rballoc_sub[CC_id][j+1] == 0) && (ue_sched_ctl->rballoc_sub_UE[CC_id][j+1] == 0)) ) && - (nb_rbs_required_remaining[CC_id][UE_id]>0)) { - - for (ii = UE_list->next[i+1]; ii >=0; ii=UE_list->next[ii]) { - - UE_id2 = ii; - rnti2 = UE_RNTI(Mod_id,UE_id2); - ue_sched_ctl2 = &UE_list->UE_sched_ctrl[UE_id2]; - harq_pid2 = ue_sched_ctl2->harq_pid[CC_id]; - round2 = ue_sched_ctl2->round[CC_id]; - if(rnti2 == NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[UE_id2].ul_out_of_sync == 1) - continue; - - eNB_UE_stats2 = mac_xface->get_eNB_UE_stats(Mod_id,CC_id,rnti2); - //mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti2,frameP,subframeP,&harq_pid2,&round2,0); - - if ((mac_eNB_get_rrc_status(Mod_id,rnti2) >= RRC_RECONFIGURED) && - (round2==0) && - (mac_xface->get_transmission_mode(Mod_id,CC_id,rnti2)==5) && - (ue_sched_ctl->dl_pow_off[CC_id] != 1)) { - - if( (((j == (N_RBG[CC_id]-1)) && (ue_sched_ctl->rballoc_sub_UE[CC_id][j] == 0)) || - ((j < (N_RBG[CC_id]-1)) && (ue_sched_ctl->rballoc_sub_UE[CC_id][j+1] == 0)) ) && - (nb_rbs_required_remaining[CC_id][UE_id2]>0)) { - - if((((eNB_UE_stats2->DL_pmi_single^eNB_UE_stats1->DL_pmi_single)<<(14-j))&0xc000)== 0x4000) { //MU-MIMO only for 25 RBs configuration - - rballoc_sub[CC_id][j] = 1; - ue_sched_ctl->rballoc_sub_UE[CC_id][j] = 1; - ue_sched_ctl2->rballoc_sub_UE[CC_id][j] = 1; - MIMO_mode_indicator[CC_id][j] = 0; - - if (j< N_RBG[CC_id]-1) { - rballoc_sub[CC_id][j+1] = 1; - ue_sched_ctl->rballoc_sub_UE[CC_id][j+1] = 1; - ue_sched_ctl2->rballoc_sub_UE[CC_id][j+1] = 1; - MIMO_mode_indicator[CC_id][j+1] = 0; - } - - ue_sched_ctl->dl_pow_off[CC_id] = 0; - ue_sched_ctl2->dl_pow_off[CC_id] = 0; - if ((j == N_RBG[CC_id]-1) && - ((PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms.N_RB_DL == 25) || - (PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms.N_RB_DL == 50))) { - - nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit[CC_id]+1; - ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit[CC_id]-1; - nb_rbs_required_remaining[CC_id][UE_id2] = nb_rbs_required_remaining[CC_id][UE_id2] - min_rb_unit[CC_id]+1; - ue_sched_ctl2->pre_nb_available_rbs[CC_id] = ue_sched_ctl2->pre_nb_available_rbs[CC_id] + min_rb_unit[CC_id]-1; - } else { - - nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - 4; - ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + 4; - nb_rbs_required_remaining[CC_id][UE_id2] = nb_rbs_required_remaining[CC_id][UE_id2] - 4; - ue_sched_ctl2->pre_nb_available_rbs[CC_id] = ue_sched_ctl2->pre_nb_available_rbs[CC_id] + 4; - } + min_rb_unit[CC_id] = get_min_rb_unit(Mod_id, CC_id); - break; - } - } - } - } - } - } - } + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (UE_list->active[i] != TRUE) + continue; -#endif - } - } - } // total_ue_count - } // end of for for r1 and r2 - -#ifdef TM5 - - // This has to be revisited!!!! - for (CC_id=0; CC_id0) && (i3==0)) { - PHY_vars_eNB_g[Mod_id][CC_id]->check_for_SUMIMO_transmissions = PHY_vars_eNB_g[Mod_id][CC_id]->check_for_SUMIMO_transmissions + 1; - } - - if(i3 == N_RBG[CC_id] && i1==0 && i2==0) { - PHY_vars_eNB_g[Mod_id][CC_id]->FULL_MUMIMO_transmissions = PHY_vars_eNB_g[Mod_id][CC_id]->FULL_MUMIMO_transmissions + 1; - } - - if((i1 < N_RBG[CC_id]) && (i3 > 0)) { - PHY_vars_eNB_g[Mod_id][CC_id]->check_for_MUMIMO_transmissions = PHY_vars_eNB_g[Mod_id][CC_id]->check_for_MUMIMO_transmissions + 1; - } - - PHY_vars_eNB_g[Mod_id][CC_id]->check_for_total_transmissions = PHY_vars_eNB_g[Mod_id][CC_id]->check_for_total_transmissions + 1; - - } - -#endif - - for(i=UE_list->head; i>=0; i=UE_list->next[i]) { - UE_id = i; - ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; - - for (ii=0; iiordered_CCids[ii][UE_id]; - //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].dl_pow_off = dl_pow_off[UE_id]; - - if (ue_sched_ctl->pre_nb_available_rbs[CC_id] > 0 ) { - LOG_D(MAC,"******************DL Scheduling Information for UE%d ************************\n",UE_id); - LOG_D(MAC,"dl power offset UE%d = %d \n",UE_id,ue_sched_ctl->dl_pow_off[CC_id]); - LOG_D(MAC,"***********RB Alloc for every subband for UE%d ***********\n",UE_id); - - for(j=0; jmu_mimo_mode[UE_id].rballoc_sub[i] = rballoc_sub_UE[CC_id][UE_id][i]; - LOG_D(MAC,"RB Alloc for UE%d and Subband%d = %d\n",UE_id,j,ue_sched_ctl->rballoc_sub_UE[CC_id][j]); - } - - //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = pre_nb_available_rbs[CC_id][UE_id]; - LOG_D(MAC,"Total RBs allocated for UE%d = %d\n",UE_id,ue_sched_ctl->pre_nb_available_rbs[CC_id]); - } - } - } -} - -#define SF05_LIMIT 1 - -void dlsch_scheduler_pre_processor_reset (int module_idP, - int UE_id, - uint8_t CC_id, - int frameP, - int subframeP, - int N_RBG, - uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]) - -{ - int i,j; - UE_list_t *UE_list=&eNB_mac_inst[module_idP].UE_list; - UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; - rnti_t rnti = UE_RNTI(module_idP,UE_id); - uint8_t *vrb_map = eNB_mac_inst[module_idP].common_channels[CC_id].vrb_map; - int RBGsize = PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL/N_RBG; -#ifdef SF05_LIMIT - //int subframe05_limit=0; - int sf05_upper=-1,sf05_lower=-1; -#endif - LTE_eNB_UE_stats *eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); - // initialize harq_pid and round - mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti, - frameP,subframeP, - &ue_sched_ctl->harq_pid[CC_id], - &ue_sched_ctl->round[CC_id], - 0); - if (ue_sched_ctl->ta_timer == 0) { - - // WE SHOULD PROTECT the eNB_UE_stats with a mutex here ... - - ue_sched_ctl->ta_timer = 20; // wait 20 subframes before taking TA measurement from PHY - switch (PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.N_RB_DL) { - case 6: - ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update; - break; - - case 15: - ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/2; - break; - - case 25: - ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/4; - break; - - case 50: - ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/8; - break; - - case 75: - ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/12; - break; - - case 100: - ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/16; - break; - } - // clear the update in case PHY does not have a new measurement after timer expiry - eNB_UE_stats->timing_advance_update = 0; - } - else { - ue_sched_ctl->ta_timer--; - ue_sched_ctl->ta_update =0; // don't trigger a timing advance command - } - if (UE_id==0) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_TIMING_ADVANCE,ue_sched_ctl->ta_update); - } - nb_rbs_required[CC_id][UE_id]=0; - ue_sched_ctl->pre_nb_available_rbs[CC_id] = 0; - ue_sched_ctl->dl_pow_off[CC_id] = 2; - nb_rbs_required_remaining[CC_id][UE_id] = 0; - -#ifdef SF05_LIMIT - switch (N_RBG) { - case 6: - sf05_lower=0; - sf05_upper=5; - break; - case 8: - sf05_lower=2; - sf05_upper=5; - break; - case 13: - sf05_lower=4; - sf05_upper=7; - break; - case 17: - sf05_lower=7; - sf05_upper=9; - break; - case 25: - sf05_lower=11; - sf05_upper=13; - break; - } -#endif - // Initialize Subbands according to VRB map - for (i=0; irballoc_sub_UE[CC_id][i] = 0; - rballoc_sub[CC_id][i] = 0; -#ifdef SF05_LIMIT - // for avoiding 6+ PRBs around DC in subframe 0-5 (avoid excessive errors) - - if ((subframeP==0 || subframeP==5) && - (i>=sf05_lower && i<=sf05_upper)) - rballoc_sub[CC_id][i]=1; -#endif - // for SI-RNTI,RA-RNTI and P-RNTI allocations - for (j=0;jUE_sched_ctrl[UE_id]; + dlsch_scheduler_pre_processor_reset(Mod_id, + UE_id, + CC_id, + frameP, + subframeP, + N_RBG[CC_id], + nb_rbs_required, + nb_rbs_required_remaining, + rballoc_sub, + MIMO_mode_indicator); - for(i=0; irballoc_sub_UE[CC_id][i] == 0) && - (nb_rbs_required_remaining[CC_id][UE_id]>0) && - (ue_sched_ctl->pre_nb_available_rbs[CC_id] < nb_rbs_required[CC_id][UE_id])) { - - // if this UE is not scheduled for TM5 - if (ue_sched_ctl->dl_pow_off[CC_id] != 0 ) { - - if ((i == N_RBG-1) && ((N_RB_DL == 25) || (N_RB_DL == 50))) { - rballoc_sub[CC_id][i] = 1; - ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; - MIMO_mode_indicator[CC_id][i] = 1; - if (transmission_mode == 5 ) { - ue_sched_ctl->dl_pow_off[CC_id] = 1; - } - nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit+1; - ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit - 1; - } else { - if (nb_rbs_required_remaining[CC_id][UE_id] >= min_rb_unit){ - rballoc_sub[CC_id][i] = 1; - ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; - MIMO_mode_indicator[CC_id][i] = 1; - if (transmission_mode == 5 ) { - ue_sched_ctl->dl_pow_off[CC_id] = 1; - } - nb_rbs_required_remaining[CC_id][UE_id] = nb_rbs_required_remaining[CC_id][UE_id] - min_rb_unit; - ue_sched_ctl->pre_nb_available_rbs[CC_id] = ue_sched_ctl->pre_nb_available_rbs[CC_id] + min_rb_unit; - } } - } // dl_pow_off[CC_id][UE_id] ! = 0 } - } + + // Store the DLSCH buffer for each logical channel + store_dlsch_buffer(Mod_id, frameP, subframeP); + + + + // Calculate the number of RBs required by each UE on the basis of logical channel's buffer + assign_rbs_required(Mod_id, frameP, subframeP, nb_rbs_required, + min_rb_unit); + + + + // Sorts the user on the basis of dlsch logical channel buffer and CQI + sort_UEs(Mod_id, frameP, subframeP); + + + + total_ue_count = 0; + + // loop over all active UEs + for (i = UE_list->head; i >= 0; i = UE_list->next[i]) { + rnti = UE_RNTI(Mod_id, i); + + if (rnti == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; + UE_id = i; + + for (ii = 0; ii < UE_num_active_CC(UE_list, UE_id); ii++) { + CC_id = UE_list->ordered_CCids[ii][UE_id]; + ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + cc = &RC.mac[Mod_id]->common_channels[ii]; + if (cc->tdd_Config) + harq_pid = ((frameP * 10) + subframeP) % 10; + else + harq_pid = ((frameP * 10) + subframeP) & 7; + round = ue_sched_ctl->round[CC_id][harq_pid]; + + average_rbs_per_user[CC_id] = 0; + + + if (round != 8) { + nb_rbs_required[CC_id][UE_id] = + UE_list->UE_template[CC_id][UE_id].nb_rb[harq_pid]; + } + //nb_rbs_required_remaining[UE_id] = nb_rbs_required[UE_id]; + if (nb_rbs_required[CC_id][UE_id] > 0) { + total_ue_count = total_ue_count + 1; + } + // hypothetical assignment + /* + * If schedule is enabled and if the priority of the UEs is modified + * The average rbs per logical channel per user will depend on the level of + * priority. Concerning the hypothetical assignement, we should assign more + * rbs to prioritized users. Maybe, we can do a mapping between the + * average rbs per user and the level of priority or multiply the average rbs + * per user by a coefficient which represents the degree of priority. + */ + + N_RB_DL = + to_prb(RC.mac[Mod_id]->common_channels[CC_id].mib-> + message.dl_Bandwidth); + + if (total_ue_count == 0) { + average_rbs_per_user[CC_id] = 0; + } else if ((min_rb_unit[CC_id] * total_ue_count) <= (N_RB_DL)) { + average_rbs_per_user[CC_id] = + (uint16_t) floor(N_RB_DL / total_ue_count); + } else { + average_rbs_per_user[CC_id] = min_rb_unit[CC_id]; // consider the total number of use that can be scheduled UE + } + } + } + + // note: nb_rbs_required is assigned according to total_buffer_dl + // extend nb_rbs_required to capture per LCID RB required + for (i = UE_list->head; i >= 0; i = UE_list->next[i]) { + rnti = UE_RNTI(Mod_id, i); + + if (rnti == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; + + for (ii = 0; ii < UE_num_active_CC(UE_list, i); ii++) { + CC_id = UE_list->ordered_CCids[ii][i]; + ue_sched_ctl = &UE_list->UE_sched_ctrl[i]; + round = ue_sched_ctl->round[CC_id][harq_pid]; + + // control channel or retransmission + /* TODO: do we have to check for retransmission? */ + if (mac_eNB_get_rrc_status(Mod_id, rnti) < RRC_RECONFIGURED + || round > 0) { + nb_rbs_required_remaining_1[CC_id][i] = + nb_rbs_required[CC_id][i]; + } else { + nb_rbs_required_remaining_1[CC_id][i] = + cmin(average_rbs_per_user[CC_id], + nb_rbs_required[CC_id][i]); + + } + } + } + + //Allocation to UEs is done in 2 rounds, + // 1st stage: average number of RBs allocated to each UE + // 2nd stage: remaining RBs are allocated to high priority UEs + for (r1 = 0; r1 < 2; r1++) { + + for (i = UE_list->head; i >= 0; i = UE_list->next[i]) { + for (ii = 0; ii < UE_num_active_CC(UE_list, i); ii++) { + CC_id = UE_list->ordered_CCids[ii][i]; + + if (r1 == 0) { + nb_rbs_required_remaining[CC_id][i] = + nb_rbs_required_remaining_1[CC_id][i]; + } else { // rb required based only on the buffer - rb allloctaed in the 1st round + extra reaming rb form the 1st round + nb_rbs_required_remaining[CC_id][i] = + nb_rbs_required[CC_id][i] - + nb_rbs_required_remaining_1[CC_id][i] + + nb_rbs_required_remaining[CC_id][i]; + if (nb_rbs_required_remaining[CC_id][i] < 0) + abort(); + } + + if (nb_rbs_required[CC_id][i] > 0) + LOG_D(MAC, + "round %d : nb_rbs_required_remaining[%d][%d]= %d (remaining_1 %d, required %d, pre_nb_available_rbs %d, N_RBG %d, rb_unit %d)\n", + r1, CC_id, i, + nb_rbs_required_remaining[CC_id][i], + nb_rbs_required_remaining_1[CC_id][i], + nb_rbs_required[CC_id][i], + UE_list->UE_sched_ctrl[i]. + pre_nb_available_rbs[CC_id], N_RBG[CC_id], + min_rb_unit[CC_id]); + + } + } + + if (total_ue_count > 0) { + for (i = UE_list->head; i >= 0; i = UE_list->next[i]) { + UE_id = i; + + for (ii = 0; ii < UE_num_active_CC(UE_list, UE_id); ii++) { + CC_id = UE_list->ordered_CCids[ii][UE_id]; + ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + round = ue_sched_ctl->round[CC_id][harq_pid]; + + rnti = UE_RNTI(Mod_id, UE_id); + + // LOG_D(MAC,"UE %d rnti 0x\n", UE_id, rnti ); + if (rnti == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[UE_id].ul_out_of_sync == 1) + continue; + + transmission_mode = get_tmode(Mod_id, CC_id, UE_id); + // mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti,frameP,subframeP,&harq_pid,&round,0); + //rrc_status = mac_eNB_get_rrc_status(Mod_id,rnti); + /* 1st allocate for the retx */ + + // retransmission in data channels + // control channel in the 1st transmission + // data channel for all TM + LOG_T(MAC, + "calling dlsch_scheduler_pre_processor_allocate .. \n "); + dlsch_scheduler_pre_processor_allocate(Mod_id, UE_id, + CC_id, + N_RBG[CC_id], + transmission_mode, + min_rb_unit + [CC_id], + to_prb(RC.mac + [Mod_id]->common_channels + [CC_id].mib->message.dl_Bandwidth), + nb_rbs_required, + nb_rbs_required_remaining, + rballoc_sub, + MIMO_mode_indicator); + +#ifdef TM5 + + // data chanel TM5: to be revisted + if ((round == 0) && + (transmission_mode == 5) && + (ue_sched_ctl->dl_pow_off[CC_id] != 1)) { + + for (j = 0; j < N_RBG[CC_id]; j += 2) { + + if ((((j == (N_RBG[CC_id] - 1)) + && (rballoc_sub[CC_id][j] == 0) + && (ue_sched_ctl-> + rballoc_sub_UE[CC_id][j] == 0)) + || ((j < (N_RBG[CC_id] - 1)) + && (rballoc_sub[CC_id][j + 1] == 0) + && + (ue_sched_ctl->rballoc_sub_UE + [CC_id][j + 1] == 0))) + && (nb_rbs_required_remaining[CC_id][UE_id] + > 0)) { + + for (ii = UE_list->next[i + 1]; ii >= 0; + ii = UE_list->next[ii]) { + + UE_id2 = ii; + rnti2 = UE_RNTI(Mod_id, UE_id2); + ue_sched_ctl2 = + &UE_list->UE_sched_ctrl[UE_id2]; + round2 = ue_sched_ctl2->round[CC_id]; + if (rnti2 == NOT_A_RNTI) + continue; + if (UE_list-> + UE_sched_ctrl + [UE_id2].ul_out_of_sync == 1) + continue; + + eNB_UE_stats2 = + UE_list-> + eNB_UE_stats[CC_id][UE_id2]; + //mac_xface->get_ue_active_harq_pid(Mod_id,CC_id,rnti2,frameP,subframeP,&harq_pid2,&round2,0); + + if ((mac_eNB_get_rrc_status + (Mod_id, + rnti2) >= RRC_RECONFIGURED) + && (round2 == 0) + && + (get_tmode(Mod_id, CC_id, UE_id2) + == 5) + && (ue_sched_ctl-> + dl_pow_off[CC_id] != 1)) { + + if ((((j == (N_RBG[CC_id] - 1)) + && + (ue_sched_ctl->rballoc_sub_UE + [CC_id][j] == 0)) + || ((j < (N_RBG[CC_id] - 1)) + && + (ue_sched_ctl-> + rballoc_sub_UE[CC_id][j + + 1] + == 0))) + && + (nb_rbs_required_remaining + [CC_id] + [UE_id2] > 0)) { + + if ((((eNB_UE_stats2-> + DL_pmi_single ^ + eNB_UE_stats1-> + DL_pmi_single) + << (14 - j)) & 0xc000) == 0x4000) { //MU-MIMO only for 25 RBs configuration + + rballoc_sub[CC_id][j] = 1; + ue_sched_ctl-> + rballoc_sub_UE[CC_id] + [j] = 1; + ue_sched_ctl2-> + rballoc_sub_UE[CC_id] + [j] = 1; + MIMO_mode_indicator[CC_id] + [j] = 0; + + if (j < N_RBG[CC_id] - 1) { + rballoc_sub[CC_id][j + + 1] = + 1; + ue_sched_ctl-> + rballoc_sub_UE + [CC_id][j + 1] = 1; + ue_sched_ctl2->rballoc_sub_UE + [CC_id][j + 1] = 1; + MIMO_mode_indicator + [CC_id][j + 1] + = 0; + } + + ue_sched_ctl-> + dl_pow_off[CC_id] + = 0; + ue_sched_ctl2-> + dl_pow_off[CC_id] + = 0; + + + if ((j == N_RBG[CC_id] - 1) + && ((N_RB_DL == 25) + || (N_RB_DL == + 50))) { + + nb_rbs_required_remaining + [CC_id][UE_id] = + nb_rbs_required_remaining + [CC_id][UE_id] - + min_rb_unit[CC_id] + + 1; + ue_sched_ctl->pre_nb_available_rbs + [CC_id] = + ue_sched_ctl->pre_nb_available_rbs + [CC_id] + + min_rb_unit[CC_id] + - 1; + nb_rbs_required_remaining + [CC_id][UE_id2] = + nb_rbs_required_remaining + [CC_id][UE_id2] - + min_rb_unit[CC_id] + + 1; + ue_sched_ctl2->pre_nb_available_rbs + [CC_id] = + ue_sched_ctl2->pre_nb_available_rbs + [CC_id] + + min_rb_unit[CC_id] + - 1; + } else { + + nb_rbs_required_remaining + [CC_id][UE_id] = + nb_rbs_required_remaining + [CC_id][UE_id] - 4; + ue_sched_ctl->pre_nb_available_rbs + [CC_id] = + ue_sched_ctl->pre_nb_available_rbs + [CC_id] + 4; + nb_rbs_required_remaining + [CC_id][UE_id2] = + nb_rbs_required_remaining + [CC_id][UE_id2] - + 4; + ue_sched_ctl2->pre_nb_available_rbs + [CC_id] = + ue_sched_ctl2->pre_nb_available_rbs + [CC_id] + 4; + } + + break; + } + } + } + } + } + } + } +#endif + } + } + } // total_ue_count + } // end of for for r1 and r2 + +#ifdef TM5 + + // This has to be revisited!!!! + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + i1 = 0; + i2 = 0; + i3 = 0; + + for (j = 0; j < N_RBG[CC_id]; j++) { + if (MIMO_mode_indicator[CC_id][j] == 2) { + i1 = i1 + 1; + } else if (MIMO_mode_indicator[CC_id][j] == 1) { + i2 = i2 + 1; + } else if (MIMO_mode_indicator[CC_id][j] == 0) { + i3 = i3 + 1; + } + } + + if ((i1 < N_RBG[CC_id]) && (i2 > 0) && (i3 == 0)) { + PHY_vars_eNB_g[Mod_id][CC_id]->check_for_SUMIMO_transmissions = + PHY_vars_eNB_g[Mod_id][CC_id]-> + check_for_SUMIMO_transmissions + 1; + } + + if (i3 == N_RBG[CC_id] && i1 == 0 && i2 == 0) { + PHY_vars_eNB_g[Mod_id][CC_id]->FULL_MUMIMO_transmissions = + PHY_vars_eNB_g[Mod_id][CC_id]->FULL_MUMIMO_transmissions + + 1; + } + + if ((i1 < N_RBG[CC_id]) && (i3 > 0)) { + PHY_vars_eNB_g[Mod_id][CC_id]->check_for_MUMIMO_transmissions = + PHY_vars_eNB_g[Mod_id][CC_id]-> + check_for_MUMIMO_transmissions + 1; + } + + PHY_vars_eNB_g[Mod_id][CC_id]->check_for_total_transmissions = + PHY_vars_eNB_g[Mod_id][CC_id]->check_for_total_transmissions + + 1; + + } + +#endif + + for (i = UE_list->head; i >= 0; i = UE_list->next[i]) { + UE_id = i; + ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + + for (ii = 0; ii < UE_num_active_CC(UE_list, UE_id); ii++) { + CC_id = UE_list->ordered_CCids[ii][UE_id]; + //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].dl_pow_off = dl_pow_off[UE_id]; + + if (ue_sched_ctl->pre_nb_available_rbs[CC_id] > 0) { + LOG_D(MAC, + "******************DL Scheduling Information for UE%d ************************\n", + UE_id); + LOG_D(MAC, "dl power offset UE%d = %d \n", UE_id, + ue_sched_ctl->dl_pow_off[CC_id]); + LOG_D(MAC, + "***********RB Alloc for every subband for UE%d ***********\n", + UE_id); + + for (j = 0; j < N_RBG[CC_id]; j++) { + //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].rballoc_sub[i] = rballoc_sub_UE[CC_id][UE_id][i]; + LOG_D(MAC, "RB Alloc for UE%d and Subband%d = %d\n", + UE_id, j, + ue_sched_ctl->rballoc_sub_UE[CC_id][j]); + } + + //PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = pre_nb_available_rbs[CC_id][UE_id]; + LOG_D(MAC, "Total RBs allocated for UE%d = %d\n", UE_id, + ue_sched_ctl->pre_nb_available_rbs[CC_id]); + } + } + } +} + +#define SF0_LIMIT 1 + +void +dlsch_scheduler_pre_processor_reset(int module_idP, + int UE_id, + uint8_t CC_id, + int frameP, + int subframeP, + int N_RBG, + uint16_t nb_rbs_required[MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], + uint16_t + nb_rbs_required_remaining + [MAX_NUM_CCs][NUMBER_OF_UE_MAX], + unsigned char + rballoc_sub[MAX_NUM_CCs] + [N_RBG_MAX], unsigned char + MIMO_mode_indicator[MAX_NUM_CCs] + [N_RBG_MAX]) +{ + int i, j; + UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; + UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + rnti_t rnti = UE_RNTI(module_idP, UE_id); + + uint8_t *vrb_map = RC.mac[module_idP]->common_channels[CC_id].vrb_map; + int N_RB_DL = + to_prb(RC.mac[module_idP]->common_channels[CC_id].mib-> + message.dl_Bandwidth); + int RBGsize = N_RB_DL / N_RBG, RBGsize_last; +#ifdef SF0_LIMIT + int sf0_upper = -1, sf0_lower = -1; +#endif + + + LOG_D(MAC, "Running preprocessor for UE %d (%x)\n", UE_id, rnti); + // initialize harq_pid and round + + if (ue_sched_ctl->ta_timer) + ue_sched_ctl->ta_timer--; + + /* + eNB_UE_stats *eNB_UE_stats; + + if (eNB_UE_stats == NULL) + return; + + + mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti, + frameP,subframeP, + &ue_sched_ctl->harq_pid[CC_id], + &ue_sched_ctl->round[CC_id], + openair_harq_DL); + + + if (ue_sched_ctl->ta_timer == 0) { + + // WE SHOULD PROTECT the eNB_UE_stats with a mutex here ... + + ue_sched_ctl->ta_timer = 20; // wait 20 subframes before taking TA measurement from PHY + switch (N_RB_DL) { + case 6: + ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update; + break; + + case 15: + ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/2; + break; + + case 25: + ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/4; + break; + + case 50: + ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/8; + break; + + case 75: + ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/12; + break; + + case 100: + ue_sched_ctl->ta_update = eNB_UE_stats->timing_advance_update/16; + break; + } + // clear the update in case PHY does not have a new measurement after timer expiry + eNB_UE_stats->timing_advance_update = 0; + } + else { + ue_sched_ctl->ta_timer--; + ue_sched_ctl->ta_update =0; // don't trigger a timing advance command + } + + + if (UE_id==0) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_TIMING_ADVANCE,ue_sched_ctl->ta_update); + } + */ + + nb_rbs_required[CC_id][UE_id] = 0; + ue_sched_ctl->pre_nb_available_rbs[CC_id] = 0; + ue_sched_ctl->dl_pow_off[CC_id] = 2; + nb_rbs_required_remaining[CC_id][UE_id] = 0; + + switch (N_RB_DL) { + case 6: + RBGsize = 1; + RBGsize_last = 1; + break; + case 15: + RBGsize = 2; + RBGsize_last = 1; + break; + case 25: + RBGsize = 2; + RBGsize_last = 1; + break; + case 50: + RBGsize = 3; + RBGsize_last = 2; + break; + case 75: + RBGsize = 4; + RBGsize_last = 3; + break; + case 100: + RBGsize = 4; + RBGsize_last = 4; + break; + default: + AssertFatal(1 == 0, "unsupported RBs (%d)\n", N_RB_DL); + } + +#ifdef SF0_LIMIT + switch (N_RBG) { + case 6: + sf0_lower = 0; + sf0_upper = 5; + break; + case 8: + sf0_lower = 2; + sf0_upper = 5; + break; + case 13: + sf0_lower = 4; + sf0_upper = 7; + break; + case 17: + sf0_lower = 7; + sf0_upper = 9; + break; + case 25: + sf0_lower = 11; + sf0_upper = 13; + break; + default: + AssertFatal(1 == 0, "unsupported RBs (%d)\n", N_RB_DL); + } +#endif + // Initialize Subbands according to VRB map + for (i = 0; i < N_RBG; i++) { + int rb_size = i == N_RBG - 1 ? RBGsize_last : RBGsize; + + ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 0; + rballoc_sub[CC_id][i] = 0; +#ifdef SF0_LIMIT + // for avoiding 6+ PRBs around DC in subframe 0 (avoid excessive errors) + /* TODO: make it proper - allocate those RBs, do not "protect" them, but + * compute number of available REs and limit MCS according to the + * TBS table 36.213 7.1.7.2.1-1 (can be done after pre-processor) + */ + if (subframeP == 0 && i >= sf0_lower && i <= sf0_upper) + rballoc_sub[CC_id][i] = 1; +#endif + // for SI-RNTI,RA-RNTI and P-RNTI allocations + for (j = 0; j < rb_size; j++) { + if (vrb_map[j + (i * RBGsize)] != 0) { + rballoc_sub[CC_id][i] = 1; + LOG_D(MAC, "Frame %d, subframe %d : vrb %d allocated\n", + frameP, subframeP, j + (i * RBGsize)); + break; + } + } + LOG_D(MAC, "Frame %d Subframe %d CC_id %d RBG %i : rb_alloc %d\n", + frameP, subframeP, CC_id, i, rballoc_sub[CC_id][i]); + MIMO_mode_indicator[CC_id][i] = 2; + } +} + + +void +dlsch_scheduler_pre_processor_allocate(module_id_t Mod_id, + int UE_id, + uint8_t CC_id, + int N_RBG, + int transmission_mode, + int min_rb_unit, + uint8_t N_RB_DL, + uint16_t + nb_rbs_required[MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], + uint16_t + nb_rbs_required_remaining + [MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], unsigned char + rballoc_sub[MAX_NUM_CCs] + [N_RBG_MAX], unsigned char + MIMO_mode_indicator + [MAX_NUM_CCs][N_RBG_MAX]) +{ + + int i; + UE_list_t *UE_list = &RC.mac[Mod_id]->UE_list; + UE_sched_ctrl *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id]; + + for (i = 0; i < N_RBG; i++) { + + if ((rballoc_sub[CC_id][i] == 0) && + (ue_sched_ctl->rballoc_sub_UE[CC_id][i] == 0) && + (nb_rbs_required_remaining[CC_id][UE_id] > 0) && + (ue_sched_ctl->pre_nb_available_rbs[CC_id] < + nb_rbs_required[CC_id][UE_id])) { + + // if this UE is not scheduled for TM5 + if (ue_sched_ctl->dl_pow_off[CC_id] != 0) { + + if ((i == N_RBG - 1) + && ((N_RB_DL == 25) || (N_RB_DL == 50))) { + if (nb_rbs_required_remaining[CC_id][UE_id] >= + min_rb_unit - 1) { + rballoc_sub[CC_id][i] = 1; + ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; + MIMO_mode_indicator[CC_id][i] = 1; + if (transmission_mode == 5) { + ue_sched_ctl->dl_pow_off[CC_id] = 1; + } + nb_rbs_required_remaining[CC_id][UE_id] = + nb_rbs_required_remaining[CC_id][UE_id] - + min_rb_unit + 1; + ue_sched_ctl->pre_nb_available_rbs[CC_id] = + ue_sched_ctl->pre_nb_available_rbs[CC_id] + + min_rb_unit - 1; + } + } else { + if (nb_rbs_required_remaining[CC_id][UE_id] >= + min_rb_unit) { + rballoc_sub[CC_id][i] = 1; + ue_sched_ctl->rballoc_sub_UE[CC_id][i] = 1; + MIMO_mode_indicator[CC_id][i] = 1; + if (transmission_mode == 5) { + ue_sched_ctl->dl_pow_off[CC_id] = 1; + } + nb_rbs_required_remaining[CC_id][UE_id] = + nb_rbs_required_remaining[CC_id][UE_id] - + min_rb_unit; + ue_sched_ctl->pre_nb_available_rbs[CC_id] = + ue_sched_ctl->pre_nb_available_rbs[CC_id] + + min_rb_unit; + } + } + } // dl_pow_off[CC_id][UE_id] ! = 0 + } + } } /// ULSCH PRE_PROCESSOR -void ulsch_scheduler_pre_processor(module_id_t module_idP, - int frameP, - sub_frame_t subframeP, - uint16_t *first_rb, - uint8_t aggregation) +void +ulsch_scheduler_pre_processor(module_id_t module_idP, + int frameP, + sub_frame_t subframeP, uint16_t * first_rb) { - int16_t i; - uint16_t UE_id,n,r; - uint8_t CC_id, round, harq_pid; - uint16_t nb_allocated_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX],total_allocated_rbs[MAX_NUM_CCs],average_rbs_per_user[MAX_NUM_CCs]; - int16_t total_remaining_rbs[MAX_NUM_CCs]; - uint16_t max_num_ue_to_be_scheduled=0,total_ue_count=0; - rnti_t rnti= -1; - UE_list_t *UE_list = &eNB_mac_inst[module_idP].UE_list; - UE_TEMPLATE *UE_template = 0; - LTE_DL_FRAME_PARMS *frame_parms = 0; + int16_t i; + uint16_t UE_id, n, r; + uint8_t CC_id, harq_pid; + uint16_t nb_allocated_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX], + total_allocated_rbs[MAX_NUM_CCs], + average_rbs_per_user[MAX_NUM_CCs]; + int16_t total_remaining_rbs[MAX_NUM_CCs]; + uint16_t max_num_ue_to_be_scheduled = 0; + uint16_t total_ue_count = 0; + rnti_t rnti = -1; + UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; + UE_TEMPLATE *UE_template = 0; + int N_RB_DL; + int N_RB_UL; + LOG_D(MAC, "In ulsch_preprocessor: assign max mcs min rb\n"); + // maximize MCS and then allocate required RB according to the buffer occupancy with the limit of max available UL RB + assign_max_mcs_min_rb(module_idP, frameP, subframeP, first_rb); + + LOG_D(MAC, "In ulsch_preprocessor: sort ue \n"); + // sort ues + sort_ue_ul(module_idP, frameP, subframeP); - //LOG_I(MAC,"assign max mcs min rb\n"); - // maximize MCS and then allocate required RB according to the buffer occupancy with the limit of max available UL RB - assign_max_mcs_min_rb(module_idP,frameP, subframeP, first_rb); + // we need to distribute RBs among UEs + // step1: reset the vars + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + N_RB_DL = + to_prb(RC.mac[module_idP]->common_channels[CC_id].mib-> + message.dl_Bandwidth); + N_RB_UL = + to_prb(RC.mac[module_idP]->common_channels[CC_id]. + ul_Bandwidth); + total_allocated_rbs[CC_id] = 0; + total_remaining_rbs[CC_id] = 0; + average_rbs_per_user[CC_id] = 0; - //LOG_I(MAC,"sort ue \n"); - // sort ues - sort_ue_ul (module_idP,frameP, subframeP); - - - // we need to distribute RBs among UEs - // step1: reset the vars - for (CC_id=0; CC_idhead_ul; i>=0; i=UE_list->next_ul[i]) { - nb_allocated_rbs[CC_id][i]=0; + for (i = UE_list->head_ul; i >= 0; i = UE_list->next_ul[i]) { + nb_allocated_rbs[CC_id][i] = 0; + } } - } - //LOG_I(MAC,"step2 \n"); - // step 2: calculate the average rb per UE - total_ue_count =0; - max_num_ue_to_be_scheduled=0; + LOG_D(MAC, "In ulsch_preprocessor: step2 \n"); + // step 2: calculate the average rb per UE + total_ue_count = 0; + max_num_ue_to_be_scheduled = 0; - for (i=UE_list->head_ul; i>=0; i=UE_list->next_ul[i]) { + for (i = UE_list->head_ul; i >= 0; i = UE_list->next_ul[i]) { - rnti = UE_RNTI(module_idP,i); + rnti = UE_RNTI(module_idP, i); - if (rnti==NOT_A_RNTI) - continue; + if (rnti == NOT_A_RNTI) + continue; - if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) - continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; - UE_id = i; - for (n=0; nnumactiveULCCs[UE_id]; n++) { - // This is the actual CC_id in the list - CC_id = UE_list->ordered_ULCCids[n][UE_id]; - UE_template = &UE_list->UE_template[CC_id][UE_id]; - average_rbs_per_user[CC_id]=0; - frame_parms = mac_xface->get_lte_frame_parms(module_idP,CC_id); + UE_id = i; - if (UE_template->pre_allocated_nb_rb_ul > 0) { - total_ue_count+=1; - } - /* - if((mac_xface->get_nCCE_max(module_idP,CC_id,3,subframeP) - nCCE_to_be_used[CC_id]) > (1<numactiveULCCs[UE_id]; n++) { + // This is the actual CC_id in the list + CC_id = UE_list->ordered_ULCCids[n][UE_id]; + LOG_D(MAC, + "In ulsch_preprocessor: handling UE %d/%x CCid %d\n", + UE_id, rnti, CC_id); + UE_template = &UE_list->UE_template[CC_id][UE_id]; + average_rbs_per_user[CC_id] = 0; - max_num_ue_to_be_scheduled+=1; + if (UE_template->pre_allocated_nb_rb_ul > 0) { + total_ue_count += 1; + } + /* + if((mac_xface->get_nCCE_max(module_idP,CC_id,3,subframeP) - nCCE_to_be_used[CC_id]) > (1<N_RB_UL-first_rb[CC_id]+1; - } else if( (total_ue_count <= (frame_parms->N_RB_DL-first_rb[CC_id])) && - (total_ue_count <= max_num_ue_to_be_scheduled)) { - average_rbs_per_user[CC_id] = (uint16_t) floor((frame_parms->N_RB_UL-first_rb[CC_id])/total_ue_count); - } else if (max_num_ue_to_be_scheduled > 0 ) { - average_rbs_per_user[CC_id] = (uint16_t) floor((frame_parms->N_RB_UL-first_rb[CC_id])/max_num_ue_to_be_scheduled); - } else { - average_rbs_per_user[CC_id]=1; - LOG_W(MAC,"[eNB %d] frame %d subframe %d: UE %d CC %d: can't get average rb per user (should not be here)\n", - module_idP,frameP,subframeP,UE_id,CC_id); - } + max_num_ue_to_be_scheduled += 1; + + if (total_ue_count == 0) { + average_rbs_per_user[CC_id] = 0; + } else if (total_ue_count == 1) { // increase the available RBs, special case, + average_rbs_per_user[CC_id] = + N_RB_UL - first_rb[CC_id] + 1; + } else if ((total_ue_count <= (N_RB_DL - first_rb[CC_id])) + && (total_ue_count <= max_num_ue_to_be_scheduled)) { + average_rbs_per_user[CC_id] = + (uint16_t) floor((N_RB_UL - first_rb[CC_id]) / + total_ue_count); + } else if (max_num_ue_to_be_scheduled > 0) { + average_rbs_per_user[CC_id] = + (uint16_t) floor((N_RB_UL - first_rb[CC_id]) / + max_num_ue_to_be_scheduled); + } else { + average_rbs_per_user[CC_id] = 1; + LOG_W(MAC, + "[eNB %d] frame %d subframe %d: UE %d CC %d: can't get average rb per user (should not be here)\n", + module_idP, frameP, subframeP, UE_id, CC_id); + } + } } - } - if (total_ue_count > 0) - LOG_D(MAC,"[eNB %d] Frame %d subframe %d: total ue to be scheduled %d/%d\n", - module_idP, frameP, subframeP,total_ue_count, max_num_ue_to_be_scheduled); + if (total_ue_count > 0) + LOG_D(MAC, + "[eNB %d] Frame %d subframe %d: total ue to be scheduled %d/%d\n", + module_idP, frameP, subframeP, total_ue_count, + max_num_ue_to_be_scheduled); - //LOG_D(MAC,"step3\n"); + //LOG_D(MAC,"step3\n"); - // step 3: assigne RBS - for (i=UE_list->head_ul; i>=0; i=UE_list->next_ul[i]) { - rnti = UE_RNTI(module_idP,i); + // step 3: assigne RBS + for (i = UE_list->head_ul; i >= 0; i = UE_list->next_ul[i]) { + rnti = UE_RNTI(module_idP, i); - if (rnti==NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) - continue; + if (rnti == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; - UE_id = i; + UE_id = i; - for (n=0; nnumactiveULCCs[UE_id]; n++) { - // This is the actual CC_id in the list - CC_id = UE_list->ordered_ULCCids[n][UE_id]; + for (n = 0; n < UE_list->numactiveULCCs[UE_id]; n++) { + // This is the actual CC_id in the list + CC_id = UE_list->ordered_ULCCids[n][UE_id]; + harq_pid = + subframe2harqpid(&RC.mac[module_idP]-> + common_channels[CC_id], frameP, + subframeP); - mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,1); - if(round>0) { - nb_allocated_rbs[CC_id][UE_id] = UE_list->UE_template[CC_id][UE_id].nb_rb_ul[harq_pid]; - } else { - nb_allocated_rbs[CC_id][UE_id] = cmin(UE_list->UE_template[CC_id][UE_id].pre_allocated_nb_rb_ul, average_rbs_per_user[CC_id]); - } + // mac_xface->get_ue_active_harq_pid(module_idP,CC_id,rnti,frameP,subframeP,&harq_pid,&round,openair_harq_UL); - total_allocated_rbs[CC_id]+= nb_allocated_rbs[CC_id][UE_id]; + if (UE_list->UE_sched_ctrl[UE_id].round_UL[CC_id] > 0) { + nb_allocated_rbs[CC_id][UE_id] = + UE_list->UE_template[CC_id][UE_id].nb_rb_ul[harq_pid]; + } else { + nb_allocated_rbs[CC_id][UE_id] = + cmin(UE_list-> + UE_template[CC_id][UE_id].pre_allocated_nb_rb_ul, + average_rbs_per_user[CC_id]); + } + total_allocated_rbs[CC_id] += nb_allocated_rbs[CC_id][UE_id]; + LOG_D(MAC, + "In ulsch_preprocessor: assigning %d RBs for UE %d/%x CCid %d, harq_pid %d\n", + nb_allocated_rbs[CC_id][UE_id], UE_id, rnti, CC_id, + harq_pid); + } } - } - // step 4: assigne the remaining RBs and set the pre_allocated rbs accordingly - for(r=0; r<2; r++) { + // step 4: assigne the remaining RBs and set the pre_allocated rbs accordingly + for (r = 0; r < 2; r++) { - for (i=UE_list->head_ul; i>=0; i=UE_list->next_ul[i]) { - rnti = UE_RNTI(module_idP,i); + for (i = UE_list->head_ul; i >= 0; i = UE_list->next_ul[i]) { + rnti = UE_RNTI(module_idP, i); - if (rnti==NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) - continue; + if (rnti == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; + UE_id = i; - UE_id = i; + for (n = 0; n < UE_list->numactiveULCCs[UE_id]; n++) { + // This is the actual CC_id in the list + CC_id = UE_list->ordered_ULCCids[n][UE_id]; + UE_template = &UE_list->UE_template[CC_id][UE_id]; + total_remaining_rbs[CC_id] = + N_RB_UL - first_rb[CC_id] - total_allocated_rbs[CC_id]; - for (n=0; nnumactiveULCCs[UE_id]; n++) { - // This is the actual CC_id in the list - CC_id = UE_list->ordered_ULCCids[n][UE_id]; - UE_template = &UE_list->UE_template[CC_id][UE_id]; - frame_parms = mac_xface->get_lte_frame_parms(module_idP,CC_id); - total_remaining_rbs[CC_id]=frame_parms->N_RB_UL - first_rb[CC_id] - total_allocated_rbs[CC_id]; + if (total_ue_count == 1) { + total_remaining_rbs[CC_id] += 1; + } - if (total_ue_count == 1 ) { - total_remaining_rbs[CC_id]+=1; - } - - if ( r == 0 ) { - while ( (UE_template->pre_allocated_nb_rb_ul > 0 ) && - (nb_allocated_rbs[CC_id][UE_id] < UE_template->pre_allocated_nb_rb_ul) && - (total_remaining_rbs[CC_id] > 0)) { - nb_allocated_rbs[CC_id][UE_id] = cmin(nb_allocated_rbs[CC_id][UE_id]+1,UE_template->pre_allocated_nb_rb_ul); - total_remaining_rbs[CC_id]--; - total_allocated_rbs[CC_id]++; - } - } else { - UE_template->pre_allocated_nb_rb_ul= nb_allocated_rbs[CC_id][UE_id]; - LOG_D(MAC,"******************UL Scheduling Information for UE%d CC_id %d ************************\n",UE_id, CC_id); - LOG_D(MAC,"[eNB %d] total RB allocated for UE%d CC_id %d = %d\n", module_idP, UE_id, CC_id, UE_template->pre_allocated_nb_rb_ul); - } - } + if (r == 0) { + while ((UE_template->pre_allocated_nb_rb_ul > 0) && + (nb_allocated_rbs[CC_id][UE_id] < + UE_template->pre_allocated_nb_rb_ul) + && (total_remaining_rbs[CC_id] > 0)) { + nb_allocated_rbs[CC_id][UE_id] = + cmin(nb_allocated_rbs[CC_id][UE_id] + 1, + UE_template->pre_allocated_nb_rb_ul); + total_remaining_rbs[CC_id]--; + total_allocated_rbs[CC_id]++; + } + } else { + UE_template->pre_allocated_nb_rb_ul = + nb_allocated_rbs[CC_id][UE_id]; + LOG_D(MAC, + "******************UL Scheduling Information for UE%d CC_id %d ************************\n", + UE_id, CC_id); + LOG_D(MAC, + "[eNB %d] total RB allocated for UE%d CC_id %d = %d\n", + module_idP, UE_id, CC_id, + UE_template->pre_allocated_nb_rb_ul); + } + } + } } - } - for (CC_id=0; CC_idget_lte_frame_parms(module_idP,CC_id); + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - if (total_allocated_rbs[CC_id]>0) { - LOG_D(MAC,"[eNB %d] total RB allocated for all UEs = %d/%d\n", module_idP, total_allocated_rbs[CC_id], frame_parms->N_RB_UL - first_rb[CC_id]); + if (total_allocated_rbs[CC_id] > 0) { + LOG_D(MAC, "[eNB %d] total RB allocated for all UEs = %d/%d\n", + module_idP, total_allocated_rbs[CC_id], + N_RB_UL - first_rb[CC_id]); + } } - } } -void assign_max_mcs_min_rb(module_id_t module_idP,int frameP, sub_frame_t subframeP, uint16_t *first_rb) +void +assign_max_mcs_min_rb(module_id_t module_idP, int frameP, + sub_frame_t subframeP, uint16_t * first_rb) { - int i; - uint16_t n,UE_id; - uint8_t CC_id; - rnti_t rnti = -1; - int mcs; - int rb_table_index=0,tbs,tx_power; - eNB_MAC_INST *eNB = &eNB_mac_inst[module_idP]; - UE_list_t *UE_list = &eNB->UE_list; + int i; + uint16_t n, UE_id; + uint8_t CC_id; + rnti_t rnti = -1; + int mcs; + int rb_table_index = 0, tbs, tx_power; + eNB_MAC_INST *eNB = RC.mac[module_idP]; + UE_list_t *UE_list = &eNB->UE_list; - UE_TEMPLATE *UE_template; - LTE_DL_FRAME_PARMS *frame_parms; + UE_TEMPLATE *UE_template; + int Ncp; + int N_RB_UL; + + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (UE_list->active[i] != TRUE) + continue; + + rnti = UE_RNTI(module_idP, i); + + if (rnti == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; + + if (UE_list->UE_sched_ctrl[i].phr_received == 1) + mcs = 20; // if we've received the power headroom information the UE, we can go to maximum mcs + else + mcs = 10; // otherwise, limit to QPSK PUSCH + + UE_id = i; + + for (n = 0; n < UE_list->numactiveULCCs[UE_id]; n++) { + // This is the actual CC_id in the list + CC_id = UE_list->ordered_ULCCids[n][UE_id]; + + if (CC_id >= MAX_NUM_CCs) { + LOG_E(MAC, + "CC_id %u should be < %u, loop n=%u < numactiveULCCs[%u]=%u", + CC_id, MAX_NUM_CCs, n, UE_id, + UE_list->numactiveULCCs[UE_id]); + } + + AssertFatal(CC_id < MAX_NUM_CCs, + "CC_id %u should be < %u, loop n=%u < numactiveULCCs[%u]=%u", + CC_id, MAX_NUM_CCs, n, UE_id, + UE_list->numactiveULCCs[UE_id]); + + UE_template = &UE_list->UE_template[CC_id][UE_id]; + + Ncp = RC.mac[module_idP]->common_channels[CC_id].Ncp; + N_RB_UL = + to_prb(RC.mac[module_idP]->common_channels[CC_id]. + ul_Bandwidth); + // if this UE has UL traffic + if (UE_template->ul_total_buffer > 0) { - for (i=UE_list->head_ul; i>=0; i=UE_list->next_ul[i]) { + tbs = get_TBS_UL(mcs, 3) << 3; // 1 or 2 PRB with cqi enabled does not work well! + rb_table_index = 2; - rnti = UE_RNTI(module_idP,i); + // fixme: set use_srs flag + tx_power = + estimate_ue_tx_power(tbs, rb_table[rb_table_index], 0, + Ncp, 0); - if (rnti==NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) - continue; + while ((((UE_template->phr_info - tx_power) < 0) + || (tbs > UE_template->ul_total_buffer)) + && (mcs > 3)) { + // LOG_I(MAC,"UE_template->phr_info %d tx_power %d mcs %d\n", UE_template->phr_info,tx_power, mcs); + mcs--; + tbs = get_TBS_UL(mcs, rb_table[rb_table_index]) << 3; + tx_power = estimate_ue_tx_power(tbs, rb_table[rb_table_index], 0, Ncp, 0); // fixme: set use_srs + } - if (UE_list->UE_sched_ctrl[i].phr_received == 1) - mcs = 20; // if we've received the power headroom information the UE, we can go to maximum mcs - else - mcs = 10; // otherwise, limit to QPSK PUSCH + while ((tbs < UE_template->ul_total_buffer) && + (rb_table[rb_table_index] < + (N_RB_UL - first_rb[CC_id])) + && ((UE_template->phr_info - tx_power) > 0) + && (rb_table_index < 32)) { - UE_id = i; + rb_table_index++; + tbs = get_TBS_UL(mcs, rb_table[rb_table_index]) << 3; + tx_power = + estimate_ue_tx_power(tbs, rb_table[rb_table_index], + 0, Ncp, 0); + } - for (n=0; nnumactiveULCCs[UE_id]; n++) { - // This is the actual CC_id in the list - CC_id = UE_list->ordered_ULCCids[n][UE_id]; + UE_template->ue_tx_power = tx_power; - if (CC_id >= MAX_NUM_CCs) { - LOG_E( MAC, "CC_id %u should be < %u, loop n=%u < numactiveULCCs[%u]=%u", - CC_id, - MAX_NUM_CCs, - n, - UE_id, - UE_list->numactiveULCCs[UE_id]); - } + if (rb_table[rb_table_index] > + (N_RB_UL - first_rb[CC_id] - 1)) { + rb_table_index--; + } + // 1 or 2 PRB with cqi enabled does not work well + if (rb_table[rb_table_index] < 3) { + rb_table_index = 2; //3PRB + } - AssertFatal( CC_id < MAX_NUM_CCs, "CC_id %u should be < %u, loop n=%u < numactiveULCCs[%u]=%u", - CC_id, - MAX_NUM_CCs, - n, - UE_id, - UE_list->numactiveULCCs[UE_id]); - frame_parms=mac_xface->get_lte_frame_parms(module_idP,CC_id); - UE_template = &UE_list->UE_template[CC_id][UE_id]; - - // if this UE has UL traffic - if (UE_template->ul_total_buffer > 0 ) { - - tbs = mac_xface->get_TBS_UL(mcs,3); // 1 or 2 PRB with cqi enabled does not work well! - // fixme: set use_srs flag - tx_power= mac_xface->estimate_ue_tx_power(tbs,rb_table[rb_table_index],0,frame_parms->Ncp,0); - - while ((((UE_template->phr_info - tx_power) < 0 ) || (tbs > UE_template->ul_total_buffer))&& - (mcs > 3)) { - // LOG_I(MAC,"UE_template->phr_info %d tx_power %d mcs %d\n", UE_template->phr_info,tx_power, mcs); - mcs--; - tbs = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); - tx_power = mac_xface->estimate_ue_tx_power(tbs,rb_table[rb_table_index],0,frame_parms->Ncp,0); // fixme: set use_srs - } - - while ((tbs < UE_template->ul_total_buffer) && - (rb_table[rb_table_index]<(frame_parms->N_RB_UL-first_rb[CC_id])) && - ((UE_template->phr_info - tx_power) > 0) && - (rb_table_index < 32 )) { - // LOG_I(MAC,"tbs %d ul buffer %d rb table %d max ul rb %d\n", tbs, UE_template->ul_total_buffer, rb_table[rb_table_index], frame_parms->N_RB_UL-first_rb[CC_id]); - rb_table_index++; - tbs = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); - tx_power = mac_xface->estimate_ue_tx_power(tbs,rb_table[rb_table_index],0,frame_parms->Ncp,0); - } - - UE_template->ue_tx_power = tx_power; - - if (rb_table[rb_table_index]>(frame_parms->N_RB_UL-first_rb[CC_id]-1)) { - rb_table_index--; - } - - // 1 or 2 PRB with cqi enabled does not work well! - if (rb_table[rb_table_index]<3) { - rb_table_index=2; //3PRB - } - - UE_template->pre_assigned_mcs_ul=mcs; - UE_template->pre_allocated_rb_table_index_ul=rb_table_index; - UE_template->pre_allocated_nb_rb_ul= rb_table[rb_table_index]; - LOG_D(MAC,"[eNB %d] frame %d subframe %d: for UE %d CC %d: pre-assigned mcs %d, pre-allocated rb_table[%d]=%d RBs (phr %d, tx power %d)\n", - module_idP, frameP, subframeP, UE_id, CC_id, - UE_template->pre_assigned_mcs_ul, - UE_template->pre_allocated_rb_table_index_ul, - UE_template->pre_allocated_nb_rb_ul, - UE_template->phr_info,tx_power); - } else { - UE_template->pre_allocated_rb_table_index_ul=-1; - UE_template->pre_allocated_nb_rb_ul=0; - } + UE_template->pre_assigned_mcs_ul = mcs; + UE_template->pre_allocated_rb_table_index_ul = + rb_table_index; + UE_template->pre_allocated_nb_rb_ul = + rb_table[rb_table_index]; + LOG_D(MAC, + "[eNB %d] frame %d subframe %d: for UE %d CC %d: pre-assigned mcs %d, pre-allocated rb_table[%d]=%d RBs (phr %d, tx power %d)\n", + module_idP, frameP, subframeP, UE_id, CC_id, + UE_template->pre_assigned_mcs_ul, + UE_template->pre_allocated_rb_table_index_ul, + UE_template->pre_allocated_nb_rb_ul, + UE_template->phr_info, tx_power); + } else { + /* if UE has pending scheduling request then pre-allocate 3 RBs */ + //if (UE_template->ul_active == 1 && UE_template->ul_SR == 1) { + if (UE_is_to_be_scheduled(module_idP, CC_id, i)) { + /* use QPSK mcs */ + UE_template->pre_assigned_mcs_ul = 10; + UE_template->pre_allocated_rb_table_index_ul = 2; + UE_template->pre_allocated_nb_rb_ul = 3; + } else { + UE_template->pre_assigned_mcs_ul = 0; + UE_template->pre_allocated_rb_table_index_ul = -1; + UE_template->pre_allocated_nb_rb_ul = 0; + } + } + } } - } } +struct sort_ue_ul_params { + int module_idP; + int frameP; + int subframeP; +}; -void sort_ue_ul (module_id_t module_idP,int frameP, sub_frame_t subframeP) +static int ue_ul_compare(const void *_a, const void *_b, void *_params) { + struct sort_ue_ul_params *params = _params; + UE_list_t *UE_list = &RC.mac[params->module_idP]->UE_list; - int UE_id1,UE_id2; - int pCCid1,pCCid2; - int round1,round2; - int i=0,ii=0; - rnti_t rnti1,rnti2; + int UE_id1 = *(const int *) _a; + int UE_id2 = *(const int *) _b; - UE_list_t *UE_list = &eNB_mac_inst[module_idP].UE_list; + int rnti1 = UE_RNTI(params->module_idP, UE_id1); + int pCCid1 = UE_PCCID(params->module_idP, UE_id1); + int round1 = maxround(params->module_idP, rnti1, params->frameP, + params->subframeP, 1); - for (i=UE_list->head_ul; i>=0; i=UE_list->next_ul[i]) { + int rnti2 = UE_RNTI(params->module_idP, UE_id2); + int pCCid2 = UE_PCCID(params->module_idP, UE_id2); + int round2 = maxround(params->module_idP, rnti2, params->frameP, + params->subframeP, 1); - //LOG_I(MAC,"sort ue ul i %d\n",i); - for (ii=UE_list->next_ul[i]; ii>=0; ii=UE_list->next_ul[ii]) { - //LOG_I(MAC,"sort ul ue 2 ii %d\n",ii); - - UE_id1 = i; - rnti1 = UE_RNTI(module_idP,UE_id1); - - if(rnti1 == NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) - continue; + if (round1 > round2) + return -1; + if (round1 < round2) + return 1; - pCCid1 = UE_PCCID(module_idP,UE_id1); - round1 = maxround(module_idP,rnti1,frameP,subframeP,1); - - UE_id2 = ii; - rnti2 = UE_RNTI(module_idP,UE_id2); - - if(rnti2 == NOT_A_RNTI) - continue; - if (UE_list->UE_sched_ctrl[UE_id2].ul_out_of_sync == 1) - continue; + if (UE_list->UE_template[pCCid1][UE_id1].ul_buffer_info[LCGID0] > + UE_list->UE_template[pCCid2][UE_id2].ul_buffer_info[LCGID0]) + return -1; + if (UE_list->UE_template[pCCid1][UE_id1].ul_buffer_info[LCGID0] < + UE_list->UE_template[pCCid2][UE_id2].ul_buffer_info[LCGID0]) + return 1; - pCCid2 = UE_PCCID(module_idP,UE_id2); - round2 = maxround(module_idP,rnti2,frameP,subframeP,1); + if (UE_list->UE_template[pCCid1][UE_id1].ul_total_buffer > + UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer) + return -1; + if (UE_list->UE_template[pCCid1][UE_id1].ul_total_buffer < + UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer) + return 1; - if(round2 > round1) { - swap_UEs(UE_list,UE_id1,UE_id2,1); - } else if (round2 == round1) { - if (UE_list->UE_template[pCCid1][UE_id1].ul_buffer_info[LCGID0] < UE_list->UE_template[pCCid2][UE_id2].ul_buffer_info[LCGID0]) { - swap_UEs(UE_list,UE_id1,UE_id2,1); - } else if (UE_list->UE_template[pCCid1][UE_id1].ul_total_buffer < UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer) { - swap_UEs(UE_list,UE_id1,UE_id2,1); - } else if (UE_list->UE_template[pCCid1][UE_id1].pre_assigned_mcs_ul < UE_list->UE_template[pCCid2][UE_id2].pre_assigned_mcs_ul) { - if (UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer > 0 ) { - swap_UEs(UE_list,UE_id1,UE_id2,1); - } - } - } + if (UE_list->UE_template[pCCid1][UE_id1].pre_assigned_mcs_ul > + UE_list->UE_template[pCCid2][UE_id2].pre_assigned_mcs_ul) + return -1; + if (UE_list->UE_template[pCCid1][UE_id1].pre_assigned_mcs_ul < + UE_list->UE_template[pCCid2][UE_id2].pre_assigned_mcs_ul) + return 1; + + return 0; + +#if 0 + /* The above order derives from the following. + * The last case is not handled: "if (UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer > 0 )" + * I don't think it makes a big difference. + */ + if (round2 > round1) { + swap_UEs(UE_list, UE_id1, UE_id2, 1); + } else if (round2 == round1) { + if (UE_list->UE_template[pCCid1][UE_id1].ul_buffer_info[LCGID0] < + UE_list->UE_template[pCCid2][UE_id2].ul_buffer_info[LCGID0]) { + swap_UEs(UE_list, UE_id1, UE_id2, 1); + } else if (UE_list->UE_template[pCCid1][UE_id1].ul_total_buffer < + UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer) { + swap_UEs(UE_list, UE_id1, UE_id2, 1); + } else if (UE_list->UE_template[pCCid1][UE_id1]. + pre_assigned_mcs_ul < + UE_list->UE_template[pCCid2][UE_id2]. + pre_assigned_mcs_ul) { + if (UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer > 0) { + swap_UEs(UE_list, UE_id1, UE_id2, 1); + } + } } - } +#endif +} + +void sort_ue_ul(module_id_t module_idP, int frameP, sub_frame_t subframeP) +{ + int i; + int list[NUMBER_OF_UE_MAX]; + int list_size = 0; + int rnti; + struct sort_ue_ul_params params = { module_idP, frameP, subframeP }; + + UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; + + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (UE_list->active[i] == FALSE) + continue; + if ((rnti = UE_RNTI(module_idP, i)) == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; + + list[list_size] = i; + list_size++; + } + + qsort_r(list, list_size, sizeof(int), ue_ul_compare, ¶ms); + + if (list_size) { + for (i = 0; i < list_size - 1; i++) + UE_list->next_ul[list[i]] = list[i + 1]; + UE_list->next_ul[list[list_size - 1]] = -1; + UE_list->head_ul = list[0]; + } else { + UE_list->head_ul = -1; + } + +#if 0 + int UE_id1, UE_id2; + int pCCid1, pCCid2; + int round1, round2; + int i = 0, ii = 0; + rnti_t rnti1, rnti2; + + UE_list_t *UE_list = &RC.mac[module_idP]->UE_list; + + for (i = UE_list->head_ul; i >= 0; i = UE_list->next_ul[i]) { + + //LOG_I(MAC,"sort ue ul i %d\n",i); + for (ii = UE_list->next_ul[i]; ii >= 0; ii = UE_list->next_ul[ii]) { + //LOG_I(MAC,"sort ul ue 2 ii %d\n",ii); + + UE_id1 = i; + rnti1 = UE_RNTI(module_idP, UE_id1); + + if (rnti1 == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[i].ul_out_of_sync == 1) + continue; + + + pCCid1 = UE_PCCID(module_idP, UE_id1); + round1 = maxround(module_idP, rnti1, frameP, subframeP, 1); + + UE_id2 = ii; + rnti2 = UE_RNTI(module_idP, UE_id2); + + if (rnti2 == NOT_A_RNTI) + continue; + if (UE_list->UE_sched_ctrl[UE_id2].ul_out_of_sync == 1) + continue; + + pCCid2 = UE_PCCID(module_idP, UE_id2); + round2 = maxround(module_idP, rnti2, frameP, subframeP, 1); + + if (round2 > round1) { + swap_UEs(UE_list, UE_id1, UE_id2, 1); + } else if (round2 == round1) { + if (UE_list-> + UE_template[pCCid1][UE_id1].ul_buffer_info[LCGID0] < + UE_list->UE_template[pCCid2][UE_id2]. + ul_buffer_info[LCGID0]) { + swap_UEs(UE_list, UE_id1, UE_id2, 1); + } else if (UE_list->UE_template[pCCid1][UE_id1]. + ul_total_buffer < + UE_list->UE_template[pCCid2][UE_id2]. + ul_total_buffer) { + swap_UEs(UE_list, UE_id1, UE_id2, 1); + } else if (UE_list-> + UE_template[pCCid1][UE_id1].pre_assigned_mcs_ul + < + UE_list-> + UE_template[pCCid2][UE_id2].pre_assigned_mcs_ul) + { + if (UE_list->UE_template[pCCid2][UE_id2]. + ul_total_buffer > 0) { + swap_UEs(UE_list, UE_id1, UE_id2, 1); + } + } + } + } + } +#endif } diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index 9a0f60167d..46a8b005e4 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file LAYER2/MAC/proto.h * \brief MAC functions prototypes for eNB and UE * \author Navid Nikaein and Raymond Knopp @@ -35,49 +28,59 @@ */ #ifndef __LAYER2_MAC_PROTO_H__ #define __LAYER2_MAC_PROTO_H__ + +#include "LAYER2/MAC/defs.h" + /** \addtogroup _mac * @{ */ -/** \fn void add_ue_spec_dci(DCI_PDU *DCI_pdu,void *pdu,rnti_t rnti,unsigned char dci_size_bytes,unsigned char aggregation,unsigned char dci_size_bits,unsigned char dci_fmt,uint8_t ra_flag); -\brief - -*/ -void add_ue_spec_dci(DCI_PDU *DCI_pdu,void *pdu,rnti_t rnti,unsigned char dci_size_bytes,unsigned char aggregation,unsigned char dci_size_bits,unsigned char dci_fmt,uint8_t ra_flag); - -//LG commented cause compilation error for RT eNB extern inline unsigned int taus(void); - -/** \fn void schedule_RA(module_id_t module_idP,frame_t frameP,sub_frame_t subframe,uint8_t Msg3_subframe,unsigned int *nprb); -\brief First stage of Random-Access Scheduling. Loops over the RA_templates and checks if RAR, Msg3 or its retransmission are to be scheduled in the subframe. It returns the total number of PRB used for RA SDUs. For Msg3 it retrieves the L3msg from RRC and fills the appropriate buffers. For the others it just computes the number of PRBs. Each DCI uses 3 PRBs (format 1A) -for the message. +/** \fn void schedule_mib(module_id_t module_idP,frame_t frameP,sub_frame_t subframe); +\brief MIB scheduling for PBCH. This function requests the MIB from RRC and provides it to L1. @param Mod_id Instance ID of eNB @param frame Frame index @param subframe Subframe number on which to act */ -void schedule_RA(module_id_t module_idP,frame_t frameP,sub_frame_t subframe,uint8_t Msg3_subframe); + +void schedule_mib(module_id_t module_idP, + frame_t frameP, sub_frame_t subframeP); + +/** \fn void schedule_RA(module_id_t module_idP,frame_t frameP,sub_frame_t subframe); +\brief First stage of Random-Access Scheduling. Loops over the ras and checks if RAR, Msg3 or its retransmission are to be scheduled in the subframe. It returns the total number of PRB used for RA SDUs. For Msg3 it retrieves the L3msg from RRC and fills the appropriate buffers. For the others it just computes the number of PRBs. Each DCI uses 3 PRBs (format 1A) +for the message. +@param Mod_id Instance ID of eNB +@param frame Frame index +@param subframe Subframe number on which to act +*/ + + +void schedule_RA(module_id_t module_idP, frame_t frameP, + sub_frame_t subframe); /** \brief First stage of SI Scheduling. Gets a SI SDU from RRC if available and computes the MCS required to transport it as a function of the SDU length. It assumes a length less than or equal to 64 bytes (MCS 6, 3 PRBs). @param Mod_id Instance ID of eNB @param frame Frame index @param subframe Subframe number on which to act -@param Msg3_subframe Subframe where Msg3 will be transmitted */ -void schedule_SI(module_id_t module_idP,frame_t frameP,sub_frame_t subframeP); +void schedule_SI(module_id_t module_idP, frame_t frameP, + sub_frame_t subframeP); /** \brief MBMS scheduling: Checking the position for MBSFN subframes. Create MSI, transfer MCCH from RRC to MAC, transfer MTCHs from RLC to MAC. Multiplexing MSI,MCCH&MTCHs. Return 1 if there are MBSFN data being allocated, otherwise return 0; @param Mod_id Instance ID of eNB @param frame Frame index @param subframe Subframe number on which to act */ -int schedule_MBMS(module_id_t module_idP,uint8_t CC_id, frame_t frameP, sub_frame_t subframe); +int schedule_MBMS(module_id_t module_idP, uint8_t CC_id, frame_t frameP, + sub_frame_t subframe); /** \brief check the mapping between sf allocation and sync area, Currently only supports 1:1 mapping @param Mod_id Instance ID of eNB @param mbsfn_sync_area index of mbsfn sync area @param[out] index of sf pattern */ -int8_t get_mbsfn_sf_alloction (module_id_t module_idP, uint8_t CC_id, uint8_t mbsfn_sync_area); +int8_t get_mbsfn_sf_alloction(module_id_t module_idP, uint8_t CC_id, + uint8_t mbsfn_sync_area); /** \brief check the mapping between sf allocation and sync area, Currently only supports 1:1 mapping @param Mod_id Instance ID of eNB @@ -85,15 +88,17 @@ int8_t get_mbsfn_sf_alloction (module_id_t module_idP, uint8_t CC_id, uint8_t mb @param eNB_index index of eNB @param[out] index of sf pattern */ -int8_t ue_get_mbsfn_sf_alloction (module_id_t module_idP, uint8_t mbsfn_sync_area, unsigned char eNB_index); +int8_t ue_get_mbsfn_sf_alloction(module_id_t module_idP, + uint8_t mbsfn_sync_area, + unsigned char eNB_index); /** \brief top ULSCH Scheduling for TDD (config 1-6). @param Mod_id Instance ID of eNB @param frame Frame index @param subframe Subframe number on which to act -@param sched_subframe Subframe number where PUSCH is transmitted (for DAI lookup) */ -void schedule_ulsch(module_id_t module_idP,frame_t frameP,unsigned char cooperation_flag,sub_frame_t subframe,unsigned char sched_subframe); +void schedule_ulsch(module_id_t module_idP, frame_t frameP, + sub_frame_t subframe); /** \brief ULSCH Scheduling per RNTI @param Mod_id Instance ID of eNB @@ -101,15 +106,10 @@ void schedule_ulsch(module_id_t module_idP,frame_t frameP,unsigned char cooperat @param subframe Subframe number on which to act @param sched_subframe Subframe number where PUSCH is transmitted (for DAI lookup) */ -void schedule_ulsch_rnti(module_id_t module_idP, unsigned char cooperation_flag, frame_t frameP, sub_frame_t subframe, unsigned char sched_subframe, uint16_t *first_rb); - -/** \brief ULSCH Scheduling for CBA RNTI -@param Mod_id Instance ID of eNB -@param frame Frame index -@param subframe Subframe number on which to act -@param sched_subframe Subframe number where PUSCH is transmitted (for DAI lookup) -*/ -void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_flag, frame_t frameP, sub_frame_t subframe, unsigned char sched_subframe, uint16_t *first_rb); +void schedule_ulsch_rnti(module_id_t module_idP, frame_t frameP, + sub_frame_t subframe, + unsigned char sched_subframe, + uint16_t * first_rb); /** \brief Second stage of DLSCH scheduling, after schedule_SI, schedule_RA and schedule_dlsch have been called. This routine first allocates random frequency assignments for SI and RA SDUs using distributed VRB allocations and adds the corresponding DCI SDU to the DCI buffer for PHY. It then loops over the UE specific DCIs previously allocated and fills in the remaining DCI fields related to frequency allocation. It assumes localized allocation of type 0 (DCI.rah=0). The allocation is done for tranmission modes 1,2,4. @param Mod_id Instance of eNB @@ -117,7 +117,8 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f @param subframe Index of subframe @param mbsfn_flag Indicates that this subframe is for MCH/MCCH */ -void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP,sub_frame_t subframe,int *mbsfn_flag); +void fill_DLSCH_dci(module_id_t module_idP, frame_t frameP, + sub_frame_t subframe, int *mbsfn_flag); /** \brief UE specific DLSCH scheduling. Retrieves next ue to be schduled from round-robin scheduler and gets the appropriate harq_pid for the subframe from PHY. If the process is active and requires a retransmission, it schedules the retransmission with the same PRB count and MCS as the first transmission. Otherwise it consults RLC for DCCH/DTCH SDUs (status with maximum number of available PRBS), builds the MAC header (timing advance sent by default) and copies @param Mod_id Instance ID of eNB @@ -126,34 +127,43 @@ void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP,sub_frame_t subframe,i @param mbsfn_flag Indicates that MCH/MCCH is in this subframe */ -void schedule_ue_spec(module_id_t module_idP,frame_t frameP,sub_frame_t subframe,int *mbsfn_flag); +void schedule_ue_spec(module_id_t module_idP, frame_t frameP, + sub_frame_t subframe, int *mbsfn_flag); + /** \brief Function for UE/PHY to compute PUSCH transmit power in power-control procedure. @param Mod_id Module id of UE @returns Po_NOMINAL_PUSCH (PREAMBLE_RECEIVED_TARGET_POWER+DELTA_PREAMBLE */ -int8_t get_Po_NOMINAL_PUSCH(module_id_t module_idP,uint8_t CC_id); +int8_t get_Po_NOMINAL_PUSCH(module_id_t module_idP, uint8_t CC_id); /** \brief Function to compute DELTA_PREAMBLE from 36.321 (for RA power ramping procedure and Msg3 PUSCH power control policy) @param Mod_id Module id of UE @returns DELTA_PREAMBLE */ -int8_t get_DELTA_PREAMBLE(module_id_t module_idP,int CC_id); +int8_t get_DELTA_PREAMBLE(module_id_t module_idP, int CC_id); /** \brief Function for compute deltaP_rampup from 36.321 (for RA power ramping procedure and Msg3 PUSCH power control policy) @param Mod_id Module id of UE @param CC_id carrier component id of UE @returns deltaP_rampup */ -int8_t get_deltaP_rampup(module_id_t module_idP,uint8_t CC_id); +int8_t get_deltaP_rampup(module_id_t module_idP, uint8_t CC_id); + +uint16_t mac_computeRIV(uint16_t N_RB_DL, uint16_t RBstart, + uint16_t Lcrbs); + +void add_msg3(module_id_t module_idP, int CC_id, RA_t * ra, frame_t frameP, + sub_frame_t subframeP); //main.c -void chbch_phy_sync_success(module_id_t module_idP,frame_t frameP,uint8_t eNB_index); +int mac_top_init(int eMBMS_active, char *uecap_xer, + uint8_t cba_group_active, uint8_t HO_active); -void mrbch_phy_sync_failure(module_id_t module_idP, frame_t frameP,uint8_t free_eNB_index); +void mac_top_init_eNB(void); -int mac_top_init(int eMBMS_active, char *uecap_xer,uint8_t cba_group_active, uint8_t HO_active); +void mac_init_cell_params(int Mod_idP, int CC_idP); char layer2_init_UE(module_id_t module_idP); @@ -165,17 +175,29 @@ int mac_init_global_param(void); void mac_top_cleanup(void); -void mac_UE_out_of_sync_ind(module_id_t module_idP,frame_t frameP, uint16_t eNB_index); +void mac_UE_out_of_sync_ind(module_id_t module_idP, frame_t frameP, + uint16_t eNB_index); -void dlsch_scheduler_pre_processor_reset (int module_idP,int UE_id, - uint8_t CC_id, - int frameP, - int subframeP, - int N_RBG, - uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]); +void clear_nfapi_information(eNB_MAC_INST * eNB, int CC_idP, + frame_t frameP, sub_frame_t subframeP); + +void dlsch_scheduler_pre_processor_reset(int module_idP, int UE_id, + uint8_t CC_id, + int frameP, + int subframeP, + int N_RBG, + uint16_t + nb_rbs_required[MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], + uint16_t + nb_rbs_required_remaining + [MAX_NUM_CCs][NUMBER_OF_UE_MAX], + unsigned char + rballoc_sub[MAX_NUM_CCs] + [N_RBG_MAX], + unsigned char + MIMO_mode_indicator[MAX_NUM_CCs] + [N_RBG_MAX]); // eNB functions /* \brief This function assigns pre-available RBS to each UE in specified sub-bands before scheduling is done @@ -186,51 +208,56 @@ void dlsch_scheduler_pre_processor_reset (int module_idP,int UE_id, */ -void dlsch_scheduler_pre_processor (module_id_t module_idP, - frame_t frameP, - sub_frame_t subframe, - int N_RBG[MAX_NUM_CCs], - int *mbsfn_flag); +void dlsch_scheduler_pre_processor(module_id_t module_idP, + frame_t frameP, + sub_frame_t subframe, + int N_RBG[MAX_NUM_CCs], + int *mbsfn_flag); -void dlsch_scheduler_pre_processor_allocate (module_id_t Mod_id, - int UE_id, - uint8_t CC_id, - int N_RBG, - int transmission_mode, - int min_rb_unit, - uint8_t N_RB_DL, - uint16_t nb_rbs_required[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - uint16_t nb_rbs_required_remaining[MAX_NUM_CCs][NUMBER_OF_UE_MAX], - unsigned char rballoc_sub[MAX_NUM_CCs][N_RBG_MAX], - unsigned char MIMO_mode_indicator[MAX_NUM_CCs][N_RBG_MAX]); +void dlsch_scheduler_pre_processor_allocate(module_id_t Mod_id, + int UE_id, + uint8_t CC_id, + int N_RBG, + int transmission_mode, + int min_rb_unit, + uint8_t N_RB_DL, + uint16_t + nb_rbs_required[MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], + uint16_t + nb_rbs_required_remaining + [MAX_NUM_CCs] + [NUMBER_OF_UE_MAX], + unsigned char + rballoc_sub[MAX_NUM_CCs] + [N_RBG_MAX], + unsigned char + MIMO_mode_indicator + [MAX_NUM_CCs][N_RBG_MAX]); /* \brief Function to trigger the eNB scheduling procedure. It is called by PHY at the beginning of each subframe, \f$n$\f - and generates all DLSCH allocations for subframe \f$n\f$ and ULSCH allocations for subframe \f$n+k$\f. The resultant DCI_PDU is - ready after returning from this call. + and generates all DLSCH allocations for subframe \f$n\f$ and ULSCH allocations for subframe \f$n+k$\f. @param Mod_id Instance ID of eNB -@param cooperation_flag Flag to indicated that this cell has cooperating nodes (i.e. that there are collaborative transport channels that -can be scheduled. @param subframe Index of current subframe @param calibration_flag Flag to indicate that eNB scheduler should schedule TDD auto-calibration PUSCH. */ -void eNB_dlsch_ulsch_scheduler(module_id_t module_idP, uint8_t cooperation_flag, frame_t frameP, sub_frame_t subframeP);//, int calibration_flag); - -/* \brief Function to retrieve result of scheduling (DCI) in current subframe. Can be called an arbitrary numeber of times after eNB_dlsch_ulsch_scheduler -in a given subframe. -@param Mod_id Instance ID of eNB -@param CC_id Component Carrier Index -@param subframe Index of current subframe -@returns Pointer to generated DCI for subframe -*/ -DCI_PDU *get_dci_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subframe); +void eNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP); //, int calibration_flag); /* \brief Function to indicate a received preamble on PRACH. It initiates the RA procedure. @param Mod_id Instance ID of eNB @param preamble_index index of the received RA request @param timing_offset Offset in samples of the received PRACH w.r.t. eNB timing. This is used to +@param rnti RA rnti corresponding to this PRACH preamble +@param rach_resource type (0=non BL/CE,1 CE level 0,2 CE level 1, 3 CE level 2,4 CE level 3) */ -void initiate_ra_proc(module_id_t module_idP,int CC_id,frame_t frameP, uint16_t preamble_index,int16_t timing_offset,uint8_t sect_id,sub_frame_t subframe,uint8_t f_id); +void initiate_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, + sub_frame_t subframeP, uint16_t preamble_index, + int16_t timing_offset, uint16_t rnti +#ifdef Rel14 + , uint8_t rach_resource_type +#endif + ); /* \brief Function in eNB to fill RAR pdu when requested by PHY. This provides a single RAR SDU for the moment and returns the t-CRNTI. @param Mod_id Instance ID of eNB @@ -238,36 +265,77 @@ void initiate_ra_proc(module_id_t module_idP,int CC_id,frame_t frameP, uint16_t @param N_RB_UL Number of UL resource blocks @returns t_CRNTI */ -unsigned short fill_rar( - const module_id_t module_idP, - const int CC_id, - const frame_t frameP, - uint8_t * const dlsch_buffer, - const uint16_t N_RB_UL, - const uint8_t input_buffer_length -); +unsigned short fill_rar(const module_id_t module_idP, + const int CC_id, + RA_t *ra, + const frame_t frameP, + uint8_t * const dlsch_buffer, + const uint16_t N_RB_UL, + const uint8_t input_buffer_length); + +#ifdef Rel14 +unsigned short fill_rar_br(eNB_MAC_INST * eNB, + int CC_id, + RA_t * ra, + const frame_t frameP, + const sub_frame_t subframeP, + uint8_t * const dlsch_buffer, + const uint8_t ce_level); +#endif /* \brief Function to indicate a failed RA response. It removes all temporary variables related to the initial connection of a UE @param Mod_id Instance ID of eNB @param preamble_index index of the received RA request. */ -void cancel_ra_proc(module_id_t module_idP,int CC_id,frame_t frameP, uint16_t preamble_index); +void cancel_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, + uint16_t preamble_index); + +/* \brief Function used by PHY to inform MAC that an uplink is scheduled + for Msg3 in given subframe. This is used so that the MAC + scheduler marks as busy the RBs used by the Msg3. +@param Mod_id Instance ID of eNB +@param CC_id CC ID of eNB +@param frame current frame +@param subframe current subframe +@param rnti UE rnti concerned +@param Msg3_frame frame where scheduling takes place +@param Msg3_subframe subframe where scheduling takes place +*/ +void set_msg3_subframe(module_id_t Mod_id, + int CC_id, + int frame, + int subframe, + int rnti, int Msg3_frame, int Msg3_subframe); /* \brief Function to indicate a received SDU on ULSCH. @param Mod_id Instance ID of eNB -@param rnti RNTI of UE transmitting the SR +@param CC_id Component carrier index +@param rnti RNTI of UE transmitting the SDU @param sdu Pointer to received SDU -@param harq_pid Index of harq process corresponding to this sdu -@param msg3_flag flag indicating that this sdu is msg3 +@param sdu_len Length of SDU +@param timing_advance timing advance adjustment after this pdu +@param ul_cqi Uplink CQI estimate after this pdu (SNR quantized to 8 bits, -64 ... 63.5 dB in .5dB steps) */ -void rx_sdu(const module_id_t module_idP, const int CC_id,const frame_t frameP, const sub_frame_t subframeP, const rnti_t rnti, uint8_t *sdu, const uint16_t sdu_len, const int harq_pid,uint8_t *msg3_flag); +void rx_sdu(const module_id_t enb_mod_idP, + const int CC_idP, + const frame_t frameP, + const sub_frame_t subframeP, + const rnti_t rntiP, + uint8_t * sduP, + const uint16_t sdu_lenP, + const uint16_t timing_advance, const uint8_t ul_cqi); + /* \brief Function to indicate a scheduled schduling request (SR) was received by eNB. -@param Mod_id Instance ID of eNB +@param Mod_idP Instance ID of eNB +@param CC_idP CC_id of received SR +@param frameP of received SR +@param subframeP Index of subframe where SR was received @param rnti RNTI of UE transmitting the SR -@param subframe Index of subframe where SR was received +@param ul_cqi SNR measurement of PUCCH (SNR quantized to 8 bits, -64 ... 63.5 dB in .5dB steps) */ -void SR_indication(module_id_t module_idP,int CC_id,frame_t frameP,rnti_t rnti, sub_frame_t subframe); +void SR_indication(module_id_t module_idP, int CC_id, frame_t frameP, + sub_frame_t subframe, rnti_t rnti, uint8_t ul_cqi); /* \brief Function to indicate a UL failure was detected by eNB PHY. @param Mod_id Instance ID of eNB @@ -276,9 +344,35 @@ void SR_indication(module_id_t module_idP,int CC_id,frame_t frameP,rnti_t rnti, @param rnti RNTI of UE transmitting the SR @param subframe Index of subframe where SR was received */ -void UL_failure_indication(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,sub_frame_t subframe); +void UL_failure_indication(module_id_t Mod_id, int CC_id, frame_t frameP, + rnti_t rnti, sub_frame_t subframe); -uint8_t *get_dlsch_sdu(module_id_t module_idP,int CC_id,frame_t frameP,rnti_t rnti,uint8_t TBindex); +/* \brief Function to indicate an HARQ ACK/NAK. +@param Mod_id Instance ID of eNB +@param CC_id Component carrier +@param frameP Frame index +@param subframeP subframe index +@param harq_pdu NFAPI HARQ PDU descriptor +*/ +void harq_indication(module_id_t mod_idP, int CC_idP, frame_t frameP, + sub_frame_t subframeP, + nfapi_harq_indication_pdu_t * harq_pdu); + +/* \brief Function to indicate a received CQI pdu +@param Mod_id Instance ID of eNB +@param CC_id Component carrier +@param frameP Frame index +@param subframeP subframe index +@param rntiP RNTI of incoming CQI information +@param ul_cqi_information NFAPI UL CQI measurement +*/ +void cqi_indication(module_id_t mod_idP, int CC_idP, frame_t frameP, + sub_frame_t subframeP, rnti_t rntiP, + nfapi_cqi_indication_rel9_t * rel9, uint8_t * pdu, + nfapi_ul_cqi_information_t * ul_cqi_information); + +uint8_t *get_dlsch_sdu(module_id_t module_idP, int CC_id, frame_t frameP, + rnti_t rnti, uint8_t TBindex); /* \brief Function to retrieve MCH transport block and MCS used for MCH in this MBSFN subframe. Returns null if no MCH is to be transmitted @param Mod_id Instance ID of eNB @@ -287,79 +381,88 @@ uint8_t *get_dlsch_sdu(module_id_t module_idP,int CC_id,frame_t frameP,rnti_t rn @param mcs Pointer to mcs used by PHY (to be filled by MAC) @returns Pointer to MCH transport block and mcs for subframe */ -MCH_PDU *get_mch_sdu( module_id_t Mod_id, int CC_id, frame_t frame, sub_frame_t subframe); +MCH_PDU *get_mch_sdu(module_id_t Mod_id, int CC_id, frame_t frame, + sub_frame_t subframe); -//added for ALU icic purpose -uint32_t Get_Cell_SBMap(module_id_t module_idP); -void UpdateSBnumber(module_id_t module_idP); -//end ALU's algo -void ue_mac_reset (module_id_t module_idP,uint8_t eNB_index); -void ue_init_mac (module_id_t module_idP); -void init_ue_sched_info(void); -void add_ue_ulsch_info (module_id_t module_idP, int CC_id, int UE_id, sub_frame_t subframe,UE_ULSCH_STATUS status); -void add_ue_dlsch_info (module_id_t module_idP, int CC_id,int UE_id, sub_frame_t subframe,UE_DLSCH_STATUS status); -int find_UE_id (module_id_t module_idP, rnti_t rnti) ; -rnti_t UE_RNTI (module_id_t module_idP, int UE_id); -int UE_PCCID (module_id_t module_idP, int UE_id); -uint8_t find_active_UEs (module_id_t module_idP); -boolean_t is_UE_active (module_id_t module_idP, int UE_id); -uint8_t process_ue_cqi (module_id_t module_idP, int UE_id); + +void ue_mac_reset(module_id_t module_idP, uint8_t eNB_index); +void ue_init_mac(module_id_t module_idP); +void init_ue_sched_info(void); +void add_ue_ulsch_info(module_id_t module_idP, int CC_id, int UE_id, + sub_frame_t subframe, UE_ULSCH_STATUS status); +void add_ue_dlsch_info(module_id_t module_idP, int CC_id, int UE_id, + sub_frame_t subframe, UE_DLSCH_STATUS status); +int find_UE_id(module_id_t module_idP, rnti_t rnti); +int find_RA_id(module_id_t mod_idP, int CC_idP, rnti_t rntiP); +rnti_t UE_RNTI(module_id_t module_idP, int UE_id); +int UE_PCCID(module_id_t module_idP, int UE_id); +uint8_t find_active_UEs(module_id_t module_idP); +boolean_t is_UE_active(module_id_t module_idP, int UE_id); +uint8_t get_aggregation(uint8_t bw_index, uint8_t cqi, uint8_t dci_fmt); int8_t find_active_UEs_with_traffic(module_id_t module_idP); -void init_CCE_table(int module_idP,int CC_idP); +void init_CCE_table(int module_idP, int CC_idP); int get_nCCE_offset(int *CCE_table, - const unsigned char L, - const int nCCE, - const int common_dci, - const unsigned short rnti, + const unsigned char L, + const int nCCE, + const int common_dci, + const unsigned short rnti, const unsigned char subframe); -int allocate_CCEs(int module_idP, - int CC_idP, - int subframe, - int test_only); +int allocate_CCEs(int module_idP, int CC_idP, int subframe, int test_only); boolean_t CCE_allocation_infeasible(int module_idP, - int CC_idP, - int common_flag, - int subframe, - int aggregation, - int rnti); + int CC_idP, + int common_flag, + int subframe, + int aggregation, int rnti); -void set_ue_dai(sub_frame_t subframeP, - uint8_t tdd_config, - int UE_id, - uint8_t CC_id, - UE_list_t *UE_list); +void set_ue_dai(sub_frame_t subframeP, + int UE_id, + uint8_t CC_id, uint8_t tdd_config, UE_list_t * UE_list); -uint8_t find_num_active_UEs_in_cbagroup(module_id_t module_idP, unsigned char group_id); -uint8_t UE_is_to_be_scheduled(module_id_t module_idP,int CC_id,uint8_t UE_id); +/** \brief First stage of PCH Scheduling. Gets a PCH SDU from RRC if available and computes the MCS required to transport it as a function of the SDU length. It assumes a length less than or equal to 64 bytes (MCS 6, 3 PRBs). +@param Mod_id Instance ID of eNB +@param frame Frame index +@param subframe Subframe number on which to act +@param paging_ue_index +*/ +void schedule_PCH(module_id_t module_idP,frame_t frameP,sub_frame_t subframeP); + +uint8_t find_num_active_UEs_in_cbagroup(module_id_t module_idP, + unsigned char group_id); +uint8_t UE_is_to_be_scheduled(module_id_t module_idP, int CC_id, + uint8_t UE_id); /** \brief Round-robin scheduler for ULSCH traffic. @param Mod_id Instance ID for eNB @param subframe Subframe number on which to act @returns UE index that is to be scheduled if needed/room */ -module_id_t schedule_next_ulue(module_id_t module_idP, int UE_id,sub_frame_t subframe); +module_id_t schedule_next_ulue(module_id_t module_idP, int UE_id, + sub_frame_t subframe); /** \brief Round-robin scheduler for DLSCH traffic. @param Mod_id Instance ID for eNB @param subframe Subframe number on which to act @returns UE index that is to be scheduled if needed/room */ -int schedule_next_dlue(module_id_t module_idP, int CC_id, sub_frame_t subframe); +int schedule_next_dlue(module_id_t module_idP, int CC_id, + sub_frame_t subframe); /* \brief Allocates a set of PRBS for a particular UE. This is a simple function for the moment, later it should process frequency-domain CQI information and/or PMI information. Currently it just returns the first PRBS that are available in the subframe based on the number requested. @param UE_id Index of UE on which to act @param nb_rb Number of PRBs allocated to UE by scheduler +@param N_RB_DL Number of PRBs on DL @param rballoc Pointer to bit-map of current PRB allocation given to previous users/control channels. This is updated for subsequent calls to the routine. @returns an rballoc bitmap for resource type 0 allocation (DCI). */ -uint32_t allocate_prbs(int UE_id,uint8_t nb_rb, uint32_t *rballoc); +uint32_t allocate_prbs(int UE_id, uint8_t nb_rb, int N_RB_DL, + uint32_t * rballoc); /* \fn uint32_t req_new_ulsch(module_id_t module_idP) \brief check for a new transmission in any drb @@ -376,20 +479,28 @@ uint32_t req_new_ulsch(module_id_t module_idP); @param subframe subframe number @returns 0 for no SR, 1 for SR */ -uint32_t ue_get_SR(module_id_t module_idP, int CC_id,frame_t frameP, uint8_t eNB_id,rnti_t rnti,sub_frame_t subframe); +uint32_t ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP, + uint8_t eNB_id, rnti_t rnti, sub_frame_t subframe); uint8_t get_ue_weight(module_id_t module_idP, int CC_id, int UE_id); // UE functions -void mac_out_of_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t CH_index); +void mac_out_of_sync_ind(module_id_t module_idP, frame_t frameP, + uint16_t CH_index); -void ue_decode_si(module_id_t module_idP, int CC_id,frame_t frame, uint8_t CH_index, void *pdu, uint16_t len); +void ue_decode_si(module_id_t module_idP, int CC_id, frame_t frame, + uint8_t CH_index, void *pdu, uint16_t len); + +void ue_decode_p(module_id_t module_idP, int CC_id, frame_t frame, + uint8_t CH_index, void *pdu, uint16_t len); -void ue_send_sdu(module_id_t module_idP, uint8_t CC_id,frame_t frame, uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index); +void ue_send_sdu(module_id_t module_idP, uint8_t CC_id, frame_t frame, + sub_frame_t subframe, uint8_t * sdu, uint16_t sdu_len, + uint8_t CH_index); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) /* \brief Called by PHY to transfer MCH transport block to ue MAC. @param Mod_id Index of module instance @param frame Frame index @@ -398,7 +509,9 @@ void ue_send_sdu(module_id_t module_idP, uint8_t CC_id,frame_t frame, uint8_t *s @param eNB_index Index of attached eNB @param sync_area the index of MBSFN sync area */ -void ue_send_mch_sdu(module_id_t module_idP,uint8_t CC_id, frame_t frameP,uint8_t *sdu,uint16_t sdu_len,uint8_t eNB_index,uint8_t sync_area) ; +void ue_send_mch_sdu(module_id_t module_idP, uint8_t CC_id, frame_t frameP, + uint8_t * sdu, uint16_t sdu_len, uint8_t eNB_index, + uint8_t sync_area); /*\brief Function to check if UE PHY needs to decode MCH for MAC. @param Mod_id Index of protocol instance @@ -408,7 +521,9 @@ void ue_send_mch_sdu(module_id_t module_idP,uint8_t CC_id, frame_t frameP,uint8_ @param[out] sync_area return the sync area @param[out] mcch_active flag indicating whether this MCCH is active in this SF */ -int ue_query_mch(uint8_t Mod_id,uint8_t CC_id, uint32_t frame,sub_frame_t subframe, uint8_t eNB_index, uint8_t *sync_area, uint8_t *mcch_active); +int ue_query_mch(uint8_t Mod_id, uint8_t CC_id, uint32_t frame, + sub_frame_t subframe, uint8_t eNB_index, + uint8_t * sync_area, uint8_t * mcch_active); #endif @@ -419,7 +534,10 @@ int ue_query_mch(uint8_t Mod_id,uint8_t CC_id, uint32_t frame,sub_frame_t subfra @param subframe subframe number @returns 0 for no SR, 1 for SR */ -void ue_get_sdu(module_id_t module_idP, int CC_id,frame_t frameP, sub_frame_t subframe, uint8_t eNB_index,uint8_t *ulsch_buffer,uint16_t buflen,uint8_t *access_mode); +void ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP, + sub_frame_t subframe, uint8_t eNB_index, + uint8_t * ulsch_buffer, uint16_t buflen, + uint8_t * access_mode); /* \brief Function called by PHY to retrieve information to be transmitted using the RA procedure. If the UE is not in PUSCH mode for a particular eNB index, this is assumed to be an Msg3 and MAC attempts to retrieves the CCCH message from RRC. If the UE is in PUSCH mode for a particular eNB index and PUCCH format 0 (Scheduling Request) is not activated, the MAC may use this resource for random-access to transmit a BSR along with the C-RNTI control element (see 5.1.4 from 36.321) @param Mod_id Index of UE instance @@ -427,25 +545,31 @@ void ue_get_sdu(module_id_t module_idP, int CC_id,frame_t frameP, sub_frame_t su @param New_Msg3 Flag to indicate this call is for a new Msg3 @param subframe Index of subframe for PRACH transmission (0 ... 9) @returns A pointer to a PRACH_RESOURCES_t */ -PRACH_RESOURCES_t *ue_get_rach(module_id_t module_idP,int CC_id,frame_t frameP,uint8_t new_Msg3,sub_frame_t subframe); +PRACH_RESOURCES_t *ue_get_rach(module_id_t module_idP, int CC_id, + frame_t frameP, uint8_t new_Msg3, + sub_frame_t subframe); /* \brief Function called by PHY to process the received RAR. It checks that the preamble matches what was sent by the eNB and provides the timing advance and t-CRNTI. @param Mod_id Index of UE instance +@param CC_id Index to a component carrier +@param frame Frame index +@param ra_rnti RA_RNTI value @param dlsch_buffer Pointer to dlsch_buffer containing RAR PDU @param t_crnti Pointer to PHY variable containing the T_CRNTI @param preamble_index Preamble Index used by PHY to transmit the PRACH. This should match the received RAR to trigger the rest of random-access procedure +@param selected_rar_buffer the output buffer for storing the selected RAR header and RAR payload @returns timing advance or 0xffff if preamble doesn't match */ uint16_t -ue_process_rar( - const module_id_t module_idP, - const int CC_id, - const frame_t frameP, - uint8_t * const dlsch_buffer, - rnti_t * const t_crnti, - const uint8_t preamble_index -); +ue_process_rar(const module_id_t module_idP, + const int CC_id, + const frame_t frameP, + const rnti_t ra_rnti, + uint8_t * const dlsch_buffer, + rnti_t * const t_crnti, + const uint8_t preamble_index, + uint8_t * selected_rar_buffer); /* \brief Generate header for UL-SCH. This function parses the desired control elements and sdus and generates the header as described @@ -464,17 +588,17 @@ in the ULSCH buffer. @param post_padding Number of bytes for padding at the end of MAC PDU @returns Number of bytes used for header */ -unsigned char generate_ulsch_header(uint8_t *mac_header, - uint8_t num_sdus, - uint8_t short_padding, - uint16_t *sdu_lengths, - uint8_t *sdu_lcids, - POWER_HEADROOM_CMD *power_headroom, - uint16_t *crnti, - BSR_SHORT *truncated_bsr, - BSR_SHORT *short_bsr, - BSR_LONG *long_bsr, - unsigned short post_padding); +unsigned char generate_ulsch_header(uint8_t * mac_header, + uint8_t num_sdus, + uint8_t short_padding, + uint16_t * sdu_lengths, + uint8_t * sdu_lcids, + POWER_HEADROOM_CMD * power_headroom, + uint16_t * crnti, + BSR_SHORT * truncated_bsr, + BSR_SHORT * short_bsr, + BSR_LONG * long_bsr, + unsigned short post_padding); /* \brief Parse header for UL-SCH. This function parses the received UL-SCH header as described in 36-321 MAC layer specifications. It returns the number of bytes used for the header to be used as an offset for the payload @@ -487,51 +611,66 @@ in the ULSCH buffer. @param rx_lengths Pointer to array of SDU lengths @returns Pointer to payload following header */ -uint8_t *parse_ulsch_header(uint8_t *mac_header, - uint8_t *num_ce, - uint8_t *num_sdu, - uint8_t *rx_ces, - uint8_t *rx_lcids, - uint16_t *rx_lengths, - uint16_t tx_lenght); +uint8_t *parse_ulsch_header(uint8_t * mac_header, + uint8_t * num_ce, + uint8_t * num_sdu, + uint8_t * rx_ces, + uint8_t * rx_lcids, + uint16_t * rx_lengths, uint16_t tx_lenght); - -int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, uint8_t HO_active); +int to_prb(int); +int to_rbg(int); +int l2_init(LTE_DL_FRAME_PARMS * frame_parms, int eMBMS_active, + char *uecap_xer, uint8_t cba_group_active, uint8_t HO_active); int mac_init(void); -int add_new_ue(module_id_t Mod_id, int CC_id, rnti_t rnti,int harq_pid); +int add_new_ue(module_id_t Mod_id, int CC_id, rnti_t rnti, int harq_pid +#ifdef Rel14 + , uint8_t rach_resource_type +#endif + ); int rrc_mac_remove_ue(module_id_t Mod_id, rnti_t rntiP); -int maxround(module_id_t Mod_id,uint16_t rnti,int frame,sub_frame_t subframe,uint8_t ul_flag); -void swap_UEs(UE_list_t *listP,int nodeiP, int nodejP, int ul_flag); -int prev(UE_list_t *listP, int nodeP, int ul_flag); -void dump_ue_list(UE_list_t *listP, int ul_flag); -int UE_num_active_CC(UE_list_t *listP,int ue_idP); -int UE_PCCID(module_id_t mod_idP,int ue_idP); +int maxround(module_id_t Mod_id, uint16_t rnti, int frame, + sub_frame_t subframe, uint8_t ul_flag); +void swap_UEs(UE_list_t * listP, int nodeiP, int nodejP, int ul_flag); +int prev(UE_list_t * listP, int nodeP, int ul_flag); +void dump_ue_list(UE_list_t * listP, int ul_flag); +int UE_num_active_CC(UE_list_t * listP, int ue_idP); +int UE_PCCID(module_id_t mod_idP, int ue_idP); rnti_t UE_RNTI(module_id_t mod_idP, int ue_idP); -void ulsch_scheduler_pre_processor(module_id_t module_idP, int frameP, sub_frame_t subframeP, uint16_t *first_rb, uint8_t aggregattion); -void store_ulsch_buffer(module_id_t module_idP, int frameP, sub_frame_t subframeP); -void sort_ue_ul (module_id_t module_idP,int frameP, sub_frame_t subframeP); -void assign_max_mcs_min_rb(module_id_t module_idP,int frameP, sub_frame_t subframeP,uint16_t *first_rb); -void adjust_bsr_info(int buffer_occupancy, uint16_t TBS, UE_TEMPLATE *UE_template); +void ulsch_scheduler_pre_processor(module_id_t module_idP, int frameP, + sub_frame_t subframeP, + uint16_t * first_rb); +void store_ulsch_buffer(module_id_t module_idP, int frameP, + sub_frame_t subframeP); +void sort_ue_ul(module_id_t module_idP, int frameP, sub_frame_t subframeP); +void assign_max_mcs_min_rb(module_id_t module_idP, int frameP, + sub_frame_t subframeP, uint16_t * first_rb); +void adjust_bsr_info(int buffer_occupancy, uint16_t TBS, + UE_TEMPLATE * UE_template); +int phy_stats_exist(module_id_t Mod_id, int rnti); /*! \fn UE_L2_state_t ue_scheduler(const module_id_t module_idP,const frame_t frameP, const sub_frame_t subframe, const lte_subframe_t direction,const uint8_t eNB_index) \brief UE scheduler where all the ue background tasks are done. This function performs the following: 1) Trigger PDCP every 5ms 2) Call RRC for link status return to PHY3) Perform SR/BSR procedures for scheduling feedback 4) Perform PHR procedures. \param[in] module_idP instance of the UE -\param[in] subframe t the subframe number +\param[in] rxFrame the RX frame number +\param[in] rxSubframe the RX subframe number +\param[in] txFrame the TX frame number +\param[in] txSubframe the TX subframe number \param[in] direction subframe direction \param[in] eNB_index instance of eNB @returns L2 state (CONNETION_OK or CONNECTION_LOST or PHY_RESYNCH) */ -UE_L2_STATE_t ue_scheduler( - const module_id_t module_idP, - const frame_t frameP, - const sub_frame_t subframe, - const lte_subframe_t direction, - const uint8_t eNB_index, - const int CC_id); +UE_L2_STATE_t ue_scheduler(const module_id_t module_idP, + const frame_t rxFrameP, + const sub_frame_t rxSubframe, + const frame_t txFrameP, + const sub_frame_t txSubframe, + const lte_subframe_t direction, + const uint8_t eNB_index, const int CC_id); /*! \fn int cba_access(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, uint8_t eNB_index,uint16_t buflen); \brief determine whether to use cba resource to transmit or not @@ -541,22 +680,8 @@ UE_L2_STATE_t ue_scheduler( \param[in] eNB_index instance of eNB \param[out] access(1) or postpone (0) */ -int cba_access(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, uint8_t eNB_index,uint16_t buflen); - -/*! \fn int get_bsr_lcgid (module_id_t module_idP); -\brief determine the lcgid for the bsr -\param[in] Mod_id instance of the UE -\param[out] lcgid -*/ -int get_bsr_lcgid (module_id_t module_idP); - -/*! \fn uint8_t get_bsr_len (module_id_t module_idP,uint16_t bufflen); -\brief determine whether the bsr is short or long assuming that the MAC pdu is built -\param[in] Mod_id instance of the UE -\param[in] bufflen size of phy transport block -\param[out] bsr_len size of bsr control element -*/ -uint8_t get_bsr_len (module_id_t module_idP, uint16_t buflen); +int cba_access(module_id_t module_idP, frame_t frameP, + sub_frame_t subframe, uint8_t eNB_index, uint16_t buflen); /*! \fn BSR_SHORT * get_bsr_short(module_id_t module_idP, uint8_t bsr_len) \brief get short bsr level @@ -572,24 +697,25 @@ BSR_SHORT *get_bsr_short(module_id_t module_idP, uint8_t bsr_len); \param[in] bsr_len indicator for no, short, or long bsr \param[out] bsr_l pointer to long bsr */ -BSR_LONG * get_bsr_long(module_id_t module_idP, uint8_t bsr_len); +BSR_LONG *get_bsr_long(module_id_t module_idP, uint8_t bsr_len); -/*! \fn boolean_t update_bsr(module_id_t module_idP, frame_t frameP, uint8_t lcid) +/*! \fn boolean_t update_bsr(module_id_t module_idP, frame_t frameP,sub_frame_t subframeP) \brief get the rlc stats and update the bsr level for each lcid \param[in] Mod_id instance of the UE \param[in] frame Frame index -\param[in] lcid logical channel identifier */ -boolean_t update_bsr(module_id_t module_idP, frame_t frameP, eNB_index_t eNB_index, uint8_t lcid, uint8_t lcgid); +boolean_t update_bsr(module_id_t module_idP, frame_t frameP, + sub_frame_t subframeP, eNB_index_t eNB_index); -/*! \fn locate (int *table, int size, int value) +/*! \fn locate_BsrIndexByBufferSize (int *table, int size, int value) \brief locate the BSR level in the table as defined in 36.321. This function requires that he values in table to be monotonic, either increasing or decreasing. The returned value is not less than 0, nor greater than n-1, where n is the size of table. \param[in] *table Pointer to BSR table \param[in] size Size of the table \param[in] value Value of the buffer \return the index in the BSR_LEVEL table */ -uint8_t locate (const uint32_t *table, int size, int value); +uint8_t locate_BsrIndexByBufferSize(const uint32_t * table, int size, + int value); /*! \fn int get_sf_periodicBSRTimer(uint8_t periodicBSR_Timer) @@ -640,7 +766,8 @@ int get_db_dl_PathlossChange(uint8_t dl_PathlossChange); \param[in] CC_id Component Carrier Index \return phr mapping */ -uint8_t get_phr_mapping (module_id_t module_idP, int CC_id, uint8_t eNB_index); +uint8_t get_phr_mapping(module_id_t module_idP, int CC_id, + uint8_t eNB_index); /*! \fn void update_phr (module_id_t module_idP) \brief update/reset the phr timers @@ -648,13 +775,14 @@ uint8_t get_phr_mapping (module_id_t module_idP, int CC_id, uint8_t eNB_index); \param[in] CC_id Component carrier index \return void */ -void update_phr (module_id_t module_idP,int CC_id); +void update_phr(module_id_t module_idP, int CC_id); /*! \brief Function to indicate Msg3 transmission/retransmission which initiates/reset Contention Resolution Timer \param[in] Mod_id Instance index of UE \param[in] eNB_id Index of eNB */ -void Msg3_tx(module_id_t module_idP,uint8_t CC_id,frame_t frameP,uint8_t eNB_id); +void Msg3_tx(module_id_t module_idP, uint8_t CC_id, frame_t frameP, + uint8_t eNB_id); /*! \brief Function to indicate the transmission of msg1/rach @@ -662,18 +790,18 @@ void Msg3_tx(module_id_t module_idP,uint8_t CC_id,frame_t frameP,uint8_t eNB_id) \param[in] eNB_id Index of eNB */ -void Msg1_tx(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id); +void Msg1_tx(module_id_t module_idP, uint8_t CC_id, frame_t frameP, + uint8_t eNB_id); -void dl_phy_sync_success(module_id_t module_idP, - frame_t frameP, - unsigned char eNB_index, - uint8_t first_sync); +void dl_phy_sync_success(module_id_t module_idP, + frame_t frameP, + unsigned char eNB_index, uint8_t first_sync); int dump_eNB_l2_stats(char *buffer, int length); double uniform_rngen(int min, int max); - +/* void add_common_dci(DCI_PDU *DCI_pdu, void *pdu, rnti_t rnti, @@ -682,10 +810,15 @@ void add_common_dci(DCI_PDU *DCI_pdu, unsigned char dci_size_bits, unsigned char dci_fmt, uint8_t ra_flag); +*/ -uint32_t allocate_prbs_sub(int nb_rb, uint8_t *rballoc); +uint32_t allocate_prbs_sub(int nb_rb, int N_RB_DL, int N_RBG, + uint8_t * rballoc); -void update_ul_dci(module_id_t module_idP,uint8_t CC_id,rnti_t rnti,uint8_t dai); +void update_ul_dci(module_id_t module_idP, uint8_t CC_id, rnti_t rnti, + uint8_t dai); + +int get_bw_index(module_id_t module_id, uint8_t CC_id); int get_min_rb_unit(module_id_t module_idP, uint8_t CC_id); @@ -704,21 +837,91 @@ in the DLSCH buffer. @returns Number of bytes used for header */ unsigned char generate_dlsch_header(unsigned char *mac_header, - unsigned char num_sdus, - unsigned short *sdu_lengths, - unsigned char *sdu_lcids, - unsigned char drx_cmd, - short timing_advance_cmd, - unsigned char *ue_cont_res_id, - unsigned char short_padding, - unsigned short post_padding); + unsigned char num_sdus, + unsigned short *sdu_lengths, + unsigned char *sdu_lcids, + unsigned char drx_cmd, + unsigned short timing_advance_cmd, + unsigned char *ue_cont_res_id, + unsigned char short_padding, + unsigned short post_padding); -/** \brief RRC Configuration primitive for PHY/MAC. Allows configuration of PHY/MAC resources based on System Information (SI), RRCConnectionSetup and RRCConnectionReconfiguration messages. +/** \brief RRC eNB Configuration primitive for PHY/MAC. Allows configuration of PHY/MAC resources based on System Information (SI), RRCConnectionSetup and RRCConnectionReconfiguration messages. @param Mod_id Instance ID of eNB @param CC_id Component Carrier of the eNB -@param eNB_flag Indicates if this is a eNB or UE configuration -@param rntiP id of UE if this is an eNB configuration -@param eNB_id Index of eNB if this is a UE configuration +@param mib Pointer to MIB + +@param radioResourceConfigCommon Structure from SIB2 for common radio parameters (if NULL keep existing configuration) +@param physicalConfigDedicated Structure from RRCConnectionSetup or RRCConnectionReconfiguration for dedicated PHY parameters (if NULL keep existing configuration) +@param measObj Structure from RRCConnectionReconfiguration for UE measurement procedures +@param mac_MainConfig Structure from RRCConnectionSetup or RRCConnectionReconfiguration for dedicated MAC parameters (if NULL keep existing configuration) +@param logicalChannelIdentity Logical channel identity index of corresponding logical channel config +@param logicalChannelConfig Pointer to logical channel configuration +@param measGapConfig Measurement Gap configuration for MAC (if NULL keep existing configuration) +@param tdd_Config TDD Configuration from SIB1 (if NULL keep existing configuration) +@param mobilityControlInfo mobility control info received for Handover +@param SchedInfoList SI Scheduling information +@param MBMS_Flag indicates MBMS transmission +@param mbsfn_SubframeConfigList pointer to mbsfn subframe configuration list from SIB2 +@param mbsfn_AreaInfoList pointer to MBSFN Area Info list from SIB13 +@param pmch_InfoList pointer to PMCH_InfoList from MBSFNAreaConfiguration Message (MCCH Message) +@param sib1_ext_r13 SI Scheduling information for SI-BR UEs +*/ + +int rrc_mac_config_req_eNB(module_id_t module_idP, + int CC_id, + int physCellId, + int p_eNB, + int Ncp, + int eutra_band, uint32_t dl_CarrierFreq, +#ifdef Rel14 + int pbch_repetition, +#endif + rnti_t rntiP, + BCCH_BCH_Message_t * mib, + RadioResourceConfigCommonSIB_t * + radioResourceConfigCommon, +#ifdef Rel14 + RadioResourceConfigCommonSIB_t * + radioResourceConfigCommon_BR, +#endif + struct PhysicalConfigDedicated + *physicalConfigDedicated, +#if defined(Rel10) || defined(Rel14) + SCellToAddMod_r10_t * sCellToAddMod_r10, + //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, +#endif + MeasObjectToAddMod_t ** measObj, + MAC_MainConfig_t * mac_MainConfig, + long logicalChannelIdentity, + LogicalChannelConfig_t * logicalChannelConfig, + MeasGapConfig_t * measGapConfig, + TDD_Config_t * tdd_Config, + MobilityControlInfo_t * mobilityControlInfo, + SchedulingInfoList_t * schedulingInfoList, + uint32_t ul_CarrierFreq, + long *ul_Bandwidth, + AdditionalSpectrumEmission_t * + additionalSpectrumEmission, + struct MBSFN_SubframeConfigList + *mbsfn_SubframeConfigList +#if defined(Rel10) || defined(Rel14) + , + uint8_t MBMS_Flag, + MBSFN_AreaInfoList_r9_t * mbsfn_AreaInfoList, + PMCH_InfoList_r9_t * pmch_InfoList +#endif +#ifdef Rel14 + , + SystemInformationBlockType1_v1310_IEs_t * + sib1_ext_r13 +#endif + ); + +/** \brief RRC eNB Configuration primitive for PHY/MAC. Allows configuration of PHY/MAC resources based on System Information (SI), RRCConnectionSetup and RRCConnectionReconfiguration messages. +@param Mod_id Instance ID of ue +@param CC_id Component Carrier of the ue +@param eNB_id Index of eNB @param radioResourceConfigCommon Structure from SIB2 for common radio parameters (if NULL keep existing configuration) @param physcialConfigDedicated Structure from RRCConnectionSetup or RRCConnectionReconfiguration for dedicated PHY parameters (if NULL keep existing configuration) @param measObj Structure from RRCConnectionReconfiguration for UE measurement procedures @@ -735,58 +938,232 @@ unsigned char generate_dlsch_header(unsigned char *mac_header, @param mbsfn_AreaInfoList pointer to MBSFN Area Info list from SIB13 @param pmch_InfoList pointer to PMCH_InfoList from MBSFNAreaConfiguration Message (MCCH Message) */ -int rrc_mac_config_req(module_id_t module_idP, - int CC_id, - eNB_flag_t eNB_flag, - rnti_t rntiP, - uint8_t eNB_index, - RadioResourceConfigCommonSIB_t *radioResourceConfigCommon, - struct PhysicalConfigDedicated *physicalConfigDedicated, -#ifdef Rel10 - SCellToAddMod_r10_t *sCellToAddMod_r10, - //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, +int rrc_mac_config_req_ue(module_id_t module_idP, + int CC_id, + uint8_t eNB_index, + RadioResourceConfigCommonSIB_t * + radioResourceConfigCommon, + struct PhysicalConfigDedicated + *physicalConfigDedicated, +#if defined(Rel10) || defined(Rel14) + SCellToAddMod_r10_t * sCellToAddMod_r10, + //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, #endif - MeasObjectToAddMod_t **measObj, - MAC_MainConfig_t *mac_MainConfig, - long logicalChannelIdentity, - LogicalChannelConfig_t *logicalChannelConfig, - MeasGapConfig_t *measGapConfig, - TDD_Config_t *tdd_Config, - MobilityControlInfo_t *mobilityControlInfo, - uint8_t *SIwindowsize, - uint16_t *SIperiod, - ARFCN_ValueEUTRA_t *ul_CarrierFreq, - long *ul_Bandwidth, - AdditionalSpectrumEmission_t *additionalSpectrumEmission, - struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList -#ifdef Rel10 - , - uint8_t MBMS_Flag, - MBSFN_AreaInfoList_r9_t *mbsfn_AreaInfoList, - PMCH_InfoList_r9_t *pmch_InfoList - + MeasObjectToAddMod_t ** measObj, + MAC_MainConfig_t * mac_MainConfig, + long logicalChannelIdentity, + LogicalChannelConfig_t * logicalChannelConfig, + MeasGapConfig_t * measGapConfig, + TDD_Config_t * tdd_Config, + MobilityControlInfo_t * mobilityControlInfo, + uint8_t * SIwindowsize, + uint16_t * SIperiod, + ARFCN_ValueEUTRA_t * ul_CarrierFreq, + long *ul_Bandwidth, + AdditionalSpectrumEmission_t * + additionalSpectrumEmission, + struct MBSFN_SubframeConfigList + *mbsfn_SubframeConfigList +#if defined(Rel10) || defined(Rel14) + , + uint8_t MBMS_Flag, + MBSFN_AreaInfoList_r9_t * mbsfn_AreaInfoList, + PMCH_InfoList_r9_t * pmch_InfoList #endif #ifdef CBA - , - uint8_t num_active_cba_groups, - uint16_t cba_rnti + , + uint8_t num_active_cba_groups, uint16_t cba_rnti #endif - ); + ); -/** \brief get the estimated UE distance from the PHY->MAC layer. -@param Mod_id Instance ID of eNB -@param UE_id Index of UE if this is an eNB configuration -@param CC_id Component Carrier Index -@param loc_type localization type: time-based or power-based -@return the estimated distance in meters - */ -double -rrc_get_estimated_ue_distance( - const protocol_ctxt_t * const ctxt_pP, - const int CC_idP, - const uint8_t loc_typeP); +uint16_t getRIV(uint16_t N_RB_DL, uint16_t RBstart, uint16_t Lcrbs); -void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB); +int get_subbandsize(uint8_t dl_bandwidth); + + +void get_Msg3allocret(COMMON_channels_t * cc, + sub_frame_t current_subframe, + frame_t current_frame, + frame_t * frame, sub_frame_t * subframe); + +void get_Msg3alloc(COMMON_channels_t * cc, + sub_frame_t current_subframe, + frame_t current_frame, + frame_t * frame, sub_frame_t * subframe); + +uint16_t mac_computeRIV(uint16_t N_RB_DL, uint16_t RBstart, + uint16_t Lcrbs); + +int get_phich_resource_times6(COMMON_channels_t * cc); + +int to_rbg(int dl_Bandwidth); + +int to_prb(int dl_Bandwidth); + +uint8_t get_Msg3harqpid(COMMON_channels_t * cc, + frame_t frame, sub_frame_t current_subframe); + +uint32_t pdcchalloc2ulframe(COMMON_channels_t * ccP, uint32_t frame, + uint8_t n); + +uint8_t pdcchalloc2ulsubframe(COMMON_channels_t * ccP, uint8_t n); + +int is_UL_sf(COMMON_channels_t * ccP, sub_frame_t subframeP); + +uint8_t getQm(uint8_t mcs); + +uint8_t subframe2harqpid(COMMON_channels_t * cc, frame_t frame, + sub_frame_t subframe); + +void get_srs_pos(COMMON_channels_t * cc, uint16_t isrs, + uint16_t * psrsPeriodicity, uint16_t * psrsOffset); + +void get_csi_params(COMMON_channels_t * cc, + struct CQI_ReportPeriodic *cqi_PMI_ConfigIndex, + uint16_t * Npd, uint16_t * N_OFFSET_CQI, int *H); + +uint8_t get_rel8_dl_cqi_pmi_size(UE_sched_ctrl * sched_ctl, int CC_idP, + COMMON_channels_t * cc, uint8_t tmode, + struct CQI_ReportPeriodic + *cqi_ReportPeriodic); + +uint8_t get_dl_cqi_pmi_size_pusch(COMMON_channels_t * cc, uint8_t tmode, + uint8_t ri, + CQI_ReportModeAperiodic_t * + cqi_ReportModeAperiodic); +void extract_pucch_csi(module_id_t mod_idP, int CC_idP, int UE_id, + frame_t frameP, sub_frame_t subframeP, + uint8_t * pdu, uint8_t length); + +void extract_pusch_csi(module_id_t mod_idP, int CC_idP, int UE_id, + frame_t frameP, sub_frame_t subframeP, + uint8_t * pdu, uint8_t length); + +uint16_t fill_nfapi_tx_req(nfapi_tx_request_body_t * tx_req_body, + uint16_t absSF, uint16_t pdu_length, + uint16_t pdu_index, uint8_t * pdu); + +void fill_nfapi_ulsch_config_request_rel8(nfapi_ul_config_request_pdu_t * + ul_config_pdu, uint8_t cqi_req, + COMMON_channels_t * cc, + struct PhysicalConfigDedicated + *physicalConfigDedicated, + uint8_t tmode, uint32_t handle, + uint16_t rnti, + uint8_t resource_block_start, + uint8_t + number_of_resource_blocks, + uint8_t mcs, + uint8_t cyclic_shift_2_for_drms, + uint8_t + frequency_hopping_enabled_flag, + uint8_t frequency_hopping_bits, + uint8_t new_data_indication, + uint8_t redundancy_version, + uint8_t harq_process_number, + uint8_t ul_tx_mode, + uint8_t current_tx_nb, + uint8_t n_srs, uint16_t size); + +#ifdef Rel14 +void fill_nfapi_ulsch_config_request_emtc(nfapi_ul_config_request_pdu_t * + ul_config_pdu, uint8_t ue_type, + uint16_t + total_number_of_repetitions, + uint16_t repetition_number, + uint16_t + initial_transmission_sf_io); +#endif + +void program_dlsch_acknak(module_id_t module_idP, int CC_idP, int UE_idP, + frame_t frameP, sub_frame_t subframeP, + uint8_t cce_idx); + +void fill_nfapi_dlsch_config(eNB_MAC_INST * eNB, + nfapi_dl_config_request_body_t * dl_req, + uint16_t length, uint16_t pdu_index, + uint16_t rnti, + uint8_t resource_allocation_type, + uint8_t + virtual_resource_block_assignment_flag, + uint16_t resource_block_coding, + uint8_t modulation, + uint8_t redundancy_version, + uint8_t transport_blocks, + uint8_t transport_block_to_codeword_swap_flag, + uint8_t transmission_scheme, + uint8_t number_of_layers, + uint8_t number_of_subbands, + // uint8_t codebook_index, + uint8_t ue_category_capacity, + uint8_t pa, + uint8_t delta_power_offset_index, + uint8_t ngap, + uint8_t nprb, + uint8_t transmission_mode, + uint8_t num_bf_prb_per_subband, + uint8_t num_bf_vector); + +void fill_nfapi_harq_information(module_id_t module_idP, + int CC_idP, + uint16_t rntiP, + uint16_t absSFP, + nfapi_ul_config_harq_information * + harq_information, uint8_t cce_idxP); + +void fill_nfapi_ulsch_harq_information(module_id_t module_idP, + int CC_idP, + uint16_t rntiP, + nfapi_ul_config_ulsch_harq_information + * harq_information); + +uint16_t fill_nfapi_uci_acknak(module_id_t module_idP, + int CC_idP, + uint16_t rntiP, + uint16_t absSFP, uint8_t cce_idxP); + +void fill_nfapi_dl_dci_1A(nfapi_dl_config_request_pdu_t * dl_config_pdu, + uint8_t aggregation_level, + uint16_t rnti, + uint8_t rnti_type, + uint8_t harq_process, + uint8_t tpc, + uint16_t resource_block_coding, + uint8_t mcs, + uint8_t ndi, uint8_t rv, uint8_t vrb_flag); + +nfapi_ul_config_request_pdu_t *has_ul_grant(module_id_t module_idP, + int CC_idP, uint16_t subframeP, + uint16_t rnti); + +uint8_t get_tmode(module_id_t module_idP, int CC_idP, int UE_idP); + +uint8_t get_ul_req_index(module_id_t module_idP, int CC_idP, + sub_frame_t subframeP); + +#ifdef Rel14 +int get_numnarrowbandbits(long dl_Bandwidth); + +int mpdcch_sf_condition(eNB_MAC_INST * eNB, int CC_id, frame_t frameP, + sub_frame_t subframeP, int rmax, + MPDCCH_TYPES_t mpdcch_type, int UE_id); + +int get_numnarrowbands(long dl_Bandwidth); + +int narrowband_to_first_rb(COMMON_channels_t * cc, int nb_index); + +#endif + +int l2_init_eNB(void); + +void Msg1_transmitted(module_id_t module_idP, uint8_t CC_id, + frame_t frameP, uint8_t eNB_id); +void Msg3_transmitted(module_id_t module_idP, uint8_t CC_id, + frame_t frameP, uint8_t eNB_id); +uint32_t from_earfcn(int eutra_bandP, uint32_t dl_earfcn); +int32_t get_uldl_offset(int eutra_bandP); +int l2_init_ue(int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, + uint8_t HO_active); #endif /** @}*/ diff --git a/openair2/LAYER2/MAC/ra_procedures.c b/openair2/LAYER2/MAC/ra_procedures.c index 669077bf4f..8868d2d548 100644 --- a/openair2/LAYER2/MAC/ra_procedures.c +++ b/openair2/LAYER2/MAC/ra_procedures.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file ra_procedures.c * \brief Routines for UE MAC-layer Random-access procedures (36.321) V8.6 2009-03 @@ -42,8 +34,8 @@ #include "defs.h" #include "proto.h" #include "UTIL/LOG/vcd_signal_dumper.h" -#include "PHY_INTERFACE/defs.h" #include "PHY_INTERFACE/extern.h" +#include "SCHED/defs.h" #include "COMMON/mac_rrc_primitives.h" #include "RRC/LITE/extern.h" #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" @@ -55,508 +47,604 @@ #include "SIMULATION/simulation_defs.h" #endif -#include "SIMULATION/TOOLS/defs.h" // for taus +#include "SIMULATION/TOOLS/defs.h" // for taus -int8_t get_DELTA_PREAMBLE(module_id_t module_idP,int CC_id) +int8_t get_DELTA_PREAMBLE(module_id_t module_idP, int CC_id) { - if (CC_id>0) { - LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return 0; // not reached - } + AssertFatal(CC_id == 0, + "Transmission on secondary CCs is not supported yet\n"); + uint8_t prachConfigIndex = + UE_mac_inst[module_idP].radioResourceConfigCommon-> + prach_Config.prach_ConfigInfo.prach_ConfigIndex; + uint8_t preambleformat; - uint8_t prachConfigIndex = UE_mac_inst[module_idP].radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_ConfigIndex; - uint8_t preambleformat; - - if (UE_mac_inst[module_idP].tdd_Config) { // TDD - if (prachConfigIndex < 20) { - preambleformat = 0; - } else if (prachConfigIndex < 30) { - preambleformat = 1; - } else if (prachConfigIndex < 40) { - preambleformat = 2; - } else if (prachConfigIndex < 48) { - preambleformat = 3; - } else { - preambleformat = 4; + if (UE_mac_inst[module_idP].tdd_Config) { // TDD + if (prachConfigIndex < 20) { + preambleformat = 0; + } else if (prachConfigIndex < 30) { + preambleformat = 1; + } else if (prachConfigIndex < 40) { + preambleformat = 2; + } else if (prachConfigIndex < 48) { + preambleformat = 3; + } else { + preambleformat = 4; + } + } else { // FDD + preambleformat = prachConfigIndex >> 2; } - } else { // FDD - preambleformat = prachConfigIndex>>2; - } - switch (preambleformat) { - case 0: - case 1: - return(0); + switch (preambleformat) { + case 0: + case 1: + return (0); - case 2: - case 3: - return(-3); + case 2: + case 3: + return (-3); - case 4: - return(8); + case 4: + return (8); - default: - LOG_E(MAC,"[UE %d] ue_procedures.c: FATAL, Illegal preambleformat %d, prachConfigIndex %d\n", - module_idP, - preambleformat,prachConfigIndex); - mac_xface->macphy_exit("MAC get_DELTA_PREAMBLE Illegal preamble format"); - return(0); - } + default: + AssertFatal(1 == 0, + "[UE %d] ue_procedures.c: FATAL, Illegal preambleformat %d, prachConfigIndex %d\n", + module_idP, preambleformat, prachConfigIndex); + } } /// This routine implements Section 5.1.2 (UE Random Access Resource Selection) from 36.321 -void get_prach_resources(module_id_t module_idP, - int CC_id, - uint8_t eNB_index, - uint8_t t_id, - uint8_t first_Msg3, - RACH_ConfigDedicated_t *rach_ConfigDedicated) +void +get_prach_resources(module_id_t module_idP, + int CC_id, + uint8_t eNB_index, + uint8_t t_id, + uint8_t first_Msg3, + RACH_ConfigDedicated_t * rach_ConfigDedicated) { - uint8_t Msg3_size = UE_mac_inst[module_idP].RA_Msg3_size; - PRACH_RESOURCES_t *prach_resources = &UE_mac_inst[module_idP].RA_prach_resources; - RACH_ConfigCommon_t *rach_ConfigCommon = NULL; - uint8_t noGroupB = 0; - uint8_t f_id = 0,num_prach=0; - int numberOfRA_Preambles; - int messageSizeGroupA; - int sizeOfRA_PreamblesGroupA; - int messagePowerOffsetGroupB; - int PLThreshold; + uint8_t Msg3_size = UE_mac_inst[module_idP].RA_Msg3_size; + PRACH_RESOURCES_t *prach_resources = + &UE_mac_inst[module_idP].RA_prach_resources; + RACH_ConfigCommon_t *rach_ConfigCommon = NULL; + uint8_t noGroupB = 0; + uint8_t f_id = 0, num_prach = 0; + int numberOfRA_Preambles; + int messageSizeGroupA; + int sizeOfRA_PreamblesGroupA; + int messagePowerOffsetGroupB; + int PLThreshold; - if (CC_id>0) { - LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return; - } + AssertFatal(CC_id == 0, + "Transmission on secondary CCs is not supported yet\n"); + AssertFatal(UE_mac_inst[module_idP].radioResourceConfigCommon != NULL, + "[UE %d] FATAL radioResourceConfigCommon is NULL !!!\n", + module_idP); - if (UE_mac_inst[module_idP].radioResourceConfigCommon) { - rach_ConfigCommon = &UE_mac_inst[module_idP].radioResourceConfigCommon->rach_ConfigCommon; - } else { - LOG_E(MAC,"[UE %d] FATAL radioResourceConfigCommon is NULL !!!\n",module_idP); - mac_xface->macphy_exit("MAC FATAL radioResourceConfigCommon is NULL"); - return; // not reached - } + rach_ConfigCommon = + &UE_mac_inst[module_idP].radioResourceConfigCommon-> + rach_ConfigCommon; + numberOfRA_Preambles = + (1 + rach_ConfigCommon->preambleInfo.numberOfRA_Preambles) << 2; - numberOfRA_Preambles = (1+rach_ConfigCommon->preambleInfo.numberOfRA_Preambles)<<2; - - if (rach_ConfigDedicated) { // This is for network controlled Mobility, later - if (rach_ConfigDedicated->ra_PRACH_MaskIndex != 0) { - prach_resources->ra_PreambleIndex = rach_ConfigDedicated->ra_PreambleIndex; - prach_resources->ra_RACH_MaskIndex = rach_ConfigDedicated->ra_PRACH_MaskIndex; - return; - } - } - - /* TODO: gcc warns if this variable is not always set, let's put -1 for no more warning */ - messageSizeGroupA = -1; - - if (!rach_ConfigCommon->preambleInfo.preamblesGroupAConfig) { - noGroupB = 1; - } else { - sizeOfRA_PreamblesGroupA = (rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA+1)<<2; - switch (rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->messageSizeGroupA) { - case 0: - messageSizeGroupA = 56; - break; - case 1: - messageSizeGroupA = 144; - break; - case 2: - messageSizeGroupA = 208; - break; - case 3: - messageSizeGroupA = 256; - break; + if (rach_ConfigDedicated) { // This is for network controlled Mobility, later + if (rach_ConfigDedicated->ra_PRACH_MaskIndex != 0) { + prach_resources->ra_PreambleIndex = + rach_ConfigDedicated->ra_PreambleIndex; + prach_resources->ra_RACH_MaskIndex = + rach_ConfigDedicated->ra_PRACH_MaskIndex; + return; + } } - /* TODO: what value to use as default? */ - messagePowerOffsetGroupB = -9999; - switch (rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->messagePowerOffsetGroupB) { - case 0: - messagePowerOffsetGroupB = -9999; - break; - case 1: - messagePowerOffsetGroupB = 0; - break; - case 2: - messagePowerOffsetGroupB = 5; - break; - case 3: - messagePowerOffsetGroupB = 8; - break; - case 4: - messagePowerOffsetGroupB = 10; - break; - case 5: - messagePowerOffsetGroupB = 12; - break; - case 6: - messagePowerOffsetGroupB = 15; - break; - case 7: - messagePowerOffsetGroupB = 18; - break; - } + /* TODO: gcc warns if this variable is not always set, let's put -1 for no more warning */ + messageSizeGroupA = -1; - PLThreshold = 0 - get_DELTA_PREAMBLE(module_idP,CC_id) - get_Po_NOMINAL_PUSCH(module_idP,CC_id) - messagePowerOffsetGroupB; - // Note Pcmax is set to 0 here, we have to fix this - - if (sizeOfRA_PreamblesGroupA == numberOfRA_Preambles) { - noGroupB = 1; - } - } - - if (first_Msg3 == 1) { - if (noGroupB == 1) { - // use Group A procedure - UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = (taus())%numberOfRA_Preambles; - UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; - UE_mac_inst[module_idP].RA_usedGroupA = 1; - } else if ((Msg3_size get_PL(module_idP,0,eNB_index) > PLThreshold)) { - // use Group A procedure - UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = (taus())%sizeOfRA_PreamblesGroupA; - UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; - UE_mac_inst[module_idP].RA_usedGroupA = 1; - } else { // use Group B - UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = sizeOfRA_PreamblesGroupA + - (taus())%(numberOfRA_Preambles - sizeOfRA_PreamblesGroupA); - UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; - UE_mac_inst[module_idP].RA_usedGroupA = 0; - } - - UE_mac_inst[module_idP].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER = get_Po_NOMINAL_PUSCH(module_idP,CC_id); - } else { // Msg3 is being retransmitted - if (UE_mac_inst[module_idP].RA_usedGroupA == 1) { - if (rach_ConfigCommon->preambleInfo.preamblesGroupAConfig) { - UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = (taus())%rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA; - } else { - UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = (taus())&0x3f; - } - - UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; + if (!rach_ConfigCommon->preambleInfo.preamblesGroupAConfig) { + noGroupB = 1; } else { - // FIXME rach_ConfigCommon->preambleInfo.preamblesGroupAConfig may be zero - UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = - rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA + - (taus())%(rach_ConfigCommon->preambleInfo.numberOfRA_Preambles - - rach_ConfigCommon->preambleInfo.preamblesGroupAConfig->sizeOfRA_PreamblesGroupA); - UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0; - } - } + sizeOfRA_PreamblesGroupA = + (rach_ConfigCommon->preambleInfo. + preamblesGroupAConfig->sizeOfRA_PreamblesGroupA + 1) << 2; + switch (rach_ConfigCommon->preambleInfo. + preamblesGroupAConfig->messageSizeGroupA) { + case 0: + messageSizeGroupA = 56; + break; + case 1: + messageSizeGroupA = 144; + break; + case 2: + messageSizeGroupA = 208; + break; + case 3: + messageSizeGroupA = 256; + break; + } - // choose random PRACH resource in TDD - if (UE_mac_inst[module_idP].tdd_Config) { - num_prach = mac_xface->get_num_prach_tdd(mac_xface->lte_frame_parms); + /* TODO: what value to use as default? */ + messagePowerOffsetGroupB = -9999; + switch (rach_ConfigCommon->preambleInfo. + preamblesGroupAConfig->messagePowerOffsetGroupB) { + case 0: + messagePowerOffsetGroupB = -9999; + break; + case 1: + messagePowerOffsetGroupB = 0; + break; + case 2: + messagePowerOffsetGroupB = 5; + break; + case 3: + messagePowerOffsetGroupB = 8; + break; + case 4: + messagePowerOffsetGroupB = 10; + break; + case 5: + messagePowerOffsetGroupB = 12; + break; + case 6: + messagePowerOffsetGroupB = 15; + break; + case 7: + messagePowerOffsetGroupB = 18; + break; + } - if ((num_prach>0) && (num_prach<6)) { - UE_mac_inst[module_idP].RA_prach_resources.ra_TDD_map_index = (taus()%num_prach); + PLThreshold = + 0 - get_DELTA_PREAMBLE(module_idP, + CC_id) - + get_Po_NOMINAL_PUSCH(module_idP, + CC_id) - messagePowerOffsetGroupB; + // Note Pcmax is set to 0 here, we have to fix this + + if (sizeOfRA_PreamblesGroupA == numberOfRA_Preambles) { + noGroupB = 1; + } } - f_id = mac_xface->get_fid_prach_tdd(mac_xface->lte_frame_parms, - UE_mac_inst[module_idP].RA_prach_resources.ra_TDD_map_index); - } + if (first_Msg3 == 1) { + if (noGroupB == 1) { + // use Group A procedure + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = + (taus()) % numberOfRA_Preambles; + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = + 0; + UE_mac_inst[module_idP].RA_usedGroupA = 1; + } else if ((Msg3_size < messageSizeGroupA) || + (get_PL(module_idP, 0, eNB_index) > PLThreshold)) { + // use Group A procedure + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = + (taus()) % sizeOfRA_PreamblesGroupA; + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = + 0; + UE_mac_inst[module_idP].RA_usedGroupA = 1; + } else { // use Group B + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = + sizeOfRA_PreamblesGroupA + + (taus()) % (numberOfRA_Preambles - + sizeOfRA_PreamblesGroupA); + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = + 0; + UE_mac_inst[module_idP].RA_usedGroupA = 0; + } - // choose RA-RNTI - UE_mac_inst[module_idP].RA_prach_resources.ra_RNTI = 1 + t_id + 10*f_id; + UE_mac_inst[module_idP]. + RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER = + get_Po_NOMINAL_PUSCH(module_idP, CC_id); + } else { // Msg3 is being retransmitted + if (UE_mac_inst[module_idP].RA_usedGroupA == 1) { + if (rach_ConfigCommon->preambleInfo.preamblesGroupAConfig) { + UE_mac_inst[module_idP].RA_prach_resources. + ra_PreambleIndex = + (taus()) % + rach_ConfigCommon->preambleInfo. + preamblesGroupAConfig->sizeOfRA_PreamblesGroupA; + } else { + UE_mac_inst[module_idP].RA_prach_resources. + ra_PreambleIndex = (taus()) & 0x3f; + } + + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = + 0; + } else { + // FIXME rach_ConfigCommon->preambleInfo.preamblesGroupAConfig may be zero + UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex = + rach_ConfigCommon->preambleInfo. + preamblesGroupAConfig->sizeOfRA_PreamblesGroupA + + (taus()) % + (rach_ConfigCommon->preambleInfo.numberOfRA_Preambles - + rach_ConfigCommon->preambleInfo. + preamblesGroupAConfig->sizeOfRA_PreamblesGroupA); + UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = + 0; + } + } + + // choose random PRACH resource in TDD + if (UE_mac_inst[module_idP].tdd_Config) { + num_prach = get_num_prach_tdd(module_idP); + + if ((num_prach > 0) && (num_prach < 6)) { + UE_mac_inst[module_idP].RA_prach_resources.ra_TDD_map_index = + (taus() % num_prach); + } + + f_id = get_fid_prach_tdd(module_idP, + UE_mac_inst + [module_idP].RA_prach_resources. + ra_TDD_map_index); + } + // choose RA-RNTI + UE_mac_inst[module_idP].RA_prach_resources.ra_RNTI = + 1 + t_id + 10 * f_id; } -void Msg1_tx(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id) +void +Msg1_transmitted(module_id_t module_idP, uint8_t CC_id, + frame_t frameP, uint8_t eNB_id) { - if (CC_id>0) { - LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return; - } + AssertFatal(CC_id == 0, + "Transmission on secondary CCs is not supported yet\n"); + // start contention resolution timer + UE_mac_inst[module_idP].RA_attempt_number++; - // start contention resolution timer - UE_mac_inst[module_idP].RA_attempt_number++; - - if (opt_enabled) { - trace_pdu(0, NULL, 0, module_idP, 2, UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex, - UE_mac_inst[module_idP].subframe, 0, UE_mac_inst[module_idP].RA_attempt_number); - LOG_D(OPT,"[UE %d][RAPROC] TX MSG1 Frame %d trace pdu for rnti %x with size %d\n", - module_idP, frameP, 1, UE_mac_inst[module_idP].RA_Msg3_size); - } + if (opt_enabled) { + trace_pdu(0, NULL, 0, module_idP, 0, + UE_mac_inst[module_idP].RA_prach_resources. + ra_PreambleIndex, UE_mac_inst[module_idP].txFrame, + UE_mac_inst[module_idP].txSubframe, 0, + UE_mac_inst[module_idP].RA_attempt_number); + LOG_D(OPT, + "[UE %d][RAPROC] TX MSG1 Frame %d trace pdu for rnti %x with size %d\n", + module_idP, frameP, 1, UE_mac_inst[module_idP].RA_Msg3_size); + } } -void Msg3_tx(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id) +void +Msg3_transmitted(module_id_t module_idP, uint8_t CC_id, + frame_t frameP, uint8_t eNB_id) { - if (CC_id>0) { - LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return; - } + AssertFatal(CC_id == 0, + "Transmission on secondary CCs is not supported yet\n"); - // start contention resolution timer - LOG_D(MAC,"[UE %d][RAPROC] Frame %d : Msg3_tx: Setting contention resolution timer\n",module_idP,frameP); - UE_mac_inst[module_idP].RA_contention_resolution_cnt = 0; - UE_mac_inst[module_idP].RA_contention_resolution_timer_active = 1; + // start contention resolution timer + LOG_D(MAC, + "[UE %d][RAPROC] Frame %d : Msg3_tx: Setting contention resolution timer\n", + module_idP, frameP); + UE_mac_inst[module_idP].RA_contention_resolution_cnt = 0; + UE_mac_inst[module_idP].RA_contention_resolution_timer_active = 1; - if (opt_enabled) { // msg3 - trace_pdu(0, &UE_mac_inst[module_idP].CCCH_pdu.payload[0], UE_mac_inst[module_idP].RA_Msg3_size, - module_idP, 3, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].subframe, 0, 0); - LOG_D(OPT,"[UE %d][RAPROC] MSG3 Frame %d trace pdu Preamble %d with size %d\n", - module_idP, frameP, UE_mac_inst[module_idP].crnti /*UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex*/, UE_mac_inst[module_idP].RA_Msg3_size); - } + if (opt_enabled) { // msg3 + trace_pdu(0, &UE_mac_inst[module_idP].CCCH_pdu.payload[0], + UE_mac_inst[module_idP].RA_Msg3_size, module_idP, 3, + UE_mac_inst[module_idP].crnti, + UE_mac_inst[module_idP].txFrame, + UE_mac_inst[module_idP].txSubframe, 0, 0); + LOG_D(OPT, + "[UE %d][RAPROC] MSG3 Frame %d trace pdu Preamble %d with size %d\n", + module_idP, frameP, UE_mac_inst[module_idP].crnti + /*UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex */ + , UE_mac_inst[module_idP].RA_Msg3_size); + } } -PRACH_RESOURCES_t *ue_get_rach(module_id_t module_idP,int CC_id,frame_t frameP, uint8_t eNB_indexP,sub_frame_t subframeP) +PRACH_RESOURCES_t *ue_get_rach(module_id_t module_idP, int CC_id, + frame_t frameP, uint8_t eNB_indexP, + sub_frame_t subframeP) { - uint8_t Size=0; - UE_MODE_t UE_mode = mac_xface->get_ue_mode(module_idP,0,eNB_indexP); - uint8_t lcid = CCCH; - uint16_t Size16; - struct RACH_ConfigCommon *rach_ConfigCommon = (struct RACH_ConfigCommon *)NULL; - int32_t frame_diff=0; - mac_rlc_status_resp_t rlc_status; - uint8_t dcch_header_len=0; - uint16_t sdu_lengths[8]; - uint8_t ulsch_buff[MAX_ULSCH_PAYLOAD_BYTES]; + uint8_t Size = 0; + UE_MODE_t UE_mode = get_ue_mode(module_idP, 0, eNB_indexP); + uint8_t lcid = CCCH; + uint16_t Size16; + struct RACH_ConfigCommon *rach_ConfigCommon = + (struct RACH_ConfigCommon *) NULL; + int32_t frame_diff = 0; + mac_rlc_status_resp_t rlc_status; + uint8_t dcch_header_len = 0; + uint16_t sdu_lengths[8]; + uint8_t ulsch_buff[MAX_ULSCH_PAYLOAD_BYTES]; - if (CC_id>0) { - LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return 0; // not reached - } + AssertFatal(CC_id == 0, + "Transmission on secondary CCs is not supported yet\n"); - if (UE_mode == PRACH) { - if (UE_mac_inst[module_idP].radioResourceConfigCommon) { - rach_ConfigCommon = &UE_mac_inst[module_idP].radioResourceConfigCommon->rach_ConfigCommon; - } else { - return(NULL); + if (UE_mode == PRACH) { + if (UE_mac_inst[module_idP].radioResourceConfigCommon) { + rach_ConfigCommon = + &UE_mac_inst[module_idP]. + radioResourceConfigCommon->rach_ConfigCommon; + } else { + return (NULL); + } + + if (UE_mac_inst[module_idP].RA_active == 0) { + LOG_I(MAC, "RA not active\n"); + // check if RRC is ready to initiate the RA procedure + Size = mac_rrc_data_req_ue(module_idP, + CC_id, + frameP, + CCCH, 1, + &UE_mac_inst[module_idP]. + CCCH_pdu.payload[sizeof + (SCH_SUBHEADER_SHORT) + + 1], eNB_indexP, + 0); + Size16 = (uint16_t) Size; + + // LOG_D(MAC,"[UE %d] Frame %d: Requested RRCConnectionRequest, got %d bytes\n",module_idP,frameP,Size); + LOG_I(RRC, + "[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- MAC_DATA_REQ (RRCConnectionRequest eNB %d) --->][MAC_UE][MOD %02d][]\n", + frameP, module_idP, eNB_indexP, module_idP); + LOG_I(MAC, + "[UE %d] Frame %d: Requested RRCConnectionRequest, got %d bytes\n", + module_idP, frameP, Size); + + if (Size > 0) { + + UE_mac_inst[module_idP].RA_active = 1; + UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER = + 1; + UE_mac_inst[module_idP].RA_Msg3_size = + Size + sizeof(SCH_SUBHEADER_SHORT) + + sizeof(SCH_SUBHEADER_SHORT); + UE_mac_inst[module_idP].RA_prachMaskIndex = 0; + UE_mac_inst[module_idP].RA_prach_resources.Msg3 = + UE_mac_inst[module_idP].CCCH_pdu.payload; + UE_mac_inst[module_idP].RA_backoff_cnt = 0; // add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator) + + AssertFatal(rach_ConfigCommon != NULL, + "[UE %d] FATAL Frame %d: rach_ConfigCommon is NULL !!!\n", + module_idP, frameP); + UE_mac_inst[module_idP].RA_window_cnt = + 2 + + rach_ConfigCommon->ra_SupervisionInfo. + ra_ResponseWindowSize; + + if (UE_mac_inst[module_idP].RA_window_cnt == 9) { + UE_mac_inst[module_idP].RA_window_cnt = 10; // Note: 9 subframe window doesn't exist, after 8 is 10! + } + + UE_mac_inst[module_idP].RA_tx_frame = frameP; + UE_mac_inst[module_idP].RA_tx_subframe = subframeP; + UE_mac_inst[module_idP].RA_backoff_frame = frameP; + UE_mac_inst[module_idP].RA_backoff_subframe = subframeP; + // Fill in preamble and PRACH resource + get_prach_resources(module_idP, CC_id, eNB_indexP, + subframeP, 1, NULL); + + generate_ulsch_header((uint8_t *) & UE_mac_inst[module_idP].CCCH_pdu.payload[0], // mac header + 1, // num sdus + 0, // short pading + &Size16, // sdu length + &lcid, // sdu lcid + NULL, // power headroom + NULL, // crnti + NULL, // truncated bsr + NULL, // short bsr + NULL, // long_bsr + 1); //post_padding + return (&UE_mac_inst[module_idP].RA_prach_resources); + + } else if (UE_mac_inst[module_idP]. + scheduling_info.BSR_bytes[UE_mac_inst[module_idP]. + scheduling_info.LCGID + [DCCH]] > 0) { + // This is for triggering a transmission on DCCH using PRACH (during handover, or sending SR for example) + dcch_header_len = 2 + 2; /// SHORT Subheader + C-RNTI control element + rlc_status = + mac_rlc_status_ind(module_idP, + UE_mac_inst[module_idP].crnti, + eNB_indexP, frameP, subframeP, + ENB_FLAG_NO, MBMS_FLAG_NO, DCCH, 6); + + if (UE_mac_inst[module_idP].crnti_before_ho) + LOG_D(MAC, + "[UE %d] Frame %d : UL-DCCH -> ULSCH, HO RRCConnectionReconfigurationComplete (%x, %x), RRC message has %d bytes to send throug PRACH (mac header len %d)\n", + module_idP, frameP, + UE_mac_inst[module_idP].crnti, + UE_mac_inst[module_idP].crnti_before_ho, + rlc_status.bytes_in_buffer, dcch_header_len); + else + LOG_D(MAC, + "[UE %d] Frame %d : UL-DCCH -> ULSCH, RRC message has %d bytes to send through PRACH(mac header len %d)\n", + module_idP, frameP, rlc_status.bytes_in_buffer, + dcch_header_len); + + sdu_lengths[0] = mac_rlc_data_req(module_idP, UE_mac_inst[module_idP].crnti, eNB_indexP, frameP, ENB_FLAG_NO, MBMS_FLAG_NO, DCCH, 6, //not used + (char *) &ulsch_buff[0]); + + LOG_D(MAC, "[UE %d] TX Got %d bytes for DCCH\n", + module_idP, sdu_lengths[0]); + update_bsr(module_idP, frameP, subframeP, eNB_indexP); + UE_mac_inst[module_idP]. + scheduling_info.BSR[UE_mac_inst[module_idP]. + scheduling_info.LCGID[DCCH]] = + locate_BsrIndexByBufferSize(BSR_TABLE, BSR_TABLE_SIZE, + UE_mac_inst + [module_idP].scheduling_info.BSR_bytes + [UE_mac_inst + [module_idP].scheduling_info.LCGID + [DCCH]]); + + //TO DO: fill BSR infos in UL TBS + + //header_len +=2; + UE_mac_inst[module_idP].RA_active = 1; + UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER = + 1; + UE_mac_inst[module_idP].RA_Msg3_size = + Size + dcch_header_len; + UE_mac_inst[module_idP].RA_prachMaskIndex = 0; + UE_mac_inst[module_idP].RA_prach_resources.Msg3 = + ulsch_buff; + UE_mac_inst[module_idP].RA_backoff_cnt = 0; // add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator) + + AssertFatal(rach_ConfigCommon != NULL, + "[UE %d] FATAL Frame %d: rach_ConfigCommon is NULL !!!\n", + module_idP, frameP); + UE_mac_inst[module_idP].RA_window_cnt = + 2 + + rach_ConfigCommon->ra_SupervisionInfo. + ra_ResponseWindowSize; + + if (UE_mac_inst[module_idP].RA_window_cnt == 9) { + UE_mac_inst[module_idP].RA_window_cnt = 10; // Note: 9 subframe window doesn't exist, after 8 is 10! + } + + + UE_mac_inst[module_idP].RA_tx_frame = frameP; + UE_mac_inst[module_idP].RA_tx_subframe = subframeP; + UE_mac_inst[module_idP].RA_backoff_frame = frameP; + UE_mac_inst[module_idP].RA_backoff_subframe = subframeP; + // Fill in preamble and PRACH resource + get_prach_resources(module_idP, CC_id, eNB_indexP, + subframeP, 1, NULL); + generate_ulsch_header((uint8_t *) ulsch_buff, // mac header + 1, // num sdus + 0, // short pading + &Size16, // sdu length + &lcid, // sdu lcid + NULL, // power headroom + &UE_mac_inst[module_idP].crnti, // crnti + NULL, // truncated bsr + NULL, // short bsr + NULL, // long_bsr + 0); //post_padding + + return (&UE_mac_inst[module_idP].RA_prach_resources); + } + } else { // RACH is active + LOG_D(MAC, + "[MAC][UE %d][RAPROC] frameP %d, subframe %d: RA Active, window cnt %d (RA_tx_frame %d, RA_tx_subframe %d)\n", + module_idP, frameP, subframeP, + UE_mac_inst[module_idP].RA_window_cnt, + UE_mac_inst[module_idP].RA_tx_frame, + UE_mac_inst[module_idP].RA_tx_subframe); + + // compute backoff parameters + if (UE_mac_inst[module_idP].RA_backoff_cnt > 0) { + frame_diff = + (sframe_t) frameP - + UE_mac_inst[module_idP].RA_backoff_frame; + + if (frame_diff < 0) { + frame_diff = -frame_diff; + } + + UE_mac_inst[module_idP].RA_backoff_cnt -= + ((10 * frame_diff) + + (subframeP - + UE_mac_inst[module_idP].RA_backoff_subframe)); + + UE_mac_inst[module_idP].RA_backoff_frame = frameP; + UE_mac_inst[module_idP].RA_backoff_subframe = subframeP; + } + // compute RA window parameters + if (UE_mac_inst[module_idP].RA_window_cnt > 0) { + frame_diff = + (frame_t) frameP - UE_mac_inst[module_idP].RA_tx_frame; + + if (frame_diff < 0) { + frame_diff = -frame_diff; + } + + UE_mac_inst[module_idP].RA_window_cnt -= + ((10 * frame_diff) + + (subframeP - UE_mac_inst[module_idP].RA_tx_subframe)); + LOG_D(MAC, + "[MAC][UE %d][RAPROC] frameP %d, subframe %d: RA Active, adjusted window cnt %d\n", + module_idP, frameP, subframeP, + UE_mac_inst[module_idP].RA_window_cnt); + } + + if ((UE_mac_inst[module_idP].RA_window_cnt <= 0) && + (UE_mac_inst[module_idP].RA_backoff_cnt <= 0)) { + + UE_mac_inst[module_idP].RA_tx_frame = frameP; + UE_mac_inst[module_idP].RA_tx_subframe = subframeP; + UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER++; + UE_mac_inst[module_idP].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER += (rach_ConfigCommon->powerRampingParameters.powerRampingStep << 1); // 2dB increments in ASN.1 definition + int preambleTransMax = -1; + switch (rach_ConfigCommon->ra_SupervisionInfo. + preambleTransMax) { + case PreambleTransMax_n3: + preambleTransMax = 3; + break; + case PreambleTransMax_n4: + preambleTransMax = 4; + break; + case PreambleTransMax_n5: + preambleTransMax = 5; + break; + case PreambleTransMax_n6: + preambleTransMax = 6; + break; + case PreambleTransMax_n7: + preambleTransMax = 7; + break; + case PreambleTransMax_n8: + preambleTransMax = 8; + break; + case PreambleTransMax_n10: + preambleTransMax = 10; + break; + case PreambleTransMax_n20: + preambleTransMax = 20; + break; + case PreambleTransMax_n50: + preambleTransMax = 50; + break; + case PreambleTransMax_n100: + preambleTransMax = 100; + break; + case PreambleTransMax_n200: + preambleTransMax = 200; + break; + } + + if (UE_mac_inst[module_idP]. + RA_PREAMBLE_TRANSMISSION_COUNTER == preambleTransMax) { + LOG_D(MAC, + "[UE %d] Frame %d: Maximum number of RACH attempts (%d)\n", + module_idP, frameP, preambleTransMax); + // send message to RRC + UE_mac_inst[module_idP]. + RA_PREAMBLE_TRANSMISSION_COUNTER = 1; + UE_mac_inst[module_idP]. + RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER + = get_Po_NOMINAL_PUSCH(module_idP, CC_id); + } + + UE_mac_inst[module_idP].RA_window_cnt = + 2 + + rach_ConfigCommon->ra_SupervisionInfo. + ra_ResponseWindowSize; + UE_mac_inst[module_idP].RA_backoff_cnt = 0; + + // Fill in preamble and PRACH resource + get_prach_resources(module_idP, CC_id, eNB_indexP, + subframeP, 0, NULL); + return (&UE_mac_inst[module_idP].RA_prach_resources); + } + } + } else if (UE_mode == PUSCH) { + LOG_D(MAC, + "[UE %d] FATAL: Should not have checked for RACH in PUSCH yet ...", + module_idP); + AssertFatal(1 == 0, ""); } - if (Is_rrc_registered == 1) { - - if (UE_mac_inst[module_idP].RA_active == 0) { - LOG_D(MAC,"RA not active\n"); - // check if RRC is ready to initiate the RA procedure - Size = mac_rrc_data_req(module_idP, - CC_id, - frameP, - CCCH,1, - &UE_mac_inst[module_idP].CCCH_pdu.payload[sizeof(SCH_SUBHEADER_SHORT)+1],0, - eNB_indexP, - 0); - Size16 = (uint16_t)Size; - - // LOG_D(MAC,"[UE %d] Frame %d: Requested RRCConnectionRequest, got %d bytes\n",module_idP,frameP,Size); - LOG_D(RRC, "[MSC_MSG][FRAME %05d][RRC_UE][MOD %02d][][--- MAC_DATA_REQ (RRCConnectionRequest eNB %d) --->][MAC_UE][MOD %02d][]\n", - frameP, module_idP, eNB_indexP, module_idP); - LOG_D(MAC,"[UE %d] Frame %d: Requested RRCConnectionRequest, got %d bytes\n",module_idP,frameP,Size); - - if (Size>0) { - - UE_mac_inst[module_idP].RA_active = 1; - UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER = 1; - UE_mac_inst[module_idP].RA_Msg3_size = Size+sizeof(SCH_SUBHEADER_SHORT)+sizeof(SCH_SUBHEADER_SHORT); - UE_mac_inst[module_idP].RA_prachMaskIndex = 0; - UE_mac_inst[module_idP].RA_prach_resources.Msg3 = UE_mac_inst[module_idP].CCCH_pdu.payload; - UE_mac_inst[module_idP].RA_backoff_cnt = 0; // add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator) - - if (rach_ConfigCommon) { - UE_mac_inst[module_idP].RA_window_cnt = 2+ rach_ConfigCommon->ra_SupervisionInfo.ra_ResponseWindowSize; - - if (UE_mac_inst[module_idP].RA_window_cnt == 9) { - UE_mac_inst[module_idP].RA_window_cnt = 10; // Note: 9 subframe window doesn't exist, after 8 is 10! - } - } else { - LOG_D(MAC,"[UE %d] FATAL Frame %d: rach_ConfigCommon is NULL !!!\n",module_idP,frameP); - mac_xface->macphy_exit("MAC rach_ConfigCommon is NULL"); - } - - UE_mac_inst[module_idP].RA_tx_frame = frameP; - UE_mac_inst[module_idP].RA_tx_subframe = subframeP; - UE_mac_inst[module_idP].RA_backoff_frame = frameP; - UE_mac_inst[module_idP].RA_backoff_subframe = subframeP; - // Fill in preamble and PRACH resource - get_prach_resources(module_idP,CC_id,eNB_indexP,subframeP,1,NULL); - - generate_ulsch_header((uint8_t*)&UE_mac_inst[module_idP].CCCH_pdu.payload[0], // mac header - 1, // num sdus - 0, // short pading - &Size16, // sdu length - &lcid, // sdu lcid - NULL, // power headroom - NULL, // crnti - NULL, // truncated bsr - NULL, // short bsr - NULL, // long_bsr - 1); //post_padding - return(&UE_mac_inst[module_idP].RA_prach_resources); - - } else if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DCCH] > 0) { - // This is for triggering a transmission on DCCH using PRACH (during handover, or sending SR for example) - dcch_header_len = 2 + 2; /// SHORT Subheader + C-RNTI control element - rlc_status = mac_rlc_status_ind(module_idP,UE_mac_inst[module_idP].crnti, eNB_indexP,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, - DCCH, - 6); - - if (UE_mac_inst[module_idP].crnti_before_ho) - LOG_D(MAC, - "[UE %d] Frame %d : UL-DCCH -> ULSCH, HO RRCConnectionReconfigurationComplete (%x, %x), RRC message has %d bytes to send throug PRACH (mac header len %d)\n", - module_idP,frameP, UE_mac_inst[module_idP].crnti,UE_mac_inst[module_idP].crnti_before_ho, rlc_status.bytes_in_buffer,dcch_header_len); - else - LOG_D(MAC,"[UE %d] Frame %d : UL-DCCH -> ULSCH, RRC message has %d bytes to send through PRACH(mac header len %d)\n", - module_idP,frameP, rlc_status.bytes_in_buffer,dcch_header_len); - - sdu_lengths[0] = mac_rlc_data_req(module_idP, UE_mac_inst[module_idP].crnti, - eNB_indexP, frameP,ENB_FLAG_NO, MBMS_FLAG_NO, - DCCH, - (char *)&ulsch_buff[0]); - - LOG_D(MAC,"[UE %d] TX Got %d bytes for DCCH\n",module_idP,sdu_lengths[0]); - update_bsr(module_idP, frameP, eNB_indexP,DCCH,UE_mac_inst[module_idP].scheduling_info.LCGID[DCCH]); - //header_len +=2; - UE_mac_inst[module_idP].RA_active = 1; - UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER = 1; - UE_mac_inst[module_idP].RA_Msg3_size = Size+dcch_header_len; - UE_mac_inst[module_idP].RA_prachMaskIndex = 0; - UE_mac_inst[module_idP].RA_prach_resources.Msg3 = ulsch_buff; - UE_mac_inst[module_idP].RA_backoff_cnt = 0; // add the backoff condition here if we have it from a previous RA reponse which failed (i.e. backoff indicator) - - if (rach_ConfigCommon) { - UE_mac_inst[module_idP].RA_window_cnt = 2+ rach_ConfigCommon->ra_SupervisionInfo.ra_ResponseWindowSize; - - if (UE_mac_inst[module_idP].RA_window_cnt == 9) { - UE_mac_inst[module_idP].RA_window_cnt = 10; // Note: 9 subframe window doesn't exist, after 8 is 10! - } - } else { - LOG_D(MAC,"[UE %d] FATAL Frame %d: rach_ConfigCommon is NULL !!!\n",module_idP,frameP); - mac_xface->macphy_exit("MAC rach_ConfigCommon is NULL"); - } - - UE_mac_inst[module_idP].RA_tx_frame = frameP; - UE_mac_inst[module_idP].RA_tx_subframe = subframeP; - UE_mac_inst[module_idP].RA_backoff_frame = frameP; - UE_mac_inst[module_idP].RA_backoff_subframe = subframeP; - // Fill in preamble and PRACH resource - get_prach_resources(module_idP,CC_id,eNB_indexP,subframeP,1,NULL); - generate_ulsch_header((uint8_t*)ulsch_buff, // mac header - 1, // num sdus - 0, // short pading - &Size16, // sdu length - &lcid, // sdu lcid - NULL, // power headroom - &UE_mac_inst[module_idP].crnti, // crnti - NULL, // truncated bsr - NULL, // short bsr - NULL, // long_bsr - 0); //post_padding - - return(&UE_mac_inst[module_idP].RA_prach_resources); - } - } else { // RACH is active - LOG_D(MAC,"[MAC][UE %d][RAPROC] frameP %d, subframe %d: RA Active, window cnt %d (RA_tx_frame %d, RA_tx_subframe %d)\n",module_idP, - frameP,subframeP,UE_mac_inst[module_idP].RA_window_cnt, - UE_mac_inst[module_idP].RA_tx_frame,UE_mac_inst[module_idP].RA_tx_subframe); - - // compute backoff parameters - if (UE_mac_inst[module_idP].RA_backoff_cnt>0) { - frame_diff = (sframe_t)frameP - UE_mac_inst[module_idP].RA_backoff_frame; - - if (frame_diff < 0) { - frame_diff = -frame_diff; - } - - UE_mac_inst[module_idP].RA_backoff_cnt -= ((10*frame_diff) + (subframeP-UE_mac_inst[module_idP].RA_backoff_subframe)); - - UE_mac_inst[module_idP].RA_backoff_frame = frameP; - UE_mac_inst[module_idP].RA_backoff_subframe = subframeP; - } - - // compute RA window parameters - if (UE_mac_inst[module_idP].RA_window_cnt>0) { - frame_diff = (frame_t)frameP - UE_mac_inst[module_idP].RA_tx_frame; - - if (frame_diff < 0) { - frame_diff = -frame_diff; - } - - UE_mac_inst[module_idP].RA_window_cnt -= ((10*frame_diff) + (subframeP-UE_mac_inst[module_idP].RA_tx_subframe)); - LOG_D(MAC,"[MAC][UE %d][RAPROC] frameP %d, subframe %d: RA Active, adjusted window cnt %d\n",module_idP, - frameP,subframeP,UE_mac_inst[module_idP].RA_window_cnt); - } - - if ((UE_mac_inst[module_idP].RA_window_cnt<=0) && - (UE_mac_inst[module_idP].RA_backoff_cnt<=0)) { - - UE_mac_inst[module_idP].RA_tx_frame = frameP; - UE_mac_inst[module_idP].RA_tx_subframe = subframeP; - UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER++; - UE_mac_inst[module_idP].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER += - (rach_ConfigCommon->powerRampingParameters.powerRampingStep<<1); // 2dB increments in ASN.1 definition - int preambleTransMax = -1; - switch (rach_ConfigCommon->ra_SupervisionInfo.preambleTransMax) { - case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3: - preambleTransMax = 3; - break; - case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4: - preambleTransMax = 4; - break; - case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5: - preambleTransMax = 5; - break; - case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6: - preambleTransMax = 6; - break; - case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7: - preambleTransMax = 7; - break; - case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8: - preambleTransMax = 8; - break; - case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10: - preambleTransMax = 10; - break; - case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20: - preambleTransMax = 20; - break; - case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50: - preambleTransMax = 50; - break; - case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100: - preambleTransMax = 100; - break; - case RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200: - preambleTransMax = 200; - break; - } - - if (UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER == preambleTransMax) { - LOG_D(MAC,"[UE %d] Frame %d: Maximum number of RACH attempts (%d)\n",module_idP,frameP,preambleTransMax); - // send message to RRC - UE_mac_inst[module_idP].RA_PREAMBLE_TRANSMISSION_COUNTER=1; - UE_mac_inst[module_idP].RA_prach_resources.ra_PREAMBLE_RECEIVED_TARGET_POWER = get_Po_NOMINAL_PUSCH(module_idP,CC_id); - } - - UE_mac_inst[module_idP].RA_window_cnt = 2+ rach_ConfigCommon->ra_SupervisionInfo.ra_ResponseWindowSize; - UE_mac_inst[module_idP].RA_backoff_cnt = 0; - - // Fill in preamble and PRACH resource - get_prach_resources(module_idP,CC_id,eNB_indexP,subframeP,0,NULL); - return(&UE_mac_inst[module_idP].RA_prach_resources); - } - } - } - } else if (UE_mode == PUSCH) { - LOG_D(MAC,"[UE %d] FATAL: Should not have checked for RACH in PUSCH yet ...",module_idP); - mac_xface->macphy_exit("MAC FATAL: Should not have checked for RACH in PUSCH yet"); - } - - return(NULL); + return (NULL); } diff --git a/openair2/LAYER2/MAC/rar_tools.c b/openair2/LAYER2/MAC/rar_tools.c index be8dc43c97..6261eaf356 100644 --- a/openair2/LAYER2/MAC/rar_tools.c +++ b/openair2/LAYER2/MAC/rar_tools.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rar_tools.c * \brief random access tools @@ -44,146 +36,149 @@ #include "OCG.h" #include "OCG_extern.h" #include "UTIL/OPT/opt.h" +#include "common/ran_context.h" #define DEBUG_RAR -extern unsigned int localRIV2alloc_LUT25[512]; -extern unsigned int distRIV2alloc_LUT25[512]; +extern unsigned int localRIV2alloc_LUT25[512]; +extern unsigned int distRIV2alloc_LUT25[512]; extern unsigned short RIV2nb_rb_LUT25[512]; extern unsigned short RIV2first_rb_LUT25[512]; +extern RAN_CONTEXT_t RC; //------------------------------------------------------------------------------ -unsigned short fill_rar( - const module_id_t module_idP, - const int CC_id, - const frame_t frameP, - uint8_t* const dlsch_buffer, - const uint16_t N_RB_UL, - const uint8_t input_buffer_length -) +unsigned short +fill_rar(const module_id_t module_idP, + const int CC_id, + RA_t * ra, + const frame_t frameP, + uint8_t * const dlsch_buffer, + const uint16_t N_RB_UL, const uint8_t input_buffer_length) //------------------------------------------------------------------------------ { - RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)dlsch_buffer; - // RAR_PDU *rar = (RAR_PDU *)(dlsch_buffer+1); - uint8_t *rar = (uint8_t *)(dlsch_buffer+1); - int i,ra_idx = -1; - uint16_t rballoc; - uint8_t mcs,TPC,ULdelay,cqireq; - AssertFatal(CC_id < MAX_NUM_CCs, "CC_id %u < MAX_NUM_CCs %u", CC_id, MAX_NUM_CCs); + RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *) dlsch_buffer; + uint8_t *rar = (uint8_t *) (dlsch_buffer + 1); - for (i=0; iE = 0; // First and last RAR + rarh->T = 1; // 0 for E/T/R/R/BI subheader, 1 for E/T/RAPID subheader + rarh->RAPID = ra->preamble_index; // Respond to Preamble 0 only for the moment + rar[4] = (uint8_t) (ra->rnti >> 8); + rar[5] = (uint8_t) (ra->rnti & 0xff); + //ra->timing_offset = 0; + ra->timing_offset /= 16; //T_A = N_TA/16, where N_TA should be on a 30.72Msps + rar[0] = (uint8_t) (ra->timing_offset >> (2 + 4)); // 7 MSBs of timing advance + divide by 4 + rar[1] = (uint8_t) (ra->timing_offset << (4 - 2)) & 0xf0; // 4 LSBs of timing advance + divide by 4 + ra->msg3_first_rb = 6; + ra->msg3_nb_rb = 1; + uint16_t rballoc = mac_computeRIV(N_RB_UL, ra->msg3_first_rb, ra->msg3_nb_rb); // first PRB only for UL Grant + rar[1] |= (rballoc >> 7) & 7; // Hopping = 0 (bit 3), 3 MSBs of rballoc + rar[2] = ((uint8_t) (rballoc & 0xff)) << 1; // 7 LSBs of rballoc + ra->msg3_mcs = 10; + ra->msg3_TPC = 3; + ra->msg3_ULdelay = 0; + ra->msg3_cqireq = 0; + rar[2] |= ((ra->msg3_mcs & 0x8) >> 3); // mcs 10 + rar[3] = + (((ra->msg3_mcs & 0x7) << 5)) | ((ra->msg3_TPC & 7) << 2) | + ((ra->msg3_ULdelay & 1) << 1) | (ra->msg3_cqireq & 1); + + if (opt_enabled) { + trace_pdu(1, dlsch_buffer, input_buffer_length, module_idP, 2, 1, + RC.mac[module_idP]->frame, RC.mac[module_idP]->subframe, + 0, 0); + LOG_D(OPT, + "[eNB %d][RAPROC] CC_id %d RAR Frame %d trace pdu for rnti %x and rapid %d size %d\n", + module_idP, CC_id, frameP, ra->rnti, rarh->RAPID, + input_buffer_length); } - } - //DevAssert( ra_idx != -1 ); - if (ra_idx==-1) - return(0); - - // subheader fixed - rarh->E = 0; // First and last RAR - rarh->T = 1; // 0 for E/T/R/R/BI subheader, 1 for E/T/RAPID subheader - rarh->RAPID = eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].preamble_index; // Respond to Preamble 0 only for the moment - /* - rar->R = 0; - rar->Timing_Advance_Command = eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].timing_offset/4; - rar->hopping_flag = 0; - rar->rb_alloc = mac_xface->computeRIV(N_RB_UL,12,2); // 2 RB - rar->mcs = 2; // mcs 2 - rar->TPC = 4; // 2 dB power adjustment - rar->UL_delay = 0; - rar->cqi_req = 1; - rar->t_crnti = eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].rnti; - */ - rar[4] = (uint8_t)(eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].rnti>>8); - rar[5] = (uint8_t)(eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].rnti&0xff); - //eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].timing_offset = 0; - eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].timing_offset /= 16; //T_A = N_TA/16, where N_TA should be on a 30.72Msps - rar[0] = (uint8_t)(eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].timing_offset>>(2+4)); // 7 MSBs of timing advance + divide by 4 - rar[1] = (uint8_t)(eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].timing_offset<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4 - rballoc = mac_xface->computeRIV(N_RB_UL,1,1); // first PRB only for UL Grant - rar[1] |= (rballoc>>7)&7; // Hopping = 0 (bit 3), 3 MSBs of rballoc - rar[2] = ((uint8_t)(rballoc&0xff))<<1; // 7 LSBs of rballoc - mcs = 10; - TPC = 3; - ULdelay = 0; - cqireq = 0; - rar[2] |= ((mcs&0x8)>>3); // mcs 10 - rar[3] = (((mcs&0x7)<<5)) | ((TPC&7)<<2) | ((ULdelay&1)<<1) | (cqireq&1); - - LOG_D(MAC,"[eNB %d][RAPROC] CC_id %d Frame %d Generating RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ra_idx %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n", - module_idP, CC_id, - frameP, - *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5], - ra_idx, - eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].rnti, - rarh->RAPID,eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[0].preamble_index, - eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].timing_offset); - - if (opt_enabled) { - trace_pdu(1, dlsch_buffer, input_buffer_length, module_idP, 2, 1, - eNB_mac_inst[module_idP].subframe, 0, 0); - LOG_D(OPT,"[eNB %d][RAPROC] CC_id %d RAR Frame %d trace pdu for rnti %x and rapid %d size %d\n", - module_idP, CC_id, frameP, eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].rnti, - rarh->RAPID, input_buffer_length); - } - - return(eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[ra_idx].rnti); + return (ra->rnti); } +#ifdef Rel14 //------------------------------------------------------------------------------ -uint16_t -ue_process_rar( - const module_id_t module_idP, - const int CC_id, - const frame_t frameP, - uint8_t* const dlsch_buffer, - rnti_t* const t_crnti, - const uint8_t preamble_index -) +unsigned short +fill_rar_br(eNB_MAC_INST * eNB, + int CC_id, + RA_t * ra, + const frame_t frameP, + const sub_frame_t subframeP, + uint8_t * const dlsch_buffer, const uint8_t ce_level) //------------------------------------------------------------------------------ { - RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)dlsch_buffer; - // RAR_PDU *rar = (RAR_PDU *)(dlsch_buffer+1); - uint8_t *rar = (uint8_t *)(dlsch_buffer+1); + RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *) dlsch_buffer; + COMMON_channels_t *cc = &eNB->common_channels[CC_id]; + uint8_t *rar = (uint8_t *) (dlsch_buffer + 1); + // uint8_t nb,reps; + uint8_t rballoc; + uint8_t mcs, TPC, ULdelay, cqireq; + int input_buffer_length; - if (CC_id>0) { - LOG_W(MAC,"Should not have received RAR on secondary CCs! \n"); - return(0xffff); - } - LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n",module_idP,frameP, - *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5], - rarh->RAPID,preamble_index); -#ifdef DEBUG_RAR - LOG_D(MAC,"[UE %d][RAPROC] rarh->E %d\n",module_idP,rarh->E); - LOG_D(MAC,"[UE %d][RAPROC] rarh->T %d\n",module_idP,rarh->T); - LOG_D(MAC,"[UE %d][RAPROC] rarh->RAPID %d\n",module_idP,rarh->RAPID); + AssertFatal(ra != NULL, "RA is null \n"); - // LOG_I(MAC,"[UE %d][RAPROC] rar->R %d\n",module_idP,rar->R); - LOG_D(MAC,"[UE %d][RAPROC] rar->Timing_Advance_Command %d\n",module_idP,(((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); - // LOG_I(MAC,"[UE %d][RAPROC] rar->hopping_flag %d\n",module_idP,rar->hopping_flag); - // LOG_I(MAC,"[UE %d][RAPROC] rar->rb_alloc %d\n",module_idP,rar->rb_alloc); - // LOG_I(MAC,"[UE %d][RAPROC] rar->mcs %d\n",module_idP,rar->mcs); - // LOG_I(MAC,"[UE %d][RAPROC] rar->TPC %d\n",module_idP,rar->TPC); - // LOG_I(MAC,"[UE %d][RAPROC] rar->UL_delay %d\n",module_idP,rar->UL_delay); - // LOG_I(MAC,"[UE %d][RAPROC] rar->cqi_req %d\n",module_idP,rar->cqi_req); - LOG_D(MAC,"[UE %d][RAPROC] rar->t_crnti %x\n",module_idP,(uint16_t)rar[5]+(rar[4]<<8)); + // subheader fixed + rarh->E = 0; // First and last RAR + rarh->T = 1; // 0 for E/T/R/R/BI subheader, 1 for E/T/RAPID subheader + rarh->RAPID = ra->preamble_index; // Respond to Preamble 0 only for the moment + ra->timing_offset /= 16; //T_A = N_TA/16, where N_TA should be on a 30.72Msps + rar[0] = (uint8_t) (ra->timing_offset >> (2 + 4)); // 7 MSBs of timing advance + divide by 4 + rar[1] = (uint8_t) (ra->timing_offset << (4 - 2)) & 0xf0; // 4 LSBs of timing advance + divide by 4 + + int N_NB_index; + + AssertFatal(1 == 0, "RAR for BL/CE Still to be finished ...\n"); + + // Copy the Msg2 narrowband + ra->msg34_narrowband = ra->msg2_narrowband; + + if (ce_level < 2) { //CE Level 0,1, CEmodeA + input_buffer_length = 6; + + N_NB_index = get_numnarrowbandbits(cc->mib->message.dl_Bandwidth); + + rar[4] = (uint8_t) (ra->rnti >> 8); + rar[5] = (uint8_t) (ra->rnti & 0xff); + //cc->ra[ra_idx].timing_offset = 0; + // nb = 0; + rballoc = mac_computeRIV(6, 1 + ce_level, 1); // one PRB only for UL Grant in position 1+ce_level within Narrowband + rar[1] |= (rballoc & 15) << (4 - N_NB_index); // Hopping = 0 (bit 3), 3 MSBs of rballoc + + // reps = 4; + mcs = 7; + TPC = 3; // no power increase + ULdelay = 0; + cqireq = 0; + rar[2] |= ((mcs & 0x8) >> 3); // mcs 10 + rar[3] = + (((mcs & 0x7) << 5)) | ((TPC & 7) << 2) | ((ULdelay & 1) << 1) + | (cqireq & 1); + } else { // CE level 2,3 => CEModeB + + input_buffer_length = 5; + + rar[3] = (uint8_t) (ra->rnti >> 8); + rar[4] = (uint8_t) (ra->rnti & 0xff); + } + LOG_D(MAC, + "[RAPROC] Frame %d Generating RAR BR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ce_level %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n", + frameP, *(uint8_t *) rarh, rar[0], rar[1], rar[2], rar[3], + rar[4], rar[5], ce_level, ra->rnti, rarh->RAPID, + ra->preamble_index, ra->timing_offset); + + if (opt_enabled) { + trace_pdu(1, dlsch_buffer, input_buffer_length, eNB->Mod_id, 2, 1, + eNB->frame, eNB->subframe, 0, 0); + LOG_D(OPT, + "[RAPROC] RAR Frame %d trace pdu for rnti %x and rapid %d size %d\n", + frameP, ra->rnti, rarh->RAPID, input_buffer_length); + } + + return (ra->rnti); +} #endif - - if (preamble_index == rarh->RAPID) { - *t_crnti = (uint16_t)rar[5]+(rar[4]<<8);//rar->t_crnti; - UE_mac_inst[module_idP].crnti = *t_crnti;//rar->t_crnti; - //return(rar->Timing_Advance_Command); - return((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4)); - } else { - UE_mac_inst[module_idP].crnti=0; - return(0xffff); - } -} diff --git a/openair2/LAYER2/MAC/rar_tools_ue.c b/openair2/LAYER2/MAC/rar_tools_ue.c new file mode 100644 index 0000000000..ab193c7a66 --- /dev/null +++ b/openair2/LAYER2/MAC/rar_tools_ue.c @@ -0,0 +1,143 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file rar_tools.c + * \brief random access tools + * \author Raymond Knopp and navid nikaein + * \date 2011 - 2014 + * \version 1.0 + * @ingroup _mac + + */ + +#include "defs.h" +#include "proto.h" +#include "extern.h" +#include "SIMULATION/TOOLS/defs.h" +#include "UTIL/LOG/log.h" +#include "OCG.h" +#include "OCG_extern.h" +#include "UTIL/OPT/opt.h" +#include "common/ran_context.h" + +#define DEBUG_RAR + +//------------------------------------------------------------------------------ +uint16_t ue_process_rar(const module_id_t module_idP, const int CC_id, const frame_t frameP, const rnti_t ra_rnti, uint8_t * const dlsch_buffer, rnti_t * const t_crnti, const uint8_t preamble_index, uint8_t * selected_rar_buffer // output argument for storing the selected RAR header and RAR payload + ) +//------------------------------------------------------------------------------ +{ + uint16_t ret = 0; // return value + + RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *) dlsch_buffer; + // RAR_PDU *rar = (RAR_PDU *)(dlsch_buffer+1); + uint8_t *rar = (uint8_t *) (dlsch_buffer + 1); + + // get the last RAR payload for working with CMW500 + uint8_t n_rarpy = 0; // number of RAR payloads + uint8_t n_rarh = 0; // number of MAC RAR subheaders + uint8_t best_rx_rapid = -1; // the closest RAPID receive from all RARs + while (1) { + n_rarh++; + if (rarh->T == 1) { + n_rarpy++; + LOG_D(MAC, "RAPID %d\n", rarh->RAPID); + } + + if (rarh->RAPID == preamble_index) { + LOG_D(PHY, "Found RAR with the intended RAPID %d\n", + rarh->RAPID); + rar = (uint8_t *) (dlsch_buffer + n_rarh + (n_rarpy - 1) * 6); + break; + } + + if (abs((int) rarh->RAPID - (int) preamble_index) < + abs((int) best_rx_rapid - (int) preamble_index)) { + best_rx_rapid = rarh->RAPID; + rar = (uint8_t *) (dlsch_buffer + n_rarh + (n_rarpy - 1) * 6); + } + + if (rarh->E == 0) { + LOG_I(PHY, + "No RAR found with the intended RAPID. The closest RAPID in all RARs is %d\n", + best_rx_rapid); + break; + } else { + rarh++; + } + }; + LOG_D(MAC, "number of RAR subheader %d; number of RAR pyloads %d\n", + n_rarh, n_rarpy); + + if (CC_id > 0) { + LOG_W(MAC, "Should not have received RAR on secondary CCs! \n"); + return (0xffff); + } + + LOG_I(MAC, + "[eNB %d][RAPROC] Frame %d Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n", + module_idP, frameP, *(uint8_t *) rarh, rar[0], rar[1], rar[2], + rar[3], rar[4], rar[5], rarh->RAPID, preamble_index); +#ifdef DEBUG_RAR + LOG_D(MAC, "[UE %d][RAPROC] rarh->E %d\n", module_idP, rarh->E); + LOG_D(MAC, "[UE %d][RAPROC] rarh->T %d\n", module_idP, rarh->T); + LOG_D(MAC, "[UE %d][RAPROC] rarh->RAPID %d\n", module_idP, + rarh->RAPID); + + // LOG_I(MAC,"[UE %d][RAPROC] rar->R %d\n",module_idP,rar->R); + LOG_D(MAC, "[UE %d][RAPROC] rar->Timing_Advance_Command %d\n", + module_idP, (((uint16_t) (rar[0] & 0x7f)) << 4) + (rar[1] >> 4)); + // LOG_I(MAC,"[UE %d][RAPROC] rar->hopping_flag %d\n",module_idP,rar->hopping_flag); + // LOG_I(MAC,"[UE %d][RAPROC] rar->rb_alloc %d\n",module_idP,rar->rb_alloc); + // LOG_I(MAC,"[UE %d][RAPROC] rar->mcs %d\n",module_idP,rar->mcs); + // LOG_I(MAC,"[UE %d][RAPROC] rar->TPC %d\n",module_idP,rar->TPC); + // LOG_I(MAC,"[UE %d][RAPROC] rar->UL_delay %d\n",module_idP,rar->UL_delay); + // LOG_I(MAC,"[UE %d][RAPROC] rar->cqi_req %d\n",module_idP,rar->cqi_req); + LOG_D(MAC, "[UE %d][RAPROC] rar->t_crnti %x\n", module_idP, + (uint16_t) rar[5] + (rar[4] << 8)); +#endif + + if (opt_enabled) { + LOG_D(OPT, + "[UE %d][RAPROC] CC_id %d RAR Frame %d trace pdu for ra-RNTI %x\n", + module_idP, CC_id, frameP, ra_rnti); + trace_pdu(1, (uint8_t *) dlsch_buffer, n_rarh + n_rarpy * 6, + module_idP, 2, ra_rnti, UE_mac_inst[module_idP].rxFrame, + UE_mac_inst[module_idP].rxSubframe, 0, 0); + } + + if (preamble_index == rarh->RAPID) { + *t_crnti = (uint16_t) rar[5] + (rar[4] << 8); //rar->t_crnti; + UE_mac_inst[module_idP].crnti = *t_crnti; //rar->t_crnti; + //return(rar->Timing_Advance_Command); + ret = ((((uint16_t) (rar[0] & 0x7f)) << 4) + (rar[1] >> 4)); + } else { + UE_mac_inst[module_idP].crnti = 0; + ret = (0xffff); + } + + // move the selected RAR to the front of the RA_PDSCH buffer + memcpy(selected_rar_buffer + 0, (uint8_t *) rarh, 1); + memcpy(selected_rar_buffer + 1, (uint8_t *) rar, 6); + + return ret; + +} diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index ee6340cb43..5ca6d10bb5 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file ue_procedures.c * \brief procedures related to UE @@ -45,12 +37,11 @@ #include "defs.h" #include "proto.h" #ifdef PHY_EMUL -# include "SIMULATION/PHY_EMULATION/impl_defs.h" +#include "SIMULATION/PHY_EMULATION/impl_defs.h" #else -# include "SCHED/defs.h" -# include "PHY/impl_defs_top.h" +#include "SCHED/defs.h" +#include "PHY/impl_defs_top.h" #endif -#include "PHY_INTERFACE/defs.h" #include "PHY_INTERFACE/extern.h" #include "COMMON/mac_rrc_primitives.h" @@ -63,1416 +54,2089 @@ #include "OCG_extern.h" #ifdef PHY_EMUL -# include "SIMULATION/simulation_defs.h" +#include "SIMULATION/simulation_defs.h" #endif #include "pdcp.h" #if defined(ENABLE_ITTI) -# include "intertask_interface.h" +#include "intertask_interface.h" #endif #include "assertions.h" -#include "SIMULATION/TOOLS/defs.h" // for taus +#include "SIMULATION/TOOLS/defs.h" // for taus #define DEBUG_HEADER_PARSING 1 #define ENABLE_MAC_PAYLOAD_DEBUG 1 -/* -#ifndef USER_MODE -#define msg debug_msg -#endif - */ +extern uint8_t usim_test; + mapping BSR_names[] = { - {"NONE", 0}, - {"SHORT BSR", 1}, - {"TRUNCATED BSR", 2}, - {"LONG BSR", 3}, - {"PADDING BSR", 4}, - {NULL, -1} + {"NONE", 0}, + {"SHORT BSR", 1}, + {"TRUNCATED BSR", 2}, + {"LONG BSR", 3}, + {"PADDING BSR", 4}, + {NULL, -1} }; void ue_init_mac(module_id_t module_idP) { - int i; - // default values as deined in 36.331 sec 9.2.2 - LOG_I(MAC,"[UE%d] Applying default macMainConfig\n",module_idP); - //UE_mac_inst[module_idP].scheduling_info.macConfig=NULL; - UE_mac_inst[module_idP].scheduling_info.retxBSR_Timer= MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560; - UE_mac_inst[module_idP].scheduling_info.periodicBSR_Timer=MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity; - UE_mac_inst[module_idP].scheduling_info.periodicPHR_Timer = MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20; - UE_mac_inst[module_idP].scheduling_info.prohibitPHR_Timer = MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20; - UE_mac_inst[module_idP].scheduling_info.PathlossChange_db = MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; - UE_mac_inst[module_idP].PHR_state = MAC_MainConfig__phr_Config_PR_setup; - UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0; - UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer=0; - UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer_Running=0; - UE_mac_inst[module_idP].scheduling_info.maxHARQ_Tx=MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5; - UE_mac_inst[module_idP].scheduling_info.ttiBundling=0; - UE_mac_inst[module_idP].scheduling_info.drx_config=NULL; - UE_mac_inst[module_idP].scheduling_info.phr_config=NULL; - UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF = get_sf_periodicBSRTimer(UE_mac_inst[module_idP].scheduling_info.periodicBSR_Timer); - UE_mac_inst[module_idP].scheduling_info.retxBSR_SF = get_sf_retxBSRTimer(UE_mac_inst[module_idP].scheduling_info.retxBSR_Timer); - UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[module_idP].scheduling_info.periodicPHR_Timer); - UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[module_idP].scheduling_info.prohibitPHR_Timer); - UE_mac_inst[module_idP].scheduling_info.PathlossChange_db = get_db_dl_PathlossChange(UE_mac_inst[module_idP].scheduling_info.PathlossChange); + int i; + // default values as deined in 36.331 sec 9.2.2 + LOG_I(MAC, "[UE%d] Applying default macMainConfig\n", module_idP); + //UE_mac_inst[module_idP].scheduling_info.macConfig=NULL; + UE_mac_inst[module_idP].scheduling_info.retxBSR_Timer = + RetxBSR_Timer_r12_sf10240; + UE_mac_inst[module_idP].scheduling_info.periodicBSR_Timer = + PeriodicBSR_Timer_r12_infinity; + UE_mac_inst[module_idP].scheduling_info.periodicPHR_Timer = + MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20; + UE_mac_inst[module_idP].scheduling_info.prohibitPHR_Timer = + MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20; + UE_mac_inst[module_idP].scheduling_info.PathlossChange_db = + MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; + UE_mac_inst[module_idP].PHR_state = + MAC_MainConfig__phr_Config_PR_setup; + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER = 0; + UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer = 0; + UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer_Running = 0; + UE_mac_inst[module_idP].scheduling_info.maxHARQ_Tx = + MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5; + UE_mac_inst[module_idP].scheduling_info.ttiBundling = 0; + UE_mac_inst[module_idP].scheduling_info.extendedBSR_Sizes_r10 = 0; + UE_mac_inst[module_idP].scheduling_info.extendedPHR_r10 = 0; + UE_mac_inst[module_idP].scheduling_info.drx_config = NULL; + UE_mac_inst[module_idP].scheduling_info.phr_config = NULL; + // set init value 0xFFFF, make sure periodic timer and retx time counters are NOT active, after bsr transmission set the value configured by the NW. + UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF = + MAC_UE_BSR_TIMER_NOT_RUNNING; + UE_mac_inst[module_idP].scheduling_info.retxBSR_SF = + MAC_UE_BSR_TIMER_NOT_RUNNING; + UE_mac_inst[module_idP].BSR_reporting_active = BSR_TRIGGER_NONE; - for (i=0; i < MAX_NUM_LCID; i++) { - LOG_D(MAC,"[UE%d] Applying default logical channel config for LCGID %d\n",module_idP,i); - UE_mac_inst[module_idP].scheduling_info.Bj[i]=-1; - UE_mac_inst[module_idP].scheduling_info.bucket_size[i]=-1; + UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF = + get_sf_perioidicPHR_Timer(UE_mac_inst[module_idP]. + scheduling_info.periodicPHR_Timer); + UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF = + get_sf_prohibitPHR_Timer(UE_mac_inst[module_idP]. + scheduling_info.prohibitPHR_Timer); + UE_mac_inst[module_idP].scheduling_info.PathlossChange_db = + get_db_dl_PathlossChange(UE_mac_inst[module_idP]. + scheduling_info.PathlossChange); + UE_mac_inst[module_idP].PHR_reporting_active = 0; - if (i < DTCH) { // initilize all control channels lcgid to 0 - UE_mac_inst[module_idP].scheduling_info.LCGID[i]=0; - } else { // initialize all the data channels lcgid to 1 - UE_mac_inst[module_idP].scheduling_info.LCGID[i]=1; + for (i = 0; i < MAX_NUM_LCID; i++) { + LOG_D(MAC, + "[UE%d] Applying default logical channel config for LCGID %d\n", + module_idP, i); + UE_mac_inst[module_idP].scheduling_info.Bj[i] = -1; + UE_mac_inst[module_idP].scheduling_info.bucket_size[i] = -1; + + if (i < DTCH) { // initilize all control channels lcgid to 0 + UE_mac_inst[module_idP].scheduling_info.LCGID[i] = 0; + } else { // initialize all the data channels lcgid to 1 + UE_mac_inst[module_idP].scheduling_info.LCGID[i] = 1; + } + + UE_mac_inst[module_idP].scheduling_info.LCID_status[i] = + LCID_EMPTY; + UE_mac_inst[module_idP].scheduling_info.LCID_buffer_remain[i] = 0; } - UE_mac_inst[module_idP].scheduling_info.LCID_status[i]=0; - } - #ifdef CBA - for (i=0; i E == 0) { - // printf("E=0\n"); - not_done = 0; + if (((SCH_SUBHEADER_FIXED *) mac_header_ptr)->E == 0) { + // printf("E=0\n"); + not_done = 0; + } + + lcid = ((SCH_SUBHEADER_FIXED *) mac_header_ptr)->LCID; + + if (lcid < UE_CONT_RES) { + //printf("[MAC][UE] header %x.%x.%x\n",mac_header_ptr[0],mac_header_ptr[1],mac_header_ptr[2]); + if (not_done == 0) { // last MAC SDU, length is implicit + mac_header_ptr++; + length = + tb_length - (mac_header_ptr - mac_header) - ce_len; + + for (num_sdu_cnt = 0; num_sdu_cnt < num_sdus; + num_sdu_cnt++) { + length -= rx_lengths[num_sdu_cnt]; + } + } else { + if (((SCH_SUBHEADER_LONG *) mac_header_ptr)->F == 1) { + length = + ((((SCH_SUBHEADER_LONG *) mac_header_ptr)-> + L_MSB & 0x7f) + << 8) | (((SCH_SUBHEADER_LONG *) mac_header_ptr)-> + L_LSB & 0xff); + mac_header_ptr += 3; +#ifdef DEBUG_HEADER_PARSING + LOG_D(MAC, "[UE] parse long sdu, size %x \n", length); +#endif + + } else { //if (((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F == 0) { + length = ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->L; + mac_header_ptr += 2; + } + } + +#ifdef DEBUG_HEADER_PARSING + LOG_D(MAC, "[UE] sdu %d lcid %d length %d (offset now %ld)\n", + num_sdus, lcid, length, mac_header_ptr - mac_header); +#endif + rx_lcids[num_sdus] = lcid; + rx_lengths[num_sdus] = length; + num_sdus++; + } else { // This is a control element subheader + if (lcid == SHORT_PADDING) { + num_padding++; + mac_header_ptr++; + } else { + rx_ces[num_ces] = lcid; + num_ces++; + mac_header_ptr++; + + if (lcid == TIMING_ADV_CMD) { + ce_len++; + } else if (lcid == UE_CONT_RES) { + + // FNA: check MAC Header is one of thoses defined in Annex B of 36.321 + // Check there is only 1 Contention Resolution + if (num_cont_res) { + LOG_W(MAC, + "[UE] Msg4 Wrong received format: More than 1 Contention Resolution\n"); + // exit parsing + return NULL; + + } + // UE_CONT_RES shall never be the last subheader unless this is the only MAC subheader + if ((not_done == 0) + && ((num_sdus) || (num_ces > 1) || (num_padding))) { + LOG_W(MAC, + "[UE] Msg4 Wrong received format: Contention Resolution after num_ces=%d num_sdus=%d num_padding=%d\n", + num_ces, num_sdus, num_padding); + // exit parsing + return NULL; + } + num_cont_res++; + ce_len += 6; + } + } + +#ifdef DEBUG_HEADER_PARSING + LOG_D(MAC, "[UE] ce %d lcid %d (offset now %ld)\n", num_ces, + lcid, mac_header_ptr - mac_header); +#endif + } } - lcid = ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID; + *num_ce = num_ces; + *num_sdu = num_sdus; - if (lcid < UE_CONT_RES) { - //printf("[MAC][UE] header %x.%x.%x\n",mac_header_ptr[0],mac_header_ptr[1],mac_header_ptr[2]); - if (not_done==0) {// last MAC SDU, length is implicit - mac_header_ptr++; - length = tb_length-(mac_header_ptr-mac_header)-ce_len; - - for (num_sdu_cnt=0; num_sdu_cnt < num_sdus ; num_sdu_cnt++) { - length -= rx_lengths[num_sdu_cnt]; - } - } else { - if (((SCH_SUBHEADER_LONG *)mac_header_ptr)->F == 1) { - length = ((((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB & 0x7f ) << 8 ) | (((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB & 0xff); - mac_header_ptr += 3; -#ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] parse long sdu, size %x \n",length); -#endif - - } else { //if (((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F == 0) { - length = ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L; - mac_header_ptr += 2; - } - } - -#ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] sdu %d lcid %d length %d (offset now %d)\n", - num_sdus,lcid,length,mac_header_ptr-mac_header); -#endif - rx_lcids[num_sdus] = lcid; - rx_lengths[num_sdus] = length; - num_sdus++; - } else { // This is a control element subheader - if (lcid == SHORT_PADDING) { - mac_header_ptr++; - } else { - rx_ces[num_ces] = lcid; - num_ces++; - mac_header_ptr ++; - - if (lcid==TIMING_ADV_CMD) { - ce_len++; - } else if (lcid==UE_CONT_RES) { - ce_len+=6; - } - } - -#ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] ce %d lcid %d (offset now %d)\n",num_ces,lcid,mac_header_ptr-mac_header); -#endif - } - } - - *num_ce = num_ces; - *num_sdu = num_sdus; - - return(mac_header_ptr); + return (mac_header_ptr); } -uint32_t ue_get_SR(module_id_t module_idP,int CC_id,frame_t frameP,uint8_t eNB_id,uint16_t rnti, sub_frame_t subframe) +uint32_t +ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP, + uint8_t eNB_id, uint16_t rnti, sub_frame_t subframe) { - // no UL-SCH resources available for this tti && UE has a valid PUCCH resources for SR configuration for this tti - // int MGL=6;// measurement gap length in ms - int MGRP = 0; // measurement gap repetition period in ms - int gapOffset = -1; - int T = 0; + // no UL-SCH resources available for this tti && UE has a valid PUCCH resources for SR configuration for this tti + // int MGL=6;// measurement gap length in ms + int MGRP = 0; // measurement gap repetition period in ms + int gapOffset = -1; + int T = 0; - DevCheck(module_idP < (int)NB_UE_INST, module_idP, NB_UE_INST, 0); + DevCheck(module_idP < (int) NB_UE_INST, module_idP, NB_UE_INST, 0); - if (CC_id>0) { - LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return 0; - } + AssertFatal(CC_id == 0, + "Transmission on secondary CCs is not supported yet\n"); - // determin the measurement gap - if (UE_mac_inst[module_idP].measGapConfig !=NULL) { - if (UE_mac_inst[module_idP].measGapConfig->choice.setup.gapOffset.present == MeasGapConfig__setup__gapOffset_PR_gp0) { - MGRP= 40; - gapOffset= UE_mac_inst[module_idP].measGapConfig->choice.setup.gapOffset.choice.gp0; - } else if (UE_mac_inst[module_idP].measGapConfig->choice.setup.gapOffset.present == MeasGapConfig__setup__gapOffset_PR_gp1) { - MGRP= 80; - gapOffset= UE_mac_inst[module_idP].measGapConfig->choice.setup.gapOffset.choice.gp1; + // determin the measurement gap + if (UE_mac_inst[module_idP].measGapConfig != NULL) { + if (UE_mac_inst[module_idP].measGapConfig->choice.setup. + gapOffset.present == MeasGapConfig__setup__gapOffset_PR_gp0) { + MGRP = 40; + gapOffset = + UE_mac_inst[module_idP].measGapConfig->choice. + setup.gapOffset.choice.gp0; + } else if (UE_mac_inst[module_idP].measGapConfig->choice. + setup.gapOffset.present == + MeasGapConfig__setup__gapOffset_PR_gp1) { + MGRP = 80; + gapOffset = + UE_mac_inst[module_idP].measGapConfig->choice. + setup.gapOffset.choice.gp1; + } else { + LOG_W(MAC, "Measurement GAP offset is unknown\n"); + } + + T = MGRP / 10; + DevAssert(T != 0); + + //check the measurement gap and sr prohibit timer + if ((subframe == gapOffset % 10) + && ((frameP % T) == (floor(gapOffset / 10))) + && (UE_mac_inst[module_idP]. + scheduling_info.sr_ProhibitTimer_Running == 0)) { + UE_mac_inst[module_idP].scheduling_info.SR_pending = 1; + return (0); + } + } + + if ((UE_mac_inst[module_idP].physicalConfigDedicated != NULL) && + (UE_mac_inst[module_idP].scheduling_info.SR_pending == 1) && + (UE_mac_inst[module_idP].scheduling_info.SR_COUNTER < + (1 << + (2 + + UE_mac_inst[module_idP]. + physicalConfigDedicated->schedulingRequestConfig->choice.setup. + dsr_TransMax)))) { + LOG_D(MAC, + "[UE %d][SR %x] Frame %d subframe %d PHY asks for SR (SR_COUNTER/dsr_TransMax %d/%d), SR_pending %d\n", + module_idP, rnti, frameP, subframe, + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER, + (1 << + (2 + + UE_mac_inst[module_idP]. + physicalConfigDedicated->schedulingRequestConfig->choice. + setup.dsr_TransMax)), + UE_mac_inst[module_idP].scheduling_info.SR_pending); + + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER++; + + // start the sr-prohibittimer : rel 9 and above + if (UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer > 0) { // timer configured + UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer--; + UE_mac_inst[module_idP].scheduling_info. + sr_ProhibitTimer_Running = 1; + } else { + UE_mac_inst[module_idP].scheduling_info. + sr_ProhibitTimer_Running = 0; + } + + LOG_D(MAC, + "[UE %d][SR %x] Frame %d subframe %d send SR indication (SR_COUNTER/dsr_TransMax %d/%d), SR_pending %d\n", + module_idP, rnti, frameP, subframe, + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER, + (1 << + (2 + + UE_mac_inst[module_idP]. + physicalConfigDedicated->schedulingRequestConfig->choice. + setup.dsr_TransMax)), + UE_mac_inst[module_idP].scheduling_info.SR_pending); + + //UE_mac_inst[module_idP].ul_active =1; + return (1); //instruct phy to signal SR } else { - LOG_W(MAC, "Measurement GAP offset is unknown\n"); + // notify RRC to relase PUCCH/SRS + // clear any configured dl/ul + // initiate RA + if (UE_mac_inst[module_idP].scheduling_info.SR_pending) { + // release all pucch resource + UE_mac_inst[module_idP].physicalConfigDedicated = NULL; + UE_mac_inst[module_idP].ul_active = 0; + UE_mac_inst[module_idP].BSR_reporting_active = + BSR_TRIGGER_NONE; + + LOG_I(MAC, "[UE %d] Release all SRs \n", module_idP); + } + UE_mac_inst[module_idP].scheduling_info.SR_pending = 0; + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER = 0; + return (0); } - - T=MGRP/10; - DevAssert( T != 0 ); - - //check the measurement gap and sr prohibit timer - if ((subframe == gapOffset %10) && ((frameP %T) == (floor(gapOffset/10))) - && (UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer_Running ==0)) { - UE_mac_inst[module_idP].scheduling_info.SR_pending=1; - return(0); - } - } - - if ((UE_mac_inst[module_idP].physicalConfigDedicated != NULL) && - (UE_mac_inst[module_idP].scheduling_info.SR_pending==1) && - (UE_mac_inst[module_idP].scheduling_info.SR_COUNTER < - (1<<(2+UE_mac_inst[module_idP].physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax))) - ) { - LOG_D(MAC,"[UE %d][SR %x] Frame %d subframe %d PHY asks for SR (SR_COUNTER/dsr_TransMax %d/%d), SR_pending %d\n", - module_idP,rnti,frameP,subframe, - UE_mac_inst[module_idP].scheduling_info.SR_COUNTER, - (1<<(2+UE_mac_inst[module_idP].physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax)), - UE_mac_inst[module_idP].scheduling_info.SR_pending); - - UE_mac_inst[module_idP].scheduling_info.SR_COUNTER++; - - // start the sr-prohibittimer : rel 9 and above - if (UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer > 0) { // timer configured - UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer--; - UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer_Running=1; - } else { - UE_mac_inst[module_idP].scheduling_info.sr_ProhibitTimer_Running=0; - } - - LOG_D(MAC,"[UE %d][SR %x] Frame %d subframe %d send SR indication (SR_COUNTER/dsr_TransMax %d/%d), SR_pending %d\n", - module_idP,rnti,frameP,subframe, - UE_mac_inst[module_idP].scheduling_info.SR_COUNTER, - (1<<(2+UE_mac_inst[module_idP].physicalConfigDedicated->schedulingRequestConfig->choice.setup.dsr_TransMax)), - UE_mac_inst[module_idP].scheduling_info.SR_pending); - - //UE_mac_inst[module_idP].ul_active =1; - return(1); //instruct phy to signal SR - } else { - // notify RRC to relase PUCCH/SRS - // clear any configured dl/ul - // initiate RA - UE_mac_inst[module_idP].scheduling_info.SR_pending=0; - UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0; - return(0); - } } //------------------------------------------------------------------------------ void -ue_send_sdu( - module_id_t module_idP, - uint8_t CC_id, - frame_t frameP, - uint8_t* sdu, - uint16_t sdu_len, - uint8_t eNB_index -) +ue_send_sdu(module_id_t module_idP, + uint8_t CC_id, + frame_t frameP, + sub_frame_t subframeP, + uint8_t * sdu, uint16_t sdu_len, uint8_t eNB_index) //------------------------------------------------------------------------------ { - unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr; - unsigned char rx_lcids[NB_RB_MAX]; - unsigned short rx_lengths[NB_RB_MAX]; - unsigned char *tx_sdu; - - start_meas(&UE_mac_inst[module_idP].rx_dlsch_sdu); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN); - - LOG_T(MAC,"sdu: %x.%x.%x\n",sdu[0],sdu[1],sdu[2]); - - if (opt_enabled) { - trace_pdu(1, sdu, sdu_len, module_idP, 3, UE_mac_inst[module_idP].crnti, - UE_mac_inst[module_idP].subframe, 0, 0); - LOG_D(OPT,"[UE %d][DLSCH] Frame %d trace pdu for rnti %x with size %d\n", - module_idP, frameP, UE_mac_inst[module_idP].crnti, sdu_len); - } - - payload_ptr = parse_header(sdu,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,sdu_len); - -#ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE %d] ue_send_sdu : Frame %d eNB_index %d : num_ce %d num_sdu %d\n",module_idP, - frameP,eNB_index,num_ce,num_sdu); + unsigned char rx_ces[MAX_NUM_CE], num_ce, num_sdu, i, *payload_ptr; + unsigned char rx_lcids[NB_RB_MAX]; + unsigned short rx_lengths[NB_RB_MAX]; + unsigned char *tx_sdu; +#if UE_TIMING_TRACE + start_meas(&UE_mac_inst[module_idP].rx_dlsch_sdu); #endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN); -#if defined(ENABLE_MAC_PAYLOAD_DEBUG) - LOG_T(MAC,"[eNB %d] First 32 bytes of DLSCH : \n"); + LOG_T(MAC, "sdu: %x.%x.%x\n", sdu[0], sdu[1], sdu[2]); - for (i=0; i<32; i++) { - LOG_T(MAC,"%x.",sdu[i]); - } - - LOG_T(MAC,"\n"); -#endif - - for (i=0; i= 9 (64 bits) - // (other possibility is 1 for TBS=7 (SCH_SUBHEADER_FIXED), or 2 for TBS=8 (SCH_SUBHEADER_FIXED+PADDING or SCH_SUBHEADER_SHORT) - for (i=0; i<6; i++) - if (tx_sdu[i] != payload_ptr[i]) { - LOG_E(MAC,"[UE %d][RAPROC] Contention detected, RA failed\n",module_idP); - mac_xface->ra_failed(module_idP,CC_id,eNB_index); - UE_mac_inst[module_idP].RA_contention_resolution_timer_active = 0; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_OUT); - return; - } - - LOG_I(MAC,"[UE %d][RAPROC] Frame %d : Clearing contention resolution timer\n"); - UE_mac_inst[module_idP].RA_contention_resolution_timer_active = 0; - mac_xface->ra_succeeded(module_idP,CC_id,eNB_index); - } - - payload_ptr+=6; - break; - - case TIMING_ADV_CMD: -#ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] CE %d : UE Timing Advance : %d\n",i,payload_ptr[0]); -#endif - mac_xface->process_timing_advance(module_idP,CC_id,payload_ptr[0]); - payload_ptr++; - break; - - case DRX_CMD: -#ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] CE %d : UE DRX :",i); -#endif - payload_ptr++; - break; - } - } - - for (i=0; i DL-CCCH, RRC message (eNB %d, %d bytes)\n", - module_idP, - UE_mac_inst[module_idP].crnti, - frameP, - eNB_index, - rx_lengths[i]); - -#if defined(ENABLE_MAC_PAYLOAD_DEBUG) - int j; - - for (j=0; j DL-DCCH%d, RRC message (eNB %d, %d bytes)\n", module_idP, frameP, rx_lcids[i],eNB_index,rx_lengths[i]); - mac_rlc_data_ind(module_idP, - UE_mac_inst[module_idP].crnti, - eNB_index, - frameP, - ENB_FLAG_NO, - MBMS_FLAG_NO, - DCCH, - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL); - } else if (rx_lcids[i] == DCCH1) { - LOG_D(MAC,"[UE %d] Frame %d : DLSCH -> DL-DCCH%d, RRC message (eNB %d, %d bytes)\n", module_idP, frameP, rx_lcids[i], eNB_index,rx_lengths[i]); - mac_rlc_data_ind(module_idP, - UE_mac_inst[module_idP].crnti, - eNB_index, - frameP, - ENB_FLAG_NO, - MBMS_FLAG_NO, - DCCH1, - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL); - } else if (rx_lcids[i] == DTCH) { - LOG_D(MAC,"[UE %d] Frame %d : DLSCH -> DL-DTCH%d (eNB %d, %d bytes)\n", module_idP, frameP,rx_lcids[i], eNB_index,rx_lengths[i]); - -#if defined(ENABLE_MAC_PAYLOAD_DEBUG) - int j; - - for (j=0; j= 9 (64 bits) + // (other possibility is 1 for TBS=7 (SCH_SUBHEADER_FIXED), or 2 for TBS=8 (SCH_SUBHEADER_FIXED+PADDING or SCH_SUBHEADER_SHORT) + for (i = 0; i < 6; i++) + if (tx_sdu[i] != payload_ptr[i]) { + LOG_E(MAC, + "[UE %d][RAPROC] Contention detected, RA failed\n", + module_idP); + ra_failed(module_idP, CC_id, eNB_index); + UE_mac_inst + [module_idP]. + RA_contention_resolution_timer_active = 0; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, + VCD_FUNCTION_OUT); + return; + } + + LOG_I(MAC, + "[UE %d][RAPROC] Frame %d : Clearing contention resolution timer\n", + module_idP, frameP); + UE_mac_inst + [module_idP]. + RA_contention_resolution_timer_active = 0; + ra_succeeded(module_idP, CC_id, eNB_index); + } + + payload_ptr += 6; + break; + + case TIMING_ADV_CMD: +#ifdef DEBUG_HEADER_PARSING + LOG_D(MAC, "[UE] CE %d : UE Timing Advance : %d\n", i, + payload_ptr[0]); +#endif + process_timing_advance(module_idP, CC_id, payload_ptr[0]); + payload_ptr++; + break; + + case DRX_CMD: +#ifdef DEBUG_HEADER_PARSING + LOG_D(MAC, "[UE] CE %d : UE DRX :", i); +#endif + payload_ptr++; + break; + } + } + + for (i = 0; i < num_sdu; i++) { +#ifdef DEBUG_HEADER_PARSING + LOG_D(MAC, "[UE] SDU %d : LCID %d, length %d\n", i, + rx_lcids[i], rx_lengths[i]); +#endif + + if (rx_lcids[i] == CCCH) { + + LOG_D(MAC, + "[UE %d] rnti %x Frame %d : DLSCH -> DL-CCCH, RRC message (eNB %d, %d bytes)\n", + module_idP, UE_mac_inst[module_idP].crnti, frameP, + eNB_index, rx_lengths[i]); + +#if defined(ENABLE_MAC_PAYLOAD_DEBUG) + int j; + + for (j = 0; j < rx_lengths[i]; j++) { + LOG_T(MAC, "%x.", (uint8_t) payload_ptr[j]); + } + + LOG_T(MAC, "\n"); +#endif + mac_rrc_data_ind_ue(module_idP, + CC_id, + frameP, subframeP, + UE_mac_inst[module_idP].crnti, + CCCH, + (uint8_t *) payload_ptr, + rx_lengths[i], eNB_index, 0); + + } else if ((rx_lcids[i] == DCCH) || (rx_lcids[i] == DCCH1)) { + LOG_D(MAC, + "[UE %d] Frame %d : DLSCH -> DL-DCCH%d, RRC message (eNB %d, %d bytes)\n", + module_idP, frameP, rx_lcids[i], eNB_index, + rx_lengths[i]); + mac_rlc_data_ind(module_idP, UE_mac_inst[module_idP].crnti, + eNB_index, frameP, ENB_FLAG_NO, + MBMS_FLAG_NO, rx_lcids[i], + (char *) payload_ptr, rx_lengths[i], 1, + NULL); + + } else if ((rx_lcids[i] < NB_RB_MAX) && (rx_lcids[i] > DCCH1)) { + + LOG_D(MAC, + "[UE %d] Frame %d : DLSCH -> DL-DTCH%d (eNB %d, %d bytes)\n", + module_idP, frameP, rx_lcids[i], eNB_index, + rx_lengths[i]); + +#if defined(ENABLE_MAC_PAYLOAD_DEBUG) + int j; + for (j = 0; j < rx_lengths[i]; j++) + LOG_T(MAC, "%x.", (unsigned char) payload_ptr[j]); + LOG_T(MAC, "\n"); +#endif + mac_rlc_data_ind(module_idP, + UE_mac_inst[module_idP].crnti, + eNB_index, + frameP, + ENB_FLAG_NO, + MBMS_FLAG_NO, + rx_lcids[i], + (char *) payload_ptr, rx_lengths[i], 1, + NULL); + } else { + LOG_E(MAC, "[UE %d] Frame %d : unknown LCID %d (eNB %d)\n", + module_idP, frameP, rx_lcids[i], eNB_index); + } + payload_ptr += rx_lengths[i]; + } + } // end if (payload_ptr != NULL) + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&UE_mac_inst[module_idP].rx_dlsch_sdu); +#endif } -void ue_decode_si(module_id_t module_idP,int CC_id,frame_t frameP, uint8_t eNB_index, void *pdu,uint16_t len) +void +ue_decode_si(module_id_t module_idP, int CC_id, frame_t frameP, + uint8_t eNB_index, void *pdu, uint16_t len) { +#if UE_TIMING_TRACE + start_meas(&UE_mac_inst[module_idP].rx_si); +#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_SI, VCD_FUNCTION_IN); - start_meas(&UE_mac_inst[module_idP].rx_si); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_SI, VCD_FUNCTION_IN); + LOG_D(MAC, "[UE %d] Frame %d Sending SI to RRC (LCID Id %d,len %d)\n", + module_idP, frameP, BCCH, len); - LOG_D(MAC,"[UE %d] Frame %d Sending SI to RRC (LCID Id %d,len %d)\n",module_idP,frameP,BCCH,len); - - mac_rrc_data_ind(module_idP, - CC_id, - frameP,0, // unknown subframe - SI_RNTI, - BCCH, - (uint8_t *)pdu, - len, - ENB_FLAG_NO, - eNB_index, - 0); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_SI, VCD_FUNCTION_OUT); - stop_meas(&UE_mac_inst[module_idP].rx_si); - if (opt_enabled == 1) { - trace_pdu(0, - (uint8_t *)pdu, - len, - module_idP, - 4, - 0xffff, - UE_mac_inst[module_idP].subframe, - 0, - 0); - LOG_D(OPT,"[UE %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", - module_idP, frameP, CC_id, 0xffff, len); - } + mac_rrc_data_ind_ue(module_idP, CC_id, frameP, 0, // unknown subframe + SI_RNTI, + BCCH, (uint8_t *) pdu, len, eNB_index, + 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_SI, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&UE_mac_inst[module_idP].rx_si); +#endif + if (opt_enabled == 1) { + trace_pdu(0, + (uint8_t *) pdu, + len, + module_idP, + 4, + 0xffff, + UE_mac_inst[module_idP].rxFrame, + UE_mac_inst[module_idP].rxSubframe, 0, 0); + LOG_D(OPT, + "[UE %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", + module_idP, frameP, CC_id, 0xffff, len); + } } -#ifdef Rel10 +void +ue_decode_p(module_id_t module_idP, int CC_id, frame_t frameP, + uint8_t eNB_index, void *pdu, uint16_t len) +{ +#if UE_TIMING_TRACE + start_meas(&UE_mac_inst[module_idP].rx_p); +#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_PCCH, VCD_FUNCTION_IN); + + LOG_D(MAC, + "[UE %d] Frame %d Sending Paging message to RRC (LCID Id %d,len %d)\n", + module_idP, frameP, PCCH, len); + + mac_rrc_data_ind_ue(module_idP, CC_id, frameP, 0, // unknown subframe + P_RNTI, + PCCH, (uint8_t *) pdu, len, eNB_index, + 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_PCCH, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&UE_mac_inst[module_idP].rx_p); +#endif + if (opt_enabled == 1) { + trace_pdu(0, + (uint8_t *) pdu, + len, + module_idP, + 4, + P_RNTI, + UE_mac_inst[module_idP].rxFrame, + UE_mac_inst[module_idP].rxSubframe, 0, 0); + LOG_D(OPT, + "[UE %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n", + module_idP, frameP, CC_id, P_RNTI, len); + } +} + +#if defined(Rel10) || defined(Rel14) unsigned char *parse_mch_header(unsigned char *mac_header, - unsigned char *num_sdu, - unsigned char *rx_lcids, - unsigned short *rx_lengths, - unsigned short tb_length) + unsigned char *num_sdu, + unsigned char *rx_lcids, + unsigned short *rx_lengths, + unsigned short tb_length) { - unsigned char not_done=1, num_sdus=0, lcid, i; - unsigned char *mac_header_ptr = mac_header; - unsigned short length; + unsigned char not_done = 1, num_sdus = 0, lcid, i; + unsigned char *mac_header_ptr = mac_header; + unsigned short length; - while (not_done == 1) { - if (((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E == 0) { - not_done = 0; + while (not_done == 1) { + if (((SCH_SUBHEADER_FIXED *) mac_header_ptr)->E == 0) { + not_done = 0; + } + + lcid = ((SCH_SUBHEADER_FIXED *) mac_header_ptr)->LCID; + + if (lcid < SHORT_PADDING) { // subheader for MSI, MCCH or MTCH + if (not_done == 0) { // last MAC SDU, length is implicit + mac_header_ptr++; + length = tb_length - (mac_header_ptr - mac_header); + + for (i = 0; i < num_sdus; i++) { + length -= rx_lengths[i]; + } + } else { // not the last MAC SDU + if (((SCH_SUBHEADER_LONG *) mac_header_ptr)->F == 1) { // subheader has length of 3octets + // length = ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L; + length = + ((((SCH_SUBHEADER_LONG *) mac_header_ptr)-> + L_MSB & 0x7f) + << 8) | (((SCH_SUBHEADER_LONG *) mac_header_ptr)-> + L_LSB & 0xff); + mac_header_ptr += 3; + } else { // subheader has length of 2octets + length = ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->L; + mac_header_ptr += 2; + } + } + + rx_lcids[num_sdus] = lcid; + rx_lengths[num_sdus] = length; + num_sdus++; + } else { // subheader for padding + // if (lcid == SHORT_PADDING) + mac_header_ptr++; + } } - lcid = ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID; - - if (lcid < SHORT_PADDING) {// subheader for MSI, MCCH or MTCH - if (not_done == 0) { // last MAC SDU, length is implicit - mac_header_ptr++; - length = tb_length- (mac_header_ptr - mac_header); - - for (i=0; iF == 1) {// subheader has length of 3octets - // length = ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L; - length = ((((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB & 0x7f ) << 8 ) | (((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB & 0xff); - mac_header_ptr += 3; - } else { // subheader has length of 2octets - length = ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L; - mac_header_ptr += 2; - } - } - - rx_lcids[num_sdus] = lcid; - rx_lengths[num_sdus] = length; - num_sdus++; - } else { // subheader for padding - // if (lcid == SHORT_PADDING) - mac_header_ptr++; - } - } - - *num_sdu = num_sdus; - return(mac_header_ptr); + *num_sdu = num_sdus; + return (mac_header_ptr); } // this function is for sending mch_sdu from phy to mac -void ue_send_mch_sdu(module_id_t module_idP, uint8_t CC_id, frame_t frameP, uint8_t *sdu, uint16_t sdu_len, uint8_t eNB_index, uint8_t sync_area) +void +ue_send_mch_sdu(module_id_t module_idP, uint8_t CC_id, frame_t frameP, + uint8_t * sdu, uint16_t sdu_len, uint8_t eNB_index, + uint8_t sync_area) { - unsigned char num_sdu, i, *payload_ptr; - unsigned char rx_lcids[NB_RB_MAX]; - unsigned short rx_lengths[NB_RB_MAX]; - - start_meas(&UE_mac_inst[module_idP].rx_mch_sdu); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_IN); - - LOG_D(MAC,"[UE %d] Frame %d : process the mch PDU for sync area %d \n",module_idP,frameP, sync_area); - LOG_D(MAC,"[UE %d] sdu: %x.%x\n", module_idP,sdu[0], sdu[1]); - LOG_D(MAC,"[UE %d] parse_mch_header, demultiplex\n",module_idP); - - payload_ptr = parse_mch_header(sdu, &num_sdu, rx_lcids, rx_lengths, sdu_len); - LOG_D(MAC,"[UE %d] parse_mch_header, found %d sdus\n",module_idP,num_sdu); - - for (i=0; iMSI for sync area %d (eNB %d, %d bytes)\n",module_idP,frameP, sync_area, eNB_index, rx_lengths[i]); - // ??store necessary scheduling info to ue_mac_inst in order to - // calculate exact position of interested service (for the complex case has >1 mtch) - // set msi_status to 1 - UE_mac_inst[module_idP].msi_status = 1; - } - } else if (rx_lcids[i] == MCCH_LCHANID) { - LOG_I(MAC,"[UE %d] Frame %d : SDU %d MCH->MCCH for sync area %d (eNB %d, %d bytes)\n",module_idP,frameP, i, sync_area, eNB_index, rx_lengths[i]); - mac_rrc_data_ind(module_idP, - CC_id, - frameP,0, // unknown subframe - M_RNTI, - MCCH, - payload_ptr, rx_lengths[i], 0, eNB_index, sync_area); - } else if (rx_lcids[i] == MTCH) { - if (UE_mac_inst[module_idP].msi_status==1) { - LOG_I(MAC,"[UE %d] Frame %d : MCH->MTCH for sync area %d (eNB %d, %d bytes)\n",module_idP,frameP, sync_area, eNB_index, rx_lengths[i]); - - mac_rlc_data_ind( - module_idP, - UE_mac_inst[module_idP].crnti, - eNB_index, - frameP, - ENB_FLAG_NO, - MBMS_FLAG_YES, - MTCH, /*+ (maxDRB + 3),*/ - (char *)payload_ptr, - rx_lengths[i], - 1, - NULL); - - } - } else { - LOG_W(MAC,"[UE %d] Frame %d : unknown sdu %d rx_lcids[%d]=%d mcch status %d eNB %d \n", - module_idP, - frameP, - rx_lengths[i], - i, - rx_lcids[i], - UE_mac_inst[module_idP].mcch_status, eNB_index); - } - - payload_ptr += rx_lengths[i]; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_OUT); - stop_meas(&UE_mac_inst[module_idP].rx_mch_sdu); -} - -int8_t ue_get_mbsfn_sf_alloction (module_id_t module_idP, uint8_t mbsfn_sync_area, unsigned char eNB_index) -{ - // currently there is one-to-one mapping between sf allocation pattern and sync area - if (mbsfn_sync_area >= MAX_MBSFN_AREA) { - LOG_W( MAC, "[UE %"PRIu8"] MBSFN synchronization area %"PRIu8" out of range for eNB %"PRIu8"\n", module_idP, mbsfn_sync_area, eNB_index ); - return -1; - } else if (UE_mac_inst[module_idP].mbsfn_SubframeConfig[mbsfn_sync_area] != NULL) { - return mbsfn_sync_area; - } else { - LOG_W( MAC, "[UE %"PRIu8"] MBSFN Subframe Config pattern %"PRIu8" not found \n", module_idP, mbsfn_sync_area ); - return -1; - } -} - -int ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, uint32_t subframe, uint8_t eNB_index,uint8_t *sync_area, uint8_t *mcch_active) -{ - - int i=0, j=0, ii=0, msi_pos=0, mcch_mcs = - 1; - int mcch_flag=0, mtch_flag=0, msi_flag=0; - int mbsfn_period = 0;// 1<<(UE_mac_inst[module_idP].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); - int mcch_period = 0;// 32<<(UE_mac_inst[module_idP].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - int mch_scheduling_period = -1; - - start_meas(&UE_mac_inst[module_idP].ue_query_mch); - - if (UE_mac_inst[module_idP].pmch_Config[0]) { - mch_scheduling_period = 8<<(UE_mac_inst[module_idP].pmch_Config[0]->mch_SchedulingPeriod_r9); - } - - for (i=0; - i< UE_mac_inst[module_idP].num_active_mbsfn_area; - i++ ) { - // assume, that there is always a mapping - if ((j=ue_get_mbsfn_sf_alloction(module_idP,i,eNB_index)) == -1) { - return -1; // continue; - } - - ii=0; - msi_pos=0; - mbsfn_period = 1<<(UE_mac_inst[module_idP].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); - mcch_period = 32<<(UE_mac_inst[module_idP].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + unsigned char num_sdu, i, *payload_ptr; + unsigned char rx_lcids[NB_RB_MAX]; + unsigned short rx_lengths[NB_RB_MAX]; +#if UE_TIMING_TRACE + start_meas(&UE_mac_inst[module_idP].rx_mch_sdu); +#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_IN); LOG_D(MAC, - "[UE %d] Frame %d subframe %d: Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %d, mcch period %d,mac sched period (%d,%d))\n", - module_idP,frameP, subframe,i,UE_mac_inst[module_idP].num_active_mbsfn_area, - j,UE_mac_inst[module_idP].num_sf_allocation_pattern,mbsfn_period,mcch_period, - mch_scheduling_period,UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset); + "[UE %d] Frame %d : process the mch PDU for sync area %d \n", + module_idP, frameP, sync_area); + LOG_D(MAC, "[UE %d] sdu: %x.%x\n", module_idP, sdu[0], sdu[1]); + LOG_D(MAC, "[UE %d] parse_mch_header, demultiplex\n", module_idP); - // get the real MCS value - switch (UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.signallingMCS_r9) { - case 0: - mcch_mcs = 2; - break; + payload_ptr = + parse_mch_header(sdu, &num_sdu, rx_lcids, rx_lengths, sdu_len); + LOG_D(MAC, "[UE %d] parse_mch_header, found %d sdus\n", module_idP, + num_sdu); - case 1: - mcch_mcs = 7; - break; + for (i = 0; i < num_sdu; i++) { + if (rx_lcids[i] == MCH_SCHDL_INFO) { + if (UE_mac_inst[module_idP].mcch_status == 1) { + LOG_I(MAC, + "[UE %d] Frame %d : MCH->MSI for sync area %d (eNB %d, %d bytes)\n", + module_idP, frameP, sync_area, eNB_index, + rx_lengths[i]); + // ??store necessary scheduling info to ue_mac_inst in order to + // calculate exact position of interested service (for the complex case has >1 mtch) + // set msi_status to 1 + UE_mac_inst[module_idP].msi_status = 1; + } + } else if (rx_lcids[i] == MCCH_LCHANID) { + LOG_I(MAC, + "[UE %d] Frame %d : SDU %d MCH->MCCH for sync area %d (eNB %d, %d bytes)\n", + module_idP, frameP, i, sync_area, eNB_index, + rx_lengths[i]); + mac_rrc_data_ind_ue(module_idP, CC_id, frameP, 0, // unknown subframe + M_RNTI, + MCCH, + payload_ptr, rx_lengths[i], eNB_index, + sync_area); + } else if (rx_lcids[i] == MTCH) { + if (UE_mac_inst[module_idP].msi_status == 1) { + LOG_I(MAC, + "[UE %d] Frame %d : MCH->MTCH for sync area %d (eNB %d, %d bytes)\n", + module_idP, frameP, sync_area, eNB_index, + rx_lengths[i]); - case 2: - mcch_mcs = 13; - break; + mac_rlc_data_ind(module_idP, UE_mac_inst[module_idP].crnti, eNB_index, frameP, ENB_FLAG_NO, MBMS_FLAG_YES, MTCH, /*+ (maxDRB + 3), */ + (char *) payload_ptr, rx_lengths[i], 1, + NULL); - case 3: - mcch_mcs = 19; - break; + } + } else { + LOG_W(MAC, + "[UE %d] Frame %d : unknown sdu %d rx_lcids[%d]=%d mcch status %d eNB %d \n", + module_idP, frameP, rx_lengths[i], i, rx_lcids[i], + UE_mac_inst[module_idP].mcch_status, eNB_index); + } + + payload_ptr += rx_lengths[i]; } - if (frameP % mbsfn_period == UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset) { // MBSFN frameP - if (UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { // one-frameP format + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&UE_mac_inst[module_idP].rx_mch_sdu); +#endif +} - if (UE_mac_inst[module_idP].pmch_Config[0]) { - // Find the first subframe in this MCH to transmit MSI - if (frameP % mch_scheduling_period == UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset ) { - while (ii == 0) { - ii = UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & (0x80>>msi_pos); - msi_pos++; - } - } - } - - // Check if the subframe is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 - switch (subframe) { - case 1: - if (mac_xface->lte_frame_parms->frame_type == FDD) { - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) { - if (msi_pos == 1) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 2: - if (mac_xface->lte_frame_parms->frame_type == FDD) { - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) { - if (msi_pos == 2) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 3: - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) { - if (msi_pos == 1) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } else { // FDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) { - if (msi_pos == 3) { - msi_flag = 1; - } - - if ((frameP % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 4: - if (mac_xface->lte_frame_parms->frame_type == TDD) { - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) { - if (msi_pos == 2) { - msi_flag = 1; - } - - if ((frameP % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 6: - if (mac_xface->lte_frame_parms->frame_type == FDD) { - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) { - if (msi_pos == 4) { - msi_flag = 1; - } - - if ((frameP % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 7: - if (mac_xface->lte_frame_parms->frame_type == TDD) { // TDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) { - if (msi_pos == 3) { - msi_flag = 1; - } - - if ((frameP % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } else { // FDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) { - if (msi_pos == 5) { - msi_flag = 1; - } - - if ((frameP % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 8: - if (mac_xface->lte_frame_parms->frame_type == TDD) { //TDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) { - if (msi_pos == 4) { - msi_flag = 1; - } - - if ( (frameP % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } else { // FDD - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) { - if (msi_pos == 6) { - msi_flag = 1; - } - - if ((frameP % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - - case 9: - if (mac_xface->lte_frame_parms->frame_type == TDD) { - if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.choice.oneFrame.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) { - if (msi_pos == 5) { - msi_flag = 1; - } - - if ((frameP % mcch_period == UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_Offset_r9) && - ((UE_mac_inst[module_idP].mbsfn_AreaInfo[i]->mcch_Config_r9.sf_AllocInfo_r9.buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) ) { - mcch_flag = 1; - } - - mtch_flag = 1; - } - } - - break; - }// end switch - - // sf allocation is non-overlapping - if ((msi_flag==1) || (mcch_flag==1) || (mtch_flag==1)) { - LOG_D(MAC,"[UE %d] Frame %d Subframe %d: sync area %d SF alloc %d: msi flag %d, mcch flag %d, mtch flag %d\n", - module_idP, frameP, subframe,i,j,msi_flag,mcch_flag,mtch_flag); - - *sync_area=i; - break; - } - } else { // four-frameP format - } +int8_t +ue_get_mbsfn_sf_alloction(module_id_t module_idP, + uint8_t mbsfn_sync_area, unsigned char eNB_index) +{ + // currently there is one-to-one mapping between sf allocation pattern and sync area + if (mbsfn_sync_area >= MAX_MBSFN_AREA) { + LOG_W(MAC, + "[UE %" PRIu8 "] MBSFN synchronization area %" PRIu8 + " out of range for eNB %" PRIu8 "\n", module_idP, + mbsfn_sync_area, eNB_index); + return -1; + } else if (UE_mac_inst[module_idP]. + mbsfn_SubframeConfig[mbsfn_sync_area] != NULL) { + return mbsfn_sync_area; + } else { + LOG_W(MAC, + "[UE %" PRIu8 "] MBSFN Subframe Config pattern %" PRIu8 + " not found \n", module_idP, mbsfn_sync_area); + return -1; } - } // end of for +} - stop_meas(&UE_mac_inst[module_idP].ue_query_mch); +int +ue_query_mch(module_id_t module_idP, uint8_t CC_id, uint32_t frameP, + uint32_t subframe, uint8_t eNB_index, uint8_t * sync_area, + uint8_t * mcch_active) +{ - if ( (mcch_flag==1)) { // || (msi_flag==1)) - *mcch_active=1; - } + int i = 0, j = 0, ii = 0, msi_pos = 0, mcch_mcs = -1; + int mcch_flag = 0, mtch_flag = 0, msi_flag = 0; + int mbsfn_period = 0; // 1<<(UE_mac_inst[module_idP].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); + int mcch_period = 0; // 32<<(UE_mac_inst[module_idP].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + int mch_scheduling_period = -1; - if ( (mcch_flag==1) || ((msi_flag==1) && (UE_mac_inst[module_idP].mcch_status==1)) ) { - return mcch_mcs; - } else if ((mtch_flag==1) && (UE_mac_inst[module_idP].msi_status==1)) { - return UE_mac_inst[module_idP].pmch_Config[0]->dataMCS_r9; - } else { - return -1; - } + int frame_FDD = 1; + + +#if UE_TIMING_TRACE + start_meas(&UE_mac_inst[module_idP].ue_query_mch); +#endif + + if (UE_mac_inst[module_idP].pmch_Config[0]) { + mch_scheduling_period = + 8 << (UE_mac_inst[module_idP]. + pmch_Config[0]->mch_SchedulingPeriod_r9); + } + + for (i = 0; i < UE_mac_inst[module_idP].num_active_mbsfn_area; i++) { + // assume, that there is always a mapping + if ((j = + ue_get_mbsfn_sf_alloction(module_idP, i, eNB_index)) == -1) { + return -1; // continue; + } + + ii = 0; + msi_pos = 0; + mbsfn_period = + 1 << (UE_mac_inst[module_idP]. + mbsfn_SubframeConfig[0]->radioframeAllocationPeriod); + mcch_period = + 32 << (UE_mac_inst[module_idP]. + mbsfn_AreaInfo[0]->mcch_Config_r9. + mcch_RepetitionPeriod_r9); + + LOG_D(MAC, + "[UE %d] Frame %d subframe %d: Checking MBSFN Sync Area %d/%d with SF allocation %d/%d for MCCH and MTCH (mbsfn period %d, mcch period %d,mac sched period (%d,%ld))\n", + module_idP, frameP, subframe, i, + UE_mac_inst[module_idP].num_active_mbsfn_area, j, + UE_mac_inst[module_idP].num_sf_allocation_pattern, + mbsfn_period, mcch_period, mch_scheduling_period, + UE_mac_inst[module_idP]. + mbsfn_SubframeConfig[j]->radioframeAllocationOffset); + + // get the real MCS value + switch (UE_mac_inst[module_idP].mbsfn_AreaInfo[i]-> + mcch_Config_r9.signallingMCS_r9) { + case 0: + mcch_mcs = 2; + break; + + case 1: + mcch_mcs = 7; + break; + + case 2: + mcch_mcs = 13; + break; + + case 3: + mcch_mcs = 19; + break; + } + + if (frameP % mbsfn_period == UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->radioframeAllocationOffset) { // MBSFN frameP + if (UE_mac_inst[module_idP].mbsfn_SubframeConfig[j]->subframeAllocation.present == MBSFN_SubframeConfig__subframeAllocation_PR_oneFrame) { // one-frameP format + + if (UE_mac_inst[module_idP].pmch_Config[0]) { + // Find the first subframe in this MCH to transmit MSI + if (frameP % mch_scheduling_period == + UE_mac_inst[module_idP]. + mbsfn_SubframeConfig + [j]->radioframeAllocationOffset) { + while (ii == 0) { + ii = UE_mac_inst[module_idP]. + mbsfn_SubframeConfig[j]-> + subframeAllocation.choice. + oneFrame.buf[0] & (0x80 >> msi_pos); + msi_pos++; + } + } + } + + if (UE_mac_inst[module_idP].tdd_Config == NULL) + frame_FDD = 1; + else + frame_FDD = 0; + // Check if the subframe is for MSI, MCCH or MTCHs and Set the correspoding flag to 1 + switch (subframe) { + case 1: + if (frame_FDD == 1) { + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig + [j]->subframeAllocation.choice.oneFrame. + buf[0] & MBSFN_FDD_SF1) == MBSFN_FDD_SF1) { + if (msi_pos == 1) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.mcch_Offset_r9) + && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF1) == + MBSFN_FDD_SF1)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 2: + if (frame_FDD == 1) { + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig + [j]->subframeAllocation.choice.oneFrame. + buf[0] & MBSFN_FDD_SF2) == MBSFN_FDD_SF2) { + if (msi_pos == 2) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.mcch_Offset_r9) + && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF2) == + MBSFN_FDD_SF2)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 3: + if (frame_FDD == 0) { //TDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig + [j]->subframeAllocation.choice.oneFrame. + buf[0] & MBSFN_TDD_SF3) == MBSFN_TDD_SF3) { + if (msi_pos == 1) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.mcch_Offset_r9) + && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_TDD_SF3) == + MBSFN_TDD_SF3)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } else { // FDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig + [j]->subframeAllocation.choice.oneFrame. + buf[0] & MBSFN_FDD_SF3) == MBSFN_FDD_SF3) { + if (msi_pos == 3) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.mcch_Offset_r9) + && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF3) == + MBSFN_FDD_SF3)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 4: + if (frame_FDD == 0) { + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig + [j]->subframeAllocation.choice.oneFrame. + buf[0] & MBSFN_TDD_SF4) == MBSFN_TDD_SF4) { + if (msi_pos == 2) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.mcch_Offset_r9) + && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_TDD_SF4) == + MBSFN_TDD_SF4)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 6: + if (frame_FDD == 1) { + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig + [j]->subframeAllocation.choice.oneFrame. + buf[0] & MBSFN_FDD_SF6) == MBSFN_FDD_SF6) { + if (msi_pos == 4) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.mcch_Offset_r9) + && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF6) == + MBSFN_FDD_SF6)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 7: + if (frame_FDD == 0) { // TDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig + [j]->subframeAllocation.choice.oneFrame. + buf[0] & MBSFN_TDD_SF7) == MBSFN_TDD_SF7) { + if (msi_pos == 3) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.mcch_Offset_r9) + && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_TDD_SF7) == + MBSFN_TDD_SF7)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } else { // FDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig + [j]->subframeAllocation.choice.oneFrame. + buf[0] & MBSFN_FDD_SF7) == MBSFN_FDD_SF7) { + if (msi_pos == 5) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.mcch_Offset_r9) + && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF7) == + MBSFN_FDD_SF7)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 8: + if (frame_FDD == 0) { //TDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig + [j]->subframeAllocation.choice.oneFrame. + buf[0] & MBSFN_TDD_SF8) == MBSFN_TDD_SF8) { + if (msi_pos == 4) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.mcch_Offset_r9) + && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_TDD_SF8) == + MBSFN_TDD_SF8)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } else { // FDD + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig + [j]->subframeAllocation.choice.oneFrame. + buf[0] & MBSFN_FDD_SF8) == MBSFN_FDD_SF8) { + if (msi_pos == 6) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.mcch_Offset_r9) + && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_FDD_SF8) == + MBSFN_FDD_SF8)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + + case 9: + if (frame_FDD == 0) { + if ((UE_mac_inst[module_idP].mbsfn_SubframeConfig + [j]->subframeAllocation.choice.oneFrame. + buf[0] & MBSFN_TDD_SF9) == MBSFN_TDD_SF9) { + if (msi_pos == 5) { + msi_flag = 1; + } + + if ((frameP % mcch_period == + UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.mcch_Offset_r9) + && + ((UE_mac_inst[module_idP].mbsfn_AreaInfo + [i]->mcch_Config_r9.sf_AllocInfo_r9. + buf[0] & MBSFN_TDD_SF9) == + MBSFN_TDD_SF9)) { + mcch_flag = 1; + } + + mtch_flag = 1; + } + } + + break; + } // end switch + + // sf allocation is non-overlapping + if ((msi_flag == 1) || (mcch_flag == 1) + || (mtch_flag == 1)) { + LOG_D(MAC, + "[UE %d] Frame %d Subframe %d: sync area %d SF alloc %d: msi flag %d, mcch flag %d, mtch flag %d\n", + module_idP, frameP, subframe, i, j, msi_flag, + mcch_flag, mtch_flag); + + *sync_area = i; + break; + } + } else { // four-frameP format + } + } + } // end of for +#if UE_TIMING_TRACE + stop_meas(&UE_mac_inst[module_idP].ue_query_mch); +#endif + + if ((mcch_flag == 1)) { // || (msi_flag==1)) + *mcch_active = 1; + } + + if ((mcch_flag == 1) + || ((msi_flag == 1) && (UE_mac_inst[module_idP].mcch_status == 1))) { + return mcch_mcs; + } else if ((mtch_flag == 1) + && (UE_mac_inst[module_idP].msi_status == 1)) { + return UE_mac_inst[module_idP].pmch_Config[0]->dataMCS_r9; + } else { + return -1; + } } #endif -unsigned char generate_ulsch_header(uint8_t *mac_header, - uint8_t num_sdus, - uint8_t short_padding, - uint16_t *sdu_lengths, - uint8_t *sdu_lcids, - POWER_HEADROOM_CMD *power_headroom, - uint16_t *crnti, - BSR_SHORT *truncated_bsr, - BSR_SHORT *short_bsr, - BSR_LONG *long_bsr, - unsigned short post_padding) +unsigned char +generate_ulsch_header(uint8_t * mac_header, + uint8_t num_sdus, + uint8_t short_padding, + uint16_t * sdu_lengths, + uint8_t * sdu_lcids, + POWER_HEADROOM_CMD * power_headroom, + uint16_t * crnti, + BSR_SHORT * truncated_bsr, + BSR_SHORT * short_bsr, + BSR_LONG * long_bsr, unsigned short post_padding) { - SCH_SUBHEADER_FIXED *mac_header_ptr = (SCH_SUBHEADER_FIXED *)mac_header; - unsigned char first_element=0,last_size=0,i; - unsigned char mac_header_control_elements[16],*ce_ptr; + SCH_SUBHEADER_FIXED *mac_header_ptr = + (SCH_SUBHEADER_FIXED *) mac_header; + unsigned char first_element = 0, last_size = 0, i; + unsigned char mac_header_control_elements[16], *ce_ptr; - LOG_D(MAC,"[UE] Generate ULSCH : num_sdus %d\n",num_sdus); + LOG_D(MAC, "[UE] Generate ULSCH : num_sdus %d\n", num_sdus); #ifdef DEBUG_HEADER_PARSING - for (i=0; iR = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - first_element=1; - last_size=1; - } - - if (short_padding == 2) { - mac_header_ptr->E = 1; - mac_header_ptr++; - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - last_size=1; - } - - if (power_headroom) { - if (first_element>0) { - mac_header_ptr->E = 1; - mac_header_ptr++; - } else { - first_element=1; + for (i = 0; i < num_sdus; i++) { + LOG_T(MAC, "[UE] sdu %d : lcid %d length %d", i, sdu_lcids[i], + sdu_lengths[i]); } - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = POWER_HEADROOM; - last_size=1; - *((POWER_HEADROOM_CMD *)ce_ptr)=(*power_headroom); - ce_ptr+=sizeof(POWER_HEADROOM_CMD); - LOG_D(MAC, "phr header size %d\n",sizeof(POWER_HEADROOM_CMD)); - } - - if (crnti) { -#ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] CRNTI : %x (first_element %d)\n",*crnti,first_element); + LOG_T(MAC, "\n"); #endif + ce_ptr = &mac_header_control_elements[0]; - if (first_element>0) { - mac_header_ptr->E = 1; - mac_header_ptr++; - } else { - first_element=1; + if ((short_padding == 1) || (short_padding == 2)) { + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + first_element = 1; + last_size = 1; } - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = CRNTI; - last_size=1; - *((uint16_t *)ce_ptr)=(*crnti); - ce_ptr+=sizeof(uint16_t); - // printf("offset %d\n",ce_ptr-mac_header_control_elements); - } - - if (truncated_bsr) { - if (first_element>0) { - mac_header_ptr->E = 1; - /* - printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); - */ - mac_header_ptr++; - } else { - first_element=1; + if (short_padding == 2) { + mac_header_ptr->E = 1; + mac_header_ptr++; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + last_size = 1; } -#ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] Scheduler Truncated BSR Header\n"); -#endif - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = TRUNCATED_BSR; - last_size=1; - *((BSR_TRUNCATED *)ce_ptr)=(*truncated_bsr); - ce_ptr+=sizeof(BSR_TRUNCATED); - // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); + if (power_headroom) { + if (first_element > 0) { + mac_header_ptr->E = 1; + mac_header_ptr++; + } else { + first_element = 1; + } - } else if (short_bsr) { - if (first_element>0) { - mac_header_ptr->E = 1; - /* - printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); - */ - mac_header_ptr++; - } else { - first_element=1; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = POWER_HEADROOM; + last_size = 1; + *((POWER_HEADROOM_CMD *) ce_ptr) = (*power_headroom); + ce_ptr += sizeof(POWER_HEADROOM_CMD); + LOG_D(MAC, "phr header size %zu\n", sizeof(POWER_HEADROOM_CMD)); } + if (crnti) { #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] Scheduler SHORT BSR Header\n"); + LOG_D(MAC, "[UE] CRNTI : %x (first_element %d)\n", *crnti, + first_element); #endif - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_BSR; - last_size=1; - *((BSR_SHORT *)ce_ptr)=(*short_bsr); - ce_ptr+=sizeof(BSR_SHORT); - // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); - } else if (long_bsr) { - if (first_element>0) { - mac_header_ptr->E = 1; - /* - printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); - */ - mac_header_ptr++; - } else { - first_element=1; + if (first_element > 0) { + mac_header_ptr->E = 1; + mac_header_ptr++; + } else { + first_element = 1; + } + + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = CRNTI; + last_size = 1; + *((uint16_t *) ce_ptr) = (*crnti); + ce_ptr += sizeof(uint16_t); + // printf("offset %d\n",ce_ptr-mac_header_control_elements); } + if (truncated_bsr) { + if (first_element > 0) { + mac_header_ptr->E = 1; + /* + printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); + */ + mac_header_ptr++; + } else { + first_element = 1; + } + #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] Scheduler Long BSR Header\n"); + LOG_D(MAC, "[UE] Scheduler Truncated BSR Header\n"); #endif - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = LONG_BSR; - last_size=1; + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = TRUNCATED_BSR; + last_size = 1; + *((BSR_TRUNCATED *) ce_ptr) = (*truncated_bsr); + ce_ptr += sizeof(BSR_TRUNCATED); + // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); - *(ce_ptr) = (long_bsr->Buffer_size0 << 2) | ((long_bsr->Buffer_size1 & 0x30) >> 4); - *(ce_ptr + 1) = ((long_bsr->Buffer_size1 & 0x0F) << 4) | ((long_bsr->Buffer_size2 & 0x3C) >> 2); - *(ce_ptr + 2) = ((long_bsr->Buffer_size2 & 0x03) << 2) | (long_bsr->Buffer_size3 & 0x3F); - /* Padding */ - *(ce_ptr + 3) = 0; - ce_ptr += BSR_LONG_SIZE; + } else if (short_bsr) { + if (first_element > 0) { + mac_header_ptr->E = 1; + /* + printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); + */ + mac_header_ptr++; + } else { + first_element = 1; + } - // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); - } - - // printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); - - for (i=0; iR = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_BSR; + last_size = 1; + *((BSR_SHORT *) ce_ptr) = (*short_bsr); + ce_ptr += sizeof(BSR_SHORT); + + // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); + } else if (long_bsr) { + if (first_element > 0) { + mac_header_ptr->E = 1; + /* + printf("last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, + ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); + */ + mac_header_ptr++; + } else { + first_element = 1; + } + +#ifdef DEBUG_HEADER_PARSING + LOG_D(MAC, "[UE] Scheduler Long BSR Header\n"); +#endif + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = LONG_BSR; + last_size = 1; + + *(ce_ptr) = + (long_bsr-> + Buffer_size0 << 2) | ((long_bsr->Buffer_size1 & 0x30) >> 4); + *(ce_ptr + 1) = + ((long_bsr->Buffer_size1 & 0x0F) << 4) | ((long_bsr-> + Buffer_size2 & 0x3C) + >> 2); + *(ce_ptr + 2) = + ((long_bsr-> + Buffer_size2 & 0x03) << 2) | (long_bsr->Buffer_size3 & 0x3F); + ce_ptr += BSR_LONG_SIZE; + + // printf("(cont_res) : offset %d\n",ce_ptr-mac_header_control_elements); + } + // printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); + + for (i = 0; i < num_sdus; i++) { +#ifdef DEBUG_HEADER_PARSING + LOG_T(MAC, "[UE] sdu subheader %d (lcid %d, %d bytes)\n", i, + sdu_lcids[i], sdu_lengths[i]); #endif - if ((first_element>0)) { - mac_header_ptr->E = 1; + if ((i == (num_sdus - 1)) + && ((short_padding) || (post_padding == 0))) { + if (first_element > 0) { + mac_header_ptr->E = 1; #ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] last subheader : %x (R%d,E%d,LCID%d)\n",*(unsigned char*)mac_header_ptr, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->R, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->E, - ((SCH_SUBHEADER_FIXED *)mac_header_ptr)->LCID); + LOG_D(MAC, "[UE] last subheader : %x (R%d,E%d,LCID%d)\n", + *(unsigned char *) mac_header_ptr, + ((SCH_SUBHEADER_FIXED *) mac_header_ptr)->R, + ((SCH_SUBHEADER_FIXED *) mac_header_ptr)->E, + ((SCH_SUBHEADER_FIXED *) mac_header_ptr)->LCID); #endif - mac_header_ptr+=last_size; - // printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); - } else { - first_element=1; + mac_header_ptr += last_size; + } + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = sdu_lcids[i]; + } else { + if ((first_element > 0)) { + mac_header_ptr->E = 1; +#ifdef DEBUG_HEADER_PARSING + LOG_D(MAC, "[UE] last subheader : %x (R%d,E%d,LCID%d)\n", + *(unsigned char *) mac_header_ptr, + ((SCH_SUBHEADER_FIXED *) mac_header_ptr)->R, + ((SCH_SUBHEADER_FIXED *) mac_header_ptr)->E, + ((SCH_SUBHEADER_FIXED *) mac_header_ptr)->LCID); +#endif + mac_header_ptr += last_size; + // printf("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr); + } else { + first_element = 1; + } + + if (sdu_lengths[i] < 128) { + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->R = 0; // 3 + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->F = 0; + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->LCID = + sdu_lcids[i]; + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->L = + (unsigned char) sdu_lengths[i]; + last_size = 2; +#ifdef DEBUG_HEADER_PARSING + LOG_D(MAC, "[UE] short sdu\n"); + LOG_T(MAC, + "[UE] last subheader : %x (R%d,E%d,LCID%d,F%d,L%d)\n", + ((uint16_t *) mac_header_ptr)[0], + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->R, + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->E, + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->LCID, + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->F, + ((SCH_SUBHEADER_SHORT *) mac_header_ptr)->L); +#endif + } else { + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->R = 0; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->E = 0; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->F = 1; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->LCID = + sdu_lcids[i]; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->L_MSB = + ((unsigned short) sdu_lengths[i] >> 8) & 0x7f; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->L_LSB = + (unsigned short) sdu_lengths[i] & 0xff; + ((SCH_SUBHEADER_LONG *) mac_header_ptr)->padding = 0x00; + last_size = 3; +#ifdef DEBUG_HEADER_PARSING + LOG_D(MAC, "[UE] long sdu\n"); +#endif + } + } } - if (sdu_lengths[i] < 128) { - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R = 0; // 3 - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F = 0; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID = sdu_lcids[i]; - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L = (unsigned char)sdu_lengths[i]; - last_size=2; -#ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] short sdu\n"); - LOG_T(MAC,"[UE] last subheader : %x (R%d,E%d,LCID%d,F%d,L%d)\n", - ((uint16_t*)mac_header_ptr)[0], - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->R, - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->E, - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->LCID, - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->F, - ((SCH_SUBHEADER_SHORT *)mac_header_ptr)->L); -#endif - } else { - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->R = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->E = 0; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->F = 1; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->LCID = sdu_lcids[i]; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_MSB = ((unsigned short) sdu_lengths[i]>>8)&0x7f; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->L_LSB = (unsigned short) sdu_lengths[i]&0xff; - ((SCH_SUBHEADER_LONG *)mac_header_ptr)->padding = 0x00; - last_size=3; -#ifdef DEBUG_HEADER_PARSING - LOG_D(MAC,"[UE] long sdu\n"); -#endif + if (post_padding > 0) { // we have lots of padding at the end of the packet + mac_header_ptr->E = 1; + mac_header_ptr += last_size; + // add a padding element + mac_header_ptr->R = 0; + mac_header_ptr->E = 0; + mac_header_ptr->LCID = SHORT_PADDING; + mac_header_ptr++; + } else { // no end of packet padding + // last SDU subhead is of fixed type (sdu length implicitly to be computed at UE) + mac_header_ptr++; + //mac_header_ptr=last_size; // FIXME: should be ++ } - } - if (post_padding>0) {// we have lots of padding at the end of the packet - mac_header_ptr->E = 1; - mac_header_ptr+=last_size; - // add a padding element - mac_header_ptr->R = 0; - mac_header_ptr->E = 0; - mac_header_ptr->LCID = SHORT_PADDING; - mac_header_ptr++; - } else { // no end of packet padding - // last SDU subhead is of fixed type (sdu length implicitly to be computed at UE) - mac_header_ptr++; - //mac_header_ptr=last_size; // FIXME: should be ++ - } - - if ((ce_ptr-mac_header_control_elements) > 0) { - memcpy((void*)mac_header_ptr,mac_header_control_elements,ce_ptr-mac_header_control_elements); - mac_header_ptr+=(unsigned char)(ce_ptr-mac_header_control_elements); - } + if ((ce_ptr - mac_header_control_elements) > 0) { + memcpy((void *) mac_header_ptr, mac_header_control_elements, + ce_ptr - mac_header_control_elements); + mac_header_ptr += + (unsigned char) (ce_ptr - mac_header_control_elements); + } #ifdef DEBUG_HEADER_PARSING - LOG_T(MAC," [UE %d] header : ", crnti); + LOG_T(MAC, " [UE] header : "); - for (i=0; i<((unsigned char*)mac_header_ptr - mac_header); i++) { - LOG_T(MAC,"%2x.",mac_header[i]); - } + for (i = 0; i < ((unsigned char *) mac_header_ptr - mac_header); i++) { + LOG_T(MAC, "%2x.", mac_header[i]); + } - LOG_T(MAC,"\n"); + LOG_T(MAC, "\n"); #endif - return((unsigned char*)mac_header_ptr - mac_header); + return ((unsigned char *) mac_header_ptr - mac_header); } -void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subframe, uint8_t eNB_index,uint8_t *ulsch_buffer,uint16_t buflen, uint8_t *access_mode) +void +ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP, + sub_frame_t subframe, uint8_t eNB_index, + uint8_t * ulsch_buffer, uint16_t buflen, uint8_t * access_mode) { - mac_rlc_status_resp_t rlc_status; - uint8_t dcch_header_len=0,dcch1_header_len=0,dtch_header_len=0; - uint8_t dcch_header_len_tmp=0, dtch_header_len_tmp=0; - uint8_t bsr_header_len=0, bsr_ce_len=0, bsr_len=0; - uint8_t phr_header_len=0, phr_ce_len=0,phr_len=0; - uint16_t sdu_lengths[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - uint8_t sdu_lcids[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - uint8_t payload_offset=0,num_sdus=0; - uint8_t ulsch_buff[MAX_ULSCH_PAYLOAD_BYTES]; - uint16_t sdu_length_total=0; - BSR_SHORT bsr_short; - BSR_LONG bsr_long; - BSR_SHORT *bsr_s=&bsr_short; - BSR_LONG *bsr_l=&bsr_long; - POWER_HEADROOM_CMD phr; - POWER_HEADROOM_CMD *phr_p=&phr; - unsigned short short_padding=0, post_padding=0; - int lcgid; - int j; // used for padding - // Compute header length + uint8_t total_rlc_pdu_header_len = 0, rlc_pdu_header_len_last = 0; + uint16_t buflen_remain = 0; + uint8_t bsr_len = 0, bsr_ce_len = 0, bsr_header_len = 0; + uint8_t phr_header_len = 0, phr_ce_len = 0, phr_len = 0; + uint8_t lcid = 0, lcid_rlc_pdu_count = 0; + boolean_t is_lcid_processed = FALSE; + boolean_t is_all_lcid_processed = FALSE; + uint16_t sdu_lengths[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + uint8_t sdu_lcids[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + uint8_t payload_offset = 0, num_sdus = 0; + uint8_t ulsch_buff[MAX_ULSCH_PAYLOAD_BYTES]; + uint16_t sdu_length_total = 0; + BSR_SHORT bsr_short, bsr_truncated; + BSR_LONG bsr_long; + BSR_SHORT *bsr_s = &bsr_short; + BSR_LONG *bsr_l = &bsr_long; + BSR_SHORT *bsr_t = &bsr_truncated; + POWER_HEADROOM_CMD phr; + POWER_HEADROOM_CMD *phr_p = &phr; + unsigned short short_padding = 0, post_padding = 0, padding_len = 0; + int j; // used for padding + // Compute header length + int lcg_id = 0; + int lcg_id_bsr_trunc = 0; + int highest_priority = 16; + int num_lcg_id_with_data = 0; + rlc_buffer_occupancy_t lcid_buffer_occupancy_old = + 0, lcid_buffer_occupancy_new = 0; - if (CC_id>0) { - LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return; - } + LOG_D(MAC, + "[UE %d] MAC PROCESS UL TRANSPORT BLOCK at frame%d subframe %d TBS=%d\n", + module_idP, frameP, subframe, buflen); - start_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_IN); + + AssertFatal(CC_id == 0, + "Transmission on secondary CCs is not supported yet\n"); + +#if UE_TIMING_TRACE + start_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu); +#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_IN); #ifdef CBA - if (*access_mode==CBA_ACCESS) { - LOG_D(MAC,"[UE %d] frameP %d subframe %d try CBA transmission\n", - module_idP, frameP, subframe); + if (*access_mode == CBA_ACCESS) { + LOG_D(MAC, "[UE %d] frameP %d subframe %d try CBA transmission\n", + module_idP, frameP, subframe); - //if (UE_mac_inst[module_idP].scheduling_info.LCID_status[DTCH] == LCID_EMPTY) - if (cba_access(module_idP,frameP,subframe,eNB_index,buflen)==0) { - *access_mode=POSTPONED_ACCESS; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT); - return; + //if (UE_mac_inst[module_idP].scheduling_info.LCID_status[DTCH] == LCID_EMPTY) + if (cba_access(module_idP, frameP, subframe, eNB_index, buflen) == + 0) { + *access_mode = POSTPONED_ACCESS; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT); + return; + } + + LOG_I(MAC, + "[UE %d] frameP %d subframe %d CBA transmission oppurtunity, tbs %d\n", + module_idP, frameP, subframe, buflen); } - - LOG_I(MAC,"[UE %d] frameP %d subframe %d CBA transmission oppurtunity, tbs %d\n", - module_idP, frameP, subframe,buflen); - } - #endif - dcch_header_len=2;//sizeof(SCH_SUBHEADER_SHORT); - dcch1_header_len=2;//sizeof(SCH_SUBHEADER_SHORT); - // hypo length,in case of long header skip the padding byte - dtch_header_len=(buflen > 128 ) ? 3 : 2 ; //sizeof(SCH_SUBHEADER_LONG)-1 : sizeof(SCH_SUBHEADER_SHORT); - bsr_header_len = 1;//sizeof(SCH_SUBHEADER_FIXED); - phr_header_len = 1;//sizeof(SCH_SUBHEADER_FIXED); - phr_ce_len = (UE_mac_inst[module_idP].PHR_reporting_active == 1) ? 1 /* sizeof(POWER_HEADROOM_CMD)*/: 0; + bsr_header_len = 0; + phr_header_len = 1; //sizeof(SCH_SUBHEADER_FIXED); - if (phr_ce_len > 0) { - phr_len = phr_ce_len + phr_header_len; - LOG_D(MAC,"[UE %d] header size info: PHR len %d (ce%d,hdr%d) buff_len %d\n", - module_idP, phr_len, phr_ce_len, phr_header_len, buflen); - } else { - phr_len=0; - } + while (lcg_id < MAX_NUM_LCGID) { + if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcg_id]) { + num_lcg_id_with_data++; + } + lcg_id++; + } - bsr_ce_len = get_bsr_len (module_idP, buflen-phr_len); + if (num_lcg_id_with_data) { + LOG_D(MAC, + "[UE %d] MAC Tx data pending at frame%d subframe %d nb LCG =%d Bytes for LCG0=%d LCG1=%d LCG2=%d LCG3=%d BSR Trigger status =%d TBS=%d\n", + module_idP, frameP, subframe, num_lcg_id_with_data, + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[0], + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[1], + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[2], + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[3], + UE_mac_inst[module_idP].BSR_reporting_active, buflen); + + } + //Restart ReTxBSR Timer at new grant indication (36.321) + if (UE_mac_inst[module_idP].scheduling_info.retxBSR_SF != + MAC_UE_BSR_TIMER_NOT_RUNNING) { + UE_mac_inst[module_idP].scheduling_info.retxBSR_SF = + get_sf_retxBSRTimer(UE_mac_inst[module_idP]. + scheduling_info.retxBSR_Timer); + } + // periodicBSR-Timer expires, trigger BSR + if ((UE_mac_inst[module_idP].scheduling_info.periodicBSR_Timer != + PeriodicBSR_Timer_r12_infinity) + && (UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF == 0)) { + // Trigger BSR Periodic + UE_mac_inst[module_idP].BSR_reporting_active |= + BSR_TRIGGER_PERIODIC; + + LOG_D(MAC, + "[UE %d] MAC BSR Triggered PeriodicBSR Timer expiry at frame%d subframe %d TBS=%d\n", + module_idP, frameP, subframe, buflen); + + } + //Compute BSR Length if Regular or Periodic BSR is triggered + //WARNING: if BSR long is computed, it may be changed to BSR short during or after multiplexing if there remains less than 1 LCGROUP with data after Tx + if (UE_mac_inst[module_idP].BSR_reporting_active) { + + AssertFatal((UE_mac_inst[module_idP].BSR_reporting_active & + BSR_TRIGGER_PADDING) == 0, + "Inconsistent BSR Trigger=%d !\n", + UE_mac_inst[module_idP].BSR_reporting_active); + + if (buflen >= 4) { + //A Regular or Periodic BSR can only be sent if TBS >= 4 as transmitting only a BSR is not allowed if UE has data to transmit + bsr_header_len = 1; + + if (num_lcg_id_with_data <= 1) { + bsr_ce_len = sizeof(BSR_SHORT); //1 byte + } else { + bsr_ce_len = BSR_LONG_SIZE; //3 bytes + } + } + } - if (bsr_ce_len > 0 ) { bsr_len = bsr_ce_len + bsr_header_len; - LOG_D(MAC,"[UE %d] header size info: dcch %d, dcch1 %d, dtch %d, bsr (ce%d,hdr%d) buff_len %d\n", - module_idP, dcch_header_len,dcch1_header_len,dtch_header_len, bsr_ce_len, bsr_header_len, buflen); - } else { - bsr_len=0; - //LOG_D(MAC,"[UE %d] Empty buffers, send a long BSR to reset the bsr at eNB \n ",Mod_id); - // bsr_ce_len = sizeof(BSR_LONG); - //bsr_len = bsr_ce_len + bsr_header_len; - } - // check for UL bandwidth requests and add SR control element - - // check for UL bandwidth requests and add SR control element - - // Check for DCCH first - sdu_lengths[0]=0; - - if (UE_mac_inst[module_idP].scheduling_info.LCID_status[DCCH] == LCID_NOT_EMPTY) { - - rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti, eNB_index, frameP,ENB_FLAG_NO,MBMS_FLAG_NO, // eNB_index - DCCH, - (buflen-dcch_header_len-bsr_len-phr_len)); - LOG_D(MAC, "[UE %d] Frame %d : UL-DCCH -> ULSCH, RRC message has %d bytes to " - "send (Transport Block size %d, mac header len %d)\n", - module_idP,frameP, rlc_status.bytes_in_buffer,buflen,dcch_header_len); - - sdu_lengths[0] += mac_rlc_data_req(module_idP, UE_mac_inst[module_idP].crnti,eNB_index,frameP,ENB_FLAG_NO, MBMS_FLAG_NO, - DCCH, - (char *)&ulsch_buff[sdu_lengths[0]]); - - sdu_length_total += sdu_lengths[0]; - sdu_lcids[0] = DCCH; - LOG_D(MAC,"[UE %d] TX Got %d bytes for DCCH\n",module_idP,sdu_lengths[0]); - num_sdus = 1; - update_bsr(module_idP, frameP, eNB_index, DCCH, UE_mac_inst[module_idP].scheduling_info.LCGID[DCCH]); - //header_len +=2; - } else { - dcch_header_len=0; - num_sdus = 0; - } - - // if the RLC AM is used, then RLC will only provide 2 bytes for ACK - // in this case, we sould add bsr - - - // DCCH1 - if (UE_mac_inst[module_idP].scheduling_info.LCID_status[DCCH1] == LCID_NOT_EMPTY) { - - rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti, eNB_index,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, // eNB_index - DCCH1, - (buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-sdu_length_total)); - - LOG_D(MAC,"[UE %d] Frame %d : UL-DCCH1 -> ULSCH, RRC message has %d bytes to" - " send (Transport Block size %d, mac header len %d)\n", - module_idP,frameP, rlc_status.bytes_in_buffer,buflen,dcch1_header_len); - - sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, UE_mac_inst[module_idP].crnti,eNB_index,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, - DCCH1, - (char *)&ulsch_buff[sdu_lengths[0]]); - sdu_length_total += sdu_lengths[num_sdus]; - sdu_lcids[num_sdus] = DCCH1; - LOG_D(MAC,"[UE %d] TX Got %d bytes for DCCH1\n",module_idP,sdu_lengths[num_sdus]); - num_sdus++; - //update_bsr(module_idP, frameP, DCCH1); - //dcch_header_len +=2; // include dcch1 - } else { - dcch1_header_len =0; - } - - if ((UE_mac_inst[module_idP].scheduling_info.LCID_status[DTCH] == LCID_NOT_EMPTY) && - ((bsr_len+phr_len+dcch_header_len+dcch1_header_len+dtch_header_len+sdu_length_total) <= buflen)) { - - // optimize the dtch header lenght - //if ((UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH] > 128) && - /* if (((UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH] >= 128) && - ((UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH]+bsr_len+phr_len+dcch_header_len+dcch1_header_len+dtch_header_len) > buflen)&& - buflen >=128 )) - dtch_header_len = 3;//sizeof(SCH_SUBHEADER_LONG); - else - dtch_header_len = 2;//sizeof(SCH_SUBHEADER_SHORT); - */ - rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti, eNB_index,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, // eNB_index - DTCH, - buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total); - - LOG_D(MAC,"[UE %d] Frame %d : UL-DTCH -> ULSCH, %d bytes to send (Transport Block size %d, mac header len %d, BSR byte[DTCH] %d)\n", - module_idP,frameP, rlc_status.bytes_in_buffer,buflen,dtch_header_len, - UE_mac_inst[module_idP].scheduling_info.BSR_bytes[DTCH]); - - sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP,UE_mac_inst[module_idP].crnti,eNB_index,frameP, ENB_FLAG_NO, MBMS_FLAG_NO, // eNB_index - DTCH, - (char *)&ulsch_buff[sdu_length_total]); - - //adjust dtch header - dtch_header_len = (sdu_lengths[num_sdus] >= 128) ? 3 : 2; - LOG_D(MAC,"[UE %d] TX Got %d bytes for DTCH\n",module_idP,sdu_lengths[num_sdus]); - sdu_lcids[num_sdus] = DTCH; - sdu_length_total += sdu_lengths[num_sdus]; - num_sdus++; - UE_mac_inst[module_idP].ul_active = update_bsr(module_idP, frameP, eNB_index,DTCH, UE_mac_inst[module_idP].scheduling_info.LCGID[DTCH]); - } else { // no rlc pdu : generate the dummy header - dtch_header_len = 0; - } - - lcgid= get_bsr_lcgid(module_idP); - - if (lcgid < 0 ) { - bsr_s = NULL; - bsr_l = NULL ; - } else if ((lcgid ==MAX_NUM_LCGID) && (bsr_ce_len == sizeof(BSR_LONG))) { - bsr_s = NULL; - bsr_l->Buffer_size0 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0]; - bsr_l->Buffer_size1 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]; - bsr_l->Buffer_size2 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]; - bsr_l->Buffer_size3 = UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]; - LOG_D(MAC, "[UE %d] Frame %d report long BSR (level LCGID0 %d,level LCGID1 %d,level LCGID2 %d,level LCGID3 %d)\n", module_idP,frameP, - UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0], - UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1], - UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2], - UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]); - } else if (bsr_ce_len == sizeof(BSR_SHORT)) { - bsr_l = NULL; - bsr_s->LCGID = lcgid; - bsr_s->Buffer_size = UE_mac_inst[module_idP].scheduling_info.BSR[lcgid]; - LOG_D(MAC,"[UE %d] Frame %d report SHORT BSR with level %d for LCGID %d\n", - module_idP, frameP, UE_mac_inst[module_idP].scheduling_info.BSR[lcgid],lcgid); - } else { - bsr_s = NULL; - bsr_l = NULL; - } - - // build PHR and update the timers - if (phr_ce_len == sizeof(POWER_HEADROOM_CMD)) { - phr_p->PH = get_phr_mapping(module_idP,CC_id,eNB_index); - phr_p->R = 0; - LOG_D(MAC,"[UE %d] Frame %d report PHR with mapping (%d->%d) for LCID %d\n", - module_idP,frameP, mac_xface->get_PHR(module_idP,CC_id,eNB_index), phr_p->PH,POWER_HEADROOM); - update_phr(module_idP,CC_id); - } else { - phr_p=NULL; - } - - LOG_T(MAC,"[UE %d] Frame %d: bsr s %p bsr_l %p, phr_p %p\n", module_idP,frameP,bsr_s, bsr_l, phr_p); - - // adjust the header length - dcch_header_len_tmp = dcch_header_len; - dtch_header_len_tmp = dtch_header_len; - - if (dtch_header_len==0) { - dcch_header_len = (dcch_header_len>0)? 1: dcch_header_len; - } else { - dtch_header_len= (dtch_header_len >0)? 1: dtch_header_len; // for short and long, cut the length+F fields - } - - if ((buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total) <= 2) { - short_padding = buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total; - post_padding = 0; - } else { - if ((buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total) == buflen) { - *access_mode=CANCELED_ACCESS; - } - - short_padding = 0; - - if (dtch_header_len==0) { - dcch_header_len = dcch_header_len_tmp; + phr_ce_len = + (UE_mac_inst[module_idP].PHR_reporting_active == + 1) ? 1 /* sizeof(POWER_HEADROOM_CMD) */ : 0; + if ((phr_ce_len > 0) + && ((phr_ce_len + phr_header_len + bsr_len) <= buflen)) { + phr_len = phr_ce_len + phr_header_len; + LOG_D(MAC, + "[UE %d] header size info: PHR len %d (ce%d,hdr%d) buff_len %d\n", + module_idP, phr_len, phr_ce_len, phr_header_len, buflen); } else { - dtch_header_len= dtch_header_len_tmp; + phr_len = 0; + phr_header_len = 0; + phr_ce_len = 0; } - post_padding = buflen-bsr_len-phr_len-dcch_header_len-dcch1_header_len-dtch_header_len-sdu_length_total -1 ; - } + // check for UL bandwidth requests and add SR control element - // Generate header - // if (num_sdus>0) { + // check for UL bandwidth requests and add SR control element - payload_offset = generate_ulsch_header(ulsch_buffer, // mac header - num_sdus, // num sdus - short_padding, // short pading - sdu_lengths, // sdu length - sdu_lcids, // sdu lcid - phr_p, // power headroom - NULL, // crnti - NULL, // truncated bsr - bsr_s, // short bsr - bsr_l, - post_padding); // long_bsr + // Check for DCCH first +// TO DO: Multiplex in the order defined by the logical channel prioritization + for (lcid = DCCH; + (lcid < MAX_NUM_LCID) && (is_all_lcid_processed == FALSE); lcid++) + { + if (UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] == + LCID_NOT_EMPTY) { - LOG_D(MAC, - "[UE %d] Generate header :bufflen %d sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d, dcch_header_len %d, dtch_header_len %d, padding %d,post_padding %d, bsr len %d, phr len %d, reminder %d \n", - module_idP,buflen, sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],payload_offset, dcch_header_len, dtch_header_len, - short_padding,post_padding, bsr_len, phr_len,buflen-sdu_length_total-payload_offset); - // cycle through SDUs and place in ulsch_buffer - memcpy(&ulsch_buffer[payload_offset],ulsch_buff,sdu_length_total); + lcid_rlc_pdu_count = 0; + is_lcid_processed = FALSE; + lcid_buffer_occupancy_old = + mac_rlc_get_buffer_occupancy_ind(module_idP, + UE_mac_inst[module_idP]. + crnti, eNB_index, frameP, + subframe, ENB_FLAG_NO, + lcid); - // fill remainder of DLSCH with random data - for (j=0; j<(buflen-sdu_length_total-payload_offset); j++) { - ulsch_buffer[payload_offset+sdu_length_total+j] = (char)(taus()&0xff); - } - LOG_D(MAC,"[UE %d][SR] Gave SDU to PHY, clearing any scheduling request\n", - module_idP,payload_offset, sdu_length_total); - UE_mac_inst[module_idP].scheduling_info.SR_pending=0; - UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT); - stop_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu); - - if (opt_enabled) { - trace_pdu(0, ulsch_buffer, buflen, module_idP, 3, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].subframe, 0, 0); - LOG_D(OPT,"[UE %d][ULSCH] Frame %d trace pdu for rnti %x with size %d\n", - module_idP, UE_mac_inst[module_idP].subframe, UE_mac_inst[module_idP].crnti, buflen); - } + lcid_buffer_occupancy_new = lcid_buffer_occupancy_old; + + AssertFatal(lcid_buffer_occupancy_new == + UE_mac_inst[module_idP]. + scheduling_info.LCID_buffer_remain[lcid], + "LCID=%d RLC has BO %d bytes but MAC has stored %d bytes\n", + lcid, lcid_buffer_occupancy_new, + UE_mac_inst[module_idP]. + scheduling_info.LCID_buffer_remain[lcid]); + + AssertFatal(lcid_buffer_occupancy_new <= + UE_mac_inst[module_idP]. + scheduling_info.BSR_bytes[UE_mac_inst[module_idP]. + scheduling_info.LCGID + [lcid]], + "LCID=%d RLC has more BO %d bytes than BSR = %d bytes\n", + lcid, lcid_buffer_occupancy_new, + UE_mac_inst[module_idP]. + scheduling_info.BSR_bytes[UE_mac_inst[module_idP]. + scheduling_info.LCGID + [lcid]]); + + + //Multiplex all available DCCH RLC PDUs considering to multiplex the last PDU each time for maximize the data + //Adjust at the end of the loop + while ((!is_lcid_processed) && (lcid_buffer_occupancy_new) + && (bsr_len + phr_len + total_rlc_pdu_header_len + + sdu_length_total + MIN_MAC_HDR_RLC_SIZE <= buflen)) + { + + // Workaround for issue in OAI eNB or EPC which are not able to process SRB2 message multiplexed with SRB1 on the same MAC PDU + if ((usim_test == 0) && (lcid == DCCH1) + && (lcid_rlc_pdu_count == 0) && (num_sdus)) { + + // Skip SRB2 multiplex if at least one SRB1 SDU is already multiplexed + break; + } + + buflen_remain = + buflen - (bsr_len + phr_len + + total_rlc_pdu_header_len + sdu_length_total + + 1); + + + LOG_D(MAC, + "[UE %d] Frame %d : UL-DXCH -> ULSCH, RLC %d has %d bytes to " + "send (Transport Block size %d BSR size=%d PHR=%d SDU Length Total %d , mac header len %d BSR byte before Tx=%d)\n", + module_idP, frameP, lcid, lcid_buffer_occupancy_new, + buflen, bsr_len, phr_len, sdu_length_total, + total_rlc_pdu_header_len, + UE_mac_inst[module_idP]. + scheduling_info.BSR_bytes[UE_mac_inst[module_idP]. + scheduling_info.LCGID + [lcid]]); + + + sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP, + UE_mac_inst + [module_idP]. + crnti, eNB_index, + frameP, + ENB_FLAG_NO, + MBMS_FLAG_NO, + lcid, + buflen_remain, + (char *) + &ulsch_buff + [sdu_length_total]); + + + AssertFatal(buflen_remain >= sdu_lengths[num_sdus], + "LCID=%d RLC has segmented %d bytes but MAC has max=%d\n", + lcid, sdu_lengths[num_sdus], buflen_remain); + + + if (sdu_lengths[num_sdus]) { + sdu_length_total += sdu_lengths[num_sdus]; + sdu_lcids[num_sdus] = lcid; + LOG_D(MAC, + "[UE %d] TX Multiplex RLC PDU TX Got %d bytes for LcId%d\n", + module_idP, sdu_lengths[num_sdus], lcid); + + if (buflen == + (bsr_len + phr_len + total_rlc_pdu_header_len + + sdu_length_total + 1)) { + //No more remaining TBS after this PDU + //exit the function + rlc_pdu_header_len_last = 1; + is_lcid_processed = TRUE; + is_all_lcid_processed = TRUE; + } else { + rlc_pdu_header_len_last = + (sdu_lengths[num_sdus] > 128) ? 3 : 2; + + //Change to 1 byte if it does not fit in the TBS, ie last PDU + if (buflen <= + (bsr_len + phr_len + total_rlc_pdu_header_len + + rlc_pdu_header_len_last + sdu_length_total)) { + rlc_pdu_header_len_last = 1; + is_lcid_processed = TRUE; + is_all_lcid_processed = TRUE; + } + } + + //Update number of SDU + num_sdus++; + + //Update total MAC Header size for RLC PDUs and save last one + total_rlc_pdu_header_len += rlc_pdu_header_len_last; + + lcid_rlc_pdu_count++; + } else { + /* avoid infinite loop ... */ + is_lcid_processed = TRUE; + } + + /* Get updated BO after multiplexing this PDU */ + lcid_buffer_occupancy_new = + mac_rlc_get_buffer_occupancy_ind(module_idP, + UE_mac_inst + [module_idP].crnti, + eNB_index, frameP, + subframe, ENB_FLAG_NO, + lcid); + + is_lcid_processed = (is_lcid_processed) + || (lcid_buffer_occupancy_new <= 0); + } + + //Update Buffer remain and BSR bytes after transmission + + AssertFatal(lcid_buffer_occupancy_new <= + lcid_buffer_occupancy_old, + "MAC UE Tx error : Buffer Occupancy After Tx=%d greater than before=%d BO! for LCID=%d RLC PDU nb=%d Frame %d Subrame %d\n", + lcid_buffer_occupancy_new, + lcid_buffer_occupancy_old, lcid, + lcid_rlc_pdu_count, frameP, subframe); + + UE_mac_inst[module_idP].scheduling_info. + LCID_buffer_remain[lcid] = lcid_buffer_occupancy_new; + UE_mac_inst[module_idP]. + scheduling_info.BSR_bytes[UE_mac_inst[module_idP]. + scheduling_info.LCGID[lcid]] += + (lcid_buffer_occupancy_new - lcid_buffer_occupancy_old); + + //Update the number of LCGID with data as BSR shall reflect status after BSR transmission + if ((num_lcg_id_with_data > 1) + && (UE_mac_inst[module_idP]. + scheduling_info.BSR_bytes[UE_mac_inst[module_idP]. + scheduling_info.LCGID[lcid]] + == 0)) { + num_lcg_id_with_data--; + // Change BSR size to BSR SHORT if num_lcg_id_with_data becomes to 1 + if ((bsr_len) && (num_lcg_id_with_data == 1)) { + bsr_ce_len = sizeof(BSR_SHORT); + bsr_len = bsr_ce_len + bsr_header_len; + } + } + + + UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] = + LCID_EMPTY; + } + } + + + + // Compute BSR Values and update Nb LCGID with data after multiplexing + num_lcg_id_with_data = 0; + lcg_id_bsr_trunc = 0; + for (lcg_id = 0; lcg_id < MAX_NUM_LCGID; lcg_id++) { + UE_mac_inst[module_idP].scheduling_info.BSR[lcg_id] = + locate_BsrIndexByBufferSize(BSR_TABLE, BSR_TABLE_SIZE, + UE_mac_inst + [module_idP].scheduling_info. + BSR_bytes[lcg_id]); + + if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcg_id]) { + num_lcg_id_with_data++; + lcg_id_bsr_trunc = lcg_id; + } + } + + + if (bsr_ce_len) { + //Print updated BSR when sent + LOG_D(MAC, + "[UE %d] Remaining Buffer after Tx frame%d subframe %d nb LCG =%d Bytes for LCG0=%d LCG1=%d LCG2=%d LCG3=%d BSR Trigger status =%d TBS=%d\n", + module_idP, frameP, subframe, num_lcg_id_with_data, + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[0], + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[1], + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[2], + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[3], + UE_mac_inst[module_idP].BSR_reporting_active, buflen); + + LOG_D(MAC, + "[UE %d] Frame %d Subframe %d TX BSR Regular or Periodic size=%d BSR0=%d BSR1=%d BSR2=%d BSR3=%d\n", + module_idP, frameP, subframe, bsr_ce_len, + UE_mac_inst[module_idP].scheduling_info.BSR[0], + UE_mac_inst[module_idP].scheduling_info.BSR[1], + UE_mac_inst[module_idP].scheduling_info.BSR[2], + UE_mac_inst[module_idP].scheduling_info.BSR[3]); + } + // build PHR and update the timers + if (phr_ce_len == sizeof(POWER_HEADROOM_CMD)) { + phr_p->PH = get_phr_mapping(module_idP, CC_id, eNB_index); + phr_p->R = 0; + LOG_D(MAC, + "[UE %d] Frame %d report PHR with mapping (%d->%d) for LCID %d\n", + module_idP, frameP, get_PHR(module_idP, CC_id, eNB_index), + phr_p->PH, POWER_HEADROOM); + update_phr(module_idP, CC_id); + } else { + phr_p = NULL; + } + + LOG_T(MAC, "[UE %d] Frame %d: bsr s %p bsr_l %p, phr_p %p\n", + module_idP, frameP, bsr_s, bsr_l, phr_p); + + + // Check BSR padding: it is done after PHR according to Logical Channel Prioritization order + // Check for max padding size, ie MAC Hdr for last RLC PDU = 1 + /* For Padding BSR: + - if the number of padding bits is equal to or larger than the size of the Short BSR plus its subheader but smaller than the size of the Long BSR plus its subheader: + - if more than one LCG has data available for transmission in the TTI where the BSR is transmitted: report Truncated BSR of the LCG with the highest priority logical channel with data available for transmission; + - else report Short BSR. + - else if the number of padding bits is equal to or larger than the size of the Long BSR plus its subheader, report Long BSR. + */ + if (sdu_length_total) { + padding_len = + buflen - (bsr_len + phr_len + total_rlc_pdu_header_len - + rlc_pdu_header_len_last + sdu_length_total + 1); + } else { + padding_len = buflen - (bsr_len + phr_len); + } + + + if ((padding_len) && (bsr_len == 0)) { + /* if the number of padding bits is equal to or larger than the size of the Long BSR plus its subheader, report Long BSR */ + if (padding_len >= (1 + BSR_LONG_SIZE)) { + bsr_ce_len = BSR_LONG_SIZE; + bsr_header_len = 1; + // Trigger BSR Padding + UE_mac_inst[module_idP].BSR_reporting_active |= + BSR_TRIGGER_PADDING; + + + } else if (padding_len >= (1 + sizeof(BSR_SHORT))) { + bsr_ce_len = sizeof(BSR_SHORT); + bsr_header_len = 1; + + if (num_lcg_id_with_data > 1) { + // REPORT TRUNCATED BSR + //Get LCGID of highest priority LCID with data + for (lcid = DCCH; lcid < MAX_NUM_LCID; lcid++) { + if (UE_mac_inst[module_idP]. + logicalChannelConfig[lcid] != NULL) { + lcg_id = + UE_mac_inst[module_idP].scheduling_info. + LCGID[lcid]; + + if ((lcg_id < MAX_NUM_LCGID) + && (UE_mac_inst[module_idP]. + scheduling_info.BSR_bytes[lcg_id]) + && + (UE_mac_inst[module_idP].logicalChannelConfig + [lcid]->ul_SpecificParameters->priority <= + highest_priority)) { + highest_priority = + UE_mac_inst[module_idP]. + logicalChannelConfig[lcid]-> + ul_SpecificParameters->priority; + lcg_id_bsr_trunc = lcg_id; + } + } + } + } else { + //Report SHORT BSR, clear bsr_t + bsr_t = NULL; + } + + // Trigger BSR Padding + UE_mac_inst[module_idP].BSR_reporting_active |= + BSR_TRIGGER_PADDING; + } + bsr_len = bsr_header_len + bsr_ce_len; + } + //Fill BSR Infos + if (bsr_ce_len == 0) { + bsr_s = NULL; + bsr_l = NULL; + bsr_t = NULL; + } else if (bsr_ce_len == BSR_LONG_SIZE) { + bsr_s = NULL; + bsr_t = NULL; + bsr_l->Buffer_size0 = + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0]; + bsr_l->Buffer_size1 = + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]; + bsr_l->Buffer_size2 = + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]; + bsr_l->Buffer_size3 = + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]; + + LOG_D(MAC, + "[UE %d] Frame %d subframe %d BSR Trig=%d report long BSR (level LCGID0 %d,level LCGID1 %d,level LCGID2 %d,level LCGID3 %d)\n", + module_idP, frameP, subframe, + UE_mac_inst[module_idP].BSR_reporting_active, + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0], + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1], + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2], + UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]); + + } else if (bsr_ce_len == sizeof(BSR_SHORT)) { + bsr_l = NULL; + if ((bsr_t != NULL) + && (UE_mac_inst[module_idP].BSR_reporting_active & + BSR_TRIGGER_PADDING)) { + //Truncated BSR + bsr_s = NULL; + bsr_t->LCGID = lcg_id_bsr_trunc; + bsr_t->Buffer_size = + UE_mac_inst[module_idP].scheduling_info. + BSR[lcg_id_bsr_trunc]; + + LOG_D(MAC, + "[UE %d] Frame %d subframe %d BSR Trig=%d report TRUNCATED BSR with level %d for LCGID %d\n", + module_idP, frameP, subframe, + UE_mac_inst[module_idP].BSR_reporting_active, + UE_mac_inst[module_idP]. + scheduling_info.BSR[lcg_id_bsr_trunc], lcg_id_bsr_trunc); + + } else { + bsr_t = NULL; + bsr_s->LCGID = lcg_id_bsr_trunc; + bsr_s->Buffer_size = + UE_mac_inst[module_idP].scheduling_info. + BSR[lcg_id_bsr_trunc]; + + LOG_D(MAC, + "[UE %d] Frame %d subframe %d BSR Trig=%d report SHORT BSR with level %d for LCGID %d\n", + module_idP, frameP, subframe, + UE_mac_inst[module_idP].BSR_reporting_active, + UE_mac_inst[module_idP]. + scheduling_info.BSR[lcg_id_bsr_trunc], lcg_id_bsr_trunc); + } + } +// 1-bit padding or 2-bit padding special padding subheader +// Check for max padding size, ie MAC Hdr for last RLC PDU = 1 + if (sdu_length_total) { + padding_len = + buflen - (bsr_len + phr_len + total_rlc_pdu_header_len - + rlc_pdu_header_len_last + sdu_length_total + 1); + } else { + padding_len = buflen - (bsr_len + phr_len); + } + + if (padding_len <= 2) { + short_padding = padding_len; + // only add padding header + post_padding = 0; + //update total MAC Hdr size for RLC data + if (sdu_length_total) { + total_rlc_pdu_header_len = + total_rlc_pdu_header_len - rlc_pdu_header_len_last + 1; + rlc_pdu_header_len_last = 1; + } + } else if (sdu_length_total) { + post_padding = + buflen - (bsr_len + phr_len + total_rlc_pdu_header_len + + sdu_length_total + 1); + // If by adding MAC Hdr for last RLC PDU the padding is 0 then set MAC Hdr for last RLC PDU = 1 and compute 1 or 2 byte padding + if (post_padding == 0) { + total_rlc_pdu_header_len -= rlc_pdu_header_len_last; + padding_len = + buflen - (bsr_len + phr_len + total_rlc_pdu_header_len + + sdu_length_total + 1); + short_padding = padding_len; + total_rlc_pdu_header_len++; + } + } else { + if (padding_len == buflen) { // nona mac pdu + *access_mode = CANCELED_ACCESS; + } + + short_padding = 0; + + post_padding = + buflen - (bsr_len + phr_len + total_rlc_pdu_header_len + + sdu_length_total + 1); + } + + // Generate header + // if (num_sdus>0) { + + payload_offset = generate_ulsch_header(ulsch_buffer, // mac header + num_sdus, // num sdus + short_padding, // short pading + sdu_lengths, // sdu length + sdu_lcids, // sdu lcid + phr_p, // power headroom + NULL, // crnti + bsr_t, // truncated bsr + bsr_s, // short bsr + bsr_l, post_padding); // long_bsr + + LOG_D(MAC, + "[UE %d] Generate header :bufflen %d sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d, total_rlc_pdu_header_len %d, padding %d,post_padding %d, bsr len %d, phr len %d, reminder %d \n", + module_idP, buflen, sdu_length_total, num_sdus, sdu_lengths[0], + sdu_lcids[0], payload_offset, total_rlc_pdu_header_len, + short_padding, post_padding, bsr_len, phr_len, + buflen - sdu_length_total - payload_offset); + // cycle through SDUs and place in ulsch_buffer + if (sdu_length_total) { + memcpy(&ulsch_buffer[payload_offset], ulsch_buff, + sdu_length_total); + } + // fill remainder of DLSCH with random data + if (post_padding) { + for (j = 0; j < (buflen - sdu_length_total - payload_offset); j++) { + ulsch_buffer[payload_offset + sdu_length_total + j] = + (char) (taus() & 0xff); + } + } + LOG_D(MAC, + "[UE %d][SR] Gave SDU to PHY, clearing any scheduling request\n", + module_idP); + UE_mac_inst[module_idP].scheduling_info.SR_pending = 0; + UE_mac_inst[module_idP].scheduling_info.SR_COUNTER = 0; + + /* Actions when a BSR is sent */ + if (bsr_ce_len) { + LOG_D(MAC, + "[UE %d] MAC BSR Sent !! bsr (ce%d,hdr%d) buff_len %d\n", + module_idP, bsr_ce_len, bsr_header_len, buflen); + + // Reset ReTx BSR Timer + UE_mac_inst[module_idP].scheduling_info.retxBSR_SF = + get_sf_retxBSRTimer(UE_mac_inst[module_idP]. + scheduling_info.retxBSR_Timer); + + LOG_D(MAC, "[UE %d] MAC ReTx BSR Timer Reset =%d\n", module_idP, + UE_mac_inst[module_idP].scheduling_info.retxBSR_SF); + + // Reset Periodic Timer except when BSR is truncated + if ((bsr_t == NULL) + && (UE_mac_inst[module_idP].scheduling_info. + periodicBSR_Timer != PeriodicBSR_Timer_r12_infinity)) { + UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF = + get_sf_periodicBSRTimer(UE_mac_inst + [module_idP].scheduling_info. + periodicBSR_Timer); + + LOG_D(MAC, "[UE %d] MAC Periodic BSR Timer Reset =%d\n", + module_idP, + UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF); + + } + // Reset BSR Trigger flags + UE_mac_inst[module_idP].BSR_reporting_active = BSR_TRIGGER_NONE; + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu); +#endif + + if (opt_enabled) { + trace_pdu(0, ulsch_buffer, buflen, module_idP, 3, + UE_mac_inst[module_idP].crnti, + UE_mac_inst[module_idP].txFrame, + UE_mac_inst[module_idP].txSubframe, 0, 0); + LOG_D(OPT, + "[UE %d][ULSCH] Frame %d subframe %d trace pdu for rnti %x with size %d\n", + module_idP, frameP, subframe, UE_mac_inst[module_idP].crnti, + buflen); + } } //------------------------------------------------------------------------------ @@ -1484,237 +2148,327 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf // 4. Perform PHR procedures UE_L2_STATE_t -ue_scheduler( - const module_id_t module_idP, - const frame_t frameP, - const sub_frame_t subframeP, - const lte_subframe_t directionP, - const uint8_t eNB_indexP, - const int CC_id) +ue_scheduler(const module_id_t module_idP, + const frame_t rxFrameP, + const sub_frame_t rxSubframeP, + const frame_t txFrameP, + const sub_frame_t txSubframeP, + const lte_subframe_t directionP, + const uint8_t eNB_indexP, const int CC_id) //------------------------------------------------------------------------------ { + int lcid; // lcid index + int TTI = 1; + int bucketsizeduration = -1; + int bucketsizeduration_max = -1; + // mac_rlc_status_resp_t rlc_status[MAX_NUM_LCGID]; // 4 + // int8_t lcg_id; + struct RACH_ConfigCommon *rach_ConfigCommon = + (struct RACH_ConfigCommon *) NULL; + protocol_ctxt_t ctxt; - int lcid; // lcid index - int TTI= 1; - int bucketsizeduration = -1; - int bucketsizeduration_max = -1; - // mac_rlc_status_resp_t rlc_status[MAX_NUM_LCGID]; // 4 - // int8_t lcg_id; - struct RACH_ConfigCommon *rach_ConfigCommon = (struct RACH_ConfigCommon *)NULL; - protocol_ctxt_t ctxt; #if defined(ENABLE_ITTI) - MessageDef *msg_p; - const char *msg_name; - instance_t instance; - int result; + MessageDef *msg_p; + const char *msg_name; + instance_t instance; + int result; #endif - start_meas(&UE_mac_inst[module_idP].ue_scheduler); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_IN); +#if UE_TIMING_TRACE + start_meas(&UE_mac_inst[module_idP].ue_scheduler); +#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_IN); - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_NO, UE_mac_inst[module_idP].crnti, frameP, subframeP,eNB_indexP); + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_NO, + UE_mac_inst[module_idP].crnti, txFrameP, + txSubframeP, eNB_indexP); #if defined(ENABLE_ITTI) - do { - // Checks if a message has been sent to MAC sub-task - itti_poll_msg (TASK_MAC_UE, &msg_p); + do { + // Checks if a message has been sent to MAC sub-task + itti_poll_msg(TASK_MAC_UE, &msg_p); - if (msg_p != NULL) { - msg_name = ITTI_MSG_NAME (msg_p); - instance = ITTI_MSG_INSTANCE (msg_p); + if (msg_p != NULL) { + msg_name = ITTI_MSG_NAME(msg_p); + instance = ITTI_MSG_INSTANCE(msg_p); - switch (ITTI_MSG_ID(msg_p)) { - case RRC_MAC_CCCH_DATA_REQ: - LOG_I(MAC, "Received %s from %s: instance %d, frameP %d, eNB_index %d\n", - msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance, - RRC_MAC_CCCH_DATA_REQ (msg_p).frame, RRC_MAC_CCCH_DATA_REQ (msg_p).enb_index); + switch (ITTI_MSG_ID(msg_p)) { + case RRC_MAC_CCCH_DATA_REQ: + LOG_I(MAC, + "Received %s from %s: instance %d, frameP %d, eNB_index %d\n", + msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), instance, + RRC_MAC_CCCH_DATA_REQ(msg_p).frame, + RRC_MAC_CCCH_DATA_REQ(msg_p).enb_index); - // TODO process CCCH data req. - break; + // TODO process CCCH data req. + break; - default: - LOG_E(MAC, "Received unexpected message %s\n", msg_name); - break; - } + default: + LOG_E(MAC, "Received unexpected message %s\n", msg_name); + break; + } - result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), msg_p); + AssertFatal(result == EXIT_SUCCESS, + "Failed to free memory (%d)!\n", result); + } } - } while(msg_p != NULL); + while (msg_p != NULL); #endif - //Mac_rlc_xface->frameP=frameP; - //Rrc_xface->Frame_index=Mac_rlc_xface->frameP; - //if (subframe%5 == 0) - //LG#ifdef EXMIMO - pdcp_run(&ctxt); - //#endif - UE_mac_inst[module_idP].frame = frameP; - UE_mac_inst[module_idP].subframe = subframeP; + //Mac_rlc_xface->frameP=frameP; + //Rrc_xface->Frame_index=Mac_rlc_xface->frameP; + //if (subframe%5 == 0) + //LG#ifdef EXMIMO + pdcp_run(&ctxt); + //#endif + UE_mac_inst[module_idP].txFrame = txFrameP; + UE_mac_inst[module_idP].txSubframe = txSubframeP; + UE_mac_inst[module_idP].rxFrame = rxFrameP; + UE_mac_inst[module_idP].rxSubframe = rxSubframeP; #ifdef CELLULAR - rrc_rx_tx(module_idP, frameP, 0, eNB_indexP); + rrc_rx_tx_ue(module_idP, txFrameP, 0, eNB_indexP); #else - switch (rrc_rx_tx(&ctxt, - eNB_indexP, - CC_id)) { - case RRC_OK: - break; + switch (rrc_rx_tx_ue(&ctxt, eNB_indexP, CC_id)) { + case RRC_OK: + break; - case RRC_ConnSetup_failed: - LOG_E(MAC,"RRCConnectionSetup failed, returning to IDLE state\n"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); - stop_meas(&UE_mac_inst[module_idP].ue_scheduler); - return(CONNECTION_LOST); - break; + case RRC_ConnSetup_failed: + LOG_E(MAC, "RRCConnectionSetup failed, returning to IDLE state\n"); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); +#endif + return (CONNECTION_LOST); + break; - case RRC_PHY_RESYNCH: - LOG_E(MAC,"RRC Loss of synch, returning PHY_RESYNCH\n"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); - stop_meas(&UE_mac_inst[module_idP].ue_scheduler); - return(PHY_RESYNCH); + case RRC_PHY_RESYNCH: + LOG_E(MAC, "RRC Loss of synch, returning PHY_RESYNCH\n"); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); +#endif + return (PHY_RESYNCH); - case RRC_Handover_failed: - LOG_N(MAC,"Handover failure for UE %d eNB_index %d\n",module_idP,eNB_indexP); - //Invalid...need to add another MAC UE state for re-connection procedure - mac_xface->phy_config_afterHO_ue(module_idP,0,eNB_indexP,(MobilityControlInfo_t *)NULL,1); - //return(3); - break; + case RRC_Handover_failed: + LOG_N(MAC, "Handover failure for UE %d eNB_index %d\n", module_idP, + eNB_indexP); + //Invalid...need to add another MAC UE state for re-connection procedure + phy_config_afterHO_ue(module_idP, 0, eNB_indexP, + (MobilityControlInfo_t *) NULL, 1); + //return(3); + break; - case RRC_HO_STARTED: - LOG_I(MAC,"RRC handover, Instruct PHY to start the contention-free PRACH and synchronization\n"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); - stop_meas(&UE_mac_inst[module_idP].ue_scheduler); - return(PHY_HO_PRACH); + case RRC_HO_STARTED: + LOG_I(MAC, + "RRC handover, Instruct PHY to start the contention-free PRACH and synchronization\n"); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); +#endif + return (PHY_HO_PRACH); - default: - break; - } + default: + break; + } #endif - // Check Contention resolution timer (put in a function later) - if (UE_mac_inst[module_idP].RA_contention_resolution_timer_active == 1) { + // Check Contention resolution timer (put in a function later) + if (UE_mac_inst[module_idP].RA_contention_resolution_timer_active == 1) { - if (UE_mac_inst[module_idP].radioResourceConfigCommon) { - rach_ConfigCommon = &UE_mac_inst[module_idP].radioResourceConfigCommon->rach_ConfigCommon; - } else { - LOG_E(MAC,"FATAL: radioResourceConfigCommon is NULL!!!\n"); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); - stop_meas(&UE_mac_inst[module_idP].ue_scheduler); - mac_xface->macphy_exit(""); - //return(RRC_OK); + if (UE_mac_inst[module_idP].radioResourceConfigCommon) { + rach_ConfigCommon = + &UE_mac_inst[module_idP]. + radioResourceConfigCommon->rach_ConfigCommon; + } else { + LOG_E(MAC, "FATAL: radioResourceConfigCommon is NULL!!!\n"); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, + VCD_FUNCTION_OUT); + + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); + AssertFatal(1 == 0, ""); + +#if UE_TIMING_TRACE + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); +#endif + //return(RRC_OK); + } + + LOG_I(MAC, "Frame %d: Contention resolution timer %d/%ld\n", + txFrameP, + UE_mac_inst[module_idP].RA_contention_resolution_cnt, + ((1 + + rach_ConfigCommon-> + ra_SupervisionInfo.mac_ContentionResolutionTimer) << 3)); + + UE_mac_inst[module_idP].RA_contention_resolution_cnt++; + + if (UE_mac_inst[module_idP].RA_contention_resolution_cnt == + ((1 + + rach_ConfigCommon-> + ra_SupervisionInfo.mac_ContentionResolutionTimer) << 3)) { + UE_mac_inst[module_idP].RA_active = 0; + UE_mac_inst[module_idP].RA_contention_resolution_timer_active = + 0; + // Signal PHY to quit RA procedure + LOG_E(MAC, + "Module id %u Contention resolution timer expired, RA failed\n", + module_idP); + ra_failed(module_idP, 0, eNB_indexP); + } + } + // Get RLC status info and update Bj for all lcids that are active + for (lcid = DCCH; lcid < MAX_NUM_LCID; lcid++) { + if (UE_mac_inst[module_idP].logicalChannelConfig[lcid]) { + // meausre the Bj + if ((directionP == SF_UL) + && (UE_mac_inst[module_idP].scheduling_info.Bj[lcid] >= 0)) { + if (UE_mac_inst[module_idP]. + logicalChannelConfig[lcid]->ul_SpecificParameters) { + bucketsizeduration = + UE_mac_inst[module_idP].logicalChannelConfig + [lcid]->ul_SpecificParameters->prioritisedBitRate * + TTI; + bucketsizeduration_max = + get_ms_bucketsizeduration(UE_mac_inst + [module_idP].logicalChannelConfig + [lcid]->ul_SpecificParameters->bucketSizeDuration); + } else { + LOG_E(MAC, + "[UE %d] lcid %d, NULL ul_SpecificParameters\n", + module_idP, lcid); + AssertFatal(1 == 0, ""); + } + + if (UE_mac_inst[module_idP].scheduling_info.Bj[lcid] > + bucketsizeduration_max) { + UE_mac_inst[module_idP].scheduling_info.Bj[lcid] = + bucketsizeduration_max; + } else { + UE_mac_inst[module_idP].scheduling_info.Bj[lcid] = + bucketsizeduration; + } + } + + + /* + if (lcid == DCCH) { + LOG_D(MAC,"[UE %d][SR] Frame %d subframe %d Pending data for SRB1=%d for LCGID %d \n", + module_idP, txFrameP,txSubframeP,UE_mac_inst[module_idP].scheduling_info.BSR[UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]], + // UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]); + } + */ + } } - LOG_I(MAC,"Frame %d: Contention resolution timer %d/%d\n",frameP,UE_mac_inst[module_idP].RA_contention_resolution_cnt, - ((1+rach_ConfigCommon->ra_SupervisionInfo.mac_ContentionResolutionTimer)<<3)); + // Call BSR procedure as described in Section 5.4.5 in 36.321 - UE_mac_inst[module_idP].RA_contention_resolution_cnt++; - - if (UE_mac_inst[module_idP].RA_contention_resolution_cnt == - ((1+rach_ConfigCommon->ra_SupervisionInfo.mac_ContentionResolutionTimer)<<3)) { - UE_mac_inst[module_idP].RA_active = 0; - UE_mac_inst[module_idP].RA_contention_resolution_timer_active = 0; - // Signal PHY to quit RA procedure - LOG_E(MAC,"Module id %u Contention resolution timer expired, RA failed\n", module_idP); - mac_xface->ra_failed(module_idP,0,eNB_indexP); + // First check ReTxBSR Timer because it is always configured + // Decrement ReTxBSR Timer if it is running and not null + if ((UE_mac_inst[module_idP].scheduling_info.retxBSR_SF != + MAC_UE_BSR_TIMER_NOT_RUNNING) + && (UE_mac_inst[module_idP].scheduling_info.retxBSR_SF != 0)) { + UE_mac_inst[module_idP].scheduling_info.retxBSR_SF--; } - } - - - // call SR procedure to generate pending SR and BSR for next PUCCH/PUSCH TxOp. This should implement the procedures - // outlined in Sections 5.4.4 an 5.4.5 of 36.321 - // Put this in another function - - // Get RLC status info and update Bj for all lcids that are active - for (lcid=DCCH; lcid <= DTCH; lcid++ ) { - if ((lcid == 0) ||(UE_mac_inst[module_idP].logicalChannelConfig[lcid])) { - // meausre the Bj - if ((directionP == SF_UL)&& (UE_mac_inst[module_idP].scheduling_info.Bj[lcid] >= 0)) { - if (UE_mac_inst[module_idP].logicalChannelConfig[lcid]->ul_SpecificParameters) { - bucketsizeduration = UE_mac_inst[module_idP].logicalChannelConfig[lcid]->ul_SpecificParameters->prioritisedBitRate * TTI; - bucketsizeduration_max = get_ms_bucketsizeduration(UE_mac_inst[module_idP].logicalChannelConfig[lcid]->ul_SpecificParameters->bucketSizeDuration); - } else { - LOG_E(MAC,"[UE %d] lcid %d, NULL ul_SpecificParameters\n",module_idP,lcid); - mac_xface->macphy_exit(""); - } - - if ( UE_mac_inst[module_idP].scheduling_info.Bj[lcid] > bucketsizeduration_max ) { - UE_mac_inst[module_idP].scheduling_info.Bj[lcid] = bucketsizeduration_max; - } else { - UE_mac_inst[module_idP].scheduling_info.Bj[lcid] = bucketsizeduration; - } - } - - if (update_bsr(module_idP,frameP, eNB_indexP, lcid, UE_mac_inst[module_idP].scheduling_info.LCGID[lcid])) { - UE_mac_inst[module_idP].scheduling_info.SR_pending= 1; - LOG_D(MAC,"[UE %d][SR] Frame %d subframe %d SR for PUSCH is pending for LCGID %d with BSR level %d (%d bytes in RLC)\n", - module_idP, frameP,subframeP,UE_mac_inst[module_idP].scheduling_info.LCGID[lcid], - UE_mac_inst[module_idP].scheduling_info.BSR[UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]], - UE_mac_inst[module_idP].scheduling_info.BSR_bytes[UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]]); - } + // Decrement Periodic Timer if it is running and not null + if ((UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF != + MAC_UE_BSR_TIMER_NOT_RUNNING) + && (UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF != 0)) { + UE_mac_inst[module_idP].scheduling_info.periodicBSR_SF--; + } + //Check whether Regular BSR is triggered + if (update_bsr(module_idP, txFrameP, txSubframeP, eNB_indexP) == TRUE) { + // call SR procedure to generate pending SR and BSR for next PUCCH/PUSCH TxOp. This should implement the procedures + // outlined in Sections 5.4.4 an 5.4.5 of 36.321 + UE_mac_inst[module_idP].scheduling_info.SR_pending = 1; + // Regular BSR trigger + UE_mac_inst[module_idP].BSR_reporting_active |= + BSR_TRIGGER_REGULAR; + LOG_D(MAC, + "[UE %d][BSR] Regular BSR Triggered Frame %d subframe %d SR for PUSCH is pending\n", + module_idP, txFrameP, txSubframeP); + } + // UE has no valid phy config dedicated || no valid/released SR + if ((UE_mac_inst[module_idP].physicalConfigDedicated == NULL)) { + // cancel all pending SRs + UE_mac_inst[module_idP].scheduling_info.SR_pending = 0; + UE_mac_inst[module_idP].ul_active = 0; + LOG_T(MAC, "[UE %d] Release all SRs \n", module_idP); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE + stop_meas(&UE_mac_inst[module_idP].ue_scheduler); +#endif + return (CONNECTION_OK); } - } - // UE has no valid phy config dedicated || no valid/released SR - if ((UE_mac_inst[module_idP].physicalConfigDedicated == NULL)) { - // cancel all pending SRs - UE_mac_inst[module_idP].scheduling_info.SR_pending=0; - UE_mac_inst[module_idP].ul_active=0; - LOG_T(MAC,"[UE %d] Release all SRs \n", module_idP); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); + if ((UE_mac_inst[module_idP]. + physicalConfigDedicated->schedulingRequestConfig == NULL) + || (UE_mac_inst[module_idP]. + physicalConfigDedicated->schedulingRequestConfig->present == + SchedulingRequestConfig_PR_release)) { + + // initiate RA with CRNTI included in msg3 (no contention) as descibed in 36.321 sec 5.1.5 + + // cancel all pending SRs + UE_mac_inst[module_idP].scheduling_info.SR_pending = 0; + UE_mac_inst[module_idP].ul_active = 0; + LOG_T(MAC, "[UE %d] Release all SRs \n", module_idP); + } + // Put this in a function + // Call PHR procedure as described in Section 5.4.6 in 36.321 + if (UE_mac_inst[module_idP].PHR_state == MAC_MainConfig__phr_Config_PR_setup) { // normal operation + + if (UE_mac_inst[module_idP].PHR_reconfigured == 1) { // upon (re)configuration of the power headroom reporting functionality by upper layers + UE_mac_inst[module_idP].PHR_reporting_active = 1; + UE_mac_inst[module_idP].PHR_reconfigured = 0; + } else { + //LOG_D(MAC,"PHR normal operation %d active %d \n", UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF, UE_mac_inst[module_idP].PHR_reporting_active); + if ((UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF <= + 0) + && + ((get_PL(module_idP, 0, eNB_indexP) < + UE_mac_inst[module_idP].scheduling_info. + PathlossChange_db) + || (UE_mac_inst[module_idP].power_backoff_db[eNB_indexP] > + UE_mac_inst[module_idP]. + scheduling_info.PathlossChange_db))) + // trigger PHR and reset the timer later when the PHR report is sent + { + UE_mac_inst[module_idP].PHR_reporting_active = 1; + } else if (UE_mac_inst[module_idP].PHR_reporting_active == 0) { + UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF--; + } + + if (UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF <= + 0) + // trigger PHR and reset the timer later when the PHR report is sent + { + UE_mac_inst[module_idP].PHR_reporting_active = 1; + } else if (UE_mac_inst[module_idP].PHR_reporting_active == 0) { + UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF--; + } + } + } else { // release / nothing + UE_mac_inst[module_idP].PHR_reporting_active = 0; // release PHR + } + + //If the UE has UL resources allocated for new transmission for this TTI here: + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME + (VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); +#if UE_TIMING_TRACE stop_meas(&UE_mac_inst[module_idP].ue_scheduler); - return(CONNECTION_OK); - } - - if ((UE_mac_inst[module_idP].physicalConfigDedicated->schedulingRequestConfig == NULL) || - (UE_mac_inst[module_idP].physicalConfigDedicated->schedulingRequestConfig->present == SchedulingRequestConfig_PR_release)) { - - // initiate RA with CRNTI included in msg3 (no contention) as descibed in 36.321 sec 5.1.5 - - // cancel all pending SRs - UE_mac_inst[module_idP].scheduling_info.SR_pending=0; - UE_mac_inst[module_idP].ul_active=0; - LOG_T(MAC,"[UE %d] Release all SRs \n", module_idP); - } - - // Put this in a function - // Call PHR procedure as described in Section 5.4.6 in 36.321 - if (UE_mac_inst[module_idP].PHR_state == MAC_MainConfig__phr_Config_PR_setup) { // normal operation - - if (UE_mac_inst[module_idP].PHR_reconfigured == 1) { // upon (re)configuration of the power headroom reporting functionality by upper layers - UE_mac_inst[module_idP].PHR_reporting_active = 1; - UE_mac_inst[module_idP].PHR_reconfigured = 0; - } else { - //LOG_D(MAC,"PHR normal operation %d active %d \n", UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF, UE_mac_inst[module_idP].PHR_reporting_active); - if ((UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF <= 0) && - ((mac_xface->get_PL(module_idP,0,eNB_indexP) < UE_mac_inst[module_idP].scheduling_info.PathlossChange_db) || - (UE_mac_inst[module_idP].power_backoff_db[eNB_indexP] > UE_mac_inst[module_idP].scheduling_info.PathlossChange_db))) - // trigger PHR and reset the timer later when the PHR report is sent - { - UE_mac_inst[module_idP].PHR_reporting_active = 1; - } else if (UE_mac_inst[module_idP].PHR_reporting_active ==0 ) { - UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF--; - } - - if (UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF <= 0 ) - // trigger PHR and reset the timer later when the PHR report is sent - { - UE_mac_inst[module_idP].PHR_reporting_active = 1; - } else if (UE_mac_inst[module_idP].PHR_reporting_active == 0 ) { - UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF--; - } - } - } else { // release / nothing - UE_mac_inst[module_idP].PHR_reporting_active = 0; // release PHR - } - - //If the UE has UL resources allocated for new transmission for this TTI here: - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT); - stop_meas(&UE_mac_inst[module_idP].ue_scheduler); - return(CONNECTION_OK); +#endif + return (CONNECTION_OK); } // to be improved @@ -1722,484 +2476,564 @@ ue_scheduler( extern int cba_backoff; double uniform_rngen(int min, int max) { - double random = (double)taus()/((double)0xffffffff); - return (max - min) * random + min; + double random = (double) taus() / ((double) 0xffffffff); + return (max - min) * random + min; } -int cba_access(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, uint8_t eNB_index,uint16_t buflen) +int +cba_access(module_id_t module_idP, frame_t frameP, + sub_frame_t subframe, uint8_t eNB_index, uint16_t buflen) { - mac_rlc_status_resp_t rlc_status; - int header_offset=4; - int rv =0; + mac_rlc_status_resp_t rlc_status; + int header_offset = 4; + int rv = 0; - /* - if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]<64)) || - ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]<64)) || - ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]<64)) ) - // && (UE_mac_inst[module_idP].ul_active == 0) // check if the ul is acrtive - && (UE_mac_inst[module_idP].cba_last_access[0] <= 0) ) { // backoff - // LOG_D(MAC,"[UE %d] Frame %d Subframe %d: the current CBA backoff is %d \n", module_idP, frameP, subframe, - // UE_mac_inst[module_idP].cba_last_access[0] ); + /* + if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]<64)) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]<64)) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]<64)) ) + // && (UE_mac_inst[module_idP].ul_active == 0) // check if the ul is acrtive + && (UE_mac_inst[module_idP].cba_last_access[0] <= 0) ) { // backoff + // LOG_D(MAC,"[UE %d] Frame %d Subframe %d: the current CBA backoff is %d \n", module_idP, frameP, subframe, + // UE_mac_inst[module_idP].cba_last_access[0] ); - UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,40)); - LOG_D(MAC,"[UE %d] Frame %d Subframe %d: start a new CBA backoff %d UL active state %d \n", module_idP, frameP, subframe, - UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); + UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,40)); + LOG_D(MAC,"[UE %d] Frame %d Subframe %d: start a new CBA backoff %d UL active state %d \n", module_idP, frameP, subframe, + UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); - rv=1; - } else if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]> 0 )) || - ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]> 0 )) || - ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]> 0 )) ) - // && (UE_mac_inst[module_idP].ul_active == 0) // check if the ul is acrtive - && (UE_mac_inst[module_idP].cba_last_access[0]> 0) ){ + rv=1; + } else if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]> 0 )) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]> 0 )) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]> 0 )) ) + // && (UE_mac_inst[module_idP].ul_active == 0) // check if the ul is acrtive + && (UE_mac_inst[module_idP].cba_last_access[0]> 0) ){ - UE_mac_inst[module_idP].cba_last_access[0]-=1; - LOG_D(MAC,"[UE %d] Frame %d Subframe %d: CBA backoff is decreased by one to %d UL active state %d \n", - module_idP, frameP, subframe, - UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); + UE_mac_inst[module_idP].cba_last_access[0]-=1; + LOG_D(MAC,"[UE %d] Frame %d Subframe %d: CBA backoff is decreased by one to %d UL active state %d \n", + module_idP, frameP, subframe, + UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); - } else if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1] == 0 )) && - ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2] == 0 )) && - ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3] == 0 )) ) - && (UE_mac_inst[module_idP].cba_last_access[0]> 0) ){ - UE_mac_inst[module_idP].cba_last_access[0]-=1; - }*/ + } else if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1] == 0 )) && + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2] == 0 )) && + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3] == 0 )) ) + && (UE_mac_inst[module_idP].cba_last_access[0]> 0) ){ + UE_mac_inst[module_idP].cba_last_access[0]-=1; + } */ - if ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0]<64) ) { - return 0; - } - - if ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1] <= 0 ) && - (UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2] <= 0 ) && - (UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3] <= 0 ) ) { - return 0; - } - - if (cba_backoff == 0 ) { // apply probablisitc method - UE_mac_inst[module_idP].cba_last_access[0]= uniform_rngen(0,1); - - if (uniform_rngen(0,1) > 0.6 ) { - LOG_I(MAC,"[UE %d] Frame %d Subframe %d: CBA probability-based backoff (%d), UL active state %d \n", module_idP, frameP, subframe, - cba_backoff,UE_mac_inst[module_idP].ul_active); - - rv=1; + if ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0] > 0) + && (UE_mac_inst[module_idP].scheduling_info.BSR[LCGID0] < 64)) { + return 0; } - } else { - if (UE_mac_inst[module_idP].cba_last_access[0] <= 0) { - UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,cba_backoff)); + if ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1] <= 0) && + (UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2] <= 0) && + (UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3] <= 0)) { + return 0; + } - LOG_I(MAC,"[UE %d] Frame %d Subframe %d: start a new CBA backoff %d/%d UL active state %d \n", module_idP, frameP, subframe, - UE_mac_inst[module_idP].cba_last_access[0], cba_backoff,UE_mac_inst[module_idP].ul_active); + if (cba_backoff == 0) { // apply probablisitc method + UE_mac_inst[module_idP].cba_last_access[0] = uniform_rngen(0, 1); - rv = 1; - /* - rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, // eNB_index - DTCH, - 0); + if (uniform_rngen(0, 1) > 0.6) { + LOG_I(MAC, + "[UE %d] Frame %d Subframe %d: CBA probability-based backoff (%d), UL active state %d \n", + module_idP, frameP, subframe, cba_backoff, + UE_mac_inst[module_idP].ul_active); - if (( - // (rlc_status.pdus_in_buffer > 0 ) && - // (UE_mac_inst[module_idP].ul_active == 0) && // check if the ul is acrtive - (rlc_status.head_sdu_is_segmented == 0 ) && - ((rlc_status.head_sdu_remaining_size_to_send + header_offset ) <= buflen ) - )){ - rv = 1; - - UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,30)); - LOG_D(MAC,"[UE %d] Frame %d Subframe %d: start a new CBA backoff %d UL active state %d \n", module_idP, frameP, subframe, - UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); - */ + rv = 1; + } } else { - UE_mac_inst[module_idP].cba_last_access[0]-=1; - LOG_D(MAC,"[UE %d] Frame %d Subframe %d: wait for backoff to expire (%d) CBA UL active state %d \n", - module_idP, frameP, subframe, - UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); + + if (UE_mac_inst[module_idP].cba_last_access[0] <= 0) { + UE_mac_inst[module_idP].cba_last_access[0] = + round(uniform_rngen(1, cba_backoff)); + + LOG_I(MAC, + "[UE %d] Frame %d Subframe %d: start a new CBA backoff %d/%d UL active state %d \n", + module_idP, frameP, subframe, + UE_mac_inst[module_idP].cba_last_access[0], cba_backoff, + UE_mac_inst[module_idP].ul_active); + + rv = 1; + /* + rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, // eNB_index + DTCH, + 0); + + if (( + // (rlc_status.pdus_in_buffer > 0 ) && + // (UE_mac_inst[module_idP].ul_active == 0) && // check if the ul is acrtive + (rlc_status.head_sdu_is_segmented == 0 ) && + ((rlc_status.head_sdu_remaining_size_to_send + header_offset ) <= buflen ) + )){ + rv = 1; + + UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,30)); + LOG_D(MAC,"[UE %d] Frame %d Subframe %d: start a new CBA backoff %d UL active state %d \n", module_idP, frameP, subframe, + UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); + */ + } else { + UE_mac_inst[module_idP].cba_last_access[0] -= 1; + LOG_D(MAC, + "[UE %d] Frame %d Subframe %d: wait for backoff to expire (%d) CBA UL active state %d \n", + module_idP, frameP, subframe, + UE_mac_inst[module_idP].cba_last_access[0], + UE_mac_inst[module_idP].ul_active); + } } - } - return rv; - /* - if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]<64)) || - ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]<64)) || - ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]<64)) ) - // && (UE_mac_inst[module_idP].ul_active == 0) // check if the ul is acrtive - && (UE_mac_inst[module_idP].cba_last_access[0] <= 0) ) { + return rv; + /* + if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]<64)) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]<64)) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]>0)&&(UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]<64)) ) + // && (UE_mac_inst[module_idP].ul_active == 0) // check if the ul is acrtive + && (UE_mac_inst[module_idP].cba_last_access[0] <= 0) ) { - UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,cba_backoff)); + UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,cba_backoff)); - LOG_I(MAC,"[UE %d] Frame %d Subframe %d: start a new CBA backoff %d/%d UL active state %d \n", module_idP, frameP, subframe, - UE_mac_inst[module_idP].cba_last_access[0], cba_backoff,UE_mac_inst[module_idP].ul_active); + LOG_I(MAC,"[UE %d] Frame %d Subframe %d: start a new CBA backoff %d/%d UL active state %d \n", module_idP, frameP, subframe, + UE_mac_inst[module_idP].cba_last_access[0], cba_backoff,UE_mac_inst[module_idP].ul_active); - rv = 1; + rv = 1; - rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, // eNB_index - DTCH, - 0); + rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, // eNB_index + DTCH, + 0); - if (( - // (rlc_status.pdus_in_buffer > 0 ) && - // (UE_mac_inst[module_idP].ul_active == 0) && // check if the ul is acrtive - (rlc_status.head_sdu_is_segmented == 0 ) && - ((rlc_status.head_sdu_remaining_size_to_send + header_offset ) <= buflen ) - )){ - rv = 1; + if (( + // (rlc_status.pdus_in_buffer > 0 ) && + // (UE_mac_inst[module_idP].ul_active == 0) && // check if the ul is acrtive + (rlc_status.head_sdu_is_segmented == 0 ) && + ((rlc_status.head_sdu_remaining_size_to_send + header_offset ) <= buflen ) + )){ + rv = 1; - UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,30)); - LOG_D(MAC,"[UE %d] Frame %d Subframe %d: start a new CBA backoff %d UL active state %d \n", module_idP, frameP, subframe, - UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); - } else - UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,5)); + UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,30)); + LOG_D(MAC,"[UE %d] Frame %d Subframe %d: start a new CBA backoff %d UL active state %d \n", module_idP, frameP, subframe, + UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); + } else + UE_mac_inst[module_idP].cba_last_access[0]= round(uniform_rngen(1,5)); - } else if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]> 0 )) || - ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]> 0 )) || - ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]> 0 )) ) - // && (UE_mac_inst[module_idP].ul_active == 0) // check if the ul is acrtive - && (UE_mac_inst[module_idP].cba_last_access[0]> 0) ) - { + } else if (( ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID1]> 0 )) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID2]> 0 )) || + ((UE_mac_inst[module_idP].scheduling_info.BSR[LCGID3]> 0 )) ) + // && (UE_mac_inst[module_idP].ul_active == 0) // check if the ul is acrtive + && (UE_mac_inst[module_idP].cba_last_access[0]> 0) ) + { - UE_mac_inst[module_idP].cba_last_access[0]-=1; - LOG_D(MAC,"[UE %d] Frame %d Subframe %d: wait for backoff to expire (%d) CBA UL active state %d \n", - module_idP, frameP, subframe, - UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); - } - } - */ + UE_mac_inst[module_idP].cba_last_access[0]-=1; + LOG_D(MAC,"[UE %d] Frame %d Subframe %d: wait for backoff to expire (%d) CBA UL active state %d \n", + module_idP, frameP, subframe, + UE_mac_inst[module_idP].cba_last_access[0], UE_mac_inst[module_idP].ul_active); + } + } + */ } #endif -int get_bsr_lcgid (module_id_t module_idP) + +boolean_t +update_bsr(module_id_t module_idP, frame_t frameP, + sub_frame_t subframeP, eNB_index_t eNB_index) { - int lcgid, lcgid_tmp=-1; - int num_active_lcgid = 0; - for (lcgid = 0 ; lcgid < MAX_NUM_LCGID; lcgid++) { - if (UE_mac_inst[module_idP].scheduling_info.BSR[lcgid] > 0 ) { - lcgid_tmp = lcgid; - num_active_lcgid+=1; + mac_rlc_status_resp_t rlc_status; + boolean_t bsr_regular_triggered = FALSE; + uint8_t lcid; + uint8_t lcgid; + uint8_t num_lcid_with_data = 0; // for LCID with data only if LCGID is defined + uint16_t lcgid_buffer_remain[MAX_NUM_LCGID] = { 0, 0, 0, 0 }; + int32_t lcid_bytes_in_buffer[MAX_NUM_LCID]; + /* Array for ordering LCID with data per decreasing priority order */ + uint8_t lcid_reordered_array[MAX_NUM_LCID] = + { MAX_NUM_LCID, MAX_NUM_LCID, MAX_NUM_LCID, MAX_NUM_LCID, + MAX_NUM_LCID, MAX_NUM_LCID, MAX_NUM_LCID, MAX_NUM_LCID, + MAX_NUM_LCID, + MAX_NUM_LCID, MAX_NUM_LCID + }; + uint8_t pos_next = 0; + uint8_t highest_priority = 16; + uint8_t array_index = 0; + + // Reset All BSR Infos + lcid_bytes_in_buffer[0] = 0; + for (lcid = DCCH; lcid < MAX_NUM_LCID; lcid++) { + // Reset transmission status + lcid_bytes_in_buffer[lcid] = 0; + UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] = + LCID_EMPTY; } - } - if (num_active_lcgid == 0) { - return -1; - } else if (num_active_lcgid == 1) { - return lcgid_tmp; - } else { - return MAX_NUM_LCGID; - } + for (lcgid = 0; lcgid < MAX_NUM_LCGID; lcgid++) { + // Reset Buffer Info + UE_mac_inst[module_idP].scheduling_info.BSR[lcgid] = 0; + UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] = 0; + } + + //Get Buffer Occupancy and fill lcid_reordered_array + for (lcid = DCCH; lcid < MAX_NUM_LCID; lcid++) { + if (UE_mac_inst[module_idP].logicalChannelConfig[lcid]) { + lcgid = UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]; + + // Store already available data to transmit per Group + if (lcgid < MAX_NUM_LCGID) { + lcgid_buffer_remain[lcgid] += + UE_mac_inst[module_idP]. + scheduling_info.LCID_buffer_remain[lcid]; + } + + rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti, eNB_index, frameP, subframeP, ENB_FLAG_NO, MBMS_FLAG_NO, lcid, 0xFFFF); //TBS is not used in RLC at this step, set a special value for debug + + lcid_bytes_in_buffer[lcid] = rlc_status.bytes_in_buffer; + + if (rlc_status.bytes_in_buffer > 0) { + LOG_D(MAC, + "[UE %d] PDCCH Tick : LCID%d LCGID%d has data to transmit =%d bytes at frame %d subframe %d\n", + module_idP, lcid, lcgid, rlc_status.bytes_in_buffer, + frameP, subframeP); + + UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] = + LCID_NOT_EMPTY; + //Update BSR_bytes and position in lcid_reordered_array only if Group is defined + if (lcgid < MAX_NUM_LCGID) { + num_lcid_with_data++; + // sum lcid buffer which has same lcgid + UE_mac_inst[module_idP].scheduling_info. + BSR_bytes[lcgid] += rlc_status.bytes_in_buffer; + + //Fill in the array + array_index = 0; + do { + if (UE_mac_inst[module_idP].logicalChannelConfig + [lcid]->ul_SpecificParameters->priority <= + highest_priority) { + //Insert if priority is higher or equal (lower or equal in value) + for (pos_next = num_lcid_with_data - 1; + pos_next > array_index; pos_next--) { + lcid_reordered_array[pos_next] = + lcid_reordered_array[pos_next - 1]; + + } + lcid_reordered_array[array_index] = lcid; + break; + + } + array_index++; + } + while ((array_index < num_lcid_with_data) + && (array_index < MAX_NUM_LCID)); + } + } + } + + } + + // Check whether a regular BSR can be triggered according to the first cases in 36.321 + if (num_lcid_with_data) { + LOG_D(MAC, + "[UE %d] PDCCH Tick at frame %d subframe %d: NumLCID with data=%d Reordered LCID0=%d LCID1=%d LCID2=%d\n", + module_idP, frameP, subframeP, num_lcid_with_data, + lcid_reordered_array[0], lcid_reordered_array[1], + lcid_reordered_array[2]); + + for (array_index = 0; array_index < num_lcid_with_data; + array_index++) { + lcid = lcid_reordered_array[array_index]; + /* UL data, for a logical channel which belongs to a LCG, becomes available for transmission in the RLC entity + either the data belongs to a logical channel with higher priority than the priorities of the logical channels + which belong to any LCG and for which data is already available for transmission + */ + if ((UE_mac_inst[module_idP]. + scheduling_info.LCID_buffer_remain[lcid] == 0) + /* or there is no data available for any of the logical channels which belong to a LCG */ + || + (lcgid_buffer_remain + [UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]] == + 0)) { + bsr_regular_triggered = TRUE; + + LOG_D(MAC, + "[UE %d] PDCCH Tick : MAC BSR Triggered LCID%d LCGID%d data become available at frame %d subframe %d\n", + module_idP, lcid, + UE_mac_inst[module_idP].scheduling_info.LCGID[lcid], + frameP, subframeP); + + break; + } + } + + // Trigger Regular BSR if ReTxBSR Timer has expired and UE has data for transmission + if (UE_mac_inst[module_idP].scheduling_info.retxBSR_SF == 0) { + bsr_regular_triggered = TRUE; + + if ((UE_mac_inst[module_idP].BSR_reporting_active & + BSR_TRIGGER_REGULAR) == 0) { + LOG_I(MAC, + "[UE %d] PDCCH Tick : MAC BSR Triggered ReTxBSR Timer expiry at frame %d subframe %d\n", + module_idP, frameP, subframeP); + } + + } + } + //Store Buffer Occupancy in remain buffers for next TTI + for (lcid = DCCH; lcid < MAX_NUM_LCID; lcid++) { + UE_mac_inst[module_idP].scheduling_info.LCID_buffer_remain[lcid] = + lcid_bytes_in_buffer[lcid]; + } + + return bsr_regular_triggered; } -uint8_t get_bsr_len (module_id_t module_idP, uint16_t buflen) +uint8_t +locate_BsrIndexByBufferSize(const uint32_t * table, int size, int value) { - int lcgid=0; - uint8_t bsr_len=0, num_lcgid=0; - int pdu = 0; + uint8_t ju, jm, jl; + int ascend; + DevAssert(size > 0); + DevAssert(size <= 256); - for (lcgid=0; lcgid < MAX_NUM_LCGID; lcgid++ ) { - if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] > 0 ) { - pdu += (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] + bsr_len + 2); //2 = sizeof(SCH_SUBHEADER_SHORT) + if (value == 0) { + return 0; //elseif (value > 150000) return 63; } - if (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] > 128 ) { // long header size: adjust the header size - pdu += 1; + jl = 0; // lower bound + ju = size - 1; // upper bound + ascend = (table[ju] >= table[jl]) ? 1 : 0; // determine the order of the the table: 1 if ascending order of table, 0 otherwise + + while (ju - jl > 1) { //If we are not yet done, + jm = (ju + jl) >> 1; //compute a midpoint, + + if ((value >= table[jm]) == ascend) { + jl = jm; // replace the lower limit + } else { + ju = jm; //replace the upper limit + } + + LOG_T(MAC, + "[UE] searching BSR index %d for (BSR TABLE %d < value %d)\n", + jm, table[jm], value); } - // current phy buff can not transport all sdu for this lcgid -> transmit a bsr for this lcgid - - if ( (pdu > buflen) && (UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid] > 0 ) ) { - num_lcgid +=1; - bsr_len = (num_lcgid >= 2 ) ? sizeof(BSR_LONG) : sizeof(BSR_SHORT) ; - } - - LOG_D(MAC,"BSR Bytes %d for lcgid %d bsr len %d num lcgid %d\n", UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcgid], lcgid, bsr_len, num_lcgid); - } - - if ( bsr_len > 0 ) - LOG_D(MAC,"[UE %d] Prepare a %s (Transport Block Size %d, MAC pdu Size %d) \n", - module_idP, map_int_to_str(BSR_names, bsr_len), buflen, pdu); - - return bsr_len; -} - - -boolean_t update_bsr(module_id_t module_idP, frame_t frameP, eNB_index_t eNB_index, uint8_t lcid, uint8_t lcg_id) -{ - - mac_rlc_status_resp_t rlc_status; - boolean_t sr_pending = FALSE; - - - if ((lcg_id < 0) || (lcg_id >= MAX_NUM_LCGID) ) { - return sr_pending; - } - - // fixme: need a better way to reset - if ((lcid == DCCH) || (lcid == DTCH)) { - UE_mac_inst[module_idP].scheduling_info.BSR[lcg_id]=0; - UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcg_id]=0; - } - - // for (lcid =0 ; lcid < MAX_NUM_LCID; lcid++) { - if (UE_mac_inst[module_idP].scheduling_info.LCGID[lcid] == lcg_id) { - rlc_status = mac_rlc_status_ind(module_idP, UE_mac_inst[module_idP].crnti,eNB_index,frameP,ENB_FLAG_NO,MBMS_FLAG_NO, - lcid, - 0); - - if (rlc_status.bytes_in_buffer > 0 ) { - sr_pending = TRUE; - UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid] = LCID_NOT_EMPTY; - UE_mac_inst[module_idP].scheduling_info.BSR[lcg_id] += locate (BSR_TABLE,BSR_TABLE_SIZE, rlc_status.bytes_in_buffer); - UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcg_id] += rlc_status.bytes_in_buffer; - // UE_mac_inst[module_idP].scheduling_info.BSR_short_lcid = lcid; // only applicable to short bsr - LOG_D(MAC,"[UE %d] BSR level %d (LCGID %d, rlc buffer %d byte)\n", - module_idP, UE_mac_inst[module_idP].scheduling_info.BSR[lcg_id],lcg_id, UE_mac_inst[module_idP].scheduling_info.BSR_bytes[lcg_id]); + if (value == table[jl]) { + return jl; } else { - UE_mac_inst[module_idP].scheduling_info.LCID_status[lcid]=LCID_EMPTY; + return jl + 1; //equally ju } - } - - //} - return sr_pending; -} - -uint8_t locate (const uint32_t *table, int size, int value) -{ - - uint8_t ju, jm, jl; - int ascend; - - DevAssert( size > 0 ); - DevAssert( size <= 256 ); - - if (value == 0) { - return 0; //elseif (value > 150000) return 63; - } - - jl = 0; // lower bound - ju = size - 1; // upper bound - ascend = (table[ju] >= table[jl]) ? 1 : 0; // determine the order of the the table: 1 if ascending order of table, 0 otherwise - - while (ju-jl > 1) { //If we are not yet done, - jm = (ju+jl) >> 1; //compute a midpoint, - - if ((value >= table[jm]) == ascend) { - jl=jm; // replace the lower limit - } else { - ju=jm; //replace the upper limit - } - - LOG_T(MAC,"[UE] searching BSR index %d for (BSR TABLE %d < value %d)\n", jm, table[jm], value); - } - - if (value == table[jl]) { - return jl; - } else { - return jl+1; //equally ju - } } int get_sf_periodicBSRTimer(uint8_t sf_offset) { - switch (sf_offset) { - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf5: - return 5; - break; + switch (sf_offset) { + case PeriodicBSR_Timer_r12_sf5: + return 5; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf10: - return 10; - break; + case PeriodicBSR_Timer_r12_sf10: + return 10; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf16: - return 16; - break; + case PeriodicBSR_Timer_r12_sf16: + return 16; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf20: - return 20; - break; + case PeriodicBSR_Timer_r12_sf20: + return 20; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf32: - return 32; - break; + case PeriodicBSR_Timer_r12_sf32: + return 32; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf40: - return 40; - break; + case PeriodicBSR_Timer_r12_sf40: + return 40; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf64: - return 64; - break; + case PeriodicBSR_Timer_r12_sf64: + return 64; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf80: - return 80; - break; + case PeriodicBSR_Timer_r12_sf80: + return 80; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf128: - return 128; - break; + case PeriodicBSR_Timer_r12_sf128: + return 128; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf160: - return 160; - break; + case PeriodicBSR_Timer_r12_sf160: + return 160; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf320: - return 320; - break; + case PeriodicBSR_Timer_r12_sf320: + return 320; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf640: - return 640; - break; + case PeriodicBSR_Timer_r12_sf640: + return 640; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf1280: - return 1280; - break; + case PeriodicBSR_Timer_r12_sf1280: + return 1280; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf2560: - return 2560; - break; + case PeriodicBSR_Timer_r12_sf2560: + return 2560; + break; - case MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity: - default: - return -1; - break; - } + case PeriodicBSR_Timer_r12_infinity: + default: + return 0xFFFF; + break; + } } int get_sf_retxBSRTimer(uint8_t sf_offset) { - switch (sf_offset) { - case MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf320: - return 320; - break; + switch (sf_offset) { + case RetxBSR_Timer_r12_sf320: + return 320; + break; - case MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf640: - return 640; - break; + case RetxBSR_Timer_r12_sf640: + return 640; + break; - case MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf1280: - return 1280; - break; + case RetxBSR_Timer_r12_sf1280: + return 1280; + break; - case MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560: - return 2560; - break; + case RetxBSR_Timer_r12_sf2560: + return 2560; + break; - case MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf5120: - return 5120; - break; + case RetxBSR_Timer_r12_sf5120: + return 5120; + break; - case MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf10240: - return 10240; - break; + case RetxBSR_Timer_r12_sf10240: + return 10240; + break; - default: - return -1; - break; - } + default: + return -1; + break; + } } + int get_ms_bucketsizeduration(uint8_t bucketsizeduration) { - switch (bucketsizeduration) { - case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50: - return 50; - break; + switch (bucketsizeduration) { + case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50: + return + 50; + break; - case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms100: - return 100; - break; + case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms100: + return + 100; + break; - case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms150: - return 150; - break; + case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms150: + return + 150; + break; - case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms300: - return 300; - break; + case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms300: + return + 300; + break; - case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms500: - return 500; - break; + case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms500: + return + 500; + break; - case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms1000: - return 1000; - break; + case LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms1000: + return + 1000; + break; - default: - return 0; - break; - } + default: + return 0; + break; + } } -void update_phr(module_id_t module_idP,int CC_id) +void update_phr(module_id_t module_idP, int CC_id) { - if (CC_id>0) { - LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return; - } + AssertFatal(CC_id == 0, + "Transmission on secondary CCs is not supported yet\n"); - UE_mac_inst[module_idP].PHR_reporting_active =0; - UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF = get_sf_perioidicPHR_Timer(UE_mac_inst[module_idP].scheduling_info.periodicPHR_Timer); - UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF = get_sf_prohibitPHR_Timer(UE_mac_inst[module_idP].scheduling_info.prohibitPHR_Timer); - // LOG_D(MAC,"phr %d %d\n ",UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF, UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF); + UE_mac_inst[module_idP].PHR_reporting_active = 0; + UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF = + get_sf_perioidicPHR_Timer(UE_mac_inst[module_idP]. + scheduling_info.periodicPHR_Timer); + UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF = + get_sf_prohibitPHR_Timer(UE_mac_inst[module_idP]. + scheduling_info.prohibitPHR_Timer); + // LOG_D(MAC,"phr %d %d\n ",UE_mac_inst[module_idP].scheduling_info.periodicPHR_SF, UE_mac_inst[module_idP].scheduling_info.prohibitPHR_SF); } -uint8_t get_phr_mapping (module_id_t module_idP, int CC_id, uint8_t eNB_index) + +uint8_t +get_phr_mapping(module_id_t module_idP, int CC_id, uint8_t eNB_index) { - if (CC_id>0) { - LOG_E(MAC,"Transmission on secondary CCs is not supported yet\n"); - mac_xface->macphy_exit("MAC FATAL CC_id>0"); - return 0; // not reached - } + AssertFatal(CC_id == 0, + "Transmission on secondary CCs is not supported yet\n"); - //power headroom reporting range is from -23 ...+40 dB, as described in 36313 - //note: mac_xface->get_Po_NOMINAL_PUSCH(module_idP) is float - if (mac_xface->get_PHR(module_idP,CC_id,eNB_index) < -23) { - return 0; - } else if (mac_xface->get_PHR(module_idP,CC_id,eNB_index) >= 40) { - return 63; - } else { // -23 to 40 - return (uint8_t) mac_xface->get_PHR(module_idP,CC_id,eNB_index) + PHR_MAPPING_OFFSET; + //power headroom reporting range is from -23 ...+40 dB, as described in 36313 + //note: mac_xface->get_Po_NOMINAL_PUSCH(module_idP) is float + if (get_PHR(module_idP, CC_id, eNB_index) < -23) { + return 0; + } else if (get_PHR(module_idP, CC_id, eNB_index) >= 40) { + return 63; + } else { // -23 to 40 + return (uint8_t) get_PHR(module_idP, CC_id, + eNB_index) + PHR_MAPPING_OFFSET; - } + } } + int get_sf_perioidicPHR_Timer(uint8_t perioidicPHR_Timer) { - return (perioidicPHR_Timer+1)*10; + return (perioidicPHR_Timer + 1) * 10; } int get_sf_prohibitPHR_Timer(uint8_t prohibitPHR_Timer) { - return (prohibitPHR_Timer)*10; + return (prohibitPHR_Timer) * 10; } int get_db_dl_PathlossChange(uint8_t dl_PathlossChange) { - switch (dl_PathlossChange) { - case MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1: - return 1; - break; + switch (dl_PathlossChange) { + case MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1: + return 1; + break; - case MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB3: - return 3; - break; + case MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB3: + return 3; + break; - case MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB6: - return 6; - break; + case MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB6: + return 6; + break; - case MAC_MainConfig__phr_Config__setup__dl_PathlossChange_infinity: - default: - return -1; - break; - } + case MAC_MainConfig__phr_Config__setup__dl_PathlossChange_infinity: + default: + return -1; + break; + } } diff --git a/openair2/LAYER2/MAC/vars.h b/openair2/LAYER2/MAC/vars.h index 508c7f8c21..d153c82aee 100644 --- a/openair2/LAYER2/MAC/vars.h +++ b/openair2/LAYER2/MAC/vars.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file vars.h * \brief mac vars * \author Navid Nikaein and Raymond Knopp @@ -39,28 +32,70 @@ #ifndef __MAC_VARS_H__ #define __MAC_VARS_H__ -#ifdef USER_MODE -//#include "stdio.h" -#endif //USER_MODE #include "PHY/defs.h" #include "defs.h" -#include "PHY_INTERFACE/defs.h" #include "COMMON/mac_rrc_primitives.h" -const uint32_t BSR_TABLE[BSR_TABLE_SIZE]= {0,10,12,14,17,19,22,26,31,36,42,49,57,67,78,91, - 105,125,146,171,200,234,274,321,376,440,515,603,706,826,967,1132, - 1326,1552,1817,2127,2490,2915,3413,3995,4677,5467,6411,7505,8787,10287,12043,14099, - 16507,19325,22624,26487,31009,36304,42502,49759,58255,68201,79846,93479,109439, 128125,150000, 300000 - }; +const uint32_t BSR_TABLE[BSR_TABLE_SIZE] = + { 0, 10, 12, 14, 17, 19, 22, 26, 31, 36, 42, 49, 57, 67, 78, 91, + 105, 125, 146, 171, 200, 234, 274, 321, 376, 440, 515, 603, 706, 826, + 967, 1132, + 1326, 1552, 1817, 2127, 2490, 2915, 3413, 3995, 4677, 5467, 6411, 7505, + 8787, 10287, 12043, 14099, + 16507, 19325, 22624, 26487, 31009, 36304, 42502, 49759, 58255, 68201, + 79846, 93479, 109439, 128125, 150000, 300000 +}; + +// extended bsr table--currently not used +const uint32_t Extended_BSR_TABLE[BSR_TABLE_SIZE] = + { 0, 10, 13, 16, 19, 23, 29, 35, 43, 53, 65, 80, 98, 120, 147, + 181, 223, 274, 337, 414, 509, 625, 769, 945, 1162, 1429, + 1757, 2161, 2657, 3267, 4017, 4940, 6074, 7469, 9185, + 11294, 13888, 17077, 20999, 25822, 31752, 39045, 48012, + 59039, 72598, 89272, 109774, 134986, 165989, 204111, + 250990, 308634, 379519, 466683, 573866, 705666, 867737, + 1067031, 1312097, 1613447, 1984009, 2439678, 3000000, + 6000000 +}; + +//#define MAX_SIZE_OF_AGG3 576 +//#define MAX_SIZE_OF_AGG2 288 +//#define MAX_SIZE_OF_AGG1 144 +//#define MAX_SIZE_OF_AGG0 72 + +/* + * If the CQI is low, then scheduler will use a higher aggregation level and lower aggregation level otherwise + * this is also dependent to transmission mode, where an offset could be defined + */ +// the follwoing three tables are calibrated for TXMODE 1 and 2 +const uint8_t cqi2fmt0_agg[MAX_SUPPORTED_BW][CQI_VALUE_RANGE] = { + {3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, // 1.4_DCI0_CRC_Size= 37 bits + //{3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0}, // 5_DCI0_CRC_SIZE = 41 + {3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, // 5_DCI0_CRC_SIZE = 41 + {3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0}, // 10_DCI0_CRC_SIZE = 43 + {3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0} // 20_DCI0_CRC_SIZE = 44 +}; + +const uint8_t cqi2fmt1x_agg[MAX_SUPPORTED_BW][CQI_VALUE_RANGE] = { + {3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, // 1.4_DCI0_CRC_Size < 38 bits + {3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, // 5_DCI0_CRC_SIZE < 43 + {3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0}, // 10_DCI0_CRC_SIZE < 47 + {3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0} // 20_DCI0_CRC_SIZE < 55 +}; + +const uint8_t cqi2fmt2x_agg[MAX_SUPPORTED_BW][CQI_VALUE_RANGE] = { + {3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, // 1.4_DCI0_CRC_Size= 47 bits + {3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, // 5_DCI0_CRC_SIZE = 55 + {3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0}, // 10_DCI0_CRC_SIZE = 59 + {3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0} // 20_DCI0_CRC_SIZE = 64 +}; //uint32_t EBSR_Level[63]={0,10,13,16,19,23,29,35,43,53,65,80,98,120,147,181}; -MAC_xface *mac_xface; uint32_t RRC_CONNECTION_FLAG; -UE_MAC_INST *UE_mac_inst; //[NB_MODULE_MAX]; -eNB_MAC_INST *eNB_mac_inst; //[NB_MODULE_MAX]; +UE_MAC_INST *UE_mac_inst; //[NB_MODULE_MAX]; MAC_RLC_XFACE *Mac_rlc_xface; /// Primary component carrier index of eNB @@ -68,50 +103,39 @@ int pCC_id[NUMBER_OF_eNB_MAX]; -eNB_ULSCH_INFO eNB_ulsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][NUMBER_OF_UE_MAX]; // eNBxUE = 8x8 -eNB_DLSCH_INFO eNB_dlsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][NUMBER_OF_UE_MAX]; // eNBxUE = 8x8 +eNB_ULSCH_INFO eNB_ulsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][NUMBER_OF_UE_MAX]; // eNBxUE = 8x8 +eNB_DLSCH_INFO eNB_dlsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][NUMBER_OF_UE_MAX]; // eNBxUE = 8x8 -/* -#ifndef USER_MODE -RRC_XFACE *Rrc_xface; -MAC_xface *mac_xface; -#else -#include "PHY_INTERFACE/extern.h" -#include "RRC/LITE/extern.h" -#endif -*/ - -uint8_t Is_rrc_registered; #ifdef OPENAIR2 -unsigned char NB_eNB_INST=0; -unsigned char NB_UE_INST=0; -unsigned char NB_RN_INST=0; -unsigned char NB_INST=0; +unsigned char NB_eNB_INST = 0; +unsigned char NB_UE_INST = 0; +unsigned char NB_RN_INST = 0; +unsigned char NB_INST = 0; #endif -DCI0_5MHz_TDD_1_6_t UL_alloc_pdu; +DCI0_5MHz_TDD_1_6_t UL_alloc_pdu; -DCI1A_5MHz_TDD_1_6_t DLSCH_alloc_pdu1A; -DCI1A_5MHz_TDD_1_6_t RA_alloc_pdu; -DCI1A_5MHz_TDD_1_6_t BCCH_alloc_pdu; +DCI1A_5MHz_TDD_1_6_t DLSCH_alloc_pdu1A; +DCI1A_5MHz_TDD_1_6_t RA_alloc_pdu; +DCI1A_5MHz_TDD_1_6_t BCCH_alloc_pdu; -DCI1A_5MHz_TDD_1_6_t CCCH_alloc_pdu; -DCI1_5MHz_TDD_t DLSCH_alloc_pdu; +DCI1A_5MHz_TDD_1_6_t CCCH_alloc_pdu; +DCI1_5MHz_TDD_t DLSCH_alloc_pdu; -#ifdef Rel10 -DCI1C_5MHz_t MCCH_alloc_pdu; +#if defined(Rel10) || defined(Rel14) +DCI1C_5MHz_t MCCH_alloc_pdu; #endif -DCI0_5MHz_FDD_t UL_alloc_pdu_fdd; +DCI0_5MHz_FDD_t UL_alloc_pdu_fdd; -DCI1A_5MHz_FDD_t DLSCH_alloc_pdu1A_fdd; -DCI1A_5MHz_FDD_t RA_alloc_pdu_fdd; -DCI1A_5MHz_FDD_t BCCH_alloc_pdu_fdd; +DCI1A_5MHz_FDD_t DLSCH_alloc_pdu1A_fdd; +DCI1A_5MHz_FDD_t RA_alloc_pdu_fdd; +DCI1A_5MHz_FDD_t BCCH_alloc_pdu_fdd; -DCI1A_5MHz_FDD_t CCCH_alloc_pdu_fdd; -DCI1_5MHz_FDD_t DLSCH_alloc_pdu_fdd; +DCI1A_5MHz_FDD_t CCCH_alloc_pdu_fdd; +DCI1_5MHz_FDD_t DLSCH_alloc_pdu_fdd; DCI2_5MHz_2A_TDD_t DLSCH_alloc_pdu1; DCI2_5MHz_2A_TDD_t DLSCH_alloc_pdu2; @@ -119,5 +143,3 @@ DCI2_5MHz_2A_TDD_t DLSCH_alloc_pdu2; DCI1E_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu1E; #endif - - diff --git a/openair2/LAYER2/Makefile b/openair2/LAYER2/Makefile deleted file mode 100644 index 5890cd548e..0000000000 --- a/openair2/LAYER2/Makefile +++ /dev/null @@ -1,159 +0,0 @@ -#/*________________________Makefile________________________ - -# Authors : Hicham Anouar, Lionel Gauthier, Raymond Knopp -# Company : EURECOM -# Emails : anouar@eurecom.fr, lionel.gauthier@eurecom.fr, knopp@eurecom.fr -#________________________________________________________________*/ - - - - - -include $(OPENAIR_HOME)/common/utils/Makefile.inc - -KERNEL_ARCH:=$(shell echo `uname -m`) -SET_X64:=$(shell if [ $(KERNEL_ARCH) = 'x86_64' ]; then echo true ; fi) -ifdef RTAI -# Get the RTAI variables -CCC = $(shell rtai-config --cc) -RTAI_SUBVERSION=$(shell rtai-config --version | sed -e 's/^..\(.\).*$$/\1/') -IS_RTAI_SUBVERSION_LESS_THAN_FIVE=$(shell if [ $(RTAI_SUBVERSION) -lt 5 ] ; then echo true ; fi) - -EXTRA_CFLAGS = $(shell rtai-config --module-cflags) -DRTAI_ENABLED -DPC_TARGET -D__KERNEL__ -DMODULE -D_LOOSE_KERNEL_NAMES -I$(KERNEL_DIR)/build/include -I$(KERNEL_DIR)/build/include/asm/mach-default -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DNB_ANTENNAS_TXRX -DMAC_CONTEXT -I/usr/include $(if $(IS_RTAI_SUBVERSION_LESS_THAN_FIVE),-DRTAI_ISNT_POSIX,) -endif - - - - - -#################################################### -# SOURCE FOLDERS -#################################################### - - -COMMON_DIR = ../COMMON -AS_RLC_UM_DIR = RLC/UM_v6.1.0_LITE -AS_RLC_AM_DIR = RLC/AM -AS_RLC_TM_DIR = RLC/TM -AS_RLC_DIR = RLC -AS_PDCP_DIR = PDCP_v10.1.0 -AS_MEM_DIR = ../UTIL/MEM -AS_LIST_DIR = ../UTIL/LISTS -AS_FIFO_DIR = ../UTIL/FIFO -AS_MATH_DIR = ../UTIL/MATH -AS_TIMER_DIR = ../UTIL/TIMER -PHY_INTERFACE_DIR = ../PHY_INTERFACE - -export AS_RLC_UM_DIR -export AS_RLC_AM_DIR -export AS_RLC_TM_DIR -export AS_RLC_DIR -export AS_PDCP_DIR -export AS_MPLS_DIR -export AS_MEM_DIR -export AS_LIST_DIR -export AS_FIFO_DIR -export AS_MATH_DIR -export AS_TIMER_DIR -export AS_RRM_CONFIG_DIR - - - -obj-m += openair_l2.o - - - - -openair_l2-objs += layer2_top.o MAC/layer2_scheduler.o MAC/main.o MAC/nodeb_control_plane_procedures.o MAC/ue_scheduler.o MAC/nodeb_scheduler.o MAC/ue_control_plane_procedures.o MAC/lchan_interface.o MAC/utils.o MAC/openair2_proc.o - -openair_l2-objs += register.o - - - -openair_l2-objs += $(AS_LIST_DIR)/list.o -openair_l2-objs += $(AS_LIST_DIR)/list2.o - -openair_l2-objs += $(AS_TIMER_DIR)/umts_timer.o - -openair_l2-objs += $(AS_PDCP_DIR)/pdcp.o -openair_l2-objs += $(AS_PDCP_DIR)/pdcp_fifo.o - -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_segment.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_fsm.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_mux.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_retrans.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_util.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_mac_status.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_demux.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_receiver.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_reassembly.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_discard_rx.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_control_primitives.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_reset.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_status.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_timers.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_discard_notif.o -openair_l2-objs += $(AS_RLC_AM_DIR)/rlc_am_discard_tx.o - -openair_l2-objs += $(AS_RLC_TM_DIR)/rlc_tm.o -openair_l2-objs += $(AS_RLC_TM_DIR)/rlc_tm_control_primitives.o -openair_l2-objs += $(AS_RLC_TM_DIR)/rlc_tm_fsm.o -openair_l2-objs += $(AS_RLC_TM_DIR)/rlc_tm_segment.o -openair_l2-objs += $(AS_RLC_TM_DIR)/rlc_tm_reassembly.o - -openair_l2-objs += $(AS_RLC_UM_DIR)/rlc_um.o -openair_l2-objs += $(AS_RLC_UM_DIR)/rlc_um_fsm.o -openair_l2-objs += $(AS_RLC_UM_DIR)/rlc_um_control_primitives.o -openair_l2-objs += $(AS_RLC_UM_DIR)/rlc_um_segment.o -openair_l2-objs += $(AS_RLC_UM_DIR)/rlc_um_reassembly.o -openair_l2-objs += $(AS_RLC_UM_DIR)/rlc_um_receiver.o - -openair_l2-objs += $(AS_RLC_DIR)/rlc_mac.o -openair_l2-objs += $(AS_RLC_DIR)/rlc.o -openair_l2-objs += $(AS_RLC_DIR)/rlc_rrc.o -openair_l2-objs += $(AS_RLC_DIR)/rlc_mpls.o - - -openair_l2-objs += $(AS_MATH_DIR)/random.o -openair_l2-objs += $(AS_MATH_DIR)/crc_byte.o - -openair_l2-objs += $(AS_MEM_DIR)/mem_block.o - - -openair_l2-objs += $(PHY_INTERFACE_DIR)/mac_phy_primitives.o - - -ifdef MASTER -EXTRA_CFLAGS += -DNODE_RG -else -EXTRA_CFLAGS += -DNODE_MT -endif - - -ifdef NO_RRM -EXTRA_CFLAGS += -DNO_RRM -else -ifndef USER_MODE -EXTRA_CFLAGS += -DRRC_RRM_FIFOS_XFACE -endif -endif - - -CCC=gcc - -ifdef PHYEMUL -EXTRA_CFLAGS += -DPHY_EMUL -else -EXTRA_CFLAGS += -I$(OPENAIR1_DIR) -DOPENAIR1 -DOPENAIR2 -endif - -#-------------------------------------------------------- -EXTRA_CFLAGS += -DKERNEL$(KERNEL_MAIN_TYPE) -DBIGPHYSAREA #-DNO_RRM -DRRC_RRM_XFACE -DRRC_RRM_FIFOS_XFACE - - -EXTRA_CFLAGS += -Wall -Wstrict-prototypes $(if $(SET_X64),-DARCH_64,) $(if $(SET_X64),-mcmodel=kernel,) $(if $(SET_X64),-m64,) -fno-common -fno-strict-aliasing -pipe -freg-struct-return -ffreestanding -maccumulate-outgoing-args -funroll-loops -mmmx -msse -msse2 -fomit-frame-pointer -nostdinc -DMODULE -D_LOOSE_KERNEL_NAMES -O2 $(GT2629) - - -EXTRA_CFLAGS += -I$(OPENAIR2_DIR)/COMMON -I$(OPENAIR2_DIR)/PHY_INTERFACE -I$(OPENAIR2_DIR)/UTIL/TIMER -I$(OPENAIR2_DIR)/UTIL/MATH -I$(OPENAIR2_DIR)/UTIL/LISTS -I$(OPENAIR2_DIR)/UTIL/MEM -I$(OPENAIR2_DIR)/LAYER2/RLC -I$(OPENAIR2_DIR)/LAYER2/RLC/UM_v6.1.0_LITE -I$(OPENAIR2_DIR)/LAYER2/RLC/TM -I$(OPENAIR2_DIR)/LAYER2/RLC/AM -I$(OPENAIR2_DIR)/LAYER2/PDCP -I$(OPENAIR2_DIR) -I$(OPENAIR3_DIR)/MESH -I$(OPENAIR3_DIR)/MESH/RRM - diff --git a/openair2/LAYER2/Makefile.inc b/openair2/LAYER2/Makefile.inc index c0e4df5617..2f5cea7555 100644 --- a/openair2/LAYER2/Makefile.inc +++ b/openair2/LAYER2/Makefile.inc @@ -54,10 +54,6 @@ SOURCES_L2 += $(RLC_UM_DIR)/rlc_um_reassembly.c SOURCES_L2 += $(RLC_UM_DIR)/rlc_um_receiver.c SOURCES_L2 += $(RLC_UM_DIR)/rlc_um_dar.c -ifeq ($(OPENAIR_EMU),1) -SOURCES_L2 += $(RLC_UM_DIR)/rlc_um_very_simple_test.c -endif - SOURCES_L2 += $(RLC_DIR)/rlc_mac.c SOURCES_L2 += $(RLC_DIR)/rlc.c SOURCES_L2 += $(RLC_DIR)/rlc_rrc.c diff --git a/openair2/LAYER2/PDCP_v10.1.0/COPYING b/openair2/LAYER2/PDCP_v10.1.0/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/PDCP_v10.1.0/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c old mode 100755 new mode 100644 index b058951c87..604b7c33a1 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -1,43 +1,35 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file pdcp.c * \brief pdcp interface with RLC - * \author Lionel GAUTHIER and Navid Nikaein + * \author Navid Nikaein and Lionel GAUTHIER * \date 2009-2012 + * \email navid.nikaein@eurecom.fr * \version 1.0 */ #define PDCP_C -#ifndef USER_MODE -#include -#endif +//#define DEBUG_PDCP_FIFO_FLUSH_SDU + #include "assertions.h" #include "hashtable.h" #include "pdcp.h" @@ -73,12 +65,15 @@ #endif #include "ENB_APP/enb_config.h" +#include "../../ENB_APP/enb_config.h" + #include "LAYER2/PROTO_AGENT/proto_agent.h" -#ifndef OAI_EMU extern int otg_enabled; -#endif + +#include "common/ran_context.h" +extern RAN_CONTEXT_t RC; //----------------------------------------------------------------------------- /* @@ -89,7 +84,7 @@ extern int otg_enabled; * code at targets/TEST/PDCP/test_pdcp.c:test_pdcp_data_req() */ boolean_t pdcp_data_req( - const protocol_ctxt_t* const ctxt_pP, + protocol_ctxt_t* ctxt_pP, const srb_flag_t srb_flagP, const rb_id_t rb_idP, const mui_t muiP, @@ -111,7 +106,6 @@ boolean_t pdcp_data_req( rlc_op_status_t rlc_status; boolean_t ret = TRUE; - hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ,VCD_FUNCTION_IN); @@ -123,11 +117,22 @@ boolean_t pdcp_data_req( T(T_ENB_PDCP_DL, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->rnti), T_INT(rb_idP), T_INT(sdu_buffer_sizeP)); #endif + if (sdu_buffer_sizeP == 0) { + LOG_W(PDCP, "Handed SDU is of size 0! Ignoring...\n"); + return FALSE; + } + + /* + * XXX MAX_IP_PACKET_SIZE is 4096, shouldn't this be MAX SDU size, which is 8188 bytes? + */ + AssertFatal(sdu_buffer_sizeP<= MAX_IP_PACKET_SIZE,"Requested SDU size (%d) is bigger than that can be handled by PDCP (%u)!\n", + sdu_buffer_sizeP, MAX_IP_PACKET_SIZE); + if (modeP == PDCP_TRANSMISSION_MODE_TRANSPARENT) { AssertError (rb_idP < NB_RB_MBMS_MAX, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, NB_RB_MBMS_MAX, ctxt_pP->module_id, ctxt_pP->rnti); } else { if (srb_flagP) { - AssertError (rb_idP < 2, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, 2, ctxt_pP->module_id, ctxt_pP->rnti); + AssertError (rb_idP < 3, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, 3, ctxt_pP->module_id, ctxt_pP->rnti); } else { AssertError (rb_idP < maxDRB, return FALSE, "RB id is too high (%u/%d) %u %u!\n", rb_idP, maxDRB, ctxt_pP->module_id, ctxt_pP->rnti); } @@ -139,40 +144,27 @@ boolean_t pdcp_data_req( if (h_rc != HASH_TABLE_OK) { if (modeP != PDCP_TRANSMISSION_MODE_TRANSPARENT) { LOG_W(PDCP, PROTOCOL_CTXT_FMT" Instance is not configured for rb_id %d Ignoring SDU...\n", - PROTOCOL_CTXT_ARGS(ctxt_pP), - rb_idP); - return FALSE; + PROTOCOL_CTXT_ARGS(ctxt_pP), + rb_idP); + ctxt_pP->configured=FALSE; + return FALSE; + } + }else{ + // instance for a given RB is configured + ctxt_pP->configured=TRUE; } - } - - if (sdu_buffer_sizeP == 0) { - LOG_W(PDCP, "Handed SDU is of size 0! Ignoring...\n"); - return FALSE; - } - - /* - * XXX MAX_IP_PACKET_SIZE is 4096, shouldn't this be MAX SDU size, which is 8188 bytes? - */ - - if (sdu_buffer_sizeP > MAX_IP_PACKET_SIZE) { - LOG_E(PDCP, "Requested SDU size (%d) is bigger than that can be handled by PDCP (%u)!\n", - sdu_buffer_sizeP, MAX_IP_PACKET_SIZE); - // XXX What does following call do? - mac_xface->macphy_exit("PDCP sdu buffer size > MAX_IP_PACKET_SIZE"); - } - + if (ctxt_pP->enb_flag == ENB_FLAG_NO) { start_meas(&eNB_pdcp_stats[ctxt_pP->module_id].data_req); } else { start_meas(&UE_pdcp_stats[ctxt_pP->module_id].data_req); } - // PDCP transparent mode for MBMS traffic if (modeP == PDCP_TRANSMISSION_MODE_TRANSPARENT) { LOG_D(PDCP, " [TM] Asking for a new mem_block of size %d\n",sdu_buffer_sizeP); - pdcp_pdu_p = get_free_mem_block(sdu_buffer_sizeP); + pdcp_pdu_p = get_free_mem_block(sdu_buffer_sizeP, __func__); if (pdcp_pdu_p != NULL) { memcpy(&pdcp_pdu_p->data[0], sdu_buffer_pP, sdu_buffer_sizeP); @@ -213,7 +205,7 @@ boolean_t pdcp_data_req( /* * Allocate a new block for the new PDU (i.e. PDU header and SDU payload) */ - pdcp_pdu_p = get_free_mem_block(pdcp_pdu_size); + pdcp_pdu_p = get_free_mem_block(pdcp_pdu_size, __func__); if (pdcp_pdu_p != NULL) { /* @@ -267,12 +259,12 @@ boolean_t pdcp_data_req( * Validate incoming sequence number, there might be a problem with PDCP initialization */ if (current_sn > pdcp_calculate_max_seq_num_for_given_size(pdcp_p->seq_num_size)) { - LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" Generated sequence number (%lu) is greater than a sequence number could ever be!\n"\ + LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" Generated sequence number (%"PRIu16") is greater than a sequence number could ever be!\n"\ "There must be a problem with PDCP initialization, ignoring this PDU...\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_p), current_sn); - free_mem_block(pdcp_pdu_p); + free_mem_block(pdcp_pdu_p, __func__); if (ctxt_pP->enb_flag == ENB_FLAG_NO) { stop_meas(&eNB_pdcp_stats[ctxt_pP->module_id].data_req); @@ -366,33 +358,54 @@ boolean_t pdcp_data_req( LOG_F(PDCP,"\n"); #endif + static cudu_params_t *cudu = NULL; + if (ctxt_pP->enb_flag == 1) + { + if (cudu == NULL) + { + cudu = get_cudu_config(); + } + static int agent_started = 1; + if (agent_started == 1) + { + for (int k =0; kserving_dus; k++) + { + proto_agent_start(0, cudu->cu[k].cu_id, cudu->cu[k].du_type, cudu); + } + agent_started = 0; + } + } + if ((pdcp_pdu_p!=NULL) && (srb_flagP == 0) && (ctxt_pP->enb_flag == 1)) + { - + if (cudu->cu_balancing == CU_BALANCING_ALL) + { + for (int j =0; jserving_dus; j++) + { + proto_agent_send_rlc_data_req(0,cudu->cu[j].du_type, ctxt_pP, srb_flagP, MBMS_FLAG_NO,rb_idP, muiP, confirmP, pdcp_pdu_size, pdcp_pdu_p); + } - Enb_properties_array_t *enb_properties_p = NULL; - - enb_properties_p = enb_config_get(); - - static int agent_started = 1; -/* - if (agent_started == 1) - { - LOG_I(PROTO_AGENT,"PDCP: starting client side with mod_id %d \n",ctxt_pP->module_id); - agent_started = proto_agent_start(ctxt_pP->module_id, enb_properties_p); - }*/ - - - if (pdcp_pdu_p!=NULL) - { - proto_agent_send_rlc_data_req(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP, confirmP, pdcp_pdu_size, pdcp_pdu_p); - free_mem_block(pdcp_pdu_p); - rlc_status = ack_result; - } - else - { - //It should never get here - rlc_status = rlc_data_req(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP, confirmP, pdcp_pdu_size, pdcp_pdu_p); - } + } + else if (cudu->cu_balancing == CU_BALANCING_ROUND_ROBIN) + { + int selected_du = select_du(cudu->serving_dus); + proto_agent_send_rlc_data_req(cudu->cu[selected_du].cu_id,cudu->cu[selected_du].du_type,ctxt_pP, srb_flagP, MBMS_FLAG_NO,rb_idP, muiP, confirmP, pdcp_pdu_size, pdcp_pdu_p); + } + else + { + int index = cudu->cu_balancing; + proto_agent_send_rlc_data_req(cudu->cu[index].cu_id,cudu->cu[index].du_type,ctxt_pP, srb_flagP, MBMS_FLAG_NO,rb_idP, muiP, confirmP, pdcp_pdu_size, pdcp_pdu_p); + } + + free_mem_block(pdcp_pdu_p, __FUNCTION__); + rlc_status = ack_result; + } + else + { + //It should never get here + rlc_status = rlc_data_req(ctxt_pP, srb_flagP, MBMS_FLAG_NO, rb_idP, muiP, confirmP, pdcp_pdu_size, pdcp_pdu_p); + } + } switch (rlc_status) { @@ -482,11 +495,6 @@ pdcp_data_ind( VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_IN); -#ifdef OAI_EMU - - CHECK_CTXT_ARGS(ctxt_pP); - -#endif #ifdef PDCP_MSG_PRINT int i=0; LOG_F(PDCP,"[MSG] PDCP UL %s PDU on rb_id %d\n", (srb_flagP)? "CONTROL" : "DATA", rb_idP); @@ -550,7 +558,7 @@ pdcp_data_ind( PROTOCOL_CTXT_FMT"Could not get PDCP instance key 0x%"PRIx64"\n", PROTOCOL_CTXT_ARGS(ctxt_pP), key); - free_mem_block(sdu_buffer_pP); + free_mem_block(sdu_buffer_pP, __func__); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT); return FALSE; } @@ -607,7 +615,7 @@ pdcp_data_ind( PROTOCOL_PDCP_CTXT_FMT"Incoming (from RLC) SDU is short of size (size:%d)! Ignoring...\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p), sdu_buffer_sizeP); - free_mem_block(sdu_buffer_pP); + free_mem_block(sdu_buffer_pP, __func__); if (ctxt_pP->enb_flag) { stop_meas(&eNB_pdcp_stats[ctxt_pP->module_id].data_ind); @@ -638,7 +646,7 @@ pdcp_data_ind( */ #if 0 LOG_D(PDCP, "Ignoring PDU...\n"); - free_mem_block(sdu_buffer); + free_mem_block(sdu_buffer, __func__); return FALSE; #else //LOG_W(PDCP, "Delivering out-of-order SDU to upper layer...\n"); @@ -685,9 +693,9 @@ pdcp_data_ind( rb_id, sdu_buffer_sizeP - pdcp_header_len - pdcp_tailer_len, (uint8_t*)&sdu_buffer_pP->data[pdcp_header_len]); - free_mem_block(sdu_buffer_pP); + free_mem_block(sdu_buffer_pP, __func__); - // free_mem_block(new_sdu); + // free_mem_block(new_sdu, __func__); if (ctxt_pP->enb_flag) { stop_meas(&eNB_pdcp_stats[ctxt_pP->module_id].data_ind); } else { @@ -734,52 +742,9 @@ pdcp_data_ind( payload_offset=0; } -#if defined(USER_MODE) && defined(OAI_EMU) - - if (oai_emulation.info.otg_enabled == 1) { - //unsigned int dst_instance; - int ctime; - - if ((pdcp_p->rlc_mode == RLC_MODE_AM)&&(MBMS_flagP==0) ) { - pdcp_p->last_submitted_pdcp_rx_sn = sequence_number; - } - -#if defined(DEBUG_PDCP_PAYLOAD) - rlc_util_print_hex_octets(PDCP, - (unsigned char*)&sdu_buffer_pP->data[payload_offset], - sdu_buffer_sizeP - payload_offset); -#endif - - ctime = oai_emulation.info.time_ms; // avg current simulation time in ms : we may get the exact time through OCG? - if (MBMS_flagP == 0){ - LOG_D(PDCP, - PROTOCOL_PDCP_CTXT_FMT"Check received buffer : (dst %d)\n", - PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p), - ctxt_pP->instance); - } - if (otg_rx_pkt( - ctxt_pP->instance, - ctime, - (const char*)(&sdu_buffer_pP->data[payload_offset]), - sdu_buffer_sizeP - payload_offset ) == 0 ) { - free_mem_block(sdu_buffer_pP); - - if (ctxt_pP->enb_flag) { - stop_meas(&eNB_pdcp_stats[ctxt_pP->module_id].data_ind); - } else { - stop_meas(&UE_pdcp_stats[ctxt_pP->module_id].data_ind); - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_IND,VCD_FUNCTION_OUT); - return TRUE; - } - } - -#else - if (otg_enabled==1) { LOG_D(OTG,"Discarding received packed\n"); - free_mem_block(sdu_buffer_pP); + free_mem_block(sdu_buffer_pP, __func__); if (ctxt_pP->enb_flag) { stop_meas(&eNB_pdcp_stats[ctxt_pP->module_id].data_ind); @@ -791,9 +756,6 @@ pdcp_data_ind( return TRUE; } -#endif - - // XXX Decompression would be done at this point /* @@ -834,7 +796,7 @@ pdcp_data_ind( #endif if (FALSE == packet_forwarded) { - new_sdu_p = get_free_mem_block(sdu_buffer_sizeP - payload_offset + sizeof (pdcp_data_ind_header_t)); + new_sdu_p = get_free_mem_block(sdu_buffer_sizeP - payload_offset + sizeof (pdcp_data_ind_header_t), __func__); if (new_sdu_p) { if (pdcp_p->rlc_mode == RLC_MODE_AM ) { @@ -846,20 +808,27 @@ pdcp_data_ind( */ memset(new_sdu_p->data, 0, sizeof (pdcp_data_ind_header_t)); ((pdcp_data_ind_header_t *) new_sdu_p->data)->data_size = sdu_buffer_sizeP - payload_offset; + AssertFatal((sdu_buffer_sizeP - payload_offset >= 0), "invalid PDCP SDU size!"); // Here there is no virtualization possible // set ((pdcp_data_ind_header_t *) new_sdu_p->data)->inst for IP layer here if (ctxt_pP->enb_flag == ENB_FLAG_NO) { ((pdcp_data_ind_header_t *) new_sdu_p->data)->rb_id = rb_id; -#if defined(OAI_EMU) - ((pdcp_data_ind_header_t*) new_sdu_p->data)->inst = ctxt_pP->module_id + oai_emulation.info.nb_enb_local - oai_emulation.info.first_ue_local; +#if defined(ENABLE_USE_MME) + /* for the UE compiled in S1 mode, we need 1 here + * for the UE compiled in noS1 mode, we need 0 + * TODO: be sure of this + */ + ((pdcp_data_ind_header_t*) new_sdu_p->data)->inst = 1; #endif } else { ((pdcp_data_ind_header_t*) new_sdu_p->data)->rb_id = rb_id + (ctxt_pP->module_id * maxDRB); -#if defined(OAI_EMU) - ((pdcp_data_ind_header_t*) new_sdu_p->data)->inst = ctxt_pP->module_id - oai_emulation.info.first_enb_local; -#endif } +#ifdef DEBUG_PDCP_FIFO_FLUSH_SDU + static uint32_t pdcp_inst = 0; + ((pdcp_data_ind_header_t*) new_sdu_p->data)->inst = pdcp_inst++; + LOG_D(PDCP, "inst=%d size=%d\n", ((pdcp_data_ind_header_t*) new_sdu_p->data)->inst, ((pdcp_data_ind_header_t *) new_sdu_p->data)->data_size); +#endif memcpy(&new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], \ &sdu_buffer_pP->data[payload_offset], \ @@ -868,7 +837,7 @@ pdcp_data_ind( /* Print octets of incoming data in hexadecimal form */ LOG_D(PDCP, "Following content has been received from RLC (%d,%d)(PDCP header has already been removed):\n", - sdu_buffer_sizeP - payload_offset + sizeof(pdcp_data_ind_header_t), + sdu_buffer_sizeP - payload_offset + (int)sizeof(pdcp_data_ind_header_t), sdu_buffer_sizeP - payload_offset); //util_print_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset); //util_flush_hex_octets(PDCP, &new_sdu_p->data[sizeof (pdcp_data_ind_header_t)], sdu_buffer_sizeP - payload_offset); @@ -896,7 +865,7 @@ pdcp_data_ind( #endif - free_mem_block(sdu_buffer_pP); + free_mem_block(sdu_buffer_pP, __func__); if (ctxt_pP->enb_flag) { stop_meas(&eNB_pdcp_stats[ctxt_pP->module_id].data_ind); @@ -922,23 +891,6 @@ pdcp_run ( int result; protocol_ctxt_t ctxt; #endif - - static int agent_started = 1; - - - Enb_properties_array_t *enb_properties_p = NULL; - - enb_properties_p = enb_config_get(); - - if (agent_started == 1) - { - LOG_I(PROTO_AGENT,"Starting the PDCP instance\n"); - //LOG_I(PROTO_AGENT,"PDCP: starting client side with mod_id %d \n",ctxt_pP->module_id); - - agent_started = proto_agent_start(ctxt_pP->module_id, enb_properties_p); - } - - if (ctxt_pP->enb_flag) { start_meas(&eNB_pdcp_stats[ctxt_pP->module_id].pdcp_run); @@ -968,7 +920,7 @@ pdcp_run ( RRC_DCCH_DATA_REQ (msg_p).frame, 0, RRC_DCCH_DATA_REQ (msg_p).eNB_index); - LOG_D(PDCP, PROTOCOL_CTXT_FMT"Received %s from %s: instance %d, rb_id %d, muiP %d, confirmP %d, mode %d\n", + LOG_I(PDCP, PROTOCOL_CTXT_FMT"Received %s from %s: instance %d, rb_id %d, muiP %d, confirmP %d, mode %d\n", PROTOCOL_CTXT_ARGS(&ctxt), msg_name, ITTI_MSG_ORIGIN_NAME(msg_p), @@ -994,6 +946,21 @@ pdcp_run ( AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); break; + case RRC_PCCH_DATA_REQ: + { + sdu_size_t sdu_buffer_sizeP; + sdu_buffer_sizeP = RRC_PCCH_DATA_REQ(msg_p).sdu_size; + uint8_t CC_id = RRC_PCCH_DATA_REQ(msg_p).CC_id; + uint8_t ue_index = RRC_PCCH_DATA_REQ(msg_p).ue_index; + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_paging[ue_index] = sdu_buffer_sizeP; + if (sdu_buffer_sizeP > 0) { + memcpy(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].paging[ue_index], RRC_PCCH_DATA_REQ(msg_p).sdu_p, sdu_buffer_sizeP); + } + //paging pdcp log + LOG_D(PDCP, "PDCP Received RRC_PCCH_DATA_REQ CC_id %d length %d \n", CC_id, sdu_buffer_sizeP); + } + break; + default: LOG_E(PDCP, "Received unexpected message %s\n", msg_name); break; @@ -1027,11 +994,6 @@ pdcp_run ( itti_send_msg_to_task(TASK_MAC_ENB, 3, msg_resp_p); } # endif -#endif - -#if defined(USER_MODE) && defined(OAI_EMU) - pdcp_fifo_read_input_sdus_from_otg(ctxt_pP); - #endif // IP/NAS -> PDCP traffic : TX, read the pkt from the upper layer buffer @@ -1083,6 +1045,13 @@ pdcp_remove_UE( // check and remove SRBs first + for(int i = 0;irnti){ + pdcp_eNB_UE_instance_to_rnti[i] = NOT_A_RNTI; + break; + } + } + for (srb_id=0; srb_id<2; srb_id++) { key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, srb_id, SRB_FLAG_YES); h_rc = hashtable_remove(pdcp_coll_p, key); @@ -1111,9 +1080,10 @@ rrc_pdcp_config_asn1_req ( uint8_t *const kRRCenc_pP, uint8_t *const kRRCint_pP, uint8_t *const kUPenc_pP -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) ,PMCH_InfoList_r9_t* const pmch_InfoList_r9_pP #endif + ,rb_id_t *const defaultDRB ) //----------------------------------------------------------------------------- { @@ -1135,7 +1105,9 @@ rrc_pdcp_config_asn1_req ( hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; -#ifdef Rel10 + hash_key_t key_defaultDRB = HASHTABLE_NOT_A_KEY_VALUE; + hashtable_rc_t h_defaultDRB_rc; +#if defined(Rel10) || defined(Rel14) int i,j; MBMS_SessionInfoList_r9_t *mbms_SessionInfoList_r9_p = NULL; MBMS_SessionInfo_r9_t *MBMS_SessionInfo_p = NULL; @@ -1155,7 +1127,7 @@ rrc_pdcp_config_asn1_req ( srb_id = srb2add_list_pP->list.array[cnt]->srb_Identity; srb_toaddmod_p = srb2add_list_pP->list.array[cnt]; rlc_type = RLC_MODE_AM; - lc_id = srb_id + 2; + lc_id = srb_id; key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, srb_id, SRB_FLAG_YES); h_rc = hashtable_get(pdcp_coll_p, key, (void**)&pdcp_p); @@ -1216,6 +1188,22 @@ rrc_pdcp_config_asn1_req ( break; case SRB_ToAddMod__rlc_Config_PR_defaultValue: + pdcp_config_req_asn1 ( + ctxt_pP, + pdcp_p, + SRB_FLAG_YES, + rlc_type, + action, + lc_id, + mch_id, + srb_id, + srb_sn, + 0, // drb_report + 0, // header compression + security_modeP, + kRRCenc_pP, + kRRCint_pP, + kUPenc_pP); // already the default values break; @@ -1235,8 +1223,19 @@ rrc_pdcp_config_asn1_req ( drb_toaddmod_p = drb2add_list_pP->list.array[cnt]; drb_id = drb_toaddmod_p->drb_Identity;// + drb_id_offset; + if (drb_toaddmod_p->logicalChannelIdentity) { + lc_id = *(drb_toaddmod_p->logicalChannelIdentity); + } else { + LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" logicalChannelIdentity is missing in DRB-ToAddMod information element!\n", + PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p)); + continue; + } + + if (lc_id == 1 || lc_id == 2) { + LOG_E(RLC, PROTOCOL_CTXT_FMT" logicalChannelIdentity = %ld is invalid in RRC message when adding DRB!\n", PROTOCOL_CTXT_ARGS(ctxt_pP), lc_id); + continue; + } - lc_id = drb_id + 2; DevCheck4(drb_id < maxDRB, drb_id, maxDRB, ctxt_pP->module_id, ctxt_pP->rnti); key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, drb_id, SRB_FLAG_NO); h_rc = hashtable_get(pdcp_coll_p, key, (void**)&pdcp_p); @@ -1252,7 +1251,21 @@ rrc_pdcp_config_asn1_req ( pdcp_p = calloc(1, sizeof(pdcp_t)); h_rc = hashtable_insert(pdcp_coll_p, key, pdcp_p); - if (h_rc != HASH_TABLE_OK) { + // save the first configured DRB-ID as the default DRB-ID + if ((defaultDRB != NULL) && (*defaultDRB == drb_id)) { + key_defaultDRB = PDCP_COLL_KEY_DEFAULT_DRB_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag); + h_defaultDRB_rc = hashtable_insert(pdcp_coll_p, key_defaultDRB, pdcp_p); + } else { + h_defaultDRB_rc = HASH_TABLE_OK; // do not trigger any error handling if this is not a default DRB + } + + if (h_defaultDRB_rc != HASH_TABLE_OK) { + LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" CONFIG_ACTION_ADD ADD default DRB key 0x%"PRIx64" FAILED\n", + PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p), + key_defaultDRB); + free(pdcp_p); + return TRUE; + } else if (h_rc != HASH_TABLE_OK) { LOG_E(PDCP, PROTOCOL_PDCP_CTXT_FMT" CONFIG_ACTION_ADD ADD key 0x%"PRIx64" FAILED\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP, pdcp_p), key); @@ -1317,7 +1330,7 @@ rrc_pdcp_config_asn1_req ( break; default: - LOG_W(PDCP,"[MOD_id %u/%u][RB %u] unknown drb_toaddmod->PDCP_Config->headerCompression->present \n", + LOG_W(PDCP,PROTOCOL_PDCP_CTXT_FMT"[RB %ld] unknown drb_toaddmod->PDCP_Config->headerCompression->present \n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_p), drb_id); break; } @@ -1346,16 +1359,16 @@ rrc_pdcp_config_asn1_req ( for (cnt=0; cntlist.count; cnt++) { pdrb_id_p = drb2release_list_pP->list.array[cnt]; drb_id = *pdrb_id_p; - lc_id = drb_id + 2; - key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, srb_id, SRB_FLAG_NO); + key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, drb_id, SRB_FLAG_NO); h_rc = hashtable_get(pdcp_coll_p, key, (void**)&pdcp_p); if (h_rc != HASH_TABLE_OK) { - LOG_E(PDCP, PROTOCOL_CTXT_FMT" PDCP REMOVE FAILED drb_id %u\n", + LOG_E(PDCP, PROTOCOL_CTXT_FMT" PDCP REMOVE FAILED drb_id %ld\n", PROTOCOL_CTXT_ARGS(ctxt_pP), drb_id); continue; } + lc_id = pdcp_p->lcid; action = CONFIG_ACTION_REMOVE; pdcp_config_req_asn1 ( @@ -1375,10 +1388,24 @@ rrc_pdcp_config_asn1_req ( kRRCint_pP, kUPenc_pP); h_rc = hashtable_remove(pdcp_coll_p, key); + + if ((defaultDRB != NULL) && (*defaultDRB == drb_id)) { + // default DRB being removed. nevertheless this shouldn't happen as removing default DRB is not allowed in standard + key_defaultDRB = PDCP_COLL_KEY_DEFAULT_DRB_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag); + h_defaultDRB_rc = hashtable_get(pdcp_coll_p, key_defaultDRB, (void**)&pdcp_p); + + if (h_defaultDRB_rc == HASH_TABLE_OK) { + h_defaultDRB_rc = hashtable_remove(pdcp_coll_p, key_defaultDRB); + } else { + LOG_E(PDCP, PROTOCOL_CTXT_FMT" PDCP REMOVE FAILED default DRB\n", PROTOCOL_CTXT_ARGS(ctxt_pP)); + } + } else { + key_defaultDRB = HASH_TABLE_OK; // do not trigger any error handling if this is not a default DRB + } } } -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) if (pmch_InfoList_r9_pP != NULL) { for (i=0; ilist.count; i++) { @@ -1460,7 +1487,17 @@ pdcp_config_req_asn1 ( if (ctxt_pP->enb_flag == ENB_FLAG_YES) { pdcp_pP->is_ue = FALSE; //pdcp_eNB_UE_instance_to_rnti[ctxtP->module_id] = ctxt_pP->rnti; - pdcp_eNB_UE_instance_to_rnti[pdcp_eNB_UE_instance_to_rnti_index] = ctxt_pP->rnti; +// pdcp_eNB_UE_instance_to_rnti[pdcp_eNB_UE_instance_to_rnti_index] = ctxt_pP->rnti; + if( srb_flagP == SRB_FLAG_NO ) { + for(int i = 0;irnti; + pdcp_eNB_UE_instance_to_rnti_index = (pdcp_eNB_UE_instance_to_rnti_index + 1) % NUMBER_OF_UE_MAX; + } //pdcp_eNB_UE_instance_to_rnti_index = (pdcp_eNB_UE_instance_to_rnti_index + 1) % NUMBER_OF_UE_MAX; } else { pdcp_pP->is_ue = TRUE; @@ -1491,13 +1528,14 @@ pdcp_config_req_asn1 ( pdcp_pP->first_missing_pdu = -1; pdcp_pP->rx_hfn_offset = 0; - LOG_D(PDCP, PROTOCOL_PDCP_CTXT_FMT" Action ADD LCID %d (rb id %d) " + LOG_N(PDCP, PROTOCOL_PDCP_CTXT_FMT" Action ADD LCID %d (%s id %d) " "configured with SN size %d bits and RLC %s\n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_pP), lc_idP, + (srb_flagP == SRB_FLAG_YES) ? "SRB" : "DRB", rb_idP, pdcp_pP->seq_num_size, - (rlc_modeP == RLC_MODE_AM ) ? "AM" : (rlc_modeP == RLC_MODE_TM) ? "TM" : "UM"); + (rlc_modeP == RLC_MODE_AM ) ? "AM" : (rlc_modeP == RLC_MODE_TM) ? "TM" : "UM"); /* Setup security */ if (security_modeP != 0xff) { pdcp_config_set_security( @@ -1539,8 +1577,8 @@ pdcp_config_req_asn1 ( pdcp_pP->seq_num_size=5; } - LOG_D(PDCP,PROTOCOL_PDCP_CTXT_FMT" Action MODIFY LCID %d " - "RB id %d configured with SN size %d and RLC %s \n", + LOG_N(PDCP,PROTOCOL_PDCP_CTXT_FMT" Action MODIFY LCID %d " + "RB id %d reconfigured with SN size %d and RLC %s \n", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_pP), lc_idP, rb_idP, @@ -1572,7 +1610,7 @@ pdcp_config_req_asn1 ( memset(pdcp_pP, 0, sizeof(pdcp_t)); break; -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) case CONFIG_ACTION_MBMS_ADD: case CONFIG_ACTION_MBMS_MODIFY: @@ -1739,7 +1777,7 @@ rrc_pdcp_config_req ( pdcp_p->cipheringAlgorithm, pdcp_p->integrityProtAlgorithm ); } else { - LOG_W(PDCP,"[%s %d] bad security mode %d", security_modeP); + LOG_W(PDCP,PROTOCOL_PDCP_CTXT_FMT" bad security mode %d", PROTOCOL_PDCP_CTXT_ARGS(ctxt_pP,pdcp_p), security_modeP); } break; @@ -1890,7 +1928,7 @@ void pdcp_layer_init(void) { module_id_t instance; -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) mbms_session_id_t session_id; mbms_service_id_t service_id; #endif @@ -1902,7 +1940,7 @@ void pdcp_layer_init(void) AssertFatal(pdcp_coll_p != NULL, "UNRECOVERABLE error, PDCP hashtable_create failed"); for (instance = 0; instance < NUMBER_OF_UE_MAX; instance++) { -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) for (service_id = 0; service_id < maxServiceCount; service_id++) { for (session_id = 0; session_id < maxSessionPerPMCH; session_id++) { @@ -1916,7 +1954,7 @@ void pdcp_layer_init(void) for (instance = 0; instance < NUMBER_OF_eNB_MAX; instance++) { -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) for (service_id = 0; service_id < maxServiceCount; service_id++) { for (session_id = 0; session_id < maxSessionPerPMCH; session_id++) { diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h old mode 100755 new mode 100644 index 9e5b15f5a3..30a45acc72 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file LAYER2/PDCP_v10.1.0/pdcp.h * \brief pdcp interface with RLC, RRC @@ -73,16 +65,16 @@ #ifndef NON_ACCESS_STRATUM #include "UTIL/MEM/mem_block.h" #include "UTIL/LISTS/list.h" -#include "COMMON/mac_rrc_primitives.h" #endif //NON_ACCESS_STRATUM //----------------------------------------------------------------------------- +#include "RRC/LITE/defs.h" #include "COMMON/platform_constants.h" #include "COMMON/platform_types.h" #include "DRB-ToAddMod.h" #include "DRB-ToAddModList.h" #include "SRB-ToAddMod.h" #include "SRB-ToAddModList.h" -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) #include "MBMS-SessionInfoList-r9.h" #include "PMCH-InfoList-r9.h" #endif @@ -192,7 +184,7 @@ typedef struct pdcp_s { } pdcp_t; -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) typedef struct pdcp_mbms_s { boolean_t instanciated_instance; rb_id_t rb_id; @@ -221,7 +213,7 @@ typedef struct pdcp_mbms_s { * @ingroup _pdcp */ public_pdcp(boolean_t pdcp_data_req( - const protocol_ctxt_t* const ctxt_pP, + protocol_ctxt_t* ctxt_pP, const srb_flag_t srb_flagP, const rb_id_t rb_id, const mui_t muiP, @@ -279,6 +271,7 @@ public_pdcp(void rrc_pdcp_config_req ( * \param[in] kRRCenc RRC encryption key * \param[in] kRRCint RRC integrity key * \param[in] kUPenc User-Plane encryption key +* \param[in] defaultDRB Default DRB ID * \return A status about the processing, OK or error code. */ public_pdcp( @@ -291,9 +284,10 @@ public_pdcp( uint8_t *const kRRCenc, uint8_t *const kRRCint, uint8_t *const kUPenc -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) ,PMCH_InfoList_r9_t *pmch_InfoList_r9 #endif + ,rb_id_t *const defaultDRB )); /*! \fn boolean_t pdcp_config_req_asn1 (const protocol_ctxt_t* const ctxt_pP, srb_flag_t srb_flagP, uint32_t action, rb_id_t rb_id, uint8_t rb_sn, uint8_t rb_report, uint16_t header_compression_profile, uint8_t security_mode) @@ -454,7 +448,7 @@ public_pdcp(pdcp_stats_t eNB_pdcp_stats[NUMBER_OF_eNB_MAX];) protected_pdcp(rnti_t pdcp_UE_UE_module_id_to_rnti[NUMBER_OF_UE_MAX];) protected_pdcp(rnti_t pdcp_eNB_UE_instance_to_rnti[NUMBER_OF_UE_MAX];) // for noS1 mode protected_pdcp(unsigned int pdcp_eNB_UE_instance_to_rnti_index;) -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) public_pdcp(pdcp_mbms_t pdcp_mbms_array_ue[NUMBER_OF_UE_MAX][maxServiceCount][maxSessionPerPMCH];) // some constants from openair2/RRC/LITE/MESSAGES/asn1_constants.h public_pdcp(pdcp_mbms_t pdcp_mbms_array_eNB[NUMBER_OF_eNB_MAX][maxServiceCount][maxSessionPerPMCH];) // some constants from openair2/RRC/LITE/MESSAGES/asn1_constants.h #endif @@ -467,12 +461,25 @@ protected_pdcp(unsigned char pdcp_input_sdu_buffer[MAX_IP_PACKET_SIZE]; protected_pdcp(sdu_size_t pdcp_input_index_header;) protected_pdcp(sdu_size_t pdcp_input_sdu_size_read;) protected_pdcp(sdu_size_t pdcp_input_sdu_remaining_size_to_read;) + #define PDCP_COLL_KEY_VALUE(mODULE_iD, rNTI, iS_eNB, rB_iD, iS_sRB) \ ((hash_key_t)mODULE_iD | \ (((hash_key_t)(rNTI)) << 8) | \ (((hash_key_t)(iS_eNB)) << 24) | \ (((hash_key_t)(rB_iD)) << 25) | \ - (((hash_key_t)(iS_sRB)) << 33)) + (((hash_key_t)(iS_sRB)) << 33) | \ + (((hash_key_t)(0x55)) << 34)) + +// hash key to the same PDCP as indexed by PDCP_COLL_KEY_VALUE(... rB_iD, iS_sRB=0) where rB_iD +// is the default DRB ID. The hidden code 0x55 indicates the key is indexed by (rB_iD,is_sRB) +// whereas the hidden code 0xaa indicates the key is for default DRB only +#define PDCP_COLL_KEY_DEFAULT_DRB_VALUE(mODULE_iD, rNTI, iS_eNB) \ + ((hash_key_t)mODULE_iD | \ + (((hash_key_t)(rNTI)) << 8) | \ + (((hash_key_t)(iS_eNB)) << 24) | \ + (((hash_key_t)(0xff)) << 25) | \ + (((hash_key_t)(0x00)) << 33) | \ + (((hash_key_t)(0xaa)) << 34)) // service id max val is maxServiceCount = 16 (asn1_constants.h) diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c old mode 100755 new mode 100644 index e858008803..abec97ddfd --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*************************************************************************** pdcp_control_primitives.c ------------------- @@ -51,7 +44,7 @@ configure_pdcp_req (struct pdcp_entity *pdcpP, void *rlcP, uint8_t rlc_sap_typeP //----------------------------------------------------------------------------- mem_block *mb; - mb = get_free_mem_block (sizeof (struct cpdcp_primitive)); + mb = get_free_mem_block (sizeof (struct cpdcp_primitive), __func__); ((struct cpdcp_primitive *) mb->data)->type = CPDCP_CONFIG_REQ; ((struct cpdcp_primitive *) mb->data)->primitive.config_req.rlc_sap = rlcP; ((struct cpdcp_primitive *) mb->data)->primitive.config_req.rlc_type_sap = rlc_sap_typeP; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h old mode 100755 new mode 100644 index 90c4805dde..6226dccc33 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitives_proto_extern.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*************************************************************************** pdcp_control_primitives_proto_extern.h ------------------- diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c old mode 100755 new mode 100644 index ea304f93ae..83a5cad7ff --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c @@ -1,61 +1,50 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file pdcp_fifo.c * \brief pdcp interface with linux IP interface, have a look at http://man7.org/linux/man-pages/man7/netlink.7.html for netlink - * \author Lionel GAUTHIER and Navid Nikaein - * \date 2009 + * \author Navid Nikaein and Lionel GAUTHIER + * \date 2009 - 2016 * \version 0.5 + * \email navid.nikaein@eurecom.fr * \warning This component can be runned only in user-space * @ingroup pdcp */ #define PDCP_FIFO_C #define PDCP_DEBUG 1 +//#define DEBUG_PDCP_FIFO_FLUSH_SDU -#ifndef OAI_EMU extern int otg_enabled; -#endif #include "pdcp.h" #include "pdcp_primitives.h" -#ifdef USER_MODE +#include #include #include #include #include #define rtf_put write #define rtf_get read -#else -#include -#endif //USER_MODE #include "../MAC/extern.h" #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" @@ -66,6 +55,7 @@ extern int otg_enabled; #include "UTIL/LOG/log.h" #include "UTIL/OTG/otg_tx.h" #include "UTIL/FIFO/pad_list.h" +#include "UTIL/LOG/vcd_signal_dumper.h" #include "platform_constants.h" #include "msc.h" @@ -74,6 +64,7 @@ extern int otg_enabled; #ifdef PDCP_USE_NETLINK #include #include +#include "NETWORK_DRIVER/UE_IP/constant.h" extern char nl_rx_buf[NL_MAX_PAYLOAD]; extern struct sockaddr_nl nas_src_addr, nas_dest_addr; @@ -92,6 +83,24 @@ extern Packet_OTG_List_t *otg_pdcp_buffer; #if defined(LINK_ENB_PDCP_TO_GTPV1U) # include "gtpv1u_eNB_task.h" +# include "gtpv1u_eNB_defs.h" +#endif + +extern int gtpv1u_new_data_req( uint8_t enb_module_idP, rnti_t ue_rntiP, uint8_t rab_idP, uint8_t *buffer_pP, uint32_t buf_lenP, uint32_t buf_offsetP); + +/* Prevent de-queueing the same PDCP SDU from the queue twice + * by multiple threads. This has happened in TDD when thread-odd + * is flushing a PDCP SDU after UE_RX() processing; whereas + * thread-even is at a special-subframe, skips the UE_RX() process + * and goes straight to the PDCP SDU flushing. The 2nd flushing + * dequeues the same SDU again causing unexpected behavior. + * + * comment out the MACRO below to disable this protection + */ +#define PDCP_SDU_FLUSH_LOCK + +#ifdef PDCP_SDU_FLUSH_LOCK +static pthread_mutex_t mtex = PTHREAD_MUTEX_INITIALIZER; #endif pdcp_data_req_header_t pdcp_read_header_g; @@ -101,6 +110,42 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t* const ctxt_pP) { //----------------------------------------------------------------------------- +//#if defined(PDCP_USE_NETLINK) && defined(LINUX) + int ret = 0; +//#endif + +#ifdef DEBUG_PDCP_FIFO_FLUSH_SDU +#define THREAD_NAME_LEN 16 + static char threadname[THREAD_NAME_LEN]; + ret = pthread_getname_np(pthread_self(), threadname, THREAD_NAME_LEN); + if (ret != 0) + { + perror("pthread_getname_np : "); + exit_fun("Error getting thread name"); + } +#undef THREAD_NAME_LEN +#endif + +#ifdef PDCP_SDU_FLUSH_LOCK + ret = pthread_mutex_trylock(&mtex); + if (ret == EBUSY) { +#ifdef DEBUG_PDCP_FIFO_FLUSH_SDU + LOG_W(PDCP, "[%s] at SFN/SF=%d/%d wait for PDCP FIFO to be unlocked\n", + threadname, ctxt_pP->frame, ctxt_pP->subframe); +#endif + if (pthread_mutex_lock(&mtex)) { + exit_fun("PDCP_SDU_FLUSH_LOCK lock error!"); + } +#ifdef DEBUG_PDCP_FIFO_FLUSH_SDU + LOG_I(PDCP, "[%s] at SFN/SF=%d/%d PDCP FIFO is unlocked\n", + threadname, ctxt_pP->frame, ctxt_pP->subframe); +#endif + } else if (ret != 0) { + exit_fun("PDCP_SDU_FLUSH_LOCK trylock error!"); + } + +#endif + mem_block_t *sdu_p = list_get_head (&pdcp_sdu_list); int bytes_wrote = 0; int pdcp_nb_sdu_sent = 0; @@ -109,14 +154,14 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t* const ctxt_pP) //MessageDef *message_p = NULL; #endif -#if defined(PDCP_USE_NETLINK) && defined(LINUX) - int ret = 0; -#endif - + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_FLUSH, 1 ); while (sdu_p && cont) { -#if ! defined(OAI_EMU) - ((pdcp_data_ind_header_t *)(sdu_p->data))->inst = 0; +#ifdef DEBUG_PDCP_FIFO_FLUSH_SDU + LOG_D(PDCP, "[%s] SFN/SF=%d/%d inst=%d size=%d\n", + threadname, ctxt_pP->frame, ctxt_pP->subframe, + ((pdcp_data_ind_header_t*) sdu_p->data)->inst, + ((pdcp_data_ind_header_t *) sdu_p->data)->data_size); #endif #if defined(LINK_ENB_PDCP_TO_GTPV1U) @@ -125,14 +170,15 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t* const ctxt_pP) AssertFatal(0, "Now execution should not go here"); LOG_D(PDCP,"Sending to GTPV1U %d bytes\n", ((pdcp_data_ind_header_t *)(sdu_p->data))->data_size); gtpv1u_new_data_req( - ctxt_pP->module_id, //gtpv1u_data_t *gtpv1u_data_p, - ctxt_pP->rnti,//rb_id/maxDRB, TO DO UE ID - ((pdcp_data_ind_header_t *)(sdu_p->data))->rb_id + 4, - &(((uint8_t *) sdu_p->data)[sizeof (pdcp_data_ind_header_t)]), - ((pdcp_data_ind_header_t *)(sdu_p->data))->data_size); + ctxt_pP->module_id, //gtpv1u_data_t *gtpv1u_data_p, + ctxt_pP->rnti,//rb_id/maxDRB, TO DO UE ID + ((pdcp_data_ind_header_t *)(sdu_p->data))->rb_id + 4, + &(((uint8_t *) sdu_p->data)[sizeof (pdcp_data_ind_header_t)]), + ((pdcp_data_ind_header_t *)(sdu_p->data))->data_size, + 0); list_remove_head (&pdcp_sdu_list); - free_mem_block (sdu_p); + free_mem_block (sdu_p, __func__); cont = 1; pdcp_nb_sdu_sent += 1; sdu_p = list_get_head (&pdcp_sdu_list); @@ -181,6 +227,7 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t* const ctxt_pP) if (!pdcp_output_header_bytes_to_write) { // continue with sdu pdcp_output_sdu_bytes_to_write = ((pdcp_data_ind_header_t *) sdu_p->data)->data_size; + AssertFatal(pdcp_output_sdu_bytes_to_write >= 0, "invalid data_size!"); #ifdef PDCP_USE_RT_FIFO bytes_wrote = rtf_put (PDCP2PDCP_USE_RT_FIFO, &(sdu->data[sizeof (pdcp_data_ind_header_t)]), pdcp_output_sdu_bytes_to_write); @@ -190,10 +237,14 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t* const ctxt_pP) #ifdef LINUX memcpy(NLMSG_DATA(nas_nlh_tx)+sizeof(pdcp_data_ind_header_t), &(sdu_p->data[sizeof (pdcp_data_ind_header_t)]), pdcp_output_sdu_bytes_to_write); nas_nlh_tx->nlmsg_len += pdcp_output_sdu_bytes_to_write; + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE_PDCP_FLUSH_SIZE, pdcp_output_sdu_bytes_to_write); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_FLUSH_BUFFER, 1 ); ret = sendmsg(nas_sock_fd,&nas_msg_tx,0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_FLUSH_BUFFER, 0 ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE_PDCP_FLUSH_ERR, ret ); if (ret<0) { - LOG_D(PDCP, "[PDCP_FIFOS] sendmsg returns %d (errno: %d)\n", ret, errno); + LOG_E(PDCP, "[PDCP_FIFOS] sendmsg returns %d (errno: %d)\n", ret, errno); MSC_LOG_TX_MESSAGE_FAILED( (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_PDCP_ENB:MSC_PDCP_UE, (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_IP_ENB:MSC_IP_UE, @@ -203,7 +254,7 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t* const ctxt_pP) MSC_AS_TIME_ARGS(ctxt_pP), ((pdcp_data_ind_header_t *)(sdu_p->data))->rb_id, ((pdcp_data_ind_header_t *)(sdu_p->data))->data_size); - mac_xface->macphy_exit("sendmsg failed for nas_sock_fd\n"); + AssertFatal(1==0,"sendmsg failed for nas_sock_fd\n"); break; } else { MSC_LOG_TX_MESSAGE( @@ -244,17 +295,22 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t* const ctxt_pP) ((pdcp_data_ind_header_t *)(sdu_p->data))->rb_id); list_remove_head (&pdcp_sdu_list); - free_mem_block (sdu_p); + free_mem_block (sdu_p, __func__); cont = 1; pdcp_nb_sdu_sent += 1; sdu_p = list_get_head (&pdcp_sdu_list); + } else { + LOG_D(PDCP, "1 skip free_mem_block: pdcp_output_sdu_bytes_to_write = %d\n", pdcp_output_sdu_bytes_to_write); + AssertFatal(pdcp_output_sdu_bytes_to_write > 0, "pdcp_output_sdu_bytes_to_write cannot be negative!"); } } else { - LOG_W(PDCP, "RADIO->IP SEND SDU CONGESTION!\n"); + LOG_W(PDCP, "2: RADIO->IP SEND SDU CONGESTION!\n"); } } else { - LOG_W(PDCP, "RADIO->IP SEND SDU CONGESTION!\n"); + LOG_W(PDCP, "3: RADIO->IP SEND SDU CONGESTION!\n"); } + } else { + LOG_D(PDCP, "4 skip free_mem_block: bytes_wrote = %d\n", bytes_wrote); } } else { // continue writing sdu @@ -272,15 +328,20 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t* const ctxt_pP) if (!pdcp_output_sdu_bytes_to_write) { // OK finish with this SDU //PRINT_RB_SEND_OUTPUT_SDU ("[PDCP] RADIO->IP SEND SDU\n"); list_remove_head (&pdcp_sdu_list); - free_mem_block (sdu_p); + free_mem_block (sdu_p, __func__); cont = 1; pdcp_nb_sdu_sent += 1; sdu_p = list_get_head (&pdcp_sdu_list); // LOG_D(PDCP, "rb sent a sdu from rab\n"); + } else { + LOG_D(PDCP, "5 skip free_mem_block: pdcp_output_sdu_bytes_to_write = %d\n", pdcp_output_sdu_bytes_to_write); } + } else { + LOG_D(PDCP, "6 skip free_mem_block: bytes_wrote = %d\n", bytes_wrote); } } } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_FLUSH, 0 ); #ifdef PDCP_USE_RT_FIFO @@ -301,6 +362,10 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t* const ctxt_pP) #endif //PDCP_USE_RT_FIFO +#ifdef PDCP_SDU_FLUSH_LOCK + if (pthread_mutex_unlock(&mtex)) exit_fun("PDCP_SDU_FLUSH_LOCK unlock error!"); +#endif + return pdcp_nb_sdu_sent; } @@ -359,7 +424,7 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP) if ((data_p->pdcp_read_header.traffic_type == TRAFFIC_IPV6_TYPE_MULTICAST) /*TRAFFIC_IPV6_TYPE_MULTICAST */ || (data_p->pdcp_read_header.traffic_type == TRAFFIC_IPV4_TYPE_MULTICAST) /*TRAFFIC_IPV4_TYPE_MULTICAST */ || (data_p->pdcp_read_header.traffic_type == TRAFFIC_IPV4_TYPE_BROADCAST) /*TRAFFIC_IPV4_TYPE_BROADCAST */ ) { -#if defined (Rel10) +#if defined(Rel10) || defined(Rel14) PDCP_TRANSMISSION_MODE_TRANSPARENT; #else pdcp_mode= PDCP_TRANSMISSION_MODE_DATA; @@ -430,18 +495,25 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP) return 0; # else /* PDCP_USE_NETLINK_QUEUES*/ int len = 1; + int msg_len; rb_id_t rab_id = 0; - - while (len > 0) { + int rlc_data_req_flag = 3; + + while ((len > 0) && (rlc_data_req_flag !=0)) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ, 1 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ_BUFFER, 1 ); len = recvmsg(nas_sock_fd, &nas_msg_rx, 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ_BUFFER, 0 ); if (len<=0) { // nothing in pdcp NAS socket //LOG_D(PDCP, "[PDCP][NETLINK] Nothing in socket, length %d \n", len); } else { + + msg_len = len; for (nas_nlh_rx = (struct nlmsghdr *) nl_rx_buf; - NLMSG_OK (nas_nlh_rx, len); - nas_nlh_rx = NLMSG_NEXT (nas_nlh_rx, len)) { + NLMSG_OK (nas_nlh_rx, msg_len); + nas_nlh_rx = NLMSG_NEXT (nas_nlh_rx, msg_len)) { if (nas_nlh_rx->nlmsg_type == NLMSG_DONE) { LOG_D(PDCP, "[PDCP][NETLINK] RX NLMSG_DONE\n"); @@ -466,51 +538,30 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP) pdcp_read_state_g = 0; // print_active_requests() #ifdef PDCP_DEBUG - LOG_D(PDCP, "[PDCP][NETLINK] Something in socket, length %d \n", + LOG_D(PDCP, "[PDCP][NETLINK] Something in socket, length %zu\n", nas_nlh_rx->nlmsg_len - sizeof(struct nlmsghdr)); #endif -#ifdef OAI_EMU - - // overwrite function input parameters, because only one netlink socket for all instances - if (pdcp_read_header_g.inst < oai_emulation.info.nb_enb_local) { - ctxt.frame = ctxt_cpy.frame; - ctxt.enb_flag = ENB_FLAG_YES; - ctxt.module_id = pdcp_read_header_g.inst + oai_emulation.info.first_enb_local; - ctxt.rnti = oai_emulation.info.eNB_ue_module_id_to_rnti[ctxt.module_id ][pdcp_read_header_g.rb_id / maxDRB + oai_emulation.info.first_ue_local]; - rab_id = pdcp_read_header_g.rb_id % maxDRB; - } else { - ctxt.frame = ctxt_cpy.frame; - ctxt.enb_flag = ENB_FLAG_NO; - ctxt.module_id = pdcp_read_header_g.inst - oai_emulation.info.nb_enb_local + oai_emulation.info.first_ue_local; - ctxt.rnti = pdcp_UE_UE_module_id_to_rnti[ctxt.module_id]; - rab_id = pdcp_read_header_g.rb_id % maxDRB; - } - - CHECK_CTXT_ARGS(&ctxt); - AssertFatal (rab_id < maxDRB, "RB id is too high (%u/%d)!\n", rab_id, maxDRB); - /*LGpdcp_read_header.inst = (pdcp_read_header_g.inst >= oai_emulation.info.nb_enb_local) ? \ - pdcp_read_header_g.inst - oai_emulation.info.nb_enb_local+ NB_eNB_INST + oai_emulation.info.first_ue_local : - pdcp_read_header_g.inst + oai_emulation.info.first_enb_local;*/ -#else // OAI_EMU - pdcp_read_header_g.inst = 0; + /* TODO: do we have to reset to 0 or not? not for a scenario with 1 UE at least */ +// pdcp_read_header_g.inst = 0; //#warning "TO DO CORRCT VALUES FOR ue mod id, enb mod id" ctxt.frame = ctxt_cpy.frame; ctxt.enb_flag = ctxt_cpy.enb_flag; +#ifdef PDCP_DEBUG + LOG_D(PDCP, "[PDCP][NETLINK] pdcp_read_header_g.rb_id = %d\n", pdcp_read_header_g.rb_id); +#endif + if (ctxt_cpy.enb_flag) { ctxt.module_id = 0; rab_id = pdcp_read_header_g.rb_id % maxDRB; - ctxt.rnti = pdcp_eNB_UE_instance_to_rnti[pdcp_eNB_UE_instance_to_rnti_index]; + ctxt.rnti = pdcp_eNB_UE_instance_to_rnti[pdcp_read_header_g.rb_id / maxDRB]; } else { ctxt.module_id = 0; rab_id = pdcp_read_header_g.rb_id % maxDRB; ctxt.rnti = pdcp_UE_UE_module_id_to_rnti[ctxt.module_id]; } - -#endif - if (ctxt.enb_flag) { if (rab_id != 0) { rab_id = rab_id % maxDRB; @@ -519,7 +570,7 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP) if (h_rc == HASH_TABLE_OK) { #ifdef PDCP_DEBUG - LOG_D(PDCP, "[FRAME %5u][eNB][NETLINK][IP->PDCP] INST %d: Received socket with length %d (nlmsg_len = %d) on Rab %d \n", + LOG_D(PDCP, "[FRAME %5u][eNB][NETLINK][IP->PDCP] INST %d: Received socket with length %d (nlmsg_len = %zu) on Rab %d \n", ctxt.frame, pdcp_read_header_g.inst, len, @@ -593,13 +644,23 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP) } } else { // enb_flag if (rab_id != 0) { - rab_id = rab_id % maxDRB; - key = PDCP_COLL_KEY_VALUE(ctxt.module_id, ctxt.rnti, ctxt.enb_flag, rab_id, SRB_FLAG_NO); - h_rc = hashtable_get(pdcp_coll_p, key, (void**)&pdcp_p); + if (rab_id == UE_IP_DEFAULT_RAB_ID) { + LOG_D(PDCP, "PDCP_COLL_KEY_DEFAULT_DRB_VALUE(module_id=%d, rnti=%x, enb_flag=%d)\n", + ctxt.module_id, ctxt.rnti, ctxt.enb_flag); + key = PDCP_COLL_KEY_DEFAULT_DRB_VALUE(ctxt.module_id, ctxt.rnti, ctxt.enb_flag); + h_rc = hashtable_get(pdcp_coll_p, key, (void**)&pdcp_p); + } else { + rab_id = rab_id % maxDRB; + LOG_D(PDCP, "PDCP_COLL_KEY_VALUE(module_id=%d, rnti=%x, enb_flag=%d, rab_id=%d, SRB_FLAG=%d)\n", + ctxt.module_id, ctxt.rnti, ctxt.enb_flag, rab_id, SRB_FLAG_NO); + key = PDCP_COLL_KEY_VALUE(ctxt.module_id, ctxt.rnti, ctxt.enb_flag, rab_id, SRB_FLAG_NO); + h_rc = hashtable_get(pdcp_coll_p, key, (void**)&pdcp_p); + } if (h_rc == HASH_TABLE_OK) { + rab_id = pdcp_p->rb_id; #ifdef PDCP_DEBUG - LOG_D(PDCP, "[FRAME %5u][UE][NETLINK][IP->PDCP] INST %d: Received socket with length %d (nlmsg_len = %d) on Rab %d \n", + LOG_D(PDCP, "[FRAME %5u][UE][NETLINK][IP->PDCP] INST %d: Received socket with length %d (nlmsg_len = %zu) on Rab %d \n", ctxt.frame, pdcp_read_header_g.inst, len, @@ -695,6 +756,7 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP) } } } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ, 0 ); } return len; @@ -711,121 +773,8 @@ void pdcp_fifo_read_input_sdus_from_otg (const protocol_ctxt_t* const ctxt_pP) module_id_t dst_id; // dst for otg rb_id_t rb_id; unsigned int pkt_size=0; -#if defined(USER_MODE) && defined(OAI_EMU) - module_id_t src_id; - static unsigned int pkt_cnt_enb=0, pkt_cnt_ue=0; - - Packet_otg_elt_t *otg_pkt_info=NULL; - int result; - uint8_t pdcp_mode, is_ue=0; -#endif protocol_ctxt_t ctxt; // we need to add conditions to avoid transmitting data when the UE is not RRC connected. -#if defined(USER_MODE) && defined(OAI_EMU) - - if (oai_emulation.info.otg_enabled ==1 ) { - // module_id is source id - while ((otg_pkt_info = pkt_list_remove_head(&(otg_pdcp_buffer[ctxt_pP->instance]))) != NULL) { - LOG_I(OTG,"Mod_id %d Frame %d Got a packet (%p), HEAD of otg_pdcp_buffer[%d] is %p and Nb elements is %d\n", - ctxt_pP->module_id, - ctxt_pP->frame, - otg_pkt_info, - ctxt_pP->instance, - pkt_list_get_head(&(otg_pdcp_buffer[ctxt_pP->instance])), - otg_pdcp_buffer[ctxt_pP->instance].nb_elements); - //otg_pkt_info = pkt_list_remove_head(&(otg_pdcp_buffer[module_id])); - dst_id = (otg_pkt_info->otg_pkt).dst_id; // type is module_id_t - src_id = (otg_pkt_info->otg_pkt).module_id; // type is module_id_t - rb_id = (otg_pkt_info->otg_pkt).rb_id; - is_ue = (otg_pkt_info->otg_pkt).is_ue; - pdcp_mode = (otg_pkt_info->otg_pkt).mode; - // LOG_I(PDCP,"pdcp_fifo, pdcp mode is= %d\n",pdcp_mode); - - // generate traffic if the ue is rrc reconfigured state - // if (mac_get_rrc_status(module_id, ctxt_pP->enb_flag, dst_id ) > 2 /*RRC_CONNECTED*/) { // not needed: this test is already done in update_otg_enb - otg_pkt = (unsigned char*) (otg_pkt_info->otg_pkt).sdu_buffer; - pkt_size = (otg_pkt_info->otg_pkt).sdu_buffer_size; - - if (otg_pkt != NULL) { - if (is_ue == 0 ) { - PROTOCOL_CTXT_SET_BY_MODULE_ID( - &ctxt, - src_id, - ENB_FLAG_YES, - oai_emulation.info.eNB_ue_module_id_to_rnti[ctxt.module_id][dst_id], - ctxt_pP->frame, - ctxt_pP->subframe, - src_id); - - LOG_D(OTG,"[eNB %d] Frame %d sending packet %d from module %d on rab id %d (src %d, dst %d/%x) pkt size %d for pdcp mode %d\n", - ctxt.module_id, - ctxt.frame, - pkt_cnt_enb++, - src_id, - rb_id, - src_id, - dst_id, - oai_emulation.info.eNB_ue_module_id_to_rnti[ctxt.module_id][dst_id], - pkt_size, - pdcp_mode); - result = pdcp_data_req(&ctxt, - SRB_FLAG_NO, - rb_id, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - pkt_size, - otg_pkt, - pdcp_mode); - if (result != TRUE) { - LOG_W(OTG,"PDCP data request failed!\n"); - } - } else { - //rb_id= eNB_index * MAX_NUM_RB + DTCH; - - - LOG_D(OTG,"[UE %d] Frame %d: sending packet %d from module %d on rab id %d (src %d/%x, dst %d) pkt size %d\n", - ctxt_pP->module_id, - ctxt_pP->frame, - pkt_cnt_ue++, - ctxt_pP->module_id, - rb_id, - src_id, - pdcp_UE_UE_module_id_to_rnti[ctxt_pP->module_id], // [src_id] - dst_id, - pkt_size); - PROTOCOL_CTXT_SET_BY_MODULE_ID( - &ctxt, - ctxt_pP->module_id, //src_id, - ENB_FLAG_NO, - pdcp_UE_UE_module_id_to_rnti[ctxt_pP->module_id],// [src_id] - ctxt_pP->frame, - ctxt_pP->subframe, - dst_id); - - result = pdcp_data_req( &ctxt, - SRB_FLAG_NO, - rb_id, - RLC_MUI_UNDEFINED, - RLC_SDU_CONFIRM_NO, - pkt_size, - otg_pkt, - PDCP_TRANSMISSION_MODE_DATA); - if (result != TRUE) { - LOG_W(OTG,"PDCP data request failed!\n"); - } - } - - free(otg_pkt); - otg_pkt = NULL; - } - - // } //else LOG_D(OTG,"ctxt_pP->frame %d enb %d-> ue %d link not yet established state %d \n", ctxt_pP->frame, eNB_index,dst_id - NB_eNB_INST, mac_get_rrc_status(module_id, ctxt_pP->enb_flag, dst_id - NB_eNB_INST)); - - } - } - -#else - if ((otg_enabled==1) && (ctxt_pP->enb_flag == ENB_FLAG_YES)) { // generate DL traffic unsigned int ctime=0; ctime = ctxt_pP->frame * 100; @@ -843,9 +792,9 @@ void pdcp_fifo_read_input_sdus_from_otg (const protocol_ctxt_t* const ctxt_pP) for (dst_id = 0; dst_id 2 /*RRC_SI_RECEIVED*/) { + if (mac_eNB_get_rrc_status(ctxt.module_id, ctxt.rnti ) > 2 ) { unsigned int temp = 0; otg_pkt=packet_gen( ENB_MODULE_ID_TO_INSTANCE(ctxt.module_id), @@ -872,8 +821,8 @@ void pdcp_fifo_read_input_sdus_from_otg (const protocol_ctxt_t* const ctxt_pP) } } } +*/ } } - -#endif } + diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c index 365013c42d..0df8e59e6d 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_netlink.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file pdcp_netlink.c * \brief pdcp communication with linux IP interface, @@ -109,13 +101,8 @@ pdcp_netlink_init( struct sched_param sched_param; reset_meas(&ip_pdcp_stats_tmp); -#if defined(USER_MODE) && defined(OAI_EMU) - nb_inst_enb = oai_emulation.info.nb_enb_local; - nb_inst_ue = oai_emulation.info.nb_ue_local; -#else nb_inst_enb = 1; nb_inst_ue = 1; -#endif #if defined(LINK_ENB_PDCP_TO_GTPV1U) nb_inst_enb = 0; @@ -267,24 +254,7 @@ void *pdcp_netlink_thread_fct(void *arg) } } else { pdcp_thread_read_state = 0; - -#ifdef OAI_EMU - - // LG: new_data_p->pdcp_read_header.inst will contain in fact a module id - if (new_data_p->pdcp_read_header.inst >= oai_emulation.info.nb_enb_local) { - module_id = new_data_p->pdcp_read_header.inst - - oai_emulation.info.nb_enb_local + - + oai_emulation.info.first_ue_local; - eNB_flag = 0; - } else { - module_id = new_data_p->pdcp_read_header.inst - + oai_emulation.info.first_enb_local; - eNB_flag = 1; - } - -#else module_id = 0; -#endif new_data_p->data = malloc(sizeof(uint8_t) * new_data_p->pdcp_read_header.data_size); /* Copy the data */ memcpy(new_data_p->data, NLMSG_DATA(nas_nlh_rx), new_data_p->pdcp_read_header.data_size); diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c old mode 100755 new mode 100644 index fb530f686a..7117a760b9 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file pdcp_primitives.c * \brief PDCP PDU buffer dissector code diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h old mode 100755 new mode 100644 index 1913fd69f1..8e57f84b0a --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_primitives.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - ***************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file LAYER2/PDCP_v10.1.0/pdcp_primitives.h * \brief pdcp primitives diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h old mode 100755 new mode 100644 index 3b83140af2..afcc2fdd02 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* pdcp_proto_extern.h ------------------- diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c index 15a1cf57d2..2554eb145a 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file pdcp_security.c * \brief PDCP Security Methods * \author ROUX Sebastie and Navid Nikaein @@ -227,7 +220,7 @@ pdcp_validate_security( stream_decrypt(pdcp_pP->cipheringAlgorithm, &decrypt_params, &buffer_decrypted); - +#if !defined(USRP_REC_PLAY) if (srb_flagP) { /* Now check the integrity of the complete PDU */ decrypt_params.message = pdcp_pdu_buffer; @@ -248,7 +241,7 @@ pdcp_validate_security( return -1; } } - +#endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_VALIDATE_SECURITY, VCD_FUNCTION_OUT); return 0; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c old mode 100755 new mode 100644 index 9615726bc0..949858c1e5 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file pdcp_sequence_manager.c * \brief PDCP Sequence Numbering Methods diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h index 1766613e1f..ec59a4b4fe 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file pdcp_sequence_manager.h * \brief PDCP Sequence Numbering Methods diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c index 8786a91690..0b6be93d59 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_thread.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file pdcp_thread.c * \brief @@ -118,9 +110,7 @@ int init_pdcp_thread(void) p.sched_priority = OPENAIR_THREAD_PRIORITY; pthread_attr_setschedparam (&pdcp_thread_attr, &p); -#ifndef RTAI_ISNT_POSIX pthread_attr_setschedpolicy (&pdcp_thread_attr, SCHED_FIFO); -#endif pthread_mutex_init(&pdcp_mutex,NULL); pthread_cond_init(&pdcp_cond,NULL); diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c index ef2cf1afaf..ad2cbae847 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file pdcp_util.c * \brief PDCP Util Methods @@ -70,7 +62,7 @@ void util_print_hex_octets(comp_name_t component, unsigned char* data, unsigned */ if (octet_index != 0 && (octet_index + 1) % 16 == 0) { LOG_T(component, " |\n"); - LOG_T(component, " %03d |", octet_index); + LOG_T(component, " %03lu |", octet_index); } } diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h index 41f73a7045..7944049c3b 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file pdcp_util.h * \brief PDCP Util Methods diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent.c b/openair2/LAYER2/PROTO_AGENT/proto_agent.c index 38c76d7dd9..05eab8a028 100644 --- a/openair2/LAYER2/PROTO_AGENT/proto_agent.c +++ b/openair2/LAYER2/PROTO_AGENT/proto_agent.c @@ -42,8 +42,8 @@ #include "proto_agent_async.h" -proto_agent_instance_t proto_agent[NUM_MAX_ENB]; -proto_agent_instance_t proto_server[NUM_MAX_ENB]; +proto_agent_instance_t proto_agent[MAX_DU]; +proto_agent_instance_t proto_server[MAX_DU]; char in_ip[40]; static uint16_t in_port; @@ -52,11 +52,14 @@ char local_cache[40]; void *send_thread(void *args); void *receive_thread(void *args); pthread_t new_thread(void *(*f)(void *), void *b); +pthread_t cu_thread[MAX_DU], du_thread; Protocol__FlexsplitMessage *proto_agent_timeout_fsp(void* args); -mid_t client_mod, server_mod; -proto_agent_instance_t *client_channel, *server_channel; +mid_t client_mod[MAX_DU], server_mod; +proto_agent_instance_t *client_channel[MAX_DU], *server_channel; +proto_recv_t client_info[MAX_DU]; +#define TEST_MOD 0 uint8_t tcp = 0; uint8_t udp = 0; @@ -84,13 +87,13 @@ void *receive_thread(void *args) { goto error; } - LOG_D(PROTO_AGENT,"Received message with size %d and priority %d, calling message handle\n", size, priority); + printf("PROTO_AGENT: Received message with size %d and priority %d, calling message handle\n", size, priority); msg=proto_agent_handle_message(d->enb_id, data, size); if (msg == NULL) { - LOG_D(PROTO_AGENT,"msg to send back is NULL\n"); + printf("PROTO_AGENT: msg to send back is NULL\n"); } if (msg != NULL){ @@ -98,7 +101,7 @@ void *receive_thread(void *args) { err_code = PROTOCOL__FLEXSPLIT_ERR__MSG_ENQUEUING; goto error; } - LOG_D(PROTO_AGENT,"sent message with size %d\n", size); + printf("PROTO_AGENT: sent message with size %d\n", size); } } @@ -142,75 +145,68 @@ pthread_t new_thread(void *(*f)(void *), void *b) { void * proto_server_init(void *args) { - LOG_I(PROTO_AGENT, "Initializing server thread for listening connections\n"); + printf( "Initializing server thread for listening connections\n"); mid_t mod_id = (mid_t) 0; - Enb_properties_array_t* enb_properties = NULL; - enb_properties = enb_config_get(); - proto_server_start(mod_id, (const Enb_properties_array_t*) enb_properties); + cudu_params_t* cudu = NULL; + cudu = get_cudu_config(); + proto_server_start(mod_id, (const cudu_params_t*) cudu); return NULL; } /* Server side function; upon a new connection reception, sends the hello packets */ -int proto_server_start(mid_t mod_id, const Enb_properties_array_t* enb_properties){ +int proto_server_start(mid_t mod_id, const cudu_params_t* cudu){ int channel_id; char *peer_address; - // Maybe change the RAN_LTE_OAI to protocol?? (e.g. PDCP) - set_enb_vars(mod_id, RAN_LTE_OAI); proto_server[mod_id].enb_id = mod_id; server_mod = mod_id; - - if (enb_properties->properties[mod_id]->flexsplit_interfaces.cu_ipv4_address != NULL) + + if (cudu->local_du.du_ipv4_address != NULL) { - LOG_D(PROTO_AGENT,"CU ADDRESS IS %s\n",enb_properties->properties[mod_id]->flexsplit_interfaces.cu_ipv4_address); + //printf("PROTO_AGENT: DU ADDRESS IS %s\n",cudu->local_du.du_ipv4_address); + peer_address = strdup(cudu->local_du.du_ipv4_address); + strcpy(in_ip, cudu->local_du.du_ipv4_address); } - if (enb_properties->properties[mod_id]->flexsplit_interfaces.du_ipv4_address != NULL) - { - LOG_D(PROTO_AGENT,"DU ADDRESS IS %s\n",enb_properties->properties[mod_id]->flexsplit_interfaces.du_ipv4_address); - peer_address = strdup(enb_properties->properties[mod_id]->flexsplit_interfaces.cu_ipv4_address); - } - if (enb_properties->properties[mod_id]->flexsplit_interfaces.du_ipv4_address != NULL) - strcpy(in_ip, enb_properties->properties[mod_id]->flexsplit_interfaces.du_ipv4_address); else { strcpy(in_ip, DEFAULT_PROTO_AGENT_IPv4_ADDRESS); - LOG_D(PROTO_AGENT,"Cannot read DU address from conf file, setting the default (%s)\n", DEFAULT_PROTO_AGENT_IPv4_ADDRESS); + //printf("PROTO_AGENT: Cannot read DU address from conf file, setting the default (%s)\n", DEFAULT_PROTO_AGENT_IPv4_ADDRESS); } - if (enb_properties->properties[mod_id]->flexsplit_interfaces.du_port != 0) - in_port = enb_properties->properties[mod_id]->flexsplit_interfaces.du_port; + if (cudu->local_du.du_port != 0) + in_port = cudu->local_du.du_port; else { in_port = DEFAULT_PROTO_AGENT_PORT; - LOG_D(PROTO_AGENT,"Cannot read DU port from conf file, setting the default (%d)\n", DEFAULT_PROTO_AGENT_PORT); + //printf("PROTO_AGENT: Cannot read DU port from conf file, setting the default (%d)\n", DEFAULT_PROTO_AGENT_PORT); } - if(enb_properties->properties[mod_id]->flexsplit_interfaces.tcp == 1) + if(cudu->local_du.tcp == 1) { tcp = 1; link_type = strdup("TCP"); - LOG_I(PROTO_AGENT,"Starting PROTO agent SERVER for module id %d on ipv4 %s, port %d over TCP\n", + printf("PROTO_AGENT: Starting PROTO agent SERVER for module id %d on ipv4 %s, port %d over TCP\n", proto_server[mod_id].enb_id, in_ip, in_port); } - else if(enb_properties->properties[mod_id]->flexsplit_interfaces.udp == 1) + else if(cudu->local_du.udp == 1) { udp = 1; link_type = strdup("UDP"); - LOG_I(PROTO_AGENT,"Starting PROTO agent SERVER for module id %d on ipv4 %s, port %d over UDP\n", + printf("PROTO_AGENT: Starting PROTO agent SERVER for module id %d on ipv4 %s, port %d over UDP\n", proto_server[mod_id].enb_id, in_ip, in_port); } - else if(enb_properties->properties[mod_id]->flexsplit_interfaces.sctp == 1) + else if(cudu->local_du.sctp == 1) { sctp = 1; link_type = strdup("SCTP"); - LOG_I(PROTO_AGENT,"Starting PROTO agent SERVER for module id %d on ipv4 %s, port %d over SCTP\n", + printf("PROTO_AGENT: Starting PROTO agent SERVER for module id %d on ipv4 %s, port %d over SCTP\n", proto_server[mod_id].enb_id, in_ip, in_port); @@ -219,7 +215,7 @@ int proto_server_start(mid_t mod_id, const Enb_properties_array_t* enb_propertie { tcp = 1; link_type = strdup("TCP"); - LOG_I(PROTO_AGENT,"Starting PROTO agent SERVER for module id %d on ipv4 %s, port %d over TCP\n", + printf("PROTO_AGENT: Starting PROTO agent SERVER for module id %d on ipv4 %s, port %d over TCP\n", proto_server[mod_id].enb_id, in_ip, in_port); @@ -270,11 +266,10 @@ int proto_server_start(mid_t mod_id, const Enb_properties_array_t* enb_propertie int priority; int size; -#ifdef ECHO if (udp == 0) { // If the comm is not UDP, allow the server to send the first packet over the channel - LOG_D(PROTO_AGENT, "Proto agent Server: Calling the echo_request packet constructor\n"); + printf( "Proto agent Server: Calling the echo_request packet constructor\n"); msg_flag = proto_agent_echo_request(mod_id, NULL, &init_msg); if (msg_flag != 0) goto error; @@ -286,7 +281,7 @@ int proto_server_start(mid_t mod_id, const Enb_properties_array_t* enb_propertie if (msg!= NULL) { - LOG_D(PROTO_AGENT,"Server sending the message over the async channel\n"); + printf("PROTO_AGENT: Server sending the message over the async channel\n"); proto_agent_async_msg_send((void *)msg, (int) msgsize, 1, (void *) channel_info); } /* After sending the message, wait for any replies; @@ -295,16 +290,10 @@ int proto_server_start(mid_t mod_id, const Enb_properties_array_t* enb_propertie */ } -#else - LOG_D(PROTO_AGENT, "Proto agent Server: Calling the hello packet constructor\n"); - msg_flag = proto_agent_hello(mod_id, NULL, &init_msg); -#endif - LOG_D(PROTO_AGENT, "Server reading any message over the async channel.\n"); - - new_thread(proto_server_receive, &proto_server[mod_id]); - LOG_D(PROTO_AGENT,"server ends\n"); + du_thread=new_thread(proto_server_receive, &proto_server[mod_id]); + printf("PROTO_AGENT: server ends with thread_id %u\n",du_thread); return 0; error: @@ -313,61 +302,64 @@ error: } -int proto_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties){ +int proto_agent_start(uint8_t enb_id, mid_t cu_id, uint8_t type_id, cudu_params_t *cudu){ int channel_id; char *peer_address = NULL; + // cudu_params_t *cudu = get_cudu_config(); - set_enb_vars(mod_id, RAN_LTE_OAI); - proto_agent[mod_id].enb_id = mod_id; - client_mod = mod_id; + proto_agent[cu_id].enb_id = cu_id; + client_mod[cu_id] = cu_id; // FIXME: Allow for multiple types, now it will allow for DUs of different type per mod_id + + client_info[cu_id].type_id = type_id; + client_info[cu_id].mod_id = cu_id; /* * check the configuration - Getting all the values from the config file */ - - if (enb_properties->properties[mod_id]->flexsplit_interfaces.cu_ipv4_address != NULL) + + if (cudu->cu[cu_id].cu_ipv4_address != NULL) { - strcpy(in_ip, enb_properties->properties[mod_id]->flexsplit_interfaces.cu_ipv4_address); - peer_address = strdup(enb_properties->properties[mod_id]->flexsplit_interfaces.du_ipv4_address); + strcpy(in_ip, cudu->cu[cu_id].cu_ipv4_address); + peer_address = strdup(cudu->cu[cu_id].cu_ipv4_address); } else { strcpy(in_ip, DEFAULT_PROTO_AGENT_IPv4_ADDRESS); - LOG_D(PROTO_AGENT,"Cannot read DU address from conf file, setting the default (%s)\n", DEFAULT_PROTO_AGENT_IPv4_ADDRESS); + printf("PROTO_AGENT: Cannot read DU address from conf file, setting the default (%s)\n", DEFAULT_PROTO_AGENT_IPv4_ADDRESS); } - if (enb_properties->properties[mod_id]->flexsplit_interfaces.cu_port != 0) - in_port = enb_properties->properties[mod_id]->flexsplit_interfaces.cu_port; + if (cudu->cu[cu_id].cu_port != 0) + in_port = cudu->cu[cu_id].cu_port; else { in_port = DEFAULT_PROTO_AGENT_PORT; - LOG_D(PROTO_AGENT,"Cannot read DU port from conf file, setting the default (%d)\n", DEFAULT_PROTO_AGENT_PORT); + printf("PROTO_AGENT: Cannot read DU port from conf file, setting the default (%d)\n", DEFAULT_PROTO_AGENT_PORT); } - if(enb_properties->properties[mod_id]->flexsplit_interfaces.tcp == 1) + if(cudu->cu[cu_id].tcp == 1) { tcp = 1; link_type = strdup("TCP"); - LOG_I(PROTO_AGENT,"Starting PROTO agent client for module id %d on ipv4 %s, port %d over TCP\n", - proto_server[mod_id].enb_id, + printf("PROTO_AGENT: Starting PROTO agent client for module id %d on ipv4 %s, port %d over TCP\n", + proto_server[cu_id].enb_id, in_ip, in_port); } - else if(enb_properties->properties[mod_id]->flexsplit_interfaces.udp == 1) + else if(cudu->cu[cu_id].udp == 1) { udp = 1; link_type = strdup("UDP"); - LOG_I(PROTO_AGENT,"Starting PROTO agent client for module id %d on ipv4 %s, port %d over UDP\n", - proto_server[mod_id].enb_id, + printf("PROTO_AGENT: Starting PROTO agent client for module id %d on ipv4 %s, port %d over UDP\n", + proto_server[cu_id].enb_id, in_ip, in_port); } - else if(enb_properties->properties[mod_id]->flexsplit_interfaces.sctp == 1) + else if(cudu->cu[cu_id].sctp == 1) { sctp = 1; link_type = strdup("SCTP"); - LOG_I(PROTO_AGENT,"Starting PROTO agent client for module id %d on ipv4 %s, port %d over SCTP\n", - proto_server[mod_id].enb_id, + printf("PROTO_AGENT: Starting PROTO agent client for module id %d on ipv4 %s, port %d over SCTP\n", + proto_server[cu_id].enb_id, in_ip, in_port); } @@ -375,8 +367,8 @@ int proto_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties { tcp = 1; link_type = strdup("TCP"); - LOG_I(PROTO_AGENT,"Starting PROTO agent client for module id %d on ipv4 %s, port %d over TCP\n", - proto_server[mod_id].enb_id, + printf("PROTO_AGENT: Starting PROTO agent client for module id %d on ipv4 %s, port %d over TCP\n", + proto_server[cu_id].enb_id, in_ip, in_port); @@ -388,8 +380,9 @@ int proto_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties proto_agent_init_channel_container(); /*Create the async channel info*/ - proto_agent_instance_t *channel_info = proto_agent_async_channel_info(mod_id, in_ip, in_port, link_type, peer_address); - client_channel = channel_info; + + proto_agent_instance_t *channel_info = proto_agent_async_channel_info(cu_id, in_ip, in_port, link_type, peer_address); + client_channel[cu_id] = channel_info; /*Create a channel using the async channel info*/ channel_id = proto_agent_create_channel((void *) channel_info, proto_agent_async_msg_send, @@ -411,12 +404,12 @@ int proto_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties else channel->type = 0; /*Register the channel for all underlying agents (use ENB_AGENT_MAX)*/ - proto_agent_register_channel(mod_id, channel, ENB_AGENT_MAX); - + proto_agent_register_channel(cu_id, channel, ENB_AGENT_MAX); + void *data; int size; int priority; - err_code_t err_code; + err_code_t err_code; Protocol__FlexsplitMessage *msg = NULL; Protocol__FlexsplitMessage *init_msg=NULL; Protocol__FlexsplitMessage *rep_msg=NULL; @@ -426,7 +419,7 @@ int proto_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties // In the case of UDP comm, start the echo request from the client side; the server thread should be blocked until it reads the SRC port of the 1st packet if (udp == 1) { - msg_flag = proto_agent_echo_request(mod_id, NULL, &init_msg); + msg_flag = proto_agent_echo_request(cu_id, NULL, &init_msg); @@ -440,7 +433,7 @@ int proto_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties if (msg!= NULL) { - LOG_D(PROTO_AGENT,"Client sending the ECHO_REQUEST message over the async channel\n"); + printf("PROTO_AGENT: Client sending the ECHO_REQUEST message over the async channel\n"); proto_agent_async_msg_send((void *)msg, (int) msgsize, 1, (void *) channel_info); } } @@ -448,9 +441,7 @@ int proto_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties the server thread blocks until it reads any data over the channel */ - - - new_thread(proto_client_receive, &proto_agent[mod_id]); + cu_thread[cu_id]=new_thread(proto_client_receive, (void *) &client_info[cu_id]); return 0; @@ -468,8 +459,8 @@ proto_agent_send_hello(void) int msg_flag = 0; - LOG_D(PROTO_AGENT, "PDCP agent: Calling the HELLO packet constructor\n"); - msg_flag = proto_agent_hello(proto_agent[client_mod].enb_id, NULL, &init_msg); + printf( "PDCP agent: Calling the HELLO packet constructor\n"); + msg_flag = proto_agent_hello(proto_agent[TEST_MOD].enb_id, NULL, &init_msg); int msgsize = 0; if (msg_flag == 0) @@ -477,17 +468,17 @@ proto_agent_send_hello(void) proto_agent_serialize_message(init_msg, &msg, &msgsize); } - LOG_D(PROTO_AGENT,"Agent sending the message over the async channel\n"); - proto_agent_async_msg_send((void *)msg, (int) msgsize, 1, (void *) client_channel); + printf("PROTO_AGENT: Agent sending the message over the async channel\n"); + proto_agent_async_msg_send((void *)msg, (int) msgsize, 1, (void *) client_channel[TEST_MOD]); } void -proto_agent_send_rlc_data_req(const protocol_ctxt_t* const ctxt_pP, const srb_flag_t srb_flagP, const MBMS_flag_t MBMS_flagP, const rb_id_t rb_idP, const mui_t muiP, +proto_agent_send_rlc_data_req(uint8_t mod_id, uint8_t type_id, const protocol_ctxt_t* const ctxt_pP, const srb_flag_t srb_flagP, const MBMS_flag_t MBMS_flagP, const rb_id_t rb_idP, const mui_t muiP, confirm_t confirmP, sdu_size_t sdu_sizeP, mem_block_t *sdu_pP) { - //printf("PROTOPDCP: sending the data req over the async channel\n"); + //printf("PROTO_AGENT: PROTOPDCP: sending the data req over the async channel\n"); Protocol__FlexsplitMessage *msg = NULL; Protocol__FlexsplitMessage *init_msg=NULL; @@ -501,7 +492,7 @@ proto_agent_send_rlc_data_req(const protocol_ctxt_t* const ctxt_pP, const srb_fl int ret; int err_code; - LOG_D(PROTO_AGENT, "PDCP agent: Calling the PDCP DATA REQ constructor\n"); + printf( "PDCP agent: Calling the PDCP DATA REQ constructor\n"); data_req_args *args = malloc(sizeof(data_req_args)); @@ -516,7 +507,7 @@ proto_agent_send_rlc_data_req(const protocol_ctxt_t* const ctxt_pP, const srb_fl args->sdu_p = malloc(sdu_sizeP); memcpy(args->sdu_p, sdu_pP->data, sdu_sizeP); - msg_flag = proto_agent_pdcp_data_req(proto_agent[client_mod].enb_id, (void *) args, &init_msg); + msg_flag = proto_agent_pdcp_data_req(type_id, (void *) args, &init_msg); if (msg_flag != 0) goto error; @@ -527,10 +518,10 @@ proto_agent_send_rlc_data_req(const protocol_ctxt_t* const ctxt_pP, const srb_fl msg = proto_agent_pack_message(init_msg, &msgsize); - LOG_D(PROTO_AGENT,"Sending the pdcp data_req message over the async channel\n"); + printf("PROTO_AGENT: Sending the pdcp data_req message over the async channel\n"); if (msg!=NULL) - proto_agent_async_msg_send((void *)msg, (int) msgsize, 1, (void *) client_channel); + proto_agent_async_msg_send((void *)msg, (int) msgsize, 1, (void *) client_channel[mod_id]); } else @@ -550,7 +541,7 @@ void proto_agent_send_pdcp_data_ind(const protocol_ctxt_t* const ctxt_pP, const srb_flag_t srb_flagP, const MBMS_flag_t MBMS_flagP, const rb_id_t rb_idP, sdu_size_t sdu_sizeP, mem_block_t *sdu_pP) { - //printf("PROTOPDCP: Sending Data Indication over the async channel\n"); + //printf("PROTO_AGENT: PROTOPDCP: Sending Data Indication over the async channel\n"); Protocol__FlexsplitMessage *msg = NULL; Protocol__FlexsplitMessage *init_msg = NULL; @@ -565,7 +556,7 @@ proto_agent_send_pdcp_data_ind(const protocol_ctxt_t* const ctxt_pP, const srb_f int ret; int err_code; - LOG_D(PROTO_AGENT, "PDCP agent: Calling the PDCP_DATA_IND constructor\n"); + printf( "PDCP agent: Calling the PDCP_DATA_IND constructor\n"); data_req_args *args = malloc(sizeof(data_req_args)); @@ -590,7 +581,7 @@ proto_agent_send_pdcp_data_ind(const protocol_ctxt_t* const ctxt_pP, const srb_f if (msg!=NULL) { - LOG_D(PROTO_AGENT,"Sending the pdcp data_ind message over the async channel\n"); + printf("PROTO_AGENT: Sending the pdcp data_ind message over the async channel\n"); proto_agent_async_msg_send((void *)msg, (int) msgsize, 1, (void *) server_channel); } } @@ -631,26 +622,26 @@ proto_server_receive(void) goto error; } - LOG_D(PROTO_AGENT,"Server side Received message with size %d and priority %d, calling message handle\n", size, priority); + printf("PROTO_AGENT: Server side Received message with size %d and priority %d, calling message handle\n", size, priority); msg=proto_agent_handle_message(d->enb_id, data, size); if (msg == NULL) { - LOG_D(PROTO_AGENT,"msg to send back is NULL\n"); + printf("PROTO_AGENT: msg to send back is NULL\n"); } else { ser_msg = proto_agent_pack_message(msg, &size); } - LOG_D(PROTO_AGENT,"Server sending the reply message over the async channel\n"); + printf("PROTO_AGENT: Server sending the reply message over the async channel\n"); if (ser_msg != NULL){ if (proto_agent_async_msg_send((void *)ser_msg, (int) size, 1, (void *) server_channel)){ err_code = PROTOCOL__FLEXSPLIT_ERR__MSG_ENQUEUING; goto error; } - LOG_D(PROTO_AGENT,"sent message with size %d\n", size); + printf("PROTO_AGENT: sent message with size %d\n", size); } } @@ -664,9 +655,15 @@ error: } void * -proto_client_receive(void) +proto_client_receive(void *args) { - proto_agent_instance_t *d = &proto_agent[client_mod]; + + proto_recv_t* recv = args; + mid_t recv_mod = recv->mod_id; + uint8_t type = recv->type_id; + + printf("PROTO_AGENT: \n\nrecv mod is %u\n\n",recv_mod); + //proto_agent_instance_t *d = &proto_agent[TEST_MOD]; void *data = NULL; int size; int priority; @@ -680,32 +677,37 @@ proto_client_receive(void) msg = NULL; ser_msg = NULL; - - if (proto_agent_async_msg_recv(&data, &size, &priority, client_channel)){ + + while(client_channel[recv_mod] == NULL) + { + //just wait + } + printf("PROTO_AGENT: Will receive packets\n"); + if (proto_agent_async_msg_recv(&data, &size, &priority, client_channel[recv_mod])){ err_code = PROTOCOL__FLEXSPLIT_ERR__MSG_ENQUEUING; goto error; } - LOG_D(PROTO_AGENT,"Client Received message with size %d and priority %d, calling message handle\n", size, priority); + printf("PROTO_AGENT: Client Received message with size %d and priority %d, calling message handle with mod_id %u\n", size, priority, recv_mod); - msg=proto_agent_handle_message(d->enb_id, data, size); + msg=proto_agent_handle_message(recv_mod, data, size); if (msg == NULL) { - LOG_D(PROTO_AGENT,"msg to send back is NULL\n"); + printf("PROTO_AGENT: msg to send back is NULL\n"); } else { ser_msg = proto_agent_pack_message(msg, &size); } - LOG_D(PROTO_AGENT,"Server sending the reply message over the async channel\n"); + printf("PROTO_AGENT: Server sending the reply message over the async channel\n"); if (ser_msg != NULL){ - if (proto_agent_async_msg_send((void *)ser_msg, (int) size, 1, (void *) client_channel)){ + if (proto_agent_async_msg_send((void *)ser_msg, (int) size, 1, (void *) client_channel[recv_mod])){ err_code = PROTOCOL__FLEXSPLIT_ERR__MSG_ENQUEUING; goto error; } - LOG_D(PROTO_AGENT,"sent message with size %d\n", size); + printf("PROTO_AGENT: sent message with size %d\n", size); } } @@ -717,3 +719,19 @@ error: return NULL; } + + +uint8_t select_du(uint8_t max_dus) +{ + static uint8_t selected = 0; + if (selected < max_dus -1 ) + { + selected++; + } + else + { + selected = 0; + } + return selected; +} + diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent.h b/openair2/LAYER2/PROTO_AGENT/proto_agent.h index 1ce8cbef45..48111e2101 100644 --- a/openair2/LAYER2/PROTO_AGENT/proto_agent.h +++ b/openair2/LAYER2/PROTO_AGENT/proto_agent.h @@ -38,18 +38,25 @@ #ifndef PROTO_AGENT_H_ #define PROTO_AGENT_H_ #include "proto_agent_common.h" -//#include "ENB_APP/enb_config.h" // for enb properties +#include "ENB_APP/enb_config.h" // for enb properties void * proto_server_init(void *args); void * proto_server_receive(void); -void * proto_client_receive(void); +void * proto_client_receive(void *args); -int proto_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties); -int proto_server_start(mid_t mod_id, const Enb_properties_array_t* enb_properties); +int proto_agent_start(uint8_t enb_id, mid_t mod_id, uint8_t type_id, cudu_params_t *cudu); +int proto_server_start(mid_t mod_id, const cudu_params_t* cudu); int proto_agent_stop(mid_t mod_id); void *proto_agent_task(void *args); +uint8_t select_du(uint8_t max_dus); +typedef struct +{ + mid_t mod_id; + uint8_t type_id; +}proto_recv_t; + #endif diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_async.c b/openair2/LAYER2/PROTO_AGENT/proto_agent_async.c index 885150ecd2..c541849741 100644 --- a/openair2/LAYER2/PROTO_AGENT/proto_agent_async.c +++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_async.c @@ -27,12 +27,6 @@ *******************************************************************************/ -/*! \file enb_agent_async.c - * \brief channel implementation for async interface - * \author Xenofon Foukas - * \date 2016 - * \version 0.1 - */ #include "proto_agent_async.h" #include "proto_agent_defs.h" @@ -60,6 +54,7 @@ proto_agent_async_channel_t * proto_server_async_channel_info(mid_t mod_id, char if (strcmp(type, "TCP") == 0) { proto_tcp = 1; + printf("PROTO_AGENT: sTARTING TCP SERVER\n"); channel->link = new_link_server(dst_port); channel->type = 0; } @@ -173,7 +168,15 @@ int proto_agent_async_msg_recv(void **data, int *size, int *priority, void *chan proto_agent_async_channel_t *channel; channel = (proto_agent_async_channel_t *)channel_info; - return message_get(channel->receive_queue, data, size, priority); + if (channel == NULL) + return 0; + else if (channel->type < 0) + return 0; + else if (channel->receive_queue == NULL) + return 0; + else + return message_get(channel->receive_queue, data, size, priority); + } void proto_agent_async_release(proto_agent_channel_t *channel) { diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c index 7e28aa3e41..6486370b4f 100644 --- a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c +++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.c @@ -45,6 +45,7 @@ #include "RRC/LITE/extern.h" #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" #include "rrc_eNB_UE_context.h" +//#include "LAYER2/PDCP_v10.1.0/pdcp_primitives.h" void * enb[NUM_MAX_ENB]; void * enb_ue[NUM_MAX_ENB]; @@ -54,18 +55,140 @@ void * enb_rrc[NUM_MAX_ENB]; * message primitives */ -int proto_agent_serialize_message(Protocol__FlexsplitMessage *msg, void **buf, int *size) { +// Function to fill in the dl_data header (32bits) with the appropriate fields (doing bitwise operations) +void fill_dl_data_header(int pdu_type, int spare, int seq_no, uint32_t *header) +{ + uint32_t type = pdu_type; + uint32_t spare_ = spare; + uint32_t seq = seq_no; + type = type << 28; + spare_ = spare_ << 24; + *header = (type | spare_); + *header = (*header | seq); + return; +} + + +// Function to retrieve data from the dl_data header (32bits) (doing bitwise operations) +void read_dl_data_header(int *pdu_type, int *spare, int *seqno, uint32_t header) +{ + *pdu_type = header; + *spare = header; + *seqno = header; + *pdu_type = *pdu_type >> 28; + *spare = *spare << 4; + *spare = *spare >> 28; + *seqno = *seqno << 8; + *seqno = *seqno >> 8; + return; +} + +int f1u_serialize_message(Protocol__F1uMessage *msg, void **buf,int *size){ + *size = protocol__f1u_message__get_packed_size(msg); - *size = protocol__flexsplit_message__get_packed_size(msg); - *buf = malloc(*size); if (buf == NULL) goto error; - - protocol__flexsplit_message__pack(msg, *buf); - + + protocol__f1u_message__pack(msg, *buf); + + return 0; + + error: + LOG_E(F1U, "an error occured\n"); + return -1; + +} + +int f1u_deserialize_message(void *data, int size, Protocol__F1uMessage **msg) { + *msg = protocol__f1u_message__unpack(NULL, size, data); + if (*msg == NULL) + goto error; + + return 0; + + error: + LOG_E(F1U, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int f1u_dl_data_create_header(uint32_t pdu_type, uint32_t f1u_sn, Protocol__DlDataHeader **header) { + + *header = malloc(sizeof(Protocol__DlDataHeader)); + if(*header == NULL) + goto error; + + protocol__dl_data_header__init(*header); + LOG_D(F1U, "Initialized the DL Data User header\n"); + + fill_dl_data_header(pdu_type, 0, f1u_sn, (*header)->fields); + return 0; + + error: + LOG_E(F1U, "%s: an error occured\n", __FUNCTION__); + return -1; +} + +int f1u_dl_data(const void *params, Protocol__F1uMessage **msg) +{ + + // Initialize the PDCP params + dl_data_args *args = (dl_data_args *)params; + + Protocol__DlDataHeader *header; + + if (f1u_dl_data_create_header(args->pdu_type, args->sn, &header) != 0) + goto error; + + + Protocol__DlUserData *dl_data = NULL; + + *msg = malloc(sizeof(Protocol__DlUserData)); + + if(*msg == NULL) + goto error; + + + dl_data = *msg; + + protocol__dl_user_data__init(dl_data); + + + // Copy data to the bytes structure + dl_data->pdu.data = malloc(args->sdu_size); + dl_data->pdu.len = args->sdu_size; + memcpy(dl_data->pdu.data, args->sdu_p, args->sdu_size); + + dl_data->frame = args->frame; + dl_data->subframe = args->subframe; + dl_data->rnti = args->rnti; + + dl_data->header = header; + return 0; + error: + if(header != NULL) + free(header); + if(*msg != NULL) + free(*msg); + LOG_E(F1U, "%s: an error occured\n", __FUNCTION__); + return -1; + +} + +int proto_agent_serialize_message(Protocol__FlexsplitMessage *msg, void **buf, int *size) { + + *size = protocol__flexsplit_message__get_packed_size(msg); + + *buf = malloc(*size); + if (buf == NULL) + goto error; + + protocol__flexsplit_message__pack(msg, *buf); + + return 0; + error: LOG_E(PROTO_AGENT, "an error occured\n"); return -1; @@ -121,7 +244,7 @@ int proto_agent_pdcp_data_req(mid_t mod_id, const void *params, Protocol__Flexsp // Create the protobuf header Protocol__FspHeader *header; - xid_t xid = 1; + xid_t xid = mod_id; LOG_D(PROTO_AGENT, "creating the data_req message\n"); if (fsp_create_header(xid, PROTOCOL__FSP_TYPE__FSPT_RLC_DATA_REQ, &header) != 0) @@ -309,7 +432,7 @@ int proto_agent_pdcp_data_req_ack(mid_t mod_id, const void *params, Protocol__Fl muiP = rlc_data->fsp_muip; confirmP = rlc_data->fsp_confirm; pdcp_pdu_size = rlc_data->fsp_pdu->fsp_pdu_data.len; - pdcp_pdu_p = get_free_mem_block(pdcp_pdu_size); + pdcp_pdu_p = get_free_mem_block(pdcp_pdu_size, __func__); memcpy(pdcp_pdu_p->data, rlc_data->fsp_pdu->fsp_pdu_data.data, pdcp_pdu_size); @@ -340,7 +463,7 @@ int proto_agent_pdcp_data_req_ack(mid_t mod_id, const void *params, Protocol__Fl error: if (pdcp_pdu_p != NULL) - free_mem_block(pdcp_pdu_p); + free_mem_block(pdcp_pdu_p, __func__); if(header != NULL) free(header); if(ack!=NULL) @@ -389,7 +512,7 @@ int proto_agent_pdcp_data_ind(mid_t mod_id, const void *params, Protocol__Flexsp // Create the protobuf header Protocol__FspHeader *header; - xid_t xid = 1; + xid_t xid = mod_id; LOG_D(PROTO_AGENT, "creating the data_ind message\n"); if (fsp_create_header(xid, PROTOCOL__FSP_TYPE__FSPT_PDCP_DATA_IND, &header) != 0) @@ -500,7 +623,7 @@ int proto_agent_pdcp_data_ind_ack(mid_t mod_id, const void *params, Protocol__Fl xid_t xid; rlc_op_status_t result = 0; - LOG_D(PROTO_AGENT, "creating the data_ind_ack message\n"); + LOG_I(PROTO_AGENT, "creating the data_ind_ack message\n"); Protocol__FlexsplitMessage *input = (Protocol__FlexsplitMessage *)params; Protocol__FspPdcpDataInd *data_ind = input->data_ind_msg; @@ -528,7 +651,9 @@ int proto_agent_pdcp_data_ind_ack(mid_t mod_id, const void *params, Protocol__Fl // Create a new protocol context for handling the packet ctxt_pP = malloc(sizeof(protocol_ctxt_t)); - ctxt_pP->module_id = ctxt->fsp_mod_id; + //FIXME: + //ctxt_pP->module_id = ctxt->fsp_mod_id; + ctxt_pP->module_id = 0; ctxt_pP->enb_flag = ctxt->fsp_enb_flag; ctxt_pP->instance = ctxt->fsp_instance; ctxt_pP->rnti = ctxt->fsp_rnti; @@ -540,11 +665,15 @@ int proto_agent_pdcp_data_ind_ack(mid_t mod_id, const void *params, Protocol__Fl flag_MBMS = rlc_data->fsp_mbms_flag; rb_idP = rlc_data->fsp_rb_id; pdcp_pdu_size = rlc_data->fsp_pdu->fsp_pdu_data.len; - pdcp_pdu_p = get_free_mem_block(pdcp_pdu_size); + pdcp_pdu_p = get_free_mem_block(pdcp_pdu_size, __func__); memcpy(pdcp_pdu_p->data, rlc_data->fsp_pdu->fsp_pdu_data.data, pdcp_pdu_size); - pdcp_data_ind((const protocol_ctxt_t*) ctxt_pP, (const srb_flag_t) srb_flagP, (const MBMS_flag_t) flag_MBMS, (const rb_id_t) rb_idP, pdcp_pdu_size, pdcp_pdu_p); +// if (xid == 1) +// pdcp_data_ind_wifi((const protocol_ctxt_t*) ctxt_pP, (const srb_flag_t) srb_flagP, (const MBMS_flag_t) flag_MBMS, (const rb_id_t) rb_idP, pdcp_pdu_size, pdcp_pdu_p); +// else if (xid == 0) // FIXME: USE a preprocessed definition + pdcp_data_ind((const protocol_ctxt_t*) ctxt_pP, (const srb_flag_t) srb_flagP, (const MBMS_flag_t) flag_MBMS, (const rb_id_t) rb_idP, pdcp_pdu_size, pdcp_pdu_p); + if (fsp_create_header(xid, PROTOCOL__FSP_TYPE__FSPT_PDCP_DATA_IND_ACK, &header) != 0) goto error; @@ -566,6 +695,19 @@ int proto_agent_pdcp_data_ind_ack(mid_t mod_id, const void *params, Protocol__Fl (*msg)->msg_dir = PROTOCOL__FLEXSPLIT_DIRECTION__SUCCESSFUL_OUTCOME; (*msg)->has_msg_dir = 1; (*msg)->data_req_ack = ack; + + + //pdcp_control_plane_data_pdu_header* pdcp_header = (pdcp_control_plane_data_pdu_header*) pdcp_pdu_p; + +// int sequence_number = pdcp_get_sequence_number_of_pdu_with_long_sn((unsigned char*)pdcp_pdu_p); +// LOG_I(PROTO_AGENT,"RECEIVED DATA IND WITH SEQ NO %d\n", sequence_number); + + + + + + + return 0; error: @@ -576,7 +718,7 @@ int proto_agent_pdcp_data_ind_ack(mid_t mod_id, const void *params, Protocol__Fl if(*msg != NULL) free(*msg); if (pdcp_pdu_p != NULL) - free_mem_block(pdcp_pdu_p); + free_mem_block(pdcp_pdu_p, __func__); LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); return -1; @@ -602,7 +744,7 @@ int proto_agent_hello(mid_t mod_id, const void *params, Protocol__FlexsplitMessa Protocol__FspHeader *header; /*TODO: Need to set random xid or xid from received hello message*/ - xid_t xid = 1; + xid_t xid = mod_id; if (fsp_create_header(xid, PROTOCOL__FSP_TYPE__FSPT_HELLO, &header) != 0) goto error; @@ -655,7 +797,7 @@ int proto_agent_destroy_hello(Protocol__FlexsplitMessage *msg) { int proto_agent_echo_request(mid_t mod_id, const void* params, Protocol__FlexsplitMessage **msg) { Protocol__FspHeader *header; - xid_t xid = 1; + xid_t xid = mod_id; if (fsp_create_header(xid, PROTOCOL__FSP_TYPE__FSPT_ECHO_REQUEST, &header) != 0) goto error; LOG_D(PROTO_AGENT, "creating the echo request message\n"); @@ -759,24 +901,3 @@ int proto_agent_destroy_echo_reply(Protocol__FlexsplitMessage *msg) { LOG_E(MAC, "%s: an error occured\n", __FUNCTION__); return -1; } -/* - * get generic info from RAN - */ - -void set_enb_vars(mid_t mod_id, ran_name_t ran){ - - switch (ran){ - case RAN_LTE_OAI : - enb[mod_id] = (void *)&eNB_mac_inst[mod_id]; - enb_ue[mod_id] = (void *)&eNB_mac_inst[mod_id].UE_list; - enb_rrc[mod_id] = (void *)&eNB_rrc_inst[mod_id]; - break; - default : - goto error; - } - - return; - - error: - LOG_E(PROTO_AGENT, "unknown RAN name %d\n", ran); -} diff --git a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h index 67209fc55d..e2c48178f8 100644 --- a/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h +++ b/openair2/LAYER2/PROTO_AGENT/proto_agent_common.h @@ -49,7 +49,7 @@ //#include "stats_common.pb-c.h" #include "proto_agent_defs.h" -#include "enb_config.h" +//#include "ENB_APP/enb_config.h" #include "UTIL/MEM/mem_block.h" //#include "LAYER2/MAC/extern.h" @@ -118,6 +118,7 @@ Protocol__FlexsplitMessage* proto_agent_handle_message (mid_t mod_id, Protocol__FlexsplitMessage *proto_agent_handle_timed_task(void *args); typedef struct _data_req_args data_req_args; +typedef struct _dl_data_args dl_data_args; struct _data_req_args{ protocol_ctxt_t* ctxt; @@ -130,6 +131,16 @@ struct _data_req_args{ mem_block_t *sdu_p; }; +struct _dl_data_args{ + uint8_t pdu_type; + uint32_t sn; + frame_t frame; + sub_frame_t subframe; + rnti_t rnti; + sdu_size_t sdu_size; + mem_block_t *sdu_p; +}; + /**************************** * get generic info from RAN diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/COPYING b/openair2/LAYER2/RLC/AM_v9.3.0/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/RLC/AM_v9.3.0/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c old mode 100755 new mode 100644 index fd8279579d..0e21d5cfac --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_C 1 //----------------------------------------------------------------------------- @@ -50,60 +43,148 @@ #include "DL-AM-RLC.h" +//----------------------------------------------------------------------------- +uint32_t +rlc_am_get_status_pdu_buffer_occupancy( + rlc_am_entity_t * const rlc_pP){ + + //Compute Max Status PDU size according to what has been received and not received in the window [vrR vrMS[ + + // minimum header size in bits to be transmitted: D/C + CPT + ACK_SN + E1 + uint32_t nb_bits_to_transmit = RLC_AM_PDU_D_C_BITS + RLC_AM_STATUS_PDU_CPT_LENGTH + RLC_AM_SN_BITS + RLC_AM_PDU_E_BITS; + mem_block_t *cursor_p = rlc_pP->receiver_buffer.head; + rlc_am_pdu_info_t *pdu_info_cursor_p = NULL; + int waited_so = 0; + + rlc_sn_t sn_cursor = rlc_pP->vr_r; + rlc_sn_t sn_prev = rlc_pP->vr_r; + rlc_sn_t sn_end = rlc_pP->vr_ms; + boolean_t segment_loop_end = false; + + + if (sn_prev != sn_end) + { + while ((RLC_AM_DIFF_SN(sn_prev,rlc_pP->vr_r) < RLC_AM_DIFF_SN(sn_end,rlc_pP->vr_r)) && (cursor_p != NULL)) + { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + sn_cursor = pdu_info_cursor_p->sn; + + // Add holes between sn_prev and sn_cursor + while ((sn_prev != sn_cursor) && (sn_prev != sn_end)) + { + /* Add 1 NACK_SN + E1 + E2 */ + nb_bits_to_transmit += (RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1)); + sn_prev = RLC_AM_NEXT_SN(sn_prev); + } //end while (sn_prev != sn_cursor) + + /* Handle case sn_cursor is partially received */ + /* Each gap will add NACK_SN + E1 + E2 + SOStart + SOEnd */ + if ((((rlc_am_rx_pdu_management_t*)(cursor_p->data))->all_segments_received == 0) && (RLC_AM_DIFF_SN(sn_cursor,rlc_pP->vr_r) < RLC_AM_DIFF_SN(sn_end,rlc_pP->vr_r))) + { + /* Check lsf */ + segment_loop_end = (pdu_info_cursor_p->lsf == 1); + + /* Fill for [0 SO[ if SO not null */ + if (pdu_info_cursor_p->so) { + nb_bits_to_transmit += (RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1) + (RLC_AM_STATUS_PDU_SO_LENGTH << 1)); + waited_so = pdu_info_cursor_p->so + pdu_info_cursor_p->payload_size; + } + else { + waited_so = pdu_info_cursor_p->payload_size; + } + + /* Go to next segment */ + cursor_p = cursor_p->next; + if (cursor_p != NULL) + { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + + /* Fill following gaps if any */ + while (!segment_loop_end) + { + if ((cursor_p != NULL) && (pdu_info_cursor_p->sn == sn_cursor)) + { + /* Check lsf */ + segment_loop_end = (pdu_info_cursor_p->lsf == 1); + + if (waited_so < pdu_info_cursor_p->so) { + nb_bits_to_transmit += (RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1) + (RLC_AM_STATUS_PDU_SO_LENGTH << 1)); + } + else { + /* contiguous segment: only update waited_so */ + /* Assuming so and payload_size updated according to duplication removal done at reception ... */ + waited_so += pdu_info_cursor_p->payload_size; + } + + /* Go to next received PDU or PDU Segment */ + cursor_p = cursor_p->next; + if (cursor_p != NULL) + { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + } + else + { + /* Fill last gap assuming LSF is not received */ + nb_bits_to_transmit += (RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1) + (RLC_AM_STATUS_PDU_SO_LENGTH << 1)); + segment_loop_end = true; + } + } // end while (!segment_loop_end) + } // end if segments + else + { + /* Go to next received PDU or PDU segment with different SN */ + do + { + cursor_p = cursor_p->next; + } while ((cursor_p != NULL) && (((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info.sn == sn_cursor)); + } + + sn_prev = RLC_AM_NEXT_SN(sn_cursor); + } + } // end if (sn_prev != sn_end) + + // round up to the greatest byte + return ((nb_bits_to_transmit + 7) >> 3); + +} + //----------------------------------------------------------------------------- uint32_t rlc_am_get_buffer_occupancy_in_bytes ( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t * const rlc_pP) { - uint32_t max_li_overhead; - uint32_t header_overhead; - // priority of control trafic - if (rlc_pP->status_requested) { - if (rlc_pP->t_status_prohibit.running == 0) { + rlc_pP->status_buffer_occupancy = 0; + if ((rlc_pP->status_requested) && !(rlc_pP->status_requested & RLC_AM_STATUS_NO_TX_MASK)) { + rlc_pP->status_buffer_occupancy = rlc_am_get_status_pdu_buffer_occupancy(rlc_pP); #if TRACE_RLC_AM_BO - if (((15 + rlc_pP->num_nack_sn*(10+1) + rlc_pP->num_nack_so*(15+15+1) + 7) >> 3) > 0) { LOG_D(RLC, PROTOCOL_CTXT_FMT RB_AM_FMT" BO : CONTROL PDU %d bytes \n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - ((15 + rlc_pP->num_nack_sn*(10+1) + rlc_pP->num_nack_so*(15+15+1) + 7) >> 3)); - } + rlc_pP->status_buffer_occupancy); #endif - return ((15 + rlc_pP->num_nack_sn*(10+1) + rlc_pP->num_nack_so*(15+15+1) + 7) >> 3); - } - } - - // data traffic - if (rlc_pP->nb_sdu_no_segmented <= 1) { - max_li_overhead = 0; - } else { - max_li_overhead = (((rlc_pP->nb_sdu_no_segmented - 1) * 3) / 2) + ((rlc_pP->nb_sdu_no_segmented - 1) % 2); - } - - if (rlc_pP->sdu_buffer_occupancy == 0) { - header_overhead = 0; - } else { - header_overhead = 2; } #if TRACE_RLC_AM_BO - if ((rlc_pP->status_buffer_occupancy + rlc_pP->retransmission_buffer_occupancy + rlc_pP->sdu_buffer_occupancy + max_li_overhead + header_overhead) > 0) { + if ((rlc_pP->status_buffer_occupancy + rlc_pP->retrans_num_bytes_to_retransmit + rlc_pP->sdu_buffer_occupancy + max_li_overhead + header_overhead) > 0) { LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" BO : STATUS BUFFER %d bytes \n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->status_buffer_occupancy); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" BO : RETRANS BUFFER %d bytes \n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->retransmission_buffer_occupancy); + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" BO : RETRANS BUFFER %d bytes \n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->retrans_num_bytes_to_retransmit); LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" BO : SDU BUFFER %d bytes + li_overhead %d bytes header_overhead %d bytes (nb sdu not segmented %d)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->sdu_buffer_occupancy, - max_li_overhead, - header_overhead, + 0, + 0, rlc_pP->nb_sdu_no_segmented); } #endif - return rlc_pP->status_buffer_occupancy + rlc_pP->retrans_num_bytes_to_retransmit + rlc_pP->sdu_buffer_occupancy + max_li_overhead + header_overhead; + return rlc_pP->status_buffer_occupancy + rlc_pP->retrans_num_bytes_to_retransmit + rlc_pP->sdu_buffer_occupancy; } //----------------------------------------------------------------------------- void @@ -120,7 +201,8 @@ config_req_rlc_am ( const protocol_ctxt_t* const ctxt_pP, const srb_flag_t srb_flagP, rlc_am_info_t * const config_am_pP, - const rb_id_t rb_idP + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP ) { rlc_union_t *rlc_union_p = NULL; @@ -142,7 +224,7 @@ config_req_rlc_am ( config_am_pP->t_reordering, config_am_pP->t_status_prohibit); rlc_am_init(ctxt_pP, l_rlc_p); - rlc_am_set_debug_infos(ctxt_pP, l_rlc_p, srb_flagP, rb_idP); + rlc_am_set_debug_infos(ctxt_pP, l_rlc_p, srb_flagP, rb_idP, chan_idP); rlc_am_configure(ctxt_pP, l_rlc_p, config_am_pP->max_retx_threshold, config_am_pP->poll_pdu, @@ -155,19 +237,26 @@ config_req_rlc_am ( PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,l_rlc_p)); } } -uint32_t pollPDU_tab[PollPDU_pInfinity+1]= {4,8,16,32,64,128,256,1024}; // What is PollPDU_pInfinity??? 1024 for now +uint16_t pollPDU_tab[PollPDU_pInfinity+1]= {4,8,16,32,64,128,256,RLC_AM_POLL_PDU_INFINITE}; //PollPDU_pInfinity is chosen to 0xFFFF for now uint32_t maxRetxThreshold_tab[UL_AM_RLC__maxRetxThreshold_t32+1]= {1,2,3,4,6,8,16,32}; -uint32_t pollByte_tab[PollByte_spare1]= {25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,10000}; // What is PollByte_kBinfinity??? 10000 for now +uint32_t pollByte_tab[PollByte_spare1]= {25000,50000,75000,100000,125000,250000,375000,500000,750000,1000000,1250000,1500000,2000000,3000000,RLC_AM_POLL_BYTE_INFINITE}; // PollByte_kBinfinity is chosen to 0xFFFFFFFF for now +#if defined(Rel14) +uint32_t PollRetransmit_tab[T_PollRetransmit_spare5]= {5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,300,350,400,450,500,800,1000,2000,4000}; +uint32_t am_t_Reordering_tab[32]= {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,110,120,130,140,150,160,170,180,190,200,1600}; +uint32_t t_StatusProhibit_tab[T_StatusProhibit_spare2]= {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,300,350,400,450,500,800,1000,1200,1600,2000,2400}; +#else uint32_t PollRetransmit_tab[T_PollRetransmit_spare9]= {5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,300,350,400,450,500}; uint32_t am_t_Reordering_tab[T_Reordering_spare1]= {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,110,120,130,140,150,160,170,180,190,200}; uint32_t t_StatusProhibit_tab[T_StatusProhibit_spare8]= {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,300,350,400,450,500}; +#endif //----------------------------------------------------------------------------- void config_req_rlc_am_asn1 ( const protocol_ctxt_t* const ctxt_pP, const srb_flag_t srb_flagP, const struct RLC_Config__am * const config_am_pP, - const rb_id_t rb_idP) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP) { rlc_union_t *rlc_union_p = NULL; rlc_am_entity_t *l_rlc_p = NULL; @@ -182,9 +271,15 @@ void config_req_rlc_am_asn1 ( if ((config_am_pP->ul_AM_RLC.maxRetxThreshold <= UL_AM_RLC__maxRetxThreshold_t32) && (config_am_pP->ul_AM_RLC.pollPDU<=PollPDU_pInfinity) && (config_am_pP->ul_AM_RLC.pollByteul_AM_RLC.t_PollRetransmitdl_AM_RLC.t_Reordering<32) && + (config_am_pP->dl_AM_RLC.t_StatusProhibitul_AM_RLC.t_PollRetransmitdl_AM_RLC.t_Reorderingdl_AM_RLC.t_StatusProhibitenb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE, @@ -208,7 +303,7 @@ void config_req_rlc_am_asn1 ( t_StatusProhibit_tab[config_am_pP->dl_AM_RLC.t_StatusProhibit]); rlc_am_init(ctxt_pP, l_rlc_p); - rlc_am_set_debug_infos(ctxt_pP, l_rlc_p, srb_flagP, rb_idP); + rlc_am_set_debug_infos(ctxt_pP, l_rlc_p, srb_flagP, rb_idP, chan_idP); rlc_am_configure(ctxt_pP, l_rlc_p, maxRetxThreshold_tab[config_am_pP->ul_AM_RLC.maxRetxThreshold], pollPDU_tab[config_am_pP->ul_AM_RLC.pollPDU], @@ -227,7 +322,7 @@ void config_req_rlc_am_asn1 ( PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP, l_rlc_p)); LOG_D(RLC, - PROTOCOL_RLC_AM_CTXT_FMT"ILLEGAL CONFIG_REQ (max_retx_threshold=%d poll_pdu=%d poll_byte=%d t_poll_retransmit=%d t_reord=%d t_status_prohibit=%d), RLC-AM NOT CONFIGURED\n", + PROTOCOL_RLC_AM_CTXT_FMT"ILLEGAL CONFIG_REQ (max_retx_threshold=%ld poll_pdu=%ld poll_byte=%ld t_poll_retransmit=%ld t_reord=%ld t_status_prohibit=%ld), RLC-AM NOT CONFIGURED\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,l_rlc_p), config_am_pP->ul_AM_RLC.maxRetxThreshold, config_am_pP->ul_AM_RLC.pollPDU, @@ -310,7 +405,7 @@ rlc_am_get_pdus ( rlc_am_entity_t * const rlc_pP ) { - int display_flag = 0; + //int display_flag = 0; // 5.1.3.1 Transmit operations // 5.1.3.1.1 // General @@ -327,7 +422,8 @@ rlc_am_get_pdus ( case RLC_DATA_TRANSFER_READY_STATE: // TRY TO SEND CONTROL PDU FIRST - if ((rlc_pP->nb_bytes_requested_by_mac > 2) && (rlc_pP->status_requested)) { + if ((rlc_pP->nb_bytes_requested_by_mac >= 2) && + ((rlc_pP->status_requested) && !(rlc_pP->status_requested & RLC_AM_STATUS_NO_TX_MASK))) { // When STATUS reporting has been triggered, the receiving side of an AM RLC entity shall: // - if t-StatusProhibit is not running: // - at the first transmission opportunity indicated by lower layer, construct a STATUS PDU and deliver it to lower layer; @@ -338,139 +434,39 @@ rlc_am_get_pdus ( // // When a STATUS PDU has been delivered to lower layer, the receiving side of an AM RLC entity shall: // - start t-StatusProhibit. - if (rlc_pP->t_status_prohibit.running == 0) { + rlc_am_send_status_pdu(ctxt_pP, rlc_pP); mem_block_t* pdu = list_remove_head(&rlc_pP->control_pdu_list); if (pdu) { list_add_tail_eurecom (pdu, &rlc_pP->pdus_to_mac_layer); - rlc_pP->status_requested = 0; + RLC_AM_CLEAR_ALL_STATUS(rlc_pP->status_requested); + rlc_pP->status_buffer_occupancy = 0; rlc_am_start_timer_status_prohibit(ctxt_pP, rlc_pP); return; } - } else { - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" DELAYED SENT STATUS PDU BECAUSE T-STATUS-PROHIBIT RUNNING (TIME-OUT %u)\n", + } + else { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" DELAYED SENT STATUS PDU (Available MAC Data %u)(T-PROHIBIT %u) (DELAY FLAG %u)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->t_status_prohibit.ms_time_out); - } + rlc_pP->nb_bytes_requested_by_mac,rlc_pP->t_status_prohibit.ms_time_out,(rlc_pP->status_requested & RLC_AM_STATUS_TRIGGERED_DELAYED)); } - /*while ((rlc_pP->nb_bytes_requested_by_mac > 0) && (stay_on_this_list)) { - mem_block_t* pdu = list_get_head(&rlc_pP->control_pdu_list); - if (pdu != NULL { - if ( ((rlc_am_tx_control_pdu_management_t*)(pdu->data))->size <= rlc_pP->nb_bytes_requested_by_mac) { - pdu = list_remove_head(&rlc_pP->control_pdu_list); - #if TRACE_RLC_AM_TX - msg ("[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] SEND CONTROL PDU\n", ((rlc_am_entity_t *) rlc_pP)->module_id,((rlc_am_entity_t *) rlc_pP)->rb_id, ctxt_pP->frame); - #endif - list_add_tail_eurecom (pdu, &rlc_pP->pdus_to_mac_layer); - rlc_pP->nb_bytes_requested_by_mac = rlc_pP->nb_bytes_requested_by_mac - ((rlc_am_tx_control_pdu_management_t*)(pdu->data))->size; - } else { - stay_on_this_list = 0; - } - } else { - stay_on_this_list = 0; - } - }*/ // THEN TRY TO SEND RETRANS PDU - if (rlc_pP->first_retrans_pdu_sn >= 0) { - rlc_am_tx_data_pdu_management_t* tx_data_pdu_management; + if ((rlc_pP->retrans_num_bytes_to_retransmit) && (rlc_pP->nb_bytes_requested_by_mac > 2)) { - // tx min 3 bytes because of the size of the RLC header - while ((rlc_pP->nb_bytes_requested_by_mac > 2) && - (rlc_pP->first_retrans_pdu_sn >= 0) && - (rlc_pP->first_retrans_pdu_sn != rlc_pP->vt_s)) { + /* Get 1 AM data PDU or PDU segment to retransmit */ + mem_block_t* pdu_retx = rlc_am_get_pdu_to_retransmit(ctxt_pP, rlc_pP); - tx_data_pdu_management = &rlc_pP->pdu_retrans_buffer[rlc_pP->first_retrans_pdu_sn]; + if (pdu_retx != NULL) { + list_add_tail_eurecom (pdu_retx, &rlc_pP->pdus_to_mac_layer); - if ((tx_data_pdu_management->header_and_payload_size <= rlc_pP->nb_bytes_requested_by_mac) && (tx_data_pdu_management->retx_count >= 0) - && (tx_data_pdu_management->nack_so_start == 0) && (tx_data_pdu_management->nack_so_stop == 0x7FFF)) { - mem_block_t* copy = rlc_am_retransmit_get_copy(ctxt_pP, rlc_pP, rlc_pP->first_retrans_pdu_sn); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" RE-SEND DATA PDU SN %04d %d BYTES\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->first_retrans_pdu_sn, - tx_data_pdu_management->header_and_payload_size); - rlc_pP->stat_tx_data_pdu += 1; - rlc_pP->stat_tx_retransmit_pdu += 1; - rlc_pP->stat_tx_retransmit_pdu_by_status += 1; - rlc_pP->stat_tx_data_bytes += tx_data_pdu_management->header_and_payload_size; - rlc_pP->stat_tx_retransmit_bytes += tx_data_pdu_management->header_and_payload_size; - rlc_pP->stat_tx_retransmit_bytes_by_status += tx_data_pdu_management->header_and_payload_size; - - list_add_tail_eurecom (copy, &rlc_pP->pdus_to_mac_layer); - rlc_pP->nb_bytes_requested_by_mac = rlc_pP->nb_bytes_requested_by_mac - tx_data_pdu_management->header_and_payload_size; - - tx_data_pdu_management->retx_count += 1; return; - } else if ((tx_data_pdu_management->retx_count >= 0) && (rlc_pP->nb_bytes_requested_by_mac >= RLC_AM_MIN_SEGMENT_SIZE_REQUEST)) { - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" SEND SEGMENT OF DATA PDU SN %04d MAC BYTES %d SIZE %d RTX COUNT %d nack_so_start %d nack_so_stop %04X(hex)\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->first_retrans_pdu_sn, - rlc_pP->nb_bytes_requested_by_mac, - tx_data_pdu_management->header_and_payload_size, - tx_data_pdu_management->retx_count, - tx_data_pdu_management->nack_so_start, - tx_data_pdu_management->nack_so_stop); - - mem_block_t* copy = rlc_am_retransmit_get_subsegment( - ctxt_pP, - rlc_pP, - rlc_pP->first_retrans_pdu_sn, - &rlc_pP->nb_bytes_requested_by_mac); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" SEND SEGMENT OF DATA PDU SN %04d (NEW SO %05d)\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->first_retrans_pdu_sn, - tx_data_pdu_management->nack_so_start); - - rlc_pP->stat_tx_data_pdu += 1; - rlc_pP->stat_tx_retransmit_pdu += 1; - rlc_pP->stat_tx_retransmit_pdu_by_status += 1; - rlc_pP->stat_tx_data_bytes += (((struct mac_tb_req*)(copy->data))->tb_size); - rlc_pP->stat_tx_retransmit_bytes += (((struct mac_tb_req*)(copy->data))->tb_size); - rlc_pP->stat_tx_retransmit_bytes_by_status += (((struct mac_tb_req*)(copy->data))->tb_size); - list_add_tail_eurecom (copy, &rlc_pP->pdus_to_mac_layer); - } else { - break; + } } - // update first_retrans_pdu_sn - while ((rlc_pP->first_retrans_pdu_sn != rlc_pP->vt_s) && - (!(rlc_pP->pdu_retrans_buffer[rlc_pP->first_retrans_pdu_sn].flags.retransmit))) { - rlc_pP->first_retrans_pdu_sn = (rlc_pP->first_retrans_pdu_sn+1) & RLC_AM_SN_MASK; - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" UPDATED first_retrans_pdu_sn SN %04d\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->first_retrans_pdu_sn); - }; - - display_flag = 1; - - if (rlc_pP->first_retrans_pdu_sn == rlc_pP->vt_s) { - // no more pdu to be retransmited - rlc_pP->first_retrans_pdu_sn = -1; - display_flag = 0; - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" CLEAR first_retrans_pdu_sn\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); - } - - if (display_flag > 0) { - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" UPDATED first_retrans_pdu_sn %04d\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->first_retrans_pdu_sn); - } - - return; - - /* ONLY ONE TB PER TTI - if ((tx_data_pdu_management->retx_count >= 0) && (rlc_pP->nb_bytes_requested_by_mac < RLC_AM_MIN_SEGMENT_SIZE_REQUEST)) { - #if TRACE_RLC_AM_TX - msg ("[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] BREAK LOOP ON RETRANSMISSION BECAUSE ONLY %d BYTES ALLOWED TO TRANSMIT BY MAC\n",ctxt_pP->frame, ((rlc_am_entity_t *) rlc_pP)->module_id,((rlc_am_entity_t *) rlc_pP)->rb_id, rlc_pP->nb_bytes_requested_by_mac); - #endif - break; - }*/ - } - } - - if ((rlc_pP->nb_bytes_requested_by_mac > 2) && (rlc_pP->vt_s != rlc_pP->vt_ms)) { + // THEN TRY TO SEND NEW DATA PDU + if ((rlc_pP->nb_bytes_requested_by_mac > 2) && (rlc_pP->sdu_buffer_occupancy) && (rlc_pP->vt_s != rlc_pP->vt_ms)) { rlc_am_segment_10(ctxt_pP, rlc_pP); list_add_list (&rlc_pP->segmentation_pdu_list, &rlc_pP->pdus_to_mac_layer); @@ -481,29 +477,6 @@ rlc_am_get_pdus ( } } - if ((rlc_pP->pdus_to_mac_layer.head == NULL) && - (rlc_am_is_timer_poll_retransmit_timed_out(ctxt_pP, rlc_pP)) && - (rlc_pP->nb_bytes_requested_by_mac > 2)) { - rlc_am_retransmit_any_pdu(ctxt_pP, rlc_pP); - return; - } else { - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" COULD NOT RETRANSMIT ANY PDU BECAUSE ", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); - - if (rlc_pP->pdus_to_mac_layer.head != NULL) { - LOG_D(RLC, "THERE ARE SOME PDUS READY TO TRANSMIT "); - } - - if (!(rlc_am_is_timer_poll_retransmit_timed_out(ctxt_pP, rlc_pP))) { - LOG_D(RLC, "TIMER POLL DID NOT TIMED OUT (RUNNING = %d NUM PDUS TO RETRANS = %d NUM BYTES TO RETRANS = %d) ", rlc_pP->t_poll_retransmit.running, - rlc_pP->retrans_num_pdus, rlc_pP->retrans_num_bytes_to_retransmit); - } - - if (rlc_pP->nb_bytes_requested_by_mac <= 2) { - LOG_D(RLC, "NUM BYTES REQUESTED BY MAC = %d", rlc_pP->nb_bytes_requested_by_mac); - } - LOG_D(RLC, "\n"); - } break; @@ -526,7 +499,7 @@ rlc_am_rx ( switch (rlc->protocol_state) { case RLC_NULL_STATE: - LOG_N(RLC, PROTOCOL_RLC_AM_CTXT_FMT" ERROR MAC_DATA_IND IN RLC_NULL_STATE\n", arg_pP); + LOG_N(RLC, PROTOCOL_RLC_AM_CTXT_FMT" ERROR MAC_DATA_IND IN RLC_NULL_STATE\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP, rlc)); list_free (&data_indP.data); break; @@ -535,7 +508,7 @@ rlc_am_rx ( break; default: - LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT" TX UNKNOWN PROTOCOL STATE 0x%02X\n", rlc, rlc->protocol_state); + LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT" TX UNKNOWN PROTOCOL STATE 0x%02X\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP, rlc), rlc->protocol_state); } } @@ -545,7 +518,8 @@ rlc_am_mac_status_indication ( const protocol_ctxt_t* const ctxt_pP, void * const rlc_pP, const uint16_t tb_sizeP, - struct mac_status_ind tx_statusP) + struct mac_status_ind tx_statusP, + const eNB_flag_t enb_flagP) { struct mac_status_resp status_resp; uint16_t sdu_size = 0; @@ -560,18 +534,47 @@ rlc_am_mac_status_indication ( status_resp.head_sdu_is_segmented = 0; status_resp.rlc_info.rlc_protocol_state = rlc->protocol_state; - if (rlc->last_frame_status_indication != ctxt_pP->frame) { + /* TODO: remove this hack. Problem is: there is a race. + * UE comes. SRB2 is configured via message to RRC. + * At some point the RLC AM is created but not configured yet. + * At this moment (I think) MAC calls mac_rlc_status_ind + * which calls this function. But the init was not finished yet + * and we have a crash below when testing mem_block != NULL. + */ + if (rlc->input_sdus == NULL) return status_resp; + + if (rlc->last_absolute_subframe_status_indication != (PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP))) { rlc_am_check_timer_poll_retransmit(ctxt_pP, rlc); rlc_am_check_timer_reordering(ctxt_pP, rlc); rlc_am_check_timer_status_prohibit(ctxt_pP, rlc); } - rlc->last_frame_status_indication = ctxt_pP->frame; + rlc->last_absolute_subframe_status_indication = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP); rlc->nb_bytes_requested_by_mac = tb_sizeP; status_resp.buffer_occupancy_in_bytes = rlc_am_get_buffer_occupancy_in_bytes(ctxt_pP, rlc); + // For eNB scheduler : Add Max RLC header size for new PDU + // For UE : do not add RLC header part to be compliant with BSR definition in 36.321 + if (enb_flagP == ENB_FLAG_YES) { + uint32_t max_li_overhead = 0; + uint32_t header_overhead = 0; + + if (rlc->nb_sdu_no_segmented > 1) { + /* This computation assumes there is no SDU with size greater than 2047 bytes, otherwise a new PDU must be built except for LI15 configuration from Rel12*/ + uint32_t num_li = rlc->nb_sdu_no_segmented - 1; + max_li_overhead = num_li + (num_li >> 1) + (num_li & 1); + } + + if (rlc->sdu_buffer_occupancy > 0) { + header_overhead = 2; + } + + status_resp.buffer_occupancy_in_bytes += (header_overhead + max_li_overhead); + } + + if ((rlc->input_sdus[rlc->current_sdu_index].mem_block != NULL) && (status_resp.buffer_occupancy_in_bytes)) { //status_resp.buffer_occupancy_in_bytes += ((rlc_am_entity_t *) rlc)->tx_header_min_length_in_bytes; @@ -592,32 +595,16 @@ rlc_am_mac_status_indication ( } } else { - if (rlc_am_is_timer_poll_retransmit_timed_out(ctxt_pP, rlc)) { - if ((status_resp.buffer_occupancy_in_bytes == 0) && (rlc->input_sdus[rlc->current_sdu_index].mem_block == NULL) && (rlc->nb_sdu > 0)) { - // force BO to be > 0 - rlc_sn_t sn = (rlc->vt_s - 1) & RLC_AM_SN_MASK; - rlc_sn_t sn_end = (rlc->vt_a - 1) & RLC_AM_SN_MASK; - int found_pdu = 0; - rlc_sn_t found_pdu_sn = 0; // avoid warning - (void)found_pdu_sn; /* avoid gcc warning "set but not used" */ - - - while (sn != sn_end) { - if (rlc->pdu_retrans_buffer[sn].mem_block != NULL) { - if (!found_pdu) { - found_pdu = 1; - found_pdu_sn = sn; - } - status_resp.buffer_occupancy_in_bytes = rlc->pdu_retrans_buffer[sn].header_and_payload_size; - status_resp.buffer_occupancy_in_pdus = rlc->nb_sdu; - status_resp.head_sdu_remaining_size_to_send = status_resp.buffer_occupancy_in_bytes; - // TODO head_sdu_is_segmented - break; + /* Not so many possibilities ... */ + /* either buffer_occupancy_in_bytes = 0 and that's it */ + /* or we have segmented all received SDUs and buffer occupancy is then made of retransmissions and/or status pdu pending */ + /* then consider only retransmission buffer for the specific BO values used by eNB scheduler (not used up to now...) */ + if (rlc->retrans_num_bytes_to_retransmit) { + status_resp.buffer_occupancy_in_pdus = rlc->retrans_num_pdus; + status_resp.head_sdu_remaining_size_to_send = rlc->retrans_num_bytes_to_retransmit; + status_resp.head_sdu_is_segmented = 1; } } - } - } - } #if MESSAGE_CHART_GENERATOR_RLC_MAC MSC_LOG_RX_MESSAGE( (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE, @@ -660,11 +647,23 @@ rlc_am_mac_status_indication ( #endif return status_resp; } + +//----------------------------------------------------------------------------- +void +rlc_am_set_nb_bytes_requested_by_mac ( + void * const rlc_pP, + const tb_size_t tb_sizeP +) +{ + ((rlc_am_entity_t *) rlc_pP)->nb_bytes_requested_by_mac = tb_sizeP; +} + //----------------------------------------------------------------------------- struct mac_data_req rlc_am_mac_data_request ( const protocol_ctxt_t* const ctxt_pP, - void * const rlc_pP + void * const rlc_pP, + const eNB_flag_t enb_flagP ) { struct mac_data_req data_req; @@ -702,7 +701,10 @@ rlc_am_mac_data_request ( data_req.data.nb_elements); } + if (enb_flagP) { + // redundant in UE MAC Tx processing and not used in eNB ... data_req.buffer_occupancy_in_bytes = rlc_am_get_buffer_occupancy_in_bytes(ctxt_pP, l_rlc_p); + } data_req.rlc_info.rlc_protocol_state = l_rlc_p->protocol_state; #if TRACE_RLC_AM_PDU || MESSAGE_CHART_GENERATOR @@ -1249,14 +1251,19 @@ rlc_am_data_req ( l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].flags.no_new_sdu_segmented_in_last_pdu = 0; //l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].li_index_for_discard = -1; l_rlc_p->next_sdu_index = (l_rlc_p->next_sdu_index + 1) % RLC_AM_SDU_CONTROL_BUFFER_SIZE; - LOG_I(RLC, PROTOCOL_RLC_AM_CTXT_FMT" RLC_AM_DATA_REQ size %d Bytes, NB SDU %d current_sdu_index=%d next_sdu_index=%d conf %d mui %d\n", + if (l_rlc_p->channel_id <3) + { + LOG_I(RLC, PROTOCOL_RLC_AM_CTXT_FMT" RLC_AM_DATA_REQ size %d Bytes, NB SDU %d current_sdu_index=%d next_sdu_index=%d conf %d mui %d vtA %d vtS %d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,l_rlc_p), data_size, l_rlc_p->nb_sdu, l_rlc_p->current_sdu_index, l_rlc_p->next_sdu_index, conf, - mui); + mui, + l_rlc_p->vt_a, + l_rlc_p->vt_s); + } } else { #if MESSAGE_CHART_GENERATOR mui = ((struct rlc_am_data_req*) (sdu_pP->data))->mui; @@ -1273,17 +1280,19 @@ rlc_am_data_req ( data_size, mui); #endif - LOG_W(RLC, PROTOCOL_RLC_AM_CTXT_FMT" RLC_AM_DATA_REQ BUFFER FULL, NB SDU %d current_sdu_index=%d next_sdu_index=%d size_input_sdus_buffer=%d\n", + LOG_W(RLC, PROTOCOL_RLC_AM_CTXT_FMT" RLC_AM_DATA_REQ BUFFER FULL, NB SDU %d current_sdu_index=%d next_sdu_index=%d size_input_sdus_buffer=%d vtA=%d vtS=%d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,l_rlc_p), l_rlc_p->nb_sdu, l_rlc_p->current_sdu_index, l_rlc_p->next_sdu_index, - RLC_AM_SDU_CONTROL_BUFFER_SIZE); + RLC_AM_SDU_CONTROL_BUFFER_SIZE, + l_rlc_p->vt_a, + l_rlc_p->vt_s); LOG_W(RLC, " input_sdus[].mem_block=%p next input_sdus[].flags.segmented=%d\n", l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].mem_block, l_rlc_p->input_sdus[l_rlc_p->next_sdu_index].flags.segmented); l_rlc_p->stat_tx_pdcp_sdu_discarded += 1; l_rlc_p->stat_tx_pdcp_bytes_discarded += ((struct rlc_am_data_req *) (sdu_pP->data))->data_size; - free_mem_block (sdu_pP); + free_mem_block (sdu_pP, __func__); #if STOP_ON_IP_TRAFFIC_OVERLOAD AssertFatal(0, PROTOCOL_RLC_AM_CTXT_FMT" RLC_AM_DATA_REQ size %d Bytes, SDU DROPPED, INPUT BUFFER OVERFLOW NB SDU %d current_sdu_index=%d next_sdu_index=%d \n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,l_rlc_p), diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h old mode 100755 new mode 100644 index 70cbb3b12e..5130bde38b --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am.h * \brief This file, and only this file must be included by code that interact with RLC AM layer. * \author GAUTHIER Lionel @@ -80,10 +73,6 @@ # include "RLC-Config.h" //# include "rlc_am_test.h" -#ifdef USER_MODE -//# include "rlc_am_very_simple_test.h" -#endif - #define PROTOCOL_RLC_AM_CTXT_FMT PROTOCOL_CTXT_FMT"[%s %02u]" #define PROTOCOL_RLC_AM_CTXT_ARGS(CTXT_Pp, rLC_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp),\ @@ -135,31 +124,35 @@ public_rlc_am(void rlc_am_release ( * @{ */ -/*! \fn void config_req_rlc_am (const protocol_ctxt_t* const ctxtP, const srb_flag_t srb_flagP, rlc_am_info_t * config_amP, rb_id_t rb_idP) +/*! \fn void config_req_rlc_am (const protocol_ctxt_t* const ctxtP, const srb_flag_t srb_flagP, rlc_am_info_t * config_amP, rb_id_t rb_idP, logical_chan_id_t chan_idP) * \brief Configure the UL and DL parameters of the RLC AM * \param[in] ctxt_pP Running context. * \param[in] srb_flagP Flag to indicate signalling radio bearer (1) or data radio bearer (0). * \param[in] config_amP Configuration parameters for RLC AM instance. * \param[in] rb_idP Radio bearer identifier. +* \param[in] chan_idP Transport channel identifier. */ public_rlc_am(void config_req_rlc_am ( const protocol_ctxt_t* const ctxtP, const srb_flag_t srb_flagP, const rlc_am_info_t * const config_amP, - const rb_id_t rb_idP);) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP);) -/*! \fn void config_req_rlc_am_asn1 (const protocol_ctxt_t* const ctxtP, const srb_flag_t srb_flagP, struct RLC_Config__am * config_amP, rb_id_t rb_idP) +/*! \fn void config_req_rlc_am_asn1 (const protocol_ctxt_t* const ctxtP, const srb_flag_t srb_flagP, struct RLC_Config__am * config_amP, rb_id_t rb_idP, logical_chan_id_t chan_idP) * \brief Configure the UL and DL parameters of the RLC AM with the asn1c autogenerated pameters structs * \param[in] ctxt_pP Running context. * \param[in] srb_flagP Flag to indicate signalling radio bearer (1) or data radio bearer (0). * \param[in] config_amP Configuration parameters for RLC AM instance. * \param[in] rb_idP Radio bearer identifier. +* \param[in] chan_idP Transport channel identifier. */ public_rlc_am(void config_req_rlc_am_asn1 ( const protocol_ctxt_t* const ctxtP, const srb_flag_t srb_flagP, const struct RLC_Config__am * const config_amP, - const rb_id_t rb_idP);) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP);) /** @} */ @@ -270,23 +263,32 @@ private_rlc_am( void rlc_am_get_pdus (const protocol_ctxt_t* const ctxtP,v */ protected_rlc_am( void rlc_am_rx (const protocol_ctxt_t* const ctxtP,void * const rlc_pP, struct mac_data_ind);) -/*! \fn struct mac_status_resp rlc_am_mac_status_indication (const protocol_ctxt_t* const ctxtP,void * const rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP) +/*! \fn struct mac_status_resp rlc_am_mac_status_indication (const protocol_ctxt_t* const ctxtP,void * const rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP,const eNB_flag_t enb_flagP) * \brief Request the maximum number of bytes that can be served by RLC instance to MAC and fix the amount of bytes requested by MAC for next RLC transmission. * \param[in] ctxt_pP Running context. * \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] tbs_sizeP Number of bytes requested by MAC for next transmission. * \param[in] tx_statusP Transmission status given by MAC on previous MAC transmission of the PDU. +* \param[in] enb_flagP eNB or UE flag indication. * \return The maximum number of bytes that can be served by RLC instance to MAC. */ -public_rlc_am( struct mac_status_resp rlc_am_mac_status_indication (const protocol_ctxt_t* const ctxtP, void * const rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP);) +public_rlc_am( struct mac_status_resp rlc_am_mac_status_indication (const protocol_ctxt_t* const ctxtP, void * const rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP,const eNB_flag_t enb_flagP);) -/*! \fn struct mac_data_req rlc_am_mac_data_request (const protocol_ctxt_t* const ctxtP,void * const rlc_pP) +/*! \fn void rlc_am_set_nb_bytes_requested_by_mac (void * const rlc_pP,const tb_size_t tb_sizeP) +* \brief Set available TBS for RLC Tx just before am_mac_data_request. Used for UE only. +* \param[in] rlc_pP RLC AM protocol instance pointer. +* \param[in] tb_sizeP Available Tx Transport Block size in bytes. +*/ +public_rlc_am( void rlc_am_set_nb_bytes_requested_by_mac (void * const rlc_pP,const tb_size_t tb_sizeP);) + +/*! \fn struct mac_data_req rlc_am_mac_data_request (const protocol_ctxt_t* const ctxtP,void * const rlc_pP,const eNB_flag_t enb_flagP) * \brief Gives PDUs to lower layer MAC. * \param[in] ctxt_pP Running context. * \param[in] rlc_pP RLC AM protocol instance pointer. +* \param[in] enb_flagP eNB or UE flag * \return A PDU of the previously requested number of bytes, and the updated maximum number of bytes that can be served by RLC instance to MAC for next RLC transmission. */ -public_rlc_am( struct mac_data_req rlc_am_mac_data_request (const protocol_ctxt_t* const ctxtP,void * const rlc_pP);) +public_rlc_am( struct mac_data_req rlc_am_mac_data_request (const protocol_ctxt_t* const ctxtP,void * const rlc_pP,const eNB_flag_t enb_flagP);) /*! \fn void rlc_am_mac_data_indication (const protocol_ctxt_t* const ctxtP,void * const rlc_pP, struct mac_data_ind data_indP) * \brief Receive PDUs from lower layer MAC. @@ -296,6 +298,13 @@ public_rlc_am( struct mac_data_req rlc_am_mac_data_request (const protocol_ct */ public_rlc_am( void rlc_am_mac_data_indication (const protocol_ctxt_t* const ctxtP,void * const rlc_pP, struct mac_data_ind data_indP);) +/*! \fn uint32_t rlc_am_get_buffer_occupancy_in_bytes (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t * const rlc_pP) +* \brief Get Tx Buffer Occupancy. +* \param[in] ctxt_pP Running context. +* \param[in] rlc_pP RLC AM protocol instance pointer. +*/ +public_rlc_am( uint32_t rlc_am_get_buffer_occupancy_in_bytes (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t * const rlc_pP);) + /*! \fn void rlc_am_data_req (const protocol_ctxt_t* const ctxtP,void * const rlc_pP, mem_block_t *sduP) * \brief Interface with higher layers, buffer higher layer SDUS for transmission. * \param[in] ctxt_pP Running context. diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h old mode 100755 new mode 100644 index 3bc97ee650..674b8c244e --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_constants.h * \brief This file defines constant values used in RLC AM. * \author GAUTHIER Lionel @@ -55,19 +48,22 @@ # define RLC_AM_SDU_DATA_BUFFER_SIZE 64*1024 /** Max number of incoming SDUs from upper layer that can be buffered in a RLC AM protocol instance. */ -# define RLC_AM_SDU_CONTROL_BUFFER_SIZE 128 +# define RLC_AM_SDU_CONTROL_BUFFER_SIZE 1024 /** Size of the retransmission buffer (number of PDUs). */ -# define RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE RLC_AM_SN_MODULO +# define RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE RLC_AM_WINDOW_SIZE /** PDU minimal header size in bytes. */ # define RLC_AM_HEADER_MIN_SIZE 2 +/** PDU Segment minimal header size in bytes = PDU header + SOStart + SOEnd. */ +# define RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE 4 + /** If we want to send a segment of a PDU, then the min transport block size requested by MAC should be this amount. */ # define RLC_AM_MIN_SEGMENT_SIZE_REQUEST 8 /** Max SDUs that can fit in a PDU. */ -# define RLC_AM_MAX_SDU_IN_PDU 32 +# define RLC_AM_MAX_SDU_IN_PDU 128 /** Max fragments for a SDU. */ # define RLC_AM_MAX_SDU_FRAGMENTS 32 @@ -76,6 +72,99 @@ # define RLC_AM_MAX_NACK_IN_STATUS_PDU 1023 /** Max holes created by NACK_SN with segment offsets for a PDU in the retransmission buffer. */ -# define RLC_AM_MAX_HOLES_REPORT_PER_PDU 32 +# define RLC_AM_MAX_HOLES_REPORT_PER_PDU 16 /** @} */ -# endif + +#define RLC_AM_POLL_PDU_INFINITE 0xFFFF +#define RLC_AM_POLL_BYTE_INFINITE 0xFFFFFFFF + +/* MACRO DEFINITIONS */ + +#define RLC_AM_NEXT_SN(sn) (((sn)+1) & (RLC_AM_SN_MASK)) +#define RLC_AM_PREV_SN(sn) (((sn)+(RLC_AM_SN_MODULO)-1) & (RLC_AM_SN_MASK)) + +#define RLC_DIFF_SN(sn,snref,modulus) ((sn+(modulus)-snref) & ((modulus)-1)) +#define RLC_SN_IN_WINDOW(sn,snref,modulus) ((RLC_DIFF_SN(sn,snref,modulus)) < ((modulus) >> 1)) + +#define RLC_AM_DIFF_SN(sn,snref) (RLC_DIFF_SN(sn,snref,RLC_AM_SN_MODULO)) +#define RLC_AM_SN_IN_WINDOW(sn,snref) (RLC_SN_IN_WINDOW(sn,snref,RLC_AM_SN_MODULO)) + +#define RLC_SET_BIT(x,offset) ((x) |= (1 << (offset))) +#define RLC_GET_BIT(x,offset) (((x) & (1 << (offset))) >> (offset)) +#define RLC_CLEAR_BIT(x,offset) ((x) &= ~(1 << (offset))) + +#define RLC_SET_EVENT(x,event) ((x) |= (event)) +#define RLC_GET_EVENT(x,event) ((x) & (event)) +#define RLC_CLEAR_EVENT(x,event) ((x) &= (~(event))) + +/* Common to Data and Status PDU */ +#define RLC_AM_SN_BITS 10 +#define RLC_AM_PDU_D_C_BITS 1 +#define RLC_AM_PDU_E_BITS 1 +#define RLC_AM_PDU_FI_BITS 2 +#define RLC_AM_PDU_POLL_BITS 1 +#define RLC_AM_PDU_RF_BITS 1 + + +#define RLC_AM_LI_BITS 11 +#define RLC_AM_LI_MASK 0x7FF + + +/* AM Data PDU */ +#define RLC_AM_PDU_E_OFFSET 2 +#define RLC_AM_PDU_FI_OFFSET (RLC_AM_PDU_E_OFFSET + RLC_AM_PDU_E_BITS) +#define RLC_AM_PDU_POLL_OFFSET (RLC_AM_PDU_FI_OFFSET + RLC_AM_PDU_FI_BITS) +#define RLC_AM_PDU_RF_OFFSET (RLC_AM_PDU_POLL_OFFSET + RLC_AM_PDU_POLL_BITS) +#define RLC_AM_PDU_D_C_OFFSET (RLC_AM_PDU_RF_OFFSET + RLC_AM_PDU_RF_BITS) + +#define RLC_AM_PDU_GET_FI_START(px) (RLC_GET_BIT((px),RLC_AM_PDU_FI_OFFSET + 1)) +#define RLC_AM_PDU_GET_FI_END(px) (RLC_GET_BIT((px),RLC_AM_PDU_FI_OFFSET)) + +#define RLC_AM_PDU_GET_LI(x,offset) (((x) >> (offset)) & RLC_AM_LI_MASK) +#define RLC_AM_PDU_SET_LI(x,li,offset) ((x) |= (((li) & RLC_AM_LI_MASK) << (offset))) + +#define RLC_AM_PDU_SET_E(px) (RLC_SET_BIT((px),RLC_AM_PDU_E_OFFSET)) +#define RLC_AM_PDU_SET_D_C(px) (RLC_SET_BIT((px),RLC_AM_PDU_D_C_OFFSET)) +#define RLC_AM_PDU_SET_RF(px) (RLC_SET_BIT((px),RLC_AM_PDU_RF_OFFSET)) +#define RLC_AM_PDU_SET_POLL(px) (RLC_SET_BIT((px),RLC_AM_PDU_POLL_OFFSET)) +#define RLC_AM_PDU_CLEAR_POLL(px) (RLC_CLEAR_BIT((px),RLC_AM_PDU_POLL_OFFSET)) + +#define RLC_AM_PDU_SEGMENT_SO_LENGTH 15 +#define RLC_AM_PDU_SEGMENT_SO_BYTES 2 +#define RLC_AM_PDU_SEGMENT_SO_OFFSET 0 +#define RLC_AM_PDU_LSF_OFFSET (RLC_AM_PDU_SEGMENT_SO_OFFSET + RLC_AM_PDU_SEGMENT_SO_LENGTH) + +#define RLC_AM_PDU_SET_LSF(px) (RLC_SET_BIT((px),RLC_AM_PDU_LSF_OFFSET)) + +#define RLC_AM_HEADER_LI_LENGTH(li) ((li) + ((li)>>1) + ((li)&1)) +#define RLC_AM_PDU_SEGMENT_HEADER_SIZE(numLis) (RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE + RLC_AM_HEADER_LI_LENGTH(numLis)) + +/* STATUS PDU */ +#define RLC_AM_STATUS_PDU_CPT_STATUS 0 + +#define RLC_AM_STATUS_PDU_CPT_OFFSET 4 +#define RLC_AM_STATUS_PDU_CPT_LENGTH 3 + +#define RLC_AM_STATUS_PDU_ACK_SN_OFFSET 2 + +#define RLC_AM_STATUS_PDU_SO_LENGTH 15 + +#define RLC_AM_STATUS_PDU_SO_END_ALL_BYTES 0x7FFF + + +/* Uplink STATUS PDU trigger events */ +#define RLC_AM_STATUS_NOT_TRIGGERED 0 +#define RLC_AM_STATUS_TRIGGERED_POLL 0x01 /* Status Report is triggered by a received poll */ +#define RLC_AM_STATUS_TRIGGERED_T_REORDERING 0x02 /* Status Report is triggered by Timer Reordering Expiry */ +#define RLC_AM_STATUS_TRIGGERED_DELAYED 0x10 /* Status is delayed until SN(receivedPoll) < VR(MS) */ +#define RLC_AM_STATUS_PROHIBIT 0x20 /* TimerStatusProhibit still running */ +#define RLC_AM_STATUS_NO_TX_MASK (RLC_AM_STATUS_PROHIBIT | RLC_AM_STATUS_TRIGGERED_DELAYED) + +/* Status triggered (bit 5-7) will be concatenated with Poll triggered (bit 0-4) for RLCdec. RLC_AM_STATUS_TRIGGERED_DELAYED is not recorded. */ +#define RLC_AM_SET_STATUS(x,event) (RLC_SET_EVENT(x,event)) +#define RLC_AM_GET_STATUS(x,event) (RLC_GET_EVENT(x,event)) +#define RLC_AM_CLEAR_STATUS(x,event) (RLC_CLEAR_EVENT(x,event)) +#define RLC_AM_CLEAR_ALL_STATUS(x) ((x) = (RLC_AM_STATUS_NOT_TRIGGERED)) + + +#endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h old mode 100755 new mode 100644 index 15bba038ea..1b6d837565 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_entity.h * \brief This file defines the RLC AM variables stored in a struct called rlc_am_entity_t. * \author GAUTHIER Lionel @@ -64,7 +57,6 @@ typedef struct rlc_am_entity_s { boolean_t is_data_plane; /*!< \brief To know if the RLC belongs to a data radio bearer or a signalling radio bearer, for statistics and trace purpose. */ rlc_buffer_occupancy_t sdu_buffer_occupancy; /*!< \brief Number of bytes of unsegmented SDUs. */ - rlc_buffer_occupancy_t retransmission_buffer_occupancy; /*!< \brief Number of bytes of PDUs in retransmission buffer waiting for a ACK. */ rlc_buffer_occupancy_t status_buffer_occupancy; /*!< \brief Number of bytes of control PDUs waiting for transmission. */ rlc_am_control_pdu_info_t control_pdu_info; @@ -76,17 +68,14 @@ typedef struct rlc_am_entity_s { pthread_mutex_t lock_input_sdus; rlc_am_tx_sdu_management_t *input_sdus; /*!< \brief Input SDU buffer (for SDUs coming from upper layers). */ signed int nb_sdu; /*!< \brief Total number of valid rlc_am_tx_sdu_management_t in input_sdus[]. */ - signed int nb_sdu_no_segmented; /*!< \brief Total number of SDUs not segmented and partially segmented. */ + signed int nb_sdu_no_segmented; /*!< \brief Total number of SDUs not segmented and partially segmented. nb_sdu_no_segmented = next_sdu_index - current_sdu_index */ signed int next_sdu_index; /*!< \brief Next SDU index in input_sdus array where for a new incoming SDU. */ - signed int current_sdu_index; /*!< \brief Current SDU index in input_sdus array to be segmented. */ + signed int current_sdu_index; /*!< \brief Current SDU index in input_sdus array to be segmented which is not segmented or partially segmented. */ - rlc_am_tx_data_pdu_management_t *pdu_retrans_buffer; /*!< \brief Retransmission buffer. */ + rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer; /*!< \brief Transmission PDU data buffer. Used also for retransmissions */ signed int retrans_num_pdus; /*!< \brief Number of PDUs in the retransmission buffer. */ - signed int retrans_num_bytes; /*!< \brief Number of bytes in the retransmission buffer. */ - signed int retrans_num_bytes_to_retransmit; /*!< \brief Number of bytes in the retransmission buffer to be retransmitted. */ - unsigned int num_nack_so; /*!< \brief Number of segment offsets asked to be retransmitted by peer RLC entity. */ - unsigned int num_nack_sn; /*!< \brief Number of segment asked to be retransmitted by peer RLC entity. */ + signed int retrans_num_bytes_to_retransmit; /*!< \brief Number of bytes in the retransmission buffer to be retransmitted. Only payload is taken into account */ boolean_t force_poll; /*!< \brief force poll due to t_poll_retransmit time-out. */ //--------------------------------------------------------------------- @@ -144,7 +133,7 @@ typedef struct rlc_am_entity_s { //----------------------------- uint16_t max_retx_threshold; /*!< \brief This parameter is used by the transmitting side of each AM RLC entity to limit the number of retransmissions of an AMD PDU. */ uint16_t poll_pdu; /*!< \brief This parameter is used by the transmitting side of each AM RLC entity to trigger a poll for every pollPDU PDUs. */ - uint16_t poll_byte; /*!< \brief This parameter is used by the transmitting side of each AM RLC entity to trigger a poll for every pollByte bytes. */ + uint32_t poll_byte; /*!< \brief This parameter is used by the transmitting side of each AM RLC entity to trigger a poll for every pollByte bytes. */ //--------------------------------------------------------------------- // STATISTICS @@ -183,14 +172,14 @@ typedef struct rlc_am_entity_s { //--------------------------------------------------------------------- // OUTPUTS //--------------------------------------------------------------------- - sdu_size_t nb_bytes_requested_by_mac; /*!< \brief Number of bytes requested by lower layer for next transmission. */ + sdu_size_t nb_bytes_requested_by_mac; /*!< \brief Number of remaining bytes available for transmission of any RLC PDU indicated by lower layer */ list_t pdus_to_mac_layer; /*!< \brief PDUs buffered for transmission to MAC layer. */ list_t control_pdu_list; /*!< \brief Control PDUs buffered for transmission to MAC layer. */ - rlc_sn_t first_retrans_pdu_sn; /*!< \brief Lowest sequence number of PDU to be retransmitted. */ list_t segmentation_pdu_list; /*!< \brief List of "freshly" segmented PDUs. */ - boolean_t status_requested; /*!< \brief Status requested by peer. */ - frame_t last_frame_status_indication; /*!< \brief The last frame number a MAC status indication has been received by RLC. */ + uint8_t status_requested; /*!< \brief Status bitmap requested by peer. */ + rlc_sn_t sn_status_triggered_delayed; /*!< \brief SN of the last received poll for which Status is delayed until SN is out of Rx Window. */ + uint32_t last_absolute_subframe_status_indication; /*!< \brief The last absolute subframe number a MAC status indication has been received by RLC. */ //----------------------------- // buffer occupancy measurements sent to MAC //----------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c old mode 100755 new mode 100644 index 8bffde184e..a133ce0992 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*************************************************************************** rlc_am_in_sdu.c - ------------------- @@ -48,21 +41,28 @@ void rlc_am_free_in_sdu( const unsigned int index_in_bufferP) { if (index_in_bufferP <= RLC_AM_SDU_CONTROL_BUFFER_SIZE) { + /* BugFix: SDU shall have been already freed during initial PDU segmentation or concatenation !! */ + AssertFatal(rlcP->input_sdus[index_in_bufferP].mem_block == NULL, "RLC AM Tx SDU Conf: Data Part is not empty index=%d LcId=%d\n", + index_in_bufferP,rlcP->channel_id); + /* if (rlcP->input_sdus[index_in_bufferP].mem_block != NULL) { - free_mem_block(rlcP->input_sdus[index_in_bufferP].mem_block); + free_mem_block(rlcP->input_sdus[index_in_bufferP].mem_block, __func__); rlcP->input_sdus[index_in_bufferP].mem_block = NULL; rlcP->nb_sdu_no_segmented -= 1; rlcP->input_sdus[index_in_bufferP].sdu_remaining_size = 0; } + */ rlcP->nb_sdu -= 1; memset(&rlcP->input_sdus[index_in_bufferP], 0, sizeof(rlc_am_tx_sdu_management_t)); rlcP->input_sdus[index_in_bufferP].flags.transmitted_successfully = 1; + // case when either one SDU needs to be removed from segmentation or SDU buffer is full if (rlcP->current_sdu_index == index_in_bufferP) { rlcP->current_sdu_index = (rlcP->current_sdu_index + 1) % RLC_AM_SDU_CONTROL_BUFFER_SIZE; } + // wrapping and reset current_sdu_index to next_sdu_index when all transmitted SDUs have been acknowledged while ((rlcP->current_sdu_index != rlcP->next_sdu_index) && (rlcP->input_sdus[rlcP->current_sdu_index].flags.transmitted_successfully == 1)) { rlcP->current_sdu_index = (rlcP->current_sdu_index + 1) % RLC_AM_SDU_CONTROL_BUFFER_SIZE; @@ -88,7 +88,7 @@ rlc_am_free_in_sdu_data( { if (index_in_bufferP <= RLC_AM_SDU_CONTROL_BUFFER_SIZE) { if (rlcP->input_sdus[index_in_bufferP].mem_block != NULL) { - free_mem_block(rlcP->input_sdus[index_in_bufferP].mem_block); + free_mem_block(rlcP->input_sdus[index_in_bufferP].mem_block, __func__); rlcP->input_sdus[index_in_bufferP].mem_block = NULL; rlcP->input_sdus[index_in_bufferP].sdu_remaining_size = 0; rlcP->nb_sdu_no_segmented -= 1; @@ -107,3 +107,41 @@ rlc_am_in_sdu_is_empty( return 0; } + +// called when PDU is ACKED +//----------------------------------------------------------------------------- +void +rlc_am_pdu_sdu_data_cnf( + const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t* const rlc_pP, + const rlc_sn_t snP) +{ + int pdu_sdu_index; + int sdu_index; + + for (pdu_sdu_index = 0; pdu_sdu_index < rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE].nb_sdus; pdu_sdu_index++) { + sdu_index = rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE].sdus_index[pdu_sdu_index]; + assert(sdu_index >= 0); + assert(sdu_index < RLC_AM_SDU_CONTROL_BUFFER_SIZE); + rlc_pP->input_sdus[sdu_index].nb_pdus_ack += 1; + + if ((rlc_pP->input_sdus[sdu_index].nb_pdus_ack == rlc_pP->input_sdus[sdu_index].nb_pdus) && + (rlc_pP->input_sdus[sdu_index].sdu_remaining_size == 0)) { + #if TEST_RLC_AM + rlc_am_v9_3_0_test_data_conf ( + rlc_pP->module_id, + rlc_pP->rb_id, + rlc_pP->input_sdus[sdu_index].mui, + RLC_SDU_CONFIRM_YES); + #else + rlc_data_conf( + ctxt_pP, + rlc_pP->rb_id, + rlc_pP->input_sdus[sdu_index].mui, + RLC_SDU_CONFIRM_YES, + rlc_pP->is_data_plane); + #endif + rlc_am_free_in_sdu(ctxt_pP, rlc_pP, sdu_index); + } + } +} diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h old mode 100755 new mode 100644 index 111de0416e..43503a1b3a --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_in_sdu.h * \brief This file defines the prototypes of the utility functions manipulating the incoming SDU buffer. * \author GAUTHIER Lionel @@ -84,5 +77,13 @@ protected_rlc_am_in_sdu(void rlc_am_free_in_sdu_data (const protocol_ctxt_t* con * \return 1 if the buffer is empty, else 0. */ protected_rlc_am_in_sdu(signed int rlc_am_in_sdu_is_empty(const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *rlcP);) + +/*! \fn void rlc_am_pdu_sdu_data_cnf(const protocol_ctxt_t* const ctxt_pP,rlc_am_entity_t* const rlc_pP,const rlc_sn_t snP) +* \brief Process SDU cnf of a ACKED PDU for all SDUs concatenated in this PDU. +* \param[in] ctxtP Running context. +* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] snP Sequence number of the PDU. +*/ +protected_rlc_am_in_sdu(void rlc_am_pdu_sdu_data_cnf(const protocol_ctxt_t* const ctxt_pP,rlc_am_entity_t* const rlc_pP,const rlc_sn_t snP);) /** @} */ # endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c old mode 100755 new mode 100644 index 81645f06fe..01a635656e --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c @@ -1,36 +1,27 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_INIT_C 1 -#ifdef USER_MODE #include -#endif //----------------------------------------------------------------------------- #include "rlc_am.h" #include "LAYER2/MAC/extern.h" @@ -58,16 +49,16 @@ rlc_am_init( pthread_mutex_init(&rlc_pP->lock_input_sdus, NULL); rlc_pP->input_sdus = calloc(1, RLC_AM_SDU_CONTROL_BUFFER_SIZE*sizeof(rlc_am_tx_sdu_management_t)); //#warning "cast the rlc retrans buffer to uint32" - // rlc_pP->pdu_retrans_buffer = calloc(1, (uint16_t)((unsigned int)RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE*(unsigned int)sizeof(rlc_am_tx_data_pdu_management_t))); - rlc_pP->pdu_retrans_buffer = calloc(1, (uint32_t)((unsigned int)RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE*(unsigned int)sizeof( + // rlc_pP->tx_data_pdu_buffer = calloc(1, (uint16_t)((unsigned int)RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE*(unsigned int)sizeof(rlc_am_tx_data_pdu_management_t))); + rlc_pP->tx_data_pdu_buffer = calloc(1, (uint32_t)((unsigned int)RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE*(unsigned int)sizeof( rlc_am_tx_data_pdu_management_t))); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[AM INIT] input_sdus[] = %p element size=%d\n", + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[AM INIT] input_sdus[] = %p element size=%zu\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->input_sdus, sizeof(rlc_am_tx_sdu_management_t)); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[AM INIT] pdu_retrans_buffer[] = %p element size=%d\n", + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[AM INIT] tx_data_pdu_buffer[] = %p element size=%zu\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->pdu_retrans_buffer, + rlc_pP->tx_data_pdu_buffer, sizeof(rlc_am_tx_data_pdu_management_t)); // TX state variables @@ -81,12 +72,12 @@ rlc_am_init( // RX state variables //rlc_pP->vr_r = 0; rlc_pP->vr_mr = rlc_pP->vr_r + RLC_AM_WINDOW_SIZE; - //rlc_pP->vr_x = 0; + rlc_pP->vr_x = RLC_SN_UNDEFINED; //rlc_pP->vr_ms = 0; //rlc_pP->vr_h = 0; + rlc_pP->sn_status_triggered_delayed = RLC_SN_UNDEFINED; - rlc_pP->last_frame_status_indication = 123456; // any value > 1 - rlc_pP->first_retrans_pdu_sn = -1; + rlc_pP->last_absolute_subframe_status_indication = 0xFFFFFFFF; // any value > 1 rlc_pP->initialized = TRUE; } @@ -135,12 +126,13 @@ rlc_am_reestablish( // RX state variables rlc_pP->vr_r = 0; rlc_pP->vr_mr = rlc_pP->vr_r + RLC_AM_WINDOW_SIZE; - rlc_pP->vr_x = 0; + rlc_pP->vr_x = RLC_SN_UNDEFINED; rlc_pP->vr_ms = 0; rlc_pP->vr_h = 0; + rlc_pP->sn_status_triggered_delayed = RLC_SN_UNDEFINED; + rlc_pP->status_requested = RLC_AM_STATUS_NOT_TRIGGERED; - rlc_pP->last_frame_status_indication = 123456; // any value > 1 - rlc_pP->first_retrans_pdu_sn = -1; + rlc_pP->last_absolute_subframe_status_indication = 0xFFFFFFFF; // any value > 1 rlc_pP->initialized = TRUE; @@ -159,7 +151,7 @@ rlc_am_cleanup( if (rlc_pP->output_sdu_in_construction != NULL) { - free_mem_block(rlc_pP->output_sdu_in_construction); + free_mem_block(rlc_pP->output_sdu_in_construction, __func__); rlc_pP->output_sdu_in_construction = NULL; } @@ -168,7 +160,7 @@ rlc_am_cleanup( if (rlc_pP->input_sdus != NULL) { for (i=0; i < RLC_AM_SDU_CONTROL_BUFFER_SIZE; i++) { if (rlc_pP->input_sdus[i].mem_block != NULL) { - free_mem_block(rlc_pP->input_sdus[i].mem_block); + free_mem_block(rlc_pP->input_sdus[i].mem_block, __func__); rlc_pP->input_sdus[i].mem_block = NULL; } } @@ -179,16 +171,16 @@ rlc_am_cleanup( pthread_mutex_destroy(&rlc_pP->lock_input_sdus); - if (rlc_pP->pdu_retrans_buffer != NULL) { + if (rlc_pP->tx_data_pdu_buffer != NULL) { for (i=0; i < RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE; i++) { - if (rlc_pP->pdu_retrans_buffer[i].mem_block != NULL) { - free_mem_block(rlc_pP->pdu_retrans_buffer[i].mem_block); - rlc_pP->pdu_retrans_buffer[i].mem_block = NULL; + if (rlc_pP->tx_data_pdu_buffer[i % RLC_AM_WINDOW_SIZE].mem_block != NULL) { + free_mem_block(rlc_pP->tx_data_pdu_buffer[i % RLC_AM_WINDOW_SIZE].mem_block, __func__); + rlc_pP->tx_data_pdu_buffer[i % RLC_AM_WINDOW_SIZE].mem_block = NULL; } } - free(rlc_pP->pdu_retrans_buffer); - rlc_pP->pdu_retrans_buffer = NULL; + free(rlc_pP->tx_data_pdu_buffer); + rlc_pP->tx_data_pdu_buffer = NULL; } memset(rlc_pP, 0, sizeof(rlc_am_entity_t)); @@ -253,10 +245,11 @@ rlc_am_set_debug_infos( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlc_pP, const srb_flag_t srb_flagP, - const rb_id_t rb_idP) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP) { - rlc_pP->rb_id = rb_idP; + rlc_pP->channel_id = chan_idP; if (srb_flagP) { rlc_pP->is_data_plane = 0; diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h old mode 100755 new mode 100644 index ed2f7f2936..2ee7d040ab --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_init.h * \brief This file defines the prototypes of the functions initializing a RLC AM protocol instance. * \author GAUTHIER Lionel @@ -112,13 +105,15 @@ public_rlc_am_init( void rlc_am_configure(const protocol_ctxt_t* const ctxtP, const uint32_t t_reorderingP, const uint32_t t_status_prohibitP);) + /*! \fn void rlc_am_set_debug_infos(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, const srb_flag_t srb_flagP, const rb_id_t rb_idP) * \brief Set informations that will be displayed in traces, helping the debug process. * \param[in] ctxtP Running context. * \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] srb_flagP Flag to indicate signalling radio bearer (1) or data radio bearer (0). * \param[in] rb_idP Radio bearer identifier. +* \param[in] chan_idP Transport channel identifier. */ -public_rlc_am_init( void rlc_am_set_debug_infos(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, const srb_flag_t srb_flagP, const rb_id_t rb_idP);) +public_rlc_am_init( void rlc_am_set_debug_infos(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, const srb_flag_t srb_flagP, const rb_id_t rb_idP, const logical_chan_id_t chan_idP);) /** @} */ #endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h old mode 100755 new mode 100644 index 7f3cc6e31f..4690bba42e --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_proto_extern.h @@ -1,28 +1,21 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c old mode 100755 new mode 100644 index 2581437f91..d0b5b52395 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_REASSEMBLY_C 1 #include "platform_types.h" @@ -62,7 +55,7 @@ rlc_am_reassembly ( lengthP); if (rlc_pP->output_sdu_in_construction == NULL) { - rlc_pP->output_sdu_in_construction = get_free_mem_block (RLC_SDU_MAX_SIZE); + rlc_pP->output_sdu_in_construction = get_free_mem_block (RLC_SDU_MAX_SIZE, __func__); rlc_pP->output_sdu_size_to_write = 0; assert(rlc_pP->output_sdu_in_construction != NULL); } @@ -98,7 +91,7 @@ rlc_am_send_sdu ( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t * const rlc_pP) { -# if TRACE_RLC_UM_PDU +# if TRACE_RLC_AM_PDU char message_string[7000]; size_t message_string_size = 0; #if ENABLE_ITTI @@ -204,7 +197,7 @@ rlc_am_send_sdu ( LOG_E(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND_SDU] ERROR SIZE <= 0 ... DO NOTHING, SET SDU SIZE TO 0\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); //msg("[RLC_AM][MOD %d] Freeing mem_block ...\n", rlc_pP->module_id); - //free_mem_block (rlc_pP->output_sdu_in_construction); + //free_mem_block (rlc_pP->output_sdu_in_construction, __func__); AssertFatal(3==4, PROTOCOL_RLC_AM_CTXT_FMT" SEND SDU REQUESTED %d bytes", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), @@ -219,7 +212,8 @@ void rlc_am_reassemble_pdu( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t * const rlc_pP, - mem_block_t * const tb_pP) + mem_block_t * const tb_pP, + boolean_t free_rlc_pdu) { int i,j; @@ -274,11 +268,9 @@ rlc_am_reassemble_pdu( //} break; -#if USER_MODE default: assert(0 != 0); -#endif } } else { switch (pdu_info->fi) { @@ -388,21 +380,17 @@ rlc_am_reassemble_pdu( if (pdu_info->hidden_size > 0) { // normally should always be > 0 but just for help debug // data is already ok, done by last loop above rlc_am_reassembly (ctxt_pP, rlc_pP, &pdu_info->payload[j], pdu_info->hidden_size); - } else { -#if USER_MODE - //assert (5!=5); -#endif } //rlc_pP->reassembly_missing_sn_detected = 0; break; -#if USER_MODE default: assert(1 != 1); -#endif } } - free_mem_block(tb_pP); + if (free_rlc_pdu) { + free_mem_block(tb_pP, __func__); + } } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h old mode 100755 new mode 100644 index c5fbc9edea..82148a4a37 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_reassembly.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_reassembly.h * \brief This file defines the prototypes of the functions dealing with the reassembly of segments. * \author GAUTHIER Lionel @@ -79,13 +72,14 @@ private_rlc_am_reassembly( void rlc_am_reassembly (const protocol_ctxt_t* co */ private_rlc_am_reassembly( void rlc_am_send_sdu (const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP);) -/*! \fn void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, const mem_block_t* const tb_pP) +/*! \fn void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, const mem_block_t* const tb_pP,boolean_t free_rlc_pdu) * \brief Reassembly a RLC AM PDU, depending of the content of this PDU, data will be reassemblied to the current output SDU, the current will be sent to higher layers or not, after or before the reassembly, or no send of SDU will be triggered, depending on FI field in PDU header. * \param[in] ctxtP Running context. * \param[in] rlc_pP RLC AM protocol instance pointer. * \param[in] tb_pP RLC AM PDU embedded in a mem_block_t. +* \param[in] free_rlc_pdu Flag for freeing RLC AM PDU after reassembly. */ -protected_rlc_am_reassembly( void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, mem_block_t* const tb_pP);) +protected_rlc_am_reassembly( void rlc_am_reassemble_pdu(const protocol_ctxt_t* const ctxtP, rlc_am_entity_t * const rlc_pP, mem_block_t* const tb_pP,boolean_t free_rlc_pdu);) /** @} */ #endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c old mode 100755 new mode 100644 index f41b96653c..b1facdfb02 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_RECEIVER_C 1 #include "platform_types.h" @@ -38,6 +31,7 @@ #include "LAYER2/MAC/extern.h" #include "UTIL/LOG/log.h" + //----------------------------------------------------------------------------- signed int rlc_am_get_data_pdu_infos( @@ -47,14 +41,15 @@ rlc_am_get_data_pdu_infos( int16_t total_sizeP, rlc_am_pdu_info_t* pdu_info_pP) { - memset(pdu_info_pP, 0, sizeof (rlc_am_pdu_info_t)); + memset(pdu_info_pP, 0, sizeof (rlc_am_pdu_info_t)); - int16_t sum_li = 0; - pdu_info_pP->d_c = header_pP->b1 >> 7; - pdu_info_pP->num_li = 0; + int16_t sum_li = 0; + pdu_info_pP->d_c = header_pP->b1 >> 7; + pdu_info_pP->num_li = 0; - if (pdu_info_pP->d_c) { + AssertFatal (pdu_info_pP->d_c != 0, "RLC AM Rx PDU Data D/C Header Error LcId=%d\n", rlc_pP->channel_id); + pdu_info_pP->rf = (header_pP->b1 >> 6) & 0x01; pdu_info_pP->p = (header_pP->b1 >> 5) & 0x01; pdu_info_pP->fi = (header_pP->b1 >> 3) & 0x03; @@ -124,12 +119,6 @@ rlc_am_get_data_pdu_infos( } return 0; - } else { - LOG_W(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[GET DATA PDU INFO] SN %04d ERROR CONTROL PDU ", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - pdu_info_pP->sn); - return -1; - } } //----------------------------------------------------------------------------- void @@ -188,26 +177,22 @@ rlc_am_rx_update_vr_ms( do { pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; - if (((rlc_am_rx_pdu_management_t*)(cursor_p->data))->all_segments_received == 0) { + if ((((rlc_am_rx_pdu_management_t*)(cursor_p->data))->all_segments_received == 0) || + (rlc_pP->vr_ms != pdu_info_cursor_p->sn)) { + #if TRACE_RLC_AM_RX LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[UPDATE VR(MS)] UPDATED VR(MS) %04d -> %04d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->vr_ms, pdu_info_cursor_p->sn); #endif - rlc_pP->vr_ms = pdu_info_cursor_p->sn; + return; } + rlc_pP->vr_ms = RLC_AM_NEXT_SN(pdu_info_cursor_p->sn); cursor_p = cursor_p->next; - } while (cursor_p != NULL); + } while ((cursor_p != NULL) && (rlc_pP->vr_ms != rlc_pP->vr_h)); -#if TRACE_RLC_AM_RX - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[UPDATE VR(MS)] UPDATED VR(MS) %04d -> %04d\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->vr_ms, - (pdu_info_cursor_p->sn + 1) & RLC_AM_SN_MASK); -#endif - rlc_pP->vr_ms = (pdu_info_cursor_p->sn + 1) & RLC_AM_SN_MASK; } } // assumed the sn of the tb_p is equal to VR(R) @@ -329,34 +314,30 @@ rlc_am_receive_process_data_pdu ( // - discard the duplicate byte segments. rlc_am_pdu_info_t* pdu_info_p = &((rlc_am_rx_pdu_management_t*)(tb_pP->data))->pdu_info; rlc_am_pdu_sn_10_t* rlc_am_pdu_sn_10_p = (rlc_am_pdu_sn_10_t*)first_byte_pP; + rlc_am_rx_pdu_status_t pdu_status = RLC_AM_DATA_PDU_STATUS_OK; + boolean_t reassemble = false; if (rlc_am_get_data_pdu_infos(ctxt_pP,rlc_pP, rlc_am_pdu_sn_10_p, tb_size_in_bytesP, pdu_info_p) >= 0) { ((rlc_am_rx_pdu_management_t*)(tb_pP->data))->all_segments_received = 0; - if (rlc_am_in_rx_window(ctxt_pP, rlc_pP, pdu_info_p->sn)) { + if (RLC_AM_SN_IN_WINDOW(pdu_info_p->sn, rlc_pP->vr_r)) { - if (pdu_info_p->p) { - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] POLL BIT SET, STATUS REQUESTED:\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); - rlc_pP->status_requested = 1; - } - - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] VR(R) %04d VR(H) %04d VR(MR) %04d VR(MS) %04d VR(X) %04d\n", + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SN=%04d] VR(R) %04d VR(H) %04d VR(MR) %04d VR(MS) %04d VR(X) %04d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + pdu_info_p->sn, rlc_pP->vr_r, rlc_pP->vr_h, rlc_pP->vr_mr, rlc_pP->vr_ms, rlc_pP->vr_x); - if (rlc_am_rx_list_insert_pdu(ctxt_pP, rlc_pP,tb_pP) < 0) { + pdu_status = rlc_am_rx_list_check_duplicate_insert_pdu(ctxt_pP, rlc_pP,tb_pP); + if (pdu_status != RLC_AM_DATA_PDU_STATUS_OK) { rlc_pP->stat_rx_data_pdu_dropped += 1; rlc_pP->stat_rx_data_bytes_dropped += tb_size_in_bytesP; - free_mem_block (tb_pP); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] PDU DISCARDED, STATUS REQUESTED:\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); - rlc_pP->status_requested = 1; + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] PDU DISCARDED CAUSE=%d SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_status,pdu_info_p->sn); #if RLC_STOP_ON_LOST_PDU AssertFatal( 0 == 1, PROTOCOL_RLC_AM_CTXT_FMT" LOST PDU DETECTED\n", @@ -401,12 +382,15 @@ rlc_am_receive_process_data_pdu ( rlc_am_rx_list_display(rlc_pP, "rlc_am_receive_process_data_pdu AFTER INSERTION "); #endif - if (rlc_am_sn_gte_vr_h(ctxt_pP, rlc_pP, pdu_info_p->sn) > 0) { - rlc_pP->vr_h = (pdu_info_p->sn + 1) & RLC_AM_SN_MASK; + /* 1) Update vrH if sn >= vrH */ + if (RLC_AM_DIFF_SN(pdu_info_p->sn,rlc_pP->vr_r) >= RLC_AM_DIFF_SN(rlc_pP->vr_h,rlc_pP->vr_r)) + { + rlc_pP->vr_h = RLC_AM_NEXT_SN(pdu_info_p->sn); } rlc_am_rx_check_all_byte_segments(ctxt_pP, rlc_pP, tb_pP); + /* 2) Reordering Window Processing: Update vr_ms if sn = vr_ms and all bytes received for sn */ if ((pdu_info_p->sn == rlc_pP->vr_ms) && (((rlc_am_rx_pdu_management_t*)(tb_pP->data))->all_segments_received)) { rlc_am_rx_update_vr_ms(ctxt_pP, rlc_pP, tb_pP); } @@ -417,38 +401,114 @@ rlc_am_receive_process_data_pdu ( rlc_pP->vr_mr = (rlc_pP->vr_r + RLC_AM_WINDOW_SIZE) & RLC_AM_SN_MASK; } - rlc_am_rx_list_reassemble_rlc_sdus(ctxt_pP, rlc_pP); + reassemble = rlc_am_rx_check_vr_reassemble(ctxt_pP, rlc_pP); + //TODO : optimization : check whether a reassembly is needed by looking at LI, FI, SO, etc... + } - if (rlc_pP->t_reordering.running) { - if ((rlc_pP->vr_x == rlc_pP->vr_r) || ((rlc_am_in_rx_window(ctxt_pP, rlc_pP, pdu_info_p->sn) == 0) && (rlc_pP->vr_x != rlc_pP->vr_mr))) { + //FNA: fix check VrX out of receiving window + if ((rlc_pP->t_reordering.running) || ((rlc_pP->t_reordering.ms_duration == 0) && (rlc_pP->vr_x != RLC_SN_UNDEFINED))) { + if ((rlc_pP->vr_x == rlc_pP->vr_r) || (!(RLC_AM_SN_IN_WINDOW(rlc_pP->vr_x, rlc_pP->vr_r)) && (rlc_pP->vr_x != rlc_pP->vr_mr))) { rlc_am_stop_and_reset_timer_reordering(ctxt_pP, rlc_pP); + rlc_pP->vr_x = RLC_SN_UNDEFINED; } } if (!(rlc_pP->t_reordering.running)) { if (rlc_pP->vr_h != rlc_pP->vr_r) { // - if VR (H) > VR(R) translated to - if VR (H) != VR(R) - rlc_am_start_timer_reordering(ctxt_pP, rlc_pP); rlc_pP->vr_x = rlc_pP->vr_h; + if (rlc_pP->t_reordering.ms_duration != 0) { + rlc_am_start_timer_reordering(ctxt_pP, rlc_pP); + } + else { + /* specific case for no timer reordering configured */ + /* reordering window directly advances with vrH */ + rlc_pP->vr_ms = rlc_pP->vr_h; + + /* Trigger a Status and clear any existing Delay Flag */ + RLC_AM_SET_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_TRIGGERED_T_REORDERING); + RLC_AM_CLEAR_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_TRIGGERED_DELAYED); + rlc_pP->sn_status_triggered_delayed = RLC_SN_UNDEFINED; + } } } } - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] VR(R) %04d VR(H) %04d VR(MS) %04d VR(MR) %04d\n", + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SN=%04d] NEW VR(R) %04d VR(H) %04d VR(MS) %04d VR(MR) %04d VR(X) %04d reassemble=%d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + pdu_info_p->sn, rlc_pP->vr_r, rlc_pP->vr_h, rlc_pP->vr_ms, - rlc_pP->vr_mr); + rlc_pP->vr_mr, + rlc_pP->vr_x, + reassemble); } else { rlc_pP->stat_rx_data_pdu_out_of_window += 1; rlc_pP->stat_rx_data_bytes_out_of_window += tb_size_in_bytesP; - free_mem_block (tb_pP); - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] PDU OUT OF RX WINDOW, DISCARDED, STATUS REQUESTED:\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); - rlc_pP->status_requested = 1; + pdu_status = RLC_AM_DATA_PDU_STATUS_SN_OUTSIDE_WINDOW; + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] PDU OUT OF RX WINDOW, DISCARDED, SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_info_p->sn); } + + /* 3) Check for triggering a Tx Status PDU if a poll is received or if a pending status was delayed */ + if ((pdu_info_p->p) && (pdu_status < RLC_AM_DATA_PDU_STATUS_BUFFER_FULL)) { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] POLL BIT SET, STATUS REQUESTED:\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); + + /* Polling Info Saving for In and Out of Window PDU */ + /* avoid multi status trigger */ + if ((RLC_AM_GET_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_TRIGGERED_DELAYED)) || + !(RLC_AM_GET_STATUS(rlc_pP->status_requested,(RLC_AM_STATUS_TRIGGERED_POLL | RLC_AM_STATUS_TRIGGERED_T_REORDERING)))) + { + RLC_AM_SET_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_TRIGGERED_POLL); + + if ((pdu_status != RLC_AM_DATA_PDU_STATUS_OK) || ((pdu_status == RLC_AM_DATA_PDU_STATUS_OK) && + (!(RLC_AM_SN_IN_WINDOW(pdu_info_p->sn,rlc_pP->vr_r)) || + (RLC_AM_DIFF_SN(pdu_info_p->sn,rlc_pP->vr_r) < RLC_AM_DIFF_SN(rlc_pP->vr_ms,rlc_pP->vr_r))) + ) + ) + { + /* Conditions are met for sending a Status Report */ + /* Then clear Delay Flag and reset its corresponding sn */ + RLC_AM_CLEAR_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_TRIGGERED_DELAYED); + rlc_pP->sn_status_triggered_delayed = RLC_SN_UNDEFINED; + } + else if (rlc_pP->sn_status_triggered_delayed == RLC_SN_UNDEFINED) + { + /* Delay status trigger if pdustatus OK and sn>= vr_ms */ + /* Note: vr_r and vr_ms have been updated */ + RLC_AM_SET_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_TRIGGERED_DELAYED); + rlc_pP->sn_status_triggered_delayed = pdu_info_p->sn; + } + } + } + + /* ReEnable a previously delayed Status Trigger if PDU discarded or */ + /* sn no more in RxWindow due to RxWindow advance or sn < vr_ms */ + if ((RLC_AM_GET_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_TRIGGERED_DELAYED)) && + (pdu_status == RLC_AM_DATA_PDU_STATUS_OK) && + (!(RLC_AM_SN_IN_WINDOW(rlc_pP->sn_status_triggered_delayed,rlc_pP->vr_r)) || + (RLC_AM_DIFF_SN(rlc_pP->sn_status_triggered_delayed,rlc_pP->vr_r) < RLC_AM_DIFF_SN(rlc_pP->vr_ms,rlc_pP->vr_r))) + ) + { + RLC_AM_CLEAR_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_TRIGGERED_DELAYED); + rlc_pP->sn_status_triggered_delayed = RLC_SN_UNDEFINED; + } + + } else { - free_mem_block (tb_pP); + pdu_status = RLC_AM_DATA_PDU_STATUS_HEADER_ERROR; + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] PDU DISCARDED BAD HEADER FORMAT SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_info_p->sn); + } + + if (pdu_status != RLC_AM_DATA_PDU_STATUS_OK) { + /* Discard received block if out of window, duplicate or header error */ + free_mem_block (tb_pP, __func__); + } + else if (reassemble) { + /* Reassemble SDUs */ + rlc_am_rx_list_reassemble_rlc_sdus(ctxt_pP, rlc_pP); } } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h old mode 100755 new mode 100644 index 66e492649d..9d2978b0f8 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_receiver.h * \brief This file defines the prototypes of the functions dealing with the first stage of the receiving process. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c old mode 100755 new mode 100644 index 9c318a0346..9e1db8a95b --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_RETRANSMIT_C 1 //----------------------------------------------------------------------------- @@ -37,12 +30,13 @@ #include "UTIL/LOG/log.h" #include "msc.h" //----------------------------------------------------------------------------- -void rlc_am_nack_pdu ( +boolean_t rlc_am_nack_pdu ( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlc_pP, const rlc_sn_t snP, - const sdu_size_t so_startP, - const sdu_size_t so_endP) + const rlc_sn_t prev_nack_snP, + sdu_size_t so_startP, + sdu_size_t so_endP) { // 5.2.1 Retransmission // ... @@ -57,55 +51,124 @@ void rlc_am_nack_pdu ( // - indicate to upper layers that max retransmission has been reached. - mem_block_t* mb_p = rlc_pP->pdu_retrans_buffer[snP].mem_block; - int pdu_sdu_index; - int sdu_index; + mem_block_t* mb_p = rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE].mem_block; + rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer_p = &rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE]; + //int pdu_sdu_index; + //int sdu_index; + boolean_t status = TRUE; + boolean_t retx_count_increment = FALSE; + sdu_size_t pdu_data_to_retx = 0; if (mb_p != NULL) { - rlc_pP->num_nack_sn += 1; assert(so_startP <= so_endP); - //----------------------------------------- - // allow holes in reports - // it is assumed that hole reports are done in byte offset - // increasing order among calls refering to only one status PDU - // and among time - //----------------------------------------- - if (rlc_pP->pdu_retrans_buffer[snP].last_nack_time != ctxt_pP->frame) { - rlc_pP->pdu_retrans_buffer[snP].last_nack_time = ctxt_pP->frame; - rlc_am_clear_holes(ctxt_pP, rlc_pP, snP); + // Handle full PDU NACK first + if ((so_startP == 0) && (so_endP == 0x7FFF)) { + if ((prev_nack_snP != snP) && (tx_data_pdu_buffer_p->flags.ack == 0) && (tx_data_pdu_buffer_p->flags.max_retransmit == 0)) { + pdu_data_to_retx = tx_data_pdu_buffer_p->payload_size; + /* Increment VtReTxNext if this is the first NACK or if some segments have already been transmitted */ + if ((tx_data_pdu_buffer_p->flags.retransmit == 0) || (tx_data_pdu_buffer_p->nack_so_start)) + { + retx_count_increment = TRUE; + } + + tx_data_pdu_buffer_p->nack_so_start = 0; + tx_data_pdu_buffer_p->num_holes = 0; + tx_data_pdu_buffer_p->retx_hole_index = 0; + tx_data_pdu_buffer_p->nack_so_stop = tx_data_pdu_buffer_p->payload_size - 1; + #if TRACE_RLC_AM_HOLE + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] SN %04d GLOBAL NACK 0->%05d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + snP, + so_stopP); + #endif + assert(tx_data_pdu_buffer_p->nack_so_start < tx_data_pdu_buffer_p->payload_size); + } + else { + status = FALSE; + } + } + else if (tx_data_pdu_buffer_p->flags.max_retransmit == 0) { + // Handle Segment offset + if (so_endP == 0x7FFF) { + so_endP = tx_data_pdu_buffer_p->payload_size - 1; + } + + // Check consistency + if ((so_startP <= so_endP) && (so_endP < tx_data_pdu_buffer_p->payload_size)) { + if (prev_nack_snP != snP) { + /* New NACK_SN with SO */ + /* check whether a new segment is to be placed in Retransmission Buffer, then increment vrReTx */ + if ((tx_data_pdu_buffer_p->flags.retransmit == 0) || (so_startP < tx_data_pdu_buffer_p->nack_so_start)) { + retx_count_increment = TRUE; + } + + tx_data_pdu_buffer_p->num_holes = 1; + tx_data_pdu_buffer_p->retx_hole_index = 0; + tx_data_pdu_buffer_p->hole_so_start[0] = so_startP; + tx_data_pdu_buffer_p->hole_so_stop[0] = so_endP; + tx_data_pdu_buffer_p->nack_so_start = so_startP; + tx_data_pdu_buffer_p->nack_so_stop = so_endP; + pdu_data_to_retx = so_endP - so_startP + 1; + + } + else if ((tx_data_pdu_buffer_p->num_holes) && (tx_data_pdu_buffer_p->num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU)) { + /* New SOStart/SOEnd for the same NACK_SN than before */ + /* check discontinuity */ + if (so_startP > tx_data_pdu_buffer_p->hole_so_stop[tx_data_pdu_buffer_p->num_holes - 1]) { + tx_data_pdu_buffer_p->hole_so_start[tx_data_pdu_buffer_p->num_holes] = so_startP; + tx_data_pdu_buffer_p->hole_so_stop[tx_data_pdu_buffer_p->num_holes] = so_endP; + tx_data_pdu_buffer_p->nack_so_stop = so_endP; + tx_data_pdu_buffer_p->num_holes ++; + pdu_data_to_retx = so_endP - so_startP + 1; + } + else { + status = FALSE; + } + } + else { + status = FALSE; + } + } + else { + status = FALSE; + } + } + else { + status = FALSE; } - if (!((so_startP == 0) && (so_endP == 0x7FFF))) { - rlc_pP->num_nack_so += 1; + if (status) { + tx_data_pdu_buffer_p->flags.nack = 1; + if ((retx_count_increment) && (tx_data_pdu_buffer_p->retx_count == tx_data_pdu_buffer_p->retx_count_next)) { + tx_data_pdu_buffer_p->retx_count_next ++; + } + if (tx_data_pdu_buffer_p->flags.retransmit == 1) { + if (prev_nack_snP != snP) { + /* if first process of this NACK_SN and data already pending for retx */ + rlc_pP->retrans_num_bytes_to_retransmit += (pdu_data_to_retx - tx_data_pdu_buffer_p->retx_payload_size); + tx_data_pdu_buffer_p->retx_payload_size = pdu_data_to_retx; + } + else if (tx_data_pdu_buffer_p->num_holes > 1) { + /* Segment case : SOStart and SOEnd already received for same NACK_SN */ + /* filter case where a NACK_SN is received twice with SO first time and no SO second time */ + rlc_pP->retrans_num_bytes_to_retransmit += pdu_data_to_retx; + tx_data_pdu_buffer_p->retx_payload_size += pdu_data_to_retx; + } + } + else { + tx_data_pdu_buffer_p->flags.retransmit = 1; + rlc_pP->retrans_num_bytes_to_retransmit += pdu_data_to_retx; + tx_data_pdu_buffer_p->retx_payload_size = pdu_data_to_retx; + rlc_pP->retrans_num_pdus ++; + } } - rlc_am_add_hole(ctxt_pP, rlc_pP, snP, so_startP, so_endP); - - if (rlc_pP->first_retrans_pdu_sn < 0) { - rlc_pP->first_retrans_pdu_sn = snP; - } else if (rlc_am_tx_sn1_gt_sn2(ctxt_pP, rlc_pP, rlc_pP->first_retrans_pdu_sn, snP)) { - rlc_pP->first_retrans_pdu_sn = snP; - } - - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[NACK-PDU] NACK PDU SN %04d previous retx_count %d 1ST_RETRANS_PDU %04d\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - snP, - rlc_pP->pdu_retrans_buffer[snP].retx_count, - rlc_pP->first_retrans_pdu_sn); - - rlc_pP->pdu_retrans_buffer[snP].flags.retransmit = 1; - - if (rlc_pP->pdu_retrans_buffer[snP].retx_count == -1) { - rlc_pP->pdu_retrans_buffer[snP].retx_count = 0; - rlc_pP->retrans_num_bytes_to_retransmit += rlc_pP->pdu_retrans_buffer[snP].header_and_payload_size; - } else { - rlc_pP->pdu_retrans_buffer[snP].retx_count += 1; - } - - if (rlc_pP->pdu_retrans_buffer[snP].retx_count >= rlc_pP->max_retx_threshold) { - for (pdu_sdu_index = 0; pdu_sdu_index < rlc_pP->pdu_retrans_buffer[snP].nb_sdus; pdu_sdu_index++) { - sdu_index = rlc_pP->pdu_retrans_buffer[snP].sdus_index[pdu_sdu_index]; + /* TODO: Move this part in UL SCH processing */ +#if 0 + if (rlc_pP->tx_data_pdu_buffer[snP].retx_count >= rlc_pP->max_retx_threshold) { + for (pdu_sdu_index = 0; pdu_sdu_index < rlc_pP->tx_data_pdu_buffer[snP].nb_sdus; pdu_sdu_index++) { + sdu_index = rlc_pP->tx_data_pdu_buffer[snP].sdus_index[pdu_sdu_index]; assert(pdu_sdu_index < RLC_AM_MAX_SDU_IN_PDU); assert(sdu_index < RLC_AM_SDU_CONTROL_BUFFER_SIZE); rlc_pP->input_sdus[sdu_index].nb_pdus_ack += 1; @@ -129,145 +192,62 @@ void rlc_am_nack_pdu ( } } } +#endif } else { LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[NACK-PDU] ERROR NACK MISSING PDU SN %05d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP); - //assert(2==3); + status = FALSE; } + + return status; } //----------------------------------------------------------------------------- void rlc_am_ack_pdu ( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlc_pP, - const rlc_sn_t snP) + const rlc_sn_t snP, + boolean_t free_pdu) { - mem_block_t* mb_p = rlc_pP->pdu_retrans_buffer[snP].mem_block; - int pdu_sdu_index; - int sdu_index; + mem_block_t* mb_p = rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE].mem_block; + rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer = &rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE]; - rlc_pP->pdu_retrans_buffer[snP].flags.retransmit = 0; + tx_data_pdu_buffer->flags.retransmit = 0; - if ((rlc_pP->pdu_retrans_buffer[snP].flags.ack == 0) && (mb_p != NULL)) { - //if (mb_pP != NULL) { - free_mem_block(mb_p); - rlc_pP->pdu_retrans_buffer[snP].mem_block = NULL; + if (mb_p != NULL) { + if (free_pdu) { + free_mem_block(mb_p, __func__); + tx_data_pdu_buffer->mem_block = NULL; LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[ACK-PDU] ACK PDU SN %05d previous retx_count %d \n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP, - rlc_pP->pdu_retrans_buffer[snP].retx_count); - rlc_pP->retrans_num_pdus -= 1; - rlc_pP->retrans_num_bytes -= rlc_pP->pdu_retrans_buffer[snP].header_and_payload_size; - - if (rlc_pP->pdu_retrans_buffer[snP].retx_count >= 0) { - rlc_pP->retrans_num_bytes_to_retransmit -= rlc_pP->pdu_retrans_buffer[snP].header_and_payload_size; + tx_data_pdu_buffer->retx_count); } - for (pdu_sdu_index = 0; pdu_sdu_index < rlc_pP->pdu_retrans_buffer[snP].nb_sdus; pdu_sdu_index++) { - sdu_index = rlc_pP->pdu_retrans_buffer[snP].sdus_index[pdu_sdu_index]; - assert(sdu_index >= 0); - assert(sdu_index < RLC_AM_SDU_CONTROL_BUFFER_SIZE); - rlc_pP->input_sdus[sdu_index].nb_pdus_ack += 1; - - if ((rlc_pP->input_sdus[sdu_index].nb_pdus_ack == rlc_pP->input_sdus[sdu_index].nb_pdus) && - (rlc_pP->input_sdus[sdu_index].sdu_remaining_size == 0)) { -#if TEST_RLC_AM - rlc_am_v9_3_0_test_data_conf ( - rlc_pP->module_id, - rlc_pP->rb_id, - rlc_pP->input_sdus[sdu_index].mui, - RLC_SDU_CONFIRM_YES); -#else - rlc_data_conf( - ctxt_pP, - rlc_pP->rb_id, - rlc_pP->input_sdus[sdu_index].mui, - RLC_SDU_CONFIRM_YES, - rlc_pP->is_data_plane); -#endif - rlc_am_free_in_sdu(ctxt_pP, rlc_pP, sdu_index); - } + if (tx_data_pdu_buffer->retx_payload_size) { + AssertFatal (tx_data_pdu_buffer->flags.ack == 0, + "RLC AM Rx Status Report sn=%d acked twice but is pending for Retx vtA=%d vtS=%d LcId=%d\n", + snP, rlc_pP->vt_a,rlc_pP->vt_s,rlc_pP->channel_id); + rlc_pP->retrans_num_bytes_to_retransmit -= tx_data_pdu_buffer->retx_payload_size; + tx_data_pdu_buffer->retx_payload_size = 0; + tx_data_pdu_buffer->num_holes = 0; + rlc_pP->retrans_num_pdus --; } - // 7.1... - // VT(A) – Acknowledgement state variable - // This state variable holds the value of the SN of the next AMD PDU for which a positive acknowledgment is to be - // received in-sequence, and it serves as the lower edge of the transmitting window. It is initially set to 0, and is updated - // whenever the AM RLC entity receives a positive acknowledgment for an AMD PDU with SN = VT(A). - rlc_pP->pdu_retrans_buffer[snP].flags.ack = 1; - - if (snP == rlc_pP->vt_a) { - //rlc_pP->pdu_retrans_buffer[snP].flags.ack = 1; - do { - memset(&rlc_pP->pdu_retrans_buffer[rlc_pP->vt_a], 0, sizeof(rlc_am_tx_data_pdu_management_t)); - - if (rlc_pP->vt_a == rlc_pP->first_retrans_pdu_sn) { - rlc_pP->first_retrans_pdu_sn = (rlc_pP->vt_a + 1) & RLC_AM_SN_MASK; - } - - rlc_pP->vt_a = (rlc_pP->vt_a + 1) & RLC_AM_SN_MASK; - } while ((rlc_pP->pdu_retrans_buffer[rlc_pP->vt_a].flags.ack == 1) && (rlc_pP->vt_a != rlc_pP->vt_s)); - - - rlc_pP->vt_ms = (rlc_pP->vt_a + RLC_AM_WINDOW_SIZE) & RLC_AM_SN_MASK; - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[ACK-PDU] UPDATED VT(A) %04d VT(MS) %04d VT(S) %04d\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->vt_a, - rlc_pP->vt_ms, - rlc_pP->vt_s); - } - - if (snP == rlc_pP->first_retrans_pdu_sn) { - do { - rlc_pP->first_retrans_pdu_sn = (rlc_pP->first_retrans_pdu_sn + 1) & RLC_AM_SN_MASK; - - if (rlc_pP->pdu_retrans_buffer[rlc_pP->first_retrans_pdu_sn].retx_count >= 0) { - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[ACK-PDU] UPDATED first_retrans_pdu_sn -> %04d\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->first_retrans_pdu_sn); - break; - } - } while (rlc_pP->first_retrans_pdu_sn != rlc_pP->vt_s); - - if (rlc_pP->vt_s == rlc_pP->first_retrans_pdu_sn) { - rlc_pP->first_retrans_pdu_sn = -1; - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[ACK-PDU] UPDATED first_retrans_pdu_sn -> %04d\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->first_retrans_pdu_sn); - } - } } else { LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[ACK-PDU] WARNING ACK PDU SN %05d -> NO PDU TO ACK\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP); if (mb_p != NULL) { - free_mem_block(mb_p); - rlc_pP->pdu_retrans_buffer[snP].mem_block = NULL; - } - - if (rlc_pP->pdu_retrans_buffer[snP].flags.ack > 0) { - if (snP == rlc_pP->vt_a) { - //rlc_pP->pdu_retrans_buffer[snP].flags.ack = 1; - do { - memset(&rlc_pP->pdu_retrans_buffer[rlc_pP->vt_a], 0, sizeof(rlc_am_tx_data_pdu_management_t)); - - if (rlc_pP->vt_a == rlc_pP->first_retrans_pdu_sn) { - rlc_pP->first_retrans_pdu_sn = (rlc_pP->vt_a + 1) & RLC_AM_SN_MASK; - } - - rlc_pP->vt_a = (rlc_pP->vt_a + 1) & RLC_AM_SN_MASK; - } while ((rlc_pP->pdu_retrans_buffer[rlc_pP->vt_a].flags.ack == 1) && (rlc_pP->vt_a != rlc_pP->vt_s)); - - rlc_pP->vt_ms = (rlc_pP->vt_a + RLC_AM_WINDOW_SIZE) & RLC_AM_SN_MASK; - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[ACK-PDU] UPDATED VT(A) %04d VT(MS) %04d VT(S) %04d\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->vt_a, - rlc_pP->vt_ms, - rlc_pP->vt_s); - } + free_mem_block(mb_p, __func__); + tx_data_pdu_buffer->mem_block = NULL; } } + tx_data_pdu_buffer->flags.ack = 1; + tx_data_pdu_buffer->flags.transmitted = 0; + tx_data_pdu_buffer->flags.retransmit = 0; + } //----------------------------------------------------------------------------- mem_block_t* rlc_am_retransmit_get_copy ( @@ -275,27 +255,414 @@ mem_block_t* rlc_am_retransmit_get_copy ( rlc_am_entity_t *const rlc_pP, const rlc_sn_t snP) { - mem_block_t* mb_original_p = rlc_pP->pdu_retrans_buffer[snP].mem_block; + mem_block_t* mb_original_p = rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE].mem_block; - if (mb_original_p != NULL) { + AssertFatal (mb_original_p != NULL, "RLC AM PDU Copy Error: Empty block sn=%d vtA=%d vtS=%d LcId=%d !\n", + snP,rlc_pP->vt_a,rlc_pP->vt_s,rlc_pP->channel_id); - rlc_am_tx_data_pdu_management_t *pdu_mngt = &rlc_pP->pdu_retrans_buffer[snP % RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE]; + rlc_am_tx_data_pdu_management_t *pdu_mngt = &rlc_pP->tx_data_pdu_buffer[snP % RLC_AM_WINDOW_SIZE]; - int size = pdu_mngt->header_and_payload_size + sizeof(struct mac_tb_req); - mem_block_t* mb_copy = get_free_mem_block(size); - memcpy(mb_copy->data, mb_original_p->data, size); + /* We need to allocate a new buffer and copy to it because header content may change for Polling bit */ + int size = pdu_mngt->header_and_payload_size + sizeof(struct mac_tb_req); + mem_block_t* mb_copy = get_free_mem_block(size, __func__); + memcpy(mb_copy->data, mb_original_p->data, size); - rlc_am_pdu_sn_10_t *pdu_p = (rlc_am_pdu_sn_10_t*) (&mb_copy->data[sizeof(struct mac_tb_req)]); - ((struct mac_tb_req*)(mb_copy->data))->data_ptr = (uint8_t*)pdu_p; + rlc_am_pdu_sn_10_t *pdu_p = (rlc_am_pdu_sn_10_t*) (&mb_copy->data[sizeof(struct mac_tb_req)]); + ((struct mac_tb_req*)(mb_copy->data))->data_ptr = (uint8_t*)pdu_p; - pdu_mngt->flags.retransmit = 0; - - rlc_am_pdu_polling(ctxt_pP, rlc_pP, pdu_p, pdu_mngt->payload_size); - return mb_copy; - } else { - return NULL; - } + return mb_copy; } + +//----------------------------------------------------------------------------- +mem_block_t* rlc_am_retransmit_get_am_segment( + const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t *const rlc_pP, + rlc_am_tx_data_pdu_management_t *const pdu_mngt, + sdu_size_t * const payload_sizeP /* in-out*/) +{ + int16_t sdus_segment_size[RLC_AM_MAX_SDU_IN_PDU]; + mem_block_t* mb_original_p = pdu_mngt->mem_block; + mem_block_t* mem_pdu_segment_p = NULL; + uint8_t *pdu_original_header_p = NULL; + uint8_t *pdu_segment_header_p = NULL; + sdu_size_t retx_so_start,retx_so_stop; //starting and ending SO for retransmission in this PDU + rlc_sn_t sn = pdu_mngt->sn; + uint16_t header_so_part; + boolean_t fi_start, fi_end; + uint8_t sdu_index = 0; + uint8_t sdu_segment_index = 0; + uint8_t num_LIs_pdu_segment = pdu_mngt->nb_sdus - 1; + uint8_t li_bit_offset = 4; /* toggle between 0 and 4 */ + uint8_t li_jump_offset = 1; /* toggle between 1 and 2 */ + + + AssertFatal (mb_original_p != NULL, "RLC AM PDU Segment Error: Empty block sn=%d vtA=%d vtS=%d LcId=%d !\n", + sn,rlc_pP->vt_a,rlc_pP->vt_s,rlc_pP->channel_id); + + + AssertFatal (pdu_mngt->payload == mb_original_p->data + sizeof(struct mac_tb_req) + pdu_mngt->header_and_payload_size - pdu_mngt->payload_size, + "RLC AM PDU Segment Error: Inconsistent data pointers p1=%p p2=%p sn = %d total size = %d data size = %d LcId=%d !\n", + pdu_mngt->payload,mb_original_p->data + sizeof(struct mac_tb_req),pdu_mngt->header_and_payload_size,pdu_mngt->payload_size,sn,rlc_pP->channel_id); + + /* Init ReTx Hole list if not configured, ie the whole PDU has to be retransmitted */ + if (pdu_mngt->num_holes == 0) + { + AssertFatal (pdu_mngt->retx_payload_size == pdu_mngt->payload_size,"RLC AM PDU ReTx Segment: Expecting full PDU size ReTxSize=%d DataSize=%d sn=%d vtA=%d vtS=%d LcId=%d !\n", + pdu_mngt->retx_payload_size,pdu_mngt->payload_size,sn,rlc_pP->vt_a,rlc_pP->vt_s,rlc_pP->channel_id); + pdu_mngt->retx_hole_index = 0; + pdu_mngt->hole_so_start[0] = 0; + pdu_mngt->hole_so_stop[0] = pdu_mngt->payload_size - 1; + pdu_mngt->num_holes = 1; + } + + /* Init SO Start and SO Stop */ + retx_so_start = pdu_mngt->hole_so_start[pdu_mngt->retx_hole_index]; + retx_so_stop = pdu_mngt->hole_so_stop[pdu_mngt->retx_hole_index]; + + AssertFatal ((retx_so_start <= retx_so_stop) && (retx_so_stop - retx_so_start + 1 <= pdu_mngt->payload_size), + "RLC AM Tx PDU Segment Data SO Error: retx_so_start=%d retx_so_stop=%d OriginalPDUDataLength=%d sn=%d LcId=%d!\n", + retx_so_start,retx_so_stop,pdu_mngt->payload_size,sn,rlc_pP->channel_id); + + /* Init FI to the same value as original PDU */ + fi_start = (!(RLC_AM_PDU_GET_FI_START(*(pdu_mngt->first_byte)))); + fi_end = (!(RLC_AM_PDU_GET_FI_END(*(pdu_mngt->first_byte)))); + + /* Handle no LI case first */ + if (num_LIs_pdu_segment == 0) + { + /* Bound retx_so_stop to available TBS */ + if (retx_so_stop - retx_so_start + 1 + RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE > rlc_pP->nb_bytes_requested_by_mac) + { + retx_so_stop = retx_so_start + rlc_pP->nb_bytes_requested_by_mac - RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE - 1; + } + + *payload_sizeP = retx_so_stop - retx_so_start + 1; + + mem_pdu_segment_p = get_free_mem_block((*payload_sizeP + RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE + sizeof(struct mac_tb_req)), __func__); + pdu_segment_header_p = (uint8_t *)&mem_pdu_segment_p->data[sizeof(struct mac_tb_req)]; + ((struct mac_tb_req*)(mem_pdu_segment_p->data))->data_ptr = pdu_segment_header_p; + ((struct mac_tb_req*)(mem_pdu_segment_p->data))->tb_size = RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE + *payload_sizeP; + + /* clear all PDU segment */ + memset(pdu_segment_header_p, 0, *payload_sizeP + RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE); + /* copy data part */ + memcpy(pdu_segment_header_p + RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE, pdu_mngt->payload + retx_so_start, *payload_sizeP); + + /* Set FI part to false if SO Start and SO End are different from PDU boundaries */ + if (retx_so_start) + { + fi_start = FALSE; + } + if (retx_so_stop < pdu_mngt->payload_size - 1) + { + fi_end = FALSE; + } + + /* Header content is filled at the end */ + } + else + { + /* Step 1 */ + /* Find the SDU index in the original PDU containing retx_so_start */ + sdu_size_t sdu_size = 0; + sdu_size_t data_size = 0; + *payload_sizeP = 0; + sdu_size_t header_segment_length = RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE; + pdu_original_header_p = pdu_mngt->first_byte + 2; + li_bit_offset = 4; /* toggle between 0 and 4 */ + li_jump_offset = 1; /* toggle between 1 and 2 */ + uint16_t temp_read = ((*pdu_original_header_p) << 8) | (*(pdu_original_header_p + 1)); + + + /* Read first LI */ + sdu_size = RLC_AM_PDU_GET_LI(temp_read,li_bit_offset); + pdu_original_header_p += li_jump_offset; + li_bit_offset ^= 0x4; + li_jump_offset ^= 0x3; + data_size += sdu_size; + sdu_index = 1; + + /* Loop on all original LIs */ + while ((data_size < retx_so_start + 1) && (sdu_index < pdu_mngt->nb_sdus)) + { + if (sdu_index < pdu_mngt->nb_sdus - 1) + { + temp_read = ((*pdu_original_header_p) << 8) | (*(pdu_original_header_p + 1)); + sdu_size = RLC_AM_PDU_GET_LI(temp_read,li_bit_offset); + pdu_original_header_p += li_jump_offset; + li_bit_offset ^= 0x4; + li_jump_offset ^= 0x3; + data_size += sdu_size; + } + else + { + /* if retx_so_start is still not included then set data_size with full original PDU data size */ + /* Set fi_start to FALSE in this case */ + data_size = pdu_mngt->payload_size; + } + sdu_index ++; + } + + if (retx_so_start == data_size) + { + /* Set FI Start if retx_so_start = cumulated data size */ + fi_start = TRUE; + /* there must be at least one SDU more */ + AssertFatal (sdu_index < pdu_mngt->nb_sdus, "RLC AM Tx PDU Segment Error: sdu_index=%d nb_sdus=%d sn=%d LcId=%d !\n", + sdu_index,pdu_mngt->nb_sdus,sn,rlc_pP->channel_id); + if (sdu_index < pdu_mngt->nb_sdus - 1) + { + temp_read = ((*pdu_original_header_p) << 8) | (*(pdu_original_header_p + 1)); + sdu_size = RLC_AM_PDU_GET_LI(temp_read,li_bit_offset); + pdu_original_header_p += li_jump_offset; + li_bit_offset ^= 0x4; + li_jump_offset ^= 0x3; + data_size += sdu_size; + } + else + { + /* It was the last LI, then set data_size to full original PDU size */ + data_size = pdu_mngt->payload_size; + } + /* Go to next SDU */ + sdu_index ++; + } + else if (retx_so_start != 0) + { + /* in all other cases set fi_start to FALSE if it SO Start is not 0 */ + fi_start = FALSE; + } + + /* Set first SDU portion of the segment */ + sdus_segment_size[0] = data_size - retx_so_start; + + /* Check if so end is in the first SDU portion */ + if (sdus_segment_size[0] >= retx_so_stop - retx_so_start + 1) + { + sdus_segment_size[0] = retx_so_stop - retx_so_start + 1; + *payload_sizeP = sdus_segment_size[0]; + num_LIs_pdu_segment = 0; + } + + /* Bound first SDU segment to available TBS if necessary */ + if (sdus_segment_size[0] + RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE >= rlc_pP->nb_bytes_requested_by_mac) + { + sdus_segment_size[0] = rlc_pP->nb_bytes_requested_by_mac - RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE; + *payload_sizeP = sdus_segment_size[0]; + num_LIs_pdu_segment = 0; + } + + + /* Now look for the end if it was not set previously */ + if (*payload_sizeP == 0) + { + sdu_segment_index ++; + while ((sdu_index < pdu_mngt->nb_sdus) && (data_size < retx_so_stop + 1)) + { + if (sdu_index < pdu_mngt->nb_sdus - 1) + { + temp_read = ((*pdu_original_header_p) << 8) | (*(pdu_original_header_p + 1)); + sdu_size = RLC_AM_PDU_GET_LI(temp_read,li_bit_offset); + pdu_original_header_p += li_jump_offset; + li_bit_offset ^= 0x4; + li_jump_offset ^= 0x3; + data_size += sdu_size; + } + else + { + sdu_size = pdu_mngt->payload_size - data_size; + data_size = pdu_mngt->payload_size; + } + + sdus_segment_size[sdu_segment_index] = sdu_size; + sdu_index ++; + sdu_segment_index ++; + } + + + if (data_size > retx_so_stop + 1) + { + sdus_segment_size[sdu_segment_index - 1] = retx_so_stop - (data_size - sdu_size) + 1; + } + + /* Set number of LIs in the segment */ + num_LIs_pdu_segment = sdu_segment_index - 1; + + AssertFatal (num_LIs_pdu_segment <= pdu_mngt->nb_sdus - 1, "RLC AM Tx PDU Segment Data Error: nbLISegment=%d nbLIPDU=%d sn=%d LcId=%d !\n", + num_LIs_pdu_segment,pdu_mngt->nb_sdus - 1,sn,rlc_pP->channel_id); + + /* Bound to available TBS taking into account min PDU segment header*/ + sdu_segment_index = 0; + while ((sdu_segment_index < num_LIs_pdu_segment + 1) && (rlc_pP->nb_bytes_requested_by_mac > *payload_sizeP + RLC_AM_PDU_SEGMENT_HEADER_SIZE(sdu_segment_index))) + { + AssertFatal (sdus_segment_size[sdu_segment_index] > 0, "RLC AM Tx PDU Segment Data Error: EMpty LI index=%d numLISegment=%d numLIPDU=%d PDULength=%d SOStart=%d SOStop=%d sn=%d LcId=%d !\n", + sdu_segment_index,num_LIs_pdu_segment,pdu_mngt->nb_sdus - 1,pdu_mngt->payload_size,retx_so_start,retx_so_stop,sn,rlc_pP->channel_id); + + /* Add next sdu_segment_index to data part */ + if (RLC_AM_PDU_SEGMENT_HEADER_SIZE(sdu_segment_index) + (*payload_sizeP) + sdus_segment_size[sdu_segment_index] <= rlc_pP->nb_bytes_requested_by_mac) + { + (*payload_sizeP) += sdus_segment_size[sdu_segment_index]; + } + else + { + /* bound to available TBS size */ + sdus_segment_size[sdu_segment_index] = rlc_pP->nb_bytes_requested_by_mac - RLC_AM_PDU_SEGMENT_HEADER_SIZE(sdu_segment_index) - (*payload_sizeP); + (*payload_sizeP) += sdus_segment_size[sdu_segment_index]; + } + header_segment_length = RLC_AM_PDU_SEGMENT_HEADER_SIZE(sdu_segment_index); + sdu_segment_index ++; + } + + num_LIs_pdu_segment = sdu_segment_index - 1; + } + + + /* update retx_so_stop */ + retx_so_stop = retx_so_start + (*payload_sizeP) - 1; + + AssertFatal ((retx_so_stop <= pdu_mngt->payload_size - 1) && (retx_so_stop - retx_so_start + 1 < pdu_mngt->payload_size), + "RLC AM Tx PDU Segment Data Error: retx_so_stop=%d OriginalPDUDataLength=%d SOStart=%d SegmentLength=%d numLISegment=%d numLIPDU=%d sn=%d LcId=%d !\n", + retx_so_stop,pdu_mngt->payload_size,retx_so_start,*payload_sizeP,num_LIs_pdu_segment,pdu_mngt->nb_sdus - 1,sn,rlc_pP->channel_id); + + /* init FI End to FALSE if retx_so_stop is not end of PDU */ + if (retx_so_stop != pdu_mngt->payload_size - 1) + { + fi_end = FALSE; + } + + /* Check consistency between sdus_segment_size and payload_sizeP */ + /* And Set FI End if retx_so_stop = cumulated data size and this is not last SDU */ + data_size = 0; + for (int i = 0; i < num_LIs_pdu_segment + 1; i++) + { + data_size += sdus_segment_size[i]; + if ((retx_so_stop == data_size - 1) && (i < num_LIs_pdu_segment)) + { + fi_end = TRUE; + } + } + + AssertFatal (data_size == *payload_sizeP, "RLC AM Tx PDU Segment Data Error: SduSum=%d Data=%d sn=%d LcId=%d !\n", + data_size,*payload_sizeP,sn,rlc_pP->channel_id); + + + + /* Allocation */ + AssertFatal (header_segment_length + *payload_sizeP <= pdu_mngt->header_and_payload_size + 2, "RLC AM PDU Segment Error: Hdr=%d Data=%d Original Hdr+Data =%d sn=%d LcId=%d !\n", + header_segment_length,*payload_sizeP,pdu_mngt->header_and_payload_size,sn,rlc_pP->channel_id); + mem_pdu_segment_p = get_free_mem_block((*payload_sizeP + header_segment_length + sizeof(struct mac_tb_req)), __func__); + pdu_segment_header_p = (uint8_t *)&mem_pdu_segment_p->data[sizeof(struct mac_tb_req)]; + ((struct mac_tb_req*)(mem_pdu_segment_p->data))->data_ptr = pdu_segment_header_p; + ((struct mac_tb_req*)(mem_pdu_segment_p->data))->tb_size = header_segment_length + *payload_sizeP; + + /* clear all PDU segment */ + memset(pdu_segment_header_p, 0, *payload_sizeP + header_segment_length); + /* copy data part */ + memcpy(pdu_segment_header_p + header_segment_length, pdu_mngt->payload + retx_so_start, *payload_sizeP); + } + + /* Last step : update contexts and fill PDU Segment Header */ + if (mem_pdu_segment_p != NULL) + { + /* Update PDU Segment contexts */ + if (*payload_sizeP == pdu_mngt->hole_so_stop[pdu_mngt->retx_hole_index] - pdu_mngt->hole_so_start[pdu_mngt->retx_hole_index] + 1) + { + /* All data in the segment are transmitted : switch to next one */ + pdu_mngt->retx_hole_index ++; + if (pdu_mngt->retx_hole_index < pdu_mngt->num_holes) + { + /* Set min SOStart to the value of next hole : assumption is holes are ordered by increasing SOStart */ + pdu_mngt->nack_so_start = pdu_mngt->hole_so_start[pdu_mngt->retx_hole_index]; + } + else + { + /* no more scheduled Retx: reset values */ + /* Retx size is reset in the calling function */ + pdu_mngt->num_holes = 0; + pdu_mngt->retx_hole_index = 0; + pdu_mngt->nack_so_start = 0; + } + } + else + { + /* not all segment data could be transmitted, just update SoStart */ + pdu_mngt->hole_so_start[pdu_mngt->retx_hole_index] += (*payload_sizeP); + pdu_mngt->nack_so_start = pdu_mngt->hole_so_start[pdu_mngt->retx_hole_index]; + } + + /* Content is supposed to be init with 0 so with FIStart=FIEnd=TRUE */ + RLC_AM_PDU_SET_D_C(*pdu_segment_header_p); + RLC_AM_PDU_SET_RF(*pdu_segment_header_p); + /* Change FI */ + if (!fi_start) + { + // Set to not starting + (*pdu_segment_header_p) |= (1 << (RLC_AM_PDU_FI_OFFSET + 1)); + } + if (!fi_end) + { + // Set to not starting + (*pdu_segment_header_p) |= (1 << (RLC_AM_PDU_FI_OFFSET)); + } + /* Set SN */ + (*pdu_segment_header_p) |= ((sn >> 8) & 0x3); + (*(pdu_segment_header_p + 1)) |= (sn & 0xFF); + + /* Segment Offset */ + header_so_part = retx_so_start; + + /* Last Segment Flag (LSF) */ + if (retx_so_stop == pdu_mngt->payload_size - 1) + { + RLC_AM_PDU_SET_LSF(header_so_part); + } + + /* Store SO bytes */ + * (pdu_segment_header_p + 2) = (header_so_part >> 8) & 0xFF; + * (pdu_segment_header_p + 3) = header_so_part & 0xFF; + + /* Fill LI part */ + if (num_LIs_pdu_segment) + { + uint16_t index = 0; + uint16_t temp = 0; + /* Set Extension bit in first byte */ + RLC_AM_PDU_SET_E(*pdu_segment_header_p); + + /* loop on nb of LIs */ + pdu_segment_header_p += RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE; + li_bit_offset = 4; /* toggle between 0 and 4 */ + li_jump_offset = 1; /* toggle between 1 and 2 */ + + while (index < num_LIs_pdu_segment) + { + /* Set E bit for next LI if present */ + if (index < num_LIs_pdu_segment - 1) + RLC_SET_BIT(temp,li_bit_offset + RLC_AM_LI_BITS); + /* Set LI */ + RLC_AM_PDU_SET_LI(temp,sdus_segment_size[index],li_bit_offset); + *pdu_segment_header_p = temp >> 8; + *(pdu_segment_header_p + 1) = temp & 0xFF; + pdu_segment_header_p += li_jump_offset; + li_bit_offset ^= 0x4; + li_jump_offset ^= 0x3; + + temp = ((*pdu_segment_header_p) << 8) | (*(pdu_segment_header_p + 1)); + index ++; + } + } + } + else + { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] OUT OF MEMORY PDU SN %04d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + sn); + } + + return mem_pdu_segment_p; +} + +#if 0 //----------------------------------------------------------------------------- mem_block_t* rlc_am_retransmit_get_subsegment( const protocol_ctxt_t* const ctxt_pP, @@ -347,10 +714,10 @@ mem_block_t* rlc_am_retransmit_get_subsegment( // - set the header of the new AMD PDU segment in accordance with the description in sub clause 6.; // - set the P field according to sub clause 5.2.2. - mem_block_t* mb_original_p = rlc_pP->pdu_retrans_buffer[snP].mem_block; + mem_block_t* mb_original_p = rlc_pP->tx_data_pdu_buffer[snP].mem_block; if (mb_original_p != NULL) { - mem_block_t* mb_sub_segment_p = get_free_mem_block(*sizeP + sizeof(struct mac_tb_req)); + mem_block_t* mb_sub_segment_p = get_free_mem_block(*sizeP + sizeof(struct mac_tb_req), __func__); rlc_am_pdu_sn_10_t* pdu_original_p = (rlc_am_pdu_sn_10_t*) (&mb_original_p->data[sizeof(struct mac_tb_req)]); rlc_am_pdu_sn_10_t* pdu_sub_segment_p = (rlc_am_pdu_sn_10_t*) (&mb_sub_segment_p->data[sizeof(struct mac_tb_req)]); rlc_am_pdu_info_t pdu_info; @@ -360,10 +727,10 @@ mem_block_t* rlc_am_retransmit_get_subsegment( ((struct mac_tb_req*)(mb_sub_segment_p->data))->data_ptr = (uint8_t*)&(mb_sub_segment_p->data[sizeof(struct mac_tb_req)]); - if (rlc_am_get_data_pdu_infos(ctxt_pP, rlc_pP, pdu_original_p, rlc_pP->pdu_retrans_buffer[snP].header_and_payload_size, &pdu_info) >= 0) { + if (rlc_am_get_data_pdu_infos(ctxt_pP, rlc_pP, pdu_original_p, rlc_pP->tx_data_pdu_buffer[snP].header_and_payload_size, &pdu_info) >= 0) { int li_index = 0; - int start_offset = rlc_pP->pdu_retrans_buffer[snP].nack_so_start; - int stop_offset = rlc_pP->pdu_retrans_buffer[snP].nack_so_stop; + int start_offset = rlc_pP->tx_data_pdu_buffer[snP].nack_so_start; + int stop_offset = rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop; LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] ORIGINAL PDU SN %04d:\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), @@ -373,8 +740,8 @@ mem_block_t* rlc_am_retransmit_get_subsegment( // all 15 bits set to 1 (indicate that the missing portion of the AMD PDU includes all bytes // to the last byte of the AMD PDU) if (stop_offset == 0x7FFF) { - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop = rlc_pP->pdu_retrans_buffer[snP].payload_size - 1; - stop_offset = rlc_pP->pdu_retrans_buffer[snP].nack_so_stop; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop = rlc_pP->tx_data_pdu_buffer[snP].payload_size - 1; + stop_offset = rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop; LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] UPDATED RETRANS PDU SN %04d nack_so_stop FROM 0x7FFF to %05d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP, @@ -634,7 +1001,7 @@ mem_block_t* rlc_am_retransmit_get_subsegment( PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); test_pdu_copy_size = max_copy_payload_size; - if ((stop_offset == (start_offset + max_copy_payload_size - 1)) && (stop_offset == rlc_pP->pdu_retrans_buffer[snP].payload_size - 1)) { + if ((stop_offset == (start_offset + max_copy_payload_size - 1)) && (stop_offset == rlc_pP->tx_data_pdu_buffer[snP].payload_size - 1)) { not_test_fi = (not_test_fi & 0x2) | (not_fi_original & 0x1); // set b0 idendical to the b0 of the non segmented PDU } else { not_test_fi = not_test_fi & 0x2; // clear b0 because no SDU ending in this PDU @@ -642,7 +1009,7 @@ mem_block_t* rlc_am_retransmit_get_subsegment( } //--------------------------------------------------------------- - /*if (stop_offset == (rlc_pP->pdu_retrans_buffer[snP].payload_size - 1)) { + /*if (stop_offset == (rlc_pP->tx_data_pdu_buffer[snP].payload_size - 1)) { test_fi = (test_fi & 0x02) | (fi_original & 0x01); }*/ //--------------------------------------------------------------- @@ -653,7 +1020,7 @@ mem_block_t* rlc_am_retransmit_get_subsegment( // fill the segment pdu_p with Lis and data //--------------------------------------------------------------- LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] fill the segment pdu_p with Lis and data, test_num_li %d\n", - test_num_li); + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), test_num_li); if (test_num_li > 0) { pdu_sub_segment_p->b1 = pdu_sub_segment_p->b1 | 0x04; // set E bit @@ -685,12 +1052,12 @@ mem_block_t* rlc_am_retransmit_get_subsegment( *sizeP = *sizeP - 1; } - LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RB %u][RE-SEGMENT] ADD LI %d\n", + LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] ADD LI %d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), test_li_list[fill_num_li]); } } else { - LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RB %u][RE-SEGMENT] ADD NO LI\n", + LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] ADD NO LI\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); fill_payload_p = (uint8_t*)e_li_sub_segment; } @@ -699,16 +1066,16 @@ mem_block_t* rlc_am_retransmit_get_subsegment( // copy payload to retransmit //--------------------------------------------------------------- memcpy(fill_payload_p, - &rlc_pP->pdu_retrans_buffer[snP].payload[start_offset], + &rlc_pP->tx_data_pdu_buffer[snP].payload[start_offset], test_pdu_copy_size); ((struct mac_tb_req*)(mb_sub_segment_p->data))->tb_size = (tb_size_t)(((uint64_t)fill_payload_p)+ test_pdu_copy_size) - ((uint64_t)(&pdu_sub_segment_p->b1)); // set LSF - if ((test_pdu_copy_size + start_offset) == rlc_pP->pdu_retrans_buffer[snP].payload_size) { + if ((test_pdu_copy_size + start_offset) == rlc_pP->tx_data_pdu_buffer[snP].payload_size) { pdu_sub_segment_p->data[0] = pdu_sub_segment_p->data[0] | 0x80; - rlc_pP->pdu_retrans_buffer[snP].flags.retransmit = 0; + rlc_pP->tx_data_pdu_buffer[snP].flags.retransmit = 0; LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] RE-SEND DATA PDU SN %04d SO %d %d BYTES PAYLOAD %d BYTES LSF!\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), @@ -735,15 +1102,15 @@ mem_block_t* rlc_am_retransmit_get_subsegment( // update nack_so_start //--------------------------------------------------------------- rlc_am_remove_hole(ctxt_pP, rlc_pP, snP, start_offset, test_pdu_copy_size+start_offset - 1); - //rlc_pP->pdu_retrans_buffer[snP].nack_so_start = rlc_pP->pdu_retrans_buffer[snP].nack_so_start + test_pdu_copy_size; + //rlc_pP->tx_data_pdu_buffer[snP].nack_so_start = rlc_pP->tx_data_pdu_buffer[snP].nack_so_start + test_pdu_copy_size; LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] RE-SEND DATA PDU SN %04d NOW nack_so_start %d nack_so_stop %d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP, - rlc_pP->pdu_retrans_buffer[snP].nack_so_start, - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop); - /*if (rlc_pP->pdu_retrans_buffer[snP].nack_so_start == rlc_pP->pdu_retrans_buffer[snP].nack_so_stop) { - rlc_pP->pdu_retrans_buffer[snP].nack_so_start = 0; - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop = 0x7FFF; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start, + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop); + /*if (rlc_pP->tx_data_pdu_buffer[snP].nack_so_start == rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop) { + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start = 0; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop = 0x7FFF; }*/ } else { LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] COULD NOT GET INFO FOR DATA PDU SN %04d -> RETURN NULL\n", @@ -751,8 +1118,6 @@ mem_block_t* rlc_am_retransmit_get_subsegment( snP); return NULL; } - - rlc_am_pdu_polling(ctxt_pP, rlc_pP, pdu_sub_segment_p, test_pdu_copy_size); return mb_sub_segment_p; } else { LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RE-SEGMENT] RE-SEND DATA PDU SN %04d BUT NO PDU AVAILABLE -> RETURN NULL\n", @@ -762,6 +1127,7 @@ mem_block_t* rlc_am_retransmit_get_subsegment( return NULL; } } +#endif //----------------------------------------------------------------------------- void rlc_am_tx_buffer_display ( const protocol_ctxt_t* const ctxt_pP, @@ -770,6 +1136,7 @@ void rlc_am_tx_buffer_display ( { rlc_sn_t sn = rlc_pP->vt_a; int i, loop = 0; + rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer_p; if (message_pP) { LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" Retransmission buffer %s VT(A)=%04d VT(S)=%04d:", @@ -785,25 +1152,26 @@ void rlc_am_tx_buffer_display ( } while (rlc_pP->vt_s != sn) { - if (rlc_pP->pdu_retrans_buffer[sn].mem_block) { + tx_data_pdu_buffer_p = &rlc_pP->tx_data_pdu_buffer[sn % RLC_AM_WINDOW_SIZE]; + if (tx_data_pdu_buffer_p->mem_block) { if ((loop % 1) == 0) { LOG_D(RLC, "\nTX SN:\t"); } - if (rlc_pP->pdu_retrans_buffer[sn].flags.retransmit) { - LOG_D(RLC, "%04d %d/%d Bytes (NACK RTX:%02d ",sn, rlc_pP->pdu_retrans_buffer[sn].header_and_payload_size, rlc_pP->pdu_retrans_buffer[sn].payload_size, - rlc_pP->pdu_retrans_buffer[sn].retx_count); + if (tx_data_pdu_buffer_p->flags.retransmit) { + LOG_D(RLC, "%04d %d/%d Bytes (NACK RTX:%02d ",sn, tx_data_pdu_buffer_p->header_and_payload_size, tx_data_pdu_buffer_p->payload_size, + tx_data_pdu_buffer_p->retx_count); } else { - LOG_D(RLC, "%04d %d/%d Bytes (RTX:%02d ",sn, rlc_pP->pdu_retrans_buffer[sn].header_and_payload_size, rlc_pP->pdu_retrans_buffer[sn].payload_size, - rlc_pP->pdu_retrans_buffer[sn].retx_count); + LOG_D(RLC, "%04d %d/%d Bytes (RTX:%02d ",sn, tx_data_pdu_buffer_p->header_and_payload_size, tx_data_pdu_buffer_p->payload_size, + tx_data_pdu_buffer_p->retx_count); } - if (rlc_pP->pdu_retrans_buffer[sn].num_holes == 0) { - LOG_D(RLC, "SO:%04d->%04d)\t", rlc_pP->pdu_retrans_buffer[sn].nack_so_start, rlc_pP->pdu_retrans_buffer[sn].nack_so_stop); + if (tx_data_pdu_buffer_p->num_holes == 0) { + LOG_D(RLC, "SO:%04d->%04d)\t", tx_data_pdu_buffer_p->nack_so_start, tx_data_pdu_buffer_p->nack_so_stop); } else { - for (i=0; ipdu_retrans_buffer[sn].num_holes; i++) { + for (i=0; inum_holes; i++) { assert(i < RLC_AM_MAX_HOLES_REPORT_PER_PDU); - LOG_D(RLC, "SO:%04d->%04d)\t", rlc_pP->pdu_retrans_buffer[sn].hole_so_start[i], rlc_pP->pdu_retrans_buffer[sn].hole_so_stop[i]); + LOG_D(RLC, "SO:%04d->%04d)\t", tx_data_pdu_buffer_p->hole_so_start[i], tx_data_pdu_buffer_p->hole_so_stop[i]); } } @@ -815,6 +1183,132 @@ void rlc_am_tx_buffer_display ( LOG_D(RLC, "\n"); } + +//----------------------------------------------------------------------------- +mem_block_t * rlc_am_get_pdu_to_retransmit( + const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t* const rlc_pP) +{ + rlc_sn_t sn = rlc_pP->vt_a; + rlc_sn_t sn_end = rlc_pP->vt_s; + mem_block_t* pdu_p = NULL; + rlc_am_tx_data_pdu_management_t* tx_data_pdu_management; + + AssertFatal ((rlc_pP->retrans_num_pdus > 0) && (rlc_pP->vt_a != rlc_pP->vt_s), "RLC AM ReTx start process Error: NbPDUtoRetx=%d vtA=%d vtS=%d LcId=%d !\n", + rlc_pP->retrans_num_pdus,rlc_pP->vt_a,rlc_pP->vt_s,rlc_pP->channel_id); + + do + { + tx_data_pdu_management = &rlc_pP->tx_data_pdu_buffer[sn % RLC_AM_WINDOW_SIZE]; + if ((tx_data_pdu_management->flags.retransmit) && (tx_data_pdu_management->flags.max_retransmit == 0)) + { + AssertFatal (tx_data_pdu_management->sn == sn, "RLC AM ReTx PDU Error: SN Error pdu_sn=%d sn=%d vtA=%d vtS=%d LcId=%d !\n", + tx_data_pdu_management->sn,sn,rlc_pP->vt_a,rlc_pP->vt_s,rlc_pP->channel_id); + AssertFatal (tx_data_pdu_management->flags.transmitted == 1, "RLC AM ReTx PDU Error: State Error sn=%d vtA=%d vtS=%d LcId=%d !\n", + sn,rlc_pP->vt_a,rlc_pP->vt_s,rlc_pP->channel_id); + AssertFatal (tx_data_pdu_management->retx_payload_size > 0, "RLC AM ReTx PDU Error: No Data to Retx sn=%d vtA=%d vtS=%d LcId=%d !\n", + sn,rlc_pP->vt_a,rlc_pP->vt_s,rlc_pP->channel_id); + + /* Either the whole RLC PDU is to be transmitted and there is enough MAC TBS or there is minimum TBS size for transmitting 1 AM PDU segment */ + if ((tx_data_pdu_management->retx_payload_size == tx_data_pdu_management->payload_size) && (rlc_pP->nb_bytes_requested_by_mac >= tx_data_pdu_management->header_and_payload_size)) + { + /* check maxretx is not hit */ + if (tx_data_pdu_management->retx_count_next <= rlc_pP->max_retx_threshold) + { + pdu_p = rlc_am_retransmit_get_copy(ctxt_pP, rlc_pP, sn); + + if (pdu_p != NULL) + { + rlc_pP->retrans_num_bytes_to_retransmit -= tx_data_pdu_management->retx_payload_size; + rlc_pP->retrans_num_pdus --; + tx_data_pdu_management->retx_payload_size = 0; + tx_data_pdu_management->flags.retransmit = 0; + + // update stats + rlc_pP->stat_tx_data_pdu += 1; + rlc_pP->stat_tx_retransmit_pdu += 1; + rlc_pP->stat_tx_retransmit_pdu_by_status += 1; + rlc_pP->stat_tx_data_bytes += tx_data_pdu_management->payload_size; + rlc_pP->stat_tx_retransmit_bytes += tx_data_pdu_management->payload_size; + rlc_pP->stat_tx_retransmit_bytes_by_status += tx_data_pdu_management->payload_size; + + } + } + else + { + // TO DO : RLC Notification to RRC + ReEstablishment procedure + tx_data_pdu_management->flags.max_retransmit = 1; + LOG_W(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RLC AM MAX RETX=%d] SN %04d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + tx_data_pdu_management->retx_count_next, + sn); + } + } + else if (rlc_pP->nb_bytes_requested_by_mac >= 5) + { + /* Resegmentation case */ + /* check maxretx is not hit */ + if (tx_data_pdu_management->retx_count_next <= rlc_pP->max_retx_threshold) + { + sdu_size_t pdu_data_size = 0; + + pdu_p = rlc_am_retransmit_get_am_segment(ctxt_pP, rlc_pP, tx_data_pdu_management,&pdu_data_size); + + if (pdu_p != NULL) + { + AssertFatal ((tx_data_pdu_management->retx_payload_size >= pdu_data_size) && (rlc_pP->retrans_num_bytes_to_retransmit >= pdu_data_size), "RLC AM ReTx PDU Segment Error: DataSize=%d PDUReTxsize=%d TotalReTxsize=%d sn=%d LcId=%d !\n", + pdu_data_size,tx_data_pdu_management->retx_payload_size,rlc_pP->retrans_num_bytes_to_retransmit,sn,rlc_pP->channel_id); + + tx_data_pdu_management->retx_payload_size -= pdu_data_size; + rlc_pP->retrans_num_bytes_to_retransmit -= pdu_data_size; + if (tx_data_pdu_management->retx_payload_size == 0) + { + rlc_pP->retrans_num_pdus --; + tx_data_pdu_management->retx_payload_size = 0; + tx_data_pdu_management->flags.retransmit = 0; + } + + // update stats + rlc_pP->stat_tx_data_pdu += 1; + rlc_pP->stat_tx_retransmit_pdu += 1; + rlc_pP->stat_tx_retransmit_pdu_by_status += 1; + rlc_pP->stat_tx_data_bytes += pdu_data_size; + rlc_pP->stat_tx_retransmit_bytes += pdu_data_size; + rlc_pP->stat_tx_retransmit_bytes_by_status += pdu_data_size; + + } + } + else + { + // TO DO : RLC Notification to RRC + ReEstablishment procedure + tx_data_pdu_management->flags.max_retransmit = 1; + LOG_W(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[RLC AM MAX RETX=%d] SN %04d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + tx_data_pdu_management->retx_count_next, + sn); + } + } + + if (pdu_p != NULL) + { + /* check polling */ + rlc_am_pdu_sn_10_t* pdu_header_p = (rlc_am_pdu_sn_10_t*) (&pdu_p->data[sizeof(struct mac_tb_req)]); + rlc_am_pdu_polling(ctxt_pP, rlc_pP, pdu_header_p, tx_data_pdu_management->payload_size,false); + + tx_data_pdu_management->retx_count = tx_data_pdu_management->retx_count_next; + + break; + } + + } + + sn = RLC_AM_NEXT_SN(sn); + } while((sn != sn_end) && (rlc_pP->retrans_num_pdus > 0)); + + return pdu_p; +} + +#if 0 //----------------------------------------------------------------------------- void rlc_am_retransmit_any_pdu( const protocol_ctxt_t* const ctxt_pP, @@ -831,13 +1325,13 @@ void rlc_am_retransmit_any_pdu( PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); while (sn != sn_end) { - if (rlc_pP->pdu_retrans_buffer[sn].mem_block != NULL) { + if (rlc_pP->tx_data_pdu_buffer[sn].mem_block != NULL) { if (!found_pdu) { found_pdu = 1; found_pdu_sn = sn; } - if (rlc_pP->pdu_retrans_buffer[sn].header_and_payload_size <= rlc_pP->nb_bytes_requested_by_mac) { + if (rlc_pP->tx_data_pdu_buffer[sn].header_and_payload_size <= rlc_pP->nb_bytes_requested_by_mac) { LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[FORCE-TRAFFIC] RE-SEND DATA PDU SN %04d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), sn); @@ -850,12 +1344,13 @@ void rlc_am_retransmit_any_pdu( // no need for update rlc_pP->nb_bytes_requested_by_mac pdu_p = rlc_am_retransmit_get_copy(ctxt_pP, rlc_pP, sn); pdu_sn_10_p = (rlc_am_pdu_sn_10_t*) (&pdu_p->data[sizeof(struct mac_tb_req)]); - rlc_am_pdu_polling(ctxt_pP, rlc_pP, pdu_sn_10_p, rlc_pP->pdu_retrans_buffer[sn].header_and_payload_size); - pdu_sn_10_p->b1 = pdu_sn_10_p->b1 | 0x20; - rlc_pP->c_pdu_without_poll = 0; - rlc_pP->c_byte_without_poll = 0; + rlc_am_pdu_polling(ctxt_pP, rlc_pP, pdu_sn_10_p, rlc_pP->tx_data_pdu_buffer[sn].header_and_payload_size,false); + //BugFix: polling is checked and done in function above ! + //pdu_sn_10_p->b1 = pdu_sn_10_p->b1 | 0x20; + //BugFix : pdu_without_poll and byte_without_poll are reset only if a Poll is transmitted + //rlc_pP->c_pdu_without_poll = 0; + //rlc_pP->c_byte_without_poll = 0; //rlc_pP->poll_sn = (rlc_pP->vt_s -1) & RLC_AM_SN_MASK; - rlc_am_start_timer_poll_retransmit(ctxt_pP, rlc_pP); rlc_pP->stat_tx_data_pdu += 1; rlc_pP->stat_tx_retransmit_pdu += 1; rlc_pP->stat_tx_data_bytes += ((struct mac_tb_req*)(pdu_p->data))->tb_size; @@ -884,12 +1379,11 @@ void rlc_am_retransmit_any_pdu( rlc_am_nack_pdu (ctxt_pP, rlc_pP, found_pdu_sn, 0, 0x7FFF); pdu_p = rlc_am_retransmit_get_subsegment(ctxt_pP, rlc_pP, found_pdu_sn, &rlc_pP->nb_bytes_requested_by_mac); pdu_sn_10_p = (rlc_am_pdu_sn_10_t*) (&pdu_p->data[sizeof(struct mac_tb_req)]); - rlc_am_pdu_polling(ctxt_pP, rlc_pP, pdu_sn_10_p, rlc_pP->pdu_retrans_buffer[found_pdu_sn].header_and_payload_size); + rlc_am_pdu_polling(ctxt_pP, rlc_pP, pdu_sn_10_p, rlc_pP->tx_data_pdu_buffer[found_pdu_sn].header_and_payload_size,false); pdu_sn_10_p->b1 = pdu_sn_10_p->b1 | 0x20; rlc_pP->c_pdu_without_poll = 0; rlc_pP->c_byte_without_poll = 0; //rlc_pP->poll_sn = (rlc_pP->vt_s -1) & RLC_AM_SN_MASK; - rlc_am_start_timer_poll_retransmit(ctxt_pP, rlc_pP); rlc_pP->stat_tx_data_pdu += 1; rlc_pP->stat_tx_retransmit_pdu += 1; rlc_pP->stat_tx_data_bytes += ((struct mac_tb_req*)(pdu_p->data))->tb_size; @@ -903,3 +1397,4 @@ void rlc_am_retransmit_any_pdu( } } } +#endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h old mode 100755 new mode 100644 index aa6c4b878d..60fefab84b --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_retransmit.h * \brief This file defines the prototypes of the functions dealing with the retransmission. * \author GAUTHIER Lionel @@ -57,33 +50,38 @@ # define public_rlc_am_retransmit(x) extern x # endif # endif -/*! \fn void rlc_am_nack_pdu (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *rlcP, uint16_t snP, sdu_size_t so_startP, sdu_size_t so_endP) +/*! \fn boolean_t rlc_am_nack_pdu (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *rlcP, int16_t snP, int16_t prev_nack_snP,sdu_size_t so_startP, sdu_size_t so_endP) * \brief The RLC AM PDU which have the sequence number snP is marked NACKed with segment offset fields. * \param[in] ctxtP Running context. * \param[in] rlcP RLC AM protocol instance pointer. * \param[in] snP Sequence number of the PDU that is negative acknowledged. +* \param[in] prev_nack_snP Sequence number of previous PDU that is negative acknowledged. * \param[in] so_startP Start of the segment offset of the PDU that . * \param[in] so_endP Transport blocks received from MAC layer. +* \return OK/KO * \note It may appear a new hole in the retransmission buffer depending on the segment offset informations. Depending on the state of the retransmission buffer, negative confirmation can be sent to higher layers about the drop by the RLC AM instance of a particular SDU. */ -protected_rlc_am_retransmit(void rlc_am_nack_pdu ( +protected_rlc_am_retransmit(boolean_t rlc_am_nack_pdu ( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlcP, const rlc_sn_t snP, - const sdu_size_t so_startP, - const sdu_size_t so_endP);) + const rlc_sn_t prev_nack_snP, + sdu_size_t so_startP, + sdu_size_t so_endP);) /*! \fn void rlc_am_ack_pdu (const protocol_ctxt_t* const ctxt_pP,rlc_am_entity_t *rlcP, rlc_sn_t snP) * \brief The RLC AM PDU which have the sequence number snP is marked ACKed. * \param[in] ctxtP Running context. * \param[in] rlcP RLC AM protocol instance pointer. * \param[in] snP Sequence number of the PDU that is acknowledged. +* \param[in] free_pdu Boolean indicating that the PDU can be freed because smaller than new vtA. * \note Depending on the state of the retransmission buffer, positive confirmation can be sent to higher layers about the receiving by the peer RLC AM instance of a particular SDU. */ protected_rlc_am_retransmit(void rlc_am_ack_pdu ( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlcP, - const rlc_sn_t snP);) + const rlc_sn_t snP, + boolean_t free_pdu);) /*! \fn mem_block_t* rlc_am_retransmit_get_copy (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *rlcP, rlc_sn_t snP) * \brief The RLC AM PDU which have the sequence number snP is marked ACKed. @@ -97,6 +95,7 @@ protected_rlc_am_retransmit(mem_block_t* rlc_am_retransmit_get_copy ( rlc_am_entity_t *const rlcP, const rlc_sn_t snP)); +#if 0 /*! \fn mem_block_t* rlc_am_retransmit_get_subsegment (const protocol_ctxt_t* const ctxt_pP,rlc_am_entity_t *rlcP,rlc_sn_t snP, sdu_size_t *sizeP) * \brief The RLC AM PDU which have the sequence number snP is marked ACKed. * \param[in] ctxtP Running context. @@ -110,7 +109,18 @@ protected_rlc_am_retransmit(mem_block_t* rlc_am_retransmit_get_subsegment ( rlc_am_entity_t *const rlcP, const rlc_sn_t snP, sdu_size_t *const sizeP)); +#endif +/*! \fn mem_block_t* rlc_am_get_pdu_to_retransmit(const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t* rlcP) +* \brief Find a PDU or PDU segment to retransmit. +* \param[in] ctxtP Running context. +* \param[in] rlcP RLC AM protocol instance pointer. +* \return A copy of the retransmitted PDU or PDU segment or NULL if TBS was not big enough +*/ +protected_rlc_am_retransmit(mem_block_t* rlc_am_get_pdu_to_retransmit( + const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t* const rlcP);) +#if 0 /*! \fn void rlc_am_retransmit_any_pdu(const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t* rlcP) * \brief Retransmit any PDU in order to unblock peer entity, if no suitable PDU is found (depending on requested MAC size) to be retransmitted, then try to retransmit a subsegment of any PDU. * \param[in] ctxtP Running context. @@ -119,6 +129,7 @@ protected_rlc_am_retransmit(mem_block_t* rlc_am_retransmit_get_subsegment ( protected_rlc_am_retransmit(void rlc_am_retransmit_any_pdu( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t* const rlcP);) +#endif /*! \fn void rlc_am_tx_buffer_display (const protocol_ctxt_t* const ctxt_pP,rlc_am_entity_t* rlcP, char* message_pP) * \brief Display the dump of the retransmission buffer. diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c old mode 100755 new mode 100644 index a580181f6e..dc1ed21163 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_RX_LIST_C 1 //----------------------------------------------------------------------------- @@ -38,7 +31,812 @@ #include "UTIL/LOG/log.h" +boolean_t rlc_am_rx_check_vr_reassemble( + const protocol_ctxt_t* const ctxt_pP, + const rlc_am_entity_t* const rlc_pP) +{ + mem_block_t* cursor_p = rlc_pP->receiver_buffer.head; + rlc_am_rx_pdu_management_t * pdu_cursor_mgnt_p = NULL; + sdu_size_t next_waited_so = 0; + boolean_t reassemble = FALSE; + if (cursor_p != NULL) { + + rlc_am_pdu_info_t* pdu_info_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + rlc_usn_t sn_ref = pdu_info_p->sn; + + if (sn_ref != rlc_pP->vr_r) { + /* Case vrR has advanced from head : most likely case */ + + reassemble = TRUE; + /* Handle first SN if it is made of PDU segments : set them all to be reassembled */ + if (pdu_info_p->rf) { + pdu_cursor_mgnt_p = (rlc_am_rx_pdu_management_t *) (cursor_p->data); + next_waited_so = 0; + AssertFatal(pdu_cursor_mgnt_p->all_segments_received > 0,"AM Rx Check Reassembly head SN=%d with PDU segments != vrR=%d should be fully received LCID=%d\n", + sn_ref,rlc_pP->vr_r,rlc_pP->channel_id); + while ((cursor_p != NULL) && (pdu_info_p->sn == sn_ref) && (pdu_info_p->so == next_waited_so)) { + if (pdu_cursor_mgnt_p->segment_reassembled == RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_NO) { + pdu_cursor_mgnt_p->segment_reassembled = RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_PENDING; + } + next_waited_so += pdu_info_p->payload_size; + cursor_p = cursor_p->next; + if (cursor_p != NULL) { + pdu_cursor_mgnt_p = (rlc_am_rx_pdu_management_t *) (cursor_p->data); + pdu_info_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + } + } + + /* Now jump up to vrR */ + while ((RLC_AM_DIFF_SN(pdu_info_p->sn,sn_ref) < RLC_AM_DIFF_SN(rlc_pP->vr_r,sn_ref)) && (cursor_p != NULL)) { + cursor_p = cursor_p->next; + if (cursor_p != NULL) { + pdu_info_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + } + + /* Handle vrR if it is made of incomplete PDU Segments */ + if ((cursor_p != NULL) && (pdu_info_p->sn == rlc_pP->vr_r)) { + pdu_cursor_mgnt_p = (rlc_am_rx_pdu_management_t *) (cursor_p->data); + next_waited_so = 0; + AssertFatal(pdu_cursor_mgnt_p->all_segments_received == 0,"AM Rx Check Reassembly vr=%d should be partly received SNHead=%d LCID=%d\n", + rlc_pP->vr_r,sn_ref,rlc_pP->channel_id); + while ((cursor_p != NULL) && (pdu_info_p->sn == rlc_pP->vr_r) && (pdu_info_p->so == next_waited_so)) { + if (pdu_cursor_mgnt_p->segment_reassembled == RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_NO) { + pdu_cursor_mgnt_p->segment_reassembled = RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_PENDING; + } + next_waited_so += pdu_info_p->payload_size; + cursor_p = cursor_p->next; + if (cursor_p != NULL) { + pdu_cursor_mgnt_p = (rlc_am_rx_pdu_management_t *) (cursor_p->data); + pdu_info_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + } + } + } /* end sn_ref != rlc_pP->vr_r */ + else { + /* case vrR = partially received */ + + pdu_cursor_mgnt_p = (rlc_am_rx_pdu_management_t *) (cursor_p->data); + next_waited_so = 0; + AssertFatal(pdu_cursor_mgnt_p->all_segments_received == 0,"AM Rx Check Reassembly SNHead=vr=%d should be partly received LCID=%d\n", + rlc_pP->vr_r,rlc_pP->channel_id); + while ((cursor_p != NULL) && (pdu_info_p->sn == rlc_pP->vr_r) && (pdu_info_p->so == next_waited_so)) { + if (pdu_cursor_mgnt_p->segment_reassembled == RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_NO) { + pdu_cursor_mgnt_p->segment_reassembled = RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_PENDING; + reassemble = TRUE; + } + next_waited_so += pdu_info_p->payload_size; + cursor_p = cursor_p->next; + if (cursor_p != NULL) { + pdu_cursor_mgnt_p = (rlc_am_rx_pdu_management_t *) (cursor_p->data); + pdu_info_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + } + } /*end sn_ref == rlc_pP->vr_r */ + } + return reassemble; +} + +mem_block_t * create_new_segment_from_pdu( + mem_block_t* const tb_pP, + uint16_t so_offset, /* offset from the data part of the PDU to copy */ + sdu_size_t data_length_to_copy) +{ + rlc_am_pdu_info_t* pdu_rx_info_p = &((rlc_am_rx_pdu_management_t*)(tb_pP->data))->pdu_info; + rlc_am_pdu_info_t* pdu_new_segment_info_p = NULL; + mem_block_t * new_segment_p = NULL; + int16_t new_li_list[RLC_AM_MAX_SDU_IN_PDU]; + int16_t header_size = 0; + uint8_t num_li = 0; + boolean_t fi_start, fi_end, lsf; + + /* Init some PDU Segment header fixed parameters */ + fi_start = !((pdu_rx_info_p->fi & 0x2) >> 1); + fi_end = !(pdu_rx_info_p->fi & 0x1); + lsf = ((pdu_rx_info_p->lsf == 1) || (pdu_rx_info_p->rf == 0)); + + /* Handle NO Li case fist */ + if (pdu_rx_info_p->num_li == 0) { + + header_size = RLC_AM_PDU_SEGMENT_HEADER_MIN_SIZE; + + if (so_offset) { + fi_start = FALSE; + } + if (so_offset + data_length_to_copy != pdu_rx_info_p->payload_size) { + fi_end = FALSE; + lsf = FALSE; + } + } // end no LI in original segment + else { + + uint8_t li_index = 0; + uint16_t li_sum = 0; + num_li = pdu_rx_info_p->num_li; + + /* set LSF to false if we know that end of the original segment will not be copied */ + if (so_offset + data_length_to_copy != pdu_rx_info_p->payload_size) { + lsf = FALSE; + } + + /* catch the first LI containing so_offset */ + while ((li_index < pdu_rx_info_p->num_li) && (li_sum + pdu_rx_info_p->li_list[li_index] <= so_offset)) { + li_sum += pdu_rx_info_p->li_list[li_index]; + num_li --; + li_index ++; + } + + /* set FI start if so_offset = LI sum and at least one LI have been read */ + if ((li_index) && (so_offset == li_sum)) { + fi_start = TRUE; + } + + /* Fill LI until the end */ + if (num_li) { + sdu_size_t remaining_size = data_length_to_copy; + uint8_t j = 0; + new_li_list[0] = li_sum + pdu_rx_info_p->li_list[li_index] - so_offset; + if (data_length_to_copy <= new_li_list[0]) { + num_li = 0; + } + else { + remaining_size -= new_li_list[0]; + j++; + li_index ++; + while ((li_index < pdu_rx_info_p->num_li) && (remaining_size >= pdu_rx_info_p->li_list[li_index])) { + remaining_size -= pdu_rx_info_p->li_list[li_index]; + new_li_list[j] = pdu_rx_info_p->li_list[li_index]; + j++; + li_index ++; + } + + /* update number of LI in the segment */ + num_li = j; + /* set FI End if remaining size = 0 */ + if (remaining_size == 0) { + fi_end = TRUE; + } + } + } + + /* compute header size */ + header_size = RLC_AM_PDU_SEGMENT_HEADER_SIZE(num_li); + + } // end LIs in original segment + + /* Allocate new buffer */ + new_segment_p = get_free_mem_block(sizeof (mac_rlc_max_rx_header_size_t) + header_size + data_length_to_copy, __func__); + + /* Fill PDU Segment Infos and Header */ + if (new_segment_p != NULL) { + pdu_new_segment_info_p = &((rlc_am_rx_pdu_management_t*)(new_segment_p->data))->pdu_info; + rlc_am_rx_pdu_management_t * pdu_cursor_mgnt_p = (rlc_am_rx_pdu_management_t *) (new_segment_p->data); + uint8_t *pdu_segment_header_p = (uint8_t *)&(new_segment_p->data[sizeof (mac_rlc_max_rx_header_size_t)]); + + pdu_cursor_mgnt_p->segment_reassembled = RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_NO; //to be updated after if SN = vrR + + pdu_new_segment_info_p->d_c = pdu_rx_info_p->d_c; + pdu_new_segment_info_p->sn = pdu_rx_info_p->sn; + pdu_new_segment_info_p->p = pdu_rx_info_p->p; + pdu_new_segment_info_p->rf = 1; + pdu_new_segment_info_p->fi = (((fi_start ? 0: 1) << 1) | (fi_end ? 0: 1)); + pdu_new_segment_info_p->num_li = num_li; + pdu_new_segment_info_p->e = (num_li ? 1: 0); + pdu_new_segment_info_p->lsf = (lsf ? 1: 0); + pdu_new_segment_info_p->so = pdu_rx_info_p->so + so_offset; + pdu_new_segment_info_p->payload = pdu_segment_header_p + header_size; + pdu_new_segment_info_p->header_size = header_size; + pdu_new_segment_info_p->payload_size = data_length_to_copy; + pdu_new_segment_info_p->hidden_size = data_length_to_copy; + for (int i=0; i < num_li; i++) { + pdu_new_segment_info_p->li_list[i] = new_li_list[i]; + pdu_new_segment_info_p->hidden_size -= new_li_list[i]; + } + + /* Fill Header part in the buffer */ + /* Content is supposed to be init with 0 so with FIStart=FIEnd=TRUE */ + /* copy first two bytes from original: D/C + RF + FI + E+ SN*/ + memset(pdu_segment_header_p, 0, header_size); + RLC_AM_PDU_SET_D_C(*pdu_segment_header_p); + RLC_AM_PDU_SET_RF(*pdu_segment_header_p); + if (pdu_new_segment_info_p->p) { + RLC_AM_PDU_SET_POLL(*pdu_segment_header_p); + } + /* Change FI */ + if (!fi_start) + { + // Set to not starting + (*pdu_segment_header_p) |= (1 << (RLC_AM_PDU_FI_OFFSET + 1)); + + } + if (!fi_end) + { + // Set to not starting + (*pdu_segment_header_p) |= (1 << (RLC_AM_PDU_FI_OFFSET)); + + } + /* E */ + if (pdu_new_segment_info_p->e) { + RLC_AM_PDU_SET_E(*pdu_segment_header_p); + } + /* SN */ + (*pdu_segment_header_p) |= ((pdu_new_segment_info_p->sn >> 8) & 0x3); + *(pdu_segment_header_p + 1) = (pdu_new_segment_info_p->sn & 0xFF); + + pdu_segment_header_p += 2; + + /* Last Segment Flag (LSF) */ + if (lsf) + { + RLC_AM_PDU_SET_LSF(*pdu_segment_header_p); + } + /* Store SO bytes */ + * (pdu_segment_header_p ) |= ((pdu_new_segment_info_p->so >> 8) & 0x7F); + * (pdu_segment_header_p + 1) = pdu_new_segment_info_p->so & 0xFF; + + if (num_li) { + uint16_t index = 0; + uint16_t temp = 0; + uint8_t li_bit_offset = 4; /* toggle between 0 and 4 */ + uint8_t li_jump_offset = 1; /* toggle between 1 and 2 */ + + /* loop on nb of LIs */ + pdu_segment_header_p += 2; + + while (index < num_li) + { + /* Set E bit for next LI if present */ + if (index < num_li - 1) + RLC_SET_BIT(temp,li_bit_offset + RLC_AM_LI_BITS); + /* Set LI */ + RLC_AM_PDU_SET_LI(temp,new_li_list[index],li_bit_offset); + *pdu_segment_header_p = temp >> 8; + *(pdu_segment_header_p + 1) = temp & 0xFF; + pdu_segment_header_p += li_jump_offset; + li_bit_offset ^= 0x4; + li_jump_offset ^= 0x3; + + temp = ((*pdu_segment_header_p) << 8) | (*(pdu_segment_header_p + 1)); + index ++; + } + } + + /* copy data part */ + /* Fill mem_block contexts */ + ((struct mac_tb_ind *) (new_segment_p->data))->first_bit = 0; + ((struct mac_tb_ind *) (new_segment_p->data))->data_ptr = (uint8_t*)&new_segment_p->data[sizeof (mac_rlc_max_rx_header_size_t)]; + ((struct mac_tb_ind *) (new_segment_p->data))->size = data_length_to_copy + header_size; + memcpy(pdu_new_segment_info_p->payload,pdu_rx_info_p->payload + so_offset,data_length_to_copy); + } + + return new_segment_p; +} + +rlc_am_rx_pdu_status_t rlc_am_rx_list_handle_pdu_segment( + const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t* const rlc_pP, + mem_block_t* const tb_pP) +{ + rlc_am_pdu_info_t* pdu_rx_info_p = &((rlc_am_rx_pdu_management_t*)(tb_pP->data))->pdu_info; + rlc_am_pdu_info_t* pdu_info_cursor_p = NULL; + rlc_am_pdu_info_t* pdu_info_previous_cursor_p = NULL; + mem_block_t* cursor_p = rlc_pP->receiver_buffer.head; + mem_block_t* previous_cursor_p = NULL; + mem_block_t* next_cursor_p = NULL; + uint16_t so_start_min = 0; + uint16_t so_end = 0; + uint16_t so_start_segment = pdu_rx_info_p->so; + uint16_t so_end_segment = pdu_rx_info_p->so + pdu_rx_info_p->payload_size - 1; + + /*****************************************************/ + // 1) Find previous cursor to the PDU to insert + /*****************************************************/ + AssertFatal(cursor_p != NULL,"AM Rx PDU Error, received buffer empty LcID=%d\n",rlc_pP->channel_id); + + do { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + + // Stop if Cursor SN >= Received SN + if (RLC_AM_DIFF_SN(pdu_info_cursor_p->sn,rlc_pP->vr_r) >= RLC_AM_DIFF_SN(pdu_rx_info_p->sn,rlc_pP->vr_r)) { + break; + } + + previous_cursor_p = cursor_p; + pdu_info_previous_cursor_p = pdu_info_cursor_p; + cursor_p = cursor_p->next; + } while (cursor_p != NULL); + + /*****************************************************/ + // 2) Store the received Segment + /*****************************************************/ + // First case : cursor_p is NULL or its SN is different from the received one, it means the SN is received for the first time + // Insert PDU after previous_cursor_p + if ((cursor_p == NULL) || (pdu_info_cursor_p->sn != pdu_rx_info_p->sn)) { + if (previous_cursor_p != NULL) { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SEGMENT SN=%d] PDU SEGMENT INSERTED AFTER PDU SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn, + pdu_info_previous_cursor_p->sn); + list2_insert_after_element(tb_pP, previous_cursor_p, &rlc_pP->receiver_buffer); + } + else { /* SN of head of Rx PDU list is higher than received PDU SN */ + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SEGMENT SN=%d] PDU SEGMENT INSERTED BEFORE PDU SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn, + pdu_info_cursor_p->sn); + list2_insert_before_element(tb_pP, cursor_p, &rlc_pP->receiver_buffer); + } + + return RLC_AM_DATA_PDU_STATUS_OK; + } + + /********************************************/ + /* Now handle case cursor->sn = received SN */ + /********************************************/ + + rlc_am_rx_pdu_management_t * pdu_cursor_mgnt_p = (rlc_am_rx_pdu_management_t *) (cursor_p->data); + + // Filter out SN duplicate + if (pdu_cursor_mgnt_p->all_segments_received) { + return RLC_AM_DATA_PDU_STATUS_AM_SEGMENT_DUPLICATE; + } + + // Try to catch a segment duplicate + next_cursor_p = cursor_p; + while ((next_cursor_p != NULL) && (pdu_info_cursor_p->sn == pdu_rx_info_p->sn)) { + if ((so_start_segment >= pdu_info_cursor_p->so) && (so_end_segment <= pdu_info_cursor_p->so + pdu_info_cursor_p->payload_size - 1)) { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SEGMENT] DISCARD : DUPLICATE SEGMENT SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn); + return RLC_AM_DATA_PDU_STATUS_AM_SEGMENT_DUPLICATE; + } + next_cursor_p = next_cursor_p->next; + if (next_cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(next_cursor_p->data))->pdu_info; + } + } + + // Reset pdu_info_cursor_p because of the loop before + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + + // Try to Handle the most likely cases first + if (pdu_info_cursor_p->so == 0) { + + /* Loop on stored segments and find the stored segment containing received SOStart */ + previous_cursor_p = cursor_p; + pdu_info_previous_cursor_p = pdu_info_cursor_p; + while ((cursor_p != NULL) && (pdu_info_cursor_p->sn == pdu_rx_info_p->sn) + && ((pdu_info_cursor_p->so + pdu_info_cursor_p->payload_size) <= so_start_segment)) { + previous_cursor_p = cursor_p; + pdu_info_previous_cursor_p = pdu_info_cursor_p; + cursor_p = cursor_p->next; + if (cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + } + + // Most likely case : no duplicate, the segment is put after all stored segments which are contiguous + if ((cursor_p == NULL) || (pdu_info_cursor_p->sn != pdu_rx_info_p->sn) || (pdu_info_cursor_p->so > so_end_segment)) { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SEGMENT SN=%d SOSTART=%d] PDU SEGMENT INSERTED AFTER PDU SEGMENT WITH SOEND=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn,so_start_segment, + pdu_info_previous_cursor_p->so + pdu_info_previous_cursor_p->payload_size - 1); + + list2_insert_after_element(tb_pP, previous_cursor_p, &rlc_pP->receiver_buffer); + return RLC_AM_DATA_PDU_STATUS_OK; + } + + // Duplicate case : Resume contiguous scan and update previous_cursor_p + so_start_min = pdu_info_previous_cursor_p->so; + so_end = so_start_min + pdu_info_previous_cursor_p->payload_size; + cursor_p = previous_cursor_p->next; + if (cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + while ((cursor_p != NULL) && (pdu_info_cursor_p->sn == pdu_rx_info_p->sn) + && (pdu_info_cursor_p->so == so_end)) { + previous_cursor_p = cursor_p; + pdu_info_previous_cursor_p = pdu_info_cursor_p; + so_end += pdu_info_cursor_p->payload_size; + cursor_p = cursor_p->next; + if (cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + } + + /* Now discard the PDU segment if it is within so_start_min and so_end */ + if ((so_start_min <= so_start_segment) && (so_end_segment <= so_end - 1)) { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SEGMENT] DISCARD : DUPLICATE SEGMENT SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn); + return RLC_AM_DATA_PDU_STATUS_AM_SEGMENT_DUPLICATE; + } + + // Discard potential embedded segments in the received PDU segment + // The first one is discontigous + next_cursor_p = cursor_p; + while ((next_cursor_p != NULL) && (pdu_info_cursor_p->sn == pdu_rx_info_p->sn) && + (so_end_segment >= pdu_info_cursor_p->so + pdu_info_cursor_p->payload_size - 1)) { + /* Discard the segment */ + cursor_p = next_cursor_p; + next_cursor_p = next_cursor_p->next; + list2_remove_element (cursor_p, &rlc_pP->receiver_buffer); + free_mem_block(cursor_p, __func__); + + if (next_cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(next_cursor_p->data))->pdu_info; + } + } + cursor_p = next_cursor_p; + + //Remove duplicate at the begining + if (so_start_segment < pdu_info_previous_cursor_p->so) { + so_start_segment = pdu_info_previous_cursor_p->so + pdu_info_previous_cursor_p->payload_size; + } + else if (so_start_segment < pdu_info_previous_cursor_p->so + pdu_info_previous_cursor_p->payload_size){ + so_start_segment += (pdu_info_previous_cursor_p->so + pdu_info_previous_cursor_p->payload_size - so_start_segment); + } + + // Now remove duplicate at the end, only valid if cursor_p SN has the same received SN + if (cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(next_cursor_p->data))->pdu_info; + + if ((pdu_info_cursor_p->sn == pdu_rx_info_p->sn) && (so_end_segment >= pdu_info_cursor_p->so)) { + so_end_segment = pdu_info_cursor_p->so - 1; + } + } + + AssertFatal((so_start_segment <= so_end_segment) && (pdu_rx_info_p->so <= so_start_segment) && + (so_end_segment <= pdu_rx_info_p->so + pdu_rx_info_p->payload_size - 1), + " AM RX PDU Segment Duplicate elimination error FirstSO=0 OldSOStart=%d OldSOEnd=%d newSOStart=%d newSOEnd =%d SN=%d\n", + pdu_rx_info_p->so,pdu_rx_info_p->so + pdu_rx_info_p->payload_size - 1,so_start_segment,so_end_segment,pdu_rx_info_p->sn); + + } // end pdu_info_cursor_p->so == 0 + else { + // Handle most likely case : PDU Segment without duplicate is inserted before first stored PDU segment + if (so_end_segment < pdu_info_cursor_p->so) { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SEGMENT SN=%d SOSTART=%d SOEND=%d] PDU SEGMENT INSERTED BEFORE PDU SEGMENT WITH SOSTART=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn,so_start_segment,so_end_segment, + pdu_info_cursor_p->so); + + list2_insert_before_element(tb_pP, cursor_p, &rlc_pP->receiver_buffer); + return RLC_AM_DATA_PDU_STATUS_OK; + } + + // Handle duplicate case + if (so_start_segment < pdu_info_cursor_p->so) { + // First Case : only duplicate at the end + // Scan for embedded segments to be discarded + next_cursor_p = cursor_p; + while ((next_cursor_p != NULL) && (pdu_info_cursor_p->sn == pdu_rx_info_p->sn) && + (so_end_segment >= pdu_info_cursor_p->so + pdu_info_cursor_p->payload_size - 1)) { + /* Discard the segment */ + cursor_p = next_cursor_p; + next_cursor_p = next_cursor_p->next; + list2_remove_element (cursor_p, &rlc_pP->receiver_buffer); + free_mem_block(cursor_p, __func__); + + if (next_cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(next_cursor_p->data))->pdu_info; + } + } + cursor_p = next_cursor_p; + + // Now remove duplicate at the end, only valid if cursor_p SN has the same received SN + if (cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(next_cursor_p->data))->pdu_info; + + if ((pdu_info_cursor_p->sn == pdu_rx_info_p->sn) && (so_end_segment >= pdu_info_cursor_p->so)) { + so_end_segment = pdu_info_cursor_p->so - 1; + } + } + + AssertFatal((so_start_segment <= so_end_segment) && + (so_end_segment <= pdu_rx_info_p->so + pdu_rx_info_p->payload_size - 1), + " AM RX PDU Segment Duplicate elimination at the end error FirstSO!=0 SOStart=%d OldSOEnd=%d newSOEnd =%d SN=%d\n", + pdu_rx_info_p->so,pdu_rx_info_p->so + pdu_rx_info_p->payload_size - 1,so_end_segment,pdu_rx_info_p->sn); + + } + else { + // Second Case: Duplicate at the begining and potentially at the end + /* Loop on stored segments and find the stored segment containing received SOStart */ + + previous_cursor_p = cursor_p; + pdu_info_previous_cursor_p = pdu_info_cursor_p; + while ((cursor_p != NULL) && (pdu_info_cursor_p->sn == pdu_rx_info_p->sn) + && ((pdu_info_cursor_p->so + pdu_info_cursor_p->payload_size) <= so_start_segment)) { + previous_cursor_p = cursor_p; + pdu_info_previous_cursor_p = pdu_info_cursor_p; + cursor_p = cursor_p->next; + if (cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + } + + // Most likely case : no duplicate, the segment is put after all stored segments which are contiguous + if ((cursor_p == NULL) || (pdu_info_cursor_p->sn != pdu_rx_info_p->sn) || (pdu_info_cursor_p->so > so_end_segment)) { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SEGMENT SN=%d SOSTART=%d] PDU SEGMENT INSERTED AFTER PDU SEGMENT WITH SOEND=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn,so_start_segment, + pdu_info_previous_cursor_p->so + pdu_info_previous_cursor_p->payload_size - 1); + + list2_insert_after_element(tb_pP, previous_cursor_p, &rlc_pP->receiver_buffer); + return RLC_AM_DATA_PDU_STATUS_OK; + } + + // Now look for contiguous segments to check whether the received segment is not fully duplicate + so_start_min = pdu_info_previous_cursor_p->so; + so_end = so_start_min + pdu_info_previous_cursor_p->payload_size; + cursor_p = previous_cursor_p->next; + if (cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + while ((cursor_p != NULL) && (pdu_info_cursor_p->sn == pdu_rx_info_p->sn) + && (pdu_info_cursor_p->so == so_end)) { + previous_cursor_p = cursor_p; + pdu_info_previous_cursor_p = pdu_info_cursor_p; + so_end += pdu_info_cursor_p->payload_size; + cursor_p = cursor_p->next; + if (cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + } + + /* Now discard the PDU segment if it is within so_start_min and so_end */ + if ((so_start_min <= so_start_segment) && (so_end_segment < so_end)) { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SEGMENT] DISCARD : DUPLICATE SEGMENT SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn); + return RLC_AM_DATA_PDU_STATUS_AM_SEGMENT_DUPLICATE; + } + + //Remove duplicate at the begining + if (so_start_segment < pdu_info_previous_cursor_p->so) { + so_start_segment = pdu_info_previous_cursor_p->so + pdu_info_previous_cursor_p->payload_size; + } + else if (so_start_segment < pdu_info_previous_cursor_p->so + pdu_info_previous_cursor_p->payload_size){ + so_start_segment += (pdu_info_previous_cursor_p->so + pdu_info_previous_cursor_p->payload_size - so_start_segment); + } + + + // Now Scan for embedded segments to be discarded + next_cursor_p = cursor_p; + while ((next_cursor_p != NULL) && (pdu_info_cursor_p->sn == pdu_rx_info_p->sn) && + (so_end_segment >= pdu_info_cursor_p->so + pdu_info_cursor_p->payload_size - 1)) { + /* Discard the segment */ + cursor_p = next_cursor_p; + next_cursor_p = next_cursor_p->next; + list2_remove_element (cursor_p, &rlc_pP->receiver_buffer); + free_mem_block(cursor_p, __func__); + + if (next_cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(next_cursor_p->data))->pdu_info; + } + } + cursor_p = next_cursor_p; + + // Now remove duplicate at the end, only valid if cursor_p SN has the same received SN + if (cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(next_cursor_p->data))->pdu_info; + + if ((pdu_info_cursor_p->sn == pdu_rx_info_p->sn) && (so_end_segment >= pdu_info_cursor_p->so)) { + so_end_segment = pdu_info_cursor_p->so - 1; + } + } + + AssertFatal((so_start_segment <= so_end_segment) && (pdu_rx_info_p->so <= so_start_segment) && + (so_end_segment <= pdu_rx_info_p->so + pdu_rx_info_p->payload_size - 1), + " AM RX PDU Segment Duplicate elimination error FirstSO!=0 OldSOStart=%d OldSOEnd=%d newSOStart=%d newSOEnd =%d SN=%d\n", + pdu_rx_info_p->so,pdu_rx_info_p->so + pdu_rx_info_p->payload_size - 1,so_start_segment,so_end_segment,pdu_rx_info_p->sn); + } + + } // end pdu_info_cursor_p->so != 0 + + + /* Last step : duplicate bytes had been removed, build a new PDU segment */ + AssertFatal((pdu_rx_info_p->so != so_start_segment) || (so_end_segment != pdu_rx_info_p->so + pdu_rx_info_p->payload_size - 1), + " AM RX PDU Segment Duplicate elimination error FirstSO!=0 OldSOStart=%d OldSOEnd=%d newSOStart=%d newSOEnd =%d SN=%d\n", + pdu_rx_info_p->so,pdu_rx_info_p->so + pdu_rx_info_p->payload_size - 1,so_start_segment,so_end_segment,pdu_rx_info_p->sn); + + mem_block_t* trunc_segment = create_new_segment_from_pdu(tb_pP,so_start_segment - pdu_rx_info_p->so,so_end_segment - so_start_segment + 1); + if (trunc_segment != NULL) { + LOG_I(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SEGMENT] CREATE SEGMENT FROM SEGMENT OFFSET=%d DATA LENGTH=%d SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),so_start_segment - pdu_rx_info_p->so,so_end_segment - so_start_segment + 1,pdu_rx_info_p->sn); + + if (previous_cursor_p != NULL) { + list2_insert_after_element(trunc_segment, previous_cursor_p, &rlc_pP->receiver_buffer); + } + else { + list2_insert_before_element(trunc_segment, rlc_pP->receiver_buffer.head, &rlc_pP->receiver_buffer); + } + + /* Free original PDU Segment */ + free_mem_block(tb_pP, __func__); + + return RLC_AM_DATA_PDU_STATUS_OK; + } + else { + return RLC_AM_DATA_PDU_STATUS_BUFFER_FULL; + } + +} + +rlc_am_rx_pdu_status_t rlc_am_rx_list_handle_pdu( + const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t* const rlc_pP, + mem_block_t* const tb_pP) +{ + rlc_am_pdu_info_t* pdu_rx_info_p = &((rlc_am_rx_pdu_management_t*)(tb_pP->data))->pdu_info; + rlc_am_pdu_info_t* pdu_info_cursor_p = NULL; + mem_block_t* cursor_p = rlc_pP->receiver_buffer.head; + mem_block_t* previous_cursor_p = NULL; + rlc_am_rx_pdu_status_t pdu_status = RLC_AM_DATA_PDU_STATUS_OK; + // it is assumed this pdu is in rx window + + + /*****************************************************/ + // 1) Find previous cursor to the PDU to insert + /*****************************************************/ + AssertFatal(cursor_p != NULL,"AM Rx PDU Error, received buffer empty LcID=%d\n",rlc_pP->channel_id); + + do { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + + // Stop if Cursor SN >= Received SN + if (RLC_AM_DIFF_SN(pdu_info_cursor_p->sn,rlc_pP->vr_r) >= RLC_AM_DIFF_SN(pdu_rx_info_p->sn,rlc_pP->vr_r)) { + break; + } + + previous_cursor_p = cursor_p; + cursor_p = cursor_p->next; + } while (cursor_p != NULL); + + /*****************************************************/ + // 2) Insert PDU by removing byte duplicate if required + /*****************************************************/ + // First case : cursor_p is NULL or SN are different, it means the SN is received for the first time + // Insert PDU after previous_cursor_p + if ((cursor_p == NULL) || (pdu_info_cursor_p->sn != pdu_rx_info_p->sn)) { + if (previous_cursor_p != NULL) { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SN=%d] PDU INSERTED AFTER PDU SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn, + ((rlc_am_rx_pdu_management_t*)(previous_cursor_p->data))->pdu_info.sn); + list2_insert_after_element(tb_pP, previous_cursor_p, &rlc_pP->receiver_buffer); + } + else { /* SN of head of Rx PDU list is higher than received PDU SN */ + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU SN=%d] PDU INSERTED BEFORE PDU SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn, + pdu_info_cursor_p->sn); + list2_insert_before_element(tb_pP, cursor_p, &rlc_pP->receiver_buffer); + } + + return pdu_status; + } + + // Filter out SN duplicate + // SN of received PDU has already data stored + rlc_am_rx_pdu_management_t * pdu_cursor_mgnt_p = (rlc_am_rx_pdu_management_t *) (cursor_p->data); + + if (pdu_cursor_mgnt_p->all_segments_received) { + return RLC_AM_DATA_PDU_STATUS_SN_DUPLICATE; + } + + /* check if the received PDU is equal to vrR */ + if ((pdu_rx_info_p->sn != rlc_pP->vr_r) || (pdu_info_cursor_p->so != 0)) { + /* The full received PDU can replace the allready received PDU Segments. */ + /* clean them and append this PDU */ + mem_block_t* cursor_next_p = cursor_p; + while (cursor_next_p) { + cursor_p = cursor_next_p; + cursor_next_p = cursor_next_p->next; + list2_remove_element (cursor_p, &rlc_pP->receiver_buffer); + free_mem_block(cursor_p, __func__); + if (cursor_next_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_next_p->data))->pdu_info; + if (pdu_info_cursor_p->sn != pdu_rx_info_p->sn) { + break; + } + } + } + + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] PDU REPLACES STORED PDU SEGMENTS SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),pdu_rx_info_p->sn); + + if (previous_cursor_p != NULL) { + list2_insert_after_element(tb_pP, previous_cursor_p, &rlc_pP->receiver_buffer); + } + else { + list2_insert_before_element(tb_pP, cursor_next_p, &rlc_pP->receiver_buffer); + } + + return pdu_status; + } // End SN != vrR or SO != 0 + else { + /* First update cursor until discontinuity */ + previous_cursor_p = cursor_p; + AssertFatal(pdu_info_cursor_p->rf != 0,"AM Rx PDU Error, stored SN=%d should be a PDU segment\n",pdu_info_cursor_p->sn); + AssertFatal(((rlc_am_rx_pdu_management_t *) (cursor_p->data))->all_segments_received == 0, + "AM Rx PDU Error, stored SN=%d already fully received\n",pdu_info_cursor_p->sn); + sdu_size_t next_waited_so = 0; + while ((cursor_p != NULL) && (pdu_info_cursor_p->sn == pdu_rx_info_p->sn) && (pdu_info_cursor_p->so == next_waited_so)) { + next_waited_so += pdu_info_cursor_p->payload_size; + previous_cursor_p = cursor_p; + cursor_p = cursor_p->next; + if (cursor_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + } + /* Create a new PDU segment by removing first next_waited_so bytes */ + mem_block_t* trunc_pdu = create_new_segment_from_pdu(tb_pP,next_waited_so,pdu_rx_info_p->payload_size - next_waited_so); + + if (trunc_pdu != NULL) { + /* Insert PDU Segment */ + list2_insert_after_element(trunc_pdu, previous_cursor_p, &rlc_pP->receiver_buffer); + + LOG_I(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[PROCESS RX PDU] CREATE PDU SEGMENT FROM PDU OFFSET =%d SN=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),next_waited_so,pdu_rx_info_p->sn); + + /* clean previous stored segments in duplicate */ + if ((cursor_p != NULL) && (pdu_info_cursor_p->sn == pdu_rx_info_p->sn)) { + mem_block_t* cursor_next_p = cursor_p; + while (cursor_next_p) { + cursor_p = cursor_next_p; + cursor_next_p = cursor_next_p->next; + list2_remove_element (cursor_p, &rlc_pP->receiver_buffer); + free_mem_block(cursor_p, __func__); + if (cursor_next_p != NULL) { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_next_p->data))->pdu_info; + if (pdu_info_cursor_p->sn != pdu_rx_info_p->sn) { + break; + } + } + } + } + + /* Free original PDU */ + free_mem_block(tb_pP, __func__); + + return pdu_status; + } + else { + return RLC_AM_DATA_PDU_STATUS_BUFFER_FULL; + } + } +} + +// returns 0 if success +// returns neg value if failure +//----------------------------------------------------------------------------- +rlc_am_rx_pdu_status_t +rlc_am_rx_list_check_duplicate_insert_pdu( + const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t* const rlc_pP, + mem_block_t* const tb_pP) +{ + rlc_am_pdu_info_t* pdu_rx_info_p = &((rlc_am_rx_pdu_management_t*)(tb_pP->data))->pdu_info; + mem_block_t* cursor_p = NULL; + cursor_p = rlc_pP->receiver_buffer.head; + rlc_am_rx_pdu_status_t pdu_status = RLC_AM_DATA_PDU_STATUS_OK; + // it is assumed this pdu is in rx window + + /* Init Reassembly status */ + ((rlc_am_rx_pdu_management_t*)(tb_pP->data))->segment_reassembled = RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_NO; + + if (cursor_p == NULL) { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[INSERT PDU] LINE %d RX PDU SN %04d (only inserted)\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + __LINE__, + pdu_rx_info_p->sn); + list2_add_head(tb_pP, &rlc_pP->receiver_buffer); + return pdu_status; + } + + + if (pdu_rx_info_p->rf == 0) { // Case normal PDU received + pdu_status = rlc_am_rx_list_handle_pdu(ctxt_pP,rlc_pP,tb_pP); + } + else { + pdu_status = rlc_am_rx_list_handle_pdu_segment(ctxt_pP,rlc_pP,tb_pP); + } + + return pdu_status; +} +#if 0 // returns 0 if success // returns neg value if failure //----------------------------------------------------------------------------- @@ -56,6 +854,10 @@ rlc_am_rx_list_insert_pdu( cursor_p = rlc_pP->receiver_buffer.head; // it is assumed this pdu is in rx window + //TODO : check for duplicate + // should be rewrite + /* look for previous SN */ + if (cursor_p) { if (rlc_pP->vr_mr < rlc_pP->vr_r) { if (pdu_info_p->sn >= rlc_pP->vr_r) { @@ -69,7 +871,6 @@ rlc_am_rx_list_insert_pdu( if (pdu_info_previous_cursor_p->sn == pdu_info_p->sn) { if (pdu_info_p->rf != pdu_info_previous_cursor_p->rf) { LOG_N(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[INSERT PDU] LINE %d RX PDU SN %04d WRONG RF -> DROPPED (vr(mr) < vr(r) and sn >= vr(r))\n", - ctxt_pP->frame, PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), __LINE__, pdu_info_p->sn); @@ -487,6 +1288,8 @@ rlc_am_rx_list_insert_pdu( pdu_info_p->sn); return -1; } +#endif + //----------------------------------------------------------------------------- void rlc_am_rx_check_all_byte_segments( @@ -527,8 +1330,10 @@ rlc_am_rx_check_all_byte_segments( // in case all first segments up to tb_pP are in list // the so field of the first PDU should be 0 //cursor_p = list.head; + //we start from the first stored PDU segment of this SN pdu_info_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + // if the first segment does not have SO = 0 then no need to continue if (pdu_info_p->so != 0) { return; } @@ -557,13 +1362,15 @@ rlc_am_rx_check_all_byte_segments( next_waited_so = next_waited_so + pdu_info_p->payload_size; //msg("rlc_am_rx_check_all_byte_segments(%d) @6\n",sn); } else { // assumed pdu_info_p->so + pdu_info_p->payload_size > next_waited_so - next_waited_so = (next_waited_so + pdu_info_p->payload_size) - (next_waited_so - pdu_info_p->so); + //next_waited_so = (next_waited_so + pdu_info_p->payload_size) - (next_waited_so - pdu_info_p->so); //msg("rlc_am_rx_check_all_byte_segments(%d) @7\n",sn); + return; } if (pdu_info_p->lsf > 0) { //msg("rlc_am_rx_check_all_byte_segments(%d) @8\n",sn); rlc_am_rx_mark_all_segments_received(ctxt_pP, rlc_pP, first_cursor_p); + return; } } @@ -607,13 +1414,15 @@ rlc_am_rx_mark_all_segments_received( } } //----------------------------------------------------------------------------- +//#define RLC_AM_DEBUG_REASSEMBLY void rlc_am_rx_list_reassemble_rlc_sdus( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t* const rlc_pP) { - mem_block_t* cursor_p = NULL; - rlc_am_rx_pdu_management_t* rlc_am_rx_old_pdu_management = NULL; + mem_block_t* cursor_p = NULL; + rlc_am_rx_pdu_management_t* rlc_am_rx_old_pdu_management = NULL; + rlc_am_pdu_info_t* pdu_info_p = NULL; cursor_p = list2_get_head(&rlc_pP->receiver_buffer); @@ -622,20 +1431,79 @@ rlc_am_rx_list_reassemble_rlc_sdus( } rlc_am_rx_pdu_management_t* rlc_am_rx_pdu_management_p = ((rlc_am_rx_pdu_management_t*)(cursor_p->data)); + pdu_info_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; +#ifdef RLC_AM_DEBUG_REASSEMBLY + rlc_usn_t sn_reass_start = pdu_info_p->sn; +#endif + + /* Specific process for the first SN if all PDU segments had been reassembled but not freed */ + if ((rlc_am_rx_pdu_management_p->all_segments_received > 0) && (pdu_info_p->rf != 0)) { + rlc_sn_t sn = pdu_info_p->sn; + while ((cursor_p != NULL) && (((rlc_am_rx_pdu_management_t*)(cursor_p->data))->segment_reassembled == RLC_AM_RX_PDU_SEGMENT_REASSEMBLED) + && ((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info.sn == sn) { + cursor_p = list2_remove_head(&rlc_pP->receiver_buffer); + free_mem_block(cursor_p, __func__); + cursor_p = list2_get_head(&rlc_pP->receiver_buffer); + } + + /* Reset Management pointers */ + if (cursor_p != NULL) { + rlc_am_rx_pdu_management_p = ((rlc_am_rx_pdu_management_t*)(cursor_p->data)); + /* Next SN must be the same or SN+1 */ + if (RLC_AM_DIFF_SN(rlc_am_rx_pdu_management_p->pdu_info.sn,sn) > 1) { + return; + } + } + else { + return; + } + } do { if (rlc_am_rx_pdu_management_p->all_segments_received > 0) { cursor_p = list2_remove_head(&rlc_pP->receiver_buffer); - rlc_am_reassemble_pdu(ctxt_pP, rlc_pP, cursor_p); + rlc_am_reassemble_pdu(ctxt_pP, rlc_pP, cursor_p,TRUE); rlc_am_rx_old_pdu_management = rlc_am_rx_pdu_management_p; cursor_p = list2_get_head(&rlc_pP->receiver_buffer); if (cursor_p == NULL) { +#ifdef RLC_AM_DEBUG_REASSEMBLY + LOG_D(RLC, "RLC AM REASSEMBLY from sn=%d to ALL, vrR=%d vrMS=%d\n", + sn_reass_start,rlc_pP->vr_r,rlc_pP->vr_ms); +#endif return; } rlc_am_rx_pdu_management_p = ((rlc_am_rx_pdu_management_t*)(cursor_p->data)); - } else { + } + else if (rlc_am_rx_pdu_management_p->segment_reassembled == RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_PENDING) { + rlc_am_rx_pdu_management_p->segment_reassembled = RLC_AM_RX_PDU_SEGMENT_REASSEMBLED; + + rlc_am_reassemble_pdu(ctxt_pP, rlc_pP, cursor_p,FALSE); + rlc_am_rx_old_pdu_management = rlc_am_rx_pdu_management_p; + cursor_p = cursor_p->next; + + if (cursor_p == NULL) { +#ifdef RLC_AM_DEBUG_REASSEMBLY + LOG_D(RLC, "RLC AM REASSEMBLY from sn=%d to ALL, Last is Segment, vrR=%d vrMS=%d\n", + sn_reass_start,rlc_pP->vr_r,rlc_pP->vr_ms); +#endif + return; + } + + rlc_am_rx_pdu_management_p = ((rlc_am_rx_pdu_management_t*)(cursor_p->data)); + } + else if (rlc_am_rx_pdu_management_p->segment_reassembled == RLC_AM_RX_PDU_SEGMENT_REASSEMBLED) { + rlc_am_rx_old_pdu_management = rlc_am_rx_pdu_management_p; + cursor_p = cursor_p->next; + + if (cursor_p == NULL) { + return; + } + + rlc_am_rx_pdu_management_p = ((rlc_am_rx_pdu_management_t*)(cursor_p->data)); + } + else { #if RLC_STOP_ON_LOST_PDU if (list2_get_head(&rlc_pP->receiver_buffer) != cursor_p) { @@ -644,12 +1512,29 @@ rlc_am_rx_list_reassemble_rlc_sdus( PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); } +#endif +#ifdef RLC_AM_DEBUG_REASSEMBLY + LOG_D(RLC, "RLC AM REASSEMBLY from sn=%d to ALL, vrR=%d vrMS=%d\n", + sn_reass_start,rlc_pP->vr_r,rlc_pP->vr_ms); #endif return; } - } while ((rlc_am_rx_pdu_management_p->pdu_info.sn == ((rlc_am_rx_old_pdu_management->pdu_info.sn + 1) & RLC_AM_SN_MASK)) - || ((rlc_am_rx_pdu_management_p->pdu_info.sn == rlc_am_rx_old_pdu_management->pdu_info.sn) && (rlc_am_rx_pdu_management_p->all_segments_received > 0))); + } while (((RLC_AM_DIFF_SN(rlc_am_rx_pdu_management_p->pdu_info.sn,rlc_am_rx_old_pdu_management->pdu_info.sn) < 2) && (rlc_am_rx_old_pdu_management->all_segments_received > 0)) + || ((rlc_am_rx_pdu_management_p->pdu_info.sn == rlc_am_rx_old_pdu_management->pdu_info.sn) && (rlc_am_rx_pdu_management_p->segment_reassembled != RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_NO))); + +#ifdef RLC_AM_DEBUG_REASSEMBLY + mem_block_t* cursor_head_p = list2_get_head(&rlc_pP->receiver_buffer); + if (cursor_head_p == NULL) { + return; + } + + rlc_am_pdu_info_t* pdu_info_head_p = &((rlc_am_rx_pdu_management_t*)(cursor_head_p->data))->pdu_info; + + LOG_D(RLC, "RLC AM REASSEMBLY from sn=%d to sn=%d, next_sn=%d head sn=%d vrR=%d vrMS=%d\n", + sn_reass_start,rlc_am_rx_old_pdu_management->pdu_info.sn,rlc_am_rx_pdu_management_p->pdu_info.sn,pdu_info_head_p->sn,rlc_pP->vr_r,rlc_pP->vr_ms); +#endif + } //----------------------------------------------------------------------------- mem_block_t * diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h old mode 100755 new mode 100644 index 6c6bb0e6c6..d2f0740b33 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_rx_list.h * \brief This file defines the prototypes of the functions dealing with a RX list data structure supporting re-segmentation. * \author GAUTHIER Lionel @@ -66,6 +59,16 @@ #include "PHY/defs.h" //----------------------------------------------------------------------------- +/*! \fn rlc_am_rx_pdu_status_t rlc_am_rx_list_check_duplicate_insert_pdu(const protocol_ctxt_t* const ctxt_pP,rlc_am_entity_t* const rlc_pP,mem_block_t* const tb_pP) +* \brief Insert a PDU in the RX buffer after removing byte duplicate (implemented with a list). +* \param[in] ctxt_pP Running context. +* \param[in] rlcP RLC AM protocol instance pointer. +* \param[in] tbP A PDU embedded in a mem_block_t. +* \return Zero if the PDU could be inserted in the RX buffer, a negative value if the PDU could not be inserted. +*/ +protected_rlc_am_rx_list( rlc_am_rx_pdu_status_t rlc_am_rx_list_check_duplicate_insert_pdu(const protocol_ctxt_t* const ctxt_pP,rlc_am_entity_t* const rlc_pP,mem_block_t* const tb_pP);) + +#if 0 /*! \fn signed int rlc_am_rx_list_insert_pdu(const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t* const rlcP , mem_block_t* const tbP) * \brief Insert a PDU in the RX buffer (implemented with a list). * \param[in] ctxt_pP Running context. @@ -74,6 +77,15 @@ * \return Zero if the PDU could be inserted in the RX buffer, a negative value if the PDU could not be inserted. */ protected_rlc_am_rx_list( signed int rlc_am_rx_list_insert_pdu(const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t* const rlcP, mem_block_t* const tbP);) +#endif + +/*! \fn boolean_t rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP,const rlc_am_entity_t* const rlc_pP) +* \brief Check if reassembly taking into account potential new vrR value +* \param[in] ctxt_pP Running context. +* \param[in] rlcP RLC AM protocol instance pointer. +* \return TRUE if reassembly must be done, FALSE else +*/ +protected_rlc_am_rx_list( boolean_t rlc_am_rx_check_vr_reassemble(const protocol_ctxt_t* const ctxt_pP,const rlc_am_entity_t* const rlc_pP);) /*! \fn void rlc_am_rx_check_all_byte_segments(const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t* const rlcP, mem_block_t* const tbP) * \brief Check if all sub-segments of a PDU are received, if yes then call rlc_am_rx_mark_all_segments_received() procedure. diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c old mode 100755 new mode 100644 index 18ff9a8ad4..c16e897bb6 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.c @@ -1,37 +1,28 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_SEGMENT_C 1 //----------------------------------------------------------------------------- -#if USER_MODE #include -#endif //----------------------------------------------------------------------------- #include "platform_types.h" //----------------------------------------------------------------------------- @@ -46,7 +37,8 @@ void rlc_am_pdu_polling ( const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlc_pP, rlc_am_pdu_sn_10_t *const pdu_pP, - const int16_t payload_sizeP) + const int16_t payload_sizeP, + boolean_t is_new_pdu) { // 5.2.2 Polling // An AM RLC entity can poll its peer AM RLC entity in order to trigger STATUS reporting at the peer AM RLC entity. @@ -75,49 +67,59 @@ void rlc_am_pdu_polling ( // - start t-PollRetransmit; // - else: // - restart t-PollRetransmit; - rlc_pP->c_pdu_without_poll += 1; - rlc_pP->c_byte_without_poll += payload_sizeP; + + if (is_new_pdu) { + if (rlc_pP->poll_pdu != RLC_AM_POLL_PDU_INFINITE) { + rlc_pP->c_pdu_without_poll += 1; + } + + if (rlc_pP->poll_byte != RLC_AM_POLL_BYTE_INFINITE) { + rlc_pP->c_byte_without_poll += payload_sizeP; + } + } if ( - (rlc_pP->c_pdu_without_poll >= rlc_pP->poll_pdu) || - (rlc_pP->c_byte_without_poll >= rlc_pP->poll_byte) || + ((is_new_pdu) && ((rlc_pP->c_pdu_without_poll >= rlc_pP->poll_pdu) || + (rlc_pP->c_byte_without_poll >= rlc_pP->poll_byte))) || ((rlc_pP->sdu_buffer_occupancy == 0) && (rlc_pP->retrans_num_bytes_to_retransmit == 0)) || (rlc_pP->vt_s == rlc_pP->vt_ms) || - (rlc_pP->force_poll == TRUE) + (rlc_pP->force_poll == true) ) { - rlc_pP->force_poll = FALSE; + rlc_pP->force_poll = false; - if (rlc_pP->c_pdu_without_poll >= rlc_pP->poll_pdu) { + if ((is_new_pdu) && (rlc_pP->c_pdu_without_poll >= rlc_pP->poll_pdu)) { LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[POLL] SET POLL BECAUSE TX NUM PDU THRESHOLD %d HAS BEEN REACHED\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->poll_pdu); - } else - if (rlc_pP->c_byte_without_poll >= rlc_pP->poll_byte) { + } + if ((is_new_pdu) && (rlc_pP->c_byte_without_poll >= rlc_pP->poll_byte)) { LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[POLL] SET POLL BECAUSE TX NUM BYTES THRESHOLD %d HAS BEEN REACHED\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->poll_byte); - } else + } if ((rlc_pP->sdu_buffer_occupancy == 0) && (rlc_pP->retrans_num_bytes_to_retransmit == 0)) { LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[POLL] SET POLL BECAUSE TX BUFFERS ARE EMPTY\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); - } else + } if (rlc_pP->vt_s == rlc_pP->vt_ms) { LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[POLL] SET POLL BECAUSE OF WINDOW STALLING\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); } - pdu_pP->b1 = pdu_pP->b1 | 0x20; + RLC_AM_PDU_SET_POLL(pdu_pP->b1); rlc_pP->c_pdu_without_poll = 0; rlc_pP->c_byte_without_poll = 0; - rlc_pP->poll_sn = (rlc_pP->vt_s -1) & RLC_AM_SN_MASK; + // vt_s shall have been updated before in case of new transmission + rlc_pP->poll_sn = RLC_AM_PREV_SN(rlc_pP->vt_s); //optimisation if (!rlc_pP->t_poll_retransmit.running) { rlc_am_start_timer_poll_retransmit(ctxt_pP, rlc_pP); //optimisation } else { //optimisation rlc_pP->t_poll_retransmit.frame_time_out = ctxt_pP->frame + rlc_pP->t_poll_retransmit.time_out; //optimisation } } else { - pdu_pP->b1 = pdu_pP->b1 & 0xDF; + // Need to clear poll bit as it may be a copy(retransmission case) of the original RLC PDU which was containing a poll + RLC_AM_PDU_CLEAR_POLL(pdu_pP->b1); } } //----------------------------------------------------------------------------- @@ -185,7 +187,9 @@ void rlc_am_segment_10 ( if (rlc_pP->nb_sdu_no_segmented <= 1) { max_li_overhead = 0; } else { - max_li_overhead = (((rlc_pP->nb_sdu_no_segmented - 1) * 3) / 2) + ((rlc_pP->nb_sdu_no_segmented - 1) % 2); + /* This computation assumes there is no SDU with size greater than 2047 bytes, otherwise a new PDU must be built except for LI15 configuration from Rel12*/ + test_num_li = rlc_pP->nb_sdu_no_segmented - 1; + max_li_overhead = test_num_li + (test_num_li >> 1) + (test_num_li & 1); } LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEGMENT] max_li_overhead %d\n", @@ -204,7 +208,7 @@ void rlc_am_segment_10 ( data_pdu_size); } - if (!(pdu_mem_p = get_free_mem_block (data_pdu_size + sizeof(struct mac_tb_req)))) { + if (!(pdu_mem_p = get_free_mem_block (data_pdu_size + sizeof(struct mac_tb_req), __func__))) { LOG_C(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEGMENT] ERROR COULD NOT GET NEW PDU, EXIT\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); RLC_AM_MUTEX_UNLOCK(&rlc_pP->lock_input_sdus); @@ -217,7 +221,7 @@ void rlc_am_segment_10 ( pdu_remaining_size = data_pdu_size - RLC_AM_HEADER_MIN_SIZE; pdu_p = (rlc_am_pdu_sn_10_t*) (&pdu_mem_p->data[sizeof(struct mac_tb_req)]); pdu_tb_req_p = (struct mac_tb_req*) (pdu_mem_p->data); - pdu_mngt_p = &rlc_pP->pdu_retrans_buffer[rlc_pP->vt_s % RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE]; + pdu_mngt_p = &rlc_pP->tx_data_pdu_buffer[rlc_pP->vt_s % RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE]; memset(pdu_mngt_p, 0, sizeof (rlc_am_tx_data_pdu_management_t)); memset (pdu_mem_p->data, 0, sizeof (rlc_am_pdu_sn_10_t)+sizeof(struct mac_tb_req)); @@ -373,7 +377,7 @@ void rlc_am_segment_10 ( // free SDU rlc_pP->sdu_buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; rlc_am_free_in_sdu_data(ctxt_pP, rlc_pP, rlc_pP->current_sdu_index); - //free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); + //free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index], __func__); //rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; //rlc_pP->nb_sdu -= 1; rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % RLC_AM_SDU_CONTROL_BUFFER_SIZE; @@ -452,7 +456,7 @@ void rlc_am_segment_10 ( sdu_mngt_p->sdu_remaining_size = 0; rlc_am_free_in_sdu_data(ctxt_pP, rlc_pP, rlc_pP->current_sdu_index); - //free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); + //free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index], __func__); //rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; //rlc_pP->nb_sdu -= 1; rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % RLC_AM_SDU_CONTROL_BUFFER_SIZE; @@ -462,9 +466,7 @@ void rlc_am_segment_10 ( PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), sdu_mngt_p->sdu_remaining_size, pdu_remaining_size - sdu_mngt_p->sdu_remaining_size); -#if USER_MODE assert(1!=1); -#endif memcpy(data, data_sdu_p, sdu_mngt_p->sdu_remaining_size); pdu_mngt_p->payload_size += sdu_mngt_p->sdu_remaining_size; pdu_remaining_size = pdu_remaining_size - sdu_mngt_p->sdu_remaining_size; @@ -492,11 +494,11 @@ void rlc_am_segment_10 ( fi = fi + 1; } - pdu_p->b1 = pdu_p->b1 | (fi << 3); + pdu_p->b1 = pdu_p->b1 | (fi << RLC_AM_PDU_FI_OFFSET); // set fist e bit if (fill_num_li > 0) { - pdu_p->b1 = pdu_p->b1 | 0x04; + RLC_AM_PDU_SET_E(pdu_p->b1); } LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEGMENT] SEND PDU SN %04d SIZE %d BYTES PAYLOAD SIZE %d BYTES\n", @@ -508,8 +510,9 @@ void rlc_am_segment_10 ( rlc_pP->stat_tx_data_pdu += 1; rlc_pP->stat_tx_data_bytes += (data_pdu_size - pdu_remaining_size); - //pdu_p->sn = rlc_pP->vt_s; - pdu_p->b1 = pdu_p->b1 | 0x80; // DATA/CONTROL field is DATA PDU + // set DATA/CONTROL field is DATA PDU(1) + RLC_AM_PDU_SET_D_C(pdu_p->b1); + // set sn = rlc_pP->vt_s; pdu_p->b1 = pdu_p->b1 | (rlc_pP->vt_s >> 8); pdu_p->b2 = rlc_pP->vt_s & 0xFF; rlc_pP->vt_s = (rlc_pP->vt_s+1) & RLC_AM_SN_MASK; @@ -518,24 +521,28 @@ void rlc_am_segment_10 ( pdu_tb_req_p->tb_size = data_pdu_size - pdu_remaining_size; //#warning "why 3000: changed to RLC_SDU_MAX_SIZE " assert(pdu_tb_req_p->tb_size < RLC_SDU_MAX_SIZE ); - rlc_am_pdu_polling(ctxt_pP, rlc_pP, pdu_p, pdu_mngt_p->payload_size); + rlc_am_pdu_polling(ctxt_pP, rlc_pP, pdu_p, pdu_mngt_p->payload_size,true); //list_add_tail_eurecom (pdu_mem_p, &rlc_pP->segmentation_pdu_list); pdu_mngt_p->mem_block = pdu_mem_p; pdu_mngt_p->first_byte = (unsigned char*)pdu_p; pdu_mngt_p->header_and_payload_size = data_pdu_size - pdu_remaining_size; - pdu_mngt_p->retx_count = -1; + pdu_mngt_p->retx_count = 0; + pdu_mngt_p->retx_count_next = 0; + pdu_mngt_p->flags.retransmit = 0; + pdu_mngt_p->flags.transmitted = 1; + pdu_mngt_p->sn = RLC_AM_PREV_SN(rlc_pP->vt_s); - rlc_pP->retrans_num_pdus += 1; - rlc_pP->retrans_num_bytes += pdu_mngt_p->header_and_payload_size; + //TBC: What for resetting local pointers at the end ?? pdu_p = NULL; pdu_mem_p = NULL; //nb_bytes_to_transmit = nb_bytes_to_transmit - data_pdu_size; nb_bytes_to_transmit = 0; // 1 PDU only - mem_block_t* copy = rlc_am_retransmit_get_copy (ctxt_pP, rlc_pP, (rlc_pP->vt_s-1) & RLC_AM_SN_MASK); + /* We need to copy the PDU to pass to MAC in order to keep it in the buffer for potential retransmissions */ + mem_block_t* copy = rlc_am_retransmit_get_copy (ctxt_pP, rlc_pP, RLC_AM_PREV_SN(rlc_pP->vt_s)); list_add_tail_eurecom (copy, &rlc_pP->segmentation_pdu_list); } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h old mode 100755 new mode 100644 index eba9dd6455..aa5cb6dceb --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segment.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_segment.h * \brief This file defines the prototypes of the functions dealing with the segmentation of PDCP SDUs. * \author GAUTHIER Lionel @@ -58,14 +51,14 @@ # endif # endif -/*! \fn void rlc_am_pdu_polling (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP) +/*! \fn void rlc_am_pdu_polling (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP,boolean_t is_new_pdu) * \brief Set or not the poll bit in the PDU header depending on RLC AM protocol variables. * \param[in] ctxt_pP Running context. * \param[in] rlcP RLC AM protocol instance pointer. * \param[in] pduP Pointer on the header of the PDU in order to be able to set the poll bit if necessary. * \param[in] payload_sizeP Size of the payload of the PDU. */ -protected_rlc_am_segment(void rlc_am_pdu_polling (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP);) +protected_rlc_am_segment(void rlc_am_pdu_polling (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t *const rlcP, rlc_am_pdu_sn_10_t *pduP, int16_t payload_sizeP,boolean_t is_new_pdu);) /*! \fn void rlc_am_segment_10 (const protocol_ctxt_t* const ctxt_pP, rlc_am_entity_t * const rlcP) * \brief Segment a PDU with 10 bits sequence number, based on segmentation information given by MAC (size to transmit). diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c old mode 100755 new mode 100644 index 59f5180e2c..1da5bbc441 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c @@ -1,31 +1,25 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +#if 0 #define RLC_AM_MODULE 1 #define RLC_AM_SEGMENT_HOLES_C 1 //----------------------------------------------------------------------------- @@ -39,7 +33,7 @@ void rlc_am_clear_holes ( rlc_am_entity_t *const rlc_pP, const rlc_sn_t snP) { - rlc_pP->pdu_retrans_buffer[snP].num_holes = 0; + rlc_pP->tx_data_pdu_buffer[snP].num_holes = 0; } //----------------------------------------------------------------------------- void rlc_am_shift_down_holes ( @@ -50,12 +44,12 @@ void rlc_am_shift_down_holes ( { int i; - for (i=indexP; i < rlc_pP->pdu_retrans_buffer[snP].num_holes - 1; i++) { - rlc_pP->pdu_retrans_buffer[snP].hole_so_start[i] = rlc_pP->pdu_retrans_buffer[snP].hole_so_start[i+1]; - rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i] = rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i+1]; + for (i=indexP; i < rlc_pP->tx_data_pdu_buffer[snP].num_holes - 1; i++) { + rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[i] = rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[i+1]; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i] = rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i+1]; } - rlc_pP->pdu_retrans_buffer[snP].num_holes = rlc_pP->pdu_retrans_buffer[snP].num_holes - 1; + rlc_pP->tx_data_pdu_buffer[snP].num_holes = rlc_pP->tx_data_pdu_buffer[snP].num_holes - 1; } //----------------------------------------------------------------------------- void rlc_am_shift_up_holes ( @@ -67,13 +61,13 @@ void rlc_am_shift_up_holes ( // shift include indexP int i; - for (i=rlc_pP->pdu_retrans_buffer[snP].num_holes; i > indexP; i--) { - rlc_pP->pdu_retrans_buffer[snP].hole_so_start[i] = rlc_pP->pdu_retrans_buffer[snP].hole_so_start[i-1]; - rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i] = rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i-1]; + for (i=rlc_pP->tx_data_pdu_buffer[snP].num_holes; i > indexP; i--) { + rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[i] = rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[i-1]; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i] = rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i-1]; } - rlc_pP->pdu_retrans_buffer[snP].num_holes = rlc_pP->pdu_retrans_buffer[snP].num_holes + 1; - assert(rlc_pP->pdu_retrans_buffer[snP].num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU); + rlc_pP->tx_data_pdu_buffer[snP].num_holes = rlc_pP->tx_data_pdu_buffer[snP].num_holes + 1; + assert(rlc_pP->tx_data_pdu_buffer[snP].num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU); } //----------------------------------------------------------------------------- void rlc_am_remove_hole ( @@ -86,81 +80,81 @@ void rlc_am_remove_hole ( int i; #if TRACE_RLC_AM_HOLE LOG_D(RLC, - PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] REMOVE HOLE SN %04d so_startP %05d so_stopP %05d rlc_pP->pdu_retrans_buffer[snP].nack_so_start %05d rlc_pP->pdu_retrans_buffer[snP].nack_so_stop %05d\n", + PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] REMOVE HOLE SN %04d so_startP %05d so_stopP %05d rlc_pP->tx_data_pdu_buffer[snP].nack_so_start %05d rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop %05d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP, so_startP, so_stopP, - rlc_pP->pdu_retrans_buffer[snP].nack_so_start, - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop); + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start, + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop); #endif assert(so_startP <= so_stopP); - if (rlc_pP->pdu_retrans_buffer[snP].num_holes == 0) { - assert(so_startP == rlc_pP->pdu_retrans_buffer[snP].nack_so_start); - assert(so_stopP <= rlc_pP->pdu_retrans_buffer[snP].nack_so_stop); + if (rlc_pP->tx_data_pdu_buffer[snP].num_holes == 0) { + assert(so_startP == rlc_pP->tx_data_pdu_buffer[snP].nack_so_start); + assert(so_stopP <= rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop); #if TRACE_RLC_AM_HOLE LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] REMOVE HOLE SN %04d MODIFIED nack_so_start %05d->%05d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP, - rlc_pP->pdu_retrans_buffer[snP].nack_so_start, + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start, so_stopP+1); #endif - rlc_pP->pdu_retrans_buffer[snP].nack_so_start = so_stopP+1; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start = so_stopP+1; - if (rlc_pP->pdu_retrans_buffer[snP].nack_so_start >= rlc_pP->pdu_retrans_buffer[snP].nack_so_stop) { - rlc_pP->pdu_retrans_buffer[snP].nack_so_start = 0; - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop = 0x7FFF; + if (rlc_pP->tx_data_pdu_buffer[snP].nack_so_start >= rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop) { + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start = 0; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop = 0x7FFF; } } else { // normally should be removed in increasing order... - for (i = 0; i < rlc_pP->pdu_retrans_buffer[snP].num_holes; i++) { - if (so_startP <= rlc_pP->pdu_retrans_buffer[snP].hole_so_start[i]) { - if (so_stopP >= rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i]) { + for (i = 0; i < rlc_pP->tx_data_pdu_buffer[snP].num_holes; i++) { + if (so_startP <= rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[i]) { + if (so_stopP >= rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i]) { rlc_am_shift_down_holes(ctxt_pP, rlc_pP, snP, i); i = i - 1; } else { - rlc_pP->pdu_retrans_buffer[snP].hole_so_start[i] = so_stopP; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[i] = so_stopP; - if (rlc_pP->pdu_retrans_buffer[snP].num_holes == 0) { - rlc_pP->pdu_retrans_buffer[snP].nack_so_start = 0; - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop = 0x7FFF; + if (rlc_pP->tx_data_pdu_buffer[snP].num_holes == 0) { + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start = 0; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop = 0x7FFF; } else { - rlc_pP->pdu_retrans_buffer[snP].nack_so_start = rlc_pP->pdu_retrans_buffer[snP].hole_so_start[0]; - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop = rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[rlc_pP->pdu_retrans_buffer[snP].num_holes - 1]; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start = rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[0]; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop = rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[rlc_pP->tx_data_pdu_buffer[snP].num_holes - 1]; } #if TRACE_RLC_AM_HOLE LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] REMOVE HOLE SN %04d NOW nack_so_start %05d nack_so_stop %05d num holes %d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP, - rlc_pP->pdu_retrans_buffer[snP].nack_so_start, - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop, - rlc_pP->pdu_retrans_buffer[snP].num_holes); + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start, + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop, + rlc_pP->tx_data_pdu_buffer[snP].num_holes); #endif return; } - } else if (so_startP > rlc_pP->pdu_retrans_buffer[snP].hole_so_start[i]) { - if (so_startP <= rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i]) { - if (so_stopP < rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i]) { + } else if (so_startP > rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[i]) { + if (so_startP <= rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i]) { + if (so_stopP < rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i]) { // BAD CASE: 1 HOLE IS SPLITTED IN 2 HOLES rlc_am_shift_up_holes(ctxt_pP, rlc_pP, snP, i+1); - rlc_pP->pdu_retrans_buffer[snP].hole_so_start[i+1] = so_startP+1; - rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i+1] = rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i]; - rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i] = so_startP - 1; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[i+1] = so_startP+1; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i+1] = rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i]; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i] = so_startP - 1; } else { - rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i] = so_startP; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i] = so_startP; } } } } - if (rlc_pP->pdu_retrans_buffer[snP].num_holes == 0) { - rlc_pP->pdu_retrans_buffer[snP].nack_so_start = 0; - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop = 0x7FFF; + if (rlc_pP->tx_data_pdu_buffer[snP].num_holes == 0) { + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start = 0; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop = 0x7FFF; } else { - rlc_pP->pdu_retrans_buffer[snP].nack_so_start = rlc_pP->pdu_retrans_buffer[snP].hole_so_start[0]; - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop = rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[rlc_pP->pdu_retrans_buffer[snP].num_holes - 1]; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start = rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[0]; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop = rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[rlc_pP->tx_data_pdu_buffer[snP].num_holes - 1]; } } @@ -168,11 +162,11 @@ void rlc_am_remove_hole ( LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] REMOVE HOLE SN %04d NOW nack_so_start %05d nack_so_stop %05d num holes %d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP, - rlc_pP->pdu_retrans_buffer[snP].nack_so_start, - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop, - rlc_pP->pdu_retrans_buffer[snP].num_holes); + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start, + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop, + rlc_pP->tx_data_pdu_buffer[snP].num_holes); #endif - assert(rlc_pP->pdu_retrans_buffer[snP].nack_so_start < rlc_pP->pdu_retrans_buffer[snP].payload_size); + assert(rlc_pP->tx_data_pdu_buffer[snP].nack_so_start < rlc_pP->tx_data_pdu_buffer[snP].payload_size); } //----------------------------------------------------------------------------- void rlc_am_get_next_hole ( @@ -182,9 +176,9 @@ void rlc_am_get_next_hole ( sdu_size_t* const so_startP, sdu_size_t* const so_stopP) { - if (rlc_pP->pdu_retrans_buffer[snP].num_holes == 0) { - *so_startP = rlc_pP->pdu_retrans_buffer[snP].nack_so_start; - *so_stopP = rlc_pP->pdu_retrans_buffer[snP].nack_so_stop; + if (rlc_pP->tx_data_pdu_buffer[snP].num_holes == 0) { + *so_startP = rlc_pP->tx_data_pdu_buffer[snP].nack_so_start; + *so_stopP = rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop; #if TRACE_RLC_AM_HOLE LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] rlc_am_get_next_hole(SN %04d) %05d->%05d (NUM HOLES == 0)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), @@ -193,15 +187,15 @@ void rlc_am_get_next_hole ( *so_stopP); #endif } else { - *so_startP = rlc_pP->pdu_retrans_buffer[snP].hole_so_start[0]; - *so_stopP = rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[0]; + *so_startP = rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[0]; + *so_stopP = rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[0]; #if TRACE_RLC_AM_HOLE LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] rlc_am_get_next_hole(SN %04d) %05d->%05d (NUM HOLES == %d)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP, *so_startP, *so_stopP, - rlc_pP->pdu_retrans_buffer[snP].num_holes); + rlc_pP->tx_data_pdu_buffer[snP].num_holes); #endif } } @@ -221,33 +215,33 @@ void rlc_am_add_hole ( // if global NACK - if ((so_startP == 0) && ((so_stopP == 0x7FFF) || (so_stopP == rlc_pP->pdu_retrans_buffer[snP].payload_size - 1))) { - rlc_pP->pdu_retrans_buffer[snP].num_holes = 0; - rlc_pP->pdu_retrans_buffer[snP].nack_so_start = so_startP; - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop = so_stopP; + if ((so_startP == 0) && ((so_stopP == 0x7FFF) || (so_stopP == rlc_pP->tx_data_pdu_buffer[snP].payload_size - 1))) { + rlc_pP->tx_data_pdu_buffer[snP].num_holes = 0; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start = so_startP; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop = so_stopP; #if TRACE_RLC_AM_HOLE LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] SN %04d GLOBAL NACK 0->%05d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), snP, so_stopP); #endif - assert(rlc_pP->pdu_retrans_buffer[snP].nack_so_start < rlc_pP->pdu_retrans_buffer[snP].payload_size); + assert(rlc_pP->tx_data_pdu_buffer[snP].nack_so_start < rlc_pP->tx_data_pdu_buffer[snP].payload_size); return; } if (so_stopP == 0x7FFF) { - so_stopP = rlc_pP->pdu_retrans_buffer[snP].payload_size - 1; + so_stopP = rlc_pP->tx_data_pdu_buffer[snP].payload_size - 1; } // first hole - if (rlc_pP->pdu_retrans_buffer[snP].num_holes == 0) { - rlc_pP->pdu_retrans_buffer[snP].hole_so_start[0] = so_startP; - rlc_pP->pdu_retrans_buffer[snP].hole_so_stop [0] = so_stopP; + if (rlc_pP->tx_data_pdu_buffer[snP].num_holes == 0) { + rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[0] = so_startP; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop [0] = so_stopP; - rlc_pP->pdu_retrans_buffer[snP].num_holes = 1; + rlc_pP->tx_data_pdu_buffer[snP].num_holes = 1; - rlc_pP->pdu_retrans_buffer[snP].nack_so_start = so_startP; - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop = so_stopP; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start = so_startP; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop = so_stopP; #if TRACE_RLC_AM_HOLE LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] FIRST HOLE SN %04d GLOBAL NACK %05d->%05d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), @@ -255,44 +249,44 @@ void rlc_am_add_hole ( so_startP, so_stopP); #endif - assert(rlc_pP->pdu_retrans_buffer[snP].nack_so_start < rlc_pP->pdu_retrans_buffer[snP].payload_size); + assert(rlc_pP->tx_data_pdu_buffer[snP].nack_so_start < rlc_pP->tx_data_pdu_buffer[snP].payload_size); return; } hole_index = 0; - while (hole_index < rlc_pP->pdu_retrans_buffer[snP].num_holes) { - if (so_stopP < rlc_pP->pdu_retrans_buffer[snP].hole_so_start[hole_index]) { - assert(rlc_pP->pdu_retrans_buffer[snP].num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU); + while (hole_index < rlc_pP->tx_data_pdu_buffer[snP].num_holes) { + if (so_stopP < rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[hole_index]) { + assert(rlc_pP->tx_data_pdu_buffer[snP].num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU); if (hole_index > 0) { - assert(so_startP > rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[hole_index-1]); + assert(so_startP > rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[hole_index-1]); } - for (i=rlc_pP->pdu_retrans_buffer[snP].num_holes; i >= hole_index; i--) { - rlc_pP->pdu_retrans_buffer[snP].hole_so_start[i] = rlc_pP->pdu_retrans_buffer[snP].hole_so_start[i-1]; - rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i] = rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[i-1]; + for (i=rlc_pP->tx_data_pdu_buffer[snP].num_holes; i >= hole_index; i--) { + rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[i] = rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[i-1]; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i] = rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[i-1]; } - rlc_pP->pdu_retrans_buffer[snP].hole_so_start[hole_index] = so_startP; - rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[hole_index] = so_stopP; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[hole_index] = so_startP; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[hole_index] = so_stopP; // update nack "window" vars nack_so_start, nack_so_stop if (hole_index == 0) { - rlc_pP->pdu_retrans_buffer[snP].nack_so_start = so_startP; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_start = so_startP; } - rlc_pP->pdu_retrans_buffer[snP].num_holes += 1; + rlc_pP->tx_data_pdu_buffer[snP].num_holes += 1; #if TRACE_RLC_AM_HOLE LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] INSERT %d th HOLE SN %04d GLOBAL NACK %05d->%05d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->pdu_retrans_buffer[snP].num_holes, + rlc_pP->tx_data_pdu_buffer[snP].num_holes, snP, so_startP, so_stopP); #endif - assert(rlc_pP->pdu_retrans_buffer[snP].nack_so_start < rlc_pP->pdu_retrans_buffer[snP].payload_size); - assert(rlc_pP->pdu_retrans_buffer[snP].num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU); + assert(rlc_pP->tx_data_pdu_buffer[snP].nack_so_start < rlc_pP->tx_data_pdu_buffer[snP].payload_size); + assert(rlc_pP->tx_data_pdu_buffer[snP].num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU); return; } @@ -300,17 +294,17 @@ void rlc_am_add_hole ( } // if here insert to the "tail" - if (so_startP > rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[hole_index - 1]) { - assert(rlc_pP->pdu_retrans_buffer[snP].num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU); - rlc_pP->pdu_retrans_buffer[snP].hole_so_start[hole_index] = so_startP; - rlc_pP->pdu_retrans_buffer[snP].hole_so_stop[hole_index] = so_stopP; - rlc_pP->pdu_retrans_buffer[snP].num_holes += 1; + if (so_startP > rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[hole_index - 1]) { + assert(rlc_pP->tx_data_pdu_buffer[snP].num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU); + rlc_pP->tx_data_pdu_buffer[snP].hole_so_start[hole_index] = so_startP; + rlc_pP->tx_data_pdu_buffer[snP].hole_so_stop[hole_index] = so_stopP; + rlc_pP->tx_data_pdu_buffer[snP].num_holes += 1; // update nack "window" vars nack_so_start, nack_so_stop - rlc_pP->pdu_retrans_buffer[snP].nack_so_stop = so_stopP; + rlc_pP->tx_data_pdu_buffer[snP].nack_so_stop = so_stopP; #if TRACE_RLC_AM_HOLE LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[HOLE] INSERT THE %d th LAST HOLE SN %04d GLOBAL NACK %05d->%05d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->pdu_retrans_buffer[snP].num_holes, + rlc_pP->tx_data_pdu_buffer[snP].num_holes, snP, so_startP, so_stopP); @@ -319,6 +313,7 @@ void rlc_am_add_hole ( assert(1==2); } - assert(rlc_pP->pdu_retrans_buffer[snP].num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU); - assert(rlc_pP->pdu_retrans_buffer[snP].nack_so_start < rlc_pP->pdu_retrans_buffer[snP].payload_size); + assert(rlc_pP->tx_data_pdu_buffer[snP].num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU); + assert(rlc_pP->tx_data_pdu_buffer[snP].nack_so_start < rlc_pP->tx_data_pdu_buffer[snP].payload_size); } +#endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h old mode 100755 new mode 100644 index db171d3e3e..7c22697ac4 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_segments_holes.h * \brief This file defines the prototypes of the functions dealing with the re-segmentation of RLC PDUs stored in the retransmission buffer,. * \author GAUTHIER Lionel @@ -39,7 +32,7 @@ * @ingroup _rlc_am_internal_segment_impl_ * @{ */ - +#if 0 #ifndef __RLC_AM_SEGMENT_HOLES_H__ # define __RLC_AM_SEGMENT_HOLES_H__ //----------------------------------------------------------------------------- @@ -115,3 +108,4 @@ protected_rlc_am_segments_holes(void rlc_am_add_hole ( sdu_size_t so_stopP);) /** @} */ #endif +#endif diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c old mode 100755 new mode 100644 index 9c46297ad6..092c7c65f1 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_STATUS_REPORT_C 1 //----------------------------------------------------------------------------- @@ -275,6 +268,14 @@ rlc_am_receive_process_control_pdu( { rlc_am_pdu_sn_10_t *rlc_am_pdu_sn_10_p = (rlc_am_pdu_sn_10_t*)*first_byte_ppP; sdu_size_t initial_pdu_size = *tb_size_in_bytes_pP; + rlc_sn_t ack_sn = RLC_AM_NEXT_SN(rlc_pP->vt_a); + rlc_sn_t sn_cursor = rlc_pP->vt_a; + rlc_sn_t vt_a_new = rlc_pP->vt_a; + rlc_sn_t sn_data_cnf; + rlc_sn_t nack_sn,prev_nack_sn; + sdu_size_t data_cnf_so_stop = 0x7FFF; + unsigned int nack_index; + boolean_t status = TRUE; if (rlc_am_get_control_pdu_infos(rlc_am_pdu_sn_10_p, tb_size_in_bytes_pP, &rlc_pP->control_pdu_info) >= 0) { @@ -287,11 +288,7 @@ rlc_am_receive_process_control_pdu( rlc_pP->control_pdu_info.ack_sn); rlc_am_display_control_pdu_infos(&rlc_pP->control_pdu_info); - rlc_sn_t ack_sn = rlc_pP->control_pdu_info.ack_sn; - rlc_sn_t sn_cursor = rlc_pP->vt_a; - rlc_sn_t nack_sn; - unsigned int nack_index; - + ack_sn = rlc_pP->control_pdu_info.ack_sn; // 5.2.1 Retransmission // // The transmitting side of an AM RLC entity can receive a negative acknowledgement (notification of reception failure @@ -315,69 +312,133 @@ rlc_am_receive_process_control_pdu( assert(ack_sn < RLC_AM_SN_MODULO); assert(rlc_pP->control_pdu_info.num_nack < RLC_AM_MAX_NACK_IN_STATUS_PDU); - if (rlc_am_in_tx_window(ctxt_pP, rlc_pP, ack_sn) > 0) { - rlc_pP->num_nack_so = 0; - rlc_pP->num_nack_sn = 0; - + /* Note : ackSn can be equal to current vtA only in case the status pdu contains a list of nack_sn with same value = vtA with SOStart/SOEnd */ + /* and meaning the report is not complete due to not enough ressources to fill all SOStart/SOEnd of this NACK_SN */ + if (RLC_AM_DIFF_SN(rlc_pP->vt_s,rlc_pP->vt_a) >= RLC_AM_DIFF_SN(ack_sn,rlc_pP->vt_a)) + { if (rlc_pP->control_pdu_info.num_nack == 0) { while (sn_cursor != ack_sn) { - if (sn_cursor == rlc_pP->poll_sn) { - rlc_am_stop_and_reset_timer_poll_retransmit(ctxt_pP, rlc_pP); - } - - rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor); - sn_cursor = (sn_cursor + 1) & RLC_AM_SN_MASK; + rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor,TRUE); + sn_cursor = RLC_AM_NEXT_SN(sn_cursor); } + + vt_a_new = ack_sn; + sn_data_cnf = RLC_AM_PREV_SN(vt_a_new); } else { nack_index = 0; nack_sn = rlc_pP->control_pdu_info.nack_list[nack_index].nack_sn; + prev_nack_sn = 0x3FFF; - while (sn_cursor != ack_sn) { - if (sn_cursor == rlc_pP->poll_sn) { - rlc_am_stop_and_reset_timer_poll_retransmit(ctxt_pP, rlc_pP); - } + while (sn_cursor != nack_sn) { + rlc_am_ack_pdu(ctxt_pP, rlc_pP, sn_cursor,TRUE); + sn_cursor = RLC_AM_NEXT_SN(sn_cursor); + } + vt_a_new = nack_sn; + + // catch DataCfn + rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer_p = &rlc_pP->tx_data_pdu_buffer[nack_sn % RLC_AM_WINDOW_SIZE]; + if (tx_data_pdu_buffer_p->retx_payload_size == tx_data_pdu_buffer_p->payload_size) { + sn_data_cnf = RLC_AM_PREV_SN(nack_sn); + } + else if (tx_data_pdu_buffer_p->nack_so_start != 0) { + sn_data_cnf = nack_sn; + data_cnf_so_stop = tx_data_pdu_buffer_p->nack_so_start - 1; + } + else { + sn_data_cnf = RLC_AM_PREV_SN(nack_sn); + } + + + while ((sn_cursor != ack_sn) && (status)) { if (sn_cursor != nack_sn) { rlc_am_ack_pdu(ctxt_pP, rlc_pP, - sn_cursor); + sn_cursor, + FALSE); } else { - rlc_am_nack_pdu (ctxt_pP, + status = rlc_am_nack_pdu (ctxt_pP, rlc_pP, - sn_cursor, + nack_sn, + prev_nack_sn, rlc_pP->control_pdu_info.nack_list[nack_index].so_start, rlc_pP->control_pdu_info.nack_list[nack_index].so_end); nack_index = nack_index + 1; + prev_nack_sn = nack_sn; - if (nack_index == rlc_pP->control_pdu_info.num_nack) { - nack_sn = 0xFFFF; // value never reached by sn - } else { - nack_sn = rlc_pP->control_pdu_info.nack_list[nack_index].nack_sn; + if (nack_index < rlc_pP->control_pdu_info.num_nack) { + nack_sn = rlc_pP->control_pdu_info.nack_list[nack_index].nack_sn; + } + else if (nack_sn != ack_sn) { + /* general case*/ + nack_sn = ack_sn; + } + else { + /*specific case when the sender did not have enough TBS to fill all SOStart SOEnd for this NACK_SN */ + break; } } - - if ((nack_index < rlc_pP->control_pdu_info.num_nack) && (nack_index > 0)) { - if (rlc_pP->control_pdu_info.nack_list[nack_index].nack_sn != rlc_pP->control_pdu_info.nack_list[nack_index-1].nack_sn) { + if (prev_nack_sn != nack_sn) { + /* do not increment sn_cursor in case of several informations for the same nack_sn */ sn_cursor = (sn_cursor + 1) & RLC_AM_SN_MASK; - } - } else { - sn_cursor = (sn_cursor + 1) & RLC_AM_SN_MASK; } } } + + } else { - LOG_N(RLC, PROTOCOL_RLC_AM_CTXT_FMT" WARNING CONTROL PDU ACK SN OUT OF WINDOW\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); + LOG_N(RLC, PROTOCOL_RLC_AM_CTXT_FMT" WARNING CONTROL PDU ACK SN %d OUT OF WINDOW vtA=%d vtS=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),ack_sn,rlc_pP->vt_a,rlc_pP->vt_s); + status = FALSE; } } else { LOG_W(RLC, PROTOCOL_RLC_AM_CTXT_FMT" ERROR IN DECODING CONTROL PDU\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); + status = FALSE; + } + + if (status) { + /* Check for Stopping TpollReTx */ + if ((rlc_pP->poll_sn != RLC_SN_UNDEFINED) && + (RLC_AM_DIFF_SN(ack_sn,rlc_pP->vt_a) > RLC_AM_DIFF_SN(rlc_pP->poll_sn,rlc_pP->vt_a))) { + rlc_am_stop_and_reset_timer_poll_retransmit(ctxt_pP, rlc_pP); + rlc_pP->poll_sn = RLC_SN_UNDEFINED; + } + + //TODO : this part does not cover all cases of Data Cnf and move it at the end of Status PDU processing + sn_cursor = rlc_pP->vt_a; + + // Fix Issue 238 : check sn_data_cnf has been transmitted + if ((rlc_pP->tx_data_pdu_buffer[sn_data_cnf % RLC_AM_WINDOW_SIZE].flags.transmitted) && + (rlc_pP->tx_data_pdu_buffer[sn_data_cnf % RLC_AM_WINDOW_SIZE].sn == sn_data_cnf)) { + /* Handle all acked PDU up to and excluding sn_data_cnf */ + while (sn_cursor != sn_data_cnf) { + rlc_am_pdu_sdu_data_cnf(ctxt_pP,rlc_pP,sn_cursor); + sn_cursor = RLC_AM_NEXT_SN(sn_cursor); + } + + // Handle last SN. TO DO : case of PDU partially ACKED with SDU to be data conf + if (data_cnf_so_stop == 0x7FFF) { + rlc_am_pdu_sdu_data_cnf(ctxt_pP,rlc_pP,sn_data_cnf); + } + + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" RECEIVE STATUS PDU ACK_SN=%d NewvtA=%d OldvtA=%d SnDataCnf=%d DataCnfSOStop=%d vtS=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),ack_sn,vt_a_new,rlc_pP->vt_a,sn_data_cnf,data_cnf_so_stop,rlc_pP->vt_s); + } + else { + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT" RECEIVE STATUS PDU WITH NO SDU CNF ACK_SN=%d NewvtA=%d OldvtA=%d vtS=%d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),ack_sn,vt_a_new,rlc_pP->vt_a,rlc_pP->vt_s); + } + + /* Update vtA and vtMS */ + rlc_pP->vt_a = vt_a_new; + rlc_pP->vt_ms = (rlc_pP->vt_a + RLC_AM_WINDOW_SIZE) & RLC_AM_SN_MASK; } *first_byte_ppP = (uint8_t*)((uint64_t)*first_byte_ppP + initial_pdu_size - *tb_size_in_bytes_pP); - free_mem_block(tb_pP); + free_mem_block(tb_pP, __func__); rlc_am_tx_buffer_display(ctxt_pP, rlc_pP, NULL); } //----------------------------------------------------------------------------- @@ -456,6 +517,357 @@ rlc_am_send_status_pdu( // - set the ACK_SN to the SN of the next not received RLC Data PDU which is not indicated as missing in the // resulting STATUS PDU. + signed int nb_bits_to_transmit = rlc_pP->nb_bytes_requested_by_mac << 3; + // minimum header size in bits to be transmitted: D/C + CPT + ACK_SN + E1 + signed int nb_bits_transmitted = RLC_AM_PDU_D_C_BITS + RLC_AM_STATUS_PDU_CPT_LENGTH + RLC_AM_SN_BITS + RLC_AM_PDU_E_BITS; + rlc_am_control_pdu_info_t control_pdu_info; + rlc_am_pdu_info_t *pdu_info_cursor_p = NULL; + rlc_sn_t sn_cursor = 0; + rlc_sn_t sn_nack = rlc_pP->vr_r; + mem_block_t *cursor_p = rlc_pP->receiver_buffer.head; + int all_segments_received = 0; + int waited_so = 0; + mem_block_t *tb_p = NULL; + sdu_size_t pdu_size = 0; + boolean_t status_report_completed = false; + boolean_t segment_loop_end = false; + + memset(&control_pdu_info, 0, sizeof(rlc_am_control_pdu_info_t)); + +#if TRACE_RLC_AM_STATUS_CREATION + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] nb_bits_to_transmit %d (15 already allocated for header)\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + nb_bits_to_transmit); + rlc_am_rx_list_display(rlc_pP, " DISPLAY BEFORE CONSTRUCTION OF STATUS REPORT"); +#endif + + /* Handle no NACK first */ + if (rlc_pP->vr_r == rlc_pP->vr_ms) { + + control_pdu_info.ack_sn = rlc_pP->vr_ms; + status_report_completed = true; +#if TRACE_RLC_AM_STATUS_CREATION + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] LINE %d ALL ACK WITH ACK_SN %04d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + __LINE__, + rlc_pP->vr_ms); +#endif + } + else if ((cursor_p != NULL) && ((nb_bits_transmitted + RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1)) <= nb_bits_to_transmit)) { + + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + sn_cursor = pdu_info_cursor_p->sn; + + /* Set E1 bit for the presence of first NACK_SN/E1/E2 */ + control_pdu_info.e1 = 1; + + // 12 bits = size of NACK_SN field + E1, E2 bits + // 42 bits = size of NACK_SN field + SO_START, SO_END fields, E1, E2 bits + while ((!status_report_completed) && (RLC_AM_DIFF_SN(sn_nack,rlc_pP->vr_r) < RLC_AM_DIFF_SN(rlc_pP->vr_ms,rlc_pP->vr_r)) + && (cursor_p != NULL) && (nb_bits_transmitted <= nb_bits_to_transmit)) { + + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + sn_cursor = pdu_info_cursor_p->sn; + all_segments_received = ((rlc_am_rx_pdu_management_t*)(cursor_p->data))->all_segments_received; + + /* First fill NACK_SN with each missing PDU between current sn_nack and sn_cursor */ + while ((sn_nack != sn_cursor) && (RLC_AM_DIFF_SN(sn_nack,rlc_pP->vr_r) < RLC_AM_DIFF_SN(rlc_pP->vr_ms,rlc_pP->vr_r))) { + if (nb_bits_transmitted + RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1) <= nb_bits_to_transmit) { + /* Fill NACK_SN infos */ + control_pdu_info.nack_list[control_pdu_info.num_nack].nack_sn = sn_nack; + control_pdu_info.nack_list[control_pdu_info.num_nack].so_start = 0; + control_pdu_info.nack_list[control_pdu_info.num_nack].so_end = RLC_AM_STATUS_PDU_SO_END_ALL_BYTES; + control_pdu_info.nack_list[control_pdu_info.num_nack].e2 = 0; + /* Set E1 for next NACK_SN. The last one will be cleared */ + control_pdu_info.nack_list[control_pdu_info.num_nack].e1 = 1; + control_pdu_info.num_nack += 1; + nb_bits_transmitted += (RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1)); +#if TRACE_RLC_AM_STATUS_CREATION + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] LINE %d PREPARE SENDING NACK %04d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + __LINE__, + sn_nack); +#endif + sn_nack = RLC_AM_NEXT_SN(sn_nack); + } + else { + /* Not enough UL TBS*/ + /* latest value of sn_nack shall be used as ACK_SN */ + control_pdu_info.ack_sn = sn_nack; + status_report_completed = true; +#if TRACE_RLC_AM_STATUS_CREATION + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] LINE %d NOT ENOUGH TBS STOP WITH ACK_SN %04d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + __LINE__, + sn_nack); +#endif + break; + } + } + + if (sn_nack == rlc_pP->vr_ms) { + break; + } + + /* Now process all Segments of sn_cursor if PDU not fully received */ + if ((!status_report_completed) && (all_segments_received == 0) && (sn_cursor != rlc_pP->vr_ms)) { + AssertFatal (sn_nack == sn_cursor, "RLC AM Tx Status PDU Data sn_nack=%d and sn_cursor=%d should be equal LcId=%d\n",sn_nack,sn_cursor, rlc_pP->channel_id); + + /* First ensure there is enough TBS for at least 1 SOStart/SOEnd, else break */ + if ((nb_bits_transmitted + RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1) + (RLC_AM_STATUS_PDU_SO_LENGTH << 1)) <= nb_bits_to_transmit) { + /* Init loop flags */ + /* Check lsf */ + segment_loop_end = (pdu_info_cursor_p->lsf == 1); + + /* Init first SO Start according to first segment */ + if (pdu_info_cursor_p->so) { + /* Fill the first SO */ + control_pdu_info.nack_list[control_pdu_info.num_nack].nack_sn = sn_cursor; + control_pdu_info.nack_list[control_pdu_info.num_nack].so_start = 0; + control_pdu_info.nack_list[control_pdu_info.num_nack].so_end = pdu_info_cursor_p->so - 1; + control_pdu_info.nack_list[control_pdu_info.num_nack].e2 = 1; + /* Set E1 for next NACK_SN. The last one will be cleared */ + control_pdu_info.nack_list[control_pdu_info.num_nack].e1 = 1; + control_pdu_info.num_nack += 1; + nb_bits_transmitted += (RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1) + (RLC_AM_STATUS_PDU_SO_LENGTH << 1)); +#if TRACE_RLC_AM_STATUS_CREATION + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] LINE %d PREPARE SENDING NACK %04d SO START %05d SO END %05d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + __LINE__, + sn_cursor, + 0, + pdu_info_cursor_p->so - 1); +#endif + waited_so = pdu_info_cursor_p->so + pdu_info_cursor_p->payload_size; + } + else { + waited_so = pdu_info_cursor_p->payload_size; + } + + /* Go to next segment */ + cursor_p = cursor_p->next; + if (cursor_p != NULL) + { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + + /* Find the first discontinuity and then fill SOStart/SOEnd */ + while (!segment_loop_end) { + if ((cursor_p != NULL) && (pdu_info_cursor_p->sn == sn_cursor)) { + + /* PDU segment is for the same SN*/ + /* Check lsf */ + segment_loop_end = (pdu_info_cursor_p->lsf == 1); + + if (waited_so < pdu_info_cursor_p->so) { + /* SO is greater than previous received portion : gap identified to fill */ + if ((nb_bits_transmitted + RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1) + (RLC_AM_STATUS_PDU_SO_LENGTH << 1)) <= nb_bits_to_transmit) { + control_pdu_info.nack_list[control_pdu_info.num_nack].nack_sn = sn_cursor; + control_pdu_info.nack_list[control_pdu_info.num_nack].so_start = waited_so; + control_pdu_info.nack_list[control_pdu_info.num_nack].so_end = pdu_info_cursor_p->so - 1; + control_pdu_info.nack_list[control_pdu_info.num_nack].e2 = 1; + /* Set E1 for next NACK_SN. The last one will be cleared */ + control_pdu_info.nack_list[control_pdu_info.num_nack].e1 = 1; + control_pdu_info.num_nack += 1; + nb_bits_transmitted += (RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1) + (RLC_AM_STATUS_PDU_SO_LENGTH << 1)); +#if TRACE_RLC_AM_STATUS_CREATION + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] LINE %d PREPARE SENDING NACK %04d SO START %05d SO END %05d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + __LINE__, + sn_cursor, + waited_so, + pdu_info_cursor_p->so); +#endif + } + else { + /* Not enough resources to set a SOStart/SEnd, then set ACK_SN to current NACK_SN and stop Status PDU build */ + control_pdu_info.ack_sn = sn_cursor; + status_report_completed = true; + segment_loop_end = true; + break; + } + } + else { + /* contiguous segment: only update waited_so */ + /* Assuming so and payload_size updated according to duplication removal done at reception ... */ + waited_so += pdu_info_cursor_p->payload_size; + } + + /* Go to next received PDU or PDU Segment */ + cursor_p = cursor_p->next; + if (cursor_p != NULL) + { + pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; + } + + } //end if (cursor_p != NULL) && (pdu_info_cursor_p->sn == sn_cursor) + else { + /* Previous PDU segment was the last one and did not have lsf indication : fill the latest gap */ + if ((nb_bits_transmitted + RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1) + (RLC_AM_STATUS_PDU_SO_LENGTH << 1)) <= nb_bits_to_transmit) { + control_pdu_info.nack_list[control_pdu_info.num_nack].nack_sn = sn_cursor; + control_pdu_info.nack_list[control_pdu_info.num_nack].so_start = waited_so; + control_pdu_info.nack_list[control_pdu_info.num_nack].so_end = RLC_AM_STATUS_PDU_SO_END_ALL_BYTES; + control_pdu_info.nack_list[control_pdu_info.num_nack].e2 = 1; + /* Set E1 for next NACK_SN. The last one will be cleared */ + control_pdu_info.nack_list[control_pdu_info.num_nack].e1 = 1; + control_pdu_info.num_nack += 1; + nb_bits_transmitted += (RLC_AM_SN_BITS + (RLC_AM_PDU_E_BITS << 1) + (RLC_AM_STATUS_PDU_SO_LENGTH << 1)); +#if TRACE_RLC_AM_STATUS_CREATION + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] LINE %d PREPARE SENDING LAST NACK %04d SO START %05d SO END %05d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + __LINE__, + sn_cursor, + waited_so, + RLC_AM_STATUS_PDU_SO_END_ALL_BYTES); +#endif + } + else { + /* Not enough resources to set a SOStart/SEnd, then set ACK_SN to current NACK_SN and stop Status PDU build */ + control_pdu_info.ack_sn = sn_cursor; + status_report_completed = true; + } + + segment_loop_end = true; + } + } //end while (!segment_loop_end) + } // end if enough resource for transmitting at least one SOStart/SOEnd + else { + /* Not enough UL TBS to set at least one SOStart/SOEnd */ + /* latest value of sn_nack shall be used as ACK_SN */ + control_pdu_info.ack_sn = sn_nack; + status_report_completed = true; + } + } // end while on all PDU segments of sn_cursor + else { + /* Go to next received PDU or PDU segment with different SN */ + do { + cursor_p = cursor_p->next; + } while ((cursor_p != NULL) && (((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info.sn == sn_cursor)); + } + + /* Increment sn_nack except if sn_cursor = vrMS and if current SN was not fully received */ + if (RLC_AM_DIFF_SN(sn_cursor,rlc_pP->vr_r) < RLC_AM_DIFF_SN(rlc_pP->vr_ms,rlc_pP->vr_r)) { + sn_nack = RLC_AM_NEXT_SN(sn_cursor); + } + else { + sn_nack = rlc_pP->vr_ms; + } + + + } // End main while NACK_SN + + /* Clear E1 of last nack_sn entry */ + AssertFatal ((control_pdu_info.num_nack) || (all_segments_received == 0), "RLC AM Tx Status PDU Data Error no NACK_SN vrR=%d vrMS=%d lastSN_NACK=%d Completed=%d NbBytesAvailable=%d LcId=%d\n", + rlc_pP->vr_r,rlc_pP->vr_ms,sn_nack,status_report_completed,(nb_bits_to_transmit >> 3),rlc_pP->channel_id); + if (control_pdu_info.num_nack) { + control_pdu_info.nack_list[control_pdu_info.num_nack - 1].e1 = 0; + } + + + /* Set ACK_SN unless it was set before */ + if (!status_report_completed){ + + control_pdu_info.ack_sn = sn_nack; + } + + } else { + /* reception buffer empty or not enough TBS for filling at least 1 NACK_SN + E1 + E2 */ + control_pdu_info.ack_sn = rlc_pP->vr_r; +#if TRACE_RLC_AM_STATUS_CREATION + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] LINE %d PREPARE SENDING ACK %04d = VR(R)\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + __LINE__, + control_pdu_info.ack_sn); +#endif + } + + + //msg ("[FRAME %5u][%s][RLC_AM][MOD %u/%u][RB %u] nb_bits_to_transmit %d\n", + // rlc_pP->module_id, rlc_pP->rb_id, ctxt_pP->frame,nb_bits_to_transmit); + +#if TRACE_RLC_AM_STATUS_CREATION + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] LINE %d PREPARE SENDING ACK %04d NUM NACK %d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + __LINE__, + control_pdu_info.ack_sn, + control_pdu_info.num_nack); +#endif + + + /* encode the control pdu */ + pdu_size = (nb_bits_transmitted + 7) >> 3; + AssertFatal (pdu_size <= rlc_pP->nb_bytes_requested_by_mac, "RLC AM Tx Status PDU Data size=%d bigger than remaining TBS=%d nb_bits_transmitted=%d LcId=%d\n", + pdu_size,rlc_pP->nb_bytes_requested_by_mac,nb_bits_transmitted, rlc_pP->channel_id); + + +#if TRACE_RLC_AM_STATUS_CREATION + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] LINE %d forecast pdu_size %d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + __LINE__, + pdu_size); +#endif + tb_p = get_free_mem_block(sizeof(struct mac_tb_req) + pdu_size, __func__); + memset(tb_p->data, 0, sizeof(struct mac_tb_req) + pdu_size); + //estimation only ((struct mac_tb_req*)(tb_p->data))->tb_size = pdu_size; + ((struct mac_tb_req*)(tb_p->data))->data_ptr = (uint8_t*)&(tb_p->data[sizeof(struct mac_tb_req)]); + + // warning reuse of pdu_size + // TODO : rlc_am_write_status_pdu should be rewritten as not very tested ... + pdu_size = rlc_am_write_status_pdu(ctxt_pP, rlc_pP,(rlc_am_pdu_sn_10_t*)(((struct mac_tb_req*)(tb_p->data))->data_ptr), &control_pdu_info); + ((struct mac_tb_req*)(tb_p->data))->tb_size = pdu_size; + //assert((((struct mac_tb_req*)(tb_p->data))->tb_size) < 3000); + +#if TRACE_RLC_AM_STATUS_CREATION + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[SEND-STATUS] SEND STATUS PDU SIZE %d, rlc_pP->nb_bytes_requested_by_mac %d, nb_bits_to_transmit>>3 %d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + pdu_size, + rlc_pP->nb_bytes_requested_by_mac, + nb_bits_to_transmit >> 3); +#endif + + AssertFatal (pdu_size == ((nb_bits_transmitted + 7) >> 3), "RLC AM Tx Status PDU Data encoding size=%d different than expected=%d LcId=%d\n", + pdu_size,((nb_bits_transmitted + 7) >> 3), rlc_pP->channel_id); + + // remaining bytes to transmit for RLC (retrans pdus and new data pdus) + rlc_pP->nb_bytes_requested_by_mac = rlc_pP->nb_bytes_requested_by_mac - pdu_size; + // put pdu in trans + list_add_head(tb_p, &rlc_pP->control_pdu_list); + rlc_pP->stat_tx_control_pdu += 1; + rlc_pP->stat_tx_control_bytes += pdu_size; + +} + + +#if 0 +//----------------------------------------------------------------------------- +void +rlc_am_send_status_pdu_backup( + const protocol_ctxt_t* const ctxt_pP, + rlc_am_entity_t *const rlc_pP +) +{ + // When STATUS reporting has been triggered, the receiving side of an AM RLC entity shall: + // - if t-StatusProhibit is not running: + // - at the first transmission opportunity indicated by lower layer, construct a STATUS PDU and deliver it to lower layer; + // - else: + // - at the first transmission opportunity indicated by lower layer after t-StatusProhibit expires, construct a single + // STATUS PDU even if status reporting was triggered several times while t-StatusProhibit was running and + // deliver it to lower layer; + // + // When a STATUS PDU has been delivered to lower layer, the receiving side of an AM RLC entity shall: + // - start t-StatusProhibit. + // + // When constructing a STATUS PDU, the AM RLC entity shall: + // - for the AMD PDUs with SN such that VR(R) <= SN < VR(MR) that has not been completely received yet, in + // increasing SN of PDUs and increasing byte segment order within PDUs, starting with SN = VR(R) up to + // the point where the resulting STATUS PDU still fits to the total size of RLC PDU(s) indicated by lower layer: + // - for an AMD PDU for which no byte segments have been received yet:: + // - include in the STATUS PDU a NACK_SN which is set to the SN of the AMD PDU; + // - for a continuous sequence of byte segments of a partly received AMD PDU that have not been received yet: + // - include in the STATUS PDU a set of NACK_SN, SOstart and SOend + // - set the ACK_SN to the SN of the next not received RLC Data PDU which is not indicated as missing in the + // resulting STATUS PDU. + signed int nb_bits_to_transmit = rlc_pP->nb_bytes_requested_by_mac << 3; rlc_am_control_pdu_info_t control_pdu_info; rlc_am_pdu_info_t *pdu_info_cursor_p = NULL; @@ -477,11 +889,12 @@ rlc_am_send_status_pdu( rlc_am_rx_list_display(rlc_pP, " DISPLAY BEFORE CONSTRUCTION OF STATUS REPORT"); #endif + if (cursor_p != NULL) { pdu_info_cursor_p = &((rlc_am_rx_pdu_management_t*)(cursor_p->data))->pdu_info; sn_cursor = pdu_info_cursor_p->sn; - while (rlc_am_in_rx_window(ctxt_pP, rlc_pP, sn_cursor) == 0) { + while (!(RLC_AM_SN_IN_WINDOW(sn_cursor, rlc_pP->vr_r))) { cursor_p = cursor_p->next; previous_sn_cursor = sn_cursor; @@ -737,7 +1150,7 @@ end_push_nack: __LINE__, pdu_size); #endif - tb_p = get_free_mem_block(sizeof(struct mac_tb_req) + pdu_size); + tb_p = get_free_mem_block(sizeof(struct mac_tb_req) + pdu_size, __func__); memset(tb_p->data, 0, sizeof(struct mac_tb_req) + pdu_size); //estimation only ((struct mac_tb_req*)(tb_p->data))->tb_size = pdu_size; ((struct mac_tb_req*)(tb_p->data))->data_ptr = (uint8_t*)&(tb_p->data[sizeof(struct mac_tb_req)]); @@ -764,3 +1177,5 @@ end_push_nack: rlc_pP->stat_tx_control_bytes += pdu_size; } +#endif + diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h old mode 100755 new mode 100644 index 6a44401701..e09189fcd6 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_status_report.h * \brief This file defines the prototypes of the functions dealing with the reading/writting of informations from/in RLC AM control PDUs, and the processing of received control PDUs. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h old mode 100755 new mode 100644 index 738952d3c6..147fd44d07 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_structs.h * \brief This file defines structures used inside the RLC AM. * \author GAUTHIER Lionel @@ -43,9 +36,7 @@ # include "list.h" # include "mem_block.h" # include "rlc_am_constants.h" -//#ifdef USER_MODE # include "mac_rlc_primitives.h" -//#endif //USER_MODE # include "mac_primitives.h" # include "rlc_primitives.h" /** @@ -95,9 +86,12 @@ typedef struct rlc_am_tx_sdu_management { * \brief Structure containing PDU variables related to its retransmission. */ typedef struct pdu_management_flags { + uint8_t transmitted:1; /*!< \brief Boolean telling that this PDU is not empty and has been at least transmitted once. */ uint8_t ack:1; /*!< \brief Boolean telling that this PDU has been acknowledged. */ + uint8_t nack:1; /*!< \brief Boolean telling that this PDU has been acknowledged negatively. */ uint8_t retransmit:1; /*!< \brief Boolean telling a retransmission is scheduled for this PDU. */ - uint8_t dummy:6; /*!< \brief Free bits. */ + uint8_t max_retransmit:1; /*!< \brief Boolean telling max retransmission has been hit for this PDU. */ + uint8_t dummy:3; /*!< \brief Free bits. */ } pdu_management_flags_t; @@ -114,15 +108,17 @@ typedef struct rlc_am_tx_data_pdu_management { sdu_size_t hole_so_start [RLC_AM_MAX_HOLES_REPORT_PER_PDU]; /*!< \brief Array containing the start segment offsets for marking a hole (negative acknowledged area) in the PDU. */ sdu_size_t hole_so_stop [RLC_AM_MAX_HOLES_REPORT_PER_PDU]; /*!< \brief Array containing the stop segment offsets for marking a hole (negative acknowledged area) in the PDU. */ uint8_t num_holes; /*!< \brief Number of registereg holes in hole_so_start[], hole_so_stop[]. */ + uint8_t retx_hole_index; /*!< \brief Next index of registered holes to retransmit. */ sdu_size_t header_and_payload_size; /*!< \brief Size of the PDU in bytes, including header and payload. */ sdu_size_t payload_size; /*!< \brief Size of the PDU payload in bytes. */ + sdu_size_t retx_payload_size; /*!< \brief Size of the PDU payload to be retransmitted in bytes including all Segment portions. */ rlc_sn_t sn; /*!< \brief Sequence number of the PDU. */ sdu_size_t nack_so_start; /*!< \brief Lowest NACK start segment offset, must be set to 0 if global NACK. */ - sdu_size_t nack_so_stop; /*!< \brief Highest NACK stop segment offset, must be set to data_size if global NACK */ + sdu_size_t nack_so_stop; /*!< \brief Highest NACK stop segment offset, must be set to data_size - 1 if global NACK */ int8_t nb_sdus; /*!< \brief Number of sdu having segments in this pdu. */ - int8_t - retx_count; /*!< \brief Counts the number of retransmissions of an AMD PDU (see subclause 5.2.1). There is one RETX_COUNT counter per PDU that needs to be retransmitted. there is one VT(DAT) for each PDU and it is incremented each time the PDU is transmitted. */ + int8_t retx_count; /*!< \brief Counts the number of already occurred retransmissions of an AMD PDU (see subclause 5.2.1). */ + int8_t retx_count_next; /*!< \brief Counts the number of already occurred retransmissions plus the latest pending one. */ pdu_management_flags_t flags; /*!< \brief PDU variables related to its retransmission. */ } rlc_am_tx_data_pdu_management_t; @@ -235,14 +231,48 @@ typedef struct rlc_am_timer { * @{ */ +typedef enum rlc_am_rx_segment_reassemble_info +{ + /** No Reassembly scheduled */ + RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_NO = 0, + /** Reassembly scheduled */ + RLC_AM_RX_PDU_SEGMENT_REASSEMBLE_PENDING = 1, + /** Reassembly done */ + RLC_AM_RX_PDU_SEGMENT_REASSEMBLED = 2 + +} rlc_am_rx_segment_reassemble_info_t; + /*! \struct rlc_am_rx_pdu_management_t * \brief Structure for storing decoded informations from the header of a AMD PDU or AMD PDU segment and information on reassembly. */ typedef struct rlc_am_rx_pdu_management { rlc_am_pdu_info_t pdu_info; /*!< \brief Field for storing decoded informations from the header of a AMD PDU or AMD PDU segment. */ uint8_t all_segments_received; /*!< \brief Is all segments of PDU SN have been received. */ + rlc_am_rx_segment_reassemble_info_t segment_reassembled; /*!< \brief if the segment for SN=vrR is reassembled but not discarded yet. */ } rlc_am_rx_pdu_management_t; /** @} */ + +typedef enum rlc_am_rx_pdu_status +{ + /** PDU okay. */ + RLC_AM_DATA_PDU_STATUS_OK = 0, + /** SN outside RX window */ + RLC_AM_DATA_PDU_STATUS_SN_OUTSIDE_WINDOW = 1, + /** SN already available */ + RLC_AM_DATA_PDU_STATUS_SN_DUPLICATE = 2, + /** SN already available */ + RLC_AM_DATA_PDU_STATUS_AM_SEGMENT_DUPLICATE = 3, + /** Buffer full */ + RLC_AM_DATA_PDU_STATUS_BUFFER_FULL = 4, + /** Header Error (LI,SO...) */ + RLC_AM_DATA_PDU_STATUS_HEADER_ERROR = 5, + /** Unknown bearer */ + RLC_AM_DATA_PDU_STATUS_INVALID_BEARER = 6, + /** RLC in wrong state */ + RLC_AM_DATA_PDU_STATUS_WRONG_STATE = 7 + +} rlc_am_rx_pdu_status_t; + /*! \cond PRIVATE */ //----------------------------------------------------------------------------- // interlayers optimizations diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c old mode 100755 new mode 100644 index 13f96e1f3f..ff969c0b6e --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_TEST_C 1 #define RLC_C 1 @@ -235,7 +228,7 @@ void rlc_am_v9_3_0_test_read_write_bit_field() uint8_t* byte_pos_read = g_buffer; uint16_t read_value; - memset (g_buffer, 0, 1024); + memset (g_buffer, 0, sizeof(g_buffer)); // byte 0 rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 1); rlc_am_write8_bit_field(&byte_pos_write, &bit_pos_write, 1, 0); @@ -523,7 +516,7 @@ void rlc_am_v9_3_0_test_send_sdu(rlc_am_entity_t *am_txP, int sdu_indexP) //----------------------------------------------------------------------------- { mem_block_t *sdu; - sdu = get_free_mem_block (strlen(g_sdus[sdu_indexP]) + 1 + sizeof (struct rlc_am_data_req_alloc)); + sdu = get_free_mem_block (strlen(g_sdus[sdu_indexP]) + 1 + sizeof (struct rlc_am_data_req_alloc), __func__); if (sdu != NULL) { // PROCESS OF COMPRESSION HERE: @@ -568,7 +561,7 @@ void rlc_am_v9_3_0_test_mac_rlc_loop (struct mac_data_ind *data_indP, struct ma *tx_packetsP = *tx_packetsP + 1; if (*drop_countP == 0) { - tb_dst = get_free_mem_block(sizeof (mac_rlc_max_rx_header_size_t) + tb_size); + tb_dst = get_free_mem_block(sizeof (mac_rlc_max_rx_header_size_t) + tb_size, __func__); if (tb_dst != NULL) { ((struct mac_tb_ind *) (tb_dst->data))->first_bit = 0; @@ -592,7 +585,7 @@ void rlc_am_v9_3_0_test_mac_rlc_loop (struct mac_data_ind *data_indP, struct ma *dropped_tx_packetsP = *dropped_tx_packetsP + 1; } - free_mem_block(tb_src); + free_mem_block(tb_src, __func__); if (data_indP->no_tb > 0) { printf("[RLC-LOOP] Exchange %d TBs\n",data_indP->no_tb); @@ -680,13 +673,13 @@ void rlc_am_v9_3_0_test_data_ind (module_id_t module_idP, rb_id_t rb_idP, sdu_si assert(g_send_sdu_ids[g_send_id_read_index[rb_idP]][rb_idP^1] == i); g_send_id_read_index[rb_idP] += 1; - free_mem_block(sduP); + free_mem_block(sduP, __func__); return; } } printf("[FRAME %05d][RLC][MOD %d][RB %d] RX UNKNOWN SDU %04d bytes\n",g_frame,module_idP, rb_idP, sizeP); - free_mem_block(sduP); + free_mem_block(sduP, __func__); assert(1==2); } //----------------------------------------------------------------------------- @@ -705,8 +698,8 @@ void rlc_am_v9_3_0_test_tx_rx() rlc_am_init(&g_am_tx, g_frame); rlc_am_init(&g_am_rx, g_frame); - rlc_am_set_debug_infos(&g_am_tx, g_frame, 0, 0, 0, 1); - rlc_am_set_debug_infos(&g_am_rx, g_frame, 1, 1, 1, 1); + rlc_am_set_debug_infos(&g_am_tx, g_frame, 0, 0, 0, 1, 1 /* LC-id = DRB-id */); + rlc_am_set_debug_infos(&g_am_rx, g_frame, 1, 1, 1, 1, 1 /* LC-id = DRB-id */); rlc_am_configure(&g_am_tx, g_frame, max_retx_threshold, poll_pdu, poll_byte, t_poll_retransmit, t_reordering, t_status_prohibit); rlc_am_configure(&g_am_rx, g_frame, max_retx_threshold, poll_pdu, poll_byte, t_poll_retransmit, t_reordering, t_status_prohibit); diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h old mode 100755 new mode 100644 index a78a391869..b42800e15f --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_test.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_test.h * \brief This file defines the prototypes of RLC AM test functions. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c old mode 100755 new mode 100644 index 746bde2659..0b88e7c650 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_TIMER_POLL_RETRANSMIT_C 1 //----------------------------------------------------------------------------- @@ -84,10 +77,41 @@ rlc_am_check_timer_poll_retransmit( LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T_POLL_RETRANSMIT] TIME-OUT\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); + /* Check for any retransmittable PDU if Buffer Occupancy empty or window stall */ + if (((rlc_pP->sdu_buffer_occupancy == 0) && (rlc_pP->retrans_num_bytes_to_retransmit == 0)) || + (rlc_pP->vt_s == rlc_pP->vt_ms)) { + // force BO to be > 0 + rlc_sn_t sn = RLC_AM_PREV_SN(rlc_pP->vt_s); + rlc_sn_t sn_end = RLC_AM_PREV_SN(rlc_pP->vt_a); + rlc_am_tx_data_pdu_management_t *tx_data_pdu_buffer_p; + + /* Look for the first retransmittable PDU starting from vtS - 1 */ + while (sn != sn_end) { + tx_data_pdu_buffer_p = &rlc_pP->tx_data_pdu_buffer[sn % RLC_AM_WINDOW_SIZE]; + AssertFatal (tx_data_pdu_buffer_p->mem_block != NULL, "RLC AM Tpoll Retx expiry sn=%d ack=%d is empty vtA=%d vtS=%d LcId=%d\n", + sn, tx_data_pdu_buffer_p->flags.ack,rlc_pP->vt_a,rlc_pP->vt_s,rlc_pP->channel_id); + if ((tx_data_pdu_buffer_p->flags.ack == 0) && (tx_data_pdu_buffer_p->flags.max_retransmit == 0)) { + tx_data_pdu_buffer_p->flags.retransmit = 1; + tx_data_pdu_buffer_p->retx_payload_size = tx_data_pdu_buffer_p->payload_size; + if (tx_data_pdu_buffer_p->retx_count == tx_data_pdu_buffer_p->retx_count_next) { + tx_data_pdu_buffer_p->retx_count_next ++; + } + rlc_pP->retrans_num_pdus += 1; + rlc_pP->retrans_num_bytes_to_retransmit += tx_data_pdu_buffer_p->payload_size; + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T_POLL_RETRANSMIT] TIME-OUT PUT SN=%d in ReTx Buffer\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP),tx_data_pdu_buffer_p->sn); + break; + } + else + { + sn = RLC_AM_PREV_SN(sn); + } + } + } + rlc_pP->force_poll= TRUE; - //#warning TO DO rlc_am_check_timer_poll_retransmit - rlc_pP->t_poll_retransmit.ms_time_out = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP) + rlc_pP->t_poll_retransmit.ms_duration; + //BugFix : new ms_time_out is computed when next poll is transmitter } } } @@ -126,9 +150,9 @@ rlc_am_start_timer_poll_retransmit( rlc_am_entity_t * const rlc_pP ) { - rlc_pP->t_poll_retransmit.timed_out = 0; + /* Stop timer if it was previously running */ + rlc_am_stop_and_reset_timer_poll_retransmit(ctxt_pP,rlc_pP); - if (rlc_pP->t_poll_retransmit.running == 0) { if (rlc_pP->t_poll_retransmit.ms_duration > 0) { rlc_pP->t_poll_retransmit.running = 1; rlc_pP->t_poll_retransmit.ms_time_out = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP) + rlc_pP->t_poll_retransmit.ms_duration; @@ -145,14 +169,7 @@ rlc_am_start_timer_poll_retransmit( LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T_POLL_RETRANSMIT] NOT STARTED, CAUSE CONFIGURED 0 ms\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); } - } else { -#if MESSAGE_CHART_GENERATOR_RLC_MAC - MSC_LOG_EVENT((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_RLC_ENB:MSC_RLC_UE,\ - "0 "PROTOCOL_RLC_AM_MSC_FMT" t_poll_retransmit not restarted (TO %u ms)",\ - PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP), rlc_pP->t_poll_retransmit.ms_time_out); -#endif - } } //----------------------------------------------------------------------------- void diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h old mode 100755 new mode 100644 index 2ef993e9ee..c5d49268c4 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_timer_poll_retransmit.h * \brief This file defines the prototypes of the functions manipulating the t-PollRetransmit timer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c old mode 100755 new mode 100644 index a05700abc1..b9383980a4 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_TIMER_POLL_REORDERING_C 1 //----------------------------------------------------------------------------- @@ -77,6 +70,8 @@ rlc_am_check_timer_reordering( PROTOCOL_RLC_AM_MSC_ARGS(ctxt_pP,rlc_pP)); #endif + AssertFatal (rlc_pP->vr_x != RLC_SN_UNDEFINED, "RLC AM TReordering Expiry vrX not defined LcId=%d\n", rlc_pP->channel_id); + rlc_pP->t_reordering.running = 0; rlc_pP->t_reordering.timed_out = 1; rlc_pP->stat_timer_reordering_timed_out += 1; @@ -84,38 +79,56 @@ rlc_am_check_timer_reordering( rlc_am_pdu_info_t* pdu_info; mem_block_t* cursor; cursor = rlc_pP->receiver_buffer.head; + rlc_usn_t vr_ms_new = rlc_pP->vr_x; - if (cursor) { - do { - pdu_info = &((rlc_am_rx_pdu_management_t*)(cursor->data))->pdu_info; + AssertFatal (cursor != NULL, "RLC AM TReordering Expiry Rx PDU list empty LcId=%d\n", rlc_pP->channel_id); - // NOT VERY SURE ABOUT THAT, THINK ABOUT IT - rlc_pP->vr_ms = (pdu_info->sn + 1) & RLC_AM_SN_MASK; - - if (rlc_am_sn_gte_vr_x(ctxt_pP, rlc_pP, pdu_info->sn)) { - if (((rlc_am_rx_pdu_management_t*)(cursor->data))->all_segments_received == 0) { - rlc_pP->vr_ms = pdu_info->sn; - break; - } - } - - cursor = cursor->next; - } while (cursor != NULL); - - LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-REORDERING] TIME-OUT UPDATED VR(MS) %04d\n", - PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), - rlc_pP->vr_ms); + /* go to memblock up to vrX*/ + pdu_info = &((rlc_am_rx_pdu_management_t*)(cursor->data))->pdu_info; + while ((cursor != NULL) && (RLC_AM_DIFF_SN(pdu_info->sn,rlc_pP->vr_r) < RLC_AM_DIFF_SN(vr_ms_new,rlc_pP->vr_r))) { + cursor = cursor->next; + if (cursor != NULL) { + pdu_info = &((rlc_am_rx_pdu_management_t*)(cursor->data))->pdu_info; + } } - if (rlc_am_sn_gt_vr_ms(ctxt_pP, rlc_pP, rlc_pP->vr_h)) { + /* Now find a SN for which either no PDU is received or partially received */ + while ((cursor != NULL) && (vr_ms_new != rlc_pP->vr_h) && (pdu_info->sn == vr_ms_new) && (((rlc_am_rx_pdu_management_t*)(cursor->data))->all_segments_received > 0)) { + /* Increment vrMS if the PDU is fully received or if this is the last PDU segment */ + if ((pdu_info->rf == 0) || (pdu_info->lsf == 1)) { + vr_ms_new = RLC_AM_NEXT_SN(vr_ms_new); + } + cursor = cursor->next; + if (cursor != NULL) { + pdu_info = &((rlc_am_rx_pdu_management_t*)(cursor->data))->pdu_info; + } + } + + /* Update vr_ms */ + rlc_pP->vr_ms = vr_ms_new; + + + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-REORDERING] TIME-OUT UPDATED VR(MS) %04d\n", + PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), + rlc_pP->vr_ms); + + /* if new vrMS is lower than vrH, update vrX and restart timerReordering */ + if (rlc_pP->vr_ms != rlc_pP->vr_h) { rlc_pP->vr_x = rlc_pP->vr_h; rlc_pP->t_reordering.ms_time_out = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP) + rlc_pP->t_reordering.ms_duration; + + LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-REORDERING] TIME-OUT, RESTARTED T-REORDERING, UPDATED VR(X) to VR(R) %04d\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->vr_x); } - rlc_pP->status_requested = 1; + /* Trigger a STATUS report */ + RLC_AM_SET_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_TRIGGERED_T_REORDERING); + // Clear Delay flag if it was setup as it is useless due to Status PDU to be sent for TReordering expiry + RLC_AM_CLEAR_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_TRIGGERED_DELAYED); + rlc_pP->sn_status_triggered_delayed = RLC_SN_UNDEFINED; + } } } diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h old mode 100755 new mode 100644 index 11bcc92b09..a2876d9169 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_reordering.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_timer_reordering.h * \brief This file defines the prototypes of the functions manipulating the t-Reordering timer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c old mode 100755 new mode 100644 index 716e592ce7..13d4205c28 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_TIMER_STATUS_PROHIBIT_C 1 //----------------------------------------------------------------------------- @@ -77,6 +70,8 @@ rlc_am_check_timer_status_prohibit( PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP)); //#warning TO DO rlc_am_check_timer_status_prohibit rlc_am_stop_and_reset_timer_status_prohibit(ctxt_pP, rlc_pP); + /* Clear StatusProhibit flag */ + RLC_AM_CLEAR_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_PROHIBIT); //rlc_pP->t_status_prohibit.frame_time_out = ctxt_pP->frame + rlc_pP->t_status_prohibit.time_out; } } @@ -117,6 +112,7 @@ rlc_am_start_timer_status_prohibit( rlc_pP->t_status_prohibit.running = 1; rlc_pP->t_status_prohibit.ms_time_out = rlc_pP->t_status_prohibit.ms_duration + PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP); rlc_pP->t_status_prohibit.ms_start = PROTOCOL_CTXT_TIME_MILLI_SECONDS(ctxt_pP); + RLC_AM_SET_STATUS(rlc_pP->status_requested,RLC_AM_STATUS_PROHIBIT); LOG_D(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-STATUS-PROHIBIT] STARTED (TIME-OUT = %u ms)\n", PROTOCOL_RLC_AM_CTXT_ARGS(ctxt_pP,rlc_pP), rlc_pP->t_status_prohibit.ms_time_out); diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h old mode 100755 new mode 100644 index 3881085b0e..31ff985e41 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_status_prohibit.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_timer_status_prohibit.h * \brief This file defines the prototypes of the functions manipulating the t-StatusProhibit timer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c old mode 100755 new mode 100644 index 89a6657d62..7a3005334e --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.c @@ -1,37 +1,28 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_AM_MODULE 1 #define RLC_AM_WINDOWS_C 1 //----------------------------------------------------------------------------- -#if USER_MODE #include -#endif //----------------------------------------------------------------------------- #include "platform_types.h" //----------------------------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h old mode 100755 new mode 100644 index a9a306cad3..aff78a15c6 --- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h +++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_windows.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_am_windows.h * \brief This file defines the prototypes of the functions testing window, based on SN modulo and rx and tx protocol state variables. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/COPYING b/openair2/LAYER2/RLC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/RLC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/COPYING b/openair2/LAYER2/RLC/TM_v9.3.0/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/RLC/TM_v9.3.0/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c old mode 100755 new mode 100644 index 9f57a6a0cd..ee2ff57c1e --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_TM_MODULE 1 #define RLC_TM_C 1 //----------------------------------------------------------------------------- @@ -58,7 +51,7 @@ rlc_tm_send_sdu ( length_in_bytes = (length_in_bitsP + 7) >> 3; if (rlc_pP->output_sdu_in_construction == NULL) { - rlc_pP->output_sdu_in_construction = get_free_mem_block (length_in_bytes); + rlc_pP->output_sdu_in_construction = get_free_mem_block (length_in_bytes, __func__); } if ((rlc_pP->output_sdu_in_construction)) { @@ -67,10 +60,10 @@ rlc_tm_send_sdu ( PROTOCOL_RLC_TM_CTXT_ARGS(ctxt_pP, rlc_pP)); for (index = 0; index < length_in_bytes; index++) { - msg ("%c", srcP[index]); + LOG_T (RLC,"%c", srcP[index]); } - msg ("\n"); + LOG_T (RLC,"\n"); #endif memcpy (&rlc_pP->output_sdu_in_construction->data[rlc_pP->output_sdu_size_to_write], srcP, length_in_bytes); @@ -84,7 +77,7 @@ rlc_tm_send_sdu ( rlc_pP->output_sdu_in_construction); rlc_pP->output_sdu_in_construction = NULL; } else { - msg ("[RLC_TM %p][SEND_SDU] ERROR OUTPUT SDU IS NULL\n", rlc_pP); + LOG_D (RLC,"[RLC_TM %p][SEND_SDU] ERROR OUTPUT SDU IS NULL\n", rlc_pP); } } //----------------------------------------------------------------------------- @@ -104,7 +97,7 @@ rlc_tm_no_segment ( sdu_mngt_p = ((struct rlc_tm_tx_sdu_management *) (rlc_pP->input_sdus[rlc_pP->current_sdu_index]->data)); - if (!(pdu_p = get_free_mem_block (((rlc_pP->rlc_pdu_size + 7) >> 3) + sizeof (struct rlc_tm_tx_data_pdu_struct) + GUARD_CRC_LIH_SIZE))) { + if (!(pdu_p = get_free_mem_block (((rlc_pP->rlc_pdu_size + 7) >> 3) + sizeof (struct rlc_tm_tx_data_pdu_struct) + GUARD_CRC_LIH_SIZE, __func__))) { LOG_D(RLC, PROTOCOL_RLC_TM_CTXT_FMT"[SEGMENT] ERROR COULD NOT GET NEW PDU, EXIT\n", PROTOCOL_RLC_TM_CTXT_ARGS(ctxt_pP, rlc_pP)); return; @@ -123,7 +116,7 @@ rlc_tm_no_segment ( list_add_tail_eurecom (pdu_p, &rlc_pP->pdus_to_mac_layer); rlc_pP->buffer_occupancy -= (sdu_mngt_p->sdu_size >> 3); - free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index]); + free_mem_block (rlc_pP->input_sdus[rlc_pP->current_sdu_index], __func__); rlc_pP->input_sdus[rlc_pP->current_sdu_index] = NULL; rlc_pP->current_sdu_index = (rlc_pP->current_sdu_index + 1) % rlc_pP->size_input_sdus_buffer; rlc_pP->nb_sdu -= 1; @@ -149,7 +142,7 @@ rlc_tm_rx ( ((struct rlc_tm_rx_pdu_management *) (tb_p->data))->first_byte = first_byte_p; rlc_tm_send_sdu (ctxt_pP, rlc_p, (((struct mac_tb_ind *) (tb_p->data))->error_indication), first_byte_p, data_indP.tb_size); - free_mem_block (tb_p); + free_mem_block (tb_p, __func__); } } @@ -242,6 +235,6 @@ rlc_tm_data_req ( rlc_p->input_sdus[rlc_p->next_sdu_index] = sdu_pP; rlc_p->next_sdu_index = (rlc_p->next_sdu_index + 1) % rlc_p->size_input_sdus_buffer; } else { - free_mem_block (sdu_pP); + free_mem_block (sdu_pP, __func__); } } diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h old mode 100755 new mode 100644 index d772d1d4be..a0049e4c2a --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_tm.h * \brief This file, and only this file must be included by code that interact with RLC TM layer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h old mode 100755 new mode 100644 index fa716f81be..1a13982df6 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_entity.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_tm_entity.h * \brief This file defines the RLC TM variables stored in a struct called rlc_tm_entity_t. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c old mode 100755 new mode 100644 index 6b1b487286..15dc90f175 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_TM_MODULE 1 #define RLC_TM_INIT_C 1 //----------------------------------------------------------------------------- @@ -36,7 +29,8 @@ void config_req_rlc_tm ( const protocol_ctxt_t* const ctxt_pP, const srb_flag_t srb_flagP, const rlc_tm_info_t * const config_tmP, - const rb_id_t rb_idP + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP ) { rlc_union_t *rlc_union_p = NULL; @@ -55,7 +49,7 @@ void config_req_rlc_tm ( rlc_tm_init(ctxt_pP, rlc_p); rlc_p->protocol_state = RLC_DATA_TRANSFER_READY_STATE; - rlc_tm_set_debug_infos(ctxt_pP, rlc_p, rb_idP, srb_flagP); + rlc_tm_set_debug_infos(ctxt_pP, rlc_p, srb_flagP, rb_idP, chan_idP); rlc_tm_configure(ctxt_pP, rlc_p, config_tmP->is_uplink_downlink); } else { LOG_E(RLC, PROTOCOL_RLC_TM_CTXT_FMT" CONFIG_REQ RB %u RLC NOT FOUND\n", @@ -88,7 +82,7 @@ void rlc_tm_init ( rlcP->size_input_sdus_buffer = 16; if ((rlcP->input_sdus_alloc == NULL) && (rlcP->size_input_sdus_buffer > 0)) { - rlcP->input_sdus_alloc = get_free_mem_block (rlcP->size_input_sdus_buffer * sizeof (void *)); + rlcP->input_sdus_alloc = get_free_mem_block (rlcP->size_input_sdus_buffer * sizeof (void *), __func__); rlcP->input_sdus = (mem_block_t **) (rlcP->input_sdus_alloc->data); memset (rlcP->input_sdus, 0, rlcP->size_input_sdus_buffer * sizeof (void *)); } @@ -120,17 +114,18 @@ rlc_tm_cleanup ( if (rlcP->input_sdus_alloc) { for (index = 0; index < rlcP->size_input_sdus_buffer; index++) { if (rlcP->input_sdus[index]) { - free_mem_block (rlcP->input_sdus[index]); + free_mem_block (rlcP->input_sdus[index], __func__); } } - free_mem_block (rlcP->input_sdus_alloc); + free_mem_block (rlcP->input_sdus_alloc, __func__); rlcP->input_sdus_alloc = NULL; } // RX SIDE if ((rlcP->output_sdu_in_construction)) { - free_mem_block (rlcP->output_sdu_in_construction); + free_mem_block (rlcP->output_sdu_in_construction, __func__); + rlcP->output_sdu_in_construction = NULL; } memset(rlcP, 0, sizeof(rlc_tm_entity_t)); @@ -151,9 +146,11 @@ void rlc_tm_set_debug_infos( const protocol_ctxt_t* const ctxt_pP, rlc_tm_entity_t * const rlcP, const srb_flag_t srb_flagP, - const rb_id_t rb_idP) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP) { - rlcP->rb_id = rb_idP; + rlcP->rb_id = rb_idP; + rlcP->channel_id = chan_idP; if (srb_flagP) { rlcP->is_data_plane = 0; diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h old mode 100755 new mode 100644 index 48322c98b8..35e6c792ae --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_init.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_tm_init.h * \brief This file defines the prototypes of the functions dealing with the control primitives and initialization. * \author GAUTHIER Lionel @@ -80,13 +73,14 @@ typedef volatile struct rlc_tm_info_s { * \param[in] srb_flagP Flag to indicate SRB (1) or DRB (0) * \param[in] config_tmP Configuration parameters for RLC TM instance. * \param[in] rb_idP Radio bearer identifier. -* \param[in] srb_flagP Flag to indicate signalling radio bearer (1) or data radio bearer (0). +* \param[in] chan_idP Transport channel identifier. */ public_rlc_tm_init( void config_req_rlc_tm ( const protocol_ctxt_t* const ctxt_pP, const srb_flag_t srb_flagP, const rlc_tm_info_t * const config_tmP, - const rb_id_t rb_idP);) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP);) /*! \fn void rlc_tm_init (const protocol_ctxt_t* const ctxt_pP, rlc_tm_entity_t * const rlcP) * \brief Initialize a RLC TM protocol instance, initialize all variables, lists, allocate buffers for making this instance ready to be configured with protocol configuration parameters. After this initialization the RLC TM protocol instance will be in RLC_NULL_STATE state. @@ -127,11 +121,14 @@ protected_rlc_tm_init(void rlc_tm_configure( * \param[in] rlcP RLC TM protocol instance pointer. * \param[in] srb_flagP Flag to indicate signalling radio bearer (1) or data radio bearer (0). * \param[in] rb_idP Radio bearer identifier. +* \param[in] chan_idP Transport channel identifier */ protected_rlc_tm_init(void rlc_tm_set_debug_infos( const protocol_ctxt_t* const ctxt_pP, rlc_tm_entity_t * const rlcP, const srb_flag_t srb_flagP, - const rb_id_t rb_idP);) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP);) + /** @} */ # endif diff --git a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h old mode 100755 new mode 100644 index e59d2972bc..ee9d5268d4 --- a/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h +++ b/openair2/LAYER2/RLC/TM_v9.3.0/rlc_tm_structs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_tm_structs.h * \brief This file defines structures used inside the RLC TM. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/COPYING b/openair2/LAYER2/RLC/UM_v9.3.0/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/LAYER2/RLC/UM_v9.3.0/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c old mode 100755 new mode 100644 index 7b0c9890ed..7bd0da83a9 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_C 1 //----------------------------------------------------------------------------- @@ -433,7 +426,7 @@ rlc_um_rx (const protocol_ctxt_t* const ctxt_pP, void *argP, struct mac_data_ind //----------------------------------------------------------------------------- struct mac_status_resp -rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP) +rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP,const eNB_flag_t enb_flagP) { struct mac_status_resp status_resp; uint16_t sdu_size = 0; @@ -460,7 +453,11 @@ rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP if ((status_resp.buffer_occupancy_in_bytes > 0) && ((mb_p = list_get_head(&rlc_p->input_sdus)) != NULL)) { - status_resp.buffer_occupancy_in_bytes += rlc_p->tx_header_min_length_in_bytes; + if (enb_flagP == ENB_FLAG_YES) { + /* For eNB: add minimum RLC UM header size for the scheduler */ + /* For UE : RLC header part is not taken into account for BSR reporting (cf 36.321) */ + status_resp.buffer_occupancy_in_bytes += rlc_p->tx_header_min_length_in_bytes; + } status_resp.buffer_occupancy_in_pdus = rlc_p->input_sdus.nb_elements; diff_time = ctxt_pP->frame - ((struct rlc_um_tx_sdu_management *)mb_p->data)->sdu_creation_time; @@ -513,9 +510,19 @@ rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP return status_resp; } +//----------------------------------------------------------------------------- +void +rlc_um_set_nb_bytes_requested_by_mac ( + void * rlc_pP, + const tb_size_t tb_sizeP +) +{ + ((rlc_um_entity_t *) rlc_pP)->nb_bytes_requested_by_mac = tb_sizeP; +} + //----------------------------------------------------------------------------- struct mac_data_req -rlc_um_mac_data_request (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP) +rlc_um_mac_data_request (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP,const eNB_flag_t enb_flagP) { struct mac_data_req data_req; int16_t tb_size_in_bytes; @@ -537,10 +544,13 @@ rlc_um_mac_data_request (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP) list_add_list (&l_rlc_p->pdus_to_mac_layer, &data_req.data); - data_req.buffer_occupancy_in_bytes = rlc_um_get_buffer_occupancy (l_rlc_p); + if (enb_flagP) { + // redundant in UE MAC Tx processing and not used in eNB scheduler ... + data_req.buffer_occupancy_in_bytes = rlc_um_get_buffer_occupancy (l_rlc_p); - if (data_req.buffer_occupancy_in_bytes > 0) { - data_req.buffer_occupancy_in_bytes += l_rlc_p->tx_header_min_length_in_bytes; + if (data_req.buffer_occupancy_in_bytes > 0) { + data_req.buffer_occupancy_in_bytes += l_rlc_p->tx_header_min_length_in_bytes; + } } data_req.rlc_info.rlc_protocol_state = l_rlc_p->protocol_state; @@ -672,10 +682,6 @@ rlc_um_data_req (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP, mem_block_t { rlc_um_entity_t *rlc_p = (rlc_um_entity_t *) rlc_pP; -#if ! USER_MODE - unsigned long int rlc_um_time_us; - int min, sec, usec; -#endif #if TRACE_RLC_UM_PDU #if ENABLE_ITTI MessageDef *msg_p; diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h index 2289ed639c..abf4f8ad6e 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um.h * \brief This file, and only this file must be included by code that interact with RLC UM layer. * \author GAUTHIER Lionel @@ -71,9 +64,6 @@ # include "rlc_um_receiver.h" # include "rlc_um_segment.h" # include "rlc_um_test.h" -#ifdef USER_MODE -//# include "rlc_um_very_simple_test.h" -#endif #define PROTOCOL_RLC_UM_CTXT_FMT PROTOCOL_CTXT_FMT"[%s %02u] %s()" #define PROTOCOL_RLC_UM_CTXT_ARGS(CTXT_Pp, rLC_Pp) PROTOCOL_CTXT_ARGS(CTXT_Pp),\ @@ -193,15 +183,23 @@ protected_rlc_um( void rlc_um_rx (const protocol_ctxt_t* const ctxt_pP, rlc_ * \param[in] tx_statusP Transmission status given by MAC on previous MAC transmission of the PDU. * \return The maximum number of bytes that can be served by RLC instance to MAC. */ -public_rlc_um( struct mac_status_resp rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP);) +public_rlc_um( struct mac_status_resp rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP, const eNB_flag_t enb_flagP);) -/*! \fn struct mac_data_req rlc_um_mac_data_request (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP) +/*! \fn void rlc_um_set_nb_bytes_requested_by_mac (rlc_um_entity_t * const rlc_pP, const tb_size_t tb_sizeP) +* \brief Set available TBS size for MAC Tx. +* \param[in] rlc_pP RLC UM protocol instance pointer. +* \param[in] tb_sizeP remaining TBS in bytes. +*/ +public_rlc_um( void rlc_um_set_nb_bytes_requested_by_mac (rlc_um_entity_t * const rlc_pP, const tb_size_t tb_sizeP);) + +/*! \fn struct mac_data_req rlc_um_mac_data_request (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP,const eNB_flag_t enb_flagP) * \brief Gives PDUs to lower layer MAC. * \param[in] ctxt_pP Running context. * \param[in] rlc_pP RLC UM protocol instance pointer. +* \param[in] enb_flagP eNB or UE flag. * \return A PDU of the previously requested number of bytes, and the updated maximum number of bytes that can be served by RLC instance to MAC for next RLC transmission. */ -public_rlc_um( struct mac_data_req rlc_um_mac_data_request (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP);) +public_rlc_um( struct mac_data_req rlc_um_mac_data_request (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP,const eNB_flag_t enb_flagP);) /*! \fn void rlc_um_mac_data_indication (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP,struct mac_data_ind data_indP) @@ -212,6 +210,11 @@ public_rlc_um( struct mac_data_req rlc_um_mac_data_request (const protocol_ct */ public_rlc_um( void rlc_um_mac_data_indication (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP, struct mac_data_ind data_indP);) +/*! \fn uint32_t rlc_um_get_buffer_occupancy (rlc_um_entity_t *rlc_pP) +* \brief Gets Tx Buffer Occupancy. +* \param[in] rlc_pP RLC UM protocol instance pointer.) +*/ +public_rlc_um( uint32_t rlc_um_get_buffer_occupancy (rlc_um_entity_t *rlc_pP);) /*! \fn void rlc_um_data_req (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP, mem_block_t *sduP) * \brief Interface with higher layers, buffer higher layer SDUS for transmission. diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h old mode 100755 new mode 100644 index d25a394e8b..5f210dbe7b --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_constants.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_constants.h * \brief This file defines constant values used inside RLC UM. * \author GAUTHIER Lionel @@ -60,7 +53,7 @@ // UM_Window_Size = 512 when a 10 bit SN is configured and UM_Window_Size = 0 // when the receiving UM RLC entity is configured for MCCH or MTCH. // li field (values shifted 1 bit left) -# define RLC_UM_SEGMENT_NB_MAX_LI_PER_PDU 24 +# define RLC_UM_SEGMENT_NB_MAX_LI_PER_PDU 128 //---------------------------------------------------------- // Events defined for state model of the acknowledged mode entity /** Internal event defined for state model of the RLC UM. */ diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c old mode 100755 new mode 100644 index a91e384a55..4e2723a8f4 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_CONTROL_PRIMITIVES_C 1 #include "platform_types.h" @@ -47,7 +40,8 @@ void config_req_rlc_um ( const protocol_ctxt_t* const ctxt_pP, const srb_flag_t srb_flagP, const rlc_um_info_t * const config_um_pP, - const rb_id_t rb_idP) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP) { rlc_union_t *rlc_union_p = NULL; rlc_um_entity_t *rlc_p = NULL; @@ -68,7 +62,7 @@ void config_req_rlc_um ( rlc_um_init(ctxt_pP, rlc_p); if (rlc_um_fsm_notify_event (ctxt_pP, rlc_p, RLC_UM_RECEIVE_CRLC_CONFIG_REQ_ENTER_DATA_TRANSFER_READY_STATE_EVENT)) { - rlc_um_set_debug_infos(ctxt_pP, rlc_p, srb_flagP, rb_idP); + rlc_um_set_debug_infos(ctxt_pP, rlc_p, srb_flagP, rb_idP, chan_idP); rlc_um_configure( ctxt_pP, rlc_p, @@ -84,7 +78,11 @@ void config_req_rlc_um ( } } //----------------------------------------------------------------------------- -const uint32_t const t_Reordering_tab[T_Reordering_spare1] = {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,110,120,130,140,150,160,170,180,190,200}; +#if defined(Rel14) +const uint32_t t_Reordering_tab[32] = {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,110,120,130,140,150,160,170,180,190,200,1600}; +#else +const uint32_t t_Reordering_tab[T_Reordering_spare1] = {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,110,120,130,140,150,160,170,180,190,200}; +#endif void config_req_rlc_um_asn1 ( const protocol_ctxt_t* const ctxt_pP, @@ -94,7 +92,8 @@ void config_req_rlc_um_asn1 ( const mbms_service_id_t mbms_service_idP, const UL_UM_RLC_t * const ul_rlc_pP, const DL_UM_RLC_t * const dl_rlc_pP, - const rb_id_t rb_idP) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP) { uint32_t ul_sn_FieldLength = 0; uint32_t dl_sn_FieldLength = 0; @@ -104,7 +103,7 @@ void config_req_rlc_um_asn1 ( hash_key_t key = RLC_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, rb_idP, srb_flagP); hashtable_rc_t h_rc; -#if Rel10 +#if defined(Rel10) || defined(Rel14) if (mbms_flagP) { AssertFatal(dl_rlc_pP, "No RLC UM DL config"); @@ -142,7 +141,7 @@ void config_req_rlc_um_asn1 ( if (rlc_um_fsm_notify_event (ctxt_pP, rlc_p, RLC_UM_RECEIVE_CRLC_CONFIG_REQ_ENTER_DATA_TRANSFER_READY_STATE_EVENT)) { - rlc_um_set_debug_infos(ctxt_pP,rlc_p, srb_flagP, rb_idP); + rlc_um_set_debug_infos(ctxt_pP,rlc_p, srb_flagP, rb_idP, chan_idP); if (ul_rlc_pP != NULL) { switch (ul_rlc_pP->sn_FieldLength) { @@ -155,7 +154,7 @@ void config_req_rlc_um_asn1 ( break; default: - LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID UL sn_FieldLength %d, RLC NOT CONFIGURED\n", + LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID UL sn_FieldLength %ld, RLC NOT CONFIGURED\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP,rlc_p), rlc_p->rb_id, ul_rlc_pP->sn_FieldLength); @@ -183,7 +182,7 @@ void config_req_rlc_um_asn1 ( break; default: - LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID DL sn_FieldLength %d, RLC NOT CONFIGURED\n", + LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID DL sn_FieldLength %ld, RLC NOT CONFIGURED\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP,rlc_p), rlc_p->rb_id, dl_rlc_pP->sn_FieldLength); @@ -199,10 +198,14 @@ void config_req_rlc_um_asn1 ( return; } +#if defined(Rel14) + if (dl_rlc_pP->t_Reordering<32) { +#else if (dl_rlc_pP->t_Reorderingt_Reordering]; } else { - LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID T_Reordering %d, RLC NOT CONFIGURED\n", + LOG_E(RLC,PROTOCOL_RLC_UM_CTXT_FMT" [CONFIGURE] RB %u INVALID T_Reordering %ld, RLC NOT CONFIGURED\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP,rlc_p), rlc_p->rb_id, dl_rlc_pP->t_Reordering); @@ -339,13 +342,14 @@ rlc_um_cleanup ( list_free (&rlc_pP->pdus_from_mac_layer); if ((rlc_pP->output_sdu_in_construction)) { - free_mem_block (rlc_pP->output_sdu_in_construction); + free_mem_block (rlc_pP->output_sdu_in_construction, __func__); + rlc_pP->output_sdu_in_construction = NULL; } if (rlc_pP->dar_buffer) { for (index = 0; index < 1024; index++) { if (rlc_pP->dar_buffer[index]) { - free_mem_block (rlc_pP->dar_buffer[index]); + free_mem_block (rlc_pP->dar_buffer[index], __func__); } } @@ -423,14 +427,16 @@ void rlc_um_configure( void rlc_um_set_debug_infos( const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP, - const srb_flag_t srb_flagP, - const rb_id_t rb_idP) + const srb_flag_t srb_flagP, + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP) { LOG_D(RLC, PROTOCOL_RLC_UM_CTXT_FMT" [SET DEBUG INFOS] rb_id %d srb_flag %d\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP,rlc_pP), rb_idP, srb_flagP); - rlc_pP->rb_id = rb_idP; + rlc_pP->rb_id = rb_idP; + rlc_pP->channel_id = chan_idP; if (srb_flagP) { rlc_pP->is_data_plane = 0; diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h index b9a5166ed2..5847a8bb13 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_control_primitives.h * \brief This file defines the prototypes of the functions dealing with the control primitives and initialization. * \author GAUTHIER Lionel @@ -84,12 +77,14 @@ typedef volatile struct { * \param[in] srb_flagP Flag to indicate signalling radio bearer (1) or data radio bearer (0). * \param[in] config_umP Configuration parameters for RLC UM instance. * \param[in] rb_idP Radio bearer identifier. +* \param[in] chan_idP Transport channel identifier. */ public_rlc_um_control_primitives( void config_req_rlc_um ( const protocol_ctxt_t* const ctxt_pP, const srb_flag_t srb_flagP, const rlc_um_info_t * const config_umP, - const rb_id_t rb_idP);) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP);) /*! \fn void config_req_rlc_um_asn1 ( * const protocol_ctxt_t* const ctxt_pP, @@ -109,6 +104,7 @@ public_rlc_um_control_primitives( void config_req_rlc_um ( * \param[in] ul_rlc_pP Configuration parameters for RLC UM UL instance. * \param[in] dl_rlc_pP Configuration parameters for RLC UM DL instance. * \param[in] rb_idP Radio bearer identifier. +* \param[in] chan_idP Transport channel identifier. */ public_rlc_um_control_primitives( void config_req_rlc_um_asn1 ( const protocol_ctxt_t* const ctxt_pP, @@ -118,7 +114,8 @@ public_rlc_um_control_primitives( void config_req_rlc_um_asn1 ( const mbms_service_id_t mbms_service_idP, const UL_UM_RLC_t * const ul_rlc_pP, const DL_UM_RLC_t * const dl_rlc_pP, - const rb_id_t rb_idP);) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP);) /*! \fn void rlc_um_init (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP) * \brief Initialize a RLC UM protocol instance, initialize all variables, lists, allocate buffers for making this instance ready to be configured with protocol configuration parameters. After this initialization the RLC UM protocol instance will be in RLC_NULL_STATE state. @@ -176,13 +173,15 @@ protected_rlc_um_control_primitives(void rlc_um_configure( * \brief Set debug informations for a RLC UM protocol instance, these informations are only for trace purpose. * \param[in] ctxtP Running context. * \param[in] rlc_pP RLC UM protocol instance pointer. -* \param[in] rb_idP Radio bearer identifier. * \param[in] srb_flagP Flag to indicate signalling radio bearer (1) or data radio bearer (0). +* \param[in] rb_idP Radio bearer identifier. +* \param[in] chan_idP Transport channel identifier. */ protected_rlc_um_control_primitives(void rlc_um_set_debug_infos( const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP, const srb_flag_t srb_flagP, - const rb_id_t rb_idP);) + const rb_id_t rb_idP, + const logical_chan_id_t chan_idP);) /** @} */ # endif diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c index 881dc9b993..fe71839231 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_DAR_C 1 #include "platform_types.h" @@ -137,6 +130,7 @@ int rlc_um_read_length_indicators(unsigned char**data_ppP, rlc_um_e_li_t* e_liP, unsigned int e2 = 0; unsigned int li2 = 0; *num_li_pP = 0; + int pdu_size = *data_size_pP; while ((continue_loop)) { //msg("[RLC_UM] e_liP->b1 = %02X\n", e_liP->b1); @@ -154,22 +148,56 @@ int rlc_um_read_length_indicators(unsigned char**data_ppP, rlc_um_e_li_t* e_liP, *data_size_pP = *data_size_pP - li2 - 1; *num_li_pP = *num_li_pP +1; + if (!(*data_size_pP >= 0)) LOG_E(RLC, "Invalid data_size=%d! (pdu_size=%d loop=%d e1=%d e2=%d li2=%d e_liP=%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x)\n", + *data_size_pP, pdu_size, continue_loop, e1, e2, li2, + (e_liP-(continue_loop-1)+0)->b1, + (e_liP-(continue_loop-1)+0)->b2, + (e_liP-(continue_loop-1)+0)->b3, + (e_liP-(continue_loop-1)+1)->b1, + (e_liP-(continue_loop-1)+1)->b2, + (e_liP-(continue_loop-1)+1)->b3, + (e_liP-(continue_loop-1)+2)->b1, + (e_liP-(continue_loop-1)+2)->b2, + (e_liP-(continue_loop-1)+2)->b3); + // AssertFatal(*data_size_pP >= 0, "Invalid data_size!"); + if (e2 == 0) { continue_loop = 0; } else { e_liP++; + continue_loop++; } } else { + if (!(*data_size_pP >= 0)) LOG_E(RLC, "Invalid data_size=%d! (pdu_size=%d loop=%d e1=%d li1=%d e_liP=%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x)\n", + *data_size_pP, pdu_size, continue_loop, e1, li1, + (e_liP-(continue_loop-1)+0)->b1, + (e_liP-(continue_loop-1)+0)->b2, + (e_liP-(continue_loop-1)+0)->b3, + (e_liP-(continue_loop-1)+1)->b1, + (e_liP-(continue_loop-1)+1)->b2, + (e_liP-(continue_loop-1)+1)->b3, + (e_liP-(continue_loop-1)+2)->b1, + (e_liP-(continue_loop-1)+2)->b2, + (e_liP-(continue_loop-1)+2)->b3); continue_loop = 0; + // AssertFatal(*data_size_pP >= 0, "Invalid data_size!"); } - if (*num_li_pP >= RLC_UM_SEGMENT_NB_MAX_LI_PER_PDU) { + if (*num_li_pP > RLC_UM_SEGMENT_NB_MAX_LI_PER_PDU) { return -1; } } *data_ppP = *data_ppP + (((*num_li_pP*3) +1) >> 1); - return 0; + if (*data_size_pP > 0) { + return 0; + } else if (*data_size_pP == 0) { + LOG_W(RLC, "Last RLC SDU size is zero!\n"); + return -1; + } else { + LOG_W(RLC, "Last RLC SDU size is negative %d!\n", *data_size_pP); + return -1; + } } //----------------------------------------------------------------------------- void @@ -280,6 +308,9 @@ rlc_um_try_reassembly( __LINE__); #endif } + AssertFatal(size >= 0, "invalid size!"); + AssertFatal((e==0) || (e==1), "invalid e!"); + AssertFatal((fi >= 0) && (fi <= 3), "invalid fi!"); if (e == RLC_E_FIXED_PART_DATA_FIELD_FOLLOW) { switch (fi) { @@ -369,8 +400,9 @@ rlc_um_try_reassembly( break; default: - AssertFatal( 0 , PROTOCOL_RLC_UM_CTXT_FMT" TRY REASSEMBLY SHOULD NOT GO HERE (%s:%u)\n", + AssertFatal( 0 , PROTOCOL_RLC_UM_CTXT_FMT" fi=%d! TRY REASSEMBLY SHOULD NOT GO HERE (%s:%u)\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP, rlc_pP), + fi, __FILE__, __LINE__); } @@ -511,8 +543,9 @@ rlc_um_try_reassembly( // data_p is already ok, done by last loop above rlc_um_reassembly (ctxt_pP, rlc_pP, data_p, size); } else { - AssertFatal( 0 !=0, PROTOCOL_RLC_UM_CTXT_FMT" SHOULD NOT GO HERE (%s:%u)\n", + AssertFatal( 0 !=0, PROTOCOL_RLC_UM_CTXT_FMT" size=%d! SHOULD NOT GO HERE (%s:%u)\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP, rlc_pP), + size, __FILE__, __LINE__); //rlc_pP->stat_rx_data_pdu_dropped += 1; @@ -541,6 +574,12 @@ rlc_um_try_reassembly( __LINE__); #endif } + } else { + rlc_pP->stat_rx_data_pdu_dropped += 1; + rlc_pP->stat_rx_data_bytes_dropped += tb_ind_p->size; + rlc_pP->reassembly_missing_sn_detected = 1; + + LOG_W(RLC, "[SN %d] Bad RLC header! Discard this RLC PDU (size=%d)\n", sn, size); } } @@ -551,7 +590,7 @@ rlc_um_try_reassembly( __FILE__, __LINE__); #endif - free_mem_block(rlc_pP->dar_buffer[sn]); + free_mem_block(rlc_pP->dar_buffer[sn], __func__); rlc_pP->dar_buffer[sn] = NULL; } else { rlc_pP->last_reassemblied_missing_sn = sn; @@ -625,7 +664,7 @@ rlc_um_start_timer_reordering( rlc_pP->t_reordering.ms_time_out); #endif } else { - LOG_T(RLC, PROTOCOL_RLC_AM_CTXT_FMT"[T-REORDERING] NOT STARTED, CAUSE CONFIGURED 0 ms\n", + LOG_T(RLC, PROTOCOL_RLC_UM_CTXT_FMT"[T-REORDERING] NOT STARTED, CAUSE CONFIGURED 0 ms\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP,rlc_pP)); } } @@ -964,7 +1003,7 @@ rlc_um_receive_process_dar ( } else if (rlc_pP->rx_sn_length == 5) { sn = pdu_pP->b1 & 0x1F; } else { - free_mem_block(pdu_mem_pP); + free_mem_block(pdu_mem_pP, __func__); } RLC_UM_MUTEX_LOCK(&rlc_pP->lock_dar_buffer, ctxt_pP, rlc_pP); @@ -989,7 +1028,7 @@ rlc_um_receive_process_dar ( #endif rlc_pP->stat_rx_data_pdu_out_of_window += 1; rlc_pP->stat_rx_data_bytes_out_of_window += tb_sizeP; - free_mem_block(pdu_mem_pP); + free_mem_block(pdu_mem_pP, __func__); pdu_mem_pP = NULL; RLC_UM_MUTEX_UNLOCK(&rlc_pP->lock_dar_buffer); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_UM_RECEIVE_PROCESS_DAR, VCD_FUNCTION_OUT); @@ -1008,7 +1047,7 @@ rlc_um_receive_process_dar ( //discard the PDU rlc_pP->stat_rx_data_pdus_duplicate += 1; rlc_pP->stat_rx_data_bytes_duplicate += tb_sizeP; - free_mem_block(pdu_mem_pP); + free_mem_block(pdu_mem_pP, __func__); pdu_mem_pP = NULL; RLC_UM_MUTEX_UNLOCK(&rlc_pP->lock_dar_buffer); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_UM_RECEIVE_PROCESS_DAR, VCD_FUNCTION_OUT); @@ -1024,7 +1063,7 @@ rlc_um_receive_process_dar ( sn); #endif mem_block_t *pdu = rlc_um_remove_pdu_from_dar_buffer(ctxt_pP, rlc_pP, sn); - free_mem_block(pdu); + free_mem_block(pdu, __func__); } rlc_um_store_pdu_in_dar_buffer(ctxt_pP, rlc_pP, pdu_mem_pP, sn); diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h index dce80d2d98..f62cddfbca 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_dar.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_dar.h * \brief This file defines the prototypes of the functions dealing with the reassembly buffer. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h old mode 100755 new mode 100644 index 07fb15bfef..3250ac85b8 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_entity.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_entity.h * \brief This file defines the RLC UM variables stored in a struct called rlc_um_entity_t. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c old mode 100755 new mode 100644 index 27b35de67d..758630b3cc --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_FSM_C 1 #include "platform_types.h" @@ -59,7 +52,7 @@ rlc_um_fsm_notify_event ( LOG_E(RLC, PROTOCOL_RLC_UM_CTXT_FMT" FSM WARNING PROTOCOL ERROR - EVENT %02X hex NOT EXPECTED FROM NULL_STATE\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP, rlc_pP), eventP); - mac_xface->macphy_exit("RLC-UM FSM WARNING PROTOCOL ERROR - EVENT NOT EXPECTED FROM NULL_STATE"); + AssertFatal(1==0,"RLC-UM FSM WARNING PROTOCOL ERROR - EVENT NOT EXPECTED FROM NULL_STATE"); return 0; } diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h index 645311f451..1f7310803b 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_fsm.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_fsm.h * \brief This file defines the prototypes of the functions dealing with the finite state machine of the RLC UM protocol instance. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c old mode 100755 new mode 100644 index 24c0ee8291..91e1ba66d1 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.c @@ -1,38 +1,29 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_REASSEMBLY_C 1 #include "platform_types.h" //----------------------------------------------------------------------------- -#if USER_MODE #include -#endif #if ENABLE_ITTI # include "platform_types.h" # include "intertask_interface.h" @@ -76,7 +67,7 @@ rlc_um_reassembly (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t *rlc_pP if (rlc_pP->output_sdu_in_construction == NULL) { // msg("[RLC_UM_LITE] Getting mem_block ...\n"); - rlc_pP->output_sdu_in_construction = get_free_mem_block (sdu_max_size); + rlc_pP->output_sdu_in_construction = get_free_mem_block (sdu_max_size, __func__); rlc_pP->output_sdu_size_to_write = 0; } diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h index adba9c133c..95aac89623 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_reassembly.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_reassembly.h * \brief This file defines the prototypes of the functions dealing with the reassembly of segments. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c old mode 100755 new mode 100644 index 6ea07a4677..37608d4330 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_RECEIVER_C 1 #include "platform_types.h" @@ -90,7 +83,7 @@ rlc_um_display_rx_window( LOG_T(RLC, "\n"); } - LOG_T(RLC, "%s%s| %04d |", RLC_FG_COLOR_DEFAULT, RLC_NORMAL_VIDEO, sn); + LOG_T(RLC, "%s%s| %04lu |", RLC_FG_COLOR_DEFAULT, RLC_NORMAL_VIDEO, sn); } strcpy(color, RLC_FG_COLOR_DEFAULT); diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h index b230a6cb40..5e93f272fd 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_receiver.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_receiver.h * \brief This file defines the prototypes of the functions dealing with the first stage of the receiving process. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c old mode 100755 new mode 100644 index 24890bf957..f9af7c1cc2 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.c @@ -1,40 +1,31 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE 1 #define RLC_UM_SEGMENT_C 1 //----------------------------------------------------------------------------- #include "platform_types.h" #include "platform_constants.h" //----------------------------------------------------------------------------- -#if USER_MODE #include -#endif #include "assertions.h" #include "msc.h" #include "list.h" @@ -122,7 +113,7 @@ rlc_um_segment_10 (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t *rlc_pP #endif } - if (!(pdu_mem_p = get_free_mem_block (data_pdu_size + sizeof(struct mac_tb_req)))) { + if (!(pdu_mem_p = get_free_mem_block (data_pdu_size + sizeof(struct mac_tb_req), __func__))) { #if TRACE_RLC_UM_SEGMENT LOG_E(RLC, PROTOCOL_RLC_UM_CTXT_FMT" ERROR COULD NOT GET NEW PDU, EXIT\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP,rlc_pP)); @@ -298,7 +289,7 @@ rlc_um_segment_10 (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t *rlc_pP // free SDU rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); - free_mem_block (sdu_in_buffer); + free_mem_block (sdu_in_buffer, __func__); sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); sdu_mngt_p = NULL; @@ -363,7 +354,7 @@ rlc_um_segment_10 (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t *rlc_pP // free SDU rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); - free_mem_block (sdu_in_buffer); + free_mem_block (sdu_in_buffer, __func__); sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); sdu_mngt_p = NULL; @@ -374,10 +365,8 @@ rlc_um_segment_10 (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t *rlc_pP sdu_mngt_p->sdu_remaining_size, pdu_remaining_size - sdu_mngt_p->sdu_remaining_size); #endif -#if USER_MODE #if !EXMIMO assert(1!=1); -#endif #endif memcpy(data, data_sdu_p, sdu_mngt_p->sdu_remaining_size); // reduce the size of the PDU @@ -387,7 +376,7 @@ rlc_um_segment_10 (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t *rlc_pP // free SDU rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); - free_mem_block (sdu_in_buffer); + free_mem_block (sdu_in_buffer, __func__); sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); sdu_mngt_p = NULL; @@ -510,7 +499,7 @@ rlc_um_segment_5 (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t *rlc_pP) #endif } - if (!(pdu_mem_p = get_free_mem_block (data_pdu_size + sizeof(struct mac_tb_req)))) { + if (!(pdu_mem_p = get_free_mem_block (data_pdu_size + sizeof(struct mac_tb_req), __func__))) { #if TRACE_RLC_UM_SEGMENT LOG_E(RLC, PROTOCOL_RLC_UM_CTXT_FMT" ERROR COULD NOT GET NEW PDU, EXIT\n", PROTOCOL_RLC_UM_CTXT_ARGS(ctxt_pP,rlc_pP)); @@ -686,7 +675,7 @@ rlc_um_segment_5 (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t *rlc_pP) // free SDU rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); - free_mem_block (sdu_in_buffer); + free_mem_block (sdu_in_buffer, __func__); sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); sdu_mngt_p = NULL; @@ -750,7 +739,7 @@ rlc_um_segment_5 (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t *rlc_pP) // free SDU rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); - free_mem_block (sdu_in_buffer); + free_mem_block (sdu_in_buffer, __func__); sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); sdu_mngt_p = NULL; @@ -761,9 +750,7 @@ rlc_um_segment_5 (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t *rlc_pP) sdu_mngt_p->sdu_remaining_size, pdu_remaining_size - sdu_mngt_p->sdu_remaining_size); #endif -#if USER_MODE assert(1!=1); -#endif memcpy(data, data_sdu_p, sdu_mngt_p->sdu_remaining_size); // reduce the size of the PDU continue_fill_pdu_with_sdu = 0; @@ -772,7 +759,7 @@ rlc_um_segment_5 (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t *rlc_pP) // free SDU rlc_pP->buffer_occupancy -= sdu_mngt_p->sdu_remaining_size; sdu_in_buffer = list_remove_head(&rlc_pP->input_sdus); - free_mem_block (sdu_in_buffer); + free_mem_block (sdu_in_buffer, __func__); sdu_in_buffer = list_get_head(&rlc_pP->input_sdus); sdu_mngt_p = NULL; } diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h index 45c8b3d16d..9794f9a502 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_segment.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_segment.h * \brief This file defines the prototypes of the functions dealing with the segmentation of PDCP SDUs. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h old mode 100755 new mode 100644 index 535998bfd1..7ab9798a38 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_structs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_structs.h * \brief This file defines structures used inside the RLC UM. * \author GAUTHIER Lionel @@ -43,9 +36,7 @@ # include "rlc_um_constants.h" # include "mac_primitives.h" # include "rlc_primitives.h" -//#ifdef USER_MODE # include "mac_rlc_primitives.h" -//#endif //USER_MODE //----------------------- /** * @addtogroup _rlc_um_impl_ diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c old mode 100755 new mode 100644 index 04afcff0ff..2c1fa9333f --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE #define RLC_C #define RLC_UM_TEST_C @@ -195,8 +188,8 @@ void rlc_um_v9_3_0_test_windows_10() rlc_um_init(&um1); rlc_um_init(&um2); - rlc_um_set_debug_infos(&um1, g_frame, 0, 0, 0, 1); - rlc_um_set_debug_infos(&um2, g_frame, 1, 1, 1, 1); + rlc_um_set_debug_infos(&um1, g_frame, 0, 0, 0, 1, 1 /*LC-id = RAB-id*/); + rlc_um_set_debug_infos(&um2, g_frame, 1, 1, 1, 1, 1 /*LC-id = RAB-id*/); rlc_um_configure(&um1, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch); rlc_um_configure(&um2, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch); @@ -249,8 +242,8 @@ void rlc_um_v9_3_0_test_windows_5() rlc_um_init(&um1); rlc_um_init(&um2); - rlc_um_set_debug_infos(&um1, g_frame, 0, 0, 0, 1); - rlc_um_set_debug_infos(&um2, g_frame, 1, 1, 1, 1); + rlc_um_set_debug_infos(&um1, g_frame, 0, 0, 0, 1, 1 /* LC-id = DRB-id */); + rlc_um_set_debug_infos(&um2, g_frame, 1, 1, 1, 1, 1 /* LC-id = DRB-id */); rlc_um_configure(&um1, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch); rlc_um_configure(&um2, g_frame, timer_reordering, sn_field_length, sn_field_length, is_mXch); @@ -308,7 +301,7 @@ void rlc_um_v9_3_0_test_send_sdu(rlc_um_entity_t *um_txP, int sdu_indexP) //----------------------------------------------------------------------------- { mem_block_t *sdu; - sdu = get_free_mem_block (strlen(g_sdus[sdu_indexP]) + 1 + sizeof (struct rlc_um_data_req_alloc)); + sdu = get_free_mem_block (strlen(g_sdus[sdu_indexP]) + 1 + sizeof (struct rlc_um_data_req_alloc), __func__); if (sdu != NULL) { // PROCESS OF COMPRESSION HERE: @@ -412,12 +405,12 @@ void rlc_um_v9_3_0_test_mac_rlc_loop (struct mac_data_ind* data_indP, struct ma *tx_packetsP = *tx_packetsP + 1; if (*drop_countP == 0) { - tb_dst = get_free_mem_block(sizeof (mac_rlc_max_rx_header_size_t) + tb_size); + tb_dst = get_free_mem_block(sizeof (mac_rlc_max_rx_header_size_t) + tb_size, __func__); memset(tb_dst->data, 0, sizeof (mac_rlc_max_rx_header_size_t) + tb_size); if (tb_dst != NULL) { //printf("[RLC-LOOP] Testing tb_dst (1)\n"); - check_free_mem_block(tb_dst); + check_free_mem_block(tb_dst, __func__); tb_dst->next = NULL; ((struct mac_tb_ind *) (tb_dst->data))->first_bit = 0; ((struct mac_tb_ind *) (tb_dst->data))->data_ptr = &tb_dst->data[sizeof (mac_rlc_max_rx_header_size_t)]; @@ -431,7 +424,7 @@ void rlc_um_v9_3_0_test_mac_rlc_loop (struct mac_data_ind* data_indP, struct ma list_add_tail_eurecom(tb_dst, &data_indP->data); data_indP->no_tb += 1; //printf("[RLC-LOOP] Testing tb_dst (2)\n"); - check_free_mem_block(tb_dst); + check_free_mem_block(tb_dst, __func__); } else { printf("Out of memory error\n"); exit(-1); @@ -444,9 +437,9 @@ void rlc_um_v9_3_0_test_mac_rlc_loop (struct mac_data_ind* data_indP, struct ma //printf("[RLC-LOOP] Testing tb_src\n"); - check_free_mem_block(tb_src); + check_free_mem_block(tb_src, __func__); - free_mem_block(tb_src); + free_mem_block(tb_src, __func__); if (data_indP->no_tb > 0) { printf("[RLC-LOOP] Exchange %d TBs\n",data_indP->no_tb); @@ -478,9 +471,9 @@ void rlc_um_v9_3_0_test_exchange_pdus(rlc_um_entity_t *um_txP, memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp)); memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp)); - mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status); + mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status,ENB_FLAG_YES); data_request_tx = rlc_um_mac_data_request(um_txP, g_frame); - mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status); + mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status,ENB_FLAG_YES); data_request_rx = rlc_um_mac_data_request(um_rxP, g_frame); @@ -524,9 +517,9 @@ void rlc_um_v9_3_0_test_exchange_delayed_pdus(rlc_um_entity_t *um_txP, memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp)); memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp)); - mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status); + mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status,ENB_FLAG_YES); data_request_tx = rlc_um_mac_data_request(um_txP, g_frame); - mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status); + mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status,ENB_FLAG_YES); data_request_rx = rlc_um_mac_data_request(um_rxP, g_frame); @@ -585,13 +578,13 @@ void rlc_um_v9_3_0_test_data_ind (module_id_t module_idP, rb_id_t rb_idP, sdu_si assert(g_send_sdu_ids[g_send_id_read_index[rb_idP]][rb_idP^1] == i); g_send_id_read_index[rb_idP] += 1; - free_mem_block(sduP); + free_mem_block(sduP, __func__); return; } } printf("[FRAME %05d][RLC][MOD %d][RB %d] RX UNKNOWN SDU %04d bytes\n",g_frame,module_idP, rb_idP, sizeP); - free_mem_block(sduP); + free_mem_block(sduP, __func__); assert(1==2); } else { for (i = 0; i < 37; i++) { @@ -599,13 +592,13 @@ void rlc_um_v9_3_0_test_data_ind (module_id_t module_idP, rb_id_t rb_idP, sdu_si printf("[FRAME %05d][RLC][MOD %02d][RB %02d] RX SDU %d %04d bytes\n",g_frame,module_idP, rb_idP, i, sizeP); assert(TEST_MAX_SEND_SDU > g_send_id_read_index[rb_idP]); g_send_id_read_index[rb_idP] += 1; - free_mem_block(sduP); + free_mem_block(sduP, __func__); return; } } printf("[FRAME %05d][RLC][MOD %d][RB %d] RX UNKNOWN SDU %04d bytes\n",g_frame,module_idP, rb_idP, sizeP); - free_mem_block(sduP); + free_mem_block(sduP, __func__); return; } } @@ -621,8 +614,8 @@ void rlc_um_v9_3_0_test_reordering(uint32_t sn_field_lengthP) um_info.is_mXch = 0; srand (0); - config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER); - config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER); + config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); + config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); rlc_um_display_rx_window(&um_tx); @@ -743,8 +736,8 @@ void rlc_um_v9_3_0_test_tx_rx_10(void) um_info.is_mXch = 0; srand (0); - config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER); - config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER); + config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); + config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); rlc_um_display_rx_window(&um_tx); @@ -1072,8 +1065,8 @@ void rlc_um_v9_3_0_test_tx_rx_5(void) um_info.is_mXch = 0; srand (0); - config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER); - config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER); + config_req_rlc_um (&um_tx, 0,0,0, &um_info, 0, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); + config_req_rlc_um (&um_rx, 0,1,1, &um_info, 1, SIGNALLING_RADIO_BEARER, SIGNALLING_RADIO_BEARER /*LC-id = DRB-id*/); rlc_um_display_rx_window(&um_tx); diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h old mode 100755 new mode 100644 index ae64c28278..2c874b8d24 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_test.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ # ifndef __RLC_UM_TEST_H__ # define __RLC_UM_TEST_H__ # ifdef RLC_UM_TEST_C diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c index 139490a680..91985e4800 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ #define RLC_UM_MODULE #define RLC_UM_VERY_SIMPLE_TEST_C #include @@ -51,7 +44,7 @@ rlc_um_test_send_sdu (rlc_um_entity_t* rlcP, uint32_t frame, unsigned int s switch (sdu_typeP) { case RLC_UM_TEST_SDU_TYPE_TCPIP: - sdu_mem = get_free_mem_block (strlen(tcip_sdu)+ 1 + sizeof (struct rlc_um_data_req_alloc)); + sdu_mem = get_free_mem_block (strlen(tcip_sdu)+ 1 + sizeof (struct rlc_um_data_req_alloc), __func__); if (sdu_mem != NULL) { memset (sdu_mem->data, 0, sizeof (struct rlc_um_data_req_alloc)); @@ -66,7 +59,7 @@ rlc_um_test_send_sdu (rlc_um_entity_t* rlcP, uint32_t frame, unsigned int s break; case RLC_UM_TEST_SDU_TYPE_VOIP: - sdu_mem = get_free_mem_block (strlen(voip_sdu)+ 1 + sizeof (struct rlc_um_data_req_alloc)); + sdu_mem = get_free_mem_block (strlen(voip_sdu)+ 1 + sizeof (struct rlc_um_data_req_alloc), __func__); if (sdu_mem != NULL) { memset (sdu_mem->data, 0, sizeof (struct rlc_um_data_req_alloc)); @@ -81,7 +74,7 @@ rlc_um_test_send_sdu (rlc_um_entity_t* rlcP, uint32_t frame, unsigned int s break; case RLC_UM_TEST_SDU_TYPE_SMALL: - sdu_mem = get_free_mem_block (strlen(very_small_sdu)+ 1 + sizeof (struct rlc_um_data_req_alloc)); + sdu_mem = get_free_mem_block (strlen(very_small_sdu)+ 1 + sizeof (struct rlc_um_data_req_alloc), __func__); if (sdu_mem != NULL) { memset (sdu_mem->data, 0, sizeof (struct rlc_um_data_req_alloc)); diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h index 790dc1ee50..261183ad1d 100644 --- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h +++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_very_simple_test.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_um_very_simple_test.h * \brief This file defines the prototypes of the functions dealing with the sending of self generated packet for very basic test or debug of RLC or lower layers. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/mac_primitives.h b/openair2/LAYER2/RLC/mac_primitives.h index e69de29bb2..4690bba42e 100644 --- a/openair2/LAYER2/RLC/mac_primitives.h +++ b/openair2/LAYER2/RLC/mac_primitives.h @@ -0,0 +1,21 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c index 66a4b07652..8d1ec2cfc7 100644 --- a/openair2/LAYER2/RLC/rlc.c +++ b/openair2/LAYER2/RLC/rlc.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* rlc.c ------------------- @@ -44,7 +37,21 @@ #include "assertions.h" +extern boolean_t pdcp_data_ind( + const protocol_ctxt_t* const ctxt_pP, + const srb_flag_t srb_flagP, + const MBMS_flag_t MBMS_flagP, + const rb_id_t rb_idP, + const sdu_size_t sdu_buffer_sizeP, + mem_block_t* const sdu_buffer_pP); +#define DEBUG_RLC_PDCP_INTERFACE 1 +//#define TRACE_RLC_PAYLOAD 1 +#define DEBUG_RLC_DATA_REQ 1 + + + +#include "rlc_proto_agent_primitives.h" // PROTO AGENT void async_server_thread_init (void) @@ -58,7 +65,6 @@ async_server_thread_init (void) || (pthread_cond_init (&async_server_notify, NULL) != 0)) { return; } - if (pthread_create (&async_server_thread, NULL, proto_server_init, (void*) NULL) != 0) { async_server_thread_finalize(); @@ -68,8 +74,6 @@ async_server_thread_init (void) } - - int async_server_thread_finalize (void) { @@ -108,20 +112,6 @@ async_server_thread_finalize (void) - - -extern boolean_t pdcp_data_ind( - const protocol_ctxt_t* const ctxt_pP, - const srb_flag_t srb_flagP, - const MBMS_flag_t MBMS_flagP, - const rb_id_t rb_idP, - const sdu_size_t sdu_buffer_sizeP, - mem_block_t* const sdu_buffer_pP); - -#define DEBUG_RLC_PDCP_INTERFACE 1 -//#define TRACE_RLC_PAYLOAD 1 -#define DEBUG_RLC_DATA_REQ 1 - //----------------------------------------------------------------------------- void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char* dataP, const signed long sizeP) //----------------------------------------------------------------------------- @@ -145,7 +135,7 @@ void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char* dataP, con LOG_T(componentP, " |\n"); } - LOG_T(componentP, " %04d |", octet_index); + LOG_T(componentP, " %04lu |", octet_index); } /* @@ -209,11 +199,6 @@ rlc_op_status_t rlc_stat_req ( hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; -#ifdef OAI_EMU - - CHECK_CTXT_ARGS(ctxt_pP) - -#endif AssertFatal (rb_idP < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MAX); key = RLC_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, rb_idP, srb_flagP); h_rc = hashtable_get(rlc_coll_p, key, (void**)&rlc_union_p); @@ -404,7 +389,7 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) rlc_mbms_id_t *mbms_id_p = NULL; logical_chan_id_t log_ch_id = 0; #endif @@ -418,15 +403,10 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, sdu_sizeP, sdu_pP); #endif -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) #else AssertFatal(MBMS_flagP == 0, "MBMS_flagP %u", MBMS_flagP); #endif -#ifdef OAI_EMU - - CHECK_CTXT_ARGS(ctxt_pP) - -#endif #if T_TRACER if (ctxt_pP->enb_flag) @@ -442,13 +422,13 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, DevAssert(sdu_pP != NULL); DevCheck(sdu_sizeP > 0, sdu_sizeP, 0, 0); -#ifndef Rel10 +#if !defined(Rel10) && !defined(Rel14) DevCheck(MBMS_flagP == 0, MBMS_flagP, 0, 0); #endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_IN); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) if (MBMS_flagP == TRUE) { if (ctxt_pP->enb_flag) { @@ -489,7 +469,7 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, switch (rlc_mode) { case RLC_MODE_NONE: - free_mem_block(sdu_pP); + free_mem_block(sdu_pP, __func__); LOG_E(RLC, PROTOCOL_CTXT_FMT" Received RLC_MODE_NONE as rlc_type for rb_id %u\n", PROTOCOL_CTXT_ARGS(ctxt_pP), rb_idP); @@ -498,9 +478,9 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, case RLC_MODE_AM: #ifdef DEBUG_RLC_DATA_REQ - msg("RLC_MODE_AM\n"); + LOG_D(RLC,"RLC_MODE_AM\n"); #endif - new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_am_data_req_alloc)); + new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_am_data_req_alloc), __func__); if (new_sdu_p != NULL) { // PROCESS OF COMPRESSION HERE: @@ -511,7 +491,7 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, ((struct rlc_am_data_req *) (new_sdu_p->data))->conf = confirmP; ((struct rlc_am_data_req *) (new_sdu_p->data))->mui = muiP; ((struct rlc_am_data_req *) (new_sdu_p->data))->data_offset = sizeof (struct rlc_am_data_req_alloc); - free_mem_block(sdu_pP); + free_mem_block(sdu_pP, __func__); rlc_am_data_req(ctxt_pP, &rlc_union_p->rlc.am, new_sdu_p); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT); return RLC_OP_STATUS_OK; @@ -524,9 +504,7 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, case RLC_MODE_UM: - //proto_server_receive(); - - new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_um_data_req_alloc)); + new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_um_data_req_alloc), __func__); if (new_sdu_p != NULL) { // PROCESS OF COMPRESSION HERE: @@ -535,11 +513,11 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, ((struct rlc_um_data_req *) (new_sdu_p->data))->data_size = sdu_sizeP; ((struct rlc_um_data_req *) (new_sdu_p->data))->data_offset = sizeof (struct rlc_um_data_req_alloc); - free_mem_block(sdu_pP); + free_mem_block(sdu_pP, __func__); rlc_um_data_req(ctxt_pP, &rlc_union_p->rlc.um, new_sdu_p); - //free_mem_block(new_sdu); + //free_mem_block(new_sdu, __func__); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT); return RLC_OP_STATUS_OK; } else { @@ -550,7 +528,7 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, break; case RLC_MODE_TM: - new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_tm_data_req_alloc)); + new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_tm_data_req_alloc), __func__); if (new_sdu_p != NULL) { // PROCESS OF COMPRESSION HERE: @@ -559,7 +537,7 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, ((struct rlc_tm_data_req *) (new_sdu_p->data))->data_size = sdu_sizeP; ((struct rlc_tm_data_req *) (new_sdu_p->data))->data_offset = sizeof (struct rlc_tm_data_req_alloc); - free_mem_block(sdu_pP); + free_mem_block(sdu_pP, __func__); rlc_tm_data_req(ctxt_pP, &rlc_union_p->rlc.tm, new_sdu_p); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT); return RLC_OP_STATUS_OK; @@ -572,19 +550,19 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, break; default: - free_mem_block(sdu_pP); + free_mem_block(sdu_pP, __func__); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT); return RLC_OP_STATUS_INTERNAL_ERROR; } -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) } else { /* MBMS_flag != 0 */ // LOG_I(RLC,"DUY rlc_data_req: mbms_rb_id in RLC instant is: %d\n", mbms_rb_id); if (sdu_pP != NULL) { if (sdu_sizeP > 0) { LOG_I(RLC,"received a packet with size %d for MBMS \n", sdu_sizeP); - new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_um_data_req_alloc)); + new_sdu_p = get_free_mem_block (sdu_sizeP + sizeof (struct rlc_um_data_req_alloc), __func__); if (new_sdu_p != NULL) { // PROCESS OF COMPRESSION HERE: @@ -592,10 +570,10 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, memcpy (&new_sdu_p->data[sizeof (struct rlc_um_data_req_alloc)], &sdu_pP->data[0], sdu_sizeP); ((struct rlc_um_data_req *) (new_sdu_p->data))->data_size = sdu_sizeP; ((struct rlc_um_data_req *) (new_sdu_p->data))->data_offset = sizeof (struct rlc_um_data_req_alloc); - free_mem_block(sdu_pP); + free_mem_block(sdu_pP, __func__); rlc_um_data_req(ctxt_pP, &rlc_union_p->rlc.um, new_sdu_p); - //free_mem_block(new_sdu); + //free_mem_block(new_sdu, __func__); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT); return RLC_OP_STATUS_OK; } else { @@ -616,8 +594,8 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP, } else /* MBMS_flag != 0 */ { - free_mem_block(sdu_pP); - LOG_E(RLC, "MBMS_flag != 0 while Rel10 is not defined...\n"); + free_mem_block(sdu_pP, __func__); + LOG_E(RLC, "MBMS_flag != 0 while Rel10/Rel14 is not defined...\n"); //handle_event(ERROR,"FILE %s FONCTION rlc_data_req() LINE %s : parameter module_id out of bounds :%d\n", __FILE__, __LINE__, module_idP); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RLC_DATA_REQ,VCD_FUNCTION_OUT); return RLC_OP_STATUS_BAD_PARAMETER; @@ -653,25 +631,25 @@ void rlc_data_ind ( T(T_ENB_RLC_UL, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->rnti), T_INT(rb_idP), T_INT(sdu_sizeP)); #endif -// if (!srb_flagP) -// { + if ((!srb_flagP) && (ctxt_pP->enb_flag == 1)) + { proto_agent_send_pdcp_data_ind(ctxt_pP, - srb_flagP, - MBMS_flagP, - rb_idP, - sdu_sizeP, - sdu_pP); -// } -// else -// { -// pdcp_data_ind ( -// ctxt_pP, -// srb_flagP, -// MBMS_flagP, -// rb_idP, -// sdu_sizeP, -// sdu_pP); -// } + srb_flagP, + MBMS_flagP, + rb_idP, + sdu_sizeP, + sdu_pP); + } + else + { + pdcp_data_ind ( + ctxt_pP, + srb_flagP, + MBMS_flagP, + rb_idP, + sdu_sizeP, + sdu_pP); + } } //----------------------------------------------------------------------------- void rlc_data_conf (const protocol_ctxt_t* const ctxt_pP, @@ -707,7 +685,7 @@ rlc_module_init (void) AssertFatal(rlc_coll_p != NULL, "UNRECOVERABLE error, RLC hashtable_create failed"); for (module_id1=0; module_id1 < NUMBER_OF_UE_MAX; module_id1++) { -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) for (k=0; k < RLC_MAX_MBMS_LC; k++) { rlc_mbms_lcid2service_session_id_ue[module_id1][k].service_id = 0; @@ -722,7 +700,7 @@ rlc_module_init (void) } for (module_id1=0; module_id1 < NUMBER_OF_eNB_MAX; module_id1++) { -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) for (k=0; k < RLC_MAX_MBMS_LC; k++) { rlc_mbms_lcid2service_session_id_eNB[module_id1][k].service_id = 0; @@ -741,8 +719,13 @@ rlc_module_init (void) /* Launch the RLC listening server * as a separate thread */ - async_server_thread_init(); - + static int started = 0; + if (started == 0) + { + async_server_thread_init(); + started = 1; + } + return(0); } diff --git a/openair2/LAYER2/RLC/rlc.h b/openair2/LAYER2/RLC/rlc.h old mode 100755 new mode 100644 index 79bdac92f2..8d4acbf835 --- a/openair2/LAYER2/RLC/rlc.h +++ b/openair2/LAYER2/RLC/rlc.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc.h * \brief This file, and only this file must be included by external code that interact with RLC layer. * \author GAUTHIER Lionel @@ -63,12 +56,13 @@ # include "DRB-ToReleaseList.h" // for proto_agent operation -#include "UTIL/LOG/log.h" -#include "ENB_APP/enb_config.h" -#include "LAYER2/PROTO_AGENT/proto_agent.h" +//#include "UTIL/LOG/log.h" +//#include "ENB_APP/enb_config.h" -#ifdef Rel10 + + +#if defined(Rel10) || defined(Rel14) #include "PMCH-InfoList-r9.h" #endif @@ -237,7 +231,7 @@ typedef struct rlc_mbms_id_s { mbms_session_id_t session_id; } rlc_mbms_id_t; -#if !defined(Rel10) +#if !defined(Rel10) && !defined(Rel14) # if !defined(maxServiceCount) //unused arrays rlc_mbms_array_ue rlc_mbms_array_eNB # define maxServiceCount 1 @@ -275,7 +269,18 @@ public_rlc(logical_chan_id_t rlc_mbms_rbid2lcid_eNB[NUMBER_OF_eNB_MAX][NB_RB_ (((hash_key_t)(rNTI)) << 8) | \ (((hash_key_t)(iS_eNB)) << 24) | \ (((hash_key_t)(rB_iD)) << 25) | \ - (((hash_key_t)(iS_sRB)) << 33)) + (((hash_key_t)(iS_sRB)) << 33) | \ + (((hash_key_t)(0x05)) << 34)) + +// index to the same RLC entity as RLC_COLL_KEY_VALUE(), but using LC_id instead +// the hidden last key indicates if this is a hash-key with RB_id (0x05) or LC_id (0x0a) +#define RLC_COLL_KEY_LCID_VALUE(eNB_iD, rNTI, iS_eNB, lC_iD, iS_sRB) \ + ((hash_key_t)eNB_iD | \ + (((hash_key_t)(rNTI)) << 8) | \ + (((hash_key_t)(iS_eNB)) << 24) | \ + (((hash_key_t)(lC_iD)) << 25) | \ + (((hash_key_t)(iS_sRB)) << 33) | \ + (((hash_key_t)(0x0a)) << 34)) // service id max val is maxServiceCount = 16 (asn1_constants.h) @@ -311,7 +316,7 @@ private_rlc_mac(struct mac_data_ind mac_rlc_deserialize_tb (char*, tb_size_t, //----------------------------------------------------------------------------- // PUBLIC INTERFACE WITH RRC //----------------------------------------------------------------------------- -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) /*! \fn rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t* const ctxtP, const srb_flag_t srb_flagP, const SRB_ToAddMod_t* const srb2addmod, const DRB_ToAddModList_t* const drb2add_listP, const DRB_ToReleaseList_t* const drb2release_listP, const PMCH_InfoList_r9_t * const pmch_info_listP) * \brief Function for RRC to configure a Radio Bearer. * \param[in] ctxtP Running context. @@ -438,10 +443,11 @@ public_rlc_rrc(void rrc_rlc_register_rrc (rrc_data_ind_cb_t rrc_data_indP, rrc_d * \param [in] eNB_flagP Flag to indicate eNB (1) or UE (0) * \param [in] MBMS_flagP Flag to indicate whether this is the MBMS service (1) or not (0) * \param [in] rb_idP Radio bearer identifier. +* \param [in] tb_sizeP Available Tx TBS in bytes. For UE only. * \param [in,out] bufferP Memory area to fill with the bytes requested by MAC. * \return A status about the processing, OK or error code. */ -public_rlc_mac(tbs_size_t mac_rlc_data_req (const module_id_t, const rnti_t, const eNB_index_t, const frame_t, const eNB_flag_t, const MBMS_flag_t, logical_chan_id_t, char*);) +public_rlc_mac(tbs_size_t mac_rlc_data_req (const module_id_t, const rnti_t, const eNB_index_t, const frame_t, const eNB_flag_t, const MBMS_flag_t, logical_chan_id_t, const tb_size_t,char*);) /*! \fn void mac_rlc_data_ind (const module_id_t mod_idP, const rnti_t rntiP, const frame_t frameP, const eNB_flag_t eNB_flagP, const MBMS_flag_t MBMS_flagP, logical_chan_id_t rb_idP, uint32_t frameP, char* bufferP, tb_size_t tb_sizeP, num_tb_t num_tbP, crc_t *crcs) * \brief Interface with MAC layer, deserialize the transport blocks sent by MAC, then map data indication to the RLC instance corresponding to the radio bearer identifier. @@ -459,18 +465,31 @@ public_rlc_mac(tbs_size_t mac_rlc_data_req (const module_id_t, co public_rlc_mac(void mac_rlc_data_ind (const module_id_t, const rnti_t, const eNB_index_t,const frame_t, const eNB_flag_t, const MBMS_flag_t, logical_chan_id_t, char*, tb_size_t, num_tb_t, crc_t* );) -/*! \fn mac_rlc_status_resp_t mac_rlc_status_ind (const module_id_t mod_idP, const rnti_t rntiP, const frame_t frameP, const eNB_flag_t eNB_flagP, const MBMS_flag_t MBMS_flagP, logical_chan_id_t rb_idP, tb_size_t tb_sizeP) +/*! \fn mac_rlc_status_resp_t mac_rlc_status_ind (const module_id_t mod_idP, const rnti_t rntiP, const frame_t frameP, const sub_frame_t subframeP, const eNB_flag_t eNB_flagP, const MBMS_flag_t MBMS_flagP, logical_chan_id_t rb_idP, tb_size_t tb_sizeP) * \brief Interface with MAC layer, request and set the number of bytes scheduled for transmission by the RLC instance corresponding to the radio bearer identifier. * \param[in] mod_idP Virtualized module identifier. * \param[in] rntiP UE identifier. * \param[in] frameP Frame index. +* \param[in] subframeP SubFrame index. * \param[in] eNB_flagP Flag to indicate eNB operation (1 true, 0 false) * \param[in] MBMS_flagP Flag to indicate whether this is the MBMS service (1) or not (0) * \param[in] rb_idP Radio bearer identifier. * \param[in] tb_sizeP Size of a transport block set in bytes. * \return The maximum number of bytes that the RLC instance can send in the next transmission sequence. */ -public_rlc_mac(mac_rlc_status_resp_t mac_rlc_status_ind (const module_id_t, const rnti_t, const eNB_index_t, const frame_t, const eNB_flag_t, const MBMS_flag_t, logical_chan_id_t, tb_size_t );) +public_rlc_mac(mac_rlc_status_resp_t mac_rlc_status_ind (const module_id_t, const rnti_t, const eNB_index_t, const frame_t, const sub_frame_t, const eNB_flag_t, const MBMS_flag_t, logical_chan_id_t, tb_size_t );) + +/*! \fn rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind(const module_id_t module_idP, const rnti_t rntiP, const eNB_index_t eNB_index, const frame_t frameP, const sub_frame_t subframeP,const eNB_flag_t enb_flagP, const logical_chan_id_t channel_idP) +* \brief Interface with MAC layer, UE only: request and get the number of bytes scheduled for transmission by the RLC instance corresponding to the radio bearer identifier. +* \param[in] mod_idP Virtualized module identifier. +* \param[in] rntiP UE identifier. +* \param[in] frameP Frame index. +* \param[in] subframeP SubFrame index. +* \param[in] eNB_flagP Flag to indicate eNB operation (1 true, 0 false) +* \param[in] channel_idP Logical Channel identifier. +* \return The maximum number of bytes that the RLC instance can send in the next transmission sequence. +*/ +public_rlc_mac(rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind(const module_id_t, const rnti_t, const eNB_index_t, const frame_t, const sub_frame_t, const eNB_flag_t, const logical_chan_id_t );) //----------------------------------------------------------------------------- // RLC methods //----------------------------------------------------------------------------- @@ -650,10 +669,6 @@ public_rlc(rlc_op_status_t rlc_stat_req ( public_rlc(int rlc_module_init(void);) /** @} */ -#ifndef USER_MODE -#define assert(x) ((x)?msg("rlc assertion fails\n"):0) -#endif - #define RLC_FG_COLOR_BLACK "\e[0;30m" #define RLC_FG_COLOR_RED "\e[0;31m" @@ -681,4 +696,9 @@ pthread_t async_server_thread; int async_server_thread_finalize (void); void async_server_thread_init (void); + + + + + #endif diff --git a/openair2/LAYER2/RLC/rlc_def.h b/openair2/LAYER2/RLC/rlc_def.h old mode 100755 new mode 100644 index 1205ad2891..e7014043f7 --- a/openair2/LAYER2/RLC/rlc_def.h +++ b/openair2/LAYER2/RLC/rlc_def.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_def.h * \brief This file contains constants for RLC internal use. * \author GAUTHIER Lionel @@ -71,6 +64,7 @@ enum RLC_OPERATION_MODE { TRANSMITTER_ONLY = 0x00, // dimensions # define SN_12BITS_MASK 0x0FFF # define RLC_SN_OVERFLOW 0xFFFF +# define RLC_SN_UNDEFINED RLC_SN_OVERFLOW //---------------------------------------------------------- // DISCARD //---------------------------------------------------------- diff --git a/openair2/LAYER2/RLC/rlc_def_lte.h b/openair2/LAYER2/RLC/rlc_def_lte.h index 01bf2ac486..aa4dac79ae 100644 --- a/openair2/LAYER2/RLC/rlc_def_lte.h +++ b/openair2/LAYER2/RLC/rlc_def_lte.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_def_lte.h * \brief This file contains LTE constants for RLC internal use. * \author GAUTHIER Lionel diff --git a/openair2/LAYER2/RLC/rlc_mac.c b/openair2/LAYER2/RLC/rlc_mac.c index 3bde40888f..497937d073 100644 --- a/openair2/LAYER2/RLC/rlc_mac.c +++ b/openair2/LAYER2/RLC/rlc_mac.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* rlc_mac.c ------------------- @@ -64,7 +57,7 @@ struct mac_data_ind mac_rlc_deserialize_tb ( list_init(&data_ind.data, NULL); while (num_tbP > 0) { - tb_p = get_free_mem_block(sizeof (mac_rlc_max_rx_header_size_t) + tb_sizeP); + tb_p = get_free_mem_block(sizeof (mac_rlc_max_rx_header_size_t) + tb_sizeP, __func__); if (tb_p != NULL) { ((struct mac_tb_ind *) (tb_p->data))->first_bit = 0; @@ -117,7 +110,7 @@ tbs_size_t mac_rlc_serialize_tb (char* buffer_pP, list_t transport_blocksP) #endif memcpy(&buffer_pP[tbs_size], &((struct mac_tb_req *) (tb_p->data))->data_ptr[0], tb_size); tbs_size = tbs_size + tb_size; - free_mem_block(tb_p); + free_mem_block(tb_p, __func__); } } @@ -132,11 +125,11 @@ tbs_size_t mac_rlc_data_req( const eNB_flag_t enb_flagP, const MBMS_flag_t MBMS_flagP, const logical_chan_id_t channel_idP, + const tb_size_t tb_sizeP, char *buffer_pP) { //----------------------------------------------------------------------------- struct mac_data_req data_request; - rb_id_t rb_id = 0; rlc_mode_t rlc_mode = RLC_MODE_NONE; rlc_mbms_id_t *mbms_id_p = NULL; rlc_union_t *rlc_union_p = NULL; @@ -164,13 +157,6 @@ tbs_size_t mac_rlc_data_req( AssertFatal (channel_idP < NB_RB_MAX, "channel id is too high (%u/%d)!\n", channel_idP, NB_RB_MAX); } -#ifdef OAI_EMU - CHECK_CTXT_ARGS(&ctxt); - //printf("MBMS_flagP %d, MBMS_FLAG_NO %d \n",MBMS_flagP, MBMS_FLAG_NO); - // AssertFatal (MBMS_flagP == MBMS_FLAG_NO ," MBMS FLAG SHOULD NOT BE SET IN mac_rlc_data_req in UE\n"); - -#endif - if (MBMS_flagP) { if (enb_flagP) { mbms_id_p = &rlc_mbms_lcid2service_session_id_eNB[module_idP][channel_idP]; @@ -179,13 +165,7 @@ tbs_size_t mac_rlc_data_req( return (tbs_size_t)0; } } else { - if (channel_idP > 2) { - rb_id = channel_idP - 2; - } else { - rb_id = channel_idP; - } - - key = RLC_COLL_KEY_VALUE(module_idP, rntiP, enb_flagP, rb_id, srb_flag); + key = RLC_COLL_KEY_LCID_VALUE(module_idP, rntiP, enb_flagP, channel_idP, srb_flag); } h_rc = hashtable_get(rlc_coll_p, key, (void**)&rlc_union_p); @@ -194,7 +174,7 @@ tbs_size_t mac_rlc_data_req( rlc_mode = rlc_union_p->mode; } else { rlc_mode = RLC_MODE_NONE; - AssertFatal (0 , "RLC not configured rb id %u lcid %u RNTI %x!\n", rb_id, channel_idP, rntiP); + AssertFatal (0 , "RLC not configured lcid %u RNTI %x!\n", channel_idP, rntiP); } switch (rlc_mode) { @@ -203,12 +183,14 @@ tbs_size_t mac_rlc_data_req( break; case RLC_MODE_AM: - data_request = rlc_am_mac_data_request(&ctxt, &rlc_union_p->rlc.am); + if (!enb_flagP) rlc_am_set_nb_bytes_requested_by_mac(&rlc_union_p->rlc.am,tb_sizeP); + data_request = rlc_am_mac_data_request(&ctxt, &rlc_union_p->rlc.am,enb_flagP); ret_tb_size =mac_rlc_serialize_tb(buffer_pP, data_request.data); break; case RLC_MODE_UM: - data_request = rlc_um_mac_data_request(&ctxt, &rlc_union_p->rlc.um); + if (!enb_flagP) rlc_um_set_nb_bytes_requested_by_mac(&rlc_union_p->rlc.um,tb_sizeP); + data_request = rlc_um_mac_data_request(&ctxt, &rlc_union_p->rlc.um,enb_flagP); ret_tb_size = mac_rlc_serialize_tb(buffer_pP, data_request.data); break; @@ -244,7 +226,6 @@ void mac_rlc_data_ind ( crc_t *crcs_pP) { //----------------------------------------------------------------------------- - rb_id_t rb_id = 0; rlc_mode_t rlc_mode = RLC_MODE_NONE; rlc_mbms_id_t *mbms_id_p = NULL; rlc_union_t *rlc_union_p = NULL; @@ -268,18 +249,6 @@ void mac_rlc_data_ind ( } #endif // DEBUG_MAC_INTERFACE -#ifdef OAI_EMU - - if (MBMS_flagP) - AssertFatal (channel_idP < RLC_MAX_MBMS_LC, "channel id is too high (%u/%d)!\n", - channel_idP, RLC_MAX_MBMS_LC); - else - AssertFatal (channel_idP < NB_RB_MAX, "channel id is too high (%u/%d)!\n", - channel_idP, NB_RB_MAX); - - CHECK_CTXT_ARGS(&ctxt); - -#endif #if T_TRACER if (enb_flagP) @@ -294,13 +263,7 @@ void mac_rlc_data_ind ( return; } } else { - if (channel_idP > 2) { - rb_id = channel_idP - 2; - } else { - rb_id = channel_idP; - } - - key = RLC_COLL_KEY_VALUE(module_idP, rntiP, enb_flagP, rb_id, srb_flag); + key = RLC_COLL_KEY_LCID_VALUE(module_idP, rntiP, enb_flagP, channel_idP, srb_flag); } h_rc = hashtable_get(rlc_coll_p, key, (void**)&rlc_union_p); @@ -341,6 +304,7 @@ mac_rlc_status_resp_t mac_rlc_status_ind( const rnti_t rntiP, const eNB_index_t eNB_index, const frame_t frameP, + const sub_frame_t subframeP, const eNB_flag_t enb_flagP, const MBMS_flag_t MBMS_flagP, const logical_chan_id_t channel_idP, @@ -350,7 +314,6 @@ mac_rlc_status_resp_t mac_rlc_status_ind( mac_rlc_status_resp_t mac_rlc_status_resp; struct mac_status_ind tx_status; struct mac_status_resp status_resp; - rb_id_t rb_id = 0; rlc_mode_t rlc_mode = RLC_MODE_NONE; rlc_mbms_id_t *mbms_id_p = NULL; rlc_union_t *rlc_union_p = NULL; @@ -359,37 +322,12 @@ mac_rlc_status_resp_t mac_rlc_status_ind( srb_flag_t srb_flag = (channel_idP <= 2) ? SRB_FLAG_YES : SRB_FLAG_NO; protocol_ctxt_t ctxt; - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, enb_flagP, rntiP, frameP, 0, eNB_index); + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, enb_flagP, rntiP, frameP, subframeP, eNB_index); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_MAC_RLC_STATUS_IND,VCD_FUNCTION_IN); memset (&mac_rlc_status_resp, 0, sizeof(mac_rlc_status_resp_t)); memset (&tx_status , 0, sizeof(struct mac_status_ind)); -#ifdef OAI_EMU - - if (MBMS_flagP) - AssertFatal (channel_idP < RLC_MAX_MBMS_LC, - "%s channel id is too high (%u/%d) enb module id %u ue %u!\n", - (enb_flagP) ? "eNB" : "UE", - channel_idP, - RLC_MAX_MBMS_LC, - module_idP, - rntiP); - else - AssertFatal (channel_idP < NB_RB_MAX, - "%s channel id is too high (%u/%d) enb module id %u ue %u!\n", - (enb_flagP) ? "eNB" : "UE", - channel_idP, - NB_RB_MAX, - module_idP, - rntiP); - - CHECK_CTXT_ARGS(&ctxt); - -#endif - - - if (MBMS_flagP) { if (enb_flagP) { mbms_id_p = &rlc_mbms_lcid2service_session_id_eNB[module_idP][channel_idP]; @@ -399,13 +337,7 @@ mac_rlc_status_resp_t mac_rlc_status_ind( key = RLC_COLL_KEY_MBMS_VALUE(module_idP, rntiP, enb_flagP, mbms_id_p->service_id, mbms_id_p->session_id); } else { - if (channel_idP > 2) { - rb_id = channel_idP - 2; - } else { - rb_id = channel_idP; - } - - key = RLC_COLL_KEY_VALUE(module_idP, rntiP, enb_flagP, rb_id, srb_flag); + key = RLC_COLL_KEY_LCID_VALUE(module_idP, rntiP, enb_flagP, channel_idP, srb_flag); } h_rc = hashtable_get(rlc_coll_p, key, (void**)&rlc_union_p); @@ -425,7 +357,7 @@ mac_rlc_status_resp_t mac_rlc_status_ind( break; case RLC_MODE_AM: - status_resp = rlc_am_mac_status_indication(&ctxt, &rlc_union_p->rlc.am, tb_sizeP, tx_status); + status_resp = rlc_am_mac_status_indication(&ctxt, &rlc_union_p->rlc.am, tb_sizeP, tx_status,enb_flagP); mac_rlc_status_resp.bytes_in_buffer = status_resp.buffer_occupancy_in_bytes; mac_rlc_status_resp.head_sdu_creation_time = status_resp.head_sdu_creation_time; mac_rlc_status_resp.head_sdu_remaining_size_to_send = status_resp.head_sdu_remaining_size_to_send; @@ -434,7 +366,7 @@ mac_rlc_status_resp_t mac_rlc_status_ind( break; case RLC_MODE_UM: - status_resp = rlc_um_mac_status_indication(&ctxt, &rlc_union_p->rlc.um, tb_sizeP, tx_status); + status_resp = rlc_um_mac_status_indication(&ctxt, &rlc_union_p->rlc.um, tb_sizeP, tx_status, enb_flagP); mac_rlc_status_resp.bytes_in_buffer = status_resp.buffer_occupancy_in_bytes; mac_rlc_status_resp.pdus_in_buffer = status_resp.buffer_occupancy_in_pdus; mac_rlc_status_resp.head_sdu_creation_time = status_resp.head_sdu_creation_time; @@ -458,3 +390,65 @@ mac_rlc_status_resp_t mac_rlc_status_ind( return mac_rlc_status_resp; } +//----------------------------------------------------------------------------- +rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind( + const module_id_t module_idP, + const rnti_t rntiP, + const eNB_index_t eNB_index, + const frame_t frameP, + const sub_frame_t subframeP, + const eNB_flag_t enb_flagP, + const logical_chan_id_t channel_idP) +{ + //----------------------------------------------------------------------------- + rlc_buffer_occupancy_t mac_rlc_buffer_occupancy_resp = 0; + rlc_mode_t rlc_mode = RLC_MODE_NONE; + rlc_union_t *rlc_union_p = NULL; + hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; + hashtable_rc_t h_rc; + srb_flag_t srb_flag = (channel_idP <= 2) ? SRB_FLAG_YES : SRB_FLAG_NO; + protocol_ctxt_t ctxt; + + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, enb_flagP, rntiP, frameP, 0, eNB_index); + + //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_MAC_RLC_GET_BUFFER_OCCUPANCY_IND,VCD_FUNCTION_IN); + + + /* Assumptions : for UE only */ + /* At each TTI, Buffer Occupancy is first computed in mac_rlc_status_ind called by MAC ue_scheduler() function */ + /* Then this function is called during MAC multiplexing ue_get_sdu(), and it may be call several times for the same bearer if it is in AM mode and there are several PDU types to transmit */ + AssertFatal(enb_flagP == FALSE,"RLC Tx mac_rlc_get_buffer_occupancy_ind function is not implemented for eNB LcId=%d\n", channel_idP); + + + key = RLC_COLL_KEY_LCID_VALUE(module_idP, rntiP, enb_flagP, channel_idP, srb_flag); + + + h_rc = hashtable_get(rlc_coll_p, key, (void**)&rlc_union_p); + + if (h_rc == HASH_TABLE_OK) { + rlc_mode = rlc_union_p->mode; + } else { + rlc_mode = RLC_MODE_NONE; + //LOG_W(RLC , "[%s] RLC not configured rb id %u lcid %u module %u!\n", __FUNCTION__, rb_id, channel_idP, ue_module_idP); + //LOG_D(RLC , "[%s] RLC not configured rb id %u lcid %u module %u!\n", __FUNCTION__, rb_id, channel_idP, ue_module_idP); + } + + switch (rlc_mode) { + case RLC_MODE_AM: + mac_rlc_buffer_occupancy_resp = rlc_am_get_buffer_occupancy_in_bytes(&ctxt, &rlc_union_p->rlc.am); + break; + + case RLC_MODE_UM: + mac_rlc_buffer_occupancy_resp = rlc_um_get_buffer_occupancy(&rlc_union_p->rlc.um); + break; + + default: + mac_rlc_buffer_occupancy_resp = 0 ; + } + + //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_MAC_RLC_GET_BUFFER_OCCUPANCY_IND,VCD_FUNCTION_OUT); + + return mac_rlc_buffer_occupancy_resp; +} + + diff --git a/openair2/LAYER2/RLC/rlc_mpls.c b/openair2/LAYER2/RLC/rlc_mpls.c index 263b92b063..34e4f028ae 100644 --- a/openair2/LAYER2/RLC/rlc_mpls.c +++ b/openair2/LAYER2/RLC/rlc_mpls.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* rlc_mpls.c ------------------- diff --git a/openair2/LAYER2/RLC/rlc_primitives.h b/openair2/LAYER2/RLC/rlc_primitives.h old mode 100755 new mode 100644 index d77d131345..bb83852775 --- a/openair2/LAYER2/RLC/rlc_primitives.h +++ b/openair2/LAYER2/RLC/rlc_primitives.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file rlc_primitives.h * \brief This file contains constants definition for RLC primitives. * \author GAUTHIER Lionel @@ -38,10 +31,8 @@ #ifndef __RLC_PRIMITIVES_H__ # define __RLC_PRIMITIVES_H__ -# ifdef USER_MODE -# include -# include -# endif +# include +# include # include "platform_types.h" # include "platform_constants.h" # include "mem_block.h" @@ -211,4 +202,5 @@ struct crlc_primitive { struct crlc_status_ind c_status_ind; } primitive; }; + #endif diff --git a/openair2/LAYER2/RLC/rlc_proto_agent_primitives.h b/openair2/LAYER2/RLC/rlc_proto_agent_primitives.h new file mode 100644 index 0000000000..0084e725f1 --- /dev/null +++ b/openair2/LAYER2/RLC/rlc_proto_agent_primitives.h @@ -0,0 +1,16 @@ + +#ifndef __PROTO_AGENT_RLC_PRIMITIVES_H__ +#define __PROTO_AGENT_RLC_PRIMITIVES_H__ + +#include "RRC/LITE/defs.h" +#include "LAYER2/PROTO_AGENT/proto_agent.h" +// PROTO AGENT +pthread_t async_server_thread; +int async_server_thread_finalize (void); +void async_server_thread_init (void); + +pthread_mutex_t async_server_lock; +pthread_cond_t async_server_notify; +int async_server_shutdown; + +#endif \ No newline at end of file diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c index eccea461ab..dee6ba7000 100644 --- a/openair2/LAYER2/RLC/rlc_rrc.c +++ b/openair2/LAYER2/RLC/rlc_rrc.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /* rlc_rrc.c ------------------- @@ -40,16 +33,13 @@ #include "rlc_um.h" #include "rlc_tm.h" #include "UTIL/LOG/log.h" -#ifdef OAI_EMU -#include "UTIL/OCG/OCG_vars.h" -#endif #include "RLC-Config.h" #include "DRB-ToAddMod.h" #include "DRB-ToAddModList.h" #include "SRB-ToAddMod.h" #include "SRB-ToAddModList.h" #include "DL-UM-RLC.h" -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) #include "PMCH-InfoList-r9.h" #endif @@ -60,7 +50,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP const SRB_ToAddModList_t * const srb2add_listP, const DRB_ToAddModList_t * const drb2add_listP, const DRB_ToReleaseList_t * const drb2release_listP -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) ,const PMCH_InfoList_r9_t * const pmch_InfoList_r9_pP #endif ) @@ -76,7 +66,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP rlc_union_t *rlc_union_p = NULL; hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) int i, j; MBMS_SessionInfoList_r9_t *mbms_SessionInfoList_r9_p = NULL; MBMS_SessionInfo_r9_t *MBMS_SessionInfo_p = NULL; @@ -95,18 +85,12 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP LOG_D(RLC, PROTOCOL_CTXT_FMT" CONFIG REQ ASN1 \n", PROTOCOL_CTXT_ARGS(ctxt_pP)); -#ifdef OAI_EMU - - CHECK_CTXT_ARGS(ctxt_pP) - -#endif - if (srb2add_listP != NULL) { for (cnt=0; cntlist.count; cnt++) { rb_id = srb2add_listP->list.array[cnt]->srb_Identity; - lc_id = rb_id + 2; + lc_id = rb_id; - LOG_D(RLC, "Adding SRB %d, rb_id %d\n",srb2add_listP->list.array[cnt]->srb_Identity,rb_id); + LOG_D(RLC, "Adding SRB %ld, rb_id %d\n",srb2add_listP->list.array[cnt]->srb_Identity,rb_id); srb_toaddmod_p = srb2add_listP->list.array[cnt]; if (srb_toaddmod_p->rlc_Config) { @@ -125,7 +109,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP ctxt_pP, SRB_FLAG_YES, &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.am, - rb_id); + rb_id, lc_id); } else { LOG_E(RLC, PROTOCOL_CTXT_FMT" ERROR IN ALLOCATING SRB %d \n", PROTOCOL_CTXT_ARGS(ctxt_pP), @@ -144,7 +128,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP UNUSED_PARAM_MBMS_SERVICE_ID, &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.um_Bi_Directional.ul_UM_RLC, &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.um_Bi_Directional.dl_UM_RLC, - rb_id); + rb_id, lc_id); } else { LOG_E(RLC, PROTOCOL_CTXT_FMT" ERROR IN ALLOCATING SRB %d \n", PROTOCOL_CTXT_ARGS(ctxt_pP), @@ -163,7 +147,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP UNUSED_PARAM_MBMS_SERVICE_ID, &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.um_Uni_Directional_UL.ul_UM_RLC, NULL, - rb_id); + rb_id, lc_id); } else { LOG_E(RLC, PROTOCOL_CTXT_FMT" ERROR IN ALLOCATING SRB %d \n", PROTOCOL_CTXT_ARGS(ctxt_pP), @@ -182,7 +166,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP UNUSED_PARAM_MBMS_SERVICE_ID, NULL, &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.um_Uni_Directional_DL.dl_UM_RLC, - rb_id); + rb_id, lc_id); } else { LOG_E(RLC, PROTOCOL_CTXT_FMT" ERROR IN ALLOCATING SRB %d \n", PROTOCOL_CTXT_ARGS(ctxt_pP), @@ -202,6 +186,27 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP case SRB_ToAddMod__rlc_Config_PR_defaultValue: //#warning TO DO SRB_ToAddMod__rlc_Config_PR_defaultValue + LOG_I(RRC, "RLC SRB1 is default value !!\n"); + struct RLC_Config__am * config_am_pP = &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.am; + config_am_pP->dl_AM_RLC.t_Reordering = T_Reordering_ms35; + config_am_pP->dl_AM_RLC.t_StatusProhibit = T_StatusProhibit_ms0; + config_am_pP->ul_AM_RLC.t_PollRetransmit = T_PollRetransmit_ms45; + config_am_pP->ul_AM_RLC.pollPDU = PollPDU_pInfinity; + config_am_pP->ul_AM_RLC.pollByte = PollByte_kBinfinity; + config_am_pP->ul_AM_RLC.maxRetxThreshold = UL_AM_RLC__maxRetxThreshold_t4; + + if (rrc_rlc_add_rlc (ctxt_pP, SRB_FLAG_YES, MBMS_FLAG_NO, rb_id, lc_id, RLC_MODE_AM) != NULL) { + config_req_rlc_am_asn1 ( + ctxt_pP, + SRB_FLAG_YES, + &srb_toaddmod_p->rlc_Config->choice.explicitValue.choice.am, + rb_id,lc_id); + } else { + LOG_E(RLC, PROTOCOL_CTXT_FMT" ERROR IN ALLOCATING SRB %d \n", + PROTOCOL_CTXT_ARGS(ctxt_pP), + rb_id); + } +/* if (rrc_rlc_add_rlc (ctxt_pP, SRB_FLAG_YES, MBMS_FLAG_NO, rb_id, lc_id, RLC_MODE_UM) != NULL) { config_req_rlc_um_asn1( ctxt_pP, @@ -211,12 +216,13 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP UNUSED_PARAM_MBMS_SERVICE_ID, NULL, // TO DO DEFAULT CONFIG NULL, // TO DO DEFAULT CONFIG - rb_id); + rb_id, lc_id); } else { LOG_D(RLC, PROTOCOL_CTXT_FMT" ERROR IN ALLOCATING SRB %d \n", PROTOCOL_CTXT_ARGS(ctxt_pP), rb_id); } + */ break; @@ -232,9 +238,19 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP drb_toaddmod_p = drb2add_listP->list.array[cnt]; drb_id = drb_toaddmod_p->drb_Identity; - lc_id = drb_id + 2; + if (drb_toaddmod_p->logicalChannelIdentity) { + lc_id = *drb_toaddmod_p->logicalChannelIdentity; + } else { + LOG_E(RLC, PROTOCOL_CTXT_FMT" logicalChannelIdentity is missing from drb-ToAddMod information element!\n", PROTOCOL_CTXT_ARGS(ctxt_pP)); + continue; + } - LOG_D(RLC, "Adding DRB %d, lc_id %d\n",drb_id,lc_id); + if (lc_id == 1 || lc_id == 2) { + LOG_E(RLC, PROTOCOL_CTXT_FMT" logicalChannelIdentity = %d is invalid in RRC message when adding DRB!\n", PROTOCOL_CTXT_ARGS(ctxt_pP), lc_id); + continue; + } + + LOG_D(RLC, "Adding DRB %ld, lc_id %d\n",drb_id,lc_id); if (drb_toaddmod_p->rlc_Config) { @@ -249,7 +265,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP ctxt_pP, SRB_FLAG_NO, &drb_toaddmod_p->rlc_Config->choice.am, - drb_id); + drb_id, lc_id); } break; @@ -264,7 +280,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP UNUSED_PARAM_MBMS_SERVICE_ID, &drb_toaddmod_p->rlc_Config->choice.um_Bi_Directional.ul_UM_RLC, &drb_toaddmod_p->rlc_Config->choice.um_Bi_Directional.dl_UM_RLC, - drb_id); + drb_id, lc_id); } break; @@ -279,7 +295,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP UNUSED_PARAM_MBMS_SERVICE_ID, &drb_toaddmod_p->rlc_Config->choice.um_Uni_Directional_UL.ul_UM_RLC, NULL, - drb_id); + drb_id, lc_id); } break; @@ -294,13 +310,13 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP UNUSED_PARAM_MBMS_SERVICE_ID, NULL, &drb_toaddmod_p->rlc_Config->choice.um_Uni_Directional_DL.dl_UM_RLC, - drb_id); + drb_id, lc_id); } break; default: - LOG_W(RLC, PROTOCOL_CTXT_FMT"[RB %u] unknown drb_toaddmod_p->rlc_Config->present \n", + LOG_W(RLC, PROTOCOL_CTXT_FMT"[RB %ld] unknown drb_toaddmod_p->rlc_Config->present \n", PROTOCOL_CTXT_ARGS(ctxt_pP), drb_id); } @@ -319,7 +335,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP } } -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) if (pmch_InfoList_r9_pP != NULL) { for (i=0; ilist.count; i++) { @@ -378,7 +394,7 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t * const ctxt_pP mbms_service_id, NULL, &dl_um_rlc, - rb_id); + rb_id, lc_id); } } } @@ -459,19 +475,17 @@ rlc_op_status_t rrc_rlc_remove_rlc ( logical_chan_id_t lcid = 0; hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; + hash_key_t key_lcid = HASHTABLE_NOT_A_KEY_VALUE; + hashtable_rc_t h_lcid_rc; rlc_union_t *rlc_union_p = NULL; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) rlc_mbms_id_t *mbms_id_p = NULL; -#endif -#ifdef OAI_EMU - CHECK_CTXT_ARGS(ctxt_pP) - #endif /* for no gcc warnings */ (void)lcid; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) if (MBMS_flagP == TRUE) { if (ctxt_pP->enb_flag) { @@ -502,23 +516,49 @@ rlc_op_status_t rrc_rlc_remove_rlc ( h_rc = hashtable_get(rlc_coll_p, key, (void**)&rlc_union_p); if (h_rc == HASH_TABLE_OK) { - h_rc = hashtable_remove(rlc_coll_p, key); - LOG_D(RLC, PROTOCOL_CTXT_FMT"[%s %u] RELEASED %s\n", - PROTOCOL_CTXT_ARGS(ctxt_pP), - (srb_flagP) ? "SRB" : "DRB", - rb_idP, - (srb_flagP) ? "SRB" : "DRB"); - } else if (h_rc == HASH_TABLE_KEY_NOT_EXISTS) { - LOG_D(RLC, PROTOCOL_CTXT_FMT"[%s %u] RELEASE : RLC NOT FOUND %s\n", - PROTOCOL_CTXT_ARGS(ctxt_pP), - (srb_flagP) ? "SRB" : "DRB", - rb_idP, - (srb_flagP) ? "SRB" : "DRB"); + // also remove the hash-key created by LC-id + switch (rlc_union_p->mode) { + case RLC_MODE_AM: + lcid = rlc_union_p->rlc.am.channel_id; + break; + case RLC_MODE_UM: + lcid = rlc_union_p->rlc.um.channel_id; + break; + case RLC_MODE_TM: + lcid = rlc_union_p->rlc.tm.channel_id; + break; + default: + LOG_E(RLC, PROTOCOL_CTXT_FMT"[%s %u] RLC mode is unknown!\n", + PROTOCOL_CTXT_ARGS(ctxt_pP), + (srb_flagP) ? "SRB" : "DRB", + rb_idP); + } + key_lcid = RLC_COLL_KEY_LCID_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, lcid, srb_flagP); + h_lcid_rc = hashtable_get(rlc_coll_p, key_lcid, (void**)&rlc_union_p); } else { - LOG_E(RLC, PROTOCOL_CTXT_FMT"[%s %u] RELEASE : INTERNAL ERROR %s\n", + h_lcid_rc = HASH_TABLE_KEY_NOT_EXISTS; + } + + if ((h_rc == HASH_TABLE_OK) && (h_lcid_rc == HASH_TABLE_OK)) { + h_lcid_rc = hashtable_remove(rlc_coll_p, key_lcid); + h_rc = hashtable_remove(rlc_coll_p, key); + LOG_D(RLC, PROTOCOL_CTXT_FMT"[%s %u LCID %d] RELEASED %s\n", PROTOCOL_CTXT_ARGS(ctxt_pP), (srb_flagP) ? "SRB" : "DRB", - rb_idP, + rb_idP, lcid, + (srb_flagP) ? "SRB" : "DRB"); + } else if ((h_rc == HASH_TABLE_KEY_NOT_EXISTS) || (h_lcid_rc == HASH_TABLE_KEY_NOT_EXISTS)) { + LOG_D(RLC, PROTOCOL_CTXT_FMT"[%s %u LCID %d] RELEASE : RLC NOT FOUND %s, by RB-ID=%d, by LC-ID=%d\n", + PROTOCOL_CTXT_ARGS(ctxt_pP), + (srb_flagP) ? "SRB" : "DRB", + rb_idP, lcid, + (srb_flagP) ? "SRB" : "DRB", + h_rc, h_lcid_rc); + } else { + LOG_E(RLC, PROTOCOL_CTXT_FMT"[%s %u LCID %d] RELEASE : INTERNAL ERROR %s\n", + PROTOCOL_CTXT_ARGS(ctxt_pP), + (srb_flagP) ? "SRB" : "DRB", + rb_idP, lcid, (srb_flagP) ? "SRB" : "DRB"); } @@ -536,24 +576,20 @@ rlc_union_t* rrc_rlc_add_rlc ( //----------------------------------------------------------------------------- hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; + hash_key_t key_lcid = HASHTABLE_NOT_A_KEY_VALUE; + hashtable_rc_t h_lcid_rc; rlc_union_t *rlc_union_p = NULL; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) rlc_mbms_id_t *mbms_id_p = NULL; logical_chan_id_t lcid = 0; #endif -#ifdef OAI_EMU - - CHECK_CTXT_ARGS(ctxt_pP) - -#endif - if (MBMS_flagP == FALSE) { AssertFatal (rb_idP < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MAX); AssertFatal (chan_idP < RLC_MAX_LC, "LC id is too high (%u/%d)!\n", chan_idP, RLC_MAX_LC); } -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) if (MBMS_flagP == TRUE) { if (ctxt_pP->enb_flag) { @@ -576,6 +612,7 @@ rlc_union_t* rrc_rlc_add_rlc ( #endif { key = RLC_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, rb_idP, srb_flagP); + key_lcid = RLC_COLL_KEY_LCID_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, ctxt_pP->enb_flag, chan_idP, srb_flagP); } h_rc = hashtable_get(rlc_coll_p, key, (void**)&rlc_union_p); @@ -591,9 +628,10 @@ rlc_union_t* rrc_rlc_add_rlc ( } else if (h_rc == HASH_TABLE_KEY_NOT_EXISTS) { rlc_union_p = calloc(1, sizeof(rlc_union_t)); h_rc = hashtable_insert(rlc_coll_p, key, rlc_union_p); + h_lcid_rc = hashtable_insert(rlc_coll_p, key_lcid, rlc_union_p); - if (h_rc == HASH_TABLE_OK) { -#ifdef Rel10 + if ((h_rc == HASH_TABLE_OK) && (h_lcid_rc == HASH_TABLE_OK)) { +#if defined(Rel10) || defined(Rel14) if (MBMS_flagP == TRUE) { LOG_I(RLC, PROTOCOL_CTXT_FMT" RLC service id %u session id %u rrc_rlc_add_rlc\n", @@ -613,11 +651,12 @@ rlc_union_t* rrc_rlc_add_rlc ( rlc_union_p->mode = rlc_modeP; return rlc_union_p; } else { - LOG_E(RLC, PROTOCOL_CTXT_FMT"[%s %u] rrc_rlc_add_rlc FAILED %s\n", + LOG_E(RLC, PROTOCOL_CTXT_FMT"[%s %u] rrc_rlc_add_rlc FAILED %s (add by RB_id=%d; add by LC_id=%d)\n", PROTOCOL_CTXT_ARGS(ctxt_pP), (srb_flagP) ? "SRB" : "DRB", rb_idP, - (srb_flagP) ? "SRB" : "DRB"); + (srb_flagP) ? "SRB" : "DRB", + h_rc, h_lcid_rc); free(rlc_union_p); rlc_union_p = NULL; return NULL; @@ -648,11 +687,6 @@ rlc_op_status_t rrc_rlc_config_req ( PROTOCOL_CTXT_ARGS(ctxt_pP), rb_idP); -#ifdef OAI_EMU - - CHECK_CTXT_ARGS(ctxt_pP) - -#endif AssertFatal (rb_idP < NB_RB_MAX, "RB id is too high (%u/%d)!\n", rb_idP, NB_RB_MAX); switch (actionP) { @@ -674,7 +708,7 @@ rlc_op_status_t rrc_rlc_config_req ( ctxt_pP, srb_flagP, &rlc_infoP.rlc.rlc_am_info, - rb_idP); + rb_idP, rb_idP); break; case RLC_MODE_UM: @@ -685,7 +719,7 @@ rlc_op_status_t rrc_rlc_config_req ( ctxt_pP, srb_flagP, &rlc_infoP.rlc.rlc_um_info, - rb_idP); + rb_idP, rb_idP); break; case RLC_MODE_TM: @@ -696,7 +730,7 @@ rlc_op_status_t rrc_rlc_config_req ( ctxt_pP, srb_flagP, &rlc_infoP.rlc.rlc_tm_info, - rb_idP); + rb_idP, rb_idP); break; default: @@ -728,7 +762,7 @@ rlc_op_status_t rrc_rlc_data_req ( //----------------------------------------------------------------------------- mem_block_t* sdu; - sdu = get_free_mem_block(sdu_sizeP); + sdu = get_free_mem_block(sdu_sizeP, __func__); if (sdu != NULL) { memcpy (sdu->data, sduP, sdu_sizeP); diff --git a/openair2/LAYER2/layer2_top.c b/openair2/LAYER2/layer2_top.c deleted file mode 100644 index 4cd1f50d03..0000000000 --- a/openair2/LAYER2/layer2_top.c +++ /dev/null @@ -1,186 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -/*________________________openair_w3g4free_top.c________________________ - - Authors : Hicham Anouar, Raymond Knopp - Company : EURECOM - Emails : anouar@eurecom.fr, knopp@eurecom.fr -________________________________________________________________*/ - -#ifndef USER_MODE -#define __NO_VERSION__ - -#include -#include - - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -//#include -#include -#include -#include - -#include - -#ifdef KERNEL2_6 -//#include -#include -#endif - -#ifdef KERNEL2_4 -#include -#include -#endif - -#endif - - -#include - -//#include "defs.h" -//#include "openair_types.h" -#include "LAYER2/MAC/vars.h" -#include "LAYER2/MAC/defs.h" - -extern void macphy_scheduler(uint8_t); -extern MAC_xface *mac_register(void *, void*, void*, void*,void*); -extern int mac_unregister(MAC_xface *); -extern MAC_xface *mac_xface; -extern int mac_top_init(); -extern int mac_init_global_param(void); -extern int pdcp_module_init(void); -extern void pdcp_module_cleanup(void); - -/*------------------------------------------------*/ -void w3g4free_mac_init(void) -{ - - int ret; - -#ifndef USER_MODE - printk("[OPENAIR][MAC][TOP] INIT...\n"); -#else - printf("[OPENAIR][MAC][TOP] INIT...\n"); -#endif// USER_MODE - // if(mac_xface->is_cluster_head) - // mac_top_init(); - //else - mac_top_init(); - -#ifndef USER_MODE - printk("[OPENAIR][MAC][TOP] INIT DONE.\n"); -#endif//USER_MODE - - - -} -/*------------------------------------------------*/ -#ifndef USER_MODE - -/*------------------------------------------------*/ -/* Prototypes */ -/*------------------------------------------------*/ -#ifdef KERNEL2_4 -static int init_module( void ); -static void cleanup_module(void); -#else -static int openair_mac_init_module( void ); -static void openair_mac_cleanup_module(void); -#endif - -#ifdef KERNEL2_6 -static int __init openair_mac_init_module( void ) -#else -int init_module( void ) -#endif //KERNEL2_6 -{ - printk("[OPENAIR][MAC][INIT] inserting module\n"); - - // mac_init_global_param(); - - mac_xface=mac_register(macphy_scheduler,NULL,w3g4free_mac_init,mrbch_phy_sync_failure,chbch_phy_sync_success); - - if( mac_xface == NULL ) { - printk("[OPENAIR][MAC][INIT] Could not get MAC descriptor\n"); - return -1; - } else { - printk("[OPENAIR][MAC][INIT] Got MAC descriptor \n"); - - if(mac_init_global_param()==-1) { - mac_unregister(mac_xface); - return -1; - } - } - - if (pdcp_module_init()!=0) { - mac_unregister(mac_xface); - return(-1); - } else { - printk("[OPENAIR][MAC][INIT] PDCP INIT OK\n"); - } - - - return 0; -} - -#ifdef KERNEL2_6 -static void __exit openair_mac_cleanup_module(void) -#else -void cleanup_module(void) -#endif //KERNEL2_6 -{ - printk("[OPENAIR][MAC][CLEANUP] cleanup module\n"); - mac_unregister(mac_xface); - pdcp_module_cleanup(); -} - -MODULE_AUTHOR -("Lionel GAUTHIER , Raymond KNOPP , Aawatif MENOUNI ,Dominique NUSSBAUM , Michelle WETTERWALD , Maxime GUILLAUD "); -MODULE_DESCRIPTION ("openair MAC layer module"); -MODULE_LICENSE ("GPL"); -module_init (openair_mac_init_module); -module_exit (openair_mac_cleanup_module); - - -#endif //USER_MODE - - diff --git a/openair2/LAYER2/openair2_proc.c b/openair2/LAYER2/openair2_proc.c index 8daa8afb70..9a74b9f245 100644 --- a/openair2/LAYER2/openair2_proc.c +++ b/openair2/LAYER2/openair2_proc.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /****************************************************************************** \file openair2_proc # \brief print openair2 overall statistics @@ -36,27 +29,14 @@ # @ingroup _openair2 */ -#ifdef USER_MODE -# include -#else -#include -#include -#include - -# ifndef PRIu64 -# if __WORDSIZE == 64 -# define PRIu64 "lu" -# else -# define PRIu64 "llu" -# endif -# endif -#endif +#include #include "LAYER2/RLC/rlc.h" #include "LAYER2/MAC/defs.h" #include "LAYER2/MAC/extern.h" #include "LAYER2/PDCP_v10.1.0/pdcp.h" #include "UTIL/LOG/log.h" +#include "common/ran_context.h" static mapping rrc_status_names[] = { {"RRC_INACTIVE", 0}, @@ -68,6 +48,8 @@ static mapping rrc_status_names[] = { {NULL, -1} }; +extern RAN_CONTEXT_t RC; + int dump_eNB_l2_stats(char *buffer, int length) { @@ -116,23 +98,31 @@ int dump_eNB_l2_stats(char *buffer, int length) for (eNB_id=0; eNB_idUE_list; for (CC_id=0 ; CC_id < MAX_NUM_CCs; CC_id++) { eNB->eNB_stats[CC_id].dlsch_bitrate= 0; - len += sprintf(&buffer[len],"eNB %d CC %d Frame %d: Active UEs %d, Available PRBs %d, nCCE %d \n", + len += sprintf(&buffer[len],"eNB %d CC %d Frame %d: Active UEs %d, Available PRBs %d, nCCE %d, Scheduling decisions %d, Missed Deadlines %d \n", eNB_id, CC_id, eNB->frame, eNB->eNB_stats[CC_id].num_dlactive_UEs, eNB->eNB_stats[CC_id].available_prbs, - eNB->eNB_stats[CC_id].available_ncces); + eNB->eNB_stats[CC_id].available_ncces, + eNB->eNB_stats[CC_id].sched_decisions, + eNB->eNB_stats[CC_id].missed_deadlines); len += sprintf(&buffer[len],"BCCH , NB_TX_MAC = %d, transmitted bytes (TTI %d, total %d) MCS (TTI %d)\n", eNB->eNB_stats[CC_id].total_num_bcch_pdu, eNB->eNB_stats[CC_id].bcch_buffer, eNB->eNB_stats[CC_id].total_bcch_buffer, eNB->eNB_stats[CC_id].bcch_mcs); + + len += sprintf(&buffer[len],"PCCH , NB_TX_MAC = %d, transmitted bytes (TTI %d, total %d) MCS (TTI %d)\n", + eNB->eNB_stats[CC_id].total_num_pcch_pdu, + eNB->eNB_stats[CC_id].pcch_buffer, + eNB->eNB_stats[CC_id].total_pcch_buffer, + eNB->eNB_stats[CC_id].pcch_mcs); eNB->eNB_stats[CC_id].dlsch_bitrate=((eNB->eNB_stats[CC_id].dlsch_bytes_tx*8)/((eNB->frame + 1)*10)); eNB->eNB_stats[CC_id].total_dlsch_pdus_tx+=eNB->eNB_stats[CC_id].dlsch_pdus_tx; @@ -177,7 +167,7 @@ int dump_eNB_l2_stats(char *buffer, int length) UE_id, map_int_to_str(rrc_status_names, UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status), UE_list->eNB_UE_stats[CC_id][UE_id].crnti, - UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi, + UE_list->UE_sched_ctrl[UE_id].dl_cqi[CC_id], UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs1, UE_list->eNB_UE_stats[CC_id][UE_id].dlsch_mcs2, UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used, @@ -238,7 +228,7 @@ int dump_eNB_l2_stats(char *buffer, int length) PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, eNB_id, ENB_FLAG_YES, - UE_list->eNB_UE_stats[UE_PCCID(eNB_id,UE_id)][UE_id].crnti, + UE_list->eNB_UE_stats[0][UE_id].crnti,//UE_PCCID(eNB_id,UE_id)][UE_id].crnti, eNB->frame, eNB->subframe, eNB_id); @@ -406,11 +396,7 @@ int dump_eNB_l2_stats(char *buffer, int length) } #ifdef PROC -#ifndef USER_MODE -static int openair2_stats_read(char *buffer, char **my_buffer, off_t off, int length) -#else int openair2_stats_read(char *buffer, char **my_buffer, off_t off, int length) -#endif { int len = 0,fg,Overhead, Sign; @@ -693,36 +679,5 @@ int openair2_stats_read(char *buffer, char **my_buffer, off_t off, int length) return len; } -#ifndef USER_MODE -static struct proc_dir_entry *proc_openair2_root; -/* - * Initialize the module and add the /proc file. - */ -int add_openair2_stats() -{ - struct proc_dir_entry *pde; - - proc_openair2_root = proc_mkdir("openair2",0); - // pde = proc_create_entry("lchan_stats", S_IFREG | S_IRUGO, proc_openair2_root); - pde = proc_create_data("lchan_stats", S_IFREG | S_IRUGO, proc_openair2_root, NULL,openair2_stats_read); - - if (!pde) { - printk("[OPENAIR][ERROR] can't create proc entry !\n"); - } - - return 0; -} -/* - * Unregister the file when the module is closed. - */ -void remove_openair_stats() -{ - - if (proc_openair2_root) { - printk("[OPENAIR][CLEANUP] Removing openair proc entry\n"); - remove_proc_entry("lchan_stats", proc_openair2_root); - - } -} -#endif #endif + diff --git a/openair2/LAYER2/register.c b/openair2/LAYER2/register.c deleted file mode 100644 index ac93364452..0000000000 --- a/openair2/LAYER2/register.c +++ /dev/null @@ -1,88 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -/*________________________rrc_register.c________________________ - - Authors : Hicham Anouar, Raymond Knopp - Company : EURECOM - Emails : anouar@eurecom.fr, knopp@eurecom.fr -________________________________________________________________*/ - - -#ifndef USER_MODE -#define __NO_VERSION__ -#else -#include -#include - -#include -#endif - -#include "COMMON/openair_types.h" -#include "MAC/extern.h" - -#include - -#ifndef USER_MODE - -//-----------------------------------------------------------------------------------------------------------// -MAC_RLC_XFACE* mac_rrc_register(RRC_XFACE* RRC_xface) -{ - //-----------------------------------------------------------------------------------------------------------// - if(Is_rrc_registered) { - msg("[OPENAIR][MAC][RRC_REGISTER] RRC interface already registered, aborting ...\n"); - return NULL; - } else { - msg("[OPENAIR][MAC][RRC_REGISTER] Registering RRC Interface, Mac_rlc_xface=%p\n",Mac_rlc_xface); - Rrc_xface=RRC_xface; - Is_rrc_registered=1; - return Mac_rlc_xface; - } -} - -//-----------------------------------------------------------------------------------------------------------// -int mac_rrc_unregister(RRC_XFACE *RRC_xface) -{ - //-----------------------------------------------------------------------------------------------------------// - if (Rrc_xface == RRC_xface) { - msg("[OPENAIR][MAC XFACE][RRC_UNREGISTER] Unregistering RRC interface\n"); - Rrc_xface=NULL; - Is_rrc_registered=0; - return(0); - } else { - msg("[OPENAIR][MAC XFACE][RRC_UNREGISTER] Not the right interface descriptor pointer!!!, aborting ...\n"); - return (-1); - } - -} - -EXPORT_SYMBOL(mac_rrc_register); -EXPORT_SYMBOL(mac_rrc_unregister); -#endif //USER_MODE - - diff --git a/openair2/LAYER2/register.h b/openair2/LAYER2/register.h index 09c464ae56..8a4aeb5b12 100644 --- a/openair2/LAYER2/register.h +++ b/openair2/LAYER2/register.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*________________________rrc_register.h________________________ Authors : Hicham Anouar, Raymond Knopp diff --git a/openair2/Makefile b/openair2/Makefile deleted file mode 100755 index 799fde93c0..0000000000 --- a/openair2/Makefile +++ /dev/null @@ -1,261 +0,0 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# -################################################################################ -#################################################### -# USER SPACE CODE GENERATION -#################################################### - -#--------------------------------------------------- -# -#--------------------------------------------------- - - -#LM_LICENSE_FILE= -#export LM_LICENSE_FILE -include $(OPENAIR_DIR)/common/utils/Makefile.inc - -KERNEL_NAME:=$(shell uname -r) -NUM_CORES=$(shell getconf _NPROCESSORS_CONF) - -export SET_UM=$(shell if grep --silent User\ Mode\ Linux /proc/cpuinfo ; then echo "ARCH=um" ; else echo ""; fi) - -#SUBDIRS_openair_USERRF = $(MAIN_RT_DIR) $(CONFIG_DIR) - -#openair_USERRFDIR = openair_RFOBJS -#openair_USERRFLIBS = $(addsuffix /${openair_USERRFDIR}/Lib.a, ${SUBDIRS_openair_USERRF}) -#openair_USERRFOBJS = $(addsuffix /${openair_USERRFDIR}/*.o, ${SUBDIRS_openair_USERRF}) -#openair_USERRFDEPS = $(addsuffix /${openair_USERRFDIR}/*.d, ${SUBDIRS_openair_USERRF}) - -mac_sim_no_netlink: - ( cd SIMULATION/USER_TOOLS/LAYER2_SIM && make mac_sim MASTER=1) - -mac_sim: - ( cd SIMULATION/USER_TOOLS/LAYER2_SIM && make mac_sim MASTER=1 NETLINK=1 NO_RRM=1) - -mac_sim_rrm: - ( cd SIMULATION/USER_TOOLS/LAYER2_SIM && make mac_sim_rrm MASTER=1 NETLINK=1) - -mac_sim_mt_cellular: - ( cd SIMULATION/USER_TOOLS/LAYER2_SIM && make mac_sim_mt CELLULAR=1 NO_RRM=1) - -mac_sim_rg_cellular: - ( cd SIMULATION/USER_TOOLS/LAYER2_SIM && make mac_sim_rg MASTER=1 CELLULAR=1 NO_RRM=1) - -openair_layer2_emul.ko: - (cd LAYER2 && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` NO_RRM=1 PCTARGET=1 RTAI=1 MASTER=1 OPEN_AIR=1 PHYEMUL=1 && mv openair_l2.ko openair_layer2.ko) - -openair_layer2_emul_rrm.ko: - (cd LAYER2 && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` PCTARGET=1 RTAI=1 MASTER=1 OPEN_AIR=1 PHYEMUL=1 && mv openair_l2.ko openair_layer2.ko) - - -openair_layer2.ko: - (cd LAYER2 && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` NO_RRM=1 PCTARGET=1 RTAI=1 MASTER=1 OPEN_AIR=1 OPENAIR1=1 && mv openair_l2.ko openair_layer2.ko) - -openair_layer2_rrm.ko: - (cd LAYER2 && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` PCTARGET=1 RTAI=1 MASTER=1 OPEN_AIR=1 OPENAIR1=1 && mv openair_l2.ko openair_layer2.ko) - -openair_layer2_2615.ko: - (cd LAYER2 && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` PCTARGET=1 RTAI=1 MASTER=1 OPEN_AIR=1 OPENAIR1=1 && mv openair_l2.ko openair_layer2_2615.ko) - - -openair_rrc.ko: - (cd RRC/MESH && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` PCTARGET=1 RTAI=1 OPEN_AIR=1 MASTER=1 NO_RRM=1 && mv openair_rrc.ko openair_RRC.ko) - -openair_rrc_rrm.ko: - (cd RRC/MESH && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` PCTARGET=1 RTAI=1 OPEN_AIR=1 MASTER=1 && mv openair_rrc.ko openair_RRC.ko) - - -openair_rrc_2615.ko: - (cd RRC/MESH && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` PCTARGET=1 RTAI=1 OPEN_AIR=1 MASTER=1 && mv openair_rrc.ko openair_RRC_2615.ko) - -openair_rrc_emul.ko: - (cd RRC/MESH && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` PCTARGET=1 RTAI=1 OPEN_AIR=1 MASTER=1 PHYEMUL=1 NO_RRM=1) - -openair_rrc_emul_rrm.ko: - (cd RRC/MESH && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` PCTARGET=1 RTAI=1 OPEN_AIR=1 MASTER=1 PHYEMUL=1) - - -openair_emul.ko: - (cd SIMULATION/PHY_EMULATION/DEVICE_DRIVER/ && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` PCTARGET=1 RTAI=1 OPEN_AIR=1 MASTER=1 NO_RRM=1) - -openair_emul_rrm.ko: - (cd SIMULATION/PHY_EMULATION/DEVICE_DRIVER/ && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` PCTARGET=1 RTAI=1 OPEN_AIR=1 MASTER=1) - - - -create_device: - rm -f /dev/openair0 - mknod /dev/openair0 c 127 0 - chmod a+rw /dev/openair0 - - -install_emul: - make devs - make fifos - (insmod SIMULATION/PHY_EMULATION/DEVICE_DRIVER/openair_emul.ko) - (insmod LAYER2/openair_layer2.ko) - (insmod RRC/MESH/openair_rrc.ko) - (insmod NETWORK_DRIVER/MESH/nasmesh.ko) - -remove_emul: - rmmod nasmesh - sleep 1 - rmmod openair_rrc - sleep 1 - rmmod openair_l2 - sleep 1 - rmmod openair_emul - - -clean_nasmesh: - (cd NETWORK_DRIVER/MESH && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` clean) - -nasmesh_address_fix.ko: - (cd NETWORK_DRIVER/MESH && $(MAKE) -j$(NUM_CORES) $(SET_UM) V=1 ADDRESS_FIX=1 -C $(KERNEL_DIR)/build M=`pwd`) - -nasmesh.ko: - (cd NETWORK_DRIVER/MESH && $(MAKE) -j$(NUM_CORES) $(SET_UM) V=1 -C $(KERNEL_DIR)/build M=`pwd`) - -# automatically detect the linux header files for driver compilation -nasmesh_netlink.ko: - (cd NETWORK_DRIVER/MESH && $(MAKE) -j$(NUM_CORES) $(SET_UM) PDCP_USE_NETLINK=1 V=1 -C $(KERNEL_DIR)/build M=`pwd` modules) - -naslite_netlink_ether.ko: - (cd NETWORK_DRIVER/LITE && $(MAKE) -j$(NUM_CORES) $(SET_UM) OAI_NW_DRIVER_TYPE_ETHERNET=1 PDCP_USE_NETLINK=1 OAI_NW_DRIVER_USE_NETLINK=1 V=1 -C $(KERNEL_DIR)/build M=`pwd` modules) - -oai_nw_ether.ko: - (cd NETWORK_DRIVER/LITE && $(MAKE) -j$(NUM_CORES) $(SET_UM) OAI_NW_DRIVER_TYPE_ETHERNET=1 PDCP_USE_NETLINK=1 OAI_NW_DRIVER_USE_NETLINK=1 V=1 -C $(KERNEL_DIR)/build M=`pwd` modules) - -oai_nw_drv.ko: - (cd NETWORK_DRIVER/LITE && $(MAKE) -j$(NUM_CORES) $(SET_UM) OAI_NW_DRIVER_TYPE_ETHERNET=1 PDCP_USE_NETLINK=1 OAI_NW_DRIVER_USE_NETLINK=1 V=1 -C $(KERNEL_DIR)/build M=`pwd` modules) - -nasmesh_netlink_address_fix.ko: - (cd NETWORK_DRIVER/MESH && $(MAKE) -j$(NUM_CORES) $(SET_UM) PDCP_USE_NETLINK=1 ADDRESS_FIX=1 V=1 -C $(KERNEL_DIR)/build M=`pwd` modules) - - -nasmesh_netlink_loopback.ko: - (cd NETWORK_DRIVER/MESH && $(MAKE) $(SET_UM) PDCP_USE_NETLINK=1 LOOPBACK=1 V=1 -C $(KERNEL_DIR)/build M=`pwd` modules) - -# drivers cellular version -nascellmt_netlink.ko: - (cd NAS/DRIVER/CELLULAR/NASMT && $(MAKE) -j$(NUM_CORES) $(SET_UM) NAS_DRIVER_TYPE_ETHERNET=1 PDCP_USE_NETLINK=1 V=1 -C $(KERNEL_DIR)/build M=`pwd` modules) - -nascellmt_clean.ko: - (cd NAS/DRIVER/CELLULAR/NASMT && $(MAKE) -j$(NUM_CORES) $(SET_UM) NAS_DRIVER_TYPE_ETHERNET=1 PDCP_USE_NETLINK=1 V=1 -C $(KERNEL_DIR)/build M=`pwd` clean) - -nascellrg_netlink.ko: - (cd NAS/DRIVER/CELLULAR/NASRG && $(MAKE) -j$(NUM_CORES) $(SET_UM) NAS_DRIVER_TYPE_ETHERNET=1 PDCP_USE_NETLINK=1 V=1 -C $(KERNEL_DIR)/build M=`pwd` modules) - -nascellrg_clean.ko: - (cd NAS/DRIVER/CELLULAR/NASRG && $(MAKE) -j$(NUM_CORES) $(SET_UM) NAS_DRIVER_TYPE_ETHERNET=1 PDCP_USE_NETLINK=1 V=1 -C $(KERNEL_DIR)/build M=`pwd` clean) - -# Driver for UE using LTE core network (MME, S+P-GW) -ue_ip.ko: - (cd NETWORK_DRIVER/UE_IP && $(MAKE) -j$(NUM_CORES) $(SET_UM) PDCP_USE_NETLINK=1 OAI_NW_DRIVER_USE_NETLINK=1 V=1 -C $(KERNEL_DIR)/build M=`pwd` modules) - - -rt_emul: - (cd SIMULATION/USER_TOOLS/RT_EMUL_LAUNCHER && $(MAKE)) - -bypass_phy: - (cd SIMULATION/PHY_EMULATION/TRANSPORT/KERNEL_INTERFACE && $(MAKE)) - -rb_tool: - (cd NETWORK_DRIVER/MESH/RB_TOOL && $(MAKE)) - - -fifos: - @for i in `seq 0 64`;\ - do \ - have_rtfX=`ls /dev/ |grep -c rtf$$i`;\ - if [ "$$have_rtfX" -eq 0 ] ;then \ - mknod -m 666 /dev/rtf$$i c 150 $$i; \ - fi;\ - done - -# cp arch/openair_CardBus_MIMO1/device_driver/openair_rf.ko $(KERNEL_DIR)/openair/ -# depmod -aq - -devs: - if ! test -a /dev/openair0;\ - then \ - mknod /dev/openair0 c 127 0;\ - chmod a+rw /dev/openair0;\ - fi; - -load_sounder_ue: install_cbmimo1_ublaze - insmod mac/chansounder/openair_chansounder_ue.ko - -load_sounder_nodeb: install_platon - (cd openair_rf && ./openair_rf_platon 1917600 0 ../arch/platon/rbt_files/DAQ_B.rbt 30p 15p 10p 25p && ./openair_rf_platon 1917600 0 ../arch/platon/rbt_files/daq_platon_11_2005.rbt 30p 15p 10p 25p) - - -stop_sounder: - rmmod openair_chansounder - rmmod openair_rf - -stop_sounder_nodeb: - (cd openair_rf && ./openair_rf_platon 1907600 4) - rmmod openair_chansounder - rmmod openair_rf - - -emul_rt: - (cd SIMULATION/USER_TOOLS/RT_EMUL_LAUNCHER && $(MAKE)) - -clean: - (cd NETWORK_DRIVER/MESH && $(MAKE) clean) - (cd NETWORK_DRIVER/LITE && $(MAKE) clean) - rm -rf NETWORK_DRIVER/MESH/RB_TOOL/rb_tool - rm -rf NETWORK_DRIVER/LITE/RB_TOOL/rb_tool - -cleanall: - find -name *.o -delete -print - find -name *.ko -delete -print - find -name *~ -delete -print - find -name *.bak -delete -print - rm -rf NETWORK_DRIVER/MESH/RB_TOOL/rb_tool - rm -rf NETWORK_DRIVER/LITE/RB_TOOL/rb_tool - - -cleansvn: - rm -rf `find -name *.svn* -print` ; \ - find -name *.svn* -delete -print - -tgz: - mkdir /tmp/openair2_tmp; \ - $(MAKE) cleanall; \ - cp -r . /tmp/openair2_tmp; \ - (cd /tmp/openair2_tmp && $(MAKE) cleansvn && cd .. && tar czfv openair2.tgz openair2_tmp) ; \ - cp /tmp/openair2.tgz . ;\ - rm -rf /tmp/openair2_tmp - -print: - @echo $(IS_KERNEL_OPENAIRINTERFACE) - @echo $(KERNEL_DIR) - @echo $(IS_LINUX) diff --git a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/Makefile b/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/Makefile deleted file mode 100755 index 427a9fad51..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -# Lines starting with the pound sign are comments. -# -# These things are options that you might need -# to tweak. - -# You can modify the below as well, but probably -# won't need to. - -#CC = egcs - -#UPDIR := $(shell /bin/pwd) -#GRAAL_DIR =$(UPDIR)/.. -#RRC_DIR =$(UPDIR)/../../../AS/L3/RRC - -CELL_UPDIR := $(shell /bin/pwd) -NAS_DIR := $(OPENAIR2_DIR)/NAS/DRIVER/CELLULAR/NASMT -RRC_DIR := $(OPENAIR2_DIR)/RRC/CELLULAR -EXTRA_CFLAGS += -I$(RRC_DIR) -DNODE_MT - -CFLAGS = -Wall -g -I$(NAS_DIR) -I$(RRC_DIR) - -COMPILE = $(CC) $(CFLAGS) -c - -OBJS = nascell_ioctl.o - -EXECUTABLE = gioctl - -# "all" is the default target. Simply make it point to myprogram. - -all: $(EXECUTABLE) - -# Define the components of the program, and how to link them together. -# These components are defined as dependencies; that is, they must be -# made up-to-date before the code is linked. - -$(EXECUTABLE): $(OBJS) - $(CC) $(CFLAGS) -o $(EXECUTABLE) $(OBJS) - -# Add any special rules here. - -# Specify that all .o files depend on .c files, and indicate how -# the .c files are converted (compiled) to the .o files. - -%.o: %.c - $(COMPILE) -o $@ $< - -clean: - -rm $(OBJS) $(EXECUTABLE) diff --git a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c b/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c deleted file mode 100755 index 3647131326..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/CTL_TOOL/nascell_ioctl.c +++ /dev/null @@ -1,847 +0,0 @@ -/*************************************************************************** - nascell_ioctl.c - description - ------------------- - copyright : (C) 2002 by Eurecom - email : michelle.wetterwald@eurecom.fr - yan.moret@eurecom.fr - *************************************************************************** - - ***************************************************************************/ -#include "nascell_ioctl.h" -#include "rrc_nas_primitives.h" -//#include "rrc_qos.h" -//#include "graal_local.h" -#include "nasmt_constant.h" -#include "nasmt_iocontrol.h" -#define USHRT_MAX 255 -//--------------------------------------------------------------------------- -void print_error(int status) -{ - //--------------------------------------------------------------------------- - switch(status) { - case -NAS_ERROR_NOMEMORY: - printf(" The memory is low\n"); - break; - - case -NAS_ERROR_NORB: - printf(" The radio bearer is not identified\n"); - break; - - case -NAS_ERROR_NOTMT: - printf(" The entity must be a mobile\n"); - break; - - case -NAS_ERROR_NOTRG: - printf(" The entity must be an access router\n"); - break; - - case -NAS_ERROR_NOTIDLE: - printf(" The selected connection or radio bearer must be IDLE\n"); - break; - - case -NAS_ERROR_NOTCONNECTED: - printf(" The selected connection or radio bearer must be CONNECTED\n"); - break; - - case -NAS_ERROR_NOTCORRECTLCR: - printf(" The LCR value is not correct\n"); - break; - - case -NAS_ERROR_NOTCORRECTDIR: - printf(" The DIR value is not correct\n"); - break; - - case -NAS_ERROR_NOTCORRECTDSCP: - printf(" The DSCP value is not correct\n"); - break; - - case -NAS_ERROR_NOTCORRECTVERSION: - printf(" The version value is not correct\n"); - break; - - case -NAS_ERROR_NOTCORRECTRABI: - printf(" The rab_id value is not correct\n"); - break; - - case -NAS_ERROR_ALREADYEXIST: - printf(" Some components must not be duplicated\n"); - break; - - default: - printf(" Unknown error cause %d\n", status); - } -} - -//--------------------------------------------------------------------------- -void print_state(uint8_t state) -{ - //--------------------------------------------------------------------------- - switch(state) { - case NAS_IDLE: - printf("NAS_IDLE\n"); - return; - - // case NAS_STATE_CONNECTED:printf("NAS_STATE_CONNECTED\n");return; - // case NAS_STATE_ESTABLISHMENT_REQUEST:printf("NAS_STATE_ESTABLISHMENT_REQUEST\n");return; - // case NAS_STATE_ESTABLISHMENT_FAILURE:printf("NAS_STATE_ESTABLISHMENT_FAILURE\n");return; - // case NAS_STATE_RELEASE_FAILURE:printf("NAS_STATE_RELEASE_FAILURE\n");return; - case NAS_CX_FACH: - printf("NAS_CX_FACH\n"); - return; - - case NAS_CX_DCH: - printf("NAS_CX_DCH\n"); - return; - - case NAS_CX_RECEIVED: - printf("NAS_CX_RECEIVED\n"); - return; - - case NAS_CX_CONNECTING: - printf("NAS_CX_CONNECTING\n"); - return; - - case NAS_CX_RELEASING: - printf("NAS_CX_RELEASING\n"); - return; - - case NAS_CX_CONNECTING_FAILURE: - printf("NAS_CX_CONNECTING_FAILURE\n"); - return; - - case NAS_CX_RELEASING_FAILURE: - printf("NAS_CX_RELEASING_FAILURE\n"); - return; - - case NAS_RB_ESTABLISHING: - printf("NAS_RB_ESTABLISHING\n"); - return; - - case NAS_RB_RELEASING: - printf("NAS_RB_RELEASING\n"); - return; - - default: - printf(" Unknown state\n"); - } -} - -//--------------------------------------------------------------------------- -void print_usage_class() -{ - //--------------------------------------------------------------------------- - printf("Usage: gioctl class add {send |receive} -f {qos |del|ctl|dc} -cr [-dscp ] [-ip {6|4} ] [-p {tcp|udp|icmp4|icmp6} ]\n"); - printf("Usage: gioctl class del {send |receive} -cr [-dscp ] \n"); - printf("Usage: gioctl class list {send |receive} [-dscp ]\n"); -} -//--------------------------------------------------------------------------- -void print_usage_cx() -{ - //--------------------------------------------------------------------------- - printf("Usage: gioctl cx add \n"); - printf("Usage: gioctl cx del \n"); - printf("Usage: gioctl cx list\n"); -} -//--------------------------------------------------------------------------- -void print_usage_rb() -{ - //--------------------------------------------------------------------------- - printf("Usage: gioctl rb add \n"); - printf("Usage: gioctl rb list \n"); -} - -//--------------------------------------------------------------------------- -int main(int argc, char *argv[]) -{ - //--------------------------------------------------------------------------- - struct nas_ioctl gifr; - int err, fd; - - // Invalid number of arguments - if (argc<2) { - printf("Usage: gioctl statistic\n"); - print_usage_cx(); - print_usage_rb(); - print_usage_class(); - return -1; - } - - // Get an UDP IPv6 socket ?? - fd=socket(AF_INET6, SOCK_DGRAM, 0); - - if (fd<0) { - printf("Error opening socket\n"); - return 0; - } - - strcpy(gifr.name, "oai0"); - printf("Socket opened successfully\n"); - - /***************************/ - if (strcmp(argv[1], "statistic")==0) { - struct nas_msg_statistic_reply *msgrep; - gifr.type=NAS_MSG_STATISTIC_REQUEST; - gifr.msg=(char *)malloc(sizeof(msgrep)); - msgrep=(struct nas_msg_statistic_reply *)(gifr.msg); - printf(" Statistics requested\n"); - err=ioctl(fd, NASMT_IOCTL_RAL, &gifr); - - if (err<0) { - printf("IOCTL error, err=%d\n",err); - return -1; - } - - printf("tx_packets = %u, rx_packets = %u\n", msgrep->tx_packets, msgrep->rx_packets); - printf("tx_bytes = %u, rx_bytes = %u\n", msgrep->tx_bytes, msgrep->rx_bytes); - printf("tx_errors = %u, rx_errors = %u\n", msgrep->tx_errors, msgrep->rx_errors); - printf("tx_dropped = %u, rx_dropped = %u\n", msgrep->tx_dropped, msgrep->rx_dropped); - return 0; - } - - /***************************/ - if (strcmp(argv[1], "cx")==0) { - if (argc<3) { - print_usage_cx(); - return -1; - } - - /***/ - // printf("Usage: gioctl cx add \n"); - if (strcmp(argv[2], "add")==0) { - struct nas_msg_cx_establishment_request *msgreq; - struct nas_msg_cx_establishment_reply *msgrep; - - if (argc<5) { - print_usage_cx(); - return -1; - } - - gifr.type=NAS_MSG_CX_ESTABLISHMENT_REQUEST; - gifr.msg=(char *)malloc(sizeof(msgrep)lcr=strtoul(argv[3], NULL, 0); - msgreq->cellid=strtoul(argv[4], NULL, 0); - // - printf(" Connection establishment requested\n"); - err=ioctl(fd, NASMT_IOCTL_RAL, &gifr); - - if (err<0) { - printf("IOCTL error, err=%d\n",err); - perror("Connection establishment IOCTL error\n"); - return -1; - } - - if (msgrep->status<0) { - printf(" Connexion establishment failure: "); - print_error(msgrep->status); - return -1; - } - - return 0; - } - - /***/ - // printf("Usage: gioctl cx del \n"); - if (strcmp(argv[2], "del")==0) { - struct nas_msg_cx_release_request *msgreq; - struct nas_msg_cx_release_reply *msgrep; - - if (argc<4) { - print_usage_cx(); - return -1; - } - - gifr.type=NAS_MSG_CX_RELEASE_REQUEST; - gifr.msg=(char *)malloc(sizeof(msgrep)lcr=strtoul(argv[3], NULL, 0); - // - printf(" Connexion release requested\n"); - err=ioctl(fd, NASMT_IOCTL_RAL, &gifr); - - if (err<0) { - printf("IOCTL error, err=%d\n",err); - return -1; - } - - if (msgrep->status<0) { - printf(" Connexion release failure: "); - print_error(msgrep->status); - return -1; - } - - return 0; - } - - /***/ - // printf("Usage: gioctl cx list\n"); - if (strcmp(argv[2], "list")==0) { - uint8_t *msgrep; - uint8_t i; - struct nas_msg_cx_list_reply *list; - uint8_t lcr; - gifr.type=NAS_MSG_CX_LIST_REQUEST; - gifr.msg=(char *)malloc(NAS_LIST_CX_MAX*sizeof(struct nas_msg_cx_list_reply)+1); - msgrep=(uint8_t *)(gifr.msg); - // - printf(" Connexion list requested\n"); - err=ioctl(fd, NASMT_IOCTL_RAL, &gifr); - - if (err<0) { - printf("IOCTL error, err=%d\n",err); - return -1; - } - - printf("Lcr\t\tCellId\tIID4\tIID6\t\t\tnrb\tnsclass\tState\n"); - list=(struct nas_msg_cx_list_reply *)(msgrep+1); - - for(lcr=0; lcr \n"); - if (strcmp(argv[2], "add")==0) { - struct nas_msg_rb_establishment_request *msgreq; - struct nas_msg_rb_establishment_reply *msgrep; - - if (argc<6) { - print_usage_rb(); - return -1; - } - - gifr.type=NAS_MSG_RB_ESTABLISHMENT_REQUEST; - gifr.msg=(char *)malloc(sizeof(msgrep)lcr=strtoul(argv[3], NULL, 0); - msgreq->rab_id=strtoul(argv[4], NULL, 0); - msgreq->qos=strtoul(argv[5], NULL, 0); - // - printf(" Radio bearer establishment requested\n"); - err=ioctl(fd, NASMT_IOCTL_RAL, &gifr); - - if (err<0) { - printf("IOCTL error, err=%d\n",err); - return -1; - } - - if (msgrep->status<0) { - printf(" Radio bearer establishment failure: "); - print_error(msgrep->status); - return -1; - } - - return 0; - } - - /***/ - if (strcmp(argv[2], "del")==0) { - struct nas_msg_rb_release_request *msgreq; - struct nas_msg_rb_release_reply *msgrep; - - if (argc<5) { - print_usage_rb(); - return -1; - } - - gifr.type=NAS_MSG_RB_RELEASE_REQUEST; - gifr.msg=(char *)malloc(sizeof(msgrep)lcr=strtoul(argv[3], NULL, 0); - msgreq->rab_id=strtoul(argv[4], NULL, 0); - // - printf(" Radio Bearer release requested\n"); - err=ioctl(fd, NASMT_IOCTL_RAL, &gifr); - - if (err<0) { - printf("IOCTL error, err=%d\n",err); - return -1; - } - - if (msgrep->status<0) { - printf(" Radio bearer release failure: "); - print_error(msgrep->status); - return -1; - } - - return 0; - } - - /***/ - // printf("Usage: gioctl rb list \n"); - if (strcmp(argv[2], "list")==0) { - uint8_t *msgrep; - uint8_t rbi; - struct nas_msg_rb_list_reply *list; - struct nas_msg_rb_list_request *msgreq; - - if (argc<4) { - print_usage_rb(); - return -1; - } - - gifr.type=NAS_MSG_RB_LIST_REQUEST; - gifr.msg=(char *)malloc(NAS_LIST_RB_MAX*sizeof(struct nas_msg_rb_list_reply)+1); - msgreq=(struct nas_msg_rb_list_request *)(gifr.msg); - msgrep=(uint8_t *)(gifr.msg); - msgreq->lcr=strtoul(argv[3], NULL, 0); - // - printf(" Radio bearer list requested\n"); - err=ioctl(fd, NASMT_IOCTL_RAL, &gifr); - - if (err<0) { - printf("IOCTL error, err=%d\n",err); - return -1; - } - - printf("rab_id\t\tSapi\t\tQoS\t\tState\n"); - list=(struct nas_msg_rb_list_reply *)(msgrep+1); - - for(rbi=0; rbidir=NAS_DIRECTION_SEND; - msgreq->lcr=strtoul(argv[++i], NULL, 0); - ++i; - } else { - if (strcmp(argv[i], "receive")==0) { - msgreq->dir=NAS_DIRECTION_RECEIVE; - ++i; - } else { - print_usage_class(); - return -1; - } - } - - msgreq->classref=USHRT_MAX; - msgreq->dscp=NAS_DSCP_DEFAULT; - msgreq->version=NAS_VERSION_DEFAULT; - msgreq->protocol=NAS_PROTOCOL_DEFAULT; - msgreq->sport=NAS_PORT_DEFAULT; - msgreq->dport=NAS_PORT_DEFAULT; - msgreq->fct=0; - - while (iclassref=strtoul(argv[++i], NULL, 0); - ++i; - continue; - } - - if (strcmp(argv[i], "-dscp")==0) { - msgreq->dscp=strtoul(argv[++i], NULL, 0); - ++i; - continue; - } - - if (strcmp(argv[i], "-f")==0) { - ++i; - - if (strcmp(argv[i], "qos")==0) { - msgreq->fct=NAS_FCT_QOS_SEND; - msgreq->rab_id=strtoul(argv[++i], NULL, 0); - ++i; - continue; - } - - if (strcmp(argv[i], "del")==0) { - msgreq->fct=NAS_FCT_DEL_SEND; - msgreq->rab_id=0; - ++i; - continue; - } - - if (strcmp(argv[i], "ctl")==0) { - msgreq->fct=NAS_FCT_CTL_SEND; - msgreq->rab_id=0; - ++i; - continue; - } - - if (strcmp(argv[i], "dc")==0) { - msgreq->fct=NAS_FCT_DC_SEND; - msgreq->rab_id=0; - ++i; - continue; - } - - print_usage_class(); - return -1; - } - - if (strcmp(argv[i], "-ip")==0) { - ++i; - - if (strcmp(argv[i], "4")==0) { - if (msgreq->version!=NAS_VERSION_DEFAULT) { - print_usage_class(); - return -1; - } - - msgreq->version=NAS_VERSION_4; - inet_pton(AF_INET, argv[++i], (void *)(&msgreq->saddr)); - msgreq->splen=strtoul(argv[++i], NULL, 0); - inet_pton(AF_INET, argv[++i], (void *)(&msgreq->daddr)); - msgreq->dplen=strtoul(argv[++i], NULL, 0); - ++i; - continue; - } - - if (strcmp(argv[i], "6")==0) { - if (msgreq->version!=NAS_VERSION_DEFAULT) { - print_usage_class(); - return -1; - } - - msgreq->version=NAS_VERSION_6; - inet_pton(AF_INET6, argv[++i], (void *)(&msgreq->saddr)); - msgreq->splen=strtoul(argv[++i], NULL, 0); - inet_pton(AF_INET6, argv[++i], (void *)(&msgreq->daddr)); - msgreq->dplen=strtoul(argv[++i], NULL, 0); - ++i; - continue; - } - - print_usage_class(); - return -1; - } - - if (strcmp(argv[i], "-p")==0) { - ++i; - - if (strcmp(argv[i], "tcp")==0) { - if (msgreq->protocol!=NAS_PROTOCOL_DEFAULT) { - print_usage_class(); - return -1; - } - - msgreq->protocol=NAS_PROTOCOL_TCP; - msgreq->sport=strtoul(argv[++i], NULL, 0); - msgreq->dport=strtoul(argv[++i], NULL, 0); - ++i; - continue; - } - - if (strcmp(argv[i], "udp")==0) { - if (msgreq->protocol!=NAS_PROTOCOL_DEFAULT) { - print_usage_class(); - return -1; - } - - msgreq->protocol=NAS_PROTOCOL_UDP; - msgreq->sport=strtoul(argv[++i], NULL, 0); - msgreq->dport=strtoul(argv[++i], NULL, 0); - ++i; - continue; - } - - if (strcmp(argv[i], "icmp4")==0) { - if (msgreq->protocol!=NAS_PROTOCOL_DEFAULT) { - print_usage_class(); - return -1; - } - - msgreq->protocol=NAS_PROTOCOL_ICMP4; - msgreq->sport=strtoul(argv[++i], NULL, 0); - msgreq->dport=strtoul(argv[++i], NULL, 0); - ++i; - continue; - } - - if (strcmp(argv[i], "icmp6")==0) { - if (msgreq->protocol!=NAS_PROTOCOL_DEFAULT) { - print_usage_class(); - return -1; - } - - msgreq->protocol=NAS_PROTOCOL_ICMP6; - msgreq->sport=strtoul(argv[++i], NULL, 0); - msgreq->dport=strtoul(argv[++i], NULL, 0); - ++i; - continue; - } - - print_usage_class(); - return -1; - } - - print_usage_class(); - return -1; - } - - if ((msgreq->classref==USHRT_MAX)||(msgreq->fct==0)) { - print_usage_class(); - return -1; - } - - printf(" Class add requested\n"); - err=ioctl(fd, NASMT_IOCTL_RAL, &gifr); - - if (err<0) { - printf("IOCTL error, err=%d\n",err); - return -1; - } - - if (msgrep->status<0) { - printf(" Class add failure: "); - print_error(msgrep->status); - return -1; - } - - return 0; - } - - /***/ - if (strcmp(argv[2], "del")==0) { - uint8_t i; - struct nas_msg_class_del_request *msgreq; - struct nas_msg_class_del_reply *msgrep; - gifr.type=NAS_MSG_CLASS_DEL_REQUEST; - gifr.msg=(char *)malloc(sizeof(msgrep)dir=NAS_DIRECTION_SEND; - msgreq->lcr=strtoul(argv[++i], NULL, 0); - ++i; - } else { - if (strcmp(argv[i], "receive")==0) { - msgreq->dir=NAS_DIRECTION_RECEIVE; - ++i; - } else { - print_usage_class(); - return -1; - } - } - - msgreq->classref=USHRT_MAX; - msgreq->dscp=NAS_DSCP_DEFAULT; - - while (iclassref=strtoul(argv[++i], NULL, 0); - ++i; - continue; - } - - if (strcmp(argv[i], "-dscp")==0) { - msgreq->dscp=strtoul(argv[++i], NULL, 0); - ++i; - continue; - } - - print_usage_class(); - return -1; - } - - if (msgreq->classref==USHRT_MAX) { - print_usage_class(); - return -1; - } - - printf(" Class del requested\n"); - err=ioctl(fd, NASMT_IOCTL_RAL, &gifr); - - if (err<0) { - printf("IOCTL error, err=%d\n",err); - return -1; - } - - if (msgrep->status<0) { - printf(" Class add failure: "); - print_error(msgrep->status); - return -1; - } - - return 0; - } - - /***/ - if (strcmp(argv[2], "list")==0) { - uint8_t *msgrep; - uint8_t cli, i; - struct nas_msg_class_list_reply *list; - struct nas_msg_class_list_request *msgreq; - char addr[45]; - - if (argc<4) { - print_usage_class(); - return -1; - } - - gifr.type=NAS_MSG_CLASS_LIST_REQUEST; - gifr.msg=(char *)malloc(NAS_LIST_CLASS_MAX*sizeof(struct nas_msg_class_list_reply)+1); - - if (gifr.msg==NULL) { - printf(" No memory\n"); - return -1; - } - - msgreq=(struct nas_msg_class_list_request *)(gifr.msg); - msgrep=(uint8_t *)(gifr.msg); - i=3; - - if (strcmp(argv[i], "send")==0) { - msgreq->dir=NAS_DIRECTION_SEND; - msgreq->lcr=strtoul(argv[++i], NULL, 0); - ++i; - } else { - if (strcmp(argv[i], "receive")==0) { - msgreq->dir=NAS_DIRECTION_RECEIVE; - msgreq->lcr=0; - ++i; - } else { - print_usage_class(); - return -1; - } - } - - msgreq->dscp=NAS_DSCP_DEFAULT; - - while (idscp=strtoul(argv[++i], NULL, 0); - } - - printf(" Classifier list requested\n"); - err=ioctl(fd, NASMT_IOCTL_RAL, &gifr); - - // - if (err<0) { - printf("IOCTL error, err=%d\n",err); - return -1; - } - - printf("Lcr\trab_id\tCref\tFct\t(Vers., saddr, daddr)\t\t\t\t(Proto., Sport, Dport)\n"); - list=(struct nas_msg_class_list_reply *)(msgrep+1); - - for(cli=0; cli -#include -#include -#include -#include -#include -#include -#include -//#include - -//#include -//#define GRAAL_STATE_IDLE 0 -//#define GRAAL_STATE_CONNECTED 1 -//#define GRAAL_STATE_ESTABLISHMENT_REQUEST 2 -//#define GRAAL_STATE_ESTABLISHMENT_FAILURE 3 -//#define GRAAL_STATE_RELEASE_FAILURE 4 - -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; - -extern int inet_pton(int af, const char *src, void *dst); -extern char *inet_ntop(int af, const void *src, char *dst, size_t sise); - -#endif //_IOCTL_H diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/Makefile b/openair2/NAS/DRIVER/CELLULAR/NASMT/Makefile deleted file mode 100755 index ec14990d63..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# NAS CELLULAR Driver makefile -# -include $(OPENAIR_DIR)/common/utils/Makefile.inc -NAS_UPDIR := $(shell /bin/pwd) - -#################################################### -# D E B U G F L A G S -#################################################### - -#################################################### -# EXTRA COMPILER FLAGS -#################################################### -EXTRA_CFLAGS = -fno-common -fno-stack-protector -mpreferred-stack-boundary=4 $(if $(SET_X64),-DARCH_64,) $(if $(SET_X64),-mcmodel=kernel,) $(if $(SET_X64),-m64,) - -ifdef ADDRCONF -EXTRA_CFLAGS += -DADDRCONF -endif - -ifdef NAS_DRIVER_TYPE_ETHERNET -EXTRA_CFLAGS += -DNAS_DRIVER_TYPE_ETHERNET -endif - - -ifdef PDCP_USE_NETLINK -EXTRA_CFLAGS += -DPDCP_USE_NETLINK -else -EXTRA_CFLAGS += $(shell rtai-config --module-cflags) -DRTAI -D__IN_RTAI__ -Wall -endif - -ifdef LOOPBACK -EXTRA_CFLAGS += -DLOOPBACK_TEST -endif - -ifdef ADDRESS_FIX -EXTRA_CFLAGS += -DNAS_ADDRESS_FIX -endif - -#################################################### -# NASMTCELL extra compilation flags -#################################################### -#RTAI=1 -RRC_DIR := $(OPENAIR2_DIR)/RRC/CELLULAR -EXTRA_CFLAGS += -I$(RRC_DIR) -DNODE_MT - -#################################################### -# LOADABLE MODULE GOALS -#################################################### -obj-m += nascellmt.o -nascellmt-objs += nasmt_device.o -nascellmt-objs += nasmt_common.o -nascellmt-objs += nasmt_iocontrol.o -nascellmt-objs += nasmt_classifier.o -nascellmt-objs += nasmt_tool.o -nascellmt-objs += nasmt_ascontrol.o -ifdef PDCP_USE_NETLINK -nascellmt-objs += nasmt_netlink.o -endif - -#################################################### -# REVOIR LE CLEAN -#################################################### - -#netlink.ko: - #make $(x)$(y) PDCP_USE_NETLINK=1 V=1 -C $(KERNEL_DIR) M=`pwd` modules - -#nasmesh.ko: -# make V=1 -C $(KERNEL_DIR) M=`pwd` modules -print: - @echo subversion : $(SUBVERSION) - @echo RRC_DIR $(RRC_DIR) -clean: - rm -f *.ko - rm -f .*.ko.cmd - rm -f .*.o.cmd - rm -f *.o - rm -f *.mod.c - find . -name *.ko -delete - find . -name *.o -delete - find . -name *.mod.c -delete diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c deleted file mode 100755 index 8e946f04e2..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_ascontrol.c +++ /dev/null @@ -1,1161 +0,0 @@ -/*************************************************************************** - nasmt_ascontrol.c - description - *************************************************************************** - Access Stratum Control features for MT - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_ascontrol.c -* \brief Access Stratum Control functions for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifdef NODE_MT -#include "nasmt_variables.h" -#include "nasmt_proto.h" - -//--------------------------------------------------------------------------- -void nasmt_ASCTL_init(void) -{ - //--------------------------------------------------------------------------- - // struct cx_entity *cx; - int i; - gpriv->next_sclassref = NASMT_DEFAULTRAB_CLASSREF; - - for (i = 0; icx->joined_services[i]= -1; - } - - printk("nasmt_ASCTL_init Complete\n"); -} - -//--------------------------------------------------------------------------- -int nasmt_ASCTL_write(int sap, unsigned char *data_buffer, unsigned int data_length) -{ - //--------------------------------------------------------------------------- - int bytes_wrote = 0; -#ifdef PDCP_USE_NETLINK - unsigned char xmit_buffer [NAS_MESSAGE_MAXLEN]; - //MT xmit on DC-SAP only - xmit_buffer[0] = RRC_NAS_DC0_IN; - memcpy (&((char*)xmit_buffer)[1], data_buffer, data_length); - bytes_wrote = nasmt_netlink_send(xmit_buffer,data_length, NASNL_DEST_RRC); -#else - //bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length); //original version - bytes_wrote = rtf_put(sap, data_buffer, data_length); -#endif //PDCP_USE_NETLINK - return bytes_wrote; -} - -//--------------------------------------------------------------------------- -//For demo, add automatically a classifier -//Equivalent to class add send 0 -f qos -cr 0 -void nasmt_ASCTL_start_default_sclassifier(struct cx_entity *cx,struct rb_entity *rb) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - - // Start debug information -#ifdef NAS_DEBUG_CLASS - printk("\nnasmt_ASCTL_start_default_sclass - begin \n"); -#endif - - if (!cx || !rb) { - printk("nasmt_ASCTL_start_default_sclass - input parameter cx or rb is NULL \n"); - return; - } - - // End debug information - // - gc=nasmt_CLASS_add_sclassifier(cx, NAS_DSCP_DEFAULT, gpriv->next_sclassref); - - // gc=nasmt_CLASS_add_sclassifier(cx, 5, 0); - if (gc==NULL) { - printk("nasmt_ASCTL_start_default_sclass - Error - Classifier not added \n"); - return; - } - - gc->fct = nasmt_COMMON_QOS_send; - gc->rab_id =rb->rab_id; - gc->rb= rb; - gc->version = NASMT_DEFAULTRAB_IPVERSION; - gc->protocol= NAS_PROTOCOL_DEFAULT; - gc->dplen= NAS_DEFAULT_IPv6_PREFIX_LENGTH; - //gc->daddr.ipv6.s6_addr32[2] = cx->iid6[0]; - //gc->daddr.ipv6.s6_addr32[3] = cx->iid6[1]; - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_ASCTL_start_default_sclass - end \n"); - nasmt_TOOL_print_classifier(gc); -#endif -} - -//--------------------------------------------------------------------------- -//For demo, add automatically a classifier -//Equivalent to class add send 0 -f qos -cr 0 -void nasmt_ASCTL_start_sclassifier(struct cx_entity *cx,struct rb_entity *rb) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - - // Start debug information -#ifdef NAS_DEBUG_CLASS - printk("\nnasmt_ASCTL_start_sclass - begin \n"); -#endif - - if (cx==NULL) { - printk("nasmt_ASCTL_start_sclass - input parameter cx is NULL \n"); - return; - } - - if (rb==NULL) { - printk("nasmt_ASCTL_start_sclass - input parameter rb is NULL \n"); - return; - } - - // End debug information - // - gc=nasmt_CLASS_add_sclassifier(cx, rb->dscp, gpriv->next_sclassref); - - // gc=nasmt_CLASS_add_sclassifier(cx, 5, 0); - if (gc==NULL) { - printk("nasmt_ASCTL_start_sclass - Error - Classifier not added \n"); - return; - } - - gc->fct = nasmt_COMMON_QOS_send; - gc->rab_id =rb->rab_id; - gc->rb= rb; - gc->version = NASMT_DEFAULTRAB_IPVERSION; - gc->protocol= NAS_PROTOCOL_DEFAULT; - gc->dplen= NAS_DEFAULT_IPv6_PREFIX_LENGTH; - gc->daddr.ipv6.s6_addr32[2] = cx->iid6[0]; - gc->daddr.ipv6.s6_addr32[3] = cx->iid6[1]; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_ASCTL_start_sclass - end \n"); - nasmt_TOOL_print_classifier(gc); -#endif -} - -//--------------------------------------------------------------------------- -void nasmt_ASCTL_timer(unsigned long data) -{ - //--------------------------------------------------------------------------- - uint8_t cxi; - struct cx_entity *cx; - struct rb_entity *rb; - spin_lock(&gpriv->lock); -#ifdef NAS_DEBUG_TIMER - printk("nasmt_ASCTL_timer - begin \n"); -#endif - (gpriv->timer).function=nasmt_ASCTL_timer; - (gpriv->timer).expires=jiffies+NAS_TIMER_TICK; - (gpriv->timer).data=0L; - - for (cxi=0; cxicx+cxi; - - if (cx==NULL) { -#ifdef NAS_DEBUG_TIMER - printk("nasmt_ASCTL_timer - No pointer for connection %d \n", cxi); -#endif - continue; - } - - if (cx->countimer!=NAS_TIMER_IDLE) { -#ifdef NAS_DEBUG_TIMER - printk("nasmt_ASCTL_timer: lcr %u, countimer %u\n", cx->lcr, cx->countimer); -#endif - - if (cx->countimer==0) { - switch (cx->state) { - case NAS_CX_CONNECTING: - case NAS_CX_CONNECTING_FAILURE: - if (cx->retryretry_limit) - nasmt_ASCTL_DC_send_cx_establish_request(cx); - else { - printk("nasmt_ASCTL_timer: Establishment failure\n"); - cx->state=NAS_IDLE; - cx->retry=0; - cx->countimer=NAS_TIMER_IDLE; - } - - break; - - case NAS_CX_RELEASING_FAILURE: - nasmt_ASCTL_DC_send_cx_release_request(cx); - break; - - default: - printk("nasmt_ASCTL_timer: default value\n"); - cx->countimer=NAS_TIMER_IDLE; - } - } else - --cx->countimer; - } - - for (rb=cx->rb; rb!=NULL; rb=rb->next) { - if (rb->countimer!=NAS_TIMER_IDLE) { -#ifdef NAS_DEBUG_TIMER - printk("nasmt_ASCTL_timer : rb countimer %d, rb state %d\n", rb->countimer, rb->state); -#endif - - if (rb->countimer==0) { - switch (rb->state) { - case NAS_RB_DCH: -#ifdef DEMO_3GSM - if (cx->num_rb == 1) { - nasmt_ASCTL_start_default_sclassifier(cx, rb); - } - -#endif - nasmt_ASCTL_start_sclassifier(cx, rb); - rb->countimer=NAS_TIMER_IDLE; - break; - - default: - rb->countimer=NAS_TIMER_IDLE; - } - } else { - --rb->countimer; - printk("nasmt_ASCTL_timer : rb countimer-- %d, rb state %d\n", rb->countimer, rb->state); - } - } - } - } - - add_timer(&gpriv->timer); - spin_unlock(&gpriv->lock); -} - -//--------------------------------------------------------------------------- -// Request the sleep of a connexion -int nasmt_ASCTL_enter_sleep_mode(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- - uint8_t sig_category; - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_enter_sleep_mode - begin \n"); -#endif - - if (!cx) { - printk("nasmt_ASCTL_enter_sleep_mode - input parameter cx is NULL \n"); - return NAS_ERROR_NOTCORRECTVALUE; - } - - // End debug information - // send peer message to NASRG - sig_category = NAS_CMD_ENTER_SLEEP; - printk("nasmt_ASCTL_enter_sleep_mode - sig_category %u \n", sig_category); - nasmt_ASCTL_DC_send_peer_sig_data_request(cx, sig_category); - cx->state=NAS_CX_RELEASING; - return 0; -} - -//--------------------------------------------------------------------------- -// Request to reactivate a connexion -int nasmt_ASCTL_leave_sleep_mode(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- - uint8_t sig_category; - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_leave_sleep_mode - begin \n"); -#endif - - if (!cx) { - printk("nasmt_ASCTL_leave_sleep_mode - input parameter cx is NULL \n"); - return NAS_ERROR_NOTCORRECTVALUE; - } - - // End debug information - cx->state=NAS_CX_DCH; - // send peer message to NASRG - sig_category = NAS_CMD_LEAVE_SLEEP; - printk("nasmt_ASCTL_leave_sleep_mode - sig_category %u \n", sig_category); - nasmt_ASCTL_DC_send_peer_sig_data_request(cx, sig_category); - return 0; -} - -/*********************************************** - * Transmit Functions * - ***********************************************/ - -//--------------------------------------------------------------------------- -// Request the establishment of a connexion (DC channel) -int nasmt_ASCTL_DC_send_cx_establish_request(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- - struct nas_ue_dc_element *p; - int bytes_wrote = 0; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_send_cx_establish - begin \n"); -#endif - - if (!cx) { - printk("nasmt_ASCTL_DC_send_cx_establish - input parameter cx is NULL \n"); - return NAS_ERROR_NOTCORRECTVALUE; - } - - // End debug information - - switch (cx->state) { - case NAS_CX_CONNECTING: - case NAS_CX_CONNECTING_FAILURE: - case NAS_IDLE: - p= (struct nas_ue_dc_element *)(gpriv->xbuffer); - p->type = CONN_ESTABLISH_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASConnEstablishReq); - p->nasUEDCPrimitive.conn_establish_req.localConnectionRef = cx->lcr; - p->nasUEDCPrimitive.conn_establish_req.cellId = cx->cellid; -#ifdef NAS_DEBUG_DC - printk ("\nCONN_ESTABLISH_REQ Buffer to Xmit: "); - nasmt_TOOL_print_buffer((char *)p,p->length); -#endif - ++cx->retry; - - //bytes_wrote = rtf_put(cx->sap[GRAAL_DC_INPUT_SAPI], p, p->length); //original version - bytes_wrote = nasmt_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)p, p->length); - //printk("nasmt_ASCTL_DC_send_cx_establish_request - Wrote %d bytes to RRC NAS_DC_INPUT_SAPI\n", bytes_wrote); - - cx->countimer=gpriv->timer_establishment; - - if (bytes_wrote==p->length) { - cx->state=NAS_CX_CONNECTING; -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_send_cx_establish - Message sent successfully in DC-FIFO\n"); - printk(" Local Connection reference %u\n", p->nasUEDCPrimitive.conn_establish_req.localConnectionRef); - printk(" Cell Identification %u\n", p->nasUEDCPrimitive.conn_establish_req.cellId); - nasmt_TOOL_print_state(cx->state); -#endif - } else { - cx->state=NAS_CX_CONNECTING_FAILURE; - printk("nasmt_ASCTL_DC_send_cx_establish - Message sent failure in DC-FIFO\n"); - nasmt_TOOL_print_state(cx->state); - } - - return bytes_wrote; - - default: - return -NAS_ERROR_NOTIDLE; -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_send_cx_establish - NAS_ERROR_NOTIDLE \n"); -#endif - } -} - -//--------------------------------------------------------------------------- -// Request the release of a connexion (DC channel) -int nasmt_ASCTL_DC_send_cx_release_request(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- - struct nas_ue_dc_element *p; - int bytes_wrote = 0; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_send_cx_release - begin \n"); -#endif - - if (cx==NULL) { - printk("nasmt_ASCTL_DC_send_cx_release - input parameter cx is NULL \n"); - return NAS_ERROR_NOTCORRECTVALUE; - } - - // End debug information - switch (cx->state) { - case NAS_CX_RELEASING_FAILURE: - case NAS_CX_DCH: - p= (struct nas_ue_dc_element *)(gpriv->xbuffer); - p->type = CONN_RELEASE_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASConnReleaseReq); - p->nasUEDCPrimitive.conn_release_req.localConnectionRef = cx->lcr; - p->nasUEDCPrimitive.conn_release_req.releaseCause = NAS_CX_RELEASE_UNDEF_CAUSE; - - //bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length); //original version - bytes_wrote = nasmt_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)p, p->length); - //printk("nasmt_ASCTL_DC_send_cx_release - Wrote %d bytes to RRC NAS_DC_INPUT_SAPI\n", bytes_wrote); - - if (bytes_wrote==p->length) { - cx->state=NAS_IDLE; - cx->iid4=0; - // nasmt_TOOL_imei2iid(NAS_NULL_IMEI, (uint8_t *)cx->iid6); - nasmt_COMMON_flush_rb(cx); - nasmt_CLASS_flush_sclassifier(cx); - -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_send_cx_release - Message sent successfully in DC-FIFO\n"); - printk(" Local Connection Reference %u\n", p->nasUEDCPrimitive.conn_release_req.localConnectionRef); - printk(" Release Cause %u\n", p->nasUEDCPrimitive.conn_release_req.releaseCause); - nasmt_TOOL_print_state(cx->state); -#endif - } else { - ++cx->retry; - cx->countimer=gpriv->timer_release; - cx->state=NAS_CX_RELEASING_FAILURE; - printk("nasmt_ASCTL_DC_send_cx_release - Message sent failure in DC-FIFO\n"); - nasmt_TOOL_print_state(cx->state); - } - - return bytes_wrote; - - default: - return -NAS_ERROR_NOTCONNECTED; -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_send_cx_release - NAS_ERROR_NOTCONNECTED \n"); -#endif - } -} - -//--------------------------------------------------------------------------- -// Request the transfer of data (DC SAP) -void nasmt_ASCTL_DC_send_sig_data_request(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc) -{ - //--------------------------------------------------------------------------- - struct nas_ue_dc_element *p; - char data_type = 'A'; - int bytes_wrote = 0; -#ifdef PDCP_USE_NETLINK - unsigned char xbuffer[NAS_MESSAGE_MAXLEN]; - int count=0; -#endif - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_send_sig_data - begin \n"); -#endif - - if (!skb || !gc || !cx) { - printk("nasmt_ASCTL_DC_send_sig_data - input parameter skb, gc or cx is NULL \n"); - return; - } - - // End debug information - if (cx->state!=NAS_CX_DCH) { - printk("nasmt_ASCTL_DC_send_sig_data - Not connected, so the message is dropped\n"); - ++gpriv->stats.tx_dropped; - return; - } - - p = (struct nas_ue_dc_element *)(gpriv->xbuffer); - p->type = DATA_TRANSFER_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASDataReq); - p->nasUEDCPrimitive.data_transfer_req.localConnectionRef = cx->lcr; - p->nasUEDCPrimitive.data_transfer_req.priority = 3; // TBD - p->nasUEDCPrimitive.data_transfer_req.nasDataLength = (skb->len)+1; //adds category character - - //bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length); //original version -#ifdef PDCP_USE_NETLINK - memcpy(xbuffer,(unsigned char *)p, p->length); - count = p->length; - bytes_wrote = count; -#else - bytes_wrote = nasmt_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)p, p->length); -#endif - //printk("nasmt_ASCTL_DC_send_sig_data - Wrote %d bytes to RRC NAS_DC_INPUT_SAPI\n", bytes_wrote); - - if (bytes_wrote!=p->length) { - printk("nasmt_ASCTL_DC_send_sig_data - Header sent failure in DC-FIFO\n"); - return; - } - -#ifdef PDCP_USE_NETLINK - memcpy(&(xbuffer[count]),(unsigned char *)&data_type, 1); - count += 1; - bytes_wrote = count; -#else - bytes_wrote += nasmt_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)&data_type, 1); -#endif - -#ifdef PDCP_USE_NETLINK - memcpy(&(xbuffer[count]),(unsigned char *)skb->data, skb->len); - count += skb->len; - bytes_wrote = nasmt_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], xbuffer, count); -#else - bytes_wrote += nasmt_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)skb->data, skb->len); -#endif - - if (bytes_wrote != p->length + skb->len + 1) { - printk("nasmt_ASCTL_DC_send_sig_data - Data sent failure in DC-FIFO\n"); - return; - } - - gpriv->stats.tx_bytes += skb->len; - gpriv->stats.tx_packets ++; -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_send_sig_data - end \n"); -#endif -} - -//--------------------------------------------------------------------------- -// Request the transfer of data (DC SAP) -void nasmt_ASCTL_DC_send_peer_sig_data_request(struct cx_entity *cx, uint8_t sig_category) -{ - //--------------------------------------------------------------------------- - struct nas_ue_dc_element *p; - uint8_t nasmt_data[10]; - unsigned int nasmt_length; - char data_type = 'Z'; - int bytes_wrote = 0; -#ifdef PDCP_USE_NETLINK - unsigned char xbuffer[NAS_MESSAGE_MAXLEN]; - int count=0; -#endif - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_send_peer_sig_data - begin \n"); -#endif - - if (!cx) { - printk("nasmt_ASCTL_DC_send_peer_sig_data - input parameter cx is NULL \n"); - return; - } - - // End debug information - - if (cx->state!=NAS_CX_DCH) { - printk("nasmt_ASCTL_DC_send_peer_sig_data: Not connected, so the message is dropped\n"); - return; - } - - // Initialize peer message - nasmt_length = 10; - memset (nasmt_data, 0, nasmt_length); - nasmt_data[0]= sig_category; - // - p = (struct nas_ue_dc_element *)(gpriv->xbuffer); - p->type = DATA_TRANSFER_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASDataReq); - p->nasUEDCPrimitive.data_transfer_req.localConnectionRef = cx->lcr; - p->nasUEDCPrimitive.data_transfer_req.priority = 3; // TBD - p->nasUEDCPrimitive.data_transfer_req.nasDataLength = (nasmt_length)+1; //adds category character - - //bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length); //original version -#ifdef PDCP_USE_NETLINK - memcpy(xbuffer,(unsigned char *)p, p->length); - count = p->length; - bytes_wrote = count; -#else - bytes_wrote = nasmt_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)p, p->length); -#endif - //printk("nasmt_ASCTL_DC_send_sig_data - Wrote %d bytes to RRC NAS_DC_INPUT_SAPI\n", bytes_wrote); - - if (bytes_wrote!=p->length) { - printk("nasmt_ASCTL_DC_send_peer_sig_data - Header sent failure in DC-FIFO\n"); - return; - } - -#ifdef PDCP_USE_NETLINK - memcpy(&(xbuffer[count]),(unsigned char *)&data_type, 1); - count += 1; -#else - bytes_wrote += nasmt_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)&data_type, 1); -#endif - -#ifdef PDCP_USE_NETLINK - memcpy(&(xbuffer[count]),(unsigned char *)nasmt_data, nasmt_length); - count += nasmt_length; - bytes_wrote = nasmt_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], xbuffer, count); -#else - bytes_wrote += nasmt_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (char *)nasmt_data, nasmt_length); -#endif - - if (bytes_wrote != p->length + nasmt_length + 1) { - printk("nasmt_ASCTL_DC_send_peer_sig_data - Data sent failure in DC-FIFO\n"); - return; - } - -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_send_peer_sig_data - end \n"); -#endif -} - -/*************************************************************************** - Reception side - ***************************************************************************/ -//--------------------------------------------------------------------------- -// Decode CONN_ESTABLISH_RESP message from RRC -void nasmt_ASCTL_DC_decode_cx_establish_resp(struct cx_entity *cx, struct nas_ue_dc_element *p) -{ - //--------------------------------------------------------------------------- - - uint8_t sig_category; - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_decode_cx_establish - begin \n"); -#endif - - if (!cx || !p) { - printk("nasmt_ASCTL_DC_decode_cx_establish - input parameter cx or p is NULL \n"); - return; - } - - // End debug information - cx->retry=0; - - if (p->nasUEDCPrimitive.conn_establish_resp.status == TERMINATED) { - cx->state=NAS_CX_DCH; //to be changed to NAS_CX_FACH - cx->iid4=1; - nasmt_TOOL_imei2iid(NAS_RG_IMEI, (uint8_t *)cx->iid6); - sig_category = NAS_CMD_OPEN_RB; - //For demo, add automatically a radio bearer -#ifdef DEMO_3GSM - printk("nasmt_ASCTL_DC_decode_cx_establish - sig_category %u \n", sig_category); - nasmt_ASCTL_DC_send_peer_sig_data_request(cx, sig_category); -#endif - } else { - cx->state=NAS_IDLE; - } - -#ifdef NAS_DEBUG_DC - printk(" nasmt_ASCTL_DC_decode_cx_establish: CONN_ESTABLISH_RESP\n"); - printk(" Local Connection reference %u\n",p->nasUEDCPrimitive.conn_establish_resp.localConnectionRef); - printk(" Connection Establishment status %u\n",p->nasUEDCPrimitive.conn_establish_resp.status); - nasmt_TOOL_print_state(cx->state); -#endif -} - -//--------------------------------------------------------------------------- -// Decode CONN_LOSS_IND message from RRC -void nasmt_ASCTL_DC_decode_cx_loss_ind(struct cx_entity *cx, struct nas_ue_dc_element *p) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_decode_cx_loss - begin \n"); -#endif - - if (cx==NULL) { - printk("nasmt_ASCTL_DC_decode_cx_loss - input parameter cx is NULL \n"); - return; - } - - if (p==NULL) { - printk("nasmt_ASCTL_DC_decode_cx_loss - input parameter p is NULL \n"); - return; - } - - // End debug information - cx->state=NAS_IDLE; - cx->iid4=0; - //nasmt_TOOL_imei2iid(NAS_NULL_IMEI, (uint8_t *)cx->iid6); - nasmt_COMMON_flush_rb(cx); -#ifdef NAS_DEBUG_DC - printk(" nasmt_ASCTL_DC_decode_cx_loss: CONN_LOSS_IND reception\n"); - printk(" Local Connection reference %u\n", p->nasUEDCPrimitive.conn_loss_ind.localConnectionRef); - nasmt_TOOL_print_state(cx->state); -#endif -} - -//--------------------------------------------------------------------------- -// Decode CONN_RELEASE_IND message from RRC -//void nasmt_ASCTL_DC_decode_cx_release_ind(struct cx_entity *cx, struct nas_ue_dc_element *p){ -//--------------------------------------------------------------------------- -// printk("\t\tCONN_RELEASE_IND\n"); -// printk("\t\tLocal Connection reference %u\n", p->nasUEDCPrimitive.conn_release_ind.localConnectionRef); -// printk("\t\tRelease cause %u\n", p->nasRGDCPrimitive.conn_release_ind.releaseCause); -// if (gpriv->cx[cxi].state==NAS_CX_DCH) -// { -// gpriv->cx[cxi].state=NAS_IDLE; -// printk("\t\tMobile no more connected\n"); -// return bytes_read; -// } -// printk("\t\tIncoherent state %u\n", gpriv->cx[cxi].state); -// return bytes_read; -//} - -//--------------------------------------------------------------------------- -// Decode DATA_TRANSFER_IND message from RRC -void nasmt_ASCTL_DC_decode_sig_data_ind(struct cx_entity *cx, struct nas_ue_dc_element *p) -{ - //--------------------------------------------------------------------------- - // struct pdcp_data_ind_header_t *pdcph; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_decode_sig_data - begin \n"); -#endif - - if (!cx || !p) { - printk("nasmt_ASCTL_DC_decode_sig_data - input parameter cx or p is NULL \n"); - return; - } - - // End debug information - -#ifdef NAS_DEBUG_DC - printk(" nasmt_ASCTL_DC_decode_sig_data: DATA_TRANSFER_IND reception\n"); - printk(" Local Connection reference %u\n",p->nasUEDCPrimitive.data_transfer_ind.localConnectionRef); - printk(" Signaling Priority %u\n",p->nasUEDCPrimitive.data_transfer_ind.priority); - printk(" NAS Data length %u\n",p->nasUEDCPrimitive.data_transfer_ind.nasDataLength); - printk(" NAS Data string %s\n", (uint8_t *)p+p->length); -#endif - - //nasmt_COMMON_receive(p->length, p->nasUEDCPrimitive.data_transfer_ind.nasDataLength, cx->sap[GRAAL_DC_OUTPUT_SAPI]); // original -#ifndef PDCP_USE_NETLINK - //void nasmt_COMMON_receive(uint16_t bytes_read, uint16_t payload_length, void *data_buffer, int rb_id, int sap); - // data_buffer is NULL because FIFO should be read directly in the skbuff (LITE has an intermediary buffer) - nasmt_COMMON_receive(p->length, p->nasUEDCPrimitive.data_transfer_ind.nasDataLength, NULL, 2, cx->sap[NAS_DC_OUTPUT_SAPI]); -#else - nasmt_COMMON_receive(p->length, p->nasUEDCPrimitive.data_transfer_ind.nasDataLength, (unsigned char *)p+p->length, 2, 0); -#endif - -} -//--------------------------------------------------------------------------- -// Decode RB_ESTABLISH_IND message from RRC -void nasmt_ASCTL_DC_decode_rb_establish_ind(struct cx_entity *cx, struct nas_ue_dc_element *p) -{ - //--------------------------------------------------------------------------- - struct rb_entity *rb; - int hard_coded_rbId = 3; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_decode_rb_establish - begin \n"); -#endif - - if (cx==NULL) { - printk("nasmt_ASCTL_DC_decode_rb_establish - input parameter cx is NULL \n"); - return; - } - - if (p==NULL) { - printk("nasmt_ASCTL_DC_decode_rb_establish - input parameter p is NULL \n"); - return; - } - - // End debug information - // TEMP -MW - 26/9/13- Overwrite the rb_id sent by RRC - p->nasUEDCPrimitive.rb_establish_ind.rbId = hard_coded_rbId; - // TEMP -MW - 26/9/13- Rest should be kept unchanged - rb=nasmt_COMMON_search_rb(cx, p->nasUEDCPrimitive.rb_establish_ind.rbId); - - if (rb==NULL) { - rb=nasmt_COMMON_add_rb(cx, p->nasUEDCPrimitive.rb_establish_ind.rbId, p->nasUEDCPrimitive.rb_establish_ind.QoSclass); - rb->state=NAS_RB_DCH; - cx->state=NAS_CX_DCH; - rb->dscp = p->nasUEDCPrimitive.rb_establish_ind.dscp; - rb->sapi = p->nasUEDCPrimitive.rb_establish_ind.sapId; - rb->countimer=1; -#ifdef NAS_DEBUG_DC - printk(" nasmt_ASCTL_DC_decode_rb_establish: RB_ESTABLISH_IND reception\n"); - printk(" Local Connection reference %u\n",p->nasUEDCPrimitive.rb_establish_ind.localConnectionRef); - printk(" Radio Bearer Identity %u \n",p->nasUEDCPrimitive.rb_establish_ind.rbId); - printk(" QoS Traffic Class %u\n",p->nasUEDCPrimitive.rb_establish_ind.QoSclass); - printk(" DSCP Code %u\n",p->nasUEDCPrimitive.rb_establish_ind.dscp); - printk(" SAP Id %u\n",p->nasUEDCPrimitive.rb_establish_ind.sapId); - nasmt_TOOL_print_state(cx->state); - nasmt_TOOL_print_rb_entity(rb); -#endif - } else - printk("NAS_MT_DC_DECODE_RB_ESTABLISH_IND: RB_ESTABLISH_IND reception, Radio bearer already opened\n"); -} - -//--------------------------------------------------------------------------- -// Decode RB_RELEASE_IND message from RRC -void nasmt_ASCTL_DC_decode_rb_release_ind(struct cx_entity *cx, struct nas_ue_dc_element *p) -{ - //--------------------------------------------------------------------------- - struct rb_entity *rb; - uint8_t dscp; - int hard_coded_rbId = 3; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_decode_rb_release - begin \n"); -#endif - - if (!cx || !p) { - printk("nasmt_ASCTL_DC_decode_rb_release - input parameter is NULL \n"); - return; - } - - // End debug information - // TEMP -MW - 26/9/13- Overwrite the rb_id sent by RRC - p->nasUEDCPrimitive.rb_release_ind.rbId = hard_coded_rbId; - // TEMP -MW - 26/9/13- Rest should be kept unchanged - rb=nasmt_COMMON_search_rb(cx, p->nasUEDCPrimitive.rb_release_ind.rbId); - - if (rb!=NULL) { -#ifdef NAS_DEBUG_DC - printk(" nasmt_ASCTL_DC_decode_rb_release : RB_RELEASE_IND reception\n"); - printk(" Local Connection reference %u\n",p->nasUEDCPrimitive.rb_release_ind.localConnectionRef); - printk(" Radio Bearer Identity %u\n",p->nasUEDCPrimitive.rb_release_ind.rbId); - nasmt_TOOL_print_state(cx->state); -#endif - // rb->state=NAS_IDLE; - dscp = rb->dscp; - nasmt_COMMON_del_rb(cx, p->nasUEDCPrimitive.rb_release_ind.rbId, dscp); - } else - printk("nasmt_ASCTL_DC_decode_rb_release: RB_RELEASE_IND reception, No corresponding radio bearer\n"); - -} -//--------------------------------------------------------------------------- -// Decode MEASUREMENT_IND message from RRC -void nasmt_ASCTL_DC_decode_measurement_ind(struct cx_entity *cx, struct nas_ue_dc_element *p) -{ - //--------------------------------------------------------------------------- - uint8_t i; - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_decode_measurement - begin \n"); -#endif - - if (cx==NULL) { - printk("nasmt_ASCTL_DC_decode_measurement - input parameter cx is NULL \n"); - return; - } - - if (p==NULL) { - printk("nasmt_ASCTL_DC_decode_measurement - input parameter p is NULL \n"); - return; - } - - // End debug information -#ifdef NAS_DEBUG_DC_MEASURE - printk(" nasmt_ASCTL_DC_decode_measurement : MEASUREMENT_IND reception\n"); - printk(" Local Connection reference: %u\n", p->nasUEDCPrimitive.measurement_ind.localConnectionRef); - printk(" Number of RGs: %u\n", p->nasUEDCPrimitive.measurement_ind.nb_rg); - nasmt_TOOL_print_state(cx->state); - - for (i=0; inasUEDCPrimitive.measurement_ind.nb_rg; ++i) { - printk(" RG[%u]: Cell_Id %u, Level: %u\n", i, - p->nasUEDCPrimitive.measurement_ind.measures[i].cell_id, - p->nasUEDCPrimitive.measurement_ind.measures[i].level); - } - -#endif -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_decode_measurement - Local cell %d\n",p->nasUEDCPrimitive.measurement_ind.measures[0].cell_id); -#endif - cx->num_measures = p->nasUEDCPrimitive.measurement_ind.nb_rg; - - for (i=0; inum_measures; i++) { - cx->meas_cell_id[i]= (int)(p->nasUEDCPrimitive.measurement_ind.measures[i].cell_id); - cx->meas_level[i] = (int)(p->nasUEDCPrimitive.measurement_ind.measures[i].level); - //npriv->provider_id[i]=; - } - - cx->provider_id[0]=25; - cx->provider_id[1]=1; - cx->provider_id[2]=25; - -} - -//--------------------------------------------------------------------------- -// Decode MBMS_UE_NOTIFY_IND message from RRC -void nasmt_ASCTL_DC_decode_mbms_ue_notify_ind(struct cx_entity *cx, struct nas_ue_dc_element *p) -{ - //--------------------------------------------------------------------------- - uint8_t i, j, k; - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasmt_ASCTL_DC_decode_mbms_ue_notify - begin \n"); -#endif - - if (!cx || !p) { - printk("nasmt_ASCTL_DC_decode_mbms_ue_notify - input parameter is NULL \n"); - return; - } - - for (i = 0; inasUEDCPrimitive.mbms_ue_notify_ind.joined_services[i].mbms_serviceId >=0) { - for (j = 0; jjoined_services[j] ==-1) { - cx->joined_services[j]= p->nasUEDCPrimitive.mbms_ue_notify_ind.joined_services[i].mbms_serviceId; - break; - } - } - } - - if (p->nasUEDCPrimitive.mbms_ue_notify_ind.left_services[i].mbms_serviceId >=0) { - for (k = 0; kjoined_services[k] == p->nasUEDCPrimitive.mbms_ue_notify_ind.left_services[i].mbms_serviceId) { - cx->joined_services[k]=-1; - break; - } - } - } - } - - // End debug information -#ifdef NAS_DEBUG_DC - printk(" nasmt_ASCTL_DC_decode_mbms_ue_notify : MBMS_UE_NOTIFY_IND reception\n"); - printk(" Local Connection reference: %u\n", p->nasUEDCPrimitive.mbms_ue_notify_ind.localConnectionRef); - nasmt_TOOL_print_state(cx->state); - printk("Joined services: "); - - for (i = 0; inasUEDCPrimitive.mbms_ue_notify_ind.joined_services[i].mbms_serviceId) >= 0; i++) - printk("%d ", (p->nasUEDCPrimitive.mbms_ue_notify_ind.joined_services[i].mbms_serviceId)); - - printk("\n"); - printk("Left services: "); - - for (i = 0; inasUEDCPrimitive.mbms_ue_notify_ind.left_services[i].mbms_serviceId) >= 0; i++) - printk("%d ", (p->nasUEDCPrimitive.mbms_ue_notify_ind.left_services[i].mbms_serviceId)); - - printk("\n"); -#endif -} - -//--------------------------------------------------------------------------- -// Check if anything in DC FIFO and decode it (MT) -int nasmt_ASCTL_DC_receive(struct cx_entity *cx, char *buffer) -{ - //--------------------------------------------------------------------------- - int bytes_read=0; - - // Start debug information -#ifdef NAS_DEBUG_DC_DETAIL - printk("nasmt_ASCTL_DC_receive - begin \n"); -#endif - - if (!cx) { - printk("nasmt_ASCTL_DC_receive - input parameter cx is NULL \n"); - return NAS_ERROR_NOTCORRECTVALUE; - } - - // End debug information - -#ifndef PDCP_USE_NETLINK - bytes_read = rtf_get(cx->sap[NAS_DC_OUTPUT_SAPI] , gpriv->rbuffer, NAS_TL_SIZE); -#else - bytes_read = NAS_TL_SIZE; -#endif - - // - if (bytes_read>0) { - struct nas_ue_dc_element *p; - -#ifndef PDCP_USE_NETLINK - p= (struct nas_ue_dc_element *)(gpriv->rbuffer); - //get the rest of the primitive - bytes_read += rtf_get(cx->sap[NAS_DC_OUTPUT_SAPI], (uint8_t *)p+NAS_TL_SIZE, p->length-NAS_TL_SIZE); - - if (bytes_read!=p->length) { - printk("nasmt_ASCTL_DC_receive: Problem while reading primitive header\n"); - return bytes_read; - } - -#else - p= (struct nas_ue_dc_element *)(buffer); -#endif - - switch (p->type) { - case CONN_ESTABLISH_RESP : - if (p->nasUEDCPrimitive.conn_establish_resp.localConnectionRef!=cx->lcr) - printk("nasmt_ASCTL_DC_receive: CONN_ESTABLISH_RESP, Local connection reference not correct %u\n",p->nasUEDCPrimitive.conn_establish_resp.localConnectionRef); - else { - switch (cx->state) { - case NAS_CX_CONNECTING: - nasmt_ASCTL_DC_decode_cx_establish_resp(cx,p); // process message - break; - - default: - printk("nasmt_ASCTL_DC_receive: CONN_ESTABLISH_RESP reception, Invalid state %u\n", cx->state); - } - } - - break; - - case CONN_LOSS_IND : - if (p->nasUEDCPrimitive.conn_loss_ind.localConnectionRef!=cx->lcr) - printk("nasmt_ASCTL_DC_receive: CONN_LOSS_IND reception, Local connection reference not correct %u\n", p->nasUEDCPrimitive.conn_loss_ind.localConnectionRef); - else { - switch (cx->state) { - case NAS_CX_RELEASING_FAILURE: - cx->retry=0; - - case NAS_CX_DCH: - nasmt_ASCTL_DC_decode_cx_loss_ind(cx,p); // process message - break; - - default: - printk("nasmt_ASCTL_DC_receive: CONN_LOSS_IND reception, Invalid state %u", cx->state); - } - } - - break; - - // case CONN_RELEASE_IND : - // break; - case DATA_TRANSFER_IND : - if (p->nasUEDCPrimitive.data_transfer_ind.localConnectionRef!=cx->lcr) - printk("nasmt_ASCTL_DC_receive: DATA_TRANSFER_IND reception, Local connection reference not correct %u\n", p->nasUEDCPrimitive.conn_loss_ind.localConnectionRef); - else { - switch (cx->state) { - case NAS_CX_FACH: - case NAS_CX_DCH: - nasmt_ASCTL_DC_decode_sig_data_ind(cx,p); // process message - break; - - default: - printk("nasmt_ASCTL_DC_receive: DATA_TRANSFER_IND reception, Invalid state %u", cx->state); - } - } - - break; - - case RB_ESTABLISH_IND : - if (p->nasUEDCPrimitive.rb_establish_ind.localConnectionRef!=cx->lcr) - printk("nasmt_ASCTL_DC_receive: RB_ESTABLISH_IND reception, Local connexion reference not correct %u\n", p->nasUEDCPrimitive.rb_establish_ind.localConnectionRef); - else { - switch (cx->state) { - case NAS_CX_FACH: - case NAS_CX_DCH: - nasmt_ASCTL_DC_decode_rb_establish_ind(cx,p); // process message - break; - - default: - printk("nasmt_ASCTL_DC_receive: RB_ESTABLISH_IND reception, Invalid state %u", cx->state); - } - } - - break; - - case RB_RELEASE_IND : - if (p->nasUEDCPrimitive.rb_release_ind.localConnectionRef!=cx->lcr) - printk("nasmt_ASCTL_DC_receive: RB_RELEASE_IND reception, Local connection reference not correct %u\n", p->nasUEDCPrimitive.rb_release_ind.localConnectionRef); - else { - switch (cx->state) { - case NAS_CX_DCH: - nasmt_ASCTL_DC_decode_rb_release_ind(cx,p); // process message - break; - - default: - printk("nasmt_ASCTL_DC_receive: RB_RELEASE_IND reception, Invalid state %u", cx->state); - } - } - - break; - - case MEASUREMENT_IND : - if (p->nasUEDCPrimitive.measurement_ind.localConnectionRef!=cx->lcr) - printk("nasmt_ASCTL_DC_receive: MEASUREMENT_IND reception, Local connection reference not correct %u\n", p->nasUEDCPrimitive.measurement_ind.localConnectionRef); - else { - nasmt_ASCTL_DC_decode_measurement_ind(cx,p); - } - - break; - - case MBMS_UE_NOTIFY_IND : - if (p->nasUEDCPrimitive.rb_release_ind.localConnectionRef!=cx->lcr) - printk("nasmt_ASCTL_DC_receive: MBMS_UE_NOTIFY_IND reception, Local connection reference not correct %u\n", p->nasUEDCPrimitive.rb_release_ind.localConnectionRef); - else { - switch (cx->state) { - case NAS_CX_DCH: - nasmt_ASCTL_DC_decode_mbms_ue_notify_ind(cx,p); // process message - break; - - default: - printk("nasmt_ASCTL_DC_receive: MBMS_UE_NOTIFY_IND reception, Invalid state %u", cx->state); - } - } - - break; - - default : - printk("nasmt_ASCTL_DC_receive: Invalid message received\n"); - } - } - -#ifdef NAS_DEBUG_DC_DETAIL - printk("nasmt_ASCTL_DC_receive - end \n"); -#endif - return bytes_read; -} - -//--------------------------------------------------------------------------- -// Check if anything in GC FIFO and decode it (MT) -int nasmt_ASCTL_GC_receive(char *buffer) -{ - //--------------------------------------------------------------------------- - int bytes_read = 0; - -#ifdef NAS_DEBUG_GC - printk("nasmt_ASCTL_GC_receive - begin \n"); -#endif - // End debug information - -#ifndef PDCP_USE_NETLINK - bytes_read = rtf_get(gpriv->sap[NAS_GC_SAPI], gpriv->rbuffer, NAS_TL_SIZE); -#else - bytes_read = NAS_TL_SIZE; -#endif - - // - if (bytes_read>0) { - struct nas_ue_gc_element *p; -#ifndef PDCP_USE_NETLINK - p= (struct nas_ue_gc_element *)(gpriv->rbuffer); - //get the rest of the primitive - bytes_read += rtf_get(gpriv->sap[NAS_GC_SAPI], (uint8_t *)p+NAS_TL_SIZE, p->length-NAS_TL_SIZE); - - if (bytes_read!=p->length) { - printk("nasmt_ASCTL_GC_receive: Problem while reading primitive's header\n"); - return bytes_read; - } - -#else - p= (struct nas_ue_gc_element *)(buffer); - bytes_read = p->length; -#endif - - // start decoding message - switch (p->type) { - case INFO_BROADCAST_IND : -#ifndef PDCP_USE_NETLINK - bytes_read += rtf_get(gpriv->sap[NAS_GC_SAPI], (uint8_t *)p+p->length, p->nasUEGCPrimitive.broadcast_ind.nasDataLength); - - if (bytes_read!=p->length+p->nasUEGCPrimitive.broadcast_ind.nasDataLength) { - printk("nasmt_ASCTL_GC_receive: INFO_BROADCAST_IND reception, Problem while reading primitive's data\n"); - return bytes_read; - } - -#endif -#ifdef NAS_DEBUG_GC - printk(" nasmt_ASCTL_GC_receive : INFO_BROADCAST_IND reception\n"); - printk(" Primitive length %d \n", (int)(p->type)); - printk(" Data length %u\n", p->nasUEGCPrimitive.broadcast_ind.nasDataLength); - printk(" Data string %s\n", (uint8_t *)p+p->length); -#endif - return bytes_read; - - default : - printk("nasmt_ASCTL_GC_receive: Invalid message received, type %d\n", p->type); - nasmt_TOOL_print_buffer(buffer, 16); - return -1; - } - } else - return -1; -} - -#endif diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c deleted file mode 100755 index 1e79a4f3f0..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_classifier.c +++ /dev/null @@ -1,891 +0,0 @@ -/*************************************************************************** - nasmt_classifier.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_classifier.c -* \brief Flow classification functions for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#include "nasmt_variables.h" -#include "nasmt_proto.h" - -#include -#include - -#define IN_CLASSA(a) ((((long int) (a)) & 0x80000000) == 0) -#define IN_CLASSB(a) ((((long int) (a)) & 0xc0000000) == 0x80000000) -#define IN_CLASSC(a) ((((long int) (a)) & 0xe0000000) == 0xc0000000) -#define IN_CLASSD(a) ((((long int) (a)) & 0xf0000000) == 0xe0000000) - -/* Address to accept any incoming messages. */ -#define INADDR_ANY ((unsigned long int) 0x00000000) - -#define NIPADDR(addr) \ - (uint8_t)(addr & 0x000000FF), \ - (uint8_t)((addr & 0x0000FF00) >> 8), \ - (uint8_t)((addr & 0x00FF0000) >> 16), \ - (uint8_t)((addr & 0xFF000000) >> 24) - -#define NIP6ADDR(addr) \ - ntohs((addr)->s6_addr16[0]), \ - ntohs((addr)->s6_addr16[1]), \ - ntohs((addr)->s6_addr16[2]), \ - ntohs((addr)->s6_addr16[3]), \ - ntohs((addr)->s6_addr16[4]), \ - ntohs((addr)->s6_addr16[5]), \ - ntohs((addr)->s6_addr16[6]), \ - ntohs((addr)->s6_addr16[7]) - - -#define IN6_IS_ADDR_UNSPECIFIED(a) \ - (((__const uint32_t *) (a))[0] == 0 \ - && ((__const uint32_t *) (a))[1] == 0 \ - && ((__const uint32_t *) (a))[2] == 0 \ - && ((__const uint32_t *) (a))[3] == 0) - -#define IN6_ARE_ADDR_MASKED_EQUAL(a,b,m) \ - (((((__const uint32_t *) (a))[0] & (((__const uint32_t *) (m))[0])) == (((__const uint32_t *) (b))[0] & (((__const uint32_t *) (m))[0]))) \ - && ((((__const uint32_t *) (a))[1] & (((__const uint32_t *) (m))[1])) == (((__const uint32_t *) (b))[1] & (((__const uint32_t *) (m))[1]))) \ - && ((((__const uint32_t *) (a))[2] & (((__const uint32_t *) (m))[2])) == (((__const uint32_t *) (b))[2] & (((__const uint32_t *) (m))[2]))) \ - && ((((__const uint32_t *) (a))[3] & (((__const uint32_t *) (m))[3])) == (((__const uint32_t *) (b))[3] & (((__const uint32_t *) (m))[3])))) - -#define IN_ARE_ADDR_MASKED_EQUAL(a,b,m) \ - (((((__const uint8_t *) (a))[0] & (((__const uint8_t *) (m))[0])) == (((__const uint8_t *) (b))[0] & (((__const uint8_t *) (m))[0]))) \ - && ((((__const uint8_t *) (a))[1] & (((__const uint8_t *) (m))[1])) == (((__const uint8_t *) (b))[1] & (((__const uint8_t *) (m))[1]))) \ - && ((((__const uint8_t *) (a))[2] & (((__const uint8_t *) (m))[2])) == (((__const uint8_t *) (b))[2] & (((__const uint8_t *) (m))[2]))) \ - && ((((__const uint8_t *) (a))[3] & (((__const uint8_t *) (m))[3])) == (((__const uint8_t *) (b))[3] & (((__const uint8_t *) (m))[3])))) - -//--------------------------------------------------------------------------- -void nasmt_create_mask_ipv6_addr(struct in6_addr *masked_addrP, int prefix_len) -{ - //--------------------------------------------------------------------------- - int u6_addr8_index; - int u6_addr1_index; - int index; - - masked_addrP->s6_addr32[0] = 0xFFFFFFFF; - masked_addrP->s6_addr32[1] = 0xFFFFFFFF; - masked_addrP->s6_addr32[2] = 0xFFFFFFFF; - masked_addrP->s6_addr32[3] = 0xFFFFFFFF; - - u6_addr8_index = prefix_len >> 3; - u6_addr1_index = prefix_len & 0x07; - - for (index = u6_addr8_index + 1; index < 16; index++) { - masked_addrP->s6_addr[index] = 0; - } - - if (u6_addr1_index > 0) { - masked_addrP->s6_addr[u6_addr8_index] = 0xFF << (8-u6_addr1_index); - } -} -//--------------------------------------------------------------------------- -void nasmt_create_mask_ipv4_addr(struct in_addr *masked_addrP, int prefix_len) -{ - //--------------------------------------------------------------------------- - if (prefix_len > 32) { - prefix_len = 32; - } - - masked_addrP->s_addr = 0xFFFFFFFF << (32 - prefix_len); - return; -} - -//--------------------------------------------------------------------------- -// Add a new classifier rule (send direction) -struct classifier_entity *nasmt_CLASS_add_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_add_sclassifier: begin for dscp %d, classref %d\n", dscp,classref); -#endif - - if (cx==NULL) { - printk("nasmt_CLASS_add_sclassifier - input parameter cx is NULL \n"); - return NULL; - } - - //*** - for (gc=cx->sclassifier[dscp]; gc!=NULL; gc=gc->next) { - if (gc->classref==classref) { -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_add_sclassifier: classifier already exist for dscp %d, classref %d\n",dscp,classref); -#endif - return gc; - } - } - - gc=(struct classifier_entity *)kmalloc(sizeof(struct classifier_entity), GFP_ATOMIC); - - if (gc==NULL) - return NULL; - - memset(gc, 0, sizeof(struct classifier_entity)); - gc->next=cx->sclassifier[dscp]; - gc->classref=classref; - cx->sclassifier[dscp]=gc; - ++cx->nsclassifier; - ++gpriv->next_sclassref; //increment send classref index - MW 15/01/07 -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_add_sclassifier: classifier created for dscp %d, classref %d\n",dscp,classref); -#endif - return gc; -} - -//--------------------------------------------------------------------------- -// Add a new classifier rule (receive direction) -struct classifier_entity *nasmt_CLASS_add_rclassifier(uint8_t dscp, uint16_t classref) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_add_rclassifier: begin\n"); -#endif - - //*** - for (gc=gpriv->rclassifier[dscp]; gc!=NULL; gc=gc->next) { - if (gc->classref==classref) { -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_add_rclassifier: classifier already exist for dscp %d, classref %d\n",dscp,classref); -#endif - return gc; - } - } - - gc=(struct classifier_entity *)kmalloc(sizeof(struct classifier_entity), GFP_KERNEL); - - if (gc==NULL) - return NULL; - - gc->next=gpriv->rclassifier[dscp]; - gc->classref=classref; - gpriv->rclassifier[dscp]=gc; - ++gpriv->nrclassifier; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_add_rclassifier: classifier created for dscp %d, classref %d\n",dscp,classref); -#endif - return gc; -} - -//--------------------------------------------------------------------------- -void nasmt_CLASS_flush_sclassifier(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- - uint8_t dscpi; - struct classifier_entity *gc; - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_flush_sclassifier: begin\n"); -#endif - - if (cx==NULL) { - printk("nasmt_CLASS_flush_sclassifier - input parameter cx is NULL \n"); - return; - } - - //*** - for (dscpi=0; dscpisclassifier[dscpi]; gc!=NULL; gc=cx->sclassifier[dscpi]) { - cx->sclassifier[dscpi]=gc->next; - kfree(gc); - } - } - - cx->nsclassifier=0; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_flush_sclassifier: end\n"); -#endif -} - -//--------------------------------------------------------------------------- -void nasmt_CLASS_flush_rclassifier() -{ - //--------------------------------------------------------------------------- - uint8_t dscpi; - struct classifier_entity *gc; - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_flush_rclassifier: begin\n"); -#endif - - //*** - for (dscpi=0; dscpirclassifier[dscpi]; gc!=NULL; gc=gpriv->rclassifier[dscpi]) { - gpriv->rclassifier[dscpi]=gc->next; - kfree(gc); - } - } - - gpriv->nrclassifier=0; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_flush_rclassifier: end\n"); -#endif -} - -//--------------------------------------------------------------------------- -// Delete a classifier rule (send direction) -void nasmt_CLASS_del_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *p,*np; - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_del_sclassifier: begin\n"); -#endif - - if (cx==NULL) { - printk("nasmt_CLASS_del_sclassifier - input parameter cx is NULL \n"); - return; - } - - //*** - p=cx->sclassifier[dscp]; - - if (p==NULL) - return; - - if (p->classref==classref) { - cx->sclassifier[dscp]=p->next; - kfree(p); - --cx->nsclassifier; - return; - } - - for (np=p->next; np!=NULL; p=np) { - if (np->classref==classref) { - p->next=np->next; - kfree(np); - --cx->nsclassifier; - return; - } - } - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_del_sclassifier: end\n"); -#endif -} - -//--------------------------------------------------------------------------- -// Delete a classifier rule (receive direction) -void nasmt_CLASS_del_rclassifier(uint8_t dscp, uint16_t classref) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *p,*np; - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_del_rclassifier: begin\n"); -#endif - //*** - p=gpriv->rclassifier[dscp]; - - if (p==NULL) - return; - - if (p->classref==classref) { - gpriv->rclassifier[dscp]=p->next; - kfree(p); - --gpriv->nrclassifier; - return; - } - - for (np=p->next; np!=NULL; p=np) { - if (np->classref==classref) { - p->next=np->next; - kfree(np); - --gpriv->nrclassifier; - return; - } - } - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_del_rclassifier: end\n"); -#endif -} - -/* ORIGINAL VERSION -//--------------------------------------------------------------------------- -// Search the entity with the IPv6 address 'addr' -struct cx_entity *nasmt_CLASS_cx6(struct sk_buff *skb){ -//--------------------------------------------------------------------------- - uint8_t cxi; - #ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_cx6: begin\n"); - #endif - cxi=0; - return gpriv->cx+cxi; -}*/ - -//--------------------------------------------------------------------------- -// Search the entity with the IPv6 address 'addr' -// Navid: the ipv6 classifier is not fully tested -struct cx_entity *nasmt_CLASS_cx6(struct sk_buff *skb, unsigned char dscp, int *paddr_type, unsigned char *cx_index) -{ - //--------------------------------------------------------------------------- - uint8_t cxi; - struct cx_entity *cx = NULL; - struct classifier_entity *sclassifier= NULL; - uint32_t mc_addr_hdr; - struct in6_addr masked_addr; - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_cx6: begin\n"); -#endif - - if (skb) { -#ifdef NAS_DEBUG_CLASS - printk("SOURCE ADDR %X:%X:%X:%X:%X:%X:%X:%X",NIP6ADDR(&(ipv6_hdr(skb)->saddr))); - printk(" DEST ADDR %X:%X:%X:%X:%X:%X:%X:%X\n",NIP6ADDR(&(ipv6_hdr(skb)->daddr))); -#endif - mc_addr_hdr = ntohl(ipv6_hdr(skb)->daddr.in6_u.u6_addr32[0]); - - // First check if multicast [1st octet is FF] - if ((mc_addr_hdr & 0xFF000000) == 0xFF000000) { - // packet type according to the scope of the multicast packet - // we don't consider RPT bits in second octet [maybe done later if needed] - switch(mc_addr_hdr & 0x000F0000) { - case (0x00020000): - *paddr_type = NAS_IPV6_ADDR_MC_SIGNALLING; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_cx6: multicast packet - signalling \n"); -#endif - break; - - default: - printk("nasmt_CLASS_cx6: default multicast\n"); - *paddr_type = NAS_IPV6_ADDR_UNKNOWN; - } - } else { - // This is not multicast, so we should be able to identify the MT - *paddr_type = NAS_IPV6_ADDR_UNICAST; - cxi = 0; - (*cx_index)++; - sclassifier = gpriv->cx[cxi].sclassifier[dscp]; - - while (sclassifier!=NULL) { - // verify that this is an IPv6 classifier - if ((sclassifier->version == NAS_VERSION_6) || (sclassifier->version == NAS_VERSION_DEFAULT)) { - /*LGif (IN6_IS_ADDR_UNSPECIFIED(&(sclassifier->daddr.ipv6))) { - printk("nas_CLASS_cx6: addr is null \n"); - sclassifier = sclassifier->next; - continue; - }*/ -#ifdef NAS_DEBUG_CLASS - printk("cx %d : DSCP %d %X:%X:%X:%X:%X:%X:%X:%X\n",cxi, dscp, NIP6ADDR(&(sclassifier->daddr.ipv6))); -#endif //NAS_DEBUG_CLASS - - //if ((dst = (unsigned int*)&(((struct rt6_info *)skbdst)->rt6i_gateway)) == 0){ - // LG: STRANGE - if (IN6_IS_ADDR_UNSPECIFIED(&ipv6_hdr(skb)->daddr)) { - printk("nasmt_CLASS_cx6: dst addr is null \n"); - sclassifier = sclassifier->next; - continue; - } - - nasmt_create_mask_ipv6_addr(&masked_addr, sclassifier->dplen); - // Modified MW to check only the iid6 - masked_addr.s6_addr32[0] = 0x00000000; - masked_addr.s6_addr32[1] = 0x00000000; - - if (IN6_ARE_ADDR_MASKED_EQUAL(&ipv6_hdr(skb)->daddr, &(sclassifier->daddr.ipv6), &masked_addr)) { -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_cx6: found cx %d: %X:%X:%X:%X:%X:%X:%X:%X\n",cxi, NIP6ADDR(&(sclassifier->daddr.ipv6))); -#endif //NAS_DEBUG_CLASS - return &gpriv->cx[cxi]; - } - } - - // Go to next classifier entry for connection - sclassifier = sclassifier->next; - } - } - } - - //printk("nas_CLASS_cx6 NOT FOUND: %X:%X:%X:%X:%X:%X:%X:%X\n",NIP6ADDR(&ipv6_hdr(skb)->daddr)); - return cx; -} - -/* ORIGINAL VERSION -//--------------------------------------------------------------------------- -// Search the entity with the IPv4 address 'addr' -struct cx_entity *nasmt_CLASS_cx4(struct sk_buff *skb){ -//--------------------------------------------------------------------------- - uint8_t cxi; - #ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_cx4: begin\n"); - #endif - cxi=0; - return gpriv->cx+cxi; -}*/ - -//--------------------------------------------------------------------------- -// Search the entity with the IPv4 address 'addr' -struct cx_entity *nasmt_CLASS_cx4(struct sk_buff *skb, unsigned char dscp, int *paddr_type, unsigned char *cx_index) -{ - //--------------------------------------------------------------------------- - unsigned char cxi; - uint32_t daddr; - struct cx_entity *cx=NULL; - struct classifier_entity *pclassifier=NULL; - struct in_addr masked_addr; - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_cx4: begin\n"); -#endif - - if (skb!=NULL) { - daddr = ((struct iphdr*)(skb_network_header(skb)))->daddr; - - if (daddr != INADDR_ANY) { -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_cx4: SOURCE ADDR %d.%d.%d.%d",NIPADDR(ip_hdr(skb)->saddr)); - printk(" DEST ADDR %d.%d.%d.%d\n",NIPADDR(ip_hdr(skb)->daddr)); -#endif - - if (ipv4_is_multicast(ip_hdr(skb)->daddr)) { - // TO BE CHECKED - *paddr_type = NAS_IPV4_ADDR_MC_SIGNALLING; - } else { - if (ipv4_is_lbcast(ip_hdr(skb)->daddr)) { - // TO BE CHECKED - *paddr_type = NAS_IPV4_ADDR_BROADCAST; - } else { - if (IN_CLASSA(ip_hdr(skb)->daddr) || IN_CLASSB(ip_hdr(skb)->daddr) || IN_CLASSC(ip_hdr(skb)->daddr)) { - *paddr_type = NAS_IPV4_ADDR_UNICAST; - cxi = 0; - (*cx_index)++; - pclassifier = gpriv->cx[cxi].sclassifier[dscp]; - - while (pclassifier!=NULL) { - // verify that this is an IPv4 classifier - if ((pclassifier->version == NAS_VERSION_4) || (pclassifier->version == NAS_VERSION_DEFAULT)) { - nasmt_create_mask_ipv4_addr(&masked_addr, pclassifier->dplen); - - if (IN_ARE_ADDR_MASKED_EQUAL(&ip_hdr(skb)->daddr, &(pclassifier->daddr.ipv4), &masked_addr)) { -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_cx4: IP MASK MATCHED: found cx %d: %d.%d.%d.%d/%d\n",cxi, NIPADDR(pclassifier->daddr.ipv4), pclassifier->dplen); -#endif - return &gpriv->cx[cxi]; - } - } - - // goto to next classification rule for the connection - pclassifier = pclassifier->next; - } - } else { - *paddr_type = NAS_IPV4_ADDR_UNKNOWN; - } - } - } - } - } - - return cx; -} - -//--------------------------------------------------------------------------- -// Search the sending function for IP Packet -void nasmt_CLASS_send(struct sk_buff *skb) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *pclassifier, *sp; - uint8_t *protocolh = NULL; - uint8_t version; - uint8_t protocol, dscp; - uint16_t classref; - struct cx_entity *cx; -#ifdef NAS_DEBUG_CLASS - char sfct[10], sprotocol[10]; -#endif - struct net_device *dev = gdev; - unsigned char cx_index,no_connection; - int addr_type; - struct in6_addr masked6_addr; - struct in_addr masked_addr; - // RARP vars - struct arphdr *rarp; - unsigned char *rarp_ptr; - /* s for "source", t for "target" */ - __be32 sip, tip; - unsigned char *sha, *tha; - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send: begin -\n"); -#endif - - if (skb==NULL) { - printk("nasmt_CLASS_send - input parameter skb is NULL \n"); - return; - } - - //*** -#ifdef NAS_DEBUG_SEND - printk("nasmt_CLASS_send - Received IP packet to transmit:"); - - if ((skb->data) != NULL) { - if (skb->len<100) - nasmt_TOOL_print_buffer(skb->data,skb->len); - else - nasmt_TOOL_print_buffer(skb->data,100); - } - -#endif - //*** - // find all connections related to socket - cx_index = 0; - no_connection = 1; - cx = NULL; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send: [before switch on IP protocol version] \n"); -#endif - - - // Get mobile connexion entity, protocol and dscp from IP packet - switch (ntohs(skb->protocol)) { - case ETH_P_IPV6: -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send : skb->protocol : IPv6 \n"); -#endif - version = NAS_VERSION_6; - addr_type = NAS_IPV6_ADDR_UNKNOWN; - protocolh = nasmt_TOOL_get_protocol6(ipv6_hdr(skb), &protocol); - dscp = nasmt_TOOL_get_dscp6 (ipv6_hdr(skb)); - cx = nasmt_CLASS_cx6 (skb, dscp, &addr_type, &cx_index); -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send - ETH_P_IPV6 skb %p dscp %d gpriv %p cx_index %p \n",skb, dscp, gpriv, &cx_index); -#endif - - // find in default DSCP a valid classification - if (cx == NULL) { - switch (addr_type) { - case NAS_IPV6_ADDR_MC_SIGNALLING: - case NAS_IPV6_ADDR_UNICAST: - pclassifier=(&gpriv->cx[0])->sclassifier[NAS_DSCP_DEFAULT]; - - while (pclassifier!=NULL) { - if ((pclassifier->version == NAS_VERSION_6) || (pclassifier->version == NAS_VERSION_DEFAULT)) { - // ok found default classifier for this packet - nasmt_create_mask_ipv6_addr(&masked6_addr, pclassifier->dplen); - - if (IN6_ARE_ADDR_MASKED_EQUAL(&pclassifier->daddr.ipv6, &ipv6_hdr(skb)->daddr, &masked6_addr)) { - // then force dscp - cx = &gpriv->cx[0]; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send - ETH_P_IPV6 FOUND NAS_DSCP_DEFAULT with IN6_ARE_ADDR_MASKED_EQUAL(%d bits)\n",pclassifier->dplen); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } else { - if(IN6_IS_ADDR_UNSPECIFIED(&pclassifier->daddr.ipv6)) { - cx = &gpriv->cx[0]; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send - ETH_P_IPV6 FOUND NAS_DSCP_DEFAULT with IN6_IS_ADDR_UNSPECIFIED\n"); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } - } - } - - pclassifier = pclassifier->next; - } - - break; - - // should have found a valid classification rule - case NAS_IPV6_ADDR_UNKNOWN: - default: - printk("nasmt_CLASS_send: No corresponding address type\n"); - } - } - - break; - - case ETH_P_ARP: -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send : skb->protocol : ARP \n"); -#endif - version = NAS_VERSION_4; - addr_type = NAS_IPV4_ADDR_BROADCAST; - dscp = 0; - cx = NULL; - // Basic sanity checks can be done without the lock - rarp = (struct arphdr *)skb_network_header(skb); - - if (rarp) { - if (rarp->ar_hln != dev->addr_len || dev->type != ntohs(rarp->ar_hrd)) { - printk("nasmt_CLASS_send: ARP PACKET WRONG ADDR LEN or WRONG ARP HEADER TYPE\n"); - break; - } - } else { - printk("nasmt_CLASS_send: ARP HEADER POINTER IS NULL\n"); - break; - } - - // If it's not Ethernet, delete it. - if (rarp->ar_pro != htons(ETH_P_IP)) { - printk("nasmt_CLASS_send: ARP PACKET PROTOCOL IS NOT ETHERNET\n"); - break; - } - - rarp_ptr = (unsigned char *) (rarp + 1); - sha = rarp_ptr; - rarp_ptr += dev->addr_len; - memcpy(&sip, rarp_ptr, 4); - rarp_ptr += 4; - tha = rarp_ptr; - rarp_ptr += dev->addr_len; - memcpy(&tip, rarp_ptr, 4); -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send: ARP DEST IP transport IP = %d.%d.%d.%d\n",NIPADDR(tip)); -#endif - pclassifier=(&gpriv->cx[0])->sclassifier[NAS_DSCP_DEFAULT]; - - while (pclassifier!=NULL) { - if ((pclassifier->version == NAS_VERSION_4) || (pclassifier->version == NAS_VERSION_DEFAULT)) { - // ok found default classifier for this packet - nasmt_create_mask_ipv4_addr(&masked_addr, pclassifier->dplen); -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send: MASK = %d.%d.%d.%d\n",NIPADDR(masked_addr.s_addr)); -#endif - - // - if (IN_ARE_ADDR_MASKED_EQUAL(&pclassifier->daddr.ipv4, &tip, &masked_addr.s_addr)) { - // then force dscp - cx = &gpriv->cx[0]; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send: ETH_P_ARP FOUND NAS_DSCP_DEFAULT with IN_ARE_ADDR_MASKED_EQUAL(%d bits)\n", pclassifier->dplen); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } else { - if (INADDR_ANY == pclassifier->daddr.ipv4) { - cx = &gpriv->cx[0]; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send: ETH_P_ARP FOUND NAS_DSCP_DEFAULT with INADDR_ANY\n"); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } - } - } - - pclassifier = pclassifier->next; - } - - break; - - case ETH_P_IP: -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send : skb->protocol : IPv4 \n"); -#endif - version = NAS_VERSION_4; - addr_type = NAS_IPV4_ADDR_UNKNOWN; - dscp = nasmt_TOOL_get_dscp4((struct iphdr *)(skb_network_header(skb))); - cx = nasmt_CLASS_cx4(skb, dscp, &addr_type, &cx_index); - protocolh = nasmt_TOOL_get_protocol4((struct iphdr *)(skb_network_header(skb)), &protocol); - - // find in default DSCP a valid classification - if (cx == NULL) { - switch (addr_type) { - case NAS_IPV4_ADDR_MC_SIGNALLING: - case NAS_IPV4_ADDR_UNICAST: - case NAS_IPV4_ADDR_BROADCAST: - pclassifier=(&gpriv->cx[0])->sclassifier[NAS_DSCP_DEFAULT]; - - while (pclassifier != NULL) { - if ((pclassifier->version == NAS_VERSION_4) || (pclassifier->version == NAS_VERSION_DEFAULT)) { - // ok found default classifier for this packet - nasmt_create_mask_ipv4_addr(&masked_addr, pclassifier->dplen); -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send : MASK = %d.%d.%d.%d\n", NIPADDR(masked_addr.s_addr)); -#endif - - if (IN_ARE_ADDR_MASKED_EQUAL(&pclassifier->daddr.ipv4, &ip_hdr(skb)->daddr, &masked_addr.s_addr)) { - // then force dscp - cx = &gpriv->cx[0]; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send : ETH_P_IP FOUND NAS_DSCP_DEFAULT with IN_ARE_ADDR_MASKED_EQUAL(%d bits)\n",pclassifier->dplen); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } else { - if(INADDR_ANY == pclassifier->daddr.ipv4) { - cx = &gpriv->cx[0]; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send : ETH_P_IP FOUND NAS_DSCP_DEFAULT with INADDR_ANY\n"); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } - } - } - - pclassifier = pclassifier->next; - } - - break; - - // should have found a valid classification rule - case NAS_IPV4_ADDR_UNKNOWN: - default: - printk("nasmt_CLASS_send: No corresponding address type\n"); - } - } - -#ifdef NAS_DEBUG_CLASS - - //printk("nasmt_CLASS_send: ETH_P_IP Received IPv4 packet (%02X), dscp = %d, cx = %08X\n",ntohs(skb->protocol),dscp,cx); - if (cx) - printk("nasmt_CLASS_send: ETH_P_IP Received IPv4 packet (%02X), dscp = %d, cx = %d\n",ntohs(skb->protocol),dscp,cx->lcr); - else - printk("nasmt_CLASS_send: ETH_P_IP Received IPv4 packet (%02X), dscp = %d, No valid connection\n",ntohs(skb->protocol),dscp); - -#endif - break; - - default: - printk("nasmt_CLASS_send: Unknown IP version protocol\n"); - version = 0; - return; - } - -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasmt_CLASS_send: [before if (cx != NULL)]\n"); -#endif - - // If a valid connection for the DSCP/EXP with destination address - // is found scan all protocol-based classification rules - if (cx != NULL) { - classref = 0; - sp = NULL; - - if (cx->state!=NAS_CX_DCH) { -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send: UE not connected, in state %d. Packet is dropped\n",cx->state); -#endif - return; - } - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send: DSCP %d version %d: looking for classifier entry\n",dscp, version); -#endif - - for (pclassifier=cx->sclassifier[dscp]; pclassifier!=NULL; pclassifier=pclassifier->next) { -#ifdef NAS_DEBUG_CLASS - printk("nasmt_CLASS_send: DSCP %d p->classref=%d,p->protocol=%d,p->version=%d\n",dscp,pclassifier->classref,pclassifier->protocol,pclassifier->version); -#endif - - // normal rule checks that network protocol version matches - if ((pclassifier->version == version) || (pclassifier->version == NAS_VERSION_DEFAULT)) { - //printk("nasmt_CLASS_send: IP version are equals\n"); - sp=pclassifier; - classref=sp->classref; -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasmt_CLASS_send: classifier found for dscp %u \n", dscp); -#endif - break; - } - } - - if (sp!=NULL) { -#ifdef NAS_DEBUG_CLASS - - //char sfct[10], sprotocol[10]; - // classifier entity found. Print its parameters - if (sp->fct==nasmt_COMMON_QOS_send) - strcpy(sfct, "data xfer"); - - if (sp->fct==nasmt_CTL_send) - strcpy(sfct, "iocontrol"); - - if (sp->fct==nasmt_COMMON_del_send) - strcpy(sfct, "delete"); - - if (sp->fct==nasmt_ASCTL_DC_send_sig_data_request) - strcpy(sfct, "DC-SAP"); - - switch(protocol) { - case NAS_PROTOCOL_UDP: - strcpy(sprotocol, "udp"); - printk("udp packet\n"); - break; - - case NAS_PROTOCOL_TCP: - strcpy(sprotocol, "tcp"); - printk("tcp packet\n"); - break; - - case NAS_PROTOCOL_ICMP4: - strcpy(sprotocol, "icmp4"); - printk("icmp4 packet\n"); - break; - - case NAS_PROTOCOL_ICMP6: - strcpy(sprotocol, "icmp6"); - nasmt_TOOL_pk_icmp6((struct icmp6hdr*)protocolh); - break; - - default: - strcpy(sprotocol, "other L4"); - break; - } - - printk("nasmt_CLASS_send: (dscp %u, %s) received, (classref %u, fct %s, drb_id %u) classifier rule\n", - dscp, sprotocol, sp->classref, sfct, sp->rab_id); -#endif - - //forward packet to the correct entity - if (sp->fct!=NULL) { - sp->fct(skb, cx, sp); - } else { - printk("\n\nnasmt_CLASS_send: ERROR : CLASSIFIER FUNCTION IS NULL\n\n"); - } - - no_connection = 0; - // end : if classifier entry match found - } else { - printk("nasmt_CLASS_send: no corresponding item in the classifier list, so the message is dropped\n"); - printk("nasmt_CLASS_send: packet parameters: dscp %u, %s\n", dscp, sprotocol); - nasmt_COMMON_del_send(skb, cx, NULL); // Note MW: LG has commented this line. Why? - } - } // if connection found - -#ifdef NAS_DEBUG_CLASS - - if (no_connection == 1) { - printk("nasmt_CLASS_send: no corresponding connection, so the message is dropped\n"); - } - - printk("nasmt_CLASS_send: end\n"); -#endif -} diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c deleted file mode 100755 index 8006cccc74..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_common.c +++ /dev/null @@ -1,549 +0,0 @@ -/*************************************************************************** - nasmt_common.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_common.c -* \brief Common functions for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#include "nasmt_variables.h" -#include "nasmt_proto.h" - -#include -#ifdef NAS_DRIVER_TYPE_ETHERNET -#include -#endif - -//--------------------------------------------------------------------------- -// Receive data from FIFO (QOS or DC) -//void nasmt_COMMON_receive(uint16_t hlen, uint16_t dlen, int sap){ -//void nasmt_COMMON_receive(uint16_t hlen, uint16_t dlen, void *pdcp_sdu, int sap){ -void nasmt_COMMON_receive(uint16_t bytes_read, uint16_t payload_length, void *data_buffer, int rb_id, int sap) -{ - //--------------------------------------------------------------------------- - struct sk_buff *skb; - struct ipversion *ipv; - unsigned int hard_header_len; - uint16_t *p_ether_type; - uint16_t ether_type; - -#ifdef NAS_DEBUG_RECEIVE - printk("nasmt_COMMON_receive: begin\n"); -#endif -#ifdef PDCP_USE_NETLINK - - // data_buffer is NULL if FIFOs - if (!data_buffer) { - printk("nasmt_COMMON_receive - input parameter data_buffer is NULL \n"); - return; - } - -#endif - - skb = dev_alloc_skb( payload_length + 2 ); - - if(!skb) { - printk("nasmt_COMMON_receive: low on memory\n"); - ++gpriv->stats.rx_dropped; - return; - } - - skb_reserve(skb,2); - -#ifndef PDCP_USE_NETLINK - bytes_read += rtf_get(sap, skb_put(skb, payload_length), payload_length); - - if (bytes_read != NAS_PDCPH_SIZE + payload_length) { - printk("nasmt_COMMON_receive: problem while reading DC sap\n"); - kfree(skb->data); - dev_kfree_skb(skb); - return; - } - -#else - memcpy(skb_put(skb, payload_length), data_buffer, payload_length); - bytes_read += payload_length; -#endif - -#ifdef NAS_DEBUG_RECEIVE - printk("nasmt_COMMON_receive: received packet from PDCP, length %d\n", bytes_read); -#endif - - skb->dev = gdev; - hard_header_len = gdev->hard_header_len; - skb->mac_header = skb->data; - skb->pkt_type = PACKET_HOST; - skb->ip_summed = CHECKSUM_UNNECESSARY; - - ipv = (struct ipversion *)&(skb->data[hard_header_len]); - - switch (ipv->version) { - case 6: -#ifdef NAS_DEBUG_RECEIVE_BASIC - printk("nasmt_COMMON_receive: receive IPv6 message\n"); -#endif - skb->network_header = &skb->data[hard_header_len]; - // set protocol default value - skb->protocol = htons(ETH_P_IPV6); - // If type Ethernet, correct it -#ifdef NAS_DRIVER_TYPE_ETHERNET - skb->protocol = eth_type_trans(skb, gdev); -#endif - break; - - case 4: -#ifdef NAS_DEBUG_RECEIVE_BASIC - printk("nasmt_COMMON_receive: receive IPv4 message\n"); -#endif - -#ifdef NAS_DEBUG_RECEIVE - addr = (unsigned char *)&((struct iphdr *)&skb->data[hard_header_len])->saddr; - - if (addr) { - printk("nasmt_COMMON_receive: Source %d.%d.%d.%d\n",addr[0],addr[1],addr[2],addr[3]); - } - - addr = (unsigned char *)&((struct iphdr *)&skb->data[hard_header_len])->daddr; - - if (addr) { - printk("[NAS][COMMON][RECEIVE] Dest %d.%d.%d.%d\n",addr[0],addr[1],addr[2],addr[3]); - } - - printk("[NAS][COMMON][RECEIVE] protocol %d\n",((struct iphdr *)&skb->data[hard_header_len])->protocol); -#endif - - skb->network_header = &skb->data[hard_header_len]; - // set protocol default value - skb->protocol = htons(ETH_P_IP); - // If type Ethernet, correct it -#ifdef NAS_DRIVER_TYPE_ETHERNET - skb->protocol = eth_type_trans(skb, gdev); -#endif - break; - - default: - printk("nasmt_COMMON_receive: Packet is not IPv4 or IPv6 (version=%d)\n", ipv->version); - -#ifdef NAS_DRIVER_TYPE_ETHERNET -#ifdef NAS_DEBUG_RECEIVE - printk("nasmt_COMMON_receive: ether_type=%04X\n", ether_type); -#endif - skb->protocol = eth_type_trans(skb, gdev); - // minus 1(short) instead of 2(bytes) because uint16_t* - p_ether_type = (uint16_t *)&(skb->mac_header[hard_header_len-2]); - ether_type = ntohs(*p_ether_type); -#ifdef NAS_DEBUG_RECEIVE - printk("nasmt_COMMON_receive: ether_type=%04X\n", ether_type); -#endif - - switch (ether_type) { - case ETH_P_ARP: - printk("[NAS][COMMON] ether_type = ETH_P_ARP\n"); - skb->protocol = htons(ETH_P_ARP); - skb->network_header = &skb->mac_header[hard_header_len]; - break; - - default: - break; - } - -#endif - } - - ++gpriv->stats.rx_packets; - gpriv->stats.rx_bytes += bytes_read; -#ifdef NAS_DEBUG_RECEIVE - printk("nasmt_COMMON_receive: forwarding packet of size %d to kernel\n",skb->len); -#endif - - netif_rx(skb); -#ifdef NAS_DEBUG_RECEIVE - printk("nasmt_COMMON_receive: end\n"); -#endif -} - -//--------------------------------------------------------------------------- -// Delete the data -void nasmt_COMMON_del_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *sp) -{ - //--------------------------------------------------------------------------- -#ifdef NAS_DEBUG_SEND - printk("nasmt_COMMON_del_send - updating statistics \n"); -#endif - ++gpriv->stats.tx_dropped; -} - -//--------------------------------------------------------------------------- -// Request the transfer of data (QoS SAP) -void nasmt_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc) -{ - //--------------------------------------------------------------------------- - //struct pdcp_data_req pdcph; - struct pdcp_data_req_header_t pdcph; - int bytes_wrote = 0; - - // Start debug information -#ifdef NAS_DEBUG_SEND - printk("nasmt_COMMON_QOS_send - begin \n"); -#endif - - // if (cx->state!=NAS_STATE_CONNECTED) // <--- A REVOIR - // { - // gpriv->stats.tx_dropped ++; - // printk("NAS_QOS_SEND: No connected, so message are dropped \n"); - // return; - // } - if (!skb || !gc || !cx) { - printk("nasmt_COMMON_QOS_send - input parameter skb|gc|cx is NULL \n"); - return; - } - - // End debug information - - if (gc->rb==NULL) { - gc->rb = nasmt_COMMON_search_rb(cx, gc->rab_id); - - if (gc->rb==NULL) { - ++gpriv->stats.tx_dropped; - printk("nasmt_COMMON_QOS_send: No corresponding Radio Bearer, so message is dropped, rab_id=%u \n", gc->rab_id); - return; - } - } - -#ifdef NAS_DEBUG_SEND - printk("nasmt_COMMON_QOS_send #1 :"); - printk("lcr %u, rab_id %u, rab_id %u\n", cx->lcr, (gc->rb)->rab_id, gc->rab_id); - nasmt_TOOL_print_classifier(gc); -#endif - - pdcph.data_size = skb->len; - pdcph.rb_id = ((gc->rb)->rab_id+(32*cx->lcr))-NAS_SIG_NUM_SRB; - pdcph.inst = 0; - -#ifdef PDCP_USE_NETLINK - bytes_wrote = nasmt_netlink_send((unsigned char *)&pdcph,NAS_PDCPH_SIZE, NASNL_DEST_PDCP); - //printk("nasmt_COMMON_QOS_send - Wrote %d bytes (header for %d byte skb) to PDCP via netlink\n", bytes_wrote,skb->len); -#else - //bytes_wrote = rtf_put(gpriv->sap[(gc->rb)->sapi], &pdcph, NAS_PDCPH_SIZE); - bytes_wrote = rtf_put(NAS2PDCP_FIFO, &pdcph, NAS_PDCPH_SIZE); - //printk("nasmt_COMMON_QOS_send - Wrote %d bytes (header for %d byte skb) to PDCP fifo\n", bytes_wrote,skb->len); -#endif //PDCP_USE_NETLINK - - if (bytes_wrote != NAS_PDCPH_SIZE) { - printk("nasmt_COMMON_QOS_send: problem while writing PDCP's header\n"); - printk("rb_id %d, SAP index %d, Wrote %d to fifo %d, Header Size %d \n", pdcph.rb_id , (gc->rb)->sapi, bytes_wrote, NAS2PDCP_FIFO, NAS_PDCPH_SIZE); - gpriv->stats.tx_dropped ++; - return; - } - -#ifdef PDCP_USE_NETLINK - bytes_wrote += nasmt_netlink_send((unsigned char *)skb->data,skb->len, NASNL_DEST_PDCP); -#else - //bytes_wrote += rtf_put(gpriv->sap[(gc->rb)->sapi], skb->data, skb->len); - bytes_wrote += rtf_put(NAS2PDCP_FIFO, skb->data, skb->len); -#endif //PDCP_USE_NETLINK - - if (bytes_wrote != skb->len + NAS_PDCPH_SIZE) { - printk("nasmt_COMMON_QOS_send: problem while writing PDCP's data\n"); // congestion - printk("rb_id %d, SAP index %d, Wrote %d to fifo %d, Header Size %d \n", pdcph.rb_id , (gc->rb)->sapi, bytes_wrote, NAS2PDCP_FIFO, NAS_PDCPH_SIZE); - gpriv->stats.tx_dropped ++; - return; - } - -#ifdef NAS_DEBUG_SEND - printk("nasmt_COMMON_QOS_send - %d bytes wrote to rb_id %d, sap %d \n", bytes_wrote, pdcph.rb_id,NAS2PDCP_FIFO); -#endif - gpriv->stats.tx_bytes += skb->len; - gpriv->stats.tx_packets ++; -#ifdef NAS_DEBUG_SEND - printk("nasmt_COMMON_QOS_send - end \n"); -#endif -} - -#ifndef PDCP_USE_NETLINK -//--------------------------------------------------------------------------- -void nasmt_COMMON_QOS_receive(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- - uint8_t sapi; - //struct pdcp_data_ind pdcph; - struct pdcp_data_ind_header_t pdcph; - int bytes_read = 0; - - // Start debug information -#ifdef NAS_DEBUG_RECEIVE - printk("nasmt_COMMON_QOS_receive - begin \n"); -#endif - - if (!cx) { - printk("nasmt_COMMON_QOS_receive - input parameter cx is NULL \n"); - return; - } - - // End debug information - - // LG force the use of only 1 rt fifo - sapi = NAS_DRB_OUTPUT_SAPI; - - bytes_read = rtf_get(gpriv->sap[sapi], &pdcph, NAS_PDCPH_SIZE); - - while (bytes_read>0) { - if (bytes_read != NAS_PDCPH_SIZE) { - printk("nasmt_COMMON_QOS_receive: problem while reading PDCP header\n"); - return; - } - - //void nasmt_COMMON_receive(uint16_t bytes_read, uint16_t payload_length, void *data_buffer, int rb_id, int sap); - // data_buffer is NULL because FIFO should be read directly in the skbuff (LITE has an intermediary buffer) - nasmt_COMMON_receive(NAS_PDCPH_SIZE, pdcph.data_size, NULL, pdcph->rb_id, gpriv->sap[sapi]); - // check if another frame is in the FIFO, otherwise return - bytes_read = rtf_get(gpriv->sap[sapi], &pdcph, NAS_PDCPH_SIZE); - } - -#ifdef NAS_DEBUG_RECEIVE - printk("nasmt_COMMON_QOS_receive - end \n"); -#endif -} - -#else -//--------------------------------------------------------------------------- -void nasmt_COMMON_QOS_receive(struct nlmsghdr *nlh) -{ - //--------------------------------------------------------------------------- - - struct pdcp_data_ind_header_t *pdcph; - - // Start debug information -#ifdef NAS_DEBUG_RECEIVE - printk("nasmt_COMMON_QOS_receive - begin \n"); -#endif - - if (!nlh) { - printk("nasmt_COMMON_QOS_receive - input parameter nlh is NULL \n"); - return; - } - - // End debug information - pdcph = (struct pdcp_data_ind_header_t *)NLMSG_DATA(nlh); - -#ifdef NAS_DEBUG_RECEIVE - printk("nasmt_COMMON_QOS_receive - receive from PDCP, size %d, rab %d\\n", pdcph->data_size, pdcph->rb_id); -#endif //NAS_DEBUG_RECEIVE - - //void nasmt_COMMON_receive(uint16_t bytes_read, uint16_t payload_length, void *data_buffer, int rb_id, int sap); - nasmt_COMMON_receive(NAS_PDCPH_SIZE + pdcph->data_size, pdcph->data_size, (unsigned char *)NLMSG_DATA(nlh) + NAS_PDCPH_SIZE, pdcph->rb_id, 0); - -} -#endif //PDCP_USE_NETLINK - - -//--------------------------------------------------------------------------- -struct cx_entity *nasmt_COMMON_search_cx(nasLocalConnectionRef_t lcr) -{ - //--------------------------------------------------------------------------- -#ifdef NAS_DEBUG_CLASS - printk("nasmt_COMMON_search_cx - lcr %d\n",lcr); -#endif - - if (lcrcx+lcr; - else - return NULL; -} - -//--------------------------------------------------------------------------- -// Search a Radio Bearer -struct rb_entity *nasmt_COMMON_search_rb(struct cx_entity *cx, nasRadioBearerId_t rab_id) -{ - //--------------------------------------------------------------------------- - struct rb_entity *rb; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_COMMON_search_rb - rab_id %d\n", rab_id); -#endif - - if (!cx) { - printk("nasmt_COMMON_search_rb - input parameter cx is NULL \n"); - return NULL; - } - - for (rb=cx->rb; rb!=NULL; rb=rb->next) { - if (rb->rab_id==rab_id) - return rb; - } - - return NULL; -} - -//--------------------------------------------------------------------------- -struct rb_entity *nasmt_COMMON_add_rb(struct cx_entity *cx, nasRadioBearerId_t rab_id, nasQoSTrafficClass_t qos) -{ - //--------------------------------------------------------------------------- - struct rb_entity *rb; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_COMMON_add_rb - begin for rab_id %d , qos %d\n", rab_id, qos ); -#endif - - if (cx==NULL) { - printk("nasmt_COMMON_add_rb - input parameter cx is NULL \n"); - return NULL; - } - - rb=nasmt_COMMON_search_rb(cx, rab_id); - - if (rb==NULL) { - rb=(struct rb_entity *)kmalloc(sizeof(struct rb_entity), GFP_KERNEL); - - if (rb!=NULL) { - rb->retry=0; - rb->countimer=NAS_TIMER_IDLE; - rb->rab_id=rab_id; - // rb->rab_id=rab_id+(32*cx->lcr); -#ifdef NAS_DEBUG_DC - printk("nasmt_COMMON_add_rb: rb rab_id=%u, rab_id=%u, mt_id=%u\n",rb->rab_id,rab_id, cx->lcr); -#endif - rb->qos=qos; - rb->sapi=NAS_DRB_INPUT_SAPI; - // LG force the use of only one rt-fifo rb->sapi=NAS_BA_INPUT_SAPI; - rb->state=NAS_IDLE; - rb->next=cx->rb; - cx->rb=rb; - ++cx->num_rb; - } else - printk("nasmt_COMMON_add_rb: no memory\n"); - } - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_COMMON_add_rb - end \n" ); -#endif - return rb; -} - -//--------------------------------------------------------------------------- -// free the memory that has previously been allocated to rb and remove from linked list -void nasmt_COMMON_del_rb(struct cx_entity *cx, nasRadioBearerId_t rab_id, nasIPdscp_t dscp) -{ - //--------------------------------------------------------------------------- - struct rb_entity *rb, *curr_rb, *prev_rb; - struct classifier_entity *p; - uint16_t classref=0; - - // Start debug information -#ifdef NAS_DEBUG_CLASS - printk("nasmt_COMMON_del_rb - begin\n"); -#endif - - if (cx==NULL) { - printk("nasmt_COMMON_del_rb - input parameter cx is NULL \n"); - return; - } - - // End debug information - - // Clear the associated classifier - for (p=cx->sclassifier[dscp]; p!=NULL; p=p->next) { - if (p->classref>=classref) { - classref=p->classref; -#ifdef NAS_DEBUG_CLASS - printk("nasmt_COMMON_del_rb: classifier found for dscp %u \n", dscp); -#endif - } - } - - nasmt_CLASS_del_sclassifier(cx, dscp, classref); - - // Now, delete the RB - curr_rb = NULL; - prev_rb = NULL; - - for (rb=cx->rb; rb!=NULL; rb=rb->next) { - if (rb->rab_id == rab_id) { - curr_rb = rb; - - if (prev_rb!=NULL) { - prev_rb->next = rb->next; - } else { - cx->rb=rb->next; - } - - break; - } else { - prev_rb = rb; - } - } - - if (curr_rb!= NULL) { - printk("nasmt_COMMON_del_rb: del rab_id %u\n", rb->rab_id); - kfree(rb); - (cx->num_rb)--; - } else { - printk("\n\n--nasmt_COMMON_del_rb: ERROR, invalid rab_id %u\n", rb->rab_id); - } - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_COMMON_del_rb - end\n"); -#endif -} - -//--------------------------------------------------------------------------- -void nasmt_COMMON_flush_rb(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- - struct rb_entity *rb; - struct classifier_entity *gc; - uint8_t dscp; - // Start debug information -#ifdef NAS_DEBUG_CLASS - printk("nasmt_COMMON_flush_rb - begin\n"); -#endif - - if (cx==NULL) { - printk("nasmt_COMMON_flush_rb - input parameter cx is NULL \n"); - return; - } - - // End debug information - for (rb=cx->rb; rb!=NULL; rb=cx->rb) { - printk("nasmt_COMMON_flush_rb: del rab_id %u\n", rb->rab_id); - cx->rb=rb->next; - kfree(rb); - } - - cx->num_rb=0; - cx->rb=NULL; - - for(dscp=0; dscpsclassifier[dscp]; gc!=NULL; gc=gc->next) - gc->rb=NULL; - } - -#ifdef NAS_DEBUG_CLASS - printk("nasmt_COMMON_flush_rb - end\n"); -#endif -} diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h deleted file mode 100755 index c772804949..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_constant.h +++ /dev/null @@ -1,219 +0,0 @@ -/*************************************************************************** - nasmt_constant.h - description - *************************************************************************** - Defines all constants for NAS MT - In particular, constants for the default RAB - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_constant.h -* \brief Defines all constants for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef _NASMTD_CST -#define _NASMTD_CST - -//Debug flags -#define NAS_DEBUG_DC -//#define NAS_DEBUG_DC_DETAIL // detail of DC-SAP operation -#define NAS_DEBUG_SEND -#define NAS_DEBUG_SEND_DETAIL // detail of packet transmission -//#define NAS_DEBUG_RECEIVE -#define NAS_DEBUG_RECEIVE_BASIC -#define NAS_DEBUG_CLASS -//#define NAS_DEBUG_GC -//#define NAS_DEBUG_DC_MEASURE -//#define NAS_DEBUG_TIMER -#define NAS_DEBUG_DEVICE -//#define NAS_DEBUG_INTERRUPT -//#define NAS_DEBUG_TOOL -#define NETLINK_DEBUG -//#define NAS_DEBUG_RRCNL // RRC netlink socket - -// Other flags -#define DEMO_3GSM -#define ENABLE_SLEEP_MODE - -// Parameters for the default RAB started after attachment (needs DEMO_3GSM defined) -#define NASMT_DEFAULTRAB_CLASSREF 1 //MW-01/01/07- -#define NASMT_DEFAULTRAB_DSCP 0 //MW-01/01/07- -#define NASMT_DEFAULTRAB_IPVERSION NAS_VERSION_DEFAULT //MW-01/01/07- - -#define NAS_DEFAULT_IPv6_PREFIX_LENGTH 128 // used to compare destination address - - -// General Constants -#define NAS_MTU 1500 -#define NAS_TX_QUEUE_LEN 100 -#define NAS_ADDR_LEN 8 -#define NAS_INET6_ADDRSTRLEN 46 -#define NAS_INET_ADDRSTRLEN 16 - -#define NAS_RESET_RX_FLAGS 0 - -#define NAS_CX_MAX 1 -//#define NAS_CX_MULTICAST_ALLNODE 2 -#define NASMT_MBMS_SVCES_MAX 4 // Identical to RRC constant - -#define NAS_RETRY_LIMIT_DEFAULT 5 - -#define NAS_MESSAGE_MAXLEN 1600 - -// UMTS -#define NAS_SIG_SRB3 3 -#define NAS_SIG_SRB4 3 // not used yet -//LTE -#define NAS_SIG_NUM_SRB 3 // number of srbs in LTE to send Rb_Id to PDCP - -//peer-to-peer messages between NAS entities -#define NAS_CMD_OPEN_RB 1 -#define NAS_CMD_ENTER_SLEEP 2 -#define NAS_CMD_LEAVE_SLEEP 3 - -//#define NAS_IID1_CONTROL 0x0 -//#define NAS_IID2_CONTROL __constant_htonl(0xffffffff) - -//#define NAS_STATE_IDLE 0 -//#define NAS_STATE_CONNECTED 1 -//#define NAS_STATE_ESTABLISHMENT_REQUEST 2 -//#define NAS_STATE_ESTABLISHMENT_FAILURE 3 -//#define NAS_STATE_RELEASE_FAILURE 4 -#define NAS_CX_RELEASE_UNDEF_CAUSE 1 - -// MT+RG NAS States -#define NAS_IDLE 0x01 -// Connection -#define NAS_CX_FACH 0x06 -#define NAS_CX_DCH 0x0A -#define NAS_CX_RECEIVED 0x10 -#define NAS_CX_CONNECTING 0x04 -#define NAS_CX_RELEASING 0x08 -#define NAS_CX_CONNECTING_FAILURE 0x14 -#define NAS_CX_RELEASING_FAILURE 0x18 -// Radio Bearers -#define NAS_RB_ESTABLISHING 0x24 -#define NAS_RB_RELEASING 0x28 -#define NAS_RB_DCH 0x2A - - -#define NAS_TIMER_ESTABLISHMENT_DEFAULT 12 -#define NAS_TIMER_RELEASE_DEFAULT 2 -#define NAS_TIMER_IDLE UINT_MAX -#define NAS_TIMER_TICK HZ - -#define NAS_PDCPH_SIZE sizeof(struct pdcp_data_req_header_t) -#define NAS_IPV4_SIZE 20 -#define NAS_IPV6_SIZE 40 - -#define NAS_DIRECTION_SEND 0 -#define NAS_DIRECTION_RECEIVE 1 - -// function number -#define NAS_FCT_DEL_SEND 1 -#define NAS_FCT_QOS_SEND 2 -#define NAS_FCT_DC_SEND 3 -#define NAS_FCT_CTL_SEND 4 - -// type of IOCTL command -#define NASMT_IOCTL_RAL 0x89F0 - -// Error cause -#define NAS_ERROR_ALREADYEXIST 1 -#define NAS_ERROR_NOMEMORY 3 -#define NAS_ERROR_NOTMT 9 -#define NAS_ERROR_NOTRG 10 -#define NAS_ERROR_NOTIDLE 11 -#define NAS_ERROR_NOTCONNECTED 12 -#define NAS_ERROR_NORB 14 -#define NAS_ERROR_NOTCORRECTVALUE 32 -#define NAS_ERROR_NOTCORRECTLCR 33 -#define NAS_ERROR_NOTCORRECTDIR 34 -#define NAS_ERROR_NOTCORRECTDSCP 35 -#define NAS_ERROR_NOTCORRECTVERSION 36 -#define NAS_ERROR_NOTCORRECTRABI 37 - - -/**********************************************************/ -/* Constants related with IP protocols */ -/**********************************************************/ -// Destination address types -#define NAS_IPV6_ADDR_UNICAST 1 -#define NAS_IPV6_ADDR_MC_SIGNALLING 2 -#define NAS_IPV6_ADDR_MC_MBMS 3 -#define NAS_IPV6_ADDR_UNKNOWN 4 - -#define NAS_IPV4_ADDR_UNICAST 5 -#define NAS_IPV4_ADDR_MC_SIGNALLING 6 -#define NAS_IPV4_ADDR_BROADCAST 7 -#define NAS_IPV4_ADDR_UNKNOWN 8 - - -//#define NAS_PORT_CONTROL __constant_htons(0xc45) -//#define NAS_PORT_AUTHENTICATION __constant_htons(1811) - -//#define NAS_TRAFFICCLASS_MASK __constant_htonl(0x0fc00000) //Yan -#define NAS_TRAFFICCLASS_MASK __constant_htonl(0x0ff00000) - -// Network control codepoint 111000 + IP version 6 -#define NAS_FLOWINFO_NCONTROL __constant_htonl(0x6e000000) -// network control codepoint 111000 -#define NAS_DSCP_NCONTROL 56 //0x38 -// default codepoint 1000000 -#define NAS_DSCP_DEFAULT 64 -#define NAS_DSCP_MAX 65 - -#define NAS_PROTOCOL_DEFAULT 0 -#define NAS_PROTOCOL_TCP IPPROTO_TCP -#define NAS_PROTOCOL_UDP IPPROTO_UDP -#define NAS_PROTOCOL_ICMP4 IPPROTO_ICMP -#define NAS_PROTOCOL_ICMP6 IPPROTO_ICMPV6 - -#define NAS_PORT_DEFAULT __constant_htons(65535) -#define NAS_PORT_HTTP __constant_htons(80) - -#define NAS_VERSION_DEFAULT 0 -#define NAS_VERSION_4 4 -#define NAS_VERSION_6 6 //?MW - -/**********************************************************/ -/* Constants related with Netlink sockets */ -/**********************************************************/ -#define OAI_IP_DRIVER_NETLINK_ID 31 -#define NL_DEST_PID 1 - -// defined in rrc_nas_sap.h -//#define NAS_RRCNL_ID 30 -//#define NL_DEST_RRC_PID 2 - -#define NASNL_DEST_PDCP 0 -#define NASNL_DEST_RRC 1 - -#endif - - - diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c deleted file mode 100755 index 91fb934e0a..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_device.c +++ /dev/null @@ -1,567 +0,0 @@ -/*************************************************************************** - nasmt_device.c - description - *************************************************************************** - Device Driver features for MT - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_device.c -* \brief Networking Device Driver for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef PDCP_USE_NETLINK -#ifdef RTAI -#include "rtai_posix.h" -#define RTAI_IRQ 30 //try to get this irq with RTAI -#endif // RTAI -#endif // PDCP_USE_NETLINK -//:::::::::::::::::::::::::::::::::::::::;; -#include "nasmt_variables.h" -#include "nasmt_proto.h" -//:::::::::::::::::::::::::::::::::::::::;; -//#include -#include -#include -#include -#include -#include - -#ifdef NAS_DRIVER_TYPE_ETHERNET -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef NAS_DRIVER_TYPE_ETHERNET -#include -#endif -//:::::::::::::::::::::::::::::::::::::::;; -struct net_device *gdev; -struct nas_priv *gpriv; -//int bytes_wrote; -//int bytes_read; -uint8_t NAS_NULL_IMEI[14]= {0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00}; -uint8_t NAS_RG_IMEI[14]= {0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x01}; - -// TEMP -//uint8_t nas_IMEI[14]; -static unsigned char nas_IMEI[14]; -static int m_arg=0; - - -#ifdef PDCP_USE_NETLINK -extern void nasmt_netlink_release(void); -extern int nasmt_netlink_init(void); -#endif -extern void nasmt_ASCTL_timer(unsigned long data); - - -#ifndef PDCP_USE_NETLINK -//--------------------------------------------------------------------------- -//void nasmt_interrupt(void){ -void *nasmt_interrupt(void) -{ - //--------------------------------------------------------------------------- - uint8_t cxi; - char *buffer = NULL; -#ifdef NAS_DEBUG_INTERRUPT - printk("nasmt_interrupt - begin\n"); -#endif - //spin_lock(&gpriv->lock); - cxi=0; - nasmt_COMMON_QOS_receive(gpriv->cx+cxi); - nasmt_ASCTL_GC_receive(buffer); - nasmt_ASCTL_DC_receive(gpriv->cx+cxi, buffer); - //spin_unlock(&gpriv->lock); -#ifdef NAS_DEBUG_INTERRUPT - printk("nasmt_interrupt: end\n"); -#endif -} -#endif //NETLINK - -//--------------------------------------------------------------------------- -// Called by ifconfig when the device is activated by ifconfig -int nasmt_open(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - printk("nasmt_open: begin\n"); - - gpriv=netdev_priv(dev); - - // Address has already been set at init -#ifndef PDCP_USE_NETLINK - - if (gpriv->irq==-EBUSY) { - printk("nasmt_open: irq failure\n"); - return -EBUSY; - } - -#endif //NETLINK - - // next lines prevent compilation of the driver with kernel version under 2.6.29 - // ATTENTION !!!!!! NASMT is not usable with these versions - - if(!netif_queue_stopped(dev)) - netif_start_queue(dev); - else - netif_wake_queue(dev); - - // - init_timer(&gpriv->timer); - (gpriv->timer).expires=jiffies+NAS_TIMER_TICK; - (gpriv->timer).data=0L; - (gpriv->timer).function=nasmt_ASCTL_timer; - // ??LITE comments: add_timer(&gpriv->timer); - add_timer(&gpriv->timer); - // - printk("nasmt_open: name = %s, end\n", dev->name); - return 0; -} - -//--------------------------------------------------------------------------- -// Called by ifconfig when the device is desactivated by ifconfig -int nasmt_stop(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - struct nas_priv *priv = netdev_priv(dev); - printk("nasmt_stop: begin\n"); - del_timer(&priv->timer); - netif_stop_queue(dev); - - printk("nasmt_stop: name = %s, end\n", dev->name); - return 0; -} - -//--------------------------------------------------------------------------- -void nasmt_teardown(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - int cxi; -#ifndef PDCP_USE_NETLINK - struct nas_priv *priv = netdev_priv(dev); -#endif //PDCP_USE_NETLINK - - printk("nasmt_teardown: begin\n"); - // priv=(struct nas_priv *)(gdev.priv); - - if (dev) { -#ifndef PDCP_USE_NETLINK - - if (priv->irq!=-EBUSY) { - *pt_nas_ue_irq=-1; - rt_free_srq(priv->irq); - } - -#endif //PDCP_USE_NETLINK - -#ifdef PDCP_USE_NETLINK - nasmt_netlink_release(); -#endif //PDCP_USE_NETLINK - // for (sapi=0; sapisap[sapi]); - nasmt_CLASS_flush_rclassifier(); - cxi=0; - nasmt_COMMON_flush_rb(gpriv->cx+cxi); - nasmt_CLASS_flush_sclassifier(gpriv->cx+cxi); - // for (sapi=0; sapicx[cxi].sap[sapi]); - } // check dev - else { - printk("nasmt_teardown: Device is null\n"); - } - - printk("nasmt_teardown: end\n"); -} - -//--------------------------------------------------------------------------- -int nasmt_set_config(struct net_device *dev, struct ifmap *map) -{ - //--------------------------------------------------------------------------- - printk("nasmt_set_config: begin\n"); - - if (dev->flags & IFF_UP) - return -EBUSY; - - if (map->base_addr != dev->base_addr) { - printk(KERN_WARNING "nasmt_set_config: Can't change I/O address\n"); - return -EOPNOTSUPP; - } - - if (map->irq != dev->irq) - dev->irq = map->irq; - - printk("nasmt_set_config: end\n"); - return 0; -} - -//--------------------------------------------------------------------------- -// -int nasmt_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_DEVICE - printk("nasmt_hard_start_xmit: begin\n"); -#endif - - if ((!skb)||(!dev)) { - printk("nasmt_hard_start_xmit - input parameter skb or dev is NULL \n"); - return -1; - } - - // End debug information - - netif_stop_queue(dev); - dev->trans_start = jiffies; -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasmt_hard_start_xmit: step 1\n"); -#endif - nasmt_CLASS_send(skb); -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasmt_hard_start_xmit: step 2\n"); -#endif - dev_kfree_skb(skb); -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasmt_hard_start_xmit: step 3\n"); -#endif - netif_wake_queue(dev); -#ifdef NAS_DEBUG_DEVICE - printk("nasmt_hard_start_xmit: end\n"); -#endif - return 0; -} - -//--------------------------------------------------------------------------- -struct net_device_stats *nasmt_get_stats(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - // return &((struct nas_priv *)dev->priv)->stats; - struct nas_priv *npriv = netdev_priv(dev); - return &npriv->stats; -} - -//--------------------------------------------------------------------------- -// New function from LITE DRIVER -int nasmt_set_mac_address(struct net_device *dev, void *mac) -{ - //--------------------------------------------------------------------------- - struct sockaddr *addr = mac; - printk("nasmt_set_mac_address: begin\n"); - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); - return 0; -} - - -//--------------------------------------------------------------------------- -int nasmt_change_mtu(struct net_device *dev, int mtu) -{ - //--------------------------------------------------------------------------- - printk("nasmt_change_mtu: begin\n"); - - if ((mtu<50) || (mtu>1500)) - // if ((mtu<1280) || (mtu>1500)) - return -EINVAL; - - dev->mtu = mtu; - return 0; -} - -//--------------------------------------------------------------------------- -int nasmt_change_rx_flags(struct net_device *dev, int flags) -{ - //--------------------------------------------------------------------------- - //struct nas_priv *priv = netdev_priv(dev); - printk("nasmt_change_rx_flags %08X\n", flags); - gpriv->rx_flags ^= flags; - return 0; -} - -//--------------------------------------------------------------------------- -void nasmt_tx_timeout(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - /* Transmitter timeout, serious problems. */ - printk("nasmt_tx_timeout: begin\n"); - //((struct nas_priv *)(dev->priv))->stats.tx_errors++; - (gpriv->stats).tx_errors++; - dev->trans_start = jiffies; - netif_wake_queue(dev); - printk("nasmt_tx_timeout: transmit timed out %s\n",dev->name); -} - -//--------------------------------------------------------------------------- -// Define pointers for the module -static const struct net_device_ops nasmt_netdev_ops = { - // ?? nasmt_interrupt - // - .ndo_open = nasmt_open, - .ndo_stop = nasmt_stop, - .ndo_start_xmit = nasmt_hard_start_xmit, - .ndo_validate_addr = NULL, - .ndo_get_stats = nasmt_get_stats, - //#ifdef KERNEL_VERSION_GREATER_THAN_32 - // .ndo_set_multicast_list = NULL, - .ndo_set_mac_address = nasmt_set_mac_address, - .ndo_set_config = nasmt_set_config, - .ndo_do_ioctl = nasmt_CTL_ioctl, - .ndo_change_mtu = nasmt_change_mtu, - .ndo_tx_timeout = nasmt_tx_timeout, - .ndo_change_rx_flags = nasmt_change_rx_flags, - //#endif -}; -//--------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// Initialisation of the network device -void nasmt_init(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - uint8_t cxi, dscpi; - - printk("nasmt_init: begin\n"); - - if (dev) { - gpriv=netdev_priv(dev); - memset(gpriv, 0, sizeof(struct nas_priv)); - // Initialize function pointers - dev->netdev_ops = &nasmt_netdev_ops; - -#ifndef NAS_DRIVER_TYPE_ETHERNET - // Update driver properties - dev->type = ARPHRD_EURUMTS; - dev->features = NETIF_F_NO_CSUM; - dev->hard_header_len = 0; - dev->addr_len = NAS_ADDR_LEN; - dev->flags = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP; - dev->tx_queue_len = NAS_TX_QUEUE_LEN; - dev->mtu = NAS_MTU; -#endif - // Can be one of the following enum defined in include/linux/netdevice.h: - // enum netdev_state_t { - // __LINK_STATE_START, - // __LINK_STATE_PRESENT, - // __LINK_STATE_NOCARRIER, - // __LINK_STATE_LINKWATCH_PENDING, - // __LINK_STATE_DORMANT, - // }; - set_bit(__LINK_STATE_PRESENT, &dev->state); - -#ifdef NAS_DRIVER_TYPE_ETHERNET - // overwrite values written above ( header_ops,type,hard_header_len,mtu,addr_len,tx_queue_len,flags,broadcast) - printk("\nnasmt_init: WARNING Driver type ETHERNET\n"); - ether_setup(dev); -#endif - - // - // Initialize private structure - gpriv->rx_flags = NAS_RESET_RX_FLAGS; - - gpriv->sap[NAS_GC_SAPI] = RRC_DEVICE_GC; - gpriv->sap[NAS_NT_SAPI] = RRC_DEVICE_NT; - gpriv->cx[0].sap[NAS_DC_INPUT_SAPI] = RRC_DEVICE_DC_INPUT0; - gpriv->cx[0].sap[NAS_DC_OUTPUT_SAPI] = RRC_DEVICE_DC_OUTPUT0; - - //gpriv->sap[NAS_CO_INPUT_SAPI] = QOS_DEVICE_CONVERSATIONAL_INPUT; - //gpriv->sap[NAS_CO_OUTPUT_SAPI] = QOS_DEVICE_CONVERSATIONAL_OUTPUT; - gpriv->sap[NAS_DRB_INPUT_SAPI] = PDCP2PDCP_USE_RT_FIFO;//QOS_DEVICE_CONVERSATIONAL_INPUT; - gpriv->sap[NAS_DRB_OUTPUT_SAPI] = NAS2PDCP_FIFO;//QOS_DEVICE_STREAMING_INPUT; - - gpriv->retry_limit = NAS_RETRY_LIMIT_DEFAULT; - gpriv->timer_establishment = NAS_TIMER_ESTABLISHMENT_DEFAULT; - gpriv->timer_release = NAS_TIMER_RELEASE_DEFAULT; - - for (dscpi=0; dscpirclassifier[dscpi] = NULL; - - gpriv->nrclassifier = 0; - // - cxi=0; -#ifdef NAS_DEBUG_DEVICE - printk("nasmt_init: init classifiers, state and timer for MT %u\n", cxi); -#endif - gpriv->cx[cxi].state = NAS_IDLE; - gpriv->cx[cxi].countimer = NAS_TIMER_IDLE; - gpriv->cx[cxi].retry = 0; - gpriv->cx[cxi].lcr = cxi; - gpriv->cx[cxi].rb = NULL; - gpriv->cx[cxi].num_rb = 0; - - // initialisation of the classifiers - for (dscpi=0; dscpicx[cxi].sclassifier[dscpi]=NULL; - } - - gpriv->cx[cxi].nsclassifier=0; - // initialisation of the IP address - nasmt_TOOL_imei2iid(NAS_NULL_IMEI, (uint8_t *)gpriv->cx[cxi].iid6); - gpriv->cx[cxi].iid4=0; - // - spin_lock_init(&gpriv->lock); - printk("nasmt_init: init IMEI to IID\n"); - -#ifdef NAS_DRIVER_TYPE_ETHERNET - nasmt_TOOL_eth_imei2iid(nas_IMEI, dev->dev_addr ,(uint8_t *)gpriv->cx[0].iid6, dev->addr_len); -#else - nasmt_TOOL_imei2iid(nas_IMEI, dev->dev_addr);// IMEI to device address (for stateless autoconfiguration address) - nasmt_TOOL_imei2iid(nas_IMEI, (uint8_t *)gpriv->cx[0].iid6); -#endif - - nasmt_ASCTL_init(); - } else { - printk("\n\nnasmt_init: ERROR, Device is NULL!!\n"); - } - - printk("nasmt_init: end\n"); - return; -} - -//--------------------------------------------------------------------------- -int init_module (void) -{ - //--------------------------------------------------------------------------- - int err; - int inst = 0; - int index; - struct nas_priv *priv; - char devicename[100]; - - printk("\n\n\ninit_module: begin \n"); - - // check IMEI parameter - printk("number of IMEI parameters %d, IMEI ", m_arg); - - for (index = 0; index < m_arg; index++) { - printk("%02X ", nas_IMEI[index]); - } - - printk("\n"); - - -#ifndef PDCP_USE_NETLINK - - // Initialize parameters shared with RRC (done first to avoid going further) - if (pt_nas_ue_irq==NULL) { - printk("init_module: shared irq parameter not initialised\n"); - err = -EBUSY; - printk("init_module: returning %d \n\n", err); - return err; - } - - printk("init_module: pt_nas_ue_irq valid \n"); -#endif - - // Allocate device structure - sprintf(devicename,"oai%d",inst); -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0) - gdev = alloc_netdev(sizeof(struct nas_priv), devicename, nasmt_init); -#else - gdev = alloc_netdev(sizeof(struct nas_priv), devicename, NET_NAME_PREDICTABLE, nasmt_init); -#endif - priv = netdev_priv(gdev); - //// -#ifndef PDCP_USE_NETLINK - priv->irq=rt_request_srq(0, nasmt_interrupt, NULL); - - if (priv->irq == -EBUSY || priv->irq == -EINVAL) { - printk("\n init_module: No interrupt resource available\n"); - - if (gdev) { - free_netdev(gdev); - printk("init_module: free_netdev ..\n"); - } - - return -EBUSY; - } else - printk("init_module: Interrupt %d, ret = %d \n", priv->irq , ret); - - if (pt_nas_ue_irq==NULL) { - printk("init_module: shared irq parameter has been reset\n"); - } else { - *pt_nas_ue_irq=priv->irq; - } - -#endif - -#ifdef PDCP_USE_NETLINK - - if ((err=nasmt_netlink_init()) == -1) - printk("init_module: NETLINK failed\n"); - - printk("init_module: NETLINK INIT successful\n"); -#endif //NETLINK - // - err= register_netdev(gdev); - - if (err) { - printk("init_module: error %i registering device %s\n", err, gdev->name); - } else { - printk("init_module: registering device %s, ifindex = %d\n\n",gdev->name, gdev->ifindex); - } - - return err; -} - -//--------------------------------------------------------------------------- -void cleanup_module(void) -{ - //--------------------------------------------------------------------------- - printk("nasmt_cleanup_module: begin\n"); - unregister_netdev(gdev); - nasmt_teardown(gdev); - free_netdev(gdev); - printk("nasmt_cleanup_module: end\n\n\n\n"); -} - -//--------------------------------------------------------------------------- -// Replaced by init_module and cleanup_module -//module_init (nasmt_init_module); -//module_exit (nasmt_cleanup_module); -//--------------------------------------------------------------------------- - -#define DRV_NAME "oai_nasmt" -#define DRV_VERSION "3.0.1"DRV_NAME -#define DRV_DESCRIPTION "OPENAIR CELLULAR LTE NASMT Device Driver" -#define DRV_COPYRIGHT "-Copyright(c) GNU GPL Eurecom 2013" -#define DRV_AUTHOR "Michelle Wetterwald "DRV_COPYRIGHT - -module_param_array_named(nas_IMEI,nas_IMEI,byte,&m_arg,0); -//module_param_array(oai_nw_drv_IMEI,byte,&m_arg,0444); -MODULE_PARM_DESC(nas_IMEI,"Terminal IMEI Identifier (14 digits, only first 10 significant if ETH option ON)"); - - -// MODULE_LICENSE("GPL"); -// MODULE_DESCRIPTION("LTE Driver for Mobile Terminal, playing as Non Access Stratum"); -// MODULE_AUTHOR("Michelle Wetterwald "); - diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c deleted file mode 100755 index fc0d28a278..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.c +++ /dev/null @@ -1,771 +0,0 @@ -/*************************************************************************** - nasmt_iocontrol.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_iocontrol.c -* \brief I/O control functions for upper layers of driver for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#include "nasmt_variables.h" -#include "nasmt_iocontrol.h" -#include "nasmt_proto.h" - -//#include -#include -#include -#include - -extern int nasmt_ASCTL_DC_send_cx_establish_request(struct cx_entity *cx); - -// Statistic -//--------------------------------------------------------------------------- -void nasmt_set_msg_statistic_reply(struct nas_msg_statistic_reply *msgrep) -{ - //--------------------------------------------------------------------------- - msgrep->rx_packets=gpriv->stats.rx_packets; - msgrep->tx_packets=gpriv->stats.tx_packets; - msgrep->rx_bytes=gpriv->stats.rx_bytes; - msgrep->tx_bytes=gpriv->stats.tx_bytes; - msgrep->rx_errors=gpriv->stats.rx_errors; - msgrep->tx_errors=gpriv->stats.tx_errors; - msgrep->rx_dropped=gpriv->stats.rx_dropped; - msgrep->tx_dropped=gpriv->stats.tx_dropped; -} - -//--------------------------------------------------------------------------- -int nasmt_ioCTL_statistic_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_statistic_reply msgrep; - printk("nasmt_ioCTL_statistic: stat requested\n"); - nasmt_set_msg_statistic_reply(&msgrep); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasmt_ioCTL_statistic: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Connections List -//--------------------------------------------------------------------------- -void nasmt_set_msg_cx_list_reply(uint8_t *msgrep) -{ - //--------------------------------------------------------------------------- - struct cx_entity *cx; - nasLocalConnectionRef_t lcr; - struct nas_msg_cx_list_reply *list; - msgrep[0]=NAS_CX_MAX; - list=(struct nas_msg_cx_list_reply *)(msgrep+1); - - for(lcr=0; lcrstate; - list[lcr].cellid=cx->cellid; - list[lcr].iid4=cx->iid4; - list[lcr].iid6[0]=cx->iid6[0]; - list[lcr].iid6[1]=cx->iid6[1]; - list[lcr].num_rb=cx->num_rb; - list[lcr].nsclassifier=cx->nsclassifier; - printk("nasmt_set_msg_cx_list_reply: nsc=%u\n",cx->nsclassifier); - } -} - -//--------------------------------------------------------------------------- -int nasmt_ioCTL_cx_list_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - uint8_t msgrep[NAS_CX_MAX*sizeof(struct nas_msg_cx_list_reply)+1]; - printk("nasmt_ioCTL_cx_list: connection list requested\n"); - nasmt_set_msg_cx_list_reply(msgrep); - - if (copy_to_user(gifr->msg, msgrep, NAS_CX_MAX*sizeof(struct nas_msg_cx_list_reply)+1)) { - printk("nasmt_ioCTL_cx_list: copy_to_user failure\n"); - return -EFAULT; - } - - printk("nasmt_ioCTL_cx_list: end\n"); - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Connection Establishment -//--------------------------------------------------------------------------- -void nasmt_set_msg_cx_establishment_reply(struct nas_msg_cx_establishment_reply *msgrep, struct nas_msg_cx_establishment_request *msgreq) -{ - //--------------------------------------------------------------------------- -#ifdef NODE_RG - msgrep->status=-NAS_ERROR_NOTMT; -#else - struct cx_entity *cx; - cx=nasmt_COMMON_search_cx(msgreq->lcr); - - if (cx!=NULL) { - if (cx->state == NAS_CX_RELEASING) { - msgrep->status=nasmt_ASCTL_leave_sleep_mode(cx); - } else { - cx->cellid=msgreq->cellid; - msgrep->status=nasmt_ASCTL_DC_send_cx_establish_request(cx); - } - } else - msgrep->status=-NAS_ERROR_NOTCORRECTLCR; - -#endif -} -//--------------------------------------------------------------------------- -int nasmt_ioCTL_cx_establishment_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_cx_establishment_request msgreq; - struct nas_msg_cx_establishment_reply msgrep; - printk("nasmt_ioCTL_cx_establishment: connection establishment requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasmt_ioCTL_cx_establishment: copy_from_user failure\n"); - return -EFAULT; - } - - nasmt_set_msg_cx_establishment_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasmt_ioCTL_cx_establishment: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Connection Release -//--------------------------------------------------------------------------- -void nasmt_set_msg_cx_release_reply(struct nas_msg_cx_release_reply *msgrep, struct nas_msg_cx_release_request *msgreq) -{ - //--------------------------------------------------------------------------- -#ifdef NODE_RG - msgrep->status=-NAS_ERROR_NOTMT; -#else - struct cx_entity *cx; - cx=nasmt_COMMON_search_cx(msgreq->lcr); - - if (cx!=NULL) { -#ifdef ENABLE_SLEEP_MODE - msgrep->status=nasmt_ASCTL_enter_sleep_mode(cx); -#endif -#ifndef ENABLE_SLEEP_MODE - msgrep->status=nasmt_ASCTL_DC_send_cx_release_request(cx); -#endif - } else - msgrep->status=-NAS_ERROR_NOTCORRECTLCR; - -#endif -} - -//--------------------------------------------------------------------------- -// Request the release of a connection -int nasmt_ioCTL_cx_release_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_cx_release_request msgreq; - struct nas_msg_cx_release_reply msgrep; - - printk("nasmt_ioCTL_cx_release: connection release requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasmt_ioCTL_cx_release: copy_from_user failure\n"); - return -EFAULT; - } - - nasmt_set_msg_cx_release_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasmt_ioCTL_cx_release: copy_to_user failure\n"); - return -EFAULT; - } - - printk("nasmt_ioCTL_cx_release: end\n"); - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Radio Bearer List -//--------------------------------------------------------------------------- -void nasmt_set_msg_rb_list_reply(uint8_t *msgrep, struct nas_msg_rb_list_request *msgreq) -{ - //--------------------------------------------------------------------------- - struct cx_entity *cx; - cx=nasmt_COMMON_search_cx(msgreq->lcr); - - if (cx!=NULL) { - uint8_t rbi; - struct rb_entity *rb; - struct nas_msg_rb_list_reply *list; - - if (cx->num_rb > NAS_LIST_RB_MAX) - msgrep[0] = NAS_LIST_RB_MAX; - else - msgrep[0] = cx->num_rb; - - list=(struct nas_msg_rb_list_reply *)(msgrep+1); - - for (rb=cx->rb, rbi=0; (rb!=NULL)&&(rbinext, ++rbi) { - list[rbi].state=rb->state; - list[rbi].rab_id=rb->rab_id; - list[rbi].sapi=rb->sapi; - list[rbi].qos=rb->qos; - } - } else - msgrep[0]=0; -} - -//--------------------------------------------------------------------------- -int nasmt_ioCTL_rb_list_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - uint8_t msgrep[NAS_LIST_RB_MAX*sizeof(struct nas_msg_rb_list_reply)+1]; - struct nas_msg_rb_list_request msgreq; - printk("nasmt_ioCTL_rb_list: Radio Bearer list requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasmt_ioCTL_rb_list: copy_from_user failure\n"); - return -EFAULT; - } - - nasmt_set_msg_rb_list_reply(msgrep, &msgreq); - - if (copy_to_user(gifr->msg, msgrep, NAS_LIST_RB_MAX*sizeof(struct nas_msg_rb_list_reply)+1)) { - printk("nasmt_ioCTL_rb_list: copy_to_user failure\n"); - return -EFAULT; - } - - printk("nasmt_ioCTL_rb_list: end\n"); - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Radio Bearer Establishment -//--------------------------------------------------------------------------- -void nasmt_set_msg_rb_establishment_reply(struct nas_msg_rb_establishment_reply *msgrep, struct nas_msg_rb_establishment_request *msgreq) -{ - //--------------------------------------------------------------------------- - msgrep->status=-NAS_ERROR_NOTRG; -} - -//--------------------------------------------------------------------------- -int nasmt_ioCTL_rb_establishment_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_rb_establishment_request msgreq; - struct nas_msg_rb_establishment_reply msgrep; - printk("nasmt_ioCTL_rb_establishment: Radio bearer establishment requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasmt_ioCTL_rb_establishment: copy_from_user failure\n"); - return -EFAULT; - } - - nasmt_set_msg_rb_establishment_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasmt_ioCTL_rb_establishment: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Radio Bearer Release -//--------------------------------------------------------------------------- -void nasmt_set_msg_rb_release_reply(struct nas_msg_rb_release_reply *msgrep, struct nas_msg_rb_release_request *msgreq) -{ - //--------------------------------------------------------------------------- - msgrep->status=-NAS_ERROR_NOTRG; -} - -//--------------------------------------------------------------------------- -int nasmt_ioCTL_rb_release_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_rb_release_request msgreq; - struct nas_msg_rb_release_reply msgrep; - printk("nasmt_ioCTL_rb_release: Radio bearer release requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasmt_ioCTL_rb_release: copy_from_user failure\n"); - return -EFAULT; - } - - nasmt_set_msg_rb_release_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasmt_ioCTL_rb_release: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Classifier List -//--------------------------------------------------------------------------- -void nasmt_set_msg_class_list_reply(uint8_t *msgrep, struct nas_msg_class_list_request *msgreq) -{ - //--------------------------------------------------------------------------- - struct cx_entity *cx; - struct classifier_entity *gc; - struct nas_msg_class_list_reply *list; - uint8_t cli; - list=(struct nas_msg_class_list_reply *)(msgrep+1); - - switch(msgreq->dir) { - case NAS_DIRECTION_SEND: - cx=nasmt_COMMON_search_cx(msgreq->lcr); - - if (cx==NULL) { - msgrep[0]=0; - return; - } - - gc=cx->sclassifier[msgreq->dscp]; - break; - - case NAS_DIRECTION_RECEIVE: - cx=NULL; - gc=gpriv->rclassifier[msgreq->dscp]; - break; - - default: - cx=NULL; - msgrep[0]=0; - return; - } - - for (cli=0; (gc!=NULL)&&(clinext, ++cli) { - list[cli].classref=gc->classref; - list[cli].lcr=msgreq->lcr; - list[cli].dir=msgreq->dir; - list[cli].dscp=msgreq->dscp; - list[cli].rab_id=gc->rab_id; - list[cli].version=gc->version; - - switch(gc->version) { - case 4: - list[cli].saddr.ipv4 = gc->saddr.ipv4; - list[cli].daddr.ipv4 = gc->daddr.ipv4; - break; - - case 6: - list[cli].saddr.ipv6 = gc->saddr.ipv6; - list[cli].daddr.ipv6 = gc->daddr.ipv6; - break; - } - - list[cli].protocol=gc->protocol; - list[cli].sport=ntohs(gc->sport); - list[cli].dport=ntohs(gc->dport); - list[cli].splen=gc->splen; - list[cli].dplen=gc->dplen; - list[cli].fct=nasmt_TOOL_invfct(gc); - } - - msgrep[0]=cli; -} - -//--------------------------------------------------------------------------- -int nasmt_ioCTL_class_list_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - uint8_t msgrep[NAS_LIST_CLASS_MAX*sizeof(struct nas_msg_class_list_reply)+1]; - struct nas_msg_class_list_request msgreq; - printk("nasmt_ioCTL_class_list: classifier list requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasmt_ioCTL_class_list: copy_from_user failure\n"); - return -EFAULT; - } - - nasmt_set_msg_class_list_reply(msgrep, &msgreq); - - if (copy_to_user(gifr->msg, msgrep, NAS_LIST_CLASS_MAX*sizeof(struct nas_msg_class_list_reply)+1)) { - printk("nasmt_ioCTL_class_list: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Request the addition of a classifier rule -//--------------------------------------------------------------------------- -void nasmt_set_msg_class_add_reply(struct nas_msg_class_add_reply *msgrep, struct nas_msg_class_add_request *msgreq) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - - if (msgreq->dscp>NAS_DSCP_DEFAULT) { - printk("nasmt_set_msg_class_add_reply: Incoherent parameter value\n"); - msgrep->status=-NAS_ERROR_NOTCORRECTDSCP; - return; - } - - if (msgreq->dir==NAS_DIRECTION_SEND) { - struct cx_entity *cx; - cx=nasmt_COMMON_search_cx(msgreq->lcr); - - if (cx!=NULL) { - printk("nasmt_set_msg_class_add_reply: DSCP %d, Classref %d\n",msgreq->dscp, msgreq->classref ); - gc=nasmt_CLASS_add_sclassifier(cx, msgreq->dscp, msgreq->classref); - printk("nasmt_set_msg_class_add_reply: %p %p\n" , msgreq, gc); - - if (gc==NULL) { - msgrep->status=-NAS_ERROR_NOMEMORY; - return; - } - } else { - msgrep->status=-NAS_ERROR_NOTCORRECTLCR; - return; - } - - gc->rab_id=msgreq->rab_id; - gc->rb=nasmt_COMMON_search_rb(cx, gc->rab_id); - } else { - if (msgreq->dir==NAS_DIRECTION_RECEIVE) { - gc=nasmt_CLASS_add_rclassifier(msgreq->dscp, msgreq->classref); - - if (gc==NULL) { - msgrep->status=-NAS_ERROR_NOMEMORY; - return; - } - } else { - msgrep->status=-NAS_ERROR_NOTCORRECTDIR; - return; - } - } - - nasmt_TOOL_fct(gc, msgreq->fct); - gc->version=msgreq->version; - - switch(gc->version) { - case 4: - gc->saddr.ipv4=msgreq->saddr.ipv4; - gc->daddr.ipv4=msgreq->daddr.ipv4; - gc->splen=msgreq->splen; - gc->dplen=msgreq->dplen; - break; - - case 6: - gc->saddr.ipv6=msgreq->saddr.ipv6; - gc->daddr.ipv6=msgreq->daddr.ipv6; - gc->splen=msgreq->splen; - gc->dplen=msgreq->dplen; - break; - - case 0: - gc->saddr.ipv6.s6_addr32[0]=0; - gc->daddr.ipv6.s6_addr32[1]=0; - gc->saddr.ipv6.s6_addr32[2]=0; - gc->daddr.ipv6.s6_addr32[3]=0; - gc->splen=0; - gc->dplen=0; - break; - - default: - msgrep->status=-NAS_ERROR_NOTCORRECTVERSION; - kfree(gc); - return; - } - - gc->protocol=msgreq->protocol; - gc->sport=htons(msgreq->sport); - gc->dport=htons(msgreq->dport); - msgrep->status=0; -} - -//--------------------------------------------------------------------------- -int nasmt_ioCTL_class_add_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_class_add_request msgreq; - struct nas_msg_class_add_reply msgrep; - printk("nasmt_ioCTL_class_add: Add classifier components requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasmt_ioCTL_class_add: copy_from_user failure\n"); - return -EFAULT; - } - - nasmt_set_msg_class_add_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasmt_ioCTL_class_add: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Request the deletion of a classifier rule -//--------------------------------------------------------------------------- -void nasmt_set_msg_class_del_reply(struct nas_msg_class_del_reply *msgrep, struct nas_msg_class_del_request *msgreq) -{ - //--------------------------------------------------------------------------- - if (msgreq->dscp>NAS_DSCP_DEFAULT) { - printk("nasmt_set_msg_class_del_reply: Incoherent parameter value\n"); - msgrep->status=-NAS_ERROR_NOTCORRECTDSCP; - return; - } - - if (msgreq->dir==NAS_DIRECTION_SEND) { - struct cx_entity *cx; - cx=nasmt_COMMON_search_cx(msgreq->lcr); - - if (cx!=NULL) - nasmt_CLASS_del_sclassifier(cx, msgreq->dscp, msgreq->classref); - else { - msgrep->status=-NAS_ERROR_NOTCORRECTLCR; - return; - } - } else { - if (msgreq->dir==NAS_DIRECTION_RECEIVE) - nasmt_CLASS_del_rclassifier(msgreq->dscp, msgreq->classref); - else { - msgrep->status=-NAS_ERROR_NOTCORRECTDIR; - return; - } - } - - msgrep->status=0; -} - -//--------------------------------------------------------------------------- -int nasmt_ioCTL_class_del_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_class_del_request msgreq; - struct nas_msg_class_del_reply msgrep; - printk("nasmt_ioCTL_class_del: Del classifier components requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasmt_ioCTL_class_del: copy_from_user failure\n"); - return -EFAULT; - } - - nasmt_set_msg_class_del_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasmt_ioCTL_class_del: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Measurement -// Messages for Measurement transfer - -//--------------------------------------------------------------------------- -void nasmt_set_msg_measure_reply(struct nas_msg_measure_reply *msgrep, struct nas_msg_measure_request *msgreq) -{ - //--------------------------------------------------------------------------- - struct cx_entity *cx; - int lcr=0; // Temp lcr->mt =0 - int i; - - cx = nasmt_COMMON_search_cx(lcr); - - if (cx!=NULL) { - msgrep->num_cells = cx->num_measures; - - for (i=0; inum_measures; i++) { - msgrep-> measures[i].cell_id = cx->meas_cell_id[i]; - msgrep-> measures[i].level = cx->meas_level[i]; - msgrep-> measures[i].provider_id = cx->provider_id[i]; - } - - msgrep->signal_lost_flag = 0; - } else { - // msgrep->status=-NAS_ERROR_NOTCORRECTLCR; - // return; - } -} -//--------------------------------------------------------------------------- -int nasmt_ioCTL_measure_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_measure_request msgreq; - struct nas_msg_measure_reply msgrep; - printk("nasmt_ioCTL_measure: Measurement requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasmt_ioCTL_measure: copy_from_user failure\n"); - return -EFAULT; - } - - nasmt_set_msg_measure_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasmt_ioCTL_measure: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// IMEI -// Messages for IMEI transfer -//--------------------------------------------------------------------------- -void nasmt_set_msg_imei_reply(struct nas_msg_l2id_reply *msgrep) -{ - //--------------------------------------------------------------------------- - struct cx_entity *cx; - int lcr=0; // Temp lcr->mt =0 - int i; - - cx=nasmt_COMMON_search_cx(lcr); - - if (cx!=NULL) { - msgrep->l2id[0] = cx->iid6[0]; - msgrep->l2id[1] = cx->iid6[1]; - } else { - // msgrep->status=-NAS_ERROR_NOTCORRECTLCR; - // return; - } -} -//--------------------------------------------------------------------------- -int nasmt_ioCTL_imei_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_l2id_reply msgrep; - printk("nasmt_ioCTL_imei: IMEI requested\n"); - nasmt_set_msg_imei_reply(&msgrep); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasmt_ioCTL_imei: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// IOCTL command -//--------------------------------------------------------------------------- -int nasmt_CTL_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -{ - //--------------------------------------------------------------------------- - struct nas_ioctl *gifr; - int r; - printk("nasmt_CTL_ioctl: begin\n"); - - //spin_lock(&gpriv->lock); - switch(cmd) { - case NASMT_IOCTL_RAL: - gifr=(struct nas_ioctl *)ifr; - - switch(gifr->type) { - case NAS_MSG_STATISTIC_REQUEST: - r=nasmt_ioCTL_statistic_request(gifr); - break; - - case NAS_MSG_CX_ESTABLISHMENT_REQUEST: - r=nasmt_ioCTL_cx_establishment_request(gifr); - break; - - case NAS_MSG_CX_RELEASE_REQUEST: - r=nasmt_ioCTL_cx_release_request(gifr); - break; - - case NAS_MSG_CX_LIST_REQUEST: - r=nasmt_ioCTL_cx_list_request(gifr); - break; - - case NAS_MSG_RB_ESTABLISHMENT_REQUEST: - r=nasmt_ioCTL_rb_establishment_request(gifr); - break; - - case NAS_MSG_RB_RELEASE_REQUEST: - r= nasmt_ioCTL_rb_release_request(gifr); - break; - - case NAS_MSG_RB_LIST_REQUEST: - r=nasmt_ioCTL_rb_list_request(gifr); - break; - - case NAS_MSG_CLASS_ADD_REQUEST: - r=nasmt_ioCTL_class_add_request(gifr); - break; - - case NAS_MSG_CLASS_LIST_REQUEST: - r=nasmt_ioCTL_class_list_request(gifr); - break; - - case NAS_MSG_CLASS_DEL_REQUEST: - r=nasmt_ioCTL_class_del_request(gifr); - break; - - case NAS_MSG_MEAS_REQUEST: - r=nasmt_ioCTL_measure_request(gifr); - break; - - case NAS_MSG_IMEI_REQUEST: - r=nasmt_ioCTL_imei_request(gifr); - break; - - default: - printk("nasmt_CTL_ioctl: unkwon request type, type=%x\n", gifr->type); - r=-EFAULT; - } - - break; - - default: - printk("nasmt_CTL_ioctl: Unknown ioctl command, cmd=%x\n", cmd); - r=-EFAULT; - } - - //spin_unlock(&gpriv->lock); - printk("nasmt_CTL_ioctl: end\n"); - return r; -} - -//--------------------------------------------------------------------------- -void nasmt_CTL_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc) -{ - //--------------------------------------------------------------------------- - printk("nasmt_CTL_send - void \n"); -} - diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h deleted file mode 100755 index ac682163f8..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_iocontrol.h +++ /dev/null @@ -1,218 +0,0 @@ -/*************************************************************************** - nasmt_iocontrol.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_iocontrol.h -* \brief I/O control constnats and structures for upper layers of driver for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef NASMTD_CTL_H -#define NASMTD_CTL_H - -#include -#include -#include -#include - -#define NAS_MSG_MAXLEN 1100 - -// type of CTL message -#define NAS_MSG_STATISTIC_REQUEST 1 -#define NAS_MSG_STATISTIC_REPLY 2 -#define NAS_MSG_ECHO_REQUEST 3 -#define NAS_MSG_ECHO_REPLY 4 -#define NAS_MSG_CX_ESTABLISHMENT_REQUEST 5 -#define NAS_MSG_CX_ESTABLISHMENT_REPLY 6 -#define NAS_MSG_CX_RELEASE_REQUEST 7 -#define NAS_MSG_CX_RELEASE_REPLY 8 -#define NAS_MSG_CX_LIST_REQUEST 9 -#define NAS_MSG_CX_LIST_REPLY 10 -#define NAS_MSG_RB_ESTABLISHMENT_REQUEST 11 -#define NAS_MSG_RB_ESTABLISHMENT_REPLY 12 -#define NAS_MSG_RB_RELEASE_REQUEST 13 -#define NAS_MSG_RB_RELEASE_REPLY 14 -#define NAS_MSG_RB_LIST_REQUEST 15 -#define NAS_MSG_RB_LIST_REPLY 16 -#define NAS_MSG_CLASS_ADD_REQUEST 17 -#define NAS_MSG_CLASS_ADD_REPLY 18 -#define NAS_MSG_CLASS_DEL_REQUEST 19 -#define NAS_MSG_CLASS_DEL_REPLY 20 -#define NAS_MSG_CLASS_LIST_REQUEST 21 -#define NAS_MSG_CLASS_LIST_REPLY 22 -#define NAS_MSG_MEAS_REQUEST 23 -#define NAS_MSG_MEAS_REPLY 24 -#define NAS_MSG_IMEI_REQUEST 25 -#define NAS_MSG_IMEI_REPLY 26 - -// Max number of entry of a message list -#define NAS_LIST_CX_MAX 32 -#define NAS_LIST_RB_MAX 32 -#define NAS_LIST_CLASS_MAX 32 - -typedef uint16_t nasMsgType_t; - -struct nas_ioctl { - char name[IFNAMSIZ]; - nasMsgType_t type; - char *msg; -}; - -struct nas_msg_statistic_reply { - uint32_t rx_packets; - uint32_t tx_packets; - uint32_t rx_bytes; - uint32_t tx_bytes; - uint32_t rx_errors; - uint32_t tx_errors; - uint32_t rx_dropped; - uint32_t tx_dropped; -}; - -struct nas_msg_cx_list_reply { - nasLocalConnectionRef_t lcr; // Local Connection reference - uint8_t state; - nasCellID_t cellid; // cell identification - uint32_t iid6[2]; // IPv6 interface identification - uint8_t iid4; // IPv4 interface identification - uint16_t num_rb; - uint16_t nsclassifier; -}; -struct nas_msg_cx_establishment_reply { - int status; -}; -struct nas_msg_cx_establishment_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - nasCellID_t cellid; // Cell identification -}; -struct nas_msg_cx_release_reply { - int status; -}; -struct nas_msg_cx_release_request { - nasLocalConnectionRef_t lcr; // Local Connection reference -}; - -struct nas_msg_rb_list_reply { - nasRadioBearerId_t rab_id; - nasSapId_t sapi; - nasQoSTrafficClass_t qos; - uint8_t state; -}; -struct nas_msg_rb_list_request { - nasLocalConnectionRef_t lcr; // Local Connection reference -}; -struct nas_msg_rb_establishment_reply { - int status; -}; -struct nas_msg_rb_establishment_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - nasRadioBearerId_t rab_id; - nasQoSTrafficClass_t qos; -}; - -struct nas_msg_rb_release_reply { - int status; -}; -struct nas_msg_rb_release_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - nasRadioBearerId_t rab_id; -}; - -struct nas_msg_class_add_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - nasRadioBearerId_t rab_id; - uint8_t dir; // direction (send or receive) - uint8_t dscp; // codepoint - uint8_t fct; - uint16_t classref; - uint8_t version; - union { - struct in6_addr ipv6; - uint32_t ipv4; - } saddr; // IP source address - uint8_t splen; // prefix length - union { - struct in6_addr ipv6; - uint32_t ipv4; - } daddr; // IP destination address - uint8_t dplen; // prefix length - uint8_t protocol; // high layer protocol type - uint16_t sport; // source port - uint16_t dport; // destination port -}; -struct nas_msg_class_add_reply { - int status; -}; -struct nas_msg_class_del_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - uint8_t dir; // direction (send or receive) - uint8_t dscp; // codepoint - uint16_t classref; -}; -struct nas_msg_class_del_reply { - int status; -}; -#define nas_msg_class_list_reply nas_msg_class_add_request -struct nas_msg_class_list_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - uint8_t dir; - uint8_t dscp; -}; - - -// Messages for Measurement transfer - MW 01/04/2005 -typedef uint32_t nioctlProviderId_t; -typedef uint16_t nioctlSignalLoss_t; -typedef struct nioctlMeasures { - nasCellID_t cell_id; - nasSigLevel_t level; - nioctlProviderId_t provider_id; -} nioctlMeasures_t; - -struct nas_msg_measure_request { - nasNumRGsMeas_t num_cells; - nasCellID_t cellid[MAX_MEASURE_NB]; // Cell identification - uint16_t num_providers; - nioctlProviderId_t provider_id[MAX_MEASURE_NB]; // Provider identification -}; -struct nas_msg_measure_reply { - nasNumRGsMeas_t num_cells; - nioctlMeasures_t measures[MAX_MEASURE_NB]; - nioctlSignalLoss_t signal_lost_flag; -}; - -// Messages for L2Id transfer - MW -typedef uint32_t nioctlL2Id_t[2]; - -struct nas_msg_l2id_reply { - nioctlL2Id_t l2id; -}; - - -#endif diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c deleted file mode 100755 index 17e94bb3c0..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_netlink.c +++ /dev/null @@ -1,241 +0,0 @@ -/*************************************************************************** - nasmt_netlink.c - description - ------------------- - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_netlink.c -* \brief Netlink socket functions for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -//#include -#include -#include -#include -#include -#include -#include - -#include - -#include "nasmt_variables.h" -#include "nasmt_proto.h" - -static struct sock *nas_nl_sk = NULL; -static struct sock *nas_rrcnl_sk = NULL; - -//static int exit_netlink_thread=0; -static DEFINE_MUTEX(nasmt_mutex); - -// This can also be implemented using thread to get the data from PDCP without blocking. -//--------------------------------------------------------------------------- -// Function for transfer with PDCP (from NASLITE) -static void nasmt_nl_data_ready (struct sk_buff *skb) -{ - //--------------------------------------------------------------------------- - struct nlmsghdr *nlh = NULL; - - // Start debug information -#ifdef NETLINK_DEBUG - printk("nasmt_nl_data_ready - begin \n"); -#endif - - if (!skb) { - printk("nasmt_nl_data_ready - input parameter skb is NULL \n"); - return; - } - - // End debug information - -#ifdef NETLINK_DEBUG - printk("nasmt_nl_data_ready - Received socket from PDCP\n"); -#endif //NETLINK_DEBUG - nlh = (struct nlmsghdr *)skb->data; - nasmt_COMMON_QOS_receive(nlh); -} - -//--------------------------------------------------------------------------- -// Function for transfer with RRC -static void nasmt_rrcnl_data_ready (struct sk_buff *skb) -{ - //--------------------------------------------------------------------------- - struct nlmsghdr *nlh = NULL; - char target_sap; - uint8_t cxi = 0; - - // Start debug information -#ifdef NAS_DEBUG_RRCNL - printk("nasmt_rrcnl_data_ready - begin \n"); -#endif - - if (!skb) { - printk("nasmt_rrcnl_data_ready - input parameter skb is NULL \n"); - return; - } - - // End debug information - - nlh = (struct nlmsghdr *)skb->data; - //pdcph = (struct pdcp_data_ind_header_t *)NLMSG_DATA(nlh); - //nasmt_TOOL_print_buffer((char *)NLMSG_DATA(nlh), 48); - - target_sap = ((char*)NLMSG_DATA(nlh))[0]; -#ifdef NAS_DEBUG_RRCNL - printk("nasmt_rrcnl_data_ready - Received on socket from RRC, SAP %d\n", target_sap); -#endif //NAS_DEBUG_RRCNL - - switch (target_sap) { - case RRC_NAS_GC_OUT: - //printk("nasmt_rrcnl_data_ready - Calling nasmt_ASCTL_GC_receive\n"); - nasmt_ASCTL_GC_receive(&((char*)NLMSG_DATA(nlh))[1]); - break; - - case RRC_NAS_DC0_OUT: - //printk("nasmt_rrcnl_data_ready - Calling nasmt_ASCTL_DC_receive\n"); - nasmt_ASCTL_DC_receive(gpriv->cx+cxi, &((char*)NLMSG_DATA(nlh))[1]); - break; - - default: - printk("nasmt_rrcnl_data_ready - Invalid SAP value received\n"); - } - -} - -//--------------------------------------------------------------------------- -int nasmt_netlink_init(void) -{ - //--------------------------------------------------------------------------- - printk("nasmt_netlink_init - begin \n"); - - nas_nl_sk = netlink_kernel_create(&init_net,OAI_IP_DRIVER_NETLINK_ID, 0, nasmt_nl_data_ready, - &nasmt_mutex, // NULL - THIS_MODULE); - - if (!nas_nl_sk) { - printk("nasmt_netlink_init - netlink_kernel_create failed for PDCP socket\n"); - return(-1); - } - - nas_rrcnl_sk = netlink_kernel_create(&init_net,NAS_RRCNL_ID, 0, nasmt_rrcnl_data_ready, - &nasmt_mutex, // NULL - THIS_MODULE); - - if (!nas_rrcnl_sk) { - printk("nasmt_rrcnl_init - netlink_kernel_create failed for RRC socket\n"); - return(-1); - } - - return(0); -} - -//--------------------------------------------------------------------------- -void nasmt_netlink_release(void) -{ - //--------------------------------------------------------------------------- - printk("nasmt_netlink_release - begin \n"); - - //exit_netlink_thread=1; - printk("nasmt_netlink_release - Releasing netlink sockets\n"); - - if(nas_nl_sk) { - netlink_kernel_release(nas_nl_sk); - } - - if(nas_rrcnl_sk) { - netlink_kernel_release(nas_rrcnl_sk); - } - -} - -//--------------------------------------------------------------------------- -int nasmt_netlink_send(unsigned char *data_buffer, unsigned int data_length, int destination) -{ - //--------------------------------------------------------------------------- - struct sk_buff *nl_skb; - struct nlmsghdr *nlh; - int status; - // Start debug information -#ifdef NETLINK_DEBUG - printk("nasmt_netlink_send - begin \n"); -#endif - - if (!data_buffer) { - printk("nasmt_netlink_send - ERROR - input parameter data is NULL \n"); - return(0); - } - - if (!nas_nl_sk || !nas_rrcnl_sk) { - printk("nasmt_netlink_send - ERROR - socket is NULL\n"); - return(0); - } - - // End debug information - - nl_skb = alloc_skb(NLMSG_SPACE(data_length),GFP_ATOMIC); - - if (!nl_skb) { - printk("nasmt_netlink_send - ERROR - could not allocate skbuffer\n"); - return(0); - } - - nlh = (struct nlmsghdr *)nl_skb->data; - - // printk("nasmt_netlink_send Sending %d bytes (%d)\n",data_length,NLMSG_SPACE(data_length)); - skb_put(nl_skb, NLMSG_SPACE(data_length)); - memcpy(NLMSG_DATA(nlh), data_buffer, data_length); - nlh->nlmsg_len = NLMSG_SPACE(data_length); - - nlh->nlmsg_pid = 0; /* from kernel */ - NETLINK_CB(nl_skb).pid = 0; - - // destination 0 = PDCP, 1 = RRC - if (!destination) { -#ifdef NETLINK_DEBUG - printk("nasmt_netlink_send - nl_skb %p, nl_sk %p, nlh %p, nlh->nlmsg_len %d\n", nl_skb, nas_nl_sk, nlh, nlh->nlmsg_len); -#endif //DEBUG_NETLINK - status = netlink_unicast(nas_nl_sk, nl_skb, NL_DEST_PID, MSG_DONTWAIT); - } else { -#ifdef NAS_DEBUG_RRCNL - printk("nasmt_rrcnl_send - nl_skb %p, nas_rrcnl_sk %p, nlh %p, nlh->nlmsg_len %d\n", nl_skb, nas_rrcnl_sk, nlh, nlh->nlmsg_len); -#endif //NAS_DEBUG_RRCNL - status = netlink_unicast(nas_rrcnl_sk, nl_skb, NL_DEST_RRC_PID, MSG_DONTWAIT); - } - - if (status < 0) { - printk("nasmt_netlink_send - SEND status is %d\n",status); - return(0); - } else { -#ifdef NETLINK_DEBUG - printk("nasmt_netlink_send - SEND status is %d, data_length %d\n",status, data_length); -#endif - return data_length; - } -} - - diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h deleted file mode 100755 index cabc515034..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_proto.h +++ /dev/null @@ -1,129 +0,0 @@ -/*************************************************************************** - nasmt_proto.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_proto.h -* \brief Function prototypes for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef _NASMTD_PROTO_H -#define _NASMTD_PROTO_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include - -//#include "rrc_nas_primitives.h" -//#include "protocol_vars_extern.h" -//#include "as_sap.h" -//#include "rrc_qos.h" -//#include "rrc_sap.h" - -// nasmt_netlink.c -void nasmt_netlink_release(void); -int nasmt_netlink_init(void); -int nasmt_netlink_send(unsigned char *data_buffer, unsigned int data_length, int destination); - -// nasmt_common.c -//void nasmt_COMMON_receive(uint16_t hlen, uint16_t dlength, int sap); -void nasmt_COMMON_receive(uint16_t bytes_read, uint16_t payload_length, void *data_buffer, int rb_id, int sap); - -void nasmt_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc); -void nasmt_COMMON_del_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc); -#ifndef PDCP_USE_NETLINK -void nasmt_COMMON_QOS_receive(struct cx_entity *cx); -#else -void nasmt_COMMON_QOS_receive(struct nlmsghdr *nlh); -#endif -struct rb_entity *nasmt_COMMON_add_rb(struct cx_entity *cx, nasRadioBearerId_t rabi, nasQoSTrafficClass_t qos); -struct rb_entity *nasmt_COMMON_search_rb(struct cx_entity *cx, nasRadioBearerId_t rabi); -struct cx_entity *nasmt_COMMON_search_cx(nasLocalConnectionRef_t lcr); -void nasmt_COMMON_del_rb(struct cx_entity *cx, nasRadioBearerId_t rab_id, nasIPdscp_t dscp); -void nasmt_COMMON_flush_rb(struct cx_entity *cx); - - -//nasmt_ascontrol.c -void nasmt_ASCTL_init(void); -void nasmt_ASCTL_timer(unsigned long data); -int nasmt_ASCTL_DC_receive(struct cx_entity *cx, char *buffer); -int nasmt_ASCTL_GC_receive(char *buffer); -int nasmt_ASCTL_DC_send_cx_establish_request(struct cx_entity *cx); -int nasmt_ASCTL_DC_send_cx_release_request(struct cx_entity *cx); -void nasmt_ASCTL_DC_send_sig_data_request(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc); -void nasmt_ASCTL_DC_send_peer_sig_data_request(struct cx_entity *cx, uint8_t sig_category); -int nasmt_ASCTL_leave_sleep_mode(struct cx_entity *cx); -int nasmt_ASCTL_enter_sleep_mode(struct cx_entity *cx); - -// nasmt_iocontrol.c -void nasmt_CTL_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc); -int nasmt_CTL_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); - -// nasmt_classifier.c -void nasmt_CLASS_send(struct sk_buff *skb); -struct classifier_entity *nasmt_CLASS_add_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref); -struct classifier_entity *nasmt_CLASS_add_rclassifier(uint8_t dscp, uint16_t classref); -void nasmt_CLASS_del_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref); -void nasmt_CLASS_del_rclassifier(uint8_t dscp, uint16_t classref); -void nasmt_CLASS_flush_sclassifier(struct cx_entity *cx); -void nasmt_CLASS_flush_rclassifier(void); - -// nasmt_tool.c -uint8_t nasmt_TOOL_invfct(struct classifier_entity *gc); -void nasmt_TOOL_fct(struct classifier_entity *gc, uint8_t fct); -void nasmt_TOOL_imei2iid(uint8_t *imei, uint8_t *iid); - -void nasmt_TOOL_eth_imei2iid(unsigned char *imei, unsigned char *addr ,unsigned char *iid, unsigned char len); -uint8_t nasmt_TOOL_get_dscp6(struct ipv6hdr *iph); -uint8_t nasmt_TOOL_get_dscp4(struct iphdr *iph); -uint8_t *nasmt_TOOL_get_protocol6(struct ipv6hdr *iph, uint8_t *protocol); -uint8_t *nasmt_TOOL_get_protocol4(struct iphdr *iph, uint8_t *protocol); - -void nasmt_TOOL_pk_icmp6(struct icmp6hdr *icmph); - -void nasmt_TOOL_print_state(uint8_t state); -void nasmt_TOOL_print_buffer(unsigned char * buffer,int length); -void nasmt_TOOL_print_rb_entity(struct rb_entity *rb); -void nasmt_TOOL_print_classifier(struct classifier_entity *gc); - -#endif diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h deleted file mode 100755 index a9af1ca4ca..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_sap.h +++ /dev/null @@ -1,80 +0,0 @@ -/*************************************************************************** - nasmt_sap.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_sap.h -* \brief SAP constants for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef _NASMTD_SAP_H -#define _NASMTD_SAP_H - -// RT-FIFO identifiers ** must be identical to Access Stratum as_sap.h and rrc_sap.h -#define RRC_DEVICE_GC RRC_SAPI_UE_GCSAP -#define RRC_DEVICE_NT RRC_SAPI_UE_NTSAP -#define RRC_DEVICE_DC_INPUT0 RRC_SAPI_UE_DCSAP_IN -#define RRC_DEVICE_DC_OUTPUT0 RRC_SAPI_UE_DCSAP_OUT - -//#define QOS_DEVICE_CONVERSATIONAL_INPUT QOS_SAPI_CONVERSATIONAL_INPUT_MT -//#define QOS_DEVICE_CONVERSATIONAL_OUTPUT QOS_SAPI_CONVERSATIONAL_OUTPUT_MT - -#define PDCP2PDCP_USE_RT_FIFO 21 -#define NAS2PDCP_FIFO 22 - -//FIFO indexes in control blocks -#define NAS_DC_INPUT_SAPI 0 -#define NAS_DC_OUTPUT_SAPI 1 -#define NAS_SAPI_CX_MAX 2 - -#define NAS_GC_SAPI 0 -#define NAS_NT_SAPI 1 -#define NAS_DRB_INPUT_SAPI 2 //NAS_CO_INPUT_SAPI -#define NAS_DRB_OUTPUT_SAPI 3 //NAS_CO_OUTPUT_SAPI -#define NAS_SAPI_MAX 4 - -//#define NAS_QOS_CONVERSATIONAL UMTS_TRAFFIC_CONVERSATIONAL -// - -/* Defined in RRC -#define RRC_NAS_GC_IN 0 -#define RRC_NAS_GC_OUT 1 -#define RRC_NAS_NT_IN 2 -#define RRC_NAS_NT_OUT 3 -#define RRC_NAS_DC0_IN 4 -#define RRC_NAS_DC0_OUT 5 -#define RRC_NAS_DC1_IN 6 -#define RRC_NAS_DC1_OUT 7 -#define RRC_NAS_DC2_IN 8 -#define RRC_NAS_DC2_OUT 9 -*/ -#endif - - - diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c deleted file mode 100755 index 1b64b83dca..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_tool.c +++ /dev/null @@ -1,499 +0,0 @@ -/*************************************************************************** - nasmt_tool.c - description - *************************************************************************** - - ***************************************************************************/ -/******************************************************************************* - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_tool.c -* \brief Tool functions for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ - -#include "nasmt_variables.h" -#include "nasmt_proto.h" - -//--------------------------------------------------------------------------- -// -void nasmt_TOOL_fct(struct classifier_entity *gc, uint8_t fct) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasmt_TOOL_fct - begin \n"); -#endif - - if (gc==NULL) { - printk("nasmt_TOOL_fct - input parameter gc is NULL \n"); - return; - } - - // End debug information - switch(fct) { - case NAS_FCT_QOS_SEND: - gc->fct=nasmt_COMMON_QOS_send; - break; - - case NAS_FCT_CTL_SEND: - gc->fct=nasmt_CTL_send; - break; - - case NAS_FCT_DC_SEND: - gc->fct=nasmt_ASCTL_DC_send_sig_data_request; - break; - - case NAS_FCT_DEL_SEND: - gc->fct=nasmt_COMMON_del_send; - break; - - default: - gc->fct=nasmt_COMMON_del_send; - } -} - -//--------------------------------------------------------------------------- -uint8_t nasmt_TOOL_invfct(struct classifier_entity *gc) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasmt_TOOL_invfct - begin \n"); -#endif - - if (gc==NULL) { - printk("nasmt_TOOL_invfct - input parameter gc is NULL \n"); - return 0; - } - - // End debug information - if (gc->fct==nasmt_COMMON_QOS_send) - return NAS_FCT_QOS_SEND; - - if (gc->fct==nasmt_CTL_send) - return NAS_FCT_CTL_SEND; - - if (gc->fct==nasmt_COMMON_del_send) - return NAS_FCT_DEL_SEND; - - if (gc->fct==nasmt_ASCTL_DC_send_sig_data_request) - return NAS_FCT_DC_SEND; - - return 0; -} - -//--------------------------------------------------------------------------- -uint8_t nasmt_TOOL_get_dscp6(struct ipv6hdr *iph) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasmt_TOOL_get_dscp6 - begin \n"); -#endif - - if (iph==NULL) { - printk("nasmt_TOOL_get_dscp6 - input parameter ipv6hdr is NULL \n"); - return 0; - } - - // End debug information - // return (ntohl(((*(__u32 *)iph)&NAS_TRAFFICCLASS_MASK)))>>22; //Yan - return (ntohl(((*(__u32 *)iph)&NAS_TRAFFICCLASS_MASK)))>>20; -} - -//--------------------------------------------------------------------------- -uint8_t nasmt_TOOL_get_dscp4(struct iphdr *iph) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasmt_TOOL_get_dscp4 - begin \n"); -#endif - - if (iph==NULL) { - printk("nasmt_TOOL_get_dscp4 - input parameter ipv4hdr is NULL \n"); - return 0; - } - - // End debug information - return ((iph->tos)>>5)<<3; -} - - -//--------------------------------------------------------------------------- -uint8_t *nasmt_TOOL_get_protocol6(struct ipv6hdr *iph, uint8_t *protocol) -{ - //--------------------------------------------------------------------------- - uint16_t size; - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasmt_TOOL_get_protocol6 - begin \n"); -#endif - - if (iph==NULL) { - printk("nasmt_TOOL_get_protocol6 - input parameter ipv6hdr is NULL \n"); - return NULL; - } - - if (protocol==NULL) { - printk("nasmt_TOOL_get_protocol6 - input parameter protocol is NULL \n"); - return NULL; - } - - // End debug information - *protocol=iph->nexthdr; - size=NAS_IPV6_SIZE; - - while (1) { - switch(*protocol) { - case IPPROTO_UDP: - case IPPROTO_TCP: - case IPPROTO_ICMPV6: - return (uint8_t *)((uint8_t *)iph+size); - - case IPPROTO_HOPOPTS: - case IPPROTO_ROUTING: - case IPPROTO_DSTOPTS: - *protocol=((uint8_t *)iph+size)[0]; - size+=((uint8_t *)iph+size)[1]*8+8; - break; - - case IPPROTO_FRAGMENT: - *protocol=((uint8_t *)iph+size)[0]; - size+=((uint8_t *)iph+size)[1]+8; - break; - - case IPPROTO_NONE: - case IPPROTO_AH: - case IPPROTO_ESP: - default: - return NULL; - } - } -} - -//--------------------------------------------------------------------------- -uint8_t *nasmt_TOOL_get_protocol4(struct iphdr *iph, uint8_t *protocol) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasmt_TOOL_get_protocol4 - begin \n"); -#endif - - if (iph==NULL) { - printk("nasmt_TOOL_get_protocol4 - input parameter iph is NULL \n"); - return NULL; - } - - if (protocol==NULL) { - printk("nasmt_TOOL_get_protocol4 - input parameter protocol is NULL \n"); - return NULL; - } - - // End debug information - *protocol=iph->protocol; - - switch(*protocol) { - case IPPROTO_UDP: - case IPPROTO_TCP: - case IPPROTO_ICMP: - return (uint8_t *)((uint8_t *)iph+iph->tot_len); - - default: - return NULL; - } -} - -//--------------------------------------------------------------------------- -// Convert the IMEI to iid -void nasmt_TOOL_imei2iid(uint8_t *imei, uint8_t *iid) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasmt_TOOL_imei2iid - begin \n"); -#endif - - if (imei==NULL) { - printk("nasmt_TOOL_imei2iid - input parameter imei is NULL \n"); - return; - } - - if (iid==NULL) { - printk("nasmt_TOOL_imei2iid - input parameter iid is NULL \n"); - return; - } - - // End debug information - memset(iid, 0, NAS_ADDR_LEN); - iid[0] = 0x03; - iid[1] = 16*imei[0]+imei[1]; - iid[2] = 16*imei[2]+imei[3]; - iid[3] = 16*imei[4]+imei[5]; - iid[4] = 16*imei[6]+imei[7]; - iid[5] = 16*imei[8]+imei[9]; - iid[6] = 16*imei[10]+imei[11]; - iid[7] = 16*imei[12]+imei[13]; -} - -//--------------------------------------------------------------------------- -// Convert the IMEI to iid -void nasmt_TOOL_eth_imei2iid(unsigned char *imei, unsigned char *addr ,unsigned char *iid, unsigned char len) -{ - //--------------------------------------------------------------------------- - unsigned int index; - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasmt_TOOL_eth_imei2iid - begin \n"); -#endif - - if (!imei || !addr || !iid) { - printk("OAI_NW_DRV_TOOL_eNB_IMEI2IID - input parameter imei, addr or iid is NULL \n"); - return; - } - - // End debug information - // set addr (should be device HW address) - memset(addr, 0, len); - addr[0] = 0x00; // to be compatible between link local and global - - // len -1 because of insertion of 0 above - for (index = 0; index < (len-1); index++) { - addr[index+1] = 16*imei[index*2]+imei[index*2+1]; - } - - // set iid6 - memset(iid, 0, NAS_ADDR_LEN); - iid[0] = 0x02; - iid[1] = 16*imei[0]+imei[1]; - iid[2] = 16*imei[2]+imei[3]; - iid[3] = 0xff; - iid[4] = 0xfe; - iid[5] = 16*imei[4]+imei[5]; - iid[6] = 16*imei[6]+imei[7]; - iid[7] = 16*imei[8]+imei[9]; - -} - -//--------------------------------------------------------------------------- -void nasmt_TOOL_pk_icmp6(struct icmp6hdr *icmph) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef GRAAL_DEBUG_TOOL - printk("nasmt_TOOL_pk_icmp6 - begin \n"); -#endif - - if (!icmph) { - printk("nasmt_TOOL_pk_icmp6 - input parameter icmph is NULL \n"); - return; - } - - // End debug information - printk("ICMPv6:\t type= %d, code = %d\n", icmph->icmp6_type, icmph->icmp6_code); - - switch(icmph->icmp6_type) { - case ICMPV6_DEST_UNREACH: - printk("Destination unreachable\n"); - break; - - case ICMPV6_PKT_TOOBIG: - printk("Packet too big\n"); - break; - - case ICMPV6_TIME_EXCEED: - printk("Time exceeded\n"); - break; - - case ICMPV6_PARAMPROB: - printk("Parameter problem\n"); - break; - - case ICMPV6_ECHO_REQUEST: - printk("Echo request\n"); - break; - - case ICMPV6_ECHO_REPLY: - printk("Echo reply\n"); - break; - - case ICMPV6_MGM_QUERY: - printk("Multicast listener query\n"); - break; - - case ICMPV6_MGM_REPORT: - printk("Multicast listener report\n"); - break; - - case ICMPV6_MGM_REDUCTION: - printk("Multicast listener done\n"); - break; - - case NDISC_ROUTER_SOLICITATION: - printk("Router solicitation\n"); - break; - - case NDISC_ROUTER_ADVERTISEMENT: - printk("Router advertisment\n"); - break; - - case NDISC_NEIGHBOUR_SOLICITATION: - printk("Neighbour solicitation\n"); - break; - - case NDISC_NEIGHBOUR_ADVERTISEMENT: - printk("Neighbour advertisment\n"); - break; - - case NDISC_REDIRECT: - printk("redirect message\n"); - break; - } -} - -//--------------------------------------------------------------------------- -void nasmt_TOOL_print_state(uint8_t state) -{ - //--------------------------------------------------------------------------- - switch(state) { - case NAS_IDLE: - printk("NAS_IDLE\n"); - return; - - case NAS_CX_FACH: - printk("NAS_CX_FACH\n"); - return; - - case NAS_CX_DCH: - printk("NAS_CX_DCH\n"); - return; - - case NAS_CX_RECEIVED: - printk("NAS_CX_RECEIVED\n"); - return; - - case NAS_CX_CONNECTING: - printk("NAS_CX_CONNECTING\n"); - return; - - case NAS_CX_RELEASING: - printk("NAS_CX_RELEASING\n"); - return; - - case NAS_CX_CONNECTING_FAILURE: - printk("NAS_CX_CONNECTING_FAILURE\n"); - return; - - case NAS_CX_RELEASING_FAILURE: - printk("NAS_CX_RELEASING_FAILURE\n"); - return; - - case NAS_RB_ESTABLISHING: - printk("NAS_RB_ESTABLISHING\n"); - return; - - case NAS_RB_RELEASING: - printk("NAS_RB_RELEASING\n"); - return; - - case NAS_RB_DCH: - printk("NAS_RB_DCH\n"); - return; - - default: - printk("nasmt_TOOL_print_state - Unknown state\n"); - } -} - -//----------------------------------------------------------------------------- -// Print the content of a buffer in hexadecimal -void nasmt_TOOL_print_buffer(unsigned char * buffer,int length) -{ - //----------------------------------------------------------------------------- - int i; - - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasmt_TOOL_print_buffer - begin \n"); -#endif - - if (buffer==NULL) { - printk("nasmt_TOOL_print_buffer - input parameter buffer is NULL \n"); - return; - } - - // End debug information - printk("\nBuffer content: "); - - for (i=0; irab_id, rb->sapi, rb->qos, rb->dscp); - printk("state %d, retry %d, countimer %d\n",rb->state, rb->retry, rb->countimer); -}; - -//----------------------------------------------------------------------------- -void nasmt_TOOL_print_classifier(struct classifier_entity *gc) -{ - //----------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasmt_TOOL_print_classifier - begin \n"); -#endif - - if (gc==NULL) { - printk("nasmt_TOOL_print_classifier - input parameter gc is NULL \n"); - return; - } - - // End debug information - printk("\nClassifier content: classref %d, version %d, splen %d, dplen %d,\n", gc->classref, gc->version, gc->splen, gc->dplen); - printk("protocol %d, sport %d, dport %d, rab_id %d\n", gc->protocol, gc->sport, gc->dport, gc->rab_id); - nasmt_TOOL_print_rb_entity(gc->rb); -}; - - diff --git a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h b/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h deleted file mode 100755 index 3ee63d8862..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASMT/nasmt_variables.h +++ /dev/null @@ -1,180 +0,0 @@ -/*************************************************************************** - nasmt_variables.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_variables.h -* \brief Variable and structure definitions for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef _NASMTD_VAR_H -#define _NASMTD_VAR_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include - -#include "rrc_nas_primitives.h" -#include "rrc_qos_classes.h" -#include "rrc_nas_sap.h" - -#include "nasmt_constant.h" -#include "nasmt_sap.h" - -struct cx_entity; - -struct rb_entity { - uint32_t cnxid; - nasRadioBearerId_t rab_id; //ue_rbId - nasSapId_t sapi; - nasQoSTrafficClass_t qos; - nasQoSTrafficClass_t RadioQosClass; - nasIPdscp_t dscp; - uint8_t state; - uint8_t result; - uint8_t retry; - uint32_t countimer; - struct rb_entity *next; -}; - -struct classifier_entity { - uint32_t classref; // classifier identity - uint8_t version; // IP version 4 or 6 - union { - struct in6_addr ipv6; - uint32_t ipv4; - } saddr; // IP source address - uint8_t splen; // IP prefix size - union { - struct in6_addr ipv6; - uint32_t ipv4; - } daddr; // IP destination address - uint8_t dplen; // IP prefix size - uint8_t protocol; // layer 4 protocol type (tcp, udp, ...) - uint16_t sport; // source port - uint16_t dport; // destination port - struct rb_entity *rb; - nasRadioBearerId_t rab_id; // RAB identification - void (*fct)(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc); - struct classifier_entity *next; -}; - - -struct cx_entity { - int sap[NAS_SAPI_CX_MAX]; - uint8_t state; // state of the connection - nasLocalConnectionRef_t lcr; // Local connection reference - nasCellID_t cellid; // cell identification - uint32_t countimer; // timeout's counter - uint8_t retry; // number of retransmissions - struct classifier_entity *sclassifier[NAS_DSCP_MAX]; // send classifiers table - uint16_t nsclassifier; - uint32_t iid6[2]; // IPv6 interface identification - uint8_t iid4; // IPv4 interface identification - struct rb_entity *rb; - uint16_t num_rb; - //measures - int req_prov_id[MAX_MEASURE_NB]; - int num_measures; - int meas_cell_id[MAX_MEASURE_NB]; - int meas_level[MAX_MEASURE_NB]; - int provider_id[MAX_MEASURE_NB]; - //MBMS - int joined_services[NASMT_MBMS_SVCES_MAX]; - -}; - -struct nas_priv { - int irq; - int rx_flags; - struct timer_list timer; - spinlock_t lock; - struct net_device_stats stats; - uint8_t retry_limit; - uint32_t timer_establishment; - uint32_t timer_release; - struct cx_entity cx[NAS_CX_MAX]; - struct classifier_entity *rclassifier[NAS_DSCP_MAX]; // receive classifier - uint16_t nrclassifier; - uint32_t next_sclassref; - int sap[NAS_SAPI_MAX]; - uint8_t xbuffer[NAS_MAX_LENGTH]; // transmission buffer - uint8_t rbuffer[NAS_MAX_LENGTH]; // reception buffer -}; - -struct ipversion { -#if defined(__LITTLE_ENDIAN_BITFIELD) - uint8_t reserved:4, - version:4; -#else - uint8_t version:4, - reserved:4; -#endif -}; - -typedef struct pdcp_data_req_header_t { - unsigned int rb_id; - unsigned int data_size; - int inst; -} pdcp_data_req_header_t; - -typedef struct pdcp_data_ind_header_t { - unsigned int rb_id; - unsigned int data_size; - int inst; -} pdcp_data_ind_header_t; -// - -extern struct nas_priv *gpriv; -extern struct net_device *gdev; -//extern int bytes_wrote; -//extern int bytes_read; - -extern uint8_t NAS_NULL_IMEI[14]; -extern uint8_t NAS_RG_IMEI[14]; - -//global variables shared with RRC -extern int *pt_nas_ue_irq; -//extern uint8_t nas_IMEI[14]; -#endif diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/Makefile b/openair2/NAS/DRIVER/CELLULAR/NASRG/Makefile deleted file mode 100755 index 758fa0420b..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# NAS CELLULAR Driver makefile -# -include $(OPENAIR_DIR)/common/utils/Makefile.inc - -NAS_UPDIR := $(shell /bin/pwd) - -#################################################### -# D E B U G F L A G S -#################################################### - -#################################################### -# EXTRA COMPILER FLAGS -#################################################### -EXTRA_CFLAGS = -fno-common -fno-stack-protector -mpreferred-stack-boundary=4 $(if $(SET_X64),-DARCH_64,) $(if $(SET_X64),-mcmodel=kernel,) $(if $(SET_X64),-m64,) - -ifdef ADDRCONF -EXTRA_CFLAGS += -DADDRCONF -endif - -ifdef NAS_DRIVER_TYPE_ETHERNET -EXTRA_CFLAGS += -DNAS_DRIVER_TYPE_ETHERNET -endif - - -ifdef PDCP_USE_NETLINK -EXTRA_CFLAGS += -DPDCP_USE_NETLINK -else -EXTRA_CFLAGS += $(shell rtai-config --module-cflags) -DRTAI -D__IN_RTAI__ -Wall -endif - -ifdef LOOPBACK -EXTRA_CFLAGS += -DLOOPBACK_TEST -endif - -ifdef ADDRESS_FIX -EXTRA_CFLAGS += -DNAS_ADDRESS_FIX -endif - -#################################################### -# NASRGCELL extra compilation flags -#################################################### -#RTAI=1 -RRC_DIR := $(OPENAIR2_DIR)/RRC/CELLULAR -EXTRA_CFLAGS += -I$(RRC_DIR) -DNODE_RG - -#################################################### -# LOADABLE MODULE GOALS -#################################################### -obj-m += nascellrg.o -nascellrg-objs += nasrg_device.o -nascellrg-objs += nasrg_common.o -nascellrg-objs += nasrg_iocontrol.o -nascellrg-objs += nasrg_classifier.o -nascellrg-objs += nasrg_tool.o -nascellrg-objs += nasrg_ascontrol.o -ifdef PDCP_USE_NETLINK -nascellrg-objs += nasrg_netlink.o -endif - -#################################################### -# REVOIR LE CLEAN -#################################################### - -#netlink.ko: - #make $(x)$(y) PDCP_USE_NETLINK=1 V=1 -C $(KERNEL_DIR) M=`pwd` modules - -#nasmesh.ko: -# make V=1 -C $(KERNEL_DIR) M=`pwd` modules -print: - @echo RRC_DIR $(RRC_DIR) -clean: - rm -f *.ko - rm -f .*.ko.cmd - rm -f .*.o.cmd - rm -f *.o - rm -f *.mod.c - find . -name *.ko -delete - find . -name *.o -delete - find . -name *.mod.c -delete diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c deleted file mode 100755 index 53d0e14aeb..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_ascontrol.c +++ /dev/null @@ -1,1503 +0,0 @@ -/*************************************************************************** - nasrg_ascontrol.c - description - *************************************************************************** - Access Stratum Control features for eNodeB - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasrg_ascontrol.c -* \brief Access Stratum Control functions for OpenAirInterface CELLULAR version - RG -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifdef NODE_RG -#include "nasrg_variables.h" -#include "nasrg_proto.h" - -//--------------------------------------------------------------------------- -void nasrg_ASCTL_init(void) -{ - //--------------------------------------------------------------------------- - int cxi, i; - - gpriv->next_sclassref = NASRG_DEFAULTRAB_CLASSREF; - - // Initialize MBMS services list in MT - for (cxi=0; cxicx[cxi].requested_joined_services[i]= -1; - gpriv->cx[cxi].requested_left_services[i]= -1; - gpriv->cx[cxi].joined_services[i]= -1; - } - } - - printk("nasrg_ASCTL_init Complete\n"); -} - -//--------------------------------------------------------------------------- -int nasrg_ASCTL_write(int sap, unsigned char *data_buffer, unsigned int data_length) -{ - //--------------------------------------------------------------------------- - int bytes_wrote = 0; -#ifdef PDCP_USE_NETLINK - unsigned char xmit_buffer [NAS_MESSAGE_MAXLEN]; - - //write SAP_Id - switch (sap) { - case RRC_DEVICE_GC: - xmit_buffer[0] = RRC_NAS_GC_IN; - break; - - case RRC_DEVICE_NT: - xmit_buffer[0] = RRC_NAS_NT_IN; - break; - - case RRC_DEVICE_DC_INPUT0: - xmit_buffer[0] = RRC_NAS_DC0_IN; - break; - - case RRC_DEVICE_DC_INPUT1: - xmit_buffer[0] = RRC_NAS_DC1_IN; - //case RRC_DEVICE_DC_INPUT2: - //xmit_buffer[0] = RRC_NAS_DC2_IN; - break; - - default: - printk("nasrg_ASCTL_write - ERROR - Invalid SAP %d\n", sap); - return 0; - break; - } - - memcpy (&((char*)xmit_buffer)[1], data_buffer, data_length); -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_write - Sending data to RRC, sap %d, length %d (including NETLINK SAP value)\n", sap, data_length+1); - nasrg_TOOL_print_buffer(xmit_buffer,data_length+1); -#endif - bytes_wrote = nasrg_netlink_send(xmit_buffer,data_length+1, NASNL_DEST_RRC); -#else - //bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length); //original version - bytes_wrote = rtf_put(sap, data_buffer, data_length+1); -#endif //PDCP_USE_NETLINK - return bytes_wrote-1; -} - -//--------------------------------------------------------------------------- -//For demo, add automatically a radio bearer -//Equivalent to rb add send 0 5 2 -void nasrg_ASCTL_start_default_rb(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- -#ifdef DEMO_3GSM - struct rb_entity *rb; - int status; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_start_default_rb - begin \n"); -#endif - - if (!cx) { - printk("nasrg_ASCTL_start_default_rb - input parameter cx is NULL \n"); - return; - } - - // End debug information - - rb = nasrg_COMMON_add_rb(cx, NASRG_DEFAULTRAB_RBID, NASRG_DEFAULTRAB_QoS); - - if (rb!=NULL) { - rb->cnxid = (NAS_RB_MAX_NUM * cx->lcr)+1; - //rb->default_rab =1; - rb->dscp = NASRG_DEFAULTRAB_DSCP; - rb->dscp_ul = NASRG_DEFAULTRAB_DSCP; - status=nasrg_ASCTL_DC_send_rb_establish_request(cx, rb); - } else - status=-NAS_ERROR_NOMEMORY; - -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_start_default_rb - end %d \n",status); -#endif -} -#endif - -//--------------------------------------------------------------------------- -//For demo, add automatically a classifier -//Equivalent to class add send 0 -f qos -cr 0 -void nasrg_ASCTL_start_default_sclassifier(struct cx_entity *cx,struct rb_entity *rb) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - - // Start debug information -#ifdef NAS_DEBUG_CLASS - printk("nasrg_ASCTL_start_default_sclassifier - begin \n"); -#endif - - if (!cx || !rb) { - printk("nasrg_ASCTL_start_default_sclassifier - input parameter is NULL \n"); - return; - } - - // End debug information - gc=nasrg_CLASS_add_sclassifier(cx, NAS_DSCP_DEFAULT, gpriv->next_sclassref); - - if (gc==NULL) { - printk("nasrg_ASCTL_start_default_sclassifier - Classifier pointer is null : not added \n"); - return; - } - - gc->fct = nasrg_COMMON_QOS_send; - gc->rab_id =rb->rab_id; - gc->rb= rb; - gc->version = NASRG_DEFAULTRAB_IPVERSION; - gc->protocol= NAS_PROTOCOL_DEFAULT; - gc->dplen= NAS_DEFAULT_IPv6_PREFIX_LENGTH; - // copy locator part of address into the gc structure - //gc->daddr.ipv6.s6_addr32[0] = 0; - //gc->daddr.ipv6.s6_addr32[1] = 0; - //gc->daddr.ipv6.s6_addr32[2] = 0; - //gc->daddr.ipv6.s6_addr32[3] = 0; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_ASCTL_start_default_sclassifier - end \n"); - nasrg_TOOL_print_classifier(gc); -#endif -} - -//--------------------------------------------------------------------------- -//Add automatically a classifier on DSCP -//Equivalent to class add send 0 -f qos -cr 0 -void nasrg_ASCTL_start_sclassifier(struct cx_entity *cx,struct rb_entity *rb) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - - // Start debug information -#ifdef NAS_DEBUG_CLASS - printk("nasrg_ASCTL_start_sclassifier - begin \n"); -#endif - - if (!cx || !rb) { - printk("nasrg_ASCTL_start_sclassifier - input parameter is NULL \n"); - return; - } - - // End debug information - gc=nasrg_CLASS_add_sclassifier(cx, rb->dscp, gpriv->next_sclassref); - - if (gc==NULL) { - printk("nasrg_ASCTL_start_sclassifier - Classifier pointer is null : not added \n"); - return; - } - - gc->fct = nasrg_COMMON_QOS_send; - gc->rab_id =rb->rab_id; - gc->rb= rb; - gc->version = NASRG_DEFAULTRAB_IPVERSION; - gc->protocol= NAS_PROTOCOL_DEFAULT; - gc->dplen= NAS_DEFAULT_IPv6_PREFIX_LENGTH; - // copy locator part of address into the gc structure - gc->daddr.ipv6.s6_addr32[2] = cx->iid6[0]; - gc->daddr.ipv6.s6_addr32[3] = cx->iid6[1]; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_ASCTL_start_sclassifier - end \n"); - nasrg_TOOL_print_classifier(gc); -#endif -} - -//--------------------------------------------------------------------------- -//Add automatically a classifier for mbms -void nasrg_ASCTL_start_mbmsclassifier(int mbms_ix,struct rb_entity *mbms_rb) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - - // Start debug information -#ifdef NAS_DEBUG_CLASS - printk("nasrg_ASCTL_start_mbmsclassifier - begin \n"); -#endif - - if (!mbms_rb) { - printk("nasrg_ASCTL_start_mbmsclassifier - input parameter is NULL \n"); - return; - } - - // End debug information - // - // gc=nasrg_CLASS_add_mbmsclassifier(mbms_ix, gpriv->next_mbmsclassref); - gc=nasrg_CLASS_add_mbmsclassifier(mbms_ix, gpriv->next_sclassref++); - - if (gc==NULL) { - printk("nasrg_ASCTL_start_mbmsclassifier - Classifier pointer is null : not added \n"); - return; - } - - gc->fct = nasrg_COMMON_QOS_send; - gc->rab_id =mbms_rb->mbms_rbId; - gc->rb= mbms_rb; - gc->version = NASRG_DEFAULTRAB_IPVERSION; - gc->protocol= NAS_PROTOCOL_DEFAULT; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_ASCTL_start_mbmsclassifier - end \n"); - nasrg_TOOL_print_classifier(gc); -#endif -} - -//--------------------------------------------------------------------------- -//Notifies automatically UE on default MBMS service -void nasrg_ASCTL_start_default_ue_notification(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_start_default_ue_notification - begin \n"); -#endif - - if (!cx) { - printk("\nERROR nasrg_ASCTL_start_default_ue_notification - input parameter is NULL \n"); - return; - } - - // End debug information - // set value for default MBMS service - cx->requested_joined_services[0] = (NAS_CX_MAX*NAS_RB_MAX_NUM) +1; - nasrg_ASCTL_DC_send_mbms_ue_notify_req(cx); -} - -//--------------------------------------------------------------------------- -//Notifies automatically UE on default MBMS service -void nasrg_ASCTL_start_default_mbms_service(void) -{ - //--------------------------------------------------------------------------- - int mbms_ix=0; // should allocate index based on Service_id /cnxid / MC IP address -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_start_default_mbms_service - begin \n"); -#endif - - // Establish MBMS bearer if not already done - if ((gpriv->mbms_rb[mbms_ix].state != NAS_CX_DCH)&&(gpriv->mbms_rb[mbms_ix].state != NAS_RB_ESTABLISHING)) { - gpriv->mbms_rb[mbms_ix].cnxid = (NAS_CX_MAX*NAS_RB_MAX_NUM) +1; - gpriv->mbms_rb[mbms_ix].serviceId = (NAS_CX_MAX*NAS_RB_MAX_NUM) +1; - gpriv->mbms_rb[mbms_ix].sessionId = NASRG_TEMP_MBMS_SESSION_ID; //Temp hard coded - gpriv->mbms_rb[mbms_ix].mbms_rbId = NASRG_DEFAULTRAB_RBID; - gpriv->mbms_rb[mbms_ix].sapi = NAS_DC_INPUT_SAPI; -#ifdef NAS_DEBUG_MBMS_PROT - gpriv->mbms_rb[mbms_ix].sapi = NAS_DRB_INPUT_SAPI; //Only one RT-FIFO is used -#endif - gpriv->mbms_rb[mbms_ix].qos = 20; //from first version of MBMS traces - gpriv->mbms_rb[mbms_ix].dscp = 0; //maybe 7 - gpriv->mbms_rb[mbms_ix].duration = NASRG_TEMP_MBMS_DURATION; //Temp hard coded - //memcpy ((char *)&(gpriv->mbms_rb[mbms_ix].mcast_address),(char *)&(msgreq->mcast_group), 16); - gpriv->mbms_rb[mbms_ix].mcast_address[0] = 0xFF; - gpriv->mbms_rb[mbms_ix].mcast_address[1] = 0x0E; - nasrg_ASCTL_GC_send_mbms_bearer_establish_req(mbms_ix); - } else { -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_start_default_mbms_service - skipped, mbms_rb.state = %d \n", gpriv->mbms_rb[mbms_ix].state); -#endif - } -} -//--------------------------------------------------------------------------- -void nasrg_ASCTL_timer(unsigned long data) -{ - //--------------------------------------------------------------------------- - uint8_t cxi; - struct cx_entity *cx; - struct rb_entity *rb; - spin_lock(&gpriv->lock); -#ifdef NAS_DEBUG_TIMER - printk("nasrg_ASCTL_timer - begin \n"); -#endif - (gpriv->timer).function = nasrg_ASCTL_timer; - (gpriv->timer).expires=jiffies+NAS_TIMER_TICK; - (gpriv->timer).data=0L; - - for (cxi=0; cxicx+cxi; - - if (!cx) { - printk("nasrg_ASCTL_timer - No pointer for connection %d \n", cxi); - continue; - } - - for (rb=cx->rb; rb!=NULL; rb=rb->next) { - if (rb->countimer!=NAS_TIMER_IDLE) { -#ifdef NAS_DEBUG_TIMER - printk("nasrg_ASCTL_timer : rb countimer %d, rb state %d\n", rb->countimer, rb->state); -#endif - - if (rb->countimer==0) { - switch (rb->state) { - case NAS_CX_CONNECTING: - case NAS_CX_CONNECTING_FAILURE: // MW - 15/01/07 Useless, currently no retry if failure - if (rb->retryretry_limit) { - printk("nasrg_ASCTL_timer: Retry RB establishment %d\n", rb->retry); - nasrg_ASCTL_DC_send_rb_establish_request(cx, rb); - } else { - printk("nasrg_ASCTL_timer: RB Establishment failure\n"); - rb->state=NAS_IDLE; - rb->countimer=NAS_TIMER_IDLE; - } - - break; - - case NAS_CX_DCH: -#ifdef DEMO_3GSM - if (cx->num_rb == 1) { - nasrg_ASCTL_start_default_sclassifier(cx, rb); - } - -#endif - nasrg_ASCTL_start_sclassifier(cx, rb); - rb->countimer=NAS_TIMER_IDLE; - break; - - case NAS_CX_RELEASING_FAILURE: - nasrg_ASCTL_DC_send_rb_release_request(cx, rb); - break; - - default: - rb->countimer=NAS_TIMER_IDLE; - } - } else { - --rb->countimer; - printk("nasrg_ASCTL_timer : rb countimer-- %d, rb state %d\n", rb->countimer, rb->state); - } - } - } - } - - add_timer(&gpriv->timer); -#ifdef NAS_DEBUG_TIMER - printk("nasrg_ASCTL_timer - end \n"); -#endif - spin_unlock(&gpriv->lock); -} - - -/*************************************************************************** - Transmission side - ***************************************************************************/ -//--------------------------------------------------------------------------- -// Encode INFO_BROADCAST_REQ message -int nasrg_ASCTL_GC_send_broadcast_request(uint8_t category) -{ - //--------------------------------------------------------------------------- - char *xmit_data = "TESTING BROADCASTING ROUTER ADVERTISEMENT. TESTING BROADCASTING ROUTER ADVERTISEMENT. BROADCASTING ROUTER.\0"; - int bytes_wrote = 0; -#ifdef PDCP_USE_NETLINK - unsigned char xbuffer[NAS_MESSAGE_MAXLEN]; - int count=0; -#endif - - struct nas_rg_gc_element *p; - p= (struct nas_rg_gc_element *)(gpriv->xbuffer); - p->type = INFO_BROADCAST_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASInfoBroadcastReq); - // - p->nasRGGCPrimitive.broadcast_req.period = 0; - p->nasRGGCPrimitive.broadcast_req.category = category; - p->nasRGGCPrimitive.broadcast_req.nasDataLength = strlen(xmit_data)+1; // TBD - - //bytes_wrote = rtf_put(gpriv->sap[NAS_GC_SAPI], p, p->length); //original version -#ifdef PDCP_USE_NETLINK - memcpy(xbuffer,(unsigned char *)p, p->length); - count = p->length; - bytes_wrote = count; -#else - bytes_wrote = nasrg_ASCTL_write(gpriv->sap[NAS_GC_SAPI], (unsigned char *)p, p->length); -#endif - //printk("nasrg_ASCTL_GC_send_broadcast_request - Wrote %d bytes to RRC NAS_GC_SAPII\n", bytes_wrote); - - //bytes_wrote += rtf_put(gpriv->sap[NAS_GC_SAPI], xmit_data, p->nasRGGCPrimitive.broadcast_req.nasDataLength); -#ifdef PDCP_USE_NETLINK - memcpy(&(xbuffer[count]),(unsigned char *)xmit_data, p->nasRGGCPrimitive.broadcast_req.nasDataLength); - count += p->nasRGGCPrimitive.broadcast_req.nasDataLength; - bytes_wrote += nasrg_ASCTL_write(gpriv->sap[NAS_GC_SAPI], xbuffer, count); -#else - bytes_wrote += nasrg_ASCTL_write((gpriv->sap[NAS_GC_SAPI], xmit_data, p->nasRGGCPrimitive.broadcast_req.nasDataLength); -#endif - - if (bytes_wrote==p->length+p->nasRGGCPrimitive.broadcast_req.nasDataLength) { -#ifdef NAS_DEBUG_GC - printk("nasrg_ASCTL_GC_send_broadcast: INFO_BROADCAST_REQ primitive sent successfully in GC-FIFO\n"); -#endif - } else { - printk("nasrg_ASCTL_GC_send_broadcast: Message sent failure in GC-FIFO\n"); - } - return bytes_wrote; -} - - -//--------------------------------------------------------------------------- -// Encode INFO_BROADCAST_REQ message for RRC SIB1 -int nasrg_ASCTL_GC_send_SIB1_broadcast_request(struct sk_buff *skb) -{ - //--------------------------------------------------------------------------- - struct nas_rg_gc_element *p; - char sib1_flag; // will be used for reception in nas_ue - int bytes_wrote = 0; -#ifdef PDCP_USE_NETLINK - unsigned char xbuffer[NAS_MESSAGE_MAXLEN]; - int count=0; -#endif - - // Start debug information -#ifdef NAS_DEBUG_GC - printk("nasrg_ASCTL_GC_send_SIB1_broadcast_request - begin \n"); -#endif - - if (!skb) { - printk("nasrg_ASCTL_GC_send_SIB1_broadcast_request - input parameter is NULL \n"); - return 0; - } - - // End debug information - p= (struct nas_rg_gc_element *)(gpriv->xbuffer); - p->type = INFO_BROADCAST_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASInfoBroadcastReq); - // - p->nasRGGCPrimitive.broadcast_req.period = 10; // to be checked - p->nasRGGCPrimitive.broadcast_req.category = 1; - p->nasRGGCPrimitive.broadcast_req.nasDataLength = skb->len+1; // TBD - sib1_flag = 1; - // send header - //bytes_wrote = rtf_put(gpriv->sap[NAS_GC_SAPI], p, p->length); //original version -#ifdef PDCP_USE_NETLINK - memcpy(xbuffer,(unsigned char *)p, p->length); - count = p->length; - bytes_wrote = count; -#else - bytes_wrote = nasrg_ASCTL_write(gpriv->sap[NAS_GC_SAPI], (unsigned char *)p, p->length); -#endif - //printk("nasrg_ASCTL_GC_send_broadcast_request - Wrote %d bytes to RRC NAS_GC_SAPII\n", bytes_wrote); - - - if (bytes_wrote!=p->length) { - printk("nasrg_ASCTL_GC_send_SIB1_broadcast_request: Header send failure in GC-FIFO\n"); - return bytes_wrote; - } - - // send sib1_flag - //bytes_wrote += rtf_put(gpriv->sap[NAS_GC_SAPI], &sib1_flag, 1); -#ifdef PDCP_USE_NETLINK - memcpy(&(xbuffer[count]),(unsigned char *)&sib1_flag, 1); - count += 1; - bytes_wrote = count; -#else - bytes_wrote += nasrg_ASCTL_write(gpriv->sap[NAS_GC_SAPI], (unsigned char *)&sib1_flag, 1); -#endif - - if (bytes_wrote!=p->length+1) { - printk("nasrg_ASCTL_GC_send_SIB1_broadcast_request: sib1_flag send failure in GC-FIFO\n"); - return bytes_wrote; - } - - // send data - //bytes_wrote += rtf_put(gpriv->sap[NAS_GC_SAPI], skb->data, skb->len); -#ifdef PDCP_USE_NETLINK - memcpy(&(xbuffer[count]),skb->data, skb->len); - count += skb->len; - bytes_wrote = nasrg_ASCTL_write(gpriv->sap[NAS_GC_SAPI], xbuffer, count); -#else - bytes_wrote += nasrg_ASCTL_write(gpriv->sap[NAS_GC_SAPI], skb->data, skb->len); -#endif - - - if (bytes_wrote!=p->length+skb->len+1) { - printk("nasrg_ASCTL_GC_send_SIB1_broadcast_request: Data send failure in GC-FIFO\n"); - return bytes_wrote; - } - -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_GC_send_SIB1_broadcast_request - end \n"); -#endif - return bytes_wrote; -} - -//----------------------------------------------------------------------------- -// Encode MBMS_BEARER_ESTABLISH_REQ message -int nasrg_ASCTL_GC_send_mbms_bearer_establish_req(int mbms_ix ) -{ - //----------------------------------------------------------------------------- - struct nas_rg_gc_element *p; - int bytes_wrote = 0; - - p= (struct nas_rg_gc_element *)(gpriv->xbuffer); - p->type = MBMS_BEARER_ESTABLISH_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASMBMSBearerEstablishReq); - // - p->nasRGGCPrimitive.mbms_establish_req.mbms_serviceId = gpriv->mbms_rb[mbms_ix].serviceId; - p->nasRGGCPrimitive.mbms_establish_req.mbms_sessionId = gpriv->mbms_rb[mbms_ix].sessionId; - p->nasRGGCPrimitive.mbms_establish_req.mbms_rbId = gpriv->mbms_rb[mbms_ix].mbms_rbId; - p->nasRGGCPrimitive.mbms_establish_req.mbms_sapId = gpriv->mbms_rb[mbms_ix].sapi; - p->nasRGGCPrimitive.mbms_establish_req.mbms_QoSclass = gpriv->mbms_rb[mbms_ix].qos; - p->nasRGGCPrimitive.mbms_establish_req.mbms_duration = gpriv->mbms_rb[mbms_ix].duration; - gpriv->mbms_rb[mbms_ix].state = NAS_RB_ESTABLISHING; - // - //bytes_wrote = rtf_put(gpriv->sap[NAS_GC_SAPI], p, p->length); - bytes_wrote = nasrg_ASCTL_write(gpriv->sap[NAS_GC_SAPI], (unsigned char *)p, p->length); - - if (bytes_wrote==p->length) { -#ifdef NAS_DEBUG_GC - printk(" nasrg_ASCTL_GC_send_mbms_bearer_establish: MBMS_BEARER_ESTABLISH_REQ primitive sent successfully in GC-FIFO\n"); - printk(" ServiceId %d, RB_Id %d , qos class %d \n", - p->nasRGGCPrimitive.mbms_establish_req.mbms_serviceId, - p->nasRGGCPrimitive.mbms_establish_req.mbms_rbId, - p->nasRGGCPrimitive.mbms_establish_req.mbms_QoSclass); -#endif - } else { - printk("nasrg_ASCTL_GC_send_mbms_bearer_establish: Message sent failure in GC-FIFO\n"); - } - - return bytes_wrote; -} - -//----------------------------------------------------------------------------- -// HNN - Encode MBMS_BEARER_RELEASE_REQ message -int nasrg_ASCTL_GC_send_mbms_bearer_release_req(int mbms_ix) -{ - //----------------------------------------------------------------------------- - struct nas_rg_gc_element *p; - uint16_t classref=0; - int bytes_wrote = 0; - - p= (struct nas_rg_gc_element *)(gpriv->xbuffer); - - p->type = MBMS_BEARER_RELEASE_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASMBMSBearerReleaseReq); - // - p->nasRGGCPrimitive.mbms_release_req.mbms_serviceId = gpriv->mbms_rb[mbms_ix].serviceId; - p->nasRGGCPrimitive.mbms_release_req.mbms_sessionId = gpriv->mbms_rb[mbms_ix].sessionId; - p->nasRGGCPrimitive.mbms_release_req.mbms_rbId = gpriv->mbms_rb[mbms_ix].mbms_rbId; - //gpriv->mbms_rb[mbms_ix].state = NAS_RB_RELEASING; - // - //bytes_wrote = rtf_put(gpriv->sap[NAS_GC_SAPI], p, p->length); - bytes_wrote = nasrg_ASCTL_write(gpriv->sap[NAS_GC_SAPI], (unsigned char *)p, p->length); - - if (bytes_wrote==p->length) { -#ifdef NAS_DEBUG_GC - printk(" nasrg_ASCTL_GC_send_mbms_bearer_release: MBMS_BEARER_RELEASE_REQ primitive sent successfully in GC-FIFO\n"); - printk(" ServiceId %d, RB_Id %d \n", p->nasRGGCPrimitive.mbms_establish_req.mbms_serviceId, p->nasRGGCPrimitive.mbms_establish_req.mbms_rbId); -#endif - // clean NASRG private structures - classref = (gpriv->mbmsclassifier[mbms_ix])->classref; - nasrg_CLASS_del_mbmsclassifier(mbms_ix, classref); - //nasrg_CLASS_flush_mbmsclassifier(); - //gpriv->mbms_rb[mbms_ix].state = NAS_IDLE; - memset (&(gpriv->mbms_rb[mbms_ix]),0,sizeof (struct rb_entity)); - } else { - printk("nasrg_ASCTL_GC_send_mbms_bearer_release: Message sent failure in GC-FIFO\n"); - } - - return bytes_wrote; -} - -//--------------------------------------------------------------------------- -// Confirm the establishment of a connection (DC channel) -int nasrg_ASCTL_DC_send_cx_establish_confirm(struct cx_entity *cx, uint8_t response) -{ - //--------------------------------------------------------------------------- - struct nas_rg_dc_element *p; - int bytes_wrote = 0; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_send_cx_establish - begin \n"); -#endif - - if (!cx) { - printk("nasrg_ASCTL_DC_send_cx_establish - input parameter cx is NULL \n"); - return NAS_ERROR_NOTCORRECTVALUE; - } - - // End debug information - p= (struct nas_rg_dc_element *)(gpriv->xbuffer); - p->type = CONN_ESTABLISH_CNF; - p->length = NAS_TL_SIZE + sizeof(struct NASConnEstablishConf); - p->nasRGDCPrimitive.conn_establish_conf.localConnectionRef = cx->lcr; - p->nasRGDCPrimitive.conn_establish_conf.status = response; // can be ACCEPTED or FAILURE - p->nasRGDCPrimitive.conn_establish_conf.num_RBs = 0; // Hard coded in first step - // - //bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length); - bytes_wrote = nasrg_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)p, p->length); - - if (bytes_wrote==p->length) { -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_send_cx_establish: CONN_ESTABLISH_CNF primitive sent successfully in DC-FIFO\n"); - printk(" lcr (Mobile_id) %u\n",p->nasRGDCPrimitive.conn_establish_conf.localConnectionRef); - printk(" Status %u\n",p->nasRGDCPrimitive.conn_establish_conf.status); -#endif - } else - printk("nasrg_ASCTL_DC_send_cx_establish: Message transmission failure to DC-FIFO\n"); - - return bytes_wrote; -} - -//--------------------------------------------------------------------------- -// Request the establishment of a radio bearer -int nasrg_ASCTL_DC_send_rb_establish_request(struct cx_entity *cx, struct rb_entity *rb) -{ - //--------------------------------------------------------------------------- - struct nas_rg_dc_element *p; - int bytes_wrote = 0; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_send_rb_establish - begin \n"); -#endif - - if (!cx || !rb) { - printk("nasrg_ASCTL_DC_send_rb_establish - input parameter is NULL \n"); - return NAS_ERROR_NOTCORRECTVALUE; - } - - // End debug information - switch(rb->state) { - case NAS_CX_CONNECTING: - case NAS_CX_CONNECTING_FAILURE: - case NAS_IDLE: - ++rb->retry; - rb->countimer=gpriv->timer_establishment; - - if (cx->state==NAS_CX_DCH) { - p= (struct nas_rg_dc_element *)(gpriv->xbuffer); - p->type = RB_ESTABLISH_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASrbEstablishReq); - p->nasRGDCPrimitive.rb_establish_req.localConnectionRef = cx->lcr; - p->nasRGDCPrimitive.rb_establish_req.rbId = rb->rab_id + (NAS_RB_MAX_NUM * cx->lcr); - p->nasRGDCPrimitive.rb_establish_req.QoSclass = rb->qos; - p->nasRGDCPrimitive.rb_establish_req.dscp = rb->dscp_ul; - // - //bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length); - bytes_wrote = nasrg_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)p, p->length); - - if (bytes_wrote==p->length) { - rb->state=NAS_CX_CONNECTING; -#ifdef NAS_DEBUG_DC - printk(" nasrg_ASCTL_DC_send_rb_establish: RB_ESTABLISH_REQ primitive sent successfully in DC-FIFO\n"); - printk(" lcr (Mobile_id) %u\n",p->nasRGDCPrimitive.rb_establish_req.localConnectionRef); - printk(" Radio Bearer identification %u\n",p->nasRGDCPrimitive.rb_establish_req.rbId); - printk(" QoS %u\n",p->nasRGDCPrimitive.rb_establish_req.QoSclass); -#endif - } else { - rb->state=NAS_CX_CONNECTING_FAILURE; - printk("nasrg_ASCTL_DC_send_rb_establish: Message sent failure in DC-FIFO\n"); - } - - return bytes_wrote; - } else { - rb->state=NAS_CX_CONNECTING_FAILURE; - printk("nasrg_ASCTL_DC_send_rb_establish: Failure \n"); - return 0; - } - - default: - return -NAS_ERROR_NOTIDLE; - } -} - -//--------------------------------------------------------------------------- -// Request the release of a radio bearer -int nasrg_ASCTL_DC_send_rb_release_request(struct cx_entity *cx, struct rb_entity *rb) -{ - //--------------------------------------------------------------------------- - struct nas_rg_dc_element *p; - int bytes_wrote = 0; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_send_rb_release - begin \n"); -#endif - - if (!cx || !rb) { - printk("nasrg_ASCTL_DC_send_rb_release - input parameter is NULL \n"); - return NAS_ERROR_NOTCORRECTVALUE; - } - - // End debug information - switch (rb->state) { - case NAS_CX_RELEASING_FAILURE: - case NAS_CX_DCH: - p= (struct nas_rg_dc_element *)(gpriv->xbuffer); - p->type = RB_RELEASE_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASrbReleaseReq); - p->nasRGDCPrimitive.rb_release_req.localConnectionRef = cx->lcr; - p->nasRGDCPrimitive.rb_release_req.rbId = rb->rab_id + (NAS_RB_MAX_NUM * cx->lcr); - // - //bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length); - bytes_wrote = nasrg_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)p, p->length); - - if (bytes_wrote) { - rb->state=NAS_IDLE; -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_send_rb_release: RB_RELEASE_REQ primitive sent successfully in DC-FIFO\n"); -#endif - } else { - ++rb->retry; - rb->countimer=gpriv->timer_release; - rb->state=NAS_CX_RELEASING_FAILURE; - printk("nasrg_ASCTL_DC_send_rb_release: Message sent failure in DC-FIFO\n"); - } - - return bytes_wrote; - - default: - return -NAS_ERROR_NOTCONNECTED; - } -} - -//----------------------------------------------------------------------------- -// Request the notification of a UE to joined or left services -int nasrg_ASCTL_DC_send_mbms_ue_notify_req(struct cx_entity *cx) -{ - //----------------------------------------------------------------------------- - struct nas_rg_dc_element *p; - int i; - int bytes_wrote = 0; - -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_send_mbms_ue_notify_req - begin \n"); -#endif - - if (!cx) { - printk("nasrg_ASCTL_DC_send_mbms_ue_notify_req - input parameter is NULL \n"); - return NAS_ERROR_NOTCORRECTVALUE; - } - - // End debug information - p= (struct nas_rg_dc_element *)(gpriv->xbuffer); - p->type = MBMS_UE_NOTIFY_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASMBMSUENotifyReq); - // - p->nasRGDCPrimitive.mbms_ue_notify_req.localConnectionRef = cx->lcr; - - // joined/left services are lists of MAX_MBMS_SERVICES - // -1 means the end of the list - for (i = 0; i < MAX_MBMS_SERVICES; i++) { - p->nasRGDCPrimitive.mbms_ue_notify_req.joined_services[i].mbms_serviceId = (nasMBMSServiceId_t)cx->requested_joined_services[i]; - p->nasRGDCPrimitive.mbms_ue_notify_req.left_services[i].mbms_serviceId = (nasMBMSServiceId_t)cx->requested_left_services[i]; - } - - // - //bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length); - bytes_wrote = nasrg_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)p, p->length); - - if (bytes_wrote==p->length) { -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_send_mbms_ue_notify_req: MBMS_UE_NOTIFY_REQ primitive sent successfully in DC-FIFO\n"); - printk(" lcr (Mobile_id) %u\n",p->nasRGDCPrimitive.mbms_ue_notify_req.localConnectionRef); - printk(" joined service %d, left service %d\n",cx->requested_joined_services[0], cx->requested_left_services[0] ); -#endif - } else - printk("nasrg_ASCTL_DC_send_mbms_ue_notify_req: Message transmission failure to DC-FIFO\n"); - - return bytes_wrote; -} - -//--------------------------------------------------------------------------- -// Request the transfer of data (DC SAP) -void nasrg_ASCTL_DC_send_sig_data_request(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc) -{ - //--------------------------------------------------------------------------- - struct nas_rg_dc_element *p; - int bytes_wrote = 0; -#ifdef PDCP_USE_NETLINK - unsigned char xbuffer[NAS_MESSAGE_MAXLEN]; - int count=0; -#endif - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_send_sig_data - begin \n"); -#endif - - if (!skb || !gc || !cx) { - printk("nasrg_ASCTL_DC_send_sig_data - input parameter is NULL \n"); - return; - } - - // End debug information - if (cx->state!=NAS_CX_DCH) { - printk("nasrg_ASCTL_DC_send_sig_data: Not connected, so the message is dropped\n"); - ++gpriv->stats.tx_dropped; - return; - } - - p = (struct nas_rg_dc_element *)(gpriv->xbuffer); - p->type = DATA_TRANSFER_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASDataReq); - p->nasRGDCPrimitive.data_transfer_req.localConnectionRef = cx->lcr; - p->nasRGDCPrimitive.data_transfer_req.priority = NAS_SIG_SRB3; - p->nasRGDCPrimitive.data_transfer_req.nasDataLength = skb->len; - // - //bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length); -#ifdef PDCP_USE_NETLINK - memcpy(xbuffer,(unsigned char *)p, p->length); - count = p->length; - bytes_wrote = count; -#else - bytes_wrote = nasrg_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)p, p->length); -#endif - - if (bytes_wrote!=p->length) { - printk("nasrg_ASCTL_DC_send_sig_data: Header sent failure in DC-FIFO\n"); - return; - } - - //bytes_wrote += rtf_put(cx->sap[NAS_DC_INPUT_SAPI], skb->data, skb->len); -#ifdef PDCP_USE_NETLINK - memcpy(&(xbuffer[count]),(unsigned char *)skb->data, skb->len); - count += skb->len; - bytes_wrote = nasrg_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], xbuffer, count); -#else - bytes_wrote += nasrg_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)skb->data, skb->len); -#endif - - if (bytes_wrote!=p->length+skb->len) { - printk("nasrg_ASCTL_DC_send_sig_data: Data sent failure in DC-FIFO\n"); - return; - } - - gpriv->stats.tx_bytes += skb->len; - gpriv->stats.tx_packets ++; -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_send_sig_data - end \n"); -#endif -} - -//--------------------------------------------------------------------------- -// Confirm the establishment of a connection (DC channel) -int nasrg_ASCTL_DC_send_eNBmeasurement_req(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- - struct nas_rg_dc_element *p; - int bytes_wrote = 0; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_send_eNBmeasurement_req - begin \n"); -#endif - - if (!cx) { - printk("nasrg_ASCTL_DC_send_eNBmeasurement_req - input parameter cx is NULL \n"); - return NAS_ERROR_NOTCORRECTVALUE; - } - - // End debug information - p= (struct nas_rg_dc_element *)(gpriv->xbuffer); - p->type = ENB_MEASUREMENT_REQ; - p->length = NAS_TL_SIZE + sizeof(struct NASENbMeasureReq); - p->nasRGDCPrimitive.eNBmeasurement_req.cell_id = cx->cellid; - // - //bytes_wrote = rtf_put(cx->sap[NAS_DC_INPUT_SAPI], p, p->length); - bytes_wrote = nasrg_ASCTL_write(cx->sap[NAS_DC_INPUT_SAPI], (unsigned char *)p, p->length); - - if (bytes_wrote==p->length) { -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_send_eNBmeasurement_req: ENB_MEASUREMENT_REQ primitive sent successfully in DC-FIFO\n"); - printk(" cell_id %u\n",p->nasRGDCPrimitive.eNBmeasurement_req.cell_id); -#endif - } else - printk("nasrg_ASCTL_DC_send_eNBmeasurement_req: Message transmission failure to DC-FIFO\n"); - - return bytes_wrote; -} - -/*************************************************************************** - Reception side - ***************************************************************************/ - -//--------------------------------------------------------------------------- -// Decode CONN_ESTABLISH_IND message from RRC -void nasrg_ASCTL_DC_decode_cx_establish_ind(struct cx_entity *cx, struct nas_rg_dc_element *p) -{ - //--------------------------------------------------------------------------- - int i; - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_cx_establish - begin \n"); -#endif - - if (!cx || !p) { - printk("nasrg_ASCTL_DC_decode_cx_establish - input parameter is NULL \n"); - return; - } - - // End debug information - if (nasrg_ASCTL_DC_send_cx_establish_confirm(cx, ACCEPTED)>0) { - nasrg_TOOL_imei2iid(p->nasRGDCPrimitive.conn_establish_ind.InterfaceIMEI, (uint8_t *)cx->iid6); - cx->iid4=97; // A AUTOMATISER - cx->lcr = p->nasRGDCPrimitive.conn_establish_ind.localConnectionRef; - cx->state=NAS_CX_DCH; -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_cx_establish: CONN_ESTABLISH_IND reception\n"); - printk(" primitive length %d\n",p->length); - printk(" Local Connection reference %d\n",p->nasRGDCPrimitive.conn_establish_ind.localConnectionRef); - printk(" IMEI "); - - for (i=0; i<14; ++i) - printk("%u",p->nasRGDCPrimitive.conn_establish_ind.InterfaceIMEI[i]); - - printk(" state "); - nasrg_TOOL_print_state(cx->state); -#endif - } -} - -//--------------------------------------------------------------------------- -// Decode CONN_RELEASE_IND message from RRC -void nasrg_ASCTL_DC_decode_cx_release_ind(struct cx_entity *cx, struct nas_rg_dc_element *p) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_cx_release - begin \n"); -#endif - - if (!cx || !p) { - printk("nasrg_ASCTL_DC_decode_cx_release - input parameter is NULL \n"); - return; - } - - // End debug information - cx->state=NAS_IDLE; - cx->iid4=0; - nasrg_TOOL_imei2iid(NAS_NULL_IMEI, (uint8_t *)cx->iid6); - nasrg_COMMON_flush_rb(cx); - nasrg_CLASS_flush_sclassifier(cx); -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_cx_release: CONN_RELEASE_IND reception\n"); - printk(" Primitive length %u\n",p->length); - printk(" Local Connection reference %u\n",p->nasRGDCPrimitive.conn_release_ind.localConnectionRef); - printk(" Release cause %u\n",p->nasRGDCPrimitive.conn_release_ind.releaseCause); - nasrg_TOOL_print_state(cx->state); -#endif -} - -//--------------------------------------------------------------------------- -// Decode CONN_LOSS_IND message from RRC -void nasrg_ASCTL_DC_decode_cx_loss_ind(struct cx_entity *cx, struct nas_rg_dc_element *p) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_cx_loss - begin \n"); -#endif - - if (!cx || !p) { - printk("nasrg_ASCTL_DC_decode_cx_loss - input parameter is NULL \n"); - return; - } - - // End debug information - cx->state = NAS_IDLE; - cx->iid4=0; - nasrg_TOOL_imei2iid(NAS_NULL_IMEI, (uint8_t *)cx->iid6); - nasrg_COMMON_flush_rb(cx); -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_cx_loss: CONN_LOSS_IND reception\n"); - printk(" Primitive length %u\n",(int)(p->length)); - printk(" Local Connection reference %u\n",p->nasRGDCPrimitive.conn_loss_ind.localConnectionRef); - nasrg_TOOL_print_state(cx->state); -#endif -} -//--------------------------------------------------------------------------- -// Decode RB_ESTABLISH_CNF message from RRC -void nasrg_ASCTL_DC_decode_rb_establish_cnf(struct cx_entity *cx, struct nas_rg_dc_element *p) -{ - //--------------------------------------------------------------------------- - struct rb_entity *rb; - int rb_id; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_rb_establish - begin \n"); -#endif - - if (!cx || !p) { - printk("nasrg_ASCTL_DC_decode_rb_establish - input parameter is NULL \n"); - return; - } - - // End debug information - rb_id = p->nasRGDCPrimitive.rb_establish_conf.rbId; - rb=nasrg_COMMON_search_rb(cx, rb_id - (NAS_RB_MAX_NUM * cx->lcr)); - - // - if (rb!=NULL) { - if (rb->state==NAS_CX_CONNECTING) { -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_rb_establish: RB_ESTABLISH_CNF received\n"); - printk(" Primitive length %u\n", p->length); - printk(" Local Connection reference %u\n",p->nasRGDCPrimitive.rb_establish_conf.localConnectionRef); - printk(" RB Id %u\n",p->nasRGDCPrimitive.rb_establish_conf.rbId); - printk(" SAP Id %u\n",p->nasRGDCPrimitive.rb_establish_conf.sapId); - printk(" Status %u, Failure code %d, Cx state, RB state\n",p->nasRGDCPrimitive.rb_establish_conf.status, p->nasRGDCPrimitive.rb_establish_conf.fail_code); - nasrg_TOOL_print_state(cx->state); - nasrg_TOOL_print_state(rb->state); -#endif - - switch (p->nasRGDCPrimitive.rb_establish_conf.status) { - case ACCEPTED: - rb->state = NAS_CX_DCH; - rb->countimer=1; - break; - - case FAILURE: - printk("nasrg_ASCTL_DC_decode_rb_establish: RB_ESTABLISH_CNF rejected\n"); - rb->state = NAS_CX_CONNECTING_FAILURE; - //delete rb - break; - - default: - printk("nasrg_ASCTL_DC_decode_rb_establish: RB_ESTABLISH_CNF reception, invalid status\n"); - } - } else - printk("nasrg_ASCTL_DC_decode_rb_establish: invalid state %u\n", cx->state); - } else - printk("nasrg_ASCTL_DC_decode_rb_establish: RB_ESTABLISH_CNF, No corresponding radio bearer\n"); -} - -//--------------------------------------------------------------------------- -// Decode DATA_TRANSFER_IND message from RRC -void nasrg_ASCTL_DC_decode_data_transfer_ind(struct cx_entity *cx, struct nas_rg_dc_element *p, char *buffer) -{ - //--------------------------------------------------------------------------- - uint8_t nasrg_data[10]; - unsigned int nas_length; - char data_type; - int bytes_read=0; - unsigned int peer_command; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_data_transfer - begin \n"); -#endif - - if (!cx || !p) { - printk("nasrg_ASCTL_DC_decode_data_transfer - input parameter is NULL \n"); - return; - } - - // End debug information - - bytes_read=p->length; - // Get first character - nas_length = (p->nasRGDCPrimitive.data_transfer_ind.nasDataLength) -1; -#ifndef PDCP_USE_NETLINK - bytes_read += rtf_get(cx->sap[NAS_DC_OUTPUT_SAPI], &data_type, 1); -#else - memcpy (&data_type, (char *)(&buffer[bytes_read]), 1); - bytes_read ++; -#endif - - //check if peer message - if (data_type =='A') { - // receive in a skbuff - //nasrg_COMMON_receive((p->length) + 1, nas_length, cx->sap[NAS_DC_OUTPUT_SAPI]); // original -#ifndef PDCP_USE_NETLINK - //void nasrg_COMMON_receive(uint16_t bytes_read, uint16_t payload_length, void *data_buffer, int rb_id, int sap); - // data_buffer is NULL because FIFO should be read directly in the skbuff (LITE has an intermediary buffer) - nasrg_COMMON_receive((p->length) + 1, nas_length, NULL, 2, cx->sap[NAS_DC_OUTPUT_SAPI]); -#else - //nasrg_COMMON_receive((p->length) + 1, nas_length, (unsigned char *)p+p->length+1, 2, 0); - nasrg_COMMON_receive((p->length) + 1, nas_length, (unsigned char *)(&buffer[bytes_read]), 2, 0); -#endif - } else { - // if FIFO, empty remaining data -#ifndef PDCP_USE_NETLINK - bytes_read += rtf_get(cx->sap[NAS_DC_OUTPUT_SAPI], (gpriv->rbuffer)+ (p->length), nas_length); -#endif - - if (data_type=='Z') { -#ifndef PDCP_USE_NETLINK - memcpy (&nasrg_data, (char *)(gpriv->rbuffer)+ (p->length), 10); -#else - memcpy (&nasrg_data, (char *)(&buffer[bytes_read]), 10); -#endif - peer_command = (int)nasrg_data[0]; - printk("nasrg_ASCTL_DC_decode_data_transfer: Received peer message %d %d \n", nasrg_data[0], peer_command); - nasrg_TOOL_print_buffer(nasrg_data, 10); - - if (nasrg_data[0]== NAS_CMD_OPEN_RB) { - // open radio bearer - printk("nasrg_ASCTL_DC_decode_data_transfer: Opening Default Radio Bearer\n"); - nasrg_ASCTL_start_default_rb(cx); - } else if (nasrg_data[0]== NAS_CMD_ENTER_SLEEP) { - printk("nasrg_ASCTL_DC_decode_data_transfer: Entering Sleep Mode\n"); - cx->state = NAS_CX_RELEASING; - } else if (nasrg_data[0]== NAS_CMD_LEAVE_SLEEP) { - printk("nasrg_ASCTL_DC_decode_data_transfer: Leaving Sleep Mode\n"); - cx->state = NAS_CX_DCH; - } else { - printk("\n\nnasrg_ASCTL_DC_decode_data_transfer: Unknown peer command\n"); - } - } else - printk("nasrg_ASCTL_DC_decode_data_transfer: Error during reception of the message - Dropped\n"); - } - -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_data_transfer: DATA_TRANSFER_IND reception\n"); - printk(" Primitive length %u\n", p->length); - printk(" Local Connection reference %u\n",p->nasRGDCPrimitive.data_transfer_ind.localConnectionRef); - printk(" Data Length %u\n", p->nasRGDCPrimitive.data_transfer_ind.nasDataLength); - nasrg_TOOL_print_state(cx->state); -#endif -} - -//--------------------------------------------------------------------------- -// Decode MBMS_BEARER_ESTABLISH_CNF message from RRC -void nasrg_ASCTL_DC_decode_mbms_bearer_establish_cnf(struct nas_rg_dc_element *p) -{ - //--------------------------------------------------------------------------- - int mbms_ix; - int rb_id; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_mbms_bearer_establish - begin \n"); -#endif - - if (!p) { - printk("nasrg_ASCTL_DC_decode_mbms_bearer_establish - input parameter is NULL \n"); - return; - } - - // End debug information - rb_id = p->nasRGDCPrimitive.mbms_establish_cnf.rbId; - mbms_ix = 0; // A revoir - find using cnxid... - - if (rb_id == gpriv->mbms_rb[mbms_ix].mbms_rbId) { - switch (p->nasRGDCPrimitive.mbms_establish_cnf.status) { - case ACCEPTED: - gpriv->mbms_rb[mbms_ix].state = NAS_CX_DCH; - gpriv->mbms_rb[mbms_ix].rab_id = gpriv->mbms_rb[mbms_ix].mbms_rbId; - nasrg_ASCTL_start_mbmsclassifier(mbms_ix,&(gpriv->mbms_rb[mbms_ix])); - break; - - case FAILURE: - printk("nasrg_ASCTL_DC_decode_mbms_bearer_establish: MBMS_BEARER_ESTABLISH_CNF rejected\n"); - gpriv->mbms_rb[mbms_ix].state = NAS_CX_CONNECTING_FAILURE; //supprimer l'entree - break; - - default: - printk("nasrg_ASCTL_DC_decode_mbms_bearer_establish: MBMS_BEARER_ESTABLISH_CNF reception, invalid status\n"); - } - } else - printk(" nasrg_ASCTL_DC_decode_mbms_bearer_establish: invalid RB_Id %d\n", rb_id); - -#ifdef NAS_DEBUG_DC - printk(" nasrg_ASCTL_DC_decode_mbms_bearer_establish: MBMS_BEARER_ESTABLISH_CNF reception\n"); - printk(" Primitive length %u\n",p->length); - printk(" rb_id %d, status %d\n",p->nasRGDCPrimitive.mbms_establish_cnf.rbId, p->nasRGDCPrimitive.mbms_establish_cnf.status); - nasrg_TOOL_print_state(gpriv->mbms_rb[mbms_ix].state); -#endif -} - -//--------------------------------------------------------------------------- -// Decode MBMS_UE_NOTIFY_CNF message from RRC -void nasrg_ASCTL_DC_decode_mbms_ue_notify_cnf(struct cx_entity *cx, struct nas_rg_dc_element *p) -{ - //--------------------------------------------------------------------------- - int i, j, k; - - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_mbms_ue_notify - begin \n"); -#endif - - if (!cx || !p) { - printk("nasrg_ASCTL_DC_decode_mbms_ue_notify - input parameter is NULL \n"); - return; - } - - // End debug information - if (p->nasRGDCPrimitive.mbms_ue_notify_cnf.mbmsStatus == ACCEPTED) { - for (i = 0; irequested_joined_services[i] >=0) { - for (j = 0; jjoined_services[j] ==-1) { - cx->joined_services[j]= cx->requested_joined_services[i]; - cx->requested_joined_services[i]=-1; - break; - } - } - } - - if (cx->requested_left_services[i] >=0) { - for (k = 0; kjoined_services[k] == cx->requested_left_services[i]) { - cx->joined_services[k]=-1; - cx->requested_left_services[i]=-1; - break; - } - } - } - } - } - -#ifdef NAS_DEBUG_DC - printk(" nasrg_ASCTL_DC_decode_mbms_ue_notify: MBMS_UE_NOTIFY_CNF reception\n"); - printk(" Primitive length %u\n",p->length); - printk(" Local Connection reference %u\n",p->nasRGDCPrimitive.mbms_ue_notify_cnf.localConnectionRef); - printk(" MBMS Status: %d\n", p->nasRGDCPrimitive.mbms_ue_notify_cnf.mbmsStatus); - printk(" UE services currently joined \n"); - - for (i = 0; ijoined_services[i]); - - nasrg_TOOL_print_state(cx->state); -#endif -} -/* - msgToBuild->nasRgPrimitive.dc_sap_prim.nasRGDCPrimitive.eNBmeasurement_ind.cell_id = protocol_bs->rrc.rg_cell_id; - // next values are temp hard coded, to be replaced by real values - msgToBuild->nasRgPrimitive.dc_sap_prim.nasRGDCPrimitive.eNBmeasurement_ind.num_UEs = num_connected_UEs; - for (ix=0; ixnum_connected_UEs; ix++){ - msgToBuild->nasRgPrimitive.dc_sap_prim.nasRGDCPrimitive.eNBmeasurement_ind.measures[ix].rlcBufferOccupancy = 100 - (30*ix); - msgToBuild->nasRgPrimitive.dc_sap_prim.nasRGDCPrimitive.eNBmeasurement_ind.measures[ix].scheduledPRB = 500 - (200*ix); - msgToBuild->nasRgPrimitive.dc_sap_prim.nasRGDCPrimitive.eNBmeasurement_ind.measures[ix].totalDataVolume = 640000 + (160000*ix); - } - msgToBuild->nasRgPrimitive.dc_sap_prim.nasRGDCPrimitive.eNBmeasurement_ind.totalNumPRBs = 1000; - -*/ -//--------------------------------------------------------------------------- -// Decode ENB_MEASUREMENT_IND message from RRC -void nasrg_ASCTL_DC_decode_eNBmeasurement_ind(struct nas_rg_dc_element *p) -{ - //--------------------------------------------------------------------------- - uint8_t i; - // Start debug information -#ifdef NAS_DEBUG_DC - printk("nasrg_ASCTL_DC_decode_eNBmeasurement_ind - begin \n"); -#endif - - if (!p) { - printk("nasrg_ASCTL_DC_decode_eNBmeasurement_ind - input parameter p is NULL \n"); - return; - } - - // End debug information -#ifdef NAS_DEBUG_DC_DETAIL - printk(" nasrg_ASCTL_DC_decode_eNBmeasurement_ind : ENB_MEASUREMENT_IND reception\n"); - printk(" Measured Cell: %u\n", p->nasRGDCPrimitive.eNBmeasurement_ind.cell_id); - printk(" Number of Connected Mobiles: %u\n", p->nasRGDCPrimitive.eNBmeasurement_ind.num_UEs); - - for (i=0; inasRGDCPrimitive.eNBmeasurement_ind.num_UEs; ++i) { - printk(" UE[%u]: rlcBufferOccupancy %u, scheduledPRB: %u, totalDataVolume: %u\n", i, - p->nasRGDCPrimitive.eNBmeasurement_ind.measures[i].rlcBufferOccupancy, - p->nasRGDCPrimitive.eNBmeasurement_ind.measures[i].scheduledPRB, - p->nasRGDCPrimitive.eNBmeasurement_ind.measures[i].totalDataVolume); - } - - printk(" Total number of PRBs: %u\n", p->nasRGDCPrimitive.eNBmeasurement_ind.totalNumPRBs); -#endif - // store Measures - gpriv->measured_cell_id = p->nasRGDCPrimitive.eNBmeasurement_ind.cell_id; - gpriv->num_UEs = p->nasRGDCPrimitive.eNBmeasurement_ind.num_UEs; - - for (i=0; i num_UEs; ++i) { - gpriv->rlcBufferOccupancy[i] = p->nasRGDCPrimitive.eNBmeasurement_ind.measures[i].rlcBufferOccupancy; - gpriv->scheduledPRB[i] += p->nasRGDCPrimitive.eNBmeasurement_ind.measures[i].scheduledPRB; - gpriv->totalDataVolume[i] += p->nasRGDCPrimitive.eNBmeasurement_ind.measures[i].totalDataVolume; - } - - gpriv->totalNumPRBs += p->nasRGDCPrimitive.eNBmeasurement_ind.totalNumPRBs; -} - -//--------------------------------------------------------------------------- -// Check if anything in DC FIFO and process it (RG Finite State Machine) -int nasrg_ASCTL_DC_receive(struct cx_entity *cx, char *buffer) -{ - //--------------------------------------------------------------------------- - int bytes_read=0; - - // Start debug information -#ifdef NAS_DEBUG_DC_DETAIL - printk("nasrg_ASCTL_DC_receive - begin \n"); -#endif - - if (!cx) { - printk("nasrg_ASCTL_DC_receive - input parameter cx is NULL \n"); - return 0; - } - - // End debug information - -#ifndef PDCP_USE_NETLINK - bytes_read = rtf_get(cx->sap[NAS_DC_OUTPUT_SAPI] , gpriv->rbuffer, NAS_TL_SIZE); -#else - bytes_read = NAS_TL_SIZE; -#endif - - if (bytes_read>0) { - struct nas_rg_dc_element *p; -#ifndef PDCP_USE_NETLINK - p= (struct nas_rg_dc_element *)(gpriv->rbuffer); - //get the rest of the primitive - bytes_read += rtf_get(cx->sap[NAS_DC_OUTPUT_SAPI], (uint8_t *)p+NAS_TL_SIZE, p->length-NAS_TL_SIZE); - - if (bytes_read!=p->length) { - printk("nasrg_ASCTL_DC_receive: Problem while reading primitive's header\n"); - return bytes_read; - } - -#else - p= (struct nas_rg_dc_element *)(buffer); - bytes_read=p->length; -#endif - - switch (p->type) { - case CONN_ESTABLISH_IND : - if (p->nasRGDCPrimitive.conn_establish_ind.localConnectionRef!=cx->lcr) - printk("nasrg_ASCTL_DC_receive: CONN_ESTABLISH_IND reception, Local connection reference not correct %u\n", p->nasRGDCPrimitive.conn_establish_ind.localConnectionRef); - else { - switch(cx->state) { - case NAS_IDLE: - nasrg_ASCTL_DC_decode_cx_establish_ind(cx,p); - break; - - default: - printk("nasrg_ASCTL_DC_receive: CONN_ESTABLISH_IND reception, invalid state %u\n", cx->state); - } - } - - break; - - case CONN_RELEASE_IND : - if (p->nasRGDCPrimitive.conn_release_ind.localConnectionRef!=cx->lcr) - printk("nasrg_ASCTL_DC_receive: CONN_RELEASE_IND reception, Local connection reference not correct %u\n", p->nasRGDCPrimitive.conn_release_ind.localConnectionRef); - else { - switch(cx->state) { - case NAS_CX_DCH: - nasrg_ASCTL_DC_decode_cx_release_ind(cx,p); - break; - - default: - printk("nasrg_ASCTL_DC_receive: CONN_RELEASE_IND reception, invalid state %u\n", cx->state); - } - } - - break; - - case CONN_LOSS_IND: - if (p->nasRGDCPrimitive.conn_loss_ind.localConnectionRef!=cx->lcr) - printk("nasrg_ASCTL_DC_receive: CONN_LOSS_IND reception, Local connection reference not correct %u\n", p->nasRGDCPrimitive.conn_loss_ind.localConnectionRef); - else { - switch(cx->state) { - case NAS_CX_DCH: - nasrg_ASCTL_DC_decode_cx_loss_ind(cx,p); - break; - - default: - printk("nasrg_ASCTL_DC_receive: CONN_LOSS_IND reception, invalid state %u\n", cx->state); - } - } - - break; - - case RB_ESTABLISH_CNF: - if (p->nasRGDCPrimitive.rb_establish_conf.localConnectionRef!=cx->lcr) - printk("nasrg_ASCTL_DC_receive: RB_ESTABLISH_CNF reception, Local connection reference not correct %u\n", p->nasRGDCPrimitive.rb_establish_conf.localConnectionRef); - else { - switch(cx->state) { - case NAS_CX_DCH: - nasrg_ASCTL_DC_decode_rb_establish_cnf(cx,p); -#ifdef NAS_AUTO_MBMS - nasrg_ASCTL_start_default_ue_notification(cx); -#endif - break; - - default: - printk("nasrg_ASCTL_DC_receive: RB_ESTABLISH_CNF reception, invalid state %u\n", cx->state); - } - } - - break; - - case DATA_TRANSFER_IND: - if (p->nasRGDCPrimitive.data_transfer_ind.localConnectionRef!=cx->lcr) - printk("nasrg_ASCTL_DC_receive: DATA_TRANSFER_IND reception, Local connection reference not correct %u\n", p->nasRGDCPrimitive.rb_establish_conf.localConnectionRef); - else { - switch(cx->state) { - case NAS_CX_DCH: - case NAS_CX_RELEASING: - nasrg_ASCTL_DC_decode_data_transfer_ind(cx,p,buffer); - break; - - default: - printk("nasrg_ASCTL_DC_receive: DATA_TRANSFER_IND reception, invalid state %u\n", cx->state); - } - } - - break; - - // Temp - Should be in uplink GC-SAP - case MBMS_BEARER_ESTABLISH_CNF: - // if (p->nasRGDCPrimitive.mbms_ue_notify_cnf.localConnectionRef!=cx->lcr) - // printk("nasrg_ASCTL_DC_receive: MBMS_BEARER_ESTABLISH_CNF reception, Local connection reference not correct %u\n", p->nasRGDCPrimitive.rb_establish_conf.localConnectionRef); - // else - nasrg_ASCTL_DC_decode_mbms_bearer_establish_cnf(p); - break; - - case MBMS_UE_NOTIFY_CNF: - if (p->nasRGDCPrimitive.mbms_ue_notify_cnf.localConnectionRef!=cx->lcr) - printk("nasrg_ASCTL_DC_receive: MBMS_UE_NOTIFY_CNF reception, Local connection reference not correct %u\n", p->nasRGDCPrimitive.rb_establish_conf.localConnectionRef); - else { - switch(cx->state) { - case NAS_CX_DCH: - nasrg_ASCTL_DC_decode_mbms_ue_notify_cnf(cx,p); - /* //Temp - nasrg_ASCTL_start_default_mbms_service();*/ - break; - - default: - printk("nasrg_ASCTL_DC_receive: MBMS_UE_NOTIFY_CNF reception, invalid state %u\n", cx->state); - } - } - - break; - - // Temp - Should be in uplink GC-SAP - case ENB_MEASUREMENT_IND : - // if (p->nasRGDCPrimitive.eNBmeasurement_ind.localConnectionRef!=cx->lcr) - // printk("nasrg_ASCTL_DC_receive: ENB_MEASUREMENT_IND reception, Local connection reference not correct %u\n", p->nasRGDCPrimitive.eNBmeasurement_ind.localConnectionRef); - // else - nasrg_ASCTL_DC_decode_eNBmeasurement_ind(p); - break; - - default : - printk("nasrg_ASCTL_DC_receive: Invalid message received\n"); - } - } - - return bytes_read; -} - -#endif diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c deleted file mode 100755 index 5bacf88de2..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_classifier.c +++ /dev/null @@ -1,1146 +0,0 @@ -/*************************************************************************** - nasrg_classifier.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasrg_classifier.c -* \brief Flow classification functions for OpenAirInterface CELLULAR version - RG -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#include "nasrg_variables.h" -#include "nasrg_proto.h" - -#include -#include - -#define IN_CLASSA(a) ((((long int) (a)) & 0x80000000) == 0) -#define IN_CLASSB(a) ((((long int) (a)) & 0xc0000000) == 0x80000000) -#define IN_CLASSC(a) ((((long int) (a)) & 0xe0000000) == 0xc0000000) -#define IN_CLASSD(a) ((((long int) (a)) & 0xf0000000) == 0xe0000000) - -/* Address to accept any incoming messages. */ -#define INADDR_ANY ((unsigned long int) 0x00000000) - -#define NIPADDR(addr) \ - (uint8_t)(addr & 0x000000FF), \ - (uint8_t)((addr & 0x0000FF00) >> 8), \ - (uint8_t)((addr & 0x00FF0000) >> 16), \ - (uint8_t)((addr & 0xFF000000) >> 24) - -#define NIP6ADDR(addr) \ - ntohs((addr)->s6_addr16[0]), \ - ntohs((addr)->s6_addr16[1]), \ - ntohs((addr)->s6_addr16[2]), \ - ntohs((addr)->s6_addr16[3]), \ - ntohs((addr)->s6_addr16[4]), \ - ntohs((addr)->s6_addr16[5]), \ - ntohs((addr)->s6_addr16[6]), \ - ntohs((addr)->s6_addr16[7]) - - -#define IN6_IS_ADDR_UNSPECIFIED(a) \ - (((__const uint32_t *) (a))[0] == 0 \ - && ((__const uint32_t *) (a))[1] == 0 \ - && ((__const uint32_t *) (a))[2] == 0 \ - && ((__const uint32_t *) (a))[3] == 0) - -#define IN6_ARE_ADDR_MASKED_EQUAL(a,b,m) \ - (((((__const uint32_t *) (a))[0] & (((__const uint32_t *) (m))[0])) == (((__const uint32_t *) (b))[0] & (((__const uint32_t *) (m))[0]))) \ - && ((((__const uint32_t *) (a))[1] & (((__const uint32_t *) (m))[1])) == (((__const uint32_t *) (b))[1] & (((__const uint32_t *) (m))[1]))) \ - && ((((__const uint32_t *) (a))[2] & (((__const uint32_t *) (m))[2])) == (((__const uint32_t *) (b))[2] & (((__const uint32_t *) (m))[2]))) \ - && ((((__const uint32_t *) (a))[3] & (((__const uint32_t *) (m))[3])) == (((__const uint32_t *) (b))[3] & (((__const uint32_t *) (m))[3])))) - -#define IN_ARE_ADDR_MASKED_EQUAL(a,b,m) \ - (((((__const uint8_t *) (a))[0] & (((__const uint8_t *) (m))[0])) == (((__const uint8_t *) (b))[0] & (((__const uint8_t *) (m))[0]))) \ - && ((((__const uint8_t *) (a))[1] & (((__const uint8_t *) (m))[1])) == (((__const uint8_t *) (b))[1] & (((__const uint8_t *) (m))[1]))) \ - && ((((__const uint8_t *) (a))[2] & (((__const uint8_t *) (m))[2])) == (((__const uint8_t *) (b))[2] & (((__const uint8_t *) (m))[2]))) \ - && ((((__const uint8_t *) (a))[3] & (((__const uint8_t *) (m))[3])) == (((__const uint8_t *) (b))[3] & (((__const uint8_t *) (m))[3])))) - -//--------------------------------------------------------------------------- -void nasrg_create_mask_ipv6_addr(struct in6_addr *masked_addrP, int prefix_len) -{ - //--------------------------------------------------------------------------- - int u6_addr8_index; - int u6_addr1_index; - int index; - - masked_addrP->s6_addr32[0] = 0xFFFFFFFF; - masked_addrP->s6_addr32[1] = 0xFFFFFFFF; - masked_addrP->s6_addr32[2] = 0xFFFFFFFF; - masked_addrP->s6_addr32[3] = 0xFFFFFFFF; - - u6_addr8_index = prefix_len >> 3; - u6_addr1_index = prefix_len & 0x07; - - for (index = u6_addr8_index + 1; index < 16; index++) { - masked_addrP->s6_addr[index] = 0; - } - - if (u6_addr1_index > 0) { - masked_addrP->s6_addr[u6_addr8_index] = 0xFF << (8-u6_addr1_index); - } - -#ifdef NAS_DEBUG_CLASS - //printk("nasrg_create_mask_ipv6_addr: MASK = %X:%X:%X:%X:%X:%X:%X:%X\n",NIP6ADDR(masked_addrP)); -#endif -} -//--------------------------------------------------------------------------- -void nasrg_create_mask_ipv4_addr(struct in_addr *masked_addrP, int prefix_len) -{ - //--------------------------------------------------------------------------- - if (prefix_len > 32) { - prefix_len = 32; - } - - masked_addrP->s_addr = 0xFFFFFFFF << (32 - prefix_len); -#ifdef NAS_DEBUG_CLASS - //printk("nasrg_create_mask_ipv4_addr: MASK = %d.%d.%d.%d\n",NIPADDR(masked_addrP)); -#endif - return; -} - -//--------------------------------------------------------------------------- -// Add a new classifier rule (send direction) -struct classifier_entity *nasrg_CLASS_add_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_add_sclassifier: begin for dscp %d, classref %d\n", dscp,classref); -#endif - - if (cx==NULL) { - printk("nasrg_CLASS_add_sclassifier - input parameter cx is NULL \n"); - return NULL; - } - - //*** - for (gc=cx->sclassifier[dscp]; gc!=NULL; gc=gc->next) { - if (gc->classref==classref) { -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_add_sclassifier: classifier already exist for dscp %d, classref %d\n",dscp,classref); -#endif - return gc; - } - } - - gc=(struct classifier_entity *)kmalloc(sizeof(struct classifier_entity), GFP_ATOMIC); - - if (gc==NULL) - return NULL; - - memset(gc, 0, sizeof(struct classifier_entity)); - gc->next=cx->sclassifier[dscp]; - gc->classref=classref; - cx->sclassifier[dscp]=gc; - ++cx->nsclassifier; - ++gpriv->next_sclassref; //increment send classref index - MW 15/01/07 -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_add_sclassifier: classifier created for dscp %d, classref %d\n",dscp,classref); -#endif - return gc; -} - -//--------------------------------------------------------------------------- -// Add a new classifier rule (receive direction) -struct classifier_entity *nasrg_CLASS_add_rclassifier(uint8_t dscp, uint16_t classref) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_add_rclassifier: begin\n"); -#endif - - //*** - for (gc=gpriv->rclassifier[dscp]; gc!=NULL; gc=gc->next) { - if (gc->classref==classref) { -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_add_rclassifier: classifier already exist for dscp %d, classref %d\n",dscp,classref); -#endif - return gc; - } - } - - gc=(struct classifier_entity *)kmalloc(sizeof(struct classifier_entity), GFP_KERNEL); - - if (gc==NULL) - return NULL; - - gc->next=gpriv->rclassifier[dscp]; - gc->classref=classref; - gpriv->rclassifier[dscp]=gc; - ++gpriv->nrclassifier; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_add_rclassifier: classifier created for dscp %d, classref %d\n",dscp,classref); -#endif - return gc; -} - -//--------------------------------------------------------------------------- -// Add a new classifier rule (mbms direction) -struct classifier_entity *nasrg_CLASS_add_mbmsclassifier(int mbms_ix, uint16_t classref) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_add_mbmsclassifier: begin\n"); -#endif - - //*** - for (gc=gpriv->mbmsclassifier[mbms_ix]; gc!=NULL; gc=gc->next) { - if (gc->classref==classref) { -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_add_mbmsclassifier: classifier already exist for service %d, classref %d\n",mbms_ix,classref); -#endif - return gc; - } - } - - gc=(struct classifier_entity *)kmalloc(sizeof(struct classifier_entity), GFP_ATOMIC); - - if (gc==NULL) - return NULL; - - gc->next=gpriv->mbmsclassifier[mbms_ix]; - gc->classref=classref; - gpriv->mbmsclassifier[mbms_ix]=gc; - ++gpriv->nmbmsclassifier; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_add_mbmsclassifier: classifier created for service index %d, classref %d\n",mbms_ix,classref); -#endif - return gc; -} - -//--------------------------------------------------------------------------- -void nasrg_CLASS_flush_sclassifier(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- - uint8_t dscpi; - struct classifier_entity *gc; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_flush_sclassifier: begin\n"); -#endif - - if (cx==NULL) { - printk("nasrg_CLASS_flush_sclassifier - input parameter cx is NULL \n"); - return; - } - - //*** - for (dscpi=0; dscpisclassifier[dscpi]; gc!=NULL; gc=cx->sclassifier[dscpi]) { - cx->sclassifier[dscpi]=gc->next; - kfree(gc); - } - } - - cx->nsclassifier=0; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_flush_sclassifier: end\n"); -#endif -} - -//--------------------------------------------------------------------------- -void nasrg_CLASS_flush_rclassifier() -{ - //--------------------------------------------------------------------------- - uint8_t dscpi; - struct classifier_entity *gc; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_flush_rclassifier: begin\n"); -#endif - - //*** - for (dscpi=0; dscpirclassifier[dscpi]; gc!=NULL; gc=gpriv->rclassifier[dscpi]) { - gpriv->rclassifier[dscpi]=gc->next; - kfree(gc); - } - } - - gpriv->nrclassifier=0; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_flush_rclassifier: end\n"); -#endif -} - -//--------------------------------------------------------------------------- -void nasrg_CLASS_flush_mbmsclassifier() -{ - //--------------------------------------------------------------------------- - int mbmsi; - struct classifier_entity *gc; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_flush_mbmsclassifier: begin\n"); -#endif - - //*** - for (mbmsi=0; mbmsimbmsclassifier[mbmsi]; gc!=NULL; gc=gpriv->mbmsclassifier[mbmsi]) { - gpriv->mbmsclassifier[mbmsi]=gc->next; - kfree(gc); - } - } - - gpriv->nmbmsclassifier=0; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_flush_mbmsclassifier: end\n"); -#endif -} - -//--------------------------------------------------------------------------- -// Delete a classifier rule (send direction) -void nasrg_CLASS_del_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *p,*np; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_del_sclassifier: begin\n"); -#endif - - if (cx==NULL) { - printk("nasrg_CLASS_del_sclassifier - input parameter cx is NULL \n"); - return; - } - - //*** - p=cx->sclassifier[dscp]; - - if (p==NULL) - return; - - if (p->classref==classref) { - cx->sclassifier[dscp]=p->next; - kfree(p); - --cx->nsclassifier; - return; - } - - for (np=p->next; np!=NULL; p=np) { - if (np->classref==classref) { - p->next=np->next; - kfree(np); - --cx->nsclassifier; - return; - } - } - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_del_sclassifier: end\n"); -#endif -} - -//--------------------------------------------------------------------------- -// Delete a classifier rule (receive direction) -void nasrg_CLASS_del_rclassifier(uint8_t dscp, uint16_t classref) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *p,*np; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_del_rclassifier: begin\n"); -#endif - //*** - p=gpriv->rclassifier[dscp]; - - if (p==NULL) - return; - - if (p->classref==classref) { - gpriv->rclassifier[dscp]=p->next; - kfree(p); - --gpriv->nrclassifier; - return; - } - - for (np=p->next; np!=NULL; p=np) { - if (np->classref==classref) { - p->next=np->next; - kfree(np); - --gpriv->nrclassifier; - return; - } - } - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_del_rclassifier: end\n"); -#endif -} - -//--------------------------------------------------------------------------- -// Delete a classifier rule (mbms direction) -void nasrg_CLASS_del_mbmsclassifier(int mbms_ix, uint16_t classref) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *p,*np; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_del_mbmsclassifier: begin\n"); -#endif - //*** - p=gpriv->mbmsclassifier[mbms_ix]; - - if (p==NULL) - return; - - if (p->classref==classref) { - gpriv->mbmsclassifier[mbms_ix]=p->next; - kfree(p); - --gpriv->nmbmsclassifier; - return; - } - - for (np=p->next; np!=NULL; p=np) { - if (np->classref==classref) { - p->next=np->next; - kfree(np); - --gpriv->nmbmsclassifier; - return; - } - } - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_del_mbmsclassifier: end\n"); -#endif -} - -/* ORIGINAL VERSION -//--------------------------------------------------------------------------- -// Search the entity with the IPv4 address 'addr' -struct cx_entity *nasrg_CLASS_cx4(struct sk_buff *skb){ -//--------------------------------------------------------------------------- - uint8_t cxi; - #ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx4: begin\n"); - #endif - cxi=0; - return gpriv->cx+cxi; -//#endif -}*/ - -//--------------------------------------------------------------------------- -// Search the entity with the IPv4 address 'addr' -struct cx_entity *nasrg_CLASS_cx4(struct sk_buff *skb, unsigned char dscp, int *paddr_type, unsigned char *cx_index) -{ - //--------------------------------------------------------------------------- - unsigned char cxi; - uint32_t daddr; - struct cx_entity *cx=NULL; - struct classifier_entity *pclassifier=NULL; - struct in_addr masked_addr; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx4: begin\n"); -#endif - - if (skb!=NULL) { - daddr = ((struct iphdr*)(skb_network_header(skb)))->daddr; - - if (daddr != INADDR_ANY) { -#ifdef NAS_DEBUG_CLASS - printk("SOURCE ADDR %d.%d.%d.%d",NIPADDR(ip_hdr(skb)->saddr)); - printk(" DEST ADDR %d.%d.%d.%d\n",NIPADDR(ip_hdr(skb)->daddr)); -#endif - - if (ipv4_is_multicast(ip_hdr(skb)->daddr)) { - // TO BE CHECKED - *paddr_type = NAS_IPV4_ADDR_MC_SIGNALLING; - } else { - if (ipv4_is_lbcast(ip_hdr(skb)->daddr)) { - // TO BE CHECKED - *paddr_type = NAS_IPV4_ADDR_BROADCAST; - } else { - if (IN_CLASSA(ip_hdr(skb)->daddr) || IN_CLASSB(ip_hdr(skb)->daddr) || IN_CLASSC(ip_hdr(skb)->daddr)) { - *paddr_type = NAS_IPV4_ADDR_UNICAST; - - for (cxi=*cx_index; cxicx[cxi].sclassifier[dscp]; - - while (pclassifier!=NULL) { - // verify that this is an IPv4 classifier - if ((pclassifier->version == NAS_VERSION_4) || (pclassifier->version == NAS_VERSION_DEFAULT)) { - nasrg_create_mask_ipv4_addr(&masked_addr, pclassifier->dplen); - - if (IN_ARE_ADDR_MASKED_EQUAL(&ip_hdr(skb)->daddr, &(pclassifier->daddr.ipv4), &masked_addr)) { -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx4: IP MASK MATCHED: found cx %d: %d.%d.%d.%d/%d\n",cxi, NIPADDR(pclassifier->daddr.ipv4), pclassifier->dplen); -#endif - return &gpriv->cx[cxi]; - } - } - - // goto to next classification rule for the connection - pclassifier = pclassifier->next; - } - } - } else { - *paddr_type = NAS_IPV4_ADDR_UNKNOWN; - } - } - } - } - } - - return cx; -} - -/* ORIGINAL VERSION -//--------------------------------------------------------------------------- -// Search the entity corresponding to destination address in IPv6 header -struct cx_entity *nasrg_CLASS_cx6(struct sk_buff *skb, int* paddr_type, int* pmbms_ix){ -//--------------------------------------------------------------------------- - struct cx_entity * cx=NULL; - uint8_t cxi; - uint32_t mc_addr_hdr, uni_ifid1, uni_ifid2; - //int addr_type = NASRG_ADDR_UNKNOWN; - - #ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx6: begin\n"); - #endif - if (!skb){ - printk("nasrg_CLASS_cx6 - input parameter skb is NULL \n"); - return cx; - } - *paddr_type = NASRG_ADDR_UNKNOWN; - //mc_addr_hdr = ntohl(skb->nh.ipv6h->daddr.in6_u.u6_addr32[0]); - mc_addr_hdr = ntohl(ipv6_hdr(skb)->daddr.in6_u.u6_addr32[0]); - // First check if multicast [1st octet is FF] - if ((mc_addr_hdr & 0xFF000000) == 0xFF000000) { - // packet type according to the scope of the multicast packet - // we don't consider RPT bits in second octet [maybe done later if needed] - switch(mc_addr_hdr & 0x000F0000) { - case (0x00020000): - *paddr_type = NASRG_ADDR_MC_SIGNALLING; - #ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx6: multicast packet - signalling \n"); - #endif - break; - case (0x000E0000): - *paddr_type = NASRG_ADDR_MC_MBMS; - *pmbms_ix = 0; - cx=gpriv->cx; // MBMS associate to Mobile 0 - #ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx6: multicast packet - MBMS data \n"); - #endif - break; - default: - *paddr_type = NASRG_ADDR_UNKNOWN; - *pmbms_ix = NASRG_MBMS_SVCES_MAX; - } - // This is not multicast, so we should be able to identify the MT - }else{ - #ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx6: unicast packet\n"); - #endif - *paddr_type = NASRG_ADDR_UNICAST; - uni_ifid1 = ntohl(ipv6_hdr(skb)->daddr.in6_u.u6_addr32[2]); - uni_ifid2 = ntohl(ipv6_hdr(skb)->daddr.in6_u.u6_addr32[3]); - for (cxi=0; cxicx+cxi; - #ifdef NAS_DEBUG_SEND_DETAIL - printk("nasrg_CLASS_cx6: Compared addresses \n"); - printk(" Daddr[2] %ul, Daddr[3] %ul\n", - ipv6_hdr(skb)->daddr.in6_u.u6_addr32[2],ipv6_hdr(skb)->daddr.in6_u.u6_addr32[3]); - printk(" ntohl Daddr[2] %ul, Daddr[3] %ul\n",uni_ifid1,uni_ifid2); - printk(" IIF[0] %ul, IIF[1] %ul\n",cx->iid6[0],cx->iid6[1]); - printk(" htonl IIF[0] %ul, IIF[1] %ul\n",htonl(cx->iid6[0]),htonl(cx->iid6[1])); - #endif - if (((cx->iid6[0] == uni_ifid1)&&(cx->iid6[1] == uni_ifid2)) - || ((htonl(cx->iid6[0]) == uni_ifid1)&&(htonl(cx->iid6[1]) == uni_ifid2))){ - return cx; - } - } - } - return cx; -}*/ - -//--------------------------------------------------------------------------- -// Search the entity with the IPv6 address 'addr' -// Navid: the ipv6 classifier is not fully tested -struct cx_entity *nasrg_CLASS_cx6(struct sk_buff *skb, unsigned char dscp, int *paddr_type, unsigned char *cx_index, int* pmbms_ix) -{ - //--------------------------------------------------------------------------- - uint8_t cxi; - struct cx_entity *cx = NULL; - struct classifier_entity *sclassifier= NULL; - uint32_t mc_addr_hdr; - struct in6_addr masked_addr; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx6: begin\n"); -#endif - - if (skb) { -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx6: SOURCE ADDR %X:%X:%X:%X:%X:%X:%X:%X",NIP6ADDR(&(ipv6_hdr(skb)->saddr))); - printk(" DEST ADDR %X:%X:%X:%X:%X:%X:%X:%X\n",NIP6ADDR(&(ipv6_hdr(skb)->daddr))); -#endif - mc_addr_hdr = ntohl(ipv6_hdr(skb)->daddr.in6_u.u6_addr32[0]); - - // First check if multicast [1st octet is FF] - if ((mc_addr_hdr & 0xFF000000) == 0xFF000000) { - // packet type according to the scope of the multicast packet - // we don't consider RPT bits in second octet [maybe done later if needed] - switch(mc_addr_hdr & 0x000F0000) { - case (0x00020000): - *paddr_type = NAS_IPV6_ADDR_MC_SIGNALLING; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx6: multicast packet - signalling \n"); -#endif - break; - - case (0x000E0000): - *paddr_type = NAS_IPV6_ADDR_MC_MBMS; - *pmbms_ix = 0; - cx=gpriv->cx; // MBMS associate to Mobile 0 -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx6: multicast packet - MBMS data \n"); -#endif - break; - - default: - printk("nasrg_CLASS_cx6: default multicast\n"); - *paddr_type = NAS_IPV6_ADDR_UNKNOWN; - *pmbms_ix = NASRG_MBMS_SVCES_MAX; - } - } else { - // This is not multicast, so we should be able to identify the MT - *paddr_type = NAS_IPV6_ADDR_UNICAST; - - for (cxi=*cx_index; cxicx[cxi].sclassifier[dscp]; - - while (sclassifier!=NULL) { - // verify that this is an IPv6 classifier - if ((sclassifier->version == NAS_VERSION_6) || (sclassifier->version == NAS_VERSION_DEFAULT)) { - /*LGif (IN6_IS_ADDR_UNSPECIFIED(&(sclassifier->daddr.ipv6))) { - printk("nas_CLASS_cx6: addr is null \n"); - sclassifier = sclassifier->next; - continue; - }*/ -#ifdef NAS_DEBUG_CLASS - printk("cx %d : DSCP %d %X:%X:%X:%X:%X:%X:%X:%X\n",cxi, dscp, NIP6ADDR(&(sclassifier->daddr.ipv6))); -#endif //NAS_DEBUG_CLASS - - //if ((dst = (unsigned int*)&(((struct rt6_info *)skbdst)->rt6i_gateway)) == 0){ - // LG: STRANGE - if (IN6_IS_ADDR_UNSPECIFIED(&ipv6_hdr(skb)->daddr)) { - printk("nasrg_CLASS_cx6: dst addr is null \n"); - sclassifier = sclassifier->next; - continue; - } - - nasrg_create_mask_ipv6_addr(&masked_addr, sclassifier->dplen); - // Modified MW to check only the iid6 - masked_addr.s6_addr32[0] = 0x00000000; - masked_addr.s6_addr32[1] = 0x00000000; - - if (IN6_ARE_ADDR_MASKED_EQUAL(&ipv6_hdr(skb)->daddr, &(sclassifier->daddr.ipv6), &masked_addr)) { -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_cx6: found cx %d: %X:%X:%X:%X:%X:%X:%X:%X\n",cxi, NIP6ADDR(&(sclassifier->daddr.ipv6))); -#endif //NAS_DEBUG_CLASS - return &gpriv->cx[cxi]; - } - } - - // Go to next classifier entry for connection - sclassifier = sclassifier->next; - } - } - } - } - - //printk("nas_CLASS_cx6 NOT FOUND: %X:%X:%X:%X:%X:%X:%X:%X\n",NIP6ADDR(&ipv6_hdr(skb)->daddr)); - return cx; -} - -//--------------------------------------------------------------------------- -// Search the sending function for IP Packet -void nasrg_CLASS_send(struct sk_buff *skb) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *pclassifier, *sp; - uint8_t *protocolh = NULL; - uint8_t version; - uint8_t protocol, dscp; - uint16_t classref; - struct cx_entity *cx; - unsigned int i; -#ifdef NAS_DEBUG_CLASS - char sfct[10], sprotocol[10]; -#endif - struct net_device *dev = gdev; - unsigned char cx_index,no_connection; - int addr_type; - int mbms_ix; - struct in6_addr masked6_addr; - struct in_addr masked_addr; - // RARP vars - struct arphdr *rarp; - unsigned char *rarp_ptr; - /* s for "source", t for "target" */ - __be32 sip, tip; - unsigned char *sha, *tha; - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send: begin -\n"); -#endif - - if (skb==NULL) { - printk("nasrg_CLASS_send - input parameter skb is NULL \n"); - return; - } - - //*** -#ifdef NAS_DEBUG_SEND - printk("nasrg_CLASS_send - Received IP packet to transmit, length %d\n", skb->len); -#endif -#ifdef NAS_DEBUG_SEND_DETAIL - - if ((skb->data) != NULL) { - if (skb->len<150) - nasrg_TOOL_print_buffer(skb->data,skb->len); - else - nasrg_TOOL_print_buffer(skb->data,150); - } - -#endif - //*** - // find all connections related to socket - cx_index = 0; - no_connection = 1; - cx = NULL; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send: [before switch on IP protocol version] \n"); -#endif - - - // Get mobile connexion entity, protocol and dscp from IP packet - switch (ntohs(skb->protocol)) { - case ETH_P_IPV6: -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send : skb->protocol : IPv6 \n"); -#endif - version = NAS_VERSION_6; - addr_type = NAS_IPV6_ADDR_UNKNOWN; - protocolh = nasrg_TOOL_get_protocol6(ipv6_hdr(skb), &protocol); - dscp = nasrg_TOOL_get_dscp6 (ipv6_hdr(skb)); - cx = nasrg_CLASS_cx6 (skb, dscp, &addr_type, &cx_index, &mbms_ix); -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send - ETH_P_IPV6 skb %p dscp %d gpriv %p cx_index %p \n",skb, dscp, gpriv, &cx_index); -#endif - - // find in default DSCP a valid classification - if (cx == NULL) { - switch (addr_type) { - case NAS_IPV6_ADDR_MC_SIGNALLING: - case NAS_IPV6_ADDR_UNICAST: -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send - case NAS_IPV6_ADDR_MC_SIGNALLING | NAS_IPV6_ADDR_UNICAST\n"); -#endif //NAS_DEBUG_CLASS - - for (i=0; icx[i])->sclassifier[NAS_DSCP_DEFAULT]; - - while (pclassifier!=NULL) { - if ((pclassifier->version == NAS_VERSION_6) || (pclassifier->version == NAS_VERSION_DEFAULT)) { - // ok found default classifier for this packet - nasrg_create_mask_ipv6_addr(&masked6_addr, pclassifier->dplen); - // Modified MW to let everything go (pb with signalling) - masked6_addr.s6_addr32[0] = 0x00000000; - masked6_addr.s6_addr32[1] = 0x00000000; -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send - cx %d : DSCP NAS_DSCP_DEFAULT %X:%X:%X:%X:%X:%X:%X:%X\n",i, NIP6ADDR(&(pclassifier->daddr.ipv6))); -#endif //NAS_DEBUG_CLASS - - if (IN6_ARE_ADDR_MASKED_EQUAL(&pclassifier->daddr.ipv6, &ipv6_hdr(skb)->daddr, &masked6_addr)) { - // then force dscp - cx = &gpriv->cx[i]; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send - ETH_P_IPV6 FOUND NAS_DSCP_DEFAULT with IN6_ARE_ADDR_MASKED_EQUAL(%d bits)\n",pclassifier->dplen); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } else { - if(IN6_IS_ADDR_UNSPECIFIED(&pclassifier->daddr.ipv6)) { - cx = &gpriv->cx[i]; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send - ETH_P_IPV6 FOUND NAS_DSCP_DEFAULT with IN6_IS_ADDR_UNSPECIFIED\n"); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } - } - } - - pclassifier = pclassifier->next; - } - } - - break; - - // MBMS is broken!!!! To be updated (these values will be over-ridden afterwards - case NAS_IPV6_ADDR_MC_MBMS: -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send - case NAS_IPV6_ADDR_MC_MBMS\n"); -#endif //NAS_DEBUG_CLASS - pclassifier = gpriv->mbmsclassifier[mbms_ix]; - printk("nasrg_CLASS_send: MBMS is broken!!!!\n\n\n"); - sp = gpriv->mbmsclassifier[mbms_ix]; - - if (sp!= NULL) { - classref=sp->classref; -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send: classifier found for multicast service %d \n", mbms_ix); -#endif - } else { - printk("nasrg_CLASS_send: No corresponding multicast bearer, so the message is dropped\n"); - return; - } - - break; - - // should have found a valid classification rule - case NAS_IPV6_ADDR_UNKNOWN: - default: - printk("nasrg_CLASS_send: No corresponding address type\n"); - } - } - - break; - - case ETH_P_ARP: -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send : skb->protocol : ARP \n"); -#endif - version = NAS_VERSION_4; - addr_type = NAS_IPV4_ADDR_BROADCAST; - dscp = 0; - cx = NULL; - // Basic sanity checks can be done without the lock - rarp = (struct arphdr *)skb_network_header(skb); - - if (rarp) { - if (rarp->ar_hln != dev->addr_len || dev->type != ntohs(rarp->ar_hrd)) { - printk("nasrg_CLASS_send: ARP PACKET WRONG ADDR LEN or WRONG ARP HEADER TYPE\n"); - break; - } - } else { - printk("nasrg_CLASS_send: ARP HEADER POINTER IS NULL\n"); - break; - } - - // If it's not Ethernet, delete it. - if (rarp->ar_pro != htons(ETH_P_IP)) { - printk("nasrg_CLASS_send: ARP PACKET PROTOCOL IS NOT ETHERNET\n"); - break; - } - - rarp_ptr = (unsigned char *) (rarp + 1); - sha = rarp_ptr; - rarp_ptr += dev->addr_len; - memcpy(&sip, rarp_ptr, 4); - rarp_ptr += 4; - tha = rarp_ptr; - rarp_ptr += dev->addr_len; - memcpy(&tip, rarp_ptr, 4); -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send: ARP DEST IP transport IP = %d.%d.%d.%d\n",NIPADDR(tip)); -#endif - - for (i=0; icx[i])->sclassifier[NAS_DSCP_DEFAULT]; - - while (pclassifier!=NULL) { - if ((pclassifier->version == NAS_VERSION_4) || (pclassifier->version == NAS_VERSION_DEFAULT)) { - // ok found default classifier for this packet - nasrg_create_mask_ipv4_addr(&masked_addr, pclassifier->dplen); -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send: MASK = %d.%d.%d.%d\n",NIPADDR(masked_addr.s_addr)); -#endif - - // - if (IN_ARE_ADDR_MASKED_EQUAL(&pclassifier->daddr.ipv4, &tip, &masked_addr.s_addr)) { - // then force dscp - cx = &gpriv->cx[i]; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send: ETH_P_ARP FOUND NAS_DSCP_DEFAULT with IN_ARE_ADDR_MASKED_EQUAL(%d bits)\n", pclassifier->dplen); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } else { - if (INADDR_ANY == pclassifier->daddr.ipv4) { - cx = &gpriv->cx[i]; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send: ETH_P_ARP FOUND NAS_DSCP_DEFAULT with INADDR_ANY\n"); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } - } - } - - pclassifier = pclassifier->next; - } - } - - break; - - case ETH_P_IP: -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send : skb->protocol : IPv4 \n"); -#endif - version = NAS_VERSION_4; - addr_type = NAS_IPV4_ADDR_UNKNOWN; - dscp = nasrg_TOOL_get_dscp4((struct iphdr *)(skb_network_header(skb))); - cx = nasrg_CLASS_cx4(skb, dscp, &addr_type, &cx_index); - protocolh = nasrg_TOOL_get_protocol4((struct iphdr *)(skb_network_header(skb)), &protocol); - - // find in default DSCP a valid classification - if (cx == NULL) { - switch (addr_type) { - case NAS_IPV4_ADDR_MC_SIGNALLING: - case NAS_IPV4_ADDR_UNICAST: - case NAS_IPV4_ADDR_BROADCAST: - for (i=0; icx[i])->sclassifier[NAS_DSCP_DEFAULT]; - - while (pclassifier != NULL) { - if ((pclassifier->version == NAS_VERSION_4) || (pclassifier->version == NAS_VERSION_DEFAULT)) { - // ok found default classifier for this packet - nasrg_create_mask_ipv4_addr(&masked_addr, pclassifier->dplen); -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send : MASK = %d.%d.%d.%d\n", NIPADDR(masked_addr.s_addr)); -#endif - - if (IN_ARE_ADDR_MASKED_EQUAL(&pclassifier->daddr.ipv4, &ip_hdr(skb)->daddr, &masked_addr.s_addr)) { - // then force dscp - cx = &gpriv->cx[i]; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send : ETH_P_IP FOUND NAS_DSCP_DEFAULT with IN_ARE_ADDR_MASKED_EQUAL(%d bits)\n",pclassifier->dplen); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } else { - if(INADDR_ANY == pclassifier->daddr.ipv4) { - cx = &gpriv->cx[i]; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send : ETH_P_IP FOUND NAS_DSCP_DEFAULT with INADDR_ANY\n"); -#endif - dscp = NAS_DSCP_DEFAULT; - break; - } - } - } - - pclassifier = pclassifier->next; - } - } - - break; - - // should have found a valid classification rule - case NAS_IPV4_ADDR_UNKNOWN: - default: - printk("nasrg_CLASS_send: No corresponding address type\n"); - } - } - -#ifdef NAS_DEBUG_CLASS - - if (cx) - printk("nasrg_CLASS_send: ETH_P_IP Received IPv4 packet (%02X), dscp = %d, cx = %d\n",ntohs(skb->protocol),dscp,cx->lcr); - else - printk("nasrg_CLASS_send: ETH_P_IP Received IPv4 packet (%02X), dscp = %d, No valid connection\n",ntohs(skb->protocol),dscp); - -#endif - break; - - default: - printk("nasrg_CLASS_send: Unknown IP version protocol\n"); - version = 0; - return; - } - -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send: [before if (cx != NULL)]\n"); -#endif - - //Next lines bypass classifiers to test the netlink socket - //#define DEBUG_NETLINKRG_TEST -#ifdef DEBUG_NETLINKRG_TEST - nasrg_COMMON_QOS_send_test_netlink(skb); - return; -#endif - - // If a valid connection for the DSCP/EXP with destination address - // is found scan all protocol-based classification rules - if (cx != NULL) { - classref = 0; - sp = NULL; - - if (cx->state!=NAS_CX_DCH) { -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send: UE not connected, in state %d. Packet is dropped\n",cx->state); -#endif - return; - } - - if (addr_type==NAS_IPV6_ADDR_MC_MBMS) { - sp = gpriv->mbmsclassifier[mbms_ix]; - - if (sp!= NULL) { - classref=sp->classref; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send: classifier found for multicast index %d, service %d\n", mbms_ix, gpriv->mbms_rb[mbms_ix].cnxid); -#endif - } else { - // Temp MEDIEVAL : use default classifier - sp = cx->sclassifier[NAS_DSCP_DEFAULT]; - - if (sp!= NULL) { - classref=sp->classref; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_CLASS_send: classifier for multicast service %d replaced by default %d\n", mbms_ix, classref); -#endif -#ifdef NAS_AUTO_MBMS - nasrg_ASCTL_start_default_mbms_service(); -#endif - } else { - printk("nasrg_CLASS_send: No corresponding multicast bearer, so the message is dropped\n"); - return; - } - } - } else { -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send: DSCP %d version %d: looking for classifier entry\n",dscp, version); -#endif - - for (pclassifier=cx->sclassifier[dscp]; pclassifier!=NULL; pclassifier=pclassifier->next) { -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send: DSCP %d p->classref=%d,p->protocol=%d,p->version=%d\n",dscp,pclassifier->classref,pclassifier->protocol,pclassifier->version); -#endif - - // normal rule checks that network protocol version matches - if ((pclassifier->version == version) || (pclassifier->version == NAS_VERSION_DEFAULT)) { - //printk("nasrg_CLASS_send: IP version are equals\n"); - sp=pclassifier; - classref=sp->classref; -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send: classifier found for dscp %u \n", dscp); -#endif - break; - } - } - } - - if (sp!=NULL) { -#ifdef NAS_DEBUG_CLASS - - //char sfct[10], sprotocol[10]; - // classifier entity found. Print its parameters - if (sp->fct==nasrg_COMMON_QOS_send) - strcpy(sfct, "data xfer"); - - if (sp->fct==nasrg_CTL_send) - strcpy(sfct, "iocontrol"); - - if (sp->fct==nasrg_COMMON_del_send) - strcpy(sfct, "delete"); - - if (sp->fct==nasrg_ASCTL_DC_send_sig_data_request) - strcpy(sfct, "DC-SAP"); - - switch(protocol) { - case NAS_PROTOCOL_UDP: - strcpy(sprotocol, "udp"); - printk("udp packet\n"); - break; - - case NAS_PROTOCOL_TCP: - strcpy(sprotocol, "tcp"); - printk("tcp packet\n"); - break; - - case NAS_PROTOCOL_ICMP4: - strcpy(sprotocol, "icmp4"); - printk("icmp4 packet\n"); - break; - - case NAS_PROTOCOL_ICMP6: - strcpy(sprotocol, "icmp6"); - nasrg_TOOL_pk_icmp6((struct icmp6hdr*)protocolh); - break; - - default: - strcpy(sprotocol, "other L4"); - break; - } - - printk("nasrg_CLASS_send: (dscp %u, %s) received, (classref %u, fct %s, drb_id %u) classifier rule\n", - dscp, sprotocol, sp->classref, sfct, sp->rab_id); -#endif - - //forward packet to the correct entity - if (sp->fct!=NULL) { - sp->fct(skb, cx, sp); - } else { - printk("\n\nnasrg_CLASS_send: ERROR : CLASSIFIER FUNCTION IS NULL\n\n"); - } - - no_connection = 0; - // end : if classifier entry match found - } else { - printk("nasrg_CLASS_send: no corresponding item in the classifier list, so the message is dropped\n"); - printk("nasrg_CLASS_send: packet parameters: dscp %u, %s\n", dscp, sprotocol); - nasrg_COMMON_del_send(skb, cx, NULL); // Note MW: LG has commented this line. Why? - } - } // if connection found - -#ifdef NAS_DEBUG_CLASS - - if (no_connection == 1) { - printk("nasrg_CLASS_send: no corresponding connection, so the message is dropped\n"); - } - -#endif -#ifdef NAS_DEBUG_CLASS_DETAIL - printk("nasrg_CLASS_send: end\n"); -#endif -} diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c deleted file mode 100755 index 9857d11ec8..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_common.c +++ /dev/null @@ -1,635 +0,0 @@ -/*************************************************************************** - nasrg_common.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasrg_common.c -* \brief Common functions for OpenAirInterface CELLULAR version - RG -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#include "nasrg_variables.h" -#include "nasrg_proto.h" - -#include -#ifdef NAS_DRIVER_TYPE_ETHERNET -#include -#endif - -//--------------------------------------------------------------------------- -// Receive data from FIFO (QOS or DC) -//void nasrg_COMMON_receive(uint16_t hlen, uint16_t dlen, int sap){ -void nasrg_COMMON_receive(uint16_t bytes_read, uint16_t payload_length, void *data_buffer, int rb_id, int sap) -{ - //--------------------------------------------------------------------------- - struct sk_buff *skb; - struct ipversion *ipv; - unsigned int hard_header_len; - uint16_t *p_ether_type; - uint16_t ether_type; - -#ifdef NAS_DEBUG_RECEIVE - printk("nasrg_COMMON_receive: begin\n"); -#endif -#ifdef PDCP_USE_NETLINK - - // data_buffer is NULL if FIFOs - if (!data_buffer) { - printk("nasrg_COMMON_receive - input parameter data_buffer is NULL \n"); - return; - } - -#endif - - skb = dev_alloc_skb( payload_length + 2 ); - - if(!skb) { - printk("nasrg_COMMON_receive: low on memory\n"); - ++gpriv->stats.rx_dropped; - return; - } - - skb_reserve(skb,2); - -#ifndef PDCP_USE_NETLINK - bytes_read += rtf_get(sap, skb_put(skb, payload_length), payload_length); - - if (bytes_read != NAS_PDCPH_SIZE + payload_length) { - printk("nasrg_COMMON_receive: problem while reading rtf sap\n"); - kfree(skb->data); - dev_kfree_skb(skb); - return; - } - -#else - memcpy(skb_put(skb, payload_length), data_buffer, payload_length); - bytes_read += payload_length; -#endif - -#ifdef NAS_DEBUG_RECEIVE - printk("nasrg_COMMON_receive: received packet from PDCP, length %d\n", bytes_read); -#endif - - skb->dev = gdev; - hard_header_len = gdev->hard_header_len; - skb->mac_header = skb->data; - skb->pkt_type = PACKET_HOST; - skb->ip_summed = CHECKSUM_UNNECESSARY; - - ipv = (struct ipversion *)&(skb->data[hard_header_len]); - - switch (ipv->version) { - case 6: -#ifdef NAS_DEBUG_RECEIVE_BASIC - printk("nasrg_COMMON_receive: receive IPv6 message\n"); -#endif - skb->network_header = &skb->data[hard_header_len]; - // set protocol default value - skb->protocol = htons(ETH_P_IPV6); - // If type Ethernet, correct it -#ifdef NAS_DRIVER_TYPE_ETHERNET - skb->protocol = eth_type_trans(skb, gdev); -#endif - break; - - case 4: -#ifdef NAS_DEBUG_RECEIVE_BASIC - printk("nasrg_COMMON_receive: receive IPv4 message\n"); -#endif - -#ifdef NAS_DEBUG_RECEIVE - addr = (unsigned char *)&((struct iphdr *)&skb->data[hard_header_len])->saddr; - - if (addr) { - printk("nasrg_COMMON_receive: Source %d.%d.%d.%d\n",addr[0],addr[1],addr[2],addr[3]); - } - - addr = (unsigned char *)&((struct iphdr *)&skb->data[hard_header_len])->daddr; - - if (addr) { - printk("nasrg_COMMON_receive Dest %d.%d.%d.%d\n",addr[0],addr[1],addr[2],addr[3]); - } - - printk("nasrg_COMMON_receive protocol %d\n",((struct iphdr *)&skb->data[hard_header_len])->protocol); -#endif - - skb->network_header = &skb->data[hard_header_len]; - // set protocol default value - skb->protocol = htons(ETH_P_IP); - // If type Ethernet, correct it -#ifdef NAS_DRIVER_TYPE_ETHERNET - skb->protocol = eth_type_trans(skb, gdev); -#endif - break; - - default: - printk("nasrg_COMMON_receive: Packet is not IPv4 or IPv6 (version=%d)\n", ipv->version); - -#ifdef NAS_DRIVER_TYPE_ETHERNET -#ifdef NAS_DEBUG_RECEIVE - printk("nasrg_COMMON_receive: ether_type=%04X\n", ether_type); -#endif - skb->protocol = eth_type_trans(skb, gdev); - // minus 1(short) instead of 2(bytes) because uint16_t* - p_ether_type = (uint16_t *)&(skb->mac_header[hard_header_len-2]); - ether_type = ntohs(*p_ether_type); -#ifdef NAS_DEBUG_RECEIVE - printk("nasrg_COMMON_receive: ether_type=%04X\n", ether_type); -#endif - - switch (ether_type) { - case ETH_P_ARP: - printk("nasrg_COMMON_receive: ether_type = ETH_P_ARP\n"); - skb->protocol = htons(ETH_P_ARP); - skb->network_header = &skb->mac_header[hard_header_len]; - break; - - default: - break; - } - -#endif - } - - ++gpriv->stats.rx_packets; - gpriv->stats.rx_bytes += bytes_read; -#ifdef NAS_DEBUG_RECEIVE - printk("nasrg_COMMON_receive: forwarding packet of size %d to kernel\n",skb->len); -#endif - - netif_rx(skb); -#ifdef NAS_DEBUG_RECEIVE - printk("nasrg_COMMON_receive: end\n"); -#endif -} - -//--------------------------------------------------------------------------- -// Delete the data -void nasrg_COMMON_del_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *sp) -{ - //--------------------------------------------------------------------------- - ++gpriv->stats.tx_dropped; -} - -//--------------------------------------------------------------------------- -// Request the transfer of data (QoS SAP) -void nasrg_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc) -{ - //--------------------------------------------------------------------------- - struct pdcp_data_req_header_t pdcph; - int bytes_wrote = 0; - - // Start debug information -#ifdef NAS_DEBUG_SEND - printk("nasrg_COMMON_QOS_send - begin \n"); -#endif - - // if (cx->state!=NAS_STATE_CONNECTED) // <--- A REVOIR - // { - // gpriv->stats.tx_dropped ++; - // printk("NAS_QOS_SEND: No connected, so message are dropped \n"); - // return; - // } - if (!skb || !gc || !cx) { - printk("nasrg_COMMON_QOS_send - input parameter skb|gc|cx is NULL \n"); - return; - } - - // End debug information - - if (gc->rb==NULL) { - gc->rb=nasrg_COMMON_search_rb(cx, gc->rab_id); - - if (gc->rb==NULL) { - ++gpriv->stats.tx_dropped; - printk("nasrg_COMMON_QOS_send: No corresponding Radio Bearer, so message is dropped, rab_id=%u \n", gc->rab_id); - return; - } - } - -#ifdef NAS_DEBUG_SEND - printk("nasrg_COMMON_QOS_send #1 :"); - printk("lcr %u, rab_id %u, rab_id %u\n", cx->lcr, (gc->rb)->rab_id, gc->rab_id); -#endif -#ifdef NAS_DEBUG_SEND_DETAIL - nasrg_TOOL_print_classifier(gc); -#endif - pdcph.data_size = skb->len; - //pdcph.rb_id = (gc->rb)->rab_id+(NAS_RB_MAX_NUM*cx->lcr); - pdcph.rb_id = ((gc->rb)->rab_id)-NAS_SIG_NUM_SRB; - pdcph.inst = 0; - -#ifdef PDCP_USE_NETLINK - bytes_wrote = nasrg_netlink_send((unsigned char *)&pdcph,NAS_PDCPH_SIZE, NASNL_DEST_PDCP); -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasrg_COMMON_QOS_send - Wrote %d bytes (header for %d byte skb) to PDCP via netlink\n", bytes_wrote,skb->len); -#endif -#else - //bytes_wrote = rtf_put(gpriv->sap[(gc->rb)->sapi], &pdcph, NAS_PDCPH_SIZE); - bytes_wrote = rtf_put(NAS2PDCP_FIFO, &pdcph, NAS_PDCPH_SIZE); -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasrg_COMMON_QOS_send - Wrote %d bytes (header for %d byte skb) to PDCP fifo\n", bytes_wrote,skb->len); -#endif -#endif //PDCP_USE_NETLINK - - if (bytes_wrote != NAS_PDCPH_SIZE) { - printk("nasrg_COMMON_QOS_send: problem while writing PDCP's header\n"); - printk("PDCP rb_id %d, SAP index %d, Wrote %d to fifo %d, Header Size %d \n", pdcph.rb_id , (gc->rb)->sapi, bytes_wrote, NAS2PDCP_FIFO, NAS_PDCPH_SIZE); - gpriv->stats.tx_dropped ++; - return; - } - -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasrg_COMMON_QOS_send #2 :"); - printk("Header bytes written : %d\n", bytes_wrote); -#endif - -#ifdef PDCP_USE_NETLINK - bytes_wrote += nasrg_netlink_send((unsigned char *)skb->data,skb->len, NASNL_DEST_PDCP); -#else - //bytes_wrote += rtf_put(gpriv->sap[(gc->rb)->sapi], skb->data, skb->len); - bytes_wrote += rtf_put(NAS2PDCP_FIFO, skb->data, skb->len); -#endif //PDCP_USE_NETLINK - - if (bytes_wrote != skb->len+NAS_PDCPH_SIZE) { - printk("nasrg_COMMON_QOS_send: problem while writing PDCP's data\n"); // congestion - printk("rb_id %d, SAP index %d, Wrote %d to fifo %d, Header Size %d \n", pdcph.rb_id , (gc->rb)->sapi, bytes_wrote, NAS2PDCP_FIFO, NAS_PDCPH_SIZE); - gpriv->stats.tx_dropped ++; - return; - } - -#ifdef NAS_DEBUG_SEND - printk("nasrg_COMMON_QOS_send #3 :"); - printk(" %d bytes written to rb_id %d, sap %d \n", bytes_wrote, pdcph.rb_id, NAS2PDCP_FIFO); -#endif - gpriv->stats.tx_bytes += skb->len; - gpriv->stats.tx_packets ++; -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasrg_COMMON_QOS_send - end \n"); -#endif -} - -//--------------------------------------------------------------------------- -// Request the transfer of data (QoS SAP) -void nasrg_COMMON_QOS_send_test_netlink(struct sk_buff *skb) -{ - //--------------------------------------------------------------------------- - struct pdcp_data_req_header_t pdcph; - int bytes_wrote = 0; - - // Start debug information -#ifdef NAS_DEBUG_SEND - printk("nasrg_COMMON_QOS_send - begin \n"); -#endif - - // if (cx->state!=NAS_STATE_CONNECTED) // <--- A REVOIR - // { - // gpriv->stats.tx_dropped ++; - // printk("NAS_QOS_SEND: No connected, so message are dropped \n"); - // return; - // } - if (!skb ) { - printk("nasrg_COMMON_QOS_send - input parameter skb|gc|cx is NULL \n"); - return; - } - - // End debug information - -#ifdef NAS_DEBUG_SEND - printk("nasrg_COMMON_QOS_send #1 :"); - // printk("lcr %u, rab_id %u, rab_id %u\n", cx->lcr, (gc->rb)->rab_id, gc->rab_id); - // nasrg_TOOL_print_classifier(gc); -#endif - pdcph.data_size = skb->len; - //pdcph.rb_id = (gc->rb)->rab_id+(NAS_RB_MAX_NUM*cx->lcr); - pdcph.rb_id = 6; - pdcph.inst = 0; - -#ifdef PDCP_USE_NETLINK - bytes_wrote = nasrg_netlink_send((unsigned char *)&pdcph,NAS_PDCPH_SIZE, NASNL_DEST_PDCP); - //printk("nasrg_COMMON_QOS_send - Wrote %d bytes (header for %d byte skb) to PDCP via netlink\n", bytes_wrote,skb->len); -#else - //bytes_wrote = rtf_put(gpriv->sap[(gc->rb)->sapi], &pdcph, NAS_PDCPH_SIZE); - bytes_wrote = rtf_put(NAS2PDCP_FIFO, &pdcph, NAS_PDCPH_SIZE); - //printk("nasrg_COMMON_QOS_send - Wrote %d bytes (header for %d byte skb) to PDCP fifo\n", bytes_wrote,skb->len); -#endif //PDCP_USE_NETLINK - - if (bytes_wrote != NAS_PDCPH_SIZE) { - printk("nasrg_COMMON_QOS_send: problem while writing PDCP's header\n"); - // printk("PDCP rb_id %d, SAP index %d, Wrote %d to fifo %d, Header Size %d \n", pdcph.rb_id , (gc->rb)->sapi, bytes_wrote, NAS2PDCP_FIFO, NAS_PDCPH_SIZE); - gpriv->stats.tx_dropped ++; - return; - } - -#ifdef NAS_DEBUG_SEND - printk("nasrg_COMMON_QOS_send #2 :"); - printk("Header bytes wrote : %d\n", bytes_wrote); -#endif - -#ifdef PDCP_USE_NETLINK - bytes_wrote += nasrg_netlink_send((unsigned char *)skb->data,skb->len, NASNL_DEST_PDCP); -#else - //bytes_wrote += rtf_put(gpriv->sap[(gc->rb)->sapi], skb->data, skb->len); - bytes_wrote += rtf_put(NAS2PDCP_FIFO, skb->data, skb->len); -#endif //PDCP_USE_NETLINK - - if (bytes_wrote != skb->len+NAS_PDCPH_SIZE) { - printk("nasrg_COMMON_QOS_send: problem while writing PDCP's data\n"); // congestion - // printk("rb_id %d, SAP index %d, Wrote %d to fifo %d, Header Size %d \n", pdcph.rb_id , (gc->rb)->sapi, bytes_wrote, NAS2PDCP_FIFO, NAS_PDCPH_SIZE); - gpriv->stats.tx_dropped ++; - return; - } - -#ifdef NAS_DEBUG_SEND - printk("nasrg_COMMON_QOS_send #3 :"); - printk(" %d bytes wrote to rb_id %d, sap %d \n", bytes_wrote, pdcph.rb_id, NAS2PDCP_FIFO); -#endif - gpriv->stats.tx_bytes += skb->len; - gpriv->stats.tx_packets ++; -#ifdef NAS_DEBUG_SEND - printk("nasrg_COMMON_QOS_send - end \n"); -#endif -} - -#ifndef PDCP_USE_NETLINK -//--------------------------------------------------------------------------- -void nasrg_COMMON_QOS_receive(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- - uint8_t sapi; - struct pdcp_data_ind_header_t pdcph; - int bytes_read = 0; - // Start debug information -#ifdef NAS_DEBUG_RECEIVE - printk("nasrg_COMMON_QOS_receive - begin \n"); -#endif - - if (!cx) { - printk("nasrg_COMMON_QOS_receive - input parameter cx is NULL \n"); - return; - } - - // End debug information - - // LG force the use of only 1 rt fifo - sapi = NAS_DRB_OUTPUT_SAPI; - - bytes_read = rtf_get(gpriv->sap[sapi], &pdcph, NAS_PDCPH_SIZE); - - while (bytes_read>0) { - if (bytes_read != NAS_PDCPH_SIZE) { - printk("nasrg_COMMON_QOS_receive: problem while reading PDCP header\n"); - return; - } - - // data_buffer is NULL because FIFO should be read directly in the skbuff (LITE has an intermediary buffer) - nasrg_COMMON_receive(NAS_PDCPH_SIZE, pdcph.data_size, NULL, pdcph->rb_id, gpriv->sap[sapi]); - // check if another frame is in the FIFO, otherwise return - bytes_read = rtf_get(gpriv->sap[sapi], &pdcph, NAS_PDCPH_SIZE); - } - -#ifdef NAS_DEBUG_RECEIVE - printk("nasrg_COMMON_QOS_receive - end \n"); -#endif -} -#else -//--------------------------------------------------------------------------- -void nasrg_COMMON_QOS_receive(struct nlmsghdr *nlh) -{ - //--------------------------------------------------------------------------- - - struct pdcp_data_ind_header_t *pdcph; - - // Start debug information -#ifdef NAS_DEBUG_RECEIVE - printk("nasrg_COMMON_QOS_receive - begin \n"); -#endif - - if (!nlh) { - printk("nasrg_COMMON_QOS_receive - input parameter nlh is NULL \n"); - return; - } - - // End debug information - pdcph = (struct pdcp_data_ind_header_t *)NLMSG_DATA(nlh); - -#ifdef NAS_DEBUG_RECEIVE - printk("nasrg_COMMON_QOS_receive - receive from PDCP, size %d, rab %d\\n", pdcph->data_size, pdcph->rb_id); -#endif //NAS_DEBUG_RECEIVE - - //void nasrg_COMMON_receive(uint16_t bytes_read, uint16_t payload_length, void *data_buffer, int rb_id, int sap); - nasrg_COMMON_receive(NAS_PDCPH_SIZE + pdcph->data_size, pdcph->data_size, (unsigned char *)NLMSG_DATA(nlh) + NAS_PDCPH_SIZE, pdcph->rb_id, 0); -} -#endif //PDCP_USE_NETLINK - -//--------------------------------------------------------------------------- -struct cx_entity *nasrg_COMMON_search_cx(nasLocalConnectionRef_t lcr) -{ - //--------------------------------------------------------------------------- -#ifdef NAS_DEBUG_CLASS - printk("nasrg_COMMON_search_cx - lcr %d\n",lcr); -#endif - - if (lcrcx+lcr; - else - return NULL; -} - -//--------------------------------------------------------------------------- -// Search a Radio Bearer -struct rb_entity *nasrg_COMMON_search_rb(struct cx_entity *cx, nasRadioBearerId_t rab_id) -{ - //--------------------------------------------------------------------------- - struct rb_entity *rb; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_COMMON_search_rb - rab_id %d\n", rab_id); -#endif - - if (cx==NULL) { - printk("nasrg_COMMON_search_rb - input parameter cx is NULL \n"); - return NULL; - } - - for (rb=cx->rb; rb!=NULL; rb=rb->next) { - if (rb->rab_id==rab_id) - return rb; - } - - return NULL; -} - -//--------------------------------------------------------------------------- -struct rb_entity *nasrg_COMMON_add_rb(struct cx_entity *cx, nasRadioBearerId_t rab_id, nasQoSTrafficClass_t qos) -{ - //--------------------------------------------------------------------------- - struct rb_entity *rb; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_COMMON_add_rb - begin for rab_id %d , qos %d\n", rab_id, qos ); -#endif - - if (cx==NULL) { - printk("nasrg_COMMON_add_rb - input parameter cx is NULL \n"); - return NULL; - } - - rb=nasrg_COMMON_search_rb(cx, rab_id); - - if (rb==NULL) { - rb=(struct rb_entity *)kmalloc(sizeof(struct rb_entity), GFP_KERNEL); - - if (rb!=NULL) { - rb->retry=0; - rb->countimer=NAS_TIMER_IDLE; - rb->rab_id=rab_id; - // rb->rab_id=rab_id+(32*cx->lcr); -#ifdef NAS_DEBUG_DC - printk("nasrg_COMMON_add_rb: rb rab_id=%u, rab_id=%u, mt_id=%u\n",rb->rab_id,rab_id, cx->lcr); -#endif - // rb->dscp = NASRG_TEMP_2NDRAB_DSCP; //TEMP - rb->qos=qos; - rb->sapi=NAS_DRB_INPUT_SAPI; - // LG force the use of only one rt-fifo - // rb->sapi=NAS_BA_INPUT_SAPI; - rb->state=NAS_IDLE; - rb->next=cx->rb; - cx->rb=rb; - (cx->num_rb)++; - } else - printk("nasrg_COMMON_add_rb: no memory\n"); - } - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_COMMON_add_rb - end \n" ); -#endif - return rb; -} - -//--------------------------------------------------------------------------- -// free the memory that has previously been allocated to rb and remove from linked list -void nasrg_COMMON_del_rb(struct cx_entity *cx, nasRadioBearerId_t rab_id, nasIPdscp_t dscp) -{ - //--------------------------------------------------------------------------- - struct rb_entity *rb, *curr_rb, *prev_rb; - struct classifier_entity *p; - uint16_t classref=0; - - // Start debug information -#ifdef NAS_DEBUG_CLASS - printk("nasrg_COMMON_del_rb - begin\n"); -#endif - - if (cx==NULL) { - printk("nasrg_COMMON_del_rb - input parameter cx is NULL \n"); - return; - } - - // End debug information - - // Clear the associated classifier - for (p=cx->sclassifier[dscp]; p!=NULL; p=p->next) { - if (p->classref>=classref) { - classref=p->classref; -#ifdef NAS_DEBUG_CLASS - printk("nasrg_COMMON_del_rb: classifier found for dscp %u \n", dscp); -#endif - } - } - - nasrg_CLASS_del_sclassifier(cx, dscp, classref); - - // Now, delete the RB - curr_rb = NULL; - prev_rb = NULL; - - for (rb=cx->rb; rb!=NULL; rb=rb->next) { - if (rb->rab_id == rab_id) { - curr_rb = rb; - - if (prev_rb!=NULL) { - prev_rb->next = rb->next; - } else { - cx->rb=rb->next; - } - - break; - } else { - prev_rb = rb; - } - } - - if (curr_rb!= NULL) { - printk("nasrg_COMMON_del_rb: del rab_id %u\n", rb->rab_id); - kfree(rb); - (cx->num_rb)--; - } else { - printk("\n\n--nasrg_COMMON_del_rb: ERROR, invalid rab_id %u\n", rb->rab_id); - } - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_COMMON_del_rb - end\n"); -#endif -} - -//--------------------------------------------------------------------------- -void nasrg_COMMON_flush_rb(struct cx_entity *cx) -{ - //--------------------------------------------------------------------------- - struct rb_entity *rb; - struct classifier_entity *gc; - uint8_t dscp; - - // Start debug information -#ifdef NAS_DEBUG_CLASS - printk("nasrg_COMMON_flush_rb - begin\n"); -#endif - - if (cx==NULL) { - printk("nasrg_COMMON_flush_rb - input parameter cx is NULL \n"); - return; - } - - // End debug information - for (rb=cx->rb; rb!=NULL; rb=cx->rb) { - printk("nasrg_COMMON_flush_rb: del rab_id %u\n", rb->rab_id); - cx->rb=rb->next; - kfree(rb); - } - - cx->num_rb=0; - cx->rb=NULL; - - for(dscp=0; dscpsclassifier[dscp]; gc!=NULL; gc=gc->next) - gc->rb=NULL; - } - -#ifdef NAS_DEBUG_CLASS - printk("nasrg_COMMON_flush_rb - end\n"); -#endif -} diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h deleted file mode 100755 index d0e81aa4e6..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_constant.h +++ /dev/null @@ -1,230 +0,0 @@ -/*************************************************************************** - nasrg_constant.h - description - *************************************************************************** - Defines all constants for NAS RG - - In particular, constants for the default RAB and its qos class - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasrg_constant.h -* \brief Defines all constants for OpenAirInterface CELLULAR version - RG -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef _NASRGD_CST -#define _NASRGD_CST - -//Debug flags -#define NAS_DEBUG_DC -//#define NAS_DEBUG_DC_DETAIL -#define NAS_DEBUG_SEND -//#define NAS_DEBUG_SEND_DETAIL // detail of packet transmission -//#define NAS_DEBUG_RECEIVE -#define NAS_DEBUG_RECEIVE_BASIC -#define NAS_DEBUG_CLASS -//#define NAS_DEBUG_CLASS_DETAIL -#define NAS_DEBUG_GC -//#define NAS_DEBUG_DC_MEASURE -//#define NAS_DEBUG_TIMER -#define NAS_DEBUG_DEVICE -//#define NAS_DEBUG_INTERRUPT -//#define NAS_DEBUG_TOOL -//#define NAS_DEBUG_MBMS_PROT //Only one RT-FIFO is used -#define NETLINK_DEBUG -#define NAS_DEBUG_RRCNL // RRC netlink socket - -// Other flags -#define DEMO_3GSM -//#define NODE_RG -//#define NAS_AUTO_MBMS - -// Begin default RAB -// Parameters for the default RAB started after network attachment (needs DEMO_3GSM defined) -// RBId value to be synchronized with RAL-RG -#define NASRG_DEFAULTRAB_RBID 6 //MW-01/01/07- RBID 5 => MBMS, 6 => DEFAULTRAB, 7+ => others -// Only one of next lines must be active - other values in l3/rrc/rrc_qos.h -#define NASRG_DEFAULTRAB_QoS 2 //MW-01/01/07- RRC_QOS_CONV_64_64 -//#define NASRG_DEFAULTRAB_QoS 3 //MW-01/01/07- RRC_QOS_CONV_128_128 -//#define NASRG_DEFAULTRAB_QoS 4 //MW-01/01/07- RRC_QOS_CONV_256_256 -//#define NASRG_DEFAULTRAB_QoS 5 //MW-01/01/07- RRC_QOS_CONV_320_320 -//#define NASRG_DEFAULTRAB_QoS 11 //LG RRC_QOS_INTER_128_64 -// -#define NASRG_DEFAULTRAB_CLASSREF 1 //MW-01/01/07 -#define NASRG_DEFAULTRAB_DSCP 0 //MW-01/01/07 -#define NASRG_DEFAULTRAB_IPVERSION NAS_VERSION_DEFAULT //MW-01/01/07 -// End default RAB - -//Temp - hard coded -#define NASRG_OWN_CELLID 5 -#define NASRG_TEMP_2NDRAB_DSCP 5 -#define NASRG_TEMP_MBMS_SESSION_ID 1 -#define NASRG_TEMP_MBMS_DURATION 999 -#define NAS_DEFAULT_IPv6_PREFIX_LENGTH 128 // used to compare destination address with MT's - -// General Constants -#define NAS_MTU 1500 -#define NAS_TX_QUEUE_LEN 100 -#define NAS_ADDR_LEN 8 -#define NAS_INET6_ADDRSTRLEN 46 -#define NAS_INET_ADDRSTRLEN 16 - -#define NAS_RESET_RX_FLAGS 0 - -#define NAS_CX_MAX 3 //Identical to RRC constant -//#define NAS_CX_MULTICAST_ALLNODE 2 - -#define NASRG_MBMS_SVCES_MAX 4 // Identical to RRC constant - -#define NAS_RB_MAX_NUM 32 // maximum number of RBs per MT - 25.331 -#define NAS_RETRY_LIMIT_DEFAULT 5 - -#define NAS_MESSAGE_MAXLEN 1600 - -// UMTS -#define NAS_SIG_SRB3 3 -#define NAS_SIG_SRB4 3 // not used yet -//LTE -#define NAS_SIG_NUM_SRB 3 // number of srbs in LTE to send Rb_Id to PDCP - - -//peer-to-peer messages between NAS entities -#define NAS_CMD_OPEN_RB 1 -#define NAS_CMD_ENTER_SLEEP 2 -#define NAS_CMD_LEAVE_SLEEP 3 - -#define NAS_CX_RELEASE_UNDEF_CAUSE 1 - -// MT+RG NAS States -#define NAS_IDLE 0x01 -// Connection -#define NAS_CX_FACH 0x06 -#define NAS_CX_DCH 0x0A -#define NAS_CX_RECEIVED 0x10 -#define NAS_CX_CONNECTING 0x04 -#define NAS_CX_RELEASING 0x08 -#define NAS_CX_CONNECTING_FAILURE 0x14 -#define NAS_CX_RELEASING_FAILURE 0x18 -// Radio Bearers -#define NAS_RB_ESTABLISHING 0x24 -#define NAS_RB_RELEASING 0x28 -#define NAS_RB_ESTABLISHED 0x2A - - -#define NAS_TIMER_ESTABLISHMENT_DEFAULT 12 -#define NAS_TIMER_RELEASE_DEFAULT 2 -#define NAS_TIMER_IDLE UINT_MAX -#define NAS_TIMER_TICK HZ - -#define NAS_PDCPH_SIZE sizeof(struct pdcp_data_req_header_t) -#define NAS_IPV4_SIZE 20 -#define NAS_IPV6_SIZE 40 - -#define NAS_DIRECTION_SEND 0 -#define NAS_DIRECTION_RECEIVE 1 - -// function number -#define NAS_FCT_DEL_SEND 1 -#define NAS_FCT_QOS_SEND 2 -#define NAS_FCT_DC_SEND 3 -#define NAS_FCT_CTL_SEND 4 - -// type of IOCTL command -#define NASRG_IOCTL_RAL 0x89F0 - -// Error cause -#define NAS_ERROR_ALREADYEXIST 1 -#define NAS_ERROR_NOMEMORY 3 -#define NAS_ERROR_NOTMT 9 -#define NAS_ERROR_NOTRG 10 -#define NAS_ERROR_NOTIDLE 11 -#define NAS_ERROR_NOTCONNECTED 12 -#define NAS_ERROR_NORB 14 -#define NAS_ERROR_NOTCORRECTVALUE 32 -#define NAS_ERROR_NOTCORRECTLCR 33 -#define NAS_ERROR_NOTCORRECTDIR 34 -#define NAS_ERROR_NOTCORRECTDSCP 35 -#define NAS_ERROR_NOTCORRECTVERSION 36 -#define NAS_ERROR_NOTCORRECTRABI 37 - - -/**********************************************************/ -/* Constants related with IP protocols */ -/**********************************************************/ - -// Destination address types -#define NAS_IPV6_ADDR_UNICAST 1 -#define NAS_IPV6_ADDR_MC_SIGNALLING 2 -#define NAS_IPV6_ADDR_MC_MBMS 3 -#define NAS_IPV6_ADDR_UNKNOWN 4 - -#define NAS_IPV4_ADDR_UNICAST 5 -#define NAS_IPV4_ADDR_MC_SIGNALLING 6 -#define NAS_IPV4_ADDR_BROADCAST 7 -#define NAS_IPV4_ADDR_UNKNOWN 8 - -//#define NAS_TRAFFICCLASS_MASK __constant_htonl(0x0fc00000) Yan -#define NAS_TRAFFICCLASS_MASK __constant_htonl(0x0ff00000) - -// Network control codepoint 111000 + IP version 6 -#define NAS_FLOWINFO_NCONTROL __constant_htonl(0x6e000000) -// network control codepoint 111000 -#define NAS_DSCP_NCONTROL 56 //0x38 -// default codepoint 1000000 -#define NAS_DSCP_DEFAULT 64 -#define NAS_DSCP_MAX 65 - -#define NAS_PROTOCOL_DEFAULT 0 -#define NAS_PROTOCOL_TCP IPPROTO_TCP -#define NAS_PROTOCOL_UDP IPPROTO_UDP -#define NAS_PROTOCOL_ICMP4 IPPROTO_ICMP -#define NAS_PROTOCOL_ICMP6 IPPROTO_ICMPV6 - -#define NAS_PORT_DEFAULT __constant_htons(65535) -#define NAS_PORT_HTTP __constant_htons(80) - -#define NAS_VERSION_DEFAULT 0 -#define NAS_VERSION_4 4 -#define NAS_VERSION_6 6 //?MW - -/**********************************************************/ -/* Constants related with Netlink sockets */ -/**********************************************************/ -#define OAI_IP_DRIVER_NETLINK_ID 31 -#define NL_DEST_PID 1 - -// defined in rrc_nas_sap.h -//#define NAS_RRCNL_ID 30 -//#define NL_DEST_RRC_PID 2 - -#define NASNL_DEST_PDCP 0 -#define NASNL_DEST_RRC 1 - -#endif - - - diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c deleted file mode 100755 index 10dc702540..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_device.c +++ /dev/null @@ -1,550 +0,0 @@ -/*************************************************************************** - nasrg_device.c - description -*************************************************************************** - Device Driver features for RG - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_device.c -* \brief Networking Device Driver for OpenAirInterface CELLULAR version - RG -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef PDCP_USE_NETLINK -#ifdef RTAI -#include "rtai_posix.h" -#define RTAI_IRQ 30 //try to get this irq with RTAI -#endif // RTAI -#endif // PDCP_USE_NETLINK -//:::::::::::::::::::::::::::::::::::::::;; -#include "nasrg_variables.h" -#include "nasrg_proto.h" -//:::::::::::::::::::::::::::::::::::::::;; -//#include -#include -#include -#include -#include -#ifdef NAS_DRIVER_TYPE_ETHERNET -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef NAS_DRIVER_TYPE_ETHERNET -#include -#endif -//:::::::::::::::::::::::::::::::::::::::;; -/* Global variables */ -struct net_device *gdev; -struct nas_priv *gpriv; -//int bytes_wrote; -//int bytes_read; -uint8_t NAS_RG_IMEI[14]= {0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x01}; -uint8_t NAS_NULL_IMEI[14]= {0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00}; - -uint16_t local_rg_cell_id; - -#ifdef PDCP_USE_NETLINK -extern void nasrg_netlink_release(void); -extern int nasrg_netlink_init(void); -#endif -extern void nasrg_ASCTL_timer(unsigned long data); - -#ifndef PDCP_USE_NETLINK -//--------------------------------------------------------------------------- -void *nasrg_interrupt(void) -{ - //--------------------------------------------------------------------------- - uint8_t cxi; -#ifdef NAS_DEBUG_INTERRUPT - printk("nasrg_interrupt - begin\n"); -#endif - - //spin_lock(&gpriv->lock); - for (cxi=0; cxicx+cxi); - - for (cxi=0; cxicx+cxi); - - //spin_unlock(&gpriv->lock); -#ifdef NAS_DEBUG_INTERRUPT - printk("nasrg_interrupt: end\n"); -#endif - // return 0; -} -#endif //NETLINK - -//--------------------------------------------------------------------------- -// Called by ifconfig when the device is activated by ifconfig -int nasrg_open(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - printk("nasrg_open: begin\n"); - - gpriv=netdev_priv(dev); - - // Address has already been set at init -#ifndef PDCP_USE_NETLINK - - if (gpriv->irq==-EBUSY) { - printk("nasrg_open: irq failure\n"); - return -EBUSY; - } - -#endif //NETLINK - - if(!netif_queue_stopped(dev)) - netif_start_queue(dev); - else - netif_wake_queue(dev); - - // - init_timer(&gpriv->timer); - (gpriv->timer).expires=jiffies+NAS_TIMER_TICK; - (gpriv->timer).data=0L; - (gpriv->timer).function=nasrg_ASCTL_timer; - add_timer(&gpriv->timer); - // - printk("nasrg_open: name = %s, end\n", dev->name); - return 0; -} - -//--------------------------------------------------------------------------- -// Called by ifconfig when the device is desactivated by ifconfig -int nasrg_stop(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - struct nas_priv *priv = netdev_priv(dev); - printk("nasrg_stop: begin\n"); - del_timer(&priv->timer); - netif_stop_queue(dev); - - printk("nasrg_stop: name = %s, end\n", dev->name); - return 0; -} - -//--------------------------------------------------------------------------- -void nasrg_teardown(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - int cxi; -#ifndef PDCP_USE_NETLINK - struct nas_priv *priv = netdev_priv(dev); -#endif //PDCP_USE_NETLINK - - printk("nasrg_teardown: begin\n"); - - if (dev) { -#ifndef PDCP_USE_NETLINK - - if (priv->irq!=-EBUSY) { - *pt_nas_rg_irq=-1; - rt_free_srq(priv->irq); - } - -#endif //PDCP_USE_NETLINK - -#ifdef PDCP_USE_NETLINK - nasrg_netlink_release(); -#endif //PDCP_USE_NETLINK - - // for (sapi=0; sapisap[sapi]); - nasrg_CLASS_flush_rclassifier(); - nasrg_CLASS_flush_mbmsclassifier(); - - for (cxi=0; cxicx+cxi); - nasrg_CLASS_flush_sclassifier(gpriv->cx+cxi); - //for (sapi=0; sapicx[cxi].sap[sapi]); - } - } // check dev - else { - printk("nasmt_teardown: Device is null\n"); - } - - printk("nasrg_teardown: end\n"); -} - -//--------------------------------------------------------------------------- -int nasrg_set_config(struct net_device *dev, struct ifmap *map) -{ - //--------------------------------------------------------------------------- - printk("nasrg_set_config: begin\n"); - - if (dev->flags & IFF_UP) - return -EBUSY; - - if (map->base_addr != dev->base_addr) { - printk(KERN_WARNING "nasrg_set_config: Can't change I/O address\n"); - return -EOPNOTSUPP; - } - - if (map->irq != dev->irq) - dev->irq = map->irq; - - return 0; -} - -//--------------------------------------------------------------------------- -int nasrg_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_DEVICE - printk("nasrg_hard_start_xmit: begin\n"); -#endif - - if ((!skb )||(!dev)) { - printk("nasrg_hard_start_xmit - input parameter skb or dev is NULL \n"); - return -1; - } - - // End debug information - netif_stop_queue(dev); - dev->trans_start = jiffies; -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasrg_hard_start_xmit: step 1\n"); -#endif - nasrg_CLASS_send(skb); -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasrg_hard_start_xmit: step 2\n"); -#endif - dev_kfree_skb(skb); -#ifdef NAS_DEBUG_SEND_DETAIL - printk("nasrg_hard_start_xmit: step 3\n"); -#endif - netif_wake_queue(dev); -#ifdef NAS_DEBUG_DEVICE - printk("nasrg_hard_start_xmit: end\n"); -#endif - return 0; -} - -//--------------------------------------------------------------------------- -struct net_device_stats *nasrg_get_stats(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - struct nas_priv *npriv = netdev_priv(dev); - return &npriv->stats; -} - -//--------------------------------------------------------------------------- -// New function from LITE DRIVER -int nasrg_set_mac_address(struct net_device *dev, void *mac) -{ - //--------------------------------------------------------------------------- - struct sockaddr *addr = mac; - printk("nasrg_set_mac_address: begin\n"); - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); - return 0; -} - -//--------------------------------------------------------------------------- -int nasrg_change_mtu(struct net_device *dev, int mtu) -{ - //--------------------------------------------------------------------------- - printk("nasrg_change_mtu: begin\n"); - - if ((mtu<50) || (mtu>1500)) - // if ((mtu<1280) || (mtu>1500)) - return -EINVAL; - - dev->mtu = mtu; - return 0; -} - -//--------------------------------------------------------------------------- -int nasrg_change_rx_flags(struct net_device *dev, int flags) -{ - //--------------------------------------------------------------------------- - //struct nas_priv *priv = netdev_priv(dev); - printk("nasrg_change_rx_flags %08X\n", flags); - gpriv->rx_flags ^= flags; - return 0; -} - -//--------------------------------------------------------------------------- -void nasrg_tx_timeout(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - /* Transmitter timeout, serious problems. */ - printk("nasrg_tx_timeout: begin\n"); - // ((struct nas_priv *)(dev->priv))->stats.tx_errors++; - (gpriv->stats).tx_errors++; - dev->trans_start = jiffies; - netif_wake_queue(dev); - printk("nasrg_tx_timeout: transmit timed out %s\n",dev->name); -} - -//--------------------------------------------------------------------------- -// Define pointers for the module -static const struct net_device_ops nasrg_netdev_ops = { - // ?? nasrg_ interrupt - // - .ndo_open = nasrg_open, - .ndo_stop = nasrg_stop, - .ndo_start_xmit = nasrg_hard_start_xmit, - .ndo_validate_addr = NULL, - .ndo_get_stats = nasrg_get_stats, - //#ifdef KERNEL_VERSION_GREATER_THAN_32 - // .ndo_set_multicast_list = NULL, - .ndo_set_mac_address = nasrg_set_mac_address, - .ndo_set_config = nasrg_set_config, - .ndo_do_ioctl = nasrg_CTL_ioctl, - .ndo_change_mtu = nasrg_change_mtu, - .ndo_tx_timeout = nasrg_tx_timeout, - .ndo_change_rx_flags = nasrg_change_rx_flags, - //#endif -}; -//--------------------------------------------------------------------------- - - -//--------------------------------------------------------------------------- -// Initialisation of the network device -void nasrg_init(struct net_device *dev) -{ - //--------------------------------------------------------------------------- - uint8_t cxi, dscpi; - - printk("nasrg_init: begin\n"); - - if (dev) { - gpriv=netdev_priv(dev); - - memset(gpriv, 0, sizeof(struct nas_priv)); - // Initialize function pointers - dev->netdev_ops = &nasrg_netdev_ops; - -#ifndef NAS_DRIVER_TYPE_ETHERNET - dev->type = ARPHRD_EURUMTS; - dev->features = NETIF_F_NO_CSUM; - dev->hard_header_len = 0; - dev->addr_len = NAS_ADDR_LEN; - dev->flags = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP; - dev->tx_queue_len = NAS_TX_QUEUE_LEN; - dev->mtu = NAS_MTU; -#endif - // Can be one of the following enum defined in include/linux/netdevice.h: - // enum netdev_state_t { - // __LINK_STATE_START, - // __LINK_STATE_PRESENT, - // __LINK_STATE_NOCARRIER, - // __LINK_STATE_LINKWATCH_PENDING, - // __LINK_STATE_DORMANT, - // }; - set_bit(__LINK_STATE_PRESENT, &dev->state); - -#ifdef NAS_DRIVER_TYPE_ETHERNET - // overwrite values written above ( header_ops,type,hard_header_len,mtu,addr_len,tx_queue_len,flags,broadcast) - printk("\nnasrg_init: WARNING Driver type ETHERNET\n"); - ether_setup(dev); -#endif - // - // Initialize private structure - gpriv->rx_flags = NAS_RESET_RX_FLAGS; - - gpriv->sap[NAS_GC_SAPI] = RRC_DEVICE_GC; - gpriv->sap[NAS_NT_SAPI] = RRC_DEVICE_NT; - gpriv->cx[0].sap[NAS_DC_INPUT_SAPI] = RRC_DEVICE_DC_INPUT0; - gpriv->cx[0].sap[NAS_DC_OUTPUT_SAPI] = RRC_DEVICE_DC_OUTPUT0; - gpriv->cx[1].sap[NAS_DC_INPUT_SAPI] = RRC_DEVICE_DC_INPUT1; - gpriv->cx[1].sap[NAS_DC_OUTPUT_SAPI] = RRC_DEVICE_DC_OUTPUT1; - // gpriv->sap[NAS_CO_INPUT_SAPI] = QOS_DEVICE_CONVERSATIONAL_INPUT; - // gpriv->sap[NAS_CO_OUTPUT_SAPI] = QOS_DEVICE_CONVERSATIONAL_OUTPUT; - gpriv->sap[NAS_DRB_INPUT_SAPI] = PDCP2PDCP_USE_RT_FIFO;//QOS_DEVICE_CONVERSATIONAL_INPUT; - gpriv->sap[NAS_DRB_OUTPUT_SAPI] = NAS2PDCP_FIFO;//QOS_DEVICE_STREAMING_INPUT; - // - gpriv->retry_limit=NAS_RETRY_LIMIT_DEFAULT; - gpriv->timer_establishment=NAS_TIMER_ESTABLISHMENT_DEFAULT; - gpriv->timer_release=NAS_TIMER_RELEASE_DEFAULT; - - for (dscpi=0; dscpirclassifier[dscpi]=NULL; - - gpriv->nrclassifier=0; - - // - for(cxi=0; cxicx[cxi].state=NAS_IDLE; - gpriv->cx[cxi].countimer=NAS_TIMER_IDLE; - gpriv->cx[cxi].retry=0; - gpriv->cx[cxi].lcr=cxi; - gpriv->cx[cxi].rb=NULL; - gpriv->cx[cxi].num_rb=0; - - // initialisation of the classifier - for (dscpi=0; dscpicx[cxi].sclassifier[dscpi]=NULL; - - gpriv->cx[cxi].nsclassifier=0; - // initialisation of the IP address - nasrg_TOOL_imei2iid(NAS_NULL_IMEI, (uint8_t *)gpriv->cx[cxi].iid6); - gpriv->cx[cxi].iid4=0; - } - - spin_lock_init(&gpriv->lock); - - nasrg_TOOL_RGimei2iid(NAS_RG_IMEI, dev->dev_addr);// IMEI to device address (for stateless autoconfiguration address) - printk("nasrg_init: init IMEI to IID\n"); - nasrg_ASCTL_init(); - } else { - printk("\n\nnasmt_init: ERROR, Device is NULL!!\n"); - } - - printk("nasrg_init: end\n"); - return ; -} - -//--------------------------------------------------------------------------- -int init_module (void) -{ - //--------------------------------------------------------------------------- - int err; - int inst = 0; - struct nas_priv *priv; - char devicename[100]; - - printk("\n\n\n\nnasrg_init_module: begin \n"); - - // Initialize parameters shared with RRC -#ifndef PDCP_USE_NETLINK - - if (pt_nas_rg_irq==NULL) { - printk("nasrg_init_module: shared irq parameter not initialised\n"); - err = -EBUSY; - printk("nasrg_init_module: returning %d \n\n", err); - return err; - } - - printk("nasrg_init_module: pt_nas_rg_irq valid \n"); -#endif - - /* - if (pt_rg_own_cell_id==NULL){ - printk("nasrg_init_module: shared cell_id parameter not initialised\n"); - err = -EBUSY; - printk("nasrg_init_module: returning %d \n\n\n", err); - return err; - } - printk("nasrg_init_module: pt_rg_own_cell_id valid \n"); - *pt_rg_own_cell_id = NASRG_OWN_CELLID; - */ - local_rg_cell_id = NASRG_OWN_CELLID; - - // Allocate device structure - sprintf(devicename,"oai%d",inst); -#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0) - gdev = alloc_netdev(sizeof(struct nas_priv), devicename, nasrg_init); -#else - gdev = alloc_netdev(sizeof(struct nas_priv), devicename, NET_NAME_PREDICTABLE, nasrg_init); -#endif - printk("nasrg_init_module: after alloc_netdev \n"); - priv = netdev_priv(gdev); - //// - // -#ifndef PDCP_USE_NETLINK - priv->irq=rt_request_srq(0, nasrg_interrupt, NULL); - - if (priv->irq == -EBUSY || priv->irq == -EINVAL) { - printk("nasrg_init_module: No interrupt resource available\n"); - - if (gdev) { - free_netdev(gdev); - printk("nasrg_init_module: free_netdev ..\n"); - } - - return -EBUSY; - } else - printk("nasrg_init_module: Interrupt %d, ret = %d \n", priv->irq , ret); - - if (pt_nas_rg_irq==NULL) { - printk("nasmt_init_module: shared irq parameter has been reset\n"); - } else { - *pt_nas_rg_irq=priv->irq; - } - -#endif - // - ////// -#ifdef PDCP_USE_NETLINK - - if ((err=nasrg_netlink_init()) < 0) - printk("nasrg_init_module: NETLINK failed\n"); - - printk("nasrg_init_module: NETLINK INIT successful\n"); -#endif //NETLINK - - err= register_netdev(gdev); - - if (err) { - printk("nasrg_init_module: error %i registering device %s\n", err, gdev->name); - } else { - printk("nasrg_init_module: registering device %s, ifindex = %d\n\n",gdev->name, gdev->ifindex); - } - - return err; -} - -//--------------------------------------------------------------------------- -void cleanup_module(void) -{ - //--------------------------------------------------------------------------- - printk("nasrg_cleanup_module: begin\n"); - unregister_netdev(gdev); - nasrg_teardown(gdev); - free_netdev(gdev); - printk("nasrg_cleanup_module: end\n\n\n\n"); -} - -//--------------------------------------------------------------------------- -// Replaced by init_module and cleanup_module -//module_init (nasrg_init_module); -//module_exit (nasrg_cleanup_module); -//--------------------------------------------------------------------------- - -#define DRV_NAME "oai_nasrg" -#define DRV_VERSION "3.0.1"DRV_NAME -#define DRV_DESCRIPTION "OPENAIR CELLULAR LTE NASRG (eNodeB) Device Driver" -#define DRV_COPYRIGHT "-Copyright(c) GNU GPL Eurecom 2013" -#define DRV_AUTHOR "Michelle Wetterwald "DRV_COPYRIGHT - -// MODULE_LICENSE("GPL"); -// MODULE_DESCRIPTION("LTE Driver for eNodeB, playing as Non Access Stratum"); -// MODULE_AUTHOR("Michelle Wetterwald "); diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c deleted file mode 100755 index 727614ed22..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.c +++ /dev/null @@ -1,913 +0,0 @@ -/*************************************************************************** - nasrg_iocontrol.c - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasrg_iocontrol.c -* \brief I/O control functions for upper layers of driver for OpenAirInterface CELLULAR version - RG -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#include "nasrg_variables.h" -#include "nasrg_iocontrol.h" -#include "nasrg_proto.h" - -//#include -#include -#include -#include - -// Statistic -/////////////////////////////////////////////////////////////////////////////// - -//--------------------------------------------------------------------------- -void nasrg_set_msg_statistic_reply(struct nas_msg_statistic_reply *msgrep) -{ - //--------------------------------------------------------------------------- - msgrep->rx_packets=gpriv->stats.rx_packets; - msgrep->tx_packets=gpriv->stats.tx_packets; - msgrep->rx_bytes=gpriv->stats.rx_bytes; - msgrep->tx_bytes=gpriv->stats.tx_bytes; - msgrep->rx_errors=gpriv->stats.rx_errors; - msgrep->tx_errors=gpriv->stats.tx_errors; - msgrep->rx_dropped=gpriv->stats.rx_dropped; - msgrep->tx_dropped=gpriv->stats.tx_dropped; -} - -//--------------------------------------------------------------------------- -int nasrg_ioCTL_statistic_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_statistic_reply msgrep; - printk("nasrg_ioCTL_statistic: stat requested\n"); - nasrg_set_msg_statistic_reply(&msgrep); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasrg_ioCTL_statistic: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - - -/////////////////////////////////////////////////////////////////////////////// -// Connections List -//--------------------------------------------------------------------------- -void nasrg_set_msg_cx_list_reply(uint8_t *msgrep) -{ - //--------------------------------------------------------------------------- - struct cx_entity *cx; - nasLocalConnectionRef_t lcr; - struct nas_msg_cx_list_reply *list; - msgrep[0]=NAS_CX_MAX; - list=(struct nas_msg_cx_list_reply *)(msgrep+1); - - for(lcr=0; lcrstate; - list[lcr].cellid=cx->cellid; - list[lcr].iid4=cx->iid4; - list[lcr].iid6[0]=cx->iid6[0]; - list[lcr].iid6[1]=cx->iid6[1]; - list[lcr].num_rb=cx->num_rb; - list[lcr].nsclassifier=cx->nsclassifier; - printk("nasrg_set_msg_cx_list: nsc=%u\n",cx->nsclassifier); - } -} - -//--------------------------------------------------------------------------- -int nasrg_ioCTL_cx_list_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - uint8_t msgrep[NAS_CX_MAX*sizeof(struct nas_msg_cx_list_reply)+1]; - printk("nasrg_ioCTL_cx_list: connection list requested\n"); - nasrg_set_msg_cx_list_reply(msgrep); - - if (copy_to_user(gifr->msg, msgrep, NAS_CX_MAX*sizeof(struct nas_msg_cx_list_reply)+1)) { - printk("nasrg_ioCTL_cx_list: copy_to_user failure\n"); - return -EFAULT; - } - - printk("nasrg_ioCTL_cx_list: end\n"); - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Connection Establishment -//--------------------------------------------------------------------------- -void nasrg_set_msg_cx_establishment_reply(struct nas_msg_cx_establishment_reply *msgrep, struct nas_msg_cx_establishment_request *msgreq) -{ - //--------------------------------------------------------------------------- - msgrep->status=-NAS_ERROR_NOTMT; -} -//--------------------------------------------------------------------------- -int nasrg_ioCTL_cx_establishment_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_cx_establishment_request msgreq; - struct nas_msg_cx_establishment_reply msgrep; - printk("nasrg_ioCTL_cx_establishment: connection establishment requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasrg_ioCTL_cx_establishment: copy_from_user failure\n"); - return -EFAULT; - } - - nasrg_set_msg_cx_establishment_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasrg_ioCTL_cx_establishment: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Connection Release -//--------------------------------------------------------------------------- -void nasrg_set_msg_cx_release_reply(struct nas_msg_cx_release_reply *msgrep, struct nas_msg_cx_release_request *msgreq) -{ - //--------------------------------------------------------------------------- - msgrep->status=-NAS_ERROR_NOTMT; -} - -//--------------------------------------------------------------------------- -// Request the release of a connection -int nasrg_ioCTL_cx_release_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_cx_release_request msgreq; - struct nas_msg_cx_release_reply msgrep; - - printk("nasrg_set_msg_cx_release: connection release requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasrg_set_msg_cx_release: copy_from_user failure\n"); - return -EFAULT; - } - - nasrg_set_msg_cx_release_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasrg_set_msg_cx_release: copy_to_user failure\n"); - return -EFAULT; - } - - printk("nasrg_set_msg_cx_release: end\n"); - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Radio Bearer List -//--------------------------------------------------------------------------- -void nasrg_set_msg_rb_list_reply(uint8_t *msgrep, struct nas_msg_rb_list_request *msgreq) -{ - //--------------------------------------------------------------------------- - struct cx_entity *cx; - cx=nasrg_COMMON_search_cx(msgreq->lcr); - - if (cx!=NULL) { - uint8_t rbi; - struct rb_entity *rb; - struct nas_msg_rb_list_reply *list; - - if (cx->num_rb > NAS_LIST_RB_MAX) - msgrep[0] = NAS_LIST_RB_MAX; - else - msgrep[0] = cx->num_rb; - - list=(struct nas_msg_rb_list_reply *)(msgrep+1); - - // list all radio bearers - for (rb=cx->rb, rbi=0; (rb!=NULL)&&(rbinext, ++rbi) { - list[rbi].state=rb->state; - list[rbi].rab_id=rb->rab_id; - list[rbi].sapi=rb->sapi; - list[rbi].qos=rb->qos; - list[rbi].cnxid=rb->cnxid; - } - - // check if mt0 requested and multicast bearer started, then add it to the list - if ((msgreq->lcr==0)&&(gpriv->mbms_rb[0].mbms_rbId!=0)) { - printk("MT %d, MBMS bearer rb_id %d\n", msgreq->lcr, gpriv->mbms_rb[0].mbms_rbId); - //++rbi; - ++msgrep[0]; - list[rbi].state=gpriv->mbms_rb[0].state; - list[rbi].rab_id=gpriv->mbms_rb[0].mbms_rbId; - list[rbi].sapi=gpriv->mbms_rb[0].sapi; - list[rbi].qos=gpriv->mbms_rb[0].qos; - list[rbi].cnxid=gpriv->mbms_rb[0].cnxid; - printk("rab_id cnxid Sapi QoS State\n"); - printk("%u %u %u %u ", list[rbi].rab_id,list[rbi].cnxid, list[rbi].sapi, list[rbi].qos); - nasrg_TOOL_print_state(list[rbi].state); - printk("\n"); - } - } else - msgrep[0]=0; -} - -//--------------------------------------------------------------------------- -int nasrg_ioCTL_rb_list_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - uint8_t msgrep[NAS_LIST_RB_MAX*sizeof(struct nas_msg_rb_list_reply)+1]; - struct nas_msg_rb_list_request msgreq; - printk("nasrg_ioCTL_rb_list: Radio Bearer list requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasrg_ioCTL_rb_list: copy_from_user failure\n"); - return -EFAULT; - } - - nasrg_set_msg_rb_list_reply(msgrep, &msgreq); - - if (copy_to_user(gifr->msg, msgrep, NAS_LIST_RB_MAX*sizeof(struct nas_msg_rb_list_reply)+1)) { - printk("nasrg_ioCTL_rb_list: copy_to_user failure\n"); - return -EFAULT; - } - - printk("nasrg_ioCTL_rb_list: end\n"); - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Radio Bearer Establishment -//--------------------------------------------------------------------------- -void nasrg_set_msg_rb_establishment_reply(struct nas_msg_rb_establishment_reply *msgrep, struct nas_msg_rb_establishment_request *msgreq) -{ - //--------------------------------------------------------------------------- - if ((msgreq->rab_id<5)||(msgreq->rab_id>(NAS_RB_MAX_NUM-1))) - msgrep->status=-NAS_ERROR_NOTCORRECTRABI; - else { - struct cx_entity *cx; - cx=nasrg_COMMON_search_cx(msgreq->lcr); - - if (cx!=NULL) { //not multicast - struct rb_entity *rb; - rb=nasrg_COMMON_add_rb(cx, msgreq->rab_id, msgreq->qos); - - if (rb!=NULL) { - rb->cnxid = msgreq->cnxid; - rb->dscp = msgreq->dscp_dl; - rb->dscp_ul = msgreq->dscp_ul; - msgrep->status=nasrg_ASCTL_DC_send_rb_establish_request(cx, rb); - } else { - msgrep->status=-NAS_ERROR_NOMEMORY; - } - } else { //no MT found - if (msgreq->mcast_flag) { //multicast - int mbms_ix=0; // should allocate index based on Service_id /cnxid / MC IP address - // - gpriv->mbms_rb[mbms_ix].cnxid = msgreq->cnxid; - gpriv->mbms_rb[mbms_ix].serviceId = msgreq->cnxid; - gpriv->mbms_rb[mbms_ix].sessionId = NASRG_TEMP_MBMS_SESSION_ID; //Temp hard coded - gpriv->mbms_rb[mbms_ix].mbms_rbId = msgreq->rab_id; - gpriv->mbms_rb[mbms_ix].sapi = NAS_DC_INPUT_SAPI; -#ifdef NAS_DEBUG_MBMS_PROT - gpriv->mbms_rb[mbms_ix].sapi = NAS_DRB_INPUT_SAPI; //Only one RT-FIFO is used -#endif - gpriv->mbms_rb[mbms_ix].qos = msgreq->qos; - gpriv->mbms_rb[mbms_ix].dscp = msgreq->dscp_dl; - gpriv->mbms_rb[mbms_ix].duration = NASRG_TEMP_MBMS_DURATION; //Temp hard coded - memcpy ((char *)&(gpriv->mbms_rb[mbms_ix].mcast_address),(char *)&(msgreq->mcast_group), 16); - msgrep->status=nasrg_ASCTL_GC_send_mbms_bearer_establish_req(mbms_ix); - } else { - msgrep->status=-NAS_ERROR_NOTCORRECTLCR; - } - - msgrep->cnxid = msgreq->cnxid; - } - } -} - -//--------------------------------------------------------------------------- -int nasrg_ioCTL_rb_establishment_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_rb_establishment_request msgreq; - struct nas_msg_rb_establishment_reply msgrep; - printk("nasrg_ioCTL_rb_establishment: Radio bearer establishment requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasrg_ioCTL_rb_establishment: copy_from_user failure\n"); - return -EFAULT; - } - - nasrg_set_msg_rb_establishment_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasrg_ioCTL_rb_establishment: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Radio Bearer Release -//--------------------------------------------------------------------------- -void nasrg_set_msg_rb_release_reply(struct nas_msg_rb_release_reply *msgrep, struct nas_msg_rb_release_request *msgreq) -{ - //--------------------------------------------------------------------------- - if (msgreq->lcrrab_id!=NASRG_DEFAULTRAB_RBID) { - struct rb_entity *rb; - struct cx_entity *cx; - cx=nasrg_COMMON_search_cx(msgreq->lcr); - rb=nasrg_COMMON_search_rb(cx, msgreq->rab_id); - - if ((rb!=NULL)&&(cx!=NULL)) { - uint8_t dscp; - msgrep->status=nasrg_ASCTL_DC_send_rb_release_request(cx, rb); - dscp=rb->dscp; - nasrg_COMMON_del_rb(cx, msgreq->rab_id, dscp); - } else - msgrep->status=-NAS_ERROR_NOTCONNECTED; - - msgrep->cnxid = msgreq->cnxid; - } else { - msgrep->status=-NAS_ERROR_NOTCORRECTRABI; - } - } else { - if (msgreq->mcast_flag) { // multicast - int mbms_ix=0; // should search mbms_ix based on cnxid - msgrep->status=nasrg_ASCTL_GC_send_mbms_bearer_release_req(mbms_ix); - msgrep->cnxid = msgreq->cnxid; - } else { - msgrep->status=-NAS_ERROR_NOTCORRECTLCR; - } - } -} - -//--------------------------------------------------------------------------- -int nasrg_ioCTL_rb_release_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_rb_release_request msgreq; - struct nas_msg_rb_release_reply msgrep; - printk("nasrg_ioCTL_rb_release: Radio bearer release requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasrg_ioCTL_rb_release: copy_from_user failure\n"); - return -EFAULT; - } - - nasrg_set_msg_rb_release_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasrg_ioCTL_rb_release: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Classifier List -//--------------------------------------------------------------------------- -void nasrg_set_msg_class_list_reply(uint8_t *msgrep, struct nas_msg_class_list_request *msgreq) -{ - //--------------------------------------------------------------------------- - struct cx_entity *cx; - struct classifier_entity *gc; - struct nas_msg_class_list_reply *list; - uint8_t cli; - list=(struct nas_msg_class_list_reply *)(msgrep+1); - - switch(msgreq->dir) { - case NAS_DIRECTION_SEND: - cx=nasrg_COMMON_search_cx(msgreq->lcr); - - if (cx==NULL) { - msgrep[0]=0; - return; - } - - gc=cx->sclassifier[msgreq->dscp]; - break; - - case NAS_DIRECTION_RECEIVE: - cx=NULL; - gc=gpriv->rclassifier[msgreq->dscp]; - break; - - default: - cx=NULL; - msgrep[0]=0; - return; - } - - for (cli=0; (gc!=NULL)&&(clinext, ++cli) { - list[cli].classref=gc->classref; - list[cli].lcr=msgreq->lcr; - list[cli].dir=msgreq->dir; - list[cli].dscp=msgreq->dscp; - list[cli].rab_id=gc->rab_id; - list[cli].version=gc->version; - - switch(gc->version) { - case 4: - list[cli].saddr.ipv4 = gc->saddr.ipv4; - list[cli].daddr.ipv4 = gc->daddr.ipv4; - break; - - case 6: - list[cli].saddr.ipv6 = gc->saddr.ipv6; - list[cli].daddr.ipv6 = gc->daddr.ipv6; - break; - } - - list[cli].protocol=gc->protocol; - list[cli].sport=ntohs(gc->sport); - list[cli].dport=ntohs(gc->dport); - list[cli].splen=gc->splen; - list[cli].dplen=gc->dplen; - list[cli].fct=nasrg_TOOL_invfct(gc); - } - - msgrep[0]=cli; -} - -//--------------------------------------------------------------------------- -int nasrg_ioCTL_class_list_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - uint8_t msgrep[NAS_LIST_CLASS_MAX*sizeof(struct nas_msg_class_list_reply)+1]; - struct nas_msg_class_list_request msgreq; - printk("nasrg_ioCTL_class_list: classifier list requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasrg_ioCTL_class_list: copy_from_user failure\n"); - return -EFAULT; - } - - nasrg_set_msg_class_list_reply(msgrep, &msgreq); - - if (copy_to_user(gifr->msg, msgrep, NAS_LIST_CLASS_MAX*sizeof(struct nas_msg_class_list_reply)+1)) { - printk("nasrg_ioCTL_class_list: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Request the addition of a classifier rule -//--------------------------------------------------------------------------- -void nasrg_set_msg_class_add_reply(struct nas_msg_class_add_reply *msgrep, struct nas_msg_class_add_request *msgreq) -{ - //--------------------------------------------------------------------------- - struct classifier_entity *gc; - - if (msgreq->dscp>NAS_DSCP_DEFAULT) { - printk("nasrg_set_msg_class_add: Incoherent parameter value\n"); - msgrep->status=-NAS_ERROR_NOTCORRECTDSCP; - return; - } - - if (msgreq->dir==NAS_DIRECTION_SEND) { - struct cx_entity *cx; - cx=nasrg_COMMON_search_cx(msgreq->lcr); - - if (cx!=NULL) { - printk("nasrg_set_msg_class_add: DSCP %d, Classref %d\n",msgreq->dscp, msgreq->classref ); - gc=nasrg_CLASS_add_sclassifier(cx, msgreq->dscp, msgreq->classref); - printk("nasrg_set_msg_class_add: %p %p\n" , msgreq, gc); - - if (gc==NULL) { - msgrep->status=-NAS_ERROR_NOMEMORY; - return; - } - } else { - msgrep->status=-NAS_ERROR_NOTCORRECTLCR; - return; - } - - gc->rab_id=msgreq->rab_id; - gc->rb=nasrg_COMMON_search_rb(cx, gc->rab_id); - } else { - if (msgreq->dir==NAS_DIRECTION_RECEIVE) { - gc=nasrg_CLASS_add_rclassifier(msgreq->dscp, msgreq->classref); - - if (gc==NULL) { - msgrep->status=-NAS_ERROR_NOMEMORY; - return; - } - } else { - msgrep->status=-NAS_ERROR_NOTCORRECTDIR; - return; - } - } - - nasrg_TOOL_fct(gc, msgreq->fct); - gc->version=msgreq->version; - - switch(gc->version) { - case 4: - gc->saddr.ipv4=msgreq->saddr.ipv4; - gc->daddr.ipv4=msgreq->daddr.ipv4; - gc->splen=msgreq->splen; - gc->dplen=msgreq->dplen; - break; - - case 6: - gc->saddr.ipv6=msgreq->saddr.ipv6; - gc->daddr.ipv6=msgreq->daddr.ipv6; - gc->splen=msgreq->splen; - gc->dplen=msgreq->dplen; - break; - - case 0: - gc->saddr.ipv6.s6_addr32[0]=0; - gc->daddr.ipv6.s6_addr32[1]=0; - gc->saddr.ipv6.s6_addr32[2]=0; - gc->daddr.ipv6.s6_addr32[3]=0; - gc->splen=0; - gc->dplen=0; - break; - - default: - msgrep->status=-NAS_ERROR_NOTCORRECTVERSION; - kfree(gc); - return; - } - - gc->protocol=msgreq->protocol; - gc->sport=htons(msgreq->sport); - gc->dport=htons(msgreq->dport); - msgrep->status=0; -} - -//--------------------------------------------------------------------------- -int nasrg_ioCTL_class_add_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_class_add_request msgreq; - struct nas_msg_class_add_reply msgrep; - printk("nasrg_ioCTL_class_add: Add classifier components requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasrg_ioCTL_class_add: copy_from_user failure\n"); - return -EFAULT; - } - - nasrg_set_msg_class_add_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasrg_ioCTL_class_add: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// Request the deletion of a classifier rule -//--------------------------------------------------------------------------- -void nasrg_set_msg_class_del_reply(struct nas_msg_class_del_reply *msgrep, struct nas_msg_class_del_request *msgreq) -{ - //--------------------------------------------------------------------------- - if (msgreq->dscp>NAS_DSCP_DEFAULT) { - printk("nasrg_set_msg_class_del: Incoherent parameter value\n"); - msgrep->status=-NAS_ERROR_NOTCORRECTDSCP; - return; - } - - if (msgreq->dir==NAS_DIRECTION_SEND) { - struct cx_entity *cx; - cx=nasrg_COMMON_search_cx(msgreq->lcr); - - if (cx!=NULL) - nasrg_CLASS_del_sclassifier(cx, msgreq->dscp, msgreq->classref); - else { - msgrep->status=-NAS_ERROR_NOTCORRECTLCR; - return; - } - } else { - if (msgreq->dir==NAS_DIRECTION_RECEIVE) - nasrg_CLASS_del_rclassifier(msgreq->dscp, msgreq->classref); - else { - msgrep->status=-NAS_ERROR_NOTCORRECTDIR; - return; - } - } - - msgrep->status=0; -} - -//--------------------------------------------------------------------------- -int nasrg_ioCTL_class_del_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_class_del_request msgreq; - struct nas_msg_class_del_reply msgrep; - printk("nasrg_ioCTL_class_del: Del classifier components requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasrg_ioCTL_class_del: copy_from_user failure\n"); - return -EFAULT; - } - - nasrg_set_msg_class_del_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasrg_ioCTL_class_del: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// UE Multicast Join -//--------------------------------------------------------------------------- -void nasrg_set_ue_multicast_join_reply(struct nas_msg_mt_mcast_reply *msgrep, struct nas_msg_mt_mcast_join *msgreq) -{ - //--------------------------------------------------------------------------- - if (msgreq->ue_idue_id); - cx->requested_joined_services[0] = msgreq->cnxid; - msgrep->ue_id = msgreq->ue_id; - msgrep->result = nasrg_ASCTL_DC_send_mbms_ue_notify_req(cx); - msgrep->cnxid = msgreq->cnxid; - } else { - msgrep->result=-NAS_ERROR_NOTCORRECTLCR; - } -} - -//--------------------------------------------------------------------------- -int nasrg_ioCTL_ue_multicast_join_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_mt_mcast_join msgreq; - struct nas_msg_mt_mcast_reply msgrep; - printk("nasrg_ioCTL_ue_multicast_join: UE multicast join requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasrg_ioCTL_ue_multicast_join: copy_from_user failure\n"); - return -EFAULT; - } - - nasrg_set_ue_multicast_join_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasrg_ioCTL_ue_multicast_join: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// UE Multicast Leave -//--------------------------------------------------------------------------- -void nasrg_set_ue_multicast_leave_reply(struct nas_msg_mt_mcast_reply *msgrep, struct nas_msg_mt_mcast_leave *msgreq) -{ - //--------------------------------------------------------------------------- - if (msgreq->ue_idue_id); - cx->requested_left_services[0] = msgreq->cnxid; - msgrep->ue_id = msgreq->ue_id; - msgrep->result = nasrg_ASCTL_DC_send_mbms_ue_notify_req(cx); - msgrep->cnxid = msgreq->cnxid; - } else { - msgrep->result=-NAS_ERROR_NOTCORRECTLCR; - } -} - -//--------------------------------------------------------------------------- -int nasrg_ioCTL_ue_multicast_leave_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_mt_mcast_leave msgreq; - struct nas_msg_mt_mcast_reply msgrep; - printk("nasrg_ioCTL_ue_multicast_leave: UE multicast leave requested\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasrg_ioCTL_ue_multicast_leave: copy_from_user failure\n"); - return -EFAULT; - } - - nasrg_set_ue_multicast_leave_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasrg_ioCTL_ue_multicast_leave: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// ENB Measures -// Messages for triggering measurement -//--------------------------------------------------------------------------- -void nasrg_set_msg_eNBmeasure_trigger_reply(struct nas_msg_enb_measure_trigger_reply *msgrep, struct nas_msg_enb_measure_trigger *msgreq) -{ - //--------------------------------------------------------------------------- - struct cx_entity *cx; - int lcr=0; // Temp lcr->mt =0 (should be GC uplink) - - cx=nasrg_COMMON_search_cx(lcr); - - if (msgreq->cell_id != cx->cellid) - printk("\nERROR : invalid cell_id received\n\n"); - - if (nasrg_ASCTL_DC_send_eNBmeasurement_req(cx)>0) - msgrep->status = 0; - else - msgrep->status = NAS_ERROR_NOTCORRECTVALUE ; -} -//--------------------------------------------------------------------------- -int nasrg_ioCTL_eNBmeasure_trigger_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_enb_measure_trigger msgreq; - struct nas_msg_enb_measure_trigger_reply msgrep; - printk("nasrg_ioCTL_eNBmeasure_trigger_request: Measures triggered\n"); - - if (copy_from_user(&msgreq, gifr->msg, sizeof(msgreq))) { - printk("nasrg_ioCTL_eNBmeasure_trigger_request: copy_from_user failure\n"); - return -EFAULT; - } - - nasrg_set_msg_eNBmeasure_trigger_reply(&msgrep, &msgreq); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasrg_ioCTL_eNBmeasure_trigger_request: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -// ENb Measurement -// Messages for Measurement retrieval -//--------------------------------------------------------------------------- -void nasrg_set_msg_eNBmeasure_retrieve_reply(struct nas_msg_enb_measure_retrieve *msgrep) -{ - //--------------------------------------------------------------------------- - int i; - - msgrep->cell_id = gpriv->measured_cell_id; - msgrep->num_UEs = gpriv->num_UEs; - - for (i=0; i num_UEs; i++) { - msgrep->measures[i].rlcBufferOccupancy = gpriv->rlcBufferOccupancy[i]; - msgrep->measures[i].scheduledPRB = gpriv->scheduledPRB[i]; - msgrep->measures[i].totalDataVolume = gpriv->totalDataVolume[i]; - //clean variables - gpriv->rlcBufferOccupancy[i] = 0; - gpriv->scheduledPRB[i] = 0; - gpriv->totalDataVolume[i] = 0; - } - - msgrep->totalNumPRBs = gpriv->totalNumPRBs; - //clean variable - gpriv->totalNumPRBs = 0; -} -//--------------------------------------------------------------------------- -int nasrg_ioCTL_eNBmeasure_retrieve_request(struct nas_ioctl *gifr) -{ - //--------------------------------------------------------------------------- - struct nas_msg_enb_measure_retrieve msgrep; - printk("nasrg_ioCTL_eNBmeasure_retrieve_request: Measurement requested\n"); - - nasrg_set_msg_eNBmeasure_retrieve_reply(&msgrep); - - if (copy_to_user(gifr->msg, &msgrep, sizeof(msgrep))) { - printk("nasrg_ioCTL_eNBmeasure_retrieve_request: copy_to_user failure\n"); - return -EFAULT; - } - - return 0; -} - - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// IOCTL command -//--------------------------------------------------------------------------- -int nasrg_CTL_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -{ - //--------------------------------------------------------------------------- - struct nas_ioctl *gifr; - int r; - printk("nasrg_CTL_ioctl: begin\n"); - spin_lock(&gpriv->lock); - - switch(cmd) { - case NASRG_IOCTL_RAL: - gifr=(struct nas_ioctl *)ifr; - - switch(gifr->type) { - case NAS_MSG_STATISTIC_REQUEST: - r=nasrg_ioCTL_statistic_request(gifr); - break; - - case NAS_MSG_CX_ESTABLISHMENT_REQUEST: - r=nasrg_ioCTL_cx_establishment_request(gifr); - break; - - case NAS_MSG_CX_RELEASE_REQUEST: - r=nasrg_ioCTL_cx_release_request(gifr); - break; - - case NAS_MSG_CX_LIST_REQUEST: - r=nasrg_ioCTL_cx_list_request(gifr); - break; - - case NAS_MSG_RB_ESTABLISHMENT_REQUEST: - r=nasrg_ioCTL_rb_establishment_request(gifr); - break; - - case NAS_MSG_RB_RELEASE_REQUEST: - r=nasrg_ioCTL_rb_release_request(gifr); - break; - - case NAS_MSG_RB_LIST_REQUEST: - r=nasrg_ioCTL_rb_list_request(gifr); - break; - - case NAS_MSG_CLASS_ADD_REQUEST: - r=nasrg_ioCTL_class_add_request(gifr); - break; - - case NAS_MSG_CLASS_LIST_REQUEST: - r=nasrg_ioCTL_class_list_request(gifr); - break; - - case NAS_MSG_CLASS_DEL_REQUEST: - r=nasrg_ioCTL_class_del_request(gifr); - break; - - case NAS_RG_MSG_MT_MCAST_JOIN: - r=nasrg_ioCTL_ue_multicast_join_request(gifr); - break; - - case NAS_RG_MSG_MT_MCAST_LEAVE: - r=nasrg_ioCTL_ue_multicast_leave_request(gifr); - break; - - case NAS_MSG_ENB_MEAS_TRIGGER: - r=nasrg_ioCTL_eNBmeasure_trigger_request(gifr); - break; - - case NAS_MSG_ENB_MEAS_RETRIEVE: - r=nasrg_ioCTL_eNBmeasure_retrieve_request(gifr); - break; - - default: - printk("nasrg_CTL_ioctl: unkwon request type, type=%x\n", gifr->type); - r=-EFAULT; - } - - break; - - default: - printk("nasrg_CTL_ioctl: Unknown ioctl command, cmd=%x\n", cmd); - r=-EFAULT; - } - - spin_unlock(&gpriv->lock); - printk("nasrg_CTL_ioctl: end\n"); - return r; -} - -//--------------------------------------------------------------------------- -void nasrg_CTL_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc) -{ - //--------------------------------------------------------------------------- - printk("nasrg_CTL_send - void \n"); -} - diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h deleted file mode 100755 index 6ae41f0599..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_iocontrol.h +++ /dev/null @@ -1,258 +0,0 @@ -/*************************************************************************** - nasrg_iocontrol.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasrg_iocontrol.h -* \brief I/O control constnats and structures for upper layers of driver for OpenAirInterface CELLULAR version - RG -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef NASRGD_CTL_H -#define NASRGD_CTL_H - -#include -#include -#include -#include - -#define NAS_MSG_MAXLEN 1100 - -// type of CTL message -#define NAS_MSG_STATISTIC_REQUEST 1 -#define NAS_MSG_STATISTIC_REPLY 2 -#define NAS_MSG_ECHO_REQUEST 3 -#define NAS_MSG_ECHO_REPLY 4 -#define NAS_MSG_CX_ESTABLISHMENT_REQUEST 5 -#define NAS_MSG_CX_ESTABLISHMENT_REPLY 6 -#define NAS_MSG_CX_RELEASE_REQUEST 7 -#define NAS_MSG_CX_RELEASE_REPLY 8 -#define NAS_MSG_CX_LIST_REQUEST 9 -#define NAS_MSG_CX_LIST_REPLY 10 -#define NAS_MSG_RB_ESTABLISHMENT_REQUEST 11 -#define NAS_MSG_RB_ESTABLISHMENT_REPLY 12 -#define NAS_MSG_RB_RELEASE_REQUEST 13 -#define NAS_MSG_RB_RELEASE_REPLY 14 -#define NAS_MSG_RB_LIST_REQUEST 15 -#define NAS_MSG_RB_LIST_REPLY 16 -#define NAS_MSG_CLASS_ADD_REQUEST 17 -#define NAS_MSG_CLASS_ADD_REPLY 18 -#define NAS_MSG_CLASS_DEL_REQUEST 19 -#define NAS_MSG_CLASS_DEL_REPLY 20 -#define NAS_MSG_CLASS_LIST_REQUEST 21 -#define NAS_MSG_CLASS_LIST_REPLY 22 -#define NAS_MSG_NEIGHBOUR_REQUEST 23 -#define NAS_MSG_NEIGHBOUR_REPLY 24 -//MBMS -#define NAS_RG_MSG_MT_MCAST_JOIN 30 -#define NAS_RG_MSG_MT_MCAST_LEAVE 31 -#define NAS_RG_MSG_MT_MCAST_REPLY 32 -// ENB MEASURES (MEDIEVAL DEMO 3) -#define NAS_MSG_ENB_MEAS_TRIGGER 33 -#define NAS_MSG_ENB_MEAS_RETRIEVE 34 - - -// Max number of entry of a message list -#define NAS_LIST_CX_MAX 32 -#define NAS_LIST_RB_MAX 32 -#define NAS_LIST_CLASS_MAX 32 - -typedef uint16_t nasMsgType_t; - -struct nas_ioctl { - char name[IFNAMSIZ]; - nasMsgType_t type; - char *msg; -}; - -//**** -struct nas_msg_statistic_reply { - uint32_t rx_packets; - uint32_t tx_packets; - uint32_t rx_bytes; - uint32_t tx_bytes; - uint32_t rx_errors; - uint32_t tx_errors; - uint32_t rx_dropped; - uint32_t tx_dropped; -}; - -//**** -struct nas_msg_cx_list_reply { - nasLocalConnectionRef_t lcr; // Local Connection reference - uint8_t state; - nasCellID_t cellid; // cell identification - uint32_t iid6[2]; // IPv6 interface identification - uint8_t iid4; // IPv4 interface identification - uint16_t num_rb; - uint16_t nsclassifier; -}; -//**** -struct nas_msg_cx_establishment_reply { - int status; -}; -struct nas_msg_cx_establishment_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - nasCellID_t cellid; // Cell identification -}; -//**** -struct nas_msg_cx_release_reply { - int status; -}; -struct nas_msg_cx_release_request { - nasLocalConnectionRef_t lcr; // Local Connection reference -}; - -//**** -struct nas_msg_rb_list_reply { - nasRadioBearerId_t rab_id; - nasSapId_t sapi; - nasQoSTrafficClass_t qos; - uint8_t state; - uint32_t cnxid; -}; -struct nas_msg_rb_list_request { - nasLocalConnectionRef_t lcr; // Local Connection reference -}; -//**** -struct nas_msg_rb_establishment_reply { - int status; - uint32_t cnxid; -}; -struct nas_msg_rb_establishment_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - nasRadioBearerId_t rab_id; - nasQoSTrafficClass_t qos; - uint16_t dscp_ul; - uint16_t dscp_dl; - uint16_t mcast_flag; - uint8_t mcast_group[16]; - uint32_t cnxid; -}; - -//**** -struct nas_msg_rb_release_reply { - int status; - uint32_t cnxid; -}; -struct nas_msg_rb_release_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - nasRadioBearerId_t rab_id; - uint16_t mcast_flag; - uint32_t cnxid; -}; - -//**** -struct nas_msg_class_add_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - nasRadioBearerId_t rab_id; - uint8_t dir; // direction (send or receive) - uint8_t dscp; // codepoint - uint8_t fct; - uint16_t classref; - uint8_t version; - union { - struct in6_addr ipv6; - uint32_t ipv4; - } saddr; // IP source address - uint8_t splen; // prefix length - union { - struct in6_addr ipv6; - uint32_t ipv4; - } daddr; // IP destination address - uint8_t dplen; // prefix length - uint8_t protocol; // high layer protocol type - uint16_t sport; // source port - uint16_t dport; // destination port -}; -struct nas_msg_class_add_reply { - int status; -}; -//**** -struct nas_msg_class_del_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - uint8_t dir; // direction (send or receive) - uint8_t dscp; // codepoint - uint16_t classref; -}; -struct nas_msg_class_del_reply { - int status; -}; -//**** -#define nas_msg_class_list_reply nas_msg_class_add_request -struct nas_msg_class_list_request { - nasLocalConnectionRef_t lcr; // Local Connection reference - uint8_t dir; - uint8_t dscp; -}; - -//**** -struct nas_msg_neighbour_cell_list_reply { - nasCellID_t cellid; // cell identification - uint32_t iid6[4]; // IPv6 address of access router -}; - -//MBMS -//**** -struct nas_msg_mt_mcast_join { - nasLocalConnectionRef_t ue_id; - uint32_t cnxid; - nasRadioBearerId_t rab_id; -}; - -struct nas_msg_mt_mcast_leave { - nasLocalConnectionRef_t ue_id; - uint32_t cnxid; - nasRadioBearerId_t rab_id; -}; - -struct nas_msg_mt_mcast_reply { - nasLocalConnectionRef_t ue_id; - uint32_t cnxid; - int result; -}; -//**** - -//MEDIEVAL DEMO 3 -//**** -struct nas_msg_enb_measure_trigger { - nasCellID_t cell_id; -}; -struct nas_msg_enb_measure_trigger_reply { - int status; -}; - -struct nas_msg_enb_measure_retrieve { - nasCellID_t cell_id; - nasNumConnUEs_t num_UEs; - nasENbMeasures_t measures[MAX_MEASURE_UE]; - nasENbMeasure_t totalNumPRBs; -}; - - -#endif diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c deleted file mode 100755 index 3736bc3fcf..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_netlink.c +++ /dev/null @@ -1,254 +0,0 @@ -/*************************************************************************** - nasrg_netlink.c - description - ------------------- - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasrg_netlink.c -* \brief Netlink socket functions for OpenAirInterface CELLULAR version - MT -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -//#include -#include -#include -#include -#include -#include -#include - -#include - -#include "nasrg_variables.h" -#include "nasrg_proto.h" - -static struct sock *nas_nl_sk = NULL; -static struct sock *nas_rrcnl_sk = NULL; - -//static int exit_netlink_thread=0; -static DEFINE_MUTEX(nasrg_mutex); - -// This can also be implemented using thread to get the data from PDCP without blocking. -//--------------------------------------------------------------------------- -// Function for transfer with PDCP (from NASLITE) -static void nasrg_nl_data_ready (struct sk_buff *skb) -{ - //--------------------------------------------------------------------------- - struct nlmsghdr *nlh = NULL; - - // Start debug information -#ifdef NETLINK_DEBUG - printk("nasrg_nl_data_ready - begin \n"); -#endif - - if (!skb) { - printk("nasrg_nl_data_ready - input parameter skb is NULL \n"); - return; - } - - // End debug information - -#ifdef NETLINK_DEBUG - printk("nasrg_nl_data_ready - Received socket from PDCP\n"); -#endif //NETLINK_DEBUG - nlh = (struct nlmsghdr *)skb->data; - nasrg_COMMON_QOS_receive(nlh); -} - -//--------------------------------------------------------------------------- -// Function for transfer with RRC -static void nasrg_rrcnl_data_ready (struct sk_buff *skb) -{ - //--------------------------------------------------------------------------- - struct nlmsghdr *nlh = NULL; - char target_sap; - uint8_t cxi; - - // Start debug information -#ifdef NAS_DEBUG_RRCNL - printk("nasrg_rrcnl_data_ready - begin \n"); -#endif - - if (!skb) { - printk("nasrg_rrcnl_data_ready - input parameter skb is NULL \n"); - return; - } - - // End debug information - - nlh = (struct nlmsghdr *)skb->data; - //pdcph = (struct pdcp_data_ind_header_t *)NLMSG_DATA(nlh); - //nasrg_TOOL_print_buffer((char *)NLMSG_DATA(nlh), 48); - - target_sap = ((char*)NLMSG_DATA(nlh))[0]; -#ifdef NAS_DEBUG_RRCNL - printk("nasrg_rrcnl_data_ready - Received on socket from RRC, SAP %d\n", target_sap); -#endif //NAS_DEBUG_RRCNL - - switch (target_sap) { - case RRC_NAS_DC0_OUT: - //printk("nasrg_rrcnl_data_ready - Calling nasrg_ASCTL_DC_receive\n"); - cxi = 0; - nasrg_ASCTL_DC_receive(gpriv->cx+cxi, &((char*)NLMSG_DATA(nlh))[1]); - break; - - case RRC_NAS_DC1_OUT: - //printk("nasrg_rrcnl_data_ready - Calling nasrg_ASCTL_DC_receive\n"); - cxi = 1; - nasrg_ASCTL_DC_receive(gpriv->cx+cxi, &((char*)NLMSG_DATA(nlh))[1]); - break; - - case RRC_NAS_DC2_OUT: - //printk("nasrg_rrcnl_data_ready - Calling nasrg_ASCTL_DC_receive\n"); - cxi = 2; - nasrg_ASCTL_DC_receive(gpriv->cx+cxi, &((char*)NLMSG_DATA(nlh))[1]); - break; - - default: - printk("nasrg_rrcnl_data_ready - Invalid SAP value received\n"); - } - -} - -//--------------------------------------------------------------------------- -int nasrg_netlink_init(void) -{ - //--------------------------------------------------------------------------- - printk("nasrg_netlink_init - begin \n"); - - nas_nl_sk = netlink_kernel_create(&init_net,OAI_IP_DRIVER_NETLINK_ID, 0, nasrg_nl_data_ready, - &nasrg_mutex, // NULL - THIS_MODULE); - - if (!nas_nl_sk) { - printk("nasrg_netlink_init - netlink_kernel_create failed for PDCP socket\n"); - // TEMP printk("nasrg_netlink_init - netlink_kernel_create failed for PDCP socket %d\n", errno); - return(-1); - } - - nas_rrcnl_sk = netlink_kernel_create(&init_net,NAS_RRCNL_ID, 0, nasrg_rrcnl_data_ready, - &nasrg_mutex, // NULL - THIS_MODULE); - - if (!nas_rrcnl_sk) { - printk("nasrg_rrcnl_init - netlink_kernel_create failed for RRC socket\n"); - return(-1); - } - - return(0); -} - -//--------------------------------------------------------------------------- -void nasrg_netlink_release(void) -{ - //--------------------------------------------------------------------------- - printk("nasrg_netlink_release - begin \n"); - - //exit_netlink_thread=1; - printk("nasrg_netlink_release - Releasing netlink sockets\n"); - - if(nas_nl_sk) { - netlink_kernel_release(nas_nl_sk); - } - - if(nas_rrcnl_sk) { - netlink_kernel_release(nas_rrcnl_sk); - } - -} - -//--------------------------------------------------------------------------- -int nasrg_netlink_send(unsigned char *data_buffer, unsigned int data_length, int destination) -{ - //--------------------------------------------------------------------------- - struct sk_buff *nl_skb; - struct nlmsghdr *nlh; - int status; - // Start debug information -#ifdef NETLINK_DEBUG - printk("nasrg_netlink_send - begin \n"); -#endif - - if (!data_buffer) { - printk("nasrg_netlink_send - ERROR - input parameter data is NULL \n"); - return(0); - } - - if (!nas_nl_sk || !nas_rrcnl_sk) { - printk("nasrg_netlink_send - ERROR - socket is NULL\n"); - return(0); - } - - // End debug information - - nl_skb = alloc_skb(NLMSG_SPACE(data_length),GFP_ATOMIC); - - if (!nl_skb) { - printk("nasrg_netlink_send - ERROR - could not allocate skbuffer\n"); - return(0); - } - - nlh = (struct nlmsghdr *)nl_skb->data; - - // printk("nasrg_netlink_send Sending %d bytes (%d)\n",data_length,NLMSG_SPACE(data_length)); - skb_put(nl_skb, NLMSG_SPACE(data_length)); - memcpy(NLMSG_DATA(nlh), data_buffer, data_length); - nlh->nlmsg_len = NLMSG_SPACE(data_length); - - nlh->nlmsg_pid = 0; /* from kernel */ - NETLINK_CB(nl_skb).pid = 0; - - // destination 0 = PDCP, 1 = RRC - if (destination== NASNL_DEST_PDCP) { -#ifdef NETLINK_DEBUG - printk("nasrg_netlink_send - Sending to PDCP - nl_skb %p, nl_sk %p, nlh %p, nlh->nlmsg_len %d\n", nl_skb, nas_nl_sk, nlh, nlh->nlmsg_len); -#ifdef NAS_DEBUG_SEND_DETAIL - nasrg_TOOL_print_buffer(NLMSG_DATA(nlh),48); -#endif -#endif //DEBUG_NETLINK - status = netlink_unicast(nas_nl_sk, nl_skb, NL_DEST_PID, MSG_DONTWAIT); - } else { -#ifdef NAS_DEBUG_RRCNL - printk("nasrg_netlink_send - Sending to RRC - nl_skb %p, nas_rrcnl_sk %p, nlh %p, nlh->nlmsg_len %d\n", nl_skb, nas_rrcnl_sk, nlh, nlh->nlmsg_len); - nasrg_TOOL_print_buffer(NLMSG_DATA(nlh),data_length); -#endif //NAS_DEBUG_RRCNL - status = netlink_unicast(nas_rrcnl_sk, nl_skb, NL_DEST_RRC_PID, MSG_DONTWAIT); - } - - if (status < 0) { - printk("nasrg_netlink_send - SEND status is %d\n",status); - return(0); - } else { -#ifdef NETLINK_DEBUG - printk("nasrg_netlink_send - SEND status is %d, data_length %d\n",status, data_length); -#endif - return data_length; - } -} - - diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h deleted file mode 100755 index bc872182d5..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_proto.h +++ /dev/null @@ -1,142 +0,0 @@ -/*************************************************************************** - nasrg_proto.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasrg_proto.h -* \brief Function prototypes for OpenAirInterface CELLULAR version - RG -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef _NASRGD_PROTO_H -#define _NASRGD_PROTO_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include - -// #include "rrc_nas_primitives.h" -// #include "protocol_vars_extern.h" -// #include "as_sap.h" -// #include "rrc_qos.h" -// #include "rrc_sap.h" - -// nasrg_netlink.c -void nasrg_netlink_release(void); -int nasrg_netlink_init(void); -int nasrg_netlink_send(unsigned char *data_buffer, unsigned int data_length, int destination); - -// nasrg_common.c -//void nasrg_COMMON_receive(uint16_t hlen, uint16_t dlength, int sap); -void nasrg_COMMON_receive(uint16_t bytes_read, uint16_t payload_length, void *data_buffer, int rb_id, int sap); - -void nasrg_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc); -void nasrg_COMMON_QOS_send_test_netlink(struct sk_buff *skb); -void nasrg_COMMON_del_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc); -#ifndef PDCP_USE_NETLINK -void nasrg_COMMON_QOS_receive(struct cx_entity *cx); -#else -void nasrg_COMMON_QOS_receive(struct nlmsghdr *nlh); -#endif -struct rb_entity *nasrg_COMMON_add_rb(struct cx_entity *cx, nasRadioBearerId_t rabi, nasQoSTrafficClass_t qos); -struct rb_entity *nasrg_COMMON_search_rb(struct cx_entity *cx, nasRadioBearerId_t rabi); -struct cx_entity *nasrg_COMMON_search_cx(nasLocalConnectionRef_t lcr); -void nasrg_COMMON_del_rb(struct cx_entity *cx, nasRadioBearerId_t rab_id, nasIPdscp_t dscp); -void nasrg_COMMON_flush_rb(struct cx_entity *cx); - -//nasrg_ascontrol.c -void nasrg_ASCTL_init(void); -void nasrg_ASCTL_timer(unsigned long data); -void nasrg_ASCTL_DC_send_sig_data_request(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc); -//int nasrg_ASCTL_DC_receive(struct cx_entity *cx); -int nasrg_ASCTL_DC_receive(struct cx_entity *cx, char *buffer); -// -int nasrg_ASCTL_DC_send_cx_establish_confirm(struct cx_entity *cx, uint8_t response); -int nasrg_ASCTL_DC_send_rb_establish_request(struct cx_entity *cx, struct rb_entity *rb); -int nasrg_ASCTL_DC_send_rb_release_request(struct cx_entity *cx, struct rb_entity *rb); -int nasrg_ASCTL_GC_send_mbms_bearer_establish_req(int mbms_ix ); -int nasrg_ASCTL_GC_send_mbms_bearer_release_req(int mbms_ix); -int nasrg_ASCTL_DC_send_mbms_ue_notify_req(struct cx_entity *cx); -int nasrg_ASCTL_DC_send_eNBmeasurement_req(struct cx_entity *cx); - -void nasrg_ASCTL_start_default_mbms_service(void); - -// nasrg_iocontrol.c -void nasrg_CTL_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc); -int nasrg_CTL_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); - -// nasrg_classifier.c -void nasrg_CLASS_send(struct sk_buff *skb); -struct classifier_entity *nasrg_CLASS_add_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref); -struct classifier_entity *nasrg_CLASS_add_rclassifier(uint8_t dscp, uint16_t classref); -struct classifier_entity *nasrg_CLASS_add_mbmsclassifier(int mbms_ix, uint16_t classref); -void nasrg_CLASS_del_sclassifier(struct cx_entity *cx, uint8_t dscp, uint16_t classref); -void nasrg_CLASS_del_rclassifier(uint8_t dscp, uint16_t classref); -void nasrg_CLASS_del_mbmsclassifier(int mbms_ix, uint16_t classref); -void nasrg_CLASS_flush_sclassifier(struct cx_entity *cx); -void nasrg_CLASS_flush_rclassifier(void); -void nasrg_CLASS_flush_mbmsclassifier(void); - -// nasrg_tool.c -uint8_t nasrg_TOOL_invfct(struct classifier_entity *gc); -void nasrg_TOOL_fct(struct classifier_entity *gc, uint8_t fct); -void nasrg_TOOL_imei2iid(uint8_t *imei, uint8_t *iid); -void nasrg_TOOL_RGimei2iid(uint8_t *imei, uint8_t *iid); -uint8_t nasrg_TOOL_get_dscp6(struct ipv6hdr *iph); -uint8_t nasrg_TOOL_get_dscp4(struct iphdr *iph); -uint8_t *nasrg_TOOL_get_protocol6(struct ipv6hdr *iph, uint8_t *protocol); -uint8_t *nasrg_TOOL_get_protocol4(struct iphdr *iph, uint8_t *protocol); -char *nasrg_TOOL_get_udpmsg(struct udphdr *udph); -uint16_t nasrg_TOOL_udpcksum(struct in6_addr *saddr, struct in6_addr *daddr, uint8_t proto, uint32_t udplen, void *data); -int nasrg_TOOL_network6(struct in6_addr *addr, struct in6_addr *prefix, uint8_t plen); -int nasrg_TOOL_network4(uint32_t *addr, uint32_t *prefix, uint8_t plen); - -void nasrg_TOOL_pk_icmp6(struct icmp6hdr *icmph); - -void nasrg_TOOL_pk_all(struct sk_buff *skb); -void nasrg_TOOL_pk_ipv6(struct ipv6hdr *iph); -void nasrg_TOOL_print_state(uint8_t state); -void nasrg_TOOL_print_buffer(unsigned char * buffer,int length); -void nasrg_TOOL_print_rb_entity(struct rb_entity *rb); -void nasrg_TOOL_print_classifier(struct classifier_entity *gc); - -#endif diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h deleted file mode 100755 index f30fb35d95..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_sap.h +++ /dev/null @@ -1,84 +0,0 @@ -/*************************************************************************** - nasrg_sap.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasmt_sap.h -* \brief SAP constants for OpenAirInterface CELLULAR version - RG -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef _NASRGD_SAP_H -#define _NASRGD_SAP_H - - -// RT-FIFO identifiers ** must be identical to Access Stratum as_sap.h and rrc_sap.h - -#define RRC_DEVICE_GC RRC_SAPI_RG_GCSAP -#define RRC_DEVICE_NT RRC_SAPI_RG_NTSAP -#define RRC_DEVICE_DC_INPUT0 RRC_SAPI_RG_DCSAP0_IN -#define RRC_DEVICE_DC_INPUT1 RRC_SAPI_RG_DCSAP1_IN -#define RRC_DEVICE_DC_OUTPUT0 RRC_SAPI_RG_DCSAP0_OUT -#define RRC_DEVICE_DC_OUTPUT1 RRC_SAPI_RG_DCSAP1_OUT -// -//#define QOS_DEVICE_CONVERSATIONAL_INPUT QOS_SAPI_CONVERSATIONAL_INPUT_RG -//#define QOS_DEVICE_CONVERSATIONAL_OUTPUT QOS_SAPI_CONVERSATIONAL_OUTPUT_RG - -#define PDCP2PDCP_USE_RT_FIFO 21 -#define NAS2PDCP_FIFO 22 - -//FIFO indexes in control blocks -#define NAS_DC_INPUT_SAPI 0 -#define NAS_DC_OUTPUT_SAPI 1 -#define NAS_SAPI_CX_MAX 2 - -#define NAS_GC_SAPI 0 -#define NAS_NT_SAPI 1 -#define NAS_DRB_INPUT_SAPI 2 //NAS_CO_INPUT_SAPI -#define NAS_DRB_OUTPUT_SAPI 3 //NAS_CO_OUTPUT_SAPI -#define NAS_SAPI_MAX 4 - -//#define NAS_QOS_CONVERSATIONAL UMTS_TRAFFIC_CONVERSATIONAL -// - -/* Defined in RRC -#define RRC_NAS_GC_IN 0 -#define RRC_NAS_GC_OUT 1 -#define RRC_NAS_NT_IN 2 -#define RRC_NAS_NT_OUT 3 -#define RRC_NAS_DC0_IN 4 -#define RRC_NAS_DC0_OUT 5 -#define RRC_NAS_DC1_IN 6 -#define RRC_NAS_DC1_OUT 7 -#define RRC_NAS_DC2_IN 8 -#define RRC_NAS_DC2_OUT 9 -*/ -#endif - - - diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c deleted file mode 100755 index 804de4bff5..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_tool.c +++ /dev/null @@ -1,466 +0,0 @@ -/*************************************************************************** - nasrg_tool.c - description - ------------------- - copyright : (C) 2002 by Eurecom - email : yan.moret@eurecom.fr - michelle.wetterwald@eurecom.fr - *************************************************************************** - - ***************************************************************************/ -#include "nasrg_variables.h" -#include "nasrg_proto.h" - -//--------------------------------------------------------------------------- -// -void nasrg_TOOL_fct(struct classifier_entity *gc, uint8_t fct) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasrg_TOOL_fct - begin \n"); -#endif - - if (gc==NULL) { - printk("nasrg_TOOL_fct - input parameter gc is NULL \n"); - return; - } - - // End debug information - switch(fct) { - case NAS_FCT_QOS_SEND: - gc->fct=nasrg_COMMON_QOS_send; - break; - - case NAS_FCT_CTL_SEND: - gc->fct=nasrg_CTL_send; - break; - - case NAS_FCT_DC_SEND: - gc->fct=nasrg_ASCTL_DC_send_sig_data_request; - break; - - case NAS_FCT_DEL_SEND: - gc->fct=nasrg_COMMON_del_send; - break; - - default: - gc->fct=nasrg_COMMON_del_send; - } -} - -//--------------------------------------------------------------------------- -uint8_t nasrg_TOOL_invfct(struct classifier_entity *gc) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasrg_TOOL_invfct - begin \n"); -#endif - - if (gc==NULL) { - printk("nasrg_TOOL_invfct - input parameter gc is NULL \n"); - return 0; - } - - // End debug information - if (gc->fct==nasrg_COMMON_QOS_send) - return NAS_FCT_QOS_SEND; - - if (gc->fct==nasrg_CTL_send) - return NAS_FCT_CTL_SEND; - - if (gc->fct==nasrg_COMMON_del_send) - return NAS_FCT_DEL_SEND; - - if (gc->fct==nasrg_ASCTL_DC_send_sig_data_request) - return NAS_FCT_DC_SEND; - - return 0; -} - -//--------------------------------------------------------------------------- -uint8_t nasrg_TOOL_get_dscp6(struct ipv6hdr *iph) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasrg_TOOL_get_dscp6 - begin \n"); -#endif - - if (iph==NULL) { - printk("nasrg_TOOL_get_dscp6 - input parameter iph is NULL \n"); - return 0; - } - - // End debug information - // return (ntohl(((*(__u32 *)iph)&NAS_TRAFFICCLASS_MASK)))>>22; //Yan - return (ntohl(((*(__u32 *)iph)&NAS_TRAFFICCLASS_MASK)))>>20; -} - -//--------------------------------------------------------------------------- -uint8_t nasrg_TOOL_get_dscp4(struct iphdr *iph) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasrg_TOOL_get_dscp4 - begin \n"); -#endif - - if (iph==NULL) { - printk("nasrg_TOOL_get_dscp4 - input parameter iph is NULL \n"); - return 0; - } - - // End debug information - return ((iph->tos)>>5)<<3; -} - -//--------------------------------------------------------------------------- -uint8_t *nasrg_TOOL_get_protocol6(struct ipv6hdr *iph, uint8_t *protocol) -{ - //--------------------------------------------------------------------------- - uint16_t size; - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasrg_TOOL_get_protocol6 - begin \n"); -#endif - - if (iph==NULL) { - printk("nasrg_TOOL_get_protocol6 - input parameter iph is NULL \n"); - return NULL; - } - - if (protocol==NULL) { - printk("nasrg_TOOL_get_protocol6 - input parameter protocol is NULL \n"); - return NULL; - } - - // End debug information - - *protocol=iph->nexthdr; - size=NAS_IPV6_SIZE; - - while (1) { - switch(*protocol) { - case IPPROTO_UDP: - case IPPROTO_TCP: - case IPPROTO_ICMPV6: - return (uint8_t *)((uint8_t *)iph+size); - - case IPPROTO_HOPOPTS: - case IPPROTO_ROUTING: - case IPPROTO_DSTOPTS: - *protocol=((uint8_t *)iph+size)[0]; - size+=((uint8_t *)iph+size)[1]*8+8; - break; - - case IPPROTO_FRAGMENT: - *protocol=((uint8_t *)iph+size)[0]; - size+=((uint8_t *)iph+size)[1]+8; - break; - - case IPPROTO_NONE: - case IPPROTO_AH: - case IPPROTO_ESP: - default: - return NULL; - } - } -} - -//--------------------------------------------------------------------------- -uint8_t *nasrg_TOOL_get_protocol4(struct iphdr *iph, uint8_t *protocol) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasrg_TOOL_get_protocol4 - begin \n"); -#endif - - if (iph==NULL) { - printk("nasrg_TOOL_get_protocol4 - input parameter iph is NULL \n"); - return NULL; - } - - if (protocol==NULL) { - printk("nasrg_TOOL_get_protocol4 - input parameter protocol is NULL \n"); - return NULL; - } - - // End debug information - *protocol=iph->protocol; - - switch(*protocol) { - case IPPROTO_UDP: - case IPPROTO_TCP: - case IPPROTO_ICMP: - return (uint8_t *)((uint8_t *)iph+iph->tot_len); - - default: - return NULL; - } -} - -//--------------------------------------------------------------------------- -// Convert the IMEI to iid -void nasrg_TOOL_imei2iid(uint8_t *imei, uint8_t *iid) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasrg_TOOL_imei2iid - begin \n"); -#endif - - if (imei==NULL) { - printk("nasrg_TOOL_imei2iid - input parameter imei is NULL \n"); - return; - } - - if (iid==NULL) { - printk("nasrg_TOOL_imei2iid - input parameter iid is NULL \n"); - return; - } - - // End debug information - memset(iid, 0, NAS_ADDR_LEN); - iid[0] = 0x03; -#ifdef NAS_DRIVER_TYPE_ETHERNET - iid[0] = 0x02; -#endif - iid[1] = 16*imei[0]+imei[1]; - iid[2] = 16*imei[2]+imei[3]; - iid[3] = 16*imei[4]+imei[5]; - iid[4] = 16*imei[6]+imei[7]; -#ifdef NAS_DRIVER_TYPE_ETHERNET - iid[3] = 0xff; - iid[4] = 0xfe; -#endif - iid[5] = 16*imei[8]+imei[9]; - iid[6] = 16*imei[10]+imei[11]; - iid[7] = 16*imei[12]+imei[13]; -} - -//--------------------------------------------------------------------------- -// Convert the RG IMEI to iid -void nasrg_TOOL_RGimei2iid(uint8_t *imei, uint8_t *iid) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasrg_TOOL_RGimei2iid - begin \n"); -#endif - - if (!imei || !iid) { - printk("nasrg_TOOL_RGimei2iid - input parameter imei or iid is NULL \n"); - return; - } - - // End debug information - memset(iid, 0, NAS_ADDR_LEN); - iid[0] = 0x00; // to be compatible between link local and global - iid[1] = 16*imei[0]+imei[1]; - iid[2] = 16*imei[2]+imei[3]; - iid[3] = 16*imei[4]+imei[5]; - iid[4] = 16*imei[6]+imei[7]; - iid[5] = 16*imei[8]+imei[9]; - iid[6] = 16*imei[10]+imei[11]; - iid[7] = 16*imei[12]+imei[13]; -} - -//--------------------------------------------------------------------------- -void nasrg_TOOL_pk_icmp6(struct icmp6hdr *icmph) -{ - //--------------------------------------------------------------------------- - // Start debug information -#ifdef GRAAL_DEBUG_TOOL - printk("nasrg_TOOL_pk_icmp6 - begin \n"); -#endif - - if (!icmph) { - printk("nasrg_TOOL_pk_icmp6 - input parameter icmph is NULL \n"); - return; - } - - // End debug information - printk("ICMPv6:\t type= %d, code = %d\n", icmph->icmp6_type, icmph->icmp6_code); - - switch(icmph->icmp6_type) { - case ICMPV6_DEST_UNREACH: - printk("Destination unreachable\n"); - break; - - case ICMPV6_PKT_TOOBIG: - printk("Packet too big\n"); - break; - - case ICMPV6_TIME_EXCEED: - printk("Time exceeded\n"); - break; - - case ICMPV6_PARAMPROB: - printk("Parameter problem\n"); - break; - - case ICMPV6_ECHO_REQUEST: - printk("Echo request\n"); - break; - - case ICMPV6_ECHO_REPLY: - printk("Echo reply\n"); - break; - - case ICMPV6_MGM_QUERY: - printk("Multicast listener query\n"); - break; - - case ICMPV6_MGM_REPORT: - printk("Multicast listener report\n"); - break; - - case ICMPV6_MGM_REDUCTION: - printk("Multicast listener done\n"); - break; - - case NDISC_ROUTER_SOLICITATION: - printk("Router solicitation\n"); - break; - - case NDISC_ROUTER_ADVERTISEMENT: - printk("Router advertisment\n"); - break; - - case NDISC_NEIGHBOUR_SOLICITATION: - printk("Neighbour solicitation\n"); - break; - - case NDISC_NEIGHBOUR_ADVERTISEMENT: - printk("Neighbour advertisment\n"); - break; - - case NDISC_REDIRECT: - printk("redirect message\n"); - break; - } -} - - -//--------------------------------------------------------------------------- -void nasrg_TOOL_print_state(uint8_t state) -{ - //--------------------------------------------------------------------------- - switch(state) { - case NAS_IDLE: - printk("NAS_IDLE\n"); - return; - - case NAS_CX_FACH: - printk("NAS_CX_FACH\n"); - return; - - case NAS_CX_DCH: - printk("NAS_CX_DCH\n"); - return; - - case NAS_CX_RECEIVED: - printk("NAS_CX_RECEIVED\n"); - return; - - case NAS_CX_CONNECTING: - printk("NAS_CX_CONNECTING\n"); - return; - - case NAS_CX_RELEASING: - printk("NAS_CX_RELEASING\n"); - return; - - case NAS_CX_CONNECTING_FAILURE: - printk("NAS_CX_CONNECTING_FAILURE\n"); - return; - - case NAS_CX_RELEASING_FAILURE: - printk("NAS_CX_RELEASING_FAILURE\n"); - return; - - case NAS_RB_ESTABLISHING: - printk("NAS_RB_ESTABLISHING\n"); - return; - - case NAS_RB_RELEASING: - printk("NAS_RB_RELEASING\n"); - return; - - case NAS_RB_ESTABLISHED: - printk("NAS_RB_ESTABLISHED\n"); - return; - - default: - printk(" Unknown state\n"); - } -} - -//----------------------------------------------------------------------------- -// Print the content of a buffer in hexadecimal -void nasrg_TOOL_print_buffer(unsigned char * buffer,int length) -{ - //----------------------------------------------------------------------------- - int i; - - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasrg_TOOL_print_buffer - begin \n"); -#endif - - if (buffer==NULL) { - printk("\n nasrg_TOOL_print_buffer - input parameter buffer is NULL \n"); - return; - } - - // End debug information - printk("Buffer content: "); - - for (i=0; irab_id, rb->sapi, rb->qos, rb->dscp); - printk("state %d, retry %d, countimer %d\n",rb->state, rb->retry, rb->countimer); -}; - -//----------------------------------------------------------------------------- -void nasrg_TOOL_print_classifier(struct classifier_entity *gc) -{ - //----------------------------------------------------------------------------- - // Start debug information -#ifdef NAS_DEBUG_TOOL - printk("nasrg_TOOL_print_classifier - begin \n"); -#endif - - if (gc==NULL) { - printk("\n nasrg_TOOL_print_classifier - input parameter gc is NULL \n"); - return; - } - - // End debug information - printk("\nClassifier content: classref %d, version %d, splen %d, dplen %d,\n", gc->classref, gc->version, gc->splen, gc->dplen); - printk("protocol %d, sport %d, dport %d, rab_id %d\n", gc->protocol, gc->sport, gc->dport, gc->rab_id); - nasrg_TOOL_print_rb_entity(gc->rb); -}; - - diff --git a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h b/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h deleted file mode 100755 index 6891d155e5..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NASRG/nasrg_variables.h +++ /dev/null @@ -1,221 +0,0 @@ -/*************************************************************************** - nasrg_variables.h - description - *************************************************************************** - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 450 route des Chappes, 06410 Biot Sophia Antipolis, France -*******************************************************************************/ -/*! \file nasrg_variables.h -* \brief Variable and structure definitions for OpenAirInterface CELLULAR version - RG -* \author michelle.wetterwald, navid.nikaein, raymond.knopp, Lionel Gauthier -* \company Eurecom -* \email: michelle.wetterwald@eurecom.fr, raymond.knopp@eurecom.fr, navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr -*/ -/*******************************************************************************/ -#ifndef _NASRGD_VAR_H -#define _NASRGD_VAR_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include -#include -//#include -#include -#include -#include -#include -#include -#include - -#include "rrc_nas_primitives.h" -#include "rrc_qos_classes.h" -#include "rrc_nas_sap.h" - -#include "nasrg_constant.h" -#include "nasrg_sap.h" - -struct cx_entity; - -struct rb_entity { - // uint16_t default_rab; - uint32_t cnxid; - nasRadioBearerId_t rab_id; //ue_rbId - nasRadioBearerId_t rg_rbId; - nasRadioBearerId_t mbms_rbId; - nasSapId_t sapi; - nasQoSTrafficClass_t qos; - nasQoSTrafficClass_t RadioQosClass; - nasIPdscp_t dscp; //this is DL dscp - nasIPdscp_t dscp_ul; - uint8_t state; - uint8_t result; - uint8_t retry; - uint32_t countimer; - //for MBMS - uint16_t serviceId; - uint16_t sessionId; - uint16_t duration; - uint8_t mcast_address[16]; - // - struct rb_entity *next; -}; - -struct classifier_entity { - uint32_t classref; // classifier identity - uint8_t version; // IP version 4 or 6 - union { - struct in6_addr ipv6; - uint32_t ipv4; - } saddr; // IP source address - uint8_t splen; // IP prefix size - union { - struct in6_addr ipv6; - uint32_t ipv4; - } daddr; // IP destination address - uint8_t dplen; // IP prefix size - uint8_t protocol; // layer 4 protocol type (tcp, udp, ...) - uint16_t sport; // source port - uint16_t dport; // destination port - struct rb_entity *rb; - nasRadioBearerId_t rab_id; // RAB identification - void (*fct)(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc); - struct classifier_entity *next; -}; - - -struct cx_entity { - int sap[NAS_SAPI_CX_MAX]; - uint8_t state; // state of the connection - nasLocalConnectionRef_t lcr; // Local connection reference - nasCellID_t cellid; // cell identification - uint32_t countimer; // timeout's counter - uint8_t retry; // number of retransmissions - struct classifier_entity *sclassifier[NAS_DSCP_MAX]; // send classifiers table - uint16_t nsclassifier; - uint32_t iid6[2]; // IPv6 interface identification - uint8_t iid4; // IPv4 interface identification - struct rb_entity *rb; // RB entities for RABs - uint16_t num_rb; - // MW - 17/5/05 - int ue_id; - int rrc_state; - // MBMS - int requested_joined_services[NASRG_MBMS_SVCES_MAX]; - int requested_left_services[NASRG_MBMS_SVCES_MAX]; - int joined_services[NASRG_MBMS_SVCES_MAX]; -}; - -//struct mbms_rb_entity{ -// uint32_t cnxid; -// nasRadioBearerId_t mbms_rbId; -// nasSapId_t sapi; -// nasQoSTrafficClass_t qos; -// nasQoSTrafficClass_t RadioQosClass; -// uint8_t state; -// uint8_t result; -// uint8_t retry; -// uint32_t countimer; -// -// uint16_t serviceId; -// uint16_t sessionId; -// uint16_t duration; -//}; -// - -struct nas_priv { - int irq; - int rx_flags; - struct timer_list timer; - spinlock_t lock; - struct net_device_stats stats; - uint8_t retry_limit; - uint32_t timer_establishment; - uint32_t timer_release; - struct cx_entity cx[NAS_CX_MAX]; - struct classifier_entity *rclassifier[NAS_DSCP_MAX]; // receive classifier - int nrclassifier; - uint32_t next_sclassref; - int sap[NAS_SAPI_MAX]; - uint8_t xbuffer[NAS_MAX_LENGTH]; // transmission buffer - uint8_t rbuffer[NAS_MAX_LENGTH]; // reception buffer - // MW - 17/5/05 - int broadcast_counter; - int SIB18_counter; - // MBMS - struct rb_entity mbms_rb[NASRG_MBMS_SVCES_MAX]; - struct classifier_entity *mbmsclassifier[NASRG_MBMS_SVCES_MAX]; // mbms classifier - int nmbmsclassifier; - uint32_t next_mbmsclassref; - //Added for demo 3 - MW - nasCellID_t measured_cell_id; - uint16_t num_UEs; - uint32_t rlcBufferOccupancy[NAS_CX_MAX]; - uint32_t scheduledPRB[NAS_CX_MAX]; - uint32_t totalDataVolume[NAS_CX_MAX]; - uint32_t totalNumPRBs; -}; - -struct ipversion { -#if defined(__LITTLE_ENDIAN_BITFIELD) - uint8_t reserved:4, - version:4; -#else - uint8_t version:4, - reserved:4; -#endif -}; - -typedef struct pdcp_data_req_header_t { - unsigned int rb_id; - unsigned int data_size; - int inst; -} pdcp_data_req_header_t; - -typedef struct pdcp_data_ind_header_t { - unsigned int rb_id; - unsigned int data_size; - int inst; -} pdcp_data_ind_header_t; -// -extern struct nas_priv *gpriv; -extern struct net_device *gdev; -//extern int bytes_wrote; -//extern int bytes_read; - -extern uint8_t NAS_RG_IMEI[14]; -extern uint8_t NAS_NULL_IMEI[14]; - -//global variables shared with RRC -extern int *pt_nas_rg_irq; -//extern uint16_t *pt_rg_own_cell_id; -extern uint16_t local_rg_cell_id; -#endif diff --git a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/Makefile b/openair2/NAS/DRIVER/CELLULAR/NETLTEST/Makefile deleted file mode 100755 index eec82de367..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -# Lines starting with the pound sign are comments. -# -# These things are options that you might need -# to tweak. - -# You can modify the below as well, but probably -# won't need to. - -#CC = egcs - -#UPDIR := $(shell /bin/pwd) -#GRAAL_DIR =$(UPDIR)/.. -#RRC_DIR =$(UPDIR)/../../../AS/L3/RRC - -CELL_UPDIR := $(shell /bin/pwd) -NAS_DIR := $(OPENAIR2_DIR)/NAS/DRIVER/CELLULAR/NASMT -RRC_DIR := $(OPENAIR2_DIR)/RRC/CELLULAR -EXTRA_CFLAGS += -I$(RRC_DIR) -DNODE_MT - -CFLAGS = -Wall -g -I$(NAS_DIR) -I$(RRC_DIR) - -COMPILE = $(CC) $(CFLAGS) -c - -OBJS = netltest.o - -EXECUTABLE = netltest - -# "all" is the default target. Simply make it point to myprogram. - -all: $(EXECUTABLE) - -# Define the components of the program, and how to link them together. -# These components are defined as dependencies; that is, they must be -# made up-to-date before the code is linked. - -$(EXECUTABLE): $(OBJS) - $(CC) $(CFLAGS) -o $(EXECUTABLE) $(OBJS) - -# Add any special rules here. - -# Specify that all .o files depend on .c files, and indicate how -# the .c files are converted (compiled) to the .o files. - -%.o: %.c - $(COMPILE) -o $@ $< - -clean: - -rm $(OBJS) $(EXECUTABLE) diff --git a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest b/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest deleted file mode 100755 index f44ea64b09..0000000000 Binary files a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest and /dev/null differ diff --git a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c b/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c deleted file mode 100644 index 673a5a0b5d..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/netltest.c +++ /dev/null @@ -1,201 +0,0 @@ -/*************************************************************************** - netltest.c - - ------------------- - begin : Tue Jan 15 2002 - copyright : (C) 2002, 2010 by Eurecom - created by : michelle.wetterwald@eurecom.fr - ************************************************************************** - This file contains the functions used to interface the NAS // from MESH Driver - ***************************************************************************/ -//----------------------------------------------------------------------------- -// For FIFOS / NETLINK interface -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/******************** -// RRC definitions - ********************/ -#include "nasmt_constant.h" -#include "rrc_nas_sap.h" -#include "rrc_constant.h" -//----------------------------------------------------------------------------- -//#define MAX_PAYLOAD 4096 /* this sould cover the max mtu size*/ -struct nlmsghdr *rrcnl_nlh; -int rrcnl_sock_fd; -struct sockaddr_nl rrcnl_src_addr, rrcnl_dest_addr; -struct iovec rrcnl_iov; -struct msghdr rrcnl_msg; - -//----------------------------------------------------------------------------- -typedef unsigned int sdu_size_t; -typedef unsigned int rb_id_t; - -typedef struct pdcp_data_req_header_t { - rb_id_t rb_id; - sdu_size_t data_size; - int inst; -} pdcp_data_req_header_t; - -typedef struct pdcp_data_ind_header_t { - rb_id_t rb_id; - sdu_size_t data_size; - int inst; -} pdcp_data_ind_header_t; - -#define MAX_PAYLOAD 1024 /* maximum payload size*/ -struct sockaddr_nl src_addr, dest_addr; -struct nlmsghdr *nlh = NULL; -struct iovec iov; -int sock_fd; -struct msghdr msg; -#define OAI_IP_DRIVER_NETLINK_ID 31 -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -void foo( int sig ) -{ - //----------------------------------------------------------------------------- - printf("I got cntl-C, closing socket\n"); - close(sock_fd); - close(rrcnl_sock_fd); - exit(-1); -} - -//----------------------------------------------------------------------------- -int main() -{ - //----------------------------------------------------------------------------- - struct sigaction newaction; - int i=0; - int ret; - int len, count; - - newaction.sa_handler = foo; - - // register cntl-C handler - if ( sigaction( SIGINT, &newaction, NULL ) == -1) - perror("Could not install the new signal handler"); - - // create both sockets - sock_fd = socket(PF_NETLINK, SOCK_RAW,OAI_IP_DRIVER_NETLINK_ID); - printf("Opened socket with fd %d\n",sock_fd); - ret = fcntl(sock_fd,F_SETFL,O_NONBLOCK); - printf("fcntl returns %d\n",ret); - - rrcnl_sock_fd = socket(PF_NETLINK, SOCK_RAW, NAS_RRCNL_ID); - printf("rrc_ue_netlink_init - Opened socket with fd %d\n", rrcnl_sock_fd); - ret = fcntl(rrcnl_sock_fd,F_SETFL,O_NONBLOCK); - printf("rrc_ue_netlink_init - fcntl returns %d\n",ret); - - // set src addresses blocks - memset(&src_addr, 0, sizeof(src_addr)); - src_addr.nl_family = AF_NETLINK; - src_addr.nl_pid = 1;//getpid(); /* self pid */ - src_addr.nl_groups = 0; /* not in mcast groups */ - ret = bind(sock_fd, (struct sockaddr*)&src_addr, sizeof(src_addr)); - printf("bind returns %d\n",ret); - - memset(&rrcnl_src_addr, 0, sizeof(rrcnl_src_addr)); - rrcnl_src_addr.nl_family = AF_NETLINK; - rrcnl_src_addr.nl_pid = NL_DEST_RRC_PID;//getpid(); /* self pid */ - rrcnl_src_addr.nl_groups = 0; /* not in mcast groups */ - ret = bind(rrcnl_sock_fd, (struct sockaddr*)&rrcnl_src_addr, sizeof(rrcnl_src_addr)); - printf("rrc_ue_netlink_init - bind returns %d\n",ret); - - // set dest addresses blocks - memset(&dest_addr, 0, sizeof(dest_addr)); - dest_addr.nl_family = AF_NETLINK; - dest_addr.nl_pid = 0; /* For Linux Kernel */ - dest_addr.nl_groups = 0; /* unicast */ - - memset(&rrcnl_dest_addr, 0, sizeof(rrcnl_dest_addr)); - rrcnl_dest_addr.nl_family = AF_NETLINK; - rrcnl_dest_addr.nl_pid = 0; /* For Linux Kernel */ - rrcnl_dest_addr.nl_groups = 0; /* unicast */ - - // set nlh - nlh=(struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD)); - /* Fill the netlink message header */ - nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD); - nlh->nlmsg_pid = 1;//getpid(); /* self pid */ - nlh->nlmsg_flags = 0; - - rrcnl_nlh=(struct nlmsghdr *)malloc(NLMSG_SPACE(RRC_NAS_MAX_SIZE)); - //memset(rrcnl_nlh, 0, NLMSG_SPACE(MAX_PAYLOAD)); - /* Fill the netlink message header */ - rrcnl_nlh->nlmsg_len = NLMSG_SPACE(RRC_NAS_MAX_SIZE); - rrcnl_nlh->nlmsg_pid = NL_DEST_RRC_PID;//getpid(); /* self pid */ - rrcnl_nlh->nlmsg_flags = 0; - - // set iov - iov.iov_base = (void *)nlh; - iov.iov_len = nlh->nlmsg_len; - memset(&msg,0,sizeof(msg)); - msg.msg_name = (void *)&dest_addr; - msg.msg_namelen = sizeof(dest_addr); - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - - rrcnl_iov.iov_base = (void *)rrcnl_nlh; - rrcnl_iov.iov_len = rrcnl_nlh->nlmsg_len; - memset(&rrcnl_msg,0,sizeof(rrcnl_msg)); - rrcnl_msg.msg_name = (void *)&rrcnl_dest_addr; - rrcnl_msg.msg_namelen = sizeof(rrcnl_dest_addr); - rrcnl_msg.msg_iov = &rrcnl_iov; - rrcnl_msg.msg_iovlen = 1; - - /* Read message from kernel */ - memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD)); - - /* Read message from kernel */ - memset(rrcnl_nlh, 0, NLMSG_SPACE(MAX_PAYLOAD)); - - while (1) { - len = recvmsg(sock_fd, &msg, 0); - count = recvmsg(rrcnl_sock_fd, &rrcnl_msg, 0); - - if (len<0) { - // exit(-1); - } else { - printf("Received PDCP socket with length %d (nlmsg_len = %d)\n",len,nlh->nlmsg_len); - } - - if (count<0) { - // exit(-1); - } else { - printf("Received RRC socket with length %d (nlmsg_len = %d)\n",count,rrcnl_nlh->nlmsg_len); - } - - /* usleep(1000); - i=i+1; - if ((i % 100) == 0) - printf("%d\n",i);*/ - usleep(50); - i=i+1; - - if ((i % 1000) == 0) - printf("%d\n",i); - - /* - for (i=0;inlmsg_len - sizeof(struct nlmsghdr);i++) { - printf("%x ", - ((unsigned char *)NLMSG_DATA(nlh))[i]); - } - */ - } - - /* Close Netlink Socket */ - return 0; -} - - - - diff --git a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/nettestPDCP.c b/openair2/NAS/DRIVER/CELLULAR/NETLTEST/nettestPDCP.c deleted file mode 100644 index bccfa9552a..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/NETLTEST/nettestPDCP.c +++ /dev/null @@ -1,128 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -typedef unsigned int sdu_size_t; -typedef unsigned int rb_id_t; - -typedef struct pdcp_data_req_header_t { - rb_id_t rb_id; - sdu_size_t data_size; - int inst; -} pdcp_data_req_header_t; - -typedef struct pdcp_data_ind_header_t { - rb_id_t rb_id; - sdu_size_t data_size; - int inst; -} pdcp_data_ind_header_t; - -#define MAX_PAYLOAD 1024 /* maximum payload size*/ -struct sockaddr_nl src_addr, dest_addr; -struct nlmsghdr *nlh = NULL; -struct iovec iov; -int sock_fd; -struct msghdr msg; - - -void foo( int sig ) -{ - - printf("I got cntl-C, closing socket\n"); - - - close(sock_fd); - exit(-1); -} - - -#define OAI_IP_DRIVER_NETLINK_ID 31 - -void main() -{ - - - struct sigaction newaction; - int i=0; - int ret; - int len; - - newaction.sa_handler = foo; - - if ( sigaction( SIGINT, &newaction, NULL ) == -1) - perror("Could not install the new signal handler"); - - sock_fd = socket(PF_NETLINK, SOCK_RAW,OAI_IP_DRIVER_NETLINK_ID); - - printf("Opened socket with fd %d\n",sock_fd); - - ret = fcntl(sock_fd,F_SETFL,O_NONBLOCK); - printf("fcntl returns %d\n",ret); - - memset(&src_addr, 0, sizeof(src_addr)); - src_addr.nl_family = AF_NETLINK; - src_addr.nl_pid = 1;//getpid(); /* self pid */ - src_addr.nl_groups = 0; /* not in mcast groups */ - ret = bind(sock_fd, (struct sockaddr*)&src_addr, - sizeof(src_addr)); - printf("bind returns %d\n",ret); - - memset(&dest_addr, 0, sizeof(dest_addr)); - dest_addr.nl_family = AF_NETLINK; - dest_addr.nl_pid = 0; /* For Linux Kernel */ - dest_addr.nl_groups = 0; /* unicast */ - - nlh=(struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD)); - /* Fill the netlink message header */ - nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD); - nlh->nlmsg_pid = 1;//getpid(); /* self pid */ - nlh->nlmsg_flags = 0; - - iov.iov_base = (void *)nlh; - iov.iov_len = nlh->nlmsg_len; - memset(&msg,0,sizeof(msg)); - msg.msg_name = (void *)&dest_addr; - msg.msg_namelen = sizeof(dest_addr); - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - - - /* Read message from kernel */ - memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD)); - - while (1) { - len = recvmsg(sock_fd, &msg, 0); - - - if (len<0) { - - // exit(-1); - } else { - printf("Received socket with length %d (nlmsg_len = %d)\n",len,nlh->nlmsg_len); - } - - usleep(1000); - i=i+1; - - if ((i % 100) == 0) - printf("%d\n",i); - - /* - for (i=0;inlmsg_len - sizeof(struct nlmsghdr);i++) { - printf("%x ", - ((unsigned char *)NLMSG_DATA(nlh))[i]); - } - */ - } - - /* Close Netlink Socket */ - -} - - - - diff --git a/openair2/NAS/DRIVER/CELLULAR/readme.txt b/openair2/NAS/DRIVER/CELLULAR/readme.txt deleted file mode 100755 index fd4411a25b..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/readme.txt +++ /dev/null @@ -1,157 +0,0 @@ - --------------------------------- - | UMTS-TDD (TD-CDMA) NAS driver | - --------------------------------- - - - -1 - COMPILATION ---------------- -Pre-Req : - - RTAI installed and running - - IPv6 patched as described below (see 4 - Patching IPv6) - -From RHODOS26 directory: - - - make nasrg : creates the NAS RG driver (nasrg.ko) and copies it to the RHODOS26/bin directory - - - make cleannasrg : deletes all object and temporary files from the nasrg directory - - - make nasmt : creates the NAS MT driver (nasmt.ko) and copies it to the RHODOS26/bin directory - - - make cleannasmt : deletes all object and temporary files from the nasmt directory - - -2 - OPERATION - RG side ------------------------ - -A1 - Compile the Access Stratum (for IF mode) - -Pre-Req : RTAI installed and running - ICC 8.0 installed and running - - > make rgif - > make asrguserif - > make rrmumts - -A2 - Compile the Access Stratum (for RF mode) - -Pre-Req : RTAI installed and running - ICC 8.0 installed and running - - > make guimakefiles - > make rgrf - > make asrguserrfa2 - > make rrmumts - - -B - Start the Access Stratum - - (as root ) > cd <..>RHODOS26/bin - - (first install) > create_rtfifos - (first install) > mknod -m 666 /dev/daq0 c 127 1 - (after cleanas) > cp -../src/rrm_umts/congestion_control/resources_manager/rrm_master.properties . - - (-- ) > ./start_rtos - (-- ) > ./runrgif [for IF] [or ./runrga2 for RF] - - ==> to check correct operation: - (as root ) cat /dev/rtf62 - (as root ) tail -f /var/log/messages - -C - Start the NAS Driver - - (as root ) > cd <..>RHODOS26/bin - (-- ) > insmod nasrg.ko - (-- ) > ./access_router.up - -D - Stop the NAS Driver and the Access Stratum - - (-- ) > ./access_router.down - (-- ) > rmmod nasrg - (-- ) > on Acccess stratum window - (-- ) > ./stop_rtos - -E - Clean Access Stratum compilation - - > make cleanas - -3 - OPERATION - MT side ------------------------ - -A1 - Compile the Access Stratum (for IF mode) - -Pre-Req : RTAI installed and running - ICC 8.0 installed and running - file RHODOS26/src/access_stratum/l1/low/control/mmx.h copied in /usr/include - - > make mtif - > make asmtuserif - > make fpgatest - -A2 - Compile the Access Stratum (for RF mode) - -Pre-Req : RTAI installed and running - ICC 8.0 installed and running - file RHODOS26/src/access_stratum/l1/low/control/mmx.h copied in /usr/include - - > make guimakefiles - > make mtrf - > make asmtuserrf - > make fpgatest - - -B - Start the Access Stratum - - (as root ) > cd <..>RHODOS26/bin - - (first install) > create_rtfifos - (first install) > mknod -m 666 /dev/daq0 c 127 1 - - (-- ) > ./start_rtos - (-- ) > ./runrgif [for IF] [or ./runrga2 for RF] - - ==> to check correct operation: - (as root ) cat /dev/rtf62 - (as root ) tail -f /var/log/messages - -C - Start the NAS Driver - - (as root ) > cd <..>RHODOS26/bin - (-- ) > insmod nasmt.ko - (-- ) > ./mobile_node.up - -D - Stop the NAS Driver and the Access Stratum - - (-- ) > ./mobile_node.down - (-- ) > rmmod nasmt - (-- ) > on Acccess stratum window - (-- ) > ./stop_rtos - -E - Clean Access Stratum compilation - - > make cleanas - - -4 - Patching IPv6 ------------------------ - -For Linux with 2.6.xx kernel version (xx = 10 or 81): - -- move RHODOS26/non_access_stratum/driver/src/addrconf.c.26.xx to /usr/src/linux/net/ipv6/addrconf.c -- move RHODOS26/non_access_stratum/driver/src/if_arp.h.26.xx to /usr/src/linux/include/linux/if_arp.h -- recompile IPv6 (inside the kernel or as a module, as usual) - -5 - Start the MT connection ------------------------ - -You can use either the RAL-UMTS (RAL-CDMA) -- see corresponding documentation -- - -* OR * - -the tool provided with the driver (directory RHODOS26/src/non_access_stratum/driver/mt_tools). -Install the tool, update the Cell_id field if needed and click on the "Attach" button. - - - \ No newline at end of file diff --git a/openair2/NAS/DRIVER/CELLULAR/start_mt_cellular b/openair2/NAS/DRIVER/CELLULAR/start_mt_cellular deleted file mode 100755 index c89f19e9c0..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/start_mt_cellular +++ /dev/null @@ -1,13 +0,0 @@ -#xterm -hold "tail -f /var/log/messages" & -insmod ./NASMT/nascellmt.ko nas_IMEI=3,5,6,0,1,4,9,1,5,0,0,0,0,0 -#insmod ./NASMT/nascellmt.ko -sleep 2 -ifconfig oai0 10.0.1.2 netmask 255.255.255.0 broadcast 10.0.1.255 -#ifconfig oai0 add 2001:660:382:14:335:600:8014:9150/64 -#./bin/mobile_node.up -#sleep 3 -#./CTL_TOOL/gioctl cx add 0 5 -#xterm -hold -e ./bin/IALdummy & -#sleep 1 -#xterm -hold -e ./bin/tdcdma_gui & -#lsmod diff --git a/openair2/NAS/DRIVER/CELLULAR/start_rg_cellular_noradvd b/openair2/NAS/DRIVER/CELLULAR/start_rg_cellular_noradvd deleted file mode 100755 index 3d51140dcd..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/start_rg_cellular_noradvd +++ /dev/null @@ -1,17 +0,0 @@ - -#xterm -hold -e ant -buildfile rrm_umts.xml run & -#sleep 2 -insmod ./NASRG/nascellrg.ko -sleep 2 -#bin/access_router_noradvd.up -sysctl -w net.ipv6.conf.default.dad_transmits=0 -#sysctl -w net.ipv6.conf.all.forwarding=1 -#sysctl -w net.ipv4.conf.all.forwarding=1 - -#ifconfig oai0 192.168.14.100 -ifconfig oai0 10.0.1.3 netmask 255.255.255.0 broadcast 10.0.1.255 -ifconfig oai0 add 2001:660:382:14::1/64 -#ifconfig graal0 192.168.14.100 -#ifconfig graal0 add 2001:690:2380:7777::1/64 -#ifconfig graal0 add 2001:660:382:14::1/64 -#lsmod \ No newline at end of file diff --git a/openair2/NAS/DRIVER/CELLULAR/start_rg_cellular_radvd b/openair2/NAS/DRIVER/CELLULAR/start_rg_cellular_radvd deleted file mode 100755 index f57fb7712d..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/start_rg_cellular_radvd +++ /dev/null @@ -1,17 +0,0 @@ - -#xterm -hold -e ant -buildfile rrm_umts.xml run & -#sleep 2 -insmod ./NASRG/nascellrg.ko -sleep 2 -#bin/access_router_noradvd.up -sysctl -w net.ipv6.conf.default.dad_transmits=0 -sysctl -w net.ipv6.conf.all.forwarding=1 -#sysctl -w net.ipv4.conf.all.forwarding=1 - -#ifconfig oai0 192.168.14.100 -ifconfig oai0 10.0.1.3 netmask 255.255.255.0 broadcast 10.0.1.255 -ifconfig oai0 add 2001:660:382:14::1/64 - -#lsmod -sleep 4s -radvd diff --git a/openair2/NAS/DRIVER/CELLULAR/stop_mt_cellular b/openair2/NAS/DRIVER/CELLULAR/stop_mt_cellular deleted file mode 100755 index e7325cf40f..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/stop_mt_cellular +++ /dev/null @@ -1,5 +0,0 @@ -#killall -qw tdcdma_gui -#killall -qw IALdummy -#./bin/mobile_node.down -rmmod -w nascellmt - diff --git a/openair2/NAS/DRIVER/CELLULAR/stop_rg_cellular b/openair2/NAS/DRIVER/CELLULAR/stop_rg_cellular deleted file mode 100755 index 88d17a7e6b..0000000000 --- a/openair2/NAS/DRIVER/CELLULAR/stop_rg_cellular +++ /dev/null @@ -1,2 +0,0 @@ -ifconfig oai0 down -rmmod -w nascellrg diff --git a/openair2/NAS/Makefile.inc b/openair2/NAS/Makefile.inc deleted file mode 100644 index a06e8f690a..0000000000 --- a/openair2/NAS/Makefile.inc +++ /dev/null @@ -1,6 +0,0 @@ -NAS_UE_DIR = $(OPENAIR2_TOP)/NAS - -NAS_UE_OBJS = - -NAS_UE_incl = \ - -I$(NAS_UE_DIR) diff --git a/openair2/NAS/SIMU_CELLULAR/Makefile b/openair2/NAS/SIMU_CELLULAR/Makefile deleted file mode 100755 index 26af978a4e..0000000000 --- a/openair2/NAS/SIMU_CELLULAR/Makefile +++ /dev/null @@ -1,62 +0,0 @@ -# lines starting with the pound sign are comments. -# -# These things are options that you might need -# to tweak. - - -# You can modify the below as well, but probably -# won't need to. - -include $(OPENAIR_DIR)/common/utils/Makefile.inc -#UPDIR := /homes/mwett/rh_mw/RHODOS -COMMON_DIR = $(OPENAIR2_DIR)/COMMON -RRC_CELL_DIR = $(OPENAIR2_DIR)/RRC/CELLULAR -NAS_SIMU_DIR = $(OPENAIR2_DIR)/NAS/SIMU_CELLULAR -#ASN1_DIR = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES -ASN1_DIR = $(OPENAIR2_DIR) - -#UPDIR := $(EURECOM_SRC_PATH) -#GRAAL_DIR =$(UPDIR)/non_access_stratum/driver/nasmt -#RRC_DIR =$(UPDIR)/access_stratum/l3/rrc - -#CFLAGS += -Wall -g -DDEBUG_RRC_STATE -DUSER_MODE -DNODE_RG -DNODE_MT -CFLAGS += -std=gnu99 -I$(KERNEL_DIR) -DUSER_MODE -DNB_ANTENNAS_RX=1 - -ifdef CELL_RRM -CFLAGS += -DNODE_RG -OBJ +=rrm_fifo_standalone.o nasrg_simu_meas.o -else -ifdef MASTER -CFLAGS += -DNODE_RG -OBJ +=nasrg_simu_main.o nasrg_simu_control.o nasrg_simu_rrm_fifo.o nasrg_simu_meas.o -else -CFLAGS += -DNODE_MT -OBJ +=nasmt_simu_main.o nasmt_simu_control.o -endif -endif - -ifdef CELLULAR -CFLAGS += -DCELLULAR -DNO_RRM -I$(COMMON_DIR) -I$(RRC_CELL_DIR) -I$(NAS_SIMU_DIR) -I$(ASN1_DIR) -endif - - -$(OBJ) : %.o : %.c - $(CC) $(CFLAGS) -c -o $@ $< -pthread - -all: nasmt_simu nasrg_simu - -nasmt_sim : $(OBJ) - $(CC) -o nasmt_simu $(OBJ) $(CFLAGS) -lm -lrt -pthread - mv nasmt_simu $(OPENAIR_TARGETS)/SIMU/USER - -nasrg_sim : $(OBJ) - $(CC) -o nasrg_simu $(OBJ) $(CFLAGS) -lm -lrt -pthread - mv nasrg_simu $(OPENAIR_TARGETS)/SIMU/USER - -cell_rrm : $(OBJ) - $(CC) -o cell_rrm $(OBJ) $(CFLAGS) -lm -lrt -pthread - mv cell_rrm $(OPENAIR_TARGETS)/SIMU/USER - -clean: - -rm $(OBJ) $(EXECUTABLE) - diff --git a/openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h b/openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h deleted file mode 100755 index 787d2db9cc..0000000000 --- a/openair2/NAS/SIMU_CELLULAR/nas_simu_proto.h +++ /dev/null @@ -1,42 +0,0 @@ -/*************************************************************************** - nas_control_proto.h - description - ------------------- - begin : June 25, 2002 - copyright : (C) 2002 by Eurecom - email : Michelle.Wetterwald@eurecom.fr - ************************************************************************** - Prototypes related to NAS control functions - ***************************************************************************/ -#ifndef __NAS_CONTROL_H__ -#define __NAS_CONTROL_H__ - -#ifdef NODE_MT -//----------------------------------------------------------------------------- -void nas_ue_control_init (void); -//int nas_ue_DC_attach(void); -//int nas_ue_DC_attach_complete(void); -int nas_ue_GC_Rcve_FIFO (void); -int nas_ue_NT_Rcve_FIFO (void); -int nas_ue_DC_Rcve_FIFO (void); -#endif - -#ifdef NODE_RG -//----------------------------------------------------------------------------- -void nas_rg_control_init (void); -//int nas_rg_DC_ConnectMs(void) ; -int nas_rg_DC_Rcve_FIFO (int time); - -int nasrg_rrm_socket_init(void); -void nasrg_rrm_fifos_init (void); -void nasrg_rrm_to_rrc_write (void); -void nasrg_rrm_from_rrc_read (void); - -int nasrg_meas_loop (int time, int UE_Id); -void nas_rg_print_buffer (char *buffer, int length); -/*void nasrg_print_meas_report (char *rrc_rrm_meas_payload, uint16_t type); -void nasrg_print_bs_meas_report (char *rrc_rrm_meas_payload, uint16_t type);*/ -void nasrg_print_meas_report (char *rrc_rrm_meas_payload, unsigned short type); -void nasrg_print_bs_meas_report (char *rrc_rrm_meas_payload, unsigned short type); -#endif - -#endif diff --git a/openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c b/openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c deleted file mode 100755 index 98b9d50109..0000000000 --- a/openair2/NAS/SIMU_CELLULAR/nasrg_simu_meas.c +++ /dev/null @@ -1,634 +0,0 @@ -/*************************************************************************** - nasrg_simu_meas.c - description - ------------------- - begin : June 2004 - copyright : (C) 2004, 2010 by Eurecom - email : Michelle.Wetterwald@eurecom.fr - ************************************************************************** - Simulations of measures for tests - ***************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "openair_types.h" -#include "rrc_constant.h" - -#include "rrc_msg_constant.h" -#include "rrc_rrm_primitives.h" -#include "rrc_msg_ies.h" - -#include "nas_simu_proto.h" - -extern int rrc_rg_rrm_in_fifo; - -int sim_counter=0; - -/* Mobile Station */ -//------------------------------------------------------------------- -void nasrg_meas_if_setup (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Intra-Frequency - rrm_control->type = IX_ifM; - // measurementCommand SETUP - rrm_control->command = MC_setup; - rrm_control->BaseStation = 0; - rrm_control->UE_Id = UE_Id; - rrm_control->amount = amount16; - rrm_control->period = int2000; -} - -//------------------------------------------------------------------- -void nasrg_meas_if_release (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Intra-Frequency - rrm_control->type = IX_ifM; - // measurementCommand RELEASE - rrm_control->command = MC_release; - rrm_control->BaseStation = 0; - rrm_control->UE_Id = UE_Id; -} - -//------------------------------------------------------------------- -void nasrg_meas_tv_setup (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Traffic Volume - rrm_control->type = IX_tvM; - // measurementCommand SETUP - rrm_control->command = MC_setup; - rrm_control->BaseStation = 0; - rrm_control->UE_Id = UE_Id; - rrm_control->amount = amount_inf; - rrm_control->period = int2000; -} - -//------------------------------------------------------------------- -void nasrg_meas_tv_release (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Traffic Volume - rrm_control->type = IX_tvM; - // measurementCommand RELEASE - rrm_control->command = MC_release; - rrm_control->BaseStation = 0; - rrm_control->UE_Id = UE_Id; -} - -//------------------------------------------------------------------- -void nasrg_meas_q_setup (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Quality - rrm_control->type = IX_qM; - // measurementCommand SETUP - rrm_control->command = MC_setup; - rrm_control->BaseStation = 0; - rrm_control->UE_Id = UE_Id; - rrm_control->amount = amount2; //for test - //rrm_control->amount = amount_inf; // for execution - rrm_control->period = int3000; -} - -//------------------------------------------------------------------- -void nasrg_meas_q_release (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Quality - rrm_control->type = IX_qM; - // measurementCommand RELEASE - rrm_control->command = MC_release; - rrm_control->BaseStation = 0; - rrm_control->UE_Id = UE_Id; -} - -//------------------------------------------------------------------- -void nasrg_meas_int_ue_setup (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Internal UE - rrm_control->type = IX_iueM; - // measurementCommand SETUP - rrm_control->command = MC_setup; - rrm_control->BaseStation = 0; - rrm_control->UE_Id = UE_Id; - rrm_control->amount = amount8; - rrm_control->period = int1000; -} - -//------------------------------------------------------------------- -void nasrg_meas_int_ue_release (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Internal UE - rrm_control->type = IX_iueM; - // measurementCommand RELEASE - rrm_control->command = MC_release; - rrm_control->BaseStation = 0; - rrm_control->UE_Id = UE_Id; -} - - -/* Base Station */ -//------------------------------------------------------------------- -void nasrg_meas_bs_tv_setup (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Traffic Volume - rrm_control->type = IX_tvbM; - // measurementCommand SETUP - rrm_control->command = MC_setup; - rrm_control->BaseStation = 1; - rrm_control->UE_Id = UE_Id; - rrm_control->amount = amount_inf; - rrm_control->period = int4000; -} - -//------------------------------------------------------------------- -void nasrg_meas_bs_tv_release (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Traffic Volume - rrm_control->type = IX_tvbM; - // measurementCommand RELEASE - rrm_control->command = MC_release; - rrm_control->BaseStation = 1; - rrm_control->UE_Id = UE_Id; -} - -//------------------------------------------------------------------- -void nasrg_meas_bs_q_setup (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Quality - rrm_control->type = IX_qbM; - // measurementCommand SETUP - rrm_control->command = MC_setup; - rrm_control->BaseStation = 1; - rrm_control->UE_Id = UE_Id; - rrm_control->amount = amount2; - rrm_control->period = int3000; -} - -//------------------------------------------------------------------- -void nasrg_meas_bs_q_release (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Quality - rrm_control->type = IX_qbM; - // measurementCommand RELEASE - rrm_control->command = MC_release; - rrm_control->BaseStation = 1; - rrm_control->UE_Id = UE_Id; -} - -//------------------------------------------------------------------- -void nasrg_meas_int_bs_setup (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Internal BS - rrm_control->type = IX_ibsM; - // measurementCommand SETUP - rrm_control->command = MC_setup; - rrm_control->BaseStation = 1; - rrm_control->UE_Id = maxUsers; //should not be set - rrm_control->amount = amount16; - rrm_control->period = int4000; -} - -//------------------------------------------------------------------- -void nasrg_meas_int_bs_release (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - // measurement identity Internal BS - rrm_control->type = IX_ibsM; - // measurementCommand RELEASE - rrm_control->command = MC_release; - rrm_control->BaseStation = 1; - rrm_control->UE_Id = maxUsers; //should not be set -} - -//------------------------------------------------------------------- -void nasrg_send_meas_request_to_rrc (int ue_id, struct rrc_rrm_measure_ctl *rrm_control) -{ - //------------------------------------------------------------------- - rpc_message rpc_mess; - measurement_request meas_request; - int count =0; - - printf ("[NASRG_MEAS_TEST] RPC_MEASUREMENT_REQUEST --> RRC\n "); - memset ((char*)& rpc_mess, 0, sizeof (rpc_message)); - memset ((char*)& meas_request, 0, sizeof (measurement_request)); - //build header - rpc_mess.type = RPC_MEASUREMENT_REQUEST; - rpc_mess.length = sizeof (measurement_request); - // build content - meas_request.measurement_type = rrm_control->type; - meas_request.measurement_command = rrm_control->command; - // different conding between RRM and RRC - // Mobile terminal RRC = 0, RRM = 1 - // Base Station RRC = 1, RRM = 2 - meas_request.equipment_type = rrm_control->BaseStation + 1; - meas_request.equipment_id = rrm_control->UE_Id; - meas_request.amount = rrm_control->amount; - meas_request.period = rrm_control->period; - - // send to RRC - count = write(rrc_rg_rrm_in_fifo, (uint8_t *) & rpc_mess, sizeof (rpc_message)); - count += write(rrc_rg_rrm_in_fifo, (uint8_t *) & meas_request, sizeof (measurement_request)); - - if (count > 0) { - printf ("RRM message sent successfully on RRM FIFO, length: %d\n", count); - } else { - printf ("RRM FIFO transmit failed"); - } - -#ifdef DEBUG_NAS_MEAS_SIMU - nas_rg_print_buffer ((char *) & rpc_mess, sizeof (rpc_message)); - nas_rg_print_buffer ((char *) & meas_request, sizeof (meas_request)); -#endif -} - -//------------------------------------------------------------------- -// in case not rrc_rg_meas_loop (time,UE_Id); -int nasrg_rrm_meas_stop (int time, int UE_Id) -{ - //------------------------------------------------------------------- - struct rrc_rrm_measure_ctl control; - - // Measurement Control - Stop Quality previously sent by RRM - nasrg_meas_q_release (UE_Id, &control); - //rrc_rrm_measure_request (control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - return 0; -} -//------------------------------------------------------------------- -// rrc_rg_meas_loop (time,UE_Id); -int nasrg_meas_loop (int time, int UE_Id) -{ - //------------------------------------------------------------------- - struct rrc_rrm_measure_ctl control; - - sim_counter++; - // if (time % 5 == 0) { -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n[NASRG_MEAS_TEST] Simu Measurement Time : %d, counter : %d\n", time, sim_counter); -#endif - - // } - if (sim_counter == 8) { - // Measurement Control - Stop Quality previously sent by RRM -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] NAS sends Measurement Control (Stop Quality) message at time : %d\n\n", sim_counter); -#endif - // setup if measurement for MT - nasrg_meas_q_release (UE_Id, &control); - //rrc_rrm_measure_request (control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // Intra-Frequency - // if (sim_counter == 140) { - if (sim_counter == 16) { - // Measurement Control - Start Intra-frequency -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG sends Measurement Control (Start Intra-freq) message at time : %d\n\n", sim_counter); -#endif - // setup if measurement for MT - nasrg_meas_if_setup (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // if (sim_counter == 700) { - if (sim_counter == 70) { - // Measurement Control - Stop Intra-frequency -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG sends Measurement Control (Stop Intra-freq) message at time : %d\n\n", sim_counter); -#endif - // setup if measurement for MT - nasrg_meas_if_release (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // Traffic Volume - // if (sim_counter == 100) { - if (sim_counter == 12) { - // Measurement Control - Start Traffic Volume -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG sends Measurement Control (Start Traffic Volume) message at time : %d\n\n", sim_counter); -#endif - // setup if measurement for MT - nasrg_meas_tv_setup (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // if (sim_counter == 990) { - if (sim_counter == 92) { - // Measurement Control - Stop Traffic Volume -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG sends Measurement Control (Stop Traffic Volume) message at time : %d\n\n", sim_counter); -#endif - // setup if measurement for MT - nasrg_meas_tv_release (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // Quality - // if (sim_counter == 503) { - if (sim_counter == 50) { - // Measurement Control - Start Quality -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG sends Measurement Control (Start Quality) message at time : %d\n\n", sim_counter); -#endif - // setup if measurement for MT - nasrg_meas_q_setup (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // if (sim_counter == 995) { - if (sim_counter == 96) { - // Measurement Control - Stop Quality -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG sends Measurement Control (Stop Quality) message at time : %d\n\n", sim_counter); -#endif - // setup if measurement for MT - nasrg_meas_q_release (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // Internal UE - // if (sim_counter == 210) { - if (sim_counter == 20) { - // Measurement Control - Start Internal UE -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG sends Measurement Control (Start Int UE) message at time : %d\n\n", sim_counter); -#endif - // setup int_ue measurement for MT - nasrg_meas_int_ue_setup (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // if (sim_counter == 999) { - if (sim_counter == 98) { - // Measurement Control - Stop Internal UE -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG sends Measurement Control (Stop Int UE) message at time : %d\n\n", sim_counter); -#endif - nasrg_meas_int_ue_release (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // Internal BS - // if (sim_counter == 105) { - if (sim_counter == 14) { - // Measurement Control - Start Internal BS -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG starts internal Measurement (Int BS) at time : %d\n\n", sim_counter); -#endif - nasrg_meas_int_bs_setup (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // if (sim_counter == 980) { - if (sim_counter == 86) { - // Measurement Control - Stop Internal BS -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG stops internal Measurement (Int BS) at time : %d\n\n", sim_counter); -#endif - nasrg_meas_int_bs_release (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // Traffic Volume BS - // if (sim_counter == 220) { - if (sim_counter == 22) { - // Measurement Control - Start Traffic Volume BS -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG starts internal Measurement (Traffic Volume BS) at time : %d\n\n", sim_counter); -#endif - nasrg_meas_bs_tv_setup (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // if (sim_counter == 900) { - if (sim_counter == 80) { - // Measurement Control - Stop Traffic Volume BS -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG stops internal Measurement (Traffic Volume BS) at time : %d\n\n", sim_counter); -#endif - nasrg_meas_bs_tv_release (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // Quality BS - // if (sim_counter == 625) { - if (sim_counter == 62) { - // Measurement Control - Start Quality BS -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG starts internal Measurement (Quality BS) at time : %d\n\n", sim_counter); -#endif - nasrg_meas_bs_q_setup (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - // if (sim_counter == 989) { - if (sim_counter == 90) { - // Measurement Control - Stop Quality BS -#ifdef DEBUG_NAS_MEAS_SIMU - printf ("\n\n[NASRG_MEAS_TEST] RG stops internal Measurement (Quality BS) at time : %d\n\n", sim_counter); -#endif - nasrg_meas_bs_q_release (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - } - - return sim_counter; -} - -//----------------------------------------------------------------------------- -//void rrc_rg_print_meas_report (struct rrc_rg_mt_meas_rep *p){ -void nasrg_print_meas_report (char *rrc_rrm_meas_payload, uint16_t type) -{ - //----------------------------------------------------------------------------- - int i, j; - char *payload[20] = - { "pl0", "pl4", "pl8", "pl16", "pl32", "pl64", "pl128", "pl256", "pl512", "pl1024", "pl2k", "pl4k", "pl8k", "pl16k", "pl32k", "pl64k", "pl128k", "pl256k", "pl512k", "pl1024k" }; - char *average[20] = { - "pla0", "pla4", "pla8", "pla16", "pla32", "pla64", "pla128", "pla256", "pla512", "pla1024", "pla2k", - "pla4k", "pla8k", "pla16k", "pla32k", "pla64k", "pla128k", "pla256k", "pla512k","pla1024k" - }; - char *variance[14] = { "plv0", "plv4", "plv8", "plv16", "plv32", "plv64", "plv128", "plv256", "plv512", "plv1024", "plv2k", "plv4k", "plv8k", "plv16k" }; - - printf ("\n[NASRG-MEAS] ************** MT Measurement Report Message *****************\n"); - - switch (type) { - case RPC_L1_MEASUREMENT_MT_INTRA_FREQUENCY_REPORT: { - struct rrc_rrm_meas_report_mt_if *p; - p = (struct rrc_rrm_meas_report_mt_if *)rrc_rrm_meas_payload; - printf ("Intra Frequency Measurement\t Number of cells: %d\n", p->if_num_cells); - - for (i = 0; i < p->if_num_cells; i++) { - printf ("[NASRG-MEAS] Cell number: %d\tCell Identity: %d\tCell Parameters Id: %d\tP-CCPCH RSCP: %d\tPathloss: %d\n", i, p->if_cell_id[i], p->if_cell_parms_id[i], p->if_BCH_RSCP[i], p->if_pathloss[i]); - printf ("\tTimeslot ISCP for each slot:\t"); - - for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++) - printf ("%d: %d, ", j, p->if_slot_iscp[i][j]); - - printf ("\n"); - } - } - break; - - case RPC_L1_MEASUREMENT_MT_TRAFFIC_VOLUME_REPORT: { - struct rrc_rrm_meas_report_mt_tv *p; - p = (struct rrc_rrm_meas_report_mt_tv *)rrc_rrm_meas_payload; - printf ("Traffic Volume Measurement -\t Number of RBs: %d\n", p->tv_num_rbs); - - for (i = 0; i < p->tv_num_rbs; i++) - printf ("[NASRG-MEAS] RB_Id : %d\t, RLC_BufferPayload : %s\t, Average : %s\t, Variance : %s\n", - p->tv_rbid[i], payload[p->tv_rb_payload[i]], average[p->tv_rb_average[i]], variance[p->tv_rb_variance[i]]); - } - break; - - case RPC_L1_MEASUREMENT_MT_QUALITY_REPORT: { - struct rrc_rrm_meas_report_mt_q *p; - p = (struct rrc_rrm_meas_report_mt_q *)rrc_rrm_meas_payload; - printf ("Quality Measurement -\t Number of Transport Channels : %d, Number of TFCS : %d\n", p->q_num_TrCH, p->q_num_tfcs); - printf ("[NASRG-MEAS] BLER for each Transport Channel:\t"); - - for (i = 0; i < p->q_num_TrCH; i++) - printf ("%d: %d, ", p->q_dl_TrCH_id[i], p->q_dl_TrCH_BLER[i]); - - printf ("\n"); - printf ("[NASRG-MEAS] SIR for each TFCS for each slot:\n"); - - for (i = 0; i < p->q_num_tfcs; i++) { - printf ("%d: ", p->q_tfcs_id[i]); - - for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++) - printf ("%d, ", p->q_sir[i][j]); - - printf ("\n"); - } - } - break; - - case RPC_L1_MEASUREMENT_MT_INTERNAL_REPORT: { - struct rrc_rrm_meas_report_mt_int *p; - p = (struct rrc_rrm_meas_report_mt_int *)rrc_rrm_meas_payload; - printf ("UE internal Measurement\t Timing Advance: %d\n", p->int_timing_advance); - printf ("[NASRG-MEAS] Transmitted Power for each slot:\t"); - - for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++) - printf ("%d: %d, ", j, p->int_xmit_power[j]); - - printf ("\n"); - } - break; - } - - printf ("[NASRG-MEAS] *****END********* Measurement Report Message *******\n\n"); -} - -//----------------------------------------------------------------------------- -void nasrg_print_bs_meas_report (char *rrc_rrm_meas_payload, uint16_t type) -{ - //----------------------------------------------------------------------------- - int i, j; - char *payload[20] = - { "pl0", "pl4", "pl8", "pl16", "pl32", "pl64", "pl128", "pl256", "pl512", "pl1024", "pl2k", "pl4k", "pl8k", "pl16k", "pl32k", "pl64k", "pl128k", "pl256k", "pl512k", "pl1024k" }; - char *average[20] = { - "pla0", "pla4", "pla8", "pla16", "pla32", "pla64", "pla128", "pla256", "pla512", "pla1024", "pla2k", - "pla4k", "pla8k", "pla16k", "pla32k", "pla64k", "pla128k", "pla256k", "pla512k", "pla1024k" - }; - char *variance[14] = { "plv0", "plv4", "plv8", "plv16", "plv32", "plv64", "plv128", "plv256", "plv512", "plv1024", "plv2k", "plv4k", "plv8k", "plv16k" }; - - printf ("\n[NASRG-MEAS] ************** BS Measurement Report Message *****************\n"); - - switch (type) { - case RPC_L1_MEASUREMENT_RG_TRAFFIC_VOLUME_REPORT: { - struct rrc_rrm_meas_report_bs_tv *p; - p = (struct rrc_rrm_meas_report_bs_tv *)rrc_rrm_meas_payload; - printf ("Traffic Volume Measurement -\t Number of RBs: %d\n", p->tv_num_rbs); - - for (i = 0; i < p->tv_num_rbs; i++) - printf ("[NASRG-MEAS] RB_Id : %d\t, RLC_BufferPayload : %s\t, Average : %s\t, Variance : %s\n", - p->tv_rbid[i], payload[p->tv_rb_payload[i]], average[p->tv_rb_average[i]], variance[p->tv_rb_variance[i]]); - } - break; - - case RPC_L1_MEASUREMENT_RG_QUALITY_REPORT: { - struct rrc_rrm_meas_report_bs_q *p; - p = (struct rrc_rrm_meas_report_bs_q *)rrc_rrm_meas_payload; - printf ("Quality Measurement -\t Number of Transport Channels : %d, Number of TFCS : %d\n", p->q_num_TrCH, p->q_num_tfcs); - printf ("[NASRG-MEAS] BLER for each Transport Channel:\t"); - - for (i = 0; i < p->q_num_TrCH; i++) - printf ("%d: %d, ", p->q_dl_TrCH_id[i], p->q_dl_TrCH_BLER[i]); - - printf ("\n"); - printf ("[NASRG-MEAS] SIR for each TFCS for each slot:\n"); - - for (i = 0; i < p->q_num_tfcs; i++) { - printf ("%d: ", p->q_tfcs_id[i]); - - for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++) - printf ("%d, ", p->q_sir[i][j]); - - printf ("\n"); - } - } - break; - - case RPC_L1_MEASUREMENT_RG_INTERNAL_REPORT: { - struct rrc_rrm_meas_report_bs_int *p; - p = (struct rrc_rrm_meas_report_bs_int *)rrc_rrm_meas_payload; - printf ("BS internal Measurement\n"); - - for (i = 0; i < numANTENNAS; i++) { - printf ("[NASRG-MEAS] Transmitted Power for each slot on antenna %d : ", i); - - for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++) - printf ("%d: %d, ", j, p->int_xmit_power[i][j]); - - printf ("\n"); - } - - for (i = 0; i < JRRM_SLOTS_PER_FRAME; i++) { - printf ("[NASRG-MEAS] RSCP for each channel on slot %d : ", i); - - for (j = 0; j < MAXCH; j++) - printf ("%d: %d, ", j, p->int_rscp[i][j]); - - printf ("\n"); - } - - for (i = 0; i < numANTENNAS; i++) { - printf ("[NASRG-MEAS] RSSI RF for each slot on antenna %d : ", i); - - for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++) - printf ("%d: %d, ", j, p->int_rssi_rf[i][j]); - - printf ("\n"); - } - - for (i = 0; i < NUMSPARE; i++) { - printf ("[NASRG-MEAS] Spare value : %d: %d\n", i, p->int_spare[i]); - } - } - break; - } - - printf ("[NASRG-MEAS] *****END********* Measurement Report Message *******\n\n"); -} - diff --git a/openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c b/openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c deleted file mode 100755 index 3622c06b94..0000000000 --- a/openair2/NAS/SIMU_CELLULAR/rrm_fifo_standalone.c +++ /dev/null @@ -1,367 +0,0 @@ -/*************************************************************************** - rrm_fifo_standalone.c - - ------------------- - begin : June 27, 2002 - copyright : (C) 2002 by Eurecom - created by : michelle.wetterwald@eurecom.fr - - description: - This file contains an emulator of the RRM - ***************************************************************************/ -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -// -#include -#include -#include -//----------------------------------------------------------------------------- -#include "openair_types.h" -#include "rrc_constant.h" -#include "nas_simu_proto.h" - -#include "rrc_rrm_sap.h" -#include "rrc_msg_constant.h" -#include "rrc_rrm_primitives.h" - -void nasrg_meas_q_setup (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control); -void nasrg_meas_q_release (int UE_Id, struct rrc_rrm_measure_ctl *rrm_control); -void nasrg_send_meas_request_to_rrc (int ue_id, struct rrc_rrm_measure_ctl *rrm_control); -//----------------------------------------------------------------------------- -int rrc_rg_rrm_in_fifo; -int rrc_rg_rrm_out_fifo; -int tXmit_id; -#define RRM_MSG_MAX_LENGTH 1500 -struct rrc_rrm_measure_ctl control; - -//----------------------------------------------------------------------------- -// Open FIFOs for RG RRC SAPs -void nasrg_rrm_fifos_init (void) -{ - //----------------------------------------------------------------------------- - int write_flag = O_WRONLY | O_NONBLOCK | O_NDELAY; - int read_flag = O_RDONLY | O_NONBLOCK | O_NDELAY; - - // Open FIFOs - - while ((rrc_rg_rrm_in_fifo = open (RRM_INPUT_SAPI, write_flag)) < 0) { - printf ("%s returned value %d\n", RRM_INPUT_SAPI, rrc_rg_rrm_in_fifo); - fflush(stdout); - sleep (1); - } - - while ((rrc_rg_rrm_out_fifo = open (RRM_OUTPUT_SAPI, read_flag)) < 0) { - printf ("%s returned value %d\n", RRM_OUTPUT_SAPI, rrc_rg_rrm_out_fifo); - fflush(stdout); - sleep (1); - } - - printf ("FIFO RRM_INPUT_SAPI, %d\n", rrc_rg_rrm_in_fifo); - printf ("FIFO RRM_OUTPUT_SAPI, %d\n", rrc_rg_rrm_out_fifo); -} - -//------------------------------------------------------------------- -void rrm_connection_response (void) -{ - //------------------------------------------------------------------- - rpc_message rpc_mess; - connection_response response; - int count=0; - char *sim_data = "Void configuration\0"; - - printf ("[CELL-RRM] RPC_CONNECTION_RESPONSE --> RRC\n "); - rpc_mess.type = RPC_CONNECTION_RESPONSE; - rpc_mess.length = sizeof (connection_response)+ strlen (sim_data); - response.equipment_id = 0; - response.status = STATUS_CONNECTION_ACCEPTED; - - //count = rtf_put (protocol_bs->rrc.rc_rrm.output_fifo, (uint8_t *) & rpc_mess, sizeof (rpc_message)); - //count = rtf_put (protocol_bs->rrc.rc_rrm.output_fifo, (uint8_t *) & confirm, sizeof (add_user_confirm)); - count = write(rrc_rg_rrm_in_fifo, (uint8_t *) & rpc_mess, sizeof (rpc_message)); - count += write(rrc_rg_rrm_in_fifo, (uint8_t *) & response, sizeof (connection_response)); - count += write(rrc_rg_rrm_in_fifo, (uint8_t *) sim_data, strlen (sim_data)); - - if (count > 0) { - printf ("RRM message sent successfully on RRM FIFO, length: %d\n", count); - } else { - printf ("RRM FIFO transmit failed"); - } -} - -//------------------------------------------------------------------- -void rrm_add_user_response (char *rcve_buffer) -{ - //------------------------------------------------------------------- - rpc_message rpc_mess; - add_user_response response; - add_user_request *request; - int count=0; - char *sim_data = "Void configuration\0"; - - request = (add_user_request *)rcve_buffer; - printf ("[CELL-RRM] RPC_ADD_USER_RESPONSE --> RRC\n "); - rpc_mess.type = RPC_ADD_USER_RESPONSE; - rpc_mess.length = sizeof (add_user_response)+ strlen (sim_data); - response.equipment_id = 0; - response.user_id = request->user_id; - response.tx_id = request->tx_id; - response.status = ADD_USER_SUCCESSFUL; - - //count = rtf_put (protocol_bs->rrc.rc_rrm.output_fifo, (uint8_t *) & rpc_mess, sizeof (rpc_message)); - //count = rtf_put (protocol_bs->rrc.rc_rrm.output_fifo, (uint8_t *) & confirm, sizeof (add_user_confirm)); - count = write(rrc_rg_rrm_in_fifo, (uint8_t *) & rpc_mess, sizeof (rpc_message)); - count += write(rrc_rg_rrm_in_fifo, (uint8_t *) & response, sizeof (add_user_response)); - count += write(rrc_rg_rrm_in_fifo, (uint8_t *) sim_data, strlen (sim_data)); - - if (count > 0) { - printf ("RRM message sent successfully on RRM FIFO, length: %d\n", count); - } else { - printf ("RRM FIFO transmit failed"); - } -} - -//------------------------------------------------------------------- -void rrm_remove_user_response (char *rcve_buffer) -{ - //------------------------------------------------------------------- - rpc_message rpc_mess; - remove_user_response response; - remove_user_request *request; - int count=0; - char *sim_data = "Void configuration\0"; - - request = (remove_user_request *)rcve_buffer; - printf ("[CELL-RRM] RPC_REMOVE_USER_RESPONSE --> RRC\n "); - rpc_mess.type = RPC_REMOVE_USER_RESPONSE; - rpc_mess.length = sizeof (remove_user_response)+ strlen (sim_data); - response.equipment_id = 0; - response.user_id = request->user_id; - response.tx_id = request->tx_id; - response.status = REMOVE_USER_SUCCESSFUL; - - //count = rtf_put (protocol_bs->rrc.rc_rrm.output_fifo, (uint8_t *) & rpc_mess, sizeof (rpc_message)); - //count = rtf_put (protocol_bs->rrc.rc_rrm.output_fifo, (uint8_t *) & confirm, sizeof (add_user_confirm)); - count = write(rrc_rg_rrm_in_fifo, (uint8_t *) & rpc_mess, sizeof (rpc_message)); - count += write(rrc_rg_rrm_in_fifo, (uint8_t *) & response, sizeof (remove_user_response)); - count += write(rrc_rg_rrm_in_fifo, (uint8_t *) sim_data, strlen (sim_data)); - - if (count > 0) { - printf ("RRM message sent successfully on RRM FIFO, length: %d\n", count); - } else { - printf ("RRM FIFO transmit failed"); - } - - /* Not sure it is really needed here - usleep (5000); //wait 5ms - // stop q measurement for MT - nasrg_meas_q_release (UE_Id, &control); - nasrg_send_meas_request_to_rrc (UE_Id, &control); - */ -} - -//------------------------------------------------------------------- -void rrm_add_radio_access_bearer_response (char *rcve_buffer) -{ - //------------------------------------------------------------------- - rpc_message rpc_mess; - add_radio_access_bearer_response response; - add_radio_access_bearer_request *request; - int count=0; - char *sim_data = "Void configuration\0"; - - request = (add_radio_access_bearer_request *)rcve_buffer; - printf ("[CELL-RRM] RPC_ADD_RADIO_ACCESS_BEARER_RESPONSE --> RRC\n "); - rpc_mess.type = RPC_ADD_RADIO_ACCESS_BEARER_RESPONSE; - rpc_mess.length = sizeof (add_radio_access_bearer_response)+ strlen (sim_data); - response.user_id = request->user_id; - response.rab_id = request->rab_id; - response.tx_id = request->tx_id; - response.status = ADD_RADIO_ACCESS_BEARER_SUCCESSFUL; - - //count = rtf_put (protocol_bs->rrc.rc_rrm.output_fifo, (uint8_t *) & rpc_mess, sizeof (rpc_message)); - //count = rtf_put (protocol_bs->rrc.rc_rrm.output_fifo, (uint8_t *) & confirm, sizeof (add_user_confirm)); - count = write(rrc_rg_rrm_in_fifo, (uint8_t *) & rpc_mess, sizeof (rpc_message)); - count += write(rrc_rg_rrm_in_fifo, (uint8_t *) & response, sizeof (add_radio_access_bearer_response)); - count += write(rrc_rg_rrm_in_fifo, (uint8_t *) sim_data, strlen (sim_data)); - - if (count > 0) { - printf ("RRM message sent successfully on RRM FIFO, length: %d\n", count); - } else { - printf ("RRM FIFO transmit failed"); - } -} - -//------------------------------------------------------------------- -void rrm_add_measurement_request (char *rcve_buffer) -{ - //------------------------------------------------------------------- - add_radio_access_bearer_confirm *confirm; - - confirm = (add_radio_access_bearer_confirm *)rcve_buffer; - printf ("[CELL-RRM] RPC_L1_MEASUREMENT_MT_QUALITY_REPORT --> RRC\n "); - - // TEMP removed the Meas request (causes bothe messages to be received together by RRC RG - // usleep (20000); //wait 5ms - // setup q measurement for MT - nasrg_meas_q_setup (confirm->user_id, &control); - nasrg_send_meas_request_to_rrc (confirm->user_id, &control); - -} - - -//------------------------------------------------------------------- -void rrm_remove_radio_access_bearer_response (char *rcve_buffer) -{ - //------------------------------------------------------------------- - rpc_message rpc_mess; - remove_radio_access_bearer_response response; - remove_radio_access_bearer_request *request; - int count=0; - char *sim_data = "Void configuration\0"; - - request = (remove_radio_access_bearer_request *)rcve_buffer; - printf ("[CELL-RRM] RPC_REMOVE_RADIO_ACCESS_BEARER_RESPONSE --> RRC\n "); - rpc_mess.type = RPC_REMOVE_RADIO_ACCESS_BEARER_RESPONSE; - rpc_mess.length = sizeof (remove_radio_access_bearer_response)+ strlen (sim_data); - response.user_id = request->user_id; - response.rab_id = request->rab_id; - response.tx_id = request->tx_id; - response.status = REMOVE_RADIO_ACCESS_BEARER_SUCCESSFUL; - - //count = rtf_put (protocol_bs->rrc.rc_rrm.output_fifo, (uint8_t *) & rpc_mess, sizeof (rpc_message)); - //count = rtf_put (protocol_bs->rrc.rc_rrm.output_fifo, (uint8_t *) & confirm, sizeof (add_user_confirm)); - count = write(rrc_rg_rrm_in_fifo, (uint8_t *) & rpc_mess, sizeof (rpc_message)); - count += write(rrc_rg_rrm_in_fifo, (uint8_t *) & response, sizeof (remove_radio_access_bearer_response)); - count += write(rrc_rg_rrm_in_fifo, (uint8_t *) sim_data, strlen (sim_data)); - - if (count > 0) { - printf ("RRM message sent successfully on RRM FIFO, length: %d\n", count); - } else { - printf ("RRM FIFO transmit failed"); - } - - usleep (20000); //wait 5ms - // stop q measurement for MT - nasrg_meas_q_release (request->user_id, &control); - nasrg_send_meas_request_to_rrc (request->user_id, &control); -} - - -//----------------------------------------------------------------------------- -// Check if anything in RRC FIFO and send it to RRM -void nasrg_rrm_from_rrc_read (void) -{ - //----------------------------------------------------------------------------- - char rcve_buffer[RRM_MSG_MAX_LENGTH]; - int rpc_header_size=0; - int count = 0; - rpc_message *rrc_rrm_mess; - char *rrc_rrm_meas_payload; - - memset (rcve_buffer, 0, RRM_MSG_MAX_LENGTH - 1); - rpc_header_size = sizeof (rpc_message); - rrc_rrm_mess = (rpc_message *) rcve_buffer; - - if ((count = read (rrc_rg_rrm_out_fifo, rcve_buffer, rpc_header_size)) > 0) { - //printf("\n RRM FIFO %d, bytes count %d", rrc_rg_rrm_out_fifo, count); -#ifdef DEBUG_RRC_RRM_INTF - printf ("\n [DEBUG]Message Received in RRM FIFO %d , length %d, type %d \n", rrc_rg_rrm_out_fifo, rrc_rrm_mess->length, rrc_rrm_mess->type); -#endif - //get the rest of the primitive - count += read (rrc_rg_rrm_out_fifo, &(rcve_buffer[rpc_header_size]), rrc_rrm_mess->length ); - - switch (rrc_rrm_mess->type) { - case RPC_CONNECTION_REQUEST: - printf ("\n[CELL-RRM]Received RPC_CONNECTION_REQUEST, length %d\n", rrc_rrm_mess->length); - rrm_connection_response(); - break; - - case RPC_ADD_USER_REQUEST: - printf ("\n[CELL-RRM]Received RPC_ADD_USER_REQUEST, length %d\n", rrc_rrm_mess->length); - rrm_add_user_response(&(rcve_buffer[rpc_header_size])); - break; - - case RPC_REMOVE_USER_REQUEST: - printf ("\n[CELL-RRM]Received RPC_REMOVE_USER_REQUEST, length %d\n", rrc_rrm_mess->length); - rrm_remove_user_response(&(rcve_buffer[rpc_header_size])); - break; - - case RPC_ADD_RADIO_ACCESS_BEARER_REQUEST: - printf ("\n[CELL-RRM]Received RPC_ADD_RADIO_ACCESS_BEARER_REQUEST, length %d\n", rrc_rrm_mess->length); - rrm_add_radio_access_bearer_response(&(rcve_buffer[rpc_header_size])); - break; - - case RPC_REMOVE_RADIO_ACCESS_BEARER_REQUEST: - printf ("\n[CELL-RRM]Received RPC_REMOVE_RADIO_ACCESS_BEARER_REQUEST, length %d\n", rrc_rrm_mess->length); - rrm_remove_radio_access_bearer_response(&(rcve_buffer[rpc_header_size])); - break; - - case RPC_ADD_USER_CONFIRM: - printf ("\n[CELL-RRM]Received RPC RPC_ADD_USER_CONFIRM , length %d\n", rrc_rrm_mess->length); - break; - - case RPC_ADD_RADIO_ACCESS_BEARER_CONFIRM: - printf ("\n[CELL-RRM]Received RPC RPC_ADD_RADIO_ACCESS_BEARER_CONFIRM , length %d\n", rrc_rrm_mess->length); - //rrm_add_measurement_request(&(rcve_buffer[rpc_header_size])); - break; - - case RPC_L1_MEASUREMENT_RG_INTERNAL_REPORT: - case RPC_L1_MEASUREMENT_RG_QUALITY_REPORT: - case RPC_L1_MEASUREMENT_RG_TRAFFIC_VOLUME_REPORT: - rrc_rrm_meas_payload = (char *)rcve_buffer +12; //12 = rpc_header + equipment_id - //nas_rg_print_buffer (rrc_rrm_meas_payload, rrc_rrm_mess->length); - nasrg_print_bs_meas_report (rrc_rrm_meas_payload,rrc_rrm_mess->type); - break; - - case RPC_L1_MEASUREMENT_MT_INTERNAL_REPORT: - case RPC_L1_MEASUREMENT_MT_QUALITY_REPORT: - case RPC_L1_MEASUREMENT_MT_TRAFFIC_VOLUME_REPORT: - case RPC_L1_MEASUREMENT_MT_INTRA_FREQUENCY_REPORT: - rrc_rrm_meas_payload = (char *)rcve_buffer +12; //12 = rpc_header + equipment_id - //nas_rg_print_buffer (rrc_rrm_meas_payload, rrc_rrm_mess->length); - nasrg_print_meas_report (rrc_rrm_meas_payload,rrc_rrm_mess->type); - break; - - default: - break; - } - - fflush(stdout); - } -} - - -//----------------------------------------------------------------------------- -int main (int argc, char **argv) -{ - //----------------------------------------------------------------------------- - int time = 0; - // int rc, sd_rrm; - // fd_set readfds; - // struct timeval tv; - tXmit_id =0; - nasrg_rrm_fifos_init (); - printf ("[RRM] RRM FIFOs ready\n"); - fflush(stdout); - - while (1) { - usleep (100000); - time ++; - //printf ("\n[RRM_TEST] Simu Measurement Time at Main: %d\n", time); - - // check RRM FIFO - nasrg_rrm_from_rrc_read(); - } -} diff --git a/openair2/NAS/nas_ue_task.h b/openair2/NAS/nas_ue_task.h deleted file mode 100644 index 6695ab0ac5..0000000000 --- a/openair2/NAS/nas_ue_task.h +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - -#ifndef NAS_UE_TASK_H_ -#define NAS_UE_TASK_H_ - -# if defined(ENABLE_ITTI) -void *nas_ue_task(void *args_p); -# endif - -#endif /* NAS_TASK_H_ */ diff --git a/openair2/NETWORK_DRIVER/LITE/COPYING b/openair2/NETWORK_DRIVER/LITE/COPYING deleted file mode 100755 index 94a9ed024d..0000000000 --- a/openair2/NETWORK_DRIVER/LITE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/NETWORK_DRIVER/LITE/Makefile b/openair2/NETWORK_DRIVER/LITE/Makefile deleted file mode 100755 index 76ba3b5bdb..0000000000 --- a/openair2/NETWORK_DRIVER/LITE/Makefile +++ /dev/null @@ -1,72 +0,0 @@ -# NASMESH Driver makefile -# -include $(OPENAIR_DIR)/common/utils/Makefile.inc -NAS_UPDIR := $(shell /bin/pwd) - -KERNEL_ARCH:=$(shell echo `uname -m`) -SET_X64:=$(shell if [ $(KERNEL_ARCH) = 'x86_64' ]; then echo true ; fi) - -#################################################### -# EXTRA COMPILER FLAGS -#################################################### -EXTRA_CFLAGS = -I$(OPENAIR2_DIR)/COMMON -fno-common -fno-stack-protector -mpreferred-stack-boundary=4 $(if $(SET_X64),-DARCH_64,) $(if $(SET_X64),-mcmodel=kernel,) - -ifdef ADDRCONF -EXTRA_CFLAGS += -DADDRCONF -endif - -ifdef OAI_NW_DRIVER_TYPE_ETHERNET -EXTRA_CFLAGS += -DOAI_NW_DRIVER_TYPE_ETHERNET -endif - -ifdef OAI_NW_DRIVER_USE_NETLINK -EXTRA_CFLAGS += -DOAI_NW_DRIVER_USE_NETLINK -else -EXTRA_CFLAGS += $(shell rtai-config --module-cflags) -DRTAI -D__IN_RTAI__ -Wall -endif - -ccflags-y= $(CFLAGS) $(EXTRA_CFLAGS) -CFLAGS= - -ifdef LOOPBACK -EXTRA_CFLAGS += -DLOOPBACK_TEST -endif - -ifdef ADDRESS_FIX -EXTRA_CFLAGS += -DNAS_ADDRESS_FIX -endif - -#################################################### -# LOADABLE MODULE GOALS -#################################################### -obj-m += oai_nw_drv.o -oai_nw_drv-objs += device.o -oai_nw_drv-objs += common.o -oai_nw_drv-objs += ioctl.o -oai_nw_drv-objs += classifier.o -oai_nw_drv-objs += tool.o -ifdef OAI_NW_DRIVER_USE_NETLINK -oai_nw_drv-objs += netlink.o -endif - -#################################################### -# REVOIR LE CLEAN -#################################################### - -#netlink.ko: - #make $(x)$(y) PDCP_USE_NETLINK=1 V=1 -C $(KERNEL_DIR) M=`pwd` modules - -#oai_nw_drv.ko: -# make V=1 -C $(KERNEL_DIR) M=`pwd` modules -print: - @echo subversion : $(SUBVERSION) -clean: - rm -f *.ko - rm -f .*.ko.cmd - rm -f .*.o.cmd - rm -f *.o - rm -f *.mod.c - find . -name *.ko -delete - find . -name .*.o -delete - find . -name *.o -delete - find . -name *.mod.c -delete diff --git a/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c b/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c old mode 100755 new mode 100644 index 43b8ec3614..e918f209e3 --- a/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c +++ b/openair2/NETWORK_DRIVER/LITE/RB_TOOL/rb_tool.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*************************************************************************** rb_tool.c - User-space utility for driving NASMESH IOCTL interface diff --git a/openair2/NETWORK_DRIVER/LITE/classifier.c b/openair2/NETWORK_DRIVER/LITE/classifier.c old mode 100755 new mode 100644 index 4025e28e19..bc6888279b --- a/openair2/NETWORK_DRIVER/LITE/classifier.c +++ b/openair2/NETWORK_DRIVER/LITE/classifier.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file classifier.c * \brief Classify IP packets diff --git a/openair2/NETWORK_DRIVER/LITE/common.c b/openair2/NETWORK_DRIVER/LITE/common.c old mode 100755 new mode 100644 index 7aca4b8d5f..0d616d5764 --- a/openair2/NETWORK_DRIVER/LITE/common.c +++ b/openair2/NETWORK_DRIVER/LITE/common.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file common.c * \brief implementation of emultor tx and rx diff --git a/openair2/NETWORK_DRIVER/LITE/constant.h b/openair2/NETWORK_DRIVER/LITE/constant.h old mode 100755 new mode 100644 index 82cef8e8c1..efeba0b86d --- a/openair2/NETWORK_DRIVER/LITE/constant.h +++ b/openair2/NETWORK_DRIVER/LITE/constant.h @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef _OAI_NW_DRV_CST #define _OAI_NW_DRV_CST diff --git a/openair2/NETWORK_DRIVER/LITE/device.c b/openair2/NETWORK_DRIVER/LITE/device.c old mode 100755 new mode 100644 index 9b772d6eef..854c3bcc99 --- a/openair2/NETWORK_DRIVER/LITE/device.c +++ b/openair2/NETWORK_DRIVER/LITE/device.c @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file device.c * \brief Networking Device Driver for OpenAirInterface Ethernet @@ -37,13 +28,6 @@ */ /*******************************************************************************/ -#ifndef OAI_NW_DRIVER_USE_NETLINK -#ifdef RTAI -#include "rtai_posix.h" -#define RTAI_IRQ 30 //try to get this irq with RTAI -#endif // RTAI -#endif // OAI_NW_DRIVER_USE_NETLINK - #include "constant.h" #include "local.h" #include "proto_extern.h" @@ -264,7 +248,11 @@ int oai_nw_drv_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) // End debug information netif_stop_queue(dev); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) + netif_trans_update(dev); +#else dev->trans_start = jiffies; +#endif #ifdef OAI_DRV_DEBUG_DEVICE printk("[OAI_IP_DRV][%s] step 1\n", __FUNCTION__); #endif @@ -337,7 +325,11 @@ void oai_nw_drv_tx_timeout(struct net_device *dev) printk("[OAI_IP_DRV][%s] begin\n", __FUNCTION__); // (struct oai_nw_drv_priv *)(dev->priv)->stats.tx_errors++; (priv->stats).tx_errors++; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) + netif_trans_update(dev); +#else dev->trans_start = jiffies; +#endif netif_wake_queue(dev); printk("[OAI_IP_DRV][%s] transmit timed out %s\n", __FUNCTION__,dev->name); } @@ -520,23 +512,12 @@ int init_module (void) #ifndef OAI_NW_DRIVER_USE_NETLINK -#ifdef RTAI //with RTAI you have to indicate which irq# you want - - pdcp_2_oai_nw_drv_irq=rt_request_srq(0, oai_nw_drv_interrupt, NULL); - -#endif - if (pdcp_2_oai_nw_drv_irq == -EBUSY || pdcp_2_oai_nw_drv_irq == -EINVAL) { printk("[OAI_IP_DRV][%s] No interrupt resource available\n", __FUNCTION__); return -EBUSY; } else printk("[OAI_IP_DRV][%s] Interrupt %d\n", __FUNCTION__, pdcp_2_oai_nw_drv_irq); - //rt_startup_irq(RTAI_IRQ); - - //rt_enable_irq(RTAI_IRQ); - - #endif //NETLINK for (inst=0; instirq, NULL); - // END V1 - rt_free_srq(pdcp_2_oai_nw_drv_irq); -#endif // Start IRQ linux //free_irq(priv->irq, NULL); // End IRQ linux diff --git a/openair2/NETWORK_DRIVER/LITE/ioctl.c b/openair2/NETWORK_DRIVER/LITE/ioctl.c old mode 100755 new mode 100644 index ad3a4eefac..85c213c5ff --- a/openair2/NETWORK_DRIVER/LITE/ioctl.c +++ b/openair2/NETWORK_DRIVER/LITE/ioctl.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "local.h" #include "ioctl.h" diff --git a/openair2/NETWORK_DRIVER/LITE/ioctl.h b/openair2/NETWORK_DRIVER/LITE/ioctl.h old mode 100755 new mode 100644 index 3b5d55823a..d5bab2038c --- a/openair2/NETWORK_DRIVER/LITE/ioctl.h +++ b/openair2/NETWORK_DRIVER/LITE/ioctl.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** ioctl.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/LITE/local.h b/openair2/NETWORK_DRIVER/LITE/local.h old mode 100755 new mode 100644 index 7268f69b5d..ea82dd9b85 --- a/openair2/NETWORK_DRIVER/LITE/local.h +++ b/openair2/NETWORK_DRIVER/LITE/local.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** local.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/LITE/netlink.c b/openair2/NETWORK_DRIVER/LITE/netlink.c old mode 100755 new mode 100644 index 2339540cae..2ad104b421 --- a/openair2/NETWORK_DRIVER/LITE/netlink.c +++ b/openair2/NETWORK_DRIVER/LITE/netlink.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file netlink.c * \brief establish a netlink diff --git a/openair2/NETWORK_DRIVER/LITE/proto_extern.h b/openair2/NETWORK_DRIVER/LITE/proto_extern.h old mode 100755 new mode 100644 index 36039ed984..f07083921f --- a/openair2/NETWORK_DRIVER/LITE/proto_extern.h +++ b/openair2/NETWORK_DRIVER/LITE/proto_extern.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** proto_extern.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/LITE/sap.h b/openair2/NETWORK_DRIVER/LITE/sap.h old mode 100755 new mode 100644 index ffe778fe34..d72a1b10df --- a/openair2/NETWORK_DRIVER/LITE/sap.h +++ b/openair2/NETWORK_DRIVER/LITE/sap.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef OAI_SAP_H #define OAI_SAP_H diff --git a/openair2/NETWORK_DRIVER/LITE/tool.c b/openair2/NETWORK_DRIVER/LITE/tool.c old mode 100755 new mode 100644 index 492d674c06..d8d0030dd9 --- a/openair2/NETWORK_DRIVER/LITE/tool.c +++ b/openair2/NETWORK_DRIVER/LITE/tool.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "local.h" #include "proto_extern.h" diff --git a/openair2/NETWORK_DRIVER/MESH/COPYING b/openair2/NETWORK_DRIVER/MESH/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/NETWORK_DRIVER/MESH/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/NETWORK_DRIVER/MESH/Makefile b/openair2/NETWORK_DRIVER/MESH/Makefile deleted file mode 100755 index f4bf87f318..0000000000 --- a/openair2/NETWORK_DRIVER/MESH/Makefile +++ /dev/null @@ -1,70 +0,0 @@ -# NASMESH Driver makefile -# -include $(OPENAIR_DIR)/common/utils/Makefile.inc -NAS_UPDIR := $(shell /bin/pwd) - -#################################################### -# NASMESH compilation flags -#################################################### -#RTAI=1 - -#################################################### -# D E B U G F L A G S -#################################################### - -#################################################### -# EXTRA COMPILER FLAGS -#################################################### -#EXTRA_CFLAGS = -fno-common -fno-stack-protector -mpreferred-stack-boundary=4 $(if $(SET_X64),-DARCH_64,) $(if $(SET_X64),-mcmodel=kernel,) $(if $(SET_X64),-m64,) -EXTRA_CFLAGS += -I$(OPENAIR2_DIR) -ifdef PDCP_USE_NETLINK -EXTRA_CFLAGS += -DPDCP_USE_NETLINK -else -EXTRA_CFLAGS += $(shell rtai-config --module-cflags) -DRTAI -D__IN_RTAI__ -Wall -endif - -ifdef LOOPBACK -EXTRA_CFLAGS += -DLOOPBACK_TEST -endif - -ifdef ADDRESS_FIX -EXTRA_CFLAGS += -DNAS_ADDRESS_FIX -endif -ifdef NAS_DEBUG_RECEIVE -EXTRA_CFLAGS += -DNAS_DEBUG_RECEIVE -endif - -ifdef NAS_DEBUG_SEND -EXTRA_CFLAGS += -DNAS_DEBUG_SEND -endif - -ccflags-y := $(CFLAGS) $(EXTRA_CFLAGS) -CFLAGS= - -#################################################### -# LOADABLE MODULE GOALS -#################################################### -obj-m += nasmesh.o -nasmesh-objs += device.o -nasmesh-objs += common.o -nasmesh-objs += ioctl.o -nasmesh-objs += classifier.o -nasmesh-objs += tool.o -nasmesh-objs += mesh.o -ifdef PDCP_USE_NETLINK -nasmesh-objs += netlink.o -endif - -#################################################### -# REVOIR LE CLEAN -#################################################### - -#netlink.ko: -# make PDCP_USE_NETLINK=1 V=1 -C $(KERNEL_DIR) M=`pwd` modules - -#nasmesh.ko: -# make V=1 -C $(KERNEL_DIR) M=`pwd` modules - -clean: - rm -f $(nasmesh-objs) $(obj-m) -# make -C $(KERNEL_DIR) modules diff --git a/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c b/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c index fb005b3589..8e231895d9 100644 --- a/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c +++ b/openair2/NETWORK_DRIVER/MESH/RB_TOOL/rb_tool.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** rb_tool.c - User-space utility for driving NASMESH IOCTL interface ------------------- @@ -43,7 +36,8 @@ #include #include #include - +#include +#include #include #include @@ -116,7 +110,7 @@ void IAL_NAS_ioctl_init(int inst) { struct nas_msg_statistic_reply *msgrep; - int err,rc; + int err; sprintf(gifr.name, "oai%d",inst); @@ -139,7 +133,6 @@ void IAL_NAS_ioctl_init(int inst) if (err<0) { printf("IOCTL error, err=%d\n",err); - rc = -1; } printf("tx_packets = %u, rx_packets = %u\n", msgrep->tx_packets, msgrep->rx_packets); @@ -158,19 +151,13 @@ void IAL_NAS_ioctl_init(int inst) int main(int argc,char **argv) //--------------------------------------------------------------------------- { - int done = 0, rc = 0, meas_polling_counter = 0; - fd_set readfds; - struct timeval tv; - int i = 0; int err = 0; - char * buffer; int c = 0; int action=0,rbset=0,cxset=0,instset=0,saddr_ipv4set=0,saddr_ipv6set=0,daddr_ipv4set=0,daddr_ipv6set=0,dscpset=0,mpls_outlabelset=0,mpls_inlabelset=0; char rb[100],cx[100],dscp[100],inst[100],mpls_outgoinglabel[100],mpls_incominglabel[100]; - int index = 0; struct nas_msg_rb_establishment_request *msgreq = NULL; struct nas_msg_class_add_request *msgreq_class = NULL; - in_addr_t saddr_ipv4,daddr_ipv4; + in_addr_t saddr_ipv4 = 0,daddr_ipv4 = 0; struct in6_addr saddr_ipv6,daddr_ipv6; unsigned int mpls_outlabel=0,mpls_inlabel=0; @@ -220,15 +207,21 @@ int main(int argc,char **argv) mpls_inlabelset=1; break; - case 's': - inet_aton(optarg,&saddr_ipv4); + case 's': { + struct in_addr a; + inet_aton(optarg,&a); + saddr_ipv4 = a.s_addr; saddr_ipv4set = 1; break; + } - case 't': - inet_aton(optarg,&daddr_ipv4); + case 't': { + struct in_addr a; + inet_aton(optarg,&a); + daddr_ipv4 = a.s_addr; daddr_ipv4set = 1; break; + } case 'x': printf("IPv6: %s\n",optarg); @@ -310,7 +303,7 @@ int main(int argc,char **argv) if (action == ADD_RB) { gifr.type = NAS_MSG_RB_ESTABLISHMENT_REQUEST; err=ioctl(fd, NAS_IOCTL_RRM, &gifr); - + if (err == -1) perror("ioctl"); if (saddr_ipv4set == 1) { @@ -336,6 +329,7 @@ int main(int argc,char **argv) gifr.type = NAS_MSG_CLASS_ADD_REQUEST; err=ioctl(fd, NAS_IOCTL_RRM, &gifr); + if (err == -1) perror("ioctl"); msgreq_class->rab_id = atoi(rb); msgreq_class->lcr = atoi(cx); @@ -347,6 +341,7 @@ int main(int argc,char **argv) msgreq_class->saddr.ipv4 = daddr_ipv4; gifr.type = NAS_MSG_CLASS_ADD_REQUEST; err=ioctl(fd, NAS_IOCTL_RRM, &gifr); + if (err == -1) perror("ioctl"); } if (saddr_ipv6set == 1) { @@ -377,6 +372,7 @@ int main(int argc,char **argv) gifr.type = NAS_MSG_CLASS_ADD_REQUEST; err=ioctl(fd, NAS_IOCTL_RRM, &gifr); + if (err == -1) perror("ioctl"); msgreq_class->rab_id = atoi(rb); msgreq_class->lcr = atoi(cx); @@ -387,6 +383,7 @@ int main(int argc,char **argv) memcpy(&msgreq_class->saddr.ipv6,&daddr_ipv6,16); gifr.type = NAS_MSG_CLASS_ADD_REQUEST; err=ioctl(fd, NAS_IOCTL_RRM, &gifr); + if (err == -1) perror("ioctl"); } @@ -418,6 +415,7 @@ int main(int argc,char **argv) gifr.type = NAS_MSG_CLASS_ADD_REQUEST; err=ioctl(fd, NAS_IOCTL_RRM, &gifr); + if (err == -1) perror("ioctl"); msgreq_class->rab_id = atoi(rb); msgreq_class->lcr = atoi(cx); @@ -437,12 +435,14 @@ int main(int argc,char **argv) gifr.type = NAS_MSG_CLASS_ADD_REQUEST; err=ioctl(fd, NAS_IOCTL_RRM, &gifr); + if (err == -1) perror("ioctl"); } } else if (action == DEL_RB) { gifr.type = NAS_MSG_RB_RELEASE_REQUEST; err=ioctl(fd, NAS_IOCTL_RRM, &gifr); + if (err == -1) perror("ioctl"); } diff --git a/openair2/NETWORK_DRIVER/MESH/TESTBENCH/testbench.c b/openair2/NETWORK_DRIVER/MESH/TESTBENCH/testbench.c index bccfa9552a..121d3bba8b 100644 --- a/openair2/NETWORK_DRIVER/MESH/TESTBENCH/testbench.c +++ b/openair2/NETWORK_DRIVER/MESH/TESTBENCH/testbench.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/NETWORK_DRIVER/MESH/classifier.c b/openair2/NETWORK_DRIVER/MESH/classifier.c old mode 100755 new mode 100644 index 2c55c0ca79..985bab946e --- a/openair2/NETWORK_DRIVER/MESH/classifier.c +++ b/openair2/NETWORK_DRIVER/MESH/classifier.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file classifier.c * \brief Classify IP packets * \author Navid Nikaein, Lionel GAUTHIER, Raymond knopp @@ -612,12 +605,12 @@ void nas_CLASS_send(struct sk_buff *skb,int inst) //--------------------------------------------------------------------------- struct classifier_entity *p, *sp; uint8_t *protocolh,version; - uint8_t protocol, dscp, exp,label; + uint8_t protocol, dscp /*, exp,label*/ ; uint16_t classref; struct cx_entity *cx; - unsigned int i; + //unsigned int i; - unsigned int router_adv = 0; + //unsigned int router_adv = 0; struct net_device *dev=nasdev[inst]; struct nas_priv *gpriv=netdev_priv(dev); @@ -797,7 +790,7 @@ void nas_CLASS_send(struct sk_buff *skb,int inst) dscp, sprotocol, sp->classref, sfct, sp->rab_id); #endif - sp->fct(skb, cx, sp,inst); + sp->fct(skb, cx, sp,inst, NULL); } // if classifier entry match found @@ -815,7 +808,7 @@ void nas_CLASS_send(struct sk_buff *skb,int inst) if (no_connection == 1) printk("NAS_CLASS_SEND: no corresponding connection, so the message is dropped\n"); -#endif NAS_DEBUG_CLASS +#endif /* NAS_DEBUG_CLASS */ // } // while loop over connections diff --git a/openair2/NETWORK_DRIVER/MESH/common.c b/openair2/NETWORK_DRIVER/MESH/common.c old mode 100755 new mode 100644 index 37862046c9..d380b8a4d8 --- a/openair2/NETWORK_DRIVER/MESH/common.c +++ b/openair2/NETWORK_DRIVER/MESH/common.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file common.c * \brief implementation of emultor tx and rx * \author Navid Nikaein, Lionel GAUTHIER, and Raymomd Knopp @@ -35,12 +28,8 @@ * \email: navid.nikaein@eurecom.fr, lionel.gauthier@eurecom.fr */ -//#include "nas_common.h" #include "local.h" #include "proto_extern.h" -#ifdef RTAI -#include "rtai_fifos.h" -#endif //#define NAS_DEBUG_RECEIVE 1 //#define NAS_DEBUG_SEND 1 @@ -66,14 +55,14 @@ void nas_COMMON_receive(uint16_t dlen, struct nas_priv *gpriv=netdev_priv(nasdev[inst]); uint32_t odaddr,osaddr; - int i; + //int i; unsigned char protocol; - unsigned char *addr,*daddr,*saddr,*ifaddr,sn; + unsigned char /**addr,*/ *daddr,*saddr,*ifaddr /*,sn*/; - struct udphdr *uh; - struct tcphdr *th; + //struct udphdr *uh; + //struct tcphdr *th; uint16_t *cksum,check; struct iphdr *network_header; @@ -328,10 +317,9 @@ void nas_COMMON_receive(uint16_t dlen, //--------------------------------------------------------------------------- // Delete the data -void nas_COMMON_del_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *sp,int inst) +void nas_COMMON_del_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *sp,int inst,struct nas_priv *gpriv) { struct nas_priv *priv=netdev_priv(nasdev[inst]); - //--------------------------------------------------------------------------- ++priv->stats.tx_dropped; } @@ -339,7 +327,7 @@ void nas_COMMON_del_send(struct sk_buff *skb, struct cx_entity *cx, struct class //--------------------------------------------------------------------------- // Request the transfer of data (QoS SAP) -void nas_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc,int inst) +void nas_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc,int inst, struct nas_priv *gpriv) { //--------------------------------------------------------------------------- struct pdcp_data_req_header_s pdcph; @@ -348,7 +336,7 @@ void nas_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, struct class int i; #endif unsigned int bytes_wrote; - unsigned char j; + //unsigned char j; // Start debug information #ifdef NAS_DEBUG_SEND printk("NAS_COMMON_QOS_SEND - inst %d begin \n",inst); @@ -603,7 +591,7 @@ struct rb_entity *nas_COMMON_search_rb(struct cx_entity *cx, nasRadioBearerId_t struct classifier_entity *nas_COMMON_search_class_for_rb(nasRadioBearerId_t rab_id,struct nas_priv *priv) { - struct rb_entity *rb; + //struct rb_entity *rb; int dscp; struct classifier_entity *rclass; diff --git a/openair2/NETWORK_DRIVER/MESH/constant.h b/openair2/NETWORK_DRIVER/MESH/constant.h old mode 100755 new mode 100644 index a6f053b658..1c756765c6 --- a/openair2/NETWORK_DRIVER/MESH/constant.h +++ b/openair2/NETWORK_DRIVER/MESH/constant.h @@ -1,33 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef _NAS_CST #define _NAS_CST diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c old mode 100755 new mode 100644 index 51b71d6d8e..086ec3909c --- a/openair2/NETWORK_DRIVER/MESH/device.c +++ b/openair2/NETWORK_DRIVER/MESH/device.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file device.c * \brief Networking Device Driver for OpenAirInterface MESH @@ -36,13 +28,6 @@ */ /*******************************************************************************/ -#ifndef PDCP_USE_NETLINK -#ifdef RTAI -#include "rtai_posix.h" -#define RTAI_IRQ 30 //try to get this irq with RTAI -#endif // RTAI -#endif // PDCP_USE_NETLINK - #include "constant.h" #include "local.h" #include "proto_extern.h" @@ -124,6 +109,7 @@ void *nas_interrupt(void) printk("INTERRUPT: end\n"); #endif // return 0; + return NULL; } #endif //NETLINK @@ -132,11 +118,8 @@ void *nas_interrupt(void) int nas_open(struct net_device *dev) { //--------------------------------------------------------------------------- - struct nas_priv *priv=netdev_priv(dev); - printk("OPEN: begin\n"); // MOD_INC_USE_COUNT; - // Address has already been set at init #ifndef PDCP_USE_NETLINK @@ -258,7 +241,11 @@ int nas_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) // End debug information netif_stop_queue(dev); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) + netif_trans_update(dev); +#else dev->trans_start = jiffies; +#endif #ifdef DEBUG_DEVICE printk("HARD_START_XMIT: step 1\n"); #endif @@ -319,7 +306,11 @@ void nas_tx_timeout(struct net_device *dev) printk("TX_TIMEOUT: begin\n"); // (struct nas_priv *)(dev->priv)->stats.tx_errors++; (priv->stats).tx_errors++; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) + netif_trans_update(dev); +#else dev->trans_start = jiffies; +#endif netif_wake_queue(dev); printk("TX_TIMEOUT: transmit timed out %s\n",dev->name); } @@ -414,8 +405,8 @@ void nas_init(struct net_device *dev) nas_TOOL_imei2iid(IMEI, dev->dev_addr);// IMEI to device address (for stateless autoconfiguration address) nas_TOOL_imei2iid(IMEI, (uint8_t *)priv->cx[0].iid6); #else - nas_TOOL_imei2iid(nas_IMEI, dev->dev_addr);// IMEI to device address (for stateless autoconfiguration address) - nas_TOOL_imei2iid(nas_IMEI, (uint8_t *)priv->cx[0].iid6); + nas_TOOL_imei2iid((uint8_t *)nas_IMEI, dev->dev_addr); // IMEI to device address (for stateless autoconfiguration address) + nas_TOOL_imei2iid((uint8_t *)nas_IMEI, (uint8_t *)priv->cx[0].iid6); #endif // this is more appropriate for user space soft realtime emulation #else @@ -452,23 +443,12 @@ int init_module (void) #ifndef PDCP_USE_NETLINK -#ifdef RTAI //with RTAI you have to indicate which irq# you want - - pdcp_2_nas_irq=rt_request_srq(0, nas_interrupt, NULL); - -#endif - if (pdcp_2_nas_irq == -EBUSY || pdcp_2_nas_irq == -EINVAL) { printk("[NAS][INIT] No interrupt resource available\n"); return -EBUSY; } else printk("[NAS][INIT]: Interrupt %d\n", pdcp_2_nas_irq); - //rt_startup_irq(RTAI_IRQ); - - //rt_enable_irq(RTAI_IRQ); - - #endif //NETLINK for (inst=0; instdev_addr,&nas_IMEI[0],8); - nas_TOOL_imei2iid(nas_IMEI, nasdev[inst]->dev_addr);// IMEI to device address (for stateless autoconfiguration address) - nas_TOOL_imei2iid(nas_IMEI, (uint8_t *)priv->cx[0].iid6); + nas_TOOL_imei2iid((uint8_t *)nas_IMEI, nasdev[inst]->dev_addr);// IMEI to device address (for stateless autoconfiguration address) + nas_TOOL_imei2iid((uint8_t *)nas_IMEI, (uint8_t *)priv->cx[0].iid6); // TO HAVE DIFFERENT HW @ ((unsigned char*)nasdev[inst]->dev_addr)[7] = ((unsigned char*)nasdev[inst]->dev_addr)[7] + (unsigned char)inst + 1; printk("Setting HW addr for INST %d to : %X%X\n",inst,*((unsigned int *)&nasdev[inst]->dev_addr[0]),*((unsigned int *)&nasdev[inst]->dev_addr[4])); @@ -532,12 +512,6 @@ void cleanup_module(void) if (pdcp_2_nas_irq!=-EBUSY) { pdcp_2_nas_irq=0; -#ifdef RTAI - // V1 - // rt_free_linux_irq(priv->irq, NULL); - // END V1 - rt_free_srq(pdcp_2_nas_irq); -#endif // Start IRQ linux // free_irq(priv->irq, NULL); // End IRQ linux diff --git a/openair2/NETWORK_DRIVER/MESH/ioctl.c b/openair2/NETWORK_DRIVER/MESH/ioctl.c old mode 100755 new mode 100644 index 89f63ece77..56dfb1cfe8 --- a/openair2/NETWORK_DRIVER/MESH/ioctl.c +++ b/openair2/NETWORK_DRIVER/MESH/ioctl.c @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "local.h" #include "ioctl.h" @@ -748,7 +739,6 @@ void nas_set_msg_imei_reply(struct nas_msg_l2id_reply *msgrep, //--------------------------------------------------------------------------- struct cx_entity *cx; int lcr=0; // Temp lcr->mt =0 - int i; cx=nas_COMMON_search_cx(lcr,priv); @@ -862,7 +852,7 @@ int nas_CTL_ioctl(struct net_device *dev, //--------------------------------------------------------------------------- void nas_CTL_send(struct sk_buff *skb, struct cx_entity *cx, - struct classifier_entity *gc) + struct classifier_entity *gc, int inst, struct nas_priv *gpriv) { //--------------------------------------------------------------------------- printk("NAS_CTL_SEND - void \n"); diff --git a/openair2/NETWORK_DRIVER/MESH/ioctl.h b/openair2/NETWORK_DRIVER/MESH/ioctl.h old mode 100755 new mode 100644 index d056bed076..ffa9b4e79b --- a/openair2/NETWORK_DRIVER/MESH/ioctl.h +++ b/openair2/NETWORK_DRIVER/MESH/ioctl.h @@ -1,13 +1,24 @@ -/*************************************************************************** - nas_iocontrol.h - description - ------------------- - copyright : (C) 2002 by Eurecom - email : michelle.wetterwald@eurecom.fr - yan.moret@eurecom.fr - knopp@eurecom.fr - *************************************************************************** +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - ***************************************************************************/ #ifndef NAS_CTL_H #define NAS_CTL_H diff --git a/openair2/NETWORK_DRIVER/MESH/local.h b/openair2/NETWORK_DRIVER/MESH/local.h old mode 100755 new mode 100644 index 1171eb3b5a..e23188d357 --- a/openair2/NETWORK_DRIVER/MESH/local.h +++ b/openair2/NETWORK_DRIVER/MESH/local.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** local.h - description ------------------- @@ -105,6 +98,26 @@ struct cx_entity { int provider_id[MAX_MEASURE_NB]; }; +//#define NAS_RETRY_LIMIT_DEFAULT 5 + +struct nas_priv { + int irq; + struct timer_list timer; + spinlock_t lock; + struct net_device_stats stats; + uint8_t retry_limit; + uint32_t timer_establishment; + uint32_t timer_release; + struct cx_entity cx[NAS_CX_MAX]; + struct classifier_entity *rclassifier[NAS_DSCP_MAX]; // receive classifier + uint16_t nrclassifier; + int sap[NAS_SAPI_MAX]; + struct sock *nl_sk; + uint8_t nlmsg[NAS_MAX_LENGTH+sizeof(struct nlmsghdr)]; + uint8_t xbuffer[NAS_MAX_LENGTH]; // transmition buffer + uint8_t rbuffer[NAS_MAX_LENGTH]; // reception buffer +}; + struct classifier_entity { uint32_t classref; @@ -129,29 +142,7 @@ struct classifier_entity { struct rb_entity *rb_rx; //pointer to rb_entity for receiving (in case of forwarding rule) nasRadioBearerId_t rab_id; // RAB identification for sending nasRadioBearerId_t rab_id_rx; // RAB identification for receiving (in case of forwarding rule) - void (*fct)(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc,int inst); -}; - - - -//#define NAS_RETRY_LIMIT_DEFAULT 5 - -struct nas_priv { - int irq; - struct timer_list timer; - spinlock_t lock; - struct net_device_stats stats; - uint8_t retry_limit; - uint32_t timer_establishment; - uint32_t timer_release; - struct cx_entity cx[NAS_CX_MAX]; - struct classifier_entity *rclassifier[NAS_DSCP_MAX]; // receive classifier - uint16_t nrclassifier; - int sap[NAS_SAPI_MAX]; - struct sock *nl_sk; - uint8_t nlmsg[NAS_MAX_LENGTH+sizeof(struct nlmsghdr)]; - uint8_t xbuffer[NAS_MAX_LENGTH]; // transmition buffer - uint8_t rbuffer[NAS_MAX_LENGTH]; // reception buffer + void (*fct)(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc,int inst, struct nas_priv *gpriv); }; struct ipversion { diff --git a/openair2/NETWORK_DRIVER/MESH/mesh.c b/openair2/NETWORK_DRIVER/MESH/mesh.c old mode 100755 new mode 100644 index 9f49a4b4cd..367e34cc4f --- a/openair2/NETWORK_DRIVER/MESH/mesh.c +++ b/openair2/NETWORK_DRIVER/MESH/mesh.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*************************************************************************** nas_mesh.c - description @@ -163,9 +155,10 @@ void nas_mesh_start_default_sclassifier(struct cx_entity *cx,struct rb_entity *r } //--------------------------------------------------------------------------- -void nas_mesh_timer(unsigned long data,struct nas_priv *gpriv) +void nas_mesh_timer(unsigned long data) { //--------------------------------------------------------------------------- + struct nas_priv *gpriv=(struct nas_priv *) data; uint8_t cxi; struct cx_entity *cx; struct rb_entity *rb; @@ -176,7 +169,7 @@ void nas_mesh_timer(unsigned long data,struct nas_priv *gpriv) (gpriv->timer).function=nas_mesh_timer; (gpriv->timer).expires=jiffies+NAS_TIMER_TICK; - (gpriv->timer).data=0L; + (gpriv->timer).data=data; return; @@ -389,11 +382,12 @@ int nas_mesh_DC_send_cx_release_request(struct cx_entity *cx, void nas_mesh_DC_send_sig_data_request(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc, + int inst, struct nas_priv *gpriv) { //--------------------------------------------------------------------------- struct nas_ue_dc_element *p; - char data_type = 'A'; + //char data_type = 'A'; int bytes_wrote=0; // Start debug information @@ -472,7 +466,7 @@ void nas_mesh_DC_send_peer_sig_data_request(struct cx_entity *cx, uint8_t sig_ca struct nas_ue_dc_element *p; uint8_t nas_data[10]; unsigned int nas_length; - char data_type = 'Z'; + //char data_type = 'Z'; int bytes_wrote=0; // Start debug information diff --git a/openair2/NETWORK_DRIVER/MESH/netlink.c b/openair2/NETWORK_DRIVER/MESH/netlink.c index e8fd851c23..9ac44453a9 100644 --- a/openair2/NETWORK_DRIVER/MESH/netlink.c +++ b/openair2/NETWORK_DRIVER/MESH/netlink.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file netlink.c * \brief establish a netlink @@ -58,7 +50,7 @@ static struct sock *nas_nl_sk = NULL; static int exit_netlink_thread=0; -static int nas_netlink_rx_thread(void *); +//static int nas_netlink_rx_thread(void *); #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) struct netlink_kernel_cfg oai_netlink_cfg; #endif @@ -84,7 +76,7 @@ static void nas_nl_data_ready (struct sk_buff *skb) //nasmesh_unlock(); struct nlmsghdr *nlh = NULL; - int j; + //int j; if (skb) { diff --git a/openair2/NETWORK_DRIVER/MESH/proto_extern.h b/openair2/NETWORK_DRIVER/MESH/proto_extern.h old mode 100755 new mode 100644 index ea46858445..844c5b41a4 --- a/openair2/NETWORK_DRIVER/MESH/proto_extern.h +++ b/openair2/NETWORK_DRIVER/MESH/proto_extern.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** nas_proto_extern.h - description ------------------- @@ -103,7 +96,7 @@ void nas_COMMON_receive(unsigned short dlen, */ void nas_COMMON_QOS_send(struct sk_buff *skb, struct cx_entity *cx, - struct classifier_entity *gc,int inst); + struct classifier_entity *gc,int inst, struct nas_priv *gpriv); /** \fn void nas_COMMON_del_send(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc,int inst) @@ -115,7 +108,7 @@ void nas_COMMON_QOS_send(struct sk_buff *skb, */ void nas_COMMON_del_send(struct sk_buff *skb, struct cx_entity *cx, - struct classifier_entity *gc,int inst); + struct classifier_entity *gc,int inst, struct nas_priv *gpriv); #ifndef PDCP_USE_NETLINK /** @@ -202,19 +195,18 @@ void nas_mesh_init(int inst //!< Instance ID ); -void nas_mesh_timer(unsigned long data, - struct nas_priv *gpriv); +void nas_mesh_timer(unsigned long data); int nas_mesh_DC_receive(struct cx_entity *cx,struct nas_priv *gpriv); int nas_mesh_GC_receive(struct nas_priv *gpriv); int nas_mesh_DC_send_cx_establish_request(struct cx_entity *cx,struct nas_priv *gpriv); int nas_mesh_DC_send_cx_release_request(struct cx_entity *cx,struct nas_priv *gpriv); -void nas_mesh_DC_send_sig_data_request(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc,struct nas_priv *gpriv); +void nas_mesh_DC_send_sig_data_request(struct sk_buff *skb, struct cx_entity *cx, struct classifier_entity *gc,int inst, struct nas_priv *gpriv); // iocontrol.c void nas_CTL_send(struct sk_buff *skb, struct cx_entity *cx, - struct classifier_entity *gc); + struct classifier_entity *gc,int inst, struct nas_priv *gpriv); //int nas_CTL_receive_authentication(struct ipv6hdr *iph, struct cx-entity *cx, unsigned char sapi); int nas_CTL_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); diff --git a/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h b/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h old mode 100755 new mode 100644 index a1787b1df7..193ce286cb --- a/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h +++ b/openair2/NETWORK_DRIVER/MESH/rrc_nas_primitives.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /********************************************************************* rrc_nas_primitives.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/sap.h b/openair2/NETWORK_DRIVER/MESH/sap.h old mode 100755 new mode 100644 index 4241744d86..60b8fa11fb --- a/openair2/NETWORK_DRIVER/MESH/sap.h +++ b/openair2/NETWORK_DRIVER/MESH/sap.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*************************************************************************** graal_sap.h - description ------------------- diff --git a/openair2/NETWORK_DRIVER/MESH/tool.c b/openair2/NETWORK_DRIVER/MESH/tool.c old mode 100755 new mode 100644 index 54acd68ba7..2e8e68a17c --- a/openair2/NETWORK_DRIVER/MESH/tool.c +++ b/openair2/NETWORK_DRIVER/MESH/tool.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "local.h" #include "proto_extern.h" diff --git a/openair2/NETWORK_DRIVER/UE_IP/COPYING b/openair2/NETWORK_DRIVER/UE_IP/COPYING deleted file mode 100755 index 94a9ed024d..0000000000 --- a/openair2/NETWORK_DRIVER/UE_IP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/NETWORK_DRIVER/UE_IP/Makefile b/openair2/NETWORK_DRIVER/UE_IP/Makefile deleted file mode 100755 index fbcf85fabb..0000000000 --- a/openair2/NETWORK_DRIVER/UE_IP/Makefile +++ /dev/null @@ -1,49 +0,0 @@ -# UE IP Driver makefile -# -NAS_UPDIR := $(shell /bin/pwd) - -KERNEL_ARCH=$(shell echo `uname -m`) -SET_X64=$(shell if [ $(KERNEL_ARCH) = 'x86_64' ]; then echo true ; fi) - -#################################################### -# EXTRA COMPILER FLAGS -#################################################### -EXTRA_CFLAGS = -I$(OPENAIR2_DIR)/COMMON -fno-common -fno-stack-protector -mpreferred-stack-boundary=4 $(if $(SET_X64),-DARCH_64,) $(if $(SET_X64),-mcmodel=kernel,) $(if $(SET_X64),-m64,) - - - -ifdef OAI_NW_DRIVER_USE_NETLINK -EXTRA_CFLAGS += -DOAI_NW_DRIVER_USE_NETLINK -else -EXTRA_CFLAGS += $(shell rtai-config --module-cflags) -DRTAI -D__IN_RTAI__ -Wall -endif - - -#################################################### -# LOADABLE MODULE GOALS -#################################################### -obj-m += ue_ip.o -ue_ip-objs += device.o -ue_ip-objs += common.o -ifdef OAI_NW_DRIVER_USE_NETLINK -ue_ip-objs += netlink.o -endif - -#################################################### -# REVOIR LE CLEAN -#################################################### - - -print: - @echo SET_X64 : $(SET_X64) - -clean: - rm -f *.ko - rm -f .*.ko.cmd - rm -f .*.o.cmd - rm -f *.o - rm -f *.mod.c - find . -name *.ko -delete - find . -name .*.o -delete - find . -name *.o -delete - find . -name *.mod.c -delete diff --git a/openair2/NETWORK_DRIVER/UE_IP/common.c b/openair2/NETWORK_DRIVER/UE_IP/common.c old mode 100755 new mode 100644 index 17ce737e6a..99712cc5d2 --- a/openair2/NETWORK_DRIVER/UE_IP/common.c +++ b/openair2/NETWORK_DRIVER/UE_IP/common.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file common.c * \brief @@ -107,7 +99,8 @@ ue_ip_common_class_wireless2ip( hard_header_len = ue_ip_dev[instP]->hard_header_len; skb_set_mac_header(skb_p, 0); - + skb_set_network_header(skb_p, hard_header_len); +skb_p->mark = rb_idP; //printk("[NAC_COMMIN_RECEIVE]: Packet Type %d (%d,%d)",skb_p->pkt_type,PACKET_HOST,PACKET_BROADCAST); skb_p->pkt_type = PACKET_HOST; @@ -130,9 +123,7 @@ ue_ip_common_class_wireless2ip( // LG TEST skb_p->ip_summed = CHECKSUM_NONE; skb_p->ip_summed = CHECKSUM_UNNECESSARY; - - - ipv_p = (struct ipversion*)((void*)&(skb_p->data[hard_header_len])); + ipv_p = (ipversion_t *)((void *)&(skb_p->data[hard_header_len])); switch (ipv_p->version) { diff --git a/openair2/NETWORK_DRIVER/UE_IP/constant.h b/openair2/NETWORK_DRIVER/UE_IP/constant.h old mode 100755 new mode 100644 index 0345d2dfad..faff970dcd --- a/openair2/NETWORK_DRIVER/UE_IP/constant.h +++ b/openair2/NETWORK_DRIVER/UE_IP/constant.h @@ -1,33 +1,25 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ +#include "openairinterface5g_limits.h" #ifndef _UE_IP_CST #define _UE_IP_CST @@ -60,7 +52,7 @@ -#define UE_IP_NB_INSTANCES_MAX 8 +#define UE_IP_NB_INSTANCES_MAX NUMBER_OF_UE_MAX #endif diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c old mode 100755 new mode 100644 index a0e32726d9..29db4ae07a --- a/openair2/NETWORK_DRIVER/UE_IP/device.c +++ b/openair2/NETWORK_DRIVER/UE_IP/device.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file device.c * \brief Networking Device Driver for OpenAirInterface @@ -36,13 +28,6 @@ */ /*******************************************************************************/ -#ifndef OAI_NW_DRIVER_USE_NETLINK -#ifdef RTAI -#include "rtai_posix.h" -#define RTAI_IRQ 30 //try to get this irq with RTAI -#endif // RTAI -#endif // OAI_NW_DRIVER_USE_NETLINK - #include "constant.h" #include "local.h" #include "proto_extern.h" @@ -251,7 +236,11 @@ int ue_ip_hard_start_xmit(struct sk_buff *skb_pP, struct net_device *dev_pP) // End debug information netif_stop_queue(dev_pP); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) + netif_trans_update(dev_pP); +#else dev_pP->trans_start = jiffies; +#endif #ifdef OAI_DRV_DEBUG_DEVICE printk("[UE_IP_DRV][%s] step 1\n", __FUNCTION__); #endif @@ -323,7 +312,11 @@ void ue_ip_tx_timeout(struct net_device *dev_pP) printk("[UE_IP_DRV][%s] begin\n", __FUNCTION__); // (ue_ip_priv_t *)(dev_pP->priv_p)->stats.tx_errors++; (priv_p->stats).tx_errors++; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) + netif_trans_update(dev_pP); +#else dev_pP->trans_start = jiffies; +#endif netif_wake_queue(dev_pP); printk("[UE_IP_DRV][%s] transmit timed out %s\n", __FUNCTION__,dev_pP->name); } diff --git a/openair2/NETWORK_DRIVER/UE_IP/local.h b/openair2/NETWORK_DRIVER/UE_IP/local.h old mode 100755 new mode 100644 index f00d26385d..ac3b040995 --- a/openair2/NETWORK_DRIVER/UE_IP/local.h +++ b/openair2/NETWORK_DRIVER/UE_IP/local.h @@ -1,31 +1,25 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************//*************************************************************************** +/*************************************************************************** local.h - description ------------------- copyright : (C) 2002 by Eurecom diff --git a/openair2/NETWORK_DRIVER/UE_IP/netlink.c b/openair2/NETWORK_DRIVER/UE_IP/netlink.c old mode 100755 new mode 100644 index 17870218c9..e8e36619d1 --- a/openair2/NETWORK_DRIVER/UE_IP/netlink.c +++ b/openair2/NETWORK_DRIVER/UE_IP/netlink.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file netlink.c * \brief establish a netlink * \author Navid Nikaein, Lionel Gauthier, Raymond knopp diff --git a/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h b/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h old mode 100755 new mode 100644 index 4eac01b680..b335b019c1 --- a/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h +++ b/openair2/NETWORK_DRIVER/UE_IP/proto_extern.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*************************************************************************** proto_extern.h - description diff --git a/openair2/NETWORK_DRIVER/UE_IP/sap.h b/openair2/NETWORK_DRIVER/UE_IP/sap.h old mode 100755 new mode 100644 index 086390cdc4..ad70386ed7 --- a/openair2/NETWORK_DRIVER/UE_IP/sap.h +++ b/openair2/NETWORK_DRIVER/UE_IP/sap.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef UE_IP_SAP_H #define UE_IP_SAP_H diff --git a/openair2/PHY_INTERFACE/COPYING b/openair2/PHY_INTERFACE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/PHY_INTERFACE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/PHY_INTERFACE/IF_Module.c b/openair2/PHY_INTERFACE/IF_Module.c new file mode 100644 index 0000000000..d0b8e57558 --- /dev/null +++ b/openair2/PHY_INTERFACE/IF_Module.c @@ -0,0 +1,647 @@ +#include "openair1/PHY/defs.h" +#include "openair2/PHY_INTERFACE/IF_Module.h" +#include "openair1/PHY/extern.h" +#include "LAYER2/MAC/extern.h" +#include "LAYER2/MAC/proto.h" +#include "common/ran_context.h" + +#define MAX_IF_MODULES 100 + +IF_Module_t *if_inst[MAX_IF_MODULES]; +Sched_Rsp_t Sched_INFO[MAX_IF_MODULES][MAX_NUM_CCs]; + +extern int oai_nfapi_harq_indication(nfapi_harq_indication_t *harq_ind); +extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind); +extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind); +extern int oai_nfapi_sr_indication(nfapi_sr_indication_t *ind); +extern int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind); +extern uint8_t nfapi_mode; +extern uint16_t sf_ahead; + +void handle_rach(UL_IND_t *UL_info) { + int i; + + if (UL_info->rach_ind.rach_indication_body.number_of_preambles>0) { + + AssertFatal(UL_info->rach_ind.rach_indication_body.number_of_preambles==1,"More than 1 preamble not supported\n"); + UL_info->rach_ind.rach_indication_body.number_of_preambles=0; + LOG_D(MAC,"UL_info[Frame %d, Subframe %d] Calling initiate_ra_proc RACH:SFN/SF:%d\n",UL_info->frame,UL_info->subframe, NFAPI_SFNSF2DEC(UL_info->rach_ind.sfn_sf)); + initiate_ra_proc(UL_info->module_id, + UL_info->CC_id, + NFAPI_SFNSF2SFN(UL_info->rach_ind.sfn_sf), + NFAPI_SFNSF2SF(UL_info->rach_ind.sfn_sf), + UL_info->rach_ind.rach_indication_body.preamble_list[0].preamble_rel8.preamble, + UL_info->rach_ind.rach_indication_body.preamble_list[0].preamble_rel8.timing_advance, + UL_info->rach_ind.rach_indication_body.preamble_list[0].preamble_rel8.rnti +#ifdef Rel14 + ,0 +#endif + ); + } + +#ifdef Rel14 + if (UL_info->rach_ind_br.rach_indication_body.number_of_preambles>0) { + + AssertFatal(UL_info->rach_ind_br.rach_indication_body.number_of_preambles<5,"More than 4 preambles not supported\n"); + for (i=0;irach_ind_br.rach_indication_body.number_of_preambles;i++) { + AssertFatal(UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel13.rach_resource_type>0, + "Got regular PRACH preamble, not BL/CE\n"); + LOG_D(MAC,"Frame %d, Subframe %d Calling initiate_ra_proc (CE_level %d)\n",UL_info->frame,UL_info->subframe, + UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel13.rach_resource_type-1); + initiate_ra_proc(UL_info->module_id, + UL_info->CC_id, + UL_info->frame, + UL_info->subframe, + UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel8.preamble, + UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel8.timing_advance, + UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel8.rnti, + UL_info->rach_ind_br.rach_indication_body.preamble_list[i].preamble_rel13.rach_resource_type); + } + UL_info->rach_ind_br.rach_indication_body.number_of_preambles=0; + } +#endif +} + +void handle_sr(UL_IND_t *UL_info) { + + int i; + + if (nfapi_mode == 1) // PNF + { + if (UL_info->sr_ind.sr_indication_body.number_of_srs>0) + { + oai_nfapi_sr_indication(&UL_info->sr_ind); + } + } + else + { + for (i=0;isr_ind.sr_indication_body.number_of_srs;i++) + SR_indication(UL_info->module_id, + UL_info->CC_id, + UL_info->frame, + UL_info->subframe, + UL_info->sr_ind.sr_indication_body.sr_pdu_list[i].rx_ue_information.rnti, + UL_info->sr_ind.sr_indication_body.sr_pdu_list[i].ul_cqi_information.ul_cqi); + } + + UL_info->sr_ind.sr_indication_body.number_of_srs=0; +} + +void handle_cqi(UL_IND_t *UL_info) { + + int i; + + if (nfapi_mode == 1) + { + if (UL_info->cqi_ind.number_of_cqis>0) + { + LOG_D(PHY,"UL_info->cqi_ind.number_of_cqis:%d\n", UL_info->cqi_ind.number_of_cqis); + nfapi_cqi_indication_t ind; + + ind.header.message_id = NFAPI_RX_CQI_INDICATION; + ind.sfn_sf = UL_info->frame<<4 | UL_info->subframe; + ind.cqi_indication_body = UL_info->cqi_ind; + + oai_nfapi_cqi_indication(&ind); + + UL_info->cqi_ind.number_of_cqis=0; + } + } + else + { + for (i=0;icqi_ind.number_of_cqis;i++) + cqi_indication(UL_info->module_id, + UL_info->CC_id, + UL_info->frame, + UL_info->subframe, + UL_info->cqi_ind.cqi_pdu_list[i].rx_ue_information.rnti, + &UL_info->cqi_ind.cqi_pdu_list[i].cqi_indication_rel9, + UL_info->cqi_ind.cqi_raw_pdu_list[i].pdu, + &UL_info->cqi_ind.cqi_pdu_list[i].ul_cqi_information); + + UL_info->cqi_ind.number_of_cqis=0; + } +} + +void handle_harq(UL_IND_t *UL_info) { + + int i; + + if (nfapi_mode == 1 && UL_info->harq_ind.harq_indication_body.number_of_harqs>0) // PNF + { + //LOG_D(PHY, "UL_info->harq_ind.harq_indication_body.number_of_harqs:%d Send to VNF\n", UL_info->harq_ind.harq_indication_body.number_of_harqs); + + int retval = oai_nfapi_harq_indication(&UL_info->harq_ind); + + if (retval!=0) + { + LOG_E(PHY, "Failed to encode NFAPI HARQ_IND retval:%d\n", retval); + } + + UL_info->harq_ind.harq_indication_body.number_of_harqs = 0; + } + else + { + for (i=0;iharq_ind.harq_indication_body.number_of_harqs;i++) + harq_indication(UL_info->module_id, + UL_info->CC_id, + NFAPI_SFNSF2SFN(UL_info->harq_ind.sfn_sf), + NFAPI_SFNSF2SF(UL_info->harq_ind.sfn_sf), + &UL_info->harq_ind.harq_indication_body.harq_pdu_list[i]); + + UL_info->harq_ind.harq_indication_body.number_of_harqs=0; + } +} + +void handle_ulsch(UL_IND_t *UL_info) { + + int i,j; + + if(nfapi_mode == 1) + { + if (UL_info->crc_ind.crc_indication_body.number_of_crcs>0) + { + //LOG_D(PHY,"UL_info->crc_ind.crc_indication_body.number_of_crcs:%d CRC_IND:SFN/SF:%d\n", UL_info->crc_ind.crc_indication_body.number_of_crcs, NFAPI_SFNSF2DEC(UL_info->crc_ind.sfn_sf)); + + oai_nfapi_crc_indication(&UL_info->crc_ind); + + UL_info->crc_ind.crc_indication_body.number_of_crcs = 0; + } + + if (UL_info->rx_ind.rx_indication_body.number_of_pdus>0) + { + //LOG_D(PHY,"UL_info->rx_ind.number_of_pdus:%d RX_IND:SFN/SF:%d\n", UL_info->rx_ind.rx_indication_body.number_of_pdus, NFAPI_SFNSF2DEC(UL_info->rx_ind.sfn_sf)); + oai_nfapi_rx_ind(&UL_info->rx_ind); + UL_info->rx_ind.rx_indication_body.number_of_pdus = 0; + } + } + else + { + if (UL_info->rx_ind.rx_indication_body.number_of_pdus>0 && UL_info->crc_ind.crc_indication_body.number_of_crcs>0) { + for (i=0;irx_ind.rx_indication_body.number_of_pdus;i++) { + for (j=0;jcrc_ind.crc_indication_body.number_of_crcs;j++) { + // find crc_indication j corresponding rx_indication i + LOG_D(PHY,"UL_info->crc_ind.crc_indication_body.crc_pdu_list[%d].rx_ue_information.rnti:%04x UL_info->rx_ind.rx_indication_body.rx_pdu_list[%d].rx_ue_information.rnti:%04x\n", j, UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].rx_ue_information.rnti, i, UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti); + if (UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].rx_ue_information.rnti == + UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti) { + LOG_D(PHY, "UL_info->crc_ind.crc_indication_body.crc_pdu_list[%d].crc_indication_rel8.crc_flag:%d\n", j, UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].crc_indication_rel8.crc_flag); + if (UL_info->crc_ind.crc_indication_body.crc_pdu_list[j].crc_indication_rel8.crc_flag == 1) { // CRC error indication + LOG_D(MAC,"Frame %d, Subframe %d Calling rx_sdu (CRC error) \n",UL_info->frame,UL_info->subframe); + rx_sdu(UL_info->module_id, + UL_info->CC_id, + NFAPI_SFNSF2SFN(UL_info->rx_ind.sfn_sf), //UL_info->frame, + NFAPI_SFNSF2SF(UL_info->rx_ind.sfn_sf), //UL_info->subframe, + UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti, + (uint8_t *)NULL, + UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.length, + UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.timing_advance, + UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.ul_cqi); + } + else { + LOG_D(MAC,"Frame %d, Subframe %d Calling rx_sdu (CRC ok) \n",UL_info->frame,UL_info->subframe); + rx_sdu(UL_info->module_id, + UL_info->CC_id, + NFAPI_SFNSF2SFN(UL_info->rx_ind.sfn_sf), //UL_info->frame, + NFAPI_SFNSF2SF(UL_info->rx_ind.sfn_sf), //UL_info->subframe, + UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_ue_information.rnti, + UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].data, + UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.length, + UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.timing_advance, + UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.ul_cqi); + } + break; + } //if (UL_info->crc_ind.crc_pdu_list[j].rx_ue_information.rnti == + // UL_info->rx_ind.rx_pdu_list[i].rx_ue_information.rnti) + } // for (j=0;jcrc_ind.crc_indication_body.number_of_crcs;j++) + } // for (i=0;irx_ind.number_of_pdus;i++) + UL_info->crc_ind.crc_indication_body.number_of_crcs=0; + UL_info->rx_ind.rx_indication_body.number_of_pdus = 0; + } // UL_info->rx_ind.rx_indication_body.number_of_pdus>0 && UL_info->subframe && UL_info->crc_ind.crc_indication_body.number_of_crcs>0 + else if (UL_info->rx_ind.rx_indication_body.number_of_pdus!=0 || UL_info->crc_ind.crc_indication_body.number_of_crcs!=0) { + LOG_E(PHY,"hoping not to have mis-match between CRC ind and RX ind - hopefully the missing message is coming shortly rx_ind:%d(SFN/SF:%05d) crc_ind:%d(SFN/SF:%05d) UL_info(SFN/SF):%04d%d\n", + UL_info->rx_ind.rx_indication_body.number_of_pdus, NFAPI_SFNSF2DEC(UL_info->rx_ind.sfn_sf), + UL_info->crc_ind.crc_indication_body.number_of_crcs, NFAPI_SFNSF2DEC(UL_info->crc_ind.sfn_sf), + UL_info->frame, UL_info->subframe); + } + } +} + +/****************************************************************************/ +/* debug utility functions begin */ +/****************************************************************************/ + +//#define DUMP_FAPI + +#ifdef DUMP_FAPI + +#define C do { size = 0; put(0); } while (0) +#define A(...) do { char t[4096]; sprintf(t, __VA_ARGS__); append_string(t); } while (0) + +#if 0 + +/* eats lots of ms at startup, disrupts realtime */ +static char *s; +static int size; +static int maxsize; + +static void put(char x) +{ + if (size == maxsize) { + maxsize += 32768; + s = realloc(s, maxsize); if (s == NULL) abort(); + } + s[size++] = x; +} + +#else + +/* eats nothing at startup, but fixed size */ +#define SMAX 65536 +static char s[SMAX]; +static int size; +static int maxsize = SMAX; + +static void put(char x) +{ + if (size == maxsize) { printf("incrase SMAX\n"); exit(1); } + s[size++] = x; +} + +#endif + +static void append_string(char *t) +{ + size--; + while (*t) put(*t++); + put(0); +} + +static void dump_ul(UL_IND_t *u) +{ + int i; + + C; + A("XXXX UL mod %d CC %d f.sf %d.%d\n", + u->module_id, u->CC_id, u->frame, u->subframe); + + A("XXXX harq_ind %d\n", u->harq_ind.harq_indication_body.number_of_harqs); + for (i = 0; i < u->harq_ind.harq_indication_body.number_of_harqs; i++) { + nfapi_harq_indication_pdu_t *v = &u->harq_ind.harq_indication_body.harq_pdu_list[i]; + A("XXXX harq ind %d\n", i); + A("XXXX rnti %d\n", v->rx_ue_information.rnti); + A("XXXX tb1 %d tb2 %d\n", v->harq_indication_fdd_rel8.harq_tb1, + v->harq_indication_fdd_rel8.harq_tb2); + A("XXXX number_of_ack_nack %d\n", + v->harq_indication_fdd_rel9.number_of_ack_nack); + A("XXXX harq[0] = %d\n", + v->harq_indication_fdd_rel9.harq_tb_n[0]); + A("XXXX harq ul_cqi %d channel %d\n", v->ul_cqi_information.ul_cqi, + v->ul_cqi_information.channel); + } + + A("XXXX crc_ind %d\n", u->crc_ind.crc_indication_body.number_of_crcs); + + A("XXXX sr_ind %d\n", u->sr_ind.sr_indication_body.number_of_srs); + + A("XXXX cqi_ind %d\n", u->cqi_ind.number_of_cqis); + for (i = 0; i < u->cqi_ind.number_of_cqis; i++) { + nfapi_cqi_indication_pdu_t *v = &u->cqi_ind.cqi_pdu_list[i]; + A("XXXX cqi ind %d\n", i); + A("XXXX cqi ul_cqi %d channel %d\n", v->ul_cqi_information.ul_cqi, + v->ul_cqi_information.channel); + } + + A("XXXX rach_ind %d\n", u->rach_ind.rach_indication_body.number_of_preambles); + + A("XXXX rx_ind %d\n", u->rx_ind.rx_indication_body.number_of_pdus); + for (i = 0; i < u->rx_ind.rx_indication_body.number_of_pdus; i++) { + nfapi_rx_indication_pdu_t *v = &u->rx_ind.rx_indication_body.rx_pdu_list[i]; + A("XXXX rx ind %d\n", i); + A("XXXX timing_advance %d\n", + v->rx_indication_rel8.timing_advance); + A("XXXX rx ul_cqi %d\n", v->rx_indication_rel8.ul_cqi); + } + + LOG_I(PHY, "XXXX UL\nXXXX UL\n%s", s); +} + +static char *DL_PDU_TYPE(int x) +{ + switch (x) { + case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: return "NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE"; + case NFAPI_DL_CONFIG_BCH_PDU_TYPE: return "NFAPI_DL_CONFIG_BCH_PDU_TYPE"; + case NFAPI_DL_CONFIG_MCH_PDU_TYPE: return "NFAPI_DL_CONFIG_MCH_PDU_TYPE"; + case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: return "NFAPI_DL_CONFIG_DLSCH_PDU_TYPE"; + case NFAPI_DL_CONFIG_PCH_PDU_TYPE: return "NFAPI_DL_CONFIG_PCH_PDU_TYPE"; + case NFAPI_DL_CONFIG_PRS_PDU_TYPE: return "NFAPI_DL_CONFIG_PRS_PDU_TYPE"; + case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: return "NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE"; + case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: return "NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE"; + case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: return "NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE"; + case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: return "NFAPI_DL_CONFIG_NBCH_PDU_TYPE"; + case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: return "NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE"; + case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: return "NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE"; + } + return "UNKNOWN"; +} + +static char *UL_PDU_TYPE(int x) +{ + switch (x) { + case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_PDU_TYPE"; + case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE"; + case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE"; + case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE"; + case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE"; + case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE"; + case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE"; + case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE"; + case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE"; + case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE"; + case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE"; + case NFAPI_UL_CONFIG_SRS_PDU_TYPE: return "NFAPI_UL_CONFIG_SRS_PDU_TYPE"; + case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: return "NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE"; + case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE"; + case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE"; + case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: return "NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE"; + case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: return "NFAPI_UL_CONFIG_NULSCH_PDU_TYPE"; + case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: return "NFAPI_UL_CONFIG_NRACH_PDU_TYPE"; + } + return "UNKNOWN"; +} + +static char *HI_DCI0_PDU_TYPE(int x) +{ + switch (x) { + case NFAPI_HI_DCI0_HI_PDU_TYPE: return "NFAPI_HI_DCI0_HI_PDU_TYPE"; + case NFAPI_HI_DCI0_DCI_PDU_TYPE: return "NFAPI_HI_DCI0_DCI_PDU_TYPE"; + case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: return "NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE"; + case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: return "NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE"; + case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: return "NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE"; + } + return "UNKNOWN"; +} + +static void dump_dl(Sched_Rsp_t *d) +{ + int i; + + C; + A("XXXX DL mod %d CC %d f.sf %d.%d\n", + d->module_id, d->CC_id, d->frame, d->subframe); + + if (d->DL_req != NULL) { + nfapi_dl_config_request_body_t *v=&d->DL_req->dl_config_request_body; + nfapi_dl_config_request_pdu_t *p = v->dl_config_pdu_list; + A("XXXX DL_req sfnsf %d\n", d->DL_req->sfn_sf); + A("XXXX PDCCH size %d\n", v->number_pdcch_ofdm_symbols); + A("XXXX DCIs %d\n", v->number_dci); + A("XXXX PDUs %d\n", v->number_pdu); + A("XXXX rntis %d\n", v->number_pdsch_rnti); + A("XXXX pcfich power %d\n", v->transmission_power_pcfich); + for (i = 0; i < v->number_pdu; i++) { + A("XXXX pdu %d\n", i); + A("XXXX type %d %s\n", p[i].pdu_type, DL_PDU_TYPE(p[i].pdu_type)); + switch (p[i].pdu_type) { + case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: { + nfapi_dl_config_dci_dl_pdu_rel8_t *q = + &p[i].dci_dl_pdu.dci_dl_pdu_rel8; + A("XXXX dci format %d\n", q->dci_format); + A("XXXX cce idx %d\n", q->cce_idx); + A("XXXX agg lvl %d\n", q->aggregation_level); + A("XXXX rnti %d\n", q->rnti); + A("XXXX rb coding %8.8x\n", q->resource_block_coding); + A("XXXX mcs_1 %d\n", q->mcs_1); + A("XXXX rv_1 %d\n", q->redundancy_version_1); + A("XXXX ndi_1 %d\n", q->new_data_indicator_1); + A("XXXX harq pid %d\n", q->harq_process); + A("XXXX tpc %d\n", q->tpc); + A("XXXX tbs idx %d\n", q->transport_block_size_index); + A("XXXX dl pow off %d\n", q->downlink_power_offset); + A("XXXX rnti type %d\n", q->rnti_type); + A("XXXX xmit pow %d\n", q->transmission_power); + break; + } + case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: { + nfapi_dl_config_dlsch_pdu_rel8_t *q = + &p[i].dlsch_pdu.dlsch_pdu_rel8; + A("XXXX pdu_index %d\n", q->pdu_index); + A("XXXX rnti %d\n", q->rnti); + A("XXXX rv %d\n", q->redundancy_version); + A("XXXX mcs %d\n", q->modulation); + A("XXXX pa %d\n", q->pa); + break; + }} + } + } + + if (d->HI_DCI0_req != NULL) { + nfapi_hi_dci0_request_body_t *v=&d->HI_DCI0_req->hi_dci0_request_body; + A("XXXX up HI_DCI0_req sfnsf %d (%d.%d)\n", d->HI_DCI0_req->sfn_sf, + d->HI_DCI0_req->sfn_sf/16, d->HI_DCI0_req->sfn_sf%16); + A("XXXX up sfnsf %d\n", v->sfnsf); + A("XXXX up DCIs %d\n", v->number_of_dci); + A("XXXX up HIs %d\n", v->number_of_hi); + for (i = 0; i < v->number_of_dci + v->number_of_hi; i++) { + nfapi_hi_dci0_request_pdu_t *p = &v->hi_dci0_pdu_list[i]; + A("XXXX up pdu %d\n", i); + A("XXXX up type %d %s\n",p->pdu_type,HI_DCI0_PDU_TYPE(p->pdu_type)); + if (p->pdu_type == NFAPI_HI_DCI0_DCI_PDU_TYPE) { + nfapi_hi_dci0_dci_pdu_rel8_t *q = &p->dci_pdu.dci_pdu_rel8; + A("XXXX up dci_format %d\n", q->dci_format); + A("XXXX up cce_index %d\n", q->cce_index); + A("XXXX up aggregation_level %d\n", q->aggregation_level); + A("XXXX up rnti %d\n", q->rnti); + A("XXXX up rb start %d\n", q->resource_block_start); + A("XXXX up # rb %d\n", q->number_of_resource_block); + A("XXXX up mcs_1 %d\n", q->mcs_1); + A("XXXX up cshift_2_for_drms %d\n", q->cyclic_shift_2_for_drms); + A("XXXX up freq hop enabled %d\n", q->frequency_hopping_enabled_flag); + A("XXXX up fre hop bits %d\n", q->frequency_hopping_bits); + A("XXXX up NDI_1 %d\n", q->new_data_indication_1); + A("XXXX up tx_antenna_seleciton %d\n", q->ue_tx_antenna_seleciton); + A("XXXX up tpc %d\n", q->tpc); + A("XXXX up cqi_csi_request %d\n", q->cqi_csi_request); + A("XXXX up ul_index %d\n", q->ul_index); + A("XXXX up dl_assignment_index %d\n", q->dl_assignment_index); + A("XXXX up tpc_bitmap %d\n", q->tpc_bitmap); + A("XXXX up transmission_power %d\n", q->transmission_power); + } + if (p->pdu_type == NFAPI_HI_DCI0_HI_PDU_TYPE) { + nfapi_hi_dci0_hi_pdu_rel8_t *q = &p->hi_pdu.hi_pdu_rel8; + A("XXXX up rb start %d\n", q->resource_block_start); + A("XXXX up cs2_drms %d\n", q->cyclic_shift_2_for_drms); + A("XXXX up ack %d\n", q->hi_value); + A("XXXX up i_phich %d\n", q->i_phich); + A("XXXX up power %d\n", q->transmission_power); + } + } + } + + if (d->UL_req != NULL) { + nfapi_ul_config_request_body_t *v=&d->UL_req->ul_config_request_body; + A("XXXX UL_req sfnsf %d (%d.%d)\n", d->UL_req->sfn_sf, + d->UL_req->sfn_sf/16, d->UL_req->sfn_sf%16); + A("XXXX PDUs %d\n", v->number_of_pdus); + A("XXXX ra freq %d\n", v->rach_prach_frequency_resources); + A("XXXX srs? %d\n", v->srs_present); + for (i = 0; i < v->number_of_pdus; i++) { + nfapi_ul_config_request_pdu_t *p = &v->ul_config_pdu_list[i]; + A("XXXX pdu %d\n", i); + A("XXXX type %d %s\n", p->pdu_type, UL_PDU_TYPE(p->pdu_type)); + switch(p->pdu_type) { + case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: { + nfapi_ul_config_uci_harq_pdu *q = &p->uci_harq_pdu; + nfapi_ul_config_harq_information_rel9_fdd_t *h = + &q->harq_information.harq_information_rel9_fdd; + A("XXXX rnti %d\n", + q->ue_information.ue_information_rel8.rnti); + A("XXXX harq size %d\n", h->harq_size); + A("XXXX ack_nack_mode %d\n", h->ack_nack_mode); + A("XXXX # pucch res %d\n", h->number_of_pucch_resources); + A("XXXX n_pucch_1_0 %d\n", h->n_pucch_1_0); + A("XXXX n_pucch_1_1 %d\n", h->n_pucch_1_1); + A("XXXX n_pucch_1_2 %d\n", h->n_pucch_1_2); + A("XXXX n_pucch_1_3 %d\n", h->n_pucch_1_3); + break; + } + case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: { + nfapi_ul_config_uci_sr_pdu *q = &p->uci_sr_pdu; + nfapi_ul_config_sr_information_rel8_t *h = + &q->sr_information.sr_information_rel8; + A("XXXX rnti %d\n", + q->ue_information.ue_information_rel8.rnti); + A("XXXX pucch_index %d\n", h->pucch_index); + }} + } + } + + LOG_I(PHY, "XXXX DL\nXXXX DL\n%s", s); +} + +#undef C +#undef A + +#endif /* DUMP_FAPI */ + +/****************************************************************************/ +/* debug utility functions end */ +/****************************************************************************/ + +void UL_indication(UL_IND_t *UL_info) +{ + + AssertFatal(UL_info!=NULL,"UL_INFO is null\n"); + +#ifdef DUMP_FAPI + dump_ul(UL_info); +#endif + + module_id_t module_id = UL_info->module_id; + int CC_id = UL_info->CC_id; + Sched_Rsp_t *sched_info = &Sched_INFO[module_id][CC_id]; + IF_Module_t *ifi = if_inst[module_id]; + eNB_MAC_INST *mac = RC.mac[module_id]; + + LOG_D(PHY,"SFN/SF:%d%d module_id:%d CC_id:%d UL_info[rx_ind:%d harqs:%d crcs:%d cqis:%d preambles:%d sr_ind:%d]\n", + UL_info->frame,UL_info->subframe, + module_id,CC_id, + UL_info->rx_ind.rx_indication_body.number_of_pdus, UL_info->harq_ind.harq_indication_body.number_of_harqs, UL_info->crc_ind.crc_indication_body.number_of_crcs, UL_info->cqi_ind.number_of_cqis, UL_info->rach_ind.rach_indication_body.number_of_preambles, UL_info->sr_ind.sr_indication_body.number_of_srs); + + if (nfapi_mode != 1) + { + if (ifi->CC_mask==0) { + ifi->current_frame = UL_info->frame; + ifi->current_subframe = UL_info->subframe; + } + else { + AssertFatal(UL_info->frame != ifi->current_frame,"CC_mask %x is not full and frame has changed\n",ifi->CC_mask); + AssertFatal(UL_info->subframe != ifi->current_subframe,"CC_mask %x is not full and subframe has changed\n",ifi->CC_mask); + } + ifi->CC_mask |= (1<frame,UL_info->subframe); + + handle_rach(UL_info); + + handle_sr(UL_info); + + handle_cqi(UL_info); + + handle_harq(UL_info); + + // clear HI prior to handling ULSCH + mac->HI_DCI0_req[CC_id].hi_dci0_request_body.number_of_hi = 0; + + handle_ulsch(UL_info); + + if (nfapi_mode != 1) + { + if (ifi->CC_mask == ((1<frame+((UL_info->subframe>(9-sf_ahead))?1:0)) % 1024, + (UL_info->subframe+sf_ahead)%10); + + ifi->CC_mask = 0; + + sched_info->module_id = module_id; + sched_info->CC_id = CC_id; + sched_info->frame = (UL_info->frame + ((UL_info->subframe>(9-sf_ahead)) ? 1 : 0)) % 1024; + sched_info->subframe = (UL_info->subframe+sf_ahead)%10; + sched_info->DL_req = &mac->DL_req[CC_id]; + sched_info->HI_DCI0_req = &mac->HI_DCI0_req[CC_id]; + if ((mac->common_channels[CC_id].tdd_Config==NULL) || + (is_UL_sf(&mac->common_channels[CC_id],(sched_info->subframe+sf_ahead)%10)>0)) + sched_info->UL_req = &mac->UL_req[CC_id]; + else + sched_info->UL_req = NULL; + + sched_info->TX_req = &mac->TX_req[CC_id]; + +#ifdef DUMP_FAPI + dump_dl(sched_info); +#endif + + if (ifi->schedule_response) + { + AssertFatal(ifi->schedule_response!=NULL, + "schedule_response is null (mod %d, cc %d)\n", + module_id, + CC_id); + ifi->schedule_response(sched_info); + } + + LOG_D(PHY,"Schedule_response: SFN_SF:%d%d dl_pdus:%d\n",sched_info->frame,sched_info->subframe,sched_info->DL_req->dl_config_request_body.number_pdu); + } + } +} + +IF_Module_t *IF_Module_init(int Mod_id){ + + AssertFatal(Mod_id %d\n",Mod_id,MAX_IF_MODULES); + + LOG_D(PHY,"Installing callbacks for IF_Module - UL_indication\n"); + + if (if_inst[Mod_id]==NULL) { + if_inst[Mod_id] = (IF_Module_t*)malloc(sizeof(IF_Module_t)); + memset((void*)if_inst[Mod_id],0,sizeof(IF_Module_t)); + + if_inst[Mod_id]->CC_mask=0; + if_inst[Mod_id]->UL_indication = UL_indication; + + AssertFatal(pthread_mutex_init(&if_inst[Mod_id]->if_mutex,NULL)==0, + "allocation of if_inst[%d]->if_mutex fails\n",Mod_id); + } + return if_inst[Mod_id]; +} + +void IF_Module_kill(int Mod_id) { + + AssertFatal(Mod_id>MAX_MODULES,"Asking for Module %d > %d\n",Mod_id,MAX_IF_MODULES); + if (if_inst[Mod_id]!=NULL) free(if_inst[Mod_id]); + +} diff --git a/openair2/PHY_INTERFACE/IF_Module.h b/openair2/PHY_INTERFACE/IF_Module.h new file mode 100644 index 0000000000..7baae6c3b6 --- /dev/null +++ b/openair2/PHY_INTERFACE/IF_Module.h @@ -0,0 +1,142 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.0 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file openair2/PHY_INTERFACE/IF_Module.h +* \brief data structures for PHY/MAC interface modules +* \author EURECOM/NTUST +* \date 2017 +* \version 0.1 +* \company Eurecom +* \email: raymond.knopp@eurecom.fr +* \note +* \warning +*/ +#ifndef __IF_MODULE__H__ +#define __IF_MODULE__H__ + + +#include +#include "openair1/PHY/LTE_TRANSPORT/defs.h" +#include "nfapi_interface.h" + + +#define MAX_NUM_DL_PDU 100 +#define MAX_NUM_UL_PDU 100 +#define MAX_NUM_HI_DCI0_PDU 100 +#define MAX_NUM_TX_REQUEST_PDU 100 + +#define MAX_NUM_HARQ_IND 100 +#define MAX_NUM_CRC_IND 100 +#define MAX_NUM_SR_IND 100 +#define MAX_NUM_CQI_IND 100 +#define MAX_NUM_RACH_IND 100 +#define MAX_NUM_SRS_IND 100 + +typedef struct{ + /// Module ID + module_id_t module_id; + /// CC ID + int CC_id; + /// frame + frame_t frame; + /// subframe + sub_frame_t subframe; + + /// harq indication list + nfapi_harq_indication_t harq_ind; + + /// crc indication list + nfapi_crc_indication_t crc_ind; + + /// SR indication list + nfapi_sr_indication_t sr_ind; + + /// CQI indication list + nfapi_cqi_indication_body_t cqi_ind; + + /// RACH indication list + nfapi_rach_indication_t rach_ind; + +#ifdef Rel14 + /// RACH indication list for BR UEs + nfapi_rach_indication_t rach_ind_br; +#endif + + /// SRS indication list + nfapi_srs_indication_body_t srs_ind; + + /// RX indication + nfapi_rx_indication_t rx_ind; + +} UL_IND_t; + +// Downlink subframe P7 + + +typedef struct{ + /// Module ID + module_id_t module_id; + /// CC ID + uint8_t CC_id; + /// frame + frame_t frame; + /// subframe + sub_frame_t subframe; + /// nFAPI DL Config Request + nfapi_dl_config_request_t *DL_req; + /// nFAPI UL Config Request + nfapi_ul_config_request_t *UL_req; + /// nFAPI HI_DCI Request + nfapi_hi_dci0_request_t *HI_DCI0_req; + /// Pointers to DL SDUs + nfapi_tx_request_t *TX_req; +}Sched_Rsp_t; + +typedef struct { + uint8_t Mod_id; + int CC_id; + nfapi_config_request_t *cfg; +}PHY_Config_t; + +typedef struct IF_Module_s{ +//define the function pointer + void (*UL_indication)(UL_IND_t *UL_INFO); + void (*schedule_response)(Sched_Rsp_t *Sched_INFO); + void (*PHY_config_req)(PHY_Config_t* config_INFO); + uint32_t CC_mask; + uint16_t current_frame; + uint8_t current_subframe; + pthread_mutex_t if_mutex; +}IF_Module_t; + +/*Initial */ +IF_Module_t *IF_Module_init(int Mod_id); +void IF_Module_kill(int Mod_id); + +/*Interface for uplink, transmitting the Preamble(list), ULSCH SDU, NAK, Tick (trigger scheduler) + */ +void UL_indication(UL_IND_t *UL_INFO); + +/*Interface for Downlink, transmitting the DLSCH SDU, DCI SDU*/ +void Schedule_Response(Sched_Rsp_t *Sched_INFO); + +#endif + diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h old mode 100755 new mode 100644 index a85c2b15f2..deb07443f1 --- a/openair2/PHY_INTERFACE/defs.h +++ b/openair2/PHY_INTERFACE/defs.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file PHY_INTERFACE/defs.h * \brief mac phy interface primitives @@ -60,6 +52,7 @@ do { * @{ */ /*! \brief MACPHY Interface */ +/* typedef struct { /// Pointer function that initializes L2 int (*macphy_init)(int eMBMS_active, char *uecap_xer, uint8_t CBA_active,uint8_t HO_active); @@ -80,6 +73,16 @@ typedef struct { /// cancel an ongoing RA procedure void (*cancel_ra_proc)(module_id_t Mod_id,int CC_id,frame_t frameP,uint16_t preamble); + /// Inform MAC layer that an uplink is scheduled for Msg3 in given subframe. + /// This is used so that the MAC scheduler marks as busy the RBs used by the Msg3. + void (*set_msg3_subframe)(module_id_t Mod_id, + int CC_id, + int frame, + int subframe, + int rnti, + int Msg3_frame, + int Msg3_subframe); + /// Get DCI for current subframe from MAC DCI_PDU* (*get_dci_sdu)(module_id_t Mod_id,int CC_id,frame_t frameP,sub_frame_t subframe); @@ -96,6 +99,18 @@ typedef struct { void (*SR_indication)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,sub_frame_t subframe); /// Indicate UL Failure to eNodeB MAC void (*UL_failure_indication)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,sub_frame_t subframe); + + /// Configure Common PHY parameters from SIB1 + void (*phy_config_mib_eNB)(module_id_t Mod_id,int CC_id, + int eutra_band, + int N_RB_DL, + PHICH_Config_t *phich_Config, + int Nid_cell, + int Ncp, + int p_eNB, + uint32_t dl_CarrierFreq, + uint32_t ul_CarrierFreq); + /// Configure Common PHY parameters from SIB1 void (*phy_config_sib1_eNB)(module_id_t Mod_id,int CC_id, TDD_Config_t *tdd_config, @@ -110,7 +125,7 @@ typedef struct { AdditionalSpectrumEmission_t *additionalSpectrumEmission, struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) /// Configure Common PHY parameters from SIB13 void (*phy_config_sib13_eNB)(module_id_t Mod_id,int CC_id, int mbsfn_Area_idx, long mbsfn_AreaId_r9); @@ -125,7 +140,7 @@ typedef struct { void (*phy_config_dedicated_eNB)(module_id_t Mod_id,int CC_id,rnti_t rnti, struct PhysicalConfigDedicated *physicalConfigDedicated); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) /// Get MCH sdu and corresponding MCS for particular MBSFN subframe MCH_PDU* (*get_mch_sdu)(module_id_t Mod_id, int CC_id, frame_t frameP,sub_frame_t subframe); #endif @@ -146,10 +161,13 @@ typedef struct { /// Send a received SI sdu void (*ue_decode_si)(module_id_t Mod_id,int CC_id,frame_t frameP, uint8_t CH_index, void *pdu, uint16_t len); - /// Send a received DLSCH sdu to MAC - void (*ue_send_sdu)(module_id_t Mod_id,uint8_t CC_id,frame_t frameP,uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index); + /// Send a received Paging sdu + void (*ue_decode_p)(module_id_t Mod_id,int CC_id,frame_t frameP, uint8_t CH_index, void *pdu, uint16_t len); -#ifdef Rel10 + /// Send a received DLSCH sdu to MAC + void (*ue_send_sdu)(module_id_t Mod_id,uint8_t CC_id,frame_t frameP,sub_frame_t subframe,uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index); + +#if defined(Rel10) || defined(Rel14) /// Send a received MCH sdu to MAC void (*ue_send_mch_sdu)(module_id_t Mod_id,uint8_t CC_id, frame_t frameP,uint8_t *sdu,uint16_t sdu_len,uint8_t eNB_index,uint8_t sync_area); @@ -165,7 +183,7 @@ typedef struct { PRACH_RESOURCES_t* (*ue_get_rach)(module_id_t Mod_id,int CC_id,frame_t frameP,uint8_t Msg3_flag,sub_frame_t subframe); /// Process Random-Access Response - uint16_t (*ue_process_rar)(module_id_t Mod_id,int CC_id,frame_t frameP,uint8_t *dlsch_buffer,uint16_t *t_crnti,uint8_t preamble_index); + uint16_t (*ue_process_rar)(module_id_t Mod_id,int CC_id,frame_t frameP, uint16_t ra_rnti, uint8_t *dlsch_buffer, uint16_t *t_crnti,uint8_t preamble_index, uint8_t* selected_rar_buffer); /// Get SR payload (0,1) from UE MAC uint32_t (*ue_get_SR)(module_id_t Mod_id,int CC_id,frame_t frameP,uint8_t eNB_id,rnti_t rnti,sub_frame_t subframe); @@ -174,12 +192,15 @@ typedef struct { void (*dl_phy_sync_success) (module_id_t Mod_id,frame_t frameP, uint8_t CH_index,uint8_t first_sync); /// Only calls the PDCP for now - UE_L2_STATE_t (*ue_scheduler)(module_id_t Mod_id, frame_t frameP,sub_frame_t subframe, lte_subframe_t direction, uint8_t eNB_id, int CC_id); + UE_L2_STATE_t (*ue_scheduler)(module_id_t Mod_id, frame_t rxFrameP,sub_frame_t rxSubframe, frame_t txFrameP,sub_frame_t txSubframe, lte_subframe_t direction, uint8_t eNB_id, int CC_id); /// PHY-Config-Dedicated UE void (*phy_config_dedicated_ue)(module_id_t Mod_id,int CC_id,uint8_t CH_index, struct PhysicalConfigDedicated *physicalConfigDedicated); + /// PHY-Config-harq UE + void (*phy_config_harq_ue)(module_id_t Mod_id,int CC_id,uint8_t CH_index, + uint16_t max_harq_tx); /// Configure Common PHY parameters from SIB1 void (*phy_config_sib1_ue)(module_id_t Mod_id,int CC_id,uint8_t CH_index, TDD_Config_t *tdd_config, @@ -194,7 +215,7 @@ typedef struct { AdditionalSpectrumEmission_t *additionalSpectrumEmission, struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) /// Configure Common PHY parameters from SIB13 void (*phy_config_sib13_ue)(uint8_t Mod_id,int CC_id, uint8_t eNB_index,int mbsfn_Area_idx, long mbsfn_AreaId_r9); @@ -332,7 +353,7 @@ typedef struct { unsigned char cluster_head_index; /// PHY Frame Configuration - LTE_DL_FRAME_PARMS *lte_frame_parms; + LTE_DL_FRAME_PARMS *frame_parms; uint8_t (*get_prach_prb_offset)(LTE_DL_FRAME_PARMS *frame_parms, uint8_t tdd_mapindex, uint16_t Nf); @@ -344,6 +365,7 @@ typedef struct { } MAC_xface; +*/ #endif diff --git a/openair2/PHY_INTERFACE/extern.h b/openair2/PHY_INTERFACE/extern.h index b1700b7697..b87fa42fe4 100644 --- a/openair2/PHY_INTERFACE/extern.h +++ b/openair2/PHY_INTERFACE/extern.h @@ -1,51 +1,27 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __PHY_INTERFACE_EXTERN_H__ #define __PHY_INTERFACE_EXTERN_H__ -//#include "SIMULATION/PHY_EMULATION/spec_defs.h" -#ifdef PHY_EMUL -#include "SIMULATION/PHY_EMULATION/DEVICE_DRIVER/defs.h" -#include "SIMULATION/PHY_EMULATION/DEVICE_DRIVER/extern.h" -#endif //PHY_EMUL - -#include "defs.h" - - -extern unsigned int mac_debug; -#ifdef PHYSIM -extern MAC_xface *mac_xface; -#endif -//extern MACPHY_PARAMS MACPHY_params; - -extern unsigned int mac_registered; #endif diff --git a/openair2/PHY_INTERFACE/mac_phy_primitives.c b/openair2/PHY_INTERFACE/mac_phy_primitives.c index 52b4a1b039..06e06d096d 100644 --- a/openair2/PHY_INTERFACE/mac_phy_primitives.c +++ b/openair2/PHY_INTERFACE/mac_phy_primitives.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*________________________mac_phy_primitives.c________________________ @@ -195,9 +187,6 @@ MACPHY_DATA_REQ *new_macphy_data_req(unsigned char Mod_id) return((MACPHY_DATA_REQ*)0); } -#ifndef USER_MODE -EXPORT_SYMBOL(new_macphy_data_req); -#endif #endif //PHY_CONTEXT @@ -270,13 +259,7 @@ void macphy_data_ind(unsigned char Mod_id,unsigned char Pdu_type,void *pdu,unsig } } msg("[OPENAIR][MAC][ERROR] No more PHY_RESOURCES !!!!\n"); -#ifdef USER_MODE exit(-1); -#else - print_active_indications(); - print_active_requests(); - mac_xface->macphy_exit(); -#endif } */ diff --git a/openair2/PHY_INTERFACE/mac_phy_primitives.h b/openair2/PHY_INTERFACE/mac_phy_primitives.h index a52ce6c8cb..889cb503dc 100644 --- a/openair2/PHY_INTERFACE/mac_phy_primitives.h +++ b/openair2/PHY_INTERFACE/mac_phy_primitives.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*________________________mac_phy_primitives.h________________________ diff --git a/openair2/PHY_INTERFACE/vars.h b/openair2/PHY_INTERFACE/vars.h index 561ab426e7..566f4347b6 100644 --- a/openair2/PHY_INTERFACE/vars.h +++ b/openair2/PHY_INTERFACE/vars.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __PHY_INTERFACE_VARS_H__ #define __PHY_INTERFACE_VARS_H__ @@ -50,7 +42,3 @@ unsigned int mac_registered; #endif -#ifndef USER_MODE -EXPORT_SYMBOL(mac_xface); -#endif //PHY_EMUL - diff --git a/openair2/RRC/L2_INTERFACE/COPYING b/openair2/RRC/L2_INTERFACE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRC/L2_INTERFACE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c index 702433744d..0844593d93 100644 --- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c +++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file l2_interface.c * \brief layer 2 interface @@ -36,45 +28,10 @@ * \email: navid.nikaein@eurecom.fr */ -#ifdef USER_MODE #include #include #include -#else //USER_MODE - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - - -#ifdef KERNEL2_6 - -#include -#endif - -#ifdef KERNEL2_4 -#include -#include -#endif -#endif //USER_MODE - #include "platform_types.h" #include "openair_defs.h" diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h index f694a68c58..4b651761de 100644 --- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h +++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file l2_interface.c * \brief layer 2 interface @@ -49,8 +41,6 @@ mac_rrc_data_req( const rb_id_t srb_idP, const uint8_t nb_tbP, uint8_t* const buffer_pP, - const eNB_flag_t eNB_flagP, - const mac_enb_index_t eNB_indexP, const uint8_t mbsfn_sync_areaP ); @@ -64,7 +54,31 @@ mac_rrc_data_ind( const rb_id_t srb_idP, const uint8_t *sduP, const sdu_size_t sdu_lenP, - const eNB_flag_t eNB_flagP, + const uint8_t mbsfn_sync_area +); + +int8_t +mac_rrc_data_req_ue( + const module_id_t module_idP, + const int CC_idP, + const frame_t frameP, + const rb_id_t srb_idP, + const uint8_t nb_tbP, + uint8_t* const buffer_pP, + const mac_enb_index_t eNB_indexP, + const uint8_t mbsfn_sync_areaP +); + +int8_t +mac_rrc_data_ind_ue( + const module_id_t module_idP, + const int CC_idP, + const frame_t frameP, + const sub_frame_t sub_frameP, + const rnti_t rntiP, + const rb_id_t srb_idP, + const uint8_t *sduP, + const sdu_size_t sdu_lenP, const mac_enb_index_t eNB_indexP, const uint8_t mbsfn_sync_area ); diff --git a/openair2/RRC/LITE/COPYING b/openair2/RRC/LITE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRC/LITE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c index d4ddd0e7ab..ab4fd170c0 100644 --- a/openair2/RRC/LITE/L2_interface.c +++ b/openair2/RRC/LITE/L2_interface.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file l2_interface.c * \brief layer 2 interface, used to support different RRC sublayer @@ -48,6 +40,7 @@ #include "rrc_eNB_UE_context.h" #include "pdcp.h" #include "msc.h" +#include "common/ran_context.h" #ifdef PHY_EMUL #include "SIMULATION/simulation_defs.h" @@ -61,9 +54,10 @@ extern UE_MAC_INST *UE_mac_inst; #endif //#define RRC_DATA_REQ_DEBUG -#define DEBUG_RRC 1 +//#define DEBUG_RRC 1 -mui_t mui=0; + +extern RAN_CONTEXT_t RC; //------------------------------------------------------------------------------ int8_t @@ -74,42 +68,48 @@ mac_rrc_data_req( const rb_id_t Srb_id, const uint8_t Nb_tb, uint8_t* const buffer_pP, - const eNB_flag_t enb_flagP, - const uint8_t eNB_index, const uint8_t mbsfn_sync_area ) //-------------------------------------------------------------------------- { + asn_enc_rval_t enc_rval; SRB_INFO *Srb_info; - uint8_t Sdu_size=0; + uint8_t Sdu_size = 0; + uint8_t sfn = (uint8_t)((frameP>>2)&0xff); + #ifdef DEBUG_RRC int i; - LOG_T(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%d\n",Mod_idP,Srb_id); + LOG_I(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%d\n",Mod_idP,Srb_id); #endif - if( enb_flagP == ENB_FLAG_YES) { + eNB_RRC_INST *rrc; + rrc_eNB_carrier_data_t *carrier; + BCCH_BCH_Message_t *mib; + + + rrc = RC.rrc[Mod_idP]; + carrier = &rrc->carrier[0]; + mib = &carrier->mib; if((Srb_id & RAB_OFFSET) == BCCH) { - if(eNB_rrc_inst[Mod_idP].carrier[CC_id].SI.Active==0) { + if(RC.rrc[Mod_idP]->carrier[CC_id].SI.Active==0) { return 0; } // All even frames transmit SIB in SF 5 - if (eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB1 == 255) { - LOG_E(RRC,"[eNB %d] MAC Request for SIB1 and SIB1 not initialized\n",Mod_idP); - mac_xface->macphy_exit("mac_rrc_data_req: MAC Request for SIB1 and SIB1 not initialized"); - } + AssertFatal(RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB1 != 255, + "[eNB %d] MAC Request for SIB1 and SIB1 not initialized\n",Mod_idP); if ((frameP%2) == 0) { memcpy(&buffer_pP[0], - eNB_rrc_inst[Mod_idP].carrier[CC_id].SIB1, - eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB1); + RC.rrc[Mod_idP]->carrier[CC_id].SIB1, + RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB1); -#if defined(ENABLE_ITTI) +#if 0 //defined(ENABLE_ITTI) { MessageDef *message_p; - int sib1_size = eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB1; + int sib1_size = RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB1; int sdu_size = sizeof(RRC_MAC_BCCH_DATA_REQ (message_p).sdu); if (sib1_size > sdu_size) { @@ -122,7 +122,7 @@ mac_rrc_data_req( RRC_MAC_BCCH_DATA_REQ (message_p).sdu_size = sib1_size; memset (RRC_MAC_BCCH_DATA_REQ (message_p).sdu, 0, BCCH_SDU_SIZE); memcpy (RRC_MAC_BCCH_DATA_REQ (message_p).sdu, - eNB_rrc_inst[Mod_idP].carrier[CC_id].SIB1, + RC.rrc[Mod_idP]->carrier[CC_id].SIB1, sib1_size); RRC_MAC_BCCH_DATA_REQ (message_p).enb_index = eNB_index; @@ -133,24 +133,24 @@ mac_rrc_data_req( #ifdef DEBUG_RRC LOG_T(RRC,"[eNB %d] Frame %d : BCCH request => SIB 1\n",Mod_idP,frameP); - for (i=0; icarrier[CC_id].sizeof_SIB1; i++) { LOG_T(RRC,"%x.",buffer_pP[i]); } LOG_T(RRC,"\n"); #endif - return (eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB1); + return (RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB1); } // All RFN mod 8 transmit SIB2-3 in SF 5 else if ((frameP%8) == 1) { memcpy(&buffer_pP[0], - eNB_rrc_inst[Mod_idP].carrier[CC_id].SIB23, - eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB23); + RC.rrc[Mod_idP]->carrier[CC_id].SIB23, + RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB23); -#if defined(ENABLE_ITTI) +#if 0 //defined(ENABLE_ITTI) { MessageDef *message_p; - int sib23_size = eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB23; + int sib23_size = RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB23; int sdu_size = sizeof(RRC_MAC_BCCH_DATA_REQ (message_p).sdu); if (sib23_size > sdu_size) { @@ -163,7 +163,7 @@ mac_rrc_data_req( RRC_MAC_BCCH_DATA_REQ (message_p).sdu_size = sib23_size; memset (RRC_MAC_BCCH_DATA_REQ (message_p).sdu, 0, BCCH_SDU_SIZE); memcpy (RRC_MAC_BCCH_DATA_REQ (message_p).sdu, - eNB_rrc_inst[Mod_idP].carrier[CC_id].SIB23, + RC.rrc[Mod_idP]->carrier[CC_id].SIB23, sib23_size); RRC_MAC_BCCH_DATA_REQ (message_p).enb_index = eNB_index; @@ -174,33 +174,48 @@ mac_rrc_data_req( #ifdef DEBUG_RRC LOG_T(RRC,"[eNB %d] Frame %d BCCH request => SIB 2-3\n",Mod_idP,frameP); - for (i=0; icarrier[CC_id].sizeof_SIB23; i++) { LOG_T(RRC,"%x.",buffer_pP[i]); } LOG_T(RRC,"\n"); #endif - return(eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_SIB23); + return(RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB23); } else { return(0); } } + if( (Srb_id & RAB_OFFSET ) == MIBCH) { + + mib->message.systemFrameNumber.buf = &sfn; + enc_rval = uper_encode_to_buffer(&asn_DEF_BCCH_BCH_Message, + (void*)mib, + carrier->MIB, + 24); + LOG_D(RRC,"Encoded MIB for frame %d (%p), bits %lu\n",sfn,carrier->MIB,enc_rval.encoded); + buffer_pP[0]=carrier->MIB[0]; + buffer_pP[1]=carrier->MIB[1]; + buffer_pP[2]=carrier->MIB[2]; + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", + enc_rval.failed_type->name, enc_rval.encoded); + return(3); + } if( (Srb_id & RAB_OFFSET ) == CCCH) { LOG_T(RRC,"[eNB %d] Frame %d CCCH request (Srb_id %d)\n",Mod_idP,frameP, Srb_id); - if(eNB_rrc_inst[Mod_idP].carrier[CC_id].Srb0.Active==0) { + if(RC.rrc[Mod_idP]->carrier[CC_id].Srb0.Active==0) { LOG_E(RRC,"[eNB %d] CCCH Not active\n",Mod_idP); return -1; } - Srb_info=&eNB_rrc_inst[Mod_idP].carrier[CC_id].Srb0; + Srb_info=&RC.rrc[Mod_idP]->carrier[CC_id].Srb0; // check if data is there for MAC if(Srb_info->Tx_buffer.payload_size>0) { //Fill buffer LOG_D(RRC,"[eNB %d] CCCH (%p) has %d bytes (dest: %p, src %p)\n",Mod_idP,Srb_info,Srb_info->Tx_buffer.payload_size,buffer_pP,Srb_info->Tx_buffer.Payload); -#if defined(ENABLE_ITTI) +#if 0 // defined(ENABLE_ITTI) { MessageDef *message_p; int ccch_size = Srb_info->Tx_buffer.payload_size; @@ -230,24 +245,56 @@ mac_rrc_data_req( return (Sdu_size); } -#ifdef Rel10 + if( (Srb_id & RAB_OFFSET ) == PCCH) { + LOG_T(RRC,"[eNB %d] Frame %d PCCH request (Srb_id %d)\n",Mod_idP,frameP, Srb_id); + + // check if data is there for MAC + if(RC.rrc[Mod_idP]->carrier[CC_id].sizeof_paging[mbsfn_sync_area] > 0) { //Fill buffer + LOG_D(RRC,"[eNB %d] PCCH (%p) has %d bytes\n",Mod_idP,&RC.rrc[Mod_idP]->carrier[CC_id].paging[mbsfn_sync_area], + RC.rrc[Mod_idP]->carrier[CC_id].sizeof_paging[mbsfn_sync_area]); + +#if 0 //defined(ENABLE_ITTI) + { + MessageDef *message_p; + int pcch_size = RC.rrc[Mod_idP]->arrier[CC_id].sizeof_paging[mbsfn_sync_area]; + int sdu_size = sizeof(RRC_MAC_PCCH_DATA_REQ (message_p).sdu); + + if (pcch_size > sdu_size) { + LOG_E(RRC, "SDU larger than PCCH SDU buffer size (%d, %d)", pcch_size, sdu_size); + pcch_size = sdu_size; + } + + message_p = itti_alloc_new_message (TASK_RRC_ENB, RRC_MAC_PCCH_DATA_REQ); + RRC_MAC_PCCH_DATA_REQ (message_p).frame = frameP; + RRC_MAC_PCCH_DATA_REQ (message_p).sdu_size = pcch_size; + memset (RRC_MAC_PCCH_DATA_REQ (message_p).sdu, 0, PCCH_SDU_SIZE); + memcpy (RRC_MAC_PCCH_DATA_REQ (message_p).sdu, RC.rrc[Mod_idP]->carrier[CC_id].paging[mbsfn_sync_area], pcch_size); + RRC_MAC_PCCH_DATA_REQ (message_p).enb_index = eNB_index; + + itti_send_msg_to_task (TASK_MAC_ENB, ENB_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); + } +#endif + + memcpy(buffer_pP, RC.rrc[Mod_idP]->carrier[CC_id].paging[mbsfn_sync_area], RC.rrc[Mod_idP]->carrier[CC_id].sizeof_paging[mbsfn_sync_area]); + Sdu_size = RC.rrc[Mod_idP]->carrier[CC_id].sizeof_paging[mbsfn_sync_area]; + RC.rrc[Mod_idP]->carrier[CC_id].sizeof_paging[mbsfn_sync_area] = 0; + } + + return (Sdu_size); + } + +#if defined(Rel10) || defined(Rel14) if((Srb_id & RAB_OFFSET) == MCCH) { - if(eNB_rrc_inst[Mod_idP].carrier[CC_id].MCCH_MESS[mbsfn_sync_area].Active==0) { + if(RC.rrc[Mod_idP]->carrier[CC_id].MCCH_MESS[mbsfn_sync_area].Active==0) { return 0; // this parameter is set in function init_mcch in rrc_eNB.c } - // this part not needed as it is done in init_mcch - /* if (eNB_rrc_inst[Mod_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area] == 255) { - LOG_E(RRC,"[eNB %d] MAC Request for MCCH MESSAGE and MCCH MESSAGE is not initialized\n",Mod_id); - mac_xface->macphy_exit(""); - }*/ - -#if defined(ENABLE_ITTI) +#if 0 // defined(ENABLE_ITTI) { MessageDef *message_p; - int mcch_size = eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]; + int mcch_size = RC.rrc[Mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]; int sdu_size = sizeof(RRC_MAC_MCCH_DATA_REQ (message_p).sdu); if (mcch_size > sdu_size) { @@ -260,7 +307,7 @@ mac_rrc_data_req( RRC_MAC_MCCH_DATA_REQ (message_p).sdu_size = mcch_size; memset (RRC_MAC_MCCH_DATA_REQ (message_p).sdu, 0, MCCH_SDU_SIZE); memcpy (RRC_MAC_MCCH_DATA_REQ (message_p).sdu, - eNB_rrc_inst[Mod_idP].carrier[CC_id].MCCH_MESSAGE[mbsfn_sync_area], + RC.rrc[Mod_idP]->carrier[CC_id].MCCH_MESSAGE[mbsfn_sync_area], mcch_size); RRC_MAC_MCCH_DATA_REQ (message_p).enb_index = eNB_index; RRC_MAC_MCCH_DATA_REQ (message_p).mbsfn_sync_area = mbsfn_sync_area; @@ -270,67 +317,44 @@ mac_rrc_data_req( #endif memcpy(&buffer_pP[0], - eNB_rrc_inst[Mod_idP].carrier[CC_id].MCCH_MESSAGE[mbsfn_sync_area], - eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]); + RC.rrc[Mod_idP]->carrier[CC_id].MCCH_MESSAGE[mbsfn_sync_area], + RC.rrc[Mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]); #ifdef DEBUG_RRC LOG_D(RRC,"[eNB %d] Frame %d : MCCH request => MCCH_MESSAGE \n",Mod_idP,frameP); - for (i=0; icarrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]; i++) { LOG_T(RRC,"%x.",buffer_pP[i]); } LOG_T(RRC,"\n"); #endif - return (eNB_rrc_inst[Mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]); + return (RC.rrc[Mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[mbsfn_sync_area]); // } //else //return(0); } -#endif //Rel10 - } else { //This is an UE -#ifdef DEBUG_RRC - LOG_D(RRC,"[UE %d] Frame %d Filling CCCH SRB_ID %d\n",Mod_idP,frameP,Srb_id); - LOG_D(RRC,"[UE %d] Frame %d buffer_pP status %d,\n",Mod_idP,frameP, UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size); -#endif +#endif //Rel10 || Rel14 - if( (UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size > 0) ) { - -#if defined(ENABLE_ITTI) - { - MessageDef *message_p; - int ccch_size = UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size; - int sdu_size = sizeof(RRC_MAC_CCCH_DATA_REQ (message_p).sdu); - - if (ccch_size > sdu_size) { - LOG_E(RRC, "SDU larger than CCCH SDU buffer size (%d, %d)", ccch_size, sdu_size); - ccch_size = sdu_size; - } - - message_p = itti_alloc_new_message (TASK_RRC_UE, RRC_MAC_CCCH_DATA_REQ); - RRC_MAC_CCCH_DATA_REQ (message_p).frame = frameP; - RRC_MAC_CCCH_DATA_REQ (message_p).sdu_size = ccch_size; - memset (RRC_MAC_CCCH_DATA_REQ (message_p).sdu, 0, CCCH_SDU_SIZE); - memcpy (RRC_MAC_CCCH_DATA_REQ (message_p).sdu, UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.Payload, ccch_size); - RRC_MAC_CCCH_DATA_REQ (message_p).enb_index = eNB_index; - - itti_send_msg_to_task (TASK_MAC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); - } -#endif - - memcpy(&buffer_pP[0],&UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.Payload[0],UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size); - uint8_t Ret_size=UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size; - // UE_rrc_inst[Mod_id].Srb0[eNB_index].Tx_buffer.payload_size=0; - UE_rrc_inst[Mod_idP].Info[eNB_index].T300_active = 1; - UE_rrc_inst[Mod_idP].Info[eNB_index].T300_cnt = 0; - // msg("[RRC][UE %d] Sending rach\n",Mod_id); - return(Ret_size); - } else { - return 0; +#ifdef Rel14 + if ((Srb_id & RAB_OFFSET) == BCCH_SIB1_BR){ + memcpy(&buffer_pP[0], + RC.rrc[Mod_idP]->carrier[CC_id].SIB1_BR, + RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB1_BR); + return (RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB1_BR); } - } + + if ((Srb_id & RAB_OFFSET) == BCCH_SI_BR){ // First SI message with SIB2/3 + memcpy(&buffer_pP[0], + RC.rrc[Mod_idP]->carrier[CC_id].SIB23_BR, + RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB23_BR); + return (RC.rrc[Mod_idP]->carrier[CC_id].sizeof_SIB23_BR); + } + +#endif + return(0); } @@ -346,8 +370,6 @@ mac_rrc_data_ind( const rb_id_t srb_idP, const uint8_t* sduP, const sdu_size_t sdu_lenP, - const eNB_flag_t eNB_flagP, - const mac_enb_index_t eNB_indexP, const uint8_t mbsfn_sync_areaP ) //-------------------------------------------------------------------------- @@ -362,114 +384,12 @@ mac_rrc_data_ind( /* int si_window; */ - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, eNB_flagP, rntiP, frameP, sub_frameP,eNB_indexP); + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, rntiP, frameP, sub_frameP,0); - if(eNB_flagP == ENB_FLAG_NO) { - if(srb_idP == BCCH) { - LOG_D(RRC,"[UE %d] Received SDU for BCCH on SRB %d from eNB %d\n",module_idP,srb_idP,eNB_indexP); - -#if defined(ENABLE_ITTI) - { - MessageDef *message_p; - int msg_sdu_size = sizeof(RRC_MAC_BCCH_DATA_IND (message_p).sdu); - - if (sdu_lenP > msg_sdu_size) { - LOG_E(RRC, "SDU larger than BCCH SDU buffer size (%d, %d)", sdu_lenP, msg_sdu_size); - sdu_size = msg_sdu_size; - } else { - sdu_size = sdu_lenP; - } - - message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_BCCH_DATA_IND); - memset (RRC_MAC_BCCH_DATA_IND (message_p).sdu, 0, BCCH_SDU_SIZE); - RRC_MAC_BCCH_DATA_IND (message_p).frame = frameP; - RRC_MAC_BCCH_DATA_IND (message_p).sub_frame = sub_frameP; - RRC_MAC_BCCH_DATA_IND (message_p).sdu_size = sdu_size; - memcpy (RRC_MAC_BCCH_DATA_IND (message_p).sdu, sduP, sdu_size); - RRC_MAC_BCCH_DATA_IND (message_p).enb_index = eNB_indexP; - RRC_MAC_BCCH_DATA_IND (message_p).rsrq = 30 /* TODO change phy to report rspq */; - RRC_MAC_BCCH_DATA_IND (message_p).rsrp = 45 /* TODO change phy to report rspp */; - - itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p); - } -#else - decode_BCCH_DLSCH_Message(&ctxt,eNB_indexP,(uint8_t*)sduP,sdu_lenP, 0, 0); -#endif - } - - if((srb_idP & RAB_OFFSET) == CCCH) { - if (sdu_lenP>0) { - LOG_T(RRC,"[UE %d] Received SDU for CCCH on SRB %d from eNB %d\n",module_idP,srb_idP & RAB_OFFSET,eNB_indexP); - -#if defined(ENABLE_ITTI) - { - MessageDef *message_p; - int msg_sdu_size = CCCH_SDU_SIZE; - - if (sdu_lenP > msg_sdu_size) { - LOG_E(RRC, "SDU larger than CCCH SDU buffer size (%d, %d)", sdu_size, msg_sdu_size); - sdu_size = msg_sdu_size; - } else { - sdu_size = sdu_lenP; - } - - message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_CCCH_DATA_IND); - memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE); - memcpy (RRC_MAC_CCCH_DATA_IND (message_p).sdu, sduP, sdu_size); - RRC_MAC_CCCH_DATA_IND (message_p).frame = frameP; - RRC_MAC_CCCH_DATA_IND (message_p).sub_frame = sub_frameP; - RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = sdu_size; - RRC_MAC_CCCH_DATA_IND (message_p).enb_index = eNB_indexP; - RRC_MAC_CCCH_DATA_IND (message_p).rnti = rntiP; - itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p); - } -#else - Srb_info = &UE_rrc_inst[module_idP].Srb0[eNB_indexP]; - memcpy(Srb_info->Rx_buffer.Payload,sduP,sdu_lenP); - Srb_info->Rx_buffer.payload_size = sdu_lenP; - rrc_ue_decode_ccch(&ctxt, Srb_info, eNB_indexP); -#endif - } - } - -#ifdef Rel10 - - if ((srb_idP & RAB_OFFSET) == MCCH) { - LOG_T(RRC,"[UE %d] Frame %d: Received SDU on MBSFN sync area %d for MCCH on SRB %d from eNB %d\n", - module_idP,frameP, mbsfn_sync_areaP, srb_idP & RAB_OFFSET,eNB_indexP); - -#if defined(ENABLE_ITTI) - { - MessageDef *message_p; - int msg_sdu_size = sizeof(RRC_MAC_MCCH_DATA_IND (message_p).sdu); - - if (sdu_size > msg_sdu_size) { - LOG_E(RRC, "SDU larger than MCCH SDU buffer size (%d, %d)", sdu_size, msg_sdu_size); - sdu_size = msg_sdu_size; - } - - message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_MCCH_DATA_IND); - RRC_MAC_MCCH_DATA_IND (message_p).frame = frameP; - RRC_MAC_MCCH_DATA_IND (message_p).sub_frame = sub_frameP; - RRC_MAC_MCCH_DATA_IND (message_p).sdu_size = sdu_lenP; - memset (RRC_MAC_MCCH_DATA_IND (message_p).sdu, 0, MCCH_SDU_SIZE); - memcpy (RRC_MAC_MCCH_DATA_IND (message_p).sdu, sduP, sdu_lenP); - RRC_MAC_MCCH_DATA_IND (message_p).enb_index = eNB_indexP; - RRC_MAC_MCCH_DATA_IND (message_p).mbsfn_sync_area = mbsfn_sync_areaP; - itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p); - } -#else - decode_MCCH_Message(&ctxt, eNB_indexP, sduP, sdu_lenP, mbsfn_sync_areaP); -#endif - } - -#endif // Rel10 - - } else { // This is an eNB - Srb_info = &eNB_rrc_inst[module_idP].carrier[CC_id].Srb0; - LOG_T(RRC,"[eNB %d] Received SDU for CCCH on SRB %d\n",module_idP,Srb_info->Srb_id); - -#if defined(ENABLE_ITTI) + Srb_info = &RC.rrc[module_idP]->carrier[CC_id].Srb0; + LOG_D(RRC,"[eNB %d] Received SDU for CCCH on SRB %d\n",module_idP,Srb_info->Srb_id); + +#if 0 //defined(ENABLE_ITTI) { MessageDef *message_p; int msg_sdu_size = sizeof(RRC_MAC_CCCH_DATA_IND (message_p).sdu); @@ -489,6 +409,7 @@ mac_rrc_data_ind( RRC_MAC_CCCH_DATA_IND (message_p).CC_id = CC_id; memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE); memcpy (RRC_MAC_CCCH_DATA_IND (message_p).sdu, sduP, sdu_size); + LOG_D(RRC,"[eNB %d] Sending message to RRC task\n",module_idP); itti_send_msg_to_task (TASK_RRC_ENB, ctxt.instance, message_p); } #else @@ -501,204 +422,11 @@ mac_rrc_data_ind( } #endif - } return(0); } -//-------------------------------------------------------------------------------------------// -// this function is Not USED anymore -void mac_sync_ind(module_id_t Mod_idP,uint8_t Status) -{ - //-------------------------------------------------------------------------------------------// -} - -//------------------------------------------------------------------------------ -uint8_t -rrc_data_req( - const protocol_ctxt_t* const ctxt_pP, - const rb_id_t rb_idP, - const mui_t muiP, - const confirm_t confirmP, - const sdu_size_t sdu_sizeP, - uint8_t* const buffer_pP, - const pdcp_transmission_mode_t modeP -) -//------------------------------------------------------------------------------ -{ - MSC_LOG_TX_MESSAGE( - ctxt_pP->enb_flag ? MSC_RRC_ENB : MSC_RRC_UE, - ctxt_pP->enb_flag ? MSC_PDCP_ENB : MSC_PDCP_UE, - buffer_pP, - sdu_sizeP, - MSC_AS_TIME_FMT"RRC_DCCH_DATA_REQ UE %x MUI %d size %u", - MSC_AS_TIME_ARGS(ctxt_pP), - ctxt_pP->rnti, - muiP, - sdu_sizeP); - -#if defined(ENABLE_ITTI) - { - MessageDef *message_p; - // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling). - uint8_t *message_buffer; - - message_buffer = itti_malloc ( - ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, - ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, - sdu_sizeP); - - memcpy (message_buffer, buffer_pP, sdu_sizeP); - - message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, RRC_DCCH_DATA_REQ); - RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame; - RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag; - RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP; - RRC_DCCH_DATA_REQ (message_p).muip = muiP; - RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP; - RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP; - RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer; - RRC_DCCH_DATA_REQ (message_p).mode = modeP; - RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id; - RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rnti; - RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index; - - itti_send_msg_to_task ( - ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, - ctxt_pP->instance, - message_p); - return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. - - } -#else - return pdcp_data_req ( - ctxt_pP, - SRB_FLAG_YES, - rb_idP, - muiP, - confirmP, - sdu_sizeP, - buffer_pP, - modeP); -#endif -} - -//------------------------------------------------------------------------------ -void -rrc_data_ind( - const protocol_ctxt_t* const ctxt_pP, - const rb_id_t Srb_id, - const sdu_size_t sdu_sizeP, - const uint8_t* const buffer_pP -) -//------------------------------------------------------------------------------ -{ - rb_id_t DCCH_index = Srb_id; - - if (ctxt_pP->enb_flag == ENB_FLAG_NO) { - LOG_N(RRC, "[UE %x] Frame %d: received a DCCH %d message on SRB %d with Size %d from eNB ???\n", - ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id-1,sdu_sizeP); - } else { - LOG_N(RRC, "[eNB %d] Frame %d: received a DCCH %d message on SRB %d with Size %d from UE %x\n", - ctxt_pP->module_id, - ctxt_pP->frame, - DCCH_index, - Srb_id-1, - sdu_sizeP, - ctxt_pP->rnti); - } - -#if defined(ENABLE_ITTI) - { - MessageDef *message_p; - // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling). - uint8_t *message_buffer; - - message_buffer = itti_malloc (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, sdu_sizeP); - memcpy (message_buffer, buffer_pP, sdu_sizeP); - - message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, RRC_DCCH_DATA_IND); - RRC_DCCH_DATA_IND (message_p).frame = ctxt_pP->frame; - RRC_DCCH_DATA_IND (message_p).dcch_index = DCCH_index; - RRC_DCCH_DATA_IND (message_p).sdu_size = sdu_sizeP; - RRC_DCCH_DATA_IND (message_p).sdu_p = message_buffer; - RRC_DCCH_DATA_IND (message_p).rnti = ctxt_pP->rnti; - RRC_DCCH_DATA_IND (message_p).module_id = ctxt_pP->module_id; - RRC_DCCH_DATA_IND (message_p).eNB_index = ctxt_pP->eNB_index; - - itti_send_msg_to_task (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, ctxt_pP->instance, message_p); - } -#else - - if (ctxt_pP->enb_flag == ENB_FLAG_YES) { - rrc_eNB_decode_dcch( - ctxt_pP, - DCCH_index, - buffer_pP, - sdu_sizeP); - } else { -//#warning "LG put 0 to arg4 that is eNB index" - rrc_ue_decode_dcch( - ctxt_pP, - DCCH_index, - buffer_pP, - 0); - } - -#endif -} - -//-------------------------------------------------------------------------------------------// -void rrc_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) -{ - //-------------------------------------------------------------------------------------------// -#if defined(ENABLE_ITTI) - { - MessageDef *message_p; - - message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_IN_SYNC_IND); - RRC_MAC_IN_SYNC_IND (message_p).frame = frameP; - RRC_MAC_IN_SYNC_IND (message_p).enb_index = eNB_index; - - itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); - } -#else - UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt=0; - - if (UE_rrc_inst[Mod_idP].Info[eNB_index].T310_active==1) { - UE_rrc_inst[Mod_idP].Info[eNB_index].N311_cnt++; - } - -#endif -} - -//-------------------------------------------------------------------------------------------// -void rrc_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) -{ - //-------------------------------------------------------------------------------------------// - LOG_I(RRC,"[UE %d] Frame %d: OUT OF SYNC FROM eNB %d (T310 active %d : T310 %d, N310 %d, N311 %d)\n ", - Mod_idP,frameP,eNB_index, - UE_rrc_inst[Mod_idP].Info[eNB_index].T300_active, - UE_rrc_inst[Mod_idP].Info[eNB_index].T310_cnt, - UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt, - UE_rrc_inst[Mod_idP].Info[eNB_index].N311_cnt); - -#if defined(ENABLE_ITTI) - { - MessageDef *message_p; - - message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_OUT_OF_SYNC_IND); - RRC_MAC_OUT_OF_SYNC_IND (message_p).frame = frameP; - RRC_MAC_OUT_OF_SYNC_IND (message_p).enb_index = eNB_index; - - itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); - } -#else - UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt++; -#endif -} - //------------------------------------------------------------------------------ int mac_eNB_get_rrc_status( @@ -709,7 +437,7 @@ mac_eNB_get_rrc_status( { struct rrc_eNB_ue_context_s* ue_context_p = NULL; ue_context_p = rrc_eNB_get_ue_context( - &eNB_rrc_inst[Mod_idP], + RC.rrc[Mod_idP], rntiP); if (ue_context_p != NULL) { @@ -727,17 +455,39 @@ void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP, { struct rrc_eNB_ue_context_s* ue_context_p = NULL; ue_context_p = rrc_eNB_get_ue_context( - &eNB_rrc_inst[Mod_instP], + RC.rrc[Mod_instP], rntiP); if (ue_context_p != NULL) { LOG_I(RRC,"Frame %d, Subframe %d: UE %x UL failure, activating timer\n",frameP,subframeP,rntiP); - ue_context_p->ue_context.ul_failure_timer=1; + if(ue_context_p->ue_context.ul_failure_timer == 0) + ue_context_p->ue_context.ul_failure_timer=1; } else { LOG_W(RRC,"Frame %d, Subframe %d: UL failure: UE %x unknown \n",frameP,subframeP,rntiP); } - rrc_mac_remove_ue(Mod_instP,rntiP); +// rrc_mac_remove_ue(Mod_instP,rntiP); +} + +void mac_eNB_rrc_uplane_failure(const module_id_t Mod_instP, + const int CC_idP, + const frame_t frameP, + const sub_frame_t subframeP, + const rnti_t rntiP) +{ + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + ue_context_p = rrc_eNB_get_ue_context( + RC.rrc[Mod_instP], + rntiP); + if (ue_context_p != NULL) { + LOG_I(RRC,"Frame %d, Subframe %d: UE %x U-Plane failure, activating timer\n",frameP,subframeP,rntiP); + + if(ue_context_p->ue_context.ul_failure_timer == 0) + ue_context_p->ue_context.ul_failure_timer=19999; + } + else { + LOG_W(RRC,"Frame %d, Subframe %d: U-Plane failure: UE %x unknown \n",frameP,subframeP,rntiP); + } } void mac_eNB_rrc_ul_in_sync(const module_id_t Mod_instP, @@ -748,7 +498,7 @@ void mac_eNB_rrc_ul_in_sync(const module_id_t Mod_instP, { struct rrc_eNB_ue_context_s* ue_context_p = NULL; ue_context_p = rrc_eNB_get_ue_context( - &eNB_rrc_inst[Mod_instP], + RC.rrc[Mod_instP], rntiP); if (ue_context_p != NULL) { @@ -760,33 +510,3 @@ void mac_eNB_rrc_ul_in_sync(const module_id_t Mod_instP, frameP, subframeP, rntiP); } } -//------------------------------------------------------------------------------ -int -mac_UE_get_rrc_status( - const module_id_t Mod_idP, - const uint8_t indexP -) -//------------------------------------------------------------------------------ -{ - return(UE_rrc_inst[Mod_idP].Info[indexP].State); -} - -//-------------------------------------------------------------------------------------------// -int mac_ue_ccch_success_ind(module_id_t Mod_idP, uint8_t eNB_index) -{ - //-------------------------------------------------------------------------------------------// -#if defined(ENABLE_ITTI) - { - MessageDef *message_p; - - message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_CCCH_DATA_CNF); - RRC_MAC_CCCH_DATA_CNF (message_p).enb_index = eNB_index; - - itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); - } -#else - // reset the tx buffer to indicate RRC that ccch was successfully transmitted (for example if contention resolution succeeds) - UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size=0; -#endif - return 0; -} diff --git a/openair2/RRC/LITE/L2_interface_common.c b/openair2/RRC/LITE/L2_interface_common.c new file mode 100644 index 0000000000..1b83252152 --- /dev/null +++ b/openair2/RRC/LITE/L2_interface_common.c @@ -0,0 +1,183 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file l2_interface.c + * \brief layer 2 interface, used to support different RRC sublayer + * \author Raymond Knopp and Navid Nikaein + * \date 2010-2014 + * \version 1.0 + * \company Eurecom + * \email: raymond.knopp@eurecom.fr + */ + +#include "platform_types.h" +//#include "openair_defs.h" +//#include "openair_proto.h" +#include "defs.h" +#include "extern.h" +//#include "mac_lchan_interface.h" +//#include "openair_rrc_utils.h" +//#include "openair_rrc_main.h" +#include "UTIL/LOG/log.h" +#include "rrc_eNB_UE_context.h" +#include "pdcp.h" +#include "msc.h" +#include "common/ran_context.h" + +#ifdef PHY_EMUL +#include "SIMULATION/simulation_defs.h" +extern EMULATION_VARS *Emul_vars; +extern eNB_MAC_INST *eNB_mac_inst; +extern UE_MAC_INST *UE_mac_inst; +#endif + +#if defined(ENABLE_ITTI) +# include "intertask_interface.h" +#endif + +//#define RRC_DATA_REQ_DEBUG +//#define DEBUG_RRC 1 + +//------------------------------------------------------------------------------ +uint8_t +rrc_data_req( + const protocol_ctxt_t* const ctxt_pP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_sizeP, + uint8_t* const buffer_pP, + const pdcp_transmission_mode_t modeP +) +//------------------------------------------------------------------------------ +{ + MSC_LOG_TX_MESSAGE( + ctxt_pP->enb_flag ? MSC_RRC_ENB : MSC_RRC_UE, + ctxt_pP->enb_flag ? MSC_PDCP_ENB : MSC_PDCP_UE, + buffer_pP, + sdu_sizeP, + MSC_AS_TIME_FMT"RRC_DCCH_DATA_REQ UE %x MUI %d size %u", + MSC_AS_TIME_ARGS(ctxt_pP), + ctxt_pP->rnti, + muiP, + sdu_sizeP); + +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling). + uint8_t *message_buffer; + + message_buffer = itti_malloc ( + ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, + ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, + sdu_sizeP); + + memcpy (message_buffer, buffer_pP, sdu_sizeP); + + message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, RRC_DCCH_DATA_REQ); + RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame; + RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag; + RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP; + RRC_DCCH_DATA_REQ (message_p).muip = muiP; + RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP; + RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP; + RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer; + RRC_DCCH_DATA_REQ (message_p).mode = modeP; + RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id; + RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rnti; + RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index; + + itti_send_msg_to_task ( + ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, + ctxt_pP->instance, + message_p); + return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. + + } +#else + return pdcp_data_req ( + ctxt_pP, + SRB_FLAG_YES, + rb_idP, + muiP, + confirmP, + sdu_sizeP, + buffer_pP, + modeP); +#endif +} + +//------------------------------------------------------------------------------ +void +rrc_data_ind( + const protocol_ctxt_t* const ctxt_pP, + const rb_id_t Srb_id, + const sdu_size_t sdu_sizeP, + const uint8_t* const buffer_pP +) +//------------------------------------------------------------------------------ +{ + rb_id_t DCCH_index = Srb_id; + + if (ctxt_pP->enb_flag == ENB_FLAG_NO) { + LOG_N(RRC, "[UE %x] Frame %d: received a DCCH %d message on SRB %d with Size %d from eNB %d\n", + ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id,sdu_sizeP, ctxt_pP->eNB_index); + } else { + LOG_N(RRC, "[eNB %d] Frame %d: received a DCCH %d message on SRB %d with Size %d from UE %x\n", + ctxt_pP->module_id, + ctxt_pP->frame, + DCCH_index, + Srb_id, + sdu_sizeP, + ctxt_pP->rnti); + } + +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling). + uint8_t *message_buffer; + + message_buffer = itti_malloc (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, sdu_sizeP); + memcpy (message_buffer, buffer_pP, sdu_sizeP); + + message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, RRC_DCCH_DATA_IND); + RRC_DCCH_DATA_IND (message_p).frame = ctxt_pP->frame; + RRC_DCCH_DATA_IND (message_p).dcch_index = DCCH_index; + RRC_DCCH_DATA_IND (message_p).sdu_size = sdu_sizeP; + RRC_DCCH_DATA_IND (message_p).sdu_p = message_buffer; + RRC_DCCH_DATA_IND (message_p).rnti = ctxt_pP->rnti; + RRC_DCCH_DATA_IND (message_p).module_id = ctxt_pP->module_id; + RRC_DCCH_DATA_IND (message_p).eNB_index = ctxt_pP->eNB_index; + + itti_send_msg_to_task (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, ctxt_pP->instance, message_p); + } +#else + + rrc_eNB_decode_dcch( + ctxt_pP, + DCCH_index, + buffer_pP, + sdu_sizeP); + +#endif +} diff --git a/openair2/RRC/LITE/L2_interface_ue.c b/openair2/RRC/LITE/L2_interface_ue.c new file mode 100644 index 0000000000..7bdbe2523e --- /dev/null +++ b/openair2/RRC/LITE/L2_interface_ue.c @@ -0,0 +1,463 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file l2_interface.c + * \brief layer 2 interface, used to support different RRC sublayer + * \author Raymond Knopp and Navid Nikaein + * \date 2010-2014 + * \version 1.0 + * \company Eurecom + * \email: raymond.knopp@eurecom.fr + */ + +#include "platform_types.h" +//#include "openair_defs.h" +//#include "openair_proto.h" +#include "defs.h" +#include "extern.h" +//#include "mac_lchan_interface.h" +//#include "openair_rrc_utils.h" +//#include "openair_rrc_main.h" +#include "UTIL/LOG/log.h" +#include "rrc_eNB_UE_context.h" +#include "pdcp.h" +#include "msc.h" + + +#if defined(ENABLE_ITTI) +# include "intertask_interface.h" +#endif + +//#define RRC_DATA_REQ_DEBUG +//#define DEBUG_RRC 1 + + + +//------------------------------------------------------------------------------ +int8_t +mac_rrc_data_req_ue( + const module_id_t Mod_idP, + const int CC_id, + const frame_t frameP, + const rb_id_t Srb_id, + const uint8_t Nb_tb, + uint8_t* const buffer_pP, + const uint8_t eNB_index, + const uint8_t mbsfn_sync_area +) +//-------------------------------------------------------------------------- +{ + asn_enc_rval_t enc_rval; + SRB_INFO *Srb_info; + uint8_t Sdu_size = 0; + uint8_t sfn = (uint8_t)((frameP>>2)&0xff); + + +#ifdef DEBUG_RRC + int i; + LOG_I(RRC,"[eNB %d] mac_rrc_data_req to SRB ID=%d\n",Mod_idP,Srb_id); +#endif + + eNB_RRC_INST *rrc; + rrc_eNB_carrier_data_t *carrier; + BCCH_BCH_Message_t *mib; + + + LOG_D(RRC,"[UE %d] Frame %d Filling CCCH SRB_ID %d\n",Mod_idP,frameP,Srb_id); + LOG_D(RRC,"[UE %d] Frame %d buffer_pP status %d,\n",Mod_idP,frameP, UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size); + + + if( (UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size > 0) ) { + +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + int ccch_size = UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size; + int sdu_size = sizeof(RRC_MAC_CCCH_DATA_REQ (message_p).sdu); + + if (ccch_size > sdu_size) { + LOG_E(RRC, "SDU larger than CCCH SDU buffer size (%d, %d)", ccch_size, sdu_size); + ccch_size = sdu_size; + } + + message_p = itti_alloc_new_message (TASK_RRC_UE, RRC_MAC_CCCH_DATA_REQ); + RRC_MAC_CCCH_DATA_REQ (message_p).frame = frameP; + RRC_MAC_CCCH_DATA_REQ (message_p).sdu_size = ccch_size; + memset (RRC_MAC_CCCH_DATA_REQ (message_p).sdu, 0, CCCH_SDU_SIZE); + memcpy (RRC_MAC_CCCH_DATA_REQ (message_p).sdu, UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.Payload, ccch_size); + RRC_MAC_CCCH_DATA_REQ (message_p).enb_index = eNB_index; + + itti_send_msg_to_task (TASK_MAC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); + } +#endif + + memcpy(&buffer_pP[0],&UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.Payload[0],UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size); + uint8_t Ret_size=UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size; + // UE_rrc_inst[Mod_id].Srb0[eNB_index].Tx_buffer.payload_size=0; + UE_rrc_inst[Mod_idP].Info[eNB_index].T300_active = 1; + UE_rrc_inst[Mod_idP].Info[eNB_index].T300_cnt = 0; + // msg("[RRC][UE %d] Sending rach\n",Mod_id); + return(Ret_size); + } else { + return 0; + } + + return(0); +} + +//------------------------------------------------------------------------------ +int8_t +mac_rrc_data_ind_ue( + const module_id_t module_idP, + const int CC_id, + const frame_t frameP, + const sub_frame_t sub_frameP, + const rnti_t rntiP, + const rb_id_t srb_idP, + const uint8_t* sduP, + const sdu_size_t sdu_lenP, + const mac_enb_index_t eNB_indexP, + const uint8_t mbsfn_sync_areaP +) +//-------------------------------------------------------------------------- +{ + SRB_INFO *Srb_info; + protocol_ctxt_t ctxt; + sdu_size_t sdu_size = 0; + + /* for no gcc warnings */ + (void)sdu_size; + + /* + int si_window; + */ + PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, 0, rntiP, frameP, sub_frameP,eNB_indexP); + + if(srb_idP == BCCH) { + LOG_D(RRC,"[UE %d] Received SDU for BCCH on SRB %d from eNB %d\n",module_idP,srb_idP,eNB_indexP); + +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + int msg_sdu_size = sizeof(RRC_MAC_BCCH_DATA_IND (message_p).sdu); + + if (sdu_lenP > msg_sdu_size) { + LOG_E(RRC, "SDU larger than BCCH SDU buffer size (%d, %d)", sdu_lenP, msg_sdu_size); + sdu_size = msg_sdu_size; + } else { + sdu_size = sdu_lenP; + } + + message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_BCCH_DATA_IND); + memset (RRC_MAC_BCCH_DATA_IND (message_p).sdu, 0, BCCH_SDU_SIZE); + RRC_MAC_BCCH_DATA_IND (message_p).frame = frameP; + RRC_MAC_BCCH_DATA_IND (message_p).sub_frame = sub_frameP; + RRC_MAC_BCCH_DATA_IND (message_p).sdu_size = sdu_size; + memcpy (RRC_MAC_BCCH_DATA_IND (message_p).sdu, sduP, sdu_size); + RRC_MAC_BCCH_DATA_IND (message_p).enb_index = eNB_indexP; + RRC_MAC_BCCH_DATA_IND (message_p).rsrq = 30 /* TODO change phy to report rspq */; + RRC_MAC_BCCH_DATA_IND (message_p).rsrp = 45 /* TODO change phy to report rspp */; + + itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p); + } +#else + decode_BCCH_DLSCH_Message(&ctxt,eNB_indexP,(uint8_t*)sduP,sdu_lenP, 0, 0); +#endif + } + + if(srb_idP == PCCH) { + LOG_D(RRC,"[UE %d] Received SDU for PCCH on SRB %d from eNB %d\n",module_idP,srb_idP,eNB_indexP); + decode_PCCH_DLSCH_Message(&ctxt,eNB_indexP,(uint8_t*)sduP,sdu_lenP); + } + if((srb_idP & RAB_OFFSET) == CCCH) { + if (sdu_lenP>0) { + LOG_T(RRC,"[UE %d] Received SDU for CCCH on SRB %d from eNB %d\n",module_idP,srb_idP & RAB_OFFSET,eNB_indexP); + +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + int msg_sdu_size = CCCH_SDU_SIZE; + + if (sdu_lenP > msg_sdu_size) { + LOG_E(RRC, "SDU larger than CCCH SDU buffer size (%d, %d)", sdu_size, msg_sdu_size); + sdu_size = msg_sdu_size; + } else { + sdu_size = sdu_lenP; + } + + message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_CCCH_DATA_IND); + memset (RRC_MAC_CCCH_DATA_IND (message_p).sdu, 0, CCCH_SDU_SIZE); + memcpy (RRC_MAC_CCCH_DATA_IND (message_p).sdu, sduP, sdu_size); + RRC_MAC_CCCH_DATA_IND (message_p).frame = frameP; + RRC_MAC_CCCH_DATA_IND (message_p).sub_frame = sub_frameP; + RRC_MAC_CCCH_DATA_IND (message_p).sdu_size = sdu_size; + RRC_MAC_CCCH_DATA_IND (message_p).enb_index = eNB_indexP; + RRC_MAC_CCCH_DATA_IND (message_p).rnti = rntiP; + itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p); + } +#else + Srb_info = &UE_rrc_inst[module_idP].Srb0[eNB_indexP]; + memcpy(Srb_info->Rx_buffer.Payload,sduP,sdu_lenP); + Srb_info->Rx_buffer.payload_size = sdu_lenP; + rrc_ue_decode_ccch(&ctxt, Srb_info, eNB_indexP); +#endif + } + } + +#if defined(Rel10) || defined(Rel14) + + if ((srb_idP & RAB_OFFSET) == MCCH) { + LOG_T(RRC,"[UE %d] Frame %d: Received SDU on MBSFN sync area %d for MCCH on SRB %d from eNB %d\n", + module_idP,frameP, mbsfn_sync_areaP, srb_idP & RAB_OFFSET,eNB_indexP); + +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + int msg_sdu_size = sizeof(RRC_MAC_MCCH_DATA_IND (message_p).sdu); + + if (sdu_size > msg_sdu_size) { + LOG_E(RRC, "SDU larger than MCCH SDU buffer size (%d, %d)", sdu_size, msg_sdu_size); + sdu_size = msg_sdu_size; + } + + message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_MCCH_DATA_IND); + RRC_MAC_MCCH_DATA_IND (message_p).frame = frameP; + RRC_MAC_MCCH_DATA_IND (message_p).sub_frame = sub_frameP; + RRC_MAC_MCCH_DATA_IND (message_p).sdu_size = sdu_lenP; + memset (RRC_MAC_MCCH_DATA_IND (message_p).sdu, 0, MCCH_SDU_SIZE); + memcpy (RRC_MAC_MCCH_DATA_IND (message_p).sdu, sduP, sdu_lenP); + RRC_MAC_MCCH_DATA_IND (message_p).enb_index = eNB_indexP; + RRC_MAC_MCCH_DATA_IND (message_p).mbsfn_sync_area = mbsfn_sync_areaP; + itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p); + } +#else + decode_MCCH_Message(&ctxt, eNB_indexP, sduP, sdu_lenP, mbsfn_sync_areaP); +#endif + } + +#endif // Rel10 || Rel14 + + return(0); + +} + + +//------------------------------------------------------------------------------ +uint8_t +rrc_data_req_ue( + const protocol_ctxt_t* const ctxt_pP, + const rb_id_t rb_idP, + const mui_t muiP, + const confirm_t confirmP, + const sdu_size_t sdu_sizeP, + uint8_t* const buffer_pP, + const pdcp_transmission_mode_t modeP +) +//------------------------------------------------------------------------------ +{ + MSC_LOG_TX_MESSAGE( + ctxt_pP->enb_flag ? MSC_RRC_ENB : MSC_RRC_UE, + ctxt_pP->enb_flag ? MSC_PDCP_ENB : MSC_PDCP_UE, + buffer_pP, + sdu_sizeP, + MSC_AS_TIME_FMT"RRC_DCCH_DATA_REQ UE %x MUI %d size %u", + MSC_AS_TIME_ARGS(ctxt_pP), + ctxt_pP->rnti, + muiP, + sdu_sizeP); + +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling). + uint8_t *message_buffer; + + message_buffer = itti_malloc ( + ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, + ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, + sdu_sizeP); + + memcpy (message_buffer, buffer_pP, sdu_sizeP); + + message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, RRC_DCCH_DATA_REQ); + RRC_DCCH_DATA_REQ (message_p).frame = ctxt_pP->frame; + RRC_DCCH_DATA_REQ (message_p).enb_flag = ctxt_pP->enb_flag; + RRC_DCCH_DATA_REQ (message_p).rb_id = rb_idP; + RRC_DCCH_DATA_REQ (message_p).muip = muiP; + RRC_DCCH_DATA_REQ (message_p).confirmp = confirmP; + RRC_DCCH_DATA_REQ (message_p).sdu_size = sdu_sizeP; + RRC_DCCH_DATA_REQ (message_p).sdu_p = message_buffer; + RRC_DCCH_DATA_REQ (message_p).mode = modeP; + RRC_DCCH_DATA_REQ (message_p).module_id = ctxt_pP->module_id; + RRC_DCCH_DATA_REQ (message_p).rnti = ctxt_pP->rnti; + RRC_DCCH_DATA_REQ (message_p).eNB_index = ctxt_pP->eNB_index; + + itti_send_msg_to_task ( + TASK_PDCP_UE, + ctxt_pP->instance, + message_p); + return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway. + + } +#else + return pdcp_data_req ( + ctxt_pP, + SRB_FLAG_YES, + rb_idP, + muiP, + confirmP, + sdu_sizeP, + buffer_pP, + modeP); +#endif +} + +//------------------------------------------------------------------------------ +void +rrc_data_ind_ue( + const protocol_ctxt_t* const ctxt_pP, + const rb_id_t Srb_id, + const sdu_size_t sdu_sizeP, + const uint8_t* const buffer_pP +) +//------------------------------------------------------------------------------ +{ + rb_id_t DCCH_index = Srb_id; + + LOG_N(RRC, "[UE %x] Frame %d: received a DCCH %d message on SRB %d with Size %d from eNB %d\n", + ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id,sdu_sizeP, ctxt_pP->eNB_index); + +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling). + uint8_t *message_buffer; + + message_buffer = itti_malloc (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, sdu_sizeP); + memcpy (message_buffer, buffer_pP, sdu_sizeP); + + message_p = itti_alloc_new_message (ctxt_pP->enb_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, RRC_DCCH_DATA_IND); + RRC_DCCH_DATA_IND (message_p).frame = ctxt_pP->frame; + RRC_DCCH_DATA_IND (message_p).dcch_index = DCCH_index; + RRC_DCCH_DATA_IND (message_p).sdu_size = sdu_sizeP; + RRC_DCCH_DATA_IND (message_p).sdu_p = message_buffer; + RRC_DCCH_DATA_IND (message_p).rnti = ctxt_pP->rnti; + RRC_DCCH_DATA_IND (message_p).module_id = ctxt_pP->module_id; + RRC_DCCH_DATA_IND (message_p).eNB_index = ctxt_pP->eNB_index; + + itti_send_msg_to_task (TASK_RRC_UE, ctxt_pP->instance, message_p); + } +#else + +//#warning "LG put 0 to arg4 that is eNB index" + rrc_ue_decode_dcch( + ctxt_pP, + DCCH_index, + buffer_pP, + 0); + +#endif +} + +//-------------------------------------------------------------------------------------------// +void rrc_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) +{ + //-------------------------------------------------------------------------------------------// +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + //LOG_I(RRC,"sending a message to task_mac_ue\n"); + message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_IN_SYNC_IND); + RRC_MAC_IN_SYNC_IND (message_p).frame = frameP; + RRC_MAC_IN_SYNC_IND (message_p).enb_index = eNB_index; + + itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); + } +#else + UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt=0; + + if (UE_rrc_inst[Mod_idP].Info[eNB_index].T310_active==1) { + UE_rrc_inst[Mod_idP].Info[eNB_index].N311_cnt++; + } + +#endif +} + +//-------------------------------------------------------------------------------------------// +void rrc_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) +{ + //-------------------------------------------------------------------------------------------// + if (UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt>10) + LOG_I(RRC,"[UE %d] Frame %d: OUT OF SYNC FROM eNB %d (T310 active %d : T310 %d, N310 %d, N311 %d)\n ", + Mod_idP,frameP,eNB_index, + UE_rrc_inst[Mod_idP].Info[eNB_index].T300_active, + UE_rrc_inst[Mod_idP].Info[eNB_index].T310_cnt, + UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt, + UE_rrc_inst[Mod_idP].Info[eNB_index].N311_cnt); + +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + + message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_OUT_OF_SYNC_IND); + RRC_MAC_OUT_OF_SYNC_IND (message_p).frame = frameP; + RRC_MAC_OUT_OF_SYNC_IND (message_p).enb_index = eNB_index; + + itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); + } +#else + UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt++; +#endif +} + +//------------------------------------------------------------------------------ +int +mac_UE_get_rrc_status( + const module_id_t Mod_idP, + const uint8_t indexP +) +//------------------------------------------------------------------------------ +{ + if (UE_rrc_inst) + return(UE_rrc_inst[Mod_idP].Info[indexP].State); + else + return(-1); +} + +//-------------------------------------------------------------------------------------------// +int mac_ue_ccch_success_ind(module_id_t Mod_idP, uint8_t eNB_index) +{ + //-------------------------------------------------------------------------------------------// +#if defined(ENABLE_ITTI) + { + MessageDef *message_p; + + message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_CCCH_DATA_CNF); + RRC_MAC_CCCH_DATA_CNF (message_p).enb_index = eNB_index; + + itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p); + } +#else + // reset the tx buffer to indicate RRC that ccch was successfully transmitted (for example if contention resolution succeeds) + UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size=0; +#endif + return 0; +} diff --git a/openair2/RRC/LITE/MESSAGES/COPYING b/openair2/RRC/LITE/MESSAGES/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRC/LITE/MESSAGES/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRC/LITE/MESSAGES/Makefile b/openair2/RRC/LITE/MESSAGES/Makefile deleted file mode 100644 index bd99081ad2..0000000000 --- a/openair2/RRC/LITE/MESSAGES/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -include $(OPENAIR_DIR)/common/utils/Makefile.inc -OPENAIR2_TOP = ../../.. -include $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc - - -EXTRA_CFLAGS += -I$(OPENAIR1_DIR) -I/usr/realtime/include -D__need_Emath -D__NO_ASSERT_H__ - -ifdef RTAI -# Get the RTAI variables -CCC = $(shell rtai-config --cc) -RTAI_SUBVERSION=$(shell rtai-config --version | sed -e 's/^..\(.\).*$$/\1/') -IS_RTAI_SUBVERSION_LESS_THAN_FIVE=$(shell if [ $(RTAI_SUBVERSION) -lt 5 ] ; then echo true ; fi) - -EXTRA_CFLAGS += -D__IN_RTAI__ $(shell rtai-config --module-cflags) -g -march=pentium4 -DNODE_RG -DBIGPHYSAREA -DRTAI -DRTAI_ENABLED -fno-stack-protector -DHW_PREFIX_REMOVAL -Wall -D__KERNEL__ -DMODULE -D_LOOSE_KERNEL_NAMES -DWIDENS_DLC -I$(KERNEL_DIR)/build/include -I$(KERNEL_DIR)/build/include/asm/mach-default -include $(KERNEL_DIR)/build/include/linux/autoconf.h $(if $(IS_RTAI_SUBVERSION_LESS_THAN_FIVE),-DRTAI_ISNT_POSIX,) -endif - - -obj-m = asn1_msg_kern.o -asn1_msg_kern-objs = $(ASN1_CONVERTER_OBJS) $(ASN1_MODULE_OBJS) bsearch.o rtai_mem.o - -clean: - rm -rf $(asn1_msg_kern-objs) $(obj-m) - -test: - echo $(asn1_msg_kern-objs) $(obj-m) - -regen: regenerate-from-asn1-source - -regenerate-from-asn1-source: - asn1c -gen-PER -fcompound-names -fnative-types -fskeletons-copy asn1c/ASN1_files/EUTRA-RRC-Definitions.asn - diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index ff0adf713b..b8a4148b11 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file asn1_msg.c * \brief primitives to build the asn1 messages @@ -36,7 +28,6 @@ * \email: raymond.knopp@eurecom.fr and navid.nikaein@eurecom.fr */ -#ifdef USER_MODE #include #include #include /* for atoi(3) */ @@ -44,14 +35,7 @@ #include /* for strerror(3) */ #include /* for EX_* exit codes */ #include /* for errno */ -#else -#include /* Needed by all modules */ -#endif -#ifdef USER_MODE -//#include "RRC/LITE/defs.h" -//#include "COMMON/mac_rrc_primitives.h" #include "UTIL/LOG/log.h" -#endif #include #include /* for _ASN_DEFAULT_STACK_MAX */ #include @@ -62,16 +46,19 @@ #include "UL-DCCH-Message.h" #include "DL-CCCH-Message.h" #include "DL-DCCH-Message.h" +#include "PCCH-Message.h" +#include "openair3/UTILS/conversions.h" #include "EstablishmentCause.h" #include "RRCConnectionSetup.h" #include "SRB-ToAddModList.h" #include "DRB-ToAddModList.h" -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) #include "MCCH-Message.h" //#define MRB1 1 #endif #include "RRC/LITE/defs.h" +#include "RRC/LITE/extern.h" #include "RRCConnectionSetupComplete.h" #include "RRCConnectionReconfigurationComplete.h" #include "RRCConnectionReconfiguration.h" @@ -95,21 +82,15 @@ # include "intertask_interface.h" #endif -//#include "PHY/defs.h" -#ifndef USER_MODE -#define msg printk -#ifndef errno -int errno; -#endif -#else -# if !defined (msg) -# define msg printf -# endif +#include "common/ran_context.h" +#include "secu_defs.h" + +#if !defined (msg) +#define msg printf #endif //#define XER_PRINT -extern Enb_properties_array_t enb_properties; typedef struct xer_sprint_string_s { char *string; size_t string_size; @@ -117,6 +98,9 @@ typedef struct xer_sprint_string_s { } xer_sprint_string_t; extern unsigned char NB_eNB_INST; +extern uint8_t usim_test; + +extern RAN_CONTEXT_t RC; uint16_t two_tier_hexagonal_cellIds[7] = {0,1,2,4,5,7,8}; uint16_t two_tier_hexagonal_adjacent_cellIds[7][6] = {{1,2,4,5,7,8}, // CellId 0 @@ -161,11 +145,11 @@ int xer_sprint (char *string, size_t string_size, asn_TYPE_descriptor_t *td, voi er = xer_encode(td, sptr, XER_F_BASIC, xer__print2s, &string_buffer); if (er.encoded < 0) { - LOG_E(RRC, "xer_sprint encoding error (%d)!", er.encoded); + LOG_E(RRC, "xer_sprint encoding error (%zd)!", er.encoded); er.encoded = string_buffer.string_size; } else { if (er.encoded > string_buffer.string_size) { - LOG_E(RRC, "xer_sprint string buffer too small, got %d need %d!", string_buffer.string_size, er.encoded); + LOG_E(RRC, "xer_sprint string buffer too small, got %zd need %zd!", string_buffer.string_size, er.encoded); er.encoded = string_buffer.string_size; } } @@ -193,186 +177,75 @@ uint8_t get_adjacent_cell_mod_id(uint16_t phyCellId) return 0xFF; //error! } -/* -uint8_t do_SIB1(LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer, - SystemInformationBlockType1_t *sib1) { - - - PLMN_IdentityInfo_t PLMN_identity_info; - MCC_MNC_Digit_t dummy; - asn_enc_rval_t enc_rval; - SchedulingInfo_t schedulingInfo; - SIB_Type_t sib_type; - - memset(sib1,0,sizeof(SystemInformationBlockType1_t)); - memset(&PLMN_identity_info,0,sizeof(PLMN_IdentityInfo_t)); - memset(&schedulingInfo,0,sizeof(SchedulingInfo_t)); - memset(&sib_type,0,sizeof(SIB_Type_t)); - - PLMN_identity_info.plmn_Identity.mcc = CALLOC(1,sizeof(*PLMN_identity_info.plmn_Identity.mcc)); - memset(PLMN_identity_info.plmn_Identity.mcc,0,sizeof(*PLMN_identity_info.plmn_Identity.mcc)); - - asn_set_empty(&PLMN_identity_info.plmn_Identity.mcc->list);//.size=0; - - dummy=2;ASN_SEQUENCE_ADD(&PLMN_identity_info.plmn_Identity.mcc->list,&dummy); - dummy=6;ASN_SEQUENCE_ADD(&PLMN_identity_info.plmn_Identity.mcc->list,&dummy); - dummy=2;ASN_SEQUENCE_ADD(&PLMN_identity_info.plmn_Identity.mcc->list,&dummy); - - PLMN_identity_info.plmn_Identity.mnc.list.size=0; - PLMN_identity_info.plmn_Identity.mnc.list.count=0; - dummy=8;ASN_SEQUENCE_ADD(&PLMN_identity_info.plmn_Identity.mnc.list,&dummy); - dummy=0;ASN_SEQUENCE_ADD(&PLMN_identity_info.plmn_Identity.mnc.list,&dummy); - //assign_enum(&PLMN_identity_info.cellReservedForOperatorUse,PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved); - PLMN_identity_info.cellReservedForOperatorUse=PLMN_IdentityInfo__cellReservedForOperatorUse_notReserved; - - ASN_SEQUENCE_ADD(&sib1->cellAccessRelatedInfo.plmn_IdentityList.list,&PLMN_identity_info); - - - // 16 bits - sib1->cellAccessRelatedInfo.trackingAreaCode.buf = MALLOC(2); - sib1->cellAccessRelatedInfo.trackingAreaCode.buf[0]=0x00; - sib1->cellAccessRelatedInfo.trackingAreaCode.buf[1]=0x10; - sib1->cellAccessRelatedInfo.trackingAreaCode.size=2; - sib1->cellAccessRelatedInfo.trackingAreaCode.bits_unused=0; - - // 28 bits - sib1->cellAccessRelatedInfo.cellIdentity.buf = MALLOC(8); - sib1->cellAccessRelatedInfo.cellIdentity.buf[0]=0x01; - sib1->cellAccessRelatedInfo.cellIdentity.buf[1]=0x48; - sib1->cellAccessRelatedInfo.cellIdentity.buf[2]=0x0f; - sib1->cellAccessRelatedInfo.cellIdentity.buf[3]=0x03; - sib1->cellAccessRelatedInfo.cellIdentity.size=4; - sib1->cellAccessRelatedInfo.cellIdentity.bits_unused=4; - - // assign_enum(&sib1->cellAccessRelatedInfo.cellBarred,SystemInformationBlockType1__cellAccessRelatedInfo__cellBarred_notBarred); - sib1->cellAccessRelatedInfo.cellBarred=SystemInformationBlockType1__cellAccessRelatedInfo__cellBarred_notBarred; - - // assign_enum(&sib1->cellAccessRelatedInfo.intraFreqReselection,SystemInformationBlockType1__cellAccessRelatedInfo__intraFreqReselection_allowed); - sib1->cellAccessRelatedInfo.intraFreqReselection=SystemInformationBlockType1__cellAccessRelatedInfo__intraFreqReselection_allowed; - sib1->cellAccessRelatedInfo.csg_Indication=0; - - sib1->cellSelectionInfo.q_RxLevMin=-70; - sib1->cellSelectionInfo.q_RxLevMinOffset=NULL; - - sib1->freqBandIndicator = 2; - - // assign_enum(&schedulingInfo.si_Periodicity,SchedulingInfo__si_Periodicity_rf8); - schedulingInfo.si_Periodicity=SchedulingInfo__si_Periodicity_rf8; - - // assign_enum(&sib_type,SIB_Type_sibType3); - sib_type=SIB_Type_sibType3; - - ASN_SEQUENCE_ADD(&schedulingInfo.sib_MappingInfo.list,&sib_type); - ASN_SEQUENCE_ADD(&sib1->schedulingInfoList.list,&schedulingInfo); - - sib1->tdd_Config = CALLOC(1,sizeof(struct TDD_Config)); - - //assign_enum(&sib1->tdd_Config->subframeAssignment,TDD_Config__subframeAssignment_sa3); - sib1->tdd_Config->subframeAssignment=frame_parms->tdd_config; //TDD_Config__subframeAssignment_sa3; - - // assign_enum(&sib1->tdd_Config->specialSubframePatterns,TDD_Config__specialSubframePatterns_ssp0); - sib1->tdd_Config->specialSubframePatterns=frame_parms->tdd_config_S;//TDD_Config__specialSubframePatterns_ssp0; - - // assign_enum(&sib1->si_WindowLength,SystemInformationBlockType1__si_WindowLength_ms10); - sib1->si_WindowLength=SystemInformationBlockType1__si_WindowLength_ms10; - sib1->systemInfoValueTag=0; - // sib1.nonCriticalExtension = calloc(1,sizeof(*sib1.nonCriticalExtension)); - -#ifdef USER_MODE - xer_fprint(stdout, &asn_DEF_SystemInformationBlockType1, (void*)sib1); -#endif - - enc_rval = uper_encode_to_buffer(&asn_DEF_SystemInformationBlockType1, - (void*)sib1, - buffer, - 200); -#ifdef USER_MODE - LOG_D(RRC,"[eNB] SystemInformationBlockType1 Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); -#endif - - if (enc_rval.encoded==-1) - return(-1); - return((enc_rval.encoded+7)/8); -} -*/ -// AT4 packet -uint8_t do_MIB(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame, uint8_t *buffer) +uint8_t do_MIB(rrc_eNB_carrier_data_t *carrier, uint32_t N_RB_DL, uint32_t phich_Resource, uint32_t phich_duration, uint32_t frame) { asn_enc_rval_t enc_rval; - BCCH_BCH_Message_t mib; + BCCH_BCH_Message_t *mib=&carrier->mib ; uint8_t sfn = (uint8_t)((frame>>2)&0xff); - uint16_t spare=0; + uint16_t *spare= calloc(1, sizeof(uint16_t)); + if (spare == NULL) abort(); - switch (frame_parms->N_RB_DL) { + switch (N_RB_DL) { case 6: - mib.message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n6; + mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n6; break; case 15: - mib.message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n15; + mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n15; break; case 25: - mib.message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n25; + mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n25; break; case 50: - mib.message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n50; + mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n50; break; case 75: - mib.message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n75; + mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n75; break; case 100: - mib.message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n100; + mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n100; break; - default: - mib.message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n6; - break; + AssertFatal(1==0,"Unknown dl_Bandwidth %d\n",N_RB_DL); } - switch (frame_parms->phich_config_common.phich_resource) { - case oneSixth: - mib.message.phich_Config.phich_Resource = 0; - break; - - case half: - mib.message.phich_Config.phich_Resource = 1; - break; - - case one: - mib.message.phich_Config.phich_Resource = 2; - break; - - case two: - mib.message.phich_Config.phich_Resource = 3; - break; - } - - printf("[MIB] systemBandwidth %x, phich_duration %x, phich_resource %x,sfn %x\n", - (uint32_t)mib.message.dl_Bandwidth, - (uint32_t)frame_parms->phich_config_common.phich_duration, - (uint32_t)mib.message.phich_Config.phich_Resource, + AssertFatal(phich_Resource <= PHICH_Config__phich_Resource_two,"Illegal phich_Resource\n"); + mib->message.phich_Config.phich_Resource = phich_Resource; + AssertFatal(phich_duration <= PHICH_Config__phich_Duration_extended,"Illegal phich_Duration\n"); + mib->message.phich_Config.phich_Duration = phich_duration; + LOG_I(RRC,"[MIB] systemBandwidth %x, phich_duration %x, phich_resource %x,sfn %x\n", + (uint32_t)mib->message.dl_Bandwidth, + (uint32_t)phich_duration, + (uint32_t)phich_Resource, (uint32_t)sfn); - mib.message.phich_Config.phich_Duration = frame_parms->phich_config_common.phich_duration; - mib.message.systemFrameNumber.buf = &sfn; - mib.message.systemFrameNumber.size = 1; - mib.message.systemFrameNumber.bits_unused=0; - mib.message.spare.buf = (uint8_t *)&spare; - mib.message.spare.size = 2; - mib.message.spare.bits_unused = 6; // This makes a spare of 10 bits + + mib->message.systemFrameNumber.buf = &sfn; + mib->message.systemFrameNumber.size = 1; + mib->message.systemFrameNumber.bits_unused=0; + mib->message.spare.buf = (uint8_t *)spare; +#ifndef Rel14 + mib->message.spare.size = 2; + mib->message.spare.bits_unused = 6; // This makes a spare of 10 bits +#else + mib->message.spare.size = 1; + mib->message.spare.bits_unused = 3; // This makes a spare of 5 bits + mib->message.schedulingInfoSIB1_BR_r13 = 0; // turn off eMTC +#endif enc_rval = uper_encode_to_buffer(&asn_DEF_BCCH_BCH_Message, - (void*)&mib, - buffer, - 100); + (void*)mib, + carrier->MIB, + 24); AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded); + /* #if defined(ENABLE_ITTI) # if !defined(DISABLE_XER_SPRINT) { @@ -386,31 +259,21 @@ uint8_t do_MIB(uint8_t Mod_id, LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame, msg_p->ittiMsg.rrc_dl_bcch.size = message_string_size; memcpy(&msg_p->ittiMsg.rrc_dl_bcch.text, message_string, message_string_size); - itti_send_msg_to_task(TASK_UNKNOWN, Mod_id, msg_p); + itti_send_msg_to_task(TASK_UNKNOWN, enb_module_idP, msg_p); } } # endif #endif - + */ if (enc_rval.encoded==-1) { return(-1); } return((enc_rval.encoded+7)/8); - /* - printf("MIB: %x ((MIB>>10)&63)+(MIB&3<<6)=SFN %x, MIB>>2&3 = phich_resource %d, MIB>>4&1 = phich_duration %d, MIB>>5&7 = system_bandwidth %d)\n",*(uint32_t *)buffer, - (((*(uint32_t *)buffer)>>10)&0x3f)+(((*(uint32_t *)buffer)&3)<<6), - ((*(uint32_t *)buffer)>>2)&0x3, - ((*(uint32_t *)buffer)>>4)&0x1, - ((*(uint32_t *)buffer)>>5)&0x7 - ); - */ } -uint8_t do_SIB1(uint8_t Mod_id, int CC_id, - LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer, - BCCH_DL_SCH_Message_t *bcch_message, - SystemInformationBlockType1_t **sib1 +uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier, + int Mod_id,int CC_id #if defined(ENABLE_ITTI) , RrcConfigurationReq *configuration #endif @@ -424,6 +287,11 @@ uint8_t do_SIB1(uint8_t Mod_id, int CC_id, SchedulingInfo_t schedulingInfo; SIB_Type_t sib_type; + uint8_t *buffer = carrier->SIB1; + BCCH_DL_SCH_Message_t *bcch_message = &carrier->siblock1; + SystemInformationBlockType1_t **sib1 = &carrier->sib1; + + memset(bcch_message,0,sizeof(BCCH_DL_SCH_Message_t)); bcch_message->message.present = BCCH_DL_SCH_MessageType_PR_c1; bcch_message->message.choice.c1.present = BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1; @@ -559,14 +427,14 @@ uint8_t do_SIB1(uint8_t Mod_id, int CC_id, #if defined(ENABLE_ITTI) configuration->tdd_config[CC_id]; #else - frame_parms->tdd_config; + 3; #endif (*sib1)->tdd_Config->specialSubframePatterns = #if defined(ENABLE_ITTI) configuration->tdd_config_s[CC_id]; #else - frame_parms->tdd_config_S; + 0; #endif } @@ -596,16 +464,13 @@ uint8_t do_SIB1(uint8_t Mod_id, int CC_id, msg_p = itti_alloc_new_message_sized (TASK_RRC_ENB, RRC_DL_BCCH, message_string_size + sizeof (IttiMsgText)); msg_p->ittiMsg.rrc_dl_bcch.size = message_string_size; memcpy(&msg_p->ittiMsg.rrc_dl_bcch.text, message_string, message_string_size); - itti_send_msg_to_task(TASK_UNKNOWN, Mod_id, msg_p); } } # endif #endif -#ifdef USER_MODE - LOG_D(RRC,"[eNB] SystemInformationBlockType1 Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); -#endif + LOG_D(RRC,"[eNB] SystemInformationBlockType1 Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); if (enc_rval.encoded==-1) { return(-1); @@ -615,24 +480,15 @@ uint8_t do_SIB1(uint8_t Mod_id, int CC_id, } uint8_t do_SIB23(uint8_t Mod_id, - int CC_id, - LTE_DL_FRAME_PARMS *frame_parms, - uint8_t *buffer, - BCCH_DL_SCH_Message_t *bcch_message, - SystemInformationBlockType2_t **sib2, - SystemInformationBlockType3_t **sib3 -#ifdef Rel10 - , - SystemInformationBlockType13_r9_t **sib13, - uint8_t MBMS_flag -#endif + + int CC_id #if defined(ENABLE_ITTI) , RrcConfigurationReq *configuration #endif ) { struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib2_part,*sib3_part; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib13_part; MBSFN_SubframeConfigList_t *MBSFNSubframeConfigList; MBSFN_AreaInfoList_r9_t *MBSFNArea_list; @@ -640,6 +496,15 @@ uint8_t do_SIB23(uint8_t Mod_id, #endif asn_enc_rval_t enc_rval; + uint8_t *buffer = RC.rrc[Mod_id]->carrier[CC_id].SIB23; + BCCH_DL_SCH_Message_t *bcch_message = &RC.rrc[Mod_id]->carrier[CC_id].systemInformation; + SystemInformationBlockType2_t **sib2 = &RC.rrc[Mod_id]->carrier[CC_id].sib2; + SystemInformationBlockType3_t **sib3 = &RC.rrc[Mod_id]->carrier[CC_id].sib3; +#if defined(Rel10) || defined(Rel14) + SystemInformationBlockType13_r9_t **sib13 = &RC.rrc[Mod_id]->carrier[CC_id].sib13; + uint8_t MBMS_flag = RC.rrc[Mod_id]->carrier[CC_id].MBMS_flag; +#endif + if (bcch_message) { memset(bcch_message,0,sizeof(BCCH_DL_SCH_Message_t)); } else { @@ -657,7 +522,7 @@ uint8_t do_SIB23(uint8_t Mod_id, exit(-1); } -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) LOG_I(RRC,"[eNB %d] Configuration SIB2/3, MBMS = %d\n", Mod_id, MBMS_flag); #else LOG_I(RRC,"[eNB %d] Configuration SIB2/3\n", Mod_id); @@ -673,7 +538,7 @@ uint8_t do_SIB23(uint8_t Mod_id, *sib2 = &sib2_part->choice.sib2; *sib3 = &sib3_part->choice.sib3; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) if (MBMS_flag > 0) { sib13_part = CALLOC(1,sizeof(struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member)); @@ -687,7 +552,7 @@ uint8_t do_SIB23(uint8_t Mod_id, // sib2 (*sib2)->ac_BarringInfo = NULL; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) #if 0 (*sib2)->ssac_BarringForMMTEL_Voice_r9 = NULL; (*sib2)->ssac_BarringForMMTEL_Video_r9 = NULL; @@ -776,13 +641,13 @@ uint8_t do_SIB23(uint8_t Mod_id, = configuration->pucch_nRB_CQI[CC_id]; (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nCS_AN = configuration->pucch_nCS_AN[CC_id]; -#ifndef Rel10 +#if !defined(Rel10) && !defined(Rel14) (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.n1PUCCH_AN = configuration->pucch_n1_AN[CC_id]; #endif // SRS Config - if (configuration->srs_enable[CC_id]) { + if (configuration->srs_enable[CC_id]==1) { (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present = SoundingRS_UL_ConfigCommon_PR_setup; (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_BandwidthConfig @@ -799,7 +664,9 @@ uint8_t do_SIB23(uint8_t Mod_id, } else { (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts = NULL; } + RC.rrc[Mod_id]->srs_enable[CC_id] = 1; } else { + RC.rrc[Mod_id]->srs_enable[CC_id] = 0; (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present=SoundingRS_UL_ConfigCommon_PR_release; (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.release=0; } @@ -871,12 +738,8 @@ uint8_t do_SIB23(uint8_t Mod_id, // PDSCH-Config (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower=0; // corresponds to 24.7 dBm 5 MHz/ 27.7 10 MHz/ 30.7 20 MHz - if (frame_parms->mode1_flag==1) { - (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b=0; - } else { - (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b=1; - } + (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b=0; // PUSCH-Config (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB=1; @@ -936,7 +799,7 @@ uint8_t do_SIB23(uint8_t Mod_id, (*sib2)->freqInfo.ul_Bandwidth = NULL; // (*sib2)->mbsfn_SubframeConfigList = NULL; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) if (MBMS_flag > 0) { LOG_I(RRC,"Adding MBSFN subframe Configuration 1 to SIB2\n"); @@ -954,11 +817,7 @@ uint8_t do_SIB23(uint8_t Mod_id, sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.size= 1; sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.bits_unused= 2; - if (frame_parms->frame_type == TDD) { - sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x08<<2;// shift 2 cuz 2last bits are unused. - } else { /// 111000 - sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x38<<2; - } + sib2_mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x38<<2; ASN_SEQUENCE_ADD(&MBSFNSubframeConfigList->list,sib2_mbsfn_SubframeConfig1); @@ -975,11 +834,8 @@ uint8_t do_SIB23(uint8_t Mod_id, sib2_mbsfn_SubframeConfig2->subframeAllocation.choice.oneFrame.size= 1; sib2_mbsfn_SubframeConfig2->subframeAllocation.choice.oneFrame.bits_unused= 2; - if (frame_parms->frame_type == TDD) { - sib2_mbsfn_SubframeConfig2->subframeAllocation.choice.oneFrame.buf[0]=0x08<<2;// shift 2 cuz 2last bits are unused. - } else { ///000111 - sib2_mbsfn_SubframeConfig2->subframeAllocation.choice.oneFrame.buf[0]=0x07<<2; - } + sib2_mbsfn_SubframeConfig2->subframeAllocation.choice.oneFrame.buf[0]=0x07<<2; + ASN_SEQUENCE_ADD(&MBSFNSubframeConfigList->list,sib2_mbsfn_SubframeConfig2); } @@ -992,7 +848,7 @@ uint8_t do_SIB23(uint8_t Mod_id, (*sib2)->timeAlignmentTimerCommon=TimeAlignmentTimer_infinity;//TimeAlignmentTimer_sf5120; /// (*SIB3) -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) (*sib3)->ext1 = NULL; #if 0 (*sib3)->s_IntraSearch_v920=NULL; @@ -1027,7 +883,7 @@ uint8_t do_SIB23(uint8_t Mod_id, // SIB13 // fill in all elements of SIB13 if present -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) if (MBMS_flag > 0 ) { // Notification for mcch change @@ -1050,11 +906,8 @@ uint8_t do_SIB23(uint8_t Mod_id, MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.buf= MALLOC(1); MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.size= 1; - if (frame_parms->frame_type == TDD) {//TDD: SF7 - MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.buf[0]=0x08<<2; - } else { - MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.buf[0]=0x20<<2; // FDD: SF1 - } + MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.buf[0]=0x20<<2; // FDD: SF1 + MBSFN_Area1->mcch_Config_r9.sf_AllocInfo_r9.bits_unused= 2; @@ -1076,11 +929,8 @@ uint8_t do_SIB23(uint8_t Mod_id, MBSFN_Area2->mcch_Config_r9.sf_AllocInfo_r9.size= 1; MBSFN_Area2->mcch_Config_r9.sf_AllocInfo_r9.bits_unused= 2; - if (frame_parms->frame_type == TDD) {//TDD: SF7 - MBSFN_Area2->mcch_Config_r9.sf_AllocInfo_r9.buf[0]=0x08<<2; - } else { - MBSFN_Area2->mcch_Config_r9.sf_AllocInfo_r9.buf[0]=0x04<<2; // FDD: SF6 - } + MBSFN_Area2->mcch_Config_r9.sf_AllocInfo_r9.buf[0]=0x04<<2; // FDD: SF6 + MBSFN_Area2->mcch_Config_r9.signallingMCS_r9= MBSFN_AreaInfo_r9__mcch_Config_r9__signallingMCS_r9_n7; @@ -1109,7 +959,7 @@ uint8_t do_SIB23(uint8_t Mod_id, sib2_part); ASN_SEQUENCE_ADD(&bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list, sib3_part); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) if (MBMS_flag > 0) { ASN_SEQUENCE_ADD(&bcch_message->message.choice.c1.choice.systemInformation.criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list,sib13_part); @@ -1148,9 +998,7 @@ uint8_t do_SIB23(uint8_t Mod_id, # endif #endif -#ifdef USER_MODE - LOG_D(RRC,"[eNB] SystemInformation Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); -#endif + LOG_D(RRC,"[eNB] SystemInformation Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); if (enc_rval.encoded==-1) { msg("[RRC] ASN1 : SI encoding failed for SIB23\n"); @@ -1237,9 +1085,7 @@ uint8_t do_RRCConnectionRequest(uint8_t Mod_id, uint8_t *buffer,uint8_t *rv) # endif #endif -#ifdef USER_MODE - LOG_D(RRC,"[UE] RRCConnectionRequest Encoded %d bits (%d bytes), ecause %d\n",enc_rval.encoded,(enc_rval.encoded+7)/8,ecause); -#endif + LOG_D(RRC,"[UE] RRCConnectionRequest Encoded %zd bits (%zd bytes), ecause %d\n",enc_rval.encoded,(enc_rval.encoded+7)/8,ecause); return((enc_rval.encoded+7)/8); @@ -1268,7 +1114,10 @@ uint8_t do_RRCConnectionSetupComplete(uint8_t Mod_id, uint8_t *buffer, const uin rrcConnectionSetupComplete->criticalExtensions.choice.c1.choice.rrcConnectionSetupComplete_r8.nonCriticalExtension=CALLOC(1, sizeof(*rrcConnectionSetupComplete->criticalExtensions.choice.c1.choice.rrcConnectionSetupComplete_r8.nonCriticalExtension)); - rrcConnectionSetupComplete->criticalExtensions.choice.c1.choice.rrcConnectionSetupComplete_r8.selectedPLMN_Identity=2; + if(usim_test == 0) + rrcConnectionSetupComplete->criticalExtensions.choice.c1.choice.rrcConnectionSetupComplete_r8.selectedPLMN_Identity= 2; + else + rrcConnectionSetupComplete->criticalExtensions.choice.c1.choice.rrcConnectionSetupComplete_r8.selectedPLMN_Identity= 1; rrcConnectionSetupComplete->criticalExtensions.choice.c1.choice.rrcConnectionSetupComplete_r8.registeredMME = NULL;//calloc(1,sizeof(*rrcConnectionSetupComplete->criticalExtensions.choice.c1.choice.rrcConnectionSetupComplete_r8.registeredMME)); @@ -1317,9 +1166,7 @@ uint8_t do_RRCConnectionSetupComplete(uint8_t Mod_id, uint8_t *buffer, const uin # endif #endif -#ifdef USER_MODE - LOG_D(RRC,"RRCConnectionSetupComplete Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); -#endif + LOG_D(RRC,"RRCConnectionSetupComplete Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); return((enc_rval.encoded+7)/8); @@ -1379,9 +1226,7 @@ do_RRCConnectionReconfigurationComplete( # endif #endif -#ifdef USER_MODE - LOG_D(RRC,"RRCConnectionReconfigurationComplete Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); -#endif + LOG_D(RRC,"RRCConnectionReconfigurationComplete Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); return((enc_rval.encoded+7)/8); } @@ -1392,17 +1237,19 @@ uint8_t do_RRCConnectionSetup( const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, + int CC_id, uint8_t* const buffer, - const uint8_t transmission_mode, - const uint8_t Transaction_id, - const LTE_DL_FRAME_PARMS* const frame_parms, + const uint8_t transmission_mode, + const uint8_t Transaction_id, SRB_ToAddModList_t **SRB_configList, struct PhysicalConfigDedicated **physicalConfigDedicated) { asn_enc_rval_t enc_rval; uint8_t ecause=0; - + eNB_RRC_INST *rrc = RC.rrc[ctxt_pP->module_id]; + rrc_eNB_carrier_data_t *carrier = &rrc->carrier[CC_id]; + long* logicalchannelgroup = NULL; struct SRB_ToAddMod* SRB1_config = NULL; struct SRB_ToAddMod__rlc_Config* SRB1_rlc_config = NULL; @@ -1445,12 +1292,12 @@ do_RRCConnectionSetup( SRB1_rlc_config->present = SRB_ToAddMod__rlc_Config_PR_explicitValue; SRB1_rlc_config->choice.explicitValue.present=RLC_Config_PR_am; #if defined(ENABLE_ITTI) - SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.t_PollRetransmit = enb_properties.properties[ctxt_pP->module_id]->srb1_timer_poll_retransmit; - SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollPDU = enb_properties.properties[ctxt_pP->module_id]->srb1_poll_pdu; - SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollByte = enb_properties.properties[ctxt_pP->module_id]->srb1_poll_byte; - SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.maxRetxThreshold = enb_properties.properties[ctxt_pP->module_id]->srb1_max_retx_threshold; - SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_Reordering = enb_properties.properties[ctxt_pP->module_id]->srb1_timer_reordering; - SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_StatusProhibit = enb_properties.properties[ctxt_pP->module_id]->srb1_timer_status_prohibit; + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.t_PollRetransmit = rrc->srb1_timer_poll_retransmit; + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollPDU = rrc->srb1_poll_pdu; + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollByte = rrc->srb1_poll_byte; + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.maxRetxThreshold = rrc->srb1_max_retx_threshold; + SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_Reordering = rrc->srb1_timer_reordering; + SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_StatusProhibit = rrc->srb1_timer_status_prohibit; #else SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.t_PollRetransmit = T_PollRetransmit_ms20;; SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollPDU = PollPDU_p4;; @@ -1496,22 +1343,26 @@ do_RRCConnectionSetup( physicalConfigDedicated2->tpc_PDCCH_ConfigPUCCH = CALLOC(1,sizeof(*physicalConfigDedicated2->tpc_PDCCH_ConfigPUCCH)); physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH = CALLOC(1,sizeof(*physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH)); physicalConfigDedicated2->cqi_ReportConfig = CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig)); - physicalConfigDedicated2->soundingRS_UL_ConfigDedicated = NULL;//CALLOC(1,sizeof(*physicalConfigDedicated2->soundingRS_UL_ConfigDedicated)); + if (rrc->srs_enable[CC_id]==1) + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated = CALLOC(1,sizeof(*physicalConfigDedicated2->soundingRS_UL_ConfigDedicated)); + else + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated = NULL; physicalConfigDedicated2->antennaInfo = CALLOC(1,sizeof(*physicalConfigDedicated2->antennaInfo)); physicalConfigDedicated2->schedulingRequestConfig = CALLOC(1,sizeof(*physicalConfigDedicated2->schedulingRequestConfig)); -#ifdef CBA - physicalConfigDedicated2->pusch_CBAConfigDedicated_vlola = CALLOC(1,sizeof(*physicalConfigDedicated2->pusch_CBAConfigDedicated_vlola)); -#endif + // PDSCH //assign_enum(&physicalConfigDedicated2->pdsch_ConfigDedicated->p_a, // PDSCH_ConfigDedicated__p_a_dB0); - physicalConfigDedicated2->pdsch_ConfigDedicated->p_a= PDSCH_ConfigDedicated__p_a_dB0; + if (carrier->p_eNB==2) + physicalConfigDedicated2->pdsch_ConfigDedicated->p_a= PDSCH_ConfigDedicated__p_a_dB_3; + else + physicalConfigDedicated2->pdsch_ConfigDedicated->p_a= PDSCH_ConfigDedicated__p_a_dB0; // PUCCH physicalConfigDedicated2->pucch_ConfigDedicated->ackNackRepetition.present=PUCCH_ConfigDedicated__ackNackRepetition_PR_release; physicalConfigDedicated2->pucch_ConfigDedicated->ackNackRepetition.choice.release=0; - if (frame_parms->frame_type == FDD) { + if (carrier->sib1->tdd_Config == NULL) { physicalConfigDedicated2->pucch_ConfigDedicated->tdd_AckNackFeedbackMode=NULL;//PUCCH_ConfigDedicated__tdd_AckNackFeedbackMode_multiplexing; } else { //TDD physicalConfigDedicated2->pucch_ConfigDedicated->tdd_AckNackFeedbackMode= CALLOC(1,sizeof(long)); @@ -1560,15 +1411,17 @@ do_RRCConnectionSetup( // CQI ReportConfig physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic=CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic)); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) *physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic= CQI_ReportModeAperiodic_rm30; #else *physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic=CQI_ReportConfig__cqi_ReportModeAperiodic_rm30; // HLC CQI, no PMI #endif physicalConfigDedicated2->cqi_ReportConfig->nomPDSCH_RS_EPRE_Offset = 0; // 0 dB - physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic=NULL; - /* - physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic=CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic)); + //physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic=NULL; + + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic=CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic)); + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->present = CQI_ReportPeriodic_PR_release; + /* physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->present = CQI_ReportPeriodic_PR_setup; physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex = 0; // n2_pucch physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_pmi_ConfigIndex = 0; // Icqi/pmi @@ -1580,19 +1433,48 @@ do_RRCConnectionSetup( */ //soundingRS-UL-ConfigDedicated - /* - physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->present = SoundingRS_UL_ConfigDedicated_PR_setup; - assign_enum(&physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth, - SoundingRS_UL_ConfigDedicated__setup__srs_Bandwidth_bw0); - assign_enum(&physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth, - SoundingRS_UL_ConfigDedicated__setup__srs_HoppingBandwidth_hbw0); - physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition=0; - physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.duration=1; - physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex=1; - physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb=0; - assign_enum(&physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift, - SoundingRS_UL_ConfigDedicated__setup__cyclicShift_cs0); - */ + if (rrc->srs_enable[CC_id]==1) { + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->present = SoundingRS_UL_ConfigDedicated_PR_setup; + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.srs_Bandwidth = + SoundingRS_UL_ConfigDedicated__setup__srs_Bandwidth_bw0; + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.srs_HoppingBandwidth = + SoundingRS_UL_ConfigDedicated__setup__srs_HoppingBandwidth_hbw0; + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.freqDomainPosition=0; + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.duration=1; + if (carrier->sib1->tdd_Config==NULL) { // FDD + if (carrier->sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present + == SoundingRS_UL_ConfigCommon_PR_setup) + if (carrier->sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig!=0) + LOG_W(RRC,"This code has been optimized for SRS Subframe Config 0, but current config is %zd. Expect undefined behaviour!\n", + carrier->sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig); + if (ue_context_pP->local_uid >=20) + LOG_W(RRC,"This code has been optimized for up to 10 UEs, but current UE_id is %d. Expect undefined behaviour!\n", + ue_context_pP->local_uid); + //the current code will allow for 20 UEs - to be revised for more + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex=7+ue_context_pP->local_uid/2; + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb= ue_context_pP->local_uid%2; + } + else { + if (carrier->sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present + == SoundingRS_UL_ConfigCommon_PR_setup) + if (carrier->sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig!=7) { + LOG_W(RRC,"This code has been optimized for SRS Subframe Config 7 and TDD config 3, but current configs are %zd and %zd. Expect undefined behaviour!\n", + carrier->sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig, + carrier->sib1->tdd_Config->subframeAssignment); + } + if (ue_context_pP->local_uid >=6) + LOG_W(RRC,"This code has been optimized for up to 6 UEs, but current UE_id is %d. Expect undefined behaviour!\n", + ue_context_pP->local_uid); + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex=17+ue_context_pP->local_uid/2; + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb= ue_context_pP->local_uid%2; + } + LOG_W(RRC,"local UID %d, srs ConfigIndex %zd, TransmissionComb %zd\n",ue_context_pP->local_uid, + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.srs_ConfigIndex, + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.transmissionComb); + + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated->choice.setup.cyclicShift= + SoundingRS_UL_ConfigDedicated__setup__cyclicShift_cs0; + } //AntennaInfoDedicated @@ -1602,6 +1484,8 @@ do_RRCConnectionSetup( // AntennaInfoDedicated__transmissionMode_tm2); switch (transmission_mode) { + default: + LOG_W(RRC,"At RRCConnectionSetup Transmission mode can only take values 1 or 2! Defaulting to 1!\n"); case 1: physicalConfigDedicated2->antennaInfo->choice.explicitValue.transmissionMode= AntennaInfoDedicated__transmissionMode_tm1; break; @@ -1609,7 +1493,7 @@ do_RRCConnectionSetup( case 2: physicalConfigDedicated2->antennaInfo->choice.explicitValue.transmissionMode= AntennaInfoDedicated__transmissionMode_tm2; break; - + /* case 3: physicalConfigDedicated2->antennaInfo->choice.explicitValue.transmissionMode= AntennaInfoDedicated__transmissionMode_tm3; physicalConfigDedicated2->antennaInfo->choice.explicitValue.codebookSubsetRestriction= CALLOC(1, @@ -1634,6 +1518,11 @@ do_RRCConnectionSetup( case 6: physicalConfigDedicated2->antennaInfo->choice.explicitValue.transmissionMode= AntennaInfoDedicated__transmissionMode_tm6; break; + + case 7: + physicalConfigDedicated2->antennaInfo->choice.explicitValue.transmissionMode= AntennaInfoDedicated__transmissionMode_tm7; + break; + */ } @@ -1643,12 +1532,12 @@ do_RRCConnectionSetup( // SchedulingRequestConfig physicalConfigDedicated2->schedulingRequestConfig->present = SchedulingRequestConfig_PR_setup; - physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = 3;//ue_context_pP->local_uid; + physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = 71 - ue_context_pP->local_uid/10;//ue_context_pP->local_uid; - if (frame_parms->frame_type == 0) { // FDD + if (carrier->sib1->tdd_Config == NULL) { // FDD physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex = 5+(ue_context_pP->local_uid%10); // Isr = 5 (every 10 subframes, offset=2+UE_id mod3) } else { - switch (frame_parms->tdd_config) { + switch (carrier->sib1->tdd_Config->subframeAssignment) { case 1: physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex = 7+(ue_context_pP->local_uid&1)+(( ue_context_pP->local_uid&3)>>1)*5; // Isr = 5 (every 10 subframes, offset=2 for UE0, 3 for UE1, 7 for UE2, 8 for UE3 , 2 for UE4 etc..) @@ -1724,10 +1613,8 @@ do_RRCConnectionSetup( # endif #endif -#ifdef USER_MODE - LOG_D(RRC,"RRCConnectionSetup Encoded %d bits (%d bytes), ecause %d\n", + LOG_D(RRC,"RRCConnectionSetup Encoded %zd bits (%zd bytes), ecause %d\n", enc_rval.encoded,(enc_rval.encoded+7)/8,ecause); -#endif // FREEMEM(SRB_list); // free(SRB1_config); @@ -1764,7 +1651,7 @@ do_SecurityModeCommand( SecurityModeCommand__criticalExtensions__c1_PR_securityModeCommand_r8; // the two following information could be based on the mod_id dl_dcch_msg.message.choice.c1.choice.securityModeCommand.criticalExtensions.choice.c1.choice.securityModeCommand_r8.securityConfigSMC.securityAlgorithmConfig.cipheringAlgorithm - = (e_SecurityAlgorithmConfig__cipheringAlgorithm)cipheringAlgorithm; + = (CipheringAlgorithm_r12_t)cipheringAlgorithm; dl_dcch_msg.message.choice.c1.choice.securityModeCommand.criticalExtensions.choice.c1.choice.securityModeCommand_r8.securityConfigSMC.securityAlgorithmConfig.integrityProtAlgorithm = (e_SecurityAlgorithmConfig__integrityProtAlgorithm)integrityProtAlgorithm; @@ -1797,13 +1684,11 @@ do_SecurityModeCommand( # endif #endif -#ifdef USER_MODE - LOG_D(RRC,"[eNB %d] securityModeCommand for UE %x Encoded %d bits (%d bytes)\n", + LOG_D(RRC,"[eNB %d] securityModeCommand for UE %x Encoded %zd bits (%zd bytes)\n", ctxt_pP->module_id, ctxt_pP->rnti, enc_rval.encoded, (enc_rval.encoded+7)/8); -#endif if (enc_rval.encoded==-1) { LOG_E(RRC,"[eNB %d] ASN1 : securityModeCommand encoding failed for UE %x\n", @@ -1875,13 +1760,11 @@ do_UECapabilityEnquiry( # endif #endif -#ifdef USER_MODE - LOG_D(RRC,"[eNB %d] UECapabilityRequest for UE %x Encoded %d bits (%d bytes)\n", + LOG_D(RRC,"[eNB %d] UECapabilityRequest for UE %x Encoded %zd bits (%zd bytes)\n", ctxt_pP->module_id, ctxt_pP->rnti, enc_rval.encoded, (enc_rval.encoded+7)/8); -#endif if (enc_rval.encoded==-1) { LOG_E(RRC,"[eNB %d] ASN1 : UECapabilityRequest encoding failed for UE %x\n", @@ -1917,7 +1800,7 @@ do_RRCConnectionReconfiguration( struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) , SCellToAddMod_r10_t *SCell_config #endif ) @@ -2015,7 +1898,7 @@ do_RRCConnectionReconfiguration( (void*)&dl_dcch_msg, buffer, RRC_BUF_SIZE); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %zd)!\n", enc_rval.failed_type->name, enc_rval.encoded); #ifdef XER_PRINT @@ -2041,13 +1924,219 @@ do_RRCConnectionReconfiguration( # endif #endif - //#ifdef USER_MODE - LOG_I(RRC,"RRCConnectionReconfiguration Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); + LOG_I(RRC,"RRCConnectionReconfiguration Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); // for (i=0;i<30;i++) // msg("%x.",buffer[i]); // msg("\n"); - //#endif + + return((enc_rval.encoded+7)/8); +} + +//------------------------------------------------------------------------------ +uint8_t +do_RRCConnectionReestablishment( + const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + int CC_id, + uint8_t* const buffer, + const uint8_t transmission_mode, + const uint8_t Transaction_id, + SRB_ToAddModList_t **SRB_configList, + struct PhysicalConfigDedicated **physicalConfigDedicated) +{ + asn_enc_rval_t enc_rval; + + long* logicalchannelgroup = NULL; + struct SRB_ToAddMod* SRB1_config = NULL; + struct SRB_ToAddMod* SRB2_config = NULL; + struct SRB_ToAddMod__rlc_Config* SRB1_rlc_config = NULL; + struct SRB_ToAddMod__logicalChannelConfig* SRB1_lchan_config = NULL; + struct LogicalChannelConfig__ul_SpecificParameters* SRB1_ul_SpecificParameters = NULL; + eNB_RRC_INST *rrc = RC.rrc[ctxt_pP->module_id]; + +#ifdef CBA + struct PUSCH_CBAConfigDedicated_vlola* pusch_CBAConfigDedicated_vlola = NULL; + long* betaOffset_CBA_Index = NULL; + long* cShift_CBA = NULL; +#endif + PhysicalConfigDedicated_t* physicalConfigDedicated2 = NULL; + + DL_CCCH_Message_t dl_ccch_msg; + + RRCConnectionReestablishment_t* rrcConnectionReestablishment = NULL; + + int i = 0; + SRB_ToAddModList_t **SRB_configList2 = NULL; + SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[Transaction_id]; + if (*SRB_configList2) { + free(*SRB_configList2); + } + *SRB_configList2 = CALLOC(1, sizeof(SRB_ToAddModList_t)); + + memset((void *)&dl_ccch_msg, 0, sizeof(DL_CCCH_Message_t)); + dl_ccch_msg.message.present = DL_CCCH_MessageType_PR_c1; + dl_ccch_msg.message.choice.c1.present = DL_CCCH_MessageType__c1_PR_rrcConnectionReestablishment; + rrcConnectionReestablishment = &dl_ccch_msg.message.choice.c1.choice.rrcConnectionReestablishment; + + // RRCConnectionReestablishment + // Configure SRB1 + + + // get old configuration of SRB2 + if (*SRB_configList != NULL) { + for (i = 0; (i < (*SRB_configList)->list.count) && (i < 3); i++) { + LOG_D(RRC, "(*SRB_configList)->list.array[%d]->srb_Identity=%ld\n", + i, (*SRB_configList)->list.array[i]->srb_Identity); + if ((*SRB_configList)->list.array[i]->srb_Identity == 2 ){ + SRB2_config = (*SRB_configList)->list.array[i]; + } else if ((*SRB_configList)->list.array[i]->srb_Identity == 1 ){ + SRB1_config = (*SRB_configList)->list.array[i]; + } + } + } + + if (SRB1_config == NULL) { + // default SRB1 configuration + LOG_W(RRC,"SRB1 configuration does not exist in SRB configuration list, use default\n"); + /// SRB1 + SRB1_config = CALLOC(1, sizeof(*SRB1_config)); + + SRB1_config->srb_Identity = 1; + SRB1_rlc_config = CALLOC(1, sizeof(*SRB1_rlc_config)); + SRB1_config->rlc_Config = SRB1_rlc_config; + + SRB1_rlc_config->present = SRB_ToAddMod__rlc_Config_PR_explicitValue; + SRB1_rlc_config->choice.explicitValue.present=RLC_Config_PR_am; + #if defined(ENABLE_ITTI) + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.t_PollRetransmit = rrc->srb1_timer_poll_retransmit; + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollPDU = rrc->srb1_poll_pdu; + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollByte = rrc->srb1_poll_byte; + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.maxRetxThreshold = rrc->srb1_max_retx_threshold; + SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_Reordering = rrc->srb1_timer_reordering; + SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_StatusProhibit = rrc->srb1_timer_status_prohibit; + #else + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.t_PollRetransmit = T_PollRetransmit_ms20;; + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollPDU = PollPDU_p4;; + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollByte = PollByte_kBinfinity; + SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.maxRetxThreshold = UL_AM_RLC__maxRetxThreshold_t8; + SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_Reordering = T_Reordering_ms35; + SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_StatusProhibit = T_StatusProhibit_ms0; + #endif + + SRB1_lchan_config = CALLOC(1, sizeof(*SRB1_lchan_config)); + SRB1_config->logicalChannelConfig = SRB1_lchan_config; + + SRB1_lchan_config->present = SRB_ToAddMod__logicalChannelConfig_PR_explicitValue; + SRB1_ul_SpecificParameters = CALLOC(1, sizeof(*SRB1_ul_SpecificParameters)); + + SRB1_lchan_config->choice.explicitValue.ul_SpecificParameters = SRB1_ul_SpecificParameters; + SRB1_ul_SpecificParameters->priority = 1; + + //assign_enum(&SRB1_ul_SpecificParameters->prioritisedBitRate,LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity); + SRB1_ul_SpecificParameters->prioritisedBitRate=LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; + + //assign_enum(&SRB1_ul_SpecificParameters->bucketSizeDuration,LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50); + SRB1_ul_SpecificParameters->bucketSizeDuration=LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; + + logicalchannelgroup = CALLOC(1, sizeof(long)); + *logicalchannelgroup = 0; + SRB1_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup; + } + + if (SRB2_config == NULL) { + LOG_W(RRC,"SRB2 configuration does not exist in SRB configuration list\n"); + } else { + ASN_SEQUENCE_ADD(&(*SRB_configList2)->list, SRB2_config); + } + + if (*SRB_configList) { + free(*SRB_configList); + } + + *SRB_configList = CALLOC(1, sizeof(SRB_ToAddModList_t)); + + ASN_SEQUENCE_ADD(&(*SRB_configList)->list,SRB1_config); + + physicalConfigDedicated2 = *physicalConfigDedicated; + + rrcConnectionReestablishment->rrc_TransactionIdentifier = Transaction_id; + rrcConnectionReestablishment->criticalExtensions.present = RRCConnectionReestablishment__criticalExtensions_PR_c1; + rrcConnectionReestablishment->criticalExtensions.choice.c1.present = RRCConnectionReestablishment__criticalExtensions__c1_PR_rrcConnectionReestablishment_r8; + rrcConnectionReestablishment->criticalExtensions.choice.c1.choice.rrcConnectionReestablishment_r8.radioResourceConfigDedicated.srb_ToAddModList = *SRB_configList; + rrcConnectionReestablishment->criticalExtensions.choice.c1.choice.rrcConnectionReestablishment_r8.radioResourceConfigDedicated.drb_ToAddModList = NULL; + rrcConnectionReestablishment->criticalExtensions.choice.c1.choice.rrcConnectionReestablishment_r8.radioResourceConfigDedicated.drb_ToReleaseList = NULL; + rrcConnectionReestablishment->criticalExtensions.choice.c1.choice.rrcConnectionReestablishment_r8.radioResourceConfigDedicated.sps_Config = NULL; + rrcConnectionReestablishment->criticalExtensions.choice.c1.choice.rrcConnectionReestablishment_r8.radioResourceConfigDedicated.physicalConfigDedicated = physicalConfigDedicated2; + rrcConnectionReestablishment->criticalExtensions.choice.c1.choice.rrcConnectionReestablishment_r8.radioResourceConfigDedicated.mac_MainConfig = NULL; + + uint8_t KeNB_star[32] = { 0 }; + uint16_t pci = rrc->carrier[CC_id].physCellId; + uint32_t earfcn_dl = (uint32_t)freq_to_arfcn10(RC.mac[ctxt_pP->module_id]->common_channels[CC_id].eutra_band, + rrc->carrier[CC_id].dl_CarrierFreq); + bool is_rel8_only = true; + if (earfcn_dl > 65535) { + is_rel8_only = false; + } + + LOG_D(RRC, "pci=%d, eutra_band=%d, downlink_frequency=%d, earfcn_dl=%u, is_rel8_only=%s\n", + pci, + RC.mac[ctxt_pP->module_id]->common_channels[CC_id].eutra_band, + rrc->carrier[CC_id].dl_CarrierFreq, + earfcn_dl, + is_rel8_only == true ? "true": "false"); +#if defined(ENABLE_SECURITY) + if (ue_context_pP->ue_context.nh_ncc >= 0) { + derive_keNB_star(ue_context_pP->ue_context.nh, pci, earfcn_dl, is_rel8_only, KeNB_star); + rrcConnectionReestablishment->criticalExtensions.choice.c1.choice.rrcConnectionReestablishment_r8.nextHopChainingCount = ue_context_pP->ue_context.nh_ncc; + } else { // first HO + derive_keNB_star (ue_context_pP->ue_context.kenb, pci, earfcn_dl, is_rel8_only, KeNB_star); + // LG: really 1 + rrcConnectionReestablishment->criticalExtensions.choice.c1.choice.rrcConnectionReestablishment_r8.nextHopChainingCount = 0; + } + + // copy KeNB_star to ue_context_pP->ue_context.kenb + memcpy (ue_context_pP->ue_context.kenb, KeNB_star, 32); + ue_context_pP->ue_context.kenb_ncc = 0; +#else + rrcConnectionReestablishment->criticalExtensions.choice.c1.choice.rrcConnectionReestablishment_r8.nextHopChainingCount = 0; +#endif + + rrcConnectionReestablishment->criticalExtensions.choice.c1.choice.rrcConnectionReestablishment_r8.nonCriticalExtension = NULL; + +#ifdef XER_PRINT + xer_fprint(stdout, &asn_DEF_DL_CCCH_Message, (void*)&dl_ccch_msg); +#endif + enc_rval = uper_encode_to_buffer(&asn_DEF_DL_CCCH_Message, + (void*)&dl_ccch_msg, + buffer, + 100); + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", + enc_rval.failed_type->name, enc_rval.encoded); + +#if defined(ENABLE_ITTI) +# if !defined(DISABLE_XER_SPRINT) + { + char message_string[20000]; + size_t message_string_size; + + if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_DL_CCCH_Message, (void *) &dl_ccch_msg)) > 0) { + MessageDef *msg_p; + + msg_p = itti_alloc_new_message_sized (TASK_RRC_ENB, RRC_DL_CCCH, message_string_size + sizeof (IttiMsgText)); + msg_p->ittiMsg.rrc_dl_ccch.size = message_string_size; + memcpy(&msg_p->ittiMsg.rrc_dl_ccch.text, message_string, message_string_size); + + itti_send_msg_to_task(TASK_UNKNOWN, ctxt_pP->instance, msg_p); + } + } +# endif +#endif + +#ifdef USER_MODE + LOG_D(RRC,"RRCConnectionReestablishment Encoded %zd bits (%zd bytes)\n", + enc_rval.encoded,(enc_rval.encoded+7)/8); +#endif return((enc_rval.encoded+7)/8); } @@ -2102,10 +2191,8 @@ do_RRCConnectionReestablishmentReject( # endif #endif -#ifdef USER_MODE - LOG_D(RRC,"RRCConnectionReestablishmentReject Encoded %d bits (%d bytes)\n", + LOG_D(RRC,"RRCConnectionReestablishmentReject Encoded %zd bits (%zd bytes)\n", enc_rval.encoded,(enc_rval.encoded+7)/8); -#endif return((enc_rval.encoded+7)/8); } @@ -2163,10 +2250,8 @@ do_RRCConnectionReject( # endif #endif -#ifdef USER_MODE - LOG_D(RRC,"RRCConnectionReject Encoded %d bits (%d bytes)\n", + LOG_D(RRC,"RRCConnectionReject Encoded %zd bits (%zd bytes)\n", enc_rval.encoded,(enc_rval.encoded+7)/8); -#endif return((enc_rval.encoded+7)/8); } @@ -2212,9 +2297,8 @@ uint8_t do_RRCConnectionRelease( uint8_t TMGI[5] = {4,3,2,1,0};//TMGI is a string of octet, ref. TS 24.008 fig. 10.5.4a -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) uint8_t do_MBSFNAreaConfig(uint8_t Mod_id, - LTE_DL_FRAME_PARMS *frame_parms, uint8_t sync_area, uint8_t *buffer, MCCH_Message_t *mcch_message, @@ -2226,6 +2310,9 @@ uint8_t do_MBSFNAreaConfig(uint8_t Mod_id, PMCH_Info_r9_t *pmch_Info_1; MBMS_SessionInfo_r9_t *mbms_Session_1; // MBMS_SessionInfo_r9_t *mbms_Session_2; + eNB_RRC_INST *rrc = RC.rrc[Mod_id]; + rrc_eNB_carrier_data_t *carrier = &rrc->carrier[0]; + memset(mcch_message,0,sizeof(MCCH_Message_t)); mcch_message->message.present = MCCH_MessageType_PR_c1; @@ -2247,7 +2334,7 @@ uint8_t do_MBSFNAreaConfig(uint8_t Mod_id, // CURRENTLY WE ARE SUPPORITNG ONLY ONE sf ALLOCATION switch (sync_area) { case 0: - if (frame_parms->frame_type == TDD) {// pattern 001110 for TDD + if (carrier->sib1->tdd_Config != NULL) {// pattern 001110 for TDD mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x08<<2;// shift 2bits cuz 2last bits are unused. } else { //111000 mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x38<<2; @@ -2256,7 +2343,7 @@ uint8_t do_MBSFNAreaConfig(uint8_t Mod_id, break; case 1: - if (frame_parms->frame_type == TDD) { + if (carrier->sib1->tdd_Config != NULL) { mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x08<<2;// shift 2bits cuz 2last bits are unused. } else { // 000111 mbsfn_SubframeConfig1->subframeAllocation.choice.oneFrame.buf[0]=0x07<<2; @@ -2352,9 +2439,7 @@ uint8_t do_MBSFNAreaConfig(uint8_t Mod_id, # endif #endif -#ifdef USER_MODE - LOG_D(RRC,"[eNB] MCCH Message Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); -#endif + LOG_D(RRC,"[eNB] MCCH Message Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); if (enc_rval.encoded==-1) { msg("[RRC] ASN1 : MCCH encoding failed for MBSFNAreaConfiguration\n"); @@ -2384,7 +2469,7 @@ uint8_t do_MeasurementReport(uint8_t Mod_id, uint8_t *buffer,int measid,int phy_ sizeof(*measurementReport->criticalExtensions.choice.c1.choice.measurementReport_r8.nonCriticalExtension)); measurementReport->criticalExtensions.choice.c1.choice.measurementReport_r8.measResults.measId=measid; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) measurementReport->criticalExtensions.choice.c1.choice.measurementReport_r8.measResults.measResultPCell.rsrpResult=rsrp_s; measurementReport->criticalExtensions.choice.c1.choice.measurementReport_r8.measResults.measResultPCell.rsrqResult=rsrq_s; #else @@ -2486,9 +2571,7 @@ uint8_t do_MeasurementReport(uint8_t Mod_id, uint8_t *buffer,int measid,int phy_ # endif #endif -#ifdef USER_MODE printf("Measurement Report Encoded %zu bits (%zu bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); -#endif return((enc_rval.encoded+7)/8); } @@ -2513,6 +2596,7 @@ uint8_t do_DLInformationTransfer(uint8_t Mod_id, uint8_t **buffer, uint8_t trans encoded = uper_encode_to_new_buffer (&asn_DEF_DL_DCCH_Message, NULL, (void*) &dl_dcch_msg, (void **) buffer); + /* #if defined(ENABLE_ITTI) # if !defined(DISABLE_XER_SPRINT) { @@ -2531,10 +2615,78 @@ uint8_t do_DLInformationTransfer(uint8_t Mod_id, uint8_t **buffer, uint8_t trans } # endif #endif + */ return encoded; } +uint8_t do_Paging(uint8_t Mod_id, uint8_t *buffer, ue_paging_identity_t ue_paging_identity, cn_domain_t cn_domain) +{ + LOG_D(RRC, "[eNB %d] do_Paging start\n", Mod_id); + asn_enc_rval_t enc_rval; + + PCCH_Message_t pcch_msg; + PagingRecord_t *paging_record_p; + int j; + + pcch_msg.message.present = PCCH_MessageType_PR_c1; + pcch_msg.message.choice.c1.present = PCCH_MessageType__c1_PR_paging; + + pcch_msg.message.choice.c1.choice.paging.pagingRecordList = CALLOC(1,sizeof(*pcch_msg.message.choice.c1.choice.paging.pagingRecordList)); + + pcch_msg.message.choice.c1.choice.paging.systemInfoModification = NULL; + pcch_msg.message.choice.c1.choice.paging.etws_Indication = NULL; + pcch_msg.message.choice.c1.choice.paging.nonCriticalExtension = NULL; + + asn_set_empty(&pcch_msg.message.choice.c1.choice.paging.pagingRecordList->list); + pcch_msg.message.choice.c1.choice.paging.pagingRecordList->list.count = 0; + + if ((paging_record_p = calloc(1, sizeof(PagingRecord_t))) == NULL) { + /* Possible error on calloc */ + return (-1); + } + + memset(paging_record_p, 0, sizeof(PagingRecord_t)); + + /* convert ue_paging_identity_t to PagingUE_Identity_t */ + if (ue_paging_identity.presenceMask == UE_PAGING_IDENTITY_s_tmsi) { + paging_record_p->ue_Identity.present = PagingUE_Identity_PR_s_TMSI; + MME_CODE_TO_OCTET_STRING(ue_paging_identity.choice.s_tmsi.mme_code, + &paging_record_p->ue_Identity.choice.s_TMSI.mmec); + paging_record_p->ue_Identity.choice.s_TMSI.mmec.bits_unused = 0; + M_TMSI_TO_OCTET_STRING(ue_paging_identity.choice.s_tmsi.m_tmsi, + &paging_record_p->ue_Identity.choice.s_TMSI.m_TMSI); + paging_record_p->ue_Identity.choice.s_TMSI.m_TMSI.bits_unused = 0; + } else if (ue_paging_identity.presenceMask == UE_PAGING_IDENTITY_imsi) { + IMSI_Digit_t imsi_digit[21]; + for (j = 0; j< ue_paging_identity.choice.imsi.length; j++) { /* IMSI size */ + imsi_digit[j] = (IMSI_Digit_t)ue_paging_identity.choice.imsi.buffer[j]; + ASN_SEQUENCE_ADD(&paging_record_p->ue_Identity.choice.imsi.list, &imsi_digit[j]); + } + } + + /* set cn_domain */ + if (cn_domain == CN_DOMAIN_PS) { + paging_record_p->cn_Domain = PagingRecord__cn_Domain_ps; + } else { + paging_record_p->cn_Domain = PagingRecord__cn_Domain_cs; + } + /* add to list */ + ASN_SEQUENCE_ADD(&pcch_msg.message.choice.c1.choice.paging.pagingRecordList->list, paging_record_p); + LOG_D(RRC, "[eNB %d] do_Paging paging_record: cn_Domain %ld, ue_paging_identity.presenceMask %d, PagingRecordList.count %d\n", + Mod_id, paging_record_p->cn_Domain, ue_paging_identity.presenceMask, pcch_msg.message.choice.c1.choice.paging.pagingRecordList->list.count); + + enc_rval = uper_encode_to_buffer(&asn_DEF_PCCH_Message, (void*)&pcch_msg, buffer, RRC_BUF_SIZE); + + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", + enc_rval.failed_type->name, enc_rval.encoded); +#ifdef XER_PRINT + xer_fprint(stdout, &asn_DEF_PCCH_Message, (void*)&pcch_msg); +#endif + + return((enc_rval.encoded+7)/8); +} + uint8_t do_ULInformationTransfer(uint8_t **buffer, uint32_t pdu_length, uint8_t *pdu_buffer) { ssize_t encoded; @@ -2574,7 +2726,7 @@ OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer_fname) char UE_EUTRA_Capability_xer[8192]; size_t size; - LOG_I(RRC,"Allocating %u bytes for UE_EUTRA_Capability\n",sizeof(*UE_EUTRA_Capability)); + LOG_I(RRC,"Allocating %zu bytes for UE_EUTRA_Capability\n",sizeof(*UE_EUTRA_Capability)); UE_EUTRA_Capability = CALLOC(1, sizeof(*UE_EUTRA_Capability)); @@ -2660,6 +2812,20 @@ OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer_fname) // UE_EUTRA_Capability->measParameters.bandListEUTRA.list.count = 0; // no measurements on other bands // UE_EUTRA_Capability->featureGroupIndicators // null + + if(usim_test == 1) + { + // featureGroup is mandatory for CMW tests + // featureGroup is filled only for usim-test mode + BIT_STRING_t *bit_string = CALLOC(1, sizeof(*bit_string)); + char featrG[4] = { 0x00, 0x08, 0x00, 0x04 }; + bit_string->buf = CALLOC(1, 4); + memcpy(bit_string->buf, featrG, 4); + bit_string->size = 4; + bit_string->bits_unused = 0; + UE_EUTRA_Capability->featureGroupIndicators = bit_string; + } + // UE_EUTRA_Capability->interRAT_Parameters // null } else { @@ -2718,7 +2884,7 @@ OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer_fname) #endif UECapability.sdu_size = (enc_rval.encoded + 7) / 8; - LOG_I(PHY, "[RRC]UE Capability encoded, %d bytes (%d bits)\n", + LOG_I(PHY, "[RRC]UE Capability encoded, %d bytes (%zd bits)\n", UECapability.sdu_size, enc_rval.encoded + 7); { char *sdu; @@ -2735,36 +2901,3 @@ OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer_fname) return(&UECapability); } -#ifndef USER_MODE -int init_module(void) -{ - printk("Init asn1_msg module\n"); - - // A non 0 return means init_module failed; module can't be loaded. - return 0; -} - - -void cleanup_module(void) -{ - printk("Stopping asn1_msg module\n"); -} - -EXPORT_SYMBOL(do_SIB1); -EXPORT_SYMBOL(do_SIB23); -EXPORT_SYMBOL(do_RRCConnectionRequest); -EXPORT_SYMBOL(do_RRCConnectionSetupComplete); -EXPORT_SYMBOL(do_RRCConnectionReconfigurationComplete); -EXPORT_SYMBOL(do_RRCConnectionSetup); -EXPORT_SYMBOL(do_RRCConnectionReestablishmentReject); -EXPORT_SYMBOL(do_RRCConnectionReconfiguration); -EXPORT_SYMBOL(asn_DEF_UL_DCCH_Message); -EXPORT_SYMBOL(asn_DEF_UL_CCCH_Message); -EXPORT_SYMBOL(asn_DEF_SystemInformation); -EXPORT_SYMBOL(asn_DEF_DL_DCCH_Message); -EXPORT_SYMBOL(asn_DEF_SystemInformationBlockType1); -EXPORT_SYMBOL(asn_DEF_DL_CCCH_Message); -EXPORT_SYMBOL(uper_decode_complete); -EXPORT_SYMBOL(uper_decode); -EXPORT_SYMBOL(transmission_mode_rrc); -#endif diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.h b/openair2/RRC/LITE/MESSAGES/asn1_msg.h index 9c5e72293a..05396bf727 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.h +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file asn1_msg.h * \brief primitives to build the asn1 messages @@ -36,7 +28,6 @@ * \email: raymond.knopp@eurecom.fr and navid.nikaein@eurecom.fr */ -#ifdef USER_MODE #include #include #include /* for atoi(3) */ @@ -44,9 +35,6 @@ #include /* for strerror(3) */ #include /* for EX_* exit codes */ #include /* for errno */ -#else -#include /* Needed by all modules */ -#endif #include #include /* for _ASN_DEFAULT_STACK_MAX */ @@ -68,19 +56,24 @@ uint16_t get_adjacent_cell_id(uint8_t Mod_id,uint8_t index); uint8_t get_adjacent_cell_mod_id(uint16_t phyCellId); /** -\brief Generate a default configuration for SIB1 (eNB). -@param frame_parms Used to store some basic parameters from PHY configuration -@param buffer Pointer to PER-encoded ASN.1 description of SIB1 -@param sib1 Pointer to asn1c C representation of SIB1 +\brief Generate configuration for SIB1 (eNB). +@param carrier pointer to Carrier information +@param N_RB_DL Number of downlink PRBs +@param phich_Resource PHICH resoure parameter +@param phich_duration PHICH duration parameter +@param frame radio frame number +@return size of encoded bit stream in bytes*/ +uint8_t do_MIB(rrc_eNB_carrier_data_t *carrier, uint32_t N_RB_DL, uint32_t phich_Resource, uint32_t phich_duration, uint32_t frame); + +/** +\brief Generate configuration for SIB1 (eNB). +@param carrier pointer to Carrier information +@param Mod_id Instance of eNB +@param Component carrier Component carrier to configure +@param configuration Pointer Configuration Request structure @return size of encoded bit stream in bytes*/ -uint8_t do_SIB1(uint8_t Mod_id, int CC_id, - LTE_DL_FRAME_PARMS *frame_parms, uint8_t *buffer, - BCCH_DL_SCH_Message_t *bcch_message, - SystemInformationBlockType1_t **sib1 -#if defined(ENABLE_ITTI) - , RrcConfigurationReq *configuration -#endif +uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,int Mod_id,int CC_id, RrcConfigurationReq *configuration ); /** @@ -95,17 +88,7 @@ uint8_t do_SIB1(uint8_t Mod_id, int CC_id, @return size of encoded bit stream in bytes*/ uint8_t do_SIB23(uint8_t Mod_id, - int CC_id, - LTE_DL_FRAME_PARMS *frame_parms, - uint8_t *buffer, - BCCH_DL_SCH_Message_t *systemInformation, - SystemInformationBlockType2_t **sib2, - SystemInformationBlockType3_t **sib3 -#ifdef Rel10 - , - SystemInformationBlockType13_r9_t **sib13, - uint8_t MBMS_flag -#endif + int CC_id #if defined(ENABLE_ITTI) , RrcConfigurationReq *configuration #endif @@ -141,6 +124,7 @@ do_RRCConnectionReconfigurationComplete( PhysicalConfigDedicated IEs. The latter does not enable periodic CQI reporting (PUCCH format 2/2a/2b) or SRS. @param ctxt_pP Running context @param ue_context_pP UE context +@param CC_id Component Carrier ID @param buffer Pointer to PER-encoded ASN.1 description of DL-CCCH-Message PDU @param transmission_mode Transmission mode for UE (1-9) @param UE_id UE index for this message @@ -152,10 +136,10 @@ uint8_t do_RRCConnectionSetup( const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, + int CC_id, uint8_t* const buffer, const uint8_t transmission_mode, const uint8_t Transaction_id, - const LTE_DL_FRAME_PARMS* const frame_parms, SRB_ToAddModList_t** SRB_configList, struct PhysicalConfigDedicated** physicalConfigDedicated ); @@ -203,10 +187,32 @@ do_RRCConnectionReconfiguration( RSRP_Range_t *rsrp, C_RNTI_t *cba_rnti, struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList* dedicatedInfoNASList -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) , SCellToAddMod_r10_t *SCell_config #endif ); +/** +\brief Generate an RRCConnectionReestablishment DL-CCCH-Message (eNB). This routine configures SRB_ToAddMod (SRB1/SRB2) and +PhysicalConfigDedicated IEs. The latter does not enable periodic CQI reporting (PUCCH format 2/2a/2b) or SRS. +@param ctxt_pP Running context +@param ue_context_pP UE context +@param CC_id Component Carrier ID +@param buffer Pointer to PER-encoded ASN.1 description of DL-CCCH-Message PDU +@param transmission_mode Transmission mode for UE (1-9) +@param Transaction_id Transaction_ID for this message +@param SRB_configList Pointer (returned) to SRB1_config/SRB2_config(later) IEs for this UE +@param physicalConfigDedicated Pointer (returned) to PhysicalConfigDedicated IE for this UE +@returns Size of encoded bit stream in bytes*/ +uint8_t +do_RRCConnectionReestablishment( + const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + int CC_id, + uint8_t* const buffer, + const uint8_t transmission_mode, + const uint8_t Transaction_id, + SRB_ToAddModList_t **SRB_configList, + struct PhysicalConfigDedicated **physicalConfigDedicated); /** \brief Generate an RRCConnectionReestablishmentReject DL-CCCH-Message (eNB). @@ -244,14 +250,13 @@ uint8_t do_RRCConnectionRelease(uint8_t Mod_id, uint8_t *buffer,int Transaction_ * @returns Size of encoded bit stream in bytes */ uint8_t do_MCCHMessage(uint8_t *buffer); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) /*** * \brief Generate an MCCH-Message (eNB). This routine configures MBSFNAreaConfiguration (PMCH-InfoList and Subframe Allocation for MBMS data) * @param buffer Pointer to PER-encoded ASN.1 description of MCCH-Message PDU * @returns Size of encoded bit stream in bytes */ uint8_t do_MBSFNAreaConfig(uint8_t Mod_id, - LTE_DL_FRAME_PARMS *frame_parms, uint8_t sync_area, uint8_t *buffer, MCCH_Message_t *mcch_message, @@ -262,6 +267,8 @@ uint8_t do_MeasurementReport(uint8_t Mod_id, uint8_t *buffer,int measid,int phy_ uint8_t do_DLInformationTransfer(uint8_t Mod_id, uint8_t **buffer, uint8_t transaction_id, uint32_t pdu_length, uint8_t *pdu_buffer); +uint8_t do_Paging(uint8_t Mod_id, uint8_t *buffer, ue_paging_identity_t ue_paging_identity, cn_domain_t cn_domain); + uint8_t do_ULInformationTransfer(uint8_t **buffer, uint32_t pdu_length, uint8_t *pdu_buffer); OAI_UECapability_t *fill_ue_capability(char *UE_EUTRA_Capability_xer); diff --git a/openair2/RRC/LITE/MESSAGES/asn1c/ASN1_files/RRC-e30.asn b/openair2/RRC/LITE/MESSAGES/asn1c/ASN1_files/RRC-e30.asn new file mode 100644 index 0000000000..2f02a8b4e5 --- /dev/null +++ b/openair2/RRC/LITE/MESSAGES/asn1c/ASN1_files/RRC-e30.asn @@ -0,0 +1,13807 @@ + +EUTRA-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + + +BCCH-BCH-Message ::= SEQUENCE { + message BCCH-BCH-MessageType +} + +BCCH-BCH-MessageType ::= MasterInformationBlock + + +BCCH-BCH-Message-MBMS::= SEQUENCE { + message BCCH-BCH-MessageType-MBMS-r14 +} + +BCCH-BCH-MessageType-MBMS-r14 ::= MasterInformationBlock-MBMS-r14 + + +BCCH-DL-SCH-Message ::= SEQUENCE { + message BCCH-DL-SCH-MessageType +} + +BCCH-DL-SCH-MessageType ::= CHOICE { + c1 CHOICE { + systemInformation SystemInformation, + systemInformationBlockType1 SystemInformationBlockType1 + }, + messageClassExtension SEQUENCE {} +} + + +BCCH-DL-SCH-Message-BR ::= SEQUENCE { + message BCCH-DL-SCH-MessageType-BR-r13 +} + +BCCH-DL-SCH-MessageType-BR-r13 ::= CHOICE { + c1 CHOICE { + systemInformation-BR-r13 SystemInformation-BR-r13, + systemInformationBlockType1-BR-r13 SystemInformationBlockType1-BR-r13 + }, + messageClassExtension SEQUENCE {} +} + + +BCCH-DL-SCH-Message-MBMS ::= SEQUENCE { + message BCCH-DL-SCH-MessageType-MBMS-r14 +} + +BCCH-DL-SCH-MessageType-MBMS-r14 ::= CHOICE { + c1 CHOICE { + systemInformation-MBMS-r14 SystemInformation-MBMS-r14, + systemInformationBlockType1-MBMS-r14 SystemInformationBlockType1-MBMS-r14 + }, + messageClassExtension SEQUENCE {} +} + + +MCCH-Message ::= SEQUENCE { + message MCCH-MessageType +} + +MCCH-MessageType ::= CHOICE { + c1 CHOICE { + mbsfnAreaConfiguration-r9 MBSFNAreaConfiguration-r9 + }, + later CHOICE { + c2 CHOICE{ + mbmsCountingRequest-r10 MBMSCountingRequest-r10 + }, + messageClassExtension SEQUENCE {} + } +} + + +PCCH-Message ::= SEQUENCE { + message PCCH-MessageType +} + +PCCH-MessageType ::= CHOICE { + c1 CHOICE { + paging Paging + }, + messageClassExtension SEQUENCE {} +} + + +DL-CCCH-Message ::= SEQUENCE { + message DL-CCCH-MessageType +} + +DL-CCCH-MessageType ::= CHOICE { + c1 CHOICE { + rrcConnectionReestablishment RRCConnectionReestablishment, + rrcConnectionReestablishmentReject RRCConnectionReestablishmentReject, + rrcConnectionReject RRCConnectionReject, + rrcConnectionSetup RRCConnectionSetup + }, + messageClassExtension SEQUENCE {} +} + + +DL-DCCH-Message ::= SEQUENCE { + message DL-DCCH-MessageType +} + +DL-DCCH-MessageType ::= CHOICE { + c1 CHOICE { + csfbParametersResponseCDMA2000 CSFBParametersResponseCDMA2000, + dlInformationTransfer DLInformationTransfer, + handoverFromEUTRAPreparationRequest HandoverFromEUTRAPreparationRequest, + mobilityFromEUTRACommand MobilityFromEUTRACommand, + rrcConnectionReconfiguration RRCConnectionReconfiguration, + rrcConnectionRelease RRCConnectionRelease, + securityModeCommand SecurityModeCommand, + ueCapabilityEnquiry UECapabilityEnquiry, + counterCheck CounterCheck, + ueInformationRequest-r9 UEInformationRequest-r9, + loggedMeasurementConfiguration-r10 LoggedMeasurementConfiguration-r10, + rnReconfiguration-r10 RNReconfiguration-r10, + rrcConnectionResume-r13 RRCConnectionResume-r13, + spare3 NULL, spare2 NULL, spare1 NULL + }, + messageClassExtension SEQUENCE {} +} + + +UL-CCCH-Message ::= SEQUENCE { + message UL-CCCH-MessageType +} + +UL-CCCH-MessageType ::= CHOICE { + c1 CHOICE { + rrcConnectionReestablishmentRequest RRCConnectionReestablishmentRequest, + rrcConnectionRequest RRCConnectionRequest + }, + messageClassExtension CHOICE { + c2 CHOICE { + rrcConnectionResumeRequest-r13 RRCConnectionResumeRequest-r13 + }, + messageClassExtensionFuture-r13 SEQUENCE {} + } +} + + +UL-DCCH-Message ::= SEQUENCE { + message UL-DCCH-MessageType +} + +UL-DCCH-MessageType ::= CHOICE { + c1 CHOICE { + csfbParametersRequestCDMA2000 CSFBParametersRequestCDMA2000, + measurementReport MeasurementReport, + rrcConnectionReconfigurationComplete RRCConnectionReconfigurationComplete, + rrcConnectionReestablishmentComplete RRCConnectionReestablishmentComplete, + rrcConnectionSetupComplete RRCConnectionSetupComplete, + securityModeComplete SecurityModeComplete, + securityModeFailure SecurityModeFailure, + ueCapabilityInformation UECapabilityInformation, + ulHandoverPreparationTransfer ULHandoverPreparationTransfer, + ulInformationTransfer ULInformationTransfer, + counterCheckResponse CounterCheckResponse, + ueInformationResponse-r9 UEInformationResponse-r9, + proximityIndication-r9 ProximityIndication-r9, + rnReconfigurationComplete-r10 RNReconfigurationComplete-r10, + mbmsCountingResponse-r10 MBMSCountingResponse-r10, + interFreqRSTDMeasurementIndication-r10 InterFreqRSTDMeasurementIndication-r10 + }, + messageClassExtension CHOICE { + c2 CHOICE { + ueAssistanceInformation-r11 UEAssistanceInformation-r11, + inDeviceCoexIndication-r11 InDeviceCoexIndication-r11, + mbmsInterestIndication-r11 MBMSInterestIndication-r11, + scgFailureInformation-r12 SCGFailureInformation-r12, + sidelinkUEInformation-r12 SidelinkUEInformation-r12, + wlanConnectionStatusReport-r13 WLANConnectionStatusReport-r13, + rrcConnectionResumeComplete-r13 RRCConnectionResumeComplete-r13, + spare9 NULL, spare8 NULL, spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + messageClassExtensionFuture-r11 SEQUENCE {} + } +} + + +SC-MCCH-Message-r13 ::= SEQUENCE { + message SC-MCCH-MessageType-r13 +} + + +SC-MCCH-MessageType-r13 ::= CHOICE { + c1 CHOICE { + scptmConfiguration-r13 SCPTMConfiguration-r13 + }, + messageClassExtension CHOICE { + c2 CHOICE { + scptmConfiguration-BR-r14 SCPTMConfiguration-BR-r14, + spare NULL + }, + messageClassExtensionFuture-r14 SEQUENCE {} + } +} + + +CounterCheck ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + counterCheck-r8 CounterCheck-r8-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +CounterCheck-r8-IEs ::= SEQUENCE { + drb-CountMSB-InfoList DRB-CountMSB-InfoList, + nonCriticalExtension CounterCheck-v8a0-IEs OPTIONAL +} + +CounterCheck-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +DRB-CountMSB-InfoList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-CountMSB-Info + +DRB-CountMSB-Info ::= SEQUENCE { + drb-Identity DRB-Identity, + countMSB-Uplink INTEGER(0..33554431), + countMSB-Downlink INTEGER(0..33554431) +} + + +CounterCheckResponse ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + counterCheckResponse-r8 CounterCheckResponse-r8-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +CounterCheckResponse-r8-IEs ::= SEQUENCE { + drb-CountInfoList DRB-CountInfoList, + nonCriticalExtension CounterCheckResponse-v8a0-IEs OPTIONAL +} + +CounterCheckResponse-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +DRB-CountInfoList ::= SEQUENCE (SIZE (0..maxDRB)) OF DRB-CountInfo + +DRB-CountInfo ::= SEQUENCE { + drb-Identity DRB-Identity, + count-Uplink INTEGER(0..4294967295), + count-Downlink INTEGER(0..4294967295) +} + + +CSFBParametersRequestCDMA2000 ::= SEQUENCE { + criticalExtensions CHOICE { + csfbParametersRequestCDMA2000-r8 CSFBParametersRequestCDMA2000-r8-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +CSFBParametersRequestCDMA2000-r8-IEs ::= SEQUENCE { + nonCriticalExtension CSFBParametersRequestCDMA2000-v8a0-IEs OPTIONAL +} + +CSFBParametersRequestCDMA2000-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +CSFBParametersResponseCDMA2000 ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + csfbParametersResponseCDMA2000-r8 CSFBParametersResponseCDMA2000-r8-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +CSFBParametersResponseCDMA2000-r8-IEs ::= SEQUENCE { + rand RAND-CDMA2000, + mobilityParameters MobilityParametersCDMA2000, + nonCriticalExtension CSFBParametersResponseCDMA2000-v8a0-IEs OPTIONAL +} + +CSFBParametersResponseCDMA2000-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +DLInformationTransfer ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + dlInformationTransfer-r8 DLInformationTransfer-r8-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +DLInformationTransfer-r8-IEs ::= SEQUENCE { + dedicatedInfoType CHOICE { + dedicatedInfoNAS DedicatedInfoNAS, + dedicatedInfoCDMA2000-1XRTT DedicatedInfoCDMA2000, + dedicatedInfoCDMA2000-HRPD DedicatedInfoCDMA2000 + }, + nonCriticalExtension DLInformationTransfer-v8a0-IEs OPTIONAL +} + +DLInformationTransfer-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +HandoverFromEUTRAPreparationRequest ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + handoverFromEUTRAPreparationRequest-r8 + HandoverFromEUTRAPreparationRequest-r8-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +HandoverFromEUTRAPreparationRequest-r8-IEs ::= SEQUENCE { + cdma2000-Type CDMA2000-Type, + rand RAND-CDMA2000 OPTIONAL, -- Cond cdma2000-Type + mobilityParameters MobilityParametersCDMA2000 OPTIONAL, -- Cond cdma2000-Type + nonCriticalExtension HandoverFromEUTRAPreparationRequest-v890-IEs OPTIONAL +} + +HandoverFromEUTRAPreparationRequest-v890-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension HandoverFromEUTRAPreparationRequest-v920-IEs OPTIONAL +} + +HandoverFromEUTRAPreparationRequest-v920-IEs ::= SEQUENCE { + concurrPrepCDMA2000-HRPD-r9 BOOLEAN OPTIONAL, -- Cond cdma2000-Type + nonCriticalExtension HandoverFromEUTRAPreparationRequest-v1020-IEs OPTIONAL +} + +HandoverFromEUTRAPreparationRequest-v1020-IEs ::= SEQUENCE { + dualRxTxRedirectIndicator-r10 ENUMERATED {true} OPTIONAL, -- Cond cdma2000-1XRTT + redirectCarrierCDMA2000-1XRTT-r10 CarrierFreqCDMA2000 OPTIONAL, -- Cond dualRxTxRedirect + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +InDeviceCoexIndication-r11 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + inDeviceCoexIndication-r11 InDeviceCoexIndication-r11-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +InDeviceCoexIndication-r11-IEs ::= SEQUENCE { + affectedCarrierFreqList-r11 AffectedCarrierFreqList-r11 OPTIONAL, + tdm-AssistanceInfo-r11 TDM-AssistanceInfo-r11 OPTIONAL, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension InDeviceCoexIndication-v11d0-IEs OPTIONAL +} + +InDeviceCoexIndication-v11d0-IEs ::= SEQUENCE { + ul-CA-AssistanceInfo-r11 SEQUENCE { + affectedCarrierFreqCombList-r11 AffectedCarrierFreqCombList-r11 OPTIONAL, + victimSystemType-r11 VictimSystemType-r11 + } OPTIONAL, + nonCriticalExtension InDeviceCoexIndication-v1310-IEs OPTIONAL +} + +InDeviceCoexIndication-v1310-IEs ::= SEQUENCE { + affectedCarrierFreqList-v1310 AffectedCarrierFreqList-v1310 OPTIONAL, + affectedCarrierFreqCombList-r13 AffectedCarrierFreqCombList-r13 OPTIONAL, + nonCriticalExtension InDeviceCoexIndication-v1360-IEs OPTIONAL +} + +InDeviceCoexIndication-v1360-IEs ::= SEQUENCE { + hardwareSharingProblem-r13 ENUMERATED {true} OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +AffectedCarrierFreqList-r11 ::= SEQUENCE (SIZE (1..maxFreqIDC-r11)) OF AffectedCarrierFreq-r11 + +AffectedCarrierFreqList-v1310 ::= SEQUENCE (SIZE (1..maxFreqIDC-r11)) OF AffectedCarrierFreq-v1310 + +AffectedCarrierFreq-r11 ::= SEQUENCE { + carrierFreq-r11 MeasObjectId, + interferenceDirection-r11 ENUMERATED {eutra, other, both, spare} +} + +AffectedCarrierFreq-v1310 ::= SEQUENCE { + carrierFreq-v1310 MeasObjectId-v1310 OPTIONAL +} + +AffectedCarrierFreqCombList-r11 ::= SEQUENCE (SIZE (1..maxCombIDC-r11)) OF AffectedCarrierFreqComb-r11 + +AffectedCarrierFreqCombList-r13 ::= SEQUENCE (SIZE (1..maxCombIDC-r11)) OF AffectedCarrierFreqComb-r13 + +AffectedCarrierFreqComb-r11 ::= SEQUENCE (SIZE (2..maxServCell-r10)) OF MeasObjectId + +AffectedCarrierFreqComb-r13 ::= SEQUENCE (SIZE (2..maxServCell-r13)) OF MeasObjectId-r13 + +TDM-AssistanceInfo-r11 ::= CHOICE { + drx-AssistanceInfo-r11 SEQUENCE { + drx-CycleLength-r11 ENUMERATED {sf40, sf64, sf80, sf128, sf160, + sf256, spare2, spare1}, + drx-Offset-r11 INTEGER (0..255) OPTIONAL, + drx-ActiveTime-r11 ENUMERATED {sf20, sf30, sf40, sf60, sf80, + sf100, spare2, spare1} + }, + idc-SubframePatternList-r11 IDC-SubframePatternList-r11, + ... +} + +IDC-SubframePatternList-r11 ::= SEQUENCE (SIZE (1..maxSubframePatternIDC-r11)) OF IDC-SubframePattern-r11 + +IDC-SubframePattern-r11 ::= CHOICE { + subframePatternFDD-r11 BIT STRING (SIZE (4)), + subframePatternTDD-r11 CHOICE { + subframeConfig0-r11 BIT STRING (SIZE (70)), + subframeConfig1-5-r11 BIT STRING (SIZE (10)), + subframeConfig6-r11 BIT STRING (SIZE (60)) + }, + ... +} + +VictimSystemType-r11 ::= SEQUENCE { + gps-r11 ENUMERATED {true} OPTIONAL, + glonass-r11 ENUMERATED {true} OPTIONAL, + bds-r11 ENUMERATED {true} OPTIONAL, + galileo-r11 ENUMERATED {true} OPTIONAL, + wlan-r11 ENUMERATED {true} OPTIONAL, + bluetooth-r11 ENUMERATED {true} OPTIONAL +} + + +InterFreqRSTDMeasurementIndication-r10 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + interFreqRSTDMeasurementIndication-r10 InterFreqRSTDMeasurementIndication-r10-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +InterFreqRSTDMeasurementIndication-r10-IEs ::= SEQUENCE { + rstd-InterFreqIndication-r10 CHOICE { + start SEQUENCE { + rstd-InterFreqInfoList-r10 RSTD-InterFreqInfoList-r10 + }, + stop NULL + }, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +RSTD-InterFreqInfoList-r10 ::= SEQUENCE (SIZE(1..maxRSTD-Freq-r10)) OF RSTD-InterFreqInfo-r10 + +RSTD-InterFreqInfo-r10 ::= SEQUENCE { + carrierFreq-r10 ARFCN-ValueEUTRA, + measPRS-Offset-r10 INTEGER (0..39), + ..., + [[ carrierFreq-v1090 ARFCN-ValueEUTRA-v9e0 OPTIONAL + ]] +} + + +LoggedMeasurementConfiguration-r10 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + loggedMeasurementConfiguration-r10 LoggedMeasurementConfiguration-r10-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + + +LoggedMeasurementConfiguration-r10-IEs ::= SEQUENCE { + traceReference-r10 TraceReference-r10, + traceRecordingSessionRef-r10 OCTET STRING (SIZE (2)), + tce-Id-r10 OCTET STRING (SIZE (1)), + absoluteTimeInfo-r10 AbsoluteTimeInfo-r10, + areaConfiguration-r10 AreaConfiguration-r10 OPTIONAL, -- Need OR + loggingDuration-r10 LoggingDuration-r10, + loggingInterval-r10 LoggingInterval-r10, + nonCriticalExtension LoggedMeasurementConfiguration-v1080-IEs OPTIONAL +} + +LoggedMeasurementConfiguration-v1080-IEs ::= SEQUENCE { + lateNonCriticalExtension-r10 OCTET STRING OPTIONAL, + nonCriticalExtension LoggedMeasurementConfiguration-v1130-IEs OPTIONAL +} + +LoggedMeasurementConfiguration-v1130-IEs ::= SEQUENCE { + plmn-IdentityList-r11 PLMN-IdentityList3-r11 OPTIONAL, -- Need OR + areaConfiguration-v1130 AreaConfiguration-v1130 OPTIONAL, -- Need OR + nonCriticalExtension LoggedMeasurementConfiguration-v1250-IEs OPTIONAL +} + +LoggedMeasurementConfiguration-v1250-IEs ::= SEQUENCE { + targetMBSFN-AreaList-r12 TargetMBSFN-AreaList-r12 OPTIONAL, -- Need OP + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +TargetMBSFN-AreaList-r12 ::= SEQUENCE (SIZE (0..maxMBSFN-Area)) OF TargetMBSFN-Area-r12 + +TargetMBSFN-Area-r12 ::= SEQUENCE { + mbsfn-AreaId-r12 MBSFN-AreaId-r12 OPTIONAL, -- Need OR + carrierFreq-r12 ARFCN-ValueEUTRA-r9, + ... +} + + +MasterInformationBlock ::= SEQUENCE { + dl-Bandwidth ENUMERATED { + n6, n15, n25, n50, n75, n100}, + phich-Config PHICH-Config, + systemFrameNumber BIT STRING (SIZE (8)), + schedulingInfoSIB1-BR-r13 INTEGER (0..31), + spare BIT STRING (SIZE (5)) +} + + + +MasterInformationBlock-MBMS-r14 ::= SEQUENCE { + dl-Bandwidth-MBMS-r14 ENUMERATED { + n6, n15, n25, n50, n75, n100}, + systemFrameNumber-r14 BIT STRING (SIZE (6)), + additionalNonMBSFNSubframes-r14 INTEGER (0..3), + spare BIT STRING (SIZE (13)) +} + + +MBMSCountingRequest-r10 ::= SEQUENCE { + countingRequestList-r10 CountingRequestList-r10, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +CountingRequestList-r10 ::= SEQUENCE (SIZE (1..maxServiceCount)) OF CountingRequestInfo-r10 + +CountingRequestInfo-r10 ::= SEQUENCE { + tmgi-r10 TMGI-r9, + ... +} + + +MBMSCountingResponse-r10 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + countingResponse-r10 MBMSCountingResponse-r10-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +MBMSCountingResponse-r10-IEs ::= SEQUENCE { + mbsfn-AreaIndex-r10 INTEGER (0..maxMBSFN-Area-1) OPTIONAL, + countingResponseList-r10 CountingResponseList-r10 OPTIONAL, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +CountingResponseList-r10 ::= SEQUENCE (SIZE (1..maxServiceCount)) OF CountingResponseInfo-r10 + +CountingResponseInfo-r10 ::= SEQUENCE { + countingResponseService-r10 INTEGER (0..maxServiceCount-1), + ... +} + + +MBMSInterestIndication-r11 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + interestIndication-r11 MBMSInterestIndication-r11-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +MBMSInterestIndication-r11-IEs ::= SEQUENCE { + mbms-FreqList-r11 CarrierFreqListMBMS-r11 OPTIONAL, + mbms-Priority-r11 ENUMERATED {true} OPTIONAL, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension MBMSInterestIndication-v1310-IEs OPTIONAL +} + +MBMSInterestIndication-v1310-IEs ::= SEQUENCE { + mbms-Services-r13 MBMS-ServiceList-r13 OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +MBSFNAreaConfiguration-r9 ::= SEQUENCE { + commonSF-Alloc-r9 CommonSF-AllocPatternList-r9, + commonSF-AllocPeriod-r9 ENUMERATED { + rf4, rf8, rf16, rf32, rf64, rf128, rf256}, + pmch-InfoList-r9 PMCH-InfoList-r9, + nonCriticalExtension MBSFNAreaConfiguration-v930-IEs OPTIONAL +} + +MBSFNAreaConfiguration-v930-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension MBSFNAreaConfiguration-v1250-IEs OPTIONAL +} + +MBSFNAreaConfiguration-v1250-IEs ::= SEQUENCE { + pmch-InfoListExt-r12 PMCH-InfoListExt-r12 OPTIONAL, -- Need OR + nonCriticalExtension MBSFNAreaConfiguration-v1430-IEs OPTIONAL +} + +MBSFNAreaConfiguration-v1430-IEs ::= SEQUENCE { + commonSF-Alloc-r14 CommonSF-AllocPatternList-r14, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +CommonSF-AllocPatternList-r9 ::= SEQUENCE (SIZE (1..maxMBSFN-Allocations)) OF MBSFN-SubframeConfig + +CommonSF-AllocPatternList-r14 ::= SEQUENCE (SIZE (1..maxMBSFN-Allocations)) OF MBSFN-SubframeConfig-v1430 + + +MeasurementReport ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + measurementReport-r8 MeasurementReport-r8-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +MeasurementReport-r8-IEs ::= SEQUENCE { + measResults MeasResults, + nonCriticalExtension MeasurementReport-v8a0-IEs OPTIONAL +} + +MeasurementReport-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +MobilityFromEUTRACommand ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE{ + mobilityFromEUTRACommand-r8 MobilityFromEUTRACommand-r8-IEs, + mobilityFromEUTRACommand-r9 MobilityFromEUTRACommand-r9-IEs, + spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +MobilityFromEUTRACommand-r8-IEs ::= SEQUENCE { + cs-FallbackIndicator BOOLEAN, + purpose CHOICE{ + handover Handover, + cellChangeOrder CellChangeOrder + }, + nonCriticalExtension MobilityFromEUTRACommand-v8a0-IEs OPTIONAL +} + +MobilityFromEUTRACommand-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension MobilityFromEUTRACommand-v8d0-IEs OPTIONAL +} + +MobilityFromEUTRACommand-v8d0-IEs ::= SEQUENCE { + bandIndicator BandIndicatorGERAN OPTIONAL, -- Cond GERAN + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +MobilityFromEUTRACommand-r9-IEs ::= SEQUENCE { + cs-FallbackIndicator BOOLEAN, + purpose CHOICE{ + handover Handover, + cellChangeOrder CellChangeOrder, + e-CSFB-r9 E-CSFB-r9, + ... + }, + nonCriticalExtension MobilityFromEUTRACommand-v930-IEs OPTIONAL +} + +MobilityFromEUTRACommand-v930-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension MobilityFromEUTRACommand-v960-IEs OPTIONAL +} + +MobilityFromEUTRACommand-v960-IEs ::= SEQUENCE { + bandIndicator BandIndicatorGERAN OPTIONAL, -- Cond GERAN + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +Handover ::= SEQUENCE { + targetRAT-Type ENUMERATED { + utra, geran, cdma2000-1XRTT, cdma2000-HRPD, + spare4, spare3, spare2, spare1, ...}, + targetRAT-MessageContainer OCTET STRING, + nas-SecurityParamFromEUTRA OCTET STRING (SIZE (1)) OPTIONAL, -- Cond UTRAGERAN + systemInformation SI-OrPSI-GERAN OPTIONAL -- Cond PSHO +} + +CellChangeOrder ::= SEQUENCE { + t304 ENUMERATED { + ms100, ms200, ms500, ms1000, + ms2000, ms4000, ms8000, ms10000-v1310}, + targetRAT-Type CHOICE { + geran SEQUENCE { + physCellId PhysCellIdGERAN, + carrierFreq CarrierFreqGERAN, + networkControlOrder BIT STRING (SIZE (2)) OPTIONAL, -- Need OP + systemInformation SI-OrPSI-GERAN OPTIONAL -- Need OP + }, + ... + } +} + +SI-OrPSI-GERAN ::= CHOICE { + si SystemInfoListGERAN, + psi SystemInfoListGERAN +} + +E-CSFB-r9 ::= SEQUENCE { + messageContCDMA2000-1XRTT-r9 OCTET STRING OPTIONAL, -- Need ON + mobilityCDMA2000-HRPD-r9 ENUMERATED { + handover, redirection + } OPTIONAL, -- Need OP + messageContCDMA2000-HRPD-r9 OCTET STRING OPTIONAL, -- Cond concHO + redirectCarrierCDMA2000-HRPD-r9 CarrierFreqCDMA2000 OPTIONAL -- Cond concRedir +} + + +Paging ::= SEQUENCE { + pagingRecordList PagingRecordList OPTIONAL, -- Need ON + systemInfoModification ENUMERATED {true} OPTIONAL, -- Need ON + etws-Indication ENUMERATED {true} OPTIONAL, -- Need ON + nonCriticalExtension Paging-v890-IEs OPTIONAL +} + +Paging-v890-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension Paging-v920-IEs OPTIONAL +} + +Paging-v920-IEs ::= SEQUENCE { + cmas-Indication-r9 ENUMERATED {true} OPTIONAL, -- Need ON + nonCriticalExtension Paging-v1130-IEs OPTIONAL +} + +Paging-v1130-IEs ::= SEQUENCE { + eab-ParamModification-r11 ENUMERATED {true} OPTIONAL, -- Need ON + nonCriticalExtension Paging-v1310-IEs OPTIONAL +} + +Paging-v1310-IEs ::= SEQUENCE { + redistributionIndication-r13 ENUMERATED {true} OPTIONAL, --Need ON + systemInfoModification-eDRX-r13 ENUMERATED {true} OPTIONAL, -- Need ON + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +PagingRecordList ::= SEQUENCE (SIZE (1..maxPageRec)) OF PagingRecord + +PagingRecord ::= SEQUENCE { + ue-Identity PagingUE-Identity, + cn-Domain ENUMERATED {ps, cs}, + ... +} + +PagingUE-Identity ::= CHOICE { + s-TMSI S-TMSI, + imsi IMSI, + ... +} + +IMSI ::= SEQUENCE (SIZE (6..21)) OF IMSI-Digit + +IMSI-Digit ::= INTEGER (0..9) + + +ProximityIndication-r9 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + proximityIndication-r9 ProximityIndication-r9-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +ProximityIndication-r9-IEs ::= SEQUENCE { + type-r9 ENUMERATED {entering, leaving}, + carrierFreq-r9 CHOICE { + eutra-r9 ARFCN-ValueEUTRA, + utra-r9 ARFCN-ValueUTRA, + ..., + eutra2-v9e0 ARFCN-ValueEUTRA-v9e0 + }, + nonCriticalExtension ProximityIndication-v930-IEs OPTIONAL +} + +ProximityIndication-v930-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RNReconfiguration-r10 ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + rnReconfiguration-r10 RNReconfiguration-r10-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RNReconfiguration-r10-IEs ::= SEQUENCE { + rn-SystemInfo-r10 RN-SystemInfo-r10 OPTIONAL, -- Need ON + rn-SubframeConfig-r10 RN-SubframeConfig-r10 OPTIONAL, -- Need ON + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +RN-SystemInfo-r10 ::= SEQUENCE { + systemInformationBlockType1-r10 OCTET STRING (CONTAINING SystemInformationBlockType1) OPTIONAL, -- Need ON + systemInformationBlockType2-r10 SystemInformationBlockType2 OPTIONAL, -- Need ON + ... +} + + +RNReconfigurationComplete-r10 ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE{ + rnReconfigurationComplete-r10 RNReconfigurationComplete-r10-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RNReconfigurationComplete-r10-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionReconfiguration ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE{ + rrcConnectionReconfiguration-r8 RRCConnectionReconfiguration-r8-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReconfiguration-r8-IEs ::= SEQUENCE { + measConfig MeasConfig OPTIONAL, -- Need ON + mobilityControlInfo MobilityControlInfo OPTIONAL, -- Cond HO + dedicatedInfoNASList SEQUENCE (SIZE(1..maxDRB)) OF + DedicatedInfoNAS OPTIONAL, -- Cond nonHO + radioResourceConfigDedicated RadioResourceConfigDedicated OPTIONAL, -- Cond HO-toEUTRA + securityConfigHO SecurityConfigHO OPTIONAL, -- Cond HO + nonCriticalExtension RRCConnectionReconfiguration-v890-IEs OPTIONAL +} + +RRCConnectionReconfiguration-v890-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING (CONTAINING RRCConnectionReconfiguration-v8m0-IEs) OPTIONAL, + nonCriticalExtension RRCConnectionReconfiguration-v920-IEs OPTIONAL +} + +-- Late non-critical extensions: +RRCConnectionReconfiguration-v8m0-IEs ::= SEQUENCE { + -- Following field is only for pre REL-10 late non-critical extensions + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension RRCConnectionReconfiguration-v10i0-IEs OPTIONAL +} + +RRCConnectionReconfiguration-v10i0-IEs ::= SEQUENCE { + antennaInfoDedicatedPCell-v10i0 AntennaInfoDedicated-v10i0 OPTIONAL, -- Need ON + -- Following field is only for late non-critical extensions from REL-10 + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +-- Regular non-critical extensions: +RRCConnectionReconfiguration-v920-IEs ::= SEQUENCE { + otherConfig-r9 OtherConfig-r9 OPTIONAL, -- Need ON + fullConfig-r9 ENUMERATED {true} OPTIONAL, -- Cond HO-Reestab + nonCriticalExtension RRCConnectionReconfiguration-v1020-IEs OPTIONAL +} + +RRCConnectionReconfiguration-v1020-IEs ::= SEQUENCE { + sCellToReleaseList-r10 SCellToReleaseList-r10 OPTIONAL, -- Need ON + sCellToAddModList-r10 SCellToAddModList-r10 OPTIONAL, -- Need ON + nonCriticalExtension RRCConnectionReconfiguration-v1130-IEs OPTIONAL +} + +RRCConnectionReconfiguration-v1130-IEs ::= SEQUENCE { + systemInformationBlockType1Dedicated-r11 OCTET STRING (CONTAINING SystemInformationBlockType1) OPTIONAL, -- Need ON + nonCriticalExtension RRCConnectionReconfiguration-v1250-IEs OPTIONAL +} + +RRCConnectionReconfiguration-v1250-IEs ::= SEQUENCE { + wlan-OffloadInfo-r12 CHOICE { + release NULL, + setup SEQUENCE { + wlan-OffloadConfigDedicated-r12 WLAN-OffloadConfig-r12, + t350-r12 ENUMERATED {min5, min10, min20, min30, min60, + min120, min180, spare1} OPTIONAL -- Need OR + } + } OPTIONAL, -- Need ON + scg-Configuration-r12 SCG-Configuration-r12 OPTIONAL, -- Cond nonFullConfig + sl-SyncTxControl-r12 SL-SyncTxControl-r12 OPTIONAL, -- Need ON + sl-DiscConfig-r12 SL-DiscConfig-r12 OPTIONAL, -- Need ON + sl-CommConfig-r12 SL-CommConfig-r12 OPTIONAL, -- Need ON + nonCriticalExtension RRCConnectionReconfiguration-v1310-IEs OPTIONAL +} + +RRCConnectionReconfiguration-v1310-IEs ::= SEQUENCE { + sCellToReleaseListExt-r13 SCellToReleaseListExt-r13 OPTIONAL, -- Need ON + sCellToAddModListExt-r13 SCellToAddModListExt-r13 OPTIONAL, -- Need ON + lwa-Configuration-r13 LWA-Configuration-r13 OPTIONAL, -- Need ON + lwip-Configuration-r13 LWIP-Configuration-r13 OPTIONAL, -- Need ON + rclwi-Configuration-r13 RCLWI-Configuration-r13 OPTIONAL, -- Need ON + nonCriticalExtension RRCConnectionReconfiguration-v1430-IEs OPTIONAL +} + +RRCConnectionReconfiguration-v1430-IEs ::= SEQUENCE { + sl-V2X-ConfigDedicated-r14 SL-V2X-ConfigDedicated-r14 OPTIONAL, -- Need ON + sCellToAddModListExt-v1430 SCellToAddModListExt-v1430 OPTIONAL, -- Need ON + perCC-GapIndicationRequest-r14 ENUMERATED{true} OPTIONAL, -- Need ON + systemInformationBlockType2Dedicated-r14 OCTET STRING (CONTAINING SystemInformationBlockType2) OPTIONAL, -- Need ON + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +SL-SyncTxControl-r12 ::= SEQUENCE { + networkControlledSyncTx-r12 ENUMERATED {on, off} OPTIONAL -- Need OP +} + +PSCellToAddMod-r12 ::= SEQUENCE { + sCellIndex-r12 SCellIndex-r10, + cellIdentification-r12 SEQUENCE { + physCellId-r12 PhysCellId, + dl-CarrierFreq-r12 ARFCN-ValueEUTRA-r9 + } OPTIONAL, -- Cond SCellAdd + radioResourceConfigCommonPSCell-r12 RadioResourceConfigCommonPSCell-r12 OPTIONAL, -- Cond SCellAdd + radioResourceConfigDedicatedPSCell-r12 RadioResourceConfigDedicatedPSCell-r12 OPTIONAL, -- Cond SCellAdd2 + ..., + [[ antennaInfoDedicatedPSCell-v1280 AntennaInfoDedicated-v10i0 OPTIONAL -- Need ON + ]], + [[ sCellIndex-r13 SCellIndex-r13 OPTIONAL -- Need ON + ]] +} + +PowerCoordinationInfo-r12 ::= SEQUENCE { + p-MeNB-r12 INTEGER (1..16), + p-SeNB-r12 INTEGER (1..16), + powerControlMode-r12 INTEGER (1..2) +} + +SCellToAddModList-r10 ::= SEQUENCE (SIZE (1..maxSCell-r10)) OF SCellToAddMod-r10 + +SCellToAddModListExt-r13 ::= SEQUENCE (SIZE (1..maxSCell-r13)) OF SCellToAddModExt-r13 + +SCellToAddModListExt-v1430 ::= SEQUENCE (SIZE (1..maxSCell-r13)) OF SCellToAddModExt-v1430 + +SCellToAddMod-r10 ::= SEQUENCE { + sCellIndex-r10 SCellIndex-r10, + cellIdentification-r10 SEQUENCE { + physCellId-r10 PhysCellId, + dl-CarrierFreq-r10 ARFCN-ValueEUTRA + } OPTIONAL, -- Cond SCellAdd + radioResourceConfigCommonSCell-r10 RadioResourceConfigCommonSCell-r10 OPTIONAL, -- Cond SCellAdd + radioResourceConfigDedicatedSCell-r10 RadioResourceConfigDedicatedSCell-r10 OPTIONAL, -- Cond SCellAdd2 + ..., + [[ dl-CarrierFreq-v1090 ARFCN-ValueEUTRA-v9e0 OPTIONAL -- Cond EARFCN-max + ]], + [[ antennaInfoDedicatedSCell-v10i0 AntennaInfoDedicated-v10i0 OPTIONAL -- Need ON + ]], + [[ srs-SwitchFromServCellIndex-r14 INTEGER (0.. 31) OPTIONAL -- Need ON + ]] +} + +SCellToAddModExt-r13 ::= SEQUENCE { + sCellIndex-r13 SCellIndex-r13, + cellIdentification-r13 SEQUENCE { + physCellId-r13 PhysCellId, + dl-CarrierFreq-r13 ARFCN-ValueEUTRA-r9 + } OPTIONAL, -- Cond SCellAdd + radioResourceConfigCommonSCell-r13 RadioResourceConfigCommonSCell-r10 OPTIONAL, -- Cond SCellAdd + radioResourceConfigDedicatedSCell-r13 RadioResourceConfigDedicatedSCell-r10 OPTIONAL, -- Cond SCellAdd2 + antennaInfoDedicatedSCell-r13 AntennaInfoDedicated-v10i0 OPTIONAL -- Need ON +} + +SCellToAddModExt-v1430 ::= SEQUENCE { + srs-SwitchFromServCellIndex-r14 INTEGER (0.. 31) OPTIONAL, -- Need ON + ... +} + +SCellToReleaseList-r10 ::= SEQUENCE (SIZE (1..maxSCell-r10)) OF SCellIndex-r10 + +SCellToReleaseListExt-r13 ::= SEQUENCE (SIZE (1..maxSCell-r13)) OF SCellIndex-r13 + +SCG-Configuration-r12 ::= CHOICE { + release NULL, + setup SEQUENCE { + scg-ConfigPartMCG-r12 SEQUENCE { + scg-Counter-r12 INTEGER (0.. 65535) OPTIONAL, -- Need ON + powerCoordinationInfo-r12 PowerCoordinationInfo-r12 OPTIONAL, -- Need ON + ... + } OPTIONAL, -- Need ON + scg-ConfigPartSCG-r12 SCG-ConfigPartSCG-r12 OPTIONAL -- Need ON + } +} + +SCG-ConfigPartSCG-r12 ::= SEQUENCE { + radioResourceConfigDedicatedSCG-r12 RadioResourceConfigDedicatedSCG-r12 OPTIONAL, -- Need ON + sCellToReleaseListSCG-r12 SCellToReleaseList-r10 OPTIONAL, -- Need ON + pSCellToAddMod-r12 PSCellToAddMod-r12 OPTIONAL, -- Need ON + sCellToAddModListSCG-r12 SCellToAddModList-r10 OPTIONAL, -- Need ON + mobilityControlInfoSCG-r12 MobilityControlInfoSCG-r12 OPTIONAL, -- Need ON + ..., + [[ + sCellToReleaseListSCG-Ext-r13 SCellToReleaseListExt-r13 OPTIONAL, -- Need ON + sCellToAddModListSCG-Ext-r13 SCellToAddModListExt-r13 OPTIONAL -- Need ON + ]] +} + +SecurityConfigHO ::= SEQUENCE { + handoverType CHOICE { + intraLTE SEQUENCE { + securityAlgorithmConfig SecurityAlgorithmConfig OPTIONAL, -- Cond fullConfig + keyChangeIndicator BOOLEAN, + nextHopChainingCount NextHopChainingCount + }, + interRAT SEQUENCE { + securityAlgorithmConfig SecurityAlgorithmConfig, + nas-SecurityParamToEUTRA OCTET STRING (SIZE(6)) + } + }, + ... +} + + + +RRCConnectionReconfigurationComplete ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + rrcConnectionReconfigurationComplete-r8 + RRCConnectionReconfigurationComplete-r8-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReconfigurationComplete-r8-IEs ::= SEQUENCE { + nonCriticalExtension RRCConnectionReconfigurationComplete-v8a0-IEs OPTIONAL +} + +RRCConnectionReconfigurationComplete-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension RRCConnectionReconfigurationComplete-v1020-IEs OPTIONAL +} + +RRCConnectionReconfigurationComplete-v1020-IEs ::= SEQUENCE { + rlf-InfoAvailable-r10 ENUMERATED {true} OPTIONAL, + logMeasAvailable-r10 ENUMERATED {true} OPTIONAL, + nonCriticalExtension RRCConnectionReconfigurationComplete-v1130-IEs OPTIONAL +} + +RRCConnectionReconfigurationComplete-v1130-IEs ::= SEQUENCE { + connEstFailInfoAvailable-r11 ENUMERATED {true} OPTIONAL, + nonCriticalExtension RRCConnectionReconfigurationComplete-v1250-IEs OPTIONAL +} + +RRCConnectionReconfigurationComplete-v1250-IEs ::= SEQUENCE { + logMeasAvailableMBSFN-r12 ENUMERATED {true} OPTIONAL, + nonCriticalExtension RRCConnectionReconfigurationComplete-v1430-IEs OPTIONAL +} + +RRCConnectionReconfigurationComplete-v1430-IEs ::= SEQUENCE { + perCC-GapIndicationList-r14 PerCC-GapIndicationList-r14 OPTIONAL, + numFreqEffective-r14 INTEGER (1..12) OPTIONAL, + numFreqEffectiveReduced-r14 INTEGER (1..12) OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionReestablishment ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE{ + rrcConnectionReestablishment-r8 RRCConnectionReestablishment-r8-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReestablishment-r8-IEs ::= SEQUENCE { + radioResourceConfigDedicated RadioResourceConfigDedicated, + nextHopChainingCount NextHopChainingCount, + nonCriticalExtension RRCConnectionReestablishment-v8a0-IEs OPTIONAL +} + +RRCConnectionReestablishment-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionReestablishmentComplete ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + rrcConnectionReestablishmentComplete-r8 + RRCConnectionReestablishmentComplete-r8-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReestablishmentComplete-r8-IEs ::= SEQUENCE { + nonCriticalExtension RRCConnectionReestablishmentComplete-v920-IEs OPTIONAL +} + +RRCConnectionReestablishmentComplete-v920-IEs ::= SEQUENCE { + rlf-InfoAvailable-r9 ENUMERATED {true} OPTIONAL, + nonCriticalExtension RRCConnectionReestablishmentComplete-v8a0-IEs OPTIONAL +} + +RRCConnectionReestablishmentComplete-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension RRCConnectionReestablishmentComplete-v1020-IEs OPTIONAL +} + +RRCConnectionReestablishmentComplete-v1020-IEs ::= SEQUENCE { + logMeasAvailable-r10 ENUMERATED {true} OPTIONAL, + nonCriticalExtension RRCConnectionReestablishmentComplete-v1130-IEs OPTIONAL +} + +RRCConnectionReestablishmentComplete-v1130-IEs ::= SEQUENCE { + connEstFailInfoAvailable-r11 ENUMERATED {true} OPTIONAL, + nonCriticalExtension RRCConnectionReestablishmentComplete-v1250-IEs OPTIONAL +} + +RRCConnectionReestablishmentComplete-v1250-IEs ::= SEQUENCE { + logMeasAvailableMBSFN-r12 ENUMERATED {true} OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionReestablishmentReject ::= SEQUENCE { + criticalExtensions CHOICE { + rrcConnectionReestablishmentReject-r8 + RRCConnectionReestablishmentReject-r8-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReestablishmentReject-r8-IEs ::= SEQUENCE { + nonCriticalExtension RRCConnectionReestablishmentReject-v8a0-IEs OPTIONAL +} + +RRCConnectionReestablishmentReject-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionReestablishmentRequest ::= SEQUENCE { + criticalExtensions CHOICE { + rrcConnectionReestablishmentRequest-r8 + RRCConnectionReestablishmentRequest-r8-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReestablishmentRequest-r8-IEs ::= SEQUENCE { + ue-Identity ReestabUE-Identity, + reestablishmentCause ReestablishmentCause, + spare BIT STRING (SIZE (2)) +} + +ReestabUE-Identity ::= SEQUENCE { + c-RNTI C-RNTI, + physCellId PhysCellId, + shortMAC-I ShortMAC-I +} + +ReestablishmentCause ::= ENUMERATED { + reconfigurationFailure, handoverFailure, + otherFailure, spare1} + + +RRCConnectionReject ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + rrcConnectionReject-r8 RRCConnectionReject-r8-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReject-r8-IEs ::= SEQUENCE { + waitTime INTEGER (1..16), + nonCriticalExtension RRCConnectionReject-v8a0-IEs OPTIONAL +} + +RRCConnectionReject-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension RRCConnectionReject-v1020-IEs OPTIONAL +} + +RRCConnectionReject-v1020-IEs ::= SEQUENCE { + extendedWaitTime-r10 INTEGER (1..1800) OPTIONAL, -- Need ON + nonCriticalExtension RRCConnectionReject-v1130-IEs OPTIONAL +} + +RRCConnectionReject-v1130-IEs ::= SEQUENCE { + deprioritisationReq-r11 SEQUENCE { + deprioritisationType-r11 ENUMERATED {frequency, e-utra}, + deprioritisationTimer-r11 ENUMERATED {min5, min10, min15, min30} + } OPTIONAL, -- Need ON + nonCriticalExtension RRCConnectionReject-v1320-IEs OPTIONAL +} + +RRCConnectionReject-v1320-IEs ::= SEQUENCE { + rrc-SuspendIndication-r13 ENUMERATED {true} OPTIONAL, -- Need ON + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionRelease ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + rrcConnectionRelease-r8 RRCConnectionRelease-r8-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionRelease-r8-IEs ::= SEQUENCE { + releaseCause ReleaseCause, + redirectedCarrierInfo RedirectedCarrierInfo OPTIONAL, -- Need ON + idleModeMobilityControlInfo IdleModeMobilityControlInfo OPTIONAL, -- Need OP + nonCriticalExtension RRCConnectionRelease-v890-IEs OPTIONAL +} + +RRCConnectionRelease-v890-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING (CONTAINING RRCConnectionRelease-v9e0-IEs) OPTIONAL, + nonCriticalExtension RRCConnectionRelease-v920-IEs OPTIONAL +} + +-- Late non critical extensions +RRCConnectionRelease-v9e0-IEs ::= SEQUENCE { + redirectedCarrierInfo-v9e0 RedirectedCarrierInfo-v9e0 OPTIONAL, -- Cond NoRedirect-r8 + idleModeMobilityControlInfo-v9e0 IdleModeMobilityControlInfo-v9e0 OPTIONAL, -- Cond IdleInfoEUTRA + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +-- Regular non critical extensions +RRCConnectionRelease-v920-IEs ::= SEQUENCE { + cellInfoList-r9 CHOICE { + geran-r9 CellInfoListGERAN-r9, + utra-FDD-r9 CellInfoListUTRA-FDD-r9, + utra-TDD-r9 CellInfoListUTRA-TDD-r9, + ..., + utra-TDD-r10 CellInfoListUTRA-TDD-r10 + } OPTIONAL, -- Cond Redirection + nonCriticalExtension RRCConnectionRelease-v1020-IEs OPTIONAL +} + +RRCConnectionRelease-v1020-IEs ::= SEQUENCE { + extendedWaitTime-r10 INTEGER (1..1800) OPTIONAL, -- Need ON + nonCriticalExtension RRCConnectionRelease-v1320-IEs OPTIONAL +} + +RRCConnectionRelease-v1320-IEs::= SEQUENCE { + resumeIdentity-r13 ResumeIdentity-r13 OPTIONAL, -- Need OR + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +ReleaseCause ::= ENUMERATED {loadBalancingTAUrequired, + other, cs-FallbackHighPriority-v1020, rrc-Suspend-v1320} + +RedirectedCarrierInfo ::= CHOICE { + eutra ARFCN-ValueEUTRA, + geran CarrierFreqsGERAN, + utra-FDD ARFCN-ValueUTRA, + utra-TDD ARFCN-ValueUTRA, + cdma2000-HRPD CarrierFreqCDMA2000, + cdma2000-1xRTT CarrierFreqCDMA2000, + ..., + utra-TDD-r10 CarrierFreqListUTRA-TDD-r10 +} + +RedirectedCarrierInfo-v9e0 ::= SEQUENCE { + eutra-v9e0 ARFCN-ValueEUTRA-v9e0 +} + +CarrierFreqListUTRA-TDD-r10 ::= SEQUENCE (SIZE (1..maxFreqUTRA-TDD-r10)) OF ARFCN-ValueUTRA + +IdleModeMobilityControlInfo ::= SEQUENCE { + freqPriorityListEUTRA FreqPriorityListEUTRA OPTIONAL, -- Need ON + freqPriorityListGERAN FreqsPriorityListGERAN OPTIONAL, -- Need ON + freqPriorityListUTRA-FDD FreqPriorityListUTRA-FDD OPTIONAL, -- Need ON + freqPriorityListUTRA-TDD FreqPriorityListUTRA-TDD OPTIONAL, -- Need ON + bandClassPriorityListHRPD BandClassPriorityListHRPD OPTIONAL, -- Need ON + bandClassPriorityList1XRTT BandClassPriorityList1XRTT OPTIONAL, -- Need ON + t320 ENUMERATED { + min5, min10, min20, min30, min60, min120, min180, + spare1} OPTIONAL, -- Need OR + ..., + [[ freqPriorityListExtEUTRA-r12 FreqPriorityListExtEUTRA-r12 OPTIONAL -- Need ON + ]], + [[ freqPriorityListEUTRA-v1310 FreqPriorityListEUTRA-v1310 OPTIONAL, -- Need ON + freqPriorityListExtEUTRA-v1310 FreqPriorityListExtEUTRA-v1310 OPTIONAL -- Need ON + ]] +} + +IdleModeMobilityControlInfo-v9e0 ::= SEQUENCE { + freqPriorityListEUTRA-v9e0 SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA-v9e0 +} + +FreqPriorityListEUTRA ::= SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA + +FreqPriorityListExtEUTRA-r12 ::= SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA-r12 + +FreqPriorityListEUTRA-v1310 ::= SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA-v1310 + +FreqPriorityListExtEUTRA-v1310 ::= SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA-v1310 + +FreqPriorityEUTRA ::= SEQUENCE { + carrierFreq ARFCN-ValueEUTRA, + cellReselectionPriority CellReselectionPriority +} + +FreqPriorityEUTRA-v9e0 ::= SEQUENCE { + carrierFreq-v9e0 ARFCN-ValueEUTRA-v9e0 OPTIONAL -- Cond EARFCN-max +} + +FreqPriorityEUTRA-r12 ::= SEQUENCE { + carrierFreq-r12 ARFCN-ValueEUTRA-r9, + cellReselectionPriority-r12 CellReselectionPriority +} + +FreqPriorityEUTRA-v1310 ::= SEQUENCE { + cellReselectionSubPriority-r13 CellReselectionSubPriority-r13 OPTIONAL -- Need ON +} + +FreqsPriorityListGERAN ::= SEQUENCE (SIZE (1..maxGNFG)) OF FreqsPriorityGERAN + +FreqsPriorityGERAN ::= SEQUENCE { + carrierFreqs CarrierFreqsGERAN, + cellReselectionPriority CellReselectionPriority +} + +FreqPriorityListUTRA-FDD ::= SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF FreqPriorityUTRA-FDD + +FreqPriorityUTRA-FDD ::= SEQUENCE { + carrierFreq ARFCN-ValueUTRA, + cellReselectionPriority CellReselectionPriority +} + +FreqPriorityListUTRA-TDD ::= SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF FreqPriorityUTRA-TDD + +FreqPriorityUTRA-TDD ::= SEQUENCE { + carrierFreq ARFCN-ValueUTRA, + cellReselectionPriority CellReselectionPriority +} + +BandClassPriorityListHRPD ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassPriorityHRPD + +BandClassPriorityHRPD ::= SEQUENCE { + bandClass BandclassCDMA2000, + cellReselectionPriority CellReselectionPriority +} + +BandClassPriorityList1XRTT ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassPriority1XRTT + +BandClassPriority1XRTT ::= SEQUENCE { + bandClass BandclassCDMA2000, + cellReselectionPriority CellReselectionPriority +} + +CellInfoListGERAN-r9 ::= SEQUENCE (SIZE (1..maxCellInfoGERAN-r9)) OF CellInfoGERAN-r9 + +CellInfoGERAN-r9 ::= SEQUENCE { + physCellId-r9 PhysCellIdGERAN, + carrierFreq-r9 CarrierFreqGERAN, + systemInformation-r9 SystemInfoListGERAN +} + +CellInfoListUTRA-FDD-r9 ::= SEQUENCE (SIZE (1..maxCellInfoUTRA-r9)) OF CellInfoUTRA-FDD-r9 + +CellInfoUTRA-FDD-r9 ::= SEQUENCE { + physCellId-r9 PhysCellIdUTRA-FDD, + utra-BCCH-Container-r9 OCTET STRING +} + +CellInfoListUTRA-TDD-r9 ::= SEQUENCE (SIZE (1..maxCellInfoUTRA-r9)) OF CellInfoUTRA-TDD-r9 + +CellInfoUTRA-TDD-r9 ::= SEQUENCE { + physCellId-r9 PhysCellIdUTRA-TDD, + utra-BCCH-Container-r9 OCTET STRING +} + +CellInfoListUTRA-TDD-r10 ::= SEQUENCE (SIZE (1..maxCellInfoUTRA-r9)) OF CellInfoUTRA-TDD-r10 + +CellInfoUTRA-TDD-r10 ::= SEQUENCE { + physCellId-r10 PhysCellIdUTRA-TDD, + carrierFreq-r10 ARFCN-ValueUTRA, + utra-BCCH-Container-r10 OCTET STRING +} + + +RRCConnectionRequest ::= SEQUENCE { + criticalExtensions CHOICE { + rrcConnectionRequest-r8 RRCConnectionRequest-r8-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionRequest-r8-IEs ::= SEQUENCE { + ue-Identity InitialUE-Identity, + establishmentCause EstablishmentCause, + spare BIT STRING (SIZE (1)) +} + +InitialUE-Identity ::= CHOICE { + s-TMSI S-TMSI, + randomValue BIT STRING (SIZE (40)) +} + +EstablishmentCause ::= ENUMERATED { + emergency, highPriorityAccess, mt-Access, mo-Signalling, + mo-Data, delayTolerantAccess-v1020, mo-VoiceCall-v1280, spare1} + + +RRCConnectionResume-r13 ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + rrcConnectionResume-r13 RRCConnectionResume-r13-IEs, + spare3 NULL, + spare2 NULL, + spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionResume-r13-IEs ::= SEQUENCE { + radioResourceConfigDedicated-r13 RadioResourceConfigDedicated OPTIONAL, -- Need ON + nextHopChainingCount-r13 NextHopChainingCount, + measConfig-r13 MeasConfig OPTIONAL, -- Need ON + antennaInfoDedicatedPCell-r13 AntennaInfoDedicated-v10i0 OPTIONAL, -- Need ON + drb-ContinueROHC-r13 ENUMERATED {true} OPTIONAL, -- Need OP + lateNonCriticalExtension OCTET STRING OPTIONAL, + rrcConnectionResume-v1430-IEs RRCConnectionResume-v1430-IEs OPTIONAL +} + +RRCConnectionResume-v1430-IEs ::= SEQUENCE { + otherConfig-r14 OtherConfig-r9 OPTIONAL, -- Need ON + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionResumeComplete-r13 ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + rrcConnectionResumeComplete-r13 RRCConnectionResumeComplete-r13-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionResumeComplete-r13-IEs ::= SEQUENCE { + selectedPLMN-Identity-r13 INTEGER (1..maxPLMN-r11) OPTIONAL, + dedicatedInfoNAS-r13 DedicatedInfoNAS OPTIONAL, + rlf-InfoAvailable-r13 ENUMERATED {true} OPTIONAL, + logMeasAvailable-r13 ENUMERATED {true} OPTIONAL, + connEstFailInfoAvailable-r13 ENUMERATED {true} OPTIONAL, + mobilityState-r13 ENUMERATED {normal, medium, high, spare} OPTIONAL, + mobilityHistoryAvail-r13 ENUMERATED {true} OPTIONAL, + logMeasAvailableMBSFN-r13 ENUMERATED {true} OPTIONAL, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionResumeRequest-r13 ::= SEQUENCE { + criticalExtensions CHOICE { + rrcConnectionResumeRequest-r13 RRCConnectionResumeRequest-r13-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionResumeRequest-r13-IEs ::= SEQUENCE { + resumeIdentity-r13 CHOICE { + resumeID-r13 ResumeIdentity-r13, + truncatedResumeID-r13 BIT STRING (SIZE (24)) + }, + shortResumeMAC-I-r13 BIT STRING (SIZE (16)), + resumeCause-r13 ResumeCause, + spare BIT STRING (SIZE (1)) +} + +ResumeCause ::= ENUMERATED { + emergency, highPriorityAccess, mt-Access, mo-Signalling, + mo-Data, delayTolerantAccess-v1020, mo-VoiceCall-v1280, spare1} + + + +RRCConnectionSetup ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + rrcConnectionSetup-r8 RRCConnectionSetup-r8-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionSetup-r8-IEs ::= SEQUENCE { + radioResourceConfigDedicated RadioResourceConfigDedicated, + nonCriticalExtension RRCConnectionSetup-v8a0-IEs OPTIONAL +} + +RRCConnectionSetup-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionSetupComplete ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE{ + rrcConnectionSetupComplete-r8 RRCConnectionSetupComplete-r8-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionSetupComplete-r8-IEs ::= SEQUENCE { + selectedPLMN-Identity INTEGER (1..maxPLMN-r11), + registeredMME RegisteredMME OPTIONAL, + dedicatedInfoNAS DedicatedInfoNAS, + nonCriticalExtension RRCConnectionSetupComplete-v8a0-IEs OPTIONAL +} + +RRCConnectionSetupComplete-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension RRCConnectionSetupComplete-v1020-IEs OPTIONAL +} + +RRCConnectionSetupComplete-v1020-IEs ::= SEQUENCE { + gummei-Type-r10 ENUMERATED {native, mapped} OPTIONAL, + rlf-InfoAvailable-r10 ENUMERATED {true} OPTIONAL, + logMeasAvailable-r10 ENUMERATED {true} OPTIONAL, + rn-SubframeConfigReq-r10 ENUMERATED {required, notRequired} OPTIONAL, + nonCriticalExtension RRCConnectionSetupComplete-v1130-IEs OPTIONAL +} + +RRCConnectionSetupComplete-v1130-IEs ::= SEQUENCE { + connEstFailInfoAvailable-r11 ENUMERATED {true} OPTIONAL, + nonCriticalExtension RRCConnectionSetupComplete-v1250-IEs OPTIONAL +} + +RRCConnectionSetupComplete-v1250-IEs ::= SEQUENCE { + mobilityState-r12 ENUMERATED {normal, medium, high, spare} OPTIONAL, + mobilityHistoryAvail-r12 ENUMERATED {true} OPTIONAL, + logMeasAvailableMBSFN-r12 ENUMERATED {true} OPTIONAL, + nonCriticalExtension RRCConnectionSetupComplete-v1320-IEs OPTIONAL +} + +RRCConnectionSetupComplete-v1320-IEs ::= SEQUENCE { + ce-ModeB-r13 ENUMERATED {supported} OPTIONAL, + s-TMSI-r13 S-TMSI OPTIONAL, + attachWithoutPDN-Connectivity-r13 ENUMERATED {true} OPTIONAL, + up-CIoT-EPS-Optimisation-r13 ENUMERATED {true} OPTIONAL, + cp-CIoT-EPS-Optimisation-r13 ENUMERATED {true} OPTIONAL, + nonCriticalExtension RRCConnectionSetupComplete-v1330-IEs OPTIONAL +} + +RRCConnectionSetupComplete-v1330-IEs ::= SEQUENCE { + ue-CE-NeedULGaps-r13 ENUMERATED {true} OPTIONAL, + nonCriticalExtension RRCConnectionSetupComplete-v1430-IEs OPTIONAL +} + +RRCConnectionSetupComplete-v1430-IEs ::= SEQUENCE { + dcn-ID-r14 INTEGER (0..65535) OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +RegisteredMME ::= SEQUENCE { + plmn-Identity PLMN-Identity OPTIONAL, + mmegi BIT STRING (SIZE (16)), + mmec MMEC +} + + +SCGFailureInformation-r12 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + scgFailureInformation-r12 SCGFailureInformation-r12-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +SCGFailureInformation-r12-IEs ::= SEQUENCE { + failureReportSCG-r12 FailureReportSCG-r12 OPTIONAL, + nonCriticalExtension SCGFailureInformation-v1310-IEs OPTIONAL +} + +SCGFailureInformation-v1310-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING (CONTAINING SCGFailureInformation-v12d0-IEs) OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +-- Late non-critical extensions: +SCGFailureInformation-v12d0-IEs ::= SEQUENCE { + failureReportSCG-v12d0 FailureReportSCG-v12d0 OPTIONAL, nonCriticalExtension SEQUENCE {} OPTIONAL +} + +-- Regular non-critical extensions: +FailureReportSCG-r12 ::= SEQUENCE { + failureType-r12 ENUMERATED {t313-Expiry, randomAccessProblem, + rlc-MaxNumRetx, scg-ChangeFailure }, + measResultServFreqList-r12 MeasResultServFreqList-r10 OPTIONAL, + measResultNeighCells-r12 MeasResultList2EUTRA-r9 OPTIONAL, + ..., + [[ failureType-v1290 ENUMERATED {maxUL-TimingDiff-v1290} OPTIONAL + ]], + [[ measResultServFreqListExt-r13 MeasResultServFreqListExt-r13 OPTIONAL + ]] +} + +FailureReportSCG-v12d0 ::= SEQUENCE { + measResultNeighCells-v12d0 MeasResultList2EUTRA-v9e0 OPTIONAL +} + + +SCPTMConfiguration-r13 ::= SEQUENCE { + sc-mtch-InfoList-r13 SC-MTCH-InfoList-r13, + scptm-NeighbourCellList-r13 SCPTM-NeighbourCellList-r13 OPTIONAL, -- Need OP + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SCPTMConfiguration-v1340 OPTIONAL +} + +SCPTMConfiguration-v1340 ::= SEQUENCE { + p-b-r13 INTEGER (0..3) OPTIONAL, -- Need ON + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SCPTMConfiguration-BR-r14 ::= SEQUENCE { + sc-mtch-InfoList-r14 SC-MTCH-InfoList-BR-r14, + scptm-NeighbourCellList-r14 SCPTM-NeighbourCellList-r13 OPTIONAL, -- Need OP + p-b-r14 INTEGER (0..3) OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SecurityModeCommand ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE{ + securityModeCommand-r8 SecurityModeCommand-r8-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +SecurityModeCommand-r8-IEs ::= SEQUENCE { + securityConfigSMC SecurityConfigSMC, + nonCriticalExtension SecurityModeCommand-v8a0-IEs OPTIONAL +} + +SecurityModeCommand-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +SecurityConfigSMC ::= SEQUENCE { + securityAlgorithmConfig SecurityAlgorithmConfig, + ... +} + + +SecurityModeComplete ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + securityModeComplete-r8 SecurityModeComplete-r8-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +SecurityModeComplete-r8-IEs ::= SEQUENCE { + nonCriticalExtension SecurityModeComplete-v8a0-IEs OPTIONAL +} + +SecurityModeComplete-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SecurityModeFailure ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + securityModeFailure-r8 SecurityModeFailure-r8-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +SecurityModeFailure-r8-IEs ::= SEQUENCE { + nonCriticalExtension SecurityModeFailure-v8a0-IEs OPTIONAL +} + +SecurityModeFailure-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SidelinkUEInformation-r12 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + sidelinkUEInformation-r12 SidelinkUEInformation-r12-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +SidelinkUEInformation-r12-IEs ::= SEQUENCE { + commRxInterestedFreq-r12 ARFCN-ValueEUTRA-r9 OPTIONAL, + commTxResourceReq-r12 SL-CommTxResourceReq-r12 OPTIONAL, + discRxInterest-r12 ENUMERATED {true} OPTIONAL, + discTxResourceReq-r12 INTEGER (1..63) OPTIONAL, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SidelinkUEInformation-v1310-IEs OPTIONAL +} + +SidelinkUEInformation-v1310-IEs ::= SEQUENCE { + commTxResourceReqUC-r13 SL-CommTxResourceReq-r12 OPTIONAL, + commTxResourceInfoReqRelay-r13 SEQUENCE { + commTxResourceReqRelay-r13 SL-CommTxResourceReq-r12 OPTIONAL, + commTxResourceReqRelayUC-r13 SL-CommTxResourceReq-r12 OPTIONAL, + ue-Type-r13 ENUMERATED {relayUE, remoteUE} + } OPTIONAL, + discTxResourceReq-v1310 SEQUENCE { + carrierFreqDiscTx-r13 INTEGER (1..maxFreq) OPTIONAL, + discTxResourceReqAddFreq-r13 SL-DiscTxResourceReqPerFreqList-r13 OPTIONAL + } OPTIONAL, + discTxResourceReqPS-r13 SL-DiscTxResourceReq-r13 OPTIONAL, + discRxGapReq-r13 SL-GapRequest-r13 OPTIONAL, + discTxGapReq-r13 SL-GapRequest-r13 OPTIONAL, + discSysInfoReportFreqList-r13 SL-DiscSysInfoReportFreqList-r13 OPTIONAL, + nonCriticalExtension SidelinkUEInformation-v1430-IEs OPTIONAL +} + +SidelinkUEInformation-v1430-IEs ::= SEQUENCE { + v2x-CommRxInterestedFreqList-r14 SL-V2X-CommFreqList-r14 OPTIONAL, + p2x-CommTxType-r14 ENUMERATED {true} OPTIONAL, + v2x-CommTxResourceReq-r14 SL-V2X-CommTxFreqList-r14 OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +SL-CommTxResourceReq-r12 ::= SEQUENCE { + carrierFreq-r12 ARFCN-ValueEUTRA-r9 OPTIONAL, + destinationInfoList-r12 SL-DestinationInfoList-r12 +} + +SL-DiscTxResourceReqPerFreqList-r13 ::= SEQUENCE (SIZE (1..maxFreq)) OF SL-DiscTxResourceReq-r13 + +SL-DiscTxResourceReq-r13 ::= SEQUENCE { + carrierFreqDiscTx-r13 INTEGER (1..maxFreq) OPTIONAL, + discTxResourceReq-r13 INTEGER (1..63) +} + +SL-DestinationInfoList-r12 ::= SEQUENCE (SIZE (1..maxSL-Dest-r12)) OF SL-DestinationIdentity-r12 + +SL-DestinationIdentity-r12 ::= BIT STRING (SIZE (24)) + +SL-DiscSysInfoReportFreqList-r13 ::= SEQUENCE (SIZE (1.. maxSL-DiscSysInfoReportFreq-r13)) OF SL-DiscSysInfoReport-r13 + +SL-V2X-CommFreqList-r14 ::= SEQUENCE (SIZE (1..maxFreqV2X-r14)) OF INTEGER (0..maxFreqV2X-1-r14) + +SL-V2X-CommTxFreqList-r14 ::= SEQUENCE (SIZE (1..maxFreqV2X-r14)) OF SL-V2X-CommTxResourceReq-r14 + +SL-V2X-CommTxResourceReq-r14 ::= SEQUENCE { + carrierFreqCommTx-r14 INTEGER (0.. maxFreqV2X-1-r14) OPTIONAL, + v2x-TypeTxSync-r14 SL-TypeTxSync-r14 OPTIONAL, + v2x-DestinationInfoList-r14 SL-DestinationInfoList-r12 OPTIONAL +} + +SL-TypeTxSyncList-r14 ::= SEQUENCE (SIZE (1..maxFreqV2X-r14)) OF SL-TypeTxSync-r14 + + +SystemInformation-BR-r13 ::= SystemInformation + +SystemInformation-MBMS-r14 ::= SystemInformation + +SystemInformation ::= SEQUENCE { + criticalExtensions CHOICE { + systemInformation-r8 SystemInformation-r8-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} +SystemInformation-r8-IEs ::= SEQUENCE { + sib-TypeAndInfo SEQUENCE (SIZE (1..maxSIB)) OF CHOICE { + sib2 SystemInformationBlockType2, + sib3 SystemInformationBlockType3, + sib4 SystemInformationBlockType4, + sib5 SystemInformationBlockType5, + sib6 SystemInformationBlockType6, + sib7 SystemInformationBlockType7, + sib8 SystemInformationBlockType8, + sib9 SystemInformationBlockType9, + sib10 SystemInformationBlockType10, + sib11 SystemInformationBlockType11, + ..., + sib12-v920 SystemInformationBlockType12-r9, + sib13-v920 SystemInformationBlockType13-r9, + sib14-v1130 SystemInformationBlockType14-r11, + sib15-v1130 SystemInformationBlockType15-r11, + sib16-v1130 SystemInformationBlockType16-r11, + sib17-v1250 SystemInformationBlockType17-r12, + sib18-v1250 SystemInformationBlockType18-r12, + sib19-v1250 SystemInformationBlockType19-r12, + sib20-v1310 SystemInformationBlockType20-r13, + sib21-v1430 SystemInformationBlockType21-r14 + }, + nonCriticalExtension SystemInformation-v8a0-IEs OPTIONAL +} + +SystemInformation-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SystemInformationBlockType1-BR-r13 ::= SystemInformationBlockType1 + +SystemInformationBlockType1 ::= SEQUENCE { + cellAccessRelatedInfo SEQUENCE { + plmn-IdentityList PLMN-IdentityList, + trackingAreaCode TrackingAreaCode, + cellIdentity CellIdentity, + cellBarred ENUMERATED {barred, notBarred}, + intraFreqReselection ENUMERATED {allowed, notAllowed}, + csg-Indication BOOLEAN, + csg-Identity CSG-Identity OPTIONAL -- Need OR + }, + cellSelectionInfo SEQUENCE { + q-RxLevMin Q-RxLevMin, + q-RxLevMinOffset INTEGER (1..8) OPTIONAL -- Need OP + }, + p-Max P-Max OPTIONAL, -- Need OP + freqBandIndicator FreqBandIndicator, + schedulingInfoList SchedulingInfoList, + tdd-Config TDD-Config OPTIONAL, -- Cond TDD + si-WindowLength ENUMERATED { + ms1, ms2, ms5, ms10, ms15, ms20, + ms40}, + systemInfoValueTag INTEGER (0..31), + nonCriticalExtension SystemInformationBlockType1-v890-IEs OPTIONAL +} + +SystemInformationBlockType1-v890-IEs::= SEQUENCE { + lateNonCriticalExtension OCTET STRING (CONTAINING SystemInformationBlockType1-v8h0-IEs) OPTIONAL, + nonCriticalExtension SystemInformationBlockType1-v920-IEs OPTIONAL +} + +-- Late non critical extensions +SystemInformationBlockType1-v8h0-IEs ::= SEQUENCE { + multiBandInfoList MultiBandInfoList OPTIONAL, -- Need OR + nonCriticalExtension SystemInformationBlockType1-v9e0-IEs OPTIONAL +} + +SystemInformationBlockType1-v9e0-IEs ::= SEQUENCE { + freqBandIndicator-v9e0 FreqBandIndicator-v9e0 OPTIONAL, -- Cond FBI-max + multiBandInfoList-v9e0 MultiBandInfoList-v9e0 OPTIONAL, -- Cond mFBI-max + nonCriticalExtension SystemInformationBlockType1-v10j0-IEs OPTIONAL +} + +SystemInformationBlockType1-v10j0-IEs ::= SEQUENCE { + freqBandInfo-r10 NS-PmaxList-r10 OPTIONAL, -- Need OR + multiBandInfoList-v10j0 MultiBandInfoList-v10j0 OPTIONAL, -- Need OR + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +-- Regular non critical extensions +SystemInformationBlockType1-v920-IEs ::= SEQUENCE { + ims-EmergencySupport-r9 ENUMERATED {true} OPTIONAL, -- Need OR + cellSelectionInfo-v920 CellSelectionInfo-v920 OPTIONAL, -- Cond RSRQ + nonCriticalExtension SystemInformationBlockType1-v1130-IEs OPTIONAL +} + +SystemInformationBlockType1-v1130-IEs ::= SEQUENCE { + tdd-Config-v1130 TDD-Config-v1130 OPTIONAL, -- Cond TDD-OR + cellSelectionInfo-v1130 CellSelectionInfo-v1130 OPTIONAL, -- Cond WB-RSRQ + nonCriticalExtension SystemInformationBlockType1-v1250-IEs OPTIONAL +} + +SystemInformationBlockType1-v1250-IEs ::= SEQUENCE { + cellAccessRelatedInfo-v1250 SEQUENCE { + category0Allowed-r12 ENUMERATED {true} OPTIONAL -- Need OP + }, + cellSelectionInfo-v1250 CellSelectionInfo-v1250 OPTIONAL, -- Cond RSRQ2 + freqBandIndicatorPriority-r12 ENUMERATED {true} OPTIONAL, -- Cond mFBI + nonCriticalExtension SystemInformationBlockType1-v1310-IEs OPTIONAL +} + +SystemInformationBlockType1-v1310-IEs ::= SEQUENCE { + hyperSFN-r13 BIT STRING (SIZE (10)) OPTIONAL, -- Need OR + eDRX-Allowed-r13 ENUMERATED {true} OPTIONAL, -- Need OR + cellSelectionInfoCE-r13 CellSelectionInfoCE-r13 OPTIONAL, -- Need OP + bandwidthReducedAccessRelatedInfo-r13 SEQUENCE { + si-WindowLength-BR-r13 ENUMERATED { + ms20, ms40, ms60, ms80, ms120, + ms160, ms200, spare}, + si-RepetitionPattern-r13 ENUMERATED {everyRF, every2ndRF, every4thRF, + every8thRF}, + schedulingInfoList-BR-r13 SchedulingInfoList-BR-r13 OPTIONAL, -- Need OR + fdd-DownlinkOrTddSubframeBitmapBR-r13 CHOICE { + subframePattern10-r13 BIT STRING (SIZE (10)), + subframePattern40-r13 BIT STRING (SIZE (40)) + } OPTIONAL, -- Need OP + fdd-UplinkSubframeBitmapBR-r13 BIT STRING (SIZE (10)) OPTIONAL, -- Need OP + startSymbolBR-r13 INTEGER (1..4), + si-HoppingConfigCommon-r13 ENUMERATED {on,off}, + si-ValidityTime-r13 ENUMERATED {true} OPTIONAL, -- Need OP + systemInfoValueTagList-r13 SystemInfoValueTagList-r13 OPTIONAL -- Need OR + } OPTIONAL, -- Cond BW-reduced + nonCriticalExtension SystemInformationBlockType1-v1320-IEs OPTIONAL +} + +SystemInformationBlockType1-v1320-IEs ::= SEQUENCE { + freqHoppingParametersDL-r13 SEQUENCE { + mpdcch-pdsch-HoppingNB-r13 ENUMERATED {nb2, nb4} OPTIONAL, -- Need OR + interval-DLHoppingConfigCommonModeA-r13 CHOICE { + interval-FDD-r13 ENUMERATED {int1, int2, int4, int8}, + interval-TDD-r13 ENUMERATED {int1, int5, int10, int20} + } OPTIONAL, -- Need OR + interval-DLHoppingConfigCommonModeB-r13 CHOICE { + interval-FDD-r13 ENUMERATED {int2, int4, int8, int16}, + interval-TDD-r13 ENUMERATED { int5, int10, int20, int40} + } OPTIONAL, -- Need OR + mpdcch-pdsch-HoppingOffset-r13 INTEGER (1..maxAvailNarrowBands-r13) OPTIONAL -- Need OR + } OPTIONAL, -- Cond Hopping + nonCriticalExtension SystemInformationBlockType1-v1350-IEs OPTIONAL +} + +SystemInformationBlockType1-v1350-IEs ::= SEQUENCE { + cellSelectionInfoCE1-r13 CellSelectionInfoCE1-r13 OPTIONAL, -- Need OP + nonCriticalExtension SystemInformationBlockType1-v1360-IEs OPTIONAL +} + +SystemInformationBlockType1-v1360-IEs ::= SEQUENCE { + cellSelectionInfoCE1-v1360 CellSelectionInfoCE1-v1360 OPTIONAL, -- Cond QrxlevminCE1 + nonCriticalExtension SystemInformationBlockType1-v1430-IEs OPTIONAL +} + +SystemInformationBlockType1-v1430-IEs ::= SEQUENCE { + eCallOverIMS-Support-r14 ENUMERATED {true} OPTIONAL, -- Need OR + tdd-Config-v1430 TDD-Config-v1430 OPTIONAL, -- Cond TDD-OR + cellAccessRelatedInfoList-r14 SEQUENCE (SIZE (1..maxPLMN-1-r14)) OF + CellAccessRelatedInfo-r14 OPTIONAL, -- Need OR + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +PLMN-IdentityList ::= SEQUENCE (SIZE (1..maxPLMN-r11)) OF PLMN-IdentityInfo + +PLMN-IdentityInfo ::= SEQUENCE { + plmn-Identity PLMN-Identity, + cellReservedForOperatorUse ENUMERATED {reserved, notReserved} +} + +SchedulingInfoList ::= SEQUENCE (SIZE (1..maxSI-Message)) OF SchedulingInfo + +SchedulingInfo ::= SEQUENCE { + si-Periodicity ENUMERATED { + rf8, rf16, rf32, rf64, rf128, rf256, rf512}, + sib-MappingInfo SIB-MappingInfo +} + +SchedulingInfoList-BR-r13 ::= SEQUENCE (SIZE (1..maxSI-Message)) OF SchedulingInfo-BR-r13 + +SchedulingInfo-BR-r13 ::= SEQUENCE { + si-Narrowband-r13 INTEGER (1..maxAvailNarrowBands-r13), + si-TBS-r13 ENUMERATED {b152, b208, b256, b328, b408, b504, b600, b712, + b808, b936} +} + +SIB-MappingInfo ::= SEQUENCE (SIZE (0..maxSIB-1)) OF SIB-Type + +SIB-Type ::= ENUMERATED { + sibType3, sibType4, sibType5, sibType6, + sibType7, sibType8, sibType9, sibType10, + sibType11, sibType12-v920, sibType13-v920, + sibType14-v1130, sibType15-v1130, + sibType16-v1130, sibType17-v1250, sibType18-v1250, + ..., sibType19-v1250, sibType20-v1310, sibType21-v1430} + +SystemInfoValueTagList-r13 ::= SEQUENCE (SIZE (1..maxSI-Message)) OF SystemInfoValueTagSI-r13 + +SystemInfoValueTagSI-r13 ::= INTEGER (0..3) + +CellSelectionInfo-v920 ::= SEQUENCE { + q-QualMin-r9 Q-QualMin-r9, + q-QualMinOffset-r9 INTEGER (1..8) OPTIONAL -- Need OP +} + +CellSelectionInfo-v1130 ::= SEQUENCE { + q-QualMinWB-r11 Q-QualMin-r9 +} + +CellSelectionInfo-v1250 ::= SEQUENCE { + q-QualMinRSRQ-OnAllSymbols-r12 Q-QualMin-r9 +} + +CellAccessRelatedInfo-r14 ::= SEQUENCE { + plmn-IdentityList-r14 PLMN-IdentityList, + trackingAreaCode-r14 TrackingAreaCode, + cellIdentity-r14 CellIdentity +} + + +SystemInformationBlockType1-MBMS-r14 ::= SEQUENCE { + cellAccessRelatedInfo-r14 SEQUENCE { + plmn-IdentityList-r14 PLMN-IdentityList-MBMS-r14, + trackingAreaCode-r14 TrackingAreaCode, + cellIdentity-r14 CellIdentity + }, + freqBandIndicator-r14 FreqBandIndicator-r11, + multiBandInfoList-r14 MultiBandInfoList-r11 OPTIONAL, -- Need OR + schedulingInfoList-MBMS-r14 SchedulingInfoList-MBMS-r14, + si-WindowLength-r14 ENUMERATED { + ms1, ms2, ms5, ms10, ms15, ms20,ms40, ms80}, + systemInfoValueTag-r14 INTEGER (0..31), + nonMBSFN-SubframeConfig-r14 NonMBSFN-SubframeConfig-r14 OPTIONAL, --Need OR + pdsch-ConfigCommon-r14 PDSCH-ConfigCommon, + systemInformationBlockType13-r14 SystemInformationBlockType13-r9 OPTIONAL, --Need OR + cellAccessRelatedInfoList-r14 SEQUENCE (SIZE (1..maxPLMN-1-r14)) OF + CellAccessRelatedInfo-r14 OPTIONAL, -- Need OR + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +PLMN-IdentityList-MBMS-r14 ::= SEQUENCE (SIZE (1..maxPLMN-r11)) OF PLMN-Identity + +SchedulingInfoList-MBMS-r14 ::= SEQUENCE (SIZE (1..maxSI-Message)) OF SchedulingInfo-MBMS-r14 + +SchedulingInfo-MBMS-r14 ::= SEQUENCE { + si-Periodicity-r14 ENUMERATED { + rf16, rf32, rf64, rf128, rf256, rf512}, + sib-MappingInfo-r14 SIB-MappingInfo-MBMS-r14 +} + +SIB-MappingInfo-MBMS-r14 ::= SEQUENCE (SIZE (0..maxSIB-1)) OF SIB-Type-MBMS-r14 + +SIB-Type-MBMS-r14 ::= ENUMERATED { + sibType10, sibType11, sibType12-v920, sibType13-v920, + sibType15-v1130, sibType16-v1130, ...} + + +NonMBSFN-SubframeConfig-r14 ::= SEQUENCE { + radioFrameAllocationPeriod-r14 ENUMERATED {rf4, rf8, rf16, rf32, rf64, rf128, rf512}, + radioFrameAllocationOffset-r14 INTEGER (0..7), + subframeAllocation-r14 BIT STRING (SIZE(9)) +} + + +UEAssistanceInformation-r11 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + ueAssistanceInformation-r11 UEAssistanceInformation-r11-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UEAssistanceInformation-r11-IEs ::= SEQUENCE { + powerPrefIndication-r11 ENUMERATED {normal, lowPowerConsumption} OPTIONAL, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension UEAssistanceInformation-v1430-IEs OPTIONAL +} + +UEAssistanceInformation-v1430-IEs ::= SEQUENCE { + bw-Preference-r14 BW-Preference-r14 OPTIONAL, + sps-AssistanceInformation-r14 SEQUENCE { + trafficPatternInfoListSL-r14 TrafficPatternInfoList-r14 OPTIONAL, + trafficPatternInfoListUL-r14 TrafficPatternInfoList-r14 OPTIONAL + } OPTIONAL, + rlm-Report-r14 SEQUENCE { + rlm-Event-r14 ENUMERATED {earlyOutOfSync, earlyInSync}, + excessRep-MPDCCH-r14 ENUMERATED {excessRep1, excessRep2} OPTIONAL + } OPTIONAL, delayBudgetReport-r14 DelayBudgetReport-r14 OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +BW-Preference-r14 ::= SEQUENCE { + dl-Preference-r14 ENUMERATED {mhz1dot4, mhz5, mhz20 } OPTIONAL, + ul-Preference-r14 ENUMERATED {mhz1dot4, mhz5} OPTIONAL +} + +TrafficPatternInfoList-r14 ::= SEQUENCE (SIZE (1..maxTrafficPattern-r14)) OF TrafficPatternInfo-r14 + +TrafficPatternInfo-r14 ::= SEQUENCE { + trafficPeriodicity-r14 ENUMERATED { + sf20, sf50, sf100, sf200, sf300, sf400, sf500, + sf600, sf700, sf800, sf900, sf1000}, + timingOffset-r14 INTEGER (0..10239), + priorityInfoSL-r14 SL-Priority-r13 OPTIONAL, + logicalChannelIdentityUL-r14 INTEGER (3..10) OPTIONAL, + messageSize-r14 BIT STRING (SIZE (6)) +} + +DelayBudgetReport-r14::= CHOICE { + type1 ENUMERATED { + msMinus1280, msMinus640, msMinus320, msMinus160, + msMinus80, msMinus60, msMinus40, msMinus20, ms0, ms20, ms40, ms60, ms80, ms160, ms320, ms640, ms1280}, + + type2 ENUMERATED { + msMinus192, msMinus168,msMinus144, msMinus120, + msMinus96, msMinus72, msMinus48, msMinus24, ms0, ms24, ms48, ms72, ms96, ms120, ms144, ms168, ms192} +} + + +UECapabilityEnquiry ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + ueCapabilityEnquiry-r8 UECapabilityEnquiry-r8-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UECapabilityEnquiry-r8-IEs ::= SEQUENCE { + ue-CapabilityRequest UE-CapabilityRequest, + nonCriticalExtension UECapabilityEnquiry-v8a0-IEs OPTIONAL +} + +UECapabilityEnquiry-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension UECapabilityEnquiry-v1180-IEs OPTIONAL +} + +UECapabilityEnquiry-v1180-IEs ::= SEQUENCE { + requestedFrequencyBands-r11 SEQUENCE (SIZE (1..16)) OF FreqBandIndicator-r11 OPTIONAL, + nonCriticalExtension UECapabilityEnquiry-v1310-IEs OPTIONAL +} + +UECapabilityEnquiry-v1310-IEs ::= SEQUENCE { + requestReducedFormat-r13 ENUMERATED {true} OPTIONAL, -- Need ON + requestSkipFallbackComb-r13 ENUMERATED {true} OPTIONAL, -- Need ON + requestedMaxCCsDL-r13 INTEGER (2..32) OPTIONAL, -- Need ON + requestedMaxCCsUL-r13 INTEGER (2..32) OPTIONAL, -- Need ON + requestReducedIntNonContComb-r13 ENUMERATED {true} OPTIONAL, -- Need ON + nonCriticalExtension UECapabilityEnquiry-v1430-IEs OPTIONAL +} + +UECapabilityEnquiry-v1430-IEs ::= SEQUENCE { + requestDiffFallbackCombList-r14 BandCombinationList-r14 OPTIONAL, -- Need ON + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +UE-CapabilityRequest ::= SEQUENCE (SIZE (1..maxRAT-Capabilities)) OF RAT-Type + + +UECapabilityInformation ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE{ + ueCapabilityInformation-r8 UECapabilityInformation-r8-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UECapabilityInformation-r8-IEs ::= SEQUENCE { + ue-CapabilityRAT-ContainerList UE-CapabilityRAT-ContainerList, + nonCriticalExtension UECapabilityInformation-v8a0-IEs OPTIONAL +} + +UECapabilityInformation-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension UECapabilityInformation-v1250-IEs OPTIONAL +} + +UECapabilityInformation-v1250-IEs ::= SEQUENCE { + ue-RadioPagingInfo-r12 UE-RadioPagingInfo-r12 OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +UEInformationRequest-r9 ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + ueInformationRequest-r9 UEInformationRequest-r9-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UEInformationRequest-r9-IEs ::= SEQUENCE { + rach-ReportReq-r9 BOOLEAN, + rlf-ReportReq-r9 BOOLEAN, + nonCriticalExtension UEInformationRequest-v930-IEs OPTIONAL +} + +UEInformationRequest-v930-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension UEInformationRequest-v1020-IEs OPTIONAL +} + +UEInformationRequest-v1020-IEs ::= SEQUENCE { + logMeasReportReq-r10 ENUMERATED {true} OPTIONAL, -- Need ON + nonCriticalExtension UEInformationRequest-v1130-IEs OPTIONAL +} + +UEInformationRequest-v1130-IEs ::= SEQUENCE { + connEstFailReportReq-r11 ENUMERATED {true} OPTIONAL, -- Need ON + nonCriticalExtension UEInformationRequest-v1250-IEs OPTIONAL +} + +UEInformationRequest-v1250-IEs ::= SEQUENCE { + mobilityHistoryReportReq-r12 ENUMERATED {true} OPTIONAL, -- Need ON + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +UEInformationResponse-r9 ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + ueInformationResponse-r9 UEInformationResponse-r9-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UEInformationResponse-r9-IEs ::= SEQUENCE { + rach-Report-r9 SEQUENCE { + numberOfPreamblesSent-r9 NumberOfPreamblesSent-r11, + contentionDetected-r9 BOOLEAN + } OPTIONAL, + rlf-Report-r9 RLF-Report-r9 OPTIONAL, + nonCriticalExtension UEInformationResponse-v930-IEs OPTIONAL +} + +-- Late non critical extensions +UEInformationResponse-v9e0-IEs ::= SEQUENCE { + rlf-Report-v9e0 RLF-Report-v9e0 OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +-- Regular non critical extensions +UEInformationResponse-v930-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING (CONTAINING UEInformationResponse-v9e0-IEs) OPTIONAL, + nonCriticalExtension UEInformationResponse-v1020-IEs OPTIONAL +} + +UEInformationResponse-v1020-IEs ::= SEQUENCE { + logMeasReport-r10 LogMeasReport-r10 OPTIONAL, + nonCriticalExtension UEInformationResponse-v1130-IEs OPTIONAL +} + +UEInformationResponse-v1130-IEs ::= SEQUENCE { + connEstFailReport-r11 ConnEstFailReport-r11 OPTIONAL, + nonCriticalExtension UEInformationResponse-v1250-IEs OPTIONAL +} + +UEInformationResponse-v1250-IEs ::= SEQUENCE { + mobilityHistoryReport-r12 MobilityHistoryReport-r12 OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +RLF-Report-r9 ::= SEQUENCE { + measResultLastServCell-r9 SEQUENCE { + rsrpResult-r9 RSRP-Range, + rsrqResult-r9 RSRQ-Range OPTIONAL + }, + measResultNeighCells-r9 SEQUENCE { + measResultListEUTRA-r9 MeasResultList2EUTRA-r9 OPTIONAL, + measResultListUTRA-r9 MeasResultList2UTRA-r9 OPTIONAL, + measResultListGERAN-r9 MeasResultListGERAN OPTIONAL, + measResultsCDMA2000-r9 MeasResultList2CDMA2000-r9 OPTIONAL + } OPTIONAL, + ..., + [[ locationInfo-r10 LocationInfo-r10 OPTIONAL, + failedPCellId-r10 CHOICE { + cellGlobalId-r10 CellGlobalIdEUTRA, + pci-arfcn-r10 SEQUENCE { + physCellId-r10 PhysCellId, + carrierFreq-r10 ARFCN-ValueEUTRA + } + } OPTIONAL, + reestablishmentCellId-r10 CellGlobalIdEUTRA OPTIONAL, + timeConnFailure-r10 INTEGER (0..1023) OPTIONAL, + connectionFailureType-r10 ENUMERATED {rlf, hof} OPTIONAL, + previousPCellId-r10 CellGlobalIdEUTRA OPTIONAL + ]], + [[ failedPCellId-v1090 SEQUENCE { + carrierFreq-v1090 ARFCN-ValueEUTRA-v9e0 + } OPTIONAL + ]], + [[ basicFields-r11 SEQUENCE { + c-RNTI-r11 C-RNTI, + rlf-Cause-r11 ENUMERATED { + t310-Expiry, randomAccessProblem, + rlc-MaxNumRetx, t312-Expiry-r12}, + timeSinceFailure-r11 TimeSinceFailure-r11 + } OPTIONAL, + previousUTRA-CellId-r11 SEQUENCE { + carrierFreq-r11 ARFCN-ValueUTRA, + physCellId-r11 CHOICE { + fdd-r11 PhysCellIdUTRA-FDD, + tdd-r11 PhysCellIdUTRA-TDD + }, + cellGlobalId-r11 CellGlobalIdUTRA OPTIONAL + } OPTIONAL, + selectedUTRA-CellId-r11 SEQUENCE { + carrierFreq-r11 ARFCN-ValueUTRA, + physCellId-r11 CHOICE { + fdd-r11 PhysCellIdUTRA-FDD, + tdd-r11 PhysCellIdUTRA-TDD + } + } OPTIONAL + ]], + [[ failedPCellId-v1250 SEQUENCE { + tac-FailedPCell-r12 TrackingAreaCode + } OPTIONAL, + measResultLastServCell-v1250 RSRQ-Range-v1250 OPTIONAL, + lastServCellRSRQ-Type-r12 RSRQ-Type-r12 OPTIONAL, + measResultListEUTRA-v1250 MeasResultList2EUTRA-v1250 OPTIONAL + ]], + [[ drb-EstablishedWithQCI-1-r13 ENUMERATED {qci1} OPTIONAL + ]], + [[ measResultLastServCell-v1360 RSRP-Range-v1360 OPTIONAL + ]] +} + +RLF-Report-v9e0 ::= SEQUENCE { + measResultListEUTRA-v9e0 MeasResultList2EUTRA-v9e0 +} + +MeasResultList2EUTRA-r9 ::= SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2EUTRA-r9 + +MeasResultList2EUTRA-v9e0 ::= SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2EUTRA-v9e0 + +MeasResultList2EUTRA-v1250 ::= SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2EUTRA-v1250 + +MeasResult2EUTRA-r9 ::= SEQUENCE { + carrierFreq-r9 ARFCN-ValueEUTRA, + measResultList-r9 MeasResultListEUTRA +} + +MeasResult2EUTRA-v9e0 ::= SEQUENCE { + carrierFreq-v9e0 ARFCN-ValueEUTRA-v9e0 OPTIONAL +} + +MeasResult2EUTRA-v1250 ::= SEQUENCE { + rsrq-Type-r12 RSRQ-Type-r12 OPTIONAL +} + +MeasResultList2UTRA-r9 ::= SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2UTRA-r9 + +MeasResult2UTRA-r9 ::= SEQUENCE { + carrierFreq-r9 ARFCN-ValueUTRA, + measResultList-r9 MeasResultListUTRA +} + +MeasResultList2CDMA2000-r9 ::= SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2CDMA2000-r9 + +MeasResult2CDMA2000-r9 ::= SEQUENCE { + carrierFreq-r9 CarrierFreqCDMA2000, + measResultList-r9 MeasResultsCDMA2000 +} + +LogMeasReport-r10 ::= SEQUENCE { + absoluteTimeStamp-r10 AbsoluteTimeInfo-r10, + traceReference-r10 TraceReference-r10, + traceRecordingSessionRef-r10 OCTET STRING (SIZE (2)), + tce-Id-r10 OCTET STRING (SIZE (1)), + logMeasInfoList-r10 LogMeasInfoList-r10, + logMeasAvailable-r10 ENUMERATED {true} OPTIONAL, + ... +} + +LogMeasInfoList-r10 ::= SEQUENCE (SIZE (1..maxLogMeasReport-r10)) OF LogMeasInfo-r10 + +LogMeasInfo-r10 ::= SEQUENCE { + locationInfo-r10 LocationInfo-r10 OPTIONAL, + relativeTimeStamp-r10 INTEGER (0..7200), + servCellIdentity-r10 CellGlobalIdEUTRA, + measResultServCell-r10 SEQUENCE { + rsrpResult-r10 RSRP-Range, + rsrqResult-r10 RSRQ-Range + }, + measResultNeighCells-r10 SEQUENCE { + measResultListEUTRA-r10 MeasResultList2EUTRA-r9 OPTIONAL, + measResultListUTRA-r10 MeasResultList2UTRA-r9 OPTIONAL, + measResultListGERAN-r10 MeasResultList2GERAN-r10 OPTIONAL, + measResultListCDMA2000-r10 MeasResultList2CDMA2000-r9 OPTIONAL + } OPTIONAL, + ..., + [[ measResultListEUTRA-v1090 MeasResultList2EUTRA-v9e0 OPTIONAL + ]], + [[ measResultListMBSFN-r12 MeasResultListMBSFN-r12 OPTIONAL, + measResultServCell-v1250 RSRQ-Range-v1250 OPTIONAL, + servCellRSRQ-Type-r12 RSRQ-Type-r12 OPTIONAL, + measResultListEUTRA-v1250 MeasResultList2EUTRA-v1250 OPTIONAL + ]], + [[ inDeviceCoexDetected-r13 ENUMERATED {true} OPTIONAL + ]], + [[ measResultServCell-v1360 RSRP-Range-v1360 OPTIONAL + ]] +} + +MeasResultListMBSFN-r12 ::= SEQUENCE (SIZE (1..maxMBSFN-Area)) OF MeasResultMBSFN-r12 + +MeasResultMBSFN-r12 ::= SEQUENCE { + mbsfn-Area-r12 SEQUENCE { + mbsfn-AreaId-r12 MBSFN-AreaId-r12, + carrierFreq-r12 ARFCN-ValueEUTRA-r9 + }, + rsrpResultMBSFN-r12 RSRP-Range, + rsrqResultMBSFN-r12 MBSFN-RSRQ-Range-r12, + signallingBLER-Result-r12 BLER-Result-r12 OPTIONAL, + dataBLER-MCH-ResultList-r12 DataBLER-MCH-ResultList-r12 OPTIONAL, + ... +} + +DataBLER-MCH-ResultList-r12 ::= SEQUENCE (SIZE (1.. maxPMCH-PerMBSFN)) OF DataBLER-MCH-Result-r12 + +DataBLER-MCH-Result-r12 ::= SEQUENCE { + mch-Index-r12 INTEGER (1..maxPMCH-PerMBSFN), + dataBLER-Result-r12 BLER-Result-r12 +} + +BLER-Result-r12 ::= SEQUENCE { + bler-r12 BLER-Range-r12, + blocksReceived-r12 SEQUENCE { + n-r12 BIT STRING (SIZE (3)), + m-r12 BIT STRING (SIZE (8)) + } +} + +BLER-Range-r12 ::= INTEGER(0..31) + +MeasResultList2GERAN-r10 ::= SEQUENCE (SIZE (1..maxCellListGERAN)) OF MeasResultListGERAN + +ConnEstFailReport-r11 ::= SEQUENCE { + failedCellId-r11 CellGlobalIdEUTRA, + locationInfo-r11 LocationInfo-r10 OPTIONAL, + measResultFailedCell-r11 SEQUENCE { + rsrpResult-r11 RSRP-Range, + rsrqResult-r11 RSRQ-Range OPTIONAL + }, + measResultNeighCells-r11 SEQUENCE { + measResultListEUTRA-r11 MeasResultList2EUTRA-r9 OPTIONAL, + measResultListUTRA-r11 MeasResultList2UTRA-r9 OPTIONAL, + measResultListGERAN-r11 MeasResultListGERAN OPTIONAL, + measResultsCDMA2000-r11 MeasResultList2CDMA2000-r9 OPTIONAL + } OPTIONAL, + numberOfPreamblesSent-r11 NumberOfPreamblesSent-r11, + contentionDetected-r11 BOOLEAN, + maxTxPowerReached-r11 BOOLEAN, + timeSinceFailure-r11 TimeSinceFailure-r11, + measResultListEUTRA-v1130 MeasResultList2EUTRA-v9e0 OPTIONAL, + ..., + [[ measResultFailedCell-v1250 RSRQ-Range-v1250 OPTIONAL, + failedCellRSRQ-Type-r12 RSRQ-Type-r12 OPTIONAL, + measResultListEUTRA-v1250 MeasResultList2EUTRA-v1250 OPTIONAL + ]], + [[ measResultFailedCell-v1360 RSRP-Range-v1360 OPTIONAL + ]] +} + +NumberOfPreamblesSent-r11::= INTEGER (1..200) + +TimeSinceFailure-r11 ::= INTEGER (0..172800) + +MobilityHistoryReport-r12 ::= VisitedCellInfoList-r12 + + +ULHandoverPreparationTransfer ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + ulHandoverPreparationTransfer-r8 ULHandoverPreparationTransfer-r8-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +ULHandoverPreparationTransfer-r8-IEs ::= SEQUENCE { + cdma2000-Type CDMA2000-Type, + meid BIT STRING (SIZE (56)) OPTIONAL, + dedicatedInfo DedicatedInfoCDMA2000, + nonCriticalExtension ULHandoverPreparationTransfer-v8a0-IEs OPTIONAL +} + +ULHandoverPreparationTransfer-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +ULInformationTransfer ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + ulInformationTransfer-r8 ULInformationTransfer-r8-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +ULInformationTransfer-r8-IEs ::= SEQUENCE { + dedicatedInfoType CHOICE { + dedicatedInfoNAS DedicatedInfoNAS, + dedicatedInfoCDMA2000-1XRTT DedicatedInfoCDMA2000, + dedicatedInfoCDMA2000-HRPD DedicatedInfoCDMA2000 + }, + nonCriticalExtension ULInformationTransfer-v8a0-IEs OPTIONAL +} + +ULInformationTransfer-v8a0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +WLANConnectionStatusReport-r13 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + wlanConnectionStatusReport-r13 WLANConnectionStatusReport-r13-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +WLANConnectionStatusReport-r13-IEs ::= SEQUENCE { + wlan-Status-r13 WLAN-Status-r13, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension WLANConnectionStatusReport-v1430-IEs OPTIONAL +} + +WLANConnectionStatusReport-v1430-IEs ::= SEQUENCE { + wlan-Status-v1430 WLAN-Status-v1430, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SystemInformationBlockType2 ::= SEQUENCE { + ac-BarringInfo SEQUENCE { + ac-BarringForEmergency BOOLEAN, + ac-BarringForMO-Signalling AC-BarringConfig OPTIONAL, -- Need OP + ac-BarringForMO-Data AC-BarringConfig OPTIONAL -- Need OP + } OPTIONAL, -- Need OP + radioResourceConfigCommon RadioResourceConfigCommonSIB, + ue-TimersAndConstants UE-TimersAndConstants, + freqInfo SEQUENCE { + ul-CarrierFreq ARFCN-ValueEUTRA OPTIONAL, -- Need OP + ul-Bandwidth ENUMERATED {n6, n15, n25, n50, n75, n100} + OPTIONAL, -- Need OP + additionalSpectrumEmission AdditionalSpectrumEmission + }, + mbsfn-SubframeConfigList MBSFN-SubframeConfigList OPTIONAL, -- Need OR + timeAlignmentTimerCommon TimeAlignmentTimer, + ..., + lateNonCriticalExtension OCTET STRING (CONTAINING SystemInformationBlockType2-v8h0-IEs) OPTIONAL, + [[ ssac-BarringForMMTEL-Voice-r9 AC-BarringConfig OPTIONAL, -- Need OP + ssac-BarringForMMTEL-Video-r9 AC-BarringConfig OPTIONAL -- Need OP + ]], + [[ ac-BarringForCSFB-r10 AC-BarringConfig OPTIONAL -- Need OP + ]], + [[ ac-BarringSkipForMMTELVoice-r12 ENUMERATED {true} OPTIONAL, -- Need OP + ac-BarringSkipForMMTELVideo-r12 ENUMERATED {true} OPTIONAL, -- Need OP + ac-BarringSkipForSMS-r12 ENUMERATED {true} OPTIONAL, -- Need OP + ac-BarringPerPLMN-List-r12 AC-BarringPerPLMN-List-r12 OPTIONAL -- Need OP + ]], + [[ voiceServiceCauseIndication-r12 ENUMERATED {true} OPTIONAL -- Need OP + ]], + [[ acdc-BarringForCommon-r13 ACDC-BarringForCommon-r13 OPTIONAL, -- Need OP + acdc-BarringPerPLMN-List-r13 ACDC-BarringPerPLMN-List-r13 OPTIONAL -- Need OP + ]], + [[ + udt-RestrictingForCommon-r13 UDT-Restricting-r13 OPTIONAL, -- Need OR + udt-RestrictingPerPLMN-List-r13 UDT-RestrictingPerPLMN-List-r13 OPTIONAL, -- Need OR + cIoT-EPS-OptimisationInfo-r13 CIOT-EPS-OptimisationInfo-r13 OPTIONAL, -- Need OP + useFullResumeID-r13 ENUMERATED {true} OPTIONAL -- Need OP + ]], + [[ unicastFreqHoppingInd-r13 ENUMERATED {true} OPTIONAL -- Need OP + ]], + [[ mbsfn-SubframeConfigList-v1430 MBSFN-SubframeConfigList-v1430 OPTIONAL, -- Need OP + videoServiceCauseIndication-r14 ENUMERATED {true} OPTIONAL -- Need OP + ]] + +} + +SystemInformationBlockType2-v8h0-IEs ::= SEQUENCE { + multiBandInfoList SEQUENCE (SIZE (1..maxMultiBands)) OF AdditionalSpectrumEmission OPTIONAL, -- Need OR + nonCriticalExtension SystemInformationBlockType2-v9e0-IEs OPTIONAL +} + +SystemInformationBlockType2-v9e0-IEs ::= SEQUENCE { + ul-CarrierFreq-v9e0 ARFCN-ValueEUTRA-v9e0 OPTIONAL, -- Cond ul-FreqMax + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +AC-BarringConfig ::= SEQUENCE { + ac-BarringFactor ENUMERATED { + p00, p05, p10, p15, p20, p25, p30, p40, + p50, p60, p70, p75, p80, p85, p90, p95}, + ac-BarringTime ENUMERATED {s4, s8, s16, s32, s64, s128, s256, s512}, + ac-BarringForSpecialAC BIT STRING (SIZE(5)) +} + +MBSFN-SubframeConfigList ::= SEQUENCE (SIZE (1..maxMBSFN-Allocations)) OF MBSFN-SubframeConfig + +MBSFN-SubframeConfigList-v1430 ::= SEQUENCE (SIZE (1..maxMBSFN-Allocations)) OF MBSFN-SubframeConfig-v1430 + +AC-BarringPerPLMN-List-r12 ::= SEQUENCE (SIZE (1.. maxPLMN-r11)) OF AC-BarringPerPLMN-r12 + +AC-BarringPerPLMN-r12 ::= SEQUENCE { + plmn-IdentityIndex-r12 INTEGER (1..maxPLMN-r11), + ac-BarringInfo-r12 SEQUENCE { + ac-BarringForEmergency-r12 BOOLEAN, + ac-BarringForMO-Signalling-r12 AC-BarringConfig OPTIONAL, -- Need OP + ac-BarringForMO-Data-r12 AC-BarringConfig OPTIONAL -- Need OP + } OPTIONAL, -- Need OP + ac-BarringSkipForMMTELVoice-r12 ENUMERATED {true} OPTIONAL, -- Need OP + ac-BarringSkipForMMTELVideo-r12 ENUMERATED {true} OPTIONAL, -- Need OP + ac-BarringSkipForSMS-r12 ENUMERATED {true} OPTIONAL, -- Need OP + ac-BarringForCSFB-r12 AC-BarringConfig OPTIONAL, -- Need OP + ssac-BarringForMMTEL-Voice-r12 AC-BarringConfig OPTIONAL, -- Need OP + ssac-BarringForMMTEL-Video-r12 AC-BarringConfig OPTIONAL -- Need OP +} + +ACDC-BarringForCommon-r13 ::= SEQUENCE { + acdc-HPLMNonly-r13 BOOLEAN, + barringPerACDC-CategoryList-r13 BarringPerACDC-CategoryList-r13 +} + +ACDC-BarringPerPLMN-List-r13 ::= SEQUENCE (SIZE (1.. maxPLMN-r11)) OF ACDC-BarringPerPLMN-r13 + +ACDC-BarringPerPLMN-r13 ::= SEQUENCE { + plmn-IdentityIndex-r13 INTEGER (1..maxPLMN-r11), + acdc-OnlyForHPLMN-r13 BOOLEAN, + barringPerACDC-CategoryList-r13 BarringPerACDC-CategoryList-r13 +} + +BarringPerACDC-CategoryList-r13 ::= SEQUENCE (SIZE (1..maxACDC-Cat-r13)) OF BarringPerACDC-Category-r13 + +BarringPerACDC-Category-r13 ::= SEQUENCE { + acdc-Category-r13 INTEGER (1..maxACDC-Cat-r13), + acdc-BarringConfig-r13 SEQUENCE { + ac-BarringFactor-r13 ENUMERATED { + p00, p05, p10, p15, p20, p25, p30, p40, + p50, p60, p70, p75, p80, p85, p90, p95}, + ac-BarringTime-r13 ENUMERATED {s4, s8, s16, s32, s64, s128, s256, s512} + } OPTIONAL -- Need OP +} + +UDT-Restricting-r13 ::= SEQUENCE { + udt-Restricting-r13 ENUMERATED {true} OPTIONAL, --Need OR + udt-RestrictingTime-r13 ENUMERATED {s4, s8, s16, s32, s64, s128, s256, s512} OPTIONAL --Need OR +} + +UDT-RestrictingPerPLMN-List-r13 ::= SEQUENCE (SIZE (1..maxPLMN-r11)) OF UDT-RestrictingPerPLMN-r13 + +UDT-RestrictingPerPLMN-r13 ::= SEQUENCE { + plmn-IdentityIndex-r13 INTEGER (1..maxPLMN-r11), + udt-Restricting-r13 UDT-Restricting-r13 OPTIONAL --Need OR +} + +CIOT-EPS-OptimisationInfo-r13 ::= SEQUENCE (SIZE (1.. maxPLMN-r11)) OF CIOT-OptimisationPLMN-r13 + +CIOT-OptimisationPLMN-r13::= SEQUENCE { + up-CIoT-EPS-Optimisation-r13 ENUMERATED {true} OPTIONAL, -- Need OP + cp-CIoT-EPS-Optimisation-r13 ENUMERATED {true} OPTIONAL, -- Need OP + attachWithoutPDN-Connectivity-r13 ENUMERATED {true} OPTIONAL -- Need OP +} + + +SystemInformationBlockType3 ::= SEQUENCE { + cellReselectionInfoCommon SEQUENCE { + q-Hyst ENUMERATED { + dB0, dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10, + dB12, dB14, dB16, dB18, dB20, dB22, dB24}, + speedStateReselectionPars SEQUENCE { + mobilityStateParameters MobilityStateParameters, + q-HystSF SEQUENCE { + sf-Medium ENUMERATED { + dB-6, dB-4, dB-2, dB0}, + sf-High ENUMERATED { + dB-6, dB-4, dB-2, dB0} + } + } OPTIONAL -- Need OP + }, + cellReselectionServingFreqInfo SEQUENCE { + s-NonIntraSearch ReselectionThreshold OPTIONAL, -- Need OP + threshServingLow ReselectionThreshold, + cellReselectionPriority CellReselectionPriority + }, + intraFreqCellReselectionInfo SEQUENCE { + q-RxLevMin Q-RxLevMin, + p-Max P-Max OPTIONAL, -- Need OP + s-IntraSearch ReselectionThreshold OPTIONAL, -- Need OP + allowedMeasBandwidth AllowedMeasBandwidth OPTIONAL, -- Need OP + presenceAntennaPort1 PresenceAntennaPort1, + neighCellConfig NeighCellConfig, + t-ReselectionEUTRA T-Reselection, + t-ReselectionEUTRA-SF SpeedStateScaleFactors OPTIONAL -- Need OP + }, + ..., + lateNonCriticalExtension OCTET STRING (CONTAINING SystemInformationBlockType3-v10j0-IEs) OPTIONAL, + [[ s-IntraSearch-v920 SEQUENCE { + s-IntraSearchP-r9 ReselectionThreshold, + s-IntraSearchQ-r9 ReselectionThresholdQ-r9 + } OPTIONAL, -- Need OP + s-NonIntraSearch-v920 SEQUENCE { + s-NonIntraSearchP-r9 ReselectionThreshold, + s-NonIntraSearchQ-r9 ReselectionThresholdQ-r9 + } OPTIONAL, -- Need OP + q-QualMin-r9 Q-QualMin-r9 OPTIONAL, -- Need OP + threshServingLowQ-r9 ReselectionThresholdQ-r9 OPTIONAL -- Need OP + ]], + [[ q-QualMinWB-r11 Q-QualMin-r9 OPTIONAL -- Cond WB-RSRQ + ]], + [[ q-QualMinRSRQ-OnAllSymbols-r12 Q-QualMin-r9 OPTIONAL -- Cond RSRQ + ]], + [[ cellReselectionServingFreqInfo-v1310 CellReselectionServingFreqInfo-v1310 OPTIONAL, -- Need OP + redistributionServingInfo-r13 RedistributionServingInfo-r13 OPTIONAL, --Need OR + cellSelectionInfoCE-r13 CellSelectionInfoCE-r13 OPTIONAL, -- Need OP + t-ReselectionEUTRA-CE-r13 T-ReselectionEUTRA-CE-r13 OPTIONAL -- Need OP + ]], + [[ cellSelectionInfoCE1-r13 CellSelectionInfoCE1-r13 OPTIONAL -- Need OP + ]], + [[ cellSelectionInfoCE1-v1360 CellSelectionInfoCE1-v1360 OPTIONAL -- Cond QrxlevminCE1 + ]] +} + +RedistributionServingInfo-r13 ::= SEQUENCE { + redistributionFactorServing-r13 INTEGER(0..10), + redistributionFactorCell-r13 ENUMERATED{true} OPTIONAL, --Need OP + t360-r13 ENUMERATED {min4, min8, min16, min32,infinity, + spare3,spare2,spare1}, + redistrOnPagingOnly-r13 ENUMERATED {true} OPTIONAL --Need OP +} + +CellReselectionServingFreqInfo-v1310 ::= SEQUENCE { + cellReselectionSubPriority-r13 CellReselectionSubPriority-r13 +} + +-- Late non critical extensions +SystemInformationBlockType3-v10j0-IEs ::= SEQUENCE { + freqBandInfo-r10 NS-PmaxList-r10 OPTIONAL, -- Need OR + multiBandInfoList-v10j0 MultiBandInfoList-v10j0 OPTIONAL, -- Need OR + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SystemInformationBlockType4 ::= SEQUENCE { + intraFreqNeighCellList IntraFreqNeighCellList OPTIONAL, -- Need OR + intraFreqBlackCellList IntraFreqBlackCellList OPTIONAL, -- Need OR + csg-PhysCellIdRange PhysCellIdRange OPTIONAL, -- Cond CSG + ..., + lateNonCriticalExtension OCTET STRING OPTIONAL +} + +IntraFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellIntra)) OF IntraFreqNeighCellInfo + +IntraFreqNeighCellInfo ::= SEQUENCE { + physCellId PhysCellId, + q-OffsetCell Q-OffsetRange, + ... +} + +IntraFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PhysCellIdRange + + +SystemInformationBlockType5 ::= SEQUENCE { + interFreqCarrierFreqList InterFreqCarrierFreqList, + ..., + lateNonCriticalExtension OCTET STRING (CONTAINING SystemInformationBlockType5-v8h0-IEs) OPTIONAL, + [[ interFreqCarrierFreqList-v1250 InterFreqCarrierFreqList-v1250 OPTIONAL, -- Need OR + interFreqCarrierFreqListExt-r12 InterFreqCarrierFreqListExt-r12 OPTIONAL -- Need OR + ]], + [[ interFreqCarrierFreqListExt-v1280 InterFreqCarrierFreqListExt-v1280 OPTIONAL -- Need OR + ]], + [[ interFreqCarrierFreqList-v1310 InterFreqCarrierFreqList-v1310 OPTIONAL, -- Need OR + interFreqCarrierFreqListExt-v1310 InterFreqCarrierFreqListExt-v1310 OPTIONAL -- Need OR + ]], + [[ interFreqCarrierFreqList-v1350 InterFreqCarrierFreqList-v1350 OPTIONAL, -- Need OR + interFreqCarrierFreqListExt-v1350 InterFreqCarrierFreqListExt-v1350 OPTIONAL -- Need OR + ]], + [[ interFreqCarrierFreqListExt-v1360 InterFreqCarrierFreqListExt-v1360 OPTIONAL -- Need OR + ]], + [[ scptm-FreqOffset-r14 INTEGER (1..8) OPTIONAL -- Need OP + ]] +} + +SystemInformationBlockType5-v8h0-IEs ::= SEQUENCE { + interFreqCarrierFreqList-v8h0 SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo-v8h0 OPTIONAL, -- Need OP + nonCriticalExtension SystemInformationBlockType5-v9e0-IEs OPTIONAL +} + +SystemInformationBlockType5-v9e0-IEs ::= SEQUENCE { + interFreqCarrierFreqList-v9e0 SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo-v9e0 OPTIONAL, -- Need OR + nonCriticalExtension SystemInformationBlockType5-v10j0-IEs OPTIONAL +} + +SystemInformationBlockType5-v10j0-IEs ::= SEQUENCE { + interFreqCarrierFreqList-v10j0 SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo-v10j0 OPTIONAL, -- Need OR + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +InterFreqCarrierFreqList ::= SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo + +InterFreqCarrierFreqList-v1250 ::= SEQUENCE (SIZE (1.. maxFreq)) OF InterFreqCarrierFreqInfo-v1250 + +InterFreqCarrierFreqList-v1310 ::= SEQUENCE (SIZE (1.. maxFreq)) OF InterFreqCarrierFreqInfo-v1310 + +InterFreqCarrierFreqList-v1350 ::= SEQUENCE (SIZE (1.. maxFreq)) OF InterFreqCarrierFreqInfo-v1350 + +InterFreqCarrierFreqListExt-r12 ::= SEQUENCE (SIZE (1.. maxFreq)) OF InterFreqCarrierFreqInfo-r12 + +InterFreqCarrierFreqListExt-v1280 ::= SEQUENCE (SIZE (1.. maxFreq)) OF InterFreqCarrierFreqInfo-v10j0 + +InterFreqCarrierFreqListExt-v1310 ::= SEQUENCE (SIZE (1.. maxFreq)) OF InterFreqCarrierFreqInfo-v1310 + +InterFreqCarrierFreqListExt-v1350 ::= SEQUENCE (SIZE (1.. maxFreq)) OF InterFreqCarrierFreqInfo-v1350 + +InterFreqCarrierFreqListExt-v1360 ::= SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo-v1360 + +InterFreqCarrierFreqInfo ::= SEQUENCE { + dl-CarrierFreq ARFCN-ValueEUTRA, + q-RxLevMin Q-RxLevMin, + p-Max P-Max OPTIONAL, -- Need OP + t-ReselectionEUTRA T-Reselection, + t-ReselectionEUTRA-SF SpeedStateScaleFactors OPTIONAL, -- Need OP + threshX-High ReselectionThreshold, + threshX-Low ReselectionThreshold, + allowedMeasBandwidth AllowedMeasBandwidth, + presenceAntennaPort1 PresenceAntennaPort1, + cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP + neighCellConfig NeighCellConfig, + q-OffsetFreq Q-OffsetRange DEFAULT dB0, + interFreqNeighCellList InterFreqNeighCellList OPTIONAL, -- Need OR + interFreqBlackCellList InterFreqBlackCellList OPTIONAL, -- Need OR + ..., + [[ q-QualMin-r9 Q-QualMin-r9 OPTIONAL, -- Need OP + threshX-Q-r9 SEQUENCE { + threshX-HighQ-r9 ReselectionThresholdQ-r9, + threshX-LowQ-r9 ReselectionThresholdQ-r9 + } OPTIONAL -- Cond RSRQ + ]], + [[ q-QualMinWB-r11 Q-QualMin-r9 OPTIONAL -- Cond WB-RSRQ + ]] +} + +InterFreqCarrierFreqInfo-v8h0 ::= SEQUENCE { + multiBandInfoList MultiBandInfoList OPTIONAL -- Need OR +} + +InterFreqCarrierFreqInfo-v9e0 ::= SEQUENCE { + dl-CarrierFreq-v9e0 ARFCN-ValueEUTRA-v9e0 OPTIONAL, -- Cond dl-FreqMax + multiBandInfoList-v9e0 MultiBandInfoList-v9e0 OPTIONAL -- Need OR +} + +InterFreqCarrierFreqInfo-v10j0 ::= SEQUENCE { + freqBandInfo-r10 NS-PmaxList-r10 OPTIONAL, -- Need OR + multiBandInfoList-v10j0 MultiBandInfoList-v10j0 OPTIONAL -- Need OR +} + +InterFreqCarrierFreqInfo-v1250 ::= SEQUENCE { + reducedMeasPerformance-r12 ENUMERATED {true} OPTIONAL, -- Need OP + q-QualMinRSRQ-OnAllSymbols-r12 Q-QualMin-r9 OPTIONAL -- Cond RSRQ2 +} + +InterFreqCarrierFreqInfo-r12 ::= SEQUENCE { + dl-CarrierFreq-r12 ARFCN-ValueEUTRA-r9, + q-RxLevMin-r12 Q-RxLevMin, + p-Max-r12 P-Max OPTIONAL, -- Need OP + t-ReselectionEUTRA-r12 T-Reselection, + t-ReselectionEUTRA-SF-r12 SpeedStateScaleFactors OPTIONAL, -- Need OP + threshX-High-r12 ReselectionThreshold, + threshX-Low-r12 ReselectionThreshold, + allowedMeasBandwidth-r12 AllowedMeasBandwidth, + presenceAntennaPort1-r12 PresenceAntennaPort1, + cellReselectionPriority-r12 CellReselectionPriority OPTIONAL, -- Need OP + neighCellConfig-r12 NeighCellConfig, + q-OffsetFreq-r12 Q-OffsetRange DEFAULT dB0, + interFreqNeighCellList-r12 InterFreqNeighCellList OPTIONAL, -- Need OR + interFreqBlackCellList-r12 InterFreqBlackCellList OPTIONAL, -- Need OR + q-QualMin-r12 Q-QualMin-r9 OPTIONAL, -- Need OP + threshX-Q-r12 SEQUENCE { + threshX-HighQ-r12 ReselectionThresholdQ-r9, + threshX-LowQ-r12 ReselectionThresholdQ-r9 + } OPTIONAL, -- Cond RSRQ + q-QualMinWB-r12 Q-QualMin-r9 OPTIONAL, -- Cond WB-RSRQ + multiBandInfoList-r12 MultiBandInfoList-r11 OPTIONAL, -- Need OR + reducedMeasPerformance-r12 ENUMERATED {true} OPTIONAL, -- Need OP + q-QualMinRSRQ-OnAllSymbols-r12 Q-QualMin-r9 OPTIONAL, -- Cond RSRQ2 +... +} + +InterFreqCarrierFreqInfo-v1310 ::= SEQUENCE { + cellReselectionSubPriority-r13 CellReselectionSubPriority-r13 OPTIONAL, -- Need OP + redistributionInterFreqInfo-r13 RedistributionInterFreqInfo-r13 OPTIONAL, --Need OP + cellSelectionInfoCE-r13 CellSelectionInfoCE-r13 OPTIONAL, -- Need OP + t-ReselectionEUTRA-CE-r13 T-ReselectionEUTRA-CE-r13 OPTIONAL -- Need OP +} + +InterFreqCarrierFreqInfo-v1350 ::= SEQUENCE { + cellSelectionInfoCE1-r13 CellSelectionInfoCE1-r13 OPTIONAL -- Need OP +} + +InterFreqCarrierFreqInfo-v1360 ::= SEQUENCE { + cellSelectionInfoCE1-v1360 CellSelectionInfoCE1-v1360 OPTIONAL -- Cond QrxlevminCE1 +} + +InterFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellInter)) OF InterFreqNeighCellInfo + +InterFreqNeighCellInfo ::= SEQUENCE { + physCellId PhysCellId, + q-OffsetCell Q-OffsetRange +} + +InterFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PhysCellIdRange + +RedistributionInterFreqInfo-r13 ::= SEQUENCE { + redistributionFactorFreq-r13 RedistributionFactor-r13 OPTIONAL, --Need OP + redistributionNeighCellList-r13 RedistributionNeighCellList-r13 OPTIONAL --Need OP +} + +RedistributionNeighCellList-r13 ::= SEQUENCE (SIZE (1..maxCellInter)) OF RedistributionNeighCell-r13 + +RedistributionNeighCell-r13 ::= SEQUENCE { + physCellId-r13 PhysCellId, + redistributionFactorCell-r13 RedistributionFactor-r13 +} + +RedistributionFactor-r13 ::= INTEGER(1..10) + + +SystemInformationBlockType6 ::= SEQUENCE { + carrierFreqListUTRA-FDD CarrierFreqListUTRA-FDD OPTIONAL, -- Need OR + carrierFreqListUTRA-TDD CarrierFreqListUTRA-TDD OPTIONAL, -- Need OR + t-ReselectionUTRA T-Reselection, + t-ReselectionUTRA-SF SpeedStateScaleFactors OPTIONAL, -- Need OP + ..., + lateNonCriticalExtension OCTET STRING (CONTAINING SystemInformationBlockType6-v8h0-IEs) OPTIONAL, + [[ carrierFreqListUTRA-FDD-v1250 SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF + CarrierFreqInfoUTRA-v1250 OPTIONAL, -- Cond UTRA-FDD + carrierFreqListUTRA-TDD-v1250 SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF + CarrierFreqInfoUTRA-v1250 OPTIONAL, -- Cond UTRA-TDD + carrierFreqListUTRA-FDD-Ext-r12 CarrierFreqListUTRA-FDD-Ext-r12 OPTIONAL, -- Cond UTRA-FDD + carrierFreqListUTRA-TDD-Ext-r12 CarrierFreqListUTRA-TDD-Ext-r12 OPTIONAL -- Cond UTRA-TDD + ]] +} + +SystemInformationBlockType6-v8h0-IEs ::= SEQUENCE { + carrierFreqListUTRA-FDD-v8h0 SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF CarrierFreqInfoUTRA-FDD-v8h0 OPTIONAL, -- Cond UTRA-FDD + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +CarrierFreqInfoUTRA-v1250 ::= SEQUENCE { + reducedMeasPerformance-r12 ENUMERATED {true} OPTIONAL -- Need OP +} + +CarrierFreqListUTRA-FDD ::= SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF CarrierFreqUTRA-FDD + +CarrierFreqUTRA-FDD ::= SEQUENCE { + carrierFreq ARFCN-ValueUTRA, + cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP + threshX-High ReselectionThreshold, + threshX-Low ReselectionThreshold, + q-RxLevMin INTEGER (-60..-13), + p-MaxUTRA INTEGER (-50..33), + q-QualMin INTEGER (-24..0), + ..., + [[ threshX-Q-r9 SEQUENCE { + threshX-HighQ-r9 ReselectionThresholdQ-r9, + threshX-LowQ-r9 ReselectionThresholdQ-r9 + } OPTIONAL -- Cond RSRQ + ]] +} + +CarrierFreqInfoUTRA-FDD-v8h0 ::= SEQUENCE { + multiBandInfoList SEQUENCE (SIZE (1..maxMultiBands)) OF FreqBandIndicator-UTRA-FDD OPTIONAL -- Need OR +} + +CarrierFreqListUTRA-FDD-Ext-r12 ::= SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF + CarrierFreqUTRA-FDD-Ext-r12 + +CarrierFreqUTRA-FDD-Ext-r12 ::= SEQUENCE { + carrierFreq-r12 ARFCN-ValueUTRA, + cellReselectionPriority-r12 CellReselectionPriority OPTIONAL, -- Need OP + threshX-High-r12 ReselectionThreshold, + threshX-Low-r12 ReselectionThreshold, + q-RxLevMin-r12 INTEGER (-60..-13), + p-MaxUTRA-r12 INTEGER (-50..33), + q-QualMin-r12 INTEGER (-24..0), + threshX-Q-r12 SEQUENCE { + threshX-HighQ-r12 ReselectionThresholdQ-r9, + threshX-LowQ-r12 ReselectionThresholdQ-r9 + } OPTIONAL, -- Cond RSRQ + multiBandInfoList-r12 SEQUENCE (SIZE (1..maxMultiBands)) OF FreqBandIndicator-UTRA-FDD OPTIONAL, -- Need OR + reducedMeasPerformance-r12 ENUMERATED {true} OPTIONAL, -- Need OP + ... +} + +CarrierFreqListUTRA-TDD ::= SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF CarrierFreqUTRA-TDD + +CarrierFreqUTRA-TDD ::= SEQUENCE { + carrierFreq ARFCN-ValueUTRA, + cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP + threshX-High ReselectionThreshold, + threshX-Low ReselectionThreshold, + q-RxLevMin INTEGER (-60..-13), + p-MaxUTRA INTEGER (-50..33), + ... +} + +CarrierFreqListUTRA-TDD-Ext-r12 ::= SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF + CarrierFreqUTRA-TDD-r12 + +CarrierFreqUTRA-TDD-r12 ::= SEQUENCE { + carrierFreq-r12 ARFCN-ValueUTRA, + cellReselectionPriority-r12 CellReselectionPriority OPTIONAL, -- Need OP + threshX-High-r12 ReselectionThreshold, + threshX-Low-r12 ReselectionThreshold, + q-RxLevMin-r12 INTEGER (-60..-13), + p-MaxUTRA-r12 INTEGER (-50..33), + reducedMeasPerformance-r12 ENUMERATED {true} OPTIONAL, -- Need OP + ... +} + +FreqBandIndicator-UTRA-FDD ::= INTEGER (1..86) + + +SystemInformationBlockType7 ::= SEQUENCE { + t-ReselectionGERAN T-Reselection, + t-ReselectionGERAN-SF SpeedStateScaleFactors OPTIONAL, -- Need OR + carrierFreqsInfoList CarrierFreqsInfoListGERAN OPTIONAL, -- Need OR + ..., + lateNonCriticalExtension OCTET STRING OPTIONAL +} + +CarrierFreqsInfoListGERAN ::= SEQUENCE (SIZE (1..maxGNFG)) OF CarrierFreqsInfoGERAN + +CarrierFreqsInfoGERAN ::= SEQUENCE { + carrierFreqs CarrierFreqsGERAN, + commonInfo SEQUENCE { + cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP + ncc-Permitted BIT STRING (SIZE (8)), + q-RxLevMin INTEGER (0..45), + p-MaxGERAN INTEGER (0..39) OPTIONAL, -- Need OP + threshX-High ReselectionThreshold, + threshX-Low ReselectionThreshold + }, + ... +} + + +SystemInformationBlockType8 ::= SEQUENCE { + systemTimeInfo SystemTimeInfoCDMA2000 OPTIONAL, -- Need OR + searchWindowSize INTEGER (0..15) OPTIONAL, -- Need OR + parametersHRPD SEQUENCE { + preRegistrationInfoHRPD PreRegistrationInfoHRPD, + cellReselectionParametersHRPD CellReselectionParametersCDMA2000 OPTIONAL -- Need OR + } OPTIONAL, -- Need OR + parameters1XRTT SEQUENCE { + csfb-RegistrationParam1XRTT CSFB-RegistrationParam1XRTT OPTIONAL, -- Need OP + longCodeState1XRTT BIT STRING (SIZE (42)) OPTIONAL, -- Need OR + cellReselectionParameters1XRTT CellReselectionParametersCDMA2000 OPTIONAL -- Need OR + } OPTIONAL, -- Need OR + ..., + lateNonCriticalExtension OCTET STRING OPTIONAL, + [[ csfb-SupportForDualRxUEs-r9 BOOLEAN OPTIONAL, -- Need OR + cellReselectionParametersHRPD-v920 CellReselectionParametersCDMA2000-v920 OPTIONAL, -- Cond NCL-HRPD + cellReselectionParameters1XRTT-v920 CellReselectionParametersCDMA2000-v920 OPTIONAL, -- Cond NCL-1XRTT + csfb-RegistrationParam1XRTT-v920 CSFB-RegistrationParam1XRTT-v920 OPTIONAL, -- Cond REG-1XRTT + ac-BarringConfig1XRTT-r9 AC-BarringConfig1XRTT-r9 OPTIONAL -- Cond REG-1XRTT + ]], + [[ csfb-DualRxTxSupport-r10 ENUMERATED {true} OPTIONAL -- Cond REG-1XRTT + ]], + [[ sib8-PerPLMN-List-r11 SIB8-PerPLMN-List-r11 OPTIONAL -- Need OR + ]] +} + +CellReselectionParametersCDMA2000 ::= SEQUENCE { + bandClassList BandClassListCDMA2000, + neighCellList NeighCellListCDMA2000, + t-ReselectionCDMA2000 T-Reselection, + t-ReselectionCDMA2000-SF SpeedStateScaleFactors OPTIONAL -- Need OP +} + +CellReselectionParametersCDMA2000-r11 ::= SEQUENCE { + bandClassList BandClassListCDMA2000, + neighCellList-r11 SEQUENCE (SIZE (1..16)) OF NeighCellCDMA2000-r11, + t-ReselectionCDMA2000 T-Reselection, + t-ReselectionCDMA2000-SF SpeedStateScaleFactors OPTIONAL -- Need OP +} + +CellReselectionParametersCDMA2000-v920 ::= SEQUENCE { + neighCellList-v920 NeighCellListCDMA2000-v920 +} + +NeighCellListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF NeighCellCDMA2000 + +NeighCellCDMA2000 ::= SEQUENCE { + bandClass BandclassCDMA2000, + neighCellsPerFreqList NeighCellsPerBandclassListCDMA2000 +} + +NeighCellCDMA2000-r11 ::= SEQUENCE { + bandClass BandclassCDMA2000, + neighFreqInfoList-r11 SEQUENCE (SIZE (1..16)) OF NeighCellsPerBandclassCDMA2000-r11 +} + +NeighCellsPerBandclassListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF NeighCellsPerBandclassCDMA2000 + +NeighCellsPerBandclassCDMA2000 ::= SEQUENCE { + arfcn ARFCN-ValueCDMA2000, + physCellIdList PhysCellIdListCDMA2000 +} + +NeighCellsPerBandclassCDMA2000-r11 ::= SEQUENCE { + arfcn ARFCN-ValueCDMA2000, + physCellIdList-r11 SEQUENCE (SIZE (1..40)) OF PhysCellIdCDMA2000 +} + +NeighCellListCDMA2000-v920 ::= SEQUENCE (SIZE (1..16)) OF NeighCellCDMA2000-v920 + +NeighCellCDMA2000-v920 ::= SEQUENCE { + neighCellsPerFreqList-v920 NeighCellsPerBandclassListCDMA2000-v920 +} + +NeighCellsPerBandclassListCDMA2000-v920 ::= SEQUENCE (SIZE (1..16)) OF NeighCellsPerBandclassCDMA2000-v920 + +NeighCellsPerBandclassCDMA2000-v920 ::= SEQUENCE { + physCellIdList-v920 PhysCellIdListCDMA2000-v920 +} + +PhysCellIdListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF PhysCellIdCDMA2000 + +PhysCellIdListCDMA2000-v920 ::= SEQUENCE (SIZE (0..24)) OF PhysCellIdCDMA2000 + +BandClassListCDMA2000 ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassInfoCDMA2000 + +BandClassInfoCDMA2000 ::= SEQUENCE { + bandClass BandclassCDMA2000, + cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP + threshX-High INTEGER (0..63), + threshX-Low INTEGER (0..63), + ... +} + +AC-BarringConfig1XRTT-r9 ::= SEQUENCE { + ac-Barring0to9-r9 INTEGER (0..63), + ac-Barring10-r9 INTEGER (0..7), + ac-Barring11-r9 INTEGER (0..7), + ac-Barring12-r9 INTEGER (0..7), + ac-Barring13-r9 INTEGER (0..7), + ac-Barring14-r9 INTEGER (0..7), + ac-Barring15-r9 INTEGER (0..7), + ac-BarringMsg-r9 INTEGER (0..7), + ac-BarringReg-r9 INTEGER (0..7), + ac-BarringEmg-r9 INTEGER (0..7) +} + +SIB8-PerPLMN-List-r11 ::= SEQUENCE (SIZE (1..maxPLMN-r11)) OF SIB8-PerPLMN-r11 + +SIB8-PerPLMN-r11 ::= SEQUENCE { + plmn-Identity-r11 INTEGER (1..maxPLMN-r11), + parametersCDMA2000-r11 CHOICE { + explicitValue ParametersCDMA2000-r11, + defaultValue NULL + } +} + +ParametersCDMA2000-r11 ::= SEQUENCE { + systemTimeInfo-r11 CHOICE { + explicitValue SystemTimeInfoCDMA2000, + defaultValue NULL + } OPTIONAL, -- Need OR + searchWindowSize-r11 INTEGER (0..15), + parametersHRPD-r11 SEQUENCE { + preRegistrationInfoHRPD-r11 PreRegistrationInfoHRPD, + cellReselectionParametersHRPD-r11 CellReselectionParametersCDMA2000-r11 OPTIONAL -- Need OR + } OPTIONAL, -- Need OR + parameters1XRTT-r11 SEQUENCE { + csfb-RegistrationParam1XRTT-r11 CSFB-RegistrationParam1XRTT OPTIONAL, -- Need OP + csfb-RegistrationParam1XRTT-Ext-r11 CSFB-RegistrationParam1XRTT-v920 OPTIONAL, -- Cond REG-1XRTT-PerPLMN + longCodeState1XRTT-r11 BIT STRING (SIZE (42)) OPTIONAL, -- Cond PerPLMN-LC + cellReselectionParameters1XRTT-r11 CellReselectionParametersCDMA2000-r11 OPTIONAL, -- Need OR + ac-BarringConfig1XRTT-r11 AC-BarringConfig1XRTT-r9 OPTIONAL, -- Cond REG-1XRTT-PerPLMN + csfb-SupportForDualRxUEs-r11 BOOLEAN OPTIONAL, -- Need OR + csfb-DualRxTxSupport-r11 ENUMERATED {true} OPTIONAL -- Cond REG-1XRTT-PerPLMN + } OPTIONAL, -- Need OR + ... +} + + +SystemInformationBlockType9 ::= SEQUENCE { + hnb-Name OCTET STRING (SIZE(1..48)) OPTIONAL, -- Need OR + ..., + lateNonCriticalExtension OCTET STRING OPTIONAL +} + + +SystemInformationBlockType10 ::= SEQUENCE { + messageIdentifier BIT STRING (SIZE (16)), + serialNumber BIT STRING (SIZE (16)), + warningType OCTET STRING (SIZE (2)), + dummy OCTET STRING (SIZE (50)) OPTIONAL, -- Need OP + ..., + lateNonCriticalExtension OCTET STRING OPTIONAL +} + + +SystemInformationBlockType11 ::= SEQUENCE { + messageIdentifier BIT STRING (SIZE (16)), + serialNumber BIT STRING (SIZE (16)), + warningMessageSegmentType ENUMERATED {notLastSegment, lastSegment}, + warningMessageSegmentNumber INTEGER (0..63), + warningMessageSegment OCTET STRING, + dataCodingScheme OCTET STRING (SIZE (1)) OPTIONAL, -- Cond Segment1 + ..., + lateNonCriticalExtension OCTET STRING OPTIONAL +} + + +SystemInformationBlockType12-r9 ::= SEQUENCE { + messageIdentifier-r9 BIT STRING (SIZE (16)), + serialNumber-r9 BIT STRING (SIZE (16)), + warningMessageSegmentType-r9 ENUMERATED {notLastSegment, lastSegment}, + warningMessageSegmentNumber-r9 INTEGER (0..63), + warningMessageSegment-r9 OCTET STRING, + dataCodingScheme-r9 OCTET STRING (SIZE (1)) OPTIONAL, -- Cond Segment1 + lateNonCriticalExtension OCTET STRING OPTIONAL, + ... +} + + +SystemInformationBlockType13-r9 ::= SEQUENCE { + mbsfn-AreaInfoList-r9 MBSFN-AreaInfoList-r9, + notificationConfig-r9 MBMS-NotificationConfig-r9, + lateNonCriticalExtension OCTET STRING OPTIONAL, + ..., + [[ + notificationConfig-v1430 MBMS-NotificationConfig-v1430 OPTIONAL + ]] +} + + +SystemInformationBlockType14-r11 ::= SEQUENCE { + eab-Param-r11 CHOICE { + eab-Common-r11 EAB-Config-r11, + eab-PerPLMN-List-r11 SEQUENCE (SIZE (1..maxPLMN-r11)) OF EAB-ConfigPLMN-r11 + } OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ... +} + +EAB-ConfigPLMN-r11 ::= SEQUENCE { + eab-Config-r11 EAB-Config-r11 OPTIONAL -- Need OR +} + +EAB-Config-r11 ::= SEQUENCE { + eab-Category-r11 ENUMERATED {a, b, c}, + eab-BarringBitmap-r11 BIT STRING (SIZE (10)) +} + + +SystemInformationBlockType15-r11 ::= SEQUENCE { + mbms-SAI-IntraFreq-r11 MBMS-SAI-List-r11 OPTIONAL, -- Need OR + mbms-SAI-InterFreqList-r11 MBMS-SAI-InterFreqList-r11 OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ..., + [[ mbms-SAI-InterFreqList-v1140 MBMS-SAI-InterFreqList-v1140 OPTIONAL -- Cond InterFreq + ]], + [[ mbms-IntraFreqCarrierType-r14 MBMS-CarrierType-r14 OPTIONAL, -- Need OR + mbms-InterFreqCarrierTypeList-r14 + MBMS-InterFreqCarrierTypeList-r14 OPTIONAL -- Need OR + ]] +} + +MBMS-SAI-List-r11 ::= SEQUENCE (SIZE (1..maxSAI-MBMS-r11)) OF MBMS-SAI-r11 + +MBMS-SAI-r11 ::= INTEGER (0..65535) + +MBMS-SAI-InterFreqList-r11 ::= SEQUENCE (SIZE (1..maxFreq)) OF MBMS-SAI-InterFreq-r11 + +MBMS-SAI-InterFreqList-v1140 ::= SEQUENCE (SIZE (1..maxFreq)) OF MBMS-SAI-InterFreq-v1140 + +MBMS-SAI-InterFreq-r11 ::= SEQUENCE { + dl-CarrierFreq-r11 ARFCN-ValueEUTRA-r9, + mbms-SAI-List-r11 MBMS-SAI-List-r11 +} + +MBMS-SAI-InterFreq-v1140 ::= SEQUENCE { + multiBandInfoList-r11 MultiBandInfoList-r11 OPTIONAL -- Need OR +} + +MBMS-InterFreqCarrierTypeList-r14 ::= SEQUENCE (SIZE (1..maxFreq)) OF MBMS-CarrierType-r14 + +MBMS-CarrierType-r14 ::= SEQUENCE { + carrierType-r14 ENUMERATED {mbms, fembmsMixed, fembmsDedicated}, + frameOffset-r14 INTEGER (0..3) OPTIONAL -- Need OR +} + + +SystemInformationBlockType16-r11 ::= SEQUENCE { + timeInfo-r11 SEQUENCE { + timeInfoUTC-r11 INTEGER (0..549755813887), + dayLightSavingTime-r11 BIT STRING (SIZE (2)) OPTIONAL, -- Need OR + leapSeconds-r11 INTEGER (-127..128) OPTIONAL, -- Need OR + localTimeOffset-r11 INTEGER (-63..64) OPTIONAL -- Need OR + } OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ... +} + + +SystemInformationBlockType17-r12 ::= SEQUENCE { + wlan-OffloadInfoPerPLMN-List-r12 SEQUENCE (SIZE (1..maxPLMN-r11)) OF + WLAN-OffloadInfoPerPLMN-r12 OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ... +} + +WLAN-OffloadInfoPerPLMN-r12 ::= SEQUENCE { + wlan-OffloadConfigCommon-r12 WLAN-OffloadConfig-r12 OPTIONAL, -- Need OR + wlan-Id-List-r12 WLAN-Id-List-r12 OPTIONAL, -- Need OR + ... +} + +WLAN-Id-List-r12 ::= SEQUENCE (SIZE (1..maxWLAN-Id-r12)) OF WLAN-Identifiers-r12 + +WLAN-Identifiers-r12 ::= SEQUENCE { + ssid-r12 OCTET STRING (SIZE (1..32)) OPTIONAL, -- Need OR + bssid-r12 OCTET STRING (SIZE (6)) OPTIONAL, -- Need OR + hessid-r12 OCTET STRING (SIZE (6)) OPTIONAL, -- Need OR + ... +} + + +SystemInformationBlockType18-r12 ::= SEQUENCE { + commConfig-r12 SEQUENCE { + commRxPool-r12 SL-CommRxPoolList-r12, + commTxPoolNormalCommon-r12 SL-CommTxPoolList-r12 OPTIONAL, -- Need OR + commTxPoolExceptional-r12 SL-CommTxPoolList-r12 OPTIONAL, -- Need OR + commSyncConfig-r12 SL-SyncConfigList-r12 OPTIONAL -- Need OR + } OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ..., + [[ commTxPoolNormalCommonExt-r13 SL-CommTxPoolListExt-r13 OPTIONAL, -- Need OR + commTxResourceUC-ReqAllowed-r13 ENUMERATED {true} OPTIONAL, -- Need OR + commTxAllowRelayCommon-r13 ENUMERATED {true} OPTIONAL -- Need OR + ]] +} + + +SystemInformationBlockType19-r12 ::= SEQUENCE { + discConfig-r12 SEQUENCE { + discRxPool-r12 SL-DiscRxPoolList-r12, + discTxPoolCommon-r12 SL-DiscTxPoolList-r12 OPTIONAL, -- Need OR + discTxPowerInfo-r12 SL-DiscTxPowerInfoList-r12 OPTIONAL, -- Cond Tx + discSyncConfig-r12 SL-SyncConfigList-r12 OPTIONAL -- Need OR + } OPTIONAL, -- Need OR + discInterFreqList-r12 SL-CarrierFreqInfoList-r12 OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ..., + [[ discConfig-v1310 SEQUENCE { + discInterFreqList-v1310 SL-CarrierFreqInfoList-v1310 OPTIONAL, -- Need OR + gapRequestsAllowedCommon ENUMERATED {true} OPTIONAL -- Need OR + } OPTIONAL, -- Need OR + discConfigRelay-r13 SEQUENCE { + relayUE-Config-r13 SL-DiscConfigRelayUE-r13, + remoteUE-Config-r13 SL-DiscConfigRemoteUE-r13 + } OPTIONAL, -- Need OR + discConfigPS-13 SEQUENCE { + discRxPoolPS-r13 SL-DiscRxPoolList-r12, + discTxPoolPS-Common-r13 SL-DiscTxPoolList-r12 OPTIONAL -- Need OR + } OPTIONAL -- Need OR + ]] +} + +SL-CarrierFreqInfoList-r12 ::= SEQUENCE (SIZE (1..maxFreq)) OF SL-CarrierFreqInfo-r12 + +SL-CarrierFreqInfoList-v1310 ::= SEQUENCE (SIZE (1..maxFreq)) OF SL-CarrierFreqInfo-v1310 + +SL-CarrierFreqInfo-r12::= SEQUENCE { + carrierFreq-r12 ARFCN-ValueEUTRA-r9, + plmn-IdentityList-r12 PLMN-IdentityList4-r12 OPTIONAL -- Need OP +} + +SL-DiscConfigRelayUE-r13 ::= SEQUENCE { + threshHigh-r13 RSRP-RangeSL4-r13 OPTIONAL, -- Need OR + threshLow-r13 RSRP-RangeSL4-r13 OPTIONAL, -- Need OR + hystMax-r13 ENUMERATED {dB0, dB3, dB6, dB9, dB12, dBinf} OPTIONAL, -- Cond ThreshHigh + hystMin-r13 ENUMERATED {dB0, dB3, dB6, dB9, dB12} OPTIONAL -- Cond ThreshLow +} + +SL-DiscConfigRemoteUE-r13 ::= SEQUENCE { + threshHigh-r13 RSRP-RangeSL4-r13 OPTIONAL, -- Need OR + hystMax-r13 ENUMERATED {dB0, dB3, dB6, dB9, dB12} OPTIONAL, -- Cond ThreshHigh + reselectionInfoIC-r13 ReselectionInfoRelay-r13 +} + +ReselectionInfoRelay-r13 ::= SEQUENCE { + q-RxLevMin-r13 Q-RxLevMin, + -- Note that the mapping of invidual values may be different for PC5, but the granularity/ + -- number of values is same as for Uu + filterCoefficient-r13 FilterCoefficient, + minHyst-r13 ENUMERATED {dB0, dB3, + dB6, dB9, dB12, dBinf} OPTIONAL -- Need OR +} + +SL-CarrierFreqInfo-v1310::= SEQUENCE { + discResourcesNonPS-r13 SL-ResourcesInterFreq-r13 OPTIONAL, -- Need OR + discResourcesPS-r13 SL-ResourcesInterFreq-r13 OPTIONAL, -- Need OR + discConfigOther-r13 SL-DiscConfigOtherInterFreq-r13 OPTIONAL, -- Need OR + ... +} + +PLMN-IdentityList4-r12 ::= SEQUENCE (SIZE (1..maxPLMN-r11)) OF PLMN-IdentityInfo2-r12 + +PLMN-IdentityInfo2-r12 ::= CHOICE { + plmn-Index-r12 INTEGER (1..maxPLMN-r11), + plmnIdentity-r12 PLMN-Identity +} + +SL-DiscTxResourcesInterFreq-r13 ::= CHOICE { + acquireSI-FromCarrier-r13 NULL, + discTxPoolCommon-r13 SL-DiscTxPoolList-r12, + requestDedicated-r13 NULL, + noTxOnCarrier-r13 NULL +} + +SL-DiscConfigOtherInterFreq-r13::= SEQUENCE { + txPowerInfo-r13 SL-DiscTxPowerInfoList-r12 OPTIONAL, -- Cond Tx + refCarrierCommon-r13 ENUMERATED {pCell} OPTIONAL, -- Need OR + discSyncConfig-r13 SL-SyncConfigListNFreq-r13 OPTIONAL, -- Need OR + discCellSelectionInfo-r13 CellSelectionInfoNFreq-r13 OPTIONAL -- Need OR +} + +SL-ResourcesInterFreq-r13 ::= SEQUENCE { + discRxResourcesInterFreq-r13 SL-DiscRxPoolList-r12 OPTIONAL, -- Need OR + discTxResourcesInterFreq-r13 SL-DiscTxResourcesInterFreq-r13 OPTIONAL -- Need OR +} + + +SystemInformationBlockType20-r13 ::= SEQUENCE { + sc-mcch-RepetitionPeriod-r13 ENUMERATED {rf2, rf4, rf8, rf16, rf32, rf64, rf128, rf256}, + sc-mcch-Offset-r13 INTEGER (0..10), + sc-mcch-FirstSubframe-r13 INTEGER (0..9), + sc-mcch-duration-r13 INTEGER (2..9) OPTIONAL, + sc-mcch-ModificationPeriod-r13 ENUMERATED {rf2, rf4, rf8, rf16, rf32, rf64, rf128, rf256, + rf512, rf1024, r2048, rf4096, rf8192, rf16384, rf32768, rf65536}, + lateNonCriticalExtension OCTET STRING OPTIONAL, + ..., + [[ br-BCCH-Config-r14 SEQUENCE { + sc-mcch-RepetitionPeriod-v1430 ENUMERATED {rf1}, + sc-mcch-ModificationPeriod-v1430 ENUMERATED {rf1}, + mpdcch-Narrowband-SC-MCCH-r14 INTEGER (1..maxAvailNarrowBands-r13), + mpdcch-NumRepetition-SC-MCCH-r14 ENUMERATED {r1, r2, r4, r8, r16, + r32, r64, r128, r256}, + mpdcch-StartSF-SC-MCCH-r14 CHOICE { + fdd-r14 ENUMERATED {v1, v1dot5, v2, v2dot5, v4, + v5, v8, v10}, + tdd-r14 ENUMERATED {v1, v2, v4, v5, v8, v10, v20} + }, + mpdcch-PDSCH-HoppingConfig-SC-MCCH-r14 ENUMERATED {off, ce-ModeA, ce-ModeB}, + sc-mcch-CarrierFreq-r14 ARFCN-ValueEUTRA-r9, + sc-mcch-Offset-BR-r14 INTEGER (0..10), + sc-mcch-RepetitionPeriod-BR-r14 ENUMERATED {rf32, rf128, rf512, rf1024, + rf2048, rf4096, rf8192, rf16384}, + sc-mcch-ModificationPeriod-BR-r14 ENUMERATED { rf32, rf128, rf256, rf512, rf1024, + rf2048, rf4096, rf8192, rf16384, rf32768, + rf65536, rf131072, rf262144, rf524288, + rf1048576} + } OPTIONAL, -- Need OR + sc-mcch-SchedulingInfo-r14 SC-MCCH-SchedulingInfo-r14 OPTIONAL, -- Need OP + pdsch-maxNumRepetitionCEmodeA-SC-MTCH-r14 + ENUMERATED { r16, r32 } OPTIONAL, -- Need OR + pdsch-maxNumRepetitionCEmodeB-SC-MTCH-r14 + ENUMERATED { + r192, r256, r384, r512, r768, r1024, + r1536, r2048} OPTIONAL -- Need OR + ]] +} + +SC-MCCH-SchedulingInfo-r14::= SEQUENCE { + onDurationTimerSCPTM-r14 ENUMERATED {psf10, psf20, psf100, psf300, + psf500, psf1000, psf1200, psf1600}, + drx-InactivityTimerSCPTM-r14 ENUMERATED {psf0, psf1, psf2, psf4, psf8, psf16, + psf32, psf64, psf128, psf256, ps512, + psf1024, psf2048, psf4096, psf8192, psf16384}, + schedulingPeriodStartOffsetSCPTM-r14 CHOICE { + sf10 INTEGER(0..9), + sf20 INTEGER(0..19), + sf32 INTEGER(0..31), + sf40 INTEGER(0..39), + sf64 INTEGER(0..63), + sf80 INTEGER(0..79), + sf128 INTEGER(0..127), + sf160 INTEGER(0..159), + sf256 INTEGER(0..255), + sf320 INTEGER(0..319), + sf512 INTEGER(0..511), + sf640 INTEGER(0..639), + sf1024 INTEGER(0..1023), + sf2048 INTEGER(0..2047), + sf4096 INTEGER(0..4095), + sf8192 INTEGER(0..8191) + }, + ... +} + + +SystemInformationBlockType21-r14 ::= SEQUENCE { + sl-V2X-ConfigCommon-r14 SL-V2X-ConfigCommon-r14 OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ... +} + +SL-V2X-ConfigCommon-r14 ::= SEQUENCE { + v2x-CommRxPool-r14 SL-CommRxPoolListV2X-r14 OPTIONAL, -- Need OR + v2x-CommTxPoolNormalCommon-r14 SL-CommTxPoolListV2X-r14 OPTIONAL, -- Need OR + p2x-CommTxPoolNormalCommon-r14 SL-CommTxPoolListV2X-r14 OPTIONAL, -- Need OR + v2x-CommTxPoolExceptional-r14 SL-CommResourcePoolV2X-r14 OPTIONAL, -- Need OR + v2x-SyncConfig-r14 SL-SyncConfigListV2X-r14 OPTIONAL, -- Need OR + v2x-InterFreqInfoList-r14 SL-InterFreqInfoListV2X-r14 OPTIONAL, -- Need OR + v2x-ResourceSelectionConfig-r14 SL-CommTxPoolSensingConfig-r14 OPTIONAL, -- Need OR + zoneConfig-r14 SL-ZoneConfig-r14 OPTIONAL, -- Need OR + typeTxSync-r14 SL-TypeTxSync-r14 OPTIONAL, -- Need OR + thresSL-TxPrioritization-r14 SL-Priority-r13 OPTIONAL, -- Need OR + anchorCarrierFreqList-r14 SL-AnchorCarrierFreqList-V2X-r14 OPTIONAL, -- Need OR + offsetDFN-r14 INTEGER (0..1000) OPTIONAL, -- Need OR + cbr-CommonTxConfigList-r14 SL-CBR-CommonTxConfigList-r14 OPTIONAL -- Need OR +} + + + +AntennaInfoCommon ::= SEQUENCE { + antennaPortsCount ENUMERATED {an1, an2, an4, spare1} +} + +AntennaInfoDedicated ::= SEQUENCE { + transmissionMode ENUMERATED { + tm1, tm2, tm3, tm4, tm5, tm6, + tm7, tm8-v920}, + codebookSubsetRestriction CHOICE { + n2TxAntenna-tm3 BIT STRING (SIZE (2)), + n4TxAntenna-tm3 BIT STRING (SIZE (4)), + n2TxAntenna-tm4 BIT STRING (SIZE (6)), + n4TxAntenna-tm4 BIT STRING (SIZE (64)), + n2TxAntenna-tm5 BIT STRING (SIZE (4)), + n4TxAntenna-tm5 BIT STRING (SIZE (16)), + n2TxAntenna-tm6 BIT STRING (SIZE (4)), + n4TxAntenna-tm6 BIT STRING (SIZE (16)) + } OPTIONAL, -- Cond TM + ue-TransmitAntennaSelection CHOICE{ + release NULL, + setup ENUMERATED {closedLoop, openLoop} + } +} + +AntennaInfoDedicated-v920 ::= SEQUENCE { + codebookSubsetRestriction-v920 CHOICE { + n2TxAntenna-tm8-r9 BIT STRING (SIZE (6)), + n4TxAntenna-tm8-r9 BIT STRING (SIZE (32)) + } OPTIONAL -- Cond TM8 +} + +AntennaInfoDedicated-r10 ::= SEQUENCE { + transmissionMode-r10 ENUMERATED { + tm1, tm2, tm3, tm4, tm5, tm6, tm7, tm8-v920, + tm9-v1020, tm10-v1130, spare6, spare5, spare4, + spare3, spare2, spare1}, + codebookSubsetRestriction-r10 BIT STRING OPTIONAL, -- Cond TMX + ue-TransmitAntennaSelection CHOICE{ + release NULL, + setup ENUMERATED {closedLoop, openLoop} + } +} + +AntennaInfoDedicated-v10i0::= SEQUENCE { + maxLayersMIMO-r10 ENUMERATED {twoLayers, fourLayers, eightLayers} OPTIONAL -- Need OR +} + +AntennaInfoDedicated-v1250 ::= SEQUENCE { + alternativeCodebookEnabledFor4TX-r12 BOOLEAN +} + +AntennaInfoDedicated-v1430 ::= SEQUENCE { + ce-UE-TxAntennaSelection-config-r14 ENUMERATED {on} OPTIONAL -- Need OR +} + + +AntennaInfoUL-r10 ::= SEQUENCE { + transmissionModeUL-r10 ENUMERATED {tm1, tm2, spare6, spare5, + spare4, spare3, spare2, spare1} OPTIONAL, -- Need OR + fourAntennaPortActivated-r10 ENUMERATED {setup} OPTIONAL -- Need OR +} + + +CQI-ReportConfig ::= SEQUENCE { + cqi-ReportModeAperiodic CQI-ReportModeAperiodic OPTIONAL, -- Need OR + nomPDSCH-RS-EPRE-Offset INTEGER (-1..6), + cqi-ReportPeriodic CQI-ReportPeriodic OPTIONAL -- Need ON +} + +CQI-ReportConfig-v920 ::= SEQUENCE { + cqi-Mask-r9 ENUMERATED {setup} OPTIONAL, -- Cond cqi-Setup + pmi-RI-Report-r9 ENUMERATED {setup} OPTIONAL -- Cond PMIRI +} + +CQI-ReportConfig-r10 ::= SEQUENCE { + cqi-ReportAperiodic-r10 CQI-ReportAperiodic-r10 OPTIONAL, -- Need ON + nomPDSCH-RS-EPRE-Offset INTEGER (-1..6), + cqi-ReportPeriodic-r10 CQI-ReportPeriodic-r10 OPTIONAL, -- Need ON + pmi-RI-Report-r9 ENUMERATED {setup} OPTIONAL, -- Cond PMIRIPCell + csi-SubframePatternConfig-r10 CHOICE { + release NULL, + setup SEQUENCE { + csi-MeasSubframeSet1-r10 MeasSubframePattern-r10, + csi-MeasSubframeSet2-r10 MeasSubframePattern-r10 + } + } OPTIONAL -- Need ON +} + +CQI-ReportConfig-v1130 ::= SEQUENCE { + cqi-ReportPeriodic-v1130 CQI-ReportPeriodic-v1130, + cqi-ReportBoth-r11 CQI-ReportBoth-r11 +} + +CQI-ReportConfig-v1250 ::= SEQUENCE { + csi-SubframePatternConfig-r12 CHOICE { + release NULL, + setup SEQUENCE { + csi-MeasSubframeSets-r12 BIT STRING (SIZE (10)) + } + } OPTIONAL, -- Need ON + cqi-ReportBoth-v1250 CQI-ReportBoth-v1250 OPTIONAL, -- Need ON + cqi-ReportAperiodic-v1250 CQI-ReportAperiodic-v1250 OPTIONAL, -- Need ON + altCQI-Table-r12 ENUMERATED { + allSubframes, csi-SubframeSet1, + csi-SubframeSet2, spare1} OPTIONAL -- Need OP +} + +CQI-ReportConfig-v1310 ::= SEQUENCE { + cqi-ReportBoth-v1310 CQI-ReportBoth-v1310 OPTIONAL, -- Need ON + cqi-ReportAperiodic-v1310 CQI-ReportAperiodic-v1310 OPTIONAL, -- Need ON + cqi-ReportPeriodic-v1310 CQI-ReportPeriodic-v1310 OPTIONAL -- Need ON +} + +CQI-ReportConfig-v1320 ::= SEQUENCE { + cqi-ReportPeriodic-v1320 CQI-ReportPeriodic-v1320 OPTIONAL -- Need ON +} + +CQI-ReportConfig-v1430 ::= SEQUENCE { + cqi-ReportAperiodicHybrid-r14 CQI-ReportAperiodicHybrid-r14 OPTIONAL -- Need ON +} + +CQI-ReportConfigSCell-r10 ::= SEQUENCE { + cqi-ReportModeAperiodic-r10 CQI-ReportModeAperiodic OPTIONAL, -- Need OR + nomPDSCH-RS-EPRE-Offset-r10 INTEGER (-1..6), + cqi-ReportPeriodicSCell-r10 CQI-ReportPeriodic-r10 OPTIONAL, -- Need ON + pmi-RI-Report-r10 ENUMERATED {setup} OPTIONAL -- Cond PMIRISCell +} + +CQI-ReportPeriodic ::= CHOICE { + release NULL, + setup SEQUENCE { + cqi-PUCCH-ResourceIndex INTEGER (0..1185), + cqi-pmi-ConfigIndex INTEGER (0..1023), + cqi-FormatIndicatorPeriodic CHOICE { + widebandCQI NULL, + subbandCQI SEQUENCE { + k INTEGER (1..4) + } + }, + ri-ConfigIndex INTEGER (0..1023) OPTIONAL, -- Need OR + simultaneousAckNackAndCQI BOOLEAN + } +} + +CQI-ReportPeriodic-r10 ::= CHOICE { + release NULL, + setup SEQUENCE { + cqi-PUCCH-ResourceIndex-r10 INTEGER (0..1184), + cqi-PUCCH-ResourceIndexP1-r10 INTEGER (0..1184) OPTIONAL, -- Need OR + cqi-pmi-ConfigIndex INTEGER (0..1023), + cqi-FormatIndicatorPeriodic-r10 CHOICE { + widebandCQI-r10 SEQUENCE { + csi-ReportMode-r10 ENUMERATED {submode1, submode2} OPTIONAL -- Need OR + }, + subbandCQI-r10 SEQUENCE { + k INTEGER (1..4), + periodicityFactor-r10 ENUMERATED {n2, n4} + } + }, + ri-ConfigIndex INTEGER (0..1023) OPTIONAL, -- Need OR + simultaneousAckNackAndCQI BOOLEAN, + cqi-Mask-r9 ENUMERATED {setup} OPTIONAL, -- Need OR + csi-ConfigIndex-r10 CHOICE { + release NULL, + setup SEQUENCE { + cqi-pmi-ConfigIndex2-r10 INTEGER (0..1023), + ri-ConfigIndex2-r10 INTEGER (0..1023) OPTIONAL -- Need OR + } + } OPTIONAL -- Need ON + } +} + + +CQI-ReportPeriodic-v1130 ::= SEQUENCE { + simultaneousAckNackAndCQI-Format3-r11 ENUMERATED {setup} OPTIONAL, -- Need OR + cqi-ReportPeriodicProcExtToReleaseList-r11 CQI-ReportPeriodicProcExtToReleaseList-r11 OPTIONAL, -- Need ON + cqi-ReportPeriodicProcExtToAddModList-r11 CQI-ReportPeriodicProcExtToAddModList-r11 OPTIONAL -- Need ON +} + +CQI-ReportPeriodic-v1310 ::= SEQUENCE { + cri-ReportConfig-r13 CRI-ReportConfig-r13 OPTIONAL, -- Need OR + simultaneousAckNackAndCQI-Format4-Format5-r13 ENUMERATED {setup} OPTIONAL-- Need OR +} + +CQI-ReportPeriodic-v1320 ::= SEQUENCE { + periodicityFactorWB-r13 ENUMERATED {n2, n4} OPTIONAL -- Need OR +} + +CQI-ReportPeriodicProcExtToAddModList-r11 ::= SEQUENCE (SIZE (1..maxCQI-ProcExt-r11)) OF CQI-ReportPeriodicProcExt-r11 + +CQI-ReportPeriodicProcExtToReleaseList-r11 ::= SEQUENCE (SIZE (1..maxCQI-ProcExt-r11)) OF CQI-ReportPeriodicProcExtId-r11 + +CQI-ReportPeriodicProcExt-r11 ::= SEQUENCE { + cqi-ReportPeriodicProcExtId-r11 CQI-ReportPeriodicProcExtId-r11, + cqi-pmi-ConfigIndex-r11 INTEGER (0..1023), + cqi-FormatIndicatorPeriodic-r11 CHOICE { + widebandCQI-r11 SEQUENCE { + csi-ReportMode-r11 ENUMERATED {submode1, submode2} OPTIONAL -- Need OR + }, + subbandCQI-r11 SEQUENCE { + k INTEGER (1..4), + periodicityFactor-r11 ENUMERATED {n2, n4} + } + }, + ri-ConfigIndex-r11 INTEGER (0..1023) OPTIONAL, -- Need OR + csi-ConfigIndex-r11 CHOICE { + release NULL, + setup SEQUENCE { + cqi-pmi-ConfigIndex2-r11 INTEGER (0..1023), + ri-ConfigIndex2-r11 INTEGER (0..1023) OPTIONAL -- Need OR + } + } OPTIONAL, -- Need ON + ..., + [[ cri-ReportConfig-r13 CRI-ReportConfig-r13 OPTIONAL -- Need ON + ]], + [[ periodicityFactorWB-r13 ENUMERATED {n2, n4} OPTIONAL -- Need ON + ]] +} + +CQI-ReportAperiodic-r10 ::= CHOICE { + release NULL, + setup SEQUENCE { + cqi-ReportModeAperiodic-r10 CQI-ReportModeAperiodic, + aperiodicCSI-Trigger-r10 SEQUENCE { + trigger1-r10 BIT STRING (SIZE (8)), + trigger2-r10 BIT STRING (SIZE (8)) + } OPTIONAL -- Need OR + } +} + +CQI-ReportAperiodic-v1250 ::= CHOICE { + release NULL, + setup SEQUENCE { + aperiodicCSI-Trigger-v1250 SEQUENCE { + trigger-SubframeSetIndicator-r12 ENUMERATED {s1, s2}, + trigger1-SubframeSetIndicator-r12 BIT STRING (SIZE (8)), + trigger2-SubframeSetIndicator-r12 BIT STRING (SIZE (8)) + } + } +} + +CQI-ReportAperiodic-v1310 ::= CHOICE { + release NULL, + setup SEQUENCE { + aperiodicCSI-Trigger-v1310 SEQUENCE { + trigger1-r13 BIT STRING (SIZE (32)), + trigger2-r13 BIT STRING (SIZE (32)), + trigger3-r13 BIT STRING (SIZE (32)), + trigger4-r13 BIT STRING (SIZE (32)), + trigger5-r13 BIT STRING (SIZE (32)), + trigger6-r13 BIT STRING (SIZE (32)) + } OPTIONAL, -- Need ON + aperiodicCSI-Trigger2-r13 CHOICE { + release NULL, + setup SEQUENCE { + trigger1-SubframeSetIndicator-r13 BIT STRING (SIZE (32)), + trigger2-SubframeSetIndicator-r13 BIT STRING (SIZE (32)), + trigger3-SubframeSetIndicator-r13 BIT STRING (SIZE (32)), + trigger4-SubframeSetIndicator-r13 BIT STRING (SIZE (32)), + trigger5-SubframeSetIndicator-r13 BIT STRING (SIZE (32)), + trigger6-SubframeSetIndicator-r13 BIT STRING (SIZE (32)) + } + } OPTIONAL -- Need ON + } +} + +CQI-ReportAperiodicProc-r11 ::= SEQUENCE { + cqi-ReportModeAperiodic-r11 CQI-ReportModeAperiodic, + trigger01-r11 BOOLEAN, + trigger10-r11 BOOLEAN, + trigger11-r11 BOOLEAN +} + +CQI-ReportAperiodicProc-v1310 ::= SEQUENCE { + trigger001-r13 BOOLEAN, + trigger010-r13 BOOLEAN, + trigger011-r13 BOOLEAN, + trigger100-r13 BOOLEAN, + trigger101-r13 BOOLEAN, + trigger110-r13 BOOLEAN, + trigger111-r13 BOOLEAN +} + +CQI-ReportAperiodicHybrid-r14 ::= SEQUENCE { + triggers-r14 CHOICE { + oneBit-r14 SEQUENCE { + trigger1-Indicator-r14 BIT STRING (SIZE (8)) + }, + twoBit-r14 SEQUENCE { + trigger01-Indicator-r14 BIT STRING (SIZE (8)), + trigger10-Indicator-r14 BIT STRING (SIZE (8)), + trigger11-Indicator-r14 BIT STRING (SIZE (8)) + }, + threeBit-r14 SEQUENCE { + trigger001-Indicator-r14 BIT STRING (SIZE (32)), + trigger010-Indicator-r14 BIT STRING (SIZE (32)), + trigger011-Indicator-r14 BIT STRING (SIZE (32)), + trigger100-Indicator-r14 BIT STRING (SIZE (32)), + trigger101-Indicator-r14 BIT STRING (SIZE (32)), + trigger110-Indicator-r14 BIT STRING (SIZE (32)), + trigger111-Indicator-r14 BIT STRING (SIZE (32)) + } + } OPTIONAL -- Need OR +} + +CQI-ReportModeAperiodic ::= ENUMERATED { + rm12, rm20, rm22, rm30, rm31, + rm32-v1250, rm10-v1310, rm11-v1310 +} + +CQI-ReportBoth-r11 ::= SEQUENCE { + csi-IM-ConfigToReleaseList-r11 CSI-IM-ConfigToReleaseList-r11 OPTIONAL, -- Need ON + csi-IM-ConfigToAddModList-r11 CSI-IM-ConfigToAddModList-r11 OPTIONAL, -- Need ON + csi-ProcessToReleaseList-r11 CSI-ProcessToReleaseList-r11 OPTIONAL, -- Need ON + csi-ProcessToAddModList-r11 CSI-ProcessToAddModList-r11 OPTIONAL -- Need ON +} + +CQI-ReportBoth-v1250 ::= SEQUENCE { + csi-IM-ConfigToReleaseListExt-r12 CSI-IM-ConfigId-v1250 OPTIONAL, -- Need ON + csi-IM-ConfigToAddModListExt-r12 CSI-IM-ConfigExt-r12 OPTIONAL -- Need ON +} + +CQI-ReportBoth-v1310 ::= SEQUENCE { + csi-IM-ConfigToReleaseListExt-r13 CSI-IM-ConfigToReleaseListExt-r13 OPTIONAL, -- Need ON + csi-IM-ConfigToAddModListExt-r13 CSI-IM-ConfigToAddModListExt-r13 OPTIONAL -- Need ON +} + +CSI-IM-ConfigToAddModList-r11 ::= SEQUENCE (SIZE (1..maxCSI-IM-r11)) OF CSI-IM-Config-r11 + +CSI-IM-ConfigToAddModListExt-r13 ::= SEQUENCE (SIZE (1..maxCSI-IM-v1310)) OF CSI-IM-ConfigExt-r12 + +CSI-IM-ConfigToReleaseList-r11 ::= SEQUENCE (SIZE (1..maxCSI-IM-r11)) OF CSI-IM-ConfigId-r11 + +CSI-IM-ConfigToReleaseListExt-r13 ::= SEQUENCE (SIZE (1..maxCSI-IM-v1310)) OF CSI-IM-ConfigId-v1310 + +CSI-ProcessToAddModList-r11 ::= SEQUENCE (SIZE (1..maxCSI-Proc-r11)) OF CSI-Process-r11 + +CSI-ProcessToReleaseList-r11 ::= SEQUENCE (SIZE (1..maxCSI-Proc-r11)) OF CSI-ProcessId-r11 + +CQI-ReportBothProc-r11 ::= SEQUENCE { + ri-Ref-CSI-ProcessId-r11 CSI-ProcessId-r11 OPTIONAL, -- Need OR + pmi-RI-Report-r11 ENUMERATED {setup} OPTIONAL -- Need OR +} + +CRI-ReportConfig-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + cri-ConfigIndex-r13 CRI-ConfigIndex-r13, + cri-ConfigIndex2-r13 CRI-ConfigIndex-r13 OPTIONAL -- Need OR + } +} + +CRI-ConfigIndex-r13 ::= INTEGER (0..1023) + + +CQI-ReportPeriodicProcExtId-r11 ::= INTEGER (1..maxCQI-ProcExt-r11) + + +CrossCarrierSchedulingConfig-r10 ::= SEQUENCE { + schedulingCellInfo-r10 CHOICE { + own-r10 SEQUENCE { -- No cross carrier scheduling + cif-Presence-r10 BOOLEAN + }, + other-r10 SEQUENCE { -- Cross carrier scheduling + schedulingCellId-r10 ServCellIndex-r10, + pdsch-Start-r10 INTEGER (1..4) + } + } +} + +CrossCarrierSchedulingConfig-r13 ::= SEQUENCE { + schedulingCellInfo-r13 CHOICE { + own-r13 SEQUENCE { -- No cross carrier scheduling + cif-Presence-r13 BOOLEAN + }, + other-r13 SEQUENCE { -- Cross carrier scheduling + schedulingCellId-r13 ServCellIndex-r13, + pdsch-Start-r13 INTEGER (1..4), + cif-InSchedulingCell-r13 INTEGER (1..7) + } + } +} + +CrossCarrierSchedulingConfigLAA-UL-r14 ::= SEQUENCE { + schedulingCellId-r14 ServCellIndex-r13, + cif-InSchedulingCell-r14 INTEGER (1..7) +} + +CSI-IM-Config-r11 ::= SEQUENCE { + csi-IM-ConfigId-r11 CSI-IM-ConfigId-r11, + resourceConfig-r11 INTEGER (0..31), + subframeConfig-r11 INTEGER (0..154), + ..., + [[ interferenceMeasRestriction-r13 BOOLEAN OPTIONAL -- Need ON + ]] +} + +CSI-IM-ConfigExt-r12 ::= SEQUENCE { + csi-IM-ConfigId-v1250 CSI-IM-ConfigId-v1250, + resourceConfig-r12 INTEGER (0..31), + subframeConfig-r12 INTEGER (0..154), + ..., + [[ interferenceMeasRestriction-r13 BOOLEAN OPTIONAL, -- Need ON + csi-IM-ConfigId-v1310 CSI-IM-ConfigId-v1310 OPTIONAL -- Need ON + ]] +} + + +CSI-IM-ConfigId-r11 ::= INTEGER (1..maxCSI-IM-r11) +CSI-IM-ConfigId-r12 ::= INTEGER (1..maxCSI-IM-r12) +CSI-IM-ConfigId-v1250 ::= INTEGER (maxCSI-IM-r12) +CSI-IM-ConfigId-v1310 ::= INTEGER (minCSI-IM-r13..maxCSI-IM-r13) +CSI-IM-ConfigId-r13 ::= INTEGER (1..maxCSI-IM-r13) + + +CSI-Process-r11 ::= SEQUENCE { + csi-ProcessId-r11 CSI-ProcessId-r11, + csi-RS-ConfigNZPId-r11 CSI-RS-ConfigNZPId-r11, + csi-IM-ConfigId-r11 CSI-IM-ConfigId-r11, + p-C-AndCBSRList-r11 P-C-AndCBSR-Pair-r13a, + cqi-ReportBothProc-r11 CQI-ReportBothProc-r11 OPTIONAL, -- Need OR + cqi-ReportPeriodicProcId-r11 INTEGER (0..maxCQI-ProcExt-r11) OPTIONAL, -- Need OR + cqi-ReportAperiodicProc-r11 CQI-ReportAperiodicProc-r11 OPTIONAL, -- Need OR + ..., + [[ alternativeCodebookEnabledFor4TXProc-r12 ENUMERATED {true} OPTIONAL, -- Need ON + csi-IM-ConfigIdList-r12 CHOICE { + release NULL, + setup SEQUENCE (SIZE (1..2)) OF CSI-IM-ConfigId-r12 + } OPTIONAL, -- Need ON + cqi-ReportAperiodicProc2-r12 CHOICE { + release NULL, + setup CQI-ReportAperiodicProc-r11 + } OPTIONAL -- Need ON + ]], + [[ cqi-ReportAperiodicProc-v1310 CHOICE { + release NULL, + setup CQI-ReportAperiodicProc-v1310 + } OPTIONAL, -- Need ON + cqi-ReportAperiodicProc2-v1310 CHOICE { + release NULL, + setup CQI-ReportAperiodicProc-v1310 + } OPTIONAL, -- Need ON + eMIMO-Type-r13 CSI-RS-ConfigEMIMO-r13 OPTIONAL -- Need ON + ]], + [[ eMIMO-Type-v1430 CSI-RS-ConfigEMIMO-v1430 OPTIONAL, -- Need ON + eMIMO-Hybrid-r14 CSI-RS-ConfigEMIMO-Hybrid-r14 OPTIONAL, -- Need ON + advancedCodebookEnabled-r14 BOOLEAN OPTIONAL -- Need ON + ]] +} + + +CSI-ProcessId-r11 ::= INTEGER (1..maxCSI-Proc-r11) + + +CSI-RS-Config-r10 ::= SEQUENCE { + csi-RS-r10 CHOICE { + release NULL, + setup SEQUENCE { + antennaPortsCount-r10 ENUMERATED {an1, an2, an4, an8}, + resourceConfig-r10 INTEGER (0..31), + subframeConfig-r10 INTEGER (0..154), + p-C-r10 INTEGER (-8..15) + } + } OPTIONAL, -- Need ON + zeroTxPowerCSI-RS-r10 ZeroTxPowerCSI-RS-Conf-r12 OPTIONAL -- Need ON +} + +CSI-RS-Config-v1250 ::= SEQUENCE { + zeroTxPowerCSI-RS2-r12 ZeroTxPowerCSI-RS-Conf-r12 OPTIONAL, -- Need ON + ds-ZeroTxPowerCSI-RS-r12 CHOICE { + release NULL, + setup SEQUENCE { + zeroTxPowerCSI-RS-List-r12 SEQUENCE (SIZE (1..maxDS-ZTP-CSI-RS-r12)) OF ZeroTxPowerCSI-RS-r12 + } + } OPTIONAL -- Need ON +} + +CSI-RS-Config-v1310 ::= SEQUENCE { + eMIMO-Type-r13 CSI-RS-ConfigEMIMO-r13 OPTIONAL -- Need ON +} + +CSI-RS-Config-v1430 ::= SEQUENCE { + eMIMO-Type-v1430 CSI-RS-ConfigEMIMO-v1430 OPTIONAL, -- Need ON + eMIMO-Hybrid-r14 CSI-RS-ConfigEMIMO-Hybrid-r14 OPTIONAL, -- Need ON + advancedCodebookEnabled-r14 BOOLEAN OPTIONAL -- Need ON +} + +ZeroTxPowerCSI-RS-Conf-r12 ::= CHOICE { + release NULL, + setup ZeroTxPowerCSI-RS-r12 +} + +ZeroTxPowerCSI-RS-r12 ::= SEQUENCE { + zeroTxPowerResourceConfigList-r12 BIT STRING (SIZE (16)), + zeroTxPowerSubframeConfig-r12 INTEGER (0..154) +} + + +CSI-RS-ConfigEMIMO-r13 ::= CHOICE { + release NULL, + setup CHOICE { + nonPrecoded-r13 CSI-RS-ConfigNonPrecoded-r13, + beamformed-r13 CSI-RS-ConfigBeamformed-r13 + } +} + +CSI-RS-ConfigEMIMO-v1430 ::= CHOICE { + release NULL, + setup CHOICE { + nonPrecoded-v1430 CSI-RS-ConfigNonPrecoded-v1430, + beamformed-v1430 CSI-RS-ConfigBeamformed-v1430 + } +} + +CSI-RS-ConfigEMIMO2-r14 ::= CHOICE { + release NULL, + setup CSI-RS-ConfigBeamformed-r14 +} + +CSI-RS-ConfigEMIMO-Hybrid-r14 ::= CHOICE { + release NULL, + setup SEQUENCE { + periodicityOffsetIndex-r14 INTEGER (0..1023) OPTIONAL, -- Need OR + eMIMO-Type2-r14 CSI-RS-ConfigEMIMO2-r14 OPTIONAL -- Need ON + } +} + +CSI-RS-ConfigNonPrecoded-r13 ::= SEQUENCE { + p-C-AndCBSRList-r13 P-C-AndCBSR-Pair-r13 OPTIONAL, -- Need OR + codebookConfigN1-r13 ENUMERATED {n1, n2, n3, n4, n8}, + codebookConfigN2-r13 ENUMERATED {n1, n2, n3, n4, n8}, + codebookOverSamplingRateConfig-O1-r13 ENUMERATED {n4, n8} OPTIONAL, -- Need OR + codebookOverSamplingRateConfig-O2-r13 ENUMERATED {n4, n8} OPTIONAL, -- Need OR + codebookConfig-r13 INTEGER (1..4), + csi-IM-ConfigIdList-r13 SEQUENCE (SIZE (1..2)) OF CSI-IM-ConfigId-r13 OPTIONAL, -- Need OR + csi-RS-ConfigNZP-EMIMO-r13 CSI-RS-ConfigNZP-EMIMO-r13 OPTIONAL -- Need ON +} + +CSI-RS-ConfigNonPrecoded-v1430::= SEQUENCE { + csi-RS-ConfigNZP-EMIMO-v1430 CSI-RS-ConfigNZP-EMIMO-v1430 OPTIONAL, -- Need ON + codebookConfigN1-v1430 ENUMERATED {n5, n6, n7, n10, n12, n14, n16}, + codebookConfigN2-r1430 ENUMERATED {n5, n6, n7 }, + nzp-ResourceConfigTM9-Original-v1430 CSI-RS-Config-NZP-v1430 +} + +CSI-RS-ConfigBeamformed-r13 ::= SEQUENCE { + csi-RS-ConfigNZPIdListExt-r13 SEQUENCE (SIZE (1..7)) OF CSI-RS-ConfigNZPId-r13 OPTIONAL, -- Need OR + csi-IM-ConfigIdList-r13 SEQUENCE (SIZE (1..8)) OF CSI-IM-ConfigId-r13 OPTIONAL, -- Need OR + p-C-AndCBSR-PerResourceConfigList-r13 SEQUENCE (SIZE (1..8)) OF P-C-AndCBSR-Pair-r13 OPTIONAL, -- Need OR + ace-For4Tx-PerResourceConfigList-r13 SEQUENCE (SIZE (1..7)) OF BOOLEAN OPTIONAL, -- Need OR + alternativeCodebookEnabledBeamformed-r13 ENUMERATED {true} OPTIONAL, -- Need OR + channelMeasRestriction-r13 ENUMERATED {on} OPTIONAL -- Need OR +} + +CSI-RS-ConfigBeamformed-r14 ::= SEQUENCE { + csi-RS-ConfigNZPIdListExt-r14 SEQUENCE (SIZE (1..7)) OF CSI-RS-ConfigNZPId-r13 OPTIONAL, -- Need OR + csi-IM-ConfigIdList-r14 SEQUENCE (SIZE (1..8)) OF CSI-IM-ConfigId-r13 OPTIONAL, -- Need OR + p-C-AndCBSR-PerResourceConfigList-r14 SEQUENCE (SIZE (1..8)) OF P-C-AndCBSR-Pair-r13 OPTIONAL, -- Need OR + ace-For4Tx-PerResourceConfigList-r14 SEQUENCE (SIZE (1..7)) OF BOOLEAN OPTIONAL, -- Need OR + alternativeCodebookEnabledBeamformed-r14 ENUMERATED {true} OPTIONAL, -- Need OR + channelMeasRestriction-r14 ENUMERATED {on} OPTIONAL, -- Need OR + csi-RS-ConfigNZP-ApList-r14 SEQUENCE (SIZE (1..8)) OF CSI-RS-ConfigNZP-r11 + OPTIONAL, -- Need OR + nzp-ResourceConfigOriginal-v1430 CSI-RS-Config-NZP-v1430 OPTIONAL, -- Need OR + csi-RS-NZP-Activation-r14 CSI-RS-ConfigNZP-Activation-r14 OPTIONAL -- Need OR +} + +CSI-RS-ConfigBeamformed-v1430::= SEQUENCE { + csi-RS-ConfigNZP-ApList-r14 SEQUENCE (SIZE (1..8)) OF CSI-RS-ConfigNZP-r11 + OPTIONAL, -- Need OR + nzp-ResourceConfigOriginal-v1430 CSI-RS-Config-NZP-v1430 OPTIONAL, -- Need OR + csi-RS-NZP-Activation-r14 CSI-RS-ConfigNZP-Activation-r14 OPTIONAL -- Need OR +} + +CSI-RS-Config-NZP-v1430::= SEQUENCE { + transmissionComb-r14 NZP-TransmissionComb-r14 OPTIONAL, -- Need OR + frequencyDensity-r14 NZP-FrequencyDensity-r14 OPTIONAL -- Need OR +} + +CSI-RS-ConfigNZP-Activation-r14::= SEQUENCE { + csi-RS-NZP-mode-r14 ENUMERATED {semiPersistent, aperiodic}, + activatedResources-r14 INTEGER (0..4) +} + + +CSI-RS-ConfigNZP-r11 ::= SEQUENCE { + csi-RS-ConfigNZPId-r11 CSI-RS-ConfigNZPId-r11, + antennaPortsCount-r11 ENUMERATED {an1, an2, an4, an8}, + resourceConfig-r11 INTEGER (0..31), + subframeConfig-r11 INTEGER (0..154), + scramblingIdentity-r11 INTEGER (0..503), + qcl-CRS-Info-r11 SEQUENCE { + qcl-ScramblingIdentity-r11 INTEGER (0..503), + crs-PortsCount-r11 ENUMERATED {n1, n2, n4, spare1}, + mbsfn-SubframeConfigList-r11 CHOICE { + release NULL, + setup SEQUENCE { + subframeConfigList MBSFN-SubframeConfigList + } + } OPTIONAL -- Need ON + } OPTIONAL, -- Need OR + ..., + [[ csi-RS-ConfigNZPId-v1310 CSI-RS-ConfigNZPId-v1310 OPTIONAL -- Need ON + ]], + [[ transmissionComb-r14 NZP-TransmissionComb-r14 OPTIONAL, -- Need OR + frequencyDensity-r14 NZP-FrequencyDensity-r14 OPTIONAL -- Need OR + ]], + [[ mbsfn-SubframeConfigList-v1430 CHOICE { + release NULL, + setup SEQUENCE { + subframeConfigList-v1430 MBSFN-SubframeConfigList-v1430 + } + } OPTIONAL -- Need OP + ]] +} + +CSI-RS-ConfigNZP-EMIMO-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + nzp-resourceConfigList-r13 SEQUENCE (SIZE (1..2)) OF NZP-ResourceConfig-r13, + cdmType-r13 ENUMERATED {cdm2, cdm4} OPTIONAL -- Need OR + } +} + +CSI-RS-ConfigNZP-EMIMO-v1430 ::= SEQUENCE { + -- All extensions are for Non-Precoded so could be grouped by setup/ release choice + nzp-resourceConfigListExt-r14 SEQUENCE (SIZE (0..4)) OF NZP-ResourceConfig-r13, + cdmType-v1430 ENUMERATED {cdm8 } OPTIONAL -- Need OR +} + +NZP-ResourceConfig-r13 ::= SEQUENCE { + resourceConfig-r13 ResourceConfig-r13, + ..., + [[ transmissionComb-r14 NZP-TransmissionComb-r14 OPTIONAL, -- Need OR + frequencyDensity-r14 NZP-FrequencyDensity-r14 OPTIONAL -- Need OR + ]] +} + +ResourceConfig-r13 ::= INTEGER (0..31) + +NZP-TransmissionComb-r14 ::= INTEGER (0..2) +NZP-FrequencyDensity-r14 ::= ENUMERATED {d1, d2, d3} + + +CSI-RS-ConfigNZPId-r11 ::= INTEGER (1..maxCSI-RS-NZP-r11) +CSI-RS-ConfigNZPId-v1310 ::= INTEGER (minCSI-RS-NZP-r13..maxCSI-RS-NZP-r13) +CSI-RS-ConfigNZPId-r13 ::= INTEGER (1..maxCSI-RS-NZP-r13) + + +CSI-RS-ConfigZP-r11 ::= SEQUENCE { + csi-RS-ConfigZPId-r11 CSI-RS-ConfigZPId-r11, + resourceConfigList-r11 BIT STRING (SIZE (16)), + subframeConfig-r11 INTEGER (0..154), + ... +} + +CSI-RS-ConfigZP-ApList-r14 ::= CHOICE { + release NULL, + setup SEQUENCE (SIZE (1.. maxCSI-RS-ZP-r11)) OF CSI-RS-ConfigZP-r11 +} + + +CSI-RS-ConfigZPId-r11 ::= INTEGER (1..maxCSI-RS-ZP-r11) + + +DataInactivityTimer-r14 ::= ENUMERATED { + s1, s2, s3, s5, s7, s10, s15, s20, s40, s50, s60, + s80, s100, s120, s150, s180} + + +DMRS-Config-r11 ::= CHOICE { + release NULL, + setup SEQUENCE { + scramblingIdentity-r11 INTEGER (0..503), + scramblingIdentity2-r11 INTEGER (0..503) + } +} +DMRS-Config-v1310 ::= SEQUENCE { + dmrs-tableAlt-r13 ENUMERATED {true} OPTIONAL -- Need OR +} + + +DRB-Identity ::= INTEGER (1..32) + + +EPDCCH-Config-r11 ::= SEQUENCE{ + config-r11 CHOICE { + release NULL, + setup SEQUENCE { + subframePatternConfig-r11 CHOICE { + release NULL, + setup SEQUENCE { + subframePattern-r11 MeasSubframePattern-r10 + } + } OPTIONAL, -- Need ON + startSymbol-r11 INTEGER (1..4) OPTIONAL, -- Need OP + setConfigToReleaseList-r11 EPDCCH-SetConfigToReleaseList-r11 OPTIONAL, -- Need ON + setConfigToAddModList-r11 EPDCCH-SetConfigToAddModList-r11 OPTIONAL -- Need ON + } + } +} + +EPDCCH-SetConfigToAddModList-r11 ::= SEQUENCE (SIZE(1..maxEPDCCH-Set-r11)) OF EPDCCH-SetConfig-r11 + +EPDCCH-SetConfigToReleaseList-r11 ::= SEQUENCE (SIZE(1..maxEPDCCH-Set-r11)) OF EPDCCH-SetConfigId-r11 + +EPDCCH-SetConfig-r11 ::= SEQUENCE { + setConfigId-r11 EPDCCH-SetConfigId-r11, + transmissionType-r11 ENUMERATED {localised, distributed}, + resourceBlockAssignment-r11 SEQUENCE{ + numberPRB-Pairs-r11 ENUMERATED {n2, n4, n8}, + resourceBlockAssignment-r11 BIT STRING (SIZE(4..38)) + }, + dmrs-ScramblingSequenceInt-r11 INTEGER (0..503), + pucch-ResourceStartOffset-r11 INTEGER (0..2047), + re-MappingQCL-ConfigId-r11 PDSCH-RE-MappingQCL-ConfigId-r11 OPTIONAL, -- Need OR + ..., + [[ csi-RS-ConfigZPId2-r12 CHOICE { + release NULL, + setup CSI-RS-ConfigZPId-r11 + } OPTIONAL -- Need ON + ]], + [[ numberPRB-Pairs-v1310 CHOICE { + release NULL, + setup ENUMERATED {n6} + } OPTIONAL, -- Need ON + mpdcch-config-r13 CHOICE { + release NULL, + setup SEQUENCE { + csi-NumRepetitionCE-r13 ENUMERATED {sf1, sf2, sf4, sf8, sf16, sf32}, + mpdcch-pdsch-HoppingConfig-r13 ENUMERATED {on,off}, + mpdcch-StartSF-UESS-r13 CHOICE { + fdd-r13 ENUMERATED {v1, v1dot5, v2, v2dot5, v4, + v5, v8, v10}, tdd-r13 ENUMERATED {v1, v2, v4, v5, v8, v10, + v20, spare1} + }, + mpdcch-NumRepetition-r13 ENUMERATED {r1, r2, r4, r8, r16, + r32, r64, r128, r256}, + mpdcch-Narrowband-r13 INTEGER (1.. maxAvailNarrowBands-r13) + } + } OPTIONAL -- Need ON + ]] +} + +EPDCCH-SetConfigId-r11 ::= INTEGER (0..1) + + +EIMTA-MainConfig-r12 ::= CHOICE { + release NULL, + setup SEQUENCE { + eimta-RNTI-r12 C-RNTI, + eimta-CommandPeriodicity-r12 ENUMERATED {sf10, sf20, sf40, sf80}, + eimta-CommandSubframeSet-r12 BIT STRING (SIZE(10)) + } +} + +EIMTA-MainConfigServCell-r12 ::= CHOICE { + release NULL, + setup SEQUENCE { + eimta-UL-DL-ConfigIndex-r12 INTEGER (1..5), + eimta-HARQ-ReferenceConfig-r12 ENUMERATED {sa2, sa4, sa5}, + mbsfn-SubframeConfigList-v1250 CHOICE { + release NULL, + setup SEQUENCE { + subframeConfigList-r12 MBSFN-SubframeConfigList + } + } + } +} + + +LogicalChannelConfig ::= SEQUENCE { + ul-SpecificParameters SEQUENCE { + priority INTEGER (1..16), + prioritisedBitRate ENUMERATED { + kBps0, kBps8, kBps16, kBps32, kBps64, kBps128, + kBps256, infinity, kBps512-v1020, kBps1024-v1020, + kBps2048-v1020, spare5, spare4, spare3, spare2, + spare1}, + bucketSizeDuration ENUMERATED { + ms50, ms100, ms150, ms300, ms500, ms1000, spare2, + spare1}, + logicalChannelGroup INTEGER (0..3) OPTIONAL -- Need OR + } OPTIONAL, -- Cond UL + ..., + [[ logicalChannelSR-Mask-r9 ENUMERATED {setup} OPTIONAL -- Cond SRmask + ]], + [[ logicalChannelSR-Prohibit-r12 BOOLEAN OPTIONAL -- Need ON + ]], + [[ laa-UL-Allowed-r14 BOOLEAN OPTIONAL, -- Need ON + bitRateQueryProhibitTimer-r14 ENUMERATED { + s0, s0dot4, s0dot8, s1dot6, s3, s6, s12, + s30} OPTIONAL --Need OR + ]] +} + + +LWA-Configuration-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + lwa-Config-r13 LWA-Config-r13 + } +} + +LWA-Config-r13 ::= SEQUENCE { + lwa-MobilityConfig-r13 WLAN-MobilityConfig-r13 OPTIONAL, -- Need ON + lwa-WT-Counter-r13 INTEGER (0..65535) OPTIONAL, -- Need ON + ..., + [[ wt-MAC-Address-r14 OCTET STRING (SIZE (6)) OPTIONAL -- Need ON + ]] +} + + +LWIP-Configuration-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + lwip-Config-r13 LWIP-Config-r13 + } +} + +LWIP-Config-r13 ::= SEQUENCE { + lwip-MobilityConfig-r13 WLAN-MobilityConfig-r13 OPTIONAL, -- Need ON + tunnelConfigLWIP-r13 TunnelConfigLWIP-r13 OPTIONAL, -- Need ON + ... +} + + +MAC-MainConfig ::= SEQUENCE { + ul-SCH-Config SEQUENCE { + maxHARQ-Tx ENUMERATED { + n1, n2, n3, n4, n5, n6, n7, n8, + n10, n12, n16, n20, n24, n28, + spare2, spare1} OPTIONAL, -- Need ON + periodicBSR-Timer PeriodicBSR-Timer-r12 OPTIONAL, -- Need ON + retxBSR-Timer RetxBSR-Timer-r12, + ttiBundling BOOLEAN + } OPTIONAL, -- Need ON + drx-Config DRX-Config OPTIONAL, -- Need ON + timeAlignmentTimerDedicated TimeAlignmentTimer, + phr-Config CHOICE { + release NULL, + setup SEQUENCE { + periodicPHR-Timer ENUMERATED {sf10, sf20, sf50, sf100, sf200, + sf500, sf1000, infinity}, + prohibitPHR-Timer ENUMERATED {sf0, sf10, sf20, sf50, sf100, + sf200, sf500, sf1000}, + dl-PathlossChange ENUMERATED {dB1, dB3, dB6, infinity} + } + } OPTIONAL, -- Need ON + ..., + [[ sr-ProhibitTimer-r9 INTEGER (0..7) OPTIONAL -- Need ON + ]], + [[ mac-MainConfig-v1020 SEQUENCE { + sCellDeactivationTimer-r10 ENUMERATED { + rf2, rf4, rf8, rf16, rf32, rf64, rf128, + spare} OPTIONAL, -- Need OP + extendedBSR-Sizes-r10 ENUMERATED {setup} OPTIONAL, -- Need OR + extendedPHR-r10 ENUMERATED {setup} OPTIONAL -- Need OR + } OPTIONAL -- Need ON + ]], + [[ stag-ToReleaseList-r11 STAG-ToReleaseList-r11 OPTIONAL, -- Need ON + stag-ToAddModList-r11 STAG-ToAddModList-r11 OPTIONAL, -- Need ON + drx-Config-v1130 DRX-Config-v1130 OPTIONAL -- Need ON + ]], + [[ e-HARQ-Pattern-r12 BOOLEAN OPTIONAL, -- Need ON + dualConnectivityPHR CHOICE { + release NULL, + setup SEQUENCE { + phr-ModeOtherCG-r12 ENUMERATED {real, virtual} + } + } OPTIONAL, -- Need ON + logicalChannelSR-Config-r12 CHOICE { + release NULL, + setup SEQUENCE { + logicalChannelSR-ProhibitTimer-r12 ENUMERATED {sf20, sf40, sf64, sf128, sf512, sf1024, sf2560, spare1} + } + } OPTIONAL -- Need ON + ]], + [[ drx-Config-v1310 DRX-Config-v1310 OPTIONAL, -- Need ON + extendedPHR2-r13 BOOLEAN OPTIONAL, -- Need ON + eDRX-Config-CycleStartOffset-r13 CHOICE { + release NULL, + setup + CHOICE { + sf5120 INTEGER(0..1), + sf10240 INTEGER(0..3) + } + } OPTIONAL -- Need ON + ]], + [[ drx-Config-r13 CHOICE { + release NULL, + setup DRX-Config-r13 + } OPTIONAL -- Need ON + ]], + [[ skipUplinkTx-r14 CHOICE { + release NULL, + setup SEQUENCE { + skipUplinkTxSPS-r14 ENUMERATED {true} OPTIONAL, -- Need OR + skipUplinkTxDynamic-r14 ENUMERATED {true} OPTIONAL -- Need OR + } + } OPTIONAL, -- Need ON + dataInactivityTimerConfig-r14 CHOICE { + release NULL, + setup SEQUENCE { + dataInactivityTimer-r14 DataInactivityTimer-r14 + } + } OPTIONAL -- Need ON + ]] +} + +MAC-MainConfigSCell-r11 ::= SEQUENCE { + stag-Id-r11 STAG-Id-r11 OPTIONAL, -- Need OP + ... +} + +DRX-Config ::= CHOICE { + release NULL, + setup SEQUENCE { + onDurationTimer ENUMERATED { + psf1, psf2, psf3, psf4, psf5, psf6, + psf8, psf10, psf20, psf30, psf40, + psf50, psf60, psf80, psf100, + psf200}, + drx-InactivityTimer ENUMERATED { + psf1, psf2, psf3, psf4, psf5, psf6, + psf8, psf10, psf20, psf30, psf40, + psf50, psf60, psf80, psf100, + psf200, psf300, psf500, psf750, + psf1280, psf1920, psf2560, psf0-v1020, + spare9, spare8, spare7, spare6, + spare5, spare4, spare3, spare2, + spare1}, + drx-RetransmissionTimer ENUMERATED { + psf1, psf2, psf4, psf6, psf8, psf16, + psf24, psf33}, + longDRX-CycleStartOffset CHOICE { + sf10 INTEGER(0..9), + sf20 INTEGER(0..19), + sf32 INTEGER(0..31), + sf40 INTEGER(0..39), + sf64 INTEGER(0..63), + sf80 INTEGER(0..79), + sf128 INTEGER(0..127), + sf160 INTEGER(0..159), + sf256 INTEGER(0..255), + sf320 INTEGER(0..319), + sf512 INTEGER(0..511), + sf640 INTEGER(0..639), + sf1024 INTEGER(0..1023), + sf1280 INTEGER(0..1279), + sf2048 INTEGER(0..2047), + sf2560 INTEGER(0..2559) + }, + shortDRX SEQUENCE { + shortDRX-Cycle ENUMERATED { + sf2, sf5, sf8, sf10, sf16, sf20, + sf32, sf40, sf64, sf80, sf128, sf160, + sf256, sf320, sf512, sf640}, + drxShortCycleTimer INTEGER (1..16) + } OPTIONAL -- Need OR + } +} + +DRX-Config-v1130 ::= SEQUENCE { + drx-RetransmissionTimer-v1130 ENUMERATED {psf0-v1130} OPTIONAL, --Need OR + longDRX-CycleStartOffset-v1130 CHOICE { + sf60-v1130 INTEGER(0..59), + sf70-v1130 INTEGER(0..69) + } OPTIONAL, --Need OR + shortDRX-Cycle-v1130 ENUMERATED {sf4-v1130} OPTIONAL --Need OR +} +DRX-Config-v1310 ::= SEQUENCE { + longDRX-CycleStartOffset-v1310 SEQUENCE { + sf60-v1310 INTEGER(0..59) + } OPTIONAL --Need OR +} + +DRX-Config-r13 ::= SEQUENCE { + onDurationTimer-v1310 ENUMERATED {psf300, psf400, psf500, psf600, + psf800, psf1000, psf1200, psf1600} OPTIONAL, --Need OR + drx-RetransmissionTimer-v1310 ENUMERATED {psf40, psf64, psf80, psf96, psf112, + psf128, psf160, psf320} + OPTIONAL, --Need OR + drx-ULRetransmissionTimer-r13 ENUMERATED {psf0, psf1, psf2, psf4, psf6, psf8, psf16, + psf24, psf33, psf40, psf64, psf80, psf96, + psf112, psf128, psf160, psf320} + OPTIONAL --Need OR +} + +PeriodicBSR-Timer-r12 ::= ENUMERATED { + sf5, sf10, sf16, sf20, sf32, sf40, sf64, sf80, + sf128, sf160, sf320, sf640, sf1280, sf2560, + infinity, spare1} + +RetxBSR-Timer-r12 ::= ENUMERATED { + sf320, sf640, sf1280, sf2560, sf5120, + sf10240, spare2, spare1} + +STAG-ToReleaseList-r11 ::= SEQUENCE (SIZE (1..maxSTAG-r11)) OF STAG-Id-r11 + +STAG-ToAddModList-r11 ::= SEQUENCE (SIZE (1..maxSTAG-r11)) OF STAG-ToAddMod-r11 + +STAG-ToAddMod-r11 ::= SEQUENCE { + stag-Id-r11 STAG-Id-r11, + timeAlignmentTimerSTAG-r11 TimeAlignmentTimer, + ... +} + +STAG-Id-r11::= INTEGER (1..maxSTAG-r11) + + +P-C-AndCBSR-r11 ::= SEQUENCE { + p-C-r11 INTEGER (-8..15), + codebookSubsetRestriction-r11 BIT STRING +} + +P-C-AndCBSR-r13 ::= SEQUENCE { + p-C-r13 INTEGER (-8..15), + cbsr-Selection-r13 CHOICE{ + nonPrecoded-r13 SEQUENCE { + codebookSubsetRestriction1-r13 BIT STRING, + codebookSubsetRestriction2-r13 BIT STRING + }, + beamformedK1a-r13 SEQUENCE { + codebookSubsetRestriction3-r13 BIT STRING + }, + beamformedKN-r13 SEQUENCE { + codebookSubsetRestriction-r13 BIT STRING + } + }, + ... +} + +P-C-AndCBSR-Pair-r13a ::= SEQUENCE (SIZE (1..2)) OF P-C-AndCBSR-r11 + +P-C-AndCBSR-Pair-r13 ::= SEQUENCE (SIZE (1..2)) OF P-C-AndCBSR-r13 + + +PDCCH-ConfigSCell-r13 ::= SEQUENCE { + skipMonitoringDCI-format0-1A-r13 ENUMERATED {true} OPTIONAL -- Need OR +} + +PDCCH-ConfigLAA-r14 ::= SEQUENCE { + maxNumberOfSchedSubframes-Format0B-r14 ENUMERATED {sf2, sf3, sf4} OPTIONAL, -- Need OR + maxNumberOfSchedSubframes-Format4B-r14 ENUMERATED {sf2, sf3, sf4} OPTIONAL, -- Need OR + skipMonitoringDCI-Format0A-r14 ENUMERATED {true} OPTIONAL, -- Need OR + skipMonitoringDCI-Format4A-r14 ENUMERATED {true} OPTIONAL, -- Need OR + pdcch-CandidateReductions-Format0A-r14 + PDCCH-CandidateReductions-r13 OPTIONAL, -- Need ON + pdcch-CandidateReductions-Format4A-r14 + PDCCH-CandidateReductionsLAA-UL-r14 OPTIONAL, -- Need ON + pdcch-CandidateReductions-Format0B-r14 + PDCCH-CandidateReductionsLAA-UL-r14 OPTIONAL, -- Need ON + pdcch-CandidateReductions-Format4B-r14 + PDCCH-CandidateReductionsLAA-UL-r14 OPTIONAL -- Need ON +} + +PDCCH-CandidateReductionValue-r13 ::= ENUMERATED {n0, n33, n66, n100} + +PDCCH-CandidateReductionValue-r14 ::= ENUMERATED {n0, n50, n100, n150} + +PDCCH-CandidateReductions-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + pdcch-candidateReductionAL1-r13 PDCCH-CandidateReductionValue-r13, + pdcch-candidateReductionAL2-r13 PDCCH-CandidateReductionValue-r13, + pdcch-candidateReductionAL3-r13 PDCCH-CandidateReductionValue-r13, + pdcch-candidateReductionAL4-r13 PDCCH-CandidateReductionValue-r13, + pdcch-candidateReductionAL5-r13 PDCCH-CandidateReductionValue-r13 + } +} + +PDCCH-CandidateReductionsLAA-UL-r14 ::= CHOICE { + release NULL, + setup SEQUENCE { + pdcch-candidateReductionAL1-r14 PDCCH-CandidateReductionValue-r13, + pdcch-candidateReductionAL2-r14 PDCCH-CandidateReductionValue-r13, + pdcch-candidateReductionAL3-r14 PDCCH-CandidateReductionValue-r14, + pdcch-candidateReductionAL4-r14 PDCCH-CandidateReductionValue-r14, + pdcch-candidateReductionAL5-r14 PDCCH-CandidateReductionValue-r14 + } +} + + +PDCP-Config ::= SEQUENCE { + discardTimer ENUMERATED { + ms50, ms100, ms150, ms300, ms500, + ms750, ms1500, infinity + } OPTIONAL, -- Cond Setup + rlc-AM SEQUENCE { + statusReportRequired BOOLEAN + } OPTIONAL, -- Cond Rlc-AM + rlc-UM SEQUENCE { + pdcp-SN-Size ENUMERATED {len7bits, len12bits} + } OPTIONAL, -- Cond Rlc-UM + headerCompression CHOICE { + notUsed NULL, + rohc SEQUENCE { + maxCID INTEGER (1..16383) DEFAULT 15, + profiles SEQUENCE { + profile0x0001 BOOLEAN, + profile0x0002 BOOLEAN, + profile0x0003 BOOLEAN, + profile0x0004 BOOLEAN, + profile0x0006 BOOLEAN, + profile0x0101 BOOLEAN, + profile0x0102 BOOLEAN, + profile0x0103 BOOLEAN, + profile0x0104 BOOLEAN + }, + ... + } + }, + ..., + [[ rn-IntegrityProtection-r10 ENUMERATED {enabled} OPTIONAL -- Cond RN + ]], + [[ pdcp-SN-Size-v1130 ENUMERATED {len15bits} OPTIONAL -- Cond Rlc-AM2 + ]], + [[ ul-DataSplitDRB-ViaSCG-r12 BOOLEAN OPTIONAL, -- Need ON + t-Reordering-r12 ENUMERATED { + ms0, ms20, ms40, ms60, ms80, ms100, ms120, ms140, + ms160, ms180, ms200, ms220, ms240, ms260, ms280, ms300, + ms500, ms750, spare14, spare13, spare12, spare11, spare10, + spare9, spare8, spare7, spare6, spare5, spare4, spare3, + spare2, spare1} OPTIONAL -- Cond SetupS + ]], + [[ ul-DataSplitThreshold-r13 CHOICE { + release NULL, + setup ENUMERATED { + b0, b100, b200, b400, b800, b1600, b3200, b6400, b12800, + b25600, b51200, b102400, b204800, b409600, b819200, + spare1} + } OPTIONAL, -- Need ON + pdcp-SN-Size-v1310 ENUMERATED {len18bits} OPTIONAL, -- Cond Rlc-AM3 + statusFeedback-r13 CHOICE { + release NULL, + setup SEQUENCE { + statusPDU-TypeForPolling-r13 ENUMERATED {type1, type2} OPTIONAL, -- Need ON + statusPDU-Periodicity-Type1-r13 ENUMERATED { + ms5, ms10, ms20, ms30, ms40, ms50, ms60, ms70, ms80, ms90, + ms100, ms150, ms200, ms300, ms500, ms1000, ms2000, ms5000, + ms10000, ms20000, ms50000} OPTIONAL, -- Need ON + statusPDU-Periodicity-Type2-r13 ENUMERATED { + ms5, ms10, ms20, ms30, ms40, ms50, ms60, ms70, ms80, ms90, + ms100, ms150, ms200, ms300, ms500, ms1000, ms2000, ms5000, + ms10000, ms20000, ms50000} OPTIONAL, -- Need ON + statusPDU-Periodicity-Offset-r13 ENUMERATED { + ms1, ms2, ms5, ms10, ms25, ms50, ms100, ms250, ms500, + ms2500, ms5000, ms25000} OPTIONAL -- Need ON + } + } OPTIONAL -- Need ON + ]], + [[ ul-LWA-Config-r14 CHOICE { + release NULL, + setup SEQUENCE { + ul-LWA-DRB-ViaWLAN-r14 BOOLEAN, + ul-LWA-DataSplitThreshold-r14 ENUMERATED { + b0, b100, b200, b400, b800, b1600, b3200, b6400, + b12800, b25600, b51200, b102400, b204800, b409600, + b819200 } OPTIONAL -- Need OR + } + } OPTIONAL, -- Need ON + uplinkOnlyHeaderCompression-r14 CHOICE { + notUsed-r14 NULL, + rohc-r14 SEQUENCE { + maxCID-r14 INTEGER (1..16383) DEFAULT 15, + profiles-r14 SEQUENCE { + profile0x0006-r14 BOOLEAN + }, + ... + } + } OPTIONAL -- Need ON + ]] +} + + +PDSCH-ConfigCommon ::= SEQUENCE { + referenceSignalPower INTEGER (-60..50), + p-b INTEGER (0..3) +} + +PDSCH-ConfigCommon-v1310 ::= SEQUENCE { + pdsch-maxNumRepetitionCEmodeA-r13 ENUMERATED { + r16, r32 } OPTIONAL, -- Need OR + pdsch-maxNumRepetitionCEmodeB-r13 ENUMERATED { + r192, r256, r384, r512, r768, r1024, + r1536, r2048} OPTIONAL -- Need OR +} + +PDSCH-ConfigDedicated::= SEQUENCE { + p-a ENUMERATED { + dB-6, dB-4dot77, dB-3, dB-1dot77, + dB0, dB1, dB2, dB3} +} + +PDSCH-ConfigDedicated-v1130 ::= SEQUENCE { + dmrs-ConfigPDSCH-r11 DMRS-Config-r11 OPTIONAL, -- Need ON + qcl-Operation ENUMERATED {typeA, typeB} OPTIONAL, -- Need OR + re-MappingQCLConfigToReleaseList-r11 RE-MappingQCLConfigToReleaseList-r11 OPTIONAL, -- Need ON + re-MappingQCLConfigToAddModList-r11 RE-MappingQCLConfigToAddModList-r11 OPTIONAL -- Need ON +} + +PDSCH-ConfigDedicated-v1280 ::= SEQUENCE { + tbsIndexAlt-r12 ENUMERATED {a26, a33} OPTIONAL -- Need OR +} + +PDSCH-ConfigDedicated-v1310 ::= SEQUENCE { + dmrs-ConfigPDSCH-v1310 DMRS-Config-v1310 OPTIONAL -- Need ON +} + +PDSCH-ConfigDedicated-v1430 ::= SEQUENCE { + ce-PDSCH-MaxBandwidth-r14 ENUMERATED {bw5, bw20} OPTIONAL, -- Need OP + ce-PDSCH-TenProcesses-r14 ENUMERATED {on} OPTIONAL, -- Need OR + ce-HARQ-AckBundling-r14 ENUMERATED {on} OPTIONAL, -- Need OR + ce-SchedulingEnhancement-r14 ENUMERATED {range1, range2} OPTIONAL, -- Need OR + tbsIndexAlt2-r14 ENUMERATED {b33} OPTIONAL -- Need OR +} + +PDSCH-ConfigDedicatedSCell-v1430 ::= SEQUENCE { + tbsIndexAlt2-r14 ENUMERATED {b33} OPTIONAL -- Need OR +} + +RE-MappingQCLConfigToAddModList-r11 ::= SEQUENCE (SIZE (1..maxRE-MapQCL-r11)) OF PDSCH-RE-MappingQCL-Config-r11 + +RE-MappingQCLConfigToReleaseList-r11 ::= SEQUENCE (SIZE (1..maxRE-MapQCL-r11)) OF PDSCH-RE-MappingQCL-ConfigId-r11 + +PDSCH-RE-MappingQCL-Config-r11 ::= SEQUENCE { + pdsch-RE-MappingQCL-ConfigId-r11 PDSCH-RE-MappingQCL-ConfigId-r11, + optionalSetOfFields-r11 SEQUENCE { + crs-PortsCount-r11 ENUMERATED {n1, n2, n4, spare1}, + crs-FreqShift-r11 INTEGER (0..5), + mbsfn-SubframeConfigList-r11 CHOICE { + release NULL, + setup SEQUENCE { + subframeConfigList MBSFN-SubframeConfigList + } + } OPTIONAL, -- Need ON + pdsch-Start-r11 ENUMERATED {reserved, n1, n2, n3, n4, assigned} + } OPTIONAL, -- Need OP + csi-RS-ConfigZPId-r11 CSI-RS-ConfigZPId-r11, + qcl-CSI-RS-ConfigNZPId-r11 CSI-RS-ConfigNZPId-r11 OPTIONAL, -- Need OR + ..., + [[ mbsfn-SubframeConfigList-v1430 CHOICE { + release NULL, + setup SEQUENCE { + subframeConfigList-v1430 MBSFN-SubframeConfigList-v1430 + } + } OPTIONAL -- Need OP + ]] +} + + +PDSCH-RE-MappingQCL-ConfigId-r11 ::= INTEGER (1..maxRE-MapQCL-r11) + +PerCC-GapIndicationList-r14 ::= SEQUENCE (SIZE (1..maxServCell-r13)) OF PerCC-GapIndication-r14 + +PerCC-GapIndication-r14 ::= SEQUENCE { + servCellId-r14 ServCellIndex-r13, + gapIndication-r14 ENUMERATED {gap, ncsg, nogap-noNcsg} +} + + +PHICH-Config ::= SEQUENCE { + phich-Duration ENUMERATED {normal, extended}, + phich-Resource ENUMERATED {oneSixth, half, one, two} +} + + +PhysicalConfigDedicated ::= SEQUENCE { + pdsch-ConfigDedicated PDSCH-ConfigDedicated OPTIONAL, -- Need ON + pucch-ConfigDedicated PUCCH-ConfigDedicated OPTIONAL, -- Need ON + pusch-ConfigDedicated PUSCH-ConfigDedicated OPTIONAL, -- Need ON + uplinkPowerControlDedicated UplinkPowerControlDedicated OPTIONAL, -- Need ON + tpc-PDCCH-ConfigPUCCH TPC-PDCCH-Config OPTIONAL, -- Need ON + tpc-PDCCH-ConfigPUSCH TPC-PDCCH-Config OPTIONAL, -- Need ON + cqi-ReportConfig CQI-ReportConfig OPTIONAL, -- Cond CQI-r8 + soundingRS-UL-ConfigDedicated SoundingRS-UL-ConfigDedicated OPTIONAL, -- Need ON + antennaInfo CHOICE { + explicitValue AntennaInfoDedicated, + defaultValue NULL + } OPTIONAL, -- Cond AI-r8 + schedulingRequestConfig SchedulingRequestConfig OPTIONAL, -- Need ON + ..., + [[ cqi-ReportConfig-v920 CQI-ReportConfig-v920 OPTIONAL, -- Cond CQI-r8 + antennaInfo-v920 AntennaInfoDedicated-v920 OPTIONAL -- Cond AI-r8 + ]], + [[ antennaInfo-r10 CHOICE { + explicitValue-r10 AntennaInfoDedicated-r10, + defaultValue NULL + } OPTIONAL, -- Cond AI-r10 + antennaInfoUL-r10 AntennaInfoUL-r10 OPTIONAL, -- Need ON + cif-Presence-r10 BOOLEAN OPTIONAL, -- Need ON + cqi-ReportConfig-r10 CQI-ReportConfig-r10 OPTIONAL, -- Cond CQI-r10 + csi-RS-Config-r10 CSI-RS-Config-r10 OPTIONAL, -- Need ON + pucch-ConfigDedicated-v1020 PUCCH-ConfigDedicated-v1020 OPTIONAL, -- Need ON + pusch-ConfigDedicated-v1020 PUSCH-ConfigDedicated-v1020 OPTIONAL, -- Need ON + schedulingRequestConfig-v1020 SchedulingRequestConfig-v1020 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicated-v1020 + SoundingRS-UL-ConfigDedicated-v1020 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicatedAperiodic-r10 + SoundingRS-UL-ConfigDedicatedAperiodic-r10 OPTIONAL, -- Need ON + uplinkPowerControlDedicated-v1020 + UplinkPowerControlDedicated-v1020 OPTIONAL -- Need ON + ]], + [[ additionalSpectrumEmissionCA-r10 CHOICE { + release NULL, + setup SEQUENCE { + additionalSpectrumEmissionPCell-r10 AdditionalSpectrumEmission + } + } OPTIONAL -- Need ON + ]], + [[ -- DL configuration as well as configuration applicable for DL and UL + csi-RS-ConfigNZPToReleaseList-r11 + CSI-RS-ConfigNZPToReleaseList-r11 OPTIONAL, -- Need ON + csi-RS-ConfigNZPToAddModList-r11 + CSI-RS-ConfigNZPToAddModList-r11 OPTIONAL, -- Need ON + csi-RS-ConfigZPToReleaseList-r11 + CSI-RS-ConfigZPToReleaseList-r11 OPTIONAL, -- Need ON + csi-RS-ConfigZPToAddModList-r11 CSI-RS-ConfigZPToAddModList-r11 OPTIONAL, -- Need ON + epdcch-Config-r11 EPDCCH-Config-r11 OPTIONAL, -- Need ON + pdsch-ConfigDedicated-v1130 PDSCH-ConfigDedicated-v1130 OPTIONAL, -- Need ON + -- UL configuration + cqi-ReportConfig-v1130 CQI-ReportConfig-v1130 OPTIONAL, -- Need ON + pucch-ConfigDedicated-v1130 PUCCH-ConfigDedicated-v1130 OPTIONAL, -- Need ON + pusch-ConfigDedicated-v1130 PUSCH-ConfigDedicated-v1130 OPTIONAL, -- Need ON + uplinkPowerControlDedicated-v1130 + UplinkPowerControlDedicated-v1130 OPTIONAL -- Need ON + ]], + [[ antennaInfo-v1250 AntennaInfoDedicated-v1250 OPTIONAL, -- Cond AI-r10 + eimta-MainConfig-r12 EIMTA-MainConfig-r12 OPTIONAL, -- Need ON + eimta-MainConfigPCell-r12 EIMTA-MainConfigServCell-r12 OPTIONAL, -- Need ON + pucch-ConfigDedicated-v1250 PUCCH-ConfigDedicated-v1250 OPTIONAL, -- Need ON + cqi-ReportConfigPCell-v1250 CQI-ReportConfig-v1250 OPTIONAL, -- Need ON + uplinkPowerControlDedicated-v1250 + UplinkPowerControlDedicated-v1250 OPTIONAL, -- Need ON + pusch-ConfigDedicated-v1250 PUSCH-ConfigDedicated-v1250 OPTIONAL, -- Need ON + csi-RS-Config-v1250 CSI-RS-Config-v1250 OPTIONAL -- Need ON + ]], + [[ pdsch-ConfigDedicated-v1280 PDSCH-ConfigDedicated-v1280 OPTIONAL -- Need ON + ]], + [[ pdsch-ConfigDedicated-v1310 PDSCH-ConfigDedicated-v1310 OPTIONAL, -- Need ON + pucch-ConfigDedicated-r13 PUCCH-ConfigDedicated-r13 OPTIONAL, -- Need ON + pusch-ConfigDedicated-r13 PUSCH-ConfigDedicated-r13 OPTIONAL, -- Need ON + pdcch-CandidateReductions-r13 + PDCCH-CandidateReductions-r13 OPTIONAL, -- Need ON + cqi-ReportConfig-v1310 CQI-ReportConfig-v1310 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicated-v1310 + SoundingRS-UL-ConfigDedicated-v1310 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicatedUpPTsExt-r13 + SoundingRS-UL-ConfigDedicatedUpPTsExt-r13 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicatedAperiodic-v1310 + SoundingRS-UL-ConfigDedicatedAperiodic-v1310 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicatedAperiodicUpPTsExt-r13 + SoundingRS-UL-ConfigDedicatedAperiodicUpPTsExt-r13 OPTIONAL, -- Need ON + csi-RS-Config-v1310 CSI-RS-Config-v1310 OPTIONAL, -- Need ON + ce-Mode-r13 CHOICE { + release NULL, + setup ENUMERATED {ce-ModeA,ce-ModeB} + } OPTIONAL, -- Need ON + csi-RS-ConfigNZPToAddModListExt-r13 CSI-RS-ConfigNZPToAddModListExt-r13 OPTIONAL, -- Need ON + csi-RS-ConfigNZPToReleaseListExt-r13 CSI-RS-ConfigNZPToReleaseListExt-r13 OPTIONAL -- Need ON + ]], + [[ cqi-ReportConfig-v1320 CQI-ReportConfig-v1320 OPTIONAL -- Need ON + ]], + [[ typeA-SRS-TPC-PDCCH-Group-r14 CHOICE { + release NULL, + setup SEQUENCE (SIZE (1..32)) OF SRS-TPC-PDCCH-Config-r14 + } OPTIONAL, -- Need ON + must-Config-r14 CHOICE{ + release NULL, + setup SEQUENCE { + k-max-r14 ENUMERATED {l1, l3}, + p-a-must-r14 ENUMERATED { + dB-6, dB-4dot77, dB-3, dB-1dot77, + dB0, dB1, dB2, dB3} OPTIONAL -- Need ON + } + } OPTIONAL, -- Need ON + pusch-EnhancementsConfig-r14 PUSCH-EnhancementsConfig-r14 OPTIONAL, -- Need + ce-pdsch-pusch-EnhancementConfig-r14 ENUMERATED {on} OPTIONAL, -- Need OR + antennaInfo-v1430 AntennaInfoDedicated-v1430 OPTIONAL, -- Need ON + pucch-ConfigDedicated-v1430 PUCCH-ConfigDedicated-v1430 OPTIONAL, -- Need ON + pdsch-ConfigDedicated-v1430 PDSCH-ConfigDedicated-v1430 OPTIONAL, -- Need ON + pusch-ConfigDedicated-v1430 PUSCH-ConfigDedicated-v1430 OPTIONAL, -- Need ON + soundingRS-UL-PeriodicConfigDedicatedList-r14 SEQUENCE (SIZE (1..2)) OF SoundingRS-UL-ConfigDedicated OPTIONAL, -- Cond PeriodicSRSPCell + soundingRS-UL-PeriodicConfigDedicatedUpPTsExtList-r14 SEQUENCE (SIZE (1..4)) OF SoundingRS-UL-ConfigDedicatedUpPTsExt-r13 OPTIONAL, -- Cond PeriodicSRSExt + soundingRS-UL-AperiodicConfigDedicatedList-r14 SEQUENCE (SIZE (1..2)) OF SoundingRS-UL-ConfigDedicatedAperiodic-r10 OPTIONAL, -- Cond AperiodicSRS + soundingRS-UL-ConfigDedicatedApUpPTsExtList-r14 SEQUENCE (SIZE (1..4)) OF SoundingRS-UL-ConfigDedicatedAperiodicUpPTsExt-r13 OPTIONAL, -- Cond AperiodicSRSExt + csi-RS-Config-v1430 CSI-RS-Config-v1430 OPTIONAL, -- Need ON + csi-RS-ConfigZP-ApList-r14 CSI-RS-ConfigZP-ApList-r14 OPTIONAL, -- Need ON + cqi-ReportConfig-v1430 CQI-ReportConfig-v1430 OPTIONAL, -- Need ON + semiOpenLoop-r14 BOOLEAN OPTIONAL -- Need ON + ]] +} + +PhysicalConfigDedicatedSCell-r10 ::= SEQUENCE { + -- DL configuration as well as configuration applicable for DL and UL + nonUL-Configuration-r10 SEQUENCE { + antennaInfo-r10 + AntennaInfoDedicated-r10 OPTIONAL, -- Need ON + crossCarrierSchedulingConfig-r10 + CrossCarrierSchedulingConfig-r10 OPTIONAL, -- Need ON + csi-RS-Config-r10 CSI-RS-Config-r10 OPTIONAL, -- Need ON + pdsch-ConfigDedicated-r10 PDSCH-ConfigDedicated OPTIONAL -- Need ON + } OPTIONAL, -- Cond SCellAdd + -- UL configuration + ul-Configuration-r10 SEQUENCE { + antennaInfoUL-r10 AntennaInfoUL-r10 OPTIONAL, -- Need ON + pusch-ConfigDedicatedSCell-r10 + PUSCH-ConfigDedicatedSCell-r10 OPTIONAL, -- Cond PUSCH-SCell1 + uplinkPowerControlDedicatedSCell-r10 + UplinkPowerControlDedicatedSCell-r10 OPTIONAL, -- Need ON + cqi-ReportConfigSCell-r10 CQI-ReportConfigSCell-r10 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicated-r10 + SoundingRS-UL-ConfigDedicated OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicated-v1020 + SoundingRS-UL-ConfigDedicated-v1020 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicatedAperiodic-r10 + SoundingRS-UL-ConfigDedicatedAperiodic-r10 OPTIONAL -- Need ON + } OPTIONAL, -- Cond CommonUL + ..., + [[ -- DL configuration as well as configuration applicable for DL and UL + csi-RS-ConfigNZPToReleaseList-r11 + CSI-RS-ConfigNZPToReleaseList-r11 OPTIONAL, -- Need ON + csi-RS-ConfigNZPToAddModList-r11 + CSI-RS-ConfigNZPToAddModList-r11 OPTIONAL, -- Need ON + csi-RS-ConfigZPToReleaseList-r11 + CSI-RS-ConfigZPToReleaseList-r11 OPTIONAL, -- Need ON + csi-RS-ConfigZPToAddModList-r11 + CSI-RS-ConfigZPToAddModList-r11 OPTIONAL, -- Need ON + epdcch-Config-r11 EPDCCH-Config-r11 OPTIONAL, -- Need ON + pdsch-ConfigDedicated-v1130 PDSCH-ConfigDedicated-v1130 OPTIONAL, -- Need ON + -- UL configuration + cqi-ReportConfig-v1130 CQI-ReportConfig-v1130 OPTIONAL, -- Need ON + pusch-ConfigDedicated-v1130 + PUSCH-ConfigDedicated-v1130 OPTIONAL, -- Cond PUSCH-SCell1 + uplinkPowerControlDedicatedSCell-v1130 + UplinkPowerControlDedicated-v1130 OPTIONAL -- Need ON + ]], + [[ antennaInfo-v1250 AntennaInfoDedicated-v1250 OPTIONAL, -- Need ON + eimta-MainConfigSCell-r12 + EIMTA-MainConfigServCell-r12 OPTIONAL, -- Need ON + cqi-ReportConfigSCell-v1250 CQI-ReportConfig-v1250 OPTIONAL, -- Need ON + uplinkPowerControlDedicatedSCell-v1250 + UplinkPowerControlDedicated-v1250 OPTIONAL, -- Need ON + csi-RS-Config-v1250 CSI-RS-Config-v1250 OPTIONAL -- Need ON + ]], + [[ pdsch-ConfigDedicated-v1280 PDSCH-ConfigDedicated-v1280 OPTIONAL -- Need ON + ]], + [[ pucch-Cell-r13 ENUMERATED {true} OPTIONAL, -- Cond PUCCH-SCell1 + pucch-SCell CHOICE{ + release NULL, + setup SEQUENCE { + pucch-ConfigDedicated-r13 + PUCCH-ConfigDedicated-r13 OPTIONAL, -- Need ON + schedulingRequestConfig-r13 + SchedulingRequestConfigSCell-r13 OPTIONAL, -- Need ON + tpc-PDCCH-ConfigPUCCH-SCell-r13 + TPC-PDCCH-ConfigSCell-r13 OPTIONAL, -- Need ON + pusch-ConfigDedicated-r13 + PUSCH-ConfigDedicated-r13 OPTIONAL, -- Cond PUSCH-SCell + uplinkPowerControlDedicated-r13 + UplinkPowerControlDedicatedSCell-v1310 OPTIONAL -- Need ON + } + } OPTIONAL, -- Need ON + crossCarrierSchedulingConfig-r13 + CrossCarrierSchedulingConfig-r13 OPTIONAL, -- Cond Cross-Carrier-Config + pdcch-ConfigSCell-r13 PDCCH-ConfigSCell-r13 OPTIONAL, -- Need ON + cqi-ReportConfig-v1310 CQI-ReportConfig-v1310 OPTIONAL, -- Need ON + pdsch-ConfigDedicated-v1310 PDSCH-ConfigDedicated-v1310 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicated-v1310 + SoundingRS-UL-ConfigDedicated-v1310 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicatedUpPTsExt-r13 + SoundingRS-UL-ConfigDedicatedUpPTsExt-r13 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicatedAperiodic-v1310 + SoundingRS-UL-ConfigDedicatedAperiodic-v1310 OPTIONAL, -- Need ON + soundingRS-UL-ConfigDedicatedAperiodicUpPTsExt-r13 + SoundingRS-UL-ConfigDedicatedAperiodicUpPTsExt-r13 OPTIONAL, -- Need ON + csi-RS-Config-v1310 CSI-RS-Config-v1310 OPTIONAL, -- Need ON + laa-SCellConfiguration-r13 LAA-SCellConfiguration-r13 OPTIONAL, -- Need ON + csi-RS-ConfigNZPToAddModListExt-r13 CSI-RS-ConfigNZPToAddModListExt-r13 OPTIONAL, -- Need ON + csi-RS-ConfigNZPToReleaseListExt-r13 CSI-RS-ConfigNZPToReleaseListExt-r13 OPTIONAL -- Need ON + ]], + [[ cqi-ReportConfig-v1320 CQI-ReportConfig-v1320 OPTIONAL -- Need ON + ]], + [[ laa-SCellConfiguration-v1430 LAA-SCellConfiguration-v1430 + OPTIONAL, -- Need ON + typeB-SRS-TPC-PDCCH-Config-r14 SRS-TPC-PDCCH-Config-r14 OPTIONAL, -- Need ON + + uplinkPUSCH-LessPowerControlDedicated-v1430 UplinkPUSCH-LessPowerControlDedicated-v1430 OPTIONAL, -- Need ON + soundingRS-UL-PeriodicConfigDedicatedList-r14 SEQUENCE (SIZE (1..2)) OF SoundingRS-UL-ConfigDedicated OPTIONAL, -- Cond PeriodicSRS + soundingRS-UL-PeriodicConfigDedicatedUpPTsExtList-r14 SEQUENCE (SIZE (1..4)) OF SoundingRS-UL-ConfigDedicatedUpPTsExt-r13 OPTIONAL, -- Cond PeriodicSRSExt + soundingRS-UL-AperiodicConfigDedicatedList-r14 SEQUENCE (SIZE (1..2)) OF SoundingRS-AperiodicSet-r14 OPTIONAL, -- Cond AperiodicSRS + soundingRS-UL-ConfigDedicatedApUpPTsExtList-r14 SEQUENCE (SIZE (1..4)) OF SoundingRS-AperiodicSetUpPTsExt-r14 OPTIONAL, -- Cond AperiodicSRSExt + must-Config-r14 CHOICE{ + release NULL, + setup SEQUENCE { + k-max-r14 ENUMERATED {l1, l3}, + p-a-must-r14 ENUMERATED { + dB-6, dB-4dot77, dB-3, dB-1dot77, + dB0, dB1, dB2, dB3} OPTIONAL -- Need ON + } + } OPTIONAL, -- Need ON + pusch-ConfigDedicated-v1430 PUSCH-ConfigDedicatedSCell-v1430 OPTIONAL, -- Need ON + csi-RS-Config-v1430 CSI-RS-Config-v1430 OPTIONAL, -- Need ON + csi-RS-ConfigZP-ApList-r14 CSI-RS-ConfigZP-ApList-r14 OPTIONAL, -- Need ON + cqi-ReportConfig-v1430 CQI-ReportConfig-v1430 OPTIONAL, -- Need ON + semiOpenLoop-r14 BOOLEAN OPTIONAL, -- Need ON + pdsch-ConfigDedicatedSCell-v1430 PDSCH-ConfigDedicatedSCell-v1430 OPTIONAL -- Need ON + ]] +} + +LAA-SCellConfiguration-r13 ::= SEQUENCE { + subframeStartPosition-r13 ENUMERATED {s0, s07}, + laa-SCellSubframeConfig-r13 BIT STRING (SIZE(8)) +} + +LAA-SCellConfiguration-v1430 ::= SEQUENCE { + crossCarrierSchedulingConfig-UL-r14 CHOICE { + release NULL, + setup SEQUENCE { + crossCarrierSchedulingConfigLAA-UL-r14 CrossCarrierSchedulingConfigLAA-UL-r14 + } + } OPTIONAL, -- Cond Cross-Carrier-ConfigUL + lbt-Config-r14 LBT-Config-r14 OPTIONAL, -- Need ON + pdcch-ConfigLAA-r14 PDCCH-ConfigLAA-r14 OPTIONAL, -- Need ON + absenceOfAnyOtherTechnology-r14 ENUMERATED {true} OPTIONAL, -- Need OR + soundingRS-UL-ConfigDedicatedAperiodic-v1430 + SoundingRS-UL-ConfigDedicatedAperiodic-v1430 OPTIONAL -- Need ON +} + +LBT-Config-r14 ::= CHOICE{ + maxEnergyDetectionThreshold-r14 INTEGER(-85..-52), + energyDetectionThresholdOffset-r14 INTEGER(-13..20) +} + +CSI-RS-ConfigNZPToAddModList-r11 ::= SEQUENCE (SIZE (1..maxCSI-RS-NZP-r11)) OF CSI-RS-ConfigNZP-r11 + +CSI-RS-ConfigNZPToAddModListExt-r13 ::= SEQUENCE (SIZE (1..maxCSI-RS-NZP-v1310)) OF CSI-RS-ConfigNZP-r11 + +CSI-RS-ConfigNZPToReleaseList-r11 ::= SEQUENCE (SIZE (1..maxCSI-RS-NZP-r11)) OF CSI-RS-ConfigNZPId-r11 + +CSI-RS-ConfigNZPToReleaseListExt-r13 ::= SEQUENCE (SIZE (1..maxCSI-RS-NZP-v1310)) OF CSI-RS-ConfigNZPId-v1310 + +CSI-RS-ConfigZPToAddModList-r11 ::= SEQUENCE (SIZE (1..maxCSI-RS-ZP-r11)) OF CSI-RS-ConfigZP-r11 + +CSI-RS-ConfigZPToReleaseList-r11 ::= SEQUENCE (SIZE (1..maxCSI-RS-ZP-r11)) OF CSI-RS-ConfigZPId-r11 + +SoundingRS-AperiodicSet-r14 ::= SEQUENCE{ + srs-CC-SetIndexList-r14 + SEQUENCE (SIZE (1..4)) OF SRS-CC-SetIndex-r14 + OPTIONAL, -- Cond SRS-Trigger-TypeA + soundingRS-UL-ConfigDedicatedAperiodic-r14 + SoundingRS-UL-ConfigDedicatedAperiodic-r10 +} + +SoundingRS-AperiodicSetUpPTsExt-r14 ::= SEQUENCE{ + srs-CC-SetIndexList-r14 + SEQUENCE (SIZE (1..4)) OF SRS-CC-SetIndex-r14 + OPTIONAL, -- Cond SRS-Trigger-TypeA + soundingRS-UL-ConfigDedicatedAperiodicUpPTsExt-r14 + SoundingRS-UL-ConfigDedicatedAperiodicUpPTsExt-r13 +} + + +P-Max ::= INTEGER (-30..33) + + +PRACH-ConfigSIB ::= SEQUENCE { + rootSequenceIndex INTEGER (0..837), + prach-ConfigInfo PRACH-ConfigInfo +} + +PRACH-ConfigSIB-v1310 ::= SEQUENCE { + rsrp-ThresholdsPrachInfoList-r13 RSRP-ThresholdsPrachInfoList-r13, + mpdcch-startSF-CSS-RA-r13 CHOICE { + fdd-r13 ENUMERATED {v1, v1dot5, v2, v2dot5, v4, v5, v8, + v10}, + tdd-r13 ENUMERATED {v1, v2, v4, v5, v8, v10, v20, spare} + } OPTIONAL, -- Cond MP + prach-HoppingOffset-r13 INTEGER (0..94) OPTIONAL, -- Need OR + prach-ParametersListCE-r13 PRACH-ParametersListCE-r13 +} + +PRACH-Config ::= SEQUENCE { + rootSequenceIndex INTEGER (0..837), + prach-ConfigInfo PRACH-ConfigInfo OPTIONAL -- Need ON +} + +PRACH-Config-v1310 ::= SEQUENCE { + rsrp-ThresholdsPrachInfoList-r13 RSRP-ThresholdsPrachInfoList-r13 OPTIONAL, -- Cond HO + mpdcch-startSF-CSS-RA-r13 CHOICE { + fdd-r13 ENUMERATED {v1, v1dot5, v2, v2dot5, v4, v5, v8, + v10}, + tdd-r13 ENUMERATED {v1, v2, v4, v5, v8, v10, v20, spare} + } OPTIONAL, -- Cond MP + prach-HoppingOffset-r13 INTEGER (0..94) OPTIONAL, -- Need OR + prach-ParametersListCE-r13 PRACH-ParametersListCE-r13 OPTIONAL, -- Cond MP + initial-CE-level-r13 INTEGER (0..3) OPTIONAL -- Need OR +} + +PRACH-Config-v1430 ::= SEQUENCE { + rootSequenceIndexHighSpeed-r14 INTEGER (0..837), + zeroCorrelationZoneConfigHighSpeed-r14 INTEGER (0..12), + prach-ConfigIndexHighSpeed-r14 INTEGER (0..63), + prach-FreqOffsetHighSpeed-r14 INTEGER (0..94) +} + +PRACH-ConfigSCell-r10 ::= SEQUENCE { + prach-ConfigIndex-r10 INTEGER (0..63) +} + +PRACH-ConfigInfo ::= SEQUENCE { + prach-ConfigIndex INTEGER (0..63), + highSpeedFlag BOOLEAN, + zeroCorrelationZoneConfig INTEGER (0..15), + prach-FreqOffset INTEGER (0..94) +} + +PRACH-ParametersListCE-r13 ::= SEQUENCE (SIZE(1..maxCE-Level-r13)) OF PRACH-ParametersCE-r13 + +PRACH-ParametersCE-r13 ::= SEQUENCE { + prach-ConfigIndex-r13 INTEGER (0..63), + prach-FreqOffset-r13 INTEGER (0..94), + prach-StartingSubframe-r13 ENUMERATED {sf2, sf4, sf8, sf16, sf32, sf64, sf128, + sf256} OPTIONAL, -- Need OP + maxNumPreambleAttemptCE-r13 + ENUMERATED {n3, n4, n5, n6, n7, n8, n10} OPTIONAL, -- Need OP + numRepetitionPerPreambleAttempt-r13 ENUMERATED {n1,n2,n4,n8,n16,n32,n64,n128}, + mpdcch-NarrowbandsToMonitor-r13 SEQUENCE (SIZE(1..2)) OF + INTEGER (1..maxAvailNarrowBands-r13), + mpdcch-NumRepetition-RA-r13 ENUMERATED {r1, r2, r4, r8, r16, + r32, r64, r128, r256}, + prach-HoppingConfig-r13 ENUMERATED {on,off} +} + +RSRP-ThresholdsPrachInfoList-r13 ::= SEQUENCE (SIZE(1..3)) OF RSRP-Range + + +PresenceAntennaPort1 ::= BOOLEAN + + +PUCCH-ConfigCommon ::= SEQUENCE { + deltaPUCCH-Shift ENUMERATED {ds1, ds2, ds3}, + nRB-CQI INTEGER (0..98), + nCS-AN INTEGER (0..7), + n1PUCCH-AN INTEGER (0..2047) +} + +PUCCH-ConfigCommon-v1310 ::= SEQUENCE { + n1PUCCH-AN-InfoList-r13 N1PUCCH-AN-InfoList-r13 OPTIONAL, -- Need OR + pucch-NumRepetitionCE-Msg4-Level0-r13 ENUMERATED {n1, n2, n4, n8} OPTIONAL, -- Need OR + pucch-NumRepetitionCE-Msg4-Level1-r13 ENUMERATED {n1, n2, n4, n8} OPTIONAL, -- Need OR + pucch-NumRepetitionCE-Msg4-Level2-r13 ENUMERATED {n4, n8, n16, n32} OPTIONAL, -- Need OR + pucch-NumRepetitionCE-Msg4-Level3-r13 ENUMERATED {n4, n8, n16, n32} OPTIONAL -- Need OR +} + +PUCCH-ConfigCommon-v1430 ::= SEQUENCE { + pucch-NumRepetitionCE-Msg4-Level3-r14 ENUMERATED {n64, n128} OPTIONAL -- Need OR +} + +PUCCH-ConfigDedicated ::= SEQUENCE { + ackNackRepetition CHOICE{ + release NULL, + setup SEQUENCE { + repetitionFactor ENUMERATED {n2, n4, n6, spare1}, + n1PUCCH-AN-Rep INTEGER (0..2047) + } + }, + tdd-AckNackFeedbackMode ENUMERATED {bundling, multiplexing} OPTIONAL -- Cond TDD +} + +PUCCH-ConfigDedicated-v1020 ::= SEQUENCE { + pucch-Format-r10 CHOICE { + format3-r10 SEQUENCE { + n3PUCCH-AN-List-r10 SEQUENCE (SIZE (1..4)) OF INTEGER (0..549) OPTIONAL, -- Need ON + twoAntennaPortActivatedPUCCH-Format3-r10 CHOICE { + release NULL, + setup SEQUENCE { + n3PUCCH-AN-ListP1-r10 SEQUENCE (SIZE (1..4)) OF INTEGER (0..549) + } + } OPTIONAL -- Need ON + }, + channelSelection-r10 SEQUENCE { + n1PUCCH-AN-CS-r10 CHOICE { + release NULL, + setup SEQUENCE { + n1PUCCH-AN-CS-List-r10 SEQUENCE (SIZE (1..2)) OF N1PUCCH-AN-CS-r10 + } + } OPTIONAL -- Need ON + } + } OPTIONAL, -- Need OR + twoAntennaPortActivatedPUCCH-Format1a1b-r10 ENUMERATED {true} OPTIONAL, -- Need OR + simultaneousPUCCH-PUSCH-r10 ENUMERATED {true} OPTIONAL, -- Need OR + n1PUCCH-AN-RepP1-r10 INTEGER (0..2047) OPTIONAL -- Need OR +} + +PUCCH-ConfigDedicated-v1130 ::= SEQUENCE { + n1PUCCH-AN-CS-v1130 CHOICE { + release NULL, + setup SEQUENCE { + n1PUCCH-AN-CS-ListP1-r11 SEQUENCE (SIZE (2..4)) OF INTEGER (0..2047) + } + } OPTIONAL, -- Need ON + nPUCCH-Param-r11 CHOICE { + release NULL, + setup SEQUENCE { + nPUCCH-Identity-r11 INTEGER (0..503), + n1PUCCH-AN-r11 INTEGER (0..2047) + } + } OPTIONAL -- Need ON +} + +PUCCH-ConfigDedicated-v1250 ::= SEQUENCE { + nkaPUCCH-Param-r12 CHOICE { + release NULL, + setup SEQUENCE { + nkaPUCCH-AN-r12 INTEGER (0..2047) + } + } +} + +PUCCH-ConfigDedicated-r13 ::= SEQUENCE { +--Release 8 + ackNackRepetition-r13 CHOICE{ + release NULL, + setup SEQUENCE { + repetitionFactor-r13 ENUMERATED {n2, n4, n6, spare1}, + n1PUCCH-AN-Rep-r13 INTEGER (0..2047) + } + }, + tdd-AckNackFeedbackMode-r13 ENUMERATED {bundling, multiplexing} OPTIONAL, -- Cond TDD +--Release 10 + pucch-Format-r13 CHOICE { + format3-r13 SEQUENCE { + n3PUCCH-AN-List-r13 SEQUENCE (SIZE (1..4)) OF INTEGER (0..549) OPTIONAL, -- Need ON + twoAntennaPortActivatedPUCCH-Format3-r13 CHOICE { + release NULL, + setup SEQUENCE { + n3PUCCH-AN-ListP1-r13 SEQUENCE (SIZE (1..4)) OF INTEGER (0..549) + } + } OPTIONAL -- Need ON + }, + channelSelection-r13 SEQUENCE { + n1PUCCH-AN-CS-r13 CHOICE { + release NULL, + setup SEQUENCE { + n1PUCCH-AN-CS-List-r13 SEQUENCE (SIZE (1..2)) OF N1PUCCH-AN-CS-r10, + n1PUCCH-AN-CS-ListP1-r13 SEQUENCE (SIZE (2..4)) OF INTEGER (0..2047) + } + } OPTIONAL -- Need ON + }, + format4-r13 SEQUENCE { + format4-resourceConfiguration-r13 SEQUENCE (SIZE (4)) OF Format4-resource-r13, + format4-MultiCSI-resourceConfiguration-r13 SEQUENCE (SIZE (1..2)) OF Format4-resource-r13 OPTIONAL -- Need OR + }, + format5-r13 SEQUENCE { + format5-resourceConfiguration-r13 SEQUENCE (SIZE (4)) OF Format5-resource-r13, + format5-MultiCSI-resourceConfiguration-r13 Format5-resource-r13 OPTIONAL -- Need OR + } + } OPTIONAL, -- Need OR + twoAntennaPortActivatedPUCCH-Format1a1b-r13 ENUMERATED {true} OPTIONAL, -- Need OR + simultaneousPUCCH-PUSCH-r13 ENUMERATED {true} OPTIONAL, -- Need OR + n1PUCCH-AN-RepP1-r13 INTEGER (0..2047) OPTIONAL, -- Need OR +--Release 11 + nPUCCH-Param-r13 CHOICE { + release NULL, + setup SEQUENCE { + nPUCCH-Identity-r13 INTEGER (0..503), + n1PUCCH-AN-r13 INTEGER (0..2047) + } + } OPTIONAL, -- Need ON +--Release 12 + nkaPUCCH-Param-r13 CHOICE { + release NULL, + setup SEQUENCE { + nkaPUCCH-AN-r13 INTEGER (0..2047) + } + } OPTIONAL, -- Need ON +--Release 13 + spatialBundlingPUCCH-r13 BOOLEAN, + spatialBundlingPUSCH-r13 BOOLEAN, + harq-TimingTDD-r13 BOOLEAN, + codebooksizeDetermination-r13 ENUMERATED {dai,cc} OPTIONAL, -- Need OR + maximumPayloadCoderate-r13 INTEGER (0..7) OPTIONAL, -- Need OR + pucch-NumRepetitionCE-r13 CHOICE { + release NULL, + setup CHOICE { + modeA SEQUENCE { + pucch-NumRepetitionCE-format1-r13 ENUMERATED {r1, r2, r4, r8}, + pucch-NumRepetitionCE-format2-r13 ENUMERATED {r1, r2, r4, r8} + }, + modeB SEQUENCE { + pucch-NumRepetitionCE-format1-r13 ENUMERATED {r4, r8, r16, r32}, + pucch-NumRepetitionCE-format2-r13 ENUMERATED {r4, r8, r16, r32} + } + } + } OPTIONAL --Need ON +} + +PUCCH-ConfigDedicated-v1430 ::= SEQUENCE { + pucch-NumRepetitionCE-format1-r14 ENUMERATED {r64,r128} OPTIONAL -- Need OR +} + +Format4-resource-r13 ::= SEQUENCE { + startingPRB-format4-r13 INTEGER (0..109), + numberOfPRB-format4-r13 INTEGER (0..7) +} + +Format5-resource-r13 ::= SEQUENCE { + startingPRB-format5-r13 INTEGER (0..109), + cdm-index-format5-r13 INTEGER (0..1) +} + + + +N1PUCCH-AN-CS-r10 ::= SEQUENCE (SIZE (1..4)) OF INTEGER (0..2047) + +N1PUCCH-AN-InfoList-r13 ::= SEQUENCE (SIZE(1..maxCE-Level-r13)) OF INTEGER (0..2047) + + +PUSCH-ConfigCommon ::= SEQUENCE { + pusch-ConfigBasic SEQUENCE { + n-SB INTEGER (1..4), + hoppingMode ENUMERATED {interSubFrame, intraAndInterSubFrame}, + pusch-HoppingOffset INTEGER (0..98), + enable64QAM BOOLEAN + }, + ul-ReferenceSignalsPUSCH UL-ReferenceSignalsPUSCH +} + +PUSCH-ConfigCommon-v1270 ::= SEQUENCE { + enable64QAM-v1270 ENUMERATED {true} +} + +PUSCH-ConfigCommon-v1310 ::= SEQUENCE { + pusch-maxNumRepetitionCEmodeA-r13 ENUMERATED { + r8, r16, r32 } OPTIONAL, -- Need OR + pusch-maxNumRepetitionCEmodeB-r13 ENUMERATED { + r192, r256, r384, r512, r768, r1024, + r1536, r2048} OPTIONAL, -- Need OR + pusch-HoppingOffset-v1310 + INTEGER (1..maxAvailNarrowBands-r13) OPTIONAL -- Need OR +} + +PUSCH-ConfigDedicated ::= SEQUENCE { + betaOffset-ACK-Index INTEGER (0..15), + betaOffset-RI-Index INTEGER (0..15), + betaOffset-CQI-Index INTEGER (0..15) +} + +PUSCH-ConfigDedicated-v1020 ::= SEQUENCE { + betaOffsetMC-r10 SEQUENCE { + betaOffset-ACK-Index-MC-r10 INTEGER (0..15), + betaOffset-RI-Index-MC-r10 INTEGER (0..15), + betaOffset-CQI-Index-MC-r10 INTEGER (0..15) + } OPTIONAL, -- Need OR + groupHoppingDisabled-r10 ENUMERATED {true} OPTIONAL, -- Need OR + dmrs-WithOCC-Activated-r10 ENUMERATED {true} OPTIONAL -- Need OR +} + +PUSCH-ConfigDedicated-v1130 ::= SEQUENCE { + pusch-DMRS-r11 CHOICE { + release NULL, + setup SEQUENCE { + nPUSCH-Identity-r11 INTEGER (0..509), + nDMRS-CSH-Identity-r11 INTEGER (0..509) + } + } +} + +PUSCH-ConfigDedicated-v1250::= SEQUENCE { + uciOnPUSCH CHOICE { + release NULL, + setup SEQUENCE { + betaOffset-ACK-Index-SubframeSet2-r12 INTEGER (0..15), + betaOffset-RI-Index-SubframeSet2-r12 INTEGER (0..15), + betaOffset-CQI-Index-SubframeSet2-r12 INTEGER (0..15), + betaOffsetMC-r12 SEQUENCE { + betaOffset-ACK-Index-MC-SubframeSet2-r12 INTEGER (0..15), + betaOffset-RI-Index-MC-SubframeSet2-r12 INTEGER (0..15), + betaOffset-CQI-Index-MC-SubframeSet2-r12 INTEGER (0..15) + } OPTIONAL -- Need OR + } + } +} +PUSCH-ConfigDedicated-r13 ::= SEQUENCE { + betaOffset-ACK-Index-r13 INTEGER (0..15), + betaOffset2-ACK-Index-r13 INTEGER (0..15) OPTIONAL, -- Need OR + betaOffset-RI-Index-r13 INTEGER (0..15), + betaOffset-CQI-Index-r13 INTEGER (0..15), + betaOffsetMC-r13 SEQUENCE { + betaOffset-ACK-Index-MC-r13 INTEGER (0..15), + betaOffset2-ACK-Index-MC-r13 INTEGER (0..15) OPTIONAL, -- Need OR + betaOffset-RI-Index-MC-r13 INTEGER (0..15), + betaOffset-CQI-Index-MC-r13 INTEGER (0..15) + } OPTIONAL, -- Need OR + groupHoppingDisabled-r13 ENUMERATED {true} OPTIONAL, -- Need OR + dmrs-WithOCC-Activated-r13 ENUMERATED {true} OPTIONAL, -- Need OR + pusch-DMRS-r11 CHOICE { + release NULL, + setup SEQUENCE { + nPUSCH-Identity-r13 INTEGER (0..509), + nDMRS-CSH-Identity-r13 INTEGER (0..509) + } + } OPTIONAL, -- Need ON + uciOnPUSCH CHOICE { + release NULL, + setup SEQUENCE { + betaOffset-ACK-Index-SubframeSet2-r13 INTEGER (0..15), + betaOffset2-ACK-Index-SubframeSet2-r13 INTEGER (0..15) OPTIONAL, -- Need OR + betaOffset-RI-Index-SubframeSet2-r13 INTEGER (0..15), + betaOffset-CQI-Index-SubframeSet2-r13 INTEGER (0..15), + betaOffsetMC-r12 SEQUENCE { + betaOffset-ACK-Index-MC-SubframeSet2-r13 INTEGER (0..15), + betaOffset2-ACK-Index-MC-SubframeSet2-r13 INTEGER (0..15) OPTIONAL, -- Need OR + betaOffset-RI-Index-MC-SubframeSet2-r13 INTEGER (0..15), + betaOffset-CQI-Index-MC-SubframeSet2-r13 INTEGER (0..15) + } OPTIONAL -- Need OR + } + } OPTIONAL, -- Need ON + pusch-HoppingConfig-r13 ENUMERATED {on} OPTIONAL -- Need OR +} + +PUSCH-ConfigDedicated-v1430 ::= SEQUENCE { + ce-PUSCH-NB-MaxTBS-r14 ENUMERATED {on} OPTIONAL, -- Need OR + ce-PUSCH-MaxBandwidth-r14 ENUMERATED {bw5} OPTIONAL, -- Need OP + tdd-PUSCH-UpPTS-r14 TDD-PUSCH-UpPTS-r14 OPTIONAL, -- Need ON + ul-DMRS-IFDMA-r14 BOOLEAN, + enable256QAM-r14 Enable256QAM-r14 OPTIONAL -- Need ON +} + +PUSCH-ConfigDedicatedSCell-r10 ::= SEQUENCE { + groupHoppingDisabled-r10 ENUMERATED {true} OPTIONAL, -- Need OR + dmrs-WithOCC-Activated-r10 ENUMERATED {true} OPTIONAL -- Need OR +} + +PUSCH-ConfigDedicatedSCell-v1430 ::= SEQUENCE { + enable256QAM-r14 Enable256QAM-r14 OPTIONAL -- Need OR +} + +TDD-PUSCH-UpPTS-r14 ::= CHOICE { + release NULL, + setup SEQUENCE { + symPUSCH-UpPTS-r14 ENUMERATED {sym1, sym2, sym3, sym4, sym5, sym6} OPTIONAL, -- Need ON + dmrs-LessUpPTS-Config-r14 ENUMERATED {true} OPTIONAL -- Need OR + } +} + +Enable256QAM-r14 ::= CHOICE { + release NULL, + setup CHOICE { + tpc-SubframeSet-Configured-r14 SEQUENCE { + subframeSet1-DCI-Format0-r14 BOOLEAN, + subframeSet1-DCI-Format4-r14 BOOLEAN, + subframeSet2-DCI-Format0-r14 BOOLEAN, + subframeSet2-DCI-Format4-r14 BOOLEAN + }, + tpc-SubframeSet-NotConfigured-r14 SEQUENCE { + dci-Format0-r14 BOOLEAN, + dci-Format4-r14 BOOLEAN + } + } +} + +PUSCH-EnhancementsConfig-r14 ::= CHOICE { + release NULL, + setup SEQUENCE { + pusch-HoppingOffsetPUSCH-Enh-r14 INTEGER (1..100) OPTIONAL, -- Need ON + interval-ULHoppingPUSCH-Enh-r14 CHOICE { + interval-FDD-PUSCH-Enh-r14 ENUMERATED {int1, int2, int4, int8}, + interval-TDD-PUSCH-Enh-r14 ENUMERATED {int1, int5, int10, int20} + } OPTIONAL -- Need ON + } +} + +UL-ReferenceSignalsPUSCH ::= SEQUENCE { + groupHoppingEnabled BOOLEAN, + groupAssignmentPUSCH INTEGER (0..29), + sequenceHoppingEnabled BOOLEAN, + cyclicShift INTEGER (0..7) +} + + +RACH-ConfigCommon ::= SEQUENCE { + preambleInfo SEQUENCE { + numberOfRA-Preambles ENUMERATED { + n4, n8, n12, n16, n20, n24, n28, + n32, n36, n40, n44, n48, n52, n56, + n60, n64}, + preamblesGroupAConfig SEQUENCE { + sizeOfRA-PreamblesGroupA ENUMERATED { + n4, n8, n12, n16, n20, n24, n28, + n32, n36, n40, n44, n48, n52, n56, + n60}, + messageSizeGroupA ENUMERATED {b56, b144, b208, b256}, + messagePowerOffsetGroupB ENUMERATED { + minusinfinity, dB0, dB5, dB8, dB10, dB12, + dB15, dB18}, + ... + } OPTIONAL -- Need OP + }, + powerRampingParameters PowerRampingParameters, + ra-SupervisionInfo SEQUENCE { + preambleTransMax PreambleTransMax, + ra-ResponseWindowSize ENUMERATED { + sf2, sf3, sf4, sf5, sf6, sf7, + sf8, sf10}, + mac-ContentionResolutionTimer ENUMERATED { + sf8, sf16, sf24, sf32, sf40, sf48, + sf56, sf64} + }, + maxHARQ-Msg3Tx INTEGER (1..8), + ..., + [[ preambleTransMax-CE-r13 PreambleTransMax OPTIONAL, -- Need OR + rach-CE-LevelInfoList-r13 RACH-CE-LevelInfoList-r13 OPTIONAL -- Need OR + ]] +} + +RACH-ConfigCommon-v1250 ::= SEQUENCE { + txFailParams-r12 SEQUENCE { + connEstFailCount-r12 ENUMERATED {n1, n2, n3, n4}, + connEstFailOffsetValidity-r12 ENUMERATED {s30, s60, s120, s240, + s300, s420, s600, s900}, + connEstFailOffset-r12 INTEGER (0..15) OPTIONAL -- Need OP + } +} + +RACH-ConfigCommonSCell-r11 ::= SEQUENCE { + powerRampingParameters-r11 PowerRampingParameters, + ra-SupervisionInfo-r11 SEQUENCE { + preambleTransMax-r11 PreambleTransMax + }, + ... +} + +RACH-CE-LevelInfoList-r13 ::= SEQUENCE (SIZE (1..maxCE-Level-r13)) OF RACH-CE-LevelInfo-r13 + +RACH-CE-LevelInfo-r13 ::= SEQUENCE { + preambleMappingInfo-r13 SEQUENCE { + firstPreamble-r13 INTEGER(0..63), + lastPreamble-r13 INTEGER(0..63) + }, + ra-ResponseWindowSize-r13 ENUMERATED {sf20, sf50, sf80, sf120, sf180, + sf240, sf320, sf400}, + + mac-ContentionResolutionTimer-r13 ENUMERATED {sf80, sf100, sf120, + sf160, sf200, sf240, sf480, sf960}, + rar-HoppingConfig-r13 ENUMERATED {on,off}, + ... +} + +PowerRampingParameters ::= SEQUENCE { + powerRampingStep ENUMERATED {dB0, dB2,dB4, dB6}, + preambleInitialReceivedTargetPower ENUMERATED { + dBm-120, dBm-118, dBm-116, dBm-114, dBm-112, + dBm-110, dBm-108, dBm-106, dBm-104, dBm-102, + dBm-100, dBm-98, dBm-96, dBm-94, + dBm-92, dBm-90} +} + +PreambleTransMax ::= ENUMERATED { + n3, n4, n5, n6, n7, n8, n10, n20, n50, + n100, n200} + + +RACH-ConfigDedicated ::= SEQUENCE { + ra-PreambleIndex INTEGER (0..63), + ra-PRACH-MaskIndex INTEGER (0..15) +} + + +RadioResourceConfigCommonSIB ::= SEQUENCE { + rach-ConfigCommon RACH-ConfigCommon, + bcch-Config BCCH-Config, + pcch-Config PCCH-Config, + prach-Config PRACH-ConfigSIB, + pdsch-ConfigCommon PDSCH-ConfigCommon, + pusch-ConfigCommon PUSCH-ConfigCommon, + pucch-ConfigCommon PUCCH-ConfigCommon, + soundingRS-UL-ConfigCommon SoundingRS-UL-ConfigCommon, + uplinkPowerControlCommon UplinkPowerControlCommon, + ul-CyclicPrefixLength UL-CyclicPrefixLength, + ..., + [[ uplinkPowerControlCommon-v1020 UplinkPowerControlCommon-v1020 OPTIONAL -- Need OR + ]], + [[ rach-ConfigCommon-v1250 RACH-ConfigCommon-v1250 OPTIONAL -- Need OR + ]], + [[ pusch-ConfigCommon-v1270 PUSCH-ConfigCommon-v1270 OPTIONAL -- Need OR + ]], + [[ bcch-Config-v1310 BCCH-Config-v1310 OPTIONAL, -- Need OR + pcch-Config-v1310 PCCH-Config-v1310 OPTIONAL, -- Need OR + freqHoppingParameters-r13 FreqHoppingParameters-r13 OPTIONAL, -- Need OR + pdsch-ConfigCommon-v1310 PDSCH-ConfigCommon-v1310 OPTIONAL, -- Need OR + pusch-ConfigCommon-v1310 PUSCH-ConfigCommon-v1310 OPTIONAL, -- Need OR + prach-ConfigCommon-v1310 PRACH-ConfigSIB-v1310 OPTIONAL, -- Need OR + pucch-ConfigCommon-v1310 PUCCH-ConfigCommon-v1310 OPTIONAL -- Need OR + ]], + [[ highSpeedConfig-r14 HighSpeedConfig-r14 OPTIONAL, -- Need OR + prach-Config-v1430 PRACH-Config-v1430 OPTIONAL, -- Need OR + pucch-ConfigCommon-v1430 PUCCH-ConfigCommon-v1430 OPTIONAL -- Need OR + ]] +} + +RadioResourceConfigCommon ::= SEQUENCE { + rach-ConfigCommon RACH-ConfigCommon OPTIONAL, -- Need ON + prach-Config PRACH-Config, + pdsch-ConfigCommon PDSCH-ConfigCommon OPTIONAL, -- Need ON + pusch-ConfigCommon PUSCH-ConfigCommon, + phich-Config PHICH-Config OPTIONAL, -- Need ON + pucch-ConfigCommon PUCCH-ConfigCommon OPTIONAL, -- Need ON + soundingRS-UL-ConfigCommon SoundingRS-UL-ConfigCommon OPTIONAL, -- Need ON + uplinkPowerControlCommon UplinkPowerControlCommon OPTIONAL, -- Need ON + antennaInfoCommon AntennaInfoCommon OPTIONAL, -- Need ON + p-Max P-Max OPTIONAL, -- Need OP + tdd-Config TDD-Config OPTIONAL, -- Cond TDD + ul-CyclicPrefixLength UL-CyclicPrefixLength, + ..., + [[ uplinkPowerControlCommon-v1020 UplinkPowerControlCommon-v1020 OPTIONAL -- Need ON + ]], + [[ tdd-Config-v1130 TDD-Config-v1130 OPTIONAL -- Cond TDD3 + ]], + [[ pusch-ConfigCommon-v1270 PUSCH-ConfigCommon-v1270 OPTIONAL -- Need OR + ]], + [[ + prach-Config-v1310 PRACH-Config-v1310 OPTIONAL, -- Need ON + freqHoppingParameters-r13 FreqHoppingParameters-r13 OPTIONAL, -- Need ON + pdsch-ConfigCommon-v1310 PDSCH-ConfigCommon-v1310 OPTIONAL, -- Need ON + pucch-ConfigCommon-v1310 PUCCH-ConfigCommon-v1310 OPTIONAL, -- Need ON + pusch-ConfigCommon-v1310 PUSCH-ConfigCommon-v1310 OPTIONAL, -- Need ON + uplinkPowerControlCommon-v1310 UplinkPowerControlCommon-v1310 OPTIONAL -- Need ON + ]], + [[ highSpeedConfig-r14 HighSpeedConfig-r14 OPTIONAL, -- Need OR + prach-Config-v1430 PRACH-Config-v1430 OPTIONAL, -- Need OR + pucch-ConfigCommon-v1430 PUCCH-ConfigCommon-v1430 OPTIONAL, -- Need OR + tdd-Config-v1430 TDD-Config-v1430 OPTIONAL -- Cond TDD3 + ]] +} + +RadioResourceConfigCommonPSCell-r12 ::= SEQUENCE { + basicFields-r12 RadioResourceConfigCommonSCell-r10, + pucch-ConfigCommon-r12 PUCCH-ConfigCommon, + rach-ConfigCommon-r12 RACH-ConfigCommon, + uplinkPowerControlCommonPSCell-r12 UplinkPowerControlCommonPSCell-r12, + ..., + [[ uplinkPowerControlCommonPSCell-v1310 + UplinkPowerControlCommon-v1310 OPTIONAL -- Need ON + ]] +} + +RadioResourceConfigCommonSCell-r10 ::= SEQUENCE { + -- DL configuration as well as configuration applicable for DL and UL + nonUL-Configuration-r10 SEQUENCE { + -- 1: Cell characteristics + dl-Bandwidth-r10 ENUMERATED {n6, n15, n25, n50, n75, n100}, + -- 2: Physical configuration, general + antennaInfoCommon-r10 AntennaInfoCommon, + mbsfn-SubframeConfigList-r10 MBSFN-SubframeConfigList OPTIONAL, -- Need OR + -- 3: Physical configuration, control + phich-Config-r10 PHICH-Config, + -- 4: Physical configuration, physical channels + pdsch-ConfigCommon-r10 PDSCH-ConfigCommon, + tdd-Config-r10 TDD-Config OPTIONAL -- Cond TDDSCell + }, + -- UL configuration + ul-Configuration-r10 SEQUENCE { + ul-FreqInfo-r10 SEQUENCE { + ul-CarrierFreq-r10 ARFCN-ValueEUTRA OPTIONAL, -- Need OP + ul-Bandwidth-r10 ENUMERATED {n6, n15, + n25, n50, n75, n100} OPTIONAL, -- Need OP + additionalSpectrumEmissionSCell-r10 AdditionalSpectrumEmission + }, + p-Max-r10 P-Max OPTIONAL, -- Need OP + uplinkPowerControlCommonSCell-r10 UplinkPowerControlCommonSCell-r10, + -- A special version of IE UplinkPowerControlCommon may be introduced + -- 3: Physical configuration, control + soundingRS-UL-ConfigCommon-r10 SoundingRS-UL-ConfigCommon, + ul-CyclicPrefixLength-r10 UL-CyclicPrefixLength, + -- 4: Physical configuration, physical channels + prach-ConfigSCell-r10 PRACH-ConfigSCell-r10 OPTIONAL, -- Cond TDD-OR-NoR11 + pusch-ConfigCommon-r10 PUSCH-ConfigCommon + } OPTIONAL, -- Need OR + ..., + [[ ul-CarrierFreq-v1090 ARFCN-ValueEUTRA-v9e0 OPTIONAL -- Need OP + ]], + [[ rach-ConfigCommonSCell-r11 RACH-ConfigCommonSCell-r11 OPTIONAL, -- Cond ULSCell + prach-ConfigSCell-r11 PRACH-Config OPTIONAL, -- Cond UL + tdd-Config-v1130 TDD-Config-v1130 OPTIONAL, -- Cond TDD2 + uplinkPowerControlCommonSCell-v1130 + UplinkPowerControlCommonSCell-v1130 OPTIONAL -- Cond UL + ]], + [[ pusch-ConfigCommon-v1270 PUSCH-ConfigCommon-v1270 OPTIONAL -- Need OR + ]], + [[ pucch-ConfigCommon-r13 PUCCH-ConfigCommon OPTIONAL, -- Cond UL + uplinkPowerControlCommonSCell-v1310 + UplinkPowerControlCommonSCell-v1310 OPTIONAL -- Cond UL + ]], + [[ highSpeedConfigSCell-r14 HighSpeedConfigSCell-r14 OPTIONAL, -- Need OR + prach-Config-v1430 PRACH-Config-v1430 OPTIONAL, -- Cond UL + ul-Configuration-r14 SEQUENCE { + ul-FreqInfo-r14 SEQUENCE { + ul-CarrierFreq-r14 ARFCN-ValueEUTRA-r9 OPTIONAL, -- Need OP + ul-Bandwidth-r14 ENUMERATED {n6, n15, + n25, n50, n75, n100} OPTIONAL, -- Need OP + additionalSpectrumEmissionSCell-r14 AdditionalSpectrumEmission + }, + p-Max-r14 P-Max OPTIONAL, -- Need OP + soundingRS-UL-ConfigCommon-r14 SoundingRS-UL-ConfigCommon, + ul-CyclicPrefixLength-r14 UL-CyclicPrefixLength, + prach-ConfigSCell-r14 PRACH-ConfigSCell-r10 OPTIONAL, -- Cond TDD-OR-NoR11 + uplinkPowerControlCommonPUSCH-LessCell-v1430 UplinkPowerControlCommonPUSCH-LessCell-v1430 OPTIONAL -- Need OR +} OPTIONAL, -- Cond ULSRS + harq-ReferenceConfig-r14 ENUMERATED {sa2,sa4,sa5} OPTIONAL, -- Need OR + soundingRS-FlexibleTiming-r14 ENUMERATED {true} OPTIONAL -- Need OR + ]], + [[ mbsfn-SubframeConfigList-v1430 MBSFN-SubframeConfigList-v1430 OPTIONAL-- Need ON + ]] +} + +BCCH-Config ::= SEQUENCE { + modificationPeriodCoeff ENUMERATED {n2, n4, n8, n16} +} + +BCCH-Config-v1310 ::= SEQUENCE { + modificationPeriodCoeff-v1310 ENUMERATED {n64} +} + +FreqHoppingParameters-r13 ::= SEQUENCE { + mpdcch-pdsch-HoppingNB-r13 ENUMERATED {nb2, nb4} OPTIONAL, -- Cond HO + interval-DLHoppingConfigCommonModeA-r13 CHOICE { + interval-FDD-r13 ENUMERATED {int1, int2, int4, int8}, + interval-TDD-r13 ENUMERATED {int1, int5, int10, int20} + } OPTIONAL, -- Cond HO + interval-DLHoppingConfigCommonModeB-r13 CHOICE { + interval-FDD-r13 ENUMERATED {int2, int4, int8, int16}, + interval-TDD-r13 ENUMERATED { int5, int10, int20, int40} + } OPTIONAL, -- Cond HO + interval-ULHoppingConfigCommonModeA-r13 CHOICE { + interval-FDD-r13 ENUMERATED {int1, int2, int4, int8}, + interval-TDD-r13 ENUMERATED {int1, int5, int10, int20} + } OPTIONAL, -- Cond MP-A + interval-ULHoppingConfigCommonModeB-r13 CHOICE { + interval-FDD-r13 ENUMERATED {int2, int4, int8, int16}, + interval-TDD-r13 ENUMERATED { int5, int10, int20, int40} + } OPTIONAL, -- Cond MP-B + mpdcch-pdsch-HoppingOffset-r13 INTEGER (1..maxAvailNarrowBands-r13) + OPTIONAL -- Cond HO +} + +PCCH-Config ::= SEQUENCE { + defaultPagingCycle ENUMERATED { + rf32, rf64, rf128, rf256}, + nB ENUMERATED { + fourT, twoT, oneT, halfT, quarterT, oneEighthT, + oneSixteenthT, oneThirtySecondT} +} + +PCCH-Config-v1310 ::= SEQUENCE { + paging-narrowBands-r13 INTEGER (1..maxAvailNarrowBands-r13), + mpdcch-NumRepetition-Paging-r13 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, r128, r256}, + nB-v1310 ENUMERATED {one64thT, one128thT, one256thT} + OPTIONAL -- Need OR +} + +UL-CyclicPrefixLength ::= ENUMERATED {len1, len2} + +HighSpeedConfig-r14 ::= SEQUENCE { + highSpeedEnhancedMeasFlag-r14 ENUMERATED {true} OPTIONAL, -- Need OR + highSpeedEnhancedDemodulationFlag-r14 ENUMERATED {true} OPTIONAL -- Need OR +} + +HighSpeedConfigSCell-r14 ::= SEQUENCE { + highSpeedEnhancedDemodulationFlag-r14 ENUMERATED {true} OPTIONAL -- Need OR +} + + +RadioResourceConfigDedicated ::= SEQUENCE { + srb-ToAddModList SRB-ToAddModList OPTIONAL, -- Cond HO-Conn + drb-ToAddModList DRB-ToAddModList OPTIONAL, -- Cond HO-toEUTRA + drb-ToReleaseList DRB-ToReleaseList OPTIONAL, -- Need ON + mac-MainConfig CHOICE { + explicitValue MAC-MainConfig, + defaultValue NULL + } OPTIONAL, -- Cond HO-toEUTRA2 + sps-Config SPS-Config OPTIONAL, -- Need ON + physicalConfigDedicated PhysicalConfigDedicated OPTIONAL, -- Need ON + ..., + [[ rlf-TimersAndConstants-r9 RLF-TimersAndConstants-r9 OPTIONAL -- Need ON + ]], + [[ measSubframePatternPCell-r10 MeasSubframePatternPCell-r10 OPTIONAL -- Need ON + ]], + [[ neighCellsCRS-Info-r11 NeighCellsCRS-Info-r11 OPTIONAL -- Need ON + ]], + [[ naics-Info-r12 NAICS-AssistanceInfo-r12 OPTIONAL -- Need ON + ]], + [[ neighCellsCRS-Info-r13 NeighCellsCRS-Info-r13 OPTIONAL, -- Cond CRSIM + rlf-TimersAndConstants-r13 RLF-TimersAndConstants-r13 OPTIONAL -- Need ON + ]], + [[ sps-Config-v1430 SPS-Config-v1430 OPTIONAL -- Cond SPS + ]] +} + +RadioResourceConfigDedicatedPSCell-r12 ::= SEQUENCE { + -- UE specific configuration extensions applicable for an PSCell + physicalConfigDedicatedPSCell-r12 PhysicalConfigDedicated OPTIONAL, -- Need ON + sps-Config-r12 SPS-Config OPTIONAL, -- Need ON + naics-Info-r12 NAICS-AssistanceInfo-r12 OPTIONAL, -- Need ON + ..., + [[ neighCellsCRS-InfoPSCell-r13 NeighCellsCRS-Info-r13 OPTIONAL -- Need ON + ]], + [[ sps-Config-v1430 SPS-Config-v1430 OPTIONAL -- Cond SPS2 + ]] +} + +RadioResourceConfigDedicatedSCG-r12 ::= SEQUENCE { + drb-ToAddModListSCG-r12 DRB-ToAddModListSCG-r12 OPTIONAL, -- Need ON + mac-MainConfigSCG-r12 MAC-MainConfig OPTIONAL, -- Need ON + rlf-TimersAndConstantsSCG-r12 RLF-TimersAndConstantsSCG-r12 OPTIONAL, -- Need ON + ... +} + +RadioResourceConfigDedicatedSCell-r10 ::= SEQUENCE { + -- UE specific configuration extensions applicable for an SCell + physicalConfigDedicatedSCell-r10 PhysicalConfigDedicatedSCell-r10 OPTIONAL, -- Need ON + ..., + [[ mac-MainConfigSCell-r11 MAC-MainConfigSCell-r11 OPTIONAL -- Cond SCellAdd + ]], + [[ naics-Info-r12 NAICS-AssistanceInfo-r12 OPTIONAL -- Need ON + ]], + [[ neighCellsCRS-InfoSCell-r13 NeighCellsCRS-Info-r13 OPTIONAL -- Need ON + ]] +} + +SRB-ToAddModList ::= SEQUENCE (SIZE (1..2)) OF SRB-ToAddMod + +SRB-ToAddMod ::= SEQUENCE { + srb-Identity INTEGER (1..2), + rlc-Config CHOICE { + explicitValue RLC-Config, + defaultValue NULL + } OPTIONAL, -- Cond Setup + logicalChannelConfig CHOICE { + explicitValue LogicalChannelConfig, + defaultValue NULL + } OPTIONAL, -- Cond Setup + ... +} + +DRB-ToAddModList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-ToAddMod + +DRB-ToAddModListSCG-r12 ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-ToAddModSCG-r12 + +DRB-ToAddMod ::= SEQUENCE { + eps-BearerIdentity INTEGER (0..15) OPTIONAL, -- Cond DRB-Setup + drb-Identity DRB-Identity, + pdcp-Config PDCP-Config OPTIONAL, -- Cond PDCP + rlc-Config RLC-Config OPTIONAL, -- Cond SetupM + logicalChannelIdentity INTEGER (3..10) OPTIONAL, -- Cond DRB-SetupM + logicalChannelConfig LogicalChannelConfig OPTIONAL, -- Cond SetupM + ..., + [[ drb-TypeChange-r12 ENUMERATED {toMCG} OPTIONAL, -- Need OP + rlc-Config-v1250 RLC-Config-v1250 OPTIONAL -- Need ON + ]], + [[ rlc-Config-v1310 RLC-Config-v1310 OPTIONAL, -- Need ON + drb-TypeLWA-r13 BOOLEAN OPTIONAL, -- Need ON + drb-TypeLWIP-r13 ENUMERATED {lwip, lwip-DL-only, + lwip-UL-only, eutran} OPTIONAL -- Need ON + ]], + [[ rlc-Config-v1430 RLC-Config-v1430 OPTIONAL, -- Need ON + lwip-UL-Aggregation-r14 BOOLEAN OPTIONAL, -- Cond LWIP + lwip-DL-Aggregation-r14 BOOLEAN OPTIONAL, -- Cond LWIP + lwa-WLAN-AC-r14 ENUMERATED {ac-bk, ac-be, ac-vi, ac-vo} OPTIONAL -- Cond UL-LWA + ]] +} + +DRB-ToAddModSCG-r12 ::= SEQUENCE { + drb-Identity-r12 DRB-Identity, + drb-Type-r12 CHOICE { + split-r12 NULL, + scg-r12 SEQUENCE { + eps-BearerIdentity-r12 INTEGER (0..15) OPTIONAL, -- Cond DRB-Setup + pdcp-Config-r12 PDCP-Config OPTIONAL -- Cond PDCP-S + } + } OPTIONAL, -- Cond SetupS2 + rlc-ConfigSCG-r12 RLC-Config OPTIONAL, -- Cond SetupS + rlc-Config-v1250 RLC-Config-v1250 OPTIONAL, -- Need ON + logicalChannelIdentitySCG-r12 INTEGER (3..10) OPTIONAL, -- Cond DRB-SetupS + logicalChannelConfigSCG-r12 LogicalChannelConfig OPTIONAL, -- Cond SetupS + ..., + [[ rlc-Config-v1430 RLC-Config-v1430 OPTIONAL -- Need ON + ]] +} + +DRB-ToReleaseList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-Identity + +MeasSubframePatternPCell-r10 ::= CHOICE { + release NULL, + setup MeasSubframePattern-r10 +} + +NeighCellsCRS-Info-r11 ::= CHOICE { + release NULL, + setup CRS-AssistanceInfoList-r11 +} + +CRS-AssistanceInfoList-r11 ::= SEQUENCE (SIZE (1..maxCellReport)) OF CRS-AssistanceInfo-r11 + +CRS-AssistanceInfo-r11 ::= SEQUENCE { + physCellId-r11 PhysCellId, + antennaPortsCount-r11 ENUMERATED {an1, an2, an4, spare1}, + mbsfn-SubframeConfigList-r11 MBSFN-SubframeConfigList, + ..., + [[ mbsfn-SubframeConfigList-v1430 MBSFN-SubframeConfigList-v1430 OPTIONAL -- Need ON + ]] +} + +NeighCellsCRS-Info-r13 ::= CHOICE { + release NULL, + setup CRS-AssistanceInfoList-r13 +} + +CRS-AssistanceInfoList-r13 ::= SEQUENCE (SIZE (1..maxCellReport)) OF CRS-AssistanceInfo-r13 + +CRS-AssistanceInfo-r13 ::= SEQUENCE { + physCellId-r13 PhysCellId, + antennaPortsCount-r13 ENUMERATED {an1, an2, an4, spare1}, + mbsfn-SubframeConfigList-r13 MBSFN-SubframeConfigList OPTIONAL, -- Need ON + ..., + [[ mbsfn-SubframeConfigList-v1430 MBSFN-SubframeConfigList-v1430 OPTIONAL -- Need ON + ]] +} + +NAICS-AssistanceInfo-r12 ::= CHOICE { + release NULL, + setup SEQUENCE { + neighCellsToReleaseList-r12 NeighCellsToReleaseList-r12 OPTIONAL , -- Need ON + neighCellsToAddModList-r12 NeighCellsToAddModList-r12 OPTIONAL, -- Need ON + servCellp-a-r12 P-a OPTIONAL -- Need ON + } +} + +NeighCellsToReleaseList-r12 ::= SEQUENCE (SIZE (1..maxNeighCell-r12)) OF PhysCellId + +NeighCellsToAddModList-r12 ::= SEQUENCE (SIZE (1..maxNeighCell-r12)) OF NeighCellsInfo-r12 + +NeighCellsInfo-r12 ::= SEQUENCE { + physCellId-r12 PhysCellId, + p-b-r12 INTEGER (0..3), + crs-PortsCount-r12 ENUMERATED {n1, n2, n4, spare}, + mbsfn-SubframeConfig-r12 MBSFN-SubframeConfigList OPTIONAL, -- Need ON + p-aList-r12 SEQUENCE (SIZE (1..maxP-a-PerNeighCell-r12)) OF P-a, + transmissionModeList-r12 BIT STRING (SIZE(8)), + resAllocGranularity-r12 INTEGER (1..4), + ... +} +P-a ::= ENUMERATED { dB-6, dB-4dot77, dB-3, dB-1dot77, + dB0, dB1, dB2, dB3} + + +RCLWI-Configuration-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + rclwi-Config-r13 RCLWI-Config-r13 + } +} + +RCLWI-Config-r13 ::= SEQUENCE { + command CHOICE { + steerToWLAN-r13 SEQUENCE { + mobilityConfig-r13 WLAN-Id-List-r12 + }, + steerToLTE-r13 NULL + }, + ... +} + + +RLC-Config ::= CHOICE { + am SEQUENCE { + ul-AM-RLC UL-AM-RLC, + dl-AM-RLC DL-AM-RLC + }, + um-Bi-Directional SEQUENCE { + ul-UM-RLC UL-UM-RLC, + dl-UM-RLC DL-UM-RLC + }, + um-Uni-Directional-UL SEQUENCE { + ul-UM-RLC UL-UM-RLC + }, + um-Uni-Directional-DL SEQUENCE { + dl-UM-RLC DL-UM-RLC + }, + ... +} + +RLC-Config-v1250 ::= SEQUENCE { + ul-extended-RLC-LI-Field-r12 BOOLEAN, + dl-extended-RLC-LI-Field-r12 BOOLEAN +} + +RLC-Config-v1310 ::= SEQUENCE { + ul-extended-RLC-AM-SN-r13 BOOLEAN, + dl-extended-RLC-AM-SN-r13 BOOLEAN, + pollPDU-v1310 PollPDU-v1310 OPTIONAL -- Need OR +} + +RLC-Config-v1430 ::= CHOICE { + release NULL, + setup SEQUENCE { + pollByte-r14 PollByte-r14 + } +} + +UL-AM-RLC ::= SEQUENCE { + t-PollRetransmit T-PollRetransmit, + pollPDU PollPDU, + pollByte PollByte, + maxRetxThreshold ENUMERATED { + t1, t2, t3, t4, t6, t8, t16, t32} +} + +DL-AM-RLC ::= SEQUENCE { + t-Reordering T-Reordering, + t-StatusProhibit T-StatusProhibit +} + +UL-UM-RLC ::= SEQUENCE { + sn-FieldLength SN-FieldLength +} + +DL-UM-RLC ::= SEQUENCE { + sn-FieldLength SN-FieldLength, + t-Reordering T-Reordering +} + +SN-FieldLength ::= ENUMERATED {size5, size10} + +T-PollRetransmit ::= ENUMERATED { + ms5, ms10, ms15, ms20, ms25, ms30, ms35, + ms40, ms45, ms50, ms55, ms60, ms65, ms70, + ms75, ms80, ms85, ms90, ms95, ms100, ms105, + ms110, ms115, ms120, ms125, ms130, ms135, + ms140, ms145, ms150, ms155, ms160, ms165, + ms170, ms175, ms180, ms185, ms190, ms195, + ms200, ms205, ms210, ms215, ms220, ms225, + ms230, ms235, ms240, ms245, ms250, ms300, + ms350, ms400, ms450, ms500, ms800-v1310, + ms1000-v1310, ms2000-v1310, ms4000-v1310, + spare5, spare4, spare3, spare2, spare1} + +PollPDU ::= ENUMERATED { + p4, p8, p16, p32, p64, p128, p256, pInfinity} + +PollPDU-v1310 ::= ENUMERATED { + p512, p1024, p2048, p4096, p6144, p8192, p12288, p16384} + +PollByte ::= ENUMERATED { + kB25, kB50, kB75, kB100, kB125, kB250, kB375, + kB500, kB750, kB1000, kB1250, kB1500, kB2000, + kB3000, kBinfinity, spare1} + +PollByte-r14 ::= ENUMERATED { + kB1, kB2, kB5, kB8, kB10, kB15, kB3500, + kB4000, kB4500, kB5000, kB5500, kB6000, kB6500, + kB7000, kB7500, kB8000, kB9000, kB10000, kB11000, kB12000, + kB13000, kB14000, kB15000, kB16000, kB17000, kB18000, + kB19000, kB20000, kB25000, kB30000, kB35000, kB40000} + +T-Reordering ::= ENUMERATED { + ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35, + ms40, ms45, ms50, ms55, ms60, ms65, ms70, + ms75, ms80, ms85, ms90, ms95, ms100, ms110, + ms120, ms130, ms140, ms150, ms160, ms170, + ms180, ms190, ms200, ms1600-v1310} + +T-StatusProhibit ::= ENUMERATED { + ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35, + ms40, ms45, ms50, ms55, ms60, ms65, ms70, + ms75, ms80, ms85, ms90, ms95, ms100, ms105, + ms110, ms115, ms120, ms125, ms130, ms135, + ms140, ms145, ms150, ms155, ms160, ms165, + ms170, ms175, ms180, ms185, ms190, ms195, + ms200, ms205, ms210, ms215, ms220, ms225, + ms230, ms235, ms240, ms245, ms250, ms300, + ms350, ms400, ms450, ms500, ms800-v1310, + ms1000-v1310, ms1200-v1310, ms1600-v1310, ms2000-v1310, ms2400-v1310, spare2, + spare1} + + +RLF-TimersAndConstants-r9 ::= CHOICE { + release NULL, + setup SEQUENCE { + t301-r9 ENUMERATED { + ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, + ms2000}, + t310-r9 ENUMERATED { + ms0, ms50, ms100, ms200, ms500, ms1000, ms2000}, + n310-r9 ENUMERATED { + n1, n2, n3, n4, n6, n8, n10, n20}, + t311-r9 ENUMERATED { + ms1000, ms3000, ms5000, ms10000, ms15000, + ms20000, ms30000}, + n311-r9 ENUMERATED { + n1, n2, n3, n4, n5, n6, n8, n10}, + ... + } +} + +RLF-TimersAndConstants-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + t301-v1310 ENUMERATED { + ms2500, ms3000, ms3500, ms4000, ms5000, + ms6000, ms8000, ms10000}, + ..., + [[ t310-v1330 ENUMERATED {ms4000, ms6000} OPTIONAL -- Need ON + ]] + } +} + +RLF-TimersAndConstantsSCG-r12 ::= CHOICE { + release NULL, + setup SEQUENCE { + t313-r12 ENUMERATED { + ms0, ms50, ms100, ms200, ms500, ms1000, ms2000}, + n313-r12 ENUMERATED { + n1, n2, n3, n4, n6, n8, n10, n20}, + n314-r12 ENUMERATED { + n1, n2, n3, n4, n5, n6, n8, n10}, + ... + } +} + + +RN-SubframeConfig-r10 ::= SEQUENCE { + subframeConfigPattern-r10 CHOICE { + subframeConfigPatternFDD-r10 BIT STRING (SIZE(8)), + subframeConfigPatternTDD-r10 INTEGER (0..31) + } OPTIONAL, -- Need ON + rpdcch-Config-r10 SEQUENCE { + resourceAllocationType-r10 ENUMERATED {type0, type1, type2Localized, type2Distributed, + spare4, spare3, spare2, spare1}, + resourceBlockAssignment-r10 CHOICE { + type01-r10 CHOICE { + nrb6-r10 BIT STRING (SIZE(6)), + nrb15-r10 BIT STRING (SIZE(8)), + nrb25-r10 BIT STRING (SIZE(13)), + nrb50-r10 BIT STRING (SIZE(17)), + nrb75-r10 BIT STRING (SIZE(19)), + nrb100-r10 BIT STRING (SIZE(25)) + }, + type2-r10 CHOICE { + nrb6-r10 BIT STRING (SIZE(5)), + nrb15-r10 BIT STRING (SIZE(7)), + nrb25-r10 BIT STRING (SIZE(9)), + nrb50-r10 BIT STRING (SIZE(11)), + nrb75-r10 BIT STRING (SIZE(12)), + nrb100-r10 BIT STRING (SIZE(13)) + }, + ... + }, + demodulationRS-r10 CHOICE { + interleaving-r10 ENUMERATED {crs}, + noInterleaving-r10 ENUMERATED {crs, dmrs} + }, + pdsch-Start-r10 INTEGER (1..3), + pucch-Config-r10 CHOICE { + tdd CHOICE { + channelSelectionMultiplexingBundling SEQUENCE { + n1PUCCH-AN-List-r10 SEQUENCE (SIZE (1..4)) OF INTEGER (0..2047) + }, + fallbackForFormat3 SEQUENCE { + n1PUCCH-AN-P0-r10 INTEGER (0..2047), + n1PUCCH-AN-P1-r10 INTEGER (0..2047) OPTIONAL -- Need OR + } + }, + fdd SEQUENCE { + n1PUCCH-AN-P0-r10 INTEGER (0..2047), + n1PUCCH-AN-P1-r10 INTEGER (0..2047) OPTIONAL -- Need OR + } + }, + ... + } OPTIONAL, -- Need ON + ... +} + + +SchedulingRequestConfig ::= CHOICE { + release NULL, + setup SEQUENCE { + sr-PUCCH-ResourceIndex INTEGER (0..2047), + sr-ConfigIndex INTEGER (0..157), + dsr-TransMax ENUMERATED { + n4, n8, n16, n32, n64, spare3, spare2, spare1} + } +} + +SchedulingRequestConfig-v1020 ::= SEQUENCE { + sr-PUCCH-ResourceIndexP1-r10 INTEGER (0..2047) OPTIONAL -- Need OR +} + +SchedulingRequestConfigSCell-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + sr-PUCCH-ResourceIndex-r13 INTEGER (0..2047), + sr-PUCCH-ResourceIndexP1-r13 INTEGER (0..2047) OPTIONAL, -- Need OR + sr-ConfigIndex-r13 INTEGER (0..157), + dsr-TransMax-r13 ENUMERATED { + n4, n8, n16, n32, n64, spare3, spare2, spare1} + } + +} + + +SoundingRS-UL-ConfigCommon ::= CHOICE { + release NULL, + setup SEQUENCE { + srs-BandwidthConfig ENUMERATED {bw0, bw1, bw2, bw3, bw4, bw5, bw6, bw7}, + srs-SubframeConfig ENUMERATED { + sc0, sc1, sc2, sc3, sc4, sc5, sc6, sc7, + sc8, sc9, sc10, sc11, sc12, sc13, sc14, sc15}, + ackNackSRS-SimultaneousTransmission BOOLEAN, + srs-MaxUpPts ENUMERATED {true} OPTIONAL -- Cond TDD + } +} + +SoundingRS-UL-ConfigDedicated ::= CHOICE{ + release NULL, + setup SEQUENCE { + srs-Bandwidth ENUMERATED {bw0, bw1, bw2, bw3}, + srs-HoppingBandwidth ENUMERATED {hbw0, hbw1, hbw2, hbw3}, + freqDomainPosition INTEGER (0..23), + duration BOOLEAN, + srs-ConfigIndex INTEGER (0..1023), + transmissionComb INTEGER (0..1), + cyclicShift ENUMERATED {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7} + } +} + +SoundingRS-UL-ConfigDedicated-v1020 ::= SEQUENCE { + srs-AntennaPort-r10 SRS-AntennaPort +} + +SoundingRS-UL-ConfigDedicated-v1310 ::= CHOICE{ + release NULL, + setup SEQUENCE { + transmissionComb-v1310 INTEGER (2..3) OPTIONAL, -- Need OR + cyclicShift-v1310 ENUMERATED {cs8, cs9, cs10, cs11} OPTIONAL, -- Need OR + transmissionCombNum-r13 ENUMERATED {n2, n4} OPTIONAL -- Need OR + } +} + +SoundingRS-UL-ConfigDedicatedUpPTsExt-r13 ::= CHOICE{ + release NULL, + setup SEQUENCE { + srs-UpPtsAdd-r13 ENUMERATED {sym2, sym4}, + srs-Bandwidth-r13 ENUMERATED {bw0, bw1, bw2, bw3}, + srs-HoppingBandwidth-r13 ENUMERATED {hbw0, hbw1, hbw2, hbw3}, + freqDomainPosition-r13 INTEGER (0..23), + duration-r13 BOOLEAN, + srs-ConfigIndex-r13 INTEGER (0..1023), + transmissionComb-r13 INTEGER (0..3), + cyclicShift-r13 ENUMERATED {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, + cs8, cs9, cs10, cs11}, + srs-AntennaPort-r13 SRS-AntennaPort, + transmissionCombNum-r13 ENUMERATED {n2, n4} + } +} + +SoundingRS-UL-ConfigDedicatedAperiodic-r10 ::= CHOICE{ + release NULL, + setup SEQUENCE { + srs-ConfigIndexAp-r10 INTEGER (0..31), + srs-ConfigApDCI-Format4-r10 SEQUENCE (SIZE (1..3)) OF SRS-ConfigAp-r10 OPTIONAL,--Need ON + srs-ActivateAp-r10 CHOICE { + release NULL, + setup SEQUENCE { + srs-ConfigApDCI-Format0-r10 SRS-ConfigAp-r10, + srs-ConfigApDCI-Format1a2b2c-r10 SRS-ConfigAp-r10, + ... + } + } OPTIONAL -- Need ON + } +} + +SoundingRS-UL-ConfigDedicatedAperiodic-v1310 ::= CHOICE{ + release NULL, + setup SEQUENCE { + srs-ConfigApDCI-Format4-v1310 SEQUENCE (SIZE (1..3)) OF SRS-ConfigAp-v1310 OPTIONAL,--Need ON + srs-ActivateAp-v1310 CHOICE { + release NULL, + setup SEQUENCE { + srs-ConfigApDCI-Format0-v1310 SRS-ConfigAp-v1310 OPTIONAL, -- Need ON + srs-ConfigApDCI-Format1a2b2c-v1310 SRS-ConfigAp-v1310 OPTIONAL -- Need ON + } + } OPTIONAL -- Need ON + } +} + +SoundingRS-UL-ConfigDedicatedAperiodicUpPTsExt-r13 ::= CHOICE{ + release NULL, + setup SEQUENCE { + srs-UpPtsAdd-r13 ENUMERATED {sym2, sym4}, + srs-ConfigIndexAp-r13 INTEGER (0..31), + srs-ConfigApDCI-Format4-r13 SEQUENCE (SIZE (1..3)) OF SRS-ConfigAp-r13 OPTIONAL,--Need ON + srs-ActivateAp-r13 CHOICE { + release NULL, + setup SEQUENCE { + srs-ConfigApDCI-Format0-r13 SRS-ConfigAp-r13, + srs-ConfigApDCI-Format1a2b2c-r13 SRS-ConfigAp-r13 + } + } OPTIONAL -- Need ON + } +} + +SoundingRS-UL-ConfigDedicatedAperiodic-v1430 ::= CHOICE{ + release NULL, + setup SEQUENCE { + srs-SubframeIndication-r14 INTEGER (1..4) OPTIONAL -- Need ON + } +} + +SRS-ConfigAp-r10 ::= SEQUENCE { + srs-AntennaPortAp-r10 SRS-AntennaPort, + srs-BandwidthAp-r10 ENUMERATED {bw0, bw1, bw2, bw3}, + freqDomainPositionAp-r10 INTEGER (0..23), + transmissionCombAp-r10 INTEGER (0..1), + cyclicShiftAp-r10 ENUMERATED {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7} +} + +SRS-ConfigAp-v1310 ::= SEQUENCE { + transmissionCombAp-v1310 INTEGER (2..3) OPTIONAL, -- Need OR + cyclicShiftAp-v1310 ENUMERATED {cs8, cs9, cs10, cs11} OPTIONAL, -- Need OR + transmissionCombNum-r13 ENUMERATED {n2, n4} OPTIONAL -- Need OR +} + +SRS-ConfigAp-r13 ::= SEQUENCE { + srs-AntennaPortAp-r13 SRS-AntennaPort, + srs-BandwidthAp-r13 ENUMERATED {bw0, bw1, bw2, bw3}, + freqDomainPositionAp-r13 INTEGER (0..23), + transmissionCombAp-r13 INTEGER (0..3), + cyclicShiftAp-r13 ENUMERATED {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7, + cs8, cs9, cs10, cs11}, + transmissionCombNum-r13 ENUMERATED {n2, n4} +} + +SRS-AntennaPort ::= ENUMERATED {an1, an2, an4, spare1} + + +SPS-Config ::= SEQUENCE { + semiPersistSchedC-RNTI C-RNTI OPTIONAL, -- Need OR + sps-ConfigDL SPS-ConfigDL OPTIONAL, -- Need ON + sps-ConfigUL SPS-ConfigUL OPTIONAL -- Need ON +} + +SPS-Config-v1430 ::= SEQUENCE { + ul-SPS-V-RNTI-r14 C-RNTI OPTIONAL, -- Need OR + sl-SPS-V-RNTI-r14 C-RNTI OPTIONAL, -- Need OR + sps-ConfigUL-ToAddModList-r14 SPS-ConfigUL-ToAddModList-r14 OPTIONAL, -- Need ON + sps-ConfigUL-ToReleaseList-r14 SPS-ConfigUL-ToReleaseList-r14 OPTIONAL, -- Need ON + sps-ConfigSL-ToAddModList-r14 SPS-ConfigSL-ToAddModList-r14 OPTIONAL, -- Need ON + sps-ConfigSL-ToReleaseList-r14 SPS-ConfigSL-ToReleaseList-r14 OPTIONAL -- Need ON +} + +SPS-ConfigUL-ToAddModList-r14 ::= SEQUENCE (SIZE (1..maxConfigSPS-r14)) OF SPS-ConfigUL + +SPS-ConfigUL-ToReleaseList-r14 ::= SEQUENCE (SIZE (1..maxConfigSPS-r14)) OF SPS-ConfigIndex-r14 + +SPS-ConfigSL-ToAddModList-r14 ::= SEQUENCE (SIZE (1..maxConfigSPS-r14)) OF SPS-ConfigSL-r14 + +SPS-ConfigSL-ToReleaseList-r14 ::= SEQUENCE (SIZE (1..maxConfigSPS-r14)) OF SPS-ConfigIndex-r14 + +SPS-ConfigDL ::= CHOICE{ + release NULL, + setup SEQUENCE { + semiPersistSchedIntervalDL ENUMERATED { + sf10, sf20, sf32, sf40, sf64, sf80, + sf128, sf160, sf320, sf640, spare6, + spare5, spare4, spare3, spare2, + spare1}, + numberOfConfSPS-Processes INTEGER (1..8), + n1PUCCH-AN-PersistentList N1PUCCH-AN-PersistentList, + ..., + [[ twoAntennaPortActivated-r10 CHOICE { + release NULL, + setup SEQUENCE { + n1PUCCH-AN-PersistentListP1-r10 N1PUCCH-AN-PersistentList + } + } OPTIONAL -- Need ON + ]] + } +} + +SPS-ConfigUL ::= CHOICE { + release NULL, + setup SEQUENCE { + semiPersistSchedIntervalUL ENUMERATED { + sf10, sf20, sf32, sf40, sf64, sf80, + sf128, sf160, sf320, sf640, sf1-v1430, + sf2-v1430, sf3-v1430, sf4-v1430, sf5-v1430, + spare1}, + implicitReleaseAfter ENUMERATED {e2, e3, e4, e8}, + p0-Persistent SEQUENCE { + p0-NominalPUSCH-Persistent INTEGER (-126..24), + p0-UE-PUSCH-Persistent INTEGER (-8..7) + } OPTIONAL, -- Need OP + twoIntervalsConfig ENUMERATED {true} OPTIONAL, -- Cond TDD + ..., + [[ p0-PersistentSubframeSet2-r12 CHOICE { + release NULL, + setup SEQUENCE { + p0-NominalPUSCH-PersistentSubframeSet2-r12 INTEGER (-126..24), + p0-UE-PUSCH-PersistentSubframeSet2-r12 INTEGER (-8..7) + } + } OPTIONAL -- Need ON + ]], + [[ numberOfConfUlSPS-Processes-r13 INTEGER (1..8) OPTIONAL -- Need OR + ]], + [[ fixedRV-NonAdaptive-r14 ENUMERATED {true} OPTIONAL, -- Need OR + sps-ConfigIndex-r14 SPS-ConfigIndex-r14 OPTIONAL, -- Need OR + semiPersistSchedIntervalUL-v1430 ENUMERATED { + sf50, sf100, sf200, sf300, sf400, sf500, + sf600, sf700, sf800, sf900, sf1000, spare5, + spare4, spare3, spare2, spare1} OPTIONAL -- Need OR + + ]] + } +} + +SPS-ConfigSL-r14 ::= SEQUENCE { + sps-ConfigIndex-r14 SPS-ConfigIndex-r14, + semiPersistSchedIntervalSL-r14 ENUMERATED { + sf20, sf50, sf100, sf200, sf300, sf400, + sf500, sf600, sf700, sf800, sf900, sf1000, + spare4, spare3, spare2, spare1} +} + +SPS-ConfigIndex-r14 ::= INTEGER (1..maxConfigSPS-r14) + +N1PUCCH-AN-PersistentList ::= SEQUENCE (SIZE (1..4)) OF INTEGER (0..2047) + + +SRS-TPC-PDCCH-Config-r14 ::= CHOICE { + release NULL, + setup SEQUENCE { + srs-TPC-RNTI-r14 BIT STRING (SIZE (16)), + startingBitOfFormat3B-r14 INTEGER (0..31), fieldTypeFormat3B-r14 INTEGER (1..4), + srs-CC-SetIndexlist-r14 SEQUENCE (SIZE(1..4)) OF SRS-CC-SetIndex-r14 OPTIONAL -- Cond SRS-Trigger-TypeA + + } +} + +SRS-CC-SetIndex-r14 ::= SEQUENCE { + cc-SetIndex-r14 INTEGER (0..3), + cc-IndexInOneCC-Set-r14 INTEGER (0..7) +} + + +TDD-Config ::= SEQUENCE { + subframeAssignment ENUMERATED { + sa0, sa1, sa2, sa3, sa4, sa5, sa6}, + specialSubframePatterns ENUMERATED { + ssp0, ssp1, ssp2, ssp3, ssp4,ssp5, ssp6, ssp7, + ssp8} +} + +TDD-Config-v1130 ::= SEQUENCE { + specialSubframePatterns-v1130 ENUMERATED {ssp7,ssp9} +} + +TDD-Config-v1430 ::= SEQUENCE { + specialSubframePatterns-v1430 ENUMERATED {ssp10} +} + +TDD-ConfigSL-r12 ::= SEQUENCE { + subframeAssignmentSL-r12 ENUMERATED { + none, sa0, sa1, sa2, sa3, sa4, sa5, sa6} +} + + +TimeAlignmentTimer ::= ENUMERATED { + sf500, sf750, sf1280, sf1920, sf2560, sf5120, + sf10240, infinity} + +TPC-PDCCH-Config ::= CHOICE { + release NULL, + setup SEQUENCE { + tpc-RNTI BIT STRING (SIZE (16)), + tpc-Index TPC-Index + } +} + +TPC-PDCCH-ConfigSCell-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + tpc-Index-PUCCH-SCell-r13 TPC-Index + } +} + +TPC-Index ::= CHOICE { + indexOfFormat3 INTEGER (1..15), + indexOfFormat3A INTEGER (1..31) +} + + +TunnelConfigLWIP-r13 ::= SEQUENCE { + ip-Address-r13 IP-Address-r13, + ike-Identity-r13 IKE-Identity-r13, + ..., + [[ lwip-Counter-r13 INTEGER (0..65535) OPTIONAL -- Cond LWIP-Setup + ]] +} + +IKE-Identity-r13 ::= SEQUENCE { + idI-r13 OCTET STRING +} + +IP-Address-r13 ::= CHOICE { + ipv4-r13 BIT STRING (SIZE (32)), + ipv6-r13 BIT STRING (SIZE (128)) +} + + +UplinkPowerControlCommon ::= SEQUENCE { + p0-NominalPUSCH INTEGER (-126..24), + alpha Alpha-r12, + p0-NominalPUCCH INTEGER (-127..-96), + deltaFList-PUCCH DeltaFList-PUCCH, + deltaPreambleMsg3 INTEGER (-1..6) +} + +UplinkPowerControlCommon-v1020 ::= SEQUENCE { + deltaF-PUCCH-Format3-r10 ENUMERATED {deltaF-1, deltaF0, deltaF1, deltaF2, + deltaF3, deltaF4, deltaF5, deltaF6}, + deltaF-PUCCH-Format1bCS-r10 ENUMERATED {deltaF1, deltaF2, spare2, spare1} +} + +UplinkPowerControlCommon-v1310 ::= SEQUENCE { + deltaF-PUCCH-Format4-r13 ENUMERATED {deltaF16, deltaF15, deltaF14,deltaF13, deltaF12, + deltaF11, deltaF10, spare1} OPTIONAL, -- Need OR + deltaF-PUCCH-Format5-13 ENUMERATED { deltaF13, deltaF12, deltaF11, deltaF10, deltaF9, + deltaF8, deltaF7, spare1} OPTIONAL -- Need OR +} + +UplinkPowerControlCommonPSCell-r12 ::= SEQUENCE { +-- For uplink power control the additional/ missing fields are signalled (compared to SCell) + deltaF-PUCCH-Format3-r12 ENUMERATED {deltaF-1, deltaF0, deltaF1, deltaF2, + deltaF3, deltaF4, deltaF5, deltaF6}, + deltaF-PUCCH-Format1bCS-r12 ENUMERATED {deltaF1, deltaF2, spare2, spare1}, + p0-NominalPUCCH-r12 INTEGER (-127..-96), + deltaFList-PUCCH-r12 DeltaFList-PUCCH +} + + +UplinkPowerControlCommonSCell-r10 ::= SEQUENCE { + p0-NominalPUSCH-r10 INTEGER (-126..24), + alpha-r10 Alpha-r12 +} + +UplinkPowerControlCommonSCell-v1130 ::= SEQUENCE { + deltaPreambleMsg3-r11 INTEGER (-1..6) +} + +UplinkPowerControlCommonSCell-v1310 ::= SEQUENCE { +-- For uplink power control the additional/ missing fields are signalled (compared to SCell) + p0-NominalPUCCH INTEGER (-127..-96), + deltaFList-PUCCH DeltaFList-PUCCH, + deltaF-PUCCH-Format3-r12 ENUMERATED {deltaF-1, deltaF0, deltaF1, + deltaF2, deltaF3, deltaF4, deltaF5, + deltaF6} OPTIONAL, -- Need OR + deltaF-PUCCH-Format1bCS-r12 ENUMERATED {deltaF1, deltaF2, + spare2, spare1} OPTIONAL, -- Need OR + deltaF-PUCCH-Format4-r13 ENUMERATED {deltaF16, deltaF15, deltaF14, + deltaF13, deltaF12, deltaF11, deltaF10, + spare1} OPTIONAL, -- Need OR + deltaF-PUCCH-Format5-13 ENUMERATED { deltaF13, deltaF12, deltaF11, + deltaF10, deltaF9, deltaF8, deltaF7, + spare1} OPTIONAL -- Need OR +} +UplinkPowerControlCommonPUSCH-LessCell-v1430 ::= SEQUENCE { + p0-Nominal-PeriodicSRS-r14 INTEGER (-126..24) OPTIONAL, -- Need OR + p0-Nominal-AperiodicSRS-r14 INTEGER (-126..24) OPTIONAL, -- Need OR + alpha-SRS-r14 Alpha-r12 OPTIONAL -- Need OR +} + +UplinkPowerControlDedicated ::= SEQUENCE { + p0-UE-PUSCH INTEGER (-8..7), + deltaMCS-Enabled ENUMERATED {en0, en1}, + accumulationEnabled BOOLEAN, + p0-UE-PUCCH INTEGER (-8..7), + pSRS-Offset INTEGER (0..15), + filterCoefficient FilterCoefficient DEFAULT fc4 +} + +UplinkPowerControlDedicated-v1020 ::= SEQUENCE { + deltaTxD-OffsetListPUCCH-r10 DeltaTxD-OffsetListPUCCH-r10 OPTIONAL, -- Need OR + pSRS-OffsetAp-r10 INTEGER (0..15) OPTIONAL -- Need OR +} + +UplinkPowerControlDedicated-v1130 ::= SEQUENCE { + pSRS-Offset-v1130 INTEGER (16..31) OPTIONAL, -- Need OR + pSRS-OffsetAp-v1130 INTEGER (16..31) OPTIONAL, -- Need OR + deltaTxD-OffsetListPUCCH-v1130 DeltaTxD-OffsetListPUCCH-v1130 OPTIONAL -- Need OR +} + +UplinkPowerControlDedicated-v1250 ::= SEQUENCE { + set2PowerControlParameter CHOICE { + release NULL, + setup SEQUENCE { + tpc-SubframeSet-r12 BIT STRING (SIZE(10)), + p0-NominalPUSCH-SubframeSet2-r12 INTEGER (-126..24), + alpha-SubframeSet2-r12 Alpha-r12, + p0-UE-PUSCH-SubframeSet2-r12 INTEGER (-8..7) + } + } +} + +UplinkPUSCH-LessPowerControlDedicated-v1430 ::= SEQUENCE { + p0-UE-PeriodicSRS-r14 INTEGER (-8..7) OPTIONAL, -- Need OR + p0-UE-AperiodicSRS-r14 INTEGER (-8..7) OPTIONAL, -- Need OR + accumulationEnabled-r14 BOOLEAN +} + +UplinkPowerControlDedicatedSCell-r10 ::= SEQUENCE { + p0-UE-PUSCH-r10 INTEGER (-8..7), + deltaMCS-Enabled-r10 ENUMERATED {en0, en1}, + accumulationEnabled-r10 BOOLEAN, + pSRS-Offset-r10 INTEGER (0..15), + pSRS-OffsetAp-r10 INTEGER (0..15) OPTIONAL, -- Need OR + filterCoefficient-r10 FilterCoefficient DEFAULT fc4, + pathlossReferenceLinking-r10 ENUMERATED {pCell, sCell} +} + +UplinkPowerControlDedicatedSCell-v1310 ::= SEQUENCE { +--Release 8 + p0-UE-PUCCH INTEGER (-8..7), +--Release 10 + deltaTxD-OffsetListPUCCH-r10 DeltaTxD-OffsetListPUCCH-r10 OPTIONAL -- Need OR +} + +Alpha-r12 ::= ENUMERATED {al0, al04, al05, al06, al07, al08, al09, al1} + +DeltaFList-PUCCH ::= SEQUENCE { + deltaF-PUCCH-Format1 ENUMERATED {deltaF-2, deltaF0, deltaF2}, + deltaF-PUCCH-Format1b ENUMERATED {deltaF1, deltaF3, deltaF5}, + deltaF-PUCCH-Format2 ENUMERATED {deltaF-2, deltaF0, deltaF1, deltaF2}, + deltaF-PUCCH-Format2a ENUMERATED {deltaF-2, deltaF0, deltaF2}, + deltaF-PUCCH-Format2b ENUMERATED {deltaF-2, deltaF0, deltaF2} +} + +DeltaTxD-OffsetListPUCCH-r10 ::= SEQUENCE { + deltaTxD-OffsetPUCCH-Format1-r10 ENUMERATED {dB0, dB-2}, + deltaTxD-OffsetPUCCH-Format1a1b-r10 ENUMERATED {dB0, dB-2}, + deltaTxD-OffsetPUCCH-Format22a2b-r10 ENUMERATED {dB0, dB-2}, + deltaTxD-OffsetPUCCH-Format3-r10 ENUMERATED {dB0, dB-2}, + ... + +} + +DeltaTxD-OffsetListPUCCH-v1130 ::= SEQUENCE { + deltaTxD-OffsetPUCCH-Format1bCS-r11 ENUMERATED {dB0, dB-1} +} + + +WLAN-Id-List-r13 ::= SEQUENCE (SIZE (1..maxWLAN-Id-r13)) OF WLAN-Identifiers-r12 + + +WLAN-MobilityConfig-r13 ::= SEQUENCE { + wlan-ToReleaseList-r13 WLAN-Id-List-r13 OPTIONAL, -- Need ON + wlan-ToAddList-r13 WLAN-Id-List-r13 OPTIONAL, -- Need ON + associationTimer-r13 ENUMERATED {s10, s30, + s60, s120, s240} OPTIONAL, -- Need OR + successReportRequested-r13 ENUMERATED {true} OPTIONAL, -- Need OR + ..., + [[ wlan-SuspendConfig-r14 WLAN-SuspendConfig-r14 OPTIONAL -- Need ON + ]] +} + + +NextHopChainingCount ::= INTEGER (0..7) + + +SecurityAlgorithmConfig ::= SEQUENCE { + cipheringAlgorithm CipheringAlgorithm-r12, + integrityProtAlgorithm ENUMERATED { + eia0-v920, eia1, eia2, eia3-v1130, spare4, spare3, + spare2, spare1, ...} +} + +CipheringAlgorithm-r12 ::= ENUMERATED { + eea0, eea1, eea2, eea3-v1130, spare4, spare3, + spare2, spare1, ...} + + +ShortMAC-I ::= BIT STRING (SIZE (16)) + + +AdditionalSpectrumEmission ::= INTEGER (1..32) + + +ARFCN-ValueCDMA2000 ::= INTEGER (0..2047) + + +ARFCN-ValueEUTRA ::= INTEGER (0..maxEARFCN) + +ARFCN-ValueEUTRA-v9e0 ::= INTEGER (maxEARFCN-Plus1..maxEARFCN2) + +ARFCN-ValueEUTRA-r9 ::= INTEGER (0..maxEARFCN2) + + +ARFCN-ValueGERAN ::= INTEGER (0..1023) + + +ARFCN-ValueUTRA ::= INTEGER (0..16383) + + +BandclassCDMA2000 ::= ENUMERATED { + bc0, bc1, bc2, bc3, bc4, bc5, bc6, bc7, bc8, + bc9, bc10, bc11, bc12, bc13, bc14, bc15, bc16, + bc17, bc18-v9a0, bc19-v9a0, bc20-v9a0, bc21-v9a0, + spare10, spare9, spare8, spare7, spare6, spare5, spare4, + spare3, spare2, spare1, ...} + + +BandIndicatorGERAN ::= ENUMERATED {dcs1800, pcs1900} + + +CarrierFreqCDMA2000 ::= SEQUENCE { + bandClass BandclassCDMA2000, + arfcn ARFCN-ValueCDMA2000 +} + + +CarrierFreqGERAN ::= SEQUENCE { + arfcn ARFCN-ValueGERAN, + bandIndicator BandIndicatorGERAN +} + + +CarrierFreqsGERAN ::= SEQUENCE { + startingARFCN ARFCN-ValueGERAN, + bandIndicator BandIndicatorGERAN, + followingARFCNs CHOICE { + explicitListOfARFCNs ExplicitListOfARFCNs, + equallySpacedARFCNs SEQUENCE { + arfcn-Spacing INTEGER (1..8), + numberOfFollowingARFCNs INTEGER (0..31) + }, + variableBitMapOfARFCNs OCTET STRING (SIZE (1..16)) + } +} + +ExplicitListOfARFCNs ::= SEQUENCE (SIZE (0..31)) OF ARFCN-ValueGERAN + + +CarrierFreqListMBMS-r11 ::= SEQUENCE (SIZE (1..maxFreqMBMS-r11)) OF ARFCN-ValueEUTRA-r9 + + +CDMA2000-Type ::= ENUMERATED {type1XRTT, typeHRPD} + + +CellIdentity ::= BIT STRING (SIZE (28)) + + +CellIndexList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellIndex + +CellIndex ::= INTEGER (1..maxCellMeas) + + +CellReselectionPriority ::= INTEGER (0..7) + + +CellSelectionInfoCE-r13 ::= SEQUENCE { + q-RxLevMinCE-r13 Q-RxLevMin, + q-QualMinRSRQ-CE-r13 Q-QualMin-r9 OPTIONAL -- Need OR +} + + +CellSelectionInfoCE1-r13 ::= SEQUENCE { + q-RxLevMinCE1-r13 Q-RxLevMin, + q-QualMinRSRQ-CE1-r13 Q-QualMin-r9 OPTIONAL -- Need OR +} + +CellSelectionInfoCE1-v1360 ::= SEQUENCE { + delta-RxLevMinCE1-v1360 INTEGER (-8..-1) +} + +CellReselectionSubPriority-r13 ::= ENUMERATED {oDot2, oDot4, oDot6, oDot8} + + +CSFB-RegistrationParam1XRTT ::= SEQUENCE { + sid BIT STRING (SIZE (15)), + nid BIT STRING (SIZE (16)), + multipleSID BOOLEAN, + multipleNID BOOLEAN, + homeReg BOOLEAN, + foreignSIDReg BOOLEAN, + foreignNIDReg BOOLEAN, + parameterReg BOOLEAN, + powerUpReg BOOLEAN, + registrationPeriod BIT STRING (SIZE (7)), + registrationZone BIT STRING (SIZE (12)), + totalZone BIT STRING (SIZE (3)), + zoneTimer BIT STRING (SIZE (3)) +} + +CSFB-RegistrationParam1XRTT-v920 ::= SEQUENCE { + powerDownReg-r9 ENUMERATED {true} +} + + +CellGlobalIdEUTRA ::= SEQUENCE { + plmn-Identity PLMN-Identity, + cellIdentity CellIdentity +} + + +CellGlobalIdUTRA ::= SEQUENCE { + plmn-Identity PLMN-Identity, + cellIdentity BIT STRING (SIZE (28)) +} + + +CellGlobalIdGERAN ::= SEQUENCE { + plmn-Identity PLMN-Identity, + locationAreaCode BIT STRING (SIZE (16)), + cellIdentity BIT STRING (SIZE (16)) +} + + +CellGlobalIdCDMA2000 ::= CHOICE { + cellGlobalId1XRTT BIT STRING (SIZE (47)), + cellGlobalIdHRPD BIT STRING (SIZE (128)) +} + + +CellSelectionInfoNFreq-r13 ::= SEQUENCE { + -- Cell selection information as in SIB1 + q-RxLevMin-r13 Q-RxLevMin, + q-RxLevMinOffset INTEGER (1..8) OPTIONAL, -- Need OP + -- Cell re-selection information as in SIB3 + q-Hyst-r13 ENUMERATED { + dB0, dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10, + dB12, dB14, dB16, dB18, dB20, dB22, dB24}, + q-RxLevMinReselection-r13 Q-RxLevMin, + t-ReselectionEUTRA-r13 T-Reselection +} + + +CSG-Identity ::= BIT STRING (SIZE (27)) + + +FreqBandIndicator ::= INTEGER (1..maxFBI) + +FreqBandIndicator-v9e0 ::= INTEGER (maxFBI-Plus1..maxFBI2) + +FreqBandIndicator-r11 ::= INTEGER (1..maxFBI2) + + +MobilityControlInfo ::= SEQUENCE { + targetPhysCellId PhysCellId, + carrierFreq CarrierFreqEUTRA OPTIONAL, -- Cond HO-toEUTRA2 + carrierBandwidth CarrierBandwidthEUTRA OPTIONAL, -- Cond HO-toEUTRA + additionalSpectrumEmission AdditionalSpectrumEmission OPTIONAL, -- Cond HO-toEUTRA + t304 ENUMERATED { + ms50, ms100, ms150, ms200, ms500, ms1000, + ms2000, ms10000-v1310}, + newUE-Identity C-RNTI, + radioResourceConfigCommon RadioResourceConfigCommon, + rach-ConfigDedicated RACH-ConfigDedicated OPTIONAL, -- Need OP + ..., + [[ carrierFreq-v9e0 CarrierFreqEUTRA-v9e0 OPTIONAL -- Need ON + ]], + [[ drb-ContinueROHC-r11 ENUMERATED {true} OPTIONAL -- Cond HO + ]], + [[ mobilityControlInfoV2X-r14 MobilityControlInfoV2X-r14 OPTIONAL, -- Need ON + handoverWithoutWT-Change-r14 ENUMERATED {keepLWA-Config, sendEndMarker} OPTIONAL, -- Cond HO + makeBeforeBreak-r14 ENUMERATED {true} OPTIONAL, -- Need OR + rach-Skip-r14 RACH-Skip-r14 OPTIONAL, -- Need OR + sameSFN-Indication-r14 ENUMERATED {true} OPTIONAL -- Cond HO-SFNsynced + ]] +} + +MobilityControlInfoSCG-r12 ::= SEQUENCE { + t307-r12 ENUMERATED { + ms50, ms100, ms150, ms200, ms500, ms1000, + ms2000, spare1}, + ue-IdentitySCG-r12 C-RNTI OPTIONAL, -- Cond SCGEst, + rach-ConfigDedicated-r12 RACH-ConfigDedicated OPTIONAL, -- Need OP + cipheringAlgorithmSCG-r12 CipheringAlgorithm-r12 OPTIONAL, -- Need ON + ..., + [[ makeBeforeBreakSCG-r14 ENUMERATED {true} OPTIONAL, -- Need OR + rach-SkipSCG-r14 RACH-Skip-r14 OPTIONAL -- Need OR + ]] +} + +MobilityControlInfoV2X-r14 ::= SEQUENCE { + v2x-CommTxPoolExceptional-r14 SL-CommResourcePoolV2X-r14 OPTIONAL, -- Need OR + v2x-CommRxPool-r14 SL-CommRxPoolListV2X-r14 OPTIONAL, -- Need OR + v2x-CommSyncConfig-r14 SL-SyncConfigListV2X-r14 OPTIONAL, -- Need OR + cbr-MobilityTxConfigList-r14 SL-CBR-CommonTxConfigList-r14 OPTIONAL -- Need OR +} + +CarrierBandwidthEUTRA ::= SEQUENCE { + dl-Bandwidth ENUMERATED { + n6, n15, n25, n50, n75, n100, spare10, + spare9, spare8, spare7, spare6, spare5, + spare4, spare3, spare2, spare1}, + ul-Bandwidth ENUMERATED { + n6, n15, n25, n50, n75, n100, spare10, + spare9, spare8, spare7, spare6, spare5, + spare4, spare3, spare2, spare1} OPTIONAL -- Need OP +} + +CarrierFreqEUTRA ::= SEQUENCE { + dl-CarrierFreq ARFCN-ValueEUTRA, + ul-CarrierFreq ARFCN-ValueEUTRA OPTIONAL -- Cond FDD +} + +CarrierFreqEUTRA-v9e0 ::= SEQUENCE { + dl-CarrierFreq-v9e0 ARFCN-ValueEUTRA-r9, + ul-CarrierFreq-v9e0 ARFCN-ValueEUTRA-r9 OPTIONAL -- Cond FDD +} + +RACH-Skip-r14 ::= SEQUENCE { + targetTA-r14 CHOICE { + ta0-r14 NULL, + ptag-r14 NULL, + pstag-r14 NULL, + mcg-STAG-r14 STAG-Id-r11, + scg-STAG-r14 STAG-Id-r11 + }, + ul-ConfigInfo-r14 SEQUENCE { + numberOfConfUL-Processes-r14 INTEGER (1..8), + ul-SchedInterval-r14 ENUMERATED {sf2, sf5, sf10}, + ul-StartSubframe-r14 INTEGER (0..9), + ul-Grant-r14 BIT STRING (SIZE (16)) + } OPTIONAL -- Need OR +} + + +MobilityParametersCDMA2000 ::= OCTET STRING + + +MobilityStateParameters ::= SEQUENCE { + t-Evaluation ENUMERATED { + s30, s60, s120, s180, s240, spare3, spare2, spare1}, + t-HystNormal ENUMERATED { + s30, s60, s120, s180, s240, spare3, spare2, spare1}, + n-CellChangeMedium INTEGER (1..16), + n-CellChangeHigh INTEGER (1..16) +} + + +MultiBandInfoList ::= SEQUENCE (SIZE (1..maxMultiBands)) OF FreqBandIndicator + +MultiBandInfoList-v9e0 ::= SEQUENCE (SIZE (1..maxMultiBands)) OF MultiBandInfo-v9e0 + +MultiBandInfoList-v10j0 ::= SEQUENCE (SIZE (1..maxMultiBands)) OF NS-PmaxList-r10 + +MultiBandInfoList-r11 ::= SEQUENCE (SIZE (1..maxMultiBands)) OF FreqBandIndicator-r11 + +MultiBandInfo-v9e0 ::= SEQUENCE { + freqBandIndicator-v9e0 FreqBandIndicator-v9e0 OPTIONAL -- Need OP +} + + +NS-PmaxList-r10 ::= SEQUENCE (SIZE (1..maxNS-Pmax-r10)) OF NS-PmaxValue-r10 + +NS-PmaxValue-r10 ::= SEQUENCE { + additionalPmax-r10 P-Max OPTIONAL, -- Need OP + additionalSpectrumEmission AdditionalSpectrumEmission +} + + +PhysCellId ::= INTEGER (0..503) + + +PhysCellIdRange ::= SEQUENCE { + start PhysCellId, + range ENUMERATED { + n4, n8, n12, n16, n24, n32, n48, n64, n84, + n96, n128, n168, n252, n504, spare2, + spare1} OPTIONAL -- Need OP +} + + +PhysCellIdRangeUTRA-FDDList-r9::= SEQUENCE (SIZE (1..maxPhysCellIdRange-r9)) OF PhysCellIdRangeUTRA-FDD-r9 + +PhysCellIdRangeUTRA-FDD-r9 ::= SEQUENCE { + start-r9 PhysCellIdUTRA-FDD, + range-r9 INTEGER (2..512) OPTIONAL -- Need OP +} + + +PhysCellIdCDMA2000 ::= INTEGER (0..maxPNOffset) + + +PhysCellIdGERAN ::= SEQUENCE { + networkColourCode BIT STRING (SIZE (3)), + baseStationColourCode BIT STRING (SIZE (3)) +} + + +PhysCellIdUTRA-FDD ::= INTEGER (0..511) + + +PhysCellIdUTRA-TDD ::= INTEGER (0..127) + + +PLMN-Identity ::= SEQUENCE { + mcc MCC OPTIONAL, -- Cond MCC + mnc MNC +} + +MCC ::= SEQUENCE (SIZE (3)) OF + MCC-MNC-Digit + +MNC ::= SEQUENCE (SIZE (2..3)) OF + MCC-MNC-Digit + +MCC-MNC-Digit ::= INTEGER (0..9) + + + +PLMN-IdentityList3-r11 ::= SEQUENCE (SIZE (1..16)) OF PLMN-Identity + + +PreRegistrationInfoHRPD ::= SEQUENCE { + preRegistrationAllowed BOOLEAN, + preRegistrationZoneId PreRegistrationZoneIdHRPD OPTIONAL, -- cond PreRegAllowed + secondaryPreRegistrationZoneIdList SecondaryPreRegistrationZoneIdListHRPD OPTIONAL -- Need OR +} + +SecondaryPreRegistrationZoneIdListHRPD ::= SEQUENCE (SIZE (1..2)) OF PreRegistrationZoneIdHRPD + +PreRegistrationZoneIdHRPD ::= INTEGER (0..255) + + +Q-QualMin-r9 ::= INTEGER (-34..-3) + + +Q-RxLevMin ::= INTEGER (-70..-22) + + +Q-OffsetRange ::= ENUMERATED { + dB-24, dB-22, dB-20, dB-18, dB-16, dB-14, + dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3, + dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5, + dB6, dB8, dB10, dB12, dB14, dB16, dB18, + dB20, dB22, dB24} + + +Q-OffsetRangeInterRAT ::= INTEGER (-15..15) + + +ReselectionThreshold ::= INTEGER (0..31) + + +ReselectionThresholdQ-r9 ::= INTEGER (0..31) + + +SCellIndex-r10 ::= INTEGER (1..7) +SCellIndex-r13 ::= INTEGER (1..31) + + +ServCellIndex-r10 ::= INTEGER (0..7) +ServCellIndex-r13 ::= INTEGER (0..31) + + +SpeedStateScaleFactors ::= SEQUENCE { + sf-Medium ENUMERATED {oDot25, oDot5, oDot75, lDot0}, + sf-High ENUMERATED {oDot25, oDot5, oDot75, lDot0} +} + +SystemInfoListGERAN ::= SEQUENCE (SIZE (1..maxGERAN-SI)) OF + OCTET STRING (SIZE (1..23)) + + +SystemTimeInfoCDMA2000 ::= SEQUENCE { + cdma-EUTRA-Synchronisation BOOLEAN, + cdma-SystemTime CHOICE { + synchronousSystemTime BIT STRING (SIZE (39)), + asynchronousSystemTime BIT STRING (SIZE (49)) + } +} + + +TrackingAreaCode ::= BIT STRING (SIZE (16)) + + +T-Reselection ::= INTEGER (0..7) + + +T-ReselectionEUTRA-CE-r13 ::= INTEGER (0..15) + + +AllowedMeasBandwidth ::= ENUMERATED {mbw6, mbw15, mbw25, mbw50, mbw75, mbw100} + + +CSI-RSRP-Range-r12 ::= INTEGER(0..97) + + +Hysteresis ::= INTEGER (0..30) + + +LocationInfo-r10 ::= SEQUENCE { + locationCoordinates-r10 CHOICE { + ellipsoid-Point-r10 OCTET STRING, + ellipsoidPointWithAltitude-r10 OCTET STRING, + ..., + ellipsoidPointWithUncertaintyCircle-r11 OCTET STRING, + ellipsoidPointWithUncertaintyEllipse-r11 OCTET STRING, + ellipsoidPointWithAltitudeAndUncertaintyEllipsoid-r11 OCTET STRING, + ellipsoidArc-r11 OCTET STRING, + polygon-r11 OCTET STRING + }, + horizontalVelocity-r10 OCTET STRING OPTIONAL, + gnss-TOD-msec-r10 OCTET STRING OPTIONAL, + ... +} + + +MBSFN-RSRQ-Range-r12 ::= INTEGER(0..31) + +MeasConfig ::= SEQUENCE { + -- Measurement objects + measObjectToRemoveList MeasObjectToRemoveList OPTIONAL, -- Need ON + measObjectToAddModList MeasObjectToAddModList OPTIONAL, -- Need ON + -- Reporting configurations + reportConfigToRemoveList ReportConfigToRemoveList OPTIONAL, -- Need ON + reportConfigToAddModList ReportConfigToAddModList OPTIONAL, -- Need ON + -- Measurement identities + measIdToRemoveList MeasIdToRemoveList OPTIONAL, -- Need ON + measIdToAddModList MeasIdToAddModList OPTIONAL, -- Need ON + -- Other parameters + quantityConfig QuantityConfig OPTIONAL, -- Need ON + measGapConfig MeasGapConfig OPTIONAL, -- Need ON + s-Measure RSRP-Range OPTIONAL, -- Need ON + preRegistrationInfoHRPD PreRegistrationInfoHRPD OPTIONAL, -- Need OP + speedStatePars CHOICE { + release NULL, + setup SEQUENCE { + mobilityStateParameters MobilityStateParameters, + timeToTrigger-SF SpeedStateScaleFactors + } + } OPTIONAL, -- Need ON + ..., + [[ measObjectToAddModList-v9e0 MeasObjectToAddModList-v9e0 OPTIONAL -- Need ON + ]], + [[ allowInterruptions-r11 BOOLEAN OPTIONAL -- Need ON + ]], + [[ measScaleFactor-r12 CHOICE { + release NULL, + setup MeasScaleFactor-r12 + } OPTIONAL, -- Need ON + measIdToRemoveListExt-r12 MeasIdToRemoveListExt-r12 OPTIONAL, -- Need ON + measIdToAddModListExt-r12 MeasIdToAddModListExt-r12 OPTIONAL, -- Need ON + measRSRQ-OnAllSymbols-r12 BOOLEAN OPTIONAL -- Need ON + ]], + [[ + measObjectToRemoveListExt-r13 MeasObjectToRemoveListExt-r13 OPTIONAL, -- Need ON + measObjectToAddModListExt-r13 MeasObjectToAddModListExt-r13 OPTIONAL, -- Need ON + measIdToAddModList-v1310 MeasIdToAddModList-v1310 OPTIONAL, -- Need ON + measIdToAddModListExt-v1310 MeasIdToAddModListExt-v1310 OPTIONAL -- Need ON + ]], + [[ measGapConfigPerCC-List-r14 MeasGapConfigPerCC-List-r14 OPTIONAL, -- Need ON + measGapSharingConfig-r14 MeasGapSharingConfig-r14 OPTIONAL -- Need ON + ]] +} + +MeasIdToRemoveList ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasId + +MeasIdToRemoveListExt-r12 ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasId-v1250 + +MeasObjectToRemoveList ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectId + +MeasObjectToRemoveListExt-r13 ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectId-v1310 + +ReportConfigToRemoveList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigId + + +MeasDS-Config-r12 ::= CHOICE { + release NULL, + setup SEQUENCE { + dmtc-PeriodOffset-r12 CHOICE { + ms40-r12 INTEGER(0..39), + ms80-r12 INTEGER(0..79), + ms160-r12 INTEGER(0..159), + ... + }, + ds-OccasionDuration-r12 CHOICE { + durationFDD-r12 INTEGER(1..maxDS-Duration-r12), + durationTDD-r12 INTEGER(2..maxDS-Duration-r12) + }, + measCSI-RS-ToRemoveList-r12 MeasCSI-RS-ToRemoveList-r12 OPTIONAL, -- Need ON + measCSI-RS-ToAddModList-r12 MeasCSI-RS-ToAddModList-r12 OPTIONAL, -- Need ON + ... + } +} + +MeasCSI-RS-ToRemoveList-r12 ::= SEQUENCE (SIZE (1..maxCSI-RS-Meas-r12)) OF MeasCSI-RS-Id-r12 + +MeasCSI-RS-ToAddModList-r12 ::= SEQUENCE (SIZE (1..maxCSI-RS-Meas-r12)) OF MeasCSI-RS-Config-r12 + +MeasCSI-RS-Id-r12 ::= INTEGER (1..maxCSI-RS-Meas-r12) + +MeasCSI-RS-Config-r12 ::= SEQUENCE { + measCSI-RS-Id-r12 MeasCSI-RS-Id-r12, + physCellId-r12 INTEGER (0..503), + scramblingIdentity-r12 INTEGER (0..503), + resourceConfig-r12 INTEGER (0..31), + subframeOffset-r12 INTEGER (0..4), + csi-RS-IndividualOffset-r12 Q-OffsetRange, + ... +} + + +MeasGapConfig ::= CHOICE { + release NULL, + setup SEQUENCE { + gapOffset CHOICE { + gp0 INTEGER (0..39), + gp1 INTEGER (0..79), + + ..., + gp2-r14 INTEGER (0..39), + gp3-r14 INTEGER (0..79), + gp-ncsg1-r14 INTEGER (0..39), + gp-ncsg2-r14 INTEGER (0..79), + gp-ncsg3-r14 INTEGER (0..39), + gp-ncsg4-r14 INTEGER (0..79), + gp-nonUniform1-r14 INTEGER (0..1279), + gp-nonUniform2-r14 INTEGER (0..2559), + gp-nonUniform3-r14 INTEGER (0..5119), + gp-nonUniform4-r14 INTEGER (0..10239) + } + } +} + + + +MeasGapConfigPerCC-List-r14 ::= CHOICE { + release NULL, + setup SEQUENCE { + measGapConfigToRemoveList-r14 MeasGapConfigToRemoveList-r14 OPTIONAL, -- Need ON + measGapConfigToAddModList-r14 MeasGapConfigToAddModList-r14 OPTIONAL -- Need ON + } +} + +MeasGapConfigToRemoveList-r14 ::= SEQUENCE (SIZE (1..maxServCell-r13)) OF ServCellIndex-r13 + +MeasGapConfigToAddModList-r14 ::= SEQUENCE (SIZE (1..maxServCell-r13)) OF MeasGapConfigPerCC-r14 + +MeasGapConfigPerCC-r14 ::= SEQUENCE { + servCellId-r14 ServCellIndex-r13, + measGapConfigCC-r14 MeasGapConfig +} + + +MeasGapSharingConfig-r14 ::= CHOICE { + release NULL, + setup SEQUENCE { + measGapSharingScheme-r14 ENUMERATED {scheme00, scheme01, scheme10, scheme11} + } +} + + +MeasId ::= INTEGER (1..maxMeasId) + +MeasId-v1250 ::= INTEGER (maxMeasId-Plus1..maxMeasId-r12) + + +MeasIdToAddModList ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasIdToAddMod + +MeasIdToAddModList-v1310 ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasIdToAddMod-v1310 + +MeasIdToAddModListExt-r12 ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasIdToAddModExt-r12 + +MeasIdToAddModListExt-v1310 ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasIdToAddMod-v1310 + +MeasIdToAddMod ::= SEQUENCE { + measId MeasId, + measObjectId MeasObjectId, + reportConfigId ReportConfigId +} + +MeasIdToAddModExt-r12 ::= SEQUENCE { + measId-v1250 MeasId-v1250, + measObjectId-r12 MeasObjectId, + reportConfigId-r12 ReportConfigId +} + +MeasIdToAddMod-v1310 ::= SEQUENCE { + measObjectId-v1310 MeasObjectId-v1310 OPTIONAL +} + + +MeasObjectCDMA2000 ::= SEQUENCE { + cdma2000-Type CDMA2000-Type, + carrierFreq CarrierFreqCDMA2000, + searchWindowSize INTEGER (0..15) OPTIONAL, -- Need ON + offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, + cellsToRemoveList CellIndexList OPTIONAL, -- Need ON + cellsToAddModList CellsToAddModListCDMA2000 OPTIONAL, -- Need ON + cellForWhichToReportCGI PhysCellIdCDMA2000 OPTIONAL, -- Need ON + ... +} + +CellsToAddModListCDMA2000 ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModCDMA2000 + +CellsToAddModCDMA2000 ::= SEQUENCE { + cellIndex INTEGER (1..maxCellMeas), + physCellId PhysCellIdCDMA2000 +} + + +MeasObjectEUTRA ::= SEQUENCE { + carrierFreq ARFCN-ValueEUTRA, + allowedMeasBandwidth AllowedMeasBandwidth, + presenceAntennaPort1 PresenceAntennaPort1, + neighCellConfig NeighCellConfig, + offsetFreq Q-OffsetRange DEFAULT dB0, + -- Cell list + cellsToRemoveList CellIndexList OPTIONAL, -- Need ON + cellsToAddModList CellsToAddModList OPTIONAL, -- Need ON + -- Black list + blackCellsToRemoveList CellIndexList OPTIONAL, -- Need ON + blackCellsToAddModList BlackCellsToAddModList OPTIONAL, -- Need ON + cellForWhichToReportCGI PhysCellId OPTIONAL, -- Need ON + ..., + [[measCycleSCell-r10 MeasCycleSCell-r10 OPTIONAL, -- Need ON + measSubframePatternConfigNeigh-r10 MeasSubframePatternConfigNeigh-r10 OPTIONAL -- Need ON + ]], + [[widebandRSRQ-Meas-r11 BOOLEAN OPTIONAL -- Cond WB-RSRQ + ]], + [[ altTTT-CellsToRemoveList-r12 CellIndexList OPTIONAL, -- Need ON + altTTT-CellsToAddModList-r12 AltTTT-CellsToAddModList-r12 OPTIONAL, -- Need ON + t312-r12 CHOICE { + release NULL, + setup ENUMERATED {ms0, ms50, ms100, ms200, + ms300, ms400, ms500, ms1000} + } OPTIONAL, -- Need ON + reducedMeasPerformance-r12 BOOLEAN OPTIONAL, -- Need ON + measDS-Config-r12 MeasDS-Config-r12 OPTIONAL -- Need ON + ]], + [[ + whiteCellsToRemoveList-r13 CellIndexList OPTIONAL, -- Need ON + whiteCellsToAddModList-r13 WhiteCellsToAddModList-r13 OPTIONAL, -- Need ON + rmtc-Config-r13 RMTC-Config-r13 OPTIONAL, -- Need ON + carrierFreq-r13 ARFCN-ValueEUTRA-v9e0 OPTIONAL -- Need ON + ]], + [[ + tx-ResourcePoolToRemoveList-r14 Tx-ResourcePoolMeasList-r14 OPTIONAL, -- Need ON + tx-ResourcePoolToAddList-r14 Tx-ResourcePoolMeasList-r14 OPTIONAL, -- Need ON + fembms-MixedCarrier-r14 BOOLEAN OPTIONAL -- Need ON + ]] +} + +MeasObjectEUTRA-v9e0 ::= SEQUENCE { + carrierFreq-v9e0 ARFCN-ValueEUTRA-v9e0 +} + +CellsToAddModList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddMod + +CellsToAddMod ::= SEQUENCE { + cellIndex INTEGER (1..maxCellMeas), + physCellId PhysCellId, + cellIndividualOffset Q-OffsetRange +} + +BlackCellsToAddModList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF BlackCellsToAddMod + +BlackCellsToAddMod ::= SEQUENCE { + cellIndex INTEGER (1..maxCellMeas), + physCellIdRange PhysCellIdRange +} + +MeasCycleSCell-r10 ::= ENUMERATED {sf160, sf256, sf320, sf512, + sf640, sf1024, sf1280, spare1} + +MeasSubframePatternConfigNeigh-r10 ::= CHOICE { + release NULL, + setup SEQUENCE { + measSubframePatternNeigh-r10 MeasSubframePattern-r10, + measSubframeCellList-r10 MeasSubframeCellList-r10 OPTIONAL -- Cond always + } +} + +MeasSubframeCellList-r10 ::= SEQUENCE (SIZE (1..maxCellMeas)) OF PhysCellIdRange + +AltTTT-CellsToAddModList-r12 ::= SEQUENCE (SIZE (1..maxCellMeas)) OF AltTTT-CellsToAddMod-r12 + +AltTTT-CellsToAddMod-r12 ::= SEQUENCE { + cellIndex-r12 INTEGER (1..maxCellMeas), + physCellIdRange-r12 PhysCellIdRange +} + +WhiteCellsToAddModList-r13 ::= SEQUENCE (SIZE (1..maxCellMeas)) OF WhiteCellsToAddMod-r13 + +WhiteCellsToAddMod-r13 ::= SEQUENCE { + cellIndex-r13 INTEGER (1..maxCellMeas), + physCellIdRange-r13 PhysCellIdRange +} + +RMTC-Config-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + rmtc-Period-r13 ENUMERATED {ms40, ms80, ms160, ms320, ms640}, + rmtc-SubframeOffset-r13 INTEGER(0..639) OPTIONAL, -- Need ON + measDuration-r13 ENUMERATED {sym1, sym14, sym28, sym42, sym70}, + ... + } +} + +Tx-ResourcePoolMeasList-r14 ::= SEQUENCE (SIZE (1..maxSL-PoolToMeasure-r14)) OF SL-V2X-TxPoolReportIdentity-r14 + + +MeasObjectGERAN ::= SEQUENCE { + carrierFreqs CarrierFreqsGERAN, + offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, + ncc-Permitted BIT STRING(SIZE (8)) DEFAULT '11111111'B, + cellForWhichToReportCGI PhysCellIdGERAN OPTIONAL, -- Need ON + ... +} + + +MeasObjectId ::= INTEGER (1..maxObjectId) + +MeasObjectId-v1310 ::= INTEGER (maxObjectId-Plus1-r13..maxObjectId-r13) + +MeasObjectId-r13 ::= INTEGER (1..maxObjectId-r13) + + +MeasObjectToAddModList ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectToAddMod + +MeasObjectToAddModListExt-r13 ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectToAddModExt-r13 + +MeasObjectToAddModList-v9e0 ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectToAddMod-v9e0 + +MeasObjectToAddMod ::= SEQUENCE { + measObjectId MeasObjectId, + measObject CHOICE { + measObjectEUTRA MeasObjectEUTRA, + measObjectUTRA MeasObjectUTRA, + measObjectGERAN MeasObjectGERAN, + measObjectCDMA2000 MeasObjectCDMA2000, + ..., + measObjectWLAN-r13 MeasObjectWLAN-r13 + } +} + +MeasObjectToAddModExt-r13 ::= SEQUENCE { + measObjectId-r13 MeasObjectId-v1310, + measObject-r13 CHOICE { + measObjectEUTRA-r13 MeasObjectEUTRA, + measObjectUTRA-r13 MeasObjectUTRA, + measObjectGERAN-r13 MeasObjectGERAN, + measObjectCDMA2000-r13 MeasObjectCDMA2000, + ..., + measObjectWLAN-v1320 MeasObjectWLAN-r13 + } +} + +MeasObjectToAddMod-v9e0 ::= SEQUENCE { + measObjectEUTRA-v9e0 MeasObjectEUTRA-v9e0 OPTIONAL -- Cond eutra +} + + +MeasObjectUTRA ::= SEQUENCE { + carrierFreq ARFCN-ValueUTRA, + offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, + cellsToRemoveList CellIndexList OPTIONAL, -- Need ON + cellsToAddModList CHOICE { + cellsToAddModListUTRA-FDD CellsToAddModListUTRA-FDD, + cellsToAddModListUTRA-TDD CellsToAddModListUTRA-TDD + } OPTIONAL, -- Need ON + cellForWhichToReportCGI CHOICE { + utra-FDD PhysCellIdUTRA-FDD, + utra-TDD PhysCellIdUTRA-TDD + } OPTIONAL, -- Need ON + ..., + [[ csg-allowedReportingCells-v930 CSG-AllowedReportingCells-r9 OPTIONAL -- Need ON + ]], + [[ reducedMeasPerformance-r12 BOOLEAN OPTIONAL -- Need ON + ]] +} + +CellsToAddModListUTRA-FDD ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModUTRA-FDD + +CellsToAddModUTRA-FDD ::= SEQUENCE { + cellIndex INTEGER (1..maxCellMeas), + physCellId PhysCellIdUTRA-FDD +} + +CellsToAddModListUTRA-TDD ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModUTRA-TDD + +CellsToAddModUTRA-TDD ::= SEQUENCE { + cellIndex INTEGER (1..maxCellMeas), + physCellId PhysCellIdUTRA-TDD +} + +CSG-AllowedReportingCells-r9 ::= SEQUENCE { + physCellIdRangeUTRA-FDDList-r9 PhysCellIdRangeUTRA-FDDList-r9 OPTIONAL -- Need OR +} + +MeasObjectWLAN-r13 ::= SEQUENCE { + carrierFreq-r13 CHOICE { + bandIndicatorListWLAN-r13 SEQUENCE (SIZE (1..maxWLAN-Bands-r13)) OF WLAN-BandIndicator-r13, + carrierInfoListWLAN-r13 SEQUENCE (SIZE (1..maxWLAN-CarrierInfo-r13)) OF WLAN-CarrierInfo-r13 + } OPTIONAL, -- Need ON + wlan-ToAddModList-r13 WLAN-Id-List-r13 OPTIONAL, -- Need ON + wlan-ToRemoveList-r13 WLAN-Id-List-r13 OPTIONAL, -- Need ON + ... +} + +WLAN-BandIndicator-r13 ::= ENUMERATED {band2dot4, band5, band60-v1430, spare5, spare4, spare3, spare2, spare1, ...} + + +MeasResults ::= SEQUENCE { + measId MeasId, + measResultPCell SEQUENCE { + rsrpResult RSRP-Range, + rsrqResult RSRQ-Range + }, + measResultNeighCells CHOICE { + measResultListEUTRA MeasResultListEUTRA, + measResultListUTRA MeasResultListUTRA, + measResultListGERAN MeasResultListGERAN, + measResultsCDMA2000 MeasResultsCDMA2000, + ... + } OPTIONAL, + ..., + [[ measResultForECID-r9 MeasResultForECID-r9 OPTIONAL + ]], + [[ locationInfo-r10 LocationInfo-r10 OPTIONAL, + measResultServFreqList-r10 MeasResultServFreqList-r10 OPTIONAL + ]], + [[ measId-v1250 MeasId-v1250 OPTIONAL, + measResultPCell-v1250 RSRQ-Range-v1250 OPTIONAL, + measResultCSI-RS-List-r12 MeasResultCSI-RS-List-r12 OPTIONAL + ]], + [[ measResultForRSSI-r13 MeasResultForRSSI-r13 OPTIONAL, + measResultServFreqListExt-r13 MeasResultServFreqListExt-r13 OPTIONAL, + measResultSSTD-r13 MeasResultSSTD-r13 OPTIONAL, + measResultPCell-v1310 SEQUENCE { + rs-sinr-Result-r13 RS-SINR-Range-r13 + } OPTIONAL, + ul-PDCP-DelayResultList-r13 UL-PDCP-DelayResultList-r13 OPTIONAL, + measResultListWLAN-r13 MeasResultListWLAN-r13 OPTIONAL + ]], + [[ measResultPCell-v1360 RSRP-Range-v1360 OPTIONAL + ]], + [[ measResultListCBR-r14 MeasResultListCBR-r14 OPTIONAL, + measResultListWLAN-r14 MeasResultListWLAN-r14 OPTIONAL + ]] +} + +MeasResultListEUTRA ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultEUTRA + +MeasResultEUTRA ::= SEQUENCE { + physCellId PhysCellId, + cgi-Info SEQUENCE { + cellGlobalId CellGlobalIdEUTRA, + trackingAreaCode TrackingAreaCode, + plmn-IdentityList PLMN-IdentityList2 OPTIONAL + } OPTIONAL, + measResult SEQUENCE { + rsrpResult RSRP-Range OPTIONAL, + rsrqResult RSRQ-Range OPTIONAL, + ..., + [[ additionalSI-Info-r9 AdditionalSI-Info-r9 OPTIONAL + ]], + [[ primaryPLMN-Suitable-r12 ENUMERATED {true} OPTIONAL, + measResult-v1250 RSRQ-Range-v1250 OPTIONAL + ]], + [[ rs-sinr-Result-r13 RS-SINR-Range-r13 OPTIONAL, + cgi-Info-v1310 SEQUENCE { + freqBandIndicator-r13 FreqBandIndicator-r11 OPTIONAL, + multiBandInfoList-r13 MultiBandInfoList-r11 OPTIONAL, + freqBandIndicatorPriority-r13 ENUMERATED {true} OPTIONAL + } OPTIONAL + ]], + [[ + measResult-v1360 RSRP-Range-v1360 OPTIONAL + ]] + } +} + +MeasResultServFreqList-r10 ::= SEQUENCE (SIZE (1..maxServCell-r10)) OF MeasResultServFreq-r10 + +MeasResultServFreqListExt-r13 ::= SEQUENCE (SIZE (1..maxServCell-r13)) OF MeasResultServFreq-r13 + +MeasResultServFreq-r10 ::= SEQUENCE { + servFreqId-r10 ServCellIndex-r10, + measResultSCell-r10 SEQUENCE { + rsrpResultSCell-r10 RSRP-Range, + rsrqResultSCell-r10 RSRQ-Range + } OPTIONAL, + measResultBestNeighCell-r10 SEQUENCE { + physCellId-r10 PhysCellId, + rsrpResultNCell-r10 RSRP-Range, + rsrqResultNCell-r10 RSRQ-Range + } OPTIONAL, + ..., + [[ measResultSCell-v1250 RSRQ-Range-v1250 OPTIONAL, + measResultBestNeighCell-v1250 RSRQ-Range-v1250 OPTIONAL + ]], + [[ measResultSCell-v1310 SEQUENCE { + rs-sinr-Result-r13 RS-SINR-Range-r13 + } OPTIONAL, + measResultBestNeighCell-v1310 SEQUENCE { + rs-sinr-Result-r13 RS-SINR-Range-r13 + } OPTIONAL + ]] +} + +MeasResultServFreq-r13 ::= SEQUENCE { + servFreqId-r13 ServCellIndex-r13, + measResultSCell-r13 SEQUENCE { + rsrpResultSCell-r13 RSRP-Range, + rsrqResultSCell-r13 RSRQ-Range-r13, + rs-sinr-Result-r13 RS-SINR-Range-r13 OPTIONAL + } OPTIONAL, + measResultBestNeighCell-r13 SEQUENCE { + physCellId-r13 PhysCellId, + rsrpResultNCell-r13 RSRP-Range, + rsrqResultNCell-r13 RSRQ-Range-r13, + rs-sinr-Result-r13 RS-SINR-Range-r13 OPTIONAL + } OPTIONAL, + ..., + [[ measResultBestNeighCell-v1360 SEQUENCE { + rsrpResultNCell-v1360 RSRP-Range-v1360 + } OPTIONAL + ]] +} + +MeasResultCSI-RS-List-r12 ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultCSI-RS-r12 + +MeasResultCSI-RS-r12 ::= SEQUENCE { + measCSI-RS-Id-r12 MeasCSI-RS-Id-r12, + csi-RSRP-Result-r12 CSI-RSRP-Range-r12, + ... +} + +MeasResultListUTRA ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultUTRA + +MeasResultUTRA ::= SEQUENCE { + physCellId CHOICE { + fdd PhysCellIdUTRA-FDD, + tdd PhysCellIdUTRA-TDD + }, + cgi-Info SEQUENCE { + cellGlobalId CellGlobalIdUTRA, + locationAreaCode BIT STRING (SIZE (16)) OPTIONAL, + routingAreaCode BIT STRING (SIZE (8)) OPTIONAL, + plmn-IdentityList PLMN-IdentityList2 OPTIONAL + } OPTIONAL, + measResult SEQUENCE { + utra-RSCP INTEGER (-5..91) OPTIONAL, + utra-EcN0 INTEGER (0..49) OPTIONAL, + ..., + [[ additionalSI-Info-r9 AdditionalSI-Info-r9 OPTIONAL + ]], + [[ primaryPLMN-Suitable-r12 ENUMERATED {true} OPTIONAL + ]] + } +} + +MeasResultListGERAN ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultGERAN + +MeasResultGERAN ::= SEQUENCE { + carrierFreq CarrierFreqGERAN, + physCellId PhysCellIdGERAN, + cgi-Info SEQUENCE { + cellGlobalId CellGlobalIdGERAN, + routingAreaCode BIT STRING (SIZE (8)) OPTIONAL + } OPTIONAL, + measResult SEQUENCE { + rssi INTEGER (0..63), + ... + } +} + +MeasResultsCDMA2000 ::= SEQUENCE { + preRegistrationStatusHRPD BOOLEAN, + measResultListCDMA2000 MeasResultListCDMA2000 +} + +MeasResultListCDMA2000 ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultCDMA2000 + +MeasResultCDMA2000 ::= SEQUENCE { + physCellId PhysCellIdCDMA2000, + cgi-Info CellGlobalIdCDMA2000 OPTIONAL, + measResult SEQUENCE { + pilotPnPhase INTEGER (0..32767) OPTIONAL, + pilotStrength INTEGER (0..63), + ... + } +} + +MeasResultListWLAN-r13 ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultWLAN-r13 + +MeasResultListWLAN-r14 ::= SEQUENCE (SIZE (1..maxWLAN-Id-Report-r14)) OF MeasResultWLAN-r13 + +MeasResultWLAN-r13 ::= SEQUENCE { + wlan-Identifiers-r13 WLAN-Identifiers-r12, + carrierInfoWLAN-r13 WLAN-CarrierInfo-r13 OPTIONAL, + bandWLAN-r13 WLAN-BandIndicator-r13 OPTIONAL, + rssiWLAN-r13 WLAN-RSSI-Range-r13, + availableAdmissionCapacityWLAN-r13 INTEGER (0..31250) OPTIONAL, + backhaulDL-BandwidthWLAN-r13 WLAN-backhaulRate-r12 OPTIONAL, + backhaulUL-BandwidthWLAN-r13 WLAN-backhaulRate-r12 OPTIONAL, + channelUtilizationWLAN-r13 INTEGER (0..255) OPTIONAL, + stationCountWLAN-r13 INTEGER (0..65535) OPTIONAL, + connectedWLAN-r13 ENUMERATED {true} OPTIONAL, + ... +} + +MeasResultListCBR-r14 ::= SEQUENCE (SIZE (1..maxCBR-Report-r14)) OF MeasResultCBR-r14 + +MeasResultCBR-r14 ::= SEQUENCE { + poolIdentity-r14 SL-V2X-TxPoolReportIdentity-r14, + cbr-PSSCH-r14 SL-CBR-r14, + cbr-PSCCH-r14 SL-CBR-r14 OPTIONAL +} + +MeasResultForECID-r9 ::= SEQUENCE { + ue-RxTxTimeDiffResult-r9 INTEGER (0..4095), + currentSFN-r9 BIT STRING (SIZE (10)) +} + +PLMN-IdentityList2 ::= SEQUENCE (SIZE (1..5)) OF PLMN-Identity + +AdditionalSI-Info-r9 ::= SEQUENCE { + csg-MemberStatus-r9 ENUMERATED {member} OPTIONAL, + csg-Identity-r9 CSG-Identity OPTIONAL +} +MeasResultForRSSI-r13 ::= SEQUENCE { + rssi-Result-r13 RSSI-Range-r13, + channelOccupancy-r13 INTEGER (0..100), + ... +} + +UL-PDCP-DelayResultList-r13 ::= SEQUENCE (SIZE (1..maxQCI-r13)) OF UL-PDCP-DelayResult-r13 + + +UL-PDCP-DelayResult-r13 ::= SEQUENCE { + qci-Id-r13 ENUMERATED {qci1, qci2, qci3, qci4, spare4, spare3, spare2, spare1}, + excessDelay-r13 INTEGER (0..31), + ... +} + + +MeasResultSSTD-r13 ::= SEQUENCE { + sfn-OffsetResult-r13 INTEGER (0..1023), + frameBoundaryOffsetResult-r13 INTEGER (-5..4), + subframeBoundaryOffsetResult-r13 INTEGER (0..127) +} + + +MeasScaleFactor-r12 ::= ENUMERATED {sf-EUTRA-cf1, sf-EUTRA-cf2} + + +QuantityConfig ::= SEQUENCE { + quantityConfigEUTRA QuantityConfigEUTRA OPTIONAL, -- Need ON + quantityConfigUTRA QuantityConfigUTRA OPTIONAL, -- Need ON + quantityConfigGERAN QuantityConfigGERAN OPTIONAL, -- Need ON + quantityConfigCDMA2000 QuantityConfigCDMA2000 OPTIONAL, -- Need ON + ..., + [[ quantityConfigUTRA-v1020 QuantityConfigUTRA-v1020 OPTIONAL -- Need ON + ]], + [[ quantityConfigEUTRA-v1250 QuantityConfigEUTRA-v1250 OPTIONAL -- Need ON + ]], + [[ quantityConfigEUTRA-v1310 QuantityConfigEUTRA-v1310 OPTIONAL, -- Need ON + quantityConfigWLAN-r13 QuantityConfigWLAN-r13 OPTIONAL -- Need ON + ]] +} + +QuantityConfigEUTRA ::= SEQUENCE { + filterCoefficientRSRP FilterCoefficient DEFAULT fc4, + filterCoefficientRSRQ FilterCoefficient DEFAULT fc4 +} + +QuantityConfigEUTRA-v1250 ::= SEQUENCE { + filterCoefficientCSI-RSRP-r12 FilterCoefficient OPTIONAL -- Need OR +} + +QuantityConfigEUTRA-v1310 ::= SEQUENCE { + filterCoefficientRS-SINR-r13 FilterCoefficient DEFAULT fc4 +} + +QuantityConfigUTRA ::= SEQUENCE { + measQuantityUTRA-FDD ENUMERATED {cpich-RSCP, cpich-EcN0}, + measQuantityUTRA-TDD ENUMERATED {pccpch-RSCP}, + filterCoefficient FilterCoefficient DEFAULT fc4 +} + +QuantityConfigUTRA-v1020 ::= SEQUENCE { + filterCoefficient2-FDD-r10 FilterCoefficient DEFAULT fc4 +} + +QuantityConfigGERAN ::= SEQUENCE { + measQuantityGERAN ENUMERATED {rssi}, + filterCoefficient FilterCoefficient DEFAULT fc2 +} + +QuantityConfigCDMA2000 ::= SEQUENCE { + measQuantityCDMA2000 ENUMERATED {pilotStrength, pilotPnPhaseAndPilotStrength} +} + +QuantityConfigWLAN-r13 ::= SEQUENCE { + measQuantityWLAN-r13 ENUMERATED {rssiWLAN}, + filterCoefficient-r13 FilterCoefficient DEFAULT fc4 +} + + +ReportConfigEUTRA ::= SEQUENCE { + triggerType CHOICE { + event SEQUENCE { + eventId CHOICE { + eventA1 SEQUENCE { + a1-Threshold ThresholdEUTRA + }, + eventA2 SEQUENCE { + a2-Threshold ThresholdEUTRA + }, + eventA3 SEQUENCE { + a3-Offset INTEGER (-30..30), + reportOnLeave BOOLEAN + }, + eventA4 SEQUENCE { + a4-Threshold ThresholdEUTRA + }, + eventA5 SEQUENCE { + a5-Threshold1 ThresholdEUTRA, + a5-Threshold2 ThresholdEUTRA + }, + ..., + eventA6-r10 SEQUENCE { + a6-Offset-r10 INTEGER (-30..30), + a6-ReportOnLeave-r10 BOOLEAN + }, + eventC1-r12 SEQUENCE { + c1-Threshold-r12 ThresholdEUTRA-v1250, + c1-ReportOnLeave-r12 BOOLEAN + }, + eventC2-r12 SEQUENCE { + c2-RefCSI-RS-r12 MeasCSI-RS-Id-r12, + c2-Offset-r12 INTEGER (-30..30), + c2-ReportOnLeave-r12 BOOLEAN + }, + eventV1-r14 SEQUENCE { + v1-Threshold-r14 SL-CBR-r14 + }, + eventV2-r14 SEQUENCE { + v2-Threshold-r14 SL-CBR-r14 + } + }, + hysteresis Hysteresis, + timeToTrigger TimeToTrigger + }, + periodical SEQUENCE { + purpose ENUMERATED { + reportStrongestCells, reportCGI} + } + }, + triggerQuantity ENUMERATED {rsrp, rsrq}, + reportQuantity ENUMERATED {sameAsTriggerQuantity, both}, + maxReportCells INTEGER (1..maxCellReport), + reportInterval ReportInterval, + reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity}, + ..., + [[ si-RequestForHO-r9 ENUMERATED {setup} OPTIONAL, -- Cond reportCGI + ue-RxTxTimeDiffPeriodical-r9 ENUMERATED {setup} OPTIONAL -- Need OR + ]], + [[ includeLocationInfo-r10 ENUMERATED {true} OPTIONAL, -- Need OR + reportAddNeighMeas-r10 ENUMERATED {setup} OPTIONAL -- Need OR + ]], + [[ alternativeTimeToTrigger-r12 CHOICE { + release NULL, + setup TimeToTrigger + } OPTIONAL, -- Need ON + useT312-r12 BOOLEAN OPTIONAL, -- Need ON + usePSCell-r12 BOOLEAN OPTIONAL, -- Need ON + aN-Threshold1-v1250 RSRQ-RangeConfig-r12 OPTIONAL, -- Need ON + a5-Threshold2-v1250 RSRQ-RangeConfig-r12 OPTIONAL, -- Need ON + reportStrongestCSI-RSs-r12 BOOLEAN OPTIONAL, -- Need ON + reportCRS-Meas-r12 BOOLEAN OPTIONAL, -- Need ON + triggerQuantityCSI-RS-r12 BOOLEAN OPTIONAL -- Need ON + ]], + [[ reportSSTD-Meas-r13 BOOLEAN OPTIONAL, -- Need ON + rs-sinr-Config-r13 CHOICE { + release NULL, + setup SEQUENCE { + triggerQuantity-v1310 ENUMERATED {sinr} OPTIONAL, -- Need ON + aN-Threshold1-r13 RS-SINR-Range-r13 OPTIONAL, -- Need ON + a5-Threshold2-r13 RS-SINR-Range-r13 OPTIONAL, -- Need ON + reportQuantity-v1310 ENUMERATED {rsrpANDsinr, rsrqANDsinr, all} + } + } OPTIONAL, -- Need ON + useWhiteCellList-r13 BOOLEAN OPTIONAL, -- Need ON + measRSSI-ReportConfig-r13 MeasRSSI-ReportConfig-r13 OPTIONAL, -- Need ON + includeMultiBandInfo-r13 ENUMERATED {true} OPTIONAL, -- Cond reportCGI + ul-DelayConfig-r13 UL-DelayConfig-r13 OPTIONAL -- Need ON + ]], + [[ ue-RxTxTimeDiffPeriodicalTDD-r13 BOOLEAN OPTIONAL -- Need ON + ]], + [[ + purpose-v1430 ENUMERATED {reportLocation, sidelink, spare2, spare1} + OPTIONAL -- Need ON + ]] +} + +RSRQ-RangeConfig-r12 ::= CHOICE { + release NULL, + setup RSRQ-Range-v1250 +} + +ThresholdEUTRA ::= CHOICE{ + threshold-RSRP RSRP-Range, + threshold-RSRQ RSRQ-Range +} + +ThresholdEUTRA-v1250 ::= CSI-RSRP-Range-r12 + +MeasRSSI-ReportConfig-r13 ::= SEQUENCE { + channelOccupancyThreshold-r13 RSSI-Range-r13 OPTIONAL -- Need OR +} + + +ReportConfigId ::= INTEGER (1..maxReportConfigId) + + +ReportConfigInterRAT ::= SEQUENCE { + triggerType CHOICE { + event SEQUENCE { + eventId CHOICE { + eventB1 SEQUENCE { + b1-Threshold CHOICE { + b1-ThresholdUTRA ThresholdUTRA, + b1-ThresholdGERAN ThresholdGERAN, + b1-ThresholdCDMA2000 ThresholdCDMA2000 + } + }, + eventB2 SEQUENCE { + b2-Threshold1 ThresholdEUTRA, + b2-Threshold2 CHOICE { + b2-Threshold2UTRA ThresholdUTRA, + b2-Threshold2GERAN ThresholdGERAN, + b2-Threshold2CDMA2000 ThresholdCDMA2000 + } + }, + ..., + eventW1-r13 SEQUENCE { + w1-Threshold-r13 WLAN-RSSI-Range-r13 + }, + eventW2-r13 SEQUENCE { + w2-Threshold1-r13 WLAN-RSSI-Range-r13, + w2-Threshold2-r13 WLAN-RSSI-Range-r13 + }, + eventW3-r13 SEQUENCE { + w3-Threshold-r13 WLAN-RSSI-Range-r13 + } + }, + hysteresis Hysteresis, + timeToTrigger TimeToTrigger + }, + periodical SEQUENCE { + purpose ENUMERATED { + reportStrongestCells, + reportStrongestCellsForSON, + reportCGI} + } + }, + maxReportCells INTEGER (1..maxCellReport), + reportInterval ReportInterval, + reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity}, + ..., + [[ si-RequestForHO-r9 ENUMERATED {setup} OPTIONAL -- Cond reportCGI + ]], + [[ reportQuantityUTRA-FDD-r10 ENUMERATED {both} OPTIONAL -- Need OR + ]], + [[ includeLocationInfo-r11 BOOLEAN OPTIONAL -- Need ON + ]], + [[ b2-Threshold1-v1250 CHOICE { + release NULL, + setup RSRQ-Range-v1250 + } OPTIONAL -- Need ON + ]], + [[ reportQuantityWLAN-r13 ReportQuantityWLAN-r13 OPTIONAL -- Need ON + ]], + [[ reportAnyWLAN-r14 BOOLEAN OPTIONAL -- Need ON + ]] +} + +ThresholdUTRA ::= CHOICE{ + utra-RSCP INTEGER (-5..91), + utra-EcN0 INTEGER (0..49) +} + +ThresholdGERAN ::= INTEGER (0..63) + +ThresholdCDMA2000 ::= INTEGER (0..63) + +ReportQuantityWLAN-r13 ::= SEQUENCE { + bandRequestWLAN-r13 ENUMERATED {true} OPTIONAL, -- Need OR + carrierInfoRequestWLAN-r13 ENUMERATED {true} OPTIONAL, -- Need OR + availableAdmissionCapacityRequestWLAN-r13 ENUMERATED {true} OPTIONAL, -- Need OR + backhaulDL-BandwidthRequestWLAN-r13 ENUMERATED {true} OPTIONAL, -- Need OR + backhaulUL-BandwidthRequestWLAN-r13 ENUMERATED {true} OPTIONAL, -- Need OR + channelUtilizationRequestWLAN-r13 ENUMERATED {true} OPTIONAL, -- Need OR + stationCountRequestWLAN-r13 ENUMERATED {true} OPTIONAL, -- Need OR + ... +} + + +ReportConfigToAddModList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigToAddMod + +ReportConfigToAddMod ::= SEQUENCE { + reportConfigId ReportConfigId, + reportConfig CHOICE { + reportConfigEUTRA ReportConfigEUTRA, + reportConfigInterRAT ReportConfigInterRAT + } +} + + + +ReportInterval ::= ENUMERATED { + ms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, + min1, min6, min12, min30, min60, spare3, spare2, spare1} + + +RSRP-Range ::= INTEGER(0..97) + +RSRP-Range-v1360 ::= INTEGER(-17..-1) + +RSRP-RangeSL-r12 ::= INTEGER(0..13) + +RSRP-RangeSL2-r12 ::= INTEGER(0..7) + +RSRP-RangeSL3-r12 ::= INTEGER(0..11) + +RSRP-RangeSL4-r13 ::= INTEGER(0..49) + + +RSRQ-Range ::= INTEGER(0..34) + +RSRQ-Range-v1250 ::= INTEGER(-30..46) + +RSRQ-Range-r13 ::= INTEGER(-30..46) + + +RSRQ-Type-r12 ::= SEQUENCE { + allSymbols-r12 BOOLEAN, + wideBand-r12 BOOLEAN +} + + +RS-SINR-Range-r13 ::= INTEGER(0..127) + + +RSSI-Range-r13 ::= INTEGER(0..76) + + +TimeToTrigger ::= ENUMERATED { + ms0, ms40, ms64, ms80, ms100, ms128, ms160, ms256, + ms320, ms480, ms512, ms640, ms1024, ms1280, ms2560, + ms5120} + + +UL-DelayConfig-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + delayThreshold-r13 ENUMERATED { + ms30, ms40, ms50, ms60, ms70, ms80, + ms90,ms100, ms150, ms300, ms500, ms750, spare4, spare3, spare2, spare1} + } +} + + +WLAN-CarrierInfo-r13 ::= SEQUENCE { + operatingClass-r13 INTEGER (0..255) OPTIONAL, -- Need ON + countryCode-r13 ENUMERATED {unitedStates, europe, japan, global, ...} OPTIONAL, -- Need ON + channelNumbers-r13 WLAN-ChannelList-r13 OPTIONAL, -- Need ON + ... +} + +WLAN-ChannelList-r13 ::= SEQUENCE (SIZE (1..maxWLAN-Channels-r13)) OF WLAN-Channel-r13 + +WLAN-Channel-r13 ::= INTEGER(0..255) + + +WLAN-RSSI-Range-r13 ::= INTEGER(0..141) + + +WLAN-Status-r13 ::= ENUMERATED {successfulAssociation, failureWlanRadioLink, failureWlanUnavailable, failureTimeout} + +WLAN-Status-v1430 ::= ENUMERATED {suspended, resumed} + + +WLAN-SuspendConfig-r14 ::= SEQUENCE { + wlan-SuspendResumeAllowed-r14 BOOLEAN OPTIONAL, -- Need ON + wlan-SuspendTriggersStatusReport-r14 BOOLEAN OPTIONAL -- Need ON +} + + +AbsoluteTimeInfo-r10 ::= BIT STRING (SIZE (48)) + + +AreaConfiguration-r10 ::= CHOICE { + cellGlobalIdList-r10 CellGlobalIdList-r10, + trackingAreaCodeList-r10 TrackingAreaCodeList-r10 +} + +AreaConfiguration-v1130 ::= SEQUENCE { + trackingAreaCodeList-v1130 TrackingAreaCodeList-v1130 +} + +CellGlobalIdList-r10 ::= SEQUENCE (SIZE (1..32)) OF CellGlobalIdEUTRA + +TrackingAreaCodeList-r10 ::= SEQUENCE (SIZE (1..8)) OF TrackingAreaCode + +TrackingAreaCodeList-v1130 ::= SEQUENCE { + plmn-Identity-perTAC-List-r11 SEQUENCE (SIZE (1..8)) OF PLMN-Identity +} + + +BandCombinationList-r14 ::= SEQUENCE (SIZE (1..maxBandComb-r13)) OF BandCombination-r14 + +BandCombination-r14 ::= SEQUENCE (SIZE (1..maxSimultaneousBands-r10)) OF BandIndication-r14 + +BandIndication-r14 ::= SEQUENCE { + bandEUTRA-r14 FreqBandIndicator-r11, + ca-BandwidthClassDL-r14 CA-BandwidthClass-r10, + ca-BandwidthClassUL-r14 CA-BandwidthClass-r10 OPTIONAL +} + + +C-RNTI ::= BIT STRING (SIZE (16)) + + +DedicatedInfoCDMA2000 ::= OCTET STRING + + +DedicatedInfoNAS ::= OCTET STRING + + +FilterCoefficient ::= ENUMERATED { + fc0, fc1, fc2, fc3, fc4, fc5, + fc6, fc7, fc8, fc9, fc11, fc13, + fc15, fc17, fc19, spare1, ...} + + +LoggingDuration-r10 ::= ENUMERATED { + min10, min20, min40, min60, min90, min120, spare2, spare1} + + +LoggingInterval-r10 ::= ENUMERATED { + ms1280, ms2560, ms5120, ms10240, ms20480, + ms30720, ms40960, ms61440} + + +MeasSubframePattern-r10 ::= CHOICE { + subframePatternFDD-r10 BIT STRING (SIZE (40)), + subframePatternTDD-r10 CHOICE { + subframeConfig1-5-r10 BIT STRING (SIZE (20)), + subframeConfig0-r10 BIT STRING (SIZE (70)), + subframeConfig6-r10 BIT STRING (SIZE (60)), + ... + }, + ... +} + + +MMEC ::= BIT STRING (SIZE (8)) + + +NeighCellConfig ::= BIT STRING (SIZE (2)) + + +OtherConfig-r9 ::= SEQUENCE { + reportProximityConfig-r9 ReportProximityConfig-r9 OPTIONAL, -- Need ON + ..., + [[ idc-Config-r11 IDC-Config-r11 OPTIONAL, -- Need ON + powerPrefIndicationConfig-r11 PowerPrefIndicationConfig-r11 OPTIONAL, -- Need ON + obtainLocationConfig-r11 ObtainLocationConfig-r11 OPTIONAL -- Need ON + ]], + [[ powerPrefIndicationTimer-r11 ENUMERATED {s0, s0dot5, s1, s2, s5, s10, s20, + s30, s60, s90, s120, s300, s600, spare3, + spare2, spare1} OPTIONAL, -- Need OR + sps-AssistanceInfoReport-r14 BOOLEAN OPTIONAL, -- Need ON + delayBudgetReportingConfig-r14 CHOICE{ + release NULL, + setup SEQUENCE{ + delayBudgetReportingProhibitTimer-r14 ENUMERATED { + s0, s0dot4, s0dot8, + s1dot6, s3, s6, s12, s30} + } + } OPTIONAL, -- Need ON + rlm-ReportConfig-r14 CHOICE { + release NULL, + setup SEQUENCE{ + rlmReportTimer-r14 ENUMERATED {s0, s0dot5, s1, s2, s5, s10, s20, s30, + s60, s90, s120, s300, s600, spare3, spare2, spare1}, + rlmReportRep-MPDCCH-r14 ENUMERATED {setup} OPTIONAL -- Need OR + } + } OPTIONAL -- Need ON + ]] +} + +IDC-Config-r11 ::= SEQUENCE { + idc-Indication-r11 ENUMERATED {setup} OPTIONAL, -- Need OR + autonomousDenialParameters-r11 SEQUENCE { + autonomousDenialSubframes-r11 ENUMERATED {n2, n5, n10, n15, + n20, n30, spare2, spare1}, + autonomousDenialValidity-r11 ENUMERATED { + sf200, sf500, sf1000, sf2000, + spare4, spare3, spare2, spare1} + } OPTIONAL, -- Need OR + ..., + [[ idc-Indication-UL-CA-r11 ENUMERATED {setup} OPTIONAL -- Cond idc-Ind + ]], + [[ idc-HardwareSharingIndication-r13 ENUMERATED {setup} OPTIONAL -- Need OR + ]] +} + +ObtainLocationConfig-r11 ::= SEQUENCE { + obtainLocation-r11 ENUMERATED {setup} OPTIONAL -- Need OR +} + +PowerPrefIndicationConfig-r11 ::= CHOICE{ + release NULL, + setup SEQUENCE{ + powerPrefIndicationTimer-r11 ENUMERATED {s0, s0dot5, s1, s2, s5, s10, s20, + s30, s60, s90, s120, s300, s600, spare3, + spare2, spare1} + } +} + +ReportProximityConfig-r9 ::= SEQUENCE { + proximityIndicationEUTRA-r9 ENUMERATED {enabled} OPTIONAL, -- Need OR + proximityIndicationUTRA-r9 ENUMERATED {enabled} OPTIONAL -- Need OR +} + + +RAND-CDMA2000 ::= BIT STRING (SIZE (32)) + + +RAT-Type ::= ENUMERATED { + eutra, utra, geran-cs, geran-ps, cdma2000-1XRTT, + spare3, spare2, spare1, ...} + + +ResumeIdentity-r13 ::= BIT STRING (SIZE(40)) + + +RRC-TransactionIdentifier ::= INTEGER (0..3) + + +S-TMSI ::= SEQUENCE { + mmec MMEC, + m-TMSI BIT STRING (SIZE (32)) +} + + +TraceReference-r10 ::= SEQUENCE { + plmn-Identity-r10 PLMN-Identity, + traceId-r10 OCTET STRING (SIZE (3)) +} + + +UE-CapabilityRAT-ContainerList ::=SEQUENCE (SIZE (0..maxRAT-Capabilities)) OF UE-CapabilityRAT-Container + +UE-CapabilityRAT-Container ::= SEQUENCE { + rat-Type RAT-Type, + ueCapabilityRAT-Container OCTET STRING +} + + +UE-EUTRA-Capability ::= SEQUENCE { + accessStratumRelease AccessStratumRelease, + ue-Category INTEGER (1..5), + pdcp-Parameters PDCP-Parameters, + phyLayerParameters PhyLayerParameters, + rf-Parameters RF-Parameters, + measParameters MeasParameters, + featureGroupIndicators BIT STRING (SIZE (32)) OPTIONAL, + interRAT-Parameters SEQUENCE { + utraFDD IRAT-ParametersUTRA-FDD OPTIONAL, + utraTDD128 IRAT-ParametersUTRA-TDD128 OPTIONAL, + utraTDD384 IRAT-ParametersUTRA-TDD384 OPTIONAL, + utraTDD768 IRAT-ParametersUTRA-TDD768 OPTIONAL, + geran IRAT-ParametersGERAN OPTIONAL, + cdma2000-HRPD IRAT-ParametersCDMA2000-HRPD OPTIONAL, + cdma2000-1xRTT IRAT-ParametersCDMA2000-1XRTT OPTIONAL + }, + nonCriticalExtension UE-EUTRA-Capability-v920-IEs OPTIONAL +} + +-- Late non critical extensions +UE-EUTRA-Capability-v9a0-IEs ::= SEQUENCE { + featureGroupIndRel9Add-r9 BIT STRING (SIZE (32)) OPTIONAL, + fdd-Add-UE-EUTRA-Capabilities-r9 UE-EUTRA-CapabilityAddXDD-Mode-r9 OPTIONAL, + tdd-Add-UE-EUTRA-Capabilities-r9 UE-EUTRA-CapabilityAddXDD-Mode-r9 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v9c0-IEs OPTIONAL +} + +UE-EUTRA-Capability-v9c0-IEs ::= SEQUENCE { + interRAT-ParametersUTRA-v9c0 IRAT-ParametersUTRA-v9c0 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v9d0-IEs OPTIONAL +} + +UE-EUTRA-Capability-v9d0-IEs ::= SEQUENCE { + phyLayerParameters-v9d0 PhyLayerParameters-v9d0 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v9e0-IEs OPTIONAL +} + +UE-EUTRA-Capability-v9e0-IEs ::= SEQUENCE { + rf-Parameters-v9e0 RF-Parameters-v9e0 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v9h0-IEs OPTIONAL +} + +UE-EUTRA-Capability-v9h0-IEs ::= SEQUENCE { + interRAT-ParametersUTRA-v9h0 IRAT-ParametersUTRA-v9h0 OPTIONAL, + -- Following field is only to be used for late REL-9 extensions + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v10c0-IEs OPTIONAL +} + +UE-EUTRA-Capability-v10c0-IEs ::= SEQUENCE { + otdoa-PositioningCapabilities-r10 OTDOA-PositioningCapabilities-r10 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v10f0-IEs OPTIONAL +} + +UE-EUTRA-Capability-v10f0-IEs ::= SEQUENCE { + rf-Parameters-v10f0 RF-Parameters-v10f0 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v10i0-IEs OPTIONAL +} + +UE-EUTRA-Capability-v10i0-IEs ::= SEQUENCE { + rf-Parameters-v10i0 RF-Parameters-v10i0 OPTIONAL, + -- Following field is only to be used for late REL-10 extensions + lateNonCriticalExtension OCTET STRING (CONTAINING UE-EUTRA-Capability-v10j0-IEs) OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v11d0-IEs OPTIONAL +} + +UE-EUTRA-Capability-v10j0-IEs ::= SEQUENCE { + rf-Parameters-v10j0 RF-Parameters-v10j0 OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +UE-EUTRA-Capability-v11d0-IEs ::= SEQUENCE { + rf-Parameters-v11d0 RF-Parameters-v11d0 OPTIONAL, + otherParameters-v11d0 Other-Parameters-v11d0 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v11x0-IEs OPTIONAL +} + +UE-EUTRA-Capability-v11x0-IEs ::= SEQUENCE { + -- Following field is only to be used for late REL-11 extensions + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v12b0-IEs OPTIONAL +} + +UE-EUTRA-Capability-v12b0-IEs ::= SEQUENCE { + rf-Parameters-v12b0 RF-Parameters-v12b0 OPTIONAL, + -- Following field is only to be used for late REL-12 extensions + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +-- Regular non critical extensions +UE-EUTRA-Capability-v920-IEs ::= SEQUENCE { + phyLayerParameters-v920 PhyLayerParameters-v920, + interRAT-ParametersGERAN-v920 IRAT-ParametersGERAN-v920, + interRAT-ParametersUTRA-v920 IRAT-ParametersUTRA-v920 OPTIONAL, + interRAT-ParametersCDMA2000-v920 IRAT-ParametersCDMA2000-1XRTT-v920 OPTIONAL, + deviceType-r9 ENUMERATED {noBenFromBatConsumpOpt} OPTIONAL, + csg-ProximityIndicationParameters-r9 CSG-ProximityIndicationParameters-r9, + neighCellSI-AcquisitionParameters-r9 NeighCellSI-AcquisitionParameters-r9, + son-Parameters-r9 SON-Parameters-r9, + nonCriticalExtension UE-EUTRA-Capability-v940-IEs OPTIONAL +} + +UE-EUTRA-Capability-v940-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING (CONTAINING UE-EUTRA-Capability-v9a0-IEs) + OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1020-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1020-IEs ::= SEQUENCE { + ue-Category-v1020 INTEGER (6..8) OPTIONAL, + phyLayerParameters-v1020 PhyLayerParameters-v1020 OPTIONAL, + rf-Parameters-v1020 RF-Parameters-v1020 OPTIONAL, + measParameters-v1020 MeasParameters-v1020 OPTIONAL, + featureGroupIndRel10-r10 BIT STRING (SIZE (32)) OPTIONAL, + interRAT-ParametersCDMA2000-v1020 IRAT-ParametersCDMA2000-1XRTT-v1020 OPTIONAL, + ue-BasedNetwPerfMeasParameters-r10 UE-BasedNetwPerfMeasParameters-r10 OPTIONAL, + interRAT-ParametersUTRA-TDD-v1020 IRAT-ParametersUTRA-TDD-v1020 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1060-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1060-IEs ::= SEQUENCE { + fdd-Add-UE-EUTRA-Capabilities-v1060 UE-EUTRA-CapabilityAddXDD-Mode-v1060 OPTIONAL, + tdd-Add-UE-EUTRA-Capabilities-v1060 UE-EUTRA-CapabilityAddXDD-Mode-v1060 OPTIONAL, + rf-Parameters-v1060 RF-Parameters-v1060 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1090-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1090-IEs ::= SEQUENCE { + rf-Parameters-v1090 RF-Parameters-v1090 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1130-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1130-IEs ::= SEQUENCE { + pdcp-Parameters-v1130 PDCP-Parameters-v1130, + phyLayerParameters-v1130 PhyLayerParameters-v1130 OPTIONAL, + rf-Parameters-v1130 RF-Parameters-v1130, + measParameters-v1130 MeasParameters-v1130, + interRAT-ParametersCDMA2000-v1130 IRAT-ParametersCDMA2000-v1130, + otherParameters-r11 Other-Parameters-r11, + fdd-Add-UE-EUTRA-Capabilities-v1130 UE-EUTRA-CapabilityAddXDD-Mode-v1130 OPTIONAL, + tdd-Add-UE-EUTRA-Capabilities-v1130 UE-EUTRA-CapabilityAddXDD-Mode-v1130 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1170-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1170-IEs ::= SEQUENCE { + phyLayerParameters-v1170 PhyLayerParameters-v1170 OPTIONAL, + ue-Category-v1170 INTEGER (9..10) OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1180-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1180-IEs ::= SEQUENCE { + rf-Parameters-v1180 RF-Parameters-v1180 OPTIONAL, + mbms-Parameters-r11 MBMS-Parameters-r11 OPTIONAL, + fdd-Add-UE-EUTRA-Capabilities-v1180 UE-EUTRA-CapabilityAddXDD-Mode-v1180 OPTIONAL, + tdd-Add-UE-EUTRA-Capabilities-v1180 UE-EUTRA-CapabilityAddXDD-Mode-v1180 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v11a0-IEs OPTIONAL +} + +UE-EUTRA-Capability-v11a0-IEs ::= SEQUENCE { + ue-Category-v11a0 INTEGER (11..12) OPTIONAL, + measParameters-v11a0 MeasParameters-v11a0 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1250-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1250-IEs ::= SEQUENCE { + phyLayerParameters-v1250 PhyLayerParameters-v1250 OPTIONAL, + rf-Parameters-v1250 RF-Parameters-v1250 OPTIONAL, + rlc-Parameters-r12 RLC-Parameters-r12 OPTIONAL, + ue-BasedNetwPerfMeasParameters-v1250 UE-BasedNetwPerfMeasParameters-v1250 OPTIONAL, + ue-CategoryDL-r12 INTEGER (0..14) OPTIONAL, + ue-CategoryUL-r12 INTEGER (0..13) OPTIONAL, + wlan-IW-Parameters-r12 WLAN-IW-Parameters-r12 OPTIONAL, + measParameters-v1250 MeasParameters-v1250 OPTIONAL, + dc-Parameters-r12 DC-Parameters-r12 OPTIONAL, + mbms-Parameters-v1250 MBMS-Parameters-v1250 OPTIONAL, + mac-Parameters-r12 MAC-Parameters-r12 OPTIONAL, + fdd-Add-UE-EUTRA-Capabilities-v1250 UE-EUTRA-CapabilityAddXDD-Mode-v1250 OPTIONAL, + tdd-Add-UE-EUTRA-Capabilities-v1250 UE-EUTRA-CapabilityAddXDD-Mode-v1250 OPTIONAL, + sl-Parameters-r12 SL-Parameters-r12 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1260-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1260-IEs ::= SEQUENCE { + ue-CategoryDL-v1260 INTEGER (15..16) OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1270-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1270-IEs ::= SEQUENCE { + rf-Parameters-v1270 RF-Parameters-v1270 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1280-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1280-IEs ::= SEQUENCE { + phyLayerParameters-v1280 PhyLayerParameters-v1280 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1310-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1310-IEs ::= SEQUENCE { + ue-CategoryDL-v1310 ENUMERATED {n17, m1} OPTIONAL, + ue-CategoryUL-v1310 ENUMERATED {n14, m1} OPTIONAL, + pdcp-Parameters-v1310 PDCP-Parameters-v1310, + rlc-Parameters-v1310 RLC-Parameters-v1310, + mac-Parameters-v1310 MAC-Parameters-v1310 OPTIONAL, + phyLayerParameters-v1310 PhyLayerParameters-v1310 OPTIONAL, + rf-Parameters-v1310 RF-Parameters-v1310 OPTIONAL, + measParameters-v1310 MeasParameters-v1310 OPTIONAL, + dc-Parameters-v1310 DC-Parameters-v1310 OPTIONAL, + sl-Parameters-v1310 SL-Parameters-v1310 OPTIONAL, + scptm-Parameters-r13 SCPTM-Parameters-r13 OPTIONAL, + ce-Parameters-r13 CE-Parameters-r13 OPTIONAL, + interRAT-ParametersWLAN-r13 IRAT-ParametersWLAN-r13, + laa-Parameters-r13 LAA-Parameters-r13 OPTIONAL, + lwa-Parameters-r13 LWA-Parameters-r13 OPTIONAL, + wlan-IW-Parameters-v1310 WLAN-IW-Parameters-v1310, + lwip-Parameters-r13 LWIP-Parameters-r13, + fdd-Add-UE-EUTRA-Capabilities-v1310 UE-EUTRA-CapabilityAddXDD-Mode-v1310 OPTIONAL, + tdd-Add-UE-EUTRA-Capabilities-v1310 UE-EUTRA-CapabilityAddXDD-Mode-v1310 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1320-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1320-IEs ::= SEQUENCE { + ce-Parameters-v1320 CE-Parameters-v1320 OPTIONAL, + phyLayerParameters-v1320 PhyLayerParameters-v1320 OPTIONAL, + rf-Parameters-v1320 RF-Parameters-v1320 OPTIONAL, + fdd-Add-UE-EUTRA-Capabilities-v1320 UE-EUTRA-CapabilityAddXDD-Mode-v1320 OPTIONAL, + tdd-Add-UE-EUTRA-Capabilities-v1320 UE-EUTRA-CapabilityAddXDD-Mode-v1320 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1330-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1330-IEs ::= SEQUENCE { + ue-CategoryDL-v1330 INTEGER (18..19) OPTIONAL, + phyLayerParameters-v1330 PhyLayerParameters-v1330 OPTIONAL, + ue-CE-NeedULGaps-r13 ENUMERATED {true} OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1340-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1340-IEs ::= SEQUENCE { + ue-CategoryUL-v1340 INTEGER (15) OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1350-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1350-IEs ::= SEQUENCE { + ue-CategoryDL-v1350 ENUMERATED {oneBis} OPTIONAL, + ue-CategoryUL-v1350 ENUMERATED {oneBis} OPTIONAL, + ce-Parameters-v1350 CE-Parameters-v1350, + nonCriticalExtension UE-EUTRA-Capability-v1360-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1360-IEs ::= SEQUENCE { + other-Parameters-v1360 Other-Parameters-v1360 OPTIONAL, + nonCriticalExtension UE-EUTRA-Capability-v1430-IEs OPTIONAL +} + +UE-EUTRA-Capability-v1430-IEs ::= SEQUENCE { + phyLayerParameters-v1430 PhyLayerParameters-v1430, + ue-CategoryDL-v1430 ENUMERATED {m2} OPTIONAL, + ue-CategoryUL-v1430 ENUMERATED {n16, n17, n18, n19, n20, m2} OPTIONAL, + ue-CategoryUL-v1430b ENUMERATED {n21} OPTIONAL, + mac-Parameters-v1430 MAC-Parameters-v1430 OPTIONAL, + measParameters-v1430 MeasParameters-v1430 OPTIONAL, + pdcp-Parameters-v1430 PDCP-Parameters-v1430 OPTIONAL, + rlc-Parameters-v1430 RLC-Parameters-v1430, + rf-Parameters-v1430 RF-Parameters-v1430 OPTIONAL, + laa-Parameters-v1430 LAA-Parameters-v1430 OPTIONAL, + lwa-Parameters-v1430 LWA-Parameters-v1430 OPTIONAL, + lwip-Parameters-v1430 LWIP-Parameters-v1430 OPTIONAL, + otherParameters-v1430 Other-Parameters-v1430, + mmtel-Parameters-r14 MMTEL-Parameters-r14 OPTIONAL, + mobilityParameters-r14 MobilityParameters-r14 OPTIONAL, + ce-Parameters-v1430 CE-Parameters-v1430, + fdd-Add-UE-EUTRA-Capabilities-v1430 UE-EUTRA-CapabilityAddXDD-Mode-v1430 OPTIONAL, + tdd-Add-UE-EUTRA-Capabilities-v1430 UE-EUTRA-CapabilityAddXDD-Mode-v1430 OPTIONAL, + mbms-Parameters-v1430 MBMS-Parameters-v1430 OPTIONAL, + sl-Parameters-v1430 SL-Parameters-v1430 OPTIONAL, + ue-BasedNetwPerfMeasParameters-v1430 UE-BasedNetwPerfMeasParameters-v1430 OPTIONAL, + highSpeedEnhParameters-r14 HighSpeedEnhParameters-r14 OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +UE-EUTRA-CapabilityAddXDD-Mode-r9 ::= SEQUENCE { + phyLayerParameters-r9 PhyLayerParameters OPTIONAL, + featureGroupIndicators-r9 BIT STRING (SIZE (32)) OPTIONAL, + featureGroupIndRel9Add-r9 BIT STRING (SIZE (32)) OPTIONAL, + interRAT-ParametersGERAN-r9 IRAT-ParametersGERAN OPTIONAL, + interRAT-ParametersUTRA-r9 IRAT-ParametersUTRA-v920 OPTIONAL, + interRAT-ParametersCDMA2000-r9 IRAT-ParametersCDMA2000-1XRTT-v920 OPTIONAL, + neighCellSI-AcquisitionParameters-r9 NeighCellSI-AcquisitionParameters-r9 OPTIONAL, + ... +} + +UE-EUTRA-CapabilityAddXDD-Mode-v1060 ::= SEQUENCE { + phyLayerParameters-v1060 PhyLayerParameters-v1020 OPTIONAL, + featureGroupIndRel10-v1060 BIT STRING (SIZE (32)) OPTIONAL, + interRAT-ParametersCDMA2000-v1060 IRAT-ParametersCDMA2000-1XRTT-v1020 OPTIONAL, + interRAT-ParametersUTRA-TDD-v1060 IRAT-ParametersUTRA-TDD-v1020 OPTIONAL, + ..., + [[ otdoa-PositioningCapabilities-r10 OTDOA-PositioningCapabilities-r10 OPTIONAL + ]] +} + +UE-EUTRA-CapabilityAddXDD-Mode-v1130 ::= SEQUENCE { + phyLayerParameters-v1130 PhyLayerParameters-v1130 OPTIONAL, + measParameters-v1130 MeasParameters-v1130 OPTIONAL, + otherParameters-r11 Other-Parameters-r11 OPTIONAL, + ... +} + +UE-EUTRA-CapabilityAddXDD-Mode-v1180 ::= SEQUENCE { + mbms-Parameters-r11 MBMS-Parameters-r11 +} + +UE-EUTRA-CapabilityAddXDD-Mode-v1250 ::= SEQUENCE { + phyLayerParameters-v1250 PhyLayerParameters-v1250 OPTIONAL, + measParameters-v1250 MeasParameters-v1250 OPTIONAL +} + +UE-EUTRA-CapabilityAddXDD-Mode-v1310 ::= SEQUENCE { + phyLayerParameters-v1310 PhyLayerParameters-v1310 OPTIONAL +} + +UE-EUTRA-CapabilityAddXDD-Mode-v1320 ::= SEQUENCE { + phyLayerParameters-v1320 PhyLayerParameters-v1320 OPTIONAL, + scptm-Parameters-r13 SCPTM-Parameters-r13 OPTIONAL +} + +UE-EUTRA-CapabilityAddXDD-Mode-v1430 ::= SEQUENCE { + phyLayerParameters-v1430 PhyLayerParameters-v1430 OPTIONAL, + mmtel-Parameters-r14 MMTEL-Parameters-r14 OPTIONAL +} + +AccessStratumRelease ::= ENUMERATED { + rel8, rel9, rel10, rel11, rel12, rel13, + rel14, spare1, ...} + +MobilityParameters-r14 ::= SEQUENCE { + makeBeforeBreak-r14 ENUMERATED {supported} OPTIONAL, + rach-Less-r14 ENUMERATED {supported} OPTIONAL +} + +DC-Parameters-r12 ::= SEQUENCE { + drb-TypeSplit-r12 ENUMERATED {supported} OPTIONAL, + drb-TypeSCG-r12 ENUMERATED {supported} OPTIONAL +} + +DC-Parameters-v1310 ::= SEQUENCE { + pdcp-TransferSplitUL-r13 ENUMERATED {supported} OPTIONAL, + ue-SSTD-Meas-r13 ENUMERATED {supported} OPTIONAL +} + +MAC-Parameters-r12 ::= SEQUENCE { + logicalChannelSR-ProhibitTimer-r12 ENUMERATED {supported} OPTIONAL, + longDRX-Command-r12 ENUMERATED {supported} OPTIONAL +} + +MAC-Parameters-v1310 ::= SEQUENCE { + extendedMAC-LengthField-r13 ENUMERATED {supported} OPTIONAL, + extendedLongDRX-r13 ENUMERATED {supported} OPTIONAL +} + +MAC-Parameters-v1430 ::= SEQUENCE { + shortSPS-IntervalFDD-r14 ENUMERATED {supported} OPTIONAL, + shortSPS-IntervalTDD-r14 ENUMERATED {supported} OPTIONAL, + skipUplinkDynamic-r14 ENUMERATED {supported} OPTIONAL, + skipUplinkSPS-r14 ENUMERATED {supported} OPTIONAL, + multipleUplinkSPS-r14 ENUMERATED {supported} OPTIONAL, + dataInactMon-r14 ENUMERATED {supported} OPTIONAL +} + +RLC-Parameters-r12 ::= SEQUENCE { + extended-RLC-LI-Field-r12 ENUMERATED {supported} +} + +RLC-Parameters-v1310 ::= SEQUENCE { + extendedRLC-SN-SO-Field-r13 ENUMERATED {supported} OPTIONAL +} + +RLC-Parameters-v1430 ::= SEQUENCE { + extendedPollByte-r14 ENUMERATED {supported} OPTIONAL +} + +PDCP-Parameters ::= SEQUENCE { + supportedROHC-Profiles SEQUENCE { + profile0x0001 BOOLEAN, + profile0x0002 BOOLEAN, + profile0x0003 BOOLEAN, + profile0x0004 BOOLEAN, + profile0x0006 BOOLEAN, + profile0x0101 BOOLEAN, + profile0x0102 BOOLEAN, + profile0x0103 BOOLEAN, + profile0x0104 BOOLEAN + }, + maxNumberROHC-ContextSessions ENUMERATED { + cs2, cs4, cs8, cs12, cs16, cs24, cs32, + cs48, cs64, cs128, cs256, cs512, cs1024, + cs16384, spare2, spare1} DEFAULT cs16, + ... +} + +PDCP-Parameters-v1130 ::= SEQUENCE { + pdcp-SN-Extension-r11 ENUMERATED {supported} OPTIONAL, + supportRohcContextContinue-r11 ENUMERATED {supported} OPTIONAL +} + +PDCP-Parameters-v1310 ::= SEQUENCE { + pdcp-SN-Extension-18bits-r13 ENUMERATED {supported} OPTIONAL +} + +PDCP-Parameters-v1430 ::= SEQUENCE { + supportedUplinkOnlyROHC-Profiles-r14 SEQUENCE { + profile0x0006-r14 BOOLEAN + }, + maxNumberROHC-ContextSessions-r14 ENUMERATED { + cs2, cs4, cs8, cs12, cs16, cs24, cs32, + cs48, cs64, cs128, cs256, cs512, cs1024, + cs16384, spare2, spare1} DEFAULT cs16 +} + +PhyLayerParameters ::= SEQUENCE { + ue-TxAntennaSelectionSupported BOOLEAN, + ue-SpecificRefSigsSupported BOOLEAN +} + +PhyLayerParameters-v920 ::= SEQUENCE { + enhancedDualLayerFDD-r9 ENUMERATED {supported} OPTIONAL, + enhancedDualLayerTDD-r9 ENUMERATED {supported} OPTIONAL +} + +PhyLayerParameters-v9d0 ::= SEQUENCE { + tm5-FDD-r9 ENUMERATED {supported} OPTIONAL, + tm5-TDD-r9 ENUMERATED {supported} OPTIONAL +} + +PhyLayerParameters-v1020 ::= SEQUENCE { + twoAntennaPortsForPUCCH-r10 ENUMERATED {supported} OPTIONAL, + tm9-With-8Tx-FDD-r10 ENUMERATED {supported} OPTIONAL, + pmi-Disabling-r10 ENUMERATED {supported} OPTIONAL, + crossCarrierScheduling-r10 ENUMERATED {supported} OPTIONAL, + simultaneousPUCCH-PUSCH-r10 ENUMERATED {supported} OPTIONAL, + multiClusterPUSCH-WithinCC-r10 ENUMERATED {supported} OPTIONAL, + nonContiguousUL-RA-WithinCC-List-r10 NonContiguousUL-RA-WithinCC-List-r10 OPTIONAL +} + +PhyLayerParameters-v1130 ::= SEQUENCE { + crs-InterfHandl-r11 ENUMERATED {supported} OPTIONAL, + ePDCCH-r11 ENUMERATED {supported} OPTIONAL, + multiACK-CSI-Reporting-r11 ENUMERATED {supported} OPTIONAL, + ss-CCH-InterfHandl-r11 ENUMERATED {supported} OPTIONAL, + tdd-SpecialSubframe-r11 ENUMERATED {supported} OPTIONAL, + txDiv-PUCCH1b-ChSelect-r11 ENUMERATED {supported} OPTIONAL, + ul-CoMP-r11 ENUMERATED {supported} OPTIONAL +} + +PhyLayerParameters-v1170 ::= SEQUENCE { + interBandTDD-CA-WithDifferentConfig-r11 BIT STRING (SIZE (2)) OPTIONAL +} + +PhyLayerParameters-v1250 ::= SEQUENCE { + e-HARQ-Pattern-FDD-r12 ENUMERATED {supported} OPTIONAL, + enhanced-4TxCodebook-r12 ENUMERATED {supported} OPTIONAL, + tdd-FDD-CA-PCellDuplex-r12 BIT STRING (SIZE (2)) OPTIONAL, + phy-TDD-ReConfig-TDD-PCell-r12 ENUMERATED {supported} OPTIONAL, + phy-TDD-ReConfig-FDD-PCell-r12 ENUMERATED {supported} OPTIONAL, + pusch-FeedbackMode-r12 ENUMERATED {supported} OPTIONAL, + pusch-SRS-PowerControl-SubframeSet-r12 ENUMERATED {supported} OPTIONAL, + csi-SubframeSet-r12 ENUMERATED {supported} OPTIONAL, + noResourceRestrictionForTTIBundling-r12 ENUMERATED {supported} OPTIONAL, + discoverySignalsInDeactSCell-r12 ENUMERATED {supported} OPTIONAL, + naics-Capability-List-r12 NAICS-Capability-List-r12 OPTIONAL +} + +PhyLayerParameters-v1280 ::= SEQUENCE { + alternativeTBS-Indices-r12 ENUMERATED {supported} OPTIONAL +} + +PhyLayerParameters-v1310 ::= SEQUENCE { + aperiodicCSI-Reporting-r13 BIT STRING (SIZE (2)) OPTIONAL, + codebook-HARQ-ACK-r13 BIT STRING (SIZE (2)) OPTIONAL, + crossCarrierScheduling-B5C-r13 ENUMERATED {supported} OPTIONAL, + fdd-HARQ-TimingTDD-r13 ENUMERATED {supported} OPTIONAL, + maxNumberUpdatedCSI-Proc-r13 INTEGER(5..32) OPTIONAL, + pucch-Format4-r13 ENUMERATED {supported} OPTIONAL, + pucch-Format5-r13 ENUMERATED {supported} OPTIONAL, + pucch-SCell-r13 ENUMERATED {supported} OPTIONAL, + spatialBundling-HARQ-ACK-r13 ENUMERATED {supported} OPTIONAL, + supportedBlindDecoding-r13 SEQUENCE { + maxNumberDecoding-r13 INTEGER(1..32) OPTIONAL, + pdcch-CandidateReductions-r13 ENUMERATED {supported} OPTIONAL, + skipMonitoringDCI-Format0-1A-r13 ENUMERATED {supported} OPTIONAL + } OPTIONAL, + uci-PUSCH-Ext-r13 ENUMERATED {supported} OPTIONAL, + crs-InterfMitigationTM10-r13 ENUMERATED {supported} OPTIONAL, + pdsch-CollisionHandling-r13 ENUMERATED {supported} OPTIONAL +} + +PhyLayerParameters-v1320 ::= SEQUENCE { + mimo-UE-Parameters-r13 MIMO-UE-Parameters-r13 OPTIONAL +} + +PhyLayerParameters-v1330 ::= SEQUENCE { + cch-InterfMitigation-RefRecTypeA-r13 ENUMERATED {supported} OPTIONAL, + cch-InterfMitigation-RefRecTypeB-r13 ENUMERATED {supported} OPTIONAL, + cch-InterfMitigation-MaxNumCCs-r13 INTEGER (1.. maxServCell-r13) OPTIONAL, + crs-InterfMitigationTM1toTM9-r13 INTEGER (1.. maxServCell-r13) OPTIONAL +} + +PhyLayerParameters-v1430 ::= SEQUENCE { + ce-PUSCH-NB-MaxTBS-r14 ENUMERATED {supported} OPTIONAL, + ce-PDSCH-PUSCH-MaxBandwidth-r14 ENUMERATED {bw5, bw20} OPTIONAL, + ce-HARQ-AckBundling-r14 ENUMERATED {supported} OPTIONAL, + ce-PDSCH-TenProcesses-r14 ENUMERATED {supported} OPTIONAL, + ce-RetuningSymbols-r14 ENUMERATED {n0, n1} OPTIONAL, + ce-PDSCH-PUSCH-Enhancement-r14 ENUMERATED {supported} OPTIONAL, + ce-SchedulingEnhancement-r14 ENUMERATED {supported} OPTIONAL, + ce-SRS-Enhancement-r14 ENUMERATED {supported} OPTIONAL, + ce-PUCCH-Enhancement-r14 ENUMERATED {supported} OPTIONAL, + ce-ClosedLoopTxAntennaSelection-r14 ENUMERATED {supported} OPTIONAL, + tdd-SpecialSubframe-r14 ENUMERATED {supported} OPTIONAL, + tdd-TTI-Bundling-r14 ENUMERATED {supported} OPTIONAL, + dmrs-LessUpPTS-r14 ENUMERATED {supported} OPTIONAL, + mimo-UE-Parameters-v1430 MIMO-UE-Parameters-v1430 OPTIONAL, + alternativeTBS-Index-r14 ENUMERATED {supported} OPTIONAL, + feMBMS-Unicast-Parameters-r14 FeMBMS-Unicast-Parameters-r14 OPTIONAL +} + +MIMO-UE-Parameters-r13 ::= SEQUENCE { + parametersTM9-r13 MIMO-UE-ParametersPerTM-r13 OPTIONAL, + parametersTM10-r13 MIMO-UE-ParametersPerTM-r13 OPTIONAL, + srs-EnhancementsTDD-r13 ENUMERATED {supported} OPTIONAL, + srs-Enhancements-r13 ENUMERATED {supported} OPTIONAL, + interferenceMeasRestriction-r13 ENUMERATED {supported} OPTIONAL +} + +MIMO-UE-Parameters-v1430 ::= SEQUENCE { + parametersTM9-v1430 MIMO-UE-ParametersPerTM-v1430 OPTIONAL, + parametersTM10-v1430 MIMO-UE-ParametersPerTM-v1430 OPTIONAL +} + +MIMO-UE-ParametersPerTM-r13 ::= SEQUENCE { + nonPrecoded-r13 MIMO-NonPrecodedCapabilities-r13 OPTIONAL, + beamformed-r13 MIMO-UE-BeamformedCapabilities-r13 OPTIONAL, + channelMeasRestriction-r13 ENUMERATED {supported} OPTIONAL, + dmrs-Enhancements-r13 ENUMERATED {supported} OPTIONAL, + csi-RS-EnhancementsTDD-r13 ENUMERATED {supported} OPTIONAL +} + +MIMO-UE-ParametersPerTM-v1430 ::= SEQUENCE { + nzp-CSI-RS-AperiodicInfo-r14 SEQUENCE { + nMaxProc-r14 INTEGER(5..32), + nMaxResource-r14 ENUMERATED {ffs1, ffs2, ffs3, ffs4} + } OPTIONAL, + nzp-CSI-RS-PeriodicInfo-r14 SEQUENCE { + nMaxResource-r14 ENUMERATED {ffs1, ffs2, ffs3, ffs4} + } OPTIONAL, + zp-CSI-RS-AperiodicInfo-r14 ENUMERATED {supported} OPTIONAL, + ul-dmrs-Enhancements-r14 ENUMERATED {supported} OPTIONAL, + densityReductionNP-r14 ENUMERATED {supported} OPTIONAL, + densityReductionBF-r14 ENUMERATED {supported} OPTIONAL, + hybridCSI-r14 ENUMERATED {supported} OPTIONAL, + semiOL-r14 ENUMERATED {supported} OPTIONAL, + csi-ReportingNP-r14 ENUMERATED {supported} OPTIONAL, + csi-ReportingAdvanced-r14 ENUMERATED {supported} OPTIONAL +} + +MIMO-CA-ParametersPerBoBC-r13 ::= SEQUENCE { + parametersTM9-r13 MIMO-CA-ParametersPerBoBCPerTM-r13 OPTIONAL, + parametersTM10-r13 MIMO-CA-ParametersPerBoBCPerTM-r13 OPTIONAL +} + +MIMO-CA-ParametersPerBoBC-v1430 ::= SEQUENCE { + parametersTM9-v1430 MIMO-CA-ParametersPerBoBCPerTM-v1430 OPTIONAL, + parametersTM10-v1430 MIMO-CA-ParametersPerBoBCPerTM-v1430 OPTIONAL +} + +MIMO-CA-ParametersPerBoBCPerTM-r13 ::= SEQUENCE { + nonPrecoded-r13 MIMO-NonPrecodedCapabilities-r13 OPTIONAL, + beamformed-r13 MIMO-BeamformedCapabilityList-r13 OPTIONAL, + dmrs-Enhancements-r13 ENUMERATED {different} OPTIONAL +} + +MIMO-CA-ParametersPerBoBCPerTM-v1430 ::= SEQUENCE { + csi-ReportingNP-r14 ENUMERATED {different} OPTIONAL, + csi-ReportingAdvanced-r14 ENUMERATED {different} OPTIONAL +} + +MIMO-NonPrecodedCapabilities-r13 ::= SEQUENCE { + config1-r13 ENUMERATED {supported} OPTIONAL, + config2-r13 ENUMERATED {supported} OPTIONAL, + config3-r13 ENUMERATED {supported} OPTIONAL, + config4-r13 ENUMERATED {supported} OPTIONAL +} + +MIMO-UE-BeamformedCapabilities-r13 ::= SEQUENCE { + altCodebook-r13 ENUMERATED {supported} OPTIONAL, + mimo-BeamformedCapabilities-r13 MIMO-BeamformedCapabilityList-r13 +} + +MIMO-BeamformedCapabilityList-r13 ::= SEQUENCE (SIZE (1..maxCSI-Proc-r11)) OF MIMO-BeamformedCapabilities-r13 + +MIMO-BeamformedCapabilities-r13 ::= SEQUENCE { + k-Max-r13 INTEGER (1..8), + n-MaxList-r13 BIT STRING (SIZE (1..7)) OPTIONAL + } + +NonContiguousUL-RA-WithinCC-List-r10 ::= SEQUENCE (SIZE (1..maxBands)) OF NonContiguousUL-RA-WithinCC-r10 + +NonContiguousUL-RA-WithinCC-r10 ::= SEQUENCE { + nonContiguousUL-RA-WithinCC-Info-r10 ENUMERATED {supported} OPTIONAL +} + +RF-Parameters ::= SEQUENCE { + supportedBandListEUTRA SupportedBandListEUTRA +} + +RF-Parameters-v9e0 ::= SEQUENCE { + supportedBandListEUTRA-v9e0 SupportedBandListEUTRA-v9e0 OPTIONAL +} + +RF-Parameters-v1020 ::= SEQUENCE { + supportedBandCombination-r10 SupportedBandCombination-r10 +} + +RF-Parameters-v1060 ::= SEQUENCE { + supportedBandCombinationExt-r10 SupportedBandCombinationExt-r10 +} + +RF-Parameters-v1090 ::= SEQUENCE { + supportedBandCombination-v1090 SupportedBandCombination-v1090 OPTIONAL +} + +RF-Parameters-v10f0 ::= SEQUENCE { + modifiedMPR-Behavior-r10 BIT STRING (SIZE (32)) OPTIONAL +} + +RF-Parameters-v10i0 ::= SEQUENCE { + supportedBandCombination-v10i0 SupportedBandCombination-v10i0 OPTIONAL +} + +RF-Parameters-v10j0 ::= SEQUENCE { + multiNS-Pmax-r10 ENUMERATED {supported} OPTIONAL +} + +RF-Parameters-v1130 ::= SEQUENCE { + supportedBandCombination-v1130 SupportedBandCombination-v1130 OPTIONAL +} + +RF-Parameters-v1180 ::= SEQUENCE { + freqBandRetrieval-r11 ENUMERATED {supported} OPTIONAL, + requestedBands-r11 SEQUENCE (SIZE (1.. maxBands)) OF FreqBandIndicator-r11 OPTIONAL, + supportedBandCombinationAdd-r11 SupportedBandCombinationAdd-r11 OPTIONAL +} + +RF-Parameters-v11d0 ::= SEQUENCE { + supportedBandCombinationAdd-v11d0 SupportedBandCombinationAdd-v11d0 OPTIONAL +} + +RF-Parameters-v1250 ::= SEQUENCE { + supportedBandListEUTRA-v1250 SupportedBandListEUTRA-v1250 OPTIONAL, + supportedBandCombination-v1250 SupportedBandCombination-v1250 OPTIONAL, + supportedBandCombinationAdd-v1250 SupportedBandCombinationAdd-v1250 OPTIONAL, + freqBandPriorityAdjustment-r12 ENUMERATED {supported} OPTIONAL +} + +RF-Parameters-v1270 ::= SEQUENCE { + supportedBandCombination-v1270 SupportedBandCombination-v1270 OPTIONAL, + supportedBandCombinationAdd-v1270 SupportedBandCombinationAdd-v1270 OPTIONAL +} + +RF-Parameters-v1310 ::= SEQUENCE { + eNB-RequestedParameters-r13 SEQUENCE { + reducedIntNonContCombRequested-r13 ENUMERATED {true} OPTIONAL, + requestedCCsDL-r13 INTEGER (2..32) OPTIONAL, + requestedCCsUL-r13 INTEGER (2..32) OPTIONAL, + skipFallbackCombRequested-r13 ENUMERATED {true} OPTIONAL + } OPTIONAL, + maximumCCsRetrieval-r13 ENUMERATED {supported} OPTIONAL, + skipFallbackCombinations-r13 ENUMERATED {supported} OPTIONAL, + reducedIntNonContComb-r13 ENUMERATED {supported} OPTIONAL, + supportedBandListEUTRA-v1310 SupportedBandListEUTRA-v1310 OPTIONAL, + supportedBandCombinationReduced-r13 SupportedBandCombinationReduced-r13 OPTIONAL +} + +RF-Parameters-v1320 ::= SEQUENCE { + supportedBandListEUTRA-v1320 SupportedBandListEUTRA-v1320 OPTIONAL, + supportedBandCombination-v1320 SupportedBandCombination-v1320 OPTIONAL, + supportedBandCombinationAdd-v1320 SupportedBandCombinationAdd-v1320 OPTIONAL, + supportedBandCombinationReduced-v1320 SupportedBandCombinationReduced-v1320 OPTIONAL +} + +RF-Parameters-v12b0 ::= SEQUENCE { + maxLayersMIMO-Indication-r12 ENUMERATED {supported} OPTIONAL +} + +RF-Parameters-v1430 ::= SEQUENCE { + supportedBandCombination-v1430 SupportedBandCombination-v1430 OPTIONAL, + supportedBandCombinationAdd-v1430 SupportedBandCombinationAdd-v1430 OPTIONAL, + supportedBandCombinationReduced-v1430 SupportedBandCombinationReduced-v1430 OPTIONAL, + eNB-RequestedParameters-v1430 SEQUENCE { + requestedDiffFallbackCombList-r14 BandCombinationList-r14 + } OPTIONAL, + diffFallbackCombReport-r14 ENUMERATED {supported} OPTIONAL +} + +SupportedBandCombination-r10 ::= SEQUENCE (SIZE (1..maxBandComb-r10)) OF BandCombinationParameters-r10 + +SupportedBandCombinationExt-r10 ::= SEQUENCE (SIZE (1..maxBandComb-r10)) OF BandCombinationParametersExt-r10 + +SupportedBandCombination-v1090 ::= SEQUENCE (SIZE (1..maxBandComb-r10)) OF BandCombinationParameters-v1090 + +SupportedBandCombination-v10i0 ::= SEQUENCE (SIZE (1..maxBandComb-r10)) OF BandCombinationParameters-v10i0 + +SupportedBandCombination-v1130 ::= SEQUENCE (SIZE (1..maxBandComb-r10)) OF BandCombinationParameters-v1130 + +SupportedBandCombination-v1250 ::= SEQUENCE (SIZE (1..maxBandComb-r10)) OF BandCombinationParameters-v1250 + +SupportedBandCombination-v1270 ::= SEQUENCE (SIZE (1..maxBandComb-r10)) OF BandCombinationParameters-v1270 + +SupportedBandCombination-v1320 ::= SEQUENCE (SIZE (1..maxBandComb-r10)) OF BandCombinationParameters-v1320 + +SupportedBandCombination-v1430 ::= SEQUENCE (SIZE (1..maxBandComb-r10)) OF BandCombinationParameters-v1430 + +SupportedBandCombinationAdd-r11 ::= SEQUENCE (SIZE (1..maxBandComb-r11)) OF BandCombinationParameters-r11 + +SupportedBandCombinationAdd-v11d0 ::= SEQUENCE (SIZE (1..maxBandComb-r11)) OF BandCombinationParameters-v10i0 + +SupportedBandCombinationAdd-v1250 ::= SEQUENCE (SIZE (1..maxBandComb-r11)) OF BandCombinationParameters-v1250 + +SupportedBandCombinationAdd-v1270 ::= SEQUENCE (SIZE (1..maxBandComb-r11)) OF BandCombinationParameters-v1270 + +SupportedBandCombinationAdd-v1320 ::= SEQUENCE (SIZE (1..maxBandComb-r11)) OF BandCombinationParameters-v1320 + +SupportedBandCombinationAdd-v1430 ::= SEQUENCE (SIZE (1..maxBandComb-r11)) OF BandCombinationParameters-v1430 + +SupportedBandCombinationReduced-r13 ::= SEQUENCE (SIZE (1..maxBandComb-r13)) OF BandCombinationParameters-r13 + +SupportedBandCombinationReduced-v1320 ::= SEQUENCE (SIZE (1..maxBandComb-r13)) OF BandCombinationParameters-v1320 + +SupportedBandCombinationReduced-v1430 ::= SEQUENCE (SIZE (1..maxBandComb-r13)) OF BandCombinationParameters-v1430 + +BandCombinationParameters-r10 ::= SEQUENCE (SIZE (1..maxSimultaneousBands-r10)) OF BandParameters-r10 + +BandCombinationParametersExt-r10 ::= SEQUENCE { + supportedBandwidthCombinationSet-r10 SupportedBandwidthCombinationSet-r10 OPTIONAL +} + +BandCombinationParameters-v1090 ::= SEQUENCE (SIZE (1..maxSimultaneousBands-r10)) OF BandParameters-v1090 + +BandCombinationParameters-v10i0::= SEQUENCE { +bandParameterList-v10i0 SEQUENCE (SIZE (1..maxSimultaneousBands-r10)) OF + BandParameters-v10i0 OPTIONAL +} + +BandCombinationParameters-v1130 ::= SEQUENCE { + multipleTimingAdvance-r11 ENUMERATED {supported} OPTIONAL, + simultaneousRx-Tx-r11 ENUMERATED {supported} OPTIONAL, + bandParameterList-r11 SEQUENCE (SIZE (1..maxSimultaneousBands-r10)) OF BandParameters-v1130 OPTIONAL, + ... +} + +BandCombinationParameters-r11 ::= SEQUENCE { + bandParameterList-r11 SEQUENCE (SIZE (1..maxSimultaneousBands-r10)) OF + BandParameters-r11, + supportedBandwidthCombinationSet-r11 SupportedBandwidthCombinationSet-r10 OPTIONAL, + multipleTimingAdvance-r11 ENUMERATED {supported} OPTIONAL, + simultaneousRx-Tx-r11 ENUMERATED {supported} OPTIONAL, + bandInfoEUTRA-r11 BandInfoEUTRA, + ... +} + +BandCombinationParameters-v1250::= SEQUENCE { + dc-Support-r12 SEQUENCE { + asynchronous-r12 ENUMERATED {supported} OPTIONAL, + supportedCellGrouping-r12 CHOICE { + threeEntries-r12 BIT STRING (SIZE(3)), + fourEntries-r12 BIT STRING (SIZE(7)), + fiveEntries-r12 BIT STRING (SIZE(15)) + } OPTIONAL + } OPTIONAL, + supportedNAICS-2CRS-AP-r12 BIT STRING (SIZE (1..maxNAICS-Entries-r12)) OPTIONAL, + commSupportedBandsPerBC-r12 BIT STRING (SIZE (1.. maxBands)) OPTIONAL, + ... +} + +BandCombinationParameters-v1270 ::= SEQUENCE { + bandParameterList-v1270 SEQUENCE (SIZE (1..maxSimultaneousBands-r10)) OF + BandParameters-v1270 OPTIONAL +} + +BandCombinationParameters-r13 ::= SEQUENCE { + differentFallbackSupported-r13 ENUMERATED {true} OPTIONAL, + bandParameterList-r13 SEQUENCE (SIZE (1..maxSimultaneousBands-r10)) OF BandParameters-r13, + supportedBandwidthCombinationSet-r13 SupportedBandwidthCombinationSet-r10 OPTIONAL, + multipleTimingAdvance-r13 ENUMERATED {supported} OPTIONAL, + simultaneousRx-Tx-r13 ENUMERATED {supported} OPTIONAL, + bandInfoEUTRA-r13 BandInfoEUTRA, + dc-Support-r13 SEQUENCE { + asynchronous-r13 ENUMERATED {supported} OPTIONAL, + supportedCellGrouping-r13 CHOICE { + threeEntries-r13 BIT STRING (SIZE(3)), + fourEntries-r13 BIT STRING (SIZE(7)), + fiveEntries-r13 BIT STRING (SIZE(15)) + } OPTIONAL + } OPTIONAL, + supportedNAICS-2CRS-AP-r13 BIT STRING (SIZE (1..maxNAICS-Entries-r12)) OPTIONAL, + commSupportedBandsPerBC-r13 BIT STRING (SIZE (1.. maxBands)) OPTIONAL +} + +BandCombinationParameters-v1320 ::= SEQUENCE { + bandParameterList-v1320 SEQUENCE (SIZE (1..maxSimultaneousBands-r10)) OF + BandParameters-v1320 OPTIONAL, + additionalRx-Tx-PerformanceReq-r13 ENUMERATED {supported} OPTIONAL +} + +BandCombinationParameters-v1430 ::= SEQUENCE { + bandParameterList-v1430 SEQUENCE (SIZE (1..maxSimultaneousBands-r10)) OF + BandParameters-v1430 OPTIONAL, + v2x-SupportedTxBandCombListPerBC-r14 BIT STRING (SIZE (1.. maxBandComb-r13)) OPTIONAL, + v2x-SupportedRxBandCombListPerBC-r14 BIT STRING (SIZE (1.. maxBandComb-r13)) OPTIONAL} + +SupportedBandwidthCombinationSet-r10 ::= BIT STRING (SIZE (1..maxBandwidthCombSet-r10)) + +BandParameters-r10 ::= SEQUENCE { + bandEUTRA-r10 FreqBandIndicator, + bandParametersUL-r10 BandParametersUL-r10 OPTIONAL, + bandParametersDL-r10 BandParametersDL-r10 OPTIONAL +} + +BandParameters-v1090 ::= SEQUENCE { + bandEUTRA-v1090 FreqBandIndicator-v9e0 OPTIONAL, + ... +} + +BandParameters-v10i0::= SEQUENCE { + bandParametersDL-v10i0 SEQUENCE (SIZE (1..maxBandwidthClass-r10)) OF CA-MIMO-ParametersDL-v10i0 +} + +BandParameters-v1130 ::= SEQUENCE { + supportedCSI-Proc-r11 ENUMERATED {n1, n3, n4} +} + +BandParameters-r11 ::= SEQUENCE { + bandEUTRA-r11 FreqBandIndicator-r11, + bandParametersUL-r11 BandParametersUL-r10 OPTIONAL, + bandParametersDL-r11 BandParametersDL-r10 OPTIONAL, + supportedCSI-Proc-r11 ENUMERATED {n1, n3, n4} OPTIONAL +} + +BandParameters-v1270 ::= SEQUENCE { + bandParametersDL-v1270 SEQUENCE (SIZE (1..maxBandwidthClass-r10)) OF CA-MIMO-ParametersDL-v1270 +} + +BandParameters-r13 ::= SEQUENCE { + bandEUTRA-r13 FreqBandIndicator-r11, + bandParametersUL-r13 BandParametersUL-r13 OPTIONAL, + bandParametersDL-r13 BandParametersDL-r13 OPTIONAL, + supportedCSI-Proc-r13 ENUMERATED {n1, n3, n4} OPTIONAL +} + +BandParameters-v1320 ::= SEQUENCE { + bandParametersDL-v1320 MIMO-CA-ParametersPerBoBC-r13 +} + +BandParameters-v1430 ::= SEQUENCE { + bandParametersDL-v1430 MIMO-CA-ParametersPerBoBC-v1430 OPTIONAL, + ul-256QAM-r14 ENUMERATED {supported} OPTIONAL, + ul-256QAM-perCC-InfoList-r14 SEQUENCE (SIZE (2..maxServCell-r13)) OF UL-256QAM-perCC-Info-r14 OPTIONAL, + retuningTimeInfoBandList-r14 SEQUENCE (SIZE (1..maxSimultaneousBands-r10)) OF + RetuningTimeInfo-r14 OPTIONAL +} + +V2X-BandParameters-r14 ::= SEQUENCE { + v2x-FreqBandEUTRA-r14 FreqBandIndicator-r11, + bandParametersTxSL-r14 BandParametersTxSL-r14 OPTIONAL, + bandParametersRxSL-r14 BandParametersRxSL-r14 OPTIONAL +} + +BandParametersTxSL-r14 ::= SEQUENCE { + v2x-BandwidthClassTxSL-r14 V2X-BandwidthClassSL-r14, + v2x-eNB-Scheduled-r14 ENUMERATED {supported} OPTIONAL, + v2x-HighPower-r14 ENUMERATED {supported} OPTIONAL +} + +BandParametersRxSL-r14 ::= SEQUENCE { + v2x-BandwidthClassRxSL-r14 V2X-BandwidthClassSL-r14, + v2x-HighReception-r14 ENUMERATED {supported} OPTIONAL +} + +V2X-BandwidthClassSL-r14 ::= SEQUENCE (SIZE (1..maxBandwidthClass-r10)) OF V2X-BandwidthClass-r14 + +UL-256QAM-perCC-Info-r14 ::= SEQUENCE { + ul-256QAM-perCC-r14 ENUMERATED {supported} OPTIONAL +} + +BandParametersUL-r10 ::= SEQUENCE (SIZE (1..maxBandwidthClass-r10)) OF CA-MIMO-ParametersUL-r10 + +BandParametersUL-r13 ::= CA-MIMO-ParametersUL-r10 + + +CA-MIMO-ParametersUL-r10 ::= SEQUENCE { + ca-BandwidthClassUL-r10 CA-BandwidthClass-r10, + supportedMIMO-CapabilityUL-r10 MIMO-CapabilityUL-r10 OPTIONAL +} + +BandParametersDL-r10 ::= SEQUENCE (SIZE (1..maxBandwidthClass-r10)) OF CA-MIMO-ParametersDL-r10 + +BandParametersDL-r13 ::= CA-MIMO-ParametersDL-r13 + +CA-MIMO-ParametersDL-r10 ::= SEQUENCE { + ca-BandwidthClassDL-r10 CA-BandwidthClass-r10, + supportedMIMO-CapabilityDL-r10 MIMO-CapabilityDL-r10 OPTIONAL +} + +CA-MIMO-ParametersDL-v10i0 ::= SEQUENCE { + fourLayerTM3-TM4-r10 ENUMERATED {supported} OPTIONAL +} + +CA-MIMO-ParametersDL-v1270 ::= SEQUENCE { + intraBandContiguousCC-InfoList-r12 SEQUENCE (SIZE (1..maxServCell-r10)) OF IntraBandContiguousCC-Info-r12 +} + +CA-MIMO-ParametersDL-r13 ::= SEQUENCE { + ca-BandwidthClassDL-r13 CA-BandwidthClass-r10, + supportedMIMO-CapabilityDL-r13 MIMO-CapabilityDL-r10 OPTIONAL, + fourLayerTM3-TM4-r13 ENUMERATED {supported} OPTIONAL, + intraBandContiguousCC-InfoList-r13 SEQUENCE (SIZE (1..maxServCell-r13)) OF IntraBandContiguousCC-Info-r12 +} + +IntraBandContiguousCC-Info-r12 ::= SEQUENCE { + fourLayerTM3-TM4-perCC-r12 ENUMERATED {supported} OPTIONAL, + supportedMIMO-CapabilityDL-r12 MIMO-CapabilityDL-r10 OPTIONAL, + supportedCSI-Proc-r12 ENUMERATED {n1, n3, n4} OPTIONAL +} + +CA-BandwidthClass-r10 ::= ENUMERATED {a, b, c, d, e, f, ...} + +V2X-BandwidthClass-r14 ::= ENUMERATED {a, b, c, d, e, f, ...} + +MIMO-CapabilityUL-r10 ::= ENUMERATED {twoLayers, fourLayers} + +MIMO-CapabilityDL-r10 ::= ENUMERATED {twoLayers, fourLayers, eightLayers} + +SupportedBandListEUTRA ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA + +SupportedBandListEUTRA-v9e0::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA-v9e0 + +SupportedBandListEUTRA-v1250 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA-v1250 + +SupportedBandListEUTRA-v1310 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA-v1310 + +SupportedBandListEUTRA-v1320 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA-v1320 + +SupportedBandEUTRA ::= SEQUENCE { + bandEUTRA FreqBandIndicator, + halfDuplex BOOLEAN +} + +SupportedBandEUTRA-v9e0 ::= SEQUENCE { + bandEUTRA-v9e0 FreqBandIndicator-v9e0 OPTIONAL +} + +SupportedBandEUTRA-v1250 ::= SEQUENCE { + dl-256QAM-r12 ENUMERATED {supported} OPTIONAL, + ul-64QAM-r12 ENUMERATED {supported} OPTIONAL +} + +SupportedBandEUTRA-v1310 ::= SEQUENCE { + ue-PowerClass-5-r13 ENUMERATED {supported} OPTIONAL +} +SupportedBandEUTRA-v1320 ::= SEQUENCE { + intraFreq-CE-NeedForGaps-r13 ENUMERATED {supported} OPTIONAL, + ue-PowerClass-N-r13 ENUMERATED {class1, class2, class4} OPTIONAL +} + +MeasParameters ::= SEQUENCE { + bandListEUTRA BandListEUTRA +} + +MeasParameters-v1020 ::= SEQUENCE { + bandCombinationListEUTRA-r10 BandCombinationListEUTRA-r10 +} + +MeasParameters-v1130 ::= SEQUENCE { + rsrqMeasWideband-r11 ENUMERATED {supported} OPTIONAL +} + +MeasParameters-v11a0 ::= SEQUENCE { + benefitsFromInterruption-r11 ENUMERATED {true} OPTIONAL +} + +MeasParameters-v1250 ::= SEQUENCE { + timerT312-r12 ENUMERATED {supported} OPTIONAL, + alternativeTimeToTrigger-r12 ENUMERATED {supported} OPTIONAL, + incMonEUTRA-r12 ENUMERATED {supported} OPTIONAL, + incMonUTRA-r12 ENUMERATED {supported} OPTIONAL, + extendedMaxMeasId-r12 ENUMERATED {supported} OPTIONAL, + extendedRSRQ-LowerRange-r12 ENUMERATED {supported} OPTIONAL, + rsrq-OnAllSymbols-r12 ENUMERATED {supported} OPTIONAL, + crs-DiscoverySignalsMeas-r12 ENUMERATED {supported} OPTIONAL, + csi-RS-DiscoverySignalsMeas-r12 ENUMERATED {supported} OPTIONAL +} + +MeasParameters-v1310 ::= SEQUENCE { + rs-SINR-Meas-r13 ENUMERATED {supported} OPTIONAL, + whiteCellList-r13 ENUMERATED {supported} OPTIONAL, + extendedMaxObjectId-r13 ENUMERATED {supported} OPTIONAL, + ul-PDCP-Delay-r13 ENUMERATED {supported} OPTIONAL, + extendedFreqPriorities-r13 ENUMERATED {supported} OPTIONAL, + multiBandInfoReport-r13 ENUMERATED {supported} OPTIONAL, + rssi-AndChannelOccupancyReporting-r13 ENUMERATED {supported} OPTIONAL +} + +MeasParameters-v1430 ::= SEQUENCE { + ceMeasurements-r14 ENUMERATED {supported} OPTIONAL, + ncsg-r14 ENUMERATED {supported} OPTIONAL, + shortMeasurementGap-r14 ENUMERATED {supported} OPTIONAL, + perServingCellMeasurementGap-r14 ENUMERATED {supported} OPTIONAL, + nonUniformGap-r14 ENUMERATED {supported} OPTIONAL +} + +BandListEUTRA ::= SEQUENCE (SIZE (1..maxBands)) OF BandInfoEUTRA + +BandCombinationListEUTRA-r10 ::= SEQUENCE (SIZE (1..maxBandComb-r10)) OF BandInfoEUTRA + +BandInfoEUTRA ::= SEQUENCE { + interFreqBandList InterFreqBandList, + interRAT-BandList InterRAT-BandList OPTIONAL +} + +InterFreqBandList ::= SEQUENCE (SIZE (1..maxBands)) OF InterFreqBandInfo + +InterFreqBandInfo ::= SEQUENCE { + interFreqNeedForGaps BOOLEAN +} + +InterRAT-BandList ::= SEQUENCE (SIZE (1..maxBands)) OF InterRAT-BandInfo + +InterRAT-BandInfo ::= SEQUENCE { + interRAT-NeedForGaps BOOLEAN +} + +IRAT-ParametersUTRA-FDD ::= SEQUENCE { + supportedBandListUTRA-FDD SupportedBandListUTRA-FDD +} + +IRAT-ParametersUTRA-v920 ::= SEQUENCE { + e-RedirectionUTRA-r9 ENUMERATED {supported} +} + +IRAT-ParametersUTRA-v9c0 ::= SEQUENCE { + voiceOverPS-HS-UTRA-FDD-r9 ENUMERATED {supported} OPTIONAL, + voiceOverPS-HS-UTRA-TDD128-r9 ENUMERATED {supported} OPTIONAL, + srvcc-FromUTRA-FDD-ToUTRA-FDD-r9 ENUMERATED {supported} OPTIONAL, + srvcc-FromUTRA-FDD-ToGERAN-r9 ENUMERATED {supported} OPTIONAL, + srvcc-FromUTRA-TDD128-ToUTRA-TDD128-r9 ENUMERATED {supported} OPTIONAL, + srvcc-FromUTRA-TDD128-ToGERAN-r9 ENUMERATED {supported} OPTIONAL +} + +IRAT-ParametersUTRA-v9h0 ::= SEQUENCE { + mfbi-UTRA-r9 ENUMERATED {supported} +} + +SupportedBandListUTRA-FDD ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-FDD + +SupportedBandUTRA-FDD ::= ENUMERATED { + bandI, bandII, bandIII, bandIV, bandV, bandVI, + bandVII, bandVIII, bandIX, bandX, bandXI, + bandXII, bandXIII, bandXIV, bandXV, bandXVI, ..., + bandXVII-8a0, bandXVIII-8a0, bandXIX-8a0, bandXX-8a0, + bandXXI-8a0, bandXXII-8a0, bandXXIII-8a0, bandXXIV-8a0, + bandXXV-8a0, bandXXVI-8a0, bandXXVII-8a0, bandXXVIII-8a0, + bandXXIX-8a0, bandXXX-8a0, bandXXXI-8a0, bandXXXII-8a0} + +IRAT-ParametersUTRA-TDD128 ::= SEQUENCE { + supportedBandListUTRA-TDD128 SupportedBandListUTRA-TDD128 +} + +SupportedBandListUTRA-TDD128 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD128 + +SupportedBandUTRA-TDD128 ::= ENUMERATED { + a, b, c, d, e, f, g, h, i, j, k, l, m, n, + o, p, ...} + +IRAT-ParametersUTRA-TDD384 ::= SEQUENCE { + supportedBandListUTRA-TDD384 SupportedBandListUTRA-TDD384 +} + +SupportedBandListUTRA-TDD384 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD384 + +SupportedBandUTRA-TDD384 ::= ENUMERATED { + a, b, c, d, e, f, g, h, i, j, k, l, m, n, + o, p, ...} + +IRAT-ParametersUTRA-TDD768 ::= SEQUENCE { + supportedBandListUTRA-TDD768 SupportedBandListUTRA-TDD768 +} + +SupportedBandListUTRA-TDD768 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD768 + +SupportedBandUTRA-TDD768 ::= ENUMERATED { + a, b, c, d, e, f, g, h, i, j, k, l, m, n, + o, p, ...} + +IRAT-ParametersUTRA-TDD-v1020 ::= SEQUENCE { + e-RedirectionUTRA-TDD-r10 ENUMERATED {supported} +} + +IRAT-ParametersGERAN ::= SEQUENCE { + supportedBandListGERAN SupportedBandListGERAN, + interRAT-PS-HO-ToGERAN BOOLEAN +} + +IRAT-ParametersGERAN-v920 ::= SEQUENCE { + dtm-r9 ENUMERATED {supported} OPTIONAL, + e-RedirectionGERAN-r9 ENUMERATED {supported} OPTIONAL +} + +SupportedBandListGERAN ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandGERAN + +SupportedBandGERAN ::= ENUMERATED { + gsm450, gsm480, gsm710, gsm750, gsm810, gsm850, + gsm900P, gsm900E, gsm900R, gsm1800, gsm1900, + spare5, spare4, spare3, spare2, spare1, ...} + +IRAT-ParametersCDMA2000-HRPD ::= SEQUENCE { + supportedBandListHRPD SupportedBandListHRPD, + tx-ConfigHRPD ENUMERATED {single, dual}, + rx-ConfigHRPD ENUMERATED {single, dual} +} + +SupportedBandListHRPD ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandclassCDMA2000 + +IRAT-ParametersCDMA2000-1XRTT ::= SEQUENCE { + supportedBandList1XRTT SupportedBandList1XRTT, + tx-Config1XRTT ENUMERATED {single, dual}, + rx-Config1XRTT ENUMERATED {single, dual} +} + +IRAT-ParametersCDMA2000-1XRTT-v920 ::= SEQUENCE { + e-CSFB-1XRTT-r9 ENUMERATED {supported}, + e-CSFB-ConcPS-Mob1XRTT-r9 ENUMERATED {supported} OPTIONAL +} + +IRAT-ParametersCDMA2000-1XRTT-v1020 ::= SEQUENCE { + e-CSFB-dual-1XRTT-r10 ENUMERATED {supported} +} + +IRAT-ParametersCDMA2000-v1130 ::= SEQUENCE { + cdma2000-NW-Sharing-r11 ENUMERATED {supported} OPTIONAL +} + +SupportedBandList1XRTT ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandclassCDMA2000 + +IRAT-ParametersWLAN-r13 ::= SEQUENCE { + supportedBandListWLAN-r13 SEQUENCE (SIZE (1..maxWLAN-Bands-r13)) OF WLAN-BandIndicator-r13 OPTIONAL +} + +CSG-ProximityIndicationParameters-r9 ::= SEQUENCE { + intraFreqProximityIndication-r9 ENUMERATED {supported} OPTIONAL, + interFreqProximityIndication-r9 ENUMERATED {supported} OPTIONAL, + utran-ProximityIndication-r9 ENUMERATED {supported} OPTIONAL +} + +NeighCellSI-AcquisitionParameters-r9 ::= SEQUENCE { + intraFreqSI-AcquisitionForHO-r9 ENUMERATED {supported} OPTIONAL, + interFreqSI-AcquisitionForHO-r9 ENUMERATED {supported} OPTIONAL, + utran-SI-AcquisitionForHO-r9 ENUMERATED {supported} OPTIONAL +} + +SON-Parameters-r9 ::= SEQUENCE { + rach-Report-r9 ENUMERATED {supported} OPTIONAL +} + +UE-BasedNetwPerfMeasParameters-r10 ::= SEQUENCE { + loggedMeasurementsIdle-r10 ENUMERATED {supported} OPTIONAL, + standaloneGNSS-Location-r10 ENUMERATED {supported} OPTIONAL +} + +UE-BasedNetwPerfMeasParameters-v1250 ::= SEQUENCE { + loggedMBSFNMeasurements-r12 ENUMERATED {supported} +} + +UE-BasedNetwPerfMeasParameters-v1430 ::= SEQUENCE { + locationReport-r14 ENUMERATED {supported} OPTIONAL +} + +OTDOA-PositioningCapabilities-r10 ::= SEQUENCE { + otdoa-UE-Assisted-r10 ENUMERATED {supported}, + interFreqRSTD-Measurement-r10 ENUMERATED {supported} OPTIONAL +} + +Other-Parameters-r11 ::= SEQUENCE { + inDeviceCoexInd-r11 ENUMERATED {supported} OPTIONAL, + powerPrefInd-r11 ENUMERATED {supported} OPTIONAL, + ue-Rx-TxTimeDiffMeasurements-r11 ENUMERATED {supported} OPTIONAL +} + +Other-Parameters-v11d0 ::= SEQUENCE { + inDeviceCoexInd-UL-CA-r11 ENUMERATED {supported} OPTIONAL +} + +Other-Parameters-v1360 ::= SEQUENCE { + inDeviceCoexInd-HardwareSharingInd-r13 ENUMERATED {supported} OPTIONAL +} + +Other-Parameters-v1430 ::= SEQUENCE { + bwPrefInd-r14 ENUMERATED {supported} OPTIONAL, + rlm-ReportSupport-r14 ENUMERATED {supported} OPTIONAL +} + +MBMS-Parameters-r11 ::= SEQUENCE { + mbms-SCell-r11 ENUMERATED {supported} OPTIONAL, + mbms-NonServingCell-r11 ENUMERATED {supported} OPTIONAL +} + +MBMS-Parameters-v1250 ::= SEQUENCE { + mbms-AsyncDC-r12 ENUMERATED {supported} OPTIONAL +} + +MBMS-Parameters-v1430 ::= SEQUENCE { + fembmsDedicatedCell-r14 ENUMERATED {supported} OPTIONAL, + fembmsMixedCell-r14 ENUMERATED {supported} OPTIONAL, + subcarrierSpacingMBMS-khz7dot5-r14 ENUMERATED {supported} OPTIONAL, + subcarrierSpacingMBMS-khz1dot25-r14 ENUMERATED {supported} OPTIONAL +} + +FeMBMS-Unicast-Parameters-r14 ::= SEQUENCE { + unicast-fembmsMixedSCell-r14 ENUMERATED {supported} OPTIONAL, + emptyUnicastRegion-r14 ENUMERATED {supported} OPTIONAL +} + +SCPTM-Parameters-r13 ::= SEQUENCE { + scptm-ParallelReception-r13 ENUMERATED {supported} OPTIONAL, + scptm-SCell-r13 ENUMERATED {supported} OPTIONAL, + scptm-NonServingCell-r13 ENUMERATED {supported} OPTIONAL, + scptm-AsyncDC-r13 ENUMERATED {supported} OPTIONAL +} + +CE-Parameters-r13 ::= SEQUENCE { + ce-ModeA-r13 ENUMERATED {supported} OPTIONAL, + ce-ModeB-r13 ENUMERATED {supported} OPTIONAL +} + +CE-Parameters-v1320 ::= SEQUENCE { + intraFreqA3-CE-ModeA-r13 ENUMERATED {supported} OPTIONAL, + intraFreqA3-CE-ModeB-r13 ENUMERATED {supported} OPTIONAL, + intraFreqHO-CE-ModeA-r13 ENUMERATED {supported} OPTIONAL, + intraFreqHO-CE-ModeB-r13 ENUMERATED {supported} OPTIONAL +} + +CE-Parameters-v1350 ::= SEQUENCE { + unicastFrequencyHopping-r13 ENUMERATED {supported} OPTIONAL +} + +CE-Parameters-v1430 ::= SEQUENCE { + ce-SwitchWithoutHO-r14 ENUMERATED {supported} OPTIONAL +} + +LAA-Parameters-r13 ::= SEQUENCE { + crossCarrierSchedulingLAA-DL-r13 ENUMERATED {supported} OPTIONAL, + csi-RS-DRS-RRM-MeasurementsLAA-r13 ENUMERATED {supported} OPTIONAL, + downlinkLAA-r13 ENUMERATED {supported} OPTIONAL, + endingDwPTS-r13 ENUMERATED {supported} OPTIONAL, + secondSlotStartingPosition-r13 ENUMERATED {supported} OPTIONAL, + tm9-LAA-r13 ENUMERATED {supported} OPTIONAL, + tm10-LAA-r13 ENUMERATED {supported} OPTIONAL +} + +LAA-Parameters-v1430 ::= SEQUENCE { + crossCarrierSchedulingLAA-UL-r14 ENUMERATED {supported} OPTIONAL, + uplinkLAA-r14 ENUMERATED {supported} OPTIONAL, + twoStepSchedulingTimingInfo-r14 ENUMERATED {nPlus1, nPlus2, nPlus3} OPTIONAL, + uss-BlindDecodingAdjustment-r14 ENUMERATED {supported} OPTIONAL, + uss-BlindDecodingReduction-r14 ENUMERATED {supported} OPTIONAL, + outOfSequenceGrantHandling-r14 ENUMERATED {supported} OPTIONAL +} + +WLAN-IW-Parameters-r12 ::= SEQUENCE { + wlan-IW-RAN-Rules-r12 ENUMERATED {supported} OPTIONAL, + wlan-IW-ANDSF-Policies-r12 ENUMERATED {supported} OPTIONAL +} + +LWA-Parameters-r13 ::= SEQUENCE { + lwa-r13 ENUMERATED {supported} OPTIONAL, + lwa-SplitBearer-r13 ENUMERATED {supported} OPTIONAL, + wlan-MAC-Address-r13 OCTET STRING (SIZE (6)) OPTIONAL, + lwa-BufferSize-r13 ENUMERATED {supported} OPTIONAL +} + +LWA-Parameters-v1430 ::= SEQUENCE { + lwa-HO-WithoutWT-Change-r14 ENUMERATED {supported} OPTIONAL, + lwa-UL-r14 ENUMERATED {supported} OPTIONAL, + wlan-PeriodicMeas-r14 ENUMERATED {supported} OPTIONAL, + wlan-ReportAnyWLAN-r14 ENUMERATED {supported} OPTIONAL, + wlan-SupportedDataRate-r14 INTEGER (1..2048) OPTIONAL +} + +WLAN-IW-Parameters-v1310 ::= SEQUENCE { + rclwi-r13 ENUMERATED {supported} OPTIONAL +} + +LWIP-Parameters-r13 ::= SEQUENCE { + lwip-r13 ENUMERATED {supported} OPTIONAL +} + +LWIP-Parameters-v1430 ::= SEQUENCE { + lwip-Aggregation-DL-r14 ENUMERATED {supported} OPTIONAL, + lwip-Aggregation-UL-r14 ENUMERATED {supported} OPTIONAL +} + +NAICS-Capability-List-r12 ::= SEQUENCE (SIZE (1..maxNAICS-Entries-r12)) OF NAICS-Capability-Entry-r12 + + +NAICS-Capability-Entry-r12 ::= SEQUENCE { + numberOfNAICS-CapableCC-r12 INTEGER(1..5), + numberOfAggregatedPRB-r12 ENUMERATED { + n50, n75, n100, n125, n150, n175, + n200, n225, n250, n275, n300, n350, + n400, n450, n500, spare}, + ... +} + +SL-Parameters-r12 ::= SEQUENCE { + commSimultaneousTx-r12 ENUMERATED {supported} OPTIONAL, + commSupportedBands-r12 FreqBandIndicatorListEUTRA-r12 OPTIONAL, + discSupportedBands-r12 SupportedBandInfoList-r12 OPTIONAL, + discScheduledResourceAlloc-r12 ENUMERATED {supported} OPTIONAL, + disc-UE-SelectedResourceAlloc-r12 ENUMERATED {supported} OPTIONAL, + disc-SLSS-r12 ENUMERATED {supported} OPTIONAL, + discSupportedProc-r12 ENUMERATED {n50, n400} OPTIONAL +} + +SL-Parameters-v1310 ::= SEQUENCE { + discSysInfoReporting-r13 ENUMERATED {supported} OPTIONAL, + commMultipleTx-r13 ENUMERATED {supported} OPTIONAL, + discInterFreqTx-r13 ENUMERATED {supported} OPTIONAL, + discPeriodicSLSS-r13 ENUMERATED {supported} OPTIONAL +} + +SL-Parameters-v1430 ::= SEQUENCE { + zoneBasedPoolSelection-r14 ENUMERATED {supported} OPTIONAL, + ue-AutonomousWithFullSensing-r14 ENUMERATED {supported} OPTIONAL, + ue-AutonomousWithPartialSensing-r14 ENUMERATED {supported} OPTIONAL, + sl-CongestionControl-r14 ENUMERATED {supported} OPTIONAL, + v2x-TxWithShortResvInterval-r14 ENUMERATED {supported} OPTIONAL, + v2x-numberTxRxTiming-r14 INTEGER(1..16) OPTIONAL, + v2x-nonAdjacentPSCCH-PSSCH-r14 ENUMERATED {supported} OPTIONAL, + slss-TxRx-r14 ENUMERATED {supported} OPTIONAL, + v2x-SupportedBandCombinationList-r14 V2X-SupportedBandCombination-r14 OPTIONAL +} + +V2X-SupportedBandCombination-r14 ::= SEQUENCE (SIZE (1..maxBandComb-r13)) OF V2X-BandCombinationParameters-r14 + +V2X-BandCombinationParameters-r14 ::= SEQUENCE (SIZE (1.. maxSimultaneousBands-r10)) OF V2X-BandParameters-r14 + +SupportedBandInfoList-r12 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandInfo-r12 + +SupportedBandInfo-r12 ::= SEQUENCE { + support-r12 ENUMERATED {supported} OPTIONAL +} + +FreqBandIndicatorListEUTRA-r12 ::= SEQUENCE (SIZE (1..maxBands)) OF FreqBandIndicator-r11 + +MMTEL-Parameters-r14 ::= SEQUENCE { + delayBudgetReporting-r14 ENUMERATED {supported} OPTIONAL, + pusch-Enhancements-r14 ENUMERATED {supported} OPTIONAL, + recommendedBitRate-r14 ENUMERATED {supported} OPTIONAL, + recommendedBitRateQuery-r14 ENUMERATED {supported} OPTIONAL +} + +RetuningTimeInfo-r14 ::= SEQUENCE { + retuningInfo SEQUENCE { + rf-RetuningTimeDL-r14 ENUMERATED {n0, n0dot5, n1, n1dot5, n2, n2dot5, n3, + n3dot5, n4, n4dot5, n5, n5dot5, n6, n6dot5, + n7, spare1} OPTIONAL, + rf-RetuningTimeUL-r14 ENUMERATED {n0, n0dot5, n1, n1dot5, n2, n2dot5, n3, + n3dot5, n4, n4dot5, n5, n5dot5, n6, n6dot5, + n7, spare1} OPTIONAL + } +} + +HighSpeedEnhParameters-r14 ::= SEQUENCE { + measurementEnhancements-r14 ENUMERATED {supported} OPTIONAL, + demodulationEnhancements-r14 ENUMERATED {supported} OPTIONAL, + prach-Enhancements-r14 ENUMERATED {supported} OPTIONAL +} + + +UE-RadioPagingInfo-r12 ::= SEQUENCE { + ue-Category-v1250 INTEGER (0) OPTIONAL, + ..., + [[ ue-CategoryDL-v1310 ENUMERATED {m1} OPTIONAL, + ce-ModeA-r13 ENUMERATED {true} OPTIONAL, + ce-ModeB-r13 ENUMERATED {true} OPTIONAL + ]] + +} + + +UE-TimersAndConstants ::= SEQUENCE { + t300 ENUMERATED { + ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, + ms2000}, + t301 ENUMERATED { + ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, + ms2000}, + t310 ENUMERATED { + ms0, ms50, ms100, ms200, ms500, ms1000, ms2000}, + n310 ENUMERATED { + n1, n2, n3, n4, n6, n8, n10, n20}, + t311 ENUMERATED { + ms1000, ms3000, ms5000, ms10000, ms15000, + ms20000, ms30000}, + n311 ENUMERATED { + n1, n2, n3, n4, n5, n6, n8, n10}, + ..., + [[ t300-v1310 ENUMERATED { + ms2500, ms3000, ms3500, ms4000, ms5000, ms6000, ms8000, + ms10000} OPTIONAL, -- Need OR + t301-v1310 ENUMERATED { + ms2500, ms3000, ms3500, ms4000, ms5000, ms6000, ms8000, + ms10000} OPTIONAL -- Need OR + ]], + [[ t310-v1330 ENUMERATED {ms4000, ms6000} + OPTIONAL -- Need OR + ]] +} + + +VisitedCellInfoList-r12 ::= SEQUENCE (SIZE (1..maxCellHistory-r12)) OF VisitedCellInfo-r12 + +VisitedCellInfo-r12 ::= SEQUENCE { + visitedCellId-r12 CHOICE { + cellGlobalId-r12 CellGlobalIdEUTRA, + pci-arfcn-r12 SEQUENCE { + physCellId-r12 PhysCellId, + carrierFreq-r12 ARFCN-ValueEUTRA-r9 + } + } OPTIONAL, + timeSpent-r12 INTEGER (0..4095), + ... +} + + +WLAN-OffloadConfig-r12 ::= SEQUENCE { + thresholdRSRP-r12 SEQUENCE { + thresholdRSRP-Low-r12 RSRP-Range, + thresholdRSRP-High-r12 RSRP-Range + } OPTIONAL, -- Need OR + thresholdRSRQ-r12 SEQUENCE { + thresholdRSRQ-Low-r12 RSRQ-Range, + thresholdRSRQ-High-r12 RSRQ-Range + } OPTIONAL, -- Need OR + thresholdRSRQ-OnAllSymbolsWithWB-r12 SEQUENCE { + thresholdRSRQ-OnAllSymbolsWithWB-Low-r12 RSRQ-Range, + thresholdRSRQ-OnAllSymbolsWithWB-High-r12 RSRQ-Range + } OPTIONAL, -- Need OP + thresholdRSRQ-OnAllSymbols-r12 SEQUENCE { + thresholdRSRQ-OnAllSymbolsLow-r12 RSRQ-Range, + thresholdRSRQ-OnAllSymbolsHigh-r12 RSRQ-Range + } OPTIONAL, -- Need OP + thresholdRSRQ-WB-r12 SEQUENCE { + thresholdRSRQ-WB-Low-r12 RSRQ-Range, + thresholdRSRQ-WB-High-r12 RSRQ-Range + } OPTIONAL, -- Need OP + + thresholdChannelUtilization-r12 SEQUENCE { + thresholdChannelUtilizationLow-r12 INTEGER (0..255), + thresholdChannelUtilizationHigh-r12 INTEGER (0..255) + } OPTIONAL, -- Need OR + thresholdBackhaul-Bandwidth-r12 SEQUENCE { + thresholdBackhaulDL-BandwidthLow-r12 WLAN-backhaulRate-r12, + thresholdBackhaulDL-BandwidthHigh-r12 WLAN-backhaulRate-r12, + thresholdBackhaulUL-BandwidthLow-r12 WLAN-backhaulRate-r12, + thresholdBackhaulUL-BandwidthHigh-r12 WLAN-backhaulRate-r12 + } OPTIONAL, -- Need OR + thresholdWLAN-RSSI-r12 SEQUENCE { + thresholdWLAN-RSSI-Low-r12 INTEGER (0..255), + thresholdWLAN-RSSI-High-r12 INTEGER (0..255) + } OPTIONAL, -- Need OR + offloadPreferenceIndicator-r12 BIT STRING (SIZE (16)) OPTIONAL, -- Need OR + t-SteeringWLAN-r12 T-Reselection OPTIONAL, -- Need OR + ... +} + +WLAN-backhaulRate-r12 ::= ENUMERATED + {r0, r4, r8, r16, r32, r64, r128, r256, r512, + r1024, r2048, r4096, r8192, r16384, r32768, r65536, r131072, + r262144, r524288, r1048576, r2097152, r4194304, r8388608, + r16777216, r33554432, r67108864, r134217728, r268435456, + r536870912, r1073741824, r2147483648, r4294967296} + + +MBMS-NotificationConfig-r9 ::= SEQUENCE { + notificationRepetitionCoeff-r9 ENUMERATED {n2, n4}, + notificationOffset-r9 INTEGER (0..10), + notificationSF-Index-r9 INTEGER (1..6) +} + +MBMS-NotificationConfig-v1430 ::= SEQUENCE { + notificationSF-Index-v1430 INTEGER (7..10) +} + + +MBMS-ServiceList-r13 ::= SEQUENCE (SIZE (0..maxMBMS-ServiceListPerUE-r13)) OF MBMS-ServiceInfo-r13 + +MBMS-ServiceInfo-r13 ::= SEQUENCE { + tmgi-r13 TMGI-r9 +} + + +MBSFN-AreaId-r12 ::= INTEGER (0..255) + + +MBSFN-AreaInfoList-r9 ::= SEQUENCE (SIZE(1..maxMBSFN-Area)) OF MBSFN-AreaInfo-r9 + +MBSFN-AreaInfo-r9 ::= SEQUENCE { + mbsfn-AreaId-r9 MBSFN-AreaId-r12, + non-MBSFNregionLength ENUMERATED {s1, s2}, + notificationIndicator-r9 INTEGER (0..7), + mcch-Config-r9 SEQUENCE { + mcch-RepetitionPeriod-r9 ENUMERATED {rf32, rf64, rf128, rf256}, + mcch-Offset-r9 INTEGER (0..10), + mcch-ModificationPeriod-r9 ENUMERATED {rf512, rf1024}, + sf-AllocInfo-r9 BIT STRING (SIZE(6)), + signallingMCS-r9 ENUMERATED {n2, n7, n13, n19} + }, + ..., + [[ mcch-Config-r14 SEQUENCE { + mcch-RepetitionPeriod-v1430 ENUMERATED {rf1, rf2, rf4, rf8, + rf16 } OPTIONAL, -- Need OR + mcch-ModificationPeriod-v1430 ENUMERATED {rf1, rf2, rf4, rf8, rf16, rf32, rf64, rf128, + rf256, spare7} OPTIONAL -- Need OR + } OPTIONAL, -- Need OR + subcarrierSpacingMBMS-r14 ENUMERATED {khz-7dot5, khz-1dot25} OPTIONAL -- Need OR + ]] +} + + +MBSFN-SubframeConfig ::= SEQUENCE { + radioframeAllocationPeriod ENUMERATED {n1, n2, n4, n8, n16, n32}, + radioframeAllocationOffset INTEGER (0..7), + subframeAllocation CHOICE { + oneFrame BIT STRING (SIZE(6)), + fourFrames BIT STRING (SIZE(24)) + } +} + +MBSFN-SubframeConfig-v1430 ::= SEQUENCE { + subframeAllocation-v1430 CHOICE { + oneFrame-v1430 BIT STRING (SIZE(2)), + fourFrames-v1430 BIT STRING (SIZE(8)) + } +} + + +PMCH-InfoList-r9 ::= SEQUENCE (SIZE (0..maxPMCH-PerMBSFN)) OF PMCH-Info-r9 + +PMCH-InfoListExt-r12 ::= SEQUENCE (SIZE (0..maxPMCH-PerMBSFN)) OF PMCH-InfoExt-r12 + +PMCH-Info-r9 ::= SEQUENCE { + pmch-Config-r9 PMCH-Config-r9, + mbms-SessionInfoList-r9 MBMS-SessionInfoList-r9, + ... +} + +PMCH-InfoExt-r12 ::= SEQUENCE { + pmch-Config-r12 PMCH-Config-r12, + mbms-SessionInfoList-r12 MBMS-SessionInfoList-r9, + ... +} + +MBMS-SessionInfoList-r9 ::= SEQUENCE (SIZE (0..maxSessionPerPMCH)) OF MBMS-SessionInfo-r9 + +MBMS-SessionInfo-r9 ::= SEQUENCE { + tmgi-r9 TMGI-r9, + sessionId-r9 OCTET STRING (SIZE (1)) OPTIONAL, -- Need OR + logicalChannelIdentity-r9 INTEGER (0..maxSessionPerPMCH-1), + ... +} + +PMCH-Config-r9 ::= SEQUENCE { + sf-AllocEnd-r9 INTEGER (0..1535), + dataMCS-r9 INTEGER (0..28), + mch-SchedulingPeriod-r9 ENUMERATED { + rf8, rf16, rf32, rf64, rf128, rf256, rf512, rf1024}, + ... +} + +PMCH-Config-r12 ::= SEQUENCE { + sf-AllocEnd-r12 INTEGER (0..1535), + dataMCS-r12 CHOICE { + normal-r12 INTEGER (0..28), + higerOrder-r12 INTEGER (0..27) + }, + mch-SchedulingPeriod-r12 ENUMERATED { + rf4, rf8, rf16, rf32, rf64, rf128, rf256, rf512, rf1024}, + ..., + [[ mch-SchedulingPeriod-v1430 ENUMERATED {rf1, rf2} OPTIONAL -- Need OR + ]] +} + +TMGI-r9 ::= SEQUENCE { + plmn-Id-r9 CHOICE { + plmn-Index-r9 INTEGER (1..maxPLMN-r11), + explicitValue-r9 PLMN-Identity + }, + serviceId-r9 OCTET STRING (SIZE (3)) +} + + +SC-MTCH-InfoList-r13 ::= SEQUENCE (SIZE (0..maxSC-MTCH-r13)) OF SC-MTCH-Info-r13 + +SC-MTCH-Info-r13 ::= SEQUENCE { + mbmsSessionInfo-r13 MBMSSessionInfo-r13, + g-RNTI-r13 BIT STRING(SIZE(16)), + sc-mtch-schedulingInfo-r13 SC-MTCH-SchedulingInfo-r13 OPTIONAL, -- Need OP + sc-mtch-neighbourCell-r13 BIT STRING (SIZE(maxNeighCell-SCPTM-r13)) OPTIONAL, -- Need OP + ..., + [[ p-a-r13 ENUMERATED { + dB-6, dB-4dot77, dB-3, dB-1dot77, + dB0, dB1, dB2, dB3} OPTIONAL -- Need ON + ]] +} + +MBMSSessionInfo-r13 ::= SEQUENCE { + tmgi-r13 TMGI-r9, + sessionId-r13 OCTET STRING (SIZE (1)) OPTIONAL -- Need OR +} + +SC-MTCH-SchedulingInfo-r13::= SEQUENCE { + onDurationTimerSCPTM-r13 ENUMERATED { + psf1, psf2, psf3, psf4, psf5, psf6, + psf8, psf10, psf20, psf30, psf40, + psf50, psf60, psf80, psf100, + psf200}, + drx-InactivityTimerSCPTM-r13 ENUMERATED { + psf0, psf1, psf2, psf4, psf8, + psf10, psf20, psf40, + psf80, psf160, ps320, + psf640, psf960, + psf1280, psf1920, psf2560}, + schedulingPeriodStartOffsetSCPTM-r13 CHOICE { + sf10 INTEGER(0..9), + sf20 INTEGER(0..19), + sf32 INTEGER(0..31), + sf40 INTEGER(0..39), + sf64 INTEGER(0..63), + sf80 INTEGER(0..79), + sf128 INTEGER(0..127), + sf160 INTEGER(0..159), + sf256 INTEGER(0..255), + sf320 INTEGER(0..319), + sf512 INTEGER(0..511), + sf640 INTEGER(0..639), + sf1024 INTEGER(0..1023), + sf2048 INTEGER(0..2048), + sf4096 INTEGER(0..4096), + sf8192 INTEGER(0..8192) + }, + ... +} + + +SC-MTCH-InfoList-BR-r14 ::= SEQUENCE (SIZE (0..maxSC-MTCH-BR-r14)) OF SC-MTCH-Info-BR-r14 + +SC-MTCH-Info-BR-r14 ::= SEQUENCE { + sc-mtch-CarrierFreq-r14 ARFCN-ValueEUTRA-r9, + mbmsSessionInfo-r14 MBMSSessionInfo-r13, + g-RNTI-r14 BIT STRING(SIZE(16)), + sc-mtch-schedulingInfo-r14 SC-MTCH-SchedulingInfo-BR-r14 OPTIONAL, -- Need OP + sc-mtch-neighbourCell-r14 BIT STRING (SIZE(maxNeighCell-SCPTM-r13)) OPTIONAL, -- Need OP + mpdcch-Narrowband-SC-MTCH-r14 INTEGER (1.. maxAvailNarrowBands-r13), + mpdcch-NumRepetition-SC-MTCH-r14 ENUMERATED {r1, r2, r4, r8, r16, + r32, r64, r128, r256}, + mpdcch-StartSF-SC-MTCH-r14 CHOICE { + fdd-r14 ENUMERATED {v1, v1dot5, v2, v2dot5, v4, + v5, v8, v10}, + tdd-r14 ENUMERATED {v1, v2, v4, v5, v8, v10, + v20} + }, + mpdcch-PDSCH-HoppingConfig-SC-MTCH-r14 ENUMERATED {on, off}, + mpdcch-PDSCH-CEmodeConfig-SC-MTCH-r14 ENUMERATED {ce-ModeA, ce-ModeB}, + mpdcch-PDSCH-MaxBandwidth-SC-MTCH-r14 ENUMERATED {bw1dot4, bw5}, + mpdcch-Offset-SC-MTCH-r14 ENUMERATED {zero, oneEighth, oneQuarter, + threeEighth, oneHalf, fiveEighth, + threeQuarter, sevenEighth}, + + p-a-r14 ENUMERATED { dB-6, dB-4dot77, dB-3, + dB-1dot77, dB0, dB1, dB2, + dB3} OPTIONAL,-- Need OR + ... +} + +SC-MTCH-SchedulingInfo-BR-r14::= SEQUENCE { + onDurationTimerSCPTM-r14 ENUMERATED { + psf300, psf400, psf500, psf600, + psf800, psf1000, psf1200, psf1600}, + drx-InactivityTimerSCPTM-r14 ENUMERATED { + psf0, psf1, psf2, psf4, psf8, psf16, + psf32, psf64, psf128, psf256, ps512, + psf1024, psf2048, psf4096, psf8192, psf16384}, + schedulingPeriodStartOffsetSCPTM-r14 CHOICE { + sf10 INTEGER(0..9), + sf20 INTEGER(0..19), + sf32 INTEGER(0..31), + sf40 INTEGER(0..39), + sf64 INTEGER(0..63), + sf80 INTEGER(0..79), + sf128 INTEGER(0..127), + sf160 INTEGER(0..159), + sf256 INTEGER(0..255), + sf320 INTEGER(0..319), + sf512 INTEGER(0..511), + sf640 INTEGER(0..639), + sf1024 INTEGER(0..1023), + sf2048 INTEGER(0..2047), + sf4096 INTEGER(0..4095), + sf8192 INTEGER(0..8191) + }, + ... +} + + +SCPTM-NeighbourCellList-r13 ::= SEQUENCE (SIZE (1..maxNeighCell-SCPTM-r13)) OF PCI-ARFCN-r13 + +PCI-ARFCN-r13 ::= SEQUENCE { + physCellId-r13 PhysCellId, + carrierFreq-r13 ARFCN-ValueEUTRA-r9 OPTIONAL +} + + +SL-AnchorCarrierFreqList-V2X-r14 ::= SEQUENCE (SIZE (1..maxFreqV2X-r14)) OF ARFCN-ValueEUTRA-r9 + + +SL-CBR-CommonTxConfigList-r14 ::= SEQUENCE { + cbr-RangeCommonConfigList-r14 SEQUENCE (SIZE (1..maxSL-V2X-CBRConfig-r14)) OF SL-CBR-Levels-Config-r14, + sl-CBR-PSSCH-TxConfigList-r14 SEQUENCE (SIZE (1..maxSL-V2X-TxConfig-r14)) OF SL-CBR-PSSCH-TxConfig-r14 +} + +SL-CBR-Levels-Config-r14 ::= SEQUENCE (SIZE (1..maxCBR-Level-r14)) OF SL-CBR-r14 + + +SL-CBR-PSSCH-TxConfig-r14 ::= SEQUENCE { + cr-Limit-r14 INTEGER(0..10000), + tx-Parameters-r14 SL-PSSCH-TxParameters-r14 +} + +SL-CBR-r14 ::= INTEGER(0..100) + + +SL-CBR-PPPP-TxConfigList-r14 ::= SEQUENCE (SIZE (1..8)) OF SL-PPPP-TxConfigIndex-r14 + +SL-PPPP-TxConfigIndex-r14 ::= SEQUENCE { + priorityThreshold-r14 SL-Priority-r13, + defaultTxConfigIndex-r14 INTEGER(0..maxCBR-Level-1-r14), + cbr-ConfigIndex-r14 INTEGER(0..maxSL-V2X-CBRConfig-1-r14), + tx-ConfigIndexList-r14 SEQUENCE (SIZE (1..maxCBR-Level-r14)) OF Tx-ConfigIndex-r14 +} + +Tx-ConfigIndex-r14 ::= INTEGER(0..maxSL-V2X-TxConfig-1-r14) + + +SL-CommConfig-r12 ::= SEQUENCE { + commTxResources-r12 CHOICE { + release NULL, + setup CHOICE { + scheduled-r12 SEQUENCE { + sl-RNTI-r12 C-RNTI, + mac-MainConfig-r12 MAC-MainConfigSL-r12, + sc-CommTxConfig-r12 SL-CommResourcePool-r12, + mcs-r12 INTEGER (0..28) OPTIONAL -- Need OP + }, + ue-Selected-r12 SEQUENCE { + -- Pool for normal usage + commTxPoolNormalDedicated-r12 SEQUENCE { + poolToReleaseList-r12 SL-TxPoolToReleaseList-r12 OPTIONAL, -- Need ON + poolToAddModList-r12 SL-CommTxPoolToAddModList-r12 OPTIONAL -- Need ON + } + } + } + } OPTIONAL, -- Need ON + ..., + [[ commTxResources-v1310 CHOICE { + release NULL, + setup CHOICE { + scheduled-v1310 SEQUENCE { + logicalChGroupInfoList-r13 LogicalChGroupInfoList-r13, + multipleTx-r13 BOOLEAN + }, + ue-Selected-v1310 SEQUENCE { + commTxPoolNormalDedicatedExt-r13 SEQUENCE { + poolToReleaseListExt-r13 SL-TxPoolToReleaseListExt-r13 OPTIONAL, -- Need ON + poolToAddModListExt-r13 SL-CommTxPoolToAddModListExt-r13 OPTIONAL -- Need ON + } + } + } + } OPTIONAL, -- Need ON + commTxAllowRelayDedicated-r13 BOOLEAN OPTIONAL -- Need ON + ]] +} + +LogicalChGroupInfoList-r13 ::= SEQUENCE (SIZE (1..maxLCG-r13)) OF SL-PriorityList-r13 + +SL-CommTxPoolToAddModList-r12 ::= SEQUENCE (SIZE (1..maxSL-TxPool-r12)) OF SL-CommTxPoolToAddMod-r12 + +SL-CommTxPoolToAddModListExt-r13 ::= SEQUENCE (SIZE (1..maxSL-TxPool-v1310)) OF SL-CommTxPoolToAddModExt-r13 + +SL-CommTxPoolToAddMod-r12 ::= SEQUENCE { + poolIdentity-r12 SL-TxPoolIdentity-r12, + pool-r12 SL-CommResourcePool-r12 +} + +SL-CommTxPoolToAddModExt-r13 ::= SEQUENCE { + poolIdentity-v1310 SL-TxPoolIdentity-v1310, + pool-r13 SL-CommResourcePool-r12 +} + +MAC-MainConfigSL-r12 ::= SEQUENCE { + periodic-BSR-TimerSL PeriodicBSR-Timer-r12 OPTIONAL, -- Need ON + retx-BSR-TimerSL RetxBSR-Timer-r12 +} + + +SL-CommTxPoolList-r12 ::= SEQUENCE (SIZE (1..maxSL-TxPool-r12)) OF SL-CommResourcePool-r12 + +SL-CommTxPoolListExt-r13 ::= SEQUENCE (SIZE (1..maxSL-TxPool-v1310)) OF SL-CommResourcePool-r12 + +SL-CommTxPoolListV2X-r14 ::= SEQUENCE (SIZE (1..maxSL-V2X-TxPool-r14)) OF SL-CommResourcePoolV2X-r14 + +SL-CommRxPoolList-r12 ::= SEQUENCE (SIZE (1..maxSL-RxPool-r12)) OF SL-CommResourcePool-r12 + +SL-CommRxPoolListV2X-r14 ::= SEQUENCE (SIZE (1..maxSL-V2X-RxPool-r14)) OF SL-CommResourcePoolV2X-r14 + +SL-CommResourcePool-r12 ::= SEQUENCE { + sc-CP-Len-r12 SL-CP-Len-r12, + sc-Period-r12 SL-PeriodComm-r12, + sc-TF-ResourceConfig-r12 SL-TF-ResourceConfig-r12, + data-CP-Len-r12 SL-CP-Len-r12, + dataHoppingConfig-r12 SL-HoppingConfigComm-r12, + ue-SelectedResourceConfig-r12 SEQUENCE { + data-TF-ResourceConfig-r12 SL-TF-ResourceConfig-r12, + trpt-Subset-r12 SL-TRPT-Subset-r12 OPTIONAL -- Need OP + } OPTIONAL, -- Need OR + rxParametersNCell-r12 SEQUENCE { + tdd-Config-r12 TDD-Config OPTIONAL, -- Need OP + syncConfigIndex-r12 INTEGER (0..15) + } OPTIONAL, -- Need OR + txParameters-r12 SEQUENCE { + sc-TxParameters-r12 SL-TxParameters-r12, + dataTxParameters-r12 SL-TxParameters-r12 + } OPTIONAL, -- Cond Tx + ..., + [[ priorityList-r13 SL-PriorityList-r13 OPTIONAL -- Cond Tx + ]] + +} + +SL-CommResourcePoolV2X-r14 ::= SEQUENCE { + sl-OffsetIndicator-r14 SL-OffsetIndicator-r12 OPTIONAL, -- Need OR + sl-Subframe-r14 SubframeBitmapSL-r14, + adjacencyPSCCH-PSSCH-r14 BOOLEAN, + sizeSubchannel-r14 ENUMERATED { + n4, n5, n6, n8, n9, n10, n12, n15, n16, n18, n20, n25, n30, + n48, n50, n72, n75, n96, n100, spare13, spare12, spare11, + spare10, spare9, spare8, spare7, spare6, spare5, spare4, + spare3, spare2, spare1}, + numSubchannel-r14 ENUMERATED {n1, n3, n5, n8, n10, n15, n20, spare1}, + startRB-Subchannel-r14 INTEGER (0..99), + startRB-PSCCH-Pool-r14 INTEGER (0..99) OPTIONAL, -- Need OR + rxParametersNCell-r14 SEQUENCE { + tdd-Config-r14 TDD-Config OPTIONAL, -- Need OP + syncConfigIndex-r14 INTEGER (0..15) + } OPTIONAL, -- Need OR + dataTxParameters-r14 SL-TxParameters-r12 OPTIONAL, -- Cond Tx + zoneID-r14 INTEGER (0..7) OPTIONAL, -- Need OR + threshS-RSSI-CBR-r14 INTEGER (0..45) OPTIONAL, -- Need OR + poolReportId-r14 SL-V2X-TxPoolReportIdentity-r14 OPTIONAL, -- Need OR + cbr-pssch-TxConfigList-r14 SL-CBR-PPPP-TxConfigList-r14 OPTIONAL, -- Need OR + resourceSelectionConfigP2X-r14 SL-P2X-ResourceSelectionConfig-r14 OPTIONAL, -- Cond P2X + syncAllowed-r14 SL-SyncAllowed-r14 OPTIONAL, -- Need OR + restrictResourceReservationPeriod-r14 SL-RestrictResourceReservationPeriodList-r14 OPTIONAL, -- Need OR + ... +} + +SL-TRPT-Subset-r12 ::= BIT STRING (SIZE (3..5)) + +SL-V2X-TxPoolReportIdentity-r14::= INTEGER (1..maxSL-PoolToMeasure-r14) + + +SL-CommTxPoolSensingConfig-r14 ::= SEQUENCE { + pssch-TxConfigList-r14 SL-PSSCH-TxConfigList-r14, + thresPSSCH-RSRP-List-r14 SL-ThresPSSCH-RSRP-List-r14, + restrictResourceReservationPeriod-r14 SL-RestrictResourceReservationPeriodList-r14 OPTIONAL, -- Need OR + probResourceKeep-r14 ENUMERATED {v0, v0dot2, v0dot4, v0dot6, v0dot8, + spare3,spare2, spare1}, + p2x-SensingConfig-r14 SEQUENCE { + minNumCandidateSF-r14 INTEGER (1..13), + gapCandidateSensing-r14 BIT STRING (SIZE (10)) + } OPTIONAL, -- Need OR + sl-ReselectAfter-r14 ENUMERATED {n1, n2, n3, n4, n5, n6, n7, n8, n9, + spare7, spare6, spare5, spare4, spare3, spare2, + spare1} OPTIONAL -- Need OR +} + + +SL-CP-Len-r12 ::= ENUMERATED {normal, extended} + + +SL-DiscConfig-r12 ::= SEQUENCE { + discTxResources-r12 CHOICE { + release NULL, + setup CHOICE { + scheduled-r12 SEQUENCE { + discTxConfig-r12 SL-DiscResourcePool-r12 OPTIONAL, -- Need ON + discTF-IndexList-r12 SL-TF-IndexPairList-r12 OPTIONAL, -- Need ON + discHoppingConfig-r12 SL-HoppingConfigDisc-r12 + OPTIONAL -- Need ON + }, + ue-Selected-r12 SEQUENCE { + discTxPoolDedicated-r12 SEQUENCE { + poolToReleaseList-r12 SL-TxPoolToReleaseList-r12 OPTIONAL, -- Need ON + poolToAddModList-r12 SL-DiscTxPoolToAddModList-r12 OPTIONAL -- Need ON + } OPTIONAL -- Need ON + } + } + } OPTIONAL, -- Need ON + ..., + [[ discTF-IndexList-v1260 CHOICE { + release NULL, + setup SEQUENCE { + discTF-IndexList-r12b SL-TF-IndexPairList-r12b + } + } OPTIONAL -- Need ON + ]], + [[ discTxResourcesPS-r13 CHOICE { + release NULL, + setup CHOICE { + scheduled-r13 SL-DiscTxConfigScheduled-r13, + ue-Selected-r13 SEQUENCE { + discTxPoolPS-Dedicated-r13 SL-DiscTxPoolDedicated-r13 + } + } + } OPTIONAL, -- Need ON + discTxInterFreqInfo-r13 CHOICE { + release NULL, + setup SEQUENCE { + discTxCarrierFreq-r13 ARFCN-ValueEUTRA-r9 OPTIONAL, -- Need OR + discTxRefCarrierDedicated-r13 SL-DiscTxRefCarrierDedicated-r13 OPTIONAL, -- Need OR + discTxInfoInterFreqListAdd-r13 SL-DiscTxInfoInterFreqListAdd-r13 OPTIONAL -- Need ON + } + } OPTIONAL, -- Need ON + gapRequestsAllowedDedicated-r13 BOOLEAN OPTIONAL, -- Need ON + discRxGapConfig-r13 CHOICE { + release NULL, + setup SL-GapConfig-r13 + } OPTIONAL, -- Need ON + discTxGapConfig-r13 CHOICE { + release NULL, + setup SL-GapConfig-r13 + } OPTIONAL, -- Need ON + discSysInfoToReportConfig-r13 CHOICE { + release NULL, + setup SL-DiscSysInfoToReportFreqList-r13 + } OPTIONAL -- Need ON + ]] +} + +SL-DiscSysInfoToReportFreqList-r13 ::= SEQUENCE (SIZE (1..maxFreq)) OF ARFCN-ValueEUTRA-r9 + +SL-DiscTxInfoInterFreqListAdd-r13 ::= SEQUENCE { + discTxFreqToAddModList-r13 SEQUENCE (SIZE (1..maxFreq)) OF SL-DiscTxResourceInfoPerFreq-r13 OPTIONAL, -- Need ON + discTxFreqToReleaseList-r13 SEQUENCE (SIZE (1..maxFreq)) OF ARFCN-ValueEUTRA-r9 OPTIONAL, -- Need ON + ... +} + +SL-DiscTxResourceInfoPerFreq-r13 ::= SEQUENCE { + discTxCarrierFreq-r13 ARFCN-ValueEUTRA-r9, + discTxResources-r13 SL-DiscTxResource-r13 OPTIONAL, -- Need OR + discTxResourcesPS-r13 SL-DiscTxResource-r13 OPTIONAL, -- Need OR + discTxRefCarrierDedicated-r13 SL-DiscTxRefCarrierDedicated-r13 OPTIONAL, -- Need OR + discCellSelectionInfo-r13 CellSelectionInfoNFreq-r13 OPTIONAL, -- Need OR + ... +} + +SL-DiscTxResource-r13 ::= CHOICE { + release NULL, + setup CHOICE { + scheduled-r13 SL-DiscTxConfigScheduled-r13, + ue-Selected-r13 SL-DiscTxPoolDedicated-r13 + } +} + +SL-DiscTxPoolToAddModList-r12 ::= SEQUENCE (SIZE (1..maxSL-TxPool-r12)) OF SL-DiscTxPoolToAddMod-r12 + +SL-DiscTxPoolToAddMod-r12 ::= SEQUENCE { + poolIdentity-r12 SL-TxPoolIdentity-r12, + pool-r12 SL-DiscResourcePool-r12 +} + +SL-DiscTxConfigScheduled-r13 ::= SEQUENCE { + discTxConfig-r13 SL-DiscResourcePool-r12 OPTIONAL, -- Need ON + discTF-IndexList-r13 SL-TF-IndexPairList-r12b OPTIONAL, -- Need ON + discHoppingConfig-r13 SL-HoppingConfigDisc-r12 OPTIONAL,-- Need ON + ... +} + +SL-DiscTxPoolDedicated-r13 ::= SEQUENCE { + poolToReleaseList-r13 SL-TxPoolToReleaseList-r12 OPTIONAL, -- Need ON + poolToAddModList-r13 SL-DiscTxPoolToAddModList-r12 OPTIONAL -- Need ON +} + +SL-TF-IndexPairList-r12 ::= SEQUENCE (SIZE (1..maxSL-TF-IndexPair-r12)) OF SL-TF-IndexPair-r12 + +SL-TF-IndexPair-r12 ::= SEQUENCE { + discSF-Index-r12 INTEGER (1.. 200) OPTIONAL, -- Need ON + discPRB-Index-r12 INTEGER (1.. 50) OPTIONAL -- Need ON +} + +SL-TF-IndexPairList-r12b ::= SEQUENCE (SIZE (1..maxSL-TF-IndexPair-r12)) OF SL-TF-IndexPair-r12b + +SL-TF-IndexPair-r12b ::= SEQUENCE { + discSF-Index-r12b INTEGER (0..209) OPTIONAL, -- Need ON + discPRB-Index-r12b INTEGER (0..49) OPTIONAL -- Need ON +} + +SL-DiscTxRefCarrierDedicated-r13 ::= CHOICE { + pCell NULL, + sCell SCellIndex-r10 +} + + +SL-DiscTxPoolList-r12 ::= SEQUENCE (SIZE (1..maxSL-TxPool-r12)) OF SL-DiscResourcePool-r12 + +SL-DiscRxPoolList-r12 ::= SEQUENCE (SIZE (1..maxSL-RxPool-r12)) OF SL-DiscResourcePool-r12 + +SL-DiscResourcePool-r12 ::= SEQUENCE { + cp-Len-r12 SL-CP-Len-r12, + discPeriod-r12 ENUMERATED {rf32, rf64, rf128, + rf256, rf512, rf1024, rf16-v1310, spare}, + numRetx-r12 INTEGER (0..3), + numRepetition-r12 INTEGER (1..50), + tf-ResourceConfig-r12 SL-TF-ResourceConfig-r12, + txParameters-r12 SEQUENCE { + txParametersGeneral-r12 SL-TxParameters-r12, + ue-SelectedResourceConfig-r12 SEQUENCE { + poolSelection-r12 CHOICE { + rsrpBased-r12 SL-PoolSelectionConfig-r12, + random-r12 NULL + }, + txProbability-r12 ENUMERATED {p25, p50, p75, p100} + } OPTIONAL -- Need OR + } OPTIONAL, -- Cond Tx + rxParameters-r12 SEQUENCE { + tdd-Config-r12 TDD-Config OPTIONAL, -- Need OR + syncConfigIndex-r12 INTEGER (0..15) + } OPTIONAL, -- Need OR + ..., + [[ discPeriod-v1310 CHOICE { + release NULL, + setup ENUMERATED {rf4, rf6, rf7, rf8, + rf12, rf14, rf24, rf28} + } OPTIONAL, -- Need ON + rxParamsAddNeighFreq-r13 CHOICE { + release NULL, + setup SEQUENCE { + physCellId-r13 PhysCellIdList-r13 + } + } OPTIONAL, -- Need ON + txParamsAddNeighFreq-r13 CHOICE { + release NULL, + setup SEQUENCE { + physCellId-r13 PhysCellIdList-r13, + p-Max P-Max OPTIONAL, -- Need OP + tdd-Config-r13 TDD-Config OPTIONAL, -- Cond TDD-OR + tdd-Config-v1130 TDD-Config-v1130 OPTIONAL, -- Cond TDD-OR + freqInfo SEQUENCE { + ul-CarrierFreq ARFCN-ValueEUTRA OPTIONAL, -- Need OP + ul-Bandwidth ENUMERATED {n6, n15, n25, n50, n75, n100} + OPTIONAL, -- Need OP + additionalSpectrumEmission AdditionalSpectrumEmission + }, + referenceSignalPower INTEGER (-60..50), + syncConfigIndex-r13 INTEGER (0..15) OPTIONAL -- Need OR + } + } OPTIONAL -- Need ON + ]] +} + +PhysCellIdList-r13 ::= SEQUENCE (SIZE (1.. maxSL-DiscCells-r13)) OF PhysCellId + +SL-PoolSelectionConfig-r12 ::= SEQUENCE { + threshLow-r12 RSRP-RangeSL2-r12, + threshHigh-r12 RSRP-RangeSL2-r12 +} + + +SL-DiscSysInfoReport-r13 ::= SEQUENCE { + plmn-IdentityList-r13 PLMN-IdentityList OPTIONAL, + cellIdentity-13 CellIdentity OPTIONAL, + carrierFreqInfo-13 ARFCN-ValueEUTRA-r9 OPTIONAL, + discRxResources-r13 SL-DiscRxPoolList-r12 OPTIONAL, + discTxPoolCommon-r13 SL-DiscTxPoolList-r12 OPTIONAL, + discTxPowerInfo-r13 SL-DiscTxPowerInfoList-r12 OPTIONAL, + discSyncConfig-r13 SL-SyncConfigNFreq-r13 OPTIONAL, + discCellSelectionInfo-r13 SEQUENCE { + q-RxLevMin-r13 Q-RxLevMin, + q-RxLevMinOffset-r13 INTEGER (1..8) OPTIONAL + } OPTIONAL, + cellReselectionInfo-r13 SEQUENCE { + q-Hyst-r13 ENUMERATED { + dB0, dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10, + dB12, dB14, dB16, dB18, dB20, dB22, dB24}, + q-RxLevMin-r13 Q-RxLevMin, + t-ReselectionEUTRA-r13 T-Reselection + } OPTIONAL, + tdd-Config-r13 TDD-Config OPTIONAL, + freqInfo-r13 SEQUENCE { + ul-CarrierFreq-r13 ARFCN-ValueEUTRA OPTIONAL, + ul-Bandwidth-r13 ENUMERATED {n6, n15, n25, n50, n75, n100} + OPTIONAL, + additionalSpectrumEmission-r13 AdditionalSpectrumEmission OPTIONAL + } OPTIONAL, + p-Max-r13 P-Max OPTIONAL, + referenceSignalPower-r13 INTEGER (-60..50) OPTIONAL, + ... +} + + +SL-DiscTxPowerInfoList-r12 ::= SEQUENCE (SIZE (maxSL-DiscPowerClass-r12)) OF SL-DiscTxPowerInfo-r12 + +SL-DiscTxPowerInfo-r12 ::= SEQUENCE { + discMaxTxPower-r12 P-Max, + ... +} + + +SL-GapConfig-r13 ::= SEQUENCE { + gapPatternList-r13 SL-GapPatternList-r13 +} + +SL-GapPatternList-r13 ::= SEQUENCE (SIZE (1..maxSL-GP-r13)) OF SL-GapPattern-r13 + +SL-GapPattern-r13 ::= SEQUENCE { + gapPeriod-r13 ENUMERATED {sf40, sf60, sf70, sf80, sf120, sf140, sf160, + sf240, sf280, sf320, sf640, sf1280, sf2560, sf5120, + sf10240}, + gapOffset-r12 SL-OffsetIndicator-r12, + gapSubframeBitmap-r13 BIT STRING (SIZE (1..10240)), + ... +} + + +SL-GapRequest-r13 ::= SEQUENCE (SIZE (1..maxFreq)) OF SL-GapFreqInfo-r13 + +SL-GapFreqInfo-r13 ::= SEQUENCE { + carrierFreq-r13 ARFCN-ValueEUTRA-r9 OPTIONAL, + gapPatternList-r13 SL-GapPatternList-r13 +} + + +SL-HoppingConfigComm-r12 ::= SEQUENCE { + hoppingParameter-r12 INTEGER (0..504), + numSubbands-r12 ENUMERATED {ns1, ns2, ns4}, + rb-Offset-r12 INTEGER (0..110) +} + +SL-HoppingConfigDisc-r12 ::= SEQUENCE { + a-r12 INTEGER (1..200), + b-r12 INTEGER (1..10), + c-r12 ENUMERATED {n1, n5} +} + + +SL-InterFreqInfoListV2X-r14 ::= SEQUENCE (SIZE (0..maxFreqV2X-1-r14)) OF SL-InterFreqInfoV2X-r14 + +SL-InterFreqInfoV2X-r14 ::= SEQUENCE { + plmn-IdentityList-r14 PLMN-IdentityList OPTIONAL, -- Need OP + v2x-CommCarrierFreq-r14 ARFCN-ValueEUTRA-r9, + sl-MaxTxPower-r14 P-Max OPTIONAL, -- Need OR + sl-Bandwidth-r14 ENUMERATED {n6, n15, n25, n50, n75, n100} OPTIONAL, -- Need OR + v2x-SchedulingPool-r14 SL-CommResourcePoolV2X-r14 OPTIONAL, -- Need OR + v2x-UE-ConfigList-r14 SL-V2X-UE-ConfigList-r14 OPTIONAL, -- Need OR + ... +} + + +SL-V2X-UE-ConfigList-r14 ::= SEQUENCE (SIZE (1.. maxCellIntra)) OF SL-V2X-InterFreqUE-Config-r14 + +SL-V2X-InterFreqUE-Config-r14 ::= SEQUENCE { + physCellIdList-r14 PhysCellIdList-r13 OPTIONAL, -- Need OR + typeTxSync-r14 SL-TypeTxSync-r14 OPTIONAL, -- Need OR + v2x-SyncConfig-r14 SL-SyncConfigListNFreqV2X-r14 OPTIONAL, -- Need OR + v2x-CommRxPool-r14 SL-CommRxPoolListV2X-r14 OPTIONAL, -- Need OR + v2x-CommTxPoolNormal-r14 SL-CommTxPoolListV2X-r14 OPTIONAL, -- Need OR + p2x-CommTxPoolNormal-r14 SL-CommTxPoolListV2X-r14 OPTIONAL, -- Need OR + v2x-CommTxPoolExceptional-r14 SL-CommResourcePoolV2X-r14 OPTIONAL, -- Need OR + v2x-ResourceSelectionConfig-r14 SL-CommTxPoolSensingConfig-r14 OPTIONAL, -- Need OR + zoneConfig-r14 SL-ZoneConfig-r14 OPTIONAL, -- Need OR + offsetDFN-r14 INTEGER (0..1000) OPTIONAL, -- Need OR + ... +} + + +SL-OffsetIndicator-r12 ::= CHOICE { + small-r12 INTEGER (0..319), + large-r12 INTEGER (0..10239) +} + +SL-OffsetIndicatorSync-r12 ::= INTEGER (0..39) + +SL-OffsetIndicatorSync-v1430 ::= INTEGER (40..159) + +SL-OffsetIndicatorSync-r14 ::= INTEGER (0..159) + + +SL-P2X-ResourceSelectionConfig-r14 ::= SEQUENCE { + partialSensing-r14 ENUMERATED {true} OPTIONAL, -- Need OR + randomSelection-r14 ENUMERATED {true} OPTIONAL -- Need OR +} + + +SL-PeriodComm-r12 ::= ENUMERATED {sf40, sf60, sf70, sf80, sf120, sf140, + sf160, sf240, sf280, sf320, spare6, spare5, + spare4, spare3, spare2, spare} + + +SL-PriorityList-r13 ::= SEQUENCE (SIZE (1..maxSL-Prio-r13)) OF SL-Priority-r13 + +SL-Priority-r13 ::= INTEGER (1..8) + + +SL-PSSCH-TxConfigList-r14 ::= SEQUENCE (SIZE (1..maxPSSCH-TxConfig-r14)) OF SL-PSSCH-TxConfig-r14 + +SL-PSSCH-TxConfig-r14 ::= SEQUENCE { + typeTxSync-r14 SL-TypeTxSync-r14 OPTIONAL, -- Need OR + thresUE-Speed-r14 ENUMERATED {kmph60, kmph80, kmph100, kmph120, + kmph140, kmph160, kmph180, kmph200}, + parametersAboveThres-r14 SL-PSSCH-TxParameters-r14, + parametersBelowThres-r14 SL-PSSCH-TxParameters-r14, + ... +} + +SL-PSSCH-TxParameters-r14 ::= SEQUENCE { + minMCS-PSSCH-r14 INTEGER (0..31), + maxMCS-PSSCH-r14 INTEGER (0..31), + minSubChannel-NumberPSSCH-r14 INTEGER (1..20), + maxSubchannel-NumberPSSCH-r14 INTEGER (1..20), + allowedRetxNumberPSSCH-r14 ENUMERATED {n0, n1, both, spare1}, + maxTxPower-r14 SL-TxPower-r14 OPTIONAL -- Cond CBR +} + + +SL-RestrictResourceReservationPeriodList-r14 ::= SEQUENCE (SIZE (1..maxReservationPeriod-r14)) OF SL-RestrictResourceReservationPeriod-r14 + +SL-RestrictResourceReservationPeriod-r14 ::= ENUMERATED {v0dot2, v0dot5, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, spare4,spare3, spare2, spare1} + + +SLSSID-r12 ::= INTEGER (0..167) + + +SL-SyncAllowed-r14 ::= SEQUENCE { + gnss-Sync-r14 ENUMERATED {true} OPTIONAL, -- Need OR + enb-Sync-r14 ENUMERATED {true} OPTIONAL, -- Need OR + ue-Sync-r14 ENUMERATED {true} OPTIONAL -- Need OR +} + + +SL-SyncConfigList-r12 ::= SEQUENCE (SIZE (1..maxSL-SyncConfig-r12)) OF SL-SyncConfig-r12 + +SL-SyncConfigListV2X-r14 ::= SEQUENCE (SIZE (1.. maxSL-V2X-SyncConfig-r14)) OF SL-SyncConfig-r12 + +SL-SyncConfig-r12 ::= SEQUENCE { + syncCP-Len-r12 SL-CP-Len-r12, + syncOffsetIndicator-r12 SL-OffsetIndicatorSync-r12, + slssid-r12 SLSSID-r12, + txParameters-r12 SEQUENCE { + syncTxParameters-r12 SL-TxParameters-r12, + syncTxThreshIC-r12 RSRP-RangeSL-r12, + syncInfoReserved-r12 BIT STRING (SIZE (19)) OPTIONAL -- Need OR + } OPTIONAL, -- Need OR + rxParamsNCell-r12 SEQUENCE { + physCellId-r12 PhysCellId, + discSyncWindow-r12 ENUMERATED {w1, w2} + } OPTIONAL, -- Need OR + ..., + [[ syncTxPeriodic-r13 ENUMERATED {true} OPTIONAL -- Need OR + ]], + [[ syncOffsetIndicator-v1430 SL-OffsetIndicatorSync-v1430 OPTIONAL, -- Need OR + gnss-Sync-r14 ENUMERATED {true} OPTIONAL -- Need OR + ]] +} + +SL-SyncConfigListNFreq-r13 ::= SEQUENCE (SIZE (1..maxSL-SyncConfig-r12)) OF SL-SyncConfigNFreq-r13 + +SL-SyncConfigListNFreqV2X-r14 ::= SEQUENCE (SIZE (1..maxSL-V2X-SyncConfig-r14)) OF SL-SyncConfigNFreq-r13 + +SL-SyncConfigNFreq-r13 ::= SEQUENCE { + asyncParameters-r13 SEQUENCE { + syncCP-Len-r13 SL-CP-Len-r12, + syncOffsetIndicator-r13 SL-OffsetIndicatorSync-r12, + slssid-r13 SLSSID-r12 + } OPTIONAL, -- Need OR + txParameters-r13 SEQUENCE { + syncTxParameters-r13 SL-TxParameters-r12, + syncTxThreshIC-r13 RSRP-RangeSL-r12, + syncInfoReserved-r13 BIT STRING (SIZE (19)) OPTIONAL, -- Need OR + syncTxPeriodic-r13 ENUMERATED {true} OPTIONAL -- Need OR + } OPTIONAL, -- Need OR + rxParameters-r13 SEQUENCE { + discSyncWindow-r13 ENUMERATED {w1, w2} + } OPTIONAL, -- Need OR + ..., + [[ syncOffsetIndicator-v1430 SL-OffsetIndicatorSync-v1430 OPTIONAL, -- Need OR + gnss-Sync-r14 ENUMERATED {true} OPTIONAL -- Need OR + ]] +} + + +SL-TF-ResourceConfig-r12 ::= SEQUENCE { + prb-Num-r12 INTEGER (1..100), + prb-Start-r12 INTEGER (0..99), + prb-End-r12 INTEGER (0..99), + offsetIndicator-r12 SL-OffsetIndicator-r12, + subframeBitmap-r12 SubframeBitmapSL-r12 +} + +SubframeBitmapSL-r12 ::= CHOICE { + bs4-r12 BIT STRING (SIZE (4)), + bs8-r12 BIT STRING (SIZE (8)), + bs12-r12 BIT STRING (SIZE (12)), + bs16-r12 BIT STRING (SIZE (16)), + bs30-r12 BIT STRING (SIZE (30)), + bs40-r12 BIT STRING (SIZE (40)), + bs42-r12 BIT STRING (SIZE (42)) +} + +SubframeBitmapSL-r14 ::= CHOICE { + bs10-r14 BIT STRING (SIZE (10)), + bs16-r14 BIT STRING (SIZE (16)), + bs20-r14 BIT STRING (SIZE (20)), + bs30-r14 BIT STRING (SIZE (30)), + bs40-r14 BIT STRING (SIZE (40)), + bs50-r14 BIT STRING (SIZE (50)), + bs60-r14 BIT STRING (SIZE (60)), + bs100-r14 BIT STRING (SIZE (100)) +} + + +SL-TxPower-r14 ::= CHOICE { + minusinfinity-r14 NULL, + txPower-r14 INTEGER (-41..31) +} + + +SL-TypeTxSync-r14 ::= ENUMERATED {gnss, enb, ue} + + +SL-ThresPSSCH-RSRP-List-r14 ::= SEQUENCE (SIZE (64)) OF SL-ThresPSSCH-RSRP-r14 + +SL-ThresPSSCH-RSRP-r14 ::= INTEGER (0..66) + + +SL-TxParameters-r12 ::= SEQUENCE { + alpha-r12 Alpha-r12, + p0-r12 P0-SL-r12 +} + +P0-SL-r12 ::= INTEGER (-126..31) + + +SL-TxPoolIdentity-r12 ::= INTEGER (1.. maxSL-TxPool-r12) + +SL-TxPoolIdentity-v1310 ::= INTEGER (maxSL-TxPool-r12Plus1-r13.. maxSL-TxPool-r13) + +SL-V2X-TxPoolIdentity-r14 ::= INTEGER (1.. maxSL-V2X-TxPool-r14) + + +SL-TxPoolToReleaseList-r12 ::= SEQUENCE (SIZE (1..maxSL-TxPool-r12)) OF SL-TxPoolIdentity-r12 + +SL-TxPoolToReleaseListExt-r13 ::= SEQUENCE (SIZE (1..maxSL-TxPool-v1310)) OF SL-TxPoolIdentity-v1310 + + +SL-V2X-ConfigDedicated-r14 ::= SEQUENCE { + commTxResources-r14 CHOICE { + release NULL, + setup CHOICE { + scheduled-r14 SEQUENCE { + sl-V-RNTI-r14 C-RNTI, + mac-MainConfig-r14 MAC-MainConfigSL-r12, + v2x-SchedulingPool-r14 SL-CommResourcePoolV2X-r14 OPTIONAL, -- Need ON + mcs-r14 INTEGER (0..31) OPTIONAL, -- Need OR + logicalChGroupInfoList-r14 LogicalChGroupInfoList-r13 + }, + ue-Selected-r14 SEQUENCE { + -- Pool for normal usage + v2x-CommTxPoolNormalDedicated-r14 SEQUENCE { + poolToReleaseList-r14 SL-TxPoolToReleaseListV2X-r14 OPTIONAL, -- Need ON + poolToAddModList-r14 SL-TxPoolToAddModListV2X-r14 OPTIONAL, -- Need ON + v2x-CommTxPoolSensingConfig-r14 SL-CommTxPoolSensingConfig-r14 + OPTIONAL -- Need ON + } + } + } + } OPTIONAL, -- Need ON + v2x-InterFreqInfoList-r14 SL-InterFreqInfoListV2X-r14 OPTIONAL, -- Need ON + thresSL-TxPrioritization-r14 SL-Priority-r13 OPTIONAL, -- Need OR + typeTxSync-r14 SL-TypeTxSync-r14 OPTIONAL, -- Need OR + cbr-DedicatedTxConfigList-r14 SL-CBR-CommonTxConfigList-r14 OPTIONAL, -- Need OR + ... +} + +SL-TxPoolToAddModListV2X-r14 ::= SEQUENCE (SIZE (1.. maxSL-V2X-TxPool-r14)) OF SL-TxPoolToAddMod-r14 + +SL-TxPoolToAddMod-r14 ::= SEQUENCE { + poolIdentity-r14 SL-V2X-TxPoolIdentity-r14, + pool-r14 SL-CommResourcePoolV2X-r14 +} + +SL-TxPoolToReleaseListV2X-r14 ::= SEQUENCE (SIZE (1.. maxSL-V2X-TxPool-r14)) OF SL-V2X-TxPoolIdentity-r14 + + +SL-ZoneConfig-r14 ::= SEQUENCE { + zoneLength-r14 ENUMERATED { m5, m10, m20, m50, m100, m200, m500, spare1}, + zoneWidth-r14 ENUMERATED { m5, m10, m20, m50, m100, m200, m500, spare1}, + zoneIdLongiMod-r14 INTEGER (1..4), + zoneIdLatiMod-r14 INTEGER (1..4) +} + + +maxACDC-Cat-r13 INTEGER ::= 16 -- Maximum number of ACDC categories (per PLMN) +maxAvailNarrowBands-r13 INTEGER ::= 16 -- Maximum number of narrowbands +maxBandComb-r10 INTEGER ::= 128 -- Maximum number of band combinations. +maxBandComb-r11 INTEGER ::= 256 -- Maximum number of additional band combinations. +maxBandComb-r13 INTEGER ::= 384 -- Maximum number of band combinations in Rel-13 +maxBands INTEGER ::= 64 -- Maximum number of bands listed in EUTRA UE caps +maxBandwidthClass-r10 INTEGER ::= 16 -- Maximum number of supported CA BW classes per band +maxBandwidthCombSet-r10 INTEGER ::= 32 -- Maximum number of bandwidth combination sets per + -- supported band combination +maxCBR-Level-r14 INTEGER ::= 16 -- Maximum number of CBR levels +maxCBR-Level-1-r14 INTEGER ::= 15 +maxCBR-Report-r14 INTEGER ::= 72 -- Maximum number of CBR results in a report +maxCDMA-BandClass INTEGER ::= 32 -- Maximum value of the CDMA band classes +maxCE-Level-r13 INTEGER ::= 4 -- Maximum number of CE levels +maxCellBlack INTEGER ::= 16 -- Maximum number of blacklisted physical cell identity + -- ranges listed in SIB type 4 and 5 +maxCellHistory-r12 INTEGER ::= 16 -- Maximum number of visited EUTRA cells reported +maxCellInfoGERAN-r9 INTEGER ::= 32 -- Maximum number of GERAN cells for which system in- + -- formation can be provided as redirection assistance +maxCellInfoUTRA-r9 INTEGER ::= 16 -- Maximum number of UTRA cells for which system + -- information can be provided as redirection + -- assistance +maxCombIDC-r11 INTEGER ::= 128 -- Maximum number of reported UL CA combinations +maxCSI-IM-r11 INTEGER ::= 3 -- Maximum number of CSI-IM configurations + -- (per carrier frequency) +maxCSI-IM-r12 INTEGER ::= 4 -- Maximum number of CSI-IM configurations + -- (per carrier frequency) +minCSI-IM-r13 INTEGER ::= 5 -- Minimum number of CSI IM configurations from which + -- REL-13 extension is used +maxCSI-IM-r13 INTEGER ::= 24 -- Maximum number of CSI-IM configurations + -- (per carrier frequency) +maxCSI-IM-v1310 INTEGER ::= 20 -- Maximum number of additional CSI-IM configurations + -- (per carrier frequency) +maxCSI-Proc-r11 INTEGER ::= 4 -- Maximum number of CSI processes (per carrier + -- frequency) +maxCSI-RS-NZP-r11 INTEGER ::= 3 -- Maximum number of CSI RS resource + -- configurations using non-zero Tx power + -- (per carrier frequency) +minCSI-RS-NZP-r13 INTEGER ::= 4 -- Minimum number of CSI RS resource from which + -- REL-13 extension is used +maxCSI-RS-NZP-r13 INTEGER ::= 24 -- Maximum number of CSI RS resource + -- configurations using non-zero Tx power + -- (per carrier frequency) +maxCSI-RS-NZP-v1310 INTEGER ::= 21 -- Maximum number of additional CSI RS resource + -- configurations using non-zero Tx power + -- (per carrier frequency) +maxCSI-RS-ZP-r11 INTEGER ::= 4 -- Maximum number of CSI RS resource + -- configurations using zero Tx power(per carrier + -- frequency) +maxCQI-ProcExt-r11 INTEGER ::= 3 -- Maximum number of additional periodic CQI + -- configurations (per carrier frequency) +maxFreqUTRA-TDD-r10 INTEGER ::= 6 -- Maximum number of UTRA TDD carrier frequencies for + -- which system information can be provided as + -- redirection assistance +maxCellInter INTEGER ::= 16 -- Maximum number of neighbouring inter-frequency + -- cells listed in SIB type 5 +maxCellIntra INTEGER ::= 16 -- Maximum number of neighbouring intra-frequency + -- cells listed in SIB type 4 +maxCellListGERAN INTEGER ::= 3 -- Maximum number of lists of GERAN cells +maxCellMeas INTEGER ::= 32 -- Maximum number of entries in each of the + -- cell lists in a measurement object +maxCellReport INTEGER ::= 8 -- Maximum number of reported cells/CSI-RS resources +maxConfigSPS-r14 INTEGER ::= 8 -- Maximum number of simultaneous SPS configurations +maxCSI-RS-Meas-r12 INTEGER ::= 96 -- Maximum number of entries in the CSI-RS list + -- in a measurement object +maxDRB INTEGER ::= 11 -- Maximum number of Data Radio Bearers +maxDS-Duration-r12 INTEGER ::= 5 -- Maximum number of subframes in a discovery signals + -- occasion +maxDS-ZTP-CSI-RS-r12 INTEGER ::= 5 -- Maximum number of zero transmission power CSI-RS for + -- a serving cell concerning discovery signals +maxEARFCN INTEGER ::= 65535 -- Maximum value of EUTRA carrier frequency +maxEARFCN-Plus1 INTEGER ::= 65536 -- Lowest value extended EARFCN range +maxEARFCN2 INTEGER ::= 262143 -- Highest value extended EARFCN range +maxEPDCCH-Set-r11 INTEGER ::= 2 -- Maximum number of EPDCCH sets +maxFBI INTEGER ::= 64 -- Maximum value of fequency band indicator +maxFBI-Plus1 INTEGER ::= 65 -- Lowest value extended FBI range +maxFBI2 INTEGER ::= 256 -- Highest value extended FBI range +maxFreq INTEGER ::= 8 -- Maximum number of carrier frequencies +maxFreqIDC-r11 INTEGER ::= 32 -- Maximum number of carrier frequencies that are + -- affected by the IDC problems +maxFreqMBMS-r11 INTEGER ::= 5 -- Maximum number of carrier frequencies for which an + -- MBMS capable UE may indicate an interest +maxFreqV2X-r14 INTEGER ::= 8 -- Maximum number of carrier frequencies for which V2X + -- sidelink communication can be configured +maxFreqV2X-1-r14 INTEGER ::= 7 -- Highest index of frequencies +maxGERAN-SI INTEGER ::= 10 -- Maximum number of GERAN SI blocks that can be + -- provided as part of NACC information +maxGNFG INTEGER ::= 16 -- Maximum number of GERAN neighbour freq groups +maxLCG-r13 INTEGER ::= 4 -- Maximum number of logical channel groups +maxLogMeasReport-r10 INTEGER ::= 520 -- Maximum number of logged measurement entries + -- that can be reported by the UE in one message +maxMBSFN-Allocations INTEGER ::= 8 -- Maximum number of MBSFN frame allocations with + -- different offset +maxMBSFN-Area INTEGER ::= 8 +maxMBSFN-Area-1 INTEGER ::= 7 +maxMBMS-ServiceListPerUE-r13 INTEGER ::= 15 -- Maximum number of services which the UE can + -- include in the MBMS interest indication +maxMeasId INTEGER ::= 32 +maxMeasId-Plus1 INTEGER ::= 33 +maxMeasId-r12 INTEGER ::= 64 +maxMultiBands INTEGER ::= 8 -- Maximum number of additional frequency bands + -- that a cell belongs to +maxNS-Pmax-r10 INTEGER ::= 8 -- Maximum number of NS and P-Max values per band +maxNAICS-Entries-r12 INTEGER ::= 8 -- Maximum number of supported NAICS combination(s) +maxNeighCell-r12 INTEGER ::= 8 -- Maximum number of neighbouring cells in NAICS + -- configuration (per carrier frequency) +maxNeighCell-SCPTM-r13 INTEGER ::= 8 -- Maximum number of SCPTM neighbour cells +maxObjectId INTEGER ::= 32 +maxObjectId-Plus1-r13 INTEGER ::= 33 +maxObjectId-r13 INTEGER ::= 64 +maxP-a-PerNeighCell-r12 INTEGER ::= 3 -- Maximum number of power offsets for a neighbour cell + -- in NAICS configuration +maxPageRec INTEGER ::= 16 -- +maxPhysCellIdRange-r9 INTEGER ::= 4 -- Maximum number of physical cell identity ranges +maxPLMN-r11 INTEGER ::= 6 -- Maximum number of PLMNs +maxPLMN-1-r14 INTEGER ::= 5 -- Maximum number of PLMNs minus one +maxPNOffset INTEGER ::= 511 -- Maximum number of CDMA2000 PNOffsets +maxPMCH-PerMBSFN INTEGER ::= 15 +maxPSSCH-TxConfig-r14 INTEGER ::= 16 -- Maximum number of PSSCH TX configurations +maxQCI-r13 INTEGER ::= 6 -- Maximum number of QCIs +maxRAT-Capabilities INTEGER ::= 8 -- Maximum number of interworking RATs (incl EUTRA) +maxRE-MapQCL-r11 INTEGER ::= 4 -- Maximum number of PDSCH RE Mapping configurations + -- (per carrier frequency) +maxReportConfigId INTEGER ::= 32 +maxReservationPeriod-r14 INTEGER ::= 16 -- Maximum number of resource reservation periodicities + -- for sidelink V2X communication +maxRSTD-Freq-r10 INTEGER ::= 3 -- Maximum number of frequency layers for RSTD + -- measurement +maxSAI-MBMS-r11 INTEGER ::= 64 -- Maximum number of MBMS service area identities + -- broadcast per carrier frequency +maxSCell-r10 INTEGER ::= 4 -- Maximum number of SCells +maxSCell-r13 INTEGER ::= 31 -- Highest value of extended number range of SCells +maxSC-MTCH-r13 INTEGER ::= 1023 -- Maximum number of SC-MTCHs in one cell +maxSC-MTCH-BR-r14 INTEGER ::= 128 -- Maximum number of SC-MTCHs in one cell for feMTC +maxSL-CommRxPoolNFreq-r13 INTEGER ::= 32 -- Maximum number of individual sidelink communication + -- Rx resource pools on neighbouring freq +maxSL-CommRxPoolPreconf-v1310 INTEGER ::= 12 -- Maximum number of additional preconfigured + -- sidelink communication Rx resource pool entries +maxSL-TxPool-r12Plus1-r13 INTEGER ::= 5 -- First additional individual sidelink + -- Tx resource pool +maxSL-TxPool-v1310 INTEGER ::= 4 -- Maximum number of additional sidelink + -- Tx resource pool entries +maxSL-TxPool-r13 INTEGER ::= 8 -- Maximum number of individual sidelink + -- Tx resource pools +maxSL-CommTxPoolPreconf-v1310 INTEGER ::= 7 -- Maximum number of additional preconfigured + -- sidelink Tx resource pool entries +maxSL-Dest-r12 INTEGER ::= 16 -- Maximum number of sidelink destinations +maxSL-DiscCells-r13 INTEGER ::= 16 -- Maximum number of cells with similar sidelink + -- configurations +maxSL-DiscPowerClass-r12 INTEGER ::= 3 -- Maximum number of sidelink power classes +maxSL-DiscRxPoolPreconf-r13 INTEGER ::= 16 -- Maximum number of preconfigured sidelink + -- discovery Rx resource pool entries +maxSL-DiscSysInfoReportFreq-r13 INTEGER ::= 8 -- Maximum number of frequencies to include in a + -- SidelinkUEInformation for SI reporting +maxSL-DiscTxPoolPreconf-r13 INTEGER ::= 4 -- Maximum number of preconfigured sidelink + -- discovery Tx resource pool entries +maxSL-GP-r13 INTEGER ::= 8 -- Maximum number of gap patterns that can be requested + -- for a frequency or assigned +maxSL-PoolToMeasure-r14 INTEGER ::= 72 -- Maximum number of TX resource pools for CBR + -- measurement and report +maxSL-Prio-r13 INTEGER ::= 8 -- Maximum number of entries in sidelink priority list +maxSL-RxPool-r12 INTEGER ::= 16 -- Maximum number of individual sidelink Rx resource pools +maxSL-SyncConfig-r12 INTEGER ::= 16 -- Maximum number of sidelink Sync configurations +maxSL-TF-IndexPair-r12 INTEGER ::= 64 -- Maximum number of sidelink Time Freq resource index + -- pairs +maxSL-TxPool-r12 INTEGER ::= 4 -- Maximum number of individual sidelink Tx resource pools +maxSL-V2X-RxPool-r14 INTEGER ::= 16 -- Maximum number of RX resource pools for + -- V2X sidelink communication +maxSL-V2X-RxPoolPreconf-r14 INTEGER ::= 16 -- Maximum number of RX resource pools for + -- V2X sidelink communication +maxSL-V2X-TxPool-r14 INTEGER ::= 8 -- Maximum number of TX resource pools for + -- V2X sidelink communication +maxSL-V2X-TxPoolPreconf-r14 INTEGER ::= 8 -- Maximum number of TX resource pools for + -- V2X sidelink communication +maxSL-V2X-SyncConfig-r14 INTEGER ::= 16 -- Maximum number of sidelink Sync configurations + -- for V2X sidelink communication +maxSL-V2X-CBRConfig-r14 INTEGER ::= 4 -- Maximum number of CBR range configurations + -- for V2X sidelink communication congestion + -- control +maxSL-V2X-CBRConfig-1-r14 INTEGER ::= 3 +maxSL-V2X-TxConfig-r14 INTEGER ::= 64 -- Maximum number of TX parameter configurations + -- for V2X sidelink communication congestion + -- control +maxSL-V2X-TxConfig-1-r14 INTEGER ::= 63 +maxSL-V2X-CBRConfig2-r14 INTEGER ::= 8 -- Maximum number of CBR range configurations in + -- pre-configuration for V2X sidelink + -- communication congestion control +maxSL-V2X-CBRConfig2-1-r14 INTEGER ::= 7 +maxSL-V2X-TxConfig2-r14 INTEGER ::= 128 -- Maximum number of TX parameter + -- configurations in pre-configuration for V2X + -- sidelink communication congestion control +maxSL-V2X-TxConfig2-1-r14 INTEGER ::= 127 +maxSTAG-r11 INTEGER ::= 3 -- Maximum number of STAGs +maxServCell-r10 INTEGER ::= 5 -- Maximum number of Serving cells +maxServCell-r13 INTEGER ::= 32 -- Highest value of extended number range of Serving cells +maxServiceCount INTEGER ::= 16 -- Maximum number of MBMS services that can be included + -- in an MBMS counting request and response +maxServiceCount-1 INTEGER ::= 15 +maxSessionPerPMCH INTEGER ::= 29 +maxSessionPerPMCH-1 INTEGER ::= 28 +maxSIB INTEGER ::= 32 -- Maximum number of SIBs +maxSIB-1 INTEGER ::= 31 +maxSI-Message INTEGER ::= 32 -- Maximum number of SI messages +maxSimultaneousBands-r10 INTEGER ::= 64 -- Maximum number of simultaneously aggregated bands +maxSubframePatternIDC-r11 INTEGER ::= 8 -- Maximum number of subframe reservation patterns + -- that the UE can simultaneously recommend to the + -- E-UTRAN for use. +maxTrafficPattern-r14 INTEGER ::= 8 -- Maximum number of periodical traffic patterns + -- that the UE can simultaneously report to the + -- E-UTRAN. +maxUTRA-FDD-Carrier INTEGER ::= 16 -- Maximum number of UTRA FDD carrier frequencies +maxUTRA-TDD-Carrier INTEGER ::= 16 -- Maximum number of UTRA TDD carrier frequencies +maxWLAN-Id-r12 INTEGER ::= 16 -- Maximum number of WLAN identifiers +maxWLAN-Bands-r13 INTEGER ::= 8 -- Maximum number of WLAN bands +maxWLAN-Id-r13 INTEGER ::= 32 -- Maximum number of WLAN identifiers +maxWLAN-Channels-r13 INTEGER ::= 16 -- maximum number of WLAN channels used in + -- WLAN-CarrierInfo +maxWLAN-CarrierInfo-r13 INTEGER ::= 8 -- Maximum number of WLAN Carrier Information +maxWLAN-Id-Report-r14 INTEGER ::= 32 -- Maximum number of WLAN IDs to report + + +END + + +PC5-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + TDD-ConfigSL-r12 +FROM EUTRA-RRC-Definitions; + + +SBCCH-SL-BCH-Message ::= SEQUENCE { + message SBCCH-SL-BCH-MessageType +} + +SBCCH-SL-BCH-MessageType ::= MasterInformationBlock-SL + + +SBCCH-SL-BCH-Message-V2X-r14 ::= SEQUENCE { + message SBCCH-SL-BCH-MessageType-V2X-r14 +} + +SBCCH-SL-BCH-MessageType-V2X-r14 ::= MasterInformationBlock-SL-V2X-r14 + + +MasterInformationBlock-SL ::= SEQUENCE { + sl-Bandwidth-r12 ENUMERATED { + n6, n15, n25, n50, n75, n100}, + tdd-ConfigSL-r12 TDD-ConfigSL-r12, + directFrameNumber-r12 BIT STRING (SIZE (10)), + directSubframeNumber-r12 INTEGER (0..9), + inCoverage-r12 BOOLEAN, + reserved-r12 BIT STRING (SIZE (19)) +} + + + +MasterInformationBlock-SL-V2X-r14 ::= SEQUENCE { + sl-Bandwidth-r14 ENUMERATED { + n6, n15, n25, n50, n75, n100}, + tdd-ConfigSL-r14 TDD-ConfigSL-r12, + directFrameNumber-r14 BIT STRING (SIZE (10)), + directSubframeNumber-r14 INTEGER (0..9), + inCoverage-r14 BOOLEAN, + reserved-r14 BIT STRING (SIZE (27)) +} + + + +END + + +NBIOT-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + RRCConnectionReestablishmentReject, + SecurityModeCommand, + SecurityModeComplete, + SecurityModeFailure, + AdditionalSpectrumEmission, + ARFCN-ValueEUTRA-r9, + CellIdentity, + DedicatedInfoNAS, + DRB-Identity, + InitialUE-Identity, + IntraFreqBlackCellList, + IntraFreqNeighCellList, + maxBands, + maxCellBlack, + maxCellInter, + maxFBI2, + maxFreq, + maxMultiBands, + maxPageRec, + maxPLMN-r11, + maxSAI-MBMS-r11, + maxSIB, + maxSIB-1, + MBMS-SAI-r11, + MBMS-SAI-List-r11, + MBMSSessionInfo-r13, + NextHopChainingCount, + PagingUE-Identity, + PLMN-Identity, + P-Max, + PowerRampingParameters, + PreambleTransMax, + PhysCellId, + Q-OffsetRange, + Q-QualMin-r9, + Q-RxLevMin, + ReestabUE-Identity, + RegisteredMME, + ReselectionThreshold, + ResumeIdentity-r13, + RRC-TransactionIdentifier, + RSRP-Range, + ShortMAC-I, + S-TMSI, + SystemInformationBlockType16-r11, + SystemInfoValueTagSI-r13, + T-Reordering, + TimeAlignmentTimer, + TMGI-r9, + TrackingAreaCode, + DataInactivityTimer-r14 + +FROM EUTRA-RRC-Definitions; + + +BCCH-BCH-Message-NB ::= SEQUENCE { + message BCCH-BCH-MessageType-NB +} + + +BCCH-BCH-MessageType-NB::= MasterInformationBlock-NB + + + +BCCH-DL-SCH-Message-NB ::= SEQUENCE { + message BCCH-DL-SCH-MessageType-NB +} + +BCCH-DL-SCH-MessageType-NB ::= CHOICE { + c1 CHOICE { + systemInformation-r13 SystemInformation-NB, + systemInformationBlockType1-r13 SystemInformationBlockType1-NB + }, + messageClassExtension SEQUENCE {} +} + + +PCCH-Message-NB ::= SEQUENCE { + message PCCH-MessageType-NB +} + +PCCH-MessageType-NB ::= CHOICE { + c1 CHOICE { + paging-r13 Paging-NB + }, + messageClassExtension SEQUENCE {} +} + + +DL-CCCH-Message-NB ::= SEQUENCE { + message DL-CCCH-MessageType-NB +} + +DL-CCCH-MessageType-NB ::= CHOICE { + c1 CHOICE { + rrcConnectionReestablishment-r13 RRCConnectionReestablishment-NB, + rrcConnectionReestablishmentReject-r13 RRCConnectionReestablishmentReject, + rrcConnectionReject-r13 RRCConnectionReject-NB, + rrcConnectionSetup-r13 RRCConnectionSetup-NB, + spare4 NULL, spare3 NULL, spare2 NULL, spare1 NULL + }, + messageClassExtension SEQUENCE {} +} + + +DL-DCCH-Message-NB ::= SEQUENCE { + message DL-DCCH-MessageType-NB +} + +DL-DCCH-MessageType-NB ::= CHOICE { + c1 CHOICE { + dlInformationTransfer-r13 DLInformationTransfer-NB, + rrcConnectionReconfiguration-r13 RRCConnectionReconfiguration-NB, + rrcConnectionRelease-r13 RRCConnectionRelease-NB, + securityModeCommand-r13 SecurityModeCommand, + ueCapabilityEnquiry-r13 UECapabilityEnquiry-NB, + rrcConnectionResume-r13 RRCConnectionResume-NB, + spare2 NULL, spare1 NULL + }, + messageClassExtension SEQUENCE {} +} + + + +UL-CCCH-Message-NB ::= SEQUENCE { + message UL-CCCH-MessageType-NB +} + +UL-CCCH-MessageType-NB ::= CHOICE { + c1 CHOICE { + rrcConnectionReestablishmentRequest-r13 RRCConnectionReestablishmentRequest-NB, + rrcConnectionRequest-r13 RRCConnectionRequest-NB, + rrcConnectionResumeRequest-r13 RRCConnectionResumeRequest-NB, + spare1 NULL + }, + messageClassExtension SEQUENCE {} +} + + +SC-MCCH-Message-NB ::= SEQUENCE { + message SC-MCCH-MessageType-NB +} + + +SC-MCCH-MessageType-NB ::= CHOICE { + c1 CHOICE { + scptmConfiguration-r14 SCPTMConfiguration-NB-r14 + }, + messageClassExtension SEQUENCE {} +} + + +UL-DCCH-Message-NB ::= SEQUENCE { + message UL-DCCH-MessageType-NB +} + +UL-DCCH-MessageType-NB ::= CHOICE { + c1 CHOICE { + rrcConnectionReconfigurationComplete-r13 RRCConnectionReconfigurationComplete-NB, + rrcConnectionReestablishmentComplete-r13 RRCConnectionReestablishmentComplete-NB, + rrcConnectionSetupComplete-r13 RRCConnectionSetupComplete-NB, + securityModeComplete-r13 SecurityModeComplete, + securityModeFailure-r13 SecurityModeFailure, + ueCapabilityInformation-r13 UECapabilityInformation-NB, + ulInformationTransfer-r13 ULInformationTransfer-NB, + rrcConnectionResumeComplete-r13 RRCConnectionResumeComplete-NB, + spare8 NULL, spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + messageClassExtension SEQUENCE {} +} + + +DLInformationTransfer-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + dlInformationTransfer-r13 DLInformationTransfer-NB-r13-IEs, + spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +DLInformationTransfer-NB-r13-IEs ::= SEQUENCE { + dedicatedInfoNAS-r13 DedicatedInfoNAS, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +MasterInformationBlock-NB ::= SEQUENCE { + systemFrameNumber-MSB-r13 BIT STRING (SIZE (4)), + hyperSFN-LSB-r13 BIT STRING (SIZE (2)), + schedulingInfoSIB1-r13 INTEGER (0..15), + systemInfoValueTag-r13 INTEGER (0..31), + ab-Enabled-r13 BOOLEAN, + operationModeInfo-r13 CHOICE { + inband-SamePCI-r13 Inband-SamePCI-NB-r13, + inband-DifferentPCI-r13 Inband-DifferentPCI-NB-r13, + guardband-r13 Guardband-NB-r13, + standalone-r13 Standalone-NB-r13 + }, + spare BIT STRING (SIZE (11)) +} + +ChannelRasterOffset-NB-r13 ::= ENUMERATED {khz-7dot5, khz-2dot5, khz2dot5, khz7dot5} + +Guardband-NB-r13 ::= SEQUENCE { + rasterOffset-r13 ChannelRasterOffset-NB-r13, + spare BIT STRING (SIZE (3)) +} + +Inband-SamePCI-NB-r13 ::= SEQUENCE { + eutra-CRS-SequenceInfo-r13 INTEGER (0..31) +} + +Inband-DifferentPCI-NB-r13 ::= SEQUENCE { + eutra-NumCRS-Ports-r13 ENUMERATED {same, four}, + rasterOffset-r13 ChannelRasterOffset-NB-r13, + spare BIT STRING (SIZE (2)) +} + +Standalone-NB-r13 ::= SEQUENCE { + spare BIT STRING (SIZE (5)) +} + + +Paging-NB ::= SEQUENCE { + pagingRecordList-r13 PagingRecordList-NB-r13 OPTIONAL, -- Need ON + systemInfoModification-r13 ENUMERATED {true} OPTIONAL, -- Need ON + systemInfoModification-eDRX-r13 ENUMERATED {true} OPTIONAL, -- Need ON + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +PagingRecordList-NB-r13 ::= SEQUENCE (SIZE (1..maxPageRec)) OF PagingRecord-NB-r13 + +PagingRecord-NB-r13 ::= SEQUENCE { + ue-Identity-r13 PagingUE-Identity, + ... +} + + +RRCConnectionReconfiguration-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE{ + rrcConnectionReconfiguration-r13 RRCConnectionReconfiguration-NB-r13-IEs, + spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReconfiguration-NB-r13-IEs ::= SEQUENCE { + dedicatedInfoNASList-r13 SEQUENCE (SIZE(1..maxDRB-NB-r13)) OF + DedicatedInfoNAS OPTIONAL, -- Need ON + radioResourceConfigDedicated-r13 RadioResourceConfigDedicated-NB-r13 OPTIONAL, -- Need ON + fullConfig-r13 ENUMERATED {true} OPTIONAL, -- Cond Reestab + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionReconfigurationComplete-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + rrcConnectionReconfigurationComplete-r13 RRCConnectionReconfigurationComplete-NB-r13-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReconfigurationComplete-NB-r13-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + + +RRCConnectionReestablishment-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE{ + rrcConnectionReestablishment-r13 RRCConnectionReestablishment-NB-r13-IEs, + spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReestablishment-NB-r13-IEs ::= SEQUENCE { + radioResourceConfigDedicated-r13 RadioResourceConfigDedicated-NB-r13, + nextHopChainingCount-r13 NextHopChainingCount, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension RRCConnectionReestablishment-NB-v1430-IEs OPTIONAL +} + +RRCConnectionReestablishment-NB-v1430-IEs ::= SEQUENCE { + dl-NAS-MAC BIT STRING (SIZE (16)), -- Cond Reestablish-CP + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionReestablishmentComplete-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + rrcConnectionReestablishmentComplete-r13 RRCConnectionReestablishmentComplete-NB-r13-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReestablishmentComplete-NB-r13-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionReestablishmentRequest-NB ::= SEQUENCE { + criticalExtensions CHOICE { + rrcConnectionReestablishmentRequest-r13 + RRCConnectionReestablishmentRequest-NB-r13-IEs, + later CHOICE { + rrcConnectionReestablishmentRequest-r14 + RRCConnectionReestablishmentRequest-NB-r14-IEs, + criticalExtensionsFuture SEQUENCE {} + } + } +} + +RRCConnectionReestablishmentRequest-NB-r13-IEs ::= SEQUENCE { + ue-Identity-r13 ReestabUE-Identity, + reestablishmentCause-r13 ReestablishmentCause-NB-r13, + spare BIT STRING (SIZE (25)) +} + +RRCConnectionReestablishmentRequest-NB-r14-IEs ::= SEQUENCE { + ue-Identity-r14 ReestabUE-Identity-CP-NB-r14, + reestablishmentCause-r14 ReestablishmentCause-NB-r13, + spare BIT STRING (SIZE (4)) +} + +ReestablishmentCause-NB-r13 ::= ENUMERATED { + reconfigurationFailure, otherFailure, + spare2, spare1} + +ReestabUE-Identity-CP-NB-r14 ::= SEQUENCE { + s-TMSI-r14 S-TMSI, + ul-NAS-MAC-r14 BIT STRING (SIZE (16)), + ul-NAS-Count-r14 BIT STRING (SIZE (5)) +} + + +RRCConnectionReject-NB ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE { + rrcConnectionReject-r13 RRCConnectionReject-NB-r13-IEs, + spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionReject-NB-r13-IEs ::= SEQUENCE { + extendedWaitTime-r13 INTEGER (1..1800), + rrc-SuspendIndication-r13 ENUMERATED {true} OPTIONAL, -- Need ON + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionRelease-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + rrcConnectionRelease-r13 RRCConnectionRelease-NB-r13-IEs, + spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionRelease-NB-r13-IEs ::= SEQUENCE { + releaseCause-r13 ReleaseCause-NB-r13, + resumeIdentity-r13 ResumeIdentity-r13 OPTIONAL, -- Need OR + extendedWaitTime-r13 INTEGER (1..1800) OPTIONAL, -- Need ON + redirectedCarrierInfo-r13 RedirectedCarrierInfo-NB-r13 OPTIONAL, -- Need ON + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension RRCConnectionRelease-NB-v1430-IEs OPTIONAL +} + +RRCConnectionRelease-NB-v1430-IEs ::= SEQUENCE { + redirectedCarrierInfo-v1430 RedirectedCarrierInfo-NB-v1430 OPTIONAL, -- Cond Redirection + extendedWaitTime-CPdata-r14 INTEGER (1..1800) OPTIONAL, -- Cond NoExtendedWaitTime + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +ReleaseCause-NB-r13 ::= ENUMERATED {loadBalancingTAUrequired, other, + rrc-Suspend, spare1} +RedirectedCarrierInfo-NB-r13::= CarrierFreq-NB-r13 + +RedirectedCarrierInfo-NB-v1430 ::= SEQUENCE { + redirectedCarrierOffsetDedicated-r14 ENUMERATED{ + dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10, + dB12, dB14, dB16, dB18, dB20, dB22, dB24, dB26}, + t322-r14 ENUMERATED{ + min5, min10, min20, min30, min60, min120, min180, + spare1} +} + + +RRCConnectionRequest-NB ::= SEQUENCE { + criticalExtensions CHOICE { + rrcConnectionRequest-r13 RRCConnectionRequest-NB-r13-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionRequest-NB-r13-IEs ::= SEQUENCE { + ue-Identity-r13 InitialUE-Identity, + establishmentCause-r13 EstablishmentCause-NB-r13, + multiToneSupport-r13 ENUMERATED {true} OPTIONAL, + multiCarrierSupport-r13 ENUMERATED {true} OPTIONAL, + spare BIT STRING (SIZE (22)) +} + + +RRCConnectionResume-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + rrcConnectionResume-r13 RRCConnectionResume-NB-r13-IEs, + spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionResume-NB-r13-IEs ::= SEQUENCE { + radioResourceConfigDedicated-r13 RadioResourceConfigDedicated-NB-r13 OPTIONAL, -- Need ON + nextHopChainingCount-r13 NextHopChainingCount, + drb-ContinueROHC-r13 ENUMERATED {true} OPTIONAL, -- Need OP + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionResumeComplete-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + rrcConnectionResumeComplete-r13 RRCConnectionResumeComplete-NB-r13-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionResumeComplete-NB-r13-IEs ::= SEQUENCE { + selectedPLMN-Identity-r13 INTEGER (1..maxPLMN-r11) OPTIONAL, + dedicatedInfoNAS-r13 DedicatedInfoNAS OPTIONAL, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionResumeRequest-NB ::= SEQUENCE { + criticalExtensions CHOICE { + rrcConnectionResumeRequest-r13 RRCConnectionResumeRequest-NB-r13-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionResumeRequest-NB-r13-IEs ::= SEQUENCE { + resumeID-r13 ResumeIdentity-r13, + shortResumeMAC-I-r13 ShortMAC-I, + resumeCause-r13 EstablishmentCause-NB-r13, + spare BIT STRING (SIZE (9)) +} + + +RRCConnectionSetup-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + rrcConnectionSetup-r13 RRCConnectionSetup-NB-r13-IEs, + spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionSetup-NB-r13-IEs ::= SEQUENCE { + radioResourceConfigDedicated-r13 RadioResourceConfigDedicated-NB-r13, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +RRCConnectionSetupComplete-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE{ + rrcConnectionSetupComplete-r13 RRCConnectionSetupComplete-NB-r13-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +RRCConnectionSetupComplete-NB-r13-IEs ::= SEQUENCE { + selectedPLMN-Identity-r13 INTEGER (1..maxPLMN-r11), + s-TMSI-r13 S-TMSI OPTIONAL, + registeredMME-r13 RegisteredMME OPTIONAL, + dedicatedInfoNAS-r13 DedicatedInfoNAS, + attachWithoutPDN-Connectivity-r13 ENUMERATED {true} OPTIONAL, + up-CIoT-EPS-Optimisation-r13 ENUMERATED {true} OPTIONAL, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension RRCConnectionSetupComplete-NB-v1430-IEs OPTIONAL +} + +RRCConnectionSetupComplete-NB-v1430-IEs ::= SEQUENCE { + gummei-Type-r14 ENUMERATED { mapped} OPTIONAL, + dcn-ID-r14 INTEGER (0..65535) OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SCPTMConfiguration-NB-r14 ::= SEQUENCE { + sc-mtch-InfoList-r14 SC-MTCH-InfoList-NB-r14, + scptm-NeighbourCellList-r14 SCPTM-NeighbourCellList-NB-r14 OPTIONAL, -- Need OP + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SystemInformation-NB ::= SEQUENCE { + criticalExtensions CHOICE { + systemInformation-r13 SystemInformation-NB-r13-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} +SystemInformation-NB-r13-IEs ::= SEQUENCE { + sib-TypeAndInfo-r13 SEQUENCE (SIZE (1..maxSIB)) OF CHOICE { + sib2-r13 SystemInformationBlockType2-NB-r13, + sib3-r13 SystemInformationBlockType3-NB-r13, + sib4-r13 SystemInformationBlockType4-NB-r13, + sib5-r13 SystemInformationBlockType5-NB-r13, + sib14-r13 SystemInformationBlockType14-NB-r13, + sib16-r13 SystemInformationBlockType16-NB-r13, + ..., + sib15-v1430 SystemInformationBlockType15-NB-r14, + sib20-v1430 SystemInformationBlockType20-NB-r14, + sib22-v1430 SystemInformationBlockType22-NB-r14 + }, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SystemInformationBlockType1-NB ::= SEQUENCE { + hyperSFN-MSB-r13 BIT STRING (SIZE (8)), + cellAccessRelatedInfo-r13 SEQUENCE { + plmn-IdentityList-r13 PLMN-IdentityList-NB-r13, + trackingAreaCode-r13 TrackingAreaCode, + cellIdentity-r13 CellIdentity, + cellBarred-r13 ENUMERATED {barred, notBarred}, + intraFreqReselection-r13 ENUMERATED {allowed, notAllowed} + }, + cellSelectionInfo-r13 SEQUENCE { + q-RxLevMin-r13 Q-RxLevMin, + q-QualMin-r13 Q-QualMin-r9 + }, + p-Max-r13 P-Max OPTIONAL, -- Need OP + freqBandIndicator-r13 FreqBandIndicator-NB-r13, + freqBandInfo-r13 NS-PmaxList-NB-r13 OPTIONAL, -- Need OR + multiBandInfoList-r13 MultiBandInfoList-NB-r13 OPTIONAL, -- Need OR + downlinkBitmap-r13 DL-Bitmap-NB-r13 OPTIONAL, -- Need OP, + eutraControlRegionSize-r13 ENUMERATED {n1, n2, n3} OPTIONAL, -- Cond inband + nrs-CRS-PowerOffset-r13 ENUMERATED {dB-6, dB-4dot77, dB-3, + dB-1dot77, dB0, dB1, + dB1dot23, dB2, dB3, + dB4, dB4dot23, dB5, + dB6, dB7, dB8, + dB9} OPTIONAL, -- Cond inband-SamePCI + schedulingInfoList-r13 SchedulingInfoList-NB-r13, + si-WindowLength-r13 ENUMERATED {ms160, ms320, ms480, ms640, + ms960, ms1280, ms1600, spare1}, + si-RadioFrameOffset-r13 INTEGER (1..15) OPTIONAL, -- Need OP + systemInfoValueTagList-r13 SystemInfoValueTagList-NB-r13 OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SystemInformationBlockType1-NB-v1350 OPTIONAL +} + +SystemInformationBlockType1-NB-v1350 ::= SEQUENCE { + cellSelectionInfo-v1350 CellSelectionInfo-NB-v1350 OPTIONAL, -- Cond Qrxlevmin + nonCriticalExtension SystemInformationBlockType1-NB-v1430 OPTIONAL +} + +SystemInformationBlockType1-NB-v1430 ::= SEQUENCE { + cellSelectionInfo-v1430 CellSelectionInfo-NB-v1430 OPTIONAL, -- Need OR + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +PLMN-IdentityList-NB-r13 ::= SEQUENCE (SIZE (1..maxPLMN-r11)) OF PLMN-IdentityInfo-NB-r13 + +PLMN-IdentityInfo-NB-r13 ::= SEQUENCE { + plmn-Identity-r13 PLMN-Identity, + cellReservedForOperatorUse-r13 ENUMERATED {reserved, notReserved}, + attachWithoutPDN-Connectivity-r13 ENUMERATED {true} OPTIONAL -- Need OP +} + +SchedulingInfoList-NB-r13 ::= SEQUENCE (SIZE (1..maxSI-Message-NB-r13)) OF SchedulingInfo-NB-r13 + +SchedulingInfo-NB-r13::= SEQUENCE { + si-Periodicity-r13 ENUMERATED {rf64, rf128, rf256, rf512, + rf1024, rf2048, rf4096, spare}, + si-RepetitionPattern-r13 ENUMERATED {every2ndRF, every4thRF, + every8thRF, every16thRF}, + sib-MappingInfo-r13 SIB-MappingInfo-NB-r13, + si-TB-r13 ENUMERATED {b56, b120, b208, b256, b328, b440, b552, b680} +} + +SystemInfoValueTagList-NB-r13 ::= SEQUENCE (SIZE (1.. maxSI-Message-NB-r13)) OF + SystemInfoValueTagSI-r13 + +SIB-MappingInfo-NB-r13 ::= SEQUENCE (SIZE (0..maxSIB-1)) OF SIB-Type-NB-r13 + +SIB-Type-NB-r13 ::= ENUMERATED { + sibType3-NB-r13, sibType4-NB-r13, sibType5-NB-r13, + sibType14-NB-r13, sibType16-NB-r13, sibType15-NB-r14, sibType20-NB-r14, + sibType22-NB-r14} + +CellSelectionInfo-NB-v1350 ::= SEQUENCE { + delta-RxLevMin-v1350 INTEGER (-8..-1) +} + +CellSelectionInfo-NB-v1430 ::= SEQUENCE { + powerClass14dBm-Offset-r14 ENUMERATED {dB-6, dB-3, dB3, dB6, dB9, dB12} OPTIONAL, -- Need OP + ce-authorisationOffset-r14 ENUMERATED {dB5, dB10, dB15, dB20, dB25, dB30, dB35} OPTIONAL -- Need OP +} + + +UECapabilityEnquiry-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE { + c1 CHOICE { + ueCapabilityEnquiry-r13 UECapabilityEnquiry-NB-r13-IEs, + spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UECapabilityEnquiry-NB-r13-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +UECapabilityInformation-NB ::= SEQUENCE { + rrc-TransactionIdentifier RRC-TransactionIdentifier, + criticalExtensions CHOICE{ + ueCapabilityInformation-r13 UECapabilityInformation-NB-r13-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +UECapabilityInformation-NB-r13-IEs ::= SEQUENCE { + ue-Capability-Container-r13 UE-Capability-NB-r13, + ue-RadioPagingInfo-r13 UE-RadioPagingInfo-NB-r13, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +ULInformationTransfer-NB ::= SEQUENCE { + criticalExtensions CHOICE { + ulInformationTransfer-r13 ULInformationTransfer-NB-r13-IEs, + criticalExtensionsFuture SEQUENCE {} + } +} + +ULInformationTransfer-NB-r13-IEs ::= SEQUENCE { + dedicatedInfoNAS-r13 DedicatedInfoNAS, + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SystemInformationBlockType2-NB-r13 ::= SEQUENCE { + radioResourceConfigCommon-r13 RadioResourceConfigCommonSIB-NB-r13, + ue-TimersAndConstants-r13 UE-TimersAndConstants-NB-r13, + freqInfo-r13 SEQUENCE { + ul-CarrierFreq-r13 CarrierFreq-NB-r13 OPTIONAL, -- Need OP + additionalSpectrumEmission-r13 AdditionalSpectrumEmission + }, + timeAlignmentTimerCommon-r13 TimeAlignmentTimer, + multiBandInfoList-r13 SEQUENCE (SIZE (1..maxMultiBands)) OF AdditionalSpectrumEmission OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ..., + [[ cp-Reestablishment-r14 ENUMERATED {true} OPTIONAL -- Need OP + ]] +} + + +SystemInformationBlockType3-NB-r13 ::= SEQUENCE { + cellReselectionInfoCommon-r13 SEQUENCE { + q-Hyst-r13 ENUMERATED { + dB0, dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10, + dB12, dB14, dB16, dB18, dB20, dB22, dB24 + } + }, + cellReselectionServingFreqInfo-r13 SEQUENCE { + s-NonIntraSearch-r13 ReselectionThreshold + }, + intraFreqCellReselectionInfo-r13 SEQUENCE { + q-RxLevMin-r13 Q-RxLevMin, + q-QualMin-r13 Q-QualMin-r9 OPTIONAL, -- Need OP + p-Max-r13 P-Max OPTIONAL, -- Need OP + s-IntraSearchP-r13 ReselectionThreshold, + t-Reselection-r13 T-Reselection-NB-r13 + }, + freqBandInfo-r13 NS-PmaxList-NB-r13 OPTIONAL, -- Need OR + multiBandInfoList-r13 SEQUENCE (SIZE (1..maxMultiBands)) OF + NS-PmaxList-NB-r13 OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ..., + [[ intraFreqCellReselectionInfo-v1350 IntraFreqCellReselectionInfo-NB-v1350 OPTIONAL -- Cond Qrxlevmin + ]], + [[ intraFreqCellReselectionInfo-v1360 IntraFreqCellReselectionInfo-NB-v1360 OPTIONAL -- Need OR + ]], + [[ intraFreqCellReselectionInfo-v1430 IntraFreqCellReselectionInfo-NB-v1430 OPTIONAL -- Need OR + ]] +} + +IntraFreqCellReselectionInfo-NB-v1350 ::= SEQUENCE { + delta-RxLevMin-v1350 INTEGER (-8..-1) +} + +IntraFreqCellReselectionInfo-NB-v1360 ::= SEQUENCE { + s-IntraSearchP-v1360 ReselectionThreshold-NB-v1360 +} + +IntraFreqCellReselectionInfo-NB-v1430 ::= SEQUENCE { + powerClass14dBm-Offset-r14 ENUMERATED {dB-6, dB-3, dB3, dB6, dB9, dB12} OPTIONAL, -- Need OP + ce-AuthorisationOffset-r14 ENUMERATED {dB5, dB10, dB15, dB20, dB25, dB30, dB35} OPTIONAL -- Need OP +} + + +SystemInformationBlockType4-NB-r13 ::= SEQUENCE { + intraFreqNeighCellList-r13 IntraFreqNeighCellList OPTIONAL, -- Need OR + intraFreqBlackCellList-r13 IntraFreqBlackCellList OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ... +} + + + +SystemInformationBlockType5-NB-r13 ::= SEQUENCE { + interFreqCarrierFreqList-r13 InterFreqCarrierFreqList-NB-r13, + t-Reselection-r13 T-Reselection-NB-r13, + lateNonCriticalExtension OCTET STRING OPTIONAL, + ..., + [[ scptm-FreqOffset-r14 INTEGER (1..8) OPTIONAL -- Need OP + ]] +} + + +InterFreqCarrierFreqList-NB-r13 ::= SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo-NB-r13 + + +InterFreqCarrierFreqInfo-NB-r13 ::= SEQUENCE { + dl-CarrierFreq-r13 CarrierFreq-NB-r13, + q-RxLevMin-r13 Q-RxLevMin, + q-QualMin-r13 Q-QualMin-r9 OPTIONAL, -- Need OP + p-Max-r13 P-Max OPTIONAL, -- Need OP + q-OffsetFreq-r13 Q-OffsetRange DEFAULT dB0, + interFreqNeighCellList-r13 InterFreqNeighCellList-NB-r13 OPTIONAL, -- Need OR + interFreqBlackCellList-r13 InterFreqBlackCellList-NB-r13 OPTIONAL, -- Need OR + multiBandInfoList-r13 MultiBandInfoList-NB-r13 OPTIONAL, -- Need OR + ..., + [[ delta-RxLevMin-v1350 INTEGER (-8..-1) OPTIONAL -- Cond Qrxlevmin + ]], + [[ powerClass14dBm-Offset-r14 ENUMERATED {dB-6, dB-3, dB3, dB6, dB9, dB12} +OPTIONAL, -- Need OP + ce-AuthorisationOffset-r14 ENUMERATED {dB5, dB10, dB15, dB20, dB25, dB30, dB35} OPTIONAL -- Need OP + ]] +} + +InterFreqNeighCellList-NB-r13 ::= SEQUENCE (SIZE (1..maxCellInter)) OF PhysCellId + + +InterFreqBlackCellList-NB-r13 ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PhysCellId + + + +SystemInformationBlockType14-NB-r13 ::= SEQUENCE { + ab-Param-r13 CHOICE { + ab-Common-r13 AB-Config-NB-r13, + ab-PerPLMN-List-r13 SEQUENCE (SIZE (1..maxPLMN-r11)) OF AB-ConfigPLMN-NB-r13 + } OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ... +} + +AB-ConfigPLMN-NB-r13 ::= SEQUENCE { + ab-Config-r13 AB-Config-NB-r13 OPTIONAL -- Need OR +} + +AB-Config-NB-r13 ::= SEQUENCE { + ab-Category-r13 ENUMERATED {a, b, c}, + ab-BarringBitmap-r13 BIT STRING (SIZE(10)), + ab-BarringForExceptionData-r13 ENUMERATED {true} OPTIONAL, -- Need OP + ab-BarringForSpecialAC-r13 BIT STRING (SIZE(5)) +} + + +SystemInformationBlockType15-NB-r14 ::= SEQUENCE { + mbms-SAI-IntraFreq-r14 MBMS-SAI-List-r11 OPTIONAL, -- Need OR + mbms-SAI-InterFreqList-r14 MBMS-SAI-InterFreqList-NB-r14 OPTIONAL, -- Need OR + lateNonCriticalExtension OCTET STRING OPTIONAL, + ... +} + +MBMS-SAI-InterFreqList-NB-r14 ::= SEQUENCE (SIZE (1..maxFreq)) OF MBMS-SAI-InterFreq-NB-r14 + +MBMS-SAI-InterFreq-NB-r14 ::= SEQUENCE { + dl-CarrierFreq-r14 CarrierFreq-NB-r13, + mbms-SAI-List-r14 MBMS-SAI-List-r11, + multiBandInfoList-r14 AdditionalBandInfoList-NB-r14 OPTIONAL -- Need OR +} + + +SystemInformationBlockType16-NB-r13 ::= SystemInformationBlockType16-r11 + + +SystemInformationBlockType20-NB-r14 ::= SEQUENCE { + npdcch-SC-MCCH-Config-r14 NPDCCH-SC-MCCH-Config-NB-r14, + sc-mcch-CarrierConfig-r14 CHOICE { + dl-CarrierConfig-r14 DL-CarrierConfigCommon-NB-r14, + dl-CarrierIndex-r14 INTEGER (0.. maxNonAnchorCarriers-NB-r14) + }, + sc-mcch-RepetitionPeriod-r14 ENUMERATED {rf32, rf128, rf512, rf1024, + rf2048, rf4096, rf8192, rf16384}, + sc-mcch-Offset-r14 INTEGER (0..10), + sc-mcch-ModificationPeriod-r14 ENUMERATED { rf32, rf128, rf256, rf512, rf1024, + rf2048, rf4096, rf8192, rf16384, rf32768, + rf65536, rf131072, rf262144, rf524288, + rf1048576, spare1}, + sc-mcch-SchedulingInfo-r14 SC-MCCH-SchedulingInfo-NB-r14 OPTIONAL, -- Need OP + lateNonCriticalExtension OCTET STRING OPTIONAL, + ... +} + +NPDCCH-SC-MCCH-Config-NB-r14 ::= SEQUENCE { + npdcch-NumRepetitions-SC-MCCH-r14 ENUMERATED {r1, r2, r4, r8, r16, + r32, r64, r128, r256, + r512, r1024, r2048}, + npdcch-StartSF-SC-MCCH-r14 ENUMERATED {v1dot5, v2, v4, v8, + v16, v32, v48, v64}, + npdcch-Offset-SC-MCCH-r14 ENUMERATED {zero, oneEighth, oneQuarter, + threeEighth, oneHalf, fiveEighth, + threeQuarter, sevenEighth} +} + +SC-MCCH-SchedulingInfo-NB-r14::= SEQUENCE { + onDurationTimerSCPTM-r14 ENUMERATED { + pp1, pp2, pp3, pp4, + pp8, pp16, pp32, spare}, + drx-InactivityTimerSCPTM-r14 ENUMERATED { + pp0, pp1, pp2, pp3, + pp4, pp8, pp16, pp32}, + schedulingPeriodStartOffsetSCPTM-r14 CHOICE { + sf10 INTEGER(0..9), + sf20 INTEGER(0..19), + sf32 INTEGER(0..31), + sf40 INTEGER(0..39), + sf64 INTEGER(0..63), + sf80 INTEGER(0..79), + sf128 INTEGER(0..127), + sf160 INTEGER(0..159), + sf256 INTEGER(0..255), + sf320 INTEGER(0..319), + sf512 INTEGER(0..511), + sf640 INTEGER(0..639), + sf1024 INTEGER(0..1023), + sf2048 INTEGER(0..2047), + sf4096 INTEGER(0..4095), + sf8192 INTEGER(0..8191) + }, + ... +} + + +SystemInformationBlockType22-NB-r14 ::= SEQUENCE { + dl-ConfigList-r14 DL-ConfigCommonList-NB-r14 OPTIONAL, -- Need OR + ul-ConfigList-r14 UL-ConfigCommonList-NB-r14 OPTIONAL, -- Need OR + pagingWeightAnchor-r14 PagingWeight-NB-r14 OPTIONAL, -- Cond pcch-config + nprach-ProbabilityAnchorList-r14 NPRACH-ProbabilityAnchorList-NB-r14 OPTIONAL, -- Cond nprach-config + lateNonCriticalExtension OCTET STRING OPTIONAL, + ... +} + +DL-ConfigCommonList-NB-r14 ::= SEQUENCE (SIZE (1.. maxNonAnchorCarriers-NB-r14)) OF + DL-ConfigCommon-NB-r14 + +UL-ConfigCommonList-NB-r14 ::= SEQUENCE (SIZE (1.. maxNonAnchorCarriers-NB-r14)) OF + UL-ConfigCommon-NB-r14 + + +DL-ConfigCommon-NB-r14 ::= SEQUENCE { + dl-CarrierConfig-r14 DL-CarrierConfigCommon-NB-r14, + pcch-Config-r14 PCCH-Config-NB-r14 OPTIONAL, -- Need OR + ... +} + +PCCH-Config-NB-r14 ::= SEQUENCE { + npdcch-NumRepetitionPaging-r14 ENUMERATED { + r1, r2, r4, r8, r16, r32, r64, r128, + r256, r512, r1024, r2048, + spare4, spare3, spare2, spare1} OPTIONAL, -- Need OP + pagingWeight-r14 PagingWeight-NB-r14 DEFAULT w1, + ... +} + +PagingWeight-NB-r14 ::= ENUMERATED {w1, w2, w3, w4, w5, w6, w7, w8, + w9, w10, w11, w12, w13, w14, w15, w16} + +UL-ConfigCommon-NB-r14 ::= SEQUENCE { + ul-CarrierFreq-r14 CarrierFreq-NB-r13, + nprach-ParametersList-r14 NPRACH-ParametersList-NB-r14 OPTIONAL, -- Need OR + ... +} + +NPRACH-ParametersList-NB-r14 ::= SEQUENCE (SIZE (1.. maxNPRACH-Resources-NB-r13)) OF + NPRACH-Parameters-NB-r14 + + +NPRACH-Parameters-NB-r14 ::= SEQUENCE { + nprach-Parameters-r14 SEQUENCE { + nprach-Periodicity-r14 ENUMERATED {ms40, ms80, ms160, ms240, + ms320, ms640, ms1280, ms2560} + OPTIONAL, -- NEED OP + nprach-StartTime-r14 ENUMERATED {ms8, ms16, ms32, ms64, + ms128, ms256, ms512, ms1024} + OPTIONAL, -- NEED OP + nprach-SubcarrierOffset-r14 ENUMERATED {n0, n12, n24, n36, n2, n18, n34, spare1} + OPTIONAL, -- NEED OP + nprach-NumSubcarriers-r14 ENUMERATED {n12, n24, n36, n48} + OPTIONAL, -- NEED OP + nprach-SubcarrierMSG3-RangeStart-r14 ENUMERATED {zero, oneThird, twoThird, one} + OPTIONAL, -- NEED OP + npdcch-NumRepetitions-RA-r14 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, r128, + r256, r512, r1024, r2048, + spare4, spare3, spare2, spare1} + OPTIONAL, -- NEED OP + npdcch-StartSF-CSS-RA-r14 ENUMERATED {v1dot5, v2, v4, v8, v16, v32, v48, v64} + OPTIONAL, -- NEED OP + npdcch-Offset-RA-r14 ENUMERATED {zero, oneEighth, oneFourth, threeEighth} + OPTIONAL, -- NEED OP + nprach-NumCBRA-StartSubcarriers-r14 ENUMERATED {n8, n10, n11, n12, n20, n22, n23, n24, + n32, n34, n35, n36, n40, n44, n46, n48} + OPTIONAL, -- NEED OP + npdcch-CarrierIndex-r14 INTEGER (1..maxNonAnchorCarriers-NB-r14) + OPTIONAL, -- Need OP + ... + } OPTIONAL -- Need OR +} + +NPRACH-ProbabilityAnchorList-NB-r14 ::= SEQUENCE (SIZE (1.. maxNPRACH-Resources-NB-r13)) OF + NPRACH-ProbabilityAnchor-NB-r14 + +NPRACH-ProbabilityAnchor-NB-r14 ::= SEQUENCE { + nprach-ProbabilityAnchor-r14 ENUMERATED { + zero, oneSixteenth, oneFifteenth, oneFourteenth, + oneThirteenth, oneTwelfth, oneEleventh, oneTenth, + oneNinth, oneEightth, oneSeventh, oneSixth, + oneFifth, oneFourth, oneThird, oneHalf} + OPTIONAL -- Need OP +} + + +CarrierConfigDedicated-NB-r13 ::= SEQUENCE { + dl-CarrierConfig-r13 DL-CarrierConfigDedicated-NB-r13, + ul-CarrierConfig-r13 UL-CarrierConfigDedicated-NB-r13 +} + +DL-CarrierConfigDedicated-NB-r13 ::= SEQUENCE { + dl-CarrierFreq-r13 CarrierFreq-NB-r13, + downlinkBitmapNonAnchor-r13 CHOICE { + useNoBitmap-r13 NULL, + useAnchorBitmap-r13 NULL, + explicitBitmapConfiguration-r13 DL-Bitmap-NB-r13, + spare NULL + } OPTIONAL, -- Need ON + dl-GapNonAnchor-r13 CHOICE { + useNoGap-r13 NULL, + useAnchorGapConfig-r13 NULL, + explicitGapConfiguration-r13 DL-GapConfig-NB-r13, + spare NULL + } OPTIONAL, -- Need ON + inbandCarrierInfo-r13 SEQUENCE { + samePCI-Indicator-r13 CHOICE { + samePCI-r13 SEQUENCE { + indexToMidPRB-r13 INTEGER (-55..54) + }, + differentPCI-r13 SEQUENCE { + eutra-NumCRS-Ports-r13 ENUMERATED {same, four} + } + } OPTIONAL, -- Cond anchor-guardband + eutraControlRegionSize-r13 ENUMERATED {n1, n2, n3} + } OPTIONAL, -- Cond non-anchor-inband + ..., + [[ nrs-PowerOffsetNonAnchor-v1330 ENUMERATED {dB-12, dB-10, dB-8, dB-6, + dB-4, dB-2, dB0, dB3} + OPTIONAL -- Need ON + ]] +} + +UL-CarrierConfigDedicated-NB-r13 ::= SEQUENCE { + ul-CarrierFreq-r13 CarrierFreq-NB-r13 OPTIONAL, -- Need OP + ... +} + + +CarrierFreq-NB-r13 ::= SEQUENCE { + carrierFreq-r13 ARFCN-ValueEUTRA-r9, + carrierFreqOffset-r13 ENUMERATED { + v-10, v-9, v-8, v-7, v-6, v-5, v-4, v-3, v-2, v-1, v-0dot5, + v0, v1, v2, v3, v4, v5, v6, v7, v8, v9 + } OPTIONAL -- Need ON +} + + +DL-Bitmap-NB-r13 ::= CHOICE { + subframePattern10-r13 BIT STRING (SIZE (10)), + subframePattern40-r13 BIT STRING (SIZE (40)) +} + + +DL-CarrierConfigCommon-NB-r14 ::= SEQUENCE { + dl-CarrierFreq-r14 CarrierFreq-NB-r13, + downlinkBitmapNonAnchor-r14 CHOICE { + useNoBitmap-r14 NULL, + useAnchorBitmap-r14 NULL, + explicitBitmapConfiguration-r14 DL-Bitmap-NB-r13 + }, + dl-GapNonAnchor-r14 CHOICE { + useNoGap-r14 NULL, + useAnchorGapConfig-r14 NULL, + explicitGapConfiguration-r14 DL-GapConfig-NB-r13 + }, + inbandCarrierInfo-r14 SEQUENCE { + samePCI-Indicator-r14 CHOICE { + samePCI-r14 SEQUENCE { + indexToMidPRB-r14 INTEGER (-55..54) + }, + differentPCI-r14 SEQUENCE { + eutra-NumCRS-Ports-r14 ENUMERATED {same, four} + } + } OPTIONAL, -- Cond anchor-guardband + eutraControlRegionSize-r14 ENUMERATED {n1, n2, n3} + } OPTIONAL, -- Cond non-anchor-inband + nrs-PowerOffsetNonAnchor-r14 ENUMERATED {dB-12, dB-10, dB-8, dB-6, + dB-4, dB-2, dB0, dB3} DEFAULT dB0, + ... +} + + + +DL-GapConfig-NB-r13 ::= SEQUENCE { + dl-GapThreshold-r13 ENUMERATED {n32, n64, n128, n256}, + dl-GapPeriodicity-r13 ENUMERATED {sf64, sf128, sf256, sf512}, + dl-GapDurationCoeff-r13 ENUMERATED {oneEighth, oneFourth, threeEighth, oneHalf} +} + + +LogicalChannelConfig-NB-r13 ::= SEQUENCE { + priority-r13 INTEGER (1..16) OPTIONAL, -- Cond UL + logicalChannelSR-Prohibit-r13 BOOLEAN OPTIONAL, -- Need ON + ... +} + + +MAC-MainConfig-NB-r13 ::= SEQUENCE { + ul-SCH-Config-r13 SEQUENCE { + periodicBSR-Timer-r13 PeriodicBSR-Timer-NB-r13 OPTIONAL, -- Need ON + retxBSR-Timer-r13 RetxBSR-Timer-NB-r13 + } OPTIONAL, -- Need ON + drx-Config-r13 DRX-Config-NB-r13 OPTIONAL, -- Need ON + timeAlignmentTimerDedicated-r13 TimeAlignmentTimer, + logicalChannelSR-Config-r13 CHOICE { + release NULL, + setup SEQUENCE { + logicalChannelSR-ProhibitTimer-r13 ENUMERATED { + pp2, pp8, pp32, pp128, pp512, + pp1024, pp2048, spare} + } + } OPTIONAL, -- Need ON + ..., + [[ rai-Activation-r14 ENUMERATED {true} OPTIONAL, -- Need OR + dataInactivityTimerConfig-r14 CHOICE { + release NULL, + setup SEQUENCE { + dataInactivityTimer-r14 DataInactivityTimer-r14 + } + } OPTIONAL -- Need ON + ]], + [[ drx-Cycle-v1430 ENUMERATED { + sf1280, sf2560, sf5120, sf10240} OPTIONAL -- Need ON + ]] + +} + +PeriodicBSR-Timer-NB-r13 ::= ENUMERATED { + pp2, pp4, pp8, pp16, pp64, pp128, infinity, spare} + +RetxBSR-Timer-NB-r13 ::= ENUMERATED { + pp4, pp16, pp64, pp128, pp256, pp512, infinity, spare} + +DRX-Config-NB-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + onDurationTimer-r13 ENUMERATED { + pp1, pp2, pp3, pp4, pp8, pp16, pp32, spare}, + drx-InactivityTimer-r13 ENUMERATED { + pp0, pp1, pp2, pp3, pp4, pp8, pp16, pp32}, + drx-RetransmissionTimer-r13 ENUMERATED { + pp0, pp1, pp2, pp4, pp6, pp8, pp16, pp24, + pp33, spare7, spare6, spare5, + spare4, spare3, spare2, spare1}, + drx-Cycle-r13 ENUMERATED { + sf256, sf512, sf1024, sf1536, sf2048, sf3072, + sf4096, sf4608, sf6144, sf7680, sf8192, sf9216, + spare4, spare3, spare2, spare1}, + drx-StartOffset-r13 INTEGER (0..255), + drx-ULRetransmissionTimer-r13 ENUMERATED { + pp0, pp1, pp2, pp4, pp6, pp8, pp16, pp24, + pp33, pp40, pp64, pp80, pp96, + pp112, pp128, pp160, pp320} + } +} + + + +NPDCCH-ConfigDedicated-NB-r13 ::= SEQUENCE { + npdcch-NumRepetitions-r13 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, r128, + r256, r512, r1024, r2048, + spare4, spare3, spare2, spare1}, + npdcch-StartSF-USS-r13 ENUMERATED {v1dot5, v2, v4, v8, v16, v32, v48, v64}, + npdcch-Offset-USS-r13 ENUMERATED {zero, oneEighth, oneFourth, threeEighth} +} + + + +NPDSCH-ConfigCommon-NB-r13 ::= SEQUENCE { + nrs-Power-r13 INTEGER (-60..50) +} + + +NPRACH-ConfigSIB-NB-r13 ::= SEQUENCE { + nprach-CP-Length-r13 ENUMERATED {us66dot7, us266dot7}, + rsrp-ThresholdsPrachInfoList-r13 RSRP-ThresholdsNPRACH-InfoList-NB-r13 OPTIONAL, -- need OR + nprach-ParametersList-r13 NPRACH-ParametersList-NB-r13 +} + +NPRACH-ConfigSIB-NB-v1330 ::= SEQUENCE { + nprach-ParametersList-v1330 NPRACH-ParametersList-NB-v1330 +} + +NPRACH-ParametersList-NB-r13 ::= SEQUENCE (SIZE (1.. maxNPRACH-Resources-NB-r13)) OF NPRACH-Parameters-NB-r13 + +NPRACH-ParametersList-NB-v1330 ::= SEQUENCE (SIZE (1.. maxNPRACH-Resources-NB-r13)) OF NPRACH-Parameters-NB-v1330 + +NPRACH-Parameters-NB-r13::= SEQUENCE { + nprach-Periodicity-r13 ENUMERATED {ms40, ms80, ms160, ms240, + ms320, ms640, ms1280, ms2560}, + nprach-StartTime-r13 ENUMERATED {ms8, ms16, ms32, ms64, + ms128, ms256, ms512, ms1024}, + nprach-SubcarrierOffset-r13 ENUMERATED {n0, n12, n24, n36, n2, n18, n34, spare1}, + nprach-NumSubcarriers-r13 ENUMERATED {n12, n24, n36, n48}, + nprach-SubcarrierMSG3-RangeStart-r13 ENUMERATED {zero, oneThird, twoThird, one}, + maxNumPreambleAttemptCE-r13 ENUMERATED {n3, n4, n5, n6, n7, n8, n10, spare1}, + numRepetitionsPerPreambleAttempt-r13 ENUMERATED {n1, n2, n4, n8, n16, n32, n64, n128}, + npdcch-NumRepetitions-RA-r13 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, r128, + r256, r512, r1024, r2048, + spare4, spare3, spare2, spare1}, + npdcch-StartSF-CSS-RA-r13 ENUMERATED {v1dot5, v2, v4, v8, v16, v32, v48, v64}, + npdcch-Offset-RA-r13 ENUMERATED {zero, oneEighth, oneFourth, threeEighth} +} + +NPRACH-Parameters-NB-v1330 ::= SEQUENCE { + nprach-NumCBRA-StartSubcarriers-r13 ENUMERATED {n8, n10, n11, n12, n20, n22, n23, n24, + n32, n34, n35, n36, n40, n44, n46, n48} +} + +RSRP-ThresholdsNPRACH-InfoList-NB-r13 ::= SEQUENCE (SIZE(1..2)) OF RSRP-Range + + +NPUSCH-ConfigCommon-NB-r13 ::= SEQUENCE { + ack-NACK-NumRepetitions-Msg4-r13 SEQUENCE (SIZE(1.. maxNPRACH-Resources-NB-r13)) OF + ACK-NACK-NumRepetitions-NB-r13, + srs-SubframeConfig-r13 ENUMERATED { + sc0, sc1, sc2, sc3, sc4, sc5, sc6, sc7, + sc8, sc9, sc10, sc11, sc12, sc13, sc14, sc15 + } OPTIONAL, -- Need OR + dmrs-Config-r13 SEQUENCE { + threeTone-BaseSequence-r13 INTEGER (0..12) OPTIONAL, -- Need OP + threeTone-CyclicShift-r13 INTEGER (0..2), + sixTone-BaseSequence-r13 INTEGER (0..14) OPTIONAL, -- Need OP + sixTone-CyclicShift-r13 INTEGER (0..3), + twelveTone-BaseSequence-r13 INTEGER (0..30) OPTIONAL -- Need OP + } OPTIONAL, -- Need OR + ul-ReferenceSignalsNPUSCH-r13 UL-ReferenceSignalsNPUSCH-NB-r13 +} + +UL-ReferenceSignalsNPUSCH-NB-r13 ::= SEQUENCE { + groupHoppingEnabled-r13 BOOLEAN, + groupAssignmentNPUSCH-r13 INTEGER (0..29) +} + +NPUSCH-ConfigDedicated-NB-r13 ::= SEQUENCE { + ack-NACK-NumRepetitions-r13 ACK-NACK-NumRepetitions-NB-r13 OPTIONAL, -- Need ON + npusch-AllSymbols-r13 BOOLEAN OPTIONAL, -- Cond SRS + groupHoppingDisabled-r13 ENUMERATED {true} OPTIONAL -- Need OR +} + +ACK-NACK-NumRepetitions-NB-r13 ::= ENUMERATED {r1, r2, r4, r8, r16, r32, r64, r128} + + + +PDCP-Config-NB-r13 ::= SEQUENCE { + discardTimer-r13 ENUMERATED { + ms5120, ms10240, ms20480, ms40960, + ms81920, infinity, spare2, spare1 + } OPTIONAL, -- Cond Setup + headerCompression-r13 CHOICE { + notUsed NULL, + rohc SEQUENCE { + maxCID-r13 INTEGER (1..16383) DEFAULT 15, + profiles-r13 SEQUENCE { + profile0x0002 BOOLEAN, + profile0x0003 BOOLEAN, + profile0x0004 BOOLEAN, + profile0x0006 BOOLEAN, + profile0x0102 BOOLEAN, + profile0x0103 BOOLEAN, + profile0x0104 BOOLEAN + }, + ... + } + }, + ... +} + + +PhysicalConfigDedicated-NB-r13 ::= SEQUENCE { + carrierConfigDedicated-r13 CarrierConfigDedicated-NB-r13 OPTIONAL, -- Need ON + npdcch-ConfigDedicated-r13 NPDCCH-ConfigDedicated-NB-r13 OPTIONAL, -- Need ON + npusch-ConfigDedicated-r13 NPUSCH-ConfigDedicated-NB-r13 OPTIONAL, -- Need ON + uplinkPowerControlDedicated-r13 UplinkPowerControlDedicated-NB-r13 OPTIONAL, -- Need ON + ..., + [[ twoHARQ-ProcessesConfig-r14 ENUMERATED {true} OPTIONAL -- Need OR + ]] +} + + +RACH-ConfigCommon-NB-r13 ::= SEQUENCE { + preambleTransMax-CE-r13 PreambleTransMax, + powerRampingParameters-r13 PowerRampingParameters, + rach-InfoList-r13 RACH-InfoList-NB-r13, + connEstFailOffset-r13 INTEGER (0..15) OPTIONAL, -- Need OP + ... +} + +RACH-InfoList-NB-r13 ::= SEQUENCE (SIZE (1.. maxNPRACH-Resources-NB-r13)) OF RACH-Info-NB-r13 + +RACH-Info-NB-r13 ::= SEQUENCE { + ra-ResponseWindowSize-r13 ENUMERATED { + pp2, pp3, pp4, pp5, pp6, pp7, pp8, pp10}, + mac-ContentionResolutionTimer-r13 ENUMERATED { + pp1, pp2, pp3, pp4, pp8, pp16, pp32, pp64} +} + + +RadioResourceConfigCommonSIB-NB-r13 ::= SEQUENCE { + rach-ConfigCommon-r13 RACH-ConfigCommon-NB-r13, + bcch-Config-r13 BCCH-Config-NB-r13, + pcch-Config-r13 PCCH-Config-NB-r13, + nprach-Config-r13 NPRACH-ConfigSIB-NB-r13, + npdsch-ConfigCommon-r13 NPDSCH-ConfigCommon-NB-r13, + npusch-ConfigCommon-r13 NPUSCH-ConfigCommon-NB-r13, + dl-Gap-r13 DL-GapConfig-NB-r13 OPTIONAL, -- Need OP + uplinkPowerControlCommon-r13 UplinkPowerControlCommon-NB-r13, + ..., + [[ nprach-Config-v1330 NPRACH-ConfigSIB-NB-v1330 OPTIONAL -- Need OR + ]] +} + +BCCH-Config-NB-r13 ::= SEQUENCE { + modificationPeriodCoeff-r13 ENUMERATED {n16, n32, n64, n128} +} + + +PCCH-Config-NB-r13 ::= SEQUENCE { + defaultPagingCycle-r13 ENUMERATED {rf128, rf256, rf512, rf1024}, + nB-r13 ENUMERATED { + fourT, twoT, oneT, halfT, quarterT, one8thT, + one16thT, one32ndT, one64thT, + one128thT, one256thT, one512thT, one1024thT, + spare3, spare2, spare1}, + npdcch-NumRepetitionPaging-r13 ENUMERATED { + r1, r2, r4, r8, r16, r32, r64, r128, + r256, r512, r1024, r2048, + spare4, spare3, spare2, spare1} +} + + +RadioResourceConfigDedicated-NB-r13 ::= SEQUENCE { + srb-ToAddModList-r13 SRB-ToAddModList-NB-r13 OPTIONAL, -- Need ON + drb-ToAddModList-r13 DRB-ToAddModList-NB-r13 OPTIONAL, -- Need ON + drb-ToReleaseList-r13 DRB-ToReleaseList-NB-r13 OPTIONAL, -- Need ON + mac-MainConfig-r13 CHOICE { + explicitValue-r13 MAC-MainConfig-NB-r13, + defaultValue-r13 NULL + } OPTIONAL, -- Need ON + physicalConfigDedicated-r13 PhysicalConfigDedicated-NB-r13 OPTIONAL, -- Need ON + rlf-TimersAndConstants-r13 RLF-TimersAndConstants-NB-r13 OPTIONAL, -- Need ON + ... +} + +SRB-ToAddModList-NB-r13 ::= SEQUENCE (SIZE (1)) OF SRB-ToAddMod-NB-r13 + +SRB-ToAddMod-NB-r13 ::= SEQUENCE { + rlc-Config-r13 CHOICE { + explicitValue RLC-Config-NB-r13, + defaultValue NULL + } OPTIONAL, -- Cond Setup + logicalChannelConfig-r13 CHOICE { + explicitValue LogicalChannelConfig-NB-r13, + defaultValue NULL + } OPTIONAL, -- Cond Setup + ..., + [[ rlc-Config-v1430 RLC-Config-NB-v1430 OPTIONAL -- Need ON + ]] +} + +DRB-ToAddModList-NB-r13 ::= SEQUENCE (SIZE (1..maxDRB-NB-r13)) OF DRB-ToAddMod-NB-r13 + +DRB-ToAddMod-NB-r13 ::= SEQUENCE { + eps-BearerIdentity-r13 INTEGER (0..15) OPTIONAL, -- Cond DRB-Setup + drb-Identity-r13 DRB-Identity, + pdcp-Config-r13 PDCP-Config-NB-r13 OPTIONAL, -- Cond Setup + rlc-Config-r13 RLC-Config-NB-r13 OPTIONAL, -- Cond Setup + logicalChannelIdentity-r13 INTEGER (3..10) OPTIONAL, -- Cond DRB-Setup + logicalChannelConfig-r13 LogicalChannelConfig-NB-r13 OPTIONAL, -- Cond Setup + ..., + [[ rlc-Config-v1430 RLC-Config-NB-v1430 OPTIONAL -- Need ON + ]] +} + +DRB-ToReleaseList-NB-r13 ::= SEQUENCE (SIZE (1..maxDRB-NB-r13)) OF DRB-Identity + + +RLC-Config-NB-r13 ::= CHOICE { + am SEQUENCE { + ul-AM-RLC-r13 UL-AM-RLC-NB-r13, + dl-AM-RLC-r13 DL-AM-RLC-NB-r13 + }, + ... +} + +RLC-Config-NB-v1430 ::= SEQUENCE { + t-Reordering-r14 T-Reordering OPTIONAL -- Cond twoHARQ +} + +UL-AM-RLC-NB-r13 ::= SEQUENCE { + t-PollRetransmit-r13 T-PollRetransmit-NB-r13, + maxRetxThreshold-r13 ENUMERATED {t1, t2, t3, t4, t6, t8, t16, t32} +} + +DL-AM-RLC-NB-r13 ::= SEQUENCE { + enableStatusReportSN-Gap-r13 ENUMERATED {true} OPTIONAL +} + +T-PollRetransmit-NB-r13 ::= ENUMERATED { + ms250, ms500, ms1000, ms2000, ms3000, ms4000, + ms6000, ms10000, ms15000, ms25000, ms40000, ms60000, + ms90000, ms120000, ms180000, spare1} + + + + +RLF-TimersAndConstants-NB-r13 ::= CHOICE { + release NULL, + setup SEQUENCE { + t301-r13 ENUMERATED { + ms2500, ms4000, ms6000, ms10000, + ms15000, ms25000, ms40000, ms60000}, + t310-r13 ENUMERATED { + ms0, ms200, ms500, ms1000, ms2000, ms4000, ms8000}, + n310-r13 ENUMERATED { + n1, n2, n3, n4, n6, n8, n10, n20}, + t311-r13 ENUMERATED { + ms1000, ms3000, ms5000, ms10000, ms15000, + ms20000, ms30000}, + n311-r13 ENUMERATED { + n1, n2, n3, n4, n5, n6, n8, n10}, + ..., + [[ t311-v1350 ENUMERATED { + ms40000, ms60000, ms90000, ms120000} + OPTIONAL -- Need OR + ]] + } +} + + + +UplinkPowerControlCommon-NB-r13 ::= SEQUENCE { + p0-NominalNPUSCH-r13 INTEGER (-126..24), + alpha-r13 ENUMERATED {al0, al04, al05, al06, al07, al08, al09, al1}, + deltaPreambleMsg3-r13 INTEGER (-1..6) +} + +UplinkPowerControlDedicated-NB-r13 ::= SEQUENCE { + p0-UE-NPUSCH-r13 INTEGER (-8..7) +} + + +AdditionalBandInfoList-NB-r14 ::= SEQUENCE (SIZE (1..maxMultiBands)) OF FreqBandIndicator-NB-r13 + + +FreqBandIndicator-NB-r13 ::= INTEGER (1.. maxFBI2) + + +MultiBandInfoList-NB-r13 ::= SEQUENCE (SIZE (1..maxMultiBands)) OF MultiBandInfo-NB-r13 + +MultiBandInfo-NB-r13 ::= SEQUENCE { + freqBandIndicator-r13 FreqBandIndicator-NB-r13 OPTIONAL, -- Need OR + freqBandInfo-r13 NS-PmaxList-NB-r13 OPTIONAL -- Need OR +} + + +NS-PmaxList-NB-r13 ::= SEQUENCE (SIZE (1..maxNS-Pmax-NB-r13)) OF NS-PmaxValue-NB-r13 + +NS-PmaxValue-NB-r13 ::= SEQUENCE { + additionalPmax-r13 P-Max OPTIONAL, -- Need OR + additionalSpectrumEmission-r13 AdditionalSpectrumEmission +} + + +ReselectionThreshold-NB-v1360 ::= INTEGER (32..63) + + +T-Reselection-NB-r13 ::= ENUMERATED {s0, s3, s6, s9, s12, s15, s18, s21} + + +EstablishmentCause-NB-r13 ::= ENUMERATED { + mt-Access, mo-Signalling, mo-Data, mo-ExceptionData, + delayTolerantAccess-v1330, spare3, spare2, spare1} + + +UE-Capability-NB-r13 ::= SEQUENCE { + accessStratumRelease-r13 AccessStratumRelease-NB-r13, + ue-Category-NB-r13 ENUMERATED {nb1} OPTIONAL, + multipleDRB-r13 ENUMERATED {supported} OPTIONAL, + pdcp-Parameters-r13 PDCP-Parameters-NB-r13 OPTIONAL, + phyLayerParameters-r13 PhyLayerParameters-NB-r13, + rf-Parameters-r13 RF-Parameters-NB-r13, + nonCriticalExtension UE-Capability-NB-v1430-IEs OPTIONAL +} + +UE-Capability-NB-v1430-IEs ::= SEQUENCE { + ue-Category-NB-r14 ENUMERATED {nb2} OPTIONAL, + mac-Parameters-r14 MAC-Parameters-NB-r14 OPTIONAL, phyLayerParameters-v1430 PhyLayerParameters-NB-v1430 OPTIONAL, + rf-Parameters-v1430 RF-Parameters-NB-v1430, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +AccessStratumRelease-NB-r13 ::= ENUMERATED {rel13, rel14, spare6, spare5, spare4, spare3, spare2, spare1, ...} + +PDCP-Parameters-NB-r13 ::= SEQUENCE { + supportedROHC-Profiles-r13 SEQUENCE { + profile0x0002 BOOLEAN, + profile0x0003 BOOLEAN, + profile0x0004 BOOLEAN, + profile0x0006 BOOLEAN, + profile0x0102 BOOLEAN, + profile0x0103 BOOLEAN, + profile0x0104 BOOLEAN + }, + maxNumberROHC-ContextSessions-r13 ENUMERATED {cs2, cs4, cs8, cs12} DEFAULT cs2, + ... +} + +MAC-Parameters-NB-r14 ::= SEQUENCE { + dataInactMon-r14 ENUMERATED {supported} OPTIONAL, + rai-Support-r14 ENUMERATED {supported} OPTIONAL +} + +PhyLayerParameters-NB-r13 ::= SEQUENCE { + multiTone-r13 ENUMERATED {supported} OPTIONAL, + multiCarrier-r13 ENUMERATED {supported} OPTIONAL + } + +PhyLayerParameters-NB-v1430 ::= SEQUENCE { + multiCarrier-NPRACH-r14 ENUMERATED {supported} OPTIONAL, + twoHARQ-Processes-r14 ENUMERATED {supported} OPTIONAL +} + +RF-Parameters-NB-r13 ::= SEQUENCE { + supportedBandList-r13 SupportedBandList-NB-r13, + multiNS-Pmax-r13 ENUMERATED {supported} OPTIONAL +} + +RF-Parameters-NB-v1430 ::= SEQUENCE { + powerClassNB-14dBm-r14 ENUMERATED {supported} OPTIONAL +} + +SupportedBandList-NB-r13 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBand-NB-r13 + +SupportedBand-NB-r13 ::= SEQUENCE { + band-r13 FreqBandIndicator-NB-r13, + powerClassNB-20dBm-r13 ENUMERATED {supported} OPTIONAL +} + + +UE-RadioPagingInfo-NB-r13 ::= SEQUENCE { + ue-Category-NB-r13 ENUMERATED {nb1} OPTIONAL, + ..., + [[ multiCarrierPaging-r14 ENUMERATED {true} OPTIONAL + ]] +} + + +UE-TimersAndConstants-NB-r13 ::= SEQUENCE { + t300-r13 ENUMERATED { + ms2500, ms4000, ms6000, ms10000, + ms15000, ms25000, ms40000, ms60000}, + t301-r13 ENUMERATED { + ms2500, ms4000, ms6000, ms10000, + ms15000, ms25000, ms40000, ms60000}, + t310-r13 ENUMERATED { + ms0, ms200, ms500, ms1000, ms2000, ms4000, ms8000}, + n310-r13 ENUMERATED { + n1, n2, n3, n4, n6, n8, n10, n20}, + t311-r13 ENUMERATED { + ms1000, ms3000, ms5000, ms10000, ms15000, + ms20000, ms30000}, + n311-r13 ENUMERATED { + n1, n2, n3, n4, n5, n6, n8, n10}, + ..., + [[ t311-v1350 ENUMERATED { + ms40000, ms60000, ms90000, ms120000} + OPTIONAL -- Need OR + ]] +} + + +SC-MTCH-InfoList-NB-r14 ::= SEQUENCE (SIZE (0.. maxSC-MTCH-NB-r14)) OF SC-MTCH-Info-NB-r14 + +SC-MTCH-Info-NB-r14 ::= SEQUENCE { + sc-mtch-CarrierConfig-r14 CHOICE { + dl-CarrierConfig-r14 DL-CarrierConfigCommon-NB-r14, + dl-CarrierIndex-r14 INTEGER (0.. maxNonAnchorCarriers-NB-r14) + }, + mbmsSessionInfo-r14 MBMSSessionInfo-r13, + g-RNTI-r14 BIT STRING(SIZE(16)), + sc-mtch-SchedulingInfo-r14 SC-MTCH-SchedulingInfo-NB-r14 OPTIONAL, -- Need OP + sc-mtch-NeighbourCell-r14 BIT STRING (SIZE(maxNeighCell-SCPTM-NB-r14)) OPTIONAL, -- Need OP + npdcch-NPDSCH-MaxTBS-SC-MTCH-r14 ENUMERATED {n680, n2536}, + npdcch-NumRepetitions-SC-MTCH-r14 ENUMERATED {r1, r2, r4, r8, r16, + r32, r64, r128, r256, + r512, r1024, r2048, spare4, + spare3, spare2, spare1}, + npdcch-StartSF-SC-MTCH-r14 ENUMERATED {v1dot5, v2, v4, v8, + v16, v32, v48, v64}, + npdcch-Offset-SC-MTCH-r14 ENUMERATED {zero, oneEight, oneQuarter, + threeEight, oneHalf, fiveEight, + threeQuarter, sevenEight}, + ... +} + +SC-MTCH-SchedulingInfo-NB-r14 ::= SEQUENCE { + onDurationTimerSCPTM-r14 ENUMERATED { + pp1, pp2, pp3, pp4, + pp8, pp16, pp32, spare}, + drx-InactivityTimerSCPTM-r14 ENUMERATED { + pp0, pp1, pp2, pp3, + pp4, pp8, pp16, pp32}, + schedulingPeriodStartOffsetSCPTM-r14 CHOICE { + sf10 INTEGER(0..9), + sf20 INTEGER(0..19), + sf32 INTEGER(0..31), + sf40 INTEGER(0..39), + sf64 INTEGER(0..63), + sf80 INTEGER(0..79), + sf128 INTEGER(0..127), + sf160 INTEGER(0..159), + sf256 INTEGER(0..255), + sf320 INTEGER(0..319), + sf512 INTEGER(0..511), + sf640 INTEGER(0..639), + sf1024 INTEGER(0..1023), + sf2048 INTEGER(0..2047), + sf4096 INTEGER(0..4095), + sf8192 INTEGER(0..8191) + }, + ... +} + + +SCPTM-NeighbourCellList-NB-r14 ::= SEQUENCE (SIZE (1..maxNeighCell-SCPTM-NB-r14)) OF PCI-ARFCN-NB-r14 + +PCI-ARFCN-NB-r14 ::= SEQUENCE { + physCellId-r14 PhysCellId, + carrierFreq-r14 CarrierFreq-NB-r13 OPTIONAL -- Need OP +} + + +maxNPRACH-Resources-NB-r13 INTEGER ::= 3 -- Maximum number of NPRACH resources for NB-IoT +maxNonAnchorCarriers-NB-r14 INTEGER ::= 15 -- Maximum number of non-anchor carriers for NB-IoT +maxDRB-NB-r13 INTEGER ::= 2 -- Maximum number of Data Radio Bearers for NB-IoT +maxNeighCell-SCPTM-NB-r14 INTEGER ::= 8 -- Maximum number of SCPTM neighbour cells +maxNS-Pmax-NB-r13 INTEGER ::= 4 -- Maximum number of NS and P-Max values per band +maxSC-MTCH-NB-r14 INTEGER ::= 64 -- Maximum number of SC-MTCHs in one cell for NB-IoT +maxSI-Message-NB-r13 INTEGER ::= 8 -- Maximum number of SI messages for NB-IoT + + +END + + +EUTRA-UE-Variables DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + AbsoluteTimeInfo-r10, + AreaConfiguration-r10, + AreaConfiguration-v1130, + CarrierFreqGERAN, + CellIdentity, + ConnEstFailReport-r11, + SpeedStateScaleFactors, + C-RNTI, + LoggingDuration-r10, + LoggingInterval-r10, + LogMeasInfo-r10, + MeasCSI-RS-Id-r12, + MeasId, + MeasId-v1250, + MeasIdToAddModList, + MeasIdToAddModListExt-r12, + MeasIdToAddModList-v1310, + MeasIdToAddModListExt-v1310, + MeasObjectToAddModList, + MeasObjectToAddModList-v9e0, + MeasObjectToAddModListExt-r13, + MeasScaleFactor-r12, + MobilityStateParameters, + NeighCellConfig, + PhysCellId, + PhysCellIdCDMA2000, + PhysCellIdGERAN, + PhysCellIdUTRA-FDD, + PhysCellIdUTRA-TDD, + PLMN-Identity, + PLMN-IdentityList3-r11, + QuantityConfig, + ReportConfigToAddModList, + RLF-Report-r9, + TargetMBSFN-AreaList-r12, + TraceReference-r10, + Tx-ResourcePoolMeasList-r14, + VisitedCellInfoList-r12, + maxCellMeas, + maxCSI-RS-Meas-r12, + maxMeasId, + maxMeasId-r12, + UL-DelayConfig-r13, + WLAN-CarrierInfo-r13, + WLAN-Identifiers-r12, + WLAN-Id-List-r13, + WLAN-Status-r13, + WLAN-Status-v1430, + WLAN-SuspendConfig-r14 + +FROM EUTRA-RRC-Definitions; + + +VarConnEstFailReport-r11 ::= SEQUENCE { + connEstFailReport-r11 ConnEstFailReport-r11, + plmn-Identity-r11 PLMN-Identity +} + + +VarLogMeasConfig-r10 ::= SEQUENCE { + areaConfiguration-r10 AreaConfiguration-r10 OPTIONAL, + loggingDuration-r10 LoggingDuration-r10, + loggingInterval-r10 LoggingInterval-r10 +} + +VarLogMeasConfig-r11 ::= SEQUENCE { + areaConfiguration-r10 AreaConfiguration-r10 OPTIONAL, + areaConfiguration-v1130 AreaConfiguration-v1130 OPTIONAL, + loggingDuration-r10 LoggingDuration-r10, + loggingInterval-r10 LoggingInterval-r10 +} + +VarLogMeasConfig-r12 ::= SEQUENCE { + areaConfiguration-r10 AreaConfiguration-r10 OPTIONAL, + areaConfiguration-v1130 AreaConfiguration-v1130 OPTIONAL, + loggingDuration-r10 LoggingDuration-r10, + loggingInterval-r10 LoggingInterval-r10, + targetMBSFN-AreaList-r12 TargetMBSFN-AreaList-r12 OPTIONAL +} + + +VarLogMeasReport-r10 ::= SEQUENCE { + traceReference-r10 TraceReference-r10, + traceRecordingSessionRef-r10 OCTET STRING (SIZE (2)), + tce-Id-r10 OCTET STRING (SIZE (1)), + plmn-Identity-r10 PLMN-Identity, + absoluteTimeInfo-r10 AbsoluteTimeInfo-r10, + logMeasInfoList-r10 LogMeasInfoList2-r10 +} + +VarLogMeasReport-r11 ::= SEQUENCE { + traceReference-r10 TraceReference-r10, + traceRecordingSessionRef-r10 OCTET STRING (SIZE (2)), + tce-Id-r10 OCTET STRING (SIZE (1)), + plmn-IdentityList-r11 PLMN-IdentityList3-r11, + absoluteTimeInfo-r10 AbsoluteTimeInfo-r10, + logMeasInfoList-r10 LogMeasInfoList2-r10 +} + +LogMeasInfoList2-r10 ::= SEQUENCE (SIZE (1..maxLogMeas-r10)) OF LogMeasInfo-r10 + + +VarMeasConfig ::= SEQUENCE { + -- Measurement identities + measIdList MeasIdToAddModList OPTIONAL, + measIdListExt-r12 MeasIdToAddModListExt-r12 OPTIONAL, + measIdList-v1310 MeasIdToAddModList-v1310 OPTIONAL, + measIdListExt-v1310 MeasIdToAddModListExt-v1310 OPTIONAL, + -- Measurement objects + measObjectList MeasObjectToAddModList OPTIONAL, + measObjectListExt-r13 MeasObjectToAddModListExt-r13 OPTIONAL, + measObjectList-v9i0 MeasObjectToAddModList-v9e0 OPTIONAL, + -- Reporting configurations + reportConfigList ReportConfigToAddModList OPTIONAL, + -- Other parameters + quantityConfig QuantityConfig OPTIONAL, + measScaleFactor-r12 MeasScaleFactor-r12 OPTIONAL, + s-Measure INTEGER (-140..-44) OPTIONAL, + speedStatePars CHOICE { + release NULL, + setup SEQUENCE { + mobilityStateParameters MobilityStateParameters, + timeToTrigger-SF SpeedStateScaleFactors + } + } OPTIONAL, + allowInterruptions-r11 BOOLEAN OPTIONAL +} + + +VarMeasReportList ::= SEQUENCE (SIZE (1..maxMeasId)) OF VarMeasReport +VarMeasReportList-r12 ::= SEQUENCE (SIZE (1..maxMeasId-r12)) OF VarMeasReport + +VarMeasReport ::= SEQUENCE { + -- List of measurement that have been triggered + measId MeasId, + measId-v1250 MeasId-v1250 OPTIONAL, + cellsTriggeredList CellsTriggeredList OPTIONAL, + csi-RS-TriggeredList-r12 CSI-RS-TriggeredList-r12 OPTIONAL, + poolsTriggeredList-r14 Tx-ResourcePoolMeasList-r14 OPTIONAL, + numberOfReportsSent INTEGER +} + +CellsTriggeredList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CHOICE { + physCellIdEUTRA PhysCellId, + physCellIdUTRA CHOICE { + fdd PhysCellIdUTRA-FDD, + tdd PhysCellIdUTRA-TDD + }, + physCellIdGERAN SEQUENCE { + carrierFreq CarrierFreqGERAN, + physCellId PhysCellIdGERAN + }, + physCellIdCDMA2000 PhysCellIdCDMA2000, + wlan-Identifiers-r13 WLAN-Identifiers-r12 +} + +CSI-RS-TriggeredList-r12 ::= SEQUENCE (SIZE (1..maxCSI-RS-Meas-r12)) OF MeasCSI-RS-Id-r12 + +VarMobilityHistoryReport-r12 ::= VisitedCellInfoList-r12 + + +VarRLF-Report-r10 ::= SEQUENCE { + rlf-Report-r10 RLF-Report-r9, + plmn-Identity-r10 PLMN-Identity +} + +VarRLF-Report-r11 ::= SEQUENCE { + rlf-Report-r10 RLF-Report-r9, + plmn-IdentityList-r11 PLMN-IdentityList3-r11 +} + + +VarShortMAC-Input ::= SEQUENCE { + cellIdentity CellIdentity, + physCellId PhysCellId, + c-RNTI C-RNTI +} + + +VarShortResumeMAC-Input-r13 ::= SEQUENCE { + cellIdentity-r13 CellIdentity, + physCellId-r13 PhysCellId, + c-RNTI-r13 C-RNTI, + resumeDiscriminator-r13 BIT STRING(SIZE(1)) +} + + +VarWLAN-MobilityConfig ::= SEQUENCE { + wlan-MobilitySet-r13 WLAN-Id-List-r13 OPTIONAL, + successReportRequested ENUMERATED {true} OPTIONAL, + wlan-SuspendConfig-r14 WLAN-SuspendConfig-r14 OPTIONAL +} + + +VarWLAN-Status-r13 ::= SEQUENCE { + status-r13 WLAN-Status-r13, + status-r14 WLAN-Status-v1430 OPTIONAL +} + + +maxLogMeas-r10 INTEGER ::= 4060-- Maximum number of logged measurement entries + -- that can be stored by the UE + + +END + + +NBIOT-UE-Variables DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + VarShortMAC-Input, + VarShortResumeMAC-Input-r13 + +FROM EUTRA-UE-Variables; + +VarShortMAC-Input-NB-r13 ::= VarShortMAC-Input + +VarShortResumeMAC-Input-NB-r13 ::= VarShortResumeMAC-Input-r13 + + +END + + +EUTRA-Sidelink-Preconf DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + AdditionalSpectrumEmission, + ARFCN-ValueEUTRA-r9, + FilterCoefficient, + maxCBR-Level-r14, + maxCBR-Level-1-r14, + maxFreq, + maxFreqV2X-r14, + maxSL-TxPool-r12, + maxSL-CommRxPoolPreconf-v1310, + maxSL-CommTxPoolPreconf-v1310, + maxSL-DiscRxPoolPreconf-r13, + maxSL-DiscTxPoolPreconf-r13, + maxSL-V2X-CBRConfig2-r14, + maxSL-V2X-CBRConfig2-1-r14, + maxSL-V2X-RxPoolPreconf-r14, + maxSL-V2X-TxConfig2-r14, + maxSL-V2X-TxConfig2-1-r14, + maxSL-V2X-TxPoolPreconf-r14, + P-Max, + ReselectionInfoRelay-r13, + SL-AnchorCarrierFreqList-V2X-r14, + SL-CBR-Levels-Config-r14, + SL-CBR-PSSCH-TxConfig-r14, + SL-CommTxPoolSensingConfig-r14, + SL-CP-Len-r12, + SL-HoppingConfigComm-r12, + SL-OffsetIndicator-r12, + SL-OffsetIndicatorSync-r12, + SL-OffsetIndicatorSync-v1430, + SL-PeriodComm-r12, + RSRP-RangeSL3-r12, + SL-PriorityList-r13, + SL-TF-ResourceConfig-r12, + SL-TRPT-Subset-r12, + SL-TxParameters-r12, + SL-ZoneConfig-r14, + P0-SL-r12, + TDD-ConfigSL-r12, + SubframeBitmapSL-r14, + SL-P2X-ResourceSelectionConfig-r14, + SL-RestrictResourceReservationPeriodList-r14, + SL-SyncAllowed-r14, + SL-OffsetIndicatorSync-r14, + SL-Priority-r13 +FROM EUTRA-RRC-Definitions; + + +SL-Preconfiguration-r12 ::= SEQUENCE { + preconfigGeneral-r12 SL-PreconfigGeneral-r12, + preconfigSync-r12 SL-PreconfigSync-r12, + preconfigComm-r12 SL-PreconfigCommPoolList4-r12, + ..., + [[ preconfigComm-v1310 SEQUENCE { + commRxPoolList-r13 SL-PreconfigCommRxPoolList-r13, + commTxPoolList-r13 SL-PreconfigCommTxPoolList-r13 OPTIONAL + } OPTIONAL, + preconfigDisc-r13 SEQUENCE { + discRxPoolList-r13 SL-PreconfigDiscRxPoolList-r13, + discTxPoolList-r13 SL-PreconfigDiscTxPoolList-r13 OPTIONAL + } OPTIONAL, + preconfigRelay-r13 SL-PreconfigRelay-r13 OPTIONAL + ]] + +} + +SL-PreconfigGeneral-r12 ::= SEQUENCE { + -- PDCP configuration + rohc-Profiles-r12 SEQUENCE { + profile0x0001-r12 BOOLEAN, + profile0x0002-r12 BOOLEAN, + profile0x0004-r12 BOOLEAN, + profile0x0006-r12 BOOLEAN, + profile0x0101-r12 BOOLEAN, + profile0x0102-r12 BOOLEAN, + profile0x0104-r12 BOOLEAN + }, + -- Physical configuration + carrierFreq-r12 ARFCN-ValueEUTRA-r9, + maxTxPower-r12 P-Max, + additionalSpectrumEmission-r12 AdditionalSpectrumEmission, + sl-bandwidth-r12 ENUMERATED {n6, n15, n25, n50, n75, n100}, + tdd-ConfigSL-r12 TDD-ConfigSL-r12, + reserved-r12 BIT STRING (SIZE (19)), + ... +} + +SL-PreconfigSync-r12 ::= SEQUENCE { + syncCP-Len-r12 SL-CP-Len-r12, + syncOffsetIndicator1-r12 SL-OffsetIndicatorSync-r12, + syncOffsetIndicator2-r12 SL-OffsetIndicatorSync-r12, + syncTxParameters-r12 P0-SL-r12, + syncTxThreshOoC-r12 RSRP-RangeSL3-r12, + filterCoefficient-r12 FilterCoefficient, + syncRefMinHyst-r12 ENUMERATED {dB0, dB3, dB6, dB9, dB12}, + syncRefDiffHyst-r12 ENUMERATED {dB0, dB3, dB6, dB9, dB12, dBinf}, + ..., + [[ syncTxPeriodic-r13 ENUMERATED {true} OPTIONAL + ]] +} + +SL-PreconfigCommPoolList4-r12 ::= SEQUENCE (SIZE (1..maxSL-TxPool-r12)) OF SL-PreconfigCommPool-r12 + +SL-PreconfigCommRxPoolList-r13 ::= SEQUENCE (SIZE (1..maxSL-CommRxPoolPreconf-v1310)) OF SL-PreconfigCommPool-r12 + +SL-PreconfigCommTxPoolList-r13 ::= SEQUENCE (SIZE (1..maxSL-CommTxPoolPreconf-v1310)) OF SL-PreconfigCommPool-r12 + +SL-PreconfigCommPool-r12 ::= SEQUENCE { +-- This IE is same as SL-CommResourcePool with rxParametersNCell absent + sc-CP-Len-r12 SL-CP-Len-r12, + sc-Period-r12 SL-PeriodComm-r12, + sc-TF-ResourceConfig-r12 SL-TF-ResourceConfig-r12, + sc-TxParameters-r12 P0-SL-r12, + data-CP-Len-r12 SL-CP-Len-r12, + data-TF-ResourceConfig-r12 SL-TF-ResourceConfig-r12, + dataHoppingConfig-r12 SL-HoppingConfigComm-r12, + dataTxParameters-r12 P0-SL-r12, + trpt-Subset-r12 SL-TRPT-Subset-r12, + ..., + [[ priorityList-r13 SL-PriorityList-r13 OPTIONAL -- For Tx + ]] +} + +SL-PreconfigDiscRxPoolList-r13 ::= SEQUENCE (SIZE (1..maxSL-DiscRxPoolPreconf-r13)) OF SL-PreconfigDiscPool-r13 + +SL-PreconfigDiscTxPoolList-r13 ::= SEQUENCE (SIZE (1..maxSL-DiscTxPoolPreconf-r13)) OF SL-PreconfigDiscPool-r13 + +SL-PreconfigDiscPool-r13 ::= SEQUENCE { +-- This IE is same as SL-DiscResourcePool with rxParameters absent + cp-Len-r13 SL-CP-Len-r12, + discPeriod-r13 ENUMERATED {rf4, rf6, rf7, rf8, rf12, rf14, rf16, rf24, rf28, + rf32, rf64, rf128, rf256, rf512, rf1024, spare}, + numRetx-r13 INTEGER (0..3), + numRepetition-r13 INTEGER (1..50), + tf-ResourceConfig-r13 SL-TF-ResourceConfig-r12, + txParameters-r13 SEQUENCE { + txParametersGeneral-r13 P0-SL-r12, + txProbability-r13 ENUMERATED {p25, p50, p75, p100} + } OPTIONAL, + ... +} + +SL-PreconfigRelay-r13 ::= SEQUENCE { + reselectionInfoOoC-r13 ReselectionInfoRelay-r13 +} + + +SL-V2X-Preconfiguration-r14 ::= SEQUENCE { + v2x-PreconfigFreqList-r14 SL-V2X-PreconfigFreqList-r14, + anchorCarrierFreqList-r14 SL-AnchorCarrierFreqList-V2X-r14 OPTIONAL, + cbr-PreconfigList-r14 SL-CBR-PreconfigTxConfigList-r14 OPTIONAL, + ... +} + +SL-CBR-PreconfigTxConfigList-r14 ::= SEQUENCE { + cbr-RangeCommonConfigList-r14 SEQUENCE (SIZE (1..maxSL-V2X-CBRConfig2-r14)) OF SL-CBR-Levels-Config-r14, + sl-CBR-PSSCH-TxConfigList-r14 SEQUENCE (SIZE (1..maxSL-V2X-TxConfig2-r14)) OF SL-CBR-PSSCH-TxConfig-r14 +} + +SL-V2X-PreconfigFreqList-r14 ::= SEQUENCE (SIZE (1..maxFreqV2X-r14)) OF SL-V2X-PreconfigFreqInfo-r14 + +SL-V2X-PreconfigFreqInfo-r14 ::= SEQUENCE { + v2x-CommPreconfigGeneral-r14 SL-PreconfigGeneral-r12, + v2x-CommPreconfigSync-r14 SL-PreconfigV2X-Sync-r14 OPTIONAL, + v2x-CommRxPoolList-r14 SL-PreconfigV2X-RxPoolList-r14, + v2x-CommTxPoolList-r14 SL-PreconfigV2X-TxPoolList-r14, + p2x-CommTxPoolList-r14 SL-PreconfigV2X-TxPoolList-r14, + v2x-ResourceSelectionConfig-r14 SL-CommTxPoolSensingConfig-r14 OPTIONAL, + zoneConfig-r14 SL-ZoneConfig-r14 OPTIONAL, + syncPriority-r14 ENUMERATED {gnss, enb}, + thresSL-TxPrioritization-r14 SL-Priority-r13 OPTIONAL, + offsetDFN-r14 INTEGER (0..1000) OPTIONAL, + ... +} + +SL-PreconfigV2X-RxPoolList-r14 ::= SEQUENCE (SIZE (1..maxSL-V2X-RxPoolPreconf-r14)) OF SL-V2X-PreconfigCommPool-r14 + +SL-PreconfigV2X-TxPoolList-r14 ::= SEQUENCE (SIZE (1..maxSL-V2X-TxPoolPreconf-r14)) OF SL-V2X-PreconfigCommPool-r14 + +SL-V2X-PreconfigCommPool-r14 ::= SEQUENCE { +-- This IE is same as SL-CommResourcePoolV2X with rxParametersNCell absent + sl-OffsetIndicator-r14 SL-OffsetIndicator-r12 OPTIONAL, + sl-Subframe-r14 SubframeBitmapSL-r14, + adjacencyPSCCH-PSSCH-r14 BOOLEAN, + sizeSubchannel-r14 ENUMERATED { + n4, n5, n6, n8, n9, n10, n12, n15, n16, n18, n20, n25, n30, + n48, n50, n72, n75, n96, n100, spare13, spare12, spare11, + spare10, spare9, spare8, spare7, spare6, spare5, spare4, + spare3, spare2, spare1}, + numSubchannel-r14 ENUMERATED {n1, n3, n5, n8, n10, n15, n20, spare1}, + startRB-Subchannel-r14 INTEGER (0..99), + startRB-PSCCH-Pool-r14 INTEGER (0..99) OPTIONAL, + dataTxParameters-r14 P0-SL-r12, + zoneID-r14 INTEGER (0..7) OPTIONAL, + threshS-RSSI-CBR-r14 INTEGER (0..45) OPTIONAL, + cbr-pssch-TxConfigList-r14 SL-CBR-PPPP-TxPreconfigList-r14 OPTIONAL, + resourceSelectionConfigP2X-r14 SL-P2X-ResourceSelectionConfig-r14 OPTIONAL, + syncAllowed-r14 SL-SyncAllowed-r14 OPTIONAL, + restrictResourceReservationPeriod-r14 SL-RestrictResourceReservationPeriodList-r14 OPTIONAL, -- Need OR + ... +} + +SL-PreconfigV2X-Sync-r14 ::= SEQUENCE { + syncOffsetIndicators-r14 SL-V2X-SyncOffsetIndicators-r14, + syncTxParameters-r14 P0-SL-r12, + syncTxThreshOoC-r14 RSRP-RangeSL3-r12, + filterCoefficient-r14 FilterCoefficient, + syncRefMinHyst-r14 ENUMERATED {dB0, dB3, dB6, dB9, dB12}, + syncRefDiffHyst-r14 ENUMERATED {dB0, dB3, dB6, dB9, dB12, dBinf}, + ... +} + +SL-V2X-SyncOffsetIndicators-r14 ::= SEQUENCE { + syncOffsetIndicator1-r14 SL-OffsetIndicatorSync-r14, + syncOffsetIndicator2-r14 SL-OffsetIndicatorSync-r14, + syncOffsetIndicator3-r14 SL-OffsetIndicatorSync-r14 OPTIONAL +} + +SL-CBR-PPPP-TxPreconfigList-r14 ::= SEQUENCE (SIZE (1..8)) OF SL-PPPP-TxPreconfigIndex-r14 + +SL-PPPP-TxPreconfigIndex-r14 ::= SEQUENCE { + priorityThreshold-r14 SL-Priority-r13, + defaultTxConfigIndex-r14 INTEGER(0..maxCBR-Level-1-r14), + cbr-ConfigIndex-r14 INTEGER(0..maxSL-V2X-CBRConfig2-1-r14), + tx-ConfigIndexList-r14 SEQUENCE (SIZE (1..maxCBR-Level-r14)) OF Tx-PreconfigIndex-r14 +} + +Tx-PreconfigIndex-r14 ::= INTEGER(0..maxSL-V2X-TxConfig2-1-r14) + +END + + +EUTRA-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + AntennaInfoCommon, + AntennaInfoDedicated-v10i0, + ARFCN-ValueEUTRA, + ARFCN-ValueEUTRA-v9e0, + ARFCN-ValueEUTRA-r9, + CellIdentity, + C-RNTI, + DL-DCCH-Message, + DRB-Identity, + DRB-ToReleaseList, + FreqBandIndicator-r11, + InDeviceCoexIndication-r11, + LWA-Config-r13, + MasterInformationBlock, + maxBands, + maxFreq, + maxDRB, + maxSCell-r10, + maxSCell-r13, + maxServCell-r10, + maxServCell-r13, + MBMSInterestIndication-r11, + MeasConfig, + MeasGapConfig, + MeasGapConfigPerCC-List-r14, + MeasResultForRSSI-r13, + MeasResultListWLAN-r13, + OtherConfig-r9, + PhysCellId, + P-Max, + PowerCoordinationInfo-r12, + SidelinkUEInformation-r12, + SL-CommConfig-r12, + SL-DiscConfig-r12, + RadioResourceConfigDedicated, + RCLWI-Configuration-r13, + RSRP-Range, + RSRQ-Range, + RSRQ-Range-v1250, + RS-SINR-Range-r13, + SCellToAddModList-r10, + SCellToAddModListExt-r13, + SCG-ConfigPartSCG-r12, + SecurityAlgorithmConfig, + SCellIndex-r10, + SCellIndex-r13, + SCellToReleaseList-r10, + SCellToReleaseListExt-r13, + ServCellIndex-r10, + ServCellIndex-r13, + ShortMAC-I, + MeasResultSSTD-r13, + SL-V2X-ConfigDedicated-r14, + SystemInformationBlockType1, + SystemInformationBlockType1-v890-IEs, + SystemInformationBlockType2, + UEAssistanceInformation-r11, + UECapabilityInformation, + UE-CapabilityRAT-ContainerList, + UE-RadioPagingInfo-r12, + WLANConnectionStatusReport-r13, + WLAN-OffloadConfig-r12 +FROM EUTRA-RRC-Definitions; + + +HandoverCommand ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + handoverCommand-r8 HandoverCommand-r8-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +HandoverCommand-r8-IEs ::= SEQUENCE { + handoverCommandMessage OCTET STRING (CONTAINING DL-DCCH-Message), + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +HandoverPreparationInformation ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + handoverPreparationInformation-r8 HandoverPreparationInformation-r8-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +HandoverPreparationInformation-r8-IEs ::= SEQUENCE { + ue-RadioAccessCapabilityInfo UE-CapabilityRAT-ContainerList, + as-Config AS-Config OPTIONAL, -- Cond HO + rrm-Config RRM-Config OPTIONAL, + as-Context AS-Context OPTIONAL, -- Cond HO + nonCriticalExtension HandoverPreparationInformation-v920-IEs OPTIONAL +} + +HandoverPreparationInformation-v920-IEs ::= SEQUENCE { + ue-ConfigRelease-r9 ENUMERATED { + rel9, rel10, rel11, rel12, v10j0, v11e0, + v1280, rel13, ..., rel14} OPTIONAL, -- Cond HO2 + nonCriticalExtension HandoverPreparationInformation-v9d0-IEs OPTIONAL +} + +HandoverPreparationInformation-v9d0-IEs ::= SEQUENCE { + lateNonCriticalExtension OCTET STRING (CONTAINING HandoverPreparationInformation-v9j0-IEs) OPTIONAL, + nonCriticalExtension HandoverPreparationInformation-v9e0-IEs OPTIONAL +} + +-- Late non-critical extensions: +HandoverPreparationInformation-v9j0-IEs ::= SEQUENCE { + -- Following field is only for pre REL-10 late non-critical extensions + lateNonCriticalExtension OCTET STRING OPTIONAL, + nonCriticalExtension HandoverPreparationInformation-v10j0-IEs OPTIONAL +} + +HandoverPreparationInformation-v10j0-IEs ::= SEQUENCE { + as-Config-v10j0 AS-Config-v10j0 OPTIONAL, + -- Following field is only for late non-critical extensions from REL-10 + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +-- Regular non-critical extensions: +HandoverPreparationInformation-v9e0-IEs ::= SEQUENCE { + as-Config-v9e0 AS-Config-v9e0 OPTIONAL, -- Cond HO2 + nonCriticalExtension HandoverPreparationInformation-v1130-IEs OPTIONAL +} + +HandoverPreparationInformation-v1130-IEs ::= SEQUENCE { + as-Context-v1130 AS-Context-v1130 OPTIONAL, -- Cond HO2 + nonCriticalExtension HandoverPreparationInformation-v1250-IEs OPTIONAL +} + +HandoverPreparationInformation-v1250-IEs ::= SEQUENCE { + ue-SupportedEARFCN-r12 ARFCN-ValueEUTRA-r9 OPTIONAL, -- Cond HO3 + as-Config-v1250 AS-Config-v1250 OPTIONAL, -- Cond HO2 + nonCriticalExtension HandoverPreparationInformation-v1320-IEs OPTIONAL +} + +HandoverPreparationInformation-v1320-IEs ::= SEQUENCE { + as-Config-v1320 AS-Config-v1320 OPTIONAL, -- Cond HO2 + as-Context-v1320 AS-Context-v1320 OPTIONAL, -- Cond HO2 + nonCriticalExtension HandoverPreparationInformation-v1430-IEs OPTIONAL +} + +HandoverPreparationInformation-v1430-IEs ::= SEQUENCE { + as-Config-v1430 AS-Config-v1430 OPTIONAL, -- Cond HO2 + makeBeforeBreakReq-r14 ENUMERATED {true} OPTIONAL, -- Cond HO2 + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SCG-Config-r12 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + scg-Config-r12 SCG-Config-r12-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +SCG-Config-r12-IEs ::= SEQUENCE { + scg-RadioConfig-r12 SCG-ConfigPartSCG-r12 OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +SCG-ConfigInfo-r12 ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + scg-ConfigInfo-r12 SCG-ConfigInfo-r12-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +SCG-ConfigInfo-r12-IEs ::= SEQUENCE { + radioResourceConfigDedMCG-r12 RadioResourceConfigDedicated OPTIONAL, + sCellToAddModListMCG-r12 SCellToAddModList-r10 OPTIONAL, + measGapConfig-r12 MeasGapConfig OPTIONAL, + powerCoordinationInfo-r12 PowerCoordinationInfo-r12 OPTIONAL, + scg-RadioConfig-r12 SCG-ConfigPartSCG-r12 OPTIONAL, + eutra-CapabilityInfo-r12 OCTET STRING (CONTAINING UECapabilityInformation) OPTIONAL, + scg-ConfigRestrictInfo-r12 SCG-ConfigRestrictInfo-r12 OPTIONAL, + mbmsInterestIndication-r12 OCTET STRING (CONTAINING + MBMSInterestIndication-r11) OPTIONAL, + measResultServCellListSCG-r12 MeasResultServCellListSCG-r12 OPTIONAL, + drb-ToAddModListSCG-r12 DRB-InfoListSCG-r12 OPTIONAL, + drb-ToReleaseListSCG-r12 DRB-ToReleaseList OPTIONAL, + sCellToAddModListSCG-r12 SCellToAddModListSCG-r12 OPTIONAL, + sCellToReleaseListSCG-r12 SCellToReleaseList-r10 OPTIONAL, + p-Max-r12 P-Max OPTIONAL, + nonCriticalExtension SCG-ConfigInfo-v1310-IEs OPTIONAL +} + +SCG-ConfigInfo-v1310-IEs ::= SEQUENCE { + measResultSSTD-r13 MeasResultSSTD-r13 OPTIONAL, sCellToAddModListMCG-Ext-r13 SCellToAddModListExt-r13 OPTIONAL, + measResultServCellListSCG-Ext-r13 MeasResultServCellListSCG-Ext-r13 OPTIONAL, + sCellToAddModListSCG-Ext-r13 SCellToAddModListSCG-Ext-r13 OPTIONAL, + sCellToReleaseListSCG-Ext-r13 SCellToReleaseListExt-r13 OPTIONAL, + nonCriticalExtension SCG-ConfigInfo-v1330-IEs OPTIONAL +} + +SCG-ConfigInfo-v1330-IEs ::= SEQUENCE { + measResultListRSSI-SCG-r13 MeasResultListRSSI-SCG-r13 OPTIONAL, + nonCriticalExtension SCG-ConfigInfo-v1430-IEs OPTIONAL +} + +SCG-ConfigInfo-v1430-IEs ::= SEQUENCE { + makeBeforeBreakSCG-Req-r14 ENUMERATED {true} OPTIONAL, + measGapConfigPerCC-List MeasGapConfigPerCC-List-r14 OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + +DRB-InfoListSCG-r12 ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-InfoSCG-r12 + +DRB-InfoSCG-r12 ::= SEQUENCE { + eps-BearerIdentity-r12 INTEGER (0..15) OPTIONAL, -- Cond DRB-Setup + drb-Identity-r12 DRB-Identity, + drb-Type-r12 ENUMERATED {split, scg} OPTIONAL, -- Cond DRB-Setup + ... +} + +SCellToAddModListSCG-r12 ::= SEQUENCE (SIZE (1..maxSCell-r10)) OF Cell-ToAddMod-r12 + +SCellToAddModListSCG-Ext-r13 ::= SEQUENCE (SIZE (1..maxSCell-r13)) OF Cell-ToAddMod-r12 + +Cell-ToAddMod-r12 ::= SEQUENCE { + sCellIndex-r12 SCellIndex-r10, + cellIdentification-r12 SEQUENCE { + physCellId-r12 PhysCellId, + dl-CarrierFreq-r12 ARFCN-ValueEUTRA-r9 + } OPTIONAL, -- Cond SCellAdd + measResultCellToAdd-r12 SEQUENCE { + rsrpResult-r12 RSRP-Range, + rsrqResult-r12 RSRQ-Range + } OPTIONAL, -- Cond SCellAdd2 + ..., + [[ sCellIndex-r13 SCellIndex-r13 OPTIONAL, + measResultCellToAdd-v1310 SEQUENCE { + rs-sinr-Result-r13 RS-SINR-Range-r13 + } OPTIONAL -- Cond SCellAdd2 + ]] +} + +MeasResultServCellListSCG-r12 ::= SEQUENCE (SIZE (1..maxServCell-r10)) OF MeasResultServCellSCG-r12 + +MeasResultServCellListSCG-Ext-r13 ::= SEQUENCE (SIZE (1..maxServCell-r13)) OF MeasResultServCellSCG-r12 + +MeasResultServCellSCG-r12 ::= SEQUENCE { + servCellId-r12 ServCellIndex-r10, + measResultSCell-r12 SEQUENCE { + rsrpResultSCell-r12 RSRP-Range, + rsrqResultSCell-r12 RSRQ-Range + }, + ..., + [[ servCellId-r13 ServCellIndex-r13 OPTIONAL, + measResultSCell-v1310 SEQUENCE { + rs-sinr-ResultSCell-r13 RS-SINR-Range-r13 + } OPTIONAL + ]] +} + +MeasResultListRSSI-SCG-r13 ::= SEQUENCE (SIZE (1..maxServCell-r13)) OF MeasResultRSSI-SCG-r13 + +MeasResultRSSI-SCG-r13 ::= SEQUENCE { + servCellId-r13 ServCellIndex-r13, + measResultForRSSI-r13 MeasResultForRSSI-r13 +} + +SCG-ConfigRestrictInfo-r12 ::= SEQUENCE { + maxSCH-TB-BitsDL-r12 INTEGER (1..100), + maxSCH-TB-BitsUL-r12 INTEGER (1..100) +} + + +UEPagingCoverageInformation ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + uePagingCoverageInformation-r13 UEPagingCoverageInformation-r13-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UEPagingCoverageInformation-r13-IEs ::= SEQUENCE { + mpdcch-NumRepetition-r13 INTEGER (1..256) OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +UERadioAccessCapabilityInformation ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + ueRadioAccessCapabilityInformation-r8 + UERadioAccessCapabilityInformation-r8-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UERadioAccessCapabilityInformation-r8-IEs ::= SEQUENCE { + ue-RadioAccessCapabilityInfo OCTET STRING (CONTAINING UECapabilityInformation), + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +UERadioPagingInformation ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + ueRadioPagingInformation-r12 UERadioPagingInformation-r12-IEs, + spare7 NULL, + spare6 NULL, spare5 NULL, spare4 NULL, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UERadioPagingInformation-r12-IEs ::= SEQUENCE { + ue-RadioPagingInfo-r12 OCTET STRING (CONTAINING UE-RadioPagingInfo-r12), + nonCriticalExtension UERadioPagingInformation-v1310-IEs OPTIONAL +} + +UERadioPagingInformation-v1310-IEs ::= SEQUENCE { + supportedBandListEUTRAForPaging-r13 SEQUENCE (SIZE (1..maxBands)) OF FreqBandIndicator-r11 OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL + +} + + +AS-Config ::= SEQUENCE { + sourceMeasConfig MeasConfig, + sourceRadioResourceConfig RadioResourceConfigDedicated, + sourceSecurityAlgorithmConfig SecurityAlgorithmConfig, + sourceUE-Identity C-RNTI, + sourceMasterInformationBlock MasterInformationBlock, + sourceSystemInformationBlockType1 SystemInformationBlockType1(WITH COMPONENTS + {..., nonCriticalExtension ABSENT}), + sourceSystemInformationBlockType2 SystemInformationBlockType2, + antennaInfoCommon AntennaInfoCommon, + sourceDl-CarrierFreq ARFCN-ValueEUTRA, + ..., + [[ sourceSystemInformationBlockType1Ext OCTET STRING (CONTAINING + SystemInformationBlockType1-v890-IEs) OPTIONAL, + sourceOtherConfig-r9 OtherConfig-r9 + -- sourceOtherConfig-r9 should have been optional. A target eNB compliant with this transfer + -- syntax should support receiving an AS-Config not including this extension addition group + -- e.g. from a legacy source eNB + ]], + [[ sourceSCellConfigList-r10 SCellToAddModList-r10 OPTIONAL + ]], + [[ sourceConfigSCG-r12 SCG-Config-r12 OPTIONAL + ]] +} + +AS-Config-v9e0 ::= SEQUENCE { + sourceDl-CarrierFreq-v9e0 ARFCN-ValueEUTRA-v9e0 +} + +AS-Config-v10j0 ::= SEQUENCE { + antennaInfoDedicatedPCell-v10i0 AntennaInfoDedicated-v10i0 OPTIONAL +} + +AS-Config-v1250 ::= SEQUENCE { + sourceWlan-OffloadConfig-r12 WLAN-OffloadConfig-r12 OPTIONAL, + sourceSL-CommConfig-r12 SL-CommConfig-r12 OPTIONAL, + sourceSL-DiscConfig-r12 SL-DiscConfig-r12 OPTIONAL +} + +AS-Config-v1320 ::= SEQUENCE { + sourceSCellConfigList-r13 SCellToAddModListExt-r13 OPTIONAL, + sourceRCLWI-Configuration-r13 RCLWI-Configuration-r13 OPTIONAL +} + +AS-Config-v1430 ::= SEQUENCE { + sourceSL-V2X-CommConfig-r14 SL-V2X-ConfigDedicated-r14 OPTIONAL, + sourceLWA-Config-r14 LWA-Config-r13 OPTIONAL, + sourceWLAN-MeasResult-r14 MeasResultListWLAN-r13 OPTIONAL +} + + +AS-Context ::= SEQUENCE { + reestablishmentInfo ReestablishmentInfo OPTIONAL -- Cond HO +} + +AS-Context-v1130 ::= SEQUENCE { + idc-Indication-r11 OCTET STRING (CONTAINING + InDeviceCoexIndication-r11) OPTIONAL, -- Cond HO2 + mbmsInterestIndication-r11 OCTET STRING (CONTAINING + MBMSInterestIndication-r11) OPTIONAL, -- Cond HO2 + powerPrefIndication-r11 OCTET STRING (CONTAINING + UEAssistanceInformation-r11) OPTIONAL, -- Cond HO2 + ..., + [[ sidelinkUEInformation-r12 OCTET STRING (CONTAINING + SidelinkUEInformation-r12) OPTIONAL -- Cond HO2 + ]] +} + +AS-Context-v1320 ::= SEQUENCE { + wlanConnectionStatusReport-r13 OCTET STRING (CONTAINING + WLANConnectionStatusReport-r13) OPTIONAL -- Cond HO2 +} + + +ReestablishmentInfo ::= SEQUENCE { + sourcePhysCellId PhysCellId, + targetCellShortMAC-I ShortMAC-I, + additionalReestabInfoList AdditionalReestabInfoList OPTIONAL, + ... +} + +AdditionalReestabInfoList ::= SEQUENCE ( SIZE (1..maxReestabInfo) ) OF AdditionalReestabInfo + +AdditionalReestabInfo ::= SEQUENCE{ + cellIdentity CellIdentity, + key-eNodeB-Star Key-eNodeB-Star, + shortMAC-I ShortMAC-I +} + +Key-eNodeB-Star ::= BIT STRING (SIZE (256)) + + +RRM-Config ::= SEQUENCE { + ue-InactiveTime ENUMERATED { + s1, s2, s3, s5, s7, s10, s15, s20, + s25, s30, s40, s50, min1, min1s20c, min1s40, + min2, min2s30, min3, min3s30, min4, min5, min6, + min7, min8, min9, min10, min12, min14, min17, min20, + min24, min28, min33, min38, min44, min50, hr1, + hr1min30, hr2, hr2min30, hr3, hr3min30, hr4, hr5, hr6, + hr8, hr10, hr13, hr16, hr20, day1, day1hr12, day2, + day2hr12, day3, day4, day5, day7, day10, day14, day19, + day24, day30, dayMoreThan30} OPTIONAL, + ..., + [[ candidateCellInfoList-r10 CandidateCellInfoList-r10 OPTIONAL + ]] +} + +CandidateCellInfoList-r10 ::= SEQUENCE (SIZE (1..maxFreq)) OF CandidateCellInfo-r10 + +CandidateCellInfo-r10 ::= SEQUENCE { + -- cellIdentification + physCellId-r10 PhysCellId, + dl-CarrierFreq-r10 ARFCN-ValueEUTRA, + -- available measurement results + rsrpResult-r10 RSRP-Range OPTIONAL, + rsrqResult-r10 RSRQ-Range OPTIONAL, + ..., + [[ dl-CarrierFreq-v1090 ARFCN-ValueEUTRA-v9e0 OPTIONAL + ]], + [[ rsrqResult-v1250 RSRQ-Range-v1250 OPTIONAL + ]], + [[ rs-sinr-Result-r13 RS-SINR-Range-r13 OPTIONAL + ]] +} + + +maxReestabInfo INTEGER ::= 32 -- Maximum number of KeNB* and shortMAC-I forwarded + -- at handover for re-establishment preparation + + +END + + +NBIOT-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + C-RNTI, + PhysCellId, + SecurityAlgorithmConfig, + ShortMAC-I +FROM EUTRA-RRC-Definitions + + AdditionalReestabInfoList +FROM EUTRA-InterNodeDefinitions + + CarrierFreq-NB-r13, + RadioResourceConfigDedicated-NB-r13, + UE-Capability-NB-r13, + UE-RadioPagingInfo-NB-r13 +FROM NBIOT-RRC-Definitions; + + +HandoverPreparationInformation-NB ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + handoverPreparationInformation-r13 HandoverPreparationInformation-NB-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +HandoverPreparationInformation-NB-IEs ::= SEQUENCE { + ue-RadioAccessCapabilityInfo-r13 UE-Capability-NB-r13, + as-Config-r13 AS-Config-NB, + rrm-Config-r13 RRM-Config-NB OPTIONAL, + as-Context-r13 AS-Context-NB OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +UEPagingCoverageInformation-NB ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + uePagingCoverageInformation-r13 UEPagingCoverageInformation-NB-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UEPagingCoverageInformation-NB-IEs ::= SEQUENCE { +-- the possible value(s) can differ from those sent on Uu + npdcch-NumRepetitionPaging-r13 INTEGER (1..2048) OPTIONAL, + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +UERadioAccessCapabilityInformation-NB ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + ueRadioAccessCapabilityInformation-r13 + UERadioAccessCapabilityInformation-NB-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UERadioAccessCapabilityInformation-NB-IEs ::= SEQUENCE { + ue-RadioAccessCapabilityInfo-r13 OCTET STRING (CONTAINING UE-Capability-NB-r13), + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +UERadioPagingInformation-NB ::= SEQUENCE { + criticalExtensions CHOICE { + c1 CHOICE{ + ueRadioPagingInformation-r13 UERadioPagingInformation-NB-IEs, + spare3 NULL, spare2 NULL, spare1 NULL + }, + criticalExtensionsFuture SEQUENCE {} + } +} + +UERadioPagingInformation-NB-IEs ::= SEQUENCE { + ue-RadioPagingInfo-r13 OCTET STRING (CONTAINING UE-RadioPagingInfo-NB-r13), + nonCriticalExtension SEQUENCE {} OPTIONAL +} + + +AS-Config-NB ::= SEQUENCE { + sourceRadioResourceConfig-r13 RadioResourceConfigDedicated-NB-r13, + sourceSecurityAlgorithmConfig-r13 SecurityAlgorithmConfig, + sourceUE-Identity-r13 C-RNTI, + sourceDl-CarrierFreq-r13 CarrierFreq-NB-r13, + ... +} + + +AS-Context-NB ::= SEQUENCE { + reestablishmentInfo-r13 ReestablishmentInfo-NB OPTIONAL, + ... +} + + +ReestablishmentInfo-NB ::= SEQUENCE { + sourcePhysCellId-r13 PhysCellId, + targetCellShortMAC-I-r13 ShortMAC-I, + additionalReestabInfoList-r13 AdditionalReestabInfoList OPTIONAL, + ... +} + + + + +RRM-Config-NB ::= SEQUENCE { + ue-InactiveTime ENUMERATED { + s1, s2, s3, s5, s7, s10, s15, s20, + s25, s30, s40, s50, min1, min1s20, min1s40, + min2, min2s30, min3, min3s30, min4, min5, min6, + min7, min8, min9, min10, min12, min14, min17, min20, + min24, min28, min33, min38, min44, min50, hr1, + hr1min30, hr2, hr2min30, hr3, hr3min30, hr4, hr5, hr6, + hr8, hr10, hr13, hr16, hr20, day1, day1hr12, day2, + day2hr12, day3, day4, day5, day7, day10, day14, day19, + day24, day30, dayMoreThan30} OPTIONAL, + ... +} + + +END + + diff --git a/openair2/RRC/LITE/MESSAGES/bsearch.c b/openair2/RRC/LITE/MESSAGES/bsearch.c deleted file mode 100644 index 9f54633d6e..0000000000 --- a/openair2/RRC/LITE/MESSAGES/bsearch.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * A generic implementation of binary search for the Linux kernel - * - * Copyright (C) 2008-2009 Ksplice, Inc. - * Author: Tim Abbott - * - * 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; version 2. - */ - -#include -#include "bsearch.h" - -/* - * bsearch - binary search an array of elements - * @key: pointer to item being searched for - * @base: pointer to data to sort - * @num: number of elements - * @size: size of each element - * @cmp: pointer to comparison function - * - * This function does a binary search on the given array. The - * contents of the array should already be in ascending sorted order - * under the provided comparison function. - * - * Note that the key need not have the same type as the elements in - * the array, e.g. key could be a string and the comparison function - * could compare the string with the struct's name field. However, if - * the key and elements in the array are of the same type, you can use - * the same comparison function for both sort() and bsearch(). - */ -void *bsearch(const void *key, const void *base, size_t num, size_t size, - int (*cmp)(const void *key, const void *elt)) -{ - int start = 0, end = num - 1, mid, result; - - if (num == 0) { - return NULL; - } - - while (start <= end) { - mid = (start + end) / 2; - result = cmp(key, base + mid * size); - - if (result < 0) { - end = mid - 1; - } else if (result > 0) { - start = mid + 1; - } else { - return (void *)base + mid * size; - } - } - - return NULL; -} -//EXPORT_SYMBOL(bsearch); diff --git a/openair2/RRC/LITE/MESSAGES/bsearch.h b/openair2/RRC/LITE/MESSAGES/bsearch.h deleted file mode 100644 index fb769a2bf4..0000000000 --- a/openair2/RRC/LITE/MESSAGES/bsearch.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _LINUX_BSEARCH_H -#define _LINUX_BSEARCH_H - -#include - -void *bsearch(const void *key, const void *base, size_t num, size_t size, - int (*cmp)(const void *key, const void *elt)); - -#endif /* _LINUX_BSEARCH_H */ diff --git a/openair2/RRC/LITE/MESSAGES/rtai_mem.c b/openair2/RRC/LITE/MESSAGES/rtai_mem.c deleted file mode 100644 index b54817eafa..0000000000 --- a/openair2/RRC/LITE/MESSAGES/rtai_mem.c +++ /dev/null @@ -1,125 +0,0 @@ -/*! \file rtai_mem.c -* \brief a wrapper for Unified RTAI real-time memory management. -* \author Florian Kaltenberger -* \date 2011-04-06 -* \version 0.1 -* \company Eurecom -* \email: florian.kaltenberger@eurecom.fr -* \note -* \bug -* \warning -*/ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -//#include -#include -#include -#include - -#include - -#include - -#include -#include -#include -#include - -/* -void* rt_alloc_wrapper(int size) { - - unsigned long* tmp_ptr; - static unsigned long name = 0; - - rt_shm_free(name); - tmp_ptr = (unsigned long*) rt_shm_alloc(name,size+sizeof(unsigned long),GFP_KERNEL); - - if (!tmp_ptr) { - printk("rt_mem.c: failed to allocate %d bytes for name %ld at %p\n",size,name,tmp_ptr); - return NULL; - } - - printk("rt_mem.c: allocated %d bytes for name %ld at %p\n",size,name,tmp_ptr+1); - - tmp_ptr[0] = name; - name++; - - return (void*) (tmp_ptr+1); - -} - -int rt_free_wrapper(void* ptr) { - - unsigned long name; - - printk("rt_mem.c: freeing memory at %p, ",ptr); - - name = *(((unsigned long*) ptr)-1); - - printk("name %ld\n",name); - - return rt_shm_free(name); - -} - -void* rt_realloc_wrapper(void* oldptr, int size) { - - void* newptr; - - printk("rt_mem.c: reallocating %p with %d bytes\n",oldptr,size); - - if (oldptr==NULL) - newptr = rt_alloc_wrapper(size); - else { - newptr = rt_alloc_wrapper(size); - memcpy(newptr,oldptr,size); - rt_free_wrapper(oldptr); - } - - return newptr; -} -*/ - -void* rt_realloc(void* oldptr, int size) -{ - - void* newptr; - - printk("rt_mem.c: reallocating %p with %d bytes\n",oldptr,size); - - if (oldptr==NULL) { - newptr = rt_malloc(size); - } else { - newptr = rt_malloc(size); - memcpy(newptr,oldptr,size); - rt_free(oldptr); - } - - return newptr; -} - -void* rt_calloc(int nmemb, int size) -{ - - void* newptr; - - printk("rt_mem.c: allocating %d elements with %d bytes\n",nmemb,size); - - newptr = rt_malloc(nmemb*size); - memset(newptr,0,nmemb*size); - - return newptr; -} diff --git a/openair2/RRC/LITE/MESSAGES/rtai_mem.h b/openair2/RRC/LITE/MESSAGES/rtai_mem.h deleted file mode 100644 index 97a5f1e10b..0000000000 --- a/openair2/RRC/LITE/MESSAGES/rtai_mem.h +++ /dev/null @@ -1,23 +0,0 @@ -/*! \file rtai_mem.h -* \brief a wrapper for Unified RTAI real-time memory management. -* \author Florian Kaltenberger -* \date 2011-04-06 -* \version 0.1 -* \company Eurecom -* \email: florian.kaltenberger@eurecom.fr -* \note -* \bug -* \warning -*/ - -/* -void* rt_alloc_wrapper(int size); - -int rt_free_wrapper(void* ptr); - -void* rt_realloc_wrapper(void* oldptr, int size); -*/ - -void* rt_realloc(void* oldptr, int size); - -void* rt_calloc(int nmemb, int size); diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index 7a52115440..507d70e459 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file RRC/LITE/defs.h * \brief RRC struct definitions and function prototypes @@ -40,26 +31,20 @@ #ifndef __OPENAIR_RRC_DEFS_H__ #define __OPENAIR_RRC_DEFS_H__ -#ifdef USER_MODE #include #include #include -#endif #include "collection/tree.h" #include "rrc_types.h" #include "PHY/defs.h" +#include "LAYER2/RLC/rlc.h" + #include "COMMON/platform_constants.h" #include "COMMON/platform_types.h" -#include "COMMON/mac_rrc_primitives.h" #include "LAYER2/MAC/defs.h" -//#include "COMMON/openair_defs.h" -#ifndef USER_MODE -#include -#endif - #include "SystemInformationBlockType1.h" #include "SystemInformation.h" #include "RRCConnectionReconfiguration.h" @@ -70,7 +55,7 @@ #include "RRCConnectionReestablishmentRequest.h" #include "BCCH-DL-SCH-Message.h" #include "BCCH-BCH-Message.h" -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) #include "MCCH-Message.h" #include "MBSFNAreaConfiguration-r9.h" #include "SCellToAddMod-r10.h" @@ -80,8 +65,59 @@ #include "UE-EUTRA-Capability.h" #include "MeasResults.h" +/* correct Rel(8|10)/Rel14 differences + * the code is in favor of Rel14, those defines do the translation + */ +#if !defined(Rel14) +# define CipheringAlgorithm_r12_t e_SecurityAlgorithmConfig__cipheringAlgorithm +# define CipheringAlgorithm_r12_eea0 SecurityAlgorithmConfig__cipheringAlgorithm_eea0 +# define CipheringAlgorithm_r12_eea1 SecurityAlgorithmConfig__cipheringAlgorithm_eea1 +# define CipheringAlgorithm_r12_eea2 SecurityAlgorithmConfig__cipheringAlgorithm_eea2 +# define CipheringAlgorithm_r12_spare1 SecurityAlgorithmConfig__cipheringAlgorithm_spare1 +# define Alpha_r12_al0 UplinkPowerControlCommon__alpha_al0 +# define Alpha_r12_al04 UplinkPowerControlCommon__alpha_al04 +# define Alpha_r12_al05 UplinkPowerControlCommon__alpha_al05 +# define Alpha_r12_al06 UplinkPowerControlCommon__alpha_al06 +# define Alpha_r12_al07 UplinkPowerControlCommon__alpha_al07 +# define Alpha_r12_al08 UplinkPowerControlCommon__alpha_al08 +# define Alpha_r12_al09 UplinkPowerControlCommon__alpha_al09 +# define Alpha_r12_al1 UplinkPowerControlCommon__alpha_al1 +# define PreambleTransMax_n3 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3 +# define PreambleTransMax_n4 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4 +# define PreambleTransMax_n5 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5 +# define PreambleTransMax_n6 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6 +# define PreambleTransMax_n7 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7 +# define PreambleTransMax_n8 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8 +# define PreambleTransMax_n10 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10 +# define PreambleTransMax_n20 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20 +# define PreambleTransMax_n50 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50 +# define PreambleTransMax_n100 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100 +# define PreambleTransMax_n200 RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200 +# define PeriodicBSR_Timer_r12_sf5 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf5 +# define PeriodicBSR_Timer_r12_sf10 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf10 +# define PeriodicBSR_Timer_r12_sf16 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf16 +# define PeriodicBSR_Timer_r12_sf20 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf20 +# define PeriodicBSR_Timer_r12_sf32 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf32 +# define PeriodicBSR_Timer_r12_sf40 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf40 +# define PeriodicBSR_Timer_r12_sf64 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf64 +# define PeriodicBSR_Timer_r12_sf80 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf80 +# define PeriodicBSR_Timer_r12_sf128 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf128 +# define PeriodicBSR_Timer_r12_sf160 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf160 +# define PeriodicBSR_Timer_r12_sf320 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf320 +# define PeriodicBSR_Timer_r12_sf640 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf640 +# define PeriodicBSR_Timer_r12_sf1280 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf1280 +# define PeriodicBSR_Timer_r12_sf2560 MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf2560 +# define PeriodicBSR_Timer_r12_infinity MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity +# define RetxBSR_Timer_r12_sf320 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf320 +# define RetxBSR_Timer_r12_sf640 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf640 +# define RetxBSR_Timer_r12_sf1280 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf1280 +# define RetxBSR_Timer_r12_sf2560 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560 +# define RetxBSR_Timer_r12_sf5120 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf5120 +# define RetxBSR_Timer_r12_sf10240 MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf10240 +#endif + // This corrects something generated by asn1c which is different between Rel8 and Rel10 -#ifndef Rel10 +#if !defined(Rel10) && !defined(Rel14) #define SystemInformation_r8_IEs__sib_TypeAndInfo__Member SystemInformation_r8_IEs_sib_TypeAndInfo_Member #define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib2 #define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib3 @@ -94,8 +130,15 @@ #define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib10 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib10 #define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib11 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib11 #endif + + +#define NB_SIG_CNX_CH 1 +#define NB_CNX_CH MAX_MOBILES_PER_ENB +#define NB_SIG_CNX_UE 2 //MAX_MANAGED_RG_PER_MOBILE +#define NB_CNX_UE 2//MAX_MANAGED_RG_PER_MOBILE + /* -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) #define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib12_v920 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib12_v920 #define SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920 SystemInformation_r8_IEs_sib_TypeAndInfo_Member_PR_sib13_v920 #endif @@ -111,12 +154,16 @@ # include "intertask_interface.h" #endif -#if defined(ENABLE_USE_MME) -# include "commonDef.h" +/* TODO: be sure this include is correct. + * It solves a problem of compilation of the RRH GW, + * issue #186. + */ +#if !defined(ENABLE_ITTI) +# include "as_message.h" #endif -#if ENABLE_RAL -# include "collection/hashtable/obj_hashtable.h" +#if defined(ENABLE_USE_MME) +# include "commonDef.h" #endif //-------- @@ -140,18 +187,18 @@ typedef struct uid_linear_allocator_s { * @{ */ -#if ENABLE_RAL -typedef struct rrc_ral_threshold_key_s { - ral_link_param_type_t link_param_type; - ral_threshold_t threshold; -} rrc_ral_threshold_key_t; -#endif - -//#define NUM_PRECONFIGURED_LCHAN (NB_CH_CX*2) //BCCH, CCCH #define UE_MODULE_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!! #define UE_INDEX_INVALID ((module_id_t) ~0) // FIXME attention! depends on type uint8_t!!! used to be -1 +typedef enum { + RRC_OK=0, + RRC_ConnSetup_failed, + RRC_PHY_RESYNCH, + RRC_Handover_failed, + RRC_HO_STARTED +} RRC_status_t; + typedef enum UE_STATE_e { RRC_INACTIVE=0, RRC_IDLE, @@ -182,17 +229,36 @@ typedef enum HO_STATE_e { #define PAYLOAD_SIZE_MAX 1024 #define RRC_BUF_SIZE 255 #define UNDEF_SECURITY_MODE 0xff -#define NO_SECURITY_MODE 0x33 +#define NO_SECURITY_MODE 0x20 #define CBA_OFFSET 0xfff4 // #define NUM_MAX_CBA_GROUP 4 // in the platform_constants +/* TS 36.331: RRC-TransactionIdentifier ::= INTEGER (0..3) */ +#if defined(USRP_REC_PLAY) +#define RRC_TRANSACTION_IDENTIFIER_NUMBER 1 +#else +#define RRC_TRANSACTION_IDENTIFIER_NUMBER 3 +#endif + +typedef struct { + unsigned short transport_block_size; /*!< \brief Minimum PDU size in bytes provided by RLC to MAC layer interface */ + unsigned short max_transport_blocks; /*!< \brief Maximum PDU size in bytes provided by RLC to MAC layer interface */ + unsigned long Guaranteed_bit_rate; /*!< \brief Guaranteed Bit Rate (average) to be offered by MAC layer scheduling*/ + unsigned long Max_bit_rate; /*!< \brief Maximum Bit Rate that can be offered by MAC layer scheduling*/ + uint8_t Delay_class; /*!< \brief Delay class offered by MAC layer scheduling*/ + uint8_t Target_bler; /*!< \brief Target Average Transport Block Error rate*/ + uint8_t Lchan_t; /*!< \brief Logical Channel Type (BCCH,CCCH,DCCH,DTCH_B,DTCH,MRBCH)*/ +} __attribute__ ((__packed__)) LCHAN_DESC; + +#define LCHAN_DESC_SIZE sizeof(LCHAN_DESC) + typedef struct UE_RRC_INFO_s { UE_STATE_t State; uint8_t SIB1systemInfoValueTag; uint32_t SIStatus; uint32_t SIcnt; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) uint8_t MCCHStatus[8]; // MAX_MBSFN_AREA #endif uint8_t SIwindowsize; //!< Corresponds to the SIB1 si-WindowLength parameter. The unit is ms. Possible values are (final): 1,2,5,10,15,20,40 @@ -220,19 +286,23 @@ typedef struct UE_S_TMSI_s { #if defined(ENABLE_ITTI) typedef enum e_rab_satus_e { E_RAB_STATUS_NEW, - E_RAB_STATUS_DONE, + E_RAB_STATUS_DONE, // from the eNB perspective + E_RAB_STATUS_ESTABLISHED, // get the reconfigurationcomplete form UE E_RAB_STATUS_FAILED, + E_RAB_STATUS_TORELEASE // to release DRB between eNB and UE } e_rab_status_t; typedef struct e_rab_param_s { e_rab_t param; uint8_t status; + uint8_t xid; // transaction_id + s1ap_Cause_t cause; + uint8_t cause_value; } __attribute__ ((__packed__)) e_rab_param_t; #endif - /* Intermediate structure for Handover management. Associated per-UE in eNB_RRC_INST */ typedef struct HANDOVER_INFO_s { uint8_t ho_prepare; @@ -259,7 +329,7 @@ typedef struct { typedef struct RB_INFO_s { uint16_t Rb_id; //=Lchan_id LCHAN_DESC Lchan_desc[2]; - MAC_MEAS_REQ_ENTRY *Meas_entry; + // MAC_MEAS_REQ_ENTRY *Meas_entry; } RB_INFO; typedef struct SRB_INFO_s { @@ -282,7 +352,7 @@ typedef struct SRB_INFO_TABLE_ENTRY_s { SRB_INFO Srb_info; uint8_t Active; uint8_t Status; - uint32_t Next_check_frame; + uint32_t Next_check_frame; } SRB_INFO_TABLE_ENTRY; typedef struct MEAS_REPORT_LIST_s { @@ -298,11 +368,14 @@ typedef struct HANDOVER_INFO_UE_s { typedef struct eNB_RRC_UE_s { uint8_t primaryCC_id; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) SCellToAddMod_r10_t sCell_config[2]; #endif SRB_ToAddModList_t* SRB_configList; + SRB_ToAddModList_t* SRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER]; DRB_ToAddModList_t* DRB_configList; + DRB_ToAddModList_t* DRB_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER]; + DRB_ToReleaseList_t* DRB_Release_configList2[RRC_TRANSACTION_IDENTIFIER_NUMBER]; uint8_t DRB_active[8]; struct PhysicalConfigDedicated* physicalConfigDedicated; struct SPS_Config* sps_Config; @@ -322,9 +395,12 @@ typedef struct eNB_RRC_UE_s { #if defined(ENABLE_SECURITY) /* KeNB as derived from KASME received from EPC */ uint8_t kenb[32]; + int8_t kenb_ncc; + uint8_t nh[32]; + int8_t nh_ncc; #endif /* Used integrity/ciphering algorithms */ - e_SecurityAlgorithmConfig__cipheringAlgorithm ciphering_algorithm; + CipheringAlgorithm_r12_t ciphering_algorithm; e_SecurityAlgorithmConfig__integrityProtAlgorithm integrity_algorithm; uint8_t Status; @@ -347,11 +423,19 @@ typedef struct eNB_RRC_UE_s { security_capabilities_t security_capabilities; + /* Total number of e_rab already setup in the list */ + uint8_t setup_e_rabs; /* Number of e_rab to be setup in the list */ uint8_t nb_of_e_rabs; + /* Number of e_rab to be modified in the list */ + uint8_t nb_of_modify_e_rabs; + uint8_t nb_of_failed_e_rabs; + e_rab_param_t modify_e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB]; /* list of e_rab to be setup by RRC layers */ - e_rab_param_t e_rab[S1AP_MAX_E_RAB]; - + e_rab_param_t e_rab[NB_RB_MAX];//[S1AP_MAX_E_RAB]; + //release e_rabs + uint8_t nb_release_of_e_rabs; + e_rab_failed_t e_rabs_release_failed[S1AP_MAX_E_RAB]; // LG: For GTPV1 TUNNELS uint32_t enb_gtp_teid[S1AP_MAX_E_RAB]; transport_layer_addr_t enb_gtp_addrs[S1AP_MAX_E_RAB]; @@ -359,6 +443,14 @@ typedef struct eNB_RRC_UE_s { #endif uint32_t ul_failure_timer; uint32_t ue_release_timer; + uint32_t ue_release_timer_thres; + uint32_t ue_release_timer_s1; + uint32_t ue_release_timer_thres_s1; + uint32_t ue_release_timer_rrc; + uint32_t ue_release_timer_thres_rrc; + uint32_t ue_reestablishment_timer; + uint32_t ue_reestablishment_timer_thres; + uint8_t e_rab_release_command_flag; } eNB_RRC_UE_t; typedef uid_t ue_uid_t; @@ -380,11 +472,24 @@ typedef struct rrc_eNB_ue_context_s { } rrc_eNB_ue_context_t; typedef struct { + uint8_t *MIB; + uint8_t sizeof_MIB; uint8_t *SIB1; uint8_t sizeof_SIB1; uint8_t *SIB23; uint8_t sizeof_SIB23; - uint16_t physCellId; +#ifdef Rel14 + uint8_t *SIB1_BR; + uint8_t sizeof_SIB1_BR; + uint8_t *SIB23_BR; + uint8_t sizeof_SIB23_BR; +#endif + int physCellId; + int Ncp; + int p_eNB; + uint32_t dl_CarrierFreq; + uint32_t ul_CarrierFreq; + uint32_t pbch_repetition; BCCH_BCH_Message_t mib; BCCH_DL_SCH_Message_t siblock1; BCCH_DL_SCH_Message_t systemInformation; @@ -392,7 +497,12 @@ typedef struct { SystemInformationBlockType1_t *sib1; SystemInformationBlockType2_t *sib2; SystemInformationBlockType3_t *sib3; -#ifdef Rel10 +#ifdef Rel14 + SystemInformationBlockType1_t *sib1_BR; + SystemInformationBlockType2_t *sib2_BR; + SystemInformationBlockType2_t *sib3_BR; +#endif +#if defined(Rel10) || defined(Rel14) SystemInformationBlockType13_r9_t *sib13; uint8_t MBMS_flag; uint8_t num_mbsfn_sync_area; @@ -401,24 +511,21 @@ typedef struct { MCCH_Message_t mcch; MBSFNAreaConfiguration_r9_t *mcch_message; SRB_INFO MCCH_MESS[8];// MAX_MBSFN_AREA -#endif -#ifdef CBA - uint8_t num_active_cba_groups; - uint16_t cba_rnti[NUM_MAX_CBA_GROUP]; #endif SRB_INFO SI; SRB_INFO Srb0; -} rcc_eNB_carrier_data_t; + uint8_t *paging[NUMBER_OF_UE_MAX]; + uint32_t sizeof_paging[NUMBER_OF_UE_MAX]; +} rrc_eNB_carrier_data_t; typedef struct eNB_RRC_INST_s { - rcc_eNB_carrier_data_t carrier[MAX_NUM_CCs]; + /// southbound midhaul configuration + eth_params_t eth_params_s; + rrc_eNB_carrier_data_t carrier[MAX_NUM_CCs]; uid_allocator_t uid_allocator; // for rrc_ue_head RB_HEAD(rrc_ue_tree_s, rrc_eNB_ue_context_s) rrc_ue_head; // ue_context tree key search by rnti uint8_t HO_flag; uint8_t Nb_ue; -#if ENABLE_RAL - obj_hash_table_t *ral_meas_thresholds; -#endif hash_table_t *initial_id2_s1ap_ids; // key is content is rrc_ue_s1ap_ids_t hash_table_t *s1ap_id2_s1ap_ids ; // key is content is rrc_ue_s1ap_ids_t @@ -432,6 +539,27 @@ typedef struct eNB_RRC_INST_s { /// localization list for aggregated measurements from PHY struct list loc_list; #endif + + //RRC configuration +#if defined(ENABLE_ITTI) + RrcConfigurationReq configuration; +#endif + // other PLMN parameters + /// Mobile country code + int mcc; + /// Mobile network code + int mnc; + /// number of mnc digits + int mnc_digit_length; + + // other RAN parameters + int srb1_timer_poll_retransmit; + int srb1_poll_pdu; + int srb1_poll_byte; + int srb1_max_retx_threshold; + int srb1_timer_reordering; + int srb1_timer_status_prohibit; + int srs_enable[MAX_NUM_CCs]; } eNB_RRC_INST; #define MAX_UE_CAPABILITY_SIZE 255 @@ -476,7 +604,7 @@ typedef struct UE_RRC_INST_s { SystemInformationBlockType10_t *sib10[NB_CNX_UE]; SystemInformationBlockType11_t *sib11[NB_CNX_UE]; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) uint8_t MBMS_flag; uint8_t *MCCH_MESSAGE[NB_CNX_UE]; uint8_t sizeof_MCCH_MESSAGE[NB_CNX_UE]; @@ -493,6 +621,7 @@ typedef struct UE_RRC_INST_s { struct SRB_ToAddMod *SRB1_config[NB_CNX_UE]; struct SRB_ToAddMod *SRB2_config[NB_CNX_UE]; struct DRB_ToAddMod *DRB_config[NB_CNX_UE][8]; + rb_id_t *defaultDRB; // remember the ID of the default DRB MeasObjectToAddMod_t *MeasObj[NB_CNX_UE][MAX_MEAS_OBJ]; struct ReportConfigToAddMod *ReportConfig[NB_CNX_UE][MAX_MEAS_CONFIG]; struct QuantityConfig *QuantityConfig[NB_CNX_UE]; @@ -511,20 +640,26 @@ typedef struct UE_RRC_INST_s { float rsrq_db[7]; float rsrp_db_filtered[7]; float rsrq_db_filtered[7]; -#if ENABLE_RAL - obj_hash_table_t *ral_meas_thresholds; - ral_transaction_id_t scan_transaction_id; -#endif #if defined(ENABLE_SECURITY) /* KeNB as computed from parameters within USIM card */ uint8_t kenb[32]; + uint8_t nh[32]; + int8_t nh_ncc; #endif /* Used integrity/ciphering algorithms */ - e_SecurityAlgorithmConfig__cipheringAlgorithm ciphering_algorithm; + CipheringAlgorithm_r12_t ciphering_algorithm; e_SecurityAlgorithmConfig__integrityProtAlgorithm integrity_algorithm; } UE_RRC_INST; +typedef struct UE_PF_PO_s { + boolean_t enable_flag; /* flag indicate whether current object is used */ + uint16_t ue_index_value; /* UE index value */ + uint8_t PF_min; /* minimal value of Paging Frame (PF) */ + uint8_t PO; /* Paging Occasion (PO) */ + uint32_t T; /* DRX cycle */ +} UE_PF_PO_t; + #include "proto.h" #endif diff --git a/openair2/RRC/LITE/extern.h b/openair2/RRC/LITE/extern.h index 64863b796f..71d8c9d0dc 100644 --- a/openair2/RRC/LITE/extern.h +++ b/openair2/RRC/LITE/extern.h @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file vars.h * \brief rrc external vars @@ -46,27 +37,8 @@ #include "LAYER2/RLC/rlc.h" extern UE_RRC_INST *UE_rrc_inst; -extern eNB_RRC_INST *eNB_rrc_inst; -//extern RRC_XFACE *Rrc_xface; -#ifndef USER_MODE -//extern MAC_RLC_XFACE *Mac_rlc_xface; -extern int S_rrc; -//extern int R_rrc; -#else -#include "LAYER2/MAC/extern.h" -#ifndef NO_RRM -extern sock_rrm_t S_rrc; -#endif -#endif -#ifndef NO_RRM -#ifndef USER_MODE -extern char *Header_buf; -extern char *Data; -extern unsigned short Header_read_idx,Data_read_idx,Header_size; -#endif -extern unsigned short Data_to_read; -#endif //NO_RRM +#include "LAYER2/MAC/extern.h" extern uint8_t DRB2LCHAN[8]; @@ -105,6 +77,11 @@ extern uint32_t timeToTrigger_ms[16]; extern float RSRP_meas_mapping[100]; extern float RSRQ_meas_mapping[33]; +extern UE_PF_PO_t UE_PF_PO[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; +extern pthread_mutex_t ue_pf_po_mutex; + +extern uint16_t reestablish_rnti_map[NUMBER_OF_UE_MAX][2]; + #endif diff --git a/openair2/RRC/LITE/mesh_top.c b/openair2/RRC/LITE/mesh_top.c deleted file mode 100644 index 7fd0edaf12..0000000000 --- a/openair2/RRC/LITE/mesh_top.c +++ /dev/null @@ -1,125 +0,0 @@ -/*________________________openair_rrc_top.c________________________ - - Authors : Hicham Anouar - Company : EURECOM - Emails : anouar@eurecom.fr -________________________________________________________________*/ - - -#ifndef USER_MODE -#define __NO_VERSION__ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#ifdef KERNEL2_6 -#include -#endif - -#ifdef KERNEL2_4 -#include -#include -#endif - -#endif - - - -#include "defs.h" -#include "vars.h" - -extern MAC_RLC_XFACE* mac_rrc_register(RRC_XFACE*); -extern int mac_rrc_unregister(RRC_XFACE *); - -extern void *bigphys_malloc(int); - - - - -#ifndef USER_MODE - -/*------------------------------------------------*/ -/* Prototypes */ -/*------------------------------------------------*/ -#ifdef KERNEL2_4 -static int init_module( void ); -static void cleanup_module(void); -#else -static int openair_rrc_init_module( void ); -static void openair_rrc_cleanup_module(void); -#endif - -#ifdef KERNEL2_6 -static int __init openair_rrc_init_module( void ) -#else -int init_module( void ) -#endif //KERNEL2_6 -{ - printk("[OPENAIR][RRC][INIT] inserting module\n"); - - - Rrc_xface = (RRC_XFACE*)malloc16(sizeof(RRC_XFACE)); - - if(Rrc_xface == NULL) { - printk("[RRC] FATAL EROOR: Could not allocate memory for Rrc_xface !!!\n"); - return (-1); - } - - Mac_rlc_xface=mac_rrc_register(Rrc_xface); - - if( Mac_rlc_xface == NULL ) { - printk("[OPENAIR][RRC][INIT] Could not get RRC descriptor\n"); - return -1; - } else { - printk("[OPENAIR][RRC][INIT] Got RRC descriptor , Rcc_xface %p,Mac_rlc_xface=%p \n",Rrc_xface,Mac_rlc_xface); - } - - if(rrc_init_global_param()==-1) { - printk("[OPENAIR][RRC][INIT] FATAL ERROR: INIT_GLOBAL_PARAM_NOK\n"); - return -1; - } - - return 0; -} - -#ifdef KERNEL2_6 -static void __exit openair_rrc_cleanup_module(void) -#else -void cleanup_module(void) -#endif //KERNEL2_6 -{ -#ifndef NO_RRM - rtf_destroy(RRC2RRM_FIFO); - rtf_destroy(RRM2RRC_FIFO); -#endif //NO_RRM - printk("[OPENAIR][RRC][CLEANUP] cleanup module\n"); - mac_rrc_unregister(Rrc_xface); - -} - -MODULE_AUTHOR -("Lionel GAUTHIER , Raymond KNOPP , Aawatif MENOUNI ,Dominique NUSSBAUM , Michelle WETTERWALD , Maxime GUILLAUD "); -MODULE_DESCRIPTION ("openair RRC layer module"); -MODULE_LICENSE ("GPL"); -module_init (openair_rrc_init_module); -module_exit (openair_rrc_cleanup_module); - -#endif //USER_MODE - - diff --git a/openair2/RRC/LITE/plmn_data.h b/openair2/RRC/LITE/plmn_data.h index 9158f69747..97dc94343b 100644 --- a/openair2/RRC/LITE/plmn_data.h +++ b/openair2/RRC/LITE/plmn_data.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + typedef struct { int mcc; int mnc; diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h index 7b316ce953..4cebb77860 100644 --- a/openair2/RRC/LITE/proto.h +++ b/openair2/RRC/LITE/proto.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file proto.h * \brief RRC functions prototypes for eNB and UE * \author Navid Nikaein and Raymond Knopp @@ -61,15 +54,30 @@ void rrc_config_buffer(SRB_INFO *srb_info, uint8_t Lchan_type, uint8_t Role); void openair_rrc_on( const protocol_ctxt_t* const ctxt_pP); +void +openair_rrc_on_ue( + const protocol_ctxt_t* const ctxt_pP); + void rrc_top_cleanup(void); +/** \brief Function to update eNB timers every subframe. +@param ctxt_pP running context +@param enb_index +@param CC_id +*/ +RRC_status_t +rrc_rx_tx( + protocol_ctxt_t* const ctxt_pP, + const int CC_id +); + /** \brief Function to update timers every subframe. For UE it updates T300,T304 and T310. @param ctxt_pP running context @param enb_index @param CC_id */ RRC_status_t -rrc_rx_tx( +rrc_rx_tx_ue( protocol_ctxt_t* const ctxt_pP, const uint8_t enb_index, const int CC_id @@ -228,19 +236,21 @@ rrc_eNB_generate_RRCConnectionReestablishmentReject( void rrc_eNB_process_RRCConnectionSetupComplete( const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP, + rrc_eNB_ue_context_t* ue_context_pP, RRCConnectionSetupComplete_r8_IEs_t* rrcConnectionSetupComplete ); /**\brief Process the RRCConnectionReconfigurationComplete based on information coming from UE \param ctxt_pP Running context \param ue_context_pP RRC UE context - \param rrcConnectionReconfigurationComplete Pointer to RRCConnectionReconfigurationComplete message*/ + \param rrcConnectionReconfigurationComplete Pointer to RRCConnectionReconfigurationComplete message + \param xid the transaction id for the rrcconnectionreconfiguration procedure +*/ void rrc_eNB_process_RRCConnectionReconfigurationComplete( const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP, - RRCConnectionReconfigurationComplete_r8_IEs_t* rrcConnectionReconfigurationComplete + rrc_eNB_ue_context_t* ue_context_pP, + const uint8_t xid ); /**\brief Generate the RRCConnectionRelease @@ -259,6 +269,31 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( const uint8_t ho_state ); +int freq_to_arfcn10(int band, unsigned long freq); + +void +rrc_eNB_generate_dedeicatedRRCConnectionReconfiguration( + const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const uint8_t ho_state +); + +/**\brief release Data Radio Bearer between ENB and UE + \param ctxt_pP Running context + \param ue_context_pP UE context of UE receiving the message*/ +void +rrc_eNB_generate_dedicatedRRCConnectionReconfiguration_release( + const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + uint8_t xid, + uint32_t nas_length, + uint8_t* nas_buffer +); + +void +rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* ue_context_pP); + #if defined(ENABLE_ITTI) /**\brief RRC eNB task. \param void *args_p Pointer on arguments to start the task. */ @@ -290,8 +325,6 @@ mac_rrc_data_req( const rb_id_t Srb_id, const uint8_t Nb_tb, uint8_t* const buffer_pP, - const eNB_flag_t enb_flagP, - const uint8_t eNB_index, const uint8_t mbsfn_sync_area ); @@ -305,7 +338,31 @@ mac_rrc_data_ind( const rb_id_t srb_idP, const uint8_t* sduP, const sdu_size_t sdu_lenP, - const eNB_flag_t eNB_flagP, + const uint8_t mbsfn_sync_areaP +); + +int8_t +mac_rrc_data_req_ue( + const module_id_t Mod_idP, + const int CC_id, + const frame_t frameP, + const rb_id_t Srb_id, + const uint8_t Nb_tb, + uint8_t* const buffer_pP, + const mac_enb_index_t eNB_indexP, + const uint8_t mbsfn_sync_area +); + +int8_t +mac_rrc_data_ind_ue( + const module_id_t module_idP, + const int CC_id, + const frame_t frameP, + const sub_frame_t sub_frameP, + const rnti_t rntiP, + const rb_id_t srb_idP, + const uint8_t* sduP, + const sdu_size_t sdu_lenP, const mac_enb_index_t eNB_indexP, const uint8_t mbsfn_sync_areaP ); @@ -318,6 +375,12 @@ void mac_eNB_rrc_ul_failure(const module_id_t Mod_instP, const sub_frame_t subframeP, const rnti_t rnti); +void mac_eNB_rrc_uplane_failure(const module_id_t Mod_instP, + const int CC_id, + const frame_t frameP, + const sub_frame_t subframeP, + const rnti_t rnti); + void mac_eNB_rrc_ul_in_sync(const module_id_t Mod_instP, const int CC_id, const frame_t frameP, @@ -357,6 +420,12 @@ int decode_BCCH_DLSCH_Message( const uint8_t rsrq, const uint8_t rsrp ); +int decode_PCCH_DLSCH_Message( + const protocol_ctxt_t* const ctxt_pP, + const uint8_t eNB_index, + uint8_t* const Sdu, + const uint8_t Sdu_len); + void ue_meas_filtering( const protocol_ctxt_t* const ctxt_pP, @@ -365,7 +434,7 @@ ue_meas_filtering( void ue_measurement_report_triggering( - const protocol_ctxt_t* const ctxt_pP, + protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index ); @@ -449,4 +518,13 @@ long binary_search_int(int elements[], long numElem, int value); long binary_search_float(float elements[], long numElem, float value); +void openair_rrc_top_init_eNB(int eMBMS_active,uint8_t HO_active); + +void openair_rrc_top_init_ue( + int eMBMS_active, + char* uecap_xer, + uint8_t cba_group_active, + uint8_t HO_active +); + /** @}*/ diff --git a/openair2/RRC/LITE/rrc_2_rrm_msg.c b/openair2/RRC/LITE/rrc_2_rrm_msg.c index 0dcdce6b12..87a0a3557b 100644 --- a/openair2/RRC/LITE/rrc_2_rrm_msg.c +++ b/openair2/RRC/LITE/rrc_2_rrm_msg.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! ******************************************************************************* diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 01c1ee6ca9..a8b24c326e 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rrc_UE.c * \brief rrc procedures for UE * \author Navid Nikaein and Raymond Knopp @@ -39,6 +32,7 @@ #define RRC_UE_C #include "assertions.h" +#include "hashtable.h" #include "asn1_conversions.h" #include "defs.h" #include "PHY/TOOLS/dB_routines.h" @@ -58,7 +52,8 @@ #include "UL-DCCH-Message.h" #include "DL-DCCH-Message.h" #include "BCCH-DL-SCH-Message.h" -#ifdef Rel10 +#include "PCCH-Message.h" +#if defined(Rel10) || defined(Rel14) #include "MCCH-Message.h" #endif #include "MeasConfig.h" @@ -67,14 +62,8 @@ #include "TDD-Config.h" #include "UECapabilityEnquiry.h" #include "UE-CapabilityRequest.h" -#ifdef PHY_ABSTRACTION -#include "OCG.h" -#include "OCG_extern.h" -#endif -#ifdef USER_MODE #include "RRC/NAS/nas_config.h" #include "RRC/NAS/rb_config.h" -#endif #if ENABLE_RAL #include "rrc_UE_ral.h" #endif @@ -105,8 +94,17 @@ extern void *bigphys_malloc(int); //#define XER_PRINT -extern int8_t dB_fixed2(uint32_t x,uint32_t y); +//extern int8_t dB_fixed2(uint32_t x,uint32_t y); +extern void pdcp_config_set_security( + const protocol_ctxt_t* const ctxt_pP, + pdcp_t * const pdcp_pP, + const rb_id_t rb_idP, + const uint16_t lc_idP, + const uint8_t security_modeP, + uint8_t * const kRRCenc, + uint8_t * const kRRCint, + uint8_t * const kUPenc); // internal prototypes @@ -130,7 +128,7 @@ static void rrc_ue_generate_RRCConnectionSetupComplete( const protocol_ctxt_t* c */ static void rrc_ue_generate_RRCConnectionReconfigurationComplete( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index, const uint8_t Transaction_id ); -static void rrc_ue_generate_MeasurementReport( const protocol_ctxt_t* const ctxt_pP, uint8_t eNB_index ); +static void rrc_ue_generate_MeasurementReport(protocol_ctxt_t* const ctxt_pP, uint8_t eNB_index ); static uint8_t check_trigger_meas_event( uint8_t module_idP, @@ -141,7 +139,7 @@ static uint8_t check_trigger_meas_event( Q_OffsetRange_t ofn, Q_OffsetRange_t ocn, Hysteresis_t hys, Q_OffsetRange_t ofs, Q_OffsetRange_t ocs, long a3_offset, TimeToTrigger_t ttt); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) static void decode_MBSFNAreaConfiguration(module_id_t module_idP, uint8_t eNB_index, frame_t frameP,uint8_t mbsfn_sync_area); #endif @@ -235,6 +233,30 @@ static int rrc_set_sub_state( module_id_t ue_mod_idP, Rrc_Sub_State_t subState ) return (0); } +//----------------------------------------------------------------------------- +void +openair_rrc_on_ue( + const protocol_ctxt_t* const ctxt_pP +) +//----------------------------------------------------------------------------- +{ + unsigned short i; + int CC_id; + + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" UE?:OPENAIR RRC IN....\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); + + for (i = 0; i < NB_eNB_INST; i++) { + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" Activating CCCH (eNB %d)\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), i); + UE_rrc_inst[ctxt_pP->module_id].Srb0[i].Srb_id = CCCH; + memcpy (&UE_rrc_inst[ctxt_pP->module_id].Srb0[i].Lchan_desc[0], &CCCH_LCHAN_DESC, LCHAN_DESC_SIZE); + memcpy (&UE_rrc_inst[ctxt_pP->module_id].Srb0[i].Lchan_desc[1], &CCCH_LCHAN_DESC, LCHAN_DESC_SIZE); + rrc_config_buffer (&UE_rrc_inst[ctxt_pP->module_id].Srb0[i], CCCH, 1); + UE_rrc_inst[ctxt_pP->module_id].Srb0[i].Active = 1; + } +} + //----------------------------------------------------------------------------- static void init_SI_UE( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index ) { @@ -252,7 +274,7 @@ static void init_SI_UE( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_ UE_rrc_inst[ctxt_pP->module_id].sib9[eNB_index] = malloc16_clear( sizeof(SystemInformationBlockType9_t) ); UE_rrc_inst[ctxt_pP->module_id].sib10[eNB_index] = malloc16_clear( sizeof(SystemInformationBlockType10_t) ); UE_rrc_inst[ctxt_pP->module_id].sib11[eNB_index] = malloc16_clear( sizeof(SystemInformationBlockType11_t) ); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) UE_rrc_inst[ctxt_pP->module_id].sib12[eNB_index] = malloc16_clear( sizeof(SystemInformationBlockType12_r9_t) ); UE_rrc_inst[ctxt_pP->module_id].sib13[eNB_index] = malloc16_clear( sizeof(SystemInformationBlockType13_r9_t) ); #endif @@ -264,7 +286,7 @@ static void init_SI_UE( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_ UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIcnt = 0; } -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) //----------------------------------------------------------------------------- #if 0 static void init_MCCH_UE(module_id_t ue_mod_idP, uint8_t eNB_index) @@ -324,8 +346,8 @@ char openair_rrc_ue_init( const module_id_t ue_mod_idP, const unsigned char eNB_ UE_rrc_inst[ctxt.module_id].Srb1[eNB_index].Active=0; UE_rrc_inst[ctxt.module_id].Srb2[eNB_index].Active=0; UE_rrc_inst[ctxt.module_id].HandoverInfoUe.measFlag=1; - UE_rrc_inst[ctxt.module_id].ciphering_algorithm = SecurityAlgorithmConfig__cipheringAlgorithm_eea0; -#ifdef Rel10 + UE_rrc_inst[ctxt.module_id].ciphering_algorithm = CipheringAlgorithm_r12_eea0; +#if defined(Rel10) || defined(Rel14) UE_rrc_inst[ctxt.module_id].integrity_algorithm = SecurityAlgorithmConfig__integrityProtAlgorithm_eia0_v920; #else UE_rrc_inst[ctxt.module_id].integrity_algorithm = SecurityAlgorithmConfig__integrityProtAlgorithm_reserved; @@ -341,7 +363,7 @@ char openair_rrc_ue_init( const module_id_t ue_mod_idP, const unsigned char eNB_ #endif #ifdef NO_RRM //init ch SRB0, SRB1 & BDTCH - openair_rrc_on(&ctxt); + openair_rrc_on_ue(&ctxt); #endif #ifdef CBA int j; @@ -400,6 +422,7 @@ void rrc_ue_generate_RRCConnectionRequest( const protocol_ctxt_t* const ctxt_pP, mui_t rrc_mui=0; +#if !(defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)) /* NAS Attach request with IMSI */ static const char const nas_attach_req_imsi[] = { 0x07, 0x41, @@ -413,7 +436,9 @@ static const char const nas_attach_req_imsi[] = { 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0A, 0x00, 0x52, 0x12, 0xF2, 0x01, 0x27, 0x11, }; +#endif /* !(defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)) */ +#if 0 /* NAS Attach request with GUTI */ static const char const nas_attach_req_guti[] = { 0x07, 0x41, @@ -427,6 +452,48 @@ static const char const nas_attach_req_guti[] = { 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x0A, 0x00, 0x52, 0x12, 0xF2, 0x01, 0x27, 0x11, }; +#endif + +//----------------------------------------------------------------------------- +void +rrc_t310_expiration( + const protocol_ctxt_t* const ctxt_pP, + const uint8_t eNB_index +) +//----------------------------------------------------------------------------- +{ + + if (UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].State != RRC_CONNECTED) { + LOG_D(RRC, "Timer 310 expired, going to RRC_IDLE\n"); + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].State = RRC_IDLE; + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].UE_index = 0xffff; + UE_rrc_inst[ctxt_pP->module_id].Srb0[eNB_index].Rx_buffer.payload_size = 0; + UE_rrc_inst[ctxt_pP->module_id].Srb0[eNB_index].Tx_buffer.payload_size = 0; + UE_rrc_inst[ctxt_pP->module_id].Srb1[eNB_index].Srb_info.Rx_buffer.payload_size = 0; + UE_rrc_inst[ctxt_pP->module_id].Srb1[eNB_index].Srb_info.Tx_buffer.payload_size = 0; + + if (UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Active == 1) { + LOG_D (RRC,"[Inst %d] eNB_index %d, Remove RB %d\n ", ctxt_pP->module_id, eNB_index, + UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Srb_info.Srb_id); + rrc_pdcp_config_req (ctxt_pP, + SRB_FLAG_YES, + CONFIG_ACTION_REMOVE, + UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Srb_info.Srb_id, + 0); + rrc_rlc_config_req (ctxt_pP, + SRB_FLAG_YES, + MBMS_FLAG_NO, + CONFIG_ACTION_REMOVE, + UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Srb_info.Srb_id, + Rlc_info_um); + UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Active = 0; + UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Status = IDLE; + UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Next_check_frame = 0; + } + } else { // Restablishment procedure + LOG_D(RRC, "Timer 310 expired, trying RRCRestablishment ...\n"); + } +} //----------------------------------------------------------------------------- static void rrc_ue_generate_RRCConnectionSetupComplete( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index, const uint8_t Transaction_id ) @@ -452,7 +519,7 @@ static void rrc_ue_generate_RRCConnectionSetupComplete( const protocol_ctxt_t* c LOG_D(RLC, "[FRAME %05d][RRC_UE][MOD %02d][][--- PDCP_DATA_REQ/%d Bytes (RRCConnectionSetupComplete to eNB %d MUI %d) --->][PDCP][MOD %02d][RB %02d]\n", ctxt_pP->frame, ctxt_pP->module_id+NB_eNB_INST, size, eNB_index, rrc_mui, ctxt_pP->module_id+NB_eNB_INST, DCCH); - rrc_data_req ( + rrc_data_req_ue ( ctxt_pP, DCCH, rrc_mui++, @@ -479,7 +546,7 @@ static void rrc_ue_generate_RRCConnectionReconfigurationComplete( const protocol rrc_mui, UE_MODULE_ID_TO_INSTANCE(ctxt_pP->module_id), DCCH); - rrc_data_req ( + rrc_data_req_ue ( ctxt_pP, DCCH, rrc_mui++, @@ -541,7 +608,7 @@ int rrc_ue_decode_ccch( const protocol_ctxt_t* const ctxt_pP, const SRB_INFO* co #endif if ((dec_rval.code != RC_OK) && (dec_rval.consumed==0)) { - LOG_E(RRC,"[UE %d] Frame %d : Failed to decode DL-CCCH-Message (%d bytes)\n",ctxt_pP->module_id,dec_rval.consumed); + LOG_E(RRC,"[UE %d] Frame %d : Failed to decode DL-CCCH-Message (%zu bytes)\n",ctxt_pP->module_id,ctxt_pP->frame,dec_rval.consumed); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_CCCH, VCD_FUNCTION_OUT); return -1; } @@ -722,13 +789,8 @@ rrc_ue_establish_drb( */ #ifdef PDCP_USE_NETLINK # if !defined(OAI_NW_DRIVER_TYPE_ETHERNET) && !defined(EXMIMO) && !defined(OAI_USRP) && !defined(OAI_BLADERF) && !defined(ETHERNET) && !defined(LINK_ENB_PDCP_TO_GTPV1U) -# ifdef OAI_EMU - ip_addr_offset3 = oai_emulation.info.nb_enb_local; - ip_addr_offset4 = NB_eNB_INST; -# else ip_addr_offset3 = 0; - ip_addr_offset4 = 8; -# endif + ip_addr_offset4 = 1; LOG_I(OIP,"[UE %d] trying to bring up the OAI interface oai%d, IP 10.0.%d.%d\n", ue_mod_idP, ip_addr_offset3+ue_mod_idP, ip_addr_offset3+ue_mod_idP+1,ip_addr_offset4+ue_mod_idP+1); oip_ifup=nas_config(ip_addr_offset3+ue_mod_idP, // interface_id @@ -736,13 +798,10 @@ rrc_ue_establish_drb( ip_addr_offset4+ue_mod_idP+1); // fourth_octet if (oip_ifup == 0 ) { // interface is up --> send a config the DRB -# ifdef OAI_EMU - oai_emulation.info.oai_ifup[ue_mod_idP]=1; -# endif - LOG_I(OIP,"[UE %d] Config the oai%d to send/receive pkt on DRB %d to/from the protocol stack\n", + LOG_I(OIP,"[UE %d] Config the oai%d to send/receive pkt on DRB %ld to/from the protocol stack\n", ue_mod_idP, ip_addr_offset3+ue_mod_idP, - (eNB_index * maxDRB) + DRB_config->drb_Identity); + (long int)((eNB_index * maxDRB) + DRB_config->drb_Identity)); rb_conf_ipv4(0,//add ue_mod_idP,//cx align with the UE index @@ -754,10 +813,6 @@ rrc_ue_establish_drb( LOG_D(RRC,"[UE %d] State = Attached (eNB %d)\n",ue_mod_idP,eNB_index); } -# else -# ifdef OAI_EMU - oai_emulation.info.oai_ifup[ue_mod_idP]=1; -# endif # endif #endif @@ -795,15 +850,15 @@ rrc_ue_process_measConfig( ind = measConfig->measObjectToAddModList->list.array[i]->measObjectId; if (UE_rrc_inst[ctxt_pP->module_id].MeasObj[eNB_index][ind-1]) { - LOG_D(RRC,"Modifying measurement object %d\n",ind); + LOG_D(RRC,"Modifying measurement object %ld\n",ind); memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].MeasObj[eNB_index][ind-1], (char*)measObj, sizeof(MeasObjectToAddMod_t)); } else { - LOG_I(RRC,"Adding measurement object %d\n",ind); + LOG_I(RRC,"Adding measurement object %ld\n",ind); if (measObj->measObject.present == MeasObjectToAddMod__measObject_PR_measObjectEUTRA) { - LOG_I(RRC,"EUTRA Measurement : carrierFreq %d, allowedMeasBandwidth %d,presenceAntennaPort1 %d, neighCellConfig %d\n", + LOG_I(RRC,"EUTRA Measurement : carrierFreq %ld, allowedMeasBandwidth %ld,presenceAntennaPort1 %d, neighCellConfig %d\n", measObj->measObject.choice.measObjectEUTRA.carrierFreq, measObj->measObject.choice.measObjectEUTRA.allowedMeasBandwidth, measObj->measObject.choice.measObjectEUTRA.presenceAntennaPort1, @@ -813,38 +868,40 @@ rrc_ue_process_measConfig( } } - rrc_mac_config_req(ctxt_pP->module_id,0,ENB_FLAG_NO,0,eNB_index, - (RadioResourceConfigCommonSIB_t *)NULL, - (struct PhysicalConfigDedicated *)NULL, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, + LOG_I(RRC,"call rrc_mac_config_req \n"); + + rrc_mac_config_req_ue(ctxt_pP->module_id,0,eNB_index, + (RadioResourceConfigCommonSIB_t *)NULL, + (struct PhysicalConfigDedicated *)NULL, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, #endif - UE_rrc_inst[ctxt_pP->module_id].MeasObj[eNB_index], - (MAC_MainConfig_t *)NULL, - 0, - (struct LogicalChannelConfig *)NULL, - (MeasGapConfig_t *)NULL, - (TDD_Config_t *)NULL, - (MobilityControlInfo_t *)NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL -#ifdef Rel10 - , - 0, - (MBSFN_AreaInfoList_r9_t *)NULL, - (PMCH_InfoList_r9_t *)NULL + UE_rrc_inst[ctxt_pP->module_id].MeasObj[eNB_index], + (MAC_MainConfig_t *)NULL, + 0, + (struct LogicalChannelConfig *)NULL, + (MeasGapConfig_t *)NULL, + (TDD_Config_t *)NULL, + (MobilityControlInfo_t *)NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +#if defined(Rel10) || defined(Rel14) + ,0, + (MBSFN_AreaInfoList_r9_t *)NULL, + (PMCH_InfoList_r9_t *)NULL + #endif #ifdef CBA - , - 0, - 0 + , + 0, + 0 #endif - ); + ); } if (measConfig->reportConfigToRemoveList != NULL) { @@ -861,12 +918,12 @@ rrc_ue_process_measConfig( ind = measConfig->reportConfigToAddModList->list.array[i]->reportConfigId; if (UE_rrc_inst[ctxt_pP->module_id].ReportConfig[eNB_index][ind-1]) { - LOG_I(RRC,"Modifying Report Configuration %d\n",ind-1); + LOG_I(RRC,"Modifying Report Configuration %ld\n",ind-1); memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].ReportConfig[eNB_index][ind-1], (char*)measConfig->reportConfigToAddModList->list.array[i], sizeof(ReportConfigToAddMod_t)); } else { - LOG_D(RRC,"Adding Report Configuration %d %p \n",ind-1,measConfig->reportConfigToAddModList->list.array[i]); + LOG_D(RRC,"Adding Report Configuration %ld %p \n",ind-1,measConfig->reportConfigToAddModList->list.array[i]); UE_rrc_inst[ctxt_pP->module_id].ReportConfig[eNB_index][ind-1] = measConfig->reportConfigToAddModList->list.array[i]; } } @@ -896,12 +953,12 @@ rrc_ue_process_measConfig( ind = measConfig->measIdToAddModList->list.array[i]->measId; if (UE_rrc_inst[ctxt_pP->module_id].MeasId[eNB_index][ind-1]) { - LOG_D(RRC,"Modifying Measurement ID %d\n",ind-1); + LOG_D(RRC,"Modifying Measurement ID %ld\n",ind-1); memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].MeasId[eNB_index][ind-1], (char*)measConfig->measIdToAddModList->list.array[i], sizeof(MeasIdToAddMod_t)); } else { - LOG_D(RRC,"Adding Measurement ID %d %p\n",ind-1,measConfig->measIdToAddModList->list.array[i]); + LOG_D(RRC,"Adding Measurement ID %ld %p\n",ind-1,measConfig->measIdToAddModList->list.array[i]); UE_rrc_inst[ctxt_pP->module_id].MeasId[eNB_index][ind-1] = measConfig->measIdToAddModList->list.array[i]; } } @@ -933,13 +990,11 @@ rrc_ue_process_measConfig( UE_rrc_inst[ctxt_pP->module_id].filter_coeff_rsrq = 1./pow(2, (*UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[eNB_index]->quantityConfigEUTRA->filterCoefficientRSRQ)/4); - LOG_I(RRC,"[UE %d] set rsrp-coeff for eNB %d: %d rsrq-coeff: %d rsrp_factor: %f rsrq_factor: %f \n", + LOG_I(RRC,"[UE %d] set rsrp-coeff for eNB %d: %ld rsrq-coeff: %ld rsrp_factor: %f rsrq_factor: %f \n", ctxt_pP->module_id, eNB_index, // UE_rrc_inst[ue_mod_idP].Info[eNB_index].UE_index, *UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[eNB_index]->quantityConfigEUTRA->filterCoefficientRSRP, *UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[eNB_index]->quantityConfigEUTRA->filterCoefficientRSRQ, UE_rrc_inst[ctxt_pP->module_id].filter_coeff_rsrp, - UE_rrc_inst[ctxt_pP->module_id].filter_coeff_rsrp, - UE_rrc_inst[ctxt_pP->module_id].filter_coeff_rsrp, UE_rrc_inst[ctxt_pP->module_id].filter_coeff_rsrq); } @@ -959,6 +1014,223 @@ rrc_ue_process_measConfig( } } + +void +rrc_ue_update_radioResourceConfigDedicated(RadioResourceConfigDedicated_t* radioResourceConfigDedicated, + const protocol_ctxt_t* const ctxt_pP, + uint8_t eNB_index) +{ + PhysicalConfigDedicated_t* physicalConfigDedicated2 = NULL; + + physicalConfigDedicated2 = CALLOC(1,sizeof(*physicalConfigDedicated2)); + physicalConfigDedicated2->pdsch_ConfigDedicated = CALLOC(1,sizeof(*physicalConfigDedicated2->pdsch_ConfigDedicated)); + physicalConfigDedicated2->pusch_ConfigDedicated = CALLOC(1,sizeof(*physicalConfigDedicated2->pusch_ConfigDedicated)); + physicalConfigDedicated2->pucch_ConfigDedicated = CALLOC(1,sizeof(*physicalConfigDedicated2->pucch_ConfigDedicated)); + physicalConfigDedicated2->cqi_ReportConfig = CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig)); + physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic + = CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic)); + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated = CALLOC(1,sizeof(*physicalConfigDedicated2->soundingRS_UL_ConfigDedicated)); + physicalConfigDedicated2->schedulingRequestConfig = CALLOC(1,sizeof(*physicalConfigDedicated2->schedulingRequestConfig)); + physicalConfigDedicated2->antennaInfo = CALLOC(1,sizeof(*physicalConfigDedicated2->antennaInfo)); + + physicalConfigDedicated2->uplinkPowerControlDedicated = CALLOC(1,sizeof(*physicalConfigDedicated2->uplinkPowerControlDedicated)); + physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH = CALLOC(1,sizeof(*physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH)); + physicalConfigDedicated2->tpc_PDCCH_ConfigPUCCH = CALLOC(1,sizeof(*physicalConfigDedicated2->tpc_PDCCH_ConfigPUCCH)); + + // Update pdsch_ConfigDedicated + if(radioResourceConfigDedicated->physicalConfigDedicated->pdsch_ConfigDedicated != NULL) + { + LOG_I(RRC,"Update pdsch_ConfigDedicated config \n"); + + if(UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->pdsch_ConfigDedicated == NULL) + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->pdsch_ConfigDedicated = CALLOC(1,sizeof(PDSCH_ConfigDedicated_t)); + + memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->pdsch_ConfigDedicated, + (char*)radioResourceConfigDedicated->physicalConfigDedicated->pdsch_ConfigDedicated, + sizeof(physicalConfigDedicated2->pdsch_ConfigDedicated)); + } + else + { + LOG_I(RRC,"Keep old config for pdsch_ConfigDedicated\n"); + } + + // Update pusch_ConfigDedicated + if(radioResourceConfigDedicated->physicalConfigDedicated->pusch_ConfigDedicated != NULL) + { + LOG_I(RRC,"Update pusch_ConfigDedicated config \n"); + + if(UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->pusch_ConfigDedicated == NULL) + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->pusch_ConfigDedicated = CALLOC(1,sizeof(PUSCH_ConfigDedicated_t)); + + memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->pusch_ConfigDedicated, + (char*)radioResourceConfigDedicated->physicalConfigDedicated->pusch_ConfigDedicated, + sizeof(physicalConfigDedicated2->pusch_ConfigDedicated)); + } + else + { + LOG_I(RRC,"Keep old config for pusch_ConfigDedicated\n"); + } + + // Update pucch_ConfigDedicated + if(radioResourceConfigDedicated->physicalConfigDedicated->pucch_ConfigDedicated != NULL) + { + LOG_I(RRC,"Update pucch_ConfigDedicated config \n"); + if(UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->pucch_ConfigDedicated == NULL) + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->pucch_ConfigDedicated = CALLOC(1,sizeof(PUCCH_ConfigDedicated_t)); + + memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->pucch_ConfigDedicated, + (char*)radioResourceConfigDedicated->physicalConfigDedicated->pucch_ConfigDedicated, + sizeof(physicalConfigDedicated2->pucch_ConfigDedicated)); + } + else + { + LOG_I(RRC,"Keep old config for pucch_ConfigDedicated\n"); + } + + // Update cqi_ReportConfig + if(radioResourceConfigDedicated->physicalConfigDedicated->cqi_ReportConfig != NULL) + { + LOG_I(RRC,"Update cqi_ReportConfig config (size=%zu,%zu)\n", sizeof(*physicalConfigDedicated2->cqi_ReportConfig), sizeof(CQI_ReportConfig_t)); + + if(UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->cqi_ReportConfig == NULL) + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->cqi_ReportConfig = CALLOC(1,sizeof(CQI_ReportConfig_t)); + + memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->cqi_ReportConfig, + (char*)radioResourceConfigDedicated->physicalConfigDedicated->cqi_ReportConfig, + sizeof(*physicalConfigDedicated2->cqi_ReportConfig)); + + if (radioResourceConfigDedicated->physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic != NULL) { + LOG_I(RRC,"Update cqi_ReportPeriodic config (size=%zu,%zu)\n", sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic), sizeof(CQI_ReportPeriodic_t)); + + if(UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->cqi_ReportConfig->cqi_ReportPeriodic == NULL) + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->cqi_ReportConfig->cqi_ReportPeriodic = CALLOC(1,sizeof(CQI_ReportPeriodic_t)); + + memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->cqi_ReportConfig->cqi_ReportPeriodic, + (char*)radioResourceConfigDedicated->physicalConfigDedicated->cqi_ReportConfig->cqi_ReportPeriodic, + sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic)); + } + } + else + { + LOG_I(RRC,"Keep old config for cqi_ReportConfig\n"); + } + + // Update schedulingRequestConfig + if(radioResourceConfigDedicated->physicalConfigDedicated->schedulingRequestConfig != NULL) + { + LOG_I(RRC,"Update schedulingRequestConfig config \n"); + + if(UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->schedulingRequestConfig == NULL) + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->schedulingRequestConfig = CALLOC(1,sizeof(SchedulingRequestConfig_t)); + + memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->schedulingRequestConfig, + (char*)radioResourceConfigDedicated->physicalConfigDedicated->schedulingRequestConfig, + sizeof(physicalConfigDedicated2->schedulingRequestConfig)); + } + else + { + LOG_I(RRC,"Keep old config for schedulingRequestConfig\n"); + } + + // Update soundingRS_UL_ConfigDedicated + if(radioResourceConfigDedicated->physicalConfigDedicated->soundingRS_UL_ConfigDedicated != NULL) + { + LOG_I(RRC,"Update soundingRS_UL_ConfigDedicated config \n"); + + if(UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->soundingRS_UL_ConfigDedicated == NULL) + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->soundingRS_UL_ConfigDedicated = CALLOC(1,sizeof(SoundingRS_UL_ConfigDedicated_t)); + + memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->soundingRS_UL_ConfigDedicated, + (char*)radioResourceConfigDedicated->physicalConfigDedicated->soundingRS_UL_ConfigDedicated, + sizeof(physicalConfigDedicated2->soundingRS_UL_ConfigDedicated)); + } + else + { + LOG_I(RRC,"Keep old config for soundingRS_UL_ConfigDedicated\n"); + } + + // Update antennaInfo + if(radioResourceConfigDedicated->physicalConfigDedicated->antennaInfo != NULL) + { + LOG_I(RRC,"Update antennaInfo config \n"); + + if(UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->antennaInfo == NULL) + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->antennaInfo = CALLOC(1,sizeof(struct PhysicalConfigDedicated__antennaInfo)); + + memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->antennaInfo, + (char*)radioResourceConfigDedicated->physicalConfigDedicated->antennaInfo, + sizeof(physicalConfigDedicated2->antennaInfo)); + + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->antennaInfo->choice.explicitValue.transmissionMode = + radioResourceConfigDedicated->physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode; + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->antennaInfo->choice.explicitValue.codebookSubsetRestriction = + radioResourceConfigDedicated->physicalConfigDedicated->antennaInfo->choice.explicitValue.codebookSubsetRestriction; + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->antennaInfo->choice.explicitValue.ue_TransmitAntennaSelection = + radioResourceConfigDedicated->physicalConfigDedicated->antennaInfo->choice.explicitValue.ue_TransmitAntennaSelection; + + LOG_I(PHY,"New Transmission Mode %ld \n",radioResourceConfigDedicated->physicalConfigDedicated->antennaInfo->choice.explicitValue.transmissionMode); + LOG_I(PHY,"Configured Transmission Mode %ld \n",UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->antennaInfo->choice.explicitValue.transmissionMode); + + } + else + { + LOG_I(RRC,"Keep old config for antennaInfo\n"); + } + + + // Update uplinkPowerControlDedicated + if(radioResourceConfigDedicated->physicalConfigDedicated->uplinkPowerControlDedicated != NULL) + { + LOG_I(RRC,"Update uplinkPowerControlDedicated config \n"); + + if(UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->uplinkPowerControlDedicated == NULL) + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->uplinkPowerControlDedicated = CALLOC(1,sizeof(UplinkPowerControlDedicated_t)); + + memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->uplinkPowerControlDedicated, + (char*)radioResourceConfigDedicated->physicalConfigDedicated->uplinkPowerControlDedicated, + sizeof(physicalConfigDedicated2->uplinkPowerControlDedicated)); + } + else + { + LOG_I(RRC,"Keep old config for uplinkPowerControlDedicated\n"); + } + + // Update tpc_PDCCH_ConfigPUCCH + if(radioResourceConfigDedicated->physicalConfigDedicated->tpc_PDCCH_ConfigPUCCH != NULL) + { + LOG_I(RRC,"Update tpc_PDCCH_ConfigPUCCH config \n"); + + if(UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->tpc_PDCCH_ConfigPUCCH == NULL) + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->tpc_PDCCH_ConfigPUCCH = CALLOC(1,sizeof(TPC_PDCCH_Config_t)); + + memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->tpc_PDCCH_ConfigPUCCH, + (char*)radioResourceConfigDedicated->physicalConfigDedicated->tpc_PDCCH_ConfigPUCCH, + sizeof(physicalConfigDedicated2->tpc_PDCCH_ConfigPUCCH)); + } + else + { + LOG_I(RRC,"Keep old config for tpc_PDCCH_ConfigPUCCH\n"); + } + + // Update tpc_PDCCH_ConfigPUSCH + if(radioResourceConfigDedicated->physicalConfigDedicated->tpc_PDCCH_ConfigPUSCH != NULL) + { + LOG_I(RRC,"Update tpc_PDCCH_ConfigPUSCH config \n"); + + if(UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->tpc_PDCCH_ConfigPUSCH == NULL) + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->tpc_PDCCH_ConfigPUSCH = CALLOC(1,sizeof(TPC_PDCCH_Config_t)); + + memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]->tpc_PDCCH_ConfigPUSCH, + (char*)radioResourceConfigDedicated->physicalConfigDedicated->tpc_PDCCH_ConfigPUSCH, + sizeof(physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH)); + + } + else + { + LOG_I(RRC,"Keep old config for tpc_PDCCH_ConfigPUSCH\n"); + } + +} //----------------------------------------------------------------------------- void rrc_ue_process_radioResourceConfigDedicated( @@ -979,11 +1251,17 @@ rrc_ue_process_radioResourceConfigDedicated( // Save physicalConfigDedicated if present if (radioResourceConfigDedicated->physicalConfigDedicated) { + LOG_I(RRC,"Save physicalConfigDedicated if present \n"); + if (UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index]) { +#if 1 + rrc_ue_update_radioResourceConfigDedicated(radioResourceConfigDedicated, ctxt_pP, eNB_index); +#else memcpy((char*)UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index],(char*)radioResourceConfigDedicated->physicalConfigDedicated, sizeof(struct PhysicalConfigDedicated)); - +#endif } else { + LOG_I(RRC,"Init physicalConfigDedicated UE_rrc_inst to radioResourceConfigDedicated->physicalConfigDedicated\n"); UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index] = radioResourceConfigDedicated->physicalConfigDedicated; } } @@ -1057,17 +1335,17 @@ rrc_ue_process_radioResourceConfigDedicated( kRRCenc, kRRCint, NULL -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) ,(PMCH_InfoList_r9_t *)NULL #endif - ); + ,NULL); // Refresh SRBs rrc_rlc_config_asn1_req(ctxt_pP, radioResourceConfigDedicated->srb_ToAddModList, (DRB_ToAddModList_t*)NULL, (DRB_ToReleaseList_t*)NULL -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) ,(PMCH_InfoList_r9_t *)NULL #endif ); @@ -1101,40 +1379,41 @@ rrc_ue_process_radioResourceConfigDedicated( SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; } - LOG_D(RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB1 eNB %d) --->][MAC_UE][MOD %02d][]\n", + LOG_I(RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB1 eNB %d) --->][MAC_UE][MOD %02d][]\n", ctxt_pP->frame, ctxt_pP->module_id, eNB_index, ctxt_pP->module_id); - rrc_mac_config_req(ctxt_pP->module_id,0,ENB_FLAG_NO,0,eNB_index, - (RadioResourceConfigCommonSIB_t *)NULL, - UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index], -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, + + rrc_mac_config_req_ue(ctxt_pP->module_id,0,eNB_index, + (RadioResourceConfigCommonSIB_t *)NULL, + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index], +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, #endif - (MeasObjectToAddMod_t **)NULL, - UE_rrc_inst[ctxt_pP->module_id].mac_MainConfig[eNB_index], - 1, - SRB1_logicalChannelConfig, - (MeasGapConfig_t *)NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL -#ifdef Rel10 - , - 0, - (MBSFN_AreaInfoList_r9_t *)NULL, - (PMCH_InfoList_r9_t *)NULL + (MeasObjectToAddMod_t **)NULL, + UE_rrc_inst[ctxt_pP->module_id].mac_MainConfig[eNB_index], + 1, + SRB1_logicalChannelConfig, + (MeasGapConfig_t *)NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +#if defined(Rel10) || defined(Rel14) + , + 0, + (MBSFN_AreaInfoList_r9_t *)NULL, + (PMCH_InfoList_r9_t *)NULL #endif #ifdef CBA - , - 0, - 0 + , + 0, + 0 #endif - ); + ); } } else { if (UE_rrc_inst[ctxt_pP->module_id].SRB2_config[eNB_index]) { @@ -1156,43 +1435,44 @@ rrc_ue_process_radioResourceConfigDedicated( SRB2_logicalChannelConfig = &SRB2_logicalChannelConfig_defaultValue; } - LOG_D(RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB2 eNB %d) --->][MAC_UE][MOD %02d][]\n", + LOG_I(RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB2 eNB %d) --->][MAC_UE][MOD %02d][]\n", ctxt_pP->frame, ctxt_pP->module_id, eNB_index, ctxt_pP->module_id); - rrc_mac_config_req(ctxt_pP->module_id,0,ENB_FLAG_NO,0,eNB_index, - (RadioResourceConfigCommonSIB_t *)NULL, - UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index], -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, + rrc_mac_config_req_ue(ctxt_pP->module_id,0,eNB_index, + (RadioResourceConfigCommonSIB_t *)NULL, + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index], +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, #endif - (MeasObjectToAddMod_t **)NULL, - UE_rrc_inst[ctxt_pP->module_id].mac_MainConfig[eNB_index], - 2, - SRB2_logicalChannelConfig, - UE_rrc_inst[ctxt_pP->module_id].measGapConfig[eNB_index], - (TDD_Config_t *)NULL, - (MobilityControlInfo_t *)NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL -#ifdef Rel10 - , - 0, - (MBSFN_AreaInfoList_r9_t *)NULL, - (PMCH_InfoList_r9_t *)NULL + (MeasObjectToAddMod_t **)NULL, + UE_rrc_inst[ctxt_pP->module_id].mac_MainConfig[eNB_index], + 2, + SRB2_logicalChannelConfig, + UE_rrc_inst[ctxt_pP->module_id].measGapConfig[eNB_index], + (TDD_Config_t *)NULL, + (MobilityControlInfo_t *)NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +#if defined(Rel10) || defined(Rel14) + , + 0, + (MBSFN_AreaInfoList_r9_t *)NULL, + (PMCH_InfoList_r9_t *)NULL + #endif #ifdef CBA - , - 0, - 0 + , + 0, + 0 #endif - ); + ); } } } @@ -1200,6 +1480,15 @@ rrc_ue_process_radioResourceConfigDedicated( // Establish DRBs if present if (radioResourceConfigDedicated->drb_ToAddModList) { + + if ( (UE_rrc_inst[ctxt_pP->module_id].defaultDRB == NULL) && + (radioResourceConfigDedicated->drb_ToAddModList->list.count >= 1) ) { + // configure the first DRB ID as the default DRB ID + UE_rrc_inst[ctxt_pP->module_id].defaultDRB = malloc(sizeof(rb_id_t)); + *UE_rrc_inst[ctxt_pP->module_id].defaultDRB = radioResourceConfigDedicated->drb_ToAddModList->list.array[0]->drb_Identity; + LOG_I(RRC,"[UE %d] default DRB = %d\n",ctxt_pP->module_id, *UE_rrc_inst[ctxt_pP->module_id].defaultDRB); + } + uint8_t *kUPenc = NULL; #if defined(ENABLE_SECURITY) @@ -1228,17 +1517,17 @@ rrc_ue_process_radioResourceConfigDedicated( NULL, NULL, kUPenc -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) ,(PMCH_InfoList_r9_t *)NULL #endif - ); + , UE_rrc_inst[ctxt_pP->module_id].defaultDRB); // Refresh DRBs rrc_rlc_config_asn1_req(ctxt_pP, (SRB_ToAddModList_t*)NULL, radioResourceConfigDedicated->drb_ToAddModList, (DRB_ToReleaseList_t*)NULL -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) ,(PMCH_InfoList_r9_t *)NULL #endif ); @@ -1254,61 +1543,50 @@ rrc_ue_process_radioResourceConfigDedicated( UE_rrc_inst[ctxt_pP->module_id].DRB_config[eNB_index][DRB_id] = radioResourceConfigDedicated->drb_ToAddModList->list.array[i]; rrc_ue_establish_drb(ctxt_pP->module_id,ctxt_pP->frame,eNB_index,radioResourceConfigDedicated->drb_ToAddModList->list.array[i]); // MAC/PHY Configuration - LOG_D(RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (DRB %d eNB %d) --->][MAC_UE][MOD %02d][]\n", + LOG_I(RRC, "[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (DRB %ld eNB %d) --->][MAC_UE][MOD %02d][]\n", ctxt_pP->frame, ctxt_pP->module_id, radioResourceConfigDedicated->drb_ToAddModList->list.array[i]->drb_Identity, eNB_index, ctxt_pP->module_id); - rrc_mac_config_req(ctxt_pP->module_id,0,ENB_FLAG_NO,0,eNB_index, - (RadioResourceConfigCommonSIB_t *)NULL, - UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index], -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, + rrc_mac_config_req_ue(ctxt_pP->module_id,0,eNB_index, + (RadioResourceConfigCommonSIB_t *)NULL, + UE_rrc_inst[ctxt_pP->module_id].physicalConfigDedicated[eNB_index], +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, #endif - (MeasObjectToAddMod_t **)NULL, - UE_rrc_inst[ctxt_pP->module_id].mac_MainConfig[eNB_index], - *UE_rrc_inst[ctxt_pP->module_id].DRB_config[eNB_index][DRB_id]->logicalChannelIdentity, - UE_rrc_inst[ctxt_pP->module_id].DRB_config[eNB_index][DRB_id]->logicalChannelConfig, - UE_rrc_inst[ctxt_pP->module_id].measGapConfig[eNB_index], - (TDD_Config_t*)NULL, - (MobilityControlInfo_t *)NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL -#ifdef Rel10 - , - 0, - (MBSFN_AreaInfoList_r9_t *)NULL, - (PMCH_InfoList_r9_t *)NULL + (MeasObjectToAddMod_t **)NULL, + UE_rrc_inst[ctxt_pP->module_id].mac_MainConfig[eNB_index], + *UE_rrc_inst[ctxt_pP->module_id].DRB_config[eNB_index][DRB_id]->logicalChannelIdentity, + UE_rrc_inst[ctxt_pP->module_id].DRB_config[eNB_index][DRB_id]->logicalChannelConfig, + UE_rrc_inst[ctxt_pP->module_id].measGapConfig[eNB_index], + (TDD_Config_t*)NULL, + (MobilityControlInfo_t *)NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +#if defined(Rel10) || defined(Rel14) + , + 0, + (MBSFN_AreaInfoList_r9_t *)NULL, + (PMCH_InfoList_r9_t *)NULL #endif #ifdef CBA - , - UE_rrc_inst[ue_mod_idP].num_active_cba_groups, // - UE_rrc_inst[ue_mod_idP].cba_rnti[0] + , + UE_rrc_inst[ue_mod_idP].num_active_cba_groups, // + UE_rrc_inst[ue_mod_idP].cba_rnti[0] #endif - ); - + ); + } } } - + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].State = RRC_CONNECTED; LOG_I(RRC,"[UE %d] State = RRC_CONNECTED (eNB %d)\n",ctxt_pP->module_id,eNB_index); -#if !defined(ENABLE_USE_MME) && defined(OAI_EMU) -# ifdef OAI_EMU - rrc_eNB_emulation_notify_ue_module_id( - ctxt_pP->module_id, - ctxt_pP->rnti, - UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]->cellAccessRelatedInfo.cellIdentity.buf[0], - UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]->cellAccessRelatedInfo.cellIdentity.buf[1], - UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]->cellAccessRelatedInfo.cellIdentity.buf[2], - UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]->cellAccessRelatedInfo.cellIdentity.buf[3]); -# endif /* OAI_EMU */ -#endif } @@ -1333,26 +1611,26 @@ rrc_ue_process_securityModeCommand( ctxt_pP->module_id,ctxt_pP->frame,eNB_index); switch (securityModeCommand->criticalExtensions.choice.c1.choice.securityModeCommand_r8.securityConfigSMC.securityAlgorithmConfig.cipheringAlgorithm) { - case SecurityAlgorithmConfig__cipheringAlgorithm_eea0: + case CipheringAlgorithm_r12_eea0: LOG_I(RRC,"[UE %d] Security algorithm is set to eea0\n", ctxt_pP->module_id); - securityMode= SecurityAlgorithmConfig__cipheringAlgorithm_eea0; + securityMode= CipheringAlgorithm_r12_eea0; break; - case SecurityAlgorithmConfig__cipheringAlgorithm_eea1: + case CipheringAlgorithm_r12_eea1: LOG_I(RRC,"[UE %d] Security algorithm is set to eea1\n",ctxt_pP->module_id); - securityMode= SecurityAlgorithmConfig__cipheringAlgorithm_eea1; + securityMode= CipheringAlgorithm_r12_eea1; break; - case SecurityAlgorithmConfig__cipheringAlgorithm_eea2: + case CipheringAlgorithm_r12_eea2: LOG_I(RRC,"[UE %d] Security algorithm is set to eea2\n", ctxt_pP->module_id); - securityMode = SecurityAlgorithmConfig__cipheringAlgorithm_eea2; + securityMode = CipheringAlgorithm_r12_eea2; break; default: LOG_I(RRC,"[UE %d] Security algorithm is set to none\n",ctxt_pP->module_id); - securityMode = SecurityAlgorithmConfig__cipheringAlgorithm_spare1; + securityMode = CipheringAlgorithm_r12_spare1; break; } @@ -1392,49 +1670,106 @@ rrc_ue_process_securityModeCommand( ul_dcch_msg.message.choice.c1.present = UL_DCCH_MessageType__c1_PR_securityModeFailure; } + +#if defined(ENABLE_SECURITY) + uint8_t *kRRCenc = NULL; + uint8_t *kUPenc = NULL; + uint8_t *kRRCint = NULL; + pdcp_t *pdcp_p = NULL; + hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; + hashtable_rc_t h_rc; + + key = PDCP_COLL_KEY_VALUE(ctxt_pP->module_id, ctxt_pP->rnti, + ctxt_pP->enb_flag, DCCH, SRB_FLAG_YES); + h_rc = hashtable_get(pdcp_coll_p, key, (void**) &pdcp_p); + + if (h_rc == HASH_TABLE_OK) { + LOG_D(RRC, "PDCP_COLL_KEY_VALUE() returns valid key = %ld\n", key); + + LOG_D(RRC, "driving kRRCenc, kRRCint and kUPenc from KeNB=" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x\n", + UE_rrc_inst[ctxt_pP->module_id].kenb[0], UE_rrc_inst[ctxt_pP->module_id].kenb[1], UE_rrc_inst[ctxt_pP->module_id].kenb[2], UE_rrc_inst[ctxt_pP->module_id].kenb[3], + UE_rrc_inst[ctxt_pP->module_id].kenb[4], UE_rrc_inst[ctxt_pP->module_id].kenb[5], UE_rrc_inst[ctxt_pP->module_id].kenb[6], UE_rrc_inst[ctxt_pP->module_id].kenb[7], + UE_rrc_inst[ctxt_pP->module_id].kenb[8], UE_rrc_inst[ctxt_pP->module_id].kenb[9], UE_rrc_inst[ctxt_pP->module_id].kenb[10], UE_rrc_inst[ctxt_pP->module_id].kenb[11], + UE_rrc_inst[ctxt_pP->module_id].kenb[12], UE_rrc_inst[ctxt_pP->module_id].kenb[13], UE_rrc_inst[ctxt_pP->module_id].kenb[14], UE_rrc_inst[ctxt_pP->module_id].kenb[15], + UE_rrc_inst[ctxt_pP->module_id].kenb[16], UE_rrc_inst[ctxt_pP->module_id].kenb[17], UE_rrc_inst[ctxt_pP->module_id].kenb[18], UE_rrc_inst[ctxt_pP->module_id].kenb[19], + UE_rrc_inst[ctxt_pP->module_id].kenb[20], UE_rrc_inst[ctxt_pP->module_id].kenb[21], UE_rrc_inst[ctxt_pP->module_id].kenb[22], UE_rrc_inst[ctxt_pP->module_id].kenb[23], + UE_rrc_inst[ctxt_pP->module_id].kenb[24], UE_rrc_inst[ctxt_pP->module_id].kenb[25], UE_rrc_inst[ctxt_pP->module_id].kenb[26], UE_rrc_inst[ctxt_pP->module_id].kenb[27], + UE_rrc_inst[ctxt_pP->module_id].kenb[28], UE_rrc_inst[ctxt_pP->module_id].kenb[29], UE_rrc_inst[ctxt_pP->module_id].kenb[30], UE_rrc_inst[ctxt_pP->module_id].kenb[31]); + + derive_key_rrc_enc(UE_rrc_inst[ctxt_pP->module_id].ciphering_algorithm, + UE_rrc_inst[ctxt_pP->module_id].kenb, &kRRCenc); + derive_key_rrc_int(UE_rrc_inst[ctxt_pP->module_id].integrity_algorithm, + UE_rrc_inst[ctxt_pP->module_id].kenb, &kRRCint); + derive_key_up_enc(UE_rrc_inst[ctxt_pP->module_id].ciphering_algorithm, + UE_rrc_inst[ctxt_pP->module_id].kenb, &kUPenc); + + if (securityMode != 0xff) { + pdcp_config_set_security(ctxt_pP, pdcp_p, 0, 0, + UE_rrc_inst[ctxt_pP->module_id].ciphering_algorithm + | (UE_rrc_inst[ctxt_pP->module_id].integrity_algorithm << 4), + kRRCenc, kRRCint, kUPenc); + } else { + LOG_W(RRC, "skipped pdcp_config_set_security() as securityMode == 0x%02x", + securityMode); + } + } else { + LOG_W(RRC, "Could not get PDCP instance where key=0x%ld\n", key); + } + +#endif //#if defined(ENABLE_SECURITY) + if (securityModeCommand->criticalExtensions.present == SecurityModeCommand__criticalExtensions_PR_c1) { - if (securityModeCommand->criticalExtensions.choice.c1.present == SecurityModeCommand__criticalExtensions__c1_PR_securityModeCommand_r8) { - - ul_dcch_msg.message.choice.c1.choice.securityModeComplete.rrc_TransactionIdentifier = securityModeCommand->rrc_TransactionIdentifier; - ul_dcch_msg.message.choice.c1.choice.securityModeComplete.criticalExtensions.present = SecurityModeCommand__criticalExtensions_PR_c1; - ul_dcch_msg.message.choice.c1.choice.securityModeComplete.criticalExtensions.choice.securityModeComplete_r8.nonCriticalExtension =NULL; - - LOG_I(RRC,"[UE %d] Frame %d: Receiving from SRB1 (DL-DCCH), encoding securityModeComplete (eNB %d)\n", - ctxt_pP->module_id,ctxt_pP->frame,eNB_index); - - enc_rval = uper_encode_to_buffer(&asn_DEF_UL_DCCH_Message, - (void*)&ul_dcch_msg, - buffer, - 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n", - enc_rval.failed_type->name, enc_rval.encoded); - + if (securityModeCommand->criticalExtensions.choice.c1.present != SecurityModeCommand__criticalExtensions__c1_PR_securityModeCommand_r8) + LOG_W(RRC,"securityModeCommand->criticalExtensions.choice.c1.present (%d) != SecurityModeCommand__criticalExtensions__c1_PR_securityModeCommand_r8\n", + securityModeCommand->criticalExtensions.choice.c1.present); + + + ul_dcch_msg.message.choice.c1.choice.securityModeComplete.rrc_TransactionIdentifier = securityModeCommand->rrc_TransactionIdentifier; + ul_dcch_msg.message.choice.c1.choice.securityModeComplete.criticalExtensions.present = SecurityModeCommand__criticalExtensions_PR_c1; + ul_dcch_msg.message.choice.c1.choice.securityModeComplete.criticalExtensions.choice.securityModeComplete_r8.nonCriticalExtension =NULL; + + LOG_I(RRC,"[UE %d] Frame %d: Receiving from SRB1 (DL-DCCH), encoding securityModeComplete (eNB %d)\n", + ctxt_pP->module_id,ctxt_pP->frame,eNB_index); + + enc_rval = uper_encode_to_buffer(&asn_DEF_UL_DCCH_Message, + (void*)&ul_dcch_msg, + buffer, + 100); + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n", + enc_rval.failed_type->name, enc_rval.encoded); + #ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg); + xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg); #endif - + #if defined(ENABLE_ITTI) # if !defined(DISABLE_XER_SPRINT) - { - char message_string[20000]; - size_t message_string_size; - - if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_UL_DCCH_Message, (void *) &ul_dcch_msg)) > 0) { - MessageDef *msg_p; - - msg_p = itti_alloc_new_message_sized (TASK_RRC_UE, RRC_UL_DCCH, message_string_size + sizeof (IttiMsgText)); - msg_p->ittiMsg.rrc_ul_dcch.size = message_string_size; - memcpy(&msg_p->ittiMsg.rrc_ul_dcch.text, message_string, message_string_size); - - itti_send_msg_to_task(TASK_UNKNOWN, ctxt_pP->instance, msg_p); - } + { + char message_string[20000]; + size_t message_string_size; + + if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_UL_DCCH_Message, (void *) &ul_dcch_msg)) > 0) { + MessageDef *msg_p; + + msg_p = itti_alloc_new_message_sized (TASK_RRC_UE, RRC_UL_DCCH, message_string_size + sizeof (IttiMsgText)); + msg_p->ittiMsg.rrc_ul_dcch.size = message_string_size; + memcpy(&msg_p->ittiMsg.rrc_ul_dcch.text, message_string, message_string_size); + + itti_send_msg_to_task(TASK_UNKNOWN, ctxt_pP->instance, msg_p); } + } # endif #endif -#ifdef USER_MODE - LOG_D(RRC, "securityModeComplete Encoded %d bits (%d bytes)\n", enc_rval.encoded, (enc_rval.encoded+7)/8); -#endif + LOG_D(RRC, "securityModeComplete Encoded %zd bits (%zd bytes)\n", enc_rval.encoded, (enc_rval.encoded+7)/8); for (i = 0; i < (enc_rval.encoded + 7) / 8; i++) { LOG_T(RRC, "%02x.", buffer[i]); @@ -1450,7 +1785,9 @@ rrc_ue_process_securityModeCommand( buffer, PDCP_TRANSMISSION_MODE_CONTROL); } - } + + else LOG_W(RRC,"securityModeCommand->criticalExtensions.present (%d) != SecurityModeCommand__criticalExtensions_PR_c1\n", + securityModeCommand->criticalExtensions.present); } //----------------------------------------------------------------------------- @@ -1494,68 +1831,71 @@ rrc_ue_process_ueCapabilityEnquiry( // ue_CapabilityRAT_Container.ueCapabilityRAT_Container.size = UE_rrc_inst[ue_mod_idP].UECapability_size; - if (UECapabilityEnquiry->criticalExtensions.present == UECapabilityEnquiry__criticalExtensions_PR_c1) { - if (UECapabilityEnquiry->criticalExtensions.choice.c1.present == UECapabilityEnquiry__criticalExtensions__c1_PR_ueCapabilityEnquiry_r8) { - ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.present = UECapabilityInformation__criticalExtensions_PR_c1; - ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.present = - UECapabilityInformation__criticalExtensions__c1_PR_ueCapabilityInformation_r8; - ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.count - =0; - - for (i=0; icriticalExtensions.choice.c1.choice.ueCapabilityEnquiry_r8.ue_CapabilityRequest.list.count; i++) { - - if (*UECapabilityEnquiry->criticalExtensions.choice.c1.choice.ueCapabilityEnquiry_r8.ue_CapabilityRequest.list.array[i] - == RAT_Type_eutra) { - ASN_SEQUENCE_ADD( - &ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list, - &ue_CapabilityRAT_Container); - - enc_rval = uper_encode_to_buffer(&asn_DEF_UL_DCCH_Message, (void*) &ul_dcch_msg, buffer, 100); - AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n", - enc_rval.failed_type->name, enc_rval.encoded); + AssertFatal(UECapabilityEnquiry->criticalExtensions.present == UECapabilityEnquiry__criticalExtensions_PR_c1, + "UECapabilityEnquiry->criticalExtensions.present (%d) != UECapabilityEnquiry__criticalExtensions_PR_c1 (%d)\n", + UECapabilityEnquiry->criticalExtensions.present,UECapabilityEnquiry__criticalExtensions_PR_c1); + if (UECapabilityEnquiry->criticalExtensions.choice.c1.present != UECapabilityEnquiry__criticalExtensions__c1_PR_ueCapabilityEnquiry_r8) + LOG_W(RRC,"UECapabilityEnquiry->criticalExtensions.choice.c1.present (%d) != UECapabilityEnquiry__criticalExtensions__c1_PR_ueCapabilityEnquiry_r8)\n", + UECapabilityEnquiry->criticalExtensions.choice.c1.present); + + ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.present = UECapabilityInformation__criticalExtensions_PR_c1; + ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.present = + UECapabilityInformation__criticalExtensions__c1_PR_ueCapabilityInformation_r8; + ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list.count + =0; + + for (i=0; icriticalExtensions.choice.c1.choice.ueCapabilityEnquiry_r8.ue_CapabilityRequest.list.count; i++) { + + if (*UECapabilityEnquiry->criticalExtensions.choice.c1.choice.ueCapabilityEnquiry_r8.ue_CapabilityRequest.list.array[i] + == RAT_Type_eutra) { + ASN_SEQUENCE_ADD( + &ul_dcch_msg.message.choice.c1.choice.ueCapabilityInformation.criticalExtensions.choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list, + &ue_CapabilityRAT_Container); + + enc_rval = uper_encode_to_buffer(&asn_DEF_UL_DCCH_Message, (void*) &ul_dcch_msg, buffer, 100); + AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %jd)!\n", + enc_rval.failed_type->name, enc_rval.encoded); + #ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg); + xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void*)&ul_dcch_msg); #endif - + #if defined(ENABLE_ITTI) # if !defined(DISABLE_XER_SPRINT) - { - char message_string[20000]; - size_t message_string_size; - - if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_UL_DCCH_Message, (void *) &ul_dcch_msg)) > 0) { - MessageDef *msg_p; - - msg_p = itti_alloc_new_message_sized (TASK_RRC_UE, RRC_UL_DCCH, message_string_size + sizeof (IttiMsgText)); - msg_p->ittiMsg.rrc_ul_dcch.size = message_string_size; - memcpy(&msg_p->ittiMsg.rrc_ul_dcch.text, message_string, message_string_size); - - itti_send_msg_to_task(TASK_UNKNOWN, ctxt_pP->instance, msg_p); - } - } + { + char message_string[20000]; + size_t message_string_size; + + if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_UL_DCCH_Message, (void *) &ul_dcch_msg)) > 0) { + MessageDef *msg_p; + + msg_p = itti_alloc_new_message_sized (TASK_RRC_UE, RRC_UL_DCCH, message_string_size + sizeof (IttiMsgText)); + msg_p->ittiMsg.rrc_ul_dcch.size = message_string_size; + memcpy(&msg_p->ittiMsg.rrc_ul_dcch.text, message_string, message_string_size); + + itti_send_msg_to_task(TASK_UNKNOWN, ctxt_pP->instance, msg_p); + } + } # endif #endif + -#ifdef USER_MODE - LOG_D(RRC,"UECapabilityInformation Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); -#endif + LOG_D(RRC,"UECapabilityInformation Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); for (i = 0; i < (enc_rval.encoded + 7) / 8; i++) { LOG_T(RRC, "%02x.", buffer[i]); } - - LOG_T(RRC, "\n"); - rrc_data_req ( - ctxt_pP, - DCCH, - rrc_mui++, - SDU_CONFIRM_NO, - (enc_rval.encoded + 7) / 8, - buffer, - PDCP_TRANSMISSION_MODE_CONTROL); - } - } + + LOG_T(RRC, "\n"); + rrc_data_req_ue ( + ctxt_pP, + DCCH, + rrc_mui++, + SDU_CONFIRM_NO, + (enc_rval.encoded + 7) / 8, + buffer, + PDCP_TRANSMISSION_MODE_CONTROL); } } } @@ -1722,19 +2062,19 @@ rrc_ue_process_mobilityControlInfo( NULL, // key rrc encryption NULL, // key rrc integrity NULL // key encryption - #ifdef Rel10 +#if defined(Rel10) || defined(Rel14) ,NULL - #endif - ); +#endif + ,NULL); rrc_rlc_config_asn1_req(NB_eNB_INST+ue_mod_idP, frameP,0,eNB_index, NULL,// SRB_ToAddModList NULL,// DRB_ToAddModList drb2release_list // DRB_ToReleaseList - #ifdef Rel10 +#if defined(Rel10) || defined(Rel14) ,NULL - #endif - ); +#endif + ,NULL); */ @@ -1756,46 +2096,44 @@ rrc_ue_process_mobilityControlInfo( UE_rrc_inst[ue_mod_idP].DRB_config[eNB_index][0] = NULL; */ //Synchronisation to DL of target cell - LOG_D(RRC, + LOG_I(RRC, "HO: Reset PDCP and RLC for configured RBs.. \n[FRAME %05d][RRC_UE][MOD %02d][][--- MAC_CONFIG_REQ (SRB2 eNB %d) --->][MAC_UE][MOD %02d][]\n", ctxt_pP->frame, ctxt_pP->module_id, eNB_index, ctxt_pP->module_id); // Reset MAC and configure PHY - rrc_mac_config_req(ctxt_pP->module_id, - 0, - ENB_FLAG_NO, - 0, - eNB_index, - (RadioResourceConfigCommonSIB_t *)NULL, - (struct PhysicalConfigDedicated *)NULL, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, + rrc_mac_config_req_ue(ctxt_pP->module_id, + 0, + eNB_index, + (RadioResourceConfigCommonSIB_t *)NULL, + (struct PhysicalConfigDedicated *)NULL, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, #endif - (MeasObjectToAddMod_t **)NULL, - (MAC_MainConfig_t *)NULL, - 0, - (struct LogicalChannelConfig *)NULL, - (MeasGapConfig_t *)NULL, - (TDD_Config_t *)NULL, - mobilityControlInfo, - (uint8_t *)NULL, - (uint16_t *)NULL, - NULL, - NULL, - NULL, - NULL -#ifdef Rel10 - ,0, - (MBSFN_AreaInfoList_r9_t *)NULL, - (PMCH_InfoList_r9_t *)NULL + (MeasObjectToAddMod_t **)NULL, + (MAC_MainConfig_t *)NULL, + 0, + (struct LogicalChannelConfig *)NULL, + (MeasGapConfig_t *)NULL, + (TDD_Config_t *)NULL, + mobilityControlInfo, + (uint8_t *)NULL, + (uint16_t *)NULL, + NULL, + NULL, + NULL, + NULL +#if defined(Rel10) || defined(Rel14) + ,0, + (MBSFN_AreaInfoList_r9_t *)NULL, + (PMCH_InfoList_r9_t *)NULL #endif #ifdef CBA - ,0, - 0 + ,0, + 0 #endif - ); - + ); + // Re-establish PDCP for all RBs that are established // rrc_pdcp_config_req (ue_mod_idP+NB_eNB_INST, frameP, 0, CONFIG_ACTION_ADD, ue_mod_idP+DCCH); // rrc_pdcp_config_req (ue_mod_idP+NB_eNB_INST, frameP, 0, CONFIG_ACTION_ADD, ue_mod_idP+DCCH1); @@ -1949,7 +2287,7 @@ rrc_ue_decode_dcch( if (UE_rrc_inst[ctxt_pP->module_id].HandoverInfoUe.targetCellId != dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.mobilityControlInfo->targetPhysCellId) { LOG_W(RRC, - "[UE %d] Frame %d: Handover target (%d) is different from RSRP measured target (%d)..\n", + "[UE %d] Frame %d: Handover target (%ld) is different from RSRP measured target (%ld)..\n", ctxt_pP->module_id, ctxt_pP->frame, dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.mobilityControlInfo->targetPhysCellId, @@ -2138,7 +2476,7 @@ rrc_ue_decode_dcch( case DL_DCCH_MessageType__c1_PR_counterCheck: break; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) case DL_DCCH_MessageType__c1_PR_ueInformationRequest_r9: break; @@ -2153,7 +2491,9 @@ rrc_ue_decode_dcch( case DL_DCCH_MessageType__c1_PR_spare1: case DL_DCCH_MessageType__c1_PR_spare2: case DL_DCCH_MessageType__c1_PR_spare3: +#if !defined(Rel14) case DL_DCCH_MessageType__c1_PR_spare4: +#endif break; default: @@ -2306,7 +2646,7 @@ static const char* SIB2mac_ContentionResolutionTimer( long value ) } static const char* SIB2modificationPeriodCoeff( long value ) { - static char temp[4] = {0}; + static char temp[32] = {0}; if (value < 0 || value > 3) return "ERR"; @@ -2316,7 +2656,7 @@ static const char* SIB2modificationPeriodCoeff( long value ) } static const char* SIB2defaultPagingCycle( long value ) { - static char temp[6] = {0}; + static char temp[32] = {0}; if (value < 0 || value > 3) return "ERR"; @@ -2463,6 +2803,39 @@ int decode_BCCH_DLSCH_Message( return 0; } +//----------------------------------------------------------------------------- +int decode_PCCH_DLSCH_Message( + const protocol_ctxt_t* const ctxt_pP, + const uint8_t eNB_index, + uint8_t* const Sdu, + const uint8_t Sdu_len) +{ + PCCH_Message_t *pcch_message = NULL; + int i; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_PCCH, VCD_FUNCTION_IN ); + + asn_dec_rval_t dec_rval = uper_decode_complete( NULL, + &asn_DEF_PCCH_Message, + (void **)&pcch_message, + (const void *)Sdu, + Sdu_len ); + + if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) { + LOG_E( RRC, "[UE %"PRIu8"] Failed to decode PCCH_MESSAGE (%zu bits)\n", + ctxt_pP->module_id, + dec_rval.consumed ); + for (i=0;imodule_id].Info[eNB_index].SIperiod = siPeriod_int[sib1->schedulingInfoList.list.array[0]->si_Periodicity]; UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIwindowsize = siWindowLength_int[sib1->si_WindowLength]; - LOG_D( RRC, "[FRAME unknown][RRC_UE][MOD %02"PRIu8"][][--- MAC_CONFIG_REQ (SIB1 params eNB %"PRIu8") --->][MAC_UE][MOD %02"PRIu8"][]\n", + LOG_I( RRC, "[FRAME unknown][RRC_UE][MOD %02"PRIu8"][][--- MAC_CONFIG_REQ (SIB1 params eNB %"PRIu8") --->][MAC_UE][MOD %02"PRIu8"][]\n", ctxt_pP->module_id, eNB_index, ctxt_pP->module_id ); - rrc_mac_config_req(ctxt_pP->module_id, 0, ENB_FLAG_NO, 0, eNB_index, - (RadioResourceConfigCommonSIB_t *)NULL, - (struct PhysicalConfigDedicated *)NULL, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, + rrc_mac_config_req_ue(ctxt_pP->module_id, 0, eNB_index, + (RadioResourceConfigCommonSIB_t *)NULL, + (struct PhysicalConfigDedicated *)NULL, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, #endif - (MeasObjectToAddMod_t **)NULL, - (MAC_MainConfig_t *)NULL, - 0, - (struct LogicalChannelConfig *)NULL, - (MeasGapConfig_t *)NULL, - UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]->tdd_Config, - (MobilityControlInfo_t *) NULL, - &UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIwindowsize, - &UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIperiod, - NULL, - NULL, - NULL, - (MBSFN_SubframeConfigList_t *)NULL -#ifdef Rel10 - ,0, - (MBSFN_AreaInfoList_r9_t *)NULL, - (PMCH_InfoList_r9_t *)NULL + (MeasObjectToAddMod_t **)NULL, + (MAC_MainConfig_t *)NULL, + 0, + (struct LogicalChannelConfig *)NULL, + (MeasGapConfig_t *)NULL, + UE_rrc_inst[ctxt_pP->module_id].sib1[eNB_index]->tdd_Config, + (MobilityControlInfo_t *) NULL, + &UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIwindowsize, + &UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIperiod, + NULL, + NULL, + NULL, + (MBSFN_SubframeConfigList_t *)NULL +#if defined(Rel10) || defined(Rel14) + ,0, + (MBSFN_AreaInfoList_r9_t *)NULL, + (PMCH_InfoList_r9_t *)NULL + #endif #ifdef CBA - , - 0, - 0 + , + 0, + 0 #endif - ); - + ); + UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus = 1; UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIB1systemInfoValueTag = sib1->systemInfoValueTag; @@ -2831,8 +3205,13 @@ static void dump_sib2( SystemInformationBlockType2_t *sib2 ) sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_SubframeConfig ); LOG_I( RRC, "radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission : %d\n", sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission ); + + if(sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts) + { LOG_I( RRC, "radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts : %ld\n", - sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts ); + /* TODO: check that it's okay to access [0] */ + sib2->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.srs_MaxUpPts[0] ); + } } // uplinkPowerControlCommon @@ -2858,7 +3237,7 @@ static void dump_sib2( SystemInformationBlockType2_t *sib2 ) LOG_I( RRC, "radioResourceConfigCommon.ul_CyclicPrefixLength : %ld\n", sib2->radioResourceConfigCommon.ul_CyclicPrefixLength ); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) // UplinkPowerControlCommon_v1020 // ... #endif @@ -2890,7 +3269,7 @@ static void dump_sib2( SystemInformationBlockType2_t *sib2 ) LOG_I( RRC, "timeAlignmentTimerCommon : %ld\n", sib2->timeAlignmentTimerCommon ); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) if (sib2->lateNonCriticalExtension) { LOG_I( RRC, "lateNonCriticalExtension : %p\n", sib2->lateNonCriticalExtension ); @@ -3076,7 +3455,7 @@ uint64_t arfcn_to_freq(long arfcn) { else if (arfcn <45590) // Band 43 return((uint64_t)3600000000 + ((arfcn-43950)*100000)); else { - LOG_E(RRC,"Unknown EARFCN %d\n",arfcn); + LOG_E(RRC,"Unknown EARFCN %ld\n",arfcn); exit(1); } } @@ -3091,19 +3470,20 @@ static void dump_sib5( SystemInformationBlockType5_t *sib5 ) for (i=0;idl_CarrierFreq), ifcfInfo->dl_CarrierFreq); - LOG_I(RRC," Q_RXLevMin : %d\n", ifcfInfo->q_RxLevMin); - LOG_I(RRC," P_max : %d\n",ifcfInfo->p_Max); - LOG_I(RRC," T_ReselectionEUTRA : %d\n",ifcfInfo->t_ReselectionEUTRA); + LOG_I(RRC," Q_RXLevMin : %ld\n", ifcfInfo->q_RxLevMin); + if (ifcfInfo->p_Max != NULL) + LOG_I(RRC," P_max : %ld\n", *ifcfInfo->p_Max); + LOG_I(RRC," T_ReselectionEUTRA : %ld\n",ifcfInfo->t_ReselectionEUTRA); if (ifcfInfo->t_ReselectionEUTRA_SF) { - LOG_I(RRC," t_ReselectionEUTRA_SF.sf_Medium %d, t_ReselectionEUTRA_SF.sf_High %d", + LOG_I(RRC," t_ReselectionEUTRA_SF.sf_Medium %ld, t_ReselectionEUTRA_SF.sf_High %ld", ifcfInfo->t_ReselectionEUTRA_SF->sf_Medium, ifcfInfo->t_ReselectionEUTRA_SF->sf_High); } - LOG_I(RRC," threshX_High : %d\n",ifcfInfo->threshX_High); - LOG_I(RRC," threshX_Low : %d\n",ifcfInfo->threshX_Low); + LOG_I(RRC," threshX_High : %ld\n",ifcfInfo->threshX_High); + LOG_I(RRC," threshX_Low : %ld\n",ifcfInfo->threshX_Low); switch(ifcfInfo->allowedMeasBandwidth) { case AllowedMeasBandwidth_mbw6: LOG_I(RRC," AllowedMeasBandwidth : 6\n"); @@ -3129,7 +3509,7 @@ static void dump_sib5( SystemInformationBlockType5_t *sib5 ) else LOG_I(RRC," PresenceAntennaPort1 : False\n"); if (ifcfInfo->cellReselectionPriority) { - LOG_I(RRC," CellReselectionPriority : %d\n", + LOG_I(RRC," CellReselectionPriority : %ld\n", *ifcfInfo->cellReselectionPriority); } LOG_I(RRC," NeighCellConfig : "); @@ -3142,36 +3522,36 @@ static void dump_sib5( SystemInformationBlockType5_t *sib5 ) if (ifcfInfo->interFreqNeighCellList) { for (j=0;jinterFreqNeighCellList->list.count;j++) { - LOG_I(RRC," Cell %d\n"); - LOG_I(RRC," PhysCellId : %d\n",ifcfInfo->interFreqNeighCellList->list.array[j]->physCellId); - LOG_I(RRC," Q_OffsetRange : %d\n",ifcfInfo->interFreqNeighCellList->list.array[j]->q_OffsetCell); + LOG_I(RRC," Cell %d\n", j); + LOG_I(RRC," PhysCellId : %ld\n",ifcfInfo->interFreqNeighCellList->list.array[j]->physCellId); + LOG_I(RRC," Q_OffsetRange : %ld\n",ifcfInfo->interFreqNeighCellList->list.array[j]->q_OffsetCell); } } if (ifcfInfo->interFreqBlackCellList) { for (j=0;jinterFreqBlackCellList->list.count;j++) { - LOG_I(RRC," Cell %d\n"); - LOG_I(RRC," PhysCellId start: %d\n",ifcfInfo->interFreqBlackCellList->list.array[j]->start); + LOG_I(RRC," Cell %d\n", j); + LOG_I(RRC," PhysCellId start: %ld\n",ifcfInfo->interFreqBlackCellList->list.array[j]->start); if (ifcfInfo->interFreqBlackCellList->list.array[i]->range) { - LOG_I(RRC," PhysCellId Range : %d\n",ifcfInfo->interFreqBlackCellList->list.array[j]->range); + LOG_I(RRC," PhysCellId Range : %ld\n",*ifcfInfo->interFreqBlackCellList->list.array[j]->range); } } } -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) if (ifcfInfo->ext1 && ifcfInfo->ext1->q_QualMin_r9) - LOG_I(RRC," Q_QualMin_r9 : %d\n",*ifcfInfo->ext1->q_QualMin_r9); + LOG_I(RRC," Q_QualMin_r9 : %ld\n",*ifcfInfo->ext1->q_QualMin_r9); if (ifcfInfo->ext1 && ifcfInfo->ext1->threshX_Q_r9) { - LOG_I(RRC," threshX_HighQ_r9 : %d\n",ifcfInfo->ext1->threshX_Q_r9->threshX_HighQ_r9); - LOG_I(RRC," threshX_LowQ_r9: %d\n",ifcfInfo->ext1->threshX_Q_r9->threshX_LowQ_r9); + LOG_I(RRC," threshX_HighQ_r9 : %ld\n",ifcfInfo->ext1->threshX_Q_r9->threshX_HighQ_r9); + LOG_I(RRC," threshX_LowQ_r9: %ld\n",ifcfInfo->ext1->threshX_Q_r9->threshX_LowQ_r9); } #endif } } -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) static void dump_sib13( SystemInformationBlockType13_r9_t *sib13 ) { LOG_I( RRC, "[UE] Dumping SIB13\n" ); @@ -3216,37 +3596,39 @@ static int decode_SI( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_in dump_sib2( UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index] ); LOG_I( RRC, "[FRAME %05"PRIu32"][RRC_UE][MOD %02"PRIu8"][][--- MAC_CONFIG_REQ (SIB2 params eNB %"PRIu8") --->][MAC_UE][MOD %02"PRIu8"][]\n", ctxt_pP->frame, ctxt_pP->module_id, eNB_index, ctxt_pP->module_id ); - rrc_mac_config_req(ctxt_pP->module_id, 0, ENB_FLAG_NO, 0, eNB_index, - &UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->radioResourceConfigCommon, - (struct PhysicalConfigDedicated *)NULL, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, + + rrc_mac_config_req_ue(ctxt_pP->module_id, 0, eNB_index, + &UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->radioResourceConfigCommon, + (struct PhysicalConfigDedicated *)NULL, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, #endif - (MeasObjectToAddMod_t **)NULL, - (MAC_MainConfig_t *)NULL, - 0, - (struct LogicalChannelConfig *)NULL, - (MeasGapConfig_t *)NULL, - (TDD_Config_t *)NULL, - (MobilityControlInfo_t *)NULL, - NULL, - NULL, - UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.ul_CarrierFreq, - UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.ul_Bandwidth, - &UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.additionalSpectrumEmission, - UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->mbsfn_SubframeConfigList -#ifdef Rel10 - ,0, - (MBSFN_AreaInfoList_r9_t *)NULL, - (PMCH_InfoList_r9_t *)NULL + (MeasObjectToAddMod_t **)NULL, + (MAC_MainConfig_t *)NULL, + 0, + (struct LogicalChannelConfig *)NULL, + (MeasGapConfig_t *)NULL, + (TDD_Config_t *)NULL, + (MobilityControlInfo_t *)NULL, + NULL, + NULL, + UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.ul_CarrierFreq, + UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.ul_Bandwidth, + &UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->freqInfo.additionalSpectrumEmission, + UE_rrc_inst[ctxt_pP->module_id].sib2[eNB_index]->mbsfn_SubframeConfigList +#if defined(Rel10) || defined(Rel14) + ,0, + (MBSFN_AreaInfoList_r9_t *)NULL, + (PMCH_InfoList_r9_t *)NULL + #endif #ifdef CBA - ,0, - 0 + ,0, + 0 #endif - ); + ); // After SI is received, prepare RRCConnectionRequest -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) if (UE_rrc_inst[ctxt_pP->module_id].MBMS_flag < 3) // see -Q option #endif @@ -3377,7 +3759,7 @@ static int decode_SI( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_in } break; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib12_v920: if ((UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].SIStatus&2048) == 0) { @@ -3397,33 +3779,33 @@ static int decode_SI( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_in LOG_I( RRC, "[UE %"PRIu8"] Frame %"PRIu32" Found SIB13 from eNB %"PRIu8"\n", ctxt_pP->module_id, ctxt_pP->frame, eNB_index ); dump_sib13( UE_rrc_inst[ctxt_pP->module_id].sib13[eNB_index] ); // adding here function to store necessary parameters for using in decode_MCCH_Message + maybe transfer to PHY layer - LOG_D( RRC, "[FRAME %05"PRIu32"][RRC_UE][MOD %02"PRIu8"][][--- MAC_CONFIG_REQ (SIB13 params eNB %"PRIu8") --->][MAC_UE][MOD %02"PRIu8"][]\n", + LOG_I( RRC, "[FRAME %05"PRIu32"][RRC_UE][MOD %02"PRIu8"][][--- MAC_CONFIG_REQ (SIB13 params eNB %"PRIu8") --->][MAC_UE][MOD %02"PRIu8"][]\n", ctxt_pP->frame, ctxt_pP->module_id, eNB_index, ctxt_pP->module_id); - rrc_mac_config_req(ctxt_pP->module_id,0,ENB_FLAG_NO,0,eNB_index, - (RadioResourceConfigCommonSIB_t *)NULL, - (struct PhysicalConfigDedicated *)NULL, - (SCellToAddMod_r10_t *)NULL, - (MeasObjectToAddMod_t **)NULL, - (MAC_MainConfig_t *)NULL, - 0, - (struct LogicalChannelConfig *)NULL, - (MeasGapConfig_t *)NULL, - (TDD_Config_t *)NULL, - (MobilityControlInfo_t *)NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - (MBSFN_SubframeConfigList_t *)NULL, - 0, - &UE_rrc_inst[ctxt_pP->module_id].sib13[eNB_index]->mbsfn_AreaInfoList_r9, - (PMCH_InfoList_r9_t *)NULL + rrc_mac_config_req_ue(ctxt_pP->module_id,0,eNB_index, + (RadioResourceConfigCommonSIB_t *)NULL, + (struct PhysicalConfigDedicated *)NULL, + (SCellToAddMod_r10_t *)NULL, + (MeasObjectToAddMod_t **)NULL, + (MAC_MainConfig_t *)NULL, + 0, + (struct LogicalChannelConfig *)NULL, + (MeasGapConfig_t *)NULL, + (TDD_Config_t *)NULL, + (MobilityControlInfo_t *)NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + (MBSFN_SubframeConfigList_t *)NULL, + 0, + &UE_rrc_inst[ctxt_pP->module_id].sib13[eNB_index]->mbsfn_AreaInfoList_r9, + (PMCH_InfoList_r9_t *)NULL #ifdef CBA - ,0, - 0 + ,0, + 0 #endif - ); + ); break; } #endif @@ -3460,31 +3842,26 @@ void ue_meas_filtering( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_ if(UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[0] != NULL) { // Only consider 1 serving cell (index: 0) if (UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[0]->quantityConfigEUTRA != NULL) { if(UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[0]->quantityConfigEUTRA->filterCoefficientRSRP != NULL) { - for (eNB_offset = 0; eNB_offset<1+mac_xface->get_n_adj_cells(ctxt_pP->module_id,0); eNB_offset++) { - //filter_factor = 1/power(2,*UE_rrc_inst[ue_mod_idP].QuantityConfig[0]->quantityConfigEUTRA->filterCoefficientRSRP/4); - // LOG_N(RRC,"[UE %d] Frame %d : check proper operation in abstraction mode rsrp (%d), rx gain (%d) N_RB_DL (%d)\n", - // ue_mod_idP,frameP,mac_xface->get_RSRP(ue_mod_idP,0,eNB_offset),mac_xface->get_rx_total_gain_dB(ue_mod_idP,0),mac_xface->lte_frame_parms->N_RB_DL); - UE_rrc_inst[ctxt_pP->module_id].rsrp_db[eNB_offset] = - (dB_fixed_times10(mac_xface->get_RSRP(ctxt_pP->module_id,0,eNB_offset))/10.0) - - mac_xface->get_rx_total_gain_dB(ctxt_pP->module_id,0) - - dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12); + for (eNB_offset = 0; eNB_offset<1+get_n_adj_cells(ctxt_pP->module_id,0); eNB_offset++) { + UE_rrc_inst[ctxt_pP->module_id].rsrp_db[eNB_offset] = get_RSRP(ctxt_pP->module_id,0,eNB_offset); + /* + (dB_fixed_times10(get_RSRP(ctxt_pP->module_id,0,eNB_offset))/10.0) - + get_rx_total_gain_dB(ctxt_pP->module_id,0) - + get_bw_gain_dB(ctxt_pP->module_id); + */ UE_rrc_inst[ctxt_pP->module_id].rsrp_db_filtered[eNB_offset] = (1.0-a)*UE_rrc_inst[ctxt_pP->module_id].rsrp_db_filtered[eNB_offset] + a*UE_rrc_inst[ctxt_pP->module_id].rsrp_db[eNB_offset]; - //mac_xface->set_RSRP_filtered(ue_mod_idP,eNB_offset,UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset]); - - //LOG_D(RRC,"RSRP_total_dB: %3.2f \n",(dB_fixed_times10(mac_xface->get_RSRP(ue_mod_idP,0,eNB_offset))/10.0)-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0)-dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12)); - - LOG_D(RRC,"RSRP_dBm: %3.2f \n",(dB_fixed_times10(mac_xface->get_RSRP(ctxt_pP->module_id,0,eNB_offset))/10.0)); - LOG_D(RRC,"gain_loss_dB: %d \n",mac_xface->get_rx_total_gain_dB(ctxt_pP->module_id,0)); - LOG_D(RRC,"gain_fixed_dB: %d \n",dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12)); + LOG_D(RRC,"RSRP_dBm: %3.2f \n",get_RSRP(ctxt_pP->module_id,0,eNB_offset));; + /* LOG_D(RRC,"gain_loss_dB: %d \n",get_rx_total_gain_dB(ctxt_pP->module_id,0)); + LOG_D(RRC,"gain_fixed_dB: %d \n",dB_fixed(frame_parms->N_RB_DL*12));*/ LOG_D(PHY,"[UE %d] Frame %d, RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB)\n", ctxt_pP->module_id, ctxt_pP->frame, - 10*log10(mac_xface->get_RSSI(ctxt_pP->module_id,0))-mac_xface->get_rx_total_gain_dB(ctxt_pP->module_id,0), - 10*log10(mac_xface->get_RSSI(ctxt_pP->module_id,0))); - LOG_D(RRC,"[UE %d] Frame %d: Meas RSRP: eNB_offset: %d rsrp_coef: %3.1f filter_coef: %d before L3 filtering: rsrp: %3.1f after L3 filtering: rsrp: %3.1f \n ", + 10*log10(get_RSSI(ctxt_pP->module_id,0))-get_rx_total_gain_dB(ctxt_pP->module_id,0), + 10*log10(get_RSSI(ctxt_pP->module_id,0))); + LOG_D(RRC,"[UE %d] Frame %d: Meas RSRP: eNB_offset: %d rsrp_coef: %3.1f filter_coef: %ld before L3 filtering: rsrp: %3.1f after L3 filtering: rsrp: %3.1f \n ", ctxt_pP->module_id, ctxt_pP->frame, eNB_offset,a, *UE_rrc_inst->QuantityConfig[0]->quantityConfigEUTRA->filterCoefficientRSRP, @@ -3493,34 +3870,22 @@ void ue_meas_filtering( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_ } } } else { - for (eNB_offset = 0; eNB_offset<1+mac_xface->get_n_adj_cells(ctxt_pP->module_id,0); eNB_offset++) { - UE_rrc_inst[ctxt_pP->module_id].rsrp_db_filtered[eNB_offset]= mac_xface->get_RSRP(ctxt_pP->module_id,0,eNB_offset); - // phy_vars_ue->PHY_measurements.rsrp_filtered[eNB_offset]=UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset]; - //mac_xface->set_RSRP_filtered(ue_mod_idP,eNB_offset,UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset]); + for (eNB_offset = 0; eNB_offset<1+get_n_adj_cells(ctxt_pP->module_id,0); eNB_offset++) { + UE_rrc_inst[ctxt_pP->module_id].rsrp_db_filtered[eNB_offset]= get_RSRP(ctxt_pP->module_id,0,eNB_offset); } } if (UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[0]->quantityConfigEUTRA != NULL) { if(UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[0]->quantityConfigEUTRA->filterCoefficientRSRQ != NULL) { - for (eNB_offset = 0; eNB_offset<1+mac_xface->get_n_adj_cells(ctxt_pP->module_id,0); eNB_offset++) { - // LOG_N(RRC,"[UE %d] Frame %d : check if this operation workes properly in abstraction mode\n",ue_mod_idP,frameP); - UE_rrc_inst[ctxt_pP->module_id].rsrq_db[eNB_offset] = (10*log10(mac_xface->get_RSRQ(ctxt_pP->module_id,0,eNB_offset)))-20; + for (eNB_offset = 0; eNB_offset<1+get_n_adj_cells(ctxt_pP->module_id,0); eNB_offset++) { + UE_rrc_inst[ctxt_pP->module_id].rsrq_db[eNB_offset] = (10*log10(get_RSRQ(ctxt_pP->module_id,0,eNB_offset)))-20; UE_rrc_inst[ctxt_pP->module_id].rsrq_db_filtered[eNB_offset]=(1-a1)*UE_rrc_inst[ctxt_pP->module_id].rsrq_db_filtered[eNB_offset] + a1 *UE_rrc_inst[ctxt_pP->module_id].rsrq_db[eNB_offset]; - //mac_xface->set_RSRP_filtered(ue_mod_idP,eNB_offset,UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_offset]); - /* - LOG_D(RRC,"[UE %d] Frame %d: Meas RSRQ: eNB_offset: %d rsrq_coef: %3.2f filter_coef: %d before L3 filtering: rsrq: %3.1f after L3 filtering: rsrq: %3.1f \n ", - ue_mod_idP,frameP,eNB_offset,a1, - *UE_rrc_inst->QuantityConfig[0]->quantityConfigEUTRA->filterCoefficientRSRQ, - mac_xface->get_RSRQ(ue_mod_idP,0,eNB_offset), - UE_rrc_inst[ue_mod_idP].rsrq_db[eNB_offset], - UE_rrc_inst[ue_mod_idP].rsrq_db_filtered[eNB_offset]); - */ } } } else { - for (eNB_offset = 0; eNB_offset<1+mac_xface->get_n_adj_cells(ctxt_pP->module_id,0); eNB_offset++) { - UE_rrc_inst[ctxt_pP->module_id].rsrq_db_filtered[eNB_offset]= mac_xface->get_RSRQ(ctxt_pP->module_id,0,eNB_offset); + for (eNB_offset = 0; eNB_offset<1+get_n_adj_cells(ctxt_pP->module_id,0); eNB_offset++) { + UE_rrc_inst[ctxt_pP->module_id].rsrq_db_filtered[eNB_offset]= get_RSRQ(ctxt_pP->module_id,0,eNB_offset); } } } @@ -3528,7 +3893,7 @@ void ue_meas_filtering( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_ //Below routine implements Measurement Reporting procedure from 36.331 Section 5.5.5 //----------------------------------------------------------------------------- -static void rrc_ue_generate_MeasurementReport( const protocol_ctxt_t* const ctxt_pP, uint8_t eNB_index ) +static void rrc_ue_generate_MeasurementReport(protocol_ctxt_t* const ctxt_pP, uint8_t eNB_index ) { uint8_t buffer[32], size; @@ -3584,7 +3949,7 @@ static void rrc_ue_generate_MeasurementReport( const protocol_ctxt_t* const ctxt if (pframe!=ctxt_pP->frame) { pframe=ctxt_pP->frame; - LOG_D(RRC, "[UE %d] Frame %d: doing MeasReport: servingCell(%d) targetCell(%d) rsrp_s(%ld) rsrq_s(%ld) rsrp_t(%ld) rsrq_t(%ld) \n", + LOG_D(RRC, "[UE %d] Frame %d: doing MeasReport: servingCell(%ld) targetCell(%ld) rsrp_s(%ld) rsrq_s(%ld) rsrp_t(%ld) rsrq_t(%ld) \n", ctxt_pP->module_id, ctxt_pP->frame, cellId, @@ -3609,7 +3974,7 @@ static void rrc_ue_generate_MeasurementReport( const protocol_ctxt_t* const ctxt // Measurement report triggering, described in 36.331 Section 5.5.4.1: called periodically //----------------------------------------------------------------------------- -void ue_measurement_report_triggering( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index ) +void ue_measurement_report_triggering(protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index ) { uint8_t i,j; Hysteresis_t hys; @@ -3721,6 +4086,7 @@ void ue_measurement_report_triggering( const protocol_ctxt_t* const ctxt_pP, con //check_trigger_meas_event(ue_mod_idP, frameP, eNB_index, i,j,ofn,ocn,hys,ofs,ocs,a3_offset,ttt_ms) //----------------------------------------------------------------------------- + static uint8_t check_trigger_meas_event( module_id_t ue_mod_idP, frame_t frameP, @@ -3736,16 +4102,15 @@ static uint8_t check_trigger_meas_event( TimeToTrigger_t ttt ) { uint8_t eNB_offset; - uint8_t currentCellIndex = mac_xface->lte_frame_parms->Nid_cell; + // uint8_t currentCellIndex = frame_parms->Nid_cell; uint8_t tmp_offset; - LOG_I(RRC,"[UE %d] ofn(%d) ocn(%d) hys(%d) ofs(%d) ocs(%d) a3_offset(%d) ttt(%d) rssi %3.1f\n", + LOG_I(RRC,"[UE %d] ofn(%ld) ocn(%ld) hys(%ld) ofs(%ld) ocs(%ld) a3_offset(%ld) ttt(%ld) rssi %3.1f\n", ue_mod_idP, ofn,ocn,hys,ofs,ocs,a3_offset,ttt, - 10*log10(mac_xface->get_RSSI(ue_mod_idP,0))-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0)); + 10*log10(get_RSSI(ue_mod_idP,0))-get_rx_total_gain_dB(ue_mod_idP,0)); - for (eNB_offset = 0; eNB_offset<1+mac_xface->get_n_adj_cells(ue_mod_idP,0); eNB_offset++) { - //for (eNB_offset = 1;(eNB_offset<1+mac_xface->get_n_adj_cells(ue_mod_idP,0));eNB_offset++) { + for (eNB_offset = 0; eNB_offset<1+get_n_adj_cells(ue_mod_idP,0); eNB_offset++) { /* RHS: Verify that idx 0 corresponds to currentCellIndex in rsrp array */ if((eNB_offset!=eNB_index)&&(eNB_offset UE_rrc_inst[ue_mod_idP].rsrp_db_filtered[eNB_index]+ofs+ocs-1/*+a3_offset*/) { UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset] += 2; //Called every subframe = 2ms LOG_D(RRC,"[UE %d] Frame %d: Entry measTimer[%d][%d][%d]: %d currentCell: %d betterCell: %d \n", - ue_mod_idP, frameP, ue_cnx_index,meas_index,tmp_offset,UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset],currentCellIndex,eNB_offset); + ue_mod_idP, frameP, ue_cnx_index,meas_index,tmp_offset,UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset],0,eNB_offset); } else { UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset] = 0; //Exit condition: Resetting the measurement timer LOG_D(RRC,"[UE %d] Frame %d: Exit measTimer[%d][%d][%d]: %d currentCell: %d betterCell: %d \n", - ue_mod_idP, frameP, ue_cnx_index,meas_index,tmp_offset,UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset],currentCellIndex,eNB_offset); + ue_mod_idP, frameP, ue_cnx_index,meas_index,tmp_offset,UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset],0,eNB_offset); } if (UE_rrc_inst->measTimer[ue_cnx_index][meas_index][tmp_offset] >= ttt) { UE_rrc_inst->HandoverInfoUe.targetCellId = get_adjacent_cell_id(ue_mod_idP,tmp_offset); //WARNING!!!...check this! - LOG_D(RRC,"[UE %d] Frame %d eNB %d: Handover triggered: targetCellId: %d currentCellId: %d eNB_offset: %d rsrp source: %3.1f rsrp target: %3.1f\n", \ + LOG_D(RRC,"[UE %d] Frame %d eNB %d: Handover triggered: targetCellId: %ld currentCellId: %d eNB_offset: %d rsrp source: %3.1f rsrp target: %3.1f\n", ue_mod_idP, frameP, eNB_index, UE_rrc_inst->HandoverInfoUe.targetCellId,ue_cnx_index,eNB_offset, - (dB_fixed_times10(UE_rrc_inst[ue_mod_idP].rsrp_db[0])/10.0)-mac_xface->get_rx_total_gain_dB(ue_mod_idP,0)-dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12), - (dB_fixed_times10(UE_rrc_inst[ue_mod_idP].rsrp_db[eNB_offset])/10.0)-mac_xface->get_rx_total_gain_dB(ue_mod_idP, - 0)-dB_fixed(mac_xface->lte_frame_parms->N_RB_DL*12)); + get_RSRP(ue_mod_idP,0,0), + get_RSRP(ue_mod_idP,0,1)); UE_rrc_inst->Info[0].handoverTarget = eNB_offset; //LOG_D(RRC,"PHY_ID: %d \n",UE_rrc_inst->HandoverInfoUe.targetCellId); return 1; @@ -3786,7 +4150,7 @@ static uint8_t check_trigger_meas_event( return 0; } -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) //----------------------------------------------------------------------------- int decode_MCCH_Message( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index, const uint8_t* const Sdu, const uint8_t Sdu_len, const uint8_t mbsfn_sync_area ) { @@ -3810,7 +4174,7 @@ int decode_MCCH_Message( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB Sdu_len); if ((dec_rval.code != RC_OK) && (dec_rval.consumed==0)) { - LOG_E(RRC,"[UE %d] Failed to decode MCCH__MESSAGE (%d bits)\n", + LOG_E(RRC,"[UE %d] Failed to decode MCCH__MESSAGE (%lu bits)\n", ctxt_pP->module_id, dec_rval.consumed); //free the memory @@ -3854,42 +4218,44 @@ static void decode_MBSFNAreaConfiguration( module_id_t ue_mod_idP, uint8_t eNB_i { protocol_ctxt_t ctxt; - LOG_D(RRC,"[UE %d] Frame %d : Number of MCH(s) in the MBSFN Sync Area %d is %d\n", + LOG_I(RRC,"[UE %d] Frame %d : Number of MCH(s) in the MBSFN Sync Area %d is %d\n", ue_mod_idP, frameP, mbsfn_sync_area, UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->pmch_InfoList_r9.list.count); // store to MAC/PHY necessary parameters for receiving MTCHs - rrc_mac_config_req(ue_mod_idP,0,ENB_FLAG_NO,0,eNB_index, - (RadioResourceConfigCommonSIB_t *)NULL, - (struct PhysicalConfigDedicated *)NULL, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, + + rrc_mac_config_req_ue(ue_mod_idP,0,eNB_index, + (RadioResourceConfigCommonSIB_t *)NULL, + (struct PhysicalConfigDedicated *)NULL, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, #endif - (MeasObjectToAddMod_t **)NULL, - (MAC_MainConfig_t *)NULL, - 0, - (struct LogicalChannelConfig *)NULL, - (MeasGapConfig_t *)NULL, - (TDD_Config_t *)NULL, - (MobilityControlInfo_t *)NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - (MBSFN_SubframeConfigList_t *)NULL -#ifdef Rel10 - , - 0, - (MBSFN_AreaInfoList_r9_t *)NULL, - &UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->pmch_InfoList_r9 + (MeasObjectToAddMod_t **)NULL, + (MAC_MainConfig_t *)NULL, + 0, + (struct LogicalChannelConfig *)NULL, + (MeasGapConfig_t *)NULL, + (TDD_Config_t *)NULL, + (MobilityControlInfo_t *)NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + (MBSFN_SubframeConfigList_t *)NULL +#if defined(Rel10) || defined(Rel14) + , + 0, + (MBSFN_AreaInfoList_r9_t *)NULL, + &UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->pmch_InfoList_r9 + #endif #ifdef CBA - , - 0, - 0 + , + 0, + 0 #endif - ); - + ); + UE_rrc_inst[ue_mod_idP].Info[eNB_index].MCCHStatus[mbsfn_sync_area] = 1; PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_idP, ENB_FLAG_NO, UE_rrc_inst[ue_mod_idP].Info[eNB_index].rnti, frameP, 0,eNB_index); @@ -3903,16 +4269,16 @@ static void decode_MBSFNAreaConfiguration( module_id_t ue_mod_idP, uint8_t eNB_i NULL, // key rrc encryption NULL, // key rrc integrity NULL // key encryption -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) ,&(UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->pmch_InfoList_r9) #endif - ); + ,NULL); rrc_rlc_config_asn1_req(&ctxt, NULL,// SRB_ToAddModList NULL,// DRB_ToAddModList NULL,// DRB_ToReleaseList -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) &(UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->pmch_InfoList_r9) #endif ); @@ -3922,10 +4288,6 @@ static void decode_MBSFNAreaConfiguration( module_id_t ue_mod_idP, uint8_t eNB_i #endif // rel10 -#ifndef USER_MODE -EXPORT_SYMBOL(Rlc_info_am_config); -#endif - #if defined(ENABLE_ITTI) //----------------------------------------------------------------------------- void *rrc_ue_task( void *args_p ) @@ -4019,7 +4381,7 @@ void *rrc_ue_task( void *args_p ) RRC_MAC_CCCH_DATA_IND (msg_p).enb_index); break; -# ifdef Rel10 +# if defined(Rel10) || defined(Rel14) case RRC_MAC_MCCH_DATA_IND: LOG_D(RRC, "[UE %d] Received %s: frameP %d, eNB %d, mbsfn SA %d\n", ue_mod_id, msg_name, @@ -4063,12 +4425,41 @@ void *rrc_ue_task( void *args_p ) # if defined(ENABLE_USE_MME) + case NAS_KENB_REFRESH_REQ: + memcpy((void*)UE_rrc_inst[ue_mod_id].kenb, (void*)NAS_KENB_REFRESH_REQ(msg_p).kenb, sizeof(UE_rrc_inst[ue_mod_id].kenb)); + + LOG_D(RRC, "[UE %d] Received %s: refreshed RRC::KeNB = " + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x\n", + ue_mod_id, msg_name, + UE_rrc_inst[ue_mod_id].kenb[0], UE_rrc_inst[ue_mod_id].kenb[1], UE_rrc_inst[ue_mod_id].kenb[2], UE_rrc_inst[ue_mod_id].kenb[3], + UE_rrc_inst[ue_mod_id].kenb[4], UE_rrc_inst[ue_mod_id].kenb[5], UE_rrc_inst[ue_mod_id].kenb[6], UE_rrc_inst[ue_mod_id].kenb[7], + UE_rrc_inst[ue_mod_id].kenb[8], UE_rrc_inst[ue_mod_id].kenb[9], UE_rrc_inst[ue_mod_id].kenb[10], UE_rrc_inst[ue_mod_id].kenb[11], + UE_rrc_inst[ue_mod_id].kenb[12], UE_rrc_inst[ue_mod_id].kenb[13], UE_rrc_inst[ue_mod_id].kenb[14], UE_rrc_inst[ue_mod_id].kenb[15], + UE_rrc_inst[ue_mod_id].kenb[16], UE_rrc_inst[ue_mod_id].kenb[17], UE_rrc_inst[ue_mod_id].kenb[18], UE_rrc_inst[ue_mod_id].kenb[19], + UE_rrc_inst[ue_mod_id].kenb[20], UE_rrc_inst[ue_mod_id].kenb[21], UE_rrc_inst[ue_mod_id].kenb[22], UE_rrc_inst[ue_mod_id].kenb[23], + UE_rrc_inst[ue_mod_id].kenb[24], UE_rrc_inst[ue_mod_id].kenb[25], UE_rrc_inst[ue_mod_id].kenb[26], UE_rrc_inst[ue_mod_id].kenb[27], + UE_rrc_inst[ue_mod_id].kenb[28], UE_rrc_inst[ue_mod_id].kenb[29], UE_rrc_inst[ue_mod_id].kenb[30], UE_rrc_inst[ue_mod_id].kenb[31]); + + break; + /* NAS messages */ case NAS_CELL_SELECTION_REQ: - ue_mod_id = 0; /* TODO force ue_mod_id to first UE, NAS UE not virtualized yet */ - LOG_D(RRC, "[UE %d] Received %s: state %d, plmnID %d, rat %x\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id), - NAS_CELL_SELECTION_REQ (msg_p).plmnID, NAS_CELL_SELECTION_REQ (msg_p).rat); + LOG_D(RRC, "[UE %d] Received %s: state %d, plmnID (%d%d%d.%d%d%d), rat %x\n", ue_mod_id, msg_name, rrc_get_state(ue_mod_id), + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MCCdigit1, + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MCCdigit2, + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MCCdigit3, + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MNCdigit1, + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MNCdigit2, + NAS_CELL_SELECTION_REQ (msg_p).plmnID.MNCdigit3, + NAS_CELL_SELECTION_REQ (msg_p).rat); if (rrc_get_state(ue_mod_id) == RRC_STATE_INACTIVE) { // have a look at MAC/main.c void dl_phy_sync_success(...) @@ -4131,8 +4522,16 @@ void *rrc_ue_task( void *args_p ) break; case NAS_CONN_ESTABLI_REQ: - LOG_D(RRC, "[UE %d] Received %s: cause %d, type %d, s_tmsi %d, plmnID %d\n", ue_mod_id, msg_name, NAS_CONN_ESTABLI_REQ (msg_p).cause, - NAS_CONN_ESTABLI_REQ (msg_p).type, NAS_CONN_ESTABLI_REQ (msg_p).s_tmsi, NAS_CONN_ESTABLI_REQ (msg_p).plmnID); + LOG_D(RRC, "[UE %d] Received %s: cause %d, type %d, s_tmsi (mme code %"PRIu8", m-tmsi %"PRIu32"), plmnID (%d%d%d.%d%d%d)\n", ue_mod_id, msg_name, NAS_CONN_ESTABLI_REQ (msg_p).cause, + NAS_CONN_ESTABLI_REQ (msg_p).type, + NAS_CONN_ESTABLI_REQ (msg_p).s_tmsi.MMEcode, + NAS_CONN_ESTABLI_REQ (msg_p).s_tmsi.m_tmsi, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MCCdigit1, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MCCdigit2, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MCCdigit3, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MNCdigit1, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MNCdigit2, + NAS_CONN_ESTABLI_REQ (msg_p).plmnID.MNCdigit3); //PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_NO, NOT_A_RNTI, 0, 0); PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, ENB_FLAG_NO, NOT_A_RNTI, 0, 0, 0); @@ -4175,12 +4574,26 @@ void *rrc_ue_task( void *args_p ) /* Transfer data to PDCP */ PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, ue_mod_id, ENB_FLAG_NO, UE_rrc_inst[ue_mod_id].Info[0].rnti, 0, 0,0); - rrc_data_req (&ctxt, - DCCH, - rrc_mui++, - SDU_CONFIRM_NO, - length, buffer, - PDCP_TRANSMISSION_MODE_CONTROL); + + // check if SRB2 is created, if yes request data_req on DCCH1 (SRB2) + if(UE_rrc_inst[ue_mod_id].SRB2_config[0] == NULL) + { + rrc_data_req_ue (&ctxt, + DCCH, + rrc_mui++, + SDU_CONFIRM_NO, + length, buffer, + PDCP_TRANSMISSION_MODE_CONTROL); + } + else + { + rrc_data_req_ue (&ctxt, + DCCH1, + rrc_mui++, + SDU_CONFIRM_NO, + length, buffer, + PDCP_TRANSMISSION_MODE_CONTROL); + } break; } @@ -4338,7 +4751,6 @@ void *rrc_ue_task( void *args_p ) break; case RRC_RAL_CONNECTION_RELEASE_REQ: - ue_mod_id = 0; /* TODO force ue_mod_id to first UE, NAS UE not virtualized yet */ LOG_D(RRC, "[UE %d] Received %s\n", ue_mod_id, msg_name); break; #endif @@ -4355,3 +4767,184 @@ void *rrc_ue_task( void *args_p ) } } #endif + + + +/*------------------------------------------------------------------------------*/ +void +openair_rrc_top_init_ue( + int eMBMS_active, + char* uecap_xer, + uint8_t cba_group_active, + uint8_t HO_active +) +//----------------------------------------------------------------------------- +{ + + module_id_t module_id; + OAI_UECapability_t *UECap = NULL; + int CC_id; + + /* for no gcc warnings */ + (void)CC_id; + + LOG_D(RRC, "[OPENAIR][INIT] Init function start: NB_UE_INST=%d, NB_eNB_INST=%d\n", NB_UE_INST, NB_eNB_INST); + + if (NB_UE_INST > 0) { + UE_rrc_inst = (UE_RRC_INST*) malloc16(NB_UE_INST*sizeof(UE_RRC_INST)); + memset (UE_rrc_inst, 0, NB_UE_INST * sizeof(UE_RRC_INST)); + LOG_D(RRC, "ALLOCATE %d Bytes for UE_RRC_INST @ %p\n", (unsigned int)(NB_UE_INST*sizeof(UE_RRC_INST)), UE_rrc_inst); + + // fill UE capability + UECap = fill_ue_capability (uecap_xer); + + for (module_id = 0; module_id < NB_UE_INST; module_id++) { + UE_rrc_inst[module_id].UECap = UECap; + UE_rrc_inst[module_id].UECapability = UECap->sdu; + UE_rrc_inst[module_id].UECapability_size = UECap->sdu_size; + } + +#if defined(Rel10) || defined(Rel14) + LOG_I(RRC,"[UE] eMBMS active state is %d \n", eMBMS_active); + + for (module_id=0; module_id 0) free (UE_rrc_inst); + + +} + + +//----------------------------------------------------------------------------- +RRC_status_t +rrc_rx_tx_ue( + protocol_ctxt_t* const ctxt_pP, + const uint8_t enb_indexP, + const int CC_id +) +//----------------------------------------------------------------------------- +{ + //uint8_t UE_id; + int32_t current_timestamp_ms, ref_timestamp_ms; + struct timeval ts; + struct rrc_eNB_ue_context_s *ue_context_p = NULL,*ue_to_be_removed = NULL; + +#ifdef LOCALIZATION + double estimated_distance; + protocol_ctxt_t ctxt; +#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_IN); + + // check timers + + if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_active == 1) { + if ((UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_cnt % 10) == 0) + LOG_D(RRC, + "[UE %d][RAPROC] Frame %d T300 Count %d ms\n", ctxt_pP->module_id, ctxt_pP->frame, UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_cnt); + + if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_cnt + == T300[UE_rrc_inst[ctxt_pP->module_id].sib2[enb_indexP]->ue_TimersAndConstants.t300]) { + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_active = 0; + // ALLOW CCCH to be used + UE_rrc_inst[ctxt_pP->module_id].Srb0[enb_indexP].Tx_buffer.payload_size = 0; + rrc_ue_generate_RRCConnectionRequest (ctxt_pP, enb_indexP); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); + return (RRC_ConnSetup_failed); + } + + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_cnt++; + } + + if ((UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].SIStatus&2)>0) { + if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].N310_cnt + == N310[UE_rrc_inst[ctxt_pP->module_id].sib2[enb_indexP]->ue_TimersAndConstants.n310]) { + LOG_I(RRC,"Activating T310\n"); + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_active = 1; + } + } else { // in case we have not received SIB2 yet + /* if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].N310_cnt == 100) { + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].N310_cnt = 0; + + }*/ + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); + return RRC_OK; + } + + if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_active == 1) { + if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].N311_cnt + == N311[UE_rrc_inst[ctxt_pP->module_id].sib2[enb_indexP]->ue_TimersAndConstants.n311]) { + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_active = 0; + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].N311_cnt = 0; + } + + if ((UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_cnt % 10) == 0) { + LOG_D(RRC, "[UE %d] Frame %d T310 Count %d ms\n", ctxt_pP->module_id, ctxt_pP->frame, UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_cnt); + } + + if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_cnt == T310[UE_rrc_inst[ctxt_pP->module_id].sib2[enb_indexP]->ue_TimersAndConstants.t310]) { + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_active = 0; + rrc_t310_expiration (ctxt_pP, enb_indexP); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); + LOG_I(RRC,"Returning RRC_PHY_RESYNCH: T310 expired\n"); + return RRC_PHY_RESYNCH; + } + + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_cnt++; + } + + if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_active==1) { + if ((UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_cnt % 10) == 0) + LOG_D(RRC,"[UE %d][RAPROC] Frame %d T304 Count %d ms\n",ctxt_pP->module_id,ctxt_pP->frame, + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_cnt); + + if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_cnt == 0) { + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_active = 0; + UE_rrc_inst[ctxt_pP->module_id].HandoverInfoUe.measFlag = 1; + LOG_E(RRC,"[UE %d] Handover failure..initiating connection re-establishment procedure... \n", + ctxt_pP->module_id); + //Implement 36.331, section 5.3.5.6 here + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); + return(RRC_Handover_failed); + } + + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_cnt--; + } + + // Layer 3 filtering of RRC measurements + if (UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[0] != NULL) { + ue_meas_filtering(ctxt_pP,enb_indexP); + } + + ue_measurement_report_triggering(ctxt_pP,enb_indexP); + + if (UE_rrc_inst[ctxt_pP->module_id].Info[0].handoverTarget > 0) { + LOG_I(RRC,"[UE %d] Frame %d : RRC handover initiated\n", ctxt_pP->module_id, ctxt_pP->frame); + } + + if((UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].State == RRC_HO_EXECUTION) && + (UE_rrc_inst[ctxt_pP->module_id].HandoverInfoUe.targetCellId != 0xFF)) { + UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].State= RRC_IDLE; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); + return(RRC_HO_STARTED); + } + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); + return (RRC_OK); +} diff --git a/openair2/RRC/LITE/rrc_UE_ral.c b/openair2/RRC/LITE/rrc_UE_ral.c old mode 100755 new mode 100644 index ed1e6ca205..0cb0943fcb --- a/openair2/RRC/LITE/rrc_UE_ral.c +++ b/openair2/RRC/LITE/rrc_UE_ral.c @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rrc_UE_ral.c * \brief rrc procedures for handling RAL messages diff --git a/openair2/RRC/LITE/rrc_UE_ral.h b/openair2/RRC/LITE/rrc_UE_ral.h old mode 100755 new mode 100644 index a06ae637cd..e2b4a3dadb --- a/openair2/RRC/LITE/rrc_UE_ral.h +++ b/openair2/RRC/LITE/rrc_UE_ral.h @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rrc_UE_ral.h * \brief rrc procedures for handling RAL messages diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c index bd77c8463a..a6a2bbb613 100644 --- a/openair2/RRC/LITE/rrc_common.c +++ b/openair2/RRC/LITE/rrc_common.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rrc_common.c * \brief rrc common procedures for eNB and UE @@ -49,53 +41,18 @@ #include "pdcp.h" #include "UTIL/LOG/vcd_signal_dumper.h" #include "rrc_eNB_UE_context.h" +#include "common/ran_context.h" #ifdef LOCALIZATION #include #endif #define DEBUG_RRC 1 -extern eNB_MAC_INST *eNB_mac_inst; +extern RAN_CONTEXT_t RC; extern UE_MAC_INST *UE_mac_inst; extern mui_t rrc_eNB_mui; -//configure BCCH & CCCH Logical Channels and associated rrc_buffers, configure associated SRBs -//----------------------------------------------------------------------------- -void -openair_rrc_on( - const protocol_ctxt_t* const ctxt_pP -) -//----------------------------------------------------------------------------- -{ - unsigned short i; - int CC_id; - - if (ctxt_pP->enb_flag == ENB_FLAG_YES) { - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" OPENAIR RRC IN....\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - rrc_config_buffer (&eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SI, BCCH, 1); - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SI.Active = 1; - rrc_config_buffer (&eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0, CCCH, 1); - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Active = 1; - } - } else { - LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" OPENAIR RRC IN....\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); - - for (i = 0; i < NB_eNB_INST; i++) { - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" Activating CCCH (eNB %d)\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), i); - UE_rrc_inst[ctxt_pP->module_id].Srb0[i].Srb_id = CCCH; - memcpy (&UE_rrc_inst[ctxt_pP->module_id].Srb0[i].Lchan_desc[0], &CCCH_LCHAN_DESC, LCHAN_DESC_SIZE); - memcpy (&UE_rrc_inst[ctxt_pP->module_id].Srb0[i].Lchan_desc[1], &CCCH_LCHAN_DESC, LCHAN_DESC_SIZE); - rrc_config_buffer (&UE_rrc_inst[ctxt_pP->module_id].Srb0[i], CCCH, 1); - UE_rrc_inst[ctxt_pP->module_id].Srb0[i].Active = 1; - } - } -} - //----------------------------------------------------------------------------- int rrc_init_global_param( @@ -104,9 +61,7 @@ rrc_init_global_param( //----------------------------------------------------------------------------- { - //#ifdef USER_MODE // Rrc_xface = (RRC_XFACE*)malloc16(sizeof(RRC_XFACE)); - //#endif //USRE_MODE // Rrc_xface->openair_rrc_top_init = openair_rrc_top_init; // Rrc_xface->openair_rrc_eNB_init = openair_rrc_eNB_init; @@ -158,73 +113,10 @@ rrc_init_global_param( Rlc_info_am_config.rlc.rlc_am_info.t_poll_retransmit = 15; Rlc_info_am_config.rlc.rlc_am_info.t_reordering = 50; Rlc_info_am_config.rlc.rlc_am_info.t_status_prohibit = 10; -#ifndef NO_RRM - - if (L3_xface_init ()) { - return (-1); - } - -#endif return 0; } -#ifndef NO_RRM -//----------------------------------------------------------------------------- -int -L3_xface_init( - void -) -//----------------------------------------------------------------------------- -{ - - int ret = 0; - -#ifdef USER_MODE - - int sock; - LOG_D(RRC, "[L3_XFACE] init de l'interface \n"); - - if (open_socket (&S_rrc, RRC_RRM_SOCK_PATH, RRM_RRC_SOCK_PATH, 0) == -1) { - return (-1); - } - - if (S_rrc.s == -1) { - return (-1); - } - - socket_setnonblocking (S_rrc.s); - msg ("Interface Connected... RRM-RRC\n"); - return 0; - -#else - - ret=rtf_create(RRC2RRM_FIFO,32768); - - if (ret < 0) { - msg("[openair][MAC][INIT] Cannot create RRC2RRM fifo %d (ERROR %d)\n",RRC2RRM_FIFO,ret); - return(-1); - } else { - msg("[openair][MAC][INIT] Created RRC2RRM fifo %d\n",RRC2RRM_FIFO); - rtf_reset(RRC2RRM_FIFO); - } - - ret=rtf_create(RRM2RRC_FIFO,32768); - - if (ret < 0) { - msg("[openair][MAC][INIT] Cannot create RRM2RRC fifo %d (ERROR %d)\n",RRM2RRC_FIFO,ret); - return(-1); - } else { - msg("[openair][MAC][INIT] Created RRC2RRM fifo %d\n",RRM2RRC_FIFO); - rtf_reset(RRM2RRC_FIFO); - } - - return(0); - -#endif -} -#endif - //----------------------------------------------------------------------------- void rrc_config_buffer( @@ -239,352 +131,6 @@ rrc_config_buffer( Srb_info->Tx_buffer.payload_size = 0; } -/*------------------------------------------------------------------------------*/ -void -openair_rrc_top_init( - int eMBMS_active, - char* uecap_xer, - uint8_t cba_group_active, - uint8_t HO_active -) -//----------------------------------------------------------------------------- -{ - - module_id_t module_id; - OAI_UECapability_t *UECap = NULL; - int CC_id; - - /* for no gcc warnings */ - (void)CC_id; - - LOG_D(RRC, "[OPENAIR][INIT] Init function start: NB_UE_INST=%d, NB_eNB_INST=%d\n", NB_UE_INST, NB_eNB_INST); - - if (NB_UE_INST > 0) { - UE_rrc_inst = (UE_RRC_INST*) malloc16(NB_UE_INST*sizeof(UE_RRC_INST)); - memset (UE_rrc_inst, 0, NB_UE_INST * sizeof(UE_RRC_INST)); - LOG_D(RRC, "ALLOCATE %d Bytes for UE_RRC_INST @ %p\n", (unsigned int)(NB_UE_INST*sizeof(UE_RRC_INST)), UE_rrc_inst); - - // fill UE capability - UECap = fill_ue_capability (uecap_xer); - - for (module_id = 0; module_id < NB_UE_INST; module_id++) { - UE_rrc_inst[module_id].UECap = UECap; - UE_rrc_inst[module_id].UECapability = UECap->sdu; - UE_rrc_inst[module_id].UECapability_size = UECap->sdu_size; - } - -#ifdef Rel10 - LOG_I(RRC,"[UE] eMBMS active state is %d \n", eMBMS_active); - - for (module_id=0; module_id 0) { - eNB_rrc_inst = (eNB_RRC_INST*) malloc16(NB_eNB_INST*sizeof(eNB_RRC_INST)); - memset (eNB_rrc_inst, 0, NB_eNB_INST * sizeof(eNB_RRC_INST)); - LOG_I(RRC,"[eNB] handover active state is %d \n", HO_active); - - for (module_id=0; module_id 0) { - free (UE_rrc_inst); - } - - if (NB_eNB_INST > 0) { - free (eNB_rrc_inst); - - } -} - - -//----------------------------------------------------------------------------- -void -rrc_t310_expiration( - const protocol_ctxt_t* const ctxt_pP, - const uint8_t eNB_index -) -//----------------------------------------------------------------------------- -{ - - if (UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].State != RRC_CONNECTED) { - LOG_D(RRC, "Timer 310 expired, going to RRC_IDLE\n"); - UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].State = RRC_IDLE; - UE_rrc_inst[ctxt_pP->module_id].Info[eNB_index].UE_index = 0xffff; - UE_rrc_inst[ctxt_pP->module_id].Srb0[eNB_index].Rx_buffer.payload_size = 0; - UE_rrc_inst[ctxt_pP->module_id].Srb0[eNB_index].Tx_buffer.payload_size = 0; - UE_rrc_inst[ctxt_pP->module_id].Srb1[eNB_index].Srb_info.Rx_buffer.payload_size = 0; - UE_rrc_inst[ctxt_pP->module_id].Srb1[eNB_index].Srb_info.Tx_buffer.payload_size = 0; - - if (UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Active == 1) { - msg ("[RRC Inst %d] eNB_index %d, Remove RB %d\n ", ctxt_pP->module_id, eNB_index, - UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Srb_info.Srb_id); - rrc_pdcp_config_req (ctxt_pP, - SRB_FLAG_YES, - CONFIG_ACTION_REMOVE, - UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Srb_info.Srb_id, - 0); - rrc_rlc_config_req (ctxt_pP, - SRB_FLAG_YES, - MBMS_FLAG_NO, - CONFIG_ACTION_REMOVE, - UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Srb_info.Srb_id, - Rlc_info_um); - UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Active = 0; - UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Status = IDLE; - UE_rrc_inst[ctxt_pP->module_id].Srb2[eNB_index].Next_check_frame = 0; - } - } else { // Restablishment procedure - LOG_D(RRC, "Timer 310 expired, trying RRCRestablishment ...\n"); - } -} - -//----------------------------------------------------------------------------- -RRC_status_t -rrc_rx_tx( - protocol_ctxt_t* const ctxt_pP, - const uint8_t enb_indexP, - const int CC_id -) -//----------------------------------------------------------------------------- -{ - //uint8_t UE_id; - int32_t current_timestamp_ms, ref_timestamp_ms; - struct timeval ts; - struct rrc_eNB_ue_context_s *ue_context_p = NULL,*ue_to_be_removed = NULL; - -#ifdef LOCALIZATION - double estimated_distance; - protocol_ctxt_t ctxt; -#endif - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_IN); - - if(ctxt_pP->enb_flag == ENB_FLAG_NO) { - // check timers - - if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_active == 1) { - if ((UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_cnt % 10) == 0) - LOG_D(RRC, - "[UE %d][RAPROC] Frame %d T300 Count %d ms\n", ctxt_pP->module_id, ctxt_pP->frame, UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_cnt); - - if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_cnt - == T300[UE_rrc_inst[ctxt_pP->module_id].sib2[enb_indexP]->ue_TimersAndConstants.t300]) { - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_active = 0; - // ALLOW CCCH to be used - UE_rrc_inst[ctxt_pP->module_id].Srb0[enb_indexP].Tx_buffer.payload_size = 0; - rrc_ue_generate_RRCConnectionRequest (ctxt_pP, enb_indexP); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); - return (RRC_ConnSetup_failed); - } - - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T300_cnt++; - } - - if ((UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].SIStatus&2)>0) { - if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].N310_cnt - == N310[UE_rrc_inst[ctxt_pP->module_id].sib2[enb_indexP]->ue_TimersAndConstants.n310]) { - LOG_I(RRC,"Activating T310\n"); - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_active = 1; - } - } else { // in case we have not received SIB2 yet - /* if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].N310_cnt == 100) { - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].N310_cnt = 0; - - }*/ - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); - return RRC_OK; - } - - if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_active == 1) { - if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].N311_cnt - == N311[UE_rrc_inst[ctxt_pP->module_id].sib2[enb_indexP]->ue_TimersAndConstants.n311]) { - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_active = 0; - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].N311_cnt = 0; - } - - if ((UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_cnt % 10) == 0) { - LOG_D(RRC, "[UE %d] Frame %d T310 Count %d ms\n", ctxt_pP->module_id, ctxt_pP->frame, UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_cnt); - } - - if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_cnt == T310[UE_rrc_inst[ctxt_pP->module_id].sib2[enb_indexP]->ue_TimersAndConstants.t310]) { - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_active = 0; - rrc_t310_expiration (ctxt_pP, enb_indexP); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); - LOG_I(RRC,"Returning RRC_PHY_RESYNCH: T310 expired\n"); - return RRC_PHY_RESYNCH; - } - - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T310_cnt++; - } - - if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_active==1) { - if ((UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_cnt % 10) == 0) - LOG_D(RRC,"[UE %d][RAPROC] Frame %d T304 Count %d ms\n",ctxt_pP->module_id,ctxt_pP->frame, - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_cnt); - - if (UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_cnt == 0) { - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_active = 0; - UE_rrc_inst[ctxt_pP->module_id].HandoverInfoUe.measFlag = 1; - LOG_E(RRC,"[UE %d] Handover failure..initiating connection re-establishment procedure... \n"); - //Implement 36.331, section 5.3.5.6 here - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); - return(RRC_Handover_failed); - } - - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].T304_cnt--; - } - - // Layer 3 filtering of RRC measurements - if (UE_rrc_inst[ctxt_pP->module_id].QuantityConfig[0] != NULL) { - ue_meas_filtering(ctxt_pP,enb_indexP); - } - - ue_measurement_report_triggering(ctxt_pP,enb_indexP); - - if (UE_rrc_inst[ctxt_pP->module_id].Info[0].handoverTarget > 0) { - LOG_I(RRC,"[UE %d] Frame %d : RRC handover initiated\n", ctxt_pP->module_id, ctxt_pP->frame); - } - - if((UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].State == RRC_HO_EXECUTION) && - (UE_rrc_inst[ctxt_pP->module_id].HandoverInfoUe.targetCellId != 0xFF)) { - UE_rrc_inst[ctxt_pP->module_id].Info[enb_indexP].State= RRC_IDLE; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); - return(RRC_HO_STARTED); - } - - } else { // eNB - check_handovers(ctxt_pP); - // counetr, and get the value and aggregate - - // check for UL failure - RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head)) { - if (ue_context_p->ue_context.ul_failure_timer>0) { - ue_context_p->ue_context.ul_failure_timer++; - if (ue_context_p->ue_context.ul_failure_timer >= 20000) { - // remove UE after 20 seconds after MAC has indicated UL failure - LOG_I(RRC,"Removing UE %x instance\n",ue_context_p->ue_context.rnti); - ue_to_be_removed = ue_context_p; - break; - } - } - if (ue_context_p->ue_context.ue_release_timer>0) { - ue_context_p->ue_context.ue_release_timer++; - if (ue_context_p->ue_context.ue_release_timer >= 100) { - // remove UE after 10 frames after RRCConnectionRelease is triggered - LOG_I(RRC,"Removing UE %x instance\n",ue_context_p->ue_context.rnti); - ue_to_be_removed = ue_context_p; - break; - } - } - } - if (ue_to_be_removed) - rrc_eNB_free_UE(ctxt_pP->module_id,ue_to_be_removed); - -#ifdef RRC_LOCALIZATION - - /* for the localization, only primary CC_id might be relevant*/ - gettimeofday(&ts, NULL); - current_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000; - ref_timestamp_ms = eNB_rrc_inst[ctxt_pP->module_id].reference_timestamp_ms; - RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head)) { - ctxt = *ctxt_pP; - ctxt.rnti = ue_context_p->ue_context.rnti; - estimated_distance = rrc_get_estimated_ue_distance( - &ctxt, - CC_id, - eNB_rrc_inst[ctxt_pP->module_id].loc_type); - - if ((current_timestamp_ms - ref_timestamp_ms > eNB_rrc_inst[ctxt_pP->module_id].aggregation_period_ms) && - estimated_distance != -1) { - LOG_D(LOCALIZE, " RRC [UE/id %d -> eNB/id %d] timestamp %d frame %d estimated r = %f\n", - ctxt.rnti, - ctxt_pP->module_id, - current_timestamp_ms, - ctxt_pP->frame, - estimated_distance); - LOG_D(LOCALIZE, " RRC status %d\n", ue_context_p->ue_context.Status); - push_front(&eNB_rrc_inst[ctxt_pP->module_id].loc_list, - estimated_distance); - eNB_rrc_inst[ctxt_pP->module_id].reference_timestamp_ms = current_timestamp_ms; - } - } - -#endif - (void)ts; /* remove gcc warning "unused variable" */ - (void)ref_timestamp_ms; /* remove gcc warning "unused variable" */ - (void)current_timestamp_ms; /* remove gcc warning "unused variable" */ - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); - return (RRC_OK); -} //----------------------------------------------------------------------------- long @@ -671,3 +217,110 @@ binary_search_float( return first; } +typedef enum { BAND_TYPE_FDD, BAND_TYPE_TDD } band_type; + +typedef struct { + band_type t; + int band; + unsigned long ul_minfreq, ul_maxfreq; + unsigned long dl_minfreq, dl_maxfreq; +} band_freq; + +static band_freq bands[] = { + { BAND_TYPE_FDD, 1, 1920000000UL, 1980000000UL, 2110000000UL, 2170000000UL }, + { BAND_TYPE_FDD, 2, 1850000000UL, 1910000000UL, 1930000000UL, 1990000000UL }, + { BAND_TYPE_FDD, 3, 1710000000UL, 1785000000UL, 1805000000UL, 1880000000UL }, + { BAND_TYPE_FDD, 4, 1710000000UL, 1755000000UL, 2110000000UL, 2155000000UL }, + { BAND_TYPE_FDD, 5, 824000000UL, 849000000UL, 869000000UL, 894000000UL }, + /* to remove? */{ BAND_TYPE_FDD, 6, 830000000UL, 840000000UL, 875000000UL, 885000000UL }, + { BAND_TYPE_FDD, 7, 2500000000UL, 2570000000UL, 2620000000UL, 2690000000UL }, + { BAND_TYPE_FDD, 8, 880000000UL, 915000000UL, 925000000UL, 960000000UL }, + { BAND_TYPE_FDD, 9, 1749900000UL, 1784900000UL, 1844900000UL, 1879900000UL }, + { BAND_TYPE_FDD, 10, 1710000000UL, 1770000000UL, 2110000000UL, 2170000000UL }, + { BAND_TYPE_FDD, 11, 1427900000UL, 1447900000UL, 1475900000UL, 1495900000UL }, + { BAND_TYPE_FDD, 12, 699000000UL, 716000000UL, 729000000UL, 746000000UL }, + { BAND_TYPE_FDD, 13, 777000000UL, 787000000UL, 746000000UL, 756000000UL }, + { BAND_TYPE_FDD, 14, 788000000UL, 798000000UL, 758000000UL, 768000000UL }, + { BAND_TYPE_FDD, 17, 704000000UL, 716000000UL, 734000000UL, 746000000UL }, + { BAND_TYPE_FDD, 18, 815000000UL, 830000000UL, 860000000UL, 875000000UL }, + { BAND_TYPE_FDD, 19, 830000000UL, 845000000UL, 875000000UL, 890000000UL }, + { BAND_TYPE_FDD, 20, 832000000UL, 862000000UL, 791000000UL, 821000000UL }, + { BAND_TYPE_FDD, 21, 1447900000UL, 1462900000UL, 1495900000UL, 1510900000UL }, + { BAND_TYPE_FDD, 22, 3410000000UL, 3490000000UL, 3510000000UL, 3590000000UL }, + { BAND_TYPE_FDD, 23, 2000000000UL, 2020000000UL, 2180000000UL, 2200000000UL }, + { BAND_TYPE_FDD, 24, 1626500000UL, 1660500000UL, 1525000000UL, 1559000000UL }, + { BAND_TYPE_FDD, 25, 1850000000UL, 1915000000UL, 1930000000UL, 1995000000UL }, + + { BAND_TYPE_TDD, 33, 1900000000UL, 1920000000UL, 1900000000UL, 1920000000UL }, + { BAND_TYPE_TDD, 34, 2010000000UL, 2025000000UL, 2010000000UL, 2025000000UL }, + { BAND_TYPE_TDD, 35, 1850000000UL, 1910000000UL, 1850000000UL, 1910000000UL }, + { BAND_TYPE_TDD, 36, 1930000000UL, 1990000000UL, 1930000000UL, 1990000000UL }, + { BAND_TYPE_TDD, 37, 1910000000UL, 1930000000UL, 1910000000UL, 1930000000UL }, + { BAND_TYPE_TDD, 38, 2570000000UL, 2620000000UL, 2570000000UL, 2620000000UL }, + { BAND_TYPE_TDD, 39, 1880000000UL, 1920000000UL, 1880000000UL, 1920000000UL }, + { BAND_TYPE_TDD, 40, 2300000000UL, 2400000000UL, 2300000000UL, 2400000000UL }, + { BAND_TYPE_TDD, 41, 2496000000UL, 2690000000UL, 2496000000UL, 2690000000UL }, + { BAND_TYPE_TDD, 42, 3400000000UL, 3600000000UL, 3400000000UL, 3600000000UL }, + { BAND_TYPE_TDD, 43, 3600000000UL, 3800000000UL, 3600000000UL, 3800000000UL }, +}; + +typedef struct { + int band; + unsigned long dl_flow; + int dl_off; + int dl_offmin, dl_offmax; + unsigned long ul_flow; + int ul_off; + int ul_offmin, ul_offmax; +} earfcn; + +static earfcn earfcn_table[] = { + { 1, 2110000000UL, 0, 0, 599, 1920000000UL, 18000, 18000, 18599 }, + { 2, 1930000000UL, 600, 600, 1199, 1850000000UL, 18600, 18600, 19199 }, + { 3, 1805000000UL, 1200, 1200, 1949, 1710000000UL, 19200, 19200, 19949 }, + { 4, 2110000000UL, 1950, 1950, 2399, 1710000000UL, 19950, 19950, 20399 }, + { 5, 869000000UL, 2400, 2400, 2649, 824000000UL, 20400, 20400, 20649 }, + { 6, 875000000UL, 2650, 2650, 2749, 830000000UL, 20650, 20650, 20749 }, + { 7, 2620000000UL, 2750, 2750, 3449, 2500000000UL, 20750, 20750, 21449 }, + { 8, 925000000UL, 3450, 3450, 3799, 880000000UL, 21450, 21450, 21799 }, + { 9, 1844900000UL, 3800, 3800, 4149, 1749900000UL, 21800, 21800, 22149 }, + { 10, 2110000000UL, 4150, 4150, 4749, 1710000000UL, 22150, 22150, 22749 }, + { 11, 1475900000UL, 4750, 4750, 4949, 1427900000UL, 22750, 22750, 22949 }, + { 12, 729000000UL, 5010, 5010, 5179, 699000000UL, 23010, 23010, 23179 }, + { 13, 746000000UL, 5180, 5180, 5279, 777000000UL, 23180, 23180, 23279 }, + { 14, 758000000UL, 5280, 5280, 5379, 788000000UL, 23280, 23280, 23379 }, + { 17, 734000000UL, 5730, 5730, 5849, 704000000UL, 23730, 23730, 23849 }, + { 18, 860000000UL, 5850, 5850, 5999, 815000000UL, 23850, 23850, 23999 }, + { 19, 875000000UL, 6000, 6000, 6149, 830000000UL, 24000, 24000, 24149 }, + { 20, 791000000UL, 6150, 6150, 6449, 832000000UL, 24150, 24150, 24449 }, + { 21, 1495900000UL, 6450, 6450, 6599, 1447900000UL, 24450, 24450, 24599 }, + { 22, 3510000000UL, 6600, 6600, 7399, 3410000000UL, 24600, 24600, 25399 }, + { 23, 2180000000UL, 7500, 7500, 7699, 2000000000UL, 25500, 25500, 25699 }, + { 24, 1525000000UL, 7700, 7700, 8039, 1626500000UL, 25700, 25700, 26039 }, + { 25, 1930000000UL, 8040, 8040, 8689, 1850000000UL, 26040, 26040, 26689 }, + { 33, 1900000000UL, 36000, 36000, 36199, 1900000000UL, 36000, 36000, 36199 }, + { 34, 2010000000UL, 36200, 36200, 36349, 2010000000UL, 36200, 36200, 36349 }, + { 35, 1850000000UL, 36350, 36350, 36949, 1850000000UL, 36350, 36350, 36949 }, + { 36, 1930000000UL, 36950, 36950, 37549, 1930000000UL, 36950, 36950, 37549 }, + { 37, 1910000000UL, 37550, 37550, 37749, 1910000000UL, 37550, 37550, 37749 }, + { 38, 2570000000UL, 37750, 37750, 38249, 2570000000UL, 37750, 37750, 38249 }, + { 39, 1880000000UL, 38250, 38250, 38649, 1880000000UL, 38250, 38250, 38649 }, + { 40, 2300000000UL, 38650, 38650, 39649, 2300000000UL, 38650, 38650, 39649 }, + { 41, 2496000000UL, 39650, 39650, 41589, 2496000000UL, 39650, 39650, 41589 }, + { 42, 3400000000UL, 41590, 41590, 43589, 3400000000UL, 41590, 41590, 43589 }, + { 43, 3600000000UL, 43590, 43590, 45589, 3600000000UL, 43590, 43590, 45589 }, +}; + +int freq_to_arfcn10(int band, unsigned long freq) +{ + int N = sizeof(earfcn_table) / sizeof(earfcn_table[0]); + int i; + + for (i = 0; i < N; i++) if (bands[i].band == band) break; + if (i == N) return -1; + + if (!(bands[i].dl_minfreq < freq && freq < bands[i].dl_maxfreq)) + return -1; + + return (freq - earfcn_table[i].dl_flow) / 100000UL + earfcn_table[i].dl_off; +} diff --git a/openair2/RRC/LITE/rrc_config.c b/openair2/RRC/LITE/rrc_config.c deleted file mode 100644 index cd91e6c2f3..0000000000 --- a/openair2/RRC/LITE/rrc_config.c +++ /dev/null @@ -1,325 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file rrc_config.c -* \brief rrc cinfiguration -* \author Raymond Knopp and Navid Nikaein -* \date 2011 -* \version 1.0 -* \company Eurecom -* \email: raymond.knopp@eurecom.fr and navid.nikaein@eurecom.fr -*/ - - -#include "defs.h" - -#include "extern.h" - - -#ifdef PHY_EMUL -#include "SIMULATION/simulation_defs.h" -extern EMULATION_VARS *Emul_vars; -#endif -extern CH_MAC_INST *CH_mac_inst; -extern UE_MAC_INST *UE_mac_inst; -#ifdef BIGPHYSAREA -extern void *bigphys_malloc(int); -#endif - -void rrc_init_ch_req(unsigned char Mod_id, rrm_init_ch_req_t *smsg) -{ - uint16_t Index; - MAC_CONFIG_REQ Mac_config_req; - // MAC_MEAS_REQ Mac_meas_req; - - msg("-----------------------------------------------------------------------------------------------------------------\n"); - printk("[RRC_CONFIG]OPENAIR RRC INIT CH %d...\n",Mod_id); - - Mac_config_req.Lchan_type = smsg->Lchan_desc_srb0.Lchan_t; - memcpy(&Mac_config_req.Lchan_desc[0],(LCHAN_DESC*)&smsg->Lchan_desc_srb0,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(&Mac_config_req.Lchan_desc[1],(LCHAN_DESC*)&smsg->Lchan_desc_srb0,LCHAN_DESC_SIZE); //0 rx, 1 tx - Mac_config_req.UE_CH_index=0; - Mac_config_req.Lchan_id.Index=(0 << RAB_SHIFT2) + BCCH; - msg("Calling Lchan_config\n"); - Index=Mac_rlc_xface->mac_config_req(Mod_id,ADD_LC,&Mac_config_req); - msg("[OPENAIR][RRC][RRC_ON] NODE %d, Config BCCH %d done\n",CH_rrc_inst[Mod_id].Node_id,Index); - CH_rrc_inst[Mod_id].Srb0.Srb_id = Index; - - memcpy(&CH_rrc_inst[Mod_id].Srb0.Lchan_desc[0],(LCHAN_DESC*)&smsg->Lchan_desc_srb0,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(&CH_rrc_inst[Mod_id].Srb0.Lchan_desc[1],(LCHAN_DESC*)&smsg->Lchan_desc_srb0,LCHAN_DESC_SIZE); //0 rx, 1 tx - - rrc_config_buffer(&CH_rrc_inst[Mod_id].Srb0,BCCH,0); - ((CH_BCCH_HEADER*)(&CH_rrc_inst[Mod_id].Srb0.Tx_buffer.Header[0]))->Rv_tb_idx=0; - msg("[OPENAIR][RRC][RRC_ON] NODE %d, Config BCCH for TB_size %d\n",NODE_ID[Mod_id], - CH_rrc_inst[Mod_id].Srb0.Lchan_desc[1].transport_block_size); - CH_rrc_inst[Mod_id].Srb0.Tx_buffer.generate_fun=ch_rrc_generate_bcch; - CH_rrc_inst[Mod_id].Srb0.Active=1; - - Mac_config_req.Lchan_type = smsg->Lchan_desc_srb1.Lchan_t; - memcpy(&Mac_config_req.Lchan_desc[0],(LCHAN_DESC*)&smsg->Lchan_desc_srb1,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(&Mac_config_req.Lchan_desc[1],(LCHAN_DESC*)&smsg->Lchan_desc_srb1,LCHAN_DESC_SIZE); //0 rx, 1 tx - Mac_config_req.UE_CH_index=0; - Mac_config_req.Lchan_id.Index=(0 << RAB_SHIFT2) + CCCH; - // printk("Calling Lchan_config\n"); - Index=Mac_rlc_xface->mac_config_req(Mod_id,ADD_LC,&Mac_config_req); - msg("[OPENAIR][RRC][RRC_ON] NODE %d, Config BCCH %d done\n",CH_rrc_inst[Mod_id].Node_id,Index); - CH_rrc_inst[Mod_id].Srb1.Srb_id = Index; - - memcpy(&CH_rrc_inst[Mod_id].Srb1.Lchan_desc[0],(LCHAN_DESC*)&smsg->Lchan_desc_srb1,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(&CH_rrc_inst[Mod_id].Srb1.Lchan_desc[1],(LCHAN_DESC*)&smsg->Lchan_desc_srb1,LCHAN_DESC_SIZE); //0 rx, 1 tx - - - rrc_config_buffer(&CH_rrc_inst[Mod_id].Srb1,CCCH,1); - ((CH_CCCH_HEADER*)(&CH_rrc_inst[Mod_id].Srb1.Tx_buffer.Header[0]))->Rv_tb_idx=0; - printk("[OPENAIR][RRC][RRC_ON] NODE %d, Config CCCH %d done, TB_size=%d,%d\n",NODE_ID[Mod_id],Index, - CH_rrc_inst[Mod_id].Srb1.Tx_buffer.Tb_size,CH_rrc_inst[Mod_id].Srb1.Rx_buffer.Tb_size); - CH_rrc_inst[Mod_id].Srb1.Tx_buffer.generate_fun=ch_rrc_generate_ccch; - CH_rrc_inst[Mod_id].Srb1.Active=1; - - //CH_rrc_inst[Mod_id].Info.UE_list[i].L2_id[0]=i; - - // CH_rrc_inst[Mod_id].Info.UE_list[0]=0; - -} - -void rrc_init_mr_req(unsigned char Mod_id, rrci_init_mr_req_t *smsg) -{ - uint16_t Index; - MAC_CONFIG_REQ Mac_config_req; - // MAC_MEAS_REQ Mac_meas_req; - msg("-----------------------------------------------------------------------------------------------------------------\n"); - msg("[RRC_CONFIG]: Node %d: INIT MR REQUEST for CH %d\n",NODE_ID[Mod_id],smsg->CH_index); - Mac_config_req.Lchan_type = smsg->Lchan_desc_srb0.Lchan_t; - memcpy(&Mac_config_req.Lchan_desc[0],(LCHAN_DESC*)&smsg->Lchan_desc_srb0,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(&Mac_config_req.Lchan_desc[1],(LCHAN_DESC*)&smsg->Lchan_desc_srb0,LCHAN_DESC_SIZE); //0 rx, 1 tx - - Mac_config_req.UE_CH_index=smsg->CH_index; - Mac_config_req.Lchan_id.Index=(smsg->CH_index << RAB_SHIFT2) + BCCH; - Index=Mac_rlc_xface->mac_config_req(Mod_id,ADD_LC,&Mac_config_req); - msg("[OPENAIR][RRC][RRC_CONFIG] NODE %d, Config BCCH %d done\n",UE_rrc_inst[Mod_id-NB_CH_INST].Node_id,Index); - - UE_rrc_inst[Mod_id].Srb0[smsg->CH_index].Srb_id = Index; - memcpy(& UE_rrc_inst[Mod_id-NB_CH_INST].Srb0[smsg->CH_index].Lchan_desc[0],(LCHAN_DESC*)&smsg->Lchan_desc_srb0,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(& UE_rrc_inst[Mod_id-NB_CH_INST].Srb0[smsg->CH_index].Lchan_desc[1],(LCHAN_DESC*)&smsg->Lchan_desc_srb0,LCHAN_DESC_SIZE); //0 rx, 1 tx - - rrc_config_buffer(&UE_rrc_inst[Mod_id-NB_CH_INST].Srb0[smsg->CH_index],BCCH,0); - ((CH_BCCH_HEADER*)(&UE_rrc_inst[Mod_id-NB_CH_INST].Srb0[smsg->CH_index].Rx_buffer.Header[0]))->Rv_tb_idx=0; - UE_rrc_inst[Mod_id-NB_CH_INST].Srb0[smsg->CH_index].Active=1; - /* - Mac_meas_req.Lchan_id.Index = Index; - Mac_meas_req.UE_CH_index = i; - Mac_meas_req.Meas_trigger = BCCH_MEAS_TRIGGER; - Mac_meas_req.Mac_avg = BCCH_MEAS_AVG; - Mac_meas_req.Rep_amount = 0; - Mac_meas_req.Rep_interval = 1000; - UE_rrc_inst[Mod_id].Srb0[i].Meas_entry=Mac_rlc_xface->mac_meas_req(Mod_id+NB_CH_INST,&Mac_meas_req); - UE_rrc_inst[Mod_id].Srb0[i].Meas_entry->Status=RADIO_CONFIG_OK; - UE_rrc_inst[Mod_id].Srb0[i].Meas_entry->Last_report_frame=Rrc_xface->Frame_index; - UE_rrc_inst[Mod_id].Srb0[i].Meas_entry->Next_check_frame=Rrc_xface->Frame_index+1000; - */ - - //printk("[OPENAIR][RRC][RRC_ON] NODE %d, Config CCCH %d done\n",NODE_ID[Mod_id],Index); - // printk("check meas, LC_Index %d, Next %d, Last %d, Int %d \n",UE_rrc_inst[Mod_id].Srb0[i].Meas_entry->Mac_meas_req.Lchan_id.Index,UE_rrc_inst[Mod_id].Srb0[i].Meas_entry->Next_check_frame,UE_rrc_inst[Mod_id].Srb0[i].Meas_entry->Last_report_frame,UE_rrc_inst[Mod_id].Srb0[i].Meas_entry->Mac_meas_req.Rep_interval); - - Mac_config_req.Lchan_type = smsg->Lchan_desc_srb1.Lchan_t; - memcpy(&Mac_config_req.Lchan_desc[0],(LCHAN_DESC*)&smsg->Lchan_desc_srb1,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(&Mac_config_req.Lchan_desc[1],(LCHAN_DESC*)&smsg->Lchan_desc_srb1,LCHAN_DESC_SIZE); //0 rx, 1 tx - - Mac_config_req.UE_CH_index=smsg->CH_index; - Mac_config_req.Lchan_id.Index=(smsg->CH_index << RAB_SHIFT2) + CCCH; - Index=Mac_rlc_xface->mac_config_req(Mod_id,ADD_LC,&Mac_config_req); - msg("[OPENAIR][RRC][RRC_CONFIG] NODE %d, Config CCCH %d done\n",NODE_ID[Mod_id],Index); - UE_rrc_inst[Mod_id-NB_CH_INST].Srb1[smsg->CH_index].Srb_id = Index; - memcpy(&UE_rrc_inst[Mod_id-NB_CH_INST].Srb1[smsg->CH_index].Lchan_desc[0],(LCHAN_DESC*)&smsg->Lchan_desc_srb1,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(&UE_rrc_inst[Mod_id-NB_CH_INST].Srb1[smsg->CH_index].Lchan_desc[1],(LCHAN_DESC*)&smsg->Lchan_desc_srb1,LCHAN_DESC_SIZE); //0 rx, 1 tx - rrc_config_buffer(&UE_rrc_inst[Mod_id-NB_CH_INST].Srb1[smsg->CH_index],CCCH,1); - ((CH_CCCH_HEADER*)(&UE_rrc_inst[Mod_id-NB_CH_INST].Srb1[smsg->CH_index].Rx_buffer.Header[0]))->Rv_tb_idx=0; - UE_rrc_inst[Mod_id-NB_CH_INST].Srb1[smsg->CH_index].Active=1; - /* - - Mac_meas_req.Lchan_id.Index = Index; - // Mac_meas_req.UE_CH_index = i; - Mac_meas_req.Meas_trigger = CCCH_MEAS_TRIGGER; - Mac_meas_req.Mac_avg = CCCH_MEAS_AVG; - Mac_meas_req.Rep_amount = 0; - Mac_meas_req.Rep_interval = 1000; - UE_rrc_inst[Mod_id].Srb1[i].Meas_entry=Mac_rlc_xface->mac_meas_req(Mod_id+NB_CH_INST,&Mac_meas_req); - UE_rrc_inst[Mod_id].Srb1[i].Meas_entry->Status=RADIO_CONFIG_OK; - UE_rrc_inst[Mod_id].Srb1[i].Meas_entry->Last_report_frame=Rrc_xface->Frame_index; - UE_rrc_inst[Mod_id].Srb1[i].Meas_entry->Next_check_frame=Rrc_xface->Frame_index+1000; - //printk("[OPENAIR][RRC][RRC_ON] NODE %d, Config CCCH %d done\n",NODE_ID[Mod_id],Index); - */ - - -} - - - - -void rrc_config_req(Instance_t Mod_id, void *smsg, unsigned char Action,Transaction_t Trans_id) -{ - - MAC_CONFIG_REQ Mac_config_req; - MAC_MEAS_REQ Mac_meas_req; - unsigned short Idx,UE_index,In_idx; - - - switch(Action) { - - case RRM_RB_ESTABLISH_REQ: { - rrm_rb_establish_req_t *p = (rrm_rb_establish_req_t *) smsg ; - msg("[RRC]CH %d: config req for CH L2_id %d to MR L2_id %d\n",NODE_ID[Mod_id],p->L2_id[0].L2_id[0],p->L2_id[1].L2_id[0]); - UE_index=rrc_find_ue_index(Mod_id, p->L2_id[1]); - - if(UE_index > NB_CNX_CH) { - msg("[FATAL ERROR] NO MORE UE_INDEX!!!!!\n"); - return; - } - - if(p->Lchan_desc.Lchan_t==DCCH) { - Mac_config_req.Lchan_type = p->Lchan_desc.Lchan_t; - Mac_config_req.UE_CH_index = UE_index; - memcpy(&Mac_config_req.Lchan_desc[0],(LCHAN_DESC*)&p->Lchan_desc,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(&Mac_config_req.Lchan_desc[1],(LCHAN_DESC*)&p->Lchan_desc,LCHAN_DESC_SIZE); //0 rx, 1 tx - Mac_config_req.Lchan_id.Index=( UE_index << RAB_SHIFT2) + DCCH; - Idx = Mac_rlc_xface->mac_config_req(Mod_id,ADD_LC,&Mac_config_req); - CH_rrc_inst[Mod_id].Srb2[UE_index].Active = 1; - CH_rrc_inst[Mod_id].Srb2[UE_index].Next_check_frame = Rrc_xface->Frame_index + 250; - CH_rrc_inst[Mod_id].Srb2[UE_index].Status = NEED_RADIO_CONFIG;//RADIO CFG - CH_rrc_inst[Mod_id].Srb2[UE_index].Srb_info.Srb_id = Idx; - - - memcpy(&CH_rrc_inst[Mod_id].Srb2[UE_index].Srb_info.Lchan_desc[0],(LCHAN_DESC*)&p->Lchan_desc,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(&CH_rrc_inst[Mod_id].Srb2[UE_index].Srb_info.Lchan_desc[1],(LCHAN_DESC*)&p->Lchan_desc,LCHAN_DESC_SIZE); //0 rx, 1 tx - // CH_rrc_inst[Mod_id].Srb2[UE_index].Srb_info.Lchan_desc[0] = &DCCH_LCHAN_DESC; - // CH_rrc_inst[Mod_id].Srb2[UE_index].Srb_info.Lchan_desc[1] = &DCCH_LCHAN_DESC; - - //CH_rrc_inst[Mod_id].Rab[In_idx][UE_index].Rb_info.Lchan_desc[0] = &msg->Lchan_desc; - // CH_rrc_inst[Mod_id].Rab[In_idx][UE_index].Rb_info.Lchan_desc[1] = &msg-; - //Configure a correponding measurement process - // msg("[RRC]Inst %d: Programing RADIO CONFIG of DCCH LCHAN %d\n",Mod_id,Idx); - //CH_rrc_inst[Mod_id].Nb_rb[UE_index]++; - //msg("[OPENAIR][RRC] CALLING RLC CONFIG RADIO BEARER %d\n",Idx); - Mac_rlc_xface->rrc_rlc_config_req(Mod_id,CONFIG_ACTION_ADD,Idx,SIGNALLING_RADIO_BEARER,Rlc_info_um); - /* - CH_rrc_inst[Mod_id].Srb2[UE_index].Srb_info.CH_ip_addr_type=p->L3_info_t; - if(p->L3_info_t == IPv4_ADDR){ - - memcpy(CH_rrc_inst[Mod_id].Srb2[UE_index].Srb_info.CH_ip_addr,p->L3_info,4); - } - else - memcpy(UE_rrc_inst[Mod_id].Srb2[UE_index].Srb_info.CH_ip_addr,p->L3_info,16); - */ - - - - - // if(msg->Mac_rlc_meas_desc !=NULL){ - CH_rrc_inst[Mod_id].Def_meas[UE_index]= &CH_mac_inst[Mod_id].Def_meas[UE_index]; - CH_rrc_inst[Mod_id].Def_meas[UE_index]->Active = 1; - CH_rrc_inst[Mod_id].Def_meas[UE_index]->Status = NEED_RADIO_CONFIG; - CH_rrc_inst[Mod_id].Def_meas[UE_index]->Forg_fact=1; - CH_rrc_inst[Mod_id].Def_meas[UE_index]->Rep_interval=50; - CH_rrc_inst[Mod_id].Def_meas[UE_index]->Last_report_frame=Rrc_xface->Frame_index; - CH_rrc_inst[Mod_id].Def_meas[UE_index]->Next_check_frame=Rrc_xface->Frame_index +200 ; - // } - } else { - msg("RRC_config: Inst %d:, UE_index %d",Mod_id,UE_index); - Mac_config_req.Lchan_type = p->Lchan_desc.Lchan_t; - Mac_config_req.UE_CH_index = UE_index; - memcpy(&Mac_config_req.Lchan_desc[0],&p->Lchan_desc,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(&Mac_config_req.Lchan_desc[1],&p->Lchan_desc,LCHAN_DESC_SIZE); //0 rx, 1 tx - In_idx=find_free_dtch_position(Mod_id,UE_index); - Mac_config_req.Lchan_id.Index=(UE_index << RAB_SHIFT2) + DTCH + In_idx; - Idx = Mac_rlc_xface->mac_config_req(Mod_id,ADD_LC,&Mac_config_req); - CH_rrc_inst[Mod_id].Rab[In_idx][UE_index].Active = 1; - CH_rrc_inst[Mod_id].Rab[In_idx][UE_index].Next_check_frame = Rrc_xface->Frame_index + 250; - CH_rrc_inst[Mod_id].Rab[In_idx][UE_index].Status = NEED_RADIO_CONFIG;//RADIO CFG - CH_rrc_inst[Mod_id].Rab[In_idx][UE_index].Rb_info.Rb_id = Idx; - - memcpy(&CH_rrc_inst[Mod_id].Rab[In_idx][UE_index].Rb_info.Lchan_desc[0],&p->Lchan_desc,LCHAN_DESC_SIZE); //0 rx, 1 tx - memcpy(&CH_rrc_inst[Mod_id].Rab[In_idx][UE_index].Rb_info.Lchan_desc[1],&p->Lchan_desc,LCHAN_DESC_SIZE); //0 rx, 1 tx - - //Configure a correponding measurement process - msg("[RRC]Inst %d: Programing RADIO CONFIG of DTCH LCHAN %d\n",Mod_id,Idx); - //CH_rrc_inst[Mod_id].Nb_rb[UE_index]++; - //msg("[OPENAIR][RRC] CALLING RLC CONFIG RADIO BEARER %d\n",Idx); - - // if(p->Mac_rlc_meas_desc !=NULL){ - if(p->Lchan_desc.Lchan_t!=DTCH) { - Mac_meas_req.Lchan_id.Index = Idx; - Mac_meas_req.UE_CH_index = UE_index; - Mac_meas_req.Meas_trigger = p->Mac_rlc_meas_desc.Meas_trigger; - Mac_meas_req.Mac_avg = p->Mac_rlc_meas_desc.Mac_avg; - Mac_meas_req.Rep_amount = p->Mac_rlc_meas_desc.Rep_amount; - Mac_meas_req.Rep_interval = p->Mac_rlc_meas_desc.Rep_interval; - CH_rrc_inst[Mod_id].Rab[In_idx][UE_index].Rb_info.Meas_entry=Mac_rlc_xface->mac_meas_req(Mod_id,&Mac_meas_req); - CH_rrc_inst[Mod_id].Rab_meas[In_idx][UE_index].Status=NEED_RADIO_CONFIG; - CH_rrc_inst[Mod_id].Rab_meas[In_idx][UE_index].Mac_meas_req.Lchan_id.Index=Idx; - CH_rrc_inst[Mod_id].Rab_meas[In_idx][UE_index].Last_report_frame=Rrc_xface->Frame_index; - CH_rrc_inst[Mod_id].Rab_meas[In_idx][UE_index].Next_check_frame=Rrc_xface->Frame_index+Mac_meas_req.Rep_interval; - } - - - if(p->Lchan_desc.Lchan_t==DTCH) { - CH_rrc_inst[Mod_id].Rab[In_idx][UE_index].Status = RADIO_CONFIG_OK;//RADIO CFG - Mac_rlc_xface->rrc_rlc_config_req(Mod_id,CONFIG_ACTION_ADD,Idx,RADIO_ACCESS_BEARER,Rlc_info_um); - CH_rrc_inst[Mod_id].IP_addr_type = p->L3_info_t; - - if(CH_rrc_inst[Mod_id].IP_addr_type == IPv4_ADDR) { - memcpy(CH_rrc_inst[Mod_id].IP_addr,p->L3_info,4); - } else { - memcpy(CH_rrc_inst[Mod_id].IP_addr,p->L3_info,16); - } - } else { - Mac_rlc_xface->rrc_rlc_config_req(Mod_id,CONFIG_ACTION_ADD,Idx,RADIO_ACCESS_BEARER,Rlc_info_am_config); - } - } - - if(p->Lchan_desc.Lchan_t==DTCH) { - send_msg(&S_rrc,msg_rrc_rb_establish_cfm(Mod_id,Idx,0,Trans_id)); - } else { - send_msg(&S_rrc,msg_rrc_rb_establish_cfm(Mod_id,Idx,1,Trans_id)); - } - } - break; - - - case RRM_RB_MODIFY_REQ: { - //rrm_rb_modify_req_t *p = (rrm_rb_modify_req_t *) msg ; - } - - case RRM_RB_RELEASE_REQ: { - //rrm_rb_release_req_t *p = (rrm_rb_release_req_t *) msg ; - } - } - - - -} diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 2828209d62..fbc95c8b74 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rrc_eNB.c * \brief rrc procedures for eNB @@ -41,6 +33,7 @@ #include "defs.h" #include "extern.h" #include "assertions.h" +#include "common/ran_context.h" #include "asn1_conversions.h" #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h" #include "LAYER2/RLC/rlc.h" @@ -51,6 +44,7 @@ #include "RRCConnectionRequest.h" #include "RRCConnectionReestablishmentRequest.h" //#include "ReestablishmentCause.h" +#include "BCCH-BCH-Message.h" #include "UL-CCCH-Message.h" #include "DL-CCCH-Message.h" #include "UL-DCCH-Message.h" @@ -62,19 +56,18 @@ #include "rrc_eNB_UE_context.h" #include "platform_types.h" #include "msc.h" +#include "UTIL/LOG/vcd_signal_dumper.h" #include "T.h" -//#ifdef Rel10 +//#if defined(Rel10) || defined(Rel14) #include "MeasResults.h" //#endif -#ifdef USER_MODE -# include "RRC/NAS/nas_config.h" -# include "RRC/NAS/rb_config.h" -# include "OCG.h" -# include "OCG_extern.h" -#endif +#include "RRC/NAS/nas_config.h" +#include "RRC/NAS/rb_config.h" +#include "OCG.h" +#include "OCG_extern.h" #if defined(ENABLE_SECURITY) # include "UTIL/OSA/osa_defs.h" @@ -90,6 +83,7 @@ #endif #include "pdcp.h" +#include "gtpv1u_eNB_task.h" #if defined(ENABLE_ITTI) # include "intertask_interface.h" @@ -101,8 +95,13 @@ #include "SIMULATION/TOOLS/defs.h" // for taus +#if defined(FLEXRAN_AGENT_SB_IF) +#include "flexran_agent_extern.h" +#endif //#define XER_PRINT +extern RAN_CONTEXT_t RC; + #ifdef PHY_EMUL extern EMULATION_VARS *Emul_vars; #endif @@ -114,11 +113,27 @@ extern void* bigphys_malloc(int); extern uint16_t two_tier_hexagonal_cellIds[7]; -/* TS 36.331: RRC-TransactionIdentifier ::= INTEGER (0..3) */ -static const uint8_t RRC_TRANSACTION_IDENTIFIER_NUMBER = 4; - mui_t rrc_eNB_mui = 0; +void +openair_rrc_on( + const protocol_ctxt_t* const ctxt_pP +) +//----------------------------------------------------------------------------- +{ + unsigned short i; + int CC_id; + + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" ENB:OPENAIR RRC IN....\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + rrc_config_buffer (&RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SI, BCCH, 1); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SI.Active = 1; + rrc_config_buffer (&RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0, CCCH, 1); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Active = 1; + } +} + //----------------------------------------------------------------------------- static void init_SI( @@ -131,243 +146,213 @@ init_SI( ) //----------------------------------------------------------------------------- { - uint8_t SIwindowsize = 1; - uint16_t SIperiod = 8; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) int i; #endif - /* - uint32_t mib=0; - int i; - int N_RB_DL,phich_resource; - do_MIB(enb_mod_idP, mac_xface->lte_frame_parms,0x321,&mib); +#ifdef Rel14 + SystemInformationBlockType1_v1310_IEs_t *sib1_v13ext=(SystemInformationBlockType1_v1310_IEs_t *)NULL; +#endif - for (i=0;i<1024;i+=4) - do_MIB(enb_mod_idP, mac_xface->lte_frame_parms,i,&mib); + LOG_D(RRC,"%s()\n\n\n\n",__FUNCTION__); - N_RB_DL=6; - while (N_RB_DL != 0) { - phich_resource = 1; - while (phich_resource != 0) { - for (i=0;i<2;i++) { - mac_xface->lte_frame_parms->N_RB_DL = N_RB_DL; - mac_xface->lte_frame_parms->phich_config_common.phich_duration=i; - mac_xface->lte_frame_parms->phich_config_common.phich_resource = phich_resource; - do_MIB(enb_mod_idP, mac_xface->lte_frame_parms,0,&mib); - } - if (phich_resource == 1) - phich_resource = 3; - else if (phich_resource == 3) - phich_resource = 6; - else if (phich_resource == 6) - phich_resource = 12; - else if (phich_resource == 12) - phich_resource = 0; - } - if (N_RB_DL == 6) - N_RB_DL = 15; - else if (N_RB_DL == 15) - N_RB_DL = 25; - else if (N_RB_DL == 25) - N_RB_DL = 50; - else if (N_RB_DL == 50) - N_RB_DL = 75; - else if (N_RB_DL == 75) - N_RB_DL = 100; - else if (N_RB_DL == 100) - N_RB_DL = 0; - } - exit(-1); - */ + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].MIB = (uint8_t*) malloc16(4); + // copy basic parameters + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].physCellId = configuration->Nid_cell[CC_id]; + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].p_eNB = configuration->nb_antenna_ports[CC_id]; + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Ncp = configuration->prefix_type[CC_id]; + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].dl_CarrierFreq = configuration->downlink_frequency[CC_id]; + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].ul_CarrierFreq = configuration->downlink_frequency[CC_id]+ configuration->uplink_frequency_offset[CC_id]; +#ifdef Rel14 + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].pbch_repetition = configuration->pbch_repetition[CC_id]; +#endif + LOG_I(RRC, "Configuring MIB (N_RB_DL %d,phich_Resource %d,phich_Duration %d)\n", + (int)configuration->N_RB_DL[CC_id], + (int)configuration->phich_resource[CC_id], + (int)configuration->phich_duration[CC_id]); + do_MIB(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id], +#ifdef ENABLE_ITTI + configuration->N_RB_DL[CC_id], + configuration->phich_resource[CC_id], + configuration->phich_duration[CC_id] +#else + 50,0,0 +#endif + ,0); + - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB1 = 0; - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB23 = 0; - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB1 = (uint8_t*) malloc16(32); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1 = 0; + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB23 = 0; + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SIB1 = (uint8_t*) malloc16(32); - /* - printf ("before SIB1 init : Nid_cell %d\n", mac_xface->lte_frame_parms->Nid_cell); - printf ("before SIB1 init : frame_type %d,tdd_config %d\n", - mac_xface->lte_frame_parms->frame_type, - mac_xface->lte_frame_parms->tdd_config); - */ - - if (eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB1) - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB1 = do_SIB1( - ctxt_pP->module_id, - CC_id, - mac_xface->lte_frame_parms, - (uint8_t*)eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB1, - &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].siblock1, - &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib1 + AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SIB1!=NULL,PROTOCOL_RRC_CTXT_FMT" init_SI: FATAL, no memory for SIB1 allocated\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1 = do_SIB1(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id],ctxt_pP->module_id,CC_id #if defined(ENABLE_ITTI) - , configuration + , configuration #endif - ); - else { - LOG_E(RRC, PROTOCOL_RRC_CTXT_FMT" init_SI: FATAL, no memory for SIB1 allocated\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); - mac_xface->macphy_exit("[RRC][init_SI] FATAL, no memory for SIB1 allocated"); - } + ); - /* - printf ("after SIB1 init : Nid_cell %d\n", mac_xface->lte_frame_parms->Nid_cell); - printf ("after SIB1 init : frame_type %d,tdd_config %d\n", - mac_xface->lte_frame_parms->frame_type, - mac_xface->lte_frame_parms->tdd_config); - */ - if (eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB1 == 255) { - mac_xface->macphy_exit("[RRC][init_SI] FATAL, eNB_rrc_inst[enb_mod_idP].carrier[CC_id].sizeof_SIB1 == 255"); - } + AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1 != 255,"FATAL, RC.rrc[enb_mod_idP].carrier[CC_id].sizeof_SIB1 == 255"); - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB23 = (uint8_t*) malloc16(64); - - if (eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB23) { - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB23 = do_SIB23( - ctxt_pP->module_id, - CC_id, - mac_xface->lte_frame_parms, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].SIB23, - &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].systemInformation, - &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2, - &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib3 -#ifdef Rel10 - , &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].MBMS_flag -#endif + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SIB23 = (uint8_t*) malloc16(64); + AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SIB23!=NULL,"cannot allocate memory for SIB"); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB23 = do_SIB23( + ctxt_pP->module_id, + + CC_id #if defined(ENABLE_ITTI) - , configuration + , configuration #endif - ); + ); - /* - eNB_rrc_inst[ctxt_pP->module_id].sizeof_SIB23 = do_SIB2_AT4(ctxt_pP->module_id, - eNB_rrc_inst[ctxt_pP->module_id].SIB23, - &eNB_rrc_inst[ctxt_pP->module_id].systemInformation, - &eNB_rrc_inst[ctxt_pP->module_id].sib2, - #if defined(ENABLE_ITTI) - , configuration - #endif - ); - */ - if (eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sizeof_SIB23 == 255) { - mac_xface->macphy_exit("[RRC][init_SI] FATAL, eNB_rrc_inst[mod].carrier[CC_id].sizeof_SIB23 == 255"); + AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB23 != 255,"FATAL, RC.rrc[mod].carrier[CC_id].sizeof_SIB23 == 255"); + + + LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" SIB2/3 Contents (partial)\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); + LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.n_SB = %ld\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + pusch_ConfigBasic.n_SB); + LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.hoppingMode = %ld\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + pusch_ConfigBasic.hoppingMode); + LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.pusch_HoppingOffset = %ld\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + pusch_ConfigBasic.pusch_HoppingOffset); + LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.enable64QAM = %d\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + (int)RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + pusch_ConfigBasic.enable64QAM); + LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.groupHoppingEnabled = %d\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + (int)RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + ul_ReferenceSignalsPUSCH.groupHoppingEnabled); + LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.groupAssignmentPUSCH = %ld\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); + LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.sequenceHoppingEnabled = %d\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + (int)RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); + LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.cyclicShift = %ld\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. + ul_ReferenceSignalsPUSCH.cyclicShift); + +#if defined(Rel10) || defined(Rel14) + + if (RC.rrc[ctxt_pP->module_id]->carrier[CC_id].MBMS_flag > 0) { + for (i = 0; i < RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.count; i++) { + // SIB 2 + // LOG_D(RRC, "[eNB %d] mbsfn_SubframeConfigList.list.count = %ld\n", enb_mod_idP, RC.rrc[enb_mod_idP].sib2->mbsfn_SubframeConfigList->list.count); + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" SIB13 contents for MBSFN subframe allocation %d/%d(partial)\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + i, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.count); + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" mbsfn_Subframe_pattern is = %x\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0] >> 0); + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" radioframe_allocation_period = %ld (just index number, not the real value)\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod); // need to display the real value, using array of char (like in dumping SIB2) + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" radioframe_allocation_offset = %ld\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset); } - - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" SIB2/3 Contents (partial)\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.n_SB = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. - pusch_ConfigBasic.n_SB); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.hoppingMode = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. - pusch_ConfigBasic.hoppingMode); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.pusch_HoppingOffset = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. - pusch_ConfigBasic.pusch_HoppingOffset); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.enable64QAM = %d\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - (int)eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. - pusch_ConfigBasic.enable64QAM); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.groupHoppingEnabled = %d\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - (int)eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. - ul_ReferenceSignalsPUSCH.groupHoppingEnabled); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.groupAssignmentPUSCH = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. - ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.sequenceHoppingEnabled = %d\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - (int)eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. - ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled); - LOG_T(RRC, PROTOCOL_RRC_CTXT_FMT" pusch_config_common.cyclicShift = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon.pusch_ConfigCommon. - ul_ReferenceSignalsPUSCH.cyclicShift); - -#ifdef Rel10 - - if (eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].MBMS_flag > 0) { - for (i = 0; i < eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.count; i++) { - // SIB 2 - // LOG_D(RRC, "[eNB %d] mbsfn_SubframeConfigList.list.count = %ld\n", enb_mod_idP, eNB_rrc_inst[enb_mod_idP].sib2->mbsfn_SubframeConfigList->list.count); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" SIB13 contents for MBSFN subframe allocation %d/%d(partial)\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - i, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.count); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" mbsfn_Subframe_pattern is = %x\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.array[i]->subframeAllocation.choice.oneFrame.buf[0] >> 0); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" radioframe_allocation_period = %ld (just index number, not the real value)\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationPeriod); // need to display the real value, using array of char (like in dumping SIB2) - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" radioframe_allocation_offset = %ld\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList->list.array[i]->radioframeAllocationOffset); - } - - // SIB13 - for (i = 0; i < eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.count; i++) { - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" SIB13 contents for MBSFN sync area %d/2 (partial)\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - i, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.count); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Repetition Period: %d (just index number, not real value)\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); - LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Offset: %d\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_Offset_r9); - } + + // SIB13 + for (i = 0; i < RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.count; i++) { + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" SIB13 contents for MBSFN sync area %d/%d (partial)\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + i, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.count); + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Repetition Period: %ld (just index number, not real value)\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9); + LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" MCCH Offset: %ld\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib13->mbsfn_AreaInfoList_r9.list.array[i]->mcch_Config_r9.mcch_Offset_r9); } - -#endif - - LOG_D(RRC, - PROTOCOL_RRC_CTXT_FMT" RRC_UE --- MAC_CONFIG_REQ (SIB1.tdd & SIB2 params) ---> MAC_UE\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); - rrc_mac_config_req(ctxt_pP->module_id, CC_id, ENB_FLAG_YES, 0, 0, - (RadioResourceConfigCommonSIB_t *) & - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->radioResourceConfigCommon, - (struct PhysicalConfigDedicated *)NULL, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, -#endif - (MeasObjectToAddMod_t **) NULL, - (MAC_MainConfig_t *) NULL, 0, - (struct LogicalChannelConfig *)NULL, - (MeasGapConfig_t *) NULL, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib1->tdd_Config, - NULL, - &SIwindowsize, &SIperiod, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->freqInfo.ul_CarrierFreq, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->freqInfo.ul_Bandwidth, - &eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->freqInfo.additionalSpectrumEmission, - (MBSFN_SubframeConfigList_t*) eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib2->mbsfn_SubframeConfigList -#ifdef Rel10 - , - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].MBMS_flag, - (MBSFN_AreaInfoList_r9_t*) & eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].sib13->mbsfn_AreaInfoList_r9, - (PMCH_InfoList_r9_t *) NULL -#endif -#ifdef CBA - , 0, //eNB_rrc_inst[ctxt_pP->module_id].num_active_cba_groups, - 0 //eNB_rrc_inst[ctxt_pP->module_id].cba_rnti[0] -#endif - ); - } else { - LOG_E(RRC, PROTOCOL_RRC_CTXT_FMT" init_SI: FATAL, no memory for SIB2/3 allocated\n", - PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); - mac_xface->macphy_exit("[RRC][init_SI] FATAL, no memory for SIB2/3 allocated"); } + else memset((void*)&RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib13,0,sizeof(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib13)); +#endif + + LOG_D(RRC, + PROTOCOL_RRC_CTXT_FMT" RRC_UE --- MAC_CONFIG_REQ (SIB1.tdd & SIB2 params) ---> MAC_UE\n", + PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)); + +#ifdef Rel14 + if ((RC.rrc[ctxt_pP->module_id]->carrier[CC_id].mib.message.schedulingInfoSIB1_BR_r13>0) && + (RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib1_BR!=NULL)) { + AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib1_BR->nonCriticalExtension!=NULL, + "sib2_br->nonCriticalExtension is null (v8.9)\n"); + AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib1_BR->nonCriticalExtension->nonCriticalExtension!=NULL, + "sib2_br->nonCriticalExtension is null (v9.2)\n"); + AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL, + "sib2_br->nonCriticalExtension is null (v11.3)\n"); + AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL, + "sib2_br->nonCriticalExtension is null (v12.5)\n"); + AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension!=NULL, + "sib2_br->nonCriticalExtension is null (v13.10)\n"); + sib1_v13ext = RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib1_BR->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension; + } +#endif + + LOG_D(RRC, "About to call rrc_mac_config_req_eNB\n"); + + rrc_mac_config_req_eNB(ctxt_pP->module_id, CC_id, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].physCellId, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].p_eNB, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Ncp, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib1->freqBandIndicator, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].dl_CarrierFreq, +#ifdef Rel14 + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].pbch_repetition, +#endif + 0, // rnti + (BCCH_BCH_Message_t *) + &RC.rrc[ctxt_pP->module_id]->carrier[CC_id].mib, + (RadioResourceConfigCommonSIB_t *) & + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->radioResourceConfigCommon, +#if defined(Rel14) + (RadioResourceConfigCommonSIB_t *) & + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2_BR->radioResourceConfigCommon, +#endif + (struct PhysicalConfigDedicated *)NULL, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, +#endif + (MeasObjectToAddMod_t **) NULL, + (MAC_MainConfig_t *) NULL, 0, + (struct LogicalChannelConfig *)NULL, + (MeasGapConfig_t *) NULL, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib1->tdd_Config, + NULL, + &RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib1->schedulingInfoList, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].ul_CarrierFreq, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->freqInfo.ul_Bandwidth, + &RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->freqInfo.additionalSpectrumEmission, + (MBSFN_SubframeConfigList_t*) RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib2->mbsfn_SubframeConfigList +#if defined(Rel10) || defined(Rel14) + , + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].MBMS_flag, + (MBSFN_AreaInfoList_r9_t*) & RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sib13->mbsfn_AreaInfoList_r9, + (PMCH_InfoList_r9_t *) NULL +#endif +#ifdef Rel14 + , + sib1_v13ext +#endif + ); } -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) /*------------------------------------------------------------------------------*/ static void init_MCCH( @@ -379,80 +364,86 @@ init_MCCH( int sync_area = 0; // initialize RRC_eNB_INST MCCH entry - eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE = - malloc(eNB_rrc_inst[enb_mod_idP].carrier[CC_id].num_mbsfn_sync_area * sizeof(uint8_t*)); + RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESSAGE = + malloc(RC.rrc[enb_mod_idP]->carrier[CC_id].num_mbsfn_sync_area * sizeof(uint8_t*)); - for (sync_area = 0; sync_area < eNB_rrc_inst[enb_mod_idP].carrier[CC_id].num_mbsfn_sync_area; sync_area++) { + for (sync_area = 0; sync_area < RC.rrc[enb_mod_idP]->carrier[CC_id].num_mbsfn_sync_area; sync_area++) { - eNB_rrc_inst[enb_mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] = 0; - eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE[sync_area] = (uint8_t *) malloc16(32); + RC.rrc[enb_mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] = 0; + RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESSAGE[sync_area] = (uint8_t *) malloc16(32); - if (eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE[sync_area] == NULL) { - LOG_E(RRC, "[eNB %d][MAIN] init_MCCH: FATAL, no memory for MCCH MESSAGE allocated \n", enb_mod_idP); - mac_xface->macphy_exit("[RRC][init_MCCH] not enough memory\n"); - } else { - eNB_rrc_inst[enb_mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] = do_MBSFNAreaConfig(enb_mod_idP, - mac_xface->lte_frame_parms, - sync_area, - (uint8_t *)eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE[sync_area], - &eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch, - &eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message); - - LOG_I(RRC, "mcch message pointer %p for sync area %d \n", - eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESSAGE[sync_area], - sync_area); - LOG_D(RRC, "[eNB %d] MCCH_MESSAGE contents for Sync Area %d (partial)\n", enb_mod_idP, sync_area); - LOG_D(RRC, "[eNB %d] CommonSF_AllocPeriod_r9 %d\n", enb_mod_idP, - eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->commonSF_AllocPeriod_r9); - LOG_D(RRC, - "[eNB %d] CommonSF_Alloc_r9.list.count (number of MBSFN Subframe Pattern) %d\n", - enb_mod_idP, eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->commonSF_Alloc_r9.list.count); - LOG_D(RRC, "[eNB %d] MBSFN Subframe Pattern: %02x (in hex)\n", - enb_mod_idP, - eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->commonSF_Alloc_r9.list.array[0]->subframeAllocation. - choice.oneFrame.buf[0]); - - if (eNB_rrc_inst[enb_mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] == 255) { - mac_xface->macphy_exit("[RRC][init_MCCH] eNB_rrc_inst[enb_mod_idP].carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] == 255"); - } else { - eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MCCH_MESS[sync_area].Active = 1; - } - } + AssertFatal(RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESSAGE[sync_area] != NULL, + "[eNB %d]init_MCCH: FATAL, no memory for MCCH MESSAGE allocated \n", enb_mod_idP); + RC.rrc[enb_mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] = do_MBSFNAreaConfig(enb_mod_idP, + sync_area, + (uint8_t *)RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESSAGE[sync_area], + &RC.rrc[enb_mod_idP]->carrier[CC_id].mcch, + &RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message); + + LOG_I(RRC, "mcch message pointer %p for sync area %d \n", + RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESSAGE[sync_area], + sync_area); + LOG_D(RRC, "[eNB %d] MCCH_MESSAGE contents for Sync Area %d (partial)\n", enb_mod_idP, sync_area); + LOG_D(RRC, "[eNB %d] CommonSF_AllocPeriod_r9 %ld\n", enb_mod_idP, + RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->commonSF_AllocPeriod_r9); + LOG_D(RRC, + "[eNB %d] CommonSF_Alloc_r9.list.count (number of MBSFN Subframe Pattern) %d\n", + enb_mod_idP, RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->commonSF_Alloc_r9.list.count); + LOG_D(RRC, "[eNB %d] MBSFN Subframe Pattern: %02x (in hex)\n", + enb_mod_idP, + RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->commonSF_Alloc_r9.list.array[0]->subframeAllocation. + choice.oneFrame.buf[0]); + + AssertFatal(RC.rrc[enb_mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] != 255, + "RC.rrc[enb_mod_idP]->carrier[CC_id].sizeof_MCCH_MESSAGE[sync_area] == 255"); + RC.rrc[enb_mod_idP]->carrier[CC_id].MCCH_MESS[sync_area].Active = 1; } + - //Set the eNB_rrc_inst[enb_mod_idP].MCCH_MESS.Active to 1 (allow to transfer MCCH message RRC->MAC in function mac_rrc_data_req) + //Set the RC.rrc[enb_mod_idP]->MCCH_MESS.Active to 1 (allow to transfer MCCH message RRC->MAC in function mac_rrc_data_req) // ??Configure MCCH logical channel // call mac_config_req with appropriate structure from ASN.1 description - // LOG_I(RRC, "DUY: serviceID is %d\n",eNB_rrc_inst[enb_mod_idP].mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->tmgi_r9.serviceId_r9.buf[2]); - // LOG_I(RRC, "DUY: session ID is %d\n",eNB_rrc_inst[enb_mod_idP].mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->sessionId_r9->buf[0]); - rrc_mac_config_req(enb_mod_idP, CC_id, ENB_FLAG_YES, 0, 0, - (RadioResourceConfigCommonSIB_t *) NULL, - (struct PhysicalConfigDedicated *)NULL, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, -#endif - (MeasObjectToAddMod_t **) NULL, - (MAC_MainConfig_t *) NULL, - 0, - (struct LogicalChannelConfig *)NULL, - (MeasGapConfig_t *) NULL, - (TDD_Config_t *) NULL, - NULL, (uint8_t *) NULL, (uint16_t *) NULL, NULL, NULL, NULL, (MBSFN_SubframeConfigList_t *) NULL -# ifdef Rel10 - , - 0, - (MBSFN_AreaInfoList_r9_t *) NULL, - (PMCH_InfoList_r9_t *) & (eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->pmch_InfoList_r9) -# endif -# ifdef CBA - , 0, 0 -# endif - ); - //LOG_I(RRC,"DUY: lcid after rrc_mac_config_req is %02d\n",eNB_rrc_inst[enb_mod_idP].mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->logicalChannelIdentity_r9); + // LOG_I(RRC, "DUY: serviceID is %d\n",RC.rrc[enb_mod_idP]->mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->tmgi_r9.serviceId_r9.buf[2]); + // LOG_I(RRC, "DUY: session ID is %d\n",RC.rrc[enb_mod_idP]->mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->sessionId_r9->buf[0]); + rrc_mac_config_req_eNB(enb_mod_idP, CC_id, + 0,0,0,0,0, +#ifdef Rel14 + 0, +#endif + 0,//rnti + (BCCH_BCH_Message_t *)NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + (struct PhysicalConfigDedicated *)NULL, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, +#endif + (MeasObjectToAddMod_t **) NULL, + (MAC_MainConfig_t *) NULL, + 0, + (struct LogicalChannelConfig *)NULL, + (MeasGapConfig_t *) NULL, + (TDD_Config_t *) NULL, + (MobilityControlInfo_t *)NULL, + (SchedulingInfoList_t *) NULL, + 0, NULL, NULL, (MBSFN_SubframeConfigList_t *) NULL +#if defined(Rel10) || defined(Rel14) + , + 0, + (MBSFN_AreaInfoList_r9_t *) NULL, + (PMCH_InfoList_r9_t *) & (RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9) +# endif +# ifdef Rel14 + , + (SystemInformationBlockType1_v1310_IEs_t *)NULL +# endif + ); + + //LOG_I(RRC,"DUY: lcid after rrc_mac_config_req is %02d\n",RC.rrc[enb_mod_idP]->mcch_message->pmch_InfoList_r9.list.array[0]->mbms_SessionInfoList_r9.list.array[0]->logicalChannelIdentity_r9); } @@ -467,7 +458,7 @@ static void init_MBMS( // init the configuration for MTCH protocol_ctxt_t ctxt; - if (eNB_rrc_inst[enb_mod_idP].carrier[CC_id].MBMS_flag > 0) { + if (RC.rrc[enb_mod_idP]->carrier[CC_id].MBMS_flag > 0) { PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, enb_mod_idP, ENB_FLAG_YES, NOT_A_RNTI, frameP, 0,enb_mod_idP); LOG_D(RRC, "[eNB %d] Frame %d : Radio Bearer config request for MBMS\n", enb_mod_idP, frameP); //check the lcid @@ -481,16 +472,16 @@ static void init_MBMS( NULL, // key rrc encryption NULL, // key rrc integrity NULL // key encryption -# ifdef Rel10 - , &(eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->pmch_InfoList_r9) +# if defined(Rel10) || defined(Rel14) + , &(RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9) # endif - ); + ,NULL); rrc_rlc_config_asn1_req(&ctxt, NULL, // SRB_ToAddModList NULL, // DRB_ToAddModList NULL, // DRB_ToReleaseList - &(eNB_rrc_inst[enb_mod_idP].carrier[CC_id].mcch_message->pmch_InfoList_r9)); + &(RC.rrc[enb_mod_idP]->carrier[CC_id].mcch_message->pmch_InfoList_r9)); //rrc_mac_config_req(); } @@ -506,6 +497,7 @@ rrc_eNB_get_next_transaction_identifier( { static uint8_t rrc_transaction_identifier[NUMBER_OF_eNB_MAX]; rrc_transaction_identifier[enb_mod_idP] = (rrc_transaction_identifier[enb_mod_idP] + 1) % RRC_TRANSACTION_IDENTIFIER_NUMBER; + LOG_T(RRC,"generated xid is %d\n",rrc_transaction_identifier[enb_mod_idP]); return rrc_transaction_identifier[enb_mod_idP]; } /*------------------------------------------------------------------------------*/ @@ -527,7 +519,7 @@ rrc_eNB_get_next_transaction_identifier( // AssertFatal(enb_mod_idP < NB_eNB_INST, "eNB index invalid (%d/%d)!", enb_mod_idP, NB_eNB_INST); // // for (i = 0; i < NUMBER_OF_UE_MAX; i++) { -// if (eNB_rrc_inst[enb_mod_idP].Info.UE_list[i] == UE_identity) { +// if (RC.rrc[enb_mod_idP]->Info.UE_list[i] == UE_identity) { // // UE_identity already registered // reg = TRUE; // break; @@ -551,7 +543,7 @@ rrc_eNB_ue_context_random_exist( //----------------------------------------------------------------------------- { struct rrc_eNB_ue_context_s* ue_context_p = NULL; - RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head)) { + RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(RC.rrc[ctxt_pP->module_id]->rrc_ue_head)) { if (ue_context_p->ue_context.random_ue_identity == ue_identityP) return ue_context_p; } @@ -568,12 +560,12 @@ rrc_eNB_ue_context_stmsi_exist( //----------------------------------------------------------------------------- { struct rrc_eNB_ue_context_s* ue_context_p = NULL; - RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head)) { + RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(RC.rrc[ctxt_pP->module_id]->rrc_ue_head)) { LOG_I(RRC,"checking for UE S-TMSI %x, mme %x (%p): rnti %x", m_tmsiP, mme_codeP, ue_context_p, ue_context_p->ue_context.rnti); if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == TRUE) { - printf("S-TMSI %x, MME %x\n", + printf("=> S-TMSI %x, MME %x\n", ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi, ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code); if (ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi == m_tmsiP) @@ -598,21 +590,23 @@ rrc_eNB_get_next_free_ue_context( { struct rrc_eNB_ue_context_s* ue_context_p = NULL; ue_context_p = rrc_eNB_get_ue_context( - &eNB_rrc_inst[ctxt_pP->module_id], - ctxt_pP->rnti); + RC.rrc[ctxt_pP->module_id], + ctxt_pP->rnti); if (ue_context_p == NULL) { - RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head)) { +#if 0 + RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(RC.rrc[ctxt_pP->module_id]->rrc_ue_head)) { if (ue_context_p->ue_context.random_ue_identity == ue_identityP) { LOG_D(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" Cannot create new UE context, already exist rand UE id 0x%x, uid %u\n", + PROTOCOL_RRC_CTXT_UE_FMT" Cannot create new UE context, already exist rand UE id 0x%"PRIx64", uid %u\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_identityP, ue_context_p->local_uid); return NULL; } } - ue_context_p = rrc_eNB_allocate_new_UE_context(&eNB_rrc_inst[ctxt_pP->module_id]); +#endif + ue_context_p = rrc_eNB_allocate_new_UE_context(RC.rrc[ctxt_pP->module_id]); if (ue_context_p == NULL) { LOG_E(RRC, @@ -624,7 +618,7 @@ rrc_eNB_get_next_free_ue_context( ue_context_p->ue_id_rnti = ctxt_pP->rnti; // here ue_id_rnti is just a key, may be something else ue_context_p->ue_context.rnti = ctxt_pP->rnti; // yes duplicate, 1 may be removed ue_context_p->ue_context.random_ue_identity = ue_identityP; - RB_INSERT(rrc_ue_tree_s, &eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head, ue_context_p); + RB_INSERT(rrc_ue_tree_s, &RC.rrc[ctxt_pP->module_id]->rrc_ue_head, ue_context_p); LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Created new UE context uid %u\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), @@ -639,7 +633,7 @@ rrc_eNB_get_next_free_ue_context( } } -#if !defined(ENABLE_USE_MME) +#if 0 //!defined(ENABLE_USE_MME) void rrc_eNB_emulation_notify_ue_module_id( const module_id_t ue_module_idP, const rnti_t rntiP, @@ -654,17 +648,19 @@ void rrc_eNB_emulation_notify_ue_module_id( // find enb_module_id for (enb_module_id = 0; enb_module_id < NUMBER_OF_eNB_MAX; enb_module_id++) { + if(enb_module_id>0){ /*FIX LATER*/ + return; + } for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - if (eNB_rrc_inst[enb_module_id].carrier[CC_id].sib1 != NULL) { + if (&RC.rrc[enb_module_id]->carrier[CC_id].sib1 != NULL) { if ( - (eNB_rrc_inst[enb_module_id].carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[0] == cell_identity_byte0P) && - (eNB_rrc_inst[enb_module_id].carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[1] == cell_identity_byte1P) && - (eNB_rrc_inst[enb_module_id].carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[2] == cell_identity_byte2P) && - (eNB_rrc_inst[enb_module_id].carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[3] == cell_identity_byte3P) + (&RC.rrc[enb_module_id]->carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[0] == cell_identity_byte0P) && + (&RC.rrc[enb_module_id]->carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[1] == cell_identity_byte1P) && + (&RC.rrc[enb_module_id]->carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[2] == cell_identity_byte2P) && + (&RC.rrc[enb_module_id]->carrier[CC_id].sib1->cellAccessRelatedInfo.cellIdentity.buf[3] == cell_identity_byte3P) ) { - oai_emulation.info.eNB_ue_module_id_to_rnti[enb_module_id][ue_module_idP] = rntiP; ue_context_p = rrc_eNB_get_ue_context( - &eNB_rrc_inst[enb_module_id], + RC.rrc[enb_module_id], rntiP ); @@ -672,10 +668,11 @@ void rrc_eNB_emulation_notify_ue_module_id( oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[enb_module_id][ue_context_p->local_uid] = ue_module_idP; } - return; + //return; } } } + oai_emulation.info.eNB_ue_module_id_to_rnti[enb_module_id][ue_module_idP] = rntiP; } AssertFatal(enb_module_id == NUMBER_OF_eNB_MAX, @@ -694,10 +691,10 @@ rrc_eNB_free_mem_UE_context( { int i; LOG_T(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" Clearing UE context 0x%x (free internal structs)\n", + PROTOCOL_RRC_CTXT_UE_FMT" Clearing UE context 0x%p (free internal structs)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_context_pP); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_SCellToAddMod_r10, &ue_context_pP->ue_context.sCell_config[0]); ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_SCellToAddMod_r10, &ue_context_pP->ue_context.sCell_config[1]); #endif @@ -707,11 +704,29 @@ rrc_eNB_free_mem_UE_context( ue_context_pP->ue_context.SRB_configList = NULL; } + for(i = 0;i < RRC_TRANSACTION_IDENTIFIER_NUMBER;i++){ + if (ue_context_pP->ue_context.SRB_configList2[i]) { + free(ue_context_pP->ue_context.SRB_configList2[i]); + ue_context_pP->ue_context.SRB_configList2[i] = NULL; + } + } + if (ue_context_pP->ue_context.DRB_configList) { ASN_STRUCT_FREE(asn_DEF_DRB_ToAddModList, ue_context_pP->ue_context.DRB_configList); ue_context_pP->ue_context.DRB_configList = NULL; } + for(i = 0;i < RRC_TRANSACTION_IDENTIFIER_NUMBER;i++){ + if (ue_context_pP->ue_context.DRB_configList2[i]) { + free(ue_context_pP->ue_context.DRB_configList2[i]); + ue_context_pP->ue_context.DRB_configList2[i] = NULL; + } + if (ue_context_pP->ue_context.DRB_Release_configList2[i]) { + free(ue_context_pP->ue_context.DRB_Release_configList2[i]); + ue_context_pP->ue_context.DRB_Release_configList2[i] = NULL; + } + } + memset(ue_context_pP->ue_context.DRB_active, 0, sizeof(ue_context_pP->ue_context.DRB_active)); if (ue_context_pP->ue_context.physicalConfigDedicated) { @@ -748,10 +763,14 @@ rrc_eNB_free_mem_UE_context( ue_context_pP->ue_context.mac_MainConfig = NULL; } - if (ue_context_pP->ue_context.measGapConfig) { +/* if (ue_context_pP->ue_context.measGapConfig) { ASN_STRUCT_FREE(asn_DEF_MeasGapConfig, ue_context_pP->ue_context.measGapConfig); ue_context_pP->ue_context.measGapConfig = NULL; - } + }*/ + if (ue_context_pP->ue_context.handover_info) { + ASN_STRUCT_FREE(asn_DEF_Handover, ue_context_pP->ue_context.handover_info); + ue_context_pP->ue_context.handover_info = NULL; + } //SRB_INFO SI; //SRB_INFO Srb0; @@ -806,11 +825,16 @@ rrc_eNB_free_UE(const module_id_t enb_mod_idP,const struct rrc_eNB_ue_context_s* (void)ue_module_id; #endif rnti_t rnti = ue_context_pP->ue_context.rnti; - + int i, j , CC_id, pdu_number; + LTE_eNB_ULSCH_t *ulsch = NULL; + LTE_eNB_DLSCH_t *dlsch = NULL; + nfapi_ul_config_request_body_t *ul_req_tmp = NULL; + PHY_VARS_eNB *eNB_PHY = NULL; + eNB_MAC_INST *eNB_MAC = RC.mac[enb_mod_idP]; AssertFatal(enb_mod_idP < NB_eNB_INST, "eNB inst invalid (%d/%d) for UE %x!", enb_mod_idP, NB_eNB_INST, rnti); /* ue_context_p = rrc_eNB_get_ue_context( - &eNB_rrc_inst[enb_mod_idP], + &RC.rrc[enb_mod_idP], rntiP ); */ @@ -819,6 +843,8 @@ rrc_eNB_free_UE(const module_id_t enb_mod_idP,const struct rrc_eNB_ue_context_s* LOG_W(RRC, "[eNB %d] Removing UE RNTI %x\n", enb_mod_idP, rnti); #if defined(ENABLE_USE_MME) + if( ue_context_pP->ue_context.ul_failure_timer >= 8 ) { + LOG_I(RRC, "[eNB %d] S1AP_UE_CONTEXT_RELEASE_REQ RNTI %x\n", enb_mod_idP, rnti); rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(enb_mod_idP, ue_context_pP, S1AP_CAUSE_RADIO_NETWORK, 21); // send cause 21: connection with ue lost /* From 3GPP 36300v10 p129 : 19.2.2.2.2 S1 UE Context Release Request (eNB triggered) * If the E-UTRAN internal reason is a radio link failure detected in the eNB, the eNB shall wait a sufficient time before @@ -826,23 +852,49 @@ rrc_eNB_free_UE(const module_id_t enb_mod_idP,const struct rrc_eNB_ue_context_s* * in order to allow the UE to perform the NAS recovery * procedure, see TS 23.401 [17]. */ -#else -#if defined(OAI_EMU) - AssertFatal(ue_context_pP->local_uid < NUMBER_OF_UE_MAX, "local_uid invalid (%d<%d) for UE %x!", ue_context_pP->local_uid, NUMBER_OF_UE_MAX, rnti); - ue_module_id = oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[enb_mod_idP][ue_context_pP->local_uid]; - AssertFatal(ue_module_id < NUMBER_OF_UE_MAX, "ue_module_id invalid (%d<%d) for UE %x!", ue_module_id, NUMBER_OF_UE_MAX, rnti); - oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[enb_mod_idP][ue_context_pP->local_uid] = -1; - oai_emulation.info.eNB_ue_module_id_to_rnti[enb_mod_idP][ue_module_id] = NOT_A_RNTI; -#endif + return; + } #endif + for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + eNB_PHY = RC.eNB[enb_mod_idP][CC_id]; + for (i=0; iulsch[i]; + if((ulsch != NULL) && (ulsch->rnti == rnti)){ + LOG_I(RRC, "clean_eNb_ulsch UE %x \n", rnti); + clean_eNb_ulsch(ulsch); + } + } + for (i=0; idlsch[i][0]; + if((dlsch != NULL) && (dlsch->rnti == rnti)){ + LOG_I(RRC, "clean_eNb_dlsch UE %x \n", rnti); + clean_eNb_dlsch(dlsch); + } + } + for(j = 0; j < 10; j++){ + ul_req_tmp = &eNB_MAC->UL_req_tmp[CC_id][j].ul_config_request_body; + if(ul_req_tmp){ + pdu_number = ul_req_tmp->number_of_pdus; + for(int pdu_index = pdu_number-1; pdu_index >= 0; pdu_index--){ + if(ul_req_tmp->ul_config_pdu_list[pdu_index].ulsch_pdu.ulsch_pdu_rel8.rnti == rnti){ + LOG_I(RRC, "remove UE %x from ul_config_pdu_list %d/%d\n", rnti, pdu_index, pdu_number); + if(pdu_index < pdu_number -1){ + memcpy(&ul_req_tmp->ul_config_pdu_list[pdu_index], &ul_req_tmp->ul_config_pdu_list[pdu_index+1], (pdu_number-1-pdu_index) * sizeof(nfapi_ul_config_request_pdu_t)); + } + ul_req_tmp->number_of_pdus--; + } + } + } + } + } rrc_mac_remove_ue(enb_mod_idP,rnti); rrc_rlc_remove_ue(&ctxt); pdcp_remove_UE(&ctxt); rrc_eNB_remove_ue_context( &ctxt, - &eNB_rrc_inst[enb_mod_idP], + RC.rrc[enb_mod_idP], (struct rrc_eNB_ue_context_s*) ue_context_pP); } } @@ -851,15 +903,16 @@ rrc_eNB_free_UE(const module_id_t enb_mod_idP,const struct rrc_eNB_ue_context_s* void rrc_eNB_process_RRCConnectionSetupComplete( const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP, + rrc_eNB_ue_context_t* ue_context_pP, RRCConnectionSetupComplete_r8_IEs_t * rrcConnectionSetupComplete ) //----------------------------------------------------------------------------- { LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel UL-DCCH, " "processing RRCConnectionSetupComplete from UE\n", + PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel UL-DCCH, " "processing RRCConnectionSetupComplete from UE (SRB1 Active)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + ue_context_pP->ue_context.Srb1.Active=1; T(T_ENB_RRC_CONNECTION_SETUP_COMPLETE, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); @@ -1018,15 +1071,15 @@ rrc_eNB_generate_RRCConnectionReject( T(T_ENB_RRC_CONNECTION_REJECT, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size = + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size = do_RRCConnectionReject(ctxt_pP->module_id, - (uint8_t*) eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.Payload); + (uint8_t*) RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload); #ifdef RRC_MSG_PRINT LOG_F(RRC,"[MSG] RRCConnectionReject\n"); - for (cnt = 0; cnt < eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { - LOG_F(RRC,"%02x ", ((uint8_t*)eNB_rrc_inst[ctxt_pP->module_id].Srb0.Tx_buffer.Payload)[cnt]); + for (cnt = 0; cnt < RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { + LOG_F(RRC,"%02x ", ((uint8_t*)RC.rrc[ctxt_pP->module_id]->Srb0.Tx_buffer.Payload)[cnt]); } LOG_F(RRC,"\n"); @@ -1035,17 +1088,754 @@ rrc_eNB_generate_RRCConnectionReject( MSC_LOG_TX_MESSAGE( MSC_RRC_ENB, MSC_RRC_UE, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.Header, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Header, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size, MSC_AS_TIME_FMT" RRCConnectionReject UE %x size %u", MSC_AS_TIME_ARGS(ctxt_pP), ue_context_pP == NULL ? -1 : ue_context_pP->ue_context.rnti, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size); LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel DL-CCCH, Generating RRCConnectionReject (bytes %d)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size); +} + +//----------------------------------------------------------------------------- +void +rrc_eNB_generate_RRCConnectionReestablishment( + const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const int CC_id +) +//----------------------------------------------------------------------------- +{ + LogicalChannelConfig_t *SRB1_logicalChannelConfig; + SRB_ToAddModList_t **SRB_configList; + SRB_ToAddMod_t *SRB1_config; + int cnt; + + T(T_ENB_RRC_CONNECTION_REESTABLISHMENT, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), + T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); + + SRB_configList = &ue_context_pP->ue_context.SRB_configList; + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size = + do_RRCConnectionReestablishment(ctxt_pP, + ue_context_pP, + CC_id, + (uint8_t*) RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload, + (uint8_t) RC.rrc[ctxt_pP->module_id]->carrier[CC_id].p_eNB, //at this point we do not have the UE capability information, so it can only be TM1 or TM2 + rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), + SRB_configList, + &ue_context_pP->ue_context.physicalConfigDedicated); + +#ifdef RRC_MSG_PRINT + LOG_F(RRC,"[MSG] RRCConnectionReestablishment\n"); + + for (cnt = 0; cnt < RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { + LOG_F(RRC,"%02x ", ((uint8_t*)RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload)[cnt]); + } + + LOG_F(RRC,"\n"); +#endif + + // configure SRB1 for UE + + if (*SRB_configList != NULL) { + for (cnt = 0; cnt < (*SRB_configList)->list.count; cnt++) { + if ((*SRB_configList)->list.array[cnt]->srb_Identity == 1) { + SRB1_config = (*SRB_configList)->list.array[cnt]; + + if (SRB1_config->logicalChannelConfig) { + if (SRB1_config->logicalChannelConfig->present == + SRB_ToAddMod__logicalChannelConfig_PR_explicitValue) { + SRB1_logicalChannelConfig = &SRB1_config->logicalChannelConfig->choice.explicitValue; + } else { + SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; + } + } else { + SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; + } + + LOG_D(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (SRB1) ---> MAC_eNB\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + rrc_mac_config_req_eNB(ctxt_pP->module_id, + ue_context_pP->ue_context.primaryCC_id, + 0,0,0,0,0, +#ifdef Rel14 + 0, +#endif + ctxt_pP->rnti, + (BCCH_BCH_Message_t *) NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + (struct PhysicalConfigDedicated* ) ue_context_pP->ue_context.physicalConfigDedicated, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, +#endif + (MeasObjectToAddMod_t **) NULL, + ue_context_pP->ue_context.mac_MainConfig, + 1, + SRB1_logicalChannelConfig, + ue_context_pP->ue_context.measGapConfig, + (TDD_Config_t *) NULL, + NULL, + (SchedulingInfoList_t *) NULL, + 0, NULL, NULL, (MBSFN_SubframeConfigList_t *) NULL +#if defined(Rel10) || defined(Rel14) + , 0, (MBSFN_AreaInfoList_r9_t *) NULL, (PMCH_InfoList_r9_t *) NULL +#endif +#ifdef Rel14 + ,(SystemInformationBlockType1_v1310_IEs_t *)NULL +#endif + ); + break; + } + } + } + + MSC_LOG_TX_MESSAGE(MSC_RRC_ENB, + MSC_RRC_UE, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Header, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size, + MSC_AS_TIME_FMT" RRCConnectionReestablishment UE %x size %u", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_context.rnti, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size); + + + LOG_I(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel DL-CCCH, Generating RRCConnectionReestablishment (bytes %d)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size); + + // activate release timer, if RRCComplete not received after 10 frames, remove UE + //ue_context_pP->ue_context.ue_release_timer = 1; + // remove UE after 10 frames after RRCConnectionReestablishmentRelease is triggered + //ue_context_pP->ue_context.ue_release_timer_thres = 100; + // activate release timer, if RRCComplete not received after 100 frames, remove UE + int UE_id = find_UE_id(ctxt_pP->module_id, ctxt_pP->rnti); + RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 1; + // remove UE after 100 frames after RRCConnectionReestablishmentRelease is triggered + RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer_thres = 1000; +} + +//----------------------------------------------------------------------------- +void +rrc_eNB_process_RRCConnectionReestablishmentComplete( + const protocol_ctxt_t* const ctxt_pP, + const rnti_t const reestablish_rnti, + rrc_eNB_ue_context_t* ue_context_pP, + const uint8_t xid, + RRCConnectionReestablishmentComplete_r8_IEs_t * rrcConnectionReestablishmentComplete +) +//----------------------------------------------------------------------------- +{ + LOG_I(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel UL-DCCH, processing RRCConnectionReestablishmentComplete from UE (SRB1 Active)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + + T(T_ENB_RRC_CONNECTION_REESTABLISHMENT_COMPLETE, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), + T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); + + DRB_ToAddModList_t* DRB_configList = ue_context_pP->ue_context.DRB_configList; + SRB_ToAddModList_t* SRB_configList = ue_context_pP->ue_context.SRB_configList; + SRB_ToAddModList_t** SRB_configList2 = NULL; + DRB_ToAddModList_t** DRB_configList2 = NULL; + struct SRB_ToAddMod *SRB2_config = NULL; + struct DRB_ToAddMod *DRB_config = NULL; + int i = 0; +# if defined(ENABLE_USE_MME) + int j = 0; + hashtable_rc_t h_rc; +#endif + uint8_t buffer[RRC_BUF_SIZE]; + uint16_t size; + MeasObjectToAddModList_t *MeasObj_list = NULL; + MeasObjectToAddMod_t *MeasObj = NULL; + ReportConfigToAddModList_t *ReportConfig_list = NULL; + ReportConfigToAddMod_t *ReportConfig_per, *ReportConfig_A1, + *ReportConfig_A2, *ReportConfig_A3, *ReportConfig_A4, *ReportConfig_A5; + MeasIdToAddModList_t *MeasId_list = NULL; + MeasIdToAddMod_t *MeasId0, *MeasId1, *MeasId2, *MeasId3, *MeasId4, *MeasId5; + RSRP_Range_t *rsrp = NULL; + struct MeasConfig__speedStatePars *Sparams = NULL; + QuantityConfig_t *quantityConfig = NULL; + CellsToAddMod_t *CellToAdd = NULL; + CellsToAddModList_t *CellsToAddModList = NULL; + struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; + DedicatedInfoNAS_t *dedicatedInfoNas = NULL; + /* for no gcc warnings */ + (void)dedicatedInfoNas; + C_RNTI_t *cba_RNTI = NULL; + uint8_t next_xid = rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); + + ue_context_pP->ue_context.Status = RRC_CONNECTED; + + SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[xid]; + // get old configuration of SRB2 + if (*SRB_configList2 != NULL) { + LOG_D(RRC, "SRB_configList2(%p) count is %d\n SRB_configList2->list.array[0] addr is %p", + SRB_configList2, (*SRB_configList2)->list.count, (*SRB_configList2)->list.array[0]); + for (i = 0; (i < (*SRB_configList2)->list.count) && (i < 3); i++) { + if ((*SRB_configList2)->list.array[i]->srb_Identity == 2 ){ + LOG_D(RRC, "get SRB2_config from (ue_context_pP->ue_context.SRB_configList2[%d])\n", xid); + SRB2_config = (*SRB_configList2)->list.array[i]; + break; + } + } + } + SRB_configList2 = &ue_context_pP->ue_context.SRB_configList2[next_xid]; + DRB_configList2 = &ue_context_pP->ue_context.DRB_configList2[next_xid]; + + if (*SRB_configList2) { + free(*SRB_configList2); + LOG_D(RRC, "free(ue_context_pP->ue_context.SRB_configList2[%d])\n", next_xid); + } + *SRB_configList2 = CALLOC(1, sizeof(**SRB_configList2)); + if (SRB2_config != NULL) { + // Add SRB2 to SRB configuration list + + ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config); + ASN_SEQUENCE_ADD(&(*SRB_configList2)->list, SRB2_config); + + LOG_D(RRC, "Add SRB2_config (srb_Identity:%ld) to ue_context_pP->ue_context.SRB_configList\n", + SRB2_config->srb_Identity); + LOG_D(RRC, "Add SRB2_config (srb_Identity:%ld) to ue_context_pP->ue_context.SRB_configList2[%d]\n", + SRB2_config->srb_Identity, next_xid); + } else { + // SRB configuration list only contains SRB1. + LOG_W(RRC,"SRB2 configuration does not exist in SRB configuration list\n"); + } + + + + if (*DRB_configList2) { + free(*DRB_configList2); + LOG_D(RRC, "free(ue_context_pP->ue_context.DRB_configList2[%d])\n", next_xid); + } + *DRB_configList2 = CALLOC(1, sizeof(**DRB_configList2)); + + if (DRB_configList != NULL) { + LOG_D(RRC, "get DRB_config from (ue_context_pP->ue_context.DRB_configList)\n"); + for (i = 0; (i < DRB_configList->list.count) && (i < 3); i++) { + DRB_config = DRB_configList->list.array[i]; + + // Add DRB to DRB configuration list, for RRCConnectionReconfigurationComplete + ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config); + } + } + ue_context_pP->ue_context.Srb1.Active = 1; + //ue_context_pP->ue_context.Srb2.Srb_info.Srb_id = 2; + +# if defined(ENABLE_USE_MME) + rrc_ue_s1ap_ids_t* rrc_ue_s1ap_ids_p = NULL; + uint16_t ue_initial_id = ue_context_pP->ue_context.ue_initial_id; + uint32_t eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id; + eNB_RRC_INST *rrc_instance_p = RC.rrc[ENB_INSTANCE_TO_MODULE_ID(ctxt_pP->instance)]; + if (eNB_ue_s1ap_id > 0) { + h_rc = hashtable_get(rrc_instance_p->s1ap_id2_s1ap_ids, (hash_key_t)eNB_ue_s1ap_id, (void**)&rrc_ue_s1ap_ids_p); + if (h_rc == HASH_TABLE_OK) { + rrc_ue_s1ap_ids_p->ue_rnti = ctxt_pP->rnti; + } + } + if (ue_initial_id != 0) { + h_rc = hashtable_get(rrc_instance_p->initial_id2_s1ap_ids, (hash_key_t)ue_initial_id, (void**)&rrc_ue_s1ap_ids_p); + if (h_rc == HASH_TABLE_OK) { + rrc_ue_s1ap_ids_p->ue_rnti = ctxt_pP->rnti; + } + } + + gtpv1u_enb_create_tunnel_req_t create_tunnel_req; + + /* Save e RAB information for later */ + memset(&create_tunnel_req, 0 , sizeof(create_tunnel_req)); + + for (j = 0, i = 0; i < NB_RB_MAX; i++) { + if (ue_context_pP->ue_context.e_rab[i].status == E_RAB_STATUS_ESTABLISHED) { + create_tunnel_req.eps_bearer_id[j] = ue_context_pP->ue_context.e_rab[i].param.e_rab_id; + create_tunnel_req.sgw_S1u_teid[j] = ue_context_pP->ue_context.e_rab[i].param.gtp_teid; + + memcpy(&create_tunnel_req.sgw_addr[j], + &ue_context_pP->ue_context.e_rab[i].param.sgw_addr, + sizeof(transport_layer_addr_t)); + j++; + } + } + + create_tunnel_req.rnti = ctxt_pP->rnti; // warning put zero above + create_tunnel_req.num_tunnels = j; + + gtpv1u_update_s1u_tunnel( + ctxt_pP->instance, + &create_tunnel_req, + reestablish_rnti); +#endif + /* Update RNTI in ue_context */ + ue_context_pP->ue_id_rnti = ctxt_pP->rnti; // here ue_id_rnti is just a key, may be something else + ue_context_pP->ue_context.rnti = ctxt_pP->rnti; +# if defined(ENABLE_USE_MME) + uint8_t send_security_mode_command = FALSE; + rrc_pdcp_config_security( + ctxt_pP, + ue_context_pP, + send_security_mode_command); + LOG_D(RRC, "set security successfully \n"); +#endif + // Measurement ID list + MeasId_list = CALLOC(1, sizeof(*MeasId_list)); + memset((void *)MeasId_list, 0, sizeof(*MeasId_list)); + + MeasId0 = CALLOC(1, sizeof(*MeasId0)); + MeasId0->measId = 1; + MeasId0->measObjectId = 1; + MeasId0->reportConfigId = 1; + ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId0); + + MeasId1 = CALLOC(1, sizeof(*MeasId1)); + MeasId1->measId = 2; + MeasId1->measObjectId = 1; + MeasId1->reportConfigId = 2; + ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId1); + + MeasId2 = CALLOC(1, sizeof(*MeasId2)); + MeasId2->measId = 3; + MeasId2->measObjectId = 1; + MeasId2->reportConfigId = 3; + ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId2); + + MeasId3 = CALLOC(1, sizeof(*MeasId3)); + MeasId3->measId = 4; + MeasId3->measObjectId = 1; + MeasId3->reportConfigId = 4; + ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId3); + + MeasId4 = CALLOC(1, sizeof(*MeasId4)); + MeasId4->measId = 5; + MeasId4->measObjectId = 1; + MeasId4->reportConfigId = 5; + ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId4); + + MeasId5 = CALLOC(1, sizeof(*MeasId5)); + MeasId5->measId = 6; + MeasId5->measObjectId = 1; + MeasId5->reportConfigId = 6; + ASN_SEQUENCE_ADD(&MeasId_list->list, MeasId5); + + // rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measIdToAddModList = MeasId_list; + + // Add one EUTRA Measurement Object + MeasObj_list = CALLOC(1, sizeof(*MeasObj_list)); + memset((void *)MeasObj_list, 0, sizeof(*MeasObj_list)); + + // Configure MeasObject + + MeasObj = CALLOC(1, sizeof(*MeasObj)); + memset((void *)MeasObj, 0, sizeof(*MeasObj)); + + MeasObj->measObjectId = 1; + MeasObj->measObject.present = MeasObjectToAddMod__measObject_PR_measObjectEUTRA; + MeasObj->measObject.choice.measObjectEUTRA.carrierFreq = 3350; //band 7, 2.68GHz + //MeasObj->measObject.choice.measObjectEUTRA.carrierFreq = 36090; //band 33, 1.909GHz + MeasObj->measObject.choice.measObjectEUTRA.allowedMeasBandwidth = AllowedMeasBandwidth_mbw25; + MeasObj->measObject.choice.measObjectEUTRA.presenceAntennaPort1 = 1; + MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.buf = CALLOC(1, sizeof(uint8_t)); + MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.buf[0] = 0; + MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.size = 1; + MeasObj->measObject.choice.measObjectEUTRA.neighCellConfig.bits_unused = 6; + MeasObj->measObject.choice.measObjectEUTRA.offsetFreq = NULL; // Default is 15 or 0dB + + MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList = + (CellsToAddModList_t *) CALLOC(1, sizeof(*CellsToAddModList)); + + CellsToAddModList = MeasObj->measObject.choice.measObjectEUTRA.cellsToAddModList; + + // Add adjacent cell lists (6 per eNB) + for (i = 0; i < 6; i++) { + CellToAdd = (CellsToAddMod_t *) CALLOC(1, sizeof(*CellToAdd)); + CellToAdd->cellIndex = i + 1; + CellToAdd->physCellId = get_adjacent_cell_id(ctxt_pP->module_id, i); + CellToAdd->cellIndividualOffset = Q_OffsetRange_dB0; + + ASN_SEQUENCE_ADD(&CellsToAddModList->list, CellToAdd); + } + + ASN_SEQUENCE_ADD(&MeasObj_list->list, MeasObj); + // rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->measObjectToAddModList = MeasObj_list; + + // Report Configurations for periodical, A1-A5 events + ReportConfig_list = CALLOC(1, sizeof(*ReportConfig_list)); + + ReportConfig_per = CALLOC(1, sizeof(*ReportConfig_per)); + + ReportConfig_A1 = CALLOC(1, sizeof(*ReportConfig_A1)); + + ReportConfig_A2 = CALLOC(1, sizeof(*ReportConfig_A2)); + + ReportConfig_A3 = CALLOC(1, sizeof(*ReportConfig_A3)); + + ReportConfig_A4 = CALLOC(1, sizeof(*ReportConfig_A4)); + + ReportConfig_A5 = CALLOC(1, sizeof(*ReportConfig_A5)); + + ReportConfig_per->reportConfigId = 1; + ReportConfig_per->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; + ReportConfig_per->reportConfig.choice.reportConfigEUTRA.triggerType.present = + ReportConfigEUTRA__triggerType_PR_periodical; + ReportConfig_per->reportConfig.choice.reportConfigEUTRA.triggerType.choice.periodical.purpose = + ReportConfigEUTRA__triggerType__periodical__purpose_reportStrongestCells; + ReportConfig_per->reportConfig.choice.reportConfigEUTRA.triggerQuantity = ReportConfigEUTRA__triggerQuantity_rsrp; + ReportConfig_per->reportConfig.choice.reportConfigEUTRA.reportQuantity = ReportConfigEUTRA__reportQuantity_both; + ReportConfig_per->reportConfig.choice.reportConfigEUTRA.maxReportCells = 2; + ReportConfig_per->reportConfig.choice.reportConfigEUTRA.reportInterval = ReportInterval_ms120; + ReportConfig_per->reportConfig.choice.reportConfigEUTRA.reportAmount = ReportConfigEUTRA__reportAmount_infinity; + + ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_per); + + ReportConfig_A1->reportConfigId = 2; + ReportConfig_A1->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.triggerType.present = + ReportConfigEUTRA__triggerType_PR_event; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.present = + ReportConfigEUTRA__triggerType__event__eventId_PR_eventA1; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice.eventA1. + a1_Threshold.present = ThresholdEUTRA_PR_threshold_RSRP; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice.eventA1. + a1_Threshold.choice.threshold_RSRP = 10; + + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.triggerQuantity = ReportConfigEUTRA__triggerQuantity_rsrp; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.reportQuantity = ReportConfigEUTRA__reportQuantity_both; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.maxReportCells = 2; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.reportInterval = ReportInterval_ms120; + ReportConfig_A1->reportConfig.choice.reportConfigEUTRA.reportAmount = ReportConfigEUTRA__reportAmount_infinity; + + ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_A1); + + if (RC.rrc[ctxt_pP->module_id]->HO_flag == 1 /*HO_MEASURMENT */ ) { + LOG_I(RRC, "[eNB %d] frame %d: requesting A2, A3, A4, A5, and A6 event reporting\n", + ctxt_pP->module_id, ctxt_pP->frame); + ReportConfig_A2->reportConfigId = 3; + ReportConfig_A2->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.triggerType.present = + ReportConfigEUTRA__triggerType_PR_event; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.present = + ReportConfigEUTRA__triggerType__event__eventId_PR_eventA2; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA2.a2_Threshold.present = ThresholdEUTRA_PR_threshold_RSRP; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA2.a2_Threshold.choice.threshold_RSRP = 10; + + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.triggerQuantity = + ReportConfigEUTRA__triggerQuantity_rsrp; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.reportQuantity = ReportConfigEUTRA__reportQuantity_both; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.maxReportCells = 2; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.reportInterval = ReportInterval_ms120; + ReportConfig_A2->reportConfig.choice.reportConfigEUTRA.reportAmount = ReportConfigEUTRA__reportAmount_infinity; + + ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_A2); + + ReportConfig_A3->reportConfigId = 4; + ReportConfig_A3->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.present = + ReportConfigEUTRA__triggerType_PR_event; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.present = + ReportConfigEUTRA__triggerType__event__eventId_PR_eventA3; + + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice.eventA3.a3_Offset = 1; //10; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA3.reportOnLeave = 1; + + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerQuantity = + ReportConfigEUTRA__triggerQuantity_rsrp; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.reportQuantity = ReportConfigEUTRA__reportQuantity_both; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.maxReportCells = 2; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.reportInterval = ReportInterval_ms120; + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.reportAmount = ReportConfigEUTRA__reportAmount_infinity; + + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.hysteresis = 0.5; // FIXME ...hysteresis is of type long! + ReportConfig_A3->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.timeToTrigger = + TimeToTrigger_ms40; + ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_A3); + + ReportConfig_A4->reportConfigId = 5; + ReportConfig_A4->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.triggerType.present = + ReportConfigEUTRA__triggerType_PR_event; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.present = + ReportConfigEUTRA__triggerType__event__eventId_PR_eventA4; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA4.a4_Threshold.present = ThresholdEUTRA_PR_threshold_RSRP; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA4.a4_Threshold.choice.threshold_RSRP = 10; + + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.triggerQuantity = + ReportConfigEUTRA__triggerQuantity_rsrp; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.reportQuantity = ReportConfigEUTRA__reportQuantity_both; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.maxReportCells = 2; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.reportInterval = ReportInterval_ms120; + ReportConfig_A4->reportConfig.choice.reportConfigEUTRA.reportAmount = ReportConfigEUTRA__reportAmount_infinity; + + ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_A4); + + ReportConfig_A5->reportConfigId = 6; + ReportConfig_A5->reportConfig.present = ReportConfigToAddMod__reportConfig_PR_reportConfigEUTRA; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.present = + ReportConfigEUTRA__triggerType_PR_event; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.present = + ReportConfigEUTRA__triggerType__event__eventId_PR_eventA5; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA5.a5_Threshold1.present = ThresholdEUTRA_PR_threshold_RSRP; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA5.a5_Threshold2.present = ThresholdEUTRA_PR_threshold_RSRP; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA5.a5_Threshold1.choice.threshold_RSRP = 10; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerType.choice.event.eventId.choice. + eventA5.a5_Threshold2.choice.threshold_RSRP = 10; + + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.triggerQuantity = + ReportConfigEUTRA__triggerQuantity_rsrp; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.reportQuantity = ReportConfigEUTRA__reportQuantity_both; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.maxReportCells = 2; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.reportInterval = ReportInterval_ms120; + ReportConfig_A5->reportConfig.choice.reportConfigEUTRA.reportAmount = ReportConfigEUTRA__reportAmount_infinity; + + ASN_SEQUENCE_ADD(&ReportConfig_list->list, ReportConfig_A5); + // rrcConnectionReconfiguration->criticalExtensions.choice.c1.choice.rrcConnectionReconfiguration_r8.measConfig->reportConfigToAddModList = ReportConfig_list; + + rsrp = CALLOC(1, sizeof(RSRP_Range_t)); + *rsrp = 20; + + Sparams = CALLOC(1, sizeof(*Sparams)); + Sparams->present = MeasConfig__speedStatePars_PR_setup; + Sparams->choice.setup.timeToTrigger_SF.sf_High = SpeedStateScaleFactors__sf_Medium_oDot75; + Sparams->choice.setup.timeToTrigger_SF.sf_Medium = SpeedStateScaleFactors__sf_High_oDot5; + Sparams->choice.setup.mobilityStateParameters.n_CellChangeHigh = 10; + Sparams->choice.setup.mobilityStateParameters.n_CellChangeMedium = 5; + Sparams->choice.setup.mobilityStateParameters.t_Evaluation = MobilityStateParameters__t_Evaluation_s60; + Sparams->choice.setup.mobilityStateParameters.t_HystNormal = MobilityStateParameters__t_HystNormal_s120; + + quantityConfig = CALLOC(1, sizeof(*quantityConfig)); + memset((void *)quantityConfig, 0, sizeof(*quantityConfig)); + quantityConfig->quantityConfigEUTRA = CALLOC(1, sizeof(struct QuantityConfigEUTRA)); + memset((void *)quantityConfig->quantityConfigEUTRA, 0, sizeof(*quantityConfig->quantityConfigEUTRA)); + quantityConfig->quantityConfigCDMA2000 = NULL; + quantityConfig->quantityConfigGERAN = NULL; + quantityConfig->quantityConfigUTRA = NULL; + quantityConfig->quantityConfigEUTRA->filterCoefficientRSRP = + CALLOC(1, sizeof(*(quantityConfig->quantityConfigEUTRA->filterCoefficientRSRP))); + quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ = + CALLOC(1, sizeof(*(quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ))); + *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRP = FilterCoefficient_fc4; + *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ = FilterCoefficient_fc4; + + LOG_I(RRC, + "[eNB %d] Frame %d: potential handover preparation: store the information in an intermediate structure in case of failure\n", + ctxt_pP->module_id, ctxt_pP->frame); + // store the information in an intermediate structure for Hanodver management + //rrc_inst->handover_info.as_config.sourceRadioResourceConfig.srb_ToAddModList = CALLOC(1,sizeof()); + ue_context_pP->ue_context.handover_info = CALLOC(1, sizeof(*(ue_context_pP->ue_context.handover_info))); + //memcpy((void *)rrc_inst->handover_info[ue_mod_idP]->as_config.sourceRadioResourceConfig.srb_ToAddModList,(void *)SRB_list,sizeof(SRB_ToAddModList_t)); + ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.srb_ToAddModList = *SRB_configList2; + //memcpy((void *)rrc_inst->handover_info[ue_mod_idP]->as_config.sourceRadioResourceConfig.drb_ToAddModList,(void *)DRB_list,sizeof(DRB_ToAddModList_t)); + ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.drb_ToAddModList = DRB_configList; + ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.drb_ToReleaseList = NULL; + ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.mac_MainConfig = + CALLOC(1, sizeof(*ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.mac_MainConfig)); + memcpy((void*)ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.mac_MainConfig, + (void *)ue_context_pP->ue_context.mac_MainConfig, sizeof(MAC_MainConfig_t)); + ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.physicalConfigDedicated = + CALLOC(1, sizeof(PhysicalConfigDedicated_t)); + memcpy((void*)ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.physicalConfigDedicated, + (void*)ue_context_pP->ue_context.physicalConfigDedicated, sizeof(PhysicalConfigDedicated_t)); + ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.sps_Config = NULL; + //memcpy((void *)rrc_inst->handover_info[ue_mod_idP]->as_config.sourceRadioResourceConfig.sps_Config,(void *)rrc_inst->sps_Config[ue_mod_idP],sizeof(SPS_Config_t)); + + } + +#ifdef CBA + //struct PUSCH_CBAConfigDedicated_vlola *pusch_CBAConfigDedicated_vlola; + uint8_t *cba_RNTI_buf; + cba_RNTI = CALLOC(1, sizeof(C_RNTI_t)); + cba_RNTI_buf = CALLOC(1, 2 * sizeof(uint8_t)); + cba_RNTI->buf = cba_RNTI_buf; + cba_RNTI->size = 2; + cba_RNTI->bits_unused = 0; + + // associate UEs to the CBa groups as a function of their UE id + if (rrc_inst->num_active_cba_groups) { + cba_RNTI->buf[0] = rrc_inst->cba_rnti[ue_mod_idP % rrc_inst->num_active_cba_groups] & 0xff; + cba_RNTI->buf[1] = 0xff; + LOG_D(RRC, + "[eNB %d] Frame %d: cba_RNTI = %x in group %d is attribued to UE %d\n", + enb_mod_idP, frameP, + rrc_inst->cba_rnti[ue_mod_idP % rrc_inst->num_active_cba_groups], + ue_mod_idP % rrc_inst->num_active_cba_groups, ue_mod_idP); + } else { + cba_RNTI->buf[0] = 0x0; + cba_RNTI->buf[1] = 0x0; + LOG_D(RRC, "[eNB %d] Frame %d: no cba_RNTI is configured for UE %d\n", enb_mod_idP, frameP, ue_mod_idP); + } + +#endif + +#if defined(ENABLE_ITTI) + /* Initialize NAS list */ + dedicatedInfoNASList = CALLOC(1, sizeof(struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList)); + + /* Add all NAS PDUs to the list */ + for (i = 0; i < ue_context_pP->ue_context.nb_of_e_rabs; i++) { + if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { + dedicatedInfoNas = CALLOC(1, sizeof(DedicatedInfoNAS_t)); + memset(dedicatedInfoNas, 0, sizeof(OCTET_STRING_t)); + OCTET_STRING_fromBuf(dedicatedInfoNas, + (char*)ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer, + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length); + LOG_D(RRC, "Add dedicatedInfoNas(%d) to dedicatedInfoNASList\n", i); + ASN_SEQUENCE_ADD(&dedicatedInfoNASList->list, dedicatedInfoNas); + } + + /* TODO parameters yet to process ... */ + { + // ue_context_pP->ue_context.e_rab[i].param.qos; + // ue_context_pP->ue_context.e_rab[i].param.sgw_addr; + // ue_context_pP->ue_context.e_rab[i].param.gtp_teid; + } + + /* TODO should test if e RAB are Ok before! */ + ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; + LOG_D(RRC, "setting the status for the default DRB (index %d) to (%d,%s)\n", + i, ue_context_pP->ue_context.e_rab[i].status, "E_RAB_STATUS_DONE"); + } + + /* If list is empty free the list and reset the address */ + if (dedicatedInfoNASList->list.count == 0) { + free(dedicatedInfoNASList); + dedicatedInfoNASList = NULL; + } + +#endif + + // send RRCConnectionReconfiguration + memset(buffer, 0, RRC_BUF_SIZE); + + size = do_RRCConnectionReconfiguration(ctxt_pP, + buffer, + next_xid, //Transaction_id, + (SRB_ToAddModList_t*)*SRB_configList2, // SRB_configList + (DRB_ToAddModList_t*)DRB_configList, + (DRB_ToReleaseList_t*)NULL, // DRB2_list, + (struct SPS_Config*)NULL, // maybe ue_context_pP->ue_context.sps_Config, + (struct PhysicalConfigDedicated*)ue_context_pP->ue_context.physicalConfigDedicated, +#ifdef EXMIMO_IOT + NULL, NULL, NULL,NULL, +#else + (MeasObjectToAddModList_t*)MeasObj_list, // MeasObj_list, + (ReportConfigToAddModList_t*)ReportConfig_list, // ReportConfig_list, + (QuantityConfig_t*)quantityConfig, //quantityConfig, + (MeasIdToAddModList_t*)NULL, +#endif + (MAC_MainConfig_t*)ue_context_pP->ue_context.mac_MainConfig, + (MeasGapConfig_t*)NULL, + (MobilityControlInfo_t*)NULL, + (struct MeasConfig__speedStatePars*)Sparams, // Sparams, + (RSRP_Range_t*)rsrp, // rsrp, + (C_RNTI_t*)cba_RNTI, // cba_RNTI + (struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList*)dedicatedInfoNASList //dedicatedInfoNASList +#if defined(Rel10) || defined(Rel14) + , (SCellToAddMod_r10_t*)NULL +#endif + ); + +#ifdef RRC_MSG_PRINT + LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); + for (i = 0; i < size; i++) { + LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); + } + LOG_F(RRC,"\n"); + //////////////////////////////////////// +#endif + +#if defined(ENABLE_ITTI) + + /* Free all NAS PDUs */ + for (i = 0; i < ue_context_pP->ue_context.nb_of_e_rabs; i++) { + if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { + /* Free the NAS PDU buffer and invalidate it */ + free(ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer); + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer = NULL; + } + } + +#endif + + LOG_I(RRC, + "[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCConnectionReconfiguration (bytes %d, UE id %x)\n", + ctxt_pP->module_id, ctxt_pP->frame, size, ue_context_pP->ue_context.rnti); + + LOG_D(RRC, + "[FRAME %05d][RRC_eNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcConnectionReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n", + ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_eNB_mui, ctxt_pP->module_id, DCCH); + + MSC_LOG_TX_MESSAGE( + MSC_RRC_ENB, + MSC_RRC_UE, + buffer, + size, + MSC_AS_TIME_FMT" rrcConnectionReconfiguration UE %x MUI %d size %u", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_context.rnti, + rrc_eNB_mui, + size); + + rrc_data_req( + ctxt_pP, + DCCH, + rrc_eNB_mui++, + SDU_CONFIRM_NO, + size, + buffer, + PDCP_TRANSMISSION_MODE_CONTROL); + + // delete UE data of prior RNTI. UE use current RNTI. + protocol_ctxt_t ctxt_prior = *ctxt_pP; + ctxt_prior.rnti = reestablish_rnti; + + LTE_eNB_ULSCH_t *ulsch = NULL; + nfapi_ul_config_request_body_t *ul_req_tmp = NULL; + PHY_VARS_eNB *eNB_PHY = NULL; + eNB_MAC_INST *eNB_MAC = RC.mac[ctxt_prior.module_id]; + for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + eNB_PHY = RC.eNB[ctxt_prior.module_id][CC_id]; + for (int i=0; iulsch[i]; + if((ulsch != NULL) && (ulsch->rnti == ctxt_prior.rnti)){ + LOG_I(RRC, "clean_eNb_ulsch UE %x \n", ctxt_prior.rnti); + clean_eNb_ulsch(ulsch); + break; + } + } + + for(int j = 0; j < 10; j++){ + ul_req_tmp = &eNB_MAC->UL_req_tmp[CC_id][j].ul_config_request_body; + if(ul_req_tmp){ + int pdu_number = ul_req_tmp->number_of_pdus; + for(int pdu_index = pdu_number-1; pdu_index >= 0; pdu_index--){ + if(ul_req_tmp->ul_config_pdu_list[pdu_index].ulsch_pdu.ulsch_pdu_rel8.rnti == ctxt_prior.rnti){ + LOG_I(RRC, "remove UE %x from ul_config_pdu_list %d/%d\n", ctxt_prior.rnti, pdu_index, pdu_number); + if(pdu_index < pdu_number -1){ + memcpy(&ul_req_tmp->ul_config_pdu_list[pdu_index], &ul_req_tmp->ul_config_pdu_list[pdu_index+1], (pdu_number-1-pdu_index) * sizeof(nfapi_ul_config_request_pdu_t)); + } + ul_req_tmp->number_of_pdus--; + } + } + } + } + } + rrc_mac_remove_ue(ctxt_prior.module_id, ctxt_prior.rnti); + rrc_rlc_remove_ue(&ctxt_prior); + pdcp_remove_UE(&ctxt_prior); } //----------------------------------------------------------------------------- @@ -1060,19 +1850,22 @@ rrc_eNB_generate_RRCConnectionReestablishmentReject( #ifdef RRC_MSG_PRINT int cnt; #endif + int UE_id = find_UE_id(ctxt_pP->module_id, ctxt_pP->rnti); + RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 1; + RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer_thres = 20; T(T_ENB_RRC_CONNECTION_REESTABLISHMENT_REJECT, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size = + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size = do_RRCConnectionReestablishmentReject(ctxt_pP->module_id, - (uint8_t*) eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.Payload); + (uint8_t*) RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload); #ifdef RRC_MSG_PRINT LOG_F(RRC,"[MSG] RRCConnectionReestablishmentReject\n"); - for (cnt = 0; cnt < eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { - LOG_F(RRC,"%02x ", ((uint8_t*)eNB_rrc_inst[ctxt_pP->module_id].Srb0.Tx_buffer.Payload)[cnt]); + for (cnt = 0; cnt < RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { + LOG_F(RRC,"%02x ", ((uint8_t*)RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload)[cnt]); } LOG_F(RRC,"\n"); @@ -1081,17 +1874,17 @@ rrc_eNB_generate_RRCConnectionReestablishmentReject( MSC_LOG_TX_MESSAGE( MSC_RRC_ENB, MSC_RRC_UE, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.Header, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Header, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size, MSC_AS_TIME_FMT" RRCConnectionReestablishmentReject UE %x size %u", MSC_AS_TIME_ARGS(ctxt_pP), ue_context_pP == NULL ? -1 : ue_context_pP->ue_context.rnti, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size); LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel DL-CCCH, Generating RRCConnectionReestablishmentReject (bytes %d)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size); } //----------------------------------------------------------------------------- @@ -1113,8 +1906,16 @@ rrc_eNB_generate_RRCConnectionRelease( size = do_RRCConnectionRelease(ctxt_pP->module_id, buffer,rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id)); // set release timer - ue_context_pP->ue_context.ue_release_timer=1; - + //ue_context_pP->ue_context.ue_release_timer=1; + // remove UE after 10 frames after RRCConnectionRelease is triggered + //ue_context_pP->ue_context.ue_release_timer_thres=100; + // set release timer + ue_context_pP->ue_context.ue_release_timer_rrc = 1; + // remove UE after 10 frames after RRCConnectionRelease is triggered + ue_context_pP->ue_context.ue_release_timer_thres_rrc = 100; + ue_context_pP->ue_context.ue_reestablishment_timer = 0; + ue_context_pP->ue_context.ue_release_timer = 0; + ue_context_pP->ue_context.ue_release_timer_s1 = 0; LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Logical Channel DL-DCCH, Generate RRCConnectionRelease (bytes %d)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), @@ -1148,13 +1949,685 @@ rrc_eNB_generate_RRCConnectionRelease( PDCP_TRANSMISSION_MODE_CONTROL); } +uint8_t qci_to_priority[9]={2,4,3,5,1,6,7,8,9}; + +// TBD: this directive can be remived if we create a similar e_rab_param_t structure in RRC context +#if defined(ENABLE_ITTI) //----------------------------------------------------------------------------- void -rrc_eNB_generate_defaultRRCConnectionReconfiguration( - const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP, - const uint8_t ho_state -) +rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const uint8_t ho_state + ) +//----------------------------------------------------------------------------- +{ + + uint8_t buffer[RRC_BUF_SIZE]; + uint16_t size; + int i; + + struct DRB_ToAddMod *DRB_config = NULL; + struct RLC_Config *DRB_rlc_config = NULL; + struct PDCP_Config *DRB_pdcp_config = NULL; + struct PDCP_Config__rlc_AM *PDCP_rlc_AM = NULL; + struct PDCP_Config__rlc_UM *PDCP_rlc_UM = NULL; + struct LogicalChannelConfig *DRB_lchan_config = NULL; + struct LogicalChannelConfig__ul_SpecificParameters + *DRB_ul_SpecificParameters = NULL; + // DRB_ToAddModList_t** DRB_configList=&ue_context_pP->ue_context.DRB_configList; + DRB_ToAddModList_t* DRB_configList=ue_context_pP->ue_context.DRB_configList; + DRB_ToAddModList_t** DRB_configList2=NULL; + //DRB_ToAddModList_t** RRC_DRB_configList=&ue_context_pP->ue_context.DRB_configList; + + struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; + DedicatedInfoNAS_t *dedicatedInfoNas = NULL; + /* for no gcc warnings */ + (void)dedicatedInfoNas; + + long *logicalchannelgroup_drb; +// int drb_identity_index=0; + + uint8_t xid = rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id, + DRB_configList2=&ue_context_pP->ue_context.DRB_configList2[xid]; + if (*DRB_configList2) { + free(*DRB_configList2); + } + //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); + *DRB_configList2 = CALLOC(1, sizeof(**DRB_configList2)); + /* Initialize NAS list */ + dedicatedInfoNASList = CALLOC(1, sizeof(struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList)); + + int e_rab_done=0; + + for ( i = 0 ; + i < ue_context_pP->ue_context.setup_e_rabs ; + i++){ + + if (e_rab_done >= ue_context_pP->ue_context.nb_of_e_rabs){ + break; + } + + // bypass the new and already configured erabs + if (ue_context_pP->ue_context.e_rab[i].status >= E_RAB_STATUS_DONE) { +// drb_identity_index++; + continue; + } + + DRB_config = CALLOC(1, sizeof(*DRB_config)); + + DRB_config->eps_BearerIdentity = CALLOC(1, sizeof(long)); + // allowed value 5..15, value : x+4 + *(DRB_config->eps_BearerIdentity) = ue_context_pP->ue_context.e_rab[i].param.e_rab_id;//+ 4; // especial case generation + + // DRB_config->drb_Identity = 1 + drb_identity_index + e_rab_done;// + i ;// (DRB_Identity_t) ue_context_pP->ue_context.e_rab[i].param.e_rab_id; + // 1 + drb_identiy_index; + DRB_config->drb_Identity = i+1; + + DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long)); + *(DRB_config->logicalChannelIdentity) = DRB_config->drb_Identity + 2; //(long) (ue_context_pP->ue_context.e_rab[i].param.e_rab_id + 2); // value : x+2 + + DRB_rlc_config = CALLOC(1, sizeof(*DRB_rlc_config)); + DRB_config->rlc_Config = DRB_rlc_config; + + DRB_pdcp_config = CALLOC(1, sizeof(*DRB_pdcp_config)); + DRB_config->pdcp_Config = DRB_pdcp_config; + DRB_pdcp_config->discardTimer = CALLOC(1, sizeof(long)); + *DRB_pdcp_config->discardTimer = PDCP_Config__discardTimer_infinity; + DRB_pdcp_config->rlc_AM = NULL; + DRB_pdcp_config->rlc_UM = NULL; + + + switch (ue_context_pP->ue_context.e_rab[i].param.qos.qci){ + /* + * type: realtime data with medium packer error rate + * action: swtich to RLC UM + */ + case 1: // 100ms, 10^-2, p2, GBR + case 2: // 150ms, 10^-3, p4, GBR + case 3: // 50ms, 10^-3, p3, GBR + case 4: // 300ms, 10^-6, p5 + case 7: // 100ms, 10^-3, p7, GBR + case 9: // 300ms, 10^-6, p9 + case 65: // 75ms, 10^-2, p0.7, mission critical voice, GBR + case 66: // 100ms, 10^-2, p2, non-mission critical voice , GBR + // RLC + DRB_rlc_config->present = RLC_Config_PR_um_Bi_Directional; + DRB_rlc_config->choice.um_Bi_Directional.ul_UM_RLC.sn_FieldLength = SN_FieldLength_size10; + DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.sn_FieldLength = SN_FieldLength_size10; + DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.t_Reordering = T_Reordering_ms35; + // PDCP + PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM)); + DRB_pdcp_config->rlc_UM = PDCP_rlc_UM; + PDCP_rlc_UM->pdcp_SN_Size = PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits; + break; + + /* + * type: non-realtime data with low packer error rate + * action: swtich to RLC AM + */ + case 5: // 100ms, 10^-6, p1 , IMS signaling + case 6: // 300ms, 10^-6, p6 + case 8: // 300ms, 10^-6, p8 + case 69: // 60ms, 10^-6, p0.5, mission critical delay sensitive data, Lowest Priority + case 70: // 200ms, 10^-6, p5.5, mision critical data + // RLC + DRB_rlc_config->present = RLC_Config_PR_am; + DRB_rlc_config->choice.am.ul_AM_RLC.t_PollRetransmit = T_PollRetransmit_ms50; + DRB_rlc_config->choice.am.ul_AM_RLC.pollPDU = PollPDU_p16; + DRB_rlc_config->choice.am.ul_AM_RLC.pollByte = PollByte_kBinfinity; + DRB_rlc_config->choice.am.ul_AM_RLC.maxRetxThreshold = UL_AM_RLC__maxRetxThreshold_t8; + DRB_rlc_config->choice.am.dl_AM_RLC.t_Reordering = T_Reordering_ms35; + DRB_rlc_config->choice.am.dl_AM_RLC.t_StatusProhibit = T_StatusProhibit_ms25; + + // PDCP + PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM)); + DRB_pdcp_config->rlc_AM = PDCP_rlc_AM; + PDCP_rlc_AM->statusReportRequired = FALSE; + + break; + default : + LOG_E(RRC,"not supported qci %d\n", ue_context_pP->ue_context.e_rab[i].param.qos.qci); + ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_FAILED; + ue_context_pP->ue_context.e_rab[i].xid = xid; + e_rab_done++; + continue; + } + + DRB_pdcp_config->headerCompression.present = PDCP_Config__headerCompression_PR_notUsed; + + DRB_lchan_config = CALLOC(1, sizeof(*DRB_lchan_config)); + DRB_config->logicalChannelConfig = DRB_lchan_config; + DRB_ul_SpecificParameters = CALLOC(1, sizeof(*DRB_ul_SpecificParameters)); + DRB_lchan_config->ul_SpecificParameters = DRB_ul_SpecificParameters; + + if (ue_context_pP->ue_context.e_rab[i].param.qos.qci < 9 ) + DRB_ul_SpecificParameters->priority = qci_to_priority[ue_context_pP->ue_context.e_rab[i].param.qos.qci-1] + 3; + // ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.priority_level; + else + DRB_ul_SpecificParameters->priority= 4; + + DRB_ul_SpecificParameters->prioritisedBitRate = LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8; + //LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; + DRB_ul_SpecificParameters->bucketSizeDuration = + LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; + + logicalchannelgroup_drb = CALLOC(1, sizeof(long)); + *logicalchannelgroup_drb = 1;//(i+1) % 3; + DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb; + + ASN_SEQUENCE_ADD(&DRB_configList->list, DRB_config); + ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config); + //ue_context_pP->ue_context.DRB_configList2[drb_identity_index] = &(*DRB_configList); + + LOG_I(RRC,"EPS ID %ld, DRB ID %ld (index %d), QCI %d, priority %ld, LCID %ld LCGID %ld \n", + *DRB_config->eps_BearerIdentity, + DRB_config->drb_Identity, i, + ue_context_pP->ue_context.e_rab[i].param.qos.qci, + DRB_ul_SpecificParameters->priority, + *(DRB_config->logicalChannelIdentity), + *DRB_ul_SpecificParameters->logicalChannelGroup + ); + + e_rab_done++; + ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; + ue_context_pP->ue_context.e_rab[i].xid = xid; + + { + if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { + dedicatedInfoNas = CALLOC(1, sizeof(DedicatedInfoNAS_t)); + memset(dedicatedInfoNas, 0, sizeof(OCTET_STRING_t)); + OCTET_STRING_fromBuf(dedicatedInfoNas, + (char*)ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer, + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length); + ASN_SEQUENCE_ADD(&dedicatedInfoNASList->list, dedicatedInfoNas); + LOG_I(RRC,"add NAS info with size %d (rab id %d)\n",ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length, i); + } + else { + LOG_W(RRC,"Not received activate dedicated EPS bearer context request\n"); + } + /* TODO parameters yet to process ... */ + { + // ue_context_pP->ue_context.e_rab[i].param.qos; + // ue_context_pP->ue_context.e_rab[i].param.sgw_addr; + // ue_context_pP->ue_context.e_rab[i].param.gtp_teid; + } + } + + } + + /* If list is empty free the list and reset the address */ + if (dedicatedInfoNASList != NULL) { + if (dedicatedInfoNASList->list.count == 0) { + free(dedicatedInfoNASList); + dedicatedInfoNASList = NULL; + LOG_W(RRC,"dedlicated NAS list is empty, free the list and reset the address\n"); + } + } else { + LOG_W(RRC,"dedlicated NAS list is empty\n"); + } + + memset(buffer, 0, RRC_BUF_SIZE); + + size = do_RRCConnectionReconfiguration(ctxt_pP, + buffer, + xid, + (SRB_ToAddModList_t*)NULL, + (DRB_ToAddModList_t*)*DRB_configList2, + (DRB_ToReleaseList_t*)NULL, // DRB2_list, + (struct SPS_Config*)NULL, // *sps_Config, + NULL, NULL, NULL, NULL,NULL, + NULL, NULL, NULL, NULL, NULL, NULL, + (struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList*)dedicatedInfoNASList +#if defined(Rel10) || defined(Rel14) + , (SCellToAddMod_r10_t*)NULL +#endif + ); + + +#ifdef RRC_MSG_PRINT + LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); + for (i = 0; i < size; i++) { + LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); + } + LOG_F(RRC,"\n"); + //////////////////////////////////////// +#endif + +#if defined(ENABLE_ITTI) + + /* Free all NAS PDUs */ + for (i = 0; i < ue_context_pP->ue_context.nb_of_e_rabs; i++) { + if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { + /* Free the NAS PDU buffer and invalidate it */ + free(ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer); + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer = NULL; + } + } +#endif + + LOG_I(RRC, + "[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCConnectionReconfiguration (bytes %d, UE RNTI %x)\n", + ctxt_pP->module_id, ctxt_pP->frame, size, ue_context_pP->ue_context.rnti); + + LOG_D(RRC, + "[FRAME %05d][RRC_eNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcConnectionReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n", + ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_eNB_mui, ctxt_pP->module_id, DCCH); + + MSC_LOG_TX_MESSAGE( + MSC_RRC_ENB, + MSC_RRC_UE, + buffer, + size, + MSC_AS_TIME_FMT" dedicated rrcConnectionReconfiguration UE %x MUI %d size %u", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_context.rnti, + rrc_eNB_mui, + size); + + rrc_data_req( + ctxt_pP, + DCCH, + rrc_eNB_mui++, + SDU_CONFIRM_NO, + size, + buffer, + PDCP_TRANSMISSION_MODE_CONTROL); + + +} +int +rrc_eNB_modify_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const uint8_t ho_state + ) +//----------------------------------------------------------------------------- +{ + uint8_t buffer[RRC_BUF_SIZE]; + uint16_t size; + int i, j; + + struct DRB_ToAddMod *DRB_config = NULL; + struct RLC_Config *DRB_rlc_config = NULL; + struct PDCP_Config *DRB_pdcp_config = NULL; + struct PDCP_Config__rlc_AM *PDCP_rlc_AM = NULL; + struct PDCP_Config__rlc_UM *PDCP_rlc_UM = NULL; + struct LogicalChannelConfig *DRB_lchan_config = NULL; + struct LogicalChannelConfig__ul_SpecificParameters + *DRB_ul_SpecificParameters = NULL; + DRB_ToAddModList_t* DRB_configList = ue_context_pP->ue_context.DRB_configList; + DRB_ToAddModList_t* DRB_configList2 = NULL; + + struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; + DedicatedInfoNAS_t *dedicatedInfoNas = NULL; + /* for no gcc warnings */ + (void)dedicatedInfoNas; + + uint8_t xid = rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); // Transaction_id, + DRB_configList2 = CALLOC(1, sizeof(*DRB_configList2)); + /* Initialize NAS list */ + dedicatedInfoNASList = CALLOC(1, sizeof(struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList)); + + for (i = 0; i < ue_context_pP->ue_context.nb_of_modify_e_rabs; i++) { + // bypass the new and already configured erabs + if (ue_context_pP->ue_context.modify_e_rab[i].status >= E_RAB_STATUS_DONE) { + ue_context_pP->ue_context.modify_e_rab[i].xid = xid; + continue; + } + + if (ue_context_pP->ue_context.modify_e_rab[i].cause != S1AP_CAUSE_NOTHING) { + // set xid of failure RAB + ue_context_pP->ue_context.modify_e_rab[i].xid = xid; + ue_context_pP->ue_context.modify_e_rab[i].status = E_RAB_STATUS_FAILED; + continue; + } + + DRB_config = NULL; + // search exist DRB_config + for (j = 0; j < DRB_configList->list.count; j++) { + if((uint8_t)*(DRB_configList->list.array[j]->eps_BearerIdentity) == ue_context_pP->ue_context.modify_e_rab[i].param.e_rab_id) { + DRB_config = DRB_configList->list.array[j]; + break; + } + } + if (NULL == DRB_config) { + ue_context_pP->ue_context.modify_e_rab[i].xid = xid; + ue_context_pP->ue_context.modify_e_rab[i].status = E_RAB_STATUS_FAILED; + // TODO use which cause + ue_context_pP->ue_context.modify_e_rab[i].cause = S1AP_CAUSE_RADIO_NETWORK; + ue_context_pP->ue_context.modify_e_rab[i].cause_value = 0;//S1ap_CauseRadioNetwork_unspecified; + ue_context_pP->ue_context.nb_of_failed_e_rabs++; + continue; + } + + DRB_rlc_config = DRB_config->rlc_Config; + + DRB_pdcp_config = DRB_config->pdcp_Config; + *DRB_pdcp_config->discardTimer = PDCP_Config__discardTimer_infinity; + switch (ue_context_pP->ue_context.modify_e_rab[i].param.qos.qci) { + /* + * type: realtime data with medium packer error rate + * action: swtich to RLC UM + */ + case 1: // 100ms, 10^-2, p2, GBR + case 2: // 150ms, 10^-3, p4, GBR + case 3: // 50ms, 10^-3, p3, GBR + case 4: // 300ms, 10^-6, p5 + case 7: // 100ms, 10^-3, p7, GBR + case 9: // 300ms, 10^-6, p9 + case 65: // 75ms, 10^-2, p0.7, mission critical voice, GBR + case 66: // 100ms, 10^-2, p2, non-mission critical voice , GBR + // RLC + DRB_rlc_config->present = RLC_Config_PR_um_Bi_Directional; + DRB_rlc_config->choice.um_Bi_Directional.ul_UM_RLC.sn_FieldLength = SN_FieldLength_size10; + DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.sn_FieldLength = SN_FieldLength_size10; + DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.t_Reordering = T_Reordering_ms35; + // PDCP + if (DRB_pdcp_config->rlc_AM) { + free(DRB_pdcp_config->rlc_AM); + DRB_pdcp_config->rlc_AM = NULL; + } + if (DRB_pdcp_config->rlc_UM) { + free(DRB_pdcp_config->rlc_UM); + DRB_pdcp_config->rlc_UM = NULL; + } + PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM)); + DRB_pdcp_config->rlc_UM = PDCP_rlc_UM; + PDCP_rlc_UM->pdcp_SN_Size = PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits; + break; + + /* + * type: non-realtime data with low packer error rate + * action: swtich to RLC AM + */ + case 5: // 100ms, 10^-6, p1 , IMS signaling + case 6: // 300ms, 10^-6, p6 + case 8: // 300ms, 10^-6, p8 + case 69: // 60ms, 10^-6, p0.5, mission critical delay sensitive data, Lowest Priority + case 70: // 200ms, 10^-6, p5.5, mision critical data + // RLC + DRB_rlc_config->present = RLC_Config_PR_am; + DRB_rlc_config->choice.am.ul_AM_RLC.t_PollRetransmit = T_PollRetransmit_ms50; + DRB_rlc_config->choice.am.ul_AM_RLC.pollPDU = PollPDU_p16; + DRB_rlc_config->choice.am.ul_AM_RLC.pollByte = PollByte_kBinfinity; + DRB_rlc_config->choice.am.ul_AM_RLC.maxRetxThreshold = UL_AM_RLC__maxRetxThreshold_t8; + DRB_rlc_config->choice.am.dl_AM_RLC.t_Reordering = T_Reordering_ms35; + DRB_rlc_config->choice.am.dl_AM_RLC.t_StatusProhibit = T_StatusProhibit_ms25; + + // PDCP + if (DRB_pdcp_config->rlc_AM) { + free(DRB_pdcp_config->rlc_AM); + DRB_pdcp_config->rlc_AM = NULL; + } + if (DRB_pdcp_config->rlc_UM) { + free(DRB_pdcp_config->rlc_UM); + DRB_pdcp_config->rlc_UM = NULL; + } + PDCP_rlc_AM = CALLOC(1, sizeof(*PDCP_rlc_AM)); + DRB_pdcp_config->rlc_AM = PDCP_rlc_AM; + PDCP_rlc_AM->statusReportRequired = FALSE; + + break; + default : + LOG_E(RRC, "not supported qci %d\n", ue_context_pP->ue_context.modify_e_rab[i].param.qos.qci); + ue_context_pP->ue_context.modify_e_rab[i].status = E_RAB_STATUS_FAILED; + ue_context_pP->ue_context.modify_e_rab[i].xid = xid; + ue_context_pP->ue_context.modify_e_rab[i].cause = S1AP_CAUSE_RADIO_NETWORK; + ue_context_pP->ue_context.modify_e_rab[i].cause_value = 37;//S1ap_CauseRadioNetwork_not_supported_QCI_value; + ue_context_pP->ue_context.nb_of_failed_e_rabs++; + continue; + } + + DRB_pdcp_config->headerCompression.present = PDCP_Config__headerCompression_PR_notUsed; + + DRB_lchan_config = DRB_config->logicalChannelConfig; + DRB_ul_SpecificParameters = DRB_lchan_config->ul_SpecificParameters; + + if (ue_context_pP->ue_context.modify_e_rab[i].param.qos.qci < 9 ) + DRB_ul_SpecificParameters->priority = qci_to_priority[ue_context_pP->ue_context.modify_e_rab[i].param.qos.qci-1] + 3; + else + DRB_ul_SpecificParameters->priority= 4; + + DRB_ul_SpecificParameters->prioritisedBitRate = LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8; + + DRB_ul_SpecificParameters->bucketSizeDuration = + LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; + + ASN_SEQUENCE_ADD(&(DRB_configList2)->list, DRB_config); + + LOG_I(RRC, "EPS ID %ld, DRB ID %ld (index %d), QCI %d, priority %ld, LCID %ld LCGID %ld \n", + *DRB_config->eps_BearerIdentity, + DRB_config->drb_Identity, i, + ue_context_pP->ue_context.modify_e_rab[i].param.qos.qci, + DRB_ul_SpecificParameters->priority, + *(DRB_config->logicalChannelIdentity), + *DRB_ul_SpecificParameters->logicalChannelGroup + ); + + //e_rab_done++; + ue_context_pP->ue_context.modify_e_rab[i].status = E_RAB_STATUS_DONE; + ue_context_pP->ue_context.modify_e_rab[i].xid = xid; + + { + if (ue_context_pP->ue_context.modify_e_rab[i].param.nas_pdu.buffer != NULL) { + dedicatedInfoNas = CALLOC(1, sizeof(DedicatedInfoNAS_t)); + memset(dedicatedInfoNas, 0, sizeof(OCTET_STRING_t)); + OCTET_STRING_fromBuf(dedicatedInfoNas, + (char*)ue_context_pP->ue_context.modify_e_rab[i].param.nas_pdu.buffer, + ue_context_pP->ue_context.modify_e_rab[i].param.nas_pdu.length); + ASN_SEQUENCE_ADD(&dedicatedInfoNASList->list, dedicatedInfoNas); + LOG_I(RRC, "add NAS info with size %d (rab id %d)\n",ue_context_pP->ue_context.modify_e_rab[i].param.nas_pdu.length, i); + } + else { + LOG_W(RRC, "Not received activate dedicated EPS bearer context request\n"); + } + } + } + + /* If list is empty free the list and reset the address */ + if (dedicatedInfoNASList != NULL) { + if (dedicatedInfoNASList->list.count == 0) { + free(dedicatedInfoNASList); + dedicatedInfoNASList = NULL; + LOG_W(RRC,"dedlicated NAS list is empty, free the list and reset the address\n"); + } + } else { + LOG_W(RRC,"dedlicated NAS list is empty\n"); + } + + memset(buffer, 0, RRC_BUF_SIZE); + + size = do_RRCConnectionReconfiguration(ctxt_pP, + buffer, + xid, + (SRB_ToAddModList_t*)NULL, + (DRB_ToAddModList_t*)DRB_configList2, + (DRB_ToReleaseList_t*)NULL, // DRB2_list, + (struct SPS_Config*)NULL, // *sps_Config, + NULL, NULL, NULL, NULL,NULL, + NULL, NULL, NULL, NULL, NULL, NULL, + (struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList*)dedicatedInfoNASList +#if defined(Rel10) || defined(Rel14) + , (SCellToAddMod_r10_t*)NULL +#endif + ); + + +#ifdef RRC_MSG_PRINT + LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); + for (i = 0; i < size; i++) { + LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); + } + LOG_F(RRC,"\n"); + //////////////////////////////////////// +#endif + +#if defined(ENABLE_ITTI) + + /* Free all NAS PDUs */ + for (i = 0; i < ue_context_pP->ue_context.nb_of_modify_e_rabs; i++) { + if (ue_context_pP->ue_context.modify_e_rab[i].param.nas_pdu.buffer != NULL) { + /* Free the NAS PDU buffer and invalidate it */ + free(ue_context_pP->ue_context.modify_e_rab[i].param.nas_pdu.buffer); + ue_context_pP->ue_context.modify_e_rab[i].param.nas_pdu.buffer = NULL; + } + } +#endif + + LOG_I(RRC, + "[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCConnectionReconfiguration (bytes %d, UE RNTI %x)\n", + ctxt_pP->module_id, ctxt_pP->frame, size, ue_context_pP->ue_context.rnti); + + LOG_D(RRC, + "[FRAME %05d][RRC_eNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcConnectionReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n", + ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_eNB_mui, ctxt_pP->module_id, DCCH); + + MSC_LOG_TX_MESSAGE( + MSC_RRC_ENB, + MSC_RRC_UE, + buffer, + size, + MSC_AS_TIME_FMT" dedicated rrcConnectionReconfiguration UE %x MUI %d size %u", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_context.rnti, + rrc_eNB_mui, + size); + + rrc_data_req( + ctxt_pP, + DCCH, + rrc_eNB_mui++, + SDU_CONFIRM_NO, + size, + buffer, + PDCP_TRANSMISSION_MODE_CONTROL); + return 0; +} + +//----------------------------------------------------------------------------- +void +rrc_eNB_generate_dedicatedRRCConnectionReconfiguration_release( const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + uint8_t xid, + uint32_t nas_length, + uint8_t* nas_buffer) +//----------------------------------------------------------------------------- +{ + uint8_t buffer[RRC_BUF_SIZE]; + int i; + uint16_t size = 0; + DRB_ToReleaseList_t** DRB_Release_configList2=NULL; + DRB_Identity_t* DRB_release; + struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList *dedicatedInfoNASList = NULL; + + DRB_Release_configList2=&ue_context_pP->ue_context.DRB_Release_configList2[xid]; + if (*DRB_Release_configList2) { + free(*DRB_Release_configList2); + } + *DRB_Release_configList2 = CALLOC(1, sizeof(**DRB_Release_configList2)); + + for(i = 0; i < NB_RB_MAX; i++){ + if((ue_context_pP->ue_context.e_rab[i].status == E_RAB_STATUS_TORELEASE) && ue_context_pP->ue_context.e_rab[i].xid == xid){ + DRB_release = CALLOC(1, sizeof(DRB_Identity_t)); + *DRB_release = i+1; + ASN_SEQUENCE_ADD(&(*DRB_Release_configList2)->list, DRB_release); + //free(DRB_release); + } + } + + /* If list is empty free the list and reset the address */ + if (nas_length > 0) { + DedicatedInfoNAS_t *dedicatedInfoNas = NULL; + dedicatedInfoNASList = CALLOC(1, sizeof(struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList)); + dedicatedInfoNas = CALLOC(1, sizeof(DedicatedInfoNAS_t)); + memset(dedicatedInfoNas, 0, sizeof(OCTET_STRING_t)); + OCTET_STRING_fromBuf(dedicatedInfoNas, + (char*)nas_buffer, + nas_length); + ASN_SEQUENCE_ADD(&dedicatedInfoNASList->list, dedicatedInfoNas); + LOG_I(RRC,"add NAS info with size %d\n",nas_length); + } else { + LOG_W(RRC,"dedlicated NAS list is empty\n"); + } + + memset(buffer, 0, RRC_BUF_SIZE); + size = do_RRCConnectionReconfiguration(ctxt_pP, + buffer, + xid, + NULL, + NULL, + (DRB_ToReleaseList_t*)*DRB_Release_configList2, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + (struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList*)dedicatedInfoNASList +#if defined(Rel10) || defined(Rel14) + , (SCellToAddMod_r10_t*)NULL +#endif + ); + ue_context_pP->ue_context.e_rab_release_command_flag = 1; + +#ifdef RRC_MSG_PRINT + LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); + for (i = 0; i < size; i++) { + LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); + } + LOG_F(RRC,"\n"); + //////////////////////////////////////// +#endif + +#if defined(ENABLE_ITTI) + /* Free all NAS PDUs */ + if (nas_length > 0) { + /* Free the NAS PDU buffer and invalidate it */ + free(nas_buffer); + } +#endif + + LOG_I(RRC, + "[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCConnectionReconfiguration (bytes %d, UE RNTI %x)\n", + ctxt_pP->module_id, ctxt_pP->frame, size, ue_context_pP->ue_context.rnti); + + LOG_D(RRC, + "[FRAME %05d][RRC_eNB][MOD %u][][--- PDCP_DATA_REQ/%d Bytes (rrcConnectionReconfiguration to UE %x MUI %d) --->][PDCP][MOD %u][RB %u]\n", + ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_eNB_mui, ctxt_pP->module_id, DCCH); + + MSC_LOG_TX_MESSAGE( + MSC_RRC_ENB, + MSC_RRC_UE, + buffer, + size, + MSC_AS_TIME_FMT" dedicated rrcConnectionReconfiguration UE %x MUI %d size %u", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_context.rnti, + rrc_eNB_mui, + size); + + rrc_data_req( + ctxt_pP, + DCCH, + rrc_eNB_mui++, + SDU_CONFIRM_NO, + size, + buffer, + PDCP_TRANSMISSION_MODE_CONTROL); + +} +#endif +//----------------------------------------------------------------------------- +void +rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const uint8_t ho_state + ) //----------------------------------------------------------------------------- { uint8_t buffer[RRC_BUF_SIZE]; @@ -1162,8 +2635,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( int i; // configure SRB1/SRB2, PhysicalConfigDedicated, MAC_MainConfig for UE - //eNB_RRC_INST* rrc_inst = &eNB_rrc_inst[ctxt_pP->module_id]; - //struct PhysicalConfigDedicated** physicalConfigDedicated = &ue_context_pP->ue_context.physicalConfigDedicated; + eNB_RRC_INST* rrc_inst = RC.rrc[ctxt_pP->module_id]; + struct PhysicalConfigDedicated** physicalConfigDedicated = &ue_context_pP->ue_context.physicalConfigDedicated; struct SRB_ToAddMod *SRB2_config = NULL; struct SRB_ToAddMod__rlc_Config *SRB2_rlc_config = NULL; @@ -1171,7 +2644,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( struct LogicalChannelConfig__ul_SpecificParameters *SRB2_ul_SpecificParameters = NULL; SRB_ToAddModList_t* SRB_configList = ue_context_pP->ue_context.SRB_configList; - SRB_ToAddModList_t *SRB_configList2 = NULL; + SRB_ToAddModList_t **SRB_configList2 = NULL; struct DRB_ToAddMod *DRB_config = NULL; struct RLC_Config *DRB_rlc_config = NULL; @@ -1182,8 +2655,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( struct LogicalChannelConfig__ul_SpecificParameters *DRB_ul_SpecificParameters = NULL; DRB_ToAddModList_t** DRB_configList = &ue_context_pP->ue_context.DRB_configList; - - MAC_MainConfig_t *mac_MainConfig = NULL; + DRB_ToAddModList_t** DRB_configList2 = NULL; + MAC_MainConfig_t *mac_MainConfig = NULL; MeasObjectToAddModList_t *MeasObj_list = NULL; MeasObjectToAddMod_t *MeasObj = NULL; ReportConfigToAddModList_t *ReportConfig_list = NULL; @@ -1191,7 +2664,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( *ReportConfig_A2, *ReportConfig_A3, *ReportConfig_A4, *ReportConfig_A5; MeasIdToAddModList_t *MeasId_list = NULL; MeasIdToAddMod_t *MeasId0, *MeasId1, *MeasId2, *MeasId3, *MeasId4, *MeasId5; -#if Rel10 +#if defined(Rel10) || defined(Rel14) long *sr_ProhibitTimer_r9 = NULL; // uint8_t sCellIndexToAdd = rrc_find_free_SCell_index(enb_mod_idP, ue_mod_idP, 1); //uint8_t sCellIndexToAdd = 0; @@ -1211,6 +2684,9 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( (void)dedicatedInfoNas; C_RNTI_t *cba_RNTI = NULL; + + uint8_t xid = rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id); //Transaction_id, + #ifdef CBA //struct PUSCH_CBAConfigDedicated_vlola *pusch_CBAConfigDedicated_vlola; uint8_t *cba_RNTI_buf; @@ -1242,9 +2718,13 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( // Configure SRB2 /// SRB2 + SRB_configList2=&ue_context_pP->ue_context.SRB_configList2[xid]; + if (*SRB_configList2) { + free(*SRB_configList2); + } + *SRB_configList2 = CALLOC(1, sizeof(**SRB_configList2)); + memset(*SRB_configList2, 0, sizeof(**SRB_configList2)); SRB2_config = CALLOC(1, sizeof(*SRB2_config)); - SRB_configList2 = CALLOC(1, sizeof(*SRB_configList2)); - memset(SRB_configList2, 0, sizeof(*SRB_configList2)); SRB2_config->srb_Identity = 2; SRB2_rlc_config = CALLOC(1, sizeof(*SRB2_rlc_config)); @@ -1266,7 +2746,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( SRB2_ul_SpecificParameters = CALLOC(1, sizeof(*SRB2_ul_SpecificParameters)); - SRB2_ul_SpecificParameters->priority = 1; + SRB2_ul_SpecificParameters->priority = 3; // let some priority for SRB1 and dedicated DRBs SRB2_ul_SpecificParameters->prioritisedBitRate = LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; SRB2_ul_SpecificParameters->bucketSizeDuration = @@ -1279,12 +2759,29 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( SRB2_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup; SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters = SRB2_ul_SpecificParameters; + // this list has the configuration for SRB1 and SRB2 ASN_SEQUENCE_ADD(&SRB_configList->list, SRB2_config); - ASN_SEQUENCE_ADD(&SRB_configList2->list, SRB2_config); + // this list has only the configuration for SRB2 + ASN_SEQUENCE_ADD(&(*SRB_configList2)->list, SRB2_config); // Configure DRB //*DRB_configList = CALLOC(1, sizeof(*DRB_configList)); + // list for all the configured DRB + if (*DRB_configList) { + free(*DRB_configList); + } *DRB_configList = CALLOC(1, sizeof(**DRB_configList)); + memset(*DRB_configList, 0, sizeof(**DRB_configList)); + + // list for the configured DRB for a this xid + DRB_configList2=&ue_context_pP->ue_context.DRB_configList2[xid]; + if (*DRB_configList2) { + free(*DRB_configList2); + } + *DRB_configList2 = CALLOC(1, sizeof(**DRB_configList2)); + memset(*DRB_configList2, 0, sizeof(**DRB_configList2)); + + /// DRB DRB_config = CALLOC(1, sizeof(*DRB_config)); @@ -1292,7 +2789,6 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( *(DRB_config->eps_BearerIdentity) = 5L; // LW set to first value, allowed value 5..15, value : x+4 // DRB_config->drb_Identity = (DRB_Identity_t) 1; //allowed values 1..32 // NN: this is the 1st DRB for this ue, so set it to 1 - // NN: this is the 1st DRB for this ue, so set it to 1 DRB_config->drb_Identity = (DRB_Identity_t) 1; // (ue_mod_idP+1); //allowed values 1..32, value: x DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long)); *(DRB_config->logicalChannelIdentity) = (long)3; // value : x+2 @@ -1345,9 +2841,9 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( DRB_ul_SpecificParameters = CALLOC(1, sizeof(*DRB_ul_SpecificParameters)); DRB_lchan_config->ul_SpecificParameters = DRB_ul_SpecificParameters; - DRB_ul_SpecificParameters->priority = 2; // lower priority than srb1, srb2 - DRB_ul_SpecificParameters->prioritisedBitRate = - LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; + DRB_ul_SpecificParameters->priority = 12; // lower priority than srb1, srb2 and other dedicated bearer + DRB_ul_SpecificParameters->prioritisedBitRate =LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8 ; + //LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity; DRB_ul_SpecificParameters->bucketSizeDuration = LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50; @@ -1357,6 +2853,9 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb; ASN_SEQUENCE_ADD(&(*DRB_configList)->list, DRB_config); + ASN_SEQUENCE_ADD(&(*DRB_configList2)->list, DRB_config); + + //ue_context_pP->ue_context.DRB_configList2[0] = &(*DRB_configList); mac_MainConfig = CALLOC(1, sizeof(*mac_MainConfig)); ue_context_pP->ue_context.mac_MainConfig = mac_MainConfig; @@ -1367,9 +2866,9 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( *maxHARQ_Tx = MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5; mac_MainConfig->ul_SCH_Config->maxHARQ_Tx = maxHARQ_Tx; periodicBSR_Timer = CALLOC(1, sizeof(long)); - *periodicBSR_Timer = MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf64; + *periodicBSR_Timer = PeriodicBSR_Timer_r12_sf64; mac_MainConfig->ul_SCH_Config->periodicBSR_Timer = periodicBSR_Timer; - mac_MainConfig->ul_SCH_Config->retxBSR_Timer = MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf320; + mac_MainConfig->ul_SCH_Config->retxBSR_Timer = RetxBSR_Timer_r12_sf320; mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // FALSE mac_MainConfig->timeAlignmentTimerDedicated = TimeAlignmentTimer_infinity; @@ -1385,7 +2884,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange = MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; // Value dB1 =1 dB, dB3 = 3 dB -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) sr_ProhibitTimer_r9 = CALLOC(1, sizeof(long)); *sr_ProhibitTimer_r9 = 0; // SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2= 2*SR mac_MainConfig->ext1 = CALLOC(1, sizeof(struct MAC_MainConfig__ext1)); @@ -1393,6 +2892,80 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( //sps_RA_ConfigList_rlola = NULL; #endif + //change the transmission mode for the primary component carrier + //TODO: add codebook subset restriction here + //TODO: change TM for secondary CC in SCelltoaddmodlist + if (*physicalConfigDedicated) { + if ((*physicalConfigDedicated)->antennaInfo) { + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.transmissionMode = rrc_inst->configuration.ue_TransmissionMode[0]; + LOG_D(RRC,"Setting transmission mode to %ld+1\n",rrc_inst->configuration.ue_TransmissionMode[0]); + if (rrc_inst->configuration.ue_TransmissionMode[0]==AntennaInfoDedicated__transmissionMode_tm3) { + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction= + CALLOC(1,sizeof(AntennaInfoDedicated__codebookSubsetRestriction_PR)); + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->present = + AntennaInfoDedicated__codebookSubsetRestriction_PR_n2TxAntenna_tm3; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm3.buf= MALLOC(1); + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm3.buf[0] = 0xc0; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm3.size=1; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm3.bits_unused=6; + } + else if (rrc_inst->configuration.ue_TransmissionMode[0]==AntennaInfoDedicated__transmissionMode_tm4) { + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction= + CALLOC(1,sizeof(AntennaInfoDedicated__codebookSubsetRestriction_PR)); + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->present = + AntennaInfoDedicated__codebookSubsetRestriction_PR_n2TxAntenna_tm4; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm4.buf= MALLOC(1); + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm4.buf[0] = 0xfc; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm4.size=1; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm4.bits_unused=2; + + } + else if (rrc_inst->configuration.ue_TransmissionMode[0]==AntennaInfoDedicated__transmissionMode_tm5) { + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction= + CALLOC(1,sizeof(AntennaInfoDedicated__codebookSubsetRestriction_PR)); + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->present = + AntennaInfoDedicated__codebookSubsetRestriction_PR_n2TxAntenna_tm5; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm5.buf= MALLOC(1); + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm5.buf[0] = 0xf0; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm5.size=1; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm5.bits_unused=4; + } + else if (rrc_inst->configuration.ue_TransmissionMode[0]==AntennaInfoDedicated__transmissionMode_tm6) { + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction= + CALLOC(1,sizeof(AntennaInfoDedicated__codebookSubsetRestriction_PR)); + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->present = + AntennaInfoDedicated__codebookSubsetRestriction_PR_n2TxAntenna_tm6; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm6.buf= MALLOC(1); + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm6.buf[0] = 0xf0; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm6.size=1; + (*physicalConfigDedicated)->antennaInfo->choice.explicitValue.codebookSubsetRestriction->choice.n2TxAntenna_tm6.bits_unused=4; + } + } + else { + LOG_E(RRC,"antenna_info not present in physical_config_dedicated. Not reconfiguring!\n"); + } + if ((*physicalConfigDedicated)->cqi_ReportConfig) { + if ((rrc_inst->configuration.ue_TransmissionMode[0]==AntennaInfoDedicated__transmissionMode_tm4) || + (rrc_inst->configuration.ue_TransmissionMode[0]==AntennaInfoDedicated__transmissionMode_tm5) || + (rrc_inst->configuration.ue_TransmissionMode[0]==AntennaInfoDedicated__transmissionMode_tm6)) { + //feedback mode needs to be set as well + //TODO: I think this is taken into account in the PHY automatically based on the transmission mode variable + printf("setting cqi reporting mode to rm31\n"); +#if defined(Rel10) || defined(Rel14) + *((*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportModeAperiodic)=CQI_ReportModeAperiodic_rm31; +#else + *((*physicalConfigDedicated)->cqi_ReportConfig->cqi_ReportModeAperiodic)=CQI_ReportConfig__cqi_ReportModeAperiodic_rm31; // HLC CQI, no PMI +#endif + } + } + else { + LOG_E(RRC,"cqi_ReportConfig not present in physical_config_dedicated. Not reconfiguring!\n"); + } + } + else { + LOG_E(RRC,"physical_config_dedicated not present in RRCConnectionReconfiguration. Not reconfiguring!\n"); + } + // Measurement ID list MeasId_list = CALLOC(1, sizeof(*MeasId_list)); memset((void *)MeasId_list, 0, sizeof(*MeasId_list)); @@ -1646,7 +3219,7 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( //rrc_inst->handover_info.as_config.sourceRadioResourceConfig.srb_ToAddModList = CALLOC(1,sizeof()); ue_context_pP->ue_context.handover_info = CALLOC(1, sizeof(*(ue_context_pP->ue_context.handover_info))); //memcpy((void *)rrc_inst->handover_info[ue_mod_idP]->as_config.sourceRadioResourceConfig.srb_ToAddModList,(void *)SRB_list,sizeof(SRB_ToAddModList_t)); - ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.srb_ToAddModList = SRB_configList2; + ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.srb_ToAddModList = *SRB_configList2; //memcpy((void *)rrc_inst->handover_info[ue_mod_idP]->as_config.sourceRadioResourceConfig.drb_ToAddModList,(void *)DRB_list,sizeof(DRB_ToAddModList_t)); ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.drb_ToAddModList = *DRB_configList; ue_context_pP->ue_context.handover_info->as_config.sourceRadioResourceConfig.drb_ToReleaseList = NULL; @@ -1672,7 +3245,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( if (ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer != NULL) { dedicatedInfoNas = CALLOC(1, sizeof(DedicatedInfoNAS_t)); memset(dedicatedInfoNas, 0, sizeof(OCTET_STRING_t)); - OCTET_STRING_fromBuf(dedicatedInfoNas, (char*)ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer, + OCTET_STRING_fromBuf(dedicatedInfoNas, + (char*)ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer, ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length); ASN_SEQUENCE_ADD(&dedicatedInfoNASList->list, dedicatedInfoNas); } @@ -1686,6 +3260,8 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( /* TODO should test if e RAB are Ok before! */ ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_DONE; + LOG_D(RRC, "setting the status for the default DRB (index %d) to (%d,%s)\n", + i, ue_context_pP->ue_context.e_rab[i].status, "E_RAB_STATUS_DONE"); } /* If list is empty free the list and reset the address */ @@ -1700,15 +3276,15 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( size = do_RRCConnectionReconfiguration(ctxt_pP, buffer, - rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), //Transaction_id, - (SRB_ToAddModList_t*)NULL, /// NN: do not reconfig srb1: SRB_configList2, + xid, //Transaction_id, + (SRB_ToAddModList_t*)*SRB_configList2, // SRB_configList (DRB_ToAddModList_t*)*DRB_configList, (DRB_ToReleaseList_t*)NULL, // DRB2_list, (struct SPS_Config*)NULL, // *sps_Config, -#ifdef EXMIMO_IOT - NULL, NULL, NULL, NULL,NULL, -#else (struct PhysicalConfigDedicated*)*physicalConfigDedicated, +#ifdef EXMIMO_IOT + NULL, NULL, NULL,NULL, +#else (MeasObjectToAddModList_t*)MeasObj_list, (ReportConfigToAddModList_t*)ReportConfig_list, (QuantityConfig_t*)quantityConfig, @@ -1721,18 +3297,16 @@ rrc_eNB_generate_defaultRRCConnectionReconfiguration( (RSRP_Range_t*)rsrp, (C_RNTI_t*)cba_RNTI, (struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList*)dedicatedInfoNASList -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) , (SCellToAddMod_r10_t*)NULL #endif ); #ifdef RRC_MSG_PRINT LOG_F(RRC,"[MSG] RRC Connection Reconfiguration\n"); - for (i = 0; i < size; i++) { LOG_F(RRC,"%02x ", ((uint8_t*)buffer)[i]); } - LOG_F(RRC,"\n"); //////////////////////////////////////// #endif @@ -1794,12 +3368,12 @@ rrc_eNB_generate_RRCConnectionReconfiguration_SCell( uint8_t size; uint8_t buffer[100]; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) uint8_t sCellIndexToAdd = 0; //one SCell so far // uint8_t sCellIndexToAdd; // sCellIndexToAdd = rrc_find_free_SCell_index(enb_mod_idP, ue_mod_idP, 1); - // if (eNB_rrc_inst[enb_mod_idP].sCell_config[ue_mod_idP][sCellIndexToAdd] ) { + // if (RC.rrc[enb_mod_idP]->sCell_config[ue_mod_idP][sCellIndexToAdd] ) { if (ue_context_pP->ue_context.sCell_config != NULL) { ue_context_pP->ue_context.sCell_config[sCellIndexToAdd].cellIdentification_r10->dl_CarrierFreq_r10 = dl_CarrierFreq_r10; } else { @@ -1828,7 +3402,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_SCell( (C_RNTI_t*)NULL, (struct RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList*)NULL -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) , ue_context_pP->ue_context.sCell_config #endif ); @@ -1885,12 +3459,12 @@ rrc_eNB_process_MeasurementReport( measResult.rsrqResult)); } -#ifdef Rel10 - LOG_I(RRC, "RSRP of Source %d\n", measResults2->measResultPCell.rsrpResult); - LOG_I(RRC, "RSRQ of Source %d\n", measResults2->measResultPCell.rsrqResult); +#if defined(Rel10) || defined(Rel14) + LOG_I(RRC, "RSRP of Source %ld\n", measResults2->measResultPCell.rsrpResult); + LOG_I(RRC, "RSRQ of Source %ld\n", measResults2->measResultPCell.rsrqResult); #else - LOG_I(RRC, "RSRP of Source %d\n", measResults2->measResultServCell.rsrpResult); - LOG_I(RRC, "RSRQ of Source %d\n", measResults2->measResultServCell.rsrqResult); + LOG_I(RRC, "RSRP of Source %ld\n", measResults2->measResultServCell.rsrpResult); + LOG_I(RRC, "RSRQ of Source %ld\n", measResults2->measResultServCell.rsrqResult); #endif if (ue_context_pP->ue_context.handover_info->ho_prepare != 0xF0) { @@ -1935,7 +3509,7 @@ rrc_eNB_generate_HandoverPreparationInformation( /* uint8_t buffer[100]; uint8_t size; - struct PhysicalConfigDedicated **physicalConfigDedicated = &eNB_rrc_inst[enb_mod_idP].physicalConfigDedicated[ue_mod_idP]; + struct PhysicalConfigDedicated **physicalConfigDedicated = &RC.rrc[enb_mod_idP]->physicalConfigDedicated[ue_mod_idP]; RadioResourceConfigDedicated_t *radioResourceConfigDedicated = CALLOC(1,sizeof(RadioResourceConfigDedicated_t)); */ @@ -1946,7 +3520,7 @@ rrc_eNB_generate_HandoverPreparationInformation( handoverInfo->as_config.sourceDl_CarrierFreq = 36090; //Verify! memcpy((void *)&handoverInfo->as_config.sourceMasterInformationBlock, - (void*)&eNB_rrc_inst[ctxt_pP->module_id].carrier[0] /* CROUX TBC */.mib, sizeof(MasterInformationBlock_t)); + (void*)&RC.rrc[ctxt_pP->module_id]->carrier[0] /* CROUX TBC */.mib, sizeof(MasterInformationBlock_t)); memcpy((void *)&handoverInfo->as_config.sourceMeasConfig, (void*)ue_context_pP->ue_context.measConfig, sizeof(MeasConfig_t)); @@ -1959,13 +3533,13 @@ rrc_eNB_generate_HandoverPreparationInformation( 0, sizeof(SecurityAlgorithmConfig_t)); memcpy((void*)&ue_context_pP->ue_context.handover_info->as_config.sourceSystemInformationBlockType1, - (void*)&eNB_rrc_inst[ctxt_pP->module_id].carrier[0] /* CROUX TBC */.SIB1, sizeof(SystemInformationBlockType1_t)); + (void*)&RC.rrc[ctxt_pP->module_id]->carrier[0] /* CROUX TBC */.SIB1, sizeof(SystemInformationBlockType1_t)); memcpy((void*)&ue_context_pP->ue_context.handover_info->as_config.sourceSystemInformationBlockType2, - (void*)&eNB_rrc_inst[ctxt_pP->module_id].carrier[0] /* CROUX TBC */.SIB23, sizeof(SystemInformationBlockType2_t)); + (void*)&RC.rrc[ctxt_pP->module_id]->carrier[0] /* CROUX TBC */.SIB23, sizeof(SystemInformationBlockType2_t)); ue_context_pP->ue_context.handover_info->as_context.reestablishmentInfo = CALLOC(1, sizeof(ReestablishmentInfo_t)); ue_context_pP->ue_context.handover_info->as_context.reestablishmentInfo->sourcePhysCellId = - eNB_rrc_inst[ctxt_pP->module_id].carrier[0] /* CROUX TBC */.physCellId; + RC.rrc[ctxt_pP->module_id]->carrier[0] /* CROUX TBC */.physCellId; ue_context_pP->ue_context.handover_info->as_context.reestablishmentInfo->targetCellShortMAC_I.buf = NULL; // Check values later ue_context_pP->ue_context.handover_info->as_context.reestablishmentInfo->targetCellShortMAC_I.size = 0; ue_context_pP->ue_context.handover_info->as_context.reestablishmentInfo->targetCellShortMAC_I.bits_unused = 0; @@ -1977,22 +3551,22 @@ rrc_eNB_generate_HandoverPreparationInformation( //UE_id_target = rrc_find_free_ue_index(modid_target); ue_context_target_p = rrc_eNB_get_ue_context( - &eNB_rrc_inst[mod_id_target], + RC.rrc[mod_id_target], ue_context_pP->ue_context.rnti); /*UE_id_target = rrc_eNB_get_next_free_UE_index( mod_id_target, - eNB_rrc_inst[ctxt_pP->module_id].Info.UE_list[ue_mod_idP]); //this should return a new index*/ + RC.rrc[ctxt_pP->module_id]->Info.UE_list[ue_mod_idP]); //this should return a new index*/ if (ue_context_target_p == NULL) { // if not already in target cell - ue_context_target_p = rrc_eNB_allocate_new_UE_context(&eNB_rrc_inst[ctxt_pP->module_id]); + ue_context_target_p = rrc_eNB_allocate_new_UE_context(RC.rrc[ctxt_pP->module_id]); ue_context_target_p->ue_id_rnti = ue_context_pP->ue_context.rnti; // LG: should not be the same ue_context_target_p->ue_context.rnti = ue_context_target_p->ue_id_rnti; // idem LOG_N(RRC, - "[eNB %d] Frame %d : Emulate sending HandoverPreparationInformation msg from eNB source %d to eNB target %d: source UE_id %x target UE_id %x source_modId: %d target_modId: %d\n", + "[eNB %d] Frame %d : Emulate sending HandoverPreparationInformation msg from eNB source %d to eNB target %ld: source UE_id %x target UE_id %x source_modId: %d target_modId: %d\n", ctxt_pP->module_id, ctxt_pP->frame, - eNB_rrc_inst[ctxt_pP->module_id].carrier[0] /* CROUX TBC */.physCellId, + RC.rrc[ctxt_pP->module_id]->carrier[0] /* CROUX TBC */.physCellId, targetPhyId, ue_context_pP->ue_context.rnti, ue_context_target_p->ue_id_rnti, @@ -2016,7 +3590,7 @@ rrc_eNB_generate_HandoverPreparationInformation( ue_context_target_p->ue_context.handover_info->ueid_t = ue_context_target_p->ue_context.rnti; } else { - LOG_E(RRC, "\nError in obtaining free UE id in target eNB %l for handover \n", targetPhyId); + LOG_E(RRC, "\nError in obtaining free UE id in target eNB %ld for handover \n", targetPhyId); } } else { @@ -2056,7 +3630,7 @@ check_handovers( { int result; struct rrc_eNB_ue_context_s* ue_context_p; - RB_FOREACH(ue_context_p, rrc_ue_tree_s, &eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head) { + RB_FOREACH(ue_context_p, rrc_ue_tree_s, &RC.rrc[ctxt_pP->module_id]->rrc_ue_head) { ctxt_pP->rnti = ue_context_p->ue_id_rnti; if (ue_context_p->ue_context.handover_info != NULL) { @@ -2120,7 +3694,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( uint8_t rv[2]; uint16_t Idx; // configure SRB1/SRB2, PhysicalConfigDedicated, MAC_MainConfig for UE - eNB_RRC_INST* rrc_inst = &eNB_rrc_inst[ctxt_pP->module_id]; + eNB_RRC_INST* rrc_inst = RC.rrc[ctxt_pP->module_id]; struct PhysicalConfigDedicated** physicalConfigDedicated = &ue_context_pP->ue_context.physicalConfigDedicated; struct SRB_ToAddMod *SRB2_config; @@ -2152,7 +3726,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( // HandoverCommand_t handoverCommand; //uint8_t sourceModId = // get_adjacent_cell_mod_id(ue_context_pP->ue_context.handover_info->as_context.reestablishmentInfo->sourcePhysCellId); -#if Rel10 +#if defined(Rel10) || defined(Rel14) long *sr_ProhibitTimer_r9; #endif @@ -2240,7 +3814,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH = CALLOC(1, sizeof(*physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH)); physicalConfigDedicated2->cqi_ReportConfig = NULL; //CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig)); - physicalConfigDedicated2->soundingRS_UL_ConfigDedicated = NULL; //CALLOC(1,sizeof(*physicalConfigDedicated2->soundingRS_UL_ConfigDedicated)); + physicalConfigDedicated2->soundingRS_UL_ConfigDedicated = CALLOC(1,sizeof(*physicalConfigDedicated2->soundingRS_UL_ConfigDedicated)); physicalConfigDedicated2->antennaInfo = CALLOC(1, sizeof(*physicalConfigDedicated2->antennaInfo)); physicalConfigDedicated2->schedulingRequestConfig = CALLOC(1, sizeof(*physicalConfigDedicated2->schedulingRequestConfig)); @@ -2357,11 +3931,11 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( physicalConfigDedicated2->schedulingRequestConfig->present = SchedulingRequestConfig_PR_setup; physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = ue_context_pP->local_uid; - if (mac_xface->lte_frame_parms->frame_type == 0) { // FDD + if (rrc_inst->carrier[0].sib1->tdd_Config==NULL) { // FD physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex = 5 + (ue_context_pP->local_uid % 10); // Isr = 5 (every 10 subframes, offset=2+UE_id mod3) } else { - switch (mac_xface->lte_frame_parms->tdd_config) { + switch (rrc_inst->carrier[0].sib1->tdd_Config->subframeAssignment) { case 1: physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_ConfigIndex = 7 + (ue_context_pP->local_uid & 1) + (( ue_context_pP->local_uid & 3) >> 1) * 5; // Isr = 5 (every 10 subframes, offset=2 for UE0, 3 for UE1, 7 for UE2, 8 for UE3 , 2 for UE4 etc..) @@ -2392,39 +3966,43 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( LOG_D(RRC, "handover_config [FRAME %05d][RRC_eNB][MOD %02d][][--- MAC_CONFIG_REQ (SRB1 UE %x) --->][MAC_eNB][MOD %02d][]\n", ctxt_pP->frame, ctxt_pP->module_id, ue_context_pP->ue_context.rnti, ctxt_pP->module_id); - rrc_mac_config_req( - ctxt_pP->module_id, - ue_context_pP->ue_context.primaryCC_id, - ENB_FLAG_YES, - ue_context_pP->ue_context.rnti, - 0, - (RadioResourceConfigCommonSIB_t*) NULL, - ue_context_pP->ue_context.physicalConfigDedicated, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, + rrc_mac_config_req_eNB( + ctxt_pP->module_id, + ue_context_pP->ue_context.primaryCC_id, + 0,0,0,0,0, +#ifdef Rel14 +0, +#endif + ue_context_pP->ue_context.rnti, + (BCCH_BCH_Message_t *) NULL, + (RadioResourceConfigCommonSIB_t*) NULL, + (RadioResourceConfigCommonSIB_t*) NULL, + ue_context_pP->ue_context.physicalConfigDedicated, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, #endif - (MeasObjectToAddMod_t **) NULL, - ue_context_pP->ue_context.mac_MainConfig, - 1, - SRB1_logicalChannelConfig, - ue_context_pP->ue_context.measGapConfig, - (TDD_Config_t*) NULL, - (MobilityControlInfo_t*) NULL, - (uint8_t*) NULL, - (uint16_t*) NULL, - NULL, - NULL, - NULL, - (MBSFN_SubframeConfigList_t *) NULL -#ifdef Rel10 - , 0, (MBSFN_AreaInfoList_r9_t *) NULL, (PMCH_InfoList_r9_t *) NULL + (MeasObjectToAddMod_t **) NULL, + ue_context_pP->ue_context.mac_MainConfig, + 1, + SRB1_logicalChannelConfig, + ue_context_pP->ue_context.measGapConfig, + (TDD_Config_t*) NULL, + (MobilityControlInfo_t*) NULL, + (SchedulingInfoList_t*) NULL, + 0, + NULL, + NULL, + (MBSFN_SubframeConfigList_t *) NULL +#if defined(Rel10) || defined(Rel14) + , 0, (MBSFN_AreaInfoList_r9_t *) NULL, (PMCH_InfoList_r9_t *) NULL #endif -#ifdef CBA - , eNB_rrc_inst[ctxt_pP->module_id].num_active_cba_groups, eNB_rrc_inst[ctxt_pP->module_id].cba_rnti[0] -#endif - ); - +# ifdef Rel14 + , + (SystemInformationBlockType1_v1310_IEs_t *)NULL +# endif + ); + // Configure target eNB SRB2 /// SRB2 SRB2_config = CALLOC(1, sizeof(*SRB2_config)); @@ -2520,10 +4098,10 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( mac_MainConfig->ul_SCH_Config->maxHARQ_Tx = maxHARQ_Tx; periodicBSR_Timer = CALLOC(1, sizeof(long)); - *periodicBSR_Timer = MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_sf64; + *periodicBSR_Timer = PeriodicBSR_Timer_r12_sf64; mac_MainConfig->ul_SCH_Config->periodicBSR_Timer = periodicBSR_Timer; - mac_MainConfig->ul_SCH_Config->retxBSR_Timer = MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf320; + mac_MainConfig->ul_SCH_Config->retxBSR_Timer = RetxBSR_Timer_r12_sf320; mac_MainConfig->ul_SCH_Config->ttiBundling = 0; // FALSE @@ -2538,7 +4116,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange = MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1; // Value dB1 =1 dB, dB3 = 3 dB -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) sr_ProhibitTimer_r9 = CALLOC(1, sizeof(long)); *sr_ProhibitTimer_r9 = 0; // SR tx on PUCCH, Value in number of SR period(s). Value 0 = no timer for SR, Value 2= 2*SR mac_MainConfig->ext1 = CALLOC(1, sizeof(struct MAC_MainConfig__ext1)); @@ -2781,7 +4359,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( memset((void *)mobilityInfo, 0, sizeof(*mobilityInfo)); mobilityInfo->targetPhysCellId = (PhysCellId_t) two_tier_hexagonal_cellIds[ue_context_pP->ue_context.handover_info->modid_t]; - LOG_D(RRC, "[eNB %d] Frame %d: handover preparation: targetPhysCellId: %d mod_id: %d ue: %x \n", + LOG_D(RRC, "[eNB %d] Frame %d: handover preparation: targetPhysCellId: %ld mod_id: %d ue: %x \n", ctxt_pP->module_id, ctxt_pP->frame, mobilityInfo->targetPhysCellId, @@ -2875,7 +4453,8 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( (void *)rrc_inst->sps_Config[ue_mod_idP], sizeof(SPS_Config_t)); */ - LOG_I(RRC, "[eNB %d] Frame %d: adding new UE\n"); + LOG_I(RRC, "[eNB %d] Frame %d: adding new UE\n", + ctxt_pP->module_id, ctxt_pP->frame); //Idx = (ue_mod_idP * NB_RB_MAX) + DCCH; Idx = DCCH; // SRB1 @@ -2884,11 +4463,12 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( memcpy(&ue_context_pP->ue_context.Srb1.Srb_info.Lchan_desc[0], &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); memcpy(&ue_context_pP->ue_context.Srb1.Srb_info.Lchan_desc[1], &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); - // SRB2 + // SRB2 ue_context_pP->ue_context.Srb2.Active = 1; ue_context_pP->ue_context.Srb2.Srb_info.Srb_id = Idx; memcpy(&ue_context_pP->ue_context.Srb2.Srb_info.Lchan_desc[0], &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); memcpy(&ue_context_pP->ue_context.Srb2.Srb_info.Lchan_desc[1], &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); + LOG_I(RRC, "[eNB %d] CALLING RLC CONFIG SRB1 (rbid %d) for UE %x\n", ctxt_pP->module_id, Idx, ue_context_pP->ue_context.rnti); @@ -2898,15 +4478,15 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( rrc_pdcp_config_asn1_req(&ctxt, ue_context_pP->ue_context.SRB_configList, (DRB_ToAddModList_t *) NULL, (DRB_ToReleaseList_t *) NULL, 0xff, NULL, NULL, NULL -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) , (PMCH_InfoList_r9_t *) NULL #endif - ); + ,NULL); rrc_rlc_config_asn1_req(&ctxt, ue_context_pP->ue_context.SRB_configList, (DRB_ToAddModList_t *) NULL, (DRB_ToReleaseList_t *) NULL -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) , (PMCH_InfoList_r9_t *) NULL #endif ); @@ -2937,7 +4517,7 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( NULL, NULL, dedicatedInfoNASList -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) , NULL // SCellToAddMod_r10_t #endif ); @@ -2946,9 +4526,9 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( "[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCConnectionReconfiguration for handover (bytes %d, UE rnti %x)\n", ctxt_pP->module_id, ctxt_pP->frame, size, ue_context_pP->ue_context.rnti); // to be updated if needed - /*if (eNB_rrc_inst[ctxt_pP->module_id].SRB1_config[ue_mod_idP]->logicalChannelConfig) { - if (eNB_rrc_inst[ctxt_pP->module_id].SRB1_config[ue_mod_idP]->logicalChannelConfig->present == SRB_ToAddMod__logicalChannelConfig_PR_explicitValue) { - SRB1_logicalChannelConfig = &eNB_rrc_inst[ctxt_pP->module_id].SRB1_config[ue_mod_idP]->logicalChannelConfig->choice.explicitValue; + /*if (RC.rrc[ctxt_pP->module_id]->SRB1_config[ue_mod_idP]->logicalChannelConfig) { + if (RC.rrc[ctxt_pP->module_id]->SRB1_config[ue_mod_idP]->logicalChannelConfig->present == SRB_ToAddMod__logicalChannelConfig_PR_explicitValue) { + SRB1_logicalChannelConfig = &RC.rrc[ctxt_pP->module_id]->SRB1_config[ue_mod_idP]->logicalChannelConfig->choice.explicitValue; } else { SRB1_logicalChannelConfig = &SRB1_logicalChannelConfig_defaultValue; @@ -2964,34 +4544,40 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( ctxt_pP->frame, ctxt_pP->module_id, size, ue_context_pP->ue_context.rnti, rrc_eNB_mui, ctxt_pP->module_id, DCCH); //rrc_rlc_data_req(ctxt_pP->module_id,frameP, 1,(ue_mod_idP*NB_RB_MAX)+DCCH,rrc_eNB_mui++,0,size,(char*)buffer); //pdcp_data_req (ctxt_pP->module_id, frameP, 1, (ue_mod_idP * NB_RB_MAX) + DCCH,rrc_eNB_mui++, 0, size, (char *) buffer, 1); - rrc_mac_config_req( - ctxt_pP->module_id, - ue_context_pP->ue_context.primaryCC_id, - ENB_FLAG_YES, - ue_context_pP->ue_context.rnti, - 0, - (RadioResourceConfigCommonSIB_t *) NULL, - ue_context_pP->ue_context.physicalConfigDedicated, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, -#endif - (MeasObjectToAddMod_t **) NULL, - ue_context_pP->ue_context.mac_MainConfig, - 1, - SRB1_logicalChannelConfig, - ue_context_pP->ue_context.measGapConfig, - (TDD_Config_t *) NULL, - (MobilityControlInfo_t *) mobilityInfo, - (uint8_t *) NULL, (uint16_t *) NULL, NULL, NULL, NULL, (MBSFN_SubframeConfigList_t *) NULL -#ifdef Rel10 - , 0, (MBSFN_AreaInfoList_r9_t *) NULL, (PMCH_InfoList_r9_t *) NULL -#endif -#ifdef CBA - , 0, 0 -#endif - ); + rrc_mac_config_req_eNB( + ctxt_pP->module_id, + ue_context_pP->ue_context.primaryCC_id, + 0,0,0,0,0, +#ifdef Rel14 + 0, +#endif + ue_context_pP->ue_context.rnti, + (BCCH_BCH_Message_t *) NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + ue_context_pP->ue_context.physicalConfigDedicated, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, +#endif + (MeasObjectToAddMod_t **) NULL, + ue_context_pP->ue_context.mac_MainConfig, + 1, + SRB1_logicalChannelConfig, + ue_context_pP->ue_context.measGapConfig, + (TDD_Config_t *) NULL, + (MobilityControlInfo_t *) mobilityInfo, + (SchedulingInfoList_t *) NULL, 0, NULL, NULL, (MBSFN_SubframeConfigList_t *) NULL +#if defined(Rel10) || defined(Rel14) + , 0, (MBSFN_AreaInfoList_r9_t *) NULL, (PMCH_InfoList_r9_t *) NULL +#endif +# ifdef Rel14 + , + (SystemInformationBlockType1_v1310_IEs_t *)NULL +# endif + ); + /* handoverCommand.criticalExtensions.present = HandoverCommand__criticalExtensions_PR_c1; handoverCommand.criticalExtensions.choice.c1.present = HandoverCommand__criticalExtensions__c1_PR_handoverCommand_r8; @@ -3002,17 +4588,17 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( #ifdef PROBLEM_COMPILATION_RESOLVED if (sourceModId != 0xFF) { - memcpy(eNB_rrc_inst[sourceModId].handover_info[eNB_rrc_inst[ctxt_pP->module_id].handover_info[ue_mod_idP]->ueid_s]->buf, + memcpy(RC.rrc[sourceModId].handover_info[RC.rrc[ctxt_pP->module_id]->handover_info[ue_mod_idP]->ueid_s]->buf, (void *)buffer, size); - eNB_rrc_inst[sourceModId].handover_info[eNB_rrc_inst[ctxt_pP->module_id].handover_info[ue_mod_idP]->ueid_s]->size = size; - eNB_rrc_inst[sourceModId].handover_info[eNB_rrc_inst[ctxt_pP->module_id].handover_info[ue_mod_idP]->ueid_s]->ho_complete = + RC.rrc[sourceModId].handover_info[RC.rrc[ctxt_pP->module_id]->handover_info[ue_mod_idP]->ueid_s]->size = size; + RC.rrc[sourceModId].handover_info[RC.rrc[ctxt_pP->module_id]->handover_info[ue_mod_idP]->ueid_s]->ho_complete = 0xF1; - //eNB_rrc_inst[ctxt_pP->module_id].handover_info[ue_mod_idP]->ho_complete = 0xFF; + //RC.rrc[ctxt_pP->module_id]->handover_info[ue_mod_idP]->ho_complete = 0xFF; LOG_D(RRC, "[eNB %d] Frame %d: setting handover complete to 0xF1 for (%d,%d) and to 0xFF for (%d,%d)\n", ctxt_pP->module_id, ctxt_pP->frame, sourceModId, - eNB_rrc_inst[ctxt_pP->module_id].handover_info[ue_mod_idP]->ueid_s, + RC.rrc[ctxt_pP->module_id]->handover_info[ue_mod_idP]->ueid_s, ctxt_pP->module_id, ue_mod_idP); } else @@ -3046,12 +4632,12 @@ rrc_eNB_generate_RRCConnectionReconfiguration_handover( void rrc_eNB_process_RRCConnectionReconfigurationComplete( const protocol_ctxt_t* const ctxt_pP, - rrc_eNB_ue_context_t* const ue_context_pP, - RRCConnectionReconfigurationComplete_r8_IEs_t* rrcConnectionReconfigurationComplete + rrc_eNB_ue_context_t* ue_context_pP, + const uint8_t xid ) //----------------------------------------------------------------------------- { - int i; + int i, drb_id; #ifdef PDCP_USE_NETLINK int oip_ifup = 0; int dest_ip_offset = 0; @@ -3065,9 +4651,12 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( uint8_t *kRRCenc = NULL; uint8_t *kRRCint = NULL; uint8_t *kUPenc = NULL; + ue_context_pP->ue_context.ue_reestablishment_timer = 0; - DRB_ToAddModList_t* DRB_configList = ue_context_pP->ue_context.DRB_configList; - //SRB_ToAddModList_t* SRB_configList = ue_context_pP->ue_context.SRB_configList; + DRB_ToAddModList_t* DRB_configList = ue_context_pP->ue_context.DRB_configList2[xid]; + SRB_ToAddModList_t* SRB_configList = ue_context_pP->ue_context.SRB_configList2[xid]; + DRB_ToReleaseList_t* DRB_Release_configList2 = ue_context_pP->ue_context.DRB_Release_configList2[xid]; + DRB_Identity_t* drb_id_p = NULL; T(T_ENB_RRC_CONNECTION_RECONFIGURATION_COMPLETE, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); @@ -3086,38 +4675,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ue_context_pP->ue_context.kenb, &kRRCint); #endif -#if ENABLE_RAL - { - MessageDef *message_ral_p = NULL; - rrc_ral_connection_reconfiguration_ind_t connection_reconfiguration_ind; - int i; - message_ral_p = itti_alloc_new_message(TASK_RRC_ENB, RRC_RAL_CONNECTION_RECONFIGURATION_IND); - memset(&connection_reconfiguration_ind, 0, sizeof(rrc_ral_connection_reconfiguration_ind_t)); - connection_reconfiguration_ind.ue_id = ctxt_pP->rnti; - - if (DRB_configList != NULL) { - connection_reconfiguration_ind.num_drb = DRB_configList->list.count; - - for (i = 0; (i < DRB_configList->list.count) && (i < maxDRB); i++) { - connection_reconfiguration_ind.drb_id[i] = DRB_configList->list.array[i]->drb_Identity; - } - } else { - connection_reconfiguration_ind.num_drb = 0; - } - - if (SRB_configList != NULL) { - connection_reconfiguration_ind.num_srb = SRB_configList->list.count; - } else { - connection_reconfiguration_ind.num_srb = 0; - } - - memcpy(&message_ral_p->ittiMsg, (void *)&connection_reconfiguration_ind, - sizeof(rrc_ral_connection_reconfiguration_ind_t)); - LOG_I(RRC, "Sending RRC_RAL_CONNECTION_RECONFIGURATION_IND to RAL\n"); - itti_send_msg_to_task(TASK_RAL_ENB, ctxt_pP->instance, message_ral_p); - } -#endif // Refresh SRBs/DRBs MSC_LOG_TX_MESSAGE( MSC_RRC_ENB, @@ -3130,35 +4688,64 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( rrc_pdcp_config_asn1_req( ctxt_pP, - NULL, //LG-RK 14/05/2014 SRB_configList, - DRB_configList, (DRB_ToReleaseList_t *) NULL, - /*eNB_rrc_inst[ctxt_pP->module_id].ciphering_algorithm[ue_mod_idP] | - (eNB_rrc_inst[ctxt_pP->module_id].integrity_algorithm[ue_mod_idP] << 4), + SRB_configList, //NULL, //LG-RK 14/05/2014 SRB_configList, + DRB_configList, +// (DRB_ToReleaseList_t *) NULL, + DRB_Release_configList2, + /*RC.rrc[ctxt_pP->module_id]->ciphering_algorithm[ue_mod_idP] | + (RC.rrc[ctxt_pP->module_id]->integrity_algorithm[ue_mod_idP] << 4), */ 0xff, // already configured during the securitymodecommand kRRCenc, kRRCint, kUPenc -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) , (PMCH_InfoList_r9_t *) NULL #endif - ); + ,NULL); // Refresh SRBs/DRBs rrc_rlc_config_asn1_req( ctxt_pP, - NULL, //LG-RK 14/05/2014 SRB_configList, + SRB_configList, // NULL, //LG-RK 14/05/2014 SRB_configList, DRB_configList, - (DRB_ToReleaseList_t *) NULL -#ifdef Rel10 +// (DRB_ToReleaseList_t *) NULL + DRB_Release_configList2 +#if defined(Rel10) || defined(Rel14) , (PMCH_InfoList_r9_t *) NULL #endif ); - + + // set the SRB active in Ue context + if (SRB_configList != NULL) { + for (i = 0; (i < SRB_configList->list.count) && (i < 3); i++) { + if (SRB_configList->list.array[i]->srb_Identity == 1 ){ + ue_context_pP->ue_context.Srb1.Active=1; + } + else if (SRB_configList->list.array[i]->srb_Identity == 2 ) { + ue_context_pP->ue_context.Srb2.Active=1; + ue_context_pP->ue_context.Srb2.Srb_info.Srb_id=2; + LOG_I(RRC,"[eNB %d] Frame %d CC %d : SRB2 is now active\n", + ctxt_pP->module_id, + ctxt_pP->frame, + ue_context_pP->ue_context.primaryCC_id); + } else { + LOG_W(RRC,"[eNB %d] Frame %d CC %d : invalide SRB identity %ld\n", + ctxt_pP->module_id, + ctxt_pP->frame, + ue_context_pP->ue_context.primaryCC_id, + SRB_configList->list.array[i]->srb_Identity); + } + } + free(SRB_configList); + ue_context_pP->ue_context.SRB_configList2[xid] = NULL; + } + // Loop through DRBs and establish if necessary if (DRB_configList != NULL) { for (i = 0; i < DRB_configList->list.count; i++) { // num max DRB (11-3-8) if (DRB_configList->list.array[i]) { + drb_id = (int)DRB_configList->list.array[i]->drb_Identity; LOG_I(RRC, "[eNB %d] Frame %d : Logical Channel UL-DCCH, Received RRCConnectionReconfigurationComplete from UE rnti %x, reconfiguring DRB %d/LCID %d\n", ctxt_pP->module_id, @@ -3175,15 +4762,15 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( (int)DRB_configList->list.array[i]->drb_Identity, (int)*DRB_configList->list.array[i]->logicalChannelIdentity); - if (ue_context_pP->ue_context.DRB_active[i] == 0) { + if (ue_context_pP->ue_context.DRB_active[drb_id] == 0) { /* rrc_pdcp_config_req (ctxt_pP->module_id, frameP, 1, CONFIG_ACTION_ADD, (ue_mod_idP * NB_RB_MAX) + *DRB_configList->list.array[i]->logicalChannelIdentity,UNDEF_SECURITY_MODE); rrc_rlc_config_req(ctxt_pP->module_id,frameP,1,CONFIG_ACTION_ADD, - (ue_mod_idP * NB_RB_MAX) + (int)*eNB_rrc_inst[ctxt_pP->module_id].DRB_config[ue_mod_idP][i]->logicalChannelIdentity, + (ue_mod_idP * NB_RB_MAX) + (int)*RC.rrc[ctxt_pP->module_id]->DRB_config[ue_mod_idP][i]->logicalChannelIdentity, RADIO_ACCESS_BEARER,Rlc_info_um); */ - ue_context_pP->ue_context.DRB_active[i] = 1; + ue_context_pP->ue_context.DRB_active[drb_id] = 1; LOG_D(RRC, "[eNB %d] Frame %d: Establish RLC UM Bidirectional, DRB %d Active\n", @@ -3200,16 +4787,11 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ctxt_pP->module_id + 1); // fourth octet if (oip_ifup == 0) { // interface is up --> send a config the DRB -# ifdef OAI_EMU - oai_emulation.info.oai_ifup[ctxt_pP->module_id] = 1; - dest_ip_offset = NB_eNB_INST; -# else dest_ip_offset = 8; -# endif LOG_I(OIP, - "[eNB %d] Config the oai%d to send/receive pkt on DRB %d to/from the protocol stack\n", + "[eNB %d] Config the oai%d to send/receive pkt on DRB %ld to/from the protocol stack\n", ctxt_pP->module_id, ctxt_pP->module_id, - (ue_context_pP->local_uid * maxDRB) + DRB_configList->list.array[i]->drb_Identity); + (long int)((ue_context_pP->local_uid * maxDRB) + DRB_configList->list.array[i]->drb_Identity)); ue_module_id = oai_emulation.info.eNB_ue_local_uid_to_ue_module_id[ctxt_pP->module_id][ue_context_pP->local_uid]; rb_conf_ipv4(0, //add ue_module_id, //cx @@ -3222,10 +4804,6 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ctxt_pP->module_id, ue_context_pP->ue_context.rnti, ue_module_id); } -# else -# ifdef OAI_EMU - oai_emulation.info.oai_ifup[ctxt_pP->module_id] = 1; -# endif # endif #endif @@ -3237,38 +4815,43 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( DRB2LCHAN[i] = (uint8_t) * DRB_configList->list.array[i]->logicalChannelIdentity; } - rrc_mac_config_req( - ctxt_pP->module_id, - ue_context_pP->ue_context.primaryCC_id, - ENB_FLAG_YES, - ue_context_pP->ue_context.rnti, - 0, - (RadioResourceConfigCommonSIB_t *) NULL, - ue_context_pP->ue_context.physicalConfigDedicated, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, + rrc_mac_config_req_eNB( + ctxt_pP->module_id, + ue_context_pP->ue_context.primaryCC_id, + 0,0,0,0,0, +#ifdef Rel14 + 0, #endif - (MeasObjectToAddMod_t **) NULL, - ue_context_pP->ue_context.mac_MainConfig, - DRB2LCHAN[i], - DRB_configList->list.array[i]->logicalChannelConfig, - ue_context_pP->ue_context.measGapConfig, - (TDD_Config_t *) NULL, - NULL, - (uint8_t *) NULL, - (uint16_t *) NULL, NULL, NULL, NULL, (MBSFN_SubframeConfigList_t *) NULL -#ifdef Rel10 - , 0, (MBSFN_AreaInfoList_r9_t *) NULL, (PMCH_InfoList_r9_t *) NULL + ue_context_pP->ue_context.rnti, + (BCCH_BCH_Message_t *) NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + ue_context_pP->ue_context.physicalConfigDedicated, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, #endif -#ifdef CBA - , eNB_rrc_inst[ctxt_pP->module_id].num_active_cba_groups, eNB_rrc_inst[ctxt_pP->module_id].cba_rnti[0] + (MeasObjectToAddMod_t **) NULL, + ue_context_pP->ue_context.mac_MainConfig, + DRB2LCHAN[i], + DRB_configList->list.array[i]->logicalChannelConfig, + ue_context_pP->ue_context.measGapConfig, + (TDD_Config_t *) NULL, + NULL, + (SchedulingInfoList_t *) NULL, + 0, NULL, NULL, (MBSFN_SubframeConfigList_t *) NULL +#if defined(Rel10) || defined(Rel14) + , 0, (MBSFN_AreaInfoList_r9_t *) NULL, (PMCH_InfoList_r9_t *) NULL #endif - ); - +# ifdef Rel14 + , + (SystemInformationBlockType1_v1310_IEs_t *)NULL +# endif + ); + } else { // remove LCHAN from MAC/PHY - if (ue_context_pP->ue_context.DRB_active[i] == 1) { + if (ue_context_pP->ue_context.DRB_active[drb_id] == 1) { // DRB has just been removed so remove RLC + PDCP for DRB /* rrc_pdcp_config_req (ctxt_pP->module_id, frameP, 1, CONFIG_ACTION_REMOVE, (ue_mod_idP * NB_RB_MAX) + DRB2LCHAN[i],UNDEF_SECURITY_MODE); @@ -3282,38 +4865,61 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( Rlc_info_um); } - ue_context_pP->ue_context.DRB_active[i] = 0; + ue_context_pP->ue_context.DRB_active[drb_id] = 0; LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (DRB) ---> MAC_eNB\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); - rrc_mac_config_req(ctxt_pP->module_id, - ue_context_pP->ue_context.primaryCC_id, - ENB_FLAG_YES, - ue_context_pP->ue_context.rnti, - 0, - (RadioResourceConfigCommonSIB_t *) NULL, - ue_context_pP->ue_context.physicalConfigDedicated, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, + rrc_mac_config_req_eNB(ctxt_pP->module_id, + ue_context_pP->ue_context.primaryCC_id, + 0,0,0,0,0, +#ifdef Rel14 + 0, #endif - (MeasObjectToAddMod_t **) NULL, - ue_context_pP->ue_context.mac_MainConfig, - DRB2LCHAN[i], - (LogicalChannelConfig_t *) NULL, - (MeasGapConfig_t *) NULL, - (TDD_Config_t *) NULL, - NULL, (uint8_t *) NULL, (uint16_t *) NULL, NULL, NULL, NULL, NULL -#ifdef Rel10 - , 0, (MBSFN_AreaInfoList_r9_t *) NULL, (PMCH_InfoList_r9_t *) NULL + ue_context_pP->ue_context.rnti, + (BCCH_BCH_Message_t *) NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + ue_context_pP->ue_context.physicalConfigDedicated, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, #endif -#ifdef CBA - , 0, 0 + (MeasObjectToAddMod_t **) NULL, + ue_context_pP->ue_context.mac_MainConfig, + DRB2LCHAN[i], + (LogicalChannelConfig_t *) NULL, + (MeasGapConfig_t *) NULL, + (TDD_Config_t *) NULL, + NULL, + (SchedulingInfoList_t *) NULL, + 0, NULL, NULL, NULL +#if defined(Rel10) || defined(Rel14) + , 0, (MBSFN_AreaInfoList_r9_t *) NULL, (PMCH_InfoList_r9_t *) NULL #endif - ); +# ifdef Rel14 + , + (SystemInformationBlockType1_v1310_IEs_t *)NULL +# endif + ); } } } + free(DRB_configList); + ue_context_pP->ue_context.DRB_configList2[xid] = NULL; + } + + if(DRB_Release_configList2 != NULL){ + for (i = 0; i < DRB_Release_configList2->list.count; i++) { + if (DRB_Release_configList2->list.array[i]) { + drb_id_p = DRB_Release_configList2->list.array[i]; + drb_id = *drb_id_p; + if (ue_context_pP->ue_context.DRB_active[drb_id] == 1) { + ue_context_pP->ue_context.DRB_active[drb_id] = 0; + } + } + } + free(DRB_Release_configList2); + ue_context_pP->ue_context.DRB_Release_configList2[xid] = NULL; } } @@ -3336,21 +4942,21 @@ rrc_eNB_generate_RRCConnectionSetup( T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); SRB_configList = &ue_context_pP->ue_context.SRB_configList; - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size = + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size = do_RRCConnectionSetup(ctxt_pP, ue_context_pP, - (uint8_t*) eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.Payload, - (mac_xface->lte_frame_parms->nb_antennas_tx==2)?2:1, + CC_id, + (uint8_t*) RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Payload, + (uint8_t) RC.rrc[ctxt_pP->module_id]->carrier[CC_id].p_eNB, //at this point we do not have the UE capability information, so it can only be TM1 or TM2 rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id), - mac_xface->lte_frame_parms, SRB_configList, &ue_context_pP->ue_context.physicalConfigDedicated); #ifdef RRC_MSG_PRINT LOG_F(RRC,"[MSG] RRC Connection Setup\n"); - for (cnt = 0; cnt < eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { - LOG_F(RRC,"%02x ", ((uint8_t*)eNB_rrc_inst[ctxt_pP->module_id].Srb0.Tx_buffer.Payload)[cnt]); + for (cnt = 0; cnt < RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size; cnt++) { + LOG_F(RRC,"%02x ", ((uint8_t*)RC.rrc[ctxt_pP->module_id]->Srb0.Tx_buffer.Payload)[cnt]); } LOG_F(RRC,"\n"); @@ -3378,34 +4984,39 @@ rrc_eNB_generate_RRCConnectionSetup( LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (SRB1) ---> MAC_eNB\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); - rrc_mac_config_req( - ctxt_pP->module_id, - ue_context_pP->ue_context.primaryCC_id, - ENB_FLAG_YES, - ue_context_pP->ue_context.rnti, - 0, - (RadioResourceConfigCommonSIB_t *) NULL, - ue_context_pP->ue_context.physicalConfigDedicated, -#ifdef Rel10 - (SCellToAddMod_r10_t *)NULL, - //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, + rrc_mac_config_req_eNB( + ctxt_pP->module_id, + ue_context_pP->ue_context.primaryCC_id, + 0,0,0,0,0, +#ifdef Rel14 + 0, #endif - (MeasObjectToAddMod_t **) NULL, - ue_context_pP->ue_context.mac_MainConfig, - 1, - SRB1_logicalChannelConfig, - ue_context_pP->ue_context.measGapConfig, - (TDD_Config_t *) NULL, - NULL, - (uint8_t *) NULL, - (uint16_t *) NULL, NULL, NULL, NULL, (MBSFN_SubframeConfigList_t *) NULL -#ifdef Rel10 - , 0, (MBSFN_AreaInfoList_r9_t *) NULL, (PMCH_InfoList_r9_t *) NULL + ue_context_pP->ue_context.rnti, + (BCCH_BCH_Message_t *) NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + (RadioResourceConfigCommonSIB_t *) NULL, + ue_context_pP->ue_context.physicalConfigDedicated, +#if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //(struct PhysicalConfigDedicatedSCell_r10 *)NULL, #endif -#ifdef CBA - , 0, 0 + (MeasObjectToAddMod_t **) NULL, + ue_context_pP->ue_context.mac_MainConfig, + 1, + SRB1_logicalChannelConfig, + ue_context_pP->ue_context.measGapConfig, + (TDD_Config_t *) NULL, + NULL, + (SchedulingInfoList_t *) NULL, + 0, NULL, NULL, (MBSFN_SubframeConfigList_t *) NULL +#if defined(Rel10) || defined(Rel14) + , 0, (MBSFN_AreaInfoList_r9_t *) NULL, (PMCH_InfoList_r9_t *) NULL #endif - ); +# ifdef Rel14 + , + (SystemInformationBlockType1_v1310_IEs_t *)NULL +# endif + ); break; } } @@ -3414,33 +5025,29 @@ rrc_eNB_generate_RRCConnectionSetup( MSC_LOG_TX_MESSAGE( MSC_RRC_ENB, MSC_RRC_UE, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.Header, // LG WARNING - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.Header, // LG WARNING + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size, MSC_AS_TIME_FMT" RRCConnectionSetup UE %x size %u", MSC_AS_TIME_ARGS(ctxt_pP), ue_context_pP->ue_context.rnti, - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size); LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" [RAPROC] Logical Channel DL-CCCH, Generating RRCConnectionSetup (bytes %d)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), - eNB_rrc_inst[ctxt_pP->module_id].carrier[CC_id].Srb0.Tx_buffer.payload_size); + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Srb0.Tx_buffer.payload_size); + // activate release timer, if RRCSetupComplete not received after 10 frames, remove UE + //ue_context_pP->ue_context.ue_release_timer=1; + // remove UE after 10 frames after RRCConnectionRelease is triggered + //ue_context_pP->ue_context.ue_release_timer_thres=100; + // activate release timer, if RRCSetupComplete not received after 100 frames, remove UE + ue_context_pP->ue_context.ue_release_timer=1; + // remove UE after 10 frames after RRCConnectionRelease is triggered + ue_context_pP->ue_context.ue_release_timer_thres=1000; } -#if defined(ENABLE_ITTI) -char -//----------------------------------------------------------------------------- -openair_rrc_eNB_init( - const module_id_t enb_mod_idP -) -//----------------------------------------------------------------------------- -{ - /* Dummy function, initialization will be done through ITTI messaging */ - return 0; -} -#endif #if defined(ENABLE_ITTI) //----------------------------------------------------------------------------- @@ -3465,11 +5072,19 @@ openair_rrc_eNB_init( PROTOCOL_RRC_CTXT_FMT" Init...\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt)); - AssertFatal(eNB_rrc_inst != NULL, "eNB_rrc_inst not initialized!"); +#if OCP_FRAMEWORK + while ( RC.rrc[enb_mod_idP] == NULL ) { + LOG_E(RRC, "RC.rrc not yet initialized, waiting 1 second\n"); + sleep(1); + } +#endif + AssertFatal(RC.rrc[enb_mod_idP] != NULL, "RC.rrc not initialized!"); AssertFatal(NUMBER_OF_UE_MAX < (module_id_t)0xFFFFFFFFFFFFFFFF, " variable overflow"); - +#ifdef ENABLE_ITTI + AssertFatal(configuration!=NULL,"configuration input is null\n"); +#endif // for (j = 0; j < NUMBER_OF_UE_MAX; j++) - // eNB_rrc_inst[ctxt.module_id].Info.UE[j].Status = RRC_IDLE; //CH_READY; + // RC.rrc[ctxt.module_id].Info.UE[j].Status = RRC_IDLE; //CH_READY; // //#if defined(ENABLE_USE_MME) // // Connect eNB to MME @@ -3478,39 +5093,47 @@ openair_rrc_eNB_init( // { // /* Init security parameters */ // for (j = 0; j < NUMBER_OF_UE_MAX; j++) { - // eNB_rrc_inst[ctxt.module_id].ciphering_algorithm[j] = SecurityAlgorithmConfig__cipheringAlgorithm_eea0; - // eNB_rrc_inst[ctxt.module_id].integrity_algorithm[j] = SecurityAlgorithmConfig__integrityProtAlgorithm_eia2; + // RC.rrc[ctxt.module_id].ciphering_algorithm[j] = SecurityAlgorithmConfig__cipheringAlgorithm_eea0; + // RC.rrc[ctxt.module_id].integrity_algorithm[j] = SecurityAlgorithmConfig__integrityProtAlgorithm_eia2; // rrc_eNB_init_security(enb_mod_idP, j); // } // } - eNB_rrc_inst[ctxt.module_id].Nb_ue = 0; + RC.rrc[ctxt.module_id]->Nb_ue = 0; for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - eNB_rrc_inst[ctxt.module_id].carrier[CC_id].Srb0.Active = 0; + RC.rrc[ctxt.module_id]->carrier[CC_id].Srb0.Active = 0; } - uid_linear_allocator_init(&eNB_rrc_inst[ctxt.module_id].uid_allocator); - RB_INIT(&eNB_rrc_inst[ctxt.module_id].rrc_ue_head); + uid_linear_allocator_init(&RC.rrc[ctxt.module_id]->uid_allocator); + RB_INIT(&RC.rrc[ctxt.module_id]->rrc_ue_head); // for (j = 0; j < (NUMBER_OF_UE_MAX + 1); j++) { - // eNB_rrc_inst[enb_mod_idP].Srb2[j].Active = 0; + // RC.rrc[enb_mod_idP]->Srb2[j].Active = 0; // } - eNB_rrc_inst[ctxt.module_id].initial_id2_s1ap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL); - eNB_rrc_inst[ctxt.module_id].s1ap_id2_s1ap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL); + RC.rrc[ctxt.module_id]->initial_id2_s1ap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL); + RC.rrc[ctxt.module_id]->s1ap_id2_s1ap_ids = hashtable_create (NUMBER_OF_UE_MAX * 2, NULL, NULL); + memcpy(&RC.rrc[ctxt.module_id]->configuration,configuration,sizeof(RrcConfigurationReq)); /// System Information INIT LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Checking release \n", PROTOCOL_RRC_CTXT_ARGS(&ctxt)); -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) + + // can clear it at runtime + RC.rrc[ctxt.module_id]->carrier[0].MBMS_flag = 0; // This has to come from some top-level configuration // only CC_id 0 is logged +#if defined(Rel10) LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Rel10 RRC detected, MBMS flag %d\n", +#else + LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Rel14 RRC detected, MBMS flag %d\n", +#endif PROTOCOL_RRC_CTXT_ARGS(&ctxt), - eNB_rrc_inst[ctxt.module_id].carrier[0].MBMS_flag); + RC.rrc[ctxt.module_id]->carrier[0].MBMS_flag); #else LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Rel8 RRC\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt)); @@ -3519,21 +5142,21 @@ openair_rrc_eNB_init( for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (j = 0; j < NUM_MAX_CBA_GROUP; j++) { - eNB_rrc_inst[ctxt.module_id].carrier[CC_id].cba_rnti[j] = CBA_OFFSET + j; + RC.rrc[ctxt.module_id]->carrier[CC_id].cba_rnti[j] = CBA_OFFSET + j; } - if (eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_active_cba_groups > NUM_MAX_CBA_GROUP) { - eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_active_cba_groups = NUM_MAX_CBA_GROUP; + if (RC.rrc[ctxt.module_id]->carrier[CC_id].num_active_cba_groups > NUM_MAX_CBA_GROUP) { + RC.rrc[ctxt.module_id]->carrier[CC_id].num_active_cba_groups = NUM_MAX_CBA_GROUP; } LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" Initialization of 4 cba_RNTI values (%x %x %x %x) num active groups %d\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt), - enb_mod_idP, eNB_rrc_inst[ctxt.module_id].carrier[CC_id].cba_rnti[0], - eNB_rrc_inst[ctxt.module_id].carrier[CC_id].cba_rnti[1], - eNB_rrc_inst[ctxt.module_id].carrier[CC_id].cba_rnti[2], - eNB_rrc_inst[ctxt.module_id].carrier[CC_id].cba_rnti[3], - eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_active_cba_groups); + enb_mod_idP, RC.rrc[ctxt.module_id]->carrier[CC_id].cba_rnti[0], + RC.rrc[ctxt.module_id]->carrier[CC_id].cba_rnti[1], + RC.rrc[ctxt.module_id]->carrier[CC_id].cba_rnti[2], + RC.rrc[ctxt.module_id]->carrier[CC_id].cba_rnti[3], + RC.rrc[ctxt.module_id]->carrier[CC_id].num_active_cba_groups); } #endif @@ -3545,46 +5168,46 @@ openair_rrc_eNB_init( , configuration #endif ); + for (int ue_id = 0; ue_id < NUMBER_OF_UE_MAX; ue_id++) { + RC.rrc[ctxt.module_id]->carrier[CC_id].sizeof_paging[ue_id] = 0; + RC.rrc[ctxt.module_id]->carrier[CC_id].paging[ue_id] = (uint8_t*) malloc16(256); + } } -#ifdef Rel10 - + rrc_init_global_param(); for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { - switch (eNB_rrc_inst[ctxt.module_id].carrier[CC_id].MBMS_flag) { + +#if defined(Rel10) || defined(Rel14) + switch (RC.rrc[ctxt.module_id]->carrier[CC_id].MBMS_flag) { case 1: case 2: case 3: LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Configuring 1 MBSFN sync area\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt)); - eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_mbsfn_sync_area = 1; + RC.rrc[ctxt.module_id]->carrier[CC_id].num_mbsfn_sync_area = 1; break; case 4: LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Configuring 2 MBSFN sync area\n", PROTOCOL_RRC_CTXT_ARGS(&ctxt)); - eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_mbsfn_sync_area = 2; + RC.rrc[ctxt.module_id]->carrier[CC_id].num_mbsfn_sync_area = 2; break; default: - eNB_rrc_inst[ctxt.module_id].carrier[CC_id].num_mbsfn_sync_area = 0; + RC.rrc[ctxt.module_id]->carrier[CC_id].num_mbsfn_sync_area = 0; break; } - // if we are here the eNB_rrc_inst[enb_mod_idP].MBMS_flag > 0, + // if we are here the RC.rrc[enb_mod_idP]->MBMS_flag > 0, /// MCCH INIT - if (eNB_rrc_inst[ctxt.module_id].carrier[CC_id].MBMS_flag > 0) { + if (RC.rrc[ctxt.module_id]->carrier[CC_id].MBMS_flag > 0) { init_MCCH(ctxt.module_id, CC_id); /// MTCH data bearer init init_MBMS(ctxt.module_id, CC_id, 0); } +#endif + + openair_rrc_top_init_eNB(RC.rrc[ctxt.module_id]->carrier[CC_id].MBMS_flag,0); } - -#endif - -#ifdef NO_RRM //init ch SRB0, SRB1 & BDTCH openair_rrc_on(&ctxt); -#else - eNB_rrc_inst[ctxt.module_id].Last_scan_req = 0; - send_msg(&S_rrc, msg_rrc_phy_synch_to_MR_ind(ctxt.module_id, eNB_rrc_inst[ctxt.module_id].Mac_id)); -#endif return 0; @@ -3614,7 +5237,7 @@ rrc_eNB_decode_ccch( //memset(ul_ccch_msg,0,sizeof(UL_CCCH_Message_t)); - LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Decoding UL CCCH %x.%x.%x.%x.%x.%x (%p)\n", + LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Decoding UL CCCH %x.%x.%x.%x.%x.%x (%p)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ((uint8_t*) Srb_info->Rx_buffer.Payload)[0], ((uint8_t *) Srb_info->Rx_buffer.Payload)[1], @@ -3631,6 +5254,7 @@ rrc_eNB_decode_ccch( 0, 0); + /* #if defined(ENABLE_ITTI) # if defined(DISABLE_ITTI_XER_PRINT) { @@ -3659,6 +5283,7 @@ rrc_eNB_decode_ccch( } # endif #endif + */ for (i = 0; i < 8; i++) { LOG_T(RRC, "%x.", ((uint8_t *) & ul_ccch_msg)[i]); @@ -3686,7 +5311,7 @@ rrc_eNB_decode_ccch( T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); #ifdef RRC_MSG_PRINT - LOG_F(RRC,"[MSG] RRC Connection Reestablishement Request\n"); + LOG_F(RRC,"[MSG] RRC Connection Reestablishment Request\n"); for (i = 0; i < Srb_info->Rx_buffer.payload_size; i++) { LOG_F(RRC,"%02x ", ((uint8_t*)Srb_info->Rx_buffer.Payload)[i]); @@ -3713,7 +5338,7 @@ rrc_eNB_decode_ccch( ue_mod_id = rrc_eNB_get_UE_index(enb_mod_idP, c_rnti); } - if ((eNB_rrc_inst[enb_mod_idP].phyCellId == rrcConnectionReestablishmentRequest.UE_identity.physCellId) && + if ((RC.rrc[enb_mod_idP]->phyCellId == rrcConnectionReestablishmentRequest.UE_identity.physCellId) && (ue_mod_id != UE_INDEX_INVALID)){ rrc_eNB_generate_RRCConnectionReestablishment(enb_mod_idP, frameP, ue_mod_id); }else { @@ -3721,9 +5346,157 @@ rrc_eNB_decode_ccch( } */ /* reject all reestablishment attempts for the moment */ - rrc_eNB_generate_RRCConnectionReestablishmentReject(ctxt_pP, - rrc_eNB_get_ue_context(&eNB_rrc_inst[ctxt_pP->module_id], ctxt_pP->rnti), - CC_id); +// rrc_eNB_generate_RRCConnectionReestablishmentReject(ctxt_pP, +// rrc_eNB_get_ue_context(RC.rrc[ctxt_pP->module_id], ctxt_pP->rnti), +// CC_id); +{ + uint16_t c_rnti = 0; + + if (rrcConnectionReestablishmentRequest->ue_Identity.physCellId != RC.rrc[ctxt_pP->module_id]->carrier[CC_id].physCellId) { + LOG_E(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" RRCConnectionReestablishmentRequest ue_Identity.physCellId(%ld) is not equal to current physCellId(%d), let's reject the UE\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), + rrcConnectionReestablishmentRequest->ue_Identity.physCellId, + RC.rrc[ctxt_pP->module_id]->carrier[CC_id].physCellId); + rrc_eNB_generate_RRCConnectionReestablishmentReject(ctxt_pP, ue_context_p, CC_id); + break; + } + LOG_D(RRC, "physCellId is %ld\n", rrcConnectionReestablishmentRequest->ue_Identity.physCellId); + + for (i = 0; i < rrcConnectionReestablishmentRequest->ue_Identity.shortMAC_I.size; i++) { + LOG_D(RRC, "rrcConnectionReestablishmentRequest->ue_Identity.shortMAC_I.buf[%d] = %x\n", + i, rrcConnectionReestablishmentRequest->ue_Identity.shortMAC_I.buf[i]); + } + + if (rrcConnectionReestablishmentRequest->ue_Identity.c_RNTI.size == 0 || + rrcConnectionReestablishmentRequest->ue_Identity.c_RNTI.size > 2) { + LOG_E(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" RRCConnectionReestablishmentRequest c_RNTI range error, let's reject the UE\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + rrc_eNB_generate_RRCConnectionReestablishmentReject(ctxt_pP, ue_context_p, CC_id); + break; + + } + + c_rnti = BIT_STRING_to_uint16(&rrcConnectionReestablishmentRequest->ue_Identity.c_RNTI); + LOG_D(RRC, "c_rnti is %x\n", c_rnti); + + ue_context_p = rrc_eNB_get_ue_context(RC.rrc[ctxt_pP->module_id], c_rnti); + if (ue_context_p == NULL) { + LOG_E(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" RRCConnectionReestablishmentRequest without UE context, let's reject the UE\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + rrc_eNB_generate_RRCConnectionReestablishmentReject(ctxt_pP, ue_context_p, CC_id); + break; + } + int UE_id = find_UE_id(ctxt_pP->module_id, c_rnti); + if(ue_context_p->ue_context.ue_reestablishment_timer > 0 || RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer > 0){ + LOG_I(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" RRCConnectionReestablishment(Previous) don't complete, let's reject the UE\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + rrc_eNB_generate_RRCConnectionReestablishmentReject(ctxt_pP, ue_context_p, CC_id); + break; + } + LOG_D(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" UE context: %p\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), + ue_context_p); + ue_context_p->ue_context.ul_failure_timer = 0; + ue_context_p->ue_context.ue_release_timer = 0; + ue_context_p->ue_context.ue_reestablishment_timer = 0; + ue_context_p->ue_context.ue_release_timer_s1 = 0; + ue_context_p->ue_context.ue_release_timer_rrc = 0; + + /* reset timers */ + ue_context_p->ue_context.ul_failure_timer = 0; + ue_context_p->ue_context.ue_release_timer = 0; + + // insert C-RNTI to map + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (reestablish_rnti_map[i][0] == 0) { + reestablish_rnti_map[i][0] = ctxt_pP->rnti; + reestablish_rnti_map[i][1] = c_rnti; + break; + } + } + LOG_D(RRC, "reestablish_rnti_map[%d] [0] %x, [1] %x\n", + i, reestablish_rnti_map[i][0], reestablish_rnti_map[i][1]); + +#if defined(ENABLE_ITTI) + ue_context_p->ue_context.reestablishment_cause = rrcConnectionReestablishmentRequest->reestablishmentCause; + LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept connection reestablishment request from UE physCellId %ld cause %ld\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), + rrcConnectionReestablishmentRequest->ue_Identity.physCellId, + ue_context_p->ue_context.reestablishment_cause); +#else + LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept connection restablishment request for UE\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); +#endif + +#ifndef NO_RRM + send_msg(&S_rrc, msg_rrc_MR_attach_ind(ctxt_pP->module_id, Mac_id)); +#else + + ue_context_p->ue_context.primaryCC_id = CC_id; + + //LG COMMENT Idx = (ue_mod_idP * NB_RB_MAX) + DCCH; + Idx = DCCH; + // SRB1 + ue_context_p->ue_context.Srb1.Active = 1; + ue_context_p->ue_context.Srb1.Srb_info.Srb_id = Idx; + memcpy(&ue_context_p->ue_context.Srb1.Srb_info.Lchan_desc[0], + &DCCH_LCHAN_DESC, + LCHAN_DESC_SIZE); + memcpy(&ue_context_p->ue_context.Srb1.Srb_info.Lchan_desc[1], + &DCCH_LCHAN_DESC, + LCHAN_DESC_SIZE); + + // SRB2: set it to go through SRB1 with id 1 (DCCH) + ue_context_p->ue_context.Srb2.Active = 1; + ue_context_p->ue_context.Srb2.Srb_info.Srb_id = Idx; + memcpy(&ue_context_p->ue_context.Srb2.Srb_info.Lchan_desc[0], + &DCCH_LCHAN_DESC, + LCHAN_DESC_SIZE); + memcpy(&ue_context_p->ue_context.Srb2.Srb_info.Lchan_desc[1], + &DCCH_LCHAN_DESC, + LCHAN_DESC_SIZE); + + rrc_eNB_generate_RRCConnectionReestablishment(ctxt_pP, ue_context_p, CC_id); + LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT"CALLING RLC CONFIG SRB1 (rbid %d)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), + Idx); + + MSC_LOG_TX_MESSAGE(MSC_RRC_ENB, + MSC_PDCP_ENB, + NULL, + 0, + MSC_AS_TIME_FMT" CONFIG_REQ UE %x SRB", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_p->ue_context.rnti); + + rrc_pdcp_config_asn1_req(ctxt_pP, + ue_context_p->ue_context.SRB_configList, + (DRB_ToAddModList_t *) NULL, + (DRB_ToReleaseList_t*) NULL, + 0xff, + NULL, + NULL, + NULL +# if defined(Rel10) || defined(Rel14) + , (PMCH_InfoList_r9_t *) NULL +# endif + ,NULL); + + rrc_rlc_config_asn1_req(ctxt_pP, + ue_context_p->ue_context.SRB_configList, + (DRB_ToAddModList_t*) NULL, + (DRB_ToReleaseList_t*) NULL +# if defined(Rel10) || defined(Rel14) + , (PMCH_InfoList_r9_t *) NULL +# endif + ); +#endif //NO_RRM + } break; case UL_CCCH_MessageType__c1_PR_rrcConnectionRequest: @@ -3743,7 +5516,7 @@ rrc_eNB_decode_ccch( PROTOCOL_RRC_CTXT_UE_FMT"MAC_eNB --- MAC_DATA_IND (rrcConnectionRequest on SRB0) --> RRC_eNB\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); ue_context_p = rrc_eNB_get_ue_context( - &eNB_rrc_inst[ctxt_pP->module_id], + RC.rrc[ctxt_pP->module_id], ctxt_pP->rnti); if (ue_context_p != NULL) { @@ -3772,13 +5545,23 @@ rrc_eNB_decode_ccch( /* if there is already a registered UE (with another RNTI) with this random_value, * the current one must be removed from MAC/PHY (zombie UE) */ +#if 0 if ((ue_context_p = rrc_eNB_ue_context_random_exist(ctxt_pP, random_value))) { -//#warning "TODO: random_exist: remove UE from MAC/PHY (how?)" - // AssertFatal(0 == 1, "TODO: remove UE from MAC/PHY (how?)"); + LOG_W(RRC, "new UE rnti %x (coming with random value) is already there as UE %x, removing %x from MAC/PHY\n", + ctxt_pP->rnti, ue_context_p->ue_context.rnti, ctxt_pP->rnti); + rrc_mac_remove_ue(ctxt_pP->module_id, ctxt_pP->rnti); ue_context_p = NULL; + return 0; } else { ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, random_value); } +#endif + if ((ue_context_p = rrc_eNB_ue_context_random_exist(ctxt_pP, random_value))) { + LOG_W(RRC, "new UE rnti %x (coming with random value) is already there as UE %x, removing %x from MAC/PHY\n", + ctxt_pP->rnti, ue_context_p->ue_context.rnti, ue_context_p->ue_context.rnti); + ue_context_p->ue_context.ul_failure_timer = 20000; + } + ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, random_value); } else if (InitialUE_Identity_PR_s_TMSI == rrcConnectionRequest->ue_Identity.present) { /* Save s-TMSI */ S_TMSI_t s_TMSI = rrcConnectionRequest->ue_Identity.choice.s_TMSI; @@ -3786,24 +5569,26 @@ rrc_eNB_decode_ccch( m_tmsi_t m_tmsi = BIT_STRING_to_uint32(&s_TMSI.m_TMSI); random_value = (((uint64_t)mme_code) << 32) | m_tmsi; if ((ue_context_p = rrc_eNB_ue_context_stmsi_exist(ctxt_pP, mme_code, m_tmsi))) { - - //#warning "TODO: stmsi_exist: remove UE from MAC/PHY (how?)" - LOG_I(RRC," S-TMSI exists, ue_context_p %p\n",ue_context_p); + LOG_I(RRC," S-TMSI exists, ue_context_p %p, old rnti %x => %x\n",ue_context_p,ue_context_p->ue_context.rnti,ctxt_pP->rnti); + rrc_mac_remove_ue(ctxt_pP->module_id, ue_context_p->ue_context.rnti); stmsi_received=1; /* replace rnti in the context */ /* for that, remove the context from the RB tree */ - RB_REMOVE(rrc_ue_tree_s, &eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head, ue_context_p); + RB_REMOVE(rrc_ue_tree_s, &RC.rrc[ctxt_pP->module_id]->rrc_ue_head, ue_context_p); /* and insert again, after changing rnti everywhere it has to be changed */ ue_context_p->ue_id_rnti = ctxt_pP->rnti; ue_context_p->ue_context.rnti = ctxt_pP->rnti; - RB_INSERT(rrc_ue_tree_s, &eNB_rrc_inst[ctxt_pP->module_id].rrc_ue_head, ue_context_p); + RB_INSERT(rrc_ue_tree_s, &RC.rrc[ctxt_pP->module_id]->rrc_ue_head, ue_context_p); /* reset timers */ ue_context_p->ue_context.ul_failure_timer = 0; ue_context_p->ue_context.ue_release_timer = 0; - // AssertFatal(0 == 1, "TODO: remove UE from MAC/PHY (how?)"); - // ue_context_p = NULL; + ue_context_p->ue_context.ue_reestablishment_timer = 0; + ue_context_p->ue_context.ue_release_timer_s1 = 0; + ue_context_p->ue_context.ue_release_timer_rrc = 0; } else { - ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, NOT_A_RANDOM_UE_IDENTITY); + LOG_I(RRC," S-TMSI doesn't exist, setting Initialue_identity_s_TMSI.m_tmsi to %p => %x\n",ue_context_p,m_tmsi); +// ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, NOT_A_RANDOM_UE_IDENTITY); + ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP,random_value); if (ue_context_p == NULL) LOG_E(RRC, "%s:%d:%s: rrc_eNB_get_next_free_ue_context returned NULL\n", __FILE__, __LINE__, __FUNCTION__); if (ue_context_p != NULL) { @@ -3811,7 +5596,8 @@ rrc_eNB_decode_ccch( ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code = mme_code; ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi = m_tmsi; } else { - break; + /* TODO: do we have to break here? */ + //break; } } @@ -3832,14 +5618,14 @@ rrc_eNB_decode_ccch( PROTOCOL_RRC_CTXT_UE_FMT" RRCConnectionRequest without random UE identity or S-TMSI not supported, let's reject the UE\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); rrc_eNB_generate_RRCConnectionReject(ctxt_pP, - rrc_eNB_get_ue_context(&eNB_rrc_inst[ctxt_pP->module_id], ctxt_pP->rnti), + rrc_eNB_get_ue_context(RC.rrc[ctxt_pP->module_id], ctxt_pP->rnti), CC_id); break; } } LOG_D(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE context: %X\n", + PROTOCOL_RRC_CTXT_UE_FMT" UE context: %p\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_context_p); @@ -3848,15 +5634,16 @@ rrc_eNB_decode_ccch( #if defined(ENABLE_ITTI) ue_context_p->ue_context.establishment_cause = rrcConnectionRequest->establishmentCause; + ue_context_p->ue_context.reestablishment_cause = ReestablishmentCause_spare1; if (stmsi_received==0) - LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection from UE random UE identity (0x%" PRIx64 ") MME code %u TMSI %u cause %u\n", + LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection from UE random UE identity (0x%" PRIx64 ") MME code %u TMSI %u cause %ld\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_context_p->ue_context.random_ue_identity, ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code, ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi, ue_context_p->ue_context.establishment_cause); else - LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection from UE MME code %u TMSI %u cause %u\n", + LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Accept new connection from UE MME code %u TMSI %u cause %ld\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), ue_context_p->ue_context.Initialue_identity_s_TMSI.mme_code, ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi, @@ -3867,13 +5654,14 @@ rrc_eNB_decode_ccch( ue_context_p->ue_context.random_ue_identity); #endif if (stmsi_received == 0) - eNB_rrc_inst[ctxt_pP->module_id].Nb_ue++; + RC.rrc[ctxt_pP->module_id]->Nb_ue++; } else { // no context available LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Can't create new context for UE random UE identity (0x%" PRIx64 ")\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), random_value); + rrc_mac_remove_ue(ctxt_pP->module_id,ctxt_pP->rnti); return -1; } } @@ -3896,7 +5684,7 @@ rrc_eNB_decode_ccch( &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); - // SRB2 + // SRB2: set it to go through SRB1 with id 1 (DCCH) ue_context_p->ue_context.Srb2.Active = 1; ue_context_p->ue_context.Srb2.Srb_info.Srb_id = Idx; memcpy(&ue_context_p->ue_context.Srb2.Srb_info.Lchan_desc[0], @@ -3905,7 +5693,7 @@ rrc_eNB_decode_ccch( memcpy(&ue_context_p->ue_context.Srb2.Srb_info.Lchan_desc[1], &DCCH_LCHAN_DESC, LCHAN_DESC_SIZE); - + rrc_eNB_generate_RRCConnectionSetup(ctxt_pP, ue_context_p, CC_id); LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT"CALLING RLC CONFIG SRB1 (rbid %d)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), @@ -3928,16 +5716,16 @@ rrc_eNB_decode_ccch( NULL, NULL, NULL -# ifdef Rel10 +# if defined(Rel10) || defined(Rel14) , (PMCH_InfoList_r9_t *) NULL # endif - ); + ,NULL); rrc_rlc_config_asn1_req(ctxt_pP, ue_context_p->ue_context.SRB_configList, (DRB_ToAddModList_t*) NULL, (DRB_ToReleaseList_t*) NULL -# ifdef Rel10 +# if defined(Rel10) || defined(Rel14) , (PMCH_InfoList_r9_t *) NULL # endif ); @@ -3979,6 +5767,14 @@ rrc_eNB_decode_dcch( UE_EUTRA_Capability_t *UE_EUTRA_Capability = NULL; int i; struct rrc_eNB_ue_context_s* ue_context_p = NULL; +#if defined(ENABLE_ITTI) +# if defined(ENABLE_USE_MME) + MessageDef * msg_delete_tunnels_p = NULL; + uint8_t xid; +#endif +#endif + + int dedicated_DRB=0; T(T_ENB_RRC_UL_DCCH_DATA_IN, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); @@ -3987,8 +5783,11 @@ rrc_eNB_decode_dcch( LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Received message on SRB%d, should not have ...\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), Srb_id); + } else { + LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Received message on SRB%d\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), + Srb_id); } - //memset(ul_dcch_msg,0,sizeof(UL_DCCH_Message_t)); LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Decoding UL-DCCH Message\n", @@ -4001,7 +5800,7 @@ rrc_eNB_decode_dcch( sdu_sizeP, 0, 0); - + /* #if defined(ENABLE_ITTI) # if defined(DISABLE_ITTI_XER_PRINT) { @@ -4030,7 +5829,7 @@ rrc_eNB_decode_dcch( } # endif #endif - + */ { for (i = 0; i < sdu_sizeP; i++) { LOG_T(RRC, "%x.", Rx_sdu[i]); @@ -4040,14 +5839,14 @@ rrc_eNB_decode_dcch( } if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) { - LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Failed to decode UL-DCCH (%d bytes)\n", + LOG_E(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Failed to decode UL-DCCH (%zu bytes)\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), dec_rval.consumed); return -1; } ue_context_p = rrc_eNB_get_ue_context( - &eNB_rrc_inst[ctxt_pP->module_id], + RC.rrc[ctxt_pP->module_id], ctxt_pP->rnti); if (ul_dcch_msg->message.present == UL_DCCH_MessageType_PR_c1) { @@ -4103,30 +5902,101 @@ rrc_eNB_decode_dcch( if (ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions. present == RRCConnectionReconfigurationComplete__criticalExtensions_PR_rrcConnectionReconfigurationComplete_r8) { - rrc_eNB_process_RRCConnectionReconfigurationComplete( + /*NN: revise the condition */ + if (ue_context_p->ue_context.Status == RRC_RECONFIGURED){ + dedicated_DRB = 1; + LOG_I(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (dedicated DRB, xid %ld)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); + }else { + dedicated_DRB = 0; + ue_context_p->ue_context.Status = RRC_RECONFIGURED; + LOG_I(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED (default DRB, xid %ld)\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); + } + rrc_eNB_process_RRCConnectionReconfigurationComplete( ctxt_pP, ue_context_p, - &ul_dcch_msg->message.choice.c1.choice. - rrcConnectionReconfigurationComplete. - criticalExtensions.choice. - rrcConnectionReconfigurationComplete_r8); - ue_context_p->ue_context.Status = RRC_RECONFIGURED; - LOG_I(RRC, - PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED \n", - PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); - } + ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); -#if defined(ENABLE_USE_MME) -# if defined(ENABLE_ITTI) - - if (EPC_MODE_ENABLED == 1) { - rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP( - ctxt_pP, - ue_context_p); - } - -# endif +#if defined(FLEXRAN_AGENT_SB_IF) + //WARNING:Inform the controller about the UE activation. Should be moved to RRC agent in the future + if (mac_agent_registered[ctxt_pP->module_id]) { + agent_mac_xface[ctxt_pP->eNB_index]->flexran_agent_notify_ue_state_change(ctxt_pP->module_id, + ue_context_p->ue_id_rnti, + PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_UPDATED); + } #endif + } +#if defined(ENABLE_ITTI) +# if defined(ENABLE_USE_MME) + if (EPC_MODE_ENABLED == 1) { + if (dedicated_DRB == 1){ +// rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(ctxt_pP, +// ue_context_p, +// ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); +if (ue_context_p->ue_context.nb_of_modify_e_rabs > 0) { + rrc_eNB_send_S1AP_E_RAB_MODIFY_RESP(ctxt_pP, + ue_context_p, + ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); + + ue_context_p->ue_context.nb_of_modify_e_rabs = 0; + ue_context_p->ue_context.nb_of_failed_e_rabs = 0; + memset(ue_context_p->ue_context.modify_e_rab, 0, sizeof(ue_context_p->ue_context.modify_e_rab)); + for(int i = 0; i < NB_RB_MAX; i++) { + ue_context_p->ue_context.modify_e_rab[i].xid = -1; + } + + } else if(ue_context_p->ue_context.e_rab_release_command_flag == 1){ + xid = ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier; + ue_context_p->ue_context.e_rab_release_command_flag = 0; + //gtp tunnel delete + msg_delete_tunnels_p = itti_alloc_new_message(TASK_RRC_ENB, GTPV1U_ENB_DELETE_TUNNEL_REQ); + memset(>PV1U_ENB_DELETE_TUNNEL_REQ(msg_delete_tunnels_p), 0, sizeof(GTPV1U_ENB_DELETE_TUNNEL_REQ(msg_delete_tunnels_p))); + GTPV1U_ENB_DELETE_TUNNEL_REQ(msg_delete_tunnels_p).rnti = ue_context_p->ue_context.rnti; + for(i = 0; i < NB_RB_MAX; i++){ + if(xid == ue_context_p->ue_context.e_rab[i].xid){ + GTPV1U_ENB_DELETE_TUNNEL_REQ(msg_delete_tunnels_p).eps_bearer_id[GTPV1U_ENB_DELETE_TUNNEL_REQ(msg_delete_tunnels_p).num_erab++] = ue_context_p->ue_context.enb_gtp_ebi[i]; + ue_context_p->ue_context.enb_gtp_teid[i] = 0; + memset(&ue_context_p->ue_context.enb_gtp_addrs[i], 0, sizeof(ue_context_p->ue_context.enb_gtp_addrs[i])); + ue_context_p->ue_context.enb_gtp_ebi[i] = 0; + } + } + itti_send_msg_to_task(TASK_GTPV1_U, ctxt_pP->instance, msg_delete_tunnels_p); + //S1AP_E_RAB_RELEASE_RESPONSE + rrc_eNB_send_S1AP_E_RAB_RELEASE_RESPONSE(ctxt_pP, + ue_context_p, + xid); + } else { + rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(ctxt_pP, + ue_context_p, + ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); + } + }else { + if(ue_context_p->ue_context.reestablishment_cause == ReestablishmentCause_spare1){ + rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(ctxt_pP, + ue_context_p); + } else { + ue_context_p->ue_context.reestablishment_cause = ReestablishmentCause_spare1; + for (uint8_t e_rab = 0; e_rab < ue_context_p->ue_context.nb_of_e_rabs; e_rab++) { + if (ue_context_p->ue_context.e_rab[e_rab].status == E_RAB_STATUS_DONE) { + ue_context_p->ue_context.e_rab[e_rab].status = E_RAB_STATUS_ESTABLISHED; + } else { + ue_context_p->ue_context.e_rab[e_rab].status = E_RAB_STATUS_FAILED; + } + } + } + } + } +#else // establish a dedicated bearer + if (dedicated_DRB == 0 ) { + // ue_context_p->ue_context.e_rab[0].status = E_RAB_STATUS_ESTABLISHED; + rrc_eNB_reconfigure_DRBs(ctxt_pP,ue_context_p); + } + +#endif +#endif break; case UL_DCCH_MessageType__c1_PR_rrcConnectionReestablishmentComplete: @@ -4159,6 +6029,53 @@ rrc_eNB_decode_dcch( PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), DCCH, sdu_sizeP); + { + int UE_id = find_UE_id(ctxt_pP->module_id, ctxt_pP->rnti); + RC.mac[ctxt_pP->module_id]->UE_list.UE_sched_ctrl[UE_id].ue_reestablishment_reject_timer = 0; + rnti_t reestablish_rnti = 0; + // select C-RNTI from map + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if (reestablish_rnti_map[i][0] == ctxt_pP->rnti) { + reestablish_rnti = reestablish_rnti_map[i][1]; + ue_context_p = rrc_eNB_get_ue_context( + RC.rrc[ctxt_pP->module_id], + reestablish_rnti); + // clear currentC-RNTI from map + reestablish_rnti_map[i][0] = 0; + reestablish_rnti_map[i][1] = 0; + break; + } + } + LOG_D(RRC, "reestablish_rnti_map[%d] [0] %x, [1] %x\n", + i, reestablish_rnti_map[i][0], reestablish_rnti_map[i][1]); + + if (!ue_context_p) { + LOG_E(RRC, + PROTOCOL_RRC_CTXT_UE_FMT" RRCConnectionReestablishmentComplete without UE context, falt\n", + PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + break; + } + + if (ul_dcch_msg->message.choice.c1.choice.rrcConnectionReestablishmentComplete.criticalExtensions.present == + RRCConnectionReestablishmentComplete__criticalExtensions_PR_rrcConnectionReestablishmentComplete_r8) { + rrc_eNB_process_RRCConnectionReestablishmentComplete(ctxt_pP, reestablish_rnti, ue_context_p, + ul_dcch_msg->message.choice.c1.choice.rrcConnectionReestablishmentComplete.rrc_TransactionIdentifier, + &ul_dcch_msg->message.choice.c1.choice.rrcConnectionReestablishmentComplete.criticalExtensions.choice.rrcConnectionReestablishmentComplete_r8); + +#if defined(FLEXRAN_AGENT_SB_IF) + //WARNING:Inform the controller about the UE activation. Should be moved to RRC agent in the future + if (mac_agent_registered[ctxt_pP->module_id]) { + agent_mac_xface[ctxt_pP->eNB_index]->flexran_agent_notify_ue_state_change(ctxt_pP->module_id, + ue_context_p->ue_id_rnti, + PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_ACTIVATED); + } +#endif + } + //ue_context_p->ue_context.ue_release_timer = 0; + ue_context_p->ue_context.ue_reestablishment_timer = 1; + // remove UE after 100 frames after RRCConnectionReestablishmentRelease is triggered + ue_context_p->ue_context.ue_reestablishment_timer_thres = 1000; + } break; case UL_DCCH_MessageType__c1_PR_rrcConnectionSetupComplete: @@ -4201,9 +6118,19 @@ rrc_eNB_decode_dcch( ue_context_p->ue_context.Status = RRC_CONNECTED; LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_CONNECTED \n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); + +#if defined(FLEXRAN_AGENT_SB_IF) + //WARNING:Inform the controller about the UE activation. Should be moved to RRC agent in the future + if (mac_agent_registered[ctxt_pP->module_id]) { + agent_mac_xface[ctxt_pP->eNB_index]->flexran_agent_notify_ue_state_change(ctxt_pP->module_id, + ue_context_p->ue_id_rnti, + PROTOCOL__FLEX_UE_STATE_CHANGE_TYPE__FLUESC_ACTIVATED); + } +#endif } } + ue_context_p->ue_context.ue_release_timer=0; break; case UL_DCCH_MessageType__c1_PR_securityModeComplete: @@ -4213,7 +6140,7 @@ rrc_eNB_decode_dcch( #ifdef RRC_MSG_PRINT LOG_F(RRC,"[MSG] RRC Security Mode Complete\n"); - for (i = 0; i < sdu_sizeP; i++) { + for (i = 0; i < sdu_sizeP; i++) eNB->pusch_vars[UE_id]{ LOG_F(RRC,"%02x ", ((uint8_t*)Rx_sdu)[i]); } @@ -4328,6 +6255,7 @@ rrc_eNB_decode_dcch( #ifdef XER_PRINT xer_fprint(stdout, &asn_DEF_UL_DCCH_Message, (void *)ul_dcch_msg); #endif + LOG_I(RRC, "got UE capabilities for UE %x\n", ctxt_pP->rnti); dec_rval = uper_decode(NULL, &asn_DEF_UE_EUTRA_Capability, (void **)&UE_EUTRA_Capability, @@ -4338,7 +6266,7 @@ rrc_eNB_decode_dcch( choice.c1.choice.ueCapabilityInformation_r8.ue_CapabilityRAT_ContainerList.list. array[0]->ueCapabilityRAT_Container.size, 0, 0); //#ifdef XER_PRINT - xer_fprint(stdout, &asn_DEF_UE_EUTRA_Capability, (void *)UE_EUTRA_Capability); + //xer_fprint(stdout, &asn_DEF_UE_EUTRA_Capability, (void *)UE_EUTRA_Capability); //#endif #if defined(ENABLE_USE_MME) @@ -4348,12 +6276,19 @@ rrc_eNB_decode_dcch( ue_context_p, ul_dcch_msg); } - +#else + ue_context_p->ue_context.nb_of_e_rabs = 1; + for (i = 0; i < ue_context_p->ue_context.nb_of_e_rabs; i++){ + ue_context_p->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_p->ue_context.e_rab[i].param.e_rab_id = 1+i; + ue_context_p->ue_context.e_rab[i].param.qos.qci=9; + } + ue_context_p->ue_context.setup_e_rabs =ue_context_p->ue_context.nb_of_e_rabs; #endif rrc_eNB_generate_defaultRRCConnectionReconfiguration(ctxt_pP, ue_context_p, - eNB_rrc_inst[ctxt_pP->module_id].HO_flag); + RC.rrc[ctxt_pP->module_id]->HO_flag); break; case UL_DCCH_MessageType__c1_PR_ulHandoverPreparationTransfer: @@ -4366,6 +6301,7 @@ rrc_eNB_decode_dcch( T(T_ENB_RRC_UL_INFORMATION_TRANSFER, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); + LOG_D(RRC,"[MSG] RRC UL Information Transfer \n"); #ifdef RRC_MSG_PRINT LOG_F(RRC,"[MSG] RRC UL Information Transfer \n"); @@ -4404,7 +6340,7 @@ rrc_eNB_decode_dcch( break; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) case UL_DCCH_MessageType__c1_PR_ueInformationResponse_r9: T(T_ENB_RRC_UE_INFORMATION_RESPONSE_R9, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), @@ -4458,6 +6394,40 @@ rrc_eNB_decode_dcch( } #if defined(ENABLE_ITTI) +void rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* ue_context_pP){ + + int i; + int e_rab_done=0; + for (i = 0; + i < 3;//NB_RB_MAX - 3; // S1AP_MAX_E_RAB + i++) { + + if ( ue_context_pP->ue_context.e_rab[i].status < E_RAB_STATUS_DONE){ + ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_pP->ue_context.e_rab[i].param.e_rab_id = i + 1; + ue_context_pP->ue_context.e_rab[i].param.qos.qci = i % 9; + ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.priority_level= i % PRIORITY_LEVEL_LOWEST; + ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.pre_emp_capability= PRE_EMPTION_CAPABILITY_DISABLED; + ue_context_pP->ue_context.e_rab[i].param.qos.allocation_retention_priority.pre_emp_vulnerability= PRE_EMPTION_VULNERABILITY_DISABLED; + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer = NULL; + ue_context_pP->ue_context.e_rab[i].param.nas_pdu.length = 0; + // memset (ue_context_pP->ue_context.e_rab[i].param.sgw_addr.buffer,0,20); + ue_context_pP->ue_context.e_rab[i].param.sgw_addr.length = 0; + ue_context_pP->ue_context.e_rab[i].param.gtp_teid=0; + + ue_context_pP->ue_context.nb_of_e_rabs++; + e_rab_done++; + LOG_I(RRC,"setting up the dedicated DRBs %d (index %d) status %d \n", + ue_context_pP->ue_context.e_rab[i].param.e_rab_id, i, ue_context_pP->ue_context.e_rab[i].status); + } + } + ue_context_pP->ue_context.setup_e_rabs+=e_rab_done; + + rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(ctxt_pP, ue_context_pP, 0); +} + + //----------------------------------------------------------------------------- void* rrc_enb_task( @@ -4474,13 +6444,14 @@ rrc_enb_task( protocol_ctxt_t ctxt; itti_mark_task_ready(TASK_RRC_ENB); - + LOG_I(RRC,"Entering main loop of RRC message task\n"); while (1) { // Wait for a message itti_receive_msg(TASK_RRC_ENB, &msg_p); msg_name_p = ITTI_MSG_NAME(msg_p); instance = ITTI_MSG_INSTANCE(msg_p); + LOG_I(RRC,"Received message %s\n",msg_name_p); switch (ITTI_MSG_ID(msg_p)) { case TERMINATE_MESSAGE: @@ -4504,15 +6475,21 @@ rrc_enb_task( msg_name_p); CC_id = RRC_MAC_CCCH_DATA_IND(msg_p).CC_id; - srb_info_p = &eNB_rrc_inst[instance].carrier[CC_id].Srb0; + srb_info_p = &RC.rrc[instance]->carrier[CC_id].Srb0; + LOG_I(RRC,"Decoding CCCH : inst %d, CC_id %d, ctxt %p, sib_info_p->Rx_buffer.payload_size %d\n", + instance,CC_id,&ctxt, RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size); + AssertFatal(RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size < RRC_BUFFER_SIZE_MAX, + "CCCH message has size %d > %d\n", + RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size,RRC_BUFFER_SIZE_MAX); memcpy(srb_info_p->Rx_buffer.Payload, RRC_MAC_CCCH_DATA_IND(msg_p).sdu, RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size); srb_info_p->Rx_buffer.payload_size = RRC_MAC_CCCH_DATA_IND(msg_p).sdu_size; + rrc_eNB_decode_ccch(&ctxt, srb_info_p, CC_id); break; - + /* Messages from PDCP */ case RRC_DCCH_DATA_IND: PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, @@ -4551,9 +6528,23 @@ rrc_enb_task( break; case S1AP_PAGING_IND: - LOG_E(RRC, "[eNB %d] Received not yet implemented message %s\n", instance, msg_name_p); + LOG_D(RRC, "[eNB %d] Received Paging message from S1AP: %s\n", instance, msg_name_p); + rrc_eNB_process_PAGING_IND(msg_p, msg_name_p, instance); + break; + + case S1AP_E_RAB_SETUP_REQ: + rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(msg_p, msg_name_p, instance); + LOG_D(RRC, "[eNB %d] Received the message %s\n", instance, msg_name_p); break; + case S1AP_E_RAB_MODIFY_REQ: + rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(msg_p, msg_name_p, instance); + break; + + case S1AP_E_RAB_RELEASE_COMMAND: + rrc_eNB_process_S1AP_E_RAB_RELEASE_COMMAND(msg_p, msg_name_p, instance); + break; + case S1AP_UE_CONTEXT_RELEASE_REQ: rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_REQ(msg_p, msg_name_p, instance); break; @@ -4566,40 +6557,21 @@ rrc_enb_task( /* Nothing to do. Apparently everything is done in S1AP processing */ //LOG_I(RRC, "[eNB %d] Received message %s, not processed because procedure not synched\n", //instance, msg_name_p); + if (rrc_eNB_get_ue_context(RC.rrc[instance], GTPV1U_ENB_DELETE_TUNNEL_RESP(msg_p).rnti) + && rrc_eNB_get_ue_context(RC.rrc[instance], GTPV1U_ENB_DELETE_TUNNEL_RESP(msg_p).rnti)->ue_context.ue_release_timer_rrc > 0) { + rrc_eNB_get_ue_context(RC.rrc[instance], GTPV1U_ENB_DELETE_TUNNEL_RESP(msg_p).rnti)->ue_context.ue_release_timer_rrc = + rrc_eNB_get_ue_context(RC.rrc[instance], GTPV1U_ENB_DELETE_TUNNEL_RESP(msg_p).rnti)->ue_context.ue_release_timer_thres_rrc; + } break; # endif /* Messages from eNB app */ case RRC_CONFIGURATION_REQ: - LOG_I(RRC, "[eNB %d] Received %s\n", instance, msg_name_p); + LOG_I(RRC, "[eNB %d] Received %s : %p\n", instance, msg_name_p,&RRC_CONFIGURATION_REQ(msg_p)); openair_rrc_eNB_configuration(ENB_INSTANCE_TO_MODULE_ID(instance), &RRC_CONFIGURATION_REQ(msg_p)); break; -# if ENABLE_RAL - - case RRC_RAL_CONFIGURE_THRESHOLD_REQ: - rrc_enb_ral_handle_configure_threshold_request(instance, msg_p); - break; - - //SPECTRA: Add the RRC connection reconfiguration with Second cell configuration - case RRC_RAL_CONNECTION_RECONFIGURATION_REQ: - // ue_mod_id = 0; /* TODO force ue_mod_id to first UE, NAS UE not virtualized yet */ -//#warning "TODO GET RIGHT RNTI" - PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, - instance, - ENB_FLAG_YES, - NOT_A_RNTI, // TO DO GET RIGHT RNTI - msg_p->ittiMsgHeader.lte_time.frame, - msg_p->ittiMsgHeader.lte_time.slot); - LOG_I(RRC, "[eNB %d] Send RRC_RAL_CONNECTION_RECONFIGURATION_REQ to UE %s\n", instance, msg_name_p); - //Method RRC connection reconfiguration command with Second cell configuration - //rrc_eNB_generate_RRCConnectionReconfiguration_SCell(instance, 0/* TODO put frameP number ! */, /*ue_mod_id force ue_mod_id to first UE*/0, 36126); - //rrc_eNB_generate_defaultRRCConnectionReconfiguration(instance, 0/* TODO put frameP number ! */, /*ue_mod_id force ue_mod_id to first UE*/0, - // eNB_rrc_inst[instance].HO_flag); - break; -# endif - default: LOG_E(RRC, "[eNB %d] Received unexpected message %s\n", instance, msg_name_p); break; @@ -4612,6 +6584,158 @@ rrc_enb_task( } #endif -#ifndef USER_MODE -EXPORT_SYMBOL(Rlc_info_am_config); +/*------------------------------------------------------------------------------*/ +void +openair_rrc_top_init_eNB(int eMBMS_active,uint8_t HO_active) +//----------------------------------------------------------------------------- +{ + + module_id_t module_id; + int CC_id; + + /* for no gcc warnings */ + (void)CC_id; + + LOG_D(RRC, "[OPENAIR][INIT] Init function start: NB_eNB_INST=%d\n", RC.nb_inst); + + if (RC.nb_inst > 0) { + LOG_I(RRC,"[eNB] handover active state is %d \n", HO_active); + + for (module_id=0; module_idHO_flag = (uint8_t)HO_active; + } + +#if defined(Rel10) || defined(Rel14) + LOG_I(RRC,"[eNB] eMBMS active state is %d \n", eMBMS_active); + + for (module_id=0; module_idcarrier[CC_id].MBMS_flag = (uint8_t)eMBMS_active; + } + } + #endif +#ifdef CBA + + for (module_id=0; module_idcarrier[CC_id].num_active_cba_groups = cba_group_active; + } + } + +#endif + } + + +} + +//----------------------------------------------------------------------------- +void +rrc_top_cleanup_eNB( + void +) +//----------------------------------------------------------------------------- +{ + + for (int i=0;imodule_id]->rrc_ue_head)) { + if ((ctxt_pP->frame == 0) && (ctxt_pP->subframe==0)) { + if (ue_context_p->ue_context.Initialue_identity_s_TMSI.presence == TRUE) { + LOG_I(RRC,"UE rnti %x:S-TMSI %x failure timer %d/20000\n", + ue_context_p->ue_context.rnti, + ue_context_p->ue_context.Initialue_identity_s_TMSI.m_tmsi, + ue_context_p->ue_context.ul_failure_timer); + } + else { + LOG_I(RRC,"UE rnti %x failure timer %d/20000\n", + ue_context_p->ue_context.rnti, + ue_context_p->ue_context.ul_failure_timer); + } + } + if (ue_context_p->ue_context.ul_failure_timer>0) { + ue_context_p->ue_context.ul_failure_timer++; + if (ue_context_p->ue_context.ul_failure_timer >= 20000) { + // remove UE after 20 seconds after MAC has indicated UL failure + LOG_I(RRC,"Removing UE %x instance\n",ue_context_p->ue_context.rnti); + ue_to_be_removed = ue_context_p; + break; + } + } + if (ue_context_p->ue_context.ue_release_timer>0) { + ue_context_p->ue_context.ue_release_timer++; + if (ue_context_p->ue_context.ue_release_timer >= + ue_context_p->ue_context.ue_release_timer_thres) { + LOG_I(RRC,"Removing UE %x instance\n",ue_context_p->ue_context.rnti); + ue_to_be_removed = ue_context_p; + break; + } + } + } + if (ue_to_be_removed) + rrc_eNB_free_UE(ctxt_pP->module_id,ue_to_be_removed); + +#ifdef RRC_LOCALIZATION + + /* for the localization, only primary CC_id might be relevant*/ + gettimeofday(&ts, NULL); + current_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000; + ref_timestamp_ms = RC.rrc[ctxt_pP->module_id]->reference_timestamp_ms; + RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(RC.rrc[ctxt_pP->module_id]->rrc_ue_head)) { + ctxt = *ctxt_pP; + ctxt.rnti = ue_context_p->ue_context.rnti; + estimated_distance = rrc_get_estimated_ue_distance( + &ctxt, + CC_id, + RC.rrc[ctxt_pP->module_id]->loc_type); + + if ((current_timestamp_ms - ref_timestamp_ms > RC.rrc[ctxt_pP->module_id]->aggregation_period_ms) && + estimated_distance != -1) { + LOG_D(LOCALIZE, " RRC [UE/id %d -> eNB/id %d] timestamp %d frame %d estimated r = %f\n", + ctxt.rnti, + ctxt_pP->module_id, + current_timestamp_ms, + ctxt_pP->frame, + estimated_distance); + LOG_D(LOCALIZE, " RRC status %d\n", ue_context_p->ue_context.Status); + push_front(&RC.rrc[ctxt_pP->module_id]->loc_list, + estimated_distance); + RC.rrc[ctxt_pP->module_id]->reference_timestamp_ms = current_timestamp_ms; + } + } + +#endif + (void)ts; /* remove gcc warning "unused variable" */ + (void)ref_timestamp_ms; /* remove gcc warning "unused variable" */ + (void)current_timestamp_ms; /* remove gcc warning "unused variable" */ + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_OUT); + return (RRC_OK); +} + diff --git a/openair2/RRC/LITE/rrc_eNB_GTPV1U.c b/openair2/RRC/LITE/rrc_eNB_GTPV1U.c old mode 100755 new mode 100644 index 29ff0d9dc2..e5f2c5aaae --- a/openair2/RRC/LITE/rrc_eNB_GTPV1U.c +++ b/openair2/RRC/LITE/rrc_eNB_GTPV1U.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rrc_eNB_GTPV1U.c * \brief rrc GTPV1U procedures for eNB * \author Lionel GAUTHIER @@ -47,10 +40,15 @@ # include "intertask_interface.h" # endif +# include "common/ran_context.h" + +extern RAN_CONTEXT_t RC; + int rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( const protocol_ctxt_t* const ctxt_pP, - const gtpv1u_enb_create_tunnel_resp_t * const create_tunnel_resp_pP + const gtpv1u_enb_create_tunnel_resp_t * const create_tunnel_resp_pP, + uint8_t *inde_list ) { rnti_t rnti; @@ -64,18 +62,26 @@ rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( rnti = create_tunnel_resp_pP->rnti; ue_context_p = rrc_eNB_get_ue_context( - &eNB_rrc_inst[ctxt_pP->module_id], + RC.rrc[ctxt_pP->module_id], ctxt_pP->rnti); for (i = 0; i < create_tunnel_resp_pP->num_tunnels; i++) { - LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP tunnel %u bearer index %u id %u\n", + +// ue_context_p->ue_context.enb_gtp_teid[i+ue_context_p->ue_context.setup_e_rabs] = create_tunnel_resp_pP->enb_S1u_teid[i]; +// ue_context_p->ue_context.enb_gtp_addrs[i+ue_context_p->ue_context.setup_e_rabs] = create_tunnel_resp_pP->enb_addr; +// ue_context_p->ue_context.enb_gtp_ebi[i+ue_context_p->ue_context.setup_e_rabs] = create_tunnel_resp_pP->eps_bearer_id[i]; + ue_context_p->ue_context.enb_gtp_teid[inde_list[i]] = create_tunnel_resp_pP->enb_S1u_teid[i]; + ue_context_p->ue_context.enb_gtp_addrs[inde_list[i]] = create_tunnel_resp_pP->enb_addr; + ue_context_p->ue_context.enb_gtp_ebi[inde_list[i]] = create_tunnel_resp_pP->eps_bearer_id[i]; + + LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP tunnel (%u, %u) bearer UE context index %u, msg index %u, id %u, gtp addr len %d \n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), create_tunnel_resp_pP->enb_S1u_teid[i], - i, - create_tunnel_resp_pP->eps_bearer_id[i]); - ue_context_p->ue_context.enb_gtp_teid[i] = create_tunnel_resp_pP->enb_S1u_teid[i]; - ue_context_p->ue_context.enb_gtp_addrs[i] = create_tunnel_resp_pP->enb_addr; - ue_context_p->ue_context.enb_gtp_ebi[i] = create_tunnel_resp_pP->eps_bearer_id[i]; + ue_context_p->ue_context.enb_gtp_teid[inde_list[i]], + inde_list[i], + i, + create_tunnel_resp_pP->eps_bearer_id[i], + create_tunnel_resp_pP->enb_addr.length); } MSC_LOG_RX_MESSAGE( MSC_RRC_ENB, diff --git a/openair2/RRC/LITE/rrc_eNB_GTPV1U.h b/openair2/RRC/LITE/rrc_eNB_GTPV1U.h old mode 100755 new mode 100644 index 388f71c136..aedbdeac5e --- a/openair2/RRC/LITE/rrc_eNB_GTPV1U.h +++ b/openair2/RRC/LITE/rrc_eNB_GTPV1U.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rrc_eNB_GTPV1U.h * \brief rrc GTPV1U procedures for eNB * \author Lionel GAUTHIER @@ -50,7 +43,8 @@ int rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( const protocol_ctxt_t* const ctxt_pP, - const gtpv1u_enb_create_tunnel_resp_t * const create_tunnel_resp_pP + const gtpv1u_enb_create_tunnel_resp_t * const create_tunnel_resp_pP, + uint8_t *inde_list ); # endif diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index cdb2ddc0ca..d2c0d0acbe 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -1,35 +1,28 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rrc_eNB_S1AP.c * \brief rrc S1AP procedures for eNB - * \author Laurent Winckel and Sebastien ROUX and Navid Nikaein and Lionel GAUTHIER - * \date 2013-2014 + * \author Navid Nikaein, Laurent Winckel, Sebastien ROUX, and Lionel GAUTHIER + * \date 2013-2016 * \version 1.0 * \company Eurecom * \email: navid.nikaein@eurecom.fr @@ -44,6 +37,7 @@ # include "rrc_eNB_UE_context.h" # include "rrc_eNB_S1AP.h" # include "enb_config.h" +# include "common/ran_context.h" # if defined(ENABLE_ITTI) # include "asn1_conversions.h" @@ -65,6 +59,8 @@ #include "gtpv1u_eNB_task.h" #include "RRC/LITE/rrc_eNB_GTPV1U.h" +extern RAN_CONTEXT_t RC; + /* Value to indicate an invalid UE initial id */ static const uint16_t UE_INITIAL_ID_INVALID = 0; @@ -76,7 +72,7 @@ static const uint16_t S1AP_ENCRYPTION_EEA2_MASK = 0x4000; static const uint16_t S1AP_INTEGRITY_EIA1_MASK = 0x8000; static const uint16_t S1AP_INTEGRITY_EIA2_MASK = 0x4000; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) # define INTEGRITY_ALGORITHM_NONE SecurityAlgorithmConfig__integrityProtAlgorithm_eia0_v920 #else #ifdef EXMIMO_IOT @@ -122,8 +118,8 @@ rrc_eNB_S1AP_get_ue_ids( (hash_key_t)eNB_ue_s1ap_id, result2); if (h_rc != HASH_TABLE_OK) { - LOG_E(S1AP, "[eNB %u] Error while hashtable_insert in s1ap_id2_s1ap_ids eNB_ue_s1ap_id %u\n", - rrc_instance_pP - eNB_rrc_inst, eNB_ue_s1ap_id); + LOG_E(S1AP, "[eNB %ld] Error while hashtable_insert in s1ap_id2_s1ap_ids eNB_ue_s1ap_id %"PRIu32"\n", + rrc_instance_pP - RC.rrc[0], eNB_ue_s1ap_id); } } } @@ -216,14 +212,14 @@ rrc_eNB_get_ue_context_from_s1ap_ids( rrc_ue_s1ap_ids_t* temp = NULL; temp = rrc_eNB_S1AP_get_ue_ids( - &eNB_rrc_inst[ENB_INSTANCE_TO_MODULE_ID(instanceP)], + RC.rrc[ENB_INSTANCE_TO_MODULE_ID(instanceP)], ue_initial_idP, eNB_ue_s1ap_idP); if (temp) { return rrc_eNB_get_ue_context( - &eNB_rrc_inst[ENB_INSTANCE_TO_MODULE_ID(instanceP)], + RC.rrc[ENB_INSTANCE_TO_MODULE_ID(instanceP)], temp->ue_rnti); } @@ -235,21 +231,21 @@ rrc_eNB_get_ue_context_from_s1ap_ids( *\param algorithms The bit mask of available algorithms received from S1AP. *\return the selected algorithm. */ -static e_SecurityAlgorithmConfig__cipheringAlgorithm rrc_eNB_select_ciphering(uint16_t algorithms) +static CipheringAlgorithm_r12_t rrc_eNB_select_ciphering(uint16_t algorithms) { //#warning "Forced return SecurityAlgorithmConfig__cipheringAlgorithm_eea0, to be deleted in future" - return SecurityAlgorithmConfig__cipheringAlgorithm_eea0; + return CipheringAlgorithm_r12_eea0; if (algorithms & S1AP_ENCRYPTION_EEA2_MASK) { - return SecurityAlgorithmConfig__cipheringAlgorithm_eea2; + return CipheringAlgorithm_r12_eea2; } if (algorithms & S1AP_ENCRYPTION_EEA1_MASK) { - return SecurityAlgorithmConfig__cipheringAlgorithm_eea1; + return CipheringAlgorithm_r12_eea1; } - return SecurityAlgorithmConfig__cipheringAlgorithm_eea0; + return CipheringAlgorithm_r12_eea0; } /*! \fn e_SecurityAlgorithmConfig__integrityProtAlgorithm rrc_eNB_select_integrity(uint16_t algorithms) @@ -286,7 +282,7 @@ rrc_eNB_process_security( ) { boolean_t changed = FALSE; - e_SecurityAlgorithmConfig__cipheringAlgorithm cipheringAlgorithm; + CipheringAlgorithm_r12_t cipheringAlgorithm; e_SecurityAlgorithmConfig__integrityProtAlgorithm integrityProtAlgorithm; /* Save security parameters */ @@ -294,10 +290,10 @@ rrc_eNB_process_security( // translation LOG_D(RRC, - "[eNB %d] NAS security_capabilities.encryption_algorithms %u AS ciphering_algorithm %u NAS security_capabilities.integrity_algorithms %u AS integrity_algorithm %u\n", + "[eNB %d] NAS security_capabilities.encryption_algorithms %u AS ciphering_algorithm %lu NAS security_capabilities.integrity_algorithms %u AS integrity_algorithm %u\n", ctxt_pP->module_id, ue_context_pP->ue_context.security_capabilities.encryption_algorithms, - ue_context_pP->ue_context.ciphering_algorithm, + (unsigned long)ue_context_pP->ue_context.ciphering_algorithm, ue_context_pP->ue_context.security_capabilities.integrity_algorithms, ue_context_pP->ue_context.integrity_algorithm); /* Select relevant algorithms */ @@ -315,11 +311,11 @@ rrc_eNB_process_security( changed = TRUE; } - LOG_I (RRC, "[eNB %d][UE %x] Selected security algorithms (%x): %x, %x, %s\n", + LOG_I (RRC, "[eNB %d][UE %x] Selected security algorithms (%p): %lx, %x, %s\n", ctxt_pP->module_id, ue_context_pP->ue_context.rnti, security_capabilities_pP, - cipheringAlgorithm, + (unsigned long)cipheringAlgorithm, integrityProtAlgorithm, changed ? "changed" : "same"); @@ -346,6 +342,8 @@ static void process_eNB_security_key ( /* Saves the security key */ memcpy (ue_context_pP->ue_context.kenb, security_key_pP, SECURITY_KEY_LENGTH); + memset (ue_context_pP->ue_context.nh, 0, SECURITY_KEY_LENGTH); + ue_context_pP->ue_context.nh_ncc = -1; for (i = 0; i < 32; i++) { sprintf(&ascii_buffer[2 * i], "%02X", ue_context_pP->ue_context.kenb[i]); @@ -359,7 +357,7 @@ static void process_eNB_security_key ( //------------------------------------------------------------------------------ -static void +void rrc_pdcp_config_security( const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, @@ -394,8 +392,10 @@ rrc_pdcp_config_security( ue_context_pP->ue_context.kenb, &kRRCint); +#if !defined(USRP_REC_PLAY) #define DEBUG_SECURITY 1 - +#endif + #if defined (DEBUG_SECURITY) #undef msg #define msg printf @@ -481,8 +481,10 @@ rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP( S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].gtp_teid = ue_context_pP->ue_context.enb_gtp_teid[e_rab]; S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr = ue_context_pP->ue_context.enb_gtp_addrs[e_rab]; S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.length = 4; + ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_ESTABLISHED; } else { e_rabs_failed++; + ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_FAILED; S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs_failed[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; // TODO add cause when it will be integrated } @@ -632,7 +634,10 @@ rrc_eNB_send_S1AP_NAS_FIRST_REQ( RRCConnectionSetupComplete_r8_IEs_t* rrcConnectionSetupComplete ) //------------------------------------------------------------------------------ + + { + eNB_RRC_INST *rrc=RC.rrc[ctxt_pP->module_id]; #if defined(ENABLE_ITTI) { MessageDef* message_p = NULL; @@ -650,7 +655,7 @@ rrc_eNB_send_S1AP_NAS_FIRST_REQ( rrc_ue_s1ap_ids_p->eNB_ue_s1ap_id = UE_INITIAL_ID_INVALID; rrc_ue_s1ap_ids_p->ue_rnti = ctxt_pP->rnti; - h_rc = hashtable_insert(eNB_rrc_inst[ctxt_pP->module_id].initial_id2_s1ap_ids, + h_rc = hashtable_insert(RC.rrc[ctxt_pP->module_id]->initial_id2_s1ap_ids, (hash_key_t)ue_context_pP->ue_context.ue_initial_id, rrc_ue_s1ap_ids_p); if (h_rc != HASH_TABLE_OK) { @@ -713,13 +718,13 @@ rrc_eNB_send_S1AP_NAS_FIRST_REQ( ue_context_pP->ue_context.rnti); } } else { - const Enb_properties_array_t *enb_properties_p = NULL; - enb_properties_p = enb_config_get(); + // const Enb_properties_array_t *enb_properties_p = NULL; + // enb_properties_p = enb_config_get(); // actually the eNB configuration contains only one PLMN (can be up to 6) - S1AP_NAS_FIRST_REQ (message_p).ue_identity.gummei.mcc = enb_properties_p->properties[ctxt_pP->module_id]->mcc; - S1AP_NAS_FIRST_REQ (message_p).ue_identity.gummei.mnc = enb_properties_p->properties[ctxt_pP->module_id]->mnc; - S1AP_NAS_FIRST_REQ (message_p).ue_identity.gummei.mnc_len = enb_properties_p->properties[ctxt_pP->module_id]->mnc_digit_length; + S1AP_NAS_FIRST_REQ (message_p).ue_identity.gummei.mcc = rrc->mcc; + S1AP_NAS_FIRST_REQ (message_p).ue_identity.gummei.mnc = rrc->mnc; + S1AP_NAS_FIRST_REQ (message_p).ue_identity.gummei.mnc_len = rrc->mnc_digit_length; } S1AP_NAS_FIRST_REQ (message_p).ue_identity.gummei.mme_code = BIT_STRING_to_uint8 (&r_mme->mmec); @@ -772,12 +777,15 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS( uint32_t eNB_ue_s1ap_id; uint32_t length; uint8_t *buffer; - + uint8_t srb_id; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; protocol_ctxt_t ctxt; ue_initial_id = S1AP_DOWNLINK_NAS (msg_p).ue_initial_id; eNB_ue_s1ap_id = S1AP_DOWNLINK_NAS (msg_p).eNB_ue_s1ap_id; ue_context_p = rrc_eNB_get_ue_context_from_s1ap_ids(instance, ue_initial_id, eNB_ue_s1ap_id); + + LOG_I(RRC, "[eNB %d] Received %s: ue_initial_id %d, eNB_ue_s1ap_id %d\n", instance, msg_name, @@ -824,6 +832,9 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS( } else { PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0); + srb_id = ue_context_p->ue_context.Srb2.Srb_info.Srb_id; + + /* Is it the first income from S1AP ? */ if (ue_context_p->ue_context.eNB_ue_s1ap_id == 0) { ue_context_p->ue_context.eNB_ue_s1ap_id = S1AP_DOWNLINK_NAS (msg_p).eNB_ue_s1ap_id; @@ -858,10 +869,13 @@ rrc_eNB_process_S1AP_DOWNLINK_NAS( LOG_F(RRC,"\n"); #endif + /* + * switch UL or DL NAS message without RRC piggybacked to SRB2 if active. + */ /* Transfer data to PDCP */ rrc_data_req ( &ctxt, - DCCH, + srb_id, *rrc_eNB_mui++, SDU_CONFIRM_NO, length, @@ -880,6 +894,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char //MessageDef *message_gtpv1u_p = NULL; gtpv1u_enb_create_tunnel_req_t create_tunnel_req; gtpv1u_enb_create_tunnel_resp_t create_tunnel_resp; + uint8_t inde_list[NB_RB_MAX - 3]={0}; struct rrc_eNB_ue_context_s* ue_context_p = NULL; protocol_ctxt_t ctxt; @@ -913,7 +928,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char memset(&create_tunnel_req, 0 , sizeof(create_tunnel_req)); ue_context_p->ue_context.nb_of_e_rabs = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_e_rabs; - + for (i = 0; i < ue_context_p->ue_context.nb_of_e_rabs; i++) { ue_context_p->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; ue_context_p->ue_context.e_rab[i].param = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).e_rab_param[i]; @@ -925,10 +940,12 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char memcpy(&create_tunnel_req.sgw_addr[i], &S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).e_rab_param[i].sgw_addr, sizeof(transport_layer_addr_t)); + inde_list[create_tunnel_req.num_tunnels]= i; + create_tunnel_req.num_tunnels++; } - + create_tunnel_req.rnti = ue_context_p->ue_context.rnti; // warning put zero above - create_tunnel_req.num_tunnels = i; +// create_tunnel_req.num_tunnels = i; gtpv1u_create_s1u_tunnel( instance, @@ -937,7 +954,9 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( &ctxt, - &create_tunnel_resp); + &create_tunnel_resp, + &inde_list[0]); + ue_context_p->ue_context.setup_e_rabs=ue_context_p->ue_context.nb_of_e_rabs; } /* TODO parameters yet to process ... */ @@ -1003,7 +1022,7 @@ int rrc_eNB_process_S1AP_UE_CTXT_MODIFICATION_REQ(MessageDef *msg_p, const char /* Can not associate this message to an UE index, send a failure to S1AP and discard it! */ MessageDef *msg_fail_p; - LOG_W(RRC, "[eNB %d] In S1AP_UE_CTXT_MODIFICATION_REQ: unknown UE from eNB_ue_s1ap_id (%d) for eNB %d\n", instance, eNB_ue_s1ap_id); + LOG_W(RRC, "[eNB %d] In S1AP_UE_CTXT_MODIFICATION_REQ: unknown UE from eNB_ue_s1ap_id (%d)\n", instance, eNB_ue_s1ap_id); msg_fail_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_UE_CTXT_MODIFICATION_FAIL); S1AP_UE_CTXT_MODIFICATION_FAIL (msg_fail_p).eNB_ue_s1ap_id = eNB_ue_s1ap_id; @@ -1167,17 +1186,18 @@ int rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_COMMAND (MessageDef *msg_p, const ch itti_send_msg_to_task(TASK_S1AP, instance, msg_complete_p); rrc_ue_s1ap_ids = rrc_eNB_S1AP_get_ue_ids( - &eNB_rrc_inst[instance], + RC.rrc[instance], UE_INITIAL_ID_INVALID, eNB_ue_s1ap_id); if (NULL != rrc_ue_s1ap_ids) { rrc_eNB_S1AP_remove_ue_ids( - &eNB_rrc_inst[instance], + RC.rrc[instance], rrc_ue_s1ap_ids); } return (-1); } else { + ue_context_p->ue_context.ue_release_timer_s1 = 0; PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0); rrc_eNB_generate_RRCConnectionRelease(&ctxt, ue_context_p); /* @@ -1231,13 +1251,13 @@ int rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_COMMAND (MessageDef *msg_p, const ch itti_send_msg_to_task(TASK_S1AP, instance, msg_complete_p); rrc_ue_s1ap_ids = rrc_eNB_S1AP_get_ue_ids( - &eNB_rrc_inst[instance], + RC.rrc[instance], UE_INITIAL_ID_INVALID, eNB_ue_s1ap_id); if (NULL != rrc_ue_s1ap_ids) { rrc_eNB_S1AP_remove_ue_ids( - &eNB_rrc_inst[instance], + RC.rrc[instance], rrc_ue_s1ap_ids); } } @@ -1246,6 +1266,713 @@ int rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_COMMAND (MessageDef *msg_p, const ch } } +int rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance) +{ + uint16_t ue_initial_id; + uint32_t eNB_ue_s1ap_id; + gtpv1u_enb_create_tunnel_req_t create_tunnel_req; + gtpv1u_enb_create_tunnel_resp_t create_tunnel_resp; + uint8_t inde_list[NB_RB_MAX - 3]={0}; + + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + protocol_ctxt_t ctxt; + uint8_t e_rab_done; + + ue_initial_id = S1AP_E_RAB_SETUP_REQ (msg_p).ue_initial_id; + eNB_ue_s1ap_id = S1AP_E_RAB_SETUP_REQ (msg_p).eNB_ue_s1ap_id; + ue_context_p = rrc_eNB_get_ue_context_from_s1ap_ids(instance, ue_initial_id, eNB_ue_s1ap_id); + LOG_I(RRC, "[eNB %d] Received %s: ue_initial_id %d, eNB_ue_s1ap_id %d, nb_of_e_rabs %d\n", + instance, msg_name, ue_initial_id, eNB_ue_s1ap_id, S1AP_E_RAB_SETUP_REQ (msg_p).nb_e_rabs_tosetup); + + if (ue_context_p == NULL) { + /* Can not associate this message to an UE index, send a failure to S1AP and discard it! */ + MessageDef *msg_fail_p = NULL; + + LOG_W(RRC, "[eNB %d] In S1AP_E_RAB_SETUP_REQ: unknown UE from S1AP ids (%d, %d)\n", instance, ue_initial_id, eNB_ue_s1ap_id); + + msg_fail_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_SETUP_REQUEST_FAIL); + S1AP_E_RAB_SETUP_REQ (msg_fail_p).eNB_ue_s1ap_id = eNB_ue_s1ap_id; + + // TODO add failure cause when defined! + + itti_send_msg_to_task (TASK_S1AP, instance, msg_fail_p); + return (-1); + } else { + + PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0); + ue_context_p->ue_context.eNB_ue_s1ap_id = S1AP_E_RAB_SETUP_REQ (msg_p).eNB_ue_s1ap_id; + + /* Save e RAB information for later */ + { + int i; + + memset(&create_tunnel_req, 0 , sizeof(create_tunnel_req)); + uint8_t nb_e_rabs_tosetup = S1AP_E_RAB_SETUP_REQ (msg_p).nb_e_rabs_tosetup; + e_rab_done = 0; + + // keep the previous bearer + // the index for the rec + for (i = 0; + // i < nb_e_rabs_tosetup; + i < NB_RB_MAX - 3; // loop all e-rabs in e_rab[] + i++) { + //if (ue_context_p->ue_context.e_rab[i+ue_context_p->ue_context.setup_e_rabs].status == E_RAB_STATUS_DONE) + // LOG_W(RRC,"E-RAB already configured, reconfiguring\n"); + // check e-rab status, if e rab status is greater than E_RAB_STATUS_DONE, don't not config this one + if(ue_context_p->ue_context.e_rab[i].status >= E_RAB_STATUS_DONE) + continue; + //ue_context_p->ue_context.e_rab[i+ue_context_p->ue_context.setup_e_rabs].status = E_RAB_STATUS_NEW; + //ue_context_p->ue_context.e_rab[i+ue_context_p->ue_context.setup_e_rabs].param = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[i]; + ue_context_p->ue_context.e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_p->ue_context.e_rab[i].param = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[e_rab_done]; + + create_tunnel_req.eps_bearer_id[e_rab_done] = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[e_rab_done].e_rab_id; + create_tunnel_req.sgw_S1u_teid[e_rab_done] = S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[e_rab_done].gtp_teid; + + memcpy(&create_tunnel_req.sgw_addr[e_rab_done], + & S1AP_E_RAB_SETUP_REQ (msg_p).e_rab_setup_params[e_rab_done].sgw_addr, + sizeof(transport_layer_addr_t)); + + LOG_I(RRC,"E_RAB setup REQ: local index %d teid %u, eps id %d \n", + i, + create_tunnel_req.sgw_S1u_teid[e_rab_done], + create_tunnel_req.eps_bearer_id[i] ); + inde_list[e_rab_done] = i; + e_rab_done++; + if(e_rab_done >= nb_e_rabs_tosetup){ + break; + } + } + ue_context_p->ue_context.nb_of_e_rabs=nb_e_rabs_tosetup; + + + create_tunnel_req.rnti = ue_context_p->ue_context.rnti; // warning put zero above + create_tunnel_req.num_tunnels = e_rab_done; + + // NN: not sure if we should create a new tunnel: need to check teid, etc. + gtpv1u_create_s1u_tunnel( + instance, + &create_tunnel_req, + &create_tunnel_resp); + + rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP( + &ctxt, + &create_tunnel_resp, + &inde_list[0]); + + ue_context_p->ue_context.setup_e_rabs+=nb_e_rabs_tosetup; + + } + + /* TODO parameters yet to process ... */ + { + // S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).ue_ambr; + } + + rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(&ctxt, ue_context_p, 0); + + return (0); + } +} + +/*NN: careful about the typcast of xid (long -> uint8_t*/ +int rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + uint8_t xid ){ + + MessageDef *msg_p = NULL; + int e_rab; + int e_rabs_done = 0; + int e_rabs_failed = 0; + + msg_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_SETUP_RESP); + S1AP_E_RAB_SETUP_RESP (msg_p).eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id; + + for (e_rab = 0; e_rab < ue_context_pP->ue_context.setup_e_rabs ; e_rab++) { + + /* only respond to the corresponding transaction */ + //if (((xid+1)%4) == ue_context_pP->ue_context.e_rab[e_rab].xid) { + if (xid == ue_context_pP->ue_context.e_rab[e_rab].xid) { + + if (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_DONE) { + + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; + // TODO add other information from S1-U when it will be integrated + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].gtp_teid = ue_context_pP->ue_context.enb_gtp_teid[e_rab]; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr = ue_context_pP->ue_context.enb_gtp_addrs[e_rab]; + //S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.length += 4; + ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_ESTABLISHED; + + LOG_I (RRC,"enb_gtp_addr (msg index %d, e_rab index %d, status %d, xid %d): nb_of_e_rabs %d, e_rab_id %d, teid: %u, addr: %d.%d.%d.%d \n ", + e_rabs_done, e_rab, ue_context_pP->ue_context.e_rab[e_rab].status, xid, + ue_context_pP->ue_context.nb_of_e_rabs, + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].e_rab_id, + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].gtp_teid, + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[0], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[1], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[2], + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs[e_rabs_done].eNB_addr.buffer[3]); + + e_rabs_done++; + } else if ((ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_NEW) || + (ue_context_pP->ue_context.e_rab[e_rab].status == E_RAB_STATUS_ESTABLISHED)){ + LOG_D (RRC,"E-RAB is NEW or already ESTABLISHED\n"); + }else { /* to be improved */ + ue_context_pP->ue_context.e_rab[e_rab].status = E_RAB_STATUS_FAILED; + S1AP_E_RAB_SETUP_RESP (msg_p).e_rabs_failed[e_rabs_failed].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; + e_rabs_failed++; + // TODO add cause when it will be integrated + } + + S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs = e_rabs_done; + S1AP_E_RAB_SETUP_RESP (msg_p).nb_of_e_rabs_failed = e_rabs_failed; + // NN: add conditions for e_rabs_failed + } else { + /*debug info for the xid */ + LOG_D(RRC,"xid does not corresponds (context e_rab index %d, status %d, xid %d/%d) \n ", + e_rab, ue_context_pP->ue_context.e_rab[e_rab].status, xid, ue_context_pP->ue_context.e_rab[e_rab].xid); + } + } + if ((e_rabs_done > 0) ){ + + LOG_I(RRC,"S1AP_E_RAB_SETUP_RESP: sending the message: nb_of_erabs %d, total e_rabs %d, index %d\n", + ue_context_pP->ue_context.nb_of_e_rabs, ue_context_pP->ue_context.setup_e_rabs, e_rab); + MSC_LOG_TX_MESSAGE( + MSC_RRC_ENB, + MSC_S1AP_ENB, + (const char *)&S1AP_E_RAB_SETUP_RESP (msg_p), + sizeof(s1ap_e_rab_setup_resp_t), + MSC_AS_TIME_FMT" E_RAB_SETUP_RESP UE %X eNB_ue_s1ap_id %u e_rabs:%u succ %u fail", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_id_rnti, + S1AP_E_RAB_SETUP_RESP (msg_p).eNB_ue_s1ap_id, + e_rabs_done, e_rabs_failed); + + + itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p); + } + for(int i = 0; i < NB_RB_MAX; i++) { + ue_context_pP->ue_context.e_rab[i].xid = -1; + } + + return 0; +} + +int rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance) +{ + int i; + uint16_t ue_initial_id; + uint32_t eNB_ue_s1ap_id; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + protocol_ctxt_t ctxt; + + ue_initial_id = S1AP_E_RAB_MODIFY_REQ (msg_p).ue_initial_id; + eNB_ue_s1ap_id = S1AP_E_RAB_MODIFY_REQ (msg_p).eNB_ue_s1ap_id; + ue_context_p = rrc_eNB_get_ue_context_from_s1ap_ids(instance, ue_initial_id, eNB_ue_s1ap_id); + LOG_D(RRC, "[eNB %d] Received %s: ue_initial_id %d, eNB_ue_s1ap_id %d, nb_of_e_rabs %d\n", + instance, msg_name, ue_initial_id, eNB_ue_s1ap_id, S1AP_E_RAB_MODIFY_REQ (msg_p).nb_e_rabs_tomodify); + + if (ue_context_p == NULL) { + /* Can not associate this message to an UE index, send a failure to S1AP and discard it! */ + LOG_W(RRC, "[eNB %d] In S1AP_E_RAB_MODIFY_REQ: unknown UE from S1AP ids (%d, %d)\n", instance, ue_initial_id, eNB_ue_s1ap_id); + int nb_of_e_rabs_failed = 0; + MessageDef *msg_fail_p = NULL; + + msg_fail_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_MODIFY_RESP); + + S1AP_E_RAB_MODIFY_RESP (msg_fail_p).eNB_ue_s1ap_id = S1AP_E_RAB_MODIFY_REQ (msg_p).eNB_ue_s1ap_id; + S1AP_E_RAB_MODIFY_RESP (msg_fail_p).nb_of_e_rabs = 0; + + for (nb_of_e_rabs_failed = 0; nb_of_e_rabs_failed < S1AP_E_RAB_MODIFY_REQ (msg_p).nb_e_rabs_tomodify; nb_of_e_rabs_failed++) { + S1AP_E_RAB_MODIFY_RESP (msg_fail_p).e_rabs_failed[nb_of_e_rabs_failed].e_rab_id = + S1AP_E_RAB_MODIFY_REQ (msg_p).e_rab_modify_params[nb_of_e_rabs_failed].e_rab_id; + S1AP_E_RAB_MODIFY_RESP (msg_fail_p).e_rabs_failed[nb_of_e_rabs_failed].cause = S1AP_CAUSE_RADIO_NETWORK; + S1AP_E_RAB_MODIFY_RESP (msg_fail_p).e_rabs_failed[nb_of_e_rabs_failed].cause_value = 31;//S1ap_CauseRadioNetwork_multiple_E_RAB_ID_instances; + } + S1AP_E_RAB_MODIFY_RESP (msg_fail_p).nb_of_e_rabs_failed = nb_of_e_rabs_failed; + + itti_send_msg_to_task(TASK_S1AP, instance, msg_fail_p); + return (-1); + + } else { + PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0); + ue_context_p->ue_context.eNB_ue_s1ap_id = eNB_ue_s1ap_id; + + /* Save e RAB information for later */ + { + int j; + boolean_t is_treated[S1AP_MAX_E_RAB] = {FALSE}; + uint8_t nb_of_failed_e_rabs = 0; + + // keep the previous bearer + // the index for the rec + for (i = 0; i < S1AP_E_RAB_MODIFY_REQ (msg_p).nb_e_rabs_tomodify; i++) { + if (is_treated[i] == TRUE) { + // already treated + continue; + } + for (j = i+1; j < S1AP_E_RAB_MODIFY_REQ (msg_p).nb_e_rabs_tomodify; j++) { + if (is_treated[j] == FALSE && + S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[j].e_rab_id == S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id) { + // handle multiple E-RAB ID + ue_context_p->ue_context.modify_e_rab[j].status = E_RAB_STATUS_NEW; + ue_context_p->ue_context.modify_e_rab[j].param.e_rab_id = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[j].e_rab_id; + ue_context_p->ue_context.modify_e_rab[j].cause = S1AP_CAUSE_RADIO_NETWORK; + ue_context_p->ue_context.modify_e_rab[j].cause_value = 31;//S1ap_CauseRadioNetwork_multiple_E_RAB_ID_instances; + nb_of_failed_e_rabs++; + is_treated[i] = TRUE; + is_treated[j] = TRUE; + } + } + if (is_treated[i] == TRUE) { + // handle multiple E-RAB ID + ue_context_p->ue_context.modify_e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_p->ue_context.modify_e_rab[i].param.e_rab_id = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id; + ue_context_p->ue_context.modify_e_rab[i].cause = S1AP_CAUSE_RADIO_NETWORK; + ue_context_p->ue_context.modify_e_rab[i].cause_value = 31;//S1ap_CauseRadioNetwork_multiple_E_RAB_ID_instances; + nb_of_failed_e_rabs++; + continue; + } + + if (S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].nas_pdu.length == 0) { + // nas_pdu.length == 0 + ue_context_p->ue_context.modify_e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_p->ue_context.modify_e_rab[i].param.e_rab_id = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id; + ue_context_p->ue_context.modify_e_rab[i].cause = S1AP_CAUSE_NAS; + ue_context_p->ue_context.modify_e_rab[i].cause_value = 3;//S1ap_CauseNas_unspecified; + nb_of_failed_e_rabs++; + is_treated[i] = TRUE; + continue; + } + + for (j = 0; j < NB_RB_MAX-3; j++) { + if (ue_context_p->ue_context.e_rab[j].param.e_rab_id == S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id) { + if(ue_context_p->ue_context.e_rab[j].status == E_RAB_STATUS_TORELEASE || ue_context_p->ue_context.e_rab[j].status == E_RAB_STATUS_DONE){ + break; + } + ue_context_p->ue_context.modify_e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_p->ue_context.modify_e_rab[i].cause = S1AP_CAUSE_NOTHING; + ue_context_p->ue_context.modify_e_rab[i].param.e_rab_id = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id; + ue_context_p->ue_context.modify_e_rab[i].param.qos = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].qos; + ue_context_p->ue_context.modify_e_rab[i].param.nas_pdu.length = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].nas_pdu.length; + ue_context_p->ue_context.modify_e_rab[i].param.nas_pdu.buffer = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].nas_pdu.buffer; + ue_context_p->ue_context.modify_e_rab[i].param.sgw_addr = ue_context_p->ue_context.e_rab[j].param.sgw_addr; + ue_context_p->ue_context.modify_e_rab[i].param.gtp_teid = ue_context_p->ue_context.e_rab[j].param.gtp_teid; + + is_treated[i] = TRUE; + break; + } + } + + if (is_treated[i] == FALSE) { + // handle Unknown E-RAB ID + ue_context_p->ue_context.modify_e_rab[i].status = E_RAB_STATUS_NEW; + ue_context_p->ue_context.modify_e_rab[i].param.e_rab_id = S1AP_E_RAB_MODIFY_REQ(msg_p).e_rab_modify_params[i].e_rab_id; + ue_context_p->ue_context.modify_e_rab[i].cause = S1AP_CAUSE_RADIO_NETWORK; + ue_context_p->ue_context.modify_e_rab[i].cause_value = 30;//S1ap_CauseRadioNetwork_unknown_E_RAB_ID; + nb_of_failed_e_rabs++; + is_treated[i] = TRUE; + } + } + + ue_context_p->ue_context.nb_of_modify_e_rabs = S1AP_E_RAB_MODIFY_REQ (msg_p).nb_e_rabs_tomodify; + ue_context_p->ue_context.nb_of_failed_e_rabs = nb_of_failed_e_rabs; + } + + /* TODO parameters yet to process ... */ + { + // S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).ue_ambr; + } + + if (ue_context_p->ue_context.nb_of_failed_e_rabs < ue_context_p->ue_context.nb_of_modify_e_rabs) { + if (0 == rrc_eNB_modify_dedicatedRRCConnectionReconfiguration(&ctxt, ue_context_p, 0)) { + return (0); + } + } + + { + int nb_of_e_rabs_failed = 0; + MessageDef *msg_fail_p = NULL; + + msg_fail_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_MODIFY_RESP); + + S1AP_E_RAB_MODIFY_RESP (msg_fail_p).eNB_ue_s1ap_id = S1AP_E_RAB_MODIFY_REQ (msg_p).eNB_ue_s1ap_id; +// S1AP_E_RAB_MODIFY_RESP (msg_fail_p).e_rabs[S1AP_MAX_E_RAB]; + S1AP_E_RAB_MODIFY_RESP (msg_fail_p).nb_of_e_rabs = 0; + + for(nb_of_e_rabs_failed = 0; nb_of_e_rabs_failed < ue_context_p->ue_context.nb_of_failed_e_rabs; nb_of_e_rabs_failed++) { + S1AP_E_RAB_MODIFY_RESP (msg_fail_p).e_rabs_failed[nb_of_e_rabs_failed].e_rab_id = + ue_context_p->ue_context.modify_e_rab[nb_of_e_rabs_failed].param.e_rab_id; + S1AP_E_RAB_MODIFY_RESP (msg_fail_p).e_rabs_failed[nb_of_e_rabs_failed].cause = ue_context_p->ue_context.modify_e_rab[nb_of_e_rabs_failed].cause; + } + S1AP_E_RAB_MODIFY_RESP (msg_fail_p).nb_of_e_rabs_failed = nb_of_e_rabs_failed; + + itti_send_msg_to_task (TASK_S1AP, instance, msg_fail_p); + + ue_context_p->ue_context.nb_of_modify_e_rabs = 0; + ue_context_p->ue_context.nb_of_failed_e_rabs = 0; + memset(ue_context_p->ue_context.modify_e_rab, 0, sizeof(ue_context_p->ue_context.modify_e_rab)); + + return (0); + } + } // end of ue_context_p != NULL +} + +/*NN: careful about the typcast of xid (long -> uint8_t*/ +int rrc_eNB_send_S1AP_E_RAB_MODIFY_RESP(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + uint8_t xid ) { + + MessageDef *msg_p = NULL; + int i; + int e_rab; + int e_rabs_done = 0; + int e_rabs_failed = 0; + msg_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_MODIFY_RESP); + S1AP_E_RAB_MODIFY_RESP (msg_p).eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id; + + for (e_rab = 0; e_rab < ue_context_pP->ue_context.nb_of_modify_e_rabs; e_rab++) { + + /* only respond to the corresponding transaction */ + if (xid == ue_context_pP->ue_context.modify_e_rab[e_rab].xid) { + if (ue_context_pP->ue_context.modify_e_rab[e_rab].status == E_RAB_STATUS_DONE) { + for (i = 0; i < ue_context_pP->ue_context.setup_e_rabs; i++) { + if (ue_context_pP->ue_context.modify_e_rab[e_rab].param.e_rab_id == ue_context_pP->ue_context.e_rab[i].param.e_rab_id) { + // Update ue_context_pP->ue_context.e_rab + ue_context_pP->ue_context.e_rab[i].status = E_RAB_STATUS_ESTABLISHED; + ue_context_pP->ue_context.e_rab[i].param.qos = ue_context_pP->ue_context.modify_e_rab[e_rab].param.qos; + ue_context_pP->ue_context.e_rab[i].cause = S1AP_CAUSE_NOTHING; + break; + } + } + if (i < ue_context_pP->ue_context.setup_e_rabs) { + S1AP_E_RAB_MODIFY_RESP (msg_p).e_rabs[e_rabs_done].e_rab_id = ue_context_pP->ue_context.modify_e_rab[e_rab].param.e_rab_id; + // TODO add other information from S1-U when it will be integrated + + LOG_D (RRC,"enb_gtp_addr (msg index %d, e_rab index %d, status %d, xid %d): nb_of_modify_e_rabs %d, e_rab_id %d \n ", + e_rabs_done, e_rab, ue_context_pP->ue_context.modify_e_rab[e_rab].status, xid, + ue_context_pP->ue_context.nb_of_modify_e_rabs, + S1AP_E_RAB_MODIFY_RESP (msg_p).e_rabs[e_rabs_done].e_rab_id); + + e_rabs_done++; + } else { + // unexpected + S1AP_E_RAB_MODIFY_RESP (msg_p).e_rabs_failed[e_rabs_failed].e_rab_id = ue_context_pP->ue_context.modify_e_rab[e_rab].param.e_rab_id; + + S1AP_E_RAB_MODIFY_RESP (msg_p).e_rabs_failed[e_rabs_failed].cause = S1AP_CAUSE_RADIO_NETWORK; + S1AP_E_RAB_MODIFY_RESP (msg_p).e_rabs_failed[e_rabs_failed].cause_value = 30;//S1ap_CauseRadioNetwork_unknown_E_RAB_ID; + + e_rabs_failed++; + } + } else if ((ue_context_pP->ue_context.modify_e_rab[e_rab].status == E_RAB_STATUS_NEW) || + (ue_context_pP->ue_context.modify_e_rab[e_rab].status == E_RAB_STATUS_ESTABLISHED)){ + LOG_D (RRC,"E-RAB is NEW or already ESTABLISHED\n"); + } else { /* status == E_RAB_STATUS_FAILED; */ + S1AP_E_RAB_MODIFY_RESP (msg_p).e_rabs_failed[e_rabs_failed].e_rab_id = ue_context_pP->ue_context.modify_e_rab[e_rab].param.e_rab_id; + // add failure cause when defined + S1AP_E_RAB_MODIFY_RESP (msg_p).e_rabs_failed[e_rabs_failed].cause = ue_context_pP->ue_context.modify_e_rab[e_rab].cause; + + e_rabs_failed++; + } + } else { + /*debug info for the xid */ + LOG_D(RRC,"xid does not corresponds (context e_rab index %d, status %d, xid %d/%d) \n ", + e_rab, ue_context_pP->ue_context.modify_e_rab[e_rab].status, xid, ue_context_pP->ue_context.modify_e_rab[e_rab].xid); + } + } + + + S1AP_E_RAB_MODIFY_RESP (msg_p).nb_of_e_rabs = e_rabs_done; + S1AP_E_RAB_MODIFY_RESP (msg_p).nb_of_e_rabs_failed = e_rabs_failed; + // NN: add conditions for e_rabs_failed + if (e_rabs_done > 0 || e_rabs_failed > 0) { + LOG_D(RRC,"S1AP_E_RAB_MODIFY_RESP: sending the message: nb_of_modify_e_rabs %d, total e_rabs %d, index %d\n", + ue_context_pP->ue_context.nb_of_modify_e_rabs, ue_context_pP->ue_context.setup_e_rabs, e_rab); +MSC_LOG_TX_MESSAGE( + MSC_RRC_ENB, + MSC_S1AP_ENB, + (const char *)&S1AP_E_RAB_SETUP_RESP (msg_p), + sizeof(s1ap_e_rab_setup_resp_t), + MSC_AS_TIME_FMT" E_RAB_MODIFY_RESP UE %X eNB_ue_s1ap_id %u e_rabs:%u succ %u fail", + MSC_AS_TIME_ARGS(ctxt_pP), + ue_context_pP->ue_id_rnti, + S1AP_E_RAB_MODIFY_RESP (msg_p).eNB_ue_s1ap_id, + e_rabs_done, e_rabs_failed); + + itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p); + } + + return 0; +} +int rrc_eNB_process_S1AP_E_RAB_RELEASE_COMMAND(MessageDef *msg_p, const char *msg_name, instance_t instance){ + uint16_t mme_ue_s1ap_id; + uint32_t eNB_ue_s1ap_id; + struct rrc_eNB_ue_context_s* ue_context_p = NULL; + protocol_ctxt_t ctxt; + e_rab_release_t e_rab_release_params[S1AP_MAX_E_RAB]; + uint8_t nb_e_rabs_torelease; + int erab; + int i; + uint8_t b_existed,is_existed; + uint8_t xid; + uint8_t e_rab_release_drb; + MessageDef * msg_delete_tunnels_p = NULL; + e_rab_release_drb = 0; + memcpy(&e_rab_release_params[0], &(S1AP_E_RAB_RELEASE_COMMAND (msg_p).e_rab_release_params[0]), sizeof(e_rab_release_t)*S1AP_MAX_E_RAB); + + mme_ue_s1ap_id = S1AP_E_RAB_RELEASE_COMMAND (msg_p).mme_ue_s1ap_id; + eNB_ue_s1ap_id = S1AP_E_RAB_RELEASE_COMMAND (msg_p).eNB_ue_s1ap_id; + nb_e_rabs_torelease = S1AP_E_RAB_RELEASE_COMMAND (msg_p).nb_e_rabs_torelease; + ue_context_p = rrc_eNB_get_ue_context_from_s1ap_ids(instance, UE_INITIAL_ID_INVALID, eNB_ue_s1ap_id); + if(ue_context_p != NULL){ + PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, instance, ENB_FLAG_YES, ue_context_p->ue_context.rnti, 0, 0); + + xid = rrc_eNB_get_next_transaction_identifier(ctxt.module_id); + + LOG_D(RRC,"S1AP-E-RAB Release Command: MME_UE_S1AP_ID %d ENB_UE_S1AP_ID %d release_e_rabs %d \n", + mme_ue_s1ap_id, eNB_ue_s1ap_id,nb_e_rabs_torelease); + for(erab = 0; erab < nb_e_rabs_torelease; erab++){ + b_existed = 0; + is_existed = 0; + for ( i = erab-1; i>= 0; i--){ + if (e_rab_release_params[erab].e_rab_id == e_rab_release_params[i].e_rab_id){ + is_existed = 1; + break; + } + } + if(is_existed == 1){ + //e_rab_id is existed + continue; + } + for ( i = 0; i < NB_RB_MAX; i++){ + if (e_rab_release_params[erab].e_rab_id == ue_context_p->ue_context.e_rab[i].param.e_rab_id){ + b_existed = 1; + break; + } + } + if(b_existed == 0) { + //no e_rab_id + ue_context_p->ue_context.e_rabs_release_failed[ue_context_p->ue_context.nb_release_of_e_rabs].e_rab_id = e_rab_release_params[erab].e_rab_id; + ue_context_p->ue_context.e_rabs_release_failed[ue_context_p->ue_context.nb_release_of_e_rabs].cause = S1AP_CAUSE_RADIO_NETWORK; + ue_context_p->ue_context.e_rabs_release_failed[ue_context_p->ue_context.nb_release_of_e_rabs].cause_value = 30; + ue_context_p->ue_context.nb_release_of_e_rabs++; + } else { + if(ue_context_p->ue_context.e_rab[i].status == E_RAB_STATUS_FAILED){ + ue_context_p->ue_context.e_rab[i].xid = xid; + continue; + } else if(ue_context_p->ue_context.e_rab[i].status == E_RAB_STATUS_ESTABLISHED){ + ue_context_p->ue_context.e_rab[i].status = E_RAB_STATUS_TORELEASE; + ue_context_p->ue_context.e_rab[i].xid = xid; + e_rab_release_drb++; + }else{ + //e_rab_id status NG + ue_context_p->ue_context.e_rabs_release_failed[ue_context_p->ue_context.nb_release_of_e_rabs].e_rab_id = e_rab_release_params[erab].e_rab_id; + ue_context_p->ue_context.e_rabs_release_failed[ue_context_p->ue_context.nb_release_of_e_rabs].cause = S1AP_CAUSE_RADIO_NETWORK; + ue_context_p->ue_context.e_rabs_release_failed[ue_context_p->ue_context.nb_release_of_e_rabs].cause_value = 0; + ue_context_p->ue_context.nb_release_of_e_rabs++; + } + } + } + if(e_rab_release_drb > 0) { + //RRCConnectionReconfiguration To UE + rrc_eNB_generate_dedicatedRRCConnectionReconfiguration_release(&ctxt, ue_context_p, xid, S1AP_E_RAB_RELEASE_COMMAND (msg_p).nas_pdu.length, S1AP_E_RAB_RELEASE_COMMAND (msg_p).nas_pdu.buffer); + } else { + //gtp tunnel delete + msg_delete_tunnels_p = itti_alloc_new_message(TASK_RRC_ENB, GTPV1U_ENB_DELETE_TUNNEL_REQ); + memset(>PV1U_ENB_DELETE_TUNNEL_REQ(msg_delete_tunnels_p), 0, sizeof(GTPV1U_ENB_DELETE_TUNNEL_REQ(msg_delete_tunnels_p))); + GTPV1U_ENB_DELETE_TUNNEL_REQ(msg_delete_tunnels_p).rnti = ue_context_p->ue_context.rnti; + for(i = 0; i < NB_RB_MAX; i++){ + if(xid == ue_context_p->ue_context.e_rab[i].xid){ + GTPV1U_ENB_DELETE_TUNNEL_REQ(msg_delete_tunnels_p).eps_bearer_id[GTPV1U_ENB_DELETE_TUNNEL_REQ(msg_delete_tunnels_p).num_erab++] = ue_context_p->ue_context.enb_gtp_ebi[i]; + ue_context_p->ue_context.enb_gtp_teid[i] = 0; + memset(&ue_context_p->ue_context.enb_gtp_addrs[i], 0, sizeof(ue_context_p->ue_context.enb_gtp_addrs[i])); + ue_context_p->ue_context.enb_gtp_ebi[i] = 0; + } + } + + itti_send_msg_to_task(TASK_GTPV1_U, instance, msg_delete_tunnels_p); + + //S1AP_E_RAB_RELEASE_RESPONSE + rrc_eNB_send_S1AP_E_RAB_RELEASE_RESPONSE(&ctxt, ue_context_p, xid); + } + } else { + LOG_E(RRC,"S1AP-E-RAB Release Command: MME_UE_S1AP_ID %d ENB_UE_S1AP_ID %d Error ue_context_p NULL \n", + S1AP_E_RAB_RELEASE_COMMAND (msg_p).mme_ue_s1ap_id, S1AP_E_RAB_RELEASE_COMMAND (msg_p).eNB_ue_s1ap_id); + return -1; + } + + return 0; +} + + +int rrc_eNB_send_S1AP_E_RAB_RELEASE_RESPONSE(const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, uint8_t xid){ + int e_rabs_released = 0; + MessageDef *msg_p; + + msg_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_RELEASE_RESPONSE); + S1AP_E_RAB_RELEASE_RESPONSE (msg_p).eNB_ue_s1ap_id = ue_context_pP->ue_context.eNB_ue_s1ap_id; + + for (int i = 0; i < NB_RB_MAX; i++){ + if (xid == ue_context_pP->ue_context.e_rab[i].xid){ + S1AP_E_RAB_RELEASE_RESPONSE (msg_p).e_rab_release[e_rabs_released].e_rab_id = ue_context_pP->ue_context.e_rab[i].param.e_rab_id; + e_rabs_released++; + //clear + memset(&ue_context_pP->ue_context.e_rab[i],0,sizeof(e_rab_param_t)); + } + } + S1AP_E_RAB_RELEASE_RESPONSE (msg_p).nb_of_e_rabs_released = e_rabs_released; + S1AP_E_RAB_RELEASE_RESPONSE (msg_p).nb_of_e_rabs_failed = ue_context_pP->ue_context.nb_release_of_e_rabs; + memcpy(&(S1AP_E_RAB_RELEASE_RESPONSE (msg_p).e_rabs_failed[0]),&ue_context_pP->ue_context.e_rabs_release_failed[0],sizeof(e_rab_failed_t)*ue_context_pP->ue_context.nb_release_of_e_rabs); + + ue_context_pP->ue_context.setup_e_rabs -= e_rabs_released; + LOG_I(RRC,"S1AP-E-RAB RELEASE RESPONSE: ENB_UE_S1AP_ID %d release_e_rabs %d setup_e_rabs %d \n", + S1AP_E_RAB_RELEASE_RESPONSE (msg_p).eNB_ue_s1ap_id, + e_rabs_released, ue_context_pP->ue_context.setup_e_rabs); + + itti_send_msg_to_task (TASK_S1AP, ctxt_pP->instance, msg_p); + //clear xid + for(int i = 0; i < NB_RB_MAX; i++) { + ue_context_pP->ue_context.e_rab[i].xid = -1; + } + //clear release e_rabs + ue_context_pP->ue_context.nb_release_of_e_rabs = 0; + memset(&ue_context_pP->ue_context.e_rabs_release_failed[0],0,sizeof(e_rab_failed_t)*S1AP_MAX_E_RAB); + return 0; +} + +/*------------------------------------------------------------------------------*/ +int rrc_eNB_process_PAGING_IND(MessageDef *msg_p, const char *msg_name, instance_t instance) +{ + const unsigned int Ttab[4] = {32,64,128,256}; + uint8_t Tc,Tue; /* DRX cycle of UE */ + uint32_t pcch_nB; /* 4T, 2T, T, T/2, T/4, T/8, T/16, T/32 */ + uint32_t N; /* N: min(T,nB). total count of PF in one DRX cycle */ + uint32_t Ns = 0; /* Ns: max(1,nB/T) */ + uint8_t i_s; /* i_s = floor(UE_ID/N) mod Ns */ + uint32_t T; /* DRX cycle */ + for (uint16_t tai_size = 0; tai_size < S1AP_PAGING_IND(msg_p).tai_size; tai_size++) { + LOG_D(RRC,"[eNB %d] In S1AP_PAGING_IND: MCC %d, MNC %d, TAC %d\n", instance, S1AP_PAGING_IND(msg_p).plmn_identity[tai_size].mcc, + S1AP_PAGING_IND(msg_p).plmn_identity[tai_size].mnc, S1AP_PAGING_IND(msg_p).tac[tai_size]); + if (RC.rrc[instance]->configuration.mcc == S1AP_PAGING_IND(msg_p).plmn_identity[tai_size].mcc + && RC.rrc[instance]->configuration.mnc == S1AP_PAGING_IND(msg_p).plmn_identity[tai_size].mnc + && RC.rrc[instance]->configuration.tac == S1AP_PAGING_IND(msg_p).tac[tai_size]) { + for (uint8_t CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { + lte_frame_type_t frame_type = RC.eNB[instance][CC_id]->frame_parms.frame_type; + /* get nB from configuration */ + /* get default DRX cycle from configuration */ + Tc = (uint8_t)RC.rrc[instance]->configuration.pcch_defaultPagingCycle[CC_id]; + if (Tc < PCCH_Config__defaultPagingCycle_rf32 || Tc > PCCH_Config__defaultPagingCycle_rf256) { + continue; + } + Tue = (uint8_t)S1AP_PAGING_IND(msg_p).paging_drx; + /* set T = min(Tc,Tue) */ + T = Tc < Tue ? Ttab[Tc] : Ttab[Tue]; + /* set pcch_nB = PCCH-Config->nB */ + pcch_nB = (uint32_t)RC.rrc[instance]->configuration.pcch_nB[CC_id]; + switch (pcch_nB) { + case PCCH_Config__nB_fourT: + Ns = 4; + break; + case PCCH_Config__nB_twoT: + Ns = 2; + break; + default: + Ns = 1; + break; + } + /* set N = min(T,nB) */ + if (pcch_nB > PCCH_Config__nB_oneT) { + switch (pcch_nB) { + case PCCH_Config__nB_halfT: + N = T/2; + break; + case PCCH_Config__nB_quarterT: + N = T/4; + break; + case PCCH_Config__nB_oneEighthT: + N = T/8; + break; + case PCCH_Config__nB_oneSixteenthT: + N = T/16; + break; + case PCCH_Config__nB_oneThirtySecondT: + N = T/32; + break; + default: + /* pcch_nB error */ + LOG_E(RRC, "[eNB %d] In S1AP_PAGING_IND: pcch_nB error (pcch_nB %d) \n", + instance, pcch_nB); + return (-1); + } + } else { + N = T; + } + + /* insert data to UE_PF_PO or update data in UE_PF_PO */ + pthread_mutex_lock(&ue_pf_po_mutex); + uint8_t i = 0; + for (i = 0; i < NUMBER_OF_UE_MAX; i++) { + if ((UE_PF_PO[CC_id][i].enable_flag == TRUE && UE_PF_PO[CC_id][i].ue_index_value == (uint16_t)(S1AP_PAGING_IND(msg_p).ue_index_value)) + || (UE_PF_PO[CC_id][i].enable_flag != TRUE)) { + /* set T = min(Tc,Tue) */ + UE_PF_PO[CC_id][i].T = T; + /* set UE_ID */ + UE_PF_PO[CC_id][i].ue_index_value = (uint16_t)S1AP_PAGING_IND(msg_p).ue_index_value; + /* calculate PF and PO */ + /* set PF_min : SFN mod T = (T div N)*(UE_ID mod N) */ + UE_PF_PO[CC_id][i].PF_min = (T / N) * (UE_PF_PO[CC_id][i].ue_index_value % N); + /* set PO */ + /* i_s = floor(UE_ID/N) mod Ns */ + i_s = (uint8_t)((UE_PF_PO[CC_id][i].ue_index_value / N) % Ns); + if (Ns == 1) { + UE_PF_PO[CC_id][i].PO = (frame_type==FDD) ? 9 : 0; + } else if (Ns==2) { + UE_PF_PO[CC_id][i].PO = (frame_type==FDD) ? (4+(5*i_s)) : (5*i_s); + } else if (Ns==4) { + UE_PF_PO[CC_id][i].PO = (frame_type==FDD) ? (4*(i_s&1)+(5*(i_s>>1))) : ((i_s&1)+(5*(i_s>>1))); + } + if (UE_PF_PO[CC_id][i].enable_flag == TRUE) { + //paging exist UE log + LOG_D(RRC,"[eNB %d] CC_id %d In S1AP_PAGING_IND: Update exist UE %d, T %d, PF %d, PO %d\n", instance, CC_id, UE_PF_PO[CC_id][i].ue_index_value, T, UE_PF_PO[CC_id][i].PF_min, UE_PF_PO[CC_id][i].PO); + } else { + /* set enable_flag */ + UE_PF_PO[CC_id][i].enable_flag = TRUE; + //paging new UE log + LOG_D(RRC,"[eNB %d] CC_id %d In S1AP_PAGING_IND: Insert a new UE %d, T %d, PF %d, PO %d\n", instance, CC_id, UE_PF_PO[CC_id][i].ue_index_value, T, UE_PF_PO[CC_id][i].PF_min, UE_PF_PO[CC_id][i].PO); + } + break; + } + } + pthread_mutex_unlock(&ue_pf_po_mutex); + + uint32_t length; + uint8_t buffer[RRC_BUF_SIZE]; + uint8_t *message_buffer; + /* Transfer data to PDCP */ + MessageDef *message_p; + message_p = itti_alloc_new_message (TASK_RRC_ENB, RRC_PCCH_DATA_REQ); + /* Create message for PDCP (DLInformationTransfer_t) */ + length = do_Paging (instance, + buffer, + S1AP_PAGING_IND(msg_p).ue_paging_identity, + S1AP_PAGING_IND(msg_p).cn_domain); + message_buffer = itti_malloc (TASK_RRC_ENB, TASK_PDCP_ENB, length); + /* Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling). */ + memcpy (message_buffer, buffer, length); + RRC_PCCH_DATA_REQ (message_p).sdu_size = length; + RRC_PCCH_DATA_REQ (message_p).sdu_p = message_buffer; + RRC_PCCH_DATA_REQ (message_p).mode = PDCP_TRANSMISSION_MODE_TRANSPARENT; /* not used */ + RRC_PCCH_DATA_REQ (message_p).rnti = P_RNTI; + RRC_PCCH_DATA_REQ (message_p).ue_index = i; + RRC_PCCH_DATA_REQ (message_p).CC_id = CC_id; + LOG_D(RRC, "[eNB %d] CC_id %d In S1AP_PAGING_IND: send encdoed buffer to PDCP buffer_size %d\n", instance, CC_id, length); + itti_send_msg_to_task (TASK_PDCP_ENB, instance, message_p); + } + } + } + + return (0); +} # endif /* defined(ENABLE_ITTI) */ #endif /* defined(ENABLE_USE_MME) */ diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.h b/openair2/RRC/LITE/rrc_eNB_S1AP.h index 93a213c06f..a924caf254 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.h +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rrc_eNB_S1AP.h * \brief rrc S1AP procedures for eNB * \author Laurent Winckel and Sebastien ROUX and Navid Nikaein and Lionel GAUTHIER @@ -79,6 +72,19 @@ rrc_eNB_S1AP_remove_ue_ids( eNB_RRC_INST* const rrc_instance_pP, struct rrc_ue_s1ap_ids_s* const ue_ids_pP ); + +void +rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const uint8_t ho_state + ); + +int +rrc_eNB_modify_dedicatedRRCConnectionReconfiguration(const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const uint8_t ho_state + ); + /*! \fn void rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(uint8_t mod_id, uint8_t ue_index) *\brief create a S1AP_INITIAL_CONTEXT_SETUP_RESP for S1AP. *\param ctxt_pP Running context. @@ -166,6 +172,43 @@ int rrc_eNB_process_S1AP_DOWNLINK_NAS(MessageDef *msg_p, const char *msg_name, i */ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance); + +/*! \fn rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance); + *\brief process a S1AP dedicated E_RAB setup request message received from S1AP. + *\param msg_p Message received by RRC. + *\param msg_name Message name. + *\param instance Message instance. + *\return 0 when successful, -1 if the UE index can not be retrieved. + */ +int rrc_eNB_process_S1AP_E_RAB_SETUP_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance); + +/*! \fn rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, uint8_t xid ) + *\brief send a S1AP dedicated E_RAB setup response + *\param ctxt_pP contxt infirmation + *\param e_contxt_pP ue specific context at the eNB + *\param xid transaction identifier + *\return 0 when successful, -1 if the UE index can not be retrieved. + */ +int rrc_eNB_send_S1AP_E_RAB_SETUP_RESP(const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, uint8_t xid ); + +/*! \fn rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance); + *\brief process a S1AP dedicated E_RAB modify request message received from S1AP. + *\param msg_p Message received by RRC. + *\param msg_name Message name. + *\param instance Message instance. + *\return 0 when successful, -1 if the UE index can not be retrieved. + */ +int rrc_eNB_process_S1AP_E_RAB_MODIFY_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance); + +/*! \fn rrc_eNB_send_S1AP_E_RAB_MODIFY_RESP(const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, uint8_t xid ) + *\brief send a S1AP dedicated E_RAB modify response + *\param ctxt_pP contxt infirmation + *\param e_contxt_pP ue specific context at the eNB + *\param xid transaction identifier + *\return 0 when successful, -1 if the UE index can not be retrieved. + */ +int rrc_eNB_send_S1AP_E_RAB_MODIFY_RESP(const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, uint8_t xid ); + /*! \fn rrc_eNB_process_S1AP_UE_CTXT_MODIFICATION_REQ(MessageDef *msg_p, const char *msg_name, instance_t instance) *\brief process a S1AP_UE_CTXT_MODIFICATION_REQ message received from S1AP. *\param msg_p Message received by RRC. @@ -193,6 +236,39 @@ int rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_REQ (MessageDef *msg_p, const char * */ int rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_COMMAND (MessageDef *msg_p, const char *msg_name, instance_t instance); +/*! \fn rrc_eNB_process_PAGING_IND(MessageDef *msg_p, const char *msg_name, instance_t instance) + *\brief process a S1AP_PAGING_IND message received from S1AP. + *\param msg_p Message received by RRC. + *\param msg_name Message name. + *\param instance Message instance. + *\return 0 when successful, -1 if the UE index can not be retrieved. + */ +int rrc_eNB_process_PAGING_IND(MessageDef *msg_p, const char *msg_name, instance_t instance); + +void +rrc_pdcp_config_security( + const protocol_ctxt_t* const ctxt_pP, + rrc_eNB_ue_context_t* const ue_context_pP, + const uint8_t send_security_mode_command +); +/*! \fn rrc_eNB_process_S1AP_E_RAB_RELEASE_COMMAND(MessageDef *msg_p, const char *msg_name, instance_t instance); + *\brief process a S1AP dedicated E_RAB release command message received from S1AP. + *\param msg_p Message received by RRC. + *\param msg_name Message name. + *\param instance Message instance. + *\return 0 when successful, -1 if the UE index can not be retrieved. + */ +int rrc_eNB_process_S1AP_E_RAB_RELEASE_COMMAND(MessageDef *msg_p, const char *msg_name, instance_t instance); + +/*! \fn rrc_eNB_send_S1AP_E_RAB_RELEASE_RESPONSE(const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, uint8_t xid ) + *\brief send a S1AP dedicated E_RAB release response + *\param ctxt_pP contxt infirmation + *\param e_contxt_pP ue specific context at the eNB + *\param xid transaction identifier + *\return 0 when successful, -1 if the UE index can not be retrieved. + */ +int rrc_eNB_send_S1AP_E_RAB_RELEASE_RESPONSE(const protocol_ctxt_t* const ctxt_pP, rrc_eNB_ue_context_t* const ue_context_pP, uint8_t xid ); + # endif # endif /* defined(ENABLE_USE_MME) */ #endif /* RRC_ENB_S1AP_H_ */ diff --git a/openair2/RRC/LITE/rrc_eNB_UE_context.c b/openair2/RRC/LITE/rrc_eNB_UE_context.c index 0662471763..0ae3d7ca15 100644 --- a/openair2/RRC/LITE/rrc_eNB_UE_context.c +++ b/openair2/RRC/LITE/rrc_eNB_UE_context.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rrc_eNB_UE_context.h * \brief rrc procedures for UE context @@ -135,7 +127,7 @@ rrc_eNB_allocate_new_UE_context( //------------------------------------------------------------------------------ { struct rrc_eNB_ue_context_s* new_p; - new_p = malloc(sizeof(struct rrc_eNB_ue_context_s)); + new_p = (struct rrc_eNB_ue_context_s* )malloc(sizeof(struct rrc_eNB_ue_context_s)); if (new_p == NULL) { LOG_E(RRC, "Cannot allocate new ue context\n"); @@ -144,6 +136,10 @@ rrc_eNB_allocate_new_UE_context( memset(new_p, 0, sizeof(struct rrc_eNB_ue_context_s)); new_p->local_uid = uid_linear_allocator_new(rrc_instance_pP); + for(int i = 0; i < NB_RB_MAX; i++) { + new_p->ue_context.e_rab[i].xid = -1; + new_p->ue_context.modify_e_rab[i].xid = -1; + } return new_p; } @@ -159,7 +155,21 @@ rrc_eNB_get_ue_context( memset(&temp, 0, sizeof(struct rrc_eNB_ue_context_s)); /* eNB ue rrc id = 24 bits wide */ temp.ue_id_rnti = rntiP; +#if 0 return RB_FIND(rrc_ue_tree_s, &rrc_instance_pP->rrc_ue_head, &temp); +#endif + struct rrc_eNB_ue_context_s *ue_context_p = NULL; + ue_context_p = RB_FIND(rrc_ue_tree_s, &rrc_instance_pP->rrc_ue_head, &temp); + if ( ue_context_p != NULL) { + return ue_context_p; + } else { + RB_FOREACH(ue_context_p, rrc_ue_tree_s, &(rrc_instance_pP->rrc_ue_head)) { + if (ue_context_p->ue_context.rnti == rntiP) { + return ue_context_p; + } + } + return NULL; + } } @@ -192,6 +202,7 @@ void rrc_eNB_remove_ue_context( rrc_eNB_free_mem_UE_context(ctxt_pP, ue_context_pP); uid_linear_allocator_free(rrc_instance_pP, ue_context_pP->local_uid); free(ue_context_pP); + rrc_instance_pP->Nb_ue --; LOG_I(RRC, PROTOCOL_RRC_CTXT_UE_FMT" Removed UE context\n", PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); diff --git a/openair2/RRC/LITE/rrc_eNB_UE_context.h b/openair2/RRC/LITE/rrc_eNB_UE_context.h index 084baa9cc4..0e813cdee5 100644 --- a/openair2/RRC/LITE/rrc_eNB_UE_context.h +++ b/openair2/RRC/LITE/rrc_eNB_UE_context.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rrc_eNB_UE_context.h * \brief rrc procedures for UE context diff --git a/openair2/RRC/LITE/rrc_eNB_ral.c b/openair2/RRC/LITE/rrc_eNB_ral.c old mode 100755 new mode 100644 index d1a0f02e46..94e25a6eeb --- a/openair2/RRC/LITE/rrc_eNB_ral.c +++ b/openair2/RRC/LITE/rrc_eNB_ral.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rrc_eNB_ral.c * \brief rrc procedures for handling RAL messages diff --git a/openair2/RRC/LITE/rrc_eNB_ral.h b/openair2/RRC/LITE/rrc_eNB_ral.h old mode 100755 new mode 100644 index da69b47023..143537e45c --- a/openair2/RRC/LITE/rrc_eNB_ral.h +++ b/openair2/RRC/LITE/rrc_eNB_ral.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rrc_eNB_ral.h * \brief rrc procedures for handling RAL messages diff --git a/openair2/RRC/LITE/rrc_rrm_interface.c b/openair2/RRC/LITE/rrc_rrm_interface.c index 29f97ed296..9f4270be89 100644 --- a/openair2/RRC/LITE/rrc_rrm_interface.c +++ b/openair2/RRC/LITE/rrc_rrm_interface.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! ******************************************************************************* @@ -299,10 +292,5 @@ int send_msg_fifo(int *s, msg_t *fmsg) int send_msg(void *s, msg_t *smsg) { -#ifdef USER_MODE send_msg_sock((sock_rrm_t *)s, smsg); -#else - send_msg_fifo((int *)s,smsg); -#endif - } diff --git a/openair2/RRC/LITE/rrc_rrm_interface.h b/openair2/RRC/LITE/rrc_rrm_interface.h index 5d83f8679b..0880859a59 100644 --- a/openair2/RRC/LITE/rrc_rrm_interface.h +++ b/openair2/RRC/LITE/rrc_rrm_interface.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! ******************************************************************************* @@ -108,8 +101,6 @@ extern "C" { #define START_MSG_PUSU 0xCC -#ifdef USER_MODE - #include #include @@ -135,16 +126,6 @@ char *recv_msg( sock_rrm_t *s ) ; } #endif -#else //USER_MODE -#include - -#define RRC2RRM_FIFO 14 -#define RRM2RRC_FIFO 15 -int send_msg_fifo(int *s ,msg_t *msg ) ; -#endif //USER_MODE - int send_msg(void *, msg_t *); - - #endif diff --git a/openair2/RRC/LITE/rrc_types.h b/openair2/RRC/LITE/rrc_types.h index cd9b7815f6..9c1e37494f 100644 --- a/openair2/RRC/LITE/rrc_types.h +++ b/openair2/RRC/LITE/rrc_types.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rrc_types.h * \brief rrc types and subtypes diff --git a/openair2/RRC/LITE/rrm_2_rrc_msg.c b/openair2/RRC/LITE/rrm_2_rrc_msg.c index cc44465201..3ed3a9d859 100644 --- a/openair2/RRC/LITE/rrm_2_rrc_msg.c +++ b/openair2/RRC/LITE/rrm_2_rrc_msg.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! ******************************************************************************* @@ -72,17 +65,12 @@ void fn_rrc (void) /******************************************************************************/ msg_head_t *Header ; -#ifdef USER_MODE char *Data; -#else - int bytes_read; -#endif L2_ID Mac_id; while(1) { -#ifdef USER_MODE Header = (msg_head_t *) recv_msg(&S_rrc) ; if(Header==NULL) { @@ -90,52 +78,9 @@ void fn_rrc (void) } Data_to_read=Header->size; -#else - - if(Header_read_idx < Header_size) { - bytes_read = rtf_get (RRM2RRC_FIFO,&Header_buf[Header_read_idx],Header_size-Header_read_idx); - - if(bytes_read >0) { - msg("RRC: GET FIFOS RETURNS %d bytes, header %d\n",bytes_read,Header_read_idx); - } - - Header_read_idx+=bytes_read; - - if(Header_read_idx == Header_size) { - Header = (msg_head_t *) Header_buf; - Data_to_read=Header->size; - msg("RRC: Header read completed, data size %d\n",Data_to_read); - } - //msg("[fn_rrc]TTI %d: rcv_msg return Null\n",Rrc_xface->Frame_index); - else { - break; - } - } - -#endif if (Data_to_read > 0 ) { -#ifdef USER_MODE Data = (char *) (Header +1) ; -#else - bytes_read = rtf_get (RRM2RRC_FIFO,&Data[Data_read_idx],Data_to_read); - - if(bytes_read >0) { - msg("RRC: GET FIFOS RETURNS %d bytes, Data_to_read %d\n",bytes_read,Data_to_read); - } - - Data_to_read-=bytes_read; - Data_read_idx+=bytes_read; - - if(Data_to_read > 0 ) { - break; - } - - msg("RRC: DATA read completed, data size %d\n",Data_to_read); - Header_read_idx=0; - Data_read_idx=0; - Data_to_read=0; -#endif } msg("Got MSG of Type %d on Inst %d\n",Header->msg_type,Header->inst); diff --git a/openair2/RRC/LITE/utils.c b/openair2/RRC/LITE/utils.c index 1bf6530384..bbf97046bf 100644 --- a/openair2/RRC/LITE/utils.c +++ b/openair2/RRC/LITE/utils.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*________________________openair_rrc_utils.c________________________ @@ -37,25 +29,8 @@ ________________________________________________________________*/ -//#include "openair_types.h" #include "defs.h" #include "extern.h" -//#include "openair_proto.h" - - -#ifndef USER_MODE -char bcmp(void *x, void *y,int Size ) -{ - unsigned char i; - - for(i=0; imacphy_exit(); - #else exit(-1); - #endif */ } /* diff --git a/openair2/RRC/LITE/vars.h b/openair2/RRC/LITE/vars.h index cb6e8c5238..e3bab5f5eb 100644 --- a/openair2/RRC/LITE/vars.h +++ b/openair2/RRC/LITE/vars.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file vars.hles * \brief rrc variables @@ -44,31 +36,10 @@ #include "COMMON/mac_rrc_primitives.h" #include "LAYER2/MAC/defs.h" -eNB_RRC_INST *eNB_rrc_inst; +UE_PF_PO_t UE_PF_PO[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; +pthread_mutex_t ue_pf_po_mutex; UE_RRC_INST *UE_rrc_inst; -//RRC_XFACE *Rrc_xface; -#ifndef USER_MODE -//MAC_RLC_XFACE *Mac_rlc_xface; -#ifndef NO_RRM -int S_rrc= RRC2RRM_FIFO; -#endif //NO_RRM -//int R_rrc= RRM2RRC_FIFO; -#else #include "LAYER2/MAC/extern.h" -#ifndef NO_RRM -sock_rrm_t S_rrc; -#endif -#endif - -#ifndef NO_RRM -#ifndef USER_MODE -char *Header_buf; -char *Data; -unsigned short Header_read_idx,Data_read_idx,Header_size; -#endif -unsigned short Data_to_read; -#endif //NO_RRM - #define MAX_U32 0xFFFFFFFF uint8_t DRB2LCHAN[8]; @@ -88,7 +59,7 @@ struct LogicalChannelConfig__ul_SpecificParameters LCSRB2 = {3, }; -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) struct LogicalChannelConfig__ext1 logicalChannelSR_Mask_r9_ext1 = { logicalChannelSR_Mask_r9: &logicalChannelSR_Mask_r9 }; @@ -96,14 +67,14 @@ struct LogicalChannelConfig__ext1 logicalChannelSR_Mask_r9_ext1 = { // These are the default SRB configurations from 36.331 (Chapter 9, p. 176-179 in v8.6) LogicalChannelConfig_t SRB1_logicalChannelConfig_defaultValue = {ul_SpecificParameters: &LCSRB1 -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) , ext1: &logicalChannelSR_Mask_r9_ext1 #endif }; LogicalChannelConfig_t SRB2_logicalChannelConfig_defaultValue = {ul_SpecificParameters: &LCSRB2 -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) , ext1: &logicalChannelSR_Mask_r9_ext1 #endif @@ -267,4 +238,10 @@ float RSRQ_meas_mapping[35] = { -2 }; +// only used for RRC connection re-establishment procedure TS36.331 5.3.7 +// [0]: current C-RNTI, [1]: prior C-RNTI +// insert one when eNB received RRCConnectionReestablishmentRequest message +// delete one when eNB received RRCConnectionReestablishmentComplete message +uint16_t reestablish_rnti_map[NUMBER_OF_UE_MAX][2] = {{0}}; + #endif diff --git a/openair2/RRC/NAS/COPYING b/openair2/RRC/NAS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRC/NAS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRC/NAS/nas_config.c b/openair2/RRC/NAS/nas_config.c index 400be1a604..3f825760da 100644 --- a/openair2/RRC/NAS/nas_config.c +++ b/openair2/RRC/NAS/nas_config.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file nas_config.c * \brief Configures the nasmesh interface * \author Daniel Camara and Navid Nikaein diff --git a/openair2/RRC/NAS/nas_config.h b/openair2/RRC/NAS/nas_config.h old mode 100755 new mode 100644 index 93ee5a196d..4426ca9a1a --- a/openair2/RRC/NAS/nas_config.h +++ b/openair2/RRC/NAS/nas_config.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file nas_config.h * \brief Configures the nasmesh interface * \author Daniel Camara and navid nikaein diff --git a/openair2/RRC/NAS/rb_config.c b/openair2/RRC/NAS/rb_config.c index 9a7f8a88da..3431137f74 100644 --- a/openair2/RRC/NAS/rb_config.c +++ b/openair2/RRC/NAS/rb_config.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file rb_config.c * \brief User-space utility for configuring NASMESH IOCTL interface * \author Raymond Knopp and Navid Nikaein diff --git a/openair2/RRC/NAS/rb_config.h b/openair2/RRC/NAS/rb_config.h index e8d807f882..6af42bac45 100644 --- a/openair2/RRC/NAS/rb_config.h +++ b/openair2/RRC/NAS/rb_config.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** \file rb_config.h * \brief Openair radio bearer configuration header file diff --git a/openair2/RRM_4_RRC_LITE/COPYING b/openair2/RRM_4_RRC_LITE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRM_4_RRC_LITE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRM_4_RRC_LITE/Makefile b/openair2/RRM_4_RRC_LITE/Makefile deleted file mode 100755 index 91a204cb73..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile +++ /dev/null @@ -1,169 +0,0 @@ -PLATFORM = linux-x86-32 -NUM_PROC = $(shell echo `cat /proc/cpuinfo | grep processor | wc -l`) -NUM_PROC = 1 - -LIBS = -L/usr/local/lib -Llib -lSockets -lasn1rrc -lpthread -lssl -lcrypto -lssl -lxml2 - -#------------------------------------------------ -# DIRS -#------------------------------------------------ -UPDIR := $(shell /bin/pwd) -BIN_DIR = bin -SRC_DIR = $(UPDIR)/src -COM_DIR = $(SRC_DIR)/com -FOREIGN_DIR = $(SRC_DIR)/foreign -SOCKETS_DIR = $(FOREIGN_DIR)/sockets-2.3.9.4 -TCPIP_DIR = $(FOREIGN_DIR)/tcpip -SQL_DIR = $(FOREIGN_DIR)/sql -ASN1_RRC_SPEC_DIR = $(FOREIGN_DIR)/generated_c_asn1_rrc/ASN1_files -RRC_RRM_ASN1_DIR = $(COM_DIR)/asn1 -RADIO_RESOURCES_DIR = $(SRC_DIR)/radio_resources -RRC_DIR = ../RRC/LITE -TEST_DIR = $(SRC_DIR)/test - - -#------------------------------------------------ -# INCLUDES -#------------------------------------------------ -include Makefile.objs -include Makefile.Defines.$(PLATFORM) -INCLUDE = -I$(SRC_DIR) -I$(SOCKETS_DIR) -I$(SQL_DIR) -I$(COM_DIR) -I$(COM_DIR)/rrc -I$(COM_DIR)/rrm \ --I$(TCPIP_DIR) -I$(RADIO_RESOURCES_DIR) -I$(RRC_RRM_ASN1_DIR) -I$(TEST_DIR) - - -#------------------------------------------------ -# CFLAGS -#------------------------------------------------ - -CPPFLAGS = $(CFLAGS) -#CPPFLAGS += -fpermissive -std=gnu++98 - -#------------------------------------------------ -# LIBS -#------------------------------------------------ -libasn1rrc: libasn1rrc.a - mv libasn1rrc.a lib - -libsqlite: libsqlite.a - mv libsqlite.a lib - - -libSockets: libSockets.a - mv libSockets.a lib - - -libasn1rrc.a: $(ASN1RRC_OBJS) - ar cru $@ $^ - ranlib $@ - -libSockets.a: $(SOCKETS_OBJS) - ar cru $@ $^ - ranlib $@ - -libsqlite.a: $(SQLITE_OBJS) - ar cru $@ $^ - ranlib $@ - -LDFLAGS += -rdynamic - -#------------------------------------------------ -# PROGS -#------------------------------------------------ -PROGS = rrm_exe test_exe - -gen-c-from-asn1: - #-fbless-SIZE - # Allow SIZE() constraint for INTEGER, ENUMERATED, and other types - # for which this constraint is normally prohibited by the stan- - # dard. This is a violation of ASN.1 standard, and the compiler - # may fail to produce a meaningful code. - - #-fcompound-names - # Using this option prevents name collisions in the target source - # code by using complex names for target language structures. - # (Name collisions may occur if the ASN.1 module reuses the same - # identifiers in multiple contexts). - - #-findirect-choice - # When generating code for a CHOICE type, compile the CHOICE mem- - # bers as indirect pointers instead of declaring them inline. Con- - # sider using this option together with -fno-include-deps to pre- - # vent circular references. - - #-fknown-extern-type= - # Pretend the specified type is known. The compiler will assume - # the target language source files for the given type have been - # provided manually. - - #-fno-constraints - # Do not generate ASN.1 subtype constraint checking code. This may - # make a shorter executable. - - #-fno-include-deps - # Do not generate courtesy #include lines for non-critical type - # dependencies. Helps prevent namespace collisions. - - #-funnamed-unions - # Enable unnamed unions in the definitions of target language's - # structures. - #cd $(RRC_RRM_ASN1_DIR);asn1c -gen-PER -fcompound-names -fnative-types -fskeletons-copy $(ASN1_RRC_SPEC_DIR)/EUTRA-RRC-Definitions.asn $(RRC_RRM_ASN1_DIR)/rrc-rrm.asn; cd - - cd $(RRC_RRM_ASN1_DIR);asn1c -gen-PER -fno-include-deps -fcompound-names -fnative-types -fskeletons-copy $(ASN1_RRC_SPEC_DIR)/EUTRA-RRC-Definitions.asn $(RRC_RRM_ASN1_DIR)/rrc-rrm.asn; cd - - - -libs: - make -j$(NUM_PROC) libasn1rrc libsqlite libSockets - - -all: libs - make -j$(NUM_PROC) $(PROGS) - - -rrm: $(RRM_OBJS) lib/libSockets.a lib/libasn1rrc.a - g++ -o $@ $^ $(LIBS) - mv rrm $(BIN_DIR) - -rrm_exe: clean_test_objs - make -j$(NUM_PROC) rrm - - - -clean_test_objs: - find $(COM_DIR)/rrc/ -name '*Response.o' -delete -print; - find $(COM_DIR)/rrc/ -name '*Reconfiguration.o' -delete -print; - -dummy_rrc: CFLAGS += -DTEST_SCENARIO=1 - -dummy_rrc: $(TEST_OBJS) lib/libSockets.a lib/libasn1rrc.a - g++ -o $@ $^ $(LIBS) - mv dummy_rrc $(BIN_DIR) - -test_exe: clean_test_objs - make -j$(NUM_PROC) dummy_rrc - - - - - - -clean: - find -name '*.o' -delete -print; \ - find -name '*.bak' -delete -print; \ - find -name '*.d' -delete -print; \ - find -name '*~' -delete -print; \ - rm -f bin/*; \ - rm -f lib/* - -cleanrrm: - find src/com/rrc -name '*.o' -delete -print; \ - find src/com/rrm -name '*.o' -delete -print; \ - find src/com -name 'Message.o' -delete -print; \ - find src/radio_resources -name '*.o' -delete -print; \ - find src/com -name '*.bak' -delete -print; \ - find src/radio_resources -name '*.bak' -delete -print; \ - find src/com -name '*.d' -delete -print; \ - find src/radio_resources -name '*.d' -delete -print; \ - find src/com -name '*~' -delete -print; \ - find src/radio_resources -name '*~' -delete -print; \ - rm -f bin/*; \ - --include *.d diff --git a/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-32 b/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-32 deleted file mode 100755 index de2b2c4566..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-32 +++ /dev/null @@ -1,25 +0,0 @@ -CXX = g++-4.3 - -CFLAGS += -Wall -g $(INCLUDE) -MD -D_VERSION='"$(VERSION)"' - -# turn off optimization if compiling with gcc 2.9.x: -#CFLAGS += -O0 -#CFLAGS += -O2 - - -CFLAGS += -DLINUX - -#LG TEST REMOVECFLAGS += -fPIC - -LIBS += \ - -lssl -lcrypto \ - -lpthread - -LDFLAGSSO = -shared \ - -Wl,-lssl \ - -Wl,-lcrypto \ - -Wl,-lxml2 \ - -Wl,-lpthread \ - -Wl,-h$(SONAME) \ - -Wl,-call_shared - diff --git a/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-64 b/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-64 deleted file mode 100755 index 09b22075cc..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile.Defines.linux-x86-64 +++ /dev/null @@ -1,27 +0,0 @@ -CXX = g++ - -CFLAGS += -Wall -g $(INCLUDE) -MD -D_VERSION='"$(VERSION)"' - -# turn off optimization if compiling with gcc 2.9.x: -#CFLAGS += -O0 -CFLAGS += -O2 - - -CFLAGS += -DLINUX -m64 - -CFLAGS += -fPIC - -LIBS += \ - -lssl -lcrypto \ - -lpthread - -OBJS += Semaphore.o - -LDFLAGSSO = -shared \ - -Wl,-lssl \ - -Wl,-lcrypto \ - -Wl,-lxml2 \ - -Wl,-lpthread \ - -Wl,-h$(SONAME) \ - -Wl,-call_shared - diff --git a/openair2/RRM_4_RRC_LITE/Makefile.am b/openair2/RRM_4_RRC_LITE/Makefile.am deleted file mode 100755 index 396720a90d..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -SUBDIRS = src - -EXTRA_DIST = README ChangeLog AUTHORS COPYING INSTALL NEWS - - - -rrm$(EXEEXT): - $(MAKE) -C src $@ diff --git a/openair2/RRM_4_RRC_LITE/Makefile.cvs b/openair2/RRM_4_RRC_LITE/Makefile.cvs deleted file mode 100755 index 8b9e1ebd3b..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile.cvs +++ /dev/null @@ -1,9 +0,0 @@ -default: all - -all: - autoreconf -i - -clean: - rm -r aclocal.m4 autom4te.cache/ config.* configure depcomp install-sh missing src/config.h.in ltmain.sh INSTALL ; \ - find . -name Makefile.in -exec rm '{}' ';' - diff --git a/openair2/RRM_4_RRC_LITE/Makefile.objs b/openair2/RRM_4_RRC_LITE/Makefile.objs deleted file mode 100755 index d4dade4986..0000000000 --- a/openair2/RRM_4_RRC_LITE/Makefile.objs +++ /dev/null @@ -1,547 +0,0 @@ -ASN1RRC_OBJS= $(RRC_RRM_ASN1_DIR)/AC-BarringConfig.o \ - $(RRC_RRM_ASN1_DIR)/AccessStratumRelease.o \ - $(RRC_RRM_ASN1_DIR)/AdditionalSpectrumEmission.o \ - $(RRC_RRM_ASN1_DIR)/AllowedMeasBandwidth.o \ - $(RRC_RRM_ASN1_DIR)/AntennaInfoCommon.o \ - $(RRC_RRM_ASN1_DIR)/AntennaInfoDedicated.o \ - $(RRC_RRM_ASN1_DIR)/ARFCN-ValueCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/ARFCN-ValueEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/ARFCN-ValueGERAN.o \ - $(RRC_RRM_ASN1_DIR)/ARFCN-ValueUTRA.o \ - $(RRC_RRM_ASN1_DIR)/asn_codecs_prim.o \ - $(RRC_RRM_ASN1_DIR)/asn_SEQUENCE_OF.o \ - $(RRC_RRM_ASN1_DIR)/asn_SET_OF.o \ - $(RRC_RRM_ASN1_DIR)/BandclassCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/BandClassInfoCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/BandClassListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/BandClassPriority1XRTT.o \ - $(RRC_RRM_ASN1_DIR)/BandClassPriorityHRPD.o \ - $(RRC_RRM_ASN1_DIR)/BandClassPriorityList1XRTT.o \ - $(RRC_RRM_ASN1_DIR)/BandClassPriorityListHRPD.o \ - $(RRC_RRM_ASN1_DIR)/BandIndicatorGERAN.o \ - $(RRC_RRM_ASN1_DIR)/BandInfoEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/BandListEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/BCCH-BCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/BCCH-BCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/BCCH-Config.o \ - $(RRC_RRM_ASN1_DIR)/BCCH-DL-SCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/BCCH-DL-SCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/ber_decoder.o \ - $(RRC_RRM_ASN1_DIR)/ber_tlv_length.o \ - $(RRC_RRM_ASN1_DIR)/ber_tlv_tag.o \ - $(RRC_RRM_ASN1_DIR)/BIT_STRING.o \ - $(RRC_RRM_ASN1_DIR)/BlackCellsToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/BlackCellsToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/BOOLEAN.o \ - $(RRC_RRM_ASN1_DIR)/CarrierBandwidthEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqGERAN.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqListUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqListUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqsGERAN.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqsInfoGERAN.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqsInfoListGERAN.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/CarrierFreqUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/CDMA2000-Type.o \ - $(RRC_RRM_ASN1_DIR)/CellChangeOrder.o \ - $(RRC_RRM_ASN1_DIR)/CellGlobalIdCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CellGlobalIdEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/CellGlobalIdGERAN.o \ - $(RRC_RRM_ASN1_DIR)/CellGlobalIdUTRA.o \ - $(RRC_RRM_ASN1_DIR)/CellIdentity.o \ - $(RRC_RRM_ASN1_DIR)/CellIndexList.o \ - $(RRC_RRM_ASN1_DIR)/CellIndex.o \ - $(RRC_RRM_ASN1_DIR)/CellReselectionParametersCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CellReselectionPriority.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModListUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModListUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/CellsToAddModUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/constraints.o \ - $(RRC_RRM_ASN1_DIR)/constr_CHOICE.o \ - $(RRC_RRM_ASN1_DIR)/constr_SEQUENCE.o \ - $(RRC_RRM_ASN1_DIR)/constr_SEQUENCE_OF.o \ - $(RRC_RRM_ASN1_DIR)/constr_SET_OF.o \ - $(RRC_RRM_ASN1_DIR)/constr_TYPE.o \ - $(RRC_RRM_ASN1_DIR)/CounterCheck.o \ - $(RRC_RRM_ASN1_DIR)/CounterCheck-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/CounterCheckResponse.o \ - $(RRC_RRM_ASN1_DIR)/CounterCheckResponse-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/CQI-ReportConfig.o \ - $(RRC_RRM_ASN1_DIR)/CQI-ReportPeriodic.o \ - $(RRC_RRM_ASN1_DIR)/C-RNTI.o \ - $(RRC_RRM_ASN1_DIR)/CSFBParametersRequestCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CSFBParametersRequestCDMA2000-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/CSFBParametersResponseCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/CSFBParametersResponseCDMA2000-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/CSFB-RegistrationParam1XRTT.o \ - $(RRC_RRM_ASN1_DIR)/DedicatedInfoCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/DedicatedInfoNAS.o \ - $(RRC_RRM_ASN1_DIR)/DeltaFList-PUCCH.o \ - $(RRC_RRM_ASN1_DIR)/der_encoder.o \ - $(RRC_RRM_ASN1_DIR)/DL-AM-RLC.o \ - $(RRC_RRM_ASN1_DIR)/DL-CCCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/DL-CCCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/DL-DCCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/DL-DCCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/DLInformationTransfer.o \ - $(RRC_RRM_ASN1_DIR)/DLInformationTransfer-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/DL-UM-RLC.o \ - $(RRC_RRM_ASN1_DIR)/DRB-CountInfoList.o \ - $(RRC_RRM_ASN1_DIR)/DRB-CountInfo.o \ - $(RRC_RRM_ASN1_DIR)/DRB-CountMSB-InfoList.o \ - $(RRC_RRM_ASN1_DIR)/DRB-CountMSB-Info.o \ - $(RRC_RRM_ASN1_DIR)/DRB-Identity.o \ - $(RRC_RRM_ASN1_DIR)/DRB-ToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/DRB-ToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/DRB-ToReleaseList.o \ - $(RRC_RRM_ASN1_DIR)/DRX-Config.o \ - $(RRC_RRM_ASN1_DIR)/EstablishmentCause.o \ - $(RRC_RRM_ASN1_DIR)/ExplicitListOfARFCNs.o \ - $(RRC_RRM_ASN1_DIR)/FilterCoefficient.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityListEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityListUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityListUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/FreqPriorityUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/FreqsPriorityGERAN.o \ - $(RRC_RRM_ASN1_DIR)/FreqsPriorityListGERAN.o \ - $(RRC_RRM_ASN1_DIR)/HandoverFromEUTRAPreparationRequest.o \ - $(RRC_RRM_ASN1_DIR)/HandoverFromEUTRAPreparationRequest-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/Handover.o \ - $(RRC_RRM_ASN1_DIR)/Hysteresis.o \ - $(RRC_RRM_ASN1_DIR)/IdleModeMobilityControlInfo.o \ - $(RRC_RRM_ASN1_DIR)/IMSI-Digit.o \ - $(RRC_RRM_ASN1_DIR)/IMSI.o \ - $(RRC_RRM_ASN1_DIR)/InitialUE-Identity.o \ - $(RRC_RRM_ASN1_DIR)/INTEGER.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqBandInfo.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqBandList.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqBlackCellList.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqCarrierFreqInfo.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqCarrierFreqList.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqNeighCellInfo.o \ - $(RRC_RRM_ASN1_DIR)/InterFreqNeighCellList.o \ - $(RRC_RRM_ASN1_DIR)/InterRAT-BandInfo.o \ - $(RRC_RRM_ASN1_DIR)/InterRAT-BandList.o \ - $(RRC_RRM_ASN1_DIR)/IntraFreqBlackCellList.o \ - $(RRC_RRM_ASN1_DIR)/IntraFreqNeighCellInfo.o \ - $(RRC_RRM_ASN1_DIR)/IntraFreqNeighCellList.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersCDMA2000-1XRTT.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersCDMA2000-HRPD.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersGERAN.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersUTRA-TDD128.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersUTRA-TDD384.o \ - $(RRC_RRM_ASN1_DIR)/IRAT-ParametersUTRA-TDD768.o \ - $(RRC_RRM_ASN1_DIR)/LogicalChannelConfig.o \ - $(RRC_RRM_ASN1_DIR)/MAC-MainConfig.o \ - $(RRC_RRM_ASN1_DIR)/MasterInformationBlock.o \ - $(RRC_RRM_ASN1_DIR)/MBSFN-SubframeConfigList.o \ - $(RRC_RRM_ASN1_DIR)/MBSFN-SubframeConfig.o \ - $(RRC_RRM_ASN1_DIR)/MCC-MNC-Digit.o \ - $(RRC_RRM_ASN1_DIR)/MCC.o \ - $(RRC_RRM_ASN1_DIR)/MeasConfig.o \ - $(RRC_RRM_ASN1_DIR)/MeasGapConfig.o \ - $(RRC_RRM_ASN1_DIR)/MeasId.o \ - $(RRC_RRM_ASN1_DIR)/MeasIdToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/MeasIdToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/MeasIdToRemoveList.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectGERAN.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectId.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectToRemoveList.o \ - $(RRC_RRM_ASN1_DIR)/MeasObjectUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasParameters.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultGERAN.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultListEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultListGERAN.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultListUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultsCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/MeasResults.o \ - $(RRC_RRM_ASN1_DIR)/MeasResultUTRA.o \ - $(RRC_RRM_ASN1_DIR)/MeasurementReport.o \ - $(RRC_RRM_ASN1_DIR)/MeasurementReport-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/MMEC.o \ - $(RRC_RRM_ASN1_DIR)/MNC.o \ - $(RRC_RRM_ASN1_DIR)/MobilityControlInfo.o \ - $(RRC_RRM_ASN1_DIR)/MobilityFromEUTRACommand.o \ - $(RRC_RRM_ASN1_DIR)/MobilityFromEUTRACommand-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/MobilityParametersCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/MobilityStateParameters.o \ - $(RRC_RRM_ASN1_DIR)/N1-PUCCH-AN-PersistentList.o \ - $(RRC_RRM_ASN1_DIR)/NativeEnumerated.o \ - $(RRC_RRM_ASN1_DIR)/NativeInteger.o \ - $(RRC_RRM_ASN1_DIR)/NeighCellCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/NeighCellConfig.o \ - $(RRC_RRM_ASN1_DIR)/NeighCellListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/NeighCellsPerBandclassCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/NeighCellsPerBandclassListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/NextHopChainingCount.o \ - $(RRC_RRM_ASN1_DIR)/NULL.o \ - $(RRC_RRM_ASN1_DIR)/OCTET_STRING.o \ - $(RRC_RRM_ASN1_DIR)/Paging.o \ - $(RRC_RRM_ASN1_DIR)/PagingRecordList.o \ - $(RRC_RRM_ASN1_DIR)/PagingRecord.o \ - $(RRC_RRM_ASN1_DIR)/PagingUE-Identity.o \ - $(RRC_RRM_ASN1_DIR)/PCCH-Config.o \ - $(RRC_RRM_ASN1_DIR)/PCCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/PCCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/PDCP-Config.o \ - $(RRC_RRM_ASN1_DIR)/PDCP-Parameters.o \ - $(RRC_RRM_ASN1_DIR)/PDSCH-ConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/PDSCH-ConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/per_decoder.o \ - $(RRC_RRM_ASN1_DIR)/per_encoder.o \ - $(RRC_RRM_ASN1_DIR)/per_opentype.o \ - $(RRC_RRM_ASN1_DIR)/per_support.o \ - $(RRC_RRM_ASN1_DIR)/PHICH-Config.o \ - $(RRC_RRM_ASN1_DIR)/PhyLayerParameters.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdGERAN.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdListCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellId.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdRange.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/PhysCellIdUTRA-TDD.o \ - $(RRC_RRM_ASN1_DIR)/PhysicalConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/PLMN-IdentityInfo.o \ - $(RRC_RRM_ASN1_DIR)/PLMN-IdentityList2.o \ - $(RRC_RRM_ASN1_DIR)/PLMN-IdentityList.o \ - $(RRC_RRM_ASN1_DIR)/PLMN-Identity.o \ - $(RRC_RRM_ASN1_DIR)/P-Max.o \ - $(RRC_RRM_ASN1_DIR)/PollByte.o \ - $(RRC_RRM_ASN1_DIR)/PollPDU.o \ - $(RRC_RRM_ASN1_DIR)/PRACH-ConfigInfo.o \ - $(RRC_RRM_ASN1_DIR)/PRACH-Config.o \ - $(RRC_RRM_ASN1_DIR)/PRACH-ConfigSIB.o \ - $(RRC_RRM_ASN1_DIR)/PreRegistrationInfoHRPD.o \ - $(RRC_RRM_ASN1_DIR)/PreRegistrationZoneIdHRPD.o \ - $(RRC_RRM_ASN1_DIR)/PresenceAntennaPort1.o \ - $(RRC_RRM_ASN1_DIR)/PUCCH-ConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/PUCCH-ConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/PUSCH-ConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/PUSCH-ConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/Q-OffsetRangeInterRAT.o \ - $(RRC_RRM_ASN1_DIR)/Q-OffsetRange.o \ - $(RRC_RRM_ASN1_DIR)/Q-RxLevMin.o \ - $(RRC_RRM_ASN1_DIR)/QuantityConfigCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/QuantityConfigEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/QuantityConfigGERAN.o \ - $(RRC_RRM_ASN1_DIR)/QuantityConfig.o \ - $(RRC_RRM_ASN1_DIR)/QuantityConfigUTRA.o \ - $(RRC_RRM_ASN1_DIR)/RACH-ConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/RACH-ConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/RadioResourceConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/RadioResourceConfigCommonSIB.o \ - $(RRC_RRM_ASN1_DIR)/RadioResourceConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/RAND-CDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/RAT-Type.o \ - $(RRC_RRM_ASN1_DIR)/RedirectedCarrierInfo.o \ - $(RRC_RRM_ASN1_DIR)/ReestablishmentCause.o \ - $(RRC_RRM_ASN1_DIR)/ReestabUE-Identity.o \ - $(RRC_RRM_ASN1_DIR)/RegisteredMME.o \ - $(RRC_RRM_ASN1_DIR)/ReleaseCause.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigId.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigInterRAT.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/ReportConfigToRemoveList.o \ - $(RRC_RRM_ASN1_DIR)/ReportInterval.o \ - $(RRC_RRM_ASN1_DIR)/ReselectionThreshold.o \ - $(RRC_RRM_ASN1_DIR)/RF-Parameters.o \ - $(RRC_RRM_ASN1_DIR)/RLC-Config.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReconfigurationComplete.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReconfigurationComplete-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReconfiguration.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReconfiguration-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentComplete.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentComplete-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishment.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishment-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentReject.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentReject-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReestablishmentRequest-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReject.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionReject-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionRelease.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionRelease-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionRequest-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionSetupComplete.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionSetupComplete-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionSetup.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionSetup-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/RRC-TransactionIdentifier.o \ - $(RRC_RRM_ASN1_DIR)/RSRP-Range.o \ - $(RRC_RRM_ASN1_DIR)/RSRQ-Range.o \ - $(RRC_RRM_ASN1_DIR)/SchedulingInfoList.o \ - $(RRC_RRM_ASN1_DIR)/SchedulingInfo.o \ - $(RRC_RRM_ASN1_DIR)/SchedulingRequestConfig.o \ - $(RRC_RRM_ASN1_DIR)/SecondaryPreRegistrationZoneIdListHRPD.o \ - $(RRC_RRM_ASN1_DIR)/SecurityAlgorithmConfig.o \ - $(RRC_RRM_ASN1_DIR)/SecurityConfigHO.o \ - $(RRC_RRM_ASN1_DIR)/SecurityConfigSMC.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeCommand.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeCommand-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeComplete.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeComplete-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeFailure.o \ - $(RRC_RRM_ASN1_DIR)/SecurityModeFailure-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/ShortMAC-I.o \ - $(RRC_RRM_ASN1_DIR)/SIB-MappingInfo.o \ - $(RRC_RRM_ASN1_DIR)/SIB-Type.o \ - $(RRC_RRM_ASN1_DIR)/SI-OrPSI-GERAN.o \ - $(RRC_RRM_ASN1_DIR)/SN-FieldLength.o \ - $(RRC_RRM_ASN1_DIR)/SoundingRS-UL-ConfigCommon.o \ - $(RRC_RRM_ASN1_DIR)/SoundingRS-UL-ConfigDedicated.o \ - $(RRC_RRM_ASN1_DIR)/SpeedStateScaleFactors.o \ - $(RRC_RRM_ASN1_DIR)/SPS-ConfigDL.o \ - $(RRC_RRM_ASN1_DIR)/SPS-Config.o \ - $(RRC_RRM_ASN1_DIR)/SPS-ConfigUL.o \ - $(RRC_RRM_ASN1_DIR)/SRB-ToAddModList.o \ - $(RRC_RRM_ASN1_DIR)/SRB-ToAddMod.o \ - $(RRC_RRM_ASN1_DIR)/S-TMSI.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandGERAN.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandList1XRTT.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListGERAN.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListHRPD.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListUTRA-TDD128.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListUTRA-TDD384.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandListUTRA-TDD768.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandUTRA-FDD.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandUTRA-TDD128.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandUTRA-TDD384.o \ - $(RRC_RRM_ASN1_DIR)/SupportedBandUTRA-TDD768.o \ - $(RRC_RRM_ASN1_DIR)/SystemInfoListGERAN.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType10.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType11.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType1.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType2.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType3.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType4.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType5.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType6.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType7.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType8.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformationBlockType9.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformation.o \ - $(RRC_RRM_ASN1_DIR)/SystemInformation-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/SystemTimeInfoCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/TDD-Config.o \ - $(RRC_RRM_ASN1_DIR)/ThresholdCDMA2000.o \ - $(RRC_RRM_ASN1_DIR)/ThresholdEUTRA.o \ - $(RRC_RRM_ASN1_DIR)/ThresholdGERAN.o \ - $(RRC_RRM_ASN1_DIR)/ThresholdUTRA.o \ - $(RRC_RRM_ASN1_DIR)/TimeAlignmentTimer.o \ - $(RRC_RRM_ASN1_DIR)/TimeToTrigger.o \ - $(RRC_RRM_ASN1_DIR)/TPC-Index.o \ - $(RRC_RRM_ASN1_DIR)/TPC-PDCCH-Config.o \ - $(RRC_RRM_ASN1_DIR)/T-PollRetransmit.o \ - $(RRC_RRM_ASN1_DIR)/TrackingAreaCode.o \ - $(RRC_RRM_ASN1_DIR)/T-Reordering.o \ - $(RRC_RRM_ASN1_DIR)/T-Reselection.o \ - $(RRC_RRM_ASN1_DIR)/T-StatusProhibit.o \ - $(RRC_RRM_ASN1_DIR)/UECapabilityEnquiry.o \ - $(RRC_RRM_ASN1_DIR)/UECapabilityEnquiry-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/UECapabilityInformation.o \ - $(RRC_RRM_ASN1_DIR)/UECapabilityInformation-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/UE-CapabilityRAT-ContainerList.o \ - $(RRC_RRM_ASN1_DIR)/UE-CapabilityRAT-Container.o \ - $(RRC_RRM_ASN1_DIR)/UE-CapabilityRequest.o \ - $(RRC_RRM_ASN1_DIR)/UE-EUTRA-Capability.o \ - $(RRC_RRM_ASN1_DIR)/UE-TimersAndConstants.o \ - $(RRC_RRM_ASN1_DIR)/UL-AM-RLC.o \ - $(RRC_RRM_ASN1_DIR)/UL-CCCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/UL-CCCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/UL-CyclicPrefixLength.o \ - $(RRC_RRM_ASN1_DIR)/UL-DCCH-Message.o \ - $(RRC_RRM_ASN1_DIR)/UL-DCCH-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/ULHandoverPreparationTransfer.o \ - $(RRC_RRM_ASN1_DIR)/ULHandoverPreparationTransfer-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/ULInformationTransfer.o \ - $(RRC_RRM_ASN1_DIR)/ULInformationTransfer-r8-IEs.o \ - $(RRC_RRM_ASN1_DIR)/UL-ReferenceSignalsPUSCH.o \ - $(RRC_RRM_ASN1_DIR)/UL-UM-RLC.o \ - $(RRC_RRM_ASN1_DIR)/UplinkPowerControlCommon.o \ - $(RRC_RRM_ASN1_DIR)/UplinkPowerControlDedicated.o \ - $(RRC_RRM_ASN1_DIR)/xer_decoder.o \ - $(RRC_RRM_ASN1_DIR)/xer_encoder.o \ - $(RRC_RRM_ASN1_DIR)/xer_support.o \ - $(RRC_RRM_ASN1_DIR)/E-NodeB-Identity.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-Application-TrafficClass.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-Application-ms-PacketDelay.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-ApplicationKBitRate.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-C-RNTI.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-RRM-Response-Status.o \ - $(RRC_RRM_ASN1_DIR)/OpenAir-RRM-Response-Reason.o \ - $(RRC_RRM_ASN1_DIR)/TransactionId.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddDataRadioBearerConfirm.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddDataRadioBearerRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddDataRadioBearerResponse.o \ - $(RRC_RRM_ASN1_DIR)/RRCRemoveDataRadioBearerConfirm.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddUserConfirm.o \ - $(RRC_RRM_ASN1_DIR)/RRCRemoveDataRadioBearerRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddUserRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCRemoveDataRadioBearerResponse.o \ - $(RRC_RRM_ASN1_DIR)/RRCAddUserResponse.o \ - $(RRC_RRM_ASN1_DIR)/RRCRemoveUserRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCRemoveUserResponse.o \ - $(RRC_RRM_ASN1_DIR)/RRCConnectionRelease.o \ - $(RRC_RRM_ASN1_DIR)/RRCUserReconfiguration.o \ - $(RRC_RRM_ASN1_DIR)/RRCUserReconfigurationComplete.o \ - $(RRC_RRM_ASN1_DIR)/RRM-RRC-Message.o \ - $(RRC_RRM_ASN1_DIR)/RRM-RRC-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/RRC-RRM-Message.o \ - $(RRC_RRM_ASN1_DIR)/RRC-RRM-MessageType.o \ - $(RRC_RRM_ASN1_DIR)/RRCSystemConfigurationRequest.o \ - $(RRC_RRM_ASN1_DIR)/RRCSystemConfigurationResponse.o - - - -SQLITE_OBJS= $(SQL_DIR)/sqlite3.o - - -# Sockets -SOCKETS_OBJS = \ - $(SOCKETS_DIR)/Ajp13Socket.o \ - $(SOCKETS_DIR)/AjpBaseSocket.o \ - $(SOCKETS_DIR)/Base64.o \ - $(SOCKETS_DIR)/Debug.o \ - $(SOCKETS_DIR)/Event.o \ - $(SOCKETS_DIR)/EventHandler.o \ - $(SOCKETS_DIR)/EventTime.o \ - $(SOCKETS_DIR)/Exception.o \ - $(SOCKETS_DIR)/File.o \ - $(SOCKETS_DIR)/FileStream.o \ - $(SOCKETS_DIR)/HTTPSocket.o \ - $(SOCKETS_DIR)/HttpBaseSocket.o \ - $(SOCKETS_DIR)/HttpClientSocket.o \ - $(SOCKETS_DIR)/HttpDebugSocket.o \ - $(SOCKETS_DIR)/HttpGetSocket.o \ - $(SOCKETS_DIR)/HttpPostSocket.o \ - $(SOCKETS_DIR)/HttpPutSocket.o \ - $(SOCKETS_DIR)/HttpRequest.o \ - $(SOCKETS_DIR)/HttpResponse.o \ - $(SOCKETS_DIR)/HttpTransaction.o \ - $(SOCKETS_DIR)/HttpdCookies.o \ - $(SOCKETS_DIR)/HttpdForm.o \ - $(SOCKETS_DIR)/HttpdSocket.o \ - $(SOCKETS_DIR)/IEventOwner.o \ - $(SOCKETS_DIR)/Ipv4Address.o \ - $(SOCKETS_DIR)/Ipv6Address.o \ - $(SOCKETS_DIR)/Json.o \ - $(SOCKETS_DIR)/Lock.o \ - $(SOCKETS_DIR)/MemFile.o \ - $(SOCKETS_DIR)/Mutex.o \ - $(SOCKETS_DIR)/Parse.o \ - $(SOCKETS_DIR)/ResolvServer.o \ - $(SOCKETS_DIR)/ResolvSocket.o \ - $(SOCKETS_DIR)/SSLInitializer.o \ - $(SOCKETS_DIR)/SctpSocket.o \ - $(SOCKETS_DIR)/Semaphore.o \ - $(SOCKETS_DIR)/SmtpdSocket.o \ - $(SOCKETS_DIR)/Socket.o \ - $(SOCKETS_DIR)/SocketHandler.o \ - $(SOCKETS_DIR)/SocketHandlerEp.o \ - $(SOCKETS_DIR)/SocketHandlerThread.o \ - $(SOCKETS_DIR)/SocketStream.o \ - $(SOCKETS_DIR)/SocketThread.o \ - $(SOCKETS_DIR)/StdoutLog.o \ - $(SOCKETS_DIR)/StreamSocket.o \ - $(SOCKETS_DIR)/StreamWriter.o \ - $(SOCKETS_DIR)/TcpSocket.o \ - $(SOCKETS_DIR)/Thread.o \ - $(SOCKETS_DIR)/UdpSocket.o \ - $(SOCKETS_DIR)/Utility.o \ - $(SOCKETS_DIR)/XmlDocument.o \ - $(SOCKETS_DIR)/XmlNode.o \ - $(SOCKETS_DIR)/XmlException.o - - -# RRM -RRM_OBJS = \ - $(SRC_DIR)/rrm.o \ - $(COM_DIR)/Message.o \ - $(COM_DIR)/rrc/RRCMessageHandler.o \ - $(COM_DIR)/rrc/RRC2RRMMessageConnectionRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageConnectionResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddUserRequest.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddUserConfirm.o \ - $(COM_DIR)/rrc/RRM2RRCMessageAddUserResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageRemoveUserRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageRemoveUserResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.o \ - $(COM_DIR)/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.o \ - $(COM_DIR)/rrc/RRM2RRCMessageUserReconfiguration.o \ - $(COM_DIR)/rrc/RRC2RRMMessageUserReconfigurationComplete.o \ - $(COM_DIR)/rrc/RRCUdpSocket.o \ - $(TCPIP_DIR)/storage.o \ - $(RADIO_RESOURCES_DIR)/Asn1Utils.o \ - $(RADIO_RESOURCES_DIR)/ENodeB.o \ - $(RADIO_RESOURCES_DIR)/Mobile.o \ - $(RADIO_RESOURCES_DIR)/RadioBearer.o \ - $(RADIO_RESOURCES_DIR)/DataRadioBearer.o \ - $(RADIO_RESOURCES_DIR)/SignallingRadioBearer.o \ - $(RADIO_RESOURCES_DIR)/LogicalChannel.o \ - $(RADIO_RESOURCES_DIR)/Command.o \ - $(RADIO_RESOURCES_DIR)/RadioResources.o \ - $(RADIO_RESOURCES_DIR)/Transaction.o \ - $(RADIO_RESOURCES_DIR)/Transactions.o - - -# RRM -TEST_OBJS = \ - $(SRC_DIR)/test/test.o \ - $(SRC_DIR)/test/TestScenario.o \ - $(COM_DIR)/Message.o \ - $(COM_DIR)/rrm/RRMMessageHandler.o \ - $(COM_DIR)/rrc/RRCMessageHandler.o \ - $(COM_DIR)/rrc/RRC2RRMMessageConnectionRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageConnectionResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddUserRequest.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddUserConfirm.o \ - $(COM_DIR)/rrc/RRM2RRCMessageAddUserResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageRemoveUserRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageRemoveUserResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.o \ - $(COM_DIR)/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.o \ - $(COM_DIR)/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.o \ - $(COM_DIR)/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.o \ - $(COM_DIR)/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.o \ - $(COM_DIR)/rrc/RRM2RRCMessageUserReconfiguration.o \ - $(COM_DIR)/rrc/RRC2RRMMessageUserReconfigurationComplete.o \ - $(COM_DIR)/rrc/RRCUdpSocket.o \ - $(COM_DIR)/rrm/RRMUdpSocket.o \ - $(TCPIP_DIR)/storage.o \ - $(RADIO_RESOURCES_DIR)/Asn1Utils.o \ - $(RADIO_RESOURCES_DIR)/ENodeB.o \ - $(RADIO_RESOURCES_DIR)/Mobile.o \ - $(RADIO_RESOURCES_DIR)/RadioBearer.o \ - $(RADIO_RESOURCES_DIR)/LogicalChannel.o \ - $(RADIO_RESOURCES_DIR)/Transaction.o \ - $(RADIO_RESOURCES_DIR)/Transactions.o \ - $(RADIO_RESOURCES_DIR)/Command.o \ - $(RADIO_RESOURCES_DIR)/RadioResources.o - diff --git a/openair2/RRM_4_RRC_LITE/NEWS b/openair2/RRM_4_RRC_LITE/NEWS deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/openair2/RRM_4_RRC_LITE/README b/openair2/RRM_4_RRC_LITE/README deleted file mode 100755 index 547fc8d031..0000000000 --- a/openair2/RRM_4_RRC_LITE/README +++ /dev/null @@ -1,15 +0,0 @@ -################################### -To compile rrm -################################### -cd in this directory -make libs -make rrm_exe -rrm executable is in ./bin -################################### -To compile dummy_rrc -################################### -cd in this directory -make libs -make test_exe -dummy_rrc executable is in ./bin - diff --git a/openair2/RRM_4_RRC_LITE/configure.ac b/openair2/RRM_4_RRC_LITE/configure.ac deleted file mode 100755 index 5cd70d3610..0000000000 --- a/openair2/RRM_4_RRC_LITE/configure.ac +++ /dev/null @@ -1,147 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(Radio Resource Manager, 0.1.0) -AC_CONFIG_SRCDIR(src/rrm.cpp) -AC_CANONICAL_SYSTEM - -dnl create an config-header -AC_CONFIG_HEADER(src/config.h) - -dnl enable automake-support -AM_INIT_AUTOMAKE([gnu dist-zip tar-ustar dist-bzip2]) - - - -AC_DEFINE([OUTPUT_ACCURACY], [2], [defines the number of digits after the comma in output]) - - -dnl Checks for programs. -AC_PROG_CC -AC_PROG_CPP -AC_PROG_CXX -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_MAKE_SET - -dnl enable libtool-support -dnl gives a deprecated warning for RANLIB with newer libtools -AC_PROG_RANLIB -AM_PROG_LIBTOOL - - -dnl Check for enable-features that shall go into config.h - - -dnl ... for xerces 3.0 -PKG_CHECK_MODULES([XERCES], [xerces-c >= 3.0], - [AC_DEFINE([XERCES3_SIZE_t],[XMLSize_t],[Define length for Xerces 3.])], - [AC_DEFINE([XERCES3_SIZE_t],[unsigned int],[Define length for Xerces 2.])]) - - - -AM_CONDITIONAL([WITH_VERSION_H], test -f .svn/entries) -if test -f .svn/entries; then - AC_DEFINE([HAVE_VERSION_H], [1], [Define if auto-generated version.h should be used.]) -else - AC_DEFINE_UNQUOTED(VERSION_STRING, "$PACKAGE_VERSION", [Defined if auto-generated version.h is unavailable.]) -fi - -dnl --------------------------------------------- -dnl check for libraries... -dnl - - - - - - - - - - - - - - - - - - - - - - - - -dnl ... for xerces -AC_ARG_WITH([xerces], [AS_HELP_STRING([--with-xerces=DIR],[where Xerces-C is installed (libraries in DIR/lib, headers in DIR/include).])]) -if test x"$with_xerces" != x; then - if test x"$with_xerces_libraries" = x; then - with_xerces_libraries=$with_xerces/lib - fi - if test x"$with_xerces_includes" = x; then - with_xerces_includes=$with_xerces/include - fi -fi - -dnl ... for libs -LIB_XERCES="xerces-c" -AC_ARG_WITH([xerces-libraries], [AS_HELP_STRING([--with-xerces-libraries=DIR],[where the Xerces-C library is installed.])]) -if test x"$with_xerces_libraries" = x; then - AC_CHECK_LIB([$LIB_XERCES], [main], [true], - [AC_MSG_ERROR([xerces-lib not found. Specify path with option --with-xerces-libraries=DIR.])]) -else - save_ldflags=$LDFLAGS - LDFLAGS="-L$with_xerces_libraries" - export LDFLAGS - AC_CHECK_LIB([$LIB_XERCES], [main], [XERCES_LDFLAGS=$LDFLAGS], - [AC_MSG_ERROR([xerces-lib not found in "$with_xerces_libraries".])]) - LDFLAGS=$save_ldflags - AC_SUBST(XERCES_LDFLAGS) -fi -AC_SUBST(LIB_XERCES) - - -dnl ... for includes -AC_ARG_WITH([xerces-includes], [AS_HELP_STRING([--with-xerces-includes=DIR],[where the Xerces-C includes are.])]) -save_cppflags=$CPPFLAGS -if test x"$with_xerces_includes" = x; then - CPPFLAGS="$CPPFLAGS -I/usr/local/include -I/usr/include" - export CPPFLAGS - AC_CHECK_HEADER([xercesc/util/XercesVersion.hpp], [AM_CPPFLAGS="$CPPFLAGS $AM_CPPFLAGS"], - [AC_MSG_ERROR([xerces-includes not found. Specify path with option --with-xerces-includes=DIR.])]) -else - CPPFLAGS="-I$with_xerces_includes" - export CPPFLAGS - AC_CHECK_HEADER([xercesc/util/XercesVersion.hpp], [AM_CPPFLAGS="$CPPFLAGS $AM_CPPFLAGS"], - [AC_MSG_ERROR([xerces-includes not found in "$with_xerces_includes".])]) -fi -CPPFLAGS=$save_cppflags - - - - -AM_CPPFLAGS="-I$PWD/$srcdir/src $AM_CPPFLAGS" -AC_SUBST(AM_CPPFLAGS) -AC_SUBST(AM_CXXFLAGS) - - -dnl --------------------------------------------- -dnl Checks proposed by autoscan. -dnl Checks for header files. -AC_FUNC_ALLOCA -AC_HEADER_STDC -AC_CHECK_HEADERS([float.h limits.h malloc.h math.h stddef.h stdlib.h string.h sys/time.h unistd.h wchar.h]) - -dnl Checks for typedefs, structures, and compiler characteristics. -AC_HEADER_STDBOOL -AC_C_CONST -AC_C_INLINE -AC_TYPE_SIZE_T -AC_HEADER_TIME -AC_STRUCT_TM -AC_C_VOLATILE - -dnl Checks for library functions. -AC_FUNC_ERROR_AT_LINE -AC_FUNC_MALLOC -AC_FUNC_SELECT_ARGTYPES -AC_TYPE_SIGNAL -AC_FUNC_STAT -AC_CHECK_FUNCS([floor getcwd gettimeofday memset pow select socket sqrt]) - - -dnl --------------------------------------------- -dnl add here all your Makefiles. These will be created by configure -AC_CONFIG_FILES([ -src/Makefile -src/com/Makefile -src/foreign/Makefile -src/foreign/sockets-2.3.9.4/Makefile -src/foreign/sql/Makefile -src/foreign/tcpip/Makefile -src/utils/Makefile -src/utils/options/Makefile -Makefile]) -AC_OUTPUT - -dnl --------------------------------------------- -dnl Summary - -AC_MSG_RESULT() diff --git a/openair2/RRM_4_RRC_LITE/src/COPYING b/openair2/RRM_4_RRC_LITE/src/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/RRM_4_RRC_LITE/src/com/Message.cpp b/openair2/RRM_4_RRC_LITE/src/com/Message.cpp deleted file mode 100755 index 922afea509..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/Message.cpp +++ /dev/null @@ -1,641 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -//----------------------------------------------------------------- -#include "Message.h" -#include "RRC-RRM-Message.h" -#include "RRM-RRC-Message.h" -#include "Utility.h" -#include "RRC2RRMMessageConnectionRequest.h" -#include "RRC2RRMMessageAddUserRequest.h" -#include "RRC2RRMMessageAddUserConfirm.h" -#include "RRC2RRMMessageAddRadioAccessBearerRequest.h" -#include "RRC2RRMMessageRemoveRadioAccessBearerRequest.h" -#include "RRC2RRMMessageRemoveUserRequest.h" -#include "RRC2RRMMessageAddRadioAccessBearerConfirm.h" -#include "RRM2RRCMessageConnectionResponse.h" -#include "RRM2RRCMessageAddUserResponse.h" -#include "RRM2RRCMessageAddRadioAccessBearerResponse.h" -#include "RRM2RRCMessageRemoveRadioAccessBearerResponse.h" -#include "RRM2RRCMessageRemoveUserResponse.h" -#include "RRM2RRCMessageUserReconfiguration.h" -#include "RRC2RRMMessageUserReconfigurationComplete.h" -#include "storage.h" -uint8_t Message::s_buffer[MESSAGE_DESERIALIZE_BUFFER_SIZE]; - -//----------------------------------------------------------------- -#define TRACE_RRM_MESSAGES -#define LOOP_TEST -//----------------------------------------------------------------- -using namespace std; -using namespace tcpip; -//----------------------------------------------------------------- -Message::Message() -//----------------------------------------------------------------- -{ - m_message_buffer = NULL; - m_ip_char_src = new char(INET6_ADDRSTRLEN); -} -//----------------------------------------------------------------- -Message::Message(tcpip::Storage& in_messageP): m_message_storage(in_messageP) -//----------------------------------------------------------------- -{ - m_message_buffer = NULL; - m_ip_char_src = new char(INET6_ADDRSTRLEN); -} -//----------------------------------------------------------------- -Message* Message::DeserializeRRCMessage(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//----------------------------------------------------------------- -{ - Message* message = NULL; - asn_dec_rval_t rval; - asn_codec_ctx_t *opt_codec_ctx = 0; - RRC_RRM_Message_t *asn1_message = 0; -#ifdef LOOP_TEST - for (int i=0; i<10000; i++) { - message = NULL; - opt_codec_ctx = 0; - asn1_message = 0; - - rval = uper_decode(opt_codec_ctx, - &asn_DEF_RRC_RRM_Message,/* Type to decode */ - (void **)&asn1_message, /* Pointer to a target structure's pointer */ - in_bufferP, /* Data to be decoded */ - size_dataP, /* Size of data buffer */ - 0, /* Number of unused leading bits, 0..7 */ - 0); /* Number of unused tailing bits, 0..7 */ - ASN_STRUCT_FREE(asn_DEF_RRC_RRM_Message, asn1_message); - } - cout << "Message::DeserializeRRCMessage(): LOOP TEST END" << endl; - opt_codec_ctx = 0; - asn1_message = 0; -#endif - - rval = uper_decode(opt_codec_ctx, - &asn_DEF_RRC_RRM_Message,/* Type to decode */ - (void **)&asn1_message, /* Pointer to a target structure's pointer */ - in_bufferP, /* Data to be decoded */ - size_dataP, /* Size of data buffer */ - 0, /* Number of unused leading bits, 0..7 */ - 0); /* Number of unused tailing bits, 0..7 */ - - xer_fprint(stdout, &asn_DEF_RRC_RRM_Message, (void*)asn1_message); - if (rval.code != RC_OK) { - cerr << " DeserializeRRCMessage ERROR IN ASN1 DECODING" << endl; - return NULL; - } - if (asn1_message->message.present == RRC_RRM_MessageType_PR_c1) { - switch (asn1_message->message.choice.c1.present) { - //------------------------------- - case RRC_RRM_MessageType__c1_PR_NOTHING: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_NOTHING" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcSystemConfigurationRequest: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_SYSTEM_CONFIGURATION_REQUEST" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageConnectionRequest(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcAddUserRequest: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_USER_REQUEST" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageAddUserRequest(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcAddUserConfirm: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_USER_CONFIRM" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageAddUserConfirm(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcUserReconfigurationComplete: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_USER_RECONFIGURATION_COMPLETE" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageUserReconfigurationComplete(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcAddDataRadioBearerRequest: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_DATA_RADIO_BEARER_REQUEST" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcAddDataRadioBearerConfirm: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_DATA_RADIO_BEARER_CONFIRM" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcRemoveUserRequest: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_REMOVE_USER_REQUEST" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcRemoveDataRadioBearerRequest: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_REMOVE_DATA_RADIO_BEARER_REQUEST" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRC_RRM_MessageType__c1_PR_rrcRemoveDataRadioBearerConfirm: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_REMOVE_DATA_RADIO_BEARER_CONFIRM" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - } - } else { - cerr << " DeserializeRRMMessage ERROR IN message.present field" << endl; - return NULL; - } - return message; -} -//----------------------------------------------------------------- -Message* Message::DeserializeRRMMessage(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//----------------------------------------------------------------- -{ - Message* message = NULL; - asn_dec_rval_t rval; - asn_codec_ctx_t *opt_codec_ctx = 0; - RRM_RRC_Message_t *asn1_message = 0; -#ifdef LOOP_TEST - for (int i=0; i<10000; i++) { - message = NULL; - opt_codec_ctx = 0; - asn1_message = 0; - - rval = uper_decode(opt_codec_ctx, - &asn_DEF_RRM_RRC_Message,/* Type to decode */ - (void **)&asn1_message, /* Pointer to a target structure's pointer */ - in_bufferP, /* Data to be decoded */ - size_dataP, /* Size of data buffer */ - 0, /* Number of unused leading bits, 0..7 */ - 0); /* Number of unused tailing bits, 0..7 */ - ASN_STRUCT_FREE(asn_DEF_RRM_RRC_Message, asn1_message); - } - cout << "Message::DeserializeRRMMessage(): LOOP TEST END" << endl; - opt_codec_ctx = 0; - asn1_message = 0; -#endif - rval = uper_decode(opt_codec_ctx, - &asn_DEF_RRM_RRC_Message,/* Type to decode */ - (void **)&asn1_message, /* Pointer to a target structure's pointer */ - in_bufferP, /* Data to be decoded */ - size_dataP, /* Size of data buffer */ - 0, /* Number of unused leading bits, 0..7 */ - 0); /* Number of unused tailing bits, 0..7 */ - - xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)asn1_message); - if (rval.code != RC_OK) { - cerr << " DeserializeRRMMessage ERROR IN ASN1 DECODING" << endl; - return NULL; - } - if (asn1_message->message.present == RRM_RRC_MessageType_PR_c1) { - switch (asn1_message->message.choice.c1.present) { - //------------------------------- - case RRM_RRC_MessageType__c1_PR_NOTHING: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_NOTHING" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcSystemConfigurationResponse: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_SYSTEM_CONFIGURATION_RESPONSE" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageConnectionResponse(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcAddUserResponse: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_USER_RESPONSE" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageAddUserResponse(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcUserReconfiguration: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_USER_RECONFIGURATION" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageUserReconfiguration(sa_fromP, sa_lenP, asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcAddDataRadioBearerResponse: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_ADD_DATA_RADIO_BEARER_RESPONSE" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionResponse(asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcRemoveUserResponse: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_REMOVE_USER_RESPONSE" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionResponse(asn1_message); - break; - //------------------------------- - case RRM_RRC_MessageType__c1_PR_rrcRemoveDataRadioBearerResponse: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize(): MESSAGE_REMOVE_DATA_RADIO_BEARER_RESPONSE" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionResponse(asn1_message); - break; - - } - } else { - cerr << " DeserializeRRMMessage ERROR IN message.present field" << endl; - return NULL; - } - return message; -} -//----------------------------------------------------------------- -Message* Message::Deserialize(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//----------------------------------------------------------------- -{ - - msg_type_t msg_type; - msg_length_t msg_length; - frame_t msg_frame; - - Storage in_message(const_cast(reinterpret_cast(in_bufferP)), size_dataP); - msg_type = in_message.readChar(); - msg_length = in_message.readShort(); - //msg_frame = in_message.readInt(); - assert(msg_length == size_dataP); - - msg_length = msg_length - 1 - 2; - - Message* message = NULL; - switch (msg_type) { - //------------------------------- - case MESSAGE_CONNECTION_REQUEST: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_CONNECTION_REQUEST" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageConnectionRequest(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_CONNECTION_RESPONSE: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_CONNECTION_RESPONSE" << endl; - cout << dec; - #endif - //message = new RRM2RRCMessageConnectionResponse(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_USER_REQUEST: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_USER_REQUEST" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageAddUserRequest(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_USER_CONFIRM: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_USER_CONFIRM" << endl; - cout << dec; - #endif - //message = new RRC2RRMMessageAddUserConfirm(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_USER_RESPONSE: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_USER_RESPONSE" << endl; - cout << dec; - #endif - //message = new RRM2RRCMessageAddUserResponse(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_RADIO_ACCESS_BEARER_REQUEST: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_RADIO_ACCESS_BEARER_REQUEST" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageAddRadioAccessBearerRequest(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_RADIO_ACCESS_BEARER_CONFIRM: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_RADIO_ACCESS_BEARER_CONFIRM" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageAddRadioAccessBearerConfirm(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_ADD_RADIO_ACCESS_BEARER_RESPONSE: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_ADD_RADIO_ACCESS_BEARER_RESPONSE" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageAddRadioAccessBearerResponse(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_REMOVE_RADIO_ACCESS_BEARER_REQUEST: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_REMOVE_RADIO_ACCESS_BEARER_REQUEST" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageRemoveRadioAccessBearerRequest(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_REMOVE_RADIO_ACCESS_BEARER_RESPONSE: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_REMOVE_RADIO_ACCESS_BEARER_RESPONSE" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageRemoveRadioAccessBearerResponse(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_REMOVE_USER_REQUEST: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_REMOVE_USER_REQUEST" << endl; - cout << dec; - #endif - message = new RRC2RRMMessageRemoveUserRequest(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - case MESSAGE_REMOVE_USER_RESPONSE: - //------------------------------- - #ifdef TRACE_RRM_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type : MESSAGE_REMOVE_USER_RESPONSE" << endl; - cout << dec; - #endif - message = new RRM2RRCMessageRemoveUserResponse(in_message, msg_length, msg_frame, sa_fromP, sa_lenP); - break; - - //------------------------------- - default: - //------------------------------- - #ifdef TRACE_RRM_UMTS_MESSAGES - cout << hex; - cout << "Message::deserialize():" << endl; - cout << " Type NOT HANDLED : 0x" << static_cast(msg_type) << endl; - cout << dec; - #endif - ; - } - return message; -} -//----------------------------------------------------------------- -void Message::ParseIpParameters(struct sockaddr *sa_fromP,socklen_t sa_lenP) -//----------------------------------------------------------------- -{ - - if (sa_lenP == sizeof(struct sockaddr_in6)) { - m_is_ipv6 = true; - memcpy(&m_sockaddr_in6_src,sa_fromP,sa_lenP); - Utility::l2ip(m_sockaddr_in6_src.sin6_addr, m_ip_str_src,0); - //const char* result = inet_ntop(AF_INET6, &m_sockaddr_in6_src, m_ip_char_src, sa_lenP); - //cout << "inet_ntop returned" << result << endl; - m_port_src = ntohs(m_sockaddr_in6_src.sin6_port); - cout << "Message::ParseIpParameters: m_ip_str_src6 = " << m_ip_str_src << endl; - cout << "Message::ParseIpParameters: m_port_src6 = " << m_port_src << endl; - } else if (sa_lenP == sizeof(struct sockaddr_in)) { - m_is_ipv6 = false; - memcpy(&m_sockaddr_in4_src,sa_fromP,sa_lenP); - ipaddr_t a; - memcpy(&a,&m_sockaddr_in4_src.sin_addr,4); - Utility::l2ip(a,m_ip_str_src); - m_port_src = ntohs(m_sockaddr_in4_src.sin_port); - cout << "Message::ParseIpParameters: m_ip_str_src = " << m_ip_str_src << endl; - cout << "Message::ParseIpParameters: m_port_src = " << m_port_src << endl; - } -} -//---------------------------------------------------------------------------- -msg_length_t Message::GetSerializedMessageSize() -//---------------------------------------------------------------------------- -{ - return m_msg_length; -} -//---------------------------------------------------------------------------- -const char* Message::GetSerializedMessageBuffer() -//---------------------------------------------------------------------------- -{ - return const_cast(reinterpret_cast(m_message_serialize_buffer)); -} -//---------------------------------------------------------------------------- -std::string Message::StatusToString(msg_response_status_t statusP) -//---------------------------------------------------------------------------- -{ - stringstream result; - switch (statusP) { - //------------------------------- - case STATUS_CONNECTION_ACCEPTED: - //------------------------------- - result << "CONNECTION_ACCEPTED"; return result.str(); - break; - //------------------------------- - case STATUS_CONNECTION_FAILED: - //------------------------------- - result << "CONNECTION_FAILED"; return result.str(); - break; - //------------------------------- - case STATUS_ADD_USER_SUCCESSFULL: - //------------------------------- - result << "ADD_USER_SUCCESSFULL"; return result.str(); - break; - //------------------------------- - case STATUS_ADD_USER_FAILED: - //------------------------------- - result << "ADD_USER_FAILED"; return result.str(); - break; - //------------------------------- - case STATUS_REMOVE_USER_SUCCESSFULL: - //------------------------------- - result << "REMOVE_USER_SUCCESSFULL"; return result.str(); - break; - //------------------------------- - case STATUS_REMOVE_USER_FAILED: - //------------------------------- - result << "REMOVE_USER_FAILED"; return result.str(); - break; - //------------------------------- - case STATUS_ADD_RADIO_ACCESS_BEARER_SUCCESSFULL: - //------------------------------- - result << "ADD_RADIO_ACCESS_BEARER_SUCCESSFULL"; return result.str(); - break; - //------------------------------- - case STATUS_ADD_RADIO_ACCESS_BEARER_FAILED: - //------------------------------- - result << "ADD_RADIO_ACCESS_BEARER_FAILED"; return result.str(); - break; - //------------------------------- - case STATUS_REMOVE_RADIO_ACCESS_BEARER_SUCCESSFULL: - //------------------------------- - result << "REMOVE_RADIO_ACCESS_BEARER_SUCCESSFULL"; return result.str(); - break; - //------------------------------- - case STATUS_REMOVE_RADIO_ACCESS_BEARER_FAILED: - //------------------------------- - result << "REMOVE_RADIO_ACCESS_BEARER_FAILED"; return result.str(); - break; - default: - result << "UNKNOWN STATUS " << statusP; return result.str(); - } - return result.str(); -} -//---------------------------------------------------------------------------- -std::string Message::ReasonToString(msg_response_reason_t reasonP) -//---------------------------------------------------------------------------- -{ - stringstream result; - switch (reasonP) { - //------------------------------- - case MSG_RESP_OK: - //------------------------------- - result << "RESP_OK"; return result.str(); - break; - //------------------------------- - case MSG_RESP_PROTOCOL_ERROR: - //------------------------------- - result << "RESP_PROTOCOL_ERROR"; return result.str(); - break; - //------------------------------- - case MSG_RESP_RESSOURCES_UNAVAILABLE: - //------------------------------- - result << "RESP_RESSOURCES_UNAVAILABLE"; return result.str(); - break; - //------------------------------- - case MSG_RESP_UNKNOWN_MESSAGE: - //------------------------------- - result << "RESP_UNKNOWN_MESSAGE"; return result.str(); - break; - //------------------------------- - case MSG_RESP_INTERNAL_ERROR: - //------------------------------- - result << "RESP_INTERNAL_ERROR"; return result.str(); - break; - default: - result << "UNKNOWN REASON " << reasonP; return result.str(); - } - return result.str(); -} -//----------------------------------------------------------------- -Message::~Message() -//----------------------------------------------------------------- -{ - if (m_message_buffer != NULL) { - delete [] m_message_buffer; - } - if (m_ip_char_src != NULL) { - delete [] m_ip_char_src; - } - m_message_storage.reset(); -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/Message.h b/openair2/RRM_4_RRC_LITE/src/com/Message.h deleted file mode 100755 index be9ef51f69..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/Message.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef _MESSAGE_H_ -# define _MESSAGE_H_ - -# include -# include - -# include "socket_include.h" -# include "storage.h" -# include "platform.h" - -#define MESSAGE_DESERIALIZE_BUFFER_SIZE 2048 -#define MESSAGE_SERIALIZE_BUFFER_SIZE 2048 -class Message -{ -public: - - - typedef std::pair e_nodeb_internet_address_id_t; - - //============ STATUS ====================== - static const msg_response_status_t STATUS_CONNECTION_ACCEPTED = 1; - static const msg_response_status_t STATUS_CONNECTION_FAILED = -1; - static const msg_response_status_t STATUS_ADD_USER_SUCCESSFULL = 2; - static const msg_response_status_t STATUS_ADD_USER_FAILED = -2; - static const msg_response_status_t STATUS_REMOVE_USER_SUCCESSFULL = 3; - static const msg_response_status_t STATUS_REMOVE_USER_FAILED = -3; - static const msg_response_status_t STATUS_ADD_RADIO_ACCESS_BEARER_SUCCESSFULL = 4; - static const msg_response_status_t STATUS_ADD_RADIO_ACCESS_BEARER_FAILED = -4; - static const msg_response_status_t STATUS_REMOVE_RADIO_ACCESS_BEARER_SUCCESSFULL = 5; - static const msg_response_status_t STATUS_REMOVE_RADIO_ACCESS_BEARER_FAILED = -5; - //============ MESSAGES ====================== - static const msg_type_t MESSAGE_CONNECTION_REQUEST = 0; - static const msg_type_t MESSAGE_CONNECTION_RESPONSE = 1; - static const msg_type_t MESSAGE_CONNECTION_CLOSE = 2; - static const msg_type_t MESSAGE_CONNECTION_CLOSE_ACK = 3; - static const msg_type_t MESSAGE_ADD_USER_REQUEST = 4; - static const msg_type_t MESSAGE_ADD_USER_RESPONSE = 5; - static const msg_type_t MESSAGE_ADD_USER_CONFIRM = 6; - static const msg_type_t MESSAGE_REMOVE_USER_REQUEST = 7; - static const msg_type_t MESSAGE_REMOVE_USER_RESPONSE = 8; - static const msg_type_t MESSAGE_ADD_RADIO_ACCESS_BEARER_REQUEST = 9; - static const msg_type_t MESSAGE_ADD_RADIO_ACCESS_BEARER_RESPONSE = 10; - static const msg_type_t MESSAGE_ADD_RADIO_ACCESS_BEARER_CONFIRM = 11; - static const msg_type_t MESSAGE_REMOVE_RADIO_ACCESS_BEARER_REQUEST = 12; - static const msg_type_t MESSAGE_REMOVE_RADIO_ACCESS_BEARER_RESPONSE = 13; - static const msg_type_t MESSAGE_MEASUREMENT_REQUEST = 14; - static const msg_type_t MESSAGE_L1_MEASUREMENT_RG_INTERNAL_REPORT = 15; - static const msg_type_t MESSAGE_L1_MEASUREMENT_RG_QUALITY_REPORT = 16; - static const msg_type_t MESSAGE_L1_MEASUREMENT_RG_TRAFFIC_VOLUME_REPORT = 17; - static const msg_type_t MESSAGE_L1_MEASUREMENT_RG_PHYSICAL_CHANNEL_DATA_AMP_REPORT = 18; - static const msg_type_t MESSAGE_L1_MEASUREMENT_MT_INTERNAL_REPORT = 19; - static const msg_type_t MESSAGE_L1_MEASUREMENT_MT_QUALITY_REPORT = 20; - static const msg_type_t MESSAGE_L1_MEASUREMENT_MT_TRAFFIC_VOLUME_REPORT = 21; - static const msg_type_t MESSAGE_L1_MEASUREMENT_MT_INTRA_FREQUENCY_REPORT = 22; - static const msg_type_t MESSAGE_UPLINK_PHYSICAL_CHANNEL_CONTROL = 23; - static const msg_type_t MESSAGE_CONFIG_REQUEST = 24; - static const msg_type_t MESSAGE_ACK = 25; - static const msg_type_t MESSAGE_UPDATE_DSCH = 26; - //============ REASONS ====================== - static const msg_response_reason_t MSG_RESP_OK = 0; - static const msg_response_reason_t MSG_RESP_PROTOCOL_ERROR = 1; - static const msg_response_reason_t MSG_RESP_RESSOURCES_UNAVAILABLE = 2; - static const msg_response_reason_t MSG_RESP_UNKNOWN_MESSAGE = 128; - static const msg_response_reason_t MSG_RESP_INTERNAL_ERROR = 255; - - static uint8_t s_buffer[MESSAGE_DESERIALIZE_BUFFER_SIZE]; - - Message (); - Message(tcpip::Storage&); - virtual void Serialize () {}; - virtual void Forward () {}; - virtual void Serialize (char *out_bufferP, size_t* size_dataP) {}; - - static Message *DeserializeRRCMessage(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP); - static Message *DeserializeRRMMessage(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP); - static Message *Deserialize (const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP); - void ParseIpParameters(struct sockaddr *sa_fromP,socklen_t sa_lenP); - msg_length_t GetSerializedMessageSize(); - const char* GetSerializedMessageBuffer(); - const int GetSrcPort() { - return m_port_src; - }; - const char* GetSrcAddress() { - return m_ip_char_src; - }; - virtual ~ Message (); - - static std::string StatusToString(msg_response_status_t); - static std::string ReasonToString(msg_response_reason_t); - - -protected: - msg_type_t m_type; - bool m_is_ipv6; - struct sockaddr_in m_sockaddr_in4_src; - struct sockaddr_in6 m_sockaddr_in6_src; - std::string m_ip_str_src; - char* m_ip_char_src; - int m_port_src; - tcpip::Storage m_message_storage; - unsigned char* m_message_buffer; - - msg_length_t m_msg_length; - uint8_t m_message_serialize_buffer[MESSAGE_SERIALIZE_BUFFER_SIZE]; - //uint8_t m_message_serialize_buffer[MESSAGE_DESERIALIZE_BUFFER_SIZE]; -}; - -# endif \ No newline at end of file diff --git a/openair2/RRM_4_RRC_LITE/src/com/asn1/Makefile.am.sample b/openair2/RRM_4_RRC_LITE/src/com/asn1/Makefile.am.sample deleted file mode 100755 index 4ca04ff4c3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/asn1/Makefile.am.sample +++ /dev/null @@ -1,870 +0,0 @@ -ASN_MODULE_SOURCES= \ - BCCH-BCH-Message.c \ - BCCH-BCH-MessageType.c \ - BCCH-DL-SCH-Message.c \ - BCCH-DL-SCH-MessageType.c \ - PCCH-Message.c \ - PCCH-MessageType.c \ - DL-CCCH-Message.c \ - DL-CCCH-MessageType.c \ - DL-DCCH-Message.c \ - DL-DCCH-MessageType.c \ - UL-CCCH-Message.c \ - UL-CCCH-MessageType.c \ - UL-DCCH-Message.c \ - UL-DCCH-MessageType.c \ - CounterCheck.c \ - CounterCheck-r8-IEs.c \ - DRB-CountMSB-InfoList.c \ - DRB-CountMSB-Info.c \ - CounterCheckResponse.c \ - CounterCheckResponse-r8-IEs.c \ - DRB-CountInfoList.c \ - DRB-CountInfo.c \ - CSFBParametersRequestCDMA2000.c \ - CSFBParametersRequestCDMA2000-r8-IEs.c \ - CSFBParametersResponseCDMA2000.c \ - CSFBParametersResponseCDMA2000-r8-IEs.c \ - DLInformationTransfer.c \ - DLInformationTransfer-r8-IEs.c \ - HandoverFromEUTRAPreparationRequest.c \ - HandoverFromEUTRAPreparationRequest-r8-IEs.c \ - MasterInformationBlock.c \ - MeasurementReport.c \ - MeasurementReport-r8-IEs.c \ - MobilityFromEUTRACommand.c \ - MobilityFromEUTRACommand-r8-IEs.c \ - Handover.c \ - CellChangeOrder.c \ - SI-OrPSI-GERAN.c \ - SystemInfoListGERAN.c \ - Paging.c \ - PagingRecordList.c \ - PagingRecord.c \ - PagingUE-Identity.c \ - IMSI.c \ - IMSI-Digit.c \ - RRCConnectionReconfiguration.c \ - RRCConnectionReconfiguration-r8-IEs.c \ - SecurityConfigHO.c \ - RRCConnectionReconfigurationComplete.c \ - RRCConnectionReconfigurationComplete-r8-IEs.c \ - RRCConnectionReestablishment.c \ - RRCConnectionReestablishment-r8-IEs.c \ - RRCConnectionReestablishmentComplete.c \ - RRCConnectionReestablishmentComplete-r8-IEs.c \ - RRCConnectionReestablishmentReject.c \ - RRCConnectionReestablishmentReject-r8-IEs.c \ - RRCConnectionReestablishmentRequest.c \ - RRCConnectionReestablishmentRequest-r8-IEs.c \ - ReestabUE-Identity.c \ - ReestablishmentCause.c \ - RRCConnectionReject.c \ - RRCConnectionReject-r8-IEs.c \ - RRCConnectionRelease.c \ - RRCConnectionRelease-r8-IEs.c \ - ReleaseCause.c \ - RedirectedCarrierInfo.c \ - IdleModeMobilityControlInfo.c \ - FreqPriorityListEUTRA.c \ - FreqPriorityEUTRA.c \ - FreqsPriorityListGERAN.c \ - FreqsPriorityGERAN.c \ - FreqPriorityListUTRA-FDD.c \ - FreqPriorityUTRA-FDD.c \ - FreqPriorityListUTRA-TDD.c \ - FreqPriorityUTRA-TDD.c \ - BandClassPriorityListHRPD.c \ - BandClassPriorityHRPD.c \ - BandClassPriorityList1XRTT.c \ - BandClassPriority1XRTT.c \ - RRCConnectionRequest.c \ - RRCConnectionRequest-r8-IEs.c \ - InitialUE-Identity.c \ - EstablishmentCause.c \ - RRCConnectionSetup.c \ - RRCConnectionSetup-r8-IEs.c \ - RRCConnectionSetupComplete.c \ - RRCConnectionSetupComplete-r8-IEs.c \ - RegisteredMME.c \ - SecurityModeCommand.c \ - SecurityModeCommand-r8-IEs.c \ - SecurityConfigSMC.c \ - SecurityModeComplete.c \ - SecurityModeComplete-r8-IEs.c \ - SecurityModeFailure.c \ - SecurityModeFailure-r8-IEs.c \ - SystemInformation.c \ - SystemInformation-r8-IEs.c \ - SystemInformationBlockType1.c \ - PLMN-IdentityList.c \ - PLMN-IdentityInfo.c \ - SchedulingInfoList.c \ - SchedulingInfo.c \ - SIB-MappingInfo.c \ - SIB-Type.c \ - UECapabilityEnquiry.c \ - UECapabilityEnquiry-r8-IEs.c \ - UE-CapabilityRequest.c \ - UECapabilityInformation.c \ - UECapabilityInformation-r8-IEs.c \ - ULHandoverPreparationTransfer.c \ - ULHandoverPreparationTransfer-r8-IEs.c \ - ULInformationTransfer.c \ - ULInformationTransfer-r8-IEs.c \ - SystemInformationBlockType2.c \ - AC-BarringConfig.c \ - MBSFN-SubframeConfigList.c \ - MBSFN-SubframeConfig.c \ - SystemInformationBlockType3.c \ - SystemInformationBlockType4.c \ - IntraFreqNeighCellList.c \ - IntraFreqNeighCellInfo.c \ - IntraFreqBlackCellList.c \ - SystemInformationBlockType5.c \ - InterFreqCarrierFreqList.c \ - InterFreqCarrierFreqInfo.c \ - InterFreqNeighCellList.c \ - InterFreqNeighCellInfo.c \ - InterFreqBlackCellList.c \ - SystemInformationBlockType6.c \ - CarrierFreqListUTRA-FDD.c \ - CarrierFreqUTRA-FDD.c \ - CarrierFreqListUTRA-TDD.c \ - CarrierFreqUTRA-TDD.c \ - SystemInformationBlockType7.c \ - CarrierFreqsInfoListGERAN.c \ - CarrierFreqsInfoGERAN.c \ - SystemInformationBlockType8.c \ - CellReselectionParametersCDMA2000.c \ - NeighCellListCDMA2000.c \ - NeighCellCDMA2000.c \ - NeighCellsPerBandclassListCDMA2000.c \ - NeighCellsPerBandclassCDMA2000.c \ - PhysCellIdListCDMA2000.c \ - BandClassListCDMA2000.c \ - BandClassInfoCDMA2000.c \ - SystemInformationBlockType9.c \ - SystemInformationBlockType10.c \ - SystemInformationBlockType11.c \ - AntennaInfoCommon.c \ - AntennaInfoDedicated.c \ - CQI-ReportConfig.c \ - CQI-ReportPeriodic.c \ - DRB-Identity.c \ - LogicalChannelConfig.c \ - MAC-MainConfig.c \ - DRX-Config.c \ - PDCP-Config.c \ - PDSCH-ConfigCommon.c \ - PDSCH-ConfigDedicated.c \ - PHICH-Config.c \ - PhysicalConfigDedicated.c \ - P-Max.c \ - PRACH-ConfigSIB.c \ - PRACH-Config.c \ - PRACH-ConfigInfo.c \ - PresenceAntennaPort1.c \ - PUCCH-ConfigCommon.c \ - PUCCH-ConfigDedicated.c \ - PUSCH-ConfigCommon.c \ - PUSCH-ConfigDedicated.c \ - UL-ReferenceSignalsPUSCH.c \ - RACH-ConfigCommon.c \ - RACH-ConfigDedicated.c \ - RadioResourceConfigCommonSIB.c \ - RadioResourceConfigCommon.c \ - BCCH-Config.c \ - PCCH-Config.c \ - UL-CyclicPrefixLength.c \ - RadioResourceConfigDedicated.c \ - SRB-ToAddModList.c \ - SRB-ToAddMod.c \ - DRB-ToAddModList.c \ - DRB-ToAddMod.c \ - DRB-ToReleaseList.c \ - RLC-Config.c \ - UL-AM-RLC.c \ - DL-AM-RLC.c \ - UL-UM-RLC.c \ - DL-UM-RLC.c \ - SN-FieldLength.c \ - T-PollRetransmit.c \ - PollPDU.c \ - PollByte.c \ - T-Reordering.c \ - T-StatusProhibit.c \ - SchedulingRequestConfig.c \ - SoundingRS-UL-ConfigCommon.c \ - SoundingRS-UL-ConfigDedicated.c \ - SPS-Config.c \ - SPS-ConfigDL.c \ - SPS-ConfigUL.c \ - N1-PUCCH-AN-PersistentList.c \ - TDD-Config.c \ - TimeAlignmentTimer.c \ - TPC-PDCCH-Config.c \ - TPC-Index.c \ - UplinkPowerControlCommon.c \ - UplinkPowerControlDedicated.c \ - DeltaFList-PUCCH.c \ - NextHopChainingCount.c \ - SecurityAlgorithmConfig.c \ - ShortMAC-I.c \ - AdditionalSpectrumEmission.c \ - ARFCN-ValueCDMA2000.c \ - ARFCN-ValueEUTRA.c \ - ARFCN-ValueGERAN.c \ - ARFCN-ValueUTRA.c \ - BandclassCDMA2000.c \ - BandIndicatorGERAN.c \ - CarrierFreqCDMA2000.c \ - CarrierFreqGERAN.c \ - CarrierFreqsGERAN.c \ - ExplicitListOfARFCNs.c \ - CDMA2000-Type.c \ - CellIdentity.c \ - CellIndexList.c \ - CellIndex.c \ - CellReselectionPriority.c \ - CSFB-RegistrationParam1XRTT.c \ - CellGlobalIdEUTRA.c \ - CellGlobalIdUTRA.c \ - CellGlobalIdGERAN.c \ - CellGlobalIdCDMA2000.c \ - MobilityControlInfo.c \ - CarrierBandwidthEUTRA.c \ - CarrierFreqEUTRA.c \ - MobilityParametersCDMA2000.c \ - MobilityStateParameters.c \ - PhysCellId.c \ - PhysCellIdRange.c \ - PhysCellIdCDMA2000.c \ - PhysCellIdGERAN.c \ - PhysCellIdUTRA-FDD.c \ - PhysCellIdUTRA-TDD.c \ - PLMN-Identity.c \ - MCC.c \ - MNC.c \ - MCC-MNC-Digit.c \ - PreRegistrationInfoHRPD.c \ - SecondaryPreRegistrationZoneIdListHRPD.c \ - PreRegistrationZoneIdHRPD.c \ - Q-RxLevMin.c \ - Q-OffsetRange.c \ - Q-OffsetRangeInterRAT.c \ - ReselectionThreshold.c \ - SpeedStateScaleFactors.c \ - SystemTimeInfoCDMA2000.c \ - TrackingAreaCode.c \ - T-Reselection.c \ - AllowedMeasBandwidth.c \ - Hysteresis.c \ - MeasConfig.c \ - MeasIdToRemoveList.c \ - MeasObjectToRemoveList.c \ - ReportConfigToRemoveList.c \ - MeasGapConfig.c \ - MeasId.c \ - MeasIdToAddModList.c \ - MeasIdToAddMod.c \ - MeasObjectCDMA2000.c \ - CellsToAddModListCDMA2000.c \ - CellsToAddModCDMA2000.c \ - MeasObjectEUTRA.c \ - CellsToAddModList.c \ - CellsToAddMod.c \ - BlackCellsToAddModList.c \ - BlackCellsToAddMod.c \ - MeasObjectGERAN.c \ - MeasObjectId.c \ - MeasObjectToAddModList.c \ - MeasObjectToAddMod.c \ - MeasObjectUTRA.c \ - CellsToAddModListUTRA-FDD.c \ - CellsToAddModUTRA-FDD.c \ - CellsToAddModListUTRA-TDD.c \ - CellsToAddModUTRA-TDD.c \ - MeasResults.c \ - MeasResultListEUTRA.c \ - MeasResultEUTRA.c \ - MeasResultListUTRA.c \ - MeasResultUTRA.c \ - MeasResultListGERAN.c \ - MeasResultGERAN.c \ - MeasResultsCDMA2000.c \ - MeasResultListCDMA2000.c \ - MeasResultCDMA2000.c \ - PLMN-IdentityList2.c \ - QuantityConfig.c \ - QuantityConfigEUTRA.c \ - QuantityConfigUTRA.c \ - QuantityConfigGERAN.c \ - QuantityConfigCDMA2000.c \ - ReportConfigEUTRA.c \ - ThresholdEUTRA.c \ - ReportConfigId.c \ - ReportConfigInterRAT.c \ - ThresholdUTRA.c \ - ThresholdGERAN.c \ - ThresholdCDMA2000.c \ - ReportConfigToAddModList.c \ - ReportConfigToAddMod.c \ - ReportInterval.c \ - RSRP-Range.c \ - RSRQ-Range.c \ - TimeToTrigger.c \ - C-RNTI.c \ - DedicatedInfoCDMA2000.c \ - DedicatedInfoNAS.c \ - FilterCoefficient.c \ - MMEC.c \ - NeighCellConfig.c \ - RAND-CDMA2000.c \ - RAT-Type.c \ - RRC-TransactionIdentifier.c \ - S-TMSI.c \ - UE-CapabilityRAT-ContainerList.c \ - UE-CapabilityRAT-Container.c \ - UE-EUTRA-Capability.c \ - AccessStratumRelease.c \ - PDCP-Parameters.c \ - PhyLayerParameters.c \ - RF-Parameters.c \ - SupportedBandListEUTRA.c \ - SupportedBandEUTRA.c \ - MeasParameters.c \ - BandListEUTRA.c \ - BandInfoEUTRA.c \ - InterFreqBandList.c \ - InterFreqBandInfo.c \ - InterRAT-BandList.c \ - InterRAT-BandInfo.c \ - IRAT-ParametersUTRA-FDD.c \ - SupportedBandListUTRA-FDD.c \ - SupportedBandUTRA-FDD.c \ - IRAT-ParametersUTRA-TDD128.c \ - SupportedBandListUTRA-TDD128.c \ - SupportedBandUTRA-TDD128.c \ - IRAT-ParametersUTRA-TDD384.c \ - SupportedBandListUTRA-TDD384.c \ - SupportedBandUTRA-TDD384.c \ - IRAT-ParametersUTRA-TDD768.c \ - SupportedBandListUTRA-TDD768.c \ - SupportedBandUTRA-TDD768.c \ - IRAT-ParametersGERAN.c \ - SupportedBandListGERAN.c \ - SupportedBandGERAN.c \ - IRAT-ParametersCDMA2000-HRPD.c \ - SupportedBandListHRPD.c \ - IRAT-ParametersCDMA2000-1XRTT.c \ - SupportedBandList1XRTT.c \ - UE-TimersAndConstants.c \ - RRC-RRM-Message.c \ - RRC-RRM-MessageType.c \ - RRCSystemConfigurationRequest.c \ - RRCAddUserRequest.c \ - RRCAddUserConfirm.c \ - RRCAddDataRadioBearerRequest.c \ - RRCAddDataRadioBearerConfirm.c \ - RRCRemoveUserRequest.c \ - RRCRemoveDataRadioBearerRequest.c \ - RRCRemoveDataRadioBearerConfirm.c \ - RRCUserReconfigurationComplete.c \ - RRM-RRC-Message.c \ - RRM-RRC-MessageType.c \ - RRCSystemConfigurationResponse.c \ - RRCAddUserResponse.c \ - RRCAddDataRadioBearerResponse.c \ - RRCRemoveUserResponse.c \ - RRCRemoveDataRadioBearerResponse.c \ - RRCUserReconfiguration.c \ - E-NodeB-Identity.c \ - TransactionId.c \ - OpenAir-C-RNTI.c \ - OpenAir-ApplicationKBitRate.c \ - OpenAir-Application-ms-PacketDelay.c \ - OpenAir-Application-TrafficClass.c \ - OpenAir-RRM-Response-Reason.c \ - OpenAir-RRM-Response-Status.c - -ASN_MODULE_HEADERS= \ - BCCH-BCH-Message.h \ - BCCH-BCH-MessageType.h \ - BCCH-DL-SCH-Message.h \ - BCCH-DL-SCH-MessageType.h \ - PCCH-Message.h \ - PCCH-MessageType.h \ - DL-CCCH-Message.h \ - DL-CCCH-MessageType.h \ - DL-DCCH-Message.h \ - DL-DCCH-MessageType.h \ - UL-CCCH-Message.h \ - UL-CCCH-MessageType.h \ - UL-DCCH-Message.h \ - UL-DCCH-MessageType.h \ - CounterCheck.h \ - CounterCheck-r8-IEs.h \ - DRB-CountMSB-InfoList.h \ - DRB-CountMSB-Info.h \ - CounterCheckResponse.h \ - CounterCheckResponse-r8-IEs.h \ - DRB-CountInfoList.h \ - DRB-CountInfo.h \ - CSFBParametersRequestCDMA2000.h \ - CSFBParametersRequestCDMA2000-r8-IEs.h \ - CSFBParametersResponseCDMA2000.h \ - CSFBParametersResponseCDMA2000-r8-IEs.h \ - DLInformationTransfer.h \ - DLInformationTransfer-r8-IEs.h \ - HandoverFromEUTRAPreparationRequest.h \ - HandoverFromEUTRAPreparationRequest-r8-IEs.h \ - MasterInformationBlock.h \ - MeasurementReport.h \ - MeasurementReport-r8-IEs.h \ - MobilityFromEUTRACommand.h \ - MobilityFromEUTRACommand-r8-IEs.h \ - Handover.h \ - CellChangeOrder.h \ - SI-OrPSI-GERAN.h \ - SystemInfoListGERAN.h \ - Paging.h \ - PagingRecordList.h \ - PagingRecord.h \ - PagingUE-Identity.h \ - IMSI.h \ - IMSI-Digit.h \ - RRCConnectionReconfiguration.h \ - RRCConnectionReconfiguration-r8-IEs.h \ - SecurityConfigHO.h \ - RRCConnectionReconfigurationComplete.h \ - RRCConnectionReconfigurationComplete-r8-IEs.h \ - RRCConnectionReestablishment.h \ - RRCConnectionReestablishment-r8-IEs.h \ - RRCConnectionReestablishmentComplete.h \ - RRCConnectionReestablishmentComplete-r8-IEs.h \ - RRCConnectionReestablishmentReject.h \ - RRCConnectionReestablishmentReject-r8-IEs.h \ - RRCConnectionReestablishmentRequest.h \ - RRCConnectionReestablishmentRequest-r8-IEs.h \ - ReestabUE-Identity.h \ - ReestablishmentCause.h \ - RRCConnectionReject.h \ - RRCConnectionReject-r8-IEs.h \ - RRCConnectionRelease.h \ - RRCConnectionRelease-r8-IEs.h \ - ReleaseCause.h \ - RedirectedCarrierInfo.h \ - IdleModeMobilityControlInfo.h \ - FreqPriorityListEUTRA.h \ - FreqPriorityEUTRA.h \ - FreqsPriorityListGERAN.h \ - FreqsPriorityGERAN.h \ - FreqPriorityListUTRA-FDD.h \ - FreqPriorityUTRA-FDD.h \ - FreqPriorityListUTRA-TDD.h \ - FreqPriorityUTRA-TDD.h \ - BandClassPriorityListHRPD.h \ - BandClassPriorityHRPD.h \ - BandClassPriorityList1XRTT.h \ - BandClassPriority1XRTT.h \ - RRCConnectionRequest.h \ - RRCConnectionRequest-r8-IEs.h \ - InitialUE-Identity.h \ - EstablishmentCause.h \ - RRCConnectionSetup.h \ - RRCConnectionSetup-r8-IEs.h \ - RRCConnectionSetupComplete.h \ - RRCConnectionSetupComplete-r8-IEs.h \ - RegisteredMME.h \ - SecurityModeCommand.h \ - SecurityModeCommand-r8-IEs.h \ - SecurityConfigSMC.h \ - SecurityModeComplete.h \ - SecurityModeComplete-r8-IEs.h \ - SecurityModeFailure.h \ - SecurityModeFailure-r8-IEs.h \ - SystemInformation.h \ - SystemInformation-r8-IEs.h \ - SystemInformationBlockType1.h \ - PLMN-IdentityList.h \ - PLMN-IdentityInfo.h \ - SchedulingInfoList.h \ - SchedulingInfo.h \ - SIB-MappingInfo.h \ - SIB-Type.h \ - UECapabilityEnquiry.h \ - UECapabilityEnquiry-r8-IEs.h \ - UE-CapabilityRequest.h \ - UECapabilityInformation.h \ - UECapabilityInformation-r8-IEs.h \ - ULHandoverPreparationTransfer.h \ - ULHandoverPreparationTransfer-r8-IEs.h \ - ULInformationTransfer.h \ - ULInformationTransfer-r8-IEs.h \ - SystemInformationBlockType2.h \ - AC-BarringConfig.h \ - MBSFN-SubframeConfigList.h \ - MBSFN-SubframeConfig.h \ - SystemInformationBlockType3.h \ - SystemInformationBlockType4.h \ - IntraFreqNeighCellList.h \ - IntraFreqNeighCellInfo.h \ - IntraFreqBlackCellList.h \ - SystemInformationBlockType5.h \ - InterFreqCarrierFreqList.h \ - InterFreqCarrierFreqInfo.h \ - InterFreqNeighCellList.h \ - InterFreqNeighCellInfo.h \ - InterFreqBlackCellList.h \ - SystemInformationBlockType6.h \ - CarrierFreqListUTRA-FDD.h \ - CarrierFreqUTRA-FDD.h \ - CarrierFreqListUTRA-TDD.h \ - CarrierFreqUTRA-TDD.h \ - SystemInformationBlockType7.h \ - CarrierFreqsInfoListGERAN.h \ - CarrierFreqsInfoGERAN.h \ - SystemInformationBlockType8.h \ - CellReselectionParametersCDMA2000.h \ - NeighCellListCDMA2000.h \ - NeighCellCDMA2000.h \ - NeighCellsPerBandclassListCDMA2000.h \ - NeighCellsPerBandclassCDMA2000.h \ - PhysCellIdListCDMA2000.h \ - BandClassListCDMA2000.h \ - BandClassInfoCDMA2000.h \ - SystemInformationBlockType9.h \ - SystemInformationBlockType10.h \ - SystemInformationBlockType11.h \ - AntennaInfoCommon.h \ - AntennaInfoDedicated.h \ - CQI-ReportConfig.h \ - CQI-ReportPeriodic.h \ - DRB-Identity.h \ - LogicalChannelConfig.h \ - MAC-MainConfig.h \ - DRX-Config.h \ - PDCP-Config.h \ - PDSCH-ConfigCommon.h \ - PDSCH-ConfigDedicated.h \ - PHICH-Config.h \ - PhysicalConfigDedicated.h \ - P-Max.h \ - PRACH-ConfigSIB.h \ - PRACH-Config.h \ - PRACH-ConfigInfo.h \ - PresenceAntennaPort1.h \ - PUCCH-ConfigCommon.h \ - PUCCH-ConfigDedicated.h \ - PUSCH-ConfigCommon.h \ - PUSCH-ConfigDedicated.h \ - UL-ReferenceSignalsPUSCH.h \ - RACH-ConfigCommon.h \ - RACH-ConfigDedicated.h \ - RadioResourceConfigCommonSIB.h \ - RadioResourceConfigCommon.h \ - BCCH-Config.h \ - PCCH-Config.h \ - UL-CyclicPrefixLength.h \ - RadioResourceConfigDedicated.h \ - SRB-ToAddModList.h \ - SRB-ToAddMod.h \ - DRB-ToAddModList.h \ - DRB-ToAddMod.h \ - DRB-ToReleaseList.h \ - RLC-Config.h \ - UL-AM-RLC.h \ - DL-AM-RLC.h \ - UL-UM-RLC.h \ - DL-UM-RLC.h \ - SN-FieldLength.h \ - T-PollRetransmit.h \ - PollPDU.h \ - PollByte.h \ - T-Reordering.h \ - T-StatusProhibit.h \ - SchedulingRequestConfig.h \ - SoundingRS-UL-ConfigCommon.h \ - SoundingRS-UL-ConfigDedicated.h \ - SPS-Config.h \ - SPS-ConfigDL.h \ - SPS-ConfigUL.h \ - N1-PUCCH-AN-PersistentList.h \ - TDD-Config.h \ - TimeAlignmentTimer.h \ - TPC-PDCCH-Config.h \ - TPC-Index.h \ - UplinkPowerControlCommon.h \ - UplinkPowerControlDedicated.h \ - DeltaFList-PUCCH.h \ - NextHopChainingCount.h \ - SecurityAlgorithmConfig.h \ - ShortMAC-I.h \ - AdditionalSpectrumEmission.h \ - ARFCN-ValueCDMA2000.h \ - ARFCN-ValueEUTRA.h \ - ARFCN-ValueGERAN.h \ - ARFCN-ValueUTRA.h \ - BandclassCDMA2000.h \ - BandIndicatorGERAN.h \ - CarrierFreqCDMA2000.h \ - CarrierFreqGERAN.h \ - CarrierFreqsGERAN.h \ - ExplicitListOfARFCNs.h \ - CDMA2000-Type.h \ - CellIdentity.h \ - CellIndexList.h \ - CellIndex.h \ - CellReselectionPriority.h \ - CSFB-RegistrationParam1XRTT.h \ - CellGlobalIdEUTRA.h \ - CellGlobalIdUTRA.h \ - CellGlobalIdGERAN.h \ - CellGlobalIdCDMA2000.h \ - MobilityControlInfo.h \ - CarrierBandwidthEUTRA.h \ - CarrierFreqEUTRA.h \ - MobilityParametersCDMA2000.h \ - MobilityStateParameters.h \ - PhysCellId.h \ - PhysCellIdRange.h \ - PhysCellIdCDMA2000.h \ - PhysCellIdGERAN.h \ - PhysCellIdUTRA-FDD.h \ - PhysCellIdUTRA-TDD.h \ - PLMN-Identity.h \ - MCC.h \ - MNC.h \ - MCC-MNC-Digit.h \ - PreRegistrationInfoHRPD.h \ - SecondaryPreRegistrationZoneIdListHRPD.h \ - PreRegistrationZoneIdHRPD.h \ - Q-RxLevMin.h \ - Q-OffsetRange.h \ - Q-OffsetRangeInterRAT.h \ - ReselectionThreshold.h \ - SpeedStateScaleFactors.h \ - SystemTimeInfoCDMA2000.h \ - TrackingAreaCode.h \ - T-Reselection.h \ - AllowedMeasBandwidth.h \ - Hysteresis.h \ - MeasConfig.h \ - MeasIdToRemoveList.h \ - MeasObjectToRemoveList.h \ - ReportConfigToRemoveList.h \ - MeasGapConfig.h \ - MeasId.h \ - MeasIdToAddModList.h \ - MeasIdToAddMod.h \ - MeasObjectCDMA2000.h \ - CellsToAddModListCDMA2000.h \ - CellsToAddModCDMA2000.h \ - MeasObjectEUTRA.h \ - CellsToAddModList.h \ - CellsToAddMod.h \ - BlackCellsToAddModList.h \ - BlackCellsToAddMod.h \ - MeasObjectGERAN.h \ - MeasObjectId.h \ - MeasObjectToAddModList.h \ - MeasObjectToAddMod.h \ - MeasObjectUTRA.h \ - CellsToAddModListUTRA-FDD.h \ - CellsToAddModUTRA-FDD.h \ - CellsToAddModListUTRA-TDD.h \ - CellsToAddModUTRA-TDD.h \ - MeasResults.h \ - MeasResultListEUTRA.h \ - MeasResultEUTRA.h \ - MeasResultListUTRA.h \ - MeasResultUTRA.h \ - MeasResultListGERAN.h \ - MeasResultGERAN.h \ - MeasResultsCDMA2000.h \ - MeasResultListCDMA2000.h \ - MeasResultCDMA2000.h \ - PLMN-IdentityList2.h \ - QuantityConfig.h \ - QuantityConfigEUTRA.h \ - QuantityConfigUTRA.h \ - QuantityConfigGERAN.h \ - QuantityConfigCDMA2000.h \ - ReportConfigEUTRA.h \ - ThresholdEUTRA.h \ - ReportConfigId.h \ - ReportConfigInterRAT.h \ - ThresholdUTRA.h \ - ThresholdGERAN.h \ - ThresholdCDMA2000.h \ - ReportConfigToAddModList.h \ - ReportConfigToAddMod.h \ - ReportInterval.h \ - RSRP-Range.h \ - RSRQ-Range.h \ - TimeToTrigger.h \ - C-RNTI.h \ - DedicatedInfoCDMA2000.h \ - DedicatedInfoNAS.h \ - FilterCoefficient.h \ - MMEC.h \ - NeighCellConfig.h \ - RAND-CDMA2000.h \ - RAT-Type.h \ - RRC-TransactionIdentifier.h \ - S-TMSI.h \ - UE-CapabilityRAT-ContainerList.h \ - UE-CapabilityRAT-Container.h \ - UE-EUTRA-Capability.h \ - AccessStratumRelease.h \ - PDCP-Parameters.h \ - PhyLayerParameters.h \ - RF-Parameters.h \ - SupportedBandListEUTRA.h \ - SupportedBandEUTRA.h \ - MeasParameters.h \ - BandListEUTRA.h \ - BandInfoEUTRA.h \ - InterFreqBandList.h \ - InterFreqBandInfo.h \ - InterRAT-BandList.h \ - InterRAT-BandInfo.h \ - IRAT-ParametersUTRA-FDD.h \ - SupportedBandListUTRA-FDD.h \ - SupportedBandUTRA-FDD.h \ - IRAT-ParametersUTRA-TDD128.h \ - SupportedBandListUTRA-TDD128.h \ - SupportedBandUTRA-TDD128.h \ - IRAT-ParametersUTRA-TDD384.h \ - SupportedBandListUTRA-TDD384.h \ - SupportedBandUTRA-TDD384.h \ - IRAT-ParametersUTRA-TDD768.h \ - SupportedBandListUTRA-TDD768.h \ - SupportedBandUTRA-TDD768.h \ - IRAT-ParametersGERAN.h \ - SupportedBandListGERAN.h \ - SupportedBandGERAN.h \ - IRAT-ParametersCDMA2000-HRPD.h \ - SupportedBandListHRPD.h \ - IRAT-ParametersCDMA2000-1XRTT.h \ - SupportedBandList1XRTT.h \ - UE-TimersAndConstants.h \ - RRC-RRM-Message.h \ - RRC-RRM-MessageType.h \ - RRCSystemConfigurationRequest.h \ - RRCAddUserRequest.h \ - RRCAddUserConfirm.h \ - RRCAddDataRadioBearerRequest.h \ - RRCAddDataRadioBearerConfirm.h \ - RRCRemoveUserRequest.h \ - RRCRemoveDataRadioBearerRequest.h \ - RRCRemoveDataRadioBearerConfirm.h \ - RRCUserReconfigurationComplete.h \ - RRM-RRC-Message.h \ - RRM-RRC-MessageType.h \ - RRCSystemConfigurationResponse.h \ - RRCAddUserResponse.h \ - RRCAddDataRadioBearerResponse.h \ - RRCRemoveUserResponse.h \ - RRCRemoveDataRadioBearerResponse.h \ - RRCUserReconfiguration.h \ - E-NodeB-Identity.h \ - TransactionId.h \ - OpenAir-C-RNTI.h \ - OpenAir-ApplicationKBitRate.h \ - OpenAir-Application-ms-PacketDelay.h \ - OpenAir-Application-TrafficClass.h \ - OpenAir-RRM-Response-Reason.h \ - OpenAir-RRM-Response-Status.h - -ASN_MODULE_HEADERS+=BOOLEAN.h -ASN_MODULE_SOURCES+=BOOLEAN.c -ASN_MODULE_HEADERS+=INTEGER.h -ASN_MODULE_HEADERS+=NativeEnumerated.h -ASN_MODULE_SOURCES+=INTEGER.c -ASN_MODULE_HEADERS+=NULL.h -ASN_MODULE_SOURCES+=NULL.c -ASN_MODULE_SOURCES+=NativeEnumerated.c -ASN_MODULE_HEADERS+=NativeInteger.h -ASN_MODULE_SOURCES+=NativeInteger.c -ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h -ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c -ASN_MODULE_HEADERS+=asn_SET_OF.h -ASN_MODULE_SOURCES+=asn_SET_OF.c -ASN_MODULE_HEADERS+=constr_CHOICE.h -ASN_MODULE_SOURCES+=constr_CHOICE.c -ASN_MODULE_HEADERS+=constr_SEQUENCE.h -ASN_MODULE_SOURCES+=constr_SEQUENCE.c -ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h -ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c -ASN_MODULE_HEADERS+=constr_SET_OF.h -ASN_MODULE_SOURCES+=constr_SET_OF.c -ASN_MODULE_HEADERS+=asn_application.h -ASN_MODULE_HEADERS+=asn_system.h -ASN_MODULE_HEADERS+=asn_codecs.h -ASN_MODULE_HEADERS+=asn_internal.h -ASN_MODULE_HEADERS+=OCTET_STRING.h -ASN_MODULE_SOURCES+=OCTET_STRING.c -ASN_MODULE_HEADERS+=BIT_STRING.h -ASN_MODULE_SOURCES+=BIT_STRING.c -ASN_MODULE_SOURCES+=asn_codecs_prim.c -ASN_MODULE_HEADERS+=asn_codecs_prim.h -ASN_MODULE_HEADERS+=ber_tlv_length.h -ASN_MODULE_SOURCES+=ber_tlv_length.c -ASN_MODULE_HEADERS+=ber_tlv_tag.h -ASN_MODULE_SOURCES+=ber_tlv_tag.c -ASN_MODULE_HEADERS+=ber_decoder.h -ASN_MODULE_SOURCES+=ber_decoder.c -ASN_MODULE_HEADERS+=der_encoder.h -ASN_MODULE_SOURCES+=der_encoder.c -ASN_MODULE_HEADERS+=constr_TYPE.h -ASN_MODULE_SOURCES+=constr_TYPE.c -ASN_MODULE_HEADERS+=constraints.h -ASN_MODULE_SOURCES+=constraints.c -ASN_MODULE_HEADERS+=xer_support.h -ASN_MODULE_SOURCES+=xer_support.c -ASN_MODULE_HEADERS+=xer_decoder.h -ASN_MODULE_SOURCES+=xer_decoder.c -ASN_MODULE_HEADERS+=xer_encoder.h -ASN_MODULE_SOURCES+=xer_encoder.c -ASN_MODULE_HEADERS+=per_support.h -ASN_MODULE_SOURCES+=per_support.c -ASN_MODULE_HEADERS+=per_decoder.h -ASN_MODULE_SOURCES+=per_decoder.c -ASN_MODULE_HEADERS+=per_encoder.h -ASN_MODULE_SOURCES+=per_encoder.c -ASN_MODULE_HEADERS+=per_opentype.h -ASN_MODULE_SOURCES+=per_opentype.c -ASN_CONVERTER_SOURCES+=converter-sample.c - - -lib_LTLIBRARIES=libsomething.la -libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) - -# This file may be used as an input for make(3) -# Remove the lines below to convert it into a pure .am file -TARGET = progname -CFLAGS += -I. -OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} - -all: $(TARGET) - -$(TARGET): ${OBJS} - $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) - -.SUFFIXES: -.SUFFIXES: .c .o - -.c.o: - $(CC) $(CFLAGS) -o $@ -c $< - -clean: - rm -f $(TARGET) - rm -f $(OBJS) - -regen: regenerate-from-asn1-source - -regenerate-from-asn1-source: - asn1c -gen-PER -fno-include-deps -fcompound-names -fnative-types -fskeletons-copy /homes/gauthier/PROJETS/trunk/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-RRC-Definitions.asn /homes/gauthier/PROJETS/trunk/openair2/RRM_4_RRC_LITE/src/com/asn1/rrc-rrm.asn - diff --git a/openair2/RRM_4_RRC_LITE/src/com/asn1/rrc-rrm.asn b/openair2/RRM_4_RRC_LITE/src/com/asn1/rrc-rrm.asn deleted file mode 100755 index 7dcb9962c4..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/asn1/rrc-rrm.asn +++ /dev/null @@ -1,194 +0,0 @@ -RRM-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - -IMPORTS - DRB-Identity, - PhysCellId, - RadioResourceConfigDedicated, - RRCConnectionReconfiguration-r8-IEs, - RRCConnectionReconfigurationComplete-r8-IEs, - SystemInformation, - SystemInformationBlockType1, - SystemInformationBlockType2 FROM EUTRA-RRC-Definitions; - -RRC-RRM-Message ::= SEQUENCE { - message RRC-RRM-MessageType -} - -RRC-RRM-MessageType ::= CHOICE { - c1 CHOICE { - rrcSystemConfigurationRequest RRCSystemConfigurationRequest, - rrcAddUserRequest RRCAddUserRequest, - rrcAddUserConfirm RRCAddUserConfirm, - rrcAddDataRadioBearerRequest RRCAddDataRadioBearerRequest, - rrcAddDataRadioBearerConfirm RRCAddDataRadioBearerConfirm, - rrcRemoveUserRequest RRCRemoveUserRequest, - rrcRemoveDataRadioBearerRequest RRCRemoveDataRadioBearerRequest, - rrcRemoveDataRadioBearerConfirm RRCRemoveDataRadioBearerConfirm, - rrcUserReconfigurationComplete RRCUserReconfigurationComplete - - }, - messageClassExtension SEQUENCE {} -} - - - -RRCSystemConfigurationRequest ::= SEQUENCE { - transactionId TransactionId -} - -RRCAddUserRequest ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI -} - -RRCAddUserConfirm ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI -} - -RRCAddDataRadioBearerRequest ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - drb-Identity DRB-Identity, - applicationTrafficClass OpenAir-Application-TrafficClass, - applicationPacketDelay OpenAir-Application-ms-PacketDelay, - guaranted-bit-rate-uplink OpenAir-ApplicationKBitRate, - max-bit-rate-uplink OpenAir-ApplicationKBitRate, - guaranted-bit-rate-downlink OpenAir-ApplicationKBitRate, - max-bit-rate-downlink OpenAir-ApplicationKBitRate -} - -RRCAddDataRadioBearerConfirm ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - drb-Identity DRB-Identity -} - -RRCRemoveUserRequest ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI -} - - -RRCRemoveDataRadioBearerRequest ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - drb-Identity DRB-Identity -} - -RRCRemoveDataRadioBearerConfirm ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - drb-Identity DRB-Identity -} - -RRCUserReconfigurationComplete ::= SEQUENCE { - transactionId TransactionId, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI -} - - -RRM-RRC-Message ::= SEQUENCE { - message RRM-RRC-MessageType -} - -RRM-RRC-MessageType ::= CHOICE { - c1 CHOICE { - rrcSystemConfigurationResponse RRCSystemConfigurationResponse, - rrcAddUserResponse RRCAddUserResponse, - rrcAddDataRadioBearerResponse RRCAddDataRadioBearerResponse, - rrcRemoveUserResponse RRCRemoveUserResponse, - rrcRemoveDataRadioBearerResponse RRCRemoveDataRadioBearerResponse, - rrcUserReconfiguration RRCUserReconfiguration - }, - messageClassExtension SEQUENCE {} -} - -RRCSystemConfigurationResponse ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - systemInformationBlockType1 SystemInformationBlockType1 OPTIONAL, - systemInformation SystemInformation OPTIONAL -} - -RRCAddUserResponse ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - radioResourceConfigDedicatedE-NodeB RadioResourceConfigDedicated OPTIONAL, - radioResourceConfigDedicatedMobile RadioResourceConfigDedicated OPTIONAL -} - -RRCAddDataRadioBearerResponse ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - -- MAY BE USELESS SINCE INCLUDED IN RadioResourceConfigDedicated drb-Identity DRB-Identity, - radioResourceConfigDedicatedE-NodeB RadioResourceConfigDedicated OPTIONAL, - radioResourceConfigDedicatedMobile RadioResourceConfigDedicated OPTIONAL -} - -RRCRemoveUserResponse ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - radioResourceConfigDedicatedE-NodeB RadioResourceConfigDedicated OPTIONAL, - radioResourceConfigDedicatedMobile RadioResourceConfigDedicated OPTIONAL -} - -RRCRemoveDataRadioBearerResponse ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - radioResourceConfigDedicatedE-NodeB RadioResourceConfigDedicated OPTIONAL, - radioResourceConfigDedicatedMobile RadioResourceConfigDedicated OPTIONAL -} - -RRCUserReconfiguration ::= SEQUENCE { - transactionId TransactionId, - rrm-Response-Status OpenAir-RRM-Response-Status, - rrm-Response-Reason OpenAir-RRM-Response-Reason, - e-NodeB-Identity E-NodeB-Identity, - c-RNTI OpenAir-C-RNTI, - radioResourceConfigDedicatedE-NodeB RadioResourceConfigDedicated OPTIONAL, - radioResourceConfigDedicatedMobile RadioResourceConfigDedicated OPTIONAL -} - -E-NodeB-Identity ::= SEQUENCE { - physCellId PhysCellId -} - -TransactionId ::= INTEGER (0..255) -OpenAir-C-RNTI ::= INTEGER (0..255) -OpenAir-ApplicationKBitRate ::= INTEGER (0..100000) -OpenAir-Application-ms-PacketDelay ::= INTEGER (0..10000) -OpenAir-Application-TrafficClass ::= INTEGER (0..255) - -OpenAir-RRM-Response-Reason ::= ENUMERATED { - ok, protocolError, ressourcesUnavailable, malformedMessage, unknownMessage, internalError } - -OpenAir-RRM-Response-Status ::= ENUMERATED { - success, warning, failure } - - -END diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp deleted file mode 100755 index 131ff507a0..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include - -#include "RRC2RRMMessageAddRadioAccessBearerConfirm.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" - -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerConfirm::RRC2RRMMessageAddRadioAccessBearerConfirm(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerConfirm::RRC2RRMMessageAddRadioAccessBearerConfirm(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP): -Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); -/* if (m_is_ipv6) { - printf("[RRM][RRC2RRMMessageAddRadioAccessBearerConfirm] (IPv6) Received %d bytes from: %s:%d\n", msg_lengthP, m_ip_char_src, m_port_src); - } else { - printf("[RRM][RRC2RRMMessageAddRadioAccessBearerConfirm] (IPv4) Received %d bytes from: %s:%d\n", msg_lengthP, m_ip_char_src, m_port_src); - }*/ - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_radio_bearer_id = m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("RRC\t-------ADD DATA RADIO BEARER CONFIRM------->\tRRM\n"); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("cell id = %d mobile id = %d radio bearer id = %d transaction id = %d \n", m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddRadioAccessBearerConfirm::Forward() -//---------------------------------------------------------------------------- -{ - try { - Transaction* tx = RadioResources::Instance()->Request(*this); - if (tx != NULL) { - delete tx; - } - } catch (std::exception const& e ) { - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddRadioAccessBearerConfirm::Serialize() -//---------------------------------------------------------------------------- -{ - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_ADD_RADIO_ACCESS_BEARER_CONFIRM); - m_message_storage.writeShort(7u); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_radio_bearer_id); - m_message_storage.writeChar(m_transaction_id); -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerConfirm::~RRC2RRMMessageAddRadioAccessBearerConfirm() -//---------------------------------------------------------------------------- -{ -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h deleted file mode 100755 index 9188f0a76e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerConfirm.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _RRC2RRMMESSAGEADDRADIOACCESSBEARERCONFIRM_H -# define _RRC2RRMMESSAGEADDRADIOACCESSBEARERCONFIRM_H - -# include "Message.h" -# include "storage.h" -# include "platform.h" - -class RRC2RRMMessageAddRadioAccessBearerConfirm: public Message -{ - -public: - RRC2RRMMessageAddRadioAccessBearerConfirm(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP); - RRC2RRMMessageAddRadioAccessBearerConfirm (tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - ~RRC2RRMMessageAddRadioAccessBearerConfirm (); - - void Serialize (); - void Forward(); - const unsigned int GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const rb_id_t GetRadioBearerId() { - return m_radio_bearer_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } - -private: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - rb_id_t m_radio_bearer_id; - transaction_id_t m_transaction_id; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp deleted file mode 100755 index 03b6add9fa..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include - -#include "RRC2RRMMessageAddRadioAccessBearerRequest.h" -#include "RRM2RRCMessageAddRadioAccessBearerResponse.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" - -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerRequest::RRC2RRMMessageAddRadioAccessBearerRequest(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - unsigned short traffic_classP, - unsigned short delayP, - unsigned int guaranted_bit_rate_uplinkP, - unsigned int max_bit_rate_uplinkP, - unsigned int guaranted_bit_rate_downlinkP, - unsigned int max_bit_rate_downlinkP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_traffic_class = traffic_classP; - m_delay = delayP; - m_guaranted_bit_rate_uplink = guaranted_bit_rate_uplinkP; - m_max_bit_rate_uplink = max_bit_rate_uplinkP; - m_guaranted_bit_rate_downlink = guaranted_bit_rate_downlinkP; - m_max_bit_rate_downlink = max_bit_rate_downlinkP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerRequest::RRC2RRMMessageAddRadioAccessBearerRequest(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP): -Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_radio_bearer_id = m_message_storage.readChar(); - m_traffic_class = m_message_storage.readShort(); - m_delay = m_message_storage.readShort(); - m_guaranted_bit_rate_uplink = m_message_storage.readInt(); - m_max_bit_rate_uplink = m_message_storage.readInt(); - m_guaranted_bit_rate_downlink = m_message_storage.readInt(); - m_max_bit_rate_downlink = m_message_storage.readInt(); - m_transaction_id = m_message_storage.readChar(); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("RRC\t-------ADD DATA RADIO BEARER REQUEST------->\tRRM\n"); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("cell id = %d mobile id = %d radio bearer id = %d transaction id = %d \n", m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddRadioAccessBearerRequest::Forward() -//---------------------------------------------------------------------------- -{ - try { - Transaction* tx = RadioResources::Instance()->Request(*this); - RRM2RRCMessageAddRadioAccessBearerResponse response(Message::STATUS_ADD_RADIO_ACCESS_BEARER_SUCCESSFULL, Message::MSG_RESP_OK, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id, tx); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (mobile_already_connected_error & x ) { - RRM2RRCMessageAddRadioAccessBearerResponse response(Message::STATUS_ADD_RADIO_ACCESS_BEARER_FAILED, Message::MSG_RESP_PROTOCOL_ERROR, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (std::exception const& e ) { - RRM2RRCMessageAddRadioAccessBearerResponse response(Message::STATUS_ADD_RADIO_ACCESS_BEARER_FAILED, Message::MSG_RESP_INTERNAL_ERROR, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddRadioAccessBearerRequest::Serialize() -//---------------------------------------------------------------------------- -{ - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_ADD_RADIO_ACCESS_BEARER_REQUEST); - m_message_storage.writeShort(27u); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_radio_bearer_id); - m_message_storage.writeShort(m_traffic_class); - m_message_storage.writeShort(m_delay); - m_message_storage.writeInt(m_guaranted_bit_rate_uplink); - m_message_storage.writeInt(m_max_bit_rate_uplink); - m_message_storage.writeInt(m_guaranted_bit_rate_downlink); - m_message_storage.writeInt( m_max_bit_rate_downlink); - m_message_storage.writeChar(m_transaction_id); -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddRadioAccessBearerRequest::~RRC2RRMMessageAddRadioAccessBearerRequest() -//---------------------------------------------------------------------------- -{ -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h deleted file mode 100755 index ef2acf2fd0..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddRadioAccessBearerRequest.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef _RRC2RRMMESSAGEADDRADIOACCESSBEARERREQUEST_H -# define _RRC2RRMMESSAGEADDRADIOACCESSBEARERREQUEST_H - -# include "Message.h" -# include "storage.h" -# include "platform.h" - -class RRC2RRMMessageAddRadioAccessBearerRequest: public Message -{ - -public: - RRC2RRMMessageAddRadioAccessBearerRequest(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - unsigned short traffic_classP, - unsigned short delayP, - unsigned int guaranted_bit_rate_uplinkP, - unsigned int max_bit_rate_uplinkP, - unsigned int guaranted_bit_rate_downlinkP, - unsigned int max_bit_rate_downlinkP, - transaction_id_t transaction_idP); - RRC2RRMMessageAddRadioAccessBearerRequest (tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - ~RRC2RRMMessageAddRadioAccessBearerRequest (); - - void Serialize (); - void Forward(); - const unsigned int GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const rb_id_t GetRadioBearerId() { - return m_radio_bearer_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } - - const unsigned short GetTrafficClass() { - return m_traffic_class; - } - const unsigned short GetDelay() { - return m_delay; - } - const unsigned int GetGuarantedBitRateUplink() { - return m_guaranted_bit_rate_uplink; - } - const unsigned int GetMaxBitRateUplink() { - return m_max_bit_rate_uplink; - } - const unsigned int GetGuarantedBitRateDownlink() { - return m_guaranted_bit_rate_downlink; - } - const unsigned int GetMaxBitRateDownlink() { - return m_max_bit_rate_downlink; - } - -private: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - rb_id_t m_radio_bearer_id; - unsigned short m_traffic_class; - unsigned short m_delay; - unsigned int m_guaranted_bit_rate_uplink; - unsigned int m_max_bit_rate_uplink; - unsigned int m_guaranted_bit_rate_downlink; - unsigned int m_max_bit_rate_downlink; - transaction_id_t m_transaction_id; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp deleted file mode 100755 index bf54929de7..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRC2RRMMessageAddUserConfirm.h" -#include "RRM2RRCMessageUserReconfiguration.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserConfirm::RRC2RRMMessageAddUserConfirm(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - m_asn1_message = asn1_messageP; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.c_RNTI; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserConfirm::RRC2RRMMessageAddUserConfirm(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_asn1_message = static_cast(CALLOC(1,sizeof(RRC_RRM_Message_t))); - memset(m_asn1_message, 0, sizeof(RRC_RRM_Message_t)); - m_asn1_message->message.present = RRC_RRM_MessageType_PR_c1; - m_asn1_message->message.choice.c1.present = RRC_RRM_MessageType__c1_PR_rrcAddUserConfirm; - m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.e_NodeB_Identity.physCellId = cell_idP; - m_asn1_message->message.choice.c1.choice.rrcAddUserConfirm.c_RNTI = mobile_idP; - - - m_transaction_id = transaction_idP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_msg_length = 0; - Serialize(); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddUserConfirm::Forward() -//---------------------------------------------------------------------------- -{ - try { - RRM2RRCMessageUserReconfiguration* user_reconfiguration = RadioResources::Instance()->Request(*this); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, user_reconfiguration->GetSerializedMessageBuffer(), user_reconfiguration->GetSerializedMessageSize()); - delete user_reconfiguration; - } catch (std::exception const& e ) { - RRM2RRCMessageUserReconfiguration response(OpenAir_RRM_Response_Status_failure, OpenAir_RRM_Response_Reason_internalError, m_cell_id, m_mobile_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddUserConfirm::Serialize () -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRC_RRM_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - cout << "[RRM][RRC2RRMMessageAddUserConfirm] asn_DEF_RRC_RRM_Message Encoded " << enc_rval.encoded << " bits (" << (enc_rval.encoded+7)/8 << " bytes)" << endl; - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - cerr << "[RRM][RRC2RRMMessageAddUserConfirm] ASN1 : asn_DEF_RRC_RRM_Message encoding FAILED, EXITING" << endl; - throw asn1_encoding_error(); - } - } -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserConfirm::~RRC2RRMMessageAddUserConfirm() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - cout << "[RRM][RRC2RRMMessageAddUserConfirm::~RRC2RRMMessageAddUserConfirm()] free asn1_message start" << endl; - ASN_STRUCT_FREE( asn_DEF_RRC_RRM_Message, m_asn1_message); - cout << "[RRM][RRC2RRMMessageAddUserConfirm::~RRC2RRMMessageAddUserConfirm()] free asn1_message end" << endl; - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h deleted file mode 100755 index 0520f2e842..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserConfirm.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef _RRC2RRMMESSAGEADDUSERCONFIRM_H -# define _RRC2RRMMESSAGEADDUSERCONFIRM_H - -# include "RRC-RRM-Message.h" -# include "Message.h" -# include "platform.h" - - -class RRC2RRMMessageAddUserConfirm: public Message -{ - -public: - RRC2RRMMessageAddUserConfirm(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP); - RRC2RRMMessageAddUserConfirm(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP); - ~RRC2RRMMessageAddUserConfirm (); - - void Serialize (); - void Forward(); - const cell_id_t GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } -private: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - RRC_RRM_Message_t *m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp deleted file mode 100755 index 23f1519a97..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.cpp +++ /dev/null @@ -1,90 +0,0 @@ -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRC2RRMMessageAddUserRequest.h" -#include "RRM2RRCMessageAddUserResponse.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" - -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserRequest::RRC2RRMMessageAddUserRequest(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - m_asn1_message = asn1_messageP; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.c_RNTI; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserRequest::RRC2RRMMessageAddUserRequest(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_asn1_message = static_cast(CALLOC(1,sizeof(RRC_RRM_Message_t))); - memset(m_asn1_message, 0, sizeof(RRC_RRM_Message_t)); - m_asn1_message->message.present = RRC_RRM_MessageType_PR_c1; - m_asn1_message->message.choice.c1.present = RRC_RRM_MessageType__c1_PR_rrcAddUserRequest; - m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.e_NodeB_Identity.physCellId = cell_idP; - m_asn1_message->message.choice.c1.choice.rrcAddUserRequest.c_RNTI = mobile_idP; - - - m_transaction_id = transaction_idP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_msg_length = 0; - Serialize(); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddUserRequest::Forward() -//---------------------------------------------------------------------------- -{ - try { - RRM2RRCMessageAddUserResponse* add_user_response = RadioResources::Instance()->Request(*this); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, add_user_response->GetSerializedMessageBuffer(), add_user_response->GetSerializedMessageSize()); - delete add_user_response; - } catch (mobile_already_connected_error & x ) { - RRM2RRCMessageAddUserResponse response(OpenAir_RRM_Response_Status_failure, OpenAir_RRM_Response_Reason_protocolError, m_cell_id, m_mobile_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (std::exception const& e ) { - RRM2RRCMessageAddUserResponse response(OpenAir_RRM_Response_Status_failure, OpenAir_RRM_Response_Reason_internalError, m_cell_id, m_mobile_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageAddUserRequest::Serialize () -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRC_RRM_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - printf("[RRM][RRC2RRMMessageConnectionRequest] asn_DEF_RRC_RRM_Message Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - printf("[RRM][RRC2RRMMessageConnectionRequest] ASN1 : asn_DEF_RRC_RRM_Message encoding FAILED, EXITING\n"); - throw asn1_encoding_error(); - } - } -} -//---------------------------------------------------------------------------- -RRC2RRMMessageAddUserRequest::~RRC2RRMMessageAddUserRequest() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - ASN_STRUCT_FREE( asn_DEF_RRC_RRM_Message, m_asn1_message); - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h deleted file mode 100755 index 484bfa14dd..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageAddUserRequest.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef _RRC2RRMMESSAGEADDUSERREQUEST_H -# define _RRC2RRMMESSAGEADDUSERREQUEST_H - -# include "RRC-RRM-Message.h" -# include "Message.h" -# include "platform.h" - -class RRC2RRMMessageAddUserRequest: public Message -{ - -public: - RRC2RRMMessageAddUserRequest(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP); - RRC2RRMMessageAddUserRequest(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP); - ~RRC2RRMMessageAddUserRequest (); - - void Serialize (); - void Forward(); - const cell_id_t GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } -private: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - RRC_RRM_Message_t *m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp deleted file mode 100755 index de659580cd..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include -#include -#include -#include - -#include "RRC2RRMMessageConnectionRequest.h" -#include "RRM2RRCMessageConnectionResponse.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "Utility.h" - -using namespace std; - -//---------------------------------------------------------------------------- -RRC2RRMMessageConnectionRequest::RRC2RRMMessageConnectionRequest(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - cout << "RRC2RRMMessageConnectionRequest(): m_ip_str_src = " << m_ip_str_src.c_str() << endl; - - m_asn1_message = asn1_messageP; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationRequest.transactionId; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageConnectionRequest::RRC2RRMMessageConnectionRequest(std::string ip_dest_strP, int port_destP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_asn1_message = static_cast(CALLOC(1,sizeof(RRC_RRM_Message_t))); - m_asn1_message->message.present = RRC_RRM_MessageType_PR_c1; - m_asn1_message->message.choice.c1.present = RRC_RRM_MessageType__c1_PR_rrcSystemConfigurationRequest; - m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationRequest.transactionId = transaction_idP; - - m_transaction_id = transaction_idP; - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_msg_length = 0; - Serialize(); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageConnectionRequest::Forward() -//---------------------------------------------------------------------------- -{ - try { - - RRM2RRCMessageConnectionResponse* connection_response = RadioResources::Instance()->Request(*this); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, connection_response->GetSerializedMessageBuffer(), connection_response->GetSerializedMessageSize()); - delete connection_response; - } catch (enodeb_already_connected_error & x ) { - RRM2RRCMessageConnectionResponse connection_response(OpenAir_RRM_Response_Status_failure, OpenAir_RRM_Response_Reason_protocolError); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, connection_response.GetSerializedMessageBuffer(), connection_response.GetSerializedMessageSize()); - } catch (std::exception const& e ) { - RRM2RRCMessageConnectionResponse connection_response(OpenAir_RRM_Response_Status_failure, OpenAir_RRM_Response_Reason_internalError); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, connection_response.GetSerializedMessageBuffer(), connection_response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageConnectionRequest::Serialize() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRC_RRM_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - printf("[RRM][RRC2RRMMessageConnectionRequest] asn_DEF_RRM_RRC_Message Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - printf("[RRM][RRC2RRMMessageConnectionRequest] ASN1 : asn_DEF_RRC_RRM_Message encoding FAILED, EXITING\n"); - throw asn1_encoding_error(); - } - } -} -//---------------------------------------------------------------------------- -RRC2RRMMessageConnectionRequest::~RRC2RRMMessageConnectionRequest() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - ASN_STRUCT_FREE( asn_DEF_RRC_RRM_Message, m_asn1_message); - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h deleted file mode 100755 index cafb77cbb6..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageConnectionRequest.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _RRC2RRMMESSAGECONNECTIONREQUEST_H -# define _RRC2RRMMESSAGECONNECTIONREQUEST_H - -# include "RRC-RRM-Message.h" -# include "Message.h" -# include "storage.h" -# include "platform.h" - -class RRC2RRMMessageConnectionRequest: public Message -{ - -public: - RRC2RRMMessageConnectionRequest(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP); - RRC2RRMMessageConnectionRequest (std::string ip_dest_strP, int port_destP, transaction_id_t transaction_idP); - ~RRC2RRMMessageConnectionRequest (); - - void Serialize (); - void Forward(); - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } -private: - //cell_id_t m_cell_id; - transaction_id_t m_transaction_id; - RRC_RRM_Message_t *m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp deleted file mode 100755 index 69a8104d75..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRC2RRMMessageRemoveRadioAccessBearerRequest.h" -#include "RRM2RRCMessageRemoveRadioAccessBearerResponse.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" - -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveRadioAccessBearerRequest::RRC2RRMMessageRemoveRadioAccessBearerRequest(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveRadioAccessBearerRequest::RRC2RRMMessageRemoveRadioAccessBearerRequest(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP): -Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_radio_bearer_id = m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("RRC\t-------REMOVE DATA RADIO BEARER REQUEST------->\tRRM\n"); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("cell id = %d mobile id = %d radio bearer id = %d transaction id = %d \n", m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageRemoveRadioAccessBearerRequest::Forward() -//---------------------------------------------------------------------------- -{ - try { - Transaction* tx = RadioResources::Instance()->Request(*this); - RRM2RRCMessageRemoveRadioAccessBearerResponse response(Message::STATUS_REMOVE_RADIO_ACCESS_BEARER_SUCCESSFULL, Message::MSG_RESP_OK, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id, tx); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (mobile_already_connected_error & x ) { - RRM2RRCMessageRemoveRadioAccessBearerResponse response(Message::STATUS_REMOVE_RADIO_ACCESS_BEARER_FAILED, Message::MSG_RESP_PROTOCOL_ERROR, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (std::exception const& e ) { - RRM2RRCMessageRemoveRadioAccessBearerResponse response(Message::STATUS_REMOVE_RADIO_ACCESS_BEARER_FAILED, Message::MSG_RESP_INTERNAL_ERROR, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageRemoveRadioAccessBearerRequest::Serialize() -//---------------------------------------------------------------------------- -{ - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_REMOVE_RADIO_ACCESS_BEARER_REQUEST); - m_message_storage.writeShort(7u); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_radio_bearer_id); - m_message_storage.writeChar(m_transaction_id); -} -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveRadioAccessBearerRequest::~RRC2RRMMessageRemoveRadioAccessBearerRequest() -//---------------------------------------------------------------------------- -{ -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h deleted file mode 100755 index 9a163627ee..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveRadioAccessBearerRequest.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef _RRC2RRMMESSAGEREMOVERADIOACCESSBEARERREQUEST_H -# define _RRC2RRMMESSAGEREMOVERADIOACCESSBEARERREQUEST_H - -# include "Message.h" -# include "storage.h" -# include "platform.h" - -class RRC2RRMMessageRemoveRadioAccessBearerRequest: public Message -{ - -public: - RRC2RRMMessageRemoveRadioAccessBearerRequest(std::string ip_dest_strP, - int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP); - - RRC2RRMMessageRemoveRadioAccessBearerRequest (tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - ~RRC2RRMMessageRemoveRadioAccessBearerRequest (); - - void Serialize (); - void Forward(); - - const unsigned int GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const rb_id_t GetRadioBearerId() { - return m_radio_bearer_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } -private: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - - transaction_id_t m_transaction_id; - rb_id_t m_radio_bearer_id; - unsigned short m_traffic_class; - unsigned short m_delay; - unsigned int m_guaranted_bit_rate_uplink; - unsigned int m_max_bit_rate_uplink; - unsigned int m_guaranted_bit_rate_downlink; - unsigned int m_max_bit_rate_downlink; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp deleted file mode 100755 index a63be6a307..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRC2RRMMessageRemoveUserRequest.h" -#include "RRM2RRCMessageRemoveUserResponse.h" -#include "RRCMessageHandler.h" -#include "RadioResources.h" -#include "Exceptions.h" - -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveUserRequest::RRC2RRMMessageRemoveUserRequest(std::string ip_dest_strP, int port_destP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveUserRequest::RRC2RRMMessageRemoveUserRequest(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP): -Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("RRC\t-------REMOVE USER REQUEST------->\tRRM\n"); - printf("----------------------------------------------------------------------------------------------------------\n"); - printf("cell id = %d mobile id = %d transaction id = %d \n", m_cell_id, m_mobile_id, m_transaction_id); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageRemoveUserRequest::Forward() -//---------------------------------------------------------------------------- -{ - try { - Transaction* tx = RadioResources::Instance()->Request(*this); - RRM2RRCMessageRemoveUserResponse response(Message::STATUS_REMOVE_USER_SUCCESSFULL, Message::MSG_RESP_OK, m_cell_id, m_mobile_id, m_transaction_id, tx); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (mobile_already_connected_error & x ) { - RRM2RRCMessageRemoveUserResponse response(Message::STATUS_REMOVE_USER_FAILED, Message::MSG_RESP_PROTOCOL_ERROR, m_cell_id, m_mobile_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } catch (std::exception const& e ) { - RRM2RRCMessageRemoveUserResponse response(Message::STATUS_REMOVE_USER_FAILED, Message::MSG_RESP_INTERNAL_ERROR, m_cell_id, m_mobile_id, m_transaction_id); - RRCMessageHandler::Instance()->Send2Peer(this->m_ip_str_src, this->m_port_src, response.GetSerializedMessageBuffer(), response.GetSerializedMessageSize()); - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageRemoveUserRequest::Serialize() -//---------------------------------------------------------------------------- -{ - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_REMOVE_USER_REQUEST); - m_message_storage.writeShort(6u); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_transaction_id); -} -//---------------------------------------------------------------------------- -RRC2RRMMessageRemoveUserRequest::~RRC2RRMMessageRemoveUserRequest() -//---------------------------------------------------------------------------- -{ -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h deleted file mode 100755 index 23a81a665a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageRemoveUserRequest.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef _RRC2RRMMESSAGEREMOVEUSERREQUEST_H -# define _RRC2RRMMESSAGEREMOVEUSERREQUEST_H - -# include "Message.h" -# include "storage.h" -# include "platform.h" - -class RRC2RRMMessageRemoveUserRequest: public Message -{ - -public: - RRC2RRMMessageRemoveUserRequest(std::string ip_dest_strP, int port_destP, - cell_id_t , - mobile_id_t , - transaction_id_t ); - - RRC2RRMMessageRemoveUserRequest (tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - - ~RRC2RRMMessageRemoveUserRequest (); - - void Serialize (); - void Forward(); - const unsigned int GetENodeBId() { - return 1u; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - } - -protected: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp deleted file mode 100755 index 13e31fbc55..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRC2RRMMessageUserReconfigurationComplete.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "Utility.h" -//---------------------------------------------------------------------------- -RRC2RRMMessageUserReconfigurationComplete::RRC2RRMMessageUserReconfigurationComplete(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - cout << "RRC2RRMMessageUserReconfigurationComplete(): m_ip_str_src = " << m_ip_str_src.c_str() << endl; - - m_asn1_message = asn1_messageP; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.c_RNTI; -} -//---------------------------------------------------------------------------- -RRC2RRMMessageUserReconfigurationComplete::RRC2RRMMessageUserReconfigurationComplete(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_asn1_message = static_cast(CALLOC(1,sizeof(RRC_RRM_Message_t))); - memset(m_asn1_message, 0, sizeof(RRC_RRM_Message_t)); - m_asn1_message->message.present = RRC_RRM_MessageType_PR_c1; - m_asn1_message->message.choice.c1.present = RRC_RRM_MessageType__c1_PR_rrcUserReconfigurationComplete; - m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.e_NodeB_Identity.physCellId = cell_idP; - m_asn1_message->message.choice.c1.choice.rrcUserReconfigurationComplete.c_RNTI = mobile_idP; - - - m_transaction_id = transaction_idP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_is_ipv6 = Utility::isipv6(ip_dest_strP); - m_msg_length = 0; - Serialize(); -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageUserReconfigurationComplete::Forward() -//---------------------------------------------------------------------------- -{ - try { - RadioResources::Instance()->Request(*this); - } catch (std::exception const& e ) { - - } -} -//---------------------------------------------------------------------------- -void RRC2RRMMessageUserReconfigurationComplete::Serialize() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - //xer_fprint(stdout, &asn_DEF_RRC_RRM_Message, (void*)m_asn1_message); - char errbuf[256]; - size_t errlen = sizeof(errbuf); - int ret = asn_check_constraints(&asn_DEF_RRC_RRM_Message, m_asn1_message, errbuf, &errlen); - if (ret) { - fprintf(stderr, "CONSTRAINT VALIDATION FAILED FOR RRM-RRC Message: %s\n", errbuf); - exit (-1); - } - - - - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRC_RRM_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - printf("[RRM][RRC2RRMMessageUserReconfigurationComplete] asn_DEF_RRC_RRM_Message Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - cerr << "[RRM][RRC2RRMMessageUserReconfigurationComplete] ASN1 : asn_DEF_RRC_RRM_Message encoding FAILED, EXITING" << endl; - cerr << "[RRM][RRC2RRMMessageUserReconfigurationComplete] Cannot encode "<< enc_rval.failed_type->name <<" " << strerror(errno) << endl; - throw asn1_encoding_error(); - } - //xer_fprint(stdout, &asn_DEF_RRC_RRM_Message, (void*)m_asn1_message); - } -} -//---------------------------------------------------------------------------- -RRC2RRMMessageUserReconfigurationComplete::~RRC2RRMMessageUserReconfigurationComplete() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - cout << "[RRM][RRC2RRMMessageUserReconfigurationComplete::~RRC2RRMMessageUserReconfigurationComplete()] free asn1_message start" << endl; - ASN_STRUCT_FREE( asn_DEF_RRC_RRM_Message, m_asn1_message); - m_asn1_message = NULL; - cout << "[RRM][RRC2RRMMessageUserReconfigurationComplete::~RRC2RRMMessageUserReconfigurationComplete()] free asn1_message end " << endl; - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h deleted file mode 100755 index 6711dcb3a6..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRC2RRMMessageUserReconfigurationComplete.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _RRC2RRMMESSAGEUSERRECONFIGURATIONCOMPLETE_H -# define _RRC2RRMMESSAGEUSERRECONFIGURATIONCOMPLETE_H - -# include "RRC-RRM-Message.h" -# include "Message.h" -# include "platform.h" - -class RRC2RRMMessageUserReconfigurationComplete: public Message -{ - -public: - RRC2RRMMessageUserReconfigurationComplete(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRC_RRM_Message_t* asn1_messageP); - RRC2RRMMessageUserReconfigurationComplete(std::string ip_dest_strP, int port_destP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP); - ~RRC2RRMMessageUserReconfigurationComplete (); - - void Serialize (); - void Forward(); - - const cell_id_t GetENodeBId() { - return m_cell_id; - } - mobile_id_t GetMobileId() { - return m_mobile_id; - }; - transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - - RRC_RRM_Message_t* m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp deleted file mode 100755 index 60cf352a9a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include -#include "RRCMessageHandler.h" - - -RRCMessageHandler* RRCMessageHandler::s_instance = 0; - -//---------------------------------------------------------------------------- -void* RRCMessageHandlerThreadLoop(void *arg) -//---------------------------------------------------------------------------- -{ - - return RRCMessageHandler::Instance()->ThreadLoop(arg); -} -//----------------------------------------------------------------- -RRCMessageHandler* RRCMessageHandler::Instance() -//----------------------------------------------------------------- -{ - if (RRCMessageHandler::s_instance == 0) { - RRCMessageHandler::s_instance = new RRCMessageHandler; - } - return s_instance; -} -//----------------------------------------------------------------- -RRCMessageHandler::RRCMessageHandler() -//----------------------------------------------------------------- -{ - m_socket_handler = new SocketHandler(); - m_log = new StdoutLog() ; - m_socket_handler->RegStdLog(m_log); - - m_socket = new RRCUdpSocket(*m_socket_handler, 16384, true); - port_t port = 33333; - Ipv6Address ad("0::1", port); - if (m_socket->Bind(ad, 1) == -1) { - printf("Exiting...\n"); - exit(-1); - } else { - printf("Ready to receive on port %d\n",port); - } - m_socket_handler->Add(m_socket); - - if (pthread_create(&m_thread, NULL, RRCMessageHandlerThreadLoop, (void *) NULL) != 0) { - fprintf(stderr, "\nRRCMessageHandler::RRCMessageHandler() ERROR pthread_create...\n"); - } else { - pthread_setname_np( m_thread, "RRCMsgHandler" ); - } -} -//---------------------------------------------------------------------------- -void* RRCMessageHandler::ThreadLoop(void *arg) -//---------------------------------------------------------------------------- -{ - - m_socket_handler->Select(1,0); - - while (m_socket_handler->GetCount() && !*m_quit) { - m_socket_handler->Select(1,0); - } - fprintf(stderr, "\nRRCMessageHandler::ThreadLoop Exiting...\n"); - return NULL; -} -//---------------------------------------------------------------------------- -void RRCMessageHandler::Join(bool *quitP) -//---------------------------------------------------------------------------- -{ - m_quit = quitP; - - pthread_join(m_thread, NULL); - fprintf(stderr, "\nRRCMessageHandler::Join Done\n"); -} - -//---------------------------------------------------------------------------- -void RRCMessageHandler::NotifyRxData(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//---------------------------------------------------------------------------- -{ - Message* message; - do { - //message = Message::Deserialize(in_bufferP, size_dataP, sa_fromP, sa_lenP); - message = Message::DeserializeRRCMessage(in_bufferP, size_dataP, sa_fromP, sa_lenP); - if (message != NULL) { - //fprintf(stderr, "RRCMessageHandler::notifyRxData GOT MESSAGE\n"); - message->Forward(); - delete message; - message = NULL; - } else { - // TO DO - } - } while (message != NULL); -} -//----------------------------------------------------------------- -void RRCMessageHandler::Send2Peer(Message* messageP) -//----------------------------------------------------------------- -{ - Send2Peer(messageP->GetSrcAddress(), messageP->GetSrcPort(), messageP->GetSerializedMessageBuffer(), messageP->GetSerializedMessageSize()); - delete messageP; -} -//----------------------------------------------------------------- -void RRCMessageHandler::Send2Peer(std::string ip_dest_strP, int port_destP, const char *in_bufferP, msg_length_t size_dataP) -//----------------------------------------------------------------- -{ - std::string lo_bad_address("1"); - std::string lo_good_address("0::1"); - if (ip_dest_strP.compare(lo_bad_address) != 0) { - m_socket->SendToBuf(ip_dest_strP, port_destP, in_bufferP, size_dataP, 0); - } else { - m_socket->SendToBuf(lo_good_address, port_destP, in_bufferP, size_dataP, 0); - } -} -//----------------------------------------------------------------- -RRCMessageHandler::~RRCMessageHandler() -//----------------------------------------------------------------- -{ - if (m_socket_handler != 0) - { - delete m_socket_handler; - } - if (m_log != 0) - { - delete m_log; - } - // m_socket should be closed and deleted by m_socket_handler -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h deleted file mode 100755 index 9e50de04a9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCMessageHandler.h +++ /dev/null @@ -1,36 +0,0 @@ -# ifndef _RRCMESSAGEHANDLER_H -# define _RRCMESSAGEHANDLER_H - -# include - -# include "StdoutLog.h" -# include "SocketHandlerEp.h" -# include "RRCUdpSocket.h" -# include "ListenSocket.h" -# include "Message.h" -# include "platform.h" - - -class RRCMessageHandler -{ -public: - static RRCMessageHandler *Instance (); - void NotifyRxData (const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP); - void Send2Peer (Message *); - void Send2Peer(std::string ip_dest_strP, int port_destP, const char *in_bufferP, msg_length_t size_dataP); - void* ThreadLoop(void *arg); - void Join(bool *quitP); - ~RRCMessageHandler (); - -private: - RRCMessageHandler (); - - SocketHandler *m_socket_handler; - RRCUdpSocket *m_socket; - StdoutLog *m_log; - pthread_t m_thread; - bool *m_quit; - static RRCMessageHandler *s_instance; -}; -# endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp deleted file mode 100755 index 2f56c25025..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -#include "RRCUdpSocket.h" -#include "RRCMessageHandler.h" - - -RRCUdpSocket::RRCUdpSocket(ISocketHandler& h,int ibufsz, bool ipv6) -:UdpSocket(h, ibufsz, ipv6) -{ -} - - -void RRCUdpSocket::OnRawData(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -{ - RRCMessageHandler::Instance()->NotifyRxData(in_bufferP, size_dataP, sa_fromP, sa_lenP); -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h deleted file mode 100755 index 0270b911b9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRCUdpSocket.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _RRCUDPSOCKET_H -#define _RRCUDPSOCKET_H - -#include "UdpSocket.h" - - -class RRCUdpSocket : public UdpSocket -{ -public: - RRCUdpSocket(ISocketHandler&,int ibufsz, bool ipv6); - - void OnRawData(const char *,size_t,struct sockaddr *,socklen_t); -}; - - -#endif // _RRCUDPSOCKET_H diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp deleted file mode 100755 index 5dfe3b52f1..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageAddRadioAccessBearerResponse.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageAddRadioAccessBearerResponse::RRM2RRCMessageAddRadioAccessBearerResponse(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP):Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_status = m_message_storage.readChar(); - m_reason = m_message_storage.readChar(); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_radio_bearer_id= m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - m_transaction_result = NULL; - cout << "----------------------------------------------------------------------------------------------------------" << endl; - cout << "RRC\t<-------ADD DATA RADIO BEARER RESPONSE-------\tRRM STATUS: "<< Message::StatusToString(m_status).c_str() << " REASON: "<< Message::ReasonToString(m_reason).c_str() << endl; - cout << "----------------------------------------------------------------------------------------------------------" << endl; - cout << "cell id = " << m_cell_id << " mobile id = " << m_mobile_id << " radio bearer id = "<< m_radio_bearer_id << " transaction id = "<< m_transaction_id << endl; - if ((msg_lengthP - 6) > 0 ) { - m_transaction_result = new Transaction(m_transaction_id, m_message_storage, msg_lengthP - 6); - cout << m_transaction_result->ToString().c_str() << endl; - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageAddRadioAccessBearerResponse::RRM2RRCMessageAddRadioAccessBearerResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRM2RRCMessageAddRadioAccessBearerResponse::RRM2RRCMessageAddRadioAccessBearerResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP, - Transaction* transactionP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; - m_transaction_result = transactionP; -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageAddRadioAccessBearerResponse::Serialize () -//---------------------------------------------------------------------------- -{ - //printf("[RRM][RRM2RRCMessageAddRadioAccessBearerResponse] Serialize () status = %d reason = %d cell id = %d mobile id = %d radio bearer id = %d transaction id = %d \n", m_status, m_reason, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - int tx_packet_size = 0; - if (m_transaction_result != NULL) { - tx_packet_size = m_transaction_result->Size(); - } - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_ADD_RADIO_ACCESS_BEARER_RESPONSE); - m_message_storage.writeShort(9u+tx_packet_size); - m_message_storage.writeChar(m_status); - m_message_storage.writeChar(m_reason); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_radio_bearer_id); - m_message_storage.writeChar(m_transaction_id); - if (m_transaction_result != NULL) { - unsigned char packet[tx_packet_size]; - m_transaction_result->Serialize(&packet[0]); - m_message_storage.writePacket(&packet[0], tx_packet_size); - } -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageAddRadioAccessBearerResponse::Forward() -//---------------------------------------------------------------------------- -{ - #ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); - #endif -} -//---------------------------------------------------------------------------- -RRM2RRCMessageAddRadioAccessBearerResponse::~RRM2RRCMessageAddRadioAccessBearerResponse() -//---------------------------------------------------------------------------- -{ - if (m_transaction_result != NULL) { - delete m_transaction_result; - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h deleted file mode 100755 index ca8a2f576f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddRadioAccessBearerResponse.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef _RRM2RRCMESSAGEADDRADIOACCESSBEARERRESPONSE_H -# define _RRM2RRCMESSAGEADDRADIOACCESSBEARERRESPONSE_H - -# include "Message.h" -# include "platform.h" -# include "Transaction.h" - -class RRM2RRCMessageAddRadioAccessBearerResponse: public Message -{ - -public: - RRM2RRCMessageAddRadioAccessBearerResponse(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - RRM2RRCMessageAddRadioAccessBearerResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - rb_id_t , - transaction_id_t ); - - RRM2RRCMessageAddRadioAccessBearerResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - rb_id_t , - transaction_id_t , - Transaction*); - - ~RRM2RRCMessageAddRadioAccessBearerResponse (); - - void Serialize (); - void Forward(); - - msg_response_status_t GetStatus() { - return m_status; - }; - msg_response_reason_t GetReason() { - return m_reason; - }; - cell_id_t GetENodeBId() { - return m_cell_id; - }; - mobile_id_t GetMobileId() { - return m_mobile_id; - }; - rb_id_t GetRadioBearerId() { - return m_radio_bearer_id; - }; - transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - rb_id_t m_radio_bearer_id; - transaction_id_t m_transaction_id; - Transaction* m_transaction_result; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp deleted file mode 100755 index 58d0c2542e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageAddUserResponse.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageAddUserResponse::RRM2RRCMessageAddUserResponse(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - cout << "RRM2RRCMessageAddUserResponse(): m_ip_str_src = " << m_ip_str_src.c_str() << endl; - - m_asn1_message = asn1_messageP; - m_status = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.rrm_Response_Status; - m_reason = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.rrm_Response_Reason; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.c_RNTI; -} - -//---------------------------------------------------------------------------- -RRM2RRCMessageAddUserResponse::RRM2RRCMessageAddUserResponse(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_transaction_id = transaction_idP; - - m_asn1_message = asn1_messageP; - m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.rrm_Response_Status = statusP; - m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.rrm_Response_Reason = reasonP; - - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcAddUserResponse.c_RNTI; - Serialize(); -} -//---------------------------------------------------------------------------- -RRM2RRCMessageAddUserResponse::RRM2RRCMessageAddUserResponse(msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageAddUserResponse::Forward() -//---------------------------------------------------------------------------- -{ - #ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); - #endif -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageAddUserResponse::Serialize() -//---------------------------------------------------------------------------- -{ - - if (m_asn1_message != NULL) { - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - char errbuf[128]; - size_t errlen = sizeof(errbuf); - int ret = asn_check_constraints(&asn_DEF_RRM_RRC_Message, m_asn1_message, errbuf, &errlen); - if (ret) { - fprintf(stderr, "CONSTRAINT VALIDATION FAILED FOR RRM-RRC Message: %s\n", errbuf); - exit (-1); - } - - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRM_RRC_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - printf("[RRM][RRM2RRCMessageAddUserResponse] asn_DEF_RRM_RRC_Message Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - printf("[RRM][RRM2RRCMessageAddUserResponse] ASN1 : asn_DEF_RRM_RRC_Message encoding FAILED, EXITING\n"); - throw asn1_encoding_error(); - } - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageAddUserResponse::~RRM2RRCMessageAddUserResponse() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - ASN_STRUCT_FREE( asn_DEF_RRM_RRC_Message, m_asn1_message); - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h deleted file mode 100755 index f343ca7a02..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageAddUserResponse.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef _RRM2RRCMESSAGEADDUSERRESPONSE_H -# define _RRM2RRCMESSAGEADDUSERRESPONSE_H - -# include "RRM-RRC-Message.h" -# include "Message.h" -# include "platform.h" - -class RRM2RRCMessageAddUserResponse: public Message -{ - -public: - RRM2RRCMessageAddUserResponse(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageAddUserResponse(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageAddUserResponse(msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP); - ~RRM2RRCMessageAddUserResponse (); - - void Serialize (); - void Forward(); - - msg_response_status_t GetStatus() { - return m_status; - }; - msg_response_reason_t GetReason() { - return m_reason; - }; - const cell_id_t GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - }; - const transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - - RRM_RRC_Message_t* m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp deleted file mode 100755 index b93670ffaa..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageConnectionResponse.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageConnectionResponse::RRM2RRCMessageConnectionResponse(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - cout << "RRM2RRCMessageConnectionResponse(): m_ip_str_src = " << m_ip_str_src.c_str() << endl; - - m_asn1_message = asn1_messageP; - m_status = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.rrm_Response_Status; - m_reason = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.rrm_Response_Reason; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.e_NodeB_Identity.physCellId; -} - -//---------------------------------------------------------------------------- -RRM2RRCMessageConnectionResponse::RRM2RRCMessageConnectionResponse(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_transaction_id = transaction_idP; - - m_asn1_message = asn1_messageP; - m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.rrm_Response_Status = statusP; - m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.rrm_Response_Reason = reasonP; - - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcSystemConfigurationResponse.e_NodeB_Identity.physCellId; - Serialize(); -} -//---------------------------------------------------------------------------- -RRM2RRCMessageConnectionResponse::RRM2RRCMessageConnectionResponse(msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageConnectionResponse::Forward() -//---------------------------------------------------------------------------- -{ - cout << "[RRM][RRM2RRCMessageConnectionResponse] status = " << m_status << " reason = " << m_reason << " cell id = " << m_cell_id << endl; -#ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); -#endif -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageConnectionResponse::Serialize() -//---------------------------------------------------------------------------- -{ - - if (m_asn1_message != NULL) { - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - char errbuf[128]; - size_t errlen = sizeof(errbuf); - int ret = asn_check_constraints(&asn_DEF_RRM_RRC_Message, m_asn1_message, errbuf, &errlen); - if (ret) { - cerr << "[RRM][RRM2RRCMessageConnectionResponse] CONSTRAINT VALIDATION FAILED FOR RRM-RRC Message: " << errbuf << endl; - exit (-1); - } - - - - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRM_RRC_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - cout << "[RRM][RRM2RRCMessageConnectionResponse] asn_DEF_RRM_RRC_Message Encoded " << enc_rval.encoded << " bits (" << (enc_rval.encoded+7)/8 << " bytes)" << endl; - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - cout << "[RRM][RRM2RRCMessageConnectionResponse] ASN1 : asn_DEF_RRM_RRC_Message encoding FAILED, EXITING" << endl; - throw asn1_encoding_error(); - } - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageConnectionResponse::~RRM2RRCMessageConnectionResponse() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - ASN_STRUCT_FREE( asn_DEF_RRM_RRC_Message, m_asn1_message); - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h deleted file mode 100755 index 28c781b920..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageConnectionResponse.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef _RRM2RRCMESSAGECONNECTIONRESPONSE_H -# define _RRM2RRCMESSAGECONNECTIONRESPONSE_H - -# include "RRM-RRC-Message.h" -# include "Message.h" -# include "platform.h" - -class RRM2RRCMessageConnectionResponse: public Message -{ - -public: - RRM2RRCMessageConnectionResponse(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageConnectionResponse(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageConnectionResponse (msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP=-1); - ~RRM2RRCMessageConnectionResponse (); - - void Serialize (); - void Forward(); - const msg_response_status_t GetStatus() { - return m_status; - }; - const msg_response_reason_t GetReason() { - return m_reason; - }; - const cell_id_t GetENodeBId() { - return m_cell_id; - } - const transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - cell_id_t m_cell_id; - transaction_id_t m_transaction_id; - - RRM_RRC_Message_t* m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp deleted file mode 100755 index 7c6c0dafae..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageRemoveRadioAccessBearerResponse.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveRadioAccessBearerResponse::RRM2RRCMessageRemoveRadioAccessBearerResponse(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP):Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_status = m_message_storage.readChar(); - m_reason = m_message_storage.readChar(); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_radio_bearer_id = m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - m_transaction_result = NULL; - cout << "----------------------------------------------------------------------------------------------------------" << endl; - cout << "RRC\t<-------REMOVE DATA RADIO BEARER RESPONSE-------\tRRM STATUS: "<< Message::StatusToString(m_status).c_str() << " REASON: "<< Message::ReasonToString(m_reason).c_str() << endl; - cout << "----------------------------------------------------------------------------------------------------------" << endl; - cout << "cell id = " << m_cell_id << " mobile id = " << m_mobile_id << " radio bearer id = "<< m_radio_bearer_id << " transaction id = "<< m_transaction_id << endl; - if ((msg_lengthP - 6) > 0 ) { - m_transaction_result = new Transaction(m_transaction_id, m_message_storage, msg_lengthP - 6); - cout << m_transaction_result->ToString().c_str() << endl; - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveRadioAccessBearerResponse::RRM2RRCMessageRemoveRadioAccessBearerResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveRadioAccessBearerResponse::RRM2RRCMessageRemoveRadioAccessBearerResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - rb_id_t radio_bearer_idP, - transaction_id_t transaction_idP, - Transaction* transactionP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_radio_bearer_id = radio_bearer_idP; - m_transaction_id = transaction_idP; - m_transaction_result = transactionP; -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageRemoveRadioAccessBearerResponse::Serialize () -//---------------------------------------------------------------------------- -{ -// printf("[RRM][RRM2RRCMessageRemoveRadioAccessBearerResponse] Serialize () status = %d reason = %d cell id = %d mobile id = %d radio bearer id = %d transaction id = %d \n", m_status, m_reason, m_cell_id, m_mobile_id, m_radio_bearer_id, m_transaction_id); - int tx_packet_size = 0; - if (m_transaction_result != NULL) { - tx_packet_size = m_transaction_result->Size(); - } - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_REMOVE_RADIO_ACCESS_BEARER_RESPONSE); - m_message_storage.writeShort(9u+tx_packet_size); - m_message_storage.writeChar(m_status); - m_message_storage.writeChar(m_reason); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_radio_bearer_id); - m_message_storage.writeChar(m_transaction_id); - if (m_transaction_result != NULL) { - unsigned char packet[tx_packet_size]; - m_transaction_result->Serialize(&packet[0]); - m_message_storage.writePacket(&packet[0], tx_packet_size); - } -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageRemoveRadioAccessBearerResponse::Forward() -//---------------------------------------------------------------------------- -{ - #ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); - #endif -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveRadioAccessBearerResponse::~RRM2RRCMessageRemoveRadioAccessBearerResponse() -//---------------------------------------------------------------------------- -{ - if (m_transaction_result != NULL) { - delete m_transaction_result; - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h deleted file mode 100755 index 00da34423e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveRadioAccessBearerResponse.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef _RRM2RRCMESSAGEREMOVERADIOACCESSBEARERRESPONSE_H -# define _RRM2RRCMESSAGEREMOVERADIOACCESSBEARERRESPONSE_H - -# include "Message.h" -# include "platform.h" -# include "Transaction.h" - -class RRM2RRCMessageRemoveRadioAccessBearerResponse: public Message -{ - -public: - RRM2RRCMessageRemoveRadioAccessBearerResponse(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP); - RRM2RRCMessageRemoveRadioAccessBearerResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - rb_id_t , - transaction_id_t ); - RRM2RRCMessageRemoveRadioAccessBearerResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - rb_id_t , - transaction_id_t , - Transaction* ); - - - ~RRM2RRCMessageRemoveRadioAccessBearerResponse (); - - void Serialize (); - void Forward(); - - msg_response_status_t GetStatus() { - return m_status; - }; - msg_response_reason_t GetReason() { - return m_reason; - }; - cell_id_t GetENodeBId() { - return m_cell_id; - }; - mobile_id_t GetMobileId() { - return m_mobile_id; - }; - rb_id_t GetRadioBearerId() { - return m_radio_bearer_id; - }; - transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - rb_id_t m_radio_bearer_id; - transaction_id_t m_transaction_id; - Transaction* m_transaction_result; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp deleted file mode 100755 index 83e703c1fa..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageRemoveUserResponse.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveUserResponse::RRM2RRCMessageRemoveUserResponse(tcpip::Storage& in_messageP, msg_length_t msg_lengthP, frame_t msg_frameP, struct sockaddr *sa_fromP, socklen_t sa_lenP):Message(in_messageP) -//---------------------------------------------------------------------------- -{ - ParseIpParameters(sa_fromP, sa_lenP); - m_status = m_message_storage.readChar(); - m_reason = m_message_storage.readChar(); - m_cell_id = m_message_storage.readChar(); - m_mobile_id = m_message_storage.readChar(); - m_transaction_id = m_message_storage.readChar(); - m_transaction_result = NULL; - cout << "----------------------------------------------------------------------------------------------------------" << endl; - cout << "RRC\t<-------REMOVE USER RESPONSE-------\tRRM STATUS: " << Message::StatusToString(m_status).c_str() << " REASON: " << Message::ReasonToString(m_reason).c_str() << endl; - cout << "----------------------------------------------------------------------------------------------------------"<< endl; - cout << "cell id = "<< m_cell_id << " mobile id = " << m_mobile_id << " transaction id = " << m_transaction_id << endl; - if ((msg_lengthP - 5) > 0 ) { - m_transaction_result = new Transaction(m_transaction_id, m_message_storage, msg_lengthP - 5); - printf("%s\n",m_transaction_result->ToString().c_str()); - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveUserResponse::RRM2RRCMessageRemoveUserResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveUserResponse::RRM2RRCMessageRemoveUserResponse(msg_response_status_t statusP, - msg_response_reason_t reasonP, - cell_id_t cell_idP, - mobile_id_t mobile_idP, - transaction_id_t transaction_idP, - Transaction* transactionP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_transaction_id = transaction_idP; - m_transaction_result = transactionP; -} - -//---------------------------------------------------------------------------- -void RRM2RRCMessageRemoveUserResponse::Serialize () -//---------------------------------------------------------------------------- -{ -// printf("[RRM][RRM2RRCMessageRemoveUserResponse] Serialize () status = %d reason = %d cell id = %d mobile id = %d transaction id = %d \n", m_status, m_reason, m_cell_id, m_mobile_id, m_transaction_id); - int tx_packet_size = 0; - if (m_transaction_result != NULL) { - tx_packet_size = m_transaction_result->Size(); - } - m_message_storage.reset(); - m_message_storage.writeChar(Message::MESSAGE_REMOVE_USER_RESPONSE); - m_message_storage.writeShort(8u+tx_packet_size); - m_message_storage.writeChar(m_status); - m_message_storage.writeChar(m_reason); - m_message_storage.writeChar(m_cell_id); - m_message_storage.writeChar(m_mobile_id); - m_message_storage.writeChar(m_transaction_id); - if (m_transaction_result != NULL) { - unsigned char packet[tx_packet_size]; - m_transaction_result->Serialize(&packet[0]); - m_message_storage.writePacket(&packet[0], tx_packet_size); - } -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageRemoveUserResponse::Forward() -//---------------------------------------------------------------------------- -{ - #ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); - #endif -} -//---------------------------------------------------------------------------- -RRM2RRCMessageRemoveUserResponse::~RRM2RRCMessageRemoveUserResponse() -//---------------------------------------------------------------------------- -{ - if (m_transaction_result != NULL) { - delete m_transaction_result; - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h deleted file mode 100755 index 93e4bc625b..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageRemoveUserResponse.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef _RRM2RRCMESSAGEREMOVEUSERRESPONSE_H -# define _RRM2RRCMESSAGEREMOVEUSERRESPONSE_H - -# include "Message.h" -# include "platform.h" -# include "Transaction.h" - -class RRM2RRCMessageRemoveUserResponse: public Message -{ - -public: - RRM2RRCMessageRemoveUserResponse(tcpip::Storage& in_messageP, - msg_length_t msg_lengthP, - frame_t msg_frameP, - struct sockaddr *sa_fromP, - socklen_t sa_lenP); - - RRM2RRCMessageRemoveUserResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - transaction_id_t ); - - RRM2RRCMessageRemoveUserResponse(msg_response_status_t , - msg_response_reason_t , - cell_id_t , - mobile_id_t , - transaction_id_t , - Transaction* ); - - ~RRM2RRCMessageRemoveUserResponse (); - - void Serialize (); - void Forward(); - - msg_response_status_t GetStatus() { - return m_status; - }; - msg_response_reason_t GetReason() { - return m_reason; - }; - cell_id_t GetENodeBId() { - return m_cell_id; - }; - mobile_id_t GetMobileId() { - return m_mobile_id; - }; - transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -private: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - Transaction* m_transaction_result; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp deleted file mode 100755 index a6b292cadc..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include -#include -#include -#include -#include -//---------------------------------------------------------------------------- -#include "RRM2RRCMessageUserReconfiguration.h" -#include "RadioResources.h" -#include "Exceptions.h" -#include "TestScenario.h" -//---------------------------------------------------------------------------- -RRM2RRCMessageUserReconfiguration::RRM2RRCMessageUserReconfiguration(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - ParseIpParameters(sa_fromP, sa_lenP); - cout << "RRM2RRCMessageUserReconfiguration(): m_ip_str_src = " << m_ip_str_src.c_str() << endl; - - m_asn1_message = asn1_messageP; - m_status = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.rrm_Response_Status; - m_reason = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.rrm_Response_Reason; - m_transaction_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.transactionId; - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.c_RNTI; -} - -//---------------------------------------------------------------------------- -RRM2RRCMessageUserReconfiguration::RRM2RRCMessageUserReconfiguration(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_transaction_id = transaction_idP; - - m_asn1_message = asn1_messageP; - m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.transactionId = transaction_idP; - m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.rrm_Response_Status = statusP; - m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.rrm_Response_Reason = reasonP; - - m_cell_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.e_NodeB_Identity.physCellId; - m_mobile_id = m_asn1_message->message.choice.c1.choice.rrcUserReconfiguration.c_RNTI; - Serialize(); -} -//---------------------------------------------------------------------------- -RRM2RRCMessageUserReconfiguration::RRM2RRCMessageUserReconfiguration(msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP) -//---------------------------------------------------------------------------- -{ - Message(); - m_status = statusP; - m_reason = reasonP; - m_cell_id = cell_idP; - m_mobile_id = mobile_idP; - m_transaction_id = transaction_idP; -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageUserReconfiguration::Forward() -//---------------------------------------------------------------------------- -{ - #ifdef TEST_SCENARIO - TestScenario::notifyRxMessage(this); - #endif -} -//---------------------------------------------------------------------------- -void RRM2RRCMessageUserReconfiguration::Serialize() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - char errbuf[256]; - size_t errlen = sizeof(errbuf); - int ret = asn_check_constraints(&asn_DEF_RRM_RRC_Message, m_asn1_message, errbuf, &errlen); - if (ret) { - fprintf(stderr, "CONSTRAINT VALIDATION FAILED FOR RRM-RRC Message: %s\n", errbuf); - exit (-1); - } - - - - asn_enc_rval_t enc_rval; - memset(&m_message_serialize_buffer[0], 0, MESSAGE_SERIALIZE_BUFFER_SIZE); - enc_rval = uper_encode_to_buffer(&asn_DEF_RRM_RRC_Message, - (void*)m_asn1_message, - &m_message_serialize_buffer[0], - MESSAGE_SERIALIZE_BUFFER_SIZE); - printf("[RRM][RRM2RRCMessageUserReconfiguration] asn_DEF_RRM_RRC_Message Encoded %d bits (%d bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8); - - m_msg_length = (enc_rval.encoded+7)/8; - - if (enc_rval.encoded==-1) { - cerr << "[RRM][RRM2RRCMessageUserReconfiguration] ASN1 : asn_DEF_RRM_RRC_Message encoding FAILED, EXITING" << endl; - cerr << "[RRM][RRM2RRCMessageUserReconfiguration] Cannot encode "<< enc_rval.failed_type->name <<" " << strerror(errno) << endl; - throw asn1_encoding_error(); - } - //xer_fprint(stdout, &asn_DEF_RRM_RRC_Message, (void*)m_asn1_message); - } -} -//---------------------------------------------------------------------------- -RRM2RRCMessageUserReconfiguration::~RRM2RRCMessageUserReconfiguration() -//---------------------------------------------------------------------------- -{ - if (m_asn1_message != NULL) { - cout << "[RRM][RRM2RRCMessageUserReconfiguration::~RRM2RRCMessageUserReconfiguration()] free asn1_message start" << endl; - ASN_STRUCT_FREE( asn_DEF_RRM_RRC_Message, m_asn1_message); - m_asn1_message = NULL; - cout << "[RRM][RRM2RRCMessageUserReconfiguration::~RRM2RRCMessageUserReconfiguration()] free asn1_message end " << endl; - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h b/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h deleted file mode 100755 index 830321a730..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrc/RRM2RRCMessageUserReconfiguration.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef _RRM2RRCMESSAGEUSERRECONFIGURATION_H -# define _RRM2RRCMESSAGEUSERRECONFIGURATION_H - -# include "RRM-RRC-Message.h" -# include "Message.h" -# include "platform.h" - -class RRM2RRCMessageUserReconfiguration: public Message -{ - -public: - RRM2RRCMessageUserReconfiguration(struct sockaddr *sa_fromP, socklen_t sa_lenP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageUserReconfiguration(transaction_id_t transaction_idP, msg_response_status_t statusP, msg_response_reason_t reasonP, RRM_RRC_Message_t* asn1_messageP); - RRM2RRCMessageUserReconfiguration(msg_response_status_t statusP, msg_response_reason_t reasonP, cell_id_t cell_idP, mobile_id_t mobile_idP, transaction_id_t transaction_idP); - ~RRM2RRCMessageUserReconfiguration (); - - void Serialize (); - void Forward(); - - msg_response_status_t GetStatus() { - return m_status; - }; - msg_response_reason_t GetReason() { - return m_reason; - }; - const cell_id_t GetENodeBId() { - return m_cell_id; - } - const mobile_id_t GetMobileId() { - return m_mobile_id; - }; - const transaction_id_t GetTransactionId() { - return m_transaction_id; - }; - -protected: - msg_response_status_t m_status; - msg_response_reason_t m_reason; - cell_id_t m_cell_id; - mobile_id_t m_mobile_id; - transaction_id_t m_transaction_id; - - RRM_RRC_Message_t* m_asn1_message; -}; -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp deleted file mode 100755 index 48a3a77320..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include -#include "RRMMessageHandler.h" - - -RRMMessageHandler* RRMMessageHandler::s_instance = 0; - -//---------------------------------------------------------------------------- -void* RRMMessageHandlerThreadLoop(void *arg) -//---------------------------------------------------------------------------- -{ - - return RRMMessageHandler::Instance()->ThreadLoop(arg); -} -//----------------------------------------------------------------- -RRMMessageHandler* RRMMessageHandler::Instance() -//----------------------------------------------------------------- -{ - if (RRMMessageHandler::s_instance == 0) { - RRMMessageHandler::s_instance = new RRMMessageHandler; - } - return s_instance; -} -//----------------------------------------------------------------- -RRMMessageHandler::RRMMessageHandler() -//----------------------------------------------------------------- -{ - m_socket_handler = new SocketHandler(); - m_log = new StdoutLog() ; - m_socket_handler->RegStdLog(m_log); - - m_socket = new RRMUdpSocket(*m_socket_handler, 16384, true); - port_t port = 33334; - Ipv6Address ad("0::1",port); - if (m_socket->Bind(ad, 1) == -1) { - printf("Exiting...\n"); - exit(-1); - } else { - printf("Ready to receive on port %d\n",port); - } - m_socket_handler->Add(m_socket); - - if (pthread_create(&m_thread, NULL, RRMMessageHandlerThreadLoop, (void *) NULL) != 0) { - fprintf(stderr, "\nRRMMessageHandler::RRMMessageHandler() ERROR pthread_create...\n"); - } else { - pthread_setname_np( m_thread, "RRMMsgHandler" ); - } -} -//---------------------------------------------------------------------------- -void* RRMMessageHandler::ThreadLoop(void *arg) -//---------------------------------------------------------------------------- -{ - - m_socket_handler->Select(1,0); - - while (m_socket_handler->GetCount() && !*m_quit) { - m_socket_handler->Select(1,0); - } - fprintf(stderr, "\nRRMMessageHandler::ThreadLoop Exiting...\n"); - return NULL; -} -//---------------------------------------------------------------------------- -void RRMMessageHandler::Join(bool *quitP) -//---------------------------------------------------------------------------- -{ - m_quit = quitP; - - pthread_join(m_thread, NULL); - fprintf(stderr, "\nRRMMessageHandler::Join Done\n"); -} - -//---------------------------------------------------------------------------- -void RRMMessageHandler::NotifyRxData(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//---------------------------------------------------------------------------- -{ - Message* message; - do { - fprintf(stderr, "RRMMessageHandler::notifyRxData GOT MESSAGE %d bytes\n", size_dataP); - message = Message::DeserializeRRMMessage(in_bufferP, size_dataP, sa_fromP, sa_lenP); - if (message != NULL) { - message->Forward(); - delete message; - message = NULL; - } else { - // TO DO - } - } while (message != NULL); -} -//----------------------------------------------------------------- -void RRMMessageHandler::Send2Peer(Message* messageP) -//----------------------------------------------------------------- -{ - Send2Peer(messageP->GetSrcAddress(), messageP->GetSrcPort(), messageP->GetSerializedMessageBuffer(), messageP->GetSerializedMessageSize()); - delete messageP; -} -//----------------------------------------------------------------- -void RRMMessageHandler::Send2Peer(std::string ip_dest_strP, int port_destP, const char *in_bufferP, size_t size_dataP) -//----------------------------------------------------------------- -{ - m_socket->SendToBuf(ip_dest_strP, port_destP, in_bufferP, size_dataP, 0); -} -//----------------------------------------------------------------- -RRMMessageHandler::~RRMMessageHandler() -//----------------------------------------------------------------- -{ - if (m_socket_handler != 0) - { - delete m_socket_handler; - } - if (m_log != 0) - { - delete m_log; - } - // m_socket should be closed and deleted by m_socket_handler -} - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h deleted file mode 100755 index 5adf2d77ba..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMMessageHandler.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef _RRMMESSAGEHANDLER_H -# define _RRMMESSAGEHANDLER_H - -# include - -# include "StdoutLog.h" -# include "SocketHandlerEp.h" -# include "RRMUdpSocket.h" -# include "ListenSocket.h" -# include "Message.h" -# include "platform.h" - - -class RRMMessageHandler -{ -public: - static RRMMessageHandler *Instance (); - void NotifyRxData (const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP); - void Send2Peer (Message *); - void Send2Peer(std::string ip_dest_strP, int port_destP, const char *in_bufferP, size_t size_dataP); - void* ThreadLoop(void *arg); - void Join(bool *quitP); - ~RRMMessageHandler (); - -private: - RRMMessageHandler (); - - SocketHandler *m_socket_handler; - RRMUdpSocket *m_socket; - StdoutLog *m_log; - pthread_t m_thread; - bool *m_quit; - static RRMMessageHandler *s_instance; -}; -# endif - diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp deleted file mode 100755 index 8545c5c107..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include -//---------------------------------------------------------------------------- -#include "RRMUdpSocket.h" -#include "RRMMessageHandler.h" - - -//---------------------------------------------------------------------------- -RRMUdpSocket::RRMUdpSocket(ISocketHandler& h,int ibufsz, bool ipv6):UdpSocket(h, ibufsz, ipv6) -//---------------------------------------------------------------------------- -{ -} -//---------------------------------------------------------------------------- -void RRMUdpSocket::OnRawData(const char *in_bufferP,size_t size_dataP,struct sockaddr *sa_fromP,socklen_t sa_lenP) -//---------------------------------------------------------------------------- -{ - RRMMessageHandler::Instance()->NotifyRxData(in_bufferP, size_dataP, sa_fromP, sa_lenP); -} diff --git a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h b/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h deleted file mode 100755 index 019bef8eb2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/com/rrm/RRMUdpSocket.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _RRMUDPSOCKET_H -# define _RRMUDPSOCKET_H - -# include "UdpSocket.h" - - -class RRMUdpSocket : public UdpSocket -{ -public: - RRMUdpSocket(ISocketHandler&,int ibufsz, bool ipv6); - - void OnRawData(const char *,size_t,struct sockaddr *,socklen_t); -}; - - -#endif // _RRMUDPSOCKET_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/36331-860.txt b/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/36331-860.txt deleted file mode 100755 index c399a2529a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/36331-860.txt +++ /dev/null @@ -1,7503 +0,0 @@ -3GPP TS 36.331 V8.6.0 (2009-06) -Technical Specification -3rd Generation Partnership Project; -Technical Specification Group Radio Access Network; -Evolved Universal Terrestrial Radio Access (E-UTRA) -Radio Resource Control (RRC); -Protocol specification -(Release 8) - - -The present document has been developed within the 3rd Generation Partnership Project (3GPP TM) and may be further elaborated for the purposes of 3GPP. -The present document has not been subject to any approval process by the 3GPP Organizational Partners and shall not be implemented. -This Specification is provided for future development work within 3GPP only. The Organizational Partners accept no liability for any use of this Specification. -Specifications and reports for implementation of the 3GPP TM system should be obtained via the 3GPP Organizational Partners' Publications Offices. - - - - -Keywords -UMTS, radio - -3GPP -Postal address - -3GPP support office address -650 Route des Lucioles - Sophia Antipolis -Valbonne - FRANCE -Tel.: +33 4 92 94 42 00 Fax: +33 4 93 65 47 16 -Internet -http://www.3gpp.org - -Copyright Notification -No part may be reproduced except as authorized by written permission. -The copyright and the foregoing restriction extend to reproduction in all media. - -© 2009, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC). -All rights reserved. - -UMTS™ is a Trade Mark of ETSI registered for the benefit of its members -3GPP™ is a Trade Mark of ETSI registered for the benefit of its Members and of the 3GPP Organizational Partners -LTE™ is a Trade Mark of ETSI currently being registered for the benefit of its Members and of the 3GPP Organizational Partners -GSM® and the GSM logo are registered and owned by the GSM Association - - -Contents -Foreword 11 -1 Scope 12 -2 References 12 -3 Definitions, symbols and abbreviations 14 -3.1 Definitions 14 -3.2 Abbreviations 14 -4 General 16 -4.1 Introduction 16 -4.2 Architecture 16 -4.2.1 UE states and state transitions including inter RAT 16 -4.2.2 Signalling radio bearers 18 -4.3 Services 18 -4.3.1 Services provided to upper layers 18 -4.3.2 Services expected from lower layers 19 -4.4 Functions 19 -5 Procedures 20 -5.1 General 20 -5.1.1 Introduction 20 -5.1.2 General requirements 20 -5.2 System information 20 -5.2.1 Introduction 20 -5.2.1.1 General 20 -5.2.1.2 Scheduling 21 -5.2.1.3 System information validity and notification of changes 21 -5.2.1.4 Indication of ETWS notification 22 -5.2.2 System information acquisition 22 -5.2.2.1 General 22 -5.2.2.2 Initiation 23 -5.2.2.3 System information required by the UE 23 -5.2.2.4 System information acquisition by the UE 23 -5.2.2.5 Essential system information missing 24 -5.2.2.6 Actions upon reception of the MasterInformationBlock message 24 -5.2.2.7 Actions upon reception of the SystemInformationBlockType1 message 24 -5.2.2.8 Actions upon reception of SystemInformation messages 25 -5.2.2.9 Actions upon reception of SystemInformationBlockType2 25 -5.2.2.10 Actions upon reception of SystemInformationBlockType3 25 -5.2.2.11 Actions upon reception of SystemInformationBlockType4 25 -5.2.2.12 Actions upon reception of SystemInformationBlockType5 25 -5.2.2.13 Actions upon reception of SystemInformationBlockType6 25 -5.2.2.14 Actions upon reception of SystemInformationBlockType7 25 -5.2.2.15 Actions upon reception of SystemInformationBlockType8 25 -5.2.2.16 Actions upon reception of SystemInformationBlockType9 26 -5.2.2.17 Actions upon reception of SystemInformationBlockType10 26 -5.2.2.18 Actions upon reception of SystemInformationBlockType11 27 -5.2.3 Acquisition of an SI message 28 -5.3 Connection control 28 -5.3.1 Introduction 28 -5.3.1.1 RRC connection control 28 -5.3.1.2 Security 29 -5.3.1.3 Connected mode mobility 30 -5.3.2 Paging 30 -5.3.2.1 General 30 -5.3.2.2 Initiation 31 -5.3.2.3 Reception of the Paging message by the UE 31 -5.3.3 RRC connection establishment 31 -5.3.3.1 General 31 -5.3.3.2 Initiation 32 -5.3.3.3 Actions related to transmission of RRCConnectionRequest message 34 -5.3.3.4 Reception of the RRCConnectionSetup by the UE 35 -5.3.3.5 Cell re-selection while T300, T302, T303 or T305 is running 35 -5.3.3.6 T300 expiry 36 -5.3.3.7 T302, T303 or T305 expiry or stop 36 -5.3.3.8 Reception of the RRCConnectionReject by the UE 36 -5.3.3.9 Abortion of RRC connection establishment 37 -5.3.4 Initial security activation 37 -5.3.4.1 General 37 -5.3.4.2 Initiation 37 -5.3.4.3 Reception of the SecurityModeCommand by the UE 37 -5.3.5 RRC connection reconfiguration 38 -5.3.5.1 General 38 -5.3.5.2 Initiation 39 -5.3.5.3 Reception of an RRCConnectionReconfiguration not including the mobilityControlInfo by the UE 39 -5.3.5.4 Reception of an RRCConnectionReconfiguration including the mobilityControlInfo by the UE (handover) 39 -5.3.5.5 Reconfiguration failure 41 -5.3.5.6 T304 expiry (handover failure) 41 -5.3.6 Counter check 42 -5.3.6.1 General 42 -5.3.6.2 Initiation 42 -5.3.6.3 Reception of the CounterCheck message by the UE 42 -5.3.7 RRC connection re-establishment 43 -5.3.7.1 General 43 -5.3.7.2 Initiation 43 -5.3.7.3 Actions following cell selection while T311 is running 44 -5.3.7.4 Actions related to transmission of RRCConnectionReestablishmentRequest message 44 -5.3.7.5 Reception of the RRCConnectionReestablishment by the UE 45 -5.3.7.6 T311 expiry 45 -5.3.7.7 T301 expiry or selected cell no longer suitable 46 -5.3.7.8 Reception of RRCConnectionReestablishmentReject by the UE 46 -5.3.8 RRC connection release 46 -5.3.8.1 General 46 -5.3.8.2 Initiation 46 -5.3.8.3 Reception of the RRCConnectionRelease by the UE 46 -5.3.8.4 T320 expiry 47 -5.3.9 RRC connection release requested by upper layers 47 -5.3.9.1 General 47 -5.3.9.2 Initiation 47 -5.3.10 Radio resource configuration 47 -5.3.10.0 General 47 -5.3.10.1 SRB addition/ modification 48 -5.3.10.2 DRB release 48 -5.3.10.3 DRB addition/ modification 48 -5.3.10.4 MAC main reconfiguration 49 -5.3.10.5 Semi-persistent scheduling reconfiguration 49 -5.3.10.6 Physical channel reconfiguration 49 -5.3.11 Radio link failure related actions 49 -5.3.11.1 Detection of physical layer problems in RRC_CONNECTED 49 -5.3.11.2 Recovery of physical layer problems 49 -5.3.11.3 Detection of radio link failure 50 -5.3.12 UE actions upon leaving RRC_CONNECTED 50 -5.3.13 UE actions upon PUCCH/ SRS release request 50 -5.4 Inter-RAT mobility 50 -5.4.1 Introduction 50 -5.4.2 Handover to E-UTRA 51 -5.4.2.1 General 51 -5.4.2.2 Initiation 51 -5.4.2.3 Reception of the RRCConnectionReconfiguration by the UE 51 -5.4.2.4 Reconfiguration failure 52 -5.4.2.5 T304 expiry (handover to E-UTRA failure) 52 -5.4.3 Mobility from E-UTRA 53 -5.4.3.1 General 53 -5.4.3.2 Initiation 53 -5.4.3.3 Reception of the MobilityFromEUTRACommand by the UE 53 -5.4.3.4 Successful completion of the mobility from E-UTRA 54 -5.4.3.5 Mobility from E-UTRA failure 54 -5.4.4 Handover from E-UTRA preparation request (CDMA2000) 55 -5.4.4.1 General 55 -5.4.4.2 Initiation 55 -5.4.4.3 Reception of the HandoverFromEUTRAPreparationRequest by the UE 55 -5.4.5 UL handover preparation transfer (CDMA2000) 55 -5.4.5.1 General 55 -5.4.5.2 Initiation 56 -5.4.5.3 Actions related to transmission of the ULHandoverPreparationTransfer message 56 -5.4.5.4 Failure to deliver the ULHandoverPreparationTransfer message 56 -5.4.6 Inter-RAT cell change order to E-UTRAN 56 -5.4.6.1 General 56 -5.4.6.2 Initiation 56 -5.4.6.3 UE fails to complete an inter-RAT cell change order 56 -5.5 Measurements 57 -5.5.1 Introduction 57 -5.5.2 Measurement configuration 58 -5.5.2.1 General 58 -5.5.2.2 Measurement identity removal 59 -5.5.2.3 Measurement identity addition/ modification 59 -5.5.2.4 Measurement object removal 60 -5.5.2.5 Measurement object addition/ modification 60 -5.5.2.6 Reporting configuration removal 61 -5.5.2.7 Reporting configuration addition/ modification 61 -5.5.2.8 Quantity configuration 62 -5.5.2.9 Measurement gap configuration 62 -5.5.3 Performing measurements 62 -5.5.3.1 General 62 -5.5.3.2 Layer 3 filtering 63 -5.5.4 Measurement report triggering 64 -5.5.4.1 General 64 -5.5.4.2 Event A1 (Serving becomes better than threshold) 66 -5.5.4.3 Event A2 (Serving becomes worse than threshold) 66 -5.5.4.4 Event A3 (Neighbour becomes offset better than serving) 66 -5.5.4.5 Event A4 (Neighbour becomes better than threshold) 67 -5.5.4.6 Event A5 (Serving becomes worse than threshold1 and neighbour becomes better than threshold2) 68 -5.5.4.7 Event B1 (Inter RAT neighbour becomes better than threshold) 68 -5.5.4.8 Event B2 (Serving becomes worse than threshold1 and inter RAT neighbour becomes better than threshold2) 69 -5.5.5 Measurement reporting 70 -5.5.6 Measurement related actions 71 -5.5.6.1 Actions upon handover and re-establishment 71 -5.5.6.2 Speed dependant scaling of measurement related parameters 72 -5.6 Other 73 -5.6.1 DL information transfer 73 -5.6.1.1 General 73 -5.6.1.2 Initiation 73 -5.6.1.3 Reception of the DLInformationTransfer by the UE 73 -5.6.2 UL information transfer 73 -5.6.2.1 General 73 -5.6.2.2 Initiation 73 -5.6.2.3 Actions related to transmission of ULInformationTransfer message 74 -5.6.2.4 Failure to deliver ULInformationTransfer message 74 -5.6.3 UE capability transfer 74 -5.6.3.1 General 74 -5.6.3.2 Initiation 75 -5.6.3.3 Reception of the UECapabilityEnquiry by the UE 75 -5.6.4 CSFB to 1x Parameter transfer 75 -5.6.4.1 General 75 -5.6.4.2 Initiation 76 -5.6.4.3 Actions related to transmission of CSFBParametersRequestCDMA2000 message 76 -5.6.4.4 Reception of the CSFBParametersResponseCDMA2000 message 76 -5.7 Generic error handling 76 -5.7.1 General 76 -5.7.2 ASN.1 violation or encoding error 76 -5.7.3 Field set to a not comprehended value 76 -5.7.4 Mandatory field missing 77 -5.7.5 Not comprehended field 77 -6 Protocol data units, formats and parameters (tabular & ASN.1) 77 -6.1 General 77 -6.2 RRC messages 78 -6.2.1 General message structure 78 -– EUTRA-RRC-Definitions 78 -– BCCH-BCH-Message 78 -– BCCH-DL-SCH-Message 79 -– PCCH-Message 79 -– DL-CCCH-Message 79 -– DL-DCCH-Message 80 -– UL-CCCH-Message 80 -– UL-DCCH-Message 80 -6.2.2 Message definitions 81 -– CounterCheck 81 -– CounterCheckResponse 82 -– CSFBParametersRequestCDMA2000 82 -– CSFBParametersResponseCDMA2000 83 -– DLInformationTransfer 83 -– HandoverFromEUTRAPreparationRequest (CDMA2000) 84 -– MasterInformationBlock 84 -– MeasurementReport 85 -– MobilityFromEUTRACommand 86 -– Paging 87 -– RRCConnectionReconfiguration 88 -– RRCConnectionReconfigurationComplete 90 -– RRCConnectionReestablishment 90 -– RRCConnectionReestablishmentComplete 91 -– RRCConnectionReestablishmentReject 91 -– RRCConnectionReestablishmentRequest 92 -– RRCConnectionReject 92 -– RRCConnectionRelease 93 -– RRCConnectionRequest 95 -– RRCConnectionSetup 96 -– RRCConnectionSetupComplete 96 -– SecurityModeCommand 97 -– SecurityModeComplete 98 -– SecurityModeFailure 98 -– SystemInformation 98 -– SystemInformationBlockType1 99 -– UECapabilityEnquiry 101 -– UECapabilityInformation 101 -– ULHandoverPreparationTransfer (CDMA2000) 102 -– ULInformationTransfer 102 -6.3 RRC information elements 103 -6.3.1 System information blocks 103 -– SystemInformationBlockType2 103 -– SystemInformationBlockType3 105 -– SystemInformationBlockType4 106 -– SystemInformationBlockType5 107 -– SystemInformationBlockType6 108 -– SystemInformationBlockType7 109 -– SystemInformationBlockType8 110 -– SystemInformationBlockType9 112 -– SystemInformationBlockType10 112 -– SystemInformationBlockType11 113 -6.3.2 Radio resource control information elements 114 -– AntennaInfo 114 -– CQI-ReportConfig 114 -– DRB-Identity 115 -– LogicalChannelConfig 115 -– MAC-MainConfig 116 -– PDCP-Config 118 -– PDSCH-Config 119 -– PHICH-Config 120 -– PhysicalConfigDedicated 120 -– P-Max 121 -– PRACH-Config 121 -– PresenceAntennaPort1 122 -– PUCCH-Config 122 -– PUSCH-Config 123 -– RACH-ConfigCommon 124 -– RACH-ConfigDedicated 125 -– RadioResourceConfigCommon 126 -– RadioResourceConfigDedicated 127 -– RLC-Config 128 -– SchedulingRequestConfig 130 -– SoundingRS-UL-Config 130 -– SPS-Config 131 -– TDD-Config 133 -– TimeAlignmentTimer 133 -– TPC-PDCCH-Config 133 -– UplinkPowerControl 134 -6.3.3 Security control information elements 135 -– NextHopChainingCount 135 -– SecurityAlgorithmConfig 135 -– ShortMAC-I 136 -6.3.4 Mobility control information elements 136 -– AdditionalSpectrumEmission 136 -– ARFCN-ValueCDMA2000 136 -– ARFCN-ValueEUTRA 136 -– ARFCN-ValueGERAN 137 -– ARFCN-ValueUTRA 137 -– BandclassCDMA2000 137 -– BandIndicatorGERAN 137 -– CarrierFreqCDMA2000 138 -– CarrierFreqGERAN 138 -– CarrierFreqsGERAN 138 -– CDMA2000-Type 139 -– CellIdentity 139 -– CellIndexList 139 -– CellReselectionPriority 140 -– CSFB-RegistrationParam1XRTT 140 -– CellGlobalIdEUTRA 141 -– CellGlobalIdUTRA 141 -– CellGlobalIdGERAN 142 -– CellGlobalIdCDMA2000 142 -– MobilityControlInfo 142 -– MobilityParametersCDMA2000 (1xRTT) 143 -– MobilityStateParameters 144 -– PhysCellId 144 -– PhysCellIdRange 144 -– PhysCellIdCDMA2000 145 -– PhysCellIdGERAN 145 -– PhysCellIdentityUTRA-FDD 145 -– PhysCellIdUTRA-TDD 145 -– PLMN-Identity 146 -– PreRegistrationInfoHRPD 146 -– Q-RxLevMin 147 -– Q-OffsetRange 147 -– Q-OffsetRangeInterRAT 147 -– ReselectionThreshold 148 -– SpeedStateScaleFactors 148 -– SystemTimeInfoCDMA2000 148 -– TrackingAreaCode 149 -– T-Reselection 149 -6.3.5 Measurement information elements 149 -– AllowedMeasBandwidth 149 -– Hysteresis 149 -– MeasConfig 150 -– MeasGapConfig 151 -– MeasId 151 -– MeasIdToAddModList 152 -– MeasObjectCDMA2000 152 -– MeasObjectEUTRA 153 -– MeasObjectGERAN 154 -– MeasObjectId 154 -– MeasObjectToAddModList 154 -– MeasObjectUTRA 154 -– MeasResults 155 -– QuantityConfig 157 -– ReportConfigEUTRA 158 -– ReportConfigId 160 -– ReportConfigInterRAT 160 -– ReportConfigToAddModList 161 -– ReportInterval 162 -– RSRP-Range 162 -– RSRQ-Range 162 -– TimeToTrigger 163 -6.3.6 Other information elements 163 -– C-RNTI 163 -– DedicatedInfoCDMA2000 163 -– DedicatedInfoNAS 163 -– FilterCoefficient 163 -– MMEC 164 -– NeighCellConfig 164 -– RAND-CDMA2000 (1xRTT) 164 -– RAT-Type 165 -– RRC-TransactionIdentifier 165 -– S-TMSI 165 -– UE-CapabilityRAT-ContainerList 165 -– UE-EUTRA-Capability 166 -– UE-TimersAndConstants 169 -6.4 RRC multiplicity and type constraint values 170 -– Multiplicity and type constraint definitions 170 -– End of EUTRA-RRC-Definitions 170 -7 Variables and constants 171 -7.1 UE variables 171 -– EUTRA-UE-Variables 171 -– VarMeasConfig 171 -– VarMeasReportList 172 -– VarShortMAC-Input 172 -– Multiplicity and type constraint definitions 172 -– End of EUTRA-UE-Variables 172 -7.2 Counters 173 -7.3 Timers (Informative) 174 -7.4 Constants 175 -8 Protocol data unit abstract syntax 175 -8.1 General 175 -8.2 Structure of encoded RRC messages 175 -8.3 Basic production 175 -8.4 Extension 175 -8.5 Padding 176 -9 Specified and default radio configurations 176 -9.1 Specified configurations 176 -9.1.1 Logical channel configurations 176 -9.1.1.1 BCCH configuration 176 -9.1.1.2 CCCH configuration 177 -9.1.1.3 PCCH configuration 177 -9.1.2 SRB configurations 177 -9.1.2.1 SRB1 177 -9.1.2.2 SRB2 177 -9.2 Default radio configurations 177 -9.2.1 SRB configurations 177 -9.2.1.1 SRB1 177 -9.2.1.2 SRB2 178 -9.2.2 Default MAC main configuration 178 -9.2.3 Default semi-persistent scheduling configuration 178 -9.2.4 Default physical channel configuration 178 -9.2.5 Default values timers and constants 179 -10 Radio information related interactions between network nodes 179 -10.1 General 179 -10.2 Inter-node RRC messages 179 -10.2.1 General 179 -– EUTRA-InterNodeDefinitions 180 -10.2.2 Message definitions 180 -– HandoverCommand 180 -– HandoverPreparationInformation 181 -– UERadioAccessCapabilityInformation 181 -10.3 Inter-node RRC information element definitions 182 -– AS-Config 182 -– AS-Context 183 -– ReestablishmentInfo 183 -– RRM-Config 184 -10.4 Inter-node RRC multiplicity and type constraint values 185 -– Multiplicity and type constraints definitions 185 -– End of EUTRA-InterNodeDefinitions 185 -10.5 Mandatory information in AS-Config 185 -11 UE capability related constraints and performance requirements 187 -11.1 UE capability related constraints 187 -11.2 Processing delay requirements for RRC procedures 187 -Annex A (informative): Guidelines, mainly on use of ASN.1 189 -A.1 Introduction 189 -A.2 Procedural specification 190 -A.2.1 General principles 190 -A.2.2 More detailed aspects 190 -A.3 PDU specification 190 -A.3.1 General principles 190 -A.3.1.1 ASN.1 sections 190 -A.3.1.2 ASN.1 identifier naming conventions 191 -A.3.1.3 Text references using ASN.1 identifiers 192 -A.3.2 High-level message structure 192 -A.3.3 Message definition 193 -A.3.4 Information elements 194 -A.3.5 Fields with optional presence 195 -A.3.6 Fields with conditional presence 196 -A.3.7 Guidelines on use of lists with elements of SEQUENCE type 196 -A.4 Extension of the PDU specifications 197 -A.4.1 General principles to ensure compatibility 197 -A.4.2 Critical extension of messages 197 -A.4.3 Non-critical extension of messages 197 -A.5 Guidelines regarding inclusion of transaction identifiers in RRC messages 198 -A.6 Protection of RRC messages (informative) 198 -A.7 Miscellaneous 199 -Annex B (normative): Release 8 AS feature handling 200 -B.1 Feature group indicators 200 -B.2 CSG support 203 -Annex C (informative): Change history 204 - - -Foreword -This Technical Specification has been produced by the 3rd Generation Partnership Project (3GPP). -The contents of the present document are subject to continuing work within the TSG and may change following formal TSG approval. Should the TSG modify the contents of the present document, it will be re-released by the TSG with an identifying change of release date and an increase in version number as follows: -Version x.y.z -where: -x the first digit: -1 presented to TSG for information; -2 presented to TSG for approval; -3 or greater indicates TSG approved document under change control. -y the second digit is incremented for all changes of substance, i.e. technical enhancements, corrections, updates, etc. -z the third digit is incremented when editorial only changes have been incorporated in the document. - -1 Scope -The present document specifies the Radio Resource Control protocol for the UE-E-UTRAN radio interface. -The scope of the present document also includes: -- the radio related information transported in a transparent container between source eNB and target eNB upon inter eNB handover; -- the radio related information transported in a transparent container between a source or target eNB and another system upon inter RAT handover. -2 References -The following documents contain provisions which, through reference in this text, constitute provisions of the present document. -* References are either specific (identified by date of publication, edition number, version number, etc.) or nonspecific. -* For a specific reference, subsequent revisions do not apply. -* For a non-specific reference, the latest version applies. In the case of a reference to a 3GPP document (including a GSM document), a non-specific reference implicitly refers to the latest version of that document in the same Release as the present document. -[1] 3GPP TR 21.905: "Vocabulary for 3GPP Specifications". -[2] 3GPP TS nn.nnn: "Radio Interface Protocol Architecture". -Editor's note: Document not yet available. -[3] 3GPP TS 36.302: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Services provided by the physical layer ". -[4] 3GPP TS 36.304: "Evolved Universal Terrestrial Radio Access (E-UTRA); "UE Procedures in Idle Mode". -[5] 3GPP TS 36.306 "Evolved Universal Terrestrial Radio Access (E-UTRA); "UE Radio Access Capabilities". -[6] 3GPP TS 36.321: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Medium Access Control (MAC) protocol specification". -[7] 3GPP TS 36.322:"Evolved Universal Terrestrial Radio Access (E-UTRA); "Radio Link Control (RLC) protocol specification". -[8] 3GPP TS 36.323: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Packet Data Convergence Protocol (PDCP) Specification". -[9] 3GPP TS 36.300: "Evolved Universal Terrestrial Radio Access (E-UTRA) and Evolved Universal Terrestrial Radio Access (E-UTRAN); Overall description; Stage 2". -[10] 3GPP TS 22.011: "Service accessibility". -[11] 3GPP TS 23.122: "Non-Access-Stratum (NAS) functions related to Mobile Station (MS) in idle mode". -[12] 3GPP2 C.S0002-A: "Physical Layer Standard for cdma2000 Spread Spectrum Systems – Release A". -[13] ITU-T Recommendation X.680 (07/2002) "Information Technology - Abstract Syntax Notation One (ASN.1): Specification of basic notation" (Same as the ISO/IEC International Standard 8824-1). -[14] ITU-T Recommendation X.681 (07/2002) "Information Technology - Abstract Syntax Notation One (ASN.1): Information object specification" (Same as the ISO/IEC International Standard 8824-2). -[15] ITU-T Recommendation X.691 (07/2002) "Information technology - ASN.1 encoding rules: Specification of Packed Encoding Rules (PER)" (Same as the ISO/IEC International Standard 8825-2). -[16] 3GPP TS 36.133: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Requirements for support of radio resource management". -[17] 3GPP TS 25.101: "Universal Terrestrial Radio Access (UTRA); "User Equipment (UE) radio transmission and reception (FDD)". -[18] 3GPP TS 25.102: "Universal Terrestrial Radio Access (UTRA); "User Equipment (UE) radio transmission and reception (TDD)". -[19] 3GPP TS 25.331:"Universal Terrestrial Radio Access (UTRA); "Radio Resource Control (RRC); Protocol specification". -[20] 3GPP TS 45.005: "Radio transmission and reception". -[21] 3GPP TS 36.211: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Multiplexing and channel coding". -[22] 3GPP TS 36.212: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Multiplexing and channel coding". -[23] 3GPP TS 36.213: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Physical layer procedures". -[24] 3GPP2 C.S0057-B: "Band Class Specification for cdma2000 Spread Spectrum Systems". -[25] 3GPP2 C.S0005-A: "Upper Layer (Layer 3) Signaling Standard for cdma2000 Spread Spectrum Systems – Release A, Addendum 2". -[26] 3GPP2 C.S0024-A: "cdma2000 High Rate Packet Data Air Interface Specification". -[27] 3GPP TS 23.003: "Numbering, addressing and identification". -[28] 3GPP TS 45.008: "Radio subsystem link control". -[29] 3GPP TS 25.133: "Requirements for Support of Radio Resource Management (FDD)". -[30] 3GPP TS 25.123: "Requirements for Support of Radio Resource Management (TDD)". -[31] 3GPP TS 36.401: "Evolved Universal Terrestrial Radio Access (E-UTRA); "Architecture description". -[32] 3GPP TS 33.401: "3GPP System Architecture Evolution (SAE); “Security architecture". -[33] 3GPP2 A.S0008-C: “Interoperability Specification (IOS) for High Rate Packet Data (HRPD) Radio Access Network Interfaces with Session Control in the Access Network” -[34] 3GPP2 C.S0004-A: “Signaling Link Access Control (LAC) Standard for cdma2000 Spread Spectrum Systems – Addendum 2” -[35] 3GPP TS 24.301: "Non-Access-Stratum (NAS) protocol for Evolved Packet System (EPS); Stage 3". -[36] 3GPP TS 44.060: "General Packet Radio Service (GPRS); Mobile Station (MS) - Base Station System (BSS) interface; Radio Link Control/Medium Access Control (RLC/MAC) protocol". -[37] 3GPP TS 23.041: "Technical realization of Cell Broadcast Service (CBS)". -[38] 3GPP TS 23.038: "Alphabets and Language". -[39] 3GPP TS 36.413: "Evolved Universal Terrestrial Radio Access (E-UTRAN); S1 Application Protocol (S1 AP)". -[40] 3GPP TS 25.304: "Universal Terrestrial Radio Access (UTRAN); User Equipment (UE) procedures in idle mode and procedures for cell reselection in connected mode". -[41] 3GPP TS 23.401: "General Packet Radio Service (GPRS) enhancements for Evolved Universal Terrestrial Radio Access Network (E-UTRAN) access". -[42] 3GPP TS 36.101: "Evolved Universal Terrestrial Radio Access (E-UTRA); "User Equipment (UE) radio transmission and reception". -[43] 3GPP TS 44.005: "Data Link (DL) Layer General Aspects". -[44] 3GPP2 C.S0087-0: “E-UTRAN - cdma2000 Connectivity and Interworking Air Interface Specification” -[45] 3GPP TS 44.018: "Mobile radio interface layer 3 specification; Radio Resource Control (RRC) protocol". -[46] 3GPP TS 25.223: "Spreading and modulation (TDD)". -[47] 3GPP TS 36.104: "Evolved Universal Terrestrial Radio Access (E-UTRA); Base Station (BS) radio transmission and reception". -[48] 3GPP TS 36.214: "Evolved Universal Terrestrial Radio Access (E-UTRA); Physical layer - Measurements". -[49] 3GPP TS 24.008: "Mobile radio interface layer 3 specification; Core network protocols; Stage 3". -3 Definitions, symbols and abbreviations -3.1 Definitions -For the purposes of the present document, the terms and definitions given in TR 21.905 [1] and the following apply. A term defined in the present document takes precedence over the definition of the same term, if any, in TR 21.905 [1]. -Information element: A structural element containing a single or multiple fields is referred as information element. -Field: The individual contents of an information element are referred as fields. -3.2 Abbreviations -For the purposes of the present document, the abbreviations given in TR 21.905 [1] and the following apply. An abbreviation defined in the present document takes precedence over the definition of the same abbreviation, if any, in TR 21.905 [1]. -1xRTT CDMA2000 1x Radio Transmission Technology -AM Acknowledged Mode -ASN.1 Abstract Syntax Notation.1 -ARQ Automatic Repeat Request -AS Access Stratum -BCCH Broadcast Control Channel -BCH Broadcast Channel -CCCH Common Control Channel -CCO Cell Change Order -CP Control Plane -C-RNTI Cell RNTI -CSG Closed Subscriber Group -DCCH Dedicated Control Channel -DRB (user) Data Radio Bearer -DRX Discontinuous Reception -DTCH Dedicated Traffic Channel -DL Downlink -DL-SCH Downlink Shared Channel -ETWS Earthquake and Tsunami Warning System -E-UTRA Evolved Universal Terrestrial Radio Access -E-UTRAN Evolved Universal Terrestrial Radio Access Network -ENB Evolved Node B -EPC Enhanced Packet Core -EPS Enhanced Packet System -FLOOR Mathematical function used to ‘round down’ i.e. to the nearest integer having a lower value -FDD Frequency Division Duplex -FFS For Further Study -GERAN GSM/EDGE Radio Access Network -GSM Global System for Mobile Communications -HARQ Hybrid Automatic Repeat Request -HRPD CDMA2000 High Rate Packet Data -IE Information element -IMEI International Mobile Equipment Identity -IMSI International Mobile Subscriber Identity -kB Kilobyte (1000 bytes) -L1 Layer 1 -L2 Layer 2 -L3 Layer 3 -MAC Medium Access Control -MBMS Multimedia Broadcast Multicast Service -MBSFN Multimedia Broadcast multicast service Single Frequency Network -MIB Master Information Block -N/A Not Applicable -NACC Network Assisted Cell Change -NAS Non Access Stratum -PCCH Paging Control Channel -PDU Protocol Data Unit -PDCP Packet Data Convergence Protocol -PLMN Public Land Mobile Network -QoS Quality of Service -RACH Random Access CHannel -RAT Radio Access Technology -RB Radio Bearer -RLC Radio Link Control -RNTI Radio Network Temporary Identifier -RRC Radio Resource Control -RSCP Received Signal Code Power -RSRP Reference Signal Received Power -RSSI Received Signal Strength Indicator -SAE System Architecture Evolution -SAP Service Access Point -SFN System Frame Number -SI System Information -SIB System Information Block -SI-RNTI System Information RNTI -SPS Semi-Persistent Scheduling -SRB Signalling Radio Bearer -S-TMSI SAE Temporary Mobile Station Identifier -TA Tracking Area -TDD Time Division Duplex -TM Transparent Mode -TPC-RNTI Transmit Power Control RNTI -UE User Equipment -UICC Universal Integrated Circuit Card -UL Uplink -UM Unacknowledged Mode -UL-SCH Uplink Shared Channel -UP User Plane -UTRAN Universal Terrestrial Radio Access Network -In the ASN.1, lower case may be used for some (parts) of the above abbreviations e.g. c-RNTI -4 General -4.1 Introduction -This specification is organised as follows: -- sub-clause 4.2 describes the RRC protocol model; -- sub-clause 4.3 specifies the services provided to upper layers as well as the services expected from lower layers; -- sub-clause 4.4 lists the RRC functions; -- clause 5 specifies RRC procedures, including UE state transitions; -- clause 6 specifies the RRC message in a mixed format (i.e. tabular & ASN.1 together); -- clause 7 specifies the variables (including protocol timers and constants) and counters to be used by the UE; -- clause 8 specifies the encoding of the RRC messages; -- clause 9 specifies the specified and default radio configurations; -- clause 10 specifies the RRC messages transferred across network nodes; -- clause 11 specifies the UE capability related constraints and performance requirements. -4.2 Architecture -4.2.1 UE states and state transitions including inter RAT -A UE is in RRC_CONNECTED when an RRC connection has been established. If this is not the case, i.e. no RRC connection is established, the UE is in RRC_IDLE state. The RRC states can further be characterised as follows: -- RRC_IDLE: -- A UE specific DRX may be configured by upper layers. -- UE controlled mobility; -- The UE: -- Monitors a Paging channel to detect incoming calls, system information change, and for ETWS capable UEs, ETWS notification; -- Performs neighbouring cell measurements and cell (re-)selection; -- Acquires system information. -- RRC_CONNECTED: -- Transfer of unicast data to/from UE. -- At lower layers, the UE may be configured with a UE specific DRX. -- Network controlled mobility, i.e. handover and cell change order with optional network assistance (NACC) to GERAN; -- The UE: -- Monitors a Paging channel and/ or System Information Block Type 1 contents to detect system information change, and for ETWS capable UEs, ETWS notification; -Monitors control channels associated with the shared data channel to determine if data is scheduled for it; -- Provides channel quality and feedback information; -- Performs neighbouring cell measurements and measurement reporting; -- Acquires system information. -The following figure not only provides an overview of the RRC states in E-UTRA, but also illustrates the mobility support between E-UTRAN, UTRAN and GERAN. - -Figure 4.2.1-1: E-UTRA states and inter RAT mobility procedures, 3GPP -The following figure illustrates the mobility support between E-UTRAN, CDMA2000 1xRTT and CDMA2000 HRPD. The details of the CDMA2000 state models are out of the scope of this specification. - -Figure 4.2.1-2: Mobility procedures between E-UTRA and CDMA2000 -The inter-RAT handover procedure(s) supports the case of signalling, conversational services, non-conversational services and combinations of these. The mobility between E-UTRA and non-3GPP systems other than CDMA2000 is FFS. -In addition to the state transitions shown in Figure 4.2.1-1 and Figure 4.2.1-2, there is support for connection release with redirection information from E-UTRA RRC_CONNECTED to GERAN, UTRAN and CDMA2000 (HRPD Idle/ 1xRTT Dormant mode). -4.2.2 Signalling radio bearers -"Signalling Radio Bearers" (SRBs) are defined as Radio Bearers (RB) that are used only for the transmission of RRC and NAS messages. More specifically, the following three SRBs are defined: -- SRB0 is for RRC messages using the CCCH logical channel; -- SRB1 is for RRC messages (which may include a piggybacked NAS message) as well as for NAS messages prior to the establishment of SRB2, all using DCCH logical channel; -- SRB2 is for NAS messages, using DCCH logical channel. SRB2 has a lower-priority than SRB1 and is always configured by E-UTRAN after security activation. -In downlink piggybacking of NAS messages is used only for one dependant (i.e. with joint success/ failure) procedure: bearer establishment/ modification/ release. In uplink NAS message piggybacking is used only for transferring the initial NAS message during connection setup. -NOTE: The NAS messages transferred via SRB2 are also contained in RRC messages, which however do not include any RRC protocol control information. -Once security is activated, all RRC messages on SRB1 and SRB2, including those containing NAS or non-3GPP messages, are integrity protected and ciphered by PDCP. NAS independently applies integrity protection and ciphering to the NAS messages. -4.3 Services -4.3.1 Services provided to upper layers -The RRC protocol offers the following services to upper layers: -- Broadcast of common control information; -- Notification of UEs in RRC_IDLE, e.g. about a terminating call, for ETWS; -- Transfer of dedicated control information, i.e. information for one specific UE. -4.3.2 Services expected from lower layers -In brief, the following are the main services that RRC expects from lower layers: -- PDCP: integrity protection and ciphering; -- RLC: reliable and in-sequence transfer of information, without introducing duplicates and with support for segmentation and concatenation. -Further details about the services provided by Packet Data Convergence Protocol layer (e.g. integrity and ciphering) are provided in TS 36.323 [8]. The services provided by Radio Link Control layer (e.g. the RLC modes) are specified in TS 36.322 [7]. Further details about the services provided by Medium Access Control layer (e.g. the logical channels) are provided in TS 36.321 [6]. The services provided by physical layer (e.g. the transport channels) are specified in TS 36.302 [3]. -4.4 Functions -The RRC protocol includes the following main functions: -- Broadcast of system information: -- Including NAS common information; -- Information applicable for UEs in RRC_IDLE, e.g. cell (re-)selection parameters, neighbouring cell information and information (also) applicable for UEs in RRC_CONNECTED, e.g. common channel configuration information. -- Including ETWS notification; -- RRC connection control: -- Paging; -- Establishment/ modification/ release of RRC connection, including e.g. assignment/ modification of UE identity (C-RNTI), establishment/ modification/ release of SRB1 and SRB2, access class barring; -- Initial security activation, i.e. initial configuration of AS integrity protection (SRBs) and AS ciphering (SRBs, DRBs); -- RRC connection mobility including e.g. intra-frequency and inter-frequency handover, associated security handling, i.e. key/ algorithm change, specification of RRC context information transferred between network nodes; -- Establishment/ modification/ release of RBs carrying user data (DRBs); -- Radio configuration control including e.g. assignment/ modification of ARQ configuration, HARQ configuration, DRX configuration; -- QoS control including assignment/ modification of semi-persistent scheduling (SPS) configuration information for DL and UL, assignment/ modification of parameters for UL rate control in the UE, i.e. allocation of a priority and a prioritised bit rate (PBR) for each RB; -- Recovery from radio link failure; -- Inter-RAT mobility including e.g. security activation, transfer of RRC context information; -- Measurement configuration and reporting: -- Establishment/ modification/ release of measurements (e.g. intra-frequency, inter-frequency and inter- RAT measurements); -- Setup and release of measurement gaps; -- Measurement reporting; -- Other functions including e.g. transfer of dedicated NAS information and non-3GPP dedicated information, transfer of UE radio access capability information, support for E-UTRAN sharing (multiple PLMN identities); -- Generic protocol error handling; -- Support of self-configuration and self-optimisation; -NOTE: Random access is specified entirely in the MAC’ including initial transmission power estimation. -5 Procedures -5.1 General -5.1.1 Introduction -The procedural requirements are structured according to the main functional areas: system information (5.2), connection control (5.3), inter-RAT mobility (5.4) and measurements (5.5). In addition there is a sub-clause other (5.6) that covers e.g. NAS dedicated information transfer, UE capability transfer. Finally, sub-clause 5.7 specifies the generic error handling. -5.1.2 General requirements -The UE shall: -1> process the received messages in order of reception by RRC, i.e. the processing of a message shall be completed before starting the processing of a subsequent message; -NOTE 1: E-UTRAN may initiate a subsequent procedure prior to receiving the UE's response of a previously initiated procedure. -1> within a sub-clause execute the steps according to the order specified in the procedural description; -1> set the rrc-TransactionIdentifier in the response message, if included, to the same value as included in the message received from E-UTRAN that triggered the response message; -1> upon receiving a choice value set to ‘setup’: -2> apply the corresponding received configuration and start using the associated resources, unless explicitly specified otherwise; -1> upon receiving a choice value set to ‘release’: -2> clear the corresponding configuration and stop using the associated resources; -NOTE 2: At each point in time, the UE keeps a single value for each field except for during handover when the UE temporarily stores the previous configuration so it can revert back upon handover failure. In other words: when the UE reconfigures a field, the existing value is released except for during handover. -5.2 System information -5.2.1 Introduction -5.2.1.1 General -System information is divided into the MasterInformationBlock (MIB) and a number of SystemInformationBlocks (SIBs). The MIB includes a limited number of most essential and most frequently transmitted parameters that are needed to acquire other information from the cell, and is transmitted on BCH. SIBs other than SystemInformationBlockType1 are carried in SystemInformation (SI) messages and mapping of SIBs to SI messages is flexibly configurable by schedulingInfoList included in SystemInformationBlockType1, with restrictions that: each SIB is contained only in a single SI message, only SIBs having the same scheduling requirement (periodicity) can be mapped to the same SI message, and SystemInformationBlockType2 is always mapped to the SI message that corresponds to the first entry in the list of SI messages in schedulingInfoList. There may be multiple SI messages transmitted with the same periodicity. SystemInformationBlockType1 and all SI messages are transmitted on DL-SCH. -5.2.1.2 Scheduling -The MIB uses a fixed schedule with a periodicity of 40 ms and repetitions made within 40 ms. The first transmission of the MIB is scheduled in subframe #0 of radio frames for which the SFN mod 4 = 0, and repetitions are scheduled in subframe #0 of all other radio frames. -The SystemInformationBlockType1 uses a fixed schedule with a periodicity of 80 ms and repetitions made within 80 ms. The first transmission of SystemInformationBlockType1 is scheduled in subframe #5 of radio frames for which the SFN mod 8 = 0, and repetitions are scheduled in subframe #5 of all other radio frames for which SFN mod 2 = 0. -The SI messages are transmitted within periodically occurring time domain windows (referred to as SI-windows) using dynamic scheduling. Each SI message is associated with a SI-window and the SI-windows of different SI messages do not overlap. That is, within one SI-window only the corresponding SI is transmitted. The length of the SI-window is common for all SI messages, and is configurable. Within the SI-window, the corresponding SI message can be transmitted a number of times in any subframe other than MBSFN subframes, uplink subframes in TDD, and subframe #5 of radio frames for which SFN mod 2 = 0. The UE acquires the detailed time-domain scheduling (and other information, e.g. frequency-domain scheduling, used transport format) from decoding SI-RNTI on PDCCH (see TS 36.321 [6]). -A single SI-RNTI is used to address SystemInformationBlockType1 as well as all SI messages. -SystemInformationBlockType1 configures the SI-window length and the transmission periodicity for the SI messages. -5.2.1.3 System information validity and notification of changes -Change of system information (other than for ETWS) only occurs at specific radio frames, i.e. the concept of a modification period is used. System information may be transmitted a number of times with the same content within a modification period, as defined by its scheduling. The modification period boundaries are defined by SFN values for which SFN mod m= 0, where m is the number of radio frames comprising the modification period. The modification period is configured by system information. -When the network changes (some of the) system information, it first notifies the UEs about this change, i.e. this may be done throughout a modification period. In the next modification period, the network transmits the updated system information. These general principles are illustrated in figure 5.2.1.3-1, in which different colours indicate different system information. Upon receiving a change notification, the UE acquires the new system information immediately from the start of the next modification period. The UE applies the previously acquired system information until the UE acquires the new system information. - -Figure 5.2.1.3-1: Change of system Information -The Paging message is used to inform UEs in RRC_IDLE and UEs in RRC_CONNECTED about a system information change. If the UE receives a Paging message including the systemInfoModification, it knows that the system information will change at the next modification period boundary. Although the UE may be informed about changes in system information, no further details are provided e.g. regarding which system information will change. -SystemInformationBlockType1 includes a value tag, systemInfoValueTag, that indicates if a change has occurred in the SI messages. UEs may use systemInfoValueTag, e.g. upon return from out of coverage, to verify if the previously stored SI messages are still valid. Additionally, the UE considers stored system information to be invalid after 3 hours from the moment it was successfully confirmed as valid, unless specified otherwise. -E-UTRAN may not update systemInfoValueTag upon change of some system information e.g. ETWS information, regularly changing parameters like CDMA2000 system time (see 6.3). Similarly, E-UTRAN may not include the systemInfoModification within the Paging message upon change of some system information. -The UE verifies that stored system information remains valid by either checking systemInfoValueTag in SystemInformationBlockType1 after the modification period boundary, or attempting to find the systemInfoModification indication at least modificationPeriodCoeff times during the modification period in case no paging is received, in every modification period. If no paging message is received by the UE during a modification period, the UE may assume that no change of system information will occur at the next modification period boundary. If UE in RRC_CONNECTED, during a modification period, receives one paging message, it may deduce from the presence/ absence of systemInfoModification whether a change of system information other than ETWS information will occur in the next modification period or not. -ETWS capable UEs in RRC_CONNECTED shall attempt to read paging at least once every defaultPagingCycle to check whether ETWS notification is present or not. -5.2.1.4 Indication of ETWS notification -ETWS primary notification and/ or ETWS secondary notification can occur at any point in time. The Paging message is used to inform ETWS capable UEs in RRC_IDLE and UEs in RRC_CONNECTED about presence of an ETWS primary notification and/ or ETWS secondary notification. If the UE receives a Paging message including the etws-Indication, it shall start receiving the ETWS primary notification and/ or ETWS secondary notification according to schedulingInfoList contained in SystemInformationBlockType1. -ETWS primary notification is contained in SystemInformationBlockType10 and ETWS secondary notification is contained in SystemInformationBlockType11. Segmentation can be applied for the delivery of a secondary notification. The segmentation is fixed for transmission of a given secondary notification within a cell (i.e. the same segment size for a given segment with the same messageIdentifier, serialNumber and warningMessageSegmentNumber). -5.2.2 System information acquisition -5.2.2.1 General - -Figure 5.2.2.1-1: System information acquisition, normal -The UE applies the system information acquisition procedure to acquire the AS- and NAS- system information that is broadcasted by the E-UTRAN. The procedure applies to UEs in RRC_IDLE and UEs in RRC_CONNECTED. -5.2.2.2 Initiation -The UE shall apply the system information acquisition procedure upon selecting (e.g. upon power on) and upon re-selecting a cell, after handover completion, after entering E-UTRA from another RAT, upon return from out of coverage, upon receiving a notification that the system information has changed, upon receiving an indication about the presence of an ETWS notification, upon receiving a request from CDMA2000 upper layers and upon exceeding the maximum validity duration. Unless explicitly stated otherwise in the procedural specification, the system information acquisition procedure overwrites any stored system information, i.e. delta configuration is not applicable for system information and the UE discontinues using a field if it is absent in system information unless explicitly specified otherwise. -5.2.2.3 System information required by the UE -The UE shall: -1> ensure having a valid version, as defined below, of (at least) the following system information, also referred to as the ‘required’ system information: -2> if in RRC_IDLE: -3> the MasterInformationBlock and SystemInformationBlockType1 as well as SystemInformationBlockType2 through SystemInformationBlockType8, depending on support of the concerned RATs; -2> if in RRC_CONNECTED: -3> the MasterInformationBlock, SystemInformationBlockType1 and SystemInformationBlockType2 as well as SystemInformationBlockType8, depending on support of CDMA2000; -1> delete any stored system information after 3 hours from the moment it was confirmed to be valid as defined in 5.2.1.3, unless specified otherwise; -1> consider any stored system information except SystemInformationBlockType10 and SystemInformationBlockType11 to be invalid if systemInfoValueTag included in the SystemInformationBlockType1 is different from the one of the stored system information; -5.2.2.4 System information acquisition by the UE -The UE shall: -1> apply the specified BCCH configuration defined in 9.1.1.1; -1> if the procedure is triggered by a system information change notification: -2> start acquiring the required system information, as defined in 5.2.2.3, from the beginning of the modification period following the one in which the change notification was received; -NOTE 1: The UE continues using the previously received system information until the new system information has been acquired. -1> if the UE is in RRC_IDLE and enters a cell for which the UE does not have stored a valid version of the system information required in RRC_IDLE, as defined in 5.2.2.3: -2> acquire, using the system information acquisition procedure as defined in 5.2.3, the system information required in RRC_IDLE, as defined in 5.2.2.3; -1> following successful handover completion to a cell for which the UE does not have stored a valid version of the system information required in RRC_CONNECTED, as defined in 5.2.2.3: -2> acquire, using the system information acquisition procedure as defined in 5.2.3, the system information required in RRC_CONNECTED, as defined in 5.2.2.3; -2> upon acquiring the concerned system information: -3> discard the corresponding radio resource configuration information included in the radioResourceConfigCommon previously received in a dedicated message, if any; -1> following a request from CDMA2000 upper layers: -2> acquire SystemInformationBlockType8, as defined in 5.2.3; -1> neither initiate the RRC connection establishment procedure nor initiate transmission of the RRCConnectionReestablishmentRequest message until the UE has a valid version of the MasterInformationBlock and SystemInformationBlockType1 messages as well as SystemInformationBlockType2 ; -1> if the UE is ETWS capable: -2> upon entering a cell during RRC_IDLE, following successful handover or upon connection re-establishment: -3> discard any previously buffered warningMessageSegment; -3> clear, if any, the current values of messageIdentifier and serialNumber for SystemInformationBlockType11; -2> when the UE acquires SystemInformationBlockType1 following ETWS indication, upon entering a cell during RRC_IDLE, following successful handover and upon connection re-establishment: -3> if schedulingInfoList indicates that SystemInformationBlockType10 is present: -4> start acquiring SystemInformationBlockType10 immediately; -3> if schedulingInfoList indicates that SystemInformationBlockType11 is present: -4> start acquiring SystemInformationBlockType11 immediately; -NOTE 2: UEs shall start acquiring SystemInformationBlockType10 and SystemInformationBlockType11 as described above even when systemInfoValueTag in SystemInformationBlockType1 has not changed. -The UE may apply the received SIBs immediately, i.e. the UE does not need to delay using a SIB until all SI messages have been received. The UE may delay applying the received SIBs until completing lower layer procedures associated with a received or a UE originated RRC message, e.g. an ongoing random access procedure. -NOTE 3: While attempting to acquire a particular SIB, if the UE detects from schedulingInfoList that it is no longer present, the UE should stop trying to acquire the particular SIB. -5.2.2.5 Essential system information missing -The UE shall -1> if in RRC_IDLE or in RRC_CONNECTED while T311 is running; and -1> the UE is unable to acquire the MasterInformationBlock, the SystemInformationBlockType1 or the SystemInformationBlockType2: -2> treat the cell as barred in accordance with TS 36.304 [4]; -5.2.2.6 Actions upon reception of the MasterInformationBlock message -Upon receiving the MasterInformationBlock message the UE shall: -1> apply the radio resource configuration included in the phich-Config; -1> if the UE is in RRC_IDLE or if the UE is in RRC_CONNECTED while T311 is running: -2> if the UE has no valid system information stored according to 5.2.2.3 for the concerned cell: -3> apply the received value of dl-Bandwidth to the ul-Bandwidth until SystemInformationBlockType2 is received; -5.2.2.7 Actions upon reception of the SystemInformationBlockType1 message -Upon receiving the SystemInformationBlockType1 message the UE shall: -1> forward the cellIdentity to upper layers; -1> forward the trackingAreaCode to upper layers; -5.2.2.8 Actions upon reception of SystemInformation messages -No UE requirements related to the contents of the SystemInformation messages apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.9 Actions upon reception of SystemInformationBlockType2 -Upon receiving SystemInformationBlockType2, the UE shall: -1> if upper layers indicate that a (UE specific) paging cycle is configured: -2> Apply the shortest of the (UE specific) paging cycle and the defaultPagingCycle included in the radioResourceConfigCommon; -1> else: -2> Apply the defaultPagingCycle included in the radioResourceConfigCommon; -1> if the mbsfn-SubframeConfigList is included: -2> consider that no other DL assignments occur in the MBSFN subframes indicated in the IE mbsfn-SubframeConfigList: -1> apply the configuration included in the radioResourceConfigCommon; -1> apply the specified PCCH configuration defined in 9.1.1.3; -1> not apply the timeAlignmentTimerCommon; -5.2.2.10 Actions upon reception of SystemInformationBlockType3 -No UE requirements related to the contents of this SystemInformationBlock apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.11 Actions upon reception of SystemInformationBlockType4 -No UE requirements related to the contents of this SystemInformationBlock apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.12 Actions upon reception of SystemInformationBlockType5 -No UE requirements related to the contents of this SystemInformationBlock apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.13 Actions upon reception of SystemInformationBlockType6 -No UE requirements related to the contents of this SystemInformationBlock apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.14 Actions upon reception of SystemInformationBlockType7 -No UE requirements related to the contents of this SystemInformationBlock apply other than those specified elsewhere e.g. within procedures using the concerned system information, the corresponding field descriptions. -5.2.2.15 Actions upon reception of SystemInformationBlockType8 -Upon receiving SystemInformationBlockType8, the UE shall: -1> if the systemTimeInfo is included: -2> forward the systemTimeInfo to CDMA2000 upper layers; -1> if the UE is in RRC_IDLE and if searchWindowSize is included: -2> forward the searchWindowSize to CDMA2000 upper layers; -1> if parametersHRPD is included; -2> forward the preRegistrationInfoHRPD to CDMA2000 upper layers only if the UE has not received the preRegistrationInfoHRPD within an RRCConnectionReconfiguration message after entering this cell; -2> if the cellReselectionParametersHRPD is included: -3> forward the neighCellListHRPD to the CDMA2000 upper layers; -1> if the parameters1XRTT is included: -2> if the csfb-RegistrationParam1XRTT is included: -3> forward the csfb-RegistrationParam1XRTT to the CDMA2000 upper layers which will use this information to determine if a CS registration/re-registration towards CDMA2000 1xRTT in the EUTRA cell is required; -2> else: -3> indicate to CDMA2000 upper layers that CSFB Registration to CDMA2000 1xRTT is not allowed; -2> if the longCodeState1XRTT is included: -3> forward the longCodeState1XRTT to CDMA2000 upper layers; -2> if the cellReselectionParameters1XRTT is included: -3> forward the neighCellList1XRTT to the CDMA2000 upper layers; -5.2.2.16 Actions upon reception of SystemInformationBlockType9 -Upon receiving SystemInformationBlockType9, the UE shall: -1> if hnb-Name is included, forward the hnb-Name to upper layers; -5.2.2.17 Actions upon reception of SystemInformationBlockType10 -Upon receiving SystemInformationBlockType10, the UE shall: -1> if the received values of messageIdentifier and serialNumber are not the same (each value is the same as the corresponding parameter of a stored pair) as any of the up to two value pairs (messageIdentifier and serialNumber for SystemInformationBlockType10) stored for this PLMN; or there are no value pairs stored for this PLMN: -2> store, for this PLMN, the received values of messageIdentifier and serialNumber for SystemInformationBlockType10 as a pair, if necessary, replacing the oldest value pair (messageIdentifier and serialNumber for SystemInformationBlockType10) stored for this PLMN; -2> forward the received warningType, warningSecurityInfo (if present), messageIdentifier and serialNumber to upper layers; -1> else: -2> update the storage time of the messageIdentifier and serialNumber for SystemInformationBlockType10 pair that are equal to the values in the received SystemInformationBlockType10; -2> discard the received SystemInformationBlockType10 contents; -The UE shall store the values of messageIdentifier and serialNumber for SystemInformationBlockType10, as a pair, for the last two times that it forwarded warningType to upper layers. It shall store values separately for each PLMN for which it holds values. The UE should remove from storage values of messageIdentifier and serialNumber for SystemInformationBlockType10 when 3 hours have elapsed since they were last stored. -5.2.2.18 Actions upon reception of SystemInformationBlockType11 -Upon receiving SystemInformationBlockType11, the UE shall: -1> if the received values of messageIdentifier and serialNumber are the same (each value is the same as the corresponding parameter of a stored pair) as one of the, up to two, value pairs (messageIdentifier and serialNumber) for which a complete warningMessage has been passed to upper layers, stored for this PLMN: -2> update the storage time of the messageIdentifier and serialNumber for SystemInformationBlockType11 pair that are equal to the values in the received SystemInformationBlockType11; -2> discard the received SystemInformationBlockType11 contents; -2> stop reception of SystemInformationBlockType11; -1> else: -2> if there is no current value for messageIdentifier and serialNumber for SystemInformationBlockType11; or -2> if either the received value of messageIdentifier or of serialNumber or of both are different from the current values of messageIdentifier and serialNumber for SystemInformationBlockType11: -3> use the received values of messageIdentifer and serialNumber for SystemInformationBlockType11 as the current values of messageIdentifier and serialNumber for SystemInformationBlockType11; -3> discard any previously buffered warningMessageSegment; -3> if all segments of a warning message have been received: -4> assemble the warningMessage from the received warningMessageSegment; -4> forward the received warningMessage, messageIdentifier, serialNumber and dataCodingScheme to upper layers; -4> stop reception of SystemInformationBlockType11; -4> store the current values of messageIdentifier and serialNumber for SystemInformationBlockType11 as a messageIdentifier and serialNumber for SystemInformationBlockType11 pair for which a complete warningMessage has been passed to upper layers for this PLMN, replacing the oldest stored value pair if necessary; -4> discard the current values of messageIdentifier and serialNumber for SystemInformationBlockType11; -3> else: -4> store the received warningMessageSegment; -4> continue reception of SystemInformationBlockType11; -2> else if all segments of a warning message have been received: -3> assemble the warningMessage from the received warningMessageSegment; -3> forward the received complete warningMessage, messageIdentifier, serialNumber and dataCodingScheme to upper layers; -3> stop reception of SystemInformationBlockType11; -3> store the current values of messageIdentifier and serialNumber for SystemInformationBlockType11 as a messageIdentifier and serialNumber for SystemInformationBlockType11 pair for which a complete warningMessage has been passed to upper layers for this PLMN, replacing the oldest stored value pair if necessary; -3> discard the current values of messageIdentifier and serialNumber for SystemInformationBlockType11; -2> else: -3> continue reception of SystemInformationBlockType11; -The UE shall store the values of messageIdentifier and serialNumber for SystemInformationBlockType11 associated with the last two times that it forwarded a complete warningMessage to upper layers. It shall store values separately for each PLMN for which it holds values. The UE should remove from storage values of messageIdentifier and serialNumber for SystemInformationBlockType11 when 3 hours have elapsed since they were last stored. -The UE should discard the current values of messageIdentifier and serialNumber for SystemInformationBlockType11 if they have remained unchanged for a period of 3 hours from the time that they were first used or if it detects that SystemInformationBlockType11 is no longer scheduled in SystemInformationBlockType1. If the UE discards the current values of messageIdentifier and serialNumber for SystemInformationBlockType11 it shall also discard any stored warningMessageSegments. -5.2.3 Acquisition of an SI message -When acquiring an SI message, the UE shall: -1> determine the start of the SI-window for the concerned SI message as follows: -2> for the concerned SI message, determine the number n which corresponds to the order of entry in the list of SI messages configured by schedulingInfoList in SystemInformationBlockType1; -2> determine the integer value x = (n – 1)*w, where w is the si-WindowLength; -2> the SI-window starts at the subframe #a, where a = x mod 10, in the radio frame for which SFN mod T = FLOOR(x/10), where T is the si-Periodicity of the concerned SI message; -NOTE: E-UTRAN should configure an SI-window of 1 ms only if all SIs are scheduled before subframe #5 in radio frames for which SFN mod 2 = 0. -1> receive DL-SCH using the SI-RNTI from the start of the SI-window and continue until the end of the SI-window whose absolute length in time is given by si-WindowLength, or until the SI message was received, excluding the following subframes: -2> subframe #5 in radio frames for which SFN mod 2 = 0; -2> any MBSFN subframes; -2> any uplink subframes in TDD; -1> if the SI message was not received by the end of the SI-window, repeat reception at the next SI-window occasion for the concerned SI message; -5.3 Connection control -5.3.1 Introduction -5.3.1.1 RRC connection control -RRC connection establishment involves the establishment of SRB1. E-UTRAN completes RRC connection establishment prior to completing the establishment of the S1 connection, i.e. prior to receiving the UE context information from the EPC. Consequently, AS security is not activated during the initial phase of the RRC connection. During this initial phase of the RRC connection, the E-UTRAN may configure the UE to perform measurement reporting. However, the UE only accepts a handover message when security has been activated. -Upon receiving the UE context from the EPC, E-UTRAN activates security (both ciphering and integrity protection) using the initial security activation procedure. The RRC messages to activate security (command and successful response) are integrity protected, while ciphering is started only after completion of the procedure. That is, the response to the message used to activate security is not ciphered, while the subsequent messages (e.g. used to establish SRB2 and DRBs) are both integrity protected and ciphered. -After having initiated the initial security activation procedure, E-UTRAN initiates the establishment of SRB2 and DRBs, i.e. E-UTRAN may do this prior to receiving the confirmation of the initial security activation from the UE. In any case, E-UTRAN will apply both ciphering and integrity protection for the RRC connection reconfiguration messages used to establish SRB2 and DRBs. E-UTRAN should release the RRC connection if the initial security activation and/ or the radio bearer establishment fails (i.e. security activation and DRB establishment are triggered by a joint S1-procedure, which does not support partial success). -For SRB2 and DRBs, security is always activated from the start, i.e. the E-UTRAN does not establish these bearers prior to activating security. -The release of the RRC connection is initiated by E-UTRAN. The procedure may be used to re-direct the UE to another frequency or RAT. In exceptional cases the UE may abort the RRC connection, i.e. move to RRC_IDLE without notifying E-UTRAN. -5.3.1.2 Security -AS security comprises of the integrity protection of RRC signalling (SRBs) as well as the ciphering of RRC signalling (SRBs) and user data (DRBs). -RRC handles the configuration of the security parameters which are part of the AS configuration: the integrity protection algorithm, the ciphering algorithm and two parameters, namely the keyChangeIndicator and the nextHopChainingCount, which are used by the UE to determine the AS security keys upon handover and/ or connection re-establishment. -The integrity protection algorithm is common for signalling radio bearers SRB1 and SRB2. The ciphering algorithm is common for all radio bearers (i.e. SRB1, SRB2 and DRBs). Neither integrity protection nor ciphering applies for SRB0. -RRC integrity and ciphering are always activated together, i.e. in one message/ procedure. RRC integrity and ciphering are never de-activated. However, it is possible to switch to a ‘NULL’ ciphering algorithm (eea0). -NOTE 1: UICC-less emergency calls are not supported in this release of the specification. -NOTE 2: Lower layers discard RRC messages for which the integrity check has failed and indicate the integrity verification check failure to RRC. -The AS applies three different security keys: one for the integrity protection of RRC signalling (KRRCint), one for the ciphering of RRC signalling (KRRCenc) and one for the ciphering of user data (KUPenc). All three AS keys are derived from the KeNB key. The KeNB is based on the KASME key, which is handled by upper layers. -Upon connection establishment new AS keys are derived. No AS-parameters are exchanged to serve as inputs for the derivation of the new AS keys at connection establishment. -The integrity and ciphering of the RRC message used to perform handover is based on the security configuration used prior to the handover and is performed by the source eNB. -The integrity and ciphering algorithms can only be changed upon handover. The four AS keys (KeNB, KRRCint, KRRCenc and KUPenc) change upon every handover and connection re-establishment. The keyChangeIndicator is used upon handover and indicates whether the UE should use the keys associated with the latest available KASME key. The nextHopChainingCount parameter is used upon handover and connection re-establishment by the UE when deriving the new KeNB that is used to generate KRRCint, KRRCenc and KUPenc (see TS 33.401 [32]). An intra cell handover procedure may be used to change the keys in RRC_CONNECTED. -For each radio bearer an independent counter (COUNT, as specified in TS 36.323 [8]) is maintained for each direction. For each DRB, the COUNT is used as input for ciphering. For each SRB, the COUNT is used as input for both ciphering and integrity protection. It is not allowed to use the same COUNT value more than once for a given security key. In order to limit the signalling overhead, individual messages/ packets include a short sequence number (PDCP SN, as specified in TS 36.323 [8]). In addition, an overflow counter mechanism is used: the hyper frame number (TX_HFN and RX_HFN, as specified in TS 36.323 [8]). The HFN needs to be synchronized between the UE and the eNB. The eNB is responsible for avoiding reuse of the COUNT with the same RB identity and with the same KeNB, e.g. due to the transfer of large volumes of data, release and establishment of new RBs. In order to avoid such re-use, the eNB may e.g. use different RB identities for successive RB establishments, trigger an intra cell handover or an RRC_CONNECTED to RRC_IDLE to RRC_CONNECTED transition. -For each SRB, the value provided by RRC to lower layers to derive the 5-bit BEARER parameter used as input for ciphering and for integrity protection is the value of the corresponding srb-Identity with the MSBs padded with zeroes. -5.3.1.3 Connected mode mobility -In RRC_CONNECTED, the network controls UE mobility, i.e. the network decides when the UE shall move to which cell (which may be on another frequency or RAT). For network controlled mobility in RRC_CONNECTED, handover is the only procedure that is defined. The network triggers the handover procedure e.g. based on radio conditions, load. To facilitate this, the network may configure the UE to perform measurement reporting (possibly including the configuration of measurement gaps). The network may also initiate handover blindly, i.e. without having received measurement reports from the UE. -Before sending the handover message to the UE, the source eNB prepares one or more target cells. The target eNB generates the message used to perform the handover, i.e. the message including the AS-configuration to be used in the target cell. The source eNB transparently (i.e. does not alter values/ content) forwards the handover message/ information received from the target to the UE. When appropriate, the source eNB may initiate data forwarding for (a subset of) the DRBs. -After receiving the handover message, the UE attempts to access the target cell at the first available RACH occasion according to Random Access resource selection defined in TS 36.321 [6], i.e. the handover is asynchronous. Consequently, when allocating a dedicated preamble for the random access in the target cell, E-UTRA shall ensure it is available from the first RACH occasion the UE may use. Upon successful completion of the handover, the UE sends a message used to confirm the handover. -After the successful completion of handover, PDCP SDUs may be re-transmitted in the target cell. This only applies for DRBs using RLC-AM mode. The further details are specified in TS 36.323 [8]. After the successful completion of handover, the SN and the HFN are reset except for the DRBs using RLC-AM mode (for which both SN and HFN continue). The further details are specified in TS 36.323 [8]. -One UE behaviour to be performed upon handover is specified, i.e. this is regardless of the handover procedures used within the network (e.g. whether the handover includes X2 or S1 signalling procedures). -The source eNB should, for some time, maintain a context to enable the UE to return in case of handover failure. After having detected handover failure, the UE attempts to resume the RRC connection either in the source or in another cell using the RRC re-establishment procedure. This connection resumption succeeds only if the accessed cell is prepared, i.e. concerns a cell of the source eNB or of another eNB towards which handover preparation has been performed. -5.3.2 Paging -5.3.2.1 General - -Figure 5.3.2.1-1: Paging -The purpose of this procedure is to transmit paging information to a UE in RRC_IDLE and/ or to inform UEs in RRC_IDLE and UEs in RRC_CONNECTED about a system information change and/ or about an ETWS primary notification and/ or ETWS secondary notification. The paging information is provided to upper layers, which in response may initiate RRC connection establishment, e.g. to receive an incoming call. -5.3.2.2 Initiation -E-UTRAN initiates the paging procedure by transmitting the Paging message at the UE’s paging occasion as specified in TS 36.304 [4]. E-UTRAN may address multiple UEs within a Paging message by including one PagingRecord for each UE. E-UTRAN may also indicate a change of system information and/ or provide an ETWS notification in the Paging message. -5.3.2.3 Reception of the Paging message by the UE -Upon receiving the Paging message, the UE shall: -1> if in RRC_IDLE, for each of the PagingRecord, if any, included in the Paging message: -2> if the ue-Identity included in the PagingRecord matches one of the UE identities allocated by upper layers: -3> forward the ue-Identity and the cn-Domain to the upper layers; -1> if the systemInfoModification is included: -2> re-acquire the required system information using the system information acquisition procedure as specified in 5.2.2. -1> if the etws-Indication is included and the UE is ETWS capable: -2> re-acquire SystemInformationBlockType1 immediately, i.e., without waiting until the next system information modification period boundary; -2> if the schedulingInfoList indicates that SystemInformationBlockType10 is present: -3> acquire SystemInformationBlockType10; -2> if the schedulingInfoList indicates that SystemInformationBlockType11 is present: -3> acquire SystemInformationBlockType11; -5.3.3 RRC connection establishment -5.3.3.1 General - -Figure 5.3.3.1-1: RRC connection establishment, successful - -Figure 5.3.3.1-2: RRC connection establishment, network reject -The purpose of this procedure is to establish an RRC connection. RRC connection establishment involves SRB1 establishment. The procedure is also used to transfer the initial NAS dedicated information/ message from the UE to E-UTRAN. -E-UTRAN applies the procedure as follows: -- to establish SRB1 only. -5.3.3.2 Initiation -The UE initiates the procedure when upper layers request establishment of an RRC connection while the UE is in RRC_IDLE. -Upon initiation of the procedure, the UE shall: -1> if the UE is establishing the RRC connection for mobile terminating calls: -2> if timer T302 is running: -3> consider access to the cell as barred; -2> else: -3> consider access to the cell as not barred; -1> else if the UE is establishing the RRC connection for emergency calls: -2> if SystemInformationBlockType2 includes the ac-BarringInfo: -3> if the ac-BarringForEmergency is set to FALSE: -4> consider access to the cell as not barred; -3> else if the UE has one or more Access Classes, as stored on the USIM, with a value in the range 11..15, which is valid for the UE to use according to TS 22.011 [10] and TS 23.122 [11]: -NOTE 1: ACs 12, 13, 14 are only valid for use in the home country and ACs 11, 15 are only valid for use in the HPLMN/ EHPLMN. -4> if the ac-BarringInfo includes ac-BarringForMO-Data, and for all of the valid Access Classes for the UE, the corresponding bit in the ac-BarringForSpecialAC contained in ac-BarringForMO-Data is set to one: -5> consider access to the cell as barred; -4> else: -5> consider access to the cell as not barred; -3> else: -4> consider access to the cell as barred; -2> else: -3> consider access to the cell as not barred; -1> else if the UE is establishing the RRC connection for mobile originating calls: -2> if timer T302 or T303 is running: -3> consider access to the cell as barred; -2> else if SystemInformationBlockType2 includes the ac-BarringInfo and the ac-BarringForMO-Data is present: -3> if the UE has one or more Access Classes, as stored on the USIM, with a value in the range 11..15, which is valid for the UE to use according to TS 22.011 [10] and TS 23.122 [11], and -3> for at least one of these Access Classes the corresponding bit in the ac-BarringForSpecialAC contained in ac-BarringForMO-Data is set to zero: -4> consider access to the cell as not barred; -3> else: -4> draw a random number ‘rand’ uniformly distributed in the range: 0 ? rand < 1; -4> if ‘rand’ is lower than the value indicated by ac-BarringFactor included in ac-BarringForMO-Data: -5> consider access to the cell as not barred; -4> else: -5> consider access to the cell as barred; -2> else: -3> consider access to the cell as not barred; -1> else (the UE is establishing the RRC connection for mobile originating signalling): -2> if timer T302 or T305 is running: -3> consider access to the cell as barred; -2> else if SystemInformationBlockType2 includes the ac-BarringInfo and the ac-BarringForMO-Signalling is present: -3> if the UE has one or more Access Classes, as stored on the USIM, with a value in the range 11..15, which is valid for the UE to use according to TS 22.011 [10] and TS 23.122 [11], and -3> for at least one of these Access Classes the corresponding bit in the ac-BarringForSpecialAC contained in ac-BarringForMO-Signalling is set to zero: -4> consider access to the cell as not barred; -3> else: -4> draw a random number ‘rand’ uniformly distributed in the range: 0 ? rand < 1; -4> if ‘rand’ is lower than the value indicated by ac-BarringFactor included in ac-BarringForMO-Signalling: -5> consider access to the cell as not barred; -4> else: -5> consider access to the cell as barred; -2> else: -3> consider access to the cell as not barred; -1> if access to the cell, as specified above, is not barred: -2> apply the default physical channel configuration as specified in 9.2.4; -2> apply the default semi-persistent scheduling configuration as specified in 9.2.3; -2> apply the default MAC main configuration as specified in 9.2.2; -2> apply the CCCH configuration as specified in 9.1.1.2; -2> apply the timeAlignmentTimerCommon included in SystemInformationBlockType2; -2> start timer T300; -2> initiate transmission of the RRCConnectionRequest message in accordance with 5.3.3.3; -NOTE 2: Upon initiating the connection establishment procedure, the UE is not required to ensure it maintains up to date system information applicable only for UEs in RRC_IDLE state. However, the UE needs to perform system information acquisition upon cell re-selection. -1> else: -2> if the UE is establishing the RRC connection for mobile originating calls and if both timers T302 and T303 are not running: -3> draw a random number ‘rand’ that is uniformly distributed in the range 0 ? rand < 1; -3> start timer T303 with the timer value calculated as follows, using the ac-BarringTime included in ac-BarringForMO-Data: -T303= (0.7+ 0.6 * rand) * ac-BarringTime -3> inform upper layers about the failure to establish the RRC connection and that access barring for mobile originating calls is applicable, upon which the procedure ends; -2> else if the UE is establishing the RRC connection for mobile originating signalling and if both timers T302 and T305 are not running: -3> draw a random number ‘rand’ that is uniformly distributed in the range 0 ? rand < 1; -3> start timer T305 with the timer value calculated as follows, using the ac-BarringTime included in ac-BarringForMO-Signalling: -T305= (0.7+ 0.6 * rand) * ac-BarringTime -3> inform upper layers about the failure to establish the RRC connection and that access barring for mobile originating signalling is applicable, upon which the procedure ends; -2> else if the UE is establishing the RRC connection for emergency calls: -3> inform upper layers about the failure to establish the RRC connection and that access barring for emergency calls is applicable, upon which the procedure ends; -2> else: -3> inform upper layers about the failure to establish the RRC connection, upon which the procedure ends; -5.3.3.3 Actions related to transmission of RRCConnectionRequest message -The UE shall set the contents of RRCConnectionRequest message as follows: -1> set the ue-Identity as follows: -2> if upper layers provide an S-TMSI: -3> set the ue-Identity to the value received from upper layers; -2> else: -3> draw a random value in the range 0 .. 240-1 and set the ue-Identity to this value; -NOTE 1: Upper layers provide the S-TMSI if the UE is registered in the TA of the current cell. -1> set the establishmentCause in accordance with the information received from upper layers; -The UE shall submit the RRCConnectionRequest message to lower layers for transmission. -The UE shall continue cell re-selection related measurements as well as cell re-selection evaluation. If the conditions for cell re-selection are fulfilled, the UE shall perform cell re-selection as specified in 5.3.3.5. -5.3.3.4 Reception of the RRCConnectionSetup by the UE -NOTE: Prior to this, lower layer signalling is used to allocate a C-RNTI. For further details see TS 36.321 [6]; -The UE shall: -1> perform the radio resource configuration procedure in accordance with the received radioResourceConfigDedicated and as specified in 5.3.10; -1> if stored, discard the cell reselection priority information provided by the idleModeMobilityControlInfo or inherited from another RAT; -1> stop timer T300; -1> stop timer T302, if running; -1> stop timer T303, if running; -1> stop timer T305, if running; -1> perform the actions as specified in 5.3.3.7; -1> stop timer T320, if running; -1> enter RRC_CONNECTED; -1> stop the cell re-selection procedure; -1> set the content of RRCConnectionSetupComplete message as follows: -2> set the selectedPLMN-Identity to the PLMN selected by upper layers (see TS 23.122 [11], TS 24.301 [35]) from the PLMN(s) included in the plmn-IdentityList in SystemInformationBlockType1; -2> if upper layers provide the ‘Registered MME’, include and set the registeredMME as follows: -3> if the PLMN identity of the ‘Registered MME’ is different from the PLMN selected by the upper layers: -4> include the plmnIdentity in the registeredMME and set it to the value of the PLMN identity in the ‘Registered MME’ received from upper layers; -3> set the mmegi and the mmec to the value received from upper layers; -2> set the dedicatedInfoNAS to include the information received from upper layers; -2> submit the RRCConnectionSetupComplete message to lower layers for transmission, upon which the procedure ends; -5.3.3.5 Cell re-selection while T300, T302, T303 or T305 is running -The UE shall: -1> if cell reselection occurs while T300, T302, T303 or T305 is running: -2> if timer T302, T303 and/ or T305 is running: -3> stop timer T302, T303 and T305, whichever ones were running; -3> perform the actions as specified in 5.3.3.7; -2> if timer T300 is running: -3> stop timer T300; -3> reset MAC, release the MAC configuration and re-establish RLC for all RBs that are established; -3> inform upper layers about the failure to establish the RRC connection, upon which the procedure ends; -5.3.3.6 T300 expiry -The UE shall: -1> if timer T300 expires: -2> reset MAC, release the MAC configuration and re-establish RLC for all RBs that are established; -2> inform upper layers about the failure to establish the RRC connection, upon which the procedure ends; -5.3.3.7 T302, T303 or T305 expiry or stop -The UE shall: -1> if timer T302 expires or is stopped: -2> inform upper layers about barring alleviation for mobile terminating access; -2> if timer T303 is not running: -3> inform upper layers about barring alleviation for mobile originating calls; -2> if timer T305 is not running: -3> inform upper layers about barring alleviation for mobile originating signalling; -1> if timer T303 expires or is stopped: -2> if timer T302 is not running: -3> inform upper layers about barring alleviation for mobile originating calls; -1> if timer T305 expires or is stopped: -2> if timer T302 is not running: -3> inform upper layers about barring alleviation for mobile originating signalling; -5.3.3.8 Reception of the RRCConnectionReject by the UE -The UE shall: -1> stop timer T300; -1> reset MAC and release the MAC configuration; -1> start timer T302, with the timer value set to the waitTime; -1> inform upper layers about the failure to establish the RRC connection and that access barring for mobile originating calls, mobile originating signalling and mobile terminating access is applicable, upon which the procedure ends; -5.3.3.9 Abortion of RRC connection establishment -If upper layers abort the RRC connection establishment procedure while the UE has not yet entered RRC_CONNECTED, the UE shall: -1> stop timer T300, if running; -1> reset MAC, release the MAC configuration and re-establish RLC for all RBs that are established; -5.3.4 Initial security activation -5.3.4.1 General - -Figure 5.3.4.1-1: Security mode command, successful - -Figure 5.3.4.1-2: Security mode command, failure -The purpose of this procedure is to activate AS security upon RRC connection establishment. -5.3.4.2 Initiation -E-UTRAN initiates the security mode command procedure to a UE in RRC_CONNECTED. Moreover, E-UTRAN applies the procedure as follows: -- when only SRB1 is established, i.e. prior to establishment of SRB2 and/ or DRBs. -5.3.4.3 Reception of the SecurityModeCommand by the UE -The UE shall: -1> derive the KeNB key, as specified in TS 33.401 [32]; -1> derive the KRRCint key associated with the integrityProtAlgorithm indicated in the SecurityModeCommand message, as specified in TS 33.401 [32]; -1> request lower layers to verify the integrity protection of the SecurityModeCommand message, using the algorithm indicated by the integrityProtAlgorithm as included in the SecurityModeCommand message and the KRRCint key; -1> if the SecurityModeCommand message passes the integrity protection check: -2> derive the KRRCenc key and the KUPenc key associated with the cipheringAlgorithm indicated in the SecurityModeCommand message, as specified in TS 33.401 [32]; -2> configure lower layers to apply integrity protection using the indicated algorithm and the KRRCint key immediately, i.e. integrity protection shall be applied to all subsequent messages received and sent by the UE, including the SecurityModeComplete message; -2> configure lower layers to apply ciphering using the indicated algorithm, the KRRCenc key and the KUPenc key after completing the procedure, i.e. ciphering shall be applied to all subsequent messages received and sent by the UE, except for the SecurityModeComplete message which is sent unciphered; -2> consider AS security to be activated; -2> submit the SecurityModeComplete message to lower layers for transmission, upon which the procedure ends; -1> else: -2> continue using the configuration used prior to the reception of the SecurityModeCommand message, i.e. neither apply integrity protection nor ciphering. -2> submit the SecurityModeFailure message to lower layers for transmission, upon which the procedure ends; -5.3.5 RRC connection reconfiguration -5.3.5.1 General - -Figure 5.3.5.1-1: RRC connection reconfiguration, successful - -Figure 5.3.5.1-2: RRC connection reconfiguration, failure -The purpose of this procedure is to modify an RRC connection, e.g. to establish/ modify/ release RBs, to perform handover, to setup/ modify/ release measurements. As part of the procedure, NAS dedicated information may be transferred from E-UTRAN to the UE. -5.3.5.2 Initiation -E-UTRAN may initiate the RRC connection reconfiguration procedure to a UE in RRC_CONNECTED. E-UTRAN applies the procedure as follows: -- the mobilityControlInfo is included only when AS-security has been activated, and SRB2 with at least one DRB are setup and not suspended; -- the establishment of RBs (other than SRB1, that is established during RRC connection establishment) is included only when AS security has been activated; -5.3.5.3 Reception of an RRCConnectionReconfiguration not including the mobilityControlInfo by the UE -If the RRCConnectionReconfiguration message does not include the mobilityControlInfo and the UE is able to comply with the configuration included in this message, the UE shall: -1> if this is the first RRCConnectionReconfiguration message after successful completion of the RRC Connection Re-establishment procedure: -2> re-establish PDCP for SRB2 and for all DRBs that are established, if any; -2> re-establish RLC for SRB2 and for all DRBs that are established, if any; -2> if the RRCConnectionReconfiguration message includes the radioResourceConfigDedicated: -3> perform the radio resource configuration procedure as specified in 5.3.10; -2> resume SRB2 and all DRBs that are suspended, if any; -NOTE 1: The handling of the radio bearers after the successful completion of the PDCP re-establishment, e.g. the re-transmission of unacknowledged PDCP SDUs (as well as the associated status reporting), the handling of the SN and the HFN, is specified in TS 36.323 [8]. -1> else: -2> if the RRCConnectionReconfiguration message includes the radioResourceConfigDedicated: -3> perform the radio resource configuration procedure as specified in 5.3.10; -NOTE 2: If the RRCConnectionReconfiguration message includes the establishment of radio bearers other than SRB1, the UE may start using these radio bearers immediately, i.e. there is no need to wait for an outstanding acknowledgment of the SecurityModeComplete message. -1> if the RRCConnectionReconfiguration message includes the dedicatedInfoNASList: -2> forward each element of the dedicatedInfoNASList to upper layers; -1> if the RRCConnectionReconfiguration message includes the measConfig: -2> perform the measurement configuration procedure as specified in 5.5.2; -1> submit the RRCConnectionReconfigurationComplete message to lower layers for transmission using the new configuration, upon which the procedure ends; -5.3.5.4 Reception of an RRCConnectionReconfiguration including the mobilityControlInfo by the UE (handover) -If the RRCConnectionReconfiguration message includes the mobilityControlInfo and the UE is able to comply with the configuration included in this message, the UE shall: -1> stop timer T310, if running; -1> start timer T304 with the timer value set to t304, as included in the mobilityControlInfo; -1> if the carrierFreq is included: -2> consider the target cell to be one on the frequency indicated by the carrierFreq with a physical cell identity indicated by the targetPhysCellId; -1> else: -2> consider the target cell to be one on the current frequency with a physical cell identity indicated by the targetPhysCellId; -1> start synchronising to the DL of the target cell; -NOTE 1: The UE should perform the handover as soon as possible following the reception of the RRC message triggering the handover, which could be before confirming successful reception (HARQ and ARQ) of this message. -1> reset MAC; -1> re-establish PDCP for all RBs that are established; -NOTE 2: The handling of the radio bearers after the successful completion of the PDCP re-establishment, e.g. the re-transmission of unacknowledged PDCP SDUs (as well as the associated status reporting), the handling of the SN and the HFN, is specified in TS 36.323 [8]. -1> re-establish RLC for all RBs that are established; -1> apply the value of the newUE-Identity as the C-RNTI; -1> configure lower layers in accordance with the received radioResourceConfigCommon; -1> if the RRCConnectionReconfiguration message includes the radioResourceConfigDedicated: -2> perform the radio resource configuration procedure as specified in 5.3.10; -1> if the keyChangeIndicator received in the securityConfigHO is set to TRUE: -2> update the KeNB key based on the fresh KASME key taken into use with the previous successful NAS SMC procedure, as specified in TS 33.401 [32]; -1> else: -2> update the KeNB key based on the current KeNB or the NH, using the nextHopChainingCount value indicated in the securityConfigHO, as specified in TS 33.401 [32]; -1> store the nextHopChainingCount value; -1> if the securityAlgorithmConfig is included in the securityConfigHO: -2> derive the KRRCint key associated with the integrityProtAlgorithm, as specified in TS 33.401 [32]; -2> derive the KRRCenc key and the KUPenc key associated with the cipheringAlgorithm, as specified in TS 33.401 [32]; -1> else: -2> derive the KRRCint key associated with the current integrity algorithm, as specified in TS 33.401 [32]; -2> derive the KRRCenc key and the KUPenc key associated with the current ciphering algorithm, as specified in TS 33.401 [32]; -1> configure lower layers to apply the integrity protection algorithm and the KRRCint key, i.e. the integrity protection configuration shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> configure lower layers to apply the ciphering algorithm, the KRRCenc key and the KUPenc key, i.e. the ciphering configuration shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> perform the measurement related actions as specified in 5.5.6.1; -1> if the RRCConnectionReconfiguration message includes the measConfig: -2> perform the measurement configuration procedure as specified in 5.5.2; -1> submit the RRCConnectionReconfigurationComplete message to lower layers for transmission; -1> if MAC successfully completes the random access procedure: -2> stop timer T304; -2> apply the parts of the configuration that do not require the UE to know the SFN of the target cell; -2> apply the parts of the measurement and the radio resource configuration that require the UE to know the SFN of the target cell (e.g. measurement gaps, periodic CQI reporting, scheduling request configuration, sounding RS configuration), if any, upon acquiring the SFN of the target cell; -2> the procedure ends; -NOTE 3: The UE is not required to determine the SFN of the target cell by acquiring system information from that cell before performing RACH access in the target cell. -5.3.5.5 Reconfiguration failure -The UE shall: -1> if the UE is unable to comply with (part of) the configuration included in the RRCConnectionReconfiguration message: -2> continue using the configuration used prior to the reception of RRCConnectionReconfiguration message; -2> if security has not been activated: -3> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘other’; -2> else: -3> initiate the connection re-establishment procedure as specified in 5.3.7, upon which the connection reconfiguration procedure ends; -NOTE 1: The UE may apply above failure handling also in case the RRCConnectionReconfiguration message causes a protocol error for which the generic error handling as defined in 5.7 specifies that the UE shall ignore the message. -NOTE 2: If the UE is unable to comply with part of the configuration, it does not apply any part of the configuration, i.e. there is no partial success/ failure. -5.3.5.6 T304 expiry (handover failure) -The UE shall: -1> if T304 expires (handover failure): -NOTE: Following T304 expiry any dedicated preamble, if provided within the rach-ConfigDedicated, is not available for use by the UE anymore. -2> revert back to the configuration used in the source cell, excluding the configuration configured by the physicalConfigDedicated, the mac-MainConfig and the sps-Config; -2> initiate the connection re-establishment procedure as specified in 5.3.7, upon which the RRC connection reconfiguration procedure ends; -5.3.6 Counter check -5.3.6.1 General - -Figure 5.3.6.1-1: Counter check procedure -The counter check procedure is used by E-UTRAN to request the UE to verify the amount of data sent/ received on each DRB. More specifically, the UE is requested to check if, for each DRB, the most significant bits of the COUNT match with the values indicated by E-UTRAN. -NOTE: The procedure enables E-UTRAN to detect packet insertion by an intruder (a ‘man in the middle’). -5.3.6.2 Initiation -E-UTRAN initiates the procedure by sending a CounterCheck message. -NOTE: E-UTRAN may initiate the procedure when any of the COUNT values reaches a specific value. -5.3.6.3 Reception of the CounterCheck message by the UE -Upon receiving the CounterCheck message, the UE shall: -1> for each DRB that is established: -2> if no COUNT exists for a given direction (uplink or downlink) because it is a uni-directional bearer configured only for the other direction: -3> assume the COUNT value to be ‘0’ for the unused direction; -2> if the drb-Identity is not included in the drb-CountMSB-InfoList: -3> include the DRB in the drb-CountInfoList in the CounterCheckResponse message by including the drb-Identity, the count-Uplink and the count-Downlink set to the value of the corresponding COUNT; -2> else if, for at least one direction, the most significant bits of the COUNT are different from the value indicated in the drb-CountMSB-InfoList: -3> include the DRB in the drb-CountInfoList in the CounterCheckResponse message by including the drb-Identity, the count-Uplink and the count-Downlink set to the value of the corresponding COUNT; -1> for each DRB that is included in the drb-CountMSB-InfoList in the CounterCheck message that is not established: -2> include the DRB in the drb-CountInfoList in the CounterCheckResponse message by including the drb-Identity, the count-Uplink and the count-Downlink with the most significant bits set identical to the corresponding values in the drb-CountMSB-InfoList and the least significant bits set to zero; -1> submit the CounterCheckResponse message to lower layers for transmission upon which the procedure ends; -5.3.7 RRC connection re-establishment -5.3.7.1 General - -Figure 5.3.7.1-1: RRC connection re-establishment, successful - -Figure 5.3.7.1-2: RRC connection re-establishment, failure -The purpose of this procedure is to re-establish the RRC connection, which involves the resumption of SRB1 operation and the re-activation of security. -A UE in RRC_CONNECTED, for which security has been activated, may initiate the procedure in order to continue the RRC connection. The connection re-establishment succeeds only if the concerned cell is prepared i.e. has a valid UE context. In case E-UTRAN accepts the re-establishment, SRB1 operation resumes while the operation of other radio bearers remains suspended. If AS security has not been activated, the UE does not initiate the procedure but instead moves to RRC_IDLE directly. -E-UTRAN applies the procedure as follows: -- to reconfigure SRB1 and to resume data transfer only for this RB; -- to re-activate AS security without changing algorithms. -5.3.7.2 Initiation -The UE shall only initiate the procedure when AS security has been activated. The UE initiates the procedure when one of the following conditions is met: -1> upon detecting radio link failure, in accordance with 5.3.11; or -1> upon handover failure, in accordance with 5.3.5.6; or -1> upon mobility from E-UTRA failure, in accordance with 5.4.3.5; or -1> upon integrity check failure indication from lower layers; or -1> upon an RRC connection reconfiguration failure, in accordance with 5.3.5.5; -Upon initiation of the procedure, the UE shall: -1> stop timer T310, if running; -1> start timer T311; -1> suspend all RBs except SRB0; -1> reset MAC; -1> apply the default physical channel configuration as specified in 9.2.4; -1> apply the default semi-persistent scheduling configuration as specified in 9.2.3; -1> apply the default MAC main configuration as specified in 9.2.2; -1> perform cell selection in accordance with the cell selection process as specified in TS 36.304 [4]; -5.3.7.3 Actions following cell selection while T311 is running -Upon selecting a suitable E-UTRA cell, the UE shall: -1> stop timer T311; -1> start timer T301; -1> apply the timeAlignmentTimerCommon included in SystemInformationBlockType2; -1> initiate transmission of the RRCConnectionReestablishmentRequest message in accordance with 5.3.7.4; -NOTE: This procedure applies also if the UE returns to the source cell. -Upon selecting an inter-RAT cell, the UE shall: -1> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘RRC connection failure’; -5.3.7.4 Actions related to transmission of RRCConnectionReestablishmentRequest message -The UE shall set the contents of RRCConnectionReestablishmentRequest message as follows: -1> set the ue-Identity as follows: -2> set the c-RNTI to the C-RNTI used in the source cell (handover and mobility from E-UTRA failure) or used in the cell in which the trigger for the re-establishment occurred (other cases); -2> set the physCellId to the physical cell identity of the source cell (handover and mobility from E-UTRA failure) or of the cell in which the trigger for the re-establishment occurred (other cases); -2> set the shortMAC-I to the 16 least significant bits of the MAC-I calculated: -3> over the ASN.1 encoded as per section 8 (i.e., a multiple of 8 bits) VarShortMAC-Input; -3> with the KRRCint key and integrity protection algorithm that was used in the source cell (handover and mobility from E-UTRA failure) or of the cell in which the trigger for the re-establishment occurred (other cases); and -3> with all input bits for COUNT, BEARER and DIRECTION set to binary ones; -1> set the reestablishmentCause as follows: -2> if the re-establishment procedure was initiated due to reconfiguration failure as specified in 5.3.5.5 (the UE is unable to comply with the reconfiguration): -3> set the reestablishmentCause to the value ‘reconfigurationFailure’; -2> else if the re-establishment procedure was initiated due to handover failure as specified in 5.3.5.6 (intra-LTE handover failure) or 5.4.3.5 (inter-RAT mobility from EUTRA failure): -3> set the reestablishmentCause to the value ‘handoverFailure’; -2> else: -3> set the reestablishmentCause to the value ‘otherFailure’; -The UE shall submit the RRCConnectionReestablishmentRequest message to lower layers for transmission. -5.3.7.5 Reception of the RRCConnectionReestablishment by the UE -NOTE: Prior to this, lower layer signalling is used to allocate a C-RNTI. For further details see TS 36.321 [6]; -The UE shall: -1> stop timer T301; -1> re-establish PDCP for SRB1; -1> re-establish RLC for SRB1; -1> perform the radio resource configuration procedure in accordance with the received radioResourceConfigDedicated and as specified in 5.3.10; -1> resume SRB1; -1> update the KeNB key based on the KASME key to which the current KeNB is associated, using the nextHopChainingCount value indicated in the RRCConnectionReestablishment message, as specified in TS 33.401 [32]; -1> store the nextHopChainingCount value; -1> derive the KRRCint key associated with the previously configured integrity algorithm, as specified in TS 33.401 [32]; -1> derive the KRRCenc key and the KUPenc key associated with the previously configured ciphering algorithm, as specified in TS 33.401 [32]; -1> configure lower layers to activate integrity protection using the previously configured algorithm and the KRRCint key immediately, i.e., integrity protection shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> configure lower layers to apply ciphering using the previously configured algorithm, the KRRCenc key and the KUPenc key immediately, i.e., ciphering shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> perform the measurement related actions as specified in 5.5.6.1; -1> submit the RRCConnectionReestablishmentComplete message to lower layers for transmission, upon which the procedure ends; -5.3.7.6 T311 expiry -Upon T311 expiry, the UE shall: -1> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘RRC connection failure’; -5.3.7.7 T301 expiry or selected cell no longer suitable -The UE shall: -1> if timer T301 expires; or -1> if the selected cell becomes no longer suitable according to the cell selection criteria as specified in TS 36.304 [4]: -2> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘RRC connection failure’; -5.3.7.8 Reception of RRCConnectionReestablishmentReject by the UE -Upon receiving the RRCConnectionReestablishmentReject message, the UE shall: -1> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘RRC connection failure’; -5.3.8 RRC connection release -5.3.8.1 General - -Figure 5.3.8.1-1: RRC connection release, successful -The purpose of this procedure is to release the RRC connection, which includes the release of the established radio bearers as well as all radio resources. -5.3.8.2 Initiation -E-UTRAN initiates the RRC connection release procedure to a UE in RRC_CONNECTED. -5.3.8.3 Reception of the RRCConnectionRelease by the UE -The UE shall: -1> delay the following actions defined in this sub-clause 60 ms from the moment the RRCConnectionRelease message was received or optionally when lower layers indicate that the receipt of the RRCConnectionRelease message has been successfully acknowledged, whichever is earlier; -1> if the RRCConnectionRelease message includes the idleModeMobilityControlInfo: -2> store the cell reselection priority information provided by the idleModeMobilityControlInfo; -2> if the t320 is included: -3> start timer T320, with the timer value set according to the value of t320; -1> else: -2> apply the cell reselection priority information broadcast in the system information; -1> if the releaseCause received in the RRCConnectionRelease message indicates ‘loadBalancingTAURequired’: -2> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘load balancing TAU required’; -1> else: -2> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘other’; -5.3.8.4 T320 expiry -The UE shall: -1> if T320 expires: -2> if stored, discard the cell reselection priority information provided by the idleModeMobilityControlInfo or inherited from another RAT; -2> apply the cell reselection priority information broadcast in the system information; -5.3.9 RRC connection release requested by upper layers -5.3.9.1 General -The purpose of this procedure is to release the RRC connection. Access to the current cell may be barred as a result of this procedure. -NOTE: Upper layers invoke the procedure, e.g. upon determining that the network has failed an authentication check, see TS 24.301 [35]. -5.3.9.2 Initiation -The UE initiates the procedure when upper layers request the release of the RRC connection. -The UE shall: -1> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘other’; -1> if the upper layers indicate barring of the serving cell: -2> treat the cell used prior to entering RRC_IDLE as barred according to TS 36.304 [4]; -5.3.10 Radio resource configuration -5.3.10.0 General -The UE shall: -1> if the received radioResourceConfigDedicated includes the srb-ToAddModList: -2> perform the SRB addition or reconfiguration as specified in 5.3.10.1; -1> if the received radioResourceConfigDedicated includes the drb-ToReleaseList: -2> perform DRB release as specified in 5.3.10.2; -1> if the received radioResourceConfigDedicated includes the drb-ToAddModList: -2> perform DRB addition or reconfiguration as specified in 5.3.10.3; -1> if the received radioResourceConfigDedicated includes the mac-MainConfig: -2> perform MAC main reconfiguration as specified in 5.3.10.4; -1> if the received radioResourceConfigDedicated includes sps-Config: -2> perform SPS reconfiguration according to 5.3.10.5; -1> if the received radioResourceConfigDedicated includes the physicalConfigDedicated: -2> reconfigure the physical channel configuration as specified in 5.3.10. 6. -5.3.10.1 SRB addition/ modification -The UE shall: -1> for each srb-Identity value included in the srb-ToAddModList that is not part of the current UE configuration (SRB establishment): -2> apply the specified configuration defined in 9.1.2 for the corresponding SRB; -2> establish a PDCP entity and configure it with the current security configuration, if applicable; -2> establish an RLC entity in accordance with the received rlc-Config; -2> establish a DCCH logical channel in accordance with the received logicalChannelConfig and with the logical channel identity set in accordance with 9.1.2; -1> for each srb-Identity value included in the srb-ToAddModList that is part of the current UE configuration (SRB reconfiguration): -2> reconfigure the RLC entity in accordance with the received rlc-Config; -2> reconfigure the DCCH logical channel in accordance with the received logicalChannelConfig; -5.3.10.2 DRB release -The UE shall: -1> for each drb-Identity value included in the drb-ToReleaseList that is part of the current UE configuration (DRB release): -2> release the PDCP entity; -2> release the RLC entity or entities; -2> release the DTCH logical channel; -1> indicate the release of the DRB(s) and the eps-BearerIdentity of the released DRB(s) to upper layers; -NOTE: The UE does not consider the message as erroneous if the drb-ToReleaseList includes any drb-Identity value that is not part of the current UE configuration. -5.3.10.3 DRB addition/ modification -The UE shall: -1> for each drb-Identity value included in the drb-ToAddModList that is not part of the current UE configuration (DRB establishment): -2> establish a PDCP entity and configure it with the current security configuration and in accordance with the received pdcp-Config; -2> establish an RLC entity or entities in accordance with the received rlc-Config; -2> establish a DTCH logical channel in accordance with the received logicalChannelIdentity and the received logicalChannelConfig; -1> indicate the establishment of the DRB(s) and the eps-BearerIdentity of the established DRB(s) to upper layers; -1> for each drb-Identity value included in the drb-ToAddModList that is part of the current UE configuration (DRB reconfiguration): -2> if the pdcp-Config is included: -3> reconfigure the PDCP entity in accordance with the received pdcp-Config; -2> if the rlc-Config is included: -3> reconfigure the RLC entity or entities in accordance with the received rlc-Config; -2> if the logicalChannelConfig is included: -3> reconfigure the DTCH logical channel in accordance with the received logicalChannelConfig; -NOTE: Removal and addition of the same drb-Identity in single radioResourceConfiguration is not supported. -5.3.10.4 MAC main reconfiguration -The UE shall: -1> reconfigure the MAC main configuration in accordance with the received mac-MainConfig; -5.3.10.5 Semi-persistent scheduling reconfiguration -The UE shall: -1> reconfigure the semi-persistent scheduling in accordance with the received sps-Config: -5.3.10.6 Physical channel reconfiguration -The UE shall: -1> reconfigure the physical channel configuration in accordance with the received physicalConfigDedicated; -1> if the antennaInfo is included and set to ‘explicitValue’: -2> if the configured transmissionMode is not ‘tm3’ or ‘tm4’ release ri-ConfigIndex in cqi-ReportPeriodic, if previously configured; -1> else if the antennaInfo is included and set to ‘defaultValue’: -2> release ri-ConfigIndex in cqi-ReportPeriodic, if previously configured; -5.3.11 Radio link failure related actions -5.3.11.1 Detection of physical layer problems in RRC_CONNECTED -The UE shall: -1> upon receiving N310 consecutive "out-of-sync" indications from lower layers while neither T300, T301, T304 nor T311 is running: -2> start timer T310; -5.3.11.2 Recovery of physical layer problems -Upon receiving N311 consecutive "in-sync" indications from lower layers while T310 is running, the UE shall: -1> stop timer T310; -NOTE 1: In this case, the UE resumes the RRC connection without explicit signalling, i.e. the UE resumes the entire radio resource configuration. -NOTE 2: Periods in time where neither "in-sync" nor "out-of-sync" is reported by layer 1 do not affect the evaluation of the number of consecutive "in-sync" or "out-of-sync" indications. -5.3.11.3 Detection of radio link failure -The UE shall: -1> upon T310 expiry; or -1> upon random access problem indication from MAC while neither T300, T301, T304 nor T311 is running; or -1> upon indication from RLC that the maximum number of retransmissions has been reached: -2> consider radio link failure to be detected; -2> if AS security has not been activated: -3> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘other’; -2> else: -3> initiate the connection re-establishment procedure as specified in 5.3.7; -5.3.12 UE actions upon leaving RRC_CONNECTED -Upon leaving RRC_CONNECTED, the UE shall: -1> reset MAC; -1> stop all timers that are running except T320; -1> release all radio resources, including release of the RLC entity, the MAC configuration and the associated PDCP entity for all established RBs; -1> indicate the release of the RRC connection to upper layers together with the release cause; -1> if leaving RRC_CONNECTED was not triggered by reception of the MobilityFromEUTRACommand message: -2> enter RRC_IDLE by performing cell selection in accordance with the cell selection process, defined for the case of leaving RRC_CONNECTED, as specified in TS 36.304 [4]; -5.3.13 UE actions upon PUCCH/ SRS release request -Upon receiving a PUCCH/ SRS release request from lower layers, the UE shall: -1> apply the default physical channel configuration for CQI-ReportConfig as specified in 9.2.4; -1> apply the default physical channel configuration for soundingRS-UL-ConfigDedicated as specified in 9.2.4; -1> apply the default physical channel configuration for schedulingRequestConfig as specified in 9.2.4; -5.4 Inter-RAT mobility -5.4.1 Introduction -The general principles of connected mode mobility are described in 5.3.1.3. The general principles of the security handling upon connected mode mobility are described in 5.3.1.2. -For the (network controlled) inter RAT mobility from E-UTRA for a UE in RRC_CONNECTED, a single procedure is defined that supports both handover and cell change order with optional network assistance (NACC). In case of mobility to CDMA2000, the eNB decides when to move to the other RAT while the target RAT determines to which cell the UE shall move. -5.4.2 Handover to E-UTRA -5.4.2.1 General - -Figure 5.4.2.1-1: Handover to E-UTRA, successful -The purpose of this procedure is to, under the control of the network, transfer a connection between the UE and another Radio Access Network (e.g. GERAN or UTRAN) to E-UTRAN. -The handover to E-UTRA procedure applies when SRBs, possibly in combination with DRBs, are established in another RAT. Handover from UTRAN to E-UTRAN applies only after integrity has been activated in UTRAN. -5.4.2.2 Initiation -The RAN using another RAT initiates the Handover to E-UTRA procedure, in accordance with the specifications applicable for the other RAT, by sending the RRCConnectionReconfiguration message via the radio access technology from which the inter-RAT handover is performed. -E-UTRAN applies the procedure as follows: -- to activate ciphering, possibly using NULL algorithm, if not yet activated in the other RAT; -- to establish SRB1, SRB2 and one or more DRBs, i.e. at least the DRB associated with the default EPS bearer is established; -5.4.2.3 Reception of the RRCConnectionReconfiguration by the UE -If the UE is able to comply with the configuration included in the RRCConnectionReconfiguration message, the UE shall: -1> apply the default physical channel configuration as specified in 9.2.4; -1> apply the default semi-persistent scheduling configuration as specified in 9.2.3; -1> apply the default MAC main configuration as specified in 9.2.2; -1> start timer T304 with the timer value set to t304, as included in the mobilityControlInfo; -1> consider the target cell to be one on the frequency indicated by the carrierFreq with a physical cell identity indicated by the targetPhysCellId; -1> start synchronising to the DL of the target cell; -1> set the C-RNTI to the value of the newUE-Identity; -1> for the target cell, apply the downlink bandwidth indicated by the dl-Bandwidth; -1> for the target cell, apply the uplink bandwidth indicated by (the absence or presence of) the ul-Bandwidth; -1> perform the radio resource configuration procedure as specified in 5.3.10; -1> forward the nas-SecurityParamToEUTRA to the upper layers; -1> derive the KeNB key, as specified in TS 33.401 [32]; -1> store the nextHopChainingCount value; -1> derive the KRRCint key associated with the integrityProtAlgorithm, as specified in TS 33.401 [32]; -1> derive the KRRCenc key and the KUPenc key associated with the cipheringAlgorithm, as specified in TS 33.401 [32]; -1> configure lower layers to apply the indicated integrity protection algorithm and the KRRCint key immediately, i.e. the indicated integrity protection configuration shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> configure lower layers to apply the indicated ciphering algorithm, the KRRCenc key and the KUPenc key immediately, i.e. the indicated ciphering configuration shall be applied to all subsequent messages received and sent by the UE, including the message used to indicate the successful completion of the procedure; -1> if the RRCConnectionReconfiguration message includes the measConfig: -2> perform the measurement configuration procedure as specified in 5.5.2; -1> submit the RRCConnectionReconfigurationComplete message to lower layers for transmission using the new configuration; -1> use the default values specified in 9.2.5 for timer T310, T311 and constant N310, N311; -1> if MAC successfully completes the random access procedure: -2> stop timer T304; -2> apply the parts of the configuration that do not require the UE to know the SFN of the target cell; -2> apply the parts of the measurement and the radio resource configuration that require the UE to know the SFN of the target cell (e.g. measurement gaps, periodic CQI reporting, scheduling request configuration, sounding RS configuration), if any, upon acquiring the SFN of the target cell; -2> enter E-UTRA RRC_CONNECTED, upon which the procedure ends; -Editor's note: The handling of outstanding signalling/ data may need to be clarified. -5.4.2.4 Reconfiguration failure -The UE shall: -1> if the UE is unable to comply with (part of) the configuration included in the RRCConnectionReconfiguration message: -2> perform the actions defined for this failure case as defined in the specifications applicable for the other RAT; -NOTE 1: The UE may apply above failure handling also in case the RRCConnectionReconfiguration message causes a protocol error for which the generic error handling as defined in 5.7 specifies that the UE shall ignore the message. -NOTE 2: If the UE is unable to comply with part of the configuration, it does not apply any part of the configuration, i.e. there is no partial success/ failure. -5.4.2.5 T304 expiry (handover to E-UTRA failure) -The UE shall: -1> upon T304 expiry (handover to E-UTRA failure): -2> reset MAC; -2> perform the actions defined for this failure case as defined in the specifications applicable for the other RAT; -5.4.3 Mobility from E-UTRA -5.4.3.1 General - -Figure 5.4.3.1-1: Mobility from E-UTRA, successful - -Figure 5.4.3.1-2: Mobility from E-UTRA, failure -The purpose of this procedure is to move a UE in RRC_CONNECTED to a cell using another Radio Access Technology (RAT), e.g. GERAN, UTRA or CDMA2000 systems. The mobility from E-UTRA procedure covers both: -- handover, i.e. the MobilityFromEUTRACommand message includes radio resources that have been allocated for the UE in the target cell; and -- cell change order, i.e. the MobilityFromEUTRACommand message may include information facilitating access of and/ or connection establishment in the target cell, e.g. system information. Cell change order is applicable only to GERAN. -5.4.3.2 Initiation -E-UTRAN initiates the mobility from E-UTRA procedure to a UE in RRC_CONNECTED, possibly in response to a MeasurementReport message, by sending a MobilityFromEUTRACommand message. E-UTRAN applies the procedure as follows: -- the procedure is initiated only when AS-security has been activated, and SRB2 with at least one DRB are setup and not suspended; -5.4.3.3 Reception of the MobilityFromEUTRACommand by the UE -The UE shall be able to receive a MobilityFromEUTRACommand message and perform a cell change order to GERAN, even if no prior UE measurements have been performed on the target cell. -The UE shall: -1> stop timer T310, if running; -1> if the MobilityFromEUTRACommand message includes the purpose set to ‘handover’: -2> if the targetRAT-Type is set to ‘utra’ or ‘geran’: -3> consider inter-RAT mobility as initiated towards the RAT indicated by the targetRAT-Type included in the MobilityFromEUTRACommand message; -3> forward the nas-SecurityParamFromEUTRA to the upper layers; -3> access the target cell indicated in the inter-RAT message in accordance with the specifications of the target RAT; -3> if the targetRAT-Type is set to ‘geran’: -4> use the contents of systemInformation, if provided for PS Handover, as the system information to begin access on the target GERAN cell; -NOTE 1: If there are DRBs for which no radio bearers are established in the target RAT as indicated in the targetRAT-MessageContainer in the message, the E-UTRA RRC part of the UE does not indicate the release of the concerned DRBs to the upper layers. Upper layers may derive which bearers are not established from information received from the AS of the target RAT. -2> else if the targetRAT-Type is set to ‘cdma2000-1XRTT’ or ‘cdma2000-HRPD’: -3> forward the targetRAT-Type and the targetRAT-MessageContainer to the CDMA2000 upper layers for the UE to access the cell indicated in the inter-RAT message in accordance with the specifications of the CDMA2000 target-RAT; -1> else if the MobilityFromEUTRACommand message includes the purpose set to ‘cellChangeOrder’: -2> start timer T304 with the timer value set to t304, as included in the MobilityFromEUTRACommand message; -2> if the targetRAT-Type is set to ‘geran’: -3> if networkControlOrder is included in the MobilityFromEUTRACommand message: -4> apply the value as specified in TS 44.060 [36]; -3> else: -4> acquire networkControlOrder and apply the value as specified in TS 44.060 [36]; -3> use the contents of systemInformation, if provided, as the system information to begin access on the target GERAN cell; -NOTE 2: The systemInformation is constructed in the same way as in 2G to 2G NACC, i.e. the PSI messages are encoded as such, whereas the SI messages exclude 2 octets of headers, see TS 44.060[36]. -2> establish the connection to the target cell indicated in the CellChangeOrder; -NOTE 3: The criteria for success or failure of the cell change order to GERAN are specified in TS 44.060[36]. -5.4.3.4 Successful completion of the mobility from E-UTRA -Upon successfully completing the handover or the cell change order, the UE shall: -1> perform the actions upon leaving RRC_CONNECTED as specified in 5.3.12, with release cause ‘other’; -1> stop timer T304, if running; -5.4.3.5 Mobility from E-UTRA failure -The UE shall: -1> if T304 expires (mobility from E-UTRA failure); or -1> if the UE does not succeed in establishing the connection to the target radio access technology; or -1> if the UE is unable to comply with (part of) the configuration included in the MobilityFromEUTRACommand message; or -1> if there is a protocol error in the inter RAT information included in the MobilityFromEUTRACommand message, causing the UE to fail the procedure according to the specifications applicable for the target RAT: -2> stop T304, if running; -2> if the cs-FallbackIndicator in the MobilityFromEUTRACommand message was set to ‘TRUE’: -3> indicate to upper layers that the CS Fallback procedure has failed; -2> revert back to the configuration used in the source cell, excluding the configuration configured by the physicalConfigDedicated, mac-MainConfig and sps-Config; -2> initiate the connection re-establishment procedure as specified in 5.3.7; -5.4.4 Handover from E-UTRA preparation request (CDMA2000) -5.4.4.1 General - -Figure 5.4.4.1-1: Handover from E-UTRA preparation request -The purpose of this procedure is to trigger the UE to prepare for handover to CDMA2000 by requesting a connection with this network. This procedure applies to CDMA2000 capable UEs only. -The handover from E-UTRA preparation request procedure applies when signalling radio bearers are established. -5.4.4.2 Initiation -E-UTRAN initiates the handover from E-UTRA preparation request procedure to a UE in RRC_CONNECTED, possibly in response to a MeasurementReport message, by sending a HandoverFromEUTRAPreparationRequest message. E-UTRA initiates the procedure only when AS security has been activated. -5.4.4.3 Reception of the HandoverFromEUTRAPreparationRequest by the UE -Upon reception of the HandoverFromEUTRAPreparationRequest message, the UE shall: -1> indicate the request to prepare handover and forward the cdma2000-Type to the CDMA2000 upper layers; -1> if cdma2000-Type is set to ‘type1XRTT’: -2> forward the rand and the mobilityParametersCDMA2000 to the CDMA2000 upper layers; -5.4.5 UL handover preparation transfer (CDMA2000) -5.4.5.1 General - -Figure 5.4.5.1-1: UL handover preparation transfer -The purpose of this procedure is to tunnel the handover related CDMA2000 dedicated information from UE to E-UTRAN when requested by the higher layers. The procedure is triggered by the higher layers on receipt of HandoverFromEUTRAPreparationRequest message. This procedure applies to CDMA2000 capable UEs only. -5.4.5.2 Initiation -A UE in RRC_CONNECTED initiates the UL Handover Preparation Transfer procedure whenever there is a need to transfer handover related non-3GPP dedicated information. The UE initiates the UL handover preparation transfer procedure by sending the ULHandoverPreparationTransfer message. -5.4.5.3 Actions related to transmission of the ULHandoverPreparationTransfer message -The UE shall set the contents of the ULHandoverPreparationTransfer message as follows: -1> include the cdma2000-Type and the dedicatedInfoCDMA2000; -1> if the cdma2000-Type is set to ‘type1XRTT’: -2> include the meid and set it to the value received from the CDMA2000 upper layers; -1> submit the ULHandoverPreparationTransfer message to lower layers for transmission, upon which the procedure ends; -5.4.5.4 Failure to deliver the ULHandoverPreparationTransfer message -The UE shall: -1> if the UE is unable to guarantee successful delivery of ULHandoverPreparationTransfer messages: -2> inform upper layers about the possible failure to deliver the information contained in the concerned ULHandoverPreparationTransfer message; -5.4.6 Inter-RAT cell change order to E-UTRAN -5.4.6.1 General -The purpose of the inter-RAT cell change order to E-UTRAN procedure is to transfer, under the control of the source radio access technology, a connection between the UE and another radio access technology (e.g. GSM/ GPRS) to E-UTRAN. -5.4.6.2 Initiation -The procedure is initiated when a radio access technology other than E-UTRAN, e.g. GSM/GPRS, using procedures specific for that RAT, orders the UE to change to an E-UTRAN cell. In response, upper layers request the establishment of an RRC connection as specified in subclause 5.3.3. -NOTE: Within the message used to order the UE to change to an E-UTRAN cell, the source RAT should specify the identity of the target E-UTRAN cell as specified in the specifications for that RAT. -The UE shall: -1> upon receiving an RRCConnectionSetup message: -2> consider the inter-RAT cell change order procedure to have completed succesfully; -5.4.6.3 UE fails to complete an inter-RAT cell change order -If the inter-RAT cell change order fails the UE shall return to the other radio access technology and proceed as specified in the appropriate specifications for that RAT. -The UE shall: -1> upon failure to establish the RRC connection as specified in subclause 5.3.3: -2> consider the inter-RAT cell change order procedure to have failed; -NOTE: The cell change was network ordered. Therefore, failure to change to the target cell should not cause the UE to move to UE-controlled cell selection. -5.5 Measurements -5.5.1 Introduction -The UE reports measurement information in accordance with the measurement configuration as provided by E-UTRAN. E-UTRAN provides the measurement configuration applicable for a UE in RRC_CONNECTED by means of dedicated signalling, i.e. using the RRCConnectionReconfiguration message. -The UE can be requested to perform the following types of measurements: -- Intra-frequency measurements: measurements at the downlink carrier frequency of the serving cell. -- Inter-frequency measurements: measurements at frequencies that differ from the downlink carrier frequency of the serving cell. -- Inter-RAT measurements of UTRA frequencies. -- Inter-RAT measurements of GERAN frequencies. -- Inter-RAT measurements of CDMA2000 HRPD or CDMA2000 1xRTT frequencies. -The measurement configuration includes the following parameters: -1. Measurement objects: The objects on which the UE shall perform the measurements. -- For intra-frequency and inter-frequency measurements a measurement object is a single E-UTRA carrier frequency. Associated with this carrier frequency, E-UTRAN can configure a list of cell specific offsets and a list of ‘blacklisted’ cells. Blacklisted cells are not considered in event evaluation or measurement reporting. -- For inter-RAT UTRA measurements a measurement object is a set of cells on a single UTRA carrier frequency. -- For inter-RAT GERAN measurements a measurement object is a set of GERAN carrier frequencies. -- For inter-RAT CDMA2000 measurements a measurement object is a set of cells on a single (HRPD or 1xRTT) carrier frequency. -2. Reporting configurations: A list of reporting configurations where each reporting configuration consists of the following: -- Reporting criterion: The criterion that triggers the UE to send a measurement report. This can either be periodical or a single event description. -- Reporting format: The quantities that the UE includes in the measurement report and associated information (e.g. number of cells to report). -3. Measurement identities: A list of measurement identities where each measurement identity links one measurement object with one reporting configuration. By configuring multiple measurement identities it is possible to link more than one measurement object to the same reporting configuration, as well as to link more than one reporting configuration to the same measurement object. The measurement identity is used as a reference number in the measurement report. -4. Quantity configurations: One quantity configuration is configured per RAT type. The quantity configuration defines the measurement quantities and associated filtering used for all event evaluation and related reporting of that measurement type. One filter can be configured per measurement quantity. -5. Measurement gaps: Periods that the UE may use to perform measurements, i.e. no (UL, DL) transmissions are scheduled. -E-UTRAN only configures a single measurement object for a given frequency, i.e. it is not possible to configure two or more measurement objects for the same frequency with different associated parameters, e.g. different offsets and/ or blacklists. E-UTRAN may configure multiple instances of the same event e.g. by configuring two reporting configurations with different thresholds. -The UE maintains a single measurement object list, a single reporting configuration list, and a single measurement identities list. The measurement object list includes measurement objects, that are specified per RAT type, possibly including an intra-frequency object (i.e. the object corresponding to the serving frequency), inter-frequency object(s) and inter-RAT objects. Similarly, the reporting configuration list includes E-UTRA and inter-RAT reporting configurations. Any measurement object can be linked to any reporting configuration of the same RAT type. Some reporting configurations may not be linked to a measurement object. Likewise, some measurement objects may not be linked to a reporting configuration. -The measurement procedures distinguish the following types of cells: -1. The serving cell. -2. Listed cells - these are cells listed within the measurement object(s). -3. Detected cells - these are cells that are not listed within the measurement object(s) but are detected by the UE on the carrier frequency(ies) indicated by the measurement object(s). -For E-UTRA, the UE measures and reports on the serving cell, listed cells and detected cells. For inter-RAT UTRA, the UE measures and reports on listed cells. For inter-RAT GERAN, the UE measures and reports on detected cells. For inter-RAT CDMA2000, the UE measures and reports on listed cells. -NOTE 1: For inter-RAT UTRA and CDMA2000, the UE measures and reports also on detected cells for the purpose of SON. -NOTE 2: This specification is based on the assumption that CSG cells of home deployment type are not indicated within the neighbour list. Furthermore, the assumption is that for non-home deployments, the physical cell identity is unique within the area of a large macro cell (i.e. as for UTRAN). -Whenever the procedural specification, other than contained in sub-clause 5.5.2, refers to a field it concerns a field included in the VarMeasConfig unless explictly stated otherwise i.e. only the measurement configuration procedure covers the direct UE action related to the received measConfig. -5.5.2 Measurement configuration -5.5.2.1 General -E-UTRAN applies the procedure as follows: -- to configure at most one measurement identity using a reporting configuration with the purpose set to ‘reportCGI’; -The UE shall: -1> if the received measConfig includes the measObjectToRemoveList: -2> perform the measurement object removal procedure as specified in 5.5.2.4; -1> if the received measConfig includes the measObjectToAddModList: -2> perform the measurement object addition/ modification procedure as specified in 5.5.2.5; -1> if the received measConfig includes the reportConfigToRemoveList: -2> perform the reporting configuration removal procedure as specified in 5.5.2.6; -1> if the received measConfig includes the reportConfigToAddModList: -2> perform the reporting configuration addition/ modification procedure as specified in 5.5.2.7; -1> if the received measConfig includes the quantityConfig: -2> perform the quantity configuration procedure as specified in 5.5.2.8; -1> if the received measConfig includes the measIdToRemoveList: -2> perform the measurement identity removal procedure as specified in 5.5.2.2; -1> if the received measConfig includes the measIdToAddModList: -2> perform the measurement identity addition/ modification procedure as specified in 5.5.2.3; -1> if the received measConfig includes the measGapConfig: -2> perform the measurement gap configuration procedure as specified in 5.5.2.9; -1> if the received measConfig includes the s-Measure: -2> set the parameter s-Measure within VarMeasConfig to the lowest value of the RSRP ranges indicated by the received value of s-Measure; -1> if the received measConfig includes the preRegistrationInfoHRPD: -2> forward the preRegistrationInfoHRPD to CDMA2000 upper layers; -1> if the received measConfig includes the speedStatePars: -2> set the parameter speedStatePars within VarMeasConfig to the received value of speedStatePars; -5.5.2.2 Measurement identity removal -The UE shall: -1> for each measId included in the received measIdToRemoveList that is part of the current UE configuration in varMeasConfig: -2> remove the entry with the matching measId from the measIdList within the VarMeasConfig; -2> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -2> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -NOTE: The UE does not consider the message as erroneous if the measIdToRemoveList includes any measId value that is not part of the current UE configuration. -5.5.2.3 Measurement identity addition/ modification -E-UTRAN applies the procedure as follows: -- configure a measId only if the corresponding measurement object, the corresponding reporting configuration and the corresponding quantity configuration, are configured; -The UE shall: -1> for each measId included in the received measIdToAddModList: -2> if an entry with the matching measId exists in the measIdList within the VarMeasConfig: -3> replace the entry with the value received for this measId; -2> else: -3> add a new entry for this measId within the VarMeasConfig ; -2> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -2> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -2> if the triggerType is set to ‘periodical’ and the purpose is set to ‘reportCGI’ in the reportConfig associated with this measId: -3> if the measObject associated with this measId concerns E-UTRA: -4> start timer T321 with the timer value set to 1 second for this measId; -3> else: -4> start timer T321 with the timer value set to 8 seconds for this measId; -5.5.2.4 Measurement object removal -The UE shall: -1> for each measObjectId included in the received measObjectToRemoveList that is part of the current UE configuration in varMeasConfig: -2> remove the entry with the matching measObjectId from the measObjectList within the VarMeasConfig; -2> remove all measId associated with this measObjectId from the measIdList within the VarMeasConfig, if any; -2> if a measId is removed from the measIdList: -3> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -3> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -NOTE: The UE does not consider the message as erroneous if the measObjectToRemoveList includes any measObjectId value that is not part of the current UE configuration. -5.5.2.5 Measurement object addition/ modification -The UE shall: -1> for each measObjectId included in the received measObjectToAddModList: -2> if an entry with the matching measObjectId exists in the measObjectList within the VarMeasConfig, for this entry: -3> replace the entry with the value received for this measObject, except for the fields cellsToAddModList, blackCellsToAddModList, cellsToRemoveList and blackCellsToRemoveList: -3> if the received measObject includes the cellsToRemoveList: -4> for each cellIndex included in the cellsToRemoveList: -5> remove the entry with the matching cellIndex from the cellsToAddModList; -3> if the received measObject includes the cellsToAddModList: -4> for each cellIndex value included in the cellsToAddModList: -5> if an entry with the matching cellIndex exists in the cellsToAddModList: -6> replace the entry with the value received for this cellIndex; -5> else: -6> add a new entry for the received cellIndex to the cellsToAddModList; -3> if the received measObject includes the blackCellsToRemoveList: -4> for each cellIndex included in the blackCellsToRemoveList: -5> remove the entry with the matching cellIndex from the blackCellsToAddModList; -3> if the received measObject includes the blackCellsToAddModList: -4> for each cellIndex included in the blackCellsToAddModList: -5> if an entry with the matching cellIndex is included in the blackCellsToAddModList: -6> replace the entry with the value received for this cellIndex; -5> else: -6> add a new entry for the received cellIndex to the blackCellsToAddModList; -3> for each measId associated with this measObjectId in the measIdList within the VarMeasConfig, if any: -4> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -4> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -2> else: -3> add a new entry for the received measObject to the measObjectList within VarMeasConfig; -5.5.2.6 Reporting configuration removal -The UE shall: -1> for each reportConfigId included in the received reportConfigToRemoveList that is part of the current UE configuration in varMeasConfig: -2> remove the entry with the matching reportConfigId from the reportConfigList within the VarMeasConfig; -2> remove all measId associated with the reportConfigId from the measIdList within the VarMeasConfig, if any; -2> if a measId is removed from the measIdList: -3> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -3> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -NOTE: The UE does not consider the message as erroneous if the reportConfigToRemoveList includes any reportConfigId value that is not part of the current UE configuration. -5.5.2.7 Reporting configuration addition/ modification -The UE shall: -1> for each reportConfigId included in the received reportConfigToAddModList: -2> if an entry with the matching reportConfigId exists in the reportConfigList within the VarMeasConfig, for this entry: -3> replace the entry with the value received for this reportConfig; -3> for each measId associated with this reportConfigId included in the measIdList within the VarMeasConfig, if any: -4> remove the measurement reporting entry for this measId from in VarMeasReportList, if included; -4> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -2> else: -3> add a new entry for the received reportConfig to the reportConfigList within the VarMeasConfig; -5.5.2.8 Quantity configuration -The UE shall: -1> set the parameter quantityConfig within VarMeasConfig to the received value of quantityConfig; -1> for each measId included in the measIdList within VarMeasConfig: -2> remove the measurement reporting entry for this measId from the VarMeasReportList, if included; -2> stop the periodical reporting timer or timer T321, whichever one is running, and reset the associated information (e.g. timeToTrigger) for this measId; -5.5.2.9 Measurement gap configuration -The UE shall: -1> if measGapConfig is set to ‘setup’: -2> if a measurement gap configuration is already setup, release the measurement gap configuration; -2> setup the measurement gap configuration indicated by the measGapConfig in accordance with the received gapOffset, i.e., each gap starts at an SFN and subframe meeting the following condition: -SFN mod T = FLOOR(gapOffset/10); -subframe = gapOffset mod 10; -with T = MGRP/10 as defined in TS 36.133 [16]; -1> else: -2> release the measurement gap configuration; -5.5.3 Performing measurements -5.5.3.1 General -The UE supports measurements using a reporting configuration with the purpose set to ‘reportCGI’, if the network provides sufficient idle periods. -The UE applies the layer 3 filtering as specified in 5.5.3.2, before using the measured results for evaluation of reporting criteria or for measurement reporting. -The UE shall: -1> for each measId included in the measIdList within VarMeasConfig: -2> if a measurement gap configuration is setup; or -2> the UE does not require measurement gaps to perform the concerned measurement: -3> if s-Measure is not configured; or -3> if s-Measure is configured and the serving cell RSRP, after layer 3 filtering, is lower than this value; or -3> if the purpose for the associated reportConfig is set to ‘reportCGI’: -4> perform the corresponding measurements of neighbouring cells on the frequencies and RATs indicated in the concerned measObject; -2> perform the evaluation of reporting criteria as specified in section 5.5.4; -1> if a measId is configuredfor which the purpose within the associated reportConfig is set to ‘reportCGI’: -2> try to acquire the global cell identity of the cell indicated by the cellForWhichToReportCGI in the associated measObject by acquiring the relevant system information from the concerned cell; -2> if the cell indicated by the cellForWhichToReportCGI included in the associated measObject is an E-UTRAN cell: -3> try to acquire the list of additional PLMN Identities, as included in the plmn-IdentityList, if multiple PLMN identities are broadcast in the concerned cell; -NOTE: The ‘primary’ PLMN is part of the global cell identity. -2> if the cell indicated by the cellForWhichToReportCGI included in the associated measObject is a UTRAN cell: -3> try to acquire the LAC, the RAC and the list of additional PLMN Identities, if multiple PLMN identities are broadcast in the concerned cell; -2> if the cell indicated by the cellForWhichToReportCGI included in the associated measObject is a GERAN cell: -3> try to acquire the RAC in the concerned cell; -2> if the cell indicated by the cellForWhichToReportCGI included in the associated measObject is a CDMA2000 cell and the cdma2000-Type included in the measObject is ‘typeHRPD’: -3> try to acquire the Sector ID in the concerned cell; -2> if the cell indicated by the cellForWhichToReportCGI included in the associated measObject is a CDMA2000 cell and the cdma2000-Type included in the measObject is ‘type1XRTT’: -3> try to acquire the BASE ID, SID and NID in the concerned cell; -5.5.3.2 Layer 3 filtering -The UE shall: -1> for each measurement quantity that the UE performs measurements according to 5.5.3.1: -2> filter the measured result, before using for evaluation of reporting criteria or for measurement reporting, by the following formula: - -where -Mn is the latest received measurement result from the physical layer; -Fn is the updated filtered measurement result, that is used for evaluation of reporting criteria or for measurement reporting; -Fn-1 is the old filtered measurement result, where F0 is set to M1 when the first measurement result from the physical layer is received; and -a = 1/2(k/4), where k is the filterCoefficent for the corresponding measurement quantity received by the quantityConfig; -2> adapt the filter such that the time characteristics of the filter are preserved at different input rates, observing that the filterCoefficent k assumes a sample rate equal to 200 ms; -NOTE 1: If k is set to 0, no layer 3 filtering is applicable. -NOTE 2: The filtering is performed in the same domain as used for evaluation of reporting criteria or for measurement reporting, i.e., logarithmic filtering for logarithmic measurements. -NOTE 3: The filter input rate is implementation dependent, to fulfil the performance requirements set in [16]. For further details about the physical layer measurements, see TS 36.133 [16]. -5.5.4 Measurement report triggering -5.5.4.1 General -The UE shall: -1> for each measId included in the measIdList within VarMeasConfig: -2> if the corresponding reportConfig includes a purpose set to ‘reportStrongestCellsForSON’: -3> consider any neighbouring cell detected on the associated frequency to be applicable; -2> else if the corresponding reportConfig includes a purpose set to ‘reportCGI’: -3> consider any neighbouring cell detected on the associated frequency/ set of frequencies (GERAN) which has a physical cell identity matching the value of the cellForWhichToReportCGI included in the corresponding measObject within the VarMeasConfig to be applicable; -2> else: -3> if the corresponding measObject concerns E-UTRA: -4> consider any neighbouring cell detected on the associated frequency to be applicable when the concerned cell is not included in the blackCellsToAddModList defined within the VarMeasConfig for this measId; -3> else if the corresponding measObject concerns UTRA or CDMA2000: -4> consider a neighbouring cell on the associated frequency to be applicable when the concerned cell is included in the cellsToAddModList defined within the VarMeasConfig for this measId (i.e. the cell is included in the white-list); -3> else if the corresponding measObject concerns GERAN: -4> consider a neighbouring cell on the associated set of frequencies to be applicable when the concerned cell matches the ncc-Permitted defined within the VarMeasConfig for this measId; -2> if the triggerType is set to ‘event’ and if the entry condition applicable for this event, i.e. the event corresponding with the eventId of the corresponding reportConfig within VarMeasConfig, is fulfilled for one or more applicable cells for all measurements after layer 3 filtering taken during timeToTrigger defined for this event within the VarMeasConfig, while the VarMeasReportList does not include an measurement reporting entry for this measId (a first cell triggers the event): -3> include a measurement reporting entry within the VarMeasReportList for this measId; -3> set the numberOfReportsSent defined within the VarMeasReportList for this measId to 0; -3> include the concerned cell(s) in the cellsTriggeredList defined within the VarMeasReportList for this measId; -3> initiate the measurement reporting procedure, as specified in 5.5.5; -2> if the triggerType is set to ‘event’ and if the entry condition applicable for this event, i.e. the event corresponding with the eventId of the corresponding reportConfig within VarMeasConfig, is fulfilled for one or more applicable cells not included in the cellsTriggeredList for all measurements after layer 3 filtering taken during timeToTrigger defined for this event within the VarMeasConfig (a subsequent cell triggers the event): -3> set the numberOfReportsSent defined within the VarMeasReportList for this measId to 0; -3> include the concerned cell(s) in the cellsTriggeredList defined within the VarMeasReportList for this measId; -3> initiate the measurement reporting procedure, as specified in 5.5.5; -2> if the triggerType is set to ‘event’ and if the leaving condition applicable for this event is fulfilled for one or more of the cells included in the cellsTriggeredList defined within the VarMeasReportList for this measId for all measurements after layer 3 filtering taken during timeToTrigger defined within the VarMeasConfig for this event: -3> remove the concerned cell(s) in the cellsTriggeredList defined within the VarMeasReportList for this measId; -3> if reportOnLeave is set to TRUE for the corresponding reporting configuration: -4> initiate the measurement reporting procedure, as specified in 5.5.5; -3> if the cellsTriggeredList defined within the VarMeasReportList for this measId is empty: -4> remove the measurement reporting entry within the VarMeasReportList for this measId; -4> stop the periodical reporting timer for this measId, if running; -2> if the purpose is included and set to ‘reportStrongestCells’ or to ‘reportStrongestCellsForSON’ and if a (first) measurement result is available for one or more applicable cells: -3> include a measurement reporting entry within the VarMeasReportList for this measId; -3> set the numberOfReportsSent defined within the VarMeasReportList for this measId to 0; -3> initiate the measurement reporting procedure, as specified in 5.5.5; -NOTE 1: If the purpose is set to ‘reportStrongestCells’, the UE initiates a first measurement report immediately after the quantity to be reported becomes available for at least either serving cell or one of the applicable cells. If the purpose is set to ‘reportStrongestCellsForSON’, the UE initiates a first measurement report when it has determined the strongest cells on the associated frequency. -2> upon expiry of the periodical reporting timer for this measId: -3> initiate the measurement reporting procedure, as specified in 5.5.5; -2> if the purpose is included and set to ‘reportCGI’ and if the UE acquired the information needed to set all fields of cellGlobalId for the requested cell: -3> include a measurement reporting entry within the VarMeasReportList for this measId; -3> set the numberOfReportsSent defined within the VarMeasReportList for this measId to 0; -3> stop timer T321; -3> initiate the measurement reporting procedure, as specified in 5.5.5; -2> upon expiry of the T321 for this measId: -3> include a measurement reporting entry within the VarMeasReportList for this measId; -3> set the numberOfReportsSent defined within the VarMeasReportList for this measId to 0; -3> initiate the measurement reporting procedure, as specified in 5.5.5; -NOTE 2: The UE does not stop the periodical reporting with triggerType set to ‘event’ or to ‘periodical’ while the corresponding measurement is not performed due to the serving cell RSRP being equal to or better than s-Measure or due to the measurement gap not being setup. -NOTE 3: If the UE is configured with DRX, the UE may delay the measurement reporting for event triggered and periodical triggered measurements until the Active Time, which is defined in TS 36.321 [6]. -5.5.4.2 Event A1 (Serving becomes better than threshold) -The UE shall: -1> consider the entering condition for this event to be satisfied when condition A1-1, as specified below, is fulfilled; -1> consider the leaving condition for this event to be satisfied when condition A1-2, as specified below, is fulfilled; -Inequality A1-1 (Entering condition) - -Inequality A1-2 (Leaving condition) - -The variables in the formula are defined as follows: -Ms is the measurement result of the serving cell, not taking into account any offsets. -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigEUTRA for this event). -Thresh is the threshold parameter for this event (i.e. a1-Threshold as defined within reportConfigEUTRA for this event). -Ms is expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Hys is expressed in dB. -Thresh is expressed in the same unit as Ms. -5.5.4.3 Event A2 (Serving becomes worse than threshold) -The UE shall: -1> consider the entering condition for this event to be satisfied when condition A2-1, as specified below, is fulfilled; -1> consider the leaving condition for this event to be satisfied when condition A2-2, as specified below, is fulfilled; -Inequality A2-1 (Entering condition) - -Inequality A2-2 (Leaving condition) - -The variables in the formula are defined as follows: -Ms is the measurement result of the serving cell, not taking into account any offsets. -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigEUTRA for this event). -Thresh is the threshold parameter for this event (i.e. a2-Threshold as defined within reportConfigEUTRA for this event). -Ms is expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Hys is expressed in dB. -Thresh is expressed in the same unit as Ms. -5.5.4.4 Event A3 (Neighbour becomes offset better than serving) -The UE shall: -1> consider the entering condition for this event to be satisfied when condition A3-1, as specified below, is fulfilled; -1> consider the leaving condition for this event to be satisfied when condition A3-2, as specified below, is fulfilled; -Inequality A3-1 (Entering condition) - -Inequality A3-2 (Leaving condition) - -The variables in the formula are defined as follows: -Mn is the measurement result of the neighbouring cell, not taking into account any offsets. -Ofn is the frequency specific offset of the frequency of the neighbour cell (i.e. offsetFreq as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell). -Ocn is the cell specific offset of the neighbour cell (i.e. cellIndividualOffset as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell), and set to zero if not configured for the neighbour cell. -Ms is the measurement result of the serving cell, not taking into account any offsets. -Ofs is the frequency specific offset of the serving frequency (i.e. offsetFreq as defined within measObjectEUTRA corresponding to the serving frequency). -Ocs is the cell specific offset of the serving cell (i.e. cellIndividualOffset as defined within measObjectEUTRA corresponding to the serving frequency), and is set to zero if not configured for the serving cell. -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigEUTRA for this event). -Off is the offset parameter for this event (i.e. a3-Offset as defined within reportConfigEUTRA for this event). -Mn, Ms are expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Ofn, Ocn, Ofs, Ocs, Hys, Off are expressed in dB. -5.5.4.5 Event A4 (Neighbour becomes better than threshold) -The UE shall: -1> consider the entering condition for this event to be satisfied when condition A4-1, as specified below, is fulfilled; -1> consider the leaving condition for this event to be satisfied when condition A4-2, as specified below, is fulfilled; -Inequality A4-1 (Entering condition) - -Inequality A4-2 (Leaving condition) - -The variables in the formula are defined as follows: -Mn is the measurement result of the neighbouring cell, not taking into account any offsets. -Ofn is the frequency specific offset of the frequency of the neighbour cell (i.e. offsetFreq as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell). -Ocn is the cell specific offset of the neighbour cell (i.e. cellIndividualOffset as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell), and set to zero if not configured for the neighbour cell. -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigEUTRA for this event). -Thresh is the threshold parameter for this event (i.e. a4-Threshold as defined within reportConfigEUTRA for this event). -Mn is expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Ofn, Ocn, Hys are expressed in dB. -Thresh is expressed in the same unit as Ms. -5.5.4.6 Event A5 (Serving becomes worse than threshold1 and neighbour becomes better than threshold2) -The UE shall: -1> consider the entering condition for this event to be satisfied when both conditions A5-1 and condition A5-2, as specified below, are fulfilled; -1> consider the leaving condition for this event to be satisfied when condition A5-3 or condition A5-4, i.e. at least one of the two, as specified below, is fulfilled; -Inequality A5-1 (Entering condition 1) - -Inequality A5-2 (Entering condition 2) - -Inequality A5-3 (Leaving condition 1) - -Inequality A5-4 (Leaving condition 2) - -The variables in the formula are defined as follows: -Ms is the measurement result of the serving cell, not taking into account any offsets. -Mn is the measurement result of the neighbouring cell, not taking into account any offsets. -Ofn is the frequency specific offset of the frequency of the neighbour cell (i.e. offsetFreq as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell). -Ocn is the cell specific offset of the neighbour cell (i.e. cellIndividualOffset as defined within measObjectEUTRA corresponding to the frequency of the neighbour cell), and set to zero if not configured for the neighbour cell. -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigEUTRA for this event). -Thresh1 is the threshold parameter for this event (i.e. a5-Threshold1 as defined within reportConfigEUTRA for this event). -Thresh2 is the threshold parameter for this event (i.e. a5-Threshold2 as defined within reportConfigEUTRA for this event). -Mn, Ms are expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Ofn, Ocn, Hys are expressed in dB. -Thresh1 is expressed in the same unit as Ms. -Thresh2 is expressed in the same unit as Mn. -5.5.4.7 Event B1 (Inter RAT neighbour becomes better than threshold) -The UE shall: -1> for UTRA and CDMA2000, only trigger the event for cells included in the corresponding measurement object; -1> consider the entering condition for this event to be satisfied when condition B1-1, as specified below, is fulfilled; -1> consider the leaving condition for this event to be satisfied when condition B1-2, as specified below, is fulfilled; -Inequality B1-1 (Entering condition) - -Inequality B1-2 (Leaving condition) - -The variables in the formula are defined as follows: -Mn is the measurement result of the inter-RAT neighbour cell, not taking into account any offsets. -Ofn is the frequency specific offset of the frequency of the inter-RAT neighbour cell (i.e. offsetFreq as defined within the measObject corresponding to the frequency of the neighbour inter-RAT cell). -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigInterRAT for this event). -Thresh is the threshold parameter for this event (i.e. b1-Threshold as defined within reportConfigInterRAT for this event). -Mn is expressed in dBm or in dB, depending on the measurement quantity of the inter-RAT neighbour cell. -Ofn, Hys are expressed in dB. -Thresh is expressed in the same unit as Mn. -5.5.4.8 Event B2 (Serving becomes worse than threshold1 and inter RAT neighbour becomes better than threshold2) -The UE shall: -1> for UTRA and CDMA2000, only trigger the event for cells included in the corresponding measurement object; -1> consider the entering condition for this event to be satisfied when both condition B2-1 and condition B2-2, as specified below, are fulfilled; -1> consider the leaving condition for this event to be satisfied when condition B2-3 or condition B2-4, i.e. at least one of the two, as specified below, is fulfilled; -Inequality B2-1 (Entering condition 1) - -Inequality B2-2 (Entering condition 2) - -Inequality B2-3 (Leaving condition 1) - -Inequality B2-4 (Leaving condition 2) - -The variables in the formula are defined as follows: -Ms is the measurement result of the serving cell, not taking into account any offsets. -Mn is the measurement result of the inter-RAT neighbour cell, not taking into account any offsets. -Ofn is the frequency specific offset of the frequency of the inter-RAT neighbour cell (i.e. offsetFreq as defined within the measObject corresponding to the frequency of the inter-RAT neighbour cell). -Hys is the hysteresis parameter for this event (i.e. hysteresis as defined within reportConfigInterRAT for this event). -Thresh1 is the threshold parameter for this event (i.e. b2-Threshold1 as defined within reportConfigInterRAT for this event). -Thresh2 is the threshold parameter for this event (i.e. b2-Threshold2 as defined within reportConfigInterRAT for this event). -Ms is expressed in dBm in case of RSRP, or in dB in case of RSRQ. -Mn is expressed in dBm or dB, depending on the measurement quantity of the inter-RAT neighbour cell. -Ofn, Hys are expressed in dB. -Thresh1 is expressed in the same unit as Ms. -Thresh2 is expressed in the same unit as Mn. -5.5.5 Measurement reporting - -Figure 5.5.5-1: Measurement reporting -The purpose of this procedure is to transfer measurement results from the UE to E-UTRAN. -For the measId for which the measurement reporting procedure was triggered, the UE shall set the measResults within the MeasurementReport message as follows: -1> set the measId to the measurement identity that triggered the measurement reporting; -1> set the measResultServCell to include the quantities of serving cell; -1> if there is at least one applicable neighbouring cell to report: -2> set the measResultNeighCells to include the best neighbouring cells up to maxReportCells in accordance with the following: -3> if the triggerType is set to ‘event’: -4> include the cells included in the cellsTriggeredList as defined within the VarMeasReportList for this measId; -3> else: -4> include the applicable cells for which the new measurement results became available since the last periodical reporting or since the measurement was initiated or reset; -NOTE: The reliability of the report (i.e. the certainty it contains the strongest cells on the concerned frequency) depends on the measurement configuration i.e. the reportInterval. The related performance requirements are specified in TS 36.133 [16]. -3> for each cell that is included in the measResultNeighCells, include the physCellId; -3> if the triggerType is set to ‘event’; or the purpose is set to ‘reportStrongestCells’ or to ‘reportStrongestCellsForSON’: -4> for each included cell, include the layer 3 filtered measured results in accordance with the reportConfig for this measId, ordered as follows: -5> if the measObject associated with this measId concerns E-UTRA: -6> set the measResult to include the quantity(ies) indicated in the reportQuantity within the concerned reportConfig in order of decreasing triggerQuantity, i.e. the best cell is included first; -5> else: -6> set the measResult to the quantity as configured for the concerned RAT within the quantityConfig in order of decreasing quantity, i.e. the best cell is included first; -3> else if the purpose is set to ‘reportCGI’: -4> if the mandatory present fields of the cellGlobalId for the cell indicated by the cellForWhichToReportCGI in the associated measObject have been obtained: -5> include the cgi-Info containing all the fields that have been successfully acquired; -1> increment the numberOfReportsSent as defined within the VarMeasReportList for this measId by 1; -1> stop the periodical reporting timer, if running; -1> if the numberOfReportsSent as defined within the VarMeasReportList for this measId is less than the reportAmount as defined within the corresponding reportConfig for this measId: -2> start the periodical reporting timer with the value of reportInterval as defined within the corresponding reportConfig for this measId; -1> else: -2> if the triggerType is set to ‘periodical’: -3> remove the entry within the VarMeasReportList for this measId; -3> remove this measId from the measIdList within VarMeasConfig; -1> if the measured results are for CDMA2000 HRPD: -2> set the preRegistrationStatusHRPD to the UE’s CDMA2000 upper layer’s HRPD preRegistrationStatus; -1> if the measured results are for CDMA2000 1xRTT: -2> set the preRegistrationStatusHRPD to ‘FALSE’; -1> submit the MeasurementReport message to lower layers for transmission, upon which the procedure ends; -5.5.6 Measurement related actions -5.5.6.1 Actions upon handover and re-establishment -E-UTRAN applies the handover procedure as follows: -- when performing the handover procedure, as specified in 5.3.5.4, ensure that a measObjectId corresponding to the handover target carrier frequency is configured as a result of the procedures described in this sub-clause and in 5.3.5.4; -E-UTRAN applies the re-establishment procedure as follows: -- when performing the connection re-establishment procedure, as specified in 5.3.7, ensure that a measObjectId corresponding to the target carrier frequency is configured as a result of the procedure described in this sub-clause and the subsequent connection reconfiguration procedure immediately following the re-establishment procedure; -The UE shall: -1> for each measId included in the measIdList within VarMeasConfig: -2> if the triggerType is set to ‘periodical’: -3> remove this measId from the measIdList within VarMeasConfig: -1> if the procedure was triggered due to inter-frequency handover or successful re-establishment to an inter-frequency cell, update the measId values in the measIdList within VarMeasConfig as follows: -2> if a measObjectId value corresponding to the target carrier frequency exists in the measObjectList within VarMeasConfig: -3> for each measId value in the measIdList: -4> if the measId value is linked to the measObjectId value corresponding to the source carrier frequency: -5> link this measId value to the measObjectId value corresponding to the target carrier frequency; -4> else if the measId value is linked to the measObjectId value corresponding to the target carrier frequency: -5> link this measId value to the measObjectId value corresponding to the source carrier frequency; -2> else: -3> remove all measId values that are linked to the measObjectId value corresponding to the source carrier frequency; -1> remove all measurement reporting entries within VarMeasReportList; -1> reset the periodical reporting timer or timer T321, whichever one is running, as well as associated information (e.g. timeToTrigger) for all measId; -1> release the measurement gaps, if activated; -NOTE: If the UE requires measurement gaps to perform inter-frequency or inter-RAT measurements, the UE resumes the inter-frequency and inter-RAT measurements after the E-UTRAN has setup the measurement gaps. -5.5.6.2 Speed dependant scaling of measurement related parameters -The UE shall adjust the value of the following parameter configured by the E-UTRAN depending on the UE speed: timeToTrigger. The UE shall apply 3 different levels, which are selected as follows: -The UE shall: -1> perform mobility state detection using the mobility state detection as specified in TS 36.304 [4] with the following modifications: -2> counting handovers instead of cell reselections; -2> applying the parameter applicable for RRC_CONNECTED as included in speedStatePars within VarMeasConfig; -1> if high mobility state is detected: -2> use the timeToTrigger value multiplied by sf-High within VarMeasConfig; -1> else if medium mobility state is detected: -2> use the timeToTrigger value multiplied by sf-Medium within VarMeasConfig; - 1> else -2> no scaling is applied; -5.6 Other -5.6.1 DL information transfer -5.6.1.1 General - -Figure 5.6.1.1-1: DL information transfer -The purpose of this procedure is to transfer NAS or (tunnelled) non-3GPP dedicated information from E-UTRAN to a UE in RRC_CONNECTED. -5.6.1.2 Initiation -E-UTRAN initiates the DL information transfer procedure whenever there is a need to transfer NAS or non-3GPP dedicated information. E-UTRAN initiates the DL information transfer procedure by sending the DLInformationTransfer message. -5.6.1.3 Reception of the DLInformationTransfer by the UE -Upon receiving DLInformationTransfer message, the UE shall: -1> if the dedicatedInfoType is set to ‘dedicatedInfoNAS’: -2> forward the dedicatedInfoNAS to the NAS upper layers. -1> if the dedicatedInfoType is set to ‘dedicatedInfoCDMA2000-1XRTT’ or to ‘dedicatedInfoCDMA2000-HRPD: -2> forward the dedicatedInfoCDMA2000 to the CDMA2000 upper layers; -5.6.2 UL information transfer -5.6.2.1 General - -Figure 5.6.2.1-1: UL information transfer -The purpose of this procedure is to transfer NAS or (tunnelled) non-3GPP dedicated information from the UE to E-UTRAN. -5.6.2.2 Initiation -A UE in RRC_CONNECTED initiates the UL information transfer procedure whenever there is a need to transfer NAS or non-3GPP dedicated information, except at RRC connection establishment in which case the NAS information is piggybacked to the RRCConnectionSetupComplete message. The UE initiates the UL information transfer procedure by sending the ULInformationTransfer message. When CDMA2000 information has to be transferred, the UE shall initiate the procedure only if SRB2 is established. -5.6.2.3 Actions related to transmission of ULInformationTransfer message -The UE shall set the contents of the ULInformationTransfer message as follows: -1> if there is a need to transfer NAS information: -2> set the dedicatedInfoType to include the ‘dedicatedInfoNAS’; -1> if there is a need to transfer CDMA2000 1XRTT information: -2> set the dedicatedInfoType to include the ‘dedicatedInfoCDMA2000-1XRTT’; -1> if there is a need to transfer CDMA2000 HRPD information: -2> set the dedicatedInfoType to include the ‘dedicatedInfoCDMA2000-HRPD’; -1> submit the ULInformationTransfer message to lower layers for transmission, upon which the procedure ends; -5.6.2.4 Failure to deliver ULInformationTransfer message -The UE shall: -1> if mobility (i.e. handover, RRC connection re-establishment) occurs before the successful delivery of ULInformationTransfer messages has been confirmed by lower layers: -2> inform upper layers about the possible failure to deliver the information contained in the concerned ULInformationTransfer messages; -5.6.3 UE capability transfer -5.6.3.1 General - -Figure 5.6.3.1-1: UE capability transfer -The purpose of this procedure is to transfer UE radio access capability information from the UE to E-UTRAN. -If the UE has changed its E-UTRAN radio access capabilities, the UE shall request higher layers to initiate the necessary NAS procedures (see TS 23.401) that would result in the update of UE radio access capabilities using a new RRC connection. -NOTE: Change of the UE’s GERAN and/ or UTRAN UE radio capabilities in RRC_IDLE is supported by use of Tracking Area Update. -5.6.3.2 Initiation -E-UTRAN initiates the procedure to a UE in RRC_CONNECTED when it needs (additional) UE radio access capability information. -5.6.3.3 Reception of the UECapabilityEnquiry by the UE -The UE shall: -1> set the contents of UECapabilityInformation message as follows: -2> if the ue-CapabilityRequest includes ‘eutra’: -3> include the UE-EUTRA-Capability within a ue-CapabilityRAT-Container and with the rat-Type set to ‘eutra’; -2> if the ue-CapabilityRequest includes ‘geran-cs’ and if the UE supports GERAN CS domain: -3> include the UE radio access capabilities for GERAN CS within a ue-CapabilityRAT-Container and with the rat-Type set to ‘geran-cs’; -2> if the ue-CapabilityRequest includes ‘geran-ps’ and if the UE supports GERAN PS domain: -3> include the UE radio access capabilities for GERAN PS within a ue-CapabilityRAT-Container and with the rat-Type set to ‘geran-ps’; -2> if the ue-CapabilityRequest includes ‘utra’ and if the UE supports UTRA: -3> include the UE radio access capabilities for UTRA within a ue-CapabilityRAT-Container and with the rat-Type set to ‘utra’; -2> if the ue-CapabilityRequest includes ‘cdma2000-1XRTT’ and if the UE supports CDMA2000 1xRTT: -3> include the UE radio access capabilities for CDMA2000 within a ue-CapabilityRAT-Container and with the rat-Type set to ‘cdma2000-1XRTT’; -1> submit the UECapabilityInformation message to lower layers for transmission, upon which the procedure ends; -5.6.4 CSFB to 1x Parameter transfer -5.6.4.1 General - -Figure 5.6.4.1-1: CSFB to 1x Parameter transfer -The purpose of this procedure is to transfer the CDMA2000 1xRTT parameters required to register the UE in the CDMA2000 1xRTT network for CSFB support. -5.6.4.2 Initiation -A UE in RRC_CONNECTED initiates the CSFB to 1x Parameter transfer procedure upon request from the CDMA2000 upper layers. The UE initiates the CSFB to 1x Parameter transfer procedure by sending the CSFBParametersRequestCDMA2000 message. -5.6.4.3 Actions related to transmission of CSFBParametersRequestCDMA2000 message -The UE shall: -1> submit the CSFBParametersRequestCDMA2000 message to lower layers for transmission using the current configuration; -5.6.4.4 Reception of the CSFBParametersResponseCDMA2000 message -Upon reception of the CSFBParametersResponseCDMA2000 message, the UE shall: -1> forward the rand and the mobilityParameters to the CDMA2000 1xRTT upper layers; -5.7 Generic error handling -5.7.1 General -The generic error handling defined in the subsequent sub-clauses applies unless explicitly specified otherwise e.g. within the procedure specific error handling. -The UE shall consider a value as not comprehended when it is set: -- to an extended value that is not defined in the version of the transfer syntax supported by the UE. -- to a spare or reserved value unless the specification defines specific behaviour that the UE shall apply upon receiving the concerned spare/ reserved value. -The UE shall consider a field as not comprehended when it is defined: -- as spare or reserved unless the specification defines specific behaviour that the UE shall apply upon receiving the concerned spare/ reserved field. -5.7.2 ASN.1 violation or encoding error -The UE shall: -1> when receiving an RRC message on the BCCH, PCCH or CCCH for which the abstract syntax is invalid: -2> ignore the message; -NOTE This section applies in case one or more fields is set to a code point not defined in this version of the transfer syntax. In this case, it may not be possible to reliably detect which field is in the error hence the error handling is at the message level. -5.7.3 Field set to a not comprehended value -The UE shall, when receiving an RRC message on any logical channel: -1> if the message includes a field that has a value that the UE does not comprehend: -2> if a default value is defined for this field: -3> treat the message while using the default value defined for this field; -2> else if the concerned field is optional: -3> treat the message as if the field were absent and in accordance with the need code for absence of the concerned field; -2> else: -3> treat the message as if the field were absent and in accordance with sub-clause 5.7.4; -5.7.4 Mandatory field missing -The UE shall: -1> if the message includes a field that is mandatory to include in the message (e.g. because conditions for mandatory presence are fulfilled) and that field is absent or treated as absent: -2> if the RRC message was received on DCCH or CCCH: -3> ignore the message; -2> else: -3> if the field concerns a (sub-field of) an entry of a list (i.e. a SEQUENCE OF): -4> treat the list as if the entry including the missing or not comprehended field was not present; -3> else if the field concerns a sub-field of another field, referred to as the 'parent' field i.e. the field that is one nesting level up compared to the erroneous field: -4> consider the 'parent' field to be set to a not comprehended value; -4> apply the generic error handling to the subsequent 'parent' field(s), until reaching the top nesting level i.e. the message level; -3> else (field at message level): -4> ignore the message; -NOTE: The error handling defined in these sub-clauses implies that the UE ignores a message with the message type or version set to a not comprehended value. -5.7.5 Not comprehended field -The UE shall, when receiving an RRC message on any logical channel: -1> if the message includes a field that the UE does not comprehend: -2> treat the rest of the message as if the field was absent; -NOTE: This section does not apply to the case of an extension to the value range of a field. Such cases are addressed instead by the requirements in section 5.7.3. -6 Protocol data units, formats and parameters (tabular & ASN.1) -6.1 General -The contents of each RRC message is specified in sub-clause 6.2 using ASN.1 to specify the message syntax and using tables when needed to provide further detailed information about the information elements specified in the message syntax. The syntax of the information elements that are defined as stand-alone abstract types is further specified in a similar manner in sub-clause 6.3. -The need for information elements to be present in a message or an abstract type, i.e., the ASN.1 fields that are specified as OPTIONAL in the abstract notation (ASN.1), is specified by means of comment text tags attached to the OPTIONAL statement in the abstract syntax. All comment text tags are available for use in the downlink direction only. The meaning of each tag is specified in table 6.1-1. -Table 6.1-1: Meaning of abbreviations used to specify the need for information elements to be present -Abbreviation Meaning Cond conditionTag -(Used in downlink only) Conditionally present -An information element for which the need is specified by means of conditions. For each conditionTag, the need is specified in a tabular form following the ASN.1 segment. In case, according to the conditions, a field is not present, the UE takes no action and where applicable shall continue to use the existing value (and/ or the associated functionality) unless explicitly stated otherwise in the description of the field itself. Need OP -(Used in downlink only) Optionally present -An information element that is optional to signal. For downlink messages, the UE is not required to take any special action on absence of the IE beyond what is specified in the procedural text or the field description table following the ASN.1 segment. The UE behaviour on absence should be captured either in the procedural text or in the field description. Need ON -(Used in downlink only) Optionally present, No action -An information element that is optional to signal. If the message is received by the UE, and in case the information element is absent, the UE takes no action and where applicable shall continue to use the existing value (and/ or the associated functionality). Need OR -(Used in downlink only) Optionally present, Release -An information element that is optional to signal. If the message is received by the UE, and in case the information element is absent, the UE shall discontinue/ stop using/ delete any existing value (and/ or the associated functionality). -Any IE with Need ON in system information shall be interpreted as Need OR. -6.2 RRC messages -NOTE: The messages included in this section reflect the current status of the discussions. Additional messages may be included at a later stage. -6.2.1 General message structure -– EUTRA-RRC-Definitions -This ASN.1 segment is the start of the EUTRA RRC PDU definitions. --- ASN1START - -EUTRA-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - --- ASN1STOP - -– BCCH-BCH-Message -The BCCH-BCH-Message class is the set of RRC messages that may be sent from the EUTRAN to the UE via BCH on the BCCH logical channel. --- ASN1START - -BCCH-BCH-Message ::= SEQUENCE { - message BCCH-BCH-MessageType -} - -BCCH-BCH-MessageType ::= MasterInformationBlock - --- ASN1STOP - -– BCCH-DL-SCH-Message -The BCCH-DL-SCH-Message class is the set of RRC messages that may be sent from the EUTRAN to the UE via DLSCH on the BCCH logical channel. --- ASN1START - -BCCH-DL-SCH-Message ::= SEQUENCE { - message BCCH-DL-SCH-MessageType -} - -BCCH-DL-SCH-MessageType ::= CHOICE { - c1 CHOICE { - systemInformation SystemInformation, - systemInformationBlockType1 SystemInformationBlockType1 - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -– PCCH-Message -The PCCH-Message class is the set of RRC messages that may be sent from the EUTRAN to the UE on the PCCH logical channel. --- ASN1START - -PCCH-Message ::= SEQUENCE { - message PCCH-MessageType -} - -PCCH-MessageType ::= CHOICE { - c1 CHOICE { - paging Paging - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -– DL-CCCH-Message -The DL-CCCH-Message class is the set of RRC messages that may be sent from the EUTRAN to the UE on the downlink CCCH logical channel. --- ASN1START - -DL-CCCH-Message ::= SEQUENCE { - message DL-CCCH-MessageType -} - -DL-CCCH-MessageType ::= CHOICE { - c1 CHOICE { - rrcConnectionReestablishment RRCConnectionReestablishment, - rrcConnectionReestablishmentReject RRCConnectionReestablishmentReject, - rrcConnectionReject RRCConnectionReject, - rrcConnectionSetup RRCConnectionSetup - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -– DL-DCCH-Message -The DL-DCCH-Message class is the set of RRC messages that may be sent from the EUTRAN to the UE on the downlink DCCH logical channel. --- ASN1START - -DL-DCCH-Message ::= SEQUENCE { - message DL-DCCH-MessageType -} - -DL-DCCH-MessageType ::= CHOICE { - c1 CHOICE { - csfbParametersResponseCDMA2000 CSFBParametersResponseCDMA2000, - dlInformationTransfer DLInformationTransfer, - handoverFromEUTRAPreparationRequest HandoverFromEUTRAPreparationRequest, - mobilityFromEUTRACommand MobilityFromEUTRACommand, - rrcConnectionReconfiguration RRCConnectionReconfiguration, - rrcConnectionRelease RRCConnectionRelease, - securityModeCommand SecurityModeCommand, - ueCapabilityEnquiry UECapabilityEnquiry, - counterCheck CounterCheck, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -– UL-CCCH-Message -The UL-CCCH-Message class is the set of RRC messages that may be sent from the UE to the EUTRAN on the uplink CCCH logical channel. --- ASN1START - -UL-CCCH-Message ::= SEQUENCE { - message UL-CCCH-MessageType -} - -UL-CCCH-MessageType ::= CHOICE { - c1 CHOICE { - rrcConnectionReestablishmentRequest RRCConnectionReestablishmentRequest, - rrcConnectionRequest RRCConnectionRequest - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -– UL-DCCH-Message -The UL-DCCH-Message class is the set of RRC messages that may be sent from the UE to the EUTRAN on the uplink DCCH logical channel. --- ASN1START - -UL-DCCH-Message ::= SEQUENCE { - message UL-DCCH-MessageType -} - -UL-DCCH-MessageType ::= CHOICE { - c1 CHOICE { - csfbParametersRequestCDMA2000 CSFBParametersRequestCDMA2000, - measurementReport MeasurementReport, - rrcConnectionReconfigurationComplete RRCConnectionReconfigurationComplete, - rrcConnectionReestablishmentComplete RRCConnectionReestablishmentComplete, - rrcConnectionSetupComplete RRCConnectionSetupComplete, - securityModeComplete SecurityModeComplete, - securityModeFailure SecurityModeFailure, - ueCapabilityInformation UECapabilityInformation, - ulHandoverPreparationTransfer ULHandoverPreparationTransfer, - ulInformationTransfer ULInformationTransfer, - counterCheckResponse CounterCheckResponse, - spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -6.2.2 Message definitions -– CounterCheck -The CounterCheck message is used by the E-UTRAN to indicate the current COUNT MSB values associated to each DRB and to request the UE to compare these to its COUNT MSB values and to report the comparison results to E-UTRAN. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -CounterCheck message --- ASN1START - -CounterCheck ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - counterCheck-r8 CounterCheck-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -CounterCheck-r8-IEs ::= SEQUENCE { - drb-CountMSB-InfoList DRB-CountMSB-InfoList, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - -DRB-CountMSB-InfoList::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-CountMSB-Info - -DRB-CountMSB-Info ::= SEQUENCE { - drb-Identity DRB-Identity, - countMSB-Uplink INTEGER(0..33554431), - countMSB-Downlink INTEGER(0..33554431) -} - --- ASN1STOP - -CounterCheck field descriptions drb-CountMSB-InfoList -Indicates the MSBs of the COUNT values of the DRBs. count-MSB-Uplink -Indicates the value of 25 MSBs from uplink COUNT associated to this DRB. count-MSB-Downlink -Indicates the value of 25 MSBs from downlink COUNT associated to this DRB. -– CounterCheckResponse -The CounterCheckResponse message is used by the UE to respond to a CounterCheck message. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -CounterCheckResponse message --- ASN1START - -CounterCheckResponse ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - counterCheckResponse-r8 CounterCheckResponse-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CounterCheckResponse-r8-IEs ::= SEQUENCE { - drb-CountInfoList DRB-CountInfoList, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -DRB-CountInfoList ::= SEQUENCE (SIZE (0..maxDRB)) OF DRB-CountInfo - -DRB-CountInfo ::= SEQUENCE { - drb-Identity DRB-Identity, - count-Uplink INTEGER(0..4294967295), - count-Downlink INTEGER(0..4294967295) -} - --- ASN1STOP - -CounterCheckResponse field descriptions drb-CountInfoList -Indicates the COUNT values of the DRBs. count-Uplink -Indicates the value of uplink COUNT associated to this DRB. count-Downlink -Indicates the value of downlink COUNT associated to this DRB. -– CSFBParametersRequestCDMA2000 -The CSFBParametersRequestCDMA2000 message is used by the UE to obtain the CDMA2000 1xRTT Parameters from the network. The UE needs these parameters to generate the CDMA2000 1xRTT Registration message used to register with the CDMA2000 1xRTT Network which is required to support CSFB to CDMA2000 1xRTT. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -CSFBParametersRequestCDMA2000 message --- ASN1START - -CSFBParametersRequestCDMA2000 ::= SEQUENCE { - criticalExtensions CHOICE { - csfbParametersRequestCDMA2000-r8 CSFBParametersRequestCDMA2000-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CSFBParametersRequestCDMA2000-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} --- ASN1STOP - -– CSFBParametersResponseCDMA2000 -The CSFBParametersResponseCDMA2000 message is used to provide the CDMA2000 1xRTT Parameters to the UE so the UE can register with the CDMA2000 1xRTT Network to support CSFB to CDMA2000 1xRTT. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -CSFBParametersResponseCDMA2000 message --- ASN1START - -CSFBParametersResponseCDMA2000 ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - csfbParametersResponseCDMA2000-r8 CSFBParametersResponseCDMA2000-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CSFBParametersResponseCDMA2000-r8-IEs ::= SEQUENCE { - rand RAND-CDMA2000, - mobilityParameters MobilityParametersCDMA2000, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - --- ASN1STOP - -– DLInformationTransfer -The DLInformationTransfer message is used for the downlink transfer of dedicated NAS information. -Signalling radio bearer: SRB2 or SRB1 (only if SRB2 not established yet. If SRB2 is suspended, E-UTRAN does not send this message until SRB2 is resumed.) -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -DLInformationTransfer message --- ASN1START - -DLInformationTransfer ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - dlInformationTransfer-r8 DLInformationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -DLInformationTransfer-r8-IEs ::= SEQUENCE { - dedicatedInfoType CHOICE { - dedicatedInfoNAS DedicatedInfoNAS, - dedicatedInfoCDMA2000-1XRTT DedicatedInfoCDMA2000, - dedicatedInfoCDMA2000-HRPD DedicatedInfoCDMA2000 - }, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - --- ASN1STOP - -– HandoverFromEUTRAPreparationRequest (CDMA2000) -The HandoverFromEUTRAPreparationRequest message is used to trigger the handover preparation procedure with a CDMA2000 RAT. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -HandoverFromEUTRAPreparationRequest message --- ASN1START - -HandoverFromEUTRAPreparationRequest ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - handoverFromEUTRAPreparationRequest-r8 - HandoverFromEUTRAPreparationRequest-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverFromEUTRAPreparationRequest-r8-IEs ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - rand RAND-CDMA2000 OPTIONAL, -- Cond cdma2000-Type - mobilityParameters MobilityParametersCDMA2000 OPTIONAL, -- Cond cdma2000-Type - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - - -Conditional presence Explanation cdma2000-Type The field is mandatory present if the cdma2000-Type = type1XRTT; otherwise it is not present. -– MasterInformationBlock -The MasterInformationBlock includes the system information transmitted on BCH. -Signalling radio bearer: N/A -RLC-SAP: TM -Logical channel: BCCH -Direction: EUTRAN to UE -MasterInformationBlock --- ASN1START - -MasterInformationBlock ::= SEQUENCE { - dl-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100}, - phich-Config PHICH-Config, - systemFrameNumber BIT STRING (SIZE (8)), - spare BIT STRING (SIZE (10)) -} - - --- ASN1STOP - -MasterInformationBlock field descriptions dl-Bandwidth -Parameter: transmission bandwidth configuration, NRB in downlink, see TS 36.101 [42, table 5.6-1]. n6 corresponds to 6 resource blocks, n15 to 15 resource blocks and so on. systemFrameNumber -Defines the 8 most significant bits of the SFN, see TS 36.211 [21, 6.6.1]. The 2 least significant bits of the SFN are acquired implicitly in the P-BCH decoding, i.e. timing of 40ms P-BCH TTI indicates 2 least significant bits (within 40ms P-BCH TTI, the first radio frame: 00, the second radio frame: 01, the third radio frame: 10, the last radio frame: 11). -– MeasurementReport -The MeasurementReport message is used for the indication of measurement results. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -MeasurementReport message --- ASN1START - -MeasurementReport ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - measurementReport-r8 MeasurementReport-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -MeasurementReport-r8-IEs ::= SEQUENCE { - measResults MeasResults, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– MobilityFromEUTRACommand -The MobilityFromEUTRACommand message is used to command handover or a cell change from EUTRA to another RAT (3GPP or non-3GPP). -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -MobilityFromEUTRACommand message --- ASN1START - -MobilityFromEUTRACommand ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - mobilityFromEUTRACommand-r8 MobilityFromEUTRACommand-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -MobilityFromEUTRACommand-r8-IEs ::= SEQUENCE { - cs-FallbackIndicator BOOLEAN, - purpose CHOICE{ - handover Handover, - cellChangeOrder CellChangeOrder - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -Handover ::= SEQUENCE { - targetRAT-Type ENUMERATED { - utra, geran, cdma2000-1XRTT, cdma2000-HRPD, - spare4, spare3, spare2, spare1, ...}, - targetRAT-MessageContainer OCTET STRING, - nas-SecurityParamFromEUTRA OCTET STRING (SIZE (1)) OPTIONAL, -- Cond UTRAGERAN - systemInformation SI-OrPSI-GERAN OPTIONAL -- Cond PSHO -} - -CellChangeOrder ::= SEQUENCE { - t304 ENUMERATED { - ms100, ms200, ms500, ms1000, - ms2000, ms4000, ms8000, spare1}, - targetRAT-Type CHOICE { - geran SEQUENCE { - physCellId PhysCellIdGERAN, - carrierFreq CarrierFreqGERAN, - networkControlOrder BIT STRING (SIZE (2)) OPTIONAL, -- Need OP - systemInformation SI-OrPSI-GERAN OPTIONAL -- Need OP - }, - ... - } -} - -SI-OrPSI-GERAN ::= CHOICE { - si SystemInfoListGERAN, - psi SystemInfoListGERAN -} - -SystemInfoListGERAN ::= SEQUENCE (SIZE (1..maxGERAN-SI)) OF - OCTET STRING (SIZE (1..23)) - --- ASN1STOP - -MobilityFromEUTRACommand field descriptions t304 -Timer T304 as described in section 7.3. Value ms100 corresponds with 100 ms, ms200 corresponds with 200 ms and so on. cs-FallbackIndicator -Indicates whether or not the CS Fallback procedure is triggered. E-UTRAN only applies value 'false' when targetRAT-Type is set to ‘cdma2000-1XRTT’ or to ‘cdma2000-HRPD’. targetRAT-Type -Indicates the target RAT type. targetRAT-MessageContainer -The field contains a message specified in another standard, as indicated by the targetRAT-Type, and carries information about the target cell identifier(s) and radio parameters relevant for the target radio access technology. The correspondence between the value of the targetRAT-Type, the standard to apply and the message contained within the targetRAT-MessageContainer is shown below - -A complete message is included, as specified in the other standard. nas-SecurityParamFromEUTRA -Used to deliver the key synchronisation and Key freshness for the E-UTRAN to UTRAN handovers as specified in TS 33.401. The content of the parameter is defined in TS24.301. carrierFreq -contains the carrier frequency of the target GERAN cell. networkControlOrder -Parameter NETWORK_CONTROL_ORDER in TS 44.060 [36]. SystemInfoListGERAN -Each OCTET STRING contains one complete System Information (SI) message as defined in TS 44.018 [45, table 9.1.1] or a complete Packet System Information (PSI) message as defined in TS 44.060 [36, table 11.2.1]. If purpose = 'CellChangeOrder' and if the field is not present, the UE has to acquire this from the GERAN cell. -Conditional presence Explanation UTRAGERAN The field is mandatory present if the targetRAT-Type is set to “utra” or “geran”; otherwise the field is not present PSHO The field is mandatory present in case of PS handover toward GERAN; otherwise the field is optionally present, but not used by the UE -– Paging -The Paging message is used for the notification of one or more UEs. -Signalling radio bearer: N/A -RLC-SAP: TM -Logical channel: PCCH -Direction: EUTRAN to UE -Paging message --- ASN1START - -Paging ::= SEQUENCE { - pagingRecordList PagingRecordList OPTIONAL, -- Need ON - systemInfoModification ENUMERATED {true} OPTIONAL, -- Need ON - etws-Indication ENUMERATED {true} OPTIONAL, -- Need ON - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -PagingRecordList ::= SEQUENCE (SIZE (1..maxPageRec)) OF PagingRecord - -PagingRecord ::= SEQUENCE { - ue-Identity PagingUE-Identity, - cn-Domain ENUMERATED {ps, cs}, - ... -} - -PagingUE-Identity ::= CHOICE { - s-TMSI S-TMSI, - imsi IMSI, - ... -} - -IMSI ::= SEQUENCE (SIZE (6..21)) OF IMSI-Digit - -IMSI-Digit::= INTEGER (0..9) - --- ASN1STOP - -Paging field descriptions cn-Domain -Indicates the origin of paging. ue-Identity -Provides the NAS identity of the UE that is being paged. systemInfoModification -If present: indication of a BCCH modification other than SIB10 and SIB11. etws-Indication -If present: indication of an ETWS primary notification and/ or ETWS secondary notification. imsi -The International Mobile Subscriber Identity, a globally unique permanent subscriber identity, see TS 23.003 [27]. The first element contains the first IMSI digit, the second element contains the second IMSI digit and so on. -– RRCConnectionReconfiguration -The RRCConnectionReconfiguration message is the command to modify an RRC connection. It may convey information for measurement configuration, mobility control, radio resource configuration (including RBs, MAC main configuration and physical channel configuration) including any associated dedicated NAS information and security configuration. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -RRCConnectionReconfiguration message --- ASN1START - -RRCConnectionReconfiguration ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionReconfiguration-r8 RRCConnectionReconfiguration-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfiguration-r8-IEs ::= SEQUENCE { - measConfig MeasConfig OPTIONAL, -- Need ON - mobilityControlInfo MobilityControlInfo OPTIONAL, -- Cond HO - dedicatedInfoNASList SEQUENCE (SIZE(1..maxDRB)) OF - DedicatedInfoNAS OPTIONAL, -- Cond nonHO - radioResourceConfigDedicated RadioResourceConfigDedicated OPTIONAL, -- Cond HO-toEUTRA - securityConfigHO SecurityConfigHO OPTIONAL, -- Cond HO - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -SecurityConfigHO ::= SEQUENCE { - handoverType CHOICE { - intraLTE SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig OPTIONAL, -- Need OP - keyChangeIndicator BOOLEAN, - nextHopChainingCount NextHopChainingCount - }, - interRAT SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig, - nas-SecurityParamToEUTRA OCTET STRING (SIZE(6)) - } - }, - ... -} - --- ASN1STOP - -RRCConnectionReconfiguration field descriptions dedicatedInfoNASList -This field is used to transfer UE specific NAS layer information between the network and the UE. The RRC layer is transparent for each PDU in the list. nas-securityParamToEUTRA -This field is used to transfer UE specific NAS layer information between the network and the UE. The RRC layer is transparent for this field, although it affects activation of AS- security after inter-RAT handover to E-UTRA. The content is defined in TS 24.301. keyChangeIndicator -‘true’ is used only in an intra-cell handover when a KeNB key is derived from a native KASME key taken into use through the successful NAS SMC, as described in TS 33.401 [32] for KeNB re-keying. ’false’ is used in an intra-LTE handover when the new KeNB key is obtained from the current KeNB key or from the NH as described in TS 33.401 [32]. nextHopChainingCount -Parameter NCC: See TS 33.401 [32] -Conditional presence Explanation HO The field is mandatory present in case of handover within E-UTRA or to E-UTRA; otherwise the field is not present. nonHO The field is not present in case of handover within E-UTRA or to E-UTRA; otherwise it is optional present, need ON. HO-toEUTRA The field is mandatory present in case of handover to E-UTRA; otherwise the field is optionally present, need ON. -– RRCConnectionReconfigurationComplete -The RRCConnectionReconfigurationComplete message is used to confirm the successful completion of an RRC connection reconfiguration. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -RRCConnectionReconfigurationComplete message --- ASN1START - -RRCConnectionReconfigurationComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - rrcConnectionReconfigurationComplete-r8 - RRCConnectionReconfigurationComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfigurationComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– RRCConnectionReestablishment -The RRCConnectionReestablishment message is used to resolve contention and to re-establish SRB1. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: EUTRAN to UE -RRCConnectionReestablishment message --- ASN1START - -RRCConnectionReestablishment ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionReestablishment-r8 RRCConnectionReestablishment-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishment-r8-IEs ::= SEQUENCE { - radioResourceConfigDedicated RadioResourceConfigDedicated, - nextHopChainingCount NextHopChainingCount, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -– RRCConnectionReestablishmentComplete -The RRCConnectionReestablishmentComplete message is used to confirm the successful completion of an RRC connection reestablishment. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -RRCConnectionReestablishmentComplete message --- ASN1START - -RRCConnectionReestablishmentComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - rrcConnectionReestablishmentComplete-r8 - RRCConnectionReestablishmentComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– RRCConnectionReestablishmentReject -The RRCConnectionReestablishmentReject message is used to indicate the rejection of an RRC connection reestablishment request. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: EUTRAN to UE -RRCConnectionReestablishmentReject message --- ASN1START - -RRCConnectionReestablishmentReject ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionReestablishmentReject-r8 - RRCConnectionReestablishmentReject-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentReject-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -– RRCConnectionReestablishmentRequest -The RRCConnectionReestablishmentRequest message is used to request the reestablishment of an RRC connection. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: UE to EUTRAN -RRCConnectionReestablishmentRequest message --- ASN1START - -RRCConnectionReestablishmentRequest ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionReestablishmentRequest-r8 - RRCConnectionReestablishmentRequest-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentRequest-r8-IEs ::= SEQUENCE { - ue-Identity ReestabUE-Identity, - reestablishmentCause ReestablishmentCause, - spare BIT STRING (SIZE (2)) -} - -ReestabUE-Identity ::= SEQUENCE { - c-RNTI C-RNTI, - physCellId PhysCellId, - shortMAC-I ShortMAC-I -} - -ReestablishmentCause ::= ENUMERATED { - reconfigurationFailure, handoverFailure, - otherFailure, spare1} - --- ASN1STOP - -RRCConnectionReestablishmentRequest field descriptions ue-Identity -UE identity included to retrieve UE context and to facilitate contention resolution by lower layers. reestablishmentCause -Indicates the failure cause that triggered the re-establishment procedure. physCellId -The Physical Cell Identity of the cell the UE was connected to prior to the failure. -– RRCConnectionReject -The RRCConnectionReject message is used to reject the RRC connection establishment. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: EUTRAN to UE -RRCConnectionReject message --- ASN1START - -RRCConnectionReject ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionReject-r8 RRCConnectionReject-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReject-r8-IEs ::= SEQUENCE { - waitTime INTEGER (1..16), - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -RRCConnectionReject field descriptions waitTime -Wait time value in seconds. -– RRCConnectionRelease -The RRCConnectionRelease message is used to command the release of an RRC connection. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -RRCConnectionRelease message --- ASN1START - -RRCConnectionRelease ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionRelease-r8 RRCConnectionRelease-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionRelease-r8-IEs ::= SEQUENCE { - releaseCause ReleaseCause, - redirectedCarrierInfo RedirectedCarrierInfo OPTIONAL, -- Need ON - idleModeMobilityControlInfo IdleModeMobilityControlInfo OPTIONAL, -- Need OP - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -ReleaseCause ::= ENUMERATED {loadBalancingTAUrequired, - other,spare2, spare1 } - -RedirectedCarrierInfo ::= CHOICE { - eutra ARFCN-ValueEUTRA, - geran CarrierFreqsGERAN, - utra-FDD ARFCN-ValueUTRA, - utra-TDD ARFCN-ValueUTRA, - cdma2000-HRPD CarrierFreqCDMA2000, - cdma2000-1xRTT CarrierFreqCDMA2000, - ... -} - -IdleModeMobilityControlInfo ::= SEQUENCE { - freqPriorityListEUTRA FreqPriorityListEUTRA OPTIONAL, -- Need ON - freqPriorityListGERAN FreqsPriorityListGERAN OPTIONAL, -- Need ON - freqPriorityListUTRA-FDD FreqPriorityListUTRA-FDD OPTIONAL, -- Need ON - freqPriorityListUTRA-TDD FreqPriorityListUTRA-TDD OPTIONAL, -- Need ON - bandClassPriorityListHRPD BandClassPriorityListHRPD OPTIONAL, -- Need ON - bandClassPriorityList1XRTT BandClassPriorityList1XRTT OPTIONAL, -- Need ON - t320 ENUMERATED { - min5, min10, min20, min30, min60, min120, min180, - spare1} OPTIONAL, -- Need OR - ... -} - -FreqPriorityListEUTRA ::= SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA - -FreqPriorityEUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueEUTRA, - cellReselectionPriority CellReselectionPriority -} - -FreqsPriorityListGERAN ::= SEQUENCE (SIZE (1..maxGNFG)) OF FreqsPriorityGERAN - -FreqsPriorityGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - cellReselectionPriority CellReselectionPriority -} - -FreqPriorityListUTRA-FDD ::= SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF FreqPriorityUTRA-FDD - -FreqPriorityUTRA-FDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority -} - -FreqPriorityListUTRA-TDD ::= SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF FreqPriorityUTRA-TDD - -FreqPriorityUTRA-TDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority -} - -BandClassPriorityListHRPD ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassPriorityHRPD - -BandClassPriorityHRPD ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority -} - -BandClassPriorityList1XRTT ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassPriority1XRTT - -BandClassPriority1XRTT ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority -} --- ASN1STOP - -RRCConnectionRelease field descriptions releaseCause -The releaseCause is used to indicate the reason for releasing the RRC Connection. redirectedCarrierInfo -The redirectedCarrierInfo indicates a carrier frequency (downlink for FDD) and is used to redirect the UE to another EUTRA or an inter-RAT carrier frequency, by means of the cell selection upon leaving RRC_CONNECTED as specified in TS 36.304 [4]. idleModeMobilityControlInfo -Provides dedicated cell reselection priorities. Used for cell reselection as specified in TS 36.304 [4]. freqPriorityListX -Provides a cell reselection priority for each frequency, by means of separate lists for each RAT (including E-UTRA). carrierFreq or bandClass -The carrier frequency (UTRA and E-UTRA) and band class (HRPD and 1xRTT) for which the associated cellReselectionPriority is applied. t320 -Timer T320 as described in section 7.3. Value minN corresponds to N minutes. carrierFreqs -The list of GERAN carrier frequencies organised into one group of GERAN carrier frequencies. -– RRCConnectionRequest -The RRCConnectionRequest message is used to request the establishment of an RRC connection. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: UE to EUTRAN -RRCConnectionRequest message --- ASN1START - -RRCConnectionRequest ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionRequest-r8 RRCConnectionRequest-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionRequest-r8-IEs ::= SEQUENCE { - ue-Identity InitialUE-Identity, - establishmentCause EstablishmentCause, - spare BIT STRING (SIZE (1)) -} - -InitialUE-Identity ::= CHOICE { - s-TMSI S-TMSI, - randomValue BIT STRING (SIZE (40)) -} - -EstablishmentCause ::= ENUMERATED { - emergency, highPriorityAccess, mt-Access, mo-Signalling, - mo-Data, spare3, spare2, spare1} - --- ASN1STOP - -RRCConnectionRequest field descriptions ue-Identity -UE identity included to facilitate contention resolution by lower layers. establishmentCause -Provides the establishment cause for the RRC connection request as provided by the upper layers. W.r.t. the cause value names: highPriorityAccess concerns AC11..AC15, ‘mt’ stands for ‘Mobile Terminating’ and ‘mo’ for ‘Mobile Originating. randomValue -Integer value in the range 0 to 240 ? 1. -– RRCConnectionSetup -The RRCConnectionSetup message is used to establish SRB1. -Signalling radio bearer: SRB0 -RLC-SAP: TM -Logical channel: CCCH -Direction: EUTRAN to UE -RRCConnectionSetup message --- ASN1START - -RRCConnectionSetup ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionSetup-r8 RRCConnectionSetup-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionSetup-r8-IEs ::= SEQUENCE { - radioResourceConfigDedicated RadioResourceConfigDedicated, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -– RRCConnectionSetupComplete -The RRCConnectionSetupComplete message is used to confirm the successful completion of an RRC connection establishment. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -RRCConnectionSetupComplete message --- ASN1START - -RRCConnectionSetupComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionSetupComplete-r8 RRCConnectionSetupComplete-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionSetupComplete-r8-IEs ::= SEQUENCE { - selectedPLMN-Identity INTEGER (1..6), - registeredMME RegisteredMME OPTIONAL, - dedicatedInfoNAS DedicatedInfoNAS, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -RegisteredMME ::= SEQUENCE { - plmn-Identity PLMN-Identity OPTIONAL, - mmegi BIT STRING (SIZE (16)), - mmec MMEC -} - --- ASN1STOP - -RRCConnectionSetupComplete field descriptions selectedPLMN-Identity -Index of the PLMN selected by the UE from the plmn-IdentityList included in SIB1. 1 if the 1st PLMN is selected from the plmn-IdentityList included in SIB1, 2 if the 2nd PLMN is selected from the plmn-IdentityList included in SIB1 and so on. registeredMME -This field is used to transfer the GUMMEI of the MME where the UE is registered, as provided by upper layers. mmegi -Provides the Group Identity of the registered MME within the PLMN, as provided by upper layers, see TS 23.003 [27]. -– SecurityModeCommand -The SecurityModeCommand message is used to command the activation of AS security. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -SecurityModeCommand message --- ASN1START - -SecurityModeCommand ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - securityModeCommand-r8 SecurityModeCommand-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeCommand-r8-IEs ::= SEQUENCE { - securityConfigSMC SecurityConfigSMC, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -SecurityConfigSMC ::= SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig, - ... -} - --- ASN1STOP - -– SecurityModeComplete -The SecurityModeComplete message is used to confirm the successful completion of a security mode command. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -SecurityModeComplete message --- ASN1START - -SecurityModeComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - securityModeComplete-r8 SecurityModeComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– SecurityModeFailure -The SecurityModeFailure message is used to indicate an unsuccessful completion of a security mode command. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -SecurityModeFailure message --- ASN1START - -SecurityModeFailure ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - securityModeFailure-r8 SecurityModeFailure-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeFailure-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– SystemInformation -The SystemInformation message is used to convey one or more System Information Blocks. All the SIBs included are transmitted with the same periodicity. -Signalling radio bearer: N/A -RLC-SAP: TM -Logical channel: BCCH -Direction: EUTRAN to UE -SystemInformation message --- ASN1START - -SystemInformation ::= SEQUENCE { - criticalExtensions CHOICE { - systemInformation-r8 SystemInformation-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} -SystemInformation-r8-IEs ::= SEQUENCE { - sib-TypeAndInfo SEQUENCE (SIZE (1..maxSIB)) OF CHOICE { - sib2 SystemInformationBlockType2, - sib3 SystemInformationBlockType3, - sib4 SystemInformationBlockType4, - sib5 SystemInformationBlockType5, - sib6 SystemInformationBlockType6, - sib7 SystemInformationBlockType7, - sib8 SystemInformationBlockType8, - sib9 SystemInformationBlockType9, - sib10 SystemInformationBlockType10, - sib11 SystemInformationBlockType11, - ... - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -– SystemInformationBlockType1 -SystemInformationBlockType1 contains information relevant when evaluating if a UE is allowed to access a cell and defines the scheduling of other system information. -Signalling radio bearer: N/A -RLC-SAP: TM -Logical channel: BCCH -Direction: EUTRAN to UE -SystemInformationBlockType1 message --- ASN1START - -SystemInformationBlockType1 ::= SEQUENCE { - cellAccessRelatedInfo SEQUENCE { - plmn-IdentityList PLMN-IdentityList, - trackingAreaCode TrackingAreaCode, - cellIdentity CellIdentity, - cellBarred ENUMERATED {barred, notBarred}, - intraFreqReselection ENUMERATED {allowed, notAllowed}, - csg-Indication BOOLEAN, - csg-Identity BIT STRING (SIZE (27)) OPTIONAL -- Need OR - }, - cellSelectionInfo SEQUENCE { - q-RxLevMin Q-RxLevMin, - q-RxLevMinOffset INTEGER (1..8) OPTIONAL -- Need OP - }, - p-Max P-Max OPTIONAL, -- Need OP - freqBandIndicator INTEGER (1..64), - schedulingInfoList SchedulingInfoList, - tdd-Config TDD-Config OPTIONAL, -- Cond TDD - si-WindowLength ENUMERATED { - ms1, ms2, ms5, ms10, ms15, ms20, - ms40}, - systemInfoValueTag INTEGER (0..31), - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -PLMN-IdentityList ::= SEQUENCE (SIZE (1..6)) OF PLMN-IdentityInfo - -PLMN-IdentityInfo ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellReservedForOperatorUse ENUMERATED {reserved, notReserved} -} - -SchedulingInfoList ::= SEQUENCE (SIZE (1..maxSI-Message)) OF SchedulingInfo - -SchedulingInfo ::= SEQUENCE { - si-Periodicity ENUMERATED { - rf8, rf16, rf32, rf64, rf128, rf256, rf512}, - sib-MappingInfo SIB-MappingInfo -} - -SIB-MappingInfo ::= SEQUENCE (SIZE (0..maxSIB-1)) OF SIB-Type - -SIB-Type ::= ENUMERATED { - sibType3, sibType4, sibType5, sibType6, - sibType7, sibType8, sibType9, sibType10, - sibType11, spare7, spare6, spare5, - spare4, spare3, spare2, spare1, ...} - --- ASN1STOP - -SystemInformationBlockType1 field descriptions plmn-IdentityList -List of PLMN identities. The first listed PLMN-Identity is the primary PLMN. cellReservedForOperatorUse -As defined in TS 36.304 [4]. trackingAreaCode -A trackingAreaCode that is common for all the PLMNs listed. cellBarred -‘barred’ means the cell is barred, as defined in TS 36.304 [4]. intraFreqReselection -Used to control cell reselection to intra-frequency cells when the highest ranked cell is barred, or treated as barred by the UE, as specified in TS 36.304 [4]. csg-Indication -If set to TRUE the UE is only allowed to access the cell if the CSG identity matches an entry in the allowed CSG list that the UE has stored. q-RxLevMinOffset -Parameter Qrxlevminoffset in 36.304 [4]. Actual value Qrxlevminoffset = IE value * 2 [dB]. If absent, apply the (default) value of 0 [dB] for Qrxlevminoffset. Affects the minimum required Rx level in the cell. p-Max -Value applicable for the cell. freqBandIndicator -Defined in TS 36.101 [42, table 5.5-1]. si-Periodicity -Periodicity of the SI-message in radio frames, such that rf8 denotes 8 radio frames, rf16 denotes 16 radio frames, and so on. sib-MappingInfo -List of the SIBs mapped to this SystemInformation message.There is no mapping information of SIB2; it is always present in the first SystemInformation message listed in the schedulingInfoList list. si-WindowLength -Common SI scheduling window for all SIs. Unit in milliseconds, where ms1 denotes 1 millisecond, ms2 denotes 2 milliseconds and so on. systemInfoValueTag -Common for all SIBs other than MIB, SIB1, SIB10 and SIB11. csg-Identity -Identity of the Closed Subscriber Group within the primary PLMN the cell belongs to. The IE is present in a CSG cell. -Conditional presence Explanation TDD This field is mandatory present for TDD; it is not present for FDD and the UE shall delete any existing value for this field. -– UECapabilityEnquiry -The UECapabilityEnquiry message is used to request the transfer of UE radio access capabilities for EUTRA as well as for other RATs. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: EUTRAN to UE -UECapabilityEnquiry message --- ASN1START - -UECapabilityEnquiry ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - ueCapabilityEnquiry-r8 UECapabilityEnquiry-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UECapabilityEnquiry-r8-IEs ::= SEQUENCE { - ue-CapabilityRequest UE-CapabilityRequest, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -UE-CapabilityRequest ::= SEQUENCE (SIZE (1..maxRAT-Capabilities)) OF RAT-Type - --- ASN1STOP - -UECapabilityEnquiry field descriptions ue-CapabilityRequest -List of the RATs for which the UE is requested to transfer the UE radio access capabilities i.e. E-UTRA, UTRA, GERAN-CS, GERAN-PS, CDMA2000. -– UECapabilityInformation -The UECapabilityInformation message is used to transfer of UE radio access capabilities requested by the EUTRAN. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -UECapabilityInformation message --- ASN1START - -UECapabilityInformation ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - ueCapabilityInformation-r8 UECapabilityInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UECapabilityInformation-r8-IEs ::= SEQUENCE { - ue-CapabilityRAT-ContainerList UE-CapabilityRAT-ContainerList, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -– ULHandoverPreparationTransfer (CDMA2000) -The ULHandoverPreparationTransfer message is used for the uplink transfer of handover related CDMA2000 information when requested by the higher layers. -Signalling radio bearer: SRB1 -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -ULHandoverPreparationTransfer message --- ASN1START - -ULHandoverPreparationTransfer ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - ulHandoverPreparationTransfer-r8 ULHandoverPreparationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -ULHandoverPreparationTransfer-r8-IEs ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - meid BIT STRING (SIZE (56)) OPTIONAL, - dedicatedInfo DedicatedInfoCDMA2000, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -ULHandoverPreparationTransfer field descriptions meid -The 56 bit mobile identification number provided by the CDMA2000 Upper layers. -– ULInformationTransfer -The ULInformationTransfer message is used for the uplink transfer of dedicated NAS information. -Signalling radio bearer: SRB2 or SRB1(only if SRB2 not established yet). If SRB2 is suspended, the UE does not send this message until SRB2 is resumed -RLC-SAP: AM -Logical channel: DCCH -Direction: UE to EUTRAN -ULInformationTransfer message --- ASN1START - -ULInformationTransfer ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - ulInformationTransfer-r8 ULInformationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -ULInformationTransfer-r8-IEs ::= SEQUENCE { - dedicatedInfoType CHOICE { - dedicatedInfoNAS DedicatedInfoNAS, - dedicatedInfoCDMA2000-1XRTT DedicatedInfoCDMA2000, - dedicatedInfoCDMA2000-HRPD DedicatedInfoCDMA2000 - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -6.3 RRC information elements -6.3.1 System information blocks -– SystemInformationBlockType2 -The IE SystemInformationBlockType2 contains radio resource configuration information that is common for all UEs. -NOTE: UE timers and constants related to functionality for which parameters are provided in another SIB are included in the corresponding SIB. -SystemInformationBlockType2 information element --- ASN1START - -SystemInformationBlockType2 ::= SEQUENCE { - ac-BarringInfo SEQUENCE { - ac-BarringForEmergency BOOLEAN, - ac-BarringForMO-Signalling AC-BarringConfig OPTIONAL, -- Need OP - ac-BarringForMO-Data AC-BarringConfig OPTIONAL -- Need OP - } OPTIONAL, -- Need OP - radioResourceConfigCommon RadioResourceConfigCommonSIB, - ue-TimersAndConstants UE-TimersAndConstants, - freqInfo SEQUENCE { - ul-CarrierFreq ARFCN-ValueEUTRA OPTIONAL, -- Need OP - ul-Bandwidth ENUMERATED {n6, n15, n25, n50, n75, n100} - OPTIONAL, -- Need OP - additionalSpectrumEmission AdditionalSpectrumEmission - }, - mbsfn-SubframeConfigList MBSFN-SubframeConfigList OPTIONAL, -- Need OR - timeAlignmentTimerCommon TimeAlignmentTimer, - ... -} - -AC-BarringConfig ::= SEQUENCE { - ac-BarringFactor ENUMERATED { - p00, p05, p10, p15, p20, p25, p30, p40, - p50, p60, p70, p75, p80, p85, p90, p95}, - ac-BarringTime ENUMERATED {s4, s8, s16, s32, s64, s128, s256, s512}, - ac-BarringForSpecialAC BIT STRING (SIZE(5)) -} - -MBSFN-SubframeConfigList ::= SEQUENCE (SIZE (1..maxMBSFN-Allocations)) OF MBSFN-SubframeConfig - -MBSFN-SubframeConfig ::= SEQUENCE { - radioframeAllocationPeriod ENUMERATED {n1, n2, n4, n8, n16, n32}, - radioframeAllocationOffset INTEGER (0..7), - subframeAllocation CHOICE { - oneFrame BIT STRING (SIZE(6)), - fourFrames BIT STRING (SIZE(24)) - } -} --- ASN1STOP - -SystemInformationBlockType2 field descriptions ac-BarringForEmergency -Access class barring for AC 10. ac-BarringForMO-Signalling -Access class barring for mobile originating signalling. ac-BarringForMO-Data -Access class barring for mobile originating calls. ac-BarringFactor -If the random number drawn by the UE is lower than this value, access is allowed. Otherwise the access is barred. The values are interpreted in the range [0,1): p00 = 0, p05 = 0.05, p10 = 0.10,…,p95 = 0.95. ac-BarringTime -Mean access barring time value in seconds. ac-BarringForSpecialAC -Access class barring for AC 11-15. The first/ leftmost bit is for AC 11, the second bit is for AC 12, and so on. ul-CarrierFreq -For FDD: If absent, the (default) value determined from the default TX-RX frequency separation defined in TS 36.101 [42, table 5.7.3-1] applies. -For TDD: This parameter is absent and it is equal to the downlink frequency. ul-Bandwidth -Parameter: transmission bandwidth configuration, NRB, in uplink, see TS 36.101 [42, table 5.6-1]. Value n6 corresponds to 6 resource blocks, n15 to 15 resource blocks and so on. If for FDD this parameter is absent, the uplink bandwidth is equal to the downlink bandwidth. For TDD this parameter is absent and it is equal to the downlink bandwidth. mbsfn-SubframeConfigList -Defines the subframes that are reserved for MBSFN in downlink. radioFrameAllocationPeriod, radioFrameAllocationOffset -Radio-frames that contain MBSFN subframes occur when equation SFN mod radioFrameAllocationPeriod = radioFrameAllocationOffset is satisfied. Value n1 for radioframeAllocationPeriod denotes value 1, n2 denotes value 2, and so on. When fourFrames is used for subframeAllocation, the equation defines the first radio frame referred to in the description below. Values n1 and n2 are not applicable when fourFrames is used. subframeAllocation -Defines the subframes that are allocated for MBSFN within the radio frame allocation period defined by the radioFrameAllocationPeriod and the radioFrameAllocationOffset. oneFrame -“1” denotes that the corresponding subframe is allocated for MBSFN. The following mapping applies: -FDD: The first/leftmost bit defines the MBSFN allocation for subframe #1, the second bit for #2, third bit for #3 , fourth bit for #6, fifth bit for #7, sixth bit for #8. -TDD: The first/leftmost bit defines the allocation for subframe #3, the second bit for #4, third bit for #7, fourth bit for #8, fifth bit for #9. Uplink subframes are not allocated. The last bit is not used. fourFrames -A bit-map indicating MBSFN subframe allocation in four consecutive radio frames, “1” denotes that the corresponding subframe is allocated for MBSFN. The bitmap is interpreted as follows: -FDD: Starting from the first radioframe and from the first/leftmost bit in the bitmap, the allocation applies to subframes #1, #2, #3 , #6, #7, and #8 in the sequence of the four radio-frames. -TDD: Starting from the first radioframe and from the first/leftmost bit in the bitmap, the allocation applies to subframes #3, #4, #7, #8, and #9 in the sequence of the four radio-frames. The last four bits are not used. Uplink subframes are not allocated. -– SystemInformationBlockType3 -The IE SystemInformationBlockType3 contains cell re-selection information common for intra-frequency, inter-frequency and/ or inter-RAT cell re-selection (i.e. applicable for more than one type of cell re-selection but not necessarily all) as well as intra-frequency cell re-selection information other than neighbouring cell related. -SystemInformationBlockType3 information element --- ASN1START - -SystemInformationBlockType3 ::= SEQUENCE { - cellReselectionInfoCommon SEQUENCE { - q-Hyst ENUMERATED { - dB0, dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10, - dB12, dB14, dB16, dB18, dB20, dB22, dB24}, - speedStateReselectionPars SEQUENCE { - mobilityStateParameters MobilityStateParameters, - q-HystSF SEQUENCE { - sf-Medium ENUMERATED { - dB-6, dB-4, dB-2, dB0}, - sf-High ENUMERATED { - dB-6, dB-4, dB-2, dB0} - } - } OPTIONAL -- Need OP - }, - cellReselectionServingFreqInfo SEQUENCE { - s-NonIntraSearch ReselectionThreshold OPTIONAL, -- Need OP - threshServingLow ReselectionThreshold, - cellReselectionPriority CellReselectionPriority - }, - intraFreqCellReselectionInfo SEQUENCE { - q-RxLevMin Q-RxLevMin, - p-Max P-Max OPTIONAL, -- Need OP - s-IntraSearch ReselectionThreshold OPTIONAL, -- Need OP - allowedMeasBandwidth AllowedMeasBandwidth OPTIONAL, -- Need OP - presenceAntennaPort1 PresenceAntennaPort1, - neighCellConfig NeighCellConfig, - t-ReselectionEUTRA T-Reselection, - t-ReselectionEUTRA-SF SpeedStateScaleFactors OPTIONAL -- Need OP - }, - ... -} - --- ASN1STOP - -SystemInformationBlockType3 field descriptions cellReselectionInfoCommon -Cell re-selection information common for cells. q-Hyst -Parameter Qhyst in 36.304 [4], Value in dB. Value dB1 corresponds to 1 dB, dB2 corresponds to 2 dB and so on. speedStateReselectionPars -Speed dependent reselection parameters, see TS 36.304 [4]. If this field is absent, i.e, mobilityStateParameters is also not present, UE behaviour is specified in TS 36.304 [4]. q-HystSF -Parameter “Speed dependent ScalingFactor for Qhyst” in TS 36.304 [4]. The sf-Medium and sf-High concern the additional hysteresis to be applied, in Medium and High Mobility state respectively, to Qhyst as defined in TS 36.304 [4]. In dB. Value dB-6 corresponds to -6dB, dB-4 corresponds to -4dB and so on. t-ReselectionEUTRA -Parameter “TreselectionEUTRAN” in TS 36.304 [4]. t-ReselectionEUTRA-SF -Parameter “Speed dependent ScalingFactor for TreselectionEUTRAN” in TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. s-IntraSearch -Parameter Sintrasearch, see TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. cellReselectionServingFreqInfo -Information common for Cell re-selection to inter-frequency and inter-RAT cells. s-NonIntraSearch -Parameter Snonintrasearch, see TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. threshServingLow -Parameter Threshserving, low, see TS 36.304 [4]. intraFreqcellReselectionInfo -Cell re-selection information common for intra-frequency cells. p-Max -Value applicable for the intra-frequency neighbouring E-UTRA cells. allowedMeasBandwidth -If absent, the value corresponding to the downlink bandwidth indicated by the dl-Bandwidth included in MasterInformationBlock applies. -– SystemInformationBlockType4 -The IE SystemInformationBlockType4 contains neighbouring cell related information relevant only for intra-frequency cell re-selection. The IE includes cells with specific re-selection parameters as well as blacklisted cells. -SystemInformationBlockType4 information element --- ASN1START - -SystemInformationBlockType4 ::= SEQUENCE { - intraFreqNeighCellList IntraFreqNeighCellList OPTIONAL, -- Need OR - intraFreqBlackCellList IntraFreqBlackCellList OPTIONAL, -- Need OR - csg-PhysCellIdRange PhysCellIdRange OPTIONAL, -- Cond CSG - ... -} - -IntraFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellIntra)) OF IntraFreqNeighCellInfo - -IntraFreqNeighCellInfo ::= SEQUENCE { - physCellId PhysCellId, - q-OffsetCell Q-OffsetRange, - ... -} - -IntraFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PhysCellIdRange - --- ASN1STOP - -SystemInformationBlockType4 field descriptions intraFreqNeighbCellList -List of intra-frequency neighbouring cells with specific cell re-selection parameters. q-OffsetCell -Parameter “Qoffsets,n” in TS 36.304 [4]. intraFreqBlackCellList -List of blacklisted intra-frequency neighbouring cells. csg-PhysCellIdRange -Set of physical cell identities reserved for CSG cells on the frequency on which this field was received. The received csg-PhysCellIdRange applies if less than 24 hours has elapsed since it was received and it was received in the same primary PLMN. The 3 hour validity restriction (section 5.2.1.3) does not apply to this field. -Conditional presence Explanation CSG This field is optional, need OP, for non-CSG cells, and mandatory for CSG cells. -– SystemInformationBlockType5 -The IE SystemInformationBlockType5 contains information relevant only for inter-frequency cell re-selection i.e. information about other EUTRA frequencies and inter-frequency neighbouring cells relevant for cell re-selection. The IE includes cell re-selection parameters common for a frequency as well as cell specific re-selection parameters. -SystemInformationBlockType5 information element --- ASN1START - -SystemInformationBlockType5 ::= SEQUENCE { - interFreqCarrierFreqList InterFreqCarrierFreqList, - ... -} - -InterFreqCarrierFreqList ::= SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo - -InterFreqCarrierFreqInfo ::= SEQUENCE { - dl-CarrierFreq ARFCN-ValueEUTRA, - q-RxLevMin Q-RxLevMin, - p-Max P-Max OPTIONAL, -- Need OP - t-ReselectionEUTRA T-Reselection, - t-ReselectionEUTRA-SF SpeedStateScaleFactors OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - allowedMeasBandwidth AllowedMeasBandwidth, - presenceAntennaPort1 PresenceAntennaPort1, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - neighCellConfig NeighCellConfig, - q-OffsetFreq Q-OffsetRange DEFAULT dB0, - interFreqNeighCellList InterFreqNeighCellList OPTIONAL, -- Need OR - interFreqBlackCellList InterFreqBlackCellList OPTIONAL, -- Need OR - ... -} - -InterFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellInter)) OF InterFreqNeighCellInfo - -InterFreqNeighCellInfo ::= SEQUENCE { - physCellId PhysCellId, - q-OffsetCell Q-OffsetRange -} - -InterFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PhysCellIdRange - --- ASN1STOP - -SystemInformationBlockType5 field descriptions p-Max -Value applicable for the neighbouring E-UTRA cells on this carrier frequency. threshX-High -Parameter "Threshx,high", see TS 36.304 [4]. threshX-Low -Parameter "Threshx,low", see TS 36.304 [4]. t-ReselectionEUTRA -Parameter “TreselectionEUTRAN” in TS 36.304 [4]. t-ReselectionEUTRA-SF -Parameter “Speed dependent ScalingFactor for TreselectionEUTRAN” in TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. q-OffsetFreq -Parameter “Qoffsetfrequency” in TS 36.304 [4]. interFreqNeighCellList -List of inter-frequency neighbouring cells with specific cell re-selection parameters. q-OffsetCell -Parameter “Qoffsets,n” in TS 36.304 [4]. interFreqBlackCellList -List of blacklisted inter-frequency neighbouring cells. -– SystemInformationBlockType6 -The IE SystemInformationBlockType6 contains information relevant only for inter-RAT cell re-selection i.e. information about UTRA frequencies and UTRA neighbouring cells relevant for cell re-selection. The IE includes cell re-selection parameters common for a frequency. -SystemInformationBlockType6 information element --- ASN1START - -SystemInformationBlockType6 ::= SEQUENCE { - carrierFreqListUTRA-FDD CarrierFreqListUTRA-FDD OPTIONAL, -- Need OR - carrierFreqListUTRA-TDD CarrierFreqListUTRA-TDD OPTIONAL, -- Need OR - t-ReselectionUTRA T-Reselection, - t-ReselectionUTRA-SF SpeedStateScaleFactors OPTIONAL, -- Need OP - ... -} - -CarrierFreqListUTRA-FDD ::= SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF CarrierFreqUTRA-FDD - -CarrierFreqUTRA-FDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - q-RxLevMin INTEGER (-60..-13), - p-MaxUTRA INTEGER (-50..33), - q-QualMin INTEGER (-24..0), - ... -} - -CarrierFreqListUTRA-TDD ::= SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF CarrierFreqUTRA-TDD - -CarrierFreqUTRA-TDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - q-RxLevMin INTEGER (-60..-13), - p-MaxUTRA INTEGER (-50..33), - ... -} - --- ASN1STOP - -SystemInformationBlockType6 field descriptions t-ReselectionUTRA -Parameter “TreselectionUTRAN” in TS 36.304 [4]. t-ReselectionUTRA-SF -Parameter “Speed dependent ScalingFactor for TreselectionUTRA” in TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. carrierFreqListUTRA-FDD -List of carrier frequencies of UTRA FDD. carrierFreqListUTRA-TDD -List of carrier frequencies of UTRA TDD. threshX-High -Parameter "Threshx,high" in TS 36.304 [4]. threshX-Low - Parameter "Threshx,low" in TS 36.304 [4]. q-RxLevMin -Parameter Qrxlevmin, see TS 25.304 [40]. Actual value = IE value * 2+1. Specifies the minimum required Rx level in the cell expressedin dBm. p-MaxUTRA -The maximum allowed transmission power on the (uplink) carrier frequency, see TS 25.304 [40]. In dBm q-QualMin -Parameter “Qqualmin” in TS 25.304 [40]. In dB. -– SystemInformationBlockType7 -The IE SystemInformationBlockType7 contains information relevant only for inter-RAT cell re-selection i.e. information about GERAN frequencies relevant for cell re-selection. The IE includes cell re-selection parameters for each frequency. -SystemInformationBlockType7 information element --- ASN1START - -SystemInformationBlockType7 ::= SEQUENCE { - t-ReselectionGERAN T-Reselection, - t-ReselectionGERAN-SF SpeedStateScaleFactors OPTIONAL, -- Need OR - carrierFreqsInfoList CarrierFreqsInfoListGERAN OPTIONAL, -- Need OR - ... -} - -CarrierFreqsInfoListGERAN ::= SEQUENCE (SIZE (1..maxGNFG)) OF CarrierFreqsInfoGERAN - -CarrierFreqsInfoGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - commonInfo SEQUENCE { - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - ncc-Permitted BIT STRING (SIZE (8)), - q-RxLevMin INTEGER (0..45), - p-MaxGERAN INTEGER (0..39) OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold - }, - ... -} - --- ASN1STOP - -SystemInformationBlockType7 field descriptions carrierFreqsInfoList -Provides a list of neighbouring GERAN carrier frequencies, which may be monitored for neighbouring GERAN cells. The GERAN carrier frequencies are organised in groups and the cell reselection parameters are provided per group of GERAN carrier frequencies. carrierFreqs -The list of GERAN carrier frequencies organised into one group of GERAN carrier frequencies. commonInfo -Defines the set of cell reselection parameters for the group of GERAN carrier frequencies. t-ReselectionGERAN -Parameter “TreselectionGERAN” in TS 36.304 [4]. t-ReselectionGERAN-SF -Parameter “Speed dependent ScalingFactor for TreselectionGERAN” in TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. ncc-Permitted -Field encoded as a bit map, where bit N is set to "0" if a BCCH carrier with NCC = N-1 is not permitted for monitoring and set to "1" if the BCCH carrier with NCC = N-1 is permitted for monitoring; N = 1 to 8; bit 1 of the bitmap is the leading bit of the bit string. q-RxLevMin -Parameter “Qrxlevmin” in TS 45.008 [28]. The actual value of Qrxlevmin in dBm = (IE value * 2) ? 115. p-MaxGERAN -Maximum allowed transmission power for GERAN on an uplink carrier frequency, see TS 45.008 [28]. Value in dBm. Applicable for the neighbouring GERAN cells on this carrier frequency. If pmaxGERAN is absent, the maximum power according to the UE capability is used. threshX-High -Parameter "Threshx,high" in TS 36.304 [4]. threshX-Low -Parameter "Threshx,low" in TS 36.304 [4]. -– SystemInformationBlockType8 -The IE SystemInformationBlockType8 contains information relevant only for inter-RAT cell re-selection i.e. information about CDMA2000 frequencies and CDMA2000 neighbouring cells relevant for cell re-selection. The IE includes cell re-selection parameters common for a frequency as well as cell specific re-selection parameters. -SystemInformationBlockType8 information element --- ASN1START - -SystemInformationBlockType8 ::= SEQUENCE { - systemTimeInfo SystemTimeInfoCDMA2000 OPTIONAL, -- Need OR - searchWindowSize INTEGER (0..15) OPTIONAL, -- Need OR - parametersHRPD SEQUENCE { - preRegistrationInfoHRPD PreRegistrationInfoHRPD, - cellReselectionParametersHRPD CellReselectionParametersCDMA2000 OPTIONAL -- Need OR - } OPTIONAL, -- Need OR - parameters1XRTT SEQUENCE { - csfb-RegistrationParam1XRTT CSFB-RegistrationParam1XRTT OPTIONAL, -- Need OP - longCodeState1XRTT BIT STRING (SIZE (42)) OPTIONAL, -- Need OR - cellReselectionParameters1XRTT CellReselectionParametersCDMA2000 OPTIONAL -- Need OR - } OPTIONAL, -- Need OR - ... -} - -CellReselectionParametersCDMA2000 ::= SEQUENCE { - bandClassList BandClassListCDMA2000, - neighCellList NeighCellListCDMA2000, - t-ReselectionCDMA2000 T-Reselection, - t-ReselectionCDMA2000-SF SpeedStateScaleFactors OPTIONAL -- Need OP -} -NeighCellListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF NeighCellCDMA2000 - -NeighCellCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - neighCellsPerFreqList NeighCellsPerBandclassListCDMA2000 -} - -NeighCellsPerBandclassListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF NeighCellsPerBandclassCDMA2000 - -NeighCellsPerBandclassCDMA2000 ::= SEQUENCE { - arfcn ARFCN-ValueCDMA2000, - physCellIdList PhysCellIdListCDMA2000 -} - -PhysCellIdListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF PhysCellIdCDMA2000 - -BandClassListCDMA2000 ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassInfoCDMA2000 - -BandClassInfoCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High INTEGER (0..63), - threshX-Low INTEGER (0..63), - ... -} - --- ASN1STOP - -SystemInformationBlockType8 field descriptions systemTimeInfo -Information on CDMA2000 system time. This field is required for a UE with rx-ConfigHRPD= `single' and/ or rx-Config1XRTT= `single' to perform handover, cell re-selection and UE measurement based redirection from E-UTRAN to CDMA2000 according to this specification and TS 36.304 [4]. This field is excluded when estimating changes in system information, i.e. changes of systemTimeInfo should neither result in system information change notifications nor in a modification of systemInfoValueTag in SIB1. searchWindowSize -The search window size is a CDMA2000 parameter to be used to assist in searching for the neighbouring pilots. For values see C.S0005-A [25, Table 2.6.6.2.1-1] and C.S0024-A [26, Table 8.7.6.2-4]. This field is required for a UE with rx-ConfigHRPD= `single' and/ or rx-Config1XRTT= `single' to perform handover, cell re-selection and UE measurement based redirection from E-UTRAN to CDMA2000 according to this specification and TS 36.304 [4]. parametersHRPD -Parameters applicable only for interworking with CDMA2000 HRPD systems. preRegistrationInfoHRPD -The CDMA2000 HRPD Pre-Registration Information tells the UE if it should pre-register with the CDMA2000 HRPD network and identifies the Pre-registration zone to the UE. cellReselectionParametersHRPD -Cell reselection parameters applicable for cell reselection to CDMA2000 HRPD system bandClassList -List of CDMA2000 frequency bands. bandClass -Identifies the Frequency Band in which the Carrier can be found. Details can be found in C.S0057-B [24, Table 1.5]. threshX-High -Parameter "Threshx,high" in TS 36.304 [4]. This specifies the high threshold used in reselection towards this CDMA2000 band class expressed as an unsigned binary number equal to FLOOR (-2 x 10 x log10 Ec/Io) in units of 0.5 dB, as defined in C.S0005-A [25]. threshX-Low -Parameter "Threshx,low" in TS 36.304 [4]. This specifies the low threshold used in reselection towards this CDMA2000 band class expressed as an unsigned binary number equal to FLOOR (-2 x 10 x log10 Ec/Io) in units of 0.5 dB, as defined in C.S0005-A [25]. t-ReselectionCDMA2000 -Parameter “TreselectionCDMA_HRPD” or “TreselectionCDMA_1xRTT” in TS 36.304 [4]. t-ReselectionCDMA2000-SF -Parameter “Speed dependent ScalingFactor for TreselectionCDMA-HRPD” or TreselectionCDMA-1xRTT” in TS 36.304 [4]. If the field is not present, the UE behaviour is specified in TS 36.304 [4]. neighCellList -List of CDMA2000 neighbouring cells. The total number of neighbouring cells is limited to 32. parameters1XRTT -Parameters applicable for interworking with CDMA2000 1XRTT system. csfb-RegistrationParam1XRTT -Contains the parameters the UE will use to determine if it should perform a CDMA2000 1xRTT Registration/Re-Registration. This field is included if CSFB to CDMA2000 1xRTT is supported. longCodeState1XRTT -The state of long code generation registers in CDMA2000 1XRTT system as defined in C.S0002-A [12, Section 1.3] at ms, where t equals to the cdma-SystemTime. This field is required for SRVCC handover to CDMA2000 1xRTT operation. Otherwise this IE is not needed. This field is excluded when estimating changes in system information, i.e. changes of longCodeState1XRTT should neither result in system information change notifications nor in a modification of systemInfoValueTag in SIB1. cellReselectionParameters1XRTT -Cell reselection parameters applicable only to CDMA2000 1xRTT system. NeighCellListCDMA2000 -List of CDMA2000 1xRTT or of CDMA2000 HRPD neighbouring cells. neighCellsPerFreqList -List of carrier frequencies and neighbour cell ids in each frequency within a CDMA2000 Band, see C.S0002-A [12]. physCellIdList -Identifies the list of CDMA2000 cells ids, see C.S0002-A [12]. -– SystemInformationBlockType9 -The IE SystemInformationBlockType9 contains a home eNB name (HNB Name). -SystemInformationBlockType9 information element --- ASN1START - -SystemInformationBlockType9 ::= SEQUENCE { - hnb-Name OCTET STRING (SIZE(1..48)) OPTIONAL, -- Need OR - ... -} - --- ASN1STOP - -SystemInformationBlockType9 field descriptions hnb-Name -Carries the name of the home eNB, coded in UTF-8 with variable number of bytes per character, see TS 22.011 [10]. -– SystemInformationBlockType10 -The IE SystemInformationBlockType10 contains an ETWS primary notification. -SystemInformationBlockType10 information element --- ASN1START - -SystemInformationBlockType10 ::= SEQUENCE { - messageIdentifier BIT STRING (SIZE (16)), - serialNumber BIT STRING (SIZE (16)), - warningType OCTET STRING (SIZE (2)), - warningSecurityInfo OCTET STRING (SIZE (50)) OPTIONAL, -- Need OP - ... -} - --- ASN1STOP - - -SystemInformationBlockType10 field descriptions messageIdentifier -Identifies the source and type of ETWS notification. The first bit contains bit 1 of the equivalent IE defined in TS 23.041 [37, 9.4.1.2.2], TS 36.413 [39, 9.2.1.44] and encoded according to TS 23.041 [37] and so on. serialNumber -Identifies variations of an ETWS notification. The first bit contains bit 1 of the equivalent IE defined in TS 23.041 [37, 9.4.1.2.1], TS 36.413 [39, 9.2.1.45] and encoded according to TS 23.041 [37] and so on. warningType -Identifies the warning type of the ETWS primary notification and provides information on emergency user alert and UE popup. The first octet contains octet 1 of the equivalent IE defined in TS 23.041 [37, 9.3.24], TS 36.413 [39, 9.2.1.50] and encoded according to TS 23.041 [37], and so on. warningSecurityInfo -Provides security information for the ETWS notification. The first octet contains octet 1 of the equivalent IE defined in TS 23.041 [37], TS 36.413 [39] and encoded according to TS 23.041 [37] and so on. -– SystemInformationBlockType11 -The IE SystemInformationBlockType11 contains an ETWS secondary notification. -SystemInformationBlockType11 information element --- ASN1START - -SystemInformationBlockType11 ::= SEQUENCE { - messageIdentifier BIT STRING (SIZE (16)), - serialNumber BIT STRING (SIZE (16)), - warningMessageSegmentType ENUMERATED {notLastSegment, lastSegment}, - warningMessageSegmentNumber INTEGER (0..63), - warningMessageSegment OCTET STRING, - dataCodingScheme OCTET STRING (SIZE (1)) OPTIONAL, -- Cond Segment1 - ... -} - --- ASN1STOP - -SystemInformationBlockType11 field descriptions messageIdentifier -Identifies the source and type of ETWS notification. The first bit contains bit 1 of the equivalent IE defined in TS 23.041 [37, 9.4.1.2.2], TS 36.413 [39, 9.2.1.44] and encoded according to TS 23.041 [37] and so on. serialNumber -Identifies variations of an ETWS notification. The first bit contains bit 1 of the equivalent IE defined in TS 23.041 [37, 9.4.1.2.1], TS 36.413 [39, 9.2.1.45] and encoded according to TS 23.041 [37] and so on. warningMessageSegmentType -Indicates whether the included ETWS warning message segment is the last segment or not. warningMessageSegmentNumber -Segment number of the ETWS warning message segment contained in the SIB. A segment number of zero corresponds to the first segment, one corresponds to the second segment, and so on. warningMessageSegment -Carries a segment of the Warning Message Contents IE defined in TS 36.413 [39]. The first octet of the Warning Message Contents IE is equivalent to the CB data IE defined in and encoded according to TS 23.041 [37] and so on. dataCodingScheme -Identifies the alphabet/coding and the language applied variations of an ETWS notification. The octet contains the octet of the equivalent IE defined in TS 23.041 [37], TS 36.413 [39] and encoded according to TS 23.038 [38]. -Conditional presence Explanation Segment1 The field is mandatory present in the first segment of SIB11, otherwise it is not present. -6.3.2 Radio resource control information elements -– AntennaInfo -The IE AntennaInfoCommon and the AntennaInfoDedicated are used to specify the common and the UE specific antenna configuration respectively. -AntennaInfo information elements --- ASN1START - -AntennaInfoCommon ::= SEQUENCE { - antennaPortsCount ENUMERATED {an1, an2, an4, spare1} -} - -AntennaInfoDedicated ::= SEQUENCE { - transmissionMode ENUMERATED { - tm1, tm2, tm3, tm4, tm5, tm6, - tm7, spare1}, - codebookSubsetRestriction CHOICE { - n2TxAntenna-tm3 BIT STRING (SIZE (2)), - n4TxAntenna-tm3 BIT STRING (SIZE (4)), - n2TxAntenna-tm4 BIT STRING (SIZE (6)), - n4TxAntenna-tm4 BIT STRING (SIZE (64)), - n2TxAntenna-tm5 BIT STRING (SIZE (4)), - n4TxAntenna-tm5 BIT STRING (SIZE (16)), - n2TxAntenna-tm6 BIT STRING (SIZE (4)), - n4TxAntenna-tm6 BIT STRING (SIZE (16)) - } OPTIONAL, -- Cond TM - ue-TransmitAntennaSelection CHOICE{ - release NULL, - setup ENUMERATED {closedLoop, openLoop} - } -} - --- ASN1STOP - -AntennaInfo field descriptions antennaPortsCount -Parameter represents the number of cell specific antenna ports where an1 corresponds to 1, an2 to 2 antenna ports etc. see TS 36.211, 6.2.1. transmissionMode -Points to one of Transmission modes defined in TS 36.213, 7.1 where tm1 refers to transmission mode 1, tm2 to transmission mode 2 etc. codebookSubsetRestriction -Parameter: codebookSubsetRestriction, see TS 36.213 [23, 7.2] and TS 36.211 [21, 6.3.4.2.3]. ue-TransmitAntennaSelection -For value setup the field indicates whether UE transmit antenna selection control is closed-loop or open-loop as described in TS 36.213 [23, 8.7]. -Conditional presence Explanation TM The field is mandatory present if the transmissionMode is set to tm3, tm4, tm5 or tm6. Otherwise the IE is not present and the UE shall delete any existing value for this field. -– CQI-ReportConfig -The IE CQI-ReportConfig is used to specify the CQI reporting configuration. -CQI-ReportConfig information elements --- ASN1START - -CQI-ReportConfig ::= SEQUENCE { - cqi-ReportModeAperiodic ENUMERATED { - rm12, rm20, rm22, rm30, rm31, - spare3, spare2, spare1} OPTIONAL, -- Need OR - nomPDSCH-RS-EPRE-Offset INTEGER (-1..6), - cqi-ReportPeriodic CQI-ReportPeriodic OPTIONAL -- Need ON -} - -CQI-ReportPeriodic ::= CHOICE { - release NULL, - setup SEQUENCE { - cqi-PUCCH-ResourceIndex INTEGER (0.. 1185), - cqi-pmi-ConfigIndex INTEGER (0..1023), - cqi-FormatIndicatorPeriodic CHOICE { - widebandCQI NULL, - subbandCQI SEQUENCE { - k INTEGER (1..4) - } - }, - ri-ConfigIndex INTEGER (0..1023) OPTIONAL, -- Need OR - simultaneousAckNackAndCQI BOOLEAN - } -} - --- ASN1STOP - -CQI-ReportConfig field descriptions cqi-PUCCH-ResourceIndex -Parameter , see TS 36.213 [23, 7.2]. cqi-pmi-ConfigIndex -Parameter: CQI/PMI Periodicity and Offset Configuration Index ICQI/PMI, see TS 36.213 [23, tables 7.2.2-1A and 7.2.2-1C]. ri-ConfigIndex -Parameter: RI Config Index IRI, see TS 36.213 [23, 7.2.2-1B]. K -Parameter: K, see TS 36.213 [23, 7.2.2]. cqi-FormatIndicatorPeriodic -Parameter: PUCCH CQI Feedback Type, see TS 36.213 [23, table 7.2.2-1]. Depending on transmissionMode, reporting mode is implicitly given from the table. simultaneousAckNackAndCQI -Parameter: Simultaneous-AN-and-CQI. see TS 36.213 [23, 10.1] TRUE indicates that simultaneous transmission of ACK/NACK and CQI is allowed. cqi-ReportModeAperiodic -Parameter: reporting mode. Value rm12 corresponds to Mode 1-2, rm20 corresponds to Mode 2-0, rm22 corresponds to Mode 2-2 etc. PUSCH reporting modes are described in TS 36.213 [23, 7.2.1]. nomPDSCH-RS-EPRE-Offset -Parameter: see TS 36.213 [23, 7.2.3]. Actual value = IE value * 2 [dB]. -– DRB-Identity -The IE DRB-Identity is used to identify a DRB used by a UE. -DRB-Identity information elements --- ASN1START - -DRB-Identity ::= INTEGER (1..32) - --- ASN1STOP - -– LogicalChannelConfig -The IE LogicalChannelConfig is used to configure the logical channel parameters. -LogicalChannelConfig information element --- ASN1START - -LogicalChannelConfig ::= SEQUENCE { - ul-SpecificParameters SEQUENCE { - priority INTEGER (1..16), - prioritisedBitRate ENUMERATED { - kBps0, kBps8, kBps16, kBps32, kBps64, kBps128, - kBps256, infinity, spare8, spare7, spare6, - spare5, spare4, spare3, spare2, spare1}, - bucketSizeDuration ENUMERATED { - ms50, ms100, ms150, ms300, ms500, ms1000, spare2, - spare1}, - logicalChannelGroup INTEGER (0..3) OPTIONAL -- Need OR - } OPTIONAL, -- Cond UL - ... -} - --- ASN1STOP - -LogicalChannelConfig field descriptions priority -Logical channel priority in TS 36.321 [6]. Value is an integer. prioritisedBitRate -Prioritized Bit Rate for logical channel prioritization in TS 36.321 [6]. Value in kilobytes/second. Value kBps0 corresponds to 0 kB/second, kBps8 corresponds to 8 kB/second, kBps16 corresponds to 16 kB/second and so on. Infinity is the only applicable value for SRB1 and SRB2 bucketSizeDuration -Bucket Size Duration for logical channel prioritization in TS 36.321 [6]. Value in milliseconds. Value ms50 corresponds to 50 ms, ms100 corresponds to 100 ms and so on. logicalChannelGroup -Mapping of logical channel to logical channel group for BSR reporting in TS 36.321 [6]. -Conditional presence Explanation UL The field is mandatory present for UL logical channels; otherwise it is not present. -– MAC-MainConfig -The IE MAC-MainConfig is used to specify the MAC main configuration for signalling and data radio bearers. -MAC-MainConfig information element --- ASN1START - -MAC-MainConfig ::= SEQUENCE { - ul-SCH-Config SEQUENCE { - maxHARQ-Tx ENUMERATED { - n1, n2, n3, n4, n5, n6, n7, n8, - n10, n12, n16, n20, n24, n28, - spare2, spare1} OPTIONAL, -- Need ON - periodicBSR-Timer ENUMERATED { - sf5, sf10, sf16, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, sf1280, sf2560, - infinity, spare1} OPTIONAL, -- Need ON - retxBSR-Timer ENUMERATED { - sf320, sf640, sf1280, sf2560, sf5120, - sf10240, spare2, spare1}, - ttiBundling BOOLEAN - } OPTIONAL, -- Need ON - drx-Config DRX-Config OPTIONAL, -- Need ON - timeAlignmentTimerDedicated TimeAlignmentTimer, - phr-Config CHOICE { - release NULL, - setup SEQUENCE { - periodicPHR-Timer ENUMERATED {sf10, sf20, sf50, sf100, sf200, - sf500, sf1000, infinity}, - prohibitPHR-Timer ENUMERATED {sf0, sf10, sf20, sf50, sf100, - sf200, sf500, sf1000}, - dl-PathlossChange ENUMERATED {dB1, dB3, dB6, infinity} - } - } OPTIONAL, -- Need ON - ... -} - -DRX-Config ::= CHOICE { - release NULL, - setup SEQUENCE { - onDurationTimer ENUMERATED { - psf1, psf2, psf3, psf4, psf5, psf6, - psf8, psf10, psf20, psf30, psf40, - psf50, psf60, psf80, psf100, - psf200}, - drx-InactivityTimer ENUMERATED { - psf1, psf2, psf3, psf4, psf5, psf6, - psf8, psf10, psf20, psf30, psf40, - psf50, psf60, psf80, psf100, - psf200, psf300, psf500, psf750, - psf1280, psf1920, psf2560, spare10, - spare9, spare8, spare7, spare6, - spare5, spare4, spare3, spare2, - spare1}, - drx-RetransmissionTimer ENUMERATED { - psf1, psf2, psf4, psf6, psf8, psf16, - psf24, psf33}, - longDRX-CycleStartOffset CHOICE { - sf10 INTEGER(0..9), - sf20 INTEGER(0..19), - sf32 INTEGER(0..31), - sf40 INTEGER(0..39), - sf64 INTEGER(0..63), - sf80 INTEGER(0..79), - sf128 INTEGER(0..127), - sf160 INTEGER(0..159), - sf256 INTEGER(0..255), - sf320 INTEGER(0..319), - sf512 INTEGER(0..511), - sf640 INTEGER(0..639), - sf1024 INTEGER(0..1023), - sf1280 INTEGER(0..1279), - sf2048 INTEGER(0..2047), - sf2560 INTEGER(0..2559) - }, - shortDRX SEQUENCE { - shortDRX-Cycle ENUMERATED { - sf2, sf5, sf8, sf10, sf16, sf20, - sf32, sf40, sf64, sf80, sf128, sf160, - sf256, sf320, sf512, sf640}, - drxShortCycleTimer INTEGER (1..16) - } OPTIONAL -- Need OR - } -} - --- ASN1STOP - -MAC-MainConfig field descriptions maxHARQ-Tx -Maximum number of transmissions for UL HARQ in TS 36.321 [6]. periodicBSR-Timer -Timer for BSR reporting in TS 36.321 [6]. Value in number of sub-frames. Value sf10 corresponds to 10 sub-frames, sf20 corresponds to 20 sub-frames and so on. retxBSR-Timer -Timer for BSR reporting in TS 36.321 [6]. Value in number of sub-frames. Value sf640 corresponds to 640 sub-frames, sf1280 corresponds to 1280 sub-frames and so on. ttiBundling -TRUE indicates that TTI bundling TS 36.321 [6] is enabled while FALSE indicates that TTI bundling is disabled. TTI bundling can be enabled for FDD and for TDD only for configurations 0, 1 and 6. For TDD, E-UTRAN does not simultaneously enable TTI bundling and semi-persistent scheduling in this release of specification. longDRX-CycleStartOffset -longDRX-Cycle and drxStartOffset in TS 36.321 [6]. The value of longDRX-Cycle is in number of sub-frames. Value sf10 corresponds to 10 sub-frames, sf20 corresponds to 20 sub-frames and so on. If shortDRX-Cycle is configured, the value of longDRX-Cycle shall be a multiple of the shortDRX-Cycle value. The value of drxStartOffset value is in number of sub-frames. In TDD, this can point to a DL or UL sub-frame. onDurationTimer -Timer for DRX in TS 36.321 [6]. Value in number of PDCCH sub-frames. Value psf1 corresponds to 1 PDCCH sub-frame, psf2 corresponds to 2 PDCCH sub-frames and so on. drx-InactivityTimer -Timer for DRX in TS 36.321 [6]. Value in number of PDCCH sub-frames. Value psf1 corresponds to 1 PDCCH sub-frame, psf2 corresponds to 2 PDCCH sub-frames and so on. drx-RetransmissionTimer -Timer for DRX in TS 36.321 [6]. Value in number of PDCCH sub-frames. Value psf1 corresponds to 1 PDCCH sub-frame, psf2 corresponds to 2 PDCCH sub-frames and so on. shortDRX-Cycle -Short DRX cycle in TS 36.321 [6]. Value in number of sub-frames. Value sf2 corresponds to 2 sub-frames, sf5 corresponds to 5 subframes and so on. drxShortCycleTimer -Timer for DRX in TS 36.321 [6]. Value in multiples of shortDRX-Cycle. A value of 1 corresponds to shortDRX-Cycle, a value of 2 corresponds to 2 * shortDRX-Cycle and so on. periodicPHR-Timer -Timer for PHR reporting in TS 36.321 [6]. Value in number of sub-frames. Value sf10 corresponds to 10 subframes, sf20 corresponds to 20 subframes and so on. prohibitPHR-Timer -Timer for PHR reporting in TS 36.321 [6]. Value in number of sub-frames. Value sf0 corresponds to 0 subframes, sf100 corresponds to 100 subframes and so on. dl-PathlossChange -DL Pathloss Change for PHR reporting in TS 36.321 [6]. Value in dB. Value dB1 corresponds to 1 dB, dB3 corresponds to 3 dB and so on. -– PDCP-Config -The IE PDCP-Config is used to set the configurable PDCP parameters for data radio bearers. -PDCP-Config information element --- ASN1START - -PDCP-Config ::= SEQUENCE { - discardTimer ENUMERATED { - ms50, ms100, ms150, ms300, ms500, - ms750, ms1500, infinity - } OPTIONAL, -- Cond Setup - rlc-AM SEQUENCE { - statusReportRequired BOOLEAN - } OPTIONAL, -- Cond Rlc-AM - rlc-UM SEQUENCE { - pdcp-SN-Size ENUMERATED {len7bits, len12bits} - } OPTIONAL, -- Cond Rlc-UM - headerCompression CHOICE { - notUsed NULL, - rohc SEQUENCE { - maxCID INTEGER (1..16383) DEFAULT 15, - profiles SEQUENCE { - profile0x0001 BOOLEAN, - profile0x0002 BOOLEAN, - profile0x0003 BOOLEAN, - profile0x0004 BOOLEAN, - profile0x0006 BOOLEAN, - profile0x0101 BOOLEAN, - profile0x0102 BOOLEAN, - profile0x0103 BOOLEAN, - profile0x0104 BOOLEAN - }, - ... - } - }, - ... -} - --- ASN1STOP - -PDCP-Config field descriptions discardTimer -Indicates the discard timer value specified in TS 36.323 [8]. Value in milliseconds. Value ms50 means 50 ms, ms100 means 100 ms and so on. statusReportRequired -Indicates whether or not the UE shall send a PDCP Status Report upon re-establishment of the PDCP entity as specified in TS 36.323 [8]. pdcp-SN-Size -Indicates the PDCP Sequence Number length in bits. Value len7bits means that the 7-bit PDCP SN format is used and len12bits means that the 12-bit PDCP SN format is used, as specified in TS 36.323 [8]. maxCID -Indicates the value of the MAX_CID parameter as specified in TS 36.323 [8]. profiles -The profiles used by both compressor and decompressor in both UE and E-UTRAN. The field indicates which of the ROHC profiles specified in TS 36.323 [8] are supported, i.e. value 'true' indicates that the profile is supported. Profile 0x0000 shall always be supported when the use of ROHC is configured. If support of two ROHC profile identifiers with the same 8 LSB’s is signalled, only the profile corresponding to the highest value shall be applied. -Conditional presence Explanation Setup The field is mandatory present in case of radio bearer setup. Otherwise the field is not present. Rlc-AM The field is mandatory present upon setup of a PDCP entity for a radio bearer configured with RLC AM. The field is optional, need ON, in case of reconfiguration of a PDCP entity at handover for a radio bearer configured with RLC AM. Otherwise the field is not present. Rlc-UM The field is mandatory present upon setup of a PDCP entity for a radio bearer configured with RLC UM. Otherwise the field is not present. -– PDSCH-Config -The IE PDSCH-ConfigCommon and the IE PDSCH-ConfigDedicated are used to specify the common and the UE specific PDSCH configuration respectively. -PDSCH-Config information element --- ASN1START - -PDSCH-ConfigCommon::= SEQUENCE { - referenceSignalPower INTEGER (-60..50), - p-b INTEGER (0..3) -} - -PDSCH-ConfigDedicated::= SEQUENCE { - p-a ENUMERATED { - dB-6, dB-4dot77, dB-3, dB-1dot77, - dB0, dB1, dB2, dB3 } -} - --- ASN1STOP - -PDSCH-Config field descriptions referenceSignalPower -Parameter: Reference-signal power, which provides the downlink reference-signal EPRE, see TS 36.213 [23, 5.2]. The actual value in dBm. p-a -Parameter: , see TS 36.213 [23, 5.2]. Value dB-6 corresponds to -6 dB, dB-4dot77 corresponds to -4.77 dB etc. p-b -Parameter: , see TS 36.213 [23, Table 5.2-1]. -– PHICH-Config -The IE PHICH-Config is used to specify the PHICH configuration. -PHICH-Config information element --- ASN1START - -PHICH-Config ::= SEQUENCE { - phich-Duration ENUMERATED {normal, extended}, - phich-Resource ENUMERATED {oneSixth, half, one, two} -} - --- ASN1STOP - -PHICH-Config field descriptions phich-Duration -Parameter: PHICH-Duration, see TS 36.211 [21, Table 6.9.3-1]. phich-Resource -Parameter: Ng, see TS 36.211 [21, 6.9]. Value oneSixth corresponds to 1/6, half corresponds to 1/2 and so on. -– PhysicalConfigDedicated -The IE PhysicalConfigDedicated is used to specify the UE specific physical channel configuration. -PhysicalConfigDedicated information element --- ASN1START - -PhysicalConfigDedicated ::= SEQUENCE { - pdsch-ConfigDedicated PDSCH-ConfigDedicated OPTIONAL, -- Need ON - pucch-ConfigDedicated PUCCH-ConfigDedicated OPTIONAL, -- Need ON - pusch-ConfigDedicated PUSCH-ConfigDedicated OPTIONAL, -- Need ON - uplinkPowerControlDedicated UplinkPowerControlDedicated OPTIONAL, -- Need ON - tpc-PDCCH-ConfigPUCCH TPC-PDCCH-Config OPTIONAL, -- Need ON - tpc-PDCCH-ConfigPUSCH TPC-PDCCH-Config OPTIONAL, -- Need ON - cqi-ReportConfig CQI-ReportConfig OPTIONAL, -- Need ON - soundingRS-UL-ConfigDedicated SoundingRS-UL-ConfigDedicated OPTIONAL, -- Need ON - antennaInfo CHOICE { - explicitValue AntennaInfoDedicated, - defaultValue NULL - } OPTIONAL, -- Need ON - schedulingRequestConfig SchedulingRequestConfig OPTIONAL, -- Need ON - ... -} - --- ASN1STOP - -PhysicalConfigDedicated field descriptions antennaInfo -A choice is used to indicate whether the antennaInfo is signalled explicitly or set to the default antenna configuration as specified in section 9.2.4. tpc-PDCCH-ConfigPUCCH -PDCCH configuration for power control of PUCCH using format 3/3A, see TS 36.212 [22]. tpc-PDCCH-ConfigPUSCH -PDCCH configuration for power control of PUSCH using format 3/3A, see TS 36.212 [22]. -– P-Max -The IE P-Max is used to limit the UE’s uplink transmission power on a carrier frequency and is used to calculate the parameter Pcompensation defined in TS 36.304 [4]. Corresponds to parameter PEMAX in TS 36.101 [42]. The UE transmit power shall not exceed the minimum of this value (in dBm), if provided, and the maximum UE power for the UE power class, PUMAX, as specified in TS 36.101 [42, 6.2.5]. -P-Max information element --- ASN1START - -P-Max ::= INTEGER (-30..33) - --- ASN1STOP - -– PRACH-Config -The IE PRACH-ConfigSIB and IE PRACH-Config are used to specify the PRACH configuration in the system information and in the mobility control information, respectively. -PRACH-Config information elements --- ASN1START - -PRACH-ConfigSIB ::= SEQUENCE { - rootSequenceIndex INTEGER (0..837), - prach-ConfigInfo PRACH-ConfigInfo -} - -PRACH-Config ::= SEQUENCE { - rootSequenceIndex INTEGER (0..837), - prach-ConfigInfo PRACH-ConfigInfo OPTIONAL -- Need ON -} - -PRACH-ConfigInfo ::= SEQUENCE { - prach-ConfigIndex INTEGER (0..63), - highSpeedFlag BOOLEAN, - zeroCorrelationZoneConfig INTEGER (0..15), - prach-FreqOffset INTEGER (0..94) -} - --- ASN1STOP - -PRACH-Config field descriptions rootSequenceIndex -Parameter: RACH_ROOT_SEQUENCE, see TS 36.211 [21, 5.7.1]. prach-ConfigIndex -Parameter: prach-ConfigurationIndex, see TS 36.211 [21, 5.7.1]. highSpeedFlag -Parameter: High-speed-flag, see TS 36.211, [21, 5.7.2].TRUE corresponds to Restricted set and FALSE to Unrestricted set. zeroCorrelationZoneConfig -Parameter: NCS configuration, see TS 36.211, [21, 5.7.2: table 5.7.2-2] for preamble format 0..3 and TS 36.211, [21, 5.7.2: table 5.7.2-3] for preamble format 4. prach-FreqOffset -Parameter: prach-FrequencyOffset, see TS 36.211, [21, 5.7.1]. For TDD the value range is dependent on the value of prach-ConfigIndex. -– PresenceAntennaPort1 -The IE PresenceAntennaPort1 is used to indicate whether all the neighbouring cells use Antenna Port 1. When set to TRUE, the UE may assume that at least two cell-specific antenna ports are used in all neighbouring cells. -PresenceAntennaPort1 information element --- ASN1START - -PresenceAntennaPort1 ::= BOOLEAN - --- ASN1STOP - -– PUCCH-Config -The IE PUCCH-ConfigCommon and IE PUCCH-ConfigDedicated are used to specify the common and the UE specific PUCCH configuration respectively. -PUCCH-Config information elements --- ASN1START - -PUCCH-ConfigCommon ::= SEQUENCE { - deltaPUCCH-Shift ENUMERATED {ds1, ds2, ds3}, - nRB-CQI INTEGER (0..98), - nCS-AN INTEGER (0..7), - n1PUCCH-AN INTEGER (0..2047) -} - -PUCCH-ConfigDedicated ::= SEQUENCE { - ackNackRepetition CHOICE{ - release NULL, - setup SEQUENCE { - repetitionFactor ENUMERATED { n2, n4, n6, spare1}, - n1PUCCH-AN-Rep INTEGER (0..2047) - } - }, - tdd-AckNackFeedbackMode ENUMERATED {bundling, multiplexing} OPTIONAL -- Cond TDD -} - --- ASN1STOP - -PUCCH-Config field descriptions deltaPUCCH-Shift -Parameter: , see 36.211, 5.4.1, where ds1 corresponds to value 1 ds2 to 2 etc. nRB-CQI -Parameter: , see TS 36.211 [21, 5.4]. nCS-An -Parameter: see TS 36.211 [21, 5.4]. n1Pucch-AN -Parameter: see TS 36.213 [23, 10.1]. ackNackRepetition -Parameter indicates whether ACK/NACK repetition is configured, see TS 36.213 [23, 10.1]. repetitionFactor -Parameter see TS 36.213 [23, 10.1] where n2 corresponds to repetition factor 2, n4 to 4. n1Pucch-AN-Rep -Parameter: see TS 36.213 [23, 10.1]. tdd-AckNackFeedbackMode -Parameter indicates one of the two TDD ACK/NACK feedback modes used, see TS 36.213 [23, 7.3]. bundling corresponds to use of ACK/NACK bundling whereas, multiplexing corresponds to ACK/NACK multiplexing. -The same value applies to both ACK/NACK feedback modes on PUCCH as well as on PUSCH. For TDD configuration 5, E-UTRAN should always set this field to bundling. -Conditional presence Explanation TDD The field is mandatory present for TDD; it is not present for FDD and the UE shall delete any existing value for this field. -– PUSCH-Config -The IE PUSCH-ConfigCommon is used to specify the common PUSCH configuration and the reference signal configuration for PUSCH and PUCCH. The IE PUSCH-ConfigDedicated is used to specify the UE specific PUSCH configuration. -PUSCH-Config information element --- ASN1START - -PUSCH-ConfigCommon ::= SEQUENCE { - pusch-ConfigBasic SEQUENCE { - n-SB INTEGER (1..4), - hoppingMode ENUMERATED {interSubFrame, intraAndInterSubFrame}, - pusch-HoppingOffset INTEGER (0..98), - enable64QAM BOOLEAN - }, - ul-ReferenceSignalsPUSCH UL-ReferenceSignalsPUSCH -} - -PUSCH-ConfigDedicated ::= SEQUENCE { - betaOffset-ACK-Index INTEGER (0..15), - betaOffset-RI-Index INTEGER (0..15), - betaOffset-CQI-Index INTEGER (0..15) -} - -UL-ReferenceSignalsPUSCH ::= SEQUENCE { - groupHoppingEnabled BOOLEAN, - groupAssignmentPUSCH INTEGER (0..29), - sequenceHoppingEnabled BOOLEAN, - cyclicShift INTEGER (0..7) -} - --- ASN1STOP - -PUSCH-Config field descriptions n-SB -Parameter: Nsb see TS 36.211 [21, 5.3.4]. hoppingMode -Parameter: Hopping-mode, see TS 36.211 [21, 5.3.4]. pusch-hoppingOffset -Parameter: , see TS 36.211 [21, 5.3.4]. enable64QAM -See TS 36.213 [23, 8.6.1]. TRUE indicates that 64QAM is allowed while FALSE indicates that 64QAM is not allowed. betaOffset-ACK-Index -Parameter: , see TS 36.213 [23, Table 8.6.3-1]. betaOffset-RI-Index -Parameter: , see TS 36.213 [23, Table 8.6.3-2]. betaOffset-CQI-Index -Parameter: , see TS 36.213 [23, Table 8.6.3-3]. ul- ReferenceSignalsPUSCH -Used to specify parameters needed for the transmission on PUSCH (or PUCCH). groupHoppingEnabled -Parameter: Group-hopping-enabled, see TS 36.211 [21, 5.5.1.3]. groupAssignmentPUSCH -Parameter: ?SS See TS 36.211 [21, 5.5.1.3]. sequenceHoppingEnabled -Parameter: Sequence-hopping-enabled, see TS 36.211 [21, 5.5.1.4]. cyclicShift -Parameters: cyclicShift, see TS 36.211 [21, Table 5.5.2.1.1-2]. -– RACH-ConfigCommon -The IE RACH-ConfigCommon is used to specify the generic random access parameters. -RACH-ConfigCommon information element --- ASN1START - -RACH-ConfigCommon ::= SEQUENCE { - preambleInfo SEQUENCE { - numberOfRA-Preambles ENUMERATED { - n4, n8, n12, n16 ,n20, n24, n28, - n32, n36, n40, n44, n48, n52, n56, - n60, n64}, - preamblesGroupAConfig SEQUENCE { - sizeOfRA-PreamblesGroupA ENUMERATED { - n4, n8, n12, n16 ,n20, n24, n28, - n32, n36, n40, n44, n48, n52, n56, - n60}, - messageSizeGroupA ENUMERATED {b56, b144, b208, b256}, - messagePowerOffsetGroupB ENUMERATED { - minusinfinity, dB0, dB5, dB8, dB10, dB12, - dB15, dB18}, - ... - } OPTIONAL -- Need OP - }, - powerRampingParameters SEQUENCE { - powerRampingStep ENUMERATED {dB0, dB2,dB4, dB6}, - preambleInitialReceivedTargetPower ENUMERATED { - dBm-120, dBm-118, dBm-116, dBm-114, dBm-112, - dBm-110, dBm-108, dBm-106, dBm-104, dBm-102, - dBm-100, dBm-98, dBm-96, dBm-94, - dBm-92, dBm-90} - }, - ra-SupervisionInfo SEQUENCE { - preambleTransMax ENUMERATED { - n3, n4, n5, n6, n7, n8, n10, n20, n50, - n100, n200}, - ra-ResponseWindowSize ENUMERATED { - sf2, sf3, sf4, sf5, sf6, sf7, - sf8, sf10}, - mac-ContentionResolutionTimer ENUMERATED { - sf8, sf16, sf24, sf32, sf40, sf48, - sf56, sf64} - }, - maxHARQ-Msg3Tx INTEGER (1..8), - ... -} - --- ASN1STOP - -RACH-ConfigCommon field descriptions numberOfRA-Preambles -Number of non-dedicated random access preambles in TS 36.321 [6]. Value is an integer. Value n4 corresponds to 4, n8 corresponds to 8 and so on. preamblesGroupAConfig -Provides the configuration for preamble grouping in TS 36.321 [6]. If the field is not signalled, the size of the random access preambles group A [6] is equal to numberOfRA-Preambles. sizeOfRA-PreamblesGroupA -Size of the random access preambles group A in TS 36.321 [6]. Value is an integer. Value n4 corresponds to 4, n8 corresponds to 8 and so on. messageSizeGroupA -Threshold for preamble selection in TS 36.321 [6]. Value in bits. Value b56 corresponds to 56 bits, b144 corresponds to 144 bits and so on. messagePowerOffsetGroupB -Threshold for preamble selection in TS 36.321 [6]. Value in dB. Value minusinfinity corresponds to –infinity. Value dB0 corresponds to 0 dB, dB5 corresponds to 5 dB and so on. powerRampingStep -Power ramping factor in TS 36.321 [6]. Value in dB. Value dB0 corresponds to 0 dB, dB2 corresponds to 2 dB and so on. preambleInitialReceivedTargetPower -Initial preamble power in TS 36.321 [6]. Value in dBm. Value dBm-120 corresponds to -120 dBm, dBm-118 corresponds to -118 dBm and so on. preambleTransMax -Maximum number of preamble transmission in TS 36.321 [6]. Value is an integer. Value n3 corresponds to 3, n4 corresponds to 4 and so on. ra-ResponseWindowSize -Duration of the RA response window in TS 36.321 [6]. Value in subframes. Value sf2 corresponds to 2 subframes, sf3 corresponds to 3 subframes and so on. mac-ContentionResolutionTimer -Timer for contention resolution in TS 36.321 [6]. Value in subframes. Value sf8 corresponds to 8 subframes, sf16 corresponds to 16 subframes and so on. maxHARQ-Msg3Tx -Maximum number of Msg3 HARQ transmissions in TS 36.321 [6], used for contention based random access. Value is an integer. -– RACH-ConfigDedicated -The IE RACH-ConfigDedicated is used to specify the dedicated random access parameters. -RACH-ConfigDedicated information element --- ASN1START - -RACH-ConfigDedicated ::= SEQUENCE { - ra-PreambleIndex INTEGER (0..63), - ra-PRACH-MaskIndex INTEGER (0..15) -} - --- ASN1STOP - -RACH-ConfigDedicated field descriptions ra-PreambleIndex -Explicitly signalled Random Access Preamble for RA Resource selection in TS 36.321 [6]. ra-PRACH-MaskIndex -Explicitly signalled PRACH Mask Index for RA Resource selection in TS 36.321 [6]. -– RadioResourceConfigCommon -The IE RadioResourceConfigCommonSIB and IE RadioResourceConfigCommon are used to specify common radio resource configurations in the system information and in the mobility control information, respectively, e.g., the random access parameters and the static physical layer parameters. -RadioResourceConfigCommon information element --- ASN1START - -RadioResourceConfigCommonSIB ::= SEQUENCE { - rach-ConfigCommon RACH-ConfigCommon, - bcch-Config BCCH-Config, - pcch-Config PCCH-Config, - prach-Config PRACH-ConfigSIB, - pdsch-ConfigCommon PDSCH-ConfigCommon, - pusch-ConfigCommon PUSCH-ConfigCommon, - pucch-ConfigCommon PUCCH-ConfigCommon, - soundingRS-UL-ConfigCommon SoundingRS-UL-ConfigCommon, - uplinkPowerControlCommon UplinkPowerControlCommon, - ul-CyclicPrefixLength UL-CyclicPrefixLength, - ... -} - -RadioResourceConfigCommon ::= SEQUENCE { - rach-ConfigCommon RACH-ConfigCommon OPTIONAL, -- Need ON - prach-Config PRACH-Config, - pdsch-ConfigCommon PDSCH-ConfigCommon OPTIONAL, -- Need ON - pusch-ConfigCommon PUSCH-ConfigCommon, - phich-Config PHICH-Config OPTIONAL, -- Need ON - pucch-ConfigCommon PUCCH-ConfigCommon OPTIONAL, -- Need ON - soundingRS-UL-ConfigCommon SoundingRS-UL-ConfigCommon OPTIONAL, -- Need ON - uplinkPowerControlCommon UplinkPowerControlCommon OPTIONAL, -- Need ON - antennaInfoCommon AntennaInfoCommon OPTIONAL, -- Need ON - p-Max P-Max OPTIONAL, -- Need OP - tdd-Config TDD-Config OPTIONAL, -- Cond TDD - ul-CyclicPrefixLength UL-CyclicPrefixLength, - ... -} - -BCCH-Config ::= SEQUENCE { - modificationPeriodCoeff ENUMERATED {n2, n4, n8, n16} -} - -PCCH-Config ::= SEQUENCE { - defaultPagingCycle ENUMERATED { - rf32, rf64, rf128, rf256}, - nB ENUMERATED { - fourT, twoT, oneT, halfT, quarterT, oneEighthT, - oneSixteenthT, oneThirtySecondT} -} - -UL-CyclicPrefixLength ::= ENUMERATED {len1, len2} - --- ASN1STOP - -RadioResourceConfigCommon field descriptions p-Max -Pmax to be used in the target cell. If absent the UE applies the maximum power according to the UE capability. modificationPeriodCoeff -Actual modification period, expressed in number of radio frames= modificationPeriodCoeff * defaultPagingCycle. n2 corresponds to value 2, n4 corresponds to value 4, n8 corresponds to value 8 and n16 corresponds to value 16. defaultPagingCycle -Default paging cycle, used to derive ‘T’ in TS 36.304 [4]. Value rf32 corresponds to 32 radio frames, rf64 corresponds to 64 radio frames and so on. nB -Parameter: nB is used as one of parameters to derive the Paging Frame and Paging Occasion according to TS 36.304 [4]. Value in multiples of defaultPagingCycle ('T'). A value of fourT corresponds to 4 * defaultPagingCycle, a value of twoT corresponds to 2 * defaultPagingCycle and so on. UL-CyclicPrefixLength -Parameter: Uplink cyclic prefix length see 36.211 [21, 5.2.1] where len1 corresponds to normal cyclic prefix and len2 corresponds to extended cyclic prefix. -Conditional presence Explanation TDD The field is optional for TDD, Need ON; it is not present for FDD and the UE shall delete any existing value for this field. -– RadioResourceConfigDedicated -The IE RadioResourceConfigDedicated is used to setup/modify/release RBs, to modify the MAC main configuration, to modify the SPS configuration and to modify dedicated physical configuration. -RadioResourceConfigDedicated information element --- ASN1START - -RadioResourceConfigDedicated ::= SEQUENCE { - srb-ToAddModList SRB-ToAddModList OPTIONAL, -- Cond HO-Conn - drb-ToAddModList DRB-ToAddModList OPTIONAL, -- Cond HO-toEUTRA - drb-ToReleaseList DRB-ToReleaseList OPTIONAL, -- Need ON - mac-MainConfig CHOICE { - explicitValue MAC-MainConfig, - defaultValue NULL - } OPTIONAL, -- Cond HO-toEUTRA2 - sps-Config SPS-Config OPTIONAL, -- Need ON - physicalConfigDedicated PhysicalConfigDedicated OPTIONAL, -- Need ON - ... -} - -SRB-ToAddModList ::= SEQUENCE (SIZE (1..2)) OF SRB-ToAddMod - -SRB-ToAddMod ::= SEQUENCE { - srb-Identity INTEGER (1..2), - rlc-Config CHOICE { - explicitValue RLC-Config, - defaultValue NULL - } OPTIONAL, -- Cond Setup - logicalChannelConfig CHOICE { - explicitValue LogicalChannelConfig, - defaultValue NULL - } OPTIONAL, -- Cond Setup - ... -} - -DRB-ToAddModList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-ToAddMod - -DRB-ToAddMod ::= SEQUENCE { - eps-BearerIdentity INTEGER (0..15) OPTIONAL, -- Cond DRB-Setup - drb-Identity DRB-Identity, - pdcp-Config PDCP-Config OPTIONAL, -- Cond PDCP - rlc-Config RLC-Config OPTIONAL, -- Cond Setup - logicalChannelIdentity INTEGER (3..10) OPTIONAL, -- Cond DRB-Setup - logicalChannelConfig LogicalChannelConfig OPTIONAL, -- Cond Setup - ... -} - -DRB-ToReleaseList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-Identity - --- ASN1STOP - -RadioResourceConfigDedicated field descriptions srb-Identity -Value 1 is applicable for SRB1 only. -Value 2 is applicable for SRB2 only. rlc-Config -For SRBs a choice is used to indicate whether the RLC configuration is signalled explicitly or set to the values defined in the default RLC configuration for SRB1 in 9.2.1.1 or for SRB2 in 9.2.1.2. RLC AM is the only applicable RLC mode for SRB1 and SRB2. E-UTRAN does not reconfigure the RLC mode of DRBs, and may reconfigure the UM RLC SN field size only upon handover within E-UTRA or upon the first reconfiguration after RRC connection re-establishment. mac-MainConfig -Although the ASN.1 includes a choice that is used to indicate whether the mac-MainConfig is signalled explictly or set to the default MAC main configuration as specified in 9.2.2, EUTRAN does not apply "defaultValue". sps-Config -The default SPS configuration is specified in 9.2.3. physicalConfigDedicated -The default dedicated physical configuration is specified in 9.2.4. logicalChannelConfig -For SRBs a choice is used to indicate whether the logical channel configuration is signalled explicitly or set to the default logical channel configuration for SRB1 as specified in 9.2.1.1 or for SRB2 as specified in 9.2.1.2. logicalChannelIdentity -The logical channel identity for both UL and DL. -Conditional presence Explanation DRB-Setup The field is mandatory present if the corresponding DRB is being set up (including bearer setup at handover to E-UTRA); otherwise it is not present. PDCP The field is mandatory present if the corresponding DRB is being setup; the field is optionally present, need ON, upon handover within E-UTRA and upon the first reconfiguration after re-establishment; otherwise it is not present. Setup The field is mandatory present if the corresponding SRB/DRB is being setup; otherwise the field is optionally present, need ON. HO-Conn The field is mandatory present in case of handover to E-UTRA and to only establish SRB1 in case of RRC connection establishment; otherwise the field is optionally present, need ON. HO-toEUTRA The field is mandatory present in case of handover to E-UTRA; In case of RRC connection establishment and RRC connection re-establishment the field is not present; otherwise the field is optionally present, need ON. HO-toEUTRA2 The field is mandatory present in case of handover to E-UTRA; otherwise the field is optionally present, need ON. -– RLC-Config -The IE RLC-Config is used to specify the RLC configuration of SRBs and DRBs. -RLC-Config information element --- ASN1START - -RLC-Config ::= CHOICE { - am SEQUENCE { - ul-AM-RLC UL-AM-RLC, - dl-AM-RLC DL-AM-RLC - }, - um-Bi-Directional SEQUENCE { - ul-UM-RLC UL-UM-RLC, - dl-UM-RLC DL-UM-RLC - }, - um-Uni-Directional-UL SEQUENCE { - ul-UM-RLC UL-UM-RLC - }, - um-Uni-Directional-DL SEQUENCE { - dl-UM-RLC DL-UM-RLC - }, - ... -} - -UL-AM-RLC ::= SEQUENCE { - t-PollRetransmit T-PollRetransmit, - pollPDU PollPDU, - pollByte PollByte, - maxRetxThreshold ENUMERATED { - t1, t2, t3, t4, t6, t8, t16, t32} -} - -DL-AM-RLC ::= SEQUENCE { - t-Reordering T-Reordering, - t-StatusProhibit T-StatusProhibit -} - -UL-UM-RLC ::= SEQUENCE { - sn-FieldLength SN-FieldLength -} - -DL-UM-RLC ::= SEQUENCE { - sn-FieldLength SN-FieldLength, - t-Reordering T-Reordering -} - -SN-FieldLength ::= ENUMERATED {size5, size10} - -T-PollRetransmit ::= ENUMERATED { - ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms105, - ms110, ms115, ms120, ms125, ms130, ms135, - ms140, ms145, ms150, ms155, ms160, ms165, - ms170, ms175, ms180, ms185, ms190, ms195, - ms200, ms205, ms210, ms215, ms220, ms225, - ms230, ms235, ms240, ms245, ms250, ms300, - ms350, ms400, ms450, ms500, spare9, spare8, - spare7, spare6, spare5, spare4, spare3, - spare2, spare1} - -PollPDU ::= ENUMERATED { - p4, p8, p16, p32, p64, p128, p256, pInfinity} - -PollByte ::= ENUMERATED { - kB25, kB50, kB75, kB100, kB125, kB250, kB375, - kB500, kB750, kB1000, kB1250, kB1500, kB2000, - kB3000, kBinfinity, spare1} - -T-Reordering ::= ENUMERATED { - ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms110, - ms120, ms130, ms140, ms150, ms160, ms170, - ms180, ms190, ms200, spare1} - -T-StatusProhibit ::= ENUMERATED { - ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms105, - ms110, ms115, ms120, ms125, ms130, ms135, - ms140, ms145, ms150, ms155, ms160, ms165, - ms170, ms175, ms180, ms185, ms190, ms195, - ms200, ms205, ms210, ms215, ms220, ms225, - ms230, ms235, ms240, ms245, ms250, ms300, - ms350, ms400, ms450, ms500, spare8, spare7, - spare6, spare5, spare4, spare3, spare2, - spare1} - --- ASN1STOP - -RLC-Config field descriptions sn-FieldLength -Indicates the UM RLC SN field size, see TS 36.322 [7], in bits. Value size5 means 5 bits, size10 means 10 bits. t-PollRetransmit -Timer for RLC AM in TS 36.322 [7], in milliseconds. Value ms5 means 5ms, ms10 means 10ms and so on. pollPDU -Parameter for RLC AM in TS 36.322 [7]. Value p4 corresponds to 4 PDUs, p8 to 8 PDUs and so on. pInfinity corresponds to an infinite number of PDUs. pollByte -Parameter for RLC AM in TS 36.322 [7]. Value kB25 corresponds to 25 kBytes, kB50 to 50 kBytes and so on. kBInfinity corresponds to an infinite amount of kBytes. maxRetxThreshold -Parameter for RLC AM in TS 36.322 [7]. Value t1 corresponds to 1 retransmission, t2 to 2 retransmissions and so on. t-Reordering -Timer for reordering in TS 36.322 [7], in milliseconds. Value ms0 means 0ms, ms5 means 5ms and so on. t-StatusProhibit -Timer for status reporting in TS 36.322 [7], in milliseconds. Value ms0 means 0ms, ms5 means 5ms and so on. -– SchedulingRequestConfig -The IE SchedulingRequestConfig is used to specify the Scheduling Request related parameters -SchedulingRequestConfig information element --- ASN1START - -SchedulingRequestConfig ::= CHOICE { - release NULL, - setup SEQUENCE { - sr-PUCCH-ResourceIndex INTEGER (0..2047), - sr-ConfigIndex INTEGER (0..155), - dsr-TransMax ENUMERATED { - n4, n8, n16, n32, n64, spare3, spare2, spare1} - } -} - --- ASN1STOP - -SchedulingRequestConfig field descriptions sr-PUCCH-ResourceIndex -Parameter: . see TS 36.213 [23, 10.1]. sr-ConfigIndex -Parameter. See TS 36.213 [23,10.1]. dsr-TransMax -Parameter for SR transmission in TS 36.321 [6, 5.4.4]. The value n4 corresponds to 4 transmissions, n8 corresponds to 8 transmissions and so on. -– SoundingRS-UL-Config -The IE SoundingRS-UL-Config is used to specify the uplink Sounding RS configuration. -SoundingRS-UL-Config information element --- ASN1START - -SoundingRS-UL-ConfigCommon ::= CHOICE { - release NULL, - setup SEQUENCE { - srs-BandwidthConfig ENUMERATED {bw0, bw1, bw2, bw3, bw4, bw5, bw6, bw7}, - srs-SubframeConfig ENUMERATED { - sc0, sc1, sc2, sc3, sc4, sc5, sc6, sc7, - sc8, sc9, sc10, sc11, sc12, sc13, sc14, sc15}, - ackNackSRS-SimultaneousTransmission BOOLEAN, - srs-MaxUpPts ENUMERATED {true} OPTIONAL -- Cond TDD - } -} - -SoundingRS-UL-ConfigDedicated ::= CHOICE{ - release NULL, - setup SEQUENCE { - srs-Bandwidth ENUMERATED {bw0, bw1, bw2, bw3}, - srs-HoppingBandwidth ENUMERATED {hbw0, hbw1, hbw2, hbw3}, - freqDomainPosition INTEGER (0..23), - duration BOOLEAN, - srs-ConfigIndex INTEGER (0..1023), - transmissionComb INTEGER (0..1), - cyclicShift ENUMERATED {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7} - } -} - - --- ASN1STOP - -SoundingRS-UL-Config field descriptions srs-BandwidthConfig -Parameter: SRS Bandwidth Configuration. See TS 36.211, [21, table 5.5.3.2-1, 5.5.3.2-2, 5.5.3.2-3 and 5.5.3.2– 4]. Actual configuration depends on UL bandwidth. bw0 corresponds to value 0, bw1 to value 1 and so on. srs-SubframeConfig -Parameter: SRS SubframeConfiguration. See TS 36.211, [21, table 5.5.3.3-1] applies for FDD whereas TS 36.211, [21, table 5.5.3.3-2] applies for TDD. sc0 corresponds to value 0, sc1 to value 1 and so on. ackNackSRS-SimultaneousTransmission -Parameter: Simultaneous-AN-and-SRS, see TS 36.213 [23, 8.2]. srs-Bandwidth -Parameter: b, see TS 36.211 [21, table 5.5.3.2-1]. freqDomainPosition -Parameter: , see TS 36.211 [21, 5.5.3.2]. srs-HoppingBandwidth -Parameter: SRS hopping bandwidth , see TS 36.211 [21, 5.5.3.2] where hbw0 corresponds to value 0, hbw1 to value 1 and so on. duration -Parameter: Duration. See TS 36.213 [21, 8.2]. FALSE corresponds to “single” and value TRUE to “indefinite”. srs-ConfigIndex -Parameter: ISRS. See TS 36.213 [23, table8.2-1]. transmissionComb -Parameter: , see TS 36.211 [21, 5.5.3.2]. cyclicShift -Parameter: n_SRS. See TS 36.211 [21, 5.5.3.1], where cs0 corresponds to 0 etc. srs-MaxUpPts -Parameter: srsMaxUpPts, see TS 36.211 [21, 5.5.3.2]. If this field is present, reconfiguration of applies for UpPts, otherwise reconfiguration does not apply. -Conditional presence Explanation TDD This field is optional present for TDD, need OR; it is not present for FDD and the UE shall delete any existing value for this field. -– SPS-Config -The IE SPS-Config is used to specify the semi-persistent scheduling configuration. -SPS-Config information element --- ASN1START - -SPS-Config ::= SEQUENCE { - semiPersistSchedC-RNTI C-RNTI OPTIONAL, -- Need OR - sps-ConfigDL SPS-ConfigDL OPTIONAL, -- Need ON - sps-ConfigUL SPS-ConfigUL OPTIONAL -- Need ON -} - -SPS-ConfigDL ::= CHOICE{ - release NULL, - setup SEQUENCE { - semiPersistSchedIntervalDL ENUMERATED { - sf10, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, spare6, - spare5, spare4, spare3, spare2, - spare1}, - numberOfConfSPS-Processes INTEGER (1..8), - n1-PUCCH-AN-PersistentList N1-PUCCH-AN-PersistentList, - ... - } -} - -SPS-ConfigUL ::= CHOICE { - release NULL, - setup SEQUENCE { - semiPersistSchedIntervalUL ENUMERATED { - sf10, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, spare6, - spare5, spare4, spare3, spare2, - spare1}, - implicitReleaseAfter ENUMERATED {e2, e3, e4, e8}, - p0-Persistent SEQUENCE { - p0-NominalPUSCH-Persistent INTEGER (-126..24), - p0-UE-PUSCH-Persistent INTEGER (-8..7) - } OPTIONAL, -- Need OP - twoIntervalsConfig ENUMERATED {true} OPTIONAL, -- Cond TDD - ... - } -} - -N1-PUCCH-AN-PersistentList ::= SEQUENCE (SIZE (1..4)) OF INTEGER (0..2047) - --- ASN1STOP - -SPS-Config field descriptions semiPersistSchedC-RNTI -Semi-persistent Scheduling C-RNTI, see TS 36.321 [6]. semiPersistSchedIntervalDL -Semi-persistent scheduling interval in downlink, see TS 36.321 [6]. Value in number of sub-frames. Value sf10 corresponds to 10 sub-frames, sf20 corresponds to 20 sub-frames and so on. For TDD, the UE shall round this parameter down to the nearest integer (of 10 sub-frames), e.g. sf10 corresponds to 10 sub-frames, sf32 corresponds to 30 sub-frames, sf128 corresponds to 120 sub-frames. numberOfConfSPS-Processes -Parameter: Number of Configured SPS Processes, see TS 36.321 [6]. n1-PUCCH-AN-PersistentList -List of parameter: see TS 36.213, [23, 10.1]. semiPersistSchedIntervalUL -Semi-persistent scheduling interval in uplink, see TS 36.321 [6]. Value in number of sub-frames. Value sf10 corresponds to 10 sub-frames, sf20 corresponds to 20 sub-frames and so on. For TDD, the UE shall round this parameter down to the nearest integer (of 10 sub-frames), e.g. sf10 corresponds to 10 sub-frames, sf32 corresponds to 30 sub-frames, sf128 corresponds to 120 sub-frames. implicitReleaseAfter -Number of empty transmissions before implicit release, see TS 36.321 [6, 5.10.2]. Value e2 corresponds to 2 transmissions, e3 corresponds to 3 transmissions and so on. p0-NominalPUSCH-Persistent -Parameter: . See TS 36.213 [23, 5.1.1.1], unit dBm step 1. This field is applicable for persistent scheduling, only. If choice ‘setup’ is used and p0-Persistent is absent, apply the value of p0-NominalPUSCH for p0-NominalPUSCH-Persistent. p0-UE-PUSCH-Persistent -Parameter: . See TS 36.213 [23, 5.1.1.1], unit dB. This field is applicable for persistent scheduling, only. If choice ‘setup’ is used and p0-Persistent is absent, apply the value of p0-UE-PUSCH for p0-UE-PUSCH-Persistent. twoIntervalsConfig -Trigger of two-intervals-Semi-Persistent Scheduling in uplink. See TS 36.321 [6, 5.10]. If this field is present, two-intervals-SPS is enabled for uplink. Otherwise, two-intervals-SPS is disabled. -Conditional presence Explanation TDD This field is optional present for TDD, need OR; it is not present for FDD and the UE shall delete any existing value for this field. -– TDD-Config -The IE TDD-Config is used to specify the TDD specific physical channel configuration. -TDD-Config information element --- ASN1START - -TDD-Config ::= SEQUENCE { - subframeAssignment ENUMERATED { - sa0, sa1, sa2, sa3, sa4, sa5, sa6}, - specialSubframePatterns ENUMERATED { - ssp0, ssp1, ssp2, ssp3, ssp4,ssp5, ssp6, ssp7, - ssp8} -} - --- ASN1STOP - -TDD-Config field descriptions subframeAssignment -Indicates DL/UL subframe configuration where sa0 point to Configuration 0, sa1 to Configuration 1 etc. as specified in TS 36.211 [21, table 4.2.2]. specialSubframePatterns -Indicates Configuration as in TS 36.211 [21, table 4.2.1] where ssp0 point to Configuration 0, ssp1 to Configuration 1 etc. -– TimeAlignmentTimer -The IE TimeAlignmentTimer is used to control how long the UE is considered uplink time aligned. Corresponds to the Timer for time alignment in TS 36.321 [6]. Value in number of sub-frames. Value sf500 corresponds to 500 sub-frames, sf750 corresponds to 750 sub-frames and so on. -TimeAlignmentTimer information element --- ASN1START - -TimeAlignmentTimer ::= ENUMERATED { - sf500, sf750, sf1280, sf1920, sf2560, sf5120, - sf10240, infinity} --- ASN1STOP - -– TPC-PDCCH-Config -The IE TPC-PDCCH-Config is used to specify the RNTIs and indexes for PUCCH and PUSCH power control according to TS 36.212 [22]. The power control function can either be setup or released with the IE. -TPC-PDCCH-Config information element --- ASN1START - -TPC-PDCCH-Config::= CHOICE { - release NULL, - setup SEQUENCE { - tpc-RNTI BIT STRING (SIZE (16)), - tpc-Index TPC-Index - } -} - -TPC-Index ::= CHOICE { - indexOfFormat3 INTEGER (1..15), - indexOfFormat3A INTEGER (1..31) -} - --- ASN1STOP - -TPC-PDCCH-Config field descriptions tpc-RNTI -RNTI for power control using DCI format 3/3A, see TS 36.212 [22]. tpc-Index -Index of N or M, see TS 36.212 [22, 5.3.3.1.6 and 5.3.3.1.7], where N or M is dependent on the used DCI format (i.e. format 3 or 3a). indexOfFormat3 -Index of N when DCI format 3 is used. See TS 36.212 [22, 5.3.3.1.6]. IndexOfFormat3A -Index of M when DCI format 3A is used. See TS 36.212 [22, 5.3.3.1.7]. -– UplinkPowerControl -The IE UplinkPowerControlCommon and IE UplinkPowerControlDedicated are used to specify parameters for uplink power control in the system information and in the dedicated signalling, respectively. -UplinkPowerControl information elements --- ASN1START - -UplinkPowerControlCommon ::= SEQUENCE { - p0-NominalPUSCH INTEGER (-126..24), - alpha ENUMERATED {al0, al04, al05, al06, al07, al08, al09, al1}, - p0-NominalPUCCH INTEGER (-127..-96), - deltaFList-PUCCH DeltaFList-PUCCH, - deltaPreambleMsg3 INTEGER (-1..6) -} - -UplinkPowerControlDedicated ::= SEQUENCE { - p0-UE-PUSCH INTEGER (-8..7), - deltaMCS-Enabled ENUMERATED {en0, en1}, - accumulationEnabled BOOLEAN, - p0-UE-PUCCH INTEGER (-8..7), - pSRS-Offset INTEGER (0..15), - filterCoefficient FilterCoefficient DEFAULT fc4 -} - -DeltaFList-PUCCH ::= SEQUENCE { - deltaF-PUCCH-Format1 ENUMERATED {deltaF-2, deltaF0, deltaF2}, - deltaF-PUCCH-Format1b ENUMERATED {deltaF1, deltaF3, deltaF5}, - deltaF-PUCCH-Format2 ENUMERATED {deltaF-2, deltaF0, deltaF1, deltaF2}, - deltaF-PUCCH-Format2a ENUMERATED {deltaF-2, deltaF0, deltaF2}, - deltaF-PUCCH-Format2b ENUMERATED {deltaF-2, deltaF0, deltaF2} -} - --- ASN1STOP - -UplinkPowerControl field descriptions p0-NominalPUSCH -Parameter: See TS 36.213, 5.1.1.1, unit dBm. This field is applicable for non-persistent scheduling, only. alpha -Parameter: ? See TS 36.213, 5.1.1.1 where al0 corresponds to 0, al04 corresponds to value 0.4, al05 to 0.5, al06 to 0.6, al07 to 0.7, al08 to 0.8, al09 to 0.9 and al1 corresponds to 1. p0-NominalPUCCH -Parameter: See TS 36.213, 5.1.2.1, unit dBm. deltaF-PUCCH-FormatX -Parameter: for the PUCCH formats 1, 1b, 2, 2a and 2b. See TS 36.213 [23, 5.1.2] where -deltaF-2 corresponds to -2 dB, deltaF0 corresponds to 0 dB and so on. p0-UE-PUSCH -Parameter: See TS 36.213 [23, 5.1.1.1], unit dB. This field is applicable for non-persistent scheduling, only. deltaPreambleMsg3 -Parameter: see TS 36.213 [23, 5.1.1.1]. Actual value = IE value * 2 [dB]. deltaMCS-Enabled -Parameter: Ks See TS 36.213 [23, 5.1.1.1]. en0 corresponds to value 0 corresponding to state “disabled”. en1 corresponds to value 1.25 corresponding to “enabled”. accumulationEnabled -Parameter: Accumulation-enabled, see TS 36.213 [23, 5.1.1.1]. TRUE corresponds to “enabled” whereas FALSE corresponds to “disabled”. p0-UE-PUCCH -Parameter: See TS 36.213 [23, 5.1.2.1]. Unit dB pSRS-Offset -Parameter: PSRS_OFFSET See TS 36.213 [23, 5.1.3.1]. For Ks=1.25, the actual parameter value is pSRS-Offset value – 3. For Ks=0, the actual parameter value is -10.5 + 1.5*pSRS-Offset value. filterCoefficient -Specifies the filtering coefficient for RSRP measurements used to calculate path loss, as specified in TS 36.213 [23, 5.1.1.1]. The same filtering mechanism applies as for quantityConfig described in 5.5.3.2. -6.3.3 Security control information elements -– NextHopChainingCount -The IE NextHopChainingCount is used to update the KeNB key and corresponds to parameter NCC: See TS 33.401 [32, 7.2.8.4]. -NextHopChainingCount information element --- ASN1START - -NextHopChainingCount ::= INTEGER (0..7) - --- ASN1STOP - -– SecurityAlgorithmConfig -The IE SecurityAlgorithmConfig is used to configure AS integrity protection algorithm (SRBs) and AS ciphering algorithm (SRBs and DRBs). -SecurityAlgorithmConfig information element --- ASN1START - -SecurityAlgorithmConfig ::= SEQUENCE { - cipheringAlgorithm ENUMERATED { - eea0, eea1, eea2, spare5, spare4, spare3, - spare2, spare1, ...}, - integrityProtAlgorithm ENUMERATED { - reserved, eia1, eia2, spare5, spare4, spare3, - spare2, spare1, ...} -} - --- ASN1STOP - -SecurityAlgorithmConfig field descriptions integrityProtAlgorithm -Indicates the integrity protection algorithm to be used for SRBs, as specified in TS 33.401 [32, 5.1.4.2]. The value ‘reserved’ is handled as a spare value in Rel-8. cipheringAlgorithm -Indicates the ciphering algorithm to be used for SRBs and DRBs, as specified in TS 33.401 [32, 5.1.3.2]. -– ShortMAC-I -The IE ShortMAC-I is used to identify and verify the UE at RRC connection re-establishment. The 16 least significant bits of the MAC-I calculated using the security configuration of the source cell, as specified in 5.3.7.4. -ShortMAC-I information element --- ASN1START - -ShortMAC-I ::= BIT STRING (SIZE (16)) - --- ASN1STOP - -6.3.4 Mobility control information elements -– AdditionalSpectrumEmission -The UE requirements related to IE AdditionalSpectrumEmission are defined in TS 36.101 [42, table 6.2.4-1]. -AdditionalSpectrumEmission information element --- ASN1START - -AdditionalSpectrumEmission ::= INTEGER (1..32) - --- ASN1STOP - -– ARFCN-ValueCDMA2000 -The IE ARFCN-ValueCDMA2000 used to indicate the CDMA2000 carrier frequency within a CDMA2000 band, see C.S0002-A [12]. -ARFCN-ValueCDMA2000 information element --- ASN1START - -ARFCN-ValueCDMA2000 ::= INTEGER (0..2047) - --- ASN1STOP - -– ARFCN-ValueEUTRA -The IE ARFCN-ValueEUTRA is used to indicate the ARFCN applicable for a downlink, uplink or bi-directional (TDD) E-UTRA carrier frequency, as defined in TS 36.101 [42]. -ARFCN-ValueEUTRA information element --- ASN1START - -ARFCN-ValueEUTRA ::= INTEGER (0..maxEARFCN) - --- ASN1STOP - -– ARFCN-ValueGERAN -The IE ARFCN-ValueGERAN is used to specify the ARFCN value applicable for a GERAN BCCH carrier frequency, see TS 45.005 [20]. -ARFCN-ValueGERAN information element --- ASN1START - -ARFCN-ValueGERAN ::= INTEGER (0..1023) - --- ASN1STOP - -– ARFCN-ValueUTRA -The IE ARFCN-ValueUTRA is used to indicate the ARFCN applicable for a downlink (Nd, FDD) or bi-directional (Nt, TDD) UTRA carrier frequency, as defined in TS 25.331 [19]. -ARFCN-ValueUTRA information element --- ASN1START - -ARFCN-ValueUTRA ::= INTEGER (0..16383) - --- ASN1STOP - -– BandclassCDMA2000 -The IE BandclassCDMA2000 is used to define the CDMA2000 band in which the CDMA2000 carrier frequency can be found, as defined in C.S0057-B [24, table 1.5-1]. -BandclassCDMA2000 information element --- ASN1START - -BandclassCDMA2000 ::= ENUMERATED { - bc0, bc1, bc2, bc3, bc4, bc5, bc6, bc7, bc8, - bc9, bc10, bc11, bc12, bc13, bc14, bc15, bc16, - bc17, spare14, spare13, spare12, spare11, spare10, - spare9, spare8, spare7, spare6, spare5, spare4, - spare3, spare2, spare1, ...} - --- ASN1STOP - -– BandIndicatorGERAN -The IE BandIndicatorGERAN indicates how to interpret an associated GERAN carrier ARFCN, see TS 45.005 [20]. More specifically, the IE indicates the GERAN frequency band in case the ARFCN value can concern either a DCS 1800 or a PCS 1900 carrier frequency. For ARFCN values not associated with one of these bands, the indicator has no meaning. -BandIndicatorGERAN information element --- ASN1START - -BandIndicatorGERAN ::= ENUMERATED {dcs1800, pcs1900} - --- ASN1STOP - -– CarrierFreqCDMA2000 -The IE CarrierFreqCDMA2000 used to provide the CDMA2000 carrier information. -CarrierFreqCDMA2000 information element --- ASN1START - -CarrierFreqCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - arfcn ARFCN-ValueCDMA2000 -} - --- ASN1STOP - -– CarrierFreqGERAN -The IE CarrierFreqGERAN is used to provide an unambiguous carrier frequency description of a GERAN cell. -CarrierFreqGERAN information element --- ASN1START - -CarrierFreqGERAN ::= SEQUENCE { - arfcn ARFCN-ValueGERAN, - bandIndicator BandIndicatorGERAN -} - --- ASN1STOP - -CarrierFreqGERAN field descriptions arfcn -GERAN ARFCN of BCCH carrier. bandIndicator -Indicates how to interpret the ARFCN of the BCCH carrier. -– CarrierFreqsGERAN -The IE CarrierFreqListGERAN is used to provide one or more GERAN ARFCN values, as defined in TS 44.005 [43], which represents a list of GERAN BCCH carrier frequencies. -CarrierFreqsGERAN information element --- ASN1START - -CarrierFreqsGERAN ::= SEQUENCE { - startingARFCN ARFCN-ValueGERAN, - bandIndicator BandIndicatorGERAN, - followingARFCNs CHOICE { - explicitListOfARFCNs ExplicitListOfARFCNs, - equallySpacedARFCNs SEQUENCE { - arfcn-Spacing INTEGER (1..8), - numberOfFollowingARFCNs INTEGER (0..31) - }, - variableBitMapOfARFCNs OCTET STRING (SIZE (1..16)) - } -} - -ExplicitListOfARFCNs ::= SEQUENCE (SIZE (0..31)) OF ARFCN-ValueGERAN - --- ASN1STOP - -CarrierFreqsGERAN field descriptions startingARFCN -The first ARFCN value, s, in the set. bandIndicator -Indicates how to interpret the ARFCN of the BCCH carrier. followingARFCNs -Field containing a representation of the remaining ARFCN values in the set. explicitListOfARFCNs -The remaining ARFCN values in the set are explicitly listed one by one. arfcn-Spacing -Space, d, between a set of equally spaced ARFCN values. numberOfFollowingARFCNs -The number, n, of the remaining equally spaced ARFCN values in the set. The complete set of (n+1) ARFCN values is defined as: {s, ((s + d) mod 1024), ((s + 2*d) mod 1024) ... ((s + n*d) mod 1024)}. variableBitMapOfARFCNs -Bitmap field representing the remaining ARFCN values in the set. The leading bit of the first octet in the bitmap corresponds to the ARFCN = ((s + 1) mod 1024), the next bit to the ARFCN = ((s + 2) mod 1024), and so on. If the bitmap consist of N octets, the trailing bit of octet N corresponds to ARFCN = ((s + 8*N) mod 1024). The complete set of ARFCN values consists of ARFCN = s and the ARFCN values, where the corresponding bit in the bitmap is set to "1". -– CDMA2000-Type -The IE CDMA2000-Type is used to describe the type of CDMA2000 network. -CDMA2000-Type information element --- ASN1START - -CDMA2000-Type ::= ENUMERATED {type1XRTT, typeHRPD} - --- ASN1STOP - -– CellIdentity -The IE CellIdentity is used to unambiguously identify a cell within a PLMN. -CellIdentity information element --- ASN1START - -CellIdentity ::= BIT STRING (SIZE (28)) - --- ASN1STOP - -– CellIndexList -The IE CellIndexList concerns a list of cell indices, which may be used for different purposes. -CellIndexList information element --- ASN1START - -CellIndexList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellIndex - -CellIndex ::= INTEGER (1..maxCellMeas) - --- ASN1STOP - -– CellReselectionPriority -The IE CellReselectionPriority concerns the absolute priority of the concerned carrier frequency/ set of frequencies (GERAN), as used by the cell reselection procedure. Corresponds with parameter “priority” in TS 36.304 [4]. Value 0 means: lowest priority. The UE behaviour for the case the field is absent, if applicable, is specified in TS 36.304 [4]. -CellReselectionPriority information element --- ASN1START - -CellReselectionPriority ::= INTEGER (0..7) - --- ASN1STOP - -– CSFB-RegistrationParam1XRTT -The IE CSFB-RegistrationParam1XRTT is used to indicate whether or not the UE shall perform an CDMA2000 1xRTT pre-registration if the UE does not have a valid / current pre-registration. --- ASN1START - -CSFB-RegistrationParam1XRTT ::= SEQUENCE { - sid BIT STRING (SIZE (15)), - nid BIT STRING (SIZE (16)), - multipleSID BOOLEAN, - multipleNID BOOLEAN, - homeReg BOOLEAN, - foreignSIDReg BOOLEAN, - foreignNIDReg BOOLEAN, - parameterReg BOOLEAN, - powerUpReg BOOLEAN, - registrationPeriod BIT STRING (SIZE (7)), - registrationZone BIT STRING (SIZE (12)), - totalZone BIT STRING (SIZE (3)), - zoneTimer BIT STRING (SIZE (3)) -} - --- ASN1STOP - - -CSFB-RegistrationParam1XRTT field descriptions sid -Used along with the oneXRTT-NetworkID as a pair to control when the UE should Re-Register with the CDMA2000 1xRTT network. nid -Used along with the oneXRTT-SystemID as a pair to control when the UE should Re-Register with the CDMA2000 1xRTT network. multipleSID -The CDMA2000 1xRTT Multiple SID storage indicator. multipleNID -The CDMA2000 1xRTT Multiple NID storage indicator. homeReg -The CDMA2000 1xRTT Home registration indicator. foreignSIDReg -The CDMA2000 1xRTT SID roamer registration indicator. foreignNIDReg -The CDMA2000 1xRTT NID roamer registration indicator. parameterReg -The CDMA2000 1xRTT Parameter-change registration indicator. powerUpReg -The CDMA2000 1xRTT Power-up registration indicator. registrationPeriod -The CDMA2000 1xRTT Registration period. registrationZone -The CDMA2000 1xRTT Registration zone. totalZone -The CDMA2000 1xRTT Number of registration zones to be retained. zoneTimer -The CDMA2000 1xRTT Zone timer length. -– CellGlobalIdEUTRA -The IE CellGlobalIdEUTRA specifies the Evolved Cell Global Identifier (ECGI), the globally unique identity of a cell in E-UTRA. -CellGlobalIdEUTRA information element --- ASN1START - -CellGlobalIdEUTRA ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellIdentity CellIdentity -} - --- ASN1STOP - -CellGlobalIdEUTRA field descriptions plmn-Identity -Identifies the PLMN of the cell as given by the first PLMN entry in the plmn-IdentityList in SystemInformationBlockType1. cellIdentity -Identity of the cell within the context of the PLMN. -– CellGlobalIdUTRA -The IE CellGlobalIdUTRA specifies the global UTRAN Cell Identifier, the globally unique identity of a cell in UTRA. -CellGlobalIdUTRA information element --- ASN1START - -CellGlobalIdUTRA ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellIdentity BIT STRING (SIZE (28)) -} - --- ASN1STOP - -CellGlobalIdUTRA field descriptions plmn-Identity -Identifies the PLMN of the cell as given by the common PLMN broadcast in the MIB. cellIdentity -UTRA Cell Identifier which is unique within the context of the identified PLMN as defined in TS 25.331 [19]. -– CellGlobalIdGERAN -The IE CellGlobalIdGERAN specifies the Cell Global Identification (CGI), the globally unique identity of a cell in GERAN. -CellGlobalIdGERAN information element --- ASN1START - -CellGlobalIdGERAN ::= SEQUENCE { - plmn-Identity PLMN-Identity, - locationAreaCode BIT STRING (SIZE (16)), - cellIdentity BIT STRING (SIZE (16)) -} - --- ASN1STOP - -CellGlobalIdGERAN field descriptions plmn-Identity -Identifies the PLMN of the cell. locationAreaCode -A fixed length code identifying the location area within a PLMN as defined in TS 23.003 [27]. cellIdentity -Cell Identifier which is unique within the context of the GERAN location area as defined in TS 23.003 [27]. -– CellGlobalIdCDMA2000 -The IE CellGlobalIdCDMA2000 specifies the Cell Global Identification (CGI), the globally unique identity of a cell in CDMA2000. -CellGlobalIdCDMA2000 information element --- ASN1START - -CellGlobalIdCDMA2000 ::= CHOICE { - cellGlobalId1XRTT BIT STRING (SIZE (47)), - cellGlobalIdHRPD BIT STRING (SIZE (128)) -} - --- ASN1STOP - -CellGlobalIdCDMA2000 field descriptions cellGlobalId1XRTT -Unique identifier for a CDMA2000 1xRTT cell, corresponds to BASEID, SID and NID parameters (in that order) defined in C.S0005-A [25]. cellGlobalIdHRPD -Unique identifier for a CDMA2000 HRPD cell, corresponds to SECTOR ID parameter defined in C.S0024-A [26, 14.9]. -– MobilityControlInfo -The IE MobilityControlInfo includes parameters relevant for network controlled mobility to/within EUTRA. -MobilityControlInfo information element --- ASN1START - -MobilityControlInfo ::= SEQUENCE { - targetPhysCellId PhysCellId, - carrierFreq CarrierFreqEUTRA OPTIONAL, -- Cond HO-toEUTRA - carrierBandwidth CarrierBandwidthEUTRA OPTIONAL, -- Cond HO-toEUTRA - additionalSpectrumEmission AdditionalSpectrumEmission OPTIONAL, -- Cond HO-toEUTRA - t304 ENUMERATED { - ms50, ms100, ms150, ms200, ms500, ms1000, - ms2000, spare1}, - newUE-Identity C-RNTI, - radioResourceConfigCommon RadioResourceConfigCommon, - rach-ConfigDedicated RACH-ConfigDedicated OPTIONAL, -- Need OP - ... -} - -CarrierBandwidthEUTRA ::= SEQUENCE { - dl-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100, spare10, - spare9, spare8, spare7, spare6, spare5, - spare4, spare3, spare2, spare1}, - ul-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100, spare10, - spare9, spare8, spare7, spare6, spare5, - spare4, spare3, spare2, spare1} OPTIONAL -- Need OP -} - -CarrierFreqEUTRA ::= SEQUENCE { - dl-CarrierFreq ARFCN-ValueEUTRA, - ul-CarrierFreq ARFCN-ValueEUTRA OPTIONAL -- Cond FDD -} - --- ASN1STOP - -MobilityControlInfo field descriptions t304 -Timer T304 as described in section 7.3. ms50 corresponds with 50 ms, ms100 corresponds with 100 ms and so on. dl-Bandwidth -Parameter: Downlink bandwidth, see TS 36.101 [42]. ul-Bandwidth -Parameter: Uplink bandwidth, see TS 36.101 [42, table 5.6-1]. For TDD, the parameter is absent and it is equal to downlink bandwidth. If absent for FDD, apply the same value as applies for the downlink bandwidth. rach-ConfigDedicated -The dedicated random access parameters. If absent the UE applies contention based random access as specified in TS 36.321 [6]. carrierBandwidth -Provides the parameters Downlink bandwidth, and Uplink bandwidth, see TS 36.101 [42]. -Conditional presence Explanation FDD The field is mandatory with default value (the default duplex distance defined for the concerned band, as specified in TS 36.101 [42]) in case of “FDD”; otherwise the field is not present. HO-toEUTRA The field is mandatory present in case of inter-RAT handover to E-UTRA; otherwise the field is optionally present, need ON. -– MobilityParametersCDMA2000 (1xRTT) -The MobilityParametersCDMA2000 contains the parameters provided to the UE for handover and CSFB support,as. defined in C.S0087 [44]. -MobilityParametersCDMA2000 information element --- ASN1START - -MobilityParametersCDMA2000 ::= OCTET STRING - --- ASN1STOP - -– MobilityStateParameters -The IE MobilityStateParameters contains parameters to determine UE mobility state. -MobilityStateParameters information element --- ASN1START - -MobilityStateParameters ::= SEQUENCE { - t-Evaluation ENUMERATED { - s30, s60, s120, s180, s240, spare3, spare2, spare1}, - t-HystNormal ENUMERATED { - s30, s60, s120, s180, s240, spare3, spare2, spare1}, - n-CellChangeMedium INTEGER (1..16), - n-CellChangeHigh INTEGER (1..16) -} - --- ASN1STOP - -MobilityStateParameters field descriptions t-Evaluation -The duration for evaluating criteria to enter mobility states. Corresponds to TCRmax in TS 36.304 [4]. Value in seconds, s30 corresponds to 30 s and so on. t-HystNormal -The additional duration for evaluating criteria to enter normal mobility state. Corresponds to TCRmaxHyst in TS 36.304 [4]. Value in seconds, s30 corresponds to 30 s and so on. n-CellChangeMedium -The number of cell changes to enter medium mobility state. Corresponds to NCR_M in TS 36.304 [4]. n-CellChangeHigh -The number of cell changes to enter high mobility state. Corresponds to NCR_H in TS 36.304 [4]. -– PhysCellId -The IE PhyslCellId is used to indicate the physical layer identity of the cell, as defined in TS 36.211 [21]. -PhysCellId information element --- ASN1START - -PhysCellId ::= INTEGER (0..503) - --- ASN1STOP - -– PhysCellIdRange -The IE PhysCellIdRange is used to encode either a single or a range of physical cell identities. The range is encoded by using a start value and by indicating the number of consecutive physical cell identities (including start) in the range. -PhysCellIdRange information element --- ASN1START - -PhysCellIdRange ::= SEQUENCE { - start PhysCellId, - range ENUMERATED { - n4, n8, n12, n16, n24, n32, n48, n64, n84, - n96, n128, n168, n252, n504, spare2, - spare1} OPTIONAL -- Need OP -} - --- ASN1STOP - -PhysCellIdRange field descriptions start -Indicates the lowest physical cell identity in the range. range -Indicates the number of physical cell identities in the range (including start). Value n4 corresponds with 4, n8 corresponds with 8 and so on. The UE shall apply value 1 in case the field is absent, in which case only the physical cell identity value indicated by start applies. -– PhysCellIdCDMA2000 -The IE PhysCellIdCDMA2000 identifies the PNOffset that represents the "Physical cell identity" in CDMA2000. -PhysCellIdCDMA2000 information element --- ASN1START - -PhysCellIdCDMA2000 ::= INTEGER (0..maxPNOffset) - --- ASN1STOP - -– PhysCellIdGERAN -The IE PhysCellIdGERAN contains the Base Station Identity Code (BSIC). -PhysCellIdGERAN information element --- ASN1START - -PhysCellIdGERAN ::= SEQUENCE { - networkColourCode BIT STRING (SIZE (3)), - baseStationColourCode BIT STRING (SIZE (3)) -} - --- ASN1STOP - -PhysCellIdGERAN field descriptions networkColourCode -Network Colour Code as defined in TS 23.003 [27]. baseStationColourCode -Base station Colour Code as defined in TS 23.003 [27]. -– PhysCellIdentityUTRA-FDD -The IE PhysCellIdUTRA-FDD is used to indicate the physical layer identity of the cell, i.e. the primary scrambling code, as defined in TS 25.331 [19]. -PhysCellIdUTRA-FDD information element --- ASN1START - -PhysCellIdUTRA-FDD ::= INTEGER (0..511) - --- ASN1STOP - -– PhysCellIdUTRA-TDD -The IE PhysCellIdUTRA-TDD is used to indicate the physical layer identity of the cell, i.e. the cell parameters ID (TDD), as specified in TS 25.331 [19]. Also corresponds to the Initial Cell Parameter Assignment in TS 25.223 [46]. -PhysCellIdUTRA-TDD information element --- ASN1START - -PhysCellIdUTRA-TDD ::= INTEGER (0..127) - --- ASN1STOP - -– PLMN-Identity -The IE PLMN-Identity identifies a Public Land Mobile Network. Further information regarding how to set the IE are specified in TS 23.003 [27]. -PLMN-Identity information element --- ASN1START - -PLMN-Identity ::= SEQUENCE { - mcc MCC OPTIONAL, -- Cond MCC - mnc MNC -} - -MCC ::= SEQUENCE (SIZE (3)) OF - MCC-MNC-Digit - -MNC ::= SEQUENCE (SIZE (2..3)) OF - MCC-MNC-Digit - -MCC-MNC-Digit ::= INTEGER (0..9) - - --- ASN1STOP - -PLMN-Identity field descriptions mcc -The first element contains the first MCC digit, the second element the second MCC digit and so on. If the field is absent, it takes the same value as the mcc of the immediately preceding IE PLMN-Identity. See TS 23.003 [27]. mnc -The first element contains the first MNC digit, the second element the second MNC digit and so on. See TS 23.003 [27]. -Conditional presence Explanation MCC This IE is mandatory when PLMN-Identity is included in CellGlobalIdEUTRA, in CellGlobalIdUTRA, in CellGlobalIdGERAN or in RegisteredMME. This IE is also mandatory in the first occurrence of the IE PLMN-Identity within the IE PLMN-IdentityList. Otherwise it is optional, need OP. -– PreRegistrationInfoHRPD --- ASN1START - -PreRegistrationInfoHRPD ::= SEQUENCE { - preRegistrationAllowed BOOLEAN, - preRegistrationZoneId PreRegistrationZoneIdHRPD OPTIONAL, -- cond PreRegAllowed - secondaryPreRegistrationZoneIdList SecondaryPreRegistrationZoneIdListHRPD OPTIONAL -- Need OR -} - -SecondaryPreRegistrationZoneIdListHRPD ::= SEQUENCE (SIZE (1..2)) OF PreRegistrationZoneIdHRPD - -PreRegistrationZoneIdHRPD ::= INTEGER (0..255) - --- ASN1STOP - -PreRegistrationInfoHRPD field descriptions preRegistrationAllowed -TRUE indicates that a UE shall perform a CDMA2000 HRPD pre-registration if the UE does not have a valid / current pre-registration. FALSE indicates that the UE is not allowed to perform CDMA2000 HRPD pre-registration in the current cell. preRegistrationZoneID -Used to control when the UE should re-register. secondaryPreRegistrationZoneIdList -Used to control when the UE should re-register. -Conditional presence Explanation PreRegAllowed The field is mandatory in case the preRegistrationAllowed is set to ‘true’. Otherwise the field is not present and the UE shall delete any existing value for this field. -– Q-RxLevMin -The IE Q-RxLevMin is used to indicate for cell re-selection the required minimum received RSRP level in the (E-UTRA) cell. Corresponds to parameter Qrxlevmin in 36.304 [4]. Actual value Qrxlevmin = IE value * 2 [dBm]. -Q-RxLevMin information element --- ASN1START - -Q-RxLevMin ::= INTEGER (-70..-22) - --- ASN1STOP - -– Q-OffsetRange -The IE Q-OffsetRange is used to indicate a cell or frequency specific offset to be applied when evaluating candidates for cell re-selection or when evaluating triggering conditions for measurement reporting. The value in dB. Value dB-24 corresponds to -24 dB, dB-22 corresponds to -22 dB and so on. -Q- OffsetRange information element --- ASN1START - -Q-OffsetRange ::= ENUMERATED { - dB-24, dB-22, dB-20, dB-18, dB-16, dB-14, - dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3, - dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5, - dB6, dB8, dB10, dB12, dB14, dB16, dB18, - dB20, dB22, dB24} - --- ASN1STOP - -– Q-OffsetRangeInterRAT -The IE Q-OffsetRangeInterRAT is used to indicate a frequency specific offset to be applied when evaluating triggering conditions for measurement reporting. The value in dB. -Q- OffsetRangeInterRAT information element --- ASN1START - -Q-OffsetRangeInterRAT ::= INTEGER (-15..15) - --- ASN1STOP - -– ReselectionThreshold -The IE ReselectionThreshold is used to indicate a threshold for cell reselection. Actual value of threshold in dB = IE value * 2. -ReselectionThreshold information element --- ASN1START - -ReselectionThreshold ::= INTEGER (0..31) - --- ASN1STOP - -– SpeedStateScaleFactors -The IE SpeedStateScaleFactors concerns factors, to be applied when the UE is in medium or high speed state, used for scaling a mobility control related parameter. -SpeedStateScaleFactors information element --- ASN1START - -SpeedStateScaleFactors ::= SEQUENCE { - sf-Medium ENUMERATED {oDot25, oDot5, oDot75, lDot0}, - sf-High ENUMERATED {oDot25, oDot5, oDot75, lDot0} -} --- ASN1STOP - -SpeedStateScaleFactors field descriptions sf-Medium -The concerned mobility control related parameter is multiplied with this factor if the UE is in Medium Mobility state as defined in TS 36.304 [4]. Value oDot25 corresponds to 0.25, oDot5 corresponds to 0.5 , oDot75 corresponds to 0.75 and so on. sf-High -The concerned mobility control related parameter is multiplied with this factor if the UE is in High Mobility state as defined in TS 36.304 [4]. Value oDot25 corresponds to 0.25, oDot5 corresponds to 0.5 , oDot75 corresponds to 0.75 and so on. -– SystemTimeInfoCDMA2000 -The IE SystemTimeInfoCDMA2000 informs the UE about the absolute time in the current cell. The UE uses this absolute time knowledge to derive the CDMA2000 Physical cell identity, expressed as PNOffset, of neighbour CDMA2000 cells. -NOTE: The UE needs the CDMA2000 system time with a certain level of accuracy for performing measurements as well as for communicating with the CDMA2000 network (HRPD or 1xRTT). -SystemTimeInfoCDMA2000 information element --- ASN1START - -SystemTimeInfoCDMA2000 ::= SEQUENCE { - cdma-EUTRA-Synchronisation BOOLEAN, - cdma-SystemTime CHOICE { - synchronousSystemTime BIT STRING (SIZE (39)), - asynchronousSystemTime BIT STRING (SIZE (49)) - } -} - --- ASN1STOP - -SystemTimeInfoCDMA2000 field descriptions cdma-EUTRA-Synchronisation -TRUE indicates that the networks are synchronised i.e. there is no drift in the timing between EUTRA and CDMA2000. FALSE indicates that the networks are not synchronised, i.e. the timing between E-UTRA and CDMA2000 can drift. synchronousSystemTime -CDMA2000 system time corresponding to the SFN boundary at or after the ending boundary of the SI-window in which SystemInformationBlockType8 is transmitted. If synchronized to CDMA2000 system time then the size is 39 bits and the unit is 10 ms based on a 1.2288 Mcps chip rate. asynchronousSystemTime -The CDMA2000 system time corresponding to the SFN boundary at or after the ending boundary of the SI-Window in which SystemInformationBlockType8 is transmitted. If not synchronized then the size is 49 bits and the unit is [8 CDMA2000 chips based on 1.2288 Mcps]. -– TrackingAreaCode -The IE TrackingAreaCode is used to identify a tracking area within the scope of a PLMN, see TS 24.301 [35]. -TrackingAreaCode information element --- ASN1START - -TrackingAreaCode ::= BIT STRING (SIZE (16)) - --- ASN1STOP - -– T-Reselection -The IE T-Reselection concerns the cell reselection timer TreselectionRAT for E-UTRA, UTRA, GERAN or CDMA2000. Value in seconds. -T-Reselection information element --- ASN1START - -T-Reselection ::= INTEGER (0..7) - --- ASN1STOP - - -6.3.5 Measurement information elements -– AllowedMeasBandwidth -The IE AllowedMeasBandwidth is used to indicate the maximum allowed measurement bandwidth on a carrier frequency as defined by the parameter Transmission Bandwidth Configuration "NRB" TS 36.104 [47]. The values mbw6, mbw15, mbw25, mbw50, mbw75, mbw100 indicate 6, 15, 25, 50, 75 and 100 resource blocks respectively. -AllowedMeasBandwidth information element --- ASN1START - -AllowedMeasBandwidth ::= ENUMERATED {mbw6, mbw15, mbw25, mbw50, mbw75, mbw100} - --- ASN1STOP - -– Hysteresis -The IE Hysteresis is a parameter used within the entry and leave condition of an event triggered reporting condition. The actual value is IE value * 0.5 dB. -Hysteresis information element --- ASN1START - -Hysteresis ::= INTEGER (0..30) - --- ASN1STOP - -– MeasConfig -The IE MeasConfig specifies measurements to be performed by the UE, and covers intra-frequency, inter-frequency and inter-RAT mobility as well as configuration of measurement gaps. -MeasConfig information element --- ASN1START - -MeasConfig ::= SEQUENCE { - -- Measurement objects - measObjectToRemoveList MeasObjectToRemoveList OPTIONAL, -- Need ON - measObjectToAddModList MeasObjectToAddModList OPTIONAL, -- Need ON - -- Reporting configurations - reportConfigToRemoveList ReportConfigToRemoveList OPTIONAL, -- Need ON - reportConfigToAddModList ReportConfigToAddModList OPTIONAL, -- Need ON - -- Measurement identities - measIdToRemoveList MeasIdToRemoveList OPTIONAL, -- Need ON - measIdToAddModList MeasIdToAddModList OPTIONAL, -- Need ON - -- Other parameters - quantityConfig QuantityConfig OPTIONAL, -- Need ON - measGapConfig MeasGapConfig OPTIONAL, -- Need ON - s-Measure RSRP-Range OPTIONAL, -- Need ON - preRegistrationInfoHRPD PreRegistrationInfoHRPD OPTIONAL, -- Need OP - speedStatePars CHOICE { - release NULL, - setup SEQUENCE { - mobilityStateParameters MobilityStateParameters, - timeToTrigger-SF SpeedStateScaleFactors - } - } OPTIONAL, -- Need ON - ... -} - -MeasIdToRemoveList ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasId - -MeasObjectToRemoveList ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectId - -ReportConfigToRemoveList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigId - --- ASN1STOP - -MeasConfig field descriptions measObjectToRemoveList -List of measurement objects to remove. measObjectId -Used to identify a measurement object configuration. measObject -Specifies measurement object configurations for EUTRA, UTRA, GERAN, or CDMA2000 measurements. reportConfigToRemoveList -List of measurement reporting configurations to remove. reportConfigId -Used to identify a measurement reporting configuration. reportConfig -Specifies measurement reporting configurations for EUTRA, UTRA, GERAN, or CDMA2000 measurements. measIdToRemoveList -List of measurement identities to remove. measGapConfig -Used to setup and release measurement gaps. s-Measure -Serving cell quality threshold controlling whether or not the UE is required to perform measurements of intra-frequency, inter-frequency and inter-RAT neighbouring cells. Value “0” indicates to disable s-Measure. PreRegistrationInfoHRPD -The CDMA2000 HRPD Pre-Registration Information tells the UE if it should pre-register with the CDMA2000 HRPD network and identifies the Pre-registration zone to the UE. timeToTrigger-SF -The timeToTrigger in ReportConfigEUTRA and in ReportConfigInterRAT are multiplied with the scaling factor applicable for the UE’s speed state. -– MeasGapConfig -The IE MeasGapConfig specifies the measurement gap configuration and controls setup/ release of measurement gaps. -MeasGapConfig information element --- ASN1START - -MeasGapConfig ::= CHOICE { - release NULL, - setup SEQUENCE { - gapOffset CHOICE { - gp0 INTEGER (0..39), - gp1 INTEGER (0..79), - ... - } - } -} - --- ASN1STOP - -MeasGapConfig field descriptions gapOffset -Value gapOffset of gp0 corresponds to gap offset of Gap Pattern Id “0” with MGRP = 40ms, gapOffset of gp1 corresponds to gap offset of Gap Pattern Id “1” with MGRP = 80ms. Also used to specify the measurement gap pattern to be applied, as defined in TS 36.133 [16]. -– MeasId -The IE MeasId is used to identify a measurement configuration, i.e., linking of a measurement object and a reporting configuration. -MeasId information element --- ASN1START - -MeasId ::= INTEGER (1..maxMeasId) - --- ASN1STOP - -– MeasIdToAddModList -The IE MeasIdToAddModList concerns a list of measurement identities to add or modify, with for each entry the measId, the associated measObjectId and the associated reportConfigId. -MeasIdToAddModList information element --- ASN1START - -MeasIdToAddModList ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasIdToAddMod - -MeasIdToAddMod ::= SEQUENCE { - measId MeasId, - measObjectId MeasObjectId, - reportConfigId ReportConfigId -} - --- ASN1STOP - -– MeasObjectCDMA2000 -The IE MeasObjectCDMA2000 specifies information applicable for inter-RAT CDMA2000 neighbouring cells. -MeasObjectCDMA2000 information element --- ASN1START - -MeasObjectCDMA2000 ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - carrierFreq CarrierFreqCDMA2000, - searchWindowSize INTEGER (0..15) OPTIONAL, -- Need ON - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CellsToAddModListCDMA2000 OPTIONAL, -- Need ON - cellForWhichToReportCGI PhysCellIdCDMA2000 OPTIONAL, -- Need ON - ... -} - -CellsToAddModListCDMA2000 ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModCDMA2000 - -CellsToAddModCDMA2000 ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdCDMA2000 -} - --- ASN1STOP - -MeasObjectCDMA2000 field descriptions cdma2000-Type -The type of CDMA2000 network: CDMA2000 1xRTT or CDMA2000 HRPD. carrierInfo -Identifies CDMA2000 carrier frequency for which this configuration is valid. searchWindowSize -Provides the search window size to be used by the UE for the neighbouring pilot, see C.S0005-A [25]. cellsToRemoveList -List of cells to remove from the neighbouring cell list. cellsToAddModList -List of cells to add/ modify in the neighbouring cell list. cellIndex -Entry index in the neighbouring cell list. physCellId -CDMA2000 Physical cell identity of a cell in neighbouring cell list expressed as PNOffset. -– MeasObjectEUTRA -The IE MeasObjectEUTRA specifies information applicable for intra-frequency or inter-frequency EUTRA neighbouring cells. -MeasObjectEUTRA information element --- ASN1START - -MeasObjectEUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueEUTRA, - allowedMeasBandwidth AllowedMeasBandwidth, - presenceAntennaPort1 PresenceAntennaPort1, - neighCellConfig NeighCellConfig, - offsetFreq Q-OffsetRange DEFAULT dB0, - -- Neighbour cell list - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CellsToAddModList OPTIONAL, -- Need ON - -- Black list - blackCellsToRemoveList CellIndexList OPTIONAL, -- Need ON - blackCellsToAddModList BlackCellsToAddModList OPTIONAL, -- Need ON - cellForWhichToReportCGI PhysCellId OPTIONAL, -- Need ON - ... -} - -CellsToAddModList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddMod - -CellsToAddMod ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellId, - cellIndividualOffset Q-OffsetRange -} - -BlackCellsToAddModList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF BlackCellsToAddMod - -BlackCellsToAddMod ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellIdRange PhysCellIdRange -} - --- ASN1STOP - -MeasObjectEUTRA field descriptions carrierFreq -Identifies EUTRA carrier frequency for which this configuration is valid. offsetFreq -Offset value applicable to the carrier frequency. Value dB-24 corresponds to -24 dB, dB-22 corresponds to -22 dB and so on. cellsToRemoveList -List of cells to remove from the neighbouring cell list. cellsToAddModList -List of cells to add/ modify in the neighbouring cell list. cellIndex -Entry index in the neighbouring cell list. An entry may concern a range of cells, in which case this value applies to the entire range. physCellId -Physical cell identity of a cell in neighbouring cell list. cellIndividualOffset -Cell individual offset applicable to a specific neighbouring cell. Value dB-24 corresponds to -24 dB, dB-22 corresponds to -22 dB and so on. blackCellsToRemoveList -List of cells to remove from the black list of cells. blackCellsToAddMoList -List of cells to add/ modify in the black list of cells. physCellIdRange -Physical cell identity or a range of physical cell identities of cells in the black list. -– MeasObjectGERAN -The IE MeasObjectGERAN specifies information applicable for inter-RAT GERAN neighbouring frequencies. -MeasObjectGERAN information element --- ASN1START - -MeasObjectGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - ncc-Permitted BIT STRING(SIZE (8)) DEFAULT '11111111'B, - cellForWhichToReportCGI PhysCellIdGERAN OPTIONAL, -- Need ON - ... -} - --- ASN1STOP - -MeasObjectGERAN field descriptions ncc-Permitted -Field encoded as a bit map, where bit N is set to "0" if a BCCH carrier with NCC = N-1 is not permitted for monitoring and set to "1" if a BCCH carrier with NCC = N-1 is permitted for monitoring; N = 1 to 8; bit 1 of the bitmap is the leading bit of the bit string. -– MeasObjectId -The IE MeasObjectId used to identify a measurement object configuration. -MeasObjectId information element --- ASN1START - -MeasObjectId ::= INTEGER (1..maxObjectId) - --- ASN1STOP - -– MeasObjectToAddModList -The IE MeasObjectToAddModList concerns a list of measurement objects to add or modify -MeasObjectToAddModList information element --- ASN1START - -MeasObjectToAddModList ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectToAddMod - -MeasObjectToAddMod ::= SEQUENCE { - measObjectId MeasObjectId, - measObject CHOICE { - measObjectEUTRA MeasObjectEUTRA, - measObjectUTRA MeasObjectUTRA, - measObjectGERAN MeasObjectGERAN, - measObjectCDMA2000 MeasObjectCDMA2000, - ... - } -} - --- ASN1STOP - -– MeasObjectUTRA -The IE MeasObjectUTRA specifies information applicable for inter-RAT UTRA neighbouring cells. -MeasObjectUTRA information element --- ASN1START - -MeasObjectUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CHOICE { - cellsToAddModListUTRA-FDD CellsToAddModListUTRA-FDD, - cellsToAddModListUTRA-TDD CellsToAddModListUTRA-TDD - } OPTIONAL, -- Need ON - cellForWhichToReportCGI CHOICE { - utra-FDD PhysCellIdUTRA-FDD, - utra-TDD PhysCellIdUTRA-TDD - } OPTIONAL, -- Need ON - ... -} - -CellsToAddModListUTRA-FDD ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModUTRA-FDD - -CellsToAddModUTRA-FDD ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdUTRA-FDD -} - -CellsToAddModListUTRA-TDD ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModUTRA-TDD - -CellsToAddModUTRA-TDD ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdUTRA-TDD -} - --- ASN1STOP - -MeasObjectUTRA field descriptions carrierFreq -Identifies UTRA carrier frequency for which this configuration is valid. cellsToRemoveList -List of cells to remove from the neighbouring cell list. cellsToAddModListUTRA-FDD -List of UTRA FDD cells to add/ modify in the neighbouring cell list. cellsToAddModListUTRA-TDD -List of UTRA TDD cells to add/modify in the neighbouring cell list. cellIndex -Entry index in the neighbouring cell list. -– MeasResults -The IE MeasResults covers measured results for intra-frequency, inter-frequency and inter- RAT mobility. -MeasResults information element --- ASN1START - -MeasResults ::= SEQUENCE { - measId MeasId, - measResultServCell SEQUENCE { - rsrpResult RSRP-Range, - rsrqResult RSRQ-Range - }, - measResultNeighCells CHOICE { - measResultListEUTRA MeasResultListEUTRA, - measResultListUTRA MeasResultListUTRA, - measResultListGERAN MeasResultListGERAN, - measResultsCDMA2000 MeasResultsCDMA2000, - ... - } OPTIONAL, - ... -} - -MeasResultListEUTRA ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultEUTRA - -MeasResultEUTRA ::= SEQUENCE { - physCellId PhysCellId, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdEUTRA, - trackingAreaCode TrackingAreaCode, - plmn-IdentityList PLMN-IdentityList2 OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - rsrpResult RSRP-Range OPTIONAL, - rsrqResult RSRQ-Range OPTIONAL, - ... - } -} - -MeasResultListUTRA ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultUTRA - -MeasResultUTRA ::= SEQUENCE { - physCellId CHOICE { - fdd PhysCellIdUTRA-FDD, - tdd PhysCellIdUTRA-TDD - }, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdUTRA, - locationAreaCode BIT STRING (SIZE (16)) OPTIONAL, - routingAreaCode BIT STRING (SIZE (8)) OPTIONAL, - plmn-IdentityList PLMN-IdentityList2 OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - utra-RSCP INTEGER (-5..91) OPTIONAL, - utra-EcN0 INTEGER (0..49) OPTIONAL, - ... - } -} - -MeasResultListGERAN ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultGERAN - -MeasResultGERAN ::= SEQUENCE { - carrierFreq CarrierFreqGERAN, - physCellId PhysCellIdGERAN, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdGERAN, - routingAreaCode BIT STRING (SIZE (8)) OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - rssi INTEGER (0..63), - ... - } -} - -MeasResultsCDMA2000 ::= SEQUENCE { - preRegistrationStatusHRPD BOOLEAN, - measResultListCDMA2000 MeasResultListCDMA2000 -} - -MeasResultListCDMA2000 ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultCDMA2000 - -MeasResultCDMA2000 ::= SEQUENCE { - physCellId PhysCellIdCDMA2000, - cgi-Info CellGlobalIdCDMA2000 OPTIONAL, - measResult SEQUENCE { - pilotPnPhase INTEGER (0..32767) OPTIONAL, - pilotStrength INTEGER (0..63), - ... - } -} - -PLMN-IdentityList2 ::= SEQUENCE (SIZE (1..5)) OF PLMN-Identity - --- ASN1STOP - -MeasResults field descriptions measId -Identifies the measurement identity for which the reporting is being performed. measResultServCell -Measured result of the serving cell. measResultListEUTRA -List of measured results for the maximum number of reported best cells for an EUTRA measurement identity. rsrpResult -Measured RSRP result of an EUTRA cell. -The rsrpResult is only reported if configured by the eNB. rsrqResult -Measured RSRQ result of an EUTRA cell. -The rsrqResult is only reported if configured by the eNB. measResultListUTRA -List of measured results for the maximum number of reported best cells for a UTRA measurement identity. measResultListGERAN -List of measured results for the maximum number of reported best cells or frequencies for a GERAN measurement identity. measResultsCDMA2000 -Contains the CDMA2000 HRPD pre-registration status and the list of CDMA2000 measurements. preRegistrationStatusHRPD -Set to TRUE if the UE is currently pre-registered with CDMA2000 HRPD. Otherwise set to FALSE. This can be ignored by the eNB for CDMA2000 1xRTT. measResultListCDMA2000 -List of measured results for the maximum number of reported best cells for a CDMA2000 measurement identity. measResult -Measured result of an EUTRA cell; -Measured result of a UTRA cell; -Measured result of a GERAN cell or frequency; or -Measured result of a CDMA2000 cell. utra-RSCP -According to CPICH_RSCP in TS 25.133 [29] for FDD and P-CCPCH_RSCP in TS 25.123 [30] for TDD. Thirty-one spare values. utra-EcN0 -According to CPICH_Ec/No in TS 25.133 [29] for FDD. Fourteen spare values. The field is not present for TDD. rssi -GERAN Carrier RSSI. RXLEV is mapped to a value between 0 and 63, TS 45.008 [28]. When mapping the RXLEV value to the RSSI bit string, the first/leftmost bit of the bit string contains the most significant bit. locationAreaCode -A fixed length code identifying the location area within a PLMN, as defined in TS 23.003 [27]. routingAreaCode -The RAC identity read from broadcast information, as defined in TS 23.003 [27]. plmn-IdentityList -The list of PLMN Identity read from broadcast information when the multiple PLMN Identities are broadcast. This field contains the list of identities starting from the second entry of PLMN Identities in the broadcast information. pilotPnPhase -Indicates the arrival time of a CDMA2000 pilot, measured relative to the UE’s time reference in units of PN chips, see C.S0005-A [25]. This information is used in SRVCC handover procedure to CDMA2000 1xRTT. pilotStrength -CDMA2000 Pilot Strength, the ratio of pilot power to total power in the signal bandwidth of a CDMA2000 Forward Channel. See C.S0005-A [25] for CDMA2000 1xRTT and C.S0024-A [26] for CDMA2000 HRPD. -– QuantityConfig -The IE QuantityConfig specifies the measurement quantities and layer 3 filtering coefficients for E-UTRA and inter-RAT measurements. -QuantityConfig information element --- ASN1START - -QuantityConfig ::= SEQUENCE { - quantityConfigEUTRA QuantityConfigEUTRA OPTIONAL, -- Need ON - quantityConfigUTRA QuantityConfigUTRA OPTIONAL, -- Need ON - quantityConfigGERAN QuantityConfigGERAN OPTIONAL, -- Need ON - quantityConfigCDMA2000 QuantityConfigCDMA2000 OPTIONAL, -- Need ON - ... -} - -QuantityConfigEUTRA ::= SEQUENCE { - filterCoefficientRSRP FilterCoefficient DEFAULT fc4, - filterCoefficientRSRQ FilterCoefficient DEFAULT fc4 -} - -QuantityConfigUTRA ::= SEQUENCE { - measQuantityUTRA-FDD ENUMERATED {cpich-RSCP, cpich-EcN0}, - measQuantityUTRA-TDD ENUMERATED {pccpch-RSCP}, - filterCoefficient FilterCoefficient DEFAULT fc4 -} - -QuantityConfigGERAN ::= SEQUENCE { - measQuantityGERAN ENUMERATED {rssi}, - filterCoefficient FilterCoefficient DEFAULT fc2 -} - -QuantityConfigCDMA2000 ::= SEQUENCE { - measQuantityCDMA2000 ENUMERATED {pilotStrength, pilotPnPhaseAndPilotStrength} -} - --- ASN1STOP - -QuantityConfig field descriptions quantityConfigEUTRA -Specifies filter configurations for EUTRA measurements. quantityConfigUTRA -Specifies quantity and filter configurations for UTRA measurements. measQuantityUTRA -Measurement quantity used for UTRA measurements. quantityConfigGERAN -Specifies quantity and filter configurations for GERAN measurements. measQuantityGERAN -Measurement quantity used for GERAN measurements. quantityConfigCDMA2000 -Specifies quantity configurations for CDMA2000 measurements. measQuantityCDMA2000 -Measurement quantity used for CDMA2000 measurements. pilotPnPhaseAndPilotStrength is only applicable for MeasObjectCDMA2000 of cdma2000-Type = type1XRTT. filterCoefficientRSRP -Specifies the filtering coefficient used for RSRP. filterCoefficientRSRQ -Specifies the filtering coefficient used for RSRQ. -– ReportConfigEUTRA -The IE ReportConfigEUTRA specifies criteria for triggering of an EUTRA measurement reporting event. The EUTRA measurement reporting events are labelled AN with N equal to 1, 2 and so on. -Event A1: Serving becomes better than absolute threshold; -Event A2: Serving becomes worse than absolute threshold; -Event A3: Neighbour becomes amount of offset better than serving; -Event A4: Neighbour becomes better than absolute threshold; -Event A5: Serving becomes worse than absolute threshold1 AND Neighbour becomes better than another absolute threshold2. -ReportConfigEUTRA information element --- ASN1START - -ReportConfigEUTRA ::= SEQUENCE { - triggerType CHOICE { - event SEQUENCE { - eventId CHOICE { - eventA1 SEQUENCE { - a1-Threshold ThresholdEUTRA - }, - eventA2 SEQUENCE { - a2-Threshold ThresholdEUTRA - }, - eventA3 SEQUENCE { - a3-Offset INTEGER (-30..30), - reportOnLeave BOOLEAN - }, - eventA4 SEQUENCE { - a4-Threshold ThresholdEUTRA - }, - eventA5 SEQUENCE { - a5-Threshold1 ThresholdEUTRA, - a5-Threshold2 ThresholdEUTRA - }, - ... - }, - hysteresis Hysteresis, - timeToTrigger TimeToTrigger - }, - periodical SEQUENCE { - purpose ENUMERATED { - reportStrongestCells, reportCGI} - } - }, - triggerQuantity ENUMERATED {rsrp, rsrq}, - reportQuantity ENUMERATED {sameAsTriggerQuantity, both}, - maxReportCells INTEGER (1..maxCellReport), - reportInterval ReportInterval, - reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity}, - ... -} - -ThresholdEUTRA ::= CHOICE{ - threshold-RSRP RSRP-Range, - threshold-RSRQ RSRQ-Range -} - --- ASN1STOP - -ReportConfigEUTRA field descriptions eventId -Choice of EUTRA event triggered reporting criteria. aN-ThresholdM -Threshold to be used in EUTRA measurement report triggering condition for event number aN. If multiple thresholds are defined for event number aN, the thresholds are differentiated by M. a3-Offset -Offset value to be used in EUTRA measurement report triggering condition for event a3. The actual value is IE value * 0.5 dB. reportOnLeave -Indicates whether or not the UE shall initiate the measurement reporting procedure when the leaving condition is met for a cell in cellsTriggeredList, as specified in 5.5.4.1. triggerQuantity -The quantities used to evaluate the triggering condition for the event. The values rsrp and rsrq correspond to Reference Signal Received Power (RSRP) and Reference Signal Received Quality (RSRQ), see TS 36.214 [48]. timeToTrigger -Time during which specific criteria for the event needs to be met in order to trigger a measurement report. reportQuantity -The quantities to be included in the measurement report. The value both means that both the rsrp and rsrq quantities are to be included in the measurement report. maxReportCells -Max number of cells, excluding the serving cell, to include in the measurement report. reportAmount -Number of measurement reports applicable for triggerType ‘event’ as well as for triggerType ‘periodical’. In case purpose is set to ‘reportCGI’ only value 1 applies. ThresholdEUTRA -For RSRP: RSRP based threshold for event evaluation. -For RSRQ: RSRQ based threshold for event evaluation. -– ReportConfigId -The IE ReportConfigId is used to identify a measurement reporting configuration. -ReportConfigId information element --- ASN1START - -ReportConfigId ::= INTEGER (1..maxReportConfigId) - --- ASN1STOP - -– ReportConfigInterRAT -The IE ReportConfigInterRAT specifies criteria for triggering of an inter-RAT measurement reporting event. The inter-RAT measurement reporting events are labelled BN with N equal to 1, 2 and so on. -Event B1: Neighbour becomes better than absolute threshold; -Event B2: Serving becomes worse than absolute threshold1 AND Neighbour becomes better than another absolute threshold2. -The b1 and b2 event thresholds for CDMA2000 are the CDMA2000 pilot detection thresholds are expressed as an unsigned binary number equal to [-2 x 10 log 10 Ec/Io] in units of 0.5dB, see C.S0005-A [25] for details. -ReportConfigInterRAT information element --- ASN1START - -ReportConfigInterRAT ::= SEQUENCE { - triggerType CHOICE { - event SEQUENCE { - eventId CHOICE { - eventB1 SEQUENCE { - b1-Threshold CHOICE { - b1-ThresholdUTRA ThresholdUTRA, - b1-ThresholdGERAN ThresholdGERAN, - b1-ThresholdCDMA2000 ThresholdCDMA2000 - } - }, - eventB2 SEQUENCE { - b2-Threshold1 ThresholdEUTRA, - b2-Threshold2 CHOICE { - b2-Threshold2UTRA ThresholdUTRA, - b2-Threshold2GERAN ThresholdGERAN, - b2-Threshold2CDMA2000 ThresholdCDMA2000 - } - }, - ... - }, - hysteresis Hysteresis, - timeToTrigger TimeToTrigger - }, - periodical SEQUENCE { - purpose ENUMERATED { - reportStrongestCells, - reportStrongestCellsForSON, - reportCGI} - } - }, - maxReportCells INTEGER (1..maxCellReport), - reportInterval ReportInterval, - reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity}, - ... -} - -ThresholdUTRA ::= CHOICE{ - utra-RSCP INTEGER (-5..91), - utra-EcN0 INTEGER (0..49) -} - -ThresholdGERAN ::= INTEGER (0..63) - -ThresholdCDMA2000 ::= INTEGER (0..63) - --- ASN1STOP - -ReportConfigInterRAT field descriptions eventId -Choice of inter-RAT event triggered reporting criteria. bN-ThresholdM -Threshold to be used in inter RAT measurement report triggering condition for event number bN. If multiple thresholds are defined for event number bN, the thresholds are differentiated by M. timeToTrigger -Time during which specific criteria for the event needs to be met in order to trigger a measurement report. Purpose -reportStrongestCellsForSON applies only in case reportConfig is linked to a measObject set to ‘measObjectUTRA’ or ‘measObjectCDMA2000’. maxReportCells -Max number of cells, excluding the serving cell, to include in the measurement report. In case purpose is set to ‘reportStrongestCellsForSON’ only value 1 applies. reportAmount -Number of measurement reports applicable for triggerType ‘event’ as well as for triggerType ‘periodical’. In case purpose is set to ‘reportCGI’ or ‘reportStrongestCellsForSON’ only value 1 applies. ThresholdUTRA -utra-RSCP corresponds to CPICH_RSCP in TS 25.133 [29] for FDD and P-CCPCH_RSCP in TS 25.123 [30] for TDD. utra-EcN0 corresponds to CPICH_Ec/No in TS 25.133 [29] for FDD, and is not applicable for TDD. -For utra-RSCP: The actual value is IE value – 115 dBm. Integer value according to mapping table in TS 25.133 [29] and TS 25.123 [30], for FDD and TDD, respectively. -For utra-EcN0: The actual value is (IE value – 49)/2 dB. Integer value according to mapping table in TS 25.133 [29]. ThresholdGERAN -The actual value is IE value – 110 dBm. . Integer value according to mapping table in TS 45.008 [28]. -– ReportConfigToAddModList -The IE ReportConfigToAddModList concerns a list of reporting configurations to add or modify -ReportConfigToAddModList information element --- ASN1START - -ReportConfigToAddModList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigToAddMod - -ReportConfigToAddMod ::= SEQUENCE { - reportConfigId ReportConfigId, - reportConfig CHOICE { - reportConfigEUTRA ReportConfigEUTRA, - reportConfigInterRAT ReportConfigInterRAT - } -} - - --- ASN1STOP - -– ReportInterval -The ReportInterval indicates the interval between periodical reports. The ReportInterval is applicable if the UE performs periodical reporting (i.e. when reportAmount exceeds 1), for triggerType ‘event’ as well as for triggerType ‘periodical’. Value ms120 corresponds with 120 ms, ms240 corresponds with 240 ms and so on, while value min1 corresponds with 1 min, min6 corresponds with 6 min and so on. -ReportInterval information element --- ASN1START - -ReportInterval ::= ENUMERATED { - ms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, - min1, min6, min12, min30, min60, spare3, spare2, spare1} - --- ASN1STOP - -– RSRP-Range -The IE RSRP-Range specifies the value range used in RSRP measurements and thresholds. Integer value for RSRP according to mapping table in TS 36.133 [16]. -RSRP-Range information element --- ASN1START - -RSRP-Range ::= INTEGER(0..97) - --- ASN1STOP - -– RSRQ-Range -The IE RSRQ-Range specifies the value range used in RSRQ measurements and thresholds. Integer value for RSRQ according to mapping table in TS 36.133 [16]. -RSRQ-Range information element --- ASN1START - -RSRQ-Range ::= INTEGER(0..34) - --- ASN1STOP - -– TimeToTrigger -The IE TimeToTrigger specifies the value range used for time to trigger parameter, which concerns the time during which specific criteria for the event needs to be met in order to trigger a measurement report. Value ms0 corresponds to 0 ms, ms40 corresponds to 40 ms, and so on. -TimeToTrigger information element --- ASN1START - -TimeToTrigger ::= ENUMERATED { - ms0, ms40, ms64, ms80, ms100, ms128, ms160, ms256, - ms320, ms480, ms512, ms640, ms1024, ms1280, ms2560, - ms5120} - --- ASN1STOP - -6.3.6 Other information elements -– C-RNTI -The IE C-RNTI identifies a UE having a RRC connection within a cell. -C-RNTI information element --- ASN1START - -C-RNTI ::= BIT STRING (SIZE (16)) - --- ASN1STOP - -– DedicatedInfoCDMA2000 -The DedicatedInfoCDMA2000 is used to transfer UE specific CDMA2000 information between the network and the UE. The RRC layer is transparent for this information. -DedicatedInfoCDMA2000 information element --- ASN1START - -DedicatedInfoCDMA2000 ::= OCTET STRING - --- ASN1STOP - -– DedicatedInfoNAS -The IE DedicatedInfoNAS is used to transfer UE specific NAS layer information between the network and the UE. The RRC layer is transparent for this information. -DedicatedInfoNAS information element --- ASN1START - -DedicatedInfoNAS ::= OCTET STRING - --- ASN1STOP - -– FilterCoefficient -The IE FilterCoefficient specifies the measurement filtering coefficient. Value fc0 corresponds to k = 0, fc1 corresponds to k = 1, and so on. -FilterCoefficient information element --- ASN1START - -FilterCoefficient ::= ENUMERATED { - fc0, fc1, fc2, fc3, fc4, fc5, - fc6, fc7, fc8, fc9, fc11, fc13, - fc15, fc17, fc19, spare1, ...} - --- ASN1STOP - -– MMEC -The IE MMEC identifies an MME within the scope of an MME Group within a PLMN, see TS 23.003 [27]. -MMEC information element --- ASN1START - -MMEC ::= BIT STRING (SIZE (8)) - --- ASN1STOP - - -– NeighCellConfig -The IE NeighCellConfig is used to provide the information related to MBSFN and TDD UL/DL configuration of neighbour cells. -NeighCellConfig information element --- ASN1START - -NeighCellConfig ::= BIT STRING (SIZE (2)) - --- ASN1STOP - -NeighCellConfig field descriptions neighCellConfig -Provides information related to MBSFN and TDD UL/DL configuration of neighbour cells of this frequency -00: Not all neighbour cells have the same MBSFN subframe allocation as serving cell -10: The MBSFN subframe allocations of all neighbour cells are identical to or subsets of that in the serving cell -01: No MBSFN subframes are present in all neighbour cells -11: Different UL/DL allocation in neighbouring cells for TDD compared to the serving cell -For TDD, 00, 10 and 01 are only used for same UL/DL allocation in neighbouring cells compared to the serving cell. -– RAND-CDMA2000 (1xRTT) -The RAND-CDMA2000 concerns a random value, generated by the eNB, to be passed to the CDMA2000 upper layers. -RAND-CDMA2000 information element --- ASN1START - -RAND-CDMA2000 ::= BIT STRING (SIZE (32)) - --- ASN1STOP - -– RAT-Type -The IE RAT-Type is used to indicate the radio access technology (RAT), including EUTRA, of the requested/ transferred UE capabilities. -RAT-Type information element --- ASN1START - -RAT-Type ::= ENUMERATED { - eutra, utra, geran-cs, geran-ps, cdma2000-1XRTT, - spare3, spare2, spare1, ...} - --- ASN1STOP - -– RRC-TransactionIdentifier -The IE RRC-TransactionIdentifier is used, together with the message type, for the identification of an RRC procedure (transaction). -RRC-TransactionIdentifier information element --- ASN1START - -RRC-TransactionIdentifier ::= INTEGER (0..3) - --- ASN1STOP - -– S-TMSI -The IE S-TMSI contains an S-Temporary Mobile Subscriber Identity, a temporary UE identity provided by the EPC which uniquely identifies the UE within the tracking area, see TS 23.003 [27]. -S-TMSI information element --- ASN1START - -S-TMSI ::= SEQUENCE { - mmec MMEC, - m-TMSI BIT STRING (SIZE (32)) -} - --- ASN1STOP - -S-TMSI field descriptions m-TMSI -The first/leftmost bit of the bit string contains the most significant bit of the M-TMSI. -– UE-CapabilityRAT-ContainerList -The IE UE-CapabilityRAT-ContainerList contains list of containers, one for each RAT for which UE capabilities are transferred, if any. -UE-CapabilityRAT-ContainerList information element --- ASN1START - -UE-CapabilityRAT-ContainerList ::=SEQUENCE (SIZE (0..maxRAT-Capabilities)) OF UE-CapabilityRAT-Container - -UE-CapabilityRAT-Container ::= SEQUENCE { - rat-Type RAT-Type, - ueCapabilityRAT-Container OCTET STRING -} - --- ASN1STOP - -UECapabilityRAT-ContainerList field descriptions ueCapabilityRAT-Container -Container for the UE capabilities of the indicated RAT. The encoding is defined in the specification of each RAT: -For EUTRA: the encoding of UE capabilities is defined in IE UE-EUTRA-Capability. -For UTRA: the octet string contains the INTER RAT HANDOVER INFO message defined in TS 25.331 [19]. -For GERAN CS: the octet string contains the concatenated string of the Mobile Station Classmark 2 and Mobile Station Classmark 3. The first 5 octets correspond to Mobile Station Classmark 2 and the following octets correspond to Mobile Station Classmark 3. The Mobile Station Classmark 2 is formatted as 'TLV' and is coded in the same way as the Mobile Station Classmark 2 information element in TS 24.008 [49]. The first octet is the Mobile station classmark 2 IEI and its value shall be set to 33H. The second octet is the Length of mobile station classmark 2 and its value shall be set to 3. The octet 3 contains the first octet of the value part of the Mobile Station Classmark 2 information element, the octet 4 contains the second octet of the value part of the Mobile Station Classmark 2 information element and so on. For each of these octets, the first/ leftmost/ most significant bit of the octet contains b8 of the corresponding octet of the Mobile Station Classmark 2. The Mobile Station Classmark 3 is formatted as 'V' and is coded in the same way as the value part in the Mobile station classmark 3 information element in TS 24.008 [49]. The sixth octet of this octet string contains octet 1 of the value part of Mobile station classmark 3, the seventh of octet of this octet string contains octet 2 of the value part of Mobile station classmark 3 and so on. Note. -For GERAN PS: the encoding of UE capabilities is formatted as 'V' and is coded in the same way as the value part in the MS Radio Access Capability information element in TS 36.306 [5]. -For CDMA2000-1XRTT: the octet string contains the A21 Mobile Subscription Information and the encoding of this is defined in A.S0008 [33]. The A21 Mobile Subscription Information contains the supported CDMA2000 1xRTT band class and band sub-class information. NOTE: The value part is specified by means of CSN.1, which encoding results in a bit string, to which final padding may be appended up to the next octet boundary TS 24.008 [49]. The first/ leftmost bit of the CSN.1 bit string is placed in the first/ leftmost/ most significant bit of the first octet. This continues until the last bit of the CSN.1 bit string, which is placed in the last/ rightmost/ least significant bit of the last octet. -– UE-EUTRA-Capability -The IE UE-EUTRA-Capability is used to convey the E-UTRA UE Radio Access Capability Parameters, see TS 36.306 [5], to the network. The IE UE-EUTRA-Capability is transferred in E-UTRA or in another RAT. -UE-EUTRA-Capability information element --- ASN1START - -UE-EUTRA-Capability ::= SEQUENCE { - accessStratumRelease AccessStratumRelease, - ue-Category INTEGER (1..5), - pdcp-Parameters PDCP-Parameters, - phyLayerParameters PhyLayerParameters, - rf-Parameters RF-Parameters, - measParameters MeasParameters, - featureGroupIndicators BIT STRING (SIZE (32)) OPTIONAL, - interRAT-Parameters SEQUENCE { - utraFDD IRAT-ParametersUTRA-FDD OPTIONAL, - utraTDD128 IRAT-ParametersUTRA-TDD128 OPTIONAL, - utraTDD384 IRAT-ParametersUTRA-TDD384 OPTIONAL, - utraTDD768 IRAT-ParametersUTRA-TDD768 OPTIONAL, - geran IRAT-ParametersGERAN OPTIONAL, - cdma2000-HRPD IRAT-ParametersCDMA2000-HRPD OPTIONAL, - cdma2000-1xRTT IRAT-ParametersCDMA2000-1XRTT OPTIONAL - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -AccessStratumRelease ::= ENUMERATED { - rel8, spare7, spare6, spare5, spare4, spare3, - spare2, spare1, ...} - -PDCP-Parameters ::= SEQUENCE { - supportedROHC-Profiles SEQUENCE { - profile0x0001 BOOLEAN, - profile0x0002 BOOLEAN, - profile0x0003 BOOLEAN, - profile0x0004 BOOLEAN, - profile0x0006 BOOLEAN, - profile0x0101 BOOLEAN, - profile0x0102 BOOLEAN, - profile0x0103 BOOLEAN, - profile0x0104 BOOLEAN - }, - maxNumberROHC-ContextSessions ENUMERATED { - cs2, cs4, cs8, cs12, cs16, cs24, cs32, - cs48, cs64, cs128, cs256, cs512, cs1024, - cs16384, spare2, spare1} DEFAULT cs16, - ... -} - -PhyLayerParameters ::= SEQUENCE { - ue-TxAntennaSelectionSupported BOOLEAN, - ue-SpecificRefSigsSupported BOOLEAN -} - -RF-Parameters ::= SEQUENCE { - supportedBandListEUTRA SupportedBandListEUTRA -} - -SupportedBandListEUTRA ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA - -SupportedBandEUTRA ::= SEQUENCE { - bandEUTRA INTEGER (1..64), - halfDuplex BOOLEAN -} - -MeasParameters ::= SEQUENCE { - bandListEUTRA BandListEUTRA -} - -BandListEUTRA ::= SEQUENCE (SIZE (1..maxBands)) OF BandInfoEUTRA - -BandInfoEUTRA ::= SEQUENCE { - interFreqBandList InterFreqBandList, - interRAT-BandList InterRAT-BandList OPTIONAL -} - -InterFreqBandList ::= SEQUENCE (SIZE (1..maxBands)) OF InterFreqBandInfo - -InterFreqBandInfo ::= SEQUENCE { - interFreqNeedForGaps BOOLEAN -} - -InterRAT-BandList ::= SEQUENCE (SIZE (1..maxBands)) OF InterRAT-BandInfo - -InterRAT-BandInfo ::= SEQUENCE { - interRAT-NeedForGaps BOOLEAN -} - -IRAT-ParametersUTRA-FDD ::= SEQUENCE { - supportedBandListUTRA-FDD SupportedBandListUTRA-FDD -} - -SupportedBandListUTRA-FDD ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-FDD - -SupportedBandUTRA-FDD ::= ENUMERATED { - bandI, bandII, bandIII, bandIV, bandV, bandVI, - bandVII, bandVIII, bandIX, bandX, bandXI, - bandXII, bandXIII, bandXIV, bandXV, bandXVI, ...} - -IRAT-ParametersUTRA-TDD128 ::= SEQUENCE { - supportedBandListUTRA-TDD128 SupportedBandListUTRA-TDD128 -} - -SupportedBandListUTRA-TDD128 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD128 - -SupportedBandUTRA-TDD128 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersUTRA-TDD384 ::= SEQUENCE { - supportedBandListUTRA-TDD384 SupportedBandListUTRA-TDD384 -} - -SupportedBandListUTRA-TDD384 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD384 - -SupportedBandUTRA-TDD384 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersUTRA-TDD768 ::= SEQUENCE { - supportedBandListUTRA-TDD768 SupportedBandListUTRA-TDD768 -} - -SupportedBandListUTRA-TDD768 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD768 - -SupportedBandUTRA-TDD768 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersGERAN ::= SEQUENCE { - supportedBandListGERAN SupportedBandListGERAN, - interRAT-PS-HO-ToGERAN BOOLEAN -} - -SupportedBandListGERAN ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandGERAN - -SupportedBandGERAN ::= ENUMERATED { - gsm450, gsm480, gsm710, gsm750, gsm810, gsm850, - gsm900P, gsm900E, gsm900R, gsm1800, gsm1900, - spare5, spare4, spare3, spare2, spare1, ...} - -IRAT-ParametersCDMA2000-HRPD ::= SEQUENCE { - supportedBandListHRPD SupportedBandListHRPD, - tx-ConfigHRPD ENUMERATED {single, dual}, - rx-ConfigHRPD ENUMERATED {single, dual} -} - -SupportedBandListHRPD ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandclassCDMA2000 - -IRAT-ParametersCDMA2000-1XRTT ::= SEQUENCE { - supportedBandList1XRTT SupportedBandList1XRTT, - tx-Config1XRTT ENUMERATED {single, dual}, - rx-Config1XRTT ENUMERATED {single, dual} -} - -SupportedBandList1XRTT ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandclassCDMA2000 - --- ASN1STOP - -UE-EUTRA-Capability field descriptions accessStratumRelease -Set to rel8 in this version of the specification. maxNumberROHC-ContextSessions -Set to the maximum number of concurrently active ROHC contexts supported by the UE. cs2 corresponds with 2 (context sessions), cs4 corresponds with 4 and so on. ue-Category -UE category as defined in TS 36.306 [5]. Set to values 1 to 5 in this version of the specification. bandEUTRA -EUTRA band as defined in TS 36.101 [42]. ue-TxAntennaSelectionSupported -TRUE indicates that the UE is capable of supporting UE transmit antenna selection as described in TS 36.213 [23, 8.7]. halfDuplex -If halfDuplex is set to true, only half duplex operation is supported for the band, otherwise full duplex operation is supported. bandListEUTRA -One entry corresponding to each supported EUTRA band listed in the same order as in supportedBandListEUTRA. interFreqBandList -One entry corresponding to each supported EUTRA band listed in the same order as in supportedBandListEUTRA. interFreqNeedForGaps -Indicates need for measurement gaps when operating on the EUTRA band given by the entry in bandListEUTRA and measuring on the EUTRA band given by the entry in interFreqBandList. interRAT-BandList -One entry corresponding to each supported band of another RAT listed in the same order as in the interRAT-Parameters. interRATNeedForGaps -Indicates need for DL measurement gaps when operating on the EUTRA band given by the entry in bandListEUTRA and measuring on the inter-RAT band given by the entry in the interRAT-BandList. bandUTRA-FDD -UTRA band as defined in TS 25.101 [17]. bandUTRA-TDD128 -UTRA band as defined in TS 25.102 [18]. bandUTRA-TDD384 -UTRA band as defined in TS 25.102 [18]. bandUTRA-TDD768 -UTRA band as defined in TS 25.102 [18]. bandGERAN -GERAN band as defined in TS 45.005 [20]. bandHRPD -CDMA2000 HRPD band class. band1XRTT -CDMA2000 1xRTT band class. featureGroupIndicators -The definitions of the bits in the bit string are described in Annex B. -NOTE: The IE UE-EUTRA-Capability does not include AS security capability information, since these are the same as the security capabilities that are signalled by NAS. Consequently AS need not provide "man-in-the-middle" protection for the security capabilities. -– UE-TimersAndConstants -The IE UE-TimersAndConstants contains timers and constants used by the UE in either RRC_CONNECTED or RRC_IDLE. -UE-TimersAndConstants information element --- ASN1START - -UE-TimersAndConstants ::= SEQUENCE { - t300 ENUMERATED { - ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, - ms2000}, - t301 ENUMERATED { - ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, - ms2000}, - t310 ENUMERATED { - ms0, ms50, ms100, ms200, ms500, ms1000, ms2000}, - n310 ENUMERATED { - n1, n2, n3, n4, n6, n8, n10, n20}, - t311 ENUMERATED { - ms1000, ms3000, ms5000, ms10000, ms15000, - ms20000, ms30000}, - n311 ENUMERATED { - n1, n2, n3, n4, n5, n6, n8, n10}, - ... -} - --- ASN1STOP - -UE-TimersAndConstants field descriptions t3xy -Timers are described in section 7.3. Value ms0 corresponds with 0 ms, ms50 corresponds with 50 ms and so on. n3xy -Constants are described in section 7.4. n1 corresponds with 1, n2 corresponds with 2 and so on. -6.4 RRC multiplicity and type constraint values -– Multiplicity and type constraint definitions --- ASN1START - -maxBands INTEGER ::= 64 -- Maximum number of bands listed in EUTRA UE caps -maxCDMA-BandClass INTEGER ::= 32 -- Maximum value of the CDMA band classes -maxCellBlack INTEGER ::= 16 -- Maximum number of blacklisted cells - -- listed in SIB type 4 and 5 -maxCellInter INTEGER ::= 16 -- Maximum number of neighbouring inter-frequency - -- cells listed in SIB type 5 -maxCellIntra INTEGER ::= 16 -- Maximum number of neighbouring intra-frequency - -- cells listed in SIB type 4 -maxCellMeas INTEGER ::= 32 -- Maximum number of neighbouring cells within a - -- measurement object (incl blacklisted cells) -maxCellReport INTEGER ::= 8 -- Maximum number of reported cells -maxDRB INTEGER ::= 11 -- Maximum number of Data Radio Bearers -maxEARFCN INTEGER ::= 65535 -- Maximum value of EUTRA carrier fequency -maxFreq INTEGER ::= 8 -- Maximum number of EUTRA carrier frequencies -maxGERAN-SI INTEGER ::= 10 -- Maximum number of GERAN SI blocks that can be - -- provided as part of NACC information -maxGNFG INTEGER ::= 16 -- Maximum number of GERAN neighbour freq groups -maxMBSFN-Allocations INTEGER ::= 8 -- Maximum number of MBSFN frame allocations with - -- different offset -maxMCS-1 INTEGER ::= 16 -- Maximum number of PUCCH formats (MCS) -maxMeasId INTEGER ::= 32 -maxObjectId INTEGER ::= 32 -maxPageRec INTEGER ::= 16 -- -maxPNOffset INTEGER ::= 511 -- Maximum number of CDMA2000 PNOffsets -maxRAT-Capabilities INTEGER ::= 8 -- Maximum number of interworking RATs (incl EUTRA) -maxReportConfigId INTEGER ::= 32 -maxSIB INTEGER ::= 32 -- Maximum number of SIBs -maxSIB-1 INTEGER ::= 31 -maxSI-Message INTEGER ::= 32 -- Maximum number of SI messages -maxUTRA-FDD-Carrier INTEGER ::= 16 -- Maximum number of UTRA FDD carrier frequencies -maxUTRA-TDD-Carrier INTEGER ::= 16 -- Maximum number of UTRA TDD carrier frequencies - --- ASN1STOP -NOTE: The value of maxDRB align with SA2. -– End of EUTRA-RRC-Definitions --- ASN1START - -END - --- ASN1STOP - -7 Variables and constants -7.1 UE variables -NOTE: To facilitate the specification of the UE behavioural requirements, UE variables are represented using ASN.1. Unless explicitly specified otherwise, it is however up to UE implementation how to store the variables. The optionality of the IEs in ASN.1 is used only to indicate that the values may not always be available. -– EUTRA-UE-Variables -This ASN.1 segment is the start of the EUTRA UE variable definitions. --- ASN1START - -EUTRA-UE-Variables DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - -IMPORTS - CellIdentity, - SpeedStateScaleFactors, - C-RNTI, - MeasId, - MeasIdToAddModList, - MeasObjectToAddModList, - MobilityStateParameters, - NeighCellConfig, - PhysCellId, - QuantityConfig, - ReportConfigToAddModList, - RSRP-Range, - maxCellMeas, - maxMeasId -FROM EUTRA-RRC-Definitions; - --- ASN1STOP - -– VarMeasConfig -The UE variable VarMeasConfig includes the accumulated configuration of the measurements to be performed by the UE, covering intra-frequency, inter-frequency and inter-RAT mobility related measurements. -VarMeasConfig UE variable --- ASN1START - -VarMeasConfig ::= SEQUENCE { - -- Measurement identities - measIdList MeasIdToAddModList OPTIONAL, - -- Measurement objects - measObjectList MeasObjectToAddModList OPTIONAL, - -- Reporting configurations - reportConfigList ReportConfigToAddModList OPTIONAL, - -- Other parameters - quantityConfig QuantityConfig OPTIONAL, - s-Measure RSRP-Range OPTIONAL, - speedStatePars CHOICE { - release NULL, - setup SEQUENCE { - mobilityStateParameters MobilityStateParameters, - timeToTrigger-SF SpeedStateScaleFactors - } - } OPTIONAL -} - --- ASN1STOP - -– VarMeasReportList -The UE variable VarMeasReportList includes information about the measurements for which the triggering conditions have been met. -VarMeasReportList UE variable --- ASN1START - -VarMeasReportList ::= SEQUENCE (SIZE (1..maxMeasId)) OF VarMeasReport - -VarMeasReport ::= SEQUENCE { - -- List of measurement that have been triggered - measId MeasId, - cellsTriggeredList CellsTriggeredList OPTIONAL, - numberOfReportsSent INTEGER -} - -CellsTriggeredList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF PhysCellId - --- ASN1STOP - -– VarShortMAC-Input -The UE variable VarShortMAC-Input specifies the input used to generate the shortMAC-I. -VarShortMAC-Input UE variable --- ASN1START - -VarShortMAC-Input ::= SEQUENCE { - cellIdentity CellIdentity, - physCellId PhysCellId, - c-RNTI C-RNTI -} --- ASN1STOP - -VarShortMAC-Input field descriptions cellIdentity -Set to CellIdentity of the current cell. physCellId -Set to the physical cell identity of the cell the UE was connected to prior to the failure. c-RNTI -Set to C-RNTI that the UE had in the cell it was connected to prior to the failure. -– Multiplicity and type constraint definitions -This section includes multiplicity and type constraints applicable (only) for UE variables. --- ASN1START - - --- ASN1STOP - -– End of EUTRA-UE-Variables --- ASN1START - -END - --- ASN1STOP - -7.2 Counters -Counter Reset Incremented When reaching max value -7.3 Timers (Informative) -Timer Start Stop At expiry T300 - Transmission of RRCConnectionRequest Reception of RRCConnectionSetup or RRCConnectionReject message, cell re-selection and upon abortion of connection establishment by upper layers Perform the actions as specified in 5.3.3.6 T301 Transmission of RRCConnectionReestabilshmentRequest Reception of RRCConnectionReestablishment or RRCConnectionReestablishmentReject message as well as when the selected cell becomes unsuitable Go to RRC_IDLE T302 Reception of RRCConnectionReject while performing RRC connection establishment Upon entering RRC_CONNECTED and upon cell re-selection Inform upper layers about barring alleviation as specified in 5.3.3.7 T303 Access barred while performing RRC connection establishment for mobile originating calls Upon entering RRC_CONNECTED and upon cell re-selection Inform upper layers about barring alleviation as specified in 5.3.3.7 T304 Reception of RRCConnectionReconfiguration message including the MobilityControl Info or -reception of MobilityFromEUTRACommand message including CellChangeOrder Criterion for successful completion of handover to EUTRA or cell change order is met (the criterion is specified in the target RAT in case of inter-RAT) In case of cell change order from E-UTRA or intra E-UTRA handover, initiate the RRC connection re-establishment procedure; In case of handover to E-UTRA, perform the actions defined in the specifications applicable for the source RAT. T305 Access barred while performing RRC connection establishment for mobile originating signalling Upon entering RRC_CONNECTED and upon cell re-selection Inform upper layers about barring alleviation as specified in 5.3.3.7 T310 Upon detecting physical layer problems i.e. upon receiving N310 consecutive out-of-sync indications from lower layers Upon receiving N311 consecutive in-sync indications from lower layers, upon triggering the handover procedure and upon initiating the connection re-establishment procedure If security is not activated: go to RRC_IDLE else: initiate the connection re-establishment procedure T311 Upon initiating the RRC connection re-establishment procedure Selection of a suitable E-UTRA cell or a cell using another RAT. Enter RRC_IDLE T320 Upon receiving t320 or upon cell (re)selection to E-UTRA from another RAT with validity time configured for dedicated priorities (in which case the remaining validity time is applied). Upon entering RRC_CONNECTED, when PLMN selection is performed on request by NAS, or upon cell (re)selection to another RAT (in which case the timer is carried on to the other RAT). Discard the cell reselection priority information provided by dedicated signalling. T321 Upon receiving measConfig including a reportConfig with the purpose set to reportCGI Upon acquiring the information needed to set all fields of cellGlobalId for the requested cell, upon receiving measConfig that includes removal of the reportConfig with the purpose set to reportCGI Initiate the measurement reporting procedure, stop performing the related measurements and remove the corresponding measId -7.4 Constants -Constant Usage N310 Maximum number of consecutive "out-of-sync" indications received from lower layers N311 Maximum number of consecutive "in-sync" indications received from lower layers -8 Protocol data unit abstract syntax -8.1 General -The RRC PDU contents in clause 6 and clause 10 are described using abstract syntax notation one (ASN.1) as specified in ITU-T Rec. X.680 [13] and X.681 [14]. Transfer syntax for RRC PDUs is derived from their ASN.1 definitions by use of Packed Encoding Rules, unaligned as specified in ITU-T Rec. X.691 [15]. -The following encoding rules apply in addition to what has been specified in X.691: -- When a bit string value is placed in a bit-field as specified in 15.6 to 15.11 in X.691, the leading bit of the bit string value shall be placed in the leading bit of the bit-field, and the trailing bit of the bit string value shall be placed in the trailing bit of the bit-field. -NOTE: The terms 'leading bit' and 'trailing bit' are defined in ITU-T Rec. X.680. When using the 'bstring' notation, the leading bit of the bit string value is on the left, and the trailing bit of the bit string value is on the right. -8.2 Structure of encoded RRC messages -An RRC PDU, which is the bit string that is exchanged between peer entities/ across the radio interface contains the basic production as defined in X.691. -RRC PDUs shall be mapped to and from PDCP SDUs (in case of DCCH) or RLC SDUs (in case of PCCH, BCCH or CCCH) upon transmission and reception as follows: -- when delivering an RRC PDU as an PDCP SDU to the PDCP layer for transmission, the first bit of the RRC PDU shall be represented as the first bit in the PDCP SDU and onwards; and -- when delivering an RRC PDU as an RLC SDU to the RLC layer for transmission, the first bit of the RRC PDU shall be represented as the first bit in the RLC SDU and onwards; and -- upon reception of an PDCP SDU from the PDCP layer, the first bit of the PDCP SDU shall represent the first bit of the RRC PDU and onwards; and -- upon reception of an RLC SDU from the RLC layer, the first bit of the RLC SDU shall represent the first bit of the RRC PDU and onwards. -8.3 Basic production -The 'basic production' is obtained by applying UNALIGNED PER to the abstract syntax value (the ASN.1 description) as specified in X.691. It always contains a multiple of 8 bits. -8.4 Extension -The following rules apply with respect to the use of protocol extensions: -- A transmitter compliant with this version of the specification shall, unless explicitly indicated otherwise on a PDU type basis, set the extension part empty. Transmitters compliant with a later version may send non-empty extensions; -- A transmitter compliant with this version of the specification shall set spare bits to zero; -8.5 Padding -If the encoded RRC message does not fill a transport block, the RRC layer shall add padding bits. This applies to PCCH and BCCH. -Padding bits shall be set to 0 and the number of padding bits is a multiple of 8. - -Figure 8.5-1: RRC level padding -9 Specified and default radio configurations -Specified and default configurations are configurations of which the details are specified in the standard. Specified configurations are fixed while default configurations can be modified using dedicated signalling. -9.1 Specified configurations -9.1.1 Logical channel configurations -9.1.1.1 BCCH configuration -Parameters -Name Value Semantics description Ver PDCP configuration N/A RLC configuration TM MAC configuration TM -NOTE: RRC will perform padding, if required due to the granularity of the TF signalling, as defined in 8.5. -9.1.1.2 CCCH configuration -Parameters -Name Value Semantics description Ver PDCP configuration N/A RLC configuration TM MAC configuration Normal MAC headers are used Logical channel configuration priority 1 Highest priority prioritisedBitRate Infinity bucketSizeDuration N/A logicalChannelGroup 0 -9.1.1.3 PCCH configuration -Parameters -Name Value Semantics description Ver PDCP configuration N/A RLC configuration TM MAC configuration TM -NOTE: RRC will perform padding, if required due to the granularity of the TF signalling, as defined in 8.5. -9.1.2 SRB configurations -9.1.2.1 SRB1 -Parameters -Name Value Semantics description Ver RLC configuration logicalChannelIdentity 1 -9.1.2.2 SRB2 -Parameters -Name Value Semantics description Ver RLC configuration logicalChannelIdentity 2 -9.2 Default radio configurations -9.2.1 SRB configurations -9.2.1.1 SRB1 -Parameters -Name Value Semantics description Ver RLC configuration CHOICE am ul-RLC-Config ->t-PollRetransmit ->pollPDU ->pollByte ->maxRetxThreshold -45 -Infinity -Infinity -4 dl-RLC-Config ->t-Reordering ->t-StatusProhibit -35 -0 Logical channel configuration priority 1 Highest priority prioritisedBitRate Infinity bucketSizeDuration N/A logicalChannelGroup 0 -9.2.1.2 SRB2 -Parameters -Name Value Semantics description Ver RLC configuration CHOICE am ul-RLC-Config ->t-PollRetransmit ->pollPDU ->pollByte ->maxRetxThreshold -45 -Infinity -Infinity -4 dl-RLC-Config ->t-Reordering ->t-StatusProhibit -35 -0 Logical channel configuration priority 3 prioritisedBitRate Infinity bucketSizeDuration N/A logicalChannelGroup 0 -9.2.2 Default MAC main configuration -Parameters -Name Value Semantics description Ver MAC main configuration maxHARQ-tx 5 periodicBSR-Timer Infinity retxBSR-Timer sf2560 ttiBundling FALSE drx-Config release phr-Config release -9.2.3 Default semi-persistent scheduling configuration -SPS-Config ->sps-ConfigDL ->sps-ConfigUL -release -release -9.2.4 Default physical channel configuration -Parameters -Name Value Semantics description Ver PDSCH-ConfigDedicated ->p-a -dB0 PUCCH-ConfigDedicated -> tdd-AckNackFeedbackMode ->ackNackRepetition -bundling -release -Only valid for TDD mode PUSCH-ConfigDedicated ->betaOffset-ACK-Index ->betaOffset-RI-Index ->betaOffset-CQI-Index -10 -12 -15 UplinkPowerControlDedicated ->p0-UE-PUSCH ->deltaMCS-Enabled ->accumulationEnabled ->p0-UE-PUCCH ->pSRS-Offset -> filterCoefficient -0 -en0 (disabled) -TRUE -0 -7 -fc4 tpc-pdcch-ConfigPUCCH release tpc-pdcch-ConfigPUSCH release CQI-ReportConfig -> CQI-ReportPeriodic -release SoundingRS-UL-ConfigDedicated release AntennaInfoDedicated ->transmissionMode - - - ->codebookSubsetRestriction ->ue-TransmitAntennaSelection -tm1, tm2 - - - -N/A -release -If the number of PBCH antenna ports is one, tm1 is used as default; otherwise tm2 is used as default SchedulingRequestConfig release -9.2.5 Default values timers and constants -Parameters -Name Value Semantics description Ver t310 ms1000 n310 1 t311 ms1000 n311 1 -10 Radio information related interactions between network nodes -10.1 General -This section specifies RRC messages that are transferred between network nodes. These RRC messages may be transferred to or from the UE via another Radio Access Technology. Consequently, these messages have similar characteristics as the RRC messages that are transferred across the E-UTRA radio interface, i.e. the same transfer syntax and protocol extension mechanisms apply. -10.2 Inter-node RRC messages -10.2.1 General -This section specifies RRC messages that are sent either across the X2- or the S1-interface, either to or from the eNB, i.e. a single ‘logical channel’ is used for all RRC messages transferred across network nodes. The information could originate from or be destined for another RAT. -– EUTRA-InterNodeDefinitions -This ASN.1 segment is the start of the EUTRA inter-node PDU definitions. --- ASN1START - -EUTRA-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - -IMPORTS - AntennaInfoCommon, - CellIdentity, - C-RNTI, - DL-DCCH-Message, - ARFCN-ValueEUTRA, - MasterInformationBlock, - MeasConfig, - PhysCellId, - RadioResourceConfigDedicated, - SecurityAlgorithmConfig, - ShortMAC-I, - SystemInformationBlockType1, - SystemInformationBlockType2, - UECapabilityInformation, - UE-CapabilityRAT-ContainerList -FROM EUTRA-RRC-Definitions; - --- ASN1STOP - -10.2.2 Message definitions -– HandoverCommand -This message is used to transfer the handover command generated by the target eNB, which is transparently transferred by the source RAN to the UE. -Direction: target eNB to source eNB/ source RAN -HandoverCommand message --- ASN1START - -HandoverCommand ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - handoverCommand-r8 HandoverCommand-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverCommand-r8-IEs ::= SEQUENCE { - handoverCommandMessage OCTET STRING (CONTAINING DL-DCCH-Message), - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -HandoverCommand field descriptions handoverCommandMessage -Contains the entire DL-DCCH-Message including the RRCConnectionReconfiguration message used to perform handover to E-UTRAN, generated (entirely) by the target eNB. -– HandoverPreparationInformation -This message is used to transfer the E-UTRA RRC information used by the target eNB during handover preparation, including UE capability information. -Direction: source eNB/ source RAN to target eNB -HandoverPreparationInformation message --- ASN1START - -HandoverPreparationInformation ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - handoverPreparationInformation-r8 HandoverPreparationInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverPreparationInformation-r8-IEs ::= SEQUENCE { - ue-RadioAccessCapabilityInfo UE-CapabilityRAT-ContainerList, - as-Config AS-Config OPTIONAL, -- Cond HO - rrm-Config RRM-Config OPTIONAL, - as-Context AS-Context OPTIONAL, -- Cond HO - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -HandoverPreparationInformation field descriptions ue-RadioAccessCapabilityInfo -E-UTRA radio access capabilities are always included and in case of inter-RAT handover to E-UTRA, UTRA radio access capabilities may be included. (If UTRA radio access capabilities are received from the source RAN, they are ignored by target eNB.) In case of inter-RAT handover to E-UTRA and the source is GERAN, GERAN capabilities are always included. as-Config -The complete radio resource configuration. Applicable in case of intra-E-UTRA handover. rrm-Config -Local E-UTRAN context used depending on the target node’s implementation, which is mainly used for the RRM purpose. as-Context -Local E-UTRAN context required by the target eNB. -Conditional presence Explanation HO The field is mandatory present in case of handover within E-UTRA; otherwise the field is not present. -– UERadioAccessCapabilityInformation -This message is used to transfer UE radio access capability information, covering both upload to and download from the EPC. -Direction: eNB to/ from EPC -UERadioAccessCapabilityInformation message --- ASN1START - -UERadioAccessCapabilityInformation ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - ueRadioAccessCapabilityInformation-r8 - UERadioAccessCapabilityInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UERadioAccessCapabilityInformation-r8-IEs ::= SEQUENCE { - ue-RadioAccessCapabilityInfo OCTET STRING (CONTAINING UECapabilityInformation), - nonCriticalExtension SEQUENCE {} OPTIONAL -} - --- ASN1STOP - -UERadioAccessCapabilityInformation field descriptions ue-RadioAccessCapabilityInfo -Including E-UTRA, GERAN, and CDMA2000-1xRTT Bandclass radio access capabilities (separated). UTRA radio access capabilities are not included. -10.3 Inter-node RRC information element definitions -– AS-Config -The AS-Config IE contains information about RRC configuration information in the source cell which can be utilized by target cell to determine the need to change the RRC configuration during the handover preparation phase. The information can also be used after the handover is successfully performed or during the RRC connection re-establishment. -AS-Config information element --- ASN1START - -AS-Config ::= SEQUENCE { - sourceMeasConfig MeasConfig, - sourceRadioResourceConfig RadioResourceConfigDedicated, - sourceSecurityAlgorithmConfig SecurityAlgorithmConfig, - sourceUE-Identity C-RNTI, - sourceMasterInformationBlock MasterInformationBlock, - sourceSystemInformationBlockType1 SystemInformationBlockType1, - sourceSystemInformationBlockType2 SystemInformationBlockType2, - antennaInfoCommon AntennaInfoCommon, - sourceDl-CarrierFreq ARFCN-ValueEUTRA, - ... -} - --- ASN1STOP -NOTE: The AS-Config re-uses information elements primarily created to cover the radio interface signalling requirements. Consequently, the information elements may include some parameters that are not relevant for the target eNB e.g. the SFN as included in the MasterInformationBlock. - -AS-Config field descriptions sourceMeasConfig -Measurement configuration in the source cell. The measurement configuration for all measurements existing in the source cell when handover is triggered shall be included. See 10.5. sourceRadioResourceConfig -Radio configuration in the source cell. The radio resource configuration for all radio bearers existing in the source cell when handover is triggered shall be included. See 10.5. sourceSecurityAlgorithmConfig -This field provides the AS integrity protection (SRBs) and AS ciphering (SRBs and DRBs) algorithm configuration used in the source cell. sourceMasterInformationBlock -MasterInformationBlock transmitted in the source cell. sourceSystemInformationBlockType1 -SystemInformationBlockType1 transmitted in the source cell. sourceSystemInformationBlockType2 -SystemInformationBlockType2 transmitted in the source cell. antennaInfoCommon -This field provides information about the number of antenna ports in the source cell. sourceDL-CarrierFreq -Provides the parameter Downlink EARFCN in the source cell, see TS 36.101 [42]. -– AS-Context -The IE AS-Context is used to transfer local E-UTRAN context required by the target eNB. - -AS-Context information element --- ASN1START - -AS-Context ::= SEQUENCE { - reestablishmentInfo ReestablishmentInfo OPTIONAL -- Cond HO -} - --- ASN1STOP - -AS-Context field descriptions reestablishmentInfo -Including information needed for the RRC connection re-establishment. -Conditional presence Explanation HO The field is mandatory present in case of handover within E-UTRA; otherwise the field is not present. -– ReestablishmentInfo -The ReestablishmentInfo IE contains information needed for the RRC connection re-establishment. -ReestablishmentInfo information element --- ASN1START - -ReestablishmentInfo ::= SEQUENCE { - sourcePhysCellId PhysCellId, - targetCellShortMAC-I ShortMAC-I, - additionalReestabInfoList AdditionalReestabInfoList OPTIONAL, - ... -} - -AdditionalReestabInfoList ::= SEQUENCE ( SIZE (1..maxReestabInfo) ) OF AdditionalReestabInfo - -AdditionalReestabInfo ::= SEQUENCE{ - cellIdentity CellIdentity, - key-eNodeB-Star Key-eNodeB-Star, - shortMAC-I ShortMAC-I -} - -Key-eNodeB-Star ::= BIT STRING (SIZE (256)) - --- ASN1STOP - -ReestablishmentInfo field descriptions sourcePhyCellId -The physical cell identity of the source cell, used to determine the UE context in the target eNB at re-establishment. targetCellShortMAC-I -The ShortMAC-I for the handover target cell, in order for potential re-establishment to succeed. additionalReestabInfoList -Contains a list of shortMAC-I and KeNB* for cells under control of the target eNB, required for potential re-establishment by the UE in these cells to succeed. Key-eNodeB-Star -Parameter KeNB*: See TS 33.401 [32, 7.2.8.4]. This parameter is only used for X2 handover, and for S1 handover, it shall be ignored by target eNB. -– RRM-Config -The RRM-Config IE contains information about UE specific RRM information before the handover which can be utilized by target eNB after the handover is successfully performed. -RRM-Config information element --- ASN1START - -RRM-Config ::= SEQUENCE { - ue-InactiveTime ENUMERATED { - s1, s2, s3, s5, s7, s10, s15, s20, - s25, s30, s40, s50, min1, min1s20c, min1s40, - min2, min2s30, min3, min3s30, min4, min5, min6, - min7, min8, min9, min10, min12, min14, min17, min20, - min24, min28, min33, min38, min44, min50, hr1, - hr1min30, hr2, hr2min30, hr3, hr3min30, hr4, hr5, hr6, - hr8, hr10, hr13, hr16, hr20, day1, day1hr12, day2, - day2hr12, day3, day4, day5, day7, day10, day14, day19, - day24, day30, dayMoreThan30} OPTIONAL, - ... -} - --- ASN1STOP - -RRM-Config field descriptions ue-InactiveTime -Duration while UE has not received or transmitted any user data. Thus the timer is still running in case e.g., UE measures the neighbour cells for the HO purpose. Value s1 corresponds to 1 second, s2 corresponds to 2 seconds and so on. Value min1 corresponds to 1 minute, value min1s20 corresponds to 1 minute and 20 seconds, value min1s40 corresponds to 1 minute and 40 seconds and so on. Value hr1 corresponds to 1 hour, hr1min30 corresponds to 1 hour and 30 minutes and so on. -10.4 Inter-node RRC multiplicity and type constraint values -– Multiplicity and type constraints definitions --- ASN1START - -maxReestabInfo INTEGER ::= 32 -- Maximum number of KeNB* and shortMAC-I forwarded - -- at handover for re-establishment preparation - --- ASN1STOP - -– End of EUTRA-InterNodeDefinitions --- ASN1START - -END - --- ASN1STOP - -10.5 Mandatory information in AS-Config -The AS-Config transferred between source eNB and target-eNB shall include all IEs necessary to describe the AS context. The conditional presence in section 6 is only applicable for eNB to UE communication. -The "need" or "cond" statements are not applied in case of sending the IEs from source eNB to target eNB. Some information elements shall be included regardless of the "need" or "cond" e.g. discardTimer. The AS-Config re-uses information elements primarily created to cover the radio interface signalling requirements. The information elements may include some parameters that are not relevant for the target eNB e.g. the SFN as included in the MasterInformationBlock. -Within the sourceRadioResourceConfig the source eNB shall include fields that are optional for eNB to UE communication, if the functionality is configured unless explictly specified otherwise in the following: -- in accordance with a condition that is explictly stated to be applicable; or -- a default value is defined for the concerned field; and the configured value is the same as the default value that is defined; or -- the need of the field is OP and the current UE configuration corresponds with the behaviour defined for absence of the field; - -Name Presence in clause 6 Comment RadioResourceConfigDedicated > srb-ToAddModList ->> rlc-Config ->> logicalChannelConfig ->>> ul-SpecificParameters ->>>> logicalChannelGroup OPTIONAL, -Cond HO-Conn -OPTIONAL, -Cond Setup -OPTIONAL, -Cond Setup -OPTIONAL, -Cond UL -OPTIONAL, -Need OR - -- -- -- The conditional presence applies -- >drb-ToAddModList ->> eps-BearerIdentity ->> pdcp-Config ->>> discardTimer ->>> rlc-AM ->>> rlc-UM ->> rlc-Config ->> logicalChannelIdentity ->> logicalChannelConfig ->>> ul-SpecificParameters ->>>> logicalChannelGroup OPTIONAL, -Cond HO-toEUTRA -OPTIONAL, -Cond DRB-Setup -OPTIONAL, -Cond PDCP -OPTIONAL, -Cond Setup -OPTIONAL, -Cond Rlc-AM -OPTIONAL, -Cond Rlc-UM -OPTIONAL, -Cond Setup -OPTIONAL, -Cond DRB-Setup -OPTIONAL, -Cond Setup -OPTIONAL, -Cond UL -OPTIONAL, -Need OR - -- -- -- -- The conditional presence applies -- The conditional presence applies -- -- -- -- The conditional presence applies -- > mac-MainConfig ->> ul-SCH-Config ->>> maxHARQ-Tx ->> periodicBSR-Timer ->> drx-Config ->>> shortDRX ->> phr-Config OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON - -- -- -- -- -- -- > sps-Config ->> sps-ConfigDL ->> sps-ConfigUL ->>> p0-Persistent ->>> twoIntervalsConfig OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need OP -OPTIONAL, -Cond TDD - -- -- -- -- The conditional presence applies > physicalConfigDedicated ->> pdsch-ConfigDedicated ->> pucch-ConfigDedicated ->>> tdd-AckNackFeedbackMode ->> pusch-ConfigDedicated ->> uplinkPowerControlDedicated ->> tpc-PDCCH-ConfigPUCCH ->> tpc-PDCCH-ConfigPUSCH ->> cqi-ReportConfig ->>> cqi-ReportingModeAperiodic ->>> cqi-ReportPeriodic ->> soundingRS-UL-ConfigDedicated ->> antennaInfo ->>> codebookSubsetRestriction ->> schedulingRequestConfig OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Cond TDD -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need OR -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Cond TM -OPTIONAL, -Need ON - -- -- -- The conditional presence applies -- -- -- -- -- -- -- -- -- -- The conditional presence applies -- -For the measurement configuration, a corresponding operation as 5.5.6.1 is executed by target eNB. -Within the sourceMeasConfig the source eNB shall include fields that are optional for eNB to UE communication, if the functionality is configured unless explictly specified otherwise in the following: -- in accordance with a condition that is explictly stated to be applicable; or -- a default value is defined for the concerned field; and the configured value is the same as the default value that is defined; or -- the need of the field is OP and the current UE configuration corresponds with the behaviour defined for absence of the field; -Name Presence in clause 6 Comment MeasConfig > measObjectToAddModList ->> measObject ->>> measObjectEUTRA ->>>> cellsToAddModList ->>>> blackCellsToAddModList ->>>> cellForWhichToReportCGI ->>> MeasObjectUTRA ->>>> cellsToAddModList ->>>> cellForWhichToReportCGI ->>> MeasObjectGERAN ->>>> cellForWhichToReportCGI ->>> MeasObjectCDMA2000 ->>>> searchWindowSize ->>>> cellsToAddModList ->>>> cellForWhichToReportCGI OPTIONAL, -Need ON -- -- -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -- -OPTIONAL, -Need ON -OPTIONAL, -Need ON -- -OPTIONAL, -Need ON -- -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON - -- -- -- -- -- -- -- -- -- -- -- -- -- -- > reportConfigToAddModList OPTIONAL, -Need ON - > measIdToAddModList OPTIONAL, -Need ON - > quantityConfig ->> quantityConfigEUTRA ->> quantityConfigUTRA ->> quantityConfigGERAN ->> quantityConfigCDMA2000 OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON -OPTIONAL, -Need ON - -- -- -- -- > s-Measure OPTIONAL, -Need ON - > preRegistrationInfoHRPD ->> preRegistrationZoneId ->> secondaryPreRegistrationZoneIdList OPTIONAL, -Need OP -OPTIONAL, -Cond PreRegAllowed -OPTIONAL, -Need OR -- The conditional presence applies -- > speedStatePars OPTIONAL, -Need ON - -11 UE capability related constraints and performance requirements -11.1 UE capability related constraints -The following table lists constraints regarding the UE capabilities that E-UTRAN is assumed to take into account. -Parameter Description Value #DRBs The number of DRBs that a UE of categories 1- 5 shall support 8 #RLC-AM The number of RLC AM entities that a UE of categories 1- 5 shall support 10 -11.2 Processing delay requirements for RRC procedures -The UE performance requirements for RRC procedures are specified in the following table, by means of a value N: -N = the number of 1ms subframes from the end of reception of the E-UTRAN -> UE message on the UE physical layer up to when the UE shall be ready for the reception of uplink grant for the UE -> E-UTRAN response message with no access delay other than the TTI-alignment (e.g. excluding delays caused by scheduling, the random access procedure or physical layer synchronisation). - -Figure 11.2-1: Illustration of RRC procedure delay - - - -Procedure title: E-UTRAN -> UE UE -> E-UTRAN N Notes RRC Connection Control Procedures RRC connection establishment - RRCConnectionSetup RRCConnectionSetupComplete 15 RRC connection release RRCConnectionSetupRelease NA - RRC connection re-configuration (radio resource configuration) - RRCConnectionReconfiguration RRCConnectionReconfigurationComplete 15 RRC connection re-configuration (measurement configuration) - RRCConnectionReconfiguration RRCConnectionReconfigurationComplete 15 RRC connection re-configuration (intra-LTE mobility) - RRCConnectionReconfiguration RRCConnectionReconfigurationComplete 15 RRC connection re-establishment - RRCConnectionReestablishment RRCConnectionReestablishmentComplete 15 Initial security activation SecurityModeCommand SecurityModeCommandComplete/SecurityModeCommandFailure 10 Initial security activation + RRC connection re-configuration (RB establishment) SecurityModeCommand, RRCConnectionReconfiguration RRCConnectionReconfigurationComplete 20 The two DL messages are transmitted in the same TTI Paging Paging NA Inter RAT mobilty Handover to E-UTRA RRCConnectionReconfiguration (sent by other RAT) RRCConnectionReconfigurationComplete NA Handover from E-UTRA MobilityFromEUTRACommand NA Handover from E-UTRA to CDMA2000 HandoverFromEUTRAPreparationRequest (CDMA2000) NA Used to trigger the handover preparation procedure with a CDMA2000 RAT. Measurement procedures Measurement Reporting MeasurementReport NA Other procedures UE capability transfer UECapabilityEnquiry UECapabilityInformation 10 -Annex A (informative): -Guidelines, mainly on use of ASN.1 -Editor’s note No agreements have been reached concerning the extension of RRC PDUs so far. Any statements in this section about the protocol extension mechanism should be considered as FFS. -A.1 Introduction -The following clauses contain guidelines for the specification of RRC protocol data units (PDUs) with ASN.1. -A.2 Procedural specification -A.2.1 General principles -The procedural specification provides an overall high level description regarding the UE behaviour in a particular scenario. -It should be noted that most of the UE behaviour associated with the reception of a particular field is covered by the applicable parts of the PDU specification. The procedural specification may also include specific details of the UE behaviour upon reception of a field, but typically this should be done only for cases that are not easy to capture in the PDU section e.g. general actions, more complicated actions depending on the value of multiple fields. -Likewise, the procedural specification need not specify the UE requirements regarding the setting of fields within the messages that are send to E-UTRAN i.e. this may also be covered by the PDU specification. -A.2.2 More detailed aspects -The following more detailed conventions should be used: -- Bullets: -- Capitals should be used in the same manner as in other parts of the procedural text i.e. in most cases no capital applies since the bullets are part of the sentence starting with 'The UE shall:' -- All bullets, including the last one in a sub-clause, should end with a semi-colon i.e. an ';' -- Conditions -- Whenever multiple conditions apply, a semi-colon should be used at the end of each conditions with the exception of the last one, i.e. as in 'if cond1; or cond2: -A.3 PDU specification -A.3.1 General principles -A.3.1.1 ASN.1 sections -The RRC PDU contents are formally and completely described using abstract syntax notation (ASN.1), see X.680 [13], X.681 (02/2002) [14]. -The complete ASN.1 code is divided into a number of ASN.1 sections in the specifications. In order to facilitate the extraction of the complete ASN.1 code from the specification, each ASN.1 section begins with a text paragraph consisting entirely of an ASN.1 start tag, which consists of a double hyphen followed by a single space and the text string "ASN1START" (in all upper case letters). Each ASN.1 section ends with a text paragraph consisting entirely of an ASN.1 stop tag, which consists of a double hyphen followed by a single space and the text "ASN1STOP" (in all upper case letters): --- ASN1START - --- ASN1STOP - -The text paragraphs containing the ASN.1 start and stop tags should not contain any ASN.1 code significant for the complete description of the RRC PDU contents. The complete ASN.1 code may be extracted by copying all the text paragraphs between an ASN.1 start tag and the following ASN.1 stop tag in the order they appear, throughout the specification. -NOTE: A typical procedure for extraction of the complete ASN.1 code consists of a first step where the entire RRC PDU contents description (ultimately the entire specification) is saved into a plain text (ASCII) file format, followed by a second step where the actual extraction takes place, based on the occurrence of the ASN.1 start and stop tags. -A.3.1.2 ASN.1 identifier naming conventions -The naming of identifiers (i.e., the ASN.1 field and type identifiers) should be based on the following guidelines: -- Message (PDU) identifiers should be ordinary mixed case without hyphenation. These identifiers, e.g., the RRCConnectionModificationCommand, should be used for reference in the procedure text. Abbreviated forms of these identifiers should not be used. -- Type identifiers other than PDU identifiers should be ordinary mixed case, with hyphenation used to set off acronyms only where an adjacent letter is a capital, e.g., EstablishmentCause, SelectedPLMN (not Selected-PLMN, since the “d” in “Selected” is lowercase), InitialUE-Identity and MeasSFN-SFN-TimeDifference. -- Field identifiers shall start with a lowercase letter and use mixed case thereafter, e.g., establishmentCause. If a field identifier begins with an acronym (which would normally be in upper case), the entire acronym is lowercase (plmn-Identity, not pLMN-Identity). The acronym is set off with a hyphen (ue-Identity, not ueIdentity), in order to facilitate a consistent search pattern with corresponding type identifiers. -- Identifiers that are likely to be keywords of some language, especially widely used languages, such as C++ or Java, should be avoided to the extent possible. -- Identifiers, other than PDU identifiers, longer than 25 characters should be avoided where possible. It is recommended to use abbreviations, which should be done in a consistent manner i.e. use 'Meas' instead of 'Measurement' for all occurrences. Examples of typical abbreviations are given in table A.3.1.2.1-1 below. -- For future extension: where versions of an ASN.1 field or type need to be distinguished by release, a suffix of the form "rX" is used, e.g., Foo-r9 for the Rel-9 version of the ASN.1 type Foo. If an ASN.1 field or type provides only the extension of a corresponding earlier field or type (see sub-clause A.4), a suffix of the form "vXYZext" is used, e.g., AnElement-v10b0ext for the extension of the ASN.1 type AnElement introduced in the version 10.11.0 of the specification. Digits 0...9, 10, 11, etc. are used to represent the first digit of the version number. Lower case letters a, b, c, etc. are used to represent the second (and third) digit of the version number if they are greater than 9. -- More generally, in case there is a need to distinguish different variants of an ASN.1 field or IE, a suffix should be added at the end of the identifiers e.g. MeasObjectUTRAN, ConfigCommon. When there is no particular need to distinguish the fields (e.g. because the field is included in different IEs), a common field identifier name may be used. This may be attractive e.g. in case the procedural specification is the same for the different variants. -Table A.3.1.2-1: Examples of typical abbreviations used in ASN.1 identifiers -Abbreviation Abbreviated word Conf Confirmation Config Configuration DL Downlink Freq Frequency Id Identity Ind Indication Info Information Meas Measurement Neigh Neighbour(ing) Param(s) Parameter(s) Persist Persistent Phys Physical Reestab Reestablishment Req Request Sched Scheduling Thresh Threshold Transm Transmission UL Uplink -NOTE: The table A.3.1.2.1-1 is not exhaustive. Additional abbreviations may be used in ASN.1 identifiers when needed. -A.3.1.3 Text references using ASN.1 identifiers -A text reference into the RRC PDU contents description from other parts of the specification is made using the ASN.1 field or type identifier of the referenced element. The ASN.1 field and type identifiers used in text references should be in the italic font style. The "do not check spelling and grammar" attribute in Word should be set. Quotation marks (i.e., " ") should not be used around the ASN.1 field or type identifier. -A reference to an RRC PDU type should be made using the corresponding ASN.1 type identifier followed by the word "message", e.g., a reference to the RRCConnectionRelease message. -A reference to a specific part of an RRC PDU, or to a specific part of any other ASN.1 type, should be made using the corresponding ASN.1 field identifier followed by the word "field", e.g., a reference to the prioritisedBitRate field in the example below. --- /example/ ASN1START - -LogicalChannelConfig ::= SEQUENCE { - ul-SpecificParameters SEQUENCE { - priority Priority, - prioritisedBitRate PrioritisedBitRate, - bucketSizeDuration BucketSizeDuration, - logicalChannelGroup INTEGER (0..3) - } OPTIONAL -} - --- ASN1STOP - -NOTE: All the ASN.1 start tags in the ASN.1 sections, used as examples in this annex to the specification, are deliberately distorted, in order not to include them when the ASN.1 description of the RRC PDU contents is extracted from the specification. -A reference to a specific type of information element should be made using the corresponding ASN.1 type identifier preceded by the acronym "IE", e.g., a reference to the IE LogicalChannelConfig in the example above. -References to a specific type of information element should only be used when those are generic, i.e., without regard to the particular context wherein the specific type of information element is used. If the reference is related to a particular context, e.g., an RRC PDU type (message) wherein the information element is used, the corresponding field identifier in that context should be used in the text reference. -A reference to a specific value of an ASN.1 field should be made using the corresponding ASN.1 value while using quotation marks (i.e., " ") around the ASN.1 value, e.g., 'if the status field is set to value "true"'. -A.3.2 High-level message structure -Within each logical channel type, the associated RRC PDU (message) types are alternatives within a CHOICE, as shown in the example below. --- /example/ ASN1START - -DL-DCCH-Message ::= SEQUENCE { - message DL-DCCH-MessageType -} - -DL-DCCH-MessageType ::= CHOICE { - c1 CHOICE { - dlInformationTransfer DLInformationTransfer, - handoverFromEUTRAPreparationRequest HandoverFromEUTRAPreparationRequest, - mobilityFromEUTRACommand MobilityFromEUTRACommand, - rrcConnectionReconfiguration RRCConnectionReconfiguration, - rrcConnectionRelease RRCConnectionRelease, - securityModeCommand SecurityModeCommand, - ueCapabilityEnquiry UECapabilityEnquiry, - spare1 NULL - }, - messageClassExtension SEQUENCE {} -} - --- ASN1STOP - -A nested two-level CHOICE structure is used, where the alternative PDU types are alternatives within the inner level c1 CHOICE. -Spare alternatives (i.e., spare1 in this case) may be included within the c1 CHOICE to facilitate future extension. The number of such spare alternatives should not extend the total number of alternatives beyond an integer-power-of-two number of alternatives (i.e., eight in this case). -Further extension of the number of alternative PDU types is facilitated using the messageClassExtension alternative in the outer level CHOICE. -A.3.3 Message definition -Each PDU (message) type is specified in an ASN.1 section similar to the one shown in the example below. --- /example/ ASN1START - -RRCConnectionReconfiguration ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionReconfiguration-r8 RRCConnectionReconfiguration-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfiguration-r8-IEs ::= SEQUENCE { - -- Enter the IEs here. - ... -} - --- ASN1STOP - -Hooks for critical and non-critical extension should normally be included in the PDU type specification. How these hooks are used is further described in sub-clause A.4. -Critical extensions are characterised by a redefinition of the PDU contents and need to be governed by a mechanism for protocol version agreement between the encoder and the decoder of the PDU, such that the encoder is prevented from sending a critically extended version of the PDU type, which is not comprehended by the decoder. -Critical extension of a PDU type is facilitated by a two-level CHOICE structure, where the alternative PDU contents are alternatives within the inner level c1 CHOICE. Spare alternatives (i.e., spare3 down to spare1 in this case) may be included within the c1 CHOICE. The number of spare alternatives to be included in the original PDU specification should be decided case by case, based on the expected rate of critical extension in the future releases of the protocol. -Further critical extension, when the spare alternatives from the original specifications are used up, is facilitated using the criticalExtensionsFuture in the outer level CHOICE. -In PDU types where critical extension is not expected in the future releases of the protocol, the inner level c1 CHOICE and the spare alternatives may be excluded, as shown in the example below. --- /example/ ASN1START - -RRCConnectionReconfigurationComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - rrcConnectionReconfigurationComplete-r8 - RRCConnectionReconfigurationComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfigurationComplete-r8-IEs ::= SEQUENCE { - -- Enter the IEs here. -- -- Cond condTag - ... -} - --- ASN1STOP - -Non-critical extensions are characterised by the addition of new information to the original specification of the PDU type. If not comprehended, a non-critical extension may be skipped by the decoder, whilst the decoder is still able to complete the decoding of the comprehended parts of the PDU contents. -Non-critical extensions at locations other than the end of the message or other than at the end of a field contained in a BIT or OCTET STRING are facilitated by use of the ASN.1 extension marker "...". The original specification of a PDU type should normally include the extension marker at the end of the sequence of information elements contained. -Non-critical extensions at the end of the message or at the end of a field that is contained in a BIT or OCTET STRING are facilitated by use of an empty sequence e.g. as shown in the following example: --- /example/ ASN1START - -RRCMessage-r8-IEs ::= SEQUENCE { - field1 InformationElement1, - field2 InformationElement2, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - --- ASN1STOP - -The ASN.1 section specifying the contents of a PDU type may be followed by a field description table where a further description of, e.g., the semantic properties of the fields may be included. The general format of this table is shown in the example below. The field description table is absent in case there are no fields for which further description needs to be provided e.g. because the PDU does not include any fields, or because an IE is defined for each field while there is nothing specific regarding the use of this IE that needs to be specified. -%PDU-TypeIdentifier% field descriptions %field identifier% -Field description. %field identifier% -Field description. -The field description table has one column. The header row shall contain the ASN.1 type identifier of the PDU type. -The following rows are used to provide field descriptions. Each row shall include a first paragraph with a field identifier (in bold and italic font style) referring to the part of the PDU to which it applies. The following paragraphs at the same row may include (in regular font style), e.g., semantic description, references to other specifications and/ or specification of value units, which are relevant for the particular part of the PDU. -The parts of the PDU contents that do not require a field description shall be omitted from the field description table. -A.3.4 Information elements -Each IE (information element) type is specified in an ASN.1 section similar to the one shown in the example below. --- /example/ ASN1START - -PRACH-ConfigSIB ::= SEQUENCE { - rootSequenceIndex INTEGER (0..1023), - prach-ConfigInfo PRACH-ConfigInfo -} - -PRACH-Config ::= SEQUENCE { - rootSequenceIndex INTEGER (0..1023), - prach-ConfigInfo PRACH-ConfigInfo OPTIONAL -- Need ON -} - -PRACH-ConfigInfo ::= SEQUENCE { - prach-ConfigIndex ENUMERATED {ffs}, - highSpeedFlag ENUMERATED {ffs}, - zeroCorrelationZoneConfig ENUMERATED {ffs} -} - --- ASN1STOP - -IEs should be introduced whenever there are multiple fields for which the same set of values apply. IEs may also be defined for other reasons e.g. to break down a ASN.1 definition in to smaller pieces. -A group of closely related IE type definitions, like the IEs PRACH-ConfigSIB and PRACH-Config in this example, are preferably placed together in a common ASN.1 section. The IE type identifiers should in this case have a common base, defined as the generic type identifier. It may be complemented by a suffix to distinguish the different variants. The "PRACH-Config" is the generic type identifier in this example, and the "SIB" suffix is added to distinguish the variant. The sub-clause heading and generic references to a group of closely related IEs defined in this way should use the generic type identifier. -The same principle should apply if a new version, or an extension version, of an existing IE is created for critical or non-critical extension of the protocol (see sub-clause A.4). The new version, or the extension version, of the IE is included in the same ASN.1 section defining the original. A suffix is added to the type identifier, using the naming conventions defined in sub-clause A.3.1.2, indicating the release or version of the where the new version, or extension version, was introduced. -Local IE type definitions, like the IE PRACH-ConfigInfo in the example above, may be included in the ASN.1 section and be referenced in the other IE types defined in the same ASN.1 section. The use of locally defined IE types should be encouraged, as a tool to break up large and complex IE type definitions. It can improve the readability of the code. There may also be a benefit for the software implementation of the protocol end-points, as these IE types are typically provided by the ASN.1 compiler as independent data elements, to be used in the software implementation. -An IE type defined in a local context, like the IE PRACH-ConfigInfo, should not be referenced directly from other ASN.1 sections in the RRC specification. An IE type which is referenced in more than one ASN.1 section should be defined in a separate sub-clause, with a separate heading and a separate ASN.1 section (possibly as one in a set of closely related IE types, like the IEs PRACH-ConfigSIB and PRACH-Config in the example above). Such IE types are also referred to as 'global IEs'. -NOTE: Referring to an IE type, that is defined as a local IE type in the context of another ASN.1 section, does not generate an ASN.1 compilation error. Nevertheless, using a locally defined IE type in that way makes the IE type definition difficult to find, as it would not be visible at an outline level of the specification. It should be avoided. -The ASN.1 section specifying the contents of one or more IE types, like in the example above, may be followed by a field description table, where a further description of, e.g., the semantic properties of the fields of the information elements may be included. This table may be absent, similar as indicated in sub-clause A.3.3 for the specification of the PDU type. The general format of the field description table is the same as shown in sub-clause A.3.3 for the specification of the PDU type. -A.3.5 Fields with optional presence -A field with optional presence may be declared with the keyword DEFAULT. It identifies a default value to be assumed, if the sender does not include a value for that field in the encoding: --- /example/ ASN1START - -PreambleInfo ::= SEQUENCE { - numberOfRA-Preambles INTEGER (1..64) DEFAULT 1, - ... -} - --- ASN1STOP - -Alternatively, a field with optional presence may be declared with the keyword OPTIONAL. It identifies a field for which a value can be omitted. The omission carries semantics, which is different from any normal value of the field: --- /example/ ASN1START - -PRACH-Config ::= SEQUENCE { - rootSequenceIndex INTEGER (0..1023), - prach-ConfigInfo PRACH-ConfigInfo OPTIONAL -- Need ON -} - --- ASN1STOP - -The semantics of an optionally present field, in the case it is omitted, should be indicated at the end of the paragraph including the keyword OPTIONAL, using a short comment text with a need statement. The need statement includes the keyword "Need", followed by one of the predefined semantics tags (OP, ON or OR) defined in sub-clause 6.1. If the semantics tag OP is used, the semantics of the absent field are further specified either in the field description table following the ASN.1 section, or in procedure text. -A.3.6 Fields with conditional presence -A field with conditional presence is declared with the keyword OPTIONAL. In addition, a short comment text shall be included at the end of the paragraph including the keyword OPTIONAL. The comment text includes the keyword "Cond", followed by a condition tag associated with the field ("UL" in this example): --- /example/ ASN1START - -LogicalChannelConfig ::= SEQUENCE { - ul-SpecificParameters SEQUENCE { - priority INTEGER (0), - ... - } OPTIONAL -- Cond UL -} - --- ASN1STOP - -When conditionally present fields are included in an ASN.1 section, the field description table after the ASN.1 section shall be followed by a conditional presence table. The conditional presence table specifies the conditions for including the fields with conditional presence in the particular ASN.1 section. -Conditional presence Explanation UL Specification of the conditions for including the field associated with the condition tag = "UL". Semantics in case of optional presence under certain conditions may also be specified. -The conditional presence table has two columns. The first column (heading: "Conditional presence") contains the condition tag (in italic font style), which links the fields with a condition tag in the ASN.1 section to an entry in the table. The second column (heading: "Explanation") contains a text specification of the conditions and requirements for the presence of the field. The second column may also include semantics, in case of an optional presence of the field, under certain conditions i.e. using the same predefined tags as defined for optional fields in A.3.5. -If the ASN.1 section does not include any fields with conditional presence, the conditional presence table shall not be included. -Whenever a field is only applicable in specific cases e.g. TDD, use of conditional presence should be considered. -A.3.7 Guidelines on use of lists with elements of SEQUENCE type -Where an information element has the form of a list (the SEQUENCE OF construct in ASN.1) with the type of the list elements being a SEQUENCE data type, an information element shall be defined for the list elements even if it would not otherwise be needed. -For example, a list of PLMN identities with reservation flags is defined as in the following example: --- /example/ ASN1START - -PLMN-IdentityList ::= SEQUENCE (SIZE (1..6)) OF PLMN-IdentityList - -PLMN-IdentityList ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellReservedForOperatorUse ENUMERATED {reserved, notReserved} -} - --- ASN1STOP -rather than as in the following (bad) example, which may cause generated code to contain types with unpredictable names: --- /bad example/ ASN1START - -PLMN-IdentityList ::= SEQUENCE (SIZE (1..6)) OF SEQUENCE { - plmn-Identity PLMN-Identity, - cellReservedForOperatorUse ENUMERATED {reserved, notReserved} -} - --- ASN1STOP -A.4 Extension of the PDU specifications -A.4.1 General principles to ensure compatibility -It is essential that extension of the protocol does not affect interoperability i.e. it is essential that implementations based on different versions of the RRC protocol are able to interoperate. In particular, this requirement applies for the following kind of protocol extensions: -- Introduction of new PDU types (i.e. these should not cause unexpected behaviour or damage). -- Introduction of additional fields in a PDUs (i.e. it should be possible to ignore uncomprehended extensions without affecting the handling of the other parts of the message). -- Introduction of additional values of a field of PDUs. If used, the behaviour upon reception of an uncomprehended value should be defined. -It should be noted that the PDU extension mechanism may depend on the logical channel used to transfer the message e.g. for some PDUs an implementation may be aware of the protocol version of the peer in which case selective ignoring of extensions may not be required. -A.4.2 Critical extension of messages -The mechanisms to critically extend a message are defined in A.3.3. There are both "outer branch" and "inner branch" mechanisms available. The "outer branch" consists of a CHOICE having the name criticalExtensions, with two values, c1 and criticalExtensionsFuture. The criticalExtensionsFuture branch consists of an empty SEQUENCE, while the c1 branch contains the "inner branch" mechanism. -The "inner branch" structure is a CHOICE with values of the form "MessageName-rX-IEs" (e.g., "RRCConnectionReconfiguration-r8-IEs") or "spareX", with the spare values having type NULL. The "-rX-IEs" structures contain the complete structure of the message IEs for the appropriate release; i.e., the critical extension branch for the Rel-10 version of a message includes all Rel-8 and Rel-9 fields (that are not obviated in the later version), rather than containing only the additional Rel-10 fields. -The following guidelines may be used when deciding which mechanism to introduce for a particular message, i.e. only an 'outer branch', or an 'outer branch' in combination with an 'inner branch' including a certain number of spares: -- For certain messages, e.g. initial uplink messages, messages transmitted on a broadcast channel, critical extension may not be applicable. -- An outer branch may be sufficient for messages not including any fields. -- The number of spares within inner branch should reflect the likelihood that the message will be critically extended in future releases (since each release with a critical extension for the message consumes one of the spare values). The estimation of the critical extension likelyhood may be based on the number, size and changeability of the fields included in the message. -- In messages where an inner branch extension mechanism is available, all spare values of the inner branch should be used before any critical extensions are added using the outer branch. -A.4.3 Non-critical extension of messages -The mechanisms to extend a message in a non-critical manner are defined in A.3.3. W.r.t. the use of extension markers, the following additional guidelines apply: -- The extension marker ("…") is the primary non-critical extension mechanism that is used unless a length determinant is not required. Examples of cases where a length determinant is not required: -- at the end of a message, -- at the end of a structure contained in a BIT STRING or OCTET STRING -- Extension markers within SEQUENCE -- Extension markers are primarily, but not exclusively, introduced at the higher nesting levels -- Extension markers are introduced for a SEQUENCE comprising several fields as well as for information elements which extension would result in complex structures without it (e.g. re-introducing another list) -- Extension markers are introduced to make it possible to maintain important information structures e.g. parameters relevant for one particular RAT -- Extension markers are also used for size critical messages (i.e. messages on BCCH, PCCH and CCCH), although introduced somewhat more carefully -- Extension markers within ENUMERATED -- Spare values are used until the number of values reaches the next power of 2, while the extension marker caters for extension beyond that limit -- Extension markers within CHOICE: -- Extension markers are introduced when extension is foreseen and when comprehension is not required by the receiver i.e. a behaviour is defined for the case where the receiver cannot comprehend the extended value (e.g. ignoring an optional CHOICE field) -There are no additional guidelines w.r.t. the use of non-critical extensions at the end of a message/ of a field contained in an OCTET or BIT STRING. -A.5 Guidelines regarding inclusion of transaction identifiers in RRC messages -The following rules provide guidance on which messages should include a Transaction identifier -1: DL messages on CCCH that move UE to RRC-Idle should not include the RRC transaction identifier. -2: All network initiated DL messages by default should include the RRC transaction identifier. -3: All UL messages that are direct response to a DL message with an RRC Transaction identifier should include the RRC Transaction identifier. -4: All UL messages that require a direct DL response message should include an RRC transaction identifier. -5: All UL messages that are not in response to a DL message nor require a corresponding response from the network should not include the RRC Transaction identifier. -A.6 Protection of RRC messages (informative) -The following list provides information which messages can be sent (unprotected) prior to security activation and which messages can be sent unprotected after security activation. -P…Messages that can be sent (unprotected) prior to security activation -A - I…Messages that can be sent without integrity protection after security activation -A - C…Messages that can be sent unciphered after security activation -NA… Message can never be sent after security activation -Message P A-I A-C Comment CSFBParametersRequestCDMA2000 + - - CSFBParametersResponseCDMA2000 + - - CounterCheck - - - CounterCheckResponse - - - DLInformationTransfer + - - HandoverFromEUTRAPreparationRequest (CDMA2000) - - - MasterInformationBlock + + + MeasurementReport + - - Justification for case “P”: RAN2 agreed that measurement configuration may be sent prior to security activation MobilityFromEUTRACommand - - - Paging + + + RRCConnectionReconfiguration + - - The message shall not be sent unprotected before security activation if it is used to perform handover or to establish SRB2 and DRBs RRCConnectionReconfigurationComplete + - - Unprotected, if sent as response to RRCConnectionReconfiguration which was sent before security activation RRCConnectionReestablishment - + + This message is not protected by PDCP operation. RRCConnectionReestablishmentComplete - - - RRCConnectionReestablishmentReject - + + One reason to send this may be that the security context has been lost, therefore sent as unprotected. RRCConnectionReestablishmentRequest - - + This message is not protected by PDCP operation. However a short MAC-I is included. RRCConnectionReject + NA NA RRCConnectionRelease + - - Jusitification for P: If the RRC connection only for signalling not requiring DRBs or ciphered messages, or the signalling connection has to be released prematurily, this message is sent as unprotected. RRCConnectionRequest + NA NA RRCConnectionSetup + NA NA RRCConnectionSetupComplete + NA NA SecurityModeCommand + NA NA Integrity protection applied, but no ciphering (integrity verification done after the message received by RRC) SecurityModeComplete - NA NA Integrity protection applied, but no ciphering. Ciphering is applied after completing the procedure. SecurityModeFailure + NA NA Neither integrity protection nor ciphering applied. SystemInformation + + + SystemInformationBlockType1 + + + UECapabilityEnquiry + - - UECapabilityInformation + - - ULHandoverPreparationTransfer (CDMA2000) - - - This message should follow HandoverFromEUTRAPreparationRequest ULInformationTransfer + - - -A.7 Miscellaneous -The following miscellaneous conventions should be used: -- References: Whenever another specification is referenced, the specification number and optionally the relevant subclause, table or figure, should be indicated in addition to the pointer to the References section e.g. as follows: 'see TS 36.212 [22, 5.3.3.1.6]'. -Annex B (normative): Release 8 AS feature handling -B.1 Feature group indicators -This annex contains the definitions of the bits in field featureGroupIndicators. -In this release of the protocol, the UE shall include the field featureGroupIndicators in the IE UE-EUTRA-Capability. For a specific indicator, if all functionalities for a feature group listed in Table B.1-1 have been implemented and tested, the UE shall set the indicator as one (1), else (i.e. if any one of the functionalities in a feature group listed in Table B.1-1, which have not been implemented or tested), the UE shall set the indicator as zero (0). -The UE shall set all indicators, which do not have a definition in the table B.1-1, as zero. -If the optional field featureGroupIndicators is not included by UE supporting future release, the network may assume that UE supports all features listed in Table B.1-1 and deployed in the network. -Table B.1-1: Defintions of feature group indicators -Index of indicator (bit number) Definition -(description of the supported functionality, if indicator set to one) Notes 1 (leftmost bit) - Intra-subframe frequency hopping for PUSCH scheduled by UL grant -- Extended cyclic prefix with ?f = 7.5kHz for DL resource block -- DCI format 3a (TPC commands for PUCCH and PUSCH with single bit power adjustments) -- Multi-user MIMO for PDSCH -- Aperiodic CQI/PMI/RI reporting on PUSCH: Mode 2-0 – UE selected subband CQI without PMI -- Aperiodic CQI/PMI/RI reporting on PUSCH: Mode 2-2 – UE selected subband CQI with multiple PMI 2 - Simultaneous CQI and ACK/NACK on PUCCH, i.e. PUCCH format 2a and 2b -- Absolute TPC command for PUSCH -- Resource allocation type 1 for PDSCH -- Periodic CQI/PMI/RI reporting on PUCCH: Mode 2-0 – UE selected subband CQI without PMI -- Periodic CQI/PMI/RI reporting on PUCCH: Mode 2-1 – UE selected subband CQI with single PMI 3 - Semi-persistent scheduling -- TTI bundling -- 5bit RLC UM SN -- 7bit PDCP SN - can only be set to 1 if the UE has set bit number 7 to 1. 4 - Short DRX cycle - can only be set to 1 if the UE has set bit number 5 to 1. 5 - Long DRX cycle -- DRX command MAC control element 6 - Prioritised bit rate 7 - RLC UM - can only be set to 0 if the UE does not support voice 8 - EUTRA RRC_CONNECTED to UTRA CELL_DCH PS handover - can only be set to 1 if the UE has set bit number 22 to 1 9 - EUTRA RRC_CONNECTED to GERAN GSM_Dedicated handover - related to SR-VCC -- can only be set to 1 if the UE has set bit number 23 to 1 10 - EUTRA RRC_CONNECTED to GERAN (Packet_) Idle by Cell Change Order -- EUTRA RRC_CONNECTED to GERAN (Packet_) Idle by Cell Change Order with NACC (Network Assisted Cell Change) 11 - EUTRA RRC_CONNECTED to CDMA2000 1xRTT CS Active handover - can only be set to 1 if the UE has sets bit number 24 to 1 12 - EUTRA RRC_CONNECTED to CDMA2000 HRPD Active handover - can only be set to 1 if the UE has set bit number 26 to 1 13 - Inter-frequency handover - can only be set to 1 if the UE has set bit number 25 to 1 14 - Measurement reporting event: Event A4 – Neighbour > threshold -- Measurement reporting event: Event A5 – Serving < threshold1 & Neighbour > threshold2 15 - Measurement reporting event: Event B1 – Neighbour > threshold - can only be set to 1 if the UE has set at least one of the bit number 22, 23, 24 or 26 to 1. 16 - Periodical measurement reporting for non-ANR related measurements 17 - Periodical measurement reporting for SON / ANR -- ANR related intra-frequency measurement reporting events - can only be set to 1 if the UE has set bit number 5 to 1. 18 - ANR related inter-frequency measurement reporting events - can only be set to 1 if the UE has set bit number 5 to 1. 19 - ANR related inter-RAT measurement reporting events - can only be set to 1 if the UE has set bit number 5 to 1. 20 If bit number 7 is set to ‘1’: -- RB combination 1: SRB1 and SRB2 for DCCH + 1x AM DRB -- RB combination 2: SRB1 and SRB2 for DCCH + 1x AM DRB + 1x UM DRB -- RB combination 3: SRB1 and SRB2 for DCCH + 2x AM DRB -- RB combination 4: SRB1 and SRB2 for DCCH + 2x AM DRB + 1x UM DRB -- RB combination 5: SRB1 and SRB2 for DCCH + 2x AM DRB + 2x UM DRB -- RB combination 6: SRB1 and SRB2 for DCCH + 3x AM DRB -- RB combination 7: SRB1 and SRB2 for DCCH + 3x AM DRB + 1x UM DRB -- RB combination 8: SRB1 and SRB2 for DCCH + 3x AM DRB + 2x UM DRB -- RB combination 9: SRB1 and SRB2 for DCCH + 4x AM DRB -- RB combination 10: SRB1 and SRB2 for DCCH + 4x AM DRB + 1x UM DRB -- RB combination 11: SRB1 and SRB2 for DCCH + 4x AM DRB + 2x UM DRB -- RB combination 12: SRB1 and SRB2 for DCCH + 5x AM DRB + 3x UM DRB -- RB combination 13: SRB1 and SRB2 for DCCH + 8x AM DRB -If bit number 7 is set to ‘0’ -- RB combinations 1, 3, 6, 9 and 13 - Regardless of what bit number 7 and bit number 20 is set to, UE shall support RB combinations 1, 3, 6 and 9 -- Regardless of what bit number 20 is set to, if bit number 7 is set to ‘1’, UE shall support RB combinations 1, 2, 3, 4, 6, 7, 9 and 10 - 21 - Predefined intra- and inter-subframe frequency hopping for PUSCH with N_sb > 1 -- Predefined inter-subframe frequency hopping for PUSCH with N_sb > 1 22 - UTRAN measurements, reporting and measurement reporting event B2 in E-UTRA connected mode 23 - GERAN measurements, reporting and measurement reporting event B2 in E-UTRA connected mode 24 - 1xRTT measurements, reporting and measurement reporting event B2 in E-UTRA connected mode 25 - Inter-frequency measurements and reporting in E-UTRA connected mode 26 - HRPD measurements, reporting and measurement reporting event B2 in E-UTRA connected mode 27 Undefined 28 Undefined 29 Undefined 30 Undefined 31 Undefined 32 Undefined -Clarification for mobility from EUTRAN and inter-frequency handover within EUTRAN -There are several feature groups related to mobility from E-UTRAN and inter-frequency handover within EUTRAN. The description of these features is based on the assumption that we have 5 main “functions” related to mobility from E-UTRAN: -A. Support of measurements and cell reselection procedure in idle mode -B. Support of RRC release with redirection procedure in connected mode -C. Support of Network Assisted Cell Change in connected mode -D. Support of measurements and reporting in connected mode -E. Support of handover procedure in connected mode -All functions can be applied for mobility to Inter-frequency to EUTRAN, GERAN, UTRAN, CDMA2000 HRPD and CDMA2000 1xRTT except for function C) which is only applicable for mobility to GERAN. Table B.1-2 below summarises the mobility functions that are supported based on the UE capability signaling (band support) and the setting of the feature group support indicators. -Table B.1-2: Mobility from E-UTRAN -Feature GERAN UTRAN HRPD 1xRTT EUTRAN A. Measurements and cell reselection procedure in E-UTRA idle mode Supported if GERAN band support is indicated Supported if UTRAN band support is indicated Supported if CDMA2000 HRPD band support is indicated Supported if CDMA2000 1xRTT band support is indicated Supported for supported bands B. RRC release with blind redirection procedure in E-UTRA connected mode Supported if GERAN band support is indicated Supported if UTRAN band support is indicated Supported if CDMA2000 HRPD band support is indicated Supported if CDMA2000 1xRTT band support is indicated Supported for supported bands C. Cell Change Order (with or without) Network Assisted Cell Change) in E-UTRA connected mode Group 10 N.A. N.A N.A N.A. D. Inter-frequency/RAT measurements, reporting and measurement reporting event B2 (for inter-RAT) in E-UTRA connected mode Group 23 Group 22 Group 26 Group 24 Group 25 E. Inter-frequency/RAT handover procedure in E-UTRA connected mode Group 9 (GSM_connected handover) -Separate UE capability bit defined in TS 36.306 for PS handover Group 8 (PS handover) Group 12 Group 11 Group 13 -Note that the measurements and reporting function (D) is distinct from the redirection (B), CCO (C) and handover (E) functions. In case measurements and reporting function is not supported, the network may still issue the mobility procedures in a blind fashion. -B.2 CSG support -In this release of the protocol, it is mandatory for the UE to support a minimum set of CSG functionality consisting of: -- Identifying whether a cell is CSG or not; -- Ignoring CSG cells in cell selection/reselection. -Additional CSG functionality in AS, i.e. the requirement to detect and camp on CSG cells when the "allowed CSG list" is available or when manual CSG selection is triggered by the user, are related to the corresponding NAS features. This additional AS functionality consists of: -- Manual CSG selection; -- Autonomous CSG search; -- Implicit priority handling for cell reselection with CSG cells. -It is possible that this additional CSG functionality in AS is not supported or tested in early UE implementations. -Note that since the above AS features relate to idle mode operations, the capability support is not signalled to the network. For these reasons, no “feature group indicator” is assigned to this feature to indicate early support in Rel-8. - - -Annex C (informative): -Change history - -Change history Date TSG # TSG Doc. CR Rev Subject/Comment Old New 12/2007 RP-38 RP-070920 - Approved at TSG-RAN #38 and placed under Change Control 1.0.0 8.0.0 03/2008 RP-39 RP-080163 0001 4 CR to 36.331 with Miscellaneous corrections 8.0.0 8.1.0 03/2008 RP-39 RP-080164 0002 2 CR to 36.331 to convert RRC to agreed ASN.1 format 8.0.0 8.1.0 05/2008 RP-40 RP-080361 0003 1 CR to 36.331 on Miscellaneous clarifications/ corrections 8.1.0 8.2.0 09/2008 RP-41 RP-080693 0005 - CR on Miscellaneous corrections and clarifications 8.2.0 8.3.0 12/2008 RP-42 RP-081021 0006 - Miscellaneous corrections and clarifications 8.3.0 8.4.0 03/2009 RP-43 RP-090131 0007 - Correction to the Counter Check procedure 8.4.0 8.5.0 RP-43 RP-090131 0008 - CR to 36.331-UE Actions on Receiving SIB11 8.4.0 8.5.0 RP-43 RP-090131 0009 1 Spare usage on BCCH 8.4.0 8.5.0 RP-43 RP-090131 0010 - Issues in handling optional IE upon absence in GERAN NCL 8.4.0 8.5.0 RP-43 RP-090131 0011 - CR to 36.331 on Removal of useless RLC re-establishment at RB release 8.4.0 8.5.0 RP-43 RP-090131 0012 1 Clarification to RRC level padding at PCCH and BCCH 8.4.0 8.5.0 RP-43 RP-090131 0013 - Removal of Inter-RAT message 8.4.0 8.5.0 RP-43 RP-090131 0014 - Padding of the SRB-ID for security input 8.4.0 8.5.0 RP-43 RP-090131 0015 - Validity of ETWS SIB 8.4.0 8.5.0 RP-43 RP-090131 0016 1 Configuration of the Two-Intervals-SPS 8.4.0 8.5.0 RP-43 RP-090131 0017 - Corrections on Scaling Factor Values of Qhyst 8.4.0 8.5.0 RP-43 RP-090131 0018 1 Optionality of srsMaxUppts 8.4.0 8.5.0 RP-43 RP-090131 0019 - CR for discussion on field name for common and dedicated IE 8.4.0 8.5.0 RP-43 RP-090131 0020 - Corrections to Connected mode mobility 8.4.0 8.5.0 RP-43 RP-090131 0021 - Clarification regarding the measurement reporting procedure 8.4.0 8.5.0 RP-43 RP-090131 0022 1 Corrections on s-Measure 8.4.0 8.5.0 RP-43 RP-090131 0023 1 R1 of CR0023 (R2-091029) on combination of SPS and TTI bundling for TDD 8.4.0 8.5.0 RP-43 RP-090131 0024 - L3 filtering for path loss measurements 8.4.0 8.5.0 RP-43 RP-090131 0025 1 S-measure handling for reportCGI 8.4.0 8.5.0 RP-43 RP-090131 0026 1 Measurement configuration clean up 8.4.0 8.5.0 RP-43 RP-090131 0027 - Alignment of measurement quantities for UTRA 8.4.0 8.5.0 RP-43 RP-090131 0028 - CR to 36.331 on L1 parameters ranges alignment 8.4.0 8.5.0 RP-43 RP-090131 0029 - Default configuration for transmissionMode 8.4.0 8.5.0 RP-43 RP-090131 0030 - CR to 36.331 on RRC Parameters for MAC, RLC and PDCP 8.4.0 8.5.0 RP-43 RP-090131 0031 1 CR to 36.331 - Clarification on Configured PRACH Freq Offset 8.4.0 8.5.0 RP-43 RP-090131 0032 - Clarification on TTI bundling configuration 8.4.0 8.5.0 RP-43 RP-090131 0033 1 Update of R2-091039 on Inter-RAT UE Capability 8.4.0 8.5.0 RP-43 RP-090133 0034 - Feature Group Support Indicators 8.4.0 8.5.0 RP-43 RP-090131 0036 - Corrections to RLF detection 8.4.0 8.5.0 RP-43 RP-090131 0037 - Indication of Dedicated Priority 8.4.0 8.5.0 RP-43 RP-090131 0038 2 Security Clean up 8.4.0 8.5.0 RP-43 RP-090131 0039 - Correction of TTT value range 8.4.0 8.5.0 RP-43 RP-090131 0040 - Correction on CDMA measurement result IE 8.4.0 8.5.0 RP-43 RP-090131 0041 1 Clarification of Measurement Reporting 8.4.0 8.5.0 RP-43 RP-090131 0042 - Spare values in DL and UL Bandwidth in MIB and SIB2 8.4.0 8.5.0 RP-43 RP-090131 0044 1 Clarifications to System Information Block Type 8 8.4.0 8.5.0 RP-43 RP-090131 0045 - Reception of ETWS secondary notification 8.4.0 8.5.0 RP-43 RP-090131 0046 1 Validity time for ETWS message Id and Sequence No 8.4.0 8.5.0 RP-43 RP-090131 0047 - CR for Timers and constants values used during handover to E-UTRA 8.4.0 8.5.0 RP-43 RP-090131 0048 - Inter-RAT Security Clarification 8.4.0 8.5.0 RP-43 RP-090131 0049 - CR to 36.331 on consistent naming of 1xRTT identifiers 8.4.0 8.5.0 RP-43 RP-090131 0050 - Capturing RRC behavior regarding NAS local release 8.4.0 8.5.0 RP-43 RP-090131 0051 - Report CGI before T321 expiry and UE null reporting 8.4.0 8.5.0 RP-43 RP-090131 0052 - System Information and 3 hour validity 8.4.0 8.5.0 RP-43 RP-090131 0053 1 Inter-Node AS Signalling 8.4.0 8.5.0 RP-43 RP-090131 0054 - Set of values for the parameter "messagePowerOffsetGroupB" 8.4.0 8.5.0 RP-43 RP-090131 0055 - CR to paging reception for ETWS capable UEs in RRC_CONNECTED 8.4.0 8.5.0 RP-43 RP-090131 0056 1 CR for CSG related items in 36.331 8.4.0 8.5.0 RP-43 RP-090131 0057 1 SRS common configuration 8.4.0 8.5.0 RP-43 RP-090131 0058 - RRC processing delay 8.4.0 8.5.0 RP-43 RP-090131 0059 - CR for HNB Name 8.4.0 8.5.0 RP-43 RP-090131 0060 3 Handover to EUTRA delta configuration 8.4.0 8.5.0 RP-43 RP-090131 0063 - Delivery of Message Identifier and Serial Number to upper layers for ETWS 8.4.0 8.5.0 RP-43 RP-090131 0066 - Clarification on the maximum size of cell lists 8.4.0 8.5.0 RP-43 RP-090131 0067 - Missing RRC messages in 'Protection of RRC messages' 8.4.0 8.5.0 RP-43 RP-090131 0069 1 Clarification on NAS Security Container 8.4.0 8.5.0 RP-43 RP-090131 0071 - Extension of range of CQI/PMI configuration index 8.4.0 8.5.0 RP-43 RP-090131 0072 1 Access barring alleviation in RRC connection establishment 8.4.0 8.5.0 RP-43 RP-090367 0077 6 Corrections to feature group support indicators 8.4.0 8.5.0 RP-43 RP-090131 0078 - CR from email discussion to capture DRX and TTT handling 8.4.0 8.5.0 RP-43 RP-090131 0079 1 Need Code handling on BCCH messages 8.4.0 8.5.0 RP-43 RP-090131 0080 - Unification of T300 and T301 and removal of miscallaneous FFSs 8.4.0 8.5.0 RP-43 RP-090131 0084 1 Proposed CR modifying the code-point definitions of neighbourCellConfiguration 8.4.0 8.5.0 RP-43 RP-090131 0087 2 Remove Redundant Optionality in SIB8 8.4.0 8.5.0 RP-43 RP-090131 0089 - Corrections to the generic error handling 8.4.0 8.5.0 RP-43 RP-090131 0090 - Configurability of T301 8.4.0 8.5.0 RP-43 RP-090131 0091 1 Correction related to TTT 8.4.0 8.5.0 RP-43 RP-090131 0095 - CR for 36.331 on SPS-config 8.4.0 8.5.0 RP-43 RP-090131 0096 2 CR for Deactivation of periodical measurement 8.4.0 8.5.0 RP-43 RP-090131 0099 2 SMC and reconfiguration 8.4.0 8.5.0 RP-43 RP-090131 0101 - TDD handover 8.4.0 8.5.0 RP-43 RP-090131 0102 - Corrections to system information acquisition 8.4.0 8.5.0 RP-43 RP-090131 0106 - Some Corrections and Clarifications to 36.331 8.4.0 8.5.0 RP-43 RP-090131 0109 - Clarification on the Maximum number of ROHC context sessions parameter 8.4.0 8.5.0 RP-43 RP-090131 0110 - Transmission of rrm-Config at Inter-RAT Handover 8.4.0 8.5.0 RP-43 RP-090131 0111 1 Use of SameRefSignalsInNeighbor parameter 8.4.0 8.5.0 RP-43 RP-090131 0112 - Default serving cell offset for measurement event A3 8.4.0 8.5.0 RP-43 RP-090131 0114 - dl-EARFCN missing in HandoverPreparationInformation 8.4.0 8.5.0 RP-43 RP-090131 0115 - Cleanup of references to 36.101 8.4.0 8.5.0 RP-43 RP-090131 0117 - Correction to the value range of UE-Categories 8.4.0 8.5.0 RP-43 RP-090131 0122 1 Correction on RRC connection re-establishment 8.4.0 8.5.0 RP-43 RP-090131 0124 - Performing Measurements to report CGI for CDMA2000 8.4.0 8.5.0 RP-43 RP-090131 0125 - CDMA2000-SystemTimeInfo in VarMeasurementConfiguration 8.4.0 8.5.0 RP-43 RP-090131 0126 - UE Capability Information for CDMA2000 1xRTT 8.4.0 8.5.0 RP-43 RP-090131 0127 - CDMA2000 related editorial changes 8.4.0 8.5.0 RP-43 RP-090131 0128 - Draft CR to 36.331 on State mismatch recovery at re-establishment 8.4.0 8.5.0 RP-43 RP-090131 0129 1 Draft CR to 36.331 on Renaming of AC barring related IEs 8.4.0 8.5.0 RP-43 RP-090131 0130 2 Draft CR to 36.331 on Inheriting of dedicated priorities at inter-RAT reselection 8.4.0 8.5.0 RP-43 RP-090131 0135 - Proposed CR to 36.331 Description alignment for paging parameter, nB 8.4.0 8.5.0 RP-43 RP-090131 0139 2 Miscellaneous corrections and clarifications resulting from ASN.1 review 8.4.0 8.5.0 RP-43 RP-090131 0141 1 Correction regarding Redirection Information fo GERAN 8.4.0 8.5.0 RP-43 RP-090131 0142 - Further ASN.1 review related issues 8.4.0 8.5.0 RP-43 RP-090131 0143 - Periodic measurements 8.4.0 8.5.0 RP-43 RP-090131 0144 1 Further analysis on code point "OFF" for ri-ConfigIndex 8.4.0 8.5.0 RP-43 RP-090131 0145 1 Adding and deleting same measurement or configuration in one message 8.4.0 8.5.0 RP-43 RP-090131 0147 - Corrections to IE dataCodingScheme in SIB11 8.4.0 8.5.0 RP-43 RP-090131 0148 - Clarification on Mobility from E-UTRA 8.4.0 8.5.0 RP-43 RP-090131 0149 - 36.331 CR related to “not applicable” 8.4.0 8.5.0 RP-43 RP-090131 0150 1 UE radio capability transfer 8.4.0 8.5.0 RP-43 RP-090131 0151 - CR to 36.331 on value of CDMA band classes 8.4.0 8.5.0 RP-43 RP-090131 0152 - Corrections to DRB modification 8.4.0 8.5.0 RP-43 RP-090131 0153 - Correction to presence condition for pdcp-config 8.4.0 8.5.0 RP-43 RP-090131 0155 - TDD HARQ-ACK feedback mode 8.4.0 8.5.0 RP-43 RP-090275 0157 - Corrections regarding use of carrierFreq for CDMA (SIB8) and GERAN (measObject) 8.4.0 8.5.0 RP-43 RP-090321 0156 1 Sending of GERAN SI/PSI information at Inter-RAT Handover 8.4.0 8.5.0 RP-43 RP-090339 0158 - Clarification of CSG support 8.4.0 8.5.0 06/2009 RP-44 RP-090516 0159 - Octet alignment of VarShortMAC-Input 8.5.0 8.6.0 RP-44 RP-090516 0160 3 Minor corrections to the feature grouping 8.5.0 8.6.0 RP-44 RP-090516 0161 - Security clarification 8.5.0 8.6.0 RP-44 RP-090516 0162 1 Sending of GERAN SI/PSI information at Inter-RAT Handover 8.5.0 8.6.0 RP-44 RP-090516 0163 1 Correction of UE measurement model 8.5.0 8.6.0 RP-44 RP-090516 0164 - Restricting the reconfiguration of UM RLC SN field size 8.5.0 8.6.0 RP-44 RP-090516 0165 1 36.331 CR on Clarification on cell change order from GERAN to E-UTRAN 8.5.0 8.6.0 RP-44 RP-090516 0166 - 36.331 CR - Handling of expired TAT and failed D-SR 8.5.0 8.6.0 RP-44 RP-090516 0167 1 Proposed CR to 36.331 Clarification on mandatory information in AS-Config 8.5.0 8.6.0 RP-44 RP-090516 0168 2 Miscellaneous small corrections 8.5.0 8.6.0 RP-44 RP-090516 0173 - Clarification on the basis of delta signalling 8.5.0 8.6.0 RP-44 RP-090516 0177 - CR on Alignment of CCCH and DCCH handling of missing mandatory field 8.5.0 8.6.0 RP-44 RP-090516 0180 2 Handling of Measurement Context During HO Preparation 8.5.0 8.6.0 RP-44 RP-090516 0181 - Clarification of key-eNodeB-Star in AdditionalReestabInfo 8.5.0 8.6.0 RP-44 RP-090516 0182 1 UE Capability Transfer 8.5.0 8.6.0 RP-44 RP-090516 0186 1 Clarification regarding mobility from E-UTRA in-between SMC and SRB2/DRB setup 8.5.0 8.6.0 RP-44 RP-090516 0188 1 Correction and completion of specification conventions 8.5.0 8.6.0 RP-44 RP-090516 0195 2 RB combination in feature group indicator 8.5.0 8.6.0 RP-44 RP-090516 0196 1 CR for need code for fields in mobilityControlInfo 8.5.0 8.6.0 RP-44 RP-090497 0197 - Alignment of pusch-HoppingOffset with 36.211 8.5.0 8.6.0 RP-44 RP-090570 0198 - Explicit srb-Identity values for SRB1 and SRB2 8.5.0 8.6.0 RP-44 RP-090516 0199 - Removing use of defaultValue for mac-MainConfig 8.5.0 8.6.0 -Page 1 - - -3GPP TS 36.331 V8.6.0 (2009-06) -2 -Release 8 - - -3GPP - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-InterNodeDefinitions.asn b/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-InterNodeDefinitions.asn deleted file mode 100755 index 89d496601a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-InterNodeDefinitions.asn +++ /dev/null @@ -1,121 +0,0 @@ -EUTRA-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - - -HandoverCommand ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - handoverCommand-r8 HandoverCommand-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverCommand-r8-IEs ::= SEQUENCE { - handoverCommandMessage OCTET STRING (CONTAINING DL-DCCH-Message), - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -HandoverPreparationInformation ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - handoverPreparationInformation-r8 HandoverPreparationInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverPreparationInformation-r8-IEs ::= SEQUENCE { - ue-RadioAccessCapabilityInfo UE-CapabilityRAT-ContainerList, - as-Config AS-Config OPTIONAL, -- Cond HO - rrm-Config RRM-Config OPTIONAL, - as-Context AS-Context OPTIONAL, -- Cond HO - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -UERadioAccessCapabilityInformation ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - ueRadioAccessCapabilityInformation-r8 - UERadioAccessCapabilityInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UERadioAccessCapabilityInformation-r8-IEs ::= SEQUENCE { - ue-RadioAccessCapabilityInfo OCTET STRING (CONTAINING UECapabilityInformation), - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -AS-Config ::= SEQUENCE { - sourceMeasConfig MeasConfig, - sourceRadioResourceConfig RadioResourceConfigDedicated, - sourceSecurityAlgorithmConfig SecurityAlgorithmConfig, - sourceUE-Identity C-RNTI, - sourceMasterInformationBlock MasterInformationBlock, - sourceSystemInformationBlockType1 SystemInformationBlockType1, - sourceSystemInformationBlockType2 SystemInformationBlockType2, - antennaInfoCommon AntennaInfoCommon, - sourceDl-CarrierFreq ARFCN-ValueEUTRA, - ... -} - - -AS-Context ::= SEQUENCE { - reestablishmentInfo ReestablishmentInfo OPTIONAL -- Cond HO -} - - -ReestablishmentInfo ::= SEQUENCE { - sourcePhysCellId PhysCellId, - targetCellShortMAC-I ShortMAC-I, - additionalReestabInfoList AdditionalReestabInfoList OPTIONAL, - ... -} - -AdditionalReestabInfoList ::= SEQUENCE ( SIZE (1..maxReestabInfo) ) OF AdditionalReestabInfo - -AdditionalReestabInfo ::= SEQUENCE{ - cellIdentity CellIdentity, - key-eNodeB-Star Key-eNodeB-Star, - shortMAC-I ShortMAC-I -} - -Key-eNodeB-Star ::= BIT STRING (SIZE (256)) - - -RRM-Config ::= SEQUENCE { - ue-InactiveTime ENUMERATED { - s1, s2, s3, s5, s7, s10, s15, s20, - s25, s30, s40, s50, min1, min1s20c, min1s40, - min2, min2s30, min3, min3s30, min4, min5, min6, - min7, min8, min9, min10, min12, min14, min17, min20, - min24, min28, min33, min38, min44, min50, hr1, - hr1min30, hr2, hr2min30, hr3, hr3min30, hr4, hr5, hr6, - hr8, hr10, hr13, hr16, hr20, day1, day1hr12, day2, - day2hr12, day3, day4, day5, day7, day10, day14, day19, - day24, day30, dayMoreThan30} OPTIONAL, - ... -} - - -maxReestabInfo INTEGER ::= 32 -- Maximum number of KeNB* and shortMAC-I forwarded - -- at handover for re-establishment preparation - - -END - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-RRC-Definitions.asn b/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-RRC-Definitions.asn deleted file mode 100755 index 9fa19fa9bd..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-RRC-Definitions.asn +++ /dev/null @@ -1,2638 +0,0 @@ -EUTRA-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - - -BCCH-BCH-Message ::= SEQUENCE { - message BCCH-BCH-MessageType -} - -BCCH-BCH-MessageType ::= MasterInformationBlock - - -BCCH-DL-SCH-Message ::= SEQUENCE { - message BCCH-DL-SCH-MessageType -} - -BCCH-DL-SCH-MessageType ::= CHOICE { - c1 CHOICE { - systemInformation SystemInformation, - systemInformationBlockType1 SystemInformationBlockType1 - }, - messageClassExtension SEQUENCE {} -} - - -PCCH-Message ::= SEQUENCE { - message PCCH-MessageType -} - -PCCH-MessageType ::= CHOICE { - c1 CHOICE { - paging Paging - }, - messageClassExtension SEQUENCE {} -} - - -DL-CCCH-Message ::= SEQUENCE { - message DL-CCCH-MessageType -} - -DL-CCCH-MessageType ::= CHOICE { - c1 CHOICE { - rrcConnectionReestablishment RRCConnectionReestablishment, - rrcConnectionReestablishmentReject RRCConnectionReestablishmentReject, - rrcConnectionReject RRCConnectionReject, - rrcConnectionSetup RRCConnectionSetup - }, - messageClassExtension SEQUENCE {} -} - - -DL-DCCH-Message ::= SEQUENCE { - message DL-DCCH-MessageType -} - -DL-DCCH-MessageType ::= CHOICE { - c1 CHOICE { - csfbParametersResponseCDMA2000 CSFBParametersResponseCDMA2000, - dlInformationTransfer DLInformationTransfer, - handoverFromEUTRAPreparationRequest HandoverFromEUTRAPreparationRequest, - mobilityFromEUTRACommand MobilityFromEUTRACommand, - rrcConnectionReconfiguration RRCConnectionReconfiguration, - rrcConnectionRelease RRCConnectionRelease, - securityModeCommand SecurityModeCommand, - ueCapabilityEnquiry UECapabilityEnquiry, - counterCheck CounterCheck, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - messageClassExtension SEQUENCE {} -} - - -UL-CCCH-Message ::= SEQUENCE { - message UL-CCCH-MessageType -} - -UL-CCCH-MessageType ::= CHOICE { - c1 CHOICE { - rrcConnectionReestablishmentRequest RRCConnectionReestablishmentRequest, - rrcConnectionRequest RRCConnectionRequest - }, - messageClassExtension SEQUENCE {} -} - - -UL-DCCH-Message ::= SEQUENCE { - message UL-DCCH-MessageType -} - -UL-DCCH-MessageType ::= CHOICE { - c1 CHOICE { - csfbParametersRequestCDMA2000 CSFBParametersRequestCDMA2000, - measurementReport MeasurementReport, - rrcConnectionReconfigurationComplete RRCConnectionReconfigurationComplete, - rrcConnectionReestablishmentComplete RRCConnectionReestablishmentComplete, - rrcConnectionSetupComplete RRCConnectionSetupComplete, - securityModeComplete SecurityModeComplete, - securityModeFailure SecurityModeFailure, - ueCapabilityInformation UECapabilityInformation, - ulHandoverPreparationTransfer ULHandoverPreparationTransfer, - ulInformationTransfer ULInformationTransfer, - counterCheckResponse CounterCheckResponse, - spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - messageClassExtension SEQUENCE {} -} - - -CounterCheck ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - counterCheck-r8 CounterCheck-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -CounterCheck-r8-IEs ::= SEQUENCE { - drb-CountMSB-InfoList DRB-CountMSB-InfoList, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - -DRB-CountMSB-InfoList::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-CountMSB-Info - -DRB-CountMSB-Info ::= SEQUENCE { - drb-Identity DRB-Identity, - countMSB-Uplink INTEGER(0..33554431), - countMSB-Downlink INTEGER(0..33554431) -} - - -CounterCheckResponse ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - counterCheckResponse-r8 CounterCheckResponse-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CounterCheckResponse-r8-IEs ::= SEQUENCE { - drb-CountInfoList DRB-CountInfoList, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -DRB-CountInfoList ::= SEQUENCE (SIZE (0..maxDRB)) OF DRB-CountInfo - -DRB-CountInfo ::= SEQUENCE { - drb-Identity DRB-Identity, - count-Uplink INTEGER(0..4294967295), - count-Downlink INTEGER(0..4294967295) -} - - -CSFBParametersRequestCDMA2000 ::= SEQUENCE { - criticalExtensions CHOICE { - csfbParametersRequestCDMA2000-r8 CSFBParametersRequestCDMA2000-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CSFBParametersRequestCDMA2000-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -CSFBParametersResponseCDMA2000 ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - csfbParametersResponseCDMA2000-r8 CSFBParametersResponseCDMA2000-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -CSFBParametersResponseCDMA2000-r8-IEs ::= SEQUENCE { - rand RAND-CDMA2000, - mobilityParameters MobilityParametersCDMA2000, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - - -DLInformationTransfer ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - dlInformationTransfer-r8 DLInformationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -DLInformationTransfer-r8-IEs ::= SEQUENCE { - dedicatedInfoType CHOICE { - dedicatedInfoNAS DedicatedInfoNAS, - dedicatedInfoCDMA2000-1XRTT DedicatedInfoCDMA2000, - dedicatedInfoCDMA2000-HRPD DedicatedInfoCDMA2000 - }, - nonCriticalExtension SEQUENCE {} OPTIONAL --Need OP -} - - -HandoverFromEUTRAPreparationRequest ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - handoverFromEUTRAPreparationRequest-r8 - HandoverFromEUTRAPreparationRequest-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -HandoverFromEUTRAPreparationRequest-r8-IEs ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - rand RAND-CDMA2000 OPTIONAL, -- Cond cdma2000-Type - mobilityParameters MobilityParametersCDMA2000 OPTIONAL, -- Cond cdma2000-Type - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -MasterInformationBlock ::= SEQUENCE { - dl-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100}, - phich-Config PHICH-Config, - systemFrameNumber BIT STRING (SIZE (8)), - spare BIT STRING (SIZE (10)) -} - - - -MeasurementReport ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE{ - measurementReport-r8 MeasurementReport-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -MeasurementReport-r8-IEs ::= SEQUENCE { - measResults MeasResults, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -MobilityFromEUTRACommand ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - mobilityFromEUTRACommand-r8 MobilityFromEUTRACommand-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -MobilityFromEUTRACommand-r8-IEs ::= SEQUENCE { - cs-FallbackIndicator BOOLEAN, - purpose CHOICE{ - handover Handover, - cellChangeOrder CellChangeOrder - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -Handover ::= SEQUENCE { - targetRAT-Type ENUMERATED { - utra, geran, cdma2000-1XRTT, cdma2000-HRPD, - spare4, spare3, spare2, spare1, ...}, - targetRAT-MessageContainer OCTET STRING, - nas-SecurityParamFromEUTRA OCTET STRING (SIZE (1)) OPTIONAL, -- Cond UTRAGERAN - systemInformation SI-OrPSI-GERAN OPTIONAL -- Cond PSHO -} - -CellChangeOrder ::= SEQUENCE { - t304 ENUMERATED { - ms100, ms200, ms500, ms1000, - ms2000, ms4000, ms8000, spare1}, - targetRAT-Type CHOICE { - geran SEQUENCE { - physCellId PhysCellIdGERAN, - carrierFreq CarrierFreqGERAN, - networkControlOrder BIT STRING (SIZE (2)) OPTIONAL, -- Need OP - systemInformation SI-OrPSI-GERAN OPTIONAL -- Need OP - }, - ... - } -} - -SI-OrPSI-GERAN ::= CHOICE { - si SystemInfoListGERAN, - psi SystemInfoListGERAN -} - -SystemInfoListGERAN ::= SEQUENCE (SIZE (1..maxGERAN-SI)) OF - OCTET STRING (SIZE (1..23)) - - -Paging ::= SEQUENCE { - pagingRecordList PagingRecordList OPTIONAL, -- Need ON - systemInfoModification ENUMERATED {true} OPTIONAL, -- Need ON - etws-Indication ENUMERATED {true} OPTIONAL, -- Need ON - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -PagingRecordList ::= SEQUENCE (SIZE (1..maxPageRec)) OF PagingRecord - -PagingRecord ::= SEQUENCE { - ue-Identity PagingUE-Identity, - cn-Domain ENUMERATED {ps, cs}, - ... -} - -PagingUE-Identity ::= CHOICE { - s-TMSI S-TMSI, - imsi IMSI, - ... -} - -IMSI ::= SEQUENCE (SIZE (6..21)) OF IMSI-Digit - -IMSI-Digit::= INTEGER (0..9) - - -RRCConnectionReconfiguration ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionReconfiguration-r8 RRCConnectionReconfiguration-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfiguration-r8-IEs ::= SEQUENCE { - measConfig MeasConfig OPTIONAL, -- Need ON - mobilityControlInfo MobilityControlInfo OPTIONAL, -- Cond HO - dedicatedInfoNASList SEQUENCE (SIZE(1..maxDRB)) OF - DedicatedInfoNAS OPTIONAL, -- Cond nonHO - radioResourceConfigDedicated RadioResourceConfigDedicated OPTIONAL, -- Cond HO-toEUTRA - securityConfigHO SecurityConfigHO OPTIONAL, -- Cond HO - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -SecurityConfigHO ::= SEQUENCE { - handoverType CHOICE { - intraLTE SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig OPTIONAL, -- Need OP - keyChangeIndicator BOOLEAN, - nextHopChainingCount NextHopChainingCount - }, - interRAT SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig, - nas-SecurityParamToEUTRA OCTET STRING (SIZE(6)) - } - }, - ... -} - - -RRCConnectionReconfigurationComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - rrcConnectionReconfigurationComplete-r8 - RRCConnectionReconfigurationComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReconfigurationComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -RRCConnectionReestablishment ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionReestablishment-r8 RRCConnectionReestablishment-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishment-r8-IEs ::= SEQUENCE { - radioResourceConfigDedicated RadioResourceConfigDedicated, - nextHopChainingCount NextHopChainingCount, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -RRCConnectionReestablishmentComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - rrcConnectionReestablishmentComplete-r8 - RRCConnectionReestablishmentComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -RRCConnectionReestablishmentReject ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionReestablishmentReject-r8 - RRCConnectionReestablishmentReject-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentReject-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -RRCConnectionReestablishmentRequest ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionReestablishmentRequest-r8 - RRCConnectionReestablishmentRequest-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReestablishmentRequest-r8-IEs ::= SEQUENCE { - ue-Identity ReestabUE-Identity, - reestablishmentCause ReestablishmentCause, - spare BIT STRING (SIZE (2)) -} - -ReestabUE-Identity ::= SEQUENCE { - c-RNTI C-RNTI, - physCellId PhysCellId, - shortMAC-I ShortMAC-I -} - -ReestablishmentCause ::= ENUMERATED { - reconfigurationFailure, handoverFailure, - otherFailure, spare1} - - -RRCConnectionReject ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionReject-r8 RRCConnectionReject-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionReject-r8-IEs ::= SEQUENCE { - waitTime INTEGER (1..16), - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -RRCConnectionRelease ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionRelease-r8 RRCConnectionRelease-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionRelease-r8-IEs ::= SEQUENCE { - releaseCause ReleaseCause, - redirectedCarrierInfo RedirectedCarrierInfo OPTIONAL, -- Need ON - idleModeMobilityControlInfo IdleModeMobilityControlInfo OPTIONAL, -- Need OP - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -ReleaseCause ::= ENUMERATED {loadBalancingTAUrequired, - other,spare2, spare1 } - -RedirectedCarrierInfo ::= CHOICE { - eutra ARFCN-ValueEUTRA, - geran CarrierFreqsGERAN, - utra-FDD ARFCN-ValueUTRA, - utra-TDD ARFCN-ValueUTRA, - cdma2000-HRPD CarrierFreqCDMA2000, - cdma2000-1xRTT CarrierFreqCDMA2000, - ... -} - -IdleModeMobilityControlInfo ::= SEQUENCE { - freqPriorityListEUTRA FreqPriorityListEUTRA OPTIONAL, -- Need ON - freqPriorityListGERAN FreqsPriorityListGERAN OPTIONAL, -- Need ON - freqPriorityListUTRA-FDD FreqPriorityListUTRA-FDD OPTIONAL, -- Need ON - freqPriorityListUTRA-TDD FreqPriorityListUTRA-TDD OPTIONAL, -- Need ON - bandClassPriorityListHRPD BandClassPriorityListHRPD OPTIONAL, -- Need ON - bandClassPriorityList1XRTT BandClassPriorityList1XRTT OPTIONAL, -- Need ON - t320 ENUMERATED { - min5, min10, min20, min30, min60, min120, min180, - spare1} OPTIONAL, -- Need OR - ... -} - -FreqPriorityListEUTRA ::= SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA - -FreqPriorityEUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueEUTRA, - cellReselectionPriority CellReselectionPriority -} - -FreqsPriorityListGERAN ::= SEQUENCE (SIZE (1..maxGNFG)) OF FreqsPriorityGERAN - -FreqsPriorityGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - cellReselectionPriority CellReselectionPriority -} - -FreqPriorityListUTRA-FDD ::= SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF FreqPriorityUTRA-FDD - -FreqPriorityUTRA-FDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority -} - -FreqPriorityListUTRA-TDD ::= SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF FreqPriorityUTRA-TDD - -FreqPriorityUTRA-TDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority -} - -BandClassPriorityListHRPD ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassPriorityHRPD - -BandClassPriorityHRPD ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority -} - -BandClassPriorityList1XRTT ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassPriority1XRTT - -BandClassPriority1XRTT ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority -} - -RRCConnectionRequest ::= SEQUENCE { - criticalExtensions CHOICE { - rrcConnectionRequest-r8 RRCConnectionRequest-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionRequest-r8-IEs ::= SEQUENCE { - ue-Identity InitialUE-Identity, - establishmentCause EstablishmentCause, - spare BIT STRING (SIZE (1)) -} - -InitialUE-Identity ::= CHOICE { - s-TMSI S-TMSI, - randomValue BIT STRING (SIZE (40)) -} - -EstablishmentCause ::= ENUMERATED { - emergency, highPriorityAccess, mt-Access, mo-Signalling, - mo-Data, spare3, spare2, spare1} - - -RRCConnectionSetup ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - rrcConnectionSetup-r8 RRCConnectionSetup-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionSetup-r8-IEs ::= SEQUENCE { - radioResourceConfigDedicated RadioResourceConfigDedicated, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -RRCConnectionSetupComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - rrcConnectionSetupComplete-r8 RRCConnectionSetupComplete-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -RRCConnectionSetupComplete-r8-IEs ::= SEQUENCE { - selectedPLMN-Identity INTEGER (1..6), - registeredMME RegisteredMME OPTIONAL, - dedicatedInfoNAS DedicatedInfoNAS, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -RegisteredMME ::= SEQUENCE { - plmn-Identity PLMN-Identity OPTIONAL, - mmegi BIT STRING (SIZE (16)), - mmec MMEC -} - - -SecurityModeCommand ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - securityModeCommand-r8 SecurityModeCommand-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeCommand-r8-IEs ::= SEQUENCE { - securityConfigSMC SecurityConfigSMC, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -SecurityConfigSMC ::= SEQUENCE { - securityAlgorithmConfig SecurityAlgorithmConfig, - ... -} - - -SecurityModeComplete ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - securityModeComplete-r8 SecurityModeComplete-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeComplete-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -SecurityModeFailure ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - securityModeFailure-r8 SecurityModeFailure-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} - -SecurityModeFailure-r8-IEs ::= SEQUENCE { - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -SystemInformation ::= SEQUENCE { - criticalExtensions CHOICE { - systemInformation-r8 SystemInformation-r8-IEs, - criticalExtensionsFuture SEQUENCE {} - } -} -SystemInformation-r8-IEs ::= SEQUENCE { - sib-TypeAndInfo SEQUENCE (SIZE (1..maxSIB)) OF CHOICE { - sib2 SystemInformationBlockType2, - sib3 SystemInformationBlockType3, - sib4 SystemInformationBlockType4, - sib5 SystemInformationBlockType5, - sib6 SystemInformationBlockType6, - sib7 SystemInformationBlockType7, - sib8 SystemInformationBlockType8, - sib9 SystemInformationBlockType9, - sib10 SystemInformationBlockType10, - sib11 SystemInformationBlockType11, - ... - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - - -SystemInformationBlockType1 ::= SEQUENCE { - cellAccessRelatedInfo SEQUENCE { - plmn-IdentityList PLMN-IdentityList, - trackingAreaCode TrackingAreaCode, - cellIdentity CellIdentity, - cellBarred ENUMERATED {barred, notBarred}, - intraFreqReselection ENUMERATED {allowed, notAllowed}, - csg-Indication BOOLEAN, - csg-Identity BIT STRING (SIZE (27)) OPTIONAL -- Need OR - }, - cellSelectionInfo SEQUENCE { - q-RxLevMin Q-RxLevMin, - q-RxLevMinOffset INTEGER (1..8) OPTIONAL -- Need OP - }, - p-Max P-Max OPTIONAL, -- Need OP - freqBandIndicator INTEGER (1..64), - schedulingInfoList SchedulingInfoList, - tdd-Config TDD-Config OPTIONAL, -- Cond TDD - si-WindowLength ENUMERATED { - ms1, ms2, ms5, ms10, ms15, ms20, - ms40}, - systemInfoValueTag INTEGER (0..31), - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -PLMN-IdentityList ::= SEQUENCE (SIZE (1..6)) OF PLMN-IdentityInfo - -PLMN-IdentityInfo ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellReservedForOperatorUse ENUMERATED {reserved, notReserved} -} - -SchedulingInfoList ::= SEQUENCE (SIZE (1..maxSI-Message)) OF SchedulingInfo - -SchedulingInfo ::= SEQUENCE { - si-Periodicity ENUMERATED { - rf8, rf16, rf32, rf64, rf128, rf256, rf512}, - sib-MappingInfo SIB-MappingInfo -} - -SIB-MappingInfo ::= SEQUENCE (SIZE (0..maxSIB-1)) OF SIB-Type - -SIB-Type ::= ENUMERATED { - sibType3, sibType4, sibType5, sibType6, - sibType7, sibType8, sibType9, sibType10, - sibType11, spare7, spare6, spare5, - spare4, spare3, spare2, spare1, ...} - - -UECapabilityEnquiry ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE { - ueCapabilityEnquiry-r8 UECapabilityEnquiry-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UECapabilityEnquiry-r8-IEs ::= SEQUENCE { - ue-CapabilityRequest UE-CapabilityRequest, - nonCriticalExtension SEQUENCE {} OPTIONAL -- Need OP -} - -UE-CapabilityRequest ::= SEQUENCE (SIZE (1..maxRAT-Capabilities)) OF RAT-Type - - -UECapabilityInformation ::= SEQUENCE { - rrc-TransactionIdentifier RRC-TransactionIdentifier, - criticalExtensions CHOICE { - c1 CHOICE{ - ueCapabilityInformation-r8 UECapabilityInformation-r8-IEs, - spare7 NULL, - spare6 NULL, spare5 NULL, spare4 NULL, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -UECapabilityInformation-r8-IEs ::= SEQUENCE { - ue-CapabilityRAT-ContainerList UE-CapabilityRAT-ContainerList, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -ULHandoverPreparationTransfer ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - ulHandoverPreparationTransfer-r8 ULHandoverPreparationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -ULHandoverPreparationTransfer-r8-IEs ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - meid BIT STRING (SIZE (56)) OPTIONAL, - dedicatedInfo DedicatedInfoCDMA2000, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -ULInformationTransfer ::= SEQUENCE { - criticalExtensions CHOICE { - c1 CHOICE { - ulInformationTransfer-r8 ULInformationTransfer-r8-IEs, - spare3 NULL, spare2 NULL, spare1 NULL - }, - criticalExtensionsFuture SEQUENCE {} - } -} - -ULInformationTransfer-r8-IEs ::= SEQUENCE { - dedicatedInfoType CHOICE { - dedicatedInfoNAS DedicatedInfoNAS, - dedicatedInfoCDMA2000-1XRTT DedicatedInfoCDMA2000, - dedicatedInfoCDMA2000-HRPD DedicatedInfoCDMA2000 - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - - -SystemInformationBlockType2 ::= SEQUENCE { - ac-BarringInfo SEQUENCE { - ac-BarringForEmergency BOOLEAN, - ac-BarringForMO-Signalling AC-BarringConfig OPTIONAL, -- Need OP - ac-BarringForMO-Data AC-BarringConfig OPTIONAL -- Need OP - } OPTIONAL, -- Need OP - radioResourceConfigCommon RadioResourceConfigCommonSIB, - ue-TimersAndConstants UE-TimersAndConstants, - freqInfo SEQUENCE { - ul-CarrierFreq ARFCN-ValueEUTRA OPTIONAL, -- Need OP - ul-Bandwidth ENUMERATED {n6, n15, n25, n50, n75, n100} - OPTIONAL, -- Need OP - additionalSpectrumEmission AdditionalSpectrumEmission - }, - mbsfn-SubframeConfigList MBSFN-SubframeConfigList OPTIONAL, -- Need OR - timeAlignmentTimerCommon TimeAlignmentTimer, - ... -} - -AC-BarringConfig ::= SEQUENCE { - ac-BarringFactor ENUMERATED { - p00, p05, p10, p15, p20, p25, p30, p40, - p50, p60, p70, p75, p80, p85, p90, p95}, - ac-BarringTime ENUMERATED {s4, s8, s16, s32, s64, s128, s256, s512}, - ac-BarringForSpecialAC BIT STRING (SIZE(5)) -} - -MBSFN-SubframeConfigList ::= SEQUENCE (SIZE (1..maxMBSFN-Allocations)) OF MBSFN-SubframeConfig - -MBSFN-SubframeConfig ::= SEQUENCE { - radioframeAllocationPeriod ENUMERATED {n1, n2, n4, n8, n16, n32}, - radioframeAllocationOffset INTEGER (0..7), - subframeAllocation CHOICE { - oneFrame BIT STRING (SIZE(6)), - fourFrames BIT STRING (SIZE(24)) - } -} - -SystemInformationBlockType3 ::= SEQUENCE { - cellReselectionInfoCommon SEQUENCE { - q-Hyst ENUMERATED { - dB0, dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10, - dB12, dB14, dB16, dB18, dB20, dB22, dB24}, - speedStateReselectionPars SEQUENCE { - mobilityStateParameters MobilityStateParameters, - q-HystSF SEQUENCE { - sf-Medium ENUMERATED { - dB-6, dB-4, dB-2, dB0}, - sf-High ENUMERATED { - dB-6, dB-4, dB-2, dB0} - } - } OPTIONAL -- Need OP - }, - cellReselectionServingFreqInfo SEQUENCE { - s-NonIntraSearch ReselectionThreshold OPTIONAL, -- Need OP - threshServingLow ReselectionThreshold, - cellReselectionPriority CellReselectionPriority - }, - intraFreqCellReselectionInfo SEQUENCE { - q-RxLevMin Q-RxLevMin, - p-Max P-Max OPTIONAL, -- Need OP - s-IntraSearch ReselectionThreshold OPTIONAL, -- Need OP - allowedMeasBandwidth AllowedMeasBandwidth OPTIONAL, -- Need OP - presenceAntennaPort1 PresenceAntennaPort1, - neighCellConfig NeighCellConfig, - t-ReselectionEUTRA T-Reselection, - t-ReselectionEUTRA-SF SpeedStateScaleFactors OPTIONAL -- Need OP - }, - ... -} - - -SystemInformationBlockType4 ::= SEQUENCE { - intraFreqNeighCellList IntraFreqNeighCellList OPTIONAL, -- Need OR - intraFreqBlackCellList IntraFreqBlackCellList OPTIONAL, -- Need OR - csg-PhysCellIdRange PhysCellIdRange OPTIONAL, -- Cond CSG - ... -} - -IntraFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellIntra)) OF IntraFreqNeighCellInfo - -IntraFreqNeighCellInfo ::= SEQUENCE { - physCellId PhysCellId, - q-OffsetCell Q-OffsetRange, - ... -} - -IntraFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PhysCellIdRange - - -SystemInformationBlockType5 ::= SEQUENCE { - interFreqCarrierFreqList InterFreqCarrierFreqList, - ... -} - -InterFreqCarrierFreqList ::= SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo - -InterFreqCarrierFreqInfo ::= SEQUENCE { - dl-CarrierFreq ARFCN-ValueEUTRA, - q-RxLevMin Q-RxLevMin, - p-Max P-Max OPTIONAL, -- Need OP - t-ReselectionEUTRA T-Reselection, - t-ReselectionEUTRA-SF SpeedStateScaleFactors OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - allowedMeasBandwidth AllowedMeasBandwidth, - presenceAntennaPort1 PresenceAntennaPort1, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - neighCellConfig NeighCellConfig, - q-OffsetFreq Q-OffsetRange DEFAULT dB0, - interFreqNeighCellList InterFreqNeighCellList OPTIONAL, -- Need OR - interFreqBlackCellList InterFreqBlackCellList OPTIONAL, -- Need OR - ... -} - -InterFreqNeighCellList ::= SEQUENCE (SIZE (1..maxCellInter)) OF InterFreqNeighCellInfo - -InterFreqNeighCellInfo ::= SEQUENCE { - physCellId PhysCellId, - q-OffsetCell Q-OffsetRange -} - -InterFreqBlackCellList ::= SEQUENCE (SIZE (1..maxCellBlack)) OF PhysCellIdRange - - -SystemInformationBlockType6 ::= SEQUENCE { - carrierFreqListUTRA-FDD CarrierFreqListUTRA-FDD OPTIONAL, -- Need OR - carrierFreqListUTRA-TDD CarrierFreqListUTRA-TDD OPTIONAL, -- Need OR - t-ReselectionUTRA T-Reselection, - t-ReselectionUTRA-SF SpeedStateScaleFactors OPTIONAL, -- Need OP - ... -} - -CarrierFreqListUTRA-FDD ::= SEQUENCE (SIZE (1..maxUTRA-FDD-Carrier)) OF CarrierFreqUTRA-FDD - -CarrierFreqUTRA-FDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - q-RxLevMin INTEGER (-60..-13), - p-MaxUTRA INTEGER (-50..33), - q-QualMin INTEGER (-24..0), - ... -} - -CarrierFreqListUTRA-TDD ::= SEQUENCE (SIZE (1..maxUTRA-TDD-Carrier)) OF CarrierFreqUTRA-TDD - -CarrierFreqUTRA-TDD ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold, - q-RxLevMin INTEGER (-60..-13), - p-MaxUTRA INTEGER (-50..33), - ... -} - - -SystemInformationBlockType7 ::= SEQUENCE { - t-ReselectionGERAN T-Reselection, - t-ReselectionGERAN-SF SpeedStateScaleFactors OPTIONAL, -- Need OR - carrierFreqsInfoList CarrierFreqsInfoListGERAN OPTIONAL, -- Need OR - ... -} - -CarrierFreqsInfoListGERAN ::= SEQUENCE (SIZE (1..maxGNFG)) OF CarrierFreqsInfoGERAN - -CarrierFreqsInfoGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - commonInfo SEQUENCE { - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - ncc-Permitted BIT STRING (SIZE (8)), - q-RxLevMin INTEGER (0..45), - p-MaxGERAN INTEGER (0..39) OPTIONAL, -- Need OP - threshX-High ReselectionThreshold, - threshX-Low ReselectionThreshold - }, - ... -} - - -SystemInformationBlockType8 ::= SEQUENCE { - systemTimeInfo SystemTimeInfoCDMA2000 OPTIONAL, -- Need OR - searchWindowSize INTEGER (0..15) OPTIONAL, -- Need OR - parametersHRPD SEQUENCE { - preRegistrationInfoHRPD PreRegistrationInfoHRPD, - cellReselectionParametersHRPD CellReselectionParametersCDMA2000 OPTIONAL -- Need OR - } OPTIONAL, -- Need OR - parameters1XRTT SEQUENCE { - csfb-RegistrationParam1XRTT CSFB-RegistrationParam1XRTT OPTIONAL, -- Need OP - longCodeState1XRTT BIT STRING (SIZE (42)) OPTIONAL, -- Need OR - cellReselectionParameters1XRTT CellReselectionParametersCDMA2000 OPTIONAL -- Need OR - } OPTIONAL, -- Need OR - ... -} - -CellReselectionParametersCDMA2000 ::= SEQUENCE { - bandClassList BandClassListCDMA2000, - neighCellList NeighCellListCDMA2000, - t-ReselectionCDMA2000 T-Reselection, - t-ReselectionCDMA2000-SF SpeedStateScaleFactors OPTIONAL -- Need OP -} -NeighCellListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF NeighCellCDMA2000 - -NeighCellCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - neighCellsPerFreqList NeighCellsPerBandclassListCDMA2000 -} - -NeighCellsPerBandclassListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF NeighCellsPerBandclassCDMA2000 - -NeighCellsPerBandclassCDMA2000 ::= SEQUENCE { - arfcn ARFCN-ValueCDMA2000, - physCellIdList PhysCellIdListCDMA2000 -} - -PhysCellIdListCDMA2000 ::= SEQUENCE (SIZE (1..16)) OF PhysCellIdCDMA2000 - -BandClassListCDMA2000 ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandClassInfoCDMA2000 - -BandClassInfoCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - cellReselectionPriority CellReselectionPriority OPTIONAL, -- Need OP - threshX-High INTEGER (0..63), - threshX-Low INTEGER (0..63), - ... -} - - -SystemInformationBlockType9 ::= SEQUENCE { - hnb-Name OCTET STRING (SIZE(1..48)) OPTIONAL, -- Need OR - ... -} - - -SystemInformationBlockType10 ::= SEQUENCE { - messageIdentifier BIT STRING (SIZE (16)), - serialNumber BIT STRING (SIZE (16)), - warningType OCTET STRING (SIZE (2)), - warningSecurityInfo OCTET STRING (SIZE (50)) OPTIONAL, -- Need OP - ... -} - - -SystemInformationBlockType11 ::= SEQUENCE { - messageIdentifier BIT STRING (SIZE (16)), - serialNumber BIT STRING (SIZE (16)), - warningMessageSegmentType ENUMERATED {notLastSegment, lastSegment}, - warningMessageSegmentNumber INTEGER (0..63), - warningMessageSegment OCTET STRING, - dataCodingScheme OCTET STRING (SIZE (1)) OPTIONAL, -- Cond Segment1 - ... -} - - -AntennaInfoCommon ::= SEQUENCE { - antennaPortsCount ENUMERATED {an1, an2, an4, spare1} -} - -AntennaInfoDedicated ::= SEQUENCE { - transmissionMode ENUMERATED { - tm1, tm2, tm3, tm4, tm5, tm6, - tm7, spare1}, - codebookSubsetRestriction CHOICE { - n2TxAntenna-tm3 BIT STRING (SIZE (2)), - n4TxAntenna-tm3 BIT STRING (SIZE (4)), - n2TxAntenna-tm4 BIT STRING (SIZE (6)), - n4TxAntenna-tm4 BIT STRING (SIZE (64)), - n2TxAntenna-tm5 BIT STRING (SIZE (4)), - n4TxAntenna-tm5 BIT STRING (SIZE (16)), - n2TxAntenna-tm6 BIT STRING (SIZE (4)), - n4TxAntenna-tm6 BIT STRING (SIZE (16)) - } OPTIONAL, -- Cond TM - ue-TransmitAntennaSelection CHOICE{ - release NULL, - setup ENUMERATED {closedLoop, openLoop} - } -} - - -CQI-ReportConfig ::= SEQUENCE { - cqi-ReportModeAperiodic ENUMERATED { - rm12, rm20, rm22, rm30, rm31, - spare3, spare2, spare1} OPTIONAL, -- Need OR - nomPDSCH-RS-EPRE-Offset INTEGER (-1..6), - cqi-ReportPeriodic CQI-ReportPeriodic OPTIONAL -- Need ON -} - -CQI-ReportPeriodic ::= CHOICE { - release NULL, - setup SEQUENCE { - cqi-PUCCH-ResourceIndex INTEGER (0.. 1185), - cqi-pmi-ConfigIndex INTEGER (0..1023), - cqi-FormatIndicatorPeriodic CHOICE { - widebandCQI NULL, - subbandCQI SEQUENCE { - k INTEGER (1..4) - } - }, - ri-ConfigIndex INTEGER (0..1023) OPTIONAL, -- Need OR - simultaneousAckNackAndCQI BOOLEAN - } -} - - -DRB-Identity ::= INTEGER (1..32) - - -LogicalChannelConfig ::= SEQUENCE { - ul-SpecificParameters SEQUENCE { - priority INTEGER (1..16), - prioritisedBitRate ENUMERATED { - kBps0, kBps8, kBps16, kBps32, kBps64, kBps128, - kBps256, infinity, spare8, spare7, spare6, - spare5, spare4, spare3, spare2, spare1}, - bucketSizeDuration ENUMERATED { - ms50, ms100, ms150, ms300, ms500, ms1000, spare2, - spare1}, - logicalChannelGroup INTEGER (0..3) OPTIONAL -- Need OR - } OPTIONAL, -- Cond UL - ... -} - - -MAC-MainConfig ::= SEQUENCE { - ul-SCH-Config SEQUENCE { - maxHARQ-Tx ENUMERATED { - n1, n2, n3, n4, n5, n6, n7, n8, - n10, n12, n16, n20, n24, n28, - spare2, spare1} OPTIONAL, -- Need ON - periodicBSR-Timer ENUMERATED { - sf5, sf10, sf16, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, sf1280, sf2560, - infinity, spare1} OPTIONAL, -- Need ON - retxBSR-Timer ENUMERATED { - sf320, sf640, sf1280, sf2560, sf5120, - sf10240, spare2, spare1}, - ttiBundling BOOLEAN - } OPTIONAL, -- Need ON - drx-Config DRX-Config OPTIONAL, -- Need ON - timeAlignmentTimerDedicated TimeAlignmentTimer, - phr-Config CHOICE { - release NULL, - setup SEQUENCE { - periodicPHR-Timer ENUMERATED {sf10, sf20, sf50, sf100, sf200, - sf500, sf1000, infinity}, - prohibitPHR-Timer ENUMERATED {sf0, sf10, sf20, sf50, sf100, - sf200, sf500, sf1000}, - dl-PathlossChange ENUMERATED {dB1, dB3, dB6, infinity} - } - } OPTIONAL, -- Need ON - ... -} - -DRX-Config ::= CHOICE { - release NULL, - setup SEQUENCE { - onDurationTimer ENUMERATED { - psf1, psf2, psf3, psf4, psf5, psf6, - psf8, psf10, psf20, psf30, psf40, - psf50, psf60, psf80, psf100, - psf200}, - drx-InactivityTimer ENUMERATED { - psf1, psf2, psf3, psf4, psf5, psf6, - psf8, psf10, psf20, psf30, psf40, - psf50, psf60, psf80, psf100, - psf200, psf300, psf500, psf750, - psf1280, psf1920, psf2560, spare10, - spare9, spare8, spare7, spare6, - spare5, spare4, spare3, spare2, - spare1}, - drx-RetransmissionTimer ENUMERATED { - psf1, psf2, psf4, psf6, psf8, psf16, - psf24, psf33}, - longDRX-CycleStartOffset CHOICE { - sf10 INTEGER(0..9), - sf20 INTEGER(0..19), - sf32 INTEGER(0..31), - sf40 INTEGER(0..39), - sf64 INTEGER(0..63), - sf80 INTEGER(0..79), - sf128 INTEGER(0..127), - sf160 INTEGER(0..159), - sf256 INTEGER(0..255), - sf320 INTEGER(0..319), - sf512 INTEGER(0..511), - sf640 INTEGER(0..639), - sf1024 INTEGER(0..1023), - sf1280 INTEGER(0..1279), - sf2048 INTEGER(0..2047), - sf2560 INTEGER(0..2559) - }, - shortDRX SEQUENCE { - shortDRX-Cycle ENUMERATED { - sf2, sf5, sf8, sf10, sf16, sf20, - sf32, sf40, sf64, sf80, sf128, sf160, - sf256, sf320, sf512, sf640}, - drxShortCycleTimer INTEGER (1..16) - } OPTIONAL -- Need OR - } -} - - -PDCP-Config ::= SEQUENCE { - discardTimer ENUMERATED { - ms50, ms100, ms150, ms300, ms500, - ms750, ms1500, infinity - } OPTIONAL, -- Cond Setup - rlc-AM SEQUENCE { - statusReportRequired BOOLEAN - } OPTIONAL, -- Cond Rlc-AM - rlc-UM SEQUENCE { - pdcp-SN-Size ENUMERATED {len7bits, len12bits} - } OPTIONAL, -- Cond Rlc-UM - headerCompression CHOICE { - notUsed NULL, - rohc SEQUENCE { - maxCID INTEGER (1..16383) DEFAULT 15, - profiles SEQUENCE { - profile0x0001 BOOLEAN, - profile0x0002 BOOLEAN, - profile0x0003 BOOLEAN, - profile0x0004 BOOLEAN, - profile0x0006 BOOLEAN, - profile0x0101 BOOLEAN, - profile0x0102 BOOLEAN, - profile0x0103 BOOLEAN, - profile0x0104 BOOLEAN - }, - ... - } - }, - ... -} - - -PDSCH-ConfigCommon::= SEQUENCE { - referenceSignalPower INTEGER (-60..50), - p-b INTEGER (0..3) -} - -PDSCH-ConfigDedicated::= SEQUENCE { - p-a ENUMERATED { - dB-6, dB-4dot77, dB-3, dB-1dot77, - dB0, dB1, dB2, dB3 } -} - - -PHICH-Config ::= SEQUENCE { - phich-Duration ENUMERATED {normal, extended}, - phich-Resource ENUMERATED {oneSixth, half, one, two} -} - - -PhysicalConfigDedicated ::= SEQUENCE { - pdsch-ConfigDedicated PDSCH-ConfigDedicated OPTIONAL, -- Need ON - pucch-ConfigDedicated PUCCH-ConfigDedicated OPTIONAL, -- Need ON - pusch-ConfigDedicated PUSCH-ConfigDedicated OPTIONAL, -- Need ON - uplinkPowerControlDedicated UplinkPowerControlDedicated OPTIONAL, -- Need ON - tpc-PDCCH-ConfigPUCCH TPC-PDCCH-Config OPTIONAL, -- Need ON - tpc-PDCCH-ConfigPUSCH TPC-PDCCH-Config OPTIONAL, -- Need ON - cqi-ReportConfig CQI-ReportConfig OPTIONAL, -- Need ON - soundingRS-UL-ConfigDedicated SoundingRS-UL-ConfigDedicated OPTIONAL, -- Need ON - antennaInfo CHOICE { - explicitValue AntennaInfoDedicated, - defaultValue NULL - } OPTIONAL, -- Need ON - schedulingRequestConfig SchedulingRequestConfig OPTIONAL, -- Need ON - ... -} - - -P-Max ::= INTEGER (-30..33) - - -PRACH-ConfigSIB ::= SEQUENCE { - rootSequenceIndex INTEGER (0..837), - prach-ConfigInfo PRACH-ConfigInfo -} - -PRACH-Config ::= SEQUENCE { - rootSequenceIndex INTEGER (0..837), - prach-ConfigInfo PRACH-ConfigInfo OPTIONAL -- Need ON -} - -PRACH-ConfigInfo ::= SEQUENCE { - prach-ConfigIndex INTEGER (0..63), - highSpeedFlag BOOLEAN, - zeroCorrelationZoneConfig INTEGER (0..15), - prach-FreqOffset INTEGER (0..94) -} - - -PresenceAntennaPort1 ::= BOOLEAN - - -PUCCH-ConfigCommon ::= SEQUENCE { - deltaPUCCH-Shift ENUMERATED {ds1, ds2, ds3}, - nRB-CQI INTEGER (0..98), - nCS-AN INTEGER (0..7), - n1PUCCH-AN INTEGER (0..2047) -} - -PUCCH-ConfigDedicated ::= SEQUENCE { - ackNackRepetition CHOICE{ - release NULL, - setup SEQUENCE { - repetitionFactor ENUMERATED { n2, n4, n6, spare1}, - n1PUCCH-AN-Rep INTEGER (0..2047) - } - }, - tdd-AckNackFeedbackMode ENUMERATED {bundling, multiplexing} OPTIONAL -- Cond TDD -} - - -PUSCH-ConfigCommon ::= SEQUENCE { - pusch-ConfigBasic SEQUENCE { - n-SB INTEGER (1..4), - hoppingMode ENUMERATED {interSubFrame, intraAndInterSubFrame}, - pusch-HoppingOffset INTEGER (0..98), - enable64QAM BOOLEAN - }, - ul-ReferenceSignalsPUSCH UL-ReferenceSignalsPUSCH -} - -PUSCH-ConfigDedicated ::= SEQUENCE { - betaOffset-ACK-Index INTEGER (0..15), - betaOffset-RI-Index INTEGER (0..15), - betaOffset-CQI-Index INTEGER (0..15) -} - -UL-ReferenceSignalsPUSCH ::= SEQUENCE { - groupHoppingEnabled BOOLEAN, - groupAssignmentPUSCH INTEGER (0..29), - sequenceHoppingEnabled BOOLEAN, - cyclicShift INTEGER (0..7) -} - - -RACH-ConfigCommon ::= SEQUENCE { - preambleInfo SEQUENCE { - numberOfRA-Preambles ENUMERATED { - n4, n8, n12, n16 ,n20, n24, n28, - n32, n36, n40, n44, n48, n52, n56, - n60, n64}, - preamblesGroupAConfig SEQUENCE { - sizeOfRA-PreamblesGroupA ENUMERATED { - n4, n8, n12, n16 ,n20, n24, n28, - n32, n36, n40, n44, n48, n52, n56, - n60}, - messageSizeGroupA ENUMERATED {b56, b144, b208, b256}, - messagePowerOffsetGroupB ENUMERATED { - minusinfinity, dB0, dB5, dB8, dB10, dB12, - dB15, dB18}, - ... - } OPTIONAL -- Need OP - }, - powerRampingParameters SEQUENCE { - powerRampingStep ENUMERATED {dB0, dB2,dB4, dB6}, - preambleInitialReceivedTargetPower ENUMERATED { - dBm-120, dBm-118, dBm-116, dBm-114, dBm-112, - dBm-110, dBm-108, dBm-106, dBm-104, dBm-102, - dBm-100, dBm-98, dBm-96, dBm-94, - dBm-92, dBm-90} - }, - ra-SupervisionInfo SEQUENCE { - preambleTransMax ENUMERATED { - n3, n4, n5, n6, n7, n8, n10, n20, n50, - n100, n200}, - ra-ResponseWindowSize ENUMERATED { - sf2, sf3, sf4, sf5, sf6, sf7, - sf8, sf10}, - mac-ContentionResolutionTimer ENUMERATED { - sf8, sf16, sf24, sf32, sf40, sf48, - sf56, sf64} - }, - maxHARQ-Msg3Tx INTEGER (1..8), - ... -} - - -RACH-ConfigDedicated ::= SEQUENCE { - ra-PreambleIndex INTEGER (0..63), - ra-PRACH-MaskIndex INTEGER (0..15) -} - - -RadioResourceConfigCommonSIB ::= SEQUENCE { - rach-ConfigCommon RACH-ConfigCommon, - bcch-Config BCCH-Config, - pcch-Config PCCH-Config, - prach-Config PRACH-ConfigSIB, - pdsch-ConfigCommon PDSCH-ConfigCommon, - pusch-ConfigCommon PUSCH-ConfigCommon, - pucch-ConfigCommon PUCCH-ConfigCommon, - soundingRS-UL-ConfigCommon SoundingRS-UL-ConfigCommon, - uplinkPowerControlCommon UplinkPowerControlCommon, - ul-CyclicPrefixLength UL-CyclicPrefixLength, - ... -} - -RadioResourceConfigCommon ::= SEQUENCE { - rach-ConfigCommon RACH-ConfigCommon OPTIONAL, -- Need ON - prach-Config PRACH-Config, - pdsch-ConfigCommon PDSCH-ConfigCommon OPTIONAL, -- Need ON - pusch-ConfigCommon PUSCH-ConfigCommon, - phich-Config PHICH-Config OPTIONAL, -- Need ON - pucch-ConfigCommon PUCCH-ConfigCommon OPTIONAL, -- Need ON - soundingRS-UL-ConfigCommon SoundingRS-UL-ConfigCommon OPTIONAL, -- Need ON - uplinkPowerControlCommon UplinkPowerControlCommon OPTIONAL, -- Need ON - antennaInfoCommon AntennaInfoCommon OPTIONAL, -- Need ON - p-Max P-Max OPTIONAL, -- Need OP - tdd-Config TDD-Config OPTIONAL, -- Cond TDD - ul-CyclicPrefixLength UL-CyclicPrefixLength, - ... -} - -BCCH-Config ::= SEQUENCE { - modificationPeriodCoeff ENUMERATED {n2, n4, n8, n16} -} - -PCCH-Config ::= SEQUENCE { - defaultPagingCycle ENUMERATED { - rf32, rf64, rf128, rf256}, - nB ENUMERATED { - fourT, twoT, oneT, halfT, quarterT, oneEighthT, - oneSixteenthT, oneThirtySecondT} -} - -UL-CyclicPrefixLength ::= ENUMERATED {len1, len2} - - -RadioResourceConfigDedicated ::= SEQUENCE { - srb-ToAddModList SRB-ToAddModList OPTIONAL, -- Cond HO-Conn - drb-ToAddModList DRB-ToAddModList OPTIONAL, -- Cond HO-toEUTRA - drb-ToReleaseList DRB-ToReleaseList OPTIONAL, -- Need ON - mac-MainConfig CHOICE { - explicitValue MAC-MainConfig, - defaultValue NULL - } OPTIONAL, -- Cond HO-toEUTRA2 - sps-Config SPS-Config OPTIONAL, -- Need ON - physicalConfigDedicated PhysicalConfigDedicated OPTIONAL, -- Need ON - ... -} - -SRB-ToAddModList ::= SEQUENCE (SIZE (1..2)) OF SRB-ToAddMod - -SRB-ToAddMod ::= SEQUENCE { - srb-Identity INTEGER (1..2), - rlc-Config CHOICE { - explicitValue RLC-Config, - defaultValue NULL - } OPTIONAL, -- Cond Setup - logicalChannelConfig CHOICE { - explicitValue LogicalChannelConfig, - defaultValue NULL - } OPTIONAL, -- Cond Setup - ... -} - -DRB-ToAddModList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-ToAddMod - -DRB-ToAddMod ::= SEQUENCE { - eps-BearerIdentity INTEGER (0..15) OPTIONAL, -- Cond DRB-Setup - drb-Identity DRB-Identity, - pdcp-Config PDCP-Config OPTIONAL, -- Cond PDCP - rlc-Config RLC-Config OPTIONAL, -- Cond Setup - logicalChannelIdentity INTEGER (3..10) OPTIONAL, -- Cond DRB-Setup - logicalChannelConfig LogicalChannelConfig OPTIONAL, -- Cond Setup - ... -} - -DRB-ToReleaseList ::= SEQUENCE (SIZE (1..maxDRB)) OF DRB-Identity - - -RLC-Config ::= CHOICE { - am SEQUENCE { - ul-AM-RLC UL-AM-RLC, - dl-AM-RLC DL-AM-RLC - }, - um-Bi-Directional SEQUENCE { - ul-UM-RLC UL-UM-RLC, - dl-UM-RLC DL-UM-RLC - }, - um-Uni-Directional-UL SEQUENCE { - ul-UM-RLC UL-UM-RLC - }, - um-Uni-Directional-DL SEQUENCE { - dl-UM-RLC DL-UM-RLC - }, - ... -} - -UL-AM-RLC ::= SEQUENCE { - t-PollRetransmit T-PollRetransmit, - pollPDU PollPDU, - pollByte PollByte, - maxRetxThreshold ENUMERATED { - t1, t2, t3, t4, t6, t8, t16, t32} -} - -DL-AM-RLC ::= SEQUENCE { - t-Reordering T-Reordering, - t-StatusProhibit T-StatusProhibit -} - -UL-UM-RLC ::= SEQUENCE { - sn-FieldLength SN-FieldLength -} - -DL-UM-RLC ::= SEQUENCE { - sn-FieldLength SN-FieldLength, - t-Reordering T-Reordering -} - -SN-FieldLength ::= ENUMERATED {size5, size10} - -T-PollRetransmit ::= ENUMERATED { - ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms105, - ms110, ms115, ms120, ms125, ms130, ms135, - ms140, ms145, ms150, ms155, ms160, ms165, - ms170, ms175, ms180, ms185, ms190, ms195, - ms200, ms205, ms210, ms215, ms220, ms225, - ms230, ms235, ms240, ms245, ms250, ms300, - ms350, ms400, ms450, ms500, spare9, spare8, - spare7, spare6, spare5, spare4, spare3, - spare2, spare1} - -PollPDU ::= ENUMERATED { - p4, p8, p16, p32, p64, p128, p256, pInfinity} - -PollByte ::= ENUMERATED { - kB25, kB50, kB75, kB100, kB125, kB250, kB375, - kB500, kB750, kB1000, kB1250, kB1500, kB2000, - kB3000, kBinfinity, spare1} - -T-Reordering ::= ENUMERATED { - ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms110, - ms120, ms130, ms140, ms150, ms160, ms170, - ms180, ms190, ms200, spare1} - -T-StatusProhibit ::= ENUMERATED { - ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35, - ms40, ms45, ms50, ms55, ms60, ms65, ms70, - ms75, ms80, ms85, ms90, ms95, ms100, ms105, - ms110, ms115, ms120, ms125, ms130, ms135, - ms140, ms145, ms150, ms155, ms160, ms165, - ms170, ms175, ms180, ms185, ms190, ms195, - ms200, ms205, ms210, ms215, ms220, ms225, - ms230, ms235, ms240, ms245, ms250, ms300, - ms350, ms400, ms450, ms500, spare8, spare7, - spare6, spare5, spare4, spare3, spare2, - spare1} - - -SchedulingRequestConfig ::= CHOICE { - release NULL, - setup SEQUENCE { - sr-PUCCH-ResourceIndex INTEGER (0..2047), - sr-ConfigIndex INTEGER (0..155), - dsr-TransMax ENUMERATED { - n4, n8, n16, n32, n64, spare3, spare2, spare1} - } -} - - -SoundingRS-UL-ConfigCommon ::= CHOICE { - release NULL, - setup SEQUENCE { - srs-BandwidthConfig ENUMERATED {bw0, bw1, bw2, bw3, bw4, bw5, bw6, bw7}, - srs-SubframeConfig ENUMERATED { - sc0, sc1, sc2, sc3, sc4, sc5, sc6, sc7, - sc8, sc9, sc10, sc11, sc12, sc13, sc14, sc15}, - ackNackSRS-SimultaneousTransmission BOOLEAN, - srs-MaxUpPts ENUMERATED {true} OPTIONAL -- Cond TDD - } -} - -SoundingRS-UL-ConfigDedicated ::= CHOICE{ - release NULL, - setup SEQUENCE { - srs-Bandwidth ENUMERATED {bw0, bw1, bw2, bw3}, - srs-HoppingBandwidth ENUMERATED {hbw0, hbw1, hbw2, hbw3}, - freqDomainPosition INTEGER (0..23), - duration BOOLEAN, - srs-ConfigIndex INTEGER (0..1023), - transmissionComb INTEGER (0..1), - cyclicShift ENUMERATED {cs0, cs1, cs2, cs3, cs4, cs5, cs6, cs7} - } -} - - - -SPS-Config ::= SEQUENCE { - semiPersistSchedC-RNTI C-RNTI OPTIONAL, -- Need OR - sps-ConfigDL SPS-ConfigDL OPTIONAL, -- Need ON - sps-ConfigUL SPS-ConfigUL OPTIONAL -- Need ON -} - -SPS-ConfigDL ::= CHOICE{ - release NULL, - setup SEQUENCE { - semiPersistSchedIntervalDL ENUMERATED { - sf10, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, spare6, - spare5, spare4, spare3, spare2, - spare1}, - numberOfConfSPS-Processes INTEGER (1..8), - n1-PUCCH-AN-PersistentList N1-PUCCH-AN-PersistentList, - ... - } -} - -SPS-ConfigUL ::= CHOICE { - release NULL, - setup SEQUENCE { - semiPersistSchedIntervalUL ENUMERATED { - sf10, sf20, sf32, sf40, sf64, sf80, - sf128, sf160, sf320, sf640, spare6, - spare5, spare4, spare3, spare2, - spare1}, - implicitReleaseAfter ENUMERATED {e2, e3, e4, e8}, - p0-Persistent SEQUENCE { - p0-NominalPUSCH-Persistent INTEGER (-126..24), - p0-UE-PUSCH-Persistent INTEGER (-8..7) - } OPTIONAL, -- Need OP - twoIntervalsConfig ENUMERATED {true} OPTIONAL, -- Cond TDD - ... - } -} - -N1-PUCCH-AN-PersistentList ::= SEQUENCE (SIZE (1..4)) OF INTEGER (0..2047) - - -TDD-Config ::= SEQUENCE { - subframeAssignment ENUMERATED { - sa0, sa1, sa2, sa3, sa4, sa5, sa6}, - specialSubframePatterns ENUMERATED { - ssp0, ssp1, ssp2, ssp3, ssp4,ssp5, ssp6, ssp7, - ssp8} -} - - -TimeAlignmentTimer ::= ENUMERATED { - sf500, sf750, sf1280, sf1920, sf2560, sf5120, - sf10240, infinity} - -TPC-PDCCH-Config::= CHOICE { - release NULL, - setup SEQUENCE { - tpc-RNTI BIT STRING (SIZE (16)), - tpc-Index TPC-Index - } -} - -TPC-Index ::= CHOICE { - indexOfFormat3 INTEGER (1..15), - indexOfFormat3A INTEGER (1..31) -} - - -UplinkPowerControlCommon ::= SEQUENCE { - p0-NominalPUSCH INTEGER (-126..24), - alpha ENUMERATED {al0, al04, al05, al06, al07, al08, al09, al1}, - p0-NominalPUCCH INTEGER (-127..-96), - deltaFList-PUCCH DeltaFList-PUCCH, - deltaPreambleMsg3 INTEGER (-1..6) -} - -UplinkPowerControlDedicated ::= SEQUENCE { - p0-UE-PUSCH INTEGER (-8..7), - deltaMCS-Enabled ENUMERATED {en0, en1}, - accumulationEnabled BOOLEAN, - p0-UE-PUCCH INTEGER (-8..7), - pSRS-Offset INTEGER (0..15), - filterCoefficient FilterCoefficient DEFAULT fc4 -} - -DeltaFList-PUCCH ::= SEQUENCE { - deltaF-PUCCH-Format1 ENUMERATED {deltaF-2, deltaF0, deltaF2}, - deltaF-PUCCH-Format1b ENUMERATED {deltaF1, deltaF3, deltaF5}, - deltaF-PUCCH-Format2 ENUMERATED {deltaF-2, deltaF0, deltaF1, deltaF2}, - deltaF-PUCCH-Format2a ENUMERATED {deltaF-2, deltaF0, deltaF2}, - deltaF-PUCCH-Format2b ENUMERATED {deltaF-2, deltaF0, deltaF2} -} - - -NextHopChainingCount ::= INTEGER (0..7) - - -SecurityAlgorithmConfig ::= SEQUENCE { - cipheringAlgorithm ENUMERATED { - eea0, eea1, eea2, spare5, spare4, spare3, - spare2, spare1, ...}, - integrityProtAlgorithm ENUMERATED { - reserved, eia1, eia2, spare5, spare4, spare3, - spare2, spare1, ...} -} - - -ShortMAC-I ::= BIT STRING (SIZE (16)) - - -AdditionalSpectrumEmission ::= INTEGER (1..32) - - -ARFCN-ValueCDMA2000 ::= INTEGER (0..2047) - - -ARFCN-ValueEUTRA ::= INTEGER (0..maxEARFCN) - - -ARFCN-ValueGERAN ::= INTEGER (0..1023) - - -ARFCN-ValueUTRA ::= INTEGER (0..16383) - - -BandclassCDMA2000 ::= ENUMERATED { - bc0, bc1, bc2, bc3, bc4, bc5, bc6, bc7, bc8, - bc9, bc10, bc11, bc12, bc13, bc14, bc15, bc16, - bc17, spare14, spare13, spare12, spare11, spare10, - spare9, spare8, spare7, spare6, spare5, spare4, - spare3, spare2, spare1, ...} - - -BandIndicatorGERAN ::= ENUMERATED {dcs1800, pcs1900} - - -CarrierFreqCDMA2000 ::= SEQUENCE { - bandClass BandclassCDMA2000, - arfcn ARFCN-ValueCDMA2000 -} - - -CarrierFreqGERAN ::= SEQUENCE { - arfcn ARFCN-ValueGERAN, - bandIndicator BandIndicatorGERAN -} - - -CarrierFreqsGERAN ::= SEQUENCE { - startingARFCN ARFCN-ValueGERAN, - bandIndicator BandIndicatorGERAN, - followingARFCNs CHOICE { - explicitListOfARFCNs ExplicitListOfARFCNs, - equallySpacedARFCNs SEQUENCE { - arfcn-Spacing INTEGER (1..8), - numberOfFollowingARFCNs INTEGER (0..31) - }, - variableBitMapOfARFCNs OCTET STRING (SIZE (1..16)) - } -} - -ExplicitListOfARFCNs ::= SEQUENCE (SIZE (0..31)) OF ARFCN-ValueGERAN - - -CDMA2000-Type ::= ENUMERATED {type1XRTT, typeHRPD} - - -CellIdentity ::= BIT STRING (SIZE (28)) - - -CellIndexList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellIndex - -CellIndex ::= INTEGER (1..maxCellMeas) - - -CellReselectionPriority ::= INTEGER (0..7) - - -CSFB-RegistrationParam1XRTT ::= SEQUENCE { - sid BIT STRING (SIZE (15)), - nid BIT STRING (SIZE (16)), - multipleSID BOOLEAN, - multipleNID BOOLEAN, - homeReg BOOLEAN, - foreignSIDReg BOOLEAN, - foreignNIDReg BOOLEAN, - parameterReg BOOLEAN, - powerUpReg BOOLEAN, - registrationPeriod BIT STRING (SIZE (7)), - registrationZone BIT STRING (SIZE (12)), - totalZone BIT STRING (SIZE (3)), - zoneTimer BIT STRING (SIZE (3)) -} - - -CellGlobalIdEUTRA ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellIdentity CellIdentity -} - - -CellGlobalIdUTRA ::= SEQUENCE { - plmn-Identity PLMN-Identity, - cellIdentity BIT STRING (SIZE (28)) -} - - -CellGlobalIdGERAN ::= SEQUENCE { - plmn-Identity PLMN-Identity, - locationAreaCode BIT STRING (SIZE (16)), - cellIdentity BIT STRING (SIZE (16)) -} - - -CellGlobalIdCDMA2000 ::= CHOICE { - cellGlobalId1XRTT BIT STRING (SIZE (47)), - cellGlobalIdHRPD BIT STRING (SIZE (128)) -} - - -MobilityControlInfo ::= SEQUENCE { - targetPhysCellId PhysCellId, - carrierFreq CarrierFreqEUTRA OPTIONAL, -- Cond HO-toEUTRA - carrierBandwidth CarrierBandwidthEUTRA OPTIONAL, -- Cond HO-toEUTRA - additionalSpectrumEmission AdditionalSpectrumEmission OPTIONAL, -- Cond HO-toEUTRA - t304 ENUMERATED { - ms50, ms100, ms150, ms200, ms500, ms1000, - ms2000, spare1}, - newUE-Identity C-RNTI, - radioResourceConfigCommon RadioResourceConfigCommon, - rach-ConfigDedicated RACH-ConfigDedicated OPTIONAL, -- Need OP - ... -} - -CarrierBandwidthEUTRA ::= SEQUENCE { - dl-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100, spare10, - spare9, spare8, spare7, spare6, spare5, - spare4, spare3, spare2, spare1}, - ul-Bandwidth ENUMERATED { - n6, n15, n25, n50, n75, n100, spare10, - spare9, spare8, spare7, spare6, spare5, - spare4, spare3, spare2, spare1} OPTIONAL -- Need OP -} - -CarrierFreqEUTRA ::= SEQUENCE { - dl-CarrierFreq ARFCN-ValueEUTRA, - ul-CarrierFreq ARFCN-ValueEUTRA OPTIONAL -- Cond FDD -} - - -MobilityParametersCDMA2000 ::= OCTET STRING - - -MobilityStateParameters ::= SEQUENCE { - t-Evaluation ENUMERATED { - s30, s60, s120, s180, s240, spare3, spare2, spare1}, - t-HystNormal ENUMERATED { - s30, s60, s120, s180, s240, spare3, spare2, spare1}, - n-CellChangeMedium INTEGER (1..16), - n-CellChangeHigh INTEGER (1..16) -} - - -PhysCellId ::= INTEGER (0..503) - - -PhysCellIdRange ::= SEQUENCE { - start PhysCellId, - range ENUMERATED { - n4, n8, n12, n16, n24, n32, n48, n64, n84, - n96, n128, n168, n252, n504, spare2, - spare1} OPTIONAL -- Need OP -} - - -PhysCellIdCDMA2000 ::= INTEGER (0..maxPNOffset) - - -PhysCellIdGERAN ::= SEQUENCE { - networkColourCode BIT STRING (SIZE (3)), - baseStationColourCode BIT STRING (SIZE (3)) -} - - -PhysCellIdUTRA-FDD ::= INTEGER (0..511) - - -PhysCellIdUTRA-TDD ::= INTEGER (0..127) - - -PLMN-Identity ::= SEQUENCE { - mcc MCC OPTIONAL, -- Cond MCC - mnc MNC -} - -MCC ::= SEQUENCE (SIZE (3)) OF - MCC-MNC-Digit - -MNC ::= SEQUENCE (SIZE (2..3)) OF - MCC-MNC-Digit - -MCC-MNC-Digit ::= INTEGER (0..9) - - - -PreRegistrationInfoHRPD ::= SEQUENCE { - preRegistrationAllowed BOOLEAN, - preRegistrationZoneId PreRegistrationZoneIdHRPD OPTIONAL, -- cond PreRegAllowed - secondaryPreRegistrationZoneIdList SecondaryPreRegistrationZoneIdListHRPD OPTIONAL -- Need OR -} - -SecondaryPreRegistrationZoneIdListHRPD ::= SEQUENCE (SIZE (1..2)) OF PreRegistrationZoneIdHRPD - -PreRegistrationZoneIdHRPD ::= INTEGER (0..255) - - -Q-RxLevMin ::= INTEGER (-70..-22) - - -Q-OffsetRange ::= ENUMERATED { - dB-24, dB-22, dB-20, dB-18, dB-16, dB-14, - dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3, - dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5, - dB6, dB8, dB10, dB12, dB14, dB16, dB18, - dB20, dB22, dB24} - - -Q-OffsetRangeInterRAT ::= INTEGER (-15..15) - - -ReselectionThreshold ::= INTEGER (0..31) - - -SpeedStateScaleFactors ::= SEQUENCE { - sf-Medium ENUMERATED {oDot25, oDot5, oDot75, lDot0}, - sf-High ENUMERATED {oDot25, oDot5, oDot75, lDot0} -} - -SystemTimeInfoCDMA2000 ::= SEQUENCE { - cdma-EUTRA-Synchronisation BOOLEAN, - cdma-SystemTime CHOICE { - synchronousSystemTime BIT STRING (SIZE (39)), - asynchronousSystemTime BIT STRING (SIZE (49)) - } -} - - -TrackingAreaCode ::= BIT STRING (SIZE (16)) - - -T-Reselection ::= INTEGER (0..7) - - -AllowedMeasBandwidth ::= ENUMERATED {mbw6, mbw15, mbw25, mbw50, mbw75, mbw100} - - -Hysteresis ::= INTEGER (0..30) - - -MeasConfig ::= SEQUENCE { - -- Measurement objects - measObjectToRemoveList MeasObjectToRemoveList OPTIONAL, -- Need ON - measObjectToAddModList MeasObjectToAddModList OPTIONAL, -- Need ON - -- Reporting configurations - reportConfigToRemoveList ReportConfigToRemoveList OPTIONAL, -- Need ON - reportConfigToAddModList ReportConfigToAddModList OPTIONAL, -- Need ON - -- Measurement identities - measIdToRemoveList MeasIdToRemoveList OPTIONAL, -- Need ON - measIdToAddModList MeasIdToAddModList OPTIONAL, -- Need ON - -- Other parameters - quantityConfig QuantityConfig OPTIONAL, -- Need ON - measGapConfig MeasGapConfig OPTIONAL, -- Need ON - s-Measure RSRP-Range OPTIONAL, -- Need ON - preRegistrationInfoHRPD PreRegistrationInfoHRPD OPTIONAL, -- Need OP - speedStatePars CHOICE { - release NULL, - setup SEQUENCE { - mobilityStateParameters MobilityStateParameters, - timeToTrigger-SF SpeedStateScaleFactors - } - } OPTIONAL, -- Need ON - ... -} - -MeasIdToRemoveList ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasId - -MeasObjectToRemoveList ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectId - -ReportConfigToRemoveList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigId - - -MeasGapConfig ::= CHOICE { - release NULL, - setup SEQUENCE { - gapOffset CHOICE { - gp0 INTEGER (0..39), - gp1 INTEGER (0..79), - ... - } - } -} - - -MeasId ::= INTEGER (1..maxMeasId) - - -MeasIdToAddModList ::= SEQUENCE (SIZE (1..maxMeasId)) OF MeasIdToAddMod - -MeasIdToAddMod ::= SEQUENCE { - measId MeasId, - measObjectId MeasObjectId, - reportConfigId ReportConfigId -} - - -MeasObjectCDMA2000 ::= SEQUENCE { - cdma2000-Type CDMA2000-Type, - carrierFreq CarrierFreqCDMA2000, - searchWindowSize INTEGER (0..15) OPTIONAL, -- Need ON - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CellsToAddModListCDMA2000 OPTIONAL, -- Need ON - cellForWhichToReportCGI PhysCellIdCDMA2000 OPTIONAL, -- Need ON - ... -} - -CellsToAddModListCDMA2000 ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModCDMA2000 - -CellsToAddModCDMA2000 ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdCDMA2000 -} - - -MeasObjectEUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueEUTRA, - allowedMeasBandwidth AllowedMeasBandwidth, - presenceAntennaPort1 PresenceAntennaPort1, - neighCellConfig NeighCellConfig, - offsetFreq Q-OffsetRange DEFAULT dB0, - -- Neighbour cell list - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CellsToAddModList OPTIONAL, -- Need ON - -- Black list - blackCellsToRemoveList CellIndexList OPTIONAL, -- Need ON - blackCellsToAddModList BlackCellsToAddModList OPTIONAL, -- Need ON - cellForWhichToReportCGI PhysCellId OPTIONAL, -- Need ON - ... -} - -CellsToAddModList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddMod - -CellsToAddMod ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellId, - cellIndividualOffset Q-OffsetRange -} - -BlackCellsToAddModList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF BlackCellsToAddMod - -BlackCellsToAddMod ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellIdRange PhysCellIdRange -} - - -MeasObjectGERAN ::= SEQUENCE { - carrierFreqs CarrierFreqsGERAN, - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - ncc-Permitted BIT STRING(SIZE (8)) DEFAULT '11111111'B, - cellForWhichToReportCGI PhysCellIdGERAN OPTIONAL, -- Need ON - ... -} - - -MeasObjectId ::= INTEGER (1..maxObjectId) - - -MeasObjectToAddModList ::= SEQUENCE (SIZE (1..maxObjectId)) OF MeasObjectToAddMod - -MeasObjectToAddMod ::= SEQUENCE { - measObjectId MeasObjectId, - measObject CHOICE { - measObjectEUTRA MeasObjectEUTRA, - measObjectUTRA MeasObjectUTRA, - measObjectGERAN MeasObjectGERAN, - measObjectCDMA2000 MeasObjectCDMA2000, - ... - } -} - - -MeasObjectUTRA ::= SEQUENCE { - carrierFreq ARFCN-ValueUTRA, - offsetFreq Q-OffsetRangeInterRAT DEFAULT 0, - cellsToRemoveList CellIndexList OPTIONAL, -- Need ON - cellsToAddModList CHOICE { - cellsToAddModListUTRA-FDD CellsToAddModListUTRA-FDD, - cellsToAddModListUTRA-TDD CellsToAddModListUTRA-TDD - } OPTIONAL, -- Need ON - cellForWhichToReportCGI CHOICE { - utra-FDD PhysCellIdUTRA-FDD, - utra-TDD PhysCellIdUTRA-TDD - } OPTIONAL, -- Need ON - ... -} - -CellsToAddModListUTRA-FDD ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModUTRA-FDD - -CellsToAddModUTRA-FDD ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdUTRA-FDD -} - -CellsToAddModListUTRA-TDD ::= SEQUENCE (SIZE (1..maxCellMeas)) OF CellsToAddModUTRA-TDD - -CellsToAddModUTRA-TDD ::= SEQUENCE { - cellIndex INTEGER (1..maxCellMeas), - physCellId PhysCellIdUTRA-TDD -} - - -MeasResults ::= SEQUENCE { - measId MeasId, - measResultServCell SEQUENCE { - rsrpResult RSRP-Range, - rsrqResult RSRQ-Range - }, - measResultNeighCells CHOICE { - measResultListEUTRA MeasResultListEUTRA, - measResultListUTRA MeasResultListUTRA, - measResultListGERAN MeasResultListGERAN, - measResultsCDMA2000 MeasResultsCDMA2000, - ... - } OPTIONAL, - ... -} - -MeasResultListEUTRA ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultEUTRA - -MeasResultEUTRA ::= SEQUENCE { - physCellId PhysCellId, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdEUTRA, - trackingAreaCode TrackingAreaCode, - plmn-IdentityList PLMN-IdentityList2 OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - rsrpResult RSRP-Range OPTIONAL, - rsrqResult RSRQ-Range OPTIONAL, - ... - } -} - -MeasResultListUTRA ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultUTRA - -MeasResultUTRA ::= SEQUENCE { - physCellId CHOICE { - fdd PhysCellIdUTRA-FDD, - tdd PhysCellIdUTRA-TDD - }, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdUTRA, - locationAreaCode BIT STRING (SIZE (16)) OPTIONAL, - routingAreaCode BIT STRING (SIZE (8)) OPTIONAL, - plmn-IdentityList PLMN-IdentityList2 OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - utra-RSCP INTEGER (-5..91) OPTIONAL, - utra-EcN0 INTEGER (0..49) OPTIONAL, - ... - } -} - -MeasResultListGERAN ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultGERAN - -MeasResultGERAN ::= SEQUENCE { - carrierFreq CarrierFreqGERAN, - physCellId PhysCellIdGERAN, - cgi-Info SEQUENCE { - cellGlobalId CellGlobalIdGERAN, - routingAreaCode BIT STRING (SIZE (8)) OPTIONAL - } OPTIONAL, - measResult SEQUENCE { - rssi INTEGER (0..63), - ... - } -} - -MeasResultsCDMA2000 ::= SEQUENCE { - preRegistrationStatusHRPD BOOLEAN, - measResultListCDMA2000 MeasResultListCDMA2000 -} - -MeasResultListCDMA2000 ::= SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultCDMA2000 - -MeasResultCDMA2000 ::= SEQUENCE { - physCellId PhysCellIdCDMA2000, - cgi-Info CellGlobalIdCDMA2000 OPTIONAL, - measResult SEQUENCE { - pilotPnPhase INTEGER (0..32767) OPTIONAL, - pilotStrength INTEGER (0..63), - ... - } -} - -PLMN-IdentityList2 ::= SEQUENCE (SIZE (1..5)) OF PLMN-Identity - - -QuantityConfig ::= SEQUENCE { - quantityConfigEUTRA QuantityConfigEUTRA OPTIONAL, -- Need ON - quantityConfigUTRA QuantityConfigUTRA OPTIONAL, -- Need ON - quantityConfigGERAN QuantityConfigGERAN OPTIONAL, -- Need ON - quantityConfigCDMA2000 QuantityConfigCDMA2000 OPTIONAL, -- Need ON - ... -} - -QuantityConfigEUTRA ::= SEQUENCE { - filterCoefficientRSRP FilterCoefficient DEFAULT fc4, - filterCoefficientRSRQ FilterCoefficient DEFAULT fc4 -} - -QuantityConfigUTRA ::= SEQUENCE { - measQuantityUTRA-FDD ENUMERATED {cpich-RSCP, cpich-EcN0}, - measQuantityUTRA-TDD ENUMERATED {pccpch-RSCP}, - filterCoefficient FilterCoefficient DEFAULT fc4 -} - -QuantityConfigGERAN ::= SEQUENCE { - measQuantityGERAN ENUMERATED {rssi}, - filterCoefficient FilterCoefficient DEFAULT fc2 -} - -QuantityConfigCDMA2000 ::= SEQUENCE { - measQuantityCDMA2000 ENUMERATED {pilotStrength, pilotPnPhaseAndPilotStrength} -} - - -ReportConfigEUTRA ::= SEQUENCE { - triggerType CHOICE { - event SEQUENCE { - eventId CHOICE { - eventA1 SEQUENCE { - a1-Threshold ThresholdEUTRA - }, - eventA2 SEQUENCE { - a2-Threshold ThresholdEUTRA - }, - eventA3 SEQUENCE { - a3-Offset INTEGER (-30..30), - reportOnLeave BOOLEAN - }, - eventA4 SEQUENCE { - a4-Threshold ThresholdEUTRA - }, - eventA5 SEQUENCE { - a5-Threshold1 ThresholdEUTRA, - a5-Threshold2 ThresholdEUTRA - }, - ... - }, - hysteresis Hysteresis, - timeToTrigger TimeToTrigger - }, - periodical SEQUENCE { - purpose ENUMERATED { - reportStrongestCells, reportCGI} - } - }, - triggerQuantity ENUMERATED {rsrp, rsrq}, - reportQuantity ENUMERATED {sameAsTriggerQuantity, both}, - maxReportCells INTEGER (1..maxCellReport), - reportInterval ReportInterval, - reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity}, - ... -} - -ThresholdEUTRA ::= CHOICE{ - threshold-RSRP RSRP-Range, - threshold-RSRQ RSRQ-Range -} - - -ReportConfigId ::= INTEGER (1..maxReportConfigId) - - -ReportConfigInterRAT ::= SEQUENCE { - triggerType CHOICE { - event SEQUENCE { - eventId CHOICE { - eventB1 SEQUENCE { - b1-Threshold CHOICE { - b1-ThresholdUTRA ThresholdUTRA, - b1-ThresholdGERAN ThresholdGERAN, - b1-ThresholdCDMA2000 ThresholdCDMA2000 - } - }, - eventB2 SEQUENCE { - b2-Threshold1 ThresholdEUTRA, - b2-Threshold2 CHOICE { - b2-Threshold2UTRA ThresholdUTRA, - b2-Threshold2GERAN ThresholdGERAN, - b2-Threshold2CDMA2000 ThresholdCDMA2000 - } - }, - ... - }, - hysteresis Hysteresis, - timeToTrigger TimeToTrigger - }, - periodical SEQUENCE { - purpose ENUMERATED { - reportStrongestCells, - reportStrongestCellsForSON, - reportCGI} - } - }, - maxReportCells INTEGER (1..maxCellReport), - reportInterval ReportInterval, - reportAmount ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity}, - ... -} - -ThresholdUTRA ::= CHOICE{ - utra-RSCP INTEGER (-5..91), - utra-EcN0 INTEGER (0..49) -} - -ThresholdGERAN ::= INTEGER (0..63) - -ThresholdCDMA2000 ::= INTEGER (0..63) - - -ReportConfigToAddModList ::= SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigToAddMod - -ReportConfigToAddMod ::= SEQUENCE { - reportConfigId ReportConfigId, - reportConfig CHOICE { - reportConfigEUTRA ReportConfigEUTRA, - reportConfigInterRAT ReportConfigInterRAT - } -} - - - -ReportInterval ::= ENUMERATED { - ms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, - min1, min6, min12, min30, min60, spare3, spare2, spare1} - - -RSRP-Range ::= INTEGER(0..97) - - -RSRQ-Range ::= INTEGER(0..34) - - -TimeToTrigger ::= ENUMERATED { - ms0, ms40, ms64, ms80, ms100, ms128, ms160, ms256, - ms320, ms480, ms512, ms640, ms1024, ms1280, ms2560, - ms5120} - - -C-RNTI ::= BIT STRING (SIZE (16)) - - -DedicatedInfoCDMA2000 ::= OCTET STRING - - -DedicatedInfoNAS ::= OCTET STRING - - -FilterCoefficient ::= ENUMERATED { - fc0, fc1, fc2, fc3, fc4, fc5, - fc6, fc7, fc8, fc9, fc11, fc13, - fc15, fc17, fc19, spare1, ...} - - -MMEC ::= BIT STRING (SIZE (8)) - - -NeighCellConfig ::= BIT STRING (SIZE (2)) - - -RAND-CDMA2000 ::= BIT STRING (SIZE (32)) - - -RAT-Type ::= ENUMERATED { - eutra, utra, geran-cs, geran-ps, cdma2000-1XRTT, - spare3, spare2, spare1, ...} - - -RRC-TransactionIdentifier ::= INTEGER (0..3) - - -S-TMSI ::= SEQUENCE { - mmec MMEC, - m-TMSI BIT STRING (SIZE (32)) -} - - -UE-CapabilityRAT-ContainerList ::=SEQUENCE (SIZE (0..maxRAT-Capabilities)) OF UE-CapabilityRAT-Container - -UE-CapabilityRAT-Container ::= SEQUENCE { - rat-Type RAT-Type, - ueCapabilityRAT-Container OCTET STRING -} - - -UE-EUTRA-Capability ::= SEQUENCE { - accessStratumRelease AccessStratumRelease, - ue-Category INTEGER (1..5), - pdcp-Parameters PDCP-Parameters, - phyLayerParameters PhyLayerParameters, - rf-Parameters RF-Parameters, - measParameters MeasParameters, - featureGroupIndicators BIT STRING (SIZE (32)) OPTIONAL, - interRAT-Parameters SEQUENCE { - utraFDD IRAT-ParametersUTRA-FDD OPTIONAL, - utraTDD128 IRAT-ParametersUTRA-TDD128 OPTIONAL, - utraTDD384 IRAT-ParametersUTRA-TDD384 OPTIONAL, - utraTDD768 IRAT-ParametersUTRA-TDD768 OPTIONAL, - geran IRAT-ParametersGERAN OPTIONAL, - cdma2000-HRPD IRAT-ParametersCDMA2000-HRPD OPTIONAL, - cdma2000-1xRTT IRAT-ParametersCDMA2000-1XRTT OPTIONAL - }, - nonCriticalExtension SEQUENCE {} OPTIONAL -} - -AccessStratumRelease ::= ENUMERATED { - rel8, spare7, spare6, spare5, spare4, spare3, - spare2, spare1, ...} - -PDCP-Parameters ::= SEQUENCE { - supportedROHC-Profiles SEQUENCE { - profile0x0001 BOOLEAN, - profile0x0002 BOOLEAN, - profile0x0003 BOOLEAN, - profile0x0004 BOOLEAN, - profile0x0006 BOOLEAN, - profile0x0101 BOOLEAN, - profile0x0102 BOOLEAN, - profile0x0103 BOOLEAN, - profile0x0104 BOOLEAN - }, - maxNumberROHC-ContextSessions ENUMERATED { - cs2, cs4, cs8, cs12, cs16, cs24, cs32, - cs48, cs64, cs128, cs256, cs512, cs1024, - cs16384, spare2, spare1} DEFAULT cs16, - ... -} - -PhyLayerParameters ::= SEQUENCE { - ue-TxAntennaSelectionSupported BOOLEAN, - ue-SpecificRefSigsSupported BOOLEAN -} - -RF-Parameters ::= SEQUENCE { - supportedBandListEUTRA SupportedBandListEUTRA -} - -SupportedBandListEUTRA ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandEUTRA - -SupportedBandEUTRA ::= SEQUENCE { - bandEUTRA INTEGER (1..64), - halfDuplex BOOLEAN -} - -MeasParameters ::= SEQUENCE { - bandListEUTRA BandListEUTRA -} - -BandListEUTRA ::= SEQUENCE (SIZE (1..maxBands)) OF BandInfoEUTRA - -BandInfoEUTRA ::= SEQUENCE { - interFreqBandList InterFreqBandList, - interRAT-BandList InterRAT-BandList OPTIONAL -} - -InterFreqBandList ::= SEQUENCE (SIZE (1..maxBands)) OF InterFreqBandInfo - -InterFreqBandInfo ::= SEQUENCE { - interFreqNeedForGaps BOOLEAN -} - -InterRAT-BandList ::= SEQUENCE (SIZE (1..maxBands)) OF InterRAT-BandInfo - -InterRAT-BandInfo ::= SEQUENCE { - interRAT-NeedForGaps BOOLEAN -} - -IRAT-ParametersUTRA-FDD ::= SEQUENCE { - supportedBandListUTRA-FDD SupportedBandListUTRA-FDD -} - -SupportedBandListUTRA-FDD ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-FDD - -SupportedBandUTRA-FDD ::= ENUMERATED { - bandI, bandII, bandIII, bandIV, bandV, bandVI, - bandVII, bandVIII, bandIX, bandX, bandXI, - bandXII, bandXIII, bandXIV, bandXV, bandXVI, ...} - -IRAT-ParametersUTRA-TDD128 ::= SEQUENCE { - supportedBandListUTRA-TDD128 SupportedBandListUTRA-TDD128 -} - -SupportedBandListUTRA-TDD128 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD128 - -SupportedBandUTRA-TDD128 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersUTRA-TDD384 ::= SEQUENCE { - supportedBandListUTRA-TDD384 SupportedBandListUTRA-TDD384 -} - -SupportedBandListUTRA-TDD384 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD384 - -SupportedBandUTRA-TDD384 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersUTRA-TDD768 ::= SEQUENCE { - supportedBandListUTRA-TDD768 SupportedBandListUTRA-TDD768 -} - -SupportedBandListUTRA-TDD768 ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandUTRA-TDD768 - -SupportedBandUTRA-TDD768 ::= ENUMERATED { - a, b, c, d, e, f, g, h, i, j, k, l, m, n, - o, p, ...} - -IRAT-ParametersGERAN ::= SEQUENCE { - supportedBandListGERAN SupportedBandListGERAN, - interRAT-PS-HO-ToGERAN BOOLEAN -} - -SupportedBandListGERAN ::= SEQUENCE (SIZE (1..maxBands)) OF SupportedBandGERAN - -SupportedBandGERAN ::= ENUMERATED { - gsm450, gsm480, gsm710, gsm750, gsm810, gsm850, - gsm900P, gsm900E, gsm900R, gsm1800, gsm1900, - spare5, spare4, spare3, spare2, spare1, ...} - -IRAT-ParametersCDMA2000-HRPD ::= SEQUENCE { - supportedBandListHRPD SupportedBandListHRPD, - tx-ConfigHRPD ENUMERATED {single, dual}, - rx-ConfigHRPD ENUMERATED {single, dual} -} - -SupportedBandListHRPD ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandclassCDMA2000 - -IRAT-ParametersCDMA2000-1XRTT ::= SEQUENCE { - supportedBandList1XRTT SupportedBandList1XRTT, - tx-Config1XRTT ENUMERATED {single, dual}, - rx-Config1XRTT ENUMERATED {single, dual} -} - -SupportedBandList1XRTT ::= SEQUENCE (SIZE (1..maxCDMA-BandClass)) OF BandclassCDMA2000 - - -UE-TimersAndConstants ::= SEQUENCE { - t300 ENUMERATED { - ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, - ms2000}, - t301 ENUMERATED { - ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, - ms2000}, - t310 ENUMERATED { - ms0, ms50, ms100, ms200, ms500, ms1000, ms2000}, - n310 ENUMERATED { - n1, n2, n3, n4, n6, n8, n10, n20}, - t311 ENUMERATED { - ms1000, ms3000, ms5000, ms10000, ms15000, - ms20000, ms30000}, - n311 ENUMERATED { - n1, n2, n3, n4, n5, n6, n8, n10}, - ... -} - - -maxBands INTEGER ::= 64 -- Maximum number of bands listed in EUTRA UE caps -maxCDMA-BandClass INTEGER ::= 32 -- Maximum value of the CDMA band classes -maxCellBlack INTEGER ::= 16 -- Maximum number of blacklisted cells - -- listed in SIB type 4 and 5 -maxCellInter INTEGER ::= 16 -- Maximum number of neighbouring inter-frequency - -- cells listed in SIB type 5 -maxCellIntra INTEGER ::= 16 -- Maximum number of neighbouring intra-frequency - -- cells listed in SIB type 4 -maxCellMeas INTEGER ::= 32 -- Maximum number of neighbouring cells within a - -- measurement object (incl blacklisted cells) -maxCellReport INTEGER ::= 8 -- Maximum number of reported cells -maxDRB INTEGER ::= 11 -- Maximum number of Data Radio Bearers -maxEARFCN INTEGER ::= 65535 -- Maximum value of EUTRA carrier fequency -maxFreq INTEGER ::= 8 -- Maximum number of EUTRA carrier frequencies -maxGERAN-SI INTEGER ::= 10 -- Maximum number of GERAN SI blocks that can be - -- provided as part of NACC information -maxGNFG INTEGER ::= 16 -- Maximum number of GERAN neighbour freq groups -maxMBSFN-Allocations INTEGER ::= 8 -- Maximum number of MBSFN frame allocations with - -- different offset -maxMCS-1 INTEGER ::= 16 -- Maximum number of PUCCH formats (MCS) -maxMeasId INTEGER ::= 32 -maxObjectId INTEGER ::= 32 -maxPageRec INTEGER ::= 16 -- -maxPNOffset INTEGER ::= 511 -- Maximum number of CDMA2000 PNOffsets -maxRAT-Capabilities INTEGER ::= 8 -- Maximum number of interworking RATs (incl EUTRA) -maxReportConfigId INTEGER ::= 32 -maxSIB INTEGER ::= 32 -- Maximum number of SIBs -maxSIB-1 INTEGER ::= 31 -maxSI-Message INTEGER ::= 32 -- Maximum number of SI messages -maxUTRA-FDD-Carrier INTEGER ::= 16 -- Maximum number of UTRA FDD carrier frequencies -maxUTRA-TDD-Carrier INTEGER ::= 16 -- Maximum number of UTRA TDD carrier frequencies - - -END - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-UE-Variables.asn b/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-UE-Variables.asn deleted file mode 100755 index f42396c649..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/ASN1_files/EUTRA-UE-Variables.asn +++ /dev/null @@ -1,47 +0,0 @@ -EUTRA-UE-Variables DEFINITIONS AUTOMATIC TAGS ::= - -BEGIN - - -VarMeasConfig ::= SEQUENCE { - -- Measurement identities - measIdList MeasIdToAddModList OPTIONAL, - -- Measurement objects - measObjectList MeasObjectToAddModList OPTIONAL, - -- Reporting configurations - reportConfigList ReportConfigToAddModList OPTIONAL, - -- Other parameters - quantityConfig QuantityConfig OPTIONAL, - s-Measure RSRP-Range OPTIONAL, - speedStatePars CHOICE { - release NULL, - setup SEQUENCE { - mobilityStateParameters MobilityStateParameters, - timeToTrigger-SF SpeedStateScaleFactors - } - } OPTIONAL -} - - -VarMeasReportList ::= SEQUENCE (SIZE (1..maxMeasId)) OF VarMeasReport - -VarMeasReport ::= SEQUENCE { - -- List of measurement that have been triggered - measId MeasId, - cellsTriggeredList CellsTriggeredList OPTIONAL, - numberOfReportsSent INTEGER -} - -CellsTriggeredList ::= SEQUENCE (SIZE (1..maxCellMeas)) OF PhysCellId - - -VarShortMAC-Input ::= SEQUENCE { - cellIdentity CellIdentity, - physCellId PhysCellId, - c-RNTI C-RNTI -} - - - -END - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/Makefile.am.sample b/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/Makefile.am.sample deleted file mode 100755 index fa68b7cf89..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/generated_c_asn1_rrc/Makefile.am.sample +++ /dev/null @@ -1,816 +0,0 @@ -ASN_MODULE_SOURCES= \ - BCCH-BCH-Message.c \ - BCCH-BCH-MessageType.c \ - BCCH-DL-SCH-Message.c \ - BCCH-DL-SCH-MessageType.c \ - PCCH-Message.c \ - PCCH-MessageType.c \ - DL-CCCH-Message.c \ - DL-CCCH-MessageType.c \ - DL-DCCH-Message.c \ - DL-DCCH-MessageType.c \ - UL-CCCH-Message.c \ - UL-CCCH-MessageType.c \ - UL-DCCH-Message.c \ - UL-DCCH-MessageType.c \ - CounterCheck.c \ - CounterCheck-r8-IEs.c \ - DRB-CountMSB-InfoList.c \ - DRB-CountMSB-Info.c \ - CounterCheckResponse.c \ - CounterCheckResponse-r8-IEs.c \ - DRB-CountInfoList.c \ - DRB-CountInfo.c \ - CSFBParametersRequestCDMA2000.c \ - CSFBParametersRequestCDMA2000-r8-IEs.c \ - CSFBParametersResponseCDMA2000.c \ - CSFBParametersResponseCDMA2000-r8-IEs.c \ - DLInformationTransfer.c \ - DLInformationTransfer-r8-IEs.c \ - HandoverFromEUTRAPreparationRequest.c \ - HandoverFromEUTRAPreparationRequest-r8-IEs.c \ - MasterInformationBlock.c \ - MeasurementReport.c \ - MeasurementReport-r8-IEs.c \ - MobilityFromEUTRACommand.c \ - MobilityFromEUTRACommand-r8-IEs.c \ - Handover.c \ - CellChangeOrder.c \ - SI-OrPSI-GERAN.c \ - SystemInfoListGERAN.c \ - Paging.c \ - PagingRecordList.c \ - PagingRecord.c \ - PagingUE-Identity.c \ - IMSI.c \ - IMSI-Digit.c \ - RRCConnectionReconfiguration.c \ - RRCConnectionReconfiguration-r8-IEs.c \ - SecurityConfigHO.c \ - RRCConnectionReconfigurationComplete.c \ - RRCConnectionReconfigurationComplete-r8-IEs.c \ - RRCConnectionReestablishment.c \ - RRCConnectionReestablishment-r8-IEs.c \ - RRCConnectionReestablishmentComplete.c \ - RRCConnectionReestablishmentComplete-r8-IEs.c \ - RRCConnectionReestablishmentReject.c \ - RRCConnectionReestablishmentReject-r8-IEs.c \ - RRCConnectionReestablishmentRequest.c \ - RRCConnectionReestablishmentRequest-r8-IEs.c \ - ReestabUE-Identity.c \ - ReestablishmentCause.c \ - RRCConnectionReject.c \ - RRCConnectionReject-r8-IEs.c \ - RRCConnectionRelease.c \ - RRCConnectionRelease-r8-IEs.c \ - ReleaseCause.c \ - RedirectedCarrierInfo.c \ - IdleModeMobilityControlInfo.c \ - FreqPriorityListEUTRA.c \ - FreqPriorityEUTRA.c \ - FreqsPriorityListGERAN.c \ - FreqsPriorityGERAN.c \ - FreqPriorityListUTRA-FDD.c \ - FreqPriorityUTRA-FDD.c \ - FreqPriorityListUTRA-TDD.c \ - FreqPriorityUTRA-TDD.c \ - BandClassPriorityListHRPD.c \ - BandClassPriorityHRPD.c \ - BandClassPriorityList1XRTT.c \ - BandClassPriority1XRTT.c \ - RRCConnectionRequest.c \ - RRCConnectionRequest-r8-IEs.c \ - InitialUE-Identity.c \ - EstablishmentCause.c \ - RRCConnectionSetup.c \ - RRCConnectionSetup-r8-IEs.c \ - RRCConnectionSetupComplete.c \ - RRCConnectionSetupComplete-r8-IEs.c \ - RegisteredMME.c \ - SecurityModeCommand.c \ - SecurityModeCommand-r8-IEs.c \ - SecurityConfigSMC.c \ - SecurityModeComplete.c \ - SecurityModeComplete-r8-IEs.c \ - SecurityModeFailure.c \ - SecurityModeFailure-r8-IEs.c \ - SystemInformation.c \ - SystemInformation-r8-IEs.c \ - SystemInformationBlockType1.c \ - PLMN-IdentityList.c \ - PLMN-IdentityInfo.c \ - SchedulingInfoList.c \ - SchedulingInfo.c \ - SIB-MappingInfo.c \ - SIB-Type.c \ - UECapabilityEnquiry.c \ - UECapabilityEnquiry-r8-IEs.c \ - UE-CapabilityRequest.c \ - UECapabilityInformation.c \ - UECapabilityInformation-r8-IEs.c \ - ULHandoverPreparationTransfer.c \ - ULHandoverPreparationTransfer-r8-IEs.c \ - ULInformationTransfer.c \ - ULInformationTransfer-r8-IEs.c \ - SystemInformationBlockType2.c \ - AC-BarringConfig.c \ - MBSFN-SubframeConfigList.c \ - MBSFN-SubframeConfig.c \ - SystemInformationBlockType3.c \ - SystemInformationBlockType4.c \ - IntraFreqNeighCellList.c \ - IntraFreqNeighCellInfo.c \ - IntraFreqBlackCellList.c \ - SystemInformationBlockType5.c \ - InterFreqCarrierFreqList.c \ - InterFreqCarrierFreqInfo.c \ - InterFreqNeighCellList.c \ - InterFreqNeighCellInfo.c \ - InterFreqBlackCellList.c \ - SystemInformationBlockType6.c \ - CarrierFreqListUTRA-FDD.c \ - CarrierFreqUTRA-FDD.c \ - CarrierFreqListUTRA-TDD.c \ - CarrierFreqUTRA-TDD.c \ - SystemInformationBlockType7.c \ - CarrierFreqsInfoListGERAN.c \ - CarrierFreqsInfoGERAN.c \ - SystemInformationBlockType8.c \ - CellReselectionParametersCDMA2000.c \ - NeighCellListCDMA2000.c \ - NeighCellCDMA2000.c \ - NeighCellsPerBandclassListCDMA2000.c \ - NeighCellsPerBandclassCDMA2000.c \ - PhysCellIdListCDMA2000.c \ - BandClassListCDMA2000.c \ - BandClassInfoCDMA2000.c \ - SystemInformationBlockType9.c \ - SystemInformationBlockType10.c \ - SystemInformationBlockType11.c \ - AntennaInfoCommon.c \ - AntennaInfoDedicated.c \ - CQI-ReportConfig.c \ - CQI-ReportPeriodic.c \ - DRB-Identity.c \ - LogicalChannelConfig.c \ - MAC-MainConfig.c \ - DRX-Config.c \ - PDCP-Config.c \ - PDSCH-ConfigCommon.c \ - PDSCH-ConfigDedicated.c \ - PHICH-Config.c \ - PhysicalConfigDedicated.c \ - P-Max.c \ - PRACH-ConfigSIB.c \ - PRACH-Config.c \ - PRACH-ConfigInfo.c \ - PresenceAntennaPort1.c \ - PUCCH-ConfigCommon.c \ - PUCCH-ConfigDedicated.c \ - PUSCH-ConfigCommon.c \ - PUSCH-ConfigDedicated.c \ - UL-ReferenceSignalsPUSCH.c \ - RACH-ConfigCommon.c \ - RACH-ConfigDedicated.c \ - RadioResourceConfigCommonSIB.c \ - RadioResourceConfigCommon.c \ - BCCH-Config.c \ - PCCH-Config.c \ - UL-CyclicPrefixLength.c \ - RadioResourceConfigDedicated.c \ - SRB-ToAddModList.c \ - SRB-ToAddMod.c \ - DRB-ToAddModList.c \ - DRB-ToAddMod.c \ - DRB-ToReleaseList.c \ - RLC-Config.c \ - UL-AM-RLC.c \ - DL-AM-RLC.c \ - UL-UM-RLC.c \ - DL-UM-RLC.c \ - SN-FieldLength.c \ - T-PollRetransmit.c \ - PollPDU.c \ - PollByte.c \ - T-Reordering.c \ - T-StatusProhibit.c \ - SchedulingRequestConfig.c \ - SoundingRS-UL-ConfigCommon.c \ - SoundingRS-UL-ConfigDedicated.c \ - SPS-Config.c \ - SPS-ConfigDL.c \ - SPS-ConfigUL.c \ - N1-PUCCH-AN-PersistentList.c \ - TDD-Config.c \ - TimeAlignmentTimer.c \ - TPC-PDCCH-Config.c \ - TPC-Index.c \ - UplinkPowerControlCommon.c \ - UplinkPowerControlDedicated.c \ - DeltaFList-PUCCH.c \ - NextHopChainingCount.c \ - SecurityAlgorithmConfig.c \ - ShortMAC-I.c \ - AdditionalSpectrumEmission.c \ - ARFCN-ValueCDMA2000.c \ - ARFCN-ValueEUTRA.c \ - ARFCN-ValueGERAN.c \ - ARFCN-ValueUTRA.c \ - BandclassCDMA2000.c \ - BandIndicatorGERAN.c \ - CarrierFreqCDMA2000.c \ - CarrierFreqGERAN.c \ - CarrierFreqsGERAN.c \ - ExplicitListOfARFCNs.c \ - CDMA2000-Type.c \ - CellIdentity.c \ - CellIndexList.c \ - CellIndex.c \ - CellReselectionPriority.c \ - CSFB-RegistrationParam1XRTT.c \ - CellGlobalIdEUTRA.c \ - CellGlobalIdUTRA.c \ - CellGlobalIdGERAN.c \ - CellGlobalIdCDMA2000.c \ - MobilityControlInfo.c \ - CarrierBandwidthEUTRA.c \ - CarrierFreqEUTRA.c \ - MobilityParametersCDMA2000.c \ - MobilityStateParameters.c \ - PhysCellId.c \ - PhysCellIdRange.c \ - PhysCellIdCDMA2000.c \ - PhysCellIdGERAN.c \ - PhysCellIdUTRA-FDD.c \ - PhysCellIdUTRA-TDD.c \ - PLMN-Identity.c \ - MCC.c \ - MNC.c \ - MCC-MNC-Digit.c \ - PreRegistrationInfoHRPD.c \ - SecondaryPreRegistrationZoneIdListHRPD.c \ - PreRegistrationZoneIdHRPD.c \ - Q-RxLevMin.c \ - Q-OffsetRange.c \ - Q-OffsetRangeInterRAT.c \ - ReselectionThreshold.c \ - SpeedStateScaleFactors.c \ - SystemTimeInfoCDMA2000.c \ - TrackingAreaCode.c \ - T-Reselection.c \ - AllowedMeasBandwidth.c \ - Hysteresis.c \ - MeasConfig.c \ - MeasIdToRemoveList.c \ - MeasObjectToRemoveList.c \ - ReportConfigToRemoveList.c \ - MeasGapConfig.c \ - MeasId.c \ - MeasIdToAddModList.c \ - MeasIdToAddMod.c \ - MeasObjectCDMA2000.c \ - CellsToAddModListCDMA2000.c \ - CellsToAddModCDMA2000.c \ - MeasObjectEUTRA.c \ - CellsToAddModList.c \ - CellsToAddMod.c \ - BlackCellsToAddModList.c \ - BlackCellsToAddMod.c \ - MeasObjectGERAN.c \ - MeasObjectId.c \ - MeasObjectToAddModList.c \ - MeasObjectToAddMod.c \ - MeasObjectUTRA.c \ - CellsToAddModListUTRA-FDD.c \ - CellsToAddModUTRA-FDD.c \ - CellsToAddModListUTRA-TDD.c \ - CellsToAddModUTRA-TDD.c \ - MeasResults.c \ - MeasResultListEUTRA.c \ - MeasResultEUTRA.c \ - MeasResultListUTRA.c \ - MeasResultUTRA.c \ - MeasResultListGERAN.c \ - MeasResultGERAN.c \ - MeasResultsCDMA2000.c \ - MeasResultListCDMA2000.c \ - MeasResultCDMA2000.c \ - PLMN-IdentityList2.c \ - QuantityConfig.c \ - QuantityConfigEUTRA.c \ - QuantityConfigUTRA.c \ - QuantityConfigGERAN.c \ - QuantityConfigCDMA2000.c \ - ReportConfigEUTRA.c \ - ThresholdEUTRA.c \ - ReportConfigId.c \ - ReportConfigInterRAT.c \ - ThresholdUTRA.c \ - ThresholdGERAN.c \ - ThresholdCDMA2000.c \ - ReportConfigToAddModList.c \ - ReportConfigToAddMod.c \ - ReportInterval.c \ - RSRP-Range.c \ - RSRQ-Range.c \ - TimeToTrigger.c \ - C-RNTI.c \ - DedicatedInfoCDMA2000.c \ - DedicatedInfoNAS.c \ - FilterCoefficient.c \ - MMEC.c \ - NeighCellConfig.c \ - RAND-CDMA2000.c \ - RAT-Type.c \ - RRC-TransactionIdentifier.c \ - S-TMSI.c \ - UE-CapabilityRAT-ContainerList.c \ - UE-CapabilityRAT-Container.c \ - UE-EUTRA-Capability.c \ - AccessStratumRelease.c \ - PDCP-Parameters.c \ - PhyLayerParameters.c \ - RF-Parameters.c \ - SupportedBandListEUTRA.c \ - SupportedBandEUTRA.c \ - MeasParameters.c \ - BandListEUTRA.c \ - BandInfoEUTRA.c \ - InterFreqBandList.c \ - InterFreqBandInfo.c \ - InterRAT-BandList.c \ - InterRAT-BandInfo.c \ - IRAT-ParametersUTRA-FDD.c \ - SupportedBandListUTRA-FDD.c \ - SupportedBandUTRA-FDD.c \ - IRAT-ParametersUTRA-TDD128.c \ - SupportedBandListUTRA-TDD128.c \ - SupportedBandUTRA-TDD128.c \ - IRAT-ParametersUTRA-TDD384.c \ - SupportedBandListUTRA-TDD384.c \ - SupportedBandUTRA-TDD384.c \ - IRAT-ParametersUTRA-TDD768.c \ - SupportedBandListUTRA-TDD768.c \ - SupportedBandUTRA-TDD768.c \ - IRAT-ParametersGERAN.c \ - SupportedBandListGERAN.c \ - SupportedBandGERAN.c \ - IRAT-ParametersCDMA2000-HRPD.c \ - SupportedBandListHRPD.c \ - IRAT-ParametersCDMA2000-1XRTT.c \ - SupportedBandList1XRTT.c \ - UE-TimersAndConstants.c - -ASN_MODULE_HEADERS= \ - BCCH-BCH-Message.h \ - BCCH-BCH-MessageType.h \ - BCCH-DL-SCH-Message.h \ - BCCH-DL-SCH-MessageType.h \ - PCCH-Message.h \ - PCCH-MessageType.h \ - DL-CCCH-Message.h \ - DL-CCCH-MessageType.h \ - DL-DCCH-Message.h \ - DL-DCCH-MessageType.h \ - UL-CCCH-Message.h \ - UL-CCCH-MessageType.h \ - UL-DCCH-Message.h \ - UL-DCCH-MessageType.h \ - CounterCheck.h \ - CounterCheck-r8-IEs.h \ - DRB-CountMSB-InfoList.h \ - DRB-CountMSB-Info.h \ - CounterCheckResponse.h \ - CounterCheckResponse-r8-IEs.h \ - DRB-CountInfoList.h \ - DRB-CountInfo.h \ - CSFBParametersRequestCDMA2000.h \ - CSFBParametersRequestCDMA2000-r8-IEs.h \ - CSFBParametersResponseCDMA2000.h \ - CSFBParametersResponseCDMA2000-r8-IEs.h \ - DLInformationTransfer.h \ - DLInformationTransfer-r8-IEs.h \ - HandoverFromEUTRAPreparationRequest.h \ - HandoverFromEUTRAPreparationRequest-r8-IEs.h \ - MasterInformationBlock.h \ - MeasurementReport.h \ - MeasurementReport-r8-IEs.h \ - MobilityFromEUTRACommand.h \ - MobilityFromEUTRACommand-r8-IEs.h \ - Handover.h \ - CellChangeOrder.h \ - SI-OrPSI-GERAN.h \ - SystemInfoListGERAN.h \ - Paging.h \ - PagingRecordList.h \ - PagingRecord.h \ - PagingUE-Identity.h \ - IMSI.h \ - IMSI-Digit.h \ - RRCConnectionReconfiguration.h \ - RRCConnectionReconfiguration-r8-IEs.h \ - SecurityConfigHO.h \ - RRCConnectionReconfigurationComplete.h \ - RRCConnectionReconfigurationComplete-r8-IEs.h \ - RRCConnectionReestablishment.h \ - RRCConnectionReestablishment-r8-IEs.h \ - RRCConnectionReestablishmentComplete.h \ - RRCConnectionReestablishmentComplete-r8-IEs.h \ - RRCConnectionReestablishmentReject.h \ - RRCConnectionReestablishmentReject-r8-IEs.h \ - RRCConnectionReestablishmentRequest.h \ - RRCConnectionReestablishmentRequest-r8-IEs.h \ - ReestabUE-Identity.h \ - ReestablishmentCause.h \ - RRCConnectionReject.h \ - RRCConnectionReject-r8-IEs.h \ - RRCConnectionRelease.h \ - RRCConnectionRelease-r8-IEs.h \ - ReleaseCause.h \ - RedirectedCarrierInfo.h \ - IdleModeMobilityControlInfo.h \ - FreqPriorityListEUTRA.h \ - FreqPriorityEUTRA.h \ - FreqsPriorityListGERAN.h \ - FreqsPriorityGERAN.h \ - FreqPriorityListUTRA-FDD.h \ - FreqPriorityUTRA-FDD.h \ - FreqPriorityListUTRA-TDD.h \ - FreqPriorityUTRA-TDD.h \ - BandClassPriorityListHRPD.h \ - BandClassPriorityHRPD.h \ - BandClassPriorityList1XRTT.h \ - BandClassPriority1XRTT.h \ - RRCConnectionRequest.h \ - RRCConnectionRequest-r8-IEs.h \ - InitialUE-Identity.h \ - EstablishmentCause.h \ - RRCConnectionSetup.h \ - RRCConnectionSetup-r8-IEs.h \ - RRCConnectionSetupComplete.h \ - RRCConnectionSetupComplete-r8-IEs.h \ - RegisteredMME.h \ - SecurityModeCommand.h \ - SecurityModeCommand-r8-IEs.h \ - SecurityConfigSMC.h \ - SecurityModeComplete.h \ - SecurityModeComplete-r8-IEs.h \ - SecurityModeFailure.h \ - SecurityModeFailure-r8-IEs.h \ - SystemInformation.h \ - SystemInformation-r8-IEs.h \ - SystemInformationBlockType1.h \ - PLMN-IdentityList.h \ - PLMN-IdentityInfo.h \ - SchedulingInfoList.h \ - SchedulingInfo.h \ - SIB-MappingInfo.h \ - SIB-Type.h \ - UECapabilityEnquiry.h \ - UECapabilityEnquiry-r8-IEs.h \ - UE-CapabilityRequest.h \ - UECapabilityInformation.h \ - UECapabilityInformation-r8-IEs.h \ - ULHandoverPreparationTransfer.h \ - ULHandoverPreparationTransfer-r8-IEs.h \ - ULInformationTransfer.h \ - ULInformationTransfer-r8-IEs.h \ - SystemInformationBlockType2.h \ - AC-BarringConfig.h \ - MBSFN-SubframeConfigList.h \ - MBSFN-SubframeConfig.h \ - SystemInformationBlockType3.h \ - SystemInformationBlockType4.h \ - IntraFreqNeighCellList.h \ - IntraFreqNeighCellInfo.h \ - IntraFreqBlackCellList.h \ - SystemInformationBlockType5.h \ - InterFreqCarrierFreqList.h \ - InterFreqCarrierFreqInfo.h \ - InterFreqNeighCellList.h \ - InterFreqNeighCellInfo.h \ - InterFreqBlackCellList.h \ - SystemInformationBlockType6.h \ - CarrierFreqListUTRA-FDD.h \ - CarrierFreqUTRA-FDD.h \ - CarrierFreqListUTRA-TDD.h \ - CarrierFreqUTRA-TDD.h \ - SystemInformationBlockType7.h \ - CarrierFreqsInfoListGERAN.h \ - CarrierFreqsInfoGERAN.h \ - SystemInformationBlockType8.h \ - CellReselectionParametersCDMA2000.h \ - NeighCellListCDMA2000.h \ - NeighCellCDMA2000.h \ - NeighCellsPerBandclassListCDMA2000.h \ - NeighCellsPerBandclassCDMA2000.h \ - PhysCellIdListCDMA2000.h \ - BandClassListCDMA2000.h \ - BandClassInfoCDMA2000.h \ - SystemInformationBlockType9.h \ - SystemInformationBlockType10.h \ - SystemInformationBlockType11.h \ - AntennaInfoCommon.h \ - AntennaInfoDedicated.h \ - CQI-ReportConfig.h \ - CQI-ReportPeriodic.h \ - DRB-Identity.h \ - LogicalChannelConfig.h \ - MAC-MainConfig.h \ - DRX-Config.h \ - PDCP-Config.h \ - PDSCH-ConfigCommon.h \ - PDSCH-ConfigDedicated.h \ - PHICH-Config.h \ - PhysicalConfigDedicated.h \ - P-Max.h \ - PRACH-ConfigSIB.h \ - PRACH-Config.h \ - PRACH-ConfigInfo.h \ - PresenceAntennaPort1.h \ - PUCCH-ConfigCommon.h \ - PUCCH-ConfigDedicated.h \ - PUSCH-ConfigCommon.h \ - PUSCH-ConfigDedicated.h \ - UL-ReferenceSignalsPUSCH.h \ - RACH-ConfigCommon.h \ - RACH-ConfigDedicated.h \ - RadioResourceConfigCommonSIB.h \ - RadioResourceConfigCommon.h \ - BCCH-Config.h \ - PCCH-Config.h \ - UL-CyclicPrefixLength.h \ - RadioResourceConfigDedicated.h \ - SRB-ToAddModList.h \ - SRB-ToAddMod.h \ - DRB-ToAddModList.h \ - DRB-ToAddMod.h \ - DRB-ToReleaseList.h \ - RLC-Config.h \ - UL-AM-RLC.h \ - DL-AM-RLC.h \ - UL-UM-RLC.h \ - DL-UM-RLC.h \ - SN-FieldLength.h \ - T-PollRetransmit.h \ - PollPDU.h \ - PollByte.h \ - T-Reordering.h \ - T-StatusProhibit.h \ - SchedulingRequestConfig.h \ - SoundingRS-UL-ConfigCommon.h \ - SoundingRS-UL-ConfigDedicated.h \ - SPS-Config.h \ - SPS-ConfigDL.h \ - SPS-ConfigUL.h \ - N1-PUCCH-AN-PersistentList.h \ - TDD-Config.h \ - TimeAlignmentTimer.h \ - TPC-PDCCH-Config.h \ - TPC-Index.h \ - UplinkPowerControlCommon.h \ - UplinkPowerControlDedicated.h \ - DeltaFList-PUCCH.h \ - NextHopChainingCount.h \ - SecurityAlgorithmConfig.h \ - ShortMAC-I.h \ - AdditionalSpectrumEmission.h \ - ARFCN-ValueCDMA2000.h \ - ARFCN-ValueEUTRA.h \ - ARFCN-ValueGERAN.h \ - ARFCN-ValueUTRA.h \ - BandclassCDMA2000.h \ - BandIndicatorGERAN.h \ - CarrierFreqCDMA2000.h \ - CarrierFreqGERAN.h \ - CarrierFreqsGERAN.h \ - ExplicitListOfARFCNs.h \ - CDMA2000-Type.h \ - CellIdentity.h \ - CellIndexList.h \ - CellIndex.h \ - CellReselectionPriority.h \ - CSFB-RegistrationParam1XRTT.h \ - CellGlobalIdEUTRA.h \ - CellGlobalIdUTRA.h \ - CellGlobalIdGERAN.h \ - CellGlobalIdCDMA2000.h \ - MobilityControlInfo.h \ - CarrierBandwidthEUTRA.h \ - CarrierFreqEUTRA.h \ - MobilityParametersCDMA2000.h \ - MobilityStateParameters.h \ - PhysCellId.h \ - PhysCellIdRange.h \ - PhysCellIdCDMA2000.h \ - PhysCellIdGERAN.h \ - PhysCellIdUTRA-FDD.h \ - PhysCellIdUTRA-TDD.h \ - PLMN-Identity.h \ - MCC.h \ - MNC.h \ - MCC-MNC-Digit.h \ - PreRegistrationInfoHRPD.h \ - SecondaryPreRegistrationZoneIdListHRPD.h \ - PreRegistrationZoneIdHRPD.h \ - Q-RxLevMin.h \ - Q-OffsetRange.h \ - Q-OffsetRangeInterRAT.h \ - ReselectionThreshold.h \ - SpeedStateScaleFactors.h \ - SystemTimeInfoCDMA2000.h \ - TrackingAreaCode.h \ - T-Reselection.h \ - AllowedMeasBandwidth.h \ - Hysteresis.h \ - MeasConfig.h \ - MeasIdToRemoveList.h \ - MeasObjectToRemoveList.h \ - ReportConfigToRemoveList.h \ - MeasGapConfig.h \ - MeasId.h \ - MeasIdToAddModList.h \ - MeasIdToAddMod.h \ - MeasObjectCDMA2000.h \ - CellsToAddModListCDMA2000.h \ - CellsToAddModCDMA2000.h \ - MeasObjectEUTRA.h \ - CellsToAddModList.h \ - CellsToAddMod.h \ - BlackCellsToAddModList.h \ - BlackCellsToAddMod.h \ - MeasObjectGERAN.h \ - MeasObjectId.h \ - MeasObjectToAddModList.h \ - MeasObjectToAddMod.h \ - MeasObjectUTRA.h \ - CellsToAddModListUTRA-FDD.h \ - CellsToAddModUTRA-FDD.h \ - CellsToAddModListUTRA-TDD.h \ - CellsToAddModUTRA-TDD.h \ - MeasResults.h \ - MeasResultListEUTRA.h \ - MeasResultEUTRA.h \ - MeasResultListUTRA.h \ - MeasResultUTRA.h \ - MeasResultListGERAN.h \ - MeasResultGERAN.h \ - MeasResultsCDMA2000.h \ - MeasResultListCDMA2000.h \ - MeasResultCDMA2000.h \ - PLMN-IdentityList2.h \ - QuantityConfig.h \ - QuantityConfigEUTRA.h \ - QuantityConfigUTRA.h \ - QuantityConfigGERAN.h \ - QuantityConfigCDMA2000.h \ - ReportConfigEUTRA.h \ - ThresholdEUTRA.h \ - ReportConfigId.h \ - ReportConfigInterRAT.h \ - ThresholdUTRA.h \ - ThresholdGERAN.h \ - ThresholdCDMA2000.h \ - ReportConfigToAddModList.h \ - ReportConfigToAddMod.h \ - ReportInterval.h \ - RSRP-Range.h \ - RSRQ-Range.h \ - TimeToTrigger.h \ - C-RNTI.h \ - DedicatedInfoCDMA2000.h \ - DedicatedInfoNAS.h \ - FilterCoefficient.h \ - MMEC.h \ - NeighCellConfig.h \ - RAND-CDMA2000.h \ - RAT-Type.h \ - RRC-TransactionIdentifier.h \ - S-TMSI.h \ - UE-CapabilityRAT-ContainerList.h \ - UE-CapabilityRAT-Container.h \ - UE-EUTRA-Capability.h \ - AccessStratumRelease.h \ - PDCP-Parameters.h \ - PhyLayerParameters.h \ - RF-Parameters.h \ - SupportedBandListEUTRA.h \ - SupportedBandEUTRA.h \ - MeasParameters.h \ - BandListEUTRA.h \ - BandInfoEUTRA.h \ - InterFreqBandList.h \ - InterFreqBandInfo.h \ - InterRAT-BandList.h \ - InterRAT-BandInfo.h \ - IRAT-ParametersUTRA-FDD.h \ - SupportedBandListUTRA-FDD.h \ - SupportedBandUTRA-FDD.h \ - IRAT-ParametersUTRA-TDD128.h \ - SupportedBandListUTRA-TDD128.h \ - SupportedBandUTRA-TDD128.h \ - IRAT-ParametersUTRA-TDD384.h \ - SupportedBandListUTRA-TDD384.h \ - SupportedBandUTRA-TDD384.h \ - IRAT-ParametersUTRA-TDD768.h \ - SupportedBandListUTRA-TDD768.h \ - SupportedBandUTRA-TDD768.h \ - IRAT-ParametersGERAN.h \ - SupportedBandListGERAN.h \ - SupportedBandGERAN.h \ - IRAT-ParametersCDMA2000-HRPD.h \ - SupportedBandListHRPD.h \ - IRAT-ParametersCDMA2000-1XRTT.h \ - SupportedBandList1XRTT.h \ - UE-TimersAndConstants.h - -ASN_MODULE_HEADERS+=BOOLEAN.h -ASN_MODULE_SOURCES+=BOOLEAN.c -ASN_MODULE_HEADERS+=INTEGER.h -ASN_MODULE_HEADERS+=NativeEnumerated.h -ASN_MODULE_SOURCES+=INTEGER.c -ASN_MODULE_HEADERS+=NULL.h -ASN_MODULE_SOURCES+=NULL.c -ASN_MODULE_SOURCES+=NativeEnumerated.c -ASN_MODULE_HEADERS+=NativeInteger.h -ASN_MODULE_SOURCES+=NativeInteger.c -ASN_MODULE_HEADERS+=asn_SEQUENCE_OF.h -ASN_MODULE_SOURCES+=asn_SEQUENCE_OF.c -ASN_MODULE_HEADERS+=asn_SET_OF.h -ASN_MODULE_SOURCES+=asn_SET_OF.c -ASN_MODULE_HEADERS+=constr_CHOICE.h -ASN_MODULE_SOURCES+=constr_CHOICE.c -ASN_MODULE_HEADERS+=constr_SEQUENCE.h -ASN_MODULE_SOURCES+=constr_SEQUENCE.c -ASN_MODULE_HEADERS+=constr_SEQUENCE_OF.h -ASN_MODULE_SOURCES+=constr_SEQUENCE_OF.c -ASN_MODULE_HEADERS+=constr_SET_OF.h -ASN_MODULE_SOURCES+=constr_SET_OF.c -ASN_MODULE_HEADERS+=asn_application.h -ASN_MODULE_HEADERS+=asn_system.h -ASN_MODULE_HEADERS+=asn_codecs.h -ASN_MODULE_HEADERS+=asn_internal.h -ASN_MODULE_HEADERS+=OCTET_STRING.h -ASN_MODULE_SOURCES+=OCTET_STRING.c -ASN_MODULE_HEADERS+=BIT_STRING.h -ASN_MODULE_SOURCES+=BIT_STRING.c -ASN_MODULE_SOURCES+=asn_codecs_prim.c -ASN_MODULE_HEADERS+=asn_codecs_prim.h -ASN_MODULE_HEADERS+=ber_tlv_length.h -ASN_MODULE_SOURCES+=ber_tlv_length.c -ASN_MODULE_HEADERS+=ber_tlv_tag.h -ASN_MODULE_SOURCES+=ber_tlv_tag.c -ASN_MODULE_HEADERS+=ber_decoder.h -ASN_MODULE_SOURCES+=ber_decoder.c -ASN_MODULE_HEADERS+=der_encoder.h -ASN_MODULE_SOURCES+=der_encoder.c -ASN_MODULE_HEADERS+=constr_TYPE.h -ASN_MODULE_SOURCES+=constr_TYPE.c -ASN_MODULE_HEADERS+=constraints.h -ASN_MODULE_SOURCES+=constraints.c -ASN_MODULE_HEADERS+=xer_support.h -ASN_MODULE_SOURCES+=xer_support.c -ASN_MODULE_HEADERS+=xer_decoder.h -ASN_MODULE_SOURCES+=xer_decoder.c -ASN_MODULE_HEADERS+=xer_encoder.h -ASN_MODULE_SOURCES+=xer_encoder.c -ASN_MODULE_HEADERS+=per_support.h -ASN_MODULE_SOURCES+=per_support.c -ASN_MODULE_HEADERS+=per_decoder.h -ASN_MODULE_SOURCES+=per_decoder.c -ASN_MODULE_HEADERS+=per_encoder.h -ASN_MODULE_SOURCES+=per_encoder.c -ASN_MODULE_HEADERS+=per_opentype.h -ASN_MODULE_SOURCES+=per_opentype.c -ASN_CONVERTER_SOURCES+=converter-sample.c - - -lib_LTLIBRARIES=libsomething.la -libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) - -# This file may be used as an input for make(3) -# Remove the lines below to convert it into a pure .am file -TARGET = progname -CFLAGS += -I. -OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} - -all: $(TARGET) - -$(TARGET): ${OBJS} - $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) - -.SUFFIXES: -.SUFFIXES: .c .o - -.c.o: - $(CC) $(CFLAGS) -o $@ -c $< - -clean: - rm -f $(TARGET) - rm -f $(OBJS) - -regen: regenerate-from-asn1-source - -regenerate-from-asn1-source: - asn1c -gen-PER -fcompound-names -fnative-types -fskeletons-copy ./ASN1_files/EUTRA-RRC-Definitions.asn - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.cpp deleted file mode 100755 index 4b3bbc2537..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.cpp +++ /dev/null @@ -1,414 +0,0 @@ -/** - ** \file Ajp13Socket.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "Ajp13Socket.h" -#include "ajp13.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -// -------------------------------------------------------------------------------------- -Ajp13Socket::Ajp13Socket(ISocketHandler& h) : AjpBaseSocket(h) -, m_body_size_left(0) -{ -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::OnHeader( short id, short len ) -{ - if (id != 0x1234) - { -DEB( fprintf(stderr, "ABORT: bad packet id: %x\n", id);) - SetCloseAndDelete(); - } - else - { - DEB(fprintf(stderr, "Packet size: %d bytes\n", len);) - } -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::ReceiveBody(const char *buf, size_t sz) -{ - if (sz - 2 > m_body_size_left) - { -DEB( fprintf(stderr, "More body data received than expected\n");) - SetCloseAndDelete(); - return; - } - - m_req.Write( buf + 2, sz - 2 ); - m_body_size_left -= sz - 2; - - // request more body data - if (m_body_size_left) - { - int ptr = 4; - char msg[100]; - msg[0] = 'A'; - msg[1] = 'B'; - -// reply codes -// 0x3 Send Body Chunk -// 0x4 Send Headers -// 0x5 End Response -// 0x6 Get Body Chunk <------ -// 0x9 CPong Reply - - put_byte(msg, ptr, 0x06); // GET_BODY_CHUNK; - put_integer(msg, ptr, 1000); // request 1000 bytes - - short len = htons( ptr - 4 ); - memcpy( msg + 2, &len, 2 ); - - SendBuf( msg, ptr ); - return; - } - - // Close - m_req.CloseBody(); - - // no more body data left to read - execute - Execute(); - -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::ReceiveForwardRequest( const char *buf, size_t sz ) -{ - // - int ptr = 0; - - get_byte(buf, ptr); // skip first byte: prefix_code - unsigned char method = get_byte(buf, ptr); - std::string protocol = get_string(buf, ptr); - std::string req_uri = get_string(buf, ptr); - std::string remote_addr = get_string(buf, ptr); - std::string remote_host = get_string(buf, ptr); - std::string server_name = get_string(buf, ptr); - short server_port = get_integer(buf, ptr); - bool is_ssl = get_boolean(buf, ptr); - - std::string method_str = Utility::l2string( method ); - std::map::const_iterator it = Init.Method.find( method ); - if (it != Init.Method.end()) - { - method_str = it -> second; - } - m_req.SetHttpMethod( method_str ); - m_req.SetHttpVersion( protocol ); - m_req.SetUri( req_uri ); - m_req.SetRemoteAddr( remote_addr ); - m_req.SetRemoteHost( remote_host ); - m_req.SetServerName( server_name ); - m_req.SetServerPort( server_port ); - m_req.SetIsSsl( is_ssl ); - - // Get Headers - short num_headers = get_integer(buf, ptr); - for (int i = 0; i < num_headers; i++) - { - std::string key; - switch ( (unsigned char)buf[ptr]) // 0xa0 - { - case 0xa0: - { - unsigned short x = (unsigned short)get_integer(buf, ptr); - std::map::const_iterator it; - if ( (it = Init.Header.find(x)) != Init.Header.end()) - { - key = it -> second; - } - else - { -DEB( fprintf(stderr, "Unknown header key value: %x\n", x);) - SetCloseAndDelete(); - } - } - break; - - default: // string - key = get_string(buf, ptr); - } - if (Utility::ToLower(key) == "cookie" || Utility::ToLower(key) == "cookie2") - m_req.AddCookie(get_string(buf, ptr)); - else - m_req.SetHeader(key, get_string(buf, ptr)); - } // for - - // size left to read from web server - m_body_size_left = m_req.ContentLength(); - - // Get Attributes - while ( (unsigned char)buf[ptr] != 0xff) - { - std::string key; - unsigned char code = buf[ptr++]; - switch ( code) - { - case 10: // req_attribute, attribute name follow - key = get_string(buf, ptr); - break; - default: - { - std::map::const_iterator it = Init.Attribute.find( code ); - if (it != Init.Attribute.end()) - { - key = it -> second; - } - else - { -DEB( fprintf(stderr, "Unknown attribute key: 0x%02x\n", buf[ptr]);) - SetCloseAndDelete(); - } - } - } - m_req.SetAttribute(key, get_string(buf, ptr)); - } // while - - // execute at once if no body data - if (!m_body_size_left) - { - Execute(); - } - else - { - // open temporary file for body data - m_req.InitBody( m_body_size_left ); - } -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::ReceiveShutdown( const char *buf, size_t sz ) -{ -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::ReceivePing( const char *buf, size_t sz ) -{ -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::ReceiveCPing( const char *buf, size_t sz ) -{ -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::Execute() -{ - // parse form data / query_string and cookie header if available - m_req.ParseBody(); - - // prepare page - OnExec( m_req ); - -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::Respond(const HttpResponse& res) -{ - char msg[8192]; - msg[0] = 'A'; - msg[1] = 'B'; - - m_res = res; - -// reply codes -// 0x3 Send Body Chunk -// 0x4 Send Headers -// 0x5 End Response -// 0x6 Get Body Chunk -// 0x9 CPong Reply - - // check content length - if (!m_res.ContentLength() && m_res.GetFile().size()) - { -// m_res.SetContentLength( m_res.GetFile().size() ); - } - - // Send Headers - { - int ptr = 4; - put_byte(msg, ptr, 0x04); // send headers - put_integer(msg, ptr, m_res.HttpStatusCode() ); - put_string(msg, ptr, m_res.HttpStatusMsg() ); - put_integer(msg, ptr, (short)m_res.Headers().size() ); - for (Utility::ncmap::const_iterator it = m_res.Headers().begin(); it != m_res.Headers().end(); ++it) - { - Utility::ncmap::const_iterator it2 = Init.ResponseHeader.find( it -> first ); - if (it2 != Init.ResponseHeader.end()) - { - put_integer(msg, ptr, it2 -> second); - } - else - { - put_string(msg, ptr, it -> first); - } - put_string(msg, ptr, it -> second); - } - std::list vec = m_res.CookieNames(); - { - for (std::list::iterator it = vec.begin(); it != vec.end(); ++it) - { - Utility::ncmap::const_iterator it2 = Init.ResponseHeader.find( "set-cookie" ); - if (it2 != Init.ResponseHeader.end()) - { - put_integer(msg, ptr, it2 -> second); - } - else - { - put_string(msg, ptr, "set-cookie"); - } - put_string(msg, ptr, m_res.Cookie(*it) ); - } - } - - short len = htons( ptr - 4 ); - memcpy( msg + 2, &len, 2 ); - - SendBuf( msg, ptr ); - } - // Send Body Chunk - OnTransferLimit(); -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::OnTransferLimit() -{ - char msg[8192]; - msg[0] = 'A'; - msg[1] = 'B'; - - // Send Body Chunk - size_t n = m_res.GetFile().fread(msg + 7, 1, 8100); - while (n > 0) - { - int ptr = 4; - put_byte(msg, ptr, 0x03); // send body chunk - put_integer(msg, ptr, (short)n); - ptr += (int)n; - - short len = htons( ptr - 4 ); - memcpy( msg + 2, &len, 2 ); - - SendBuf( msg, ptr ); - if (GetOutputLength() > 1) - { - SetTransferLimit( 1 ); - break; - } - - // - n = m_res.GetFile().fread(msg + 7, 1, 8100); - } - if (!GetOutputLength()) // all body data sent and no data in output buffer - send end response - { - // End Response - int ptr = 4; - put_byte(msg, ptr, 0x05); // end response - put_boolean(msg, ptr, false); // reuse - /* - don't reuse - - but with m_req.Reset() and m_res.Reset() it should be possible - - also reset any AjpBaseSocket/Ajp13Socket specific states - */ - - short len = htons( ptr - 4 ); - memcpy( msg + 2, &len, 2 ); - - SendBuf( msg, ptr ); - - SetTransferLimit(0); - m_res.GetFile().fclose(); - OnResponseComplete(); - } -} - - -// -------------------------------------------------------------------------------------- -void Ajp13Socket::OnPacket( const char *buf, size_t sz ) -{ - DEB(fprintf(stderr, "OnPacket: %d bytes, code 0x%02x %02x %02x %02x\n", sz, *buf, buf[1], buf[2], buf[3]);) - - // check body size left to read, if non-zero packet is body data - if (m_body_size_left) // must be a body packet - { - ReceiveBody(buf, sz); - return; - } - switch (*buf) - { - case 0x2: // Forward Request - ReceiveForwardRequest(buf, sz); - break; - case 0x7: // Shutdown - ReceiveShutdown(buf, sz); - break; - case 0x8: // Ping - ReceivePing(buf, sz); - break; - case 0xa: // CPing - ReceiveCPing(buf, sz); - break; - default: -DEB( fprintf(stderr, "Unknown packet type: 0x%02x\n", *buf);) - SetCloseAndDelete(); - } - -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.h deleted file mode 100755 index 14033b48d9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ajp13Socket.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - ** \file Ajp13Socket.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Ajp13Socket_H -#define _SOCKETS_Ajp13Socket_H - -#include "AjpBaseSocket.h" -#include "HttpRequest.h" -#include "IHttpServer.h" -#include "HttpResponse.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpResponse; - -class Ajp13Socket : public AjpBaseSocket, public IHttpServer -{ -public: - Ajp13Socket(ISocketHandler& h); - - void OnHeader( short id, short len ); - void OnPacket( const char *buf, size_t sz ); - - // implements IHttpServer::Respond - void Respond(const HttpResponse& res); - - void OnTransferLimit(); - -private: - void ReceiveBody( const char *buf, size_t sz ); - void ReceiveForwardRequest( const char *buf, size_t sz ); - void ReceiveShutdown( const char *buf, size_t sz ); - void ReceivePing( const char *buf, size_t sz ); - void ReceiveCPing( const char *buf, size_t sz ); - void Execute(); - // - size_t m_body_size_left; - HttpRequest m_req; - HttpResponse m_res; -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_Ajp13Socket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.cpp deleted file mode 100755 index 784f5d78fa..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.cpp +++ /dev/null @@ -1,268 +0,0 @@ -/** - ** \file AjpBaseSocket.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "AjpBaseSocket.h" -#include "ajp13.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -// --------------------------------------------------------------------------- -AjpBaseSocket::Initializer AjpBaseSocket::Init; - - -// --------------------------------------------------------------------------- -AjpBaseSocket::Initializer::Initializer() -{ - - Header[HTTP_REQUEST_ACCEPT] = "accept"; - Header[HTTP_REQUEST_ACCEPT_CHARSET] = "accept-charset"; - Header[HTTP_REQUEST_ACCEPT_ENCODING] = "accept-encoding"; - Header[HTTP_REQUEST_ACCEPT_LANGUAGE] = "accept-language"; - Header[HTTP_REQUEST_AUTHORIZATION] = "authorization"; - Header[HTTP_REQUEST_CONNECTION] = "connection"; - Header[HTTP_REQUEST_CONTENT_TYPE] = "content-type"; - Header[HTTP_REQUEST_CONTENT_LENGTH] = "content-length"; - Header[HTTP_REQUEST_COOKIE] = "cookie"; - Header[HTTP_REQUEST_COOKIE2] = "cookie2"; - Header[HTTP_REQUEST_HOST] = "host"; - Header[HTTP_REQUEST_PRAGMA] = "pragma"; - Header[HTTP_REQUEST_REFERER] = "referer"; - Header[HTTP_REQUEST_USER_AGENT] = "user-agent"; - - Method[HTTP_METHOD_OPTIONS] = "OPTIONS"; - Method[HTTP_METHOD_GET] = "GET"; - Method[HTTP_METHOD_HEAD] = "HEAD"; - Method[HTTP_METHOD_POST] = "POST"; - Method[HTTP_METHOD_PUT] = "PUT"; - Method[HTTP_METHOD_DELETE] = "DELETE"; - Method[HTTP_METHOD_TRACE] = "TRACE"; - Method[HTTP_METHOD_PROPFIND] = "PROPFIND"; - Method[HTTP_METHOD_PROPPATCH] = "PROPPATCH"; - Method[HTTP_METHOD_MKCOL] = "MKCOL"; - Method[HTTP_METHOD_COPY] = "COPY"; - Method[HTTP_METHOD_MOVE] = "MOVE"; - Method[HTTP_METHOD_LOCK] = "LOCK"; - Method[HTTP_METHOD_UNLOCK] = "UNLOCK"; - Method[HTTP_METHOD_ACL] = "ACL"; - Method[HTTP_METHOD_REPORT] = "REPORT"; - Method[HTTP_METHOD_VERSION_CONTROL] = "VERSION_CONTROL"; // with a dash "VERSION-CONTROL" - Method[HTTP_METHOD_CHECKIN] = "CHECKIN"; - Method[HTTP_METHOD_CHECKOUT] = "CHECKOUT"; - Method[HTTP_METHOD_UNCHECKOUT] = "UNCHECKOUT"; - Method[HTTP_METHOD_SEARCH] = "SEARCH"; - Method[HTTP_METHOD_MKWORKSPACE] = "MKWORKSPACE"; - Method[HTTP_METHOD_UPDATE] = "UPDATE"; - Method[HTTP_METHOD_LABEL] = "LABEL"; - Method[HTTP_METHOD_MERGE] = "MERGE"; - Method[HTTP_METHOD_BASELINE_CONTROL] = "BASELINE_CONTROL"; - Method[HTTP_METHOD_MKACTIVITY] = "MKACTIVITY"; - - Attribute[ATTR_CONTEXT] = "context"; - Attribute[ATTR_SERVLET_PATH] = "servlet_path"; - Attribute[ATTR_REMOTE_USER] = "remote_user"; - Attribute[ATTR_AUTH_TYPE] = "auth_type"; - Attribute[ATTR_QUERY_STRING] = "query_string"; - Attribute[ATTR_ROUTE] = "route"; - Attribute[ATTR_SSL_CERT] = "ssl_cert"; - Attribute[ATTR_SSL_CIPHER] = "ssl_cipher"; - Attribute[ATTR_SSL_SESSION] = "ssl_session"; - Attribute[ATTR_SSL_KEY_SIZE] = "ssl_key_size"; - Attribute[ATTR_SECRET] = "secret"; - Attribute[ATTR_STORED_METHOD] = "stored_method"; - - ResponseHeader["content-type"] = 0xa001; - ResponseHeader["content-language"] = 0xa002; - ResponseHeader["content-length"] = 0xa003; - ResponseHeader["date"] = 0xa004; - ResponseHeader["last-modified"] = 0xa005; - ResponseHeader["location"] = 0xa006; - ResponseHeader["set-cookie"] = 0xa007; - ResponseHeader["set-cookie2"] = 0xa008; - ResponseHeader["servlet-engine"] = 0xa009; - ResponseHeader["status"] = 0xa00a; - ResponseHeader["www-authenticate"] = 0xa00b; -} - - -// --------------------------------------------------------------------------- -AjpBaseSocket::AjpBaseSocket(ISocketHandler& h) : TcpSocket(h) -, m_state(0) -, m_length(4) -, m_ptr(0) -{ -} - - -// --------------------------------------------------------------------------- -void AjpBaseSocket::OnRawData(const char *buf, size_t sz) -{ -DEB(fprintf(stderr, "OnRawData: %d bytes\n", sz);) - size_t ptr = 0; - while (true) - { - size_t left = sz - ptr; -DEB(fprintf(stderr, " left: %d bytes\n", left); -fprintf(stderr, " state: %d\n", m_state);) - switch (m_state) - { - case 0: - { - size_t missing = m_length - m_ptr; - short len = (short)(missing < left ? missing : left); - memcpy(m_message + m_ptr, buf + ptr, len); - m_ptr += len; - ptr += len; - if (m_ptr < m_length) - { - return; // read more - } - int p = 0; - short id = get_integer(m_message, p); - short length = get_integer(m_message, p); - OnHeader(id, length); - m_state = 1; - m_length = length; - m_ptr = 0; // bytes in m_message - } - break; - case 1: - { - size_t missing = m_length - m_ptr; - short len = (short)(missing < left ? missing : left); - memcpy(m_message + m_ptr, buf + ptr, len); - m_ptr += len; - ptr += len; - if (m_ptr < m_length) - { - return; // read more - } - OnPacket(m_message, m_ptr); - m_state = 0; - m_length = 4; - m_ptr = 0; - } - break; - } - } -} - - -// --------------------------------------------------------------------------- -unsigned char AjpBaseSocket::get_byte(const char *buf, int& ptr) -{ - return (unsigned char)buf[ptr++]; -} - - -// --------------------------------------------------------------------------- -bool AjpBaseSocket::get_boolean(const char *buf, int& ptr) -{ - return ( (unsigned char)buf[ptr++] & 1) == 1 ? true : false; -} - - -// --------------------------------------------------------------------------- -short AjpBaseSocket::get_integer(const char *buf, int& ptr) -{ - short n; - memcpy(&n, buf + ptr, 2); - ptr += 2; - return ntohs(n); -} - - -// --------------------------------------------------------------------------- -std::string AjpBaseSocket::get_string(const char *buf, int& ptr) -{ - short len = get_integer(buf, ptr); - if (len != -1) - { - std::string tmp = buf + ptr; - ptr += len; - ptr++; // skip trailing 0x0 - tmp.resize(len); - return tmp; - } - return ""; -} - - -// --------------------------------------------------------------------------- -void AjpBaseSocket::put_byte(char *buf, int& ptr, unsigned char zz) -{ - buf[ptr++] = zz; -} - - -// --------------------------------------------------------------------------- -void AjpBaseSocket::put_boolean(char *buf, int& ptr, bool zz) -{ - buf[ptr++] = zz ? 1 : 0; -} - - -// --------------------------------------------------------------------------- -void AjpBaseSocket::put_integer(char *buf, int& ptr, short zz) -{ - short tmp = htons(zz); - memcpy(buf + ptr, &tmp, 2); - ptr += 2; -} - - -// --------------------------------------------------------------------------- -void AjpBaseSocket::put_string(char *buf, int& ptr, const std::string& zz) -{ - put_integer(buf, ptr, (short)zz.size() ); - memcpy(buf + ptr, zz.c_str(), zz.size()); - ptr += (int)zz.size(); - put_byte(buf, ptr, 0); -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.h deleted file mode 100755 index 74d3939ed2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/AjpBaseSocket.h +++ /dev/null @@ -1,96 +0,0 @@ -/** - ** \file AjpBaseSocket.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_AjpBaseSocket_H -#define _SOCKETS_AjpBaseSocket_H - -#include "TcpSocket.h" -#include -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class AjpBaseSocket : public TcpSocket -{ - class Initializer - { - public: - Initializer(); - virtual ~Initializer() {} - - std::map Method; - std::map Header; - std::map Attribute; - - Utility::ncmap ResponseHeader; - - }; - -public: - AjpBaseSocket(ISocketHandler& h); - - void OnRawData(const char *buf, size_t sz); - - virtual void OnHeader( short id, short len ) = 0; - virtual void OnPacket( const char *buf, size_t sz ) = 0; - -protected: - unsigned char get_byte(const char *buf, int& ptr); - bool get_boolean(const char *buf, int& ptr); - short get_integer(const char *buf, int& ptr); - std::string get_string(const char *buf, int& ptr); - - void put_byte(char *buf, int& ptr, unsigned char zz); - void put_boolean(char *buf, int& ptr, bool zz); - void put_integer(char *buf, int& ptr, short zz); - void put_string(char *buf, int& ptr, const std::string& zz); - - static Initializer Init; - -private: - int m_state; - int m_length; - int m_ptr; - char m_message[8192]; -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_AjpBaseSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.cpp deleted file mode 100755 index 1a2286ce2c..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/** \file Base64.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "Base64.h" -#include "IFile.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -const char *Base64::bstr = - "ABCDEFGHIJKLMNOPQ" - "RSTUVWXYZabcdefgh" - "ijklmnopqrstuvwxy" - "z0123456789+/"; - -const char Base64::rstr[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, - 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0}; - - -Base64::Base64() -{ -} - - -void Base64::encode(IFile *fil, std::string& output, bool add_crlf) -{ - size_t remain; - size_t i = 0; - size_t o = 0; - char input[4]; - - output = ""; - remain = fil -> fread(input,1,3); - while (remain > 0) - { - if (add_crlf && o && o % 76 == 0) - output += "\n"; - switch (remain) - { - case 1: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) ]; - output += "=="; - break; - case 2: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) ]; - output += "="; - break; - default: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ]; - output += bstr[ (input[i + 2] & 0x3f) ]; - } - o += 4; - // - remain = fil -> fread(input,1,3); - } -} - - -void Base64::encode(FILE *fil, std::string& output, bool add_crlf) -{ - size_t remain; - size_t i = 0; - size_t o = 0; - char input[4]; - - output = ""; - remain = fread(input,1,3,fil); - while (remain > 0) - { - if (add_crlf && o && o % 76 == 0) - output += "\n"; - switch (remain) - { - case 1: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) ]; - output += "=="; - break; - case 2: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) ]; - output += "="; - break; - default: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ]; - output += bstr[ (input[i + 2] & 0x3f) ]; - } - o += 4; - // - remain = fread(input,1,3,fil); - } -} - - -void Base64::encode(const std::string& str_in, std::string& str_out, bool add_crlf) -{ - encode(str_in.c_str(), str_in.size(), str_out, add_crlf); -} - - -void Base64::encode(const char* input,size_t l,std::string& output, bool add_crlf) -{ - size_t i = 0; - size_t o = 0; - - output = ""; - while (i < l) - { - size_t remain = l - i; - if (add_crlf && o && o % 76 == 0) - output += "\n"; - switch (remain) - { - case 1: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) ]; - output += "=="; - break; - case 2: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) ]; - output += "="; - break; - default: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ]; - output += bstr[ (input[i + 2] & 0x3f) ]; - } - o += 4; - i += 3; - } -} - - -void Base64::encode(const unsigned char* input,size_t l,std::string& output,bool add_crlf) -{ - size_t i = 0; - size_t o = 0; - - output = ""; - while (i < l) - { - size_t remain = l - i; - if (add_crlf && o && o % 76 == 0) - output += "\n"; - switch (remain) - { - case 1: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) ]; - output += "=="; - break; - case 2: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) ]; - output += "="; - break; - default: - output += bstr[ ((input[i] >> 2) & 0x3f) ]; - output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ]; - output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ]; - output += bstr[ (input[i + 2] & 0x3f) ]; - } - o += 4; - i += 3; - } -} - - -void Base64::decode(const std::string& input,std::string& output) -{ - size_t i = 0; - size_t l = input.size(); - - output = ""; - while (i < l) - { - while (i < l && (input[i] == 13 || input[i] == 10)) - i++; - if (i < l) - { - char b1 = (char)((rstr[(int)input[i]] << 2 & 0xfc) + - (rstr[(int)input[i + 1]] >> 4 & 0x03)); - output += b1; - if (input[i + 2] != '=') - { - char b2 = (char)((rstr[(int)input[i + 1]] << 4 & 0xf0) + - (rstr[(int)input[i + 2]] >> 2 & 0x0f)); - output += b2; - } - if (input[i + 3] != '=') - { - char b3 = (char)((rstr[(int)input[i + 2]] << 6 & 0xc0) + - rstr[(int)input[i + 3]]); - output += b3; - } - i += 4; - } - } -} - - -void Base64::decode(const std::string& input, unsigned char *output, size_t& sz) -{ - size_t i = 0; - size_t l = input.size(); - size_t j = 0; - - while (i < l) - { - while (i < l && (input[i] == 13 || input[i] == 10)) - i++; - if (i < l) - { - unsigned char b1 = (unsigned char)((rstr[(int)input[i]] << 2 & 0xfc) + - (rstr[(int)input[i + 1]] >> 4 & 0x03)); - if (output) - { - output[j] = b1; - } - j++; - if (input[i + 2] != '=') - { - unsigned char b2 = (unsigned char)((rstr[(int)input[i + 1]] << 4 & 0xf0) + - (rstr[(int)input[i + 2]] >> 2 & 0x0f)); - if (output) - { - output[j] = b2; - } - j++; - } - if (input[i + 3] != '=') - { - unsigned char b3 = (unsigned char)((rstr[(int)input[i + 2]] << 6 & 0xc0) + - rstr[(int)input[i + 3]]); - if (output) - { - output[j] = b3; - } - j++; - } - i += 4; - } - } - sz = j; -} - - -size_t Base64::decode_length(const std::string& str64) -{ - if (!str64.size() || str64.size() % 4) - return 0; - size_t l = 3 * (str64.size() / 4 - 1) + 1; - if (str64[str64.size() - 2] != '=') - l++; - if (str64[str64.size() - 1] != '=') - l++; - return l; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.h deleted file mode 100755 index b1711f252e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Base64.h +++ /dev/null @@ -1,85 +0,0 @@ -/** \file Base64.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Base64_H -#define _SOCKETS_Base64_H - -#include "sockets-config.h" -#ifdef _MSC_VER -#pragma warning(disable:4514) -#endif - -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IFile; - -/** \defgroup util Utilities */ - -/** Base64 encode/decode. - \ingroup util */ -class Base64 -{ -public: - Base64(); - - void encode(FILE *, std::string& , bool add_crlf = true); - void encode(IFile *, std::string& , bool add_crlf = true); - void encode(const std::string&, std::string& , bool add_crlf = true); - void encode(const char *, size_t, std::string& , bool add_crlf = true); - void encode(const unsigned char *, size_t, std::string& , bool add_crlf = true); - - void decode(const std::string&, std::string& ); - void decode(const std::string&, unsigned char *, size_t&); - - size_t decode_length(const std::string& ); - -private: - Base64(const Base64& ) {} - Base64& operator=(const Base64& ) { - return *this; - } - static const char *bstr; - static const char rstr[128]; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Base64_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Changelog b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Changelog deleted file mode 100755 index 044be458ec..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Changelog +++ /dev/null @@ -1,855 +0,0 @@ -diff for next release always available @ http://www.alhem.net/Sockets/latest_diff.html - -next --------- - - -2.3.9.4 --------- -File can be created using an existing FILE *. Fix bug in File using wrong -file ptr when writing. -Added HttpdForm constructor (FILE *) that detects cgi input using -environment variables. -Added HttpRequest constructor (FILE *) that can parse a cgi request. -Added missing sockets namespace in SocketThread class files. -Added new operator <<(int64_t) in StreamWriter. Might be ambigouos on some -architectures. -Fix expression evaluation in TcpSocket, causing access to null pointer. -Fix disable of both reconnect and detach functions. -Added Utility::bigint2string(int64_t). -Added Json support. - -2.3.9.3 --------- -Added multithread support in sockethandler. New method SetNumberOfThreads() -enables this. -New method in sockethandler: Release(). Make select() release before -specified timeout. Enable function with method EnableRelease(). -EventHandler using new release functionality. -Thread startup controlled with semaphore instead of flag/sleep combo. -Default thread startup behaviour is run at once, optional is wait until -released by posting to semaphore (via method SetRelease(true)). -Adding a socket with closeanddelete flag set now works as expected. -Added platform independent method Utility::Sleep( milliseconds ). -Added missing win32 implementation in new sockethandler. -Added win32 implementation of Semaphore. -Repaired build for cygwin/mingw/devcpp. - -2.3.9.2 --------- -More internal restructuring of SocketHandler. -The Get() method has been removed. Set() has been split into three: -ISocketHandler_Add(), ISocketHandler_Mod(), and ISocketHandler_Del(). -New methods defined in ISocketHandler interface to support different -models of socket io: ISocketHandler_Select(), MaxCount(). -Removed Set() method from Socket class. -Implemented SocketHandlerEp using epoll for linux only. -reinterpret_cast<> added in ListenSocket for ipv6 address struct. -HttpPostSocket member variable holding http headers (m_fields) is now -protected (changed from private). -Repaired Reconnect function in sockethandler. - -2.3.9.1 --------- -Using thread- and memory safe clib/c runtime function when possible. -Restructured sockethandler internals. -Quicker tcp shutdown sequence when sockets lib initiates close. -Renamed Utility::GetCurrentDirectory to Utility::CurrentDirectory, and -added Utility::GetEnv(). -Removed unused triggers code. - -2.3.9 ------- -TcpSocket using std::vector to receive incoming line (OnLine -callback). Configurable max limit for library available in sockets-config.h, -default 8192 bytes (TCP_LINE_SIZE). Override ISocketHandler::MaxTcpLineSize -to change this value without recompiling the library. -Added more operators in Debug class. Removed some leftover debug printouts. -HttpResponse returns non-const output file. -HTTPSocket aborts after receiving more than 200 (MAX_HTTP_HEADER_COUNT) http -headers. Use method HTTPSocket::SetMaxHeaderCount() to modify this value. -Reordered log level enum, added minlevel to StdoutLog. - -2.3.8 ------- -SSL sockets now operate in nonblocking mode. A much better solution to the -"hang" problem mentioned in 2.3.7. -Added Path() method to IFile interface. Returns File path name or MemFile -virtual path name. -Added constructor in MemFile that takes a File as input. Will read the -entire File to memory. Added constructor in MemFile that copies another -memfile. Will use the source memfile when reading. -Added reference count when a MemFile object is source for another memfile. - -Set OnTransferLimit back to 0 after a successful transfer of requested file -(in Ajp13Socket and HttpBaseSocket). Reset IFile auto_ptr to -decrease the reference count asap (by using fclose). - -2.3.7 ------- -Moved some #include's outside the sockets namespace definition. -Fix code to avoid an increment on an stl iterator that has reached end. -Helping compilers deal with it++ when result is not used, changed all it++ -to ++it where appropriate. -Doing an extra select on write readiness on file descriptor before calling -SSL_write. Prevents a hang situation when the remote end drops the -connection. - -2.3.6 ------- -Added improved Valid() method using unique socket instance identifier. Using -this identifier internally for events and resolver. Added optional data -parameter in Event class, used by library to store socket instance -identifier. -No longer using SSL_MODE_AUTO_RETRY for ssl connections. If remote end -disconnects this would cause hangups. -Using SSL_MODE_ENABLE_PARTIAL_WRITE because the library supports this. -Renamed EventHandler() method in IEventOwner to GetEventHandler(). -Added file system path abstraction methods to Utility. -Reset file descriptor after successful close of a ListenSocket. - -2.3.5 ------- -Added method(s) in UdpSocket to set default interface to be used for multicast. -Added flag for position independent code for linux-x86-32 architecture (see -Makefile.Defines.linux-x86-32). -Added missing includes (on some distributions/gcc versions). -SetUri in HttpRequest no longer URLDecodes the entire url. -Fix for static variables in SSLInitializer. -Fix for new version of openssl (const SSLxx_method()). -Fix for getnameinfo. -Modified Utility::Uri parser class so it also splits the url in path / -querystring parts. - -2.3.4 ------- -Some .cpp were missing namespace declarations - fixed. Some includes for -ipv6 was missing - fixed. Operators in StreamWriter class modified to work -on 64-bit as well as 32-bit systems. - -2.3.3 ------- -Fix deadlock in SSLInitializer introduced in 2.3.2. -Added check when select() returns -1 indicating one of the file descriptors -have gone bad. The check rebuilds the fd_set used by select(). -Bugfix in HttpGetSocket, one of the constructors had no support in -HttpClientSocket - added. -Corrected bad #include's in Utility. -Added IStream interface to read/write from socket and IFile (memfile, normal -file). New classes SocketStream, FileStream, StreamWriter. -Added ReadInput method in TcpSocket - read from input buffer. -Added GetLine method in TcpSocket - chars input on current line when using -SetLineProtocol mode. - -2.3.2 ------- -Threadsafe list of ssl initializer, ssl contexts and openssl error text -retrieval. -Added interface for Mutex class, adding the possibility for others to -implement the mutex functionality using other approaches. -Moved FromUtf8 method from XmlNode to Utility. - -2.3.1 ------- -Request: Remove() method in SocketHandler changed from private to protected. -Added Utility::Stack that returns a stack walk (currently linux only). -Request: Added $(DESTDIR) variable in Makefile for more flexible installation. -The timeout value is now reset before OnTimeout() is called, making it -possible to set a new timeout value in the OnTimeout() method. - -2.3 ------- -Small change in ListenSocket<> to improve accepting of incoming -connections. -Added xml parsing classes: XmlDocument, XmlNode, and XmlException. -Added new OnDisconnect(flags, code) callback that provides reason -for the disconnect. -Fix crash bug if an event object gets deleted in its own OnEvent -method. -gcc 4.3 compability fixes. - -2.2.9a ------- -Added assignment operator on HttpRequest class. -HttpdForm sometimes got stuck in an infinite loop - fixed. -Lock using const Mutex, and Mutex modified to work when const. -Added Utility::Uri that can be used for parsing of an url. - -2.2.9 ------ -Fixed memory leak in TcpSocket. -Fixed potentially unsafe code in http form data parser (HttpdForm). -Fix memory and resource leak in HttpRequest. -Ajp13Socket/HttpBaseSocket now creates a copy of the HttpResponse -instance when sending a response, to avoid synchronization problems. -Added "lost" flag which is set when a tcpsocket has lost connection -unexpectedly (on read/write error). Earlier this function was only -present when the connection pool was enabled (ENABLE_POOL). -Removed unnecessary call to shutdown() when destroying a closed -tcp socket. -Added brief 'INSTALL' document. - -2.2.8 ------ -Added http client ability to receive a chunked response. -HTTP headers are now treated in a case insensitive manner. -MacOS leopard fixes. -Added callback "OnDataComplete" to HTTPSocket, which is called -when the full body of the request/response has been received. -New random generator (mersienne twister). - -2.2.7 ------ -Http header names no longer converted to lowercase. -"setsockopt()" wrapper methods returning int values has been fixed. -No longer sets query_string attribute of HttpRequest when there is no -query string present. - -2.2.6 ------ -Modified HttpRequest class to easier add support for pipelining. -Made the following classes work with the copy constructor: HttpRequest, -HttpTransaction, HttpdCookies. -Always adding http header names as lowercase in internal storage -(HTTPSocket). Added method to check if http header is set. -Changed IHttpServer interface to better separate request and response. -Added -mno-cygwin flag in Makefile defines for cygwin. -Added calls to OnDisconnect when socket operation caused socket to close. - -2.2.5 ------ -A basic_string exception thrown while trying to access the first -(non-existing) element in a zero-sized string was fixed in HTTPSocket. -Added separate http_version for HttpResponse. Improved reset of state -information in HTTPSocket and derivates (for keep-alive connections). -MemFile support reads and writes larger than internal blocksize. - -2.2.4 ------ -IFile (File/MemFile) added reset_read and reset_write. -Bugfix MemFile read. -UdpSocket timestamp small fix for win32. -Cookies reworked in Http framework (Transaction/Request/Response -and HttpBaseSocket/Ajp13Socket). -Compile issue when compiling without openssl solved. - -2.2.3 ------ -SSL Handshake was never initiated when using both client and server from the -library - fixed. -UdpSocket read timestamp added (SetTimestamp) as new OnRawData method. Use -when timestamps enabled with call to SetSoTimestamp. Not win32. -MacOSX project added. Big Thanks to Bruce for both of these. - -2.2.2 ------ -Close file descriptor in File destructor. -HttpClientSocket new access method Filename. -Added a few access methods to HttpdSocket. -Check if gethostbyname_r failed. -Async resolver fix. -Fix win32 build problem (uint64_t). - -2.2.1 ------ -Adding (optional) exceptions when Bind() or CreateSocket() fails. -Enable with ENABLE_EXCEPTIONS. -Added GetSock* methods in Socket, to retreive information about local -port and address in a connection. -Added InitializeContext in TcpSocket with separate certificate / key files. -Moved some #include's from .h to .cpp files. -Removed multiple calls to recvfrom() in UdpSocket OnRead. -HTTPSocket corrected. - -2.2 ------ -TcpSocket output buffer error fixed. -HTTPSocket HTTP/1.0 request (or HTTP/1.1 with connection: close) fixed. -IEventHandler now won't crash if the IEventOwner is deleted in OnEvent. -Added Ajp13Socket that understands the ajp/1.3 protocol. Each request received -by the class results in an "OnExec(HttpRequest, HttpResponse)" call. -Added "HttpBaseSocket" that also use the "OnExec" method to process a -http/https request. - -2.1.9 ------ -Added exception class. -Changed platform selection in Unix Makefile. -Cleaner compile on mingw. -HTTPSocket supports keepalive. -OnDisconnect moved out of ENABLE_RECONNECT scope. - -2.1.8 ------ -Added missing (optional) namespace in SmtpdSocket. -TcpSocket: Calling OnDisconnect when reading 0 bytes. -TcpSocket: Added OnTransferLimit() callback, called when output buffer -size drops below limit set by SetTransferLimit(). -Boundary bug (writes over two blocks failed) in MemFile fixed. -Member variables in SSLInitializer no longer static since SSLInitializer -in itself is static in TcpSocket (avoid potential problem with -initialization order of static's). - -2.1.7 ------ -Fatal bug in LineProtocol/Online found, when a crlf happens over a read -buffer boundary. FIXED. -New output buffer logic. OnWriteComplete callback added, which fires after -the output buffer has been transferred. - -2.1.6 ------ -No more random number generator in Socket. Random number generator used in -Utility changed to static. -ISocketHandler is now a pure virtual definition of the SocketHandler. -Added general purpose timeout to Socket class (SetTimeout, OnTimeout), and -used it to implement the connection timeout logic in TcpSocket/SctpSocket. -Also added OnConnectTimeout which is called instead of OnTimeout, if the -socket is in Connecting mode. -New StreamSocket class defines variables used for sock_stream stuff (such -as connecting, the line protocol). - -2.1.5 ------ -Changed socket and ip option calls to directly manipulate the socket. They -should be used in the OnOptions callback, to set up the connection before -it is used. OnOptions is only called on client sockets. It is not called on -incoming connections accepted with accept()). -Removed Set methods from ResolvSocket and replaced them with one -constructor for each of the different resolves it can do. -Added DNS cache in ResolvSocket. -Made CircularBuffer an internal class of TcpSocket. -Moved these classes to a separate download: - ICrypt NullCrypt CTcpSocket MinionSocket MinderSocket MinderHandler Uid -ListenSocket now sets SO_REUSEADDR in its OnOptions method. -Small fixes to SmtpSocket to support the new configuration stuff. -Added socket to socket trigger framework (sockets-config.h: ENABLE_TRIGGERS). -Small bugfix in TcpSocket::Open when trying to connect to an ipv6 host -with numeric ip address. - -2.1.4 ------ -Added traffic monitor function. -EventHandler/IEventOwner bugfix (pure virtual method called on takedown). -Added outstanding events counter to IEventOwner, to avoid calling -ClearEvents in destructor of an IEventOwner with no events to clear. -Modified GetTimeUntilNextEvent to not return a negative time. -Added SmtpdSocket serverside implementation. -Crash bug fix if trying to add a socket that already exists in -sockethandler queue. -Made a few classes internal (PoolSocket, EventSocket, SocketThread). - -2.1.3 ------ -Added optional Ipv6 and Detach functionality to sockets-config.h. - (ENABLE_IPV6, ENABLE_DETACH) -Crash bug fix: if socket that asked a resolve question is destroyed -before answer arrives. -HTTPS (openssl) session support on server side. -Safer ssl read/write - tnx Peters! -All debug output now to stderr. -GetClientRemoteAddress and XXX now returns a copy of the address in -question, to avoid NULLing the source address when using std::auto_ptr. -SSL initialization code separated from TcpSocket and put in a new -SSLInitializer class. - -2.1.2 ------ -Fix for broken http framework. -Http and httpd tests added. -Configurable options moved to new 'sockets-config.h' file. -Restored code for dns resolve when getaddrinfo/getnameinfo isn't available. -(See sockets-config.h symbol NO_GETADDRINFO) - -2.1.1 ------ -Semaphore added. -Utility::GetTime() fixed on win32. - -2.1 ---- - * Added Utility::GetTime. - * Created socket handler base class ISocketHandler. It will now be possible - to write really customized sockethandlers. One effect of this is that - the first parameter of the Socket class constructor changes from - SocketHandler& to ISocketHandler& - this will affect all current - software using the library. - * StdLog constructor first parameter changed from SocketHandler* - to ISocketHandler* - * Modified list handling in Socket/SocketHandler. - * Added possibility to clear tcp socket byte counters by passing - 'true' as input parameter to GetBytesReceived() and GetBytesSent(). - * Improved CircularBuffer performance when used as output buffer by - TcpSocket. - * Removed unused and confusing method ISocketHandler::GetSocket. - * SocketAddress will replace direct use of ipv4/ipv6 addresses in the code. - * Removed virtual supporting method Socket::ReadLine. If anyone was using - that method, it used to be called directly after the OnRead callback, - if SetLineProtocol was enabled. Repairing the functionality means - adding a call of your own in the OnRead callback. - * Optimized code for OnLine and HTTP header parsing. - * Found and fixed a timing bug in thread code that could cause - a segmentation fault. - * 'echoserver.cpp' and 'stressclient.cpp' added, for test. Supports - normal echo operation, http "echo" server and ssl server/client. - -2.0.9 ------ -Added a way to disable input buffering on tcp sockets. -The method TcpSocket::DisableInputBuffer() will prevent all writing -to the input buffer. After that, the only way to receive data is to -implement an OnRawData method. TcpSocket derived classes that -already only use OnRawData as a means of receiving data should -call DisableInputBuffer() to improve performance (and turn off those -annoying warning messages). -OnOptions will now be called by UdpSocket. OnOptions is now a pure -virtual method in the Socket class. Moved default implementation of -OnOptions from Socket to TcpSocket. Added empty implementations of -OnOptions in ListenSocket<>, UdpSocket and PoolSocket. -Made Sockets-config compile on mingw systems. - -2.0.8 ------ -gethostbyname_r only used if the symbol LINUX is defined. -Sctp protocol by default disabled. Enable by defining USE_SCTP. -Fixed warnings about GetSocket/handler in connect and disconnect -situations. - -2.0.7 ------ -Added Resolve(ipaddr_t) and Resolve(const std::string&) in Socket class -for reverse lookup. Added OnResolveFailed() callback to Socket when a -Resolve call failed. -Moved definition of SOCKETS_DYNAMIC_TEMP to socket_include.h to avoid -breaking windows application not using Sockets-config to retrieve -compile time flags. -Added "fd XX" to StdoutLog debug printout whenever a socket instance -generates an event, where XX is the file descriptor of the socket or --1 if the file descriptor isn't valid. -Reset connected flag when read returns 0 - avoids using shutdown on -Close() and the following warning. -SCTP support added - see SctpSocket class. - -2.0.6 ------ -"gethostbyname()" calls are replaced with "gethostbyname_r()", to ensure -threadsafe operation. -If the flag SOCKETS_DYNAMIC_TEMP is defined at compile time of the library, -all application using the library must also define the same flag. In unix/ -linux Makefiles this is easiest done by adding `Sockets-config` to the -CPPFLAGS variable. -Optimized SocketHandler by removing the SocketHandler::GetSocket method -and adding better code in each place where it was used - Thanks Samuel. -CircularBuffer now has a ReadString method. -Added method to remove a specific event to the EventHandler class. -Added methods to the IEventOwner interface to remove all events or -one specific events. - Thanks Thomas - -2.0.5 ------ -Added missing call to OnRawData when using ssl. -Bugfix in HttpPostSocket, where the boundary variable was never set. -Reset connecting flag in TcpSocket when a connection attempt fails. -Define SOCKETS_DYNAMIC_TEMP to use dynamically allocated temporary -buffers in read operations - helps on ECOS. -Compile with -O0 if you are using gcc 2.9.x. - -2.0.4 ------ -Improved Http client classes, now they're all able to receive a response. -Use methods SetFilename() / SetDataPtr() to write response to a file -or to memory respectively. -Small fix for uuid.h include for mac os x. -Removed debug printout in SSLInitializer. - -2.0.3 ------ -Url parsing modified for Http Get/Put/Post classes to enable ssl if the -url protocol is https. -TcpSocket/SSL random file modified, see tutorial page at -http://www.alhem.net/Sockets/tutorial/using6d.html -Removed a lot of old debug printouts. - -2.0.2b ------- -Replaced direct read access to sockets map with a method looping through -the map, to avoid adding null pointers to non-existing file descriptors. - -2.0.2a ------- -The new add control logic broke tcp reconnect, so this is a fix for that. - -2.0.2 ------ -Fixed infinite loop that could lock the main process when a socket attempts -to connect, gets data to send, and then the connection fails. -Added control so the same file descriptor can't be added to the socket -handler twice. -Utility::rfc1738_encode buffer overflow (read only) fixed. -Moved local hostname resolution stuff from SocketHandler to Utility -- see http://www.alhem.net/Sockets/tutorial/using6c.html -Project files for visual studio 6 slightly modified (missing dependency, -FD_SETSIZE define removed). - -2.0.1 ------ -Moved Errno declaration outside sockets namespace when compiling for unix. -This was already done for the win32 implementation. -Made typedef for socket_m in SocketHandler protected, since its use are -already protected. -Fixed problem with reconnect. - -2.0 ---- -Optimizing SocketHandler. -Fixed SSL socket reconnect. -HttpGetSocket url parsing fixed. Really. -Increased char buffer size in HttpdSocket for large query_string's. -Added timer events, implemented in EventHandler. -Using _beginthreadex()/_endthreadex() to create/end thread in _win32. -Using GetTempPathA() explicitly when getting _win32 temporary path. - * Removed (almost) all sprintf's. -Visual studio .net project now build multithreaded library. -Removed redundant classes SSLSocket, HttpsGetSocket, and HttpsSocket -(all SSL functionality now in TcpSocket). -Using dummy ssl types in TcpSocket if HAVE_OPENSSL is not defined. -Moved a few typedef's outside the optional sockets namespace in the file -socket_include.h. -Fixed Thread/SocketThread to avoid using method on deleted pointer. -Added CXX in Makefile. -Bugfix in SocketThread so the correct sockethandler will be used by the -detached socket object. -Added full mutex threadsafe operations. The old _THREADSAFE_SOCKETS -Makefile option is no longer in use. -Improved graceful shutdown of tcp connections when possible. -Moved address resolution methods from class Socket to Utility. The methods -are isip, u2ip, l2ip. -Added fix for unassigned names in httpdform parser. - -1.9.9 ------ -Trying to remove all dynamic_cast's. They are used in ListenSocket to -check that the Create method returns correct type, and in the socket -handler to give extra functionality to tcp sockets. -New callback OnDisconnect is called only when a connected tcp socket -is set for reconnect, and has lost connection. -Memory leak in TcpSocket output buffering fixed. -HttpGetSocket.url_this fixed. -Replaced HttpGetSocket.m_content string with an allocated byte buffer. -Fix bug in Utility::rfc1738_decode. -SocketHandler.Select can be called without parameters, which means it -will not return until an event has been received by a socket. -Automatic purging of tcp sockets that hang around too long with data -still left to send. -Added virtual destructor for ICrypt pure virtual. - -1.9.8 ------ -Nasty bug fixed on macosx that caused OnConnect to be called even if -the connection failed. -SSL client functionality restored. Cached data was not sent on connect -because the connected flag was not set. -Two new callbacks added for TcpSocket, to indicate that ssl negotiation -failed: OnSSLConnectFailed and OnSSLAcceptFailed. -HttpGetSocket: getting a https: address enables ssl.... -Added fatal error if trying to use a ssl server without implementing -the initialization method (InitSSLServer). - -1.9.7 ------ -SocketHandler.OkToAccept now takes a socket class pointer as input -parameter, which can be used to identify which ListenSocket is -calling OkToAccept. -Treating socket exception as connection failed on win32 -(if trying to connect). -Reset "flush before close" flag on write/read error. -Moved sockethandler Add logic once again, this time outside loop -checking for fd_set events.. -Check if fd_set is getting full (trying to add more than FD_SETSIZE -sockets to the socket handler). Incoming connections are immediately -disconnected if the fd_set is full. TcpSocket::Open calls will -fail instantly if there is no more space in the fd_set. -Remember that FD_SETSIZE can be defined in socket_handler.h if there -is a need for larger fd_set's. The default on win32 is 64 slots which -is a bit thin. Linux and probably most unixes has 1024 slots... -On MacOsX the macro FD_COPY is used to copy the fd_set's before select(). -More debug logging on exactly how a connection was established. - -1.9.6 ------ -Bugfix protecting the sockethandler from using deleted sockets. -(Socket class destructor calls SocketHandler.Remove in case the socket -is deleted before it is removed from the sockethandler). -Removed a lot of warnings for visual studio .net / 2005 beta. -Fix for bsd sockets sigpipe disable, using SO_NOSIGPIPE. -Solaris use putenv in HttpdSocket. -Added flag flush before close, telling a (tcp) socket to send all data -before closing even while the SetCloseAndDelete flag is set. -Default value: flush before close = true. - -1.9.5 ------ -Visual studio 6 and .net project files updated. -DevCpp project files updated. -Using openssl win32 installer from www.slproweb.com, -with installation location c:\OpenSSL. -Merged Sockets and SocketsEx projects in all windows projects. -Added winsock error texts. - -ListenSocket.Bind slightly modified - if port 0 random assigned is -needed, 0 has to be specified in the Bind call (before this release -a Bind call with no parameters had the same effect). -Ipv6 support has been improved, with many of the ipv4/ipv6 methods -overall merged into one. Ipv6 support for reconnect and connection retry. -The connection pool now also support ipv6 connections. -Added SocketHandler.ResolverReady that indicates the resolverthread -is ready for queries. -UdpSocket constructor modified to also include an ipv6 boolean -parameter, because the socket file descriptor is created in the -constructor. -Change: UdpSocket.Bind returns 0 on success, -1 on failure, just like -ListenSocket<>.Bind. -Connection pool disabled by default. Use SocketHandler.EnablePool to -turn it back on. -HttpDebugSocket: Added first line of request (method url httpversion) to -page echoing the request. -TcpSocket ssl private key callback function no longer uses a static -member variable to store the password. This enables the use of any number -of private key files, each with a different password. - -1.9.4 ------ -Changed udp sockets to nonblocking. - -1.9.3 ------ -New define while compiling: _THREADSAFE_SOCKETS -This "thread safe" compile mode only protects OnWrite / SendBuf in -TcpSocket, but will probably include more sections of the code later on. -Mutex and Lock classes added. -HttpdCookies now excludes domain from the Set-Cookie http header -(if COOKIE_DOMAIN is defined as a blank string ""). -Incoming connections should now respond quicker even when using a long -Select() timeout. -Documentation: All classes and Socket class members at least briefly described. -Tcp and Udp socket now shares a common virtual description of the Send -and SendBuf methods. -Fixed bug that caused too long connection timeouts. -UDP sockets reads up to 10 messages in one read event. - -1.9.2 ------ -Support for HttpdSocket http/1.1 keep-alive operation added. -Fiddling with the connection / reconnect code. Not perfect by a long shot. -If a connection timeout is set, and the socket is supposed to reconnect, -the socket will wait the defined connection timeout until a connection -retry is made even if the connection fails immediately. -OnConnectFailed() will only be called after all connection retries has -been attempted. -OnConnectRetry() will be called before each connection retry. Return -false from this callback method to abort connection retries and kill the -socket permanently. -Data sent before / between connection is preserved, whatever that's worth. -Added optional namespace for the entire library. - -1.9.1 ------ -Added SetConnected() in ListenSocket.h for TcpSocket's on accept. -If not, all incoming tcp connections refused to send their data. - -1.9 ---- -Added reconnect and connection retry for TcpSocket's. -New callbacks: -OnConnectRetry() can return false to abort connection retries. -OnReconnect() when a connection has resumed. - -1.8.7 ------ -Added methods GetSsl() and GetSslContext() to access openssl structures -SSL resp. SSL_CTX in TcpSocket and SSLSocket. -HttpGetSocket no longer reports an error when initialized with an empty -filename. -SocketHandler::GetCount now returns actual number of active socket plus -number of sockets to be added to active sockets list. - -1.8.6 ------ -Socket::DisableRead - use this when creating a socket only for output -(the file descriptor will not be added to the read fd_set on select). -Added check to make sure no more than FD_SETSIZE sockets are added to -the socket handler. - -1.8.5 ------ -ReadLine fixed. - -1.8.4 ------ -Fixed a buffer problem that lost a byte for each read when doing large -http transfers (HTTPSocket, HttpsSocket, TcpSocket). -Added classes mentioned in v1.8.3... -Thread class implemented for win32 (not tested) - -1.8.3 ------ -(OnWriteComplete - pending) -(IFile - File - MemFile) -(HttpdSocket - HttpdForm - HttpdCookies) -Incoming sockets are no longer blocking -OnWrite no longer disconnect on EAGAIN error code -SSLSocket has been integrated with TcpSocket (still experimental) - -1.8.2 ------ -Removed warning about read after shutdown. -Socket does not try to do shutdown/close if the file descriptor is invalid. - -1.8 ---- -ListenSocketBase functionality moved to ListenSocket template class. -The important addition is the Create() method in Socket - use that to -create a socket instance with an alternative constructor if needed. -TcpSocket::Open bugfix - sometimes returned false (connection failed) -although the connection was perfectly fine. -Socks4 client functionality added for outgoing connections. See new -SetSocks4Host, SetSocks4Port, SetSocks4Userid and SetSocks4TryDirect -methods in SocketHandler. -HttpGetSocket stores retrieved document in a private string member -variable, reducing the need for disk access. -Asynchronous DNS functionality added. Use the new SocketHandler method -EnableResolver() to enable this for resolving of all outgoing connections. - -1.7.6 ------ -Small changes in UdpSocket -New class ListenSocketBase as an alternative to ListenSocket<> template -class -New callback in Socket: Create - used by ListenSocketBase - -1.7.5 ------ -New callback on socket class: OnOptions, called when a new socket has -been created, to set options like SetReuse and SetKeepalive. -New get methods on MinionSocket. -Socket::Close now does a recv() after shutdown(). -New logging level: Info - -1.7.2 ------ -HttpsGetSocket::url_this default port changed to 443 (was 80). -TcpSocket buffer sizes adjusted. -Switch off LineProtocol when reading the http body in HTTPSocket and -HttpsSocket. - - -1.7 ---- -HttpPostSocket added functionality, able to switch between url-encoded -form-data or multipart/form-data. -Connection pooling on TcpSocket's; When SetRetain() is called on a client -socket (that use Open / OnConnect), that sockets connection will be left -open and reused by the next TcpSocket the tries to open a new connection to -the same host / port. -This construction gives HTTPSocket HTTP/1.1 support for keep-alive -connections. -Pooled connections are stored as PoolSocket objects in the SocketHandler -socket list, and supervised like any other socket - if a pooled connection -is closed by the remote end, it's removed by the SocketHandler. - - -1.6.4 ------ -Socket::SetParent / ::GetParent added, as a way to find out which -ListenSocket created the Socket. GetParent returns the pointer to the -ListenSocket object, or NULL if the Socket was created by the -programmer. -Win32: WSA startup code is wrapped in a class, which is created as a -static instance in Socket. This should automatically initialize -winsock when the first Socket is created. - - -1.6.3 ------ -"errno" and "strerror" has been replaced by Errno and StrError, -and is defined for each operating system environment. -New classes for HTTP: HttpPutSocket, HttpPostSocket, HttpDebugSocket. - -1.6.2 ------ -Bugfix in ListenSocket, when opening a random port GetPort() returned -wrong port number - this is now fixed. -Defining methods depending on ipv4 or ipv6 was removed, and all ipv4 methods -renamed to their original names - without the '4'. - - -1.6.1 ------ -Dummy copy constructor / assignment operator added to classes that can't be -copied by default. -Minor improvements to HTTPSocket. -Removed typedef string_v - collision with other projects that use same name -for std::vector instead of internal use std::list - - -1.6 ---- -Improvements on win32 compile and linking. Remember to turn on rtti -information (/GR in visual studio), because I tend to use dynamic_cast a lot. - -It is now possible to exclude openssl specific code, by not having -HAVE_OPENSSL defined at compile time. -Define HAVE_OPENSSL in Makefile or project file if openssl is installed -on your machine. - -Bugfix in CircularBuffer. It finally works. - -Renamed CircularBuffer method GetCount to "ByteCounter" - the method returns -the total number of bytes to have ever gone through the buffer. - -Improved logging, and cleaned up old debug printouts. - -Fixed a number of memory leaks that would occur in an application that -creates and recreates a lot of SocketHandler's, and also in the threading -part of the library. - -Some optimizations for speed. - - -1.5.4 ------ -UdpSocket: Broadcast flag, Multicast stuff - - -1.5.3 ------ -SocketHandler no longer resolves local hostname on startup. -On hosts with unresolvable hostname this would cause a delay on startup. - -Changed unix socket i/o from read/write to recv/send with MSG_NOSIGNAL -flag, to avoid sigpipe - - see readsocket/writesocket macros in socket_include.h. - - -1.5 ---- - -New callback: OnConnectFailed - -new / modified methods to support ipv6: - Socket::CreateSocket6 - Socket::u2ip - Socket::l2ip - Socket::GetRemoteIP6 - Socket::IsIpv6 - - - -04-04-12 --------- -void TcpSocket::OnRawData(const char *,size_t) -called when new data is read - -bool SocketHandler::OkToAccept() -called by ListenSocket - default implementation returns true - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.cpp deleted file mode 100755 index 4d456fd902..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include "Debug.h" -#include -#include - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -std::map Debug::m_level; -const char *Debug::colors[] = { - "\x1B[0;0m", // &n */ - "\x1B[0;0m\x1B[31m", // &r */ - "\x1B[0;0m\x1B[32m", // &g */ - "\x1B[0;0m\x1B[33m", // &y */ - "\x1B[0;0m\x1B[34m", // &b */ - "\x1B[0;0m\x1B[35m", // &m */ - "\x1B[0;0m\x1B[36m", // &c */ - "\x1B[0;0m\x1B[37m", // &w */ - "\x1B[1;31m", // &R */ - "\x1B[1;32m", // &G */ - "\x1B[1;33m", // &Y */ - "\x1B[1;34m", // &B */ - "\x1B[1;35m", // &M */ - "\x1B[1;36m", // &C */ - "\x1B[1;37m" }; // &W */ - - -void Debug::Print(const char *format, ...) -{ - char slask[5000]; // temporary for vsprintf / vsnprintf - va_list ap; - - va_start(ap, format); - vsnprintf(slask, sizeof(slask), format, ap); - va_end(ap); - - fprintf(stderr, "%s", colors[Utility::ThreadID() % 14 + 1]); - for (int i = 0; i < m_level[Utility::ThreadID()]; i++) - fprintf(stderr, " "); - if (slask[strlen(slask) - 1] == '\n') - slask[strlen(slask) - 1] = 0; - fprintf(stderr, "%s%s\n", slask, colors[0]); -} - - -Debug& Debug::operator<<(const char * str) -{ - m_line += str; - return *this; -} - - -Debug& Debug::operator<<(const std::string& str) -{ - m_line += str; - return *this; -} - - -Debug& Debug::operator<<(short l) -{ - m_line += Utility::l2string(l); - return *this; -} - - -Debug& Debug::operator<<(int l) -{ - m_line += Utility::l2string(l); - return *this; -} - - -Debug& Debug::operator<<(long l) -{ - m_line += Utility::l2string(l); - return *this; -} - - -Debug& Debug::operator<<(double d) -{ - char slask[100]; - snprintf(slask, sizeof(slask), "%f", d); - m_line += slask; - return *this; -} - - -Debug& Debug::operator<<(endl) -{ - Print("%s", m_line.c_str()); - m_line = ""; - return *this; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.h deleted file mode 100755 index e8f20be8df..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Debug.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef _SOCKETS_Debug_H -#define _SOCKETS_Debug_H - -#include "sockets-config.h" -#include "Utility.h" -#include - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class Debug -{ - static const char *colors[]; -public: - class endl - { - public: - endl() {} - virtual ~endl() {} - }; - -public: - Debug() {} - Debug(const std::string& x) : m_id(0), m_text(x) { - fprintf(stderr, "%s", colors[Utility::ThreadID() % 14 + 1]); - - for (int i = 0; i < m_level[Utility::ThreadID()]; i++) - fprintf(stderr, " "); - - fprintf(stderr, "%s%s\n", x.c_str(), colors[0]); - m_level[Utility::ThreadID()]++; - } - Debug(int id, const std::string& x) : m_id(id), m_text(x) { - fprintf(stderr, "%s", colors[Utility::ThreadID() % 14 + 1]); - - for (int i = 0; i < m_level[Utility::ThreadID()]; i++) - fprintf(stderr, " "); - - fprintf(stderr, "%d> %s%s\n", m_id, x.c_str(), colors[0]); - m_level[Utility::ThreadID()]++; - } - ~Debug() { - if (!m_text.empty()) { - if (m_level[Utility::ThreadID()]) - m_level[Utility::ThreadID()]--; - - fprintf(stderr, "%s", colors[Utility::ThreadID() % 14 + 1]); - - for (int i = 0; i < m_level[Utility::ThreadID()]; i++) - fprintf(stderr, " "); - - if (m_id) - fprintf(stderr, "%d> /%s%s\n", m_id, m_text.c_str(), colors[0]); - else - fprintf(stderr, "/%s%s\n", m_text.c_str(), colors[0]); - - fflush(stderr); - } - } - static void Print(const char *format, ...); - - Debug& operator<<(const char *); - Debug& operator<<(const std::string& ); - Debug& operator<<(short); - Debug& operator<<(int); - Debug& operator<<(long); - Debug& operator<<(double); - Debug& operator<<(endl); - -private: - int m_id; - std::string m_text; - static std::map m_level; - std::string m_line; -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_Debug_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.cpp deleted file mode 100755 index 7398a06475..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/** \file Event.cpp - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "Event.h" -#ifdef _WIN32 -#else -#include -#endif - -//#include "IEventOwner.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// statics -long Event::m_unique_id = 0; - - -Event::Event(IEventOwner *from,long sec,long usec,unsigned long data) : m_from(from), m_data(data), m_time(sec, usec), m_id(++m_unique_id) -{ -} - - -Event::~Event() -{ -} - - -bool Event::operator<(Event& e) -{ - return m_time < e.m_time; -} - - -long Event::GetID() const -{ - return m_id; -} - - -const EventTime& Event::GetTime() const -{ - return m_time; -} - - -IEventOwner *Event::GetFrom() const -{ - return m_from; -} - - -unsigned long Event::Data() const -{ - return m_data; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.h deleted file mode 100755 index 62ea1a0478..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Event.h +++ /dev/null @@ -1,83 +0,0 @@ -/** \file Event.h - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Event_H -#define _SOCKETS_Event_H - -#include "sockets-config.h" -#ifdef _WIN32 -#else -#include -#endif -#include "EventTime.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class IEventOwner; - -/** Store information about a timer event. - \ingroup timer */ -class Event -{ -public: - Event(IEventOwner *,long sec,long usec,unsigned long data = 0); - ~Event(); - - bool operator<(Event&); - long GetID() const; - const EventTime& GetTime() const; - IEventOwner *GetFrom() const; - unsigned long Data() const; - -private: - Event(const Event& ) {} // copy constructor - Event& operator=(const Event& ) { - return *this; // assignment operator - } - IEventOwner *m_from; - unsigned long m_data; - EventTime m_time; - static long m_unique_id; - long m_id; -}; - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Event_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.cpp deleted file mode 100755 index b5913424ba..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/** \file EventHandler.cpp - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "EventHandler.h" -#include "IEventOwner.h" -#include "Event.h" -#include "TcpSocket.h" -#include "ListenSocket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -EventHandler::EventHandler(StdLog *p) : SocketHandler(p), m_quit(false) -{ - EnableRelease(); -} - - -EventHandler::EventHandler(IMutex& m,StdLog *p) : SocketHandler(m, p), m_quit(false) -{ - EnableRelease(); -} - - -EventHandler::~EventHandler() -{ - while (m_events.size()) - { - std::list::iterator it = m_events.begin(); - Event *e = *it; - e -> GetFrom() -> SetHandlerInvalid(); - delete e; - m_events.erase(it); - } -} - - -bool EventHandler::GetTimeUntilNextEvent(struct timeval *tv) -{ - if (!m_events.size()) - return false; - std::list::iterator it = m_events.begin(); - if (it != m_events.end()) - { - EventTime now; - mytime_t diff = (*it) -> GetTime() - now; - if (diff < 1) - { - diff = 1; - } - tv -> tv_sec = static_cast(diff / 1000000); - tv -> tv_usec = static_cast(diff % 1000000); - return true; - } - return false; -} - - -void EventHandler::CheckEvents() -{ - EventTime now; - std::list::iterator it = m_events.begin(); - while (it != m_events.end() && (*it) -> GetTime() < now) - { - Event *e = *it; - Socket *s = dynamic_cast(e -> GetFrom()); - /* - s == NULL This is another object implementing 'IEventOwner' and not a socket. - s != NULL This is a Socket implementing IEventOwner, and we can check that the - object instance still is valid using SocketHandler::Valid. - */ - if (!s || (s && Valid( e -> Data() ))) - { - e -> GetFrom() -> OnEvent(e -> GetID()); - } - for (it = m_events.begin(); it != m_events.end(); ++it) - if (*it == e) - { - delete e; - break; - } - if (it != m_events.end()) - m_events.erase(it); - it = m_events.begin(); - } -} - - -long EventHandler::AddEvent(IEventOwner *from,long sec,long usec) -{ - Socket *s = dynamic_cast(from); - Event *e = new Event(from, sec, usec, s ? s -> UniqueIdentifier() : 0); - std::list::iterator it = m_events.begin(); - while (it != m_events.end() && *(*it) < *e) - { - ++it; - } - m_events.insert(it, e); - Release(); - return e -> GetID(); -} - - -void EventHandler::ClearEvents(IEventOwner *from) -{ - bool repeat; - do - { - repeat = false; - for (std::list::iterator it = m_events.begin(); it != m_events.end(); ++it) - { - Event *e = *it; - if (e -> GetFrom() == from) - { - delete e; - m_events.erase(it); - repeat = true; - break; - } - } - } while (repeat); -} - - -void EventHandler::EventLoop() -{ - while (!m_quit) - { - struct timeval tv; - if (GetTimeUntilNextEvent(&tv)) - { - Select(&tv); - CheckEvents(); - } - else - { - Select(); - } - } -} - - -void EventHandler::SetQuit(bool x) -{ - m_quit = x; -} - - -void EventHandler::RemoveEvent(IEventOwner *from, long eid) -{ - for (std::list::iterator it = m_events.begin(); it != m_events.end(); ++it) - { - Event *e = *it; - if (from == e -> GetFrom() && eid == e -> GetID()) - { - delete e; - m_events.erase(it); - break; - } - } -} - - -void EventHandler::Add(Socket *p) -{ - SocketHandler::Add( p ); -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.h deleted file mode 100755 index 1dc0425e0f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventHandler.h +++ /dev/null @@ -1,88 +0,0 @@ -/** \file EventHandler.h - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_EventHandler_H -#define _SOCKETS_EventHandler_H - -#include "sockets-config.h" -#include "SocketHandler.h" -#include "IEventHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class StdLog; -class IEventOwner; -class Event; -class TcpSocket; - -/** SocketHandler implementing the IEventHandler interface. - \ingroup timer */ -class EventHandler : public SocketHandler,public IEventHandler -{ -public: - EventHandler(StdLog * = NULL); - EventHandler(IMutex&,StdLog * = NULL); - ~EventHandler(); - - bool GetTimeUntilNextEvent(struct timeval *tv); - void CheckEvents(); - long AddEvent(IEventOwner *from,long sec,long usec); - void ClearEvents(IEventOwner *from); - void RemoveEvent(IEventOwner *from,long eid); - - /** SocketHandler while() loop implemented with event functionality. */ - void EventLoop(); - /** Stop event loop. */ - void SetQuit(bool = true); - - void Add(Socket *); - -private: - EventHandler(const EventHandler& ) {} // copy constructor - EventHandler& operator=(const EventHandler& ) { - return *this; // assignment operator - } - std::list m_events; - bool m_quit; -}; - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_EventHandler_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.cpp deleted file mode 100755 index ffd607cc25..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/** \file EventTime.cpp - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef MACOSX -#include -#include -#include -#endif -#include "EventTime.h" -#ifdef _WIN32 -#include -#else -#include -#include -#endif - - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -EventTime::EventTime() : m_time(Tick()) -{ -} - - -EventTime::EventTime(mytime_t sec,long usec) : m_time(Tick()) -{ - m_time += sec * 1000000 + usec; -} - - -EventTime::~EventTime() -{ -} - - -mytime_t EventTime::Tick() -{ - mytime_t t; -#ifdef _WIN32 - FILETIME ft; - GetSystemTimeAsFileTime(&ft); - t = ft.dwHighDateTime; - t = t << 32; - t += ft.dwLowDateTime; - t /= 10; // us -#else - struct timeval tv; - struct timezone tz; - gettimeofday(&tv, &tz); - t = tv.tv_sec; - t *= 1000000; - t += tv.tv_usec; -#endif - return t; -} - - -EventTime EventTime::operator - (const EventTime& x) const -{ - EventTime t; - t.m_time = m_time - x.m_time; - return t; -} - - -bool EventTime::operator < (const EventTime& x) const -{ - return m_time < x.m_time; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.h deleted file mode 100755 index 1342622061..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/EventTime.h +++ /dev/null @@ -1,84 +0,0 @@ -/** \file EventTime.h - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_EventTime_H -#define _SOCKETS_EventTime_H - -#include "sockets-config.h" -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -#if defined( _WIN32) && !defined(__CYGWIN__) -typedef __int64 mytime_t; -#else -#include // int64_t -typedef int64_t mytime_t; -#endif - - -/** \defgroup timer EventTimer event handling */ - -/** EventTime primitive, returns current time as a 64-bit number. - \ingroup timer */ -class EventTime -{ -public: - EventTime(); - EventTime(mytime_t sec,long usec); - ~EventTime(); - - static mytime_t Tick(); - - operator mytime_t () { - return m_time; - } - EventTime operator - (const EventTime& x) const; - bool operator < (const EventTime& x) const; - -private: - EventTime(const EventTime& ) {} // copy constructor - EventTime& operator=(const EventTime& ) { - return *this; // assignment operator - } - mytime_t m_time; -}; - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_EventTime_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.cpp deleted file mode 100755 index f3898a0805..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/** - ** \file Exception.cpp - ** \date 2007-09-28 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "Exception.h" -#include "Utility.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - - -Exception::Exception(const std::string& description) : m_description(description) -, m_stack(Utility::Stack()) -{ -} - - -const std::string Exception::ToString() const -{ - return m_description; -} - - -const std::string Exception::Stack() const -{ - return m_stack; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.h deleted file mode 100755 index 52f96e4262..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Exception.h +++ /dev/null @@ -1,74 +0,0 @@ -/** - ** \file Exception.h - ** \date 2007-09-28 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _Sockets_Exception_H -#define _Sockets_Exception_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - - -class Exception -{ -public: - Exception(const std::string& description); - virtual ~Exception() {} - - virtual const std::string ToString() const; - virtual const std::string Stack() const; - - Exception(const Exception& ) {} // copy constructor - - Exception& operator=(const Exception& ) { - return *this; // assignment operator - } - -private: - std::string m_description; - std::string m_stack; - -}; - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _Sockets_Exception_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.cpp deleted file mode 100755 index fd9069ee91..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/** \file File.cpp - ** \date 2005-04-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include -#include -#include - -#include "File.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -File::File() -:m_fil(NULL) -,m_b_close(true) -,m_rptr(0) -,m_wptr(0) -{ -} - - -File::File(FILE *fil) -:m_fil(fil) -,m_b_close(false) -,m_rptr(0) -,m_wptr(0) -{ -} - - -File::File(const std::string& path, const std::string& mode) -:m_fil(NULL) -,m_b_close(true) -,m_rptr(0) -,m_wptr(0) -{ - fopen(path, mode); -} - - -File::~File() -{ - if (m_b_close) - { - fclose(); - } -} - - -bool File::fopen(const std::string& path, const std::string& mode) -{ - m_path = path; - m_mode = mode; -#if defined( _WIN32) && !defined(__CYGWIN__) - if (fopen_s(&m_fil, path.c_str(), mode.c_str())) - m_fil = NULL; -#else - m_fil = ::fopen(path.c_str(), mode.c_str()); -#endif - - return m_fil ? true : false; -} - - -void File::fclose() const -{ - if (m_fil) - { - ::fclose(m_fil); - m_fil = NULL; - } -} - - - -size_t File::fread(char *ptr, size_t size, size_t nmemb) const -{ - size_t r = 0; - if (m_fil) - { - fseek(m_fil, m_rptr, SEEK_SET); - r = ::fread(ptr, size, nmemb, m_fil); - m_rptr = ftell(m_fil); - } - return r; -} - - -size_t File::fwrite(const char *ptr, size_t size, size_t nmemb) -{ - size_t r = 0; - if (m_fil) - { - fseek(m_fil, m_wptr, SEEK_SET); - r = ::fwrite(ptr, size, nmemb, m_fil); - m_wptr = ftell(m_fil); - } - return r; -} - - - -char *File::fgets(char *s, int size) const -{ - char *r = NULL; - if (m_fil) - { - fseek(m_fil, m_rptr, SEEK_SET); - r = ::fgets(s, size, m_fil); - m_rptr = ftell(m_fil); - } - return r; -} - - -void File::fprintf(const char *format, ...) -{ - if (!m_fil) - return; - va_list ap; - va_start(ap, format); - fseek(m_fil, m_wptr, SEEK_SET); - vfprintf(m_fil, format, ap); - m_wptr = ftell(m_fil); - va_end(ap); -} - - -off_t File::size() const -{ - struct stat st; - if (stat(m_path.c_str(), &st) == -1) - { - return 0; - } - return st.st_size; -} - - -bool File::eof() const -{ - if (m_fil) - { - if (feof(m_fil)) - return true; - } - return false; -} - - -void File::reset_read() const -{ - m_rptr = 0; -} - - -void File::reset_write() -{ - m_wptr = 0; -} - - -const std::string& File::Path() const -{ - return m_path; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.h deleted file mode 100755 index 9abc510124..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/File.h +++ /dev/null @@ -1,95 +0,0 @@ -/** \file File.h - ** \date 2005-04-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_File_H -#define _SOCKETS_File_H - -#include "sockets-config.h" -#include "IFile.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** IFile implementation of a disk file. - \ingroup file */ -class File : public IFile -{ -public: - File(); - File(FILE *); - /** convenience: calls fopen() */ - File(const std::string& path, const std::string& mode); - ~File(); - - bool fopen(const std::string& path, const std::string& mode); - void fclose() const; - - size_t fread(char *, size_t, size_t) const; - size_t fwrite(const char *, size_t, size_t); - - char *fgets(char *, int) const; - void fprintf(const char *format, ...); - - off_t size() const; - bool eof() const; - - void reset_read() const; - void reset_write(); - - const std::string& Path() const; - -private: - File(const File& ) {} // copy constructor - File& operator=(const File& ) { - return *this; // assignment operator - } - - std::string m_path; - std::string m_mode; - mutable FILE *m_fil; - bool m_b_close; - mutable long m_rptr; - long m_wptr; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_File_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.cpp deleted file mode 100755 index d61ed983cd..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/** - ** \file FileStream.cpp - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "FileStream.h" -#include "IFile.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -FileStream::FileStream(IFile& file) : m_file(file) -{ -} - - -size_t FileStream::IStreamRead(char *buf, size_t max_sz) -{ - return m_file.fread(buf, 1, max_sz); -} - - -void FileStream::IStreamWrite(const char *buf, size_t sz) -{ - m_file.fwrite(buf, 1, sz); -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.h deleted file mode 100755 index 7e41ee78cb..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/FileStream.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - ** \file FileStream.h - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_FileStream_H -#define _SOCKETS_FileStream_H - -#include "IStream.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IFile; - -class FileStream : public IStream -{ -public: - FileStream(IFile& file); - - size_t IStreamRead(char *buf, size_t max_sz); - - void IStreamWrite(const char *buf, size_t sz); - -private: - IFile& m_file; -}; - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_FileStream_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.cpp deleted file mode 100755 index a316dd17ec..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.cpp +++ /dev/null @@ -1,519 +0,0 @@ -/** \file HTTPSocket.cpp - ** \date 2004-04-06 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HTTPSocket.h" -#include "Parse.h" -#include "ISocketHandler.h" -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -HTTPSocket::HTTPSocket(ISocketHandler& h) -:TcpSocket(h) -,m_first(true) -,m_header(true) -,m_http_version("HTTP/1.0") -,m_request(false) -,m_response(false) -,m_body_size_left(0) -,m_b_http_1_1(false) -,m_b_keepalive(false) -,m_b_chunked(false) -,m_chunk_size(0) -,m_chunk_state(0) -,m_header_count(0) -,m_max_header_count(MAX_HTTP_HEADER_COUNT) -{ - SetLineProtocol(); - DisableInputBuffer(); -} - - -HTTPSocket::~HTTPSocket() -{ -} - - -void HTTPSocket::OnRawData(const char *buf,size_t len) -{ - if (!m_header) - { - if (m_b_chunked) - { - size_t ptr = 0; - while (ptr < len) - { - switch (m_chunk_state) - { - case 4: - while (ptr < len && (m_chunk_line.size() < 2 || m_chunk_line.substr(m_chunk_line.size() - 2) != "\r\n")) - m_chunk_line += buf[ptr++]; - if (m_chunk_line.size() > 1 && m_chunk_line.substr(m_chunk_line.size() - 2) == "\r\n") - { - OnDataComplete(); - // prepare for next request(or response) - m_b_chunked = false; - SetLineProtocol( true ); - m_first = true; - m_header = true; - m_body_size_left = 0; - if (len - ptr > 0) - { - char tmp[TCP_BUFSIZE_READ]; - memcpy(tmp, buf + ptr, len - ptr); - tmp[len - ptr] = 0; - OnRead( tmp, len - ptr ); - ptr = len; - } - } - break; - case 0: - while (ptr < len && (m_chunk_line.size() < 2 || m_chunk_line.substr(m_chunk_line.size() - 2) != "\r\n")) - m_chunk_line += buf[ptr++]; - if (m_chunk_line.size() > 1 && m_chunk_line.substr(m_chunk_line.size() - 2) == "\r\n") - { - m_chunk_line.resize(m_chunk_line.size() - 2); - Parse pa(m_chunk_line, ";"); - std::string size_str = pa.getword(); - m_chunk_size = Utility::hex2unsigned(size_str); - if (!m_chunk_size) - { - m_chunk_state = 4; - m_chunk_line = ""; - } - else - { - m_chunk_state = 1; - m_chunk_line = ""; - } - } - break; - case 1: - { - size_t left = len - ptr; - size_t sz = m_chunk_size < left ? m_chunk_size : left; - OnData(buf + ptr, sz); - m_chunk_size -= sz; - ptr += sz; - if (!m_chunk_size) - { - m_chunk_state = 2; - } - } - break; - case 2: // skip CR - ptr++; - m_chunk_state = 3; - break; - case 3: // skip LF - ptr++; - m_chunk_state = 0; - break; - } - } - } - else - if (!m_b_http_1_1 || !m_b_keepalive) - { - OnData(buf, len); - /* - request is HTTP/1.0 _or_ HTTP/1.1 and not keep-alive - - This means we destroy the connection after the response has been delivered, - hence no need to reset all internal state variables for a new incoming - request. - */ - m_body_size_left -= len; - if (!m_body_size_left) - { - OnDataComplete(); - } - } - else - { - size_t sz = m_body_size_left < len ? m_body_size_left : len; - OnData(buf, sz); - m_body_size_left -= sz; - if (!m_body_size_left) - { - OnDataComplete(); - // prepare for next request(or response) - SetLineProtocol( true ); - m_first = true; - m_header = true; - m_body_size_left = 0; - if (len - sz > 0) - { - char tmp[TCP_BUFSIZE_READ]; - memcpy(tmp, buf + sz, len - sz); - tmp[len - sz] = 0; - OnRead( tmp, len - sz ); - } - } - } - } -} - - -void HTTPSocket::OnLine(const std::string& line) -{ - if (m_first) - { - Parse pa(line); - std::string str = pa.getword(); - if (str.size() > 4 && Utility::ToLower(str.substr(0,5)) == "http/") // response - { - m_http_version = str; - m_status = pa.getword(); - m_status_text = pa.getrest(); - m_response = true; - } - else // request - { - m_method = str; - m_url = pa.getword(); - size_t spl = m_url.find("?"); - if (spl != std::string::npos) - { - m_uri = m_url.substr(0,spl); - m_query_string = m_url.substr(spl + 1); - } - else - { - m_uri = m_url; - m_query_string = ""; - } - m_http_version = pa.getword(); - m_b_http_1_1 = m_http_version.size() > 4 && m_http_version.substr(4) == "/1.1"; - m_b_keepalive = m_b_http_1_1; - m_request = true; - } - m_first = false; - OnFirst(); - return; - } - if (!line.size()) - { - if (m_body_size_left || !m_b_http_1_1 || !m_b_keepalive || m_b_chunked) - { - SetLineProtocol(false); - m_header = false; - } - OnHeaderComplete(); - if (!m_body_size_left && !m_b_chunked) - { - OnDataComplete(); - } - return; - } - Parse pa(line,":"); - std::string key = pa.getword(); - std::string value = pa.getrest(); - OnHeader(key,value); - if (Utility::ToLower(key) == "content-length") - { - m_body_size_left = atol(value.c_str()); - } - if (m_b_http_1_1 && Utility::ToLower(key) == "connection") - { - m_b_keepalive = Utility::ToLower(value) != "close"; - } - if (Utility::ToLower(key) == "transfer-encoding" && Utility::ToLower(value) == "chunked") - { - m_b_chunked = true; - } - /* If remote end tells us to keep connection alive, and we're operating - in http/1.1 mode (not http/1.0 mode), then we mark the socket to be - retained. */ -#ifdef ENABLE_POOL - if (m_b_http_1_1 && m_b_keepalive) - { - SetRetain(); - } -#endif - if (m_header_count++ > m_max_header_count) - { - SetCloseAndDelete(); - Handler().LogError(this, "OnLine", m_header_count, "http header count exceeds builtin limit of (" + Utility::l2string(m_max_header_count) + ")", LOG_LEVEL_FATAL); - } -} - - -void HTTPSocket::SendResponse() -{ - std::string msg; - msg = m_http_version + " " + m_status + " " + m_status_text + "\r\n"; - for (string_m::iterator it = m_response_header.begin(); it != m_response_header.end(); ++it) - { - std::string key = (*it).first; - std::string val = (*it).second; - msg += key + ": " + val + "\r\n"; - } - for (std::list >::iterator it2 = m_response_header_append.begin(); it2 != m_response_header_append.end(); ++it2) - { - msg += it2 -> first + ": " + it2 -> second + "\r\n"; - } - msg += "\r\n"; - Send( msg ); -} - - -void HTTPSocket::AddResponseHeader(const std::string& header, const char *format, ...) -{ - char slask[8192]; // temporary for vsprintf / vsnprintf - va_list ap; - - va_start(ap, format); - vsnprintf(slask, sizeof(slask), format, ap); - va_end(ap); - - m_response_header[header] = slask; -} - - -void HTTPSocket::SendRequest() -{ - std::string msg; - msg = m_method + " " + m_url + " " + m_http_version + "\r\n"; - for (string_m::iterator it = m_response_header.begin(); it != m_response_header.end(); ++it) - { - std::string key = (*it).first; - std::string val = (*it).second; - msg += key + ": " + val + "\r\n"; - } - msg += "\r\n"; - Send( msg ); -} - - -std::string HTTPSocket::MyUseragent() -{ - std::string version = "C++Sockets/"; -#ifdef _VERSION - version += _VERSION; -#endif - return version; -} - - -void HTTPSocket::Reset() -{ - m_first = true; - m_header = true; - m_request = false; - m_response = false; - SetLineProtocol(true); - while (m_response_header.size()) - { - string_m::iterator it = m_response_header.begin(); - m_response_header.erase(it); - } - while (m_response_header_append.size()) - { - std::list >::iterator it = m_response_header_append.begin(); - m_response_header_append.erase(it); - } - m_header_count = 0; - -} - - -const std::string& HTTPSocket::GetMethod() -{ - return m_method; -} - - -void HTTPSocket::SetMethod(const std::string& x) -{ - m_method = x; -} - - -const std::string& HTTPSocket::GetUrl() -{ - return m_url; -} - - -void HTTPSocket::SetUrl(const std::string& x) -{ - m_url = x; -} - - -const std::string& HTTPSocket::GetUri() -{ - return m_uri; -} - - -const std::string& HTTPSocket::GetQueryString() -{ - return m_query_string; -} - - -const std::string& HTTPSocket::GetHttpVersion() -{ - return m_http_version; -} - - -const std::string& HTTPSocket::GetStatus() -{ - return m_status; -} - - -const std::string& HTTPSocket::GetStatusText() -{ - return m_status_text; -} - - -bool HTTPSocket::IsRequest() -{ - return m_request; -} - - -bool HTTPSocket::IsResponse() -{ - return m_response; -} - - -void HTTPSocket::SetHttpVersion(const std::string& x) -{ - m_http_version = x; -} - - -void HTTPSocket::SetStatus(const std::string& x) -{ - m_status = x; -} - - -void HTTPSocket::SetStatusText(const std::string& x) -{ - m_status_text = x; -} - - -void HTTPSocket::AddResponseHeader(const std::string& x,const std::string& y) -{ - m_response_header[x] = y; -} - - -void HTTPSocket::AppendResponseHeader(const std::string& x,const std::string& y) -{ - m_response_header_append.push_back(std::pair(x,y)); -} - - -void HTTPSocket::SetUri(const std::string& x) -{ - m_uri = x; -} - - -void HTTPSocket::url_this(const std::string& url_in,std::string& protocol,std::string& host,port_t& port,std::string& url,std::string& file) -{ - Parse pa(url_in,"/"); - protocol = pa.getword(); // http - if (!strcasecmp(protocol.c_str(), "https:")) - { -#ifdef HAVE_OPENSSL - EnableSSL(); -#else - Handler().LogError(this, "url_this", -1, "SSL not available", LOG_LEVEL_WARNING); -#endif - port = 443; - } - else - { - port = 80; - } - host = pa.getword(); - if (strstr(host.c_str(),":")) - { - Parse pa(host,":"); - pa.getword(host); - port = static_cast(pa.getvalue()); - } - url = "/" + pa.getrest(); - { - Parse pa(url,"/"); - std::string tmp = pa.getword(); - while (tmp.size()) - { - file = tmp; - tmp = pa.getword(); - } - } -} // url_this - - -bool HTTPSocket::ResponseHeaderIsSet(const std::string& name) -{ - string_m::iterator it = m_response_header.find( name ); - if (it != m_response_header.end()) - { - return true; - } - std::list >::iterator it2; - for (it2 = m_response_header_append.begin(); it2 != m_response_header_append.end(); ++it2) - { - std::pair& ref = *it2; - if (!strcasecmp(ref.first.c_str(), name.c_str()) ) - { - return true; - } - } - return false; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.h deleted file mode 100755 index 37715618b5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HTTPSocket.h +++ /dev/null @@ -1,175 +0,0 @@ -/** \file HTTPSocket.h Class HTTPSocket definition. - ** \date 2004-04-06 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_HTTPSocket_H -#define _SOCKETS_HTTPSocket_H - -#include "sockets-config.h" -#include "TcpSocket.h" -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** \defgroup http HTTP Sockets */ -/** HTTP request/response base class. - \ingroup http */ -class HTTPSocket : public TcpSocket -{ - /** map to hold http header values. */ - typedef Utility::ncmap string_m; -public: - HTTPSocket(ISocketHandler& ); - ~HTTPSocket(); - - void OnRawData(const char *buf,size_t len); - void OnLine(const std::string& line); - - /** Callback executes when first line has been received. - GetMethod, GetUrl/GetUri, and GetHttpVersion are valid when this callback is executed. */ - virtual void OnFirst() = 0; - /** For each header line this callback is executed. - \param key Http header name - \param value Http header value */ - virtual void OnHeader(const std::string& key,const std::string& value) = 0; - /** Callback fires when all http headers have been received. */ - virtual void OnHeaderComplete() = 0; - /** Chunk of http body data recevied. */ - virtual void OnData(const char *,size_t) = 0; - /** The full request/response body has been received. */ - virtual void OnDataComplete() {} - - /** Get http method from incoming request, ie GET/POST/PUT etc */ - const std::string& GetMethod(); - /** Set http method to be used in request. */ - void SetMethod(const std::string& x); - /** Get url from request. */ - const std::string& GetUrl(); - /** Set url to be used in outgoing request. */ - void SetUrl(const std::string& x); - /** Get part of url before '?' character. */ - const std::string& GetUri(); - /** Now why would I need this when there is a SetUrl method? */ - void SetUri(const std::string& x); - /** Get part of url after '?' character. */ - const std::string& GetQueryString(); - /** Get http version from incoming request/response. */ - const std::string& GetHttpVersion(); - /** Get http status from incoming response. */ - const std::string& GetStatus(); - /** Get http statustext from incoming response. */ - const std::string& GetStatusText(); - /** Incoming header has been identified as a request (method url http_version\r\n). */ - bool IsRequest(); - /** Incoming header has been identified as a response (http_version status status_text\r\n). */ - bool IsResponse(); - /** Set http version to be used in outgoing request/response. */ - void SetHttpVersion(const std::string& x); - /** Set http status for outgoing response. */ - void SetStatus(const std::string& x); - /** Set http statustext for outgoing response. */ - void SetStatusText(const std::string& x); - /** Add (and replace if exists) http header. */ - void AddResponseHeader(const std::string& x,const std::string& y); - /** Add (and replace if exists) http header. */ - void AddResponseHeader(const std::string& x,const char *format, ...); - /** Add http header. */ - void AppendResponseHeader(const std::string& x,const std::string& y); - /** See if http header 'name' has been set. */ - bool ResponseHeaderIsSet(const std::string& name); - /** Send response prepared with calls to methods SetHttpVersion, SetStatus, SetStatusText, - and AddResponseHeader. */ - void SendResponse(); - /** Send request prepared with calls to methods SetMethod, SetUrl, SetHttpVersion, - and AddResponseHeader. */ - void SendRequest(); - - /** Implement this to return your own User-agent string. */ - virtual std::string MyUseragent(); - - /** Parse url. If protocol is https, EnableSSL() will be called. */ - void url_this(const std::string& url_in,std::string& protocol,std::string& host,port_t& port,std::string& url,std::string& file); - - /** Transfer coding 'chunked' */ - bool IsChunked() { - return m_b_chunked; - } - -protected: - HTTPSocket(const HTTPSocket& s) : TcpSocket(s) {} - /** Reset state of socket to sucessfully implement keep-alive. */ - virtual void Reset(); - - void SetMaxHeaderCount(int x) { - m_max_header_count = x; - } - -private: - HTTPSocket& operator=(const HTTPSocket& ) { - return *this; - } - bool m_first; - bool m_header; - std::string m_line; - std::string m_method; - std::string m_url; - std::string m_uri; - std::string m_query_string; - std::string m_http_version; - std::string m_status; - std::string m_status_text; - bool m_request; - bool m_response; - string_m m_response_header; - size_t m_body_size_left; - bool m_b_http_1_1; - bool m_b_keepalive; - std::list > m_response_header_append; - bool m_b_chunked; - size_t m_chunk_size; - int m_chunk_state; - std::string m_chunk_line; - int m_header_count; - int m_max_header_count; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HTTPSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.cpp deleted file mode 100755 index b4103c6397..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/** - ** \file AjpBaseSocket.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpBaseSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -HttpBaseSocket::HttpBaseSocket(ISocketHandler& h) -:HTTPSocket(h) -,m_b_keepalive(false) -{ -} - - -HttpBaseSocket::~HttpBaseSocket() -{ -} - - -void HttpBaseSocket::OnFirst() -{ -DEB(fprintf(stderr, " %s %s %s\n", GetMethod().c_str(), GetUri().c_str(), GetHttpVersion().c_str());) - m_req.SetHttpMethod( GetMethod() ); - m_req.SetUri( GetUri() ); - m_req.SetHttpVersion( GetHttpVersion() ); - - if (Utility::ToLower(GetMethod()) == "get" && !GetQueryString().empty()) - { - m_req.SetAttribute("query_string", GetQueryString() ); - } - - m_req.SetRemoteAddr( GetRemoteAddress() ); - m_req.SetRemoteHost( "" ); // %! - m_req.SetServerName( GetSockAddress() ); - m_req.SetServerPort( GetSockPort() ); -} - - -void HttpBaseSocket::OnHeader(const std::string& key,const std::string& value) -{ -DEB(fprintf(stderr, " (request)OnHeader %s: %s\n", key.c_str(), value.c_str());) - if (Utility::ToLower(key) == "cookie") - m_req.AddCookie(value); - else - m_req.SetHeader(key, value); -} - - -void HttpBaseSocket::OnHeaderComplete() -{ - m_body_size_left = atol( m_req.Header("content-length").c_str() ); - if (m_body_size_left > 0) - { - m_req.InitBody( m_body_size_left ); - } - else - { - // execute - Execute(); - } -} - - -void HttpBaseSocket::OnData(const char *buf,size_t sz) -{ - m_req.Write( buf, sz ); - m_body_size_left -= sz; - if (!m_body_size_left) - { - m_req.CloseBody(); - - // execute - Execute(); - } -} - - -// -------------------------------------------------------------------------------------- -void HttpBaseSocket::Execute() -{ - // parse form data / query_string and cookie header if available - m_req.ParseBody(); - -DEB(printf(" *** http version: %s\n", m_req.HttpVersion().c_str()); -printf(" *** connection: %s\n", m_req.Header("connection").c_str());) - if ( !(m_req.HttpVersion().size() > 4 && m_req.HttpVersion().substr(m_req.HttpVersion().size() - 4) == "/1.1") || - m_req.Header("connection") == "close") - { - m_b_keepalive = false; -DEB(printf(" *** keepalive: false\n");) - } - else - { - m_b_keepalive = true; -DEB(printf(" *** keepalive: true\n");) - } - - // prepare page - OnExec( m_req ); - - m_req.Reset(); - Reset(); -} - - -// -------------------------------------------------------------------------------------- -void HttpBaseSocket::Respond(const HttpResponse& res) -{ - m_res = res; - - SetHttpVersion( m_res.HttpVersion() ); - SetStatus( Utility::l2string(m_res.HttpStatusCode()) ); - SetStatusText( m_res.HttpStatusMsg() ); - - if (!ResponseHeaderIsSet("content-length")) - { - AddResponseHeader( "content-length", Utility::l2string( m_res.GetFile().size() ) ); - } - for (Utility::ncmap::const_iterator it = m_res.Headers().begin(); it != m_res.Headers().end(); ++it) - { - AddResponseHeader( it -> first, it -> second ); - } - std::list vec = m_res.CookieNames(); - for (std::list::iterator it2 = vec.begin(); it2 != vec.end(); ++it2) - { - AppendResponseHeader( "set-cookie", m_res.Cookie(*it2) ); - } - SendResponse(); - - OnTransferLimit(); -} - - -// -------------------------------------------------------------------------------------- -void HttpBaseSocket::OnTransferLimit() -{ - char msg[32768]; - size_t n = m_res.GetFile().fread(msg, 1, 32768); - while (n > 0) - { - SendBuf( msg, n ); - if (GetOutputLength() > 1) - { - SetTransferLimit( 1 ); - break; - } - n = m_res.GetFile().fread(msg, 1, 32768); - } - if (!GetOutputLength()) - { - SetTransferLimit(0); - m_res.GetFile().fclose(); - OnResponseComplete(); - if (!m_b_keepalive) - { - SetCloseAndDelete(); - } - } -} - - -// -------------------------------------------------------------------------------------- -void HttpBaseSocket::Reset() -{ - HTTPSocket::Reset(); - m_body_size_left = 0; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.h deleted file mode 100755 index 393c5fadcb..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpBaseSocket.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - ** \file HttpBaseSocket.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _HttpBaseSocket_H -#define _HttpBaseSocket_H - -#include "HTTPSocket.h" -#include "HttpRequest.h" -#include "IHttpServer.h" -#include "HttpResponse.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpResponse; - -class HttpBaseSocket : public HTTPSocket, public IHttpServer -{ -public: - HttpBaseSocket(ISocketHandler& h); - ~HttpBaseSocket(); - - void OnFirst(); - void OnHeader(const std::string& key,const std::string& value); - void OnHeaderComplete(); - void OnData(const char *,size_t); - - // implements IHttpServer::Respond - void Respond(const HttpResponse& res); - - void OnTransferLimit(); - -protected: - HttpBaseSocket(const HttpBaseSocket& s) : HTTPSocket(s) {} // copy constructor - // - HttpRequest m_req; - HttpResponse m_res; - void Reset(); - -private: - HttpBaseSocket& operator=(const HttpBaseSocket& ) { - return *this; // assignment operator - } - void Execute(); - // - size_t m_body_size_left; - bool m_b_keepalive; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _HttpBaseSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.cpp deleted file mode 100755 index 74d16978a5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.cpp +++ /dev/null @@ -1,312 +0,0 @@ -/** - ** \file HttpClientSocket.cpp - ** \date 2006-04-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpClientSocket.h" -#include "StdLog.h" -#include "ISocketHandler.h" -#include "File.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -HttpClientSocket::HttpClientSocket(ISocketHandler& h) -:HTTPSocket(h) -,m_data_ptr(NULL) -,m_data_size(0) -,m_content_length(0) -,m_data_ptr_set(false) -,m_fil(NULL) -,m_content_ptr(0) -,m_b_complete(false) -,m_b_close_when_complete(false) -{ -} - - -HttpClientSocket::HttpClientSocket(ISocketHandler& h,const std::string& url_in) -:HTTPSocket(h) -,m_data_ptr(NULL) -,m_data_size(0) -,m_content_length(0) -,m_data_ptr_set(false) -,m_fil(NULL) -,m_content_ptr(0) -,m_b_complete(false) -,m_b_close_when_complete(false) -{ - std::string url; - url_this(url_in, m_protocol, m_host, m_port, url, m_url_filename); - SetUrl( url ); -} - - -HttpClientSocket::HttpClientSocket(ISocketHandler& h,const std::string& host, port_t port, const std::string& url_in) -:HTTPSocket(h) -,m_data_ptr(NULL) -,m_data_size(0) -,m_content_length(0) -,m_data_ptr_set(false) -,m_fil(NULL) -,m_content_ptr(0) -,m_b_complete(false) -,m_b_close_when_complete(false) -{ - std::string url; - std::string tmp = "http://" + host + ":" + Utility::l2string(port) + url_in; - url_this(tmp, m_protocol, m_host, m_port, url, m_url_filename); - SetUrl( url ); -} - - -HttpClientSocket::~HttpClientSocket() -{ - if (m_data_ptr && !m_data_ptr_set) - { - delete[] m_data_ptr; - } - if (m_fil) - { - m_fil -> fclose(); - } -} - - -void HttpClientSocket::OnFirst() -{ - if (!IsResponse()) - { - Handler().LogError(this, "OnFirst", 0, "Response expected but not received - aborting", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - m_content = GetHttpVersion() + " " + GetStatus() + " " + GetStatusText() + "\r\n"; -} - - -void HttpClientSocket::OnHeader(const std::string& key,const std::string& value) -{ - m_content += key + ": " + value + "\r\n"; - if (!strcasecmp(key.c_str(), "content-length")) - { - m_content_length = atoi(value.c_str()); - } - else - if (!strcasecmp(key.c_str(), "content-type")) - { - m_content_type = value; - } -} - - -void HttpClientSocket::OnHeaderComplete() -{ - if (m_filename.size()) - { - m_fil = new File; - if (!m_fil -> fopen(m_filename, "wb")) - { - delete m_fil; - m_fil = NULL; - } - } - else - if (!m_data_ptr && m_content_length) - { - m_data_ptr = new unsigned char[m_content_length]; - m_data_size = m_content_length; - } -} - - -void HttpClientSocket::OnData(const char *buf,size_t len) -{ - if (m_fil) - { - m_fil -> fwrite(buf, 1, len); - } - else - if (m_data_ptr) - { - if (m_content_ptr + len > m_data_size) - { - Handler().LogError(this, "OnData", -1, "content buffer overflow", LOG_LEVEL_ERROR); - } - else - { - memcpy(m_data_ptr + m_content_ptr, buf, len); - } - } - m_content_ptr += len; - if (m_content_ptr == m_content_length && m_content_length) - { - if (m_fil) - { - m_fil -> fclose(); - delete m_fil; - m_fil = NULL; - } - m_b_complete = true; - OnContent(); - if (m_b_close_when_complete) - { - SetCloseAndDelete(); - } - } -} - - -void HttpClientSocket::OnDelete() -{ - if (!m_b_complete) - { - if (m_fil) - { - m_fil -> fclose(); - delete m_fil; - m_fil = NULL; - } - m_b_complete = true; - OnContent(); - } -} - - -void HttpClientSocket::SetFilename(const std::string& x) -{ - m_filename = x; -} - - -void HttpClientSocket::SetDataPtr(unsigned char *buf,size_t len) -{ - m_data_ptr = buf; - m_data_size = len; - m_data_ptr_set = true; -} - - -const std::string& HttpClientSocket::GetContent() -{ - return m_content; -} - - -size_t HttpClientSocket::GetContentLength() -{ - return m_content_length; -} - - -size_t HttpClientSocket::GetContentPtr() -{ - return m_content_ptr; -} - - -size_t HttpClientSocket::GetPos() -{ - return m_content_ptr; -} - - -bool HttpClientSocket::Complete() -{ - return m_b_complete; -} - - -const unsigned char *HttpClientSocket::GetDataPtr() const -{ - return m_data_ptr; -} - - -void HttpClientSocket::OnContent() -{ -} - - -void HttpClientSocket::SetCloseOnComplete(bool x) -{ - m_b_close_when_complete = x; -} - - -const std::string& HttpClientSocket::GetUrlProtocol() -{ - return m_protocol; -} - - -const std::string& HttpClientSocket::GetUrlHost() -{ - return m_host; -} - - -port_t HttpClientSocket::GetUrlPort() -{ - return m_port; -} - - -const std::string& HttpClientSocket::GetUrlFilename() -{ - return m_url_filename; -} - - -const std::string& HttpClientSocket::GetContentType() -{ - return m_content_type; -} - - -void HttpClientSocket::Url(const std::string& url_in,std::string& host,port_t& port) -{ - std::string url; - url_this(url_in, m_protocol, m_host, m_port, url, m_url_filename); - SetUrl(url); - host = GetUrlHost(); - port = GetUrlPort(); -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.h deleted file mode 100755 index f2e9f83b0a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpClientSocket.h +++ /dev/null @@ -1,139 +0,0 @@ -/** - ** \file HttpClientSocket.h - ** \date 2006-04-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_HttpClientSocket_H -#define _SOCKETS_HttpClientSocket_H - -#include "sockets-config.h" -#include "HTTPSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IFile; - -/** Get http response to file or memory. - \ingroup http */ -class HttpClientSocket : public HTTPSocket -{ -public: - HttpClientSocket(ISocketHandler&); - HttpClientSocket(ISocketHandler&,const std::string& url_in); - HttpClientSocket(ISocketHandler&,const std::string& host, port_t port, const std::string& url_in); - ~HttpClientSocket(); - - /** Parse url to protocol,host,port,url and file. */ - void Url(const std::string& url_in,std::string& host,port_t& port); - - void OnFirst(); - void OnHeader(const std::string&,const std::string&); - void OnHeaderComplete(); - void OnData(const char *,size_t); - void OnDelete(); - - /** New callback method fires when all data is received. */ - virtual void OnContent(); - - /** Write response to this file */ - void SetFilename(const std::string& ); - const std::string& Filename() const { - return m_filename; - } - - /** Store response in this buffer. */ - void SetDataPtr(unsigned char *,size_t); - - /** Get response headers. */ - const std::string& GetContent(); - - /** Get size of response body. */ - size_t GetContentLength(); - - /** Get content type from response header. */ - const std::string& GetContentType(); - - /** Get size of received response body. */ - size_t GetContentPtr(); - /** Get size of received response body. */ - size_t GetPos(); - - /** Complete response has been received. */ - bool Complete(); - - /** Get ptr to response data buffer. */ - const unsigned char *GetDataPtr() const; - - /** Close socket when response received. */ - void SetCloseOnComplete(bool = true); - - /** Get protocol used from url. */ - const std::string& GetUrlProtocol(); - /** Get hostname from url. */ - const std::string& GetUrlHost(); - /** Get port from url. */ - port_t GetUrlPort(); - /** Get filename part of url. */ - const std::string& GetUrlFilename(); - -protected: - HttpClientSocket(const HttpClientSocket& s) : HTTPSocket(s) {} // copy constructor - HttpClientSocket& operator=(const HttpClientSocket& ) { - return *this; // assignment operator - } -private: - std::string m_filename; ///< Filename to write response to - unsigned char *m_data_ptr; ///< Ptr to buffer where to store response - size_t m_data_size; ///< Max size of data buffer - size_t m_content_length; ///< Content-length header received from remote - std::string m_content; ///< Received http headers - bool m_data_ptr_set; ///< Buffer set from outside, do not delete - IFile *m_fil; ///< Output file - size_t m_content_ptr; ///< Number of bytes received from body - bool m_b_complete; ///< The entire content-length number of bytes has been received - bool m_b_close_when_complete; ///< Close when the full response has been received - std::string m_protocol; ///< Protocol part of url_in - std::string m_host; ///< Hostname from url_in - port_t m_port; ///< Port from url_in - std::string m_url_filename; ///< Filename from url_in - std::string m_content_type; ///< Content-type: header from response -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // _SOCKETS_HttpClientSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.cpp deleted file mode 100755 index 87cbd749f9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/** \file HttpDebugSocket.cpp - ** \date 2004-10-08 -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom (grymse@alhem.net) - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpDebugSocket.h" -#include "ISocketHandler.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -HttpDebugSocket::HttpDebugSocket(ISocketHandler& h) : HTTPSocket(h) -,m_content_length(0) -,m_read_ptr(0) -{ -} - - -HttpDebugSocket::~HttpDebugSocket() -{ -} - - -void HttpDebugSocket::Init() -{ - if (GetParent() -> GetPort() == 443) - { -#ifdef HAVE_OPENSSL - EnableSSL(); -#else - Handler().LogError(this, "url_this", -1, "SSL not available", LOG_LEVEL_WARNING); -#endif - } -} - - -void HttpDebugSocket::OnFirst() -{ - Send( - "HTTP/1.1 200 OK\n" - "Content-type: text/html\n" - "Connection: close\n" - "Server: HttpDebugSocket/1.0\n" - "\n"); - Send( - "Echo Request" - "

Request Header

"); - Send( "
" - "
" - "
"); - - // enctype 'multipart/form-data' - Sendf("
"); - Sendf("
"); - Sendf("
"); - Sendf(""); - Sendf("
"); - - Send( "
");
-	Send(GetMethod() + " " + GetUrl() + " " + GetHttpVersion() + "\n");
-}
-
-
-void HttpDebugSocket::OnHeader(const std::string& key,const std::string& value)
-{
-	if (!strcasecmp(key.c_str(),"content-length"))
-		m_content_length = atoi(value.c_str());
-
-	Send(key + ": " + value + "\n");
-}
-
-
-void HttpDebugSocket::OnHeaderComplete()
-{
-	if (m_content_length || IsChunked())
-	{
-		Send("

Request Body

");
-	}
-	else
-	{
-		Send("

"); - SetCloseAndDelete(); - } -} - - -void HttpDebugSocket::OnData(const char *p,size_t l) -{ - SendBuf(p,l); - m_read_ptr += (int)l; - if (m_read_ptr >= m_content_length && m_content_length) - { - Send("
"); - SetCloseAndDelete(); - } -} - - -void HttpDebugSocket::OnDataComplete() -{ - if (!CloseAndDelete()) - { - Send("
"); - SetCloseAndDelete(); - } -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.h deleted file mode 100755 index cd0b82d3ea..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpDebugSocket.h +++ /dev/null @@ -1,76 +0,0 @@ -/** \file HttpDebugSocket.h - ** \date 2004-09-27 -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom (grymse@alhem.net) - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_HttpDebugSocket_H -#define _SOCKETS_HttpDebugSocket_H - -#include "sockets-config.h" -#include "HTTPSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class ISocketHandler; - -/** HTTP request "echo" class. This class echoes a http request/body -with a html formatted page. - \ingroup http */ -class HttpDebugSocket : public HTTPSocket -{ -public: - HttpDebugSocket(ISocketHandler&); - ~HttpDebugSocket(); - - void Init(); - - void OnFirst(); - void OnHeader(const std::string& key,const std::string& value); - void OnHeaderComplete(); - void OnData(const char *,size_t); - void OnDataComplete(); - -private: - HttpDebugSocket(const HttpDebugSocket& s) : HTTPSocket(s) {} // copy constructor - HttpDebugSocket& operator=(const HttpDebugSocket& ) { - return *this; // assignment operator - } - int m_content_length; - int m_read_ptr; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpDebugSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.cpp deleted file mode 100755 index f7fd7e84d8..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/** \file HttpGetSocket.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#else -#include -#endif -#include "ISocketHandler.h" -#include "HttpGetSocket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -HttpGetSocket::HttpGetSocket(ISocketHandler& h) : HttpClientSocket(h) -{ -} - - -HttpGetSocket::HttpGetSocket(ISocketHandler& h,const std::string& url_in,const std::string& to_file) : HttpClientSocket(h, url_in) -{ - if (to_file.size()) - { - SetFilename(to_file); - } - if (!Open(GetUrlHost(),GetUrlPort())) - { - if (!Connecting()) - { - Handler().LogError(this, "HttpGetSocket", -1, "connect() failed miserably", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - } -} - - -HttpGetSocket::HttpGetSocket(ISocketHandler& h,const std::string& host,port_t port,const std::string& url,const std::string& to_file) : HttpClientSocket(h, host, port, url) -{ - SetUrl(url); - if (to_file.size()) - { - SetFilename(to_file); - } - if (!Open(host, port)) - { - if (!Connecting()) - { - Handler().LogError(this, "HttpGetSocket", -1, "connect() failed miserably", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - } -} - - -HttpGetSocket::~HttpGetSocket() -{ -} - - -void HttpGetSocket::OnConnect() -{ - SetMethod( "GET" ); - AddResponseHeader( "Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1"); - AddResponseHeader( "Accept-Language", "en-us,en;q=0.5"); - AddResponseHeader( "Accept-Encoding", "gzip,deflate"); - AddResponseHeader( "Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); - AddResponseHeader( "User-agent", MyUseragent() ); - - if (GetUrlPort() != 80 && GetUrlPort() != 443) - AddResponseHeader( "Host", GetUrlHost() + ":" + Utility::l2string(GetUrlPort()) ); - else - AddResponseHeader( "Host", GetUrlHost() ); - SendRequest(); -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.h deleted file mode 100755 index 0fb96a23bd..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpGetSocket.h +++ /dev/null @@ -1,71 +0,0 @@ -/** \file HttpGetSocket.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_HttpGetSocket_H -#define _SOCKETS_HttpGetSocket_H - -#include "sockets-config.h" -#include "HttpClientSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Get http page. - \ingroup http */ -class HttpGetSocket : public HttpClientSocket -{ -public: - HttpGetSocket(ISocketHandler&); - HttpGetSocket(ISocketHandler&,const std::string& url,const std::string& to_file = ""); - HttpGetSocket(ISocketHandler&,const std::string& host,port_t port,const std::string& url,const std::string& to_file = ""); - ~HttpGetSocket(); - - void OnConnect(); - -protected: - HttpGetSocket& operator=(const HttpGetSocket& ) { - return *this; - } - HttpGetSocket(const HttpGetSocket& s) : HttpClientSocket(s) {} -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpGetSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.cpp deleted file mode 100755 index 97a44eb229..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.cpp +++ /dev/null @@ -1,295 +0,0 @@ -/** \file HttpPostSocket.cpp - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#pragma warning(disable:4503) -#endif -#else -#include -#include -#endif -#include "ISocketHandler.h" -#include -#include -#include "Lock.h" -#include "File.h" - -#include "HttpPostSocket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -int HttpPostSocket::m_boundary_count = 0; -Mutex HttpPostSocket::m_boundary_mutex; - - -HttpPostSocket::HttpPostSocket(ISocketHandler& h) : HttpClientSocket(h) -,m_bMultipart(false) -{ -} - - -HttpPostSocket::HttpPostSocket(ISocketHandler& h,const std::string& url_in) : HttpClientSocket(h, url_in) -,m_bMultipart(false) -{ - Lock lock(m_boundary_mutex); - - m_boundary = "----"; - for (int i = 0; i < 12; i++) - { - char c = m_boundary_count++ % 128; - while (!isalnum(c)) - c = m_boundary_count++ % 128; - m_boundary += c; - } - m_boundary += "__" + Utility::l2string(m_boundary_count++); -} - - -HttpPostSocket::~HttpPostSocket() -{ -} - - -void HttpPostSocket::AddField(const std::string& name,const std::string& value) -{ - std::list vec; - vec.push_back(value); - AddMultilineField(name, vec); -} - - -void HttpPostSocket::AddMultilineField(const std::string& name,std::list& values) -{ - m_fields[name] = values; -} - - -void HttpPostSocket::AddFile(const std::string& name,const std::string& filename,const std::string& type) -{ - struct stat st; - if (!stat(filename.c_str(), &st)) - { - m_files[name] = filename; - m_content_length[filename] = st.st_size; - m_content_type[filename] = type; - m_bMultipart = true; - } - else - { - Handler().LogError(this, "AddFile", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } -} - - -void HttpPostSocket::Open() -{ - // why do I have to specify TcpSocket:: to get to the Open() method?? - TcpSocket::Open(GetUrlHost(), GetUrlPort()); -} - - -void HttpPostSocket::OnConnect() -{ - if (m_bMultipart) - { - DoMultipartPost(); - } - else - { - std::string body; - - // only fields, no files, add urlencoding - for (std::map >::iterator it = m_fields.begin(); it != m_fields.end(); ++it) - { - std::string name = (*it).first; - std::list& ref = (*it).second; - if (body.size()) - { - body += '&'; - } - body += name + "="; - bool first = true; - for (std::list::iterator it = ref.begin(); it != ref.end(); ++it) - { - std::string value = *it; - if (!first) - { - body += "%0d%0a"; // CRLF - } - body += Utility::rfc1738_encode(value); - first = false; - } - } - - // build header, send body - SetMethod("POST"); - SetHttpVersion( "HTTP/1.1" ); - AddResponseHeader( "Host", GetUrlHost() ); // oops - this is actually a request header that we're adding.. - AddResponseHeader( "User-agent", MyUseragent()); - AddResponseHeader( "Accept", "text/html, text/plain, */*;q=0.01" ); - AddResponseHeader( "Connection", "close" ); - AddResponseHeader( "Content-type", "application/x-www-form-urlencoded" ); - AddResponseHeader( "Content-length", Utility::l2string((long)body.size()) ); - SendRequest(); - - // send body - Send( body ); - } -} - - -void HttpPostSocket::DoMultipartPost() -{ - long length = 0; // calculate content_length of our post body - std::string tmp; - - // fields - { - for (std::map >::iterator it = m_fields.begin(); it != m_fields.end(); ++it) - { - std::string name = (*it).first; - std::list& ref = (*it).second; - tmp = "--" + m_boundary + "\r\n" - "content-disposition: form-data; name=\"" + name + "\"\r\n" - "\r\n"; - for (std::list::iterator it = ref.begin(); it != ref.end(); ++it) - { - std::string value = *it; - tmp += value + "\r\n"; - } - length += (long)tmp.size(); - } - } - - // files - { - for (std::map::iterator it = m_files.begin(); it != m_files.end(); ++it) - { - std::string name = (*it).first; - std::string filename = (*it).second; - long content_length = m_content_length[filename]; - std::string content_type = m_content_type[filename]; - tmp = "--" + m_boundary + "\r\n" - "content-disposition: form-data; name=\"" + name + "\"; filename=\"" + filename + "\"\r\n" - "content-type: " + content_type + "\r\n" - "\r\n"; - length += (long)tmp.size(); - length += content_length; - length += 2; // crlf after file - } - } - - // end - tmp = "--" + m_boundary + "--\r\n"; - length += (long)tmp.size(); - - // build header, send body - SetMethod("POST"); - SetHttpVersion( "HTTP/1.1" ); - AddResponseHeader( "Host", GetUrlHost() ); // oops - this is actually a request header that we're adding.. - AddResponseHeader( "User-agent", MyUseragent()); - AddResponseHeader( "Accept", "text/html, text/plain, */*;q=0.01" ); - AddResponseHeader( "Connection", "close" ); - AddResponseHeader( "Content-type", "multipart/form-data; boundary=" + m_boundary ); - AddResponseHeader( "Content-length", Utility::l2string(length) ); - - SendRequest(); - - // send fields - { - for (std::map >::iterator it = m_fields.begin(); it != m_fields.end(); ++it) - { - std::string name = (*it).first; - std::list& ref = (*it).second; - tmp = "--" + m_boundary + "\r\n" - "content-disposition: form-data; name=\"" + name + "\"\r\n" - "\r\n"; - for (std::list::iterator it = ref.begin(); it != ref.end(); ++it) - { - std::string value = *it; - tmp += value + "\r\n"; - } - Send( tmp ); - } - } - - // send files - { - for (std::map::iterator it = m_files.begin(); it != m_files.end(); ++it) - { - std::string name = (*it).first; - std::string filename = (*it).second; - std::string content_type = m_content_type[filename]; - tmp = "--" + m_boundary + "\r\n" - "content-disposition: form-data; name=\"" + name + "\"; filename=\"" + filename + "\"\r\n" - "content-type: " + content_type + "\r\n" - "\r\n"; - Send( tmp ); - { - std::auto_ptr fil = std::auto_ptr(new File); - if (fil -> fopen(filename, "rb")) - { - char slask[2000]; // for fread - size_t n; - while ((n = fil -> fread(slask, 1, 2000)) > 0) - { - SendBuf(slask, n); - } - fil -> fclose(); - } - } - Send("\r\n"); - } - } - - // end of send - Send("--" + m_boundary + "--\r\n"); -} - - -void HttpPostSocket::SetMultipart() -{ - m_bMultipart = true; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.h deleted file mode 100755 index 2985d6d6f7..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPostSocket.h +++ /dev/null @@ -1,101 +0,0 @@ -/** \file HttpPostSocket.h - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_HttpPostSocket_H -#define _SOCKETS_HttpPostSocket_H - -#include "sockets-config.h" -#include "HttpClientSocket.h" -#include "Mutex.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class ISocketHandler; - -/** Generate a http post request, get response. - \ingroup http */ -class HttpPostSocket : public HttpClientSocket -{ -public: - HttpPostSocket(ISocketHandler&); - /* client constructor, - \param url_in = 'http://host:port/resource' */ - HttpPostSocket(ISocketHandler&,const std::string& url_in); - ~HttpPostSocket(); - - // these must be specified before connecting / adding to handler - /** Add field to post. */ - void AddField(const std::string& name,const std::string& value); - /** Add multiline field to post. */ - void AddMultilineField(const std::string& name,std::list& values); - /** Add file to post. */ - void AddFile(const std::string& name,const std::string& filename,const std::string& type); - - /** use this to post with content-type multipart/form-data. - // when adding a file to the post, this is the default and only content-type */ - void SetMultipart(); - - /** connect to host:port derived from url in constructor */ - void Open(); - - /** http put client implemented in OnConnect */ - void OnConnect(); - -protected: - std::map > m_fields; - -private: - HttpPostSocket(const HttpPostSocket& s) : HttpClientSocket(s) {} // copy constructor - HttpPostSocket& operator=(const HttpPostSocket& ) { - return *this; // assignment operator - } - void DoMultipartPost(); - // - std::map m_files; - std::string m_boundary; - std::map m_content_length; - std::map m_content_type; - bool m_bMultipart; - static int m_boundary_count; - static Mutex m_boundary_mutex; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpPostSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.cpp deleted file mode 100755 index b9eb64d1dc..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/** \file HttpPutSocket.cpp - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#else -#include -#endif -#include "ISocketHandler.h" -#include -#include -#include "File.h" - -#include "HttpPutSocket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -HttpPutSocket::HttpPutSocket(ISocketHandler& h) : HttpClientSocket(h) -{ -} - - -HttpPutSocket::HttpPutSocket(ISocketHandler& h,const std::string& url_in) : HttpClientSocket(h, url_in) -{ -} - - -HttpPutSocket::~HttpPutSocket() -{ -} - - -void HttpPutSocket::SetFile(const std::string& file) -{ - struct stat st; - if (!stat(file.c_str(), &st)) - { - m_filename = file; - m_content_length = st.st_size; - } - else - { - Handler().LogError(this, "SetFile", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } -} - - -void HttpPutSocket::SetContentType(const std::string& type) -{ - m_content_type = type; -} - - - -void HttpPutSocket::Open() -{ - // why do I have to specify TcpSocket:: to get to the Open() method?? - TcpSocket::Open(GetUrlHost(), GetUrlPort()); -} - - -void HttpPutSocket::OnConnect() -{ - SetMethod( "PUT" ); - SetHttpVersion( "HTTP/1.1" ); - AddResponseHeader( "Host", GetUrlHost() ); - AddResponseHeader( "Content-type", m_content_type ); - AddResponseHeader( "Content-length", Utility::l2string(m_content_length) ); - AddResponseHeader( "User-agent", MyUseragent() ); - SendRequest(); - - std::auto_ptr fil = std::auto_ptr(new File); - if (fil -> fopen(m_filename, "rb")) - { - size_t n; - char buf[32768]; - while ((n = fil -> fread(buf, 1, 32768)) > 0) - { - SendBuf(buf, n); - } - fil -> fclose(); - } -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.h deleted file mode 100755 index 0d1f6c5e31..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpPutSocket.h +++ /dev/null @@ -1,88 +0,0 @@ -/** \file HttpPutSocket.h - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_HttpPutSocket_H -#define _SOCKETS_HttpPutSocket_H - -#include "sockets-config.h" -#include "HttpClientSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class ISocketHandler; - -/** Put http page. - \ingroup http */ -class HttpPutSocket : public HttpClientSocket -{ -public: - HttpPutSocket(ISocketHandler&); - /** client constructor, - \param url_in = 'http://host:port/resource' */ - HttpPutSocket(ISocketHandler&,const std::string& url_in); - ~HttpPutSocket(); - - // these must be specified before connecting / adding to handler - /** Set filename to send. */ - void SetFile(const std::string& ); - /** Set mimetype of file to send. */ - void SetContentType(const std::string& ); - - /** connect to host:port derived from url in constructor */ - void Open(); - - /** http put client implemented in OnConnect */ - void OnConnect(); - -private: - HttpPutSocket(const HttpPutSocket& s) : HttpClientSocket(s) {} // copy constructor - HttpPutSocket& operator=(const HttpPutSocket& ) { - return *this; // assignment operator - } - // - std::string m_filename; - std::string m_content_type; - long m_content_length; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpPutSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.cpp deleted file mode 100755 index 5373c74f0b..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.cpp +++ /dev/null @@ -1,428 +0,0 @@ -/** - ** \file HttpRequest.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpRequest.h" -#include "MemFile.h" -#include "HttpdForm.h" -#include "HttpdCookies.h" -#include "Parse.h" -#include "Exception.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x; fflush(stderr); -#else -#define DEB(x) -#endif - - -// -------------------------------------------------------------------------------------- -HttpRequest::HttpRequest() : HttpTransaction() -, m_server_port(0) -, m_is_ssl(false) -, m_body_file(NULL) -, m_form(NULL) -{ -} - - -// -------------------------------------------------------------------------------------- -#ifndef _WIN32 -HttpRequest::HttpRequest(FILE *fil) : HttpTransaction() -, m_server_port(0) -, m_is_ssl(false) -, m_body_file(NULL) -, m_form(NULL) -{ - int i = 0; -DEB( std::cout << "Initialize HttpRequest from cgi...\n";) - while (environ[i] && *environ[i]) - { - Parse pa(environ[i], "="); - std::string key = pa.getword(); - std::string value = pa.getrest(); - if (key == "REQUEST_METHOD") - m_method = value; - else - if (key == "SERVER_PROTOCOL") - m_protocol = value; - else - if (key == "PATH_INFO") - m_req_uri = value; - else - if (key == "REMOTE_ADDR") - m_remote_addr = value; - else - if (key == "REMOTE_HOST") - m_remote_host = value; - else - if (key == "SERVER_NAME") - m_server_name = value; - else - if (key == "SERVER_PORT") - m_server_port = atoi(value.c_str()); - else - if (key.size() > 5 && key.substr(0, 5) == "HTTP_") - { - key = key.substr(5); - for (size_t pos = 0; pos < key.size(); pos++) - { - if (key[pos] == '_') - key[pos] = '-'; - else - if (key[pos] >= 'A' && key[pos] <= 'Z') - key[pos] |= 32; - } -DEB( std::cout << " http header '" << key << "' == '" << value << "\n";) - SetHeader(key, value); - } - ++i; - } -DEB( std::cout << " setup http form\n";) - m_form = std::auto_ptr(new HttpdForm(fil)); -} -#endif - - -// -------------------------------------------------------------------------------------- -HttpRequest::HttpRequest(const HttpRequest& src) : HttpTransaction(src) -, m_method(src.m_method) -, m_protocol(src.m_protocol) -, m_req_uri(src.m_req_uri) -, m_remote_addr(src.m_remote_addr) -, m_remote_host(src.m_remote_host) -, m_server_name(src.m_server_name) -, m_server_port(src.m_server_port) -, m_is_ssl(src.m_is_ssl) -, m_attribute(src.m_attribute) -, m_null(src.m_null) -, m_body_file(src.m_body_file) -, m_form(src.m_form) -, m_cookies(src.m_cookies) -, m_cookie(src.m_cookie) -{ -} - - -// -------------------------------------------------------------------------------------- -HttpRequest::~HttpRequest() -{ -} - - -// -------------------------------------------------------------------------------------- -HttpRequest& HttpRequest::operator=(const HttpRequest& src) -{ - m_method = src.m_method; - m_protocol = src.m_protocol; - m_req_uri = src.m_req_uri; - m_remote_addr = src.m_remote_addr; - m_remote_host = src.m_remote_host; - m_server_name = src.m_server_name; - m_server_port = src.m_server_port; - m_is_ssl = src.m_is_ssl; - m_attribute = src.m_attribute; - m_null = src.m_null; - m_body_file = src.m_body_file; - m_form = src.m_form; - m_cookies = src.m_cookies; - m_cookie = src.m_cookie; - - HttpTransaction::operator=(src); - - return *this; -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetHttpMethod(const std::string& value) -{ - m_method = value; -} - - -const std::string& HttpRequest::HttpMethod() const -{ - return m_method; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetHttpVersion(const std::string& value) -{ - m_protocol = value; -} - - -const std::string& HttpRequest::HttpVersion() const -{ - return m_protocol; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetUri(const std::string& value) -{ - m_req_uri = value; -} - - -const std::string& HttpRequest::Uri() const -{ - return m_req_uri; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetRemoteAddr(const std::string& value) -{ - m_remote_addr = value; -} - - -const std::string& HttpRequest::RemoteAddr() const -{ - return m_remote_addr; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetRemoteHost(const std::string& value) -{ - m_remote_host = value; -} - - -const std::string& HttpRequest::RemoteHost() const -{ - return m_remote_host; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetServerName(const std::string& value) -{ - m_server_name = value; -} - - -const std::string& HttpRequest::ServerName() const -{ - return m_server_name; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetServerPort(int value) -{ - m_server_port = value; -} - - -int HttpRequest::ServerPort() const -{ - return m_server_port; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetIsSsl(bool value) -{ - m_is_ssl = value; -} - - -bool HttpRequest::IsSsl() const -{ - return m_is_ssl; -} - - - -// -------------------------------------------------------------------------------------- -void HttpRequest::SetAttribute(const std::string& key, const std::string& value) -{ - m_attribute[key] = value; -} - - -void HttpRequest::SetAttribute(const std::string& key, long value) -{ - m_attribute[key] = Utility::l2string(value); -} - - -const std::string& HttpRequest::Attribute(const std::string& key) const -{ - Utility::ncmap::const_iterator it; - if ( (it = m_attribute.find(key)) != m_attribute.end()) - return it -> second; - return m_null; -} - - -// -------------------------------------------------------------------------------------- -const Utility::ncmap& HttpRequest::Attributes() const -{ - return m_attribute; -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::AddCookie(const std::string& str) -{ - m_cookies.add( str ); - Parse pa(str, ";"); - std::string lstr = pa.getword(); - while (!lstr.empty()) - { - Parse pa2(lstr, "="); - std::string name = pa2.getword(); - m_cookie[name] = lstr; -DEB(fprintf(stderr, " *** AddCookie '%s' = '%s'\n", name.c_str(), lstr.c_str());) - lstr = pa.getword(); - } -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::InitBody( size_t sz ) -{ - if (!m_body_file.get()) - m_body_file = std::auto_ptr(new MemFile); -DEB( else - fprintf(stderr, "Body data file already opened\n");) -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::Write( const char *buf, size_t sz ) -{ - if (m_body_file.get()) - m_body_file -> fwrite(buf, 1, sz); -DEB( else - fprintf(stderr, "Write: Body data file not open\n");) -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::CloseBody() -{ - if (m_body_file.get()) - m_body_file -> fclose(); -DEB( else - fprintf(stderr, "CloseBody: File not open\n");) -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::ParseBody() -{ - Utility::ncmap::const_iterator it; - if ( (it = m_attribute.find("query_string")) != m_attribute.end()) - { - std::string qs = it -> second; - m_form = std::auto_ptr(new HttpdForm( qs, qs.size() )); - } - else - if (m_body_file.get()) - { - m_form = std::auto_ptr(new HttpdForm( m_body_file.get(), ContentType(), ContentLength() )); - } - else - { - // dummy - m_form = std::auto_ptr(new HttpdForm( "", 0 )); - } -} - - -// -------------------------------------------------------------------------------------- -const HttpdForm& HttpRequest::Form() const -{ - if (!m_form.get()) - throw Exception("Form not available"); - return *m_form; -} - - -// -------------------------------------------------------------------------------------- -const HttpdCookies& HttpRequest::Cookies() const -{ - return m_cookies; -} - - -// -------------------------------------------------------------------------------------- -void HttpRequest::Reset() -{ - HttpTransaction::Reset(); - m_method = ""; - m_protocol = ""; - m_req_uri = ""; - m_remote_addr = ""; - m_remote_host = ""; - m_server_name = ""; - m_server_port = 0; - m_is_ssl = false; - while (!m_attribute.empty()) - { - m_attribute.erase(m_attribute.begin()); - } - m_body_file = std::auto_ptr(NULL); - m_form = std::auto_ptr(NULL); - m_cookies.Reset(); - while (!m_cookie.empty()) - { - m_cookie.erase(m_cookie.begin()); - } -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.h deleted file mode 100755 index e525bfbf2e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpRequest.h +++ /dev/null @@ -1,145 +0,0 @@ -/** - ** \file HttpRequest.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_HttpRequest_H -#define _SOCKETS_HttpRequest_H - -#include "HttpTransaction.h" -#include "HttpdCookies.h" -#include "IFile.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpdForm; -class IFile; - -class HttpRequest : public HttpTransaction -{ -public: - HttpRequest(); - /** Create from plain old cgi request */ -#ifndef _WIN32 - HttpRequest(FILE *); -#endif - HttpRequest(const HttpRequest& src); - ~HttpRequest(); - - HttpRequest& operator=(const HttpRequest& src); - - /** Get, Post */ - void SetHttpMethod(const std::string& value); - const std::string& HttpMethod() const; - - /** HTTP/1.x */ - void SetHttpVersion(const std::string& value); - const std::string& HttpVersion() const; - - void SetUri(const std::string& value); - const std::string& Uri() const; - - void SetRemoteAddr(const std::string& value); - const std::string& RemoteAddr() const; - - void SetRemoteHost(const std::string& value); - const std::string& RemoteHost() const; - - void SetServerName(const std::string& value); - const std::string& ServerName() const; - - void SetServerPort(int value); - int ServerPort() const; - - void SetIsSsl(bool value); - bool IsSsl() const; - - /** Set / Read attribute value */ - void SetAttribute(const std::string& key, const std::string& value); - void SetAttribute(const std::string& key, long value); - const std::string& Attribute(const std::string& key) const; - - const Utility::ncmap& Attributes() const; - - /** Cookies */ - void AddCookie(const std::string& ); - const Utility::ncmap& CookieMap() const { - return m_cookie; - } - - /** Open file for body data */ - void InitBody( size_t sz ); - - /** Write body data */ - void Write( const char *buf, size_t sz ); - - /** No more writing */ - void CloseBody(); - - void ParseBody(); - - const HttpdForm& Form() const; - const HttpdCookies& Cookies() const; - - const IFile *BodyFile() const { - return m_body_file.get(); - } - - void Reset(); - -private: - std::string m_method; - std::string m_protocol; - std::string m_req_uri; - std::string m_remote_addr; - std::string m_remote_host; - std::string m_server_name; - int m_server_port; - bool m_is_ssl; - Utility::ncmap m_attribute; - std::string m_null; - mutable std::auto_ptr m_body_file; - mutable std::auto_ptr m_form; - HttpdCookies m_cookies; - Utility::ncmap m_cookie; - -}; // end of class - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_HttpRequest_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.cpp deleted file mode 100755 index 39b1c2792d..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/** - ** \file HttpResponse.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#include - -#include "HttpResponse.h" -#include "HttpRequest.h" -#include "MemFile.h" -#include "File.h" -#include "Parse.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x; fflush(stderr); -#else -#define DEB(x) -#endif - - -// -------------------------------------------------------------------------------------- -HttpResponse::HttpResponse(const std::string& version) : HttpTransaction() -, m_http_version( version ) -, m_http_status_code(0) -, m_file( new MemFile ) -{ -} - - -// -------------------------------------------------------------------------------------- -HttpResponse::HttpResponse(const HttpResponse& src) : HttpTransaction(src) -, m_http_version( src.m_http_version ) -, m_http_status_code( src.m_http_status_code ) -, m_http_status_msg( src.m_http_status_msg ) -, m_cookie( src.m_cookie ) -, m_file( src.m_file ) -{ -} - - -// -------------------------------------------------------------------------------------- -HttpResponse::~HttpResponse() -{ -} - - -// -------------------------------------------------------------------------------------- -HttpResponse& HttpResponse::operator=(const HttpResponse& src) -{ - m_http_version = src.m_http_version; - m_http_status_code = src.m_http_status_code; - m_http_status_msg = src.m_http_status_msg; - m_cookie = src.m_cookie; - m_file = src.m_file; - - HttpTransaction::operator=(src); - - return *this; -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetHttpVersion(const std::string& value) -{ - m_http_version = value; -} - - -// -------------------------------------------------------------------------------------- -const std::string& HttpResponse::HttpVersion() const -{ - return m_http_version; -} - - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetHttpStatusCode(int value) -{ - m_http_status_code = value; -} - - -int HttpResponse::HttpStatusCode() const -{ - return m_http_status_code; -} - - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetHttpStatusMsg(const std::string& value) -{ - m_http_status_msg = value; -} - - -const std::string& HttpResponse::HttpStatusMsg() const -{ - return m_http_status_msg; -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetCookie(const std::string& value) -{ - Parse pa(value, "="); - std::string name = pa.getword(); - m_cookie[name] = value; -DEB(fprintf(stderr, "HttpResponse::Set-Cookie<%s>: %s\n", name.c_str(), value.c_str());) -} - - -const std::string HttpResponse::Cookie(const std::string& name) const -{ - Utility::ncmap::const_iterator it = m_cookie.find(name); -DEB(fprintf(stderr, "HttpResponse; get value of Cookie<%s>: ", name.c_str());) - if (it != m_cookie.end()) - { -DEB(fprintf(stderr, "%s\n", it -> second.c_str());) - return it -> second; - } -DEB(fprintf(stderr, "\n");) - return ""; -} - - -std::list HttpResponse::CookieNames() const -{ - std::list vec; - DEB(fprintf(stderr, "HttpResponse::CookieNames; ");) - for (Utility::ncmap::const_iterator it = m_cookie.begin(); it != m_cookie.end(); ++it) - { - DEB(fprintf(stderr, " %s", it -> first.c_str());) - vec.push_back(it -> first); - } - DEB(fprintf(stderr, "\n");) - return vec; -} - - - -// -------------------------------------------------------------------------------------- -void HttpResponse::Write( const std::string& str ) -{ - Write( str.c_str(), str.size() ); -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::Write( const char *buf, size_t sz ) -{ - m_file -> fwrite( buf, 1, sz ); -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::Writef( const char *format, ... ) -{ - va_list ap; - va_start(ap, format); - char tmp[10000]; - vsnprintf(tmp, sizeof(tmp), format, ap); - va_end(ap); - m_file -> fwrite( tmp, 1, strlen(tmp) ); -} - - -// -------------------------------------------------------------------------------------- -const IFile& HttpResponse::GetFile() const -{ - return *m_file; -} - - -// -------------------------------------------------------------------------------------- -IFile& HttpResponse::GetFile() -{ - return *m_file; -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetFile( const std::string& path ) -{ - m_file = std::auto_ptr(new File); - m_file -> fopen( path, "rb" ); -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::SetFile( IFile *f ) -{ - m_file = std::auto_ptr(f); -} - - -// -------------------------------------------------------------------------------------- -void HttpResponse::Reset() -{ - HttpTransaction::Reset(); - m_http_version = ""; - m_http_status_code = 0; - m_http_status_msg = ""; - while (!m_cookie.empty()) - { - m_cookie.erase(m_cookie.begin()); - } - m_file = std::auto_ptr(new MemFile); -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.h deleted file mode 100755 index 8f64f9dc84..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpResponse.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - ** \file HttpResponse.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_HttpResponse_H -#define _SOCKETS_HttpResponse_H - -#include "HttpTransaction.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class IFile; - -class HttpResponse : public HttpTransaction -{ -public: - HttpResponse(const std::string& version = "HTTP/1.0"); - HttpResponse(const HttpResponse& src); - ~HttpResponse(); - - HttpResponse& operator=(const HttpResponse& src); - - /** HTTP/1.x */ - void SetHttpVersion(const std::string& value); - const std::string& HttpVersion() const; - - void SetHttpStatusCode(int value); - int HttpStatusCode() const; - - void SetHttpStatusMsg(const std::string& value); - const std::string& HttpStatusMsg() const; - - void SetCookie(const std::string& value); - const std::string Cookie(const std::string& name) const; - std::list CookieNames() const; - - void Write( const std::string& str ); - void Write( const char *buf, size_t sz ); - void Writef( const char *format, ... ); - - const IFile& GetFile() const; - IFile& GetFile(); - - /** Replace memfile with file on disk, opened for read. */ - void SetFile( const std::string& path ); - /** Replace memfile with another IFile */ - void SetFile( IFile *f ); - - void Reset(); - -private: - std::string m_http_version; - int m_http_status_code; - std::string m_http_status_msg; - Utility::ncmap m_cookie; - mutable std::auto_ptr m_file; - -}; // end of class - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_HttpResponse_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.cpp deleted file mode 100755 index 62a21d95fa..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/** - ** \file HttpTransaction.cpp - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpTransaction.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// -------------------------------------------------------------------------------------- -HttpTransaction::HttpTransaction() -{ -} - - -// -------------------------------------------------------------------------------------- -HttpTransaction::~HttpTransaction() -{ -} - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetHeader(const std::string& key, const std::string& value) -{ - m_header[key] = value; -} - - -void HttpTransaction::SetHeader(const std::string& key, long value) -{ - m_header[key] = Utility::l2string(value); -} - - -const std::string& HttpTransaction::Header(const std::string& key) const -{ - Utility::ncmap::const_iterator it; - if ((it = m_header.find(key)) != m_header.end()) - return it -> second; - return m_null; -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetAccept(const std::string& value) -{ - SetHeader("accept", value); -} - - -const std::string& HttpTransaction::Accept() const -{ - return Header("accept"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetAcceptCharset(const std::string& value) -{ - SetHeader("accept-charset", value); -} - - -const std::string& HttpTransaction::AcceptCharset() const -{ - return Header("accept-charset"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetAcceptEncoding(const std::string& value) -{ - SetHeader("accept-encoding", value); -} - - -const std::string& HttpTransaction::AcceptEncoding() const -{ - return Header("accept-encoding"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetAcceptLanguage(const std::string& value) -{ - SetHeader("accept-language", value); -} - - -const std::string& HttpTransaction::AcceptLanguage() const -{ - return Header("accept-language"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetConnection(const std::string& value) -{ - SetHeader("connection", value); -} - - -const std::string& HttpTransaction::Connection() const -{ - return Header("connection"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetContentType(const std::string& value) -{ - SetHeader("content-type", value); -} - - -const std::string& HttpTransaction::ContentType() const -{ - return Header("content-type"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetContentLength(long value) -{ - SetHeader("content-length", value ); -} - - -long HttpTransaction::ContentLength() const -{ - return atol(Header("content-length").c_str()); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetHost(const std::string& value) -{ - SetHeader("host", value); -} - - -const std::string& HttpTransaction::Host() const -{ - return Header("host"); -} - - -const std::string HttpTransaction::HostOnly() const -{ - std::string host = Header("host"); - size_t pos = host.find(":"); - if (pos != std::string::npos) - return host.substr(0, pos); - return host; -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetPragma(const std::string& value) -{ - SetHeader("pragma", value); -} - - -const std::string& HttpTransaction::Pragma() const -{ - return Header("pragma"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetReferer(const std::string& value) -{ - SetHeader("referer", value); -} - - -const std::string& HttpTransaction::Referer() const -{ - return Header("referer"); -} - - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::SetUserAgent(const std::string& value) -{ - SetHeader("user-agent", value); -} - - -const std::string& HttpTransaction::UserAgent() const -{ - return Header("user-agent"); -} - - -// -------------------------------------------------------------------------------------- -const Utility::ncmap& HttpTransaction::Headers() const -{ - return m_header; -} - - -// -------------------------------------------------------------------------------------- -void HttpTransaction::Reset() -{ - while (!m_header.empty()) - { - m_header.erase(m_header.begin()); - } -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.h deleted file mode 100755 index 89d2ba5b2a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpTransaction.h +++ /dev/null @@ -1,106 +0,0 @@ -/** - ** \file HttpTransaction.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_HttpTransaction_H -#define _SOCKETS_HttpTransaction_H - -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpTransaction -{ -public: - HttpTransaction(); - virtual ~HttpTransaction(); - - /** Set / Read http header value */ - void SetHeader(const std::string& key, const std::string& value); - void SetHeader(const std::string& key, long value); - const std::string& Header(const std::string& key) const; - - void SetAccept(const std::string& value); - const std::string& Accept() const; - - void SetAcceptCharset(const std::string& value); - const std::string& AcceptCharset() const; - - void SetAcceptEncoding(const std::string& value); - const std::string& AcceptEncoding() const; - - void SetAcceptLanguage(const std::string& value); - const std::string& AcceptLanguage() const; - - void SetConnection(const std::string& value); - const std::string& Connection() const; - - void SetContentType(const std::string& value); - const std::string& ContentType() const; - - void SetContentLength(long value); - long ContentLength() const; - - void SetHost(const std::string& value); - const std::string& Host() const; - const std::string HostOnly() const; - - void SetPragma(const std::string& value); - const std::string& Pragma() const; - - void SetReferer(const std::string& value); - const std::string& Referer() const; - - void SetUserAgent(const std::string& value); - const std::string& UserAgent() const; - - const Utility::ncmap& Headers() const; - - virtual void Reset(); - -private: - Utility::ncmap m_header; - std::string m_null; - -}; // end of class - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_HttpTransaction_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.cpp deleted file mode 100755 index 1b1c038ae8..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.cpp +++ /dev/null @@ -1,287 +0,0 @@ -/** \file HttpdCookies.cpp -*/ -/* -Copyright (C) 2003-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "Parse.h" -#include "HTTPSocket.h" -#include "HttpdCookies.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x; fflush(stderr); -#else -#define DEB(x) -#endif - - -HttpdCookies::HttpdCookies() -{ -} - -HttpdCookies::HttpdCookies(const std::string& s) -{ - Parse *pa = new Parse(s,";"); - - std::string slask = pa -> getword(); - while (slask.size()) - { - Parse *pa2 = new Parse(slask,"="); - std::string name = pa2 -> getword(); - std::string value = pa2 -> getword(); - delete pa2; - m_cookies.push_back(std::pair(name, value)); - // - slask = pa -> getword(); - } - delete pa; -} - -void HttpdCookies::add(const std::string& s) -{ - Parse *pa = new Parse(s,";"); -DEB(fprintf(stderr, "Parse cookie: %s\n", s.c_str());) - std::string slask = pa -> getword(); - while (slask.size()) - { - Parse *pa2 = new Parse(slask,"="); - std::string name = pa2 -> getword(); - std::string value = pa2 -> getword(); - delete pa2; - m_cookies.push_back(std::pair(name, value)); - // - slask = pa -> getword(); - } - delete pa; -} - -HttpdCookies::~HttpdCookies() -{ -} - -bool HttpdCookies::getvalue(const std::string& name,std::string& buffer) const -{ - for (cookie_v::const_iterator it = m_cookies.begin(); it != m_cookies.end(); ++it) - { - const std::pair& ref = *it; - if (!strcasecmp(ref.first.c_str(),name.c_str())) - { - buffer = ref.second; - return true; - } - } - buffer = ""; - return false; -} - -void HttpdCookies::replacevalue(const std::string& name,const std::string& value) -{ - for (cookie_v::iterator it = m_cookies.begin(); it != m_cookies.end(); ++it) - { - std::pair& ref = *it; - if (!strcasecmp(ref.first.c_str(),name.c_str())) - { - ref.second = value; - return; - } - } - m_cookies.push_back(std::pair(name, value)); - -} - -void HttpdCookies::replacevalue(const std::string& name,long l) -{ - replacevalue(name, Utility::l2string(l)); -} - -void HttpdCookies::replacevalue(const std::string& name,int i) -{ - replacevalue(name, Utility::l2string(i)); -} - -size_t HttpdCookies::getlength(const std::string& name) const -{ - for (cookie_v::const_iterator it = m_cookies.begin(); it != m_cookies.end(); ++it) - { - const std::pair& ref = *it; - if (!strcasecmp(ref.first.c_str(),name.c_str())) - { - return ref.second.size(); - } - } - return 0; -} - -void HttpdCookies::setcookie(HTTPSocket *sock, const std::string& domain, const std::string& path, const std::string& name, const std::string& value) -{ - size_t sz = name.size() + value.size() + domain.size() + path.size() + 100; - char *str = new char[sz]; - - // set-cookie response - if (domain.size()) - { - snprintf(str, sz, "%s=%s; domain=%s; path=%s; expires=%s", - name.c_str(), value.c_str(), - domain.c_str(), - path.c_str(), - expiredatetime().c_str()); - } - else - { - snprintf(str, sz, "%s=%s; path=%s; expires=%s", - name.c_str(), value.c_str(), - path.c_str(), - expiredatetime().c_str()); - } - sock -> AddResponseHeader("Set-cookie", str); - delete[] str; - - replacevalue(name, value); -} - -void HttpdCookies::setcookie(HTTPSocket *sock, const std::string& domain, const std::string& path, const std::string& name, long value) -{ - size_t sz = name.size() + domain.size() + path.size() + 100; - char *str = new char[sz]; - char dt[80]; - - // set-cookie response - if (domain.size()) - { - snprintf(str, sz, "%s=%ld; domain=%s; path=%s; expires=%s", - name.c_str(), value, - domain.c_str(), - path.c_str(), - expiredatetime().c_str()); - } - else - { - snprintf(str, sz, "%s=%ld; path=%s; expires=%s", - name.c_str(), value, - path.c_str(), - expiredatetime().c_str()); - } - sock -> AddResponseHeader("Set-cookie", str); - delete[] str; - - snprintf(dt, sizeof(dt), "%ld", value); - replacevalue(name, dt); -} - -void HttpdCookies::setcookie(HTTPSocket *sock, const std::string& domain, const std::string& path, const std::string& name, int value) -{ - size_t sz = name.size() + domain.size() + path.size() + 100; - char *str = new char[sz]; - char dt[80]; - - // set-cookie response - if (domain.size()) - { - snprintf(str, sz, "%s=%d; domain=%s; path=%s; expires=%s", - name.c_str(), value, - domain.c_str(), - path.c_str(), - expiredatetime().c_str()); - } - else - { - snprintf(str, sz, "%s=%d; path=%s; expires=%s", - name.c_str(), value, - path.c_str(), - expiredatetime().c_str()); - } - sock -> AddResponseHeader("Set-cookie", str); - delete[] str; - - snprintf(dt, sizeof(dt), "%d", value); - replacevalue(name, dt); -} - - -const std::string& HttpdCookies::expiredatetime() const -{ - const char *days[7] = {"Sunday", "Monday", - "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; - const char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", - "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; - char dt[100]; - - time_t t = time(NULL); -#ifdef __CYGWIN__ - struct tm *tp = gmtime(&t); - snprintf(dt, sizeof(dt), "%s, %02d-%s-%04d %02d:%02d:%02d GMT", - days[tp -> tm_wday], - tp -> tm_mday, - months[tp -> tm_mon], - tp -> tm_year + 1910, - tp -> tm_hour, - tp -> tm_min, - tp -> tm_sec); -#else - struct tm tp; -#if defined( _WIN32) && !defined(__CYGWIN__) - gmtime_s(&tp, &t); -#else - gmtime_r(&t, &tp); -#endif - snprintf(dt, sizeof(dt), "%s, %02d-%s-%04d %02d:%02d:%02d GMT", - days[tp.tm_wday], - tp.tm_mday, - months[tp.tm_mon], - tp.tm_year + 1910, - tp.tm_hour, - tp.tm_min, - tp.tm_sec); -#endif - m_date = dt; - return m_date; -} - - -void HttpdCookies::Reset() -{ - while (!m_cookies.empty()) - { - m_cookies.erase(m_cookies.begin()); - } - m_date = ""; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.h deleted file mode 100755 index 0cc0d1cbe3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdCookies.h +++ /dev/null @@ -1,94 +0,0 @@ -/** \file HttpdCookies.h -*/ -/* -Copyright (C) 2003-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ - -#ifndef _SOCKETS_HttpdCookies_H -#define _SOCKETS_HttpdCookies_H - -#include "sockets-config.h" -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -//! Store the cookies name/value pairs. - - - -//! Retrieve and manage cookies during a cgi call. -class HTTPSocket; - -/** HTTP Cookie parse/container class. -\sa HttpdSocket -\sa HttpdForm -\ingroup webserver */ -class HttpdCookies -{ - /** list of key/value structs. */ - typedef std::list > cookie_v; - -public: - HttpdCookies(); - HttpdCookies(const std::string& query_string); - ~HttpdCookies(); - - void add(const std::string& s); - - bool getvalue(const std::string&,std::string&) const; - void replacevalue(const std::string& ,const std::string& ); - void replacevalue(const std::string& ,long); - void replacevalue(const std::string& ,int); - size_t getlength(const std::string& ) const; - void setcookie(HTTPSocket *,const std::string& d,const std::string& p,const std::string& c,const std::string& v); - void setcookie(HTTPSocket *,const std::string& d,const std::string& p,const std::string& c,long v); - void setcookie(HTTPSocket *,const std::string& d,const std::string& p,const std::string& c,int v); - const std::string& expiredatetime() const; - - cookie_v& GetHttpdCookies() { - return m_cookies; - } - - void Reset(); - -private: - cookie_v m_cookies; - mutable std::string m_date; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpdCookies_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.cpp deleted file mode 100755 index 765fa3ece7..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.cpp +++ /dev/null @@ -1,717 +0,0 @@ -/** \file HttpdForm.cpp - read stdin, parse cgi input - ** - ** Written: 1999-Feb-10 grymse@alhem.net - **/ - -/* -Copyright (C) 1999-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "socket_include.h" -#include "Parse.h" -#include "IFile.h" -#include "HttpdForm.h" -#include "IFileUpload.h" -#include "IStream.h" -#include "File.h" - -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#define TMPSIZE 32000 -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -HttpdForm::HttpdForm(FILE *fil) -{ - const char *r_m = getenv("REQUEST_METHOD"); - const char *q_s = getenv("QUERY_STRING"); - if (r_m && !strcasecmp(r_m, "post")) - { - const char *c_t = getenv("CONTENT_TYPE"); - const char *c_l = getenv("CONTENT_LENGTH"); - if (c_t && c_l) - { - std::auto_ptr p = std::auto_ptr(new File(fil)); - ParseFormData( p.get(), c_t, atoi(c_l) ); - } - } - if (q_s && strlen(q_s)) - { - ParseQueryString(q_s, strlen(q_s)); - } -} - -HttpdForm::HttpdForm(IFile *infil, const std::string& content_type, size_t content_length) : raw(false) -, m_file_upload(NULL) -, m_upload_stream(NULL) -{ - ParseFormData(infil, content_type, content_length); -} - -// HttpdForm(buffer,l) -- request_method GET - -HttpdForm::HttpdForm(const std::string& buffer,size_t l) : raw(false) -, m_file_upload(NULL) -, m_upload_stream(NULL) -{ - ParseQueryString(buffer, l); -} - -void HttpdForm::ParseFormData(IFile *infil, const std::string& content_type, size_t content_length) -{ - CGI *cgi = NULL; - size_t extra = 2; - int cl = (int)content_length; - - m_current = m_cgi.end(); - - if (content_type.size() >= 19 && content_type.substr(0, 19) == "multipart/form-data") - { - Parse pa(content_type,";="); - char *tempcmp = NULL; - size_t tc = 0; - size_t l = 0; - std::string str = pa.getword(); - m_strBoundary = ""; - while (!str.empty()) - { - if (!strcmp(str.c_str(),"boundary")) - { - m_strBoundary = pa.getword(); - l = m_strBoundary.size(); - tempcmp = new char[l + extra]; - } - // - str = pa.getword(); - } - if (!m_strBoundary.empty()) - { - std::string content_type; - std::string current_name; - std::string current_filename; - char *slask = new char[TMPSIZE]; - infil -> fgets(slask, TMPSIZE); - cl -= (int)strlen(slask); - while (cl >= 0 && !infil -> eof()) - { - while (strlen(slask) && (slask[strlen(slask) - 1] == 13 || slask[strlen(slask) - 1] == 10)) - { - slask[strlen(slask) - 1] = 0; - } - content_type = ""; - current_name = ""; - current_filename = ""; - if ((strstr(slask,m_strBoundary.c_str()) || strstr(m_strBoundary.c_str(),slask)) && strcmp(slask, m_strBoundary.c_str())) - { - m_strBoundary = slask; - l = m_strBoundary.size(); - delete[] tempcmp; - tempcmp = new char[l + extra]; - } - if (!strcmp(slask, m_strBoundary.c_str())) - { - // Get headers until empty line - infil -> fgets(slask, TMPSIZE); - cl -= (int)strlen(slask); - while (strlen(slask) && (slask[strlen(slask) - 1] == 13 || slask[strlen(slask) - 1] == 10)) - { - slask[strlen(slask) - 1] = 0; - } - while (cl >= 0 && !infil -> eof() && *slask) - { - Parse pa(slask,":"); - std::string h = pa.getword(); - std::string h2 = pa.getrest(); - if (!strcasecmp(h.c_str(),"Content-type")) - { - Parse pa(h2, ";"); - content_type = pa.getword(); - } - else - if (!strcasecmp(h.c_str(),"Content-Disposition")) - { - Parse pa(h2, ";"); - h = pa.getword(); - if (!strcmp(h.c_str(),"form-data")) - { - pa.EnableQuote(true); - h = pa.getword(); - while (!h.empty()) - { - Parse pa2(h,"="); - std::string name = pa2.getword(); - h = pa2.getrest(); - if (!strcmp(name.c_str(),"name")) - { - if (!h.empty() && h[0] == '"') - { - current_name = h.substr(1, h.size() - 2); - } - else - { - current_name = h; - } - } - else - if (!strcmp(name.c_str(),"filename")) - { - if (!h.empty() && h[0] == '"') - { - current_filename = h.substr(1, h.size() - 2); - } - else - { - current_filename = h; - } - size_t x = 0; - for (size_t i = 0; i < current_filename.size(); i++) - { - if (current_filename[i] == '/' || current_filename[i] == '\\') - x = i + 1; - } - if (x) - { - current_filename = current_filename.substr(x); - } - } - h = pa.getword(); - } - } - } - // get next header value - infil -> fgets(slask, TMPSIZE); - cl -= (int)strlen(slask); - while (strlen(slask) && (slask[strlen(slask) - 1] == 13 || slask[strlen(slask) - 1] == 10)) - { - slask[strlen(slask) - 1] = 0; - } - } - // Read content, save...? - if (current_filename.empty()) // not a file - { - std::string val; - infil -> fgets(slask, TMPSIZE); - cl -= (int)strlen(slask); - while (cl >= 0 && !infil -> eof() && strncmp(slask,m_strBoundary.c_str(),m_strBoundary.size() )) - { - val += slask; - infil -> fgets(slask, TMPSIZE); - cl -= (int)strlen(slask); - } - // remove trailing cr/linefeed - while (!val.empty() && (val[val.size() - 1] == 13 || val[val.size() - 1] == 10)) - { - val = val.substr(0,val.size() - 1); - } - cgi = new CGI(current_name, val); - m_cgi.push_back(cgi); - if (!cl) - { - break; - } - } - else // current_filename.size() > 0 - { - // read until m_strBoundary... - IFile *fil = NULL; - int out = 0; - char c; - char fn[2000]; // where post'd file will be saved -#ifdef _WIN32 - { - char tmp_path[2000]; - ::GetTempPathA(2000, tmp_path); - if (tmp_path[strlen(tmp_path) - 1] != '\\') - { -#ifdef __CYGWIN__ - strcat(tmp_path, "\\"); -#else - strcat_s(tmp_path, sizeof(tmp_path), "\\"); -#endif - } - snprintf(fn,sizeof(fn),"%s%s",tmp_path,current_filename.c_str()); - } -#else - snprintf(fn,sizeof(fn),"/tmp/%s",current_filename.c_str()); -#endif - if (m_file_upload && !m_upload_stream) - m_upload_stream = &m_file_upload -> IFileUploadBegin(current_name, current_filename, content_type); - else - { - fil = new File; - if (!fil -> fopen(fn, "wb")) - { - delete fil; - fil = NULL; - } - } - if (fil || m_upload_stream) - { - infil -> fread(&c,1,1); - cl -= 1; - while (cl >= 0 && !infil -> eof()) - { - if (out) - { - if (m_upload_stream) - m_upload_stream -> IStreamWrite(&tempcmp[tc], 1); - else - fil -> fwrite(&tempcmp[tc],1,1); - } - tempcmp[tc] = c; - tc++; - if (tc >= l + extra) - { - tc = 0; - out = 1; - } - if (tc) - { - if (!strncmp(tempcmp + tc + extra, m_strBoundary.c_str(), l - tc) && - !strncmp(tempcmp, m_strBoundary.c_str() + l - tc, tc)) - { - break; - } - } - else - { - if (!strncmp(tempcmp + extra, m_strBoundary.c_str(), l)) - { - break; - } - } - infil -> fread(&c,1,1); - cl -= 1; - } - if (m_file_upload && m_upload_stream) - { - m_file_upload -> IFileUploadEnd(); - m_upload_stream = NULL; - } - else - if (fil) - { - fil -> fclose(); - delete fil; - } - - cgi = new CGI(current_name,fn,fn); - m_cgi.push_back(cgi); - -#if defined( _WIN32) && !defined(__CYGWIN__) - strcpy_s(slask, TMPSIZE, m_strBoundary.c_str()); -#else - strcpy(slask, m_strBoundary.c_str()); -#endif - size_t l = strlen(slask); - infil -> fgets(slask + l, TMPSIZE - (int)l); // next line - cl -= (int)strlen(slask + l); - } - else - { - // couldn't open file - break; - } - if (!cl) - { - break; - } - } - } - else - { - // Probably '--' - break; - } - } // while (!infil -> eof()) - delete[] slask; - } // if (m_strBoundary) - if (tempcmp) - { - delete[] tempcmp; - } - } // end of multipart - else - if (strstr(content_type.c_str(), "x-www-form-urlencoded")) - { - bool got_name = false; // tnx to FatherNitwit - int cl = (int)content_length; - char c,chigh,clow; - std::string slask; - m_current = m_cgi.end(); - std::string name; - - infil -> fread(&c,1,1); - cl--; - while (cl >= 0 && !infil -> eof()) - { - switch (c) // built-in url decoder - { - case '=': /* end of name */ - name = slask; - slask.resize(0); - got_name = true; - break; - case '&': /* end of value */ - if (got_name) - { - cgi = new CGI(name,slask); - got_name = false; - } - else - { - cgi = new CGI(slask, ""); - } - slask.resize(0); - m_cgi.push_back(cgi); - break; - case '+': /* space */ - slask += " "; - break; - case '%': /* hex value */ - infil -> fread(&chigh,1,1); - cl--; - chigh -= 48 + (chigh > '9' ? 7 : 0) + (chigh >= 'a' ? 32 : 0); - infil -> fread(&clow,1,1); - cl--; - clow -= 48 + (clow > '9' ? 7 : 0) + (clow >= 'a' ? 32 : 0); - slask += (char)(chigh * 16 + clow); - break; - default: /* just another char */ - slask += c; - break; - } - // - if (cl > 0) - { - infil -> fread(&c,1,1); - } - cl--; - } - if (got_name) - { - cgi = new CGI(name,slask); - } - else - { - cgi = new CGI(slask, ""); - } - m_cgi.push_back(cgi); - } - else // read other content up to a limit - if (content_length > 0 && content_length < 500000) - { - int ptr = 0; - int cl = (int)content_length; - m_content.resize(cl); - while (ptr < cl) - { - int remaining = cl - ptr; - int n = fread(&m_content[ptr], 1, remaining, stdin); - if (n > 0) - ptr += n; - } - } -} - - -void HttpdForm::ParseQueryString(const std::string& buffer,size_t l) -{ - CGI *cgi = NULL; - std::string slask; - std::string name; - char c,chigh,clow; - size_t ptr = 0; - bool got_name = false; - - m_current = m_cgi.end(); - - ptr = 0; - while (ptr < l) - { - c = buffer[ptr++]; - switch (c) - { - case '=': /* end of name */ - name = slask; - slask.resize(0); - got_name = true; - break; - case '&': /* end of value */ - if (got_name) - { - cgi = new CGI(name,slask); - got_name = false; - } - else - { - cgi = new CGI(slask, ""); - } - slask.resize(0); - m_cgi.push_back(cgi); - break; - case '+': /* space */ - slask += " "; - break; - case '%': /* hex value */ - chigh = buffer[ptr++]; - chigh -= 48 + (chigh > '9' ? 7 : 0) + (chigh >= 'a' ? 32 : 0); - clow = buffer[ptr++]; - clow -= 48 + (clow > '9' ? 7 : 0) + (clow >= 'a' ? 32 : 0); - slask += (char)(chigh * 16 + clow); - break; - default: /* just another char */ - slask += c; - break; - } - } - if (got_name) - { - cgi = new CGI(name,slask); - } - else - { - cgi = new CGI(slask, ""); - } - m_cgi.push_back(cgi); -} - - -HttpdForm::~HttpdForm() -{ - CGI *cgi = NULL; //,*tmp; - - for (cgi_v::iterator it = m_cgi.begin(); it != m_cgi.end(); ++it) - { - cgi = *it; - delete cgi; - } -} - - -void HttpdForm::EnableRaw(bool b) -{ - raw = b; -} - - -void HttpdForm::strcpyval(std::string& v,const char *value) const -{ - v = ""; - for (size_t i = 0; i < strlen(value); i++) - { - if (value[i] == '<') - { - v += "<"; - } - else - if (value[i] == '>') - { - v += ">"; - } - else - if (value[i] == '&') - { - v += "&"; - } - else - { - v += value[i]; - } - } -} - - -bool HttpdForm::getfirst(std::string& n) const -{ - m_current = m_cgi.begin(); - return getnext(n); -} - - -bool HttpdForm::getnext(std::string& n) const -{ - if (m_current != m_cgi.end() ) - { - CGI *current = *m_current; - n = current -> name; - m_current++; - return true; - } - else - { - n = ""; - } - return false; -} - - -bool HttpdForm::getfirst(std::string& n,std::string& v) const -{ - m_current = m_cgi.begin(); - return getnext(n,v); -} - - -bool HttpdForm::getnext(std::string& n,std::string& v) const -{ - if (m_current != m_cgi.end() ) - { - CGI *current = *m_current; - n = current -> name; - if (raw) - { - v = current -> value; - } - else - { - strcpyval(v,current -> value.c_str()); - } - m_current++; - return true; - } - else - { - n = ""; - } - return false; -} - - -int HttpdForm::getvalue(const std::string& n,std::string& v) const -{ - CGI *cgi = NULL; - int r = 0; - - for (cgi_v::const_iterator it = m_cgi.begin(); it != m_cgi.end(); ++it) - { - cgi = *it; - if (cgi -> name == n) - break; - cgi = NULL; - } - if (cgi) - { - if (raw) - { - v = cgi -> value; - } - else - { - strcpyval(v,cgi -> value.c_str()); - } - r++; - } - else - { - v = ""; - } - - return r; -} - - -std::string HttpdForm::getvalue(const std::string& n) const -{ - for (cgi_v::const_iterator it = m_cgi.begin(); it != m_cgi.end(); ++it) - { - CGI *cgi = *it; - if (cgi -> name == n) - { - return cgi -> value; - } - } - return ""; -} - - -size_t HttpdForm::getlength(const std::string& n) const -{ - CGI *cgi = NULL; - size_t l; - - for (cgi_v::const_iterator it = m_cgi.begin(); it != m_cgi.end(); ++it) - { - cgi = *it; - if (cgi -> name == n) - break; - cgi = NULL; - } - l = cgi ? cgi -> value.size() : 0; - if (cgi && !raw) - { - for (size_t i = 0; i < cgi -> value.size(); i++) - { - switch (cgi -> value[i]) - { - case '<': // < - case '>': // > - l += 4; - break; - case '&': // & - l += 5; - break; - } - } - } - return l; -} - - -HttpdForm::cgi_v& HttpdForm::getbase() -{ - return m_cgi; -} - - -const std::string& HttpdForm::GetBoundary() const -{ - return m_strBoundary; -} - - -void HttpdForm::SetFileUpload(IFileUpload& cb) -{ - m_file_upload = &cb; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.h deleted file mode 100755 index c58de69a0e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdForm.h +++ /dev/null @@ -1,147 +0,0 @@ -/** \file HttpdForm.h - read stdin, parse cgi input - ** - ** Written: 1999-Feb-10 grymse@alhem.net - **/ - -/* -Copyright (C) 1999-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ - -#ifndef _SOCKETS_HttpdForm_H -#define _SOCKETS_HttpdForm_H - -#include "sockets-config.h" -#include -#include -#include -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class IFile; -class IFileUpload; -class IStream; - -/** Parse/store a http query_string/form-data body. - \ingroup webserver */ -class HttpdForm -{ - /** - * Store the name/value pairs from a GET/POST operation. - * "name" does not have to be unique. - \ingroup webserver - */ - struct CGI { - CGI(const std::string& n,const std::string& v) : name(n),value(v) {} - CGI(const std::string& n,const std::string& v,const std::string& p) : name(n),value(v),path(p) {} - std::string name; - std::string value; - std::string path; - }; - /** list of key/value pairs. */ - typedef std::list cgi_v; - -public: - /** - * Default constructor - */ - HttpdForm(FILE *); - /** - * Constructor (used in POST operations). - * Input is read from stdin. Number of characters to read - * can be found in the environment variable CONTENT_LENGTH. - */ - HttpdForm(IFile *, const std::string& content_type, size_t content_length); - /** - * Another constructor (used in GET operations). - * Input is read from the environment variable QUERY_STRING. - * @param query_string The httpd server provided QUERY_STRING - * @param length Query string length. - */ - HttpdForm(const std::string& query_string,size_t length); - ~HttpdForm(); - - void ParseFormData(IFile *, const std::string&, size_t); - void ParseQueryString(const std::string& query_string, size_t length); - - void EnableRaw(bool); - - /** Encode characters '<' '>' '&' as < > & */ - void strcpyval(std::string&,const char *) const; - - /* get names */ - bool getfirst(std::string& n) const; - bool getnext(std::string& n) const; - - /* get names and values */ - bool getfirst(std::string& n,std::string& v) const; - bool getnext(std::string& n,std::string& v) const; - - /* get value */ - int getvalue(const std::string& ,std::string& ) const; - std::string getvalue(const std::string& ) const; - size_t getlength(const std::string& ) const; - cgi_v& getbase(); - - const std::string& GetBoundary() const; - - /** Enable IFileUpload callback */ - void SetFileUpload(IFileUpload& cb); - - bool ContentAvailable() const { - return !m_content.empty(); - } - const std::vector& GetContent() const { - return m_content; - } - -private: - HttpdForm(const HttpdForm& ) {} - HttpdForm& operator=(const HttpdForm& ) { - return *this; - } - cgi_v m_cgi; - mutable cgi_v::const_iterator m_current; - std::string m_strBoundary; - bool raw; - IFileUpload *m_file_upload; - IStream *m_upload_stream; - std::vector m_content; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpdForm_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.cpp deleted file mode 100755 index 40e5c33926..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.cpp +++ /dev/null @@ -1,326 +0,0 @@ -/** \file HttpdSocket.cpp -*/ -/* -Copyright (C) 2001-2010 Anders Hedstrom (grymse@alhem.net) - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "HttpdCookies.h" -#include "HttpdForm.h" -#include "MemFile.h" -#include "HttpdSocket.h" -#include "Base64.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#define TMPSIZE 10000 - - -// statics -int HttpdSocket::m_request_count = 0; -std::string HttpdSocket::m_start = ""; - - -HttpdSocket::HttpdSocket(ISocketHandler& h) -:HTTPSocket(h) -,m_content_length(0) -,m_file(NULL) -,m_received(0) -,m_request_id(++m_request_count) -,m_cookies(NULL) -,m_form(NULL) -{ - m_http_date = datetime2httpdate(GetDate()); - if (!m_start.size()) - m_start = m_http_date; -} - - -HttpdSocket::~HttpdSocket() -{ - if (m_file) - { - delete m_file; - } - if (m_cookies) - delete m_cookies; - if (m_form) - delete m_form; -} - - -void HttpdSocket::OnFirst() -{ -} - - -void HttpdSocket::OnHeader(const std::string& key,const std::string& value) -{ - if (!strcasecmp(key.c_str(),"content-length")) - { - m_content_length = atoi(value.c_str()); - m_content_length_str = value; - } - else - if (!strcasecmp(key.c_str(),"cookie")) - { - m_http_cookie = value; - } - else - if (!strcasecmp(key.c_str(),"content-type")) - { - m_content_type = value; - } - else - if (!strcasecmp(key.c_str(),"if-modified-since")) - { - m_if_modified_since = value; - } -} - - -void HttpdSocket::OnHeaderComplete() -{ - m_cookies = new HttpdCookies(m_http_cookie); - - if (GetMethod() == "GET") - { - Utility::SetEnv("QUERY_STRING", GetQueryString()); - } - Utility::SetEnv("REQUEST_METHOD", GetMethod()); - Utility::SetEnv("HTTP_COOKIE", m_http_cookie); - Utility::SetEnv("CONTENT_TYPE", m_content_type); - Utility::SetEnv("CONTENT_LENGTH", m_content_length_str); - if (GetMethod() == "POST") - { - m_file = new MemFile; - } - else - if (GetMethod() == "GET") - { - m_form = new HttpdForm(GetQueryString(), GetQueryString().size() ); - AddResponseHeader("Date", datetime2httpdate(GetDate()) ); - if (GetUri() == "/image") - { - Send64(Utility::Logo, "image/png"); - } - else - { - Exec(); - } - Reset(); // prepare for next request - } - else - { - AddResponseHeader("Date", GetHttpDate()); - AddResponseHeader("Connection", "close"); - SetStatus("405"); - SetStatusText("Method not allowed"); - SendResponse(); - } -} - - -void HttpdSocket::OnData(const char *p,size_t l) -{ - if (m_file) - { - m_file -> fwrite(p,1,l); - } - m_received += l; - if (m_received >= m_content_length && m_content_length) - { - // all done - if (m_file && !m_form) - { - m_form = new HttpdForm(m_file, m_content_type, m_content_length); - AddResponseHeader("Date", datetime2httpdate(GetDate()) ); - if (GetUri() == "/image") - { - Send64(Utility::Logo, "image/png"); - } - else - { - Exec(); - } - Reset(); // prepare for next request - } - } -} - - -void HttpdSocket::Send64(const std::string& str64, const std::string& type) -{ - Base64 bb; - - if (!strcasecmp(m_start.c_str(), m_if_modified_since.c_str())) - { - SetStatus("304"); - SetStatusText("Not Modified"); - SendResponse(); - } - else - { - size_t len = bb.decode_length(str64); - unsigned char *buf = new unsigned char[len]; - - SetStatus("200"); - SetStatusText("OK"); - - AddResponseHeader("Content-length", Utility::l2string( (long)len) ); - AddResponseHeader("Content-type", type ); - AddResponseHeader("Last-modified", m_start); - SendResponse(); - - bb.decode(str64, buf, len); - SendBuf( (char *)buf, len); - delete[] buf; - } -} - - -std::string HttpdSocket::datetime2httpdate(const std::string& dt) -{ - struct tm tp; - time_t t; - const char *days[] = { "Sun","Mon","Tue","Wed","Thu","Fri","Sat" }; - const char *months[] = { "Jan","Feb","Mar","Apr","May","Jun", - "Jul","Aug","Sep","Oct","Nov","Dec" }; - int i; - char s[40]; - -/* 1997-12-16 09:50:40 */ - - if (dt.size() == 19) - { - tp.tm_year = atoi(dt.substr(0,4).c_str()) - 1900; - i = atoi(dt.substr(5,2).c_str()) - 1; - tp.tm_mon = i >= 0 ? i : 0; - tp.tm_mday = atoi(dt.substr(8,2).c_str()); - tp.tm_hour = atoi(dt.substr(11,2).c_str()); - tp.tm_min = atoi(dt.substr(14,2).c_str()); - tp.tm_sec = atoi(dt.substr(17,2).c_str()); - tp.tm_wday = 0; - tp.tm_yday = 0; - tp.tm_isdst = 0; - t = mktime(&tp); - if (t == -1) - { - Handler().LogError(this, "datetime2httpdate", 0, "mktime() failed"); - } - - snprintf(s,sizeof(s),"%s, %02d %s %d %02d:%02d:%02d GMT", - days[tp.tm_wday], - tp.tm_mday, - months[tp.tm_mon], - tp.tm_year + 1900, - tp.tm_hour,tp.tm_min,tp.tm_sec); - } - else - { - *s = 0; - } - return s; -} - - -std::string HttpdSocket::GetDate() -{ - time_t t = time(NULL); - char slask[40]; // yyyy-mm-dd hh:mm:ss -#ifdef __CYGWIN__ - struct tm *tp = localtime(&t); - snprintf(slask,sizeof(slask),"%d-%02d-%02d %02d:%02d:%02d", - tp -> tm_year + 1900, - tp -> tm_mon + 1, - tp -> tm_mday, - tp -> tm_hour,tp -> tm_min,tp -> tm_sec); -#else - struct tm tp; -#if defined( _WIN32) && !defined(__CYGWIN__) - localtime_s(&tp, &t); -#else - localtime_r(&t, &tp); -#endif - snprintf(slask,sizeof(slask),"%d-%02d-%02d %02d:%02d:%02d", - tp.tm_year + 1900, - tp.tm_mon + 1, - tp.tm_mday, - tp.tm_hour,tp.tm_min,tp.tm_sec); -#endif - return slask; -} - - -void HttpdSocket::Reset() -{ - HTTPSocket::Reset(); - m_content_length = 0; - if (m_file) - { - delete m_file; - m_file = NULL; - } - m_received = 0; - m_request_id = ++m_request_count; - if (m_cookies) - delete m_cookies; - m_cookies = NULL; - if (m_form) - delete m_form; - m_form = NULL; -} - - -const std::string& HttpdSocket::GetHttpDate() const -{ - return m_http_date; -} - - -HttpdCookies *HttpdSocket::GetCookies() -{ - return m_cookies; -} - - -const HttpdForm *HttpdSocket::GetForm() const -{ - return m_form; -} - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.h deleted file mode 100755 index f28cdf5573..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/HttpdSocket.h +++ /dev/null @@ -1,117 +0,0 @@ -/** \file HttpdSocket.h -*/ -/* -Copyright (C) 2001-2010 Anders Hedstrom (grymse@alhem.net) - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_HttpdSocket_H -#define _SOCKETS_HttpdSocket_H - -#include "sockets-config.h" -#include "HTTPSocket.h" -#include "ISocketHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpdCookies; -class HttpdForm; -class IFile; - -/** \defgroup webserver Webserver framework */ -/** Web server socket framework. - \ingroup webserver */ -class HttpdSocket : public HTTPSocket -{ -public: - HttpdSocket(ISocketHandler& ); - ~HttpdSocket(); - - void OnFirst(); - void OnHeader(const std::string& key,const std::string& value); - void OnHeaderComplete(); - void OnData(const char *,size_t); - - /** This method needs to be implemented with logic to produce - a response to an incoming request. */ - virtual void Exec() = 0; - /** Get current date in http rfc format. */ - const std::string& GetHttpDate() const; - /** Get pointer to cookie class. */ - HttpdCookies *GetCookies(); - /** Get pointer to query string/form data class. */ - const HttpdForm *GetForm() const; - - size_t ContentLength() const { - return m_content_length; - } - const IFile *Body() const { - return m_file; - } - int RequestId() const { - return m_request_id; - } - -protected: - HttpdSocket(const HttpdSocket& s) : HTTPSocket(s) {} - /** Decode and send a base64-encoded string. - \param str64 Base64-encoded string - \param type Mime type of content (content-type header) */ - void Send64(const std::string& str64, const std::string& type); - std::string datetime2httpdate(const std::string& dt); - std::string GetDate(); - void Reset(); - // headers - std::string m_http_cookie; - std::string m_content_type; - std::string m_content_length_str; - std::string m_if_modified_since; - -private: - HttpdSocket& operator=(const HttpdSocket& s) { - return *this; - } - static int m_request_count; - static std::string m_start; - size_t m_content_length; - IFile *m_file; - size_t m_received; - int m_request_id; - std::string m_http_date; - HttpdCookies *m_cookies; - HttpdForm *m_form; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_HttpdSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IBase.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IBase.h deleted file mode 100755 index 49449b0434..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IBase.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - ** \file - ** \date 2007-06-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -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. -*/ -#ifndef _SOCKETS_IBase_H -#define _SOCKETS_IBase_H - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class IBase -{ -public: - virtual ~IBase() {} - -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_IBase_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventHandler.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventHandler.h deleted file mode 100755 index 16ee1c237c..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventHandler.h +++ /dev/null @@ -1,78 +0,0 @@ -/** \file IEventHandler.h - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_IEventHandler_H -#define _SOCKETS_IEventHandler_H - -#include "sockets-config.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class IEventOwner; - -/** Timer event handler pure virtual base class. - \ingroup timer */ -class IEventHandler -{ -public: - virtual ~IEventHandler() {} - - /** Return time left until next event. - \param tv Time struct that will be filled by method - \return true if time is set for next event */ - virtual bool GetTimeUntilNextEvent(struct timeval *) = 0; - /** Will fire events whose time has come. */ - virtual void CheckEvents() = 0; - /** Schedule event for an owner. - \param from Event owner - \param sec Seconds until event - \param usec Microseconds until event */ - virtual long AddEvent(IEventOwner *,long sec,long usec) = 0; - /** Clear all events for a specific owner. */ - virtual void ClearEvents(IEventOwner *) = 0; - /** Remove one specific event for an event owner. */ - virtual void RemoveEvent(IEventOwner *,long) = 0; - -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_IEventHandler_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.cpp deleted file mode 100755 index a2ac5b70df..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/** \file IEventOwner.cpp - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "IEventOwner.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -IEventOwner::IEventOwner(IEventHandler& h) : m_event_handler(h), m_handler_invalid(false) -{ -} - - -IEventOwner::~IEventOwner() -{ - if (!m_handler_invalid) - { - m_event_handler.ClearEvents(this); - } -} - - -IEventHandler& IEventOwner::GetEventHandler() -{ - return m_event_handler; -} - - -long IEventOwner::AddEvent(long sec,long usec) -{ - return m_event_handler.AddEvent(this, sec, usec); -} - - -void IEventOwner::ClearEvents() -{ - m_event_handler.ClearEvents(this); -} - - -void IEventOwner::RemoveEvent(long eid) -{ - m_event_handler.RemoveEvent(this, eid); -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.h deleted file mode 100755 index 4c4857b1a1..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IEventOwner.h +++ /dev/null @@ -1,82 +0,0 @@ -/** \file IEventOwner.h - ** \date 2005-12-07 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_IEventOwner_H -#define _SOCKETS_IEventOwner_H - -#include "sockets-config.h" -#include "IEventHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Any class that wants to use timer events inherits this. - \ingroup timer */ -class IEventOwner -{ -public: - IEventOwner(IEventHandler& h); - virtual ~IEventOwner(); - - /** Schedule event. - \param sec Seconds until event - \param usec Microseconds until event - \return Event ID */ - long AddEvent(long sec,long usec); - /** Clear all events scheduled by this owner. */ - void ClearEvents(); - /** Remove one event scheduled by this owner. - \param eid Event ID to remove */ - void RemoveEvent(long eid); - /** Event callback will fire when time is up. */ - virtual void OnEvent(int) = 0; - - IEventHandler& GetEventHandler(); - void SetHandlerInvalid(bool x = true) { - m_handler_invalid = x; - } - -private: - IEventHandler& m_event_handler; - bool m_handler_invalid; -}; - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_IEventOwner_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFile.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFile.h deleted file mode 100755 index 847b2c7610..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFile.h +++ /dev/null @@ -1,75 +0,0 @@ -/** \file IFile.h - ** \date 2005-04-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_IFile_H -#define _SOCKETS_IFile_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** \defgroup file File handling */ -/** Pure virtual file I/O interface. - \ingroup file */ -class IFile -{ -public: - virtual ~IFile() {} - - virtual bool fopen(const std::string&, const std::string&) = 0; - virtual void fclose() const = 0; - - virtual size_t fread(char *, size_t, size_t) const = 0; - virtual size_t fwrite(const char *, size_t, size_t) = 0; - - virtual char *fgets(char *, int) const = 0; - virtual void fprintf(const char *format, ...) = 0; - - virtual off_t size() const = 0; - virtual bool eof() const = 0; - - virtual void reset_read() const = 0; - virtual void reset_write() = 0; - - virtual const std::string& Path() const = 0; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_IFile_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFileUpload.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFileUpload.h deleted file mode 100755 index a697ee7cf2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IFileUpload.h +++ /dev/null @@ -1,61 +0,0 @@ -/** \file IFileUpload.h - ** \date 2009-04-22 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_IFileUpload_H -#define _SOCKETS_IFileUpload_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IStream; - -/** Multipart form file upload callback. - \ingroup webserver */ -class IFileUpload -{ -public: - virtual ~IFileUpload() {} - - virtual IStream& IFileUploadBegin(const std::string& input_name, const std::string& filename, const std::string& content_type) = 0; - - virtual void IFileUploadEnd() = 0; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_IFileUpload_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IHttpServer.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IHttpServer.h deleted file mode 100755 index 545b563643..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IHttpServer.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - ** \file IHttpServer.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_IHttpServer_H -#define _SOCKETS_IHttpServer_H - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class HttpRequest; -class HttpResponse; - -class IHttpServer -{ -public: - virtual ~IHttpServer() {} - - /** Complete request has been received and parsed. Send response - using the Respond() method. */ - virtual void OnExec(const HttpRequest& req) = 0; - - /** Send response. */ - virtual void Respond(const HttpResponse& res) = 0; - - /** Called when the body part of the response has been sent. */ - virtual void OnResponseComplete() = 0; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_IHttpServer_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IMutex.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IMutex.h deleted file mode 100755 index 031fcad38a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IMutex.h +++ /dev/null @@ -1,58 +0,0 @@ -/** \file IMutex.h - ** \date 2008-10-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_IMutex_H -#define _SOCKETS_IMutex_H - -#include "sockets-config.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** IMutex interface. - \ingroup threading */ -class IMutex -{ -public: - virtual ~IMutex() {} - - virtual void Lock() const = 0; - virtual void Unlock() const = 0; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif -#endif // _SOCKETS_IMutex_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ISocketHandler.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ISocketHandler.h deleted file mode 100755 index 4926489a00..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ISocketHandler.h +++ /dev/null @@ -1,262 +0,0 @@ -/** \file ISocketHandler.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_ISocketHandler_H -#define _SOCKETS_ISocketHandler_H -#include "sockets-config.h" - -#include -#include - -#include "socket_include.h" -#include "Socket.h" -#include "StdLog.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class SocketAddress; -class IMutex; - - -/** Socket container class, event generator. - \ingroup basic */ -class ISocketHandler -{ - friend class Socket; - -public: - /** Connection pool class for internal use by the ISocketHandler. - \ingroup internal */ -#ifdef ENABLE_POOL - class PoolSocket : public Socket - { - public: - PoolSocket(ISocketHandler& h,Socket *src) : Socket(h) { - CopyConnection( src ); - SetIsClient(); - } - - void OnRead() { - Handler().LogError(this, "OnRead", 0, "data on hibernating socket", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - void OnOptions(int,int,int,SOCKET) {} - - }; -#endif - -public: - virtual ~ISocketHandler() {} - - /** Return another instance */ - virtual ISocketHandler *Create(StdLog * = NULL) = 0; - - /** Return another instance */ - virtual ISocketHandler *Create(IMutex&, ISocketHandler&, StdLog * = NULL) = 0; - - /** Handler created with parent */ - virtual bool ParentHandlerIsValid() = 0; - - /** Get parent sockethandler */ - virtual ISocketHandler& ParentHandler() = 0; - - /** Get thread handler with least connections */ - virtual ISocketHandler& GetRandomHandler() = 0; - - /** Return parent handler if valid, otherwise return normal handler */ - virtual ISocketHandler& GetEffectiveHandler() = 0; - - /** Enable threading */ - virtual void SetNumberOfThreads(size_t n) = 0; - - /** Threading is enabled */ - virtual bool IsThreaded() = 0; - - /** Enable select release */ - virtual void EnableRelease() = 0; - - /** Make select release */ - virtual void Release() = 0; - - /** Get mutex reference for threadsafe operations. */ - virtual IMutex& GetMutex() const = 0; - - /** Register StdLog object for error callback. - \param log Pointer to log class */ - virtual void RegStdLog(StdLog *log) = 0; - - /** Log error to log class for print out / storage. */ - virtual void LogError(Socket *p,const std::string& user_text,int err,const std::string& sys_err,loglevel_t t = LOG_LEVEL_WARNING) = 0; - - // ------------------------------------------------------------------------- - // Socket stuff - // ------------------------------------------------------------------------- - /** Add socket instance to socket map. Removal is always automatic. */ - virtual void Add(Socket *) = 0; - -protected: - /** Remove socket from socket map, used by Socket class. */ - virtual void Remove(Socket *) = 0; - - /** Actual call to select() */ - virtual int ISocketHandler_Select(struct timeval *) = 0; - -public: - /** Set read/write/exception file descriptor sets (fd_set). */ - virtual void ISocketHandler_Add(Socket *,bool bRead,bool bWrite) = 0; - virtual void ISocketHandler_Mod(Socket *,bool bRead,bool bWrite) = 0; - virtual void ISocketHandler_Del(Socket *) = 0; - - /** Wait for events, generate callbacks. */ - virtual int Select(long sec,long usec) = 0; - /** This method will not return until an event has been detected. */ - virtual int Select() = 0; - /** Wait for events, generate callbacks. */ - virtual int Select(struct timeval *tsel) = 0; - - /** Check that a socket really is handled by this socket handler. */ - virtual bool Valid(Socket *) = 0; - /** Preferred method - Check that a socket still is handled by this socket handler. */ - virtual bool Valid(socketuid_t) = 0; - - /** Return number of sockets handled by this handler. */ - virtual size_t GetCount() = 0; - - /** Return maximum number of sockets allowed. */ - virtual size_t MaxCount() = 0; - - /** Override and return false to deny all incoming connections. - \param p ListenSocket class pointer (use GetPort to identify which one) */ - virtual bool OkToAccept(Socket *p) = 0; - - /** Use with care, always lock with h.GetMutex() if multithreaded */ - virtual const std::map& AllSockets() = 0; - - /** Override to accept longer lines than TCP_LINE_SIZE */ - virtual size_t MaxTcpLineSize() = 0; - - virtual void SetCallOnConnect(bool = true) = 0; - virtual void SetDetach(bool = true) = 0; - virtual void SetTimeout(bool = true) = 0; - virtual void SetRetry(bool = true) = 0; - virtual void SetClose(bool = true) = 0; - - - // ------------------------------------------------------------------------- - // Connection pool - // ------------------------------------------------------------------------- -#ifdef ENABLE_POOL - /** Find available open connection (used by connection pool). */ - virtual ISocketHandler::PoolSocket *FindConnection(int type,const std::string& protocol,SocketAddress&) = 0; - /** Enable connection pool (by default disabled). */ - virtual void EnablePool(bool = true) = 0; - /** Check pool status. - \return true if connection pool is enabled */ - virtual bool PoolEnabled() = 0; -#endif // ENABLE_POOL - - // ------------------------------------------------------------------------- - // Socks4 - // ------------------------------------------------------------------------- -#ifdef ENABLE_SOCKS4 - /** Set socks4 server ip that all new tcp sockets should use. */ - virtual void SetSocks4Host(ipaddr_t) = 0; - /** Set socks4 server hostname that all new tcp sockets should use. */ - virtual void SetSocks4Host(const std::string& ) = 0; - /** Set socks4 server port number that all new tcp sockets should use. */ - virtual void SetSocks4Port(port_t) = 0; - /** Set optional socks4 userid. */ - virtual void SetSocks4Userid(const std::string& ) = 0; - /** If connection to socks4 server fails, immediately try direct connection to final host. */ - virtual void SetSocks4TryDirect(bool = true) = 0; - /** Get socks4 server ip. - \return socks4 server ip */ - virtual ipaddr_t GetSocks4Host() = 0; - /** Get socks4 port number. - \return socks4 port number */ - virtual port_t GetSocks4Port() = 0; - /** Get socks4 userid (optional). - \return socks4 userid */ - virtual const std::string& GetSocks4Userid() = 0; - /** Check status of socks4 try direct flag. - \return true if direct connection should be tried if connection to socks4 server fails */ - virtual bool Socks4TryDirect() = 0; -#endif // ENABLE_SOCKS4 - - // ------------------------------------------------------------------------- - // DNS resolve server - // ------------------------------------------------------------------------- -#ifdef ENABLE_RESOLVER - /** Enable asynchronous DNS. - \param port Listen port of asynchronous dns server */ - virtual void EnableResolver(port_t = 16667) = 0; - /** Check resolver status. - \return true if resolver is enabled */ - virtual bool ResolverEnabled() = 0; - /** Queue a dns request. - \param host Hostname to be resolved - \param port Port number will be echoed in Socket::OnResolved callback */ - virtual int Resolve(Socket *,const std::string& host,port_t port) = 0; -#ifdef ENABLE_IPV6 - virtual int Resolve6(Socket *,const std::string& host,port_t port) = 0; -#endif - /** Do a reverse dns lookup. */ - virtual int Resolve(Socket *,ipaddr_t a) = 0; -#ifdef ENABLE_IPV6 - virtual int Resolve(Socket *,in6_addr& a) = 0; -#endif - /** Get listen port of asynchronous dns server. */ - virtual port_t GetResolverPort() = 0; - /** Resolver thread ready for queries. */ - virtual bool ResolverReady() = 0; - /** Returns true if socket waiting for a resolve event. */ - virtual bool Resolving(Socket *) = 0; -#endif // ENABLE_RESOLVER - -#ifdef ENABLE_DETACH - /** Indicates that the handler runs under SocketThread. */ - virtual void SetSlave(bool x = true) = 0; - /** Indicates that the handler runs under SocketThread. */ - virtual bool IsSlave() = 0; -#endif // ENABLE_DETACH - -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_ISocketHandler_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IStream.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IStream.h deleted file mode 100755 index 0ac47408ad..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/IStream.h +++ /dev/null @@ -1,61 +0,0 @@ -/** \file IStream.h - ** \date 2008-11-15 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_IStream_H -#define _SOCKETS_IStream_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IStream -{ -public: - virtual ~IStream() {} - - /** Try to read 'buf_sz' number of bytes from source. - \return Number of bytes actually read. */ - virtual size_t IStreamRead(char *buf, size_t buf_sz) = 0; - - /** Write 'sz' bytes to destination. */ - virtual void IStreamWrite(const char *buf, size_t sz) = 0; - -}; - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_IStream_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.cpp deleted file mode 100755 index 0c0ab82a08..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/** - ** \file Ipv4Address.cpp - ** \date 2006-09-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "Ipv4Address.h" -#include "Utility.h" -#ifndef _WIN32 -#include -#endif - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - - -Ipv4Address::Ipv4Address(port_t port) : m_valid(true) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin_family = AF_INET; - m_addr.sin_port = htons( port ); -} - - -Ipv4Address::Ipv4Address(ipaddr_t a,port_t port) : m_valid(true) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin_family = AF_INET; - m_addr.sin_port = htons( port ); - memcpy(&m_addr.sin_addr, &a, sizeof(struct in_addr)); -} - - -Ipv4Address::Ipv4Address(struct in_addr& a,port_t port) : m_valid(true) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin_family = AF_INET; - m_addr.sin_port = htons( port ); - m_addr.sin_addr = a; -} - - -Ipv4Address::Ipv4Address(const std::string& host,port_t port) : m_valid(false) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin_family = AF_INET; - m_addr.sin_port = htons( port ); - { - ipaddr_t a; - if (Utility::u2ip(host, a)) - { - memcpy(&m_addr.sin_addr, &a, sizeof(struct in_addr)); - m_valid = true; - } - } -} - - -Ipv4Address::Ipv4Address(struct sockaddr_in& sa) -{ - m_addr = sa; - m_valid = sa.sin_family == AF_INET; -} - - -Ipv4Address::~Ipv4Address() -{ -} - - -Ipv4Address::operator struct sockaddr *() -{ - return (struct sockaddr *)&m_addr; -} - - -Ipv4Address::operator socklen_t() -{ - return sizeof(struct sockaddr_in); -} - - -void Ipv4Address::SetPort(port_t port) -{ - m_addr.sin_port = htons( port ); -} - - -port_t Ipv4Address::GetPort() -{ - return ntohs( m_addr.sin_port ); -} - - -bool Ipv4Address::Resolve(const std::string& hostname,struct in_addr& a) -{ - struct sockaddr_in sa; - memset(&a, 0, sizeof(a)); - if (Utility::isipv4(hostname)) - { - if (!Utility::u2ip(hostname, sa, AI_NUMERICHOST)) - return false; - a = sa.sin_addr; - return true; - } - if (!Utility::u2ip(hostname, sa)) - return false; - a = sa.sin_addr; - return true; -} - - -bool Ipv4Address::Reverse(struct in_addr& a,std::string& name) -{ - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_addr = a; - return Utility::reverse((struct sockaddr *)&sa, sizeof(sa), name); -} - - -std::string Ipv4Address::Convert(bool include_port) -{ - if (include_port) - return Convert(m_addr.sin_addr) + ":" + Utility::l2string(GetPort()); - return Convert(m_addr.sin_addr); -} - - -std::string Ipv4Address::Convert(struct in_addr& a) -{ - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_addr = a; - std::string name; - Utility::reverse((struct sockaddr *)&sa, sizeof(sa), name, NI_NUMERICHOST); - return name; -} - - -void Ipv4Address::SetAddress(struct sockaddr *sa) -{ - memcpy(&m_addr, sa, sizeof(struct sockaddr_in)); -} - - -int Ipv4Address::GetFamily() -{ - return m_addr.sin_family; -} - - -bool Ipv4Address::IsValid() -{ - return m_valid; -} - - -bool Ipv4Address::operator==(SocketAddress& a) -{ - if (a.GetFamily() != GetFamily()) - return false; - if ((socklen_t)a != sizeof(m_addr)) - return false; - struct sockaddr *sa = a; - struct sockaddr_in *p = (struct sockaddr_in *)sa; - if (p -> sin_port != m_addr.sin_port) - return false; - if (memcmp(&p -> sin_addr, &m_addr.sin_addr, 4)) - return false; - return true; -} - - -std::auto_ptr Ipv4Address::GetCopy() -{ - return std::auto_ptr(new Ipv4Address(m_addr)); -} - - -std::string Ipv4Address::Reverse() -{ - std::string tmp; - Reverse(m_addr.sin_addr, tmp); - return tmp; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.h deleted file mode 100755 index 8b47a3501b..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv4Address.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - ** \file Ipv4Address.h - ** \date 2006-09-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Ipv4Address_H -#define _SOCKETS_Ipv4Address_H - -#include "sockets-config.h" -#include "SocketAddress.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/* Ipv4 address implementation. - \ingroup basic */ -class Ipv4Address : public SocketAddress -{ -public: - /** Create empty Ipv4 address structure. - \param port Port number */ - Ipv4Address(port_t port = 0); - /** Create Ipv4 address structure. - \param a Socket address in network byte order (as returned by Utility::u2ip) - \param port Port number in host byte order */ - Ipv4Address(ipaddr_t a,port_t port); - /** Create Ipv4 address structure. - \param a Socket address in network byte order - \param port Port number in host byte order */ - Ipv4Address(struct in_addr& a,port_t port); - /** Create Ipv4 address structure. - \param host Hostname to be resolved - \param port Port number in host byte order */ - Ipv4Address(const std::string& host,port_t port); - Ipv4Address(struct sockaddr_in&); - ~Ipv4Address(); - - // SocketAddress implementation - - operator struct sockaddr *(); - operator socklen_t(); - bool operator==(SocketAddress&); - - void SetPort(port_t port); - port_t GetPort(); - - void SetAddress(struct sockaddr *sa); - int GetFamily(); - - bool IsValid(); - std::auto_ptr GetCopy(); - - /** Convert address struct to text. */ - std::string Convert(bool include_port = false); - std::string Reverse(); - - /** Resolve hostname. */ - static bool Resolve(const std::string& hostname,struct in_addr& a); - /** Reverse resolve (IP to hostname). */ - static bool Reverse(struct in_addr& a,std::string& name); - /** Convert address struct to text. */ - static std::string Convert(struct in_addr& a); - -private: - Ipv4Address(const Ipv4Address& ) {} // copy constructor - Ipv4Address& operator=(const Ipv4Address& ) { - return *this; // assignment operator - } - struct sockaddr_in m_addr; - bool m_valid; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // _SOCKETS_Ipv4Address_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.cpp deleted file mode 100755 index d9addf641a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/** - ** \file Ipv6Address.cpp - ** \date 2006-09-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include -#include "Ipv6Address.h" -#ifdef ENABLE_IPV6 - -#include "Utility.h" -#ifndef _WIN32 -#include -#endif -#ifdef IPPROTO_IPV6 - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -Ipv6Address::Ipv6Address(port_t port) : m_valid(true) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin6_family = AF_INET6; - m_addr.sin6_port = htons( port ); -} - - -Ipv6Address::Ipv6Address(struct in6_addr& a,port_t port) : m_valid(true) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin6_family = AF_INET6; - m_addr.sin6_port = htons( port ); - m_addr.sin6_addr = a; -} - - -Ipv6Address::Ipv6Address(const std::string& host,port_t port) : m_valid(false) -{ - memset(&m_addr, 0, sizeof(m_addr)); - m_addr.sin6_family = AF_INET6; - m_addr.sin6_port = htons( port ); - { - struct in6_addr a; - if (Utility::u2ip(host, a)) - { - m_addr.sin6_addr = a; - m_valid = true; - } - } -} - - -Ipv6Address::Ipv6Address(struct sockaddr_in6& sa) -{ - m_addr = sa; - m_valid = sa.sin6_family == AF_INET6; -} - - -Ipv6Address::~Ipv6Address() -{ -} - - -Ipv6Address::operator struct sockaddr *() -{ - return (struct sockaddr *)&m_addr; -} - - -Ipv6Address::operator socklen_t() -{ - return sizeof(struct sockaddr_in6); -} - - -void Ipv6Address::SetPort(port_t port) -{ - m_addr.sin6_port = htons( port ); -} - - -port_t Ipv6Address::GetPort() -{ - return ntohs( m_addr.sin6_port ); -} - - -bool Ipv6Address::Resolve(const std::string& hostname,struct in6_addr& a) -{ - struct sockaddr_in6 sa; - memset(&a, 0, sizeof(a)); - if (Utility::isipv6(hostname)) - { - if (!Utility::u2ip(hostname, sa, AI_NUMERICHOST)) - return false; - a = sa.sin6_addr; - return true; - } - if (!Utility::u2ip(hostname, sa)) - return false; - a = sa.sin6_addr; - return true; -} - - -bool Ipv6Address::Reverse(struct in6_addr& a,std::string& name) -{ - struct sockaddr_in6 sa; - memset(&sa, 0, sizeof(sa)); - sa.sin6_family = AF_INET6; - sa.sin6_addr = a; - return Utility::reverse((struct sockaddr *)&sa, sizeof(sa), name); -} - - -std::string Ipv6Address::Convert(bool include_port) -{ - if (include_port) - return Convert(m_addr.sin6_addr) + ":" + Utility::l2string(GetPort()); - return Convert(m_addr.sin6_addr); -} - - -std::string Ipv6Address::Convert(struct in6_addr& a,bool mixed) -{ - char slask[100]; // l2ip temporary - *slask = 0; - unsigned int prev = 0; - bool skipped = false; - bool ok_to_skip = true; - if (mixed) - { - unsigned short x; - unsigned short addr16[8]; - memcpy(addr16, &a, sizeof(addr16)); - for (size_t i = 0; i < 6; i++) - { - x = ntohs(addr16[i]); - if (*slask && (x || !ok_to_skip || prev)) - { -#if defined( _WIN32) && !defined(__CYGWIN__) - strcat_s(slask,sizeof(slask),":"); -#else - strcat(slask,":"); -#endif - } - if (x || !ok_to_skip) - { - snprintf(slask + strlen(slask), sizeof(slask) - strlen(slask),"%x", x); - if (x && skipped) - ok_to_skip = false; - } - else - { - skipped = true; - } - prev = x; - } - x = ntohs(addr16[6]); - snprintf(slask + strlen(slask), sizeof(slask) - strlen(slask),":%u.%u",x / 256,x & 255); - x = ntohs(addr16[7]); - snprintf(slask + strlen(slask), sizeof(slask) - strlen(slask),".%u.%u",x / 256,x & 255); - } - else - { - struct sockaddr_in6 sa; - memset(&sa, 0, sizeof(sa)); - sa.sin6_family = AF_INET6; - sa.sin6_addr = a; - std::string name; - Utility::reverse((struct sockaddr *)&sa, sizeof(sa), name, NI_NUMERICHOST); - return name; - } - return slask; -} - - -void Ipv6Address::SetAddress(struct sockaddr *sa) -{ - memcpy(&m_addr, sa, sizeof(struct sockaddr_in6)); -} - - -int Ipv6Address::GetFamily() -{ - return m_addr.sin6_family; -} - - -void Ipv6Address::SetFlowinfo(uint32_t x) -{ - m_addr.sin6_flowinfo = x; -} - - -uint32_t Ipv6Address::GetFlowinfo() -{ - return m_addr.sin6_flowinfo; -} - - -#ifndef _WIN32 -void Ipv6Address::SetScopeId(uint32_t x) -{ - m_addr.sin6_scope_id = x; -} - - -uint32_t Ipv6Address::GetScopeId() -{ - return m_addr.sin6_scope_id; -} -#endif - - -bool Ipv6Address::IsValid() -{ - return m_valid; -} - - -bool Ipv6Address::operator==(SocketAddress& a) -{ - if (a.GetFamily() != GetFamily()) - return false; - if ((socklen_t)a != sizeof(m_addr)) - return false; - struct sockaddr *sa = a; - struct sockaddr_in6 *p = (struct sockaddr_in6 *)sa; - if (p -> sin6_port != m_addr.sin6_port) - return false; - if (memcmp(&p -> sin6_addr, &m_addr.sin6_addr, sizeof(struct in6_addr))) - return false; - return true; -} - - -std::auto_ptr Ipv6Address::GetCopy() -{ - return std::auto_ptr(new Ipv6Address(m_addr)); -} - - -std::string Ipv6Address::Reverse() -{ - std::string tmp; - Reverse(m_addr.sin6_addr, tmp); - return tmp; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // IPPROTO_IPV6 -#endif // ENABLE_IPV6 - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.h deleted file mode 100755 index 86957d360c..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Ipv6Address.h +++ /dev/null @@ -1,120 +0,0 @@ -/** - ** \file Ipv6Address.h - ** \date 2006-09-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Ipv6Address_H -#define _SOCKETS_Ipv6Address_H -#include "sockets-config.h" -#ifdef ENABLE_IPV6 - -#include "SocketAddress.h" -#ifdef IPPROTO_IPV6 -#if defined( _WIN32) && !defined(__CYGWIN__) -typedef unsigned __int32 uint32_t; -#endif - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Ipv6 address implementation. - \ingroup basic */ -class Ipv6Address : public SocketAddress -{ -public: - /** Create empty Ipv6 address structure. - \param port Port number */ - Ipv6Address(port_t port = 0); - /** Create Ipv6 address structure. - \param a Socket address in network byte order - \param port Port number in host byte order */ - Ipv6Address(struct in6_addr& a,port_t port); - /** Create Ipv6 address structure. - \param host Hostname to be resolved - \param port Port number in host byte order */ - Ipv6Address(const std::string& host,port_t port); - Ipv6Address(struct sockaddr_in6&); - ~Ipv6Address(); - - // SocketAddress implementation - - operator struct sockaddr *(); - operator socklen_t(); - bool operator==(SocketAddress&); - - void SetPort(port_t port); - port_t GetPort(); - - void SetAddress(struct sockaddr *sa); - int GetFamily(); - - bool IsValid(); - std::auto_ptr GetCopy(); - - /** Convert address struct to text. */ - std::string Convert(bool include_port = false); - std::string Reverse(); - - /** Resolve hostname. */ - static bool Resolve(const std::string& hostname,struct in6_addr& a); - /** Reverse resolve (IP to hostname). */ - static bool Reverse(struct in6_addr& a,std::string& name); - /** Convert address struct to text. */ - static std::string Convert(struct in6_addr& a,bool mixed = false); - - void SetFlowinfo(uint32_t); - uint32_t GetFlowinfo(); -#ifndef _WIN32 - void SetScopeId(uint32_t); - uint32_t GetScopeId(); -#endif - -private: - Ipv6Address(const Ipv6Address& ) {} // copy constructor - Ipv6Address& operator=(const Ipv6Address& ) { - return *this; // assignment operator - } - struct sockaddr_in6 m_addr; - bool m_valid; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // IPPROTO_IPV6 -#endif // ENABLE_IPV6 -#endif // _SOCKETS_Ipv6Address_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.cpp deleted file mode 100755 index 93791295b3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.cpp +++ /dev/null @@ -1,572 +0,0 @@ -#include "Json.h" -#include -#include -#include "Utility.h" - -#define C buffer[index] - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// -------------------------------------------------------------------------------- -Json::Json() : m_type(TYPE_UNKNOWN) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(char value) : m_type(TYPE_INTEGER), m_i_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(short value) : m_type(TYPE_INTEGER), m_i_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(long value) : m_type(TYPE_INTEGER), m_i_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -//Json::Json(int64_t value) : m_type(TYPE_INTEGER), m_i_value(value) -Json::Json(long long value) : m_type(TYPE_INTEGER), m_i_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(double value) : m_type(TYPE_REAL), m_d_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(const char *value) : m_type(TYPE_STRING), m_str_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(const std::string& value) : m_type(TYPE_STRING), m_str_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(bool value) : m_type(TYPE_BOOLEAN), m_b_value(value) -{ -} - - -// -------------------------------------------------------------------------------- -Json::Json(json_type_t t) : m_type(t) -{ - if (t != TYPE_ARRAY && t != TYPE_OBJECT) - throw Exception("Must be type: Array or type: Object"); -} - - -// -------------------------------------------------------------------------------- -Json::~Json() -{ -} - - -// -------------------------------------------------------------------------------- -Json::json_type_t Json::Type() const { return m_type; } - - -// -------------------------------------------------------------------------------- -bool Json::HasValue(const std::string& name) const -{ - if (m_type != TYPE_OBJECT) - return false; - return m_object.find(name) != m_object.end(); -} - - -// -------------------------------------------------------------------------------- -Json::operator char() const -{ - return (char)m_i_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator short() const -{ - return (short)m_i_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator long() const -{ - return m_i_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator int64_t() const -{ - return m_i_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator double() const -{ - return m_d_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator std::string() const -{ - return m_str_value; -} - - -// -------------------------------------------------------------------------------- -Json::operator bool() const -{ - return m_b_value; -} - - -// -------------------------------------------------------------------------------- -const Json& Json::operator[](const char *name) const -{ - if (m_type != TYPE_OBJECT) - throw Exception("Must be type: Object"); - json_map_t::const_iterator it = m_object.find(name); - if (it != m_object.end()) - return it -> second; - throw Exception("Key not found: " + std::string(name)); -} - -// -------------------------------------------------------------------------------- -Json& Json::operator[](const char *name) -{ - if (m_type == TYPE_UNKNOWN) - m_type = TYPE_OBJECT; - if (m_type != TYPE_OBJECT) - throw Exception("Must be type: Object"); - return m_object[name]; -} - - -// -------------------------------------------------------------------------------- -const Json& Json::operator[](const std::string& name) const -{ - if (m_type != TYPE_OBJECT) - throw Exception("Must be type: Object"); - json_map_t::const_iterator it = m_object.find(name); - if (it != m_object.end()) - return it -> second; - throw Exception("Key not found: " + name); -} - -// -------------------------------------------------------------------------------- -Json& Json::operator[](const std::string& name) -{ - if (m_type == TYPE_UNKNOWN) - m_type = TYPE_OBJECT; - if (m_type != TYPE_OBJECT) - throw Exception("Must be type: Object"); - return m_object[name]; -} - - -// -------------------------------------------------------------------------------- -void Json::Add(Json data) -{ - if (m_type == TYPE_UNKNOWN) - m_type = TYPE_ARRAY; - if (m_type != TYPE_ARRAY) - throw Exception("trying to add array data in non-array"); - m_array.push_back(data); -} - - -// -------------------------------------------------------------------------------- -const std::string& Json::GetString() const -{ - return m_str_value; -} - - -// -------------------------------------------------------------------------------- -Json::json_list_t& Json::GetArray() -{ - if (m_type == TYPE_UNKNOWN) - m_type = TYPE_ARRAY; - if (m_type != TYPE_ARRAY) - throw Exception("Json instance not of type: Array"); - return m_array; -} - - -// -------------------------------------------------------------------------------- -Json::json_map_t& Json::GetObject() -{ - if (m_type == TYPE_UNKNOWN) - m_type = TYPE_OBJECT; - if (m_type != TYPE_OBJECT) - throw Exception("Json instance not of type: Array"); - return m_object; -} - - -// -------------------------------------------------------------------------------- -const Json::json_list_t& Json::GetArray() const -{ - if (m_type != TYPE_ARRAY) - throw Exception("Json instance not of type: Array"); - return m_array; -} - - -// -------------------------------------------------------------------------------- -const Json::json_map_t& Json::GetObject() const -{ - if (m_type != TYPE_OBJECT) - throw Exception("Json instance not of type: Array"); - return m_object; -} - - -// -------------------------------------------------------------------------------- -Json Json::Parse(const std::string& data) -{ - size_t i = 0; - Json obj; - obj.Parse(data.c_str(), i); - return obj; -} - - -// -------------------------------------------------------------------------------- -char Json::Parse(const char *buffer, size_t& index) -{ - while (C == ' ' || C == 9 || C == 13 || C == 10) - ++index; - size_t x = index; // origin - std::string ord; - if (C == '-' || isdigit(C)) // Number - { - bool dot = false; - if (C == '-') - { - ++index; - } - while (isdigit(C) || C == '.') - { - if (C == '.') - dot = true; - ++index; - } - size_t sz = index - x; - ord.resize(sz); - memcpy(&ord[0], &buffer[x], sz); - if (dot) - { - m_type = TYPE_REAL; - m_d_value = atof(ord.c_str()); - } - else - { - m_type = TYPE_INTEGER; - m_i_value = atoi(ord.c_str()); - } - } - else - if (C == 34) // " - String - { - bool ign = false; - x = ++index; - while (C && (ign || C != 34)) - { - if (ign) - { - ign = false; - } - else - if (C == '\\') - { - ign = true; - } - ++index; - } - size_t sz = index - x; - ord.resize(sz); - memcpy(&ord[0], &buffer[x], sz); - decode(ord); - ++index; - m_type = TYPE_STRING; - m_str_value = ord; - } - else - if (!strncmp(&buffer[index], "null", 4)) // null value - { - m_type = TYPE_UNKNOWN; - index += 4; - } - else - if (!strncmp(&buffer[index], "true", 4)) // Boolean: true - { - m_type = TYPE_BOOLEAN; - m_b_value = true; - index += 4; - } - else - if (!strncmp(&buffer[index], "false", 5)) // Boolean: false - { - m_type = TYPE_BOOLEAN; - m_b_value = false; - index += 5; - } - else - if (C == '[') // Array - { - ++index; - m_type = TYPE_ARRAY; - while (true) - { - char res; - Json o; - if ((res = o.Parse(buffer, index)) == 0) - { - m_array.push_back(o); - } - else - if (res == ']') - { - break; - } - else - if (res == ',') // another element follows - { - } - else - { - throw Exception(std::string("Unexpected end of Array: ") + res); - } - } - } - else - if (C == ']') // end of Array - { - ++index; - return ']'; - } - else - if (C == '{') // Object - { - ++index; - m_type = TYPE_OBJECT; - int state = 0; - std::string element_name; - bool quit = false; - while (!quit) - { - Json o; - char res = o.Parse(buffer, index); - switch (state) - { - case 0: - if (res == ',') // another object follow - break; - if (res == '}') // end of Object - { - quit = true; - break; - } - if (res || o.Type() != TYPE_STRING) - throw Exception("Object element name missing"); - element_name = o.GetString(); - state = 1; - break; - case 1: - if (res != ':') - throw Exception("Object element separator missing"); - state = 2; - break; - case 2: - if (res) - throw Exception(std::string("Unexpected character when parsing anytype: ") + res); - m_object[element_name] = o; - state = 0; - break; - } - } - } - else - if (C == '}') // end of Object - { - ++index; - return '}'; - } - else - if (C == ',') - { - ++index; - return ','; - } - else - if (C == ':') - { - ++index; - return ':'; - } - else - { - throw Exception("Can't parse Json representation: " + std::string(&buffer[index])); - } - return 0; -} - - -// -------------------------------------------------------------------------------- -std::string Json::ToString(bool quote) const -{ - switch (m_type) - { - case TYPE_UNKNOWN: - break; - case TYPE_INTEGER: - return Utility::l2string(m_i_value); - case TYPE_REAL: - { - char slask[100]; - sprintf(slask, "%f", m_d_value); - return slask; - } - case TYPE_STRING: - { - std::ostringstream tmp; - tmp << "\"" << encode(m_str_value) << "\""; - return tmp.str(); - } - case TYPE_BOOLEAN: - return m_b_value ? "true" : "false"; - case TYPE_ARRAY: - { - std::ostringstream tmp; - bool first = true; - tmp << "["; - for (json_list_t::const_iterator it = m_array.begin(); it != m_array.end(); it++) - { - const Json& ref = *it; - if (!first) - tmp << ","; - tmp << ref.ToString(quote); - first = false; - } - tmp << "]"; - return tmp.str(); - } - case TYPE_OBJECT: - { - std::ostringstream tmp; - bool first = true; - tmp << "{"; - for (json_map_t::const_iterator it = m_object.begin(); it != m_object.end(); it++) - { - const std::pair& ref = *it; - if (!first) - tmp << ","; - if (quote) - tmp << "\"" << encode(ref.first) << "\":" << ref.second.ToString(quote); - else - tmp << ref.first << ":" << ref.second.ToString(quote); - first = false; - } - tmp << "}"; - return tmp.str(); - } - } - return "null"; -} - - -// -------------------------------------------------------------------------------- -void Json::encode(std::string& src) const -{ - size_t pos = src.find("\\"); - while (pos != std::string::npos) - { - src.replace(pos, 1, "\\\\"); - pos = src.find("\\", pos + 2); - } - pos = src.find("\r"); - while (pos != std::string::npos) - { - src.replace(pos, 1, "\\r"); - pos = src.find("\r", pos + 2); - } - pos = src.find("\n"); - while (pos != std::string::npos) - { - src.replace(pos, 1, "\\n"); - pos = src.find("\n", pos + 2); - } - pos = src.find("\""); - while (pos != std::string::npos) - { - src.replace(pos, 1, "\\\""); - pos = src.find("\"", pos + 2); - } -} - - -// -------------------------------------------------------------------------------- -void Json::decode(std::string& src) const -{ - size_t pos = src.find("\\\""); - while (pos != std::string::npos) - { - src.replace(pos, 2, "\""); - pos = src.find("\\\"", pos + 1); - } - pos = src.find("\\r"); - while (pos != std::string::npos) - { - src.replace(pos, 2, "\r"); - pos = src.find("\\r", pos + 1); - } - pos = src.find("\\n"); - while (pos != std::string::npos) - { - src.replace(pos, 2, "\n"); - pos = src.find("\\n", pos + 1); - } - pos = src.find("\\\\"); - while (pos != std::string::npos) - { - src.replace(pos, 2, "\\"); - pos = src.find("\\\\", pos + 1); - } -} - - -// -------------------------------------------------------------------------------- -std::string Json::encode(const std::string& src) const -{ - std::string tmp(src); - encode(tmp); - return tmp; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.h deleted file mode 100755 index 66792dba8c..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Json.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef _SOCKETS_Json_H -#define _SOCKETS_Json_H - -#include "Exception.h" -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class Json -{ -public: - typedef std::list json_list_t; - typedef std::map json_map_t; - - typedef enum { - TYPE_UNKNOWN = 0, - TYPE_INTEGER, - TYPE_REAL, - TYPE_STRING, - TYPE_BOOLEAN, - TYPE_ARRAY, - TYPE_OBJECT - } json_type_t; - -public: - /** Default constructor */ - Json(); //m_type(TYPE_UNKNOWN); - - /** Basic type constructors */ - Json(char value); - Json(short value); - Json(long value); //m_type(TYPE_INTEGER), m_i_value(value); - Json(long long value); - // LG Json(int64_t value); - Json(double value); //m_type(TYPE_REAL), m_d_value(value); - Json(const char *value); //m_type(TYPE_STRING), m_str_value(value); - Json(const std::string& value); //m_type(TYPE_STRING), m_str_value(value); - Json(bool value); //m_type(TYPE_BOOLEAN), m_b_value(value); - - /** Complex type constructor (array, object) */ - Json(json_type_t t); //m_type(t); - - virtual ~Json(); - - char Parse(const char *buffer, size_t& index); - - json_type_t Type() const; - - bool HasValue(const std::string& name) const; - - operator char() const; - operator short() const; - operator long() const; - //operator int64_t() const; - operator long long() const; - operator double() const; - operator std::string() const; - operator bool() const; - - const Json& operator[](const char *name) const; - Json& operator[](const char *name); - - const Json& operator[](const std::string& name) const; - Json& operator[](const std::string& name); - - void Add(Json data); - - const std::string& GetString() const; - - const json_list_t& GetArray() const; - json_list_t& GetArray(); - - const json_map_t& GetObject() const; - json_map_t& GetObject(); - - std::string ToString(bool quote = true) const; - - static Json Parse(const std::string& data); - - void encode(std::string& src) const; - void decode(std::string& src) const; - std::string encode(const std::string&) const; - -private: - json_type_t m_type; - long m_i_value; - double m_d_value; - std::string m_str_value; - bool m_b_value; - json_list_t m_array; - json_map_t m_object; -}; - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_Json_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ListenSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ListenSocket.h deleted file mode 100755 index f1299617b4..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ListenSocket.h +++ /dev/null @@ -1,511 +0,0 @@ -/** \file ListenSocket.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_ListenSocket_H -#define _SOCKETS_ListenSocket_H -#include "sockets-config.h" - -#ifdef _WIN32 -#include -#else -#include -#endif - -#include "ISocketHandler.h" -#include "Socket.h" -#include "Utility.h" -#include "SctpSocket.h" -#include "Ipv4Address.h" -#include "Ipv6Address.h" -#ifdef ENABLE_EXCEPTIONS -#include "Exception.h" -#endif -#include "Lock.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Binds incoming port number to new Socket class X. - \ingroup basic */ -template -class ListenSocket : public Socket -{ -public: - /** Constructor. - \param h ISocketHandler reference - \param use_creator Optional use of creator (default true) */ - ListenSocket(ISocketHandler& h,bool use_creator = true) : Socket(h), m_depth(0), m_creator(NULL) - ,m_bHasCreate(false) { - if (use_creator) { - m_creator = new X(h); - Socket *tmp = m_creator -> Create(); - - if (tmp && dynamic_cast(tmp)) { - m_bHasCreate = true; - } - - if (tmp) { - delete tmp; - } - } - } - ~ListenSocket() { - if (m_creator) { - delete m_creator; - } - } - - /** Close file descriptor. */ - int Close() { - if (GetSocket() != INVALID_SOCKET) { - if (closesocket(GetSocket()) == -1) { - } else { - Attach(INVALID_SOCKET); - } - } - - return 0; - } - - /** Bind and listen to any interface. - \param port Port (0 is random) - \param depth Listen queue depth */ - int Bind(port_t port,int depth = 20) { -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (IsIpv6()) { - Ipv6Address ad(port); - return Bind(ad, depth); - } else -#endif -#endif - { - Ipv4Address ad(port); - return Bind(ad, depth); - } - } - - int Bind(SocketAddress& ad,int depth) { -#ifdef USE_SCTP - - if (dynamic_cast(m_creator)) { - return Bind(ad, "sctp", depth); - } - -#endif - return Bind(ad, "tcp", depth); - } - - /** Bind and listen to any interface, with optional protocol. - \param port Port (0 is random) - \param protocol Network protocol - \param depth Listen queue depth */ - int Bind(port_t port,const std::string& protocol,int depth = 20) { -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (IsIpv6()) { - Ipv6Address ad(port); - return Bind(ad, protocol, depth); - } else -#endif -#endif - { - Ipv4Address ad(port); - return Bind(ad, protocol, depth); - } - } - - /** Bind and listen to specific interface. - \param intf Interface hostname - \param port Port (0 is random) - \param depth Listen queue depth */ - int Bind(const std::string& intf,port_t port,int depth = 20) { -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (IsIpv6()) { - Ipv6Address ad(intf, port); - - if (ad.IsValid()) { - return Bind(ad, depth); - } - - Handler().LogError(this, "Bind", 0, "name resolution of interface name failed", LOG_LEVEL_FATAL); - return -1; - } else -#endif -#endif - { - Ipv4Address ad(intf, port); - - if (ad.IsValid()) { - return Bind(ad, depth); - } - - Handler().LogError(this, "Bind", 0, "name resolution of interface name failed", LOG_LEVEL_FATAL); - return -1; - } - } - - /** Bind and listen to specific interface. - \param intf Interface hostname - \param port Port (0 is random) - \param protocol Network protocol - \param depth Listen queue depth */ - int Bind(const std::string& intf,port_t port,const std::string& protocol,int depth = 20) { -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (IsIpv6()) { - Ipv6Address ad(intf, port); - - if (ad.IsValid()) { - return Bind(ad, protocol, depth); - } - - Handler().LogError(this, "Bind", 0, "name resolution of interface name failed", LOG_LEVEL_FATAL); - return -1; - } else -#endif -#endif - { - Ipv4Address ad(intf, port); - - if (ad.IsValid()) { - return Bind(ad, protocol, depth); - } - - Handler().LogError(this, "Bind", 0, "name resolution of interface name failed", LOG_LEVEL_FATAL); - return -1; - } - } - - /** Bind and listen to ipv4 interface. - \param a Ipv4 interface address - \param port Port (0 is random) - \param depth Listen queue depth */ - int Bind(ipaddr_t a,port_t port,int depth = 20) { - Ipv4Address ad(a, port); -#ifdef USE_SCTP - - if (dynamic_cast(m_creator)) { - return Bind(ad, "sctp", depth); - } - -#endif - return Bind(ad, "tcp", depth); - } - /** Bind and listen to ipv4 interface. - \param a Ipv4 interface address - \param port Port (0 is random) - \param protocol Network protocol - \param depth Listen queue depth */ - int Bind(ipaddr_t a,port_t port,const std::string& protocol,int depth) { - Ipv4Address ad(a, port); - return Bind(ad, protocol, depth); - } - -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - /** Bind and listen to ipv6 interface. - \param a Ipv6 interface address - \param port Port (0 is random) - \param depth Listen queue depth */ - int Bind(in6_addr a,port_t port,int depth = 20) { - Ipv6Address ad(a, port); -#ifdef USE_SCTP - - if (dynamic_cast(m_creator)) { - return Bind(ad, "sctp", depth); - } - -#endif - return Bind(ad, "tcp", depth); - } - /** Bind and listen to ipv6 interface. - \param a Ipv6 interface address - \param port Port (0 is random) - \param protocol Network protocol - \param depth Listen queue depth */ - int Bind(in6_addr a,port_t port,const std::string& protocol,int depth) { - Ipv6Address ad(a, port); - return Bind(ad, protocol, depth); - } -#endif -#endif - - /** Bind and listen to network interface. - \param ad Interface address - \param protocol Network protocol - \param depth Listen queue depth */ - int Bind(SocketAddress& ad,const std::string& protocol,int depth) { - SOCKET s; - - if ( (s = CreateSocket(ad.GetFamily(), SOCK_STREAM, protocol)) == INVALID_SOCKET) { - return -1; - } - - // socket must be nonblocking for async connect - if (!SetNonblocking(true, s)) { - closesocket(s); - return -1; - } - - if (bind(s, ad, ad) == -1) { - Handler().LogError(this, "bind", Errno, StrError(Errno), LOG_LEVEL_FATAL); - closesocket(s); -#ifdef ENABLE_EXCEPTIONS - throw Exception("bind() failed for port " + Utility::l2string(ad.GetPort()) + ": " + StrError(Errno)); -#endif - return -1; - } - - if (listen(s, depth) == -1) { - Handler().LogError(this, "listen", Errno, StrError(Errno), LOG_LEVEL_FATAL); - closesocket(s); -#ifdef ENABLE_EXCEPTIONS - throw Exception("listen() failed for port " + Utility::l2string(ad.GetPort()) + ": " + StrError(Errno)); -#endif - return -1; - } - - m_depth = depth; - Attach(s); - return 0; - } - - /** Return assigned port number. */ - port_t GetPort() { - return GetSockPort(); - } - - /** Return listen queue depth. */ - int GetDepth() { - return m_depth; - } - - /** OnRead on a ListenSocket receives an incoming connection. */ - void OnRead() { - struct sockaddr sa; - int max = 10; // process max 10 incoming connection in one call - - while (max--) { - socklen_t sa_len = sizeof(struct sockaddr); - SOCKET a_s = accept(GetSocket(), &sa, &sa_len); - - if (a_s == INVALID_SOCKET) { - // EAGAIN or EWOULDBLOCK -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - { - Handler().LogError(this, "accept", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - - return; - } - - if (!Handler().OkToAccept(this)) { - Handler().LogError(this, "accept", -1, "Not OK to accept", LOG_LEVEL_WARNING); - closesocket(a_s); - return; - } - - if (Handler().GetCount() >= Handler().MaxCount()) { - Handler().LogError(this, "accept", (int)Handler().GetCount(), "ISocketHandler socket limit reached", LOG_LEVEL_FATAL); - closesocket(a_s); - return; - } - - // - Socket *tmp = NULL; - - if (Handler().IsThreaded()) { - ISocketHandler& h = Handler().GetRandomHandler(); - tmp = new X(h); // %! no support for Create -#ifdef ENABLE_IPV6 - tmp -> SetIpv6( IsIpv6() ); -#endif - tmp -> SetParent(this); - tmp -> Attach(a_s); - tmp -> SetNonblocking(true); -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (sa_len == sizeof(struct sockaddr_in6)) { - if (reinterpret_cast(sa).sin6_family == AF_INET6) { - Ipv6Address ad(reinterpret_cast(sa).sin6_addr, - ntohs(reinterpret_cast(sa).sin6_port)); - ad.SetFlowinfo(reinterpret_cast(sa).sin6_flowinfo); -#ifndef _WIN32 - ad.SetScopeId(reinterpret_cast(sa).sin6_scope_id); -#endif - tmp -> SetRemoteAddress(ad); - } - } - -#endif -#endif - - if (sa_len == sizeof(struct sockaddr_in)) { - struct sockaddr_in *p = (struct sockaddr_in *)&sa; - - if (p -> sin_family == AF_INET) { - Ipv4Address ad(p -> sin_addr,ntohs(p -> sin_port)); - tmp -> SetRemoteAddress(ad); - } - } - - tmp -> SetConnected(true); - tmp -> Init(); - tmp -> SetDeleteByHandler(true); - { - Lock lock(h.GetMutex()); - h.Add(tmp); -#ifdef HAVE_OPENSSL - - if (tmp -> IsSSL()) { // SSL Enabled socket - // %! OnSSLAccept calls SSLNegotiate that can finish in this one call. - // %! If that happens and negotiation fails, the 'tmp' instance is - // %! still added to the list of active sockets in the sockethandler. - // %! See bugfix for this in SocketHandler::Select - don't Set rwx - // %! flags if CloseAndDelete() flag is true. - // %! An even better fugbix (see TcpSocket::OnSSLAccept) now avoids - // %! the Add problem altogether, so ignore the above. - // %! (OnSSLAccept does no longer call SSLNegotiate().) - tmp -> OnSSLAccept(); - } else -#endif - { - tmp -> OnAccept(); - } - } - h.Release(); - } else { - tmp = m_bHasCreate ? m_creator -> Create() : new X(Handler()); -#ifdef ENABLE_IPV6 - tmp -> SetIpv6( IsIpv6() ); -#endif - tmp -> SetParent(this); - tmp -> Attach(a_s); - tmp -> SetNonblocking(true); -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - - if (sa_len == sizeof(struct sockaddr_in6)) { - if (reinterpret_cast(sa).sin6_family == AF_INET6) { - Ipv6Address ad(reinterpret_cast(sa).sin6_addr, - ntohs(reinterpret_cast(sa).sin6_port)); - ad.SetFlowinfo(reinterpret_cast(sa).sin6_flowinfo); -#ifndef _WIN32 - ad.SetScopeId(reinterpret_cast(sa).sin6_scope_id); -#endif - tmp -> SetRemoteAddress(ad); - } - } - -#endif -#endif - - if (sa_len == sizeof(struct sockaddr_in)) { - struct sockaddr_in *p = (struct sockaddr_in *)&sa; - - if (p -> sin_family == AF_INET) { - Ipv4Address ad(p -> sin_addr,ntohs(p -> sin_port)); - tmp -> SetRemoteAddress(ad); - } - } - - tmp -> SetConnected(true); - tmp -> Init(); - tmp -> SetDeleteByHandler(true); - Handler().Add(tmp); -#ifdef HAVE_OPENSSL - - if (tmp -> IsSSL()) { // SSL Enabled socket - // %! OnSSLAccept calls SSLNegotiate that can finish in this one call. - // %! If that happens and negotiation fails, the 'tmp' instance is - // %! still added to the list of active sockets in the sockethandler. - // %! See bugfix for this in SocketHandler::Select - don't Set rwx - // %! flags if CloseAndDelete() flag is true. - // %! An even better fugbix (see TcpSocket::OnSSLAccept) now avoids - // %! the Add problem altogether, so ignore the above. - // %! (OnSSLAccept does no longer call SSLNegotiate().) - tmp -> OnSSLAccept(); - } else -#endif - { - tmp -> OnAccept(); - } - } - } // while (true) - } - - /** Please don't use this method. - "accept()" is handled automatically in the OnRead() method. */ - virtual SOCKET Accept(SOCKET socket, struct sockaddr *saptr, socklen_t *lenptr) { - return accept(socket, saptr, lenptr); - } - - bool HasCreator() { - return m_bHasCreate; - } - - void OnOptions(int,int,int,SOCKET) { - SetSoReuseaddr(true); - } - -protected: - ListenSocket(const ListenSocket& s) : Socket(s) {} -private: - ListenSocket& operator=(const ListenSocket& ) { - return *this; - } - int m_depth; - X *m_creator; - bool m_bHasCreate; -}; - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_ListenSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.cpp deleted file mode 100755 index 01172e1b60..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/** \file Lock.cpp - ** \date 2005-08-22 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "IMutex.h" -#include "Lock.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -Lock::Lock(const IMutex& m) : m_mutex(m) -{ - m_mutex.Lock(); -} - - -Lock::~Lock() -{ - m_mutex.Unlock(); -} - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.h deleted file mode 100755 index 8a5a329f86..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Lock.h +++ /dev/null @@ -1,62 +0,0 @@ -/** \file Lock.h - ** \date 2005-08-22 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2005-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Lock_H -#define _SOCKETS_Lock_H - -#include "sockets-config.h" -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IMutex; - -/** IMutex encapsulation class. - \ingroup threading */ -class Lock -{ -public: - Lock(const IMutex&); - ~Lock(); - -private: - const IMutex& m_mutex; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif -#endif // _SOCKETS_Lock_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Makefile.am b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Makefile.am deleted file mode 100755 index 8e4fe2424e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Makefile.am +++ /dev/null @@ -1,44 +0,0 @@ -noinst_LIBRARIES = libsockets.a - -libsockets_a_SOURCES = Ajp13Socket.cpp HttpRequest.cpp SocketHandlerEp.cpp \ - AjpBaseSocket.cpp HttpResponse.cpp SocketHandlerThread.cpp \ - Base64.cpp HTTPSocket.cpp socket_include.cpp \ - Debug.cpp HttpTransaction.cpp \ - Event.cpp IEventOwner.cpp SocketStream.cpp \ - EventHandler.cpp Ipv4Address.cpp SocketThread.cpp \ - EventTime.cpp Ipv6Address.cpp SSLInitializer.cpp \ - Exception.cpp Json.cpp StdoutLog.cpp \ - File.cpp Lock.cpp StreamSocket.cpp \ - FileStream.cpp MemFile.cpp StreamWriter.cpp \ - HttpBaseSocket.cpp Mutex.cpp TcpSocket.cpp \ - HttpClientSocket.cpp Parse.cpp Thread.cpp \ - HttpdCookies.cpp ResolvServer.cpp UdpSocket.cpp \ - HttpDebugSocket.cpp ResolvSocket.cpp Utility.cpp \ - HttpdForm.cpp SctpSocket.cpp XmlDocument.cpp \ - HttpdSocket.cpp Semaphore.cpp XmlException.cpp \ - HttpGetSocket.cpp SmtpdSocket.cpp XmlNode.cpp \ - HttpPostSocket.cpp Socket.cpp \ - HttpPutSocket.cpp SocketHandler.cpp \ - ajp13.h HttpTransaction.h SocketAddress.h \ - Ajp13Socket.h IBase.h Socket.h \ - AjpBaseSocket.h IEventHandler.h SocketHandlerEp.h \ - Base64.h IEventOwner.h SocketHandler.h \ - Debug.h IFile.h SocketHandlerThread.h \ - Event.h IFileUpload.h socket_include.h \ - EventHandler.h IHttpServer.h sockets-config.h \ - EventTime.h IMutex.h SocketStream.h \ - Exception.h Ipv4Address.h SocketThread.h \ - File.h Ipv6Address.h SSLInitializer.h \ - FileStream.h ISocketHandler.h StdLog.h \ - HttpBaseSocket.h IStream.h StdoutLog.h \ - HttpClientSocket.h Json.h StreamSocket.h \ - HttpdCookies.h ListenSocket.h StreamWriter.h \ - HttpDebugSocket.h Lock.h TcpSocket.h \ - HttpdForm.h MemFile.h Thread.h \ - HttpdSocket.h Mutex.h UdpSocket.h \ - HttpGetSocket.h Parse.h Utility.h \ - HttpPostSocket.h ResolvServer.h XmlDocument.h \ - HttpPutSocket.h ResolvSocket.h XmlException.h \ - HttpRequest.h SctpSocket.h XmlNode.h \ - HttpResponse.h Semaphore.h \ - HTTPSocket.h SmtpdSocket.h diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.cpp deleted file mode 100755 index 6ed6a623c1..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.cpp +++ /dev/null @@ -1,349 +0,0 @@ -/** \file MemFile.cpp - ** \date 2005-04-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#include -#include -#include - -#include "MemFile.h" -#include "Exception.h" -#include "Lock.h" -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -MemFile::MemFile() -:m_src(m_src) -,m_src_valid(false) -,m_base(new block_t) -,m_current_read(m_base) -,m_current_write(m_base) -,m_current_write_nr(0) -,m_read_ptr(0) -,m_write_ptr(0) -,m_b_read_caused_eof(false) -,m_ref_count(0) -,m_ref_decreased(false) -{ -} - - -MemFile::MemFile(MemFile& s) -:m_src(s) -,m_src_valid(true) -,m_base(s.m_base) -,m_current_read(m_base) -,m_current_write(s.m_current_write) -,m_current_write_nr(s.m_current_write_nr) -,m_read_ptr(0) -,m_write_ptr(s.m_write_ptr) -,m_b_read_caused_eof(false) -,m_ref_count(0) -,m_ref_decreased(false) -,m_path(s.m_path) -{ - m_src.Increase(); -} - - -MemFile::MemFile(File& f) -:m_src(m_src) -,m_src_valid(false) -,m_base(new block_t) -,m_current_read(NULL) -,m_current_write(NULL) -,m_current_write_nr(0) -,m_read_ptr(0) -,m_write_ptr(0) -,m_b_read_caused_eof(false) -,m_ref_count(0) -,m_ref_decreased(false) -,m_path(f.Path()) -{ - m_current_read = m_base; - m_current_write = m_base; - char slask[32768]; - size_t n; - while ((n = f.fread(slask, 1, 32768)) > 0) - { - fwrite(slask, 1, n); - } -} - - -MemFile::~MemFile() -{ - if (m_ref_count) - std::cerr << "MemFile destructor with a ref count of " + Utility::l2string(m_ref_count) << std::endl; - while (m_base && !m_src_valid) - { - block_t *p = m_base; - m_base = p -> next; - delete p; - } - if (m_src_valid && !m_ref_decreased) - { - m_src.Decrease(); - m_ref_decreased = true; - } -} - - -bool MemFile::fopen(const std::string& path, const std::string& mode) -{ - return true; -} - - -void MemFile::fclose() const -{ - if (m_src_valid && !m_ref_decreased) - { - m_src.Decrease(); - m_ref_decreased = true; - } -} - - -size_t MemFile::fread(char *ptr, size_t size, size_t nmemb) const -{ - size_t p = m_read_ptr % BLOCKSIZE; - size_t sz = size * nmemb; - size_t available = m_write_ptr - m_read_ptr; - if (sz > available) // read beyond eof - { - sz = available; - m_b_read_caused_eof = true; - } - if (!sz) - { - return 0; - } - if (p + sz < BLOCKSIZE) - { - memcpy(ptr, m_current_read -> data + p, sz); - m_read_ptr += sz; - } - else - { - size_t sz1 = BLOCKSIZE - p; - size_t sz2 = sz - sz1; - memcpy(ptr, m_current_read -> data + p, sz1); - m_read_ptr += sz1; - while (sz2 > BLOCKSIZE) - { - if (m_current_read -> next) - { - m_current_read = m_current_read -> next; - memcpy(ptr + sz1, m_current_read -> data, BLOCKSIZE); - m_read_ptr += BLOCKSIZE; - sz1 += BLOCKSIZE; - sz2 -= BLOCKSIZE; - } - else - { - return sz1; - } - } - if (m_current_read -> next) - { - m_current_read = m_current_read -> next; - memcpy(ptr + sz1, m_current_read -> data, sz2); - m_read_ptr += sz2; - } - else - { - return sz1; - } - } - return sz; -} - - -size_t MemFile::fwrite(const char *ptr, size_t size, size_t nmemb) -{ - size_t p = m_write_ptr % BLOCKSIZE; - int nr = (int)m_write_ptr / BLOCKSIZE; - size_t sz = size * nmemb; - if (m_current_write_nr < nr) - { - block_t *next = new block_t; - m_current_write -> next = next; - m_current_write = next; - m_current_write_nr++; - } - if (p + sz <= BLOCKSIZE) - { - memcpy(m_current_write -> data + p, ptr, sz); - m_write_ptr += sz; - } - else - { - size_t sz1 = BLOCKSIZE - p; // size left - size_t sz2 = sz - sz1; - memcpy(m_current_write -> data + p, ptr, sz1); - m_write_ptr += sz1; - while (sz2 > BLOCKSIZE) - { - if (m_current_write -> next) - { - m_current_write = m_current_write -> next; - m_current_write_nr++; - } - else - { - block_t *next = new block_t; - m_current_write -> next = next; - m_current_write = next; - m_current_write_nr++; - } - memcpy(m_current_write -> data, ptr + sz1, BLOCKSIZE); - m_write_ptr += BLOCKSIZE; - sz1 += BLOCKSIZE; - sz2 -= BLOCKSIZE; - } - if (m_current_write -> next) - { - m_current_write = m_current_write -> next; - m_current_write_nr++; - } - else - { - block_t *next = new block_t; - m_current_write -> next = next; - m_current_write = next; - m_current_write_nr++; - } - memcpy(m_current_write -> data, ptr + sz1, sz2); - m_write_ptr += sz2; - } - return sz; -} - - - -char *MemFile::fgets(char *s, int size) const -{ - int n = 0; - while (n < size - 1 && !eof()) - { - char c; - size_t sz = fread(&c, 1, 1); - if (sz) - { - if (c == 10) - { - s[n] = 0; - return s; - } - s[n++] = c; - } - } - s[n] = 0; - return s; -} - - -void MemFile::fprintf(const char *format, ...) -{ - va_list ap; - char tmp[BLOCKSIZE]; - va_start(ap, format); - vsnprintf(tmp, sizeof(tmp), format, ap); - va_end(ap); - fwrite(tmp, 1, strlen(tmp)); -} - - -off_t MemFile::size() const -{ - return (off_t)m_write_ptr; -} - - -bool MemFile::eof() const -{ - return m_b_read_caused_eof; //(m_read_ptr < m_write_ptr) ? false : true; -} - - -void MemFile::reset_read() const -{ - m_read_ptr = 0; - m_current_read = m_base; -} - - -void MemFile::reset_write() -{ - m_write_ptr = 0; - m_current_write = m_base; - m_current_write_nr = 0; -} - - -int MemFile::RefCount() const -{ - return m_ref_count; -} - - -void MemFile::Increase() -{ - ++m_ref_count; -} - - -void MemFile::Decrease() -{ - --m_ref_count; -} - - -const std::string& MemFile::Path() const -{ - return m_path; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.h deleted file mode 100755 index d66f571436..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/MemFile.h +++ /dev/null @@ -1,118 +0,0 @@ -/** \file MemFile.h - ** \date 2005-04-25 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_MemFile_H -#define _SOCKETS_MemFile_H - -#include "sockets-config.h" -#include -#include "File.h" -#include "Mutex.h" - -#define BLOCKSIZE 32768 - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Implements a memory file. - \ingroup file */ -class MemFile : public IFile -{ -public: - /** File block structure. - \ingroup file */ - struct block_t { - block_t() : next(NULL) {} - struct block_t *next; - char data[BLOCKSIZE]; - }; -public: - /** Create temporary memory buffer, will be freed when object destructs */ - MemFile(); - /** Copy buffer from source, reset read ptr */ - MemFile(MemFile& ); - /** Read file and write to this, create non-temporary memory buffer from f.Path() */ - MemFile(File& f); - ~MemFile(); - - bool fopen(const std::string& path, const std::string& mode); - void fclose() const; - - size_t fread(char *ptr, size_t size, size_t nmemb) const; - size_t fwrite(const char *ptr, size_t size, size_t nmemb); - - char *fgets(char *s, int size) const; - void fprintf(const char *format, ...); - - off_t size() const; - bool eof() const; - - void reset_read() const; - void reset_write(); - - /** Reference count when copy constructor is used */ - int RefCount() const; - void Increase(); - void Decrease(); - - const std::string& Path() const; - -private: - MemFile& operator=(const MemFile& ) { - return *this; // assignment operator - } - - MemFile& m_src; - bool m_src_valid; - block_t *m_base; - mutable block_t *m_current_read; - block_t *m_current_write; - int m_current_write_nr; - mutable size_t m_read_ptr; - size_t m_write_ptr; - mutable bool m_b_read_caused_eof; - int m_ref_count; - mutable bool m_ref_decreased; - std::string m_path; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_MemFile_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.cpp deleted file mode 100755 index 80d9562c41..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/** \file Mutex.cpp - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "Mutex.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -Mutex::Mutex() -{ -#ifdef _WIN32 - m_mutex = ::CreateMutex(NULL, FALSE, NULL); -#else - pthread_mutex_init(&m_mutex, NULL); -#endif -} - - -Mutex::~Mutex() -{ -#ifdef _WIN32 - ::CloseHandle(m_mutex); -#else - pthread_mutex_destroy(&m_mutex); -#endif -} - - -void Mutex::Lock() const -{ -#ifdef _WIN32 - DWORD d = WaitForSingleObject(m_mutex, INFINITE); - /// \todo check 'd' for result -#else - pthread_mutex_lock(&m_mutex); -#endif -} - - -void Mutex::Unlock() const -{ -#ifdef _WIN32 - ::ReleaseMutex(m_mutex); -#else - pthread_mutex_unlock(&m_mutex); -#endif -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.h deleted file mode 100755 index 720209c1e9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Mutex.h +++ /dev/null @@ -1,73 +0,0 @@ -/** \file Mutex.h - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Mutex_H -#define _SOCKETS_Mutex_H - -#include "sockets-config.h" -#ifndef _WIN32 -#include -#else -#include "socket_include.h" -#include -#endif -#include "IMutex.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** Mutex container class, used by Lock. - \ingroup threading */ -class Mutex : public IMutex -{ -public: - Mutex(); - ~Mutex(); - - virtual void Lock() const; - virtual void Unlock() const; - -private: -#ifdef _WIN32 - HANDLE m_mutex; -#else - mutable pthread_mutex_t m_mutex; -#endif -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif -#endif // _SOCKETS_Mutex_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/OSX.zip b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/OSX.zip deleted file mode 100755 index e4046a4a5c..0000000000 Binary files a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/OSX.zip and /dev/null differ diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Parse.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Parse.cpp deleted file mode 100755 index 1286ff6db3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Parse.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/** \file Parse.cpp - parse a string - ** - ** Written: 1999-Feb-10 grymse@alhem.net - **/ - -/* -Copyright (C) 1999-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include -#include - -#include "Parse.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -/* implementation of class Parse */ - -Parse::Parse() -:pa_the_str("") -,pa_splits("") -,pa_ord("") -,pa_the_ptr(0) -,pa_breakchar(0) -,pa_enable(0) -,pa_disable(0) -,pa_nospace(0) -,pa_quote(false) -{ -} - -Parse::Parse(const std::string&s) -:pa_the_str(s) -,pa_splits("") -,pa_ord("") -,pa_the_ptr(0) -,pa_breakchar(0) -,pa_enable(0) -,pa_disable(0) -,pa_nospace(0) -,pa_quote(false) -{ -} - -Parse::Parse(const std::string&s,const std::string&sp) -:pa_the_str(s) -,pa_splits(sp) -,pa_ord("") -,pa_the_ptr(0) -,pa_breakchar(0) -,pa_enable(0) -,pa_disable(0) -,pa_nospace(0) -,pa_quote(false) -{ -} - -Parse::Parse(const std::string&s,const std::string&sp,short nospace) -:pa_the_str(s) -,pa_splits(sp) -,pa_ord("") -,pa_the_ptr(0) -,pa_breakchar(0) -,pa_enable(0) -,pa_disable(0) -,pa_nospace(1) -,pa_quote(false) -{ -} - - -Parse::~Parse() -{ -} - -#define C ((pa_the_ptr - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/***************************************************/ -/* interface of class Parse */ - -/** Splits a string whatever way you want. - \ingroup util */ -class Parse -{ -public: - Parse(); - Parse(const std::string&); - Parse(const std::string&,const std::string&); - Parse(const std::string&,const std::string&,short); - ~Parse(); - short issplit(const char); - void getsplit(); - void getsplit(std::string&); - std::string getword(); - void getword(std::string&); - void getword(std::string&,std::string&,int); - std::string getrest(); - void getrest(std::string&); - long getvalue(); - void setbreak(const char); - int getwordlen(); - int getrestlen(); - void enablebreak(const char c) { - pa_enable = c; - } - void disablebreak(const char c) { - pa_disable = c; - } - void getline(); - void getline(std::string&); - size_t getptr() { - return pa_the_ptr; - } - void EnableQuote(bool b) { - pa_quote = b; - } - -private: - std::string pa_the_str; - std::string pa_splits; - std::string pa_ord; - size_t pa_the_ptr; - char pa_breakchar; - char pa_enable; - char pa_disable; - short pa_nospace; - bool pa_quote; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Parse_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README deleted file mode 100755 index 6dbef38d34..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README +++ /dev/null @@ -1,90 +0,0 @@ -http://www.alhem.net/Sockets/ - -C++ Sockets Library :: installation instructions - - -Unix (and Cygwin/Mingw on windows) -================================== - -1. Change the 'PLATFORM =' line in Makefile - - Possible values are - linux-x86-32 - win32-cygwin - solaris9-sparc-64 - macosx - solaris8 - -2. If you want to use ssl encrypted socket communication, the library - has support for the third-party library openssl. If necessary, add - the following include directory to Makefile: - - INCLUDE = -I/include - - The openssl include directory contains only one directory named - 'openssl', in which all header files can be found. - - OpenSSL support is enabled by default. - - If you don't need encrypted communications, make sure to comment - out this line in the file 'sockets-config.h': - - #define HAVE_OPENSSL - -3. If you really need thread-safe dns lookups, and your operating has - support for *addrinfo and *nameinfo function calls, make sure this - line in 'sockets-config.h' is commented: - - #define NO_GETADDRINFO - - By default, dns lookups using getaddrinfo/getnameinfo is disabled. - -4. If your operating system supports SCTP, there might be a slight - chance the sctp code in the library works. Uncomment this line in - 'sockets-config.h' to try: - - //#define USE_SCTP - -5. If you need IPv6 support, uncomment this line in - 'sockets-config.h': - - //#define ENABLE_IPV6 - -6. Type 'make' - -7. If all builds ok, you'll find the static library file 'libSockets.a' - in the build directory. - - -When compiling the application, any flags used when compiling the library -also needs to be present when including the library .h files. All flags -can be retrieved using the 'Sockets-config' executable. Add something like -this in your Makefile: - -CFLAGS += `Sockets-config` -CPPFLAGS += `Sockets-config` - -When linking an application using the library, make sure the object and -library files are in correct order on your link command line: - - First: Application object files - 2nd: -lSockets - 3rd: openssl libraries - Finally: Everything else, ending with -lpthread - - -windows -======= - -Project files for various IDE's can be found here: - - Project/ Visual studio 6.0 - Project.net/ Visual studio .NET - DevCpp/ Dev C++ - -Please see steps 2-5 above for some details on configuring the library. - -When linking on cygwin/mingw, add the following libraries: - -lwsock32 - -lws2_32 - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README.macosx b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README.macosx deleted file mode 100755 index ffee721a97..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/README.macosx +++ /dev/null @@ -1,9 +0,0 @@ -MAC notes ---------- - -The file OSX.zip contains xcode project files for an older version of the library. - -Find uuid.h (if missing) here: - http://www.die.net/doc/linux/include/uuid/uuid.h -This used to be a problem, but isn't any more afaik. - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.cpp deleted file mode 100755 index 5e5497e833..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/** \file ResolvServer.cpp - ** \date 2005-03-24 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include "ResolvServer.h" -#ifdef ENABLE_RESOLVER -#include "StdoutLog.h" -#include "ListenSocket.h" -#include "ResolvSocket.h" -#include "SocketHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -ResolvServer::ResolvServer(port_t port) -:Thread() -,m_quit(false) -,m_port(port) -,m_ready(false) -{ -} - - -ResolvServer::~ResolvServer() -{ -} - - -void ResolvServer::Run() -{ -// StdoutLog log; - SocketHandler h; - ListenSocket l(h); - - if (l.Bind("127.0.0.1", m_port)) - { - return; - } - h.Add(&l); - - m_ready = true; - while (!m_quit && IsRunning() ) - { - h.Select(0, 500000); - } - SetRunning(false); -} - - -void ResolvServer::Quit() -{ - m_quit = true; -} - - -bool ResolvServer::Ready() -{ - return m_ready; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_RESOLVER - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.h deleted file mode 100755 index 5787d18bb0..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvServer.h +++ /dev/null @@ -1,78 +0,0 @@ -/** \file ResolvServer.h - ** \date 2005-03-24 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_ResolvServer_H -#define _SOCKETS_ResolvServer_H -#include "sockets-config.h" -#ifdef ENABLE_RESOLVER -#include "socket_include.h" -#include "Thread.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** \defgroup async Asynchronous DNS */ -/** Async DNS resolver thread. - \ingroup async */ -class ResolvServer : public Thread -{ -public: - ResolvServer(port_t); - ~ResolvServer(); - - void Run(); - void Quit(); - - bool Ready(); - -private: - ResolvServer(const ResolvServer& ) {} // copy constructor - ResolvServer& operator=(const ResolvServer& ) { - return *this; // assignment operator - } - - bool m_quit; - port_t m_port; - bool m_ready; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_RESOLVER -#endif // _SOCKETS_ResolvServer_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.cpp deleted file mode 100755 index c07e78dce1..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.cpp +++ /dev/null @@ -1,442 +0,0 @@ -/** \file ResolvSocket.cpp - ** \date 2005-03-24 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#pragma warning(disable:4503) -#endif -#else -#include -#endif -#include "ResolvSocket.h" -#ifdef ENABLE_RESOLVER -#include "Utility.h" -#include "Parse.h" -#include "ISocketHandler.h" -#include "Lock.h" -#include "Mutex.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -// static -ResolvSocket::cache_t ResolvSocket::m_cache; -ResolvSocket::timeout_t ResolvSocket::m_cache_to; -Mutex ResolvSocket::m_cache_mutex; - - -ResolvSocket::ResolvSocket(ISocketHandler& h) -:TcpSocket(h) -,m_bServer(false) -,m_parent(NULL) -,m_parent_uid(0) -#ifdef ENABLE_IPV6 -,m_resolve_ipv6(false) -#endif -,m_cached(false) -{ - SetLineProtocol(); -} - - -ResolvSocket::ResolvSocket(ISocketHandler& h, Socket *parent, const std::string& host, port_t port, bool ipv6) -:TcpSocket(h) -,m_bServer(false) -,m_parent(parent) -,m_parent_uid(parent -> UniqueIdentifier()) -,m_resolv_host(host) -,m_resolv_port(port) -#ifdef ENABLE_IPV6 -,m_resolve_ipv6(ipv6) -#endif -,m_cached(false) -{ - SetLineProtocol(); -} - - -ResolvSocket::ResolvSocket(ISocketHandler& h, Socket *parent, ipaddr_t a) -:TcpSocket(h) -,m_bServer(false) -,m_parent(parent) -,m_parent_uid(parent -> UniqueIdentifier()) -,m_resolv_port(0) -,m_resolv_address(a) -#ifdef ENABLE_IPV6 -,m_resolve_ipv6(false) -#endif -,m_cached(false) -{ - SetLineProtocol(); -} - - -#ifdef ENABLE_IPV6 -ResolvSocket::ResolvSocket(ISocketHandler& h, Socket *parent, in6_addr& a) -:TcpSocket(h) -,m_bServer(false) -,m_parent(parent) -,m_parent_uid(parent -> UniqueIdentifier()) -,m_resolv_port(0) -,m_resolve_ipv6(true) -,m_resolv_address6(a) -,m_cached(false) -{ - SetLineProtocol(); -} -#endif - - -ResolvSocket::~ResolvSocket() -{ -} - - -void ResolvSocket::OnLine(const std::string& line) -{ - Parse pa(line, ":"); - if (m_bServer) - { - m_query = pa.getword(); - m_data = pa.getrest(); -DEB( fprintf(stderr, " *** ResolvSocket server; query=%s, data=%s\n", m_query.c_str(), m_data.c_str());) - // %! check cache - { - Lock lock(m_cache_mutex); - if (m_cache[m_query].find(m_data) != m_cache[m_query].end()) - { - if (time(NULL) - m_cache_to[m_query][m_data] < 3600) // ttl - { - std::string result = m_cache[m_query][m_data]; -DEB(fprintf(stderr, " *** Returning cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), result.c_str());) - Send("Cached\n"); - if (!result.size()) /* failed */ - { - Send("Failed\n\n"); - SetCloseAndDelete(); - return; - } - else - if (m_query == "gethostbyname") - { - Send("A: " + result + "\n\n"); - SetCloseAndDelete(); - return; - } - else -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (m_query == "gethostbyname2") - { - Send("AAAA: " + result + "\n\n"); - SetCloseAndDelete(); - return; - } - else -#endif -#endif - if (m_query == "gethostbyaddr") - { - Send("Name: " + result + "\n\n"); - SetCloseAndDelete(); - return; - } - } - } - } - if (!Detach()) // detach failed? - { - SetCloseAndDelete(); - } - return; - } - std::string key = pa.getword(); - std::string value = pa.getrest(); -DEB( fprintf(stderr, " *** ResolvSocket response; %s: %s\n", key.c_str(), value.c_str());) - - if (key == "Cached") - { - m_cached = true; - } - else - if (key == "Failed" && m_parent) - { -DEB( fprintf(stderr, " ************ Resolve failed\n");) - if (Handler().Resolving(m_parent) || Handler().Valid(m_parent_uid)) - { - m_parent -> OnResolveFailed(m_resolv_id); - } - // update cache - if (!m_cached) - { - Lock lock(m_cache_mutex); -DEB(fprintf(stderr, " *** Update cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), value.c_str());) - m_cache[m_query][m_data] = value; - m_cache_to[m_query][m_data] = time(NULL); - } - m_parent = NULL; - } - else - if (key == "Name" && !m_resolv_host.size() && m_parent) - { - if (Handler().Resolving(m_parent) || Handler().Valid(m_parent_uid)) - { - m_parent -> OnReverseResolved(m_resolv_id, value); - } - // update cache - if (!m_cached) - { - Lock lock(m_cache_mutex); -DEB(fprintf(stderr, " *** Update cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), value.c_str());) - m_cache[m_query][m_data] = value; - m_cache_to[m_query][m_data] = time(NULL); - } - m_parent = NULL; - } - else - if (key == "A" && m_parent) - { - if (Handler().Resolving(m_parent) || Handler().Valid(m_parent_uid)) - { - ipaddr_t l; - Utility::u2ip(value, l); // ip2ipaddr_t - m_parent -> OnResolved(m_resolv_id, l, m_resolv_port); - } - // update cache - if (!m_cached) - { - Lock lock(m_cache_mutex); -DEB(fprintf(stderr, " *** Update cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), value.c_str());) - m_cache[m_query][m_data] = value; - m_cache_to[m_query][m_data] = time(NULL); - } - m_parent = NULL; // always use first ip in case there are several - } -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - else - if (key == "AAAA" && m_parent) - { - if (Handler().Resolving(m_parent) || Handler().Valid(m_parent_uid)) - { - in6_addr a; - Utility::u2ip(value, a); - m_parent -> OnResolved(m_resolv_id, a, m_resolv_port); - } - // update cache - if (!m_cached) - { - Lock lock(m_cache_mutex); -DEB(fprintf(stderr, " *** Update cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), value.c_str());) - m_cache[m_query][m_data] = value; - m_cache_to[m_query][m_data] = time(NULL); - } - m_parent = NULL; - } -#endif -#endif -} - - -void ResolvSocket::OnDetached() -{ -DEB( fprintf(stderr, " *** ResolvSocket::OnDetached(); query=%s, data=%s\n", m_query.c_str(), m_data.c_str());) - if (m_query == "gethostbyname") - { - struct sockaddr_in sa; - if (Utility::u2ip(m_data, sa)) - { - std::string ip; - Utility::l2ip(sa.sin_addr, ip); - Send("A: " + ip + "\n"); - } - else - { - Send("Failed\n"); - } - Send("\n"); - } - else -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (m_query == "gethostbyname2") - { - struct sockaddr_in6 sa; - if (Utility::u2ip(m_data, sa)) - { - std::string ip; - Utility::l2ip(sa.sin6_addr, ip); - Send("AAAA: " + ip + "\n"); - } - else - { - Send("Failed\n"); - } - Send("\n"); - } - else -#endif -#endif - if (m_query == "gethostbyaddr") - { - if (Utility::isipv4( m_data )) - { - struct sockaddr_in sa; - if (!Utility::u2ip(m_data, sa, AI_NUMERICHOST)) - { - Send("Failed: convert to sockaddr_in failed\n"); - } - else - { - std::string name; - if (!Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), name)) - { - Send("Failed: ipv4 reverse lookup of " + m_data + "\n"); - } - else - { - Send("Name: " + name + "\n"); - } - } - } - else -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (Utility::isipv6( m_data )) - { - struct sockaddr_in6 sa; - if (!Utility::u2ip(m_data, sa, AI_NUMERICHOST)) - { - Send("Failed: convert to sockaddr_in6 failed\n"); - } - else - { - std::string name; - if (!Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), name)) - { - Send("Failed: ipv6 reverse lookup of " + m_data + "\n"); - } - else - { - Send("Name: " + name + "\n"); - } - } - } - else -#endif -#endif - { - Send("Failed: malformed address\n"); - } - Send("\n"); - } - else - { - std::string msg = "Unknown query type: " + m_query; - Handler().LogError(this, "OnDetached", 0, msg); - Send("Unknown\n\n"); - } - SetCloseAndDelete(); -} - - -void ResolvSocket::OnConnect() -{ - if (m_resolv_host.size()) - { -#ifdef ENABLE_IPV6 - std::string msg = (m_resolve_ipv6 ? "gethostbyname2 " : "gethostbyname ") + m_resolv_host + "\n"; - m_query = m_resolve_ipv6 ? "gethostbyname2" : "gethostbyname"; -#else - std::string msg = "gethostbyname " + m_resolv_host + "\n"; - m_query = "gethostbyname"; -#endif - m_data = m_resolv_host; - Send( msg ); - return; - } -#ifdef ENABLE_IPV6 - if (m_resolve_ipv6) - { - std::string tmp; - Utility::l2ip(m_resolv_address6, tmp); - m_query = "gethostbyaddr"; - m_data = tmp; - std::string msg = "gethostbyaddr " + tmp + "\n"; - Send( msg ); - } -#endif - std::string tmp; - Utility::l2ip(m_resolv_address, tmp); - m_query = "gethostbyaddr"; - m_data = tmp; - std::string msg = "gethostbyaddr " + tmp + "\n"; - Send( msg ); -} - - -void ResolvSocket::OnDelete() -{ - if (m_parent) - { - if (Handler().Resolving(m_parent) || Handler().Valid(m_parent_uid)) - { - m_parent -> OnResolveFailed(m_resolv_id); - } - // update cache - if (!m_cached) - { - Lock lock(m_cache_mutex); - std::string value; -DEB(fprintf(stderr, " *** Update cache for [%s][%s] = '%s'\n", m_query.c_str(), m_data.c_str(), value.c_str());) - m_cache[m_query][m_data] = value; - m_cache_to[m_query][m_data] = time(NULL); - } - m_parent = NULL; - } -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_RESOLVER - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.h deleted file mode 100755 index e080d01255..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ResolvSocket.h +++ /dev/null @@ -1,120 +0,0 @@ -/** \file ResolvSocket.h - ** \date 2005-03-24 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_ResolvSocket_H -#define _SOCKETS_ResolvSocket_H -#include "sockets-config.h" -#ifdef ENABLE_RESOLVER -#include "TcpSocket.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class Mutex; - -/** Async DNS resolver socket. - \ingroup async */ -class ResolvSocket : public TcpSocket -{ - typedef std::map > cache_t; /* host, result */ - typedef std::map > timeout_t; /* host, time */ - -public: - ResolvSocket(ISocketHandler&); - ResolvSocket(ISocketHandler&, Socket *parent, const std::string& host, port_t port, bool ipv6 = false); - ResolvSocket(ISocketHandler&, Socket *parent, ipaddr_t); -#ifdef ENABLE_IPV6 - ResolvSocket(ISocketHandler&, Socket *parent, in6_addr&); -#endif - ~ResolvSocket(); - - void OnAccept() { - m_bServer = true; - } - void OnLine(const std::string& line); - void OnDetached(); - void OnDelete(); - - void SetId(int x) { - m_resolv_id = x; - } - int GetId() { - return m_resolv_id; - } - - void OnConnect(); - -#ifdef ENABLE_IPV6 - void SetResolveIpv6(bool x = true) { - m_resolve_ipv6 = x; - } -#endif - -private: - ResolvSocket(const ResolvSocket& s) : TcpSocket(s) {} // copy constructor - ResolvSocket& operator=(const ResolvSocket& ) { - return *this; // assignment operator - } - - std::string m_query; - std::string m_data; - bool m_bServer; - Socket *m_parent; - socketuid_t m_parent_uid; - int m_resolv_id; - std::string m_resolv_host; - port_t m_resolv_port; - ipaddr_t m_resolv_address; -#ifdef ENABLE_IPV6 - bool m_resolve_ipv6; - in6_addr m_resolv_address6; -#endif - static cache_t m_cache; - static timeout_t m_cache_to; - static Mutex m_cache_mutex; - bool m_cached; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_RESOLVER -#endif // _SOCKETS_ResolvSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.cpp deleted file mode 100755 index 29c2b8ac39..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/** - ** \file SSLInitializer.cpp - ** \date 2007-04-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#endif -#include "SSLInitializer.h" -#ifdef HAVE_OPENSSL -#include -#include "Utility.h" -#include -#include "Lock.h" - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -std::map *SSLInitializer::m_mmap = NULL; -Mutex *SSLInitializer::m_mmap_mutex = NULL; - - -SSLInitializer::SSLInitializer() -{ -DEB( fprintf(stderr, "SSLInitializer()\n");) - - bio_err = NULL; - m_rand_size = 1024; - - /* An error write context */ - bio_err = BIO_new_fp(stderr, BIO_NOCLOSE); - - /* Global system initialization*/ - SSL_library_init(); - SSL_load_error_strings(); - OpenSSL_add_all_algorithms(); - CRYPTO_set_locking_callback( SSL_locking_function ); - CRYPTO_set_id_callback( SSL_id_function ); - - std::string randfile = Utility::GetEnv("RANDFILE"); - std::string home = Utility::GetEnv("HOME"); - if (randfile.empty() && home.empty()) - { - std::string homepath = Utility::GetEnv("HOMEPATH"); - if (!homepath.empty()) - { - Utility::SetEnv("HOME", homepath); - } - } - char path[512]; - *path = 0; - RAND_file_name(path, 512); - if (*path) - { - m_rand_file = path; - m_rand_size = 1024; - RAND_write_file(path); - } - else - { -DEB( fprintf(stderr, "SSLInitializer: no random file generated\n");) - } - - /* Load randomness */ - if (!m_rand_file.size() || !RAND_load_file(m_rand_file.c_str(), m_rand_size)) - { -DEB( fprintf(stderr, "SSLInitializer: PRNG not initialized\n");) - } - -} - - -SSLInitializer::~SSLInitializer() -{ -DEB( fprintf(stderr, "~SSLInitializer()\n");) - DeleteRandFile(); - // %! delete mutexes -} - - -void SSLInitializer::DeleteRandFile() -{ - if (m_rand_file.size()) - { -#ifdef _WIN32 - _unlink(m_rand_file.c_str()); -#else - unlink(m_rand_file.c_str()); -#endif - } -} - - -void SSLInitializer::SSL_locking_function(int mode, int n, const char *file, int line) -{ - IMutex *mutex = NULL; - { - Lock lock(MMapMutex()); - if (MMap().find(n) == MMap().end()) - { - MMap()[n] = new Mutex; - } - mutex = MMap()[n]; - } - if (mode & CRYPTO_LOCK) - { - mutex -> Lock(); - } - else - { - mutex -> Unlock(); - } -} - - -unsigned long SSLInitializer::SSL_id_function() -{ - return Utility::ThreadID(); -} - - -std::map& SSLInitializer::MMap() -{ - if (m_mmap == NULL) - m_mmap = new std::map(); - return *m_mmap; -} - - -Mutex& SSLInitializer::MMapMutex() -{ - if (m_mmap_mutex == NULL) - m_mmap_mutex = new Mutex(); - return *m_mmap_mutex; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // HAVE_OPENSSL - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.h deleted file mode 100755 index 4945458f92..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SSLInitializer.h +++ /dev/null @@ -1,97 +0,0 @@ -/** - ** \file SSLInitializer.h - ** \date 2007-04-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef __SOCKETS_SSLInitializer_H -#define __SOCKETS_SSLInitializer_H -#include "sockets-config.h" -#ifdef HAVE_OPENSSL - -#ifdef _WIN32 -#include -#endif -#include -#include -#include -#include "Mutex.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class SSLInitializer -{ -public: - /** - init openssl - bio_err - create random file - */ - SSLInitializer(); - - /** - remove random file - */ - ~SSLInitializer(); - - void DeleteRandFile(); - - /** SSL; mutex locking function callback. */ - static void SSL_locking_function(int mode, int n, const char *file, int line); - - /** Return thread id. */ - static unsigned long SSL_id_function(); - - BIO *bio_err; - -private: - std::string m_rand_file; - long m_rand_size; - static std::map *m_mmap; - static Mutex *m_mmap_mutex; - - static std::map& MMap(); - static Mutex& MMapMutex(); - -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // HAVE_OPENSSL -#endif // __SOCKETS_SSLInitializer_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.cpp deleted file mode 100755 index 767438c636..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.cpp +++ /dev/null @@ -1,506 +0,0 @@ -/** - ** \file SctpSocket.cpp - ** \date 2006-09-04 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "SctpSocket.h" -#ifdef USE_SCTP -#include "Utility.h" -#include "ISocketHandler.h" -#include -#include "Ipv4Address.h" -#include "Ipv6Address.h" -#ifdef ENABLE_EXCEPTIONS -#include "Exception.h" -#endif - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -SctpSocket::SctpSocket(ISocketHandler& h,int type) : StreamSocket(h) -,m_type(type) -,m_buf(new char[SCTP_BUFSIZE_READ]) -{ - if (type != SOCK_STREAM && type != SOCK_SEQPACKET) - { - } -} - - -SctpSocket::~SctpSocket() -{ - delete[] m_buf; -} - - -int SctpSocket::Bind(const std::string& a,port_t p) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(a, p); - return Bind(ad); - } -#endif -#endif - Ipv4Address ad(a, p); - return Bind(ad); -} - - -int SctpSocket::Bind(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SctpSocket", -1, "invalid address", LOG_LEVEL_ERROR); - return -1; - } - if (GetSocket() == INVALID_SOCKET) - { - Attach(CreateSocket(ad.GetFamily(), m_type, "sctp")); - } - if (GetSocket() != INVALID_SOCKET) - { - int n = bind(GetSocket(), ad, ad); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "bind() failed", LOG_LEVEL_ERROR); -#ifdef ENABLE_EXCEPTIONS - throw Exception("bind() failed for SctpSocket, port: " + Utility::l2string(ad.GetPort())); -#endif - } - return n; - } - return -1; -} - - -int SctpSocket::AddAddress(const std::string& a,port_t p) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(a, p); - return AddAddress(ad); - } -#endif -#endif - Ipv4Address ad(a, p); - return AddAddress(ad); -} - - -int SctpSocket::AddAddress(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SctpSocket", -1, "invalid address", LOG_LEVEL_ERROR); - return -1; - } - if (GetSocket() == INVALID_SOCKET) - { - Handler().LogError(this, "SctpSocket", -1, "AddAddress called with invalid file descriptor", LOG_LEVEL_ERROR); - return -1; - } - int n = sctp_bindx(GetSocket(), ad, ad, SCTP_BINDX_ADD_ADDR); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "sctp_bindx() failed", LOG_LEVEL_ERROR); - } - return n; -} - - -int SctpSocket::RemoveAddress(const std::string& a,port_t p) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(a, p); - return RemoveAddress(ad); - } -#endif -#endif - Ipv4Address ad(a, p); - return RemoveAddress(ad); -} - - -int SctpSocket::RemoveAddress(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SctpSocket", -1, "invalid address", LOG_LEVEL_ERROR); - return -1; - } - if (GetSocket() == INVALID_SOCKET) - { - Handler().LogError(this, "SctpSocket", -1, "RemoveAddress called with invalid file descriptor", LOG_LEVEL_ERROR); - return -1; - } - int n = sctp_bindx(GetSocket(), ad, ad, SCTP_BINDX_REM_ADDR); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "sctp_bindx() failed", LOG_LEVEL_ERROR); - } - return n; -} - - -int SctpSocket::Open(const std::string& a,port_t p) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(a, p); - return Open(ad); - } -#endif -#endif - Ipv4Address ad(a, p); - return Open(ad); -} - - -int SctpSocket::Open(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SctpSocket", -1, "invalid address", LOG_LEVEL_ERROR); - return -1; - } - if (GetSocket() == INVALID_SOCKET) - { - Attach(CreateSocket(ad.GetFamily(), m_type, "sctp")); - } - if (GetSocket() != INVALID_SOCKET) - { - if (!SetNonblocking(true)) - { - return -1; - } - int n = connect(GetSocket(), ad, ad); - if (n == -1) - { - // check error code that means a connect is in progress -#ifdef _WIN32 - if (Errno == WSAEWOULDBLOCK) -#else - if (Errno == EINPROGRESS) -#endif - { - Handler().LogError(this, "connect: connection pending", Errno, StrError(Errno), LOG_LEVEL_INFO); - SetConnecting( true ); // this flag will control fd_set's - } - else - { - Handler().LogError(this, "SctpSocket", -1, "connect() failed", LOG_LEVEL_ERROR); - } - } - return n; - } - return -1; -} - - -#ifndef SOLARIS -int SctpSocket::AddConnection(const std::string& a,port_t p) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(a, p); - return AddConnection(ad); - } -#endif -#endif - Ipv4Address ad(a, p); - return AddConnection(ad); -} - - -int SctpSocket::AddConnection(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SctpSocket", -1, "invalid address", LOG_LEVEL_ERROR); - return -1; - } - if (GetSocket() == INVALID_SOCKET) - { - Handler().LogError(this, "SctpSocket", -1, "AddConnection called with invalid file descriptor", LOG_LEVEL_ERROR); - return -1; - } - int n = sctp_connectx(GetSocket(), ad, ad); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "sctp_connectx() failed", LOG_LEVEL_ERROR); - } - else - { - SetConnecting(); - } - return n; -} -#endif - - -int SctpSocket::getpaddrs(sctp_assoc_t id,std::list& vec) -{ - struct sockaddr *p = NULL; - int n = sctp_getpaddrs(GetSocket(), id, &p); - if (!n || n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "sctp_getpaddrs failed", LOG_LEVEL_WARNING); - return n; - } - for (int i = 0; i < n; i++) - { - vec.push_back(Utility::Sa2String(&p[i])); - } - sctp_freepaddrs(p); - return n; -} - - -int SctpSocket::getladdrs(sctp_assoc_t id,std::list& vec) -{ - struct sockaddr *p = NULL; - int n = sctp_getladdrs(GetSocket(), id, &p); - if (!n || n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "sctp_getladdrs failed", LOG_LEVEL_WARNING); - return n; - } - for (int i = 0; i < n; i++) - { - vec.push_back(Utility::Sa2String(&p[i])); - } - sctp_freeladdrs(p); - return n; -} - - -int SctpSocket::PeelOff(sctp_assoc_t id) -{ - int n = sctp_peeloff(GetSocket(), id); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", -1, "PeelOff failed", LOG_LEVEL_WARNING); - return -1; - } - Socket *p = Create(); - p -> Attach(n); - p -> SetDeleteByHandler(); - Handler().Add(p); - return n; -} - - -void SctpSocket::OnRead() -{ -/* - int sctp_recvmsg(int sd, void * msg, size_t * len, - struct sockaddr * from, socklen_t * fromlen, - struct sctp_sndrcvinfo * sinfo, int * msg_flags); - - DESCRIPTION - sctp_recvmsg is a wrapper library function that can be used to receive a message from a socket while using the advanced - features of SCTP. sd is the socket descriptor on which the message pointed to by msg of length len is received. - - If from is not NULL, the source address of the message is filled in. The argument fromlen is a value-result parameter. - initialized to the size of the buffer associated with from , and modified on return to indicate the actual size of the - address stored. - - sinfo is a pointer to a sctp_sndrcvinfo structure to be filled upon receipt of the message. msg_flags is a pointer to a - integer that is filled with any message flags like MSG_NOTIFICATION or MSG_EOR. - -*/ - struct sockaddr sa; - socklen_t sa_len = 0; - struct sctp_sndrcvinfo sinfo; - int flags = 0; - int n = sctp_recvmsg(GetSocket(), m_buf, SCTP_BUFSIZE_READ, &sa, &sa_len, &sinfo, &flags); - if (n == -1) - { - Handler().LogError(this, "SctpSocket", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - else - { - OnReceiveMessage(m_buf, n, &sa, sa_len, &sinfo, flags); - } -} - - -void SctpSocket::OnReceiveMessage(const char *buf,size_t sz,struct sockaddr *sa,socklen_t sa_len,struct sctp_sndrcvinfo *sinfo,int msg_flags) -{ -} - - -void SctpSocket::OnWrite() -{ - if (Connecting()) - { - int err = SoError(); - - // don't reset connecting flag on error here, we want the OnConnectFailed timeout later on - /// \todo add to read fd_set here - if (!err) // ok - { - Set(!IsDisableRead(), false); - SetConnecting(false); - SetCallOnConnect(); - return; - } - Handler().LogError(this, "sctp: connect failed", err, StrError(err), LOG_LEVEL_FATAL); - Set(false, false); // no more monitoring because connection failed - - // failed -#ifdef ENABLE_SOCKS4 - if (Socks4()) - { - OnSocks4ConnectFailed(); - return; - } -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && GetConnectionRetries() < GetConnectionRetry()) ) - { - // even though the connection failed at once, only retry after - // the connection timeout. - // should we even try to connect again, when CheckConnect returns - // false it's because of a connection error - not a timeout... - return; - } - SetConnecting(false); - SetCloseAndDelete( true ); - /// \todo state reason why connect failed - OnConnectFailed(); - return; - } -} - - -void SctpSocket::OnConnectTimeout() -{ - Handler().LogError(this, "connect", -1, "connect timeout", LOG_LEVEL_FATAL); -#ifdef ENABLE_SOCKS4 - if (Socks4()) - { - OnSocks4ConnectFailed(); - // retry direct connection - } - else -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && GetConnectionRetries() < GetConnectionRetry()) ) - { - IncreaseConnectionRetries(); - // ask socket via OnConnectRetry callback if we should continue trying - if (OnConnectRetry()) - { - SetRetryClientConnect(); - } - else - { - SetCloseAndDelete( true ); - /// \todo state reason why connect failed - OnConnectFailed(); - } - } - else - { - SetCloseAndDelete(true); - /// \todo state reason why connect failed - OnConnectFailed(); - } - // - SetConnecting(false); -} - - -#ifdef _WIN32 -void SctpSocket::OnException() -{ - if (Connecting()) - { -#ifdef ENABLE_SOCKS4 - if (Socks4()) - OnSocks4ConnectFailed(); - else -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && - GetConnectionRetries() < GetConnectionRetry() )) - { - // even though the connection failed at once, only retry after - // the connection timeout - // should we even try to connect again, when CheckConnect returns - // false it's because of a connection error - not a timeout... - } - else - { - SetConnecting(false); // tnx snibbe - SetCloseAndDelete(); - OnConnectFailed(); - } - return; - } - // %! exception doesn't always mean something bad happened, this code should be reworked - // errno valid here? - int err = SoError(); - Handler().LogError(this, "exception on select", err, StrError(err), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -} -#endif // _WIN32 - - -int SctpSocket::Protocol() -{ - return IPPROTO_SCTP; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE -#endif - - -#endif // USE_SCTP - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.h deleted file mode 100755 index 61102ff2f5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SctpSocket.h +++ /dev/null @@ -1,122 +0,0 @@ -/** - ** \file SctpSocket.h - ** \date 2006-09-04 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_SctpSocket_H -#define _SOCKETS_SctpSocket_H -#include "sockets-config.h" - -#include "StreamSocket.h" -#ifdef USE_SCTP -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -#define SCTP_BUFSIZE_READ 16400 - -class SocketAddress; - - -class SctpSocket : public StreamSocket -{ -public: - /** SctpSocket constructor. - \param h Owner - \param type SCTP_STREAM or SCTP_SEQPACKET */ - SctpSocket(ISocketHandler& h,int type); - ~SctpSocket(); - - /** bind() */ - int Bind(const std::string&,port_t); - int Bind(SocketAddress&); - /** sctp_bindx() */ - int AddAddress(const std::string&,port_t); - int AddAddress(SocketAddress&); - /** sctp_bindx() */ - int RemoveAddress(const std::string&,port_t); - int RemoveAddress(SocketAddress&); - - /** connect() */ - int Open(const std::string&,port_t); - int Open(SocketAddress&); - - /** Connect timeout callback. */ - void OnConnectTimeout(); -#ifdef _WIN32 - /** Connection failed reported as exception on win32 */ - void OnException(); -#endif - -#ifndef SOLARIS - /** sctp_connectx() */ - int AddConnection(const std::string&,port_t); - int AddConnection(SocketAddress&); -#endif - - /** Get peer addresses of an association. */ - int getpaddrs(sctp_assoc_t id,std::list&); - /** Get all bound addresses of an association. */ - int getladdrs(sctp_assoc_t id,std::list&); - - /** sctp_peeloff */ - int PeelOff(sctp_assoc_t id); - - /** recvmsg callback */ - virtual void OnReceiveMessage(const char *buf,size_t sz,struct sockaddr *sa,socklen_t sa_len,struct sctp_sndrcvinfo *sinfo,int msg_flags) = 0; - - void OnOptions(int,int,int,SOCKET) {} - - virtual int Protocol(); - -protected: - SctpSocket(const SctpSocket& s) : StreamSocket(s) {} - void OnRead(); - void OnWrite(); - -private: - SctpSocket& operator=(const SctpSocket& s) { - return *this; - } - int m_type; ///< SCTP_STREAM or SCTP_SEQPACKET - char *m_buf; ///< Temporary receive buffer -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE -#endif - -#endif // USE_SCTP -#endif // _SOCKETS_SctpSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.cpp deleted file mode 100755 index 0fdf2245f2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/** - ** \file Semaphore.cpp - ** \date 2007-04-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "Semaphore.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// --------------------------------------------------------------- -#ifdef _WIN32 - -Semaphore::Semaphore(value_t start_val) -{ - m_handle = ::CreateSemaphore((LPSECURITY_ATTRIBUTES)NULL, start_val, 1, (LPCTSTR)NULL); -} - - -Semaphore::~Semaphore() -{ - ::CloseHandle(m_handle); -} - - -int Semaphore::Post() -{ - return (::ReleaseSemaphore(m_handle, 1, (LPLONG)NULL) != 0) ? 0 : -1; -} - - -int Semaphore::Wait() -{ - return (WaitForSingleObject(m_handle, INFINITE) == WAIT_OBJECT_0) ? 0 : -1; -} - - -int Semaphore::TryWait() -{ - return -1; // %! not implemented -} - - -int Semaphore::GetValue(int& i) -{ - return 0; // %! not implemented -} - -// --------------------------------------------------------------- -#else - -Semaphore::Semaphore(value_t start_val) -{ - sem_init(&m_sem, 0, start_val); -} - - -Semaphore::~Semaphore() -{ - sem_destroy(&m_sem); -} - - -int Semaphore::Post() -{ - return sem_post(&m_sem); -} - - -int Semaphore::Wait() -{ - return sem_wait(&m_sem); -} - - -int Semaphore::TryWait() -{ - return sem_trywait(&m_sem); -} - - -int Semaphore::GetValue(int& i) -{ - return sem_getvalue(&m_sem, &i); -} - -#endif - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.h deleted file mode 100755 index 02010093e2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Semaphore.h +++ /dev/null @@ -1,100 +0,0 @@ -/** - ** \file Semaphore.h - ** \date 2007-04-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Semaphore_H -#define _SOCKETS_Semaphore_H - -#include "sockets-config.h" -#ifdef _WIN32 -#include "socket_include.h" -#include -#else -#include -#ifdef MACOSX -#include -#else -#include -#endif -#endif - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -#ifdef _WIN32 -typedef LONG value_t; -#else -typedef unsigned int value_t; -#endif - -/** pthread semaphore wrapper. - \ingroup threading */ -class Semaphore -{ -public: - Semaphore(value_t start_val = 0); - ~Semaphore(); - - /** \return 0 if successful */ - int Post(); - /** Wait for Post - \return 0 if successful */ - int Wait(); - - /** Not implemented for win32 */ - int TryWait(); - - /** Not implemented for win32 */ - int GetValue(int&); - -private: - Semaphore(const Semaphore& ) {} // copy constructor - Semaphore& operator=(const Semaphore& ) { - return *this; // assignment operator - } -#ifdef _WIN32 - HANDLE m_handle; -#else - sem_t m_sem; -#endif -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // _SOCKETS_Semaphore_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.cpp deleted file mode 100755 index 17e831bbf6..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/** - ** \file SmtpdSocket.cpp - ** \date 2007-05-10 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "SmtpdSocket.h" -#include "Parse.h" -#include "Utility.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -SmtpdSocket::SmtpdSocket(ISocketHandler& h) -:TcpSocket(h) -,m_hello(false) -,m_data(false) -,m_header(false) -{ - SetLineProtocol(); -} - - -void SmtpdSocket::OnAccept() -{ - Send("220 ESMTP; \r\n"); -} - - -void SmtpdSocket::OnLine(const std::string& line) -{ - if (m_data) - { - if (m_header) - { - if (!line.size()) - { - if (m_header_line.size()) - { - Parse pa(m_header_line, ":"); - std::string key = pa.getword(); - OnHeader(key, pa.getrest()); - } - m_header = false; - OnHeaderComplete(); - } - else - if (line[0] == ' ' || line[0] == '\t') - { - m_header_line += line; - } - else - { - if (m_header_line.size()) - { - Parse pa(m_header_line, ":"); - std::string key = pa.getword(); - OnHeader(key, pa.getrest()); - } - m_header_line = line; - } - } - else - if (line == ".") - { - m_data = false; - if (OnDataComplete()) - Send("250 OK\r\n"); - else - Send("550 Failed\r\n"); - } - else - if (line.size() && line[0] == '.') - { - OnData(line.substr(1)); - } - else - { - OnData(line); - } - return; - } - Parse pa(line); - std::string cmd = Utility::ToUpper(pa.getword()); - - if (cmd == "EHLO") - { - if (!OnHello(pa.getrest())) - { - Send("550 Failed\r\n"); - } - else - { - m_hello = true; - Send("250 mail.alhem.net\r\n"); - } - } - else - if (cmd == "HELO") - { - if (!OnHello(pa.getrest())) - { - Send("550 Failed\r\n"); - } - else - { - m_hello = true; - Send("250 mail.alhem.net\r\n"); - } - } - else - if (!m_hello) - { - OnAbort(SMTP_NO_HELLO); - SetCloseAndDelete(); - } - else - if (cmd == "MAIL") // mail from: - { - Parse pa(line, ":"); - pa.getword(); // 'mail' - pa.getword(); // 'from' - std::string email = Utility::ToLower(pa.getrest()); - - EmailAddress addr( email ); - if (addr.GetName().size() > 64) - { - OnAbort(SMTP_NAME_TOO_LONG); - Send("500 Name too long.\r\n"); - return; - } - if (addr.GetDomain().size() > 64) - { - OnAbort(SMTP_DOMAIN_TOO_LONG); - Send("500 Domain too long.\r\n"); - return; - } - - if (!OnMailFrom( addr )) - { - Send("550 Failed\r\n"); - } - else - { - Send("250 OK\r\n"); - } - } - else - if (cmd == "RCPT") // rcpt to: - { - Parse pa(line, ":"); - pa.getword(); // 'rcpt' - pa.getword(); // 'to' - std::string email = Utility::ToLower(pa.getrest()); - // %! reject based on user / domain? - EmailAddress addr( email ); - - if (addr.GetName().size() > 64) - { - OnAbort(SMTP_NAME_TOO_LONG); - Send("500 Name too long.\r\n"); - return; - } - if (addr.GetDomain().size() > 64) - { - OnAbort(SMTP_DOMAIN_TOO_LONG); - Send("500 Domain too long.\r\n"); - return; - } - - if (!OnRcptTo( addr )) - { - Send("553 Failed\r\n"); - } - else - { - Send("250 OK\r\n"); - } - } - else - if (cmd == "DATA") - { - Send("354 Enter mail, end with \".\" on a line by itself\r\n"); - m_data = true; - m_header = false; - } - else - if (cmd == "RSET") - { - m_data = false; - m_header = false; - OnRset(); - Send("250 OK\r\n"); // %! ??? - } - else - if (cmd == "QUIT") - { - OnAbort(SMTP_QUIT); - Send("221 Bye Bye\r\n"); - SetCloseAndDelete(); - } - else - if (cmd == "NOOP") - { - Send("250 OK\r\n"); - } - else - { - OnNotSupported(cmd, pa.getrest()); - } -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.h deleted file mode 100755 index 7b42988bd7..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SmtpdSocket.h +++ /dev/null @@ -1,171 +0,0 @@ -/** - ** \file SmtpdSocket.h - ** \date 2007-05-10 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_SmtpdSocket_H -#define _SOCKETS_SmtpdSocket_H - -#include "sockets-config.h" -#include -#include "TcpSocket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** Smtp server base class. */ -class SmtpdSocket : public TcpSocket -{ -protected: - typedef enum { - SMTP_NO_HELLO, - SMTP_NAME_TOO_LONG, - SMTP_DOMAIN_TOO_LONG, - SMTP_QUIT - } reason_t; - -public: - class EmailAddress - { - public: - EmailAddress(const std::string& str_in) { - std::string str = str_in; - size_t i = str.find("<"); - - if (i != std::string::npos) - str = str.substr(i + 1); - - i = str.find("@"); - - if (i != std::string::npos) { - m_name = str.substr(0, i); - str = str.substr(i + 1); - i = str.find(">"); - - if (i != std::string::npos) - str = str.substr(0, i); - - m_domain = str; - } - - while (m_name.size() && m_name[m_name.size() - 1] == ' ') - m_name.resize(m_name.size() - 1); - - while (m_domain.size() && m_domain[m_domain.size() - 1] == ' ') - m_domain.resize(m_domain.size() - 1); - - while (m_name.size() && m_name[0] == ' ') - m_name = m_name.substr(1); - - while (m_domain.size() && m_domain[0] == ' ') - m_domain = m_domain.substr(1); - - m_top = m_domain; - { - for (size_t i = 0; i < m_domain.size(); i++) { - if (m_domain[i] == '.') { - m_sub = m_top; - m_top = m_domain.substr(i + 1); - } - } - } - } - - const std::string& GetName() const { - return m_name; - } - const std::string& GetDomain() const { - return m_domain; - } - const std::string& GetTopDomain() const { - return m_top; - } - const std::string& GetSubDomain() const { - return m_sub; - } - - std::string ToString() const { - return m_name + "@" + m_domain; - } - - private: - std::string m_name; - std::string m_domain; - std::string m_top; - std::string m_sub; - }; - -public: - SmtpdSocket(ISocketHandler&); - - void OnAccept(); - void OnLine(const std::string&); - - /** \return 'false' to abort */ - virtual bool OnHello(const std::string& domain) = 0; - - /** \return 'false' to abort */ - virtual bool OnMailFrom(const EmailAddress& addr) = 0; - - /** \return 'false' to abort */ - virtual bool OnRcptTo(const EmailAddress& addr) = 0; - - virtual void OnHeader(const std::string& key, const std::string& value) = 0; - - virtual void OnHeaderComplete() = 0; - - virtual void OnData(const std::string& line) = 0; - - /** \return 'false' if message write failed (message will probably be resent) */ - virtual bool OnDataComplete() = 0; - - virtual void OnRset() = 0; - - virtual void OnAbort(reason_t) = 0; - - virtual void OnNotSupported(const std::string& cmd, const std::string& arg) = 0; - -private: - bool m_hello; // we need HELO or EHLO first of all - bool m_data; - bool m_header; - std::string m_header_line; -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_SmtpdSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.cpp deleted file mode 100755 index 4adb6b3d60..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.cpp +++ /dev/null @@ -1,1875 +0,0 @@ -/** \file Socket.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "Socket.h" -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#else -#include -#include -#endif -#include -#include - -#include "Utility.h" - -#include "SocketAddress.h" -#include "SocketHandler.h" -#ifdef ENABLE_EXCEPTIONS -#include "Exception.h" -#endif -#include "Ipv4Address.h" -//#ifdef ENABLE_IPV6 -#include "Ipv6Address.h" -//#endif -#include "SocketThread.h" - -#ifdef _DEBUG -#define DEB(x) x; fflush(stderr); -#else -#define DEB(x) -#endif - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// statics -#ifdef _WIN32 -WSAInitializer Socket::m_winsock_init; -#endif -socketuid_t Socket::m_next_uid = 0; - - -Socket::Socket(ISocketHandler& h) -//:m_flags(0) -:m_handler(h) -,m_socket( INVALID_SOCKET ) -,m_bDel(false) -,m_bClose(false) -,m_tCreate(time(NULL)) -,m_parent(NULL) -,m_b_disable_read(false) -,m_connected(false) -,m_b_erased_by_handler(false) -,m_tClose(0) -,m_client_remote_address(NULL) -,m_remote_address(NULL) -,m_traffic_monitor(NULL) -,m_timeout_start(0) -,m_timeout_limit(0) -,m_bLost(false) -,m_uid(++Socket::m_next_uid) -,m_call_on_connect(false) -,m_b_retry_connect(false) -#ifdef HAVE_OPENSSL -,m_b_enable_ssl(false) -,m_b_ssl(false) -,m_b_ssl_server(false) -#endif -//#ifdef ENABLE_IPV6 -,m_ipv6(false) -//#endif -#ifdef ENABLE_POOL -,m_socket_type(0) -,m_bClient(false) -,m_bRetain(false) -#endif -#ifdef ENABLE_SOCKS4 -,m_bSocks4(false) -,m_socks4_host(h.GetSocks4Host()) -,m_socks4_port(h.GetSocks4Port()) -,m_socks4_userid(h.GetSocks4Userid()) -#endif -#ifdef ENABLE_DETACH -,m_detach(false) -,m_detached(false) -,m_pThread(NULL) -,m_slave_handler(NULL) -#endif -{ -} - - -Socket::~Socket() -{ - Handler().Remove(this); - if (m_socket != INVALID_SOCKET -#ifdef ENABLE_POOL - && !m_bRetain -#endif - ) - { - Close(); - } -} - - -void Socket::Init() -{ -} - - -void Socket::OnRead() -{ -} - - -void Socket::OnWrite() -{ -} - - -void Socket::OnException() -{ - // %! exception doesn't always mean something bad happened, this code should be reworked - // errno valid here? - int err = SoError(); - Handler().LogError(this, "exception on select", err, StrError(err), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -} - - -void Socket::OnDelete() -{ -} - - -void Socket::OnConnect() -{ -} - - -void Socket::OnAccept() -{ -} - - -int Socket::Close() -{ - if (m_socket == INVALID_SOCKET) // this could happen - { - Handler().LogError(this, "Socket::Close", 0, "file descriptor invalid", LOG_LEVEL_WARNING); - return 0; - } - int n; - Handler().ISocketHandler_Del(this); // remove from fd_set's - if ((n = closesocket(m_socket)) == -1) - { - // failed... - Handler().LogError(this, "close", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - m_socket = INVALID_SOCKET; - return n; -} - - -SOCKET Socket::CreateSocket(int af,int type, const std::string& protocol) -{ - struct protoent *p = NULL; - SOCKET s; - -#ifdef ENABLE_POOL - m_socket_type = type; - m_socket_protocol = protocol; -#endif - if (protocol.size()) - { - p = getprotobyname( protocol.c_str() ); - if (!p) - { - Handler().LogError(this, "getprotobyname", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -#ifdef ENABLE_EXCEPTIONS - throw Exception(std::string("getprotobyname() failed: ") + StrError(Errno)); -#endif - return INVALID_SOCKET; - } - } - int protno = p ? p -> p_proto : 0; - - s = socket(af, type, protno); - if (s == INVALID_SOCKET) - { - Handler().LogError(this, "socket", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -#ifdef ENABLE_EXCEPTIONS - throw Exception(std::string("socket() failed: ") + StrError(Errno)); -#endif - return INVALID_SOCKET; - } - Attach(s); - OnOptions(af, type, protno, s); - Attach(INVALID_SOCKET); - return s; -} - - -void Socket::Attach(SOCKET s) -{ - m_socket = s; -} - - -SOCKET Socket::GetSocket() -{ - return m_socket; -} - - -void Socket::SetDeleteByHandler(bool x) -{ - m_bDel = x; -} - - -bool Socket::DeleteByHandler() -{ - return m_bDel; -} - - -void Socket::SetCloseAndDelete(bool x) -{ - if (x != m_bClose) - { - m_bClose = x; - if (x) - { - m_tClose = time(NULL); - Handler().SetClose(); - } - } -} - - -bool Socket::CloseAndDelete() -{ - return m_bClose; -} - - -void Socket::SetRemoteAddress(SocketAddress& ad) //struct sockaddr* sa, socklen_t l) -{ - m_remote_address = ad.GetCopy(); -} - - -std::auto_ptr Socket::GetRemoteSocketAddress() -{ - return m_remote_address -> GetCopy(); -} - - -ISocketHandler& Socket::Handler() const -{ -#ifdef ENABLE_DETACH - if (IsDetached()) - return *m_slave_handler; -#endif - return m_handler; -} - - -ISocketHandler& Socket::MasterHandler() const -{ - return m_handler; -} - - -ipaddr_t Socket::GetRemoteIP4() -{ - ipaddr_t l = 0; -//#ifdef ENABLE_IPV6 - if (m_ipv6) - { - Handler().LogError(this, "GetRemoteIP4", 0, "get ipv4 address for ipv6 socket", LOG_LEVEL_WARNING); - } -//#endif - if (m_remote_address.get() != NULL) - { - struct sockaddr *p = *m_remote_address; - struct sockaddr_in *sa = (struct sockaddr_in *)p; - memcpy(&l, &sa -> sin_addr, sizeof(struct in_addr)); - } - return l; -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -struct in6_addr Socket::GetRemoteIP6() -{ - if (!m_ipv6) - { - Handler().LogError(this, "GetRemoteIP6", 0, "get ipv6 address for ipv4 socket", LOG_LEVEL_WARNING); - } - struct sockaddr_in6 fail; - if (m_remote_address.get() != NULL) - { - struct sockaddr *p = *m_remote_address; - memcpy(&fail, p, sizeof(struct sockaddr_in6)); - } - else - { - memset(&fail, 0, sizeof(struct sockaddr_in6)); - } - return fail.sin6_addr; -} -//#endif -//#endif - - -port_t Socket::GetRemotePort() -{ - if (!m_remote_address.get()) - { - return 0; - } - return m_remote_address -> GetPort(); -} - - -std::string Socket::GetRemoteAddress() -{ - if (!m_remote_address.get()) - { - return ""; - } - return m_remote_address -> Convert(false); -} - - -std::string Socket::GetRemoteHostname() -{ - if (!m_remote_address.get()) - { - return ""; - } - return m_remote_address -> Reverse(); -} - - -bool Socket::SetNonblocking(bool bNb) -{ -#ifdef _WIN32 - unsigned long l = bNb ? 1 : 0; - int n = ioctlsocket(m_socket, FIONBIO, &l); - if (n != 0) - { - Handler().LogError(this, "ioctlsocket(FIONBIO)", Errno, ""); - return false; - } - return true; -#else - if (bNb) - { - if (fcntl(m_socket, F_SETFL, O_NONBLOCK) == -1) - { - Handler().LogError(this, "fcntl(F_SETFL, O_NONBLOCK)", Errno, StrError(Errno), LOG_LEVEL_ERROR); - return false; - } - } - else - { - if (fcntl(m_socket, F_SETFL, 0) == -1) - { - Handler().LogError(this, "fcntl(F_SETFL, 0)", Errno, StrError(Errno), LOG_LEVEL_ERROR); - return false; - } - } - return true; -#endif -} - - -bool Socket::SetNonblocking(bool bNb, SOCKET s) -{ -#ifdef _WIN32 - unsigned long l = bNb ? 1 : 0; - int n = ioctlsocket(s, FIONBIO, &l); - if (n != 0) - { - Handler().LogError(this, "ioctlsocket(FIONBIO)", Errno, ""); - return false; - } - return true; -#else - if (bNb) - { - if (fcntl(s, F_SETFL, O_NONBLOCK) == -1) - { - Handler().LogError(this, "fcntl(F_SETFL, O_NONBLOCK)", Errno, StrError(Errno), LOG_LEVEL_ERROR); - return false; - } - } - else - { - if (fcntl(s, F_SETFL, 0) == -1) - { - Handler().LogError(this, "fcntl(F_SETFL, 0)", Errno, StrError(Errno), LOG_LEVEL_ERROR); - return false; - } - } - return true; -#endif -} - - -bool Socket::Ready() -{ - if (m_socket != INVALID_SOCKET && !CloseAndDelete()) - return true; - return false; -} - - -void Socket::OnLine(const std::string& ) -{ -} - - -void Socket::OnConnectFailed() -{ -} - - -Socket *Socket::GetParent() -{ - return m_parent; -} - - -void Socket::SetParent(Socket *x) -{ - m_parent = x; -} - - -port_t Socket::GetPort() -{ - Handler().LogError(this, "GetPort", 0, "GetPort only implemented for ListenSocket", LOG_LEVEL_WARNING); - return 0; -} - - -bool Socket::OnConnectRetry() -{ - return true; -} - - -#ifdef ENABLE_RECONNECT -void Socket::OnReconnect() -{ -} -#endif - - -time_t Socket::Uptime() -{ - return time(NULL) - m_tCreate; -} - - -//#ifdef ENABLE_IPV6 -void Socket::SetIpv6(bool x) -{ - m_ipv6 = x; -} - - -bool Socket::IsIpv6() -{ - return m_ipv6; -} -//#endif - - -void Socket::DisableRead(bool x) -{ - m_b_disable_read = x; -} - - -bool Socket::IsDisableRead() -{ - return m_b_disable_read; -} - - -void Socket::SendBuf(const char *,size_t,int) -{ -} - - -void Socket::Send(const std::string&,int) -{ -} - - -void Socket::SetConnected(bool x) -{ - m_connected = x; -} - - -bool Socket::IsConnected() -{ - return m_connected; -} - - -void Socket::OnDisconnect() -{ -} - - -void Socket::OnDisconnect(short, int) -{ -} - - -void Socket::SetLost() -{ - m_bLost = true; -} - - -bool Socket::Lost() -{ - return m_bLost; -} - - -void Socket::SetErasedByHandler(bool x) -{ - m_b_erased_by_handler = x; -} - - -bool Socket::ErasedByHandler() -{ - return m_b_erased_by_handler; -} - - -time_t Socket::TimeSinceClose() -{ - return time(NULL) - m_tClose; -} - - -void Socket::SetClientRemoteAddress(SocketAddress& ad) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "SetClientRemoteAddress", 0, "remote address not valid", LOG_LEVEL_ERROR); - } - m_client_remote_address = ad.GetCopy(); -} - - -std::auto_ptr Socket::GetClientRemoteAddress() -{ - if (!m_client_remote_address.get()) - { - Handler().LogError(this, "GetClientRemoteAddress", 0, "remote address not yet set", LOG_LEVEL_ERROR); - } - return m_client_remote_address -> GetCopy(); -} - - -uint64_t Socket::GetBytesSent(bool) -{ - return 0; -} - - -uint64_t Socket::GetBytesReceived(bool) -{ - return 0; -} - - -void Socket::SetCallOnConnect(bool x) -{ - m_call_on_connect = x; - if (x) - Handler().SetCallOnConnect(); -} - - -bool Socket::CallOnConnect() -{ - return m_call_on_connect; -} - - -void Socket::SetRetryClientConnect(bool x) -{ - m_b_retry_connect = x; - if (x) - Handler().SetRetry(); -} - - -bool Socket::RetryClientConnect() -{ - return m_b_retry_connect; -} - - -#ifdef HAVE_OPENSSL -void Socket::OnSSLConnect() -{ -} - - -void Socket::OnSSLAccept() -{ -} - - -bool Socket::SSLNegotiate() -{ - return false; -} - - -bool Socket::IsSSL() -{ - return m_b_enable_ssl; -} - - -void Socket::EnableSSL(bool x) -{ - m_b_enable_ssl = x; -} - - -bool Socket::IsSSLNegotiate() -{ - return m_b_ssl; -} - - -void Socket::SetSSLNegotiate(bool x) -{ - m_b_ssl = x; -} - - -bool Socket::IsSSLServer() -{ - return m_b_ssl_server; -} - - -void Socket::SetSSLServer(bool x) -{ - m_b_ssl_server = x; -} - - -void Socket::OnSSLConnectFailed() -{ -} - - -void Socket::OnSSLAcceptFailed() -{ -} -#endif // HAVE_OPENSSL - - -#ifdef ENABLE_POOL -void Socket::CopyConnection(Socket *sock) -{ - Attach( sock -> GetSocket() ); -//#ifdef ENABLE_IPV6 - SetIpv6( sock -> IsIpv6() ); -//#endif - SetSocketType( sock -> GetSocketType() ); - SetSocketProtocol( sock -> GetSocketProtocol() ); - - SetClientRemoteAddress( *sock -> GetClientRemoteAddress() ); - SetRemoteAddress( *sock -> GetRemoteSocketAddress() ); -} - - -void Socket::SetIsClient() -{ - m_bClient = true; -} - - -void Socket::SetSocketType(int x) -{ - m_socket_type = x; -} - - -int Socket::GetSocketType() -{ - return m_socket_type; -} - - -void Socket::SetSocketProtocol(const std::string& x) -{ - m_socket_protocol = x; -} - - -const std::string& Socket::GetSocketProtocol() -{ - return m_socket_protocol; -} - - -void Socket::SetRetain() -{ - if (m_bClient) - m_bRetain = true; -} - - -bool Socket::Retain() -{ - return m_bRetain; -} - - -#endif // ENABLE_POOL - - -#ifdef ENABLE_SOCKS4 -void Socket::OnSocks4Connect() -{ - Handler().LogError(this, "OnSocks4Connect", 0, "Use with TcpSocket only"); -} - - -void Socket::OnSocks4ConnectFailed() -{ - Handler().LogError(this, "OnSocks4ConnectFailed", 0, "Use with TcpSocket only"); -} - - -bool Socket::OnSocks4Read() -{ - Handler().LogError(this, "OnSocks4Read", 0, "Use with TcpSocket only"); - return true; -} - - -void Socket::SetSocks4Host(const std::string& host) -{ - Utility::u2ip(host, m_socks4_host); -} - - -bool Socket::Socks4() -{ - return m_bSocks4; -} - - -void Socket::SetSocks4(bool x) -{ - m_bSocks4 = x; -} - - -void Socket::SetSocks4Host(ipaddr_t a) -{ - m_socks4_host = a; -} - - -void Socket::SetSocks4Port(port_t p) -{ - m_socks4_port = p; -} - - -void Socket::SetSocks4Userid(const std::string& x) -{ - m_socks4_userid = x; -} - - -ipaddr_t Socket::GetSocks4Host() -{ - return m_socks4_host; -} - - -port_t Socket::GetSocks4Port() -{ - return m_socks4_port; -} - - -const std::string& Socket::GetSocks4Userid() -{ - return m_socks4_userid; -} -#endif // ENABLE_SOCKS4 - - -#ifdef ENABLE_DETACH -bool Socket::Detach() -{ - if (!DeleteByHandler()) - return false; - if (m_pThread) - return false; - if (m_detached) - return false; - SetDetach(); - return true; -} - - -void Socket::DetachSocket() -{ - SetDetached(); - m_pThread = new SocketThread(this); - m_pThread -> SetRelease(true); -} - - -void Socket::OnDetached() -{ -} - - -void Socket::SetDetach(bool x) -{ - m_detach = x; - if (x) - Handler().SetDetach(); -} - - -bool Socket::IsDetach() -{ - return m_detach; -} - - -void Socket::SetDetached(bool x) -{ - m_detached = x; -} - - -const bool Socket::IsDetached() const -{ - return m_detached; -} - - -void Socket::SetSlaveHandler(ISocketHandler *p) -{ - m_slave_handler = p; -} - - -#endif // ENABLE_DETACH - - -#ifdef ENABLE_RESOLVER -int Socket::Resolve(const std::string& host,port_t port) -{ - return Handler().Resolve(this, host, port); -} - - -//#ifdef ENABLE_IPV6 -int Socket::Resolve6(const std::string& host,port_t port) -{ - return Handler().Resolve6(this, host, port); -} -//#endif - - -int Socket::Resolve(ipaddr_t a) -{ - return Handler().Resolve(this, a); -} - - -//#ifdef ENABLE_IPV6 -int Socket::Resolve(in6_addr& a) -{ - return Handler().Resolve(this, a); -} -//#endif - - -void Socket::OnResolved(int,ipaddr_t,port_t) -{ -} - - -//#ifdef ENABLE_IPV6 -void Socket::OnResolved(int,in6_addr&,port_t) -{ -} -//#endif - - -void Socket::OnReverseResolved(int,const std::string&) -{ -} - - -void Socket::OnResolveFailed(int) -{ -} -#endif // ENABLE_RESOLVER - - -/* IP options */ - - -bool Socket::SetIpOptions(const void *p, socklen_t len) -{ -#ifdef IP_OPTIONS - if (setsockopt(GetSocket(), IPPROTO_IP, IP_OPTIONS, (char *)p, len) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_OPTIONS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_OPTIONS", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef IP_PKTINFO -bool Socket::SetIpPktinfo(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_PKTINFO, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_PKTINFO)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_RECVTOS -bool Socket::SetIpRecvTOS(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVTOS, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVTOS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_RECVTTL -bool Socket::SetIpRecvTTL(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVTTL, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVTTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_RECVOPTS -bool Socket::SetIpRecvopts(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVOPTS, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVOPTS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_RETOPTS -bool Socket::SetIpRetopts(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_RETOPTS, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RETOPTS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SetIpTOS(unsigned char tos) -{ -#ifdef IP_TOS - if (setsockopt(GetSocket(), IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(tos)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_TOS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_TOS", LOG_LEVEL_INFO); - return false; -#endif -} - - -unsigned char Socket::IpTOS() -{ - unsigned char tos = 0; -#ifdef IP_TOS - socklen_t len = sizeof(tos); - if (getsockopt(GetSocket(), IPPROTO_IP, IP_TOS, (char *)&tos, &len) == -1) - { - Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_TOS)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "ip option not available", 0, "IP_TOS", LOG_LEVEL_INFO); -#endif - return tos; -} - - -bool Socket::SetIpTTL(int ttl) -{ -#ifdef IP_TTL - if (setsockopt(GetSocket(), IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_TTL", LOG_LEVEL_INFO); - return false; -#endif -} - - -int Socket::IpTTL() -{ - int ttl = 0; -#ifdef IP_TTL - socklen_t len = sizeof(ttl); - if (getsockopt(GetSocket(), IPPROTO_IP, IP_TTL, (char *)&ttl, &len) == -1) - { - Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "ip option not available", 0, "IP_TTL", LOG_LEVEL_INFO); -#endif - return ttl; -} - - -bool Socket::SetIpHdrincl(bool x) -{ -#ifdef IP_HDRINCL - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_HDRINCL, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_HDRINCL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_HDRINCL", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef IP_RECVERR -bool Socket::SetIpRecverr(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVERR, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVERR)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_MTU_DISCOVER -bool Socket::SetIpMtudiscover(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_MTU_DISCOVER, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_MTU_DISCOVER)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef IP_MTU -int Socket::IpMtu() -{ - int mtu = 0; - socklen_t len = sizeof(mtu); - if (getsockopt(GetSocket(), IPPROTO_IP, IP_MTU, (char *)&mtu, &len) == -1) - { - Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_MTU)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } - return mtu; -} -#endif - - -#ifdef IP_ROUTER_ALERT -bool Socket::SetIpRouterAlert(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_ROUTER_ALERT, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_ROUTER_ALERT)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SetIpMulticastTTL(int ttl) -{ -#ifdef IP_MULTICAST_TTL - if (setsockopt(GetSocket(), IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_MULTICAST_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_MULTICAST_TTL", LOG_LEVEL_INFO); - return false; -#endif -} - - -int Socket::IpMulticastTTL() -{ - int ttl = 0; -#ifdef IP_MULTICAST_TTL - socklen_t len = sizeof(ttl); - if (getsockopt(GetSocket(), IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, &len) == -1) - { - Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_MULTICAST_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "ip option not available", 0, "IP_MULTICAST_TTL", LOG_LEVEL_INFO); -#endif - return ttl; -} - - -bool Socket::SetMulticastLoop(bool x) -{ -#ifdef IP_MULTICAST_LOOP - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_MULTICAST_LOOP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_MULTICAST_LOOP", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef LINUX -bool Socket::IpAddMembership(struct ip_mreqn& ref) -{ -#ifdef IP_ADD_MEMBERSHIP - if (setsockopt(GetSocket(), IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ref, sizeof(struct ip_mreqn)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_ADD_MEMBERSHIP", LOG_LEVEL_INFO); - return false; -#endif -} -#endif - - -bool Socket::IpAddMembership(struct ip_mreq& ref) -{ -#ifdef IP_ADD_MEMBERSHIP - if (setsockopt(GetSocket(), IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ref, sizeof(struct ip_mreq)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_ADD_MEMBERSHIP", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef LINUX -bool Socket::IpDropMembership(struct ip_mreqn& ref) -{ -#ifdef IP_DROP_MEMBERSHIP - if (setsockopt(GetSocket(), IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&ref, sizeof(struct ip_mreqn)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_DROP_MEMBERSHIP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_DROP_MEMBERSHIP", LOG_LEVEL_INFO); - return false; -#endif -} -#endif - - -bool Socket::IpDropMembership(struct ip_mreq& ref) -{ -#ifdef IP_DROP_MEMBERSHIP - if (setsockopt(GetSocket(), IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&ref, sizeof(struct ip_mreq)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_DROP_MEMBERSHIP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "ip option not available", 0, "IP_DROP_MEMBERSHIP", LOG_LEVEL_INFO); - return false; -#endif -} - - -/* SOCKET options */ - - -bool Socket::SetSoReuseaddr(bool x) -{ -#ifdef SO_REUSEADDR - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_REUSEADDR)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_REUSEADDR", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoKeepalive(bool x) -{ -#ifdef SO_KEEPALIVE - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_KEEPALIVE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_KEEPALIVE", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef SO_NOSIGPIPE -bool Socket::SetSoNosigpipe(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_NOSIGPIPE, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_NOSIGPIPE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SoAcceptconn() -{ - int value = 0; -#ifdef SO_ACCEPTCONN - socklen_t len = sizeof(value); - if (getsockopt(GetSocket(), SOL_SOCKET, SO_ACCEPTCONN, (char *)&value, &len) == -1) - { - Handler().LogError(this, "getsockopt(SOL_SOCKET, SO_ACCEPTCONN)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "socket option not available", 0, "SO_ACCEPTCONN", LOG_LEVEL_INFO); -#endif - return value ? true : false; -} - - -#ifdef SO_BSDCOMPAT -bool Socket::SetSoBsdcompat(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_BSDCOMPAT, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_BSDCOMPAT)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef SO_BINDTODEVICE -bool Socket::SetSoBindtodevice(const std::string& intf) -{ - if (setsockopt(GetSocket(), SOL_SOCKET, SO_BINDTODEVICE, (char *)intf.c_str(), intf.size()) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_BINDTODEVICE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SetSoBroadcast(bool x) -{ -#ifdef SO_BROADCAST - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_BROADCAST, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_BROADCAST)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_BROADCAST", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoDebug(bool x) -{ -#ifdef SO_DEBUG - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_DEBUG, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_DEBUG)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_DEBUG", LOG_LEVEL_INFO); - return false; -#endif -} - - -int Socket::SoError() -{ - int value = 0; -#ifdef SO_ERROR - socklen_t len = sizeof(value); - if (getsockopt(GetSocket(), SOL_SOCKET, SO_ERROR, (char *)&value, &len) == -1) - { - Handler().LogError(this, "getsockopt(SOL_SOCKET, SO_ERROR)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "socket option not available", 0, "SO_ERROR", LOG_LEVEL_INFO); -#endif - return value; -} - - -bool Socket::SetSoDontroute(bool x) -{ -#ifdef SO_DONTROUTE - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_DONTROUTE, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_DONTROUTE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_DONTROUTE", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoLinger(int onoff, int linger) -{ -#ifdef SO_LINGER - struct linger stl; - stl.l_onoff = onoff; - stl.l_linger = linger; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_LINGER, (char *)&stl, sizeof(stl)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_LINGER)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_LINGER", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoOobinline(bool x) -{ -#ifdef SO_OOBINLINE - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_OOBINLINE, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_OOBINLINE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_OOBINLINE", LOG_LEVEL_INFO); - return false; -#endif -} - - -#ifdef SO_PASSCRED -bool Socket::SetSoPasscred(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_PASSCRED, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_PASSCRED)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef SO_PEERCRED -bool Socket::SoPeercred(struct ucred& ucr) -{ - if (setsockopt(GetSocket(), SOL_SOCKET, SO_PEERCRED, (char *)&ucr, sizeof(ucr)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_PEERCRED)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef SO_PRIORITY -bool Socket::SetSoPriority(int x) -{ - if (setsockopt(GetSocket(), SOL_SOCKET, SO_PRIORITY, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_PRIORITY)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SetSoRcvlowat(int x) -{ -#ifdef SO_RCVLOWAT - if (setsockopt(GetSocket(), SOL_SOCKET, SO_RCVLOWAT, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_RCVLOWAT)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_RCVLOWAT", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoSndlowat(int x) -{ -#ifdef SO_SNDLOWAT - if (setsockopt(GetSocket(), SOL_SOCKET, SO_SNDLOWAT, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_SNDLOWAT)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_SNDLOWAT", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoRcvtimeo(struct timeval& tv) -{ -#ifdef SO_RCVTIMEO - if (setsockopt(GetSocket(), SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_RCVTIMEO)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_RCVTIMEO", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoSndtimeo(struct timeval& tv) -{ -#ifdef SO_SNDTIMEO - if (setsockopt(GetSocket(), SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_SNDTIMEO)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_SNDTIMEO", LOG_LEVEL_INFO); - return false; -#endif -} - - -bool Socket::SetSoRcvbuf(int x) -{ -#ifdef SO_RCVBUF - if (setsockopt(GetSocket(), SOL_SOCKET, SO_RCVBUF, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_RCVBUF)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_RCVBUF", LOG_LEVEL_INFO); - return false; -#endif -} - - -int Socket::SoRcvbuf() -{ - int value = 0; -#ifdef SO_RCVBUF - socklen_t len = sizeof(value); - if (getsockopt(GetSocket(), SOL_SOCKET, SO_RCVBUF, (char *)&value, &len) == -1) - { - Handler().LogError(this, "getsockopt(SOL_SOCKET, SO_RCVBUF)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "socket option not available", 0, "SO_RCVBUF", LOG_LEVEL_INFO); -#endif - return value; -} - - -#ifdef SO_RCVBUFFORCE -bool Socket::SetSoRcvbufforce(int x) -{ - if (setsockopt(GetSocket(), SOL_SOCKET, SO_RCVBUFFORCE, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_RCVBUFFORCE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -bool Socket::SetSoSndbuf(int x) -{ -#ifdef SO_SNDBUF - if (setsockopt(GetSocket(), SOL_SOCKET, SO_SNDBUF, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_SNDBUF)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "SO_SNDBUF", LOG_LEVEL_INFO); - return false; -#endif -} - - -int Socket::SoSndbuf() -{ - int value = 0; -#ifdef SO_SNDBUF - socklen_t len = sizeof(value); - if (getsockopt(GetSocket(), SOL_SOCKET, SO_SNDBUF, (char *)&value, &len) == -1) - { - Handler().LogError(this, "getsockopt(SOL_SOCKET, SO_SNDBUF)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "socket option not available", 0, "SO_SNDBUF", LOG_LEVEL_INFO); -#endif - return value; -} - - -#ifdef SO_SNDBUFFORCE -bool Socket::SetSoSndbufforce(int x) -{ - if (setsockopt(GetSocket(), SOL_SOCKET, SO_SNDBUFFORCE, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_SNDBUFFORCE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -#ifdef SO_TIMESTAMP -bool Socket::SetSoTimestamp(bool x) -{ - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_SOCKET, SO_TIMESTAMP, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(SOL_SOCKET, SO_TIMESTAMP)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -} -#endif - - -int Socket::SoType() -{ - int value = 0; -#ifdef SO_TYPE - socklen_t len = sizeof(value); - if (getsockopt(GetSocket(), SOL_SOCKET, SO_TYPE, (char *)&value, &len) == -1) - { - Handler().LogError(this, "getsockopt(SOL_SOCKET, SO_TYPE)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - } -#else - Handler().LogError(this, "socket option not available", 0, "SO_TYPE", LOG_LEVEL_INFO); -#endif - return value; -} - - -void Socket::SetTimeout(time_t secs) -{ - if (!secs) - { - m_timeout_start = 0; - m_timeout_limit = 0; - return; - } - m_timeout_start = time(NULL); - m_timeout_limit = secs; - Handler().SetTimeout(); -} - - -bool Socket::CheckTimeout() -{ - return m_timeout_start > 0 && m_timeout_limit > 0; -} - - -void Socket::OnTimeout() -{ -} - - -void Socket::OnConnectTimeout() -{ -} - - -bool Socket::Timeout(time_t tnow) -{ - if (m_timeout_start > 0 && tnow - m_timeout_start > m_timeout_limit) - return true; - return false; -} - - -/** Returns local port number for bound socket file descriptor. */ -port_t Socket::GetSockPort() -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - struct sockaddr_in6 sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in6); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - return ntohs(sa.sin6_port); - } -//#endif -//#endif - struct sockaddr_in sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - return ntohs(sa.sin_port); -} - - -/** Returns local ipv4 address for bound socket file descriptor. */ -ipaddr_t Socket::GetSockIP4() -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - return 0; - } -//#endif -//#endif - struct sockaddr_in sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - ipaddr_t a; - memcpy(&a, &sa.sin_addr, 4); - return a; -} - - -/** Returns local ipv4 address as text for bound socket file descriptor. */ -std::string Socket::GetSockAddress() -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - return ""; - } -//#endif -//#endif - struct sockaddr_in sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - Ipv4Address addr( sa ); - return addr.Convert(); -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -/** Returns local ipv6 address for bound socket file descriptor. */ -struct in6_addr Socket::GetSockIP6() -{ - if (IsIpv6()) - { - struct sockaddr_in6 sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in6); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - return sa.sin6_addr; - } - struct in6_addr a; - memset(&a, 0, sizeof(a)); - return a; -} - - -/** Returns local ipv6 address as text for bound socket file descriptor. */ -std::string Socket::GetSockAddress6() -{ - if (IsIpv6()) - { - struct sockaddr_in6 sa; - socklen_t sockaddr_length = sizeof(struct sockaddr_in6); - if (getsockname(GetSocket(), (struct sockaddr *)&sa, (socklen_t*)&sockaddr_length) == -1) - memset(&sa, 0, sizeof(sa)); - Ipv6Address addr( sa ); - return addr.Convert(); - } - return ""; -} -//#endif -//#endif - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.h deleted file mode 100755 index cfdc0ec7af..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Socket.h +++ /dev/null @@ -1,735 +0,0 @@ -/** \file Socket.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Socket_H -#define _SOCKETS_Socket_H -#include "sockets-config.h" - -#include -#include -#include -#ifdef HAVE_OPENSSL -#include -#endif - -#include "socket_include.h" -#include -#include "SocketAddress.h" -#include "Thread.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class ISocketHandler; -class SocketAddress; -class IFile; -class SocketThread; - - -/** \defgroup basic Basic sockets */ -/** Socket base class. - \ingroup basic */ -class Socket -{ - /** Socket mode flags. */ - /* - enum { - // Socket - SOCK_DEL = 0x01, ///< Delete by handler flag - SOCK_CLOSE = 0x02, ///< Close and delete flag - SOCK_DISABLE_READ = 0x04, ///< Disable checking for read events - SOCK_CONNECTED = 0x08, ///< Socket is connected (tcp/udp) - - SOCK_ERASED_BY_HANDLER = 0x10, ///< Set by handler before delete - // HAVE_OPENSSL - SOCK_ENABLE_SSL = 0x20, ///< Enable SSL for this TcpSocket - SOCK_SSL = 0x40, ///< ssl negotiation mode (TcpSocket) - SOCK_SSL_SERVER = 0x80, ///< True if this is an incoming ssl TcpSocket connection - - // ENABLE_IPV6 - SOCK_IPV6 = 0x0100, ///< This is an ipv6 socket if this one is true - // ENABLE_POOL - SOCK_CLIENT = 0x0200, ///< only client connections are pooled - SOCK_RETAIN = 0x0400, ///< keep connection on close - SOCK_LOST = 0x0800, ///< connection lost - - // ENABLE_SOCKS4 - SOCK_SOCKS4 = 0x1000, ///< socks4 negotiation mode (TcpSocket) - // ENABLE_DETACH - SOCK_DETACH = 0x2000, ///< Socket ordered to detach flag - SOCK_DETACHED = 0x4000, ///< Socket has been detached - // StreamSocket - STREAMSOCK_CONNECTING = 0x8000, ///< Flag indicating connection in progress - - STREAMSOCK_FLUSH_BEFORE_CLOSE = 0x010000L, ///< Send all data before closing (default true) - STREAMSOCK_CALL_ON_CONNECT = 0x020000L, ///< OnConnect will be called next ISocketHandler cycle if true - STREAMSOCK_RETRY_CONNECT = 0x040000L, ///< Try another connection attempt next ISocketHandler cycle - STREAMSOCK_LINE_PROTOCOL = 0x080000L, ///< Line protocol mode flag - - }; - */ - -public: - /** "Default" constructor */ - Socket(ISocketHandler&); - - virtual ~Socket(); - - /** Socket class instantiation method. Used when a "non-standard" constructor - * needs to be used for the socket class. Note: the socket class still needs - * the "default" constructor with one ISocketHandler& as input parameter. - */ - virtual Socket *Create() { - return NULL; - } - - /** Returns reference to sockethandler that owns the socket. - If the socket is detached, this is a reference to the slave sockethandler. - */ - ISocketHandler& Handler() const; - - /** Returns reference to sockethandler that owns the socket. - This one always returns the reference to the original sockethandler, - even if the socket is detached. - */ - ISocketHandler& MasterHandler() const; - - /** Called by ListenSocket after accept but before socket is added to handler. - * CTcpSocket uses this to create its ICrypt member variable. - * The ICrypt member variable is created by a virtual method, therefore - * it can't be called directly from the CTcpSocket constructor. - * Also used to determine if incoming HTTP connection is normal (port 80) - * or ssl (port 443). - */ - virtual void Init(); - - /** Create a socket file descriptor. - \param af Address family AF_INET / AF_INET6 / ... - \param type SOCK_STREAM / SOCK_DGRAM / ... - \param protocol "tcp" / "udp" / ... */ - SOCKET CreateSocket(int af,int type,const std::string& protocol = ""); - - /** Assign this socket a file descriptor created - by a call to socket() or otherwise. */ - void Attach(SOCKET s); - - /** Return file descriptor assigned to this socket. */ - SOCKET GetSocket(); - - /** Close connection immediately - internal use. - \sa SetCloseAndDelete */ - virtual int Close(); - - /** Returns true when socket file descriptor is valid - and socket is not about to be closed. */ - virtual bool Ready(); - - /** Returns pointer to ListenSocket that created this instance - * on an incoming connection. */ - Socket *GetParent(); - - /** Used by ListenSocket to set parent pointer of newly created - * socket instance. */ - void SetParent(Socket *); - - /** Get listening port from ListenSocket<>. */ - virtual port_t GetPort(); - - /** Set socket non-block operation. */ - bool SetNonblocking(bool); - - /** Set socket non-block operation. */ - bool SetNonblocking(bool, SOCKET); - - /** Total lifetime of instance. */ - time_t Uptime(); - - /** Set address/port of last connect() call. */ - void SetClientRemoteAddress(SocketAddress&); - - /** Get address/port of last connect() call. */ - std::auto_ptr GetClientRemoteAddress(); - - /** Common interface for SendBuf used by Tcp and Udp sockets. */ - virtual void SendBuf(const char *,size_t,int = 0); - - /** Common interface for Send used by Tcp and Udp sockets. */ - virtual void Send(const std::string&,int = 0); - - /** Outgoing traffic counter. */ - virtual uint64_t GetBytesSent(bool clear = false); - - /** Incoming traffic counter. */ - virtual uint64_t GetBytesReceived(bool clear = false); - - // LIST_TIMEOUT - - /** Enable timeout control. 0=disable timeout check. */ - void SetTimeout(time_t secs); - - bool CheckTimeout(); - - /** Check timeout. \return true if time limit reached */ - bool Timeout(time_t tnow); - - /** Used by ListenSocket. ipv4 and ipv6 */ - void SetRemoteAddress(SocketAddress&); - - /** \name Event callbacks */ - //@{ - - /** Called when there is something to be read from the file descriptor. */ - virtual void OnRead(); - /** Called when there is room for another write on the file descriptor. */ - virtual void OnWrite(); - /** Called on socket exception. */ - virtual void OnException(); - /** Called before a socket class is deleted by the ISocketHandler. */ - virtual void OnDelete(); - /** Called when a connection has completed. */ - virtual void OnConnect(); - /** Called when an incoming connection has been completed. */ - virtual void OnAccept(); - /** Called when a complete line has been read and the socket is in - * line protocol mode. */ - virtual void OnLine(const std::string& ); - /** Called on connect timeout (5s). */ - virtual void OnConnectFailed(); - /** Called when a client socket is created, to set socket options. - \param family AF_INET, AF_INET6, etc - \param type SOCK_STREAM, SOCK_DGRAM, etc - \param protocol Protocol number (tcp, udp, sctp, etc) - \param s Socket file descriptor - */ - virtual void OnOptions(int family,int type,int protocol,SOCKET s) = 0; - /** Connection retry callback - return false to abort connection attempts */ - virtual bool OnConnectRetry(); -#ifdef ENABLE_RECONNECT - /** a reconnect has been made */ - virtual void OnReconnect(); -#endif - /** TcpSocket: When a disconnect has been detected (recv/SSL_read returns 0 bytes). */ - virtual void OnDisconnect(); - /** TcpSocket: When a disconnect has been detected (recv/SSL_read returns 0 bytes). - \param info bit 0 read(0)/write(1) - bit 1 normal(read or write returned 0)/error(r/w returned -1) - bit 2 ssl - \param code error code from read/write call (errno / ssl error) - */ - virtual void OnDisconnect(short info, int code); - /** Timeout callback. */ - virtual void OnTimeout(); - /** Connection timeout. */ - virtual void OnConnectTimeout(); - //@} - - /** \name Socket mode flags, set/reset */ - //@{ - /** Set delete by handler true when you want the sockethandler to - delete the socket instance after use. */ - void SetDeleteByHandler(bool = true); - /** Check delete by handler flag. - \return true if this instance should be deleted by the sockethandler */ - bool DeleteByHandler(); - - // LIST_CLOSE - conditional event queue - - /** Set close and delete to terminate the connection. */ - void SetCloseAndDelete(bool = true); - /** Check close and delete flag. - \return true if this socket should be closed and the instance removed */ - bool CloseAndDelete(); - - /** Return number of seconds since socket was ordered to close. \sa SetCloseAndDelete */ - time_t TimeSinceClose(); - - /** Ignore read events for an output only socket. */ - void DisableRead(bool x = true); - /** Check ignore read events flag. - \return true if read events should be ignored */ - bool IsDisableRead(); - - /** Set connected status. */ - void SetConnected(bool = true); - /** Check connected status. - \return true if connected */ - bool IsConnected(); - - /** Connection lost - error while reading/writing from a socket - TcpSocket only. */ - void SetLost(); - /** Check connection lost status flag, used by TcpSocket only. - \return true if there was an error while r/w causing the socket to close */ - bool Lost(); - - /** Set flag indicating the socket is being actively deleted by the sockethandler. */ - void SetErasedByHandler(bool x = true); - /** Get value of flag indicating socket is deleted by sockethandler. */ - bool ErasedByHandler(); - - //@} - - /** \name Information about remote connection */ - //@{ - /** Returns address of remote end. */ - std::auto_ptr GetRemoteSocketAddress(); - /** Returns address of remote end: ipv4. */ - ipaddr_t GetRemoteIP4(); - //#ifdef ENABLE_IPV6 - /** Returns address of remote end: ipv6. */ - //#ifdef IPPROTO_IPV6 - struct in6_addr GetRemoteIP6(); - //#endif - //#endif - /** Returns remote port number: ipv4 and ipv6. */ - port_t GetRemotePort(); - /** Returns remote ip as string? ipv4 and ipv6. */ - std::string GetRemoteAddress(); - /** ipv4 and ipv6(not implemented) */ - std::string GetRemoteHostname(); - //@} - - /** Returns local port number for bound socket file descriptor. */ - port_t GetSockPort(); - /** Returns local ipv4 address for bound socket file descriptor. */ - ipaddr_t GetSockIP4(); - /** Returns local ipv4 address as text for bound socket file descriptor. */ - std::string GetSockAddress(); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Returns local ipv6 address for bound socket file descriptor. */ - struct in6_addr GetSockIP6(); - /** Returns local ipv6 address as text for bound socket file descriptor. */ - std::string GetSockAddress6(); - //#endif - //#endif - socketuid_t UniqueIdentifier() { - return m_uid; - } - - // -------------------------------------------------------------------------- - /** @name IP options - When an ip or socket option is available on all of the operating systems - I'm testing on (linux 2.4.x, _win32, macosx, solaris9 intel) they are not - checked with an #ifdef below. - This might cause a compile error on other operating systems. */ - // -------------------------------------------------------------------------- - - // IP options - //@{ - - bool SetIpOptions(const void *p, socklen_t len); - bool SetIpTOS(unsigned char tos); - unsigned char IpTOS(); - bool SetIpTTL(int ttl); - int IpTTL(); - bool SetIpHdrincl(bool x = true); - bool SetIpMulticastTTL(int); - int IpMulticastTTL(); - bool SetMulticastLoop(bool x = true); - bool IpAddMembership(struct ip_mreq&); - bool IpDropMembership(struct ip_mreq&); - -#ifdef IP_PKTINFO - bool SetIpPktinfo(bool x = true); -#endif -#ifdef IP_RECVTOS - bool SetIpRecvTOS(bool x = true); -#endif -#ifdef IP_RECVTTL - bool SetIpRecvTTL(bool x = true); -#endif -#ifdef IP_RECVOPTS - bool SetIpRecvopts(bool x = true); -#endif -#ifdef IP_RETOPTS - bool SetIpRetopts(bool x = true); -#endif -#ifdef IP_RECVERR - bool SetIpRecverr(bool x = true); -#endif -#ifdef IP_MTU_DISCOVER - bool SetIpMtudiscover(bool x = true); -#endif -#ifdef IP_MTU - int IpMtu(); -#endif -#ifdef IP_ROUTER_ALERT - bool SetIpRouterAlert(bool x = true); -#endif -#ifdef LINUX - bool IpAddMembership(struct ip_mreqn&); -#endif -#ifdef LINUX - bool IpDropMembership(struct ip_mreqn&); -#endif - //@} - - // SOCKET options - /** @name Socket Options */ - //@{ - - bool SoAcceptconn(); - bool SetSoBroadcast(bool x = true); - bool SetSoDebug(bool x = true); - int SoError(); - bool SetSoDontroute(bool x = true); - bool SetSoLinger(int onoff, int linger); - bool SetSoOobinline(bool x = true); - bool SetSoRcvlowat(int); - bool SetSoSndlowat(int); - bool SetSoRcvtimeo(struct timeval&); - bool SetSoSndtimeo(struct timeval&); - bool SetSoRcvbuf(int); - int SoRcvbuf(); - bool SetSoSndbuf(int); - int SoSndbuf(); - int SoType(); - bool SetSoReuseaddr(bool x = true); - bool SetSoKeepalive(bool x = true); - -#ifdef SO_BSDCOMPAT - bool SetSoBsdcompat(bool x = true); -#endif -#ifdef SO_BINDTODEVICE - bool SetSoBindtodevice(const std::string& intf); -#endif -#ifdef SO_PASSCRED - bool SetSoPasscred(bool x = true); -#endif -#ifdef SO_PEERCRED - bool SoPeercred(struct ucred& ); -#endif -#ifdef SO_PRIORITY - bool SetSoPriority(int); -#endif -#ifdef SO_RCVBUFFORCE - bool SetSoRcvbufforce(int); -#endif -#ifdef SO_SNDBUFFORCE - bool SetSoSndbufforce(int); -#endif -#ifdef SO_TIMESTAMP - bool SetSoTimestamp(bool x = true); -#endif -#ifdef SO_NOSIGPIPE - bool SetSoNosigpipe(bool x = true); -#endif - //@} - - // TCP options in TcpSocket.h/TcpSocket.cpp - - - // LIST_CALLONCONNECT - - /** Instruct socket to call OnConnect callback next sockethandler cycle. */ - void SetCallOnConnect(bool x = true); - - /** Check call on connect flag. - \return true if OnConnect() should be called a.s.a.p */ - bool CallOnConnect(); - - // LIST_RETRY - - /** Set flag to initiate a connection attempt after a connection timeout. */ - void SetRetryClientConnect(bool x = true); - - /** Check if a connection attempt should be made. - \return true when another attempt should be made */ - bool RetryClientConnect(); - -#ifdef HAVE_OPENSSL - /** @name SSL Support */ - //@{ - /** SSL client/server support - internal use. \sa TcpSocket */ - virtual void OnSSLConnect(); - /** SSL client/server support - internal use. \sa TcpSocket */ - virtual void OnSSLAccept(); - /** SSL negotiation failed for client connect. */ - virtual void OnSSLConnectFailed(); - /** SSL negotiation failed for server accept. */ - virtual void OnSSLAcceptFailed(); - /** new SSL support */ - virtual bool SSLNegotiate(); - /** Check if SSL is Enabled for this TcpSocket. - \return true if this is a TcpSocket with SSL enabled */ - bool IsSSL(); - /** Enable SSL operation for a TcpSocket. */ - void EnableSSL(bool x = true); - /** Still negotiating ssl connection. - \return true if ssl negotiating is still in progress */ - bool IsSSLNegotiate(); - /** Set flag indicating ssl handshaking still in progress. */ - void SetSSLNegotiate(bool x = true); - /** OnAccept called with SSL Enabled. - \return true if this is a TcpSocket with an incoming SSL connection */ - bool IsSSLServer(); - /** Set flag indicating that this is a TcpSocket with incoming SSL connection. */ - void SetSSLServer(bool x = true); - /** SSL; Get pointer to ssl context structure. */ - virtual SSL_CTX *GetSslContext() { - return NULL; - } - /** SSL; Get pointer to ssl structure. */ - virtual SSL *GetSsl() { - return NULL; - } - //@} -#endif // HAVE_OPENSSL - - //#ifdef ENABLE_IPV6 - /** Enable ipv6 for this socket. */ - void SetIpv6(bool x = true); - /** Check ipv6 socket. - \return true if this is an ipv6 socket */ - bool IsIpv6(); - //#endif - -#ifdef ENABLE_POOL - /** @name Connection Pool */ - //@{ - /** Client = connecting TcpSocket. */ - void SetIsClient(); - /** Socket type from socket() call. */ - void SetSocketType(int x); - /** Socket type from socket() call. */ - int GetSocketType(); - /** Protocol type from socket() call. */ - void SetSocketProtocol(const std::string& x); - /** Protocol type from socket() call. */ - const std::string& GetSocketProtocol(); - /** Instruct a client socket to stay open in the connection pool after use. - If you have connected to a server using tcp, you can call SetRetain - to leave the connection open after your socket instance has been deleted. - The next connection you make to the same server will reuse the already - opened connection, if it is still available. - */ - void SetRetain(); - /** Check retain flag. - \return true if the socket should be moved to connection pool after use */ - bool Retain(); - /** Copy connection parameters from sock. */ - void CopyConnection(Socket *sock); - //@} -#endif // ENABLE_POOL - -#ifdef ENABLE_SOCKS4 - /** \name Socks4 support */ - //@{ - /** Socks4 client support internal use. \sa TcpSocket */ - virtual void OnSocks4Connect(); - /** Socks4 client support internal use. \sa TcpSocket */ - virtual void OnSocks4ConnectFailed(); - /** Socks4 client support internal use. \sa TcpSocket */ - virtual bool OnSocks4Read(); - /** Called when the last write caused the tcp output buffer to - * become empty. */ - /** socket still in socks4 negotiation mode */ - bool Socks4(); - /** Set flag indicating Socks4 handshaking in progress */ - void SetSocks4(bool x = true); - - /** Set socks4 server host address to use */ - void SetSocks4Host(ipaddr_t a); - /** Set socks4 server hostname to use. */ - void SetSocks4Host(const std::string& ); - /** Socks4 server port to use. */ - void SetSocks4Port(port_t p); - /** Provide a socks4 userid if required by the socks4 server. */ - void SetSocks4Userid(const std::string& x); - /** Get the ip address of socks4 server to use. - \return socks4 server host address */ - ipaddr_t GetSocks4Host(); - /** Get the socks4 server port to use. - \return socks4 server port */ - port_t GetSocks4Port(); - /** Get socks4 userid. - \return Socks4 userid */ - const std::string& GetSocks4Userid(); - //@} -#endif // ENABLE_SOCKS4 - -#ifdef ENABLE_RESOLVER - /** \name Asynchronous Resolver */ - //@{ - /** Request an asynchronous dns resolution. - \param host hostname to be resolved - \param port port number passed along for the ride - \return Resolve ID */ - int Resolve(const std::string& host,port_t port = 0); - //#ifdef ENABLE_IPV6 - int Resolve6(const std::string& host, port_t port = 0); - //#endif - /** Callback returning a resolved address. - \param id Resolve ID from Resolve call - \param a resolved ip address - \param port port number passed to Resolve */ - virtual void OnResolved(int id,ipaddr_t a,port_t port); - //#ifdef ENABLE_IPV6 - virtual void OnResolved(int id,in6_addr& a,port_t port); - //#endif - /** Request asynchronous reverse dns lookup. - \param a in_addr to be translated */ - int Resolve(ipaddr_t a); - //#ifdef ENABLE_IPV6 - int Resolve(in6_addr& a); - //#endif - /** Callback returning reverse resolve results. - \param id Resolve ID - \param name Resolved hostname */ - virtual void OnReverseResolved(int id,const std::string& name); - /** Callback indicating failed dns lookup. - \param id Resolve ID */ - virtual void OnResolveFailed(int id); - //@} -#endif // ENABLE_RESOLVER - -#ifdef ENABLE_DETACH - /** \name Thread Support */ - //@{ - /** Callback fires when a new socket thread has started and this - socket is ready for operation again. - \sa ResolvSocket */ - virtual void OnDetached(); - - // LIST_DETACH - - /** Internal use. */ - void SetDetach(bool x = true); - /** Check detach flag. - \return true if the socket should detach to its own thread */ - bool IsDetach(); - - /** Internal use. */ - void SetDetached(bool x = true); - /** Check detached flag. - \return true if the socket runs in its own thread. */ - const bool IsDetached() const; - /** Order this socket to start its own thread and call OnDetached - when ready for operation. */ - bool Detach(); - /** Store the slave sockethandler pointer. */ - void SetSlaveHandler(ISocketHandler *); - /** Create new thread for this socket to run detached in. */ - void DetachSocket(); - //@} -#endif // ENABLE_DETACH - - /** Write traffic to an IFile. Socket will not delete this object. */ - void SetTrafficMonitor(IFile *p) { - m_traffic_monitor = p; - } - -protected: - /** default constructor not available */ - Socket() : m_handler(m_handler) {} - /** copy constructor not available */ - Socket(const Socket& s) : m_handler(s.m_handler) {} - - /** assignment operator not available. */ - Socket& operator=(const Socket& ) { - return *this; - } - - /** All traffic will be written to this IFile, if set. */ - IFile *GetTrafficMonitor() { - return m_traffic_monitor; - } - - // unsigned long m_flags; ///< boolean flags, replacing old 'bool' members - -private: - ISocketHandler& m_handler; ///< Reference of ISocketHandler in control of this socket - SOCKET m_socket; ///< File descriptor - bool m_bDel; ///< Delete by handler flag - bool m_bClose; ///< Close and delete flag - time_t m_tCreate; ///< Time in seconds when this socket was created - Socket *m_parent; ///< Pointer to ListenSocket class, valid for incoming sockets - bool m_b_disable_read; ///< Disable checking for read events - bool m_connected; ///< Socket is connected (tcp/udp) - bool m_b_erased_by_handler; ///< Set by handler before delete - time_t m_tClose; ///< Time in seconds when ordered to close - std::auto_ptr m_client_remote_address; ///< Address of last connect() - std::auto_ptr m_remote_address; ///< Remote end address - IFile *m_traffic_monitor; - time_t m_timeout_start; ///< Set by SetTimeout - time_t m_timeout_limit; ///< Defined by SetTimeout - bool m_bLost; ///< connection lost - static socketuid_t m_next_uid; - socketuid_t m_uid; - bool m_call_on_connect; ///< OnConnect will be called next ISocketHandler cycle if true - bool m_b_retry_connect; ///< Try another connection attempt next ISocketHandler cycle - -#ifdef _WIN32 - static WSAInitializer m_winsock_init; ///< Winsock initialization singleton class -#endif - -#ifdef HAVE_OPENSSL - bool m_b_enable_ssl; ///< Enable SSL for this TcpSocket - bool m_b_ssl; ///< ssl negotiation mode (TcpSocket) - bool m_b_ssl_server; ///< True if this is an incoming ssl TcpSocket connection -#endif - - //#ifdef ENABLE_IPV6 - bool m_ipv6; ///< This is an ipv6 socket if this one is true - //#endif - -#ifdef ENABLE_POOL - int m_socket_type; ///< Type of socket, from socket() call - std::string m_socket_protocol; ///< Protocol, from socket() call - bool m_bClient; ///< only client connections are pooled - bool m_bRetain; ///< keep connection on close -#endif - -#ifdef ENABLE_SOCKS4 - bool m_bSocks4; ///< socks4 negotiation mode (TcpSocket) - ipaddr_t m_socks4_host; ///< socks4 server address - port_t m_socks4_port; ///< socks4 server port number - std::string m_socks4_userid; ///< socks4 server usedid -#endif - -#ifdef ENABLE_DETACH - bool m_detach; ///< Socket ordered to detach flag - bool m_detached; ///< Socket has been detached - SocketThread *m_pThread; ///< Detach socket thread class pointer - ISocketHandler *m_slave_handler; ///< Actual sockethandler while detached -#endif -}; - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Socket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketAddress.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketAddress.h deleted file mode 100755 index 25d0a5f1d3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketAddress.h +++ /dev/null @@ -1,106 +0,0 @@ -/** - ** \file SocketAddress.h - ** \date 2006-09-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_SocketAddress_H -#define _SOCKETS_SocketAddress_H - -#include "sockets-config.h" -#include -#include -#include "socket_include.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** - This class and its subclasses is intended to be used as replacement - for the internal data type 'ipaddr_t' and various implementations of - IPv6 addressing found throughout the library. - 'ipaddr_t' is an IPv4 address in network byte order. - 'port_t' is the portnumber in host byte order. - 'struct in6_addr' is an IPv6 address. - 'struct in_addr' is an IPv4 address. - \ingroup basic -*/ -class SocketAddress -{ -public: - virtual ~SocketAddress() {} - - /** Get a pointer to the address struct. */ - virtual operator struct sockaddr *() = 0; - - /** Get length of address struct. */ - virtual operator socklen_t() = 0; - - /** Compare two addresses. */ - virtual bool operator==(SocketAddress&) = 0; - - /** Set port number. - \param port Port number in host byte order */ - virtual void SetPort(port_t port) = 0; - - /** Get port number. - \return Port number in host byte order. */ - virtual port_t GetPort() = 0; - - /** Set socket address. - \param sa Pointer to either 'struct sockaddr_in' or 'struct sockaddr_in6'. */ - virtual void SetAddress(struct sockaddr *sa) = 0; - - /** Convert address to text. */ - virtual std::string Convert(bool include_port) = 0; - - /** Reverse lookup of address. */ - virtual std::string Reverse() = 0; - - /** Get address family. */ - virtual int GetFamily() = 0; - - /** Address structure is valid. */ - virtual bool IsValid() = 0; - - /** Get a copy of this SocketAddress object. */ - virtual std::auto_ptr GetCopy() = 0; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif -#endif // _SOCKETS_SocketAddress_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.cpp deleted file mode 100755 index fbc4fe102e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.cpp +++ /dev/null @@ -1,1419 +0,0 @@ -/** \file SocketHandler.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#endif -#include -#include -#include - -#include "SocketHandler.h" -#include "UdpSocket.h" -#include "ResolvSocket.h" -#include "ResolvServer.h" -#include "TcpSocket.h" -#include "IMutex.h" -#include "Utility.h" -#include "SocketAddress.h" -#include "Exception.h" -#include "SocketHandlerThread.h" -#include "Lock.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -#ifdef _DEBUG -#define DEB(x) x; fflush(stderr); -#else -#define DEB(x) -#endif - - -SocketHandler::SocketHandler(StdLog *p) -:m_stdlog(p) -,m_mutex(m_mutex) -,m_b_use_mutex(false) -,m_parent(m_parent) -,m_b_parent_is_valid(false) -,m_release(NULL) -,m_maxsock(0) -,m_tlast(0) -,m_b_check_callonconnect(false) -,m_b_check_detach(false) -,m_b_check_timeout(false) -,m_b_check_retry(false) -,m_b_check_close(false) -#ifdef ENABLE_SOCKS4 -,m_socks4_host(0) -,m_socks4_port(0) -,m_bTryDirect(false) -#endif -#ifdef ENABLE_RESOLVER -,m_resolv_id(0) -,m_resolver(NULL) -#endif -#ifdef ENABLE_POOL -,m_b_enable_pool(false) -#endif -#ifdef ENABLE_DETACH -,m_slave(false) -#endif -{ - FD_ZERO(&m_rfds); - FD_ZERO(&m_wfds); - FD_ZERO(&m_efds); -} - - -SocketHandler::SocketHandler(IMutex& mutex,StdLog *p) -:m_stdlog(p) -,m_mutex(mutex) -,m_b_use_mutex(true) -,m_parent(m_parent) -,m_b_parent_is_valid(false) -,m_release(NULL) -,m_maxsock(0) -,m_tlast(0) -,m_b_check_callonconnect(false) -,m_b_check_detach(false) -,m_b_check_timeout(false) -,m_b_check_retry(false) -,m_b_check_close(false) -#ifdef ENABLE_SOCKS4 -,m_socks4_host(0) -,m_socks4_port(0) -,m_bTryDirect(false) -#endif -#ifdef ENABLE_RESOLVER -,m_resolv_id(0) -,m_resolver(NULL) -#endif -#ifdef ENABLE_POOL -,m_b_enable_pool(false) -#endif -#ifdef ENABLE_DETACH -,m_slave(false) -#endif -{ - m_mutex.Lock(); - FD_ZERO(&m_rfds); - FD_ZERO(&m_wfds); - FD_ZERO(&m_efds); -} - - -SocketHandler::SocketHandler(IMutex& mutex, ISocketHandler& parent, StdLog *p) -:m_stdlog(p) -,m_mutex(mutex) -,m_b_use_mutex(true) -,m_parent(parent) -,m_b_parent_is_valid(true) -,m_release(NULL) -,m_maxsock(0) -,m_tlast(0) -,m_b_check_callonconnect(false) -,m_b_check_detach(false) -,m_b_check_timeout(false) -,m_b_check_retry(false) -,m_b_check_close(false) -#ifdef ENABLE_SOCKS4 -,m_socks4_host(0) -,m_socks4_port(0) -,m_bTryDirect(false) -#endif -#ifdef ENABLE_RESOLVER -,m_resolv_id(0) -,m_resolver(NULL) -#endif -#ifdef ENABLE_POOL -,m_b_enable_pool(false) -#endif -#ifdef ENABLE_DETACH -,m_slave(false) -#endif -{ - m_mutex.Lock(); - FD_ZERO(&m_rfds); - FD_ZERO(&m_wfds); - FD_ZERO(&m_efds); -} - - -SocketHandler::~SocketHandler() -{ - for (std::list::iterator it = m_threads.begin(); it != m_threads.end(); it++) - { - SocketHandlerThread *p = *it; - p -> Stop(); - } -#ifdef ENABLE_RESOLVER - if (m_resolver) - { - m_resolver -> Quit(); - } -#endif - { - while (m_sockets.size()) - { -DEB( fprintf(stderr, "Emptying sockets list in SocketHandler destructor, %d instances\n", (int)m_sockets.size());) - socket_m::iterator it = m_sockets.begin(); - Socket *p = it -> second; - if (p) - { -DEB( fprintf(stderr, " fd %d\n", p -> GetSocket());) - p -> Close(); -DEB( fprintf(stderr, " fd closed %d\n", p -> GetSocket());) -// p -> OnDelete(); // hey, I turn this back on. what's the worst that could happen??!! - // MinionSocket breaks, calling MinderHandler methods in OnDelete - - // MinderHandler is already gone when that happens... - - // only delete socket when controlled - // ie master sockethandler can delete non-detached sockets - // and a slave sockethandler can only delete a detach socket - if (p -> DeleteByHandler() -#ifdef ENABLE_DETACH - && !(m_slave ^ p -> IsDetached()) -#endif - ) - { - p -> SetErasedByHandler(); - delete p; - } - m_sockets.erase(it); - } - else - { - m_sockets.erase(it); - } -DEB( fprintf(stderr, "next\n");) - } -DEB( fprintf(stderr, "/Emptying sockets list in SocketHandler destructor, %d instances\n", (int)m_sockets.size());) - } -#ifdef ENABLE_RESOLVER - if (m_resolver) - { - delete m_resolver; - } -#endif - if (m_b_use_mutex) - { - m_mutex.Unlock(); - } -} - - -ISocketHandler *SocketHandler::Create(StdLog *log) -{ - return new SocketHandler(log); -} - - -ISocketHandler *SocketHandler::Create(IMutex& mutex, ISocketHandler& parent, StdLog *log) -{ - return new SocketHandler(mutex, parent, log); -} - - -bool SocketHandler::ParentHandlerIsValid() -{ - return m_b_parent_is_valid; -} - - -ISocketHandler& SocketHandler::ParentHandler() -{ - if (!m_b_parent_is_valid) - throw Exception("No parent sockethandler available"); - return m_parent; -} - - -ISocketHandler& SocketHandler::GetRandomHandler() -{ - if (m_threads.empty()) - throw Exception("SocketHandler is not multithreaded"); - size_t min_count = 99999; - SocketHandlerThread *match = NULL; - for (std::list::iterator it = m_threads.begin(); it != m_threads.end(); it++) - { - SocketHandlerThread *thr = *it; - ISocketHandler& h = thr -> Handler(); - { - Lock lock(h.GetMutex()); - size_t sz = h.GetCount(); - if (sz < min_count) - { - min_count = sz; - match = thr; - } - } - } - if (match) - return match -> Handler(); - throw Exception("Can't locate free threaded sockethandler"); -} - - -ISocketHandler& SocketHandler::GetEffectiveHandler() -{ - return m_b_parent_is_valid ? m_parent : *this; -} - - -void SocketHandler::SetNumberOfThreads(size_t n) -{ - if (!m_threads.empty()) - { - return; // already set - } - if (n > 1 && n < 256) - { - for (int i = 1; i <= (int)n; i++) - { - SocketHandlerThread *p = new SocketHandlerThread(*this); - m_threads.push_back(p); - p -> SetDeleteOnExit(); - p -> Start(); - p -> Wait(); - } - } -} - - -bool SocketHandler::IsThreaded() -{ - return !m_threads.empty(); -} - - -void SocketHandler::EnableRelease() -{ - if (m_release) - return; - m_release = new UdpSocket(*this); - m_release -> SetDeleteByHandler(); - port_t port = 0; - m_release -> Bind("127.0.0.1", port); - Add(m_release); -} - - -void SocketHandler::Release() -{ - if (!m_release) - return; - m_release -> SendTo("127.0.0.1", m_release -> GetPort(), "\n"); -} - - -IMutex& SocketHandler::GetMutex() const -{ - return m_mutex; -} - - -#ifdef ENABLE_DETACH -void SocketHandler::SetSlave(bool x) -{ - m_slave = x; -} - - -bool SocketHandler::IsSlave() -{ - return m_slave; -} -#endif - - -void SocketHandler::RegStdLog(StdLog *log) -{ - m_stdlog = log; -} - - -void SocketHandler::LogError(Socket *p,const std::string& user_text,int err,const std::string& sys_err,loglevel_t t) -{ - if (m_stdlog) - { - m_stdlog -> error(this, p, user_text, err, sys_err, t); - } -} - - -void SocketHandler::Add(Socket *p) -{ - m_add.push_back(p); // no checks here -} - - -void SocketHandler::ISocketHandler_Add(Socket *p,bool bRead,bool bWrite) -{ - Set(p, bRead, bWrite); -} - - -void SocketHandler::ISocketHandler_Mod(Socket *p,bool bRead,bool bWrite) -{ - Set(p, bRead, bWrite); -} - - -void SocketHandler::ISocketHandler_Del(Socket *p) -{ - Set(p, false, false); -} - - -void SocketHandler::Set(Socket *p,bool bRead,bool bWrite) -{ - SOCKET s = p -> GetSocket(); - if (s >= 0) - { - bool bException = true; - if (bRead) - { - if (!FD_ISSET(s, &m_rfds)) - { - FD_SET(s, &m_rfds); - } - } - else - { - FD_CLR(s, &m_rfds); - } - if (bWrite) - { - if (!FD_ISSET(s, &m_wfds)) - { - FD_SET(s, &m_wfds); - } - } - else - { - FD_CLR(s, &m_wfds); - } - if (bException) - { - if (!FD_ISSET(s, &m_efds)) - { - FD_SET(s, &m_efds); - } - } - else - { - FD_CLR(s, &m_efds); - } - } -} - - -#ifdef ENABLE_RESOLVER -bool SocketHandler::Resolving(Socket *p0) -{ - std::map::iterator it = m_resolve_q.find(p0 -> UniqueIdentifier()); - return it != m_resolve_q.end(); -} -#endif - - -bool SocketHandler::Valid(Socket *p0) -{ - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); ++it) - { - Socket *p = it -> second; - if (p0 == p) - return true; - } - return false; -} - - -bool SocketHandler::Valid(socketuid_t uid) -{ - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); ++it) - { - Socket *p = it -> second; - if (p -> UniqueIdentifier() == uid) - return true; - } - return false; -} - - -bool SocketHandler::OkToAccept(Socket *) -{ - return true; -} - - -size_t SocketHandler::GetCount() -{ - return m_sockets.size() + m_add.size() + m_delete.size(); -} - - -#ifdef ENABLE_SOCKS4 -void SocketHandler::SetSocks4Host(ipaddr_t a) -{ - m_socks4_host = a; -} - - -void SocketHandler::SetSocks4Host(const std::string& host) -{ - Utility::u2ip(host, m_socks4_host); -} - - -void SocketHandler::SetSocks4Port(port_t port) -{ - m_socks4_port = port; -} - - -void SocketHandler::SetSocks4Userid(const std::string& id) -{ - m_socks4_userid = id; -} -#endif - - -#ifdef ENABLE_RESOLVER -int SocketHandler::Resolve(Socket *p,const std::string& host,port_t port) -{ - // check cache - ResolvSocket *resolv = new ResolvSocket(*this, p, host, port); - resolv -> SetId(++m_resolv_id); - resolv -> SetDeleteByHandler(); - ipaddr_t local; - Utility::u2ip("127.0.0.1", local); - if (!resolv -> Open(local, m_resolver_port)) - { - LogError(resolv, "Resolve", -1, "Can't connect to local resolve server", LOG_LEVEL_FATAL); - } - Add(resolv); - m_resolve_q[p -> UniqueIdentifier()] = true; -DEB( fprintf(stderr, " *** Resolve '%s:%d' id#%d m_resolve_q size: %d p: %p\n", host.c_str(), port, resolv -> GetId(), m_resolve_q.size(), p);) - return resolv -> GetId(); -} - - -#ifdef ENABLE_IPV6 -int SocketHandler::Resolve6(Socket *p,const std::string& host,port_t port) -{ - // check cache - ResolvSocket *resolv = new ResolvSocket(*this, p, host, port, true); - resolv -> SetId(++m_resolv_id); - resolv -> SetDeleteByHandler(); - ipaddr_t local; - Utility::u2ip("127.0.0.1", local); - if (!resolv -> Open(local, m_resolver_port)) - { - LogError(resolv, "Resolve", -1, "Can't connect to local resolve server", LOG_LEVEL_FATAL); - } - Add(resolv); - m_resolve_q[p -> UniqueIdentifier()] = true; - return resolv -> GetId(); -} -#endif - - -int SocketHandler::Resolve(Socket *p,ipaddr_t a) -{ - // check cache - ResolvSocket *resolv = new ResolvSocket(*this, p, a); - resolv -> SetId(++m_resolv_id); - resolv -> SetDeleteByHandler(); - ipaddr_t local; - Utility::u2ip("127.0.0.1", local); - if (!resolv -> Open(local, m_resolver_port)) - { - LogError(resolv, "Resolve", -1, "Can't connect to local resolve server", LOG_LEVEL_FATAL); - } - Add(resolv); - m_resolve_q[p -> UniqueIdentifier()] = true; - return resolv -> GetId(); -} - - -#ifdef ENABLE_IPV6 -int SocketHandler::Resolve(Socket *p,in6_addr& a) -{ - // check cache - ResolvSocket *resolv = new ResolvSocket(*this, p, a); - resolv -> SetId(++m_resolv_id); - resolv -> SetDeleteByHandler(); - ipaddr_t local; - Utility::u2ip("127.0.0.1", local); - if (!resolv -> Open(local, m_resolver_port)) - { - LogError(resolv, "Resolve", -1, "Can't connect to local resolve server", LOG_LEVEL_FATAL); - } - Add(resolv); - m_resolve_q[p -> UniqueIdentifier()] = true; - return resolv -> GetId(); -} -#endif - - -void SocketHandler::EnableResolver(port_t port) -{ - if (!m_resolver) - { - m_resolver_port = port; - m_resolver = new ResolvServer(port); - } -} - - -bool SocketHandler::ResolverReady() -{ - return m_resolver ? m_resolver -> Ready() : false; -} -#endif // ENABLE_RESOLVER - - -#ifdef ENABLE_SOCKS4 -void SocketHandler::SetSocks4TryDirect(bool x) -{ - m_bTryDirect = x; -} - - -ipaddr_t SocketHandler::GetSocks4Host() -{ - return m_socks4_host; -} - - -port_t SocketHandler::GetSocks4Port() -{ - return m_socks4_port; -} - - -const std::string& SocketHandler::GetSocks4Userid() -{ - return m_socks4_userid; -} - - -bool SocketHandler::Socks4TryDirect() -{ - return m_bTryDirect; -} -#endif - - -#ifdef ENABLE_RESOLVER -bool SocketHandler::ResolverEnabled() -{ - return m_resolver ? true : false; -} - - -port_t SocketHandler::GetResolverPort() -{ - return m_resolver_port; -} -#endif // ENABLE_RESOLVER - - -#ifdef ENABLE_POOL -ISocketHandler::PoolSocket *SocketHandler::FindConnection(int type,const std::string& protocol,SocketAddress& ad) -{ - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end() && m_sockets.size(); ++it) - { - PoolSocket *pools = dynamic_cast(it -> second); - if (pools) - { - if (pools -> GetSocketType() == type && - pools -> GetSocketProtocol() == protocol && -// %! pools -> GetClientRemoteAddress() && - *pools -> GetClientRemoteAddress() == ad) - { - m_sockets.erase(it); - pools -> SetRetain(); // avoid Close in Socket destructor - return pools; // Caller is responsible that this socket is deleted - } - } - } - return NULL; -} - - -void SocketHandler::EnablePool(bool x) -{ - m_b_enable_pool = x; -} - - -bool SocketHandler::PoolEnabled() -{ - return m_b_enable_pool; -} -#endif - - -void SocketHandler::Remove(Socket *p) -{ -#ifdef ENABLE_RESOLVER - std::map::iterator it4 = m_resolve_q.find(p -> UniqueIdentifier()); - if (it4 != m_resolve_q.end()) - m_resolve_q.erase(it4); -#endif - if (p -> ErasedByHandler()) - { - return; - } - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); ++it) - { - if (it -> second == p) - { - LogError(p, "Remove", -1, "Socket destructor called while still in use", LOG_LEVEL_WARNING); - m_sockets.erase(it); - return; - } - } - for (std::list::iterator it2 = m_add.begin(); it2 != m_add.end(); ++it2) - { - if (*it2 == p) - { - LogError(p, "Remove", -2, "Socket destructor called while still in use", LOG_LEVEL_WARNING); - m_add.erase(it2); - return; - } - } - for (std::list::iterator it3 = m_delete.begin(); it3 != m_delete.end(); ++it3) - { - if (*it3 == p) - { - LogError(p, "Remove", -3, "Socket destructor called while still in use", LOG_LEVEL_WARNING); - m_delete.erase(it3); - return; - } - } -} - - -void SocketHandler::SetCallOnConnect(bool x) -{ - m_b_check_callonconnect = x; -} - - -void SocketHandler::SetDetach(bool x) -{ - m_b_check_detach = x; -} - - -void SocketHandler::SetTimeout(bool x) -{ - m_b_check_timeout = x; -} - - -void SocketHandler::SetRetry(bool x) -{ - m_b_check_retry = x; -} - - -void SocketHandler::SetClose(bool x) -{ - m_b_check_close = x; -} - - -void SocketHandler::DeleteSocket(Socket *p) -{ - p -> OnDelete(); - if (p -> DeleteByHandler() && !p -> ErasedByHandler()) - { - p -> SetErasedByHandler(); - } - m_fds_erase.push_back(p -> UniqueIdentifier()); -} - - -void SocketHandler::RebuildFdset() -{ - fd_set rfds; - fd_set wfds; - fd_set efds; - // rebuild fd_set's from active sockets list (m_sockets) here - FD_ZERO(&rfds); - FD_ZERO(&wfds); - FD_ZERO(&efds); - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); ++it) - { - SOCKET s = it -> first; - Socket *p = it -> second; - if (s == p -> GetSocket() && s >= 0) - { - fd_set fds; - FD_ZERO(&fds); - FD_SET(s, &fds); - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 0; - int n = select((int)s + 1, &fds, NULL, NULL, &tv); - if (n == -1 && Errno == EBADF) - { - // %! bad fd, remove - LogError(p, "Select", (int)s, "Bad fd in fd_set (2)", LOG_LEVEL_ERROR); - DeleteSocket(p); - } - else - { - if (FD_ISSET(s, &m_rfds)) - FD_SET(s, &rfds); - if (FD_ISSET(s, &m_wfds)) - FD_SET(s, &wfds); - if (FD_ISSET(s, &m_efds)) - FD_SET(s, &efds); - } - } - else - { - // %! mismatch - LogError(p, "Select", (int)s, "Bad fd in fd_set (3)", LOG_LEVEL_ERROR); - DeleteSocket(p); - } - } - m_rfds = rfds; - m_wfds = wfds; - m_efds = efds; -} - - -void SocketHandler::AddIncoming() -{ - while (m_add.size() > 0) - { - if (m_sockets.size() >= MaxCount()) - { - LogError(NULL, "Select", (int)m_sockets.size(), "socket limit reached", LOG_LEVEL_WARNING); - break; - } - std::list::iterator it = m_add.begin(); - Socket *p = *it; - SOCKET s = p -> GetSocket(); -DEB( fprintf(stderr, "Trying to add fd %d, m_add.size() %d\n", (int)s, (int)m_add.size());) - // - if (s == INVALID_SOCKET) - { - LogError(p, "Add", -1, "Invalid socket", LOG_LEVEL_WARNING); - m_delete.push_back(p); - m_add.erase(it); - continue; - } - socket_m::iterator it2; - if ((it2 = m_sockets.find(s)) != m_sockets.end()) - { - Socket *found = it2 -> second; - if (p -> UniqueIdentifier() > found -> UniqueIdentifier()) - { - LogError(p, "Add", (int)p -> GetSocket(), "Replacing socket already in controlled queue (newer uid)", LOG_LEVEL_WARNING); - // replace - DeleteSocket(found); - } - else - if (p -> UniqueIdentifier() == found -> UniqueIdentifier()) - { - LogError(p, "Add", (int)p -> GetSocket(), "Attempt to add socket already in controlled queue (same uid)", LOG_LEVEL_ERROR); - // same - ignore - if (p != found) - m_delete.push_back(p); - m_add.erase(it); - continue; - } - else - { - LogError(p, "Add", (int)p -> GetSocket(), "Attempt to add socket already in controlled queue (older uid)", LOG_LEVEL_FATAL); - // %! it's a dup, don't add to delete queue, just ignore it - m_delete.push_back(p); - m_add.erase(it); - continue; - } - } - if (p -> CloseAndDelete()) - { - LogError(p, "Add", (int)p -> GetSocket(), "Added socket with SetCloseAndDelete() true", LOG_LEVEL_WARNING); - m_sockets[s] = p; - DeleteSocket(p); - p -> Close(); - } - else - { - StreamSocket *scp = dynamic_cast(p); - if (scp && scp -> Connecting()) // 'Open' called before adding socket - { - ISocketHandler_Add(p,false,true); - } - else - { - TcpSocket *tcp = dynamic_cast(p); - bool bWrite = tcp ? tcp -> GetOutputLength() != 0 : false; - if (p -> IsDisableRead()) - { - ISocketHandler_Add(p, false, bWrite); - } - else - { - ISocketHandler_Add(p, true, bWrite); - } - } - m_maxsock = (s > m_maxsock) ? s : m_maxsock; - m_sockets[s] = p; - } - // - m_add.erase(it); - } -} - - -void SocketHandler::CheckErasedSockets() -{ - // check erased sockets - bool check_max_fd = false; - while (m_fds_erase.size()) - { - std::list::iterator it = m_fds_erase.begin(); - socketuid_t uid = *it; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> UniqueIdentifier() == uid) - { - /* Sometimes a SocketThread class can finish its run before the master - sockethandler gets here. In that case, the SocketThread has set the - 'ErasedByHandler' flag on the socket which will make us end up with a - double delete on the socket instance. - The fix is to make sure that the master sockethandler only can delete - non-detached sockets, and a slave sockethandler only can delete - detach sockets. */ - if (p -> ErasedByHandler() -#ifdef ENABLE_DETACH - && !(m_slave ^ p -> IsDetached()) -#endif - ) - { - delete p; - } - m_sockets.erase(it); - break; - } - } - m_fds_erase.erase(it); - check_max_fd = true; - } - // calculate max file descriptor for select() call - if (check_max_fd) - { - m_maxsock = 0; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - SOCKET s = it -> first; - m_maxsock = s > m_maxsock ? s : m_maxsock; - } - } -} - - -void SocketHandler::CheckCallOnConnect() -{ - m_b_check_callonconnect = false; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> CallOnConnect()) - { - TcpSocket *tcp = dynamic_cast(p); - p -> SetConnected(); // moved here from inside if (tcp) check below -#ifdef HAVE_OPENSSL - if (p -> IsSSL()) // SSL Enabled socket - p -> OnSSLConnect(); - else -#endif -#ifdef ENABLE_SOCKS4 - if (p -> Socks4()) - p -> OnSocks4Connect(); - else -#endif - { - if (tcp) - { - if (tcp -> GetOutputLength()) - { - p -> OnWrite(); - } - } -#ifdef ENABLE_RECONNECT - if (tcp && tcp -> IsReconnect()) - p -> OnReconnect(); - else -#endif - { - p -> OnConnect(); - } - } - p -> SetCallOnConnect( false ); - m_b_check_callonconnect = true; - } - } -} - - -#ifdef ENABLE_DETACH -void SocketHandler::CheckDetach() -{ - m_b_check_detach = false; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> IsDetach()) - { - ISocketHandler_Del(p); - // After DetachSocket(), all calls to Handler() will return a reference - // to the new slave SocketHandler running in the new thread. - p -> DetachSocket(); - // Adding the file descriptor to m_fds_erase will now also remove the - // socket from the detach queue - tnx knightmad - m_fds_erase.push_back(p -> UniqueIdentifier()); - m_b_check_detach = true; - } - } -} -#endif - - -void SocketHandler::CheckTimeout(time_t tnow) -{ - m_b_check_timeout = false; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> CheckTimeout()) - { - if (p -> Timeout(tnow)) - { - StreamSocket *scp = dynamic_cast(p); - p -> SetTimeout(0); - if (scp && scp -> Connecting()) - { - p -> OnConnectTimeout(); - // restart timer - p -> SetTimeout( scp -> GetConnectTimeout() ); - } - else - { - p -> OnTimeout(); - } - } - m_b_check_timeout = true; - } - } -} - - -void SocketHandler::CheckRetry() -{ - m_b_check_retry = false; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> RetryClientConnect()) - { - TcpSocket *tcp = dynamic_cast(p); - tcp -> SetRetryClientConnect(false); -DEB( fprintf(stderr, "Close() before retry client connect\n");) - p -> Close(); // removes from m_fds_retry - std::auto_ptr ad = p -> GetClientRemoteAddress(); - if (ad.get()) - { - tcp -> Open(*ad); - } - else - { - LogError(p, "RetryClientConnect", 0, "no address", LOG_LEVEL_ERROR); - } - Add(p); - m_fds_erase.push_back(p -> UniqueIdentifier()); - m_b_check_retry = true; - } - } -} - - -void SocketHandler::CheckClose() -{ - m_b_check_close = false; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - if (p -> CloseAndDelete() ) - { - TcpSocket *tcp = dynamic_cast(p); -#ifdef ENABLE_RECONNECT - if (p -> Lost() && !(tcp && tcp -> Reconnect())) -#else - if (p -> Lost()) -#endif - { - // remove instance when Lost, if not reconnect flag is set - DeleteSocket(p); - } - else - // new graceful tcp - flush and close timeout 5s - if (tcp && p -> IsConnected() && tcp -> GetFlushBeforeClose() && -#ifdef HAVE_OPENSSL - !tcp -> IsSSL() && -#endif - p -> TimeSinceClose() < 5) - { -DEB( fprintf(stderr, " close(1)\n");) - if (tcp -> GetOutputLength()) - { - LogError(p, "Closing", (int)tcp -> GetOutputLength(), "Sending all data before closing", LOG_LEVEL_INFO); - } - else // shutdown write when output buffer is empty - if (!(tcp -> GetShutdown() & SHUT_WR)) - { - SOCKET nn = it -> first; - if (nn != INVALID_SOCKET && shutdown(nn, SHUT_WR) == -1) - { - LogError(p, "graceful shutdown", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - tcp -> SetShutdown(SHUT_WR); - } - else - { - ISocketHandler_Del(p); - tcp -> Close(); - DeleteSocket(p); - } - } - else -#ifdef ENABLE_RECONNECT - if (tcp && p -> IsConnected() && tcp -> Reconnect()) - { - p -> SetCloseAndDelete(false); - tcp -> SetIsReconnect(); - p -> SetConnected(false); -DEB( fprintf(stderr, "Close() before reconnect\n");) - p -> Close(); // dispose of old file descriptor (Open creates a new) - p -> OnDisconnect(); - std::auto_ptr ad = p -> GetClientRemoteAddress(); - if (ad.get()) - { - tcp -> Open(*ad); - } - else - { - LogError(p, "Reconnect", 0, "no address", LOG_LEVEL_ERROR); - } - tcp -> ResetConnectionRetries(); - Add(p); - m_fds_erase.push_back(p -> UniqueIdentifier()); - } - else -#endif - { - if (tcp && p -> IsConnected() && tcp -> GetOutputLength()) - { - LogError(p, "Closing", (int)tcp -> GetOutputLength(), "Closing socket while data still left to send", LOG_LEVEL_WARNING); - } -#ifdef ENABLE_POOL - if (p -> Retain() && !p -> Lost()) - { - PoolSocket *p2 = new PoolSocket(*this, p); - p2 -> SetDeleteByHandler(); - Add(p2); - // - p -> SetCloseAndDelete(false); // added - remove from m_fds_close - } - else -#endif // ENABLE_POOL - { - ISocketHandler_Del(p); -DEB( fprintf(stderr, "Close() before OnDelete\n");) - p -> Close(); - } - DeleteSocket(p); - } - m_b_check_close = true; - } - } -} - - -int SocketHandler::ISocketHandler_Select(struct timeval *tsel) -{ -#ifdef MACOSX - fd_set rfds; - fd_set wfds; - fd_set efds; - FD_COPY(&m_rfds, &rfds); - FD_COPY(&m_wfds, &wfds); - FD_COPY(&m_efds, &efds); -#else - fd_set rfds = m_rfds; - fd_set wfds = m_wfds; - fd_set efds = m_efds; -#endif - int n; -DEB( -printf("select( %d, [", m_maxsock + 1); -for (size_t i = 0; i <= m_maxsock; i++) - if (FD_ISSET(i, &rfds)) - printf(" %d", i); -printf("], ["); -for (size_t i = 0; i <= m_maxsock; i++) - if (FD_ISSET(i, &wfds)) - printf(" %d", i); -printf("], ["); -for (size_t i = 0; i <= m_maxsock; i++) - if (FD_ISSET(i, &efds)) - printf(" %d", i); -printf("]\n"); -) - if (m_b_use_mutex) - { - m_mutex.Unlock(); - n = select( (int)(m_maxsock + 1),&rfds,&wfds,&efds,tsel); - m_mutex.Lock(); - } - else - { - n = select( (int)(m_maxsock + 1),&rfds,&wfds,&efds,tsel); - } - if (n == -1) // error on select - { - int err = Errno; - /* - EBADF An invalid file descriptor was given in one of the sets. - EINTR A non blocked signal was caught. - EINVAL n is negative. Or struct timeval contains bad time values (<0). - ENOMEM select was unable to allocate memory for internal tables. - */ -#ifdef _WIN32 - switch (err) - { - case WSAENOTSOCK: - RebuildFdset(); - break; - case WSAEINTR: - case WSAEINPROGRESS: - break; - case WSAEINVAL: - LogError(NULL, "SocketHandler::Select", err, StrError(err), LOG_LEVEL_FATAL); - throw Exception("select(n): n is negative. Or struct timeval contains bad time values (<0)."); - case WSAEFAULT: - LogError(NULL, "SocketHandler::Select", err, StrError(err), LOG_LEVEL_ERROR); - break; - case WSANOTINITIALISED: - throw Exception("WSAStartup not successfully called"); - case WSAENETDOWN: - throw Exception("Network subsystem failure"); - } -#else - switch (err) - { - case EBADF: - RebuildFdset(); - break; - case EINTR: - break; - case EINVAL: - LogError(NULL, "SocketHandler::Select", err, StrError(err), LOG_LEVEL_FATAL); - throw Exception("select(n): n is negative. Or struct timeval contains bad time values (<0)."); - case ENOMEM: - LogError(NULL, "SocketHandler::Select", err, StrError(err), LOG_LEVEL_ERROR); - break; - } -#endif - printf("error on select(): %d %s\n", Errno, StrError(err)); - } - else - if (!n) // timeout - { - } - else - if (n > 0) - { - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - SOCKET i = it -> first; - Socket *p = it -> second; - // --------------------------------------------------------------------------------- - if (FD_ISSET(i, &rfds)) - { -#ifdef HAVE_OPENSSL - if (p -> IsSSLNegotiate()) - { - p -> SSLNegotiate(); - } - else -#endif - { - p -> OnRead(); - } - } - // --------------------------------------------------------------------------------- - if (FD_ISSET(i, &wfds)) - { -#ifdef HAVE_OPENSSL - if (p -> IsSSLNegotiate()) - { - p -> SSLNegotiate(); - } - else -#endif - { - p -> OnWrite(); - } - } - // --------------------------------------------------------------------------------- - if (FD_ISSET(i, &efds)) - { - p -> OnException(); - } - } // m_sockets ... - } // if (n > 0) - return n; -} - - -int SocketHandler::Select(long sec,long usec) -{ - struct timeval tv; - tv.tv_sec = sec; - tv.tv_usec = usec; - return Select(&tv); -} - - -int SocketHandler::Select() -{ - if (m_b_check_callonconnect || - m_b_check_detach || - m_b_check_timeout || - m_b_check_retry || - m_b_check_close) - { - return Select(0, 200000); - } - return Select(NULL); -} - - -int SocketHandler::Select(struct timeval *tsel) -{ - if (!m_add.empty()) - { - AddIncoming(); - } - int n = ISocketHandler_Select(tsel); - // check CallOnConnect - EVENT - if (m_b_check_callonconnect) - { - CheckCallOnConnect(); - } - -#ifdef ENABLE_DETACH - // check detach of socket if master handler - EVENT - if (!m_slave && m_b_check_detach) - { - CheckDetach(); - } -#endif - - // check Connecting - connection timeout - conditional event - if (m_b_check_timeout) - { - time_t tnow = time(NULL); - if (tnow != m_tlast) - { - CheckTimeout(tnow); - m_tlast = tnow; - } // tnow != tlast - } - - // check retry client connect - EVENT - if (m_b_check_retry) - { - CheckRetry(); - } - - // check close and delete - conditional event - if (m_b_check_close) - { - CheckClose(); - } - - if (!m_fds_erase.empty()) - { - CheckErasedSockets(); - } - - // remove Add's that fizzed - while (m_delete.size()) - { - std::list::iterator it = m_delete.begin(); - Socket *p = *it; - p -> OnDelete(); - m_delete.erase(it); - if (p -> DeleteByHandler() -#ifdef ENABLE_DETACH - && !(m_slave ^ p -> IsDetached()) -#endif - ) - { - p -> SetErasedByHandler(); - delete p; - } - } - - return n; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.h deleted file mode 100755 index 79c28bc6b3..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandler.h +++ /dev/null @@ -1,302 +0,0 @@ -/** \file SocketHandler.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_SocketHandler_H -#define _SOCKETS_SocketHandler_H - -#include "sockets-config.h" -#include -#include - -#include "socket_include.h" -#include "ISocketHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -class Socket; -#ifdef ENABLE_RESOLVER -class ResolvServer; -#endif -class IMutex; -class SocketHandlerThread; -class UdpSocket; - -/** Socket container class, event generator. - \ingroup basic */ -class SocketHandler : public ISocketHandler -{ -protected: - /** Map type for holding file descriptors/socket object pointers. */ - typedef std::map socket_m; - -public: - /** SocketHandler constructor. - \param log Optional log class pointer */ - SocketHandler(StdLog *log = NULL); - - /** SocketHandler threadsafe constructor. - \param mutex Externally declared mutex variable - \param log Optional log class pointer */ - SocketHandler(IMutex& mutex,StdLog *log = NULL); - - SocketHandler(IMutex&, ISocketHandler& parent, StdLog * = NULL); - - ~SocketHandler(); - - virtual ISocketHandler *Create(StdLog * = NULL); - virtual ISocketHandler *Create(IMutex&, ISocketHandler&, StdLog * = NULL); - - virtual bool ParentHandlerIsValid(); - - virtual ISocketHandler& ParentHandler(); - - virtual ISocketHandler& GetRandomHandler(); - - virtual ISocketHandler& GetEffectiveHandler(); - - virtual void SetNumberOfThreads(size_t n); - virtual bool IsThreaded(); - - virtual void EnableRelease(); - virtual void Release(); - - /** Get mutex reference for threadsafe operations. */ - IMutex& GetMutex() const; - - /** Register StdLog object for error callback. - \param log Pointer to log class */ - void RegStdLog(StdLog *log); - - /** Log error to log class for print out / storage. */ - void LogError(Socket *p,const std::string& user_text,int err,const std::string& sys_err,loglevel_t t = LOG_LEVEL_WARNING); - - /** Add socket instance to socket map. Removal is always automatic. */ - void Add(Socket *); - - /** Set read/write/exception file descriptor sets (fd_set). */ - void ISocketHandler_Add(Socket *,bool bRead,bool bWrite); - void ISocketHandler_Mod(Socket *,bool bRead,bool bWrite); - void ISocketHandler_Del(Socket *); - - /** Wait for events, generate callbacks. */ - int Select(long sec,long usec); - - /** This method will not return until an event has been detected. */ - int Select(); - - /** Wait for events, generate callbacks. */ - int Select(struct timeval *tsel); - - /** Check that a socket really is handled by this socket handler. */ - bool Valid(Socket *); - bool Valid(socketuid_t); - - /** Return number of sockets handled by this handler. */ - size_t GetCount(); - size_t MaxCount() { - return FD_SETSIZE; - } - - /** Override and return false to deny all incoming connections. - \param p ListenSocket class pointer (use GetPort to identify which one) */ - bool OkToAccept(Socket *p); - - /** Use with care, always lock with h.GetMutex() if multithreaded */ - const std::map& AllSockets() { - return m_sockets; - } - - size_t MaxTcpLineSize() { - return TCP_LINE_SIZE; - } - - void SetCallOnConnect(bool = true); - void SetDetach(bool = true); - void SetTimeout(bool = true); - void SetRetry(bool = true); - void SetClose(bool = true); - -private: - static FILE *m_event_file; - static unsigned long m_event_counter; - -public: - // Connection pool -#ifdef ENABLE_POOL - /** Find available open connection (used by connection pool). */ - ISocketHandler::PoolSocket *FindConnection(int type,const std::string& protocol,SocketAddress&); - /** Enable connection pool (by default disabled). */ - void EnablePool(bool x = true); - /** Check pool status. - \return true if connection pool is enabled */ - bool PoolEnabled(); -#endif // ENABLE_POOL - - // Socks4 -#ifdef ENABLE_SOCKS4 - /** Set socks4 server ip that all new tcp sockets should use. */ - void SetSocks4Host(ipaddr_t); - /** Set socks4 server hostname that all new tcp sockets should use. */ - void SetSocks4Host(const std::string& ); - /** Set socks4 server port number that all new tcp sockets should use. */ - void SetSocks4Port(port_t); - /** Set optional socks4 userid. */ - void SetSocks4Userid(const std::string& ); - /** If connection to socks4 server fails, immediately try direct connection to final host. */ - void SetSocks4TryDirect(bool x = true); - /** Get socks4 server ip. - \return socks4 server ip */ - ipaddr_t GetSocks4Host(); - /** Get socks4 port number. - \return socks4 port number */ - port_t GetSocks4Port(); - /** Get socks4 userid (optional). - \return socks4 userid */ - const std::string& GetSocks4Userid(); - /** Check status of socks4 try direct flag. - \return true if direct connection should be tried if connection to socks4 server fails */ - bool Socks4TryDirect(); -#endif // ENABLE_SOCKS4 - - // DNS resolve server -#ifdef ENABLE_RESOLVER - /** Enable asynchronous DNS. - \param port Listen port of asynchronous dns server */ - void EnableResolver(port_t port = 16667); - /** Check resolver status. - \return true if resolver is enabled */ - bool ResolverEnabled(); - /** Queue a dns request. - \param host Hostname to be resolved - \param port Port number will be echoed in Socket::OnResolved callback */ - int Resolve(Socket *,const std::string& host,port_t port); -#ifdef ENABLE_IPV6 - int Resolve6(Socket *,const std::string& host,port_t port); -#endif - /** Do a reverse dns lookup. */ - int Resolve(Socket *,ipaddr_t a); -#ifdef ENABLE_IPV6 - int Resolve(Socket *,in6_addr& a); -#endif - /** Get listen port of asynchronous dns server. */ - port_t GetResolverPort(); - /** Resolver thread ready for queries. */ - bool ResolverReady(); - /** Returns true if the socket is waiting for a resolve event. */ - bool Resolving(Socket *); -#endif // ENABLE_RESOLVER - -#ifdef ENABLE_DETACH - /** Indicates that the handler runs under SocketThread. */ - void SetSlave(bool x = true); - /** Indicates that the handler runs under SocketThread. */ - bool IsSlave(); -#endif - -protected: - socket_m m_sockets; ///< Active sockets map - std::list m_add; ///< Sockets to be added to sockets map - std::list m_delete; ///< Sockets to be deleted (failed when Add) - -protected: - /** Actual call to select() */ - int ISocketHandler_Select(struct timeval *); - /** Remove socket from socket map, used by Socket class. */ - void Remove(Socket *); - /** Schedule socket for deletion */ - void DeleteSocket(Socket *); - void AddIncoming(); - void CheckErasedSockets(); - void CheckCallOnConnect(); - void CheckDetach(); - void CheckTimeout(time_t); - void CheckRetry(); - void CheckClose(); - // - StdLog *m_stdlog; ///< Registered log class, or NULL - IMutex& m_mutex; ///< Thread safety mutex - bool m_b_use_mutex; ///< Mutex correctly initialized - ISocketHandler& m_parent; - bool m_b_parent_is_valid; - -private: - void RebuildFdset(); - void Set(Socket *,bool,bool); - // - std::list m_threads; - UdpSocket *m_release; - // - SOCKET m_maxsock; ///< Highest file descriptor + 1 in active sockets list - fd_set m_rfds; ///< file descriptor set monitored for read events - fd_set m_wfds; ///< file descriptor set monitored for write events - fd_set m_efds; ///< file descriptor set monitored for exceptions - time_t m_tlast; ///< timeout control - - // state lists - std::list m_fds_erase; ///< File descriptors that are to be erased from m_sockets - - bool m_b_check_callonconnect; - bool m_b_check_detach; - bool m_b_check_timeout; - bool m_b_check_retry; - bool m_b_check_close; - -#ifdef ENABLE_SOCKS4 - ipaddr_t m_socks4_host; ///< Socks4 server host ip - port_t m_socks4_port; ///< Socks4 server port number - std::string m_socks4_userid; ///< Socks4 userid - bool m_bTryDirect; ///< Try direct connection if socks4 server fails -#endif -#ifdef ENABLE_RESOLVER - int m_resolv_id; ///< Resolver id counter - ResolvServer *m_resolver; ///< Resolver thread pointer - port_t m_resolver_port; ///< Resolver listen port - std::map m_resolve_q; ///< resolve queue -#endif -#ifdef ENABLE_POOL - bool m_b_enable_pool; ///< Connection pool enabled if true -#endif -#ifdef ENABLE_DETACH - bool m_slave; ///< Indicates that this is a ISocketHandler run in SocketThread -#endif -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_SocketHandler_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.cpp deleted file mode 100755 index 566e06f625..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/** \file SocketHandler.cpp - ** \date 2010-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "SocketHandlerEp.h" -#include "Exception.h" -#include "IMutex.h" -#include "Utility.h" - -#include - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -SocketHandlerEp::SocketHandlerEp(StdLog *p) -:SocketHandler(p) -,m_epoll(-1) -{ -#ifdef LINUX - m_epoll = epoll_create(FD_SETSIZE); - if (m_epoll == -1) - { - throw Exception(StrError(Errno)); - } -#endif -} - - -SocketHandlerEp::SocketHandlerEp(IMutex& mutex, StdLog *p) -:SocketHandler(mutex, p) -,m_epoll(-1) -{ -#ifdef LINUX - m_epoll = epoll_create(FD_SETSIZE); - if (m_epoll == -1) - { - throw Exception(StrError(Errno)); - } -#endif -} - - -SocketHandlerEp::SocketHandlerEp(IMutex& mutex, ISocketHandler& parent, StdLog *p) -:SocketHandler(mutex, parent, p) -,m_epoll(-1) -{ -#ifdef LINUX - m_epoll = epoll_create(FD_SETSIZE); - if (m_epoll == -1) - { - throw Exception(StrError(Errno)); - } -#endif -} - - -SocketHandlerEp::~SocketHandlerEp() -{ -#ifdef LINUX - if (m_epoll != -1) - { - close(m_epoll); - } -#endif -} - - -ISocketHandler *SocketHandlerEp::Create(StdLog *log) -{ - return new SocketHandlerEp(log); -} - - -ISocketHandler *SocketHandlerEp::Create(IMutex& mutex, ISocketHandler& parent, StdLog *log) -{ - return new SocketHandlerEp(mutex, parent, log); -} - - -#ifdef LINUX -void SocketHandlerEp::ISocketHandler_Add(Socket *p,bool bRead,bool bWrite) -{ - struct epoll_event stat; - SOCKET s = p -> GetSocket(); - stat.data.ptr = p; - stat.events = (bRead ? EPOLLIN : 0) | (bWrite ? EPOLLOUT : 0); - if (epoll_ctl(m_epoll, EPOLL_CTL_ADD, s, &stat) == -1) - { - LogError(NULL, "epoll_ctl: EPOLL_CTL_ADD", Errno, StrError(Errno)); - } -} - - -void SocketHandlerEp::ISocketHandler_Mod(Socket *p,bool r,bool w) -{ - struct epoll_event stat; - SOCKET s = p -> GetSocket(); - stat.data.ptr = p; - stat.events = (r ? EPOLLIN : 0) | (w ? EPOLLOUT : 0); - if (epoll_ctl(m_epoll, EPOLL_CTL_MOD, s, &stat) == -1) - { -// LogError(NULL, "epoll_ctl: EPOLL_CTL_MOD", Errno, StrError(Errno)); - } -} - - -void SocketHandlerEp::ISocketHandler_Del(Socket *p) -{ - struct epoll_event stat; - stat.events = 0; - stat.data.ptr = p; - if (epoll_ctl(m_epoll, EPOLL_CTL_DEL, p -> GetSocket(), &stat) == -1) - { -// LogError(NULL, "epoll_ctl: EPOLL_CTL_DEL", Errno, StrError(Errno)); - } -} - - -int SocketHandlerEp::ISocketHandler_Select(struct timeval *tsel) -{ - int n; - if (m_b_use_mutex) - { - m_mutex.Unlock(); - n = epoll_wait(m_epoll, m_events, MAX_EVENTS_EP_WAIT, tsel ? tsel -> tv_sec * 1000 + tsel -> tv_usec / 1000 : -1); - m_mutex.Lock(); - } - else - { - n = epoll_wait(m_epoll, m_events, MAX_EVENTS_EP_WAIT, tsel ? tsel -> tv_sec * 1000 + tsel -> tv_usec / 1000 : -1); - } - if (n == -1) - { - LogError(NULL, "epoll_wait", Errno, StrError(Errno)); - } - else - if (!n) - { - } - else - if (n > 0) - { - for (int x = 0; x < n; x++) - { - Socket *p = static_cast(m_events[x].data.ptr); - if ((m_events[x].events & EPOLLIN) || (m_events[x].events & EPOLLHUP)) - { -#ifdef HAVE_OPENSSL - if (p -> IsSSLNegotiate()) - { - p -> SSLNegotiate(); - } - else -#endif - { - p -> OnRead(); - } - } - if (m_events[x].events & EPOLLOUT) - { -#ifdef HAVE_OPENSSL - if (p -> IsSSLNegotiate()) - { - p -> SSLNegotiate(); - } - else -#endif - { - p -> OnWrite(); - } - } - if (m_events[x].events & EPOLLERR) - { - p -> OnException(); - } - } - } - return n; -} -#endif - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.h deleted file mode 100755 index fe6c8d5af5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerEp.h +++ /dev/null @@ -1,96 +0,0 @@ -/** \file SocketHandlerEp.h - ** \date 2010-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETHANDLEREP_H -#define _SOCKETHANDLEREP_H - -#include "SocketHandler.h" -#ifdef LINUX -#include - -#define MAX_EVENTS_EP_WAIT 100 -#endif // LINUX - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class SocketHandlerEp : public SocketHandler -{ -public: - /** SocketHandler constructor. - \param log Optional log class pointer */ - SocketHandlerEp(StdLog *log = NULL); - - /** SocketHandler threadsafe constructor. - \param mutex Externally declared mutex variable - \param log Optional log class pointer */ - SocketHandlerEp(IMutex& mutex,StdLog *log = NULL); - - SocketHandlerEp(IMutex&, ISocketHandler& parent, StdLog * = NULL); - - ~SocketHandlerEp(); - - ISocketHandler *Create(StdLog * = NULL); - ISocketHandler *Create(IMutex&, ISocketHandler&, StdLog * = NULL); - -#ifdef LINUX - - /** Set read/write/exception file descriptor sets (fd_set). */ - void ISocketHandler_Add(Socket *,bool bRead,bool bWrite); - void ISocketHandler_Mod(Socket *,bool bRead,bool bWrite); - void ISocketHandler_Del(Socket *); - - size_t MaxCount() { - return 10000; // %! - } - -protected: - /** Actual call to select() */ - int ISocketHandler_Select(struct timeval *); -#endif // LINUX - -private: - int m_epoll; ///< epoll file descriptor -#ifdef LINUX - struct epoll_event m_events[MAX_EVENTS_EP_WAIT]; - -#endif // LINUX - -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETHANDLEREP_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.cpp deleted file mode 100755 index b097983adb..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/** - ** \file SocketHandlerThread.cpp - ** \date 2010-03-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "SocketHandlerThread.h" -#include "Mutex.h" -#include "ISocketHandler.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -SocketHandlerThread::SocketHandlerThread(ISocketHandler& parent) : Thread(false) -, m_parent(parent) -, m_handler(NULL) -{ -} - - -SocketHandlerThread::~SocketHandlerThread() -{ -} - - -ISocketHandler& SocketHandlerThread::Handler() -{ - return *m_handler; -} - - -void SocketHandlerThread::Run() -{ - Mutex mutex; - m_handler = m_parent.Create(mutex, m_parent); - m_sem.Post(); - ISocketHandler& h = *m_handler; - h.EnableRelease(); - while (IsRunning()) - { - h.Select(1, 0); - } -} - - -void SocketHandlerThread::Wait() -{ - m_sem.Wait(); -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.h deleted file mode 100755 index 8b02696812..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketHandlerThread.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - ** \file SocketHandlerThread.h - ** \date 2010-03-21 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETHANDLERTHREAD_H -#define _SOCKETHANDLERTHREAD_H - -#include "Thread.h" -#include "Semaphore.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class ISocketHandler; - -class SocketHandlerThread : public Thread -{ -public: - SocketHandlerThread(ISocketHandler& parent); - ~SocketHandlerThread(); - - virtual void Run(); - - ISocketHandler& Handler(); - - void Wait(); - -private: - ISocketHandler& m_parent; - ISocketHandler *m_handler; - Semaphore m_sem; -}; - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETHANDLERTHREAD_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.cpp deleted file mode 100755 index a97d261f89..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/** - ** \file SocketStream.cpp - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "SocketStream.h" -#include "ISocketHandler.h" -#include "TcpSocket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -SocketStream::SocketStream(ISocketHandler& h, TcpSocket *sock) : m_handler(h), m_socket(sock) -, m_socket_uid(sock -> UniqueIdentifier()) -{ -} - - -size_t SocketStream::IStreamRead(char *buf, size_t max_sz) -{ - if (m_handler.Valid(m_socket_uid)) - { - return m_socket -> ReadInput(buf, max_sz); - } - return 0; -} - - -void SocketStream::IStreamWrite(const char *buf, size_t sz) -{ - if (m_handler.Valid(m_socket_uid)) - { - m_socket -> SendBuf(buf, sz); - } -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.h deleted file mode 100755 index 76ff52478e..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketStream.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - ** \file SocketStream.h - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_SocketStream_H -#define _SOCKETS_SocketStream_H - -#include "IStream.h" - -#include "socket_include.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class ISocketHandler; -class TcpSocket; - -class SocketStream : public IStream -{ -public: - SocketStream(ISocketHandler& h, TcpSocket *sock); - - size_t IStreamRead(char *buf, size_t max_sz); - - void IStreamWrite(const char *buf, size_t sz); - -private: - ISocketHandler& m_handler; - TcpSocket *m_socket; - socketuid_t m_socket_uid; -}; - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_SocketStream_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.cpp deleted file mode 100755 index 003f8e5ad7..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "SocketThread.h" - -#ifdef ENABLE_DETACH -#include "Utility.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -SocketThread::SocketThread(Socket *p) -:Thread(false) -,m_socket(p) -{ - // Creator will release -} - - -SocketThread::~SocketThread() -{ - if (IsRunning()) - { - SetRelease(true); - SetRunning(false); - m_h.Release(); - Utility::Sleep(5); - } -} - - -void SocketThread::Run() -{ - m_h.SetSlave(); - m_h.Add(m_socket); - m_socket -> SetSlaveHandler(&m_h); - m_socket -> OnDetached(); - m_h.EnableRelease(); - while (m_h.GetCount() && IsRunning()) - { - m_h.Select(0, 500000); - } - // m_socket now deleted oops - // yeah oops m_socket delete its socket thread, that means this - // so Socket will no longer delete its socket thread, instead we do this: - SetDeleteOnExit(); -} - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // ENABLE_DETACH diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.h deleted file mode 100755 index 49e50c734f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/SocketThread.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _SOCKETTHREAD_H -#define _SOCKETTHREAD_H - -#include "sockets-config.h" -#ifdef ENABLE_DETACH - -#include "Thread.h" -#include "SocketHandler.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class Socket; - -/** Detached socket run thread. - \ingroup internal */ -class SocketThread : public Thread -{ -public: - SocketThread(Socket *p); - ~SocketThread(); - - void Run(); - -private: - SocketThread(const SocketThread& s) : m_socket(s.m_socket) {} - SocketThread& operator=(const SocketThread& ) { - return *this; - } - - SocketHandler m_h; - Socket *m_socket; -}; - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // ENABLE_DETACH - -#endif // _SOCKETTHREAD_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Sockets-config b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Sockets-config deleted file mode 100755 index 18f9a6596c..0000000000 Binary files a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Sockets-config and /dev/null differ diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Sockets-config.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Sockets-config.cpp deleted file mode 100755 index 7311147c8f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Sockets-config.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/** - ** \file Sockets-config.cpp - ** \date 2006-09-04 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007 Anders Hedstrom - -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. -*/ -#include -#include -#include "sockets-config.h" -#include "socket_include.h" - -int main(int argc,char *argv[]) -{ - if (argc > 1 && !strcmp(argv[1], "-info")) - { -#ifdef HAVE_OPENSSL - printf("SSL support\n"); -#endif -#ifdef IPPROTO_IPV6 - printf("IPv6 support\n"); -#endif -#ifdef USE_SCTP -#ifdef IPPROTO_SCTP - printf("SCTP support\n"); -# ifdef HAVE_SCTP - printf(" HAVE_SCTP: yes\n"); -# else - printf(" HAVE_SCTP: no\n"); -# endif -# ifdef HAVE_KERNEL_SCTP - printf(" HAVE_KERNEL_SCTP: yes\n"); -# else - printf(" HAVE_KERNEL_SCTP: no\n"); -# endif -# ifdef HAVE_SCTP_PRSCTP - printf(" HAVE_SCTP_PRSCTP: yes\n"); -# else - printf(" HAVE_SCTP_PRSCTP: no\n"); -# endif -# ifdef HAVE_SCTP_ADDIP - printf(" HAVE_SCTP_ADDIP: yes\n"); -# else - printf(" HAVE_SCTP_ADDIP: no\n"); -# endif -# ifdef HAVE_SCTP_CANSET_PRIMARY - printf(" HAVE_SCTP_CANSETPRIMARY: yes\n"); -# else - printf(" HAVE_SCTP_CANSETPRIMARY: no\n"); -# endif -# ifdef HAVE_SCTP_SAT_NETWORK_CAPABILITY - printf(" HAVE_SCTP_SAT_NETWORK_CAPABILITY: yes\n"); -# else - printf(" HAVE_SCTP_SAT_NETWORK_CAPABILITY: no\n"); -# endif -# ifdef HAVE_SCTP_MULTIBUF - printf(" HAVE_SCTP_MULTIBUF: yes\n"); -# else - printf(" HAVE_SCTP_MULTIBUF: no\n"); -# endif -# ifdef HAVE_SCTP_NOCONNECT - printf(" HAVE_SCTP_NOCONNECT: yes\n"); -# else - printf(" HAVE_SCTP_NOCONNECT: no\n"); -# endif -# ifdef HAVE_SCTP_EXT_RCVINFO - printf(" HAVE_SCTP_EXT_RCVINFO: yes\n"); -# else - printf(" HAVE_SCTP_EXT_RCVINFO: no\n"); -# endif -#else - printf("No SCTP support\n"); -#endif -#endif - return 0; - } - printf(" -D_VERSION='\"%s\"'", _VERSION); - -#ifdef LINUX - printf(" -DLINUX"); -#endif -#ifdef MACOSX - printf(" -DMACOSX"); -#endif -#ifdef SOLARIS - printf(" -DSOLARIS"); -#endif -#ifdef SOLARIS8 - printf(" -DSOLARIS8"); -#endif -#ifdef _WIN32 - printf(" -D_WIN32"); -#endif -#ifdef __CYGWIN__ - printf(" -D__CYGWIN__"); -#endif -#ifdef SOCKETS_NAMESPACE - printf(" -DSOCKETS_NAMESPACE=%s", SOCKETS_NAMESPACE_STR); -#endif -#ifdef _DEBUG - printf(" -D_DEBUG"); -#endif - -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdLog.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdLog.h deleted file mode 100755 index 0ce120ca36..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdLog.h +++ /dev/null @@ -1,76 +0,0 @@ -/** \file StdLog.h - ** \date 2004-06-01 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_StdLog_H -#define _SOCKETS_StdLog_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** error level enum. */ -typedef enum { - LOG_LEVEL_INFO = 0, - LOG_LEVEL_WARNING, - LOG_LEVEL_ERROR, - LOG_LEVEL_FATAL -} loglevel_t; - - -class ISocketHandler; -class Socket; - -/** \defgroup logging Log help classes */ -/** Log class interface. - \ingroup logging */ -class StdLog -{ -public: - virtual ~StdLog() {} - - virtual void error(ISocketHandler *,Socket *, - const std::string& user_text, - int err, - const std::string& sys_err, - loglevel_t = LOG_LEVEL_WARNING) = 0; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_StdLog_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.cpp deleted file mode 100755 index 4cd199a991..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/** \file StdoutLog.cpp - ** \date 2004-06-01 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include -#include "ISocketHandler.h" -#include "StdoutLog.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - - - -void StdoutLog::error(ISocketHandler *,Socket *sock,const std::string& call,int err,const std::string& sys_err,loglevel_t lvl) -{ - if (lvl < m_min_level) - return; - char dt[40]; - time_t t = time(NULL); -#ifdef __CYGWIN__ - struct tm *tp = localtime(&t); - sprintf(dt, "%d-%02d-%02d %02d:%02d:%02d", - tp -> tm_year + 1900, - tp -> tm_mon + 1, - tp -> tm_mday, - tp -> tm_hour,tp -> tm_min,tp -> tm_sec); -#else - struct tm tp; -#if defined( _WIN32) && !defined(__CYGWIN__) - localtime_s(&tp, &t); -#else - localtime_r(&t, &tp); -#endif - sprintf(dt, "%d-%02d-%02d %02d:%02d:%02d", - tp.tm_year + 1900, - tp.tm_mon + 1, - tp.tm_mday, - tp.tm_hour,tp.tm_min,tp.tm_sec); -#endif - std::string level; - - switch (lvl) - { - case LOG_LEVEL_WARNING: - level = "Warning"; - break; - case LOG_LEVEL_ERROR: - level = "Error"; - break; - case LOG_LEVEL_FATAL: - level = "Fatal"; - break; - case LOG_LEVEL_INFO: - level = "Info"; - break; - } - if (sock) - { - printf("%s :: fd %d :: %s: %d %s (%s)\n", - dt, - sock -> GetSocket(), - call.c_str(),err,sys_err.c_str(),level.c_str()); - } - else - { - printf("%s :: %s: %d %s (%s)\n", - dt, - call.c_str(),err,sys_err.c_str(),level.c_str()); - } -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.h deleted file mode 100755 index dc40784864..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StdoutLog.h +++ /dev/null @@ -1,64 +0,0 @@ -/** \file StdoutLog.h - ** \date 2004-06-01 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_StdoutLog_H -#define _SOCKETS_StdoutLog_H - -#include "sockets-config.h" -#include "StdLog.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** StdLog implementation, logs to stdout. - \ingroup logging */ -class StdoutLog : public StdLog -{ -public: - StdoutLog(loglevel_t min_level = LOG_LEVEL_INFO) : m_min_level(min_level) {} - void error(ISocketHandler *,Socket *,const std::string& call,int err,const std::string& sys_err,loglevel_t); - -private: - loglevel_t m_min_level; -}; - - - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_StdoutLog_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.cpp deleted file mode 100755 index 646b1f88b5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/** - ** \file StreamSocket.cpp - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "StreamSocket.h" -#include "ISocketHandler.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -StreamSocket::StreamSocket(ISocketHandler& h) : Socket(h) -,m_bConnecting(false) -,m_connect_timeout(5) -,m_flush_before_close(true) -,m_connection_retry(0) -,m_retries(0) -,m_line_protocol(false) -,m_shutdown(0) -{ -} - - -StreamSocket::~StreamSocket() -{ -} - - -void StreamSocket::SetConnecting(bool x) -{ - if (x != m_bConnecting) - { - m_bConnecting = x; - if (x) - { - SetTimeout( GetConnectTimeout() ); - } - else - { - SetTimeout( 0 ); - } - } -} - - -bool StreamSocket::Connecting() -{ - return m_bConnecting; -} - - -bool StreamSocket::Ready() -{ - if (GetSocket() != INVALID_SOCKET && !Connecting() && !CloseAndDelete()) - return true; - return false; -} - - -void StreamSocket::SetConnectTimeout(int x) -{ - m_connect_timeout = x; -} - - -int StreamSocket::GetConnectTimeout() -{ - return m_connect_timeout; -} - - -void StreamSocket::SetFlushBeforeClose(bool x) -{ - m_flush_before_close = x; -} - - -bool StreamSocket::GetFlushBeforeClose() -{ - return m_flush_before_close; -} - - -int StreamSocket::GetConnectionRetry() -{ - return m_connection_retry; -} - - -void StreamSocket::SetConnectionRetry(int x) -{ - m_connection_retry = x; -} - - -int StreamSocket::GetConnectionRetries() -{ - return m_retries; -} - - -void StreamSocket::IncreaseConnectionRetries() -{ - m_retries++; -} - - -void StreamSocket::ResetConnectionRetries() -{ - m_retries = 0; -} - - -void StreamSocket::SetLineProtocol(bool x) -{ - m_line_protocol = x; -} - - -bool StreamSocket::LineProtocol() -{ - return m_line_protocol; -} - - -void StreamSocket::SetShutdown(int x) -{ - m_shutdown = x; -} - - -int StreamSocket::GetShutdown() -{ - return m_shutdown; -} - - - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.h deleted file mode 100755 index 367b1f1283..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamSocket.h +++ /dev/null @@ -1,142 +0,0 @@ -/** - ** \file StreamSocket.h - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _StreamSocket_H -#define _StreamSocket_H - -#include "Socket.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -/** SOCK_STREAM Socket base class. - \ingroup basic */ -class StreamSocket : public Socket -{ -public: - StreamSocket(ISocketHandler& ); - ~StreamSocket(); - - /** Socket should Check Connect on next write event from select(). */ - void SetConnecting(bool = true); - - /** Check connecting flag. - \return true if the socket is still trying to connect */ - bool Connecting(); - - /** Returns true when socket file descriptor is valid, - socket connection is established, and socket is not about to - be closed. */ - bool Ready(); - - /** Set timeout to use for connection attempt. - \param x Timeout in seconds */ - void SetConnectTimeout(int x); - - /** Return number of seconds to wait for a connection. - \return Connection timeout (seconds) */ - int GetConnectTimeout(); - - /** Set flush before close to make a tcp socket completely empty its - output buffer before closing the connection. */ - void SetFlushBeforeClose(bool = true); - - /** Check flush before status. - \return true if the socket should send all data before closing */ - bool GetFlushBeforeClose(); - - /** Define number of connection retries (tcp only). - n = 0 - no retry - n > 0 - number of retries - n = -1 - unlimited retries */ - void SetConnectionRetry(int n); - - /** Get number of maximum connection retries (tcp only). */ - int GetConnectionRetry(); - - /** Increase number of actual connection retries (tcp only). */ - void IncreaseConnectionRetries(); - - /** Get number of actual connection retries (tcp only). */ - int GetConnectionRetries(); - - /** Reset actual connection retries (tcp only). */ - void ResetConnectionRetries(); - - /** Called after OnRead if socket is in line protocol mode. - \sa SetLineProtocol */ - /** Enable the OnLine callback. Do not create your own OnRead - * callback when using this. */ - virtual void SetLineProtocol(bool = true); - - /** Check line protocol mode. - \return true if socket is in line protocol mode */ - bool LineProtocol(); - - /** Set shutdown status. */ - void SetShutdown(int); - - /** Get shutdown status. */ - int GetShutdown(); - - /** Returns IPPROTO_TCP or IPPROTO_SCTP */ - virtual int Protocol() = 0; - -protected: - StreamSocket(const StreamSocket& ) {} // copy constructor - -private: - StreamSocket& operator=(const StreamSocket& ) { - return *this; // assignment operator - } - - bool m_bConnecting; ///< Flag indicating connection in progress - int m_connect_timeout; ///< Connection timeout (seconds) - bool m_flush_before_close; ///< Send all data before closing (default true) - int m_connection_retry; ///< Maximum connection retries (tcp) - int m_retries; ///< Actual number of connection retries (tcp) - bool m_line_protocol; ///< Line protocol mode flag - int m_shutdown; ///< Shutdown status -}; - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - - -#endif // _StreamSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.cpp deleted file mode 100755 index 6c1bd385ea..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/** - ** \file StreamWriter.cpp - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "StreamWriter.h" -#include "IStream.h" -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -StreamWriter::StreamWriter(IStream& stream) : m_stream(stream) -{ -} - - -StreamWriter& StreamWriter::operator<<(const char *buf) -{ - m_stream.IStreamWrite(buf, strlen(buf)); - return *this; -} - - -StreamWriter& StreamWriter::operator<<(const std::string& str) -{ - m_stream.IStreamWrite(str.c_str(), str.size()); - return *this; -} - - -StreamWriter& StreamWriter::operator<<(short x) -{ - *this << Utility::l2string(x); - return *this; -} - - -StreamWriter& StreamWriter::operator<<(int x) -{ - *this << Utility::l2string(x); - return *this; -} - - -StreamWriter& StreamWriter::operator<<(long x) -{ - *this << Utility::l2string(x); - return *this; -} - - -//StreamWriter& StreamWriter::operator<<(int64_t x) -StreamWriter& StreamWriter::operator<<(long long x) -{ - *this << Utility::bigint2string(x); - return *this; -} - - -StreamWriter& StreamWriter::operator<<(double x) -{ - *this << Utility::ToString(x); - return *this; -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.h deleted file mode 100755 index ad24ada902..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/StreamWriter.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - ** \file StreamWriter.h - ** \date 2008-12-20 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _STREAMWRITER_H -#define _STREAMWRITER_H - -#include "sockets-config.h" -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class IStream; - -class StreamWriter -{ -public: - StreamWriter(IStream& stream); - virtual ~StreamWriter() {} - - StreamWriter& operator<<(const char *); - StreamWriter& operator<<(const std::string&); - StreamWriter& operator<<(short); - StreamWriter& operator<<(int); - StreamWriter& operator<<(long); - StreamWriter& operator<<(long long); - //StreamWriter& operator<<(int64_t); - StreamWriter& operator<<(double); - -private: - IStream& m_stream; - -}; - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _STREAMWRITER_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.cpp deleted file mode 100755 index c6d221529a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.cpp +++ /dev/null @@ -1,1851 +0,0 @@ -/** \file TcpSocket.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#else -#include -#endif -#include "ISocketHandler.h" -#include -#include -#include -#include -#ifdef HAVE_OPENSSL -#include -#include -#endif -#include - -#include "TcpSocket.h" -#include "Utility.h" -#include "Ipv4Address.h" -#include "Ipv6Address.h" -#include "IFile.h" -#include "Lock.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -#ifdef _DEBUG -#define DEB(x) x -#else -#define DEB(x) -#endif - - -// statics -#ifdef HAVE_OPENSSL -SSLInitializer TcpSocket::m_ssl_init; -Mutex TcpSocket::m_server_ssl_mutex; -std::map TcpSocket::m_client_contexts; -std::map TcpSocket::m_server_contexts; -#endif - - -// thanks, q -#ifdef _MSC_VER -#pragma warning(disable:4355) -#endif -TcpSocket::TcpSocket(ISocketHandler& h) : StreamSocket(h) -,ibuf(TCP_BUFSIZE_READ) -,m_b_input_buffer_disabled(false) -,m_bytes_sent(0) -,m_bytes_received(0) -,m_skip_c(false) -,m_line(Handler().MaxTcpLineSize()) -,m_line_ptr(0) -#ifdef SOCKETS_DYNAMIC_TEMP -,m_buf(new char[TCP_BUFSIZE_READ + 1]) -#endif -,m_obuf_top(NULL) -,m_transfer_limit(0) -,m_output_length(0) -,m_repeat_length(0) -#ifdef HAVE_OPENSSL -,m_ssl_ctx(NULL) -,m_ssl(NULL) -,m_sbio(NULL) -#endif -#ifdef ENABLE_SOCKS4 -,m_socks4_state(0) -#endif -#ifdef ENABLE_RESOLVER -,m_resolver_id(0) -#endif -#ifdef ENABLE_RECONNECT -,m_b_reconnect(false) -,m_b_is_reconnect(false) -#endif -{ -} -#ifdef _MSC_VER -#pragma warning(default:4355) -#endif - - -#ifdef _MSC_VER -#pragma warning(disable:4355) -#endif -TcpSocket::TcpSocket(ISocketHandler& h,size_t isize,size_t osize) : StreamSocket(h) -,ibuf(isize) -,m_b_input_buffer_disabled(false) -,m_bytes_sent(0) -,m_bytes_received(0) -,m_skip_c(false) -,m_line(Handler().MaxTcpLineSize()) -,m_line_ptr(0) -#ifdef SOCKETS_DYNAMIC_TEMP -,m_buf(new char[TCP_BUFSIZE_READ + 1]) -#endif -,m_obuf_top(NULL) -,m_transfer_limit(0) -,m_output_length(0) -,m_repeat_length(0) -#ifdef HAVE_OPENSSL -,m_ssl_ctx(NULL) -,m_ssl(NULL) -,m_sbio(NULL) -#endif -#ifdef ENABLE_SOCKS4 -,m_socks4_state(0) -#endif -#ifdef ENABLE_RESOLVER -,m_resolver_id(0) -#endif -#ifdef ENABLE_RECONNECT -,m_b_reconnect(false) -,m_b_is_reconnect(false) -#endif -{ -} -#ifdef _MSC_VER -#pragma warning(default:4355) -#endif - - -TcpSocket::~TcpSocket() -{ -#ifdef SOCKETS_DYNAMIC_TEMP - delete[] m_buf; -#endif - // %! empty m_obuf - while (m_obuf.size()) - { - output_l::iterator it = m_obuf.begin(); - OUTPUT *p = *it; - delete p; - m_obuf.erase(it); - } -#ifdef HAVE_OPENSSL - if (m_ssl) - { - SSL_free(m_ssl); - } -#endif -} - - -bool TcpSocket::Open(ipaddr_t ip,port_t port,bool skip_socks) -{ - Ipv4Address ad(ip, port); - Ipv4Address local; - return Open(ad, local, skip_socks); -} - - -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 -bool TcpSocket::Open(in6_addr ip,port_t port,bool skip_socks) -{ - Ipv6Address ad(ip, port); - return Open(ad, skip_socks); -} -#endif -#endif - - -bool TcpSocket::Open(SocketAddress& ad,bool skip_socks) -{ - Ipv4Address bind_ad("0.0.0.0", 0); - return Open(ad, bind_ad, skip_socks); -} - - -bool TcpSocket::Open(SocketAddress& ad,SocketAddress& bind_ad,bool skip_socks) -{ - if (!ad.IsValid()) - { - Handler().LogError(this, "Open", 0, "Invalid SocketAddress", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - return false; - } - if (Handler().GetCount() >= Handler().MaxCount()) - { - Handler().LogError(this, "Open", 0, "no space left for more sockets", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - return false; - } - SetConnecting(false); -#ifdef ENABLE_SOCKS4 - SetSocks4(false); -#endif - // check for pooling -#ifdef ENABLE_POOL - if (Handler().PoolEnabled()) - { - ISocketHandler::PoolSocket *pools = Handler().FindConnection(SOCK_STREAM, "tcp", ad); - if (pools) - { - CopyConnection( pools ); - delete pools; - - SetIsClient(); - SetCallOnConnect(); // ISocketHandler must call OnConnect - Handler().LogError(this, "SetCallOnConnect", 0, "Found pooled connection", LOG_LEVEL_INFO); - return true; - } - } -#endif - // if not, create new connection - SOCKET s = CreateSocket(ad.GetFamily(), SOCK_STREAM, "tcp"); - if (s == INVALID_SOCKET) - { - return false; - } - // socket must be nonblocking for async connect - if (!SetNonblocking(true, s)) - { - SetCloseAndDelete(); - closesocket(s); - return false; - } -#ifdef ENABLE_POOL - SetIsClient(); // client because we connect -#endif - SetClientRemoteAddress(ad); - int n = 0; - if (bind_ad.GetPort() != 0) - { - bind(s, bind_ad, bind_ad); - } -#ifdef ENABLE_SOCKS4 - if (!skip_socks && GetSocks4Host() && GetSocks4Port()) - { - Ipv4Address sa(GetSocks4Host(), GetSocks4Port()); - { - std::string sockshost; - Utility::l2ip(GetSocks4Host(), sockshost); - Handler().LogError(this, "Open", 0, "Connecting to socks4 server @ " + sockshost + ":" + - Utility::l2string(GetSocks4Port()), LOG_LEVEL_INFO); - } - SetSocks4(); - n = connect(s, sa, sa); - SetRemoteAddress(sa); - } - else -#endif - { - n = connect(s, ad, ad); - SetRemoteAddress(ad); - } - if (n == -1) - { - // check error code that means a connect is in progress -#ifdef _WIN32 - if (Errno == WSAEWOULDBLOCK) -#else - if (Errno == EINPROGRESS) -#endif - { - Attach(s); - SetConnecting( true ); // this flag will control fd_set's - } - else -#ifdef ENABLE_SOCKS4 - if (Socks4() && Handler().Socks4TryDirect() ) // retry - { - closesocket(s); - return Open(ad, true); - } - else -#endif -#ifdef ENABLE_RECONNECT - if (Reconnect()) - { - Handler().LogError(this, "connect: failed, reconnect pending", Errno, StrError(Errno), LOG_LEVEL_INFO); - Attach(s); - SetConnecting( true ); // this flag will control fd_set's - } - else -#endif - { - Handler().LogError(this, "connect: failed", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); - closesocket(s); - return false; - } - } - else - { - Attach(s); - SetCallOnConnect(); // ISocketHandler must call OnConnect - } - - // 'true' means connected or connecting(not yet connected) - // 'false' means something failed - return true; //!Connecting(); -} - - -bool TcpSocket::Open(const std::string &host,port_t port) -{ -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { -#ifdef ENABLE_RESOLVER - if (!Handler().ResolverEnabled() || Utility::isipv6(host) ) - { -#endif - in6_addr a; - if (!Utility::u2ip(host, a)) - { - SetCloseAndDelete(); - return false; - } - Ipv6Address ad(a, port); - Ipv6Address local; - return Open(ad, local); -#ifdef ENABLE_RESOLVER - } - m_resolver_id = Resolve6(host, port); - return true; -#endif - } -#endif -#endif -#ifdef ENABLE_RESOLVER - if (!Handler().ResolverEnabled() || Utility::isipv4(host) ) - { -#endif - ipaddr_t l; - if (!Utility::u2ip(host,l)) - { - SetCloseAndDelete(); - return false; - } - Ipv4Address ad(l, port); - Ipv4Address local; - return Open(ad, local); -#ifdef ENABLE_RESOLVER - } - // resolve using async resolver thread - m_resolver_id = Resolve(host, port); - return true; -#endif -} - - -#ifdef ENABLE_RESOLVER -void TcpSocket::OnResolved(int id,ipaddr_t a,port_t port) -{ -DEB( fprintf(stderr, "TcpSocket::OnResolved id %d addr %x port %d\n", id, a, port);) - if (id == m_resolver_id) - { - if (a && port) - { - Ipv4Address ad(a, port); - Ipv4Address local; - if (Open(ad, local)) - { - if (!Handler().Valid(this)) - { - Handler().Add(this); - } - } - } - else - { - Handler().LogError(this, "OnResolved", 0, "Resolver failed", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - } - else - { - Handler().LogError(this, "OnResolved", id, "Resolver returned wrong job id", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } -} - - -#ifdef ENABLE_IPV6 -void TcpSocket::OnResolved(int id,in6_addr& a,port_t port) -{ - if (id == m_resolver_id) - { - Ipv6Address ad(a, port); - if (ad.IsValid()) - { - Ipv6Address local; - if (Open(ad, local)) - { - if (!Handler().Valid(this)) - { - Handler().Add(this); - } - } - } - } - else - { - Handler().LogError(this, "OnResolved", id, "Resolver returned wrong job id", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } -} -#endif -#endif - - -void TcpSocket::OnRead() -{ - int n = 0; -#ifdef SOCKETS_DYNAMIC_TEMP - char *buf = m_buf; -#else - char buf[TCP_BUFSIZE_READ]; -#endif -#ifdef HAVE_OPENSSL - if (IsSSL()) - { - if (!Ready()) - return; - n = SSL_read(m_ssl, buf, TCP_BUFSIZE_READ); - if (n == -1) - { - n = SSL_get_error(m_ssl, n); - switch (n) - { - case SSL_ERROR_NONE: - case SSL_ERROR_WANT_READ: - case SSL_ERROR_WANT_WRITE: - break; - case SSL_ERROR_ZERO_RETURN: -DEB( fprintf(stderr, "SSL_read() returns zero - closing socket\n");) - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_SSL|TCP_DISCONNECT_ERROR, n); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - break; - default: -DEB( fprintf(stderr, "SSL read problem, errcode = %d\n",n);) - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_SSL|TCP_DISCONNECT_ERROR, n); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - } - return; - } - else - if (!n) - { -DEB( n = SSL_get_error(m_ssl, n); - fprintf(stderr, "SSL_read returns 0, SSL_get_error: %d\n", n); - if (n == SSL_ERROR_SYSCALL) - { - fprintf(stderr, "ERR_get_error() returns %ld\n", ERR_get_error()); - perror("errno: SSL_read"); - }) - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_SSL, 0); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - SetShutdown(SHUT_WR); - return; - } - else - if (n > 0 && n <= TCP_BUFSIZE_READ) - { - m_bytes_received += n; - if (GetTrafficMonitor()) - { - GetTrafficMonitor() -> fwrite(buf, 1, n); - } - if (!m_b_input_buffer_disabled && !ibuf.Write(buf,n)) - { - Handler().LogError(this, "OnRead(ssl)", 0, "ibuf overflow", LOG_LEVEL_WARNING); - } - } - else - { - Handler().LogError(this, "OnRead(ssl)", n, "abnormal value from SSL_read", LOG_LEVEL_ERROR); - } - } - else -#endif // HAVE_OPENSSL - { - n = recv(GetSocket(), buf, TCP_BUFSIZE_READ, MSG_NOSIGNAL); - if (n == -1) - { - Handler().LogError(this, "read", Errno, StrError(Errno), LOG_LEVEL_FATAL); - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_ERROR, Errno); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - return; - } - else - if (!n) - { - OnDisconnect(); - OnDisconnect(0, 0); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - SetShutdown(SHUT_WR); - return; - } - else - if (n > 0 && n <= TCP_BUFSIZE_READ) - { - m_bytes_received += n; - if (GetTrafficMonitor()) - { - GetTrafficMonitor() -> fwrite(buf, 1, n); - } - if (!m_b_input_buffer_disabled && !ibuf.Write(buf,n)) - { - Handler().LogError(this, "OnRead", 0, "ibuf overflow", LOG_LEVEL_WARNING); - } - } - else - { - Handler().LogError(this, "OnRead", n, "abnormal value from recv", LOG_LEVEL_ERROR); - } - } - // - OnRead( buf, n ); -} - - -void TcpSocket::OnRead( char *buf, size_t n ) -{ - // unbuffered - if (n > 0 && n <= TCP_BUFSIZE_READ) - { - if (LineProtocol()) - { - buf[n] = 0; - size_t i = 0; - if (m_skip_c && (buf[i] == 13 || buf[i] == 10) && buf[i] != m_c) - { - m_skip_c = false; - i++; - } - size_t x = i; - for (; i < n && LineProtocol(); i++) - { - while ((buf[i] == 13 || buf[i] == 10) && LineProtocol()) - { - char c = buf[i]; - buf[i] = 0; - if (buf[x]) - { - size_t sz = strlen(&buf[x]); - if (m_line_ptr + sz < Handler().MaxTcpLineSize()) - { - memcpy(&m_line[m_line_ptr], &buf[x], sz); - m_line_ptr += sz; - } - else - { - Handler().LogError(this, "TcpSocket::OnRead", (int)(m_line_ptr + sz), "maximum tcp_line_size exceeded, connection closed", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - } - if (m_line_ptr > 0) - OnLine( std::string(&m_line[0], m_line_ptr) ); - else - OnLine( "" ); - i++; - m_skip_c = true; - m_c = c; - if (i < n && (buf[i] == 13 || buf[i] == 10) && buf[i] != c) - { - m_skip_c = false; - i++; - } - x = i; - m_line_ptr = 0; - } - if (!LineProtocol()) - { - break; - } - } - if (!LineProtocol()) - { - if (i < n) - { - OnRawData(buf + i, n - i); - } - } - else - if (buf[x]) - { - size_t sz = strlen(&buf[x]); - if (m_line_ptr + sz < Handler().MaxTcpLineSize()) - { - memcpy(&m_line[m_line_ptr], &buf[x], sz); - m_line_ptr += sz; - } - else - { - Handler().LogError(this, "TcpSocket::OnRead", (int)(m_line_ptr + sz), "maximum tcp_line_size exceeded, connection closed", LOG_LEVEL_FATAL); - SetCloseAndDelete(); - } - } - } - else - { - OnRawData(buf, n); - } - } - if (m_b_input_buffer_disabled) - { - return; - } - // further processing: socks4 -#ifdef ENABLE_SOCKS4 - if (Socks4()) - { - bool need_more = false; - while (GetInputLength() && !need_more && !CloseAndDelete()) - { - need_more = OnSocks4Read(); - } - } -#endif -} - - -void TcpSocket::OnWriteComplete() -{ -} - - -void TcpSocket::OnWrite() -{ - if (Connecting()) - { - int err = SoError(); - - // don't reset connecting flag on error here, we want the OnConnectFailed timeout later on - if (!err) // ok - { - Handler().ISocketHandler_Mod(this, !IsDisableRead(), false); - SetConnecting(false); - SetCallOnConnect(); - return; - } - Handler().LogError(this, "tcp: connect failed", err, StrError(err), LOG_LEVEL_FATAL); - Handler().ISocketHandler_Mod(this, false, false); // no more monitoring because connection failed - - // failed -#ifdef ENABLE_SOCKS4 - if (Socks4()) - { - // %! leave 'Connecting' flag set? - OnSocks4ConnectFailed(); - return; - } -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && GetConnectionRetries() < GetConnectionRetry()) ) - { - // even though the connection failed at once, only retry after - // the connection timeout. - // should we even try to connect again, when CheckConnect returns - // false it's because of a connection error - not a timeout... - return; - } - SetConnecting(false); - SetCloseAndDelete( true ); - /// \todo state reason why connect failed - OnConnectFailed(); - return; - } - - SendFromOutputBuffer(); -} - - -void TcpSocket::SendFromOutputBuffer() -{ - // try send next block in buffer - // if full block is sent, repeat - // if all blocks are sent, reset m_wfds - - bool repeat = false; - size_t sz = m_transfer_limit ? GetOutputLength() : 0; - do - { - if (m_obuf.empty()) - { - Handler().LogError(this, "OnWrite", (int)m_output_length, "Empty output buffer in OnWrite", LOG_LEVEL_ERROR); - break; - } - output_l::iterator it = m_obuf.begin(); - OUTPUT *p = *it; - repeat = false; - int n = TryWrite(p -> Buf(), p -> Len()); - if (n > 0) - { - size_t left = p -> Remove(n); - m_output_length -= n; - if (!left) - { - delete p; - m_obuf.erase(it); - if (!m_obuf.size()) - { - m_obuf_top = NULL; - OnWriteComplete(); - } - else - { - repeat = true; - } - } - } - } while (repeat); - - if (m_transfer_limit && sz > m_transfer_limit && GetOutputLength() < m_transfer_limit) - { - OnTransferLimit(); - } - - // check output buffer set, set/reset m_wfds accordingly - { - bool br = !IsDisableRead(); - if (m_obuf.size()) - Handler().ISocketHandler_Mod(this, br, true); - else - Handler().ISocketHandler_Mod(this, br, false); - } -} - - -int TcpSocket::TryWrite(const char *buf, size_t len) -{ - int n = 0; -#ifdef HAVE_OPENSSL - if (IsSSL()) - { - n = SSL_write(m_ssl, buf, (int)(m_repeat_length ? m_repeat_length : len)); - if (n == -1) - { - int errnr = SSL_get_error(m_ssl, n); - if ( errnr == SSL_ERROR_WANT_READ || errnr == SSL_ERROR_WANT_WRITE ) - { - m_repeat_length = m_repeat_length ? m_repeat_length : len; - } - else - { - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_WRITE|TCP_DISCONNECT_ERROR|TCP_DISCONNECT_SSL, errnr); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - { - char errbuf[256]; - ERR_error_string_n(errnr, errbuf, 256); - Handler().LogError(this, "OnWrite/SSL_write", errnr, errbuf, LOG_LEVEL_FATAL); - } - } - return 0; - } - else - if (!n) - { - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_WRITE|TCP_DISCONNECT_SSL, 0); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - } - m_repeat_length = 0; - } - else -#endif // HAVE_OPENSSL - { - n = send(GetSocket(), buf, (int)len, MSG_NOSIGNAL); - if (n == -1) - { - // normal error codes: - // WSAEWOULDBLOCK - // EAGAIN or EWOULDBLOCK -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - { - Handler().LogError(this, "send", Errno, StrError(Errno), LOG_LEVEL_FATAL); - OnDisconnect(); - OnDisconnect(TCP_DISCONNECT_WRITE|TCP_DISCONNECT_ERROR, Errno); - SetCloseAndDelete(true); - SetFlushBeforeClose(false); - SetLost(); - } - return 0; - } - } - if (n > 0) - { - m_bytes_sent += n; - if (GetTrafficMonitor()) - { - GetTrafficMonitor() -> fwrite(buf, 1, n); - } - } - return n; -} - - -void TcpSocket::Buffer(const char *buf, size_t len) -{ - size_t ptr = 0; - m_output_length += len; - while (ptr < len) - { - // buf/len => pbuf/sz - size_t space = 0; - if ((space = m_obuf_top ? m_obuf_top -> Space() : 0) > 0) - { - const char *pbuf = buf + ptr; - size_t sz = len - ptr; - if (space >= sz) - { - m_obuf_top -> Add(pbuf, sz); - ptr += sz; - } - else - { - m_obuf_top -> Add(pbuf, space); - ptr += space; - } - } - else - { - m_obuf_top = new OUTPUT; - m_obuf.push_back( m_obuf_top ); - } - } -} - - -void TcpSocket::Send(const std::string &str,int i) -{ - SendBuf(str.c_str(),str.size(),i); -} - - -void TcpSocket::SendBuf(const char *buf,size_t len,int) -{ - if (!Ready() && !Connecting()) - { - Handler().LogError(this, "SendBuf", -1, "Attempt to write to a non-ready socket" ); // warning - if (GetSocket() == INVALID_SOCKET) - Handler().LogError(this, "SendBuf", 0, " * GetSocket() == INVALID_SOCKET", LOG_LEVEL_INFO); - if (Connecting()) - Handler().LogError(this, "SendBuf", 0, " * Connecting()", LOG_LEVEL_INFO); - if (CloseAndDelete()) - Handler().LogError(this, "SendBuf", 0, " * CloseAndDelete()", LOG_LEVEL_INFO); - return; - } - if (!IsConnected()) - { - Handler().LogError(this, "SendBuf", -1, "Attempt to write to a non-connected socket, will be sent on connect" ); // warning - Buffer(buf, len); - return; - } - if (m_obuf_top) - { - Buffer(buf, len); - return; - } -#ifdef HAVE_OPENSSL - if (IsSSL()) - { - Buffer(buf, len); - SendFromOutputBuffer(); - return; - } -#endif - int n = TryWrite(buf, len); - if (n >= 0 && n < (int)len) - { - Buffer(buf + n, len - n); - } - // if ( data in buffer || !IsConnected ) - // { - // add to buffer - // } - // else - // try_send - // if any data is unsent, buffer it and set m_wfds - - // check output buffer set, set/reset m_wfds accordingly - { - bool br = !IsDisableRead(); - if (m_obuf.size()) - Handler().ISocketHandler_Mod(this, br, true); - else - Handler().ISocketHandler_Mod(this, br, false); - } -} - - -void TcpSocket::OnLine(const std::string& ) -{ -} - - -#ifdef _MSC_VER -#pragma warning(disable:4355) -#endif -TcpSocket::TcpSocket(const TcpSocket& s) -:StreamSocket(s) -,ibuf(0) -{ -} -#ifdef _MSC_VER -#pragma warning(default:4355) -#endif - - -#ifdef ENABLE_SOCKS4 -void TcpSocket::OnSocks4Connect() -{ - char request[1000]; - memset(request, 0, sizeof(request)); - request[0] = 4; // socks v4 - request[1] = 1; // command code: CONNECT - { - std::auto_ptr ad = GetClientRemoteAddress(); - if (ad.get()) - { - struct sockaddr *p0 = (struct sockaddr *)*ad; - struct sockaddr_in *p = (struct sockaddr_in *)p0; - if (p -> sin_family == AF_INET) - { - memcpy(request + 2, &p -> sin_port, 2); // nwbo is ok here - memcpy(request + 4, &p -> sin_addr, sizeof(struct in_addr)); - } - else - { - /// \todo warn - } - } - else - { - /// \todo warn - } - } -#if defined( _WIN32) && !defined(__CYGWIN__) - strcpy_s(request + 8, sizeof(request) - 8, GetSocks4Userid().c_str()); -#else - strcpy(request + 8, GetSocks4Userid().c_str()); -#endif - size_t length = GetSocks4Userid().size() + 8 + 1; - SendBuf(request, length); - m_socks4_state = 0; -} - - -void TcpSocket::OnSocks4ConnectFailed() -{ - Handler().LogError(this,"OnSocks4ConnectFailed",0,"connection to socks4 server failed, trying direct connection",LOG_LEVEL_WARNING); - if (!Handler().Socks4TryDirect()) - { - SetConnecting(false); - SetCloseAndDelete(); - OnConnectFailed(); // just in case - } - else - { - SetRetryClientConnect(); - } -} - - -bool TcpSocket::OnSocks4Read() -{ - switch (m_socks4_state) - { - case 0: - ibuf.Read(&m_socks4_vn, 1); - m_socks4_state = 1; - break; - case 1: - ibuf.Read(&m_socks4_cd, 1); - m_socks4_state = 2; - break; - case 2: - if (GetInputLength() > 1) - { - ibuf.Read( (char *)&m_socks4_dstport, 2); - m_socks4_state = 3; - } - else - { - return true; - } - break; - case 3: - if (GetInputLength() > 3) - { - ibuf.Read( (char *)&m_socks4_dstip, 4); - SetSocks4(false); - - switch (m_socks4_cd) - { - case 90: - OnConnect(); - Handler().LogError(this, "OnSocks4Read", 0, "Connection established", LOG_LEVEL_INFO); - break; - case 91: - case 92: - case 93: - Handler().LogError(this,"OnSocks4Read",m_socks4_cd,"socks4 server reports connect failed",LOG_LEVEL_FATAL); - SetConnecting(false); - SetCloseAndDelete(); - OnConnectFailed(); - break; - default: - Handler().LogError(this,"OnSocks4Read",m_socks4_cd,"socks4 server unrecognized response",LOG_LEVEL_FATAL); - SetCloseAndDelete(); - break; - } - } - else - { - return true; - } - break; - } - return false; -} -#endif - - -void TcpSocket::Sendf(const char *format, ...) -{ - va_list ap; - va_start(ap, format); - char slask[5000]; // vsprintf / vsnprintf temporary - vsnprintf(slask, sizeof(slask), format, ap); - va_end(ap); - Send( slask ); -} - - -#ifdef HAVE_OPENSSL -void TcpSocket::OnSSLConnect() -{ - SetNonblocking(true); - { - if (m_ssl_ctx) - { -DEB( fprintf(stderr, "SSL Context already initialized - closing socket\n");) - SetCloseAndDelete(true); - return; - } - InitSSLClient(); - } - if (m_ssl_ctx) - { - /* Connect the SSL socket */ - m_ssl = SSL_new(m_ssl_ctx); - if (!m_ssl) - { -DEB( fprintf(stderr, " m_ssl is NULL\n");) - SetCloseAndDelete(true); - return; - } - m_sbio = BIO_new_socket((int)GetSocket(), BIO_NOCLOSE); - if (!m_sbio) - { -DEB( fprintf(stderr, " m_sbio is NULL\n");) - SetCloseAndDelete(true); - return; - } - SSL_set_bio(m_ssl, m_sbio, m_sbio); - if (!SSLNegotiate()) - { - SetSSLNegotiate(); - } - } - else - { - SetCloseAndDelete(); - } -} - - -void TcpSocket::OnSSLAccept() -{ - SetNonblocking(true); - { - if (m_ssl_ctx) - { -DEB( fprintf(stderr, "SSL Context already initialized - closing socket\n");) - SetCloseAndDelete(true); - return; - } - InitSSLServer(); - SetSSLServer(); - } - if (m_ssl_ctx) - { - m_ssl = SSL_new(m_ssl_ctx); - if (!m_ssl) - { -DEB( fprintf(stderr, " m_ssl is NULL\n");) - SetCloseAndDelete(true); - return; - } - m_sbio = BIO_new_socket((int)GetSocket(), BIO_NOCLOSE); - if (!m_sbio) - { -DEB( fprintf(stderr, " m_sbio is NULL\n");) - SetCloseAndDelete(true); - return; - } - SSL_set_bio(m_ssl, m_sbio, m_sbio); -// if (!SSLNegotiate()) - { - SetSSLNegotiate(); - } - } -} - - -bool TcpSocket::SSLNegotiate() -{ - if (!IsSSLServer()) // client - { - int r = SSL_connect(m_ssl); - if (r > 0) - { - SetSSLNegotiate(false); - /// \todo: resurrect certificate check... client -// CheckCertificateChain( "");//ServerHOST); - SetConnected(); - if (GetOutputLength()) - { - OnWrite(); - } -#ifdef ENABLE_RECONNECT - if (IsReconnect()) - { - OnReconnect(); - } - else -#endif - { - OnConnect(); - } - Handler().LogError(this, "SSLNegotiate/SSL_connect", 0, "Connection established", LOG_LEVEL_INFO); - return true; - } - else - if (!r) - { - Handler().LogError(this, "SSLNegotiate/SSL_connect", 0, "Connection failed", LOG_LEVEL_INFO); - SetSSLNegotiate(false); - SetCloseAndDelete(); - OnSSLConnectFailed(); - } - else - { - r = SSL_get_error(m_ssl, r); - if (r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) - { - Handler().LogError(this, "SSLNegotiate/SSL_connect", -1, "Connection failed", LOG_LEVEL_INFO); -DEB( fprintf(stderr, "SSL_connect() failed - closing socket, return code: %d\n",r);) - SetSSLNegotiate(false); - SetCloseAndDelete(true); - OnSSLConnectFailed(); - } - } - } - else // server - { - int r = SSL_accept(m_ssl); - if (r > 0) - { - SetSSLNegotiate(false); - /// \todo: resurrect certificate check... server -// CheckCertificateChain( "");//ClientHOST); - SetConnected(); - if (GetOutputLength()) - { - OnWrite(); - } - OnAccept(); - Handler().LogError(this, "SSLNegotiate/SSL_accept", 0, "Connection established", LOG_LEVEL_INFO); - return true; - } - else - if (!r) - { - Handler().LogError(this, "SSLNegotiate/SSL_accept", 0, "Connection failed", LOG_LEVEL_INFO); - SetSSLNegotiate(false); - SetCloseAndDelete(); - OnSSLAcceptFailed(); - } - else - { - r = SSL_get_error(m_ssl, r); - if (r != SSL_ERROR_WANT_READ && r != SSL_ERROR_WANT_WRITE) - { - Handler().LogError(this, "SSLNegotiate/SSL_accept", -1, "Connection failed", LOG_LEVEL_INFO); -DEB( fprintf(stderr, "SSL_accept() failed - closing socket, return code: %d\n",r);) - SetSSLNegotiate(false); - SetCloseAndDelete(true); - OnSSLAcceptFailed(); - } - } - } - return false; -} - - -void TcpSocket::InitSSLClient() -{ - InitializeContext("", SSLv23_method()); -} - - -void TcpSocket::InitSSLServer() -{ - Handler().LogError(this, "InitSSLServer", 0, "You MUST implement your own InitSSLServer method", LOG_LEVEL_FATAL); - SetCloseAndDelete(); -} - - -void TcpSocket::InitializeContext(const std::string& context, const SSL_METHOD *meth_in) -{ - static Mutex mutex; - Lock lock(mutex); - /* Create our context*/ - if (m_client_contexts.find(context) == m_client_contexts.end()) - { - SSL_METHOD *meth = const_cast(meth_in) ? - const_cast(meth_in) : const_cast(SSLv3_method()); - m_ssl_ctx = m_client_contexts[context] = SSL_CTX_new(meth); - SSL_CTX_set_mode(m_ssl_ctx, SSL_MODE_AUTO_RETRY|SSL_MODE_ENABLE_PARTIAL_WRITE); - } - else - { - m_ssl_ctx = m_client_contexts[context]; - } -} - - -void TcpSocket::InitializeContext(const std::string& context,const std::string& keyfile,const std::string& password,const SSL_METHOD *meth_in) -{ - Lock lock(m_server_ssl_mutex); - /* Create our context*/ - if (m_server_contexts.find(context) == m_server_contexts.end()) - { - SSL_METHOD *meth = meth_in ? const_cast(meth_in) : SSLv3_method(); - m_ssl_ctx = m_server_contexts[context] = SSL_CTX_new(meth); - SSL_CTX_set_mode(m_ssl_ctx, SSL_MODE_AUTO_RETRY|SSL_MODE_ENABLE_PARTIAL_WRITE); - // session id - if (context.size()) - SSL_CTX_set_session_id_context(m_ssl_ctx, (const unsigned char *)context.c_str(), (unsigned int)context.size()); - else - SSL_CTX_set_session_id_context(m_ssl_ctx, (const unsigned char *)"--empty--", 9); - } - else - { - m_ssl_ctx = m_server_contexts[context]; - } - - /* Load our keys and certificates*/ - if (!(SSL_CTX_use_certificate_file(m_ssl_ctx, keyfile.c_str(), SSL_FILETYPE_PEM))) - { - Handler().LogError(this, "TcpSocket InitializeContext", 0, "Couldn't read certificate file " + keyfile, LOG_LEVEL_FATAL); - } - - m_password = password; - SSL_CTX_set_default_passwd_cb(m_ssl_ctx, SSL_password_cb); - SSL_CTX_set_default_passwd_cb_userdata(m_ssl_ctx, this); - if (!(SSL_CTX_use_PrivateKey_file(m_ssl_ctx, keyfile.c_str(), SSL_FILETYPE_PEM))) - { - Handler().LogError(this, "TcpSocket InitializeContext", 0, "Couldn't read private key file " + keyfile, LOG_LEVEL_FATAL); - } -} - - -void TcpSocket::InitializeContext(const std::string& context,const std::string& certfile,const std::string& keyfile,const std::string& password,const SSL_METHOD *meth_in) -{ - Lock lock(m_server_ssl_mutex); - /* Create our context*/ - if (m_server_contexts.find(context) == m_server_contexts.end()) - { - SSL_METHOD *meth = meth_in ? const_cast(meth_in) : SSLv3_method(); - m_ssl_ctx = m_server_contexts[context] = SSL_CTX_new(meth); - SSL_CTX_set_mode(m_ssl_ctx, SSL_MODE_AUTO_RETRY|SSL_MODE_ENABLE_PARTIAL_WRITE); - // session id - if (context.size()) - SSL_CTX_set_session_id_context(m_ssl_ctx, (const unsigned char *)context.c_str(), (unsigned int)context.size()); - else - SSL_CTX_set_session_id_context(m_ssl_ctx, (const unsigned char *)"--empty--", 9); - } - else - { - m_ssl_ctx = m_server_contexts[context]; - } - - /* Load our keys and certificates*/ - if (!(SSL_CTX_use_certificate_file(m_ssl_ctx, certfile.c_str(), SSL_FILETYPE_PEM))) - { - Handler().LogError(this, "TcpSocket InitializeContext", 0, "Couldn't read certificate file " + keyfile, LOG_LEVEL_FATAL); - } - - m_password = password; - SSL_CTX_set_default_passwd_cb(m_ssl_ctx, SSL_password_cb); - SSL_CTX_set_default_passwd_cb_userdata(m_ssl_ctx, this); - if (!(SSL_CTX_use_PrivateKey_file(m_ssl_ctx, keyfile.c_str(), SSL_FILETYPE_PEM))) - { - Handler().LogError(this, "TcpSocket InitializeContext", 0, "Couldn't read private key file " + keyfile, LOG_LEVEL_FATAL); - } -} - - -int TcpSocket::SSL_password_cb(char *buf,int num,int rwflag,void *userdata) -{ - Socket *p0 = static_cast(userdata); - TcpSocket *p = dynamic_cast(p0); - std::string pw = p ? p -> GetPassword() : ""; - if ( (size_t)num < pw.size() + 1) - { - return 0; - } -#if defined( _WIN32) && !defined(__CYGWIN__) - strcpy_s(buf, num, pw.c_str()); -#else - strcpy(buf,pw.c_str()); -#endif - return (int)pw.size(); -} -#endif // HAVE_OPENSSL - - -int TcpSocket::Close() -{ - if (GetSocket() == INVALID_SOCKET) // this could happen - { - Handler().LogError(this, "Socket::Close", 0, "file descriptor invalid", LOG_LEVEL_WARNING); - return 0; - } - int n; - SetNonblocking(true); - if (!Lost() && IsConnected() && !(GetShutdown() & SHUT_WR)) - { - if (shutdown(GetSocket(), SHUT_WR) == -1) - { - // failed... - Handler().LogError(this, "shutdown", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - } - // - char tmp[1000]; - if (!Lost() && (n = recv(GetSocket(),tmp,1000,0)) >= 0) - { - if (n) - { - Handler().LogError(this, "read() after shutdown", n, "bytes read", LOG_LEVEL_WARNING); - } - } -#ifdef HAVE_OPENSSL - if (IsSSL() && m_ssl) - SSL_shutdown(m_ssl); - if (m_ssl) - { - SSL_free(m_ssl); - m_ssl = NULL; - } -#endif - return Socket::Close(); -} - - -#ifdef HAVE_OPENSSL -SSL_CTX *TcpSocket::GetSslContext() -{ - if (!m_ssl_ctx) - Handler().LogError(this, "GetSslContext", 0, "SSL Context is NULL; check InitSSLServer/InitSSLClient", LOG_LEVEL_WARNING); - return m_ssl_ctx; -} - -SSL *TcpSocket::GetSsl() -{ - if (!m_ssl) - Handler().LogError(this, "GetSsl", 0, "SSL is NULL; check InitSSLServer/InitSSLClient", LOG_LEVEL_WARNING); - return m_ssl; -} -#endif - - -#ifdef ENABLE_RECONNECT -void TcpSocket::SetReconnect(bool x) -{ - m_b_reconnect = x; -} -#endif - - -void TcpSocket::OnRawData(const char *buf_in,size_t len) -{ -} - - -size_t TcpSocket::GetInputLength() -{ - return ibuf.GetLength(); -} - - -size_t TcpSocket::ReadInput(char *buf, size_t max_sz) -{ - size_t sz = max_sz < GetInputLength() ? max_sz : GetInputLength(); - ibuf.Read(buf, sz); - return sz; -} - - -size_t TcpSocket::GetOutputLength() -{ - return m_output_length; -} - - -uint64_t TcpSocket::GetBytesReceived(bool clear) -{ - uint64_t z = m_bytes_received; - if (clear) - m_bytes_received = 0; - return z; -} - - -uint64_t TcpSocket::GetBytesSent(bool clear) -{ - uint64_t z = m_bytes_sent; - if (clear) - m_bytes_sent = 0; - return z; -} - - -#ifdef ENABLE_RECONNECT -bool TcpSocket::Reconnect() -{ - return m_b_reconnect; -} - - -void TcpSocket::SetIsReconnect(bool x) -{ - m_b_is_reconnect = x; -} - - -bool TcpSocket::IsReconnect() -{ - return m_b_is_reconnect; -} -#endif - - -#ifdef HAVE_OPENSSL -const std::string& TcpSocket::GetPassword() -{ - return m_password; -} -#endif - - -void TcpSocket::DisableInputBuffer(bool x) -{ - m_b_input_buffer_disabled = x; -} - - -void TcpSocket::OnOptions(int family,int type,int protocol,SOCKET s) -{ -DEB( fprintf(stderr, "Socket::OnOptions()\n");) -#ifdef SO_NOSIGPIPE - SetSoNosigpipe(true); -#endif - SetSoReuseaddr(true); - SetSoKeepalive(true); -} - - -void TcpSocket::SetLineProtocol(bool x) -{ - StreamSocket::SetLineProtocol(x); - DisableInputBuffer(x); -} - - -const std::string TcpSocket::GetLine() const -{ - if (!m_line_ptr) - return ""; - return std::string(&m_line[0], m_line_ptr); -} - - -bool TcpSocket::SetTcpNodelay(bool x) -{ -#ifdef TCP_NODELAY - int optval = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_TCP, TCP_NODELAY, (char *)&optval, sizeof(optval)) == -1) - { - Handler().LogError(this, "setsockopt(IPPROTO_TCP, TCP_NODELAY)", Errno, StrError(Errno), LOG_LEVEL_FATAL); - return false; - } - return true; -#else - Handler().LogError(this, "socket option not available", 0, "TCP_NODELAY", LOG_LEVEL_INFO); - return false; -#endif -} - - -TcpSocket::CircularBuffer::CircularBuffer(size_t size) -:buf(new char[2 * size]) -,m_max(size) -,m_q(0) -,m_b(0) -,m_t(0) -,m_count(0) -{ -} - - -TcpSocket::CircularBuffer::~CircularBuffer() -{ - delete[] buf; -} - - -bool TcpSocket::CircularBuffer::Write(const char *s,size_t l) -{ - if (m_q + l > m_max) - { - return false; // overflow - } - m_count += (unsigned long)l; - if (m_t + l > m_max) // block crosses circular border - { - size_t l1 = m_max - m_t; // size left until circular border crossing - // always copy full block to buffer(buf) + top pointer(m_t) - // because we have doubled the buffer size for performance reasons - memcpy(buf + m_t, s, l); - memcpy(buf, s + l1, l - l1); - m_t = l - l1; - m_q += l; - } - else - { - memcpy(buf + m_t, s, l); - memcpy(buf + m_max + m_t, s, l); - m_t += l; - if (m_t >= m_max) - m_t -= m_max; - m_q += l; - } - return true; -} - - -bool TcpSocket::CircularBuffer::Read(char *s,size_t l) -{ - if (l > m_q) - { - return false; // not enough chars - } - if (m_b + l > m_max) // block crosses circular border - { - size_t l1 = m_max - m_b; - if (s) - { - memcpy(s, buf + m_b, l1); - memcpy(s + l1, buf, l - l1); - } - m_b = l - l1; - m_q -= l; - } - else - { - if (s) - { - memcpy(s, buf + m_b, l); - } - m_b += l; - if (m_b >= m_max) - m_b -= m_max; - m_q -= l; - } - if (!m_q) - { - m_b = m_t = 0; - } - return true; -} - - -bool TcpSocket::CircularBuffer::Remove(size_t l) -{ - return Read(NULL, l); -} - - -size_t TcpSocket::CircularBuffer::GetLength() -{ - return m_q; -} - - -const char *TcpSocket::CircularBuffer::GetStart() -{ - return buf + m_b; -} - - -size_t TcpSocket::CircularBuffer::GetL() -{ - return (m_b + m_q > m_max) ? m_max - m_b : m_q; -} - - -size_t TcpSocket::CircularBuffer::Space() -{ - return m_max - m_q; -} - - -unsigned long TcpSocket::CircularBuffer::ByteCounter(bool clear) -{ - if (clear) - { - unsigned long x = m_count; - m_count = 0; - return x; - } - return m_count; -} - - -std::string TcpSocket::CircularBuffer::ReadString(size_t l) -{ - char *sz = new char[l + 1]; - if (!Read(sz, l)) // failed, debug printout in Read() method - { - delete[] sz; - return ""; - } - sz[l] = 0; - std::string tmp = sz; - delete[] sz; - return tmp; -} - - -void TcpSocket::OnConnectTimeout() -{ - Handler().LogError(this, "connect", -1, "connect timeout", LOG_LEVEL_FATAL); -#ifdef ENABLE_SOCKS4 - if (Socks4()) - { - OnSocks4ConnectFailed(); - // retry direct connection - } - else -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && GetConnectionRetries() < GetConnectionRetry()) ) - { - IncreaseConnectionRetries(); - // ask socket via OnConnectRetry callback if we should continue trying - if (OnConnectRetry()) - { - SetRetryClientConnect(); - } - else - { - SetCloseAndDelete( true ); - /// \todo state reason why connect failed - OnConnectFailed(); - // - SetConnecting(false); - } - } - else - { - SetCloseAndDelete(true); - /// \todo state reason why connect failed - OnConnectFailed(); - // - SetConnecting(false); - } -} - - -#ifdef _WIN32 -void TcpSocket::OnException() -{ - if (Connecting()) - { -#ifdef ENABLE_SOCKS4 - if (Socks4()) - OnSocks4ConnectFailed(); - else -#endif - if (GetConnectionRetry() == -1 || - (GetConnectionRetry() && - GetConnectionRetries() < GetConnectionRetry() )) - { - // even though the connection failed at once, only retry after - // the connection timeout - // should we even try to connect again, when CheckConnect returns - // false it's because of a connection error - not a timeout... - } - else - { - SetConnecting(false); // tnx snibbe - SetCloseAndDelete(); - OnConnectFailed(); - } - return; - } - // %! exception doesn't always mean something bad happened, this code should be reworked - // errno valid here? - int err = SoError(); - Handler().LogError(this, "exception on select", err, StrError(err), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -} -#endif // _WIN32 - - -int TcpSocket::Protocol() -{ - return IPPROTO_TCP; -} - - -void TcpSocket::SetTransferLimit(size_t sz) -{ - m_transfer_limit = sz; -} - - -void TcpSocket::OnTransferLimit() -{ -} - - -TcpSocket::OUTPUT::OUTPUT() : _b(0), _t(0), _q(0) -{ -} - - -TcpSocket::OUTPUT::OUTPUT(const char *buf, size_t len) : _b(0), _t(len), _q(len) -{ - memcpy(_buf, buf, len); -} - - -size_t TcpSocket::OUTPUT::Space() -{ - return TCP_OUTPUT_CAPACITY - _t; -} - - -void TcpSocket::OUTPUT::Add(const char *buf, size_t len) -{ - memcpy(_buf + _t, buf, len); - _t += len; - _q += len; -} - - -size_t TcpSocket::OUTPUT::Remove(size_t len) -{ - _b += len; - _q -= len; - return _q; -} - - -const char *TcpSocket::OUTPUT::Buf() -{ - return _buf + _b; -} - - -size_t TcpSocket::OUTPUT::Len() -{ - return _q; -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.h deleted file mode 100755 index 426b5b658a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/TcpSocket.h +++ /dev/null @@ -1,370 +0,0 @@ -/** \file TcpSocket.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_TcpSocket_H -#define _SOCKETS_TcpSocket_H -#include "sockets-config.h" -#include "StreamSocket.h" -#ifdef HAVE_OPENSSL -#include -#include "SSLInitializer.h" -#endif -#include "Mutex.h" -#include - - -#define TCP_BUFSIZE_READ 16400 -#define TCP_OUTPUT_CAPACITY 1024000 - -// flags used in OnDisconnect callback -#define TCP_DISCONNECT_WRITE 1 -#define TCP_DISCONNECT_ERROR 2 -#define TCP_DISCONNECT_SSL 4 - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -class SocketAddress; - - -/** Socket implementation for TCP. - \ingroup basic */ -class TcpSocket : public StreamSocket -{ - /** \defgroup internal Internal utility */ -protected: - /** Buffer class containing one read/write circular buffer. - \ingroup internal */ - class CircularBuffer - { - public: - CircularBuffer(size_t size); - ~CircularBuffer(); - - /** append l bytes from p to buffer */ - bool Write(const char *p,size_t l); - /** copy l bytes from buffer to dest */ - bool Read(char *dest,size_t l); - /** skip l bytes from buffer */ - bool Remove(size_t l); - /** read l bytes from buffer, returns as string. */ - std::string ReadString(size_t l); - - /** total buffer length */ - size_t GetLength(); - /** pointer to circular buffer beginning */ - const char *GetStart(); - /** return number of bytes from circular buffer beginning to buffer physical end */ - size_t GetL(); - /** return free space in buffer, number of bytes until buffer overrun */ - size_t Space(); - - /** return total number of bytes written to this buffer, ever */ - unsigned long ByteCounter(bool clear = false); - - private: - CircularBuffer(const CircularBuffer& s) {} - CircularBuffer& operator=(const CircularBuffer& ) { - return *this; - } - char *buf; - size_t m_max; - size_t m_q; - size_t m_b; - size_t m_t; - unsigned long m_count; - }; - /** Output buffer struct. - \ingroup internal */ - struct OUTPUT { - OUTPUT(); - OUTPUT(const char *buf, size_t len); - size_t Space(); - void Add(const char *buf, size_t len); - size_t Remove(size_t len); - const char *Buf(); - size_t Len(); - - size_t _b; - size_t _t; - size_t _q; - char _buf[TCP_OUTPUT_CAPACITY]; - }; - typedef std::list output_l; - -public: - /** Constructor with standard values on input/output buffers. */ - TcpSocket(ISocketHandler& ); - /** Constructor with custom values for i/o buffer. - \param h ISocketHandler reference - \param isize Input buffer size - \param osize Output buffer size */ - TcpSocket(ISocketHandler& h,size_t isize,size_t osize); - ~TcpSocket(); - - /** Open a connection to a remote server. - If you want your socket to connect to a server, - always call Open before Add'ing a socket to the sockethandler. - If not, the connection attempt will not be monitored by the - socket handler... - \param ip IP address - \param port Port number - \param skip_socks Do not use socks4 even if configured */ - bool Open(ipaddr_t ip,port_t port,bool skip_socks = false); -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 - /** Open connection. - \param ip Ipv6 address - \param port Port number - \param skip_socks Do not use socks4 even if configured */ - bool Open(in6_addr ip,port_t port,bool skip_socks = false); -#endif -#endif - bool Open(SocketAddress&,bool skip_socks = false); - bool Open(SocketAddress&,SocketAddress& bind_address,bool skip_socks = false); - /** Open connection. - \param host Hostname - \param port Port number */ - bool Open(const std::string &host,port_t port); - - /** Connect timeout callback. */ - void OnConnectTimeout(); -#ifdef _WIN32 - /** Connection failed reported as exception on win32 */ - void OnException(); -#endif - - /** Close file descriptor - internal use only. - \sa SetCloseAndDelete */ - int Close(); - - /** Send a string. - \param s String to send - \param f Dummy flags -- not used */ - void Send(const std::string &s,int f = 0); - /** Send string using printf formatting. */ - void Sendf(const char *format, ...); - /** Send buffer of bytes. - \param buf Buffer pointer - \param len Length of data - \param f Dummy flags -- not used */ - void SendBuf(const char *buf,size_t len,int f = 0); - /** This callback is executed after a successful read from the socket. - \param buf Pointer to the data - \param len Length of the data */ - virtual void OnRawData(const char *buf,size_t len); - - /** Called when output buffer has been sent. - Note: Will only be called IF the output buffer has been used. - Send's that was successful without needing the output buffer - will not generate a call to this method. */ - virtual void OnWriteComplete(); - /** Number of bytes in input buffer. */ - size_t GetInputLength(); - /** Read from input buffer. */ - size_t ReadInput(char *buf, size_t sz); - /** Number of bytes in output buffer. */ - size_t GetOutputLength(); - - /** Callback fires when a socket in line protocol has read one full line. - \param line Line read */ - void OnLine(const std::string& line); - /** Get counter of number of bytes received. */ - uint64_t GetBytesReceived(bool clear = false); - /** Get counter of number of bytes sent. */ - uint64_t GetBytesSent(bool clear = false); - - /** Socks4 specific callback. */ - void OnSocks4Connect(); - /** Socks4 specific callback. */ - void OnSocks4ConnectFailed(); - /** Socks4 specific callback. - \return 'need_more' */ - bool OnSocks4Read(); - -#ifdef ENABLE_RESOLVER - /** Callback executed when resolver thread has finished a resolve request. */ - void OnResolved(int id,ipaddr_t a,port_t port); -#ifdef ENABLE_IPV6 - void OnResolved(int id,in6_addr& a,port_t port); -#endif -#endif -#ifdef HAVE_OPENSSL - /** Callback for 'New' ssl support - replaces SSLSocket. Internal use. */ - void OnSSLConnect(); - /** Callback for 'New' ssl support - replaces SSLSocket. Internal use. */ - void OnSSLAccept(); - /** This method must be implemented to initialize - the ssl context for an outgoing connection. */ - virtual void InitSSLClient(); - /** This method must be implemented to initialize - the ssl context for an incoming connection. */ - virtual void InitSSLServer(); -#endif - -#ifdef ENABLE_RECONNECT - /** Flag that says a broken connection will try to reconnect. */ - void SetReconnect(bool = true); - /** Check reconnect on lost connection flag status. */ - bool Reconnect(); - /** Flag to determine if a reconnect is in progress. */ - void SetIsReconnect(bool x = true); - /** Socket is reconnecting. */ - bool IsReconnect(); -#endif - - /** Use this if you only use OnRawData to process received data. */ - void DisableInputBuffer(bool = true); - - void OnOptions(int,int,int,SOCKET); - - void SetLineProtocol(bool = true); - - /** Get the unfinished line when using SetLineProtocol = true. - The finished line will always be reported with a call to OnLine. - */ - const std::string GetLine() const; - - // TCP options - bool SetTcpNodelay(bool = true); - - virtual int Protocol(); - - /** Trigger limit for callback OnTransferLimit. */ - void SetTransferLimit(size_t sz); - /** This callback fires when the output buffer drops below the value - set by SetTransferLimit. Default: 0 (disabled). */ - virtual void OnTransferLimit(); - -protected: - TcpSocket(const TcpSocket& ); - - void OnRead(); - void OnRead( char *buf, size_t n ); - void OnWrite(); -#ifdef HAVE_OPENSSL - /** SSL; Initialize ssl context for a client socket. - \param meth_in SSL method */ - void InitializeContext(const std::string& context, const SSL_METHOD *meth_in = NULL); - /** SSL; Initialize ssl context for a server socket. - \param keyfile Combined private key/certificate file - \param password Password for private key - \param meth_in SSL method */ - void InitializeContext(const std::string& context, const std::string& keyfile, const std::string& password, const SSL_METHOD *meth_in = NULL); - /** SSL; Initialize ssl context for a server socket. - \param certfile Separate certificate file - \param keyfile Combined private key/certificate file - \param password Password for private key - \param meth_in SSL method */ - void InitializeContext(const std::string& context, const std::string& certfile, const std::string& keyfile, const std::string& password, const SSL_METHOD *meth_in = NULL); - /** SSL; Password callback method. */ - static int SSL_password_cb(char *buf,int num,int rwflag,void *userdata); - /** SSL; Get pointer to ssl context structure. */ - virtual SSL_CTX *GetSslContext(); - /** SSL; Get pointer to ssl structure. */ - virtual SSL *GetSsl(); - /** ssl; still negotiating connection. */ - bool SSLNegotiate(); - /** SSL; Get ssl password. */ - const std::string& GetPassword(); -#endif - - CircularBuffer ibuf; ///< Circular input buffer - -private: - TcpSocket& operator=(const TcpSocket& ) { - return *this; - } - - /** */ - void SendFromOutputBuffer(); - /** the actual send() */ - int TryWrite(const char *buf, size_t len); - /** add data to output buffer top */ - void Buffer(const char *buf, size_t len); - - // - bool m_b_input_buffer_disabled; - uint64_t m_bytes_sent; - uint64_t m_bytes_received; - bool m_skip_c; ///< Skip second char of CRLF or LFCR sequence in OnRead - char m_c; ///< First char in CRLF or LFCR sequence - std::vector m_line; ///< Current line in line protocol mode - size_t m_line_ptr; -#ifdef SOCKETS_DYNAMIC_TEMP - char *m_buf; ///< temporary read buffer -#endif - output_l m_obuf; ///< output buffer - OUTPUT *m_obuf_top; ///< output buffer on top - size_t m_transfer_limit; - size_t m_output_length; - size_t m_repeat_length; - -#ifdef HAVE_OPENSSL - static SSLInitializer m_ssl_init; - SSL_CTX *m_ssl_ctx; ///< ssl context - SSL *m_ssl; ///< ssl 'socket' - BIO *m_sbio; ///< ssl bio - std::string m_password; ///< ssl password - static Mutex m_server_ssl_mutex; - static std::map m_client_contexts; - static std::map m_server_contexts; -#endif - -#ifdef ENABLE_SOCKS4 - int m_socks4_state; ///< socks4 support - char m_socks4_vn; ///< socks4 support, temporary variable - char m_socks4_cd; ///< socks4 support, temporary variable - unsigned short m_socks4_dstport; ///< socks4 support - unsigned long m_socks4_dstip; ///< socks4 support -#endif - -#ifdef ENABLE_RESOLVER - int m_resolver_id; ///< Resolver id (if any) for current Open call -#endif - -#ifdef ENABLE_RECONNECT - bool m_b_reconnect; ///< Reconnect on lost connection flag - bool m_b_is_reconnect; ///< Trying to reconnect -#endif - -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_TcpSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.cpp deleted file mode 100755 index e794856d2a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/** \file Thread.cpp - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include -#ifdef _WIN32 -#include -#include "socket_include.h" -#else -#include -#endif - -#include "Thread.h" -#include "Utility.h" - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -Thread::Thread(bool release) -:m_thread(0) -,m_running(true) -,m_release(false) -,m_b_delete_on_exit(false) -,m_b_destructor(false) -{ -#ifdef _WIN32 -// m_thread = ::CreateThread(NULL, 0, StartThread, this, 0, &m_dwThreadId); - m_thread = (HANDLE)_beginthreadex(NULL, 0, &StartThread, this, 0, &m_dwThreadId); -#else - pthread_attr_t attr; - - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); - if (pthread_create(&m_thread,&attr, StartThread,this) == -1) - { - perror("Thread: create failed"); - SetRunning(false); - } -// pthread_attr_destroy(&attr); -#endif - m_release = release; - if (release) - m_sem.Post(); -} - - -Thread::~Thread() -{ - m_b_destructor = true; - if (m_running) - { - SetRelease(true); - SetRunning(false); - /* - Sleep one second to give thread class Run method enough time to - release from run loop - */ - Utility::Sleep(1000); - } -#ifdef _WIN32 - if (m_thread) - ::CloseHandle(m_thread); -#endif -} - - -threadfunc_t STDPREFIX Thread::StartThread(threadparam_t zz) -{ - /* - Sleep here to wait for derived thread class constructor to setup - vtable... hurts just looking at it - */ - Utility::Sleep(5); - - Thread *p = (Thread *)zz; - - p -> Wait(); - if (p -> m_running) - { - p -> Run(); - } - p -> SetRunning(false); // if return - if (p -> DeleteOnExit() && !p -> IsDestructor()) - { - delete p; - } -#ifdef _WIN32 - _endthreadex(0); -#endif - return (threadfunc_t)NULL; -} - - -bool Thread::IsRunning() -{ - return m_running; -} - - -void Thread::SetRunning(bool x) -{ - m_running = x; -} - - -bool Thread::IsReleased() -{ - return m_release; -} - - -void Thread::SetRelease(bool x) -{ - m_release = x; - if (x) - m_sem.Post(); -} - - -bool Thread::DeleteOnExit() -{ - return m_b_delete_on_exit; -} - - -void Thread::SetDeleteOnExit(bool x) -{ - m_b_delete_on_exit = x; -} - - -bool Thread::IsDestructor() -{ - return m_b_destructor; -} - - -void Thread::Wait() -{ - m_sem.Wait(); -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.h deleted file mode 100755 index 33262cdc98..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Thread.h +++ /dev/null @@ -1,137 +0,0 @@ -/** \file Thread.h - ** \date 2004-10-30 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Thread_H -#define _SOCKETS_Thread_H - -#include "sockets-config.h" -#ifdef _WIN32 -#else -#include -#endif -#include "Semaphore.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -#ifdef _WIN32 -// to be -//typedef DWORD threadfunc_t; -//typedef LPVOID threadparam_t; -//#define STDPREFIX WINAPI -typedef unsigned threadfunc_t; -typedef void * threadparam_t; -#define STDPREFIX __stdcall -#else - -typedef void * threadfunc_t; -typedef void * threadparam_t; -#define STDPREFIX -#endif - -/** \defgroup threading Threading */ -/** Thread base class. -The Thread class is used by the resolver (ResolvServer) and running a detached socket (SocketThread). -When you know some processing will take a long time and will freeze up a socket, there is always the -possibility to call Detach() on that socket before starting the processing. -When the OnDetached() callback is later called the processing can continue, now in its own thread. - \ingroup threading */ -class Thread -{ -public: - Thread(bool release = true); - virtual ~Thread(); - - static threadfunc_t STDPREFIX StartThread(threadparam_t); - - virtual void Run() = 0; - -#ifdef _WIN32 - HANDLE GetThread() { - return m_thread; - } - unsigned GetThreadId() { - return m_dwThreadId; - } -#else - pthread_t GetThread() { - return m_thread; - } -#endif - - bool IsRunning(); - void SetRunning(bool x); - bool IsReleased(); - void SetRelease(bool x); - bool DeleteOnExit(); - void SetDeleteOnExit(bool x = true); - bool IsDestructor(); - - void Start() { - SetRelease(true); - } - - void Stop() { - Start(); - SetRunning(false); - } - - void Wait(); - -protected: -#ifdef _WIN32 - HANDLE m_thread; - unsigned m_dwThreadId; -#else - pthread_t m_thread; -#endif - -private: - Thread(const Thread& ) {} - Thread& operator=(const Thread& ) { - return *this; - } - Semaphore m_sem; - bool m_running; - bool m_release; - bool m_b_delete_on_exit; - bool m_b_destructor; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Thread_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.cpp deleted file mode 100755 index bca1c6c501..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.cpp +++ /dev/null @@ -1,922 +0,0 @@ -/** \file UdpSocket.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include // LG -#ifdef _WIN32 -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif -#include -#else -#include -#endif - -#include "ISocketHandler.h" -#include "UdpSocket.h" -#include "Utility.h" -#include "Ipv4Address.h" -#include "Ipv6Address.h" -#ifdef ENABLE_EXCEPTIONS -#include "Exception.h" -#endif -// include this to see strange sights -//#include - - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -UdpSocket::UdpSocket(ISocketHandler& h, int ibufsz, bool ipv6, int retries) : Socket(h) -, m_ibuf(new char[ibufsz]) -, m_ibufsz(ibufsz) -, m_bind_ok(false) -, m_port(0) -, m_last_size_written(-1) -, m_retries(retries) -, m_b_read_ts(false) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - SetIpv6(ipv6); -//#endif -//#endif -} - - -UdpSocket::~UdpSocket() -{ - Close(); - delete[] m_ibuf; -} - - -int UdpSocket::Bind(port_t &port, int range) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(port); - return Bind(ad, range); - } -//#endif -//#endif - Ipv4Address ad(port); - return Bind(ad, range); -} - - -int UdpSocket::Bind(const std::string& intf, port_t &port, int range) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(intf, port); - if (ad.IsValid()) - { - return Bind(ad, range); - } - SetCloseAndDelete(); - return -1; - } -//#endif -//#endif - Ipv4Address ad(intf, port); - if (ad.IsValid()) - { - return Bind(ad, range); - } - SetCloseAndDelete(); - return -1; -} - - -int UdpSocket::Bind(ipaddr_t a, port_t &port, int range) -{ - Ipv4Address ad(a, port); - return Bind(ad, range); -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -int UdpSocket::Bind(in6_addr a, port_t &port, int range) -{ - Ipv6Address ad(a, port); - return Bind(ad, range); -} -//#endif -//#endif - - -int UdpSocket::Bind(SocketAddress& ad, int range) -{ - if (GetSocket() == INVALID_SOCKET) - { - Attach(CreateSocket(ad.GetFamily(), SOCK_DGRAM, "udp")); - } - if (GetSocket() != INVALID_SOCKET) - { - SetNonblocking(true); - int n = bind(GetSocket(), ad, ad); - int tries = range; - while (n == -1 && tries--) - { - ad.SetPort(ad.GetPort() + 1); - n = bind(GetSocket(), ad, ad); - } - if (n == -1) - { - Handler().LogError(this, "bind", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); -#ifdef ENABLE_EXCEPTIONS - throw Exception("bind() failed for UdpSocket, port:range: " + Utility::l2string(ad.GetPort()) + ":" + Utility::l2string(range)); -#endif - return -1; - } - m_bind_ok = true; - m_port = ad.GetPort(); - return 0; - } - return -1; -} - - -/** if you wish to use Send, first Open a connection */ -bool UdpSocket::Open(ipaddr_t l, port_t port) -{ - Ipv4Address ad(l, port); - return Open(ad); -} - - -bool UdpSocket::Open(const std::string& host, port_t port) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(host, port); - if (ad.IsValid()) - { - return Open(ad); - } - return false; - } -//#endif -//#endif - Ipv4Address ad(host, port); - if (ad.IsValid()) - { - return Open(ad); - } - return false; -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -bool UdpSocket::Open(struct in6_addr& a, port_t port) -{ - Ipv6Address ad(a, port); - return Open(ad); -} -//#endif -//#endif - - -bool UdpSocket::Open(SocketAddress& ad) -{ - if (GetSocket() == INVALID_SOCKET) - { - Attach(CreateSocket(ad.GetFamily(), SOCK_DGRAM, "udp")); - } - if (GetSocket() != INVALID_SOCKET) - { - SetNonblocking(true); - if (connect(GetSocket(), ad, ad) == -1) - { - Handler().LogError(this, "connect", Errno, StrError(Errno), LOG_LEVEL_FATAL); - SetCloseAndDelete(); - return false; - } - SetConnected(); - return true; - } - return false; -} - - -void UdpSocket::CreateConnection() -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - if (GetSocket() == INVALID_SOCKET) - { - SOCKET s = CreateSocket(AF_INET6, SOCK_DGRAM, "udp"); - if (s == INVALID_SOCKET) - { - return; - } - SetNonblocking(true, s); - Attach(s); - } - return; - } -//#endif -//#endif - if (GetSocket() == INVALID_SOCKET) - { - SOCKET s = CreateSocket(AF_INET, SOCK_DGRAM, "udp"); - if (s == INVALID_SOCKET) - { - return; - } - SetNonblocking(true, s); - Attach(s); - } -} - - -/** send to specified address */ -void UdpSocket::SendToBuf(const std::string& h, port_t p, const char *data, int len, int flags) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - Ipv6Address ad(h, p); - if (ad.IsValid()) - { - fprintf(stderr, "UdpSocket::SendToBuf( IPv6 @=%s, port = %d, const char *data, len = %d, flags = %d)\n", h.c_str(), p, len, flags); - SendToBuf(ad, data, len, flags); - } else { - fprintf(stderr, "UdpSocket::SendToBuf(const std::string& h, port_t p, const char *data, int len, int flags) invalid @ IPv6\n"); - } - return; - } -//#endif -//#endif - Ipv4Address ad(h, p); - if (ad.IsValid()) - { - fprintf(stderr, "UdpSocket::SendToBuf( IPv4 @=%s, port = %d, const char *data, len = %d, flags = %d)\n", h.c_str(), p, len, flags); - SendToBuf(ad, data, len, flags); - } else { - fprintf(stderr, "UdpSocket::SendToBuf(const std::string& h, port_t p, const char *data, int len, int flags) invalid @ IPv4\n"); - } -} - - -/** send to specified address */ -void UdpSocket::SendToBuf(ipaddr_t a, port_t p, const char *data, int len, int flags) -{ - Ipv4Address ad(a, p); - fprintf(stderr, "UdpSocket::SendToBuf(ipaddr_t a, port_t p, const char *data, int len, int flags)\n"); - SendToBuf(ad, data, len, flags); -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -void UdpSocket::SendToBuf(in6_addr a, port_t p, const char *data, int len, int flags) -{ - Ipv6Address ad(a, p); - fprintf(stderr, "UdpSocket::SendToBuf(in6_addr a, port_t p, const char *data, int len, int flags)\n"); - SendToBuf(ad, data, len, flags); -} -//#endif -//#endif - - -void UdpSocket::SendToBuf(SocketAddress& ad, const char *data, int len, int flags) -{ - if (GetSocket() == INVALID_SOCKET) - { - fprintf(stderr, "UdpSocket::SendToBuf INVALID_SOCKET\n"); - Attach(CreateSocket(ad.GetFamily(), SOCK_DGRAM, "udp")); - } - if (GetSocket() != INVALID_SOCKET) - { - SetNonblocking(true); - if ((m_last_size_written = sendto(GetSocket(), data, len, flags, ad, ad)) == -1) - { - fprintf(stderr, "UdpSocket::SendToBuf ERROR\n"); - Handler().LogError(this, "sendto", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - } -} - - -void UdpSocket::SendTo(const std::string& a, port_t p, const std::string& str, int flags) -{ - fprintf(stderr, "UdpSocket::SendTo(const std::string& a, port_t p, const std::string& str, int flags)\n"); - SendToBuf(a, p, str.c_str(), (int)str.size(), flags); -} - - -void UdpSocket::SendTo(ipaddr_t a, port_t p, const std::string& str, int flags) -{ - fprintf(stderr, "UdpSocket::SendTo(ipaddr_t a, port_t p, const std::string& str, int flags)\n"); - SendToBuf(a, p, str.c_str(), (int)str.size(), flags); -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -void UdpSocket::SendTo(in6_addr a, port_t p, const std::string& str, int flags) -{ - fprintf(stderr, "UdpSocket::SendTo(in6_addr a, port_t p, const std::string& str, int flags)\n"); - SendToBuf(a, p, str.c_str(), (int)str.size(), flags); -} -//#endif -//#endif - - -void UdpSocket::SendTo(SocketAddress& ad, const std::string& str, int flags) -{ - fprintf(stderr, "UdpSocket::SendTo(SocketAddress& ad, const std::string& str, int flags)\n"); - SendToBuf(ad, str.c_str(), (int)str.size(), flags); -} - - -/** send to connected address */ -void UdpSocket::SendBuf(const char *data, size_t len, int flags) -{ - fprintf(stderr, "UdpSocket::SendBuf(const char *data, size_t len, int flags)\n"); - if (!IsConnected()) - { - Handler().LogError(this, "SendBuf", 0, "not connected", LOG_LEVEL_ERROR); - return; - } - if ((m_last_size_written = send(GetSocket(), data, (int)len, flags)) == -1) - { - Handler().LogError(this, "send", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } -} - - -void UdpSocket::Send(const std::string& str, int flags) -{ - fprintf(stderr, "UdpSocket::Send(const std::string& str, int flags)\n"); - SendBuf(str.c_str(), (int)str.size(), flags); -} - - -#if defined(LINUX) || defined(MACOSX) -int UdpSocket::ReadTS(char *ioBuf, int inBufSize, struct sockaddr *from, socklen_t fromlen, struct timeval *ts) -{ - struct msghdr msg; - struct iovec vec[1]; - union { - struct cmsghdr cm; -#ifdef MACOSX -#ifdef __DARWIN_UNIX03 -#define ALIGNBYTES __DARWIN_ALIGNBYTES -#endif -#define myALIGN(p) (((unsigned int)(p) + ALIGNBYTES) &~ ALIGNBYTES) -#define myCMSG_SPACE(l) (myALIGN(sizeof(struct cmsghdr)) + myALIGN(l)) - char data[ myCMSG_SPACE(sizeof(struct timeval)) ]; -#else - char data[ CMSG_SPACE(sizeof(struct timeval)) ]; -#endif - } cmsg_un; - struct cmsghdr *cmsg; - struct timeval *tv; - - vec[0].iov_base = ioBuf; - vec[0].iov_len = inBufSize; - - memset(&msg, 0, sizeof(msg)); - memset(from, 0, fromlen); - memset(ioBuf, 0, inBufSize); - memset(&cmsg_un, 0, sizeof(cmsg_un)); - - msg.msg_name = (caddr_t)from; - msg.msg_namelen = fromlen; - msg.msg_iov = vec; - msg.msg_iovlen = 1; - msg.msg_control = cmsg_un.data; - msg.msg_controllen = sizeof(cmsg_un.data); - msg.msg_flags = 0; - - // Original version - for reference only - //int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); - - int n = recvmsg(GetSocket(), &msg, MSG_DONTWAIT); - - // now ioBuf will contain the data, as if we used recvfrom - - // Now get the time - if(n != -1 && msg.msg_controllen >= sizeof(struct cmsghdr) && !(msg.msg_flags & MSG_CTRUNC)) - { - tv = 0; - for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) - { - if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_TIMESTAMP) - { - tv = (struct timeval *)CMSG_DATA(cmsg); - } - } - if (tv) - { - memcpy(ts, tv, sizeof(struct timeval)); - } - } - // The address is in network order, but that's OK right now - return n; -} -#endif - - -void UdpSocket::OnRead() -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - struct sockaddr_in6 sa; - socklen_t sa_len = sizeof(sa); - if (m_b_read_ts) - { - struct timeval ts; - Utility::GetTime(&ts); -#if !defined(LINUX) && !defined(MACOSX) - int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); -#else - int n = ReadTS(m_ibuf, m_ibufsz, (struct sockaddr *)&sa, sa_len, &ts); -#endif - if (n > 0) - { - this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len, &ts); - } - else - if (n == -1) - { -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - return; - } - int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); - int q = m_retries; // receive max 10 at one cycle - while (n > 0) - { - if (sa_len != sizeof(sa)) - { - Handler().LogError(this, "recvfrom", 0, "unexpected address struct size", LOG_LEVEL_WARNING); - } - this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len); - if (!q--) - break; - // - n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); - } - if (n == -1) - { -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - return; - } -//#endif -//#endif - struct sockaddr_in sa; - socklen_t sa_len = sizeof(sa); - if (m_b_read_ts) - { - struct timeval ts; - Utility::GetTime(&ts); -#if !defined(LINUX) && !defined(MACOSX) - int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); -#else - int n = ReadTS(m_ibuf, m_ibufsz, (struct sockaddr *)&sa, sa_len, &ts); -#endif - if (n > 0) - { - this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len, &ts); - } - else - if (n == -1) - { -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } - return; - } - int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); - int q = m_retries; - while (n > 0) - { - if (sa_len != sizeof(sa)) - { - Handler().LogError(this, "recvfrom", 0, "unexpected address struct size", LOG_LEVEL_WARNING); - } - this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len); - if (!q--) - break; - // - n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); - } - if (n == -1) - { -#ifdef _WIN32 - if (Errno != WSAEWOULDBLOCK) -#else - if (Errno != EWOULDBLOCK) -#endif - Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); - } -} - - -void UdpSocket::SetBroadcast(bool b) -{ - int one = 1; - int zero = 0; - - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (b) - { - if (setsockopt(GetSocket(), SOL_SOCKET, SO_BROADCAST, (char *) &one, sizeof(one)) == -1) - { - Handler().LogError(this, "SetBroadcast", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } - else - { - if (setsockopt(GetSocket(), SOL_SOCKET, SO_BROADCAST, (char *) &zero, sizeof(zero)) == -1) - { - Handler().LogError(this, "SetBroadcast", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } -} - - -bool UdpSocket::IsBroadcast() -{ - int is_broadcast = 0; - socklen_t size; - - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (getsockopt(GetSocket(), SOL_SOCKET, SO_BROADCAST, (char *)&is_broadcast, &size) == -1) - { - Handler().LogError(this, "IsBroadcast", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return is_broadcast != 0; -} - - -void UdpSocket::SetMulticastTTL(int ttl) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (setsockopt(GetSocket(), SOL_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(int)) == -1) - { - Handler().LogError(this, "SetMulticastTTL", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } -} - - -int UdpSocket::GetMulticastTTL() -{ - int ttl = 0; - socklen_t size = sizeof(int); - - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (getsockopt(GetSocket(), SOL_IP, IP_MULTICAST_TTL, (char *)&ttl, &size) == -1) - { - Handler().LogError(this, "GetMulticastTTL", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return ttl; -} - - -void UdpSocket::SetMulticastLoop(bool x) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - int val = x ? 1 : 0; - if (setsockopt(GetSocket(), IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *)&val, sizeof(int)) == -1) - { - Handler().LogError(this, "SetMulticastLoop(ipv6)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return; - } -//#endif -//#endif - int val = x ? 1 : 0; - if (setsockopt(GetSocket(), SOL_IP, IP_MULTICAST_LOOP, (char *)&val, sizeof(int)) == -1) - { - Handler().LogError(this, "SetMulticastLoop(ipv4)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } -} - - -bool UdpSocket::IsMulticastLoop() -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - int is_loop = 0; - socklen_t size = sizeof(int); - if (getsockopt(GetSocket(), IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *)&is_loop, &size) == -1) - { - Handler().LogError(this, "IsMulticastLoop(ipv6)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return is_loop ? true : false; - } -//#endif -//#endif - int is_loop = 0; - socklen_t size = sizeof(int); - if (getsockopt(GetSocket(), SOL_IP, IP_MULTICAST_LOOP, (char *)&is_loop, &size) == -1) - { - Handler().LogError(this, "IsMulticastLoop(ipv4)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return is_loop ? true : false; -} - - -void UdpSocket::AddMulticastMembership(const std::string& group, const std::string& local_if, int if_index) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - struct ipv6_mreq x; - struct in6_addr addr; - if (Utility::u2ip( group, addr )) - { - x.ipv6mr_multiaddr = addr; - x.ipv6mr_interface = if_index; - if (setsockopt(GetSocket(), IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&x, sizeof(struct ipv6_mreq)) == -1) - { - Handler().LogError(this, "AddMulticastMembership(ipv6)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } - return; - } -//#endif -//#endif - struct ip_mreq x; // ip_mreqn - ipaddr_t addr; - if (Utility::u2ip( group, addr )) - { - memcpy(&x.imr_multiaddr.s_addr, &addr, sizeof(addr)); - Utility::u2ip( local_if, addr); - memcpy(&x.imr_interface.s_addr, &addr, sizeof(addr)); -// x.imr_ifindex = if_index; - if (setsockopt(GetSocket(), SOL_IP, IP_ADD_MEMBERSHIP, (char *)&x, sizeof(struct ip_mreq)) == -1) - { - Handler().LogError(this, "AddMulticastMembership(ipv4)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } -} - - -void UdpSocket::DropMulticastMembership(const std::string& group, const std::string& local_if, int if_index) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - struct ipv6_mreq x; - struct in6_addr addr; - if (Utility::u2ip( group, addr )) - { - x.ipv6mr_multiaddr = addr; - x.ipv6mr_interface = if_index; - if (setsockopt(GetSocket(), IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, (char *)&x, sizeof(struct ipv6_mreq)) == -1) - { - Handler().LogError(this, "DropMulticastMembership(ipv6)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } - return; - } -//#endif -//#endif - struct ip_mreq x; // ip_mreqn - ipaddr_t addr; - if (Utility::u2ip( group, addr )) - { - memcpy(&x.imr_multiaddr.s_addr, &addr, sizeof(addr)); - Utility::u2ip( local_if, addr); - memcpy(&x.imr_interface.s_addr, &addr, sizeof(addr)); -// x.imr_ifindex = if_index; - if (setsockopt(GetSocket(), SOL_IP, IP_DROP_MEMBERSHIP, (char *)&x, sizeof(struct ip_mreq)) == -1) - { - Handler().LogError(this, "DropMulticastMembership(ipv4)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - } -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -void UdpSocket::SetMulticastHops(int hops) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (!IsIpv6()) - { - Handler().LogError(this, "SetMulticastHops", 0, "Ipv6 only", LOG_LEVEL_ERROR); - return; - } - if (setsockopt(GetSocket(), IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&hops, sizeof(int)) == -1) - { - Handler().LogError(this, "SetMulticastHops", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } -} - - -int UdpSocket::GetMulticastHops() -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } - if (!IsIpv6()) - { - Handler().LogError(this, "SetMulticastHops", 0, "Ipv6 only", LOG_LEVEL_ERROR); - return -1; - } - int hops = 0; - socklen_t size = sizeof(int); - if (getsockopt(GetSocket(), IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&hops, &size) == -1) - { - Handler().LogError(this, "GetMulticastHops", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } - return hops; -} -//#endif // IPPROTO_IPV6 -//#endif - - -bool UdpSocket::IsBound() -{ - return m_bind_ok; -} - - -void UdpSocket::OnRawData(const char *buf, size_t len, struct sockaddr *sa, socklen_t sa_len) -{ -} - - -void UdpSocket::OnRawData(const char *buf, size_t len, struct sockaddr *sa, socklen_t sa_len, struct timeval *ts) -{ -} - - -port_t UdpSocket::GetPort() -{ - return m_port; -} - - -int UdpSocket::GetLastSizeWritten() -{ - return m_last_size_written; -} - - -void UdpSocket::SetTimestamp(bool x) -{ - m_b_read_ts = x; -} - - -void UdpSocket::SetMulticastDefaultInterface(ipaddr_t a, int if_index) -{ - struct in_addr x; - memcpy(&x.s_addr, &a, sizeof(a)); - if (setsockopt(GetSocket(), IPPROTO_IP, IP_MULTICAST_IF, (char *)&x, sizeof(x)) == -1) - { - Handler().LogError(this, "SetMulticastDefaultInterface(ipv4)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -void UdpSocket::SetMulticastDefaultInterface(in6_addr a, int if_index) -{ - if (setsockopt(GetSocket(), IPPROTO_IPV6, IPV6_MULTICAST_IF, &if_index, sizeof(if_index)) == -1) - { - Handler().LogError(this, "SetMulticastDefaultInterface(ipv6)", Errno, StrError(Errno), LOG_LEVEL_WARNING); - } -} -//#endif -//#endif - - -void UdpSocket::SetMulticastDefaultInterface(const std::string& intf, int if_index) -{ - if (GetSocket() == INVALID_SOCKET) - { - CreateConnection(); - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (IsIpv6()) - { - struct in6_addr a; - if (Utility::u2ip( intf, a )) - { - SetMulticastDefaultInterface( a, if_index ); - } - return; - } -//#endif -//#endif - ipaddr_t a; - if (Utility::u2ip( intf, a )) - { - SetMulticastDefaultInterface( a, if_index ); - } -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.h deleted file mode 100755 index da635f5591..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/UdpSocket.h +++ /dev/null @@ -1,227 +0,0 @@ -/** \file UdpSocket.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_UdpSocket_H -#define _SOCKETS_UdpSocket_H - -#include "sockets-config.h" -#include "Socket.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -/** Socket implementation for UDP. - \ingroup basic */ -class UdpSocket : public Socket -{ -public: - /** Constructor. - \param h ISocketHandler reference - \param ibufsz Maximum size of receive message (extra bytes will be truncated) - \param ipv6 'true' if this is an ipv6 socket */ - UdpSocket(ISocketHandler& h,int ibufsz = 16384,bool ipv6 = false, int retries = 0); - ~UdpSocket(); - - /** Called when incoming data has been received. - \param buf Pointer to data - \param len Length of data - \param sa Pointer to sockaddr struct of sender - \param sa_len Length of sockaddr struct */ - virtual void OnRawData(const char *buf,size_t len,struct sockaddr *sa,socklen_t sa_len); - - /** Called when incoming data has been received and read timestamp is enabled. - \param buf Pointer to data - \param len Length of data - \param sa Pointer to sockaddr struct of sender - \param sa_len Length of sockaddr struct - \param ts Timestamp from message */ - virtual void OnRawData(const char *buf,size_t len,struct sockaddr *sa,socklen_t sa_len,struct timeval *ts); - - /** To receive incoming data, call Bind to setup an incoming port. - \param port Incoming port number - \param range Port range to try if ports already in use - \return 0 if bind succeeded */ - int Bind(port_t& port,int range = 1); - /** To receive data on a specific interface:port, use this. - \param intf Interface ip/hostname - \param port Port number - \param range Port range - \return 0 if bind succeeded */ - int Bind(const std::string& intf,port_t& port,int range = 1); - /** To receive data on a specific interface:port, use this. - \param a Ip address - \param port Port number - \param range Port range - \return 0 if bind succeeded */ - int Bind(ipaddr_t a,port_t& port,int range = 1); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** To receive data on a specific interface:port, use this. - \param a Ipv6 address - \param port Port number - \param range Port range - \return 0 if bind succeeded */ - int Bind(in6_addr a,port_t& port,int range = 1); - //#endif - //#endif - /** To receive data on a specific interface:port, use this. - \param ad Socket address - \param range Port range - \return 0 if bind succeeded */ - int Bind(SocketAddress& ad,int range = 1); - - /** Define remote host. - \param l Address of remote host - \param port Port of remote host - \return true if successful */ - bool Open(ipaddr_t l,port_t port); - /** Define remote host. - \param host Hostname - \param port Port number - \return true if successful */ - bool Open(const std::string& host,port_t port); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Define remote host. - \param a Address of remote host, ipv6 - \param port Port of remote host - \return true if successful */ - bool Open(struct in6_addr& a,port_t port); - //#endif - //#endif - /** Define remote host. - \param ad Socket address - \return true if successful */ - bool Open(SocketAddress& ad); - - /** Send to specified host */ - void SendToBuf(const std::string& ,port_t,const char *data,int len,int flags = 0); - /** Send to specified address */ - void SendToBuf(ipaddr_t,port_t,const char *data,int len,int flags = 0); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Send to specified ipv6 address */ - void SendToBuf(in6_addr,port_t,const char *data,int len,int flags = 0); - //#endif - //#endif - /** Send to specified socket address */ - void SendToBuf(SocketAddress& ad,const char *data,int len,int flags = 0); - - /** Send string to specified host */ - void SendTo(const std::string&,port_t,const std::string&,int flags = 0); - /** Send string to specified address */ - void SendTo(ipaddr_t,port_t,const std::string&,int flags = 0); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Send string to specified ipv6 address */ - void SendTo(in6_addr,port_t,const std::string&,int flags = 0); - //#endif - //#endif - /** Send string to specified socket address */ - void SendTo(SocketAddress& ad,const std::string&,int flags = 0); - - /** Send to connected address */ - void SendBuf(const char *data,size_t,int flags = 0); - /** Send string to connected address. */ - void Send(const std::string& ,int flags = 0); - - /** Set broadcast */ - void SetBroadcast(bool b = true); - /** Check broadcast flag. - \return true broadcast is enabled. */ - bool IsBroadcast(); - - /** multicast */ - void SetMulticastTTL(int ttl = 1); - int GetMulticastTTL(); - void SetMulticastLoop(bool = true); - bool IsMulticastLoop(); - void SetMulticastDefaultInterface(ipaddr_t a, int if_index = 0); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - void SetMulticastDefaultInterface(in6_addr a, int if_index = 0); - //#endif - //#endif - void SetMulticastDefaultInterface(const std::string& intf, int if_index = 0); - void AddMulticastMembership(const std::string& group,const std::string& intf = "0.0.0.0",int if_index = 0); - void DropMulticastMembership(const std::string& group,const std::string& intf = "0.0.0.0",int if_index = 0); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** multicast, ipv6 only */ - void SetMulticastHops(int = -1); - /** multicast, ipv6 only */ - int GetMulticastHops(); - //#endif - //#endif - /** Returns true if Bind succeeded. */ - bool IsBound(); - /** Return Bind port number */ - port_t GetPort(); - - void OnOptions(int,int,int,SOCKET) {} - - int GetLastSizeWritten(); - - /** Also read timestamp information from incoming message */ - void SetTimestamp(bool = true); - -protected: - UdpSocket(const UdpSocket& s) : Socket(s) {} - void OnRead(); -#if defined(LINUX) || defined(MACOSX) - /** This method emulates socket recvfrom, but uses messages so we can get the timestamp */ - int ReadTS(char *ioBuf, int inBufSize, struct sockaddr *from, socklen_t fromlen, struct timeval *ts); -#endif - -private: - UdpSocket& operator=(const UdpSocket& ) { - return *this; - } - /** create before using sendto methods */ - void CreateConnection(); - char *m_ibuf; ///< Input buffer - int m_ibufsz; ///< Size of input buffer - bool m_bind_ok; ///< Bind completed successfully - port_t m_port; ///< Bind port number - int m_last_size_written; - int m_retries; - bool m_b_read_ts; -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_UdpSocket_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.cpp deleted file mode 100755 index 946867da49..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.cpp +++ /dev/null @@ -1,1440 +0,0 @@ -/** \file Utility.cpp - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include -#include "Utility.h" -#include "Parse.h" -#include "Ipv4Address.h" -#include "Ipv6Address.h" -#include "Base64.h" -#include -#ifdef _WIN32 -#include -#else -#include -#include -#include -#include -#endif -// --- stack -#ifdef LINUX -#include -#include -#include -#endif -// --- -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - - -// defines for the random number generator -#define TWIST_IA 397 -#define TWIST_IB (TWIST_LEN - TWIST_IA) -#define UMASK 0x80000000 -#define LMASK 0x7FFFFFFF -#define MATRIX_A 0x9908B0DF -#define TWIST(b,i,j) ((b)[i] & UMASK) | ((b)[j] & LMASK) -#define MAGIC_TWIST(s) (((s) & 1) * MATRIX_A) - - -// statics -std::string Utility::m_host; -bool Utility::m_local_resolved = false; -ipaddr_t Utility::m_ip = 0; -std::string Utility::m_addr; -#ifdef ENABLE_IPV6 -#ifdef IPPROTO_IPV6 -struct in6_addr Utility::m_local_ip6; -std::string Utility::m_local_addr6; -#endif -#endif -const char *Utility::Logo = - "iVBORw0KGgoAAAANSUhEUgAAAGAAAABeCAIAAABTioayAAAACXBIWXMAAABkAAAAZAAPlsXdAAAAUHRF" - "WHRSYXcgcHJvZmlsZSB0eXBlIEFQUDEyAApnZW5lcmljIHByb2ZpbGUKICAgICAgMTUKNDQ3NTYzNmI3" - "OTAwMDEwMDA0MDAwMDAwM2MwMDAwCg2F1B0AABb4SURBVHja7Xx7rGVXed/3WGs/zvPeuTPXMzbjcUpq" - "HAwlpQlYoUlDaJsAiVuFFKSKGlUlKgXqIKJAKxfRR4IUZEpSt1FoQEK4oYQEErlSFAoKIEoo2BQasBmc" - "2NjyYzxz5957Hnufvfd6fF//2Oecez2hvbXvmZkg3U9b556Zc85ea//291rf+n0bVRWO5P8udLUn8Jdd" - "jgA6QI4AOkCOADpAjgA6QI4AOkCOADpAjgA6QI4AOkCOADpAjgA6QI4AOkCOADpAjgA6QMxVHHtfoUWx" - "/dP+C5fvABGv4gwBAK9qPWg5NLbvrjIY302ujgapAmKrQQiqC3xAQQF0H1AIcyXSq4XeZdegfedfWs78" - "jYKAAgDi3sVri4mqzH+D9DSTu+I2dyVNTEFRl34GUTUikiqotrgoAqqIAhBxqzj7ZocAighXWJUuI0Cq" - "injJ+SMAIZKolkXlGrOzM61mjfckCoN+X9UjorU26wgb7HTSPAfDRlVVFQAR21NeOT26XAC1p10CpKoI" - "iKTO+ckkFpO4vVX1Bh3kkKRsDCIBE4sIMRNx8FTPYgwQfJ1k4ZpT3W4nAQBVQaSF/1pcw+VE63JrEKiC" - "KhChC83Fi6EYEyp2uzxYN4kFY6H1O63TIUQAiCIIEgK5Rke7zWhUE2a9AR+/JunmpIr7of/eA2hhWREA" - "QUlBkGg8af7s7E4n75+6Lu/2iBkUAgJLhP2+RkSJsNU5ACUCQCAyxTQ88eS0rt1gSGdOD621Ik8zs8uH" - "0eUCSDSqCDHGUD/2mCvLXpbWp051bEqqGoIAINHeVRHRJTMREQBEACQEUDa0vT07/2QZvbvxphO9vhGh" - "1m0j0uVzSysGaOF6QASJQvD4yKN1UeiZ053eULzX4FsspB221RdVZWYARaTFaeYXjIgiqqpEag16jw9+" - "e3daTH/gBevHjw1EoIXle0ODdJH/KQiCxiiPPOLrWX7taeh1o3ek8wQH26jUao1qa1ZPy6VbgNovtIAi" - "gCoZK17l3GPNdFLf8H2djY1cRAlJUfHyhP+VAbQM6gsPAt/404uzypw509vYoMYhKCHOQxsAiAohaqtL" - "OhdEUlAm8iEQEgAQIRHHGJGQkBSAjILyhXNaN9VzTuOgn6jOl9yXQ49WvJpXEFUhoAcf2t7apn7f5p04" - "K9XVXkVcE4IXiSoRUEkFVYiAEZnZMltmoxFUKAYFJRWQiK4JwUfvoncxBnUNKMTBMUVKzj2OdSNzXC6P" - "ka1mLbZMdkCQSbZ36q3z2Oma4yesAipwEI8iLkTD4GNEBGZGAEJSBUBQ0RAcqLBJBdRYC0gxKKqKqgrE" - "4FUFgNAY7xFAOx0a79KTT4bvu4FVlYAUFRVgpXp0WID2W6gqIMXGyeOPN73ORm8QrcUQRFUUTNNEAIyt" - "CxJ1PmQ2H093vvr1L0rUm5//N+5/4N7g4o/92Cs7/R6AiAIxi4AKsOGvf/3Ljz/x0F974S2nr7/RNd5a" - "MqSj8e60JMPl9ddvSBRiVlBYaURbgQYtXI+qAhKce7JxLuMkGquq3K63GA0YEBFEFAEFNWx8rP7nV75w" - "/sJjhs31z7n54vaWd3Vd10nWFQ1EBACERlERaHc0vrD1eNNEIkMkIURQNMY0Lj7+xGzz5CCxCMqwak/0" - "7H3QUnf2LZR0VoWHHh7PytnO9nnnQ1XVohoVIqioMBMRGEuGbZbar977xe88+tDx9ecURVNUoZgUs6Is" - "at80TfAxBAEFkdi40ASoqqqYTJomqoIoEhkyNs0StlRV9qlzJSGLCuy391XICjRoEbmEGR9/fFo10utC" - "jFrOast2Vk2NtYRoGANCkiRRJDHm22fPfvozf3jL33w1BXvx4v+alOV4NPLONT5KlCyzPsQIEHxwXtTR" - "aLQ7Gu0W5cw5EAVERKC800nyrndxNmucF8OrzxhXFcUQMLjGl1N7zanrTGKStEtkvJcYNAbxPjLbpglV" - "1YjAuacufPx37+72jv3A837iqYtPlbNpPXNFWU3GRftNERGVEGII4l10LpSzejwqyqKqZm46KVUpeA1e" - "isKRZe+SyaSZJ2ErlRVFMVBGGs2aAMYQ9fs9BXFumqdJmiaACCCzqlHwosY7+MQnP/LYYw/f9o/vEORi" - "Ot0d7c6qZjQeVVWTcjYYWCIBTBHBeW1qrWqqinp3tF3WTROVrXGunhTNeBTKWTOMvU7emUz1+IYCoEgk" - "4vnEDq1QzxKgpwcvbZfsFy5MQ+xaE0WAmLrdfpIgoRKRQlTVqm66nfSP/uj3P/PH/+0fvvbtJzb/Su0q" - "1/jJZFqU1WRazGY7H/3ob/R6HcTYRmtCCh6cl0e+862imDnvkUwIDag4J87HPLfBu3FwwetzTiVsCXSV" - "FaNnr0HL4AUAIhEVgzOjUeHzWgHyvEekWZIzY5TIDACwPjz2rW9/84MffN8PvvjlP/wjP1nVZac7dL6a" - "TkvX+GJaFdPxZz/7iRi0hR0ASZkIFCXv9WMjdV0llpUzUGFkaxVJJECSmrKYNnXsJAKSrDBpfMYALW/O" - "Eh1VJcCyno2mNRECYlPXzAwgT20V/W5qEzZs2NhmWrz/vf8u65x4zWtuZ+LhIMsTU1bFZFq4BqbT0ax0" - "r339e05ec7KtRFtjIWhVO+T0Dz555wP/+3M+oAIoAmOa5mLTTGIkgqIsbd6/OCnO9NciRAa+agDtR2oJ" - "kAiEIGTs5uZ6NZv1el0RiTEAQu0ccQYosQl33fUr933ts6dP3/C+975FoicGBNy+cFEizqpqVpZFUW2e" - "uOn0mTMqjoiYGaJOZ42xPR9pMhkVxSwEQJQonsgAKJMR0PX19cY51amE1sL2V74PZW6HctLt8CISI6hQ" - "nnYIaTjsqcJ4PBkOB8SAqDHGTqf7B7939+/8zm+dueH5SL3zF84bY0UFVMqicIJFUZSzWTkbAVVpKgRC" - "BIjqnEuzCNhUs3I2mznvptNadcyUEHOWdkSE2cQYm8apoggorcA3rwagef4sKCJRBNgIBFVjDB8/fgxQ" - "CAEMJIbP3n//r773jtPX3/zP3/Yh5swY7ORZFAEwH/iPb/va1/64CaFpmqZyvdycOG4tISEBooidVaFu" - "uqpSOwhBogICIGrTVE3tQpQQfZqmo9F0Y70nogrKtLJgf9gwL6KiAKBN02xvT4hNJ82SxBpj806GKDFI" - "1ci7/tVbtnYvvPvffHzj2BnndrMsURCM5D35RqtZ5byv66quK9FgjHZSawzPLYUQALwPABCjDIdZU9fW" - "2DRLvZO6dgpS13WeZ7z4yQqToVVokGqMAgAhhG6WFeV4wIOqruumMgZ63WN3vu9f3PeVz7/lbXfe/MJb" - "Gr+1udlhQiT1XqsZGwoiERRANEQBVQARjcQUQqjrWhQBE5B51EeEPM+tsSKSJmysb1wdY0ySTGIZY0RE" - "YFxuq1w1gFpPqICiEqIqmMEgiYLdXj8EEY1BJOHhf/34f/7QB371lpfd+qpXvzHEyclret2cLRMAlI3v" - "pmnVjGblyLtZiD4ExxiJmE1AVIkBAEV0NqtCmAFAjI0hCKJISMgxQpJam1gFcFUTfIyArFHEECEAtstj" - "OETGeDgTUxBRERWJqpLnSZKse+/KcrZ+bC3GEIKcP7f9s6+7/Wd++o2G0RqXGCOxVrLGMIJToB//2z93" - "zbUveN6NL/GvelOMs43jJ6whZgYAUcny1MUmRveyv/X31teve+73v3Bra5JkTlW982nWAQUEBERmTVKM" - "Isv8bCVu+hmXXJel1dYxey/eh6ZxVdNs7QZrNpLEMhMxAmhTBwhUeDMa7wxz7PWstY21lCZp0zREtDtG" - "HzuzWspxk3XTTm7zxB8/Dnlm5gOBzup44byrfVo3ShAsl3mPCCnG2FaL8jzzPjDJcDAb9oeJpcRaZiZC" - "xMPuxj4zDbp0N1nb/wQRReRQz8qwneVZr9dLOQHQKN4FCUFOHM97nTSxIU1SQxo8MkdgyDLV2Yyk6fWU" - "2Tvv+r0OmVxViAgBQwQmO1hT2fWMIc0MU56kxrkmhIgISnFnvBMa6XZ0Y70bJBplFQReDaPmUKt5XToi" - "RRFNU5zNJiJxe3tre3u7KIrZrDQGT2z0+13D7NfWkk996g/f855f3tiwSWKtMYNB3uvRqVPZ5qY9ccKc" - "vKY/HOS+abwPTdOUsxJQAcQa3Niwv/4f7rh48dGN4700tb1+59ix9SxNsyzPsk6ScJoRES+LVIvjsLKi" - "ehBgjJLmJkmwqmaIEKOv6zgcDpxzdTUeDrKsY/MMyun2nz14v4+QWOyvZ9NCT5ywk0kwhGxoPK0Iw/qg" - "U85ciLC+1i3ruH7c7OzG8U519ptfrsvbmAFJCEkAu71OFLVJXnG0SSNRwPJyi2QlnKJnpkFPN+aWyoLz" - "aSARcmIBxK2tHcvzPM1s42rF2Ol0vnX/N19766t+6idv/dR//7RNekUDX/of99766p/+qZff8uZ/+iZj" - "+MMf/M3f/ujdx453Bv38Xe+648v33hsovPGNb3jlT7z0H/z9n/3zBx6KkhCa7dHk4siNp6WPMai4GIJG" - "wKDqDBgFBMW2ugmEK/HShzAxvfStqnY6eaebpanpdPJer9fr9YbD9aIs3vGOn7/x+T/0mte99fOf+0JZ" - "lI88svvuf/3OW156653v/y+TIv7Ld75z89RzP/yh3woOzn774XvuuefMDX/17W+9vdM99f67fv+vv/jl" - "7/iltzS1AyARcc4XRbmzuzuZTMbjcTWrfFNp8IbpcvAwnrGTXr7uV19cfGoMV43b2dkarh/LbYaIaUbf" - "eejPLfX/2Vt/hTJ8/W1vfujBb9x371cfefTs2Qfvu/9bX5lOii//yeff8E/eXjf1ffc++KUvfvpFP/gS" - "H8yXvvCZH/nRV9z1n37ZED7y8NlvfPMBm6RENktTiUmU2B5NMfFVsTHs4JxedVUBgqfxTlodVkREQiRE" - "JNVojbm4s9sd9keTOs+zaRUn4wJIHYhR7vWG1iaN4zw//tznvnQ8Lq6/nl70opcxnXzRi3/8Yx/78MMP" - "PvCKV77uyScKQnvt6RcgZszZbT//4sHGZhN8mvY6HZOmawIymkzzJCsnjliSNBVtAzoSLXahV+GEDluT" - "nk8KkJCIkEANwfra4PxT57Z3dra2tqbj0ckzN06K3Y/d/WtPPPrgPb97dzGbfP+NNyMZSjqv+pk31BL/" - "9IGvKcdXvOLnPvHxDzx57tGbnv+jtjvcOHndaLv4O3/39Zsbx//kc/cQpDF4xBgjxKigOuh1DSFIHAyG" - "CsDMuIBowf68Ghr0NHSWirTIxwgBVQyhihiDKupjmfU2b//FX/vNf3/Hpz/1yTPPu3FtfXNtbfNNb373" - "Rz5y529/+D3Dwdrtb/+3onLTTT/0kh9+5clrT2+evLZ201/4xbt+49d/6Rfe/HsR4bZ/9M5ud2392HUm" - "SceTqTWapMY19Xh31xhuw8RyDojz97CKKPbMMuk9hgIAqMYoPkgIsWl81YSmcXXtnYshiCiUVd3t9fP+" - "cGen9JK6Wpxz3W7X+4CIAJQwjXYvbhw/Nhx0ETUEr5CIRiZFgBDZC168uGWTZH1tfXd0AQkG/Rx02s3T" - "3e1t72O/lyeGU8M2NVlms4ST1GRpkjCzQaI5P+SqFcwAgWhu98zExMzCDDEqqnbSrKkbonrQ607KWQOB" - "GVRdmggzxhgQ0sFaDzE0bjwcDijgaLzT7XXSxDCR81HqsLm5joiI/sRG3/k6S7GqtWncrCz7vV7CbFqa" - "DBG1eLTri7lSH1p/njVAC2p3a1ZKRERMFJmZSIkQBFTVIJbTadaV4SDLsgBIWZ4TikosyzKx1DQ+SQkB" - "kDyA63Sp3zej8e7aYNhNE05w0aQACJTHFBGYOuPR7nA4yJIENBIxMzK1xwKhuXmtAKFD7WoAzkMYEREJ" - "MzMLMRCRkIAAgaYWm2rqfTUc9m3CXqssyQhtt7NujPU+IAKSVFWVZMYIGAOdLDWGi2ICACFERMzzXCCy" - "yqwoZ0XFDIYYRdkYYiIGNkgEhpEJiYB4CdBhI9khlxoICETErMzIBjkSMxsDqggiURRUEyYf/YXz59Is" - "TfJMYrDWpmnqQ8VMbAwADQd9UW2aRlUUYlFOo8S6rtsklFgIzWh7R6MYTgAEoR2XmdtXNmwMG95nYiuR" - "w0axNlwwozEkEcPcD0GMGgnaOiGAGkKTdmdlHZq65BJIh8Oh840PfmNjw9qWA62EqBrTNEGisiyzPGFI" - "xuPx1JfqAwJYNqCKCIw0d3zMhtttJSbGuYXNHZAeXomeGUBLYmXLgSYijUogimCIhMgyBKMqGiOqIiIH" - "RVBREUTpdVIVqYMGH3cu7HgNaZ5d3NoZrq0577zz62trTV1bm0gUDca5xte7KgKItuV3LsYlanUHmcka" - "NoaMIUJc1IBWoz7PUoP2ZQZKBAJEIkjEzMaiVVElEdMypZhBZP4rEQGANElSRBWJIhrBVc1Ove28Q8RY" - "haIsOnmH0bZfZgbLRkXaaN2GLGY2xliLxpJN2FhmA8xIzEiEuMo1x7MBaLHawAVNGZCQW1IUoFVVAYmg" - "iqpxUVTbIxPh3O7AkgGANLeimpqEEKPIsDdUEcaIBubETpnT69oYBQDMxIaY0RhjDVvDlts8A1ur3zfJ" - "w3qjFVDw2m4mImKGKGqYhUEtAMRFJQQAQaIsd0HaQonu8Z3mbHsCBInYEvD2XRsSIszTHWPYWDaGrGVr" - "rbXGEhkmg0SkiwxoZezdZ5sHPb0w1IZ7JmajAmqVFFnm21OMqAARkVQgxgiw7Kab3+OFz8BFjaldNMBy" - "qbe0LGZmA3PjssYYYoPGEDMiQbtiRpx35V3ltdg+QwNEIAAlMECw10CICIEQiABAJUIUbQmtqm2nwZ6z" - "WNxwwkV/Ai5Aovk6GA2zMcSGbELWmsQYYykxzKZNf9r4vr9n76omirAvnC3nxAjAtOCLIyoQARIgYowa" - "YqQAIiBRFz0sqqD7am+I+5WH2hxiniAbg8aSNdZYtoYSIsNsGKmNa4gAArrSGHZ4H7QPo7YnDIgVgBRV" - "ERNgDG3sjRikLYSKgJCIggrqJYRLFNhvVy0TcZEQGottOmgNW0OGqTUuwqU54cpb7lZCwZt7IiKAFhhS" - "QEbECNrmJoTIJMIUAkdZCqqAzjf3W19Ne9pD86yPGYnJEBlLxpBhYwwZg0xA7TGvbyxnskom8Ep40stZ" - "KQEqoKIAKBChUSRAAgJgJolqWH2MIlFUVEi17VFddnjMzYsIFot0ZAZitMxsyDAaZDZIDLioJQAoos49" - "0F9OEmcr863QFhqNhIotNoREFEVjUCIlQVGKIhpx2ciyNLNFgbJ1K+16AucHATOaeWFjrzxGcwtfrfNZ" - "NUB7ffCgiECttpMitMUPYQJBiCRRMLaaIyAK836fvS2kdqt9bmI8RwqJgQiZieep6Tx3aksul6+xdJUa" - "tLyBrZlw6ywVkQCh7elSZozCoqqCCu0eP+3xefZyn7k/MqhtcjNXJ8KFNQG2vAVcphp7r6u8qMuB/b7e" - "sbYFF1RVZb5vFURk7nsIVEV0uaEluFeraAFibJkuS+Rg8bnuux8rYwNdIYBgX/chwDy2qMCCM4xzy4I2" - "c95rFtzPN1jokS42BeZnJmrLKC0ul8XvXAmAYMlZaiGY3+TWHWP7CIa9msBfmALCHJe9dcjyKRZIl7Sq" - "fI+1hV+CUXu5oHvE8z2a9SJz0Zb7vO/JHrjvKRSLh5vsQ2+Oy+Wb+JUC6LuAden47Wf/HxO9Igb1Xca9" - "ks8PWjjvxXV+F7X4f/12/sUrC9KVfsDSpcPtIbX/sq+aQf1FubpPoPoekKOHvB0gRwAdIEcAHSBHAB0g" - "RwAdIEcAHSBHAB0gRwAdIEcAHSBHAB0gRwAdIP8HqHccFP4Rq4QAAAAASUVORK5CYII="; - - -std::string Utility::base64(const std::string& str_in) -{ - std::string str; - Base64 m_b; - m_b.encode(str_in, str, false); // , false == do not add cr/lf - return str; -} - - -std::string Utility::base64d(const std::string& str_in) -{ - std::string str; - Base64 m_b; - m_b.decode(str_in, str); - return str; -} - - -std::string Utility::l2string(long l) -{ - std::string str; - char tmp[100]; - snprintf(tmp,sizeof(tmp),"%ld",l); - str = tmp; - return str; -} - - -std::string Utility::bigint2string(int64_t l) -{ - std::string str; - int64_t tmp = l; - if (l < 0) - { - str = "-"; - tmp = -l; - } - while (tmp) - { - uint64_t a = tmp % 10; - str = (char)(a + 48) + str; - tmp /= 10; - } - if (!str.size()) - { - str = "0"; - } - return str; -} - - -std::string Utility::bigint2string(uint64_t l) -{ - std::string str; - uint64_t tmp = l; - while (tmp) - { - uint64_t a = tmp % 10; - str = (char)(a + 48) + str; - tmp /= 10; - } - if (!str.size()) - { - str = "0"; - } - return str; -} - - -uint64_t Utility::atoi64(const std::string& str) -{ - uint64_t l = 0; - for (size_t i = 0; i < str.size(); ++i) - { - l = l * 10 + str[i] - 48; - } - return l; -} - - -unsigned int Utility::hex2unsigned(const std::string& str) -{ - unsigned int r = 0; - for (size_t i = 0; i < str.size(); ++i) - { - r = r * 16 + str[i] - 48 - ((str[i] >= 'A') ? 7 : 0) - ((str[i] >= 'a') ? 32 : 0); - } - return r; -} - - -/* -* Encode string per RFC1738 URL encoding rules -* tnx rstaveley -*/ -std::string Utility::rfc1738_encode(const std::string& src) -{ -static char hex[] = "0123456789ABCDEF"; - std::string dst; - for (size_t i = 0; i < src.size(); ++i) - { - if (isalnum(src[i])) - { - dst += src[i]; - } - else - if (src[i] == ' ') - { - dst += '+'; - } - else - { - unsigned char c = static_cast(src[i]); - dst += '%'; - dst += hex[c / 16]; - dst += hex[c % 16]; - } - } - return dst; -} // rfc1738_encode - - -/* -* Decode string per RFC1738 URL encoding rules -* tnx rstaveley -*/ -std::string Utility::rfc1738_decode(const std::string& src) -{ - std::string dst; - for (size_t i = 0; i < src.size(); ++i) - { - if (src[i] == '%' && isxdigit(src[i + 1]) && isxdigit(src[i + 2])) - { - char c1 = src[++i]; - char c2 = src[++i]; - c1 = c1 - 48 - ((c1 >= 'A') ? 7 : 0) - ((c1 >= 'a') ? 32 : 0); - c2 = c2 - 48 - ((c2 >= 'A') ? 7 : 0) - ((c2 >= 'a') ? 32 : 0); - dst += (char)(c1 * 16 + c2); - } - else - if (src[i] == '+') - { - dst += ' '; - } - else - { - dst += src[i]; - } - } - return dst; -} // rfc1738_decode - - -bool Utility::isipv4(const std::string& str) -{ - int dots = 0; - // %! ignore :port? - for (size_t i = 0; i < str.size(); ++i) - { - if (str[i] == '.') - dots++; - else - if (!isdigit(str[i])) - return false; - } - if (dots != 3) - return false; - return true; -} - - -bool Utility::isipv6(const std::string& str) -{ - size_t qc = 0; - size_t qd = 0; - for (size_t i = 0; i < str.size(); ++i) - { - qc += (str[i] == ':') ? 1 : 0; - qd += (str[i] == '.') ? 1 : 0; - } - if (qc > 7) - { - fprintf(stderr, "tility::isipv6(%s) FALSE @1\n", str.c_str()); - return false; - } - if (qd && qd != 3) - { - fprintf(stderr, "tility::isipv6(%s) FALSE @2\n", str.c_str()); - return false; - } - Parse pa(str,":."); - std::string tmp = pa.getword(); - while (tmp.size()) - { - if (tmp.size() > 4) - { - fprintf(stderr, "tility::isipv6(%s) FALSE@3\n", str.c_str()); - return false; - } - for (size_t i = 0; i < tmp.size(); ++i) - { - if (tmp[i] < '0' || (tmp[i] > '9' && tmp[i] < 'A') || - (tmp[i] > 'F' && tmp[i] < 'a') || tmp[i] > 'f') - { - fprintf(stderr, "tility::isipv6(%s) FALSE@4\n", str.c_str()); - return false; - } - } - // - tmp = pa.getword(); - } - return true; -} - - -bool Utility::u2ip(const std::string& str, ipaddr_t& l) -{ - struct sockaddr_in sa; - bool r = Utility::u2ip(str, sa); - memcpy(&l, &sa.sin_addr, sizeof(l)); - return r; -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -bool Utility::u2ip(const std::string& str, struct in6_addr& l) -{ - struct sockaddr_in6 sa; - bool r = Utility::u2ip(str, sa); - l = sa.sin6_addr; - return r; -} -//#endif -//#endif - - -void Utility::l2ip(const ipaddr_t ip, std::string& str) -{ - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - memcpy(&sa.sin_addr, &ip, sizeof(sa.sin_addr)); - Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), str, NI_NUMERICHOST); -} - - -void Utility::l2ip(const in_addr& ip, std::string& str) -{ - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_addr = ip; - Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), str, NI_NUMERICHOST); -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -void Utility::l2ip(const struct in6_addr& ip, std::string& str,bool mixed) -{ - char slask[100]; // l2ip temporary - *slask = 0; - unsigned int prev = 0; - bool skipped = false; - bool ok_to_skip = true; - if (mixed) - { - unsigned short x; - unsigned short addr16[8]; - memcpy(addr16, &ip, sizeof(addr16)); - for (size_t i = 0; i < 6; ++i) - { - x = ntohs(addr16[i]); - if (*slask && (x || !ok_to_skip || prev)) - { -#if defined( _WIN32) && !defined(__CYGWIN__) - strcat_s(slask,sizeof(slask),":"); -#else - strcat(slask,":"); -#endif - } - if (x || !ok_to_skip) - { - snprintf(slask + strlen(slask),sizeof(slask) - strlen(slask),"%x", x); - if (x && skipped) - ok_to_skip = false; - } - else - { - skipped = true; - } - prev = x; - } - x = ntohs(addr16[6]); - snprintf(slask + strlen(slask),sizeof(slask) - strlen(slask),":%u.%u",x / 256,x & 255); - x = ntohs(addr16[7]); - snprintf(slask + strlen(slask),sizeof(slask) - strlen(slask),".%u.%u",x / 256,x & 255); - } - else - { - struct sockaddr_in6 sa; - memset(&sa, 0, sizeof(sa)); - sa.sin6_family = AF_INET6; - sa.sin6_addr = ip; - Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), str, NI_NUMERICHOST); - return; - } - str = slask; -} - - -int Utility::in6_addr_compare(in6_addr a,in6_addr b) -{ - for (size_t i = 0; i < 16; ++i) - { - if (a.s6_addr[i] < b.s6_addr[i]) - return -1; - if (a.s6_addr[i] > b.s6_addr[i]) - return 1; - } - return 0; -} -//#endif -//#endif - - -void Utility::ResolveLocal() -{ - char h[256]; - - // get local hostname and translate into ip-address - *h = 0; - gethostname(h,255); - { - if (Utility::u2ip(h, m_ip)) - { - Utility::l2ip(m_ip, m_addr); - } - } -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - memset(&m_local_ip6, 0, sizeof(m_local_ip6)); - { - if (Utility::u2ip(h, m_local_ip6)) - { - Utility::l2ip(m_local_ip6, m_local_addr6); - } - } -//#endif -//#endif - m_host = h; - m_local_resolved = true; -} - - -const std::string& Utility::GetLocalHostname() -{ - if (!m_local_resolved) - { - ResolveLocal(); - } - return m_host; -} - - -ipaddr_t Utility::GetLocalIP() -{ - if (!m_local_resolved) - { - ResolveLocal(); - } - return m_ip; -} - - -const std::string& Utility::GetLocalAddress() -{ - if (!m_local_resolved) - { - ResolveLocal(); - } - return m_addr; -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -const struct in6_addr& Utility::GetLocalIP6() -{ - if (!m_local_resolved) - { - ResolveLocal(); - } - return m_local_ip6; -} - - -const std::string& Utility::GetLocalAddress6() -{ - if (!m_local_resolved) - { - ResolveLocal(); - } - return m_local_addr6; -} -//#endif -//#endif - - -const std::string Utility::GetEnv(const std::string& name) -{ -#if defined( _WIN32) && !defined(__CYGWIN__) - size_t sz = 0; - char tmp[2048]; - if (getenv_s(&sz, tmp, sizeof(tmp), name.c_str())) - { - *tmp = 0; - } - return tmp; -#else - char *s = getenv(name.c_str()); - if (!s) - return ""; - return s; -#endif -} - - -void Utility::SetEnv(const std::string& var,const std::string& value) -{ -#if (defined(SOLARIS8) || defined(SOLARIS)) - { - static std::map vmap; - if (vmap.find(var) != vmap.end()) - { - delete[] vmap[var]; - } - size_t sz = var.size() + 1 + value.size() + 1; - vmap[var] = new char[sz]; - snprintf(vmap[var], sz, "%s=%s", var.c_str(), value.c_str()); - putenv( vmap[var] ); - } -#elif defined _WIN32 - { - std::string slask = var + "=" + value; - _putenv( (char *)slask.c_str()); - } -#else - setenv(var.c_str(), value.c_str(), 1); -#endif -} - - -std::string Utility::Sa2String(struct sockaddr *sa) -{ -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - if (sa -> sa_family == AF_INET6) - { - struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa; - std::string tmp; - Utility::l2ip(sa6 -> sin6_addr, tmp); - return tmp + ":" + Utility::l2string(ntohs(sa6 -> sin6_port)); - } -//#endif -//#endif - if (sa -> sa_family == AF_INET) - { - struct sockaddr_in *sa4 = (struct sockaddr_in *)sa; - ipaddr_t a; - memcpy(&a, &sa4 -> sin_addr, 4); - std::string tmp; - Utility::l2ip(a, tmp); - return tmp + ":" + Utility::l2string(ntohs(sa4 -> sin_port)); - } - return ""; -} - - -void Utility::GetTime(struct timeval *p) -{ -#ifdef _WIN32 - FILETIME ft; // Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC). - GetSystemTimeAsFileTime(&ft); - uint64_t tt; - memcpy(&tt, &ft, sizeof(tt)); - tt /= 10; // make it usecs - p->tv_sec = (long)tt / 1000000; - p->tv_usec = (long)tt % 1000000; -#else - gettimeofday(p, NULL); -#endif -} - - -std::auto_ptr Utility::CreateAddress(struct sockaddr *sa,socklen_t sa_len) -{ - switch (sa -> sa_family) - { - case AF_INET: - if (sa_len == sizeof(struct sockaddr_in)) - { - struct sockaddr_in *p = (struct sockaddr_in *)sa; - return std::auto_ptr(new Ipv4Address(*p)); - } - break; -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 - case AF_INET6: - if (sa_len == sizeof(struct sockaddr_in6)) - { - struct sockaddr_in6 *p = (struct sockaddr_in6 *)sa; - return std::auto_ptr(new Ipv6Address(*p)); - } - break; -//#endif -//#endif - } - return std::auto_ptr(NULL); -} - - -bool Utility::u2ip(const std::string& host, struct sockaddr_in& sa, int ai_flags) -{ - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; -#ifdef NO_GETADDRINFO - if ((ai_flags & AI_NUMERICHOST) != 0 || isipv4(host)) - { - Parse pa((char *)host.c_str(), "."); - union { - struct { - unsigned char b1; - unsigned char b2; - unsigned char b3; - unsigned char b4; - } a; - ipaddr_t l; - } u; - u.a.b1 = static_cast(pa.getvalue()); - u.a.b2 = static_cast(pa.getvalue()); - u.a.b3 = static_cast(pa.getvalue()); - u.a.b4 = static_cast(pa.getvalue()); - memcpy(&sa.sin_addr, &u.l, sizeof(sa.sin_addr)); - return true; - } -#ifndef LINUX - struct hostent *he = gethostbyname( host.c_str() ); - if (!he) - { - return false; - } - memcpy(&sa.sin_addr, he -> h_addr, sizeof(sa.sin_addr)); -#else - struct hostent he; - struct hostent *result = NULL; - int myerrno = 0; - char buf[2000]; - int n = gethostbyname_r(host.c_str(), &he, buf, sizeof(buf), &result, &myerrno); - if (n || !result) - { - return false; - } - if (he.h_addr_list && he.h_addr_list[0]) - memcpy(&sa.sin_addr, he.h_addr, 4); - else - return false; -#endif - return true; -#else - struct addrinfo hints; - memset(&hints, 0, sizeof(hints)); - // AI_NUMERICHOST - // AI_CANONNAME - // AI_PASSIVE - server - // AI_ADDRCONFIG - // AI_V4MAPPED - // AI_ALL - // AI_NUMERICSERV - hints.ai_flags = ai_flags; - hints.ai_family = AF_INET; - hints.ai_socktype = 0; - hints.ai_protocol = 0; - struct addrinfo *res; - if (Utility::isipv4(host)) - hints.ai_flags |= AI_NUMERICHOST; - int n = getaddrinfo(host.c_str(), NULL, &hints, &res); - if (!n) - { - std::vector vec; - struct addrinfo *ai = res; - while (ai) - { - if (ai -> ai_addrlen == sizeof(sa)) - vec.push_back( ai ); - ai = ai -> ai_next; - } - if (!vec.size()) - return false; - ai = vec[Utility::Rnd() % vec.size()]; - { - memcpy(&sa, ai -> ai_addr, ai -> ai_addrlen); - } - freeaddrinfo(res); - return true; - } - std::string error = "Error: "; -#ifndef __CYGWIN__ - error += gai_strerror(n); -#endif - return false; -#endif // NO_GETADDRINFO -} - - -//#ifdef ENABLE_IPV6 -//#ifdef IPPROTO_IPV6 -bool Utility::u2ip(const std::string& host, struct sockaddr_in6& sa, int ai_flags) -{ - memset(&sa, 0, sizeof(sa)); - sa.sin6_family = AF_INET6; -#ifdef NO_GETADDRINFO - if ((ai_flags & AI_NUMERICHOST) != 0 || isipv6(host)) - { - std::list vec; - size_t x = 0; - for (size_t i = 0; i <= host.size(); ++i) - { - if (i == host.size() || host[i] == ':') - { - std::string s = host.substr(x, i - x); - // - if (strstr(s.c_str(),".")) // x.x.x.x - { - Parse pa(s,"."); - char slask[100]; // u2ip temporary hex2string conversion - unsigned long b0 = static_cast(pa.getvalue()); - unsigned long b1 = static_cast(pa.getvalue()); - unsigned long b2 = static_cast(pa.getvalue()); - unsigned long b3 = static_cast(pa.getvalue()); - snprintf(slask,sizeof(slask),"%lx",b0 * 256 + b1); - vec.push_back(slask); - snprintf(slask,sizeof(slask),"%lx",b2 * 256 + b3); - vec.push_back(slask); - } - else - { - vec.push_back(s); - } - // - x = i + 1; - } - } - size_t sz = vec.size(); // number of byte pairs - size_t i = 0; // index in in6_addr.in6_u.u6_addr16[] ( 0 .. 7 ) - unsigned short addr16[8]; - for (std::list::iterator it = vec.begin(); it != vec.end(); ++it) - { - std::string bytepair = *it; - if (bytepair.size()) - { - addr16[i++] = htons(Utility::hex2unsigned(bytepair)); - } - else - { - addr16[i++] = 0; - while (sz++ < 8) - { - addr16[i++] = 0; - } - } - } - memcpy(&sa.sin6_addr, addr16, sizeof(addr16)); - return true; - } -#ifdef SOLARIS - int errnum = 0; - struct hostent *he = getipnodebyname( host.c_str(), AF_INET6, 0, &errnum ); -#else - struct hostent *he = gethostbyname2( host.c_str(), AF_INET6 ); -#endif - if (!he) - { - return false; - } - memcpy(&sa.sin6_addr,he -> h_addr_list[0],he -> h_length); -#ifdef SOLARIS - free(he); -#endif - return true; -#else - struct addrinfo hints; - memset(&hints, 0, sizeof(hints)); - hints.ai_flags = ai_flags; - hints.ai_family = AF_INET6; - hints.ai_socktype = 0; - hints.ai_protocol = 0; - struct addrinfo *res; - if (Utility::isipv6(host)) - hints.ai_flags |= AI_NUMERICHOST; - int n = getaddrinfo(host.c_str(), NULL, &hints, &res); - if (!n) - { - std::vector vec; - struct addrinfo *ai = res; - while (ai) - { - if (ai -> ai_addrlen == sizeof(sa)) - vec.push_back( ai ); - ai = ai -> ai_next; - } - if (!vec.size()) - return false; - ai = vec[Utility::Rnd() % vec.size()]; - { - memcpy(&sa, ai -> ai_addr, ai -> ai_addrlen); - } - freeaddrinfo(res); - return true; - } - std::string error = "Error: "; -#ifndef __CYGWIN__ - error += gai_strerror(n); -#endif - return false; -#endif // NO_GETADDRINFO -} -//#endif // IPPROTO_IPV6 -//#endif // ENABLE_IPV6 - - -bool Utility::reverse(struct sockaddr *sa, socklen_t sa_len, std::string& hostname, int flags) -{ - std::string service; - return Utility::reverse(sa, sa_len, hostname, service, flags); -} - - -bool Utility::reverse(struct sockaddr *sa, socklen_t sa_len, std::string& hostname, std::string& service, int flags) -{ - hostname = ""; - service = ""; -#ifdef NO_GETADDRINFO - switch (sa -> sa_family) - { - case AF_INET: - if (flags & NI_NUMERICHOST) - { - union { - struct { - unsigned char b1; - unsigned char b2; - unsigned char b3; - unsigned char b4; - } a; - ipaddr_t l; - } u; - struct sockaddr_in *sa_in = (struct sockaddr_in *)sa; - memcpy(&u.l, &sa_in -> sin_addr, sizeof(u.l)); - char tmp[100]; - snprintf(tmp, sizeof(tmp), "%u.%u.%u.%u", u.a.b1, u.a.b2, u.a.b3, u.a.b4); - hostname = tmp; - return true; - } - else - { - struct sockaddr_in *sa_in = (struct sockaddr_in *)sa; - struct hostent *h = gethostbyaddr( (const char *)&sa_in -> sin_addr, sizeof(sa_in -> sin_addr), AF_INET); - if (h) - { - hostname = h -> h_name; - return true; - } - } - break; -//#ifdef ENABLE_IPV6 - case AF_INET6: - if (flags & NI_NUMERICHOST) - { - char slask[100]; // l2ip temporary - *slask = 0; - unsigned int prev = 0; - bool skipped = false; - bool ok_to_skip = true; - { - unsigned short addr16[8]; - struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *)sa; - memcpy(addr16, &sa_in6 -> sin6_addr, sizeof(addr16)); - for (size_t i = 0; i < 8; ++i) - { - unsigned short x = ntohs(addr16[i]); - if (*slask && (x || !ok_to_skip || prev)) - { -#if defined( _WIN32) && !defined(__CYGWIN__) - strcat_s(slask, sizeof(slask),":"); -#else - strcat(slask,":"); -#endif - } - if (x || !ok_to_skip) - { - snprintf(slask + strlen(slask), sizeof(slask) - strlen(slask),"%x", x); - if (x && skipped) - ok_to_skip = false; - } - else - { - skipped = true; - } - prev = x; - } - } - if (!*slask) - { -#if defined( _WIN32) && !defined(__CYGWIN__) - strcpy_s(slask, sizeof(slask), "::"); -#else - strcpy(slask, "::"); -#endif - } - hostname = slask; - return true; - } - else - { - // %! TODO: ipv6 reverse lookup - struct sockaddr_in6 *sa_in = (struct sockaddr_in6 *)sa; - struct hostent *h = gethostbyaddr( (const char *)&sa_in -> sin6_addr, sizeof(sa_in -> sin6_addr), AF_INET6); - if (h) - { - hostname = h -> h_name; - return true; - } - } - break; -//#endif - } - return false; -#else - char host[NI_MAXHOST]; - // NI_NOFQDN - // NI_NUMERICHOST - // NI_NAMEREQD - // NI_NUMERICSERV - // NI_DGRAM - int n = getnameinfo(sa, sa_len, host, sizeof(host), NULL, 0, flags); - if (n) - { - // EAI_AGAIN - // EAI_BADFLAGS - // EAI_FAIL - // EAI_FAMILY - // EAI_MEMORY - // EAI_NONAME - // EAI_OVERFLOW - // EAI_SYSTEM - return false; - } - hostname = host; - return true; -#endif // NO_GETADDRINFO -} - - -bool Utility::u2service(const std::string& name, int& service, int ai_flags) -{ -#ifdef NO_GETADDRINFO - // %! - return false; -#else - struct addrinfo hints; - service = 0; - memset(&hints, 0, sizeof(hints)); - // AI_NUMERICHOST - // AI_CANONNAME - // AI_PASSIVE - server - // AI_ADDRCONFIG - // AI_V4MAPPED - // AI_ALL - // AI_NUMERICSERV - hints.ai_flags = ai_flags; - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = 0; - hints.ai_protocol = 0; - struct addrinfo *res; - int n = getaddrinfo(NULL, name.c_str(), &hints, &res); - if (!n) - { - service = res -> ai_protocol; - freeaddrinfo(res); - return true; - } - return false; -#endif // NO_GETADDRINFO -} - - -unsigned long Utility::ThreadID() -{ -#ifdef _WIN32 - return GetCurrentThreadId(); -#else - return (unsigned long)pthread_self(); -#endif -} - - -std::string Utility::ToLower(const std::string& str) -{ - std::string r; - for (size_t i = 0; i < str.size(); ++i) - { - if (str[i] >= 'A' && str[i] <= 'Z') - r += str[i] | 32; - else - r += str[i]; - } - return r; -} - - -std::string Utility::ToUpper(const std::string& str) -{ - std::string r; - for (size_t i = 0; i < str.size(); ++i) - { - if (str[i] >= 'a' && str[i] <= 'z') - r += (char)(str[i] - 32); - else - r += str[i]; - } - return r; -} - - -std::string Utility::ToString(double d) -{ - char tmp[100]; - snprintf(tmp, sizeof(tmp), "%f", d); - return tmp; -} - - -unsigned long Utility::Rnd() -{ -static Utility::Rng generator( (unsigned long)time(NULL) ); - return generator.Get(); -} - - -Utility::Rng::Rng(unsigned long seed) : m_value( 0 ) -{ - m_tmp[0] = seed & 0xffffffffUL; - for (int i = 1; i < TWIST_LEN; ++i) - { - m_tmp[i] = (1812433253UL * (m_tmp[i - 1] ^ (m_tmp[i - 1] >> 30)) + i); - } -} - - -unsigned long Utility::Rng::Get() -{ - unsigned long val = m_tmp[m_value]; - ++m_value; - if (m_value == TWIST_LEN) - { - for (int i = 0; i < TWIST_IB; ++i) - { - unsigned long s = TWIST(m_tmp, i, i + 1); - m_tmp[i] = m_tmp[i + TWIST_IA] ^ (s >> 1) ^ MAGIC_TWIST(s); - } - { - for (int i = 0; i < TWIST_LEN - 1; ++i) - { - unsigned long s = TWIST(m_tmp, i, i + 1); - m_tmp[i] = m_tmp[i - TWIST_IB] ^ (s >> 1) ^ MAGIC_TWIST(s); - } - } - unsigned long s = TWIST(m_tmp, TWIST_LEN - 1, 0); - m_tmp[TWIST_LEN - 1] = m_tmp[TWIST_IA - 1] ^ (s >> 1) ^ MAGIC_TWIST(s); - - m_value = 0; - } - return val; -} - - -bool Utility::ncmap_compare::operator()(const std::string& x, const std::string& y) const -{ - return strcasecmp(x.c_str(), y.c_str()) < 0; -} - - -Utility::Uri::Uri(const std::string& url) : m_url(url), m_port(0), m_path(url) -{ - size_t pos = url.find("://"); - if (pos != std::string::npos) - { - m_protocol = Utility::ToLower(url.substr(0, pos)); - m_port = (m_protocol == "http") ? 80 : - (m_protocol == "https") ? 443 : 0; - m_host = url.substr(pos + 3); - pos = m_host.find("/"); - if (pos != std::string::npos) - { - m_path = m_host.substr(pos); - m_host = m_host.substr(0, pos); - } - pos = m_host.find(":"); - if (pos != std::string::npos) - { - m_port = atoi(m_host.substr(pos + 1).c_str()); - m_host = m_host.substr(0, pos); - } - } - pos = m_path.find("?"); - if (pos != std::string::npos) - { - m_uri = m_path.substr(0, pos); - m_query_string = m_path.substr(pos + 1); - } - else - { - m_uri = m_path; - } - pos = std::string::npos; - for (size_t i = 0; i < m_uri.size(); ++i) - if (m_uri[i] == '/') - pos = i; - if (pos != std::string::npos) - m_file = m_uri.substr(pos + 1); - pos = std::string::npos; - for (size_t i = 0; i < m_uri.size(); ++i) - if (m_uri[i] == '.') - pos = i; - if (pos != std::string::npos) - m_ext = m_uri.substr(pos + 1); -} - - -Utility::Path::Path(const std::string& _str) -{ - std::string str = _str; - for (size_t i = 0; i < str.size(); ++i) - { -#ifdef _WIN32 - if (str[i] == '/') - str[i] = '\\'; -#else - if (str[i] == '\\') - str[i] = '/'; -#endif - } -#ifndef _WIN32 - struct stat st; - stat(str.c_str(), &st); - if (S_ISDIR(st.st_mode)) - { - m_path = str; - return; - } -#endif - size_t x = 0; - for (size_t i = 0; i < str.size(); ++i) - if (str[i] == '/' || str[i] == '\\') - x = i + 1; - m_path = str.substr(0, x); - m_file = str.substr(x); - for (size_t i = 0; i < m_file.size(); ++i) - if (m_file[i] == '.') - m_ext = m_file.substr(i + 1); -} - - -const std::string Utility::Stack() -{ -#if defined LINUX -#define BFSIZE 255 - void *buffer[BFSIZE]; - int n = backtrace(buffer, BFSIZE); - char **res = backtrace_symbols(buffer, n); - std::string tmp; - for (int i = 0; i < n; ++i) - { - std::string x = res[i]; - std::string plus; - std::string addr; - size_t pos = x.find("("); - if (pos != std::string::npos) - { - x = x.substr(pos + 1); // skip executable name - - pos = x.find(")"); - if (pos != std::string::npos) - { - addr = x.substr(pos + 1); - x = x.substr(0, pos); - } - - pos = x.find("+"); - if (pos != std::string::npos) - { - plus = x.substr(pos); - x = x.substr(0, pos); - } - } - char zz[1000]; - { - size_t sz = 1000; - int status = 0; - abi::__cxa_demangle( x.c_str(), zz, &sz, &status); - - if (!status) - { - tmp += zz; - tmp += plus; - tmp += addr; - } - else - { - tmp += res[i]; - } - tmp += "\n"; - } - // dladdr() test - if (0) - { - Dl_info info; - int n = dladdr(buffer[i], &info); - if (!n) - printf("%d: dladdr() failed\n", i); - else - { - size_t sz = 1000; - int status = 0; - abi::__cxa_demangle( info.dli_sname, zz, &sz, &status); - - printf("%d: %s: %s\n", i, info.dli_fname, info.dli_sname); - if (!status) - printf(" %s\n", zz); - } - } // end of dladdr() test - } // for (i) - free(res); - return tmp; -#else - return "Not available"; -#endif -} - - -const std::string Utility::FromUtf8(const std::string& str) -{ - if (!str.size()) - return ""; - std::string r; - for (size_t i = 0; i < str.size(); ++i) - { - if (i < str.size() - 1 && (str[i] & 0xe0) == 0xc0 && (str[i + 1] & 0xc0) == 0x80) - { - int c1 = str[i] & 0x1f; - int c2 = str[++i] & 0x3f; - int c = (c1 << 6) + c2; - r += (char)c; - } - else - { - r += str[i]; - } - } - return r; -} - -// 110yyyxx 10xxxxxx - -const std::string Utility::ToUtf8(const std::string& str) -{ - if (str.empty()) - return ""; - std::string r; - for (size_t i = 0; i < str.size(); ++i) - { - if (((unsigned)str[i] & 0x80) == 0x80) - { - r += (str[i] >> 6) | 0xc0; - r += (str[i] & 0x3f) | 0x80; - } - else - { - r += str[i]; - } - } - return r; -} - - -const Utility::Path Utility::CurrentDirectory() -{ -#ifdef _WIN32 - TCHAR slask[MAX_PATH + 1]; - DWORD ret = -#ifdef UNICODE - ::GetCurrentDirectoryW(MAX_PATH, slask); -#else - ::GetCurrentDirectoryA(MAX_PATH, slask); -#endif - if (!ret) - { - *slask = 0; - DWORD err = GetLastError(); - } - return Path(slask); -#else - char slask[32000]; - if (!getcwd(slask, 32000)) - { - return Path("."); - } - return Path(slask); -#endif -} - - -bool Utility::ChangeDirectory(const Utility::Path& to_dir) -{ -#ifdef _WIN32 - return SetCurrentDirectory(to_dir.GetPath().c_str()) ? true : false; -#else - if (chdir( to_dir.GetPath().c_str() ) == -1) - { - return false; - } - return true; -#endif -} - - -void Utility::Sleep(int ms) -{ -#ifdef _WIN32 - ::Sleep(ms); -#else - struct timeval tv; - tv.tv_sec = ms / 1000; - tv.tv_usec = (ms % 1000) * 1000; - select(0, NULL, NULL, NULL, &tv); -#endif -} - - -#ifdef SOCKETS_NAMESPACE -} -#endif - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.h deleted file mode 100755 index 24366bb631..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/Utility.h +++ /dev/null @@ -1,276 +0,0 @@ -/** \file Utility.h - ** \date 2004-02-13 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Utility_H -#define _SOCKETS_Utility_H - -#include "sockets-config.h" -#include -#include -#include "socket_include.h" -#include -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -#define TWIST_LEN 624 - -class SocketAddress; - -/** Conversion utilities. - \ingroup util */ -class Utility -{ - /** - The Mersenne Twister - http://www.math.keio.ac.jp/~matumoto/emt.html - */ - class Rng - { - public: - Rng(unsigned long seed); - - unsigned long Get(); - - private: - int m_value; - unsigned long m_tmp[TWIST_LEN]; - }; - class ncmap_compare - { - public: - bool operator()(const std::string& x, const std::string& y) const; - }; -public: - template class ncmap : public std::map - { - public: - ncmap() {} - }; - class Uri - { - public: - Uri(const std::string& url); - - const std::string& Url() const { - return m_url; - } - const std::string& UrlUri() const { - return m_uri; - } - const std::string& QueryString() const { - return m_query_string; - } - const std::string& Protocol() const { - return m_protocol; - } - const std::string& Host() const { - return m_host; - } - int Port() const { - return m_port; - } - const std::string& Path() const { - return m_path; - } - const std::string& File() const { - return m_file; - } - const std::string& Extension() const { - return m_ext; - } - - const std::string& ToString() const { - return m_url; - } - - private: - std::string m_url; - std::string m_uri; - std::string m_query_string; - std::string m_protocol; - std::string m_host; - int m_port; - std::string m_path; - std::string m_file; - std::string m_ext; - }; - class Path - { - public: - Path(const std::string& ); - - const std::string& GetPath() const { - return m_path; - } - const std::string& GetFilename() const { - return m_file; - } - const std::string& GetExtension() const { - return m_ext; - } - - private: - std::string m_path; - std::string m_file; - std::string m_ext; - }; -public: - static std::string base64(const std::string& str_in); - static std::string base64d(const std::string& str_in); - static std::string l2string(long l); - static std::string bigint2string(int64_t l); - static std::string bigint2string(uint64_t l); - static uint64_t atoi64(const std::string& str); - static unsigned int hex2unsigned(const std::string& str); - static std::string rfc1738_encode(const std::string& src); - static std::string rfc1738_decode(const std::string& src); - - /** Checks whether a string is a valid ipv4/ipv6 ip number. */ - static bool isipv4(const std::string&); - /** Checks whether a string is a valid ipv4/ipv6 ip number. */ - static bool isipv6(const std::string&); - - /** Hostname to ip resolution ipv4, not asynchronous. */ - static bool u2ip(const std::string&, ipaddr_t&); - static bool u2ip(const std::string&, struct sockaddr_in& sa, int ai_flags = 0); - - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Hostname to ip resolution ipv6, not asynchronous. */ - static bool u2ip(const std::string&, struct in6_addr&); - static bool u2ip(const std::string&, struct sockaddr_in6& sa, int ai_flags = 0); - //#endif - //#endif - - /** Reverse lookup of address to hostname */ - static bool reverse(struct sockaddr *sa, socklen_t sa_len, std::string&, int flags = 0); - static bool reverse(struct sockaddr *sa, socklen_t sa_len, std::string& hostname, std::string& service, int flags = 0); - - static bool u2service(const std::string& name, int& service, int ai_flags = 0); - - /** Convert binary ip address to string: ipv4. */ - static void l2ip(const ipaddr_t,std::string& ); - static void l2ip(const in_addr&,std::string& ); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Convert binary ip address to string: ipv6. */ - static void l2ip(const struct in6_addr&,std::string& ,bool mixed = false); - - /** ipv6 address compare. */ - static int in6_addr_compare(in6_addr,in6_addr); - //#endif - //#endif - /** ResolveLocal (hostname) - call once before calling any GetLocal method. */ - static void ResolveLocal(); - /** Returns local hostname, ResolveLocal must be called once before using. - \sa ResolveLocal */ - static const std::string& GetLocalHostname(); - /** Returns local ip, ResolveLocal must be called once before using. - \sa ResolveLocal */ - static ipaddr_t GetLocalIP(); - /** Returns local ip number as string. - \sa ResolveLocal */ - static const std::string& GetLocalAddress(); - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - /** Returns local ipv6 ip. - \sa ResolveLocal */ - static const struct in6_addr& GetLocalIP6(); - /** Returns local ipv6 address. - \sa ResolveLocal */ - static const std::string& GetLocalAddress6(); - //#endif - //#endif - /** Get environment variable */ - static const std::string GetEnv(const std::string& name); - /** Set environment variable. - \param var Name of variable to set - \param value Value */ - static void SetEnv(const std::string& var,const std::string& value); - /** Convert sockaddr struct to human readable string. - \param sa Ptr to sockaddr struct */ - static std::string Sa2String(struct sockaddr *sa); - - /** Get current time in sec/microseconds. */ - static void GetTime(struct timeval *); - - static std::auto_ptr CreateAddress(struct sockaddr *,socklen_t); - - static unsigned long ThreadID(); - - static std::string ToLower(const std::string& str); - static std::string ToUpper(const std::string& str); - - static std::string ToString(double d); - - /** Returns a random 32-bit integer */ - static unsigned long Rnd(); - - static const char *Logo; - - static const std::string Stack(); - - /** Utf8 decrypt, encrypt. */ - static const std::string FromUtf8(const std::string& ); - static const std::string ToUtf8(const std::string&); - - /** File system stuff */ - static const Path CurrentDirectory(); - static bool ChangeDirectory(const Path& to_dir); - - /** wait a specified number of ms */ - static void Sleep(int ms); - -private: - static std::string m_host; ///< local hostname - static ipaddr_t m_ip; ///< local ip address - static std::string m_addr; ///< local ip address in string format - //#ifdef ENABLE_IPV6 - //#ifdef IPPROTO_IPV6 - static struct in6_addr m_local_ip6; ///< local ipv6 address - //#endif - static std::string m_local_addr6; ///< local ipv6 address in string format - //#endif - static bool m_local_resolved; ///< ResolveLocal has been called if true -}; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // _SOCKETS_Utility_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.cpp deleted file mode 100755 index 7147a1008a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/** - ** \file XmlDocument.cpp - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "XmlDocument.h" -#include "XmlException.h" - -#ifdef ENABLE_XML - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif -namespace Xml { - - -XmlDocument::XmlDocument(const std::string& filename,const std::string& verify_ns,const std::string& verify_root) -: m_doc(NULL) -, m_ok(false) -{ - xmlNodePtr cur; - xmlNsPtr ns; - - if (!(m_doc = xmlParseFile(filename.c_str() ))) - { - throw XmlException("Parse of file failed: " + filename); - } - if (!(cur = xmlDocGetRootElement(m_doc))) - { - xmlFreeDoc(m_doc); - m_doc = NULL; - throw XmlException("Document is empty: " + filename); - } - if (verify_ns.size()) - { - if (!(ns = xmlSearchNsByHref(m_doc, cur, (const xmlChar *) verify_ns.c_str() ))) - { - xmlFreeDoc(m_doc); - m_doc = NULL; - throw XmlException("Document namespace != " + verify_ns); - } - } - if (verify_root.size()) - { - if (xmlStrcmp(cur -> name, (const xmlChar *) verify_root.c_str() )) - { - xmlFreeDoc(m_doc); - m_doc = NULL; - throw XmlException("Document root != " + verify_root); - } - } - m_ok = true; -} - - -XmlDocument::~XmlDocument() -{ - if (m_doc) - { - xmlFreeDoc(m_doc); - } -} - - -XmlDocument::operator xmlDocPtr() -{ - return m_doc; -} - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif -#endif // ENABLE_XML diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.h deleted file mode 100755 index 11925e8540..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlDocument.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - ** \file XmlDocument.h - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _XmlDocument_H -#define _XmlDocument_H - -#include "sockets-config.h" - -#ifdef ENABLE_XML - -#include -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -namespace Xml -{ - - -class XmlDocument -{ -public: - XmlDocument(const std::string& filename,const std::string& verify_ns = "",const std::string& verify_root = ""); - virtual ~XmlDocument(); - - /** Document parse successful. */ - bool IsOk() { - return m_ok; - } - - operator xmlDocPtr(); - -protected: - XmlDocument(const XmlDocument& ) {} // copy constructor - -private: - XmlDocument& operator=(const XmlDocument& ) { - return *this; // assignment operator - } - - xmlDocPtr m_doc; - bool m_ok; -}; - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_XML - -#endif // _XmlDocument_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.cpp deleted file mode 100755 index 045994ae24..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/** - ** \file XmlException.cpp - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "XmlException.h" -#ifdef ENABLE_XML - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif -namespace Xml { - - -XmlException::XmlException(const std::string& descr) -:Exception(descr) -{ -} - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif -#endif // ENABLE_XML diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.h deleted file mode 100755 index 1504b27eb8..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlException.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - ** \file XmlException.h - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _XmlException_H -#define _XmlException_H - -#include "sockets-config.h" -#ifdef ENABLE_XML -#include "Exception.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -namespace Xml -{ - - -class XmlException : public Exception -{ -public: - XmlException(const std::string& descr); - - XmlException(const XmlException& x) : Exception(x) {} // copy constructor - -private: - XmlException& operator=(const XmlException& ) { - return *this; // assignment operator - } - -}; - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_XML -#endif // _XmlException_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.cpp deleted file mode 100755 index 881c09936f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.cpp +++ /dev/null @@ -1,357 +0,0 @@ -/** - ** \file XmlNode.cpp - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include "XmlNode.h" -#include "XmlDocument.h" -#include "XmlException.h" -#include "Utility.h" - -#ifdef ENABLE_XML - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif -namespace Xml { - - -XmlNode::XmlNode(XmlDocument& doc) -: m_doc(doc) -, m_current( GetRootElement() ) -{ -} - - -XmlNode::XmlNode(XmlDocument& doc, const std::string& nodepath) -: m_doc(doc) -, m_current( GetRootElement() ) -{ - xmlNodePtr p = GetFirstElement( nodepath ); - SetCurrent( p ); -} - - -XmlNode::XmlNode(const XmlNode& node, const std::string& nodepath) -: m_doc( node.GetDocument() ) -, m_current( node ) -{ - xmlNodePtr p = GetFirstElement( node, nodepath ); - SetCurrent( p ); -} - - -XmlNode::XmlNode(XmlDocument& doc, xmlNodePtr ptr) -: m_doc(doc) -, m_current( ptr ) -{ -} - - -XmlNode::XmlNode(xmlDocPtr doc, xmlNodePtr ptr) -: m_doc(doc) -, m_current( ptr ) -{ -} - - -XmlNode::~XmlNode() -{ -} - - -xmlNodePtr XmlNode::GetRootElement() const -{ - m_current = xmlDocGetRootElement(m_doc); - return m_current; -} - - -std::string XmlNode::GetProperty(const std::string& name) const -{ - xmlChar *p = m_current ? xmlGetProp(m_current, (const xmlChar *) name.c_str() ) : NULL; - if (!p) - { - throw XmlException( "Property '" + name + "' not found in node: " + GetNodeName() ); - } - std::string str = (char *)p; - xmlFree(p); - return Utility::FromUtf8(str); -} - - -bool XmlNode::PropertyExists(const std::string& name) const -{ - xmlChar *p = m_current ? xmlGetProp(m_current, (const xmlChar *) name.c_str() ) : NULL; - if (!p) - { - return false; - } - xmlFree(p); - return true; -} - - -xmlNodePtr XmlNode::GetChildrenNode() const -{ - m_current = m_current ? m_current -> xmlChildrenNode : NULL; - return m_current; -} - - -xmlNodePtr XmlNode::GetNextNode() const -{ - do - { - m_current = m_current ? m_current -> next : NULL; - } while (m_current && xmlIsBlankNode( m_current )); - return m_current; -} - - -const std::string& XmlNode::GetNodeName() const -{ - if (m_current) - { - m_current_name = Utility::FromUtf8((char *)m_current -> name); - } - else - { - m_current_name = ""; - } - return m_current_name; -} - - -const std::string& XmlNode::GetContent() const -{ - m_content = ""; - if (m_current) - { - xmlNodePtr p = m_current; - xmlNodePtr p2 = GetChildrenNode(); - if (p2 && p2 -> content) - { - m_content = Utility::FromUtf8((char *)p2 -> content); - } - SetCurrent(p); - } - return m_content; -} - - -xmlNsPtr XmlNode::GetNodeNs() const -{ - if (m_current) - return m_current -> ns; - return NULL; -} - - -const std::string& XmlNode::GetNodeNsPrefix() const -{ - if (m_current && m_current -> ns && m_current -> ns -> prefix) - { - m_ns_prefix = Utility::FromUtf8((char *)m_current -> ns -> prefix); - } - else - { - m_ns_prefix = ""; - } - return m_ns_prefix; -} - - -const std::string& XmlNode::GetNodeNsHref() const -{ - if (m_current && m_current -> ns && m_current -> ns -> href) - { - m_ns_href = Utility::FromUtf8((char *)m_current -> ns -> href); - } - else - { - m_ns_href = ""; - } - return m_ns_href; -} - - -xmlNodePtr XmlNode::GetFirstElement(const std::string& name) const -{ - if (m_lookup_name.empty()) - m_lookup_name = name; - GetRootElement(); - xmlNodePtr p = GetChildrenNode(); - while (p) - { - if (name == GetNodeName()) - { - return p; - } - p = GetNextNode(); - } - return NULL; -} - - -xmlNodePtr XmlNode::GetFirstElement(xmlNodePtr base,const std::string& name) const -{ - if (m_lookup_name.empty()) - m_lookup_name = name; - SetCurrent(base); - xmlNodePtr p = GetChildrenNode(); - while (p) - { - if (name == GetNodeName()) - { - return p; - } - p = GetNextNode(); - } - return NULL; -} - - -xmlNodePtr XmlNode::GetNextElement(xmlNodePtr p,const std::string& name) const -{ - SetCurrent(p); - p = GetNextNode(); - while (p) - { - if (name == GetNodeName()) - { - return p; - } - p = GetNextNode(); - } - return NULL; -} - - -XmlNode::operator xmlNodePtr() const -{ - return m_current; -} - - -XmlNode XmlNode::operator[](const std::string& name) const -{ - xmlNodePtr p0 = m_current; - xmlNodePtr p = GetFirstElement( m_current, name ); - SetCurrent( p0 ); - if (p) - return XmlNode( m_doc, p ); - throw XmlException("Didn't find node: " + name); -} - - -bool XmlNode::Exists(const std::string& name) const -{ - xmlNodePtr p0 = m_current; - xmlNodePtr p = GetFirstElement( m_current, name ); - SetCurrent( p0 ); - if (p) - return true; - return false; -} - - -void XmlNode::operator++() const -{ - GetNextNode(); - while (m_current) - { - if (m_lookup_name == GetNodeName()) - { - return; - } - GetNextNode(); - } -} - - -std::map XmlNode::GetNsMap() const -{ - xmlNsPtr *p = xmlGetNsList(m_doc, m_current); - std::map vec; - int i = 0; - while (p[i]) - { - std::string href = Utility::FromUtf8((char *)p[i] -> href); - std::string prefix = p[i] -> prefix ? Utility::FromUtf8((char *)p[i] -> prefix) : ""; - vec[prefix] = href; - ++i; - } - return vec; -} - - -std::map XmlNode::GetNsMapRe() const -{ - xmlNsPtr *p = xmlGetNsList(m_doc, m_current); - std::map vec; - int i = 0; - while (p[i]) - { - std::string href = Utility::FromUtf8((char *)p[i] -> href); - std::string prefix = p[i] -> prefix ? Utility::FromUtf8((char *)p[i] -> prefix) : ""; - vec[href] = prefix; - if (!p[i] -> next) - break; - ++i; - } - return vec; -} - - -const std::string XmlNode::FindProperty(const std::string& propname, bool climb) const -{ - while (m_current) - { - if (PropertyExists(propname)) - { - return GetProperty(propname); - } - if (!climb) - { - break; - } - m_current = m_current -> parent; - } - return ""; -} - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_XML diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.h deleted file mode 100755 index 2e78485de9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/XmlNode.h +++ /dev/null @@ -1,160 +0,0 @@ -/** - ** \file XmlNode.h - ** \date 2008-02-09 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2008-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _XmlNode_H -#define _XmlNode_H - -#include "sockets-config.h" - -#ifdef ENABLE_XML - -#include -#include -#include -#include - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -namespace Xml -{ - -class XmlDocument; - -class XmlNode -{ -public: - XmlNode() {} - XmlNode(XmlDocument&); - XmlNode(XmlDocument&, const std::string& nodepath); - XmlNode(const XmlNode&, const std::string& nodepath); - XmlNode(xmlDocPtr, xmlNodePtr ptr); - XmlNode(XmlDocument&, xmlNodePtr ptr); - ~XmlNode(); - - operator xmlNodePtr() const; - XmlNode operator[](const std::string& name) const; - operator std::string() const { - return GetContent(); - } - void operator++() const; - - xmlDocPtr GetDocument() const { - return m_doc; - } - - bool Valid() const { - return m_current ? true : false; - } - - /** Assign document root element to 'current node'. - \return Current Node */ - xmlNodePtr GetRootElement() const; - - /** Return property 'propname' for 'current node'. */ - std::string GetProperty(const std::string& propname) const; - bool PropertyExists(const std::string& propname) const; - - /** Assign first child node of 'current node' to 'current node'. - \return Current Node */ - xmlNodePtr GetChildrenNode() const; - - /** Assign next non-blank (xmlIsBlankNode) node of 'current node' to 'current node'. - \return Current Node */ - xmlNodePtr GetNextNode() const; - - /** Return nodename of 'current node'. */ - const std::string& GetNodeName() const; - /** Return content of 'current node'. */ - const std::string& GetContent() const; - - /** Sets 'current node' that the following methods act on: - GetProperty - GetNodeName - GetContent - GetNodeNs - GetNodeNsPrefix - GetNodeNsHref - */ - void SetCurrent(xmlNodePtr p) const { - m_current = p; - } - - /** \return Namespace of 'current node'. */ - xmlNsPtr GetNodeNs() const; - /** \return Namespace prefix of 'current node'. */ - const std::string& GetNodeNsPrefix() const; - /** \return Namespace href of 'current node'. */ - const std::string& GetNodeNsHref() const; - - /** Search element named 'name' in Root element child nodes. - Set 'current node' to Root element. */ - xmlNodePtr GetFirstElement(const std::string& name) const; - - /** Search element named 'name' in 'parent' element child nodes. - Set 'current node' to 'parent'. */ - xmlNodePtr GetFirstElement(xmlNodePtr parent,const std::string& name) const; - - /** Find next element named 'name' on same level as 'node'. - Set 'current node' to 'p'. */ - xmlNodePtr GetNextElement(xmlNodePtr node,const std::string& name) const; - - /** Check that child element with name 'name' exists. */ - bool Exists(const std::string& name) const; - - /** [prefix] = href */ - std::map GetNsMap() const; - - /** [href] = prefix */ - std::map GetNsMapRe() const; - - const std::string FindProperty(const std::string& propname, bool climb = false) const; - -private: - xmlDocPtr m_doc; - mutable xmlNodePtr m_current; - mutable std::string m_current_name; - mutable std::string m_ns_prefix; - mutable std::string m_ns_href; - mutable std::string m_content; - mutable std::string m_lookup_name; -}; - - -} -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // ENABLE_XML -#endif // _XmlNode_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ajp13.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ajp13.h deleted file mode 100755 index d60fe4786d..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/ajp13.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - ** \file ajp13.h - ** \date 2007-10-05 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_Ajp13_H -#define _SOCKETS_Ajp13_H - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - -#define HTTP_REQUEST_ACCEPT 0xa001 -#define HTTP_REQUEST_ACCEPT_CHARSET 0xa002 -#define HTTP_REQUEST_ACCEPT_ENCODING 0xa003 -#define HTTP_REQUEST_ACCEPT_LANGUAGE 0xa004 -#define HTTP_REQUEST_AUTHORIZATION 0xa005 -#define HTTP_REQUEST_CONNECTION 0xa006 -#define HTTP_REQUEST_CONTENT_TYPE 0xa007 -#define HTTP_REQUEST_CONTENT_LENGTH 0xa008 -#define HTTP_REQUEST_COOKIE 0xa009 -#define HTTP_REQUEST_COOKIE2 0xa00a -#define HTTP_REQUEST_HOST 0xa00b -#define HTTP_REQUEST_PRAGMA 0xa00c -#define HTTP_REQUEST_REFERER 0xa00d -#define HTTP_REQUEST_USER_AGENT 0xa00e - -#define HTTP_METHOD_OPTIONS 1 -#define HTTP_METHOD_GET 2 -#define HTTP_METHOD_HEAD 3 -#define HTTP_METHOD_POST 4 -#define HTTP_METHOD_PUT 5 -#define HTTP_METHOD_DELETE 6 -#define HTTP_METHOD_TRACE 7 -#define HTTP_METHOD_PROPFIND 8 -#define HTTP_METHOD_PROPPATCH 9 -#define HTTP_METHOD_MKCOL 10 -#define HTTP_METHOD_COPY 11 -#define HTTP_METHOD_MOVE 12 -#define HTTP_METHOD_LOCK 13 -#define HTTP_METHOD_UNLOCK 14 -#define HTTP_METHOD_ACL 15 -#define HTTP_METHOD_REPORT 16 -#define HTTP_METHOD_VERSION_CONTROL 17 // with a dash "VERSION-CONTROL" -#define HTTP_METHOD_CHECKIN 18 -#define HTTP_METHOD_CHECKOUT 19 -#define HTTP_METHOD_UNCHECKOUT 20 -#define HTTP_METHOD_SEARCH 21 -#define HTTP_METHOD_MKWORKSPACE 22 -#define HTTP_METHOD_UPDATE 23 -#define HTTP_METHOD_LABEL 24 -#define HTTP_METHOD_MERGE 25 -#define HTTP_METHOD_BASELINE_CONTROL 26 -#define HTTP_METHOD_MKACTIVITY 27 - -#define ATTR_CONTEXT 1 -#define ATTR_SERVLET_PATH 2 -#define ATTR_REMOTE_USER 3 -#define ATTR_AUTH_TYPE 4 -#define ATTR_QUERY_STRING 5 -#define ATTR_ROUTE 6 -#define ATTR_SSL_CERT 7 -#define ATTR_SSL_CIPHER 8 -#define ATTR_SSL_SESSION 9 -#define ATTR_SSL_KEY_SIZE 11 -#define ATTR_SECRET 12 -#define ATTR_STORED_METHOD 13 - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - -#endif // _SOCKETS_Ajp13_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/gpl.txt b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/gpl.txt deleted file mode 100755 index 5b6e7c66c2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/gpl.txt +++ /dev/null @@ -1,340 +0,0 @@ - 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) - - 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) year 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. diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/mkdot.sh b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/mkdot.sh deleted file mode 100755 index 9999aff0f6..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/mkdot.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -PROJECT_DIR=/usr/local/apache/www.alhem.net/htdocs/Sockets -PROJECT_NAME=sockets -/usr/local/bin/dp \ - -D_RUN_DP \ - -DUSE_SCTP -D_THREADSAFE_SOCKETS \ - -DHAVE_OPENSSL -DENABLE_POOL -DENABLE_RECONNECT -DENABLE_SOCKS4 \ - -DENABLE_IPV6 -DENABLE_DETACH -DENABLE_RESOLVER -DENABLE_TRIGGERS \ - -DENABLE_XML \ - -fontsize 12 \ - -lr -dot -cluster | grep -v std > x.dot -dot -Tpng -o $PROJECT_DIR/sockets.png x.dot -dot -Tcmapx -o $PROJECT_DIR/sockets.cmap x.dot -/usr/local/bin/mkjs $PROJECT_DIR/$PROJECT_NAME.cmap > $PROJECT_DIR/$PROJECT_NAME.js diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc deleted file mode 100755 index 51f6953f2d..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/usr -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: libSockets -Description: C++ Sockets Library -Version: 2.3.9.4 -Requires: libxml-2.0, libssl -Libs: -L${libdir} -lSockets -Libs.private: -lpthread -Cflags: -I${includedir} diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc.IN b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc.IN deleted file mode 100755 index 05b625f55f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libSockets.pc.IN +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/usr -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: lib%NAME% -Description: C++ Sockets Library -Version: %VERSION% -Requires: libxml-2.0, libssl -Libs: -L${libdir} -l%NAME% -Libs.private: -lpthread -Cflags: -I${includedir} diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc deleted file mode 100755 index d4db1c93c9..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/usr -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: libsockets2 -Description: C++ Sockets Library -Version: 2.3.9.4 -Requires: -Libs: -L${libdir} -lSockets -Libs.private: -lssl -lcrypto -lxml2 -lpthread -Cflags: -I${includedir} diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc.IN b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc.IN deleted file mode 100755 index aa7af6b57b..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/pkgconfig/libsockets2.pc.IN +++ /dev/null @@ -1,12 +0,0 @@ -prefix=/usr -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: libsockets2 -Description: C++ Sockets Library -Version: %VERSION% -Requires: -Libs: -L${libdir} -l%NAME% -Libs.private: -lssl -lcrypto -lxml2 -lpthread -Cflags: -I${includedir} diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.cpp deleted file mode 100755 index c608238207..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/** \file socket_include.cpp - ** \date 2004-11-28 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#include -#include "socket_include.h" - -// only to be included in win32 projects -const char *StrError(int x) -{ -static char tmp[100]; - switch (x) - { - case 10004: return "Interrupted function call."; - case 10013: return "Permission denied."; - case 10014: return "Bad address."; - case 10022: return "Invalid argument."; - case 10024: return "Too many open files."; - case 10035: return "Resource temporarily unavailable."; - case 10036: return "Operation now in progress."; - case 10037: return "Operation already in progress."; - case 10038: return "Socket operation on nonsocket."; - case 10039: return "Destination address required."; - case 10040: return "Message too long."; - case 10041: return "Protocol wrong type for socket."; - case 10042: return "Bad protocol option."; - case 10043: return "Protocol not supported."; - case 10044: return "Socket type not supported."; - case 10045: return "Operation not supported."; - case 10046: return "Protocol family not supported."; - case 10047: return "Address family not supported by protocol family."; - case 10048: return "Address already in use."; - case 10049: return "Cannot assign requested address."; - case 10050: return "Network is down."; - case 10051: return "Network is unreachable."; - case 10052: return "Network dropped connection on reset."; - case 10053: return "Software caused connection abort."; - case 10054: return "Connection reset by peer."; - case 10055: return "No buffer space available."; - case 10056: return "Socket is already connected."; - case 10057: return "Socket is not connected."; - case 10058: return "Cannot send after socket shutdown."; - case 10060: return "Connection timed out."; - case 10061: return "Connection refused."; - case 10064: return "Host is down."; - case 10065: return "No route to host."; - case 10067: return "Too many processes."; - case 10091: return "Network subsystem is unavailable."; - case 10092: return "Winsock.dll version out of range."; - case 10093: return "Successful WSAStartup not yet performed."; - case 10101: return "Graceful shutdown in progress."; - case 10109: return "Class type not found."; - case 11001: return "Host not found."; - case 11002: return "Nonauthoritative host not found."; - case 11003: return "This is a nonrecoverable error."; - case 11004: return "Valid name, no data record of requested type."; - - default: - break; - } - snprintf(tmp, sizeof(tmp), "Winsock error code: %d", x); - return tmp; -} - - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.h deleted file mode 100755 index 2660230670..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/socket_include.h +++ /dev/null @@ -1,305 +0,0 @@ -/** \file socket_include.h - ** \date 2005-04-12 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2004-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_socket_include_H -#define _SOCKETS_socket_include_H -#include "sockets-config.h" - -#ifdef _MSC_VER -#pragma warning(disable:4514) -#endif - -// common defines affecting library and applications using library - -/* Define SOCKETS_DYNAMIC_TEMP to use dynamically allocated buffers - in read operations - helps on ECOS */ -#define SOCKETS_DYNAMIC_TEMP - -/** define type to uniquely identify a socket instance. */ -typedef unsigned long socketuid_t; - -// platform specific stuff -#if (defined(__unix__) || defined(unix)) && !defined(USG) -#include -#endif -#include - -// int64 -#ifdef _WIN32 -typedef unsigned __int64 uint64_t; -#else -#include -#ifdef SOLARIS -# include -#else -# include -#endif -#endif - -#ifndef _WIN32 -// ---------------------------------------- -// common unix includes / defines -#include -#include -#include -#include -#include - -// all typedefs in this file will be declared outside the sockets namespace, -// because some os's will already have one or more of the type defined. -typedef int SOCKET; -#define Errno errno -#define StrError strerror - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -// WIN32 adapt -#define closesocket close -#define INVALID_SOCKET -1 -#define SOCKET_ERROR -1 - -#ifndef INADDR_NONE -#define INADDR_NONE ((unsigned long) -1) -#endif // INADDR_NONE - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#endif // !_WIN32 - - -// ---------------------------------------- -// Generic -#ifndef SOL_IP -#define SOL_IP IPPROTO_IP -#endif - - -// ---------------------------------------- -// OS specific adaptions - -#ifdef SOLARIS -// ---------------------------------------- -// Solaris -typedef unsigned short port_t; -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -// no defs - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#define s6_addr16 _S6_un._S6_u8 -#define MSG_NOSIGNAL 0 - -#elif defined __FreeBSD__ -// ---------------------------------------- -// FreeBSD -# if __FreeBSD_version >= 400014 -# define s6_addr16 __u6_addr.__u6_addr16 -# if !defined(MSG_NOSIGNAL) -# define MSG_NOSIGNAL 0 -# endif -# include -typedef in_addr_t ipaddr_t; -typedef in_port_t port_t; -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -// no defs - -#ifdef SOCKETS_NAMESPACE -} -#endif - -# define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP -# define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP -# else -# error FreeBSD versions prior to 400014 does not support ipv6 -# endif - -#elif defined MACOSX -// ---------------------------------------- -// Mac OS X -//#include -#ifdef __DARWIN_UNIX03 -typedef unsigned short port_t; -#else -#include -#endif // __DARWIN_UNIX03 -typedef unsigned long ipaddr_t; -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -// no defs - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#define s6_addr16 __u6_addr.__u6_addr16 -#define MSG_NOSIGNAL 0 // oops - thanks Derek -#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP -#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP - -#elif defined _WIN32 -// ---------------------------------------- -// Win32 -#ifdef _MSC_VER -#pragma comment(lib, "wsock32.lib") -#endif -#define strcasecmp _stricmp -#ifndef __CYGWIN__ -#define snprintf sprintf_s -#define vsnprintf vsprintf_s -#endif - -typedef unsigned long ipaddr_t; -typedef unsigned short port_t; -typedef int socklen_t; -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -// no defs - -#ifdef SOCKETS_NAMESPACE -} -#endif - -// 1.8.6: define FD_SETSIZE to something bigger than 64 if there are a lot of -// simultaneous connections (must be done before including winsock.h) -//#define FD_SETSIZE 1024 - -// windows 2000 with ipv6 preview installed: -// http://msdn.microsoft.com/downloads/sdks/platform/tpipv6.asp -// see the FAQ on how to install -#define WIN32_LEAN_AND_MEAN -#include -#include -#if _MSC_VER < 1200 -#ifndef __CYGWIN__ -#ifdef ENABLE_IPV6 -#include // For IPv6 Tech Preview. -#endif -#endif -#endif // _MSC_VER < 1200 - - -#define MSG_NOSIGNAL 0 -//#define SHUT_RDWR 2 -#define SHUT_WR 1 - -#define Errno WSAGetLastError() -const char *StrError(int x); - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif - - -// class WSAInitializer is a part of the Socket class (on win32) -// as a static instance - so whenever an application uses a Socket, -// winsock is initialized -class WSAInitializer // Winsock Initializer -{ -public: - WSAInitializer() { - if (WSAStartup(0x101,&m_wsadata)) { - exit(-1); - } - } - ~WSAInitializer() { - WSACleanup(); - } -private: - WSADATA m_wsadata; -}; - -#ifdef SOCKETS_NAMESPACE -} -#endif - -#else -// ---------------------------------------- -// LINUX -typedef unsigned long ipaddr_t; -typedef unsigned short port_t; -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -// no defs - -#ifdef SOCKETS_NAMESPACE -} -#endif - - -#endif - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE -{ -#endif -/** List type containing file descriptors. */ -typedef std::list socket_v; - - -#ifdef SOCKETS_NAMESPACE -} -#endif - - -// getaddrinfo / getnameinfo replacements -#ifdef NO_GETADDRINFO -#ifndef AI_NUMERICHOST -#define AI_NUMERICHOST 1 -#endif -#ifndef NI_NUMERICHOST -#define NI_NUMERICHOST 1 -#endif -#endif - - -#endif // _SOCKETS_socket_include_H - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/sockets-config.h b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/sockets-config.h deleted file mode 100755 index f85272ff90..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/sockets-config.h +++ /dev/null @@ -1,110 +0,0 @@ -/** - ** \file sockets-config.h - ** \date 2007-04-14 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007-2010 Anders Hedstrom - -This library is made available under the terms of the GNU GPL, with -the additional exemption that compiling, linking, and/or using OpenSSL -is allowed. - -If you would like to use this library in a closed-source application, -a separate license agreement is available. For information about -the closed-source license agreement for the C++ sockets library, -please visit http://www.alhem.net/Sockets/license.html and/or -email license@alhem.net. - -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. -*/ -#ifndef _SOCKETS_CONFIG_H -#define _SOCKETS_CONFIG_H - -/* Limits */ -#define TCP_LINE_SIZE 8192 -#define MAX_HTTP_HEADER_COUNT 200 - -#ifndef _RUN_DP -/* First undefine symbols if already defined. */ -#undef HAVE_OPENSSL -#undef ENABLE_IPV6 -#undef USE_SCTP -#undef NO_GETADDRINFO -#undef ENABLE_POOL -#undef ENABLE_SOCKS4 -#undef ENABLE_RESOLVER -#undef ENABLE_RECONNECT -#undef ENABLE_DETACH -#undef ENABLE_EXCEPTIONS -#undef ENABLE_XML -#endif // _RUN_DP - - -/* OpenSSL support. */ -//#define HAVE_OPENSSL - - -/* Ipv6 support. */ -#define ENABLE_IPV6 - - -/* SCTP support. */ -//#define USE_SCTP - - -/* Define NO_GETADDRINFO if your operating system does not support - the "getaddrinfo" and "getnameinfo" function calls. */ -#define NO_GETADDRINFO - - -/* Connection pool support. */ -//#define ENABLE_POOL - - -/* Socks4 client support. */ -//#define ENABLE_SOCKS4 - - -/* Asynchronous resolver. */ -#define ENABLE_RESOLVER - - -/* Enable TCP reconnect on lost connection. - Socket::OnReconnect - Socket::OnDisconnect -*/ -#define ENABLE_RECONNECT - - -/* Enable socket thread detach functionality. */ -#define ENABLE_DETACH - - -/* Enabled exceptions. */ -#define ENABLE_EXCEPTIONS - - -/* XML classes. */ -//#define ENABLE_XML - - -/* Resolver uses the detach function so either enable both or disable both. */ -#ifndef ENABLE_DETACH -#undef ENABLE_RESOLVER -#endif - - -#endif // _SOCKETS_CONFIG_H diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/Makefile b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/Makefile deleted file mode 100755 index f3b8904287..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/Makefile +++ /dev/null @@ -1,95 +0,0 @@ -SOCKETS = .. -PLATFORM = linux-x86-32 -LIBS = -#-L$(SOCKETS) -lSockets - -INCLUDE = -I$(SOCKETS) -include $(SOCKETS)/Makefile.version -include $(SOCKETS)/Makefile.Defines.$(PLATFORM) - -CPPFLAGS = $(CFLAGS) - -#LIBS += -lsctp - -LDFLAGS += -rdynamic - -PROGS = events resolve sockets_test base64 semtest \ - echoserver stressclient http httpd retry resume \ - http_post x copy crlf https sloppy_http chunked \ - threadstress listener httpd_test scanr json - -all: $(PROGS) - -events: events.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -resolve: resolve.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -sockets_test: sockets_test.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -base64: base64.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -semtest: semtest.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -echoserver: echoserver.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -stressclient: stressclient.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -http: http.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -httpd: httpd.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -retry: retry.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -resume: resume.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -http_post: http_post.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -x: x.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -copy: copy.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -crlf: crlf.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -https: https.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -sloppy_http: sloppy_http.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -chunked: chunked.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -threadstress: threadstress.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -listener: listener.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -scanr: scanr.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -httpd_test: httpd_test.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -json: json.o ../libSockets.a - $(CXX) -o $@ $^ $(LIBS) $(LDFLAGS) - -clean: - rm -f *.o *~ slask *.d $(PROGS) - --include *.d diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/base64.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/base64.cpp deleted file mode 100755 index b7e5456a9f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/base64.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include - -#include "Base64.h" - - -int main(int argc,char *argv[]) -{ - if (argc < 2) - return -1; - std::string str; - std::string str2; - Base64 b; - if (!strcmp(argv[1],"-file")) - { - if (argc < 3) - return -2; - FILE *fil; - if ((fil = fopen(argv[2],"rt")) != NULL) - { - b.encode(fil, str); - fclose(fil); - } - printf("File:\n%s\n--End of File\n",str.c_str()); - b.decode(str, str2); - printf("Content:\n%s\n--End of Content\n",str2.c_str()); - } - else - { - b.encode(argv[1], strlen(argv[1]), str); - printf("'%s' ==> '%s'",argv[1], str.c_str()); - b.decode(str, str2); - printf(" ==> '%s'\n",str2.c_str()); - } -} diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/chunked.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/chunked.cpp deleted file mode 100755 index 32d6189d52..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/chunked.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include -#include -#include - - -class Server : public TcpSocket -{ -public: - Server(ISocketHandler& h) : TcpSocket(h), m_header(true) { - SetLineProtocol(); - } - - void OnLine(const std::string& line) { - if (m_header && line.empty()) - { - m_header = false; - Send("HTTP/1.1 200 OK\r\n" -// "Server: Microsoft-IIS/5.0\r\n" -// "Date: Mon, 15 Aug 2005 11:39:18 GMT\r\n" - "Content-Type: text/html\r\n" -// "Set-Cookie: ASPSESSIONIDASTATTTA=PIMPPEJBIMEGJLHOBNPHMIDC; path=/\r\n" -// "Cache-control: private\r\n" - "Transfer-Encoding: chunked\r\n" - "\r\n" - "a\r\n" - "XXXXXXXXXX\r\n" - "a\r\n" - "XXXXXXXXXX\r\n" - "a\r\n" - "XXXXXXXXXX\r\n" - "a\r\n" - "XXXXXXXXXX\r\n" - "a\r\n" - "XXXXXXXXXX\r\n" - "0\r\n" - "\r\n"); - } - } - -private: - bool m_header; -}; - - -int main() -{ - SocketHandler h; - ListenSocket l(h); - try - { - l.Bind(12345); - h.Add(&l); - while (true) - { - h.Select(1, 0); - } - } - catch (const Exception& e) - { - std::cout << e.ToString() << std::endl; - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/copy.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/copy.cpp deleted file mode 100755 index 2134ac26a2..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/copy.cpp +++ /dev/null @@ -1,264 +0,0 @@ -#include -#include -#include -#include - -#define BUFSZ 7024 - -#ifdef _WIN32 -#define MIN(a,b) (a 0 && GetOutputLength() < lim) - { - SendBuf(buf, n); - m_sz -= n; - n = MIN(m_sz, BUFSZ); - } - if (!n) - { - SetCloseAndDelete(); - } - else - { - SendBuf(buf, n); - m_sz -= n; - } - return; - } - size_t x = 0; - for (size_t i = 0; i < m_filename.size(); i++) - if (m_filename[i] == '/') - x = i + 1; - Send(m_filename.substr(x) + "\n"); - m_fil = fopen(m_filename.c_str(), "rb"); - if (m_fil) - { - char buf[BUFSZ]; - int n = fread(buf, 1, BUFSZ, m_fil); - while (n > 0 && GetOutputLength() < lim) - { - SendBuf(buf, n); - n = fread(buf, 1, BUFSZ, m_fil); - } - if (!n) - { - SetCloseAndDelete(); - fclose(m_fil); - m_fil = NULL; - } - else - { - SendBuf(buf, n); - } - } - } - - void OnWriteComplete() { - } - - void OnTransferLimit() { - if (!m_filename.size()) - { - char buf[BUFSZ]; - int n = MIN(m_sz, BUFSZ); - while (n > 0 && GetOutputLength() < lim) - { - SendBuf(buf, n); - m_sz -= n; - n = MIN(m_sz, BUFSZ); - } - if (!n) - { - SetCloseAndDelete(); - } - else - { - SendBuf(buf, n); - m_sz -= n; - } - return; - } - if (m_fil) - { - char buf[BUFSZ]; - int n = fread(buf, 1, BUFSZ, m_fil); - while (n > 0 && GetOutputLength() < lim) - { - SendBuf(buf, n); - n = fread(buf, 1, BUFSZ, m_fil); - } - if (!n) - { - SetCloseAndDelete(); - fclose(m_fil); - m_fil = NULL; - } - else - { - SendBuf(buf, n); - } - } - } - - void OnAccept() { - Utility::GetTime(&m_start); - m_b_server = true; - SetLineProtocol(); - DisableInputBuffer(); - } - - void OnLine(const std::string& line) { - if (line.size()) - m_out = fopen(line.c_str(), "wb"); - SetLineProtocol(false); - DisableInputBuffer(); - } - - void OnDelete() { - struct timeval stop; - Utility::GetTime(&stop); - stop.tv_sec -= m_start.tv_sec; - stop.tv_usec -= m_start.tv_usec; - if (stop.tv_usec < 0) - { - stop.tv_usec += 1000000; - stop.tv_sec -= 1; - } - double t = stop.tv_usec; - t /= 1000000; - t += stop.tv_sec; - printf("OnDelete: %s\n", m_b_server ? "SERVER" : "CLIENT"); - printf(" Time: %ld.%06ld (%f)\n", stop.tv_sec, stop.tv_usec, t); - double r = GetBytesReceived(); - printf(" bytes in: %lld (%f Mbytes/sec)\n", GetBytesReceived(), r / t / 1000000); - double s = GetBytesSent(); - printf(" bytes out: %lld (%f Mbytes/sec)\n", GetBytesSent(), s / t / 1000000); - printf("\n"); - if (m_out) - fclose(m_out); - } - - void OnRawData(const char *buf, size_t len) { - if (m_out) - fwrite(buf, 1, len, m_out); - } - -private: - std::string m_filename; - FILE *m_fil; - FILE *m_out; - bool m_b_server; - struct timeval m_start; - size_t m_sz; -}; - - -int main(int argc, char *argv[]) -{ - std::string host = "127.0.0.1"; - int port = 12344; - std::list filenames; - - for (int i = 1; i < argc; i++) - { - if (!strcmp(argv[i], "-host") && i < argc - 1) - host = argv[++i]; - else - if (!strcmp(argv[i], "-port") && i < argc - 1) - port = atoi(argv[++i]); - else - if (!strcmp(argv[i], "-h")) - { - fprintf(stderr, "Usage: %s [-host ] [-port ] []\n", *argv); - fprintf(stderr, " Will run as host only if isn't specified.\n"); - fprintf(stderr, " host default: 127.0.0.1\n"); - fprintf(stderr, " port default: 12344\n"); - return 0; - } - else - { - filenames.push_back( argv[i] ); - } - } - - try - { - SocketHandler h; - ListenSocket l(h); - if (filenames.empty()) - { - if (l.Bind( port ) != 0) - { - fprintf(stderr, "Bind() port %d failed - exiting\n", port); - return -1; - } - h.Add(&l); - } - for (std::list::iterator it = filenames.begin(); it != filenames.end(); it++) - { - std::string filename = *it; - size_t sz = atol(filename.c_str()); - if (sz) - { - CopySocket *sock = new CopySocket(h, sz); - sock -> SetDeleteByHandler(); - sock -> Open(host, port); - h.Add(sock); - } - else - { - CopySocket *sock = new CopySocket(h, filename); - sock -> SetDeleteByHandler(); - sock -> Open(host, port); - h.Add(sock); - } - } - if (!filenames.size()) - { - fprintf(stderr, "Starting as server only, listening on port %d\n", port); - quit++; - } - while (quit > 0) - { - h.Select(5, 0); - } - return 0; - } - catch (const Exception& e) - { - printf("%s\n", e.ToString().c_str()); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/crlf.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/crlf.cpp deleted file mode 100755 index 34500c48cb..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/crlf.cpp +++ /dev/null @@ -1,139 +0,0 @@ -#include -#include -#include - - -static bool quit = false; - - -class IOSocket : public TcpSocket -{ -public: - IOSocket(ISocketHandler& h) : TcpSocket(h) { - SetLineProtocol(); - } - ~IOSocket() {} - - void OnConnect() { - Utility::GetTime(&m_start); - while (GetOutputLength() < 500000) - { - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - } -// Send("\r\n"); - } - - void OnAccept() { - SetLineProtocol(); - } - - void OnDelete() { - printf("OnDelete\n"); - } - - void OnWriteComplete() { -printf("OnWriteComplete\n"); - struct timeval tv; - Utility::GetTime(&tv); - - tv.tv_sec -= m_start.tv_sec; - tv.tv_usec -= m_start.tv_usec; - Utility::GetTime(&m_start); - if (tv.tv_usec < 0) - { - tv.tv_usec += 1000000; - tv.tv_sec -= 1; - } - double t = tv.tv_usec; - t /= 1000000; - t += tv.tv_sec; - printf(" Time: %ld.%06ld (%f)\n", tv.tv_sec, tv.tv_usec, t); - double r = GetBytesReceived(); - printf(" bytes in: %lld (%f Mbytes/sec)\n", GetBytesReceived(true), r / t / 1000000); - double s = GetBytesSent(); - printf(" bytes out: %lld (%f Mbytes/sec)\n", GetBytesSent(true), s / t / 1000000); - printf("\n"); - - while (GetOutputLength() < 500000) - { - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk54\r\n"); - Send("zzzzzzzzzmmmmmmmmm1234lkkk543\r\n"); - } -// Send("\r\n"); - } - - void OnLine(const std::string& line) { - if (line == "") - { - struct timeval tv; - Utility::GetTime(&tv); - - tv.tv_sec -= m_start.tv_sec; - tv.tv_usec -= m_start.tv_usec; - Utility::GetTime(&m_start); - if (tv.tv_usec < 0) - { - tv.tv_usec += 1000000; - tv.tv_sec -= 1; - } - double t = tv.tv_usec; - t /= 1000000; - t += tv.tv_sec; - printf(" Time: %ld.%06ld (%f)\n", tv.tv_sec, tv.tv_usec, t); - double r = GetBytesReceived(); - printf(" bytes in: %lld (%f Mbytes/sec)\n", GetBytesReceived(true), r / t / 1000000); - double s = GetBytesSent(); - printf(" bytes out: %lld (%f Mbytes/sec)\n", GetBytesSent(true), s / t / 1000000); - printf("\n"); - - } - else - if (line != "zzzzzzzzzmmmmmmmmm1234lkkk54" && - line != "zzzzzzzzzmmmmmmmmm1234lkkk543") - { -printf("\n-------------------------------------------------------\n"); - for (size_t i = 0; i < line.size(); i++) - if (!isprint(line[i])) - printf("<%d>", line[i]); - else - printf("%c", line[i]); - printf("\n"); -fflush(stdout); -exit(-1); - quit = true; - } - } - - struct timeval m_start; -}; - - -int main(int argc, char *argv[]) -{ - SocketHandler h; - ListenSocket l(h); - l.Bind(12344); - h.Add(&l); - IOSocket sock(h); - sock.Open("192.168.7.4", 12344); - h.Add(&sock); - while (!quit) - { - h.Select(1, 0); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/echoserver.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/echoserver.cpp deleted file mode 100755 index 35c23d0636..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/echoserver.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/** - ** \file echoserver.cpp - ** \date 2006-10-02 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2006 Anders Hedstrom - -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. -*/ -#ifdef _WIN32 -#pragma warning(disable:4786) -#endif -#include -#include -#include -#include -#ifndef _WIN32 -#include -#endif -#include - - -#ifdef ENABLE_DETACH -static bool g_b_detach = false; -#endif -#ifdef HAVE_OPENSSL -static bool g_b_ssl = false; -#endif -static std::string gFilename = "server.pem"; -static std::string gPw; -static bool quit = false; -static bool g_b_http = false; -static bool g_b_nobuf = false; -#ifdef ENABLE_DETACH -static bool g_b_detach2 = false; -#endif - -#define DEB(x) - - -class MySocket : public TcpSocket -{ -public: - MySocket(ISocketHandler& h) : TcpSocket(h) { - SetLineProtocol(); -#ifdef HAVE_OPENSSL - if (g_b_ssl) - EnableSSL(); -#endif - if (g_b_nobuf) - DisableInputBuffer(); - } - ~MySocket() { - } - - void OnAccept() { -#ifdef ENABLE_DETACH - if (g_b_detach) - { - if (!Detach()) - fprintf(stderr, "\nDetach failed\n"); - } -#endif - } - - void OnRawData(const char *buf,size_t len) { - if (g_b_nobuf) - { - SendBuf(buf, len); - } - } - - void OnLine(const std::string& line) { -#ifdef ENABLE_DETACH - if (g_b_detach2 && !IsDetach()) - { - m_line = line; - if (!Detach()) - { - fprintf(stderr, "\nDetach failed\n"); - } - return; - } -DEB(printf("fd %d OnLine; %s\n", GetSocket(), Handler().IsSlave() ? "slave" : "master");) -#endif - Send(line + "\n"); - } - - void OnDetached() { -DEB(printf("fd %d OnDetached; %s\n", GetSocket(), Handler().IsSlave() ? "slave" : "master");) -// fprintf(stderr, "-"); -// fflush(stderr); -#ifdef ENABLE_DETACH - if (g_b_detach2) - { - Send(m_line + "\n"); - } -#endif - } - -#ifdef HAVE_OPENSSL - void InitSSLServer() { - InitializeContext("echoserver", gFilename, gPw, SSLv23_method()); - } -#endif - -private: - std::string m_line; -}; - - -#ifndef _WIN32 -void sigint(int) -{ - quit = true; -} -#endif - -int main(int argc,char *argv[]) -{ -#ifndef _WIN32 - signal(SIGPIPE, SIG_IGN); - signal(SIGINT, sigint); -#endif - port_t port = 2222; - bool enableLog = false; - int queue = 20; - for (int i = 1; i < argc; i++) - { -#ifdef ENABLE_DETACH - if (!strcmp(argv[i], "-detach")) - g_b_detach = true; - if (!strcmp(argv[i], "-detach2")) - g_b_detach2 = true; -#endif -#ifdef HAVE_OPENSSL - if (!strcmp(argv[i], "-ssl")) - g_b_ssl = true; - if (!strcmp(argv[i], "-file") && i < argc - 1) - gFilename = argv[++i]; -#endif - if (!strcmp(argv[i], "-port") && i < argc - 1) - port = atoi(argv[++i]); - if (!strcmp(argv[i], "-pw") && i < argc - 1) - gPw = argv[++i]; - if (!strcmp(argv[i], "-log")) - enableLog = true; - if (!strcmp(argv[i], "-queue") && i < argc - 1) - queue = atoi(argv[++i]); - if (!strcmp(argv[i], "-http")) - g_b_http = true; - if (!strcmp(argv[i], "-nobuf")) - g_b_nobuf = true; - if (!strcmp(argv[i], "-h")) - { - printf("Usage: %s [ options ] [-ssl]\n", *argv); - printf(" -port nn listen on port nn\n"); -#ifdef ENABLE_DETACH - printf(" -detach detach each socket on accept\n"); - printf(" -detach2 detach when line received\n"); -#endif -#ifdef HAVE_OPENSSL - printf(" -ssl run as ssl server, .pem file needed\n"); - printf(" -file xx .pem filename, default is \"server.pem\"\n"); -#endif - printf(" -pw xx private key password\n"); - printf(" -log enable sockethandler debug log\n"); - printf(" -queue nn listen queue size (default 20)\n"); - printf(" -http enable http server with dummy response\n"); - printf(" -nobuf echo raw data\n"); - exit(-1); - } - } - if (g_b_http && g_b_nobuf) - { - printf("Nobuf and Http does not work together\n"); - exit(-1); - } - StdoutLog *log = enableLog ? new StdoutLog() : NULL; - SocketHandlerEp h(log); - ListenSocket l(h); - ListenSocket l2(h); - h.SetNumberOfThreads(10); - if (!g_b_http) - { - if (l.Bind(port, queue)) - { - fprintf(stderr, "Bind to port %d failed\n", port); - return -1; - } - fprintf(stderr, "Listening on port %d\n", port); - h.Add(&l); - } - else - { - printf("Enable HttpDebugSocket\n"); - if (l2.Bind(port, queue)) - { - fprintf(stderr, "Bind to port %d failed\n", port); - return -1; - } - fprintf(stderr, "Listening on port %d\n", port); - h.Add(&l2); - } -#ifdef ENABLE_DETACH - if (g_b_detach) - fprintf(stderr, "Will detach each incoming socket\n"); -#endif -#ifdef HAVE_OPENSSL - if (g_b_ssl) - fprintf(stderr, "Using SSL\n"); -#endif - while (!quit) - { - h.Select(1, 0); - } - fprintf(stderr, "\nExiting...\n"); - if (log) - { -// delete log; - } - return 0; -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/events.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/events.cpp deleted file mode 100755 index f92ecd58c8..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/events.cpp +++ /dev/null @@ -1,217 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - - -double start; - -double gettime() -{ - struct timeval tv; - Utility::GetTime(&tv); - return tv.tv_sec + (double)tv.tv_usec / 1000000; -} - - -class MyEvHandler : public EventHandler -{ -public: - MyEvHandler() : EventHandler() {} - MyEvHandler(StdLog *p) : EventHandler(p) {} - -}; - - -class EvThread : public Thread -{ -public: - EvThread(Socket *p) : m_socket(p) {} - - void Run(); - -private: - Socket *m_socket; -}; - - -class EvSocket : public TcpSocket, public IEventOwner -{ -public: - EvSocket(ISocketHandler& h) : TcpSocket(h) - , IEventOwner( static_cast(h) ) { - } - - void OnEvent(int id) { - std::cout << "OnEvent" << std::endl; - std::cout << gettime() - start << std::endl; - SetCloseAndDelete(); - } - - void OnAccept() { - std::cout << "Incoming" << std::endl; - } - - void OnConnect() { - std::cout << "Connected" << std::endl; - EvThread *thr = new EvThread( this ); - thr -> SetDeleteOnExit(); - } - - void OnDelete() { - std::cout << "EvSocket::OnDelete()" << std::endl; - } -}; - - -void EvThread::Run() -{ - Socket *p0 = (Socket *)m_socket; - EvSocket *p = dynamic_cast(p0); - if (p) - { -#ifdef _WIN32 - Sleep( 5000 ); -#else - sleep(10); -#endif - std::cout << "Add event" << std::endl; - start = gettime(); - p -> AddEvent(1, 50000); - } - else - { - std::cout << "Thread: not an EvSocket" << std::endl; - } -} - - -//------------------------------------------------------------ -// myTimer class -//------------------------------------------------------------ -class myTimer : public IEventOwner -{ -public: - // Prototype of user call back function - typedef void (*myTimer_cb)(myTimer* user_func, void* user_id); - - myTimer(IEventHandler& h, long ssec, long susec, - long psec, long pusec, myTimer_cb func, void* id); - ~myTimer(); - -private: - void OnEvent(int id); - long ssec_; - long susec_; - long psec_; - long pusec_; - myTimer_cb user_func_; - void* user_id_; - bool periodic_; -}; - - -//------------------------------------------------------------ -myTimer::myTimer(IEventHandler& h, long ssec, long susec, - long psec, long pusec, myTimer_cb user_func, - void* user_id) : - IEventOwner(h), - ssec_(ssec), - susec_(susec), - psec_(psec), - pusec_(pusec), - user_func_(user_func), - user_id_(user_id), - periodic_(psec != 0 || pusec != 0) -{ - Debug deb("myTimer()"); - AddEvent(ssec_, susec_); -} - - -//------------------------------------------------------------ -myTimer::~myTimer() -{ - Debug deb("~myTimer()"); - ClearEvents(); -} - - -//------------------------------------------------------------ -void myTimer::OnEvent(int id) -{ - Debug deb("myTimer::OnEvent()"); - if (periodic_) - { - AddEvent(psec_, pusec_); - } - - user_func_(this, user_id_); - - if (!periodic_) - { - delete this; - } -} - - -//------------------------------------------------------------ -static void myfunc(myTimer* t, void* user_id) -{ - Debug deb("myTimer::myfunc()"); - deb << "Event " << ((char*)user_id) << Debug::endl(); -} - - -/* -int main(int argc, char *argv[]) -{ - EventHandler h; - - // Example 1: Create a 2 sec one-shot timer. - // No need to save the pointer as it will delete - // itself upon expiry. - new myTimer(h, 2, 0, 0, 0, myfunc, (void*)"My Timer 0"); - - // Example 2: Create a 1 sec periodic timer. - // Save the pointer because we can stop the timer - // later with a "delete mytimer". - myTimer* mytimer = new myTimer(h, 0, 0, 1, 0, myfunc, - (void*)"My Timer 1"); - - // Drop into the event handler .. - h.EventLoop(); -} -*/ - - -int main(int argc, char *argv[]) -{ - StdoutLog log; - MyEvHandler h(&log); - ListenSocket l(h); - l.Bind("localhost", 12344); - h.Add(&l); - - EvSocket sock(h); - sock.Open("localhost", 12344); - h.Add(&sock); - - // Example 1: Create a 2 sec one-shot timer. - // No need to save the pointer as it will delete - // itself upon expiry. - new myTimer(h, 2, 0, 0, 0, myfunc, (void*)"My Timer 0"); - - // Example 2: Create a 1 sec periodic timer. - // Save the pointer because we can stop the timer - // later with a "delete mytimer". - myTimer* mytimer = new myTimer(h, 0, 0, 1, 0, myfunc, - (void*)"My Timer 1"); - - h.EventLoop(); -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http.cpp deleted file mode 100755 index a15d4dbe1a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include -#include - - -class tSocket : public HTTPSocket -{ -public: - tSocket(ISocketHandler& h, const std::string& host, int port) : HTTPSocket(h), m_host(host) - , m_first(false) - , m_sz(0) { - Open(host, port); - } - - void OnConnect() { - Send("GET /index.html HTTP/1.0\r\n"); - Send("Host: " + m_host + "\r\n"); - Send("\r\n"); - } - void OnDisconnect() { // or OnDelete() - Handler().LogError(this, "Disconnect", 0, "ServerSocket", LOG_LEVEL_INFO); - } - - void OnFirst() { - } - - void OnHeader(const std::string& key, const std::string& value) { - fprintf(stderr, "%s: %s\n", key.c_str(), value.c_str()); - } - - void OnHeaderComplete() { - fprintf(stderr, "\n"); - } - - void OnData(const char *buf, size_t sz) { -printf(" %d bytes\n", sz); - if (1||!m_first) - { - std::string str = buf; - str.resize( sz ); - printf("%s", str.c_str()); - m_first = true; - } - m_sz += sz; - } - - void OnDelete() { - fprintf(stderr, "Content length: %d\n", m_sz); - } - -private: - std::string m_host; - bool m_first; - size_t m_sz; -}; - - -int main(int argc, char *argv[]) -{ - std::string host = argc > 1 ? argv[1] : "www.alhem.net"; - int port = argc > 2 ? atoi(argv[2]) : 80; - StdoutLog log; - SocketHandler h(&log); - tSocket sock(h, host, port); - h.Add(&sock); - while (h.GetCount()) - { - h.Select(1, 0); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http_post.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http_post.cpp deleted file mode 100755 index 3b0b830281..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/http_post.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - - -class sSocket : public HttpdSocket -{ -public: - sSocket(ISocketHandler& h) : HttpdSocket(h) { - } - - void Init() - { - if (GetParent() -> GetPort() == 443 || GetParent() -> GetPort() == 8443) - { -#ifdef HAVE_OPENSSL - EnableSSL(); -#else - fprintf(stderr, "SSL not available\n"); -#endif - } - } - - void Exec() - { - std::string name; - std::string value; - GetForm() -> getfirst(name, value); - while (name.size()) - { -fprintf(stderr, "%s: '%s'\n", name.c_str(), value.c_str()); - GetForm() -> getnext(name, value); - } - CreateHeader(); - GenerateDocument(); - } - - void CreateHeader() - { - SetStatus("200"); - SetStatusText("OK"); -fprintf(stderr, "Uri: '%s'\n", GetUri().c_str()); - { - size_t x = 0; - for (size_t i = 0; i < GetUri().size(); i++) - if (GetUri()[i] == '.') - x = i; - std::string ext = GetUri().substr(x + 1); - if (ext == "gif" || ext == "jpg" || ext == "png") - AddResponseHeader("Content-type", "image/" + ext); - else - AddResponseHeader("Content-type", "text/" + ext); - } - AddResponseHeader("Connection", "close"); - SendResponse(); - } - - void GenerateDocument() - { - Send(""); - SetCloseAndDelete(); - } - -#ifdef HAVE_OPENSSL - void InitSSLServer() - { - InitializeContext("httpd", "comb.pem", "", SSLv23_method()); - } -#endif - -}; - - -int main(int argc, char *argv[]) -{ - std::string host = argc > 1 ? argv[1] : "www.alhem.net"; - StdoutLog log; - SocketHandler h(&log); - ListenSocket l(h); - if (l.Bind(1028)) - { - printf("Bind port 1028 failed\n"); - return -1; - } - h.Add(&l); - ListenSocket l2(h); - if (l2.Bind(8443)) - { - printf("Bind port 8443 failed\n"); - return -1; - } - h.Add(&l2); - HttpPostSocket sock(h, "http://localhost:1028/postdata"); - sock.AddField("name", "value"); - sock.Open(); - h.Add(&sock); - while (h.GetCount()) - { - h.Select(1, 0); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd.cpp deleted file mode 100755 index e1106a0b6b..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include -#include -#include -#include - - -class sSocket : public HttpdSocket -{ -public: - sSocket(ISocketHandler& h) : HttpdSocket(h) { - } - - void Init() - { - if (GetParent() -> GetPort() == 443 || GetParent() -> GetPort() == 8443) - { -#ifdef HAVE_OPENSSL - EnableSSL(); -#else - fprintf(stderr, "SSL not available\n"); -#endif - } - } - - void Exec() - { - CreateHeader(); - GenerateDocument(); - } - - void CreateHeader() - { - SetStatus("200"); - SetStatusText("OK"); -fprintf(stderr, "Uri: '%s'\n", GetUri().c_str()); - { - size_t x = 0; - for (size_t i = 0; i < GetUri().size(); i++) - if (GetUri()[i] == '.') - x = i; - std::string ext = GetUri().substr(x + 1); - if (ext == "gif" || ext == "jpg" || ext == "png") - AddResponseHeader("Content-type", "image/" + ext); - else - AddResponseHeader("Content-type", "text/" + ext); - } - AddResponseHeader("Connection", "close"); - SendResponse(); - } - - void GenerateDocument() - { - std::string fn = GetUri().substr(1); - FILE *fil = fopen(fn.c_str(), "rb"); - if (fil) - { - char slask[1000]; - int n = fread(slask,1,1000,fil); - while (n > 0) - { - SendBuf(slask, n); - n = fread(slask,1,1000,fil); - } - fclose(fil); - } - else - { - SetStatus("404"); - SetStatusText("Not Found"); - } - SetCloseAndDelete(); - } - -#ifdef HAVE_OPENSSL - void InitSSLServer() - { - InitializeContext("httpd", "comb.pem", "", SSLv23_method()); - } -#endif - -}; - - -int main(int argc, char *argv[]) -{ - std::string host = argc > 1 ? argv[1] : "www.alhem.net"; - StdoutLog log; - SocketHandler h(&log); - ListenSocket l(h); - if (l.Bind(1028)) - { - printf("Bind port 1028 failed\n"); - return -1; - } - h.Add(&l); - ListenSocket l2(h); - if (l2.Bind(8443)) - { - printf("Bind port 8443 failed\n"); - return -1; - } - h.Add(&l2); - while (h.GetCount()) - { - h.Select(1, 0); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd_test.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd_test.cpp deleted file mode 100755 index b8a4286705..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/httpd_test.cpp +++ /dev/null @@ -1,214 +0,0 @@ -#include -#include -#include -#include -#include -#include - - - std::string host; - int port = 0; - bool https = false; - std::string full_request; - - int antal = 500; - - int interval = 500; - int delay = 5000; - - int connected = 0; - int failed = 0; - int lost = 0; - -class TestSocket : public TcpSocket, public IEventOwner -{ -public: - TestSocket(class EventHandler& h, bool add = false) : TcpSocket(h), IEventOwner(h) - , m_req_index(0) { - if (https) - { - EnableSSL(); - } - if (add) - { - m_event_open = AddEvent(interval / 1000, (interval % 1000) * 1000); - } - } - ~TestSocket() {} - - void OnConnect() { - connected++; - m_event_request = AddEvent(delay / 1000, (delay % 1000) * 1000); - printf("%9lu %5u Connected: %d\n", UniqueIdentifier(), GetSockPort(), connected); - } - - void OnConnectFailed() { - failed++; - printf("%9lu %5u Failed: %d\n", UniqueIdentifier(), GetSockPort(), failed); - } - - void OnDisconnect() { - printf("\n"); - printf("%s\n", Utility::Stack().c_str()); - lost++; - connected--; - printf("%9lu %5u Lost: %d\n", UniqueIdentifier(), GetSockPort(), lost); - } - - void OnEvent(int id) { - if (id == m_event_open) - { - if (connected < antal) - { - TestSocket *p = new TestSocket(static_cast(Handler())); - p -> SetDeleteByHandler(); - p -> Open(host, port); - Handler().Add(p); - } - else - { - printf("Finished connecting. %d connected / %d failed / %d lost\n", connected, failed, lost); - } - m_event_open = AddEvent(interval / 1000, (interval % 1000) * 1000); - } - else - if (id == m_event_request) - { - if (m_req_index < full_request.size()) - { - if (full_request[m_req_index] == '\r') - { - printf(""); - fflush(stdout); - } - if (full_request[m_req_index] == '\n') - { - printf(""); - fflush(stdout); - } - SendBuf( &full_request[m_req_index], 1 ); - m_req_index++; - m_event_request = AddEvent(delay / 1000, (delay % 1000) * 1000); - } - else - { - m_event_restart = AddEvent(3, 0); - } - } - else - if (id == m_event_restart) - { - m_req_index = 0; - m_event_request = AddEvent(delay / 1000, (delay % 1000) * 1000); - } - else - { - fprintf(stderr, "%9lu %5u Unknown event id\n", UniqueIdentifier(), GetSockPort()); - SetCloseAndDelete(); - } - } - - void OnRawData(const char *buf, size_t len) { - printf("<%lu,%d>", UniqueIdentifier(), len); - fflush(stdout); - } - -private: - long m_event_open; - long m_event_request; - long m_event_restart; - size_t m_req_index; -}; - - -int main(int argc, char *argv[]) -{ - try - { - EventHandler h; - - /* - $ httpd_test [options] url - - -host override host part of url - -port override port part of url - -uri override uri part of url - -qs override query string part of url - - -nn nn number of connections - - -interval interval between connections, in ms - -delay interval between each request char sent - */ - std::string url; - - std::string uri; - std::string qs; - - for (int i = 1; i < argc; i++) - { - if (!strcmp(argv[i], "-host") && i < argc - 1) - host = argv[++i]; - else - if (!strcmp(argv[i], "-port") && i < argc - 1) - port = atoi(argv[++i]); - else - if (!strcmp(argv[i], "-uri") && i < argc - 1) - uri = argv[++i]; - else - if (!strcmp(argv[i], "-qs") && i < argc - 1) - qs = argv[++i]; - else - if (strlen(argv[i]) > 1 && argv[i][0] == '-' && isdigit(argv[i][1])) - antal = atoi(&argv[i][1]); - else - if (!strcmp(argv[i], "-interval") && i < argc - 1) - interval = atoi(argv[++i]); - else - if (!strcmp(argv[i], "-delay") && i < argc - 1) - delay = atoi(argv[++i]); - else - if (argv[i][0] == '-') - printf("Huh? %s\n", argv[i]); - else - url = argv[i]; - } - Utility::Uri parser(url); - if (host.empty()) - host = parser.Host(); - if (!port) - port = parser.Port(); - if (uri.empty()) - uri = parser.UrlUri(); - if (qs.empty()) - qs = parser.QueryString(); - if (parser.Protocol() == "https") - https = true; - - full_request = "GET " + uri; - if (!qs.empty()) - full_request += "?" + qs; - full_request += " HTTP/1.1\r\n"; - full_request += "Host: " + parser.Host() + "\r\n"; - full_request += "\r\n"; - - printf("Host: %s\n", host.c_str()); - printf("Port: %d\n", port); - printf("----------------------------------\n"); - printf("%s", full_request.c_str()); - printf("----------------------------------\n"); - - TestSocket *p = new TestSocket(h, true); - p -> SetDeleteByHandler(); - p -> Open(host, port); - h.Add(p); - - h.EventLoop(); - } - catch (const Exception& e) - { - std::cerr << e.ToString() << std::endl; - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/https.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/https.cpp deleted file mode 100755 index 45b36ff80f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/https.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include -#include -#include -#include - - -class tSocket : public HTTPSocket -{ -public: - tSocket(ISocketHandler& h) : HTTPSocket(h) - , m_first(false) - , m_sz(0) { - EnableSSL(); - } - - tSocket(ISocketHandler& h, const std::string& host) : HTTPSocket(h), m_host(host) - , m_first(false) - , m_sz(0) { - EnableSSL(); - Open(host, 4443); - } - - void InitSSLServer() { - InitializeContext("", "comb.pem", "", SSLv23_method()); - } - - void OnSSLAccept() { - printf("OnSSLAccept()\n"); - HTTPSocket::OnSSLAccept(); - } - - void OnSSLConnect() { - printf("OnSSLConnect()\n"); - HTTPSocket::OnSSLConnect(); - } - - void OnAccept() { -printf("OnAccept\n"); - } - - void OnConnect() { -printf("OnConnect\n"); - Send("GET /index.html HTTP/1.0\r\n"); - Send("Host: " + m_host + "\r\n"); - Send("\r\n"); - } - - void OnFirst() { - } - - void OnHeader(const std::string& key, const std::string& value) { - fprintf(stderr, "%s: %s\n", key.c_str(), value.c_str()); - } - - void OnHeaderComplete() { - fprintf(stderr, "\n"); - } - - void OnData(const char *buf, size_t sz) { - if (1||!m_first) - { - std::string str = buf; - str.resize( sz ); - printf("%s", str.c_str()); - m_first = true; - } - m_sz += sz; - } - - void OnDelete() { - fprintf(stderr, "Content length: %d\n", m_sz); - } - -private: - std::string m_host; - bool m_first; - size_t m_sz; -}; - - -int main(int argc, char *argv[]) -{ - try - { - SocketHandler h; - if (argc > 1 && !strcmp(argv[1], "-server")) - { - ListenSocket l(h); - l.Bind(4443); - h.Add(&l); - while (h.GetCount()) - { - h.Select(1, 0); - } - } - else - { - std::string host = argc > 1 ? argv[1] : "www.alhem.net"; - tSocket sock(h, host); - h.Add(&sock); - while (h.GetCount()) - { - h.Select(1, 0); - } - } - } - catch (const Exception& e) - { - printf("%s\n", e.ToString().c_str()); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/json.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/json.cpp deleted file mode 100755 index efe0f9c883..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/json.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "Json.h" -#include - - -int main(int argc, char *argv[]) -{ - try - { - Json js; - - std::string str("Test\\ string\\ end\\\nAnders was here\n\"Quoted string inside string\"\n"); - std::cout << " --------------- original\n"; - std::cout << str << std::endl; - - js.encode(str); - std::cout << " --------------- encoded\n"; - std::cout << str << std::endl; - - js.decode(str); - std::cout << " --------------- decoded\n"; - std::cout << str << std::endl; - - js["String"] = str; - str = js.ToString(); - std::cout << " --------------- from ToString()\n"; - std::cout << str << std::endl; - - Json js2 = Json::Parse(str); - std::cout << js2.ToString() << std::endl; - - std::cout << (std::string)js2["String"] << std::endl; - - str = "{\"no-value\":null}"; - Json js3 = Json::Parse(str); - std::cout << js3.ToString() << std::endl; - - std::cout << " --------------- request\n"; - Json req; - req["method"] = "test"; - Json params; - params["value1"] = 1L; - params["value2"] = "2"; - req["params"] = params; - std::cout << req.ToString() << std::endl; - } - catch (const Exception& e) - { - std::cerr << e.ToString() << std::endl; - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/listener.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/listener.cpp deleted file mode 100755 index 2c10951a4a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/listener.cpp +++ /dev/null @@ -1,152 +0,0 @@ -#include -#include -#include -#include -#include -#include - - -bool quit = false; - - -class ControlHandler : public SocketHandler -{ -public: - ControlHandler() : SocketHandler() {} - ~ControlHandler() {} - - void List(TcpSocket *p); - - void StopListen(); -}; - - -class ControlSocket : public TcpSocket -{ -public: - ControlSocket(ISocketHandler& h) : TcpSocket(h) { - SetLineProtocol(); - } - - void OnAccept() { - SendHelp(); - Send(">> "); - } - - void OnLine(const std::string& line) { - Parse pa(line); - std::string cmd = pa.getword(); - std::string arg = pa.getrest(); - - ControlHandler& h = static_cast(Handler()); - if (cmd == "help") - { - SendHelp(); - } - else - if (cmd == "quit") - { - SetCloseAndDelete(); - Send("Bye.\n"); - return; - } - else - if (cmd == "list") - { - h.List(this); - } - else - if (cmd == "stop") - { - h.StopListen(); - } - else - if (cmd == "bind") - { - port_t port = (port_t)atoi(arg.c_str()); - ListenSocket *p = new ListenSocket(Handler()); - p -> SetDeleteByHandler(); - p -> Bind(port); - h.Add(p); - } - else - { - Send("Huh?\n"); - } - Send(">> "); - } - - void SendHelp() { - Send("Commands available\n" - " help, quit, list, stop, bind \n" - "\n" - " list - list all sockets\n" - " stop - stop all listening sockets\n" - " bind - add a new listening socket\n" - " quit - leave\n" - " help - show this text\n" - "\n"); - } - -private: -}; - - -void ControlHandler::List(TcpSocket *from) -{ - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - SOCKET s = it -> first; - Socket *p0 = it -> second; - ListenSocket *l = dynamic_cast *>(p0); - ControlSocket *p = dynamic_cast(p0); - if (l) - { - from -> Send(Utility::l2string(s) + ": ListenSocket on port " + Utility::l2string(l -> GetPort()) + "\n"); - } - else - if (p) - { - from -> Send(Utility::l2string(s) + ": ControlSocket\n"); - } - else - { - from -> Send(Utility::l2string(s) + ": \n"); - } - } -} - - -void ControlHandler::StopListen() -{ - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p0 = it -> second; - ListenSocket *l = dynamic_cast *>(p0); - if (l) - { - l -> SetCloseAndDelete(); - } - } -} - - -int main(int argc, char *argv[]) -{ - try - { - ControlHandler h; - ListenSocket l(h); - l.Bind(2000); - h.Add(&l); - while (!quit && h.GetCount()) - { - h.Select(); - } - } - catch (const Exception& e) - { - std::cout << e.ToString() << std::endl; - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resolve.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resolve.cpp deleted file mode 100755 index 802b91016a..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resolve.cpp +++ /dev/null @@ -1,156 +0,0 @@ -#include -#ifndef _WIN32 -#include -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include - - -int main(int argc, char *argv[]) -{ - StdoutLog log; - SocketHandler h(&log); -/* - h.EnableResolver(9999); - -// printf("Waiting for resolver ..."); - while (!h.ResolverReady()) - ; -// printf(" resolver ready!\n"); -*/ - std::string hostname = argc < 2 ? "www.ipv6.org" : argv[1]; - - { - printf("Using hostname : %s\n", hostname.c_str()); - printf("------------------------------------------- normal (old) Utility::u2ip\n"); - ipaddr_t oa; - if (!Utility::u2ip(hostname, oa)) - printf("Ipv4 lookup failed\n"); -#ifdef ENABLE_IPV6 - in6_addr oa6; - if (!Utility::u2ip(hostname, oa6)) - printf("Ipv6 lookup failed\n"); -#endif - std::string oname; - Utility::l2ip(oa, oname); - printf("Ipv4 : %s (old)\n", oname.c_str()); - -#ifdef ENABLE_IPV6 - std::string oname6; - Utility::l2ip(oa6, oname6); - printf("Ipv6 : %s (old)\n", oname6.c_str()); -#endif - - printf("------------------------------------------- new Utility::u2ip, Utility::reverse\n"); - struct sockaddr_in sa; - if (!Utility::u2ip(hostname, sa)) - printf("Ipv4 lookup failed\n"); - - ipaddr_t a; - memcpy(&a, &sa.sin_addr, sizeof(a)); - std::string l2ipname; - Utility::l2ip(a, l2ipname); - printf("Ipv4 : %s\n", l2ipname.c_str()); - - std::string numeric; - Utility::reverse((struct sockaddr *)&sa, sizeof(sa), numeric, NI_NUMERICHOST); - printf("Ipv4 numeric : %s\n", numeric.c_str()); - - std::string rname; - if (!Utility::reverse( (struct sockaddr *)&sa, sizeof(sa), rname)) - printf("Reverse Ipv4 failed\n"); - else - printf("Ipv4 Utility::reverse : %s\n", rname.c_str()); - -#ifdef ENABLE_IPV6 - printf("------------------------------------------- new Utility::u2ip, Utility::reverse (Ipv6)\n"); - struct sockaddr_in6 sa6; - if (!Utility::u2ip(hostname, sa6)) - printf("Ipv6 lookup failed\n"); - - std::string l2ipname6; - Utility::l2ip(sa6.sin6_addr, l2ipname6); - printf("Ipv6 : %s\n", l2ipname6.c_str()); - - std::string numeric6; - Utility::reverse((struct sockaddr *)&sa6, sizeof(sa6), numeric6, NI_NUMERICHOST); - printf("Ipv6 numeric : %s\n", numeric6.c_str()); - - std::string rname6; - if (!Utility::reverse( (struct sockaddr *)&sa6, sizeof(sa6), rname6)) - printf("Reverse Ipv6 failed\n"); - else - printf("Ipv6 Utility::reverse : %s\n", rname6.c_str()); -#endif - - printf("-------------------------------------------\n"); - in_addr ia; - /** Resolve hostname. */ -//static bool Resolve(const std::string& hostname,struct in_addr& a); - /** Reverse resolve (IP to hostname). */ -//static bool Reverse(struct in_addr& a,std::string& name); - /** Convert address struct to text. */ -//static std::string Convert(struct in_addr& a); - std::string name; - if (!Ipv4Address::Resolve(hostname, ia)) - printf("Ipv4 lookup failed (Ipv4Address)\n"); - memcpy(&a, &ia, sizeof(a)); - Utility::l2ip(a, name); - printf("Ipv4 : %s (Ipv4Address)\n", name.c_str()); - assert(name == l2ipname); - if (!Ipv4Address::Reverse(ia, name)) - printf("Reverse Ipv4 lookup failed (Ipv4Address)\n"); - else - printf("Reverse Ipv4 : %s\n", name.c_str()); - assert(name == rname); - assert(Ipv4Address::Convert(ia) == l2ipname); - -#ifdef ENABLE_IPV6 - printf("-------------------------------------------\n"); - /** Resolve hostname. */ -//static bool Resolve(const std::string& hostname,struct in6_addr& a); - /** Reverse resolve (IP to hostname). */ -//static bool Reverse(struct in6_addr& a,std::string& name); - /** Convert address struct to text. */ -//static std::string Convert(struct in6_addr& a,bool mixed = false); - if (!Ipv6Address::Resolve(hostname, oa6)) - printf("Ipv6 lookup failed (Ipv4Address)\n"); - Utility::l2ip(oa6, name); - assert(name == l2ipname6); - printf("Ipv6 : %s (Ipv6Address)\n", name.c_str()); - if (!Ipv6Address::Reverse(oa6, name)) - printf("Reverse Ipv6 lookup failed (Ipv4Address)\n"); - else - printf("Reverse Ipv6 : %s\n", name.c_str()); - assert(name == rname6); - std::string mixed_false = Ipv6Address::Convert(oa6, false); - std::string mixed_true = Ipv6Address::Convert(oa6, true); - printf("Ipv6Address::Convert(false) : %s\n", mixed_false.c_str()); - printf("Ipv6Address::Convert(true ) : %s\n", mixed_true.c_str()); - assert(mixed_false == l2ipname6); -#endif -/* - printf("-------------------------------------------\n"); - int protocol; - Utility::u2service("tcp", protocol); - printf("tcp: %d\n", protocol); - Utility::u2service("udp", protocol); - printf("udp: %d\n", protocol); - Utility::u2service("echo", protocol); - printf("echo: %d\n", protocol); -*/ - } - printf("\n"); - printf("OK\n"); - -// sleep(100); -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resume.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resume.cpp deleted file mode 100755 index 29d15ae979..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/resume.cpp +++ /dev/null @@ -1,128 +0,0 @@ -#include -#include -#include -#include -#include - - -class eHandler : public EventHandler -{ -public: - eHandler() : EventHandler() {} - ~eHandler() { - } -}; - - -#define ID_STOP_SOCKET 1 -#define ID_STOP_LISTEN 2 - - -class eSocket : public TcpSocket, public IEventOwner -{ -public: - eSocket(ISocketHandler& h) : TcpSocket(h), IEventOwner(static_cast(h)), m_listen_socket(NULL), m_server(false) { - SetLineProtocol(); - } - ~eSocket() { - } - - bool OnConnectRetry() { - printf("Retrying connect\n"); - if (GetConnectionRetries() == 3) - { - printf("Creating ListenSocket\n"); - m_listen_socket = new ListenSocket(Handler()); - if (m_listen_socket -> Bind(12345)) - { - printf("Bind port 12345 failed\n"); - } - m_listen_socket -> SetDeleteByHandler(); - Handler().Add( m_listen_socket ); - } - return true; - } - - void OnAccept() { - m_events[AddEvent(5, 0)] = ID_STOP_SOCKET; - m_server = true; - } - - void OnConnect() { - m_events[AddEvent(10, 0)] = ID_STOP_LISTEN; - } - - void OnReconnect() { - m_events[AddEvent(10, 0)] = ID_STOP_LISTEN; - } - - void OnEvent(int id) { - if (m_events[id] == ID_STOP_SOCKET && m_server) - { - printf("Event: Server disconnect\n"); - SetCloseAndDelete(); - } - if (m_events[id] == ID_STOP_LISTEN && !m_server) - { - printf("Event: Stop listensocket\n"); - if (m_listen_socket) - { - m_listen_socket -> SetCloseAndDelete(); - m_listen_socket = NULL; - } - } - } - - void OnLine(const std::string& line) { - printf(" Incoming data: %s\n", line.c_str()); - } - - void OnDelete() { - printf("eSocket::OnDelete(), server: %s\n", m_server ? "true" : "false"); - } - - void OnDisconnect() { - printf("Disconnect, server: %s\n", m_server ? "true" : "false"); - } - -private: - ListenSocket *m_listen_socket; - std::map m_events; - bool m_server; -}; - - -class Sender : public IEventOwner -{ -public: - Sender(IEventHandler& h, TcpSocket& ref) : IEventOwner(h), m_socket(ref), m_count(1) { - } - - void OnEvent(int id) { - if (static_cast(GetEventHandler()).Valid(&m_socket)) - m_socket.Send("Event#" + Utility::l2string(m_count++) + "\n"); - AddEvent(1, 0); - } - -private: - TcpSocket& m_socket; - int m_count; -}; - - -int main(int argc, char *argv[]) -{ - eHandler h; - eSocket sock(h); - sock.SetConnectTimeout(3); - sock.SetConnectionRetry(-1); -#ifdef ENABLE_RECONNECT - sock.SetReconnect(); -#endif - sock.Open("localhost", 12345); - h.Add( &sock ); - Sender send(h, sock); - h.AddEvent( &send, 1, 0 ); - h.EventLoop(); -} - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/retry.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/retry.cpp deleted file mode 100755 index 36954a6fcf..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/retry.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include -#include - - - bool quit = false; - -/* - virtual bool OnConnectRetry(); -- void SetRetryClientConnect(bool x = true); -- bool RetryClientConnect(); - void SetConnectionRetry(int n); - int GetConnectionRetry(); - void IncreaseConnectionRetries(); - int GetConnectionRetries(); - void ResetConnectionRetries(); -*/ -class RetrySocket : public TcpSocket -{ -public: - RetrySocket(ISocketHandler& h) : TcpSocket(h) { - SetConnectTimeout(2); - SetConnectionRetry(-1); - } - - bool OnConnectRetry() { - printf("Connection attempt#%d\n", GetConnectionRetries()); - if (GetConnectionRetries() == 3) - { - ListenSocket *l = new ListenSocket(Handler()); - if (l -> Bind(12345)) - { - printf("Bind port 12345 failed\n"); - } - l -> SetDeleteByHandler(); - Handler().Add(l); - } - return true; - } - - void OnConnect() { - printf("Connected\n"); - printf("GetRemoteAddress(): %s\n", GetRemoteAddress().c_str()); - printf("Remote address: %s\n", GetRemoteSocketAddress() -> Convert(false).c_str()); - printf("Remote address: %s\n", GetRemoteSocketAddress() -> Convert(true).c_str()); - SetCloseAndDelete(); - } - - void OnDelete() { - quit = true; - } -}; - - -int main(int argc, char *argv[]) -{ - SocketHandler h; - RetrySocket sock(h); - sock.Open("localhost", 12345); - h.Add(&sock); - while (!quit) - { - h.Select(0, 200000); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/scanr.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/scanr.cpp deleted file mode 100755 index b6c4e2b2db..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/scanr.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include -#include -#include - - -class tSocket : public TcpSocket -{ -public: - tSocket(ISocketHandler& h, const std::string& host, int port) : TcpSocket(h), m_host(host) - { - SetLineProtocol(); - Open(host, port); - } - - void OnLine(const std::string& line) - { - printf("%s :: ", GetRemoteAddress().c_str()); - for (size_t i = 0; i < line.size(); i++) - { - if (isprint(line[i]) || line[i] == 13 || line[i] == 10) - { - printf("%c", line[i]); - } - } - printf("\n"); - } - -private: - std::string m_host; -}; - - -int main(int argc, char *argv[]) -{ - std::string host = argc > 1 ? argv[1] : "www.alhem.net"; - int port = argc > 2 ? atoi(argv[2]) : 80; - SocketHandler h; - for (int i = 1; i < 255; i++) - { - char host[40]; - sprintf(host, "10.170.23.%d", i); - tSocket *p = new tSocket(h, host, 23); - h.Add(p); - } - while (h.GetCount()) - { - h.Select(1, 0); - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/semtest.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/semtest.cpp deleted file mode 100755 index 442d5d663d..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/semtest.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include -#include -#ifndef _WIN32 -#include -#include -#include -#include -#include -#include - - -class MyThread : public Thread -{ -public: - void Run() { - printf("Thread\n"); - } -}; - - -class SemLock -{ -public: - SemLock(Semaphore& sem) : m_sem(sem) { - m_sem.Wait(); - } - ~SemLock() { - m_sem.Post(); - } - -private: - Semaphore& m_sem; -}; - - -/** - * Return time difference between two struct timeval's, in seconds - * \param t0 start time - * \param t end time - */ -double Diff(struct timeval t0,struct timeval t) -{ - t.tv_sec -= t0.tv_sec; - t.tv_usec -= t0.tv_usec; - if (t.tv_usec < 0) - { - t.tv_usec += 1000000; - t.tv_sec -= 1; - } - return t.tv_sec + (double)t.tv_usec / 1000000; -} - - -static int val = 0; - -void lock(Mutex& m, int i) -{ - Lock l(m); - val += i; -} - - -void lock(Semaphore& s, int i) -{ - SemLock l(s); - val += i; -} -#endif // WIN32 - - -int main() -{ -#ifndef _WIN32 - Mutex mutex; - Semaphore sema(1); - struct timeval start; - struct timeval tt; - double d; - - Utility::GetTime(&start); - for (int i = 0; i < 100000; i++) - lock(mutex, i); - Utility::GetTime(&tt); - d = Diff(start, tt); - printf("%.4f sec\n", d); - - Utility::GetTime(&start); - for (int i = 0; i < 100000; i++) - lock(sema, i); - Utility::GetTime(&tt); - d = Diff(start, tt); - printf("%.4f sec\n", d); -#endif -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sloppy_http.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sloppy_http.cpp deleted file mode 100755 index b6bf07520f..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sloppy_http.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include - - -class GetHttp : public TcpSocket -{ -public: - GetHttp(ISocketHandler& h, const char *request) : TcpSocket(h) - , m_request(request) {} - - void OnConnect() { - printf("... connected\n"); - Send( m_request ); - } - - void OnRawData( const char *buf, size_t len ) { - printf("... data\n"); - if (len > 0) { - std::string tmp; - tmp.resize( len ); - memcpy( &tmp[0], buf, len ); - m_response += tmp; - } - } - - const std::string& Response() { - return m_response; - } - -private: - std::string m_request; - std::string m_response; -}; - - -std::string get_http(const char *host, int port, const char *request) -{ - SocketHandler h; - GetHttp sock(h, request); - sock.Open( host, port ); - h.Add(&sock); - while (h.GetCount()) { - h.Select(1, 0); - } - return sock.Response(); -} - - -int main(int argc, char *argv[]) -{ - std::string zz = get_http("www.alhem.net", 80, "GET /index.html HTTP/1.0\r\n" - "Host: www.alhem.net\r\n" - "Connection: close\r\n" - "\r\n"); - printf("%s\n%d\n", zz.c_str(), zz.size()); -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sockets_test.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sockets_test.cpp deleted file mode 100755 index 966732f9bc..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/sockets_test.cpp +++ /dev/null @@ -1,356 +0,0 @@ -#ifdef _WIN32 -#pragma warning(disable:4786) -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef SOCKETS_NAMESPACE -using namespace SOCKETS_NAMESPACE; -#endif - - -class MyHandler : public SocketHandler -{ -public: - MyHandler(StdLog *p) : SocketHandler(p),m_done(false),m_quit(false) {} - ~MyHandler() {} - - void List(TcpSocket *p) { - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p0 = (*it).second; -#ifdef ENABLE_POOL - if (dynamic_cast(p0)) - { - p -> Send("PoolSocket\n"); - } - else -#endif - if (dynamic_cast(p0)) - { - p -> Send("HttpGetSocket\n"); - } - else - if (dynamic_cast(p0)) - { - p -> Send("TcpSocket\n"); - } - else - { - p -> Send("Some kind of Socket\n"); - } - } - } - void SetQuit() { m_quit = true; } - bool Quit() { return m_quit; } - void CheckHtml() { - if (m_done) - { - if (m_ok) - printf("Html OK:\n%s\n", m_html.c_str()); - else - printf("Html Failed\n"); - m_done = false; - } - } - - std::string m_html; - bool m_ok; - bool m_done; - -private: - bool m_quit; -}; - - -class MySocket : public TcpSocket -{ -public: - MySocket(ISocketHandler& h) : TcpSocket(h) { - } - void OnAccept() { - int port = GetParent() -> GetPort(); - Send("I'm the server at port " + - Utility::l2string(port) + "\n"); - SetCloseAndDelete(); - } -}; - - -class hSocket : public HttpGetSocket -{ -public: - hSocket(ISocketHandler& h,const std::string& x,const std::string& y) : HttpGetSocket(h,x,y) {} - - void OnConnect() { - printf("hSocket::OnConnect\n"); - HttpGetSocket::OnConnect(); - } -}; - - -class OrderSocket : public TcpSocket -{ -public: - OrderSocket(ISocketHandler& h) : TcpSocket(h) { - SetLineProtocol(); - } - Socket *Create() { - Handler().LogError(this, "Create", 0, "OrderSocket", LOG_LEVEL_INFO); - return new OrderSocket(Handler()); - } - void OnAccept() { - Send("Cmd (get,quit,list,stop,detach,count,resolve )>"); - } - void OnLine(const std::string& line) { - Parse pa(line); - std::string cmd = pa.getword(); - std::string arg = pa.getrest(); - try - { - if (cmd == "get") - { - HttpGetSocket *p = new hSocket(Handler(), arg, "tmpfile.html"); - p -> SetHttpVersion("HTTP/1.1"); - p -> AddResponseHeader("Connection", "keep-alive"); - p -> SetDeleteByHandler(); - Handler().Add( p ); - Send("Reading url '" + arg + "'\n"); - } - else - if (cmd == "quit") - { - Send("Goodbye!\n"); - SetCloseAndDelete(); - } - else - if (cmd == "list") - { - dynamic_cast(Handler()).List( this ); - } - else - if (cmd == "stop") - { - dynamic_cast(Handler()).SetQuit(); - } - else - if (cmd == "resolve") - { - //Resolve( arg ); - ipaddr_t a; - if (Utility::u2ip(arg, a)) - { - std::string tmp; - Utility::l2ip(a, tmp); - Send("Resolved: " + tmp + "\n"); - } - else - { - Send("Resolve failed: " + arg + "\n"); - } - } - else - /* - if (cmd == "reverse") - { - ipaddr_t a; - Utility::u2ip(arg, a); // ip -> ipaddr_t - int id = Socket::Resolve(a, 0); - Send("Resolve id = " + Utility::l2string(id) + "\n"); - } - else - */ - #ifdef ENABLE_DETACH - if (cmd == "detach") - { - if (!Detach()) - { - Send("Detach() call failed\n"); - } - else - { - Send("Ok.\n"); - } - } - else - #endif - if (cmd == "count") - { - Send("Socket count: " + Utility::l2string( (long)Handler().GetCount()) + "\n"); - } - else - { - Send("Huh?\n"); - } - } - catch (const std::exception& e) - { - Send(e.what() + std::string("\n")); - } - Send("Cmd>"); - } - void OnDelete() { - printf("OrderSocket::OnDelete()\n"); - } -#ifdef ENABLE_RESOLVER - void OnResolved(int id,ipaddr_t a,port_t port) - { - } - void OnResolved(int id,const std::string& name,port_t port) - { - Send("Resolve id " + Utility::l2string(id) + " = " + name + "\n"); - } -/* - void OnResolved(const char *p,size_t l) { - printf("OnResolved, %d bytes:\n", l); - for (size_t i = 0; i < l; i++) - { - unsigned char c = p[i]; - if (isprint(c)) - printf("%c",c); - else - printf("<%02X>",c); - } - printf("\n"); - } -*/ -#endif -#ifdef ENABLE_DETACH - void OnDetached() { - Send("\nDetached.\nCmd>"); - } -#endif -}; - - -class TestSocket : public TcpSocket -{ -public: - TestSocket(ISocketHandler& h) : TcpSocket(h) { - SetLineProtocol(); - } - void OnConnect() { - printf("TestSocket connected, sending QUIT\n"); - Send( "quit\n" ); - } - void OnConnectFailed() { - printf("TestSocket::OnConnectFailed\n"); - SetCloseAndDelete(); - } - void OnLine(const std::string& line) { - printf("TestSocket: %s\n", line.c_str()); - } - void OnDelete() { - printf("TestSocket::OnDelete()\n"); - } -#ifdef ENABLE_RESOLVER - void OnResolved(int id,ipaddr_t a,port_t port) { - printf("TestSocket::OnResolved(): %d, %08x:%d\n", id, a, port); - TcpSocket::OnResolved(id,a,port); - } -#endif -}; - - -int main() -{ - try - { - StdoutLog log; - MyHandler h(&log); - -#ifdef ENABLE_RESOLVER - h.EnableResolver(9999); -#endif -// Utility::ResolveLocal(); - printf(" *** My hostname: %s\n", Utility::GetLocalHostname().c_str()); - printf(" *** My local IP: %s\n", Utility::GetLocalAddress().c_str()); - - // socks4 options -/* - h.SetSocks4Host("127.0.0.1"); - h.SetSocks4Port(1080); - h.SetSocks4Userid("www.alhem.net"); - h.SetSocks4TryDirect( true ); - printf("Socks4Host: %x\n", h.GetSocks4Host()); -*/ - - // first server - ListenSocket l1(h); - if (l1.Bind(1024)) - { - printf("Bind 1024 failed\n"); - exit(-1); - } - h.Add(&l1); - - // second server - ListenSocket l2(h); - if (l2.Bind(1025)) - { - printf("Bind 1025 failed\n"); - exit(-1); - } - h.Add(&l2); - - // line server - ListenSocket l3(h); - if (l3.Bind(1027)) - { - printf("Bind 1027 failed\n"); - exit(-1); - } - h.Add(&l3); - - // http debug - ListenSocket l4(h); - if (l4.Bind(8080)) - { - printf("Bind 8080 failed\n"); - exit(-1); - } - h.Add(&l4); - - // wait for resolver to really start -#ifdef ENABLE_RESOLVER - printf("Waiting for resolver ..."); - while (!h.ResolverReady()) - ; - printf(" resolver ready!\n"); -#endif - - TestSocket ts(h); -printf(">>> TestSocket.Open\n"); - ts.Open("localhost", 1027); -printf(">>> Adding TestSocket\n"); - h.Add(&ts); - -printf(">>> Enter mainloop\n"); - h.Select(0,0); - while (!h.Quit()) - { - h.Select(1,0); - } -printf(">>> Leaving mainloop\n"); - - return 0; - } - catch (const Exception& e) - { - std::cerr << e.ToString() << std::endl; - } - catch (const std::exception& e) - { - std::cerr << e.what() << std::endl; - } -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/stressclient.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/stressclient.cpp deleted file mode 100755 index 2d38a066e5..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/stressclient.cpp +++ /dev/null @@ -1,631 +0,0 @@ -/** - ** \file stressclient.cpp - ** \date 2006-10-02 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2006 Anders Hedstrom - -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. -*/ -#ifdef _WIN32 -#pragma warning(disable:4786) -#endif -#include -#include -#include -#include -#include -#ifndef _WIN32 -#include -#include -#else -typedef __int64 int64_t; -#endif -#include -#include - - -static int g_ant = 0; -static double g_min_time = 10000; -static double g_max_time = 0; -static double g_tot_time = 0; - -static int g_ant2 = 0; -static double g_min_time2 = 10000; -static double g_max_time2 = 0; -static double g_tot_time2 = 0; - -static int64_t gBytesIn = 0; -static int64_t gBytesOut = 0; - -static int samples = 0; - -static int g_tot_ant = 0; -static double g_tot_min_t = 0; -static double g_tot_max_t = 0; -static double g_tot_tot_t = 0; - -static int g_tot_ant2 = 0; -static double g_tot_min_t2 = 0; -static double g_tot_max_t2 = 0; -static double g_tot_tot_t2 = 0; - -static int64_t tot_gBytesIn = 0; -static int64_t tot_gBytesOut = 0; - -static double tot_rt = 0; - -static bool gQuit = false; -static size_t g_max_connections = 0; -static std::string gHost = "localhost"; -static port_t gPort = 2222; -static bool g_b_flood = false; -static bool g_b_off = false; -static bool g_b_limit = false; -static bool g_b_repeat = false; -static std::string g_data; -static size_t g_data_size = 1024; -static bool g_b_stop = false; -#ifdef HAVE_OPENSSL -static bool g_b_ssl = false; -#endif -static bool g_b_instant = false; -static struct timeval g_t_start; - - -/** - * Return time difference between two struct timeval's, in seconds - * \param t0 start time - * \param t end time - */ -double Diff(struct timeval t0,struct timeval t) -{ - t.tv_sec -= t0.tv_sec; - t.tv_usec -= t0.tv_usec; - if (t.tv_usec < 0) - { - t.tv_usec += 1000000; - t.tv_sec -= 1; - } - return t.tv_sec + (double)t.tv_usec / 1000000; -} - - -void gettime(struct timeval *p, struct timezone *) -{ -#ifdef _WIN32 - FILETIME ft; // Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC). - GetSystemTimeAsFileTime(&ft); - uint64_t tt; - memcpy(&tt, &ft, sizeof(tt)); - tt /= 10; - p->tv_sec = tt / 1000000; - p->tv_usec = tt % 1000000; -#else - gettimeofday(p, NULL); -#endif -} - - -void print_tot() -{ - printf("c ----- %6d (%.4f/%.4f/%.4f)", g_tot_ant / samples, g_tot_min_t / samples, g_tot_max_t / samples, g_tot_tot_t / g_tot_ant); - - printf(" r --- %7d (%.4f/%.4f/%.4f)", g_tot_ant2 / samples, g_tot_min_t2 / samples, g_tot_max_t2 / samples, g_tot_tot_t2 / g_tot_ant2); - - double mbi = (double)tot_gBytesIn / 1024 / samples; - mbi /= 1024; - mbi /= tot_rt / samples; - printf(" -/in %11lld", tot_gBytesIn / samples); - printf(" (%5.2f MB/s)", mbi); - - double mbo = (double)tot_gBytesOut / 1024 / samples; - mbo /= 1024; - mbo /= tot_rt / samples; - printf(" -/out %11lld", tot_gBytesOut / samples); - printf(" (%5.2f MB/s)", mbo); - - printf(" %5.2f s\n", tot_rt / samples); - -} - - -void printreport() -{ - struct timeval tv; - gettime(&tv, NULL); - double rt = Diff(g_t_start, tv); - g_t_start = tv; - // -// printf("connect %6d (%.4f/%.4f/%.4f)", g_ant, g_min_time, g_max_time, g_tot_time / g_ant); - g_tot_ant += g_ant; - g_tot_min_t += g_min_time; - g_tot_max_t += g_max_time; - g_tot_tot_t += g_tot_time; - -// printf(" reply %7d (%.4f/%.4f/%.4f)", g_ant2, g_min_time2, g_max_time2, g_tot_time2 / g_ant2); - g_tot_ant2 += g_ant2; - g_tot_min_t2 += g_min_time2; - g_tot_max_t2 += g_max_time2; - g_tot_tot_t2 += g_tot_time2; - - double mbi = (double)gBytesIn / 1024; - mbi /= 1024; - mbi /= rt; -// printf(" b/in %11lld", gBytesIn); -// printf(" (%5.2f MB/s)", mbi); - tot_gBytesIn += gBytesIn; - - double mbo = (double)gBytesOut / 1024; - mbo /= 1024; - mbo /= rt; -// printf(" b/out %11lld", gBytesOut); -// printf(" (%5.2f MB/s)", mbo); - tot_gBytesOut += gBytesOut; - -// printf(" %5.2f s\n", rt); - tot_rt += rt; - - ++samples; - print_tot(); -} - - -void printreport_reset() -{ - printreport(); - // - g_min_time = 10000; - g_max_time = 0; - g_tot_time = 0; - g_ant = 0; - g_min_time2 = 10000; - g_max_time2 = 0; - g_tot_time2 = 0; - g_ant2 = 0; - gBytesIn = gBytesOut = 0; -} - - -class MySocket : public TcpSocket -{ -public: - MySocket(ISocketHandler& h,bool one) : TcpSocket(h), m_b_client(false), m_b_one(one), m_b_created(false), m_b_active(false) { - gettime(&m_create, NULL); - SetLineProtocol(); -#ifdef HAVE_OPENSSL - if (g_b_ssl) - EnableSSL(); -#endif - if (g_max_connections && !m_b_one && Handler().GetCount() >= g_max_connections) - { - fprintf(stderr, "\nConnection limit reached: %d, continuing in single connection stress mode\n", (int)g_max_connections); - if (g_b_off) - printreport_reset(); - g_b_limit = true; - m_b_one = true; - // - g_b_flood = g_b_repeat; - } -#ifndef USE_EPOLL - if (!m_b_one && Handler().GetCount() >= Handler().MaxCount() - 17) - { - fprintf(stderr, "\nFD_SETSIZE connection limit reached: %d, continuing in single connection stress mode\n", (int)Handler().GetCount()); - if (g_b_off) - printreport_reset(); - g_b_limit = true; - m_b_one = true; - // - g_b_flood = g_b_repeat; - } -#endif - } - ~MySocket() { - } - - void OnConnect() { - gettime(&m_connect, NULL); - m_b_active = true; - { - double tconnect = Diff(m_create, m_connect); - // - g_min_time = tconnect < g_min_time ? tconnect : g_min_time; - g_max_time = tconnect > g_max_time ? tconnect : g_max_time; - g_tot_time += tconnect; - g_ant += 1; - } - SendBlock(); - m_b_client = true; - } - - void SendBlock() { - gettime(&m_send, NULL); - Send(g_data + "\n"); - } - - void OnLine(const std::string& line) { - gettime(&m_reply, NULL); - m_b_active = true; - { - double treply = Diff(m_send, m_reply); - // - g_min_time2 = treply < g_min_time2 ? treply : g_min_time2; - g_max_time2 = treply > g_max_time2 ? treply : g_max_time2; - g_tot_time2 += treply; - g_ant2 += 1; - } - // - if (line != g_data) - { - fprintf(stderr, "\n%s\n%s\n", line.c_str(), g_data.c_str()); - fprintf(stderr, "(reply did not match data - exiting)\n"); - exit(-1); - } - // - gBytesIn += GetBytesReceived(true); - gBytesOut += GetBytesSent(true); - if (m_b_one) - { - SetCloseAndDelete(); - } - else - if (g_b_repeat && g_b_limit) - { - SendBlock(); - } - // add another - if (!m_b_created && (!g_b_limit || !g_b_off) && !g_b_instant) - { - MySocket *p = new MySocket(Handler(), m_b_one); - p -> SetDeleteByHandler(); - p -> Open(gHost, gPort); - Handler().Add(p); - m_b_created = true; - } - } - - bool IsActive() { - bool b = m_b_active; - m_b_active = false; - return b; - } - -private: - bool m_b_client; - bool m_b_one; - bool m_b_created; - bool m_b_active; - struct timeval m_create; - struct timeval m_connect; - struct timeval m_send; - struct timeval m_reply; -}; - - -class MyHttpSocket : public HttpGetSocket -{ -public: - MyHttpSocket(ISocketHandler& h,const std::string& url) : HttpGetSocket(h,url), m_url(url) { - gettime(&m_create, NULL); - AddResponseHeader("content-length", Utility::l2string(g_data_size)); - } - ~MyHttpSocket() {} - - void OnConnect() { - gettime(&m_connect, NULL); - { - double tconnect = Diff(m_create, m_connect); - // - g_min_time = tconnect < g_min_time ? tconnect : g_min_time; - g_max_time = tconnect > g_max_time ? tconnect : g_max_time; - g_tot_time += tconnect; - g_ant += 1; - } - gettime(&m_send, NULL); - - // send request header - HttpGetSocket::OnConnect(); - - // send body - Send(g_data); - } - - void OnContent() { -// std::cout << GetContentLength() << std::endl; - gettime(&m_reply, NULL); - { - double treply = Diff(m_send, m_reply); - // - g_min_time2 = treply < g_min_time2 ? treply : g_min_time2; - g_max_time2 = treply > g_max_time2 ? treply : g_max_time2; - g_tot_time2 += treply; - g_ant2 += 1; - } - gBytesIn += GetBytesReceived(true); - gBytesOut += GetBytesSent(true); - CreateNew(); - } - void CreateNew() { - if (g_b_off) - return; - MyHttpSocket *p = new MyHttpSocket(Handler(), m_url); - p -> SetDeleteByHandler(); - Handler().Add(p); - SetCloseAndDelete(); - } - - void OnDelete() { - } - -private: - std::string m_url; - struct timeval m_create; - struct timeval m_connect; - struct timeval m_send; - struct timeval m_reply; -}; - - -int connectors = 0; - -class ConnectorSocket : public TcpSocket -{ -public: - ConnectorSocket(ISocketHandler& h) : TcpSocket(h), m_state(0) { - } - ~ConnectorSocket() {} - - void OnConnect() { - SetTimeout(5); - connectors += 1; - std::cout << "Connected: " << connectors << std::endl; - } - - void OnTimeout() { - SetTimeout(5); - if (!m_state) - { - m_state = 1; - } - else - { - ConnectorSocket *s = new ConnectorSocket(Handler()); - s -> Open(gHost, gPort); - s -> SetDeleteByHandler(); - Handler().Add(s); - } - } - -private: - int m_state; -}; - - -#ifndef _WIN32 -void sigint(int) -{ - printreport(); - gQuit = true; -} - - -void sigusr1(int) -{ - g_b_flood = true; -} - - -void sigusr2(int) -{ - printreport_reset(); -} -#endif - - -class MyHandler : public SocketHandlerEp -{ -public: - MyHandler() : SocketHandlerEp() { - } - MyHandler(StdoutLog *p) : SocketHandlerEp(p) { - } - ~MyHandler() { - } - void Flood() { - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p0 = it -> second; - MySocket *p = dynamic_cast(p0); - if (p) - { - p -> SendBlock(); - } - } - } - void Report() { - int ant = 0; - int act = 0; - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - MySocket *p = dynamic_cast(it -> second); - if (p) - { - ant++; - if (p -> IsActive()) - { - act++; - } - } - } -// printf(" Number of //stress// sockets: %d Active: %d\n", ant, act); - } -}; - - -int main(int argc,char *argv[]) -{ - bool many = false; - bool one = false; - bool enableLog = false; - bool http = false; - bool connector = false; - std::string url; - time_t report_period = 10; - for (int i = 1; i < argc; i++) - { - if (!strcmp(argv[i], "-many")) - many = true; - if (!strcmp(argv[i], "-one")) - one = true; - if (*argv[i] == '-' && strlen(argv[i]) > 1 && isdigit(argv[i][1]) ) - g_max_connections = atoi(argv[i] + 1); - if (!strcmp(argv[i], "-host") && i < argc - 1) - gHost = argv[++i]; - if (!strcmp(argv[i], "-port") && i < argc - 1) - gPort = atoi(argv[++i]); - if (!strcmp(argv[i], "-off")) - g_b_off = true; - if (!strcmp(argv[i], "-repeat")) - g_b_repeat = true; - if (!strcmp(argv[i], "-size") && i < argc - 1) - g_data_size = atoi(argv[++i]); - if (!strcmp(argv[i], "-log")) - enableLog = true; - if (!strcmp(argv[i], "-time") && i < argc - 1) - report_period = atoi(argv[++i]); - if (!strcmp(argv[i], "-stop")) - g_b_stop = true; -#ifdef HAVE_OPENSSL - if (!strcmp(argv[i], "-ssl")) - g_b_ssl = true; -#endif - if (!strcmp(argv[i], "-instant")) - g_b_instant = true; - if (!strcmp(argv[i], "-http")) - http = true; - if (!strcmp(argv[i], "-url") && i < argc - 1) - url = argv[++i]; - if (!strcmp(argv[i], "-connector")) - connector = true; - } - if (argc < 2 || (!many && !one && !g_max_connections && !http && !connector) ) - { - printf("Usage: %s [mode] [options]\n", *argv); - printf(" Modes (only use one of these):\n"); - printf(" -many start max number of connections\n"); - printf(" -one open - close - repeat\n"); - printf(" -nn open nn connections, then start -one mode\n"); - printf(" -http send/receive http request/response\n"); - printf(" Options:\n"); - printf(" -host xx host to connect to\n"); - printf(" -port nn port number to connection to\n"); - printf(" -off turn off new connections when connection limit reached\n"); - printf(" -repeat send new block when reply is received\n"); - printf(" -size nn size of block to send, default is 1024 bytes\n"); - printf(" -log enable debug log\n"); - printf(" -time nn time between reports, default 10s\n"); - printf(" -stop stop after time elapsed\n"); - printf(" -instant create all sockets at once\n"); -#ifdef HAVE_OPENSSL - printf(" -ssl use ssl\n"); -#endif - printf(" -url xx url to use in http mode (default http://:/)\n"); - printf(" -connector Use connector stress test\n"); - exit(-1); - } - fprintf(stderr, "Using data size: %d bytes\n", (int)g_data_size); - std::string chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - while (g_data.size() < g_data_size) - { - g_data += chars[rand() % chars.size()]; - } -#ifndef _WIN32 - signal(SIGINT, sigint); - signal(SIGUSR1, sigusr1); - signal(SIGUSR2, sigusr2); - signal(SIGPIPE, SIG_IGN); -#endif - StdoutLog *log = enableLog ? new StdoutLog() : NULL; - MyHandler h(log); - if (connector) - { - report_period = 4; - ConnectorSocket *s = new ConnectorSocket(h); - s -> Open(gHost, gPort); - s -> SetDeleteByHandler(); - h.Add(s); - } - else - if (http) - { - if (!url.size()) - { - url = "http://" + gHost + ":" + Utility::l2string(gPort) + "/"; - } - MyHttpSocket *s = new MyHttpSocket(h, url); - s -> SetDeleteByHandler(); - h.Add(s); - } - else - if (g_b_instant) - { - for (size_t i = 0; i < g_max_connections; i++) - { - MySocket *s = new MySocket(h, one); - s -> SetDeleteByHandler(); - s -> Open(gHost, gPort); - h.Add(s); - } - g_b_limit = true; - } - else - { - MySocket *s = new MySocket(h, one); - s -> SetDeleteByHandler(); - s -> Open(gHost, gPort); - h.Add(s); - } - time_t t = time(NULL); - gettime(&g_t_start, NULL); - while (!gQuit) - { - h.Select(1, 0); - if (g_b_flood) - { - fprintf(stderr, "\nFlooding\n"); - h.Flood(); - g_b_flood = false; - } - if (time(NULL) - t >= report_period) // report - { - t = time(NULL); - printreport_reset(); - h.Report(); - if (g_b_stop) - { - gQuit = true; - } - } - } - fprintf(stderr, "\nExiting...\n"); - if (log) - { -// delete log; - } - return 0; -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/threadstress.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/threadstress.cpp deleted file mode 100755 index 7f758e7391..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/threadstress.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#define DEB(x) x - - int count = 0; - -class EchoSocket : public TcpSocket -{ -public: - EchoSocket(ISocketHandler& h) : TcpSocket(h), m_client(false) { - SetLineProtocol(); - } - - void OnConnect() { - m_uid = "Test"; - Send(m_uid + "\n"); - m_client = true; - } - - void OnLine(const std::string& line) { - if (m_client) - { - if (line != m_uid) - throw Exception("Bad data returned."); - if (m_uid.size() < 8192) - m_uid = line + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random() % 26]; - else - SetCloseAndDelete(); - Send(m_uid + "\n"); -std::cout << m_uid << std::endl; - } - else - { - Send(line + "\n"); - } - } - - void Init() - { - if (GetParent() -> GetPort() >= 4000) - { -#ifdef HAVE_OPENSSL - EnableSSL(); -#else - throw Exception("SSL not available"); -#endif - } - } - -#ifdef HAVE_OPENSSL - void InitSSLServer() - { - InitializeContext("threadstress", "comb.pem", "", SSLv23_method()); - } -#endif - -private: - std::string m_uid; - bool m_client; -}; - -class StressThread : public Thread -{ -public: - StressThread(port_t port) : Thread(), m_port(port) { - SetDeleteOnExit(); - ++count; - } - ~StressThread() { - --count; - } - - void Run() { - try - { - StdoutLog log; - SocketHandler h(&log); - ListenSocket l(h); - l.Bind(m_port); - h.Add(&l); - EchoSocket client(h); - client.EnableSSL(); - client.Open("localhost", m_port); - h.Add(&client); - while (h.GetCount() > 1) - { - h.Select(1, 0); - } - std::cout << "Port#" << m_port << ": Leaving thread" << std::endl; - } - catch (const Exception& e) - { - std::cerr << "Port#" << m_port << ": " << e.ToString() << std::endl; - } - } - -private: - port_t m_port; -}; - -int main(int argc, char *argv[]) -{ - if (argc < 2) - { - printf("Usage: %s \n", *argv); - return -1; - } - signal(SIGPIPE, SIG_IGN); - for (int i = 0; i < atoi(argv[1]); i++) - new StressThread(4000 + i); - while (count > 0) - { - sleep(1); - } -} - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/x.cpp b/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/x.cpp deleted file mode 100755 index 2ca9b261a1..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sockets-2.3.9.4/tests/x.cpp +++ /dev/null @@ -1,298 +0,0 @@ -#include -#include -#include -#ifndef _WIN32 -#include -#endif -#include -#include - -#define HOST "localhost" -#define PORT 2222 - -#define TIME_US 250000 - -#define DEB(x) x - - -static bool quit = false; -static EventHandler *ph = NULL; - -static int lc = 0; -static int l2c = 0; -static int l3c = 0; - - -#ifndef _WIN32 -void sighandler(int s) -{ - quit = true; - ph -> SetQuit(); -} - - -void sigpipe(int s) -{ -} -#endif - - -class evHandler : public EventHandler -{ -public: - evHandler() : EventHandler() {} - evHandler(StdLog *p) : EventHandler(p) {} - - void CloseAll() { - for (socket_m::iterator it = m_sockets.begin(); it != m_sockets.end(); it++) - { - Socket *p = it -> second; - p -> SetCloseAndDelete(); - } - } - -}; - - -class lSocket : public TcpSocket, public IEventOwner -{ -public: - lSocket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast(h)), m_id(0), m_first(first) { - SetLineProtocol(); - lc++; - } - ~lSocket() { - } - - void OnConnect() { - if (!m_id) - { - m_id = AddEvent(0, TIME_US); - } - printf("."); - fflush(stdout); - } - void OnConnectFailed() { - printf("lSocket::OnConnectFailed\n"); - } - - void OnDelete() { - if (m_first) - printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); - } - - void OnEvent(int id) { - if (id != m_id) - { - printf("ID MISMATCH!\n"); - exit(-1); - } - if (!quit) - { - lSocket *p = new lSocket(Handler()); - p -> SetDeleteByHandler(); - p -> Open(HOST, PORT); - Handler().Add(p); - } - static_cast(Handler()).SetQuit( quit ); - SetCloseAndDelete(); - } - -private: - int m_id; - bool m_first; -}; - - -class l2Socket : public TcpSocket, public IEventOwner -{ -public: - l2Socket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast(h)), m_id(0), m_first(first) { - SetLineProtocol(); - l2c++; - } - ~l2Socket() { - } - - void OnConnect() { - printf("."); - fflush(stdout); - } - void OnConnectFailed() { - printf("l2Socket::OnConnectFailed\n"); - } - - void OnLine(const std::string& line) { - if (!m_id) - { - m_id = AddEvent(0, TIME_US); - } - } - - void OnDelete() { - if (m_first) - printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); - } - - void OnEvent(int id) { - if (id != m_id) - { - printf("ID MISMATCH!\n"); - exit(-1); - } - if (!quit) - { - l2Socket *p = new l2Socket(Handler()); - p -> SetDeleteByHandler(); - p -> Open(HOST, PORT); - Handler().Add(p); - } - static_cast(Handler()).SetQuit( quit ); - SetCloseAndDelete(); - } - -private: - int m_id; - bool m_first; -}; - - -class l3Socket : public TcpSocket, public IEventOwner -{ -public: - l3Socket(ISocketHandler& h, bool first = false) : TcpSocket(h), IEventOwner(static_cast(h)), m_ehlo(false), m_id(0), m_first(first) { - SetLineProtocol(); - l3c++; - } - ~l3Socket() { - } - - void OnConnect() { - printf("."); - fflush(stdout); - } - void OnConnectFailed() { - printf("l3Socket::OnConnectFailed\n"); - } - - void OnLine(const std::string& line) { - if (!m_ehlo) - { - Send("EHLO alhem.net\r\n"); - m_ehlo = true; - } - else - if (!m_id) - { - m_id = AddEvent(0, TIME_US); - } - } - - void OnDelete() { - if (m_first) - printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@ OnDelete() first @@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n" - "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"); - } - - void OnEvent(int id) { - if (id != m_id) - { - printf("ID MISMATCH!\n"); - exit(-1); - } - if (!quit) - { - l3Socket *p = new l3Socket(Handler()); - p -> SetDeleteByHandler(); - p -> Open(HOST, PORT); - Handler().Add(p); - } - static_cast(Handler()).SetQuit( quit ); - Send("QUIT\r\n"); - } - -private: - bool m_ehlo; - int m_id; - bool m_first; -}; - - -int main(int argc, char *argv[]) -{ -#ifndef _WIN32 - signal(SIGHUP, sighandler); - signal(SIGINT, sighandler); - signal(SIGPIPE, sigpipe); -#endif - - time_t tstart = time(NULL); - { - StdoutLog log; - { - evHandler h(&log); - ph = &h; - { - lSocket sock(h, true); - sock.Open(HOST, PORT); - h.Add(&sock); - { - l2Socket sock2(h, true); - sock2.Open(HOST, PORT); - h.Add(&sock2); - { - l3Socket sock3(h, true); - sock3.Open(HOST, PORT); - h.Add(&sock3); - - h.EventLoop(); - h.CloseAll(); - - // %! one socket refuses to go away - while (h.GetCount() > 1) - { - h.Select(1, 0); - } - printf("Exiting 1...\n"); - fflush(stdout); - } - printf("Exiting 2...\n"); - fflush(stdout); - } - printf("Exiting 3...\n"); - fflush(stdout); - } - printf("Exiting 4...\n"); - fflush(stdout); - } - printf("Exiting 5...\n"); - fflush(stdout); - } - printf("Exiting 6...\n"); - fflush(stdout); - - time_t tstop = time(NULL); - - time_t total = tstop - tstart + 1; - - printf("lc: %d\n", lc); - printf("l2c: %d\n", l2c); - printf("l3c: %d\n", l3c); - - printf("lc: %f\n", (double)lc / (double)total); - printf("l2c: %f\n", (double)l2c / (double)total); - printf("l3c: %f\n", (double)l3c / (double)total); -} - - diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sql/Makefile.am b/openair2/RRM_4_RRC_LITE/src/foreign/sql/Makefile.am deleted file mode 100755 index 9e132b3115..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sql/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -noinst_LIBRARIES = libsqlite.a - -libsqlite_a_SOURCES = sqlite3.c sqlite3.h diff --git a/openair2/RRM_4_RRC_LITE/src/foreign/sql/sqlite3.c b/openair2/RRM_4_RRC_LITE/src/foreign/sql/sqlite3.c deleted file mode 100755 index 5073c1683c..0000000000 --- a/openair2/RRM_4_RRC_LITE/src/foreign/sql/sqlite3.c +++ /dev/null @@ -1,134854 +0,0 @@ -/****************************************************************************** -** This file is an amalgamation of many separate C source files from SQLite -** version 3.7.5. By combining all the individual C code files into this -** single large file, the entire code can be compiled as a one translation -** unit. This allows many compilers to do optimizations that would not be -** possible if the files were compiled separately. Performance improvements -** of 5% or more are commonly seen when SQLite is compiled as a single -** translation unit. -** -** This file is all you need to compile SQLite. To use SQLite in other -** programs, you need this file and the "sqlite3.h" header file that defines -** the programming interface to the SQLite library. (If you do not have -** the "sqlite3.h" header file at hand, you will find a copy embedded within -** the text of this file. Search for "Begin file sqlite3.h" to find the start -** of the embedded sqlite3.h header file.) Additional code files may be needed -** if you want a wrapper to interface SQLite with your choice of programming -** language. The code for the "sqlite3" command-line shell is also in a -** separate file. This file contains only code for the core SQLite library. -*/ -#define SQLITE_CORE 1 -#define SQLITE_AMALGAMATION 1 -#ifndef SQLITE_PRIVATE -# define SQLITE_PRIVATE static -#endif -#ifndef SQLITE_API -# define SQLITE_API -#endif -/************** Begin file sqliteInt.h ***************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Internal interface definitions for SQLite. -** -*/ -#ifndef _SQLITEINT_H_ -#define _SQLITEINT_H_ - -/* -** These #defines should enable >2GB file support on POSIX if the -** underlying operating system supports it. If the OS lacks -** large file support, or if the OS is windows, these should be no-ops. -** -** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any -** system #includes. Hence, this block of code must be the very first -** code in all source files. -** -** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch -** on the compiler command line. This is necessary if you are compiling -** on a recent machine (ex: Red Hat 7.2) but you want your code to work -** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2 -** without this option, LFS is enable. But LFS does not exist in the kernel -** in Red Hat 6.0, so the code won't work. Hence, for maximum binary -** portability you should omit LFS. -** -** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later. -*/ -#ifndef SQLITE_DISABLE_LFS -# define _LARGE_FILE 1 -# ifndef _FILE_OFFSET_BITS -# define _FILE_OFFSET_BITS 64 -# endif -# define _LARGEFILE_SOURCE 1 -#endif - -/* -** Include the configuration header output by 'configure' if we're using the -** autoconf-based build -*/ -#ifdef _HAVE_SQLITE_CONFIG_H -#include "config.h" -#endif - -/************** Include sqliteLimit.h in the middle of sqliteInt.h ***********/ -/************** Begin file sqliteLimit.h *************************************/ -/* -** 2007 May 7 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** This file defines various limits of what SQLite can process. -*/ - -/* -** The maximum length of a TEXT or BLOB in bytes. This also -** limits the size of a row in a table or index. -** -** The hard limit is the ability of a 32-bit signed integer -** to count the size: 2^31-1 or 2147483647. -*/ -#ifndef SQLITE_MAX_LENGTH -# define SQLITE_MAX_LENGTH 1000000000 -#endif - -/* -** This is the maximum number of -** -** * Columns in a table -** * Columns in an index -** * Columns in a view -** * Terms in the SET clause of an UPDATE statement -** * Terms in the result set of a SELECT statement -** * Terms in the GROUP BY or ORDER BY clauses of a SELECT statement. -** * Terms in the VALUES clause of an INSERT statement -** -** The hard upper limit here is 32676. Most database people will -** tell you that in a well-normalized database, you usually should -** not have more than a dozen or so columns in any table. And if -** that is the case, there is no point in having more than a few -** dozen values in any of the other situations described above. -*/ -#ifndef SQLITE_MAX_COLUMN -# define SQLITE_MAX_COLUMN 2000 -#endif - -/* -** The maximum length of a single SQL statement in bytes. -** -** It used to be the case that setting this value to zero would -** turn the limit off. That is no longer true. It is not possible -** to turn this limit off. -*/ -#ifndef SQLITE_MAX_SQL_LENGTH -# define SQLITE_MAX_SQL_LENGTH 1000000000 -#endif - -/* -** The maximum depth of an expression tree. This is limited to -** some extent by SQLITE_MAX_SQL_LENGTH. But sometime you might -** want to place more severe limits on the complexity of an -** expression. -** -** A value of 0 used to mean that the limit was not enforced. -** But that is no longer true. The limit is now strictly enforced -** at all times. -*/ -#ifndef SQLITE_MAX_EXPR_DEPTH -# define SQLITE_MAX_EXPR_DEPTH 1000 -#endif - -/* -** The maximum number of terms in a compound SELECT statement. -** The code generator for compound SELECT statements does one -** level of recursion for each term. A stack overflow can result -** if the number of terms is too large. In practice, most SQL -** never has more than 3 or 4 terms. Use a value of 0 to disable -** any limit on the number of terms in a compount SELECT. -*/ -#ifndef SQLITE_MAX_COMPOUND_SELECT -# define SQLITE_MAX_COMPOUND_SELECT 500 -#endif - -/* -** The maximum number of opcodes in a VDBE program. -** Not currently enforced. -*/ -#ifndef SQLITE_MAX_VDBE_OP -# define SQLITE_MAX_VDBE_OP 25000 -#endif - -/* -** The maximum number of arguments to an SQL function. -*/ -#ifndef SQLITE_MAX_FUNCTION_ARG -# define SQLITE_MAX_FUNCTION_ARG 127 -#endif - -/* -** The maximum number of in-memory pages to use for the main database -** table and for temporary tables. The SQLITE_DEFAULT_CACHE_SIZE -*/ -#ifndef SQLITE_DEFAULT_CACHE_SIZE -# define SQLITE_DEFAULT_CACHE_SIZE 2000 -#endif -#ifndef SQLITE_DEFAULT_TEMP_CACHE_SIZE -# define SQLITE_DEFAULT_TEMP_CACHE_SIZE 500 -#endif - -/* -** The default number of frames to accumulate in the log file before -** checkpointing the database in WAL mode. -*/ -#ifndef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT -# define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 1000 -#endif - -/* -** The maximum number of attached databases. This must be between 0 -** and 30. The upper bound on 30 is because a 32-bit integer bitmap -** is used internally to track attached databases. -*/ -#ifndef SQLITE_MAX_ATTACHED -# define SQLITE_MAX_ATTACHED 10 -#endif - - -/* -** The maximum value of a ?nnn wildcard that the parser will accept. -*/ -#ifndef SQLITE_MAX_VARIABLE_NUMBER -# define SQLITE_MAX_VARIABLE_NUMBER 999 -#endif - -/* Maximum page size. The upper bound on this value is 65536. This a limit -** imposed by the use of 16-bit offsets within each page. -** -** Earlier versions of SQLite allowed the user to change this value at -** compile time. This is no longer permitted, on the grounds that it creates -** a library that is technically incompatible with an SQLite library -** compiled with a different limit. If a process operating on a database -** with a page-size of 65536 bytes crashes, then an instance of SQLite -** compiled with the default page-size limit will not be able to rollback -** the aborted transaction. This could lead to database corruption. -*/ -#ifdef SQLITE_MAX_PAGE_SIZE -# undef SQLITE_MAX_PAGE_SIZE -#endif -#define SQLITE_MAX_PAGE_SIZE 65536 - - -/* -** The default size of a database page. -*/ -#ifndef SQLITE_DEFAULT_PAGE_SIZE -# define SQLITE_DEFAULT_PAGE_SIZE 1024 -#endif -#if SQLITE_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE -# undef SQLITE_DEFAULT_PAGE_SIZE -# define SQLITE_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE -#endif - -/* -** Ordinarily, if no value is explicitly provided, SQLite creates databases -** with page size SQLITE_DEFAULT_PAGE_SIZE. However, based on certain -** device characteristics (sector-size and atomic write() support), -** SQLite may choose a larger value. This constant is the maximum value -** SQLite will choose on its own. -*/ -#ifndef SQLITE_MAX_DEFAULT_PAGE_SIZE -# define SQLITE_MAX_DEFAULT_PAGE_SIZE 8192 -#endif -#if SQLITE_MAX_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE -# undef SQLITE_MAX_DEFAULT_PAGE_SIZE -# define SQLITE_MAX_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE -#endif - - -/* -** Maximum number of pages in one database file. -** -** This is really just the default value for the max_page_count pragma. -** This value can be lowered (or raised) at run-time using that the -** max_page_count macro. -*/ -#ifndef SQLITE_MAX_PAGE_COUNT -# define SQLITE_MAX_PAGE_COUNT 1073741823 -#endif - -/* -** Maximum length (in bytes) of the pattern in a LIKE or GLOB -** operator. -*/ -#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH -# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 -#endif - -/* -** Maximum depth of recursion for triggers. -** -** A value of 1 means that a trigger program will not be able to itself -** fire any triggers. A value of 0 means that no trigger programs at all -** may be executed. -*/ -#ifndef SQLITE_MAX_TRIGGER_DEPTH -# define SQLITE_MAX_TRIGGER_DEPTH 1000 -#endif - -/************** End of sqliteLimit.h *****************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ - -/* Disable nuisance warnings on Borland compilers */ -#if defined(__BORLANDC__) -#pragma warn -rch /* unreachable code */ -#pragma warn -ccc /* Condition is always true or false */ -#pragma warn -aus /* Assigned value is never used */ -#pragma warn -csu /* Comparing signed and unsigned */ -#pragma warn -spa /* Suspicious pointer arithmetic */ -#endif - -/* Needed for various definitions... */ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE -#endif - -/* -** Include standard header files as necessary -*/ -#ifdef HAVE_STDINT_H -#include -#endif -#ifdef HAVE_INTTYPES_H -#include -#endif - -/* -** The number of samples of an index that SQLite takes in order to -** construct a histogram of the table content when running ANALYZE -** and with SQLITE_ENABLE_STAT2 -*/ -#define SQLITE_INDEX_SAMPLES 10 - -/* -** The following macros are used to cast pointers to integers and -** integers to pointers. The way you do this varies from one compiler -** to the next, so we have developed the following set of #if statements -** to generate appropriate macros for a wide range of compilers. -** -** The correct "ANSI" way to do this is to use the intptr_t type. -** Unfortunately, that typedef is not available on all compilers, or -** if it is available, it requires an #include of specific headers -** that vary from one machine to the next. -** -** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on -** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)). -** So we have to define the macros in different ways depending on the -** compiler. -*/ -#if defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ -# define SQLITE_INT_TO_PTR(X) ((void*)(__PTRDIFF_TYPE__)(X)) -# define SQLITE_PTR_TO_INT(X) ((int)(__PTRDIFF_TYPE__)(X)) -#elif !defined(__GNUC__) /* Works for compilers other than LLVM */ -# define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X]) -# define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0)) -#elif defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ -# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) -# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) -#else /* Generates a warning - but it always works */ -# define SQLITE_INT_TO_PTR(X) ((void*)(X)) -# define SQLITE_PTR_TO_INT(X) ((int)(X)) -#endif - -/* -** The SQLITE_THREADSAFE macro must be defined as 0, 1, or 2. -** 0 means mutexes are permanently disable and the library is never -** threadsafe. 1 means the library is serialized which is the highest -** level of threadsafety. 2 means the libary is multithreaded - multiple -** threads can use SQLite as long as no two threads try to use the same -** database connection at the same time. -** -** Older versions of SQLite used an optional THREADSAFE macro. -** We support that for legacy. -*/ -#if !defined(SQLITE_THREADSAFE) -#if defined(THREADSAFE) -# define SQLITE_THREADSAFE THREADSAFE -#else -# define SQLITE_THREADSAFE 1 /* IMP: R-07272-22309 */ -#endif -#endif - -/* -** The SQLITE_DEFAULT_MEMSTATUS macro must be defined as either 0 or 1. -** It determines whether or not the features related to -** SQLITE_CONFIG_MEMSTATUS are available by default or not. This value can -** be overridden at runtime using the sqlite3_config() API. -*/ -#if !defined(SQLITE_DEFAULT_MEMSTATUS) -# define SQLITE_DEFAULT_MEMSTATUS 1 -#endif - -/* -** Exactly one of the following macros must be defined in order to -** specify which memory allocation subsystem to use. -** -** SQLITE_SYSTEM_MALLOC // Use normal system malloc() -** SQLITE_MEMDEBUG // Debugging version of system malloc() -** -** (Historical note: There used to be several other options, but we've -** pared it down to just these two.) -** -** If none of the above are defined, then set SQLITE_SYSTEM_MALLOC as -** the default. -*/ -#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_MEMDEBUG)>1 -# error "At most one of the following compile-time configuration options\ -is allows: -SQLITE_SYSTEM_MALLOC, SQLITE_MEMDEBUG" -#endif -#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_MEMDEBUG)==0 -# define SQLITE_SYSTEM_MALLOC 1 -#endif - -/* -** If SQLITE_MALLOC_SOFT_LIMIT is not zero, then try to keep the -** sizes of memory allocations below this value where possible. -*/ -#if !defined(SQLITE_MALLOC_SOFT_LIMIT) -# define SQLITE_MALLOC_SOFT_LIMIT 1024 -#endif - -/* -** We need to define _XOPEN_SOURCE as follows in order to enable -** recursive mutexes on most Unix systems. But Mac OS X is different. -** The _XOPEN_SOURCE define causes problems for Mac OS X we are told, -** so it is omitted there. See ticket #2673. -** -** Later we learn that _XOPEN_SOURCE is poorly or incorrectly -** implemented on some systems. So we avoid defining it at all -** if it is already defined or if it is unneeded because we are -** not doing a threadsafe build. Ticket #2681. -** -** See also ticket #2741. -*/ -#if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__) && SQLITE_THREADSAFE -# define _XOPEN_SOURCE 500 /* Needed to enable pthread recursive mutexes */ -#endif - -/* -** The TCL headers are only needed when compiling the TCL bindings. -*/ -#if defined(SQLITE_TCL) || defined(TCLSH) -# include -#endif - -/* -** Many people are failing to set -DNDEBUG=1 when compiling SQLite. -** Setting NDEBUG makes the code smaller and run faster. So the following -** lines are added to automatically set NDEBUG unless the -DSQLITE_DEBUG=1 -** option is set. Thus NDEBUG becomes an opt-in rather than an opt-out -** feature. -*/ -#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) -# define NDEBUG 1 -#endif - -/* -** The testcase() macro is used to aid in coverage testing. When -** doing coverage testing, the condition inside the argument to -** testcase() must be evaluated both true and false in order to -** get full branch coverage. The testcase() macro is inserted -** to help ensure adequate test coverage in places where simple -** condition/decision coverage is inadequate. For example, testcase() -** can be used to make sure boundary values are tested. For -** bitmask tests, testcase() can be used to make sure each bit -** is significant and used at least once. On switch statements -** where multiple cases go to the same block of code, testcase() -** can insure that all cases are evaluated. -** -*/ -#ifdef SQLITE_COVERAGE_TEST -SQLITE_PRIVATE void sqlite3Coverage(int); -# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); } -#else -# define testcase(X) -#endif - -/* -** The TESTONLY macro is used to enclose variable declarations or -** other bits of code that are needed to support the arguments -** within testcase() and assert() macros. -*/ -#if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST) -# define TESTONLY(X) X -#else -# define TESTONLY(X) -#endif - -/* -** Sometimes we need a small amount of code such as a variable initialization -** to setup for a later assert() statement. We do not want this code to -** appear when assert() is disabled. The following macro is therefore -** used to contain that setup code. The "VVA" acronym stands for -** "Verification, Validation, and Accreditation". In other words, the -** code within VVA_ONLY() will only run during verification processes. -*/ -#ifndef NDEBUG -# define VVA_ONLY(X) X -#else -# define VVA_ONLY(X) -#endif - -/* -** The ALWAYS and NEVER macros surround boolean expressions which -** are intended to always be true or false, respectively. Such -** expressions could be omitted from the code completely. But they -** are included in a few cases in order to enhance the resilience -** of SQLite to unexpected behavior - to make the code "self-healing" -** or "ductile" rather than being "brittle" and crashing at the first -** hint of unplanned behavior. -** -** In other words, ALWAYS and NEVER are added for defensive code. -** -** When doing coverage testing ALWAYS and NEVER are hard-coded to -** be true and false so that the unreachable code then specify will -** not be counted as untested code. -*/ -#if defined(SQLITE_COVERAGE_TEST) -# define ALWAYS(X) (1) -# define NEVER(X) (0) -#elif !defined(NDEBUG) -# define ALWAYS(X) ((X)?1:(assert(0),0)) -# define NEVER(X) ((X)?(assert(0),1):0) -#else -# define ALWAYS(X) (X) -# define NEVER(X) (X) -#endif - -/* -** Return true (non-zero) if the input is a integer that is too large -** to fit in 32-bits. This macro is used inside of various testcase() -** macros to verify that we have tested SQLite for large-file support. -*/ -#define IS_BIG_INT(X) (((X)&~(i64)0xffffffff)!=0) - -/* -** The macro unlikely() is a hint that surrounds a boolean -** expression that is usually false. Macro likely() surrounds -** a boolean expression that is usually true. GCC is able to -** use these hints to generate better code, sometimes. -*/ -#if defined(__GNUC__) && 0 -# define likely(X) __builtin_expect((X),1) -# define unlikely(X) __builtin_expect((X),0) -#else -# define likely(X) !!(X) -# define unlikely(X) !!(X) -#endif - -/************** Include sqlite3.h in the middle of sqliteInt.h ***************/ -/************** Begin file sqlite3.h *****************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the SQLite library -** presents to client programs. If a C-function, structure, datatype, -** or constant definition does not appear in this file, then it is -** not a published API of SQLite, is subject to change without -** notice, and should not be referenced by programs that use SQLite. -** -** Some of the definitions that are in this file are marked as -** "experimental". Experimental interfaces are normally new -** features recently added to SQLite. We do not anticipate changes -** to experimental interfaces but reserve the right to make minor changes -** if experience from use "in the wild" suggest such changes are prudent. -** -** The official C-language API documentation for SQLite is derived -** from comments in this file. This file is the authoritative source -** on how SQLite interfaces are suppose to operate. -** -** The name of this file under configuration management is "sqlite.h.in". -** The makefile makes some minor changes to this file (such as inserting -** the version number) and changes its name to "sqlite3.h" as -** part of the build process. -*/ -#ifndef _SQLITE3_H_ -#define _SQLITE3_H_ -#include /* Needed for the definition of va_list */ - -/* -** Make sure we can call this stuff from C++. -*/ -#if 0 -extern "C" { -#endif - - -/* -** Add the ability to override 'extern' -*/ -#ifndef SQLITE_EXTERN -# define SQLITE_EXTERN extern -#endif - -#ifndef SQLITE_API -# define SQLITE_API -#endif - - -/* -** These no-op macros are used in front of interfaces to mark those -** interfaces as either deprecated or experimental. New applications -** should not use deprecated interfaces - they are support for backwards -** compatibility only. Application writers should be aware that -** experimental interfaces are subject to change in point releases. -** -** These macros used to resolve to various kinds of compiler magic that -** would generate warning messages when they were used. But that -** compiler magic ended up generating such a flurry of bug reports -** that we have taken it all out and gone back to using simple -** noop macros. -*/ -#define SQLITE_DEPRECATED -#define SQLITE_EXPERIMENTAL - -/* -** Ensure these symbols were not defined by some previous header file. -*/ -#ifdef SQLITE_VERSION -# undef SQLITE_VERSION -#endif -#ifdef SQLITE_VERSION_NUMBER -# undef SQLITE_VERSION_NUMBER -#endif - -/* -** CAPI3REF: Compile-Time Library Version Numbers -** -** ^(The [SQLITE_VERSION] C preprocessor macro in the sqlite3.h header -** evaluates to a string literal that is the SQLite version in the -** format "X.Y.Z" where X is the major version number (always 3 for -** SQLite3) and Y is the minor version number and Z is the release number.)^ -** ^(The [SQLITE_VERSION_NUMBER] C preprocessor macro resolves to an integer -** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same -** numbers used in [SQLITE_VERSION].)^ -** The SQLITE_VERSION_NUMBER for any given release of SQLite will also -** be larger than the release from which it is derived. Either Y will -** be held constant and Z will be incremented or else Y will be incremented -** and Z will be reset to zero. -** -** Since version 3.6.18, SQLite source code has been stored in the -** Fossil configuration management -** system. ^The SQLITE_SOURCE_ID macro evaluates to -** a string which identifies a particular check-in of SQLite -** within its configuration management system. ^The SQLITE_SOURCE_ID -** string contains the date and time of the check-in (UTC) and an SHA1 -** hash of the entire source tree. -** -** See also: -[sqlite3_libversion()], -** [sqlite3_libversion_number()], [sqlite3_sourceid()], -** [sqlite_version()] and [sqlite_source_id()]. -*/ -#define SQLITE_VERSION "3.7.5" -#define SQLITE_VERSION_NUMBER 3007005 -#define SQLITE_SOURCE_ID "2011-01-28 17:03:50 ed759d5a9edb3bba5f48f243df47be29e3fe8cd7" - -/* -** CAPI3REF: Run-Time Library Version Numbers -** KEYWORDS: sqlite3_version, sqlite3_sourceid -** -** These interfaces provide the same information as the [SQLITE_VERSION], -** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros -** but are associated with the library instead of the header file. ^(Cautious -** programmers might include assert() statements in their application to -** verify that values returned by these interfaces match the macros in -** the header, and thus insure that the application is -** compiled with matching library and header files. -** -**
-** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
-** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
-** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 );
-** 
)^ -** -** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] -** macro. ^The sqlite3_libversion() function returns a pointer to the -** to the sqlite3_version[] string constant. The sqlite3_libversion() -** function is provided for use in DLLs since DLL users usually do not have -** direct access to string constants within the DLL. ^The -** sqlite3_libversion_number() function returns an integer equal to -** [SQLITE_VERSION_NUMBER]. ^The sqlite3_sourceid() function returns -** a pointer to a string constant whose value is the same as the -** [SQLITE_SOURCE_ID] C preprocessor macro. -** -** See also: [sqlite_version()] and [sqlite_source_id()]. -*/ -SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; -SQLITE_API const char *sqlite3_libversion(void); -SQLITE_API const char *sqlite3_sourceid(void); -SQLITE_API int sqlite3_libversion_number(void); - -/* -** CAPI3REF: Run-Time Library Compilation Options Diagnostics -** -** ^The sqlite3_compileoption_used() function returns 0 or 1 -** indicating whether the specified option was defined at -** compile time. ^The SQLITE_ prefix may be omitted from the -** option name passed to sqlite3_compileoption_used(). -** -** ^The sqlite3_compileoption_get() function allows iterating -** over the list of options that were defined at compile time by -** returning the N-th compile time option string. ^If N is out of range, -** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ -** prefix is omitted from any strings returned by -** sqlite3_compileoption_get(). -** -** ^Support for the diagnostic functions sqlite3_compileoption_used() -** and sqlite3_compileoption_get() may be omitted by specifying the -** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. -** -** See also: SQL functions [sqlite_compileoption_used()] and -** [sqlite_compileoption_get()] and the [compile_options pragma]. -*/ -#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS -SQLITE_API int sqlite3_compileoption_used(const char *zOptName); -SQLITE_API const char *sqlite3_compileoption_get(int N); -#endif - -/* -** CAPI3REF: Test To See If The Library Is Threadsafe -** -** ^The sqlite3_threadsafe() function returns zero if and only if -** SQLite was compiled mutexing code omitted due to the -** [SQLITE_THREADSAFE] compile-time option being set to 0. -** -** SQLite can be compiled with or without mutexes. When -** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes -** are enabled and SQLite is threadsafe. When the -** [SQLITE_THREADSAFE] macro is 0, -** the mutexes are omitted. Without the mutexes, it is not safe -** to use SQLite concurrently from more than one thread. -** -** Enabling mutexes incurs a measurable performance penalty. -** So if speed is of utmost importance, it makes sense to disable -** the mutexes. But for maximum safety, mutexes should be enabled. -** ^The default behavior is for mutexes to be enabled. -** -** This interface can be used by an application to make sure that the -** version of SQLite that it is linking against was compiled with -** the desired setting of the [SQLITE_THREADSAFE] macro. -** -** This interface only reports on the compile-time mutex setting -** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with -** SQLITE_THREADSAFE=1 or =2 then mutexes are enabled by default but -** can be fully or partially disabled using a call to [sqlite3_config()] -** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD], -** or [SQLITE_CONFIG_MUTEX]. ^(The return value of the -** sqlite3_threadsafe() function shows only the compile-time setting of -** thread safety, not any run-time changes to that setting made by -** sqlite3_config(). In other words, the return value from sqlite3_threadsafe() -** is unchanged by calls to sqlite3_config().)^ -** -** See the [threading mode] documentation for additional information. -*/ -SQLITE_API int sqlite3_threadsafe(void); - -/* -** CAPI3REF: Database Connection Handle -** KEYWORDS: {database connection} {database connections} -** -** Each open SQLite database is represented by a pointer to an instance of -** the opaque structure named "sqlite3". It is useful to think of an sqlite3 -** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and -** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] -** is its destructor. There are many other interfaces (such as -** [sqlite3_prepare_v2()], [sqlite3_create_function()], and -** [sqlite3_busy_timeout()] to name but three) that are methods on an -** sqlite3 object. -*/ -typedef struct sqlite3 sqlite3; - -/* -** CAPI3REF: 64-Bit Integer Types -** KEYWORDS: sqlite_int64 sqlite_uint64 -** -** Because there is no cross-platform way to specify 64-bit integer types -** SQLite includes typedefs for 64-bit signed and unsigned integers. -** -** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. -** The sqlite_int64 and sqlite_uint64 types are supported for backwards -** compatibility only. -** -** ^The sqlite3_int64 and sqlite_int64 types can store integer values -** between -9223372036854775808 and +9223372036854775807 inclusive. ^The -** sqlite3_uint64 and sqlite_uint64 types can store integer values -** between 0 and +18446744073709551615 inclusive. -*/ -#ifdef SQLITE_INT64_TYPE -typedef SQLITE_INT64_TYPE sqlite_int64; -typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; -#elif defined(_MSC_VER) || defined(__BORLANDC__) -typedef __int64 sqlite_int64; -typedef unsigned __int64 sqlite_uint64; -#else -typedef long long int sqlite_int64; -typedef unsigned long long int sqlite_uint64; -#endif -typedef sqlite_int64 sqlite3_int64; -typedef sqlite_uint64 sqlite3_uint64; - -/* -** If compiling for a processor that lacks floating point support, -** substitute integer for floating-point. -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# define double sqlite3_int64 -#endif - -/* -** CAPI3REF: Closing A Database Connection -** -** ^The sqlite3_close() routine is the destructor for the [sqlite3] object. -** ^Calls to sqlite3_close() return SQLITE_OK if the [sqlite3] object is -** successfully destroyed and all associated resources are deallocated. -** -** Applications must [sqlite3_finalize | finalize] all [prepared statements] -** and [sqlite3_blob_close | close] all [BLOB handles] associated with -** the [sqlite3] object prior to attempting to close the object. ^If -** sqlite3_close() is called on a [database connection] that still has -** outstanding [prepared statements] or [BLOB handles], then it returns -** SQLITE_BUSY. -** -** ^If [sqlite3_close()] is invoked while a transaction is open, -** the transaction is automatically rolled back. -** -** The C parameter to [sqlite3_close(C)] must be either a NULL -** pointer or an [sqlite3] object pointer obtained -** from [sqlite3_open()], [sqlite3_open16()], or -** [sqlite3_open_v2()], and not previously closed. -** ^Calling sqlite3_close() with a NULL pointer argument is a -** harmless no-op. -*/ -SQLITE_API int sqlite3_close(sqlite3 *); - -/* -** The type for a callback function. -** This is legacy and deprecated. It is included for historical -** compatibility and is not documented. -*/ -typedef int (*sqlite3_callback)(void*,int,char**, char**); - -/* -** CAPI3REF: One-Step Query Execution Interface -** -** The sqlite3_exec() interface is a convenience wrapper around -** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], -** that allows an application to run multiple statements of SQL -** without having to use a lot of C code. -** -** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, -** semicolon-separate SQL statements passed into its 2nd argument, -** in the context of the [database connection] passed in as its 1st -** argument. ^If the callback function of the 3rd argument to -** sqlite3_exec() is not NULL, then it is invoked for each result row -** coming out of the evaluated SQL statements. ^The 4th argument to -** to sqlite3_exec() is relayed through to the 1st argument of each -** callback invocation. ^If the callback pointer to sqlite3_exec() -** is NULL, then no callback is ever invoked and result rows are -** ignored. -** -** ^If an error occurs while evaluating the SQL statements passed into -** sqlite3_exec(), then execution of the current statement stops and -** subsequent statements are skipped. ^If the 5th parameter to sqlite3_exec() -** is not NULL then any error message is written into memory obtained -** from [sqlite3_malloc()] and passed back through the 5th parameter. -** To avoid memory leaks, the application should invoke [sqlite3_free()] -** on error message strings returned through the 5th parameter of -** of sqlite3_exec() after the error message string is no longer needed. -** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors -** occur, then sqlite3_exec() sets the pointer in its 5th parameter to -** NULL before returning. -** -** ^If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() -** routine returns SQLITE_ABORT without invoking the callback again and -** without running any subsequent SQL statements. -** -** ^The 2nd argument to the sqlite3_exec() callback function is the -** number of columns in the result. ^The 3rd argument to the sqlite3_exec() -** callback is an array of pointers to strings obtained as if from -** [sqlite3_column_text()], one for each column. ^If an element of a -** result row is NULL then the corresponding string pointer for the -** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the -** sqlite3_exec() callback is an array of pointers to strings where each -** entry represents the name of corresponding result column as obtained -** from [sqlite3_column_name()]. -** -** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer -** to an empty string, or a pointer that contains only whitespace and/or -** SQL comments, then no SQL statements are evaluated and the database -** is not changed. -** -** Restrictions: -** -**
    -**
  • The application must insure that the 1st parameter to sqlite3_exec() -** is a valid and open [database connection]. -**
  • The application must not close [database connection] specified by -** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. -**
  • The application must not modify the SQL statement text passed into -** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. -**
-*/ -SQLITE_API int sqlite3_exec( - sqlite3*, /* An open database */ - const char *sql, /* SQL to be evaluated */ - int (*callback)(void*,int,char**,char**), /* Callback function */ - void *, /* 1st argument to callback */ - char **errmsg /* Error msg written here */ -); - -/* -** CAPI3REF: Result Codes -** KEYWORDS: SQLITE_OK {error code} {error codes} -** KEYWORDS: {result code} {result codes} -** -** Many SQLite functions return an integer result code from the set shown -** here in order to indicates success or failure. -** -** New error codes may be added in future versions of SQLite. -** -** See also: [SQLITE_IOERR_READ | extended result codes] -*/ -#define SQLITE_OK 0 /* Successful result */ -/* beginning-of-error-codes */ -#define SQLITE_ERROR 1 /* SQL error or missing database */ -#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ -#define SQLITE_PERM 3 /* Access permission denied */ -#define SQLITE_ABORT 4 /* Callback routine requested an abort */ -#define SQLITE_BUSY 5 /* The database file is locked */ -#define SQLITE_LOCKED 6 /* A table in the database is locked */ -#define SQLITE_NOMEM 7 /* A malloc() failed */ -#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ -#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ -#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ -#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ -#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ -#define SQLITE_FULL 13 /* Insertion failed because database is full */ -#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ -#define SQLITE_PROTOCOL 15 /* Database lock protocol error */ -#define SQLITE_EMPTY 16 /* Database is empty */ -#define SQLITE_SCHEMA 17 /* The database schema changed */ -#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ -#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ -#define SQLITE_MISMATCH 20 /* Data type mismatch */ -#define SQLITE_MISUSE 21 /* Library used incorrectly */ -#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ -#define SQLITE_AUTH 23 /* Authorization denied */ -#define SQLITE_FORMAT 24 /* Auxiliary database format error */ -#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ -#define SQLITE_NOTADB 26 /* File opened that is not a database file */ -#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ -#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ -/* end-of-error-codes */ - -/* -** CAPI3REF: Extended Result Codes -** KEYWORDS: {extended error code} {extended error codes} -** KEYWORDS: {extended result code} {extended result codes} -** -** In its default configuration, SQLite API routines return one of 26 integer -** [SQLITE_OK | result codes]. However, experience has shown that many of -** these result codes are too coarse-grained. They do not provide as -** much information about problems as programmers might like. In an effort to -** address this, newer versions of SQLite (version 3.3.8 and later) include -** support for additional result codes that provide more detailed information -** about errors. The extended result codes are enabled or disabled -** on a per database connection basis using the -** [sqlite3_extended_result_codes()] API. -** -** Some of the available extended result codes are listed here. -** One may expect the number of extended result codes will be expand -** over time. Software that uses extended result codes should expect -** to see new result codes in future releases of SQLite. -** -** The SQLITE_OK result code will never be extended. It will always -** be exactly zero. -*/ -#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) -#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) -#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) -#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) -#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) -#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) -#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) -#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) -#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) -#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) -#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) -#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) -#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) -#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) -#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) -#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) -#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) -#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8)) -#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8)) -#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8)) -#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) -#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) -#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) - -/* -** CAPI3REF: Flags For File Open Operations -** -** These bit values are intended for use in the -** 3rd parameter to the [sqlite3_open_v2()] interface and -** in the 4th parameter to the xOpen method of the -** [sqlite3_vfs] object. -*/ -#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ -#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ -#define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ -#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ -#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ -#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ -#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ -#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ -#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ -#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ -#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ -#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ - -/* -** CAPI3REF: Device Characteristics -** -** The xDeviceCharacteristics method of the [sqlite3_io_methods] -** object returns an integer which is a vector of the these -** bit values expressing I/O characteristics of the mass storage -** device that holds the file that the [sqlite3_io_methods] -** refers to. -** -** The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). -*/ -#define SQLITE_IOCAP_ATOMIC 0x00000001 -#define SQLITE_IOCAP_ATOMIC512 0x00000002 -#define SQLITE_IOCAP_ATOMIC1K 0x00000004 -#define SQLITE_IOCAP_ATOMIC2K 0x00000008 -#define SQLITE_IOCAP_ATOMIC4K 0x00000010 -#define SQLITE_IOCAP_ATOMIC8K 0x00000020 -#define SQLITE_IOCAP_ATOMIC16K 0x00000040 -#define SQLITE_IOCAP_ATOMIC32K 0x00000080 -#define SQLITE_IOCAP_ATOMIC64K 0x00000100 -#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 -#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 -#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 - -/* -** CAPI3REF: File Locking Levels -** -** SQLite uses one of these integer values as the second -** argument to calls it makes to the xLock() and xUnlock() methods -** of an [sqlite3_io_methods] object. -*/ -#define SQLITE_LOCK_NONE 0 -#define SQLITE_LOCK_SHARED 1 -#define SQLITE_LOCK_RESERVED 2 -#define SQLITE_LOCK_PENDING 3 -#define SQLITE_LOCK_EXCLUSIVE 4 - -/* -** CAPI3REF: Synchronization Type Flags -** -** When SQLite invokes the xSync() method of an -** [sqlite3_io_methods] object it uses a combination of -** these integer values as the second argument. -** -** When the SQLITE_SYNC_DATAONLY flag is used, it means that the -** sync operation only needs to flush data to mass storage. Inode -** information need not be flushed. If the lower four bits of the flag -** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. -** If the lower four bits equal SQLITE_SYNC_FULL, that means -** to use Mac OS X style fullsync instead of fsync(). -** -** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags -** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL -** settings. The [synchronous pragma] determines when calls to the -** xSync VFS method occur and applies uniformly across all platforms. -** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how -** energetic or rigorous or forceful the sync operations are and -** only make a difference on Mac OSX for the default SQLite code. -** (Third-party VFS implementations might also make the distinction -** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the -** operating systems natively supported by SQLite, only Mac OSX -** cares about the difference.) -*/ -#define SQLITE_SYNC_NORMAL 0x00002 -#define SQLITE_SYNC_FULL 0x00003 -#define SQLITE_SYNC_DATAONLY 0x00010 - -/* -** CAPI3REF: OS Interface Open File Handle -** -** An [sqlite3_file] object represents an open file in the -** [sqlite3_vfs | OS interface layer]. Individual OS interface -** implementations will -** want to subclass this object by appending additional fields -** for their own use. The pMethods entry is a pointer to an -** [sqlite3_io_methods] object that defines methods for performing -** I/O operations on the open file. -*/ -typedef struct sqlite3_file sqlite3_file; -struct sqlite3_file { - const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ -}; - -/* -** CAPI3REF: OS Interface File Virtual Methods Object -** -** Every file opened by the [sqlite3_vfs] xOpen method populates an -** [sqlite3_file] object (or, more commonly, a subclass of the -** [sqlite3_file] object) with a pointer to an instance of this object. -** This object defines the methods used to perform various operations -** against the open file represented by the [sqlite3_file] object. -** -** If the xOpen method sets the sqlite3_file.pMethods element -** to a non-NULL pointer, then the sqlite3_io_methods.xClose method -** may be invoked even if the xOpen reported that it failed. The -** only way to prevent a call to xClose following a failed xOpen -** is for the xOpen to set the sqlite3_file.pMethods element to NULL. -** -** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or -** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). -** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] -** flag may be ORed in to indicate that only the data of the file -** and not its inode needs to be synced. -** -** The integer values to xLock() and xUnlock() are one of -**
    -**
  • [SQLITE_LOCK_NONE], -**
  • [SQLITE_LOCK_SHARED], -**
  • [SQLITE_LOCK_RESERVED], -**
  • [SQLITE_LOCK_PENDING], or -**
  • [SQLITE_LOCK_EXCLUSIVE]. -**
-** xLock() increases the lock. xUnlock() decreases the lock. -** The xCheckReservedLock() method checks whether any database connection, -** either in this process or in some other process, is holding a RESERVED, -** PENDING, or EXCLUSIVE lock on the file. It returns true -** if such a lock exists and false otherwise. -** -** The xFileControl() method is a generic interface that allows custom -** VFS implementations to directly control an open file using the -** [sqlite3_file_control()] interface. The second "op" argument is an -** integer opcode. The third argument is a generic pointer intended to -** point to a structure that may contain arguments or space in which to -** write return values. Potential uses for xFileControl() might be -** functions to enable blocking locks with timeouts, to change the -** locking strategy (for example to use dot-file locks), to inquire -** about the status of a lock, or to break stale locks. The SQLite -** core reserves all opcodes less than 100 for its own use. -** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available. -** Applications that define a custom xFileControl method should use opcodes -** greater than 100 to avoid conflicts. VFS implementations should -** return [SQLITE_NOTFOUND] for file control opcodes that they do not -** recognize. -** -** The xSectorSize() method returns the sector size of the -** device that underlies the file. The sector size is the -** minimum write that can be performed without disturbing -** other bytes in the file. The xDeviceCharacteristics() -** method returns a bit vector describing behaviors of the -** underlying device: -** -**
    -**
  • [SQLITE_IOCAP_ATOMIC] -**
  • [SQLITE_IOCAP_ATOMIC512] -**
  • [SQLITE_IOCAP_ATOMIC1K] -**
  • [SQLITE_IOCAP_ATOMIC2K] -**
  • [SQLITE_IOCAP_ATOMIC4K] -**
  • [SQLITE_IOCAP_ATOMIC8K] -**
  • [SQLITE_IOCAP_ATOMIC16K] -**
  • [SQLITE_IOCAP_ATOMIC32K] -**
  • [SQLITE_IOCAP_ATOMIC64K] -**
  • [SQLITE_IOCAP_SAFE_APPEND] -**
  • [SQLITE_IOCAP_SEQUENTIAL] -**
-** -** The SQLITE_IOCAP_ATOMIC property means that all writes of -** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values -** mean that writes of blocks that are nnn bytes in size and -** are aligned to an address which is an integer multiple of -** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means -** that when data is appended to a file, the data is appended -** first then the size of the file is extended, never the other -** way around. The SQLITE_IOCAP_SEQUENTIAL property means that -** information is written to disk in the same order as calls -** to xWrite(). -** -** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill -** in the unread portions of the buffer with zeros. A VFS that -** fails to zero-fill short reads might seem to work. However, -** failure to zero-fill short reads will eventually lead to -** database corruption. -*/ -typedef struct sqlite3_io_methods sqlite3_io_methods; -struct sqlite3_io_methods { - int iVersion; - int (*xClose)(sqlite3_file*); - int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); - int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); - int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); - int (*xSync)(sqlite3_file*, int flags); - int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); - int (*xLock)(sqlite3_file*, int); - int (*xUnlock)(sqlite3_file*, int); - int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); - int (*xFileControl)(sqlite3_file*, int op, void *pArg); - int (*xSectorSize)(sqlite3_file*); - int (*xDeviceCharacteristics)(sqlite3_file*); - /* Methods above are valid for version 1 */ - int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); - int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); - void (*xShmBarrier)(sqlite3_file*); - int (*xShmUnmap)(sqlite3_file*, int deleteFlag); - /* Methods above are valid for version 2 */ - /* Additional methods may be added in future releases */ -}; - -/* -** CAPI3REF: Standard File Control Opcodes -** -** These integer constants are opcodes for the xFileControl method -** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] -** interface. -** -** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This -** opcode causes the xFileControl method to write the current state of -** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], -** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) -** into an integer that the pArg argument points to. This capability -** is used during testing and only needs to be supported when SQLITE_TEST -** is defined. -** -** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS -** layer a hint of how large the database file will grow to be during the -** current transaction. This hint is not guaranteed to be accurate but it -** is often close. The underlying VFS might choose to preallocate database -** file space based on this hint in order to help writes to the database -** file run faster. -** -** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS -** extends and truncates the database file in chunks of a size specified -** by the user. The fourth argument to [sqlite3_file_control()] should -** point to an integer (type int) containing the new chunk-size to use -** for the nominated database. Allocating database file space in large -** chunks (say 1MB at a time), may reduce file-system fragmentation and -** improve performance on some systems. -** -** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer -** to the [sqlite3_file] object associated with a particular database -** connection. See the [sqlite3_file_control()] documentation for -** additional information. -** -** ^(The [SQLITE_FCNTL_SYNC_OMITTED] opcode is generated internally by -** SQLite and sent to all VFSes in place of a call to the xSync method -** when the database connection has [PRAGMA synchronous] set to OFF.)^ -** Some specialized VFSes need this signal in order to operate correctly -** when [PRAGMA synchronous | PRAGMA synchronous=OFF] is set, but most -** VFSes do not need this signal and should silently ignore this opcode. -** Applications should not call [sqlite3_file_control()] with this -** opcode as doing so may disrupt the operation of the specilized VFSes -** that do require it. -*/ -#define SQLITE_FCNTL_LOCKSTATE 1 -#define SQLITE_GET_LOCKPROXYFILE 2 -#define SQLITE_SET_LOCKPROXYFILE 3 -#define SQLITE_LAST_ERRNO 4 -#define SQLITE_FCNTL_SIZE_HINT 5 -#define SQLITE_FCNTL_CHUNK_SIZE 6 -#define SQLITE_FCNTL_FILE_POINTER 7 -#define SQLITE_FCNTL_SYNC_OMITTED 8 - - -/* -** CAPI3REF: Mutex Handle -** -** The mutex module within SQLite defines [sqlite3_mutex] to be an -** abstract type for a mutex object. The SQLite core never looks -** at the internal representation of an [sqlite3_mutex]. It only -** deals with pointers to the [sqlite3_mutex] object. -** -** Mutexes are created using [sqlite3_mutex_alloc()]. -*/ -typedef struct sqlite3_mutex sqlite3_mutex; - -/* -** CAPI3REF: OS Interface Object -** -** An instance of the sqlite3_vfs object defines the interface between -** the SQLite core and the underlying operating system. The "vfs" -** in the name of the object stands for "virtual file system". -** -** The value of the iVersion field is initially 1 but may be larger in -** future versions of SQLite. Additional fields may be appended to this -** object when the iVersion value is increased. Note that the structure -** of the sqlite3_vfs object changes in the transaction between -** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not -** modified. -** -** The szOsFile field is the size of the subclassed [sqlite3_file] -** structure used by this VFS. mxPathname is the maximum length of -** a pathname in this VFS. -** -** Registered sqlite3_vfs objects are kept on a linked list formed by -** the pNext pointer. The [sqlite3_vfs_register()] -** and [sqlite3_vfs_unregister()] interfaces manage this list -** in a thread-safe way. The [sqlite3_vfs_find()] interface -** searches the list. Neither the application code nor the VFS -** implementation should use the pNext pointer. -** -** The pNext field is the only field in the sqlite3_vfs -** structure that SQLite will ever modify. SQLite will only access -** or modify this field while holding a particular static mutex. -** The application should never modify anything within the sqlite3_vfs -** object once the object has been registered. -** -** The zName field holds the name of the VFS module. The name must -** be unique across all VFS modules. -** -** ^SQLite guarantees that the zFilename parameter to xOpen -** is either a NULL pointer or string obtained -** from xFullPathname() with an optional suffix added. -** ^If a suffix is added to the zFilename parameter, it will -** consist of a single "-" character followed by no more than -** 10 alphanumeric and/or "-" characters. -** ^SQLite further guarantees that -** the string will be valid and unchanged until xClose() is -** called. Because of the previous sentence, -** the [sqlite3_file] can safely store a pointer to the -** filename if it needs to remember the filename for some reason. -** If the zFilename parameter to xOpen is a NULL pointer then xOpen -** must invent its own temporary name for the file. ^Whenever the -** xFilename parameter is NULL it will also be the case that the -** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. -** -** The flags argument to xOpen() includes all bits set in -** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] -** or [sqlite3_open16()] is used, then flags includes at least -** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. -** If xOpen() opens a file read-only then it sets *pOutFlags to -** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. -** -** ^(SQLite will also add one of the following flags to the xOpen() -** call, depending on the object being opened: -** -**
    -**
  • [SQLITE_OPEN_MAIN_DB] -**
  • [SQLITE_OPEN_MAIN_JOURNAL] -**
  • [SQLITE_OPEN_TEMP_DB] -**
  • [SQLITE_OPEN_TEMP_JOURNAL] -**
  • [SQLITE_OPEN_TRANSIENT_DB] -**
  • [SQLITE_OPEN_SUBJOURNAL] -**
  • [SQLITE_OPEN_MASTER_JOURNAL] -**
  • [SQLITE_OPEN_WAL] -**
)^ -** -** The file I/O implementation can use the object type flags to -** change the way it deals with files. For example, an application -** that does not care about crash recovery or rollback might make -** the open of a journal file a no-op. Writes to this journal would -** also be no-ops, and any attempt to read the journal would return -** SQLITE_IOERR. Or the implementation might recognize that a database -** file will be doing page-aligned sector reads and writes in a random -** order and set up its I/O subsystem accordingly. -** -** SQLite might also add one of the following flags to the xOpen method: -** -**
    -**
  • [SQLITE_OPEN_DELETEONCLOSE] -**
  • [SQLITE_OPEN_EXCLUSIVE] -**
-** -** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be -** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] -** will be set for TEMP databases and their journals, transient -** databases, and subjournals. -** -** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction -** with the [SQLITE_OPEN_CREATE] flag, which are both directly -** analogous to the O_EXCL and O_CREAT flags of the POSIX open() -** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the -** SQLITE_OPEN_CREATE, is used to indicate that file should always -** be created, and that it is an error if it already exists. -** It is not used to indicate the file should be opened -** for exclusive access. -** -** ^At least szOsFile bytes of memory are allocated by SQLite -** to hold the [sqlite3_file] structure passed as the third -** argument to xOpen. The xOpen method does not have to -** allocate the structure; it should just fill it in. Note that -** the xOpen method must set the sqlite3_file.pMethods to either -** a valid [sqlite3_io_methods] object or to NULL. xOpen must do -** this even if the open fails. SQLite expects that the sqlite3_file.pMethods -** element will be valid after xOpen returns regardless of the success -** or failure of the xOpen call. -** -** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] -** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to -** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] -** to test whether a file is at least readable. The file can be a -** directory. -** -** ^SQLite will always allocate at least mxPathname+1 bytes for the -** output buffer xFullPathname. The exact size of the output buffer -** is also passed as a parameter to both methods. If the output buffer -** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is -** handled as a fatal error by SQLite, vfs implementations should endeavor -** to prevent this by setting mxPathname to a sufficiently large value. -** -** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() -** interfaces are not strictly a part of the filesystem, but they are -** included in the VFS structure for completeness. -** The xRandomness() function attempts to return nBytes bytes -** of good-quality randomness into zOut. The return value is -** the actual number of bytes of randomness obtained. -** The xSleep() method causes the calling thread to sleep for at -** least the number of microseconds given. ^The xCurrentTime() -** method returns a Julian Day Number for the current date and time as -** a floating point value. -** ^The xCurrentTimeInt64() method returns, as an integer, the Julian -** Day Number multipled by 86400000 (the number of milliseconds in -** a 24-hour day). -** ^SQLite will use the xCurrentTimeInt64() method to get the current -** date and time if that method is available (if iVersion is 2 or -** greater and the function pointer is not NULL) and will fall back -** to xCurrentTime() if xCurrentTimeInt64() is unavailable. -*/ -typedef struct sqlite3_vfs sqlite3_vfs; -struct sqlite3_vfs { - int iVersion; /* Structure version number (currently 2) */ - int szOsFile; /* Size of subclassed sqlite3_file */ - int mxPathname; /* Maximum file pathname length */ - sqlite3_vfs *pNext; /* Next registered VFS */ - const char *zName; /* Name of this virtual file system */ - void *pAppData; /* Pointer to application-specific data */ - int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, - int flags, int *pOutFlags); - int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); - int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); - int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); - void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); - void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); - void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); - void (*xDlClose)(sqlite3_vfs*, void*); - int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); - int (*xSleep)(sqlite3_vfs*, int microseconds); - int (*xCurrentTime)(sqlite3_vfs*, double*); - int (*xGetLastError)(sqlite3_vfs*, int, char *); - /* - ** The methods above are in version 1 of the sqlite_vfs object - ** definition. Those that follow are added in version 2 or later - */ - int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); - /* - ** The methods above are in versions 1 and 2 of the sqlite_vfs object. - ** New fields may be appended in figure versions. The iVersion - ** value will increment whenever this happens. - */ -}; - -/* -** CAPI3REF: Flags for the xAccess VFS method -** -** These integer constants can be used as the third parameter to -** the xAccess method of an [sqlite3_vfs] object. They determine -** what kind of permissions the xAccess method is looking for. -** With SQLITE_ACCESS_EXISTS, the xAccess method -** simply checks whether the file exists. -** With SQLITE_ACCESS_READWRITE, the xAccess method -** checks whether the named directory is both readable and writable -** (in other words, if files can be added, removed, and renamed within -** the directory). -** The SQLITE_ACCESS_READWRITE constant is currently used only by the -** [temp_store_directory pragma], though this could change in a future -** release of SQLite. -** With SQLITE_ACCESS_READ, the xAccess method -** checks whether the file is readable. The SQLITE_ACCESS_READ constant is -** currently unused, though it might be used in a future release of -** SQLite. -*/ -#define SQLITE_ACCESS_EXISTS 0 -#define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */ -#define SQLITE_ACCESS_READ 2 /* Unused */ - -/* -** CAPI3REF: Flags for the xShmLock VFS method -** -** These integer constants define the various locking operations -** allowed by the xShmLock method of [sqlite3_io_methods]. The -** following are the only legal combinations of flags to the -** xShmLock method: -** -**
    -**
  • SQLITE_SHM_LOCK | SQLITE_SHM_SHARED -**
  • SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE -**
  • SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED -**
  • SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE -**
-** -** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as -** was given no the corresponding lock. -** -** The xShmLock method can transition between unlocked and SHARED or -** between unlocked and EXCLUSIVE. It cannot transition between SHARED -** and EXCLUSIVE. -*/ -#define SQLITE_SHM_UNLOCK 1 -#define SQLITE_SHM_LOCK 2 -#define SQLITE_SHM_SHARED 4 -#define SQLITE_SHM_EXCLUSIVE 8 - -/* -** CAPI3REF: Maximum xShmLock index -** -** The xShmLock method on [sqlite3_io_methods] may use values -** between 0 and this upper bound as its "offset" argument. -** The SQLite core will never attempt to acquire or release a -** lock outside of this range -*/ -#define SQLITE_SHM_NLOCK 8 - - -/* -** CAPI3REF: Initialize The SQLite Library -** -** ^The sqlite3_initialize() routine initializes the -** SQLite library. ^The sqlite3_shutdown() routine -** deallocates any resources that were allocated by sqlite3_initialize(). -** These routines are designed to aid in process initialization and -** shutdown on embedded systems. Workstation applications using -** SQLite normally do not need to invoke either of these routines. -** -** A call to sqlite3_initialize() is an "effective" call if it is -** the first time sqlite3_initialize() is invoked during the lifetime of -** the process, or if it is the first time sqlite3_initialize() is invoked -** following a call to sqlite3_shutdown(). ^(Only an effective call -** of sqlite3_initialize() does any initialization. All other calls -** are harmless no-ops.)^ -** -** A call to sqlite3_shutdown() is an "effective" call if it is the first -** call to sqlite3_shutdown() since the last sqlite3_initialize(). ^(Only -** an effective call to sqlite3_shutdown() does any deinitialization. -** All other valid calls to sqlite3_shutdown() are harmless no-ops.)^ -** -** The sqlite3_initialize() interface is threadsafe, but sqlite3_shutdown() -** is not. The sqlite3_shutdown() interface must only be called from a -** single thread. All open [database connections] must be closed and all -** other SQLite resources must be deallocated prior to invoking -** sqlite3_shutdown(). -** -** Among other things, ^sqlite3_initialize() will invoke -** sqlite3_os_init(). Similarly, ^sqlite3_shutdown() -** will invoke sqlite3_os_end(). -** -** ^The sqlite3_initialize() routine returns [SQLITE_OK] on success. -** ^If for some reason, sqlite3_initialize() is unable to initialize -** the library (perhaps it is unable to allocate a needed resource such -** as a mutex) it returns an [error code] other than [SQLITE_OK]. -** -** ^The sqlite3_initialize() routine is called internally by many other -** SQLite interfaces so that an application usually does not need to -** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] -** calls sqlite3_initialize() so the SQLite library will be automatically -** initialized when [sqlite3_open()] is called if it has not be initialized -** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] -** compile-time option, then the automatic calls to sqlite3_initialize() -** are omitted and the application must call sqlite3_initialize() directly -** prior to using any other SQLite interface. For maximum portability, -** it is recommended that applications always invoke sqlite3_initialize() -** directly prior to using any other SQLite interface. Future releases -** of SQLite may require this. In other words, the behavior exhibited -** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the -** default behavior in some future release of SQLite. -** -** The sqlite3_os_init() routine does operating-system specific -** initialization of the SQLite library. The sqlite3_os_end() -** routine undoes the effect of sqlite3_os_init(). Typical tasks -** performed by these routines include allocation or deallocation -** of static resources, initialization of global variables, -** setting up a default [sqlite3_vfs] module, or setting up -** a default configuration using [sqlite3_config()]. -** -** The application should never invoke either sqlite3_os_init() -** or sqlite3_os_end() directly. The application should only invoke -** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() -** interface is called automatically by sqlite3_initialize() and -** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate -** implementations for sqlite3_os_init() and sqlite3_os_end() -** are built into SQLite when it is compiled for Unix, Windows, or OS/2. -** When [custom builds | built for other platforms] -** (using the [SQLITE_OS_OTHER=1] compile-time -** option) the application must supply a suitable implementation for -** sqlite3_os_init() and sqlite3_os_end(). An application-supplied -** implementation of sqlite3_os_init() or sqlite3_os_end() -** must return [SQLITE_OK] on success and some other [error code] upon -** failure. -*/ -SQLITE_API int sqlite3_initialize(void); -SQLITE_API int sqlite3_shutdown(void); -SQLITE_API int sqlite3_os_init(void); -SQLITE_API int sqlite3_os_end(void); - -/* -** CAPI3REF: Configuring The SQLite Library -** -** The sqlite3_config() interface is used to make global configuration -** changes to SQLite in order to tune SQLite to the specific needs of -** the application. The default configuration is recommended for most -** applications and so this routine is usually not necessary. It is -** provided to support rare applications with unusual needs. -** -** The sqlite3_config() interface is not threadsafe. The application -** must insure that no other SQLite interfaces are invoked by other -** threads while sqlite3_config() is running. Furthermore, sqlite3_config() -** may only be invoked prior to library initialization using -** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. -** ^If sqlite3_config() is called after [sqlite3_initialize()] and before -** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. -** Note, however, that ^sqlite3_config() can be called as part of the -** implementation of an application-defined [sqlite3_os_init()]. -** -** The first argument to sqlite3_config() is an integer -** [SQLITE_CONFIG_SINGLETHREAD | configuration option] that determines -** what property of SQLite is to be configured. Subsequent arguments -** vary depending on the [SQLITE_CONFIG_SINGLETHREAD | configuration option] -** in the first argument. -** -** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. -** ^If the option is unknown or SQLite is unable to set the option -** then this routine returns a non-zero [error code]. -*/ -SQLITE_API int sqlite3_config(int, ...); - -/* -** CAPI3REF: Configure database connections -** -** The sqlite3_db_config() interface is used to make configuration -** changes to a [database connection]. The interface is similar to -** [sqlite3_config()] except that the changes apply to a single -** [database connection] (specified in the first argument). The -** sqlite3_db_config() interface should only be used immediately after -** the database connection is created using [sqlite3_open()], -** [sqlite3_open16()], or [sqlite3_open_v2()]. -** -** The second argument to sqlite3_db_config(D,V,...) is the -** configuration verb - an integer code that indicates what -** aspect of the [database connection] is being configured. -** The only choice for this value is [SQLITE_DBCONFIG_LOOKASIDE]. -** New verbs are likely to be added in future releases of SQLite. -** Additional arguments depend on the verb. -** -** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if -** the call is considered successful. -*/ -SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); - -/* -** CAPI3REF: Memory Allocation Routines -** -** An instance of this object defines the interface between SQLite -** and low-level memory allocation routines. -** -** This object is used in only one place in the SQLite interface. -** A pointer to an instance of this object is the argument to -** [sqlite3_config()] when the configuration option is -** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. -** By creating an instance of this object -** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) -** during configuration, an application can specify an alternative -** memory allocation subsystem for SQLite to use for all of its -** dynamic memory needs. -** -** Note that SQLite comes with several [built-in memory allocators] -** that are perfectly adequate for the overwhelming majority of applications -** and that this object is only useful to a tiny minority of applications -** with specialized memory allocation requirements. This object is -** also used during testing of SQLite in order to specify an alternative -** memory allocator that simulates memory out-of-memory conditions in -** order to verify that SQLite recovers gracefully from such -** conditions. -** -** The xMalloc and xFree methods must work like the -** malloc() and free() functions from the standard C library. -** The xRealloc method must work like realloc() from the standard C library -** with the exception that if the second argument to xRealloc is zero, -** xRealloc must be a no-op - it must not perform any allocation or -** deallocation. ^SQLite guarantees that the second argument to -** xRealloc is always a value returned by a prior call to xRoundup. -** And so in cases where xRoundup always returns a positive number, -** xRealloc can perform exactly as the standard library realloc() and -** still be in compliance with this specification. -** -** xSize should return the allocated size of a memory allocation -** previously obtained from xMalloc or xRealloc. The allocated size -** is always at least as big as the requested size but may be larger. -** -** The xRoundup method returns what would be the allocated size of -** a memory allocation given a particular requested size. Most memory -** allocators round up memory allocations at least to the next multiple -** of 8. Some allocators round up to a larger multiple or to a power of 2. -** Every memory allocation request coming in through [sqlite3_malloc()] -** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, -** that causes the corresponding memory allocation to fail. -** -** The xInit method initializes the memory allocator. (For example, -** it might allocate any require mutexes or initialize internal data -** structures. The xShutdown method is invoked (indirectly) by -** [sqlite3_shutdown()] and should deallocate any resources acquired -** by xInit. The pAppData pointer is used as the only parameter to -** xInit and xShutdown. -** -** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes -** the xInit method, so the xInit method need not be threadsafe. The -** xShutdown method is only called from [sqlite3_shutdown()] so it does -** not need to be threadsafe either. For all other methods, SQLite -** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the -** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which -** it is by default) and so the methods are automatically serialized. -** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other -** methods must be threadsafe or else make their own arrangements for -** serialization. -** -** SQLite will never invoke xInit() more than once without an intervening -** call to xShutdown(). -*/ -typedef struct sqlite3_mem_methods sqlite3_mem_methods; -struct sqlite3_mem_methods { - void *(*xMalloc)(int); /* Memory allocation function */ - void (*xFree)(void*); /* Free a prior allocation */ - void *(*xRealloc)(void*,int); /* Resize an allocation */ - int (*xSize)(void*); /* Return the size of an allocation */ - int (*xRoundup)(int); /* Round up request size to allocation size */ - int (*xInit)(void*); /* Initialize the memory allocator */ - void (*xShutdown)(void*); /* Deinitialize the memory allocator */ - void *pAppData; /* Argument to xInit() and xShutdown() */ -}; - -/* -** CAPI3REF: Configuration Options -** -** These constants are the available integer configuration options that -** can be passed as the first argument to the [sqlite3_config()] interface. -** -** New configuration options may be added in future releases of SQLite. -** Existing configuration options might be discontinued. Applications -** should check the return code from [sqlite3_config()] to make sure that -** the call worked. The [sqlite3_config()] interface will return a -** non-zero [error code] if a discontinued or unsupported configuration option -** is invoked. -** -**
-**
SQLITE_CONFIG_SINGLETHREAD
-**
There are no arguments to this option. ^This option sets the -** [threading mode] to Single-thread. In other words, it disables -** all mutexing and puts SQLite into a mode where it can only be used -** by a single thread. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to change the [threading mode] from its default -** value of Single-thread and so [sqlite3_config()] will return -** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD -** configuration option.
-** -**
SQLITE_CONFIG_MULTITHREAD
-**
There are no arguments to this option. ^This option sets the -** [threading mode] to Multi-thread. In other words, it disables -** mutexing on [database connection] and [prepared statement] objects. -** The application is responsible for serializing access to -** [database connections] and [prepared statements]. But other mutexes -** are enabled so that SQLite will be safe to use in a multi-threaded -** environment as long as no two threads attempt to use the same -** [database connection] at the same time. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to set the Multi-thread [threading mode] and -** [sqlite3_config()] will return [SQLITE_ERROR] if called with the -** SQLITE_CONFIG_MULTITHREAD configuration option.
-** -**
SQLITE_CONFIG_SERIALIZED
-**
There are no arguments to this option. ^This option sets the -** [threading mode] to Serialized. In other words, this option enables -** all mutexes including the recursive -** mutexes on [database connection] and [prepared statement] objects. -** In this mode (which is the default when SQLite is compiled with -** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access -** to [database connections] and [prepared statements] so that the -** application is free to use the same [database connection] or the -** same [prepared statement] in different threads at the same time. -** ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** it is not possible to set the Serialized [threading mode] and -** [sqlite3_config()] will return [SQLITE_ERROR] if called with the -** SQLITE_CONFIG_SERIALIZED configuration option.
-** -**
SQLITE_CONFIG_MALLOC
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mem_methods] structure. The argument specifies -** alternative low-level memory allocation routines to be used in place of -** the memory allocation routines built into SQLite.)^ ^SQLite makes -** its own private copy of the content of the [sqlite3_mem_methods] structure -** before the [sqlite3_config()] call returns.
-** -**
SQLITE_CONFIG_GETMALLOC
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods] -** structure is filled with the currently defined memory allocation routines.)^ -** This option can be used to overload the default memory allocation -** routines with a wrapper that simulations memory allocation failure or -** tracks memory usage, for example.
-** -**
SQLITE_CONFIG_MEMSTATUS
-**
^This option takes single argument of type int, interpreted as a -** boolean, which enables or disables the collection of memory allocation -** statistics. ^(When memory allocation statistics are disabled, the -** following SQLite interfaces become non-operational: -**
    -**
  • [sqlite3_memory_used()] -**
  • [sqlite3_memory_highwater()] -**
  • [sqlite3_soft_heap_limit64()] -**
  • [sqlite3_status()] -**
)^ -** ^Memory allocation statistics are enabled by default unless SQLite is -** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory -** allocation statistics are disabled by default. -**
-** -**
SQLITE_CONFIG_SCRATCH
-**
^This option specifies a static memory buffer that SQLite can use for -** scratch memory. There are three arguments: A pointer an 8-byte -** aligned memory buffer from which the scrach allocations will be -** drawn, the size of each scratch allocation (sz), -** and the maximum number of scratch allocations (N). The sz -** argument must be a multiple of 16. -** The first argument must be a pointer to an 8-byte aligned buffer -** of at least sz*N bytes of memory. -** ^SQLite will use no more than two scratch buffers per thread. So -** N should be set to twice the expected maximum number of threads. -** ^SQLite will never require a scratch buffer that is more than 6 -** times the database page size. ^If SQLite needs needs additional -** scratch memory beyond what is provided by this configuration option, then -** [sqlite3_malloc()] will be used to obtain the memory needed.
-** -**
SQLITE_CONFIG_PAGECACHE
-**
^This option specifies a static memory buffer that SQLite can use for -** the database page cache with the default page cache implemenation. -** This configuration should not be used if an application-define page -** cache implementation is loaded using the SQLITE_CONFIG_PCACHE option. -** There are three arguments to this option: A pointer to 8-byte aligned -** memory, the size of each page buffer (sz), and the number of pages (N). -** The sz argument should be the size of the largest database page -** (a power of two between 512 and 32768) plus a little extra for each -** page header. ^The page header size is 20 to 40 bytes depending on -** the host architecture. ^It is harmless, apart from the wasted memory, -** to make sz a little too large. The first -** argument should point to an allocation of at least sz*N bytes of memory. -** ^SQLite will use the memory provided by the first argument to satisfy its -** memory needs for the first N pages that it adds to cache. ^If additional -** page cache memory is needed beyond what is provided by this option, then -** SQLite goes to [sqlite3_malloc()] for the additional storage space. -** The pointer in the first argument must -** be aligned to an 8-byte boundary or subsequent behavior of SQLite -** will be undefined.
-** -**
SQLITE_CONFIG_HEAP
-**
^This option specifies a static memory buffer that SQLite will use -** for all of its dynamic memory allocation needs beyond those provided -** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE]. -** There are three arguments: An 8-byte aligned pointer to the memory, -** the number of bytes in the memory buffer, and the minimum allocation size. -** ^If the first pointer (the memory pointer) is NULL, then SQLite reverts -** to using its default memory allocator (the system malloc() implementation), -** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the -** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or -** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory -** allocator is engaged to handle all of SQLites memory allocation needs. -** The first pointer (the memory pointer) must be aligned to an 8-byte -** boundary or subsequent behavior of SQLite will be undefined.
-** -**
SQLITE_CONFIG_MUTEX
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mutex_methods] structure. The argument specifies -** alternative low-level mutex routines to be used in place -** the mutex routines built into SQLite.)^ ^SQLite makes a copy of the -** content of the [sqlite3_mutex_methods] structure before the call to -** [sqlite3_config()] returns. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** the entire mutexing subsystem is omitted from the build and hence calls to -** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will -** return [SQLITE_ERROR].
-** -**
SQLITE_CONFIG_GETMUTEX
-**
^(This option takes a single argument which is a pointer to an -** instance of the [sqlite3_mutex_methods] structure. The -** [sqlite3_mutex_methods] -** structure is filled with the currently defined mutex routines.)^ -** This option can be used to overload the default mutex allocation -** routines with a wrapper used to track mutex usage for performance -** profiling or testing, for example. ^If SQLite is compiled with -** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then -** the entire mutexing subsystem is omitted from the build and hence calls to -** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will -** return [SQLITE_ERROR].
-** -**
SQLITE_CONFIG_LOOKASIDE
-**
^(This option takes two arguments that determine the default -** memory allocation for the lookaside memory allocator on each -** [database connection]. The first argument is the -** size of each lookaside buffer slot and the second is the number of -** slots allocated to each database connection.)^ ^(This option sets the -** default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] -** verb to [sqlite3_db_config()] can be used to change the lookaside -** configuration on individual connections.)^
-** -**
SQLITE_CONFIG_PCACHE
-**
^(This option takes a single argument which is a pointer to -** an [sqlite3_pcache_methods] object. This object specifies the interface -** to a custom page cache implementation.)^ ^SQLite makes a copy of the -** object and uses it for page cache memory allocations.
-** -**
SQLITE_CONFIG_GETPCACHE
-**
^(This option takes a single argument which is a pointer to an -** [sqlite3_pcache_methods] object. SQLite copies of the current -** page cache implementation into that object.)^
-** -**
SQLITE_CONFIG_LOG
-**
^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a -** function with a call signature of void(*)(void*,int,const char*), -** and a pointer to void. ^If the function pointer is not NULL, it is -** invoked by [sqlite3_log()] to process each logging event. ^If the -** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. -** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is -** passed through as the first parameter to the application-defined logger -** function whenever that function is invoked. ^The second parameter to -** the logger function is a copy of the first parameter to the corresponding -** [sqlite3_log()] call and is intended to be a [result code] or an -** [extended result code]. ^The third parameter passed to the logger is -** log message after formatting via [sqlite3_snprintf()]. -** The SQLite logging interface is not reentrant; the logger function -** supplied by the application must not invoke any SQLite interface. -** In a multi-threaded application, the application-defined logger -** function must be threadsafe.
-** -**
-*/ -#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ -#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ -#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ -#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */ -#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ -#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ -#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ -#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ -#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ -/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ -#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ -#define SQLITE_CONFIG_PCACHE 14 /* sqlite3_pcache_methods* */ -#define SQLITE_CONFIG_GETPCACHE 15 /* sqlite3_pcache_methods* */ -#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ - -/* -** CAPI3REF: Database Connection Configuration Options -** -** These constants are the available integer configuration options that -** can be passed as the second argument to the [sqlite3_db_config()] interface. -** -** New configuration options may be added in future releases of SQLite. -** Existing configuration options might be discontinued. Applications -** should check the return code from [sqlite3_db_config()] to make sure that -** the call worked. ^The [sqlite3_db_config()] interface will return a -** non-zero [error code] if a discontinued or unsupported configuration option -** is invoked. -** -**
-**
SQLITE_DBCONFIG_LOOKASIDE
-**
^This option takes three additional arguments that determine the -** [lookaside memory allocator] configuration for the [database connection]. -** ^The first argument (the third parameter to [sqlite3_db_config()] is a -** pointer to an memory buffer to use for lookaside memory. -** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb -** may be NULL in which case SQLite will allocate the -** lookaside buffer itself using [sqlite3_malloc()]. ^The second argument is the -** size of each lookaside buffer slot. ^The third argument is the number of -** slots. The size of the buffer in the first argument must be greater than -** or equal to the product of the second and third arguments. The buffer -** must be aligned to an 8-byte boundary. ^If the second argument to -** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally -** rounded down to the next smaller multiple of 8. ^(The lookaside memory -** configuration for a database connection can only be changed when that -** connection is not currently using lookaside memory, or in other words -** when the "current value" returned by -** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. -** Any attempt to change the lookaside memory configuration when lookaside -** memory is in use leaves the configuration unchanged and returns -** [SQLITE_BUSY].)^
-** -**
-*/ -#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ - - -/* -** CAPI3REF: Enable Or Disable Extended Result Codes -** -** ^The sqlite3_extended_result_codes() routine enables or disables the -** [extended result codes] feature of SQLite. ^The extended result -** codes are disabled by default for historical compatibility. -*/ -SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); - -/* -** CAPI3REF: Last Insert Rowid -** -** ^Each entry in an SQLite table has a unique 64-bit signed -** integer key called the [ROWID | "rowid"]. ^The rowid is always available -** as an undeclared column named ROWID, OID, or _ROWID_ as long as those -** names are not also used by explicitly declared columns. ^If -** the table has a column of type [INTEGER PRIMARY KEY] then that column -** is another alias for the rowid. -** -** ^This routine returns the [rowid] of the most recent -** successful [INSERT] into the database from the [database connection] -** in the first argument. ^If no successful [INSERT]s -** have ever occurred on that database connection, zero is returned. -** -** ^(If an [INSERT] occurs within a trigger, then the [rowid] of the inserted -** row is returned by this routine as long as the trigger is running. -** But once the trigger terminates, the value returned by this routine -** reverts to the last value inserted before the trigger fired.)^ -** -** ^An [INSERT] that fails due to a constraint violation is not a -** successful [INSERT] and does not change the value returned by this -** routine. ^Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, -** and INSERT OR ABORT make no changes to the return value of this -** routine when their insertion fails. ^(When INSERT OR REPLACE -** encounters a constraint violation, it does not fail. The -** INSERT continues to completion after deleting rows that caused -** the constraint problem so INSERT OR REPLACE will always change -** the return value of this interface.)^ -** -** ^For the purposes of this routine, an [INSERT] is considered to -** be successful even if it is subsequently rolled back. -** -** This function is accessible to SQL statements via the -** [last_insert_rowid() SQL function]. -** -** If a separate thread performs a new [INSERT] on the same -** database connection while the [sqlite3_last_insert_rowid()] -** function is running and thus changes the last insert [rowid], -** then the value returned by [sqlite3_last_insert_rowid()] is -** unpredictable and might not equal either the old or the new -** last insert [rowid]. -*/ -SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); - -/* -** CAPI3REF: Count The Number Of Rows Modified -** -** ^This function returns the number of database rows that were changed -** or inserted or deleted by the most recently completed SQL statement -** on the [database connection] specified by the first parameter. -** ^(Only changes that are directly specified by the [INSERT], [UPDATE], -** or [DELETE] statement are counted. Auxiliary changes caused by -** triggers or [foreign key actions] are not counted.)^ Use the -** [sqlite3_total_changes()] function to find the total number of changes -** including changes caused by triggers and foreign key actions. -** -** ^Changes to a view that are simulated by an [INSTEAD OF trigger] -** are not counted. Only real table changes are counted. -** -** ^(A "row change" is a change to a single row of a single table -** caused by an INSERT, DELETE, or UPDATE statement. Rows that -** are changed as side effects of [REPLACE] constraint resolution, -** rollback, ABORT processing, [DROP TABLE], or by any other -** mechanisms do not count as direct row changes.)^ -** -** A "trigger context" is a scope of execution that begins and -** ends with the script of a [CREATE TRIGGER | trigger]. -** Most SQL statements are -** evaluated outside of any trigger. This is the "top level" -** trigger context. If a trigger fires from the top level, a -** new trigger context is entered for the duration of that one -** trigger. Subtriggers create subcontexts for their duration. -** -** ^Calling [sqlite3_exec()] or [sqlite3_step()] recursively does -** not create a new trigger context. -** -** ^This function returns the number of direct row changes in the -** most recent INSERT, UPDATE, or DELETE statement within the same -** trigger context. -** -** ^Thus, when called from the top level, this function returns the -** number of changes in the most recent INSERT, UPDATE, or DELETE -** that also occurred at the top level. ^(Within the body of a trigger, -** the sqlite3_changes() interface can be called to find the number of -** changes in the most recently completed INSERT, UPDATE, or DELETE -** statement within the body of the same trigger. -** However, the number returned does not include changes -** caused by subtriggers since those have their own context.)^ -** -** See also the [sqlite3_total_changes()] interface, the -** [count_changes pragma], and the [changes() SQL function]. -** -** If a separate thread makes changes on the same database connection -** while [sqlite3_changes()] is running then the value returned -** is unpredictable and not meaningful. -*/ -SQLITE_API int sqlite3_changes(sqlite3*); - -/* -** CAPI3REF: Total Number Of Rows Modified -** -** ^This function returns the number of row changes caused by [INSERT], -** [UPDATE] or [DELETE] statements since the [database connection] was opened. -** ^(The count returned by sqlite3_total_changes() includes all changes -** from all [CREATE TRIGGER | trigger] contexts and changes made by -** [foreign key actions]. However, -** the count does not include changes used to implement [REPLACE] constraints, -** do rollbacks or ABORT processing, or [DROP TABLE] processing. The -** count does not include rows of views that fire an [INSTEAD OF trigger], -** though if the INSTEAD OF trigger makes changes of its own, those changes -** are counted.)^ -** ^The sqlite3_total_changes() function counts the changes as soon as -** the statement that makes them is completed (when the statement handle -** is passed to [sqlite3_reset()] or [sqlite3_finalize()]). -** -** See also the [sqlite3_changes()] interface, the -** [count_changes pragma], and the [total_changes() SQL function]. -** -** If a separate thread makes changes on the same database connection -** while [sqlite3_total_changes()] is running then the value -** returned is unpredictable and not meaningful. -*/ -SQLITE_API int sqlite3_total_changes(sqlite3*); - -/* -** CAPI3REF: Interrupt A Long-Running Query -** -** ^This function causes any pending database operation to abort and -** return at its earliest opportunity. This routine is typically -** called in response to a user action such as pressing "Cancel" -** or Ctrl-C where the user wants a long query operation to halt -** immediately. -** -** ^It is safe to call this routine from a thread different from the -** thread that is currently running the database operation. But it -** is not safe to call this routine with a [database connection] that -** is closed or might close before sqlite3_interrupt() returns. -** -** ^If an SQL operation is very nearly finished at the time when -** sqlite3_interrupt() is called, then it might not have an opportunity -** to be interrupted and might continue to completion. -** -** ^An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. -** ^If the interrupted SQL operation is an INSERT, UPDATE, or DELETE -** that is inside an explicit transaction, then the entire transaction -** will be rolled back automatically. -** -** ^The sqlite3_interrupt(D) call is in effect until all currently running -** SQL statements on [database connection] D complete. ^Any new SQL statements -** that are started after the sqlite3_interrupt() call and before the -** running statements reaches zero are interrupted as if they had been -** running prior to the sqlite3_interrupt() call. ^New SQL statements -** that are started after the running statement count reaches zero are -** not effected by the sqlite3_interrupt(). -** ^A call to sqlite3_interrupt(D) that occurs when there are no running -** SQL statements is a no-op and has no effect on SQL statements -** that are started after the sqlite3_interrupt() call returns. -** -** If the database connection closes while [sqlite3_interrupt()] -** is running then bad things will likely happen. -*/ -SQLITE_API void sqlite3_interrupt(sqlite3*); - -/* -** CAPI3REF: Determine If An SQL Statement Is Complete -** -** These routines are useful during command-line input to determine if the -** currently entered text seems to form a complete SQL statement or -** if additional input is needed before sending the text into -** SQLite for parsing. ^These routines return 1 if the input string -** appears to be a complete SQL statement. ^A statement is judged to be -** complete if it ends with a semicolon token and is not a prefix of a -** well-formed CREATE TRIGGER statement. ^Semicolons that are embedded within -** string literals or quoted identifier names or comments are not -** independent tokens (they are part of the token in which they are -** embedded) and thus do not count as a statement terminator. ^Whitespace -** and comments that follow the final semicolon are ignored. -** -** ^These routines return 0 if the statement is incomplete. ^If a -** memory allocation fails, then SQLITE_NOMEM is returned. -** -** ^These routines do not parse the SQL statements thus -** will not detect syntactically incorrect SQL. -** -** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior -** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked -** automatically by sqlite3_complete16(). If that initialization fails, -** then the return value from sqlite3_complete16() will be non-zero -** regardless of whether or not the input SQL is complete.)^ -** -** The input to [sqlite3_complete()] must be a zero-terminated -** UTF-8 string. -** -** The input to [sqlite3_complete16()] must be a zero-terminated -** UTF-16 string in native byte order. -*/ -SQLITE_API int sqlite3_complete(const char *sql); -SQLITE_API int sqlite3_complete16(const void *sql); - -/* -** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors -** -** ^This routine sets a callback function that might be invoked whenever -** an attempt is made to open a database table that another thread -** or process has locked. -** -** ^If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] -** is returned immediately upon encountering the lock. ^If the busy callback -** is not NULL, then the callback might be invoked with two arguments. -** -** ^The first argument to the busy handler is a copy of the void* pointer which -** is the third argument to sqlite3_busy_handler(). ^The second argument to -** the busy handler callback is the number of times that the busy handler has -** been invoked for this locking event. ^If the -** busy callback returns 0, then no additional attempts are made to -** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. -** ^If the callback returns non-zero, then another attempt -** is made to open the database for reading and the cycle repeats. -** -** The presence of a busy handler does not guarantee that it will be invoked -** when there is lock contention. ^If SQLite determines that invoking the busy -** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] -** or [SQLITE_IOERR_BLOCKED] instead of invoking the busy handler. -** Consider a scenario where one process is holding a read lock that -** it is trying to promote to a reserved lock and -** a second process is holding a reserved lock that it is trying -** to promote to an exclusive lock. The first process cannot proceed -** because it is blocked by the second and the second process cannot -** proceed because it is blocked by the first. If both processes -** invoke the busy handlers, neither will make any progress. Therefore, -** SQLite returns [SQLITE_BUSY] for the first process, hoping that this -** will induce the first process to release its read lock and allow -** the second process to proceed. -** -** ^The default busy callback is NULL. -** -** ^The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] -** when SQLite is in the middle of a large transaction where all the -** changes will not fit into the in-memory cache. SQLite will -** already hold a RESERVED lock on the database file, but it needs -** to promote this lock to EXCLUSIVE so that it can spill cache -** pages into the database file without harm to concurrent -** readers. ^If it is unable to promote the lock, then the in-memory -** cache will be left in an inconsistent state and so the error -** code is promoted from the relatively benign [SQLITE_BUSY] to -** the more severe [SQLITE_IOERR_BLOCKED]. ^This error code promotion -** forces an automatic rollback of the changes. See the -** -** CorruptionFollowingBusyError wiki page for a discussion of why -** this is important. -** -** ^(There can only be a single busy handler defined for each -** [database connection]. Setting a new busy handler clears any -** previously set handler.)^ ^Note that calling [sqlite3_busy_timeout()] -** will also set or clear the busy handler. -** -** The busy callback should not take any actions which modify the -** database connection that invoked the busy handler. Any such actions -** result in undefined behavior. -** -** A busy handler must not close the database connection -** or [prepared statement] that invoked the busy handler. -*/ -SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); - -/* -** CAPI3REF: Set A Busy Timeout -** -** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps -** for a specified amount of time when a table is locked. ^The handler -** will sleep multiple times until at least "ms" milliseconds of sleeping -** have accumulated. ^After at least "ms" milliseconds of sleeping, -** the handler returns 0 which causes [sqlite3_step()] to return -** [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. -** -** ^Calling this routine with an argument less than or equal to zero -** turns off all busy handlers. -** -** ^(There can only be a single busy handler for a particular -** [database connection] any any given moment. If another busy handler -** was defined (using [sqlite3_busy_handler()]) prior to calling -** this routine, that other busy handler is cleared.)^ -*/ -SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); - -/* -** CAPI3REF: Convenience Routines For Running Queries -** -** This is a legacy interface that is preserved for backwards compatibility. -** Use of this interface is not recommended. -** -** Definition: A result table is memory data structure created by the -** [sqlite3_get_table()] interface. A result table records the -** complete query results from one or more queries. -** -** The table conceptually has a number of rows and columns. But -** these numbers are not part of the result table itself. These -** numbers are obtained separately. Let N be the number of rows -** and M be the number of columns. -** -** A result table is an array of pointers to zero-terminated UTF-8 strings. -** There are (N+1)*M elements in the array. The first M pointers point -** to zero-terminated strings that contain the names of the columns. -** The remaining entries all point to query results. NULL values result -** in NULL pointers. All other values are in their UTF-8 zero-terminated -** string representation as returned by [sqlite3_column_text()]. -** -** A result table might consist of one or more memory allocations. -** It is not safe to pass a result table directly to [sqlite3_free()]. -** A result table should be deallocated using [sqlite3_free_table()]. -** -** ^(As an example of the result table format, suppose a query result -** is as follows: -** -**
-**        Name        | Age
-**        -----------------------
-**        Alice       | 43
-**        Bob         | 28
-**        Cindy       | 21
-** 
-** -** There are two column (M==2) and three rows (N==3). Thus the -** result table has 8 entries. Suppose the result table is stored -** in an array names azResult. Then azResult holds this content: -** -**
-**        azResult[0] = "Name";
-**        azResult[1] = "Age";
-**        azResult[2] = "Alice";
-**        azResult[3] = "43";
-**        azResult[4] = "Bob";
-**        azResult[5] = "28";
-**        azResult[6] = "Cindy";
-**        azResult[7] = "21";
-** 
)^ -** -** ^The sqlite3_get_table() function evaluates one or more -** semicolon-separated SQL statements in the zero-terminated UTF-8 -** string of its 2nd parameter and returns a result table to the -** pointer given in its 3rd parameter. -** -** After the application has finished with the result from sqlite3_get_table(), -** it must pass the result table pointer to sqlite3_free_table() in order to -** release the memory that was malloced. Because of the way the -** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling -** function must not try to call [sqlite3_free()] directly. Only -** [sqlite3_free_table()] is able to release the memory properly and safely. -** -** The sqlite3_get_table() interface is implemented as a wrapper around -** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access -** to any internal data structures of SQLite. It uses only the public -** interface defined here. As a consequence, errors that occur in the -** wrapper layer outside of the internal [sqlite3_exec()] call are not -** reflected in subsequent calls to [sqlite3_errcode()] or -** [sqlite3_errmsg()]. -*/ -SQLITE_API int sqlite3_get_table( - sqlite3 *db, /* An open database */ - const char *zSql, /* SQL to be evaluated */ - char ***pazResult, /* Results of the query */ - int *pnRow, /* Number of result rows written here */ - int *pnColumn, /* Number of result columns written here */ - char **pzErrmsg /* Error msg written here */ -); -SQLITE_API void sqlite3_free_table(char **result); - -/* -** CAPI3REF: Formatted String Printing Functions -** -** These routines are work-alikes of the "printf()" family of functions -** from the standard C library. -** -** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their -** results into memory obtained from [sqlite3_malloc()]. -** The strings returned by these two routines should be -** released by [sqlite3_free()]. ^Both routines return a -** NULL pointer if [sqlite3_malloc()] is unable to allocate enough -** memory to hold the resulting string. -** -** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from -** the standard C library. The result is written into the -** buffer supplied as the second parameter whose size is given by -** the first parameter. Note that the order of the -** first two parameters is reversed from snprintf().)^ This is an -** historical accident that cannot be fixed without breaking -** backwards compatibility. ^(Note also that sqlite3_snprintf() -** returns a pointer to its buffer instead of the number of -** characters actually written into the buffer.)^ We admit that -** the number of characters written would be a more useful return -** value but we cannot change the implementation of sqlite3_snprintf() -** now without breaking compatibility. -** -** ^As long as the buffer size is greater than zero, sqlite3_snprintf() -** guarantees that the buffer is always zero-terminated. ^The first -** parameter "n" is the total size of the buffer, including space for -** the zero terminator. So the longest string that can be completely -** written will be n-1 characters. -** -** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). -** -** These routines all implement some additional formatting -** options that are useful for constructing SQL statements. -** All of the usual printf() formatting options apply. In addition, there -** is are "%q", "%Q", and "%z" options. -** -** ^(The %q option works like %s in that it substitutes a null-terminated -** string from the argument list. But %q also doubles every '\'' character. -** %q is designed for use inside a string literal.)^ By doubling each '\'' -** character it escapes that character and allows it to be inserted into -** the string. -** -** For example, assume the string variable zText contains text as follows: -** -**
-**  char *zText = "It's a happy day!";
-** 
-** -** One can use this text in an SQL statement as follows: -** -**
-**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
-**  sqlite3_exec(db, zSQL, 0, 0, 0);
-**  sqlite3_free(zSQL);
-** 
-** -** Because the %q format string is used, the '\'' character in zText -** is escaped and the SQL generated is as follows: -** -**
-**  INSERT INTO table1 VALUES('It''s a happy day!')
-** 
-** -** This is correct. Had we used %s instead of %q, the generated SQL -** would have looked like this: -** -**
-**  INSERT INTO table1 VALUES('It's a happy day!');
-** 
-** -** This second example is an SQL syntax error. As a general rule you should -** always use %q instead of %s when inserting text into a string literal. -** -** ^(The %Q option works like %q except it also adds single quotes around -** the outside of the total string. Additionally, if the parameter in the -** argument list is a NULL pointer, %Q substitutes the text "NULL" (without -** single quotes).)^ So, for example, one could say: -** -**
-**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
-**  sqlite3_exec(db, zSQL, 0, 0, 0);
-**  sqlite3_free(zSQL);
-** 
-** -** The code above will render a correct SQL statement in the zSQL -** variable even if the zText variable is a NULL pointer. -** -** ^(The "%z" formatting option works like "%s" but with the -** addition that after the string has been read and copied into -** the result, [sqlite3_free()] is called on the input string.)^ -*/ -SQLITE_API char *sqlite3_mprintf(const char*,...); -SQLITE_API char *sqlite3_vmprintf(const char*, va_list); -SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...); -SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); - -/* -** CAPI3REF: Memory Allocation Subsystem -** -** The SQLite core uses these three routines for all of its own -** internal memory allocation needs. "Core" in the previous sentence -** does not include operating-system specific VFS implementation. The -** Windows VFS uses native malloc() and free() for some operations. -** -** ^The sqlite3_malloc() routine returns a pointer to a block -** of memory at least N bytes in length, where N is the parameter. -** ^If sqlite3_malloc() is unable to obtain sufficient free -** memory, it returns a NULL pointer. ^If the parameter N to -** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns -** a NULL pointer. -** -** ^Calling sqlite3_free() with a pointer previously returned -** by sqlite3_malloc() or sqlite3_realloc() releases that memory so -** that it might be reused. ^The sqlite3_free() routine is -** a no-op if is called with a NULL pointer. Passing a NULL pointer -** to sqlite3_free() is harmless. After being freed, memory -** should neither be read nor written. Even reading previously freed -** memory might result in a segmentation fault or other severe error. -** Memory corruption, a segmentation fault, or other severe error -** might result if sqlite3_free() is called with a non-NULL pointer that -** was not obtained from sqlite3_malloc() or sqlite3_realloc(). -** -** ^(The sqlite3_realloc() interface attempts to resize a -** prior memory allocation to be at least N bytes, where N is the -** second parameter. The memory allocation to be resized is the first -** parameter.)^ ^ If the first parameter to sqlite3_realloc() -** is a NULL pointer then its behavior is identical to calling -** sqlite3_malloc(N) where N is the second parameter to sqlite3_realloc(). -** ^If the second parameter to sqlite3_realloc() is zero or -** negative then the behavior is exactly the same as calling -** sqlite3_free(P) where P is the first parameter to sqlite3_realloc(). -** ^sqlite3_realloc() returns a pointer to a memory allocation -** of at least N bytes in size or NULL if sufficient memory is unavailable. -** ^If M is the size of the prior allocation, then min(N,M) bytes -** of the prior allocation are copied into the beginning of buffer returned -** by sqlite3_realloc() and the prior allocation is freed. -** ^If sqlite3_realloc() returns NULL, then the prior allocation -** is not freed. -** -** ^The memory returned by sqlite3_malloc() and sqlite3_realloc() -** is always aligned to at least an 8 byte boundary, or to a -** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time -** option is used. -** -** In SQLite version 3.5.0 and 3.5.1, it was possible to define -** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in -** implementation of these routines to be omitted. That capability -** is no longer provided. Only built-in memory allocators can be used. -** -** The Windows OS interface layer calls -** the system malloc() and free() directly when converting -** filenames between the UTF-8 encoding used by SQLite -** and whatever filename encoding is used by the particular Windows -** installation. Memory allocation errors are detected, but -** they are reported back as [SQLITE_CANTOPEN] or -** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. -** -** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()] -** must be either NULL or else pointers obtained from a prior -** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have -** not yet been released. -** -** The application must not read or write any part of -** a block of memory after it has been released using -** [sqlite3_free()] or [sqlite3_realloc()]. -*/ -SQLITE_API void *sqlite3_malloc(int); -SQLITE_API void *sqlite3_realloc(void*, int); -SQLITE_API void sqlite3_free(void*); - -/* -** CAPI3REF: Memory Allocator Statistics -** -** SQLite provides these two interfaces for reporting on the status -** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()] -** routines, which form the built-in memory allocation subsystem. -** -** ^The [sqlite3_memory_used()] routine returns the number of bytes -** of memory currently outstanding (malloced but not freed). -** ^The [sqlite3_memory_highwater()] routine returns the maximum -** value of [sqlite3_memory_used()] since the high-water mark -** was last reset. ^The values returned by [sqlite3_memory_used()] and -** [sqlite3_memory_highwater()] include any overhead -** added by SQLite in its implementation of [sqlite3_malloc()], -** but not overhead added by the any underlying system library -** routines that [sqlite3_malloc()] may call. -** -** ^The memory high-water mark is reset to the current value of -** [sqlite3_memory_used()] if and only if the parameter to -** [sqlite3_memory_highwater()] is true. ^The value returned -** by [sqlite3_memory_highwater(1)] is the high-water mark -** prior to the reset. -*/ -SQLITE_API sqlite3_int64 sqlite3_memory_used(void); -SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag); - -/* -** CAPI3REF: Pseudo-Random Number Generator -** -** SQLite contains a high-quality pseudo-random number generator (PRNG) used to -** select random [ROWID | ROWIDs] when inserting new records into a table that -** already uses the largest possible [ROWID]. The PRNG is also used for -** the build-in random() and randomblob() SQL functions. This interface allows -** applications to access the same PRNG for other purposes. -** -** ^A call to this routine stores N bytes of randomness into buffer P. -** -** ^The first time this routine is invoked (either internally or by -** the application) the PRNG is seeded using randomness obtained -** from the xRandomness method of the default [sqlite3_vfs] object. -** ^On all subsequent invocations, the pseudo-randomness is generated -** internally and without recourse to the [sqlite3_vfs] xRandomness -** method. -*/ -SQLITE_API void sqlite3_randomness(int N, void *P); - -/* -** CAPI3REF: Compile-Time Authorization Callbacks -** -** ^This routine registers a authorizer callback with a particular -** [database connection], supplied in the first argument. -** ^The authorizer callback is invoked as SQL statements are being compiled -** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], -** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. ^At various -** points during the compilation process, as logic is being created -** to perform various actions, the authorizer callback is invoked to -** see if those actions are allowed. ^The authorizer callback should -** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the -** specific action but allow the SQL statement to continue to be -** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be -** rejected with an error. ^If the authorizer callback returns -** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] -** then the [sqlite3_prepare_v2()] or equivalent call that triggered -** the authorizer will fail with an error message. -** -** When the callback returns [SQLITE_OK], that means the operation -** requested is ok. ^When the callback returns [SQLITE_DENY], the -** [sqlite3_prepare_v2()] or equivalent call that triggered the -** authorizer will fail with an error message explaining that -** access is denied. -** -** ^The first parameter to the authorizer callback is a copy of the third -** parameter to the sqlite3_set_authorizer() interface. ^The second parameter -** to the callback is an integer [SQLITE_COPY | action code] that specifies -** the particular action to be authorized. ^The third through sixth parameters -** to the callback are zero-terminated strings that contain additional -** details about the action to be authorized. -** -** ^If the action code is [SQLITE_READ] -** and the callback returns [SQLITE_IGNORE] then the -** [prepared statement] statement is constructed to substitute -** a NULL value in place of the table column that would have -** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE] -** return can be used to deny an untrusted user access to individual -** columns of a table. -** ^If the action code is [SQLITE_DELETE] and the callback returns -** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the -** [truncate optimization] is disabled and all rows are deleted individually. -** -** An authorizer is used when [sqlite3_prepare | preparing] -** SQL statements from an untrusted source, to ensure that the SQL statements -** do not try to access data they are not allowed to see, or that they do not -** try to execute malicious statements that damage the database. For -** example, an application may allow a user to enter arbitrary -** SQL queries for evaluation by a database. But the application does -** not want the user to be able to make arbitrary changes to the -** database. An authorizer could then be put in place while the -** user-entered SQL is being [sqlite3_prepare | prepared] that -** disallows everything except [SELECT] statements. -** -** Applications that need to process SQL from untrusted sources -** might also consider lowering resource limits using [sqlite3_limit()] -** and limiting database size using the [max_page_count] [PRAGMA] -** in addition to using an authorizer. -** -** ^(Only a single authorizer can be in place on a database connection -** at a time. Each call to sqlite3_set_authorizer overrides the -** previous call.)^ ^Disable the authorizer by installing a NULL callback. -** The authorizer is disabled by default. -** -** The authorizer callback must not do anything that will modify -** the database connection that invoked the authorizer callback. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the -** statement might be re-prepared during [sqlite3_step()] due to a -** schema change. Hence, the application should ensure that the -** correct authorizer callback remains in place during the [sqlite3_step()]. -** -** ^Note that the authorizer callback is invoked only during -** [sqlite3_prepare()] or its variants. Authorization is not -** performed during statement evaluation in [sqlite3_step()], unless -** as stated in the previous paragraph, sqlite3_step() invokes -** sqlite3_prepare_v2() to reprepare a statement after a schema change. -*/ -SQLITE_API int sqlite3_set_authorizer( - sqlite3*, - int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), - void *pUserData -); - -/* -** CAPI3REF: Authorizer Return Codes -** -** The [sqlite3_set_authorizer | authorizer callback function] must -** return either [SQLITE_OK] or one of these two constants in order -** to signal SQLite whether or not the action is permitted. See the -** [sqlite3_set_authorizer | authorizer documentation] for additional -** information. -*/ -#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ -#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ - -/* -** CAPI3REF: Authorizer Action Codes -** -** The [sqlite3_set_authorizer()] interface registers a callback function -** that is invoked to authorize certain SQL statement actions. The -** second parameter to the callback is an integer code that specifies -** what action is being authorized. These are the integer action codes that -** the authorizer callback may be passed. -** -** These action code values signify what kind of operation is to be -** authorized. The 3rd and 4th parameters to the authorization -** callback function will be parameters or NULL depending on which of these -** codes is used as the second parameter. ^(The 5th parameter to the -** authorizer callback is the name of the database ("main", "temp", -** etc.) if applicable.)^ ^The 6th parameter to the authorizer callback -** is the name of the inner-most trigger or view that is responsible for -** the access attempt or NULL if this access attempt is directly from -** top-level SQL code. -*/ -/******************************************* 3rd ************ 4th ***********/ -#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ -#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ -#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ -#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ -#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ -#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ -#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ -#define SQLITE_DELETE 9 /* Table Name NULL */ -#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ -#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ -#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ -#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ -#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ -#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ -#define SQLITE_DROP_VIEW 17 /* View Name NULL */ -#define SQLITE_INSERT 18 /* Table Name NULL */ -#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ -#define SQLITE_READ 20 /* Table Name Column Name */ -#define SQLITE_SELECT 21 /* NULL NULL */ -#define SQLITE_TRANSACTION 22 /* Operation NULL */ -#define SQLITE_UPDATE 23 /* Table Name Column Name */ -#define SQLITE_ATTACH 24 /* Filename NULL */ -#define SQLITE_DETACH 25 /* Database Name NULL */ -#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ -#define SQLITE_REINDEX 27 /* Index Name NULL */ -#define SQLITE_ANALYZE 28 /* Table Name NULL */ -#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ -#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ -#define SQLITE_FUNCTION 31 /* NULL Function Name */ -#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ -#define SQLITE_COPY 0 /* No longer used */ - -/* -** CAPI3REF: Tracing And Profiling Functions -** -** These routines register callback functions that can be used for -** tracing and profiling the execution of SQL statements. -** -** ^The callback function registered by sqlite3_trace() is invoked at -** various times when an SQL statement is being run by [sqlite3_step()]. -** ^The sqlite3_trace() callback is invoked with a UTF-8 rendering of the -** SQL statement text as the statement first begins executing. -** ^(Additional sqlite3_trace() callbacks might occur -** as each triggered subprogram is entered. The callbacks for triggers -** contain a UTF-8 SQL comment that identifies the trigger.)^ -** -** ^The callback function registered by sqlite3_profile() is invoked -** as each SQL statement finishes. ^The profile callback contains -** the original statement text and an estimate of wall-clock time -** of how long that statement took to run. ^The profile callback -** time is in units of nanoseconds, however the current implementation -** is only capable of millisecond resolution so the six least significant -** digits in the time are meaningless. Future versions of SQLite -** might provide greater resolution on the profiler callback. The -** sqlite3_profile() function is considered experimental and is -** subject to change in future versions of SQLite. -*/ -SQLITE_API void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); -SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*, - void(*xProfile)(void*,const char*,sqlite3_uint64), void*); - -/* -** CAPI3REF: Query Progress Callbacks -** -** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback -** function X to be invoked periodically during long running calls to -** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for -** database connection D. An example use for this -** interface is to keep a GUI updated during a large query. -** -** ^The parameter P is passed through as the only parameter to the -** callback function X. ^The parameter N is the number of -** [virtual machine instructions] that are evaluated between successive -** invocations of the callback X. -** -** ^Only a single progress handler may be defined at one time per -** [database connection]; setting a new progress handler cancels the -** old one. ^Setting parameter X to NULL disables the progress handler. -** ^The progress handler is also disabled by setting N to a value less -** than 1. -** -** ^If the progress callback returns non-zero, the operation is -** interrupted. This feature can be used to implement a -** "Cancel" button on a GUI progress dialog box. -** -** The progress handler callback must not do anything that will modify -** the database connection that invoked the progress handler. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -*/ -SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); - -/* -** CAPI3REF: Opening A New Database Connection -** -** ^These routines open an SQLite database file whose name is given by the -** filename argument. ^The filename argument is interpreted as UTF-8 for -** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte -** order for sqlite3_open16(). ^(A [database connection] handle is usually -** returned in *ppDb, even if an error occurs. The only exception is that -** if SQLite is unable to allocate memory to hold the [sqlite3] object, -** a NULL will be written into *ppDb instead of a pointer to the [sqlite3] -** object.)^ ^(If the database is opened (and/or created) successfully, then -** [SQLITE_OK] is returned. Otherwise an [error code] is returned.)^ ^The -** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain -** an English language description of the error following a failure of any -** of the sqlite3_open() routines. -** -** ^The default encoding for the database will be UTF-8 if -** sqlite3_open() or sqlite3_open_v2() is called and -** UTF-16 in the native byte order if sqlite3_open16() is used. -** -** Whether or not an error occurs when it is opened, resources -** associated with the [database connection] handle should be released by -** passing it to [sqlite3_close()] when it is no longer required. -** -** The sqlite3_open_v2() interface works like sqlite3_open() -** except that it accepts two additional parameters for additional control -** over the new database connection. ^(The flags parameter to -** sqlite3_open_v2() can take one of -** the following three values, optionally combined with the -** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE], -** and/or [SQLITE_OPEN_PRIVATECACHE] flags:)^ -** -**
-** ^(
[SQLITE_OPEN_READONLY]
-**
The database is opened in read-only mode. If the database does not -** already exist, an error is returned.
)^ -** -** ^(
[SQLITE_OPEN_READWRITE]
-**
The database is opened for reading and writing if possible, or reading -** only if the file is write protected by the operating system. In either -** case the database must already exist, otherwise an error is returned.
)^ -** -** ^(
[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
-**
The database is opened for reading and writing, and is created if -** it does not already exist. This is the behavior that is always used for -** sqlite3_open() and sqlite3_open16().
)^ -**
-** -** If the 3rd parameter to sqlite3_open_v2() is not one of the -** combinations shown above or one of the combinations shown above combined -** with the [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], -** [SQLITE_OPEN_SHAREDCACHE] and/or [SQLITE_OPEN_PRIVATECACHE] flags, -** then the behavior is undefined. -** -** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection -** opens in the multi-thread [threading mode] as long as the single-thread -** mode has not been set at compile-time or start-time. ^If the -** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens -** in the serialized [threading mode] unless single-thread was -** previously selected at compile-time or start-time. -** ^The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be -** eligible to use [shared cache mode], regardless of whether or not shared -** cache is enabled using [sqlite3_enable_shared_cache()]. ^The -** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not -** participate in [shared cache mode] even if it is enabled. -** -** ^If the filename is ":memory:", then a private, temporary in-memory database -** is created for the connection. ^This in-memory database will vanish when -** the database connection is closed. Future versions of SQLite might -** make use of additional special filenames that begin with the ":" character. -** It is recommended that when a database filename actually does begin with -** a ":" character you should prefix the filename with a pathname such as -** "./" to avoid ambiguity. -** -** ^If the filename is an empty string, then a private, temporary -** on-disk database will be created. ^This private database will be -** automatically deleted as soon as the database connection is closed. -** -** ^The fourth parameter to sqlite3_open_v2() is the name of the -** [sqlite3_vfs] object that defines the operating system interface that -** the new database connection should use. ^If the fourth parameter is -** a NULL pointer then the default [sqlite3_vfs] object is used. -** -** Note to Windows users: The encoding used for the filename argument -** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever -** codepage is currently defined. Filenames containing international -** characters must be converted to UTF-8 prior to passing them into -** sqlite3_open() or sqlite3_open_v2(). -*/ -SQLITE_API int sqlite3_open( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -SQLITE_API int sqlite3_open16( - const void *filename, /* Database filename (UTF-16) */ - sqlite3 **ppDb /* OUT: SQLite db handle */ -); -SQLITE_API int sqlite3_open_v2( - const char *filename, /* Database filename (UTF-8) */ - sqlite3 **ppDb, /* OUT: SQLite db handle */ - int flags, /* Flags */ - const char *zVfs /* Name of VFS module to use */ -); - -/* -** CAPI3REF: Error Codes And Messages -** -** ^The sqlite3_errcode() interface returns the numeric [result code] or -** [extended result code] for the most recent failed sqlite3_* API call -** associated with a [database connection]. If a prior API call failed -** but the most recent API call succeeded, the return value from -** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode() -** interface is the same except that it always returns the -** [extended result code] even when extended result codes are -** disabled. -** -** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language -** text that describes the error, as either UTF-8 or UTF-16 respectively. -** ^(Memory to hold the error message string is managed internally. -** The application does not need to worry about freeing the result. -** However, the error string might be overwritten or deallocated by -** subsequent calls to other SQLite interface functions.)^ -** -** When the serialized [threading mode] is in use, it might be the -** case that a second error occurs on a separate thread in between -** the time of the first error and the call to these interfaces. -** When that happens, the second error will be reported since these -** interfaces always report the most recent result. To avoid -** this, each thread can obtain exclusive use of the [database connection] D -** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning -** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after -** all calls to the interfaces listed here are completed. -** -** If an interface fails with SQLITE_MISUSE, that means the interface -** was invoked incorrectly by the application. In that case, the -** error code and message may or may not be set. -*/ -SQLITE_API int sqlite3_errcode(sqlite3 *db); -SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); -SQLITE_API const char *sqlite3_errmsg(sqlite3*); -SQLITE_API const void *sqlite3_errmsg16(sqlite3*); - -/* -** CAPI3REF: SQL Statement Object -** KEYWORDS: {prepared statement} {prepared statements} -** -** An instance of this object represents a single SQL statement. -** This object is variously known as a "prepared statement" or a -** "compiled SQL statement" or simply as a "statement". -** -** The life of a statement object goes something like this: -** -**
    -**
  1. Create the object using [sqlite3_prepare_v2()] or a related -** function. -**
  2. Bind values to [host parameters] using the sqlite3_bind_*() -** interfaces. -**
  3. Run the SQL by calling [sqlite3_step()] one or more times. -**
  4. Reset the statement using [sqlite3_reset()] then go back -** to step 2. Do this zero or more times. -**
  5. Destroy the object using [sqlite3_finalize()]. -**
-** -** Refer to documentation on individual methods above for additional -** information. -*/ -typedef struct sqlite3_stmt sqlite3_stmt; - -/* -** CAPI3REF: Run-time Limits -** -** ^(This interface allows the size of various constructs to be limited -** on a connection by connection basis. The first parameter is the -** [database connection] whose limit is to be set or queried. The -** second parameter is one of the [limit categories] that define a -** class of constructs to be size limited. The third parameter is the -** new limit for that construct.)^ -** -** ^If the new limit is a negative number, the limit is unchanged. -** ^(For each limit category SQLITE_LIMIT_NAME there is a -** [limits | hard upper bound] -** set at compile-time by a C preprocessor macro called -** [limits | SQLITE_MAX_NAME]. -** (The "_LIMIT_" in the name is changed to "_MAX_".))^ -** ^Attempts to increase a limit above its hard upper bound are -** silently truncated to the hard upper bound. -** -** ^Regardless of whether or not the limit was changed, the -** [sqlite3_limit()] interface returns the prior value of the limit. -** ^Hence, to find the current value of a limit without changing it, -** simply invoke this interface with the third parameter set to -1. -** -** Run-time limits are intended for use in applications that manage -** both their own internal database and also databases that are controlled -** by untrusted external sources. An example application might be a -** web browser that has its own databases for storing history and -** separate databases controlled by JavaScript applications downloaded -** off the Internet. The internal databases can be given the -** large, default limits. Databases managed by external sources can -** be given much smaller limits designed to prevent a denial of service -** attack. Developers might also want to use the [sqlite3_set_authorizer()] -** interface to further control untrusted SQL. The size of the database -** created by an untrusted script can be contained using the -** [max_page_count] [PRAGMA]. -** -** New run-time limit categories may be added in future releases. -*/ -SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); - -/* -** CAPI3REF: Run-Time Limit Categories -** KEYWORDS: {limit category} {*limit categories} -** -** These constants define various performance limits -** that can be lowered at run-time using [sqlite3_limit()]. -** The synopsis of the meanings of the various limits is shown below. -** Additional information is available at [limits | Limits in SQLite]. -** -**
-** ^(
SQLITE_LIMIT_LENGTH
-**
The maximum size of any string or BLOB or table row, in bytes.
)^ -** -** ^(
SQLITE_LIMIT_SQL_LENGTH
-**
The maximum length of an SQL statement, in bytes.
)^ -** -** ^(
SQLITE_LIMIT_COLUMN
-**
The maximum number of columns in a table definition or in the -** result set of a [SELECT] or the maximum number of columns in an index -** or in an ORDER BY or GROUP BY clause.
)^ -** -** ^(
SQLITE_LIMIT_EXPR_DEPTH
-**
The maximum depth of the parse tree on any expression.
)^ -** -** ^(
SQLITE_LIMIT_COMPOUND_SELECT
-**
The maximum number of terms in a compound SELECT statement.
)^ -** -** ^(
SQLITE_LIMIT_VDBE_OP
-**
The maximum number of instructions in a virtual machine program -** used to implement an SQL statement. This limit is not currently -** enforced, though that might be added in some future release of -** SQLite.
)^ -** -** ^(
SQLITE_LIMIT_FUNCTION_ARG
-**
The maximum number of arguments on a function.
)^ -** -** ^(
SQLITE_LIMIT_ATTACHED
-**
The maximum number of [ATTACH | attached databases].)^
-** -** ^(
SQLITE_LIMIT_LIKE_PATTERN_LENGTH
-**
The maximum length of the pattern argument to the [LIKE] or -** [GLOB] operators.
)^ -** -** ^(
SQLITE_LIMIT_VARIABLE_NUMBER
-**
The maximum index number of any [parameter] in an SQL statement.)^ -** -** ^(
SQLITE_LIMIT_TRIGGER_DEPTH
-**
The maximum depth of recursion for triggers.
)^ -**
-*/ -#define SQLITE_LIMIT_LENGTH 0 -#define SQLITE_LIMIT_SQL_LENGTH 1 -#define SQLITE_LIMIT_COLUMN 2 -#define SQLITE_LIMIT_EXPR_DEPTH 3 -#define SQLITE_LIMIT_COMPOUND_SELECT 4 -#define SQLITE_LIMIT_VDBE_OP 5 -#define SQLITE_LIMIT_FUNCTION_ARG 6 -#define SQLITE_LIMIT_ATTACHED 7 -#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 -#define SQLITE_LIMIT_VARIABLE_NUMBER 9 -#define SQLITE_LIMIT_TRIGGER_DEPTH 10 - -/* -** CAPI3REF: Compiling An SQL Statement -** KEYWORDS: {SQL statement compiler} -** -** To execute an SQL query, it must first be compiled into a byte-code -** program using one of these routines. -** -** The first argument, "db", is a [database connection] obtained from a -** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or -** [sqlite3_open16()]. The database connection must not have been closed. -** -** The second argument, "zSql", is the statement to be compiled, encoded -** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() -** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() -** use UTF-16. -** -** ^If the nByte argument is less than zero, then zSql is read up to the -** first zero terminator. ^If nByte is non-negative, then it is the maximum -** number of bytes read from zSql. ^When nByte is non-negative, the -** zSql string ends at either the first '\000' or '\u0000' character or -** the nByte-th byte, whichever comes first. If the caller knows -** that the supplied string is nul-terminated, then there is a small -** performance advantage to be gained by passing an nByte parameter that -** is equal to the number of bytes in the input string including -** the nul-terminator bytes. -** -** ^If pzTail is not NULL then *pzTail is made to point to the first byte -** past the end of the first SQL statement in zSql. These routines only -** compile the first statement in zSql, so *pzTail is left pointing to -** what remains uncompiled. -** -** ^*ppStmt is left pointing to a compiled [prepared statement] that can be -** executed using [sqlite3_step()]. ^If there is an error, *ppStmt is set -** to NULL. ^If the input text contains no SQL (if the input is an empty -** string or a comment) then *ppStmt is set to NULL. -** The calling procedure is responsible for deleting the compiled -** SQL statement using [sqlite3_finalize()] after it has finished with it. -** ppStmt may not be NULL. -** -** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; -** otherwise an [error code] is returned. -** -** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are -** recommended for all new programs. The two older interfaces are retained -** for backwards compatibility, but their use is discouraged. -** ^In the "v2" interfaces, the prepared statement -** that is returned (the [sqlite3_stmt] object) contains a copy of the -** original SQL text. This causes the [sqlite3_step()] interface to -** behave differently in three ways: -** -**
    -**
  1. -** ^If the database schema changes, instead of returning [SQLITE_SCHEMA] as it -** always used to do, [sqlite3_step()] will automatically recompile the SQL -** statement and try to run it again. -**
  2. -** -**
  3. -** ^When an error occurs, [sqlite3_step()] will return one of the detailed -** [error codes] or [extended error codes]. ^The legacy behavior was that -** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code -** and the application would have to make a second call to [sqlite3_reset()] -** in order to find the underlying cause of the problem. With the "v2" prepare -** interfaces, the underlying reason for the error is returned immediately. -**
  4. -** -**
  5. -** ^If the specific value bound to [parameter | host parameter] in the -** WHERE clause might influence the choice of query plan for a statement, -** then the statement will be automatically recompiled, as if there had been -** a schema change, on the first [sqlite3_step()] call following any change -** to the [sqlite3_bind_text | bindings] of that [parameter]. -** ^The specific value of WHERE-clause [parameter] might influence the -** choice of query plan if the parameter is the left-hand side of a [LIKE] -** or [GLOB] operator or if the parameter is compared to an indexed column -** and the [SQLITE_ENABLE_STAT2] compile-time option is enabled. -** the -**
  6. -**
-*/ -SQLITE_API int sqlite3_prepare( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare_v2( - sqlite3 *db, /* Database handle */ - const char *zSql, /* SQL statement, UTF-8 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const char **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare16( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); -SQLITE_API int sqlite3_prepare16_v2( - sqlite3 *db, /* Database handle */ - const void *zSql, /* SQL statement, UTF-16 encoded */ - int nByte, /* Maximum length of zSql in bytes. */ - sqlite3_stmt **ppStmt, /* OUT: Statement handle */ - const void **pzTail /* OUT: Pointer to unused portion of zSql */ -); - -/* -** CAPI3REF: Retrieving Statement SQL -** -** ^This interface can be used to retrieve a saved copy of the original -** SQL text used to create a [prepared statement] if that statement was -** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. -*/ -SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Determine If An SQL Statement Writes The Database -** -** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if -** and only if the [prepared statement] X makes no direct changes to -** the content of the database file. -** -** Note that [application-defined SQL functions] or -** [virtual tables] might change the database indirectly as a side effect. -** ^(For example, if an application defines a function "eval()" that -** calls [sqlite3_exec()], then the following SQL statement would -** change the database file through side-effects: -** -**
-**    SELECT eval('DELETE FROM t1') FROM t2;
-** 
-** -** But because the [SELECT] statement does not change the database file -** directly, sqlite3_stmt_readonly() would still return true.)^ -** -** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], -** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, -** since the statements themselves do not actually modify the database but -** rather they control the timing of when other statements modify the -** database. ^The [ATTACH] and [DETACH] statements also cause -** sqlite3_stmt_readonly() to return true since, while those statements -** change the configuration of a database connection, they do not make -** changes to the content of the database files on disk. -*/ -SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Dynamically Typed Value Object -** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} -** -** SQLite uses the sqlite3_value object to represent all values -** that can be stored in a database table. SQLite uses dynamic typing -** for the values it stores. ^Values stored in sqlite3_value objects -** can be integers, floating point values, strings, BLOBs, or NULL. -** -** An sqlite3_value object may be either "protected" or "unprotected". -** Some interfaces require a protected sqlite3_value. Other interfaces -** will accept either a protected or an unprotected sqlite3_value. -** Every interface that accepts sqlite3_value arguments specifies -** whether or not it requires a protected sqlite3_value. -** -** The terms "protected" and "unprotected" refer to whether or not -** a mutex is held. A internal mutex is held for a protected -** sqlite3_value object but no mutex is held for an unprotected -** sqlite3_value object. If SQLite is compiled to be single-threaded -** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) -** or if SQLite is run in one of reduced mutex modes -** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] -** then there is no distinction between protected and unprotected -** sqlite3_value objects and they can be used interchangeably. However, -** for maximum code portability it is recommended that applications -** still make the distinction between protected and unprotected -** sqlite3_value objects even when not strictly required. -** -** ^The sqlite3_value objects that are passed as parameters into the -** implementation of [application-defined SQL functions] are protected. -** ^The sqlite3_value object returned by -** [sqlite3_column_value()] is unprotected. -** Unprotected sqlite3_value objects may only be used with -** [sqlite3_result_value()] and [sqlite3_bind_value()]. -** The [sqlite3_value_blob | sqlite3_value_type()] family of -** interfaces require protected sqlite3_value objects. -*/ -typedef struct Mem sqlite3_value; - -/* -** CAPI3REF: SQL Function Context Object -** -** The context in which an SQL function executes is stored in an -** sqlite3_context object. ^A pointer to an sqlite3_context object -** is always first parameter to [application-defined SQL functions]. -** The application-defined SQL function implementation will pass this -** pointer through into calls to [sqlite3_result_int | sqlite3_result()], -** [sqlite3_aggregate_context()], [sqlite3_user_data()], -** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], -** and/or [sqlite3_set_auxdata()]. -*/ -typedef struct sqlite3_context sqlite3_context; - -/* -** CAPI3REF: Binding Values To Prepared Statements -** KEYWORDS: {host parameter} {host parameters} {host parameter name} -** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} -** -** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, -** literals may be replaced by a [parameter] that matches one of following -** templates: -** -**
    -**
  • ? -**
  • ?NNN -**
  • :VVV -**
  • @VVV -**
  • $VVV -**
-** -** In the templates above, NNN represents an integer literal, -** and VVV represents an alphanumeric identifier.)^ ^The values of these -** parameters (also called "host parameter names" or "SQL parameters") -** can be set using the sqlite3_bind_*() routines defined here. -** -** ^The first argument to the sqlite3_bind_*() routines is always -** a pointer to the [sqlite3_stmt] object returned from -** [sqlite3_prepare_v2()] or its variants. -** -** ^The second argument is the index of the SQL parameter to be set. -** ^The leftmost SQL parameter has an index of 1. ^When the same named -** SQL parameter is used more than once, second and subsequent -** occurrences have the same index as the first occurrence. -** ^The index for named parameters can be looked up using the -** [sqlite3_bind_parameter_index()] API if desired. ^The index -** for "?NNN" parameters is the value of NNN. -** ^The NNN value must be between 1 and the [sqlite3_limit()] -** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999). -** -** ^The third argument is the value to bind to the parameter. -** -** ^(In those routines that have a fourth argument, its value is the -** number of bytes in the parameter. To be clear: the value is the -** number of bytes in the value, not the number of characters.)^ -** ^If the fourth parameter is negative, the length of the string is -** the number of bytes up to the first zero terminator. -** -** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and -** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or -** string after SQLite has finished with it. ^The destructor is called -** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(), -** sqlite3_bind_text(), or sqlite3_bind_text16() fails. -** ^If the fifth argument is -** the special value [SQLITE_STATIC], then SQLite assumes that the -** information is in static, unmanaged space and does not need to be freed. -** ^If the fifth argument has the value [SQLITE_TRANSIENT], then -** SQLite makes its own private copy of the data immediately, before -** the sqlite3_bind_*() routine returns. -** -** ^The sqlite3_bind_zeroblob() routine binds a BLOB of length N that -** is filled with zeroes. ^A zeroblob uses a fixed amount of memory -** (just an integer to hold its size) while it is being processed. -** Zeroblobs are intended to serve as placeholders for BLOBs whose -** content is later written using -** [sqlite3_blob_open | incremental BLOB I/O] routines. -** ^A negative value for the zeroblob results in a zero-length BLOB. -** -** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer -** for the [prepared statement] or with a prepared statement for which -** [sqlite3_step()] has been called more recently than [sqlite3_reset()], -** then the call will return [SQLITE_MISUSE]. If any sqlite3_bind_() -** routine is passed a [prepared statement] that has been finalized, the -** result is undefined and probably harmful. -** -** ^Bindings are not cleared by the [sqlite3_reset()] routine. -** ^Unbound parameters are interpreted as NULL. -** -** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an -** [error code] if anything goes wrong. -** ^[SQLITE_RANGE] is returned if the parameter -** index is out of range. ^[SQLITE_NOMEM] is returned if malloc() fails. -** -** See also: [sqlite3_bind_parameter_count()], -** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); -SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); -SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); -SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); -SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); -SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); -SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); -SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); -SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); - -/* -** CAPI3REF: Number Of SQL Parameters -** -** ^This routine can be used to find the number of [SQL parameters] -** in a [prepared statement]. SQL parameters are tokens of the -** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as -** placeholders for values that are [sqlite3_bind_blob | bound] -** to the parameters at a later time. -** -** ^(This routine actually returns the index of the largest (rightmost) -** parameter. For all forms except ?NNN, this will correspond to the -** number of unique parameters. If parameters of the ?NNN form are used, -** there may be gaps in the list.)^ -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_name()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); - -/* -** CAPI3REF: Name Of A Host Parameter -** -** ^The sqlite3_bind_parameter_name(P,N) interface returns -** the name of the N-th [SQL parameter] in the [prepared statement] P. -** ^(SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" -** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA" -** respectively. -** In other words, the initial ":" or "$" or "@" or "?" -** is included as part of the name.)^ -** ^Parameters of the form "?" without a following integer have no name -** and are referred to as "nameless" or "anonymous parameters". -** -** ^The first host parameter has an index of 1, not 0. -** -** ^If the value N is out of range or if the N-th parameter is -** nameless, then NULL is returned. ^The returned string is -** always in UTF-8 encoding even if the named parameter was -** originally specified as UTF-16 in [sqlite3_prepare16()] or -** [sqlite3_prepare16_v2()]. -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_count()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); - -/* -** CAPI3REF: Index Of A Parameter With A Given Name -** -** ^Return the index of an SQL parameter given its name. ^The -** index value returned is suitable for use as the second -** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero -** is returned if no matching parameter is found. ^The parameter -** name must be given in UTF-8 even if the original statement -** was prepared from UTF-16 text using [sqlite3_prepare16_v2()]. -** -** See also: [sqlite3_bind_blob|sqlite3_bind()], -** [sqlite3_bind_parameter_count()], and -** [sqlite3_bind_parameter_index()]. -*/ -SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); - -/* -** CAPI3REF: Reset All Bindings On A Prepared Statement -** -** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset -** the [sqlite3_bind_blob | bindings] on a [prepared statement]. -** ^Use this routine to reset all host parameters to NULL. -*/ -SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); - -/* -** CAPI3REF: Number Of Columns In A Result Set -** -** ^Return the number of columns in the result set returned by the -** [prepared statement]. ^This routine returns 0 if pStmt is an SQL -** statement that does not return data (for example an [UPDATE]). -** -** See also: [sqlite3_data_count()] -*/ -SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Column Names In A Result Set -** -** ^These routines return the name assigned to a particular column -** in the result set of a [SELECT] statement. ^The sqlite3_column_name() -** interface returns a pointer to a zero-terminated UTF-8 string -** and sqlite3_column_name16() returns a pointer to a zero-terminated -** UTF-16 string. ^The first parameter is the [prepared statement] -** that implements the [SELECT] statement. ^The second parameter is the -** column number. ^The leftmost column is number 0. -** -** ^The returned string pointer is valid until either the [prepared statement] -** is destroyed by [sqlite3_finalize()] or until the next call to -** sqlite3_column_name() or sqlite3_column_name16() on the same column. -** -** ^If sqlite3_malloc() fails during the processing of either routine -** (for example during a conversion from UTF-8 to UTF-16) then a -** NULL pointer is returned. -** -** ^The name of a result column is the value of the "AS" clause for -** that column, if there is an AS clause. If there is no AS clause -** then the name of the column is unspecified and may change from -** one release of SQLite to the next. -*/ -SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N); -SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); - -/* -** CAPI3REF: Source Of Data In A Query Result -** -** ^These routines provide a means to determine the database, table, and -** table column that is the origin of a particular result column in -** [SELECT] statement. -** ^The name of the database or table or column can be returned as -** either a UTF-8 or UTF-16 string. ^The _database_ routines return -** the database name, the _table_ routines return the table name, and -** the origin_ routines return the column name. -** ^The returned string is valid until the [prepared statement] is destroyed -** using [sqlite3_finalize()] or until the same information is requested -** again in a different encoding. -** -** ^The names returned are the original un-aliased names of the -** database, table, and column. -** -** ^The first argument to these interfaces is a [prepared statement]. -** ^These functions return information about the Nth result column returned by -** the statement, where N is the second function argument. -** ^The left-most column is column 0 for these routines. -** -** ^If the Nth column returned by the statement is an expression or -** subquery and is not a column value, then all of these functions return -** NULL. ^These routine might also return NULL if a memory allocation error -** occurs. ^Otherwise, they return the name of the attached database, table, -** or column that query result column was extracted from. -** -** ^As with all other SQLite APIs, those whose names end with "16" return -** UTF-16 encoded strings and the other functions return UTF-8. -** -** ^These APIs are only available if the library was compiled with the -** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol. -** -** If two or more threads call one or more of these routines against the same -** prepared statement and column at the same time then the results are -** undefined. -** -** If two or more threads call one or more -** [sqlite3_column_database_name | column metadata interfaces] -** for the same [prepared statement] and result column -** at the same time then the results are undefined. -*/ -SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); -SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); -SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Declared Datatype Of A Query Result -** -** ^(The first parameter is a [prepared statement]. -** If this statement is a [SELECT] statement and the Nth column of the -** returned result set of that [SELECT] is a table column (not an -** expression or subquery) then the declared type of the table -** column is returned.)^ ^If the Nth column of the result set is an -** expression or subquery, then a NULL pointer is returned. -** ^The returned string is always UTF-8 encoded. -** -** ^(For example, given the database schema: -** -** CREATE TABLE t1(c1 VARIANT); -** -** and the following statement to be compiled: -** -** SELECT c1 + 1, c1 FROM t1; -** -** this routine would return the string "VARIANT" for the second result -** column (i==1), and a NULL pointer for the first result column (i==0).)^ -** -** ^SQLite uses dynamic run-time typing. ^So just because a column -** is declared to contain a particular type does not mean that the -** data stored in that column is of the declared type. SQLite is -** strongly typed, but the typing is dynamic not static. ^Type -** is associated with individual values, not with the containers -** used to hold those values. -*/ -SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int); -SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); - -/* -** CAPI3REF: Evaluate An SQL Statement -** -** After a [prepared statement] has been prepared using either -** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy -** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function -** must be called one or more times to evaluate the statement. -** -** The details of the behavior of the sqlite3_step() interface depend -** on whether the statement was prepared using the newer "v2" interface -** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy -** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the -** new "v2" interface is recommended for new applications but the legacy -** interface will continue to be supported. -** -** ^In the legacy interface, the return value will be either [SQLITE_BUSY], -** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. -** ^With the "v2" interface, any of the other [result codes] or -** [extended result codes] might be returned as well. -** -** ^[SQLITE_BUSY] means that the database engine was unable to acquire the -** database locks it needs to do its job. ^If the statement is a [COMMIT] -** or occurs outside of an explicit transaction, then you can retry the -** statement. If the statement is not a [COMMIT] and occurs within a -** explicit transaction then you should rollback the transaction before -** continuing. -** -** ^[SQLITE_DONE] means that the statement has finished executing -** successfully. sqlite3_step() should not be called again on this virtual -** machine without first calling [sqlite3_reset()] to reset the virtual -** machine back to its initial state. -** -** ^If the SQL statement being executed returns any data, then [SQLITE_ROW] -** is returned each time a new row of data is ready for processing by the -** caller. The values may be accessed using the [column access functions]. -** sqlite3_step() is called again to retrieve the next row of data. -** -** ^[SQLITE_ERROR] means that a run-time error (such as a constraint -** violation) has occurred. sqlite3_step() should not be called again on -** the VM. More information may be found by calling [sqlite3_errmsg()]. -** ^With the legacy interface, a more specific error code (for example, -** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) -** can be obtained by calling [sqlite3_reset()] on the -** [prepared statement]. ^In the "v2" interface, -** the more specific error code is returned directly by sqlite3_step(). -** -** [SQLITE_MISUSE] means that the this routine was called inappropriately. -** Perhaps it was called on a [prepared statement] that has -** already been [sqlite3_finalize | finalized] or on one that had -** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could -** be the case that the same database connection is being used by two or -** more threads at the same moment in time. -** -** For all versions of SQLite up to and including 3.6.23.1, a call to -** [sqlite3_reset()] was required after sqlite3_step() returned anything -** other than [SQLITE_ROW] before any subsequent invocation of -** sqlite3_step(). Failure to reset the prepared statement using -** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from -** sqlite3_step(). But after version 3.6.23.1, sqlite3_step() began -** calling [sqlite3_reset()] automatically in this circumstance rather -** than returning [SQLITE_MISUSE]. This is not considered a compatibility -** break because any application that ever receives an SQLITE_MISUSE error -** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option -** can be used to restore the legacy behavior. -** -** Goofy Interface Alert: In the legacy interface, the sqlite3_step() -** API always returns a generic error code, [SQLITE_ERROR], following any -** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call -** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the -** specific [error codes] that better describes the error. -** We admit that this is a goofy design. The problem has been fixed -** with the "v2" interface. If you prepare all of your SQL statements -** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead -** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, -** then the more specific [error codes] are returned directly -** by sqlite3_step(). The use of the "v2" interface is recommended. -*/ -SQLITE_API int sqlite3_step(sqlite3_stmt*); - -/* -** CAPI3REF: Number of columns in a result set -** -** ^The sqlite3_data_count(P) interface returns the number of columns in the -** current row of the result set of [prepared statement] P. -** ^If prepared statement P does not have results ready to return -** (via calls to the [sqlite3_column_int | sqlite3_column_*()] of -** interfaces) then sqlite3_data_count(P) returns 0. -** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. -** -** See also: [sqlite3_column_count()] -*/ -SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Fundamental Datatypes -** KEYWORDS: SQLITE_TEXT -** -** ^(Every value in SQLite has one of five fundamental datatypes: -** -**
    -**
  • 64-bit signed integer -**
  • 64-bit IEEE floating point number -**
  • string -**
  • BLOB -**
  • NULL -**
)^ -** -** These constants are codes for each of those types. -** -** Note that the SQLITE_TEXT constant was also used in SQLite version 2 -** for a completely different meaning. Software that links against both -** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not -** SQLITE_TEXT. -*/ -#define SQLITE_INTEGER 1 -#define SQLITE_FLOAT 2 -#define SQLITE_BLOB 4 -#define SQLITE_NULL 5 -#ifdef SQLITE_TEXT -# undef SQLITE_TEXT -#else -# define SQLITE_TEXT 3 -#endif -#define SQLITE3_TEXT 3 - -/* -** CAPI3REF: Result Values From A Query -** KEYWORDS: {column access functions} -** -** These routines form the "result set" interface. -** -** ^These routines return information about a single column of the current -** result row of a query. ^In every case the first argument is a pointer -** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*] -** that was returned from [sqlite3_prepare_v2()] or one of its variants) -** and the second argument is the index of the column for which information -** should be returned. ^The leftmost column of the result set has the index 0. -** ^The number of columns in the result can be determined using -** [sqlite3_column_count()]. -** -** If the SQL statement does not currently point to a valid row, or if the -** column index is out of range, the result is undefined. -** These routines may only be called when the most recent call to -** [sqlite3_step()] has returned [SQLITE_ROW] and neither -** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. -** If any of these routines are called after [sqlite3_reset()] or -** [sqlite3_finalize()] or after [sqlite3_step()] has returned -** something other than [SQLITE_ROW], the results are undefined. -** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] -** are called from a different thread while any of these routines -** are pending, then the results are undefined. -** -** ^The sqlite3_column_type() routine returns the -** [SQLITE_INTEGER | datatype code] for the initial data type -** of the result column. ^The returned value is one of [SQLITE_INTEGER], -** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value -** returned by sqlite3_column_type() is only meaningful if no type -** conversions have occurred as described below. After a type conversion, -** the value returned by sqlite3_column_type() is undefined. Future -** versions of SQLite may change the behavior of sqlite3_column_type() -** following a type conversion. -** -** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() -** routine returns the number of bytes in that BLOB or string. -** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts -** the string to UTF-8 and then returns the number of bytes. -** ^If the result is a numeric value then sqlite3_column_bytes() uses -** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns -** the number of bytes in that string. -** ^If the result is NULL, then sqlite3_column_bytes() returns zero. -** -** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16() -** routine returns the number of bytes in that BLOB or string. -** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts -** the string to UTF-16 and then returns the number of bytes. -** ^If the result is a numeric value then sqlite3_column_bytes16() uses -** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns -** the number of bytes in that string. -** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. -** -** ^The values returned by [sqlite3_column_bytes()] and -** [sqlite3_column_bytes16()] do not include the zero terminators at the end -** of the string. ^For clarity: the values returned by -** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are the number of -** bytes in the string, not the number of characters. -** -** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), -** even empty strings, are always zero terminated. ^The return -** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. -** -** ^The object returned by [sqlite3_column_value()] is an -** [unprotected sqlite3_value] object. An unprotected sqlite3_value object -** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()]. -** If the [unprotected sqlite3_value] object returned by -** [sqlite3_column_value()] is used in any other way, including calls -** to routines like [sqlite3_value_int()], [sqlite3_value_text()], -** or [sqlite3_value_bytes()], then the behavior is undefined. -** -** These routines attempt to convert the value where appropriate. ^For -** example, if the internal representation is FLOAT and a text result -** is requested, [sqlite3_snprintf()] is used internally to perform the -** conversion automatically. ^(The following table details the conversions -** that are applied: -** -**
-** -**
Internal
Type
Requested
Type
Conversion -** -**
NULL INTEGER Result is 0 -**
NULL FLOAT Result is 0.0 -**
NULL TEXT Result is NULL pointer -**
NULL BLOB Result is NULL pointer -**
INTEGER FLOAT Convert from integer to float -**
INTEGER TEXT ASCII rendering of the integer -**
INTEGER BLOB Same as INTEGER->TEXT -**
FLOAT INTEGER Convert from float to integer -**
FLOAT TEXT ASCII rendering of the float -**
FLOAT BLOB Same as FLOAT->TEXT -**
TEXT INTEGER Use atoi() -**
TEXT FLOAT Use atof() -**
TEXT BLOB No change -**
BLOB INTEGER Convert to TEXT then use atoi() -**
BLOB FLOAT Convert to TEXT then use atof() -**
BLOB TEXT Add a zero terminator if needed -**
-**
)^ -** -** The table above makes reference to standard C library functions atoi() -** and atof(). SQLite does not really use these functions. It has its -** own equivalent internal routines. The atoi() and atof() names are -** used in the table for brevity and because they are familiar to most -** C programmers. -** -** Note that when type conversions occur, pointers returned by prior -** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or -** sqlite3_column_text16() may be invalidated. -** Type conversions and pointer invalidations might occur -** in the following cases: -** -**
    -**
  • The initial content is a BLOB and sqlite3_column_text() or -** sqlite3_column_text16() is called. A zero-terminator might -** need to be added to the string.
  • -**
  • The initial content is UTF-8 text and sqlite3_column_bytes16() or -** sqlite3_column_text16() is called. The content must be converted -** to UTF-16.
  • -**
  • The initial content is UTF-16 text and sqlite3_column_bytes() or -** sqlite3_column_text() is called. The content must be converted -** to UTF-8.
  • -**
-** -** ^Conversions between UTF-16be and UTF-16le are always done in place and do -** not invalidate a prior pointer, though of course the content of the buffer -** that the prior pointer references will have been modified. Other kinds -** of conversion are done in place when it is possible, but sometimes they -** are not possible and in those cases prior pointers are invalidated. -** -** The safest and easiest to remember policy is to invoke these routines -** in one of the following ways: -** -**
    -**
  • sqlite3_column_text() followed by sqlite3_column_bytes()
  • -**
  • sqlite3_column_blob() followed by sqlite3_column_bytes()
  • -**
  • sqlite3_column_text16() followed by sqlite3_column_bytes16()
  • -**
-** -** In other words, you should call sqlite3_column_text(), -** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result -** into the desired format, then invoke sqlite3_column_bytes() or -** sqlite3_column_bytes16() to find the size of the result. Do not mix calls -** to sqlite3_column_text() or sqlite3_column_blob() with calls to -** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16() -** with calls to sqlite3_column_bytes(). -** -** ^The pointers returned are valid until a type conversion occurs as -** described above, or until [sqlite3_step()] or [sqlite3_reset()] or -** [sqlite3_finalize()] is called. ^The memory space used to hold strings -** and BLOBs is freed automatically. Do not pass the pointers returned -** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into -** [sqlite3_free()]. -** -** ^(If a memory allocation error occurs during the evaluation of any -** of these routines, a default value is returned. The default value -** is either the integer 0, the floating point number 0.0, or a NULL -** pointer. Subsequent calls to [sqlite3_errcode()] will return -** [SQLITE_NOMEM].)^ -*/ -SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); -SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); -SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); -SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); -SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); -SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); - -/* -** CAPI3REF: Destroy A Prepared Statement Object -** -** ^The sqlite3_finalize() function is called to delete a [prepared statement]. -** ^If the most recent evaluation of the statement encountered no errors or -** or if the statement is never been evaluated, then sqlite3_finalize() returns -** SQLITE_OK. ^If the most recent evaluation of statement S failed, then -** sqlite3_finalize(S) returns the appropriate [error code] or -** [extended error code]. -** -** ^The sqlite3_finalize(S) routine can be called at any point during -** the life cycle of [prepared statement] S: -** before statement S is ever evaluated, after -** one or more calls to [sqlite3_reset()], or after any call -** to [sqlite3_step()] regardless of whether or not the statement has -** completed execution. -** -** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op. -** -** The application must finalize every [prepared statement] in order to avoid -** resource leaks. It is a grievous error for the application to try to use -** a prepared statement after it has been finalized. Any use of a prepared -** statement after it has been finalized can result in undefined and -** undesirable behavior such as segfaults and heap corruption. -*/ -SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Reset A Prepared Statement Object -** -** The sqlite3_reset() function is called to reset a [prepared statement] -** object back to its initial state, ready to be re-executed. -** ^Any SQL statement variables that had values bound to them using -** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. -** Use [sqlite3_clear_bindings()] to reset the bindings. -** -** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S -** back to the beginning of its program. -** -** ^If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], -** or if [sqlite3_step(S)] has never before been called on S, -** then [sqlite3_reset(S)] returns [SQLITE_OK]. -** -** ^If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S indicated an error, then -** [sqlite3_reset(S)] returns an appropriate [error code]. -** -** ^The [sqlite3_reset(S)] interface does not change the values -** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. -*/ -SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Create Or Redefine SQL Functions -** KEYWORDS: {function creation routines} -** KEYWORDS: {application-defined SQL function} -** KEYWORDS: {application-defined SQL functions} -** -** ^These functions (collectively known as "function creation routines") -** are used to add SQL functions or aggregates or to redefine the behavior -** of existing SQL functions or aggregates. The only differences between -** these routines are the text encoding expected for -** the the second parameter (the name of the function being created) -** and the presence or absence of a destructor callback for -** the application data pointer. -** -** ^The first parameter is the [database connection] to which the SQL -** function is to be added. ^If an application uses more than one database -** connection then application-defined SQL functions must be added -** to each database connection separately. -** -** ^The second parameter is the name of the SQL function to be created or -** redefined. ^The length of the name is limited to 255 bytes in a UTF-8 -** representation, exclusive of the zero-terminator. ^Note that the name -** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. -** ^Any attempt to create a function with a longer name -** will result in [SQLITE_MISUSE] being returned. -** -** ^The third parameter (nArg) -** is the number of arguments that the SQL function or -** aggregate takes. ^If this parameter is -1, then the SQL function or -** aggregate may take any number of arguments between 0 and the limit -** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third -** parameter is less than -1 or greater than 127 then the behavior is -** undefined. -** -** ^The fourth parameter, eTextRep, specifies what -** [SQLITE_UTF8 | text encoding] this SQL function prefers for -** its parameters. Every SQL function implementation must be able to work -** with UTF-8, UTF-16le, or UTF-16be. But some implementations may be -** more efficient with one encoding than another. ^An application may -** invoke sqlite3_create_function() or sqlite3_create_function16() multiple -** times with the same function but with different values of eTextRep. -** ^When multiple implementations of the same function are available, SQLite -** will pick the one that involves the least amount of data conversion. -** If there is only a single implementation which does not care what text -** encoding is used, then the fourth argument should be [SQLITE_ANY]. -** -** ^(The fifth parameter is an arbitrary pointer. The implementation of the -** function can gain access to this pointer using [sqlite3_user_data()].)^ -** -** ^The sixth, seventh and eighth parameters, xFunc, xStep and xFinal, are -** pointers to C-language functions that implement the SQL function or -** aggregate. ^A scalar SQL function requires an implementation of the xFunc -** callback only; NULL pointers must be passed as the xStep and xFinal -** parameters. ^An aggregate SQL function requires an implementation of xStep -** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing -** SQL function or aggregate, pass NULL poiners for all three function -** callbacks. -** -** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL, -** then it is destructor for the application data pointer. -** The destructor is invoked when the function is deleted, either by being -** overloaded or when the database connection closes.)^ -** ^The destructor is also invoked if the call to -** sqlite3_create_function_v2() fails. -** ^When the destructor callback of the tenth parameter is invoked, it -** is passed a single argument which is a copy of the application data -** pointer which was the fifth parameter to sqlite3_create_function_v2(). -** -** ^It is permitted to register multiple implementations of the same -** functions with the same name but with either differing numbers of -** arguments or differing preferred text encodings. ^SQLite will use -** the implementation that most closely matches the way in which the -** SQL function is used. ^A function implementation with a non-negative -** nArg parameter is a better match than a function implementation with -** a negative nArg. ^A function where the preferred text encoding -** matches the database encoding is a better -** match than a function where the encoding is different. -** ^A function where the encoding difference is between UTF16le and UTF16be -** is a closer match than a function where the encoding difference is -** between UTF8 and UTF16. -** -** ^Built-in functions may be overloaded by new application-defined functions. -** -** ^An application-defined function is permitted to call other -** SQLite interfaces. However, such calls must not -** close the database connection nor finalize or reset the prepared -** statement in which the function is running. -*/ -SQLITE_API int sqlite3_create_function( - sqlite3 *db, - const char *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); -SQLITE_API int sqlite3_create_function16( - sqlite3 *db, - const void *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*) -); -SQLITE_API int sqlite3_create_function_v2( - sqlite3 *db, - const char *zFunctionName, - int nArg, - int eTextRep, - void *pApp, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), - void (*xStep)(sqlite3_context*,int,sqlite3_value**), - void (*xFinal)(sqlite3_context*), - void(*xDestroy)(void*) -); - -/* -** CAPI3REF: Text Encodings -** -** These constant define integer codes that represent the various -** text encodings supported by SQLite. -*/ -#define SQLITE_UTF8 1 -#define SQLITE_UTF16LE 2 -#define SQLITE_UTF16BE 3 -#define SQLITE_UTF16 4 /* Use native byte order */ -#define SQLITE_ANY 5 /* sqlite3_create_function only */ -#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ - -/* -** CAPI3REF: Deprecated Functions -** DEPRECATED -** -** These functions are [deprecated]. In order to maintain -** backwards compatibility with older code, these functions continue -** to be supported. However, new applications should avoid -** the use of these functions. To help encourage people to avoid -** using these functions, we are not going to tell you what they do. -*/ -#ifndef SQLITE_OMIT_DEPRECATED -SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); -SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); -SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); -SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64); -#endif - -/* -** CAPI3REF: Obtaining SQL Function Parameter Values -** -** The C-language implementation of SQL functions and aggregates uses -** this set of interface routines to access the parameter values on -** the function or aggregate. -** -** The xFunc (for scalar functions) or xStep (for aggregates) parameters -** to [sqlite3_create_function()] and [sqlite3_create_function16()] -** define callbacks that implement the SQL functions and aggregates. -** The 3rd parameter to these callbacks is an array of pointers to -** [protected sqlite3_value] objects. There is one [sqlite3_value] object for -** each parameter to the SQL function. These routines are used to -** extract values from the [sqlite3_value] objects. -** -** These routines work only with [protected sqlite3_value] objects. -** Any attempt to use these routines on an [unprotected sqlite3_value] -** object results in undefined behavior. -** -** ^These routines work just like the corresponding [column access functions] -** except that these routines take a single [protected sqlite3_value] object -** pointer instead of a [sqlite3_stmt*] pointer and an integer column number. -** -** ^The sqlite3_value_text16() interface extracts a UTF-16 string -** in the native byte-order of the host machine. ^The -** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces -** extract UTF-16 strings as big-endian and little-endian respectively. -** -** ^(The sqlite3_value_numeric_type() interface attempts to apply -** numeric affinity to the value. This means that an attempt is -** made to convert the value to an integer or floating point. If -** such a conversion is possible without loss of information (in other -** words, if the value is a string that looks like a number) -** then the conversion is performed. Otherwise no conversion occurs. -** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ -** -** Please pay particular attention to the fact that the pointer returned -** from [sqlite3_value_blob()], [sqlite3_value_text()], or -** [sqlite3_value_text16()] can be invalidated by a subsequent call to -** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], -** or [sqlite3_value_text16()]. -** -** These routines must be called from the same thread as -** the SQL function that supplied the [sqlite3_value*] parameters. -*/ -SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); -SQLITE_API double sqlite3_value_double(sqlite3_value*); -SQLITE_API int sqlite3_value_int(sqlite3_value*); -SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); -SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); -SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); -SQLITE_API int sqlite3_value_type(sqlite3_value*); -SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); - -/* -** CAPI3REF: Obtain Aggregate Function Context -** -** Implementations of aggregate SQL functions use this -** routine to allocate memory for storing their state. -** -** ^The first time the sqlite3_aggregate_context(C,N) routine is called -** for a particular aggregate function, SQLite -** allocates N of memory, zeroes out that memory, and returns a pointer -** to the new memory. ^On second and subsequent calls to -** sqlite3_aggregate_context() for the same aggregate function instance, -** the same buffer is returned. Sqlite3_aggregate_context() is normally -** called once for each invocation of the xStep callback and then one -** last time when the xFinal callback is invoked. ^(When no rows match -** an aggregate query, the xStep() callback of the aggregate function -** implementation is never called and xFinal() is called exactly once. -** In those cases, sqlite3_aggregate_context() might be called for the -** first time from within xFinal().)^ -** -** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer if N is -** less than or equal to zero or if a memory allocate error occurs. -** -** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is -** determined by the N parameter on first successful call. Changing the -** value of N in subsequent call to sqlite3_aggregate_context() within -** the same aggregate function instance will not resize the memory -** allocation.)^ -** -** ^SQLite automatically frees the memory allocated by -** sqlite3_aggregate_context() when the aggregate query concludes. -** -** The first parameter must be a copy of the -** [sqlite3_context | SQL function context] that is the first parameter -** to the xStep or xFinal callback routine that implements the aggregate -** function. -** -** This routine must be called from the same thread in which -** the aggregate SQL function is running. -*/ -SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); - -/* -** CAPI3REF: User Data For Functions -** -** ^The sqlite3_user_data() interface returns a copy of -** the pointer that was the pUserData parameter (the 5th parameter) -** of the [sqlite3_create_function()] -** and [sqlite3_create_function16()] routines that originally -** registered the application defined function. -** -** This routine must be called from the same thread in which -** the application-defined function is running. -*/ -SQLITE_API void *sqlite3_user_data(sqlite3_context*); - -/* -** CAPI3REF: Database Connection For Functions -** -** ^The sqlite3_context_db_handle() interface returns a copy of -** the pointer to the [database connection] (the 1st parameter) -** of the [sqlite3_create_function()] -** and [sqlite3_create_function16()] routines that originally -** registered the application defined function. -*/ -SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); - -/* -** CAPI3REF: Function Auxiliary Data -** -** The following two functions may be used by scalar SQL functions to -** associate metadata with argument values. If the same value is passed to -** multiple invocations of the same SQL function during query execution, under -** some circumstances the associated metadata may be preserved. This may -** be used, for example, to add a regular-expression matching scalar -** function. The compiled version of the regular expression is stored as -** metadata associated with the SQL value passed as the regular expression -** pattern. The compiled regular expression can be reused on multiple -** invocations of the same function so that the original pattern string -** does not need to be recompiled on each invocation. -** -** ^The sqlite3_get_auxdata() interface returns a pointer to the metadata -** associated by the sqlite3_set_auxdata() function with the Nth argument -** value to the application-defined function. ^If no metadata has been ever -** been set for the Nth argument of the function, or if the corresponding -** function parameter has changed since the meta-data was set, -** then sqlite3_get_auxdata() returns a NULL pointer. -** -** ^The sqlite3_set_auxdata() interface saves the metadata -** pointed to by its 3rd parameter as the metadata for the N-th -** argument of the application-defined function. Subsequent -** calls to sqlite3_get_auxdata() might return this data, if it has -** not been destroyed. -** ^If it is not NULL, SQLite will invoke the destructor -** function given by the 4th parameter to sqlite3_set_auxdata() on -** the metadata when the corresponding function parameter changes -** or when the SQL statement completes, whichever comes first. -** -** SQLite is free to call the destructor and drop metadata on any -** parameter of any function at any time. ^The only guarantee is that -** the destructor will be called before the metadata is dropped. -** -** ^(In practice, metadata is preserved between function calls for -** expressions that are constant at compile time. This includes literal -** values and [parameters].)^ -** -** These routines must be called from the same thread in which -** the SQL function is running. -*/ -SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); -SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); - - -/* -** CAPI3REF: Constants Defining Special Destructor Behavior -** -** These are special values for the destructor that is passed in as the -** final argument to routines like [sqlite3_result_blob()]. ^If the destructor -** argument is SQLITE_STATIC, it means that the content pointer is constant -** and will never change. It does not need to be destroyed. ^The -** SQLITE_TRANSIENT value means that the content will likely change in -** the near future and that SQLite should make its own private copy of -** the content before returning. -** -** The typedef is necessary to work around problems in certain -** C++ compilers. See ticket #2191. -*/ -typedef void (*sqlite3_destructor_type)(void*); -#define SQLITE_STATIC ((sqlite3_destructor_type)0) -#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) - -/* -** CAPI3REF: Setting The Result Of An SQL Function -** -** These routines are used by the xFunc or xFinal callbacks that -** implement SQL functions and aggregates. See -** [sqlite3_create_function()] and [sqlite3_create_function16()] -** for additional information. -** -** These functions work very much like the [parameter binding] family of -** functions used to bind values to host parameters in prepared statements. -** Refer to the [SQL parameter] documentation for additional information. -** -** ^The sqlite3_result_blob() interface sets the result from -** an application-defined function to be the BLOB whose content is pointed -** to by the second parameter and which is N bytes long where N is the -** third parameter. -** -** ^The sqlite3_result_zeroblob() interfaces set the result of -** the application-defined function to be a BLOB containing all zero -** bytes and N bytes in size, where N is the value of the 2nd parameter. -** -** ^The sqlite3_result_double() interface sets the result from -** an application-defined function to be a floating point value specified -** by its 2nd argument. -** -** ^The sqlite3_result_error() and sqlite3_result_error16() functions -** cause the implemented SQL function to throw an exception. -** ^SQLite uses the string pointed to by the -** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() -** as the text of an error message. ^SQLite interprets the error -** message string from sqlite3_result_error() as UTF-8. ^SQLite -** interprets the string from sqlite3_result_error16() as UTF-16 in native -** byte order. ^If the third parameter to sqlite3_result_error() -** or sqlite3_result_error16() is negative then SQLite takes as the error -** message all text up through the first zero character. -** ^If the third parameter to sqlite3_result_error() or -** sqlite3_result_error16() is non-negative then SQLite takes that many -** bytes (not characters) from the 2nd parameter as the error message. -** ^The sqlite3_result_error() and sqlite3_result_error16() -** routines make a private copy of the error message text before -** they return. Hence, the calling function can deallocate or -** modify the text after they return without harm. -** ^The sqlite3_result_error_code() function changes the error code -** returned by SQLite as a result of an error in a function. ^By default, -** the error code is SQLITE_ERROR. ^A subsequent call to sqlite3_result_error() -** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. -** -** ^The sqlite3_result_toobig() interface causes SQLite to throw an error -** indicating that a string or BLOB is too long to represent. -** -** ^The sqlite3_result_nomem() interface causes SQLite to throw an error -** indicating that a memory allocation failed. -** -** ^The sqlite3_result_int() interface sets the return value -** of the application-defined function to be the 32-bit signed integer -** value given in the 2nd argument. -** ^The sqlite3_result_int64() interface sets the return value -** of the application-defined function to be the 64-bit signed integer -** value given in the 2nd argument. -** -** ^The sqlite3_result_null() interface sets the return value -** of the application-defined function to be NULL. -** -** ^The sqlite3_result_text(), sqlite3_result_text16(), -** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces -** set the return value of the application-defined function to be -** a text string which is represented as UTF-8, UTF-16 native byte order, -** UTF-16 little endian, or UTF-16 big endian, respectively. -** ^SQLite takes the text result from the application from -** the 2nd parameter of the sqlite3_result_text* interfaces. -** ^If the 3rd parameter to the sqlite3_result_text* interfaces -** is negative, then SQLite takes result text from the 2nd parameter -** through the first zero character. -** ^If the 3rd parameter to the sqlite3_result_text* interfaces -** is non-negative, then as many bytes (not characters) of the text -** pointed to by the 2nd parameter are taken as the application-defined -** function result. -** ^If the 4th parameter to the sqlite3_result_text* interfaces -** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that -** function as the destructor on the text or BLOB result when it has -** finished using that result. -** ^If the 4th parameter to the sqlite3_result_text* interfaces or to -** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite -** assumes that the text or BLOB result is in constant space and does not -** copy the content of the parameter nor call a destructor on the content -** when it has finished using that result. -** ^If the 4th parameter to the sqlite3_result_text* interfaces -** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT -** then SQLite makes a copy of the result into space obtained from -** from [sqlite3_malloc()] before it returns. -** -** ^The sqlite3_result_value() interface sets the result of -** the application-defined function to be a copy the -** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The -** sqlite3_result_value() interface makes a copy of the [sqlite3_value] -** so that the [sqlite3_value] specified in the parameter may change or -** be deallocated after sqlite3_result_value() returns without harm. -** ^A [protected sqlite3_value] object may always be used where an -** [unprotected sqlite3_value] object is required, so either -** kind of [sqlite3_value] object can be used with this interface. -** -** If these routines are called from within the different thread -** than the one containing the application-defined function that received -** the [sqlite3_context] pointer, the results are undefined. -*/ -SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_double(sqlite3_context*, double); -SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); -SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); -SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); -SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); -SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); -SQLITE_API void sqlite3_result_int(sqlite3_context*, int); -SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); -SQLITE_API void sqlite3_result_null(sqlite3_context*); -SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); -SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); -SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); -SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); -SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); - -/* -** CAPI3REF: Define New Collating Sequences -** -** ^These functions add, remove, or modify a [collation] associated -** with the [database connection] specified as the first argument. -** -** ^The name of the collation is a UTF-8 string -** for sqlite3_create_collation() and sqlite3_create_collation_v2() -** and a UTF-16 string in native byte order for sqlite3_create_collation16(). -** ^Collation names that compare equal according to [sqlite3_strnicmp()] are -** considered to be the same name. -** -** ^(The third argument (eTextRep) must be one of the constants: -**
    -**
  • [SQLITE_UTF8], -**
  • [SQLITE_UTF16LE], -**
  • [SQLITE_UTF16BE], -**
  • [SQLITE_UTF16], or -**
  • [SQLITE_UTF16_ALIGNED]. -**
)^ -** ^The eTextRep argument determines the encoding of strings passed -** to the collating function callback, xCallback. -** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep -** force strings to be UTF16 with native byte order. -** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin -** on an even byte address. -** -** ^The fourth argument, pArg, is a application data pointer that is passed -** through as the first argument to the collating function callback. -** -** ^The fifth argument, xCallback, is a pointer to the collating function. -** ^Multiple collating functions can be registered using the same name but -** with different eTextRep parameters and SQLite will use whichever -** function requires the least amount of data transformation. -** ^If the xCallback argument is NULL then the collating function is -** deleted. ^When all collating functions having the same name are deleted, -** that collation is no longer usable. -** -** ^The collating function callback is invoked with a copy of the pArg -** application data pointer and with two strings in the encoding specified -** by the eTextRep argument. The collating function must return an -** integer that is negative, zero, or positive -** if the first string is less than, equal to, or greater than the second, -** respectively. A collating function must alway return the same answer -** given the same inputs. If two or more collating functions are registered -** to the same collation name (using different eTextRep values) then all -** must give an equivalent answer when invoked with equivalent strings. -** The collating function must obey the following properties for all -** strings A, B, and C: -** -**
    -**
  1. If A==B then B==A. -**
  2. If A==B and B==C then A==C. -**
  3. If A<B THEN B>A. -**
  4. If A<B and B<C then A<C. -**
-** -** If a collating function fails any of the above constraints and that -** collating function is registered and used, then the behavior of SQLite -** is undefined. -** -** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() -** with the addition that the xDestroy callback is invoked on pArg when -** the collating function is deleted. -** ^Collating functions are deleted when they are overridden by later -** calls to the collation creation functions or when the -** [database connection] is closed using [sqlite3_close()]. -** -** ^The xDestroy callback is not called if the -** sqlite3_create_collation_v2() function fails. Applications that invoke -** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should -** check the return code and dispose of the application data pointer -** themselves rather than expecting SQLite to deal with it for them. -** This is different from every other SQLite interface. The inconsistency -** is unfortunate but cannot be changed without breaking backwards -** compatibility. -** -** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. -*/ -SQLITE_API int sqlite3_create_collation( - sqlite3*, - const char *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*) -); -SQLITE_API int sqlite3_create_collation_v2( - sqlite3*, - const char *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*), - void(*xDestroy)(void*) -); -SQLITE_API int sqlite3_create_collation16( - sqlite3*, - const void *zName, - int eTextRep, - void *pArg, - int(*xCompare)(void*,int,const void*,int,const void*) -); - -/* -** CAPI3REF: Collation Needed Callbacks -** -** ^To avoid having to register all collation sequences before a database -** can be used, a single callback function may be registered with the -** [database connection] to be invoked whenever an undefined collation -** sequence is required. -** -** ^If the function is registered using the sqlite3_collation_needed() API, -** then it is passed the names of undefined collation sequences as strings -** encoded in UTF-8. ^If sqlite3_collation_needed16() is used, -** the names are passed as UTF-16 in machine native byte order. -** ^A call to either function replaces the existing collation-needed callback. -** -** ^(When the callback is invoked, the first argument passed is a copy -** of the second argument to sqlite3_collation_needed() or -** sqlite3_collation_needed16(). The second argument is the database -** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], -** or [SQLITE_UTF16LE], indicating the most desirable form of the collation -** sequence function required. The fourth parameter is the name of the -** required collation sequence.)^ -** -** The callback function should register the desired collation using -** [sqlite3_create_collation()], [sqlite3_create_collation16()], or -** [sqlite3_create_collation_v2()]. -*/ -SQLITE_API int sqlite3_collation_needed( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const char*) -); -SQLITE_API int sqlite3_collation_needed16( - sqlite3*, - void*, - void(*)(void*,sqlite3*,int eTextRep,const void*) -); - -#ifdef SQLITE_HAS_CODEC -/* -** Specify the key for an encrypted database. This routine should be -** called right after sqlite3_open(). -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -SQLITE_API int sqlite3_key( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The key */ -); - -/* -** Change the key on an open database. If the current database is not -** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the -** database is decrypted. -** -** The code to implement this API is not available in the public release -** of SQLite. -*/ -SQLITE_API int sqlite3_rekey( - sqlite3 *db, /* Database to be rekeyed */ - const void *pKey, int nKey /* The new key */ -); - -/* -** Specify the activation key for a SEE database. Unless -** activated, none of the SEE routines will work. -*/ -SQLITE_API void sqlite3_activate_see( - const char *zPassPhrase /* Activation phrase */ -); -#endif - -#ifdef SQLITE_ENABLE_CEROD -/* -** Specify the activation key for a CEROD database. Unless -** activated, none of the CEROD routines will work. -*/ -SQLITE_API void sqlite3_activate_cerod( - const char *zPassPhrase /* Activation phrase */ -); -#endif - -/* -** CAPI3REF: Suspend Execution For A Short Time -** -** The sqlite3_sleep() function causes the current thread to suspend execution -** for at least a number of milliseconds specified in its parameter. -** -** If the operating system does not support sleep requests with -** millisecond time resolution, then the time will be rounded up to -** the nearest second. The number of milliseconds of sleep actually -** requested from the operating system is returned. -** -** ^SQLite implements this interface by calling the xSleep() -** method of the default [sqlite3_vfs] object. If the xSleep() method -** of the default VFS is not implemented correctly, or not implemented at -** all, then the behavior of sqlite3_sleep() may deviate from the description -** in the previous paragraphs. -*/ -SQLITE_API int sqlite3_sleep(int); - -/* -** CAPI3REF: Name Of The Folder Holding Temporary Files -** -** ^(If this global variable is made to point to a string which is -** the name of a folder (a.k.a. directory), then all temporary files -** created by SQLite when using a built-in [sqlite3_vfs | VFS] -** will be placed in that directory.)^ ^If this variable -** is a NULL pointer, then SQLite performs a search for an appropriate -** temporary file directory. -** -** It is not safe to read or modify this variable in more than one -** thread at a time. It is not safe to read or modify this variable -** if a [database connection] is being used at the same time in a separate -** thread. -** It is intended that this variable be set once -** as part of process initialization and before any SQLite interface -** routines have been called and that this variable remain unchanged -** thereafter. -** -** ^The [temp_store_directory pragma] may modify this variable and cause -** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, -** the [temp_store_directory pragma] always assumes that any string -** that this variable points to is held in memory obtained from -** [sqlite3_malloc] and the pragma may attempt to free that memory -** using [sqlite3_free]. -** Hence, if this variable is modified directly, either it should be -** made NULL or made to point to memory obtained from [sqlite3_malloc] -** or else the use of the [temp_store_directory pragma] should be avoided. -*/ -SQLITE_API char *sqlite3_temp_directory; - -/* -** CAPI3REF: Test For Auto-Commit Mode -** KEYWORDS: {autocommit mode} -** -** ^The sqlite3_get_autocommit() interface returns non-zero or -** zero if the given database connection is or is not in autocommit mode, -** respectively. ^Autocommit mode is on by default. -** ^Autocommit mode is disabled by a [BEGIN] statement. -** ^Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. -** -** If certain kinds of errors occur on a statement within a multi-statement -** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], -** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the -** transaction might be rolled back automatically. The only way to -** find out whether SQLite automatically rolled back the transaction after -** an error is to use this function. -** -** If another thread changes the autocommit status of the database -** connection while this routine is running, then the return value -** is undefined. -*/ -SQLITE_API int sqlite3_get_autocommit(sqlite3*); - -/* -** CAPI3REF: Find The Database Handle Of A Prepared Statement -** -** ^The sqlite3_db_handle interface returns the [database connection] handle -** to which a [prepared statement] belongs. ^The [database connection] -** returned by sqlite3_db_handle is the same [database connection] -** that was the first argument -** to the [sqlite3_prepare_v2()] call (or its variants) that was used to -** create the statement in the first place. -*/ -SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); - -/* -** CAPI3REF: Find the next prepared statement -** -** ^This interface returns a pointer to the next [prepared statement] after -** pStmt associated with the [database connection] pDb. ^If pStmt is NULL -** then this interface returns a pointer to the first prepared statement -** associated with the database connection pDb. ^If no prepared statement -** satisfies the conditions of this routine, it returns NULL. -** -** The [database connection] pointer D in a call to -** [sqlite3_next_stmt(D,S)] must refer to an open database -** connection and in particular must not be a NULL pointer. -*/ -SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); - -/* -** CAPI3REF: Commit And Rollback Notification Callbacks -** -** ^The sqlite3_commit_hook() interface registers a callback -** function to be invoked whenever a transaction is [COMMIT | committed]. -** ^Any callback set by a previous call to sqlite3_commit_hook() -** for the same database connection is overridden. -** ^The sqlite3_rollback_hook() interface registers a callback -** function to be invoked whenever a transaction is [ROLLBACK | rolled back]. -** ^Any callback set by a previous call to sqlite3_rollback_hook() -** for the same database connection is overridden. -** ^The pArg argument is passed through to the callback. -** ^If the callback on a commit hook function returns non-zero, -** then the commit is converted into a rollback. -** -** ^The sqlite3_commit_hook(D,C,P) and sqlite3_rollback_hook(D,C,P) functions -** return the P argument from the previous call of the same function -** on the same [database connection] D, or NULL for -** the first call for each function on D. -** -** The callback implementation must not do anything that will modify -** the database connection that invoked the callback. Any actions -** to modify the database connection must be deferred until after the -** completion of the [sqlite3_step()] call that triggered the commit -** or rollback hook in the first place. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -** ^Registering a NULL function disables the callback. -** -** ^When the commit hook callback routine returns zero, the [COMMIT] -** operation is allowed to continue normally. ^If the commit hook -** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. -** ^The rollback hook is invoked on a rollback that results from a commit -** hook returning non-zero, just as it would be with any other rollback. -** -** ^For the purposes of this API, a transaction is said to have been -** rolled back if an explicit "ROLLBACK" statement is executed, or -** an error or constraint causes an implicit rollback to occur. -** ^The rollback callback is not invoked if a transaction is -** automatically rolled back because the database connection is closed. -** -** See also the [sqlite3_update_hook()] interface. -*/ -SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); -SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); - -/* -** CAPI3REF: Data Change Notification Callbacks -** -** ^The sqlite3_update_hook() interface registers a callback function -** with the [database connection] identified by the first argument -** to be invoked whenever a row is updated, inserted or deleted. -** ^Any callback set by a previous call to this function -** for the same database connection is overridden. -** -** ^The second argument is a pointer to the function to invoke when a -** row is updated, inserted or deleted. -** ^The first argument to the callback is a copy of the third argument -** to sqlite3_update_hook(). -** ^The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], -** or [SQLITE_UPDATE], depending on the operation that caused the callback -** to be invoked. -** ^The third and fourth arguments to the callback contain pointers to the -** database and table name containing the affected row. -** ^The final callback parameter is the [rowid] of the row. -** ^In the case of an update, this is the [rowid] after the update takes place. -** -** ^(The update hook is not invoked when internal system tables are -** modified (i.e. sqlite_master and sqlite_sequence).)^ -** -** ^In the current implementation, the update hook -** is not invoked when duplication rows are deleted because of an -** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook -** invoked when rows are deleted using the [truncate optimization]. -** The exceptions defined in this paragraph might change in a future -** release of SQLite. -** -** The update hook implementation must not do anything that will modify -** the database connection that invoked the update hook. Any actions -** to modify the database connection must be deferred until after the -** completion of the [sqlite3_step()] call that triggered the update hook. -** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their -** database connections for the meaning of "modify" in this paragraph. -** -** ^The sqlite3_update_hook(D,C,P) function -** returns the P argument from the previous call -** on the same [database connection] D, or NULL for -** the first call on D. -** -** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()] -** interfaces. -*/ -SQLITE_API void *sqlite3_update_hook( - sqlite3*, - void(*)(void *,int ,char const *,char const *,sqlite3_int64), - void* -); - -/* -** CAPI3REF: Enable Or Disable Shared Pager Cache -** KEYWORDS: {shared cache} -** -** ^(This routine enables or disables the sharing of the database cache -** and schema data structures between [database connection | connections] -** to the same database. Sharing is enabled if the argument is true -** and disabled if the argument is false.)^ -** -** ^Cache sharing is enabled and disabled for an entire process. -** This is a change as of SQLite version 3.5.0. In prior versions of SQLite, -** sharing was enabled or disabled for each thread separately. -** -** ^(The cache sharing mode set by this interface effects all subsequent -** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. -** Existing database connections continue use the sharing mode -** that was in effect at the time they were opened.)^ -** -** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled -** successfully. An [error code] is returned otherwise.)^ -** -** ^Shared cache is disabled by default. But this might change in -** future releases of SQLite. Applications that care about shared -** cache setting should set it explicitly. -** -** See Also: [SQLite Shared-Cache Mode] -*/ -SQLITE_API int sqlite3_enable_shared_cache(int); - -/* -** CAPI3REF: Attempt To Free Heap Memory -** -** ^The sqlite3_release_memory() interface attempts to free N bytes -** of heap memory by deallocating non-essential memory allocations -** held by the database library. Memory used to cache database -** pages to improve performance is an example of non-essential memory. -** ^sqlite3_release_memory() returns the number of bytes actually freed, -** which might be more or less than the amount requested. -** ^The sqlite3_release_memory() routine is a no-op returning zero -** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. -*/ -SQLITE_API int sqlite3_release_memory(int); - -/* -** CAPI3REF: Impose A Limit On Heap Size -** -** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the -** soft limit on the amount of heap memory that may be allocated by SQLite. -** ^SQLite strives to keep heap memory utilization below the soft heap -** limit by reducing the number of pages held in the page cache -** as heap memory usages approaches the limit. -** ^The soft heap limit is "soft" because even though SQLite strives to stay -** below the limit, it will exceed the limit rather than generate -** an [SQLITE_NOMEM] error. In other words, the soft heap limit -** is advisory only. -** -** ^The return value from sqlite3_soft_heap_limit64() is the size of -** the soft heap limit prior to the call. ^If the argument N is negative -** then no change is made to the soft heap limit. Hence, the current -** size of the soft heap limit can be determined by invoking -** sqlite3_soft_heap_limit64() with a negative argument. -** -** ^If the argument N is zero then the soft heap limit is disabled. -** -** ^(The soft heap limit is not enforced in the current implementation -** if one or more of following conditions are true: -** -**
    -**
  • The soft heap limit is set to zero. -**
  • Memory accounting is disabled using a combination of the -** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and -** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. -**
  • An alternative page cache implementation is specifed using -** [sqlite3_config]([SQLITE_CONFIG_PCACHE],...). -**
  • The page cache allocates from its own memory pool supplied -** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than -** from the heap. -**
)^ -** -** Beginning with SQLite version 3.7.3, the soft heap limit is enforced -** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] -** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], -** the soft heap limit is enforced on every memory allocation. Without -** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced -** when memory is allocated by the page cache. Testing suggests that because -** the page cache is the predominate memory user in SQLite, most -** applications will achieve adequate soft heap limit enforcement without -** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. -** -** The circumstances under which SQLite will enforce the soft heap limit may -** changes in future releases of SQLite. -*/ -SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); - -/* -** CAPI3REF: Deprecated Soft Heap Limit Interface -** DEPRECATED -** -** This is a deprecated version of the [sqlite3_soft_heap_limit64()] -** interface. This routine is provided for historical compatibility -** only. All new applications should use the -** [sqlite3_soft_heap_limit64()] interface rather than this one. -*/ -SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); - - -/* -** CAPI3REF: Extract Metadata About A Column Of A Table -** -** ^This routine returns metadata about a specific column of a specific -** database table accessible using the [database connection] handle -** passed as the first function argument. -** -** ^The column is identified by the second, third and fourth parameters to -** this function. ^The second parameter is either the name of the database -** (i.e. "main", "temp", or an attached database) containing the specified -** table or NULL. ^If it is NULL, then all attached databases are searched -** for the table using the same algorithm used by the database engine to -** resolve unqualified table references. -** -** ^The third and fourth parameters to this function are the table and column -** name of the desired column, respectively. Neither of these parameters -** may be NULL. -** -** ^Metadata is returned by writing to the memory locations passed as the 5th -** and subsequent parameters to this function. ^Any of these arguments may be -** NULL, in which case the corresponding element of metadata is omitted. -** -** ^(
-** -**
Parameter Output
Type
Description -** -**
5th const char* Data type -**
6th const char* Name of default collation sequence -**
7th int True if column has a NOT NULL constraint -**
8th int True if column is part of the PRIMARY KEY -**
9th int True if column is [AUTOINCREMENT] -**
-**
)^ -** -** ^The memory pointed to by the character pointers returned for the -** declaration type and collation sequence is valid only until the next -** call to any SQLite API function. -** -** ^If the specified table is actually a view, an [error code] is returned. -** -** ^If the specified column is "rowid", "oid" or "_rowid_" and an -** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output -** parameters are set for the explicitly declared column. ^(If there is no -** explicitly declared [INTEGER PRIMARY KEY] column, then the output -** parameters are set as follows: -** -**
-**     data type: "INTEGER"
-**     collation sequence: "BINARY"
-**     not null: 0
-**     primary key: 1
-**     auto increment: 0
-** 
)^ -** -** ^(This function may load one or more schemas from database files. If an -** error occurs during this process, or if the requested table or column -** cannot be found, an [error code] is returned and an error message left -** in the [database connection] (to be retrieved using sqlite3_errmsg()).)^ -** -** ^This API is only available if the library was compiled with the -** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined. -*/ -SQLITE_API int sqlite3_table_column_metadata( - sqlite3 *db, /* Connection handle */ - const char *zDbName, /* Database name or NULL */ - const char *zTableName, /* Table name */ - const char *zColumnName, /* Column name */ - char const **pzDataType, /* OUTPUT: Declared data type */ - char const **pzCollSeq, /* OUTPUT: Collation sequence name */ - int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ - int *pPrimaryKey, /* OUTPUT: True if column part of PK */ - int *pAutoinc /* OUTPUT: True if column is auto-increment */ -); - -/* -** CAPI3REF: Load An Extension -** -** ^This interface loads an SQLite extension library from the named file. -** -** ^The sqlite3_load_extension() interface attempts to load an -** SQLite extension library contained in the file zFile. -** -** ^The entry point is zProc. -** ^zProc may be 0, in which case the name of the entry point -** defaults to "sqlite3_extension_init". -** ^The sqlite3_load_extension() interface returns -** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. -** ^If an error occurs and pzErrMsg is not 0, then the -** [sqlite3_load_extension()] interface shall attempt to -** fill *pzErrMsg with error message text stored in memory -** obtained from [sqlite3_malloc()]. The calling function -** should free this memory by calling [sqlite3_free()]. -** -** ^Extension loading must be enabled using -** [sqlite3_enable_load_extension()] prior to calling this API, -** otherwise an error will be returned. -** -** See also the [load_extension() SQL function]. -*/ -SQLITE_API int sqlite3_load_extension( - sqlite3 *db, /* Load the extension into this database connection */ - const char *zFile, /* Name of the shared library containing extension */ - const char *zProc, /* Entry point. Derived from zFile if 0 */ - char **pzErrMsg /* Put error message here if not 0 */ -); - -/* -** CAPI3REF: Enable Or Disable Extension Loading -** -** ^So as not to open security holes in older applications that are -** unprepared to deal with extension loading, and as a means of disabling -** extension loading while evaluating user-entered SQL, the following API -** is provided to turn the [sqlite3_load_extension()] mechanism on and off. -** -** ^Extension loading is off by default. See ticket #1863. -** ^Call the sqlite3_enable_load_extension() routine with onoff==1 -** to turn extension loading on and call it with onoff==0 to turn -** it back off again. -*/ -SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); - -/* -** CAPI3REF: Automatically Load Statically Linked Extensions -** -** ^This interface causes the xEntryPoint() function to be invoked for -** each new [database connection] that is created. The idea here is that -** xEntryPoint() is the entry point for a statically linked SQLite extension -** that is to be automatically loaded into all new database connections. -** -** ^(Even though the function prototype shows that xEntryPoint() takes -** no arguments and returns void, SQLite invokes xEntryPoint() with three -** arguments and expects and integer result as if the signature of the -** entry point where as follows: -** -**
-**    int xEntryPoint(
-**      sqlite3 *db,
-**      const char **pzErrMsg,
-**      const struct sqlite3_api_routines *pThunk
-**    );
-** 
)^ -** -** If the xEntryPoint routine encounters an error, it should make *pzErrMsg -** point to an appropriate error message (obtained from [sqlite3_mprintf()]) -** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg -** is NULL before calling the xEntryPoint(). ^SQLite will invoke -** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any -** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()], -** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail. -** -** ^Calling sqlite3_auto_extension(X) with an entry point X that is already -** on the list of automatic extensions is a harmless no-op. ^No entry point -** will be called more than once for each database connection that is opened. -** -** See also: [sqlite3_reset_auto_extension()]. -*/ -SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); - -/* -** CAPI3REF: Reset Automatic Extension Loading -** -** ^This interface disables all automatic extensions previously -** registered using [sqlite3_auto_extension()]. -*/ -SQLITE_API void sqlite3_reset_auto_extension(void); - -/* -** The interface to the virtual-table mechanism is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stabilizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -*/ - -/* -** Structures used by the virtual table interface -*/ -typedef struct sqlite3_vtab sqlite3_vtab; -typedef struct sqlite3_index_info sqlite3_index_info; -typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; -typedef struct sqlite3_module sqlite3_module; - -/* -** CAPI3REF: Virtual Table Object -** KEYWORDS: sqlite3_module {virtual table module} -** -** This structure, sometimes called a a "virtual table module", -** defines the implementation of a [virtual tables]. -** This structure consists mostly of methods for the module. -** -** ^A virtual table module is created by filling in a persistent -** instance of this structure and passing a pointer to that instance -** to [sqlite3_create_module()] or [sqlite3_create_module_v2()]. -** ^The registration remains valid until it is replaced by a different -** module or until the [database connection] closes. The content -** of this structure must not change while it is registered with -** any database connection. -*/ -struct sqlite3_module { - int iVersion; - int (*xCreate)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xConnect)(sqlite3*, void *pAux, - int argc, const char *const*argv, - sqlite3_vtab **ppVTab, char**); - int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); - int (*xDisconnect)(sqlite3_vtab *pVTab); - int (*xDestroy)(sqlite3_vtab *pVTab); - int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); - int (*xClose)(sqlite3_vtab_cursor*); - int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, - int argc, sqlite3_value **argv); - int (*xNext)(sqlite3_vtab_cursor*); - int (*xEof)(sqlite3_vtab_cursor*); - int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); - int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); - int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); - int (*xBegin)(sqlite3_vtab *pVTab); - int (*xSync)(sqlite3_vtab *pVTab); - int (*xCommit)(sqlite3_vtab *pVTab); - int (*xRollback)(sqlite3_vtab *pVTab); - int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, - void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), - void **ppArg); - int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); -}; - -/* -** CAPI3REF: Virtual Table Indexing Information -** KEYWORDS: sqlite3_index_info -** -** The sqlite3_index_info structure and its substructures is used as part -** of the [virtual table] interface to -** pass information into and receive the reply from the [xBestIndex] -** method of a [virtual table module]. The fields under **Inputs** are the -** inputs to xBestIndex and are read-only. xBestIndex inserts its -** results into the **Outputs** fields. -** -** ^(The aConstraint[] array records WHERE clause constraints of the form: -** -**
column OP expr
-** -** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is -** stored in aConstraint[].op using one of the -** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^ -** ^(The index of the column is stored in -** aConstraint[].iColumn.)^ ^(aConstraint[].usable is TRUE if the -** expr on the right-hand side can be evaluated (and thus the constraint -** is usable) and false if it cannot.)^ -** -** ^The optimizer automatically inverts terms of the form "expr OP column" -** and makes other simplifications to the WHERE clause in an attempt to -** get as many WHERE clause terms into the form shown above as possible. -** ^The aConstraint[] array only reports WHERE clause terms that are -** relevant to the particular virtual table being queried. -** -** ^Information about the ORDER BY clause is stored in aOrderBy[]. -** ^Each term of aOrderBy records a column of the ORDER BY clause. -** -** The [xBestIndex] method must fill aConstraintUsage[] with information -** about what parameters to pass to xFilter. ^If argvIndex>0 then -** the right-hand side of the corresponding aConstraint[] is evaluated -** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit -** is true, then the constraint is assumed to be fully handled by the -** virtual table and is not checked again by SQLite.)^ -** -** ^The idxNum and idxPtr values are recorded and passed into the -** [xFilter] method. -** ^[sqlite3_free()] is used to free idxPtr if and only if -** needToFreeIdxPtr is true. -** -** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in -** the correct order to satisfy the ORDER BY clause so that no separate -** sorting step is required. -** -** ^The estimatedCost value is an estimate of the cost of doing the -** particular lookup. A full scan of a table with N entries should have -** a cost of N. A binary search of a table of N entries should have a -** cost of approximately log(N). -*/ -struct sqlite3_index_info { - /* Inputs */ - int nConstraint; /* Number of entries in aConstraint */ - struct sqlite3_index_constraint { - int iColumn; /* Column on left-hand side of constraint */ - unsigned char op; /* Constraint operator */ - unsigned char usable; /* True if this constraint is usable */ - int iTermOffset; /* Used internally - xBestIndex should ignore */ - } *aConstraint; /* Table of WHERE clause constraints */ - int nOrderBy; /* Number of terms in the ORDER BY clause */ - struct sqlite3_index_orderby { - int iColumn; /* Column number */ - unsigned char desc; /* True for DESC. False for ASC. */ - } *aOrderBy; /* The ORDER BY clause */ - /* Outputs */ - struct sqlite3_index_constraint_usage { - int argvIndex; /* if >0, constraint is part of argv to xFilter */ - unsigned char omit; /* Do not code a test for this constraint */ - } *aConstraintUsage; - int idxNum; /* Number used to identify the index */ - char *idxStr; /* String, possibly obtained from sqlite3_malloc */ - int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ - int orderByConsumed; /* True if output is already ordered */ - double estimatedCost; /* Estimated cost of using this index */ -}; - -/* -** CAPI3REF: Virtual Table Constraint Operator Codes -** -** These macros defined the allowed values for the -** [sqlite3_index_info].aConstraint[].op field. Each value represents -** an operator that is part of a constraint term in the wHERE clause of -** a query that uses a [virtual table]. -*/ -#define SQLITE_INDEX_CONSTRAINT_EQ 2 -#define SQLITE_INDEX_CONSTRAINT_GT 4 -#define SQLITE_INDEX_CONSTRAINT_LE 8 -#define SQLITE_INDEX_CONSTRAINT_LT 16 -#define SQLITE_INDEX_CONSTRAINT_GE 32 -#define SQLITE_INDEX_CONSTRAINT_MATCH 64 - -/* -** CAPI3REF: Register A Virtual Table Implementation -** -** ^These routines are used to register a new [virtual table module] name. -** ^Module names must be registered before -** creating a new [virtual table] using the module and before using a -** preexisting [virtual table] for the module. -** -** ^The module name is registered on the [database connection] specified -** by the first parameter. ^The name of the module is given by the -** second parameter. ^The third parameter is a pointer to -** the implementation of the [virtual table module]. ^The fourth -** parameter is an arbitrary client data pointer that is passed through -** into the [xCreate] and [xConnect] methods of the virtual table module -** when a new virtual table is be being created or reinitialized. -** -** ^The sqlite3_create_module_v2() interface has a fifth parameter which -** is a pointer to a destructor for the pClientData. ^SQLite will -** invoke the destructor function (if it is not NULL) when SQLite -** no longer needs the pClientData pointer. ^The destructor will also -** be invoked if the call to sqlite3_create_module_v2() fails. -** ^The sqlite3_create_module() -** interface is equivalent to sqlite3_create_module_v2() with a NULL -** destructor. -*/ -SQLITE_API int sqlite3_create_module( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *p, /* Methods for the module */ - void *pClientData /* Client data for xCreate/xConnect */ -); -SQLITE_API int sqlite3_create_module_v2( - sqlite3 *db, /* SQLite connection to register module with */ - const char *zName, /* Name of the module */ - const sqlite3_module *p, /* Methods for the module */ - void *pClientData, /* Client data for xCreate/xConnect */ - void(*xDestroy)(void*) /* Module destructor function */ -); - -/* -** CAPI3REF: Virtual Table Instance Object -** KEYWORDS: sqlite3_vtab -** -** Every [virtual table module] implementation uses a subclass -** of this object to describe a particular instance -** of the [virtual table]. Each subclass will -** be tailored to the specific needs of the module implementation. -** The purpose of this superclass is to define certain fields that are -** common to all module implementations. -** -** ^Virtual tables methods can set an error message by assigning a -** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should -** take care that any prior string is freed by a call to [sqlite3_free()] -** prior to assigning a new string to zErrMsg. ^After the error message -** is delivered up to the client application, the string will be automatically -** freed by sqlite3_free() and the zErrMsg field will be zeroed. -*/ -struct sqlite3_vtab { - const sqlite3_module *pModule; /* The module for this virtual table */ - int nRef; /* NO LONGER USED */ - char *zErrMsg; /* Error message from sqlite3_mprintf() */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* -** CAPI3REF: Virtual Table Cursor Object -** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} -** -** Every [virtual table module] implementation uses a subclass of the -** following structure to describe cursors that point into the -** [virtual table] and are used -** to loop through the virtual table. Cursors are created using the -** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed -** by the [sqlite3_module.xClose | xClose] method. Cursors are used -** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods -** of the module. Each module implementation will define -** the content of a cursor structure to suit its own needs. -** -** This superclass exists in order to define fields of the cursor that -** are common to all implementations. -*/ -struct sqlite3_vtab_cursor { - sqlite3_vtab *pVtab; /* Virtual table of this cursor */ - /* Virtual table implementations will typically add additional fields */ -}; - -/* -** CAPI3REF: Declare The Schema Of A Virtual Table -** -** ^The [xCreate] and [xConnect] methods of a -** [virtual table module] call this interface -** to declare the format (the names and datatypes of the columns) of -** the virtual tables they implement. -*/ -SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); - -/* -** CAPI3REF: Overload A Function For A Virtual Table -** -** ^(Virtual tables can provide alternative implementations of functions -** using the [xFindFunction] method of the [virtual table module]. -** But global versions of those functions -** must exist in order to be overloaded.)^ -** -** ^(This API makes sure a global version of a function with a particular -** name and number of parameters exists. If no such function exists -** before this API is called, a new function is created.)^ ^The implementation -** of the new function always causes an exception to be thrown. So -** the new function is not good for anything by itself. Its only -** purpose is to be a placeholder function that can be overloaded -** by a [virtual table]. -*/ -SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); - -/* -** The interface to the virtual-table mechanism defined above (back up -** to a comment remarkably similar to this one) is currently considered -** to be experimental. The interface might change in incompatible ways. -** If this is a problem for you, do not use the interface at this time. -** -** When the virtual-table mechanism stabilizes, we will declare the -** interface fixed, support it indefinitely, and remove this comment. -*/ - -/* -** CAPI3REF: A Handle To An Open BLOB -** KEYWORDS: {BLOB handle} {BLOB handles} -** -** An instance of this object represents an open BLOB on which -** [sqlite3_blob_open | incremental BLOB I/O] can be performed. -** ^Objects of this type are created by [sqlite3_blob_open()] -** and destroyed by [sqlite3_blob_close()]. -** ^The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces -** can be used to read or write small subsections of the BLOB. -** ^The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. -*/ -typedef struct sqlite3_blob sqlite3_blob; - -/* -** CAPI3REF: Open A BLOB For Incremental I/O -** -** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located -** in row iRow, column zColumn, table zTable in database zDb; -** in other words, the same BLOB that would be selected by: -** -**
-**     SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
-** 
)^ -** -** ^If the flags parameter is non-zero, then the BLOB is opened for read -** and write access. ^If it is zero, the BLOB is opened for read access. -** ^It is not possible to open a column that is part of an index or primary -** key for writing. ^If [foreign key constraints] are enabled, it is -** not possible to open a column that is part of a [child key] for writing. -** -** ^Note that the database name is not the filename that contains -** the database but rather the symbolic name of the database that -** appears after the AS keyword when the database is connected using [ATTACH]. -** ^For the main database file, the database name is "main". -** ^For TEMP tables, the database name is "temp". -** -** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is written -** to *ppBlob. Otherwise an [error code] is returned and *ppBlob is set -** to be a null pointer.)^ -** ^This function sets the [database connection] error code and message -** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()] and related -** functions. ^Note that the *ppBlob variable is always initialized in a -** way that makes it safe to invoke [sqlite3_blob_close()] on *ppBlob -** regardless of the success or failure of this routine. -** -** ^(If the row that a BLOB handle points to is modified by an -** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects -** then the BLOB handle is marked as "expired". -** This is true if any column of the row is changed, even a column -** other than the one the BLOB handle is open on.)^ -** ^Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for -** a expired BLOB handle fail with an return code of [SQLITE_ABORT]. -** ^(Changes written into a BLOB prior to the BLOB expiring are not -** rolled back by the expiration of the BLOB. Such changes will eventually -** commit if the transaction continues to completion.)^ -** -** ^Use the [sqlite3_blob_bytes()] interface to determine the size of -** the opened blob. ^The size of a blob may not be changed by this -** interface. Use the [UPDATE] SQL command to change the size of a -** blob. -** -** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces -** and the built-in [zeroblob] SQL function can be used, if desired, -** to create an empty, zero-filled blob in which to read or write using -** this interface. -** -** To avoid a resource leak, every open [BLOB handle] should eventually -** be released by a call to [sqlite3_blob_close()]. -*/ -SQLITE_API int sqlite3_blob_open( - sqlite3*, - const char *zDb, - const char *zTable, - const char *zColumn, - sqlite3_int64 iRow, - int flags, - sqlite3_blob **ppBlob -); - -/* -** CAPI3REF: Move a BLOB Handle to a New Row -** -** ^This function is used to move an existing blob handle so that it points -** to a different row of the same database table. ^The new row is identified -** by the rowid value passed as the second argument. Only the row can be -** changed. ^The database, table and column on which the blob handle is open -** remain the same. Moving an existing blob handle to a new row can be -** faster than closing the existing handle and opening a new one. -** -** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - -** it must exist and there must be either a blob or text value stored in -** the nominated column.)^ ^If the new row is not present in the table, or if -** it does not contain a blob or text value, or if another error occurs, an -** SQLite error code is returned and the blob handle is considered aborted. -** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or -** [sqlite3_blob_reopen()] on an aborted blob handle immediately return -** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle -** always returns zero. -** -** ^This function sets the database handle error code and message. -*/ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); - -/* -** CAPI3REF: Close A BLOB Handle -** -** ^Closes an open [BLOB handle]. -** -** ^Closing a BLOB shall cause the current transaction to commit -** if there are no other BLOBs, no pending prepared statements, and the -** database connection is in [autocommit mode]. -** ^If any writes were made to the BLOB, they might be held in cache -** until the close operation if they will fit. -** -** ^(Closing the BLOB often forces the changes -** out to disk and so if any I/O errors occur, they will likely occur -** at the time when the BLOB is closed. Any errors that occur during -** closing are reported as a non-zero return value.)^ -** -** ^(The BLOB is closed unconditionally. Even if this routine returns -** an error code, the BLOB is still closed.)^ -** -** ^Calling this routine with a null pointer (such as would be returned -** by a failed call to [sqlite3_blob_open()]) is a harmless no-op. -*/ -SQLITE_API int sqlite3_blob_close(sqlite3_blob *); - -/* -** CAPI3REF: Return The Size Of An Open BLOB -** -** ^Returns the size in bytes of the BLOB accessible via the -** successfully opened [BLOB handle] in its only argument. ^The -** incremental blob I/O routines can only read or overwriting existing -** blob content; they cannot change the size of a blob. -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -*/ -SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); - -/* -** CAPI3REF: Read Data From A BLOB Incrementally -** -** ^(This function is used to read data from an open [BLOB handle] into a -** caller-supplied buffer. N bytes of data are copied into buffer Z -** from the open BLOB, starting at offset iOffset.)^ -** -** ^If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is read. ^If N or iOffset is -** less than zero, [SQLITE_ERROR] is returned and no data is read. -** ^The size of the blob (and hence the maximum value of N+iOffset) -** can be determined using the [sqlite3_blob_bytes()] interface. -** -** ^An attempt to read from an expired [BLOB handle] fails with an -** error code of [SQLITE_ABORT]. -** -** ^(On success, sqlite3_blob_read() returns SQLITE_OK. -** Otherwise, an [error code] or an [extended error code] is returned.)^ -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -** -** See also: [sqlite3_blob_write()]. -*/ -SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); - -/* -** CAPI3REF: Write Data Into A BLOB Incrementally -** -** ^This function is used to write data into an open [BLOB handle] from a -** caller-supplied buffer. ^N bytes of data are copied from the buffer Z -** into the open BLOB, starting at offset iOffset. -** -** ^If the [BLOB handle] passed as the first argument was not opened for -** writing (the flags parameter to [sqlite3_blob_open()] was zero), -** this function returns [SQLITE_READONLY]. -** -** ^This function may only modify the contents of the BLOB; it is -** not possible to increase the size of a BLOB using this API. -** ^If offset iOffset is less than N bytes from the end of the BLOB, -** [SQLITE_ERROR] is returned and no data is written. ^If N is -** less than zero [SQLITE_ERROR] is returned and no data is written. -** The size of the BLOB (and hence the maximum value of N+iOffset) -** can be determined using the [sqlite3_blob_bytes()] interface. -** -** ^An attempt to write to an expired [BLOB handle] fails with an -** error code of [SQLITE_ABORT]. ^Writes to the BLOB that occurred -** before the [BLOB handle] expired are not rolled back by the -** expiration of the handle, though of course those changes might -** have been overwritten by the statement that expired the BLOB handle -** or by other independent statements. -** -** ^(On success, sqlite3_blob_write() returns SQLITE_OK. -** Otherwise, an [error code] or an [extended error code] is returned.)^ -** -** This routine only works on a [BLOB handle] which has been created -** by a prior successful call to [sqlite3_blob_open()] and which has not -** been closed by [sqlite3_blob_close()]. Passing any other pointer in -** to this routine results in undefined and probably undesirable behavior. -** -** See also: [sqlite3_blob_read()]. -*/ -SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); - -/* -** CAPI3REF: Virtual File System Objects -** -** A virtual filesystem (VFS) is an [sqlite3_vfs] object -** that SQLite uses to interact -** with the underlying operating system. Most SQLite builds come with a -** single default VFS that is appropriate for the host computer. -** New VFSes can be registered and existing VFSes can be unregistered. -** The following interfaces are provided. -** -** ^The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. -** ^Names are case sensitive. -** ^Names are zero-terminated UTF-8 strings. -** ^If there is no match, a NULL pointer is returned. -** ^If zVfsName is NULL then the default VFS is returned. -** -** ^New VFSes are registered with sqlite3_vfs_register(). -** ^Each new VFS becomes the default VFS if the makeDflt flag is set. -** ^The same VFS can be registered multiple times without injury. -** ^To make an existing VFS into the default VFS, register it again -** with the makeDflt flag set. If two different VFSes with the -** same name are registered, the behavior is undefined. If a -** VFS is registered with a name that is NULL or an empty string, -** then the behavior is undefined. -** -** ^Unregister a VFS with the sqlite3_vfs_unregister() interface. -** ^(If the default VFS is unregistered, another VFS is chosen as -** the default. The choice for the new VFS is arbitrary.)^ -*/ -SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); -SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); -SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); - -/* -** CAPI3REF: Mutexes -** -** The SQLite core uses these routines for thread -** synchronization. Though they are intended for internal -** use by SQLite, code that links against SQLite is -** permitted to use any of these routines. -** -** The SQLite source code contains multiple implementations -** of these mutex routines. An appropriate implementation -** is selected automatically at compile-time. ^(The following -** implementations are available in the SQLite core: -** -**
    -**
  • SQLITE_MUTEX_OS2 -**
  • SQLITE_MUTEX_PTHREAD -**
  • SQLITE_MUTEX_W32 -**
  • SQLITE_MUTEX_NOOP -**
)^ -** -** ^The SQLITE_MUTEX_NOOP implementation is a set of routines -** that does no real locking and is appropriate for use in -** a single-threaded application. ^The SQLITE_MUTEX_OS2, -** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations -** are appropriate for use on OS/2, Unix, and Windows. -** -** ^(If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor -** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex -** implementation is included with the library. In this case the -** application must supply a custom mutex implementation using the -** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function -** before calling sqlite3_initialize() or any other public sqlite3_ -** function that calls sqlite3_initialize().)^ -** -** ^The sqlite3_mutex_alloc() routine allocates a new -** mutex and returns a pointer to it. ^If it returns NULL -** that means that a mutex could not be allocated. ^SQLite -** will unwind its stack and return an error. ^(The argument -** to sqlite3_mutex_alloc() is one of these integer constants: -** -**
    -**
  • SQLITE_MUTEX_FAST -**
  • SQLITE_MUTEX_RECURSIVE -**
  • SQLITE_MUTEX_STATIC_MASTER -**
  • SQLITE_MUTEX_STATIC_MEM -**
  • SQLITE_MUTEX_STATIC_MEM2 -**
  • SQLITE_MUTEX_STATIC_PRNG -**
  • SQLITE_MUTEX_STATIC_LRU -**
  • SQLITE_MUTEX_STATIC_LRU2 -**
)^ -** -** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) -** cause sqlite3_mutex_alloc() to create -** a new mutex. ^The new mutex is recursive when SQLITE_MUTEX_RECURSIVE -** is used but not necessarily so when SQLITE_MUTEX_FAST is used. -** The mutex implementation does not need to make a distinction -** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does -** not want to. ^SQLite will only request a recursive mutex in -** cases where it really needs one. ^If a faster non-recursive mutex -** implementation is available on the host platform, the mutex subsystem -** might return such a mutex in response to SQLITE_MUTEX_FAST. -** -** ^The other allowed parameters to sqlite3_mutex_alloc() (anything other -** than SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) each return -** a pointer to a static preexisting mutex. ^Six static mutexes are -** used by the current version of SQLite. Future versions of SQLite -** may add additional static mutexes. Static mutexes are for internal -** use by SQLite only. Applications that use SQLite mutexes should -** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or -** SQLITE_MUTEX_RECURSIVE. -** -** ^Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST -** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() -** returns a different mutex on every call. ^But for the static -** mutex types, the same mutex is returned on every call that has -** the same type number. -** -** ^The sqlite3_mutex_free() routine deallocates a previously -** allocated dynamic mutex. ^SQLite is careful to deallocate every -** dynamic mutex that it allocates. The dynamic mutexes must not be in -** use when they are deallocated. Attempting to deallocate a static -** mutex results in undefined behavior. ^SQLite never deallocates -** a static mutex. -** -** ^The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt -** to enter a mutex. ^If another thread is already within the mutex, -** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return -** SQLITE_BUSY. ^The sqlite3_mutex_try() interface returns [SQLITE_OK] -** upon successful entry. ^(Mutexes created using -** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. -** In such cases the, -** mutex must be exited an equal number of times before another thread -** can enter.)^ ^(If the same thread tries to enter any other -** kind of mutex more than once, the behavior is undefined. -** SQLite will never exhibit -** such behavior in its own use of mutexes.)^ -** -** ^(Some systems (for example, Windows 95) do not support the operation -** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() -** will always return SQLITE_BUSY. The SQLite core only ever uses -** sqlite3_mutex_try() as an optimization so this is acceptable behavior.)^ -** -** ^The sqlite3_mutex_leave() routine exits a mutex that was -** previously entered by the same thread. ^(The behavior -** is undefined if the mutex is not currently entered by the -** calling thread or is not currently allocated. SQLite will -** never do either.)^ -** -** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or -** sqlite3_mutex_leave() is a NULL pointer, then all three routines -** behave as no-ops. -** -** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. -*/ -SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); -SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); -SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); -SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); -SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); - -/* -** CAPI3REF: Mutex Methods Object -** -** An instance of this structure defines the low-level routines -** used to allocate and use mutexes. -** -** Usually, the default mutex implementations provided by SQLite are -** sufficient, however the user has the option of substituting a custom -** implementation for specialized deployments or systems for which SQLite -** does not provide a suitable implementation. In this case, the user -** creates and populates an instance of this structure to pass -** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. -** Additionally, an instance of this structure can be used as an -** output variable when querying the system for the current mutex -** implementation, using the [SQLITE_CONFIG_GETMUTEX] option. -** -** ^The xMutexInit method defined by this structure is invoked as -** part of system initialization by the sqlite3_initialize() function. -** ^The xMutexInit routine is called by SQLite exactly once for each -** effective call to [sqlite3_initialize()]. -** -** ^The xMutexEnd method defined by this structure is invoked as -** part of system shutdown by the sqlite3_shutdown() function. The -** implementation of this method is expected to release all outstanding -** resources obtained by the mutex methods implementation, especially -** those obtained by the xMutexInit method. ^The xMutexEnd() -** interface is invoked exactly once for each call to [sqlite3_shutdown()]. -** -** ^(The remaining seven methods defined by this structure (xMutexAlloc, -** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and -** xMutexNotheld) implement the following interfaces (respectively): -** -**
    -**
  • [sqlite3_mutex_alloc()]
  • -**
  • [sqlite3_mutex_free()]
  • -**
  • [sqlite3_mutex_enter()]
  • -**
  • [sqlite3_mutex_try()]
  • -**
  • [sqlite3_mutex_leave()]
  • -**
  • [sqlite3_mutex_held()]
  • -**
  • [sqlite3_mutex_notheld()]
  • -**
)^ -** -** The only difference is that the public sqlite3_XXX functions enumerated -** above silently ignore any invocations that pass a NULL pointer instead -** of a valid mutex handle. The implementations of the methods defined -** by this structure are not required to handle this case, the results -** of passing a NULL pointer instead of a valid mutex handle are undefined -** (i.e. it is acceptable to provide an implementation that segfaults if -** it is passed a NULL pointer). -** -** The xMutexInit() method must be threadsafe. ^It must be harmless to -** invoke xMutexInit() multiple times within the same process and without -** intervening calls to xMutexEnd(). Second and subsequent calls to -** xMutexInit() must be no-ops. -** -** ^xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] -** and its associates). ^Similarly, xMutexAlloc() must not use SQLite memory -** allocation for a static mutex. ^However xMutexAlloc() may use SQLite -** memory allocation for a fast or recursive mutex. -** -** ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is -** called, but only if the prior call to xMutexInit returned SQLITE_OK. -** If xMutexInit fails in any way, it is expected to clean up after itself -** prior to returning. -*/ -typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; -struct sqlite3_mutex_methods { - int (*xMutexInit)(void); - int (*xMutexEnd)(void); - sqlite3_mutex *(*xMutexAlloc)(int); - void (*xMutexFree)(sqlite3_mutex *); - void (*xMutexEnter)(sqlite3_mutex *); - int (*xMutexTry)(sqlite3_mutex *); - void (*xMutexLeave)(sqlite3_mutex *); - int (*xMutexHeld)(sqlite3_mutex *); - int (*xMutexNotheld)(sqlite3_mutex *); -}; - -/* -** CAPI3REF: Mutex Verification Routines -** -** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines -** are intended for use inside assert() statements. ^The SQLite core -** never uses these routines except inside an assert() and applications -** are advised to follow the lead of the core. ^The SQLite core only -** provides implementations for these routines when it is compiled -** with the SQLITE_DEBUG flag. ^External mutex implementations -** are only required to provide these routines if SQLITE_DEBUG is -** defined and if NDEBUG is not defined. -** -** ^These routines should return true if the mutex in their argument -** is held or not held, respectively, by the calling thread. -** -** ^The implementation is not required to provided versions of these -** routines that actually work. If the implementation does not provide working -** versions of these routines, it should at least provide stubs that always -** return true so that one does not get spurious assertion failures. -** -** ^If the argument to sqlite3_mutex_held() is a NULL pointer then -** the routine should return 1. This seems counter-intuitive since -** clearly the mutex cannot be held if it does not exist. But the -** the reason the mutex does not exist is because the build is not -** using mutexes. And we do not want the assert() containing the -** call to sqlite3_mutex_held() to fail, so a non-zero return is -** the appropriate thing to do. ^The sqlite3_mutex_notheld() -** interface should also return 1 when given a NULL pointer. -*/ -#ifndef NDEBUG -SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); -SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); -#endif - -/* -** CAPI3REF: Mutex Types -** -** The [sqlite3_mutex_alloc()] interface takes a single argument -** which is one of these integer constants. -** -** The set of static mutexes may change from one SQLite release to the -** next. Applications that override the built-in mutex logic must be -** prepared to accommodate additional static mutexes. -*/ -#define SQLITE_MUTEX_FAST 0 -#define SQLITE_MUTEX_RECURSIVE 1 -#define SQLITE_MUTEX_STATIC_MASTER 2 -#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ -#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ -#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ -#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ -#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ -#define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ -#define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ - -/* -** CAPI3REF: Retrieve the mutex for a database connection -** -** ^This interface returns a pointer the [sqlite3_mutex] object that -** serializes access to the [database connection] given in the argument -** when the [threading mode] is Serialized. -** ^If the [threading mode] is Single-thread or Multi-thread then this -** routine returns a NULL pointer. -*/ -SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); - -/* -** CAPI3REF: Low-Level Control Of Database Files -** -** ^The [sqlite3_file_control()] interface makes a direct call to the -** xFileControl method for the [sqlite3_io_methods] object associated -** with a particular database identified by the second argument. ^The -** name of the database is "main" for the main database or "temp" for the -** TEMP database, or the name that appears after the AS keyword for -** databases that are added using the [ATTACH] SQL command. -** ^A NULL pointer can be used in place of "main" to refer to the -** main database file. -** ^The third and fourth parameters to this routine -** are passed directly through to the second and third parameters of -** the xFileControl method. ^The return value of the xFileControl -** method becomes the return value of this routine. -** -** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes -** a pointer to the underlying [sqlite3_file] object to be written into -** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER -** case is a short-circuit path which does not actually invoke the -** underlying sqlite3_io_methods.xFileControl method. -** -** ^If the second parameter (zDbName) does not match the name of any -** open database file, then SQLITE_ERROR is returned. ^This error -** code is not remembered and will not be recalled by [sqlite3_errcode()] -** or [sqlite3_errmsg()]. The underlying xFileControl method might -** also return SQLITE_ERROR. There is no way to distinguish between -** an incorrect zDbName and an SQLITE_ERROR return from the underlying -** xFileControl method. -** -** See also: [SQLITE_FCNTL_LOCKSTATE] -*/ -SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); - -/* -** CAPI3REF: Testing Interface -** -** ^The sqlite3_test_control() interface is used to read out internal -** state of SQLite and to inject faults into SQLite for testing -** purposes. ^The first parameter is an operation code that determines -** the number, meaning, and operation of all subsequent parameters. -** -** This interface is not for use by applications. It exists solely -** for verifying the correct operation of the SQLite library. Depending -** on how the SQLite library is compiled, this interface might not exist. -** -** The details of the operation codes, their meanings, the parameters -** they take, and what they do are all subject to change without notice. -** Unlike most of the SQLite API, this function is not guaranteed to -** operate consistently from one release to the next. -*/ -SQLITE_API int sqlite3_test_control(int op, ...); - -/* -** CAPI3REF: Testing Interface Operation Codes -** -** These constants are the valid operation code parameters used -** as the first argument to [sqlite3_test_control()]. -** -** These parameters and their meanings are subject to change -** without notice. These values are for testing purposes only. -** Applications should not use any of these parameters or the -** [sqlite3_test_control()] interface. -*/ -#define SQLITE_TESTCTRL_FIRST 5 -#define SQLITE_TESTCTRL_PRNG_SAVE 5 -#define SQLITE_TESTCTRL_PRNG_RESTORE 6 -#define SQLITE_TESTCTRL_PRNG_RESET 7 -#define SQLITE_TESTCTRL_BITVEC_TEST 8 -#define SQLITE_TESTCTRL_FAULT_INSTALL 9 -#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 -#define SQLITE_TESTCTRL_PENDING_BYTE 11 -#define SQLITE_TESTCTRL_ASSERT 12 -#define SQLITE_TESTCTRL_ALWAYS 13 -#define SQLITE_TESTCTRL_RESERVE 14 -#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 -#define SQLITE_TESTCTRL_ISKEYWORD 16 -#define SQLITE_TESTCTRL_PGHDRSZ 17 -#define SQLITE_TESTCTRL_SCRATCHMALLOC 18 -#define SQLITE_TESTCTRL_LAST 18 - -/* -** CAPI3REF: SQLite Runtime Status -** -** ^This interface is used to retrieve runtime status information -** about the performance of SQLite, and optionally to reset various -** highwater marks. ^The first argument is an integer code for -** the specific parameter to measure. ^(Recognized integer codes -** are of the form [SQLITE_STATUS_MEMORY_USED | SQLITE_STATUS_...].)^ -** ^The current value of the parameter is returned into *pCurrent. -** ^The highest recorded value is returned in *pHighwater. ^If the -** resetFlag is true, then the highest record value is reset after -** *pHighwater is written. ^(Some parameters do not record the highest -** value. For those parameters -** nothing is written into *pHighwater and the resetFlag is ignored.)^ -** ^(Other parameters record only the highwater mark and not the current -** value. For these latter parameters nothing is written into *pCurrent.)^ -** -** ^The sqlite3_status() routine returns SQLITE_OK on success and a -** non-zero [error code] on failure. -** -** This routine is threadsafe but is not atomic. This routine can be -** called while other threads are running the same or different SQLite -** interfaces. However the values returned in *pCurrent and -** *pHighwater reflect the status of SQLite at different points in time -** and it is possible that another thread might change the parameter -** in between the times when *pCurrent and *pHighwater are written. -** -** See also: [sqlite3_db_status()] -*/ -SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); - - -/* -** CAPI3REF: Status Parameters -** -** These integer constants designate various run-time status parameters -** that can be returned by [sqlite3_status()]. -** -**
-** ^(
SQLITE_STATUS_MEMORY_USED
-**
This parameter is the current amount of memory checked out -** using [sqlite3_malloc()], either directly or indirectly. The -** figure includes calls made to [sqlite3_malloc()] by the application -** and internal memory usage by the SQLite library. Scratch memory -** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache -** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in -** this parameter. The amount returned is the sum of the allocation -** sizes as reported by the xSize method in [sqlite3_mem_methods].
)^ -** -** ^(
SQLITE_STATUS_MALLOC_SIZE
-**
This parameter records the largest memory allocation request -** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their -** internal equivalents). Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
)^ -** -** ^(
SQLITE_STATUS_MALLOC_COUNT
-**
This parameter records the number of separate memory allocations -** currently checked out.
)^ -** -** ^(
SQLITE_STATUS_PAGECACHE_USED
-**
This parameter returns the number of pages used out of the -** [pagecache memory allocator] that was configured using -** [SQLITE_CONFIG_PAGECACHE]. The -** value returned is in pages, not in bytes.
)^ -** -** ^(
SQLITE_STATUS_PAGECACHE_OVERFLOW
-**
This parameter returns the number of bytes of page cache -** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] -** buffer and where forced to overflow to [sqlite3_malloc()]. The -** returned value includes allocations that overflowed because they -** where too large (they were larger than the "sz" parameter to -** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because -** no space was left in the page cache.
)^ -** -** ^(
SQLITE_STATUS_PAGECACHE_SIZE
-**
This parameter records the largest memory allocation request -** handed to [pagecache memory allocator]. Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
)^ -** -** ^(
SQLITE_STATUS_SCRATCH_USED
-**
This parameter returns the number of allocations used out of the -** [scratch memory allocator] configured using -** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not -** in bytes. Since a single thread may only have one scratch allocation -** outstanding at time, this parameter also reports the number of threads -** using scratch memory at the same time.
)^ -** -** ^(
SQLITE_STATUS_SCRATCH_OVERFLOW
-**
This parameter returns the number of bytes of scratch memory -** allocation which could not be satisfied by the [SQLITE_CONFIG_SCRATCH] -** buffer and where forced to overflow to [sqlite3_malloc()]. The values -** returned include overflows because the requested allocation was too -** larger (that is, because the requested allocation was larger than the -** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer -** slots were available. -**
)^ -** -** ^(
SQLITE_STATUS_SCRATCH_SIZE
-**
This parameter records the largest memory allocation request -** handed to [scratch memory allocator]. Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.
)^ -** -** ^(
SQLITE_STATUS_PARSER_STACK
-**
This parameter records the deepest parser stack. It is only -** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
)^ -**
-** -** New status parameters may be added from time to time. -*/ -#define SQLITE_STATUS_MEMORY_USED 0 -#define SQLITE_STATUS_PAGECACHE_USED 1 -#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 -#define SQLITE_STATUS_SCRATCH_USED 3 -#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 -#define SQLITE_STATUS_MALLOC_SIZE 5 -#define SQLITE_STATUS_PARSER_STACK 6 -#define SQLITE_STATUS_PAGECACHE_SIZE 7 -#define SQLITE_STATUS_SCRATCH_SIZE 8 -#define SQLITE_STATUS_MALLOC_COUNT 9 - -/* -** CAPI3REF: Database Connection Status -** -** ^This interface is used to retrieve runtime status information -** about a single [database connection]. ^The first argument is the -** database connection object to be interrogated. ^The second argument -** is an integer constant, taken from the set of -** [SQLITE_DBSTATUS_LOOKASIDE_USED | SQLITE_DBSTATUS_*] macros, that -** determines the parameter to interrogate. The set of -** [SQLITE_DBSTATUS_LOOKASIDE_USED | SQLITE_DBSTATUS_*] macros is likely -** to grow in future releases of SQLite. -** -** ^The current value of the requested parameter is written into *pCur -** and the highest instantaneous value is written into *pHiwtr. ^If -** the resetFlg is true, then the highest instantaneous value is -** reset back down to the current value. -** -** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a -** non-zero [error code] on failure. -** -** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. -*/ -SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); - -/* -** CAPI3REF: Status Parameters for database connections -** -** These constants are the available integer "verbs" that can be passed as -** the second argument to the [sqlite3_db_status()] interface. -** -** New verbs may be added in future releases of SQLite. Existing verbs -** might be discontinued. Applications should check the return code from -** [sqlite3_db_status()] to make sure that the call worked. -** The [sqlite3_db_status()] interface will return a non-zero error code -** if a discontinued or unsupported verb is invoked. -** -**
-** ^(
SQLITE_DBSTATUS_LOOKASIDE_USED
-**
This parameter returns the number of lookaside memory slots currently -** checked out.
)^ -** -** ^(
SQLITE_DBSTATUS_LOOKASIDE_HIT
-**
This parameter returns the number malloc attempts that were -** satisfied using lookaside memory. Only the high-water value is meaningful; -** the current value is always zero. -** checked out.
)^ -** -** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
-**
This parameter returns the number malloc attempts that might have -** been satisfied using lookaside memory but failed due to the amount of -** memory requested being larger than the lookaside slot size. -** Only the high-water value is meaningful; -** the current value is always zero. -** checked out.
)^ -** -** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
-**
This parameter returns the number malloc attempts that might have -** been satisfied using lookaside memory but failed due to all lookaside -** memory already being in use. -** Only the high-water value is meaningful; -** the current value is always zero. -** checked out.
)^ -** -** ^(
SQLITE_DBSTATUS_CACHE_USED
-**
This parameter returns the approximate number of of bytes of heap -** memory used by all pager caches associated with the database connection.)^ -** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. -** -** ^(
SQLITE_DBSTATUS_SCHEMA_USED
-**
This parameter returns the approximate number of of bytes of heap -** memory used to store the schema for all databases associated -** with the connection - main, temp, and any [ATTACH]-ed databases.)^ -** ^The full amount of memory used by the schemas is reported, even if the -** schema memory is shared with other database connections due to -** [shared cache mode] being enabled. -** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. -** -** ^(
SQLITE_DBSTATUS_STMT_USED
-**
This parameter returns the approximate number of of bytes of heap -** and lookaside memory used by all prepared statements associated with -** the database connection.)^ -** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0. -**
-**
-*/ -#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 -#define SQLITE_DBSTATUS_CACHE_USED 1 -#define SQLITE_DBSTATUS_SCHEMA_USED 2 -#define SQLITE_DBSTATUS_STMT_USED 3 -#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 -#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 -#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 -#define SQLITE_DBSTATUS_MAX 6 /* Largest defined DBSTATUS */ - - -/* -** CAPI3REF: Prepared Statement Status -** -** ^(Each prepared statement maintains various -** [SQLITE_STMTSTATUS_SORT | counters] that measure the number -** of times it has performed specific operations.)^ These counters can -** be used to monitor the performance characteristics of the prepared -** statements. For example, if the number of table steps greatly exceeds -** the number of table searches or result rows, that would tend to indicate -** that the prepared statement is using a full table scan rather than -** an index. -** -** ^(This interface is used to retrieve and reset counter values from -** a [prepared statement]. The first argument is the prepared statement -** object to be interrogated. The second argument -** is an integer code for a specific [SQLITE_STMTSTATUS_SORT | counter] -** to be interrogated.)^ -** ^The current value of the requested counter is returned. -** ^If the resetFlg is true, then the counter is reset to zero after this -** interface call returns. -** -** See also: [sqlite3_status()] and [sqlite3_db_status()]. -*/ -SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); - -/* -** CAPI3REF: Status Parameters for prepared statements -** -** These preprocessor macros define integer codes that name counter -** values associated with the [sqlite3_stmt_status()] interface. -** The meanings of the various counters are as follows: -** -**
-**
SQLITE_STMTSTATUS_FULLSCAN_STEP
-**
^This is the number of times that SQLite has stepped forward in -** a table as part of a full table scan. Large numbers for this counter -** may indicate opportunities for performance improvement through -** careful use of indices.
-** -**
SQLITE_STMTSTATUS_SORT
-**
^This is the number of sort operations that have occurred. -** A non-zero value in this counter may indicate an opportunity to -** improvement performance through careful use of indices.
-** -**
SQLITE_STMTSTATUS_AUTOINDEX
-**
^This is the number of rows inserted into transient indices that -** were created automatically in order to help joins run faster. -** A non-zero value in this counter may indicate an opportunity to -** improvement performance by adding permanent indices that do not -** need to be reinitialized each time the statement is run.
-** -**
-*/ -#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 -#define SQLITE_STMTSTATUS_SORT 2 -#define SQLITE_STMTSTATUS_AUTOINDEX 3 - -/* -** CAPI3REF: Custom Page Cache Object -** -** The sqlite3_pcache type is opaque. It is implemented by -** the pluggable module. The SQLite core has no knowledge of -** its size or internal structure and never deals with the -** sqlite3_pcache object except by holding and passing pointers -** to the object. -** -** See [sqlite3_pcache_methods] for additional information. -*/ -typedef struct sqlite3_pcache sqlite3_pcache; - -/* -** CAPI3REF: Application Defined Page Cache. -** KEYWORDS: {page cache} -** -** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE], ...) interface can -** register an alternative page cache implementation by passing in an -** instance of the sqlite3_pcache_methods structure.)^ -** In many applications, most of the heap memory allocated by -** SQLite is used for the page cache. -** By implementing a -** custom page cache using this API, an application can better control -** the amount of memory consumed by SQLite, the way in which -** that memory is allocated and released, and the policies used to -** determine exactly which parts of a database file are cached and for -** how long. -** -** The alternative page cache mechanism is an -** extreme measure that is only needed by the most demanding applications. -** The built-in page cache is recommended for most uses. -** -** ^(The contents of the sqlite3_pcache_methods structure are copied to an -** internal buffer by SQLite within the call to [sqlite3_config]. Hence -** the application may discard the parameter after the call to -** [sqlite3_config()] returns.)^ -** -** ^(The xInit() method is called once for each effective -** call to [sqlite3_initialize()])^ -** (usually only once during the lifetime of the process). ^(The xInit() -** method is passed a copy of the sqlite3_pcache_methods.pArg value.)^ -** The intent of the xInit() method is to set up global data structures -** required by the custom page cache implementation. -** ^(If the xInit() method is NULL, then the -** built-in default page cache is used instead of the application defined -** page cache.)^ -** -** ^The xShutdown() method is called by [sqlite3_shutdown()]. -** It can be used to clean up -** any outstanding resources before process shutdown, if required. -** ^The xShutdown() method may be NULL. -** -** ^SQLite automatically serializes calls to the xInit method, -** so the xInit method need not be threadsafe. ^The -** xShutdown method is only called from [sqlite3_shutdown()] so it does -** not need to be threadsafe either. All other methods must be threadsafe -** in multithreaded applications. -** -** ^SQLite will never invoke xInit() more than once without an intervening -** call to xShutdown(). -** -** ^SQLite invokes the xCreate() method to construct a new cache instance. -** SQLite will typically create one cache instance for each open database file, -** though this is not guaranteed. ^The -** first parameter, szPage, is the size in bytes of the pages that must -** be allocated by the cache. ^szPage will not be a power of two. ^szPage -** will the page size of the database file that is to be cached plus an -** increment (here called "R") of less than 250. SQLite will use the -** extra R bytes on each page to store metadata about the underlying -** database page on disk. The value of R depends -** on the SQLite version, the target platform, and how SQLite was compiled. -** ^(R is constant for a particular build of SQLite. Except, there are two -** distinct values of R when SQLite is compiled with the proprietary -** ZIPVFS extension.)^ ^The second argument to -** xCreate(), bPurgeable, is true if the cache being created will -** be used to cache database pages of a file stored on disk, or -** false if it is used for an in-memory database. The cache implementation -** does not have to do anything special based with the value of bPurgeable; -** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will -** never invoke xUnpin() except to deliberately delete a page. -** ^In other words, calls to xUnpin() on a cache with bPurgeable set to -** false will always have the "discard" flag set to true. -** ^Hence, a cache created with bPurgeable false will -** never contain any unpinned pages. -** -** ^(The xCachesize() method may be called at any time by SQLite to set the -** suggested maximum cache-size (number of pages stored by) the cache -** instance passed as the first argument. This is the value configured using -** the SQLite "[PRAGMA cache_size]" command.)^ As with the bPurgeable -** parameter, the implementation is not required to do anything with this -** value; it is advisory only. -** -** The xPagecount() method must return the number of pages currently -** stored in the cache, both pinned and unpinned. -** -** The xFetch() method locates a page in the cache and returns a pointer to -** the page, or a NULL pointer. -** A "page", in this context, means a buffer of szPage bytes aligned at an -** 8-byte boundary. The page to be fetched is determined by the key. ^The -** mimimum key value is 1. After it has been retrieved using xFetch, the page -** is considered to be "pinned". -** -** If the requested page is already in the page cache, then the page cache -** implementation must return a pointer to the page buffer with its content -** intact. If the requested page is not already in the cache, then the -** cache implementation should use the value of the createFlag -** parameter to help it determined what action to take: -** -** -**
createFlag Behaviour when page is not already in cache -**
0 Do not allocate a new page. Return NULL. -**
1 Allocate a new page if it easy and convenient to do so. -** Otherwise return NULL. -**
2 Make every effort to allocate a new page. Only return -** NULL if allocating a new page is effectively impossible. -**
-** -** ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite -** will only use a createFlag of 2 after a prior call with a createFlag of 1 -** failed.)^ In between the to xFetch() calls, SQLite may -** attempt to unpin one or more cache pages by spilling the content of -** pinned pages to disk and synching the operating system disk cache. -** -** ^xUnpin() is called by SQLite with a pointer to a currently pinned page -** as its second argument. If the third parameter, discard, is non-zero, -** then the page must be evicted from the cache. -** ^If the discard parameter is -** zero, then the page may be discarded or retained at the discretion of -** page cache implementation. ^The page cache implementation -** may choose to evict unpinned pages at any time. -** -** The cache must not perform any reference counting. A single -** call to xUnpin() unpins the page regardless of the number of prior calls -** to xFetch(). -** -** The xRekey() method is used to change the key value associated with the -** page passed as the second argument. If the cache -** previously contains an entry associated with newKey, it must be -** discarded. ^Any prior cache entry associated with newKey is guaranteed not -** to be pinned. -** -** When SQLite calls the xTruncate() method, the cache must discard all -** existing cache entries with page numbers (keys) greater than or equal -** to the value of the iLimit parameter passed to xTruncate(). If any -** of these pages are pinned, they are implicitly unpinned, meaning that -** they can be safely discarded. -** -** ^The xDestroy() method is used to delete a cache allocated by xCreate(). -** All resources associated with the specified cache should be freed. ^After -** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] -** handle invalid, and will not use it with any other sqlite3_pcache_methods -** functions. -*/ -typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; -struct sqlite3_pcache_methods { - void *pArg; - int (*xInit)(void*); - void (*xShutdown)(void*); - sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); - void (*xCachesize)(sqlite3_pcache*, int nCachesize); - int (*xPagecount)(sqlite3_pcache*); - void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); - void (*xUnpin)(sqlite3_pcache*, void*, int discard); - void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); - void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); - void (*xDestroy)(sqlite3_pcache*); -}; - -/* -** CAPI3REF: Online Backup Object -** -** The sqlite3_backup object records state information about an ongoing -** online backup operation. ^The sqlite3_backup object is created by -** a call to [sqlite3_backup_init()] and is destroyed by a call to -** [sqlite3_backup_finish()]. -** -** See Also: [Using the SQLite Online Backup API] -*/ -typedef struct sqlite3_backup sqlite3_backup; - -/* -** CAPI3REF: Online Backup API. -** -** The backup API copies the content of one database into another. -** It is useful either for creating backups of databases or -** for copying in-memory databases to or from persistent files. -** -** See Also: [Using the SQLite Online Backup API] -** -** ^SQLite holds a write transaction open on the destination database file -** for the duration of the backup operation. -** ^The source database is read-locked only while it is being read; -** it is not locked continuously for the entire backup operation. -** ^Thus, the backup may be performed on a live source database without -** preventing other database connections from -** reading or writing to the source database while the backup is underway. -** -** ^(To perform a backup operation: -**
    -**
  1. sqlite3_backup_init() is called once to initialize the -** backup, -**
  2. sqlite3_backup_step() is called one or more times to transfer -** the data between the two databases, and finally -**
  3. sqlite3_backup_finish() is called to release all resources -** associated with the backup operation. -**
)^ -** There should be exactly one call to sqlite3_backup_finish() for each -** successful call to sqlite3_backup_init(). -** -** sqlite3_backup_init() -** -** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the -** [database connection] associated with the destination database -** and the database name, respectively. -** ^The database name is "main" for the main database, "temp" for the -** temporary database, or the name specified after the AS keyword in -** an [ATTACH] statement for an attached database. -** ^The S and M arguments passed to -** sqlite3_backup_init(D,N,S,M) identify the [database connection] -** and database name of the source database, respectively. -** ^The source and destination [database connections] (parameters S and D) -** must be different or else sqlite3_backup_init(D,N,S,M) will fail with -** an error. -** -** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is -** returned and an error code and error message are stored in the -** destination [database connection] D. -** ^The error code and message for the failed call to sqlite3_backup_init() -** can be retrieved using the [sqlite3_errcode()], [sqlite3_errmsg()], and/or -** [sqlite3_errmsg16()] functions. -** ^A successful call to sqlite3_backup_init() returns a pointer to an -** [sqlite3_backup] object. -** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and -** sqlite3_backup_finish() functions to perform the specified backup -** operation. -** -** sqlite3_backup_step() -** -** ^Function sqlite3_backup_step(B,N) will copy up to N pages between -** the source and destination databases specified by [sqlite3_backup] object B. -** ^If N is negative, all remaining source pages are copied. -** ^If sqlite3_backup_step(B,N) successfully copies N pages and there -** are still more pages to be copied, then the function returns [SQLITE_OK]. -** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages -** from source to destination, then it returns [SQLITE_DONE]. -** ^If an error occurs while running sqlite3_backup_step(B,N), -** then an [error code] is returned. ^As well as [SQLITE_OK] and -** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY], -** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an -** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code. -** -** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if -**
    -**
  1. the destination database was opened read-only, or -**
  2. the destination database is using write-ahead-log journaling -** and the destination and source page sizes differ, or -**
  3. the destination database is an in-memory database and the -** destination and source page sizes differ. -**
)^ -** -** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then -** the [sqlite3_busy_handler | busy-handler function] -** is invoked (if one is specified). ^If the -** busy-handler returns non-zero before the lock is available, then -** [SQLITE_BUSY] is returned to the caller. ^In this case the call to -** sqlite3_backup_step() can be retried later. ^If the source -** [database connection] -** is being used to write to the source database when sqlite3_backup_step() -** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this -** case the call to sqlite3_backup_step() can be retried later on. ^(If -** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or -** [SQLITE_READONLY] is returned, then -** there is no point in retrying the call to sqlite3_backup_step(). These -** errors are considered fatal.)^ The application must accept -** that the backup operation has failed and pass the backup operation handle -** to the sqlite3_backup_finish() to release associated resources. -** -** ^The first call to sqlite3_backup_step() obtains an exclusive lock -** on the destination file. ^The exclusive lock is not released until either -** sqlite3_backup_finish() is called or the backup operation is complete -** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to -** sqlite3_backup_step() obtains a [shared lock] on the source database that -** lasts for the duration of the sqlite3_backup_step() call. -** ^Because the source database is not locked between calls to -** sqlite3_backup_step(), the source database may be modified mid-way -** through the backup process. ^If the source database is modified by an -** external process or via a database connection other than the one being -** used by the backup operation, then the backup will be automatically -** restarted by the next call to sqlite3_backup_step(). ^If the source -** database is modified by the using the same database connection as is used -** by the backup operation, then the backup database is automatically -** updated at the same time. -** -** sqlite3_backup_finish() -** -** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the -** application wishes to abandon the backup operation, the application -** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish(). -** ^The sqlite3_backup_finish() interfaces releases all -** resources associated with the [sqlite3_backup] object. -** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any -** active write-transaction on the destination database is rolled back. -** The [sqlite3_backup] object is invalid -** and may not be used following a call to sqlite3_backup_finish(). -** -** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no -** sqlite3_backup_step() errors occurred, regardless or whether or not -** sqlite3_backup_step() completed. -** ^If an out-of-memory condition or IO error occurred during any prior -** sqlite3_backup_step() call on the same [sqlite3_backup] object, then -** sqlite3_backup_finish() returns the corresponding [error code]. -** -** ^A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() -** is not a permanent error and does not affect the return value of -** sqlite3_backup_finish(). -** -** sqlite3_backup_remaining(), sqlite3_backup_pagecount() -** -** ^Each call to sqlite3_backup_step() sets two values inside -** the [sqlite3_backup] object: the number of pages still to be backed -** up and the total number of pages in the source database file. -** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces -** retrieve these two values, respectively. -** -** ^The values returned by these functions are only updated by -** sqlite3_backup_step(). ^If the source database is modified during a backup -** operation, then the values are not updated to account for any extra -** pages that need to be updated or the size of the source database file -** changing. -** -** Concurrent Usage of Database Handles -** -** ^The source [database connection] may be used by the application for other -** purposes while a backup operation is underway or being initialized. -** ^If SQLite is compiled and configured to support threadsafe database -** connections, then the source database connection may be used concurrently -** from within other threads. -** -** However, the application must guarantee that the destination -** [database connection] is not passed to any other API (by any thread) after -** sqlite3_backup_init() is called and before the corresponding call to -** sqlite3_backup_finish(). SQLite does not currently check to see -** if the application incorrectly accesses the destination [database connection] -** and so no error code is reported, but the operations may malfunction -** nevertheless. Use of the destination database connection while a -** backup is in progress might also also cause a mutex deadlock. -** -** If running in [shared cache mode], the application must -** guarantee that the shared cache used by the destination database -** is not accessed while the backup is running. In practice this means -** that the application must guarantee that the disk file being -** backed up to is not accessed by any connection within the process, -** not just the specific connection that was passed to sqlite3_backup_init(). -** -** The [sqlite3_backup] object itself is partially threadsafe. Multiple -** threads may safely make multiple concurrent calls to sqlite3_backup_step(). -** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() -** APIs are not strictly speaking threadsafe. If they are invoked at the -** same time as another thread is invoking sqlite3_backup_step() it is -** possible that they return invalid values. -*/ -SQLITE_API sqlite3_backup *sqlite3_backup_init( - sqlite3 *pDest, /* Destination database handle */ - const char *zDestName, /* Destination database name */ - sqlite3 *pSource, /* Source database handle */ - const char *zSourceName /* Source database name */ -); -SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); -SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); -SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); -SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); - -/* -** CAPI3REF: Unlock Notification -** -** ^When running in shared-cache mode, a database operation may fail with -** an [SQLITE_LOCKED] error if the required locks on the shared-cache or -** individual tables within the shared-cache cannot be obtained. See -** [SQLite Shared-Cache Mode] for a description of shared-cache locking. -** ^This API may be used to register a callback that SQLite will invoke -** when the connection currently holding the required lock relinquishes it. -** ^This API is only available if the library was compiled with the -** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. -** -** See Also: [Using the SQLite Unlock Notification Feature]. -** -** ^Shared-cache locks are released when a database connection concludes -** its current transaction, either by committing it or rolling it back. -** -** ^When a connection (known as the blocked connection) fails to obtain a -** shared-cache lock and SQLITE_LOCKED is returned to the caller, the -** identity of the database connection (the blocking connection) that -** has locked the required resource is stored internally. ^After an -** application receives an SQLITE_LOCKED error, it may call the -** sqlite3_unlock_notify() method with the blocked connection handle as -** the first argument to register for a callback that will be invoked -** when the blocking connections current transaction is concluded. ^The -** callback is invoked from within the [sqlite3_step] or [sqlite3_close] -** call that concludes the blocking connections transaction. -** -** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, -** there is a chance that the blocking connection will have already -** concluded its transaction by the time sqlite3_unlock_notify() is invoked. -** If this happens, then the specified callback is invoked immediately, -** from within the call to sqlite3_unlock_notify().)^ -** -** ^If the blocked connection is attempting to obtain a write-lock on a -** shared-cache table, and more than one other connection currently holds -** a read-lock on the same table, then SQLite arbitrarily selects one of -** the other connections to use as the blocking connection. -** -** ^(There may be at most one unlock-notify callback registered by a -** blocked connection. If sqlite3_unlock_notify() is called when the -** blocked connection already has a registered unlock-notify callback, -** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is -** called with a NULL pointer as its second argument, then any existing -** unlock-notify callback is canceled. ^The blocked connections -** unlock-notify callback may also be canceled by closing the blocked -** connection using [sqlite3_close()]. -** -** The unlock-notify callback is not reentrant. If an application invokes -** any sqlite3_xxx API functions from within an unlock-notify callback, a -** crash or deadlock may be the result. -** -** ^Unless deadlock is detected (see below), sqlite3_unlock_notify() always -** returns SQLITE_OK. -** -** Callback Invocation Details -** -** When an unlock-notify callback is registered, the application provides a -** single void* pointer that is passed to the callback when it is invoked. -** However, the signature of the callback function allows SQLite to pass -** it an array of void* context pointers. The first argument passed to -** an unlock-notify callback is a pointer to an array of void* pointers, -** and the second is the number of entries in the array. -** -** When a blocking connections transaction is concluded, there may be -** more than one blocked connection that has registered for an unlock-notify -** callback. ^If two or more such blocked connections have specified the -** same callback function, then instead of invoking the callback function -** multiple times, it is invoked once with the set of void* context pointers -** specified by the blocked connections bundled together into an array. -** This gives the application an opportunity to prioritize any actions -** related to the set of unblocked database connections. -** -** Deadlock Detection -** -** Assuming that after registering for an unlock-notify callback a -** database waits for the callback to be issued before taking any further -** action (a reasonable assumption), then using this API may cause the -** application to deadlock. For example, if connection X is waiting for -** connection Y's transaction to be concluded, and similarly connection -** Y is waiting on connection X's transaction, then neither connection -** will proceed and the system may remain deadlocked indefinitely. -** -** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock -** detection. ^If a given call to sqlite3_unlock_notify() would put the -** system in a deadlocked state, then SQLITE_LOCKED is returned and no -** unlock-notify callback is registered. The system is said to be in -** a deadlocked state if connection A has registered for an unlock-notify -** callback on the conclusion of connection B's transaction, and connection -** B has itself registered for an unlock-notify callback when connection -** A's transaction is concluded. ^Indirect deadlock is also detected, so -** the system is also considered to be deadlocked if connection B has -** registered for an unlock-notify callback on the conclusion of connection -** C's transaction, where connection C is waiting on connection A. ^Any -** number of levels of indirection are allowed. -** -** The "DROP TABLE" Exception -** -** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost -** always appropriate to call sqlite3_unlock_notify(). There is however, -** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, -** SQLite checks if there are any currently executing SELECT statements -** that belong to the same connection. If there are, SQLITE_LOCKED is -** returned. In this case there is no "blocking connection", so invoking -** sqlite3_unlock_notify() results in the unlock-notify callback being -** invoked immediately. If the application then re-attempts the "DROP TABLE" -** or "DROP INDEX" query, an infinite loop might be the result. -** -** One way around this problem is to check the extended error code returned -** by an sqlite3_step() call. ^(If there is a blocking connection, then the -** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in -** the special "DROP TABLE/INDEX" case, the extended error code is just -** SQLITE_LOCKED.)^ -*/ -SQLITE_API int sqlite3_unlock_notify( - sqlite3 *pBlocked, /* Waiting connection */ - void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ - void *pNotifyArg /* Argument to pass to xNotify */ -); - - -/* -** CAPI3REF: String Comparison -** -** ^The [sqlite3_strnicmp()] API allows applications and extensions to -** compare the contents of two buffers containing UTF-8 strings in a -** case-independent fashion, using the same definition of case independence -** that SQLite uses internally when comparing identifiers. -*/ -SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); - -/* -** CAPI3REF: Error Logging Interface -** -** ^The [sqlite3_log()] interface writes a message into the error log -** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()]. -** ^If logging is enabled, the zFormat string and subsequent arguments are -** used with [sqlite3_snprintf()] to generate the final output string. -** -** The sqlite3_log() interface is intended for use by extensions such as -** virtual tables, collating functions, and SQL functions. While there is -** nothing to prevent an application from calling sqlite3_log(), doing so -** is considered bad form. -** -** The zFormat string must not be NULL. -** -** To avoid deadlocks and other threading problems, the sqlite3_log() routine -** will not use dynamically allocated memory. The log message is stored in -** a fixed-length buffer on the stack. If the log message is longer than -** a few hundred characters, it will be truncated to the length of the -** buffer. -*/ -SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); - -/* -** CAPI3REF: Write-Ahead Log Commit Hook -** -** ^The [sqlite3_wal_hook()] function is used to register a callback that -** will be invoked each time a database connection commits data to a -** [write-ahead log] (i.e. whenever a transaction is committed in -** [journal_mode | journal_mode=WAL mode]). -** -** ^The callback is invoked by SQLite after the commit has taken place and -** the associated write-lock on the database released, so the implementation -** may read, write or [checkpoint] the database as required. -** -** ^The first parameter passed to the callback function when it is invoked -** is a copy of the third parameter passed to sqlite3_wal_hook() when -** registering the callback. ^The second is a copy of the database handle. -** ^The third parameter is the name of the database that was written to - -** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter -** is the number of pages currently in the write-ahead log file, -** including those that were just committed. -** -** The callback function should normally return [SQLITE_OK]. ^If an error -** code is returned, that error will propagate back up through the -** SQLite code base to cause the statement that provoked the callback -** to report an error, though the commit will have still occurred. If the -** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value -** that does not correspond to any valid SQLite error code, the results -** are undefined. -** -** A single database handle may have at most a single write-ahead log callback -** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any -** previously registered write-ahead log callback. ^Note that the -** [sqlite3_wal_autocheckpoint()] interface and the -** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will -** those overwrite any prior [sqlite3_wal_hook()] settings. -*/ -SQLITE_API void *sqlite3_wal_hook( - sqlite3*, - int(*)(void *,sqlite3*,const char*,int), - void* -); - -/* -** CAPI3REF: Configure an auto-checkpoint -** -** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around -** [sqlite3_wal_hook()] that causes any database on [database connection] D -** to automatically [checkpoint] -** after committing a transaction if there are N or -** more frames in the [write-ahead log] file. ^Passing zero or -** a negative value as the nFrame parameter disables automatic -** checkpoints entirely. -** -** ^The callback registered by this function replaces any existing callback -** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback -** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism -** configured by this function. -** -** ^The [wal_autocheckpoint pragma] can be used to invoke this interface -** from SQL. -** -** ^Every new [database connection] defaults to having the auto-checkpoint -** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] -** pages. The use of this interface -** is only necessary if the default setting is found to be suboptimal -** for a particular application. -*/ -SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); - -/* -** CAPI3REF: Checkpoint a database -** -** ^The [sqlite3_wal_checkpoint(D,X)] interface causes database named X -** on [database connection] D to be [checkpointed]. ^If X is NULL or an -** empty string, then a checkpoint is run on all databases of -** connection D. ^If the database connection D is not in -** [WAL | write-ahead log mode] then this interface is a harmless no-op. -** -** ^The [wal_checkpoint pragma] can be used to invoke this interface -** from SQL. ^The [sqlite3_wal_autocheckpoint()] interface and the -** [wal_autocheckpoint pragma] can be used to cause this interface to be -** run whenever the WAL reaches a certain size threshold. -*/ -SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); - -/* -** Undo the hack that converts floating point types to integer for -** builds on processors without floating point support. -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# undef double -#endif - -#if 0 -} /* End of the 'extern "C"' block */ -#endif -#endif - -/* -** 2010 August 30 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -*/ - -#ifndef _SQLITE3RTREE_H_ -#define _SQLITE3RTREE_H_ - - -#if 0 -extern "C" { -#endif - - typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry; - - /* - ** Register a geometry callback named zGeom that can be used as part of an - ** R-Tree geometry query as follows: - ** - ** SELECT ... FROM WHERE MATCH $zGeom(... params ...) - */ - SQLITE_API int sqlite3_rtree_geometry_callback( - sqlite3 *db, - const char *zGeom, - int (*xGeom)(sqlite3_rtree_geometry *, int nCoord, double *aCoord, int *pRes), - void *pContext - ); - - - /* - ** A pointer to a structure of the following type is passed as the first - ** argument to callbacks registered using rtree_geometry_callback(). - */ - struct sqlite3_rtree_geometry { - void *pContext; /* Copy of pContext passed to s_r_g_c() */ - int nParam; /* Size of array aParam[] */ - double *aParam; /* Parameters passed to SQL geom function */ - void *pUser; /* Callback implementation user data */ - void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */ - }; - - -#if 0 -} /* end of the 'extern "C"' block */ -#endif - -#endif /* ifndef _SQLITE3RTREE_H_ */ - - -/************** End of sqlite3.h *********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include hash.h in the middle of sqliteInt.h ******************/ -/************** Begin file hash.h ********************************************/ -/* -** 2001 September 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This is the header file for the generic hash-table implemenation -** used in SQLite. -*/ -#ifndef _SQLITE_HASH_H_ -#define _SQLITE_HASH_H_ - -/* Forward declarations of structures. */ -typedef struct Hash Hash; -typedef struct HashElem HashElem; - -/* A complete hash table is an instance of the following structure. -** The internals of this structure are intended to be opaque -- client -** code should not attempt to access or modify the fields of this structure -** directly. Change this structure only by using the routines below. -** However, some of the "procedures" and "functions" for modifying and -** accessing this structure are really macros, so we can't really make -** this structure opaque. -** -** All elements of the hash table are on a single doubly-linked list. -** Hash.first points to the head of this list. -** -** There are Hash.htsize buckets. Each bucket points to a spot in -** the global doubly-linked list. The contents of the bucket are the -** element pointed to plus the next _ht.count-1 elements in the list. -** -** Hash.htsize and Hash.ht may be zero. In that case lookup is done -** by a linear search of the global list. For small tables, the -** Hash.ht table is never allocated because if there are few elements -** in the table, it is faster to do a linear search than to manage -** the hash table. -*/ -struct Hash { - unsigned int htsize; /* Number of buckets in the hash table */ - unsigned int count; /* Number of entries in this table */ - HashElem *first; /* The first element of the array */ - struct _ht { /* the hash table */ - int count; /* Number of entries with this hash */ - HashElem *chain; /* Pointer to first entry with this hash */ - } *ht; -}; - -/* Each element in the hash table is an instance of the following -** structure. All elements are stored on a single doubly-linked list. -** -** Again, this structure is intended to be opaque, but it can't really -** be opaque because it is used by macros. -*/ -struct HashElem { - HashElem *next, *prev; /* Next and previous elements in the table */ - void *data; /* Data associated with this element */ - const char *pKey; - int nKey; /* Key associated with this element */ -}; - -/* -** Access routines. To delete, insert a NULL pointer. -*/ -SQLITE_PRIVATE void sqlite3HashInit(Hash*); -SQLITE_PRIVATE void *sqlite3HashInsert(Hash*, const char *pKey, int nKey, void *pData); -SQLITE_PRIVATE void *sqlite3HashFind(const Hash*, const char *pKey, int nKey); -SQLITE_PRIVATE void sqlite3HashClear(Hash*); - -/* -** Macros for looping over all elements of a hash table. The idiom is -** like this: -** -** Hash h; -** HashElem *p; -** ... -** for(p=sqliteHashFirst(&h); p; p=sqliteHashNext(p)){ -** SomeStructure *pData = sqliteHashData(p); -** // do something with pData -** } -*/ -#define sqliteHashFirst(H) ((H)->first) -#define sqliteHashNext(E) ((E)->next) -#define sqliteHashData(E) ((E)->data) -/* #define sqliteHashKey(E) ((E)->pKey) // NOT USED */ -/* #define sqliteHashKeysize(E) ((E)->nKey) // NOT USED */ - -/* -** Number of entries in a hash table -*/ -/* #define sqliteHashCount(H) ((H)->count) // NOT USED */ - -#endif /* _SQLITE_HASH_H_ */ - -/************** End of hash.h ************************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include parse.h in the middle of sqliteInt.h *****************/ -/************** Begin file parse.h *******************************************/ -#define TK_SEMI 1 -#define TK_EXPLAIN 2 -#define TK_QUERY 3 -#define TK_PLAN 4 -#define TK_BEGIN 5 -#define TK_TRANSACTION 6 -#define TK_DEFERRED 7 -#define TK_IMMEDIATE 8 -#define TK_EXCLUSIVE 9 -#define TK_COMMIT 10 -#define TK_END 11 -#define TK_ROLLBACK 12 -#define TK_SAVEPOINT 13 -#define TK_RELEASE 14 -#define TK_TO 15 -#define TK_TABLE 16 -#define TK_CREATE 17 -#define TK_IF 18 -#define TK_NOT 19 -#define TK_EXISTS 20 -#define TK_TEMP 21 -#define TK_LP 22 -#define TK_RP 23 -#define TK_AS 24 -#define TK_COMMA 25 -#define TK_ID 26 -#define TK_INDEXED 27 -#define TK_ABORT 28 -#define TK_ACTION 29 -#define TK_AFTER 30 -#define TK_ANALYZE 31 -#define TK_ASC 32 -#define TK_ATTACH 33 -#define TK_BEFORE 34 -#define TK_BY 35 -#define TK_CASCADE 36 -#define TK_CAST 37 -#define TK_COLUMNKW 38 -#define TK_CONFLICT 39 -#define TK_DATABASE 40 -#define TK_DESC 41 -#define TK_DETACH 42 -#define TK_EACH 43 -#define TK_FAIL 44 -#define TK_FOR 45 -#define TK_IGNORE 46 -#define TK_INITIALLY 47 -#define TK_INSTEAD 48 -#define TK_LIKE_KW 49 -#define TK_MATCH 50 -#define TK_NO 51 -#define TK_KEY 52 -#define TK_OF 53 -#define TK_OFFSET 54 -#define TK_PRAGMA 55 -#define TK_RAISE 56 -#define TK_REPLACE 57 -#define TK_RESTRICT 58 -#define TK_ROW 59 -#define TK_TRIGGER 60 -#define TK_VACUUM 61 -#define TK_VIEW 62 -#define TK_VIRTUAL 63 -#define TK_REINDEX 64 -#define TK_RENAME 65 -#define TK_CTIME_KW 66 -#define TK_ANY 67 -#define TK_OR 68 -#define TK_AND 69 -#define TK_IS 70 -#define TK_BETWEEN 71 -#define TK_IN 72 -#define TK_ISNULL 73 -#define TK_NOTNULL 74 -#define TK_NE 75 -#define TK_EQ 76 -#define TK_GT 77 -#define TK_LE 78 -#define TK_LT 79 -#define TK_GE 80 -#define TK_ESCAPE 81 -#define TK_BITAND 82 -#define TK_BITOR 83 -#define TK_LSHIFT 84 -#define TK_RSHIFT 85 -#define TK_PLUS 86 -#define TK_MINUS 87 -#define TK_STAR 88 -#define TK_SLASH 89 -#define TK_REM 90 -#define TK_CONCAT 91 -#define TK_COLLATE 92 -#define TK_BITNOT 93 -#define TK_STRING 94 -#define TK_JOIN_KW 95 -#define TK_CONSTRAINT 96 -#define TK_DEFAULT 97 -#define TK_NULL 98 -#define TK_PRIMARY 99 -#define TK_UNIQUE 100 -#define TK_CHECK 101 -#define TK_REFERENCES 102 -#define TK_AUTOINCR 103 -#define TK_ON 104 -#define TK_INSERT 105 -#define TK_DELETE 106 -#define TK_UPDATE 107 -#define TK_SET 108 -#define TK_DEFERRABLE 109 -#define TK_FOREIGN 110 -#define TK_DROP 111 -#define TK_UNION 112 -#define TK_ALL 113 -#define TK_EXCEPT 114 -#define TK_INTERSECT 115 -#define TK_SELECT 116 -#define TK_DISTINCT 117 -#define TK_DOT 118 -#define TK_FROM 119 -#define TK_JOIN 120 -#define TK_USING 121 -#define TK_ORDER 122 -#define TK_GROUP 123 -#define TK_HAVING 124 -#define TK_LIMIT 125 -#define TK_WHERE 126 -#define TK_INTO 127 -#define TK_VALUES 128 -#define TK_INTEGER 129 -#define TK_FLOAT 130 -#define TK_BLOB 131 -#define TK_REGISTER 132 -#define TK_VARIABLE 133 -#define TK_CASE 134 -#define TK_WHEN 135 -#define TK_THEN 136 -#define TK_ELSE 137 -#define TK_INDEX 138 -#define TK_ALTER 139 -#define TK_ADD 140 -#define TK_TO_TEXT 141 -#define TK_TO_BLOB 142 -#define TK_TO_NUMERIC 143 -#define TK_TO_INT 144 -#define TK_TO_REAL 145 -#define TK_ISNOT 146 -#define TK_END_OF_FILE 147 -#define TK_ILLEGAL 148 -#define TK_SPACE 149 -#define TK_UNCLOSED_STRING 150 -#define TK_FUNCTION 151 -#define TK_COLUMN 152 -#define TK_AGG_FUNCTION 153 -#define TK_AGG_COLUMN 154 -#define TK_CONST_FUNC 155 -#define TK_UMINUS 156 -#define TK_UPLUS 157 - -/************** End of parse.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -#include -#include -#include -#include -#include - -/* -** If compiling for a processor that lacks floating point support, -** substitute integer for floating-point -*/ -#ifdef SQLITE_OMIT_FLOATING_POINT -# define double sqlite_int64 -# define float sqlite_int64 -# define LONGDOUBLE_TYPE sqlite_int64 -# ifndef SQLITE_BIG_DBL -# define SQLITE_BIG_DBL (((sqlite3_int64)1)<<50) -# endif -# define SQLITE_OMIT_DATETIME_FUNCS 1 -# define SQLITE_OMIT_TRACE 1 -# undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT -# undef SQLITE_HAVE_ISNAN -#endif -#ifndef SQLITE_BIG_DBL -# define SQLITE_BIG_DBL (1e99) -#endif - -/* -** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 -** afterward. Having this macro allows us to cause the C compiler -** to omit code used by TEMP tables without messy #ifndef statements. -*/ -#ifdef SQLITE_OMIT_TEMPDB -#define OMIT_TEMPDB 1 -#else -#define OMIT_TEMPDB 0 -#endif - -/* -** The "file format" number is an integer that is incremented whenever -** the VDBE-level file format changes. The following macros define the -** the default file format for new databases and the maximum file format -** that the library can read. -*/ -#define SQLITE_MAX_FILE_FORMAT 4 -#ifndef SQLITE_DEFAULT_FILE_FORMAT -# define SQLITE_DEFAULT_FILE_FORMAT 1 -#endif - -/* -** Determine whether triggers are recursive by default. This can be -** changed at run-time using a pragma. -*/ -#ifndef SQLITE_DEFAULT_RECURSIVE_TRIGGERS -# define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0 -#endif - -/* -** Provide a default value for SQLITE_TEMP_STORE in case it is not specified -** on the command-line -*/ -#ifndef SQLITE_TEMP_STORE -# define SQLITE_TEMP_STORE 1 -#endif - -/* -** GCC does not define the offsetof() macro so we'll have to do it -** ourselves. -*/ -#ifndef offsetof -#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) -#endif - -/* -** Check to see if this machine uses EBCDIC. (Yes, believe it or -** not, there are still machines out there that use EBCDIC.) -*/ -#if 'A' == '\301' -# define SQLITE_EBCDIC 1 -#else -# define SQLITE_ASCII 1 -#endif - -/* -** Integers of known sizes. These typedefs might change for architectures -** where the sizes very. Preprocessor macros are available so that the -** types can be conveniently redefined at compile-type. Like this: -** -** cc '-DUINTPTR_TYPE=long long int' ... -*/ -#ifndef UINT32_TYPE -# ifdef HAVE_UINT32_T -# define UINT32_TYPE uint32_t -# else -# define UINT32_TYPE unsigned int -# endif -#endif -#ifndef UINT16_TYPE -# ifdef HAVE_UINT16_T -# define UINT16_TYPE uint16_t -# else -# define UINT16_TYPE unsigned short int -# endif -#endif -#ifndef INT16_TYPE -# ifdef HAVE_INT16_T -# define INT16_TYPE int16_t -# else -# define INT16_TYPE short int -# endif -#endif -#ifndef UINT8_TYPE -# ifdef HAVE_UINT8_T -# define UINT8_TYPE uint8_t -# else -# define UINT8_TYPE unsigned char -# endif -#endif -#ifndef INT8_TYPE -# ifdef HAVE_INT8_T -# define INT8_TYPE int8_t -# else -# define INT8_TYPE signed char -# endif -#endif -#ifndef LONGDOUBLE_TYPE -# define LONGDOUBLE_TYPE long double -#endif -typedef sqlite_int64 i64; /* 8-byte signed integer */ -typedef sqlite_uint64 uint64_t; /* 8-byte unsigned integer */ -typedef UINT32_TYPE uint32_t; /* 4-byte unsigned integer */ -typedef UINT16_TYPE uint16_t; /* 2-byte unsigned integer */ -typedef INT16_TYPE i16; /* 2-byte signed integer */ -typedef UINT8_TYPE uint8_t; /* 1-byte unsigned integer */ -typedef INT8_TYPE i8; /* 1-byte signed integer */ - -/* -** SQLITE_MAX_U32 is a uint64_t constant that is the maximum uint64_t value -** that can be stored in a uint32_t without loss of data. The value -** is 0x00000000ffffffff. But because of quirks of some compilers, we -** have to specify the value in the less intuitive manner shown: -*/ -#define SQLITE_MAX_U32 ((((uint64_t)1)<<32)-1) - -/* -** Macros to determine whether the machine is big or little endian, -** evaluated at runtime. -*/ -#ifdef SQLITE_AMALGAMATION -SQLITE_PRIVATE const int sqlite3one = 1; -#else -SQLITE_PRIVATE const int sqlite3one; -#endif -#if defined(i386) || defined(__i386__) || defined(_M_IX86)\ - || defined(__x86_64) || defined(__x86_64__) -# define SQLITE_BIGENDIAN 0 -# define SQLITE_LITTLEENDIAN 1 -# define SQLITE_UTF16NATIVE SQLITE_UTF16LE -#else -# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) -# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) -# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) -#endif - -/* -** Constants for the largest and smallest possible 64-bit signed integers. -** These macros are designed to work correctly on both 32-bit and 64-bit -** compilers. -*/ -#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) -#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) - -/* -** Round up a number to the next larger multiple of 8. This is used -** to force 8-byte alignment on 64-bit architectures. -*/ -#define ROUND8(x) (((x)+7)&~7) - -/* -** Round down to the nearest multiple of 8 -*/ -#define ROUNDDOWN8(x) ((x)&~7) - -/* -** Assert that the pointer X is aligned to an 8-byte boundary. This -** macro is used only within assert() to verify that the code gets -** all alignment restrictions correct. -** -** Except, if SQLITE_4_BYTE_ALIGNED_MALLOC is defined, then the -** underlying malloc() implemention might return us 4-byte aligned -** pointers. In that case, only verify 4-byte alignment. -*/ -#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC -# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&3)==0) -#else -# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0) -#endif - - -/* -** An instance of the following structure is used to store the busy-handler -** callback for a given sqlite handle. -** -** The sqlite.busyHandler member of the sqlite struct contains the busy -** callback for the database handle. Each pager opened via the sqlite -** handle is passed a pointer to sqlite.busyHandler. The busy-handler -** callback is currently invoked only from within pager.c. -*/ -typedef struct BusyHandler BusyHandler; -struct BusyHandler { - int (*xFunc)(void *,int); /* The busy callback */ - void *pArg; /* First arg to busy callback */ - int nBusy; /* Incremented with each busy call */ -}; - -/* -** Name of the master database table. The master database table -** is a special table that holds the names and attributes of all -** user tables and indices. -*/ -#define MASTER_NAME "sqlite_master" -#define TEMP_MASTER_NAME "sqlite_temp_master" - -/* -** The root-page of the master database table. -*/ -#define MASTER_ROOT 1 - -/* -** The name of the schema table. -*/ -#define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME) - -/* -** A convenience macro that returns the number of elements in -** an array. -*/ -#define ArraySize(X) ((int)(sizeof(X)/sizeof(X[0]))) - -/* -** The following value as a destructor means to use sqlite3DbFree(). -** This is an internal extension to SQLITE_STATIC and SQLITE_TRANSIENT. -*/ -#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3DbFree) - -/* -** When SQLITE_OMIT_WSD is defined, it means that the target platform does -** not support Writable Static Data (WSD) such as global and static variables. -** All variables must either be on the stack or dynamically allocated from -** the heap. When WSD is unsupported, the variable declarations scattered -** throughout the SQLite code must become constants instead. The SQLITE_WSD -** macro is used for this purpose. And instead of referencing the variable -** directly, we use its constant as a key to lookup the run-time allocated -** buffer that holds real variable. The constant is also the initializer -** for the run-time allocated buffer. -** -** In the usual case where WSD is supported, the SQLITE_WSD and GLOBAL -** macros become no-ops and have zero performance impact. -*/ -#ifdef SQLITE_OMIT_WSD -#define SQLITE_WSD const -#define GLOBAL(t,v) (*(t*)sqlite3_wsd_find((void*)&(v), sizeof(v))) -#define sqlite3GlobalConfig GLOBAL(struct Sqlite3Config, sqlite3Config) -SQLITE_API int sqlite3_wsd_init(int N, int J); -SQLITE_API void *sqlite3_wsd_find(void *K, int L); -#else -#define SQLITE_WSD -#define GLOBAL(t,v) v -#define sqlite3GlobalConfig sqlite3Config -#endif - -/* -** The following macros are used to suppress compiler warnings and to -** make it clear to human readers when a function parameter is deliberately -** left unused within the body of a function. This usually happens when -** a function is called via a function pointer. For example the -** implementation of an SQL aggregate step callback may not use the -** parameter indicating the number of arguments passed to the aggregate, -** if it knows that this is enforced elsewhere. -** -** When a function parameter is not used at all within the body of a function, -** it is generally named "NotUsed" or "NotUsed2" to make things even clearer. -** However, these macros may also be used to suppress warnings related to -** parameters that may or may not be used depending on compilation options. -** For example those parameters only used in assert() statements. In these -** cases the parameters are named as per the usual conventions. -*/ -#define UNUSED_PARAMETER(x) (void)(x) -#define UNUSED_PARAMETER2(x,y) UNUSED_PARAMETER(x),UNUSED_PARAMETER(y) - -/* -** Forward references to structures -*/ -typedef struct AggInfo AggInfo; -typedef struct AuthContext AuthContext; -typedef struct AutoincInfo AutoincInfo; -typedef struct Bitvec Bitvec; -typedef struct CollSeq CollSeq; -typedef struct Column Column; -typedef struct Db Db; -typedef struct Schema Schema; -typedef struct Expr Expr; -typedef struct ExprList ExprList; -typedef struct ExprSpan ExprSpan; -typedef struct FKey FKey; -typedef struct FuncDestructor FuncDestructor; -typedef struct FuncDef FuncDef; -typedef struct FuncDefHash FuncDefHash; -typedef struct IdList IdList; -typedef struct Index Index; -typedef struct IndexSample IndexSample; -typedef struct KeyClass KeyClass; -typedef struct KeyInfo KeyInfo; -typedef struct Lookaside Lookaside; -typedef struct LookasideSlot LookasideSlot; -typedef struct Module Module; -typedef struct NameContext NameContext; -typedef struct Parse Parse; -typedef struct RowSet RowSet; -typedef struct Savepoint Savepoint; -typedef struct Select Select; -typedef struct SrcList SrcList; -typedef struct StrAccum StrAccum; -typedef struct Table Table; -typedef struct TableLock TableLock; -typedef struct Token Token; -typedef struct Trigger Trigger; -typedef struct TriggerPrg TriggerPrg; -typedef struct TriggerStep TriggerStep; -typedef struct UnpackedRecord UnpackedRecord; -typedef struct VTable VTable; -typedef struct Walker Walker; -typedef struct WherePlan WherePlan; -typedef struct WhereInfo WhereInfo; -typedef struct WhereLevel WhereLevel; - -/* -** Defer sourcing vdbe.h and btree.h until after the "uint8_t" and -** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque -** pointer types (i.e. FuncDef) defined above. -*/ -/************** Include btree.h in the middle of sqliteInt.h *****************/ -/************** Begin file btree.h *******************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the sqlite B-Tree file -** subsystem. See comments in the source code for a detailed description -** of what each interface routine does. -*/ -#ifndef _BTREE_H_ -#define _BTREE_H_ - -/* TODO: This definition is just included so other modules compile. It -** needs to be revisited. -*/ -#define SQLITE_N_BTREE_META 10 - -/* -** If defined as non-zero, auto-vacuum is enabled by default. Otherwise -** it must be turned on for each database using "PRAGMA auto_vacuum = 1". -*/ -#ifndef SQLITE_DEFAULT_AUTOVACUUM -#define SQLITE_DEFAULT_AUTOVACUUM 0 -#endif - -#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */ -#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */ -#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */ - -/* -** Forward declarations of structure -*/ -typedef struct Btree Btree; -typedef struct BtCursor BtCursor; -typedef struct BtShared BtShared; -typedef struct BtreeMutexArray BtreeMutexArray; - -/* -** This structure records all of the Btrees that need to hold -** a mutex before we enter sqlite3VdbeExec(). The Btrees are -** are placed in aBtree[] in order of aBtree[]->pBt. That way, -** we can always lock and unlock them all quickly. -*/ -struct BtreeMutexArray { - int nMutex; - Btree *aBtree[SQLITE_MAX_ATTACHED+1]; -}; - - -SQLITE_PRIVATE int sqlite3BtreeOpen( - const char *zFilename, /* Name of database file to open */ - sqlite3 *db, /* Associated database connection */ - Btree **ppBtree, /* Return open Btree* here */ - int flags, /* Flags */ - int vfsFlags /* Flags passed through to VFS open */ -); - -/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the -** following values. -** -** NOTE: These values must match the corresponding PAGER_ values in -** pager.h. -*/ -#define BTREE_OMIT_JOURNAL 1 /* Do not create or use a rollback journal */ -#define BTREE_NO_READLOCK 2 /* Omit readlocks on readonly files */ -#define BTREE_MEMORY 4 /* This is an in-memory DB */ -#define BTREE_SINGLE 8 /* The file contains at most 1 b-tree */ -#define BTREE_UNORDERED 16 /* Use of a hash implementation is OK */ - -SQLITE_PRIVATE int sqlite3BtreeClose(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeSetSafetyLevel(Btree*,int,int,int); -SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix); -SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); -SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int); -SQLITE_PRIVATE uint32_t sqlite3BtreeLastPage(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree*); -SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int); -SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *); -SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster); -SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*); -SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*); -SQLITE_PRIVATE int sqlite3BtreeRollback(Btree*); -SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree*, int*, int flags); -SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree*); -SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree*); -SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree*); -SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *, int, void(*)(void *)); -SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *pBtree); -SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *pBtree, int iTab, uint8_t isWriteLock); -SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *, int, int); - -SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *); -SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *); -SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *, Btree *); - -SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *); - -/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR -** of the flags shown below. -** -** Every SQLite table must have either BTREE_INTKEY or BTREE_BLOBKEY set. -** With BTREE_INTKEY, the table key is a 64-bit integer and arbitrary data -** is stored in the leaves. (BTREE_INTKEY is used for SQL tables.) With -** BTREE_BLOBKEY, the key is an arbitrary BLOB and no content is stored -** anywhere - the key is the content. (BTREE_BLOBKEY is used for SQL -** indices.) -*/ -#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */ -#define BTREE_BLOBKEY 2 /* Table has keys only - no data */ - -SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree*, int, int*); -SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, int*); -SQLITE_PRIVATE void sqlite3BtreeTripAllCursors(Btree*, int); - -SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *pBtree, int idx, uint32_t *pValue); -SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, uint32_t value); - -/* -** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta -** should be one of the following values. The integer values are assigned -** to constants so that the offset of the corresponding field in an -** SQLite database header may be found using the following formula: -** -** offset = 36 + (idx * 4) -** -** For example, the free-page-count field is located at byte offset 36 of -** the database file header. The incr-vacuum-flag field is located at -** byte offset 64 (== 36+4*7). -*/ -#define BTREE_FREE_PAGE_COUNT 0 -#define BTREE_SCHEMA_VERSION 1 -#define BTREE_FILE_FORMAT 2 -#define BTREE_DEFAULT_CACHE_SIZE 3 -#define BTREE_LARGEST_ROOT_PAGE 4 -#define BTREE_TEXT_ENCODING 5 -#define BTREE_USER_VERSION 6 -#define BTREE_INCR_VACUUM 7 - -SQLITE_PRIVATE int sqlite3BtreeCursor( - Btree*, /* BTree containing table to open */ - int iTable, /* Index of root page */ - int wrFlag, /* 1 for writing. 0 for read-only */ - struct KeyInfo*, /* First argument to compare function */ - BtCursor *pCursor /* Space to write cursor structure */ -); -SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); -SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*); - -SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*); -SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( - BtCursor*, - UnpackedRecord *pUnKey, - i64 intKey, - int bias, - int *pRes -); -SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*, int*); -SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*); -SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey, - const void *pData, int nData, - int nZero, int bias, int seekResult); -SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); -SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeKeySize(BtCursor*, i64 *pSize); -SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor*, uint32_t offset, uint32_t amt, void*); -SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor*, int *pAmt); -SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor*, int *pAmt); -SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor*, uint32_t *pSize); -SQLITE_PRIVATE int sqlite3BtreeData(BtCursor*, uint32_t offset, uint32_t amt, void*); -SQLITE_PRIVATE void sqlite3BtreeSetCachedRowid(BtCursor*, sqlite3_int64); -SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor*); - -SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); -SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); - -SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, uint32_t offset, uint32_t amt, void*); -SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *); -SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *); - -SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBt, int iVersion); - -#ifndef NDEBUG -SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); -#endif - -#ifndef SQLITE_OMIT_BTREECOUNT -SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *, i64 *); -#endif - -#ifdef SQLITE_TEST -SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int); -SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*); -#endif - -#ifndef SQLITE_OMIT_WAL -SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*); -#endif - -/* -** If we are not using shared cache, then there is no need to -** use mutexes to access the BtShared structures. So make the -** Enter and Leave procedures no-ops. -*/ -#ifndef SQLITE_OMIT_SHARED_CACHE -SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*); -SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*); -#else -# define sqlite3BtreeEnter(X) -# define sqlite3BtreeEnterAll(X) -#endif - -#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE -SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*); -SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); -SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*); -SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*); -SQLITE_PRIVATE void sqlite3BtreeMutexArrayEnter(BtreeMutexArray*); -SQLITE_PRIVATE void sqlite3BtreeMutexArrayLeave(BtreeMutexArray*); -SQLITE_PRIVATE void sqlite3BtreeMutexArrayInsert(BtreeMutexArray*, Btree*); -#ifndef NDEBUG -/* These routines are used inside assert() statements only. */ -SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*); -SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*); -#endif -#else - -# define sqlite3BtreeLeave(X) -# define sqlite3BtreeEnterCursor(X) -# define sqlite3BtreeLeaveCursor(X) -# define sqlite3BtreeLeaveAll(X) -# define sqlite3BtreeMutexArrayEnter(X) -# define sqlite3BtreeMutexArrayLeave(X) -# define sqlite3BtreeMutexArrayInsert(X,Y) - -# define sqlite3BtreeHoldsMutex(X) 1 -# define sqlite3BtreeHoldsAllMutexes(X) 1 -#endif - - -#endif /* _BTREE_H_ */ - -/************** End of btree.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include vdbe.h in the middle of sqliteInt.h ******************/ -/************** Begin file vdbe.h ********************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** Header file for the Virtual DataBase Engine (VDBE) -** -** This header defines the interface to the virtual database engine -** or VDBE. The VDBE implements an abstract machine that runs a -** simple program to access and modify the underlying database. -*/ -#ifndef _SQLITE_VDBE_H_ -#define _SQLITE_VDBE_H_ - -/* -** A single VDBE is an opaque structure named "Vdbe". Only routines -** in the source file sqliteVdbe.c are allowed to see the insides -** of this structure. -*/ -typedef struct Vdbe Vdbe; - -/* -** The names of the following types declared in vdbeInt.h are required -** for the VdbeOp definition. -*/ -typedef struct VdbeFunc VdbeFunc; -typedef struct Mem Mem; -typedef struct SubProgram SubProgram; - -/* -** A single instruction of the virtual machine has an opcode -** and as many as three operands. The instruction is recorded -** as an instance of the following structure: -*/ -struct VdbeOp { - uint8_t opcode; /* What operation to perform */ - signed char p4type; /* One of the P4_xxx constants for p4 */ - uint8_t opflags; /* Mask of the OPFLG_* flags in opcodes.h */ - uint8_t p5; /* Fifth parameter is an unsigned character */ - int p1; /* First operand */ - int p2; /* Second parameter (often the jump destination) */ - int p3; /* The third parameter */ - union { /* fourth parameter */ - int i; /* Integer value if p4type==P4_INT32 */ - void *p; /* Generic pointer */ - char *z; /* Pointer to data for string (char array) types */ - i64 *pI64; /* Used when p4type is P4_INT64 */ - double *pReal; /* Used when p4type is P4_REAL */ - FuncDef *pFunc; /* Used when p4type is P4_FUNCDEF */ - VdbeFunc *pVdbeFunc; /* Used when p4type is P4_VDBEFUNC */ - CollSeq *pColl; /* Used when p4type is P4_COLLSEQ */ - Mem *pMem; /* Used when p4type is P4_MEM */ - VTable *pVtab; /* Used when p4type is P4_VTAB */ - KeyInfo *pKeyInfo; /* Used when p4type is P4_KEYINFO */ - int *ai; /* Used when p4type is P4_INTARRAY */ - SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */ - } p4; -#ifdef SQLITE_DEBUG - char *zComment; /* Comment to improve readability */ -#endif -#ifdef VDBE_PROFILE - int cnt; /* Number of times this instruction was executed */ - uint64_t cycles; /* Total time spent executing this instruction */ -#endif -}; -typedef struct VdbeOp VdbeOp; - - -/* -** A sub-routine used to implement a trigger program. -*/ -struct SubProgram { - VdbeOp *aOp; /* Array of opcodes for sub-program */ - int nOp; /* Elements in aOp[] */ - int nMem; /* Number of memory cells required */ - int nCsr; /* Number of cursors required */ - void *token; /* id that may be used to recursive triggers */ - SubProgram *pNext; /* Next sub-program already visited */ -}; - -/* -** A smaller version of VdbeOp used for the VdbeAddOpList() function because -** it takes up less space. -*/ -struct VdbeOpList { - uint8_t opcode; /* What operation to perform */ - signed char p1; /* First operand */ - signed char p2; /* Second parameter (often the jump destination) */ - signed char p3; /* Third parameter */ -}; -typedef struct VdbeOpList VdbeOpList; - -/* -** Allowed values of VdbeOp.p4type -*/ -#define P4_NOTUSED 0 /* The P4 parameter is not used */ -#define P4_DYNAMIC (-1) /* Pointer to a string obtained from sqliteMalloc() */ -#define P4_STATIC (-2) /* Pointer to a static string */ -#define P4_COLLSEQ (-4) /* P4 is a pointer to a CollSeq structure */ -#define P4_FUNCDEF (-5) /* P4 is a pointer to a FuncDef structure */ -#define P4_KEYINFO (-6) /* P4 is a pointer to a KeyInfo structure */ -#define P4_VDBEFUNC (-7) /* P4 is a pointer to a VdbeFunc structure */ -#define P4_MEM (-8) /* P4 is a pointer to a Mem* structure */ -#define P4_TRANSIENT (-9) /* P4 is a pointer to a transient string */ -#define P4_VTAB (-10) /* P4 is a pointer to an sqlite3_vtab structure */ -#define P4_MPRINTF (-11) /* P4 is a string obtained from sqlite3_mprintf() */ -#define P4_REAL (-12) /* P4 is a 64-bit floating point value */ -#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ -#define P4_INT32 (-14) /* P4 is a 32-bit signed integer */ -#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ -#define P4_SUBPROGRAM (-18) /* P4 is a pointer to a SubProgram structure */ - -/* When adding a P4 argument using P4_KEYINFO, a copy of the KeyInfo structure -** is made. That copy is freed when the Vdbe is finalized. But if the -** argument is P4_KEYINFO_HANDOFF, the passed in pointer is used. It still -** gets freed when the Vdbe is finalized so it still should be obtained -** from a single sqliteMalloc(). But no copy is made and the calling -** function should *not* try to free the KeyInfo. -*/ -#define P4_KEYINFO_HANDOFF (-16) -#define P4_KEYINFO_STATIC (-17) - -/* -** The Vdbe.aColName array contains 5n Mem structures, where n is the -** number of columns of data returned by the statement. -*/ -#define COLNAME_NAME 0 -#define COLNAME_DECLTYPE 1 -#define COLNAME_DATABASE 2 -#define COLNAME_TABLE 3 -#define COLNAME_COLUMN 4 -#ifdef SQLITE_ENABLE_COLUMN_METADATA -# define COLNAME_N 5 /* Number of COLNAME_xxx symbols */ -#else -# ifdef SQLITE_OMIT_DECLTYPE -# define COLNAME_N 1 /* Store only the name */ -# else -# define COLNAME_N 2 /* Store the name and decltype */ -# endif -#endif - -/* -** The following macro converts a relative address in the p2 field -** of a VdbeOp structure into a negative number so that -** sqlite3VdbeAddOpList() knows that the address is relative. Calling -** the macro again restores the address. -*/ -#define ADDR(X) (-1-(X)) - -/* -** The makefile scans the vdbe.c source file and creates the "opcodes.h" -** header file that defines a number for each opcode used by the VDBE. -*/ -/************** Include opcodes.h in the middle of vdbe.h ********************/ -/************** Begin file opcodes.h *****************************************/ -/* Automatically generated. Do not edit */ -/* See the mkopcodeh.awk script for details */ -#define OP_Goto 1 -#define OP_Gosub 2 -#define OP_Return 3 -#define OP_Yield 4 -#define OP_HaltIfNull 5 -#define OP_Halt 6 -#define OP_Integer 7 -#define OP_Int64 8 -#define OP_Real 130 /* same as TK_FLOAT */ -#define OP_String8 94 /* same as TK_STRING */ -#define OP_String 9 -#define OP_Null 10 -#define OP_Blob 11 -#define OP_Variable 12 -#define OP_Move 13 -#define OP_Copy 14 -#define OP_SCopy 15 -#define OP_ResultRow 16 -#define OP_Concat 91 /* same as TK_CONCAT */ -#define OP_Add 86 /* same as TK_PLUS */ -#define OP_Subtract 87 /* same as TK_MINUS */ -#define OP_Multiply 88 /* same as TK_STAR */ -#define OP_Divide 89 /* same as TK_SLASH */ -#define OP_Remainder 90 /* same as TK_REM */ -#define OP_CollSeq 17 -#define OP_Function 18 -#define OP_BitAnd 82 /* same as TK_BITAND */ -#define OP_BitOr 83 /* same as TK_BITOR */ -#define OP_ShiftLeft 84 /* same as TK_LSHIFT */ -#define OP_ShiftRight 85 /* same as TK_RSHIFT */ -#define OP_AddImm 20 -#define OP_MustBeInt 21 -#define OP_RealAffinity 22 -#define OP_ToText 141 /* same as TK_TO_TEXT */ -#define OP_ToBlob 142 /* same as TK_TO_BLOB */ -#define OP_ToNumeric 143 /* same as TK_TO_NUMERIC*/ -#define OP_ToInt 144 /* same as TK_TO_INT */ -#define OP_ToReal 145 /* same as TK_TO_REAL */ -#define OP_Eq 76 /* same as TK_EQ */ -#define OP_Ne 75 /* same as TK_NE */ -#define OP_Lt 79 /* same as TK_LT */ -#define OP_Le 78 /* same as TK_LE */ -#define OP_Gt 77 /* same as TK_GT */ -#define OP_Ge 80 /* same as TK_GE */ -#define OP_Permutation 23 -#define OP_Compare 24 -#define OP_Jump 25 -#define OP_And 69 /* same as TK_AND */ -#define OP_Or 68 /* same as TK_OR */ -#define OP_Not 19 /* same as TK_NOT */ -#define OP_BitNot 93 /* same as TK_BITNOT */ -#define OP_If 26 -#define OP_IfNot 27 -#define OP_IsNull 73 /* same as TK_ISNULL */ -#define OP_NotNull 74 /* same as TK_NOTNULL */ -#define OP_Column 28 -#define OP_Affinity 29 -#define OP_MakeRecord 30 -#define OP_Count 31 -#define OP_Savepoint 32 -#define OP_AutoCommit 33 -#define OP_Transaction 34 -#define OP_ReadCookie 35 -#define OP_SetCookie 36 -#define OP_VerifyCookie 37 -#define OP_OpenRead 38 -#define OP_OpenWrite 39 -#define OP_OpenAutoindex 40 -#define OP_OpenEphemeral 41 -#define OP_OpenPseudo 42 -#define OP_Close 43 -#define OP_SeekLt 44 -#define OP_SeekLe 45 -#define OP_SeekGe 46 -#define OP_SeekGt 47 -#define OP_Seek 48 -#define OP_NotFound 49 -#define OP_Found 50 -#define OP_IsUnique 51 -#define OP_NotExists 52 -#define OP_Sequence 53 -#define OP_NewRowid 54 -#define OP_Insert 55 -#define OP_InsertInt 56 -#define OP_Delete 57 -#define OP_ResetCount 58 -#define OP_RowKey 59 -#define OP_RowData 60 -#define OP_Rowid 61 -#define OP_NullRow 62 -#define OP_Last 63 -#define OP_Sort 64 -#define OP_Rewind 65 -#define OP_Prev 66 -#define OP_Next 67 -#define OP_IdxInsert 70 -#define OP_IdxDelete 71 -#define OP_IdxRowid 72 -#define OP_IdxLT 81 -#define OP_IdxGE 92 -#define OP_Destroy 95 -#define OP_Clear 96 -#define OP_CreateIndex 97 -#define OP_CreateTable 98 -#define OP_ParseSchema 99 -#define OP_LoadAnalysis 100 -#define OP_DropTable 101 -#define OP_DropIndex 102 -#define OP_DropTrigger 103 -#define OP_IntegrityCk 104 -#define OP_RowSetAdd 105 -#define OP_RowSetRead 106 -#define OP_RowSetTest 107 -#define OP_Program 108 -#define OP_Param 109 -#define OP_FkCounter 110 -#define OP_FkIfZero 111 -#define OP_MemMax 112 -#define OP_IfPos 113 -#define OP_IfNeg 114 -#define OP_IfZero 115 -#define OP_AggStep 116 -#define OP_AggFinal 117 -#define OP_Checkpoint 118 -#define OP_JournalMode 119 -#define OP_Vacuum 120 -#define OP_IncrVacuum 121 -#define OP_Expire 122 -#define OP_TableLock 123 -#define OP_VBegin 124 -#define OP_VCreate 125 -#define OP_VDestroy 126 -#define OP_VOpen 127 -#define OP_VFilter 128 -#define OP_VColumn 129 -#define OP_VNext 131 -#define OP_VRename 132 -#define OP_VUpdate 133 -#define OP_Pagecount 134 -#define OP_MaxPgcnt 135 -#define OP_Trace 136 -#define OP_Noop 137 -#define OP_Explain 138 - -/* The following opcode values are never used */ -#define OP_NotUsed_139 139 -#define OP_NotUsed_140 140 - - -/* Properties such as "out2" or "jump" that are specified in -** comments following the "case" for each opcode in the vdbe.c -** are encoded into bitvectors as follows: -*/ -#define OPFLG_JUMP 0x0001 /* jump: P2 holds jmp target */ -#define OPFLG_OUT2_PRERELEASE 0x0002 /* out2-prerelease: */ -#define OPFLG_IN1 0x0004 /* in1: P1 is an input */ -#define OPFLG_IN2 0x0008 /* in2: P2 is an input */ -#define OPFLG_IN3 0x0010 /* in3: P3 is an input */ -#define OPFLG_OUT2 0x0020 /* out2: P2 is an output */ -#define OPFLG_OUT3 0x0040 /* out3: P3 is an output */ -#define OPFLG_INITIALIZER {\ -/* 0 */ 0x00, 0x01, 0x05, 0x04, 0x04, 0x10, 0x00, 0x02,\ -/* 8 */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x24, 0x24,\ -/* 16 */ 0x00, 0x00, 0x00, 0x24, 0x04, 0x05, 0x04, 0x00,\ -/* 24 */ 0x00, 0x01, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02,\ -/* 32 */ 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00,\ -/* 40 */ 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11,\ -/* 48 */ 0x08, 0x11, 0x11, 0x11, 0x11, 0x02, 0x02, 0x00,\ -/* 56 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01,\ -/* 64 */ 0x01, 0x01, 0x01, 0x01, 0x4c, 0x4c, 0x08, 0x00,\ -/* 72 */ 0x02, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\ -/* 80 */ 0x15, 0x01, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,\ -/* 88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x01, 0x24, 0x02, 0x02,\ -/* 96 */ 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 104 */ 0x00, 0x0c, 0x45, 0x15, 0x01, 0x02, 0x00, 0x01,\ -/* 112 */ 0x08, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02,\ -/* 120 */ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 128 */ 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x02, 0x02,\ -/* 136 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04,\ -/* 144 */ 0x04, 0x04,} - -/************** End of opcodes.h *********************************************/ -/************** Continuing where we left off in vdbe.h ***********************/ - -/* -** Prototypes for the VDBE interface. See comments on the implementation -** for a description of what each of these routines does. -*/ -SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(sqlite3*); -SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); -SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp); -SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); -SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); -SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3); -SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, uint8_t P5); -SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); -SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe*, int addr, int N); -SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); -SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); -SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); -SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeDeleteObject(sqlite3*,Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,int,int,int,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int); -SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*); -#ifdef SQLITE_DEBUG -SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int); -SQLITE_PRIVATE void sqlite3VdbeTrace(Vdbe*,FILE*); -#endif -SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe*); -SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe*,int); -SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, void(*)(void*)); -SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*); -SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, int); -SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); -SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); -SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetValue(Vdbe*, int, uint8_t); -SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe*, int); -#ifndef SQLITE_OMIT_TRACE -SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*); -#endif - -SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,char*,int); -SQLITE_PRIVATE void sqlite3VdbeDeleteUnpackedRecord(UnpackedRecord*); -SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); - -#ifndef SQLITE_OMIT_TRIGGER -SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); -#endif - - -#ifndef NDEBUG -SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe*, const char*, ...); -# define VdbeComment(X) sqlite3VdbeComment X -SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); -# define VdbeNoopComment(X) sqlite3VdbeNoopComment X -#else -# define VdbeComment(X) -# define VdbeNoopComment(X) -#endif - -#endif - -/************** End of vdbe.h ************************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include pager.h in the middle of sqliteInt.h *****************/ -/************** Begin file pager.h *******************************************/ -/* -** 2001 September 15 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the sqlite page cache -** subsystem. The page cache subsystem reads and writes a file a page -** at a time and provides a journal for rollback. -*/ - -#ifndef _PAGER_H_ -#define _PAGER_H_ - -/* -** Default maximum size for persistent journal files. A negative -** value means no limit. This value may be overridden using the -** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit". -*/ -#ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -#define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1 -#endif - -/* -** The type used to represent a page number. The first page in a file -** is called page 1. 0 is used to represent "not a page". -*/ -typedef uint32_t Pgno; - -/* -** Each open file is managed by a separate instance of the "Pager" structure. -*/ -typedef struct Pager Pager; - -/* -** Handle type for pages. -*/ -typedef struct PgHdr DbPage; - -/* -** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is -** reserved for working around a windows/posix incompatibility). It is -** used in the journal to signify that the remainder of the journal file -** is devoted to storing a master journal name - there are no more pages to -** roll back. See comments for function writeMasterJournal() in pager.c -** for details. -*/ -#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) - -/* -** Allowed values for the flags parameter to sqlite3PagerOpen(). -** -** NOTE: These values must match the corresponding BTREE_ values in btree.h. -*/ -#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */ -#define PAGER_NO_READLOCK 0x0002 /* Omit readlocks on readonly files */ -#define PAGER_MEMORY 0x0004 /* In-memory database */ - -/* -** Valid values for the second argument to sqlite3PagerLockingMode(). -*/ -#define PAGER_LOCKINGMODE_QUERY -1 -#define PAGER_LOCKINGMODE_NORMAL 0 -#define PAGER_LOCKINGMODE_EXCLUSIVE 1 - -/* -** Numeric constants that encode the journalmode. -*/ -#define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */ -#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */ -#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */ -#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */ -#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */ -#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */ -#define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */ - -/* -** The remainder of this file contains the declarations of the functions -** that make up the Pager sub-system API. See source code comments for -** a detailed description of each routine. -*/ - -/* Open and close a Pager connection. */ -SQLITE_PRIVATE int sqlite3PagerOpen( - sqlite3_vfs*, - Pager **ppPager, - const char*, - int, - int, - int, - void(*)(DbPage*) -); -SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); - -/* Functions used to configure a Pager object. */ -SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *); -SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, uint32_t*, int); -SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int); -SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int); -SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager*,int,int,int); -SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int); -SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *, int); -SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager*); -SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager*); -SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64); -SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*); - -/* Functions used to obtain and release page references. */ -SQLITE_PRIVATE int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); -#define sqlite3PagerGet(A,B,C) sqlite3PagerAcquire(A,B,C,0) -SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); -SQLITE_PRIVATE void sqlite3PagerRef(DbPage*); -SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*); - -/* Operations on page references. */ -SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*); -SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*); -SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); -SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*); -SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *); -SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *); - -/* Functions used to manage pager transactions and savepoints. */ -SQLITE_PRIVATE void sqlite3PagerPagecount(Pager*, int*); -SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int); -SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); -SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager*); -SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*); -SQLITE_PRIVATE int sqlite3PagerRollback(Pager*); -SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n); -SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); -SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager); - -SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager); -SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); -SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager); - -/* Functions used to query pager state and configuration. */ -SQLITE_PRIVATE uint8_t sqlite3PagerIsreadonly(Pager*); -SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*); -SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager*); -SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager*); -SQLITE_PRIVATE const sqlite3_vfs *sqlite3PagerVfs(Pager*); -SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*); -SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); -SQLITE_PRIVATE int sqlite3PagerNosync(Pager*); -SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); -SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); - -/* Functions used to truncate the database file. */ -SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno); - -#if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL) -SQLITE_PRIVATE void *sqlite3PagerCodec(DbPage *); -#endif - -/* Functions to support testing and debugging. */ -#if !defined(NDEBUG) || defined(SQLITE_TEST) -SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*); -SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*); -#endif -#ifdef SQLITE_TEST -SQLITE_PRIVATE int *sqlite3PagerStats(Pager*); -SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); -void disable_simulated_io_errors(void); -void enable_simulated_io_errors(void); -#else -# define disable_simulated_io_errors() -# define enable_simulated_io_errors() -#endif - -#endif /* _PAGER_H_ */ - -/************** End of pager.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include pcache.h in the middle of sqliteInt.h ****************/ -/************** Begin file pcache.h ******************************************/ -/* -** 2008 August 05 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** This header file defines the interface that the sqlite page cache -** subsystem. -*/ - -#ifndef _PCACHE_H_ - -typedef struct PgHdr PgHdr; -typedef struct PCache PCache; - -/* -** Every page in the cache is controlled by an instance of the following -** structure. -*/ -struct PgHdr { - void *pData; /* Content of this page */ - void *pExtra; /* Extra content */ - PgHdr *pDirty; /* Transient list of dirty pages */ - Pgno pgno; /* Page number for this page */ - Pager *pPager; /* The pager this page is part of */ -#ifdef SQLITE_CHECK_PAGES - uint32_t pageHash; /* Hash of page content */ -#endif - uint16_t flags; /* PGHDR flags defined below */ - - /********************************************************************** - ** Elements above are public. All that follows is private to pcache.c - ** and should not be accessed by other modules. - */ - i16 nRef; /* Number of users of this page */ - PCache *pCache; /* Cache that owns this page */ - - PgHdr *pDirtyNext; /* Next element in list of dirty pages */ - PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */ -}; - -/* Bit values for PgHdr.flags */ -#define PGHDR_DIRTY 0x002 /* Page has changed */ -#define PGHDR_NEED_SYNC 0x004 /* Fsync the rollback journal before - ** writing this page to the database */ -#define PGHDR_NEED_READ 0x008 /* Content is unread */ -#define PGHDR_REUSE_UNLIKELY 0x010 /* A hint that reuse is unlikely */ -#define PGHDR_DONT_WRITE 0x020 /* Do not write content to disk */ - -/* Initialize and shutdown the page cache subsystem */ -SQLITE_PRIVATE int sqlite3PcacheInitialize(void); -SQLITE_PRIVATE void sqlite3PcacheShutdown(void); - -/* Page cache buffer management: -** These routines implement SQLITE_CONFIG_PAGECACHE. -*/ -SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *, int sz, int n); - -/* Create a new pager cache. -** Under memory stress, invoke xStress to try to make pages clean. -** Only clean and unpinned pages can be reclaimed. -*/ -SQLITE_PRIVATE void sqlite3PcacheOpen( - int szPage, /* Size of every page */ - int szExtra, /* Extra space associated with each page */ - int bPurgeable, /* True if pages are on backing store */ - int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */ - void *pStress, /* Argument to xStress */ - PCache *pToInit /* Preallocated space for the PCache */ -); - -/* Modify the page-size after the cache has been created. */ -SQLITE_PRIVATE void sqlite3PcacheSetPageSize(PCache *, int); - -/* Return the size in bytes of a PCache object. Used to preallocate -** storage space. -*/ -SQLITE_PRIVATE int sqlite3PcacheSize(void); - -/* One release per successful fetch. Page is pinned until released. -** Reference counted. -*/ -SQLITE_PRIVATE int sqlite3PcacheFetch(PCache*, Pgno, int createFlag, PgHdr**); -SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr*); - -SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache */ -SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */ -SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */ -SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */ - -/* Change a page number. Used by incr-vacuum. */ -SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno); - -/* Remove all pages with pgno>x. Reset the cache if x==0 */ -SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache*, Pgno x); - -/* Get a list of all dirty pages in the cache, sorted by page number */ -SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache*); - -/* Reset and close the cache object */ -SQLITE_PRIVATE void sqlite3PcacheClose(PCache*); - -/* Clear flags from pages of the page cache */ -SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *); - -/* Discard the contents of the cache */ -SQLITE_PRIVATE void sqlite3PcacheClear(PCache*); - -/* Return the total number of outstanding page references */ -SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache*); - -/* Increment the reference count of an existing page */ -SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr*); - -SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr*); - -/* Return the total number of pages stored in the cache */ -SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*); - -#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) -/* Iterate through all dirty pages currently stored in the cache. This -** interface is only available if SQLITE_CHECK_PAGES is defined when the -** library is built. -*/ -SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)); -#endif - -/* Set and get the suggested cache-size for the specified pager-cache. -** -** If no global maximum is configured, then the system attempts to limit -** the total number of pages cached by purgeable pager-caches to the sum -** of the suggested cache-sizes. -*/ -SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int); -#ifdef SQLITE_TEST -SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); -#endif - -#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT -/* Try to return memory used by the pcache module to the main memory heap */ -SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int); -#endif - -#ifdef SQLITE_TEST -SQLITE_PRIVATE void sqlite3PcacheStats(int*,int*,int*,int*); -#endif - -SQLITE_PRIVATE void sqlite3PCacheSetDefault(void); - -#endif /* _PCACHE_H_ */ - -/************** End of pcache.h **********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ - -/************** Include os.h in the middle of sqliteInt.h ********************/ -/************** Begin file os.h **********************************************/ -/* -** 2001 September 16 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This header file (together with is companion C source-code file -** "os.c") attempt to abstract the underlying operating system so that -** the SQLite library will work on both POSIX and windows systems. -** -** This header file is #include-ed by sqliteInt.h and thus ends up -** being included by every source file. -*/ -#ifndef _SQLITE_OS_H_ -#define _SQLITE_OS_H_ - -/* -** Figure out if we are dealing with Unix, Windows, or some other -** operating system. After the following block of preprocess macros, -** all of SQLITE_OS_UNIX, SQLITE_OS_WIN, SQLITE_OS_OS2, and SQLITE_OS_OTHER -** will defined to either 1 or 0. One of the four will be 1. The other -** three will be 0. -*/ -#if defined(SQLITE_OS_OTHER) -# if SQLITE_OS_OTHER==1 -# undef SQLITE_OS_UNIX -# define SQLITE_OS_UNIX 0 -# undef SQLITE_OS_WIN -# define SQLITE_OS_WIN 0 -# undef SQLITE_OS_OS2 -# define SQLITE_OS_OS2 0 -# else -# undef SQLITE_OS_OTHER -# endif -#endif -#if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER) -# define SQLITE_OS_OTHER 0 -# ifndef SQLITE_OS_WIN -# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) -# define SQLITE_OS_WIN 1 -# define SQLITE_OS_UNIX 0 -# define SQLITE_OS_OS2 0 -# elif defined(__EMX__) || defined(_OS2) || defined(OS2) || defined(_OS2_) || defined(__OS2__) -# define SQLITE_OS_WIN 0 -# define SQLITE_OS_UNIX 0 -# define SQLITE_OS_OS2 1 -# else -# define SQLITE_OS_WIN 0 -# define SQLITE_OS_UNIX 1 -# define SQLITE_OS_OS2 0 -# endif -# else -# define SQLITE_OS_UNIX 0 -# define SQLITE_OS_OS2 0 -# endif -#else -# ifndef SQLITE_OS_WIN -# define SQLITE_OS_WIN 0 -# endif -#endif - -/* -** Determine if we are dealing with WindowsCE - which has a much -** reduced API. -*/ -#if defined(_WIN32_WCE) -# define SQLITE_OS_WINCE 1 -#else -# define SQLITE_OS_WINCE 0 -#endif - - -/* -** Define the maximum size of a temporary filename -*/ -#if SQLITE_OS_WIN -# include -# define SQLITE_TEMPNAME_SIZE (MAX_PATH+50) -#elif SQLITE_OS_OS2 -# if (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 3) && defined(OS2_HIGH_MEMORY) -# include /* has to be included before os2.h for linking to work */ -# endif -# define INCL_DOSDATETIME -# define INCL_DOSFILEMGR -# define INCL_DOSERRORS -# define INCL_DOSMISC -# define INCL_DOSPROCESS -# define INCL_DOSMODULEMGR -# define INCL_DOSSEMAPHORES -# include -# include -# define SQLITE_TEMPNAME_SIZE (CCHMAXPATHCOMP) -#else -# define SQLITE_TEMPNAME_SIZE 200 -#endif - -/* If the SET_FULLSYNC macro is not defined above, then make it -** a no-op -*/ -#ifndef SET_FULLSYNC -# define SET_FULLSYNC(x,y) -#endif - -/* -** The default size of a disk sector -*/ -#ifndef SQLITE_DEFAULT_SECTOR_SIZE -# define SQLITE_DEFAULT_SECTOR_SIZE 512 -#endif - -/* -** Temporary files are named starting with this prefix followed by 16 random -** alphanumeric characters, and no file extension. They are stored in the -** OS's standard temporary file directory, and are deleted prior to exit. -** If sqlite is being embedded in another program, you may wish to change the -** prefix to reflect your program's name, so that if your program exits -** prematurely, old temporary files can be easily identified. This can be done -** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line. -** -** 2006-10-31: The default prefix used to be "sqlite_". But then -** Mcafee started using SQLite in their anti-virus product and it -** started putting files with the "sqlite" name in the c:/temp folder. -** This annoyed many windows users. Those users would then do a -** Google search for "sqlite", find the telephone numbers of the -** developers and call to wake them up at night and complain. -** For this reason, the default name prefix is changed to be "sqlite" -** spelled backwards. So the temp files are still identified, but -** anybody smart enough to figure out the code is also likely smart -** enough to know that calling the developer will not help get rid -** of the file. -*/ -#ifndef SQLITE_TEMP_FILE_PREFIX -# define SQLITE_TEMP_FILE_PREFIX "etilqs_" -#endif - -/* -** The following values may be passed as the second argument to -** sqlite3OsLock(). The various locks exhibit the following semantics: -** -** SHARED: Any number of processes may hold a SHARED lock simultaneously. -** RESERVED: A single process may hold a RESERVED lock on a file at -** any time. Other processes may hold and obtain new SHARED locks. -** PENDING: A single process may hold a PENDING lock on a file at -** any one time. Existing SHARED locks may persist, but no new -** SHARED locks may be obtained by other processes. -** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks. -** -** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a -** process that requests an EXCLUSIVE lock may actually obtain a PENDING -** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to -** sqlite3OsLock(). -*/ -#define NO_LOCK 0 -#define SHARED_LOCK 1 -#define RESERVED_LOCK 2 -#define PENDING_LOCK 3 -#define EXCLUSIVE_LOCK 4 - -/* -** File Locking Notes: (Mostly about windows but also some info for Unix) -** -** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because -** those functions are not available. So we use only LockFile() and -** UnlockFile(). -** -** LockFile() prevents not just writing but also reading by other processes. -** A SHARED_LOCK is obtained by locking a single randomly-chosen -** byte out of a specific range of bytes. The lock byte is obtained at -** random so two separate readers can probably access the file at the -** same time, unless they are unlucky and choose the same lock byte. -** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range. -** There can only be one writer. A RESERVED_LOCK is obtained by locking -** a single byte of the file that is designated as the reserved lock byte. -** A PENDING_LOCK is obtained by locking a designated byte different from -** the RESERVED_LOCK byte. -** -** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available, -** which means we can use reader/writer locks. When reader/writer locks -** are used, the lock is placed on the same range of bytes that is used -** for probabilistic locking in Win95/98/ME. Hence, the locking scheme -** will support two or more Win95 readers or two or more WinNT readers. -** But a single Win95 reader will lock out all WinNT readers and a single -** WinNT reader will lock out all other Win95 readers. -** -** The following #defines specify the range of bytes used for locking. -** SHARED_SIZE is the number of bytes available in the pool from which -** a random byte is selected for a shared lock. The pool of bytes for -** shared locks begins at SHARED_FIRST. -** -** The same locking strategy and -** byte ranges are used for Unix. This leaves open the possiblity of having -** clients on win95, winNT, and unix all talking to the same shared file -** and all locking correctly. To do so would require that samba (or whatever -** tool is being used for file sharing) implements locks correctly between -** windows and unix. I'm guessing that isn't likely to happen, but by -** using the same locking range we are at least open to the possibility. -** -** Locking in windows is manditory. For this reason, we cannot store -** actual data in the bytes used for locking. The pager never allocates -** the pages involved in locking therefore. SHARED_SIZE is selected so -** that all locks will fit on a single page even at the minimum page size. -** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE -** is set high so that we don't have to allocate an unused page except -** for very large databases. But one should test the page skipping logic -** by setting PENDING_BYTE low and running the entire regression suite. -** -** Changing the value of PENDING_BYTE results in a subtly incompatible -** file format. Depending on how it is changed, you might not notice -** the incompatibility right away, even running a full regression test. -** The default location of PENDING_BYTE is the first byte past the -** 1GB boundary. -** -*/ -#ifdef SQLITE_OMIT_WSD -# define PENDING_BYTE (0x40000000) -#else -# define PENDING_BYTE sqlite3PendingByte -#endif -#define RESERVED_BYTE (PENDING_BYTE+1) -#define SHARED_FIRST (PENDING_BYTE+2) -#define SHARED_SIZE 510 - -/* -** Wrapper around OS specific sqlite3_os_init() function. -*/ -SQLITE_PRIVATE int sqlite3OsInit(void); - -/* -** Functions for accessing sqlite3_file methods -*/ -SQLITE_PRIVATE int sqlite3OsClose(sqlite3_file*); -SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); -SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset); -SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size); -SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int); -SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize); -SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int); -SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int); -SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut); -SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*); -#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0 -SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id); -SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id); -SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **); -SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int); -SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id); -SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int); - -/* -** Functions for accessing sqlite3_vfs methods -*/ -SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *); -SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int); -SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut); -SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *); -#ifndef SQLITE_OMIT_LOAD_EXTENSION -SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *); -SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *); -SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void); -SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *); -#endif /* SQLITE_OMIT_LOAD_EXTENSION */ -SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *); -SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int); -SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*); - -/* -** Convenience functions for opening and closing files using -** sqlite3_malloc() to obtain space for the file-handle structure. -*/ -SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); -SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *); - -#endif /* _SQLITE_OS_H_ */ - -/************** End of os.h **************************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ -/************** Include mutex.h in the middle of sqliteInt.h *****************/ -/************** Begin file mutex.h *******************************************/ -/* -** 2007 August 28 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** This file contains the common header for all mutex implementations. -** The sqliteInt.h header #includes this file so that it is available -** to all source files. We break it out in an effort to keep the code -** better organized. -** -** NOTE: source files should *not* #include this header file directly. -** Source files should #include the sqliteInt.h file and let that file -** include this one indirectly. -*/ - - -/* -** Figure out what version of the code to use. The choices are -** -** SQLITE_MUTEX_OMIT No mutex logic. Not even stubs. The -** mutexes implemention cannot be overridden -** at start-time. -** -** SQLITE_MUTEX_NOOP For single-threaded applications. No -** mutual exclusion is provided. But this -** implementation can be overridden at -** start-time. -** -** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix. -** -** SQLITE_MUTEX_W32 For multi-threaded applications on Win32. -** -** SQLITE_MUTEX_OS2 For multi-threaded applications on OS/2. -*/ -#if !SQLITE_THREADSAFE -# define SQLITE_MUTEX_OMIT -#endif -#if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP) -# if SQLITE_OS_UNIX -# define SQLITE_MUTEX_PTHREADS -# elif SQLITE_OS_WIN -# define SQLITE_MUTEX_W32 -# elif SQLITE_OS_OS2 -# define SQLITE_MUTEX_OS2 -# else -# define SQLITE_MUTEX_NOOP -# endif -#endif - -#ifdef SQLITE_MUTEX_OMIT -/* -** If this is a no-op implementation, implement everything as macros. -*/ -#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) -#define sqlite3_mutex_free(X) -#define sqlite3_mutex_enter(X) -#define sqlite3_mutex_try(X) SQLITE_OK -#define sqlite3_mutex_leave(X) -#define sqlite3_mutex_held(X) ((void)(X),1) -#define sqlite3_mutex_notheld(X) ((void)(X),1) -#define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8) -#define sqlite3MutexInit() SQLITE_OK -#define sqlite3MutexEnd() -#endif /* defined(SQLITE_MUTEX_OMIT) */ - -/************** End of mutex.h ***********************************************/ -/************** Continuing where we left off in sqliteInt.h ******************/ - - -/* -** Each database file to be accessed by the system is an instance -** of the following structure. There are normally two of these structures -** in the sqlite.aDb[] array. aDb[0] is the main database file and -** aDb[1] is the database file used to hold temporary tables. Additional -** databases may be attached. -*/ -struct Db { - char *zName; /* Name of this database */ - Btree *pBt; /* The B*Tree structure for this database file */ - uint8_t inTrans; /* 0: not writable. 1: Transaction. 2: Checkpoint */ - uint8_t safety_level; /* How aggressive at syncing data to disk */ - Schema *pSchema; /* Pointer to database schema (possibly shared) */ -}; - -/* -** An instance of the following structure stores a database schema. -*/ -struct Schema { - int schema_cookie; /* Database schema version number for this file */ - Hash tblHash; /* All tables indexed by name */ - Hash idxHash; /* All (named) indices indexed by name */ - Hash trigHash; /* All triggers indexed by name */ - Hash fkeyHash; /* All foreign keys by referenced table name */ - Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */ - uint8_t file_format; /* Schema format version for this file */ - uint8_t enc; /* Text encoding used by this database */ - uint16_t flags; /* Flags associated with this schema */ - int cache_size; /* Number of pages to use in the cache */ -}; - -/* -** These macros can be used to test, set, or clear bits in the -** Db.pSchema->flags field. -*/ -#define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))==(P)) -#define DbHasAnyProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))!=0) -#define DbSetProperty(D,I,P) (D)->aDb[I].pSchema->flags|=(P) -#define DbClearProperty(D,I,P) (D)->aDb[I].pSchema->flags&=~(P) - -/* -** Allowed values for the DB.pSchema->flags field. -** -** The DB_SchemaLoaded flag is set after the database schema has been -** read into internal hash tables. -** -** DB_UnresetViews means that one or more views have column names that -** have been filled out. If the schema changes, these column names might -** changes and so the view will need to be reset. -*/ -#define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ -#define DB_UnresetViews 0x0002 /* Some views have defined column names */ -#define DB_Empty 0x0004 /* The file is empty (length 0 bytes) */ - -/* -** The number of different kinds of things that can be limited -** using the sqlite3_limit() interface. -*/ -#define SQLITE_N_LIMIT (SQLITE_LIMIT_TRIGGER_DEPTH+1) - -/* -** Lookaside malloc is a set of fixed-size buffers that can be used -** to satisfy small transient memory allocation requests for objects -** associated with a particular database connection. The use of -** lookaside malloc provides a significant performance enhancement -** (approx 10%) by avoiding numerous malloc/free requests while parsing -** SQL statements. -** -** The Lookaside structure holds configuration information about the -** lookaside malloc subsystem. Each available memory allocation in -** the lookaside subsystem is stored on a linked list of LookasideSlot -** objects. -** -** Lookaside allocations are only allowed for objects that are associated -** with a particular database connection. Hence, schema information cannot -** be stored in lookaside because in shared cache mode the schema information -** is shared by multiple database connections. Therefore, while parsing -** schema information, the Lookaside.bEnabled flag is cleared so that -** lookaside allocations are not used to construct the schema objects. -*/ -struct Lookaside { - uint16_t sz; /* Size of each buffer in bytes */ - uint8_t bEnabled; /* False to disable new lookaside allocations */ - uint8_t bMalloced; /* True if pStart obtained from sqlite3_malloc() */ - int nOut; /* Number of buffers currently checked out */ - int mxOut; /* Highwater mark for nOut */ - int anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ - LookasideSlot *pFree; /* List of available buffers */ - void *pStart; /* First byte of available memory space */ - void *pEnd; /* First byte past end of available space */ -}; -struct LookasideSlot { - LookasideSlot *pNext; /* Next buffer in the list of free buffers */ -}; - -/* -** A hash table for function definitions. -** -** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. -** Collisions are on the FuncDef.pHash chain. -*/ -struct FuncDefHash { - FuncDef *a[23]; /* Hash table for functions */ -}; - -/* -** Each database connection is an instance of the following structure. -** -** The sqlite.lastRowid records the last insert rowid generated by an -** insert statement. Inserts on views do not affect its value. Each -** trigger has its own context, so that lastRowid can be updated inside -** triggers as usual. The previous value will be restored once the trigger -** exits. Upon entering a before or instead of trigger, lastRowid is no -** longer (since after version 2.8.12) reset to -1. -** -** The sqlite.nChange does not count changes within triggers and keeps no -** context. It is reset at start of sqlite3_exec. -** The sqlite.lsChange represents the number of changes made by the last -** insert, update, or delete statement. It remains constant throughout the -** length of a statement and is then updated by OP_SetCounts. It keeps a -** context stack just like lastRowid so that the count of changes -** within a trigger is not seen outside the trigger. Changes to views do not -** affect the value of lsChange. -** The sqlite.csChange keeps track of the number of current changes (since -** the last statement) and is used to update sqlite_lsChange. -** -** The member variables sqlite.errCode, sqlite.zErrMsg and sqlite.zErrMsg16 -** store the most recent error code and, if applicable, string. The -** internal function sqlite3Error() is used to set these variables -** consistently. -*/ -struct sqlite3 { - sqlite3_vfs *pVfs; /* OS Interface */ - int nDb; /* Number of backends currently in use */ - Db *aDb; /* All backends */ - int flags; /* Miscellaneous flags. See below */ - int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ - int errCode; /* Most recent error code (SQLITE_*) */ - int errMask; /* & result codes with this before returning */ - uint8_t autoCommit; /* The auto-commit flag. */ - uint8_t temp_store; /* 1: file 2: memory 0: default */ - uint8_t mallocFailed; /* True if we have seen a malloc failure */ - uint8_t dfltLockMode; /* Default locking-mode for attached dbs */ - signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ - uint8_t suppressErr; /* Do not issue error messages if true */ - int nextPagesize; /* Pagesize after VACUUM if >0 */ - int nTable; /* Number of tables in the database */ - CollSeq *pDfltColl; /* The default collating sequence (BINARY) */ - i64 lastRowid; /* ROWID of most recent insert (see above) */ - uint32_t magic; /* Magic number for detect library misuse */ - int nChange; /* Value returned by sqlite3_changes() */ - int nTotalChange; /* Value returned by sqlite3_total_changes() */ - sqlite3_mutex *mutex; /* Connection mutex */ - int aLimit[SQLITE_N_LIMIT]; /* Limits */ - struct sqlite3InitInfo { /* Information used during initialization */ - int iDb; /* When back is being initialized */ - int newTnum; /* Rootpage of table being initialized */ - uint8_t busy; /* TRUE if currently initializing */ - uint8_t orphanTrigger; /* Last statement is orphaned TEMP trigger */ - } init; - int nExtension; /* Number of loaded extensions */ - void **aExtension; /* Array of shared library handles */ - struct Vdbe *pVdbe; /* List of active virtual machines */ - int activeVdbeCnt; /* Number of VDBEs currently executing */ - int writeVdbeCnt; /* Number of active VDBEs that are writing */ - int vdbeExecCnt; /* Number of nested calls to VdbeExec() */ - void (*xTrace)(void*,const char*); /* Trace function */ - void *pTraceArg; /* Argument to the trace function */ - void (*xProfile)(void*,const char*,uint64_t); /* Profiling function */ - void *pProfileArg; /* Argument to profile function */ - void *pCommitArg; /* Argument to xCommitCallback() */ - int (*xCommitCallback)(void*); /* Invoked at every commit. */ - void *pRollbackArg; /* Argument to xRollbackCallback() */ - void (*xRollbackCallback)(void*); /* Invoked at every commit. */ - void *pUpdateArg; - void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); -#ifndef SQLITE_OMIT_WAL - int (*xWalCallback)(void *, sqlite3 *, const char *, int); - void *pWalArg; -#endif - void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*); - void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*); - void *pCollNeededArg; - sqlite3_value *pErr; /* Most recent error message */ - char *zErrMsg; /* Most recent error message (UTF-8 encoded) */ - char *zErrMsg16; /* Most recent error message (UTF-16 encoded) */ - union { - volatile int isInterrupted; /* True if sqlite3_interrupt has been called */ - double notUsed1; /* Spacer */ - } u1; - Lookaside lookaside; /* Lookaside malloc configuration */ -#ifndef SQLITE_OMIT_AUTHORIZATION - int (*xAuth)(void*,int,const char*,const char*,const char*,const char*); - /* Access authorization function */ - void *pAuthArg; /* 1st argument to the access auth function */ -#endif -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - int (*xProgress)(void *); /* The progress callback */ - void *pProgressArg; /* Argument to the progress callback */ - int nProgressOps; /* Number of opcodes for progress callback */ -#endif -#ifndef SQLITE_OMIT_VIRTUALTABLE - Hash aModule; /* populated by sqlite3_create_module() */ - Table *pVTab; /* vtab with active Connect/Create method */ - VTable **aVTrans; /* Virtual tables with open transactions */ - int nVTrans; /* Allocated size of aVTrans */ - VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ -#endif - FuncDefHash aFunc; /* Hash table of connection functions */ - Hash aCollSeq; /* All collating sequences */ - BusyHandler busyHandler; /* Busy callback */ - int busyTimeout; /* Busy handler timeout, in msec */ - Db aDbStatic[2]; /* Static space for the 2 default backends */ - Savepoint *pSavepoint; /* List of active savepoints */ - int nSavepoint; /* Number of non-transaction savepoints */ - int nStatement; /* Number of nested statement-transactions */ - uint8_t isTransactionSavepoint; /* True if the outermost savepoint is a TS */ - i64 nDeferredCons; /* Net deferred constraints this transaction. */ - int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ - -#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY - /* The following variables are all protected by the STATIC_MASTER - ** mutex, not by sqlite3.mutex. They are used by code in notify.c. - ** - ** When X.pUnlockConnection==Y, that means that X is waiting for Y to - ** unlock so that it can proceed. - ** - ** When X.pBlockingConnection==Y, that means that something that X tried - ** tried to do recently failed with an SQLITE_LOCKED error due to locks - ** held by Y. - */ - sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */ - sqlite3 *pUnlockConnection; /* Connection to watch for unlock */ - void *pUnlockArg; /* Argument to xUnlockNotify */ - void (*xUnlockNotify)(void **, int); /* Unlock notify callback */ - sqlite3 *pNextBlocked; /* Next in list of all blocked connections */ -#endif -}; - -/* -** A macro to discover the encoding of a database. -*/ -#define ENC(db) ((db)->aDb[0].pSchema->enc) - -/* -** Possible values for the sqlite3.flags. -*/ -#define SQLITE_VdbeTrace 0x00000100 /* True to trace VDBE execution */ -#define SQLITE_InternChanges 0x00000200 /* Uncommitted Hash table changes */ -#define SQLITE_FullColNames 0x00000400 /* Show full column names on SELECT */ -#define SQLITE_ShortColNames 0x00000800 /* Show short columns names */ -#define SQLITE_CountRows 0x00001000 /* Count rows changed by INSERT, */ -/* DELETE, or UPDATE and return */ -/* the count using a callback. */ -#define SQLITE_NullCallback 0x00002000 /* Invoke the callback once if the */ -/* result set is empty */ -#define SQLITE_SqlTrace 0x00004000 /* Debug print SQL as it executes */ -#define SQLITE_VdbeListing 0x00008000 /* Debug listings of VDBE programs */ -#define SQLITE_WriteSchema 0x00010000 /* OK to update SQLITE_MASTER */ -#define SQLITE_NoReadlock 0x00020000 /* Readlocks are omitted when - ** accessing read-only databases */ -#define SQLITE_IgnoreChecks 0x00040000 /* Do not enforce check constraints */ -#define SQLITE_ReadUncommitted 0x0080000 /* For shared-cache mode */ -#define SQLITE_LegacyFileFmt 0x00100000 /* Create new databases in format 1 */ -#define SQLITE_FullFSync 0x00200000 /* Use full fsync on the backend */ -#define SQLITE_CkptFullFSync 0x00400000 /* Use full fsync for checkpoint */ -#define SQLITE_RecoveryMode 0x00800000 /* Ignore schema errors */ -#define SQLITE_ReverseOrder 0x01000000 /* Reverse unordered SELECTs */ -#define SQLITE_RecTriggers 0x02000000 /* Enable recursive triggers */ -#define SQLITE_ForeignKeys 0x04000000 /* Enforce foreign key constraints */ -#define SQLITE_AutoIndex 0x08000000 /* Enable automatic indexes */ -#define SQLITE_PreferBuiltin 0x10000000 /* Preference to built-in funcs */ -#define SQLITE_LoadExtension 0x20000000 /* Enable load_extension */ - -/* -** Bits of the sqlite3.flags field that are used by the -** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface. -** These must be the low-order bits of the flags field. -*/ -#define SQLITE_QueryFlattener 0x01 /* Disable query flattening */ -#define SQLITE_ColumnCache 0x02 /* Disable the column cache */ -#define SQLITE_IndexSort 0x04 /* Disable indexes for sorting */ -#define SQLITE_IndexSearch 0x08 /* Disable indexes for searching */ -#define SQLITE_IndexCover 0x10 /* Disable index covering table */ -#define SQLITE_GroupByOrder 0x20 /* Disable GROUPBY cover of ORDERBY */ -#define SQLITE_FactorOutConst 0x40 /* Disable factoring out constants */ -#define SQLITE_OptMask 0xff /* Mask of all disablable opts */ - -/* -** Possible values for the sqlite.magic field. -** The numbers are obtained at random and have no special meaning, other -** than being distinct from one another. -*/ -#define SQLITE_MAGIC_OPEN 0xa029a697 /* Database is open */ -#define SQLITE_MAGIC_CLOSED 0x9f3c2d33 /* Database is closed */ -#define SQLITE_MAGIC_SICK 0x4b771290 /* Error and awaiting close */ -#define SQLITE_MAGIC_BUSY 0xf03b7906 /* Database currently in use */ -#define SQLITE_MAGIC_ERROR 0xb5357930 /* An SQLITE_MISUSE error occurred */ - -/* -** Each SQL function is defined by an instance of the following -** structure. A pointer to this structure is stored in the sqlite.aFunc -** hash table. When multiple functions have the same name, the hash table -** points to a linked list of these structures. -*/ -struct FuncDef { - i16 nArg; /* Number of arguments. -1 means unlimited */ - uint8_t iPrefEnc; /* Preferred text encoding (SQLITE_UTF8, 16LE, 16BE) */ - uint8_t flags; /* Some combination of SQLITE_FUNC_* */ - void *pUserData; /* User data parameter */ - FuncDef *pNext; /* Next function with same name */ - void (*xFunc)(sqlite3_context*,int,sqlite3_value**); /* Regular function */ - void (*xStep)(sqlite3_context*,int,sqlite3_value**); /* Aggregate step */ - void (*xFinalize)(sqlite3_context*); /* Aggregate finalizer */ - char *zName; /* SQL name of the function. */ - FuncDef *pHash; /* Next with a different name but the same hash */ - FuncDestructor *pDestructor; /* Reference counted destructor function */ -}; - -/* -** This structure encapsulates a user-function destructor callback (as -** configured using create_function_v2()) and a reference counter. When -** create_function_v2() is called to create a function with a destructor, -** a single object of this type is allocated. FuncDestructor.nRef is set to -** the number of FuncDef objects created (either 1 or 3, depending on whether -** or not the specified encoding is SQLITE_ANY). The FuncDef.pDestructor -** member of each of the new FuncDef objects is set to point to the allocated -** FuncDestructor. -** -** Thereafter, when one of the FuncDef objects is deleted, the reference -** count on this object is decremented. When it reaches 0, the destructor -** is invoked and the FuncDestructor structure freed. -*/ -struct FuncDestructor { - int nRef; - void (*xDestroy)(void *); - void *pUserData; -}; - -/* -** Possible values for FuncDef.flags -*/ -#define SQLITE_FUNC_LIKE 0x01 /* Candidate for the LIKE optimization */ -#define SQLITE_FUNC_CASE 0x02 /* Case-sensitive LIKE-type function */ -#define SQLITE_FUNC_EPHEM 0x04 /* Ephemeral. Delete with VDBE */ -#define SQLITE_FUNC_NEEDCOLL 0x08 /* sqlite3GetFuncCollSeq() might be called */ -#define SQLITE_FUNC_PRIVATE 0x10 /* Allowed for internal use only */ -#define SQLITE_FUNC_COUNT 0x20 /* Built-in count(*) aggregate */ -#define SQLITE_FUNC_COALESCE 0x40 /* Built-in coalesce() or ifnull() function */ - -/* -** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are -** used to create the initializers for the FuncDef structures. -** -** FUNCTION(zName, nArg, iArg, bNC, xFunc) -** Used to create a scalar function definition of a function zName -** implemented by C function xFunc that accepts nArg arguments. The -** value passed as iArg is cast to a (void*) and made available -** as the user-data (sqlite3_user_data()) for the function. If -** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set. -** -** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal) -** Used to create an aggregate function definition implemented by -** the C functions xStep and xFinal. The first four parameters -** are interpreted in the same way as the first 4 parameters to -** FUNCTION(). -** -** LIKEFUNC(zName, nArg, pArg, flags) -** Used to create a scalar function definition of a function zName -** that accepts nArg arguments and is implemented by a call to C -** function likeFunc. Argument pArg is cast to a (void *) and made -** available as the function user-data (sqlite3_user_data()). The -** FuncDef.flags variable is set to the value passed as the flags -** parameter. -*/ -#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ - {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \ - SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} -#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ - {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \ - pArg, 0, xFunc, 0, 0, #zName, 0, 0} -#define LIKEFUNC(zName, nArg, arg, flags) \ - {nArg, SQLITE_UTF8, flags, (void *)arg, 0, likeFunc, 0, 0, #zName, 0, 0} -#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \ - {nArg, SQLITE_UTF8, nc*SQLITE_FUNC_NEEDCOLL, \ - SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0,0} - -/* -** All current savepoints are stored in a linked list starting at -** sqlite3.pSavepoint. The first element in the list is the most recently -** opened savepoint. Savepoints are added to the list by the vdbe -** OP_Savepoint instruction. -*/ -struct Savepoint { - char *zName; /* Savepoint name (nul-terminated) */ - i64 nDeferredCons; /* Number of deferred fk violations */ - Savepoint *pNext; /* Parent savepoint (if any) */ -}; - -/* -** The following are used as the second parameter to sqlite3Savepoint(), -** and as the P1 argument to the OP_Savepoint instruction. -*/ -#define SAVEPOINT_BEGIN 0 -#define SAVEPOINT_RELEASE 1 -#define SAVEPOINT_ROLLBACK 2 - - -/* -** Each SQLite module (virtual table definition) is defined by an -** instance of the following structure, stored in the sqlite3.aModule -** hash table. -*/ -struct Module { - const sqlite3_module *pModule; /* Callback pointers */ - const char *zName; /* Name passed to create_module() */ - void *pAux; /* pAux passed to create_module() */ - void (*xDestroy)(void *); /* Module destructor function */ -}; - -/* -** information about each column of an SQL table is held in an instance -** of this structure. -*/ -struct Column { - char *zName; /* Name of this column */ - Expr *pDflt; /* Default value of this column */ - char *zDflt; /* Original text of the default value */ - char *zType; /* Data type for this column */ - char *zColl; /* Collating sequence. If NULL, use the default */ - uint8_t notNull; /* True if there is a NOT NULL constraint */ - uint8_t isPrimKey; /* True if this column is part of the PRIMARY KEY */ - char affinity; /* One of the SQLITE_AFF_... values */ -#ifndef SQLITE_OMIT_VIRTUALTABLE - uint8_t isHidden; /* True if this column is 'hidden' */ -#endif -}; - -/* -** A "Collating Sequence" is defined by an instance of the following -** structure. Conceptually, a collating sequence consists of a name and -** a comparison routine that defines the order of that sequence. -** -** There may two separate implementations of the collation function, one -** that processes text in UTF-8 encoding (CollSeq.xCmp) and another that -** processes text encoded in UTF-16 (CollSeq.xCmp16), using the machine -** native byte order. When a collation sequence is invoked, SQLite selects -** the version that will require the least expensive encoding -** translations, if any. -** -** The CollSeq.pUser member variable is an extra parameter that passed in -** as the first argument to the UTF-8 comparison function, xCmp. -** CollSeq.pUser16 is the equivalent for the UTF-16 comparison function, -** xCmp16. -** -** If both CollSeq.xCmp and CollSeq.xCmp16 are NULL, it means that the -** collating sequence is undefined. Indices built on an undefined -** collating sequence may not be read or written. -*/ -struct CollSeq { - char *zName; /* Name of the collating sequence, UTF-8 encoded */ - uint8_t enc; /* Text encoding handled by xCmp() */ - uint8_t type; /* One of the SQLITE_COLL_... values below */ - void *pUser; /* First argument to xCmp() */ - int (*xCmp)(void*,int, const void*, int, const void*); - void (*xDel)(void*); /* Destructor for pUser */ -}; - -/* -** Allowed values of CollSeq.type: -*/ -#define SQLITE_COLL_BINARY 1 /* The default memcmp() collating sequence */ -#define SQLITE_COLL_NOCASE 2 /* The built-in NOCASE collating sequence */ -#define SQLITE_COLL_REVERSE 3 /* The built-in REVERSE collating sequence */ -#define SQLITE_COLL_USER 0 /* Any other user-defined collating sequence */ - -/* -** A sort order can be either ASC or DESC. -*/ -#define SQLITE_SO_ASC 0 /* Sort in ascending order */ -#define SQLITE_SO_DESC 1 /* Sort in ascending order */ - -/* -** Column affinity types. -** -** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and -** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve -** the speed a little by numbering the values consecutively. -** -** But rather than start with 0 or 1, we begin with 'a'. That way, -** when multiple affinity types are concatenated into a string and -** used as the P4 operand, they will be more readable. -** -** Note also that the numeric types are grouped together so that testing -** for a numeric type is a single comparison. -*/ -#define SQLITE_AFF_TEXT 'a' -#define SQLITE_AFF_NONE 'b' -#define SQLITE_AFF_NUMERIC 'c' -#define SQLITE_AFF_INTEGER 'd' -#define SQLITE_AFF_REAL 'e' - -#define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) - -/* -** The SQLITE_AFF_MASK values masks off the significant bits of an -** affinity value. -*/ -#define SQLITE_AFF_MASK 0x67 - -/* -** Additional bit values that can be ORed with an affinity without -** changing the affinity. -*/ -#define SQLITE_JUMPIFNULL 0x08 /* jumps if either operand is NULL */ -#define SQLITE_STOREP2 0x10 /* Store result in reg[P2] rather than jump */ -#define SQLITE_NULLEQ 0x80 /* NULL=NULL */ - -/* -** An object of this type is created for each virtual table present in -** the database schema. -** -** If the database schema is shared, then there is one instance of this -** structure for each database connection (sqlite3*) that uses the shared -** schema. This is because each database connection requires its own unique -** instance of the sqlite3_vtab* handle used to access the virtual table -** implementation. sqlite3_vtab* handles can not be shared between -** database connections, even when the rest of the in-memory database -** schema is shared, as the implementation often stores the database -** connection handle passed to it via the xConnect() or xCreate() method -** during initialization internally. This database connection handle may -** then used by the virtual table implementation to access real tables -** within the database. So that they appear as part of the callers -** transaction, these accesses need to be made via the same database -** connection as that used to execute SQL operations on the virtual table. -** -** All VTable objects that correspond to a single table in a shared -** database schema are initially stored in a linked-list pointed to by -** the Table.pVTable member variable of the corresponding Table object. -** When an sqlite3_prepare() operation is required to access the virtual -** table, it searches the list for the VTable that corresponds to the -** database connection doing the preparing so as to use the correct -** sqlite3_vtab* handle in the compiled query. -** -** When an in-memory Table object is deleted (for example when the -** schema is being reloaded for some reason), the VTable objects are not -** deleted and the sqlite3_vtab* handles are not xDisconnect()ed -** immediately. Instead, they are moved from the Table.pVTable list to -** another linked list headed by the sqlite3.pDisconnect member of the -** corresponding sqlite3 structure. They are then deleted/xDisconnected -** next time a statement is prepared using said sqlite3*. This is done -** to avoid deadlock issues involving multiple sqlite3.mutex mutexes. -** Refer to comments above function sqlite3VtabUnlockList() for an -** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect -** list without holding the corresponding sqlite3.mutex mutex. -** -** The memory for objects of this type is always allocated by -** sqlite3DbMalloc(), using the connection handle stored in VTable.db as -** the first argument. -*/ -struct VTable { - sqlite3 *db; /* Database connection associated with this table */ - Module *pMod; /* Pointer to module implementation */ - sqlite3_vtab *pVtab; /* Pointer to vtab instance */ - int nRef; /* Number of pointers to this structure */ - VTable *pNext; /* Next in linked list (see above) */ -}; - -/* -** Each SQL table is represented in memory by an instance of the -** following structure. -** -** Table.zName is the name of the table. The case of the original -** CREATE TABLE statement is stored, but case is not significant for -** comparisons. -** -** Table.nCol is the number of columns in this table. Table.aCol is a -** pointer to an array of Column structures, one for each column. -** -** If the table has an INTEGER PRIMARY KEY, then Table.iPKey is the index of -** the column that is that key. Otherwise Table.iPKey is negative. Note -** that the datatype of the PRIMARY KEY must be INTEGER for this field to -** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of -** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid -** is generated for each row of the table. TF_HasPrimaryKey is set if -** the table has any PRIMARY KEY, INTEGER or otherwise. -** -** Table.tnum is the page number for the root BTree page of the table in the -** database file. If Table.iDb is the index of the database table backend -** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that -** holds temporary tables and indices. If TF_Ephemeral is set -** then the table is stored in a file that is automatically deleted -** when the VDBE cursor to the table is closed. In this case Table.tnum -** refers VDBE cursor number that holds the table open, not to the root -** page number. Transient tables are used to hold the results of a -** sub-query that appears instead of a real table name in the FROM clause -** of a SELECT statement. -*/ -struct Table { - char *zName; /* Name of the table or view */ - int iPKey; /* If not negative, use aCol[iPKey] as the primary key */ - int nCol; /* Number of columns in this table */ - Column *aCol; /* Information about each column */ - Index *pIndex; /* List of SQL indexes on this table. */ - int tnum; /* Root BTree node for this table (see note above) */ - unsigned nRowEst; /* Estimated rows in table - from sqlite_stat1 table */ - Select *pSelect; /* NULL for tables. Points to definition if a view. */ - uint16_t nRef; /* Number of pointers to this Table */ - uint8_t tabFlags; /* Mask of TF_* values */ - uint8_t keyConf; /* What to do in case of uniqueness conflict on iPKey */ - FKey *pFKey; /* Linked list of all foreign keys in this table */ - char *zColAff; /* String defining the affinity of each column */ -#ifndef SQLITE_OMIT_CHECK - Expr *pCheck; /* The AND of all CHECK constraints */ -#endif -#ifndef SQLITE_OMIT_ALTERTABLE - int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ -#endif -#ifndef SQLITE_OMIT_VIRTUALTABLE - VTable *pVTable; /* List of VTable objects. */ - int nModuleArg; /* Number of arguments to the module */ - char **azModuleArg; /* Text of all module args. [0] is module name */ -#endif - Trigger *pTrigger; /* List of triggers stored in pSchema */ - Schema *pSchema; /* Schema that contains this table */ - Table *pNextZombie; /* Next on the Parse.pZombieTab list */ -}; - -/* -** Allowed values for Tabe.tabFlags. -*/ -#define TF_Readonly 0x01 /* Read-only system table */ -#define TF_Ephemeral 0x02 /* An ephemeral table */ -#define TF_HasPrimaryKey 0x04 /* Table has a primary key */ -#define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */ -#define TF_Virtual 0x10 /* Is a virtual table */ -#define TF_NeedMetadata 0x20 /* aCol[].zType and aCol[].pColl missing */ - - - -/* -** Test to see whether or not a table is a virtual table. This is -** done as a macro so that it will be optimized out when virtual -** table support is omitted from the build. -*/ -#ifndef SQLITE_OMIT_VIRTUALTABLE -# define IsVirtual(X) (((X)->tabFlags & TF_Virtual)!=0) -# define IsHiddenColumn(X) ((X)->isHidden) -#else -# define IsVirtual(X) 0 -# define IsHiddenColumn(X) 0 -#endif - -/* -** Each foreign key constraint is an instance of the following structure. -** -** A foreign key is associated with two tables. The "from" table is -** the table that contains the REFERENCES clause that creates the foreign -** key. The "to" table is the table that is named in the REFERENCES clause. -** Consider this example: -** -** CREATE TABLE ex1( -** a INTEGER PRIMARY KEY, -** b INTEGER CONSTRAINT fk1 REFERENCES ex2(x) -** ); -** -** For foreign key "fk1", the from-table is "ex1" and the to-table is "ex2". -** -** Each REFERENCES clause generates an instance of the following structure -** which is attached to the from-table. The to-table need not exist when -** the from-table is created. The existence of the to-table is not checked. -*/ -struct FKey { - Table *pFrom; /* Table containing the REFERENCES clause (aka: Child) */ - FKey *pNextFrom; /* Next foreign key in pFrom */ - char *zTo; /* Name of table that the key points to (aka: Parent) */ - FKey *pNextTo; /* Next foreign key on table named zTo */ - FKey *pPrevTo; /* Previous foreign key on table named zTo */ - int nCol; /* Number of columns in this key */ - /* EV: R-30323-21917 */ - uint8_t isDeferred; /* True if constraint checking is deferred till COMMIT */ - uint8_t aAction[2]; /* ON DELETE and ON UPDATE actions, respectively */ - Trigger *apTrigger[2]; /* Triggers for aAction[] actions */ - struct sColMap { /* Mapping of columns in pFrom to columns in zTo */ - int iFrom; /* Index of column in pFrom */ - char *zCol; /* Name of column in zTo. If 0 use PRIMARY KEY */ - } aCol[1]; /* One entry for each of nCol column s */ -}; - -/* -** SQLite supports many different ways to resolve a constraint -** error. ROLLBACK processing means that a constraint violation -** causes the operation in process to fail and for the current transaction -** to be rolled back. ABORT processing means the operation in process -** fails and any prior changes from that one operation are backed out, -** but the transaction is not rolled back. FAIL processing means that -** the operation in progress stops and returns an error code. But prior -** changes due to the same operation are not backed out and no rollback -** occurs. IGNORE means that the particular row that caused the constraint -** error is not inserted or updated. Processing continues and no error -** is returned. REPLACE means that preexisting database rows that caused -** a UNIQUE constraint violation are removed so that the new insert or -** update can proceed. Processing continues and no error is reported. -** -** RESTRICT, SETNULL, and CASCADE actions apply only to foreign keys. -** RESTRICT is the same as ABORT for IMMEDIATE foreign keys and the -** same as ROLLBACK for DEFERRED keys. SETNULL means that the foreign -** key is set to NULL. CASCADE means that a DELETE or UPDATE of the -** referenced table row is propagated into the row that holds the -** foreign key. -** -** The following symbolic values are used to record which type -** of action to take. -*/ -#define OE_None 0 /* There is no constraint to check */ -#define OE_Rollback 1 /* Fail the operation and rollback the transaction */ -#define OE_Abort 2 /* Back out changes but do no rollback transaction */ -#define OE_Fail 3 /* Stop the operation but leave all prior changes */ -#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */ -#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */ - -#define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ -#define OE_SetNull 7 /* Set the foreign key value to NULL */ -#define OE_SetDflt 8 /* Set the foreign key value to its default */ -#define OE_Cascade 9 /* Cascade the changes */ - -#define OE_Default 99 /* Do whatever the default action is */ - - -/* -** An instance of the following structure is passed as the first -** argument to sqlite3VdbeKeyCompare and is used to control the -** comparison of the two index keys. -*/ -struct KeyInfo { - sqlite3 *db; /* The database connection */ - uint8_t enc; /* Text encoding - one of the SQLITE_UTF* values */ - uint16_t nField; /* Number of entries in aColl[] */ - uint8_t *aSortOrder; /* Sort order for each column. May be NULL */ - CollSeq *aColl[1]; /* Collating sequence for each term of the key */ -}; - -/* -** An instance of the following structure holds information about a -** single index record that has already been parsed out into individual -** values. -** -** A record is an object that contains one or more fields of data. -** Records are used to store the content of a table row and to store -** the key of an index. A blob encoding of a record is created by -** the OP_MakeRecord opcode of the VDBE and is disassembled by the -** OP_Column opcode. -** -** This structure holds a record that has already been disassembled -** into its constituent fields. -*/ -struct UnpackedRecord { - KeyInfo *pKeyInfo; /* Collation and sort-order information */ - uint16_t nField; /* Number of entries in apMem[] */ - uint16_t flags; /* Boolean settings. UNPACKED_... below */ - i64 rowid; /* Used by UNPACKED_PREFIX_SEARCH */ - Mem *aMem; /* Values */ -}; - -/* -** Allowed values of UnpackedRecord.flags -*/ -#define UNPACKED_NEED_FREE 0x0001 /* Memory is from sqlite3Malloc() */ -#define UNPACKED_NEED_DESTROY 0x0002 /* apMem[]s should all be destroyed */ -#define UNPACKED_IGNORE_ROWID 0x0004 /* Ignore trailing rowid on key1 */ -#define UNPACKED_INCRKEY 0x0008 /* Make this key an epsilon larger */ -#define UNPACKED_PREFIX_MATCH 0x0010 /* A prefix match is considered OK */ -#define UNPACKED_PREFIX_SEARCH 0x0020 /* A prefix match is considered OK */ - -/* -** Each SQL index is represented in memory by an -** instance of the following structure. -** -** The columns of the table that are to be indexed are described -** by the aiColumn[] field of this structure. For example, suppose -** we have the following table and index: -** -** CREATE TABLE Ex1(c1 int, c2 int, c3 text); -** CREATE INDEX Ex2 ON Ex1(c3,c1); -** -** In the Table structure describing Ex1, nCol==3 because there are -** three columns in the table. In the Index structure describing -** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. -** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the -** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. -** The second column to be indexed (c1) has an index of 0 in -** Ex1.aCol[], hence Ex2.aiColumn[1]==0. -** -** The Index.onError field determines whether or not the indexed columns -** must be unique and what to do if they are not. When Index.onError=OE_None, -** it means this is not a unique index. Otherwise it is a unique index -** and the value of Index.onError indicate the which conflict resolution -** algorithm to employ whenever an attempt is made to insert a non-unique -** element. -*/ -struct Index { - char *zName; /* Name of this index */ - int nColumn; /* Number of columns in the table used by this index */ - int *aiColumn; /* Which columns are used by this index. 1st is 0 */ - unsigned *aiRowEst; /* Result of ANALYZE: Est. rows selected by each column */ - Table *pTable; /* The SQL table being indexed */ - int tnum; /* Page containing root of this index in database file */ - uint8_t onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ - uint8_t autoIndex; /* True if is automatically created (ex: by UNIQUE) */ - char *zColAff; /* String defining the affinity of each column */ - Index *pNext; /* The next index associated with the same table */ - Schema *pSchema; /* Schema containing this index */ - uint8_t *aSortOrder; /* Array of size Index.nColumn. True==DESC, False==ASC */ - char **azColl; /* Array of collation sequence names for index */ - IndexSample *aSample; /* Array of SQLITE_INDEX_SAMPLES samples */ -}; - -/* -** Each sample stored in the sqlite_stat2 table is represented in memory -** using a structure of this type. -*/ -struct IndexSample { - union { - char *z; /* Value if eType is SQLITE_TEXT or SQLITE_BLOB */ - double r; /* Value if eType is SQLITE_FLOAT or SQLITE_INTEGER */ - } u; - uint8_t eType; /* SQLITE_NULL, SQLITE_INTEGER ... etc. */ - uint8_t nByte; /* Size in byte of text or blob. */ -}; - -/* -** Each token coming out of the lexer is an instance of -** this structure. Tokens are also used as part of an expression. -** -** Note if Token.z==0 then Token.dyn and Token.n are undefined and -** may contain random values. Do not make any assumptions about Token.dyn -** and Token.n when Token.z==0. -*/ -struct Token { - const char *z; /* Text of the token. Not NULL-terminated! */ - unsigned int n; /* Number of characters in this token */ -}; - -/* -** An instance of this structure contains information needed to generate -** code for a SELECT that contains aggregate functions. -** -** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a -** pointer to this structure. The Expr.iColumn field is the index in -** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate -** code for that node. -** -** AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the -** original Select structure that describes the SELECT statement. These -** fields do not need to be freed when deallocating the AggInfo structure. -*/ -struct AggInfo { - uint8_t directMode; /* Direct rendering mode means take data directly - ** from source tables rather than from accumulators */ - uint8_t useSortingIdx; /* In direct mode, reference the sorting index rather - ** than the source table */ - int sortingIdx; /* Cursor number of the sorting index */ - ExprList *pGroupBy; /* The group by clause */ - int nSortingColumn; /* Number of columns in the sorting index */ - struct AggInfo_col { /* For each column used in source tables */ - Table *pTab; /* Source table */ - int iTable; /* Cursor number of the source table */ - int iColumn; /* Column number within the source table */ - int iSorterColumn; /* Column number in the sorting index */ - int iMem; /* Memory location that acts as accumulator */ - Expr *pExpr; /* The original expression */ - } *aCol; - int nColumn; /* Number of used entries in aCol[] */ - int nColumnAlloc; /* Number of slots allocated for aCol[] */ - int nAccumulator; /* Number of columns that show through to the output. - ** Additional columns are used only as parameters to - ** aggregate functions */ - struct AggInfo_func { /* For each aggregate function */ - Expr *pExpr; /* Expression encoding the function */ - FuncDef *pFunc; /* The aggregate function implementation */ - int iMem; /* Memory location that acts as accumulator */ - int iDistinct; /* Ephemeral table used to enforce DISTINCT */ - } *aFunc; - int nFunc; /* Number of entries in aFunc[] */ - int nFuncAlloc; /* Number of slots allocated for aFunc[] */ -}; - -/* -** The datatype ynVar is a signed integer, either 16-bit or 32-bit. -** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater -** than 32767 we have to make it 32-bit. 16-bit is preferred because -** it uses less memory in the Expr object, which is a big memory user -** in systems with lots of prepared statements. And few applications -** need more than about 10 or 20 variables. But some extreme users want -** to have prepared statements with over 32767 variables, and for them -** the option is available (at compile-time). -*/ -#if SQLITE_MAX_VARIABLE_NUMBER<=32767 -typedef i16 ynVar; -#else -typedef int ynVar; -#endif - -/* -** Each node of an expression in the parse tree is an instance -** of this structure. -** -** Expr.op is the opcode. The integer parser token codes are reused -** as opcodes here. For example, the parser defines TK_GE to be an integer -** code representing the ">=" operator. This same integer code is reused -** to represent the greater-than-or-equal-to operator in the expression -** tree. -** -** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, -** or TK_STRING), then Expr.token contains the text of the SQL literal. If -** the expression is a variable (TK_VARIABLE), then Expr.token contains the -** variable name. Finally, if the expression is an SQL function (TK_FUNCTION), -** then Expr.token contains the name of the function. -** -** Expr.pRight and Expr.pLeft are the left and right subexpressions of a -** binary operator. Either or both may be NULL. -** -** Expr.x.pList is a list of arguments if the expression is an SQL function, -** a CASE expression or an IN expression of the form " IN (, ...)". -** Expr.x.pSelect is used if the expression is a sub-select or an expression of -** the form " IN (SELECT ...)". If the EP_xIsSelect bit is set in the -** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is -** valid. -** -** An expression of the form ID or ID.ID refers to a column in a table. -** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is -** the integer cursor number of a VDBE cursor pointing to that table and -** Expr.iColumn is the column number for the specific column. If the -** expression is used as a result in an aggregate SELECT, then the -** value is also stored in the Expr.iAgg column in the aggregate so that -** it can be accessed after all aggregates are computed. -** -** If the expression is an unbound variable marker (a question mark -** character '?' in the original SQL) then the Expr.iTable holds the index -** number for that variable. -** -** If the expression is a subquery then Expr.iColumn holds an integer -** register number containing the result of the subquery. If the -** subquery gives a constant result, then iTable is -1. If the subquery -** gives a different answer at different times during statement processing -** then iTable is the address of a subroutine that computes the subquery. -** -** If the Expr is of type OP_Column, and the table it is selecting from -** is a disk table or the "old.*" pseudo-table, then pTab points to the -** corresponding table definition. -** -** ALLOCATION NOTES: -** -** Expr objects can use a lot of memory space in database schema. To -** help reduce memory requirements, sometimes an Expr object will be -** truncated. And to reduce the number of memory allocations, sometimes -** two or more Expr objects will be stored in a single memory allocation, -** together with Expr.zToken strings. -** -** If the EP_Reduced and EP_TokenOnly flags are set when -** an Expr object is truncated. When EP_Reduced is set, then all -** the child Expr objects in the Expr.pLeft and Expr.pRight subtrees -** are contained within the same memory allocation. Note, however, that -** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately -** allocated, regardless of whether or not EP_Reduced is set. -*/ -struct Expr { - uint8_t op; /* Operation performed by this node */ - char affinity; /* The affinity of the column or 0 if not a column */ - uint16_t flags; /* Various flags. EP_* See below */ - union { - char *zToken; /* Token value. Zero terminated and dequoted */ - int iValue; /* Integer value if EP_IntValue */ - } u; - - /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no - ** space is allocated for the fields below this point. An attempt to - ** access them will result in a segfault or malfunction. - *********************************************************************/ - - Expr *pLeft; /* Left subnode */ - Expr *pRight; /* Right subnode */ - union { - ExprList *pList; /* Function arguments or in " IN ( IN ( - - - - - diff --git a/openair2/UTIL/OMG/SUMO/SCENARIOS/sumo_commands.txt b/openair2/UTIL/OMG/SUMO/SCENARIOS/sumo_commands.txt deleted file mode 100644 index b49f8095b5..0000000000 --- a/openair2/UTIL/OMG/SUMO/SCENARIOS/sumo_commands.txt +++ /dev/null @@ -1,5 +0,0 @@ - -Sumo version used 0.12.3: -to start sumo with the existing route and network files below command was used. - -sumo -n traci_ex_Map.net.xml -r traci_ex_ROU.rou.xml -b 0 -e 1000 --remote-port 8883 -v \ No newline at end of file diff --git a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci.scen.sumo.cfg b/openair2/UTIL/OMG/SUMO/SCENARIOS/traci.scen.sumo.cfg deleted file mode 100644 index a1b39f1667..0000000000 --- a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci.scen.sumo.cfg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - 0 - 200 - - - - 8890 - - - diff --git a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_Map.net.xml b/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_Map.net.xml deleted file mode 100644 index 3397a73dde..0000000000 --- a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_Map.net.xml +++ /dev/null @@ -1,2531 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_ROU.rou.xml b/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_ROU.rou.xml deleted file mode 100644 index 6c46d94a85..0000000000 --- a/openair2/UTIL/OMG/SUMO/SCENARIOS/traci_ex_ROU.rou.xml +++ /dev/null @@ -1,333 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/openair2/UTIL/OMG/TraCIConstants.h b/openair2/UTIL/OMG/TraCIConstants.h deleted file mode 100644 index 1defa16aad..0000000000 --- a/openair2/UTIL/OMG/TraCIConstants.h +++ /dev/null @@ -1,744 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/****************************************************************************/ -/// @file TraCIConstants.h -/// @author Axel Wegener -/// @date 2007/10/24 -/// @version $Id: TraCIConstants.h 9525 2011-01-04 21:22:52Z behrisch $ -/// -/// holds codes used for TraCI -/****************************************************************************/ -// SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ -// Copyright (C) 2001-2011 DLR (http://www.dlr.de/) and contributors -/****************************************************************************/ -// -// 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. -// -/****************************************************************************/ - -#ifndef TRACICONSTANTS_H -#define TRACICONSTANTS_H - - -// **************************************** -// COMMANDS -// **************************************** -// command: get version -#define CMD_GETVERSION 0x00 - -// command: simulation step -#define CMD_SIMSTEP 0x01 - -// command: simulation step (new version) -#define CMD_SIMSTEP2 0x02 - -// command: set maximum speed -#define CMD_SETMAXSPEED 0x11 - -// command: stop node -#define CMD_STOP 0x12 - -// command: set lane -#define CMD_CHANGELANE 0x13 - -// command: slow down -#define CMD_SLOWDOWN 0x14 - -// command: change route -#define CMD_CHANGEROUTE 0x30 - -// command: change target -#define CMD_CHANGETARGET 0x31 - -// command: subscribe lifecycles -#define CMD_SUBSCRIBELIFECYCLES 0x61 - -// command: unsubscribe lifecycles -#define CMD_UNSUBSCRIBELIFECYCLES 0x62 - -// command: object creation -#define CMD_OBJECTCREATION 0x63 - -// command: object destruction -#define CMD_OBJECTDESTRUCTION 0x64 - -// command: object domain subscription -#define CMD_SUBSCRIBEDOMAIN 0x65 - -// command: object domain unsubscription -#define CMD_UNSUBSCRIBEDOMAIN 0x66 - -// command: object update -#define CMD_UPDATEOBJECT 0x67 - -// command: Simulation Parameter -#define CMD_SIMPARAMETER 0x70 - -// command: Position Conversion -#define CMD_POSITIONCONVERSION 0x71 - -// command: Distance Request -#define CMD_DISTANCEREQUEST 0x72 - -// command: Scenario -#define CMD_SCENARIO 0x73 - -// command: add vehicle -#define CMD_ADDVEHICLE 0x74 - -// command: move node -#define CMD_MOVENODE 0x80 - -// command: close sumo -#define CMD_CLOSE 0x7F - -// command: -#define CMD_UPDATECALIBRATOR 0x50 - -// command: get all traffic light ids -#define CMD_GETALLTLIDS 0x40 - -// command: get traffic light status -#define CMD_GETTLSTATUS 0x41 - -// command: report traffic light id -#define CMD_TLIDLIST 0x90 - -// command: report traffic light status switch -#define CMD_TLSWITCH 0x91 - -// command: get induction loop (e1) variable -#define CMD_GET_INDUCTIONLOOP_VARIABLE 0xa0 -// response: get induction loop (e1) variable -#define RESPONSE_GET_INDUCTIONLOOP_VARIABLE 0xb0 -// command: subscribe induction loop (e1) variable -#define CMD_SUBSCRIBE_INDUCTIONLOOP_VARIABLE 0xd0 -// response: subscribe induction loop (e1) variable -#define RESPONSE_SUBSCRIBE_INDUCTIONLOOP_VARIABLE 0xe0 - -// command: get multi-entry/multi-exit detector (e3) variable -#define CMD_GET_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE 0xa1 -// response: get areal detector (e3) variable -#define RESPONSE_GET_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE 0xb1 -// command: subscribe multi-entry/multi-exit detector (e3) variable -#define CMD_SUBSCRIBE_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE 0xd1 -// response: subscribe areal detector (e3) variable -#define RESPONSE_SUBSCRIBE_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE 0xe1 - -// command: get traffic lights variable -#define CMD_GET_TL_VARIABLE 0xa2 -// response: get traffic lights variable -#define RESPONSE_GET_TL_VARIABLE 0xb2 -// command: set traffic lights variable -#define CMD_SET_TL_VARIABLE 0xc2 -// command: subscribe traffic lights variable -#define CMD_SUBSCRIBE_TL_VARIABLE 0xd2 -// response: subscribe traffic lights variable -#define RESPONSE_SUBSCRIBE_TL_VARIABLE 0xe2 - -// command: get lane variable -#define CMD_GET_LANE_VARIABLE 0xa3 -// response: get lane variable -#define RESPONSE_GET_LANE_VARIABLE 0xb3 -// command: set lane variable -#define CMD_SET_LANE_VARIABLE 0xc3 -// command: subscribe lane variable -#define CMD_SUBSCRIBE_LANE_VARIABLE 0xd3 -// response: subscribe lane variable -#define RESPONSE_SUBSCRIBE_LANE_VARIABLE 0xe3 - -// command: get vehicle variable -#define CMD_GET_VEHICLE_VARIABLE 0xa4 -// response: get vehicle variable -#define RESPONSE_GET_VEHICLE_VARIABLE 0xb4 -// command: set vehicle variable -#define CMD_SET_VEHICLE_VARIABLE 0xc4 -// command: subscribe vehicle variable -#define CMD_SUBSCRIBE_VEHICLE_VARIABLE 0xd4 -// response: subscribe vehicle variable -#define RESPONSE_SUBSCRIBE_VEHICLE_VARIABLE 0xe4 - -// command: get vehicle type variable -#define CMD_GET_VEHICLETYPE_VARIABLE 0xa5 -// response: get vehicle type variable -#define RESPONSE_GET_VEHICLETYPE_VARIABLE 0xb5 -// command: set vehicle type variable -#define CMD_SET_VEHICLETYPE_VARIABLE 0xc5 -// command: subscribe vehicle type variable -#define CMD_SUBSCRIBE_VEHICLETYPE_VARIABLE 0xd5 -// response: subscribe vehicle type variable -#define RESPONSE_SUBSCRIBE_VEHICLETYPE_VARIABLE 0xe5 - -// command: get route variable -#define CMD_GET_ROUTE_VARIABLE 0xa6 -// response: get route variable -#define RESPONSE_GET_ROUTE_VARIABLE 0xb6 -// command: set route variable -#define CMD_SET_ROUTE_VARIABLE 0xc6 -// command: subscribe route variable -#define CMD_SUBSCRIBE_ROUTE_VARIABLE 0xd6 -// response: subscribe route variable -#define RESPONSE_SUBSCRIBE_ROUTE_VARIABLE 0xe6 - -// command: get poi variable -#define CMD_GET_POI_VARIABLE 0xa7 -// response: get poi variable -#define RESPONSE_GET_POI_VARIABLE 0xb7 -// command: set poi variable -#define CMD_SET_POI_VARIABLE 0xc7 -// command: subscribe poi variable -#define CMD_SUBSCRIBE_POI_VARIABLE 0xd7 -// response: subscribe poi variable -#define RESPONSE_SUBSCRIBE_POI_VARIABLE 0xe7 - -// command: get polygon variable -#define CMD_GET_POLYGON_VARIABLE 0xa8 -// response: get polygon variable -#define RESPONSE_GET_POLYGON_VARIABLE 0xb8 -// command: set polygon variable -#define CMD_SET_POLYGON_VARIABLE 0xc8 -// command: subscribe polygon variable -#define CMD_SUBSCRIBE_POLYGON_VARIABLE 0xd8 -// response: subscribe polygon variable -#define RESPONSE_SUBSCRIBE_POLYGON_VARIABLE 0xe8 - -// command: get junction variable -#define CMD_GET_JUNCTION_VARIABLE 0xa9 -// response: get junction variable -#define RESPONSE_GET_JUNCTION_VARIABLE 0xb9 -// command: set junction variable -#define CMD_SET_JUNCTION_VARIABLE 0xc9 -// command: subscribe junction variable -#define CMD_SUBSCRIBE_JUNCTION_VARIABLE 0xd9 -// response: subscribe junction variable -#define RESPONSE_SUBSCRIBE_JUNCTION_VARIABLE 0xe9 - -// command: get edge variable -#define CMD_GET_EDGE_VARIABLE 0xaa -// response: get edge variable -#define RESPONSE_GET_EDGE_VARIABLE 0xba -// command: set edge variable -#define CMD_SET_EDGE_VARIABLE 0xca -// command: subscribe edge variable -#define CMD_SUBSCRIBE_EDGE_VARIABLE 0xda -// response: subscribe edge variable -#define RESPONSE_SUBSCRIBE_EDGE_VARIABLE 0xea - -// command: get simulation variable -#define CMD_GET_SIM_VARIABLE 0xab -// response: get simulation variable -#define RESPONSE_GET_SIM_VARIABLE 0xbb -// command: set simulation variable -#define CMD_SET_SIM_VARIABLE 0xcb -// command: subscribe simulation variable -#define CMD_SUBSCRIBE_SIM_VARIABLE 0xdb -// response: subscribe simulation variable -#define RESPONSE_SUBSCRIBE_SIM_VARIABLE 0xeb - -// command: get GUI variable -#define CMD_GET_GUI_VARIABLE 0xac -// response: get GUI variable -#define RESPONSE_GET_GUI_VARIABLE 0xbc -// command: set GUI variable -#define CMD_SET_GUI_VARIABLE 0xcc -// command: subscribe GUI variable -#define CMD_SUBSCRIBE_GUI_VARIABLE 0xdc -// response: subscribe GUI variable -#define RESPONSE_SUBSCRIBE_GUI_VARIABLE 0xec - - - -// **************************************** -// POSITION REPRESENTATIONS -// **************************************** -// Omit position -#define POSITION_NONE 0x00 -// 2D cartesian coordinates -#define POSITION_2D 0x01 -// 2.5D cartesian coordinates -#define POSITION_2_5D 0x02 -// 3D cartesian coordinates -#define POSITION_3D 0x03 -// Position on road map -#define POSITION_ROADMAP 0x04 - - - -// **************************************** -// DATA TYPES -// **************************************** -// Boundary Box -#define TYPE_BOUNDINGBOX 0x05 -// Polygon -#define TYPE_POLYGON 0x06 -// unsigned byte -#define TYPE_UBYTE 0x07 -// signed byte -#define TYPE_BYTE 0x08 -// 32 bit integer -#define TYPE_INTEGER 0x09 -// float -#define TYPE_FLOAT 0x0A -// double -#define TYPE_DOUBLE 0x0B -// 8 bit ASCII string -#define TYPE_STRING 0x0C -// list of traffic light phases -#define TYPE_TLPHASELIST 0x0D -// list of strings -#define TYPE_STRINGLIST 0x0E -// compound object -#define TYPE_COMPOUND 0x0F -// color (four ubytes) -#define TYPE_COLOR 0x11 - - - -// **************************************** -// RESULT TYPES -// **************************************** -// result type: Ok -#define RTYPE_OK 0x00 -// result type: not implemented -#define RTYPE_NOTIMPLEMENTED 0x01 -// result type: error -#define RTYPE_ERR 0xFF - - - -// **************************************** -// DOMAIN IDs (FOR SCENARIO COMMAND) -// **************************************** -// road map domain -#define DOM_ROADMAP 0x00 -// vehicle domain -#define DOM_VEHICLE 0x01 -// traffic lights domain -#define DOM_TRAFFICLIGHTS 0x02 -// points of interest domain -#define DOM_POI 0x03 -// polygon domain -#define DOM_POLYGON 0x04 - - - -// **************************************** -// VARIABLE IDs (FOR SCENARIO COMMAND) -// **************************************** -// count of domain objects -#define DOMVAR_COUNT 0x01 -// position of a domain object -#define DOMVAR_POSITION 0x02 -// boundaries of simulation net -#define DOMVAR_BOUNDINGBOX 0x03 -// speed of a node -#define DOMVAR_SPEED 0x04 -// actual phase of a traffic light -#define DOMVAR_CURTLPHASE 0x05 -// next phase of a traffic light -#define DOMVAR_NEXTTLPHASE 0x06 -// type of a domain object (poi, polygon) -#define DOMVAR_TYPE 0x07 -// layer a domain object is located at (poi, polygon) -#define DOMVAR_LAYER 0x08 -// shape of a polygon -#define DOMVAR_SHAPE 0x09 -// max count of vehicles -#define DOMVAR_MAXCOUNT 0x0A -// count of TraCI vehicles -#define DOMVAR_EQUIPPEDCOUNT 0x0B -// max count of TraCI vehicles -#define DOMVAR_EQUIPPEDCOUNTMAX 0x0C -// id string of a domain object -#define DOMVAR_NAME 0x0D -// route, a car plans to drive -#define DOMVAR_ROUTE 0x0E -// maximum allowed speed of a node -#define DOMVAR_ALLOWED_SPEED 0x0F -// air distance from a certain object to a position -#define DOMVAR_AIRDISTANCE 0x10 -// driving distance from a certain object to a position -#define DOMVAR_DRIVINGDISTANCE 0x11 -// external integer id of a certain object -#define DOMVAR_EXTID 0x12 -// angle of a certain object, in degrees [0..360) -#define DOMVAR_ANGLE 0x13 -// current simulation time -#define DOMVAR_SIMTIME 0x14 -// current CO2 emission of a node -#define DOMVAR_CO2EMISSION 0x20 -// current CO emission of a node -#define DOMVAR_COEMISSION 0x21 -// current HC emission of a node -#define DOMVAR_HCEMISSION 0x22 -// current PMx emission of a node -#define DOMVAR_PMXEMISSION 0x23 -// current NOx emission of a node -#define DOMVAR_NOXEMISSION 0x24 -// current fuel consumption of a node -#define DOMVAR_FUELCONSUMPTION 0x25 -// current noise emission of a node -#define DOMVAR_NOISEEMISSION 0x26 - - - -// **************************************** -// TRAFFIC LIGHT PHASES -// **************************************** -// red phase -#define TLPHASE_RED 0x01 -// yellow phase -#define TLPHASE_YELLOW 0x02 -// green phase -#define TLPHASE_GREEN 0x03 -// tl is blinking -#define TLPHASE_BLINKING 0x04 -// tl is off and not blinking -#define TLPHASE_NOSIGNAL 0x05 - - - -// **************************************** -// DIFFERENT DISTANCE REQUESTS -// **************************************** -// air distance -#define REQUEST_AIRDIST 0x00 -// driving distance -#define REQUEST_DRIVINGDIST 0x01 - - - -// **************************************** -// VARIABLE TYPES (for CMD_GET_*_VARIABLE) -// **************************************** -// list of instances' ids (get: induction loops, areal detector, traffic lights) -#define ID_LIST 0x00 - -// last step vehicle number (get: induction loops, multi-entry/multi-exit detector, lanes, edges) -#define LAST_STEP_VEHICLE_NUMBER 0x10 - -// last step vehicle number (get: induction loops, multi-entry/multi-exit detector, lanes, edges) -#define LAST_STEP_MEAN_SPEED 0x11 - -// last step vehicle number (get: induction loops, multi-entry/multi-exit detector, lanes, edges) -#define LAST_STEP_VEHICLE_ID_LIST 0x12 - -// last step occupancy (get: induction loops, lanes, edges) -#define LAST_STEP_OCCUPANCY 0x13 - -// last step vehicle halting number (get: multi-entry/multi-exit detector, lanes, edges) -#define LAST_STEP_VEHICLE_HALTING_NUMBER 0x14 - -// last step mean vehicle length (get: induction loops, lanes, edges) -#define LAST_STEP_LENGTH 0x15 - -// last step time since last detection (get: induction loops) -#define LAST_STEP_TIME_SINCE_DETECTION 0x16 - - -// traffic light states, encoded as rRgGyYoO tuple (get: traffic lights) -#define TL_RED_YELLOW_GREEN_STATE 0x20 - -// traffic light states, encoded phase, brake, and yellow tuple (get: traffic lights, set: traffic lights) -#define TL_PHASE_BRAKE_YELLOW_STATE 0x21 - -// index of the phase (set: traffic lights) -#define TL_PHASE_INDEX 0x22 - -// traffic light program (set: traffic lights) -#define TL_PROGRAM 0x23 - -// phase duration (set: traffic lights) -#define TL_PHASE_DURATION 0x24 - -// complete definition (get: traffic lights) -#define TL_COMPLETE_DEFINITION_PBY 0x25 - -// controlled lanes (get: traffic lights) -#define TL_CONTROLLED_LANES 0x26 - -// controlled links (get: traffic lights) -#define TL_CONTROLLED_LINKS 0x27 - -// index of the current phase (get: traffic lights) -#define TL_CURRENT_PHASE 0x28 - -// name of the current program (get: traffic lights) -#define TL_CURRENT_PROGRAM 0x29 - -// controlled junctions (get: traffic lights) -#define TL_CONTROLLED_JUNCTIONS 0x2a - -// complete definition (get: traffic lights) -#define TL_COMPLETE_DEFINITION_RYG 0x2b - -// complete program (set: traffic lights) -#define TL_COMPLETE_PROGRAM_RYG 0x2c - -// assumed time to next switch (get: traffic lights) -#define TL_NEXT_SWITCH 0x2d - - - -// outgoing link number (get: lanes) -#define LANE_LINK_NUMBER 0x30 - -// id of parent edge (get: lanes) -#define LANE_EDGE_ID 0x31 - -// outgoing link definitions (get: lanes) -#define LANE_LINKS 0x33 - -// list of allowed vehicle classes (get&set: lanes) -#define LANE_ALLOWED 0x34 - -// list of not allowed vehicle classes (get&set: lanes) -#define LANE_DISALLOWED 0x35 - - -// speed (get: vehicle) -#define VAR_SPEED 0x40 - -// maximum allowed/possible speed (get: vehicle types, lanes, set: edges, lanes) -#define VAR_MAXSPEED 0x41 - -// position (2D) (get: vehicle, poi, set: poi) -#define VAR_POSITION 0x42 - -// angle (get: vehicle) -#define VAR_ANGLE 0x43 - -// angle (get: vehicle types, lanes, set: lanes) -#define VAR_LENGTH 0x44 - -// color (get: vehicles, vehicle types, polygons, pois) -#define VAR_COLOR 0x45 - -// max. acceleration (get: vehicle types) -#define VAR_ACCEL 0x46 - -// max. deceleration (get: vehicle types) -#define VAR_DECEL 0x47 - -// driver reaction time (get: vehicle types) -#define VAR_TAU 0x48 - -// vehicle class (get: vehicle types) -#define VAR_VEHICLECLASS 0x49 - -// emission class (get: vehicle types) -#define VAR_EMISSIONCLASS 0x4a - -// shape class (get: vehicle types) -#define VAR_SHAPECLASS 0x4b - -// offset (brake gap) (get: vehicle types) -#define VAR_GUIOFFSET 0x4c - -// width (get: vehicle types) -#define VAR_WIDTH 0x4d - -// shape (get: polygons) -#define VAR_SHAPE 0x4e - -// type id (get: vehicles, polygons, pois) -#define VAR_TYPE 0x4f - -// road id (get: vehicles) -#define VAR_ROAD_ID 0x50 - -// lane id (get: vehicles) -#define VAR_LANE_ID 0x51 - -// lane index (get: vehicles) -#define VAR_LANE_INDEX 0x52 - -// route id (get & set: vehicles) -#define VAR_ROUTE_ID 0x53 - -// edges (get: routes) -#define VAR_EDGES 0x54 - -// filled? (get: polygons) -#define VAR_FILL 0x55 - -// position (1D along lane) (get: vehicle) -#define VAR_LANEPOSITION 0x56 - -// route (set: vehicles) -#define VAR_ROUTE 0x57 - -// travel time information (get&set: vehicle) -#define VAR_EDGE_TRAVELTIME 0x58 - -// effort information (get&set: vehicle) -#define VAR_EDGE_EFFORT 0x59 - -// last step travel time (get: edge, lane) -#define VAR_CURRENT_TRAVELTIME 0x5a - -// signals state (get/set: vehicle) -#define VAR_SIGNALS 0x5b - -// new lane/position along (set: vehicle) -#define VAR_MOVE_TO 0x5c - -// driver imperfection (set: vehicle) -#define VAR_IMPERFECTION 0x5d - -// speed factor (set: vehicle) -#define VAR_SPEED_FACTOR 0x5e - -// speed deviation (set: vehicle) -#define VAR_SPEED_DEVIATION 0x5f - -// speed without TraCI influence (get: vehicle) -#define VAR_SPEED_WITHOUT_TRACI 0xb1 - -// best lanes (get: vehicle) -#define VAR_BEST_LANES 0xb2 - - - - -// current CO2 emission of a node (get: vehicle, lane, edge) -#define VAR_CO2EMISSION 0x60 - -// current CO emission of a node (get: vehicle, lane, edge) -#define VAR_COEMISSION 0x61 - -// current HC emission of a node (get: vehicle, lane, edge) -#define VAR_HCEMISSION 0x62 - -// current PMx emission of a node (get: vehicle, lane, edge) -#define VAR_PMXEMISSION 0x63 - -// current NOx emission of a node (get: vehicle, lane, edge) -#define VAR_NOXEMISSION 0x64 - -// current fuel consumption of a node (get: vehicle, lane, edge) -#define VAR_FUELCONSUMPTION 0x65 - -// current noise emission of a node (get: vehicle, lane, edge) -#define VAR_NOISEEMISSION 0x66 - - - -// current time step (get: simulation) -#define VAR_TIME_STEP 0x70 - -// number of loaded vehicles (get: simulation) -#define VAR_LOADED_VEHICLES_NUMBER 0x71 - -// loaded vehicle ids (get: simulation) -#define VAR_LOADED_VEHICLES_IDS 0x72 - -// number of departed vehicle (get: simulation) -#define VAR_DEPARTED_VEHICLES_NUMBER 0x73 - -// departed vehicle ids (get: simulation) -#define VAR_DEPARTED_VEHICLES_IDS 0x74 - -// number of vehicles starting to teleport (get: simulation) -#define VAR_TELEPORT_STARTING_VEHICLES_NUMBER 0x75 - -// ids of vehicles starting to teleport (get: simulation) -#define VAR_TELEPORT_STARTING_VEHICLES_IDS 0x76 - -// number of vehicles ending to teleport (get: simulation) -#define VAR_TELEPORT_ENDING_VEHICLES_NUMBER 0x77 - -// ids of vehicles ending to teleport (get: simulation) -#define VAR_TELEPORT_ENDING_VEHICLES_IDS 0x78 - -// number of arrived vehicles (get: simulation) -#define VAR_ARRIVED_VEHICLES_NUMBER 0x79 - -// ids of arrived vehicles (get: simulation) -#define VAR_ARRIVED_VEHICLES_IDS 0x7a - -// delta t (get: simulation) -#define VAR_DELTA_T 0x7b - -// bounding box (get: simulation) -#define VAR_NET_BOUNDING_BOX 0x7c - - - - - - - - -// add an instance (poi, polygon) -#define ADD 0x80 - -// remove an instance (poi, polygon) -#define REMOVE 0x81 - - -// force rerouting based on travel time (vehicles) -#define CMD_REROUTE_TRAVELTIME 0x90 - -// force rerouting based on effort (vehicles) -#define CMD_REROUTE_EFFORT 0x91 - -// validates current route (vehicles) -#define VAR_ROUTE_VALID 0x92 - - - -// zoom -#define VAR_VIEW_ZOOM 0xa0 -// view position -#define VAR_VIEW_OFFSET 0xa1 -// view schema -#define VAR_VIEW_SCHEMA 0xa2 -// view by boundary -#define VAR_VIEW_BOUNDARY 0xa3 -// background color -#define VAR_VIEW_BACKGROUNDCOLOR 0xa4 -// screenshot -#define VAR_SCREENSHOT 0xa5 -// track vehicle -#define VAR_TRACK_VEHICLE 0xa6 -// network size (get: ) -#define VAR_NET_SIZE 0xa7 - - - - -#endif - - - diff --git a/openair2/UTIL/OMG/client_traci_OMG.c b/openair2/UTIL/OMG/client_traci_OMG.c deleted file mode 100644 index b3b43f49b2..0000000000 --- a/openair2/UTIL/OMG/client_traci_OMG.c +++ /dev/null @@ -1,454 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file client_traci_OMG.c -* \brief The OMG TraCI to send/receive commands from/to SUMO via socket interfaces. -* \author S. Uppoor, J. Harri -* \date 2012 -* \version 0.1 -* \company INRIA, Eurecom -* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr -* \note -* \warning -*/ - -#include -#include -#include -#include -#include - -#include "client_traci_OMG.h" -#include "TraCIConstants.h" - -#define UNUSED_VARIABLE(vARIABLE) (void)(vARIABLE) - -int handshake(char *hoststr,int portno) -{ - - check_endianness(); // check endianness - int i; - - for(i = 0; i< 10; i++) { - if ( connection_(hoststr,portno) <0 ) { -#ifdef STANDALONE - printf("connection error...trying again in 3 seconds\n"); -#else - LOG_E(OMG, " Could not connect to TraCIServer - sleeping before trying again...\n"); -#endif - sleep(5); - } else { -#ifdef STANDALONE - printf(" SUMO now connected to OMG on host address\n"); -#else - LOG_N(OMG, " SUMO now connected to OMG on host address %s and port %i .\n", hoststr, portno); -#endif - return 0; - } - } - -#ifdef STANDALONE - printf(" SUMO unreachable...giving up...\n"); -#else - LOG_E(OMG, " SUMO unreachable...giving up...\n"); -#endif - return -1; -} - -void init(int max_sim_time) -{ - -#ifdef STANDALONE - printf(" Initializing TraCI...\n"); -#else - LOG_N(OMG, " Initializing TraCI...\n"); -#endif - char *objID = " "; - // size_t size = strlen(objID); - - int noSubscribedVars = 2; - writeUnsignedByte(0); - writeInt(1 + 4 + 1 + 4 + 4 + 4 + (int) strlen(objID) + 1 + noSubscribedVars); - writeUnsignedByte(CMD_SUBSCRIBE_SIM_VARIABLE); // command id - writeInt(0); // begin time - writeInt(max_sim_time*1000); // end time - writeString(objID); // object id - writeUnsignedByte(noSubscribedVars); // variable number - writeUnsignedByte(VAR_DEPARTED_VEHICLES_IDS); - writeUnsignedByte(VAR_ARRIVED_VEHICLES_IDS); - - // send request message - sendExact(storageLength(storageStart)); - extractCommandStatus(receiveExact(), CMD_SUBSCRIBE_SIM_VARIABLE, description); - - if (departed == NULL) { - departed = (string_list*) malloc(sizeof(string_list)); // departed MUST point to HEAD - departed->string = NULL; - departed->next = NULL; - } - - if (arrived == NULL) { - arrived = (string_list*) malloc(sizeof(string_list)); // arrived MUST point to HEAD - arrived->string = NULL; - arrived->next = NULL; - } - - processSubscriptions(); - - reset(); -} - -void processSubscriptions() -{ - int noSubscriptions = readInt(); - - string_list* tmp_departed = departed; - string_list* tmp_arrived = arrived; - int s; - - for (s = 0; s0xef) { // only responses to subscription to supported types (vehicles, TLC, polygones...) are accepted - //LOG_W(OMG, " Invalide Subscription response: %d\n",cmdId); - //printf(" Invalide Subscription response: %d\n",cmdId); - return; - } - - char *objID = readString(); - int varNo = readUnsignedByte(); - - UNUSED_VARIABLE(objID); - UNUSED_VARIABLE(respStart); - - int i; - - for (i=0; istring = NULL; - departed->next = NULL; - } - - if (arrived == NULL) { - arrived = (string_list*) malloc(sizeof(string_list)); // arrived MUST point to HEAD - arrived->string = NULL; - arrived->next = NULL; - } - - /* if (departed == NULL) - departed = (String_list)malloc(sizeof(String_list)); // departed MUST point to HEAD - - if (arrived == NULL) - arrived = (String_list)malloc(sizeof(String_list)); // departed MUST point to HEAD - */ - - processSubscriptions(); - -} - -void commandClose() -{ - reset(); - // command length - writeUnsignedByte(0x02); - // command id - writeUnsignedByte(CMD_CLOSE); - - // send request message -#ifdef STANDALONE - printf("closing the socket... \n"); -#else - LOG_N(OMG,"closing the socket... \n"); -#endif - sendExact(storageLength(storageStart)); - extractCommandStatus(receiveExact(), CMD_CLOSE, description); - -} - - -void commandGetVehicleVariable(char *vehID, int varID)// malloc for vehID and varID depends on speed or position -{ - reset(); - int domID = CMD_GET_VEHICLE_VARIABLE;//0xa4 specific for get vehicle variable command - - // command length - writeUnsignedByte(1 + 1 + 1 + 4 + (int)strlen(vehID)); - // command id - writeUnsignedByte(CMD_GET_VEHICLE_VARIABLE); - // variable id - writeUnsignedByte(varID); - // object id - writeString(vehID); - - // send request message - sendExact(storageLength(storageStart)); - - // receive answer message - //receiveExact(); - if (extractCommandStatus(receiveExact(), CMD_GET_VEHICLE_VARIABLE, description)) { //<---RESPONSE_GET_VEHICLE_VARIABLE - - // validate result state - if(tracker == NULL) { - // LOG_E(OMG, " client_traci_OMG::commandGetVehicleVariable(): Tracker is NULL \n"); - //printf(" client_traci_OMG::commandGetVehicleVariable(): Tracker is NULL \n"); - return; - } - - int length = readUnsignedByte(); - - if(length ==0) - length = readInt(); - - int cmdId =readUnsignedByte(); - - if (cmdId != (CMD_GET_VEHICLE_VARIABLE+0x10)) { - //LOG_E(OMG, " Wrong response recieved\n"); - //printf(" Wrong response recieved\n"); - return; - } - - int VariableID = readUnsignedByte(); - char* rs = readString(); - - int valueDataType = readUnsignedByte(); - UNUSED_VARIABLE(VariableID); - UNUSED_VARIABLE(rs); - UNUSED_VARIABLE(valueDataType); - UNUSED_VARIABLE(domID); - - free( rs ); - } -} - -// TODO not working for now..need to find a way to get the same info without using CMD_SCENARIO (as not implemented by SUMO) -int commandGetMaxSUMONodesVariable() -{ - reset(); - - int max_car = 0; - - // command length - writeUnsignedByte(1 + 1 + 1 + 1 + 4 + 1 + 1 + 4); - // command id - writeUnsignedByte(CMD_SCENARIO); - // flag - writeUnsignedByte(0x00); // GET command for the generic environment-related values - // command id - //writeUnsignedByte(CMD_SCENARIO); - // domain id - writeUnsignedByte(0x01); // vehicle - - writeInt(0); // first vehicular domain - - // variable id - writeUnsignedByte(DOMVAR_MAXCOUNT); // get maximum number of vehicles - - writeUnsignedByte(TYPE_INTEGER); // get maximum number of vehicles - writeInt(max_car); // get maximum number of vehicles - - // send request message - sendExact(storageLength(storageStart)); - - // receive answer message - if (extractCommandStatus(receiveExact(), CMD_SCENARIO, description)) { //<---RESPONSE_GET_VEHICLE_VARIABLE - - // validate result state - - if(tracker == NULL) { - //LOG_E(OMG, " client_traci_OMG::commandGetMaxSUMONodesVariable(): Tracker is NULL \n"); - return -1; - } - - int res = readUnsignedByte(); - int Length = readUnsignedByte(); // to check with Int - int cmdId =readUnsignedByte(); - - if (cmdId != (CMD_SCENARIO)) { - //LOG_E(OMG, " Wrong response recieved \n"); - return -1; - } - - int flag = readUnsignedByte(); - int dom = readUnsignedByte(); // domain - int domID = readInt(); // domain ID - int VariableID = readUnsignedByte(); - - int valueDataType = readUnsignedByte(); - - if (valueDataType == TYPE_INTEGER) { - max_car = readInt(); - //LOG_N(OMG, " max Number SUMO nodes is: %f \n", max_car); - } else { - //LOG_W(OMG, " No Matching Data Type Value \n"); - } - - UNUSED_VARIABLE(res); - UNUSED_VARIABLE(Length); - UNUSED_VARIABLE(flag); - UNUSED_VARIABLE(dom); - UNUSED_VARIABLE(domID); - UNUSED_VARIABLE(VariableID); - } - - return max_car; -} - - - - -void GetSpeed(node_struct* node, char * sumo_id) -{ - commandGetVehicleVariable(sumo_id, VAR_SPEED); - double speed_double = readDouble(); - node->mob->speed = speed_double; -} - -void GetPosition(node_struct* node, char * sumo_id) -{ - commandGetVehicleVariable(sumo_id, VAR_POSITION); - double x_double = readDouble(); - - if (x_double < 0.0) - x_double = 0.0; - - double y_double = readDouble(); - - if (y_double < 0.0) - y_double = 0.0; - - node->x_pos = x_double; - node->y_pos = y_double; -} diff --git a/openair2/UTIL/OMG/client_traci_OMG.h b/openair2/UTIL/OMG/client_traci_OMG.h deleted file mode 100644 index 4d8b9e86d1..0000000000 --- a/openair2/UTIL/OMG/client_traci_OMG.h +++ /dev/null @@ -1,141 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file client_traci_OMG.h -* \brief The OMG TraCI to send/receive commands from/to SUMO via socket interfaces. -* \author S. Uppoor, J. Harri -* \date 2012 -* \version 0.1 -* \company INRIA, Eurecom -* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr -* \note -* \warning -*/ - -#ifndef TRACICLIENT_OMG_H -#define TRACICLIENT_OMG_H - -#include -#include -#include -#include "omg.h" - -//#include "TraCIConstants.h" -#include "storage_traci_OMG.h" -#include "socket_traci_OMG.h" - -#define MAX_ATTEMPTS 5; // number of connection attemps to SUMO - -int targetTime; - -char *description; - -string_list* departed; // string list of all vehicles appearing in SUMO at the current time step -string_list* arrived; // string list of all vehicles leaving SUMO at the current time step - -/** - * Global parameters defined in storage_traci_OMG.h - */ -extern storage *head; -extern storage *storageStart; -extern storage *tracker; -extern int descLen; - -/** - * \fn handshake(char *,int) - * \brief Talks to SUMO by establishing connection - * \param Accepts host name and port number - */ -int handshake(char *,int); - -/** - * \fn extractCommandStatus(storage *, unsigned char , char *) - * \brief Validates the RESPONSE recieved by SUMO - * \param Accepts storage pointer where data is read and stored, command ID for which response is recieved, description - */ -int extractCommandStatus(storage *, unsigned char , char *); - -/** - * \fn commandSimulationStep(double) - * \brief Advances the SUMO Simulation - * \param Accepts number of steps or seconds SUMO should Simulate - */ -void commandSimulationStep(double); - -/** - * \fn commandClose(void); - * \brief Send termination command to SUMO - */ -void commandClose(void); - -/** - * \fn commandGetVehicleVariable(char *vehID, int varID) - * \brief Gets the position position and speed info - * \param Accepts vehicle ID and variable ID, here variable ID is the comaand type - */ -void commandGetVehicleVariable(char *vehID, int varID); - - -/** - * \fn get_num_sumo_nodes(void) - * \brief Return the total number of nodes to be simulated in SUMO - */ -int commandGetMaxSUMONodesVariable(void); - -/** - * \fn init(int max_sim_time) - * \brief Initialize SUMO and set the periodic subscriptions - */ -void init(int max_sim_time); - -/** - * \fn void processSubscriptions(String_list departed, String_list arrived) - * \brief process the subscription values sent by SUMO at each SUMO time step - */ -void processSubscriptions(void); - -/** - * \fn void GetSpeed(NodePtr node, char * sumo_id); - * \brief ask SUMO to return the speed for the indicated vehicle ID - * \param NodePtr node the pointer to the OAISim node - * \param char *sumo_id the SUMO ID of the target node - */ -void GetSpeed(node_struct* node, char * sumo_id); - -/** - * \fn void Position(NodePtr node, char * sumo_id); - * \brief ask SUMO to return the position (X,Y) for the indicated vehicle ID - * \param NodePtr node the pointer to the OAISim node - * \param char *sumo_id the SUMO ID of the target node - */ -void GetPosition(node_struct* node, char * sumo_id); - - -#endif - diff --git a/openair2/UTIL/OMG/common.c b/openair2/UTIL/OMG/common.c index d02ccf63ce..fa6e70df56 100644 --- a/openair2/UTIL/OMG/common.c +++ b/openair2/UTIL/OMG/common.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file OMG.c * \brief Main function containing the OMG interface @@ -207,7 +199,11 @@ display_node_list (node_list * node_vector) //use a python script to postprocess the positions, check the // support: view node mobility of one node during the entire simulation OR only one snapshot - LOG_F(OMG,"%d; %.3f; %.3f; %.3f\n", + /* TODO: this LOG_F generates a warning, below is a fix that removes a %.3f, maybe it's not the correct fix */ + /*LOG_F(OMG,"%d; %.3f; %.3f; %.3f\n", + tmp->node->id, + tmp->node->x_pos, tmp->node->y_pos);*/ + LOG_F(OMG,"%d; %.3f; %.3f\n", tmp->node->id, tmp->node->x_pos, tmp->node->y_pos); diff --git a/openair2/UTIL/OMG/defs.h b/openair2/UTIL/OMG/defs.h index 99de25b176..96700e6e9c 100644 --- a/openair2/UTIL/OMG/defs.h +++ b/openair2/UTIL/OMG/defs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /** * \file defs.h * \brief Typedefs & Prototypes of OMG functions diff --git a/openair2/UTIL/OMG/grid.c b/openair2/UTIL/OMG/grid.c index 1c3fc0cc5c..6cfcde663b 100644 --- a/openair2/UTIL/OMG/grid.c +++ b/openair2/UTIL/OMG/grid.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file grid.c * \brief * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/grid.h b/openair2/UTIL/OMG/grid.h index 138eb0b552..55c4857801 100644 --- a/openair2/UTIL/OMG/grid.h +++ b/openair2/UTIL/OMG/grid.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** * \file grid.h **/ diff --git a/openair2/UTIL/OMG/id_manager.c b/openair2/UTIL/OMG/id_manager.c deleted file mode 100644 index d37e56210d..0000000000 --- a/openair2/UTIL/OMG/id_manager.c +++ /dev/null @@ -1,236 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file id_manager.c -* \brief Main function containing the OMG ID Manager -* \author J. Harri -* \date 2012 -* \version 0.1 -* \company Eurecom -* \email: -* \note -* \warning -*/ - -#include "id_manager.h" -#include "assertions.h" -#include -#include - -MapPtr create_map(void) -{ - MapPtr ptr; - ptr = malloc(sizeof(map_struct)); - return ptr; -} - -IDManagerPtr create_IDManager(void) -{ - IDManagerPtr ptr; - ptr = malloc(sizeof(id_manager_struct)); - ptr->map_oai2sumo = NULL; - ptr->map_sumo2oai = NULL; - return ptr; -} - -Map_list add_map_entry(MapPtr map, Map_list Map_Vector) -{ - Map_list entry = malloc(sizeof(map_list_struct)); - entry->map = map; - entry->next = NULL; - - if (Map_Vector == NULL) { - //printf("Map-vector is NULL, assigning a new entry\n"); - return entry; - } else { - Map_list tmp = Map_Vector; - - while (tmp->next != NULL) { - //printf("getting the tail...\n"); - tmp = tmp->next; - } - - //printf("got it...adding entry...\n"); - tmp->next = entry; - - return Map_Vector; - } -} - -Map_list remove_entry(MapPtr map, Map_list Map_Vector) -{ - Map_list entry = malloc(sizeof(map_list_struct)); - entry->map = map; - entry->next = NULL; - - if (Map_Vector == NULL) { - return entry; - } else { - Map_list tmp = Map_Vector; - - while (tmp->next != NULL) { - tmp = tmp->next; - } - - tmp->next = entry; - - return Map_Vector; - } -} - -char* get_SumoID_by_OAI(int oai_id, IDManagerPtr ID_manager) -{ - if(ID_manager->map_oai2sumo == NULL) - return NULL; - - else { - return get_sumo_entry(oai_id, ID_manager->map_oai2sumo); - } -} - -int get_oaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager) -{ - if(ID_manager->map_sumo2oai == NULL) { - //printf("ID_Manager: get_oaiID_by_SUMO: uninitialized map\n"); - return -1; - } - - else { - //printf("ID_Manager: get_oaiID_by_SUMO: OAI_entry is: %d \n", get_oai_entry(sumo_id, ID_manager->map_sumo2oai)); - return get_oai_entry(sumo_id, ID_manager->map_sumo2oai); - } -} - -void remove_oaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager) -{ - if(ID_manager->map_sumo2oai == NULL) { - printf("ID_Manager: remove_oaiID_by_SUMO: uninitialized map\n"); - return; - } else { - ID_manager->map_sumo2oai = remove_oai_entry(sumo_id, ID_manager->map_sumo2oai); - - if(ID_manager->map_oai2sumo !=NULL) { - ID_manager->map_oai2sumo = remove_oai_entry(sumo_id, ID_manager->map_oai2sumo); // need to remove in the other list as well - } - - //return ID_manager->map_sumo2oai; - - } -} - -char* get_sumo_entry(int oai_id, Map_list Map_Vector) -{ - Map_list tmp = Map_Vector; - - AssertFatal( Map_Vector, "bug here..should not be NULL" ); - AssertFatal( Map_Vector->map, "bug here..map should have been initialized" ); - - if (tmp->map->oai_id == oai_id) { - //printf("got it...at the head and value is %s \n",tmp->map->sumo_id); - return tmp->map->sumo_id; - } else { - //printf("here...\n"); - while (tmp->next != NULL) { - tmp = tmp->next; - - if (tmp->map->oai_id == oai_id) { - //printf("got it...in main value is %s \n",tmp->map->sumo_id); - return tmp->map->sumo_id; - } - } - } - - return NULL; -} - -int get_oai_entry(char *sumo_id, Map_list Map_Vector) -{ - Map_list tmp = Map_Vector; - - if (strcmp(tmp->map->sumo_id, sumo_id) == 0) { - //printf("found it %s \n",tmp->map->sumo_id); - return tmp->map->oai_id; - } else { - while (tmp->next != NULL) { - tmp = tmp->next; - - if (strcmp(tmp->map->sumo_id, sumo_id) == 0) { - return tmp->map->oai_id; - } - } - } - - return -1; -} - -Map_list remove_oai_entry(char *sumo_id, Map_list Map_Vector) -{ - Map_list tmp = Map_Vector; - - // Map_list entry; - //printf("removing entry %s \n",sumo_id); - if (strcmp(tmp->map->sumo_id, sumo_id) == 0) { - //printf("1: found it %s \n",tmp->map->sumo_id); - // int id = tmp->map->oai_id; - // free(tmp); - if(tmp->next == NULL) - return NULL; - - else { - return tmp->next; - } - - //if(strcmp(tmp->map->sumo_id, "0") == 0) { - //printf("OAI ID is %d \n",id); - //exit(-1); - //} - //return id; - } else { - //printf("removing entry %s \n",sumo_id); - while (tmp->next != NULL) { - if (strcmp(tmp->next->map->sumo_id, sumo_id) == 0) { - //printf("2: found it %s \n",tmp->next->map->sumo_id); - // int id = tmp->next->map->oai_id; - // entry = tmp->next; // save the entry to remove - tmp->next = tmp->next->next; // jump over the entry to be removed - // free(entry); // freeing the entry - //if(strcmp(tmp->next->map->sumo_id, "0") == 0) - // exit(-1); - - //return id; - } - - tmp = tmp->next; - } - } - - return Map_Vector; -} - - diff --git a/openair2/UTIL/OMG/id_manager.h b/openair2/UTIL/OMG/id_manager.h deleted file mode 100644 index d255d84dea..0000000000 --- a/openair2/UTIL/OMG/id_manager.h +++ /dev/null @@ -1,152 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file id_manager.h -* \brief Prototypes of the OMG ID Manager to handle the mapping between OAI ID and SUMO ID -* \author J. Harri -* \date 2012 -* \version 0.1 -* \company Eurecom -* \email: -* \note -* \warning -*/ - -#ifndef __IDMANAGER_H_ -#define __IDMANAGER_H_ - -#include - -/*!A sructure that represents a mapping (OAI_ID, SUMO_ID), i.e the node ID given by OAI and the node ID given by SUMO */ -typedef struct map_struct { - int oai_id; /*!< the oai ID as an integer */ - char *sumo_id; /*!< SUMO gives IDs as strings */ -} map_struct; - -typedef struct map_struct* MapPtr; /*!< The typedef that reflects a #map_struct*/ - -/*!A sructure that gathers all the existing ID Maping */ -struct map_list_struct { - map_struct *map; /*!< Avariable of type #MapPtr. It represents a node */ - struct map_list_struct *next; /*!< A pointer to the next element */ -} map_list_struct; - -typedef struct map_list_struct* Map_list; /*!< The typedef that reflects a #map_list_struct*/ - -/*!A sructure that includes all characteristics of an ID management Unit */ -typedef struct id_manager_struct { - struct map_list_struct *map_oai2sumo; /*!< Avariable of type #MapPtr. It represents the mapping from OAI ID to SUMO ID for one noe */ - struct map_list_struct *map_sumo2oai; /*!< Avariable of type #MapPtr. It represents the mapping from SUMO ID to OAI ID for one noe */ - -} id_manager_struct; - -typedef struct id_manager_struct* IDManagerPtr; /*!< The typedef that reflects a #id_manager_struct*/ - - -/** - * \fn MapPtr create_map(void) - * \brief Create and allocate memory for a map object (OAI ID / SUMO ID). - * \return a pointer to the newly created Map - */ -MapPtr create_map(void); - -/** - * \fn IDManangerPtr create_IDManager(void) - * \brief Create and allocate memory for a the ID Manager. - * \return a pointer to the ID Manager - */ -IDManagerPtr create_IDManager(void); - -/** - * \fn Map_list add_entry(MapPtr map, Map_list Map_Vector) - * \brief Add a mapping entry to the MapList - * \param map the pointer to the map to be added to the Map_list - * \param Map_Vector the reference to the Map_list (pointing to the HEAD if not NULL) - * \retun the pointer to the updated/created map list (pointing to the HEAD) - */ -Map_list add_map_entry(MapPtr map, Map_list Map_Vector); - -/** - * \fn char* get_SumoID_by_OAI(int oai_id, IDManagerPtr ID_manager) - * \brief map a SUMO ID from a OAI ID; return NULL if the mapping does not exist - * \param oai_id the OAI ID to be mapped to the SUMO ID - * \param ID_manager the reference to the ID Manager - * \return the SUMO ID in string format - */ -char* get_sumoID_by_OAI(int oai_id, IDManagerPtr ID_manager); - -/** - * \fn int get_OaiID_by_SUMO(char* sumo_id, IDManagerPtr ID_manager) - * \brief map a OAI ID from a SUMO ID; return -1 if the mapping does not exist - * \param sumo_id the SUMO ID to be mapped to the OAI ID - * \param ID_manager the reference to the ID Manager - * \return the OAI ID in int format - */ -int get_oaiID_by_SUMO(char* sumo_id, IDManagerPtr ID_manager); - -/** - * \fn int remove_OaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager); - * \brief remove an OAI-SUMO mapping from a SUMO ID, and return the ID; return -1 if the mapping does not exist - * \param sumo_id the SUMO ID used to remove the mapping - * \param ID_manager the reference to the ID Manager - * \return the updated pointer to the Map_list -*/ -void remove_oaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager); - -/** - * \fn char* get_sumo_entry(int oai_id, Map_list Map_Vector) - * \brief retrieve the SUMO ID from a OAI ID from the OAI_SUMO map; return NULL if not found - * \param oai_id the OAI ID to retrive the corresponding SUMO ID - * \param Map_Vector the reference to the OAI_2_SUMO Map list - * \return the SUMO ID in string format - */ -char* get_sumo_entry(int oai_id, Map_list Map_Vector); - -/** - * \fn get_oai_entry(char* sumo_id, Map_list Map_Vector) - * \brief retrieve the OAI ID from a SUMO ID from the SUMO_OAI map; returns -1 if not found - * \param sumo_id the SUMO ID to retrieve the corresponding OAI ID - * \param Map_Vector the reference to the SUMO_2_OAI Map list - * \return the OAI ID in int format - */ -int get_oai_entry(char*, Map_list); - - -/** - * \fn int remove_oai_entry(char *sumo_id, Map_list Map_Vector); - * \brief remove the SUMO-OAI mapping, from a SUMO ID; returns the found OAI ID; returns -1 if the mapping does not exist. - * \param sumo_id the SUMO ID used to remove the mapping. - * \param Map_Vector the reference to the SUMO_2_OAI Map list - * \return the updated pointer to the Map_list - */ -Map_list remove_oai_entry(char *sumo_id, Map_list Map_Vector); - - - -#endif /* __IDMANAGER_H_ */ diff --git a/openair2/UTIL/OMG/job.c b/openair2/UTIL/OMG/job.c index e43ed1a3eb..1df44cb2c0 100644 --- a/openair2/UTIL/OMG/job.c +++ b/openair2/UTIL/OMG/job.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file job.c * \brief handle jobs for future nodes' update * \author S. Gashaw, M. Mahersi, J. Harri, N. Nikaein, diff --git a/openair2/UTIL/OMG/makefile b/openair2/UTIL/OMG/makefile index 319b8296cd..80ab8c6394 100644 --- a/openair2/UTIL/OMG/makefile +++ b/openair2/UTIL/OMG/makefile @@ -60,7 +60,7 @@ OPENAIR2_TOP = ../../../openair2 OPENAIR3_TOP = ../../../openair3 OPENAIR3 = $(OPENAIR3_DIR) -CFLAGS += -DPHYSIM -DNODE_RG -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 #-Wno-packed-bitfield-compat +CFLAGS += -DPHYSIM -DNODE_RG -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 #-Wno-packed-bitfield-compat CFLAGS += -DOPENAIR_LTE -DOPENAIR2 #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE @@ -75,8 +75,6 @@ ifdef PDCP_USE_NETLINK CFLAGS += -DPDCP_USE_NETLINK -DLINUX -DDEBUG_CONTROL endif -CFLAGS += -DPHY_ABSTRACTION - include $(OPENAIR1_DIR)/PHY/Makefile.inc include $(OPENAIR1_DIR)/SCHED/Makefile.inc include $(OPENAIR2_DIR)/LAYER2/Makefile.inc diff --git a/openair2/UTIL/OMG/makefile_old b/openair2/UTIL/OMG/makefile_old index acc89254fb..7bc551cb03 100644 --- a/openair2/UTIL/OMG/makefile_old +++ b/openair2/UTIL/OMG/makefile_old @@ -62,7 +62,7 @@ OPENAIR2_TOP = ../../../openair2 OPENAIR3_TOP = ../../../openair3 OPENAIR3 = $(OPENAIR3_DIR) -CFLAGS += -DPHYSIM -DNODE_RG -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 #-Wno-packed-bitfield-compat +CFLAGS += -DPHYSIM -DNODE_RG -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 #-Wno-packed-bitfield-compat CFLAGS += -DOPENAIR_LTE -DOPENAIR2 #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE @@ -77,8 +77,6 @@ ifdef PDCP_USE_NETLINK CFLAGS += -DPDCP_USE_NETLINK -DLINUX -DDEBUG_CONTROL endif -CFLAGS += -DPHY_ABSTRACTION - include $(OPENAIR1_DIR)/PHY/Makefile.inc include $(OPENAIR1_DIR)/SCHED/Makefile.inc include $(OPENAIR2_DIR)/LAYER2/Makefile.inc diff --git a/openair2/UTIL/OMG/makefile_standalone b/openair2/UTIL/OMG/makefile_standalone index 68170543ee..d612c01837 100644 --- a/openair2/UTIL/OMG/makefile_standalone +++ b/openair2/UTIL/OMG/makefile_standalone @@ -8,7 +8,7 @@ OBJsumo = omg.c common.c sumo.c client_traci_OMG.c socket_traci_OMG.c storage_tr OBJ = omg.c common.c static.c job.c rwp.c rwalk.c trace.c steadystaterwp.c sumo.c grid.c mobility_parser.c hashtable.c client_traci_OMG.c socket_traci_OMG.c storage_traci_OMG.c id_manager.c -CFLAGS += -DSTANDALONE -DUSER_MODE -g +CFLAGS += -DSTANDALONE -g .PHONY: help staticOMG rwpOMG clean diff --git a/openair2/UTIL/OMG/mobility_parser.c b/openair2/UTIL/OMG/mobility_parser.c index d011dbe34f..31496af956 100644 --- a/openair2/UTIL/OMG/mobility_parser.c +++ b/openair2/UTIL/OMG/mobility_parser.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file mobility_parser.c * \brief A parser for trace-based mobility information (parsed from a file) diff --git a/openair2/UTIL/OMG/mobility_parser.h b/openair2/UTIL/OMG/mobility_parser.h index 834f01d64a..403d7886ce 100644 --- a/openair2/UTIL/OMG/mobility_parser.h +++ b/openair2/UTIL/OMG/mobility_parser.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file mobility_parser.h * \brief A parser for trace-based mobility information (parsed from a file) diff --git a/openair2/UTIL/OMG/omg.c b/openair2/UTIL/OMG/omg.c index 12b9395f75..83f38f13d5 100644 --- a/openair2/UTIL/OMG/omg.c +++ b/openair2/UTIL/OMG/omg.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file OMG.c * \brief Main function containing the OMG API to oaisim or any other simulator/emulator @@ -53,7 +45,9 @@ #include "trace.h" #include "grid.h" #include "steadystaterwp.h" +#ifdef SUMO_IF #include "sumo.h" +#endif #include "../OMV/structures.h" //#define STANDALONE @@ -117,11 +111,11 @@ init_mobility_generator (omg_global_param omg_param_list[]) case TRACE: start_trace_generator (omg_param_list[node_t]); break; - +#ifdef SUMO_IF case SUMO: start_sumo_generator (omg_param_list[node_t]); break; - +#endif case STEADY_RWP: start_steadystaterwp_generator (omg_param_list[node_t]); break; @@ -160,12 +154,12 @@ stop_mobility_generator (omg_global_param * omg_param_list) case STEADY_RWP: break; - +#ifdef SUMO_IF case SUMO: stop_sumo_generator (); //LOG_D(OMG," --------OMG will interface with SUMO for mobility generation-------- \n"); break; - +#endif default: LOG_N (OMG, "Unsupported generator\n"); } @@ -206,12 +200,12 @@ update_node_vector (int mobility_type, double cur_time) case TRACE: update_trace_nodes (cur_time); break; - +#ifdef SUMO_IF case SUMO: // printf("in SUMO case \n"); update_sumo_nodes (cur_time); break; - +#endif case STEADY_RWP: update_steadystaterwp_nodes (cur_time); break; @@ -256,12 +250,12 @@ get_nodes_positions (int mobility_type, double cur_time) case TRACE: get_trace_positions_updated (cur_time); break; - +#ifdef SUMO_IF case SUMO: LOG_I (OMG, "getting positions from SUMO\n"); get_sumo_positions_updated (cur_time); break; - +#endif case STEADY_RWP: get_steadystaterwp_positions_updated (cur_time); break; @@ -379,11 +373,11 @@ set_new_mob_type (int id, int node_t, int mob_t, double cur_time) move_steadystaterwp_node (pair, cur_time); break; - +#ifdef SUMO_IF case SUMO: LOG_E (OMG, "not possible to change mobility type to sumo \n"); break; - +#endif case TRACE: LOG_E (OMG, "not possible to change mobility type to trace \n"); break; diff --git a/openair2/UTIL/OMG/omg.h b/openair2/UTIL/OMG/omg.h index 1df5205df7..07dbf1f750 100644 --- a/openair2/UTIL/OMG/omg.h +++ b/openair2/UTIL/OMG/omg.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file OMG.h * \brief Prototypes of OMG APIs * \author M. Mahersi, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/omg_constants.h b/openair2/UTIL/OMG/omg_constants.h index ba09ac6dd8..1d70551b03 100644 --- a/openair2/UTIL/OMG/omg_constants.h +++ b/openair2/UTIL/OMG/omg_constants.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** * \file omg_constants.h diff --git a/openair2/UTIL/OMG/omg_hashtable.c b/openair2/UTIL/OMG/omg_hashtable.c index 761750a634..32b3840af3 100644 --- a/openair2/UTIL/OMG/omg_hashtable.c +++ b/openair2/UTIL/OMG/omg_hashtable.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file omg_hashtable.c * \brief A 'C' implementation of a hashtable diff --git a/openair2/UTIL/OMG/omg_hashtable.h b/openair2/UTIL/OMG/omg_hashtable.h index c5437e381c..238be879fd 100644 --- a/openair2/UTIL/OMG/omg_hashtable.h +++ b/openair2/UTIL/OMG/omg_hashtable.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file omg_hashtable.h * \brief A 'C' implementation of a hashtable diff --git a/openair2/UTIL/OMG/omg_vars.h b/openair2/UTIL/OMG/omg_vars.h index f2715cdf1b..bf0a13e5b5 100644 --- a/openair2/UTIL/OMG/omg_vars.h +++ b/openair2/UTIL/OMG/omg_vars.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** * \file omg_vars.h diff --git a/openair2/UTIL/OMG/rwalk.c b/openair2/UTIL/OMG/rwalk.c index 1a406d20e8..8c8840a91f 100644 --- a/openair2/UTIL/OMG/rwalk.c +++ b/openair2/UTIL/OMG/rwalk.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rwalk.c * \brief random walk mobility generator diff --git a/openair2/UTIL/OMG/rwalk.h b/openair2/UTIL/OMG/rwalk.h index 6d38a8f799..114f8a48f9 100644 --- a/openair2/UTIL/OMG/rwalk.h +++ b/openair2/UTIL/OMG/rwalk.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** * \file rwalk.h diff --git a/openair2/UTIL/OMG/rwp.c b/openair2/UTIL/OMG/rwp.c index 6766cd9555..8e5ab43081 100644 --- a/openair2/UTIL/OMG/rwp.c +++ b/openair2/UTIL/OMG/rwp.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rwp.c * \brief random waypoint mobility generator diff --git a/openair2/UTIL/OMG/rwp.h b/openair2/UTIL/OMG/rwp.h index ae895b95e3..4a6c32cd56 100644 --- a/openair2/UTIL/OMG/rwp.h +++ b/openair2/UTIL/OMG/rwp.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * \file rwp.h diff --git a/openair2/UTIL/OMG/socket_traci_OMG.c b/openair2/UTIL/OMG/socket_traci_OMG.c deleted file mode 100644 index 1a62ec04da..0000000000 --- a/openair2/UTIL/OMG/socket_traci_OMG.c +++ /dev/null @@ -1,211 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file socket_traci_OMG.c -* \brief The socket interface of TraCI to connect OAI to SUMO. A 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) -* \author S. Uppoor -* \date 2012 -* \version 0.1 -* \company INRIA -* \email: sandesh.uppor@inria.fr -* \note -* \warning -*/ - -#include -#include -#include -#include -#include -#include -#include -#include "socket_traci_OMG.h" -#include "storage_traci_OMG.h" - - -int connection_(char *hoststr,int portno) -{ - host = gethostbyname(hoststr); - - printf("trying to connect to %s at the port %i \n",hoststr, portno); - - if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { -#ifdef STANDALONE - printf(" Socket Error\n"); -#else - LOG_D(OMG, " Socket Error\n"); -#endif - } - - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(portno); - server_addr.sin_addr = *((struct in_addr *)host->h_addr); - bzero(&(server_addr.sin_zero),8); - - if (connect(sock, (struct sockaddr *)&server_addr, - sizeof(struct sockaddr)) < 0) { -#ifdef STANDALONE - printf("Connection Failed\n"); -#else - LOG_E(OMG, " Connection Error\n"); -#endif - - return -1; - - } - - return 1; -} - - -void sendExact(int cmdLength) -{ - - msgLength = cmdLength + 4; - writeInt(msgLength); - - rearange(); - unsigned char *buf = (unsigned char *)malloc(sizeof(unsigned char) * (msgLength)); - storage *cur_ptr = storageStart; - size_t i = 0; - size_t numbytes = msgLength; - - while (cur_ptr->next != NULL) { - buf[i]= cur_ptr->item; - cur_ptr = cur_ptr->next; - i++; - } - - buf[i]= cur_ptr->item; - - while (numbytes > 0) { - int n = send(sock, buf, (int)numbytes, 0);//<----- need to check - - if (numbytes == n) - break; - - if (n<0) { -#ifdef STANDALONE - printf(" ERROR writing to socket\n"); -#else - LOG_E(OMG, " ERROR writing to socket\n"); -#endif - - } - - numbytes -= n; - buf +=n; - } - - freeStorage(storageStart); - free(buf); -} - - - -storage * receiveExact() -{ - - unsigned char* bufLength = (unsigned char *)malloc(sizeof(unsigned char) * (4)); - int bytesRead = 0; - int readThisTime = 0; - - //Get the length of the entire message by reading the 1st field - while (bytesRead<4) { - readThisTime = recv( sock, (char*)(bufLength + bytesRead), 4-bytesRead, 0 ); - - if( readThisTime <= 0 ) { -#ifdef STANDALONE - printf(" tcpip::Socket::receive() @ recv\n"); -#else - LOG_E(OMG, " tcpip::Socket::receive() @ recv\n"); -#endif - } - - bytesRead += readThisTime; - } - - // create storage to access the content - tracker = writePacket(bufLength, 4); - - free( bufLength ); - bufLength = 0; - - // store pointer to free the space later - // storage *freeTracker = tracker; - int s= readInt(); - int NN = s - 4; - printf("debug \n"); - printf("value of s is %d \n",s); - printf("end debug \n"); - //Free space after use - //freeStorage(freeTracker); // JHNOte: will be done by calling reset() in storage_traci_omg - - int mySize = 0; - mySize = sizeof(unsigned char) * (NN); - printf("debug \n"); - printf("value of mySize is %d \n",mySize); - printf("end debug \n"); - // receive actual message content - //unsigned char* buf = (unsigned char *)malloc(sizeof(unsigned char) * (NN)); - unsigned char* buf = (unsigned char *)malloc(mySize); - - bytesRead = 0; - readThisTime = 0; - - while (bytesRead. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file socket_traci_OMG.h -* \brief The socket interface of TraCI to connect OAI to SUMO. A 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) -* \author S. Uppoor -* \date 2012 -* \version 0.1 -* \company INRIA -* \email: sandesh.uppor@inria.fr -* \note -* \warning -*/ - -#ifndef SOCKET_TRACI_OMG_H -#define SOCKET_TRACI_OMG_H - -#include -#include -#include -#include -#include - -#include "omg.h" -#include "storage_traci_OMG.h" - -int sock, portno, msgLength; -struct hostent *host; -struct sockaddr_in server_addr; - -/** - * Global parameters defined in storage_traci_OMG.h - */ -extern storage *tracker; -extern storage *head; -extern storage *storageStart; - - -/** - * \fn connection_(char *,int) - * \brief Talks to SUMO by establishing connection - * \param Accepts host name and port number - */ -int connection_(char *, int); - -/** - * \fn sendExact(int); - * \brief Pack the data from storage to buf and write to socket - * \param Accepts command length - */ -void sendExact(int); - -/** - * \fn recieveExact(void); - * \brief Pack the data to storage from buf after reading from socket - * Returns storage pointer - */ -storage* receiveExact(void); - - -/** - * \fn close_connection(void); - * \brief close socket connection - */ -void close_connection(void); - -#endif diff --git a/openair2/UTIL/OMG/static.c b/openair2/UTIL/OMG/static.c index 8305c6e9b7..361fa969e9 100644 --- a/openair2/UTIL/OMG/static.c +++ b/openair2/UTIL/OMG/static.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rwalk.c * \brief static mobility generator diff --git a/openair2/UTIL/OMG/static.h b/openair2/UTIL/OMG/static.h index 1b5cb0f72f..b7fa800968 100644 --- a/openair2/UTIL/OMG/static.h +++ b/openair2/UTIL/OMG/static.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** * \file static.h diff --git a/openair2/UTIL/OMG/steadystaterwp.c b/openair2/UTIL/OMG/steadystaterwp.c index ba2e0d88f7..d4d2fde4e4 100644 --- a/openair2/UTIL/OMG/steadystaterwp.c +++ b/openair2/UTIL/OMG/steadystaterwp.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file steadystaterwp.c * \brief random waypoint mobility generator diff --git a/openair2/UTIL/OMG/steadystaterwp.h b/openair2/UTIL/OMG/steadystaterwp.h index 1e274d9e1f..08bca4d28e 100644 --- a/openair2/UTIL/OMG/steadystaterwp.h +++ b/openair2/UTIL/OMG/steadystaterwp.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file steadystaterwp.h * \brief random waypoint mobility generator diff --git a/openair2/UTIL/OMG/storage_traci_OMG.c b/openair2/UTIL/OMG/storage_traci_OMG.c deleted file mode 100644 index f8ccfdc059..0000000000 --- a/openair2/UTIL/OMG/storage_traci_OMG.c +++ /dev/null @@ -1,527 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file storage_traci_OMG.c -* \brief The data storage object carrying data from/to SUMO. 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) -* \author S. Uppoor -* \date 2012 -* \version 0.2 -* \company INRIA -* \email: sandesh.uppor@inria.fr -* \note 0.1 -> 0.2: (J. Harri) added reader and writer to String_list -* \warning -*/ - - -#include -#include "storage_traci_OMG.h" - -//using namespace std -bool bigEndian; - - -void reset() -{ - tracker = NULL; - head = NULL; - descLen = 0; - freeStorage(storageStart); // freeing the storage object - storageStart=NULL; - -} - -void check_endianness() -{ - - //checking endianness - un.s = 0x0102; - - if (sizeof(short) == 2) { - if (un.c[0] == 1 && un.c[1] == 2) - bigEndian = true; - } -} - - -int storageLength(storage *cur_ptr) -{ - - int count=0; - - while(cur_ptr != NULL) { - cur_ptr=cur_ptr->next; - count++; - } - - return(count); -} - -void rearange() -{ - //Since linked list is used, all data is appended to the last pointer, - // we face problem in sendExact(int cmdLength) in socket_traci_OMG.c - // since total length of the entire message is appended last - // storage = command + length(4 bytes) is changed to storage = length(4 bytes) + command - int pos = msgLength - 4; - int count =0; - - storage *cur_ptr = NULL; - storage *temp_ptr = NULL; - storage *temp_pptr = NULL; - - cur_ptr = storageStart; - - while (count != pos && cur_ptr->next != NULL) { - temp_pptr = cur_ptr; - cur_ptr = cur_ptr->next; - - count++; - } - - temp_ptr = cur_ptr; - - while(cur_ptr->next != NULL) { - cur_ptr = cur_ptr-> next; - } - - cur_ptr->next = storageStart; - storageStart = temp_ptr; - temp_pptr->next = NULL; - -} - -unsigned char readChar() -{ - // if (tracker!=NULL) - // { - unsigned char hd = tracker->item; - //printf("OMG char: %d \n",(int)hd); - tracker = tracker->next; - return hd; - //}else - // { - // LOG_E(OMG, " Storage::readChar(): Tracker is NULL \n"); - // unsigned char *error = NULL; - // return error; // - // } - - -} - -void writeChar(unsigned char value) -{ - storage *temp; - temp = (storage *)malloc(sizeof(storage)); - - if (head == NULL) { - head = temp; - head->next = NULL; - head->item = value; - storageStart = temp; //points to start of actual message - } else { - head->next = temp; - temp->next = NULL; - temp->item = value; - head = temp; - } -} - -int readByte() -{ - int i = (int)(readChar()); - - if (i < 128) return i; - else return (i - 256); - -} - -void writeByte(int value) -{ - if (value < -128 || value > 127) { - LOG_E(OMG, " Storage::writeByte(): Invalid value, not in [-128, 127]\n"); - } - - writeChar( (unsigned char)( (value+256) % 256 ) ); -} - -int readUnsignedByte() -{ - - return (int)(readChar()); - -} - - -void writeUnsignedByte(int value) -{ - if (value < 0 || value > 255) { - LOG_E(OMG, " Storage::writeUnsignedByte(): Invalid value, not in [0, 255]\n"); - } - - writeChar( ((unsigned char)value)); -} - -// JNNOTE: had to change the behavior here, as tmp was always pointing at the end of the String and not at the beginning: accordingly, all strings where always '0' -char * readString() -{ - - int i=0; - int len = readInt(); - - descLen = len; - char *tmp = (char *)malloc(sizeof(char) * (len)); - char *ret = tmp; // JHNOTE: added a pointer pointing at the head of the String - - //printf("OMG ready to readString of length %d \n",len); - for (; i < len; i++) { - *tmp++ = (char) readChar(); - } - - *tmp++ = '\0'; // makes sure it's NUL terminated - - //printf("OMG readString - %s \n",ret); - //printf("OMG readString - %s \n",tmp); - return ret; // the head is returned - -} - - -void writeString(char *s) -{ - int count=0; - char* s_copy=s; - - for(; *s!='\0'; s++) - count++; - - writeInt(count); - - for(; *s_copy!='\0'; s_copy++) - writeChar(*s_copy); - -} - -string_list* readStringList(string_list* vector) -{ - - int i=0; - int len = readInt(); - descLen = len; - string_list* entry = NULL; - - for (; i < len; i++) { - if (vector->string == NULL) { - char *tmp = readString(); - //printf("OMG - 1 SUMO ID: %s \n",tmp); - vector->string = tmp;//readString(); - } else { - entry = (string_list*) malloc(sizeof(string_list)); - char *tmp = readString(); - //printf("OMG - SUMO ID: %s \n",tmp); - entry->string = tmp;//readString(); - entry->next = NULL; - - if(vector !=NULL) { - string_list* tmp = vector; - - while (tmp->next != NULL) { - tmp = tmp->next; - } - - tmp->next = entry; - } - } - } - - return vector; - -} - - -void writeStringList(string_list* vector) -{ - - - int count=0; - string_list* tmp = vector; - - // JHNote: a better solution would be to save the pointer to the reference of this Int and replace the value with count at the end.... - if (tmp->string !=NULL) - count++; - - while (tmp->next != NULL) { - tmp = tmp->next; - count++; - } - - writeInt(count); - - tmp = vector; - - if (tmp->string !=NULL) { - writeString(tmp->string); - } - - while (tmp->next != NULL) { - tmp = tmp->next; - writeString(tmp->string); - } - -} - - -int readShort() -{ - LOG_W(OMG, " readShort not implented \n"); - return -1; -} - -void writeShort(int value) -{ - LOG_W(OMG, " writeShort not implented \n"); - return; -} - - -int readInt() -{ - int value = 0; - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - // network is big endian - p_value[0] = readChar(); - p_value[1] = readChar(); - p_value[2] = readChar(); - p_value[3] = readChar(); - } else { - // network is little endian - p_value[3] = readChar(); - p_value[2] = readChar(); - p_value[1] = readChar(); - p_value[0] = readChar(); - } - - return value; - -} - - -void writeInt(int value) -{ - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - // network is big endian - writeChar(p_value[0]); - writeChar(p_value[1]); - writeChar(p_value[2]); - writeChar(p_value[3]); - - } else { - // network is little endian - - writeChar(p_value[3]); - writeChar(p_value[2]); - writeChar(p_value[1]); - writeChar(p_value[0]); - } -} - -float readFloat() -{ - - float value = 0; - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - // network is big endian - p_value[0] = readChar(); - p_value[1] = readChar(); - p_value[2] = readChar(); - p_value[3] = readChar(); - } else { - // network is big endian - p_value[3] = readChar(); - p_value[2] = readChar(); - p_value[1] = readChar(); - p_value[0] = readChar(); - } - - return value; - -} - - -void writeFloat(float value) -{ - - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - // network is big endian - writeChar(p_value[0]); - writeChar(p_value[1]); - writeChar(p_value[2]); - writeChar(p_value[3]); - } else { - // network is big endian - writeChar(p_value[3]); - writeChar(p_value[2]); - writeChar(p_value[1]); - writeChar(p_value[0]); - } -} - - -double readDouble() -{ - - double value = 0; - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - // network is big endian - int i = 0; - - for (; i<8; ++i) { - p_value[i] = readChar(); - } - } else { - int i=7; - - // network is big endian - for (; i>=0; --i) { - p_value[i] = readChar(); - } - } - - return value; - -} - -void writeDouble(double value) -{ - unsigned char *p_value = (unsigned char*)(&value); - - if (bigEndian) { - int i=0; - - // network is big endian - for (; i<8; ++i) { - writeChar(p_value[i]); - } - } else { - int i=7; - - // network is big endian - for (; i>=0; --i) { - writeChar(p_value[i]); - } - } - -} - - - -storage* writePacket (unsigned char* packet, int length) -{ - - //printf("required length is %d \n",length); - - storage *recvpacket = NULL; - storage *recvpacketStart= NULL; - storage *temp_ = NULL; - - int localSize = sizeof(storage); - printf("size of storage is %d bytes \n",localSize); - - int i = 0; - - for(; i < length; i++) { - - printf("in %d round \n",i); - //storage *temp_ = (storage *)malloc(sizeof(storage)); - temp_ = (storage *)malloc(sizeof(storage)); - - - if (recvpacket == NULL) { - recvpacket = temp_; - recvpacketStart = recvpacket; - recvpacket->next = NULL; - recvpacket->item = packet[i]; - } else { - temp_->next =NULL; - temp_-> item = packet[i]; - recvpacket-> next = temp_; - recvpacket =temp_; - } - } - - return recvpacketStart; - -} - - -/*void writeStorage(){ - LOG_W(OMG, " writeStorage not implented \n"); - return; - -}*/ - -void freeStorage(storage * freePtr) -{ - - storage *node,*temp; - node = freePtr; // start at the head. - - while (node != NULL) { // traverse entire list. - temp = node ; // save node pointer. - node = node->next; // advance to next. - free(temp); - } // free the saved one. - - freePtr = NULL; // finally, mark as empty list. -} - -void reset_String_list(string_list* vector) -{ - string_list* entry = vector; - string_list* tmp; - - while (entry->next != NULL) { - tmp = entry; - entry = entry->next; - free(tmp); - } - - vector = NULL; -} - - diff --git a/openair2/UTIL/OMG/storage_traci_OMG.h b/openair2/UTIL/OMG/storage_traci_OMG.h deleted file mode 100644 index e1f97615c6..0000000000 --- a/openair2/UTIL/OMG/storage_traci_OMG.h +++ /dev/null @@ -1,119 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file storage_traci_OMG.h -* \brief The data storage object carrying data from/to SUMO. 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr) -* \author S. Uppoor -* \date 2012 -* \version 0.1 -* \company INRIA -* \email: sandesh.uppor@inria.fr -* \note -* \warning -*/ - -#ifndef STORAGE_TRACI_OMG_H -#define STORAGE_TRACI_OMG_H - -#include -#include -#include -#include -#include -#include "omg.h" - -// sortation of bytes forwards or backwards?------------------ - -extern bool bigEndian; - -union n { - short s; - char c[sizeof(short)]; -} un ; - - -void check_endianness(void); - -//----------------STORAGE------------------------------------ -struct Storage { - - unsigned char item; - struct Storage *next; - -} ; -typedef struct Storage storage; -// pointer which always points to next entry to be read -// updated in readChar function in storage_traci_OMG - -storage *tracker; -storage *head; -storage *storageStart; -int descLen; - -extern int msgLength; - -void reset(void); -int storageLength(storage *); - -void rearange(void); -unsigned char readChar(void); -void writeChar(unsigned char); - -int readByte(void) ; -void writeByte(int) ; - - -int readUnsignedByte(void); -void writeUnsignedByte(int); - -char * readString(void) ; -void writeString(char *); - -string_list* readStringList(string_list*) ; -void writeStringList(string_list*); - -int readShort(void) ; -void writeShort(int); - -int readInt(void) ; -void writeInt(int); - -float readFloat(void) ; -void writeFloat( float ); - -double readDouble(void) ; -void writeDouble( double ); - -storage* writePacket(unsigned char*, int); - -//void writeStorage(storage & ); -void freeStorage(storage *); - -#endif - diff --git a/openair2/UTIL/OMG/sumo.c b/openair2/UTIL/OMG/sumo.c deleted file mode 100644 index 4af34d0bc1..0000000000 --- a/openair2/UTIL/OMG/sumo.c +++ /dev/null @@ -1,503 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file sumo.c -* \brief The OMG interface to SUMO (Simulation of Urban Mobility) -* \author S. Uppoor, J. Harri -* \date 2012 -* \version 0.1 -* \company INRIA, Eurecom -* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr -* \note -* \warning -*/ - -#include -#include -#include - -#include -#include -#include -#include - -#include "sumo.h" - -#include "client_traci_OMG.h" -#include "assertions.h" - - -int -start_sumo_generator (omg_global_param omg_param_list) -{ - - char sumo_line[300]; - int n_id; - static int id = 0; - - // sprintf(sumo_line, "%s -c %s -b %d -e %d --remote-port %d --step-length %d -v ",omg_param_list.sumo_command, omg_param_list.sumo_config, omg_param_list.sumo_start, omg_param_list.sumo_end, omg_param_list.sumo_port, omg_param_list.sumo_step); - - sprintf (sumo_line, "%s -c %s ", omg_param_list.sumo_command, - omg_param_list.sumo_config); - - printf ("%s\n", sumo_line); - - if ((pid = fork ()) == 0) { - // Start SUMO in the child process - if (system (sumo_line)) ; /* this if for no gcc warnings */ - //childs addresss space - } - - //still in the parent process - - // Talk to SUMO - - targetTime = 1; - - departed = NULL; - arrived = NULL; - - // switch on error to return to OAI - handshake (omg_param_list.sumo_host, omg_param_list.sumo_port); - - init (omg_param_list.sumo_end - omg_param_list.sumo_start); - - int max_node_SUMO = 100; //commandGetMaxSUMONodesVariable(); TODO method not implemented in TraCI server..must find another solution - - // printf("received Number of nodes %d\n", max_node_SUMO); - - // create the OAI/SUMO ID manager - id_manager = create_IDManager (); - - node_struct *node = NULL; - mobility_struct *mobility = NULL; - - active_nodes = NULL; // container to return a subset of only ACTIVE OAI nodes in SUMO - - last_update_time = 0.0; - - // just check for faulty values - if (omg_param_list.nodes <= 0) { -#ifdef STANDALONE - printf ("Number of nodes has not been set\n"); -#else - LOG_W (OMG, "Number of nodes has not been set\n"); -#endif - return (-1); - } - -#ifdef STANDALONE - printf ("Number of OAI-equipped nodes in SUMO has been set to %d\n", - omg_param_list.nodes); - printf ("Number of SUMO simulated nodes has been set to %d\n", - max_node_SUMO); -#else - LOG_I (OMG, "Number of OAI-equipped nodes in SUMO has been set to %d\n", - omg_param_list.nodes); - LOG_I (OMG, "Number of SUMO simulated nodes has been set to %d\n", - max_node_SUMO); -#endif - - // check and match number of nodes in mobility file provided - if (omg_param_list.nodes > max_node_SUMO) { -#ifdef STANDALONE - printf ("Not all OAI nodes will be moving according to SUMO.\n"); -#else - LOG_I (OMG, "Not all OAI nodes will be moving according to SUMO.\n"); -#endif - } else { -#ifdef STANDALONE - printf ("OAI nodes will be mapped to a subset of SUMO nodes\n"); -#else - LOG_I (OMG, "OAI nodes will be mapped to a subset of SUMO nodes\n"); -#endif - } - - if (omg_param_list.nodes_type == eNB) { -#ifdef STANDALONE - printf ("Node type has been set to eNB\n"); -#else - LOG_I (OMG, "Node type has been set to eNB\n"); -#endif - } else if (omg_param_list.nodes_type == UE) { - -#ifdef STANDALONE - printf ("Node type has been set to UE\n"); -#else - LOG_I (OMG, "Node type has been set to UE\n"); -#endif - } - - for (n_id = id; n_id < omg_param_list.nodes + id; n_id++) { - - node = create_node (); - mobility = create_mobility (); - node->mobile = 0; // 0 means inactive in SUMO; 1 means active in SUMO; as long as a mapping between OAI-SUMO has not been created, nodes are inactive and do not move - node->id = n_id; // this is OAI ID, not SUMO - node->type = omg_param_list.nodes_type; // UE eNB... - node->generator = SUMO; // SUMO - node->mob = mobility; - - // FIXME! wrong use of node_vector and node_vector_end - // FIXME node_vector_end is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types - // FIXME node_vector is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types - - node_vector_end[SUMO] = - (node_list *) add_entry (node, node_vector_end[SUMO]); - - if (node_vector[SUMO] == NULL) - node_vector[SUMO] = node_vector_end[SUMO]; - } - - id += omg_param_list.nodes; - - update_IDs (); // update the mapping between departed and arrived nodes in SUMO. - - return (0); -} - -void -update_IDs (void) -{ -#ifdef STANDALONE - printf ("Updating the ID mapping between SUMO and OAI\n"); -#else - LOG_D (OMG, "Updating the ID mapping between SUMO and OAI\n"); -#endif - string_list *tmp_arrived, *tmp_departed; - - if (arrived == NULL) { - printf ("arrived vehicles is NULL \n"); - return; - } - - tmp_arrived = arrived; - tmp_departed = departed; - - if (departed == NULL) { - printf ("departed vehicles is NULL \n"); - return; - } - - if (tmp_departed->string != NULL) { - // char *tmp_string = malloc (sizeof (strlen (tmp_departed->string))); - char *tmp_string = malloc( strlen(tmp_departed->string) + 1 ); - strcpy (tmp_string, tmp_departed->string); - //printf("OMG - 2 head is not null and value is: %s\n",tmp_string); - int OAI_ID = get_oaiID_by_SUMO (tmp_string, id_manager); - - if (OAI_ID == -1) { - if (!activate_and_map (tmp_string)) { - // printf("Reached the Maximum of OAI nodes to be mapped to SUMO\n"); - // LOG_I(OMG, "Reached the Maximum of OAI nodes to be mapped to SUMO\n"); - free( tmp_string ); - return; // stopping mapping as the maximum of OAI nodes has been reached; - } - - } - - free( tmp_string ); - } - - while (tmp_departed->next != NULL) { - // printf("OMG - 2 main is not null \n"); - //char tmp_string [strlen(tmp_departed->string)]; - //char *tmp_string = malloc (sizeof (strlen (tmp_departed->string))); - char *tmp_string = malloc( strlen(tmp_departed->string) + 1 ); - strcpy (tmp_string, tmp_departed->string); - //char *tmp_string = tmp_departed->string; - int OAI_ID = get_oaiID_by_SUMO (tmp_string, id_manager); - - if (OAI_ID == -1) { - if (!activate_and_map (tmp_string)) { - //printf("Reached the Maximum of OAI nodes to be mapped to SUMO\n"); - //LOG_I(OMG, "Reached the Maximum of OAI nodes to be mapped to SUMO\n"); - free( tmp_string ); - return; // stopping mapping as the maximum of OAI nodes has been reached; - } - } - - free( tmp_string ); - tmp_departed = tmp_departed->next; - } - - departed = clear_string_list (departed); - - if (tmp_arrived->string != NULL) { - char *tmp_string = tmp_arrived->string; - //printf("OMG - 3 head is not null and value is: %s\n",tmp_arrived->string); - - if (!desactivate_and_unmap (tmp_string)) { - printf ("Could not locate the OAI node ID %s \n", tmp_string); - //LOG_I(OMG, "Could not locate the OAI node ID %s \n", tmp_string); - } - - } - - while (tmp_arrived->next != NULL) { - char *tmp_string = tmp_arrived->string; - - if (!desactivate_and_unmap (tmp_string)) { - printf ("Could not locate the OAI node\n"); - // LOG_I(OMG, "Could not locate the OAI node\n"); - } - - tmp_arrived = tmp_arrived->next; - } - - arrived = clear_string_list (arrived); - -} - -bool -desactivate_and_unmap (char *sumo_id) -{ -#ifdef STANDALONE - printf ("desactivating node %s \n", sumo_id); -#else - LOG_I (OMG, "desactivating node %s \n", sumo_id); -#endif - int OAI_ID = get_oaiID_by_SUMO (sumo_id, id_manager); - remove_oaiID_by_SUMO (sumo_id, id_manager); - - if (OAI_ID != -1) { - //TODO generalize to UE and eNB (must change the method) - - // FIXME! wrong use of node_vector - // FIXME node_vector is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types - node_struct *node = find_node (node_vector[SUMO], OAI_ID, UE); - - if (node == NULL) - node = find_node (node_vector[SUMO], OAI_ID, eNB); - - if (node != NULL) { - node->mobile = 0; // this node is now inactive; - active_nodes = remove_node_entry (node, active_nodes); - return true; - } - - } - -#ifdef STANDALONE - printf - ("Could not desactive an OAI node, as the SUMO-OAI mapping could not be found for the SUMO node ID %s \n", - sumo_id); -#else - LOG_I (OMG, - "Could not desactive an OAI node, as the SUMO-OAI mapping could not be found for the SUMO node ID %s \n", - sumo_id); -#endif - - return false; -} - - -bool -activate_and_map (char *sumo_id) -{ - MapPtr map = create_map (); -#ifdef STANDALONE - printf ("activating node %s \n", sumo_id); -#else - LOG_I (OMG, "activating node %s \n", sumo_id); -#endif - // TODO: So far, only UE can be SUMO mobile, but could change - AssertFatal( false, "node_vector array has only MAX_NUM_NODE_TYPES (=3) elements, but indexing here with SUMO (=4)"); - node_struct *active_node = get_first_inactive_OAI_node (node_vector[SUMO], UE); - - if (active_node != NULL) { - // found an inactive OAI node; will be mapped to SUMO - active_node->mobile = 1; // now node is active in SUMO - - active_nodes = add_entry (active_node, active_nodes); - - map->oai_id = active_node->id; - // map->sumo_id = malloc (sizeof ((int) strlen (sumo_id))); - map->sumo_id = malloc( strlen(sumo_id) + 1 ); - strcpy (map->sumo_id, sumo_id); - -#ifdef STANDALONE - printf ("added a mapping between oai ID: %d and SUMO ID: %s \n", - map->oai_id, map->sumo_id); -#else - LOG_I (OMG, "added a mapping between oai ID: %d and SUMO ID: %s \n", - map->oai_id, map->sumo_id); -#endif - - // TODO fusion the two lists...leads to data inconsistency - // FIXME adding the same memory region to two lists => crash at free() time - id_manager->map_sumo2oai = - add_map_entry (map, id_manager->map_sumo2oai); - - id_manager->map_oai2sumo = add_map_entry (map, id_manager->map_oai2sumo); //map_sumo2oai - - return true; - - } - - else { -#ifdef STANDALONE - printf - ("All OAI Nodes are already active in SUMO; cannot control this SUMO node in OAI\n"); -#else - LOG_I (OMG, - "All OAI Nodes are already active in SUMO; cannot control this SUMO node in OAI\n"); -#endif - return false; - } -} - - -void -update_sumo_nodes (double cur_time) -{ - if ((cur_time - last_update_time) < MIN_SUMO_STEP) { - // the min time interval for SUMO must be 100ms or more - printf ("--------Update Step too small--------\n"); - return; - } - - last_update_time = cur_time; // keeps track of the last update time to get the update interval - - // commandSimulationStep(1.0);// Advance the SUMO simulation by cur_time units - - - commandSimulationStep (cur_time); // Advance the SUMO simulation by cur_time units - - LOG_I (OMG, "--------Updated SUMO positions by %f [ms]--------\n", - cur_time); - update_IDs (); // both are in the traCI client - - -} - -void -update_sumo_positions (node_struct * node) -{ - - - -#ifdef STANDALONE - printf ("--------GET SUMO Mobility for a single node--------\n"); -#else - LOG_D (OMG, "--------GET SUMO Mobility for a single node--------\n"); -#endif - - Map_list tmp = id_manager->map_oai2sumo; - char *sumo_id = get_sumo_entry (node->id, tmp); - - if (sumo_id != NULL) { - //printf(" OAI ID is: %d and SUMO ID is %s \n",node->ID, sumo_id); - GetPosition (node, sumo_id); - GetSpeed (node, sumo_id); - } -} - -node_list * -get_sumo_positions_updated (double cur_time) -{ - - -#ifdef STANDALONE - printf - ("--------GET SUMO Mobility for a group of ACTIVE OAI nodes--------\n"); -#else - LOG_I (OMG, - "--------GET SUMO Mobility for a group of ACTIVE OAI nodes--------\n"); -#endif - - // FIXME! wrong use of node_vector - // FIXME node_vector is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types - if (node_vector[SUMO] != NULL) { - node_list *tmp = node_vector[SUMO]; - - while (tmp != NULL) { - if ((tmp->node->generator == SUMO) && (tmp->node->mobile == 1)) { - // OAI node MUST be active - LOG_I (OMG, "found an active node with id %d \n", - tmp->node->id); - LOG_I (OMG, "Old Positions \n"); - //printf("Old Positions \n"); - display_node_position (tmp->node->id, tmp->node->generator, - tmp->node->type, tmp->node->mobile, - tmp->node->x_pos, tmp->node->y_pos); - - update_sumo_positions (tmp->node); - - //printf("New Positions \n"); - LOG_I (OMG, "New Positions \n"); - display_node_position (tmp->node->id, tmp->node->generator, - tmp->node->type, tmp->node->mobile, - tmp->node->x_pos, tmp->node->y_pos); - } - - tmp = tmp->next; - } - } - - return active_nodes; -} - -node_struct * -get_first_inactive_OAI_node (node_list * list, int node_type) -{ - node_list *current; - - if (list != NULL) { - //start search - current = list; - - while (current->next != NULL) { - if ((current->node->mobile == 0) - && (current->node->type == node_type)) { - return current->node; - } - - current = current->next; - } - } - - return NULL; // all nodes are active already..reached the maximum number of OAI nodes -} - -bool -stop_sumo_generator (void) -{ -#ifdef STANDALONE - printf - (" --------Destructor for SUMO: closing the TraCI socket and killing SUMO ---- \n"); -#else - LOG_I (OMG, - " --------Destructor for SUMO: closing the TraCI socket and killing SUMO ---- \n"); -#endif - commandClose (); // closing the connection with SUMO via TraCI - close_connection (); // closing the socket connection - kill (pid, SIGKILL); // killing SUMO in case it could not close by itself - return true; -} diff --git a/openair2/UTIL/OMG/sumo.h b/openair2/UTIL/OMG/sumo.h deleted file mode 100644 index 71b36bf310..0000000000 --- a/openair2/UTIL/OMG/sumo.h +++ /dev/null @@ -1,131 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file sumo.h -* \brief The OMG interface to SUMO (Simulation of Urban Mobility) -* \author S. Uppoor, J. Harri -* \date 2012 -* \version 0.1 -* \company INRIA, Eurecom -* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr -* \note -* \warning -*/ - -#ifndef SUMO_H_ -#define SUMO_H_ - -#include "omg.h" -#include "id_manager.h" -#include - -#define MIN_SUMO_STEP 100 // 100ms is the smallest allowed SUMO update step - -/*! A global variable used to store the SUMO process ID to later kill it smoothly when OAI askes OMG to stop SUMO*/ -pid_t pid; - -/*! A sumo global variable representing the OMG-SUMO ID manager. It is created at the start_sumo_generator(void) and keep a mapping between SUMO and OAI IDs. */ -IDManagerPtr id_manager; - -/*! A Node_list intended to contain the list of OAI 'active' nodes in SUMO. replaces the return of the full Node_Vector when OAI requests the new positions of its nodes. The list is reset at each use, but the pointer to the respective nodes is just set to NULL*/ -node_list* active_nodes; - -/*! A global variable keeping track of the last update time of SUMO, to be used to get the update interval when update_sumo_nodes(cur_time) is called */ -double last_update_time; - -/** - * \fn void start_sumo_generator(omg_global_param omg_param_list) - * \brief Start SUMO by setting the initial positions of each node then letting it sleep till it departs to its destination and add this job to the Job_Vector - * \param omg_param_list a structure that contains the main parameters needed to establish the random positions distribution - */ -int start_sumo_generator(omg_global_param omg_param_list) ; - -/** - * \fn void update_sumo(double cur_time) - * \brief Update SUMO simulation time by x timesteps. After advancing the SUMO for the next timestep, SUMO will automatically update all nodes positions. - * Note that the SUMO positions are kept by SUMO. One need to specifically query SUMO to get them. - * \param cur_time a variable of type double that represents the current time - */ -void update_sumo_nodes(double cur_time) ; - -/** - * \fn void get_sumo_positions(NodePtr node) - * \brief Get the current position and speed of a node from SUMO. Invokes TraCI - * \param node the pointer to a node we want to synch with SUMO. - */ -void update_sumo_positions(node_struct* node); - -/** - * \fn Node_list get_sumo_positions_updated(double cur_time); - * \brief Get the current position and speed of a list of nodes. First, OMG retrieves the list of ACTIVE nodes, and second it updates their position from SUMO. Invokes TraCI - * \param cur_time a variable of type double that represents the current time - * \return the list of ACTIVE OAI nodes, which positions have been updated by SUMO - */ -node_list* get_sumo_positions_updated(double cur_time); - -/** - * \fn NodePtr get_first_inactive_OAI_node(Node_list list, int node_type) - * \brief Get the first inactive OAI node to map it to a new SUMO node. An inactive OAI node has its mobility flag set to '0'. - * \param node the pointer to the Node_Vector containing all OAI nodes - * \param node_type the type of node we would like to locate (here: SUMO) - * \return the reference to the first inactive OAI node; returns NULL is none could be found (all OAI nodes are currently active) - */ -node_struct* get_first_inactive_OAI_node(node_list* list, int node_type); - -/** - * \fn void update_IDs(String_list *departed, String_list *arrived) - * \brief Updates the mapping between SUMO and OAI nodes; Once a node departs in SUMO, it is mapped to a inactive OAI node. If none are found, the SUMO node will not have any mapping. Once a node arrives, the mapping is removed and the OAI node becomes inactive again. When an OAI node is inactive, it mobility parameters are invalid and MUST NOT be used/requested by OAI. - */ -void update_IDs(void); - -/** - * \fn bool desactive_and_unmap(char *sumo_id) - * \brief desactivates an OAI node as it is no longer in SUMO; will be recycled by a new SUMO node in the future; - * \param sumo_id the string representing the SUMO ID of the OAI node; - * \return true in case of success; false otherwise; - */ -bool desactivate_and_unmap(char *sumo_id); - -/** - * \fn bool activate_and_map(void) - * \brief activated an OAI node as a SUMO node entered in SUMO; Conceptually, this represents adding a communication device (OAI) to a SUMO node; - * It will find the first inactive OAI node, activates it and add the sumo mapping; - * \param sumo_id the string representing the SUMO ID of the OAI node; - * \return true in case of success; false if the maximum of OAI node has been reached - */ -bool activate_and_map(char *sumo_id); - -/** - * \fn int stop_sumo_generator(void) - * \brief stops SUMO, stop the socket and kills SUMO process in the child domain. - * \return true in case of success; false otherwise - */ -bool stop_sumo_generator(void); - -#endif /* SUMO_H_ */ diff --git a/openair2/UTIL/OMG/trace.c b/openair2/UTIL/OMG/trace.c index 144b9ae597..e86d8102e5 100644 --- a/openair2/UTIL/OMG/trace.c +++ b/openair2/UTIL/OMG/trace.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ /*! \file trace.c * \brief The trace-based mobility model for OMG/OAI (mobility is statically imported from a file) * \author S. Gashaw, N. Nikaein, J. Harri diff --git a/openair2/UTIL/OMG/trace.h b/openair2/UTIL/OMG/trace.h index b3825e2fa8..f1a4a4a274 100644 --- a/openair2/UTIL/OMG/trace.h +++ b/openair2/UTIL/OMG/trace.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file trace.h * \brief The trace-based mobility model for OMG/OAI (mobility is statically imported from a file) diff --git a/openair2/UTIL/OMG/trace_hashtable.c b/openair2/UTIL/OMG/trace_hashtable.c index 51f745de89..9a7a67feef 100644 --- a/openair2/UTIL/OMG/trace_hashtable.c +++ b/openair2/UTIL/OMG/trace_hashtable.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file hashtable.c * \brief A 'C' implementation of a hashtable diff --git a/openair2/UTIL/OMG/trace_hashtable.h b/openair2/UTIL/OMG/trace_hashtable.h index cd7feb73fc..b842880e29 100644 --- a/openair2/UTIL/OMG/trace_hashtable.h +++ b/openair2/UTIL/OMG/trace_hashtable.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file trace_hashtable.h * \brief A 'C' implementation of a hashtable diff --git a/openair2/UTIL/OMV/COPYING b/openair2/UTIL/OMV/COPYING deleted file mode 100644 index 623b6258a1..0000000000 --- a/openair2/UTIL/OMV/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - 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) - - 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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) year 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. diff --git a/openair2/UTIL/OMV/communicationthread.cpp b/openair2/UTIL/OMV/communicationthread.cpp old mode 100755 new mode 100644 index e528ea356d..17bc932a55 --- a/openair2/UTIL/OMV/communicationthread.cpp +++ b/openair2/UTIL/OMV/communicationthread.cpp @@ -1,32 +1,23 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file communicationthread.cpp * \brief this thread is to process the communication between the simulator and the visualisor diff --git a/openair2/UTIL/OMV/communicationthread.h b/openair2/UTIL/OMV/communicationthread.h old mode 100755 new mode 100644 index e83d20665c..b27f402435 --- a/openair2/UTIL/OMV/communicationthread.h +++ b/openair2/UTIL/OMV/communicationthread.h @@ -1,32 +1,23 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file communicationthread.h * \brief this thread is to process the communication between the simulator and the visualisor diff --git a/openair2/UTIL/OMV/mywindow.cpp b/openair2/UTIL/OMV/mywindow.cpp old mode 100755 new mode 100644 index b6461fba93..5a1c082975 --- a/openair2/UTIL/OMV/mywindow.cpp +++ b/openair2/UTIL/OMV/mywindow.cpp @@ -1,32 +1,23 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file mywindow.cpp * \brief manages the window and its components diff --git a/openair2/UTIL/OMV/mywindow.h b/openair2/UTIL/OMV/mywindow.h old mode 100755 new mode 100644 index b361fb94c6..21cd001004 --- a/openair2/UTIL/OMV/mywindow.h +++ b/openair2/UTIL/OMV/mywindow.h @@ -1,32 +1,23 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file mywindow.h * \brief manages the window and its components diff --git a/openair2/UTIL/OMV/omv.cpp b/openair2/UTIL/OMV/omv.cpp old mode 100755 new mode 100644 index 9b5c858b8c..6d65d2a154 --- a/openair2/UTIL/OMV/omv.cpp +++ b/openair2/UTIL/OMV/omv.cpp @@ -1,32 +1,23 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file omv.cpp * \brief openair mobility visualisor diff --git a/openair2/UTIL/OMV/openglwidget.cpp b/openair2/UTIL/OMV/openglwidget.cpp old mode 100755 new mode 100644 index c5fddcc7b1..ad0ce2b835 --- a/openair2/UTIL/OMV/openglwidget.cpp +++ b/openair2/UTIL/OMV/openglwidget.cpp @@ -1,32 +1,23 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file openglwidget.cpp * \brief area devoted to draw the nodes and their connections diff --git a/openair2/UTIL/OMV/openglwidget.h b/openair2/UTIL/OMV/openglwidget.h old mode 100755 new mode 100644 index c7eac486ae..a0e14b4db3 --- a/openair2/UTIL/OMV/openglwidget.h +++ b/openair2/UTIL/OMV/openglwidget.h @@ -1,32 +1,23 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file openglwidget.cpp * \brief area devoted to draw the nodes and their connections diff --git a/openair2/UTIL/OMV/structures.h b/openair2/UTIL/OMV/structures.h old mode 100755 new mode 100644 index 6c131371cb..ee33632059 --- a/openair2/UTIL/OMV/structures.h +++ b/openair2/UTIL/OMV/structures.h @@ -1,32 +1,23 @@ -/******************************************************************************* - - Eurecom OpenAirInterface 2 - Copyright(c) 1999 - 2010 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file structures.h * \brief structures used for the @@ -40,13 +31,12 @@ #ifndef STRUCTURES_H #define STRUCTURES_H +#include "openairinterface5g_limits.h" #ifndef __PHY_IMPLEMENTATION_DEFS_H__ -#define Maxneighbor 64 -#define NUMBER_OF_UE_MAX 64 -#define NUMBER_OF_eNB_MAX 3 -#ifndef NB_ANTENNAS_RX -# define NB_ANTENNAS_RX 4 -#endif + #define Maxneighbor NUMBER_OF_UE_MAX + #ifndef NB_ANTENNAS_RX + #define NB_ANTENNAS_RX 4 + #endif #endif // diff --git a/openair2/UTIL/OPT/COPYING b/openair2/UTIL/OPT/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/OPT/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/OPT/mac_pcap.h b/openair2/UTIL/OPT/mac_pcap.h index f44c12ec40..f1d4b32492 100644 --- a/openair2/UTIL/OPT/mac_pcap.h +++ b/openair2/UTIL/OPT/mac_pcap.h @@ -1,33 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - #include #include #include diff --git a/openair2/UTIL/OPT/opt.h b/openair2/UTIL/OPT/opt.h index bb3a099e12..b131d80539 100644 --- a/openair2/UTIL/OPT/opt.h +++ b/openair2/UTIL/OPT/opt.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*____________________________OPT/opt.h___________________________ Authors: Navid NIKAIEN @@ -63,12 +55,16 @@ This header file must be included */ #include "PHY/impl_defs_lte.h" #endif +#ifdef OCP_FRAMEWORK +#include +#else typedef enum trace_mode_e { OPT_WIRESHARK, OPT_PCAP, OPT_TSHARK, OPT_NONE } trace_mode_t; +#endif typedef enum radio_type_e { RADIO_TYPE_FDD = 1, @@ -85,7 +81,7 @@ extern char in_path[100]; */ void trace_pdu(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, - int ueid, int rntiType, int rnti, uint8_t subframe, + int ueid, int rntiType, int rnti, uint16_t sysFrame, uint8_t subframe, int oob_event, int oob_event_value); int init_opt(char *path, char *ip, char *port, radio_type_t radio_type_p); diff --git a/openair2/UTIL/OPT/packet-mac-lte.c b/openair2/UTIL/OPT/packet-mac-lte.c deleted file mode 100644 index 6fd7ddd826..0000000000 --- a/openair2/UTIL/OPT/packet-mac-lte.c +++ /dev/null @@ -1,6195 +0,0 @@ -/* Routines for LTE MAC disassembly - * - * Martin Mathieson - * - * $Id: packet-mac-lte.c 42240 2012-04-25 20:02:12Z pascal $ - * - * Wireshark - Network traffic analyzer - * By Gerald Combs - * Copyright 1998 Gerald Combs - * - * 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. - * - - * 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. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include - -#include -#include -#include -#include -#include - -#include "packet-mac-lte.h" -#include "packet-rlc-lte.h" - - -/* Described in: - * 3GPP TS 36.321 Evolved Universal Terrestrial Radio Access (E-UTRA) - * Medium Access Control (MAC) protocol specification (Release 10) - */ - - -/* Initialize the protocol and registered fields. */ -int proto_mac_lte = -1; - -static int mac_lte_tap = -1; - -/* Decoding context */ -static int hf_mac_lte_context = -1; -static int hf_mac_lte_context_radio_type = -1; -static int hf_mac_lte_context_direction = -1; -static int hf_mac_lte_context_rnti = -1; -static int hf_mac_lte_context_rnti_type = -1; -static int hf_mac_lte_context_ueid = -1; -static int hf_mac_lte_context_sysframe_number = -1; -static int hf_mac_lte_context_subframe_number = -1; -static int hf_mac_lte_context_grant_subframe_number = -1; -static int hf_mac_lte_context_predefined_frame = -1; -static int hf_mac_lte_context_length = -1; -static int hf_mac_lte_context_ul_grant_size = -1; -static int hf_mac_lte_context_bch_transport_channel = -1; -static int hf_mac_lte_context_retx_count = -1; -static int hf_mac_lte_context_retx_reason = -1; -static int hf_mac_lte_context_crc_status = -1; -static int hf_mac_lte_context_rapid = -1; -static int hf_mac_lte_context_rach_attempt_number = -1; - -/* Inferred context */ -static int hf_mac_lte_ues_ul_per_tti = -1; -static int hf_mac_lte_ues_dl_per_tti = -1; - - -/* Extra PHY context */ -static int hf_mac_lte_context_phy_ul = -1; -static int hf_mac_lte_context_phy_ul_modulation_type = -1; -static int hf_mac_lte_context_phy_ul_tbs_index = -1; -static int hf_mac_lte_context_phy_ul_resource_block_length = -1; -static int hf_mac_lte_context_phy_ul_resource_block_start = -1; -static int hf_mac_lte_context_phy_ul_harq_id = -1; -static int hf_mac_lte_context_phy_ul_ndi = -1; - -static int hf_mac_lte_context_phy_dl = -1; -static int hf_mac_lte_context_phy_dl_dci_format = -1; -static int hf_mac_lte_context_phy_dl_resource_allocation_type = -1; -static int hf_mac_lte_context_phy_dl_aggregation_level = -1; -static int hf_mac_lte_context_phy_dl_mcs_index = -1; -static int hf_mac_lte_context_phy_dl_redundancy_version_index = -1; -static int hf_mac_lte_context_phy_dl_retx = -1; -static int hf_mac_lte_context_phy_dl_resource_block_length = -1; -static int hf_mac_lte_context_phy_dl_crc_status = -1; -static int hf_mac_lte_context_phy_dl_harq_id = -1; -static int hf_mac_lte_context_phy_dl_ndi = -1; -static int hf_mac_lte_context_phy_dl_tb = -1; - - -/* Out-of-band events */ -static int hf_mac_lte_oob_send_preamble = -1; -static int hf_mac_lte_oob_send_sr = -1; -static int hf_mac_lte_number_of_srs = -1; -static int hf_mac_lte_oob_sr_failure = -1; - -/* MAC SCH/MCH header fields */ -static int hf_mac_lte_ulsch = -1; -static int hf_mac_lte_ulsch_header = -1; -static int hf_mac_lte_dlsch = -1; -static int hf_mac_lte_dlsch_header = -1; -static int hf_mac_lte_sch_subheader = -1; -static int hf_mac_lte_mch = -1; -static int hf_mac_lte_mch_header = -1; -static int hf_mac_lte_mch_subheader = -1; - -static int hf_mac_lte_sch_reserved = -1; -static int hf_mac_lte_dlsch_lcid = -1; -static int hf_mac_lte_ulsch_lcid = -1; -static int hf_mac_lte_sch_extended = -1; -static int hf_mac_lte_sch_format = -1; -static int hf_mac_lte_sch_length = -1; -static int hf_mac_lte_mch_reserved = -1; -static int hf_mac_lte_mch_lcid = -1; -static int hf_mac_lte_mch_extended = -1; -static int hf_mac_lte_mch_format = -1; -static int hf_mac_lte_mch_length = -1; - -static int hf_mac_lte_sch_header_only = -1; -static int hf_mac_lte_mch_header_only = -1; - -/* Data */ -static int hf_mac_lte_sch_sdu = -1; -static int hf_mac_lte_mch_sdu = -1; -static int hf_mac_lte_bch_pdu = -1; -static int hf_mac_lte_pch_pdu = -1; -static int hf_mac_lte_predefined_pdu = -1; -static int hf_mac_lte_raw_pdu = -1; -static int hf_mac_lte_padding_data = -1; -static int hf_mac_lte_padding_length = -1; - - -/* RAR fields */ -static int hf_mac_lte_rar = -1; -static int hf_mac_lte_rar_headers = -1; -static int hf_mac_lte_rar_header = -1; -static int hf_mac_lte_rar_extension = -1; -static int hf_mac_lte_rar_t = -1; -static int hf_mac_lte_rar_bi = -1; -static int hf_mac_lte_rar_rapid = -1; -static int hf_mac_lte_rar_reserved = -1; -static int hf_mac_lte_rar_body = -1; -static int hf_mac_lte_rar_reserved2 = -1; -static int hf_mac_lte_rar_ta = -1; -static int hf_mac_lte_rar_ul_grant = -1; -static int hf_mac_lte_rar_ul_grant_hopping = -1; -static int hf_mac_lte_rar_ul_grant_fsrba = -1; -static int hf_mac_lte_rar_ul_grant_tmcs = -1; -static int hf_mac_lte_rar_ul_grant_tcsp = -1; -static int hf_mac_lte_rar_ul_grant_ul_delay = -1; -static int hf_mac_lte_rar_ul_grant_cqi_request = -1; -static int hf_mac_lte_rar_temporary_crnti = -1; - -/* Common channel control values */ -static int hf_mac_lte_control_bsr = -1; -static int hf_mac_lte_control_bsr_lcg_id = -1; -static int hf_mac_lte_control_short_bsr_buffer_size = -1; -static int hf_mac_lte_control_long_bsr_buffer_size_0 = -1; -static int hf_mac_lte_control_long_bsr_buffer_size_1 = -1; -static int hf_mac_lte_control_long_bsr_buffer_size_2 = -1; -static int hf_mac_lte_control_long_bsr_buffer_size_3 = -1; -static int hf_mac_lte_control_short_ext_bsr_buffer_size = -1; -static int hf_mac_lte_control_long_ext_bsr_buffer_size_0 = -1; -static int hf_mac_lte_control_long_ext_bsr_buffer_size_1 = -1; -static int hf_mac_lte_control_long_ext_bsr_buffer_size_2 = -1; -static int hf_mac_lte_control_long_ext_bsr_buffer_size_3 = -1; -static int hf_mac_lte_control_crnti = -1; -static int hf_mac_lte_control_timing_advance = -1; -static int hf_mac_lte_control_timing_advance_reserved = -1; -static int hf_mac_lte_control_ue_contention_resolution = -1; -static int hf_mac_lte_control_ue_contention_resolution_identity = -1; -static int hf_mac_lte_control_ue_contention_resolution_msg3 = -1; -static int hf_mac_lte_control_ue_contention_resolution_msg3_matched = -1; -static int hf_mac_lte_control_ue_contention_resolution_time_since_msg3 = -1; -static int hf_mac_lte_control_power_headroom = -1; -static int hf_mac_lte_control_power_headroom_reserved = -1; -static int hf_mac_lte_control_power_headroom_level = -1; -static int hf_mac_lte_control_ext_power_headroom = -1; -static int hf_mac_lte_control_ext_power_headroom_c7 = -1; -static int hf_mac_lte_control_ext_power_headroom_c6 = -1; -static int hf_mac_lte_control_ext_power_headroom_c5 = -1; -static int hf_mac_lte_control_ext_power_headroom_c4 = -1; -static int hf_mac_lte_control_ext_power_headroom_c3 = -1; -static int hf_mac_lte_control_ext_power_headroom_c2 = -1; -static int hf_mac_lte_control_ext_power_headroom_c1 = -1; -static int hf_mac_lte_control_ext_power_headroom_reserved = -1; -static int hf_mac_lte_control_ext_power_headroom_power_backoff = -1; -static int hf_mac_lte_control_ext_power_headroom_value = -1; -static int hf_mac_lte_control_ext_power_headroom_level = -1; -static int hf_mac_lte_control_ext_power_headroom_reserved2 = -1; -static int hf_mac_lte_control_ext_power_headroom_pcmaxc = -1; -static int hf_mac_lte_control_activation_deactivation = -1; -static int hf_mac_lte_control_activation_deactivation_c7 = -1; -static int hf_mac_lte_control_activation_deactivation_c6 = -1; -static int hf_mac_lte_control_activation_deactivation_c5 = -1; -static int hf_mac_lte_control_activation_deactivation_c4 = -1; -static int hf_mac_lte_control_activation_deactivation_c3 = -1; -static int hf_mac_lte_control_activation_deactivation_c2 = -1; -static int hf_mac_lte_control_activation_deactivation_c1 = -1; -static int hf_mac_lte_control_activation_deactivation_reserved = -1; -static int hf_mac_lte_control_mch_scheduling_info = -1; -static int hf_mac_lte_control_mch_scheduling_info_lcid = -1; -static int hf_mac_lte_control_mch_scheduling_info_stop_mtch = -1; - -static int hf_mac_lte_dl_harq_resend_original_frame = -1; -static int hf_mac_lte_dl_harq_resend_time_since_previous_frame = -1; -static int hf_mac_lte_dl_harq_resend_next_frame = -1; -static int hf_mac_lte_dl_harq_resend_time_until_next_frame = -1; - -static int hf_mac_lte_ul_harq_resend_original_frame = -1; -static int hf_mac_lte_ul_harq_resend_time_since_previous_frame = -1; -static int hf_mac_lte_ul_harq_resend_next_frame = -1; -static int hf_mac_lte_ul_harq_resend_time_until_next_frame = -1; - - -static int hf_mac_lte_grant_answering_sr = -1; -static int hf_mac_lte_failure_answering_sr = -1; -static int hf_mac_lte_sr_leading_to_failure = -1; -static int hf_mac_lte_sr_leading_to_grant = -1; -static int hf_mac_lte_sr_invalid_event = -1; -static int hf_mac_lte_sr_time_since_request = -1; -static int hf_mac_lte_sr_time_until_answer = -1; - - -/* Subtrees. */ -static int ett_mac_lte = -1; -static int ett_mac_lte_context = -1; -static int ett_mac_lte_phy_context = -1; -static int ett_mac_lte_ulsch_header = -1; -static int ett_mac_lte_dlsch_header = -1; -static int ett_mac_lte_mch_header = -1; -static int ett_mac_lte_sch_subheader = -1; -static int ett_mac_lte_mch_subheader = -1; -static int ett_mac_lte_rar_headers = -1; -static int ett_mac_lte_rar_header = -1; -static int ett_mac_lte_rar_body = -1; -static int ett_mac_lte_rar_ul_grant = -1; -static int ett_mac_lte_bsr = -1; -static int ett_mac_lte_bch = -1; -static int ett_mac_lte_pch = -1; -static int ett_mac_lte_activation_deactivation = -1; -static int ett_mac_lte_contention_resolution = -1; -static int ett_mac_lte_power_headroom = -1; -static int ett_mac_lte_extended_power_headroom = -1; -static int ett_mac_lte_extended_power_headroom_cell = -1; -static int ett_mac_lte_mch_scheduling_info = -1; -static int ett_mac_lte_oob = -1; - - - -/* Constants and value strings */ - -static const value_string radio_type_vals[] = { - { FDD_RADIO, "FDD"}, - { TDD_RADIO, "TDD"}, - { 0, NULL } -}; - - -static const value_string direction_vals[] = { - { DIRECTION_UPLINK, "Uplink"}, - { DIRECTION_DOWNLINK, "Downlink"}, - { 0, NULL } -}; - - -static const value_string rnti_type_vals[] = { - { NO_RNTI, "NO-RNTI"}, - { P_RNTI, "P-RNTI"}, - { RA_RNTI, "RA-RNTI"}, - { C_RNTI, "C-RNTI"}, - { SI_RNTI, "SI-RNTI"}, - { SPS_RNTI, "SPS-RNTI"}, - { M_RNTI, "M-RNTI"}, - { 0, NULL } -}; - -static const value_string bch_transport_channel_vals[] = { - { SI_RNTI, "DL-SCH"}, - { NO_RNTI, "BCH"}, - { 0, NULL } -}; - -static const value_string crc_status_vals[] = { - { crc_success, "OK"}, - { crc_fail, "Failed"}, - { crc_high_code_rate, "High Code Rate"}, - { crc_pdsch_lost, "PDSCH Lost"}, - { crc_duplicate_nonzero_rv, "Duplicate_nonzero_rv"}, - { 0, NULL } -}; - - -static const value_string dci_format_vals[] = { - { 0, "0"}, - { 1, "1"}, - { 2, "1A"}, - { 3, "1B"}, - { 4, "1C"}, - { 5, "1D"}, - { 6, "2"}, - { 7, "2A"}, - { 8, "3/3A"}, - { 0, NULL } -}; - -static const value_string aggregation_level_vals[] = { - { 0, "1"}, - { 1, "2"}, - { 2, "4"}, - { 3, "8"}, - { 0, NULL } -}; - -static const value_string modulation_type_vals[] = { - { 2, "QPSK"}, - { 4, "QAM16"}, - { 6, "QAM64"}, - { 0, NULL } -}; - -static const true_false_string mac_lte_scell_ph_vals = { - "Reported", - "Not reported" -}; - -static const true_false_string mac_lte_power_backoff_vals = { - "Applied", - "Not applied" -}; - -static const true_false_string mac_lte_ph_value_vals = { - "Based on reference format", - "Based on real transmission" -}; - -static const true_false_string mac_lte_scell_status_vals = { - "Activated", - "Deactivated" -}; - -#define ACTIVATION_DEACTIVATION_LCID 0x1b -#define UE_CONTENTION_RESOLUTION_IDENTITY_LCID 0x1c -#define TIMING_ADVANCE_LCID 0x1d -#define DRX_COMMAND_LCID 0x1e -#define PADDING_LCID 0x1f - -static const value_string dlsch_lcid_vals[] = { - { 0, "CCCH"}, - { 1, "1"}, - { 2, "2"}, - { 3, "3"}, - { 4, "4"}, - { 5, "5"}, - { 6, "6"}, - { 7, "7"}, - { 8, "8"}, - { 9, "9"}, - { 10, "10"}, - { ACTIVATION_DEACTIVATION_LCID , "Activation/Deactivation"}, - { UE_CONTENTION_RESOLUTION_IDENTITY_LCID, "UE Contention Resolution Identity"}, - { TIMING_ADVANCE_LCID , "Timing Advance"}, - { DRX_COMMAND_LCID , "DRX Command"}, - { PADDING_LCID , "Padding" }, - { 0, NULL } -}; - -#define EXTENDED_POWER_HEADROOM_REPORT_LCID 0x19 -#define POWER_HEADROOM_REPORT_LCID 0x1a -#define CRNTI_LCID 0x1b -#define TRUNCATED_BSR_LCID 0x1c -#define SHORT_BSR_LCID 0x1d -#define LONG_BSR_LCID 0x1e - -static const value_string ulsch_lcid_vals[] = { - { 0, "CCCH"}, - { 1, "1"}, - { 2, "2"}, - { 3, "3"}, - { 4, "4"}, - { 5, "5"}, - { 6, "6"}, - { 7, "7"}, - { 8, "8"}, - { 9, "9"}, - { 10, "10"}, - { EXTENDED_POWER_HEADROOM_REPORT_LCID, "Extended Power Headroom Report"}, - { POWER_HEADROOM_REPORT_LCID, "Power Headroom Report"}, - { CRNTI_LCID, "C-RNTI"}, - { TRUNCATED_BSR_LCID, "Truncated BSR"}, - { SHORT_BSR_LCID, "Short BSR"}, - { LONG_BSR_LCID, "Long BSR"}, - { PADDING_LCID, "Padding" }, - { 0, NULL } -}; - -#define MCH_SCHEDULING_INFO_LCID 0x1e - -static const value_string mch_lcid_vals[] = { - { 0, "MCCH"}, - { 1, "1"}, - { 2, "2"}, - { 3, "3"}, - { 4, "4"}, - { 5, "5"}, - { 6, "6"}, - { 7, "7"}, - { 8, "8"}, - { 9, "9"}, - { 10, "10"}, - { 11, "11"}, - { 12, "12"}, - { 13, "13"}, - { 14, "14"}, - { 15, "15"}, - { 16, "16"}, - { 17, "17"}, - { 18, "18"}, - { 19, "19"}, - { 20, "20"}, - { 21, "21"}, - { 22, "22"}, - { 23, "23"}, - { 24, "24"}, - { 25, "25"}, - { 26, "26"}, - { 27, "27"}, - { 28, "28"}, - { MCH_SCHEDULING_INFO_LCID, "MCH Scheduling Information"}, - { PADDING_LCID, "Padding" }, - { 0, NULL } -}; - -static const value_string format_vals[] = { - { 0, "Data length is < 128 bytes"}, - { 1, "Data length is >= 128 bytes"}, - { 0, NULL } -}; - - -static const value_string rar_type_vals[] = { - { 0, "Backoff Indicator present"}, - { 1, "RAPID present"}, - { 0, NULL } -}; - - -static const value_string rar_bi_vals[] = { - { 0, "0"}, - { 1, "10"}, - { 2, "20"}, - { 3, "30"}, - { 4, "40"}, - { 5, "60"}, - { 6, "80"}, - { 7, "120"}, - { 8, "160"}, - { 9, "240"}, - { 10, "320"}, - { 11, "480"}, - { 12, "960"}, - { 0, NULL } -}; - - -static const value_string buffer_size_vals[] = { - { 0, "BS = 0"}, - { 1, "0 < BS <= 10"}, - { 2, "10 < BS <= 12"}, - { 3, "12 < BS <= 14"}, - { 4, "14 < BS <= 17"}, - { 5, "17 < BS <= 19"}, - { 6, "19 < BS <= 22"}, - { 7, "22 < BS <= 26"}, - { 8, "26 < BS <= 31"}, - { 9, "31 < BS <= 36"}, - { 10, "36 < BS <= 42"}, - { 11, "42 < BS <= 49"}, - { 12, "49 < BS <= 57"}, - { 13, "47 < BS <= 67"}, - { 14, "67 < BS <= 78"}, - { 15, "78 < BS <= 91"}, - { 16, "91 < BS <= 107"}, - { 17, "107 < BS <= 125"}, - { 18, "125 < BS <= 146"}, - { 19, "146 < BS <= 171"}, - { 20, "171 < BS <= 200"}, - { 21, "200 < BS <= 234"}, - { 22, "234 < BS <= 274"}, - { 23, "274 < BS <= 321"}, - { 24, "321 < BS <= 376"}, - { 25, "376 < BS <= 440"}, - { 26, "440 < BS <= 515"}, - { 27, "515 < BS <= 603"}, - { 28, "603 < BS <= 706"}, - { 29, "706 < BS <= 826"}, - { 30, "826 < BS <= 967"}, - { 31, "967 < BS <= 1132"}, - { 32, "1132 < BS <= 1326"}, - { 33, "1326 < BS <= 1552"}, - { 34, "1552 < BS <= 1817"}, - { 35, "1817 < BS <= 2127"}, - { 36, "2127 < BS <= 2490"}, - { 37, "2490 < BS <= 2915"}, - { 38, "2915 < BS <= 3413"}, - { 39, "3413 < BS <= 3995"}, - { 40, "3995 < BS <= 4677"}, - { 41, "4677 < BS <= 5476"}, - { 42, "5476 < BS <= 6411"}, - { 43, "6411 < BS <= 7505"}, - { 44, "7505 < BS <= 8787"}, - { 45, "8787 < BS <= 10276"}, - { 46, "10287 < BS <= 12043"}, - { 47, "12043 < BS <= 14099"}, - { 48, "14099 < BS <= 16507"}, - { 49, "16507 < BS <= 19325"}, - { 50, "19325 < BS <= 22624"}, - { 51, "22624 < BS <= 26487"}, - { 52, "26487 < BS <= 31009"}, - { 53, "31009 < BS <= 36304"}, - { 54, "36304 < BS <= 42502"}, - { 55, "42502 < BS <= 49759"}, - { 56, "49759 < BS <= 58255"}, - { 57, "58255 < BS <= 68201"}, - { 58, "68201 < BS <= 79846"}, - { 59, "79846 < BS <= 93479"}, - { 60, "93479 < BS <= 109439"}, - { 61, "109439 < BS <= 128125"}, - { 62, "128125 < BS <= 150000"}, - { 63, "BS > 150000"}, - { 0, NULL } -}; -static value_string_ext buffer_size_vals_ext = VALUE_STRING_EXT_INIT(buffer_size_vals); - -static const value_string ext_buffer_size_vals[] = { - { 0, "BS = 0"}, - { 1, "0 < BS <= 10"}, - { 2, "10 < BS <= 13"}, - { 3, "13 < BS <= 16"}, - { 4, "16 < BS <= 19"}, - { 5, "19 < BS <= 23"}, - { 6, "23 < BS <= 29"}, - { 7, "29 < BS <= 35"}, - { 8, "35 < BS <= 43"}, - { 9, "43 < BS <= 53"}, - { 10, "53 < BS <= 65"}, - { 11, "65 < BS <= 80"}, - { 12, "80 < BS <= 98"}, - { 13, "98 < BS <= 120"}, - { 14, "120 < BS <= 147"}, - { 15, "147 < BS <= 181"}, - { 16, "181 < BS <= 223"}, - { 17, "223 < BS <= 274"}, - { 18, "274 < BS <= 337"}, - { 19, "337 < BS <= 414"}, - { 20, "414 < BS <= 509"}, - { 21, "509 < BS <= 625"}, - { 22, "625 < BS <= 769"}, - { 23, "769 < BS <= 945"}, - { 24, "945 < BS <= 1162"}, - { 25, "1162 < BS <= 1429"}, - { 26, "1429 < BS <= 1757"}, - { 27, "1757 < BS <= 2161"}, - { 28, "2161 < BS <= 2657"}, - { 29, "2657 < BS <= 3267"}, - { 30, "3267 < BS <= 4017"}, - { 31, "4017 < BS <= 4940"}, - { 32, "4940 < BS <= 6074"}, - { 33, "6074 < BS <= 7469"}, - { 34, "7469 < BS <= 9185"}, - { 35, "9185 < BS <= 11294"}, - { 36, "11294 < BS <= 13888"}, - { 37, "13888 < BS <= 17077"}, - { 38, "17077 < BS <= 20999"}, - { 39, "20999 < BS <= 25822"}, - { 40, "25822 < BS <= 31752"}, - { 41, "31752 < BS <= 39045"}, - { 42, "39045 < BS <= 48012"}, - { 43, "48012 < BS <= 59039"}, - { 44, "59039 < BS <= 72598"}, - { 45, "72598 < BS <= 89272"}, - { 46, "89272 < BS <= 109774"}, - { 47, "109774 < BS <= 134986"}, - { 48, "134986 < BS <= 165989"}, - { 49, "165989 < BS <= 204111"}, - { 50, "204111 < BS <= 250990"}, - { 51, "250990 < BS <= 308634"}, - { 52, "308634 < BS <= 379519"}, - { 53, "379519 < BS <= 466683"}, - { 54, "466683 < BS <= 573866"}, - { 55, "573866 < BS <= 705666"}, - { 56, "705666 < BS <= 867737"}, - { 57, "867737 < BS <= 1067031"}, - { 58, "1067031 < BS <= 1312097"}, - { 59, "1312097 < BS <= 1613447"}, - { 60, "1613447 < BS <= 1984009"}, - { 61, "1984009 < BS <= 2439678"}, - { 62, "2439678 < BS <= 3000000"}, - { 63, "BS > 3000000"}, - { 0, NULL } -}; -static value_string_ext ext_buffer_size_vals_ext = VALUE_STRING_EXT_INIT(ext_buffer_size_vals); - -static const value_string power_headroom_vals[] = { - { 0, "-23 <= PH < -22"}, - { 1, "-22 <= PH < -21"}, - { 2, "-21 <= PH < -20"}, - { 3, "-20 <= PH < -19"}, - { 4, "-19 <= PH < -18"}, - { 5, "-18 <= PH < -17"}, - { 6, "-17 <= PH < -16"}, - { 7, "-16 <= PH < -15"}, - { 8, "-15 <= PH < -14"}, - { 9, "-14 <= PH < -13"}, - { 10, "-13 <= PH < -12"}, - { 11, "-12 <= PH < -11"}, - { 12, "-11 <= PH < -10"}, - { 13, "-10 <= PH < -9"}, - { 14, "-9 <= PH < -8"}, - { 15, "-8 <= PH < -7"}, - { 16, "-7 <= PH < -6"}, - { 17, "-6 <= PH < -5"}, - { 18, "-5 <= PH < -4"}, - { 19, "-4 <= PH < -3"}, - { 20, "-3 <= PH < -2"}, - { 21, "-2 <= PH < -1"}, - { 22, "-1 <= PH < 0"}, - { 23, "0 <= PH < 1"}, - { 24, "1 <= PH < 2"}, - { 25, "2 <= PH < 3"}, - { 26, "3 <= PH < 4"}, - { 27, "4 <= PH < 5"}, - { 28, "5 <= PH < 6"}, - { 29, "6 <= PH < 7"}, - { 30, "7 <= PH < 8"}, - { 31, "8 <= PH < 9"}, - { 32, "9 <= PH < 10"}, - { 33, "10 <= PH < 11"}, - { 34, "11 <= PH < 12"}, - { 35, "12 <= PH < 13"}, - { 36, "13 <= PH < 14"}, - { 37, "14 <= PH < 15"}, - { 38, "15 <= PH < 16"}, - { 39, "16 <= PH < 17"}, - { 40, "17 <= PH < 18"}, - { 41, "18 <= PH < 19"}, - { 42, "19 <= PH < 20"}, - { 43, "20 <= PH < 21"}, - { 44, "21 <= PH < 22"}, - { 45, "22 <= PH < 23"}, - { 46, "23 <= PH < 24"}, - { 47, "24 <= PH < 25"}, - { 48, "25 <= PH < 26"}, - { 49, "26 <= PH < 27"}, - { 50, "27 <= PH < 28"}, - { 51, "28 <= PH < 29"}, - { 52, "29 <= PH < 30"}, - { 53, "30 <= PH < 31"}, - { 54, "31 <= PH < 32"}, - { 55, "32 <= PH < 33"}, - { 56, "33 <= PH < 34"}, - { 57, "34 <= PH < 35"}, - { 58, "34 <= PH < 36"}, - { 59, "36 <= PH < 37"}, - { 60, "37 <= PH < 38"}, - { 61, "38 <= PH < 39"}, - { 62, "39 <= PH < 40"}, - { 63, "PH >= 40"}, - { 0, NULL } -}; -static value_string_ext power_headroom_vals_ext = VALUE_STRING_EXT_INIT(power_headroom_vals); - -static const value_string pcmaxc_vals[] = { - { 0, "Pcmax,c < -29"}, - { 1, "-29 <= Pcmax,c < -28"}, - { 2, "-28 <= Pcmax,c < -27"}, - { 3, "-27 <= Pcmax,c < -26"}, - { 4, "-26 <= Pcmax,c < -25"}, - { 5, "-25 <= Pcmax,c < -24"}, - { 6, "-24 <= Pcmax,c < -23"}, - { 7, "-23 <= Pcmax,c < -22"}, - { 8, "-22 <= Pcmax,c < -21"}, - { 9, "-21 <= Pcmax,c < -20"}, - { 10, "-20 <= Pcmax,c < -19"}, - { 11, "-19 <= Pcmax,c < -18"}, - { 12, "-18 <= Pcmax,c < -17"}, - { 13, "-17 <= Pcmax,c < -16"}, - { 14, "-16 <= Pcmax,c < -15"}, - { 15, "-15 <= Pcmax,c < -14"}, - { 16, "-14 <= Pcmax,c < -13"}, - { 17, "-13 <= Pcmax,c < -12"}, - { 18, "-12 <= Pcmax,c < -11"}, - { 19, "-11 <= Pcmax,c < -10"}, - { 20, "-10 <= Pcmax,c < -9"}, - { 21, "-9 <= Pcmax,c < -8"}, - { 22, "-8 <= Pcmax,c < -7"}, - { 23, "-7 <= Pcmax,c < -6"}, - { 24, "-6 <= Pcmax,c < -5"}, - { 25, "-5 <= Pcmax,c < -4"}, - { 26, "-4 <= Pcmax,c < -3"}, - { 27, "-3 <= Pcmax,c < -2"}, - { 28, "-2 <= Pcmax,c < -1"}, - { 29, "-1 <= Pcmax,c < 0"}, - { 30, "0 <= Pcmax,c < 1"}, - { 31, "1 <= Pcmax,c < 2"}, - { 32, "2 <= Pcmax,c < 3"}, - { 33, "3 <= Pcmax,c < 4"}, - { 34, "4 <= Pcmax,c < 5"}, - { 35, "5 <= Pcmax,c < 6"}, - { 36, "6 <= Pcmax,c < 7"}, - { 37, "7 <= Pcmax,c < 8"}, - { 38, "8 <= Pcmax,c < 9"}, - { 39, "9 <= Pcmax,c < 10"}, - { 40, "10 <= Pcmax,c < 11"}, - { 41, "11 <= Pcmax,c < 12"}, - { 42, "12 <= Pcmax,c < 13"}, - { 43, "13 <= Pcmax,c < 14"}, - { 44, "14 <= Pcmax,c < 15"}, - { 45, "15 <= Pcmax,c < 16"}, - { 46, "16 <= Pcmax,c < 17"}, - { 47, "17 <= Pcmax,c < 18"}, - { 48, "18 <= Pcmax,c < 19"}, - { 49, "19 <= Pcmax,c < 20"}, - { 50, "20 <= Pcmax,c < 21"}, - { 51, "21 <= Pcmax,c < 22"}, - { 52, "22 <= Pcmax,c < 23"}, - { 53, "23 <= Pcmax,c < 24"}, - { 54, "24 <= Pcmax,c < 25"}, - { 55, "25 <= Pcmax,c < 26"}, - { 56, "26 <= Pcmax,c < 27"}, - { 57, "27 <= Pcmax,c < 28"}, - { 58, "28 <= Pcmax,c < 29"}, - { 59, "29 <= Pcmax,c < 30"}, - { 60, "30 <= Pcmax,c < 31"}, - { 61, "31 <= Pcmax,c < 32"}, - { 62, "32 <= Pcmax,c < 33"}, - { 63, "33 <= Pcmax,c"}, - { 0, NULL } -}; -static value_string_ext pcmaxc_vals_ext = VALUE_STRING_EXT_INIT(pcmaxc_vals); - -static const value_string header_only_vals[] = { - { 0, "MAC PDU Headers and body present"}, - { 1, "MAC PDU Headers only"}, - { 0, NULL } -}; - -static const value_string predefined_frame_vals[] = { - { 0, "Real MAC PDU present - will dissect"}, - { 1, "Predefined frame present - will not dissect"}, - { 0, NULL } -}; - -static const value_string ul_retx_grant_vals[] = { - { 0, "PDCCH ReTx"}, - { 1, "PHICH NACK"}, - { 0, NULL } -}; - -/**************************************************************************/ -/* Preferences state */ -/**************************************************************************/ - -/* If this PDU has been NACK'd (by HARQ) more than a certain number of times, - we trigger an expert warning. */ -static gint global_mac_lte_retx_counter_trigger = 3; - -/* By default try to decode transparent data (BCH, PCH and CCCH) data using LTE RRC dissector */ -static gboolean global_mac_lte_attempt_rrc_decode = TRUE; - -/* Whether should attempt to dissect frames failing CRC check */ -static gboolean global_mac_lte_dissect_crc_failures = FALSE; - -/* Whether should attempt to decode lcid 1&2 SDUs as srb1/2 (i.e. AM RLC) */ -static gboolean global_mac_lte_attempt_srb_decode = TRUE; - -/* Where to take LCID -> DRB mappings from */ -enum lcid_drb_source { - FromStaticTable, FromConfigurationProtocol -}; -static gint global_mac_lte_lcid_drb_source = (gint)FromStaticTable; - -/* Threshold for warning in expert info about high BSR values */ -static gint global_mac_lte_bsr_warn_threshold = 50; /* default is 19325 -> 22624 */ - -/* Whether or not to track SRs and related frames */ -static gboolean global_mac_lte_track_sr = TRUE; - -/* Which layer info to show in the info column */ -enum layer_to_show { - ShowPHYLayer, ShowMACLayer, ShowRLCLayer -}; - -/* Which layer's details to show in Info column */ -static gint global_mac_lte_layer_to_show = (gint)ShowRLCLayer; - -/* When showing RLC info, count PDUs so can append info column properly */ -static guint8 s_number_of_rlc_pdus_shown = 0; - -/***********************************************************************/ -/* How to dissect lcid 3-10 (presume drb logical channels) */ - -static const value_string drb_lcid_vals[] = { - { 3, "LCID 3"}, - { 4, "LCID 4"}, - { 5, "LCID 5"}, - { 6, "LCID 6"}, - { 7, "LCID 7"}, - { 8, "LCID 8"}, - { 9, "LCID 9"}, - { 10, "LCID 10"}, - { 0, NULL } -}; - -typedef enum rlc_channel_type_t { - rlcRaw, - rlcTM, - rlcUM5, - rlcUM10, - rlcAM -} rlc_channel_type_t; - -static const value_string rlc_channel_type_vals[] = { - { rlcTM, "TM"}, - { rlcUM5 , "UM, SN Len=5"}, - { rlcUM10, "UM, SN Len=10"}, - { rlcAM , "AM"}, - { 0, NULL } -}; - - -/* Mapping type */ -typedef struct lcid_drb_mapping_t { - guint16 lcid; - gint drbid; - rlc_channel_type_t channel_type; -} lcid_drb_mapping_t; - -/* Mapping entity */ -static lcid_drb_mapping_t *lcid_drb_mappings = NULL; -static guint num_lcid_drb_mappings = 0; - -UAT_VS_DEF(lcid_drb_mappings, lcid, lcid_drb_mapping_t, 3, "LCID 3") -UAT_DEC_CB_DEF(lcid_drb_mappings, drbid, lcid_drb_mapping_t) -UAT_VS_DEF(lcid_drb_mappings, channel_type, lcid_drb_mapping_t, 2, "AM") - -/* UAT object */ -static uat_t* lcid_drb_mappings_uat; - -/* Dynamic mappings (set by configuration protocol) - LCID is the index into the array of these */ -typedef struct dynamic_lcid_drb_mapping_t { - gboolean valid; - gint drbid; - rlc_channel_type_t channel_type; - guint8 ul_priority; -} dynamic_lcid_drb_mapping_t; - -static dynamic_lcid_drb_mapping_t dynamic_lcid_drb_mapping[11]; - - -extern int proto_rlc_lte; - -/***************************************************************/ - - - -/***************************************************************/ -/* Keeping track of Msg3 bodies so they can be compared with */ -/* Contention Resolution bodies. */ - -typedef struct Msg3Data { - guint8 data[6]; - nstime_t msg3Time; - guint32 framenum; -} Msg3Data; - - -/* This table stores (RNTI -> Msg3Data*). Will be populated when - Msg3 frames are first read. */ -static GHashTable *mac_lte_msg3_hash = NULL; - -/* Hash table functions for mac_lte_msg3_hash. Hash is just the (RNTI) key */ -static gint mac_lte_rnti_hash_equal(gconstpointer v, gconstpointer v2) -{ - return (v == v2); -} - -static guint mac_lte_rnti_hash_func(gconstpointer v) -{ - return GPOINTER_TO_UINT(v); -} - - -typedef enum ContentionResolutionStatus { - NoMsg3, - Msg3Match, - Msg3NoMatch -} ContentionResolutionStatus; - -typedef struct ContentionResolutionResult { - ContentionResolutionStatus status; - guint msg3FrameNum; - guint msSinceMsg3; -} ContentionResolutionResult; - - -/* This table stores (CRFrameNum -> CRResult). It is assigned during the first - pass and used thereafter */ -static GHashTable *mac_lte_cr_result_hash = NULL; - -/* Hash table functions for mac_lte_cr_result_hash. Hash is just the (framenum) key */ -static gint mac_lte_framenum_hash_equal(gconstpointer v, gconstpointer v2) -{ - return (v == v2); -} - -static guint mac_lte_framenum_hash_func(gconstpointer v) -{ - return GPOINTER_TO_UINT(v); -} - -/**************************************************************************/ - - - -/****************************************************************/ -/* Keeping track of last DL frames per C-RNTI so can guess when */ -/* there has been a HARQ retransmission */ -/* TODO: this should be simplified now that harq-id & ndi are */ -/* being logged! */ - -/* Could be bigger, but more than enough to flag suspected resends */ -#define MAX_EXPECTED_PDU_LENGTH 2048 - -typedef struct LastFrameData { - gboolean inUse; - guint32 framenum; - gboolean ndi; - nstime_t received_time; - gint length; - guint8 data[MAX_EXPECTED_PDU_LENGTH]; -} LastFrameData; - -typedef struct DLHarqBuffers { - LastFrameData harqid[2][15]; /* 2 blocks (1 for each antenna) needed for DL */ -} DLHarqBuffers; - - -/* This table stores (RNTI -> DLHARQBuffers*). Will be populated when - DL frames are first read. */ -static GHashTable *mac_lte_dl_harq_hash = NULL; - -typedef struct DLHARQResult { - gboolean previousSet, nextSet; - guint previousFrameNum; - guint timeSincePreviousFrame; - guint nextFrameNum; - guint timeToNextFrame; -} DLHARQResult; - - -/* This table stores (FrameNumber -> *DLHARQResult). It is assigned during the first - pass and used thereafter */ -static GHashTable *mac_lte_dl_harq_result_hash = NULL; - -/**************************************************************************/ - - -/*****************************************************************/ -/* Keeping track of last UL frames per C-RNTI so can verify when */ -/* told that a frame is a retx */ - -typedef struct ULHarqBuffers { - LastFrameData harqid[8]; -} ULHarqBuffers; - - -/* This table stores (RNTI -> ULHarqBuffers*). Will be populated when - UL frames are first read. */ -static GHashTable *mac_lte_ul_harq_hash = NULL; - -typedef struct ULHARQResult { - gboolean previousSet, nextSet; - guint previousFrameNum; - guint timeSincePreviousFrame; - guint nextFrameNum; - guint timeToNextFrame; -} ULHARQResult; - - -/* This table stores (FrameNum -> ULHARQResult). It is assigned during the first - pass and used thereafter */ -static GHashTable *mac_lte_ul_harq_result_hash = NULL; - -/**************************************************************************/ - - -/**************************************************************************/ -/* Tracking of Scheduling Requests (SRs). */ -/* Keep track of: */ -/* - last grant before SR */ -/* - SR failures following request */ -/* - grant following SR */ - -typedef enum SREvent { - SR_Grant, - SR_Request, - SR_Failure -} SREvent; - -static const value_string sr_event_vals[] = { - { SR_Grant, "Grant"}, - { SR_Request, "SR Request"}, - { SR_Failure, "SR Failure"}, - { 0, NULL} -}; - -typedef enum SRStatus { - None, - SR_Outstanding, - SR_Failed -} SRStatus; - -static const value_string sr_status_vals[] = { - { None, "Receiving grants"}, - { SR_Outstanding, "SR Request outstanding"}, - { SR_Failed, "SR has Failed"}, - { 0, NULL} -}; - - -typedef struct SRState { - SRStatus status; - guint32 lastSRFramenum; - guint32 lastGrantFramenum; - nstime_t requestTime; -} SRState; - - -/* This table keeps track of the SR state for each UE. - (RNTI -> SRState) */ -static GHashTable *mac_lte_ue_sr_state = NULL; - - -typedef enum SRResultType { - GrantAnsweringSR, - FailureAnsweringSR, - SRLeadingToGrant, - SRLeadingToFailure, - InvalidSREvent -} SRResultType; - - -typedef struct SRResult { - SRResultType type; - guint32 frameNum; - guint32 timeDifference; - - /* These 2 are only used with InvalidSREvent */ - SRStatus status; - SREvent event; -} SRResult; - -/* Entries in this table are created during the first pass - It maps (SRFrameNum -> SRResult) */ -static GHashTable *mac_lte_sr_request_hash = NULL; - - -/**************************************************************************/ - - - -/* Forward declarations */ -void proto_reg_handoff_mac_lte(void); -void dissect_mac_lte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); - -static guint8 get_mac_lte_channel_priority(guint16 ueid _U_, guint8 lcid, - guint8 direction); - - -/* Heuristic dissection */ -static gboolean global_mac_lte_heur = FALSE; - -static void call_with_catch_all(dissector_handle_t handle, tvbuff_t* tvb, packet_info *pinfo, proto_tree *tree) -{ - /* Call it (catch exceptions so that stats will be updated) */ - TRY { - call_dissector_only(handle, tvb, pinfo, tree); - } - CATCH_ALL { - } - ENDTRY -} - -/* Dissect context fields in the format described in packet-mac-lte.h. - Return TRUE if the necessary information was successfully found */ -gboolean dissect_mac_lte_context_fields(struct mac_lte_info *p_mac_lte_info, tvbuff_t *tvb, - gint *p_offset) -{ - gint offset = *p_offset; - guint8 tag = 0; - - /* Read fixed fields */ - p_mac_lte_info->radioType = tvb_get_guint8(tvb, offset++); - p_mac_lte_info->direction = tvb_get_guint8(tvb, offset++); - - /* TODO: currently no support for detailed PHY info... */ - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - p_mac_lte_info->detailed_phy_info.ul_info.present = FALSE; - } else { - p_mac_lte_info->detailed_phy_info.dl_info.present = FALSE; - } - - p_mac_lte_info->rntiType = tvb_get_guint8(tvb, offset++); - - /* Initialize RNTI with a default value in case optional field is not present */ - switch (p_mac_lte_info->rntiType) { - case M_RNTI: - p_mac_lte_info->rnti = 0xFFFD; - break; - - case P_RNTI: - p_mac_lte_info->rnti = 0xFFFE; - break; - - case SI_RNTI: - p_mac_lte_info->rnti = 0xFFFF; - break; - - case RA_RNTI: - case C_RNTI: - case SPS_RNTI: - p_mac_lte_info->rnti = 0x0001; - break; - - default: - break; - } - - /* Read optional fields */ - while (tag != MAC_LTE_PAYLOAD_TAG) { - /* Process next tag */ - tag = tvb_get_guint8(tvb, offset++); - - switch (tag) { - case MAC_LTE_RNTI_TAG: - p_mac_lte_info->rnti = tvb_get_ntohs(tvb, offset); - offset += 2; - break; - - case MAC_LTE_UEID_TAG: - p_mac_lte_info->ueid = tvb_get_ntohs(tvb, offset); - offset += 2; - break; - - case MAC_LTE_SUBFRAME_TAG: - p_mac_lte_info->sysframeNumber = tvb_get_ntohs(tvb, offset); - offset += 2; - p_mac_lte_info->subframeNumber = tvb_get_ntohs(tvb, offset); - offset += 2; - break; - - case MAC_LTE_PREDEFINED_DATA_TAG: - p_mac_lte_info->isPredefinedData = tvb_get_guint8(tvb, offset); - offset++; - break; - - case MAC_LTE_RETX_TAG: - p_mac_lte_info->reTxCount = tvb_get_guint8(tvb, offset); - offset++; - break; - - case MAC_LTE_CRC_STATUS_TAG: - p_mac_lte_info->crcStatusValid = TRUE; - p_mac_lte_info->detailed_phy_info.dl_info.crc_status = tvb_get_guint8(tvb, offset); - offset++; - break; - - case MAC_LTE_EXT_BSR_SIZES_TAG: - p_mac_lte_info->isExtendedBSRSizes = TRUE; - break; - - case MAC_LTE_OOB_EVENT_TAG: - p_mac_lte_info->oob_event = tvb_get_guint8(tvb, offset); - offset++; - p_mac_lte_info->rapid = tvb_get_guint8(tvb, offset); - offset++; - p_mac_lte_info->rach_attempt_number = tvb_get_guint8(tvb, offset); - offset++; - break; - - case MAC_LTE_PAYLOAD_TAG: - /* Have reached data, so set payload length and get out of loop */ - p_mac_lte_info->length= tvb_length_remaining(tvb, offset); - continue; - - default: - /* It must be a recognised tag */ - return FALSE; - } - } - - /* Pass out where offset is now */ - *p_offset = offset; - - return TRUE; -} - -/* Heuristic dissector looks for supported framing protocol (see wiki page) */ -static gboolean dissect_mac_lte_heur(tvbuff_t *tvb, packet_info *pinfo, - proto_tree *tree) -{ - gint offset = 0; - struct mac_lte_info *p_mac_lte_info; - tvbuff_t *mac_tvb; - gboolean infoAlreadySet = FALSE; - - /* This is a heuristic dissector, which means we get all the UDP - * traffic not sent to a known dissector and not claimed by - * a heuristic dissector called before us! - */ - - if (!global_mac_lte_heur) { - return FALSE; - } - - /* Do this again on re-dissection to re-discover offset of actual PDU */ - - /* Needs to be at least as long as: - - the signature string - - fixed header bytes - - tag for data - - at least one byte of MAC PDU payload */ - if ((size_t)tvb_length_remaining(tvb, offset) < (strlen(MAC_LTE_START_STRING)+3+2)) { - return FALSE; - } - - /* OK, compare with signature string */ - if (tvb_strneql(tvb, offset, MAC_LTE_START_STRING, strlen(MAC_LTE_START_STRING)) != 0) { - return FALSE; - } - - offset += (gint)strlen(MAC_LTE_START_STRING); - - /* If redissecting, use previous info struct (if available) */ - p_mac_lte_info = p_get_proto_data(pinfo->fd, proto_mac_lte); - - if (p_mac_lte_info == NULL) { - /* Allocate new info struct for this frame */ - p_mac_lte_info = se_alloc0(sizeof(struct mac_lte_info)); - infoAlreadySet = FALSE; - } else { - infoAlreadySet = TRUE; - } - - /* Dissect the fields to populate p_mac_lte */ - if (!dissect_mac_lte_context_fields(p_mac_lte_info, tvb, &offset)) { - return FALSE; - } - - - if (!infoAlreadySet) { - /* Store info in packet */ - p_add_proto_data(pinfo->fd, proto_mac_lte, p_mac_lte_info); - } - - /**************************************/ - /* OK, now dissect as MAC LTE */ - - /* Create tvb that starts at actual MAC PDU */ - mac_tvb = tvb_new_subset(tvb, offset, -1, tvb_reported_length(tvb)-offset); - dissect_mac_lte(mac_tvb, pinfo, tree); - - return TRUE; -} - - -/* Write the given formatted text to: - - the info column (if pinfo != NULL) - - 1 or 2 other labels (optional) -*/ -static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2, - packet_info *pinfo, const char *format, ...) -{ -#define MAX_INFO_BUFFER 256 - static char info_buffer[MAX_INFO_BUFFER]; - - va_list ap; - - va_start(ap, format); - g_vsnprintf(info_buffer, MAX_INFO_BUFFER, format, ap); - va_end(ap); - - /* Add to indicated places */ - if (pinfo != NULL) { - col_append_str(pinfo->cinfo, COL_INFO, info_buffer); - } - - if (ti1 != NULL) { - proto_item_append_text(ti1, "%s", info_buffer); - } - - if (ti2 != NULL) { - proto_item_append_text(ti2, "%s", info_buffer); - } -} - -/* Show extra PHY parameters (if present) */ -static void show_extra_phy_parameters(packet_info *pinfo, tvbuff_t *tvb, proto_tree *tree, - struct mac_lte_info *p_mac_lte_info) -{ - proto_item *phy_ti; - proto_tree *phy_tree; - proto_item *ti; - - if (global_mac_lte_layer_to_show == ShowPHYLayer) { - /* Clear the info column */ - col_clear(pinfo->cinfo, COL_INFO); - } - - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - if (p_mac_lte_info->detailed_phy_info.ul_info.present) { - - /* Create root */ - phy_ti = proto_tree_add_string_format(tree, hf_mac_lte_context_phy_ul, - tvb, 0, 0, "", "UL PHY Context"); - phy_tree = proto_item_add_subtree(phy_ti, ett_mac_lte_phy_context); - PROTO_ITEM_SET_GENERATED(phy_ti); - - /* Add items */ - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_modulation_type, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.modulation_type); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_tbs_index, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.tbs_index); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_resource_block_length, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.resource_block_length); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_resource_block_start, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.resource_block_start); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_harq_id, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.harq_id); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_ul_ndi, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.ul_info.ndi); - PROTO_ITEM_SET_GENERATED(ti); - - - proto_item_append_text(phy_ti, " ("); - - write_pdu_label_and_info(phy_ti, NULL, - (global_mac_lte_layer_to_show == ShowPHYLayer) ? pinfo : NULL, - "UL: UEId=%u RNTI=%u %s Tbs_Index=%u RB_len=%u RB_start=%u", - p_mac_lte_info->ueid, - p_mac_lte_info->rnti, - val_to_str_const(p_mac_lte_info->detailed_phy_info.ul_info.modulation_type, - modulation_type_vals, "Unknown"), - p_mac_lte_info->detailed_phy_info.ul_info.tbs_index, - p_mac_lte_info->detailed_phy_info.ul_info.resource_block_length, - p_mac_lte_info->detailed_phy_info.ul_info.resource_block_start); - - proto_item_append_text(phy_ti, ")"); - - /* Don't want columns to be replaced now */ - if (global_mac_lte_layer_to_show == ShowPHYLayer) { - col_set_writable(pinfo->cinfo, FALSE); - } - } - } else { - if (p_mac_lte_info->detailed_phy_info.dl_info.present) { - - /* Create root */ - phy_ti = proto_tree_add_string_format(tree, hf_mac_lte_context_phy_dl, - tvb, 0, 0, "", "DL PHY Context"); - phy_tree = proto_item_add_subtree(phy_ti, ett_mac_lte_phy_context); - PROTO_ITEM_SET_GENERATED(phy_ti); - - /* Add items */ - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_dci_format, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.dci_format); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_resource_allocation_type, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.resource_allocation_type); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_aggregation_level, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.aggregation_level); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_mcs_index, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.mcs_index); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_redundancy_version_index, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.redundancy_version_index); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_boolean(phy_tree, hf_mac_lte_context_phy_dl_retx, - tvb, 0, 0, - p_mac_lte_info->dl_retx); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_resource_block_length, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.resource_block_length); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_crc_status, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.crc_status); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_harq_id, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.harq_id); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_ndi, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.ndi); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(phy_tree, hf_mac_lte_context_phy_dl_tb, - tvb, 0, 0, - p_mac_lte_info->detailed_phy_info.dl_info.transport_block); - PROTO_ITEM_SET_GENERATED(ti); - - - proto_item_append_text(phy_ti, " ("); - - write_pdu_label_and_info(phy_ti, NULL, - (global_mac_lte_layer_to_show == ShowPHYLayer) ? pinfo : NULL, - "DL: UEId=%u RNTI=%u DCI_Format=%s Res_Alloc=%u Aggr_Level=%s MCS=%u RV=%u " - "Res_Block_len=%u CRC_status=%s HARQ_id=%u NDI=%u", - p_mac_lte_info->ueid, - p_mac_lte_info->rnti, - val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.dci_format, - dci_format_vals, "Unknown"), - p_mac_lte_info->detailed_phy_info.dl_info.resource_allocation_type, - val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.aggregation_level, - aggregation_level_vals, "Unknown"), - p_mac_lte_info->detailed_phy_info.dl_info.mcs_index, - p_mac_lte_info->detailed_phy_info.dl_info.redundancy_version_index, - p_mac_lte_info->detailed_phy_info.dl_info.resource_block_length, - val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.crc_status, - crc_status_vals, "Unknown"), - p_mac_lte_info->detailed_phy_info.dl_info.harq_id, - p_mac_lte_info->detailed_phy_info.dl_info.ndi); - proto_item_append_text(phy_ti, ")"); - - /* Don't want columns to be replaced now */ - if (global_mac_lte_layer_to_show == ShowPHYLayer) { - col_set_writable(pinfo->cinfo, FALSE); - } - } - } -} - - -/* Dissect a single Random Access Reponse body */ -static gint dissect_rar_entry(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - proto_item *pdu_ti, - gint offset, guint8 rapid) -{ - guint8 reserved; - guint start_body_offset = offset; - proto_item *ti; - proto_item *rar_body_ti; - proto_tree *rar_body_tree; - proto_tree *ul_grant_tree; - proto_item *ul_grant_ti; - guint16 timing_advance; - guint32 ul_grant; - guint16 temp_crnti; - - /* Create tree for this Body */ - rar_body_ti = proto_tree_add_item(tree, - hf_mac_lte_rar_body, - tvb, offset, 0, ENC_ASCII|ENC_NA); - rar_body_tree = proto_item_add_subtree(rar_body_ti, ett_mac_lte_rar_body); - - /* Dissect an RAR entry */ - - /* Check reserved bit */ - reserved = (tvb_get_guint8(tvb, offset) & 0x80) >> 7; - ti = proto_tree_add_item(rar_body_tree, hf_mac_lte_rar_reserved2, tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "RAR body Reserved bit not zero (found 0x%x)", reserved); - } - - /* Timing Advance */ - timing_advance = (tvb_get_ntohs(tvb, offset) & 0x7ff0) >> 4; - ti = proto_tree_add_item(rar_body_tree, hf_mac_lte_rar_ta, tvb, offset, 2, ENC_BIG_ENDIAN); - - if (timing_advance != 0) { - expert_add_info_format(pinfo, ti, PI_SEQUENCE, (timing_advance <= 31) ? PI_NOTE : PI_WARN, - "RAR Timing advance not zero (%u)", timing_advance); - } - - offset++; - - /* UL Grant */ - ul_grant = (tvb_get_ntohl(tvb, offset) & 0x0fffff00) >> 8; - ul_grant_ti = proto_tree_add_item(rar_body_tree, hf_mac_lte_rar_ul_grant, tvb, offset, 3, ENC_BIG_ENDIAN); - - /* Break these 20 bits down as described in 36.213, section 6.2 */ - /* Create subtree for UL grant break-down */ - ul_grant_tree = proto_item_add_subtree(ul_grant_ti, ett_mac_lte_rar_ul_grant); - - /* Hopping flag (1 bit) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_hopping, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* Fixed sized resource block assignment (10 bits) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_fsrba, - tvb, offset, 2, ENC_BIG_ENDIAN); - - /* Truncated Modulation and coding scheme (4 bits) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tmcs, - tvb, offset+1, 2, ENC_BIG_ENDIAN); - - /* TPC command for scheduled PUSCH (3 bits) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_tcsp, - tvb, offset+2, 1, ENC_BIG_ENDIAN); - - /* UL delay (1 bit) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_ul_delay, - tvb, offset+2, 1, ENC_BIG_ENDIAN); - - /* CQI request (1 bit) */ - proto_tree_add_item(ul_grant_tree, hf_mac_lte_rar_ul_grant_cqi_request, - tvb, offset+2, 1, ENC_BIG_ENDIAN); - - offset += 3; - - /* Temporary C-RNTI */ - temp_crnti = tvb_get_ntohs(tvb, offset); - proto_tree_add_item(rar_body_tree, hf_mac_lte_rar_temporary_crnti, tvb, offset, 2, ENC_BIG_ENDIAN); - offset += 2; - - write_pdu_label_and_info(pdu_ti, rar_body_ti, pinfo, - "(RAPID=%u: TA=%u, UL-Grant=%u, Temp C-RNTI=%u) ", - rapid, timing_advance, ul_grant, temp_crnti); - - proto_item_set_len(rar_body_ti, offset-start_body_offset); - - return offset; -} - - -#define MAX_RAR_PDUS 64 -/* Dissect Random Access Reponse (RAR) PDU */ -static void dissect_rar(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *pdu_ti, - gint offset, mac_lte_info *p_mac_lte_info, mac_lte_tap_info *tap_info) -{ - gint number_of_rars = 0; /* No of RAR bodies expected following headers */ - guint8 *rapids = ep_alloc(MAX_RAR_PDUS * sizeof(guint8)); - gboolean backoff_indicator_seen = FALSE; - guint8 backoff_indicator = 0; - guint8 extension; - gint n; - proto_tree *rar_headers_tree; - proto_item *ti; - proto_item *rar_headers_ti; - proto_item *padding_length_ti; - int start_headers_offset = offset; - - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "RAR (RA-RNTI=%u, SF=%u) ", - p_mac_lte_info->rnti, p_mac_lte_info->subframeNumber); - - /* Create hidden 'virtual root' so can filter on mac-lte.rar */ - ti = proto_tree_add_item(tree, hf_mac_lte_rar, tvb, offset, -1, ENC_NA); - PROTO_ITEM_SET_HIDDEN(ti); - - /* Create headers tree */ - rar_headers_ti = proto_tree_add_item(tree, - hf_mac_lte_rar_headers, - tvb, offset, 0, ENC_ASCII|ENC_NA); - rar_headers_tree = proto_item_add_subtree(rar_headers_ti, ett_mac_lte_rar_headers); - - - /***************************/ - /* Read the header entries */ - do { - int start_header_offset = offset; - proto_tree *rar_header_tree; - proto_item *rar_header_ti; - guint8 type_value; - guint8 first_byte = tvb_get_guint8(tvb, offset); - - /* Create tree for this header */ - rar_header_ti = proto_tree_add_item(rar_headers_tree, - hf_mac_lte_rar_header, - tvb, offset, 0, ENC_ASCII|ENC_NA); - rar_header_tree = proto_item_add_subtree(rar_header_ti, ett_mac_lte_rar_header); - - /* Extension */ - extension = (first_byte & 0x80) >> 7; - proto_tree_add_item(rar_header_tree, hf_mac_lte_rar_extension, tvb, offset, 1, ENC_BIG_ENDIAN); - - /* Type */ - type_value = (first_byte & 0x40) >> 6; - proto_tree_add_item(rar_header_tree, hf_mac_lte_rar_t, tvb, offset, 1, ENC_BIG_ENDIAN); - - if (type_value == 0) { - /* Backoff Indicator (BI) case */ - - guint8 reserved; - proto_item *tii; - proto_item *bi_ti; - - /* 2 Reserved bits */ - reserved = (tvb_get_guint8(tvb, offset) & 0x30) >> 4; - tii = proto_tree_add_item(rar_header_tree, hf_mac_lte_rar_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, tii, PI_MALFORMED, PI_ERROR, - "RAR header Reserved bits not zero (found 0x%x)", reserved); - } - - /* Backoff Indicator */ - backoff_indicator = tvb_get_guint8(tvb, offset) & 0x0f; - bi_ti = proto_tree_add_item(rar_header_tree, hf_mac_lte_rar_bi, tvb, offset, 1, ENC_BIG_ENDIAN); - - /* As of March 2009 spec, it must be first, and may only appear once */ - if (backoff_indicator_seen) { - expert_add_info_format(pinfo, bi_ti, PI_MALFORMED, PI_ERROR, - "MAC RAR PDU has > 1 Backoff Indicator subheader present"); - } - - backoff_indicator_seen = TRUE; - - write_pdu_label_and_info(pdu_ti, rar_header_ti, pinfo, - "(Backoff Indicator=%sms)", - val_to_str_const(backoff_indicator, rar_bi_vals, "Illegal-value ")); - - /* If present, it must be the first subheader */ - if (number_of_rars > 0) { - expert_add_info_format(pinfo, bi_ti, PI_MALFORMED, PI_WARN, - "Backoff Indicator must appear as first subheader"); - } - - } else { - /* RAPID case */ - /* TODO: complain if the same RAPID appears twice in same frame? */ - rapids[number_of_rars] = tvb_get_guint8(tvb, offset) & 0x3f; - proto_tree_add_item(rar_header_tree, hf_mac_lte_rar_rapid, tvb, offset, 1, ENC_BIG_ENDIAN); - - proto_item_append_text(rar_header_ti, "(RAPID=%u)", rapids[number_of_rars]); - - number_of_rars++; - } - - offset++; - - /* Finalise length of header tree selection */ - proto_item_set_len(rar_header_ti, offset - start_header_offset); - - } while (extension && number_of_rars < MAX_RAR_PDUS); - - /* Append summary to headers root */ - proto_item_append_text(rar_headers_ti, " (%u RARs", number_of_rars); - - if (backoff_indicator_seen) { - proto_item_append_text(rar_headers_ti, ", BI=%sms)", - val_to_str_const(backoff_indicator, rar_bi_vals, "Illegal-value ")); - } else { - proto_item_append_text(rar_headers_ti, ")"); - } - - /* Set length for headers root */ - proto_item_set_len(rar_headers_ti, offset-start_headers_offset); - - - /***************************/ - /* Read any indicated RARs */ - for (n=0; n < number_of_rars; n++) { - offset = dissect_rar_entry(tvb, pinfo, tree, pdu_ti, offset, rapids[n]); - } - - /* Update TAP info */ - tap_info->number_of_rars += number_of_rars; - - /* Padding may follow */ - if (tvb_length_remaining(tvb, offset) > 0) { - proto_tree_add_item(tree, hf_mac_lte_padding_data, - tvb, offset, -1, ENC_NA); - } - - padding_length_ti = proto_tree_add_int(tree, hf_mac_lte_padding_length, - tvb, offset, 0, - p_mac_lte_info->length - offset); - PROTO_ITEM_SET_GENERATED(padding_length_ti); - - /* Update padding bytes in stats */ - tap_info->padding_bytes += (p_mac_lte_info->length - offset); -} - - -/* Dissect BCH PDU */ -static void dissect_bch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - proto_item *pdu_ti, - int offset, mac_lte_info *p_mac_lte_info) -{ - proto_item *ti; - - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "BCH PDU (%u bytes, on %s transport) ", - tvb_length_remaining(tvb, offset), - val_to_str_const(p_mac_lte_info->rntiType, - bch_transport_channel_vals, - "Unknown")); - - /* Show which transport layer it came in on (inferred from RNTI type) */ - ti = proto_tree_add_uint(tree, hf_mac_lte_context_bch_transport_channel, - tvb, offset, 0, p_mac_lte_info->rntiType); - PROTO_ITEM_SET_GENERATED(ti); - - /****************************************/ - /* Whole frame is BCH data */ - - /* Raw data */ - ti = proto_tree_add_item(tree, hf_mac_lte_bch_pdu, - tvb, offset, -1, ENC_NA); - - if (global_mac_lte_attempt_rrc_decode) { - /* Attempt to decode payload using LTE RRC dissector */ - tvbuff_t *rrc_tvb = tvb_new_subset(tvb, offset, -1, tvb_length_remaining(tvb, offset)); - - /* Get appropriate dissector handle */ - dissector_handle_t protocol_handle = 0; - - if (p_mac_lte_info->rntiType == SI_RNTI) { - protocol_handle = find_dissector("lte_rrc.bcch_dl_sch"); - } else { - protocol_handle = find_dissector("lte_rrc.bcch_bch"); - } - - /* Hide raw view of bytes */ - PROTO_ITEM_SET_HIDDEN(ti); - - call_with_catch_all(protocol_handle, rrc_tvb, pinfo, tree); - } - - /* Check that this *is* downlink! */ - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "BCH data should not be received in Uplink!"); - } -} - - -/* Dissect PCH PDU */ -static void dissect_pch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - proto_item *pdu_ti, int offset, guint8 direction) -{ - proto_item *ti; - - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "PCH PDU (%u bytes) ", - tvb_length_remaining(tvb, offset)); - - /****************************************/ - /* Whole frame is PCH data */ - - /* Always show as raw data */ - ti = proto_tree_add_item(tree, hf_mac_lte_pch_pdu, - tvb, offset, -1, ENC_NA); - - if (global_mac_lte_attempt_rrc_decode) { - - /* Attempt to decode payload using LTE RRC dissector */ - tvbuff_t *rrc_tvb = tvb_new_subset(tvb, offset, -1, tvb_length_remaining(tvb, offset)); - - /* Get appropriate dissector handle */ - dissector_handle_t protocol_handle = find_dissector("lte-rrc.pcch"); - - /* Hide raw view of bytes */ - PROTO_ITEM_SET_HIDDEN(ti); - - /* Call it (catch exceptions so that stats will be updated) */ - TRY { - call_dissector_only(protocol_handle, rrc_tvb, pinfo, tree); - } - CATCH_ALL { - } - ENDTRY - } - - /* Check that this *is* downlink! */ - if (direction == DIRECTION_UPLINK) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "PCH data should not be received in Uplink!"); - } -} - - -/* Does this header entry correspond to a fixed-sized control element? */ -static int is_fixed_sized_control_element(guint8 lcid, guint8 direction) -{ - if (direction == DIRECTION_UPLINK) { - /* Uplink */ - switch (lcid) { - case POWER_HEADROOM_REPORT_LCID: - case CRNTI_LCID: - case TRUNCATED_BSR_LCID: - case SHORT_BSR_LCID: - case LONG_BSR_LCID: - return TRUE; - - default: - return FALSE; - } - } else { - /* Assume Downlink */ - switch (lcid) { - case ACTIVATION_DEACTIVATION_LCID: - case UE_CONTENTION_RESOLUTION_IDENTITY_LCID: - case TIMING_ADVANCE_LCID: - case DRX_COMMAND_LCID: - return TRUE; - - default: - return FALSE; - } - } -} - - -/* Is this a BSR report header? */ -static int is_bsr_lcid(guint8 lcid) -{ - return ((lcid == TRUNCATED_BSR_LCID) || - (lcid == SHORT_BSR_LCID) || - (lcid == LONG_BSR_LCID)); -} - - -/* Helper function to call RLC dissector for SDUs (where channel params are known) */ -static void call_rlc_dissector(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - proto_item *pdu_ti, - int offset, guint16 data_length, - guint8 mode, guint8 direction, guint16 ueid, - guint16 channelType, guint16 channelId, - guint8 UMSequenceNumberLength, - guint8 priority) -{ - tvbuff_t *srb_tvb = tvb_new_subset(tvb, offset, data_length, data_length); - struct rlc_lte_info *p_rlc_lte_info; - - /* Get RLC dissector handle */ - volatile dissector_handle_t protocol_handle = find_dissector("rlc-lte"); - - /* Resuse or create RLC info */ - p_rlc_lte_info = p_get_proto_data(pinfo->fd, proto_rlc_lte); - - if (p_rlc_lte_info == NULL) { - p_rlc_lte_info = se_alloc0(sizeof(struct rlc_lte_info)); - } - - /* Fill in struct details for srb channels */ - p_rlc_lte_info->rlcMode = mode; - p_rlc_lte_info->direction = direction; - p_rlc_lte_info->priority = priority; - p_rlc_lte_info->ueid = ueid; - p_rlc_lte_info->channelType = channelType; - p_rlc_lte_info->channelId = channelId; - p_rlc_lte_info->pduLength = data_length; - p_rlc_lte_info->UMSequenceNumberLength = UMSequenceNumberLength; - - /* Store info in packet */ - p_add_proto_data(pinfo->fd, proto_rlc_lte, p_rlc_lte_info); - - if (global_mac_lte_layer_to_show != ShowRLCLayer) { - /* Don't want these columns replaced */ - col_set_writable(pinfo->cinfo, FALSE); - } else { - /* Clear info column before first RLC PDU */ - if (s_number_of_rlc_pdus_shown == 0) { - col_clear(pinfo->cinfo, COL_INFO); - } else { - /* Add a separator and protect column contents here */ - write_pdu_label_and_info(pdu_ti, NULL, pinfo, " || "); - col_set_fence(pinfo->cinfo, COL_INFO); - } - } - - s_number_of_rlc_pdus_shown++; - - /* Call it (catch exceptions so that stats will be updated) */ - TRY { - call_dissector_only(protocol_handle, srb_tvb, pinfo, tree); - } - CATCH_ALL { - } - ENDTRY - - /* Let columns be written to again */ - col_set_writable(pinfo->cinfo, TRUE); -} - - -/* For DL frames, look for previous Tx. Add link back if found */ -static void TrackReportedDLHARQResend(packet_info *pinfo, tvbuff_t *tvb, volatile int length, - proto_tree *tree, mac_lte_info *p_mac_lte_info) -{ - DLHARQResult *result = NULL; - DLHARQResult *original_result = NULL; - - /* If don't have detailed DL PHy info, just give up */ - if (!p_mac_lte_info->detailed_phy_info.dl_info.present) { - return; - } - - /* TDD may not work... */ - - if (!pinfo->fd->flags.visited) { - /* First time, so set result and update DL harq table */ - LastFrameData *lastData = NULL; - LastFrameData *thisData = NULL; - - DLHarqBuffers *ueData; - - /* Read these for convenience */ - guint8 harq_id = p_mac_lte_info->detailed_phy_info.dl_info.harq_id; - guint8 transport_block = p_mac_lte_info->detailed_phy_info.dl_info.transport_block; - - /* Check harq-id bounds, give up if invalid */ - if ((harq_id >= 15) || (transport_block+1 > 2)) { - return; - } - - /* Look up entry for this UE/RNTI */ - ueData = g_hash_table_lookup(mac_lte_dl_harq_hash, GUINT_TO_POINTER((guint)p_mac_lte_info->rnti)); - - if (ueData != NULL) { - /* Get previous info for this harq-id */ - lastData = &(ueData->harqid[transport_block][harq_id]); - - if (lastData->inUse) { - /* Compare time difference, ndi, data to see if this looks like a retx */ - if ((length == lastData->length) && - (p_mac_lte_info->detailed_phy_info.dl_info.ndi == lastData->ndi) && - tvb_memeql(tvb, 0, lastData->data, MIN(lastData->length, MAX_EXPECTED_PDU_LENGTH)) == 0) { - - /* Work out gap between frames */ - gint seconds_between_packets = (gint) - (pinfo->fd->abs_ts.secs - lastData->received_time.secs); - gint nseconds_between_packets = - pinfo->fd->abs_ts.nsecs - lastData->received_time.nsecs; - - /* Round difference to nearest millisecond */ - gint total_gap = (seconds_between_packets*1000) + - ((nseconds_between_packets+500000) / 1000000); - - /* Expect to be within (say) 8-13 subframes since previous */ - if ((total_gap >= 8) && (total_gap <= 13)) { - - /* Resend detected! Store result pointing back. */ - result = se_alloc0(sizeof(DLHARQResult)); - result->previousSet = TRUE; - result->previousFrameNum = lastData->framenum; - result->timeSincePreviousFrame = total_gap; - g_hash_table_insert(mac_lte_dl_harq_result_hash, GUINT_TO_POINTER(pinfo->fd->num), result); - - /* Now make previous frame point forward to here */ - original_result = g_hash_table_lookup(mac_lte_dl_harq_result_hash, GUINT_TO_POINTER(lastData->framenum)); - - if (original_result == NULL) { - original_result = se_alloc0(sizeof(ULHARQResult)); - g_hash_table_insert(mac_lte_dl_harq_result_hash, GUINT_TO_POINTER(lastData->framenum), original_result); - } - - original_result->nextSet = TRUE; - original_result->nextFrameNum = pinfo->fd->num; - original_result->timeToNextFrame = total_gap; - } - } - } - } else { - /* Allocate entry in table for this UE/RNTI */ - ueData = se_alloc0(sizeof(DLHarqBuffers)); - g_hash_table_insert(mac_lte_dl_harq_hash, GUINT_TO_POINTER((guint)p_mac_lte_info->rnti), ueData); - } - - /* Store this frame's details in table */ - thisData = &(ueData->harqid[transport_block][harq_id]); - thisData->inUse = TRUE; - thisData->length = length; - tvb_memcpy(tvb, thisData->data, 0, MIN(thisData->length, MAX_EXPECTED_PDU_LENGTH)); - thisData->ndi = p_mac_lte_info->detailed_phy_info.dl_info.ndi; - thisData->framenum = pinfo->fd->num; - thisData->received_time = pinfo->fd->abs_ts; - } else { - /* Not first time, so just set whats already stored in result */ - result = g_hash_table_lookup(mac_lte_dl_harq_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - } - - - /***************************************************/ - /* Show link back to original frame (if available) */ - if (result != NULL) { - if (result->previousSet) { - proto_item *gap_ti; - proto_item *original_ti = proto_tree_add_uint(tree, hf_mac_lte_dl_harq_resend_original_frame, - tvb, 0, 0, result->previousFrameNum); - PROTO_ITEM_SET_GENERATED(original_ti); - - gap_ti = proto_tree_add_uint(tree, hf_mac_lte_dl_harq_resend_time_since_previous_frame, - tvb, 0, 0, result->timeSincePreviousFrame); - PROTO_ITEM_SET_GENERATED(gap_ti); - } - - if (result->nextSet) { - proto_item *gap_ti; - proto_item *next_ti = proto_tree_add_uint(tree, hf_mac_lte_dl_harq_resend_next_frame, - tvb, 0, 0, result->nextFrameNum); - PROTO_ITEM_SET_GENERATED(next_ti); - - gap_ti = proto_tree_add_uint(tree, hf_mac_lte_dl_harq_resend_time_until_next_frame, - tvb, 0, 0, result->timeToNextFrame); - PROTO_ITEM_SET_GENERATED(gap_ti); - } - - } -} - - -/* Return TRUE if the given packet is thought to be a retx */ -int is_mac_lte_frame_retx(packet_info *pinfo, guint8 direction) -{ - struct mac_lte_info *p_mac_lte_info = p_get_proto_data(pinfo->fd, proto_mac_lte); - - if (direction == DIRECTION_UPLINK) { - /* For UL, retx count is stored in per-packet struct */ - return ((p_mac_lte_info != NULL) && (p_mac_lte_info->reTxCount > 0)); - } else { - /* Use answer if told directly */ - if (p_mac_lte_info->dl_retx == dl_retx_yes) { - return TRUE; - } else { - /* Otherwise look up in table */ - DLHARQResult *result = g_hash_table_lookup(mac_lte_dl_harq_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - return ((result != NULL) && result->previousSet); - } - } -} - - -/* Track UL frames, so that when a retx is indicated, we can search for - the original tx. We will either find it, and provide a link back to it, - or flag that we couldn't find as an expert error */ -static void TrackReportedULHARQResend(packet_info *pinfo, tvbuff_t *tvb, volatile int offset, - proto_tree *tree, mac_lte_info *p_mac_lte_info, - proto_item *retx_ti) -{ - ULHARQResult *result = NULL; - - /* If don't have detailed DL PHY info, just give up */ - if (!p_mac_lte_info->detailed_phy_info.ul_info.present) { - return; - } - - /* Give up if harqid is out of range */ - if (p_mac_lte_info->detailed_phy_info.ul_info.harq_id >= 8) { - return; - } - - if (!pinfo->fd->flags.visited) { - /* First time, so set result and update UL harq table */ - LastFrameData *lastData = NULL; - LastFrameData *thisData = NULL; - - /* Look up entry for this UE/RNTI */ - ULHarqBuffers *ueData = - g_hash_table_lookup(mac_lte_ul_harq_hash, GUINT_TO_POINTER((guint)p_mac_lte_info->rnti)); - - if (ueData != NULL) { - if (p_mac_lte_info->reTxCount >= 1) { - /* Looking for frame previously on this harq-id */ - lastData = &(ueData->harqid[p_mac_lte_info->detailed_phy_info.ul_info.harq_id]); - - if (lastData->inUse) { - /* Compare time, sf, data to see if this looks like a retx */ - if ((tvb_length_remaining(tvb, offset) == lastData->length) && - (p_mac_lte_info->detailed_phy_info.ul_info.ndi == lastData->ndi) && - tvb_memeql(tvb, offset, lastData->data, MIN(lastData->length, MAX_EXPECTED_PDU_LENGTH)) == 0) { - - /* Work out gap between frames */ - gint seconds_between_packets = (gint) - (pinfo->fd->abs_ts.secs - lastData->received_time.secs); - gint nseconds_between_packets = - pinfo->fd->abs_ts.nsecs - lastData->received_time.nsecs; - - /* Round to nearest ms */ - gint total_gap = (seconds_between_packets*1000) + - ((nseconds_between_packets+500000) / 1000000); - - /* Could be as many as max-tx (which we don't know) * 8ms ago. - 32 is the most I've seen... */ - if (total_gap <= 33) { - ULHARQResult *original_result = NULL; - - /* Original detected!!! Store result pointing back */ - result = se_alloc0(sizeof(ULHARQResult)); - result->previousSet = TRUE; - result->previousFrameNum = lastData->framenum; - result->timeSincePreviousFrame = total_gap; - g_hash_table_insert(mac_lte_ul_harq_result_hash, GUINT_TO_POINTER(pinfo->fd->num), result); - - /* Now make previous frame point forward to here */ - original_result = g_hash_table_lookup(mac_lte_ul_harq_result_hash, GUINT_TO_POINTER(lastData->framenum)); - - if (original_result == NULL) { - original_result = se_alloc0(sizeof(ULHARQResult)); - g_hash_table_insert(mac_lte_ul_harq_result_hash, GUINT_TO_POINTER(lastData->framenum), original_result); - } - - original_result->nextSet = TRUE; - original_result->nextFrameNum = pinfo->fd->num; - original_result->timeToNextFrame = total_gap; - } - } - } - } - } else { - /* Allocate entry in table for this UE/RNTI */ - ueData = se_alloc0(sizeof(ULHarqBuffers)); - g_hash_table_insert(mac_lte_ul_harq_hash, GUINT_TO_POINTER((guint)p_mac_lte_info->rnti), ueData); - } - - /* Store this frame's details in table */ - thisData = &(ueData->harqid[p_mac_lte_info->detailed_phy_info.ul_info.harq_id]); - thisData->inUse = TRUE; - thisData->length = tvb_length_remaining(tvb, offset); - tvb_memcpy(tvb, thisData->data, offset, MIN(thisData->length, MAX_EXPECTED_PDU_LENGTH)); - thisData->ndi = p_mac_lte_info->detailed_phy_info.ul_info.ndi; - thisData->framenum = pinfo->fd->num; - thisData->received_time = pinfo->fd->abs_ts; - } else { - /* Not first time, so just get whats already stored in result */ - result = g_hash_table_lookup(mac_lte_ul_harq_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - } - - /* Show any link back to previous Tx */ - if (retx_ti != NULL) { - if (result != NULL) { - if (result->previousSet) { - proto_item *original_ti, *gap_ti; - - original_ti = proto_tree_add_uint(tree, hf_mac_lte_ul_harq_resend_original_frame, - tvb, 0, 0, result->previousFrameNum); - PROTO_ITEM_SET_GENERATED(original_ti); - - gap_ti = proto_tree_add_uint(tree, hf_mac_lte_ul_harq_resend_time_since_previous_frame, - tvb, 0, 0, result->timeSincePreviousFrame); - PROTO_ITEM_SET_GENERATED(gap_ti); - } - } else { - expert_add_info_format(pinfo, retx_ti, PI_SEQUENCE, PI_ERROR, - "Original Tx of UL frame not found (UE %u) !!", p_mac_lte_info->ueid); - } - } - - /* Show link forward to any known next Tx */ - if ((result != NULL) && result->nextSet) { - proto_item *next_ti, *gap_ti; - - next_ti = proto_tree_add_uint(tree, hf_mac_lte_ul_harq_resend_next_frame, - tvb, 0, 0, result->nextFrameNum); - expert_add_info_format(pinfo, next_ti, PI_SEQUENCE, PI_WARN, - "UL MAC PDU (UE %u) needed to be retransmitted", p_mac_lte_info->ueid); - - PROTO_ITEM_SET_GENERATED(next_ti); - - gap_ti = proto_tree_add_uint(tree, hf_mac_lte_ul_harq_resend_time_until_next_frame, - tvb, 0, 0, result->timeToNextFrame); - PROTO_ITEM_SET_GENERATED(gap_ti); - } -} - - -/* Look up SRResult associated with a given frame. Will create one if necessary - if can_create is set */ -static SRResult *GetSRResult(guint32 frameNum, gboolean can_create) -{ - SRResult *result; - result = g_hash_table_lookup(mac_lte_sr_request_hash, GUINT_TO_POINTER(frameNum)); - - if ((result == NULL) && can_create) { - result = se_alloc0(sizeof(SRResult)); - g_hash_table_insert(mac_lte_sr_request_hash, GUINT_TO_POINTER((guint)frameNum), result); - } - - return result; -} - - -/* Keep track of SR requests, failures and related grants, in order to show them - as generated fields in these frames */ -static void TrackSRInfo(SREvent event, packet_info *pinfo, proto_tree *tree, - tvbuff_t *tvb, mac_lte_info *p_mac_lte_info, gint idx, proto_item *event_ti) -{ - SRResult *result = NULL; - SRState *state; - SRResult *resultForSRFrame = NULL; - - guint16 rnti; - guint16 ueid; - proto_item *ti; - - /* Get appropriate identifiers */ - if (event == SR_Request) { - rnti = p_mac_lte_info->oob_rnti[idx]; - ueid = p_mac_lte_info->oob_ueid[idx]; - } else { - rnti = p_mac_lte_info->rnti; - ueid = p_mac_lte_info->ueid; - } - - /* Create state for this RNTI if necessary */ - state = g_hash_table_lookup(mac_lte_ue_sr_state, GUINT_TO_POINTER((guint)rnti)); - - if (state == NULL) { - /* Allocate status for this RNTI */ - state = se_alloc(sizeof(SRState)); - state->status = None; - g_hash_table_insert(mac_lte_ue_sr_state, GUINT_TO_POINTER((guint)rnti), state); - } - - /* First time through - update state with new info */ - if (!pinfo->fd->flags.visited) { - guint32 timeSinceRequest; - - /* Store time of request */ - if (event == SR_Request) { - state->requestTime = pinfo->fd->abs_ts; - } - - switch (state->status) { - case None: - switch (event) { - case SR_Grant: - /* Got another grant - fine */ - - /* update state */ - state->lastGrantFramenum = pinfo->fd->num; - break; - - case SR_Request: - /* Sent an SR - fine */ - - /* Update state */ - state->status = SR_Outstanding; - state->lastSRFramenum = pinfo->fd->num; - break; - - case SR_Failure: - /* This is an error, since we hadn't send an SR... */ - result = GetSRResult(pinfo->fd->num, TRUE); - result->type = InvalidSREvent; - result->status = None; - result->event = SR_Failure; - break; - } - - break; - - case SR_Outstanding: - timeSinceRequest = (guint32)(((pinfo->fd->abs_ts.secs - state->requestTime.secs) * 1000) + - ((pinfo->fd->abs_ts.nsecs - state->requestTime.nsecs) / 1000000)); - - switch (event) { - case SR_Grant: - /* Got grant we were waiting for, so state goes to None */ - - /* Update state */ - state->status = None; - - /* Set result info */ - result = GetSRResult(pinfo->fd->num, TRUE); - result->type = GrantAnsweringSR; - result->frameNum = state->lastSRFramenum; - result->timeDifference = timeSinceRequest; - - /* Also set forward link for SR */ - resultForSRFrame = GetSRResult(state->lastSRFramenum, TRUE); - resultForSRFrame->type = SRLeadingToGrant; - resultForSRFrame->frameNum = pinfo->fd->num; - resultForSRFrame->timeDifference = timeSinceRequest; - break; - - case SR_Request: - /* Another request when already have one pending */ - result = GetSRResult(pinfo->fd->num, TRUE); - result->type = InvalidSREvent; - result->status = SR_Outstanding; - result->event = SR_Request; - break; - - case SR_Failure: - /* We sent an SR but it failed */ - - /* Update state */ - state->status = SR_Failed; - - /* Set result info for failure frame */ - result = GetSRResult(pinfo->fd->num, TRUE); - result->type = FailureAnsweringSR; - result->frameNum = state->lastSRFramenum; - result->timeDifference = timeSinceRequest; - - /* Also set forward link for SR */ - resultForSRFrame = GetSRResult(state->lastSRFramenum, TRUE); - resultForSRFrame->type = SRLeadingToFailure; - resultForSRFrame->frameNum = pinfo->fd->num; - resultForSRFrame->timeDifference = timeSinceRequest; - break; - } - - break; - - case SR_Failed: - switch (event) { - case SR_Grant: - /* Got a grant, presumably after a subsequent RACH - fine */ - - /* Update state */ - state->status = None; - break; - - case SR_Request: - /* Tried another SR after previous one failed. - Presumably a subsequent RACH was tried in-between... */ - - state->status = SR_Outstanding; - - result = GetSRResult(pinfo->fd->num, TRUE); - result->status = SR_Outstanding; - result->event = SR_Request; - break; - - case SR_Failure: - /* 2 failures in a row.... */ - result = GetSRResult(pinfo->fd->num, TRUE); - result->type = InvalidSREvent; - result->status = SR_Failed; - result->event = SR_Failure; - break; - } - - break; - } - } - - /* Get stored result for this frame */ - result = GetSRResult(pinfo->fd->num, FALSE); - - if (result == NULL) { - /* For an SR frame, there should always be either a PDCCH grant or indication - that the SR has failed */ - if (event == SR_Request) { - expert_add_info_format(pinfo, event_ti, PI_SEQUENCE, PI_ERROR, - "UE %u: SR results in neither a grant nor a failure indication", - ueid); - } - - return; - } - - - /* Show result info */ - switch (result->type) { - case GrantAnsweringSR: - ti = proto_tree_add_uint(tree, hf_mac_lte_grant_answering_sr, - tvb, 0, 0, result->frameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_since_request, - tvb, 0, 0, result->timeDifference); - PROTO_ITEM_SET_GENERATED(ti); - break; - - case FailureAnsweringSR: - ti = proto_tree_add_uint(tree, hf_mac_lte_failure_answering_sr, - tvb, 0, 0, result->frameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_since_request, - tvb, 0, 0, result->timeDifference); - PROTO_ITEM_SET_GENERATED(ti); - break; - - case SRLeadingToGrant: - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_leading_to_grant, - tvb, 0, 0, result->frameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_until_answer, - tvb, 0, 0, result->timeDifference); - PROTO_ITEM_SET_GENERATED(ti); - - break; - - case SRLeadingToFailure: - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_leading_to_failure, - tvb, 0, 0, result->frameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(tree, hf_mac_lte_sr_time_until_answer, - tvb, 0, 0, result->timeDifference); - PROTO_ITEM_SET_GENERATED(ti); - break; - - case InvalidSREvent: - ti = proto_tree_add_none_format(tree, hf_mac_lte_sr_invalid_event, - tvb, 0, 0, "UE %u: Invalid SR event - state=%s, event=%s", - ueid, - val_to_str_const(result->status, sr_status_vals, "Unknown"), - val_to_str_const(result->event, sr_event_vals, "Unknown")); - PROTO_ITEM_SET_GENERATED(ti); - expert_add_info_format(pinfo, ti, PI_SEQUENCE, PI_ERROR, - "Invalid SR event for UE %u (C-RNTI %u) - state=%s, event=%s", - ueid, rnti, - val_to_str_const(result->status, sr_status_vals, "Unknown"), - val_to_str_const(result->event, sr_event_vals, "Unknown")); - break; - } -} - - -/********************************************************/ -/* Count number of UEs/TTI (in both directions) */ -/********************************************************/ - -/* For keeping track during first pass */ -typedef struct tti_info_t { - guint16 subframe; - nstime_t ttiStartTime; - guint ues_in_tti; -} tti_info_t; - -static tti_info_t UL_tti_info; -static tti_info_t DL_tti_info; - -/* For associating with frame and displaying */ -typedef struct TTIInfoResult_t { - guint ues_in_tti; -} TTIInfoResult_t; - -/* This table stores (FrameNumber -> *TTIInfoResult_t). It is assigned during the first - pass and used thereafter */ -static GHashTable *mac_lte_tti_info_result_hash = NULL; - - -/* Work out which UE this is within TTI (within direction). Return answer */ -static guint16 count_ues_tti(mac_lte_info *p_mac_lte_info, packet_info *pinfo) -{ - gboolean same_tti = FALSE; - tti_info_t *tti_info; - - /* Just return any previous result */ - TTIInfoResult_t *result = g_hash_table_lookup(mac_lte_tti_info_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - - if (result != NULL) { - return result->ues_in_tti; - } - - /* Set tti_info based upon direction */ - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - tti_info = &UL_tti_info; - } else { - tti_info = &DL_tti_info; - } - - /* Work out if we are still in the same tti as before */ - if (tti_info->subframe == p_mac_lte_info->subframeNumber) { - gint seconds_between_packets = (gint) - (pinfo->fd->abs_ts.secs - tti_info->ttiStartTime.secs); - gint nseconds_between_packets = - pinfo->fd->abs_ts.nsecs - tti_info->ttiStartTime.nsecs; - - /* Round difference to nearest microsecond */ - gint total_us_gap = (seconds_between_packets*1000000) + - ((nseconds_between_packets+500) / 1000); - - if (total_us_gap < 1000) { - same_tti = TRUE; - } - } - - /* Update global state */ - if (!same_tti) { - tti_info->subframe = p_mac_lte_info->subframeNumber; - tti_info->ttiStartTime = pinfo->fd->abs_ts; - tti_info->ues_in_tti = 1; - } else { - tti_info->ues_in_tti++; - } - - /* Set result state for this frame */ - result = se_alloc(sizeof(TTIInfoResult_t)); - result->ues_in_tti = tti_info->ues_in_tti; - g_hash_table_insert(mac_lte_tti_info_result_hash, - GUINT_TO_POINTER(pinfo->fd->num), result); - - return tti_info->ues_in_tti; -} - - -/* Show which UE this is (within direction) for this TTI */ -static void show_ues_tti(packet_info *pinfo, mac_lte_info *p_mac_lte_info, tvbuff_t *tvb, proto_tree *context_tree) -{ - /* Look up result */ - TTIInfoResult_t *result = g_hash_table_lookup(mac_lte_tti_info_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - - if (result != NULL) { - proto_item *ti = proto_tree_add_uint(context_tree, - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? - hf_mac_lte_ues_ul_per_tti : - hf_mac_lte_ues_dl_per_tti, - tvb, 0, 0, result->ues_in_tti); - PROTO_ITEM_SET_GENERATED(ti); - } -} - - - -/* Lookup channel details for lcid */ -static void lookup_rlc_channel_from_lcid(guint8 lcid, - rlc_channel_type_t *rlc_channel_type, - guint8 *UM_seqnum_length, - gint *drb_id) -{ - /* Zero params (in case no match is found) */ - *rlc_channel_type = rlcRaw; - *UM_seqnum_length = 0; - *drb_id = 0; - - if (global_mac_lte_lcid_drb_source == (int)FromStaticTable) { - - /* Look up in static (UAT) table */ - guint m; - - for (m=0; m < num_lcid_drb_mappings; m++) { - if (lcid == lcid_drb_mappings[m].lcid) { - - *rlc_channel_type = lcid_drb_mappings[m].channel_type; - - /* Set UM_seqnum_length */ - switch (*rlc_channel_type) { - case rlcUM5: - *UM_seqnum_length = 5; - break; - - case rlcUM10: - *UM_seqnum_length = 10; - break; - - default: - break; - } - - /* Set drb_id */ - *drb_id = lcid_drb_mappings[m].drbid; - break; - } - } - } else { - /* Look up setting gleaned from configuration protocol */ - if (!dynamic_lcid_drb_mapping[lcid].valid) { - return; - } - - *rlc_channel_type = dynamic_lcid_drb_mapping[lcid].channel_type; - - /* Set UM_seqnum_length */ - switch (*rlc_channel_type) { - case rlcUM5: - *UM_seqnum_length = 5; - break; - - case rlcUM10: - *UM_seqnum_length = 10; - break; - - default: - break; - } - - /* Set drb_id */ - *drb_id = dynamic_lcid_drb_mapping[lcid].drbid; - } -} - - - -#define MAX_HEADERS_IN_PDU 1024 - -/* UL-SCH and DL-SCH formats have much in common, so handle them in a common - function */ -static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - proto_item *pdu_ti, - volatile guint32 offset, guint8 direction, - mac_lte_info *p_mac_lte_info, mac_lte_tap_info *tap_info, - proto_item *retx_ti, - proto_tree *context_tree) -{ - guint8 extension; - volatile guint16 n; - proto_item *truncated_ti; - proto_item *padding_length_ti; - proto_item *hidden_root_ti; - - /* Keep track of LCIDs and lengths as we dissect the header */ - volatile guint16 number_of_headers = 0; - guint8 lcids[MAX_HEADERS_IN_PDU]; - gint16 pdu_lengths[MAX_HEADERS_IN_PDU]; - - proto_item *pdu_header_ti; - proto_tree *pdu_header_tree; - - gboolean have_seen_data_header = FALSE; - guint8 number_of_padding_subheaders = 0; - gboolean have_seen_non_padding_control = FALSE; - gboolean have_seen_bsr = FALSE; - gboolean expecting_body_data = FALSE; - volatile guint32 is_truncated = FALSE; - - /* Maintain/show UEs/TTI count */ - tap_info->ueInTTI = count_ues_tti(p_mac_lte_info, pinfo); - show_ues_tti(pinfo, p_mac_lte_info, tvb, context_tree); - - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "%s: (SF=%u) UEId=%-3u ", - (direction == DIRECTION_UPLINK) ? "UL-SCH" : "DL-SCH", - p_mac_lte_info->subframeNumber, - p_mac_lte_info->ueid); - - tap_info->raw_length = p_mac_lte_info->length; - - /* For uplink frames, if this is logged as a resend, look for original tx */ - if (direction == DIRECTION_UPLINK) { - TrackReportedULHARQResend(pinfo, tvb, offset, tree, p_mac_lte_info, retx_ti); - } - - /* For uplink grants, update SR status. N.B. only newTx grant should stop SR */ - if ((direction == DIRECTION_UPLINK) && (p_mac_lte_info->reTxCount == 0) && - global_mac_lte_track_sr) { - - TrackSRInfo(SR_Grant, pinfo, tree, tvb, p_mac_lte_info, 0, NULL); - } - - /* Add hidden item to filter on */ - hidden_root_ti = proto_tree_add_string_format(tree, - (direction == DIRECTION_UPLINK) ? - hf_mac_lte_ulsch : - hf_mac_lte_dlsch, - tvb, offset, 0, - "", - "Hidden header"); - PROTO_ITEM_SET_HIDDEN(hidden_root_ti); - - /* Add PDU block header subtree */ - pdu_header_ti = proto_tree_add_string_format(tree, - (direction == DIRECTION_UPLINK) ? - hf_mac_lte_ulsch_header : - hf_mac_lte_dlsch_header, - tvb, offset, 0, - "", - "MAC PDU Header"); - pdu_header_tree = proto_item_add_subtree(pdu_header_ti, - (direction == DIRECTION_UPLINK) ? - ett_mac_lte_ulsch_header : - ett_mac_lte_dlsch_header); - - - /************************************************************************/ - /* Dissect each sub-header. */ - do { - guint8 reserved; - guint64 length = 0; - proto_item *pdu_subheader_ti; - proto_tree *pdu_subheader_tree; - proto_item *lcid_ti; - proto_item *ti; - gint offset_start_subheader = offset; - guint8 first_byte = tvb_get_guint8(tvb, offset); - - /* Add PDU block header subtree. - Default with length of 1 byte. */ - pdu_subheader_ti = proto_tree_add_string_format(pdu_header_tree, - hf_mac_lte_sch_subheader, - tvb, offset, 1, - "", - "Sub-header"); - pdu_subheader_tree = proto_item_add_subtree(pdu_subheader_ti, - ett_mac_lte_sch_subheader); - - /* Check 1st 2 reserved bits */ - reserved = (first_byte & 0xc0) >> 6; - ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_sch_reserved, - tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "%cL-SCH header Reserved bits not zero", - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? 'U' : 'D'); - } - - /* Extended bit */ - extension = (first_byte & 0x20) >> 5; - proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_sch_extended, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* LCID. Has different meaning depending upon direction. */ - lcids[number_of_headers] = first_byte & 0x1f; - - if (direction == DIRECTION_UPLINK) { - - lcid_ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_ulsch_lcid, - tvb, offset, 1, ENC_BIG_ENDIAN); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "(%s", - val_to_str_const(lcids[number_of_headers], - ulsch_lcid_vals, "(Unknown LCID)")); - } else { - /* Downlink */ - lcid_ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_dlsch_lcid, - tvb, offset, 1, ENC_BIG_ENDIAN); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "(%s", - val_to_str_const(lcids[number_of_headers], - dlsch_lcid_vals, "(Unknown LCID)")); - - if (lcids[number_of_headers] == DRX_COMMAND_LCID) { - expert_add_info_format(pinfo, lcid_ti, PI_SEQUENCE, PI_NOTE, - "DRX command received for UE %u (RNTI %u)", - p_mac_lte_info->ueid, p_mac_lte_info->rnti); - } - } - - offset++; - - /* Remember if we've seen a data subheader */ - if (lcids[number_of_headers] <= 10) { - have_seen_data_header = TRUE; - expecting_body_data = TRUE; - } - - /* Show an expert item if a contol subheader (except Padding) appears - *after* a data PDU */ - if (have_seen_data_header && - (lcids[number_of_headers] > 10) && (lcids[number_of_headers] != PADDING_LCID)) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_ERROR, - "%cL-SCH Control subheaders should not appear after data subheaders", - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? 'U' : 'D'); - return; - } - - /* Show an expert item if we're seeing more then one BSR in a frame */ - if ((direction == DIRECTION_UPLINK) && is_bsr_lcid(lcids[number_of_headers])) { - if (have_seen_bsr) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_ERROR, - "There shouldn't be > 1 BSR in a frame"); - return; - } - - have_seen_bsr = TRUE; - } - - /* Should not see padding after non-padding control... */ - if ((lcids[number_of_headers] > 10) && - (lcids[number_of_headers] == PADDING_LCID) && - extension) { - number_of_padding_subheaders++; - - if (number_of_padding_subheaders > 2) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_WARN, - "Should not see more than 2 padding subheaders in one frame"); - } - - if (have_seen_non_padding_control) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_ERROR, - "Padding should come before other control subheaders!"); - } - } - - /* Remember that we've seen non-padding control */ - if ((lcids[number_of_headers] > 10) && - (lcids[number_of_headers] != PADDING_LCID)) { - have_seen_non_padding_control = TRUE; - } - - - - /********************************************************************/ - /* Length field follows if not the last header or for a fixed-sized - control element */ - if (!extension) { - /* Last one... */ - if (is_fixed_sized_control_element(lcids[number_of_headers], direction)) { - pdu_lengths[number_of_headers] = 0; - } else { - pdu_lengths[number_of_headers] = -1; - } - } else { - /* Not the last one */ - if (!is_fixed_sized_control_element(lcids[number_of_headers], direction) && - (lcids[number_of_headers] != PADDING_LCID)) { - - guint8 format; - - /* F(ormat) bit tells us how long the length field is */ - format = (tvb_get_guint8(tvb, offset) & 0x80) >> 7; - proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_sch_format, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* Now read length field itself */ - if (format) { - /* >= 128 - use 15 bits */ - proto_tree_add_bits_ret_val(pdu_subheader_tree, hf_mac_lte_sch_length, - tvb, offset*8 + 1, 15, &length, ENC_BIG_ENDIAN); - - offset += 2; - } else { - /* Less than 128 - only 7 bits */ - proto_tree_add_bits_ret_val(pdu_subheader_tree, hf_mac_lte_sch_length, - tvb, offset*8 + 1, 7, &length, ENC_BIG_ENDIAN); - offset++; - } - - pdu_lengths[number_of_headers] = (gint16)length; - } else { - pdu_lengths[number_of_headers] = 0; - } - } - - - /* Close off description in info column */ - switch (pdu_lengths[number_of_headers]) { - case 0: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ") "); - break; - - case -1: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ":remainder) "); - break; - - default: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ":%u bytes) ", - pdu_lengths[number_of_headers]); - break; - } - - /* Append summary to subheader root */ - proto_item_append_text(pdu_subheader_ti, " (lcid=%s", - val_to_str_const(lcids[number_of_headers], - (direction == DIRECTION_UPLINK) ? - ulsch_lcid_vals : - dlsch_lcid_vals, - "Unknown")); - - switch (pdu_lengths[number_of_headers]) { - case -1: - proto_item_append_text(pdu_subheader_ti, ", length is remainder)"); - proto_item_append_text(pdu_header_ti, " (%s:remainder)", - val_to_str_const(lcids[number_of_headers], - (direction == DIRECTION_UPLINK) ? ulsch_lcid_vals : dlsch_lcid_vals, - "Unknown")); - break; - - case 0: - proto_item_append_text(pdu_subheader_ti, ")"); - proto_item_append_text(pdu_header_ti, " (%s)", - val_to_str_const(lcids[number_of_headers], - (direction == DIRECTION_UPLINK) ? ulsch_lcid_vals : dlsch_lcid_vals, - "Unknown")); - break; - - default: - proto_item_append_text(pdu_subheader_ti, ", length=%u)", - pdu_lengths[number_of_headers]); - proto_item_append_text(pdu_header_ti, " (%s:%u)", - val_to_str_const(lcids[number_of_headers], - (direction == DIRECTION_UPLINK) ? ulsch_lcid_vals : dlsch_lcid_vals, - "Unknown"), - pdu_lengths[number_of_headers]); - break; - } - - - /* Flag unknown lcid values in expert info */ - if (match_strval(lcids[number_of_headers], - (direction == DIRECTION_UPLINK) ? ulsch_lcid_vals : dlsch_lcid_vals) == NULL) { - expert_add_info_format(pinfo, pdu_subheader_ti, PI_MALFORMED, PI_ERROR, - "%cL-SCH: Unexpected LCID received (%u)", - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? 'U' : 'D', - lcids[number_of_headers]); - } - - /* Set length of this subheader */ - proto_item_set_len(pdu_subheader_ti, offset - offset_start_subheader); - - number_of_headers++; - } while ((number_of_headers < MAX_HEADERS_IN_PDU) && extension); - - /* Check that we didn't reach the end of the subheader array... */ - if (number_of_headers >= MAX_HEADERS_IN_PDU) { - proto_item *ti = proto_tree_add_text(tree, tvb, offset, 1, - "Reached %u subheaders - frame obviously malformed", - MAX_HEADERS_IN_PDU); - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Reached %u subheaders - frame obviously malformed", - MAX_HEADERS_IN_PDU); - return; - } - - - /* Append summary to overall PDU header root */ - proto_item_append_text(pdu_header_ti, " [%u subheaders]", - number_of_headers); - - /* And set its length to offset */ - proto_item_set_len(pdu_header_ti, offset); - - - /* For DL, see if this is a retx. Use whole PDU present (i.e. ignore padding if not logged) */ - if (direction == DIRECTION_DOWNLINK) { - /* Result will be added to context tree */ - TrackReportedDLHARQResend(pinfo, tvb, tvb_length_remaining(tvb, 0), context_tree, p_mac_lte_info); - - tap_info->isPHYRetx = (p_mac_lte_info->dl_retx == dl_retx_yes); - } - - - /************************************************************************/ - /* Dissect SDUs / control elements / padding. */ - /************************************************************************/ - - /* Dissect control element bodies first */ - - for (n=0; n < number_of_headers; n++) { - /* Get out of loop once see any data SDU subheaders */ - if (lcids[n] <= 10) { - break; - } - - /* Process what should be a valid control PDU type */ - if (direction == DIRECTION_DOWNLINK) { - - /****************************/ - /* DL-SCH Control PDUs */ - switch (lcids[n]) { - case ACTIVATION_DEACTIVATION_LCID: { - proto_item *ad_ti; - proto_tree *ad_tree; - proto_item *ti; - guint8 reserved; - - /* Create AD root */ - ad_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_activation_deactivation, - tvb, offset, 1, - "", - "Activation/Deactivation"); - ad_tree = proto_item_add_subtree(ad_ti, ett_mac_lte_activation_deactivation); - - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c7, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c6, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c5, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c4, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c3, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c2, - tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_c1, - tvb, offset, 1, ENC_BIG_ENDIAN); - ti = proto_tree_add_item(ad_tree, hf_mac_lte_control_activation_deactivation_reserved, - tvb, offset, 1, ENC_BIG_ENDIAN); - reserved = tvb_get_guint8(tvb, offset) & 0x01; - - if (reserved != 0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Activation/Deactivation Reserved bit not zero"); - } - - offset++; - } - break; - - case UE_CONTENTION_RESOLUTION_IDENTITY_LCID: { - proto_item *cr_ti; - proto_tree *cr_tree; - proto_item *ti; - ContentionResolutionResult *crResult; - - /* Create CR root */ - cr_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_ue_contention_resolution, - tvb, offset, 6, - "", - "Contention Resolution"); - cr_tree = proto_item_add_subtree(cr_ti, ett_mac_lte_contention_resolution); - - - proto_tree_add_item(cr_tree, hf_mac_lte_control_ue_contention_resolution_identity, - tvb, offset, 6, ENC_NA); - - /* Get pointer to result struct for this frame */ - crResult = g_hash_table_lookup(mac_lte_cr_result_hash, GUINT_TO_POINTER(pinfo->fd->num)); - - if (crResult == NULL) { - - /* Need to set result by looking for and comparing with Msg3 */ - Msg3Data *msg3Data; - guint msg3Key = p_mac_lte_info->rnti; - - /* Allocate result and add it to the table */ - crResult = se_alloc(sizeof(ContentionResolutionResult)); - g_hash_table_insert(mac_lte_cr_result_hash, GUINT_TO_POINTER(pinfo->fd->num), crResult); - - /* Look for Msg3 */ - msg3Data = g_hash_table_lookup(mac_lte_msg3_hash, GUINT_TO_POINTER(msg3Key)); - - /* Compare CCCH bytes */ - if (msg3Data != NULL) { - crResult->msSinceMsg3 = (guint32)(((pinfo->fd->abs_ts.secs - msg3Data->msg3Time.secs) * 1000) + - ((pinfo->fd->abs_ts.nsecs - msg3Data->msg3Time.nsecs) / 1000000)); - crResult->msg3FrameNum = msg3Data->framenum; - - /* Compare the 6 bytes */ - if (tvb_memeql(tvb, offset, msg3Data->data, 6) == 0) { - crResult->status = Msg3Match; - } else { - crResult->status = Msg3NoMatch; - } - } else { - crResult->status = NoMsg3; - } - } - - /* Now show CR result in tree */ - switch (crResult->status) { - case NoMsg3: - proto_item_append_text(cr_ti, " (no corresponding Msg3 found!)"); - break; - - case Msg3Match: - ti = proto_tree_add_uint(cr_tree, hf_mac_lte_control_ue_contention_resolution_msg3, - tvb, 0, 0, crResult->msg3FrameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(cr_tree, hf_mac_lte_control_ue_contention_resolution_time_since_msg3, - tvb, 0, 0, crResult->msSinceMsg3); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_boolean(cr_tree, hf_mac_lte_control_ue_contention_resolution_msg3_matched, - tvb, 0, 0, TRUE); - PROTO_ITEM_SET_GENERATED(ti); - proto_item_append_text(cr_ti, " (matches Msg3 from frame %u, %ums ago)", - crResult->msg3FrameNum, crResult->msSinceMsg3); - break; - - case Msg3NoMatch: - ti = proto_tree_add_uint(cr_tree, hf_mac_lte_control_ue_contention_resolution_msg3, - tvb, 0, 0, crResult->msg3FrameNum); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_uint(cr_tree, hf_mac_lte_control_ue_contention_resolution_time_since_msg3, - tvb, 0, 0, crResult->msSinceMsg3); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_boolean(cr_tree, hf_mac_lte_control_ue_contention_resolution_msg3_matched, - tvb, 0, 0, FALSE); - expert_add_info_format(pinfo, ti, PI_SEQUENCE, PI_WARN, - "CR body in Msg4 doesn't match Msg3 CCCH in frame %u", - crResult->msg3FrameNum); - PROTO_ITEM_SET_GENERATED(ti); - proto_item_append_text(cr_ti, " (doesn't match Msg3 from frame %u, %u ago)", - crResult->msg3FrameNum, crResult->msSinceMsg3); - break; - }; - - offset += 6; - } - break; - - case TIMING_ADVANCE_LCID: { - proto_item *ta_ti; - proto_item *reserved_ti; - guint8 reserved; - guint8 ta_value; - - /* Check 2 reserved bits */ - reserved = (tvb_get_guint8(tvb, offset) & 0xc0) >> 6; - reserved_ti = proto_tree_add_item(tree, hf_mac_lte_control_timing_advance_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, reserved_ti, PI_MALFORMED, PI_ERROR, - "Timing Advance Reserved bits not zero (found 0x%x)", reserved); - } - - /* TA value */ - ta_value = tvb_get_guint8(tvb, offset) & 0x3f; - ta_ti = proto_tree_add_item(tree, hf_mac_lte_control_timing_advance, - tvb, offset, 1, ENC_BIG_ENDIAN); - - if (ta_value == 31) { - expert_add_info_format(pinfo, ta_ti, PI_SEQUENCE, - PI_NOTE, - "Timing Advance control element received (no correction needed)"); - } else { - expert_add_info_format(pinfo, ta_ti, PI_SEQUENCE, - PI_WARN, - "Timing Advance control element received (%u) %s correction needed", - ta_value, - (ta_value < 31) ? "-ve" : "+ve"); - } - - offset++; - } - break; - - case DRX_COMMAND_LCID: - /* No payload */ - break; - - case PADDING_LCID: - /* No payload (in this position) */ - tap_info->padding_bytes++; - break; - - default: - break; - } - } else { - - /**********************************/ - /* UL-SCH Control PDUs */ - switch (lcids[n]) { - case EXTENDED_POWER_HEADROOM_REPORT_LCID: { - proto_item *ephr_ti; - proto_tree *ephr_tree; - proto_item *ti; - proto_tree *ephr_cell_tree; - proto_item *ephr_cell_ti; - guint8 scell_bitmap; - guint8 scell_count; - guint8 byte; - guint i; - guint32 curr_offset = offset; - guint32 computed_header_offset; - - if (pdu_lengths[n] == -1) { - /* Control Element size is the remaining PDU */ - pdu_lengths[n] = (gint16)tvb_length_remaining(tvb, curr_offset); - } - - /* Create EPHR root */ - ephr_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_ext_power_headroom, - tvb, curr_offset, pdu_lengths[n], - "", - "Extended Power Headroom"); - ephr_tree = proto_item_add_subtree(ephr_ti, ett_mac_lte_extended_power_headroom); - - scell_bitmap = tvb_get_guint8(tvb, curr_offset); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c7, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c6, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c5, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c4, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c3, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c2, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_c1, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - /* Check Reserved bit */ - ti = proto_tree_add_item(ephr_tree, hf_mac_lte_control_ext_power_headroom_reserved, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - - if (scell_bitmap & 0x01) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Extended Power Headroom Reserved bit not zero"); - } - - curr_offset++; - - /* Compute expected header size to deduce if PH Type 2 report is present or not */ - /* First count the number of SCells */ - for (i = 0, scell_count = 0; i < 7; i++) { - if (scell_bitmap & (0x80>>i)) { - scell_count++; - } - } - - /* Now quickly parse the header */ - computed_header_offset = curr_offset; - - for (i = 0; i < scell_count; i++) { - if (tvb_get_guint8(tvb, computed_header_offset) & 0x80) { - computed_header_offset++; - } - - computed_header_offset++; - } - - if ((gint16)(computed_header_offset + 1 - curr_offset) != pdu_lengths[n]) { - /* PH Type 2 is present */ - if (tvb_get_guint8(tvb, computed_header_offset) & 0x80) { - computed_header_offset++; - } - - computed_header_offset++; - - if ((gint16)(computed_header_offset + 1 - curr_offset) != pdu_lengths[n]) { - expert_add_info_format(pinfo, ephr_ti, PI_MALFORMED, PI_ERROR, - "Control Element has an unexpected size (computed=%d, actual=%d)", - computed_header_offset + 1 - curr_offset, pdu_lengths[n]); - offset += pdu_lengths[n]; - break; - } - - byte = tvb_get_guint8(tvb, curr_offset); - ephr_cell_ti = proto_tree_add_text(ephr_tree, tvb, curr_offset, ((byte&0x80)?2:1), "PCell"); - ephr_cell_tree = proto_item_add_subtree(ephr_cell_ti, ett_mac_lte_extended_power_headroom_cell); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_power_backoff, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_value, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_level, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(ephr_cell_ti, " (%s)", - val_to_str_ext_const((byte&0x3f), &power_headroom_vals_ext, "Unknown")); - curr_offset++; - - if (byte & 0x80) { - /* Pcmax,c field is present */ - byte = tvb_get_guint8(tvb, curr_offset); - /* Check 2 Reserved bits */ - ti = proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_reserved2, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - - if (byte & 0xc0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Extended Power Headroom Reserved bits not zero (found 0x%x)", - (byte & 0xc0) >> 6); - } - - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_pcmaxc, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(ephr_cell_ti, " (%s)", - val_to_str_ext_const((byte&0x3f), &pcmaxc_vals_ext, "Unknown")); - curr_offset++; - } - } else { - if ((gint16)(computed_header_offset + 1 - curr_offset) != pdu_lengths[n]) { - expert_add_info_format(pinfo, ephr_ti, PI_MALFORMED, PI_ERROR, - "Control Element has an unexpected size (computed=%d, actual=%d)", - computed_header_offset + 1 - curr_offset, pdu_lengths[n]); - offset += pdu_lengths[n]; - break; - } - } - - for (i = 1, scell_bitmap>>=1; i <= 7; i++, scell_bitmap>>=1) { - if (scell_bitmap & 0x01) { - byte = tvb_get_guint8(tvb, curr_offset); - ephr_cell_ti = proto_tree_add_text(ephr_tree, tvb, curr_offset, ((byte&0x80)?2:1), "SCell Index %u", i); - ephr_cell_tree = proto_item_add_subtree(ephr_cell_ti, ett_mac_lte_extended_power_headroom_cell); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_power_backoff, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_value, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_level, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(ephr_cell_ti, " (%s)", - val_to_str_ext_const((byte&0x3f), &power_headroom_vals_ext, "Unknown")); - curr_offset++; - - if (byte & 0x80) { - /* Pcmax,c field is present */ - byte = tvb_get_guint8(tvb, curr_offset); - /* Check 2 Reserved bits */ - ti = proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_reserved2, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - - if (byte & 0xc0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Extended Power Headroom Reserved bits not zero (found 0x%x)", - (byte & 0xc0) >> 6); - } - - proto_tree_add_item(ephr_cell_tree, hf_mac_lte_control_ext_power_headroom_pcmaxc, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - proto_item_append_text(ephr_cell_ti, " (%s)", - val_to_str_ext_const((byte&0x3f), &pcmaxc_vals_ext, "Unknown")); - curr_offset++; - } - } - } - - offset += pdu_lengths[n]; - } - break; - - case POWER_HEADROOM_REPORT_LCID: { - proto_item *phr_ti; - proto_tree *phr_tree; - proto_item *ti; - guint8 reserved; - guint8 level; - - /* Create PHR root */ - phr_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_power_headroom, - tvb, offset, 1, - "", - "Power Headroom"); - phr_tree = proto_item_add_subtree(phr_ti, ett_mac_lte_power_headroom); - - /* Check 2 Reserved bits */ - reserved = (tvb_get_guint8(tvb, offset) & 0xc0) >> 6; - ti = proto_tree_add_item(phr_tree, hf_mac_lte_control_power_headroom_reserved, - tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Power Headroom Reserved bits not zero (found 0x%x)", reserved); - } - - /* Level */ - level = tvb_get_guint8(tvb, offset) & 0x3f; - proto_tree_add_item(phr_tree, hf_mac_lte_control_power_headroom_level, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* Show value in root label */ - proto_item_append_text(phr_ti, " (%s)", - val_to_str_ext_const(level, &power_headroom_vals_ext, "Unknown")); - offset++; - } - - - break; - - case CRNTI_LCID: - proto_tree_add_item(tree, hf_mac_lte_control_crnti, - tvb, offset, 2, ENC_BIG_ENDIAN); - offset += 2; - break; - - case TRUNCATED_BSR_LCID: - case SHORT_BSR_LCID: { - proto_tree *bsr_tree; - proto_item *bsr_ti; - proto_item *buffer_size_ti; - guint8 lcgid; - guint8 buffer_size; - int hfindex; - value_string_ext *p_vs_ext; - - if (p_mac_lte_info->isExtendedBSRSizes) { - hfindex = hf_mac_lte_control_short_ext_bsr_buffer_size; - p_vs_ext = &ext_buffer_size_vals_ext; - } else { - hfindex = hf_mac_lte_control_short_bsr_buffer_size; - p_vs_ext = &buffer_size_vals_ext; - } - - bsr_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_bsr, - tvb, offset, 1, - "", - "Short BSR"); - bsr_tree = proto_item_add_subtree(bsr_ti, ett_mac_lte_bsr); - - /* LCG ID */ - lcgid = (tvb_get_guint8(tvb, offset) & 0xc0) >> 6; - proto_tree_add_item(bsr_tree, hf_mac_lte_control_bsr_lcg_id, - tvb, offset, 1, ENC_BIG_ENDIAN); - /* Buffer Size */ - buffer_size = tvb_get_guint8(tvb, offset) & 0x3f; - buffer_size_ti = proto_tree_add_item(bsr_tree, hfindex, - tvb, offset, 1, ENC_BIG_ENDIAN); - offset++; - - if (buffer_size >= global_mac_lte_bsr_warn_threshold) { - expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, - "UE %u - BSR for LCG %u exceeds threshold: %u (%s)", - p_mac_lte_info->ueid, - lcgid, - buffer_size, - val_to_str_ext_const(buffer_size, p_vs_ext, "Unknown")); - } - - - proto_item_append_text(bsr_ti, " (lcgid=%u %s)", - lcgid, - val_to_str_ext_const(buffer_size, &buffer_size_vals_ext, "Unknown")); - } - break; - - case LONG_BSR_LCID: { - proto_tree *bsr_tree; - proto_item *bsr_ti; - proto_item *buffer_size_ti; - guint8 buffer_size[4]; - int hfindex[4]; - value_string_ext *p_vs_ext; - - if (p_mac_lte_info->isExtendedBSRSizes) { - hfindex[0] = hf_mac_lte_control_long_ext_bsr_buffer_size_0; - hfindex[1] = hf_mac_lte_control_long_ext_bsr_buffer_size_1; - hfindex[2] = hf_mac_lte_control_long_ext_bsr_buffer_size_2; - hfindex[3] = hf_mac_lte_control_long_ext_bsr_buffer_size_3; - p_vs_ext = &ext_buffer_size_vals_ext; - } else { - hfindex[0] = hf_mac_lte_control_long_bsr_buffer_size_0; - hfindex[1] = hf_mac_lte_control_long_bsr_buffer_size_1; - hfindex[2] = hf_mac_lte_control_long_bsr_buffer_size_2; - hfindex[3] = hf_mac_lte_control_long_bsr_buffer_size_3; - p_vs_ext = &buffer_size_vals_ext; - } - - bsr_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_bsr, - tvb, offset, 3, - "", - "Long BSR"); - bsr_tree = proto_item_add_subtree(bsr_ti, ett_mac_lte_bsr); - - /* LCID Group 0 */ - buffer_size_ti = proto_tree_add_item(bsr_tree, hfindex[0], - tvb, offset, 1, ENC_BIG_ENDIAN); - buffer_size[0] = (tvb_get_guint8(tvb, offset) & 0xfc) >> 2; - - if (buffer_size[0] >= global_mac_lte_bsr_warn_threshold) { - expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, - "UE %u - BSR for LCG 0 exceeds threshold: %u (%s)", - p_mac_lte_info->ueid, - buffer_size[0], - val_to_str_ext_const(buffer_size[0], p_vs_ext, "Unknown")); - } - - /* LCID Group 1 */ - buffer_size_ti = proto_tree_add_item(bsr_tree, hfindex[1], - tvb, offset, 2, ENC_BIG_ENDIAN); - buffer_size[1] = ((tvb_get_guint8(tvb, offset) & 0x03) << 4) | ((tvb_get_guint8(tvb, offset+1) & 0xf0) >> 4); - offset++; - - if (buffer_size[1] >= global_mac_lte_bsr_warn_threshold) { - expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, - "UE %u - BSR for LCG 1 exceeds threshold: %u (%s)", - p_mac_lte_info->ueid, - buffer_size[1], - val_to_str_ext_const(buffer_size[1], p_vs_ext, "Unknown")); - } - - /* LCID Group 2 */ - buffer_size_ti = proto_tree_add_item(bsr_tree, hfindex[2], - tvb, offset, 2, ENC_BIG_ENDIAN); - - buffer_size[2] = ((tvb_get_guint8(tvb, offset) & 0x0f) << 2) | ((tvb_get_guint8(tvb, offset+1) & 0xc0) >> 6); - offset++; - - if (buffer_size[2] >= global_mac_lte_bsr_warn_threshold) { - expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, - "UE %u - BSR for LCG 2 exceeds threshold: %u (%s)", - p_mac_lte_info->ueid, - buffer_size[2], - val_to_str_ext_const(buffer_size[2], p_vs_ext, "Unknown")); - } - - /* LCID Group 3 */ - buffer_size_ti = proto_tree_add_item(bsr_tree, hfindex[3], - tvb, offset, 1, ENC_BIG_ENDIAN); - buffer_size[3] = tvb_get_guint8(tvb, offset) & 0x3f; - offset++; - - if (buffer_size[3] >= global_mac_lte_bsr_warn_threshold) { - expert_add_info_format(pinfo, buffer_size_ti, PI_SEQUENCE, PI_WARN, - "UE %u - BSR for LCG 3 exceeds threshold: %u (%s)", - p_mac_lte_info->ueid, - buffer_size[3], - val_to_str_ext_const(buffer_size[3], p_vs_ext, "Unknown")); - } - - /* Append summary to parent */ - proto_item_append_text(bsr_ti, " 0:(%s) 1:(%s) 2:(%s) 3:(%s)", - val_to_str_ext_const(buffer_size[0], p_vs_ext, "Unknown"), - val_to_str_ext_const(buffer_size[1], p_vs_ext, "Unknown"), - val_to_str_ext_const(buffer_size[2], p_vs_ext, "Unknown"), - val_to_str_ext_const(buffer_size[3], p_vs_ext, "Unknown")); - } - break; - - case PADDING_LCID: - /* No payload, in this position */ - tap_info->padding_bytes++; - break; - - default: - break; - } - } - } - - /* There might not be any data, if only headers (plus control data) were logged */ - is_truncated = ((tvb_length_remaining(tvb, offset) == 0) && expecting_body_data); - truncated_ti = proto_tree_add_uint(tree, hf_mac_lte_sch_header_only, tvb, 0, 0, - is_truncated); - - if (is_truncated) { - PROTO_ITEM_SET_GENERATED(truncated_ti); - expert_add_info_format(pinfo, truncated_ti, PI_SEQUENCE, PI_NOTE, - "MAC PDU SDUs have been omitted"); - return; - } else { - PROTO_ITEM_SET_HIDDEN(truncated_ti); - } - - - /* Now process remaining bodies, which should all be data */ - for (; n < number_of_headers; n++) { - - /* Data SDUs treated identically for Uplink or downlink channels */ - proto_item *sdu_ti; - const guint8 *pdu_data; - volatile guint16 data_length; - int i; - char buff[64]; - - /* Break out if meet padding */ - if (lcids[n] == PADDING_LCID) { - break; - } - - /* Work out length */ - data_length = (pdu_lengths[n] == -1) ? - tvb_length_remaining(tvb, offset) : - pdu_lengths[n]; - - /* Dissect SDU as raw bytes */ - sdu_ti = proto_tree_add_bytes_format(tree, hf_mac_lte_sch_sdu, tvb, offset, pdu_lengths[n], - NULL, "SDU (%s, length=%u bytes): ", - val_to_str_const(lcids[n], - (direction == DIRECTION_UPLINK) ? - ulsch_lcid_vals : - dlsch_lcid_vals, - "Unknown"), - data_length); - /* Show bytes too. There must be a nicer way of doing this! */ - pdu_data = tvb_get_ptr(tvb, offset, pdu_lengths[n]); - - for (i=0; i < data_length; i++) { - g_snprintf(buff+(i*2), 3, "%02x", pdu_data[i]); - - if (i >= 30) { - g_snprintf(buff+(i*2), 4, "..."); - break; - } - } - - proto_item_append_text(sdu_ti, "%s", buff); - - - /* Look for Msg3 data so that it may be compared with later - Contention Resolution body */ - if ((lcids[n] == 0) && (direction == DIRECTION_UPLINK) && (data_length == 6)) { - if (!pinfo->fd->flags.visited) { - guint key = p_mac_lte_info->rnti; - Msg3Data *data = g_hash_table_lookup(mac_lte_msg3_hash, GUINT_TO_POINTER(key)); - - /* Look for previous entry for this UE */ - if (data == NULL) { - /* Allocate space for data and add to table */ - data = se_alloc(sizeof(Msg3Data)); - g_hash_table_insert(mac_lte_msg3_hash, GUINT_TO_POINTER(key), data); - } - - /* Fill in data details */ - data->framenum = pinfo->fd->num; - tvb_memcpy(tvb, data->data, offset, data_length); - data->msg3Time = pinfo->fd->abs_ts; - } - } - - /* CCCH frames can be dissected directly by LTE RRC... */ - if ((lcids[n] == 0) && global_mac_lte_attempt_rrc_decode) { - tvbuff_t *rrc_tvb = tvb_new_subset(tvb, offset, data_length, data_length); - - /* Get appropriate dissector handle */ - volatile dissector_handle_t protocol_handle = 0; - - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - protocol_handle = find_dissector("lte_rrc.ul_ccch"); - } else { - protocol_handle = find_dissector("lte_rrc.dl_ccch"); - } - - /* Hide raw view of bytes */ - PROTO_ITEM_SET_HIDDEN(sdu_ti); - - call_with_catch_all(protocol_handle, rrc_tvb, pinfo, tree); - } - - /* LCID 1 and 2 can be assumed to be srb1&2, so can dissect as RLC AM */ - else if ((lcids[n] == 1) || (lcids[n] == 2)) { - if (global_mac_lte_attempt_srb_decode) { - /* Call RLC dissector */ - call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, data_length, - RLC_AM_MODE, direction, p_mac_lte_info->ueid, - CHANNEL_TYPE_SRB, lcids[n], 0, - get_mac_lte_channel_priority(p_mac_lte_info->ueid, - lcids[n], direction)); - - /* Hide raw view of bytes */ - PROTO_ITEM_SET_HIDDEN(sdu_ti); - } - } - - else if ((lcids[n] >= 2) && (lcids[n] <= 10)) { - - /* Look for mapping for this LCID to drb channel set by UAT table */ - rlc_channel_type_t rlc_channel_type; - guint8 UM_seqnum_length; - gint drb_id; - guint8 priority = get_mac_lte_channel_priority(p_mac_lte_info->ueid, - lcids[n], direction); - - lookup_rlc_channel_from_lcid(lcids[n], - &rlc_channel_type, - &UM_seqnum_length, - &drb_id); - - /* Dissect according to channel type */ - switch (rlc_channel_type) { - case rlcUM5: - call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, data_length, - RLC_UM_MODE, direction, p_mac_lte_info->ueid, - CHANNEL_TYPE_DRB, (guint16)drb_id, UM_seqnum_length, - priority); - break; - - case rlcUM10: - call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, data_length, - RLC_UM_MODE, direction, p_mac_lte_info->ueid, - CHANNEL_TYPE_DRB, (guint16)drb_id, UM_seqnum_length, - priority); - break; - - case rlcAM: - call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, data_length, - RLC_AM_MODE, direction, p_mac_lte_info->ueid, - CHANNEL_TYPE_DRB, (guint16)drb_id, 0, - priority); - break; - - case rlcTM: - call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, data_length, - RLC_TM_MODE, direction, p_mac_lte_info->ueid, - CHANNEL_TYPE_DRB, (guint16)drb_id, 0, - priority); - break; - - case rlcRaw: - /* Nothing to do! */ - break; - } - - if (rlc_channel_type != rlcRaw) { - /* Hide raw view of bytes */ - PROTO_ITEM_SET_HIDDEN(sdu_ti); - } - - } - - offset += data_length; - - /* Update tap byte count for this channel */ - tap_info->bytes_for_lcid[lcids[n]] += data_length; - tap_info->sdus_for_lcid[lcids[n]]++; - } - - - /* Now padding, if present, extends to the end of the PDU */ - if (lcids[number_of_headers-1] == PADDING_LCID) { - if (tvb_length_remaining(tvb, offset) > 0) { - proto_tree_add_item(tree, hf_mac_lte_padding_data, - tvb, offset, -1, ENC_NA); - } - - padding_length_ti = proto_tree_add_int(tree, hf_mac_lte_padding_length, - tvb, offset, 0, - p_mac_lte_info->length - offset); - PROTO_ITEM_SET_GENERATED(padding_length_ti); - - /* Update padding bytes in stats */ - tap_info->padding_bytes += (p_mac_lte_info->length - offset); - - /* Make sure the PDU isn't bigger than reported! */ - if (offset > p_mac_lte_info->length) { - expert_add_info_format(pinfo, padding_length_ti, PI_MALFORMED, PI_ERROR, - "%s MAC PDU is longer than reported length (reported=%u, actual=%u)", - (direction == DIRECTION_UPLINK) ? "UL-SCH" : "DL-SCH", - p_mac_lte_info->length, offset); - } - } else { - /* There is no padding at the end of the frame */ - if (!is_truncated && (offset < p_mac_lte_info->length)) { - /* There is a problem if we haven't used all of the PDU */ - expert_add_info_format(pinfo, pdu_ti, PI_MALFORMED, PI_ERROR, - "%s PDU for UE %u is shorter than reported length (reported=%u, actual=%u)", - (direction == DIRECTION_UPLINK) ? "UL-SCH" : "DL-SCH", - p_mac_lte_info->ueid, p_mac_lte_info->length, offset); - } - - if (!is_truncated && (offset > p_mac_lte_info->length)) { - /* There is a problem if the PDU is longer than rpeported */ - expert_add_info_format(pinfo, pdu_ti, PI_MALFORMED, PI_ERROR, - "%s PDU for UE %u is longer than reported length (reported=%u, actual=%u)", - (direction == DIRECTION_UPLINK) ? "UL-SCH" : "DL-SCH", - p_mac_lte_info->ueid, p_mac_lte_info->length, offset); - } - } -} - -static void dissect_mch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *pdu_ti, - volatile guint32 offset, mac_lte_info *p_mac_lte_info) -{ - guint8 extension; - volatile guint16 n; - proto_item *truncated_ti; - proto_item *padding_length_ti; - proto_item *hidden_root_ti; - - /* Keep track of LCIDs and lengths as we dissect the header */ - volatile guint16 number_of_headers = 0; - guint8 lcids[MAX_HEADERS_IN_PDU]; - gint16 pdu_lengths[MAX_HEADERS_IN_PDU]; - - proto_item *pdu_header_ti; - proto_tree *pdu_header_tree; - - gboolean have_seen_data_header = FALSE; - guint8 number_of_padding_subheaders = 0; - gboolean have_seen_non_padding_control = FALSE; - gboolean expecting_body_data = FALSE; - volatile guint32 is_truncated = FALSE; - - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "MCH: ", - p_mac_lte_info->subframeNumber); - - /* Add hidden item to filter on */ - hidden_root_ti = proto_tree_add_string_format(tree, hf_mac_lte_mch, tvb, - offset, 0, "", "Hidden header"); - PROTO_ITEM_SET_HIDDEN(hidden_root_ti); - - /* Add PDU block header subtree */ - pdu_header_ti = proto_tree_add_string_format(tree, hf_mac_lte_mch_header, - tvb, offset, 0, - "", - "MAC PDU Header"); - pdu_header_tree = proto_item_add_subtree(pdu_header_ti, ett_mac_lte_mch_header); - - - /************************************************************************/ - /* Dissect each sub-header. */ - do { - guint8 reserved; - guint64 length = 0; - proto_item *pdu_subheader_ti; - proto_tree *pdu_subheader_tree; - proto_item *lcid_ti; - proto_item *ti; - gint offset_start_subheader = offset; - guint8 first_byte = tvb_get_guint8(tvb, offset); - - /* Add PDU block header subtree. - Default with length of 1 byte. */ - pdu_subheader_ti = proto_tree_add_string_format(pdu_header_tree, - hf_mac_lte_mch_subheader, - tvb, offset, 1, - "", - "Sub-header"); - pdu_subheader_tree = proto_item_add_subtree(pdu_subheader_ti, - ett_mac_lte_mch_subheader); - - /* Check 1st 2 reserved bits */ - reserved = (first_byte & 0xc0) >> 6; - ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_mch_reserved, - tvb, offset, 1, ENC_BIG_ENDIAN); - - if (reserved != 0) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "MCH header Reserved bits not zero"); - } - - /* Extended bit */ - extension = (first_byte & 0x20) >> 5; - proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_mch_extended, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* LCID */ - lcids[number_of_headers] = first_byte & 0x1f; - lcid_ti = proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_mch_lcid, - tvb, offset, 1, ENC_BIG_ENDIAN); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "(%s", - val_to_str_const(lcids[number_of_headers], - mch_lcid_vals, "(Unknown LCID)")); - offset++; - - /* Remember if we've seen a data subheader */ - if (lcids[number_of_headers] <= 28) { - have_seen_data_header = TRUE; - expecting_body_data = TRUE; - } - - /* Show an expert item if a contol subheader (except Padding) appears - *after* a data PDU */ - if (have_seen_data_header && - (lcids[number_of_headers] > 28) && (lcids[number_of_headers] != PADDING_LCID)) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_ERROR, - "MCH Control subheaders should not appear after data subheaders"); - return; - } - - /* Should not see padding after non-padding control... */ - if ((lcids[number_of_headers] > 28) && - (lcids[number_of_headers] == PADDING_LCID) && - extension) { - number_of_padding_subheaders++; - - if (number_of_padding_subheaders > 2) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_WARN, - "Should not see more than 2 padding subheaders in one frame"); - } - - if (have_seen_non_padding_control) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_ERROR, - "Padding should come before other control subheaders!"); - } - } - - /* Remember that we've seen non-padding control */ - if ((lcids[number_of_headers] > 28) && - (lcids[number_of_headers] != PADDING_LCID)) { - have_seen_non_padding_control = TRUE; - } - - - - /********************************************************************/ - /* Length field follows if not the last header or for a fixed-sized - control element */ - if (!extension) { - /* Last one... */ - pdu_lengths[number_of_headers] = -1; - } else { - /* Not the last one */ - if (lcids[number_of_headers] != PADDING_LCID) { - - guint8 format; - - /* F(ormat) bit tells us how long the length field is */ - format = (tvb_get_guint8(tvb, offset) & 0x80) >> 7; - proto_tree_add_item(pdu_subheader_tree, hf_mac_lte_mch_format, - tvb, offset, 1, ENC_BIG_ENDIAN); - - /* Now read length field itself */ - if (format) { - /* >= 128 - use 15 bits */ - proto_tree_add_bits_ret_val(pdu_subheader_tree, hf_mac_lte_mch_length, - tvb, offset*8 + 1, 15, &length, ENC_BIG_ENDIAN); - - offset += 2; - } else { - /* Less than 128 - only 7 bits */ - proto_tree_add_bits_ret_val(pdu_subheader_tree, hf_mac_lte_mch_length, - tvb, offset*8 + 1, 7, &length, ENC_BIG_ENDIAN); - offset++; - } - - if ((lcids[number_of_headers] == MCH_SCHEDULING_INFO_LCID) && (length & 0x01)) { - expert_add_info_format(pinfo, lcid_ti, PI_MALFORMED, PI_WARN, - "MCH Scheduling Information MAC Control Element should have an even size"); - } - - pdu_lengths[number_of_headers] = (gint16)length; - } else { - pdu_lengths[number_of_headers] = 0; - } - } - - - /* Close off description in info column */ - switch (pdu_lengths[number_of_headers]) { - case 0: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ") "); - break; - - case -1: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ":remainder) "); - break; - - default: - write_pdu_label_and_info(pdu_ti, NULL, pinfo, ":%u bytes) ", - pdu_lengths[number_of_headers]); - break; - } - - /* Append summary to subheader root */ - proto_item_append_text(pdu_subheader_ti, " (lcid=%s", - val_to_str_const(lcids[number_of_headers], - mch_lcid_vals, "Unknown")); - - switch (pdu_lengths[number_of_headers]) { - case -1: - proto_item_append_text(pdu_subheader_ti, ", length is remainder)"); - proto_item_append_text(pdu_header_ti, " (%s:remainder)", - val_to_str_const(lcids[number_of_headers], - mch_lcid_vals, - "Unknown")); - break; - - case 0: - proto_item_append_text(pdu_subheader_ti, ")"); - proto_item_append_text(pdu_header_ti, " (%s)", - val_to_str_const(lcids[number_of_headers], - mch_lcid_vals, - "Unknown")); - break; - - default: - proto_item_append_text(pdu_subheader_ti, ", length=%u)", - pdu_lengths[number_of_headers]); - proto_item_append_text(pdu_header_ti, " (%s:%u)", - val_to_str_const(lcids[number_of_headers], - mch_lcid_vals, - "Unknown"), - pdu_lengths[number_of_headers]); - break; - } - - - /* Flag unknown lcid values in expert info */ - if (match_strval(lcids[number_of_headers],mch_lcid_vals) == NULL) { - expert_add_info_format(pinfo, pdu_subheader_ti, PI_MALFORMED, PI_ERROR, - "MCH: Unexpected LCID received (%u)", - lcids[number_of_headers]); - } - - /* Set length of this subheader */ - proto_item_set_len(pdu_subheader_ti, offset - offset_start_subheader); - - number_of_headers++; - } while ((number_of_headers < MAX_HEADERS_IN_PDU) && extension); - - /* Check that we didn't reach the end of the subheader array... */ - if (number_of_headers >= MAX_HEADERS_IN_PDU) { - proto_item *ti = proto_tree_add_text(tree, tvb, offset, 1, - "Reached %u subheaders - frame obviously malformed", - MAX_HEADERS_IN_PDU); - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Reached %u subheaders - frame obviously malformed", - MAX_HEADERS_IN_PDU); - return; - } - - - /* Append summary to overall PDU header root */ - proto_item_append_text(pdu_header_ti, " (%u subheaders)", - number_of_headers); - - /* And set its length to offset */ - proto_item_set_len(pdu_header_ti, offset); - - - /************************************************************************/ - /* Dissect SDUs / control elements / padding. */ - /************************************************************************/ - - /* Dissect control element bodies first */ - - for (n=0; n < number_of_headers; n++) { - /* Get out of loop once see any data SDU subheaders */ - if (lcids[n] <= 28) { - break; - } - - /* Process what should be a valid control PDU type */ - switch (lcids[n]) { - case MCH_SCHEDULING_INFO_LCID: { - guint32 curr_offset = offset; - gint16 i; - guint16 stop_mtch_val; - proto_item *mch_sched_info_ti, *ti; - proto_tree *mch_sched_info_tree; - - mch_sched_info_ti = proto_tree_add_string_format(tree, - hf_mac_lte_control_mch_scheduling_info, - tvb, curr_offset, pdu_lengths[n], - "", - "MCH Scheduling Information"); - mch_sched_info_tree = proto_item_add_subtree(mch_sched_info_ti, ett_mac_lte_mch_scheduling_info); - - for (i=0; i<(pdu_lengths[n]/2); i++) { - proto_tree_add_item(mch_sched_info_tree, hf_mac_lte_control_mch_scheduling_info_lcid, - tvb, curr_offset, 1, ENC_BIG_ENDIAN); - stop_mtch_val = tvb_get_ntohs(tvb, curr_offset) & 0x7ff; - ti = proto_tree_add_item(mch_sched_info_tree, hf_mac_lte_control_mch_scheduling_info_stop_mtch, - tvb, curr_offset, 2, ENC_BIG_ENDIAN); - - if ((stop_mtch_val >= 2043) && (stop_mtch_val <= 2046)) { - proto_item_append_text(ti, " (reserved)"); - } else if (stop_mtch_val == 2047) { - proto_item_append_text(ti, " (MTCH is not scheduled)"); - } - - curr_offset += 2; - } - - offset += pdu_lengths[n]; - } - break; - - case PADDING_LCID: - /* No payload (in this position) */ - break; - - default: - break; - } - } - - - /* There might not be any data, if only headers (plus control data) were logged */ - is_truncated = ((tvb_length_remaining(tvb, offset) == 0) && expecting_body_data); - truncated_ti = proto_tree_add_uint(tree, hf_mac_lte_mch_header_only, tvb, 0, 0, - is_truncated); - - if (is_truncated) { - PROTO_ITEM_SET_GENERATED(truncated_ti); - expert_add_info_format(pinfo, truncated_ti, PI_SEQUENCE, PI_NOTE, - "MAC PDU SDUs have been omitted"); - return; - } else { - PROTO_ITEM_SET_HIDDEN(truncated_ti); - } - - - /* Now process remaining bodies, which should all be data */ - for (; n < number_of_headers; n++) { - - proto_item *sdu_ti; - const guint8 *pdu_data; - volatile guint16 data_length; - int i; - char buff[64]; - - /* Break out if meet padding */ - if (lcids[n] == PADDING_LCID) { - break; - } - - /* Work out length */ - data_length = (pdu_lengths[n] == -1) ? - tvb_length_remaining(tvb, offset) : - pdu_lengths[n]; - - /* Dissect SDU as raw bytes */ - sdu_ti = proto_tree_add_bytes_format(tree, hf_mac_lte_mch_sdu, tvb, offset, pdu_lengths[n], - NULL, "SDU (%s, length=%u bytes): ", - val_to_str_const(lcids[n], mch_lcid_vals, "Unknown"), - data_length); - /* Show bytes too. There must be a nicer way of doing this! */ - pdu_data = tvb_get_ptr(tvb, offset, pdu_lengths[n]); - - for (i=0; i < data_length; i++) { - g_snprintf(buff+(i*2), 3, "%02x", pdu_data[i]); - - if (i >= 30) { - g_snprintf(buff+(i*2), 4, "..."); - break; - } - } - - proto_item_append_text(sdu_ti, "%s", buff); - - offset += data_length; - } - - /* Now padding, if present, extends to the end of the PDU */ - if (lcids[number_of_headers-1] == PADDING_LCID) { - if (tvb_length_remaining(tvb, offset) > 0) { - proto_tree_add_item(tree, hf_mac_lte_padding_data, - tvb, offset, -1, ENC_NA); - } - - padding_length_ti = proto_tree_add_int(tree, hf_mac_lte_padding_length, - tvb, offset, 0, - p_mac_lte_info->length - offset); - PROTO_ITEM_SET_GENERATED(padding_length_ti); - - /* Make sure the PDU isn't bigger than reported! */ - if (offset > p_mac_lte_info->length) { - expert_add_info_format(pinfo, padding_length_ti, PI_MALFORMED, PI_ERROR, - "MAC PDU is longer than reported length (reported=%u, actual=%u)", - p_mac_lte_info->length, offset); - } - } else { - /* There is no padding at the end of the frame */ - if (!is_truncated && (offset < p_mac_lte_info->length)) { - /* There is a problem if we haven't used all of the PDU */ - expert_add_info_format(pinfo, pdu_ti, PI_MALFORMED, PI_ERROR, - "PDU is shorter than reported length (reported=%u, actual=%u)", - p_mac_lte_info->length, offset); - } - - if (!is_truncated && (offset > p_mac_lte_info->length)) { - /* There is a problem if the PDU is longer than rpeported */ - expert_add_info_format(pinfo, pdu_ti, PI_MALFORMED, PI_ERROR, - "PDU is longer than reported length (reported=%u, actual=%u)", - p_mac_lte_info->length, offset); - } - } -} - - -/*****************************/ -/* Main dissection function. */ -void dissect_mac_lte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) -{ - proto_tree *mac_lte_tree; - proto_item *pdu_ti; - proto_tree *context_tree; - proto_item *context_ti; - proto_item *retx_ti = NULL; - proto_item *ti; - gint offset = 0; - struct mac_lte_info *p_mac_lte_info = NULL; - gint n; - - /* Allocate and zero tap struct */ - mac_lte_tap_info *tap_info = ep_alloc0(sizeof(mac_lte_tap_info)); - - /* Set protocol name */ - col_set_str(pinfo->cinfo, COL_PROTOCOL, "MAC-LTE"); - - /* Create protocol tree. */ - pdu_ti = proto_tree_add_item(tree, proto_mac_lte, tvb, offset, -1, ENC_NA); - proto_item_append_text(pdu_ti, " "); - mac_lte_tree = proto_item_add_subtree(pdu_ti, ett_mac_lte); - - - /* Look for packet info! */ - p_mac_lte_info = p_get_proto_data(pinfo->fd, proto_mac_lte); - - /* Can't dissect anything without it... */ - if (p_mac_lte_info == NULL) { - proto_item *tii = - proto_tree_add_text(mac_lte_tree, tvb, offset, -1, - "Can't dissect LTE MAC frame because no per-frame info was attached!"); - PROTO_ITEM_SET_GENERATED(tii); - return; - } - - /* Clear info column */ - col_clear(pinfo->cinfo, COL_INFO); - - - /*****************************************/ - /* Show context information */ - - /* Create context root */ - context_ti = proto_tree_add_string_format(mac_lte_tree, hf_mac_lte_context, - tvb, offset, 0, "", "Context"); - context_tree = proto_item_add_subtree(context_ti, ett_mac_lte_context); - PROTO_ITEM_SET_GENERATED(context_ti); - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_radio_type, - tvb, 0, 0, p_mac_lte_info->radioType); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_direction, - tvb, 0, 0, p_mac_lte_info->direction); - PROTO_ITEM_SET_GENERATED(ti); - - if (p_mac_lte_info->ueid != 0) { - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_ueid, - tvb, 0, 0, p_mac_lte_info->ueid); - PROTO_ITEM_SET_GENERATED(ti); - } - - /* There are several out-of-band MAC events that may be indicated in the context info. */ - /* Handle them here */ - if (p_mac_lte_info->length == 0) { - proto_item *preamble_ti; - proto_tree *preamble_tree; - - switch (p_mac_lte_info->oob_event) { - case ltemac_send_preamble: - preamble_ti = proto_tree_add_item(mac_lte_tree, hf_mac_lte_oob_send_preamble, - tvb, 0, 0, ENC_ASCII|ENC_NA); - preamble_tree = proto_item_add_subtree(preamble_ti, ett_mac_lte_oob); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(preamble_tree, hf_mac_lte_context_rapid, - tvb, 0, 0, p_mac_lte_info->rapid); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(preamble_tree, hf_mac_lte_context_rach_attempt_number, - tvb, 0, 0, p_mac_lte_info->rach_attempt_number); - PROTO_ITEM_SET_GENERATED(ti); - - /* Info column */ - write_pdu_label_and_info(pdu_ti, preamble_ti, pinfo, - "RACH Preamble sent for UE %u (RAPID=%u, attempt=%u)", - p_mac_lte_info->ueid, p_mac_lte_info->rapid, p_mac_lte_info->rach_attempt_number); - - /* Add expert info (a note, unless attempt > 1) */ - expert_add_info_format(pinfo, ti, PI_SEQUENCE, - (p_mac_lte_info->rach_attempt_number > 1) ? PI_WARN : PI_NOTE, - "RACH Preamble sent for UE %u (RAPID=%u, attempt=%u)", - p_mac_lte_info->ueid, p_mac_lte_info->rapid, - p_mac_lte_info->rach_attempt_number); - break; - - case ltemac_send_sr: - /* Count of SRs */ - ti = proto_tree_add_uint(mac_lte_tree, hf_mac_lte_number_of_srs, - tvb, 0, 0, p_mac_lte_info->number_of_srs); - PROTO_ITEM_SET_GENERATED(ti); - - - for (n=0; n < p_mac_lte_info->number_of_srs; n++) { - proto_item *sr_ti; - proto_tree *sr_tree; - - /* SR event is subtree */ - sr_ti = proto_tree_add_item(mac_lte_tree, hf_mac_lte_oob_send_sr, - tvb, 0, 0, ENC_NA); - sr_tree = proto_item_add_subtree(sr_ti, ett_mac_lte_oob); - PROTO_ITEM_SET_GENERATED(sr_ti); - - - /* RNTI */ - ti = proto_tree_add_uint(sr_tree, hf_mac_lte_context_rnti, - tvb, 0, 0, p_mac_lte_info->oob_rnti[n]); - PROTO_ITEM_SET_GENERATED(ti); - - /* UEID */ - ti = proto_tree_add_uint(sr_tree, hf_mac_lte_context_ueid, - tvb, 0, 0, p_mac_lte_info->oob_ueid[n]); - PROTO_ITEM_SET_GENERATED(ti); - - /* Add summary to root. */ - proto_item_append_text(sr_ti, " (UE=%u C-RNTI=%u)", - p_mac_lte_info->oob_ueid[n], - p_mac_lte_info->oob_rnti[n]); - - /* Info column */ - if (n == 0) { - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "Scheduling Requests (%u) sent: (UE=%u C-RNTI=%u)", - p_mac_lte_info->number_of_srs, - p_mac_lte_info->oob_ueid[n], - p_mac_lte_info->oob_rnti[n]); - } else { - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - " (UE=%u C-RNTI=%u)", - p_mac_lte_info->oob_ueid[n], - p_mac_lte_info->oob_rnti[n]); - } - - /* Add expert info (a note) */ - expert_add_info_format(pinfo, sr_ti, PI_SEQUENCE, PI_NOTE, - "Scheduling Request sent for UE %u (RNTI %u)", - p_mac_lte_info->oob_ueid[n], - p_mac_lte_info->oob_rnti[n]); - - /* Update SR status for this UE */ - if (global_mac_lte_track_sr) { - TrackSRInfo(SR_Request, pinfo, mac_lte_tree, tvb, p_mac_lte_info, n, sr_ti); - } - } - - break; - - case ltemac_sr_failure: - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_rnti, - tvb, 0, 0, p_mac_lte_info->rnti); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_item(mac_lte_tree, hf_mac_lte_oob_sr_failure, - tvb, 0, 0, ENC_NA); - PROTO_ITEM_SET_GENERATED(ti); - - /* Info column */ - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "Scheduling Request FAILED for UE %u (C-RNTI=%u)", - p_mac_lte_info->ueid, - p_mac_lte_info->rnti); - - /* Add expert info (an error) */ - expert_add_info_format(pinfo, ti, PI_SEQUENCE, PI_ERROR, - "Scheduling Request failed for UE %u (RNTI %u)", - p_mac_lte_info->ueid, - p_mac_lte_info->rnti); - - /* Update SR status */ - if (global_mac_lte_track_sr) { - TrackSRInfo(SR_Failure, pinfo, mac_lte_tree, tvb, p_mac_lte_info, 0, ti); - } - - break; - } - - /* Our work here is done */ - return; - } - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_sysframe_number, - tvb, 0, 0, p_mac_lte_info->sysframeNumber); - PROTO_ITEM_SET_GENERATED(ti); - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_subframe_number, - tvb, 0, 0, p_mac_lte_info->subframeNumber); - PROTO_ITEM_SET_GENERATED(ti); - - if (p_mac_lte_info->subframeNumber > 9) { - /* N.B. if we set it to valid value, it won't trigger when we rescan - (at least with DCT2000 files where the context struct isn't re-read). */ - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "Subframe number (%u) was out of range - valid range is 0-9", - p_mac_lte_info->subframeNumber); - } - - if (p_mac_lte_info->subframeNumberOfGrantPresent) { - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_grant_subframe_number, - tvb, 0, 0, p_mac_lte_info->subframeNumberOfGrant); - PROTO_ITEM_SET_GENERATED(ti); - } - - if (p_mac_lte_info->rntiType != NO_RNTI) { - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_rnti, - tvb, 0, 0, p_mac_lte_info->rnti); - PROTO_ITEM_SET_GENERATED(ti); - } - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_rnti_type, - tvb, 0, 0, p_mac_lte_info->rntiType); - PROTO_ITEM_SET_GENERATED(ti); - - /* Check that RNTI value is consistent with given RNTI type */ - switch (p_mac_lte_info->rntiType) { - case M_RNTI: - if (p_mac_lte_info->rnti != 0xFFFD) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "M-RNTI indicated, but value is %u (0x%x) (must be 0x%x)", - p_mac_lte_info->rnti, p_mac_lte_info->rnti, 0xFFFD); - return; - } - - break; - - case P_RNTI: - if (p_mac_lte_info->rnti != 0xFFFE) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "P-RNTI indicated, but value is %u (0x%x) (must be 0x%x)", - p_mac_lte_info->rnti, p_mac_lte_info->rnti, 0xFFFE); - return; - } - - break; - - case SI_RNTI: - if (p_mac_lte_info->rnti != 0xFFFF) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "SI-RNTI indicated, but value is %u (0x%x) (must be 0x%x)", - p_mac_lte_info->rnti, p_mac_lte_info->rnti, 0xFFFE); - return; - } - - break; - - case RA_RNTI: - if ((p_mac_lte_info->rnti < 0x0001) || (p_mac_lte_info->rnti > 0x003C)) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "RA_RNTI indicated, but given value %u (0x%x)is out of range", - p_mac_lte_info->rnti, p_mac_lte_info->rnti); - return; - } - - break; - - case C_RNTI: - case SPS_RNTI: - if ((p_mac_lte_info->rnti < 0x0001) || (p_mac_lte_info->rnti > 0xFFF3)) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "%s indicated, but given value %u (0x%x)is out of range", - val_to_str_const(p_mac_lte_info->rntiType, rnti_type_vals, "Unknown"), - p_mac_lte_info->rnti, p_mac_lte_info->rnti); - return; - } - - break; - - default: - break; - } - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_predefined_frame, - tvb, 0, 0, p_mac_lte_info->isPredefinedData); - - if (p_mac_lte_info->isPredefinedData) { - PROTO_ITEM_SET_GENERATED(ti); - } else { - PROTO_ITEM_SET_HIDDEN(ti); - } - - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_length, - tvb, 0, 0, p_mac_lte_info->length); - PROTO_ITEM_SET_GENERATED(ti); - - /* Infer uplink grant size */ - if (p_mac_lte_info->direction == DIRECTION_UPLINK) { - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_ul_grant_size, - tvb, 0, 0, p_mac_lte_info->length); - PROTO_ITEM_SET_GENERATED(ti); - } - - /* Retx count goes in top-level tree to make it more visible */ - if (p_mac_lte_info->reTxCount) { - proto_item *retx_reason_ti; - retx_ti = proto_tree_add_uint(mac_lte_tree, hf_mac_lte_context_retx_count, - tvb, 0, 0, p_mac_lte_info->reTxCount); - PROTO_ITEM_SET_GENERATED(retx_ti); - - if (p_mac_lte_info->reTxCount >= global_mac_lte_retx_counter_trigger) { - expert_add_info_format(pinfo, retx_ti, PI_SEQUENCE, PI_WARN, - "UE %u: UL MAC frame ReTX no. %u", - p_mac_lte_info->ueid, p_mac_lte_info->reTxCount); - } - - retx_reason_ti = proto_tree_add_uint(mac_lte_tree, hf_mac_lte_context_retx_reason, - tvb, 0, 0, p_mac_lte_info->isPHICHNACK); - PROTO_ITEM_SET_GENERATED(retx_reason_ti); - } - - if (p_mac_lte_info->crcStatusValid) { - /* Set status */ - ti = proto_tree_add_uint(context_tree, hf_mac_lte_context_crc_status, - tvb, 0, 0, p_mac_lte_info->detailed_phy_info.dl_info.crc_status); - PROTO_ITEM_SET_GENERATED(ti); - - /* Report non-success */ - if (p_mac_lte_info->detailed_phy_info.dl_info.crc_status != crc_success) { - expert_add_info_format(pinfo, ti, PI_MALFORMED, PI_ERROR, - "%s Frame has CRC error problem (%s)", - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? "UL" : "DL", - val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.crc_status, - crc_status_vals, - "Unknown")); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "%s: UEId=%u %s=%u ", - (p_mac_lte_info->direction == DIRECTION_UPLINK) ? "UL" : "DL", - val_to_str_const(p_mac_lte_info->detailed_phy_info.dl_info.crc_status, - crc_status_vals, - "Unknown"), - p_mac_lte_info->ueid, - val_to_str_const(p_mac_lte_info->rntiType, rnti_type_vals, - "Unknown RNTI type"), - p_mac_lte_info->rnti); - } - } - - /* May also have extra Physical layer attributes set for this frame */ - show_extra_phy_parameters(pinfo, tvb, mac_lte_tree, p_mac_lte_info); - - /* Set context-info parts of tap struct */ - tap_info->rnti = p_mac_lte_info->rnti; - tap_info->ueid = p_mac_lte_info->ueid; - tap_info->rntiType = p_mac_lte_info->rntiType; - tap_info->isPredefinedData = p_mac_lte_info->isPredefinedData; - tap_info->isPHYRetx = (p_mac_lte_info->reTxCount >= 1); - tap_info->crcStatusValid = p_mac_lte_info->crcStatusValid; - tap_info->crcStatus = p_mac_lte_info->detailed_phy_info.dl_info.crc_status; - tap_info->direction = p_mac_lte_info->direction; - - tap_info->time = pinfo->fd->abs_ts; - - /* Also set total number of bytes (won't be used for UL/DL-SCH) */ - tap_info->single_number_of_bytes = tvb_length_remaining(tvb, offset); - - /* If we know its predefined data, don't try to decode any further */ - if (p_mac_lte_info->isPredefinedData) { - proto_tree_add_item(mac_lte_tree, hf_mac_lte_predefined_pdu, tvb, offset, -1, ENC_NA); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, - "Predefined data (%u bytes%s)", - p_mac_lte_info->length, - (p_mac_lte_info->length > tvb_length_remaining(tvb, offset) ? - " - truncated" : - "")); - - /* Queue tap info */ - if (!pinfo->flags.in_error_pkt) { - tap_queue_packet(mac_lte_tap, pinfo, tap_info); - } - - return; - } - - /* IF CRC status failed, just do decode as raw bytes */ - if (!global_mac_lte_dissect_crc_failures && - (p_mac_lte_info->crcStatusValid && - (p_mac_lte_info->detailed_phy_info.dl_info.crc_status != crc_success))) { - - proto_tree_add_item(mac_lte_tree, hf_mac_lte_raw_pdu, tvb, offset, -1, ENC_NA); - write_pdu_label_and_info(pdu_ti, NULL, pinfo, "Raw data (%u bytes)", tvb_length_remaining(tvb, offset)); - - /* Queue tap info. - TODO: unfortunately DL retx detection won't get done if we return here... */ - if (!pinfo->flags.in_error_pkt) { - tap_queue_packet(mac_lte_tap, pinfo, tap_info); - } - - return; - } - - /* Reset this counter */ - s_number_of_rlc_pdus_shown = 0; - - /* Dissect the MAC PDU itself. Format depends upon RNTI type. */ - switch (p_mac_lte_info->rntiType) { - - case P_RNTI: - /* PCH PDU */ - dissect_pch(tvb, pinfo, mac_lte_tree, pdu_ti, offset, p_mac_lte_info->direction); - break; - - case RA_RNTI: - /* RAR PDU */ - dissect_rar(tvb, pinfo, mac_lte_tree, pdu_ti, offset, p_mac_lte_info, tap_info); - break; - - case C_RNTI: - case SPS_RNTI: - /* Can be UL-SCH or DL-SCH */ - dissect_ulsch_or_dlsch(tvb, pinfo, mac_lte_tree, pdu_ti, offset, - p_mac_lte_info->direction, p_mac_lte_info, tap_info, - retx_ti, context_tree); - break; - - case SI_RNTI: - /* BCH over DL-SCH */ - dissect_bch(tvb, pinfo, mac_lte_tree, pdu_ti, offset, p_mac_lte_info); - break; - - case M_RNTI: - /* MCH PDU */ - dissect_mch(tvb, pinfo, mac_lte_tree, pdu_ti, offset, p_mac_lte_info); - break; - - case NO_RNTI: - /* Must be BCH over BCH... */ - dissect_bch(tvb, pinfo, mac_lte_tree, pdu_ti, offset, p_mac_lte_info); - break; - - - default: - break; - } - - /* Queue tap info */ - tap_queue_packet(mac_lte_tap, pinfo, tap_info); -} - - - - -/* Initializes the hash tables each time a new - * file is loaded or re-loaded in wireshark */ -static void mac_lte_init_protocol(void) -{ - /* Destroy any existing tables. */ - if (mac_lte_msg3_hash) { - g_hash_table_destroy(mac_lte_msg3_hash); - } - - if (mac_lte_cr_result_hash) { - g_hash_table_destroy(mac_lte_cr_result_hash); - } - - if (mac_lte_dl_harq_hash) { - g_hash_table_destroy(mac_lte_dl_harq_hash); - } - - if (mac_lte_dl_harq_result_hash) { - g_hash_table_destroy(mac_lte_dl_harq_result_hash); - } - - if (mac_lte_ul_harq_hash) { - g_hash_table_destroy(mac_lte_ul_harq_hash); - } - - if (mac_lte_ul_harq_result_hash) { - g_hash_table_destroy(mac_lte_ul_harq_result_hash); - } - - if (mac_lte_ue_sr_state) { - g_hash_table_destroy(mac_lte_ue_sr_state); - } - - if (mac_lte_sr_request_hash) { - g_hash_table_destroy(mac_lte_sr_request_hash); - } - - if (mac_lte_tti_info_result_hash) { - g_hash_table_destroy(mac_lte_tti_info_result_hash); - } - - /* Reset structs */ - memset(&UL_tti_info, 0, sizeof(UL_tti_info)); - UL_tti_info.subframe = 0xff; /* Invalid value */ - memset(&DL_tti_info, 0, sizeof(DL_tti_info)); - DL_tti_info.subframe = 0xff; /* Invalid value */ - - /* Now create them over */ - mac_lte_msg3_hash = g_hash_table_new(mac_lte_rnti_hash_func, mac_lte_rnti_hash_equal); - mac_lte_cr_result_hash = g_hash_table_new(mac_lte_framenum_hash_func, mac_lte_framenum_hash_equal); - - mac_lte_dl_harq_hash = g_hash_table_new(mac_lte_rnti_hash_func, mac_lte_rnti_hash_equal); - mac_lte_dl_harq_result_hash = g_hash_table_new(mac_lte_framenum_hash_func, mac_lte_framenum_hash_equal); - - mac_lte_ul_harq_hash = g_hash_table_new(mac_lte_rnti_hash_func, mac_lte_rnti_hash_equal); - mac_lte_ul_harq_result_hash = g_hash_table_new(mac_lte_framenum_hash_func, mac_lte_framenum_hash_equal); - - mac_lte_ue_sr_state = g_hash_table_new(mac_lte_rnti_hash_func, mac_lte_rnti_hash_equal); - mac_lte_sr_request_hash = g_hash_table_new(mac_lte_framenum_hash_func, mac_lte_framenum_hash_equal); - - mac_lte_tti_info_result_hash = g_hash_table_new(mac_lte_framenum_hash_func, mac_lte_framenum_hash_equal); -} - - -static void* lcid_drb_mapping_copy_cb(void* dest, const void* orig, size_t len _U_) -{ - const lcid_drb_mapping_t *o = orig; - lcid_drb_mapping_t *d = dest; - - /* Copy all items over */ - d->lcid = o->lcid; - d->drbid = o->drbid; - d->channel_type = o->channel_type; - - return d; -} - - - -void proto_register_mac_lte(void) -{ - static hf_register_info hf[] = { - /**********************************/ - /* Items for decoding context */ - { - &hf_mac_lte_context, - { - "Context", - "mac-lte.context", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_radio_type, - { - "Radio Type", - "mac-lte.radio-type", FT_UINT8, BASE_DEC, VALS(radio_type_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_direction, - { - "Direction", - "mac-lte.direction", FT_UINT8, BASE_DEC, VALS(direction_vals), 0x0, - "Direction of message", HFILL - } - }, - { - &hf_mac_lte_context_rnti, - { - "RNTI", - "mac-lte.rnti", FT_UINT16, BASE_DEC, 0, 0x0, - "RNTI associated with message", HFILL - } - }, - { - &hf_mac_lte_context_rnti_type, - { - "RNTI Type", - "mac-lte.rnti-type", FT_UINT8, BASE_DEC, VALS(rnti_type_vals), 0x0, - "Type of RNTI associated with message", HFILL - } - }, - { - &hf_mac_lte_context_ueid, - { - "UEId", - "mac-lte.ueid", FT_UINT16, BASE_DEC, 0, 0x0, - "User Equipment Identifier associated with message", HFILL - } - }, - { - &hf_mac_lte_context_sysframe_number, - { - "System Frame Number", - "mac-lte.sfn", FT_UINT16, BASE_DEC, 0, 0x0, - "System Frame Number associated with message", HFILL - } - }, - { - &hf_mac_lte_context_subframe_number, - { - "Subframe", - "mac-lte.subframe", FT_UINT16, BASE_DEC, 0, 0x0, - "Subframe number associated with message", HFILL - } - }, - { - &hf_mac_lte_context_grant_subframe_number, - { - "Grant Subframe", - "mac-lte.grant-subframe", FT_UINT16, BASE_DEC, 0, 0x0, - "Subframe when grant for this PDU was received", HFILL - } - }, - { - &hf_mac_lte_context_predefined_frame, - { - "Predefined frame", - "mac-lte.is-predefined-frame", FT_UINT8, BASE_DEC, VALS(predefined_frame_vals), 0x0, - "Predefined test frame (or real MAC PDU)", HFILL - } - }, - { - &hf_mac_lte_context_length, - { - "Length of frame", - "mac-lte.length", FT_UINT8, BASE_DEC, 0, 0x0, - "Original length of frame (including SDUs and padding)", HFILL - } - }, - { - &hf_mac_lte_context_ul_grant_size, - { - "Uplink grant size", - "mac-lte.ul-grant-size", FT_UINT8, BASE_DEC, 0, 0x0, - "Uplink grant size (in bytes)", HFILL - } - }, - { - &hf_mac_lte_context_bch_transport_channel, - { - "Transport channel", - "mac-lte.bch-transport-channel", FT_UINT8, BASE_DEC, VALS(bch_transport_channel_vals), 0x0, - "Transport channel BCH data was carried on", HFILL - } - }, - { - &hf_mac_lte_context_retx_count, - { - "ReTX count", - "mac-lte.retx-count", FT_UINT8, BASE_DEC, 0, 0x0, - "Number of times this PDU has been retransmitted", HFILL - } - }, - { - &hf_mac_lte_context_retx_reason, - { - "ReTX reason", - "mac-lte.retx-reason", FT_UINT8, BASE_DEC, VALS(ul_retx_grant_vals), 0x0, - "Type of UL ReTx grant", HFILL - } - }, - { - &hf_mac_lte_context_crc_status, - { - "CRC Status", - "mac-lte.crc-status", FT_UINT8, BASE_DEC, VALS(crc_status_vals), 0x0, - "CRC Status as reported by PHY", HFILL - } - }, - { - &hf_mac_lte_context_rapid, - { - "RAPID", - "mac-lte.preamble-sent.rapid", FT_UINT8, BASE_DEC, 0, 0x0, - "RAPID sent in RACH preamble", HFILL - } - }, - { - &hf_mac_lte_context_rach_attempt_number, - { - "RACH Attempt Number", - "mac-lte.preamble-sent.attempt", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - - { - &hf_mac_lte_ues_ul_per_tti, - { - "UL UE in TTI", - "mac-lte.ul-tti-count", FT_UINT8, BASE_DEC, 0, 0x0, - "In this TTI, this is the nth UL grant", HFILL - } - }, - { - &hf_mac_lte_ues_dl_per_tti, - { - "DL UE in TTI", - "mac-lte.dl-tti-count", FT_UINT8, BASE_DEC, 0, 0x0, - "In this TTI, this is the nth DL PDU", HFILL - } - }, - - - /* Extra PHY context */ - { - &hf_mac_lte_context_phy_ul, - { - "UL PHY attributes", - "mac-lte.ul-phy", FT_STRING, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_modulation_type, - { - "Modulation type", - "mac-lte.ul-phy.modulation-type", FT_UINT8, BASE_DEC, VALS(modulation_type_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_tbs_index, - { - "TBs Index", - "mac-lte.ul-phy.tbs-index", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_resource_block_length, - { - "Resource Block Length", - "mac-lte.ul-phy.resource-block-length", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_resource_block_start, - { - "Resource Block Start", - "mac-lte.ul-phy.resource-block-start", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_harq_id, - { - "HARQ Id", - "mac-lte.ul-phy.harq-id", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_ul_ndi, - { - "NDI", - "mac-lte.ul-phy.ndi", FT_UINT8, BASE_DEC, 0, 0x0, - "UL New Data Indicator", HFILL - } - }, - - { - &hf_mac_lte_context_phy_dl, - { - "DL PHY attributes", - "mac-lte.dl-phy", FT_STRING, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_dci_format, - { - "DCI format", - "mac-lte.dl-phy.dci-format", FT_UINT8, BASE_DEC, VALS(dci_format_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_resource_allocation_type, - { - "Resource Allocation Type", - "mac-lte.dl-phy.resource-allocation-type", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_aggregation_level, - { - "Aggregation Level", - "mac-lte.dl-phy.aggregation-level", FT_UINT8, BASE_DEC, VALS(aggregation_level_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_mcs_index, - { - "MCS Index", - "mac-lte.dl-phy.mcs-index", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_redundancy_version_index, - { - "RV Index", - "mac-lte.dl-phy.rv-index", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_retx, - { - "DL Retx", - "mac-lte.dl-phy.dl-retx", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_resource_block_length, - { - "RB Length", - "mac-lte.dl-phy.rb-length", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_crc_status, - { - "CRC Status", - "mac-lte.dl-phy.crc-status", FT_UINT8, BASE_DEC, VALS(crc_status_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_harq_id, - { - "HARQ Id", - "mac-lte.dl-phy.harq-id", FT_UINT8, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_ndi, - { - "NDI", - "mac-lte.dl-phy.ndi", FT_UINT8, BASE_DEC, 0, 0x0, - "New Data Indicator", HFILL - } - }, - { - &hf_mac_lte_context_phy_dl_tb, - { - "TB", - "mac-lte.dl-phy.tb", FT_UINT8, BASE_DEC, 0, 0x0, - "Transport Block (antenna #)", HFILL - } - }, - - /* Out-of-band events */ - { - &hf_mac_lte_oob_send_preamble, - { - "PRACH", - "mac-lte.preamble-sent", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_oob_send_sr, - { - "Scheduling Request sent", - "mac-lte.sr-req", FT_NONE, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_number_of_srs, - { - "Number of SRs", - "mac-lte.sr-req.count", FT_UINT32, BASE_DEC, 0, 0x0, - "Number of UEs doing SR in this frame", HFILL - } - }, - { - &hf_mac_lte_oob_sr_failure, - { - "Scheduling Request failure", - "mac-lte.sr-failure", FT_NONE, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - - /*******************************************/ - /* MAC shared channel header fields */ - { - &hf_mac_lte_ulsch, - { - "UL-SCH", - "mac-lte.ulsch", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_ulsch_header, - { - "UL-SCH Header", - "mac-lte.ulsch.header", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_dlsch_header, - { - "DL-SCH Header", - "mac-lte.dlsch.header", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_dlsch, - { - "DL-SCH", - "mac-lte.dlsch", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sch_subheader, - { - "SCH sub-header", - "mac-lte.sch.subheader", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch, - { - "MCH", - "mac-lte.mch", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch_header, - { - "MCH Header", - "mac-lte.mch.header", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch_subheader, - { - "MCH sub-header", - "mac-lte.mch.subheader", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sch_reserved, - { - "SCH reserved bits", - "mac-lte.sch.reserved", FT_UINT8, BASE_HEX, NULL, 0xc0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sch_extended, - { - "Extension", - "mac-lte.sch.extended", FT_UINT8, BASE_HEX, 0, 0x20, - "Extension - i.e. further headers after this one", HFILL - } - }, - { - &hf_mac_lte_dlsch_lcid, - { - "LCID", - "mac-lte.dlsch.lcid", FT_UINT8, BASE_HEX, VALS(dlsch_lcid_vals), 0x1f, - "DL-SCH Logical Channel Identifier", HFILL - } - }, - { - &hf_mac_lte_ulsch_lcid, - { - "LCID", - "mac-lte.ulsch.lcid", FT_UINT8, BASE_HEX, VALS(ulsch_lcid_vals), 0x1f, - "UL-SCH Logical Channel Identifier", HFILL - } - }, - { - &hf_mac_lte_sch_format, - { - "Format", - "mac-lte.sch.format", FT_UINT8, BASE_HEX, VALS(format_vals), 0x80, - NULL, HFILL - } - }, - { - &hf_mac_lte_sch_length, - { - "Length", - "mac-lte.sch.length", FT_UINT16, BASE_DEC, 0, 0x0, - "Length of MAC SDU or MAC control element", HFILL - } - }, - { - &hf_mac_lte_mch_reserved, - { - "MCH reserved bits", - "mac-lte.mch.reserved", FT_UINT8, BASE_HEX, NULL, 0xc0, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch_extended, - { - "Extension", - "mac-lte.mch.extended", FT_UINT8, BASE_HEX, 0, 0x20, - "Extension - i.e. further headers after this one", HFILL - } - }, - { - &hf_mac_lte_mch_lcid, - { - "LCID", - "mac-lte.mch.lcid", FT_UINT8, BASE_HEX, VALS(mch_lcid_vals), 0x1f, - "MCH Logical Channel Identifier", HFILL - } - }, - { - &hf_mac_lte_mch_format, - { - "Format", - "mac-lte.mch.format", FT_UINT8, BASE_HEX, VALS(format_vals), 0x80, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch_length, - { - "Length", - "mac-lte.mch.length", FT_UINT16, BASE_DEC, 0, 0x0, - "Length of MAC SDU or MAC control element", HFILL - } - }, - { - &hf_mac_lte_sch_header_only, - { - "MAC PDU Header only", - "mac-lte.sch.header-only", FT_UINT8, BASE_DEC, VALS(header_only_vals), 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_mch_header_only, - { - "MAC PDU Header only", - "mac-lte.mch.header-only", FT_UINT8, BASE_DEC, VALS(header_only_vals), 0x0, - NULL, HFILL - } - }, - - /********************************/ - /* Data */ - { - &hf_mac_lte_sch_sdu, - { - "SDU", - "mac-lte.sch.sdu", FT_BYTES, BASE_NONE, 0, 0x0, - "Shared channel SDU", HFILL - } - }, - { - &hf_mac_lte_mch_sdu, - { - "SDU", - "mac-lte.mch.sdu", FT_BYTES, BASE_NONE, 0, 0x0, - "Multicast channel SDU", HFILL - } - }, - { - &hf_mac_lte_bch_pdu, - { - "BCH PDU", - "mac-lte.bch.pdu", FT_BYTES, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_pch_pdu, - { - "PCH PDU", - "mac-lte.pch.pdu", FT_BYTES, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_predefined_pdu, - { - "Predefined data", - "mac-lte.predefined-data", FT_BYTES, BASE_NONE, 0, 0x0, - "Predefined test data", HFILL - } - }, - { - &hf_mac_lte_raw_pdu, - { - "Raw data", - "mac-lte.raw-data", FT_BYTES, BASE_NONE, 0, 0x0, - "Raw bytes of PDU (e.g. if CRC error)", HFILL - } - }, - { - &hf_mac_lte_padding_data, - { - "Padding data", - "mac-lte.padding-data", FT_BYTES, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_padding_length, - { - "Padding length", - "mac-lte.padding-length", FT_INT32, BASE_DEC, 0, 0x0, - "Length of padding data not included at end of frame", HFILL - } - }, - - - - /*********************************/ - /* RAR fields */ - { - &hf_mac_lte_rar, - { - "RAR", - "mac-lte.rar", FT_NONE, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_headers, - { - "RAR Headers", - "mac-lte.rar.headers", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_header, - { - "RAR Header", - "mac-lte.rar.header", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_extension, - { - "Extension", - "mac-lte.rar.e", FT_UINT8, BASE_HEX, 0, 0x80, - "Extension - i.e. further RAR headers after this one", HFILL - } - }, - { - &hf_mac_lte_rar_t, - { - "Type", - "mac-lte.rar.t", FT_UINT8, BASE_HEX, VALS(rar_type_vals), 0x40, - "Type field indicating whether the payload is RAPID or BI", HFILL - } - }, - { - &hf_mac_lte_rar_bi, - { - "BI", - "mac-lte.rar.bi", FT_UINT8, BASE_HEX, VALS(rar_bi_vals), 0x0f, - "Backoff Indicator (ms)", HFILL - } - }, - { - &hf_mac_lte_rar_rapid, - { - "RAPID", - "mac-lte.rar.rapid", FT_UINT8, BASE_HEX_DEC, 0, 0x3f, - "Random Access Preamble IDentifier", HFILL - } - }, - { - &hf_mac_lte_rar_reserved, - { - "Reserved", - "mac-lte.rar.reserved", FT_UINT8, BASE_HEX, 0, 0x30, - "Reserved bits in RAR header - should be 0", HFILL - } - }, - - { - &hf_mac_lte_rar_body, - { - "RAR Body", - "mac-lte.rar.body", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_reserved2, - { - "Reserved", - "mac-lte.rar.reserved2", FT_UINT8, BASE_HEX, 0, 0x80, - "Reserved bit in RAR body - should be 0", HFILL - } - }, - { - &hf_mac_lte_rar_ta, - { - "Timing Advance", - "mac-lte.rar.ta", FT_UINT16, BASE_DEC, 0, 0x7ff0, - "Required adjustment to uplink transmission timing", HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant, - { - "UL Grant", - "mac-lte.rar.ul-grant", FT_UINT24, BASE_DEC, 0, 0x0fffff, - "Size of UL Grant", HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_hopping, - { - "Hopping Flag", - "mac-lte.rar.ul-grant.hopping", FT_UINT8, BASE_DEC, 0, 0x08, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_fsrba, - { - "Fixed sized resource block assignment", - "mac-lte.rar.ul-grant.fsrba", FT_UINT16, BASE_DEC, 0, 0x07fe, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_tmcs, - { - "Truncated Modulation and coding scheme", - "mac-lte.rar.ul-grant.tmcs", FT_UINT16, BASE_DEC, 0, 0x01e0, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_tcsp, - { - "TPC command for scheduled PUSCH", - "mac-lte.rar.ul-grant.tcsp", FT_UINT8, BASE_DEC, 0, 0x01c, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_ul_delay, - { - "UL Delay", - "mac-lte.rar.ul-grant.ul-delay", FT_UINT8, BASE_DEC, 0, 0x02, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_ul_grant_cqi_request, - { - "CQI Request", - "mac-lte.rar.ul-grant.cqi-request", FT_UINT8, BASE_DEC, 0, 0x01, - NULL, HFILL - } - }, - { - &hf_mac_lte_rar_temporary_crnti, - { - "Temporary C-RNTI", - "mac-lte.rar.temporary-crnti", FT_UINT16, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - - /**********************/ - /* Control PDU fields */ - { - &hf_mac_lte_control_bsr, - { - "BSR", - "mac-lte.control.bsr", FT_STRING, BASE_NONE, 0, 0x0, - "Buffer Status Report", HFILL - } - }, - { - &hf_mac_lte_control_bsr_lcg_id, - { - "Logical Channel Group ID", - "mac-lte.control.bsr.lcg-id", FT_UINT8, BASE_DEC, 0, 0xc0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_short_bsr_buffer_size, - { - "Buffer Size", - "mac-lte.control.bsr.buffer-size", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_vals_ext, 0x3f, - "Buffer Size available in all channels in group", HFILL - } - }, - { - &hf_mac_lte_control_long_bsr_buffer_size_0, - { - "Buffer Size 0", - "mac-lte.control.bsr.buffer-size-0", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_vals_ext, 0xfc, - "Buffer Size available in logical channel group 0", HFILL - } - }, - { - &hf_mac_lte_control_long_bsr_buffer_size_1, - { - "Buffer Size 1", - "mac-lte.control.bsr.buffer-size-1", FT_UINT16, BASE_DEC|BASE_EXT_STRING, &buffer_size_vals_ext, 0x03f0, - "Buffer Size available in logical channel group 1", HFILL - } - }, - { - &hf_mac_lte_control_long_bsr_buffer_size_2, - { - "Buffer Size 2", - "mac-lte.control.bsr.buffer-size-2", FT_UINT16, BASE_DEC|BASE_EXT_STRING, &buffer_size_vals_ext, 0x0fc0, - "Buffer Size available in logical channel group 2", HFILL - } - }, - { - &hf_mac_lte_control_long_bsr_buffer_size_3, - { - "Buffer Size 3", - "mac-lte.control.bsr.buffer-size-3", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_vals_ext, 0x3f, - "Buffer Size available in logical channel group 3", HFILL - } - }, - { - &hf_mac_lte_control_short_ext_bsr_buffer_size, - { - "Buffer Size", - "mac-lte.control.bsr.buffer-size", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &ext_buffer_size_vals_ext, 0x3f, - "Buffer Size available in all channels in group", HFILL - } - }, - { - &hf_mac_lte_control_long_ext_bsr_buffer_size_0, - { - "Buffer Size 0", - "mac-lte.control.bsr.buffer-size-0", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &ext_buffer_size_vals_ext, 0xfc, - "Buffer Size available in logical channel group 0", HFILL - } - }, - { - &hf_mac_lte_control_long_ext_bsr_buffer_size_1, - { - "Buffer Size 1", - "mac-lte.control.bsr.buffer-size-1", FT_UINT16, BASE_DEC|BASE_EXT_STRING, &ext_buffer_size_vals_ext, 0x03f0, - "Buffer Size available in logical channel group 1", HFILL - } - }, - { - &hf_mac_lte_control_long_ext_bsr_buffer_size_2, - { - "Buffer Size 2", - "mac-lte.control.bsr.buffer-size-2", FT_UINT16, BASE_DEC|BASE_EXT_STRING, &ext_buffer_size_vals_ext, 0x0fc0, - "Buffer Size available in logical channel group 2", HFILL - } - }, - { - &hf_mac_lte_control_long_ext_bsr_buffer_size_3, - { - "Buffer Size 3", - "mac-lte.control.bsr.buffer-size-3", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &ext_buffer_size_vals_ext, 0x3f, - "Buffer Size available in logical channel group 3", HFILL - } - }, - { - &hf_mac_lte_control_crnti, - { - "C-RNTI", - "mac-lte.control.crnti", FT_UINT16, BASE_DEC, 0, 0x0, - "C-RNTI for the UE", HFILL - } - }, - { - &hf_mac_lte_control_timing_advance, - { - "Timing Advance", - "mac-lte.control.timing-advance", FT_UINT8, BASE_DEC, 0, 0x3f, - "Timing Advance (0-1282 - see 36.213, 4.2.3)", HFILL - } - }, - { - &hf_mac_lte_control_timing_advance_reserved, - { - "Reserved", - "mac-lte.control.timing-advance.reserved", FT_UINT8, BASE_HEX, 0, 0xc0, - "Reserved bits", HFILL - } - }, - { - &hf_mac_lte_control_ue_contention_resolution, - { - "UE Contention Resolution", - "mac-lte.control.ue-contention-resolution", FT_STRING, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_ue_contention_resolution_identity, - { - "UE Contention Resolution Identity", - "mac-lte.control.ue-contention-resolution.identity", FT_BYTES, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_ue_contention_resolution_msg3, - { - "Msg3", - "mac-lte.control.ue-contention-resolution.msg3", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_ue_contention_resolution_msg3_matched, - { - "UE Contention Resolution Matches Msg3", - "mac-lte.control.ue-contention-resolution.matches-msg3", FT_BOOLEAN, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_ue_contention_resolution_time_since_msg3, - { - "Time since Msg3", - "mac-lte.control.ue-contention-resolution.time-since-msg3", FT_UINT32, BASE_DEC, 0, 0x0, - "Time in ms since corresponding Msg3", HFILL - } - }, - - { - &hf_mac_lte_control_power_headroom, - { - "Power Headroom", - "mac-lte.control.power-headroom", FT_STRING, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_power_headroom_reserved, - { - "Reserved", - "mac-lte.control.power-headroom.reserved", FT_UINT8, BASE_DEC, 0, 0xc0, - "Reserved bits, should be 0", HFILL - } - }, - { - &hf_mac_lte_control_power_headroom_level, - { - "Power Headroom Level", - "mac-lte.control.power-headroom.level", FT_UINT8, BASE_DEC|BASE_EXT_STRING, - &power_headroom_vals_ext, 0x3f, "Power Headroom Level in dB", HFILL - } - }, - - { - &hf_mac_lte_control_ext_power_headroom, - { - "Extended Power Headroom", - "mac-lte.control.ext-power-headroom", FT_STRING, BASE_NONE, - 0, 0x0, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c7, - { - "SCell Index 7 Power Headroom", - "mac-lte.control.ext-power-headroom.c7", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x80, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c6, - { - "SCell Index 6 Power Headroom", - "mac-lte.control.ext-power-headroom.c6", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x40, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c5, - { - "SCell Index 5 Power Headroom", - "mac-lte.control.ext-power-headroom.c5", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x20, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c4, - { - "SCell Index 4 Power Headroom", - "mac-lte.control.ext-power-headroom.c4", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x10, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c3, - { - "SCell Index 3 Power Headroom", - "mac-lte.control.ext-power-headroom.c3", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x08, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c2, - { - "SCell Index 2 Power Headroom", - "mac-lte.control.ext-power-headroom.c2", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x04, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_c1, - { - "SCell Index 1 Power Headroom", - "mac-lte.control.ext-power-headroom.c1", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_ph_vals), 0x02, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_reserved, - { - "Reserved", - "mac-lte.control.ext-power-headroom.reserved", FT_UINT8, BASE_DEC, - 0, 0x01, "Reserved bit, should be 0", HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_power_backoff, - { - "Power Backoff", - "mac-lte.control.ext-power-headroom.power-backoff", FT_BOOLEAN, 8, - TFS(&mac_lte_power_backoff_vals), 0x80, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_value, - { - "Power Headroom Value", - "mac-lte.control.ext-power-headroom.power-headroom-value", FT_BOOLEAN, 8, - TFS(&mac_lte_ph_value_vals), 0x40, NULL, HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_level, - { - "Power Headroom Level", - "mac-lte.control.ext-power-headroom.level", FT_UINT8, BASE_DEC|BASE_EXT_STRING, - &power_headroom_vals_ext, 0x3f, "Power Headroom Level in dB", HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_reserved2, - { - "Reserved", - "mac-lte.control.ext-power-headroom.reserved2", FT_UINT8, BASE_DEC, - 0, 0xc0, "Reserved bits, should be 0", HFILL - } - }, - { - &hf_mac_lte_control_ext_power_headroom_pcmaxc, - { - "Configured UE Transmit Power", - "mac-lte.control.ext-power-headroom.pcmaxc", FT_UINT8, BASE_DEC|BASE_EXT_STRING, - &pcmaxc_vals_ext, 0x3f, "Pcmax,c in dBm", HFILL - } - }, - - { - &hf_mac_lte_control_activation_deactivation, - { - "Activation/Deactivation", - "mac-lte.control.activation-deactivation", FT_STRING, BASE_NONE, - 0, 0x0, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c7, - { - "SCell Index 7 Status", - "mac-lte.control.activation-deactivation.c7", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x80, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c6, - { - "SCell Index 6 Status", - "mac-lte.control.activation-deactivation.c6", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x40, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c5, - { - "SCell Index 5 Status", - "mac-lte.control.activation-deactivation.c5", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x20, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c4, - { - "SCell Index 4 Status", - "mac-lte.control.activation-deactivation.c4", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x10, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c3, - { - "SCell Index 3 Status", - "mac-lte.control.activation-deactivation.c3", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x08, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c2, - { - "SCell Index 2 Status", - "mac-lte.control.activation-deactivation.c2", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x04, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_c1, - { - "SCell Index 1 Status", - "mac-lte.control.activation-deactivation.c1", FT_BOOLEAN, 8, - TFS(&mac_lte_scell_status_vals), 0x02, NULL, HFILL - } - }, - { - &hf_mac_lte_control_activation_deactivation_reserved, - { - "Reserved", - "mac-lte.control.activation-deactivation.reserved", FT_UINT8, BASE_DEC, - 0, 0x01, "Reserved bit, should be 0", HFILL - } - }, - - { - &hf_mac_lte_control_mch_scheduling_info, - { - "MCH Scheduling Information", - "mac-lte.control.mch_scheduling_info", FT_STRING, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_control_mch_scheduling_info_lcid, - { - "LCID", - "mac-lte.control.mch_scheduling_info.lcid", FT_UINT8, BASE_HEX, VALS(mch_lcid_vals), 0xf8, - "Logical Channel ID of the MTCH", HFILL - } - }, - { - &hf_mac_lte_control_mch_scheduling_info_stop_mtch, - { - "Stop MTCH", - "mac-lte.control.mch_scheduling_info.stop_mtch", FT_UINT16, BASE_DEC, 0, 0x07ff, - "Ordinal number of the subframe where the corresponding MTCH stops", HFILL - } - }, - - /* Generated fields */ - { - &hf_mac_lte_dl_harq_resend_original_frame, - { - "Frame with previous tx", - "mac-lte.dlsch.retx.original-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_dl_harq_resend_time_since_previous_frame, - { - "Time since previous tx (ms)", - "mac-lte.dlsch.retx.time-since-previous", FT_UINT16, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_dl_harq_resend_next_frame, - { - "Frame with next tx", - "mac-lte.dlsch.retx.next-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_dl_harq_resend_time_until_next_frame, - { - "Time until next tx (ms)", - "mac-lte.dlsch.retx.time-until-next", FT_UINT16, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - - { - &hf_mac_lte_ul_harq_resend_original_frame, - { - "Frame with previous tx", - "mac-lte.ulsch.retx.original-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_ul_harq_resend_time_since_previous_frame, - { - "Time since previous tx (ms)", - "mac-lte.ulsch.retx.time-since-previous", FT_UINT16, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_ul_harq_resend_next_frame, - { - "Frame with next tx", - "mac-lte.ulsch.retx.next-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_ul_harq_resend_time_until_next_frame, - { - "Time until next tx (ms)", - "mac-lte.ulsch.retx.time-until-next", FT_UINT16, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - - { - &hf_mac_lte_grant_answering_sr, - { - "First Grant Following SR from", - "mac-lte.ulsch.grant-answering-sr", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_failure_answering_sr, - { - "SR which failed", - "mac-lte.ulsch.failure-answering-sr", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sr_leading_to_failure, - { - "This SR fails", - "mac-lte.ulsch.failure-answering-sr-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sr_leading_to_grant, - { - "This SR results in a grant here", - "mac-lte.ulsch.grant-answering-sr-frame", FT_FRAMENUM, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sr_invalid_event, - { - "Invalid event", - "mac-lte.ulsch.sr-invalid-event", FT_NONE, BASE_NONE, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sr_time_since_request, - { - "Time since SR (ms)", - "mac-lte.ulsch.time-since-sr", FT_UINT32, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - { - &hf_mac_lte_sr_time_until_answer, - { - "Time until answer (ms)", - "mac-lte.ulsch.time-until-sr-answer", FT_UINT32, BASE_DEC, 0, 0x0, - NULL, HFILL - } - }, - - }; - - static gint *ett[] = { - &ett_mac_lte, - &ett_mac_lte_context, - &ett_mac_lte_phy_context, - &ett_mac_lte_rar_headers, - &ett_mac_lte_rar_header, - &ett_mac_lte_rar_body, - &ett_mac_lte_rar_ul_grant, - &ett_mac_lte_ulsch_header, - &ett_mac_lte_dlsch_header, - &ett_mac_lte_mch_header, - &ett_mac_lte_sch_subheader, - &ett_mac_lte_mch_subheader, - &ett_mac_lte_bch, - &ett_mac_lte_bsr, - &ett_mac_lte_pch, - &ett_mac_lte_activation_deactivation, - &ett_mac_lte_contention_resolution, - &ett_mac_lte_power_headroom, - &ett_mac_lte_extended_power_headroom, - &ett_mac_lte_extended_power_headroom_cell, - &ett_mac_lte_mch_scheduling_info, - &ett_mac_lte_oob - }; - - static enum_val_t show_info_col_vals[] = { - {"show-phy", "PHY Info", ShowPHYLayer}, - {"show-mac", "MAC Info", ShowMACLayer}, - {"show-rlc", "RLC Info", ShowRLCLayer}, - {NULL, NULL, -1} - }; - - static enum_val_t lcid_drb_source_vals[] = { - {"from-static-stable", "From static table", FromStaticTable}, - {"from-configuration-protocol", "From configuration protocol", FromConfigurationProtocol}, - {NULL, NULL, -1} - }; - - - module_t *mac_lte_module; - - static uat_field_t lcid_drb_mapping_flds[] = { - UAT_FLD_VS(lcid_drb_mappings, lcid, "lcid", drb_lcid_vals, "The MAC LCID"), - UAT_FLD_DEC(lcid_drb_mappings, drbid,"drb id (1-32)", "Identifier of logical data channel"), - UAT_FLD_VS(lcid_drb_mappings, channel_type, "RLC Channel Type", rlc_channel_type_vals, "The MAC LCID"), - UAT_END_FIELDS - }; - - /* Register protocol. */ - proto_mac_lte = proto_register_protocol("MAC-LTE", "MAC-LTE", "mac-lte"); - proto_register_field_array(proto_mac_lte, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - - /* Allow other dissectors to find this one by name. */ - register_dissector("mac-lte", dissect_mac_lte, proto_mac_lte); - - /* Register the tap name */ - mac_lte_tap = register_tap("mac-lte"); - - /* Preferences */ - mac_lte_module = prefs_register_protocol(proto_mac_lte, NULL); - - /* Obsolete preferences */ - prefs_register_obsolete_preference(mac_lte_module, "single_rar"); - prefs_register_obsolete_preference(mac_lte_module, "check_reserved_bits"); - prefs_register_obsolete_preference(mac_lte_module, "decode_rar_ul_grant"); - prefs_register_obsolete_preference(mac_lte_module, "show_rlc_info_column"); - prefs_register_obsolete_preference(mac_lte_module, "attempt_to_detect_dl_harq_resend"); - prefs_register_obsolete_preference(mac_lte_module, "attempt_to_track_ul_harq_resend"); - - prefs_register_uint_preference(mac_lte_module, "retx_count_warn", - "Number of Re-Transmits before expert warning triggered", - "Number of Re-Transmits before expert warning triggered", - 10, &global_mac_lte_retx_counter_trigger); - - prefs_register_bool_preference(mac_lte_module, "attempt_rrc_decode", - "Attempt to decode BCH, PCH and CCCH data using LTE RRC dissector", - "Attempt to decode BCH, PCH and CCCH data using LTE RRC dissector", - &global_mac_lte_attempt_rrc_decode); - - prefs_register_bool_preference(mac_lte_module, "attempt_to_dissect_crc_failures", - "Dissect frames that have failed CRC check", - "Attempt to dissect frames that have failed CRC check", - &global_mac_lte_dissect_crc_failures); - - prefs_register_bool_preference(mac_lte_module, "heuristic_mac_lte_over_udp", - "Try Heuristic LTE-MAC over UDP framing", - "When enabled, use heuristic dissector to find MAC-LTE frames sent with " - "UDP framing", - &global_mac_lte_heur); - - prefs_register_bool_preference(mac_lte_module, "attempt_to_dissect_srb_sdus", - "Attempt to dissect LCID 1&2 as srb1&2", - "Will call LTE RLC dissector with standard settings as per RRC spec", - &global_mac_lte_attempt_srb_decode); - - prefs_register_enum_preference(mac_lte_module, "lcid_to_drb_mapping_source", - "Source of LCID -> drb channel settings", - "Set whether LCID -> drb Table is taken from static table (below) or from " - "info learned from control protocol (e.g. RRC)", - &global_mac_lte_lcid_drb_source, lcid_drb_source_vals, FALSE); - - lcid_drb_mappings_uat = uat_new("Static LCID -> drb Table", - sizeof(lcid_drb_mapping_t), - "drb_logchans", - TRUE, - (void*) &lcid_drb_mappings, - &num_lcid_drb_mappings, - UAT_CAT_FFMT, - "", /* TODO: is this ref to help manual? */ - lcid_drb_mapping_copy_cb, - NULL, - NULL, - NULL, - lcid_drb_mapping_flds ); - - prefs_register_uat_preference(mac_lte_module, - "drb_table", - "LCID -> DRB Mappings Table", - "A table that maps from configurable lcids -> RLC logical channels", - lcid_drb_mappings_uat); - - prefs_register_uint_preference(mac_lte_module, "bsr_warn_threshold", - "BSR size when warning should be issued (0 - 63)", - "If any BSR report is >= this number, an expert warning will be added", - 10, &global_mac_lte_bsr_warn_threshold); - - prefs_register_bool_preference(mac_lte_module, "track_sr", - "Track status of SRs within UEs", - "Track status of SRs, providing links between requests, failure indications and grants", - &global_mac_lte_track_sr); - - prefs_register_enum_preference(mac_lte_module, "layer_to_show", - "Which layer info to show in Info column", - "Can show PHY, MAC or RLC layer info in Info column", - &global_mac_lte_layer_to_show, show_info_col_vals, FALSE); - - register_init_routine(&mac_lte_init_protocol); -} - - -/* Set LCID -> RLC channel mappings from signalling protocol (i.e. RRC or similar). - TODO: not using UEID yet - assume all UEs configured identically... */ -void set_mac_lte_channel_mapping(guint16 ueid _U_, guint8 lcid, - guint8 srbid, guint8 drbid, - guint8 rlcMode, guint8 um_sn_length, - guint8 ul_priority) -{ - /* Don't bother setting srb details - we just assume AM */ - if (srbid != 0) { - return; - } - - /* Ignore if LCID is out of range */ - if ((lcid < 3) || (lcid > 10)) { - return; - } - - /* Set array entry */ - dynamic_lcid_drb_mapping[lcid].valid = TRUE; - dynamic_lcid_drb_mapping[lcid].drbid = drbid; - dynamic_lcid_drb_mapping[lcid].ul_priority = ul_priority; - - switch (rlcMode) { - case RLC_AM_MODE: - dynamic_lcid_drb_mapping[lcid].channel_type = rlcAM; - break; - - case RLC_UM_MODE: - if (um_sn_length == 5) { - dynamic_lcid_drb_mapping[lcid].channel_type = rlcUM5; - } else { - dynamic_lcid_drb_mapping[lcid].channel_type = rlcUM10; - } - - break; - - default: - break; - } -} - -/* Return the configured UL priority for the channel */ -static guint8 get_mac_lte_channel_priority(guint16 ueid _U_, guint8 lcid, - guint8 direction) -{ - /* Priority only affects UL */ - if (direction == DIRECTION_DOWNLINK) { - return 0; - } - - /* Won't report value if channel not configured */ - if (!dynamic_lcid_drb_mapping[lcid].valid) { - return 0; - } else { - return dynamic_lcid_drb_mapping[lcid].ul_priority; - } -} - -/* Function to be called from outside this module (e.g. in a plugin) to get per-packet data */ -mac_lte_info *get_mac_lte_proto_data(packet_info *pinfo) -{ - return p_get_proto_data(pinfo->fd, proto_mac_lte); -} - -/* Function to be called from outside this module (e.g. in a plugin) to set per-packet data */ -void set_mac_lte_proto_data(packet_info *pinfo, mac_lte_info *p_mac_lte_info) -{ - p_add_proto_data(pinfo->fd, proto_mac_lte, p_mac_lte_info); -} - -void proto_reg_handoff_mac_lte(void) -{ - static dissector_handle_t mac_lte_handle; - - if (!mac_lte_handle) { - mac_lte_handle = find_dissector("mac-lte"); - - /* Add as a heuristic UDP dissector */ - heur_dissector_add("udp", dissect_mac_lte_heur, proto_mac_lte); - } -} - diff --git a/openair2/UTIL/OPT/packet-mac-lte.h b/openair2/UTIL/OPT/packet-mac-lte.h index d9c3105200..84c6254d9f 100644 --- a/openair2/UTIL/OPT/packet-mac-lte.h +++ b/openair2/UTIL/OPT/packet-mac-lte.h @@ -7,20 +7,6 @@ * By Gerald Combs * Copyright 1998 Gerald Combs * - * 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. - * * This header file may also be distributed under * the terms of the BSD Licence as follows: * diff --git a/openair2/UTIL/OPT/packet-rlc-lte.h b/openair2/UTIL/OPT/packet-rlc-lte.h deleted file mode 100755 index d31d015662..0000000000 --- a/openair2/UTIL/OPT/packet-rlc-lte.h +++ /dev/null @@ -1,150 +0,0 @@ -/* packet-rlc-lte.h - * - * Martin Mathieson - * $Id$ - * - * Wireshark - Network traffic analyzer - * By Gerald Combs - * Copyright 1998 Gerald Combs - * - * 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. - */ - -/* rlcMode */ -#define RLC_TM_MODE 1 -#define RLC_UM_MODE 2 -#define RLC_AM_MODE 4 -#define RLC_PREDEF 8 - -/* direction */ -#define DIRECTION_UPLINK 0 -#define DIRECTION_DOWNLINK 1 - -/* priority ? */ - -/* channelType */ -#define CHANNEL_TYPE_CCCH 1 -#define CHANNEL_TYPE_BCCH_BCH 2 -#define CHANNEL_TYPE_PCCH 3 -#define CHANNEL_TYPE_SRB 4 -#define CHANNEL_TYPE_DRB 5 -#define CHANNEL_TYPE_BCCH_DL_SCH 6 - -/* UMSequenceNumberLength */ -#define UM_SN_LENGTH_5_BITS 5 -#define UM_SN_LENGTH_10_BITS 10 - -/* Info attached to each LTE RLC frame */ -typedef struct rlc_lte_info { - guint8 rlcMode; - guint8 direction; - guint8 priority; - guint16 ueid; - guint16 channelType; - guint16 channelId; - guint16 pduLength; - guint8 UMSequenceNumberLength; -} rlc_lte_info; - - -typedef struct rlc_lte_tap_info { - /* Info from context */ - guint8 rlcMode; - guint8 direction; - guint8 priority; - guint16 ueid; - guint16 channelType; - guint16 channelId; - guint16 pduLength; - guint8 UMSequenceNumberLength; - - nstime_t time; - guint8 loggedInMACFrame; - guint16 sequenceNumber; - guint8 isResegmented; - guint8 isControlPDU; - guint16 ACKNo; -#define MAX_NACKs 128 - guint16 noOfNACKs; - guint16 NACKs[MAX_NACKs]; - - guint16 missingSNs; -} rlc_lte_tap_info; - - -/* Configure number of PDCP SN bits to use for DRB channels. */ -void set_rlc_lte_drb_pdcp_seqnum_length(guint16 ueid, guint8 drbid, guint8 userplane_seqnum_length); - - -/*****************************************************************/ -/* UDP framing format */ -/* ----------------------- */ -/* Several people have asked about dissecting RLC by framing */ -/* PDUs over IP. A suggested format over UDP has been defined */ -/* and implemented by this dissector, using the definitions */ -/* below. A link to an example program showing you how to encode */ -/* these headers and send LTE RLC PDUs on a UDP socket is */ -/* provided at http://wiki.wireshark.org/RLC-LTE */ -/* */ -/* A heuristic dissecter (enabled by a preference) will */ -/* recognise a signature at the beginning of these frames. */ -/* Until someone is using this format, suggestions for changes */ -/* are welcome. */ -/*****************************************************************/ - - -/* Signature. Rather than try to define a port for this, or make the - * port number a preference, frames will start with this string (with no - * terminating NULL */ -#define RLC_LTE_START_STRING "rlc-lte" - -/* Fixed field. This is followed by the following 1 mandatory field: - * - rlcMode (1 byte) - * (where the allowed values are defined above */ - -/* Conditional field. This field is mandatory in case of RLC Unacknowledged mode. - * The format is to have the tag, followed by the value (there is no length field, - * its implicit from the tag). The allowed values are defined above. */ - -#define RLC_LTE_UM_SN_LENGTH_TAG 0x02 -/* 1 byte */ - -/* Optional fields. Attaching this info to frames will allow you - * to show you display/filter/plot/add-custom-columns on these fields, so should - * be added if available. - * The format is to have the tag, followed by the value (there is no length field, - * its implicit from the tag) */ - -#define RLC_LTE_DIRECTION_TAG 0x03 -/* 1 byte */ - -#define RLC_LTE_PRIORITY_TAG 0x04 -/* 1 byte */ - -#define RLC_LTE_UEID_TAG 0x05 -/* 2 bytes, network order */ - -#define RLC_LTE_CHANNEL_TYPE_TAG 0x06 -/* 2 bytes, network order */ - -#define RLC_LTE_CHANNEL_ID_TAG 0x07 -/* 2 bytes, network order */ - - -/* RLC PDU. Following this tag comes the actual RLC PDU (there is no length, the PDU - * continues until the end of the frame) */ -#define RLC_LTE_PAYLOAD_TAG 0x01 - - diff --git a/openair2/UTIL/OPT/probe.c b/openair2/UTIL/OPT/probe.c index eef98ae729..ebc52bb1e0 100644 --- a/openair2/UTIL/OPT/probe.c +++ b/openair2/UTIL/OPT/probe.c @@ -29,36 +29,6 @@ * SUCH DAMAGE */ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - - /*! \file probe.c * \brief * \author navid nikaein @@ -189,7 +159,7 @@ static void *opt_listener_thread(void *arg) pthread_exit(NULL); } else { /* Normal read -> discard PDU */ - LOG_D(OPT, "Incoming data received from: %s:%u with length %d\n", + LOG_D(OPT, "Incoming data received from: %s:%u with length %zd\n", inet_ntoa(opt_listener.address.sin_addr), ntohs(opt_listener.address.sin_port), ret); } @@ -228,7 +198,9 @@ int opt_create_listener_socket(char *ip_address, uint16_t port) ret = bind(opt_listener.sd, (struct sockaddr*) &opt_listener.address, sizeof(opt_listener.address)); if (ret != 0) { - LOG_E(OPT, "Failed to bind socket to (%s:%u): %s\n", strerror(errno)); + LOG_E(OPT, "Failed to bind socket to (%s:%u): %s\n", + inet_ntoa(opt_listener.address.sin_addr), + ntohs(opt_listener.address.sin_port), strerror(errno)); opt_type = OPT_NONE; close(opt_listener.sd); opt_listener.sd = -1; @@ -260,7 +232,7 @@ int opt_create_listener_socket(char *ip_address, uint16_t port) */ /* Add framing header to MAC PDU and send. */ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, - guint16 rnti, guint16 ueid, guint16 subframeNumber, + guint16 rnti, guint16 ueid, guint16 sfnSf, guint8 isPredefinedData, guint8 retx, guint8 crcStatus, guint8 oob_event, guint8 oob_event_value, uint8_t *pdu_buffer, unsigned int pdu_buffer_size) @@ -308,7 +280,7 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, /* Subframe number */ frameBuffer[frameOffset++] = MAC_LTE_SUBFRAME_TAG; - tmp16 = htons(subframeNumber); // frame counter : this will give an expert info as wireshark expects SF and not F + tmp16 = htons(sfnSf); // frame counter : this will give an expert info as wireshark expects SF and not F memcpy(frameBuffer+frameOffset, &tmp16, 2); frameOffset += 2; @@ -317,7 +289,7 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, #ifdef WIRESHARK_DEV frameOffset += 2; - tmp16 = htons(subframeNumber); // subframe + tmp16 = htons(sfnSf); // subframe memcpy(frameBuffer+frameOffset, &tmp16, 2); frameOffset += 2; #endif @@ -334,19 +306,25 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, frameBuffer[frameOffset++] = retx; } -#ifdef WIRESHARK_DEV +//#ifdef WIRESHARK_DEV /* Relating to out-of-band events */ /* N.B. dissector will only look to these fields if length is 0... */ if (pdu_buffer_size==0) { switch (oob_event) { case ltemac_send_preamble : - LOG_D(OPT,"oob event %d %d\n",ltemac_send_preamble ); + LOG_D(OPT,"oob ltemac_send_preamble event %02x." + //"%02x." + "%02x.%02x\n", + MAC_LTE_OOB_EVENT_TAG, + //ltemac_send_preamble, + rnti, + oob_event_value); //frameBuffer[frameOffset++]=0; //frameBuffer[frameOffset++]=0; //frameBuffer[frameOffset++]=0; frameBuffer[frameOffset++] = MAC_LTE_OOB_EVENT_TAG; - frameBuffer[frameOffset++]=ltemac_send_preamble; + //frameBuffer[frameOffset++]=ltemac_send_preamble; frameBuffer[frameOffset++]=rnti; // is the preamble frameBuffer[frameOffset++]=oob_event_value; break; @@ -359,12 +337,12 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, case ltemac_sr_failure: default: - LOG_D(OPT,"not implemeneted yet\n"); + LOG_W(OPT,"not implemeneted yet\n"); break; } } -#endif +//#endif /***************************************/ /* Now write the MAC PDU */ frameBuffer[frameOffset++] = MAC_LTE_PAYLOAD_TAG; @@ -382,7 +360,7 @@ static void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, (const struct sockaddr *)&g_serv_addr, sizeof(g_serv_addr)); if (bytesSent != frameOffset) { - LOG_W(OPT, "sendto() failed (not a thread-safe func)- expected %d bytes, got %d (errno=%d)\n", + LOG_W(OPT, "sendto() failed (not a thread-safe func)- expected %d bytes, got %ld (errno=%d)\n", frameOffset, bytesSent, errno); //exit(1); } @@ -432,18 +410,8 @@ static int MAC_LTE_PCAP_WritePDU(MAC_Context_Info_t *context, /* PCAP Header */ /* TODO: Timestamp might want to be relative to a more sensible base time... */ -#if defined(RTAI) - { - unsigned long long int current_ns; - - current_ns = rt_get_time_ns(); - packet_header.ts_sec = current_ns / 1000000000UL; - packet_header.ts_usec = current_ns % 1000; - } -#else packet_header.ts_sec = context->subframesSinceCaptureStart / 1000; packet_header.ts_usec = (context->subframesSinceCaptureStart % 1000) * 1000; -#endif packet_header.incl_len = offset + length; packet_header.orig_len = offset + length; @@ -458,7 +426,7 @@ static int MAC_LTE_PCAP_WritePDU(MAC_Context_Info_t *context, /* Remote serveraddress (where Wireshark is running) */ void trace_pdu(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, - int ueid, int rntiType, int rnti, uint8_t subframe, int oob_event, + int ueid, int rntiType, int rnti, uint16_t sysFrameNumber, uint8_t subFrameNumber, int oob_event, int oob_event_value) { MAC_Context_Info_t pdu_context; @@ -471,7 +439,7 @@ void trace_pdu(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, SendFrame(radio_type, (direction == DIRECTION_DOWNLINK) ? DIRECTION_DOWNLINK : DIRECTION_UPLINK, - rntiType, rnti, ueid, subframe, + rntiType, rnti, ueid, (sysFrameNumber<<4) + subFrameNumber, 1, 0, 1, //guint8 isPredefinedData, guint8 retx, guint8 crcStatus oob_event,oob_event_value, pdu_buffer, pdu_buffer_size); @@ -490,8 +458,8 @@ void trace_pdu(int direction, uint8_t *pdu_buffer, unsigned int pdu_buffer_size, pdu_context.ueid = ueid; pdu_context.isRetx = 0; pdu_context.crcStatusOK =1; - pdu_context.sysFrameNumber = subframe; - pdu_context.subFrameNumber = 0; + pdu_context.sysFrameNumber = sysFrameNumber; + pdu_context.subFrameNumber = subFrameNumber; pdu_context.subframesSinceCaptureStart = subframesSinceCaptureStart++; MAC_LTE_PCAP_WritePDU( &pdu_context, pdu_buffer, pdu_buffer_size); break; diff --git a/openair2/UTIL/OPT/socket_sender.c b/openair2/UTIL/OPT/socket_sender.c deleted file mode 100644 index c984895351..0000000000 --- a/openair2/UTIL/OPT/socket_sender.c +++ /dev/null @@ -1,28 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ diff --git a/openair2/UTIL/OPT/vars.h b/openair2/UTIL/OPT/vars.h index 4e03467537..0da315aa8b 100644 --- a/openair2/UTIL/OPT/vars.h +++ b/openair2/UTIL/OPT/vars.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*____________________________OPT/var.h___________________________ Authors: Navid NIKAIEN diff --git a/openair2/UTIL/OSA/COPYING b/openair2/UTIL/OSA/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/OSA/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/OSA/osa_defs.h b/openair2/UTIL/OSA/osa_defs.h index c11f93d2bb..4812d82d91 100644 --- a/openair2/UTIL/OSA/osa_defs.h +++ b/openair2/UTIL/OSA/osa_defs.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! * \file secu_defs.h diff --git a/openair2/UTIL/OSA/osa_internal.h b/openair2/UTIL/OSA/osa_internal.h index a42f925322..1f5aab5df8 100644 --- a/openair2/UTIL/OSA/osa_internal.h +++ b/openair2/UTIL/OSA/osa_internal.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef OSA_INTERNAL_H_ #define OSA_INTERNAL_H_ diff --git a/openair2/UTIL/OSA/osa_key_deriver.c b/openair2/UTIL/OSA/osa_key_deriver.c index d8b5fba58b..cf181b7a99 100644 --- a/openair2/UTIL/OSA/osa_key_deriver.c +++ b/openair2/UTIL/OSA/osa_key_deriver.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include diff --git a/openair2/UTIL/OSA/osa_rijndael.c b/openair2/UTIL/OSA/osa_rijndael.c index ac9f3fd18b..cbcbdab5be 100644 --- a/openair2/UTIL/OSA/osa_rijndael.c +++ b/openair2/UTIL/OSA/osa_rijndael.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include /* Rijndael S-box OSA_SR */ diff --git a/openair2/UTIL/OSA/osa_rijndael.h b/openair2/UTIL/OSA/osa_rijndael.h index bcb6512635..8c802b1247 100644 --- a/openair2/UTIL/OSA/osa_rijndael.h +++ b/openair2/UTIL/OSA/osa_rijndael.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #ifndef OSA_RIJNDAEL_H_ #define OSA_RIJNDAEL_H_ /* Rijndael S-box SR */ diff --git a/openair2/UTIL/OSA/osa_snow3g.c b/openair2/UTIL/OSA/osa_snow3g.c index e7ff804699..c69e80a1fb 100644 --- a/openair2/UTIL/OSA/osa_snow3g.c +++ b/openair2/UTIL/OSA/osa_snow3g.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/openair2/UTIL/OSA/osa_snow3g.h b/openair2/UTIL/OSA/osa_snow3g.h index 69a835e60d..5da81d23f3 100644 --- a/openair2/UTIL/OSA/osa_snow3g.h +++ b/openair2/UTIL/OSA/osa_snow3g.h @@ -1,33 +1,24 @@ -/******************************************************************************* +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - Eurecom OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fr/openairinterface - Address : EURECOM, Campus SophiaTech, 450 Route des Chappes - 06410 Biot FRANCE - - -*******************************************************************************/ /*! \file snow3g.h * \brief * \author Open source Adapted from Specification of the 3GPP Confidentiality and diff --git a/openair2/UTIL/OSA/osa_stream_eea.c b/openair2/UTIL/OSA/osa_stream_eea.c index 8e346631ec..e922ed3c86 100644 --- a/openair2/UTIL/OSA/osa_stream_eea.c +++ b/openair2/UTIL/OSA/osa_stream_eea.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -199,8 +191,13 @@ int stream_encrypt_eea2(stream_cipher_t *stream_cipher, uint8_t **out) } #endif +#if NETTLE_VERSION_MAJOR < 3 nettle_aes128.set_encrypt_key(ctx, stream_cipher->key_length, stream_cipher->key); +#else + nettle_aes128.set_encrypt_key(ctx, + stream_cipher->key); +#endif nettle_ctr_crypt(ctx, nettle_aes128.encrypt, nettle_aes128.block_size, m, diff --git a/openair2/UTIL/OSA/osa_stream_eia.c b/openair2/UTIL/OSA/osa_stream_eia.c index 22ad10d25d..e58e280ef7 100644 --- a/openair2/UTIL/OSA/osa_stream_eia.c +++ b/openair2/UTIL/OSA/osa_stream_eia.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include diff --git a/openair2/UTIL/OSD/COPYING b/openair2/UTIL/OSD/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/OSD/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/OSD/recep.php b/openair2/UTIL/OSD/recep.php index 2f0ef226b4..eb1036acad 100644 --- a/openair2/UTIL/OSD/recep.php +++ b/openair2/UTIL/OSD/recep.php @@ -1,32 +1,24 @@ - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/OTG/main.c b/openair2/UTIL/OTG/main.c index d52a9258ff..1ee9b0edd7 100644 --- a/openair2/UTIL/OTG/main.c +++ b/openair2/UTIL/OTG/main.c @@ -1,31 +1,23 @@ -/******************************************************************************* - - Eurecom OpenAirInterface - Copyright(c) 1999 - 2011 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fsr/openairinterface - Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file main.c * \brief main program for OTG CX + RX diff --git a/openair2/UTIL/OTG/otg.c b/openair2/UTIL/OTG/otg.c index e167eb7b45..04e0463971 100644 --- a/openair2/UTIL/OTG/otg.c +++ b/openair2/UTIL/OTG/otg.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg.c * \brief common function for otc tx and rx diff --git a/openair2/UTIL/OTG/otg.h b/openair2/UTIL/OTG/otg.h index 4c3f5bf8d9..7938a2a0d7 100644 --- a/openair2/UTIL/OTG/otg.h +++ b/openair2/UTIL/OTG/otg.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg.h * \brief Data structure and functions for OTG diff --git a/openair2/UTIL/OTG/otg_config.h b/openair2/UTIL/OTG/otg_config.h index 7e0e014375..2302c71f00 100644 --- a/openair2/UTIL/OTG/otg_config.h +++ b/openair2/UTIL/OTG/otg_config.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_config.h main used structures * \brief otg structure diff --git a/openair2/UTIL/OTG/otg_defs.h b/openair2/UTIL/OTG/otg_defs.h index c6cee01ec2..fad0d9510e 100644 --- a/openair2/UTIL/OTG/otg_defs.h +++ b/openair2/UTIL/OTG/otg_defs.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_defs.h main used structures * \brief otg structure @@ -41,12 +33,12 @@ #ifndef __OTG_DEFS_H__ # define __OTG_DEFS_H__ - +/* \brief To define the NUMBER_OF_eNB_MAX and NUMBER_OF_UE_MAX */ #if STANDALONE==1 -# define NUMBER_OF_eNB_MAX 3 -# define NUMBER_OF_UE_MAX 3 + #include "openairinterface5g_limits.h" #else -#include "PHY/impl_defs_top.h" /* \brief To define the NUMBER_OF_eNB_MAX and NUMBER_OF_UE_MAX */ + // impl_defs_top.h includes openairinterface5g_limits.h + #include "PHY/impl_defs_top.h" #endif #include "otg_config.h" diff --git a/openair2/UTIL/OTG/otg_externs.h b/openair2/UTIL/OTG/otg_externs.h index 7ceccfce35..ea5943888f 100644 --- a/openair2/UTIL/OTG/otg_externs.h +++ b/openair2/UTIL/OTG/otg_externs.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_externs.h * \brief extern parameters diff --git a/openair2/UTIL/OTG/otg_form.c b/openair2/UTIL/OTG/otg_form.c index db77c6a801..6994e65896 100644 --- a/openair2/UTIL/OTG/otg_form.c +++ b/openair2/UTIL/OTG/otg_form.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_config.h main used structures * \brief otg structure diff --git a/openair2/UTIL/OTG/otg_form.h b/openair2/UTIL/OTG/otg_form.h index 153ec75b32..1292184bde 100644 --- a/openair2/UTIL/OTG/otg_form.h +++ b/openair2/UTIL/OTG/otg_form.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __OTG_FORM_H__ # define __OTG_FORM_H__ diff --git a/openair2/UTIL/OTG/otg_kpi.c b/openair2/UTIL/OTG/otg_kpi.c index 877150d892..94a0a53d5c 100644 --- a/openair2/UTIL/OTG/otg_kpi.c +++ b/openair2/UTIL/OTG/otg_kpi.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_kpi.c main used funstions to compute KPIs * \brief define KPIs to compute for performance analysis @@ -224,7 +216,7 @@ void average_total_jitter(void) } } - LOG_I(OTG,"average_jitter_dl %d average_jitter_ul %lf \n",otg_info->average_jitter_dl,otg_info->average_jitter_ul ); + LOG_I(OTG,"average_jitter_dl %lf average_jitter_ul %lf \n",otg_info->average_jitter_dl,otg_info->average_jitter_ul ); // otg_info->average_jitter_dl/= (float)NB_UE_INST; // otg_info->average_jitter_ul/= (float)NB_UE_INST; } diff --git a/openair2/UTIL/OTG/otg_kpi.h b/openair2/UTIL/OTG/otg_kpi.h index c4ea232d87..2273d10c72 100644 --- a/openair2/UTIL/OTG/otg_kpi.h +++ b/openair2/UTIL/OTG/otg_kpi.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_kpi.h functions to compute OTG KPIs * \brief desribe function for KPIs computation diff --git a/openair2/UTIL/OTG/otg_models.c b/openair2/UTIL/OTG/otg_models.c index e671160444..d866713ecb 100644 --- a/openair2/UTIL/OTG/otg_models.c +++ b/openair2/UTIL/OTG/otg_models.c @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_models.c * \brief function containing the OTG TX traffic generation functions diff --git a/openair2/UTIL/OTG/otg_models.h b/openair2/UTIL/OTG/otg_models.h index 51944fc15e..03b139d658 100644 --- a/openair2/UTIL/OTG/otg_models.h +++ b/openair2/UTIL/OTG/otg_models.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_models.h * \brief Data structure and functions for OTG diff --git a/openair2/UTIL/OTG/otg_rx.c b/openair2/UTIL/OTG/otg_rx.c index 3f0d35d223..bcdcc5e35c 100644 --- a/openair2/UTIL/OTG/otg_rx.c +++ b/openair2/UTIL/OTG/otg_rx.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_rx.c * \brief function containing the OTG traffic generation functions @@ -56,10 +48,11 @@ extern unsigned char NB_UE_INST; //#include "LAYER2/MAC/extern.h" +#undef MAX #define MAX(x,y) ((x)>(y)?(x):(y)) +#undef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) - // Check if the packet is well received or not and extract data int otg_rx_pkt(const int dst_instanceP, const int ctime, const char * const buffer_tx, const unsigned int size) { @@ -114,8 +107,10 @@ int otg_rx_pkt(const int dst_instanceP, const int ctime, const char * const buff if (dst_instance != dst_instanceP) { //#warning "LG: TODO think about multicast traffic" - LOG_W(OTG,"[SRC %d][DST %d] [FLOW_idx %d][APP TYPE %d] RX INFO pkt at time %d: flag 0x %x, seq number %d, tx time %d, size (hdr %d, pdcp %d) not for dest instance %u\n", - dst_instanceP); + /* TODO: fix this LOG, a lot of missing parameters, replaced by a simple basic version */ + /*LOG_W(OTG,"[SRC %d][DST %d] [FLOW_idx %d][APP TYPE %d] RX INFO pkt at time %d: flag 0x %x, seq number %d, tx time %d, size (hdr %d, pdcp %d) not for dest instance %u\n", + dst_instanceP);*/ + LOG_W(OTG,"dst_instance != dst_instanceP\n"); } if(otg_hdr_rx->traffic_type > MAX_NUM_APPLICATION) { @@ -254,7 +249,7 @@ int otg_rx_pkt(const int dst_instanceP, const int ctime, const char * const buff ctime - otg_hdr_rx->time, nb_loss_pkts); - LOG_I(OTG,"INFO LATENCY :: [SRC %d][DST %d] radio access %.2f (tx time %d, ctime %d), OWD:%.2f (ms):\n", + LOG_I(OTG,"INFO LATENCY :: [SRC %d][DST %d] radio access %.2f (tx time %d, ctime %d), OWD:%d (ms):\n", src_instance, dst_instance, otg_multicast_info->radio_access_delay[src_instance][dst_instance], diff --git a/openair2/UTIL/OTG/otg_rx.h b/openair2/UTIL/OTG/otg_rx.h index 21c6fd85cb..770d053ada 100644 --- a/openair2/UTIL/OTG/otg_rx.h +++ b/openair2/UTIL/OTG/otg_rx.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_rx.h * \brief Data structure and functions for OTG receiver diff --git a/openair2/UTIL/OTG/otg_rx_socket.c b/openair2/UTIL/OTG/otg_rx_socket.c index e9d2e8a863..88ecd3e904 100644 --- a/openair2/UTIL/OTG/otg_rx_socket.c +++ b/openair2/UTIL/OTG/otg_rx_socket.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_rx_socket.c * \brief function containing the OTG RX traffic generation functions with sockets @@ -106,7 +98,7 @@ void *recv_ip4_tcp(void* csock) LOG_I(OTG,"SOCKET:: TCP-IP4 :: size=%d received=%d, Received buffer: %s \n\n\n", strlen(buffer), sock_rcv, buffer); - buffer[PAYLOAD_MAX] != '\0'; + //buffer[PAYLOAD_MAX] != '\0'; } diff --git a/openair2/UTIL/OTG/otg_rx_socket.h b/openair2/UTIL/OTG/otg_rx_socket.h index 0128269270..e7062aaf58 100644 --- a/openair2/UTIL/OTG/otg_rx_socket.h +++ b/openair2/UTIL/OTG/otg_rx_socket.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_rx_socket.h * \brief brief explain how this block is organized, and how it works: OTG RX traffic generation functions with sockets diff --git a/openair2/UTIL/OTG/otg_tx.c b/openair2/UTIL/OTG/otg_tx.c index e70bccbc73..ac3ffd0fb2 100644 --- a/openair2/UTIL/OTG/otg_tx.c +++ b/openair2/UTIL/OTG/otg_tx.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_tx.c * \brief function containing the OTG TX traffic generation functions @@ -270,13 +262,14 @@ unsigned char *packet_gen( char *header=NULL; int header_size = 0; - + //LOG_I(OTG,"Src: %d - Dest: %d - before exit\n",src_instance,dst_instance); // check if the app is configured if (app >= g_otg->application_idx[src_instance][dst_instance]) { + //LOG_I(OTG,"Src: %d - Dest: %d - no packet to generate - no application\n",src_instance,dst_instance); return NULL; } - LOG_T(OTG,"[src %d] [dst %d ][APP %d] current time %d\n",src_instance, dst_instance, app, ctime); + //LOG_I(OTG,"[src %d] [dst %d ][APP %d] current time %d\n",src_instance, dst_instance, app, ctime); *pkt_size=0; init_packet_gen(src_instance, dst_instance,ctime); @@ -312,10 +305,10 @@ unsigned char *packet_gen( otg_info->tx_num_pkt[src_instance][dst_instance][otg_info->traffic_type[src_instance][dst_instance]]+=1; if (size!=strlen(payload)) - LOG_E(OTG,"[%d][%d] [0x %x] The expected packet size does not match the payload size : size %d, strlen %d, seq_num %d packet: |%s|%s| \n", + LOG_E(OTG,"[%d][%d] [0x %x] The expected packet size does not match the payload size : size %d, strlen %zu, seq_num %d packet: |%s|%s| \n", src_instance, dst_instance, flag, size, strlen(payload), seq_num, header, payload); else - LOG_D(OTG,"[%d][%d] 0x %x][m2m Aggre %d][Flow %d][Type %d/%s] TX INFO pkt at time %d Size= [payload %d] [Total %d] with seq num %d, state=%d : |%s|%s| \n", + LOG_D(OTG,"[%d][%d] 0x %x][m2m Aggre %d][Flow %d][Type %d/%s] TX INFO pkt at time %d Size= [payload %d] [Total %zu] with seq num %d, state=%d : |%s|%s| \n", src_instance, dst_instance, flag, otg_info->m2m_aggregation[src_instance][dst_instance], otg_info->flow_id[src_instance][dst_instance], @@ -342,7 +335,7 @@ unsigned char *packet_gen( otg_info->seq_num_background[src_instance][dst_instance]+=1; if (otg_info->size_background[src_instance][dst_instance]!=strlen(payload)) - LOG_E(OTG,"[%d][%d] [0x %x] The expected packet size does not match the payload size : size %d, strlen %d, seq num %d, packet |%s|%s| \n", + LOG_E(OTG,"[%d][%d] [0x %x] The expected packet size does not match the payload size : size %d, strlen %zu, seq num %d, packet |%s|%s| \n", src_instance, dst_instance, flag, @@ -352,7 +345,7 @@ unsigned char *packet_gen( header, payload); else - LOG_D(OTG,"[%d][%d][%s][0x %x] TX INFO pkt at time %d size is %d with seq num %d, state=%d : |%s|%s| \n", + LOG_D(OTG,"[%d][%d][0x %x][%d] TX INFO pkt at time %s size is %d with seq num %d, state=%d : |%s|%s| \n", src_instance, dst_instance, flag, @@ -466,10 +459,10 @@ unsigned char *packet_gen_multicast( otg_multicast_info->tx_num_bytes[src_instance][dst_instance][app]); if (size!=strlen(payload)) - LOG_E(OTG,"[src %d][dst %d] The expected packet size does not match the payload size : size %d, strlen %d \n", + LOG_E(OTG,"[src %d][dst %d] The expected packet size does not match the payload size : size %d, strlen %zu \n", src_instance, dst_instance, size, strlen(payload)); else { - LOG_I(OTG,"[src %d][dst %d]TX INFO pkt at time %d Size= [payload %d] [Total %d] with seq num %d: |%s|%s| \n", + LOG_I(OTG,"[src %d][dst %d]TX INFO pkt at time %d Size= [payload %d] [Total %zu] with seq num %d: |%s|%s| \n", src_instance, dst_instance, ctime, @@ -845,7 +838,7 @@ unsigned int header_size(const int hdr_size) if (hdr_size>(sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t))) size-=(sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t)); else - LOG_W(OTG,"OTG Header not included inside packet header (OTG header:%d, Header%d)\n", hdr_size, sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t) ); + LOG_W(OTG,"OTG Header not included inside packet header (OTG header:%d, Header%zu)\n", hdr_size, sizeof(otg_hdr_info_t) + sizeof(otg_hdr_t) ); return(size); @@ -1218,7 +1211,7 @@ void init_predef_traffic( break; case M2M_TRAFFIC : /* example of M2M traffic */ - LOG_I(OTG," M2M_TRAFFIC, src = %d, dst = %d \n", i, j, g_otg->application_type[i][j][k]); + LOG_I(OTG," M2M_TRAFFIC, src = %d, dst = %d, application type = %d\n", i, j, g_otg->application_type[i][j][k]); g_otg->trans_proto[i][j][k] = TCP; g_otg->ip_v[i][j][k] = IPV4; g_otg->pu_size_pkts[i][j][k]=50; @@ -2022,7 +2015,7 @@ void state_management( && (otg_info->state_transition_prob[src_instance][dst_instance][application]<=1)) && (otg_info->c_holding_time_off[src_instance][dst_instance]>=g_otg->holding_time_off_pe[src_instance][dst_instance])) { otg_info->state[src_instance][dst_instance][application]=PE_STATE; - LOG_I(OTG,"[%d][%d][Appli id %d][Agg Level=%d] NEW STATE:: OFF-->PE \n", src_instance, dst_instance,application, g_otg->aggregation_level[src_instance][dst_instance]); + LOG_I(OTG,"[%d][%d][Appli id %d][Agg Level=%d] NEW STATE:: OFF-->PE \n", src_instance, dst_instance,application, g_otg->aggregation_level[src_instance][dst_instance][application]); otg_info->state_transition_prob[src_instance][dst_instance][application]=uniform_dist(0,1); } else { diff --git a/openair2/UTIL/OTG/otg_tx.h b/openair2/UTIL/OTG/otg_tx.h index 26013dfe47..c5b0c01dfc 100644 --- a/openair2/UTIL/OTG/otg_tx.h +++ b/openair2/UTIL/OTG/otg_tx.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_tx.h * \brief Data structure and functions for OTG diff --git a/openair2/UTIL/OTG/otg_tx_socket.c b/openair2/UTIL/OTG/otg_tx_socket.c index 60b9df020c..026dc3e8b8 100644 --- a/openair2/UTIL/OTG/otg_tx_socket.c +++ b/openair2/UTIL/OTG/otg_tx_socket.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_tx_socket.c * \brief function containing the OTG TX traffic generation functions with sockets diff --git a/openair2/UTIL/OTG/otg_tx_socket.h b/openair2/UTIL/OTG/otg_tx_socket.h index 2c5372773f..17568244fa 100644 --- a/openair2/UTIL/OTG/otg_tx_socket.h +++ b/openair2/UTIL/OTG/otg_tx_socket.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_tx_socket.h * \brief brief explain how this block is organized, and how it works: OTG TX traffic generation functions with sockets diff --git a/openair2/UTIL/OTG/otg_vars.h b/openair2/UTIL/OTG/otg_vars.h index cc4c56ce9e..a6bb48af54 100644 --- a/openair2/UTIL/OTG/otg_vars.h +++ b/openair2/UTIL/OTG/otg_vars.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file otg_vars.h * \brief Global structure diff --git a/openair2/UTIL/OTG/traffic_config.h b/openair2/UTIL/OTG/traffic_config.h index 3e982b1742..2f47682706 100644 --- a/openair2/UTIL/OTG/traffic_config.h +++ b/openair2/UTIL/OTG/traffic_config.h @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ //IDT DISTRIBUTION PARAMETERS #define IDT_DIST GAUSSIAN diff --git a/openair2/UTIL/SCTP/COPYING b/openair2/UTIL/SCTP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/SCTP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/TIMER/COPYING b/openair2/UTIL/TIMER/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/TIMER/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/TIMER/umts_timer.c b/openair2/UTIL/TIMER/umts_timer.c old mode 100755 new mode 100644 index 9562aee67d..9bbb6c2df9 --- a/openair2/UTIL/TIMER/umts_timer.c +++ b/openair2/UTIL/TIMER/umts_timer.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*************************************************************************** umts_timer.c - description @@ -62,7 +54,7 @@ umts_timer_check_time_out (list2_t * atimer_listP, uint32_t current_frame_tick_m mem_unit = list2_remove_head (atimer_listP); (*(timer->proc)) (timer->protocol, timer->timer_id); - free_mem_block (mem_unit); + free_mem_block (mem_unit, __func__); mem_unit = atimer_listP->head; } else { @@ -82,7 +74,7 @@ umts_timer_delete_timer (list2_t * atimer_listP, void *timer_idP) while ((mem_unit)) { if (((struct timer_unit *) (mem_unit->data))->timer_id == timer_idP) { list2_remove_element (mem_unit, atimer_listP); - free_mem_block (mem_unit); + free_mem_block (mem_unit, __func__); return; } @@ -101,7 +93,7 @@ umts_add_timer_list_up (list2_t * atimer_listP, void (*procP) (void *, void *), int32_t remaining_time; uint8_t inserted = 0; - mb = get_free_mem_block (sizeof (struct timer_unit)); + mb = get_free_mem_block (sizeof (struct timer_unit), __func__); ((struct timer_unit *) (mb->data))->proc = procP; ((struct timer_unit *) (mb->data))->protocol = protocolP; ((struct timer_unit *) (mb->data))->timer_id = timer_idP; @@ -174,7 +166,7 @@ umts_stop_all_timers_except (list2_t * atimer_listP, void (*procP) (void *, void mem_unit_to_delete = mem_unit; mem_unit = mem_unit->next; list2_remove_element (mem_unit_to_delete, atimer_listP); - free_mem_block (mem_unit_to_delete); + free_mem_block (mem_unit_to_delete, __func__); } else { mem_unit = mem_unit->next; } diff --git a/openair2/UTIL/TIMER/umts_timer.h b/openair2/UTIL/TIMER/umts_timer.h old mode 100755 new mode 100644 index a857244ddf..077b55cf0c --- a/openair2/UTIL/TIMER/umts_timer.h +++ b/openair2/UTIL/TIMER/umts_timer.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*************************************************************************** umts_timer.h - description diff --git a/openair2/UTIL/TIMER/umts_timer_proto_extern.h b/openair2/UTIL/TIMER/umts_timer_proto_extern.h old mode 100755 new mode 100644 index ca50d3193f..b43b347e46 --- a/openair2/UTIL/TIMER/umts_timer_proto_extern.h +++ b/openair2/UTIL/TIMER/umts_timer_proto_extern.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*************************************************************************** umts_timer_proto_extern.h - description diff --git a/openair2/UTIL/TIMER/umts_timer_struct.h b/openair2/UTIL/TIMER/umts_timer_struct.h old mode 100755 new mode 100644 index 46b7216cd9..c4886c7f80 --- a/openair2/UTIL/TIMER/umts_timer_struct.h +++ b/openair2/UTIL/TIMER/umts_timer_struct.h @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*************************************************************************** umts_timer_struct.h - description diff --git a/openair2/UTIL/TRACE/COPYING b/openair2/UTIL/TRACE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/UTIL/TRACE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/UTIL/TRACE/fifo_printf.c b/openair2/UTIL/TRACE/fifo_printf.c old mode 100755 new mode 100644 index 2c5f5202f9..2dc4da0637 --- a/openair2/UTIL/TRACE/fifo_printf.c +++ b/openair2/UTIL/TRACE/fifo_printf.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * fifo_printf.c diff --git a/openair2/UTIL/TRACE/fifo_printf.h b/openair2/UTIL/TRACE/fifo_printf.h old mode 100755 new mode 100644 index 84571e355c..ce2702b19a --- a/openair2/UTIL/TRACE/fifo_printf.h +++ b/openair2/UTIL/TRACE/fifo_printf.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*************************************************************************** fifo_printf.h - description diff --git a/openair2/UTIL/TRACE/fifo_printf_proto_extern.h b/openair2/UTIL/TRACE/fifo_printf_proto_extern.h old mode 100755 new mode 100644 index 66456af305..0855a8da93 --- a/openair2/UTIL/TRACE/fifo_printf_proto_extern.h +++ b/openair2/UTIL/TRACE/fifo_printf_proto_extern.h @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*************************************************************************** fifo_printf_proto_extern.h - description diff --git a/openair2/UTIL/TRACE/print.h b/openair2/UTIL/TRACE/print.h old mode 100755 new mode 100644 index 2c465e0fa5..72c43f20d4 --- a/openair2/UTIL/TRACE/print.h +++ b/openair2/UTIL/TRACE/print.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*************************************************************************** print.h - description @@ -36,14 +28,5 @@ ***************************************************************************/ #ifndef __PRINT_H__ # define __PRINT_H__ -# ifdef USER_MODE -# define msg printf -# else -# ifdef FIFO_PRINTF -# include "fifo_printf_proto_extern.h" -# define msg fifo_printf -# else -# define msg fifo_printf_null -# endif -# endif +# define msg printf #endif diff --git a/openair2/UTIL/queue.h b/openair2/UTIL/queue.h deleted file mode 100644 index f8665c0f1a..0000000000 --- a/openair2/UTIL/queue.h +++ /dev/null @@ -1,592 +0,0 @@ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)queue.h 8.5 (Berkeley) 8/20/94 - */ - -#ifndef _SYS_QUEUE_H_ -#define _SYS_QUEUE_H_ - -/* - * This file defines five types of data structures: singly-linked lists, - * lists, simple queues, tail queues, and circular queues. - * - * A singly-linked list is headed by a single forward pointer. The - * elements are singly linked for minimum space and pointer manipulation - * overhead at the expense of O(n) removal for arbitrary elements. New - * elements can be added to the list after an existing element or at the - * head of the list. Elements being removed from the head of the list - * should use the explicit macro for this purpose for optimum - * efficiency. A singly-linked list may only be traversed in the forward - * direction. Singly-linked lists are ideal for applications with large - * datasets and few or no removals or for implementing a LIFO queue. - * - * A list is headed by a single forward pointer (or an array of forward - * pointers for a hash table header). The elements are doubly linked - * so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before - * or after an existing element or at the head of the list. A list - * may only be traversed in the forward direction. - * - * A simple queue is headed by a pair of pointers, one the head of the - * list and the other to the tail of the list. The elements are singly - * linked to save space, so elements can only be removed from the - * head of the list. New elements can be added to the list after - * an existing element, at the head of the list, or at the end of the - * list. A simple queue may only be traversed in the forward direction. - * - * A tail queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or - * after an existing element, at the head of the list, or at the end of - * the list. A tail queue may be traversed in either direction. - * - * A circle queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or after - * an existing element, at the head of the list, or at the end of the list. - * A circle queue may be traversed in either direction, but has a more - * complex end of list detection. - * - * For details on the use of these macros, see the queue(3) manual page. - * SLIST LIST STAILQ TAILQ CIRCLEQ - * _HEAD + + + + + - * _HEAD_INITIALIZER + + + + + - * _ENTRY + + + + + - * _INIT + + + + + - * _EMPTY + + + + + - * _FIRST + + + + + - * _NEXT + + + + + - * _PREV - - - + + - * _LAST - - + + + - * _FOREACH + + + + + - * _FOREACH_REVERSE - - - + + - * _INSERT_HEAD + + + + + - * _INSERT_BEFORE - + - + + - * _INSERT_AFTER + + + + + - * _INSERT_TAIL - - + + + - * _REMOVE_HEAD + - + - - - * _REMOVE + + + + + - */ - -/* - * List definitions. - */ -#define LIST_HEAD(name, type) \ -struct name { \ - struct type *lh_first; /* first element */ \ -} - -#define LIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define LIST_ENTRY(type) \ -struct { \ - struct type *le_next; /* next element */ \ - struct type **le_prev; /* address of previous next element */ \ -} - -/* - * List functions. - */ -#define LIST_INIT(head) do { \ - (head)->lh_first = NULL; \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_AFTER(listelm, elm, field) do { \ - if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ - (listelm)->field.le_next->field.le_prev = \ - &(elm)->field.le_next; \ - (listelm)->field.le_next = (elm); \ - (elm)->field.le_prev = &(listelm)->field.le_next; \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.le_prev = (listelm)->field.le_prev; \ - (elm)->field.le_next = (listelm); \ - *(listelm)->field.le_prev = (elm); \ - (listelm)->field.le_prev = &(elm)->field.le_next; \ -} while (/*CONSTCOND*/0) - -#define LIST_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.le_next = (head)->lh_first) != NULL) \ - (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ - (head)->lh_first = (elm); \ - (elm)->field.le_prev = &(head)->lh_first; \ -} while (/*CONSTCOND*/0) - -#define LIST_REMOVE(elm, field) do { \ - if ((elm)->field.le_next != NULL) \ - (elm)->field.le_next->field.le_prev = \ - (elm)->field.le_prev; \ - *(elm)->field.le_prev = (elm)->field.le_next; \ -} while (/*CONSTCOND*/0) - -#define LIST_FOREACH(var, head, field) \ - for ((var) = ((head)->lh_first); \ - (var); \ - (var) = ((var)->field.le_next)) - -/* - * List access methods. - */ -#define LIST_EMPTY(head) ((head)->lh_first == NULL) -#define LIST_FIRST(head) ((head)->lh_first) -#define LIST_NEXT(elm, field) ((elm)->field.le_next) - - -/* - * Singly-linked List definitions. - */ -#define SLIST_HEAD(name, type) \ -struct name { \ - struct type *slh_first; /* first element */ \ -} - -#define SLIST_HEAD_INITIALIZER(head) \ - { NULL } - -#define SLIST_ENTRY(type) \ -struct { \ - struct type *sle_next; /* next element */ \ -} - -/* - * Singly-linked List functions. - */ -#define SLIST_INIT(head) do { \ - (head)->slh_first = NULL; \ -} while (/*CONSTCOND*/0) - -#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ - (elm)->field.sle_next = (slistelm)->field.sle_next; \ - (slistelm)->field.sle_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define SLIST_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.sle_next = (head)->slh_first; \ - (head)->slh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define SLIST_REMOVE_HEAD(head, field) do { \ - (head)->slh_first = (head)->slh_first->field.sle_next; \ -} while (/*CONSTCOND*/0) - -#define SLIST_REMOVE(head, elm, type, field) do { \ - if ((head)->slh_first == (elm)) { \ - SLIST_REMOVE_HEAD((head), field); \ - } \ - else { \ - struct type *curelm = (head)->slh_first; \ - while(curelm->field.sle_next != (elm)) \ - curelm = curelm->field.sle_next; \ - curelm->field.sle_next = \ - curelm->field.sle_next->field.sle_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define SLIST_FOREACH(var, head, field) \ - for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) - -/* - * Singly-linked List access methods. - */ -#define SLIST_EMPTY(head) ((head)->slh_first == NULL) -#define SLIST_FIRST(head) ((head)->slh_first) -#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) - - -/* - * Singly-linked Tail queue declarations. - */ -#define STAILQ_HEAD(name, type) \ -struct name { \ - struct type *stqh_first; /* first element */ \ - struct type **stqh_last; /* addr of last next element */ \ -} - -#define STAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).stqh_first } - -#define STAILQ_ENTRY(type) \ -struct { \ - struct type *stqe_next; /* next element */ \ -} - -/* - * Singly-linked Tail queue functions. - */ -#define STAILQ_INIT(head) do { \ - (head)->stqh_first = NULL; \ - (head)->stqh_last = &(head)->stqh_first; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (head)->stqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.stqe_next = NULL; \ - *(head)->stqh_last = (elm); \ - (head)->stqh_last = &(elm)->field.stqe_next; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\ - (head)->stqh_last = &(elm)->field.stqe_next; \ - (listelm)->field.stqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define STAILQ_REMOVE_HEAD(head, field) do { \ - if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \ - (head)->stqh_last = &(head)->stqh_first; \ -} while (/*CONSTCOND*/0) - -#define STAILQ_REMOVE(head, elm, type, field) do { \ - if ((head)->stqh_first == (elm)) { \ - STAILQ_REMOVE_HEAD((head), field); \ - } else { \ - struct type *curelm = (head)->stqh_first; \ - while (curelm->field.stqe_next != (elm)) \ - curelm = curelm->field.stqe_next; \ - if ((curelm->field.stqe_next = \ - curelm->field.stqe_next->field.stqe_next) == NULL) \ - (head)->stqh_last = &(curelm)->field.stqe_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define STAILQ_FOREACH(var, head, field) \ - for ((var) = ((head)->stqh_first); \ - (var); \ - (var) = ((var)->field.stqe_next)) - -#define STAILQ_CONCAT(head1, head2) do { \ - if (!STAILQ_EMPTY((head2))) { \ - *(head1)->stqh_last = (head2)->stqh_first; \ - (head1)->stqh_last = (head2)->stqh_last; \ - STAILQ_INIT((head2)); \ - } \ -} while (/*CONSTCOND*/0) - -/* - * Singly-linked Tail queue access methods. - */ -#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) -#define STAILQ_FIRST(head) ((head)->stqh_first) -#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) - - -/* - * Simple queue definitions. - */ -#define SIMPLEQ_HEAD(name, type) \ -struct name { \ - struct type *sqh_first; /* first element */ \ - struct type **sqh_last; /* addr of last next element */ \ -} - -#define SIMPLEQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).sqh_first } - -#define SIMPLEQ_ENTRY(type) \ -struct { \ - struct type *sqe_next; /* next element */ \ -} - -/* - * Simple queue functions. - */ -#define SIMPLEQ_INIT(head) do { \ - (head)->sqh_first = NULL; \ - (head)->sqh_last = &(head)->sqh_first; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ - (head)->sqh_last = &(elm)->field.sqe_next; \ - (head)->sqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.sqe_next = NULL; \ - *(head)->sqh_last = (elm); \ - (head)->sqh_last = &(elm)->field.sqe_next; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ - (head)->sqh_last = &(elm)->field.sqe_next; \ - (listelm)->field.sqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_REMOVE_HEAD(head, field) do { \ - if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ - (head)->sqh_last = &(head)->sqh_first; \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_REMOVE(head, elm, type, field) do { \ - if ((head)->sqh_first == (elm)) { \ - SIMPLEQ_REMOVE_HEAD((head), field); \ - } else { \ - struct type *curelm = (head)->sqh_first; \ - while (curelm->field.sqe_next != (elm)) \ - curelm = curelm->field.sqe_next; \ - if ((curelm->field.sqe_next = \ - curelm->field.sqe_next->field.sqe_next) == NULL) \ - (head)->sqh_last = &(curelm)->field.sqe_next; \ - } \ -} while (/*CONSTCOND*/0) - -#define SIMPLEQ_FOREACH(var, head, field) \ - for ((var) = ((head)->sqh_first); \ - (var); \ - (var) = ((var)->field.sqe_next)) - -/* - * Simple queue access methods. - */ -#define SIMPLEQ_EMPTY(head) ((head)->sqh_first == NULL) -#define SIMPLEQ_FIRST(head) ((head)->sqh_first) -#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) - - -/* - * Tail queue definitions. - */ -#define _TAILQ_HEAD(name, type, qual) \ -struct name { \ - qual type *tqh_first; /* first element */ \ - qual type *qual *tqh_last; /* addr of last next element */ \ -} -#define TAILQ_HEAD(name, type) _TAILQ_HEAD(name, struct type,) - -#define TAILQ_HEAD_INITIALIZER(head) \ - { NULL, &(head).tqh_first } - -#define _TAILQ_ENTRY(type, qual) \ -struct { \ - qual type *tqe_next; /* next element */ \ - qual type *qual *tqe_prev; /* address of previous next element */\ -} -#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,) - -/* - * Tail queue functions. - */ -#define TAILQ_INIT(head) do { \ - (head)->tqh_first = NULL; \ - (head)->tqh_last = &(head)->tqh_first; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_HEAD(head, elm, field) do { \ - if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ - (head)->tqh_first->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (head)->tqh_first = (elm); \ - (elm)->field.tqe_prev = &(head)->tqh_first; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.tqe_next = NULL; \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &(elm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ - if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ - (elm)->field.tqe_next->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (listelm)->field.tqe_next = (elm); \ - (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - (elm)->field.tqe_next = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_REMOVE(head, elm, field) do { \ - if (((elm)->field.tqe_next) != NULL) \ - (elm)->field.tqe_next->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ -} while (/*CONSTCOND*/0) - -#define TAILQ_FOREACH(var, head, field) \ - for ((var) = ((head)->tqh_first); \ - (var); \ - (var) = ((var)->field.tqe_next)) - -#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ - for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last)); \ - (var); \ - (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last))) - -#define TAILQ_CONCAT(head1, head2, field) do { \ - if (!TAILQ_EMPTY(head2)) { \ - *(head1)->tqh_last = (head2)->tqh_first; \ - (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ - (head1)->tqh_last = (head2)->tqh_last; \ - TAILQ_INIT((head2)); \ - } \ -} while (/*CONSTCOND*/0) - -/* - * Tail queue access methods. - */ -#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) -#define TAILQ_FIRST(head) ((head)->tqh_first) -#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) - -#define TAILQ_LAST(head, headname) \ - (*(((struct headname *)((head)->tqh_last))->tqh_last)) -#define TAILQ_PREV(elm, headname, field) \ - (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) - - -/* - * Circular queue definitions. - */ -#define CIRCLEQ_HEAD(name, type) \ -struct name { \ - struct type *cqh_first; /* first element */ \ - struct type *cqh_last; /* last element */ \ -} - -#define CIRCLEQ_HEAD_INITIALIZER(head) \ - { (void *)&head, (void *)&head } - -#define CIRCLEQ_ENTRY(type) \ -struct { \ - struct type *cqe_next; /* next element */ \ - struct type *cqe_prev; /* previous element */ \ -} - -/* - * Circular queue functions. - */ -#define CIRCLEQ_INIT(head) do { \ - (head)->cqh_first = (void *)(head); \ - (head)->cqh_last = (void *)(head); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ - (elm)->field.cqe_next = (listelm)->field.cqe_next; \ - (elm)->field.cqe_prev = (listelm); \ - if ((listelm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (listelm)->field.cqe_next->field.cqe_prev = (elm); \ - (listelm)->field.cqe_next = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ - (elm)->field.cqe_next = (listelm); \ - (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ - if ((listelm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (listelm)->field.cqe_prev->field.cqe_next = (elm); \ - (listelm)->field.cqe_prev = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ - (elm)->field.cqe_next = (head)->cqh_first; \ - (elm)->field.cqe_prev = (void *)(head); \ - if ((head)->cqh_last == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (head)->cqh_first->field.cqe_prev = (elm); \ - (head)->cqh_first = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ - (elm)->field.cqe_next = (void *)(head); \ - (elm)->field.cqe_prev = (head)->cqh_last; \ - if ((head)->cqh_first == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (head)->cqh_last->field.cqe_next = (elm); \ - (head)->cqh_last = (elm); \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_REMOVE(head, elm, field) do { \ - if ((elm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm)->field.cqe_prev; \ - else \ - (elm)->field.cqe_next->field.cqe_prev = \ - (elm)->field.cqe_prev; \ - if ((elm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm)->field.cqe_next; \ - else \ - (elm)->field.cqe_prev->field.cqe_next = \ - (elm)->field.cqe_next; \ -} while (/*CONSTCOND*/0) - -#define CIRCLEQ_FOREACH(var, head, field) \ - for ((var) = ((head)->cqh_first); \ - (var) != (const void *)(head); \ - (var) = ((var)->field.cqe_next)) - -#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ - for ((var) = ((head)->cqh_last); \ - (var) != (const void *)(head); \ - (var) = ((var)->field.cqe_prev)) - -/* - * Circular queue access methods. - */ -#define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) -#define CIRCLEQ_FIRST(head) ((head)->cqh_first) -#define CIRCLEQ_LAST(head) ((head)->cqh_last) -#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) -#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) - -#define CIRCLEQ_LOOP_NEXT(head, elm, field) \ - (((elm)->field.cqe_next == (void *)(head)) \ - ? ((head)->cqh_first) \ - : (elm->field.cqe_next)) -#define CIRCLEQ_LOOP_PREV(head, elm, field) \ - (((elm)->field.cqe_prev == (void *)(head)) \ - ? ((head)->cqh_last) \ - : (elm->field.cqe_prev)) - -#endif /* sys/queue.h */ diff --git a/openair2/X2AP/COPYING b/openair2/X2AP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair2/X2AP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair2/X2AP/MESSAGES/ASN1/asn1tostruct.py b/openair2/X2AP/MESSAGES/ASN1/asn1tostruct.py index c298e8ae87..8c0f7e8a16 100644 --- a/openair2/X2AP/MESSAGES/ASN1/asn1tostruct.py +++ b/openair2/X2AP/MESSAGES/ASN1/asn1tostruct.py @@ -33,35 +33,26 @@ def printDebug(string): def outputHeaderToFile(f, filename): now = datetime.datetime.now() - f.write("""/******************************************************************************* - - Eurecom OpenAirInterface - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fr/openairinterface - Address : EURECOM, Campus SophiaTech, 450 Route des Chappes - 06410 Biot FRANCE - -*******************************************************************************/ + f.write("""/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ """) f.write("/*******************************************************************************\n") diff --git a/openair2/X2AP/Makefile.inc b/openair2/X2AP/Makefile.inc index 7369cf8dfa..a301a9934e 100755 --- a/openair2/X2AP/Makefile.inc +++ b/openair2/X2AP/Makefile.inc @@ -28,7 +28,6 @@ CFLAGS = \ -Wall \ -DENB_MODE \ -DENABLE_USE_MME \ - -DUSER_MODE \ -I. \ -I$(ASN1MESSAGESDIR)/ASN1/$(ASN1RELDIR) \ -I$(ASN1MESSAGESDIR) \ diff --git a/openair2/X2AP/x2ap.c b/openair2/X2AP/x2ap.c index 69b70964a4..bde21c0dbe 100644 --- a/openair2/X2AP/x2ap.c +++ b/openair2/X2AP/x2ap.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include diff --git a/openair2/X2AP/x2ap.h b/openair2/X2AP/x2ap.h index 561f0953c3..89e8540b97 100644 --- a/openair2/X2AP/x2ap.h +++ b/openair2/X2AP/x2ap.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -41,10 +33,7 @@ typedef struct x2ap_config_s { } x2ap_config_t; -#if defined(OAI_EMU) -#else extern x2ap_config_t x2ap_config; -#endif void *x2ap_task(void *arg); diff --git a/openair2/X2AP/x2ap_common.c b/openair2/X2AP/x2ap_common.c old mode 100755 new mode 100644 index 5565835997..d92f2c69bb --- a/openair2/X2AP/x2ap_common.c +++ b/openair2/X2AP/x2ap_common.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file x2ap_common.c * \brief x2ap procedures for both eNB and MME diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h old mode 100755 new mode 100644 index 04ad77f8e3..b7c9361476 --- a/openair2/X2AP/x2ap_common.h +++ b/openair2/X2AP/x2ap_common.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #if HAVE_CONFIG_H_ # include "config.h" @@ -290,8 +282,10 @@ # define X2AP_PORT 36422 #endif +#ifndef TRUE #define TRUE 1 #define FALSE 0 +#endif extern int asn_debug; extern int asn1_xer_print; diff --git a/openair3/COMMON/as_message.h b/openair3/COMMON/as_message.h deleted file mode 120000 index 3bfc76865a..0000000000 --- a/openair3/COMMON/as_message.h +++ /dev/null @@ -1 +0,0 @@ -../../openair2/COMMON/as_message.h \ No newline at end of file diff --git a/openair3/COMMON/as_message.h b/openair3/COMMON/as_message.h new file mode 100644 index 0000000000..30810a325e --- /dev/null +++ b/openair3/COMMON/as_message.h @@ -0,0 +1,578 @@ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + + +/***************************************************************************** + +Source as_message.h + +Version 0.1 + +Date 2012/10/18 + +Product NAS stack + +Subsystem Application Programming Interface + +Author Frederic Maurel + +Description Defines the messages supported by the Access Stratum sublayer + protocol (usually RRC and S1AP for E-UTRAN) and functions used + to encode and decode + +*****************************************************************************/ +#ifndef __AS_MESSAGE_H__ +#define __AS_MESSAGE_H__ + +#include "commonDef.h" +#include "networkDef.h" + +/****************************************************************************/ +/********************* G L O B A L C O N S T A N T S *******************/ +/****************************************************************************/ + +/* + * -------------------------------------------------------------------------- + * Access Stratum message types + * -------------------------------------------------------------------------- + */ +#define AS_REQUEST 0x0100 +#define AS_RESPONSE 0x0200 +#define AS_INDICATION 0x0400 +#define AS_CONFIRM 0x0800 + +/* + * -------------------------------------------------------------------------- + * Access Stratum message identifiers + * -------------------------------------------------------------------------- + */ + +/* Broadcast information */ +#define AS_BROADCAST_INFO 0x01 +#define AS_BROADCAST_INFO_IND (AS_BROADCAST_INFO | AS_INDICATION) + +/* Cell information relevant for cell selection processing */ +#define AS_CELL_INFO 0x02 +#define AS_CELL_INFO_REQ (AS_CELL_INFO | AS_REQUEST) +#define AS_CELL_INFO_CNF (AS_CELL_INFO | AS_CONFIRM) +#define AS_CELL_INFO_IND (AS_CELL_INFO | AS_INDICATION) + +/* Paging information */ +#define AS_PAGING 0x03 +#define AS_PAGING_REQ (AS_PAGING | AS_REQUEST) +#define AS_PAGING_IND (AS_PAGING | AS_INDICATION) + +/* NAS signalling connection establishment */ +#define AS_NAS_ESTABLISH 0x04 +#define AS_NAS_ESTABLISH_REQ (AS_NAS_ESTABLISH | AS_REQUEST) +#define AS_NAS_ESTABLISH_IND (AS_NAS_ESTABLISH | AS_INDICATION) +#define AS_NAS_ESTABLISH_RSP (AS_NAS_ESTABLISH | AS_RESPONSE) +#define AS_NAS_ESTABLISH_CNF (AS_NAS_ESTABLISH | AS_CONFIRM) + +/* NAS signalling connection release */ +#define AS_NAS_RELEASE 0x05 +#define AS_NAS_RELEASE_REQ (AS_NAS_RELEASE | AS_REQUEST) +#define AS_NAS_RELEASE_IND (AS_NAS_RELEASE | AS_INDICATION) + +/* Uplink information transfer */ +#define AS_UL_INFO_TRANSFER 0x06 +#define AS_UL_INFO_TRANSFER_REQ (AS_UL_INFO_TRANSFER | AS_REQUEST) +#define AS_UL_INFO_TRANSFER_CNF (AS_UL_INFO_TRANSFER | AS_CONFIRM) +#define AS_UL_INFO_TRANSFER_IND (AS_UL_INFO_TRANSFER | AS_INDICATION) + +/* Downlink information transfer */ +#define AS_DL_INFO_TRANSFER 0x07 +#define AS_DL_INFO_TRANSFER_REQ (AS_DL_INFO_TRANSFER | AS_REQUEST) +#define AS_DL_INFO_TRANSFER_CNF (AS_DL_INFO_TRANSFER | AS_CONFIRM) +#define AS_DL_INFO_TRANSFER_IND (AS_DL_INFO_TRANSFER | AS_INDICATION) + +/* Radio Access Bearer establishment */ +#define AS_RAB_ESTABLISH 0x08 +#define AS_RAB_ESTABLISH_REQ (AS_RAB_ESTABLISH | AS_REQUEST) +#define AS_RAB_ESTABLISH_IND (AS_RAB_ESTABLISH | AS_INDICATION) +#define AS_RAB_ESTABLISH_RSP (AS_RAB_ESTABLISH | AS_RESPONSE) +#define AS_RAB_ESTABLISH_CNF (AS_RAB_ESTABLISH | AS_CONFIRM) + +/* Radio Access Bearer release */ +#define AS_RAB_RELEASE 0x09 +#define AS_RAB_RELEASE_REQ (AS_RAB_RELEASE | AS_REQUEST) +#define AS_RAB_RELEASE_IND (AS_RAB_RELEASE | AS_INDICATION) + +/* NAS Cause */ +#define EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED (8) +#define EPS_SERVICES_NOT_ALLOWED (7) +#define PLMN_NOT_ALLOWED (11) +#define TRACKING_AREA_NOT_ALLOWED (12) +#define ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA (13) +#define EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN (14) +#define NO_SUITABLE_CELLS_IN_TRACKING_AREA (15) +#define NETWORK_FAILURE (17) +#define ESM_FAILURE (19) + +typedef enum nas_cause_s { + NAS_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED = EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, + NAS_CAUSE_EPS_SERVICES_NOT_ALLOWED = EPS_SERVICES_NOT_ALLOWED, + NAS_CAUSE_PLMN_NOT_ALLOWED = PLMN_NOT_ALLOWED, + NAS_CAUSE_TRACKING_AREA_NOT_ALLOWED = TRACKING_AREA_NOT_ALLOWED, + NAS_CAUSE_ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA = ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA, + NAS_CAUSE_EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN = EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN, + NAS_CAUSE_NO_SUITABLE_CELLS_IN_TRACKING_AREA = NO_SUITABLE_CELLS_IN_TRACKING_AREA, + NAS_CAUSE_NETWORK_FAILURE = NETWORK_FAILURE, + NAS_CAUSE_ESM_FAILURE = ESM_FAILURE +} nas_cause_t; + +/* + * -------------------------------------------------------------------------- + * Access Stratum message global parameters + * -------------------------------------------------------------------------- + */ + +/* Error code */ +typedef enum nas_error_code_s { + AS_SUCCESS = 1, /* Success code, transaction is going on */ + AS_TERMINATED_NAS, /* Transaction terminated by NAS */ + AS_TERMINATED_AS, /* Transaction terminated by AS */ + AS_FAILURE /* Failure code */ +} nas_error_code_t; + +/* Core network domain */ +typedef enum core_network_s { + AS_PS = 1, /* Packet-Switched */ + AS_CS /* Circuit-Switched */ +} core_network_t; + +/* SAE Temporary Mobile Subscriber Identity */ +typedef struct as_stmsi_s { + uint8_t MMEcode; /* MME code that allocated the GUTI */ + uint32_t m_tmsi; /* M-Temporary Mobile Subscriber Identity */ +} as_stmsi_t; + +/* Dedicated NAS information */ +typedef struct as_nas_info_s { + uint32_t length; /* Length of the NAS information data */ + Byte_t* data; /* Dedicated NAS information data container */ +} as_nas_info_t; + +/* Radio Access Bearer identity */ +typedef uint8_t as_rab_id_t; + +/****************************************************************************/ +/************************ G L O B A L T Y P E S ************************/ +/****************************************************************************/ + +/* + * -------------------------------------------------------------------------- + * Broadcast information + * -------------------------------------------------------------------------- + */ + +/* + * AS->NAS - Broadcast information indication + * AS may asynchronously report to NAS available PLMNs within specific + * location area + */ +typedef struct broadcast_info_ind_s { +#define PLMN_LIST_MAX_SIZE 6 + PLMN_LIST_T(PLMN_LIST_MAX_SIZE) plmnIDs; /* List of PLMN identifiers */ + ci_t cellID; /* Identity of the cell serving the listed PLMNs */ + tac_t tac; /* Code of the tracking area the cell belongs to */ +} broadcast_info_ind_t; + +/* + * -------------------------------------------------------------------------- + * Cell information relevant for cell selection processing + * -------------------------------------------------------------------------- + */ + +/* Radio access technologies supported by the network */ +#define AS_GSM (1 << NET_ACCESS_GSM) +#define AS_COMPACT (1 << NET_ACCESS_COMPACT) +#define AS_UTRAN (1 << NET_ACCESS_UTRAN) +#define AS_EGPRS (1 << NET_ACCESS_EGPRS) +#define AS_HSDPA (1 << NET_ACCESS_HSDPA) +#define AS_HSUPA (1 << NET_ACCESS_HSUPA) +#define AS_HSDUPA (1 << NET_ACCESS_HSDUPA) +#define AS_EUTRAN (1 << NET_ACCESS_EUTRAN) + +/* + * NAS->AS - Cell Information request + * NAS request AS to search for a suitable cell belonging to the selected + * PLMN to camp on. + */ +typedef struct cell_info_req_s { + plmn_t plmnID; /* Selected PLMN identity */ + Byte_t rat; /* Bitmap - set of radio access technologies */ +} cell_info_req_t; + +/* + * AS->NAS - Cell Information confirm + * AS search for a suitable cell and respond to NAS. If found, the cell + * is selected to camp on. + */ +typedef struct cell_info_cnf_s { + uint8_t errCode; /* Error code */ + ci_t cellID; /* Identity of the cell serving the selected PLMN */ + tac_t tac; /* Code of the tracking area the cell belongs to */ + AcT_t rat; /* Radio access technology supported by the cell */ + uint8_t rsrq; /* Reference signal received quality */ + uint8_t rsrp; /* Reference signal received power */ +} cell_info_cnf_t; + +/* + * AS->NAS - Cell Information indication + * AS may change cell selection if a more suitable cell is found. + */ +typedef struct cell_info_ind_s { + ci_t cellID; /* Identity of the new serving cell */ + tac_t tac; /* Code of the tracking area the cell belongs to */ +} cell_info_ind_t; + +/* + * -------------------------------------------------------------------------- + * Paging information + * -------------------------------------------------------------------------- + */ + +/* Paging cause */ +typedef enum paging_cause_s { + AS_CONNECTION_ESTABLISH, /* Establish NAS signalling connection */ + AS_EPS_ATTACH, /* Perform local detach and initiate EPS + * attach procedure */ + AS_CS_FALLBACK /* Inititate CS fallback procedure */ +} paging_cause_t; + +/* + * NAS->AS - Paging Information request + * NAS requests the AS that NAS signalling messages or user data is pending + * to be sent. + */ +typedef struct paging_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + uint8_t CN_domain; /* Core network domain */ +} paging_req_t; + +/* + * AS->NAS - Paging Information indication + * AS reports to the NAS that appropriate procedure has to be initiated. + */ +typedef struct paging_ind_s { + paging_cause_t cause; /* Paging cause */ +} paging_ind_t; + +/* + * -------------------------------------------------------------------------- + * NAS signalling connection establishment + * -------------------------------------------------------------------------- + */ + +/* Cause of RRC connection establishment */ +typedef enum as_cause_s { + AS_CAUSE_UNKNOWN = 0, + AS_CAUSE_EMERGENCY = NET_ESTABLISH_CAUSE_EMERGENCY, + AS_CAUSE_HIGH_PRIO = NET_ESTABLISH_CAUSE_HIGH_PRIO, + AS_CAUSE_MT_ACCESS = NET_ESTABLISH_CAUSE_MT_ACCESS, + AS_CAUSE_MO_SIGNAL = NET_ESTABLISH_CAUSE_MO_SIGNAL, + AS_CAUSE_MO_DATA = NET_ESTABLISH_CAUSE_MO_DATA, + AS_CAUSE_V1020 = NET_ESTABLISH_CAUSE_V1020 +} as_cause_t; + +/* Type of the call associated to the RRC connection establishment */ +typedef enum as_call_type_s { + AS_TYPE_ORIGINATING_SIGNAL = NET_ESTABLISH_TYPE_ORIGINATING_SIGNAL, + AS_TYPE_EMERGENCY_CALLS = NET_ESTABLISH_TYPE_EMERGENCY_CALLS, + AS_TYPE_ORIGINATING_CALLS = NET_ESTABLISH_TYPE_ORIGINATING_CALLS, + AS_TYPE_TERMINATING_CALLS = NET_ESTABLISH_TYPE_TERMINATING_CALLS, + AS_TYPE_MO_CS_FALLBACK = NET_ESTABLISH_TYPE_MO_CS_FALLBACK +} as_call_type_t; + +/* + * NAS->AS - NAS signalling connection establishment request + * NAS requests the AS to perform the RRC connection establishment procedure + * to transfer initial NAS message to the network while UE is in IDLE mode. + */ +typedef struct nas_establish_req_s { + as_cause_t cause; /* RRC connection establishment cause */ + as_call_type_t type; /* RRC associated call type */ + as_stmsi_t s_tmsi; /* UE identity */ + plmn_t plmnID; /* Selected PLMN identity */ + as_nas_info_t initialNasMsg; /* Initial NAS message to transfer */ +} nas_establish_req_t; + +/* + * AS->NAS - NAS signalling connection establishment indication + * AS transfers the initial NAS message to the NAS. + */ +typedef struct nas_establish_ind_s { + uint32_t UEid; /* UE lower layer identifier */ + tac_t tac; /* Code of the tracking area the initiating + * UE belongs to */ + as_cause_t asCause; /* Establishment cause */ + as_nas_info_t initialNasMsg; /* Initial NAS message to transfer */ +} nas_establish_ind_t; + +/* + * NAS->AS - NAS signalling connection establishment response + * NAS responds to the AS that initial answer message has to be provided to + * the UE. + */ +typedef struct nas_establish_rsp_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + nas_error_code_t errCode; /* Transaction status */ + as_nas_info_t nasMsg; /* NAS message to transfer */ + uint32_t nas_ul_count; /* UL NAS COUNT */ + uint16_t selected_encryption_algorithm; + uint16_t selected_integrity_algorithm; +} nas_establish_rsp_t; + +/* + * AS->NAS - NAS signalling connection establishment confirm + * AS transfers the initial answer message to the NAS. + */ +typedef struct nas_establish_cnf_s { + uint32_t UEid; /* UE lower layer identifier */ + nas_error_code_t errCode; /* Transaction status */ + as_nas_info_t nasMsg; /* NAS message to transfer */ + uint32_t ul_nas_count; + uint16_t selected_encryption_algorithm; + uint16_t selected_integrity_algorithm; +} nas_establish_cnf_t; + +/* + * -------------------------------------------------------------------------- + * NAS signalling connection release + * -------------------------------------------------------------------------- + */ + +/* Release cause */ +typedef enum release_cause_s { + AS_AUTHENTICATION_FAILURE = 1, /* Authentication procedure failed */ + AS_DETACH /* Detach requested */ +} release_cause_t; + +/* + * NAS->AS - NAS signalling connection release request + * NAS requests the termination of the connection with the UE. + */ +typedef struct nas_release_req_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + release_cause_t cause; /* Release cause */ +} nas_release_req_t; + +/* + * AS->NAS - NAS signalling connection release indication + * AS reports that connection has been terminated by the network. + */ +typedef struct nas_release_ind_s { + release_cause_t cause; /* Release cause */ +} nas_release_ind_t; + +/* + * -------------------------------------------------------------------------- + * NAS information transfer + * -------------------------------------------------------------------------- + */ + +/* + * NAS->AS - Uplink data transfer request + * NAS requests the AS to transfer uplink information to the NAS that + * operates at the network side. + */ +typedef struct ul_info_transfer_req_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + as_nas_info_t nasMsg; /* Uplink NAS message */ +} ul_info_transfer_req_t; + +/* + * AS->NAS - Uplink data transfer confirm + * AS immediately notifies the NAS whether uplink information has been + * successfully sent to the network or not. + */ +typedef struct ul_info_transfer_cnf_s { + uint32_t UEid; /* UE lower layer identifier */ + nas_error_code_t errCode; /* Transaction status */ +} ul_info_transfer_cnf_t; + +/* + * AS->NAS - Uplink data transfer indication + * AS delivers the uplink information message to the NAS that operates + * at the network side. + */ +typedef struct ul_info_transfer_ind_s { + uint32_t UEid; /* UE lower layer identifier */ + as_nas_info_t nasMsg; /* Uplink NAS message */ +} ul_info_transfer_ind_t; + +/* + * NAS->AS - Downlink data transfer request + * NAS requests the AS to transfer downlink information to the NAS that + * operates at the UE side. + */ +typedef ul_info_transfer_req_t dl_info_transfer_req_t; + +/* + * AS->NAS - Downlink data transfer confirm + * AS immediately notifies the NAS whether downlink information has been + * successfully sent to the network or not. + */ +typedef ul_info_transfer_cnf_t dl_info_transfer_cnf_t; + +/* + * AS->NAS - Downlink data transfer indication + * AS delivers the downlink information message to the NAS that operates + * at the UE side. + */ +typedef ul_info_transfer_ind_t dl_info_transfer_ind_t; + +/* + * -------------------------------------------------------------------------- + * Radio Access Bearer establishment + * -------------------------------------------------------------------------- + */ + +/* TODO: Quality of Service parameters */ +typedef struct {} as_qos_t; + +/* + * NAS->AS - Radio access bearer establishment request + * NAS requests the AS to allocate transmission resources to radio access + * bearer initialized at the network side. + */ +typedef struct rab_establish_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ + as_qos_t QoS; /* Requested Quality of Service */ +} rab_establish_req_t; + +/* + * AS->NAS - Radio access bearer establishment indication + * AS notifies the NAS that specific radio access bearer has to be setup. + */ +typedef struct rab_establish_ind_s { + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_establish_ind_t; + +/* + * NAS->AS - Radio access bearer establishment response + * NAS responds to AS whether the specified radio access bearer has been + * successfully setup or not. + */ +typedef struct rab_establish_rsp_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ + nas_error_code_t errCode; /* Transaction status */ +} rab_establish_rsp_t; + +/* + * AS->NAS - Radio access bearer establishment confirm + * AS notifies NAS whether the specified radio access bearer has been + * successfully setup at the UE side or not. + */ +typedef struct rab_establish_cnf_s { + as_rab_id_t rabID; /* Radio access bearer identity */ + nas_error_code_t errCode; /* Transaction status */ +} rab_establish_cnf_t; + +/* + * -------------------------------------------------------------------------- + * Radio Access Bearer release + * -------------------------------------------------------------------------- + */ + +/* + * NAS->AS - Radio access bearer release request + * NAS requests the AS to release transmission resources previously allocated + * to specific radio access bearer at the network side. + */ +typedef struct rab_release_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_release_req_t; + +/* + * AS->NAS - Radio access bearer release indication + * AS notifies NAS that specific radio access bearer has been released. + */ +typedef struct rab_release_ind_s { + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_release_ind_t; + +/* + * -------------------------------------------------------------------------- + * Structure of the AS messages handled by the network sublayer + * -------------------------------------------------------------------------- + */ +typedef struct as_message_s { + uint16_t msgID; + union { + broadcast_info_ind_t broadcast_info_ind; + cell_info_req_t cell_info_req; + cell_info_cnf_t cell_info_cnf; + cell_info_ind_t cell_info_ind; + paging_req_t paging_req; + paging_ind_t paging_ind; + nas_establish_req_t nas_establish_req; + nas_establish_ind_t nas_establish_ind; + nas_establish_rsp_t nas_establish_rsp; + nas_establish_cnf_t nas_establish_cnf; + nas_release_req_t nas_release_req; + nas_release_ind_t nas_release_ind; + ul_info_transfer_req_t ul_info_transfer_req; + ul_info_transfer_cnf_t ul_info_transfer_cnf; + ul_info_transfer_ind_t ul_info_transfer_ind; + dl_info_transfer_req_t dl_info_transfer_req; + dl_info_transfer_cnf_t dl_info_transfer_cnf; + dl_info_transfer_ind_t dl_info_transfer_ind; + rab_establish_req_t rab_establish_req; + rab_establish_ind_t rab_establish_ind; + rab_establish_rsp_t rab_establish_rsp; + rab_establish_cnf_t rab_establish_cnf; + rab_release_req_t rab_release_req; + rab_release_ind_t rab_release_ind; + } __attribute__((__packed__)) msg; +} as_message_t; + +/****************************************************************************/ +/******************** G L O B A L V A R I A B L E S ********************/ +/****************************************************************************/ + +/****************************************************************************/ +/****************** E X P O R T E D F U N C T I O N S ******************/ +/****************************************************************************/ + +int as_message_decode(const char* buffer, as_message_t* msg, int length); + +int as_message_encode(char* buffer, as_message_t* msg, int length); + +/* Implemented in the network_api.c body file */ +int as_message_send(as_message_t* as_msg); + +#endif /* __AS_MESSAGE_H__*/ diff --git a/openair3/COMMON/common_types.h b/openair3/COMMON/common_types.h index 18cba9fb81..80cc20df63 100644 --- a/openair3/COMMON/common_types.h +++ b/openair3/COMMON/common_types.h @@ -1,34 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - - #include #include "commonDef.h" diff --git a/openair3/COMMON/gtpv1_u_messages_def.h b/openair3/COMMON/gtpv1_u_messages_def.h index d58b2dfc2e..4308853515 100644 --- a/openair3/COMMON/gtpv1_u_messages_def.h +++ b/openair3/COMMON/gtpv1_u_messages_def.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ MESSAGE_DEF(GTPV1U_CREATE_TUNNEL_REQ, MESSAGE_PRIORITY_MED, Gtpv1uCreateTunnelReq, gtpv1uCreateTunnelReq) diff --git a/openair3/COMMON/gtpv1_u_messages_types.h b/openair3/COMMON/gtpv1_u_messages_types.h index 13fd0fd8a0..594325647b 100644 --- a/openair3/COMMON/gtpv1_u_messages_types.h +++ b/openair3/COMMON/gtpv1_u_messages_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef GTPV1_U_MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/intertask_interface_conf.h b/openair3/COMMON/intertask_interface_conf.h index 9ab7cc3151..6bb8a1edd5 100644 --- a/openair3/COMMON/intertask_interface_conf.h +++ b/openair3/COMMON/intertask_interface_conf.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - /* * intertask_interface_conf.h * diff --git a/openair3/COMMON/messages_def.h b/openair3/COMMON/messages_def.h index 2b8667507b..1c1cdbaf0f 100644 --- a/openair3/COMMON/messages_def.h +++ b/openair3/COMMON/messages_def.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ // These messages files are mandatory and must always be placed in first position diff --git a/openair3/COMMON/messages_types.h b/openair3/COMMON/messages_types.h index 46a7261c59..47d9d32f2b 100644 --- a/openair3/COMMON/messages_types.h +++ b/openair3/COMMON/messages_types.h @@ -1,33 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ - #ifndef MESSAGES_TYPES_H_ #define MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/nas_messages_def.h b/openair3/COMMON/nas_messages_def.h index 7c7e670511..9bdcde4fdf 100644 --- a/openair3/COMMON/nas_messages_def.h +++ b/openair3/COMMON/nas_messages_def.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ //WARNING: Do not include this header directly. Use intertask_interface.h instead. @@ -69,9 +61,3 @@ MESSAGE_DEF(NAS_PDN_CONNECTIVITY_FAIL, MESSAGE_PRIORITY_MED, nas_pdn_ MESSAGE_DEF(NAS_AUTHENTICATION_PARAM_RSP, MESSAGE_PRIORITY_MED, nas_auth_param_rsp_t, nas_auth_param_rsp) MESSAGE_DEF(NAS_AUTHENTICATION_PARAM_FAIL, MESSAGE_PRIORITY_MED, nas_auth_param_fail_t, nas_auth_param_fail) -#if defined(DISABLE_USE_NAS) -MESSAGE_DEF(NAS_ATTACH_REQ, MESSAGE_PRIORITY_MED, nas_attach_req_t, nas_attach_req) -MESSAGE_DEF(NAS_ATTACH_ACCEPT, MESSAGE_PRIORITY_MED, nas_attach_accept_t, nas_attach_accept) -MESSAGE_DEF(NAS_AUTHENTICATION_RESP, MESSAGE_PRIORITY_MED, nas_auth_resp_t, nas_auth_resp) -MESSAGE_DEF(NAS_AUTHENTICATION_REQ, MESSAGE_PRIORITY_MED, nas_auth_req_t, nas_auth_req) -#endif diff --git a/openair3/COMMON/nas_messages_types.h b/openair3/COMMON/nas_messages_types.h index 4cbdad2c99..81a44fa4f4 100644 --- a/openair3/COMMON/nas_messages_types.h +++ b/openair3/COMMON/nas_messages_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #include "as_message.h" @@ -241,17 +233,7 @@ typedef struct nas_conn_est_ind_s { typedef nas_establish_rsp_t nas_conn_est_rej_t; -#if defined(DISABLE_USE_NAS) -typedef struct nas_conn_est_cnf_s { - uint32_t ue_id; - - nas_establish_cnf_t nas_establish_cnf; - /* Transparent message from MME_APP to S1AP */ - s1ap_initial_ctxt_setup_req_t transparent; -} nas_conn_est_cnf_t; -#else typedef nas_establish_cnf_t nas_conn_est_cnf_t; -#endif typedef struct nas_conn_rel_ind_s { @@ -344,10 +326,4 @@ typedef struct nas_auth_param_fail_s { } nas_auth_param_fail_t; -#if defined(DISABLE_USE_NAS) -typedef struct nas_attach_accept_s { - s1ap_initial_ctxt_setup_req_t transparent; -} nas_attach_accept_t; -#endif - #endif /* NAS_MESSAGES_TYPES_H_ */ diff --git a/openair3/COMMON/s1ap_messages_def.h b/openair3/COMMON/s1ap_messages_def.h index eeb48a64b0..f0d7ba086f 100644 --- a/openair3/COMMON/s1ap_messages_def.h +++ b/openair3/COMMON/s1ap_messages_def.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ //WARNING: Do not include this header directly. Use intertask_interface.h instead. diff --git a/openair3/COMMON/s1ap_messages_types.h b/openair3/COMMON/s1ap_messages_types.h index af45f57029..e6c3bba504 100644 --- a/openair3/COMMON/s1ap_messages_types.h +++ b/openair3/COMMON/s1ap_messages_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef S1AP_MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/sctp_messages_def.h b/openair3/COMMON/sctp_messages_def.h index e56598bc44..c2d51c91eb 100644 --- a/openair3/COMMON/sctp_messages_def.h +++ b/openair3/COMMON/sctp_messages_def.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ //WARNING: Do not include this header directly. Use intertask_interface.h instead. diff --git a/openair3/COMMON/sctp_messages_types.h b/openair3/COMMON/sctp_messages_types.h index 5d1aef92ed..98a92c66b6 100644 --- a/openair3/COMMON/sctp_messages_types.h +++ b/openair3/COMMON/sctp_messages_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef SCTP_MESSAGES_TYPES_H_ diff --git a/openair3/COMMON/security_types.h b/openair3/COMMON/security_types.h index 3428b23e7a..0eedc6201f 100644 --- a/openair3/COMMON/security_types.h +++ b/openair3/COMMON/security_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #if HAVE_CONFIG_H diff --git a/openair3/COMMON/tasks_def.h b/openair3/COMMON/tasks_def.h index 4590bc002a..d1b7b8d756 100644 --- a/openair3/COMMON/tasks_def.h +++ b/openair3/COMMON/tasks_def.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ // This task is mandatory and must always be placed in first position diff --git a/openair3/COMMON/udp_messages_def.h b/openair3/COMMON/udp_messages_def.h index 551788a2bb..35322f2450 100644 --- a/openair3/COMMON/udp_messages_def.h +++ b/openair3/COMMON/udp_messages_def.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ MESSAGE_DEF(UDP_INIT, MESSAGE_PRIORITY_MED, udp_init_t, udp_init) diff --git a/openair3/COMMON/udp_messages_types.h b/openair3/COMMON/udp_messages_types.h index a44ab44c16..7825a924d1 100644 --- a/openair3/COMMON/udp_messages_types.h +++ b/openair3/COMMON/udp_messages_types.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #ifndef UDP_MESSAGES_TYPES_H_ diff --git a/openair3/COPYING b/openair3/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/DOCS/COPYING b/openair3/DOCS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/DOCS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/DOCS/DOXYGEN/COPYING b/openair3/DOCS/DOXYGEN/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/DOCS/DOXYGEN/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/DOCS/DOXYGEN/Makefile.am b/openair3/DOCS/DOXYGEN/Makefile.am index f80ebfdfe0..a291a8817e 100644 --- a/openair3/DOCS/DOXYGEN/Makefile.am +++ b/openair3/DOCS/DOXYGEN/Makefile.am @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + if HAVE_DOXYGEN directory = $(top_srcdir)/DOCS/Documentation diff --git a/openair3/DOCS/Latex/COPYING b/openair3/DOCS/Latex/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/DOCS/Latex/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/DOCS/Latex/DefaultBearer/COPYING b/openair3/DOCS/Latex/DefaultBearer/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/DOCS/Latex/DefaultBearer/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/DOCS/Latex/EPC/COPYING b/openair3/DOCS/Latex/EPC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/DOCS/Latex/EPC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/DOCS/Latex/EPC/Makefile b/openair3/DOCS/Latex/EPC/Makefile index a29da4a53c..0f0e799384 100644 --- a/openair3/DOCS/Latex/EPC/Makefile +++ b/openair3/DOCS/Latex/EPC/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + MYFILE=EPC all: diff --git a/openair3/DOCS/Makefile.am b/openair3/DOCS/Makefile.am index daf460186f..de8e4c619a 100644 --- a/openair3/DOCS/Makefile.am +++ b/openair3/DOCS/Makefile.am @@ -1,29 +1,22 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -SUBDIRS = DOXYGEN \ No newline at end of file +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + +SUBDIRS = DOXYGEN diff --git a/openair3/GTPV1-U/Makefile.am b/openair3/GTPV1-U/Makefile.am index 34df3ff5c9..30ea61d6c1 100644 --- a/openair3/GTPV1-U/Makefile.am +++ b/openair3/GTPV1-U/Makefile.am @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + AM_CFLAGS = @ADD_CFLAGS@ \ -I$(top_srcdir)/COMMON \ -I$(top_srcdir)/NAS/EURECOM-NAS/src/api/network \ @@ -62,4 +55,4 @@ libgtpv1u_la_SOURCES = \ nw-gtpv1u/src/NwGtpv1uTunnelEndPoint.c \ nw-gtpv1u/src/NwGtpv1uTrxn.c \ nw-gtpv1u/src/NwGtpv1uMsg.c \ - nw-gtpv1u/src/NwGtpv1u.c \ No newline at end of file + nw-gtpv1u/src/NwGtpv1u.c diff --git a/openair3/GTPV1-U/Makefile.eNB b/openair3/GTPV1-U/Makefile.eNB index 97920f114f..b469dc756d 100644 --- a/openair3/GTPV1-U/Makefile.eNB +++ b/openair3/GTPV1-U/Makefile.eNB @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + OUTDIR = . libgtpv1u_OBJECTS = \ @@ -71,4 +64,4 @@ clean: @$(RM_F_V) $(OUTDIR)/*.d @$(RM_F_V) $(OUTDIR)/libgtpv1u.a -cleanall: clean \ No newline at end of file +cleanall: clean diff --git a/openair3/GTPV1-U/gtpv1u.h b/openair3/GTPV1-U/gtpv1u.h index e2af712f7b..9466f024bc 100644 --- a/openair3/GTPV1-U/gtpv1u.h +++ b/openair3/GTPV1-U/gtpv1u.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u.h * \brief * \author Sebastien ROUX, Lionel Gauthier diff --git a/openair3/GTPV1-U/gtpv1u_eNB.c b/openair3/GTPV1-U/gtpv1u_eNB.c index 9f2475ef37..4234bc373d 100644 --- a/openair3/GTPV1-U/gtpv1u_eNB.c +++ b/openair3/GTPV1-U/gtpv1u_eNB.c @@ -1,34 +1,27 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u_eNB.c * \brief - * \author Sebastien ROUX, Lionel GAUTHIER + * \author Sebastien ROUX, Lionel GAUTHIER, Navid Nikaein * \version 1.0 * \company Eurecom * \email: lionel.gauthier@eurecom.fr @@ -55,7 +48,8 @@ #include "COMMON/platform_types.h" #include "COMMON/platform_constants.h" #include "UTIL/LOG/vcd_signal_dumper.h" - +#include "common/ran_context.h" +#include "gtpv1u_eNB_defs.h" #undef GTP_DUMP_SOCKET @@ -70,6 +64,7 @@ extern boolean_t pdcp_data_req( const pdcp_transmission_mode_t modeP); extern unsigned char NB_eNB_INST; +extern RAN_CONTEXT_t RC; static int gtpv1u_eNB_send_init_udp( @@ -159,7 +154,7 @@ gtpv1u_eNB_init(void); void * gtpv1u_eNB_task(void *args); -static gtpv1u_data_t gtpv1u_data_g; +//static gtpv1u_data_t gtpv1u_data_g; #if defined(GTP_DUMP_SOCKET) && GTP_DUMP_SOCKET > 0 #include @@ -228,9 +223,9 @@ static int gtpv1u_eNB_send_init_udp(uint16_t port_number) UDP_INIT(message_p).port = port_number; //LG UDP_INIT(message_p).address = "0.0.0.0"; //ANY address - addr.s_addr = gtpv1u_data_g.enb_ip_address_for_S1u_S12_S4_up; + addr.s_addr = RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up; UDP_INIT(message_p).address = inet_ntoa(addr); - LOG_D(GTPU, "Tx UDP_INIT IP addr %s\n", UDP_INIT(message_p).address); + LOG_I(GTPU, "Tx UDP_INIT IP addr %s (%x)\n", UDP_INIT(message_p).address,RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up); MSC_LOG_EVENT( MSC_GTPU_ENB, @@ -289,7 +284,7 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req( NwGtpv1uUlpHandleT hUlp, NwGtpv1uUlpApiT *pUlpApi) { - int result = 0; + boolean_t result = FALSE; teid_t teid = 0; hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS; gtpv1u_teid_data_t *gtpv1u_teid_data_p = NULL; @@ -321,7 +316,7 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req( //----------------------- // GTPV1U->PDCP mapping //----------------------- - hash_rc = hashtable_get(gtpv1u_data_g.teid_mapping, teid, (void**)>pv1u_teid_data_p); + hash_rc = hashtable_get(RC.gtpv1u_data_g->teid_mapping, teid, (void**)>pv1u_teid_data_p); if (hash_rc == HASH_TABLE_OK) { #if defined(LOG_GTPU) && LOG_GTPU > 0 @@ -335,38 +330,49 @@ NwGtpv1uRcT gtpv1u_eNB_process_stack_req( //#warning "LG eps bearer mapping to DRB id to do (offset -4)" PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, gtpv1u_teid_data_p->enb_id, ENB_FLAG_YES, gtpv1u_teid_data_p->ue_id, 0, 0,gtpv1u_teid_data_p->enb_id); - MSC_LOG_TX_MESSAGE( - MSC_GTPU_ENB, - MSC_PDCP_ENB, - NULL,0, - MSC_AS_TIME_FMT" DATA-REQ rb %u size %u", - 0,0, - (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, - buffer_len); - + MSC_GTPU_ENB, + MSC_PDCP_ENB, + NULL,0, + MSC_AS_TIME_FMT" DATA-REQ rb %u size %u", + 0,0, + (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, + buffer_len); + result = pdcp_data_req( - &ctxt, - SRB_FLAG_NO, - (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, - 0, // mui - SDU_CONFIRM_NO, // confirm - buffer_len, - buffer, - PDCP_TRANSMISSION_MODE_DATA); - AssertError (result == TRUE, return NW_GTPV1U_FAILURE ,"PDCP data request failed!\n"); + &ctxt, + SRB_FLAG_NO, + (gtpv1u_teid_data_p->eps_bearer_id) ? gtpv1u_teid_data_p->eps_bearer_id - 4: 5-4, + 0, // mui + SDU_CONFIRM_NO, // confirm + buffer_len, + buffer, + PDCP_TRANSMISSION_MODE_DATA); + + + if ( result == FALSE ) { + + if (ctxt.configured == FALSE ) + LOG_W(GTPU, "PDCP data request failed, cause: RB is not configured!\n") ; + else + LOG_W(GTPU, "PDCP data request failed\n"); + + return NW_GTPV1U_FAILURE; + } + } else { - LOG_E(GTPU, "Received T-PDU from gtpv1u stack teid %u unknown size %u", teid, buffer_len); + LOG_W(GTPU, "Received T-PDU from gtpv1u stack teid %u unknown size %u", teid, buffer_len); } } - break; - + break; + default: { LOG_E(GTPU, "Received undefined UlpApi (%02x) from gtpv1u stack!\n", pUlpApi->apiType); } - } - + + } // end of switch + return NW_GTPV1U_OK; } @@ -593,7 +599,7 @@ gtpv1u_new_data_req( AssertFatal((rab_idP - GTPV1U_BEARER_OFFSET)< GTPV1U_MAX_BEARERS_ID, "Bad parameter rab id %u\n", rab_idP); AssertFatal((rab_idP - GTPV1U_BEARER_OFFSET) >= 0 , "Bad parameter rab id %u\n", rab_idP); - gtpv1u_data_p = >pv1u_data_g; + gtpv1u_data_p = RC.gtpv1u_data_g; /* Check that UE context is present in ue map. */ hash_rc = hashtable_get(gtpv1u_data_p->ue_mapping, (uint64_t)ue_rntiP, (void**)&ue_inst_p); @@ -712,27 +718,27 @@ gtpv1u_create_s1u_tunnel( stack_req.apiInfo.createTunnelEndPointInfo.hUlpSession = 0; stack_req.apiInfo.createTunnelEndPointInfo.hStackSession = 0; - rc = nwGtpv1uProcessUlpReq(gtpv1u_data_g.gtpv1u_stack, &stack_req); + rc = nwGtpv1uProcessUlpReq(RC.gtpv1u_data_g->gtpv1u_stack, &stack_req); LOG_D(GTPU, ".\n"); } while (rc != NW_GTPV1U_OK); //----------------------- // PDCP->GTPV1U mapping //----------------------- - hash_rc = hashtable_get(gtpv1u_data_g.ue_mapping, create_tunnel_req_pP->rnti, (void **)>pv1u_ue_data_p); + hash_rc = hashtable_get(RC.gtpv1u_data_g->ue_mapping, create_tunnel_req_pP->rnti, (void **)>pv1u_ue_data_p); if ((hash_rc == HASH_TABLE_KEY_NOT_EXISTS) || (hash_rc == HASH_TABLE_OK)) { if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) { gtpv1u_ue_data_p = calloc (1, sizeof(gtpv1u_ue_data_t)); - hash_rc = hashtable_insert(gtpv1u_data_g.ue_mapping, create_tunnel_req_pP->rnti, gtpv1u_ue_data_p); + hash_rc = hashtable_insert(RC.gtpv1u_data_g->ue_mapping, create_tunnel_req_pP->rnti, gtpv1u_ue_data_p); AssertFatal(hash_rc == HASH_TABLE_OK, "Error inserting ue_mapping in GTPV1U hashtable"); } gtpv1u_ue_data_p->ue_id = create_tunnel_req_pP->rnti; gtpv1u_ue_data_p->instance_id = 0; // TO DO memcpy(&create_tunnel_resp_pP->enb_addr.buffer, - >pv1u_data_g.enb_ip_address_for_S1u_S12_S4_up, + &RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up, sizeof (in_addr_t)); create_tunnel_resp_pP->enb_addr.length = sizeof (in_addr_t); @@ -761,6 +767,7 @@ gtpv1u_create_s1u_tunnel( gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].teid_eNB = s1u_teid; gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].teid_eNB_stack_session = stack_req.apiInfo.createTunnelEndPointInfo.hStackSession; gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].teid_sgw = create_tunnel_req_pP->sgw_S1u_teid[i]; + gtpv1u_ue_data_p->num_bearers++; create_tunnel_resp_pP->enb_S1u_teid[i] = s1u_teid; } else { @@ -774,14 +781,14 @@ gtpv1u_create_s1u_tunnel( //----------------------- // GTPV1U->PDCP mapping //----------------------- - hash_rc = hashtable_get(gtpv1u_data_g.teid_mapping, s1u_teid, (void**)>pv1u_teid_data_p); + hash_rc = hashtable_get(RC.gtpv1u_data_g->teid_mapping, s1u_teid, (void**)>pv1u_teid_data_p); if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) { gtpv1u_teid_data_p = calloc (1, sizeof(gtpv1u_teid_data_t)); gtpv1u_teid_data_p->enb_id = 0; // TO DO gtpv1u_teid_data_p->ue_id = create_tunnel_req_pP->rnti; gtpv1u_teid_data_p->eps_bearer_id = eps_bearer_id; - hash_rc = hashtable_insert(gtpv1u_data_g.teid_mapping, s1u_teid, gtpv1u_teid_data_p); + hash_rc = hashtable_insert(RC.gtpv1u_data_g->teid_mapping, s1u_teid, gtpv1u_teid_data_p); AssertFatal(hash_rc == HASH_TABLE_OK, "Error inserting teid mapping in GTPV1U hashtable"); } else { create_tunnel_resp_pP->enb_S1u_teid[i] = 0; @@ -802,7 +809,88 @@ gtpv1u_create_s1u_tunnel( return 0; } +int gtpv1u_update_s1u_tunnel( + const instance_t instanceP, + const gtpv1u_enb_create_tunnel_req_t * const create_tunnel_req_pP, + const rnti_t prior_rnti + ) +{ + /* Local tunnel end-point identifier */ + teid_t s1u_teid = 0; + gtpv1u_teid_data_t *gtpv1u_teid_data_p = NULL; + gtpv1u_ue_data_t *gtpv1u_ue_data_p = NULL; + gtpv1u_ue_data_t *gtpv1u_ue_data_new_p = NULL; + //MessageDef *message_p = NULL; + hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS; + int i,j; + uint8_t bearers_num = 0,bearers_total = 0; + + //----------------------- + // PDCP->GTPV1U mapping + //----------------------- + hash_rc = hashtable_get(RC.gtpv1u_data_g->ue_mapping, prior_rnti, (void **)>pv1u_ue_data_p); + if(hash_rc != HASH_TABLE_OK){ + LOG_E(GTPU,"Error get ue_mapping(rnti=%x) from GTPV1U hashtable error\n", prior_rnti); + return -1; + } + + gtpv1u_ue_data_new_p = calloc (1, sizeof(gtpv1u_ue_data_t)); + memcpy(gtpv1u_ue_data_new_p,gtpv1u_ue_data_p,sizeof(gtpv1u_ue_data_t)); + gtpv1u_ue_data_new_p->ue_id = create_tunnel_req_pP->rnti; + + hash_rc = hashtable_insert(RC.gtpv1u_data_g->ue_mapping, create_tunnel_req_pP->rnti, gtpv1u_ue_data_new_p); + AssertFatal(hash_rc == HASH_TABLE_OK, "Error inserting ue_mapping in GTPV1U hashtable"); + LOG_I(GTPU, "inserting ue_mapping(rnti=%x) in GTPV1U hashtable\n", + create_tunnel_req_pP->rnti); + + hash_rc = hashtable_remove(RC.gtpv1u_data_g->ue_mapping, prior_rnti); + LOG_I(GTPU, "hashtable_remove ue_mapping(rnti=%x) in GTPV1U hashtable\n", + prior_rnti); + //----------------------- + // GTPV1U->PDCP mapping + //----------------------- + bearers_total =gtpv1u_ue_data_new_p->num_bearers; + for(j = 0;jbearers[j].state != BEARER_IN_CONFIG) + continue; + + bearers_num++; + for (i = 0; i < create_tunnel_req_pP->num_tunnels; i++) { + if(j == (create_tunnel_req_pP->eps_bearer_id[i]-GTPV1U_BEARER_OFFSET)) + break; + } + if(i < create_tunnel_req_pP->num_tunnels){ + s1u_teid = gtpv1u_ue_data_new_p->bearers[j].teid_eNB; + hash_rc = hashtable_get(RC.gtpv1u_data_g->teid_mapping, s1u_teid, (void**)>pv1u_teid_data_p); + if (hash_rc == HASH_TABLE_OK) { + gtpv1u_teid_data_p->ue_id = create_tunnel_req_pP->rnti; + gtpv1u_teid_data_p->eps_bearer_id = create_tunnel_req_pP->eps_bearer_id[i]; + + LOG_I(GTPU, "updata teid_mapping te_id %u (prior_rnti %x rnti %x) in GTPV1U hashtable\n", + s1u_teid,prior_rnti,create_tunnel_req_pP->rnti); + }else{ + LOG_W(GTPU, "Error get teid mapping(s1u_teid=%u) from GTPV1U hashtable", s1u_teid); + } + }else{ + s1u_teid = gtpv1u_ue_data_new_p->bearers[j].teid_eNB; + hash_rc = hashtable_remove(RC.gtpv1u_data_g->teid_mapping, s1u_teid); + + if (hash_rc != HASH_TABLE_OK) { + LOG_D(GTPU, "Removed user rnti %x , enb S1U teid %u not found\n", prior_rnti, s1u_teid); + } + gtpv1u_ue_data_new_p->bearers[j].state = BEARER_DOWN; + gtpv1u_ue_data_new_p->num_bearers--; + LOG_I(GTPU, "delete teid_mapping te_id %u (rnti%x) bearer_id %d in GTPV1U hashtable\n", + s1u_teid,prior_rnti,j+GTPV1U_BEARER_OFFSET);; + } + if(bearers_num > bearers_total) + break; + } + return 0; + +} //----------------------------------------------------------------------------- static int gtpv1u_delete_s1u_tunnel( @@ -823,7 +911,7 @@ static int gtpv1u_delete_s1u_tunnel( GTPV1U_ENB_DELETE_TUNNEL_RESP(message_p).status = 0; - hash_rc = hashtable_get(gtpv1u_data_g.ue_mapping, req_pP->rnti, (void**)>pv1u_ue_data_p); + hash_rc = hashtable_get(RC.gtpv1u_data_g->ue_mapping, req_pP->rnti, (void**)>pv1u_ue_data_p); if (hash_rc == HASH_TABLE_OK) { @@ -840,7 +928,7 @@ static int gtpv1u_delete_s1u_tunnel( teid_eNB); stack_req.apiInfo.destroyTunnelEndPointInfo.hStackSessionHandle = gtpv1u_ue_data_p->bearers[req_pP->eps_bearer_id[erab_index] - GTPV1U_BEARER_OFFSET].teid_eNB_stack_session; - rc = nwGtpv1uProcessUlpReq(gtpv1u_data_g.gtpv1u_stack, &stack_req); + rc = nwGtpv1uProcessUlpReq(RC.gtpv1u_data_g->gtpv1u_stack, &stack_req); LOG_D(GTPU, ".\n"); } @@ -859,14 +947,14 @@ static int gtpv1u_delete_s1u_tunnel( gtpv1u_ue_data_p->num_bearers -= 1; if (gtpv1u_ue_data_p->num_bearers == 0) { - hash_rc = hashtable_remove(gtpv1u_data_g.ue_mapping, req_pP->rnti); + hash_rc = hashtable_remove(RC.gtpv1u_data_g->ue_mapping, req_pP->rnti); LOG_D(GTPU, "Removed user rnti %x,no more bearers configured\n", req_pP->rnti); } //----------------------- // GTPV1U->PDCP mapping //----------------------- - hash_rc = hashtable_remove(gtpv1u_data_g.teid_mapping, teid_eNB); + hash_rc = hashtable_remove(RC.gtpv1u_data_g->teid_mapping, teid_eNB); if (hash_rc != HASH_TABLE_OK) { LOG_D(GTPU, "Removed user rnti %x , enb S1U teid %u not found\n", req_pP->rnti, teid_eNB); @@ -891,6 +979,7 @@ static int gtpv1u_delete_s1u_tunnel( return itti_send_msg_to_task(TASK_RRC_ENB, instanceP, message_p); } + //----------------------------------------------------------------------------- static int gtpv1u_eNB_init(void) { @@ -900,34 +989,36 @@ static int gtpv1u_eNB_init(void) NwGtpv1uUdpEntityT udp; NwGtpv1uLogMgrEntityT log; NwGtpv1uTimerMgrEntityT tmr; - Enb_properties_t *enb_properties_p = NULL; - - enb_properties_p = enb_config_get()->properties[0]; - memset(>pv1u_data_g, 0, sizeof(gtpv1u_data_g)); + // enb_properties_p = enb_config_get()->properties[0]; + RC.gtpv1u_data_g = (gtpv1u_data_t*)malloc(sizeof(gtpv1u_data_t)); + memset(RC.gtpv1u_data_g, 0, sizeof(gtpv1u_data_t)); - LOG_I(GTPU, "Initializing GTPU stack %p\n",>pv1u_data_g); + RCconfig_gtpu(); + + + LOG_I(GTPU, "Initializing GTPU stack %p\n",&RC.gtpv1u_data_g); //gtpv1u_data_g.gtpv1u_stack; /* Initialize UE hashtable */ - gtpv1u_data_g.ue_mapping = hashtable_create (32, NULL, NULL); - AssertFatal(gtpv1u_data_g.ue_mapping != NULL, " ERROR Initializing TASK_GTPV1_U task interface: in hashtable_create returned %p\n", gtpv1u_data_g.ue_mapping); - gtpv1u_data_g.teid_mapping = hashtable_create (256, NULL, NULL); - AssertFatal(gtpv1u_data_g.teid_mapping != NULL, " ERROR Initializing TASK_GTPV1_U task interface: in hashtable_create\n"); - gtpv1u_data_g.enb_ip_address_for_S1u_S12_S4_up = enb_properties_p->enb_ipv4_address_for_S1U; - gtpv1u_data_g.ip_addr = NULL; - gtpv1u_data_g.enb_port_for_S1u_S12_S4_up = enb_properties_p->enb_port_for_S1U; + RC.gtpv1u_data_g->ue_mapping = hashtable_create (32, NULL, NULL); + AssertFatal(RC.gtpv1u_data_g->ue_mapping != NULL, " ERROR Initializing TASK_GTPV1_U task interface: in hashtable_create returned %p\n", RC.gtpv1u_data_g->ue_mapping); + RC.gtpv1u_data_g->teid_mapping = hashtable_create (256, NULL, NULL); + AssertFatal(RC.gtpv1u_data_g->teid_mapping != NULL, " ERROR Initializing TASK_GTPV1_U task interface: in hashtable_create\n"); +// RC.gtpv1u_data_g.enb_ip_address_for_S1u_S12_S4_up = enb_properties_p->enb_ipv4_address_for_S1U; + RC.gtpv1u_data_g->ip_addr = NULL; + //gtpv1u_data_g.udp_data; - gtpv1u_data_g.seq_num = 0; - gtpv1u_data_g.restart_counter = 0; + RC.gtpv1u_data_g->seq_num = 0; + RC.gtpv1u_data_g->restart_counter = 0; /* Initializing GTPv1-U stack */ - if ((rc = nwGtpv1uInitialize(>pv1u_data_g.gtpv1u_stack, GTPU_STACK_ENB)) != NW_GTPV1U_OK) { + if ((rc = nwGtpv1uInitialize(&RC.gtpv1u_data_g->gtpv1u_stack, GTPU_STACK_ENB)) != NW_GTPV1U_OK) { LOG_E(GTPU, "Failed to setup nwGtpv1u stack %x\n", rc); return -1; } - if ((rc = nwGtpv1uSetLogLevel(gtpv1u_data_g.gtpv1u_stack, + if ((rc = nwGtpv1uSetLogLevel(RC.gtpv1u_data_g->gtpv1u_stack, NW_LOG_LEVEL_DEBG)) != NW_GTPV1U_OK) { LOG_E(GTPU, "Failed to setup loglevel for stack %x\n", rc); return -1; @@ -939,7 +1030,7 @@ static int gtpv1u_eNB_init(void) */ ulp.ulpReqCallback = gtpv1u_eNB_process_stack_req; - if ((rc = nwGtpv1uSetUlpEntity(gtpv1u_data_g.gtpv1u_stack, &ulp)) != NW_GTPV1U_OK) { + if ((rc = nwGtpv1uSetUlpEntity(RC.gtpv1u_data_g->gtpv1u_stack, &ulp)) != NW_GTPV1U_OK) { LOG_E(GTPU, "nwGtpv1uSetUlpEntity: %x", rc); return -1; } @@ -949,14 +1040,14 @@ static int gtpv1u_eNB_init(void) */ udp.udpDataReqCallback = gtpv1u_eNB_send_udp_msg; - if ((rc = nwGtpv1uSetUdpEntity(gtpv1u_data_g.gtpv1u_stack, &udp)) != NW_GTPV1U_OK) { + if ((rc = nwGtpv1uSetUdpEntity(RC.gtpv1u_data_g->gtpv1u_stack, &udp)) != NW_GTPV1U_OK) { LOG_E(GTPU, "nwGtpv1uSetUdpEntity: %x", rc); return -1; } log.logReqCallback = gtpv1u_eNB_log_request; - if ((rc = nwGtpv1uSetLogMgrEntity(gtpv1u_data_g.gtpv1u_stack, &log)) != NW_GTPV1U_OK) { + if ((rc = nwGtpv1uSetLogMgrEntity(RC.gtpv1u_data_g->gtpv1u_stack, &log)) != NW_GTPV1U_OK) { LOG_E(GTPU, "nwGtpv1uSetLogMgrEntity: %x", rc); return -1; } @@ -968,7 +1059,7 @@ static int gtpv1u_eNB_init(void) tmr.tmrStartCallback = gtpv1u_start_timer_wrapper; tmr.tmrStopCallback = gtpv1u_stop_timer_wrapper; - if ((rc = nwGtpv1uSetTimerMgrEntity(gtpv1u_data_g.gtpv1u_stack, &tmr)) != NW_GTPV1U_OK) { + if ((rc = nwGtpv1uSetTimerMgrEntity(RC.gtpv1u_data_g->gtpv1u_stack, &tmr)) != NW_GTPV1U_OK) { LOG_E(GTPU, "nwGtpv1uSetTimerMgrEntity: %x", rc); return -1; } @@ -980,7 +1071,7 @@ static int gtpv1u_eNB_init(void) } #endif - ret = gtpv1u_eNB_send_init_udp(gtpv1u_data_g.enb_port_for_S1u_S12_S4_up); + ret = gtpv1u_eNB_send_init_udp(RC.gtpv1u_data_g->enb_port_for_S1u_S12_S4_up); if (ret < 0) { return ret; @@ -1027,7 +1118,7 @@ void *gtpv1u_eNB_task(void *args) case UDP_DATA_IND: { udp_data_ind_t *udp_data_ind_p; udp_data_ind_p = &received_message_p->ittiMsg.udp_data_ind; - nwGtpv1uProcessUdpReq(gtpv1u_data_g.gtpv1u_stack, + nwGtpv1uProcessUdpReq(RC.gtpv1u_data_g->gtpv1u_stack, udp_data_ind_p->buffer, udp_data_ind_p->buffer_length, udp_data_ind_p->peer_port, @@ -1055,7 +1146,7 @@ void *gtpv1u_eNB_task(void *args) #endif memset(&stack_req, 0, sizeof(NwGtpv1uUlpApiT)); - hash_rc = hashtable_get(gtpv1u_data_g.ue_mapping, (uint64_t)data_req_p->rnti, (void**)>pv1u_ue_data_p); + hash_rc = hashtable_get(RC.gtpv1u_data_g->ue_mapping, (uint64_t)data_req_p->rnti, (void**)>pv1u_ue_data_p); if (hash_rc == HASH_TABLE_KEY_NOT_EXISTS) { LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: while getting ue rnti %x in hashtable ue_mapping\n", data_req_p->rnti); @@ -1068,10 +1159,10 @@ void *gtpv1u_eNB_task(void *args) stack_req.apiInfo.sendtoInfo.ipAddr = gtpv1u_ue_data_p->bearers[data_req_p->rab_id - GTPV1U_BEARER_OFFSET].sgw_ip_addr; rc = nwGtpv1uGpduMsgNew( - gtpv1u_data_g.gtpv1u_stack, + RC.gtpv1u_data_g->gtpv1u_stack, sgw_s1u_teid, NW_FALSE, - gtpv1u_data_g.seq_num++, + RC.gtpv1u_data_g->seq_num++, data_req_p->buffer, data_req_p->length, data_req_p->offset, @@ -1083,7 +1174,7 @@ void *gtpv1u_eNB_task(void *args) enb_s1u_teid,sgw_s1u_teid,data_req_p->length); (void)enb_s1u_teid; /* avoid gcc warning "set but not used" */ } else { - rc = nwGtpv1uProcessUlpReq(gtpv1u_data_g.gtpv1u_stack, &stack_req); + rc = nwGtpv1uProcessUlpReq(RC.gtpv1u_data_g->gtpv1u_stack, &stack_req); if (rc != NW_GTPV1U_OK) { LOG_E(GTPU, "nwGtpv1uProcessUlpReq failed: 0x%x\n", rc); @@ -1103,7 +1194,7 @@ void *gtpv1u_eNB_task(void *args) } - rc = nwGtpv1uMsgDelete(gtpv1u_data_g.gtpv1u_stack, + rc = nwGtpv1uMsgDelete(RC.gtpv1u_data_g->gtpv1u_stack, stack_req.apiInfo.sendtoInfo.hMsg); if (rc != NW_GTPV1U_OK) { @@ -1120,12 +1211,12 @@ void *gtpv1u_eNB_task(void *args) break; case TERMINATE_MESSAGE: { - if (gtpv1u_data_g.ue_mapping != NULL) { - hashtable_destroy (gtpv1u_data_g.ue_mapping); + if (RC.gtpv1u_data_g->ue_mapping != NULL) { + hashtable_destroy (RC.gtpv1u_data_g->ue_mapping); } - if (gtpv1u_data_g.teid_mapping != NULL) { - hashtable_destroy (gtpv1u_data_g.teid_mapping); + if (RC.gtpv1u_data_g->teid_mapping != NULL) { + hashtable_destroy (RC.gtpv1u_data_g->teid_mapping); } itti_exit_task(); diff --git a/openair3/GTPV1-U/gtpv1u_eNB_defs.h b/openair3/GTPV1-U/gtpv1u_eNB_defs.h index 916d4459d9..8f8cff2e87 100644 --- a/openair3/GTPV1-U/gtpv1u_eNB_defs.h +++ b/openair3/GTPV1-U/gtpv1u_eNB_defs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u_eNB_defs.h * \brief * \author Sebastien ROUX, Lionel GAUTHIER @@ -40,6 +33,8 @@ #ifndef GTPV1U_ENB_DEFS_H_ #define GTPV1U_ENB_DEFS_H_ +#include "NwGtpv1u.h" + #define GTPV1U_UDP_PORT (2152) #define GTPV1U_BEARER_OFFSET 3 diff --git a/openair3/GTPV1-U/gtpv1u_eNB_task.h b/openair3/GTPV1-U/gtpv1u_eNB_task.h old mode 100755 new mode 100644 index b06777a55d..5a7822fe8c --- a/openair3/GTPV1-U/gtpv1u_eNB_task.h +++ b/openair3/GTPV1-U/gtpv1u_eNB_task.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u_eNB_task.h * \brief * \author Lionel Gauthier @@ -38,13 +31,16 @@ #include "messages_types.h" +/* int gtpv1u_new_data_req( uint8_t enb_id, uint8_t ue_id, uint8_t rab_id, uint8_t *buffer, - uint32_t buf_len); + uint32_t buf_len, + uint32_t buf_offset);*/ + void *gtpv1u_eNB_task(void *args); int @@ -53,5 +49,9 @@ gtpv1u_create_s1u_tunnel( const gtpv1u_enb_create_tunnel_req_t * const create_tunnel_req_pP, gtpv1u_enb_create_tunnel_resp_t * const create_tunnel_resp_pP); - +int +gtpv1u_update_s1u_tunnel( + const instance_t instanceP, + const gtpv1u_enb_create_tunnel_req_t * const create_tunnel_req_pP, + const rnti_t prior_rnti); #endif /* GTPV1U_ENB_TASK_H_ */ diff --git a/openair3/GTPV1-U/gtpv1u_sgw_defs.h b/openair3/GTPV1-U/gtpv1u_sgw_defs.h index d40410f3b7..1d62c18bf6 100644 --- a/openair3/GTPV1-U/gtpv1u_sgw_defs.h +++ b/openair3/GTPV1-U/gtpv1u_sgw_defs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef GTPV1U_SGW_DEFS_H_ #define GTPV1U_SGW_DEFS_H_ diff --git a/openair3/GTPV1-U/gtpv1u_task.c b/openair3/GTPV1-U/gtpv1u_task.c index f17a0fdd0e..a6dd6fa061 100644 --- a/openair3/GTPV1-U/gtpv1u_task.c +++ b/openair3/GTPV1-U/gtpv1u_task.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u_task.c * \brief * \author Sebastien ROUX, Lionel Gauthier diff --git a/openair3/GTPV1-U/gtpv1u_teid_pool.c b/openair3/GTPV1-U/gtpv1u_teid_pool.c index 32db1ff47e..ff0ac6f183 100644 --- a/openair3/GTPV1-U/gtpv1u_teid_pool.c +++ b/openair3/GTPV1-U/gtpv1u_teid_pool.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file gtpv1u_task.c * \brief * \author Lionel Gauthier diff --git a/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c b/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c index 2301cfe5dc..cd59028ce3 100644 --- a/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c +++ b/openair3/GTPV1-U/nw-gtpv1u/src/NwGtpv1u.c @@ -410,7 +410,7 @@ nwGtpv1uDestroyTunnelEndPoint( NwGtpv1uStackT *thiz, NwGtpv1uTunnelEndPointT *pRemovedTeid; if(pUlpReq->apiInfo.destroyTunnelEndPointInfo.hStackSessionHandle) { - GTPU_DEBUG( "Destroying Tunnel end-point '%x'", + GTPU_DEBUG( "Destroying Tunnel end-point '%lx'", pUlpReq->apiInfo.destroyTunnelEndPointInfo.hStackSessionHandle); pRemovedTeid = RB_REMOVE(NwGtpv1uTunnelEndPointIdentifierMap, &(thiz->teidMap), (NwGtpv1uTunnelEndPointT *)( @@ -423,7 +423,7 @@ nwGtpv1uDestroyTunnelEndPoint( NwGtpv1uStackT *thiz, (NwGtpv1uTunnelEndPointT *) pUlpReq->apiInfo.destroyTunnelEndPointInfo.hStackSessionHandle); } else { - GTPU_WARNING("Non-existent Tunnel end-point handle '%x'", + GTPU_WARNING("Non-existent Tunnel end-point handle '%lx'", pUlpReq->apiInfo.destroyTunnelEndPointInfo.hStackSessionHandle); } @@ -577,7 +577,7 @@ nwGtpv1uProcessGpdu( NwGtpv1uStackT *thiz, " G-PDU ltid %u size %u", tunnelEndPointKey.teid, gpduLen); - GTPU_ERROR("Received T-PDU over non-existent tunnel end-point '%x' from "NW_IPV4_ADDR"\n", + GTPU_DEBUG("Received T-PDU over non-existent tunnel end-point '%x' from "NW_IPV4_ADDR"\n", ntohl(msgHdr->teid), NW_IPV4_ADDR_FORMAT((peerIp))); } diff --git a/openair3/INTERTASK_INTERFACE b/openair3/INTERTASK_INTERFACE deleted file mode 120000 index 4bc54522d8..0000000000 --- a/openair3/INTERTASK_INTERFACE +++ /dev/null @@ -1 +0,0 @@ -../common/utils/itti \ No newline at end of file diff --git a/openair3/NAS/COMMON/API/NETWORK/COPYING b/openair3/NAS/COMMON/API/NETWORK/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/API/NETWORK/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COMMON/API/NETWORK/as_message.c b/openair3/NAS/COMMON/API/NETWORK/as_message.c index be850d31af..fd3f15cb4c 100644 --- a/openair3/NAS/COMMON/API/NETWORK/as_message.c +++ b/openair3/NAS/COMMON/API/NETWORK/as_message.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source as_message.c diff --git a/openair3/NAS/COMMON/API/NETWORK/as_message.h b/openair3/NAS/COMMON/API/NETWORK/as_message.h deleted file mode 120000 index ef8d3686fd..0000000000 --- a/openair3/NAS/COMMON/API/NETWORK/as_message.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../openair2/COMMON/as_message.h \ No newline at end of file diff --git a/openair3/NAS/COMMON/API/NETWORK/as_message.h b/openair3/NAS/COMMON/API/NETWORK/as_message.h new file mode 100644 index 0000000000..30810a325e --- /dev/null +++ b/openair3/NAS/COMMON/API/NETWORK/as_message.h @@ -0,0 +1,578 @@ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + + +/***************************************************************************** + +Source as_message.h + +Version 0.1 + +Date 2012/10/18 + +Product NAS stack + +Subsystem Application Programming Interface + +Author Frederic Maurel + +Description Defines the messages supported by the Access Stratum sublayer + protocol (usually RRC and S1AP for E-UTRAN) and functions used + to encode and decode + +*****************************************************************************/ +#ifndef __AS_MESSAGE_H__ +#define __AS_MESSAGE_H__ + +#include "commonDef.h" +#include "networkDef.h" + +/****************************************************************************/ +/********************* G L O B A L C O N S T A N T S *******************/ +/****************************************************************************/ + +/* + * -------------------------------------------------------------------------- + * Access Stratum message types + * -------------------------------------------------------------------------- + */ +#define AS_REQUEST 0x0100 +#define AS_RESPONSE 0x0200 +#define AS_INDICATION 0x0400 +#define AS_CONFIRM 0x0800 + +/* + * -------------------------------------------------------------------------- + * Access Stratum message identifiers + * -------------------------------------------------------------------------- + */ + +/* Broadcast information */ +#define AS_BROADCAST_INFO 0x01 +#define AS_BROADCAST_INFO_IND (AS_BROADCAST_INFO | AS_INDICATION) + +/* Cell information relevant for cell selection processing */ +#define AS_CELL_INFO 0x02 +#define AS_CELL_INFO_REQ (AS_CELL_INFO | AS_REQUEST) +#define AS_CELL_INFO_CNF (AS_CELL_INFO | AS_CONFIRM) +#define AS_CELL_INFO_IND (AS_CELL_INFO | AS_INDICATION) + +/* Paging information */ +#define AS_PAGING 0x03 +#define AS_PAGING_REQ (AS_PAGING | AS_REQUEST) +#define AS_PAGING_IND (AS_PAGING | AS_INDICATION) + +/* NAS signalling connection establishment */ +#define AS_NAS_ESTABLISH 0x04 +#define AS_NAS_ESTABLISH_REQ (AS_NAS_ESTABLISH | AS_REQUEST) +#define AS_NAS_ESTABLISH_IND (AS_NAS_ESTABLISH | AS_INDICATION) +#define AS_NAS_ESTABLISH_RSP (AS_NAS_ESTABLISH | AS_RESPONSE) +#define AS_NAS_ESTABLISH_CNF (AS_NAS_ESTABLISH | AS_CONFIRM) + +/* NAS signalling connection release */ +#define AS_NAS_RELEASE 0x05 +#define AS_NAS_RELEASE_REQ (AS_NAS_RELEASE | AS_REQUEST) +#define AS_NAS_RELEASE_IND (AS_NAS_RELEASE | AS_INDICATION) + +/* Uplink information transfer */ +#define AS_UL_INFO_TRANSFER 0x06 +#define AS_UL_INFO_TRANSFER_REQ (AS_UL_INFO_TRANSFER | AS_REQUEST) +#define AS_UL_INFO_TRANSFER_CNF (AS_UL_INFO_TRANSFER | AS_CONFIRM) +#define AS_UL_INFO_TRANSFER_IND (AS_UL_INFO_TRANSFER | AS_INDICATION) + +/* Downlink information transfer */ +#define AS_DL_INFO_TRANSFER 0x07 +#define AS_DL_INFO_TRANSFER_REQ (AS_DL_INFO_TRANSFER | AS_REQUEST) +#define AS_DL_INFO_TRANSFER_CNF (AS_DL_INFO_TRANSFER | AS_CONFIRM) +#define AS_DL_INFO_TRANSFER_IND (AS_DL_INFO_TRANSFER | AS_INDICATION) + +/* Radio Access Bearer establishment */ +#define AS_RAB_ESTABLISH 0x08 +#define AS_RAB_ESTABLISH_REQ (AS_RAB_ESTABLISH | AS_REQUEST) +#define AS_RAB_ESTABLISH_IND (AS_RAB_ESTABLISH | AS_INDICATION) +#define AS_RAB_ESTABLISH_RSP (AS_RAB_ESTABLISH | AS_RESPONSE) +#define AS_RAB_ESTABLISH_CNF (AS_RAB_ESTABLISH | AS_CONFIRM) + +/* Radio Access Bearer release */ +#define AS_RAB_RELEASE 0x09 +#define AS_RAB_RELEASE_REQ (AS_RAB_RELEASE | AS_REQUEST) +#define AS_RAB_RELEASE_IND (AS_RAB_RELEASE | AS_INDICATION) + +/* NAS Cause */ +#define EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED (8) +#define EPS_SERVICES_NOT_ALLOWED (7) +#define PLMN_NOT_ALLOWED (11) +#define TRACKING_AREA_NOT_ALLOWED (12) +#define ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA (13) +#define EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN (14) +#define NO_SUITABLE_CELLS_IN_TRACKING_AREA (15) +#define NETWORK_FAILURE (17) +#define ESM_FAILURE (19) + +typedef enum nas_cause_s { + NAS_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED = EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED, + NAS_CAUSE_EPS_SERVICES_NOT_ALLOWED = EPS_SERVICES_NOT_ALLOWED, + NAS_CAUSE_PLMN_NOT_ALLOWED = PLMN_NOT_ALLOWED, + NAS_CAUSE_TRACKING_AREA_NOT_ALLOWED = TRACKING_AREA_NOT_ALLOWED, + NAS_CAUSE_ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA = ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA, + NAS_CAUSE_EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN = EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN, + NAS_CAUSE_NO_SUITABLE_CELLS_IN_TRACKING_AREA = NO_SUITABLE_CELLS_IN_TRACKING_AREA, + NAS_CAUSE_NETWORK_FAILURE = NETWORK_FAILURE, + NAS_CAUSE_ESM_FAILURE = ESM_FAILURE +} nas_cause_t; + +/* + * -------------------------------------------------------------------------- + * Access Stratum message global parameters + * -------------------------------------------------------------------------- + */ + +/* Error code */ +typedef enum nas_error_code_s { + AS_SUCCESS = 1, /* Success code, transaction is going on */ + AS_TERMINATED_NAS, /* Transaction terminated by NAS */ + AS_TERMINATED_AS, /* Transaction terminated by AS */ + AS_FAILURE /* Failure code */ +} nas_error_code_t; + +/* Core network domain */ +typedef enum core_network_s { + AS_PS = 1, /* Packet-Switched */ + AS_CS /* Circuit-Switched */ +} core_network_t; + +/* SAE Temporary Mobile Subscriber Identity */ +typedef struct as_stmsi_s { + uint8_t MMEcode; /* MME code that allocated the GUTI */ + uint32_t m_tmsi; /* M-Temporary Mobile Subscriber Identity */ +} as_stmsi_t; + +/* Dedicated NAS information */ +typedef struct as_nas_info_s { + uint32_t length; /* Length of the NAS information data */ + Byte_t* data; /* Dedicated NAS information data container */ +} as_nas_info_t; + +/* Radio Access Bearer identity */ +typedef uint8_t as_rab_id_t; + +/****************************************************************************/ +/************************ G L O B A L T Y P E S ************************/ +/****************************************************************************/ + +/* + * -------------------------------------------------------------------------- + * Broadcast information + * -------------------------------------------------------------------------- + */ + +/* + * AS->NAS - Broadcast information indication + * AS may asynchronously report to NAS available PLMNs within specific + * location area + */ +typedef struct broadcast_info_ind_s { +#define PLMN_LIST_MAX_SIZE 6 + PLMN_LIST_T(PLMN_LIST_MAX_SIZE) plmnIDs; /* List of PLMN identifiers */ + ci_t cellID; /* Identity of the cell serving the listed PLMNs */ + tac_t tac; /* Code of the tracking area the cell belongs to */ +} broadcast_info_ind_t; + +/* + * -------------------------------------------------------------------------- + * Cell information relevant for cell selection processing + * -------------------------------------------------------------------------- + */ + +/* Radio access technologies supported by the network */ +#define AS_GSM (1 << NET_ACCESS_GSM) +#define AS_COMPACT (1 << NET_ACCESS_COMPACT) +#define AS_UTRAN (1 << NET_ACCESS_UTRAN) +#define AS_EGPRS (1 << NET_ACCESS_EGPRS) +#define AS_HSDPA (1 << NET_ACCESS_HSDPA) +#define AS_HSUPA (1 << NET_ACCESS_HSUPA) +#define AS_HSDUPA (1 << NET_ACCESS_HSDUPA) +#define AS_EUTRAN (1 << NET_ACCESS_EUTRAN) + +/* + * NAS->AS - Cell Information request + * NAS request AS to search for a suitable cell belonging to the selected + * PLMN to camp on. + */ +typedef struct cell_info_req_s { + plmn_t plmnID; /* Selected PLMN identity */ + Byte_t rat; /* Bitmap - set of radio access technologies */ +} cell_info_req_t; + +/* + * AS->NAS - Cell Information confirm + * AS search for a suitable cell and respond to NAS. If found, the cell + * is selected to camp on. + */ +typedef struct cell_info_cnf_s { + uint8_t errCode; /* Error code */ + ci_t cellID; /* Identity of the cell serving the selected PLMN */ + tac_t tac; /* Code of the tracking area the cell belongs to */ + AcT_t rat; /* Radio access technology supported by the cell */ + uint8_t rsrq; /* Reference signal received quality */ + uint8_t rsrp; /* Reference signal received power */ +} cell_info_cnf_t; + +/* + * AS->NAS - Cell Information indication + * AS may change cell selection if a more suitable cell is found. + */ +typedef struct cell_info_ind_s { + ci_t cellID; /* Identity of the new serving cell */ + tac_t tac; /* Code of the tracking area the cell belongs to */ +} cell_info_ind_t; + +/* + * -------------------------------------------------------------------------- + * Paging information + * -------------------------------------------------------------------------- + */ + +/* Paging cause */ +typedef enum paging_cause_s { + AS_CONNECTION_ESTABLISH, /* Establish NAS signalling connection */ + AS_EPS_ATTACH, /* Perform local detach and initiate EPS + * attach procedure */ + AS_CS_FALLBACK /* Inititate CS fallback procedure */ +} paging_cause_t; + +/* + * NAS->AS - Paging Information request + * NAS requests the AS that NAS signalling messages or user data is pending + * to be sent. + */ +typedef struct paging_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + uint8_t CN_domain; /* Core network domain */ +} paging_req_t; + +/* + * AS->NAS - Paging Information indication + * AS reports to the NAS that appropriate procedure has to be initiated. + */ +typedef struct paging_ind_s { + paging_cause_t cause; /* Paging cause */ +} paging_ind_t; + +/* + * -------------------------------------------------------------------------- + * NAS signalling connection establishment + * -------------------------------------------------------------------------- + */ + +/* Cause of RRC connection establishment */ +typedef enum as_cause_s { + AS_CAUSE_UNKNOWN = 0, + AS_CAUSE_EMERGENCY = NET_ESTABLISH_CAUSE_EMERGENCY, + AS_CAUSE_HIGH_PRIO = NET_ESTABLISH_CAUSE_HIGH_PRIO, + AS_CAUSE_MT_ACCESS = NET_ESTABLISH_CAUSE_MT_ACCESS, + AS_CAUSE_MO_SIGNAL = NET_ESTABLISH_CAUSE_MO_SIGNAL, + AS_CAUSE_MO_DATA = NET_ESTABLISH_CAUSE_MO_DATA, + AS_CAUSE_V1020 = NET_ESTABLISH_CAUSE_V1020 +} as_cause_t; + +/* Type of the call associated to the RRC connection establishment */ +typedef enum as_call_type_s { + AS_TYPE_ORIGINATING_SIGNAL = NET_ESTABLISH_TYPE_ORIGINATING_SIGNAL, + AS_TYPE_EMERGENCY_CALLS = NET_ESTABLISH_TYPE_EMERGENCY_CALLS, + AS_TYPE_ORIGINATING_CALLS = NET_ESTABLISH_TYPE_ORIGINATING_CALLS, + AS_TYPE_TERMINATING_CALLS = NET_ESTABLISH_TYPE_TERMINATING_CALLS, + AS_TYPE_MO_CS_FALLBACK = NET_ESTABLISH_TYPE_MO_CS_FALLBACK +} as_call_type_t; + +/* + * NAS->AS - NAS signalling connection establishment request + * NAS requests the AS to perform the RRC connection establishment procedure + * to transfer initial NAS message to the network while UE is in IDLE mode. + */ +typedef struct nas_establish_req_s { + as_cause_t cause; /* RRC connection establishment cause */ + as_call_type_t type; /* RRC associated call type */ + as_stmsi_t s_tmsi; /* UE identity */ + plmn_t plmnID; /* Selected PLMN identity */ + as_nas_info_t initialNasMsg; /* Initial NAS message to transfer */ +} nas_establish_req_t; + +/* + * AS->NAS - NAS signalling connection establishment indication + * AS transfers the initial NAS message to the NAS. + */ +typedef struct nas_establish_ind_s { + uint32_t UEid; /* UE lower layer identifier */ + tac_t tac; /* Code of the tracking area the initiating + * UE belongs to */ + as_cause_t asCause; /* Establishment cause */ + as_nas_info_t initialNasMsg; /* Initial NAS message to transfer */ +} nas_establish_ind_t; + +/* + * NAS->AS - NAS signalling connection establishment response + * NAS responds to the AS that initial answer message has to be provided to + * the UE. + */ +typedef struct nas_establish_rsp_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + nas_error_code_t errCode; /* Transaction status */ + as_nas_info_t nasMsg; /* NAS message to transfer */ + uint32_t nas_ul_count; /* UL NAS COUNT */ + uint16_t selected_encryption_algorithm; + uint16_t selected_integrity_algorithm; +} nas_establish_rsp_t; + +/* + * AS->NAS - NAS signalling connection establishment confirm + * AS transfers the initial answer message to the NAS. + */ +typedef struct nas_establish_cnf_s { + uint32_t UEid; /* UE lower layer identifier */ + nas_error_code_t errCode; /* Transaction status */ + as_nas_info_t nasMsg; /* NAS message to transfer */ + uint32_t ul_nas_count; + uint16_t selected_encryption_algorithm; + uint16_t selected_integrity_algorithm; +} nas_establish_cnf_t; + +/* + * -------------------------------------------------------------------------- + * NAS signalling connection release + * -------------------------------------------------------------------------- + */ + +/* Release cause */ +typedef enum release_cause_s { + AS_AUTHENTICATION_FAILURE = 1, /* Authentication procedure failed */ + AS_DETACH /* Detach requested */ +} release_cause_t; + +/* + * NAS->AS - NAS signalling connection release request + * NAS requests the termination of the connection with the UE. + */ +typedef struct nas_release_req_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + release_cause_t cause; /* Release cause */ +} nas_release_req_t; + +/* + * AS->NAS - NAS signalling connection release indication + * AS reports that connection has been terminated by the network. + */ +typedef struct nas_release_ind_s { + release_cause_t cause; /* Release cause */ +} nas_release_ind_t; + +/* + * -------------------------------------------------------------------------- + * NAS information transfer + * -------------------------------------------------------------------------- + */ + +/* + * NAS->AS - Uplink data transfer request + * NAS requests the AS to transfer uplink information to the NAS that + * operates at the network side. + */ +typedef struct ul_info_transfer_req_s { + uint32_t UEid; /* UE lower layer identifier */ + as_stmsi_t s_tmsi; /* UE identity */ + as_nas_info_t nasMsg; /* Uplink NAS message */ +} ul_info_transfer_req_t; + +/* + * AS->NAS - Uplink data transfer confirm + * AS immediately notifies the NAS whether uplink information has been + * successfully sent to the network or not. + */ +typedef struct ul_info_transfer_cnf_s { + uint32_t UEid; /* UE lower layer identifier */ + nas_error_code_t errCode; /* Transaction status */ +} ul_info_transfer_cnf_t; + +/* + * AS->NAS - Uplink data transfer indication + * AS delivers the uplink information message to the NAS that operates + * at the network side. + */ +typedef struct ul_info_transfer_ind_s { + uint32_t UEid; /* UE lower layer identifier */ + as_nas_info_t nasMsg; /* Uplink NAS message */ +} ul_info_transfer_ind_t; + +/* + * NAS->AS - Downlink data transfer request + * NAS requests the AS to transfer downlink information to the NAS that + * operates at the UE side. + */ +typedef ul_info_transfer_req_t dl_info_transfer_req_t; + +/* + * AS->NAS - Downlink data transfer confirm + * AS immediately notifies the NAS whether downlink information has been + * successfully sent to the network or not. + */ +typedef ul_info_transfer_cnf_t dl_info_transfer_cnf_t; + +/* + * AS->NAS - Downlink data transfer indication + * AS delivers the downlink information message to the NAS that operates + * at the UE side. + */ +typedef ul_info_transfer_ind_t dl_info_transfer_ind_t; + +/* + * -------------------------------------------------------------------------- + * Radio Access Bearer establishment + * -------------------------------------------------------------------------- + */ + +/* TODO: Quality of Service parameters */ +typedef struct {} as_qos_t; + +/* + * NAS->AS - Radio access bearer establishment request + * NAS requests the AS to allocate transmission resources to radio access + * bearer initialized at the network side. + */ +typedef struct rab_establish_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ + as_qos_t QoS; /* Requested Quality of Service */ +} rab_establish_req_t; + +/* + * AS->NAS - Radio access bearer establishment indication + * AS notifies the NAS that specific radio access bearer has to be setup. + */ +typedef struct rab_establish_ind_s { + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_establish_ind_t; + +/* + * NAS->AS - Radio access bearer establishment response + * NAS responds to AS whether the specified radio access bearer has been + * successfully setup or not. + */ +typedef struct rab_establish_rsp_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ + nas_error_code_t errCode; /* Transaction status */ +} rab_establish_rsp_t; + +/* + * AS->NAS - Radio access bearer establishment confirm + * AS notifies NAS whether the specified radio access bearer has been + * successfully setup at the UE side or not. + */ +typedef struct rab_establish_cnf_s { + as_rab_id_t rabID; /* Radio access bearer identity */ + nas_error_code_t errCode; /* Transaction status */ +} rab_establish_cnf_t; + +/* + * -------------------------------------------------------------------------- + * Radio Access Bearer release + * -------------------------------------------------------------------------- + */ + +/* + * NAS->AS - Radio access bearer release request + * NAS requests the AS to release transmission resources previously allocated + * to specific radio access bearer at the network side. + */ +typedef struct rab_release_req_s { + as_stmsi_t s_tmsi; /* UE identity */ + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_release_req_t; + +/* + * AS->NAS - Radio access bearer release indication + * AS notifies NAS that specific radio access bearer has been released. + */ +typedef struct rab_release_ind_s { + as_rab_id_t rabID; /* Radio access bearer identity */ +} rab_release_ind_t; + +/* + * -------------------------------------------------------------------------- + * Structure of the AS messages handled by the network sublayer + * -------------------------------------------------------------------------- + */ +typedef struct as_message_s { + uint16_t msgID; + union { + broadcast_info_ind_t broadcast_info_ind; + cell_info_req_t cell_info_req; + cell_info_cnf_t cell_info_cnf; + cell_info_ind_t cell_info_ind; + paging_req_t paging_req; + paging_ind_t paging_ind; + nas_establish_req_t nas_establish_req; + nas_establish_ind_t nas_establish_ind; + nas_establish_rsp_t nas_establish_rsp; + nas_establish_cnf_t nas_establish_cnf; + nas_release_req_t nas_release_req; + nas_release_ind_t nas_release_ind; + ul_info_transfer_req_t ul_info_transfer_req; + ul_info_transfer_cnf_t ul_info_transfer_cnf; + ul_info_transfer_ind_t ul_info_transfer_ind; + dl_info_transfer_req_t dl_info_transfer_req; + dl_info_transfer_cnf_t dl_info_transfer_cnf; + dl_info_transfer_ind_t dl_info_transfer_ind; + rab_establish_req_t rab_establish_req; + rab_establish_ind_t rab_establish_ind; + rab_establish_rsp_t rab_establish_rsp; + rab_establish_cnf_t rab_establish_cnf; + rab_release_req_t rab_release_req; + rab_release_ind_t rab_release_ind; + } __attribute__((__packed__)) msg; +} as_message_t; + +/****************************************************************************/ +/******************** G L O B A L V A R I A B L E S ********************/ +/****************************************************************************/ + +/****************************************************************************/ +/****************** E X P O R T E D F U N C T I O N S ******************/ +/****************************************************************************/ + +int as_message_decode(const char* buffer, as_message_t* msg, int length); + +int as_message_encode(char* buffer, as_message_t* msg, int length); + +/* Implemented in the network_api.c body file */ +int as_message_send(as_message_t* as_msg); + +#endif /* __AS_MESSAGE_H__*/ diff --git a/openair3/NAS/COMMON/API/NETWORK/l2_message.h b/openair3/NAS/COMMON/API/NETWORK/l2_message.h index 02e5d87354..9cf65b7736 100644 --- a/openair3/NAS/COMMON/API/NETWORK/l2_message.h +++ b/openair3/NAS/COMMON/API/NETWORK/l2_message.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source as_message.h @@ -116,6 +109,14 @@ Description Defines the messages supported by the Access Stratum sublayer #define AS_HSDUPA (1 << NET_ACCESS_HSDUPA) #define AS_EUTRAN (1 << NET_ACCESS_EUTRAN) +/* + * NAS->AS -K_eNB refresh request + * NAS request AS to refresh its KeNB key + */ +typedef struct kenb_refresh_req_s { + Byte_t kenb[32]; +} kenb_refresh_req_t; + /* * NAS->AS - Cell Information request * NAS request AS to search for a suitable cell belonging to the selected diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.c b/openair3/NAS/COMMON/API/NETWORK/nas_message.c index e0face9576..4eea2c4d6b 100644 --- a/openair3/NAS/COMMON/API/NETWORK/nas_message.c +++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source nas_message.h @@ -60,6 +53,8 @@ Description Defines the layer 3 messages supported by the NAS sublayer #include "secu_defs.h" #include "emmData.h" +//#define DEBUG_NAS_MESSAGE + /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ @@ -528,7 +523,7 @@ int nas_message_encode( /* Compute the NAS message authentication code */ LOG_TRACE(DEBUG, "offset %d = %d - %d, hdr encode = %d, length = %d bytes = %d", - offset, size, sizeof(uint8_t), + offset, size, (int)sizeof(uint8_t), size, length, bytes); uint32_t mac = _nas_message_get_mac( buffer + offset, @@ -997,12 +992,12 @@ static int _nas_message_decrypt( case NAS_SECURITY_ALGORITHMS_EEA1: { if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1031,12 +1026,12 @@ static int _nas_message_decrypt( case NAS_SECURITY_ALGORITHMS_EEA2: { if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1159,12 +1154,12 @@ static int _nas_message_encrypt( case NAS_SECURITY_ALGORITHMS_EEA1: { if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1190,12 +1185,12 @@ static int _nas_message_encrypt( case NAS_SECURITY_ALGORITHMS_EEA2: { if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1301,15 +1296,17 @@ static uint32_t _nas_message_get_mac( uint32_t count; uint32_t *mac32; +#ifdef DEBUG_NAS_MESSAGE int i,bytes = 0; +#endif if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } @@ -1319,6 +1316,7 @@ static uint32_t _nas_message_get_mac( (direction == SECU_DIRECTION_UPLINK) ? emm_security_context->ul_count.seq_num:emm_security_context->dl_count.seq_num, count); +#ifdef DEBUG_NAS_MESSAGE fprintf(stderr, "\n[NAS]\t"); for (i=0; i < length; i++) { @@ -1338,6 +1336,7 @@ static uint32_t _nas_message_get_mac( fprintf(stderr, "\n"); fflush(stderr); +#endif stream_cipher.key = emm_security_context->knas_int.value; stream_cipher.key_length = AUTH_KNAS_INT_SIZE; @@ -1370,12 +1369,12 @@ static uint32_t _nas_message_get_mac( uint32_t *mac32; if (direction == SECU_DIRECTION_UPLINK) { - count = 0x00000000 || - ((emm_security_context->ul_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->ul_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->ul_count.seq_num & 0x000000FF); } else { - count = 0x00000000 || - ((emm_security_context->dl_count.overflow && 0x0000FFFF) << 8) || + count = 0x00000000 | + ((emm_security_context->dl_count.overflow & 0x0000FFFF) << 8) | (emm_security_context->dl_count.seq_num & 0x000000FF); } diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.h b/openair3/NAS/COMMON/API/NETWORK/nas_message.h index cecd676c93..8fde6eb97d 100644 --- a/openair3/NAS/COMMON/API/NETWORK/nas_message.h +++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source nas_message.h diff --git a/openair3/NAS/COMMON/API/NETWORK/network_api.c b/openair3/NAS/COMMON/API/NETWORK/network_api.c index a057c7e5b0..160eb78e17 100644 --- a/openair3/NAS/COMMON/API/NETWORK/network_api.c +++ b/openair3/NAS/COMMON/API/NETWORK/network_api.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source network_api.c diff --git a/openair3/NAS/COMMON/API/NETWORK/network_api.h b/openair3/NAS/COMMON/API/NETWORK/network_api.h index bf531539bd..57abb2c4f6 100644 --- a/openair3/NAS/COMMON/API/NETWORK/network_api.h +++ b/openair3/NAS/COMMON/API/NETWORK/network_api.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source network_api.h diff --git a/openair3/NAS/COMMON/COPYING b/openair3/NAS/COMMON/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c index c7e4c36614..8ac43cf7b1 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include @@ -35,6 +28,7 @@ #include "TLVEncoder.h" #include "TLVDecoder.h" #include "AttachAccept.h" +#include "assertions.h" int decode_attach_accept(attach_accept_msg *attach_accept, uint8_t *buffer, uint32_t len) { @@ -66,7 +60,7 @@ int decode_attach_accept(attach_accept_msg *attach_accept, uint8_t *buffer, uint decoded += decoded_result; /* Decoding optional fields */ - while(len - decoded > 0) { + while(((int32_t)len - (int32_t)decoded) > 0) { uint8_t ieiDecoded = *(buffer + decoded); /* Type | value iei are below 0x80 so just return the first 4 bits */ @@ -195,10 +189,12 @@ int decode_attach_accept(attach_accept_msg *attach_accept, uint8_t *buffer, uint default: errorCodeDecoder = TLV_DECODE_UNEXPECTED_IEI; + LOG_TRACE(WARNING, "DECODE_UNEXPECTED_IEI %x (4 bits)", ieiDecoded); + AssertFatal(0, " "); return TLV_DECODE_UNEXPECTED_IEI; } } - + LOG_TRACE(WARNING, "DECODED %d\n", decoded); return decoded; } diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h index 760d85ec05..3d944e8bfb 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachAccept.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c index f36176f16b..26d4b6ddd7 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h index f11623ff44..e11ad97156 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachComplete.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachReject.c b/openair3/NAS/COMMON/EMM/MSG/AttachReject.c index eed7199635..c0b3208ff9 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachReject.h b/openair3/NAS/COMMON/EMM/MSG/AttachReject.h index e65fe17325..5ab3b57308 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c index fa11d84ed7..7448a33419 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h index 26937ad5d6..a7e4c1f17c 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/AttachRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c index 79a12874cf..89368d7523 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h index 978bf31f18..5670b0a5c1 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationFailure.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c index 1b8643083e..5ca9b1a503 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h index 629b032074..2a2ca7b7d2 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c index bba6ea7f3b..0914353478 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include @@ -45,7 +38,7 @@ int decode_authentication_request(authentication_request_msg *authentication_req CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, AUTHENTICATION_REQUEST_MINIMUM_LENGTH, len); /* Decoding mandatory fields */ - if ((decoded_result = decode_u8_nas_key_set_identifier(&authentication_request->naskeysetidentifierasme, 0, *(buffer + decoded) >> 4, len - decoded)) < 0) + if ((decoded_result = decode_u8_nas_key_set_identifier(&authentication_request->naskeysetidentifierasme, 0, *(buffer + decoded), len - decoded)) < 0) return decoded_result; decoded++; diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h index 2997836b0f..306c8bb404 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c index db508c5786..4834348595 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h index 3442e34064..4d49518ba0 100644 --- a/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h +++ b/openair3/NAS/COMMON/EMM/MSG/AuthenticationResponse.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/COPYING b/openair3/NAS/COMMON/EMM/MSG/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/EMM/MSG/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c index 08514dfbe1..20193ef0b6 100644 --- a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c +++ b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h index e726802840..c173d3b729 100644 --- a/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h +++ b/openair3/NAS/COMMON/EMM/MSG/CsServiceNotification.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c index 7b3a79453a..0ad1066c4c 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c +++ b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h index a04905aef6..73c4e8dcb6 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h +++ b/openair3/NAS/COMMON/EMM/MSG/DetachAccept.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c index 81675e6fd0..1697ea17e2 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h index 572466d139..93cdcab1ac 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/DetachRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c index a5255e99ea..5dbce59902 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c +++ b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h index 111958fdf1..f41ce23b0e 100644 --- a/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h +++ b/openair3/NAS/COMMON/EMM/MSG/DownlinkNasTransport.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c index 2901998eb6..d18e115db9 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c +++ b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h index a3f8059561..79eec4ddce 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h +++ b/openair3/NAS/COMMON/EMM/MSG/EmmInformation.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c index 274f8d47c0..f283d64bc9 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c +++ b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h index 716d08763a..dc860acec7 100644 --- a/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h +++ b/openair3/NAS/COMMON/EMM/MSG/EmmStatus.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c index 903d92c51f..a7ff89245b 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h index d0a9d02e92..defe200c0f 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/ExtendedServiceRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c index 313212c09d..fac3ddbca9 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h index 68a68d6dc6..11338ddc21 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationCommand.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c index c7bdda8a0f..16083176ae 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h index 63a51cbe2c..f0c41a3ac9 100644 --- a/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/GutiReallocationComplete.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c index 3d785cddf8..17e1d26722 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h index 97f783addd..ddd339e88d 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c index 827b9e64e0..1743a29d20 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h index c6bb0d8f71..61842cc6c2 100644 --- a/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h +++ b/openair3/NAS/COMMON/EMM/MSG/IdentityResponse.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h index 66baa17269..9016024af6 100644 --- a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h +++ b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeCommand.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h index 0c4c5400d9..938bb9e371 100644 --- a/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/NASSecurityModeComplete.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c b/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c index 2086d59489..25181d8e79 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeCommand.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include @@ -79,6 +72,8 @@ int decode_security_mode_command(security_mode_command_msg *security_mode_comman decoded += decoded_result; /* Set corresponding mask to 1 in presencemask */ security_mode_command->presencemask |= SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT; + LOG_TRACE(INFO," SECURITY MODE COMMAND: IMEISV_REQUEST: %d \n",security_mode_command->imeisvrequest); + break; case SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_IEI: diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c b/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c index e3fbbf3a78..8dd8b2e1b7 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeComplete.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include @@ -83,8 +76,11 @@ int encode_security_mode_complete(security_mode_complete_msg *security_mode_comp /* Checking IEI and pointer */ CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, SECURITY_MODE_COMPLETE_MINIMUM_LENGTH, len); + LOG_TRACE(INFO,"SECURITY MODE COMMAND COMPLETE: presencemask: %d \n",security_mode_complete->presencemask); + if ((security_mode_complete->presencemask & SECURITY_MODE_COMPLETE_IMEISV_PRESENT) == SECURITY_MODE_COMPLETE_IMEISV_PRESENT) { + LOG_TRACE(INFO,"SECURITY MODE COMMAND COMPLETE: encode imeisv \n"); if ((encode_result = encode_mobile_identity(&security_mode_complete->imeisv, SECURITY_MODE_COMPLETE_IMEISV_IEI, buffer + encoded, len - @@ -94,7 +90,7 @@ int encode_security_mode_complete(security_mode_complete_msg *security_mode_comp else encoded += encode_result; } - + LOG_TRACE(INFO,"SECURITY MODE COMMAND COMPLETE done !!! \n"); return encoded; } diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c index 972aad0444..5e49f4414d 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h index 0067104fcd..5f9cf5bcd2 100644 --- a/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/SecurityModeReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c index 0e2aff4374..0f703871ca 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h index 8a5525d00c..67a0317afd 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c index df51149b88..9a2faf2178 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h index 999d5d9f37..548eb933e3 100644 --- a/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/ServiceRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c index 0d4aea3f12..159175da1b 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h index 1b07da4c7f..8ce780aab1 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c index 5facc985f5..bf8b80d5f2 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h index bdb7083c35..1b5de76e2f 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c index 56bbcdc7e5..c0fbdf711a 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h index 055ae55ae7..9066eb586a 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c index 53fe541e47..49632057c0 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h index b4ee5bcb42..6fe2726130 100644 --- a/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h +++ b/openair3/NAS/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c index 61b85ca2ca..0aaadc9316 100644 --- a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c +++ b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h index 02a58b104f..f2e7cd392a 100644 --- a/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h +++ b/openair3/NAS/COMMON/EMM/MSG/UplinkNasTransport.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_cause.h b/openair3/NAS/COMMON/EMM/MSG/emm_cause.h index 231e8bfe86..4b7796c95c 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_cause.h +++ b/openair3/NAS/COMMON/EMM/MSG/emm_cause.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source emm_cause.h diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_msg.c b/openair3/NAS/COMMON/EMM/MSG/emm_msg.c index b727b09a73..b9c9b93a9c 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_msg.c +++ b/openair3/NAS/COMMON/EMM/MSG/emm_msg.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source emm_msg.c @@ -471,6 +464,9 @@ int emm_msg_encode(EMM_msg *msg, uint8_t *buffer, uint32_t len) #endif } + if (encode_result < 0) + LOG_FUNC_RETURN (encode_result); + LOG_FUNC_RETURN (header_result + encode_result); } diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_msg.h b/openair3/NAS/COMMON/EMM/MSG/emm_msg.h index db36f45948..56985227ad 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_msg.h +++ b/openair3/NAS/COMMON/EMM/MSG/emm_msg.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source emm_msg.h diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h b/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h index 3e7ba3b50f..b95e140595 100644 --- a/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h +++ b/openair3/NAS/COMMON/EMM/MSG/emm_msgDef.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Version 0.1 diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c index 1e95091471..e77e1d7749 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h index 90db94714b..2bb3e7e423 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c index 09b9ef66f6..1a1d6ffbdb 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h index 30e1e72d62..4b69cbc454 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c index 2c081468b2..f4f0a3343c 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h index 89ce283302..3bf2794e1d 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c index 116160b0e1..d94c6f4652 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h index 231a87d117..045ef495af 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c index ecb40aee2b..f5828ac87a 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h index b18cf46a62..abfda25f63 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c index 56e570903d..068ee5db6a 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h index 254087da4e..6931038bd8 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c index ff859d659b..c7b42cc9b4 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h index 41073b2aa6..321b0e4ff5 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c index 2ad5018d15..3fddc04983 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h index 8b4ef0fff9..17283167f6 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceAllocationRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c index 57591de457..8b1ace65b8 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h index e06922fa20..f437c70948 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c index b5e623343a..ff0a5294d9 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h index e209c74bfe..90a3ec5928 100644 --- a/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/BearerResourceModificationRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/COPYING b/openair3/NAS/COMMON/ESM/MSG/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/ESM/MSG/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c index 3d05c2e7d1..07ea8f7f68 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h index 23b46c7b2f..446a59a085 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c index 77038dee23..7a4647c57b 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h index 3cfa64a57a..72b39113f9 100644 --- a/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c index 79e5b3d732..622135c312 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h index d2dad73b46..8d2b6511fd 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c index c278784ae2..e562d2a814 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h index 3b66dadcc4..58751b54d3 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h +++ b/openair3/NAS/COMMON/ESM/MSG/EsmInformationResponse.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c index 7f6be43a9f..8c8bd62bd0 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c +++ b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h index afcf3142af..4f6e213ec8 100644 --- a/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h +++ b/openair3/NAS/COMMON/ESM/MSG/EsmStatus.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c index b4f6833dfc..23a6ce5230 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h index 688e0ec814..218c3cf874 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c index 01aaa5575d..71e05c06e6 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h index 5c40f44879..b2d7cc56b7 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c index 1624e4e3c3..02b978b822 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h index 2b21e1b2fd..2eb1ae8945 100644 --- a/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c index 30fa4242f4..f7b1256f9d 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h index 3e5ad16c02..fb2fe9fa19 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c index 6ca5ca94ab..957d813cf1 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h index 78b227ce37..3cd791a5f8 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnConnectivityRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c index 73a095d15d..9081ee885e 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h index 980d0f6d09..0c064617ee 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectReject.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c index 7ab48c6c39..506cb2959e 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h index 9ac114df3a..94c2c2c3bf 100644 --- a/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h +++ b/openair3/NAS/COMMON/ESM/MSG/PdnDisconnectRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_cause.h b/openair3/NAS/COMMON/ESM/MSG/esm_cause.h index e731ec1a8b..124663e05b 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_cause.h +++ b/openair3/NAS/COMMON/ESM/MSG/esm_cause.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source esm_cause.h diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_msg.c b/openair3/NAS/COMMON/ESM/MSG/esm_msg.c index d9f7df6854..f4d3dd94dd 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_msg.c +++ b/openair3/NAS/COMMON/ESM/MSG/esm_msg.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source esm_msg.c diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_msg.h b/openair3/NAS/COMMON/ESM/MSG/esm_msg.h index 9ed64ea2a5..ef8c05dd95 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_msg.h +++ b/openair3/NAS/COMMON/ESM/MSG/esm_msg.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source esm_msg.h diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h b/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h index 2bb0a4e188..48e6a18a90 100644 --- a/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h +++ b/openair3/NAS/COMMON/ESM/MSG/esm_msgDef.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Version 0.1 diff --git a/openair3/NAS/COMMON/IES/AccessPointName.c b/openair3/NAS/COMMON/IES/AccessPointName.c index 3a40d84a23..c63bb91222 100644 --- a/openair3/NAS/COMMON/IES/AccessPointName.c +++ b/openair3/NAS/COMMON/IES/AccessPointName.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AccessPointName.h b/openair3/NAS/COMMON/IES/AccessPointName.h index a05d6f0d53..6c10a942b5 100644 --- a/openair3/NAS/COMMON/IES/AccessPointName.h +++ b/openair3/NAS/COMMON/IES/AccessPointName.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c index 7a24f4a31e..1869155aba 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h index 6c96baaa2a..4f6cf5a4a0 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateResult.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateType.c b/openair3/NAS/COMMON/IES/AdditionalUpdateType.c index d3e713480e..5bed4fdbb8 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateType.c +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateType.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AdditionalUpdateType.h b/openair3/NAS/COMMON/IES/AdditionalUpdateType.h index 49fbcc137e..57a2f0e075 100644 --- a/openair3/NAS/COMMON/IES/AdditionalUpdateType.h +++ b/openair3/NAS/COMMON/IES/AdditionalUpdateType.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c index f892f93450..4d01fc5b46 100644 --- a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c +++ b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h index e7eb8da33f..82d3da4094 100644 --- a/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h +++ b/openair3/NAS/COMMON/IES/ApnAggregateMaximumBitRate.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c index 179808307e..4989ae27fe 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c +++ b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h index f2208ef057..81b943afe4 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h +++ b/openair3/NAS/COMMON/IES/AuthenticationFailureParameter.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c index b2b9c72696..7de70359f7 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h index d75855e45a..63866642eb 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterAutn.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c index ae402e41c7..a63a03bec1 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h index b940e8304f..bdea4e9eed 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h +++ b/openair3/NAS/COMMON/IES/AuthenticationParameterRand.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c index b142fed5a6..3ac3e60a3d 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c +++ b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h index 0ea7c1af04..4e3dd33d5b 100644 --- a/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h +++ b/openair3/NAS/COMMON/IES/AuthenticationResponseParameter.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/COPYING b/openair3/NAS/COMMON/IES/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/IES/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c index c2e395f4fb..e10fe42a77 100644 --- a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c +++ b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h index d1fd9627f4..18955204c5 100644 --- a/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h +++ b/openair3/NAS/COMMON/IES/CipheringKeySequenceNumber.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/Cli.c b/openair3/NAS/COMMON/IES/Cli.c index e8c662e289..e8878a2642 100644 --- a/openair3/NAS/COMMON/IES/Cli.c +++ b/openair3/NAS/COMMON/IES/Cli.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/Cli.h b/openair3/NAS/COMMON/IES/Cli.h index 293bdf28a2..47b9c35838 100644 --- a/openair3/NAS/COMMON/IES/Cli.h +++ b/openair3/NAS/COMMON/IES/Cli.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/CsfbResponse.c b/openair3/NAS/COMMON/IES/CsfbResponse.c index aa0e2478af..b5ab64ce8d 100644 --- a/openair3/NAS/COMMON/IES/CsfbResponse.c +++ b/openair3/NAS/COMMON/IES/CsfbResponse.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/CsfbResponse.h b/openair3/NAS/COMMON/IES/CsfbResponse.h index b20a50bcb0..05aba3bf8f 100644 --- a/openair3/NAS/COMMON/IES/CsfbResponse.h +++ b/openair3/NAS/COMMON/IES/CsfbResponse.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DaylightSavingTime.c b/openair3/NAS/COMMON/IES/DaylightSavingTime.c index fe10157bb9..b5c242414d 100644 --- a/openair3/NAS/COMMON/IES/DaylightSavingTime.c +++ b/openair3/NAS/COMMON/IES/DaylightSavingTime.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DaylightSavingTime.h b/openair3/NAS/COMMON/IES/DaylightSavingTime.h index 6e676d6e72..993065c958 100644 --- a/openair3/NAS/COMMON/IES/DaylightSavingTime.h +++ b/openair3/NAS/COMMON/IES/DaylightSavingTime.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DetachType.c b/openair3/NAS/COMMON/IES/DetachType.c index b27fae53d4..8a925eb7b4 100644 --- a/openair3/NAS/COMMON/IES/DetachType.c +++ b/openair3/NAS/COMMON/IES/DetachType.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DetachType.h b/openair3/NAS/COMMON/IES/DetachType.h index 3728aa7702..c1b1b2a37f 100644 --- a/openair3/NAS/COMMON/IES/DetachType.h +++ b/openair3/NAS/COMMON/IES/DetachType.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DrxParameter.c b/openair3/NAS/COMMON/IES/DrxParameter.c index f920ead27f..3734f86976 100644 --- a/openair3/NAS/COMMON/IES/DrxParameter.c +++ b/openair3/NAS/COMMON/IES/DrxParameter.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/DrxParameter.h b/openair3/NAS/COMMON/IES/DrxParameter.h index d30c0e033a..43af09f018 100644 --- a/openair3/NAS/COMMON/IES/DrxParameter.h +++ b/openair3/NAS/COMMON/IES/DrxParameter.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EmergencyNumberList.c b/openair3/NAS/COMMON/IES/EmergencyNumberList.c index 084dbd15fa..ccf030b583 100644 --- a/openair3/NAS/COMMON/IES/EmergencyNumberList.c +++ b/openair3/NAS/COMMON/IES/EmergencyNumberList.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include @@ -48,10 +41,24 @@ int decode_emergency_number_list(EmergencyNumberList *emergencynumberlist, uint8 ielen = *(buffer + decoded); decoded++; CHECK_LENGTH_DECODER(len - decoded, ielen); - emergencynumberlist->lengthofemergency = *(buffer + decoded); - decoded++; - emergencynumberlist->emergencyservicecategoryvalue = *(buffer + decoded) & 0x1f; - decoded++; + int information_element_index = 0; + while ((decoded < ielen) && (information_element_index < EMERGENCY_NUMBER_LIST_MAX_NUMBER_INFORMATION)) { + emergencynumberlist->emergency_number_information[information_element_index].lengthofemergency = *(buffer + decoded); + decoded++; + emergencynumberlist->emergency_number_information[information_element_index].emergencyservicecategoryvalue = *(buffer + decoded) & 0x1f; + decoded++; + int remaining_len = emergencynumberlist->emergency_number_information[information_element_index].lengthofemergency - 1; + int digit_index = 0; + while (remaining_len > 0) { + emergencynumberlist->emergency_number_information[information_element_index].bcd_digits[digit_index++] = *(buffer + decoded); + decoded++; + remaining_len --; + } + while (digit_index < EMERGENCY_NUMBER_LIST_MAX_2DIGITS) { + emergencynumberlist->emergency_number_information[information_element_index].bcd_digits[digit_index++] = 0xFF; + } + information_element_index++; + } #if defined (NAS_DEBUG) dump_emergency_number_list_xml(emergencynumberlist, iei); #endif @@ -74,11 +81,16 @@ int encode_emergency_number_list(EmergencyNumberList *emergencynumberlist, uint8 lenPtr = (buffer + encoded); encoded ++; - *(buffer + encoded) = emergencynumberlist->lengthofemergency; - encoded++; - *(buffer + encoded) = 0x00 | - (emergencynumberlist->emergencyservicecategoryvalue & 0x1f); - encoded++; + for ( int ie_index = 0; ie_index < emergencynumberlist->num_emergency_elements; ie_index++) { + *(buffer + encoded) = emergencynumberlist->emergency_number_information[ie_index].lengthofemergency; + encoded++; + *(buffer + encoded) = 0x00 | + (emergencynumberlist->emergency_number_information[ie_index].emergencyservicecategoryvalue & 0x1f); + encoded++; + for (int bcd2_index = 0; bcd2_index < (emergencynumberlist->emergency_number_information[ie_index].lengthofemergency - 1); bcd2_index++) { + *(buffer + encoded) = emergencynumberlist->emergency_number_information[ie_index].bcd_digits[bcd2_index]; + } + } *lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0); return encoded; } @@ -90,9 +102,20 @@ void dump_emergency_number_list_xml(EmergencyNumberList *emergencynumberlist, ui if (iei > 0) /* Don't display IEI if = 0 */ printf(" 0x%X\n", iei); - - printf(" %u\n", emergencynumberlist->lengthofemergency); - printf(" %u\n", emergencynumberlist->emergencyservicecategoryvalue); + for ( int ie_index = 0; ie_index < emergencynumberlist->num_emergency_elements; ie_index++) { + printf(" %u\n", emergencynumberlist->emergency_number_information[ie_index].lengthofemergency); + printf(" %u\n", emergencynumberlist->emergency_number_information[ie_index].emergencyservicecategoryvalue); + for (int bcd2_index = 0; bcd2_index < (emergencynumberlist->emergency_number_information[ie_index].lengthofemergency - 1); bcd2_index++) { + uint8_t bcd1 = emergencynumberlist->emergency_number_information[ie_index].bcd_digits[bcd2_index] & 0x0f; + uint8_t bcd2 = (emergencynumberlist->emergency_number_information[ie_index].bcd_digits[bcd2_index] & 0xf0) >> 4; + if (bcd1 < 10) { + printf(" %u\n", (bcd2_index*2)+1, bcd1, (bcd2_index*2)+1); + if (bcd2 < 10) { + printf(" %u\n", (bcd2_index*2)+2, bcd2, (bcd2_index*2)+2); + } + } + } + } printf("\n"); } diff --git a/openair3/NAS/COMMON/IES/EmergencyNumberList.h b/openair3/NAS/COMMON/IES/EmergencyNumberList.h index 090ce1ec38..d8147eccde 100644 --- a/openair3/NAS/COMMON/IES/EmergencyNumberList.h +++ b/openair3/NAS/COMMON/IES/EmergencyNumberList.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include @@ -39,8 +32,14 @@ #define EMERGENCY_NUMBER_LIST_MAXIMUM_LENGTH 50 typedef struct EmergencyNumberList_tag { - uint8_t lengthofemergency; - uint8_t emergencyservicecategoryvalue:5; + uint8_t num_emergency_elements; + struct { + uint8_t lengthofemergency; + uint8_t emergencyservicecategoryvalue:5; +#define EMERGENCY_NUMBER_LIST_MAX_2DIGITS 6 + uint8_t bcd_digits[EMERGENCY_NUMBER_LIST_MAX_2DIGITS]; // length to be fixed +#define EMERGENCY_NUMBER_LIST_MAX_NUMBER_INFORMATION 2 + } emergency_number_information[EMERGENCY_NUMBER_LIST_MAX_NUMBER_INFORMATION]; } EmergencyNumberList; int encode_emergency_number_list(EmergencyNumberList *emergencynumberlist, uint8_t iei, uint8_t *buffer, uint32_t len); diff --git a/openair3/NAS/COMMON/IES/EmmCause.c b/openair3/NAS/COMMON/IES/EmmCause.c index a89d0d6c30..965f1e0f13 100644 --- a/openair3/NAS/COMMON/IES/EmmCause.c +++ b/openair3/NAS/COMMON/IES/EmmCause.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EmmCause.h b/openair3/NAS/COMMON/IES/EmmCause.h index 42d9f51904..11ac2489b9 100644 --- a/openair3/NAS/COMMON/IES/EmmCause.h +++ b/openair3/NAS/COMMON/IES/EmmCause.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachResult.c b/openair3/NAS/COMMON/IES/EpsAttachResult.c index 6b70585324..b48b043ad3 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachResult.c +++ b/openair3/NAS/COMMON/IES/EpsAttachResult.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachResult.h b/openair3/NAS/COMMON/IES/EpsAttachResult.h index 1c459ce914..500ce05399 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachResult.h +++ b/openair3/NAS/COMMON/IES/EpsAttachResult.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachType.c b/openair3/NAS/COMMON/IES/EpsAttachType.c index 8bc691fe55..aa07d0ba89 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachType.c +++ b/openair3/NAS/COMMON/IES/EpsAttachType.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsAttachType.h b/openair3/NAS/COMMON/IES/EpsAttachType.h index 268c997db2..7f57077a4d 100644 --- a/openair3/NAS/COMMON/IES/EpsAttachType.h +++ b/openair3/NAS/COMMON/IES/EpsAttachType.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c index b51cf95b67..9984375dff 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c +++ b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h index be1fd2f21c..fd29285cce 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h +++ b/openair3/NAS/COMMON/IES/EpsBearerContextStatus.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerIdentity.c b/openair3/NAS/COMMON/IES/EpsBearerIdentity.c index f7d405a415..3ad83c1eaf 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerIdentity.c +++ b/openair3/NAS/COMMON/IES/EpsBearerIdentity.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsBearerIdentity.h b/openair3/NAS/COMMON/IES/EpsBearerIdentity.h index 2c6c9868ab..d8f89751e0 100644 --- a/openair3/NAS/COMMON/IES/EpsBearerIdentity.h +++ b/openair3/NAS/COMMON/IES/EpsBearerIdentity.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsMobileIdentity.c b/openair3/NAS/COMMON/IES/EpsMobileIdentity.c index 448858f55c..4437412b86 100644 --- a/openair3/NAS/COMMON/IES/EpsMobileIdentity.c +++ b/openair3/NAS/COMMON/IES/EpsMobileIdentity.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsMobileIdentity.h b/openair3/NAS/COMMON/IES/EpsMobileIdentity.h index 105db68a05..d9b13f250c 100644 --- a/openair3/NAS/COMMON/IES/EpsMobileIdentity.h +++ b/openair3/NAS/COMMON/IES/EpsMobileIdentity.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c index 162db783d5..3a842406f0 100644 --- a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c +++ b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h index cbe1a0d6f1..f367af6ac8 100644 --- a/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h +++ b/openair3/NAS/COMMON/IES/EpsNetworkFeatureSupport.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsQualityOfService.c b/openair3/NAS/COMMON/IES/EpsQualityOfService.c index 0a467baffe..ac45a9c0f5 100644 --- a/openair3/NAS/COMMON/IES/EpsQualityOfService.c +++ b/openair3/NAS/COMMON/IES/EpsQualityOfService.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsQualityOfService.h b/openair3/NAS/COMMON/IES/EpsQualityOfService.h index 10703399e9..ab8f752838 100644 --- a/openair3/NAS/COMMON/IES/EpsQualityOfService.h +++ b/openair3/NAS/COMMON/IES/EpsQualityOfService.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateResult.c b/openair3/NAS/COMMON/IES/EpsUpdateResult.c index 8ee25b4aba..a91da63985 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateResult.c +++ b/openair3/NAS/COMMON/IES/EpsUpdateResult.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateResult.h b/openair3/NAS/COMMON/IES/EpsUpdateResult.h index d3aabc3402..9f8b289248 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateResult.h +++ b/openair3/NAS/COMMON/IES/EpsUpdateResult.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateType.c b/openair3/NAS/COMMON/IES/EpsUpdateType.c index 571b267dcb..309031dcee 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateType.c +++ b/openair3/NAS/COMMON/IES/EpsUpdateType.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EpsUpdateType.h b/openair3/NAS/COMMON/IES/EpsUpdateType.h index 09578574f6..fff1171dbc 100644 --- a/openair3/NAS/COMMON/IES/EpsUpdateType.h +++ b/openair3/NAS/COMMON/IES/EpsUpdateType.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmCause.c b/openair3/NAS/COMMON/IES/EsmCause.c index 8c5436d855..e703438c17 100644 --- a/openair3/NAS/COMMON/IES/EsmCause.c +++ b/openair3/NAS/COMMON/IES/EsmCause.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmCause.h b/openair3/NAS/COMMON/IES/EsmCause.h index e79c51ac19..3590aaffec 100644 --- a/openair3/NAS/COMMON/IES/EsmCause.h +++ b/openair3/NAS/COMMON/IES/EsmCause.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c index b4d69c44f7..5b4358499b 100644 --- a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c +++ b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h index cfaf82a560..1b932b1a99 100644 --- a/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h +++ b/openair3/NAS/COMMON/IES/EsmInformationTransferFlag.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/EsmMessageContainer.c b/openair3/NAS/COMMON/IES/EsmMessageContainer.c index 080374e681..2268b657f0 100644 --- a/openair3/NAS/COMMON/IES/EsmMessageContainer.c +++ b/openair3/NAS/COMMON/IES/EsmMessageContainer.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include @@ -35,7 +28,7 @@ #include "EsmMessageContainer.h" #include "nas_log.h" -#define NAS_DEBUG 1 +//#define NAS_DEBUG 1 int decode_esm_message_container(EsmMessageContainer *esmmessagecontainer, uint8_t iei, uint8_t *buffer, uint32_t len) { diff --git a/openair3/NAS/COMMON/IES/EsmMessageContainer.h b/openair3/NAS/COMMON/IES/EsmMessageContainer.h index 326a9dd4e5..c6fb827e13 100644 --- a/openair3/NAS/COMMON/IES/EsmMessageContainer.h +++ b/openair3/NAS/COMMON/IES/EsmMessageContainer.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/GprsTimer.c b/openair3/NAS/COMMON/IES/GprsTimer.c index 9d8889ec6b..52c1df17ee 100644 --- a/openair3/NAS/COMMON/IES/GprsTimer.c +++ b/openair3/NAS/COMMON/IES/GprsTimer.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/GprsTimer.h b/openair3/NAS/COMMON/IES/GprsTimer.h index 66468b75aa..c8bb686fa3 100644 --- a/openair3/NAS/COMMON/IES/GprsTimer.h +++ b/openair3/NAS/COMMON/IES/GprsTimer.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/GutiType.c b/openair3/NAS/COMMON/IES/GutiType.c index 7391edb53c..a9921eedd8 100644 --- a/openair3/NAS/COMMON/IES/GutiType.c +++ b/openair3/NAS/COMMON/IES/GutiType.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/GutiType.h b/openair3/NAS/COMMON/IES/GutiType.h index 4df547ff06..ad434f5ca5 100644 --- a/openair3/NAS/COMMON/IES/GutiType.h +++ b/openair3/NAS/COMMON/IES/GutiType.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/IdentityType2.c b/openair3/NAS/COMMON/IES/IdentityType2.c index c50a1fc0f7..9623b5e586 100644 --- a/openair3/NAS/COMMON/IES/IdentityType2.c +++ b/openair3/NAS/COMMON/IES/IdentityType2.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/IdentityType2.h b/openair3/NAS/COMMON/IES/IdentityType2.h index 9d7e075b7a..5e3a01b061 100644 --- a/openair3/NAS/COMMON/IES/IdentityType2.h +++ b/openair3/NAS/COMMON/IES/IdentityType2.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ImeisvRequest.c b/openair3/NAS/COMMON/IES/ImeisvRequest.c index 798ce55dce..5c46b56f64 100644 --- a/openair3/NAS/COMMON/IES/ImeisvRequest.c +++ b/openair3/NAS/COMMON/IES/ImeisvRequest.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ImeisvRequest.h b/openair3/NAS/COMMON/IES/ImeisvRequest.h index 71c319bc8d..e41beeb994 100644 --- a/openair3/NAS/COMMON/IES/ImeisvRequest.h +++ b/openair3/NAS/COMMON/IES/ImeisvRequest.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c index c552654aa8..4a9ed5c247 100644 --- a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c +++ b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h index 042f56d1f8..c739ca61e9 100644 --- a/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h +++ b/openair3/NAS/COMMON/IES/KsiAndSequenceNumber.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsClientIdentity.c b/openair3/NAS/COMMON/IES/LcsClientIdentity.c index 9daf2125e1..89014ce46c 100644 --- a/openair3/NAS/COMMON/IES/LcsClientIdentity.c +++ b/openair3/NAS/COMMON/IES/LcsClientIdentity.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsClientIdentity.h b/openair3/NAS/COMMON/IES/LcsClientIdentity.h index 4f4880956d..7a8348c806 100644 --- a/openair3/NAS/COMMON/IES/LcsClientIdentity.h +++ b/openair3/NAS/COMMON/IES/LcsClientIdentity.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsIndicator.c b/openair3/NAS/COMMON/IES/LcsIndicator.c index 224886fae8..ee9a75d8bb 100644 --- a/openair3/NAS/COMMON/IES/LcsIndicator.c +++ b/openair3/NAS/COMMON/IES/LcsIndicator.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LcsIndicator.h b/openair3/NAS/COMMON/IES/LcsIndicator.h index 341c5f2caf..976d42eb13 100644 --- a/openair3/NAS/COMMON/IES/LcsIndicator.h +++ b/openair3/NAS/COMMON/IES/LcsIndicator.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c index eec53404ef..88b8ee4f7e 100644 --- a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c +++ b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h index 393da23e41..58bbf11d3c 100644 --- a/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h +++ b/openair3/NAS/COMMON/IES/LinkedEpsBearerIdentity.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c index e30f4dcdbe..51869784d9 100644 --- a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c +++ b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h index ba6e40c61b..35f1df710f 100644 --- a/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h +++ b/openair3/NAS/COMMON/IES/LlcServiceAccessPointIdentifier.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LocationAreaIdentification.c b/openair3/NAS/COMMON/IES/LocationAreaIdentification.c index 1fc04dc038..27e31c3733 100644 --- a/openair3/NAS/COMMON/IES/LocationAreaIdentification.c +++ b/openair3/NAS/COMMON/IES/LocationAreaIdentification.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/LocationAreaIdentification.h b/openair3/NAS/COMMON/IES/LocationAreaIdentification.h index 3c52e94809..c09de9c987 100644 --- a/openair3/NAS/COMMON/IES/LocationAreaIdentification.h +++ b/openair3/NAS/COMMON/IES/LocationAreaIdentification.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MessageType.c b/openair3/NAS/COMMON/IES/MessageType.c index 17a23ab383..83d134cdf5 100644 --- a/openair3/NAS/COMMON/IES/MessageType.c +++ b/openair3/NAS/COMMON/IES/MessageType.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MessageType.h b/openair3/NAS/COMMON/IES/MessageType.h index 7dd001ae96..d926f09cdc 100644 --- a/openair3/NAS/COMMON/IES/MessageType.h +++ b/openair3/NAS/COMMON/IES/MessageType.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileIdentity.c b/openair3/NAS/COMMON/IES/MobileIdentity.c index 75c152106a..fbe6d93e47 100644 --- a/openair3/NAS/COMMON/IES/MobileIdentity.c +++ b/openair3/NAS/COMMON/IES/MobileIdentity.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include @@ -582,6 +575,8 @@ static int encode_imei_mobile_identity(ImeiMobileIdentity_t *imei, uint8_t *buff static int encode_imeisv_mobile_identity(ImeisvMobileIdentity_t *imeisv, uint8_t *buffer) { uint32_t encoded = 0; + LOG_TRACE(INFO,"SECURITY MODE COMMAND COMPLETE: encode_imeisv_mobile_identity \n"); + *(buffer + encoded) = 0x00 | (imeisv->digit1 << 4) | (imeisv->oddeven << 3) | (imeisv->typeofidentity); encoded++; @@ -597,12 +592,15 @@ static int encode_imeisv_mobile_identity(ImeisvMobileIdentity_t *imeisv, uint8_t encoded++; *(buffer + encoded) = 0x00 | (imeisv->digit13 << 4) | imeisv->digit12; encoded++; + *(buffer + encoded) = 0x00 | (imeisv->digit15 << 4) | imeisv->digit14; + encoded++; + *(buffer + encoded) = 0x00 | (imeisv->parity << 4) | imeisv->digit16; - if (imeisv->oddeven != MOBILE_IDENTITY_EVEN) { - *(buffer + encoded) = 0x00 | (imeisv->digit15 << 4) | imeisv->digit14; - } else { - *(buffer + encoded) = 0xf0 | imeisv->digit14; - } + //if (imeisv->oddeven != MOBILE_IDENTITY_EVEN) { + // *(buffer + encoded) = 0x00 | (imeisv->digit15 << 4) | imeisv->digit14; + //} else { + // *(buffer + encoded) = 0xf0 | imeisv->digit14; + //} encoded++; return encoded; diff --git a/openair3/NAS/COMMON/IES/MobileIdentity.h b/openair3/NAS/COMMON/IES/MobileIdentity.h index 791dfc6f72..37f4d4ac30 100644 --- a/openair3/NAS/COMMON/IES/MobileIdentity.h +++ b/openair3/NAS/COMMON/IES/MobileIdentity.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include @@ -80,8 +73,63 @@ typedef struct { uint8_t mbmssessionid; } TmgiMobileIdentity_t; +typedef struct imeisv_s{ + uint8_t digit1:4; + uint8_t oddeven:1; + uint8_t typeofidentity:3; + uint8_t digit2:4; + uint8_t digit3:4; + uint8_t digit4:4; + uint8_t digit5:4; + uint8_t digit6:4; + uint8_t digit7:4; + uint8_t digit8:4; + uint8_t digit9:4; + uint8_t digit10:4; + uint8_t digit11:4; + uint8_t digit12:4; + uint8_t digit13:4; + uint8_t digit14:4; + uint8_t digit15:4; + uint8_t digit16:4; +#define EVEN_PARITY 0 +#define IMEI_ODD_PARITY 0xf + uint8_t parity:4; +} imeisv_t; + +#if 0 +typedef struct imeisv_s { + uint8_t length; + union { + struct { + uint8_t tac2:4; + uint8_t tac1:4; + uint8_t tac4:4; + uint8_t tac3:4; + uint8_t tac6:4; + uint8_t tac5:4; + uint8_t tac8:4; + uint8_t tac7:4; + uint8_t snr2:4; + uint8_t snr1:4; + uint8_t snr4:4; + uint8_t snr3:4; + uint8_t snr6:4; + uint8_t snr5:4; + uint8_t svn2:4; + uint8_t svn1:4; +#define EVEN_PARITY 0 +#define IMEI_ODD_PARITY 0xf + uint8_t parity:4; + } num; +#define IMEISV_BCD8_SIZE 9 + uint8_t value[IMEISV_BCD8_SIZE]; + } u; +} imeisv_t; +#endif + typedef ImsiMobileIdentity_t ImeiMobileIdentity_t; -typedef ImsiMobileIdentity_t ImeisvMobileIdentity_t; +typedef imeisv_t ImeisvMobileIdentity_t; typedef ImsiMobileIdentity_t TmsiMobileIdentity_t; typedef ImsiMobileIdentity_t NoMobileIdentity_t; diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark2.c b/openair3/NAS/COMMON/IES/MobileStationClassmark2.c index 459d716fcb..e3a165bf3a 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark2.c +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark2.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark2.h b/openair3/NAS/COMMON/IES/MobileStationClassmark2.h index 06c6250de9..5cf7b9c46e 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark2.h +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark2.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark3.c b/openair3/NAS/COMMON/IES/MobileStationClassmark3.c index d53f054532..9bd439fdfd 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark3.c +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark3.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MobileStationClassmark3.h b/openair3/NAS/COMMON/IES/MobileStationClassmark3.h index 25de9191ee..80c4d4e8e2 100644 --- a/openair3/NAS/COMMON/IES/MobileStationClassmark3.h +++ b/openair3/NAS/COMMON/IES/MobileStationClassmark3.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkCapability.c b/openair3/NAS/COMMON/IES/MsNetworkCapability.c index bda91e876a..8c2955177e 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkCapability.c +++ b/openair3/NAS/COMMON/IES/MsNetworkCapability.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkCapability.h b/openair3/NAS/COMMON/IES/MsNetworkCapability.h index e940d91218..f379989241 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkCapability.h +++ b/openair3/NAS/COMMON/IES/MsNetworkCapability.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c index 08fee949a0..6de2a05474 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c +++ b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h index 0210e787a7..147c166beb 100644 --- a/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h +++ b/openair3/NAS/COMMON/IES/MsNetworkFeatureSupport.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c index 1f1e2bd726..a547675675 100644 --- a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c +++ b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h index 46af36c5b5..09daf13a56 100644 --- a/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h +++ b/openair3/NAS/COMMON/IES/NasKeySetIdentifier.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasMessageContainer.c b/openair3/NAS/COMMON/IES/NasMessageContainer.c index 2f295b0cc1..cccb8f7543 100644 --- a/openair3/NAS/COMMON/IES/NasMessageContainer.c +++ b/openair3/NAS/COMMON/IES/NasMessageContainer.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasMessageContainer.h b/openair3/NAS/COMMON/IES/NasMessageContainer.h index a16684a088..4e1ad971be 100644 --- a/openair3/NAS/COMMON/IES/NasMessageContainer.h +++ b/openair3/NAS/COMMON/IES/NasMessageContainer.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasRequestType.c b/openair3/NAS/COMMON/IES/NasRequestType.c index 9cbbbdb7f7..cb85a38851 100644 --- a/openair3/NAS/COMMON/IES/NasRequestType.c +++ b/openair3/NAS/COMMON/IES/NasRequestType.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasRequestType.h b/openair3/NAS/COMMON/IES/NasRequestType.h index c6e28298d6..7eb98ff42b 100644 --- a/openair3/NAS/COMMON/IES/NasRequestType.h +++ b/openair3/NAS/COMMON/IES/NasRequestType.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c index cafb734811..7b57aab6a8 100644 --- a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c +++ b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h index f74b2c39ab..69e5b3080a 100644 --- a/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h +++ b/openair3/NAS/COMMON/IES/NasSecurityAlgorithms.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NetworkName.c b/openair3/NAS/COMMON/IES/NetworkName.c index 521e421c8d..d0d92dccbe 100644 --- a/openair3/NAS/COMMON/IES/NetworkName.c +++ b/openair3/NAS/COMMON/IES/NetworkName.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/NetworkName.h b/openair3/NAS/COMMON/IES/NetworkName.h index c2a8850bc3..7acae1b728 100644 --- a/openair3/NAS/COMMON/IES/NetworkName.h +++ b/openair3/NAS/COMMON/IES/NetworkName.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/Nonce.c b/openair3/NAS/COMMON/IES/Nonce.c index 438d117fd7..d584346c56 100644 --- a/openair3/NAS/COMMON/IES/Nonce.c +++ b/openair3/NAS/COMMON/IES/Nonce.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/Nonce.h b/openair3/NAS/COMMON/IES/Nonce.h index 7956177494..5bf3047a24 100644 --- a/openair3/NAS/COMMON/IES/Nonce.h +++ b/openair3/NAS/COMMON/IES/Nonce.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PTmsiSignature.c b/openair3/NAS/COMMON/IES/PTmsiSignature.c index 3ed25f994a..2781cb77f2 100644 --- a/openair3/NAS/COMMON/IES/PTmsiSignature.c +++ b/openair3/NAS/COMMON/IES/PTmsiSignature.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PTmsiSignature.h b/openair3/NAS/COMMON/IES/PTmsiSignature.h index e51bcc41a9..75abf9e487 100644 --- a/openair3/NAS/COMMON/IES/PTmsiSignature.h +++ b/openair3/NAS/COMMON/IES/PTmsiSignature.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c index a108760cfa..fef2edd10d 100644 --- a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c +++ b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h index 24f5dc9a97..7dff70c49c 100644 --- a/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h +++ b/openair3/NAS/COMMON/IES/PacketFlowIdentifier.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PagingIdentity.c b/openair3/NAS/COMMON/IES/PagingIdentity.c index 9b0c72b7af..e485fdc18a 100644 --- a/openair3/NAS/COMMON/IES/PagingIdentity.c +++ b/openair3/NAS/COMMON/IES/PagingIdentity.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PagingIdentity.h b/openair3/NAS/COMMON/IES/PagingIdentity.h index 60f93caebd..e94a6a803a 100644 --- a/openair3/NAS/COMMON/IES/PagingIdentity.h +++ b/openair3/NAS/COMMON/IES/PagingIdentity.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnAddress.c b/openair3/NAS/COMMON/IES/PdnAddress.c index 12dee958f5..de64d410c5 100644 --- a/openair3/NAS/COMMON/IES/PdnAddress.c +++ b/openair3/NAS/COMMON/IES/PdnAddress.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnAddress.h b/openair3/NAS/COMMON/IES/PdnAddress.h index 22a7dd282c..20b6f1d690 100644 --- a/openair3/NAS/COMMON/IES/PdnAddress.h +++ b/openair3/NAS/COMMON/IES/PdnAddress.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnType.c b/openair3/NAS/COMMON/IES/PdnType.c index 0dc20ba6e1..e9bbfb3b87 100644 --- a/openair3/NAS/COMMON/IES/PdnType.c +++ b/openair3/NAS/COMMON/IES/PdnType.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PdnType.h b/openair3/NAS/COMMON/IES/PdnType.h index 13c97a6602..844b35f3c4 100644 --- a/openair3/NAS/COMMON/IES/PdnType.h +++ b/openair3/NAS/COMMON/IES/PdnType.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PlmnList.c b/openair3/NAS/COMMON/IES/PlmnList.c index 2e84bdb74a..e6a3cecf4d 100644 --- a/openair3/NAS/COMMON/IES/PlmnList.c +++ b/openair3/NAS/COMMON/IES/PlmnList.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/PlmnList.h b/openair3/NAS/COMMON/IES/PlmnList.h index 485e88a6a2..6e6ac850c2 100644 --- a/openair3/NAS/COMMON/IES/PlmnList.h +++ b/openair3/NAS/COMMON/IES/PlmnList.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c index 522307467e..802c13a907 100644 --- a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c +++ b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h index 2bc3f098d9..0f56e764d4 100644 --- a/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h +++ b/openair3/NAS/COMMON/IES/ProcedureTransactionIdentity.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c index 15f20ef195..f4bd3e5e2c 100644 --- a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c +++ b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h index 8110cb96bc..cbdeaaed0e 100644 --- a/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h +++ b/openair3/NAS/COMMON/IES/ProtocolConfigurationOptions.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c index a58ae57faa..41d2ada7ae 100644 --- a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c +++ b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h index 04c04e801f..465baf21f4 100644 --- a/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h +++ b/openair3/NAS/COMMON/IES/ProtocolDiscriminator.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/QualityOfService.c b/openair3/NAS/COMMON/IES/QualityOfService.c index 27d4a78e55..02c4ceca29 100644 --- a/openair3/NAS/COMMON/IES/QualityOfService.c +++ b/openair3/NAS/COMMON/IES/QualityOfService.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/QualityOfService.h b/openair3/NAS/COMMON/IES/QualityOfService.h index 6ce363aacc..a7f455b237 100644 --- a/openair3/NAS/COMMON/IES/QualityOfService.h +++ b/openair3/NAS/COMMON/IES/QualityOfService.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/RadioPriority.c b/openair3/NAS/COMMON/IES/RadioPriority.c index 8e1183eb7b..31780b8e89 100644 --- a/openair3/NAS/COMMON/IES/RadioPriority.c +++ b/openair3/NAS/COMMON/IES/RadioPriority.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/RadioPriority.h b/openair3/NAS/COMMON/IES/RadioPriority.h index 629a624eec..0f53fdaa77 100644 --- a/openair3/NAS/COMMON/IES/RadioPriority.h +++ b/openair3/NAS/COMMON/IES/RadioPriority.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SecurityHeaderType.c b/openair3/NAS/COMMON/IES/SecurityHeaderType.c index 89facd28c1..0137e8cb9b 100644 --- a/openair3/NAS/COMMON/IES/SecurityHeaderType.c +++ b/openair3/NAS/COMMON/IES/SecurityHeaderType.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SecurityHeaderType.h b/openair3/NAS/COMMON/IES/SecurityHeaderType.h index d83ec1e17a..dcfaea6f8a 100644 --- a/openair3/NAS/COMMON/IES/SecurityHeaderType.h +++ b/openair3/NAS/COMMON/IES/SecurityHeaderType.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ServiceType.c b/openair3/NAS/COMMON/IES/ServiceType.c index 3f35abbfaa..23079a09eb 100644 --- a/openair3/NAS/COMMON/IES/ServiceType.c +++ b/openair3/NAS/COMMON/IES/ServiceType.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ServiceType.h b/openair3/NAS/COMMON/IES/ServiceType.h index c3aedebc0c..f6dab7733b 100644 --- a/openair3/NAS/COMMON/IES/ServiceType.h +++ b/openair3/NAS/COMMON/IES/ServiceType.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ShortMac.c b/openair3/NAS/COMMON/IES/ShortMac.c index d481b1bba7..74bcd772c6 100644 --- a/openair3/NAS/COMMON/IES/ShortMac.c +++ b/openair3/NAS/COMMON/IES/ShortMac.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/ShortMac.h b/openair3/NAS/COMMON/IES/ShortMac.h index 896f9e42da..f2b1c7032d 100644 --- a/openair3/NAS/COMMON/IES/ShortMac.h +++ b/openair3/NAS/COMMON/IES/ShortMac.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SsCode.c b/openair3/NAS/COMMON/IES/SsCode.c index e0566c9f15..255af689e3 100644 --- a/openair3/NAS/COMMON/IES/SsCode.c +++ b/openair3/NAS/COMMON/IES/SsCode.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SsCode.h b/openair3/NAS/COMMON/IES/SsCode.h index 68017184ce..8e6ae3b411 100644 --- a/openair3/NAS/COMMON/IES/SsCode.h +++ b/openair3/NAS/COMMON/IES/SsCode.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SupportedCodecList.c b/openair3/NAS/COMMON/IES/SupportedCodecList.c index 375d2255a4..3a69eee366 100644 --- a/openair3/NAS/COMMON/IES/SupportedCodecList.c +++ b/openair3/NAS/COMMON/IES/SupportedCodecList.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/SupportedCodecList.h b/openair3/NAS/COMMON/IES/SupportedCodecList.h index 83396b62d4..c4b727cb94 100644 --- a/openair3/NAS/COMMON/IES/SupportedCodecList.h +++ b/openair3/NAS/COMMON/IES/SupportedCodecList.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZone.c b/openair3/NAS/COMMON/IES/TimeZone.c index 39fe50c307..eb65ec9295 100644 --- a/openair3/NAS/COMMON/IES/TimeZone.c +++ b/openair3/NAS/COMMON/IES/TimeZone.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZone.h b/openair3/NAS/COMMON/IES/TimeZone.h index bfa2d38996..5da012b14e 100644 --- a/openair3/NAS/COMMON/IES/TimeZone.h +++ b/openair3/NAS/COMMON/IES/TimeZone.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZoneAndTime.c b/openair3/NAS/COMMON/IES/TimeZoneAndTime.c index 08a8bcdf70..6a26eeac78 100644 --- a/openair3/NAS/COMMON/IES/TimeZoneAndTime.c +++ b/openair3/NAS/COMMON/IES/TimeZoneAndTime.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TimeZoneAndTime.h b/openair3/NAS/COMMON/IES/TimeZoneAndTime.h index 27c763cf88..71cce4e881 100644 --- a/openair3/NAS/COMMON/IES/TimeZoneAndTime.h +++ b/openair3/NAS/COMMON/IES/TimeZoneAndTime.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TmsiStatus.c b/openair3/NAS/COMMON/IES/TmsiStatus.c index 1ebbf5beaf..726e096c78 100644 --- a/openair3/NAS/COMMON/IES/TmsiStatus.c +++ b/openair3/NAS/COMMON/IES/TmsiStatus.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TmsiStatus.h b/openair3/NAS/COMMON/IES/TmsiStatus.h index 6387ca7cec..48611f9a0c 100644 --- a/openair3/NAS/COMMON/IES/TmsiStatus.h +++ b/openair3/NAS/COMMON/IES/TmsiStatus.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c index 14b08e7e24..a77419c80c 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h index 7249d3c5c1..bc5810c895 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentity.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c index eae44e8e58..2e700abbee 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h index 345aacf438..d085e8436f 100644 --- a/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h +++ b/openair3/NAS/COMMON/IES/TrackingAreaIdentityList.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c index b2ea6a83b9..ad7af4c6c1 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c +++ b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h index 3058873621..ae013cf304 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h +++ b/openair3/NAS/COMMON/IES/TrafficFlowAggregateDescription.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c index e18ffc92c5..d5ab249573 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c +++ b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h index 40f9c6b4a6..651ec7ef5c 100644 --- a/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h +++ b/openair3/NAS/COMMON/IES/TrafficFlowTemplate.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TransactionIdentifier.c b/openair3/NAS/COMMON/IES/TransactionIdentifier.c index c48ae31a63..ce77d6ba34 100644 --- a/openair3/NAS/COMMON/IES/TransactionIdentifier.c +++ b/openair3/NAS/COMMON/IES/TransactionIdentifier.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/TransactionIdentifier.h b/openair3/NAS/COMMON/IES/TransactionIdentifier.h index 061db1c654..cf19a2f6f5 100644 --- a/openair3/NAS/COMMON/IES/TransactionIdentifier.h +++ b/openair3/NAS/COMMON/IES/TransactionIdentifier.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeNetworkCapability.c b/openair3/NAS/COMMON/IES/UeNetworkCapability.c index 902bd1c79c..6589075173 100644 --- a/openair3/NAS/COMMON/IES/UeNetworkCapability.c +++ b/openair3/NAS/COMMON/IES/UeNetworkCapability.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeNetworkCapability.h b/openair3/NAS/COMMON/IES/UeNetworkCapability.h index 56451159a5..a93587c33c 100644 --- a/openair3/NAS/COMMON/IES/UeNetworkCapability.h +++ b/openair3/NAS/COMMON/IES/UeNetworkCapability.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c index 36d612bf6f..a56400c54d 100644 --- a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c +++ b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h index 853ecea045..7ae83bd5ea 100644 --- a/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h +++ b/openair3/NAS/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeSecurityCapability.c b/openair3/NAS/COMMON/IES/UeSecurityCapability.c index ecc55ae5ff..9b40b1b85c 100644 --- a/openair3/NAS/COMMON/IES/UeSecurityCapability.c +++ b/openair3/NAS/COMMON/IES/UeSecurityCapability.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/UeSecurityCapability.h b/openair3/NAS/COMMON/IES/UeSecurityCapability.h index dede6af9f8..d9726d76e0 100644 --- a/openair3/NAS/COMMON/IES/UeSecurityCapability.h +++ b/openair3/NAS/COMMON/IES/UeSecurityCapability.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c index 0c84ba0a8e..156c68d80f 100644 --- a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c +++ b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h index 13a8b668ec..b7dbe35de4 100644 --- a/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h +++ b/openair3/NAS/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/COPYING b/openair3/NAS/COMMON/UTIL/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/NAS/COMMON/UTIL/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/NAS/COMMON/UTIL/OctetString.c b/openair3/NAS/COMMON/UTIL/OctetString.c index 4a429d84a7..3083068585 100644 --- a/openair3/NAS/COMMON/UTIL/OctetString.c +++ b/openair3/NAS/COMMON/UTIL/OctetString.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/OctetString.h b/openair3/NAS/COMMON/UTIL/OctetString.h index b3ea818cc8..2223b67ece 100644 --- a/openair3/NAS/COMMON/UTIL/OctetString.h +++ b/openair3/NAS/COMMON/UTIL/OctetString.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include diff --git a/openair3/NAS/COMMON/UTIL/TLVDecoder.c b/openair3/NAS/COMMON/UTIL/TLVDecoder.c index c1ce58ea00..353e16554d 100644 --- a/openair3/NAS/COMMON/UTIL/TLVDecoder.c +++ b/openair3/NAS/COMMON/UTIL/TLVDecoder.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/TLVDecoder.h b/openair3/NAS/COMMON/UTIL/TLVDecoder.h index 99e1b9d90f..e8dce87d8d 100644 --- a/openair3/NAS/COMMON/UTIL/TLVDecoder.h +++ b/openair3/NAS/COMMON/UTIL/TLVDecoder.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #ifndef TLV_DECODER_H_ #define TLV_DECODER_H_ @@ -33,7 +26,7 @@ #include "nas_log.h" #ifndef NAS_DEBUG -# define NAS_DEBUG 1 +//# define NAS_DEBUG 1 #endif #define DECODE_U8(bUFFER, vALUE, sIZE) \ diff --git a/openair3/NAS/COMMON/UTIL/TLVEncoder.c b/openair3/NAS/COMMON/UTIL/TLVEncoder.c index 0ad394e97a..9d3a144989 100644 --- a/openair3/NAS/COMMON/UTIL/TLVEncoder.c +++ b/openair3/NAS/COMMON/UTIL/TLVEncoder.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/NAS/COMMON/UTIL/TLVEncoder.h b/openair3/NAS/COMMON/UTIL/TLVEncoder.h index 2917594618..df5b58a07f 100644 --- a/openair3/NAS/COMMON/UTIL/TLVEncoder.h +++ b/openair3/NAS/COMMON/UTIL/TLVEncoder.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #ifndef TLV_ENCODER_H_ #define TLV_ENCODER_H_ diff --git a/openair3/NAS/COMMON/UTIL/device.c b/openair3/NAS/COMMON/UTIL/device.c index 375ffe0846..7ad2879b90 100644 --- a/openair3/NAS/COMMON/UTIL/device.c +++ b/openair3/NAS/COMMON/UTIL/device.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source device.c diff --git a/openair3/NAS/COMMON/UTIL/device.h b/openair3/NAS/COMMON/UTIL/device.h index ded1aca095..975d7b1c8a 100644 --- a/openair3/NAS/COMMON/UTIL/device.h +++ b/openair3/NAS/COMMON/UTIL/device.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source device.h diff --git a/openair3/NAS/COMMON/UTIL/memory.c b/openair3/NAS/COMMON/UTIL/memory.c index 18c7f8b1af..334cdc5eb6 100644 --- a/openair3/NAS/COMMON/UTIL/memory.c +++ b/openair3/NAS/COMMON/UTIL/memory.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source memory.c @@ -110,6 +103,30 @@ char* memory_get_path(const char* dirname, const char* filename) return data_filename; } +char* memory_get_path_from_ueid(const char* dirname, const char* filename, int ueid) +{ + /* Get non-volatile data directory */ + const char* path = getenv(dirname); + char buffer[2048]; + + if (path == NULL) { + path = getenv(DEFAULT_NAS_PATH); + } + + if (path == NULL) { + LOG_TRACE(WARNING, "MEMORY - %s and %s environment variables are not defined trying local directory", dirname, DEFAULT_NAS_PATH); + path = "."; + } + + /* Append non-volatile data file name */ + if ( snprintf(buffer, sizeof(buffer), "%s/%s%d", path, filename, ueid) < 0 ) { + return NULL; + } + + return strdup(buffer); +} + + /**************************************************************************** ** ** ** Name: memory_read() ** diff --git a/openair3/NAS/COMMON/UTIL/memory.h b/openair3/NAS/COMMON/UTIL/memory.h index 0314630f0c..ec8406c932 100644 --- a/openair3/NAS/COMMON/UTIL/memory.h +++ b/openair3/NAS/COMMON/UTIL/memory.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source memory.h @@ -65,6 +58,8 @@ Description Memory access utilities char* memory_get_path(const char* dirname, const char* filename); +char* memory_get_path_from_ueid(const char* dirname, const char* filename, int ueid); + int memory_read(const char* datafile, void* data, size_t size); int memory_write(const char* datafile, const void* data, size_t size); diff --git a/openair3/NAS/COMMON/UTIL/nas_log.c b/openair3/NAS/COMMON/UTIL/nas_log.c index f0d6a24ffe..6af90c4be8 100644 --- a/openair3/NAS/COMMON/UTIL/nas_log.c +++ b/openair3/NAS/COMMON/UTIL/nas_log.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source nas_log.c diff --git a/openair3/NAS/COMMON/UTIL/nas_log.h b/openair3/NAS/COMMON/UTIL/nas_log.h index c17efb3383..47664c52d0 100644 --- a/openair3/NAS/COMMON/UTIL/nas_log.h +++ b/openair3/NAS/COMMON/UTIL/nas_log.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source nas_log.h @@ -138,7 +131,7 @@ do { do { \ nas_log_func_indent -= 2; \ LOG_D(NAS, " %s:%d %*sLeaving %s(rc = %ld)\n", __FILE__, __LINE__, nas_log_func_indent, "", \ - __FUNCTION__, (long) rETURNcODE); \ + __FUNCTION__, (long) (rETURNcODE)); \ return (rETURNcODE); \ } while (0) @@ -153,7 +146,7 @@ extern int nas_log_func_indent; # define LOG_FUNC_RETURN(rETURNcODE) \ do { \ LOG_TRACE(FUNC_OUT, "Leaving %s(rc = %ld)", __FUNCTION__, \ - (long) rETURNcODE); \ + (long) (rETURNcODE)); \ return (rETURNcODE); \ } while(0) diff --git a/openair3/NAS/COMMON/UTIL/nas_timer.c b/openair3/NAS/COMMON/UTIL/nas_timer.c index 5dc6923140..0b92ac4d9d 100644 --- a/openair3/NAS/COMMON/UTIL/nas_timer.c +++ b/openair3/NAS/COMMON/UTIL/nas_timer.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source nas_timer.c diff --git a/openair3/NAS/COMMON/UTIL/nas_timer.h b/openair3/NAS/COMMON/UTIL/nas_timer.h index 0b65da4159..b1149f21c0 100644 --- a/openair3/NAS/COMMON/UTIL/nas_timer.h +++ b/openair3/NAS/COMMON/UTIL/nas_timer.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source nas_timer.h diff --git a/openair3/NAS/COMMON/UTIL/parser.c b/openair3/NAS/COMMON/UTIL/parser.c index 5f8350ea58..e27fb38199 100644 --- a/openair3/NAS/COMMON/UTIL/parser.c +++ b/openair3/NAS/COMMON/UTIL/parser.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source parser.c diff --git a/openair3/NAS/COMMON/UTIL/parser.h b/openair3/NAS/COMMON/UTIL/parser.h index fc8a9ad126..ae454ce367 100644 --- a/openair3/NAS/COMMON/UTIL/parser.h +++ b/openair3/NAS/COMMON/UTIL/parser.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source parser.h diff --git a/openair3/NAS/COMMON/UTIL/socket.c b/openair3/NAS/COMMON/UTIL/socket.c index b76506109b..8ec3227e20 100644 --- a/openair3/NAS/COMMON/UTIL/socket.c +++ b/openair3/NAS/COMMON/UTIL/socket.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source socket.c diff --git a/openair3/NAS/COMMON/UTIL/socket.h b/openair3/NAS/COMMON/UTIL/socket.h index 4be749d3cc..033046d98c 100644 --- a/openair3/NAS/COMMON/UTIL/socket.h +++ b/openair3/NAS/COMMON/UTIL/socket.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source socket.h diff --git a/openair3/NAS/COMMON/UTIL/stty.c b/openair3/NAS/COMMON/UTIL/stty.c index 1fb72e9204..eceb0b06b1 100644 --- a/openair3/NAS/COMMON/UTIL/stty.c +++ b/openair3/NAS/COMMON/UTIL/stty.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source stty.c diff --git a/openair3/NAS/COMMON/UTIL/tst/timer.c b/openair3/NAS/COMMON/UTIL/tst/timer.c index 7b963fba30..701c878f4d 100644 --- a/openair3/NAS/COMMON/UTIL/tst/timer.c +++ b/openair3/NAS/COMMON/UTIL/tst/timer.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source timer.c diff --git a/openair3/NAS/COMMON/commonDef.h b/openair3/NAS/COMMON/commonDef.h deleted file mode 120000 index 19553e9b64..0000000000 --- a/openair3/NAS/COMMON/commonDef.h +++ /dev/null @@ -1 +0,0 @@ -../../../openair2/COMMON/commonDef.h \ No newline at end of file diff --git a/openair3/NAS/COMMON/commonDef.h b/openair3/NAS/COMMON/commonDef.h new file mode 100644 index 0000000000..84d97fc4a8 --- /dev/null +++ b/openair3/NAS/COMMON/commonDef.h @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ +/* + +Source commonDef.h + +Version 0.1 + +Date 2012/02/27 + +Product NAS stack + +Subsystem include + +Author Frederic Maurel + +Description Contains global common definitions + +*****************************************************************************/ +#ifndef __COMMONDEF_H__ +#define __COMMONDEF_H__ + +#include +#include +#include + +typedef signed char boolean_t; + +#if !defined(TRUE) +#define TRUE (boolean_t)0x01 +#endif + +#if !defined(FALSE) +#define FALSE (boolean_t)0x00 +#endif + +#define BOOL_NOT(b) (b^TRUE) + +#define NAS_UE_ID_FMT "0x%06x" + +/****************************************************************************/ +/********************* G L O B A L C O N S T A N T S *******************/ +/****************************************************************************/ + +#define RETURNok (0) +#define RETURNerror (-1) + +/* + * Name of the environment variable which defines the default directory + * where the NAS application is executed and where are located files + * where non-volatile data are stored + */ +#define DEFAULT_NAS_PATH "PWD" + +/****************************************************************************/ +/************************ G L O B A L T Y P E S ************************/ +/****************************************************************************/ + +/* +----------------------------------------------------------------------------- + Standard data type definitions +----------------------------------------------------------------------------- +*/ +typedef int8_t SByte_t; /* 8 bit signed integer */ +typedef uint8_t Byte_t; /* 8 bit unsigned integer */ + + +/* +----------------------------------------------------------------------------- + Common NAS data type definitions +----------------------------------------------------------------------------- +*/ + +typedef uint8_t Stat_t; /* Registration status */ +typedef uint16_t lac_t; /* Location Area Code */ +typedef uint8_t rac_t; /* Routing Area Code */ +typedef uint16_t tac_t; /* Tracking Area Code */ +typedef uint32_t ci_t; /* Cell Identifier */ +typedef uint8_t AcT_t; /* Access Technology */ + +/* + * International Mobile Subscriber Identity + */ +typedef struct { + Byte_t length; + union { + struct { + Byte_t digit2:4; + Byte_t digit1:4; + Byte_t digit4:4; + Byte_t digit3:4; + Byte_t digit6:4; + Byte_t digit5:4; + Byte_t digit8:4; + Byte_t digit7:4; + Byte_t digit10:4; + Byte_t digit9:4; + Byte_t digit12:4; + Byte_t digit11:4; + Byte_t digit14:4; + Byte_t digit13:4; +#define EVEN_PARITY 0 +#define ODD_PARITY 1 + Byte_t parity:4; + Byte_t digit15:4; + } num; +#define IMSI_SIZE 8 + Byte_t value[IMSI_SIZE]; + } u; +} imsi_t; + +#define NAS_IMSI2STR(iMsI_t_PtR,iMsI_sTr, MaXlEn) \ + {\ + int l_offset = 0;\ + int l_ret = 0;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u",\ + iMsI_t_PtR->u.num.digit1, iMsI_t_PtR->u.num.digit2,\ + iMsI_t_PtR->u.num.digit3, iMsI_t_PtR->u.num.digit4,\ + iMsI_t_PtR->u.num.digit5);\ + if ((iMsI_t_PtR->u.num.digit6 != 0xf) && (l_ret > 0)) {\ + l_offset += l_ret;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u", iMsI_t_PtR->u.num.digit6);\ + }\ + if (l_ret > 0) {\ + l_offset += l_ret;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u%u%u%u",\ + iMsI_t_PtR->u.num.digit7, iMsI_t_PtR->u.num.digit8,\ + iMsI_t_PtR->u.num.digit9, iMsI_t_PtR->u.num.digit10,\ + iMsI_t_PtR->u.num.digit11, iMsI_t_PtR->u.num.digit12,\ + iMsI_t_PtR->u.num.digit13, iMsI_t_PtR->u.num.digit14);\ + }\ + if ((iMsI_t_PtR->u.num.digit15 != 0xf) && (l_ret > 0)) {\ + l_offset += l_ret;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u", iMsI_t_PtR->u.num.digit15);\ + }\ + } + +/* + * Mobile subscriber dialing number + */ +typedef struct { + Byte_t ext:1; + /* Type Of Number */ +#define MSISDN_TON_UNKNOWKN 0b000 +#define MSISDN_TON_INTERNATIONAL 0b001 +#define MSISDN_TON_NATIONAL 0b010 +#define MSISDN_TON_NETWORK 0b011 +#define MSISDN_TON_SUBCRIBER 0b100 +#define MSISDN_TON_ABBREVIATED 0b110 +#define MSISDN_TON_RESERVED 0b111 + Byte_t ton:3; + /* Numbering Plan Identification */ +#define MSISDN_NPI_UNKNOWN 0b0000 +#define MSISDN_NPI_ISDN_TELEPHONY 0b0001 +#define MSISDN_NPI_GENERIC 0b0010 +#define MSISDN_NPI_DATA 0b0011 +#define MSISDN_NPI_TELEX 0b0100 +#define MSISDN_NPI_MARITIME_MOBILE 0b0101 +#define MSISDN_NPI_LAND_MOBILE 0b0110 +#define MSISDN_NPI_ISDN_MOBILE 0b0111 +#define MSISDN_NPI_PRIVATE 0b1110 +#define MSISDN_NPI_RESERVED 0b1111 + Byte_t npi:4; + /* Dialing Number */ + struct { + Byte_t lsb:4; + Byte_t msb:4; +#define MSISDN_DIGIT_SIZE 10 + } digit[MSISDN_DIGIT_SIZE]; +} msisdn_t; + +/* + * International Mobile Equipment Identity + */ +typedef imsi_t imei_t; + +/* + * Public Land Mobile Network identifier + * PLMN = BCD encoding (Mobile Country Code + Mobile Network Code) + */ +typedef struct { + Byte_t MCCdigit2:4; + Byte_t MCCdigit1:4; + Byte_t MNCdigit3:4; + Byte_t MCCdigit3:4; + Byte_t MNCdigit2:4; + Byte_t MNCdigit1:4; +} plmn_t; + +/* + * Location Area Identification + */ +typedef struct { + plmn_t plmn; /* + */ + lac_t lac; /* Location Area Code */ +} lai_t; + +/* + * GPRS Routing Area Identification + */ +typedef struct { + plmn_t plmn; /* + */ + lac_t lac; /* Location Area Code */ + rac_t rac; /* Routing Area Code */ +} RAI_t; + +/* + * EPS Tracking Area Identification + */ +typedef struct { + plmn_t plmn; /* + */ + tac_t tac; /* Tracking Area Code */ +} tai_t; + +/* + * EPS Globally Unique MME Identity + */ +typedef struct { + plmn_t plmn; /* + */ + uint16_t MMEgid; /* MME group identifier */ + uint8_t MMEcode; /* MME code */ +} gummei_t; + +/* + * EPS Globally Unique Temporary UE Identity + */ +typedef struct { + gummei_t gummei; /* Globally Unique MME Identity */ + uint32_t m_tmsi; /* M-Temporary Mobile Subscriber Identity */ +} GUTI_t; +#define GUTI2STR(GuTi_PtR, GuTi_StR, MaXlEn) \ + {\ + int l_offset = 0;\ + int l_ret = 0;\ + l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%03u.",\ + GuTi_PtR->gummei.plmn.MCCdigit3 * 100 +\ + GuTi_PtR->gummei.plmn.MCCdigit2 * 10 +\ + GuTi_PtR->gummei.plmn.MCCdigit1);\ + if (l_ret > 0) {\ + l_offset += l_ret;\ + } else {\ + l_offset = MaXlEn;\ + }\ + if (GuTi_PtR->gummei.plmn.MNCdigit1 != 0xf) {\ + l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%03u|%04x|%02x|%08x",\ + GuTi_PtR->gummei.plmn.MNCdigit3 * 100 +\ + GuTi_PtR->gummei.plmn.MNCdigit2 * 10 +\ + GuTi_PtR->gummei.plmn.MNCdigit1,\ + GuTi_PtR->gummei.MMEgid,\ + GuTi_PtR->gummei.MMEcode,\ + GuTi_PtR->m_tmsi);\ + } else {\ + l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%02u|%04x|%02x|%08x",\ + GuTi_PtR->gummei.plmn.MNCdigit2 * 10 +\ + GuTi_PtR->gummei.plmn.MNCdigit1,\ + GuTi_PtR->gummei.MMEgid,\ + GuTi_PtR->gummei.MMEcode,\ + GuTi_PtR->m_tmsi);\ + }\ + } + + + + +/* Checks PLMN validity */ +#define PLMN_IS_VALID(plmn) (((plmn).MCCdigit1 & \ + (plmn).MCCdigit2 & \ + (plmn).MCCdigit3) != 0x0F) + +/* Checks TAC validity */ +#define TAC_IS_VALID(tac) (((tac) != 0x0000) && ((tac) != 0xFFF0)) + +/* Checks TAI validity */ +#define TAI_IS_VALID(tai) (PLMN_IS_VALID((tai).plmn) && \ + TAC_IS_VALID((tai).tac)) +/* + * A list of PLMNs + */ +#define PLMN_LIST_T(SIZE) struct {Byte_t n_plmns; plmn_t plmn[SIZE];} + +/* + * A list of TACs + */ +#define TAC_LIST_T(SIZE) struct {Byte_t n_tacs; TAC_t tac[SIZE];} + +/* + * A list of TAIs + */ +#define TAI_LIST_T(SIZE) struct {Byte_t n_tais; tai_t tai[SIZE];} + +#if 0 +/* + * User notification callback, executed whenever a change of data with + * respect of network information (e.g. network registration and/or + * location change, new PLMN becomes available) is notified by the + * EPS Mobility Management sublayer + */ +typedef int (*emm_indication_callback_t) (Stat_t, tac_t, ci_t, AcT_t, + const char*, size_t); +#endif + +typedef enum eps_protocol_discriminator_e { + /* Protocol discriminator identifier for EPS Mobility Management */ + EPS_MOBILITY_MANAGEMENT_MESSAGE = 0x7, + + /* Protocol discriminator identifier for EPS Session Management */ + EPS_SESSION_MANAGEMENT_MESSAGE = 0x2, +} eps_protocol_discriminator_t; + +/****************************************************************************/ +/******************** G L O B A L V A R I A B L E S ********************/ +/****************************************************************************/ + +/****************************************************************************/ +/****************** E X P O R T E D F U N C T I O N S ******************/ +/****************************************************************************/ + +#endif /* __COMMONDEF_H__*/ diff --git a/openair3/NAS/COMMON/networkDef.h b/openair3/NAS/COMMON/networkDef.h deleted file mode 120000 index 2648b55e99..0000000000 --- a/openair3/NAS/COMMON/networkDef.h +++ /dev/null @@ -1 +0,0 @@ -../../../openair2/COMMON/networkDef.h \ No newline at end of file diff --git a/openair3/NAS/COMMON/networkDef.h b/openair3/NAS/COMMON/networkDef.h new file mode 100644 index 0000000000..e3e8e1f08b --- /dev/null +++ b/openair3/NAS/COMMON/networkDef.h @@ -0,0 +1,280 @@ +/* + * Copyright (c) 2015, EURECOM (www.eurecom.fr) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + +/***************************************************************************** + +Source networkDef.h + +Version 0.1 + +Date 2012/09/21 + +Product NAS stack + +Subsystem include + +Author Frederic Maurel + +Description Contains network's global definitions + +*****************************************************************************/ +#ifndef __NETWORKDEF_H__ +#define __NETWORKDEF_H__ + +/****************************************************************************/ +/********************* G L O B A L C O N S T A N T S *******************/ +/****************************************************************************/ + +/* + * ---------------------- + * Network selection mode + * ---------------------- + */ +#define NET_PLMN_AUTO 0 +#define NET_PLMN_MANUAL 1 + +/* + * --------------------------- + * Network registration status + * --------------------------- + */ +/* not registered, not currently searching an operator to register to */ +#define NET_REG_STATE_OFF 0 +/* registered, home network */ +#define NET_REG_STATE_HN 1 +/* not registered, currently trying to attach or searching an operator + * to register to */ +#define NET_REG_STATE_ON 2 +/* registration denied */ +#define NET_REG_STATE_DENIED 3 +/* unknown (e.g. out of GERAN/UTRAN/E-UTRAN coverage) */ +#define NET_REG_STATE_UNKNOWN 4 +/* registered, roaming */ +#define NET_REG_STATE_ROAMING 5 +/* registered for "SMS only", home network */ +#define NET_REG_STATE_SMS_HN 6 +/* registered, for "SMS only", roaming */ +#define NET_REG_STATE_SMS_ROAMING 7 +/* attached for emergency bearer services only (applicable to UTRAN) */ +#define NET_REG_STATE_EMERGENCY 8 + +/* + * ------------------------------------ + * Network access technology indicators + * ------------------------------------ + */ +#define NET_ACCESS_UNAVAILABLE (-1) /* Not available */ +#define NET_ACCESS_GSM 0 /* GSM */ +#define NET_ACCESS_COMPACT 1 /* GSM Compact */ +#define NET_ACCESS_UTRAN 2 /* UTRAN */ +#define NET_ACCESS_EGPRS 3 /* GSM w/EGPRS */ +#define NET_ACCESS_HSDPA 4 /* UTRAN w/HSDPA */ +#define NET_ACCESS_HSUPA 5 /* UTRAN w/HSUPA */ +#define NET_ACCESS_HSDUPA 6 /* UTRAN w/HSDPA and HSUPA */ +#define NET_ACCESS_EUTRAN 7 /* E-UTRAN */ + +/* + * --------------------------------------- + * Network operator representation formats + * --------------------------------------- + */ +#define NET_FORMAT_LONG 0 /* long format alphanumeric */ +#define NET_FORMAT_SHORT 1 /* short format alphanumeric */ +#define NET_FORMAT_NUM 2 /* numeric format */ + +#define NET_FORMAT_MAX_SIZE NET_FORMAT_LONG_SIZE + +/* + * ----------------------------- + * Network operator availability + * ----------------------------- + */ +#define NET_OPER_UNKNOWN 0 /* unknown operator */ +#define NET_OPER_AVAILABLE 1 /* available operator */ +#define NET_OPER_CURRENT 2 /* currently selected operator */ +#define NET_OPER_FORBIDDEN 3 /* forbidden operator */ + +/* + * -------------------------------------- + * Network connection establishment cause + * -------------------------------------- + */ +#define NET_ESTABLISH_CAUSE_EMERGENCY 0x01 +#define NET_ESTABLISH_CAUSE_HIGH_PRIO 0x02 +#define NET_ESTABLISH_CAUSE_MT_ACCESS 0x03 +#define NET_ESTABLISH_CAUSE_MO_SIGNAL 0x04 +#define NET_ESTABLISH_CAUSE_MO_DATA 0x05 +#define NET_ESTABLISH_CAUSE_V1020 0x06 + +/* + * -------------------------------------- + * Network connection establishment type + * -------------------------------------- + */ +#define NET_ESTABLISH_TYPE_ORIGINATING_SIGNAL 0x10 +#define NET_ESTABLISH_TYPE_EMERGENCY_CALLS 0x20 +#define NET_ESTABLISH_TYPE_ORIGINATING_CALLS 0x30 +#define NET_ESTABLISH_TYPE_TERMINATING_CALLS 0x40 +#define NET_ESTABLISH_TYPE_MO_CS_FALLBACK 0x50 + +/* + * ------------------- + * PDN connection type + * ------------------- + */ +#define NET_PDN_TYPE_IPV4 (0 + 1) +#define NET_PDN_TYPE_IPV6 (1 + 1) +#define NET_PDN_TYPE_IPV4V6 (2 + 1) + +/****************************************************************************/ +/************************ G L O B A L T Y P E S ************************/ +/****************************************************************************/ + +/* + * --------------------- + * PDN connection status + * --------------------- + */ +typedef enum { + /* MT = The Mobile Terminal, NW = The Network */ + NET_PDN_MT_DEFAULT_ACT = 1, /* MT has activated a PDN connection */ + NET_PDN_NW_DEFAULT_DEACT, /* NW has deactivated a PDN connection */ + NET_PDN_MT_DEFAULT_DEACT, /* MT has deactivated a PDN connection */ + NET_PDN_NW_DEDICATED_ACT, /* NW has activated an EPS bearer context */ + NET_PDN_MT_DEDICATED_ACT, /* MT has activated an EPS bearer context */ + NET_PDN_NW_DEDICATED_DEACT, /* NW has deactivated an EPS bearer context */ + NET_PDN_MT_DEDICATED_DEACT, /* MT has deactivated an EPS bearer context */ +} network_pdn_state_t; + +/* + * --------------------------- + * Network operator identifier + * --------------------------- + */ +typedef struct { +#define NET_FORMAT_LONG_SIZE 16 /* Long alphanumeric format */ +#define NET_FORMAT_SHORT_SIZE 8 /* Short alphanumeric format */ +#define NET_FORMAT_NUM_SIZE 6 /* Numeric format (PLMN identifier */ + union { + unsigned char alpha_long[NET_FORMAT_LONG_SIZE+1]; + unsigned char alpha_short[NET_FORMAT_SHORT_SIZE+1]; + unsigned char num[NET_FORMAT_NUM_SIZE+1]; + } id; +} network_plmn_t; + +/* + * ------------------------------- + * EPS bearer level QoS parameters + * ------------------------------- + */ +typedef struct { + int gbrUL; /* Guaranteed Bit Rate for uplink */ + int gbrDL; /* Guaranteed Bit Rate for downlink */ + int mbrUL; /* Maximum Bit Rate for uplink */ + int mbrDL; /* Maximum Bit Rate for downlink */ + int qci; /* QoS Class Identifier */ +} network_qos_t; + +/* + * ----------------------------- + * IPv4 packet filter parameters + * ----------------------------- + */ +typedef struct { + unsigned char protocol; /* Protocol identifier */ + unsigned char tos; /* Type of service */ +#define NET_PACKET_FILTER_IPV4_ADDR_SIZE 4 + unsigned char addr[NET_PACKET_FILTER_IPV4_ADDR_SIZE]; + unsigned char mask[NET_PACKET_FILTER_IPV4_ADDR_SIZE]; +} network_ipv4_data_t; + +/* + * ----------------------------- + * IPv6 packet filter parameters + * ----------------------------- + */ +typedef struct { + unsigned char nh; /* Next header type */ + unsigned char tf; /* Traffic class */ +#define NET_PACKET_FILTER_IPV6_ADDR_SIZE 16 + unsigned char addr[NET_PACKET_FILTER_IPV6_ADDR_SIZE]; + unsigned char mask[NET_PACKET_FILTER_IPV6_ADDR_SIZE]; + unsigned int ipsec; /* IPSec security parameter index */ + unsigned int fl; /* Flow label */ +} network_ipv6_data_t; + +/* + * ------------- + * Packet Filter + * ------------- + */ +typedef struct { + unsigned char id; /* Packet filter identifier */ +#define NET_PACKET_FILTER_DOWNLINK 0x01 +#define NET_PACKET_FILTER_UPLINK 0x02 +#define NET_PACKET_FILTER_BIDIR 0x03 + unsigned char dir; /* Packet filter direction */ + unsigned char precedence; /* Evaluation precedence */ + union { + network_ipv4_data_t ipv4; + network_ipv6_data_t ipv6; + } data; + unsigned short lport; /* Local (UE) port number */ + unsigned short rport; /* Remote (network) port number */ +} network_pkf_t; + +/* + * --------------------- + * Traffic Flow Template + * --------------------- + */ +typedef struct { + int n_pkfs; +#define NET_PACKET_FILTER_MAX 16 + network_pkf_t* pkf[NET_PACKET_FILTER_MAX]; +} network_tft_t; + +#if 0 +/* + * User notification callback, executed whenever a change of status with + * respect of PDN connection or EPS bearer context is notified by the EPS + * Session Management sublayer + */ +typedef int (*esm_indication_callback_t) (int, network_pdn_state_t); +#endif + +/****************************************************************************/ +/******************** G L O B A L V A R I A B L E S ********************/ +/****************************************************************************/ + +/****************************************************************************/ +/****************** E X P O R T E D F U N C T I O N S ******************/ +/****************************************************************************/ + +#endif /* __NETWORKDEF_H__*/ diff --git a/openair3/NAS/COMMON/securityDef.h b/openair3/NAS/COMMON/securityDef.h index c418de2c60..30732f26f5 100644 --- a/openair3/NAS/COMMON/securityDef.h +++ b/openair3/NAS/COMMON/securityDef.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source securityDef.h diff --git a/openair3/NAS/COMMON/userDef.h b/openair3/NAS/COMMON/userDef.h index f6398794fe..fdb8287b3b 100644 --- a/openair3/NAS/COMMON/userDef.h +++ b/openair3/NAS/COMMON/userDef.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source userDef.h diff --git a/openair3/NAS/COPYING b/openair3/NAS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TEST/AS_SIMULATOR/COPYING b/openair3/NAS/TEST/AS_SIMULATOR/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TEST/AS_SIMULATOR/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TEST/AS_SIMULATOR/Makefile b/openair3/NAS/TEST/AS_SIMULATOR/Makefile index 91146b1afa..3d379c6d06 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/Makefile +++ b/openair3/NAS/TEST/AS_SIMULATOR/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + export PROCESS = MME include ../../Makerules diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_data.c b/openair3/NAS/TEST/AS_SIMULATOR/as_data.c index 2ed7cdc7a3..56b00125a4 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_data.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_data.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_data.h b/openair3/NAS/TEST/AS_SIMULATOR/as_data.h index 2f94f40bb9..24c6473730 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_data.h +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_data.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_process.c b/openair3/NAS/TEST/AS_SIMULATOR/as_process.c index e3c71fe839..21e484e40a 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_process.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_process.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_process.h b/openair3/NAS/TEST/AS_SIMULATOR/as_process.h index 4791118cd8..75df1f0d88 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_process.h +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_process.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c index 20c49981bd..efe2c1af72 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.c b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.c index 0c306ad6c5..ff6720da5f 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.h b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.h index 75028a8bd8..b15bf8f29b 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.h +++ b/openair3/NAS/TEST/AS_SIMULATOR/as_simulator_parser.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/nas_data.c b/openair3/NAS/TEST/AS_SIMULATOR/nas_data.c index 7c938b786d..990a856a9d 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/nas_data.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/nas_data.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/nas_data.h b/openair3/NAS/TEST/AS_SIMULATOR/nas_data.h index 86856b5de5..ff55007014 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/nas_data.h +++ b/openair3/NAS/TEST/AS_SIMULATOR/nas_data.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/nas_process.c b/openair3/NAS/TEST/AS_SIMULATOR/nas_process.c index 4791764361..17ad99715b 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/nas_process.c +++ b/openair3/NAS/TEST/AS_SIMULATOR/nas_process.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/AS_SIMULATOR/nas_process.h b/openair3/NAS/TEST/AS_SIMULATOR/nas_process.h index ed50809ce0..ae5baebafc 100644 --- a/openair3/NAS/TEST/AS_SIMULATOR/nas_process.h +++ b/openair3/NAS/TEST/AS_SIMULATOR/nas_process.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/COPYING b/openair3/NAS/TEST/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TEST/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TEST/MSC/COPYING b/openair3/NAS/TEST/MSC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TEST/MSC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TEST/MSC/mscgen b/openair3/NAS/TEST/MSC/mscgen deleted file mode 100755 index 7a146811c7..0000000000 Binary files a/openair3/NAS/TEST/MSC/mscgen and /dev/null differ diff --git a/openair3/NAS/TEST/NETWORK/COPYING b/openair3/NAS/TEST/NETWORK/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TEST/NETWORK/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TEST/NETWORK/Makefile b/openair3/NAS/TEST/NETWORK/Makefile index e6e03f1362..b0b5516801 100644 --- a/openair3/NAS/TEST/NETWORK/Makefile +++ b/openair3/NAS/TEST/NETWORK/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + export PROCESS = MME include ../../Makerules diff --git a/openair3/NAS/TEST/NETWORK/README b/openair3/NAS/TEST/NETWORK/README index 25a6de5d14..465e355e78 100644 --- a/openair3/NAS/TEST/NETWORK/README +++ b/openair3/NAS/TEST/NETWORK/README @@ -18,9 +18,9 @@ EURECOM-NAS directory should contain following files: EURECOM-NAS |-- bin -| |-- .ue.nvram -| |-- .ue_emm.nvram -| |-- .usim.nvram +| |-- .ue.nvram0 +| |-- .ue_emm.nvram0 +| |-- .usim.nvram0 | |-- NetworkProcess | |-- UEprocess | `-- UserProcess @@ -57,10 +57,10 @@ UE for testing purpose. When starting up, UEprocess reads configuration data from .nvram binary files used as UE's non-volatile memory. -.usim.nvram contains data stored into the USIM -.ue.nvram contains data related to the UE identification (IMEI, +.usim.nvram0 contains data stored into the USIM +.ue.nvram0 contains data related to the UE identification (IMEI, manufacturer, model, PIN code) -.ue_emm.nvram contains data related to EPS Mobility Management (IMSI, last +.ue_emm.nvram0 contains data related to EPS Mobility Management (IMSI, last registered PLMN) -------------------------------------------------------------------------------- diff --git a/openair3/NAS/TEST/NETWORK/network_parser.c b/openair3/NAS/TEST/NETWORK/network_parser.c index f804e495b7..f540a8a99c 100644 --- a/openair3/NAS/TEST/NETWORK/network_parser.c +++ b/openair3/NAS/TEST/NETWORK/network_parser.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/NETWORK/network_parser.h b/openair3/NAS/TEST/NETWORK/network_parser.h index ab158a444d..a20c313be3 100644 --- a/openair3/NAS/TEST/NETWORK/network_parser.h +++ b/openair3/NAS/TEST/NETWORK/network_parser.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/NETWORK/network_simulator.c b/openair3/NAS/TEST/NETWORK/network_simulator.c index 9a49f12547..294241a384 100644 --- a/openair3/NAS/TEST/NETWORK/network_simulator.c +++ b/openair3/NAS/TEST/NETWORK/network_simulator.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/USER/COPYING b/openair3/NAS/TEST/USER/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TEST/USER/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TEST/USER/Makefile b/openair3/NAS/TEST/USER/Makefile index f65e6ff557..6f613b3cc9 100644 --- a/openair3/NAS/TEST/USER/Makefile +++ b/openair3/NAS/TEST/USER/Makefile @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + include ../../Makerules include ../../Makefile.inc diff --git a/openair3/NAS/TEST/USER/user_parser.c b/openair3/NAS/TEST/USER/user_parser.c index f43639ed73..2b7afd5d04 100644 --- a/openair3/NAS/TEST/USER/user_parser.c +++ b/openair3/NAS/TEST/USER/user_parser.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/USER/user_parser.h b/openair3/NAS/TEST/USER/user_parser.h index 7c8da2b1a5..d1972de028 100644 --- a/openair3/NAS/TEST/USER/user_parser.h +++ b/openair3/NAS/TEST/USER/user_parser.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TEST/USER/user_simulator.c b/openair3/NAS/TEST/USER/user_simulator.c index 8a341bc7a9..ec16b3453f 100644 --- a/openair3/NAS/TEST/USER/user_simulator.c +++ b/openair3/NAS/TEST/USER/user_simulator.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /***************************************************************************** Eurecom OpenAirInterface 3 Copyright(c) 2012 Eurecom diff --git a/openair3/NAS/TOOLS/COPYING b/openair3/NAS/TOOLS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/TOOLS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/TOOLS/Makefile b/openair3/NAS/TOOLS/Makefile deleted file mode 100644 index d54edd3049..0000000000 --- a/openair3/NAS/TOOLS/Makefile +++ /dev/null @@ -1,86 +0,0 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -export PROCESS = UE - -ifndef PROJDIR -PROJDIR = $(PWD)/.. -endif - -include $(PROJDIR)/Makerules -include $(PROJDIR)/Makefile.inc -include $(PROJDIR)/../Makefile.tools - -export LD_RUN_PATH = $(LIBDIR):$(LIBPROCESS) - -LIBS = -luenas.a -lrt -INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(USIMAPIDIR) -I$(EMMDIR) -I$(ESMDIR) -I$(IESDIR) - -#LIBSUTIL = $(LIBDIR)/$(LIBUTIL).a $(LIBDIR)/$(LIBUTIL).so - -USIM_OBJ = usim_data.o -UE_OBJ = ue_data.o - -USIM_TARGET = usim_data -UE_TARGET = ue_data - -TARGETS = $(USIM_TARGET) $(UE_TARGET) - -all: $(TARGETS) - -#-DIMSI_USA_MNC_3DIGITS -%.o: %.c Makefile - $(CC) $(CFLAGS) -c $< -o $@ - -$(USIM_TARGET): $(USIM_OBJ) $(LIBSUTIL) - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) -lnettle -lcrypto -lm - @echo Replacing $@ to $(BINDIR) - @$(RM) $(BINDIR)/$@ - @$(CP) $@ $(BINDIR) - -$(UE_TARGET): $(UE_OBJ) $(LIBSUTIL) - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) -lnettle -lcrypto -lm - @echo Replacing $@ to $(BINDIR) - @$(RM) $(BINDIR)/$@ - @$(CP) $@ $(BINDIR) - -clean: - $(RM) $(OBJS) *.bak *~ - -veryclean: clean - $(RM) $(TARGETS) - -veryveryclean: veryclean - $(RM) -Rf *.o $(PROJDIR) - $(RM) -Rf *.a $(PROJDIR) - -depend: - makedepend -- ${CFLAGS} -- ${SRCS} - -# DO NOT DELETE THIS LINE -- make depend depends on it. - diff --git a/openair3/NAS/TOOLS/conf2uedata.c b/openair3/NAS/TOOLS/conf2uedata.c new file mode 100644 index 0000000000..80a6933c05 --- /dev/null +++ b/openair3/NAS/TOOLS/conf2uedata.c @@ -0,0 +1,62 @@ +#include // perror, printf, fprintf, snprintf +#include // exit, free +#include // memset, strncpy +#include + +#include "conf2uedata.h" +#include "display.h" +#include "conf_parser.h" + +int main(int argc, char**argv) { + int option; + const char* conf_file = NULL; + const char* output_dir = NULL; + const char options[]="c:o:h"; + + while ((option = getopt(argc, argv, options)) != -1) { + switch (option) { + case 'c': + conf_file = optarg; + break; + case 'o': + output_dir = optarg; + break; + case 'h': + _display_usage(); + return true; + break; + default: + break; + } + } + + if (output_dir == NULL ) { + printf("No output option found\n"); + _display_usage(); + exit(1); + } + + if ( conf_file == NULL ) { + printf("No Configuration file is given\n"); + _display_usage(); + exit(1); + } + + if ( parse_config_file(output_dir, conf_file, OUTPUT_ALL) == false ) { + exit(1); + } + + display_data_from_directory(output_dir, DISPLAY_ALL); + + exit(0); +} + +/* + * Displays command line usage + */ +void _display_usage(void) { + fprintf(stderr, "usage: conf2uedata [OPTION]...\n"); + fprintf(stderr, "\t[-c]\tConfig file to use\n"); + fprintf(stderr, "\t[-o]\toutput file directory\n"); + fprintf(stderr, "\t[-h]\tDisplay this usage\n"); +} diff --git a/openair3/NAS/TOOLS/conf2uedata.h b/openair3/NAS/TOOLS/conf2uedata.h new file mode 100644 index 0000000000..ed56a22718 --- /dev/null +++ b/openair3/NAS/TOOLS/conf2uedata.h @@ -0,0 +1,6 @@ +#ifndef _CONF2UEDATA_H +#define _CONF2UEDATA_H + +void _display_usage(void); + +#endif // _CONF2UEDATA_H diff --git a/openair3/NAS/TOOLS/conf_emm.c b/openair3/NAS/TOOLS/conf_emm.c new file mode 100644 index 0000000000..668b90a0ae --- /dev/null +++ b/openair3/NAS/TOOLS/conf_emm.c @@ -0,0 +1,88 @@ +#include + +#include "memory.h" +#include "conf_emm.h" +#include "fs.h" + +void gen_emm_data( + emm_nvdata_t *emm_data, + const char *hplmn, + const char *msin, + const plmns_list *eplmn, + const networks_t networks) +{ + memset(emm_data, 0, sizeof(emm_nvdata_t)); + int hplmn_index = get_plmn_index(hplmn, networks); + plmn_conf_param_t *conf = &networks.items[hplmn_index].conf; + int i; + + emm_data->imsi.length = 8; + emm_data->imsi.u.num.parity = get_msin_parity(msin, conf->mcc, conf->mnc); + emm_data->imsi.u.num.digit1 = conf->mcc[0]; + emm_data->imsi.u.num.digit2 = conf->mcc[1]; + emm_data->imsi.u.num.digit3 = conf->mcc[2]; + + emm_data->imsi.u.num.digit4 = conf->mnc[0]; + emm_data->imsi.u.num.digit5 = conf->mnc[1]; + + if (strlen(conf->mnc) == 3) { + emm_data->rplmn.MNCdigit3 = conf->mnc[2]; + + emm_data->imsi.u.num.digit6 = conf->mnc[2]; + emm_data->imsi.u.num.digit7 = msin[0]; + emm_data->imsi.u.num.digit8 = msin[1]; + emm_data->imsi.u.num.digit9 = msin[2]; + emm_data->imsi.u.num.digit10 = msin[3]; + emm_data->imsi.u.num.digit11 = msin[4]; + emm_data->imsi.u.num.digit12 = msin[5]; + emm_data->imsi.u.num.digit13 = msin[6]; + emm_data->imsi.u.num.digit14 = msin[7]; + emm_data->imsi.u.num.digit15 = msin[8]; + } else { + emm_data->rplmn.MNCdigit3 = 0xf; + + emm_data->imsi.u.num.digit6 = msin[0]; + emm_data->imsi.u.num.digit7 = msin[1]; + emm_data->imsi.u.num.digit8 = msin[2]; + emm_data->imsi.u.num.digit9 = msin[3]; + emm_data->imsi.u.num.digit10 = msin[4]; + emm_data->imsi.u.num.digit11 = msin[5]; + emm_data->imsi.u.num.digit12 = msin[6]; + emm_data->imsi.u.num.digit13 = msin[7]; + emm_data->imsi.u.num.digit14 = msin[8]; + emm_data->imsi.u.num.digit15 = msin[9]; + } + + emm_data->rplmn.MCCdigit1 = conf->mcc[0]; + emm_data->rplmn.MCCdigit2 = conf->mcc[1]; + emm_data->rplmn.MCCdigit3 = conf->mcc[2]; + emm_data->rplmn.MNCdigit1 = conf->mnc[0]; + emm_data->rplmn.MNCdigit2 = conf->mnc[1]; + + emm_data->eplmn.n_plmns = eplmn->size; + for (i = 0; i < eplmn->size; i++) { + emm_data->eplmn.plmn[i] = networks.items[eplmn->items[i]].plmn; + } +} + +bool write_emm_data(const char *directory, int user_id, emm_nvdata_t *emm_data) { + int rc; + char* filename = make_filename(directory, EMM_NVRAM_FILENAME, user_id); + rc = memory_write(filename, emm_data, sizeof(emm_nvdata_t)); + free(filename); + if (rc != RETURNok) { + perror("ERROR\t: memory_write() failed"); + exit(false); + } + return(true); +} + +int get_msin_parity(const char * msin, const char *mcc, const char *mnc) { + int imsi_size = strlen(msin) + strlen(mcc) + + strlen(mnc); + int result = (imsi_size % 2 == 0) ? 0 : 1; + return result; + +} + + diff --git a/openair3/NAS/TOOLS/conf_emm.h b/openair3/NAS/TOOLS/conf_emm.h new file mode 100644 index 0000000000..f9c30d31c9 --- /dev/null +++ b/openair3/NAS/TOOLS/conf_emm.h @@ -0,0 +1,18 @@ +#ifndef _CONF_EMM_H +#define _CONF_EMM_H + +#include "emmData.h" +#include "conf_network.h" +#include "conf_user_plmn.h" + +void gen_emm_data( + emm_nvdata_t *emm_data, + const char *hplmn, + const char *msin, + const plmns_list *eplmn, + const networks_t networks); + +bool write_emm_data(const char *directory, int user_id, emm_nvdata_t *emm_data); +int get_msin_parity(const char * msin, const char *mcc, const char *mnc); + +#endif diff --git a/openair3/NAS/TOOLS/conf_network.c b/openair3/NAS/TOOLS/conf_network.c new file mode 100644 index 0000000000..96e2183327 --- /dev/null +++ b/openair3/NAS/TOOLS/conf_network.c @@ -0,0 +1,112 @@ +#include +#include + +#include "conf_network.h" + +int get_plmn_index(const char * mccmnc, const networks_t networks) { + char mcc[4]; + char mnc[strlen(mccmnc) - 2]; + strncpy(mcc, mccmnc, 3); + mcc[3] = '\0'; + strncpy(mnc, mccmnc + 3, 3); + mnc[strlen(mccmnc) - 3] = '\0'; + for (int i = 0; i < networks.size; i++) { + if (strcmp(networks.items[i].conf.mcc, mcc) == 0) { + if (strcmp(networks.items[i].conf.mnc, mnc) == 0) { + return i; + } + } + } + return -1; +} + +plmn_t make_plmn_from_conf(const plmn_conf_param_t *plmn_conf) { + plmn_t plmn; + char num[6]; + + memset(&plmn, 0xff, sizeof(plmn)); + + snprintf(num, 6, "%s%s", plmn_conf->mcc, plmn_conf->mnc); + + plmn.MCCdigit2 = plmn_conf->mcc[1]; + plmn.MCCdigit1 = plmn_conf->mcc[0]; + plmn.MCCdigit3 = plmn_conf->mcc[2]; + plmn.MNCdigit2 = plmn_conf->mnc[1]; + plmn.MNCdigit1 = plmn_conf->mnc[0]; + if (strlen(plmn_conf->mnc) > 2) { + plmn.MNCdigit3 = plmn_conf->mnc[2]; + } + return plmn; +} + +void gen_network_record_from_conf(const plmn_conf_param_t *conf, network_record_t *record) { + strcpy(record->fullname, conf->fullname); + strcpy(record->shortname, conf->shortname); + + char num[6]; + sprintf(num, "%s%s", conf->mcc, conf->mnc); + record->num = atoi(num); + + record->plmn = make_plmn_from_conf(conf); + record->tac_end = 0xfffd; + record->tac_start = 0x0001; +} + +bool parse_plmn_param(config_setting_t *plmn_setting, plmn_conf_param_t *conf) { + int rc = 0; + rc = config_setting_lookup_string(plmn_setting, FULLNAME, &conf->fullname); + if (rc != 1) { + printf("Error on FULLNAME\n"); + return false; + } + rc = config_setting_lookup_string(plmn_setting, SHORTNAME, &conf->shortname); + if (rc != 1) { + printf("Error on SHORTNAME\n"); + return false; + } + rc = config_setting_lookup_string(plmn_setting, MNC, &conf->mnc); + if (rc != 1 || strlen(conf->mnc) > 3 + || strlen(conf->mnc) < 2) { + printf("Error ond MNC. Exiting\n"); + return false; + } + rc = config_setting_lookup_string(plmn_setting, MCC, &conf->mcc); + if (rc != 1 || strlen(conf->mcc) != 3) { + printf("Error on MCC\n"); + return false; + } + return true; +} + +bool parse_plmns(config_setting_t *all_plmn_setting, networks_t *networks) { + config_setting_t *plmn_setting = NULL; + char plmn[10]; + int size = 0; + + size = config_setting_length(all_plmn_setting); + + networks->size = size; + networks->items = malloc(sizeof(network_t) * size); + for (int i = 0; i < size; i++) { + memset(&networks->items[i].record, 0xff, sizeof(network_record_t)); + } + + for (int i = 0; i < networks->size; i++) { + network_t *network = &networks->items[i]; + sprintf(plmn, "%s%d", PLMN, i); + plmn_setting = config_setting_get_member(all_plmn_setting, plmn); + if (plmn_setting == NULL) { + printf("PLMN%d not fouund\n", i); + return false; + } + + if ( parse_plmn_param(plmn_setting, &network->conf) == false ) { + return false; + } + gen_network_record_from_conf(&network->conf, &network->record); + network->plmn = network->record.plmn; + } + return true; +} + + diff --git a/openair3/NAS/TOOLS/conf_network.h b/openair3/NAS/TOOLS/conf_network.h new file mode 100644 index 0000000000..a535841a4c --- /dev/null +++ b/openair3/NAS/TOOLS/conf_network.h @@ -0,0 +1,54 @@ +#ifndef _CONF_NETWORK_H +#define _CONF_NETWORK_H + +#include +#include +#include "usim_api.h" + +#define PLMN "PLMN" + +#define FULLNAME "FULLNAME" +#define SHORTNAME "SHORTNAME" +#define MNC "MNC" +#define MCC "MCC" + +#define MIN_TAC 0x0000 +#define MAX_TAC 0xFFFE + +/* + * PLMN network operator record + */ +typedef struct { + unsigned int num; + plmn_t plmn; + char fullname[NET_FORMAT_LONG_SIZE + 1]; + char shortname[NET_FORMAT_SHORT_SIZE + 1]; + tac_t tac_start; + tac_t tac_end; +} network_record_t; + +typedef struct { + const char *fullname; + const char *shortname; + const char *mnc; + const char *mcc; +} plmn_conf_param_t; + +typedef struct { + plmn_conf_param_t conf; + network_record_t record; + plmn_t plmn; +} network_t; + +typedef struct { + int size; + network_t *items; +} networks_t; + +bool parse_plmn_param(config_setting_t *plmn_setting, plmn_conf_param_t *conf); +bool parse_plmns(config_setting_t *all_plmn_setting, networks_t *plmns); + +void gen_network_record_from_conf(const plmn_conf_param_t *conf, network_record_t *record); +int get_plmn_index(const char * mccmnc, const networks_t networks); + +#endif diff --git a/openair3/NAS/TOOLS/conf_parser.c b/openair3/NAS/TOOLS/conf_parser.c new file mode 100644 index 0000000000..d46142c461 --- /dev/null +++ b/openair3/NAS/TOOLS/conf_parser.c @@ -0,0 +1,119 @@ +#include "conf_parser.h" + +#include "conf_network.h" +#include "conf_emm.h" +#include "conf_usim.h" +#include "conf_user_data.h" +#include "conf_user_plmn.h" + +bool parse_config_file(const char *output_dir, const char *conf_filename, int output_flags) { + int rc = true; + int ret; + int ue_nb = 0; + config_setting_t *root_setting = NULL; + config_setting_t *ue_setting = NULL; + config_setting_t *all_plmn_setting = NULL; + char user[10]; + config_t cfg; + + networks_t networks;; + + ret = get_config_from_file(conf_filename, &cfg); + if (ret == false) { + exit(1); + } + + root_setting = config_root_setting(&cfg); + ue_nb = config_setting_length(root_setting) - 1; + + all_plmn_setting = config_setting_get_member(root_setting, PLMN); + if (all_plmn_setting == NULL) { + printf("NO PLMN SECTION...EXITING...\n"); + return (false); + } + + if ( parse_plmns(all_plmn_setting, &networks) == false ) { + return false; + } + + for (int i = 0; i < ue_nb; i++) { + emm_nvdata_t emm_data; + + user_nvdata_t user_data; + user_data_conf_t user_data_conf; + + usim_data_t usim_data; + usim_data_conf_t usim_data_conf; + + user_plmns_t user_plmns; + + sprintf(user, "%s%d", UE, i); + + ue_setting = config_setting_get_member(root_setting, user); + if (ue_setting == NULL) { + printf("Check UE%d settings\n", i); + return false; + } + + if ( parse_user_plmns_conf(ue_setting, i, &user_plmns, &usim_data_conf.hplmn, networks) == false ) { + return false; + } + + rc = parse_ue_user_data(ue_setting, i, &user_data_conf); + if (rc != true) { + printf("Problem in USER section for UE%d. EXITING...\n", i); + return false; + } + gen_user_data(&user_data_conf, &user_data); + + rc = parse_ue_sim_param(ue_setting, i, &usim_data_conf); + if (rc != true) { + printf("Problem in SIM section for UE%d. EXITING...\n", i); + return false; + } + gen_usim_data(&usim_data_conf, &usim_data, &user_plmns, networks); + + gen_emm_data(&emm_data, usim_data_conf.hplmn, usim_data_conf.msin, + &user_plmns.equivalents_home, networks); + + if ( output_flags & OUTPUT_UEDATA ) { + write_user_data(output_dir, i, &user_data); + } + + if ( output_flags & OUTPUT_USIM ) { + write_usim_data(output_dir, i, &usim_data); + } + + if ( output_flags & OUTPUT_EMM ) { + write_emm_data(output_dir, i, &emm_data); + } + + user_plmns_free(&user_plmns); + + } + free(networks.items); + networks.size=0; + config_destroy(&cfg); + return(true); +} + +bool get_config_from_file(const char *filename, config_t *config) { + config_init(config); + if (filename == NULL) { + // XXX write error message ? + return(false); + } + + /* Read the file. If there is an error, report it and exit. */ + if (!config_read_file(config, filename)) { + fprintf(stderr, "Cant read config file '%s': %s\n", filename, + config_error_text(config)); + if ( config_error_type(config) == CONFIG_ERR_PARSE ) { + fprintf(stderr, "This is line %d\n", config_error_line(config)); + } + config_destroy(config); + return (false); + } + return true; +} + diff --git a/openair3/NAS/TOOLS/conf_parser.h b/openair3/NAS/TOOLS/conf_parser.h new file mode 100644 index 0000000000..49d3645faf --- /dev/null +++ b/openair3/NAS/TOOLS/conf_parser.h @@ -0,0 +1,17 @@ +#ifndef _CONF_PARSER_H +#define _CONF_PARSER_H + +#include +#include + +#define UE "UE" + +#define OUTPUT_EMM 1 +#define OUTPUT_USIM 2 +#define OUTPUT_UEDATA 4 +#define OUTPUT_ALL 7 + +bool get_config_from_file(const char *filename, config_t *config); +bool parse_config_file(const char *output_dir, const char *filename, int output_flags); + +#endif diff --git a/openair3/NAS/TOOLS/conf_user_data.c b/openair3/NAS/TOOLS/conf_user_data.c new file mode 100644 index 0000000000..5e14797e16 --- /dev/null +++ b/openair3/NAS/TOOLS/conf_user_data.c @@ -0,0 +1,86 @@ +#include +#include + +#include "commonDef.h" +#include "memory.h" +#include "fs.h" +#include "conf_user_data.h" + +int parse_ue_user_data(config_setting_t *ue_setting, int user_id, user_data_conf_t *u) { + config_setting_t *ue_param_setting = NULL; + + int rc = true; + ue_param_setting = config_setting_get_member(ue_setting, USER); + if (ue_param_setting == NULL) { + printf("Check USER section of UE%d. EXITING...\n", user_id); + return false; + } + rc = config_setting_lookup_string(ue_param_setting, UE_IMEI, &u->imei); + if (rc != 1) { + printf("Check USER IMEI section for UE%d. Exiting\n", user_id); + return false; + } + rc = config_setting_lookup_string(ue_param_setting, MANUFACTURER, + &u->manufacturer); + if (rc != 1) { + printf("Check USER MANUFACTURER for UE%d FULLNAME. Exiting\n", user_id); + return false; + } + rc = config_setting_lookup_string(ue_param_setting, MODEL, &u->model); + if (rc != 1) { + printf("Check USER MODEL for UE%d FULLNAME. Exiting\n", user_id); + return false; + } + rc = config_setting_lookup_string(ue_param_setting, PINCODE, &u->pin); + if (rc != 1) { + printf("Check USER PIN for UE%d FULLNAME. Exiting\n", user_id); + return false; + } + return true; +} + +void gen_user_data(user_data_conf_t *u, user_nvdata_t *user_data) { + memset(user_data, 0, sizeof(user_nvdata_t)); + snprintf(user_data->IMEI, USER_IMEI_SIZE + 1, "%s%d", u->imei, _luhn(u->imei)); + /* + * Manufacturer identifier + */ + strncpy(user_data->manufacturer, u->manufacturer, USER_MANUFACTURER_SIZE); + /* + * Model identifier + */ + strncpy(user_data->model, u->model, USER_MODEL_SIZE); + /* + * SIM Personal Identification Number + */ + strncpy(user_data->PIN, u->pin, USER_PIN_SIZE); +} + +bool write_user_data(const char *directory, int user_id, user_nvdata_t *data) { + int rc; + char* filename = make_filename(directory, USER_NVRAM_FILENAME, user_id); + rc = memory_write(filename, data, sizeof(user_nvdata_t)); + free(filename); + if (rc != RETURNok) { + perror("ERROR\t: memory_write() failed"); + return false; + } + return true; +} + +/* + * Computes the check digit using Luhn algorithm + */ +int _luhn(const char* cc) { + const int m[] = { 0, 2, 4, 6, 8, 1, 3, 5, 7, 9 }; + int odd = 1, sum = 0; + + for (int i = strlen(cc); i--; odd = !odd) { + int digit = cc[i] - '0'; + sum += odd ? m[digit] : digit; + } + + return 10 - (sum % 10); +} + + diff --git a/openair3/NAS/TOOLS/conf_user_data.h b/openair3/NAS/TOOLS/conf_user_data.h new file mode 100644 index 0000000000..6b1d641e03 --- /dev/null +++ b/openair3/NAS/TOOLS/conf_user_data.h @@ -0,0 +1,27 @@ +#ifndef _CONF_USER_DATA_H +#define _CONF_USER_DATA_H + +#include +#include +#include "userDef.h" + +#define USER "USER" +#define MANUFACTURER "MANUFACTURER" +#define MODEL "MODEL" +#define UE_IMEI "IMEI" +#define PINCODE "PIN" + +typedef struct { + const char* imei; + const char* manufacturer; + const char* model; + const char* pin; +} user_data_conf_t; + +void gen_user_data(user_data_conf_t *u, user_nvdata_t *user_data); +bool write_user_data(const char *directory, int user_id, user_nvdata_t *data); +int parse_ue_user_data(config_setting_t *ue_setting, int user_id, user_data_conf_t *u); + +int _luhn(const char* cc); + +#endif diff --git a/openair3/NAS/TOOLS/conf_user_plmn.c b/openair3/NAS/TOOLS/conf_user_plmn.c new file mode 100644 index 0000000000..3b3c6dd3e6 --- /dev/null +++ b/openair3/NAS/TOOLS/conf_user_plmn.c @@ -0,0 +1,81 @@ +#include +#include +#include "conf_user_plmn.h" + +bool parse_user_plmns_conf(config_setting_t *ue_setting, int user_id, + user_plmns_t *user_plmns, const char **h, + const networks_t networks) { + int nb_errors = 0; + const char *hplmn; + + if ( config_setting_lookup_string(ue_setting, HPLMN, h) != 1 ) { + printf("Check HPLMN section for UE%d. Exiting\n", user_id); + return false; + } + hplmn = *h; + if (get_plmn_index(hplmn, networks) == -1) { + printf("HPLMN for UE%d is not defined in PLMN section. Exiting\n", + user_id); + return false; + } + + if ( parse_Xplmn(ue_setting, UCPLMN, user_id, &user_plmns->users_controlled, networks) == false ) + nb_errors++; + if ( parse_Xplmn(ue_setting, OPLMN, user_id, &user_plmns->operators, networks) == false ) + nb_errors++; + if ( parse_Xplmn(ue_setting, OCPLMN, user_id, &user_plmns->operators_controlled, networks) == false ) + nb_errors++; + if ( parse_Xplmn(ue_setting, FPLMN, user_id, &user_plmns->forbiddens, networks) == false ) + nb_errors++; + if ( parse_Xplmn(ue_setting, EHPLMN, user_id, &user_plmns->equivalents_home, networks) == false ) + nb_errors++; + + if ( nb_errors > 0 ) + return false; + return true; +} + +bool parse_Xplmn(config_setting_t *ue_setting, const char *section, + int user_id, plmns_list *plmns, const networks_t networks) { + int rc; + int item_count; + config_setting_t *setting; + + setting = config_setting_get_member(ue_setting, section); + if (setting == NULL) { + printf("Check %s section for UE%d. Exiting\n", section, user_id); + return false; + } + + item_count = config_setting_length(setting); + int *datas = malloc(item_count * sizeof(int)); + for (int i = 0; i < item_count; i++) { + const char *mccmnc = config_setting_get_string_elem(setting, i); + if (mccmnc == NULL) { + printf("Check %s section for UE%d. Exiting\n", section, user_id); + free(datas); + return false; + } + rc = get_plmn_index(mccmnc, networks); + if (rc == -1) { + printf("The PLMN %s is not defined in PLMN section. Exiting...\n", + mccmnc); + free(datas); + return false; + } + datas[i] = rc; + } + + plmns->size = item_count; + plmns->items = datas; + return true; +} + +void user_plmns_free(user_plmns_t *user_plmns) { + free(user_plmns->users_controlled.items); + free(user_plmns->operators.items); + free(user_plmns->operators_controlled.items); + free(user_plmns->forbiddens.items); + free(user_plmns->equivalents_home.items); + memset(user_plmns, 0, sizeof(user_plmns_t)); +} diff --git a/openair3/NAS/TOOLS/conf_user_plmn.h b/openair3/NAS/TOOLS/conf_user_plmn.h new file mode 100644 index 0000000000..561767b6c4 --- /dev/null +++ b/openair3/NAS/TOOLS/conf_user_plmn.h @@ -0,0 +1,37 @@ +#ifndef _CONF_USER_H +#define _CONF_USER_H + +#include +#include +#include "conf_network.h" + +#define HPLMN "HPLMN" +#define UCPLMN "UCPLMN_LIST" +#define OPLMN "OPLMN_LIST" +#define OCPLMN "OCPLMN_LIST" +#define FPLMN "FPLMN_LIST" +#define EHPLMN "EHPLMN_LIST" + +typedef struct { + int size; + int *items; +} plmns_list; + +typedef struct { + plmns_list users_controlled; + plmns_list operators; + plmns_list operators_controlled; + plmns_list forbiddens; + plmns_list equivalents_home; +} user_plmns_t; + +bool parse_user_plmns_conf(config_setting_t *ue_setting, int user_id, + user_plmns_t *user_plmns, const char **h, + const networks_t networks); + +bool parse_Xplmn(config_setting_t *ue_setting, const char *section, + int user_id, plmns_list *plmns, const networks_t networks); + +void user_plmns_free(user_plmns_t *user_plmns); + +#endif diff --git a/openair3/NAS/TOOLS/conf_usim.c b/openair3/NAS/TOOLS/conf_usim.c new file mode 100644 index 0000000000..3a5c6dbf6d --- /dev/null +++ b/openair3/NAS/TOOLS/conf_usim.c @@ -0,0 +1,308 @@ +#include +#include + +#include "userDef.h" +#include "utils.h" +#include "conf_emm.h" +#include "fs.h" +#include "conf_usim.h" + +bool parse_ue_sim_param(config_setting_t *ue_setting, int user_id, usim_data_conf_t *u) { + int rc = true; + config_setting_t *ue_param_setting = NULL; + ue_param_setting = config_setting_get_member(ue_setting, SIM); + if (ue_param_setting == NULL) { + printf("Check SIM section for UE%d. EXITING...\n", user_id); + return false; + } + rc = config_setting_lookup_string(ue_param_setting, MSIN, &u->msin); + if (rc != 1 || strlen(u->msin) > 10 || strlen(u->msin) < 9) { + printf("Check SIM MSIN section for UE%d. Exiting\n", user_id); + return false; + } + rc = config_setting_lookup_string(ue_param_setting, USIM_API_K, + &u->usim_api_k); + if (rc != 1) { + printf("Check SIM USIM_API_K section for UE%d. Exiting\n", user_id); + return false; + } + rc = config_setting_lookup_string(ue_param_setting, OPC, &u->opc); + if (rc != 1) { + printf("Check SIM OPC section for UE%d. Exiting\n", user_id); + return false; + } + rc = config_setting_lookup_string(ue_param_setting, MSISDN, &u->msisdn); + if (rc != 1) { + printf("Check SIM MSISDN section for UE%d. Exiting\n", user_id); + return false; + } + return true; +} + +void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data, + const user_plmns_t *user_plmns, const networks_t networks) { + int hplmn_index = get_plmn_index(u->hplmn, networks); + const plmn_conf_param_t *conf = &networks.items[hplmn_index].conf; + memset(usim_data, 0, sizeof(usim_data_t)); + usim_data->imsi.length = 8; + usim_data->imsi.u.num.parity = get_msin_parity(u->msin, + conf->mcc, + conf->mnc); + + usim_data->imsi.u.num.digit1 = conf->mcc[0]; + usim_data->imsi.u.num.digit2 = conf->mcc[1]; + usim_data->imsi.u.num.digit3 = conf->mcc[2]; + + usim_data->imsi.u.num.digit4 = conf->mnc[0]; + usim_data->imsi.u.num.digit5 = conf->mnc[1]; + + if (strlen(conf->mnc) == 2) { + usim_data->imsi.u.num.digit6 = u->msin[0]; + usim_data->imsi.u.num.digit7 = u->msin[1]; + usim_data->imsi.u.num.digit8 = u->msin[2]; + usim_data->imsi.u.num.digit9 = u->msin[3]; + usim_data->imsi.u.num.digit10 = u->msin[4]; + usim_data->imsi.u.num.digit11 = u->msin[5]; + usim_data->imsi.u.num.digit12 = u->msin[6]; + usim_data->imsi.u.num.digit13 = u->msin[7]; + usim_data->imsi.u.num.digit14 = u->msin[8]; + usim_data->imsi.u.num.digit15 = u->msin[9]; + } else { + usim_data->imsi.u.num.digit6 = conf->mnc[2]; + usim_data->imsi.u.num.digit7 = u->msin[0]; + usim_data->imsi.u.num.digit8 = u->msin[1]; + usim_data->imsi.u.num.digit9 = u->msin[2]; + usim_data->imsi.u.num.digit10 = u->msin[3]; + usim_data->imsi.u.num.digit11 = u->msin[4]; + usim_data->imsi.u.num.digit12 = u->msin[5]; + usim_data->imsi.u.num.digit13 = u->msin[6]; + usim_data->imsi.u.num.digit14 = u->msin[7]; + usim_data->imsi.u.num.digit15 = u->msin[8]; + } + + /* + * Ciphering and Integrity Keys + */ + usim_data->keys.ksi = KSI; + memset(&usim_data->keys.ck, 0, USIM_CK_SIZE); + memset(&usim_data->keys.ik, 0, USIM_IK_SIZE); + /* + * Higher Priority PLMN search period + */ + usim_data->hpplmn = 0x00; /* Disable timer */ + + /* + * List of Forbidden PLMNs + */ + for (int i = 0; i < USIM_FPLMN_MAX; i++) { + memset(&usim_data->fplmn[i], 0xff, sizeof(plmn_t)); + } + if (user_plmns->forbiddens.size > 0) { + for (int i = 0; i < user_plmns->forbiddens.size; i++) { + usim_data->fplmn[i] = networks.items[user_plmns->forbiddens.items[i]].plmn; + } + } + + /* + * Location Information + */ + usim_data->loci.tmsi = DEFAULT_TMSI; + usim_data->loci.lai.plmn = networks.items[hplmn_index].plmn; + usim_data->loci.lai.lac = DEFAULT_LAC; + usim_data->loci.status = USIM_LOCI_NOT_UPDATED; + /* + * Packet Switched Location Information + */ + usim_data->psloci.p_tmsi = DEFAULT_P_TMSI; + usim_data->psloci.signature[0] = 0x01; + usim_data->psloci.signature[1] = 0x02; + usim_data->psloci.signature[2] = 0x03; + usim_data->psloci.rai.plmn = networks.items[hplmn_index].plmn; + usim_data->psloci.rai.lac = DEFAULT_LAC; + usim_data->psloci.rai.rac = DEFAULT_RAC; + usim_data->psloci.status = USIM_PSLOCI_NOT_UPDATED; + /* + * Administrative Data + */ + usim_data->ad.UE_Operation_Mode = USIM_NORMAL_MODE; + usim_data->ad.Additional_Info = 0xffff; + usim_data->ad.MNC_Length = strlen(conf->mnc); + /* + * EPS NAS security context + */ + usim_data->securityctx.length = 52; + usim_data->securityctx.KSIasme.type = USIM_KSI_ASME_TAG; + usim_data->securityctx.KSIasme.length = 1; + usim_data->securityctx.KSIasme.value[0] = KSI_ASME; + usim_data->securityctx.Kasme.type = USIM_K_ASME_TAG; + usim_data->securityctx.Kasme.length = USIM_K_ASME_SIZE; + memset(usim_data->securityctx.Kasme.value, 0, + usim_data->securityctx.Kasme.length); + usim_data->securityctx.ulNAScount.type = USIM_UL_NAS_COUNT_TAG; + usim_data->securityctx.ulNAScount.length = USIM_UL_NAS_COUNT_SIZE; + memset(usim_data->securityctx.ulNAScount.value, 0, + usim_data->securityctx.ulNAScount.length); + usim_data->securityctx.dlNAScount.type = USIM_DL_NAS_COUNT_TAG; + usim_data->securityctx.dlNAScount.length = USIM_DL_NAS_COUNT_SIZE; + memset(usim_data->securityctx.dlNAScount.value, 0, + usim_data->securityctx.dlNAScount.length); + usim_data->securityctx.algorithmID.type = USIM_INT_ENC_ALGORITHMS_TAG; + usim_data->securityctx.algorithmID.length = 1; + usim_data->securityctx.algorithmID.value[0] = SECURITY_ALGORITHMS; + /* + * Subcriber's Number + */ + usim_data->msisdn.length = 7; + usim_data->msisdn.number.ext = 1; + usim_data->msisdn.number.ton = MSISDN_TON_UNKNOWKN; + usim_data->msisdn.number.npi = MSISDN_NPI_ISDN_TELEPHONY; + usim_data->msisdn.conf1_record_id = 0xff; /* Not used */ + usim_data->msisdn.ext1_record_id = 0xff; /* Not used */ + int j = 0; + for (int i = 0; i < strlen(u->msisdn); i += 2) { + usim_data->msisdn.number.digit[j].msb = u->msisdn[i]; + j++; + } + j = 0; + for (int i = 1; i < strlen(u->msisdn); i += 2) { + usim_data->msisdn.number.digit[j].lsb = u->msisdn[i]; + j++; + + } + if (strlen(u->msisdn) % 2 == 0) { + for (int i = strlen(u->msisdn) / 2; i < 10; i++) { + usim_data->msisdn.number.digit[i].msb = 0xf; + usim_data->msisdn.number.digit[i].lsb = 0xf; + } + } else { + usim_data->msisdn.number.digit[strlen(u->msisdn) / 2].lsb = 0xf; + for (int i = (strlen(u->msisdn) / 2) + 1; i < 10; i++) { + usim_data->msisdn.number.digit[i].msb = 0xf; + usim_data->msisdn.number.digit[i].lsb = 0xf; + } + } + /* + * PLMN Network Name and Operator PLMN List + */ + for (int i = 0; i < user_plmns->operators.size; i++) { + network_record_t record = networks.items[user_plmns->operators.items[i]].record; + usim_data->pnn[i].fullname.type = USIM_PNN_FULLNAME_TAG; + usim_data->pnn[i].fullname.length = strlen(record.fullname); + strncpy((char*) usim_data->pnn[i].fullname.value, record.fullname, + usim_data->pnn[i].fullname.length); + usim_data->pnn[i].shortname.type = USIM_PNN_SHORTNAME_TAG; + usim_data->pnn[i].shortname.length = strlen(record.shortname); + strncpy((char*) usim_data->pnn[i].shortname.value, record.shortname, + usim_data->pnn[i].shortname.length); + usim_data->opl[i].plmn = record.plmn; + usim_data->opl[i].start = record.tac_start; + usim_data->opl[i].end = record.tac_end; + usim_data->opl[i].record_id = i; + } + if (user_plmns->operators.size < USIM_OPL_MAX) { + for (int i = user_plmns->operators.size; i < USIM_OPL_MAX; i++) { + memset(&usim_data->opl[i].plmn, 0xff, sizeof(plmn_t)); + } + } + + /* + * List of Equivalent HPLMNs + */ + for (int i = 0; i < user_plmns->equivalents_home.size; i++) { + usim_data->ehplmn[i] = networks.items[user_plmns->equivalents_home.items[i]].plmn; + } + if (user_plmns->equivalents_home.size < USIM_EHPLMN_MAX) { + for (int i = user_plmns->equivalents_home.size; i < USIM_EHPLMN_MAX; i++) { + memset(&usim_data->ehplmn[i], 0xff, sizeof(plmn_t)); + } + } + /* + * Home PLMN Selector with Access Technology + */ + usim_data->hplmn.plmn = networks.items[hplmn_index].plmn; + usim_data->hplmn.AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); + + /* + * List of user controlled PLMN selector with Access Technology + */ + for (int i = 0; i < USIM_PLMN_MAX; i++) { + memset(&usim_data->plmn[i], 0xff, sizeof(plmn_t)); + } + if (user_plmns->users_controlled.size > 0) { + for (int i = 0; i < user_plmns->users_controlled.size; i++) { + usim_data->plmn[i].plmn = networks.items[user_plmns->users_controlled.items[i]].plmn; + } + } + + // List of operator controlled PLMN selector with Access Technology + + for (int i = 0; i < USIM_OPLMN_MAX; i++) { + memset(&usim_data->oplmn[i], 0xff, sizeof(plmn_t)); + } + if (user_plmns->operators_controlled.size > 0) { + for (int i = 0; i < user_plmns->operators_controlled.size; i++) { + usim_data->oplmn[i].plmn = networks.items[user_plmns->operators_controlled.items[i]].plmn; + usim_data->oplmn[i].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN + | USIM_ACT_EUTRAN); + } + } + /* + * EPS Location Information + */ + usim_data->epsloci.guti.gummei.plmn = + networks.items[hplmn_index].plmn; + usim_data->epsloci.guti.gummei.MMEgid = DEFAULT_MME_ID; + usim_data->epsloci.guti.gummei.MMEcode = DEFAULT_MME_CODE; + usim_data->epsloci.guti.m_tmsi = DEFAULT_M_TMSI; + usim_data->epsloci.tai.plmn = usim_data->epsloci.guti.gummei.plmn; + usim_data->epsloci.tai.tac = DEFAULT_TAC; + usim_data->epsloci.status = USIM_EPSLOCI_UPDATED; + /* + * Non-Access Stratum configuration + */ + usim_data->nasconfig.NAS_SignallingPriority.type = + USIM_NAS_SIGNALLING_PRIORITY_TAG; + usim_data->nasconfig.NAS_SignallingPriority.length = 1; + usim_data->nasconfig.NAS_SignallingPriority.value[0] = 0x00; + usim_data->nasconfig.NMO_I_Behaviour.type = USIM_NMO_I_BEHAVIOUR_TAG; + usim_data->nasconfig.NMO_I_Behaviour.length = 1; + usim_data->nasconfig.NMO_I_Behaviour.value[0] = 0x00; + usim_data->nasconfig.AttachWithImsi.type = USIM_ATTACH_WITH_IMSI_TAG; + usim_data->nasconfig.AttachWithImsi.length = 1; +#if defined(START_WITH_GUTI) + usim_data->nasconfig.AttachWithImsi.value[0] = 0x00; +#else + usim_data->nasconfig.AttachWithImsi.value[0] = 0x01; +#endif + usim_data->nasconfig.MinimumPeriodicSearchTimer.type = + USIM_MINIMUM_PERIODIC_SEARCH_TIMER_TAG; + usim_data->nasconfig.MinimumPeriodicSearchTimer.length = 1; + usim_data->nasconfig.MinimumPeriodicSearchTimer.value[0] = 0x00; + usim_data->nasconfig.ExtendedAccessBarring.type = + USIM_EXTENDED_ACCESS_BARRING_TAG; + usim_data->nasconfig.ExtendedAccessBarring.length = 1; + usim_data->nasconfig.ExtendedAccessBarring.value[0] = 0x00; + usim_data->nasconfig.Timer_T3245_Behaviour.type = + USIM_TIMER_T3245_BEHAVIOUR_TAG; + usim_data->nasconfig.Timer_T3245_Behaviour.length = 1; + usim_data->nasconfig.Timer_T3245_Behaviour.value[0] = 0x00; + + /* initialize the subscriber authentication security key */ + if (hex_string_to_hex_value(usim_data->keys.usim_api_k, + u->usim_api_k, USIM_API_K_SIZE) == -1 || + hex_string_to_hex_value(usim_data->keys.opc, + u->opc, OPC_SIZE) == -1) { + fprintf(stderr, "fix your configuration file\n"); + exit(1); + } +} + +bool write_usim_data(const char *directory, int user_id, usim_data_t *usim_data){ + int rc; + char *filename = make_filename(directory, USIM_API_NVRAM_FILENAME, user_id); + rc = usim_api_write(filename, usim_data); + free(filename); + return rc; +} + + diff --git a/openair3/NAS/TOOLS/conf_usim.h b/openair3/NAS/TOOLS/conf_usim.h new file mode 100644 index 0000000000..4768a6d8c0 --- /dev/null +++ b/openair3/NAS/TOOLS/conf_usim.h @@ -0,0 +1,48 @@ +#ifndef _CONF_USIM_H +#define _CONF_USIM_H + +#include +#include "usim_api.h" +#include "conf_user_plmn.h" + +#define SIM "SIM" +#define MSIN "MSIN" +#define USIM_API_K "USIM_API_K" +#define OPC "OPC" +#define MSISDN "MSISDN" + +#define KSI USIM_KSI_NOT_AVAILABLE +#define KSI_ASME USIM_KSI_NOT_AVAILABLE + +#define OPC_SIZE 16 + +#define DEFAULT_TMSI 0x0000000D +#define DEFAULT_P_TMSI 0x0000000D +#define DEFAULT_M_TMSI 0x0000000D + +#define DEFAULT_RAC 0x01 +#define DEFAULT_TAC 0x0001 +#define DEFAULT_LAC 0xFFFE + +#define DEFAULT_MME_ID 0x0102 +#define DEFAULT_MME_CODE 0x0F + +// TODO add this setting in configuration file +#define INT_ALGO USIM_INT_EIA2 +#define ENC_ALGO USIM_ENC_EEA0 +#define SECURITY_ALGORITHMS (ENC_ALGO | INT_ALGO) + +typedef struct { + const char *msin; + const char *usim_api_k; + const char *msisdn; + const char *opc; + const char *hplmn; +} usim_data_conf_t; + +bool parse_ue_sim_param(config_setting_t *ue_setting, int user_id, usim_data_conf_t *u); +bool write_usim_data(const char *directory, int user_id, usim_data_t *usim_data); +void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data, + const user_plmns_t *user_plmns, const networks_t networks); + +#endif diff --git a/openair3/NAS/TOOLS/display.c b/openair3/NAS/TOOLS/display.c new file mode 100644 index 0000000000..363fae76b8 --- /dev/null +++ b/openair3/NAS/TOOLS/display.c @@ -0,0 +1,380 @@ +#include +#include + +#include "userDef.h" +#include "usim_api.h" +#include "emmData.h" +#include "display.h" +#include "memory.h" +#include "fs.h" + +#define PRINT_PLMN_DIGIT(d) if ((d) != 0xf) printf("%u", (d)) + +#define PRINT_PLMN(plmn) \ + PRINT_PLMN_DIGIT((plmn).MCCdigit1); \ + PRINT_PLMN_DIGIT((plmn).MCCdigit2); \ + PRINT_PLMN_DIGIT((plmn).MCCdigit3); \ + PRINT_PLMN_DIGIT((plmn).MNCdigit1); \ + PRINT_PLMN_DIGIT((plmn).MNCdigit2); \ + PRINT_PLMN_DIGIT((plmn).MNCdigit3) + +#define PRINT_PLMN_DIGIT(d) if ((d) != 0xf) printf("%u", (d)) + +#define PRINT_PLMN(plmn) \ + PRINT_PLMN_DIGIT((plmn).MCCdigit1); \ + PRINT_PLMN_DIGIT((plmn).MCCdigit2); \ + PRINT_PLMN_DIGIT((plmn).MCCdigit3); \ + PRINT_PLMN_DIGIT((plmn).MNCdigit1); \ + PRINT_PLMN_DIGIT((plmn).MNCdigit2); \ + PRINT_PLMN_DIGIT((plmn).MNCdigit3) + +// return number of files displayed +int display_data_from_directory(const char *directory, int flags) { + int user_id = 0; + char *filename; + bool found = true; + int displayed_count = 0; + + while ( found ) { + found = false; + + if ( flags & DISPLAY_UEDATA ) { + filename = get_ue_filename(directory, user_id); + if ( file_exist_and_is_readable(filename) ) { + display_ue_data(filename); + displayed_count += 1; + found = true; + printf("UE identity data file: %s\n", filename); + } + free(filename); + } + + if ( flags & DISPLAY_EMM ) { + filename = get_emm_filename(directory, user_id); + if ( file_exist_and_is_readable(filename) ) { + display_emm_data(filename); + displayed_count += 1; + found = true; + printf("EPS Mobility Management data file: %s\n", filename); + } + free(filename); + } + + if ( flags & DISPLAY_USIM ) { + filename = get_usim_filename(directory, user_id); + if ( file_exist_and_is_readable(filename) ) { + display_usim_data(filename); + displayed_count += 1; + found = true; + printf("USIM data file: %s\n", filename); + } + free(filename); + } + + user_id += 1; + } + return displayed_count; +} + +void display_ue_data(const char *filename) { + user_nvdata_t data; + int rc; + /* + * Read UE's non-volatile data + */ + memset(&data, 0, sizeof(user_nvdata_t)); + rc = memory_read(filename, &data, sizeof(user_nvdata_t)); + + if (rc != RETURNok) { + perror("ERROR\t: memory_read() failed"); + exit(false); + } + + /* + * Display UE's non-volatile data + */ + printf("\nUE's non-volatile data:\n\n"); + printf("IMEI\t\t= %s\n", data.IMEI); + printf("manufacturer\t= %s\n", data.manufacturer); + printf("model\t\t= %s\n", data.model); + printf("PIN\t\t= %s\n", data.PIN); +} + +/* + * Displays UE's non-volatile EMM data + */ +void display_emm_data(const char *filename) { + + int rc; + emm_nvdata_t data; + + /* + * Read EMM non-volatile data + */ + memset(&data, 0, sizeof(emm_nvdata_t)); + rc = memory_read(filename, &data, sizeof(emm_nvdata_t)); + if (rc != RETURNok) { + perror("ERROR\t: memory_read() failed "); + exit(false); + } + + /* + * Display EMM non-volatile data + */ + printf("\nEMM non-volatile data:\n\n"); + + printf("IMSI\t\t= "); + + if (data.imsi.u.num.digit6 == 0b1111) { + if (data.imsi.u.num.digit15 == 0b1111) { + printf("%u%u%u.%u%u.%u%u%u%u%u%u%u%u\n", data.imsi.u.num.digit1, + data.imsi.u.num.digit2, data.imsi.u.num.digit3, + data.imsi.u.num.digit4, data.imsi.u.num.digit5, + + data.imsi.u.num.digit7, data.imsi.u.num.digit8, + data.imsi.u.num.digit9, data.imsi.u.num.digit10, + data.imsi.u.num.digit11, data.imsi.u.num.digit12, + data.imsi.u.num.digit13, data.imsi.u.num.digit14); + } else { + printf("%u%u%u.%u%u.%u%u%u%u%u%u%u%u%u\n", data.imsi.u.num.digit1, + data.imsi.u.num.digit2, data.imsi.u.num.digit3, + data.imsi.u.num.digit4, data.imsi.u.num.digit5, + + data.imsi.u.num.digit7, data.imsi.u.num.digit8, + data.imsi.u.num.digit9, data.imsi.u.num.digit10, + data.imsi.u.num.digit11, data.imsi.u.num.digit12, + data.imsi.u.num.digit13, data.imsi.u.num.digit14, + data.imsi.u.num.digit15); + } + } else { + if (data.imsi.u.num.digit15 == 0b1111) { + printf("%u%u%u.%u%u%u.%u%u%u%u%u%u%u%u\n", data.imsi.u.num.digit1, + data.imsi.u.num.digit2, data.imsi.u.num.digit3, + data.imsi.u.num.digit4, data.imsi.u.num.digit5, + data.imsi.u.num.digit6, + + data.imsi.u.num.digit7, data.imsi.u.num.digit8, + data.imsi.u.num.digit9, data.imsi.u.num.digit10, + data.imsi.u.num.digit11, data.imsi.u.num.digit12, + data.imsi.u.num.digit13, data.imsi.u.num.digit14); + } else { + printf("%u%u%u.%u%u%u.%u%u%u%u%u%u%u%u%u\n", data.imsi.u.num.digit1, + data.imsi.u.num.digit2, data.imsi.u.num.digit3, + data.imsi.u.num.digit4, data.imsi.u.num.digit5, + data.imsi.u.num.digit6, + + data.imsi.u.num.digit7, data.imsi.u.num.digit8, + data.imsi.u.num.digit9, data.imsi.u.num.digit10, + data.imsi.u.num.digit11, data.imsi.u.num.digit12, + data.imsi.u.num.digit13, data.imsi.u.num.digit14, + data.imsi.u.num.digit15); + } + } + + printf("RPLMN\t\t= "); + PRINT_PLMN(data.rplmn); + printf("\n"); + + for (int i = 0; i < data.eplmn.n_plmns; i++) { + printf("EPLMN[%d]\t= ", i); + PRINT_PLMN(data.eplmn.plmn[i]); + printf("\n"); + } +} + +void display_usim_data(const char *filename) { + + int rc; + usim_data_t data = { }; + + rc = usim_api_read(filename, &data); + + if (rc != RETURNok) { + perror("ERROR\t: usim_api_read() failed"); + exit(2); + } + + /* + * Display USIM application data + */ + printf("\nUSIM data:\n\n"); + int digits; + + printf("Administrative Data:\n"); + printf("\tUE_Operation_Mode\t= 0x%.2x\n", data.ad.UE_Operation_Mode); + printf("\tAdditional_Info\t\t= 0x%.4x\n", data.ad.Additional_Info); + printf("\tMNC_Length\t\t= %d\n\n", data.ad.MNC_Length); + + printf("IMSI:\n"); + printf("\tlength\t= %d\n", data.imsi.length); + printf("\tparity\t= %s\n", + data.imsi.u.num.parity == EVEN_PARITY ? "Even" : "Odd"); + digits = (data.imsi.length * 2) - 1 + - (data.imsi.u.num.parity == EVEN_PARITY ? 1 : 0); + printf("\tdigits\t= %d\n", digits); + printf("\tdigits\t= %u%u%u%u%u%x%u%u%u%u", + data.imsi.u.num.digit1, // MCC digit 1 + data.imsi.u.num.digit2, // MCC digit 2 + data.imsi.u.num.digit3, // MCC digit 3 + data.imsi.u.num.digit4, // MNC digit 1 + data.imsi.u.num.digit5, // MNC digit 2 + data.imsi.u.num.digit6, // MNC digit 3 + data.imsi.u.num.digit7, data.imsi.u.num.digit8, + data.imsi.u.num.digit9, data.imsi.u.num.digit10); + + if (digits >= 11) + printf("%x", data.imsi.u.num.digit11); + + if (digits >= 12) + printf("%x", data.imsi.u.num.digit12); + + if (digits >= 13) + printf("%x", data.imsi.u.num.digit13); + + if (digits >= 14) + printf("%x", data.imsi.u.num.digit14); + + if (digits >= 15) + printf("%x", data.imsi.u.num.digit15); + + printf("\n\n"); + + printf("Ciphering and Integrity Keys:\n"); + printf("\tKSI\t: 0x%.2x\n", data.keys.ksi); + char key[USIM_CK_SIZE + 1]; + key[USIM_CK_SIZE] = '\0'; + memcpy(key, data.keys.ck, USIM_CK_SIZE); + printf("\tCK\t: \"%s\"\n", key); + memcpy(key, data.keys.ik, USIM_IK_SIZE); + printf("\tIK\t: \"%s\"\n", key); + + printf("\n\tusim_api_k:"); + for (int i = 0; i < 16; i++) + printf(" %2.2x", data.keys.usim_api_k[i]); + printf("\n\topc :"); + for (int i = 0; i < 16; i++) + printf(" %2.2x", data.keys.opc[i]); + printf("\n\n"); + + printf("EPS NAS security context:\n"); + printf("\tKSIasme\t: 0x%.2x\n", data.securityctx.KSIasme.value[0]); + char kasme[USIM_K_ASME_SIZE + 1]; + kasme[USIM_K_ASME_SIZE] = '\0'; + memcpy(kasme, data.securityctx.Kasme.value, USIM_K_ASME_SIZE); + printf("\tKasme\t: \"%s\"\n", kasme); + printf("\tulNAScount\t: 0x%.8x\n", + *(uint32_t*) data.securityctx.ulNAScount.value); + printf("\tdlNAScount\t: 0x%.8x\n", + *(uint32_t*) data.securityctx.dlNAScount.value); + printf("\talgorithmID\t: 0x%.2x\n\n", + data.securityctx.algorithmID.value[0]); + + printf("MSISDN\t= %u%u%u %u%u%u%u %u%u%u%u\n\n", + data.msisdn.number.digit[0].msb, data.msisdn.number.digit[0].lsb, + data.msisdn.number.digit[1].msb, data.msisdn.number.digit[1].lsb, + data.msisdn.number.digit[2].msb, data.msisdn.number.digit[2].lsb, + data.msisdn.number.digit[3].msb, data.msisdn.number.digit[3].lsb, + data.msisdn.number.digit[4].msb, data.msisdn.number.digit[4].lsb, + data.msisdn.number.digit[5].msb); + + for (int i = 0; i < USIM_PNN_MAX; i++) { + printf("PNN[%d]\t= {%s, %s}\n", i, data.pnn[i].fullname.value, + data.pnn[i].shortname.value); + } + + printf("\n"); + + for (int i = 0; i < USIM_OPL_MAX; i++) { + printf("OPL[%d]\t= ", i); + PRINT_PLMN(data.opl[i].plmn); + printf(", TAC = [%.4x - %.4x], record_id = %d\n", data.opl[i].start, + data.opl[i].end, data.opl[i].record_id); + } + + printf("\n"); + + printf("HPLMN\t\t= "); + PRINT_PLMN(data.hplmn.plmn); + printf(", AcT = 0x%x\n\n", data.hplmn.AcT); + + for (int i = 0; i < USIM_FPLMN_MAX; i++) { + printf("FPLMN[%d]\t= ", i); + PRINT_PLMN(data.fplmn[i]); + printf("\n"); + } + + printf("\n"); + + for (int i = 0; i < USIM_EHPLMN_MAX; i++) { + printf("EHPLMN[%d]\t= ", i); + PRINT_PLMN(data.ehplmn[i]); + printf("\n"); + } + + printf("\n"); + + for (int i = 0; i < USIM_PLMN_MAX; i++) { + printf("PLMN[%d]\t\t= ", i); + PRINT_PLMN(data.plmn[i].plmn); + printf(", AcTPLMN = 0x%x", data.plmn[i].AcT); + printf("\n"); + } + + printf("\n"); + + for (int i = 0; i < USIM_OPLMN_MAX; i++) { + printf("OPLMN[%d]\t= ", i); + PRINT_PLMN(data.oplmn[i].plmn); + printf(", AcTPLMN = 0x%x", data.oplmn[i].AcT); + printf("\n"); + } + + printf("\n"); + + printf("HPPLMN\t\t= 0x%.2x (%d minutes)\n\n", data.hpplmn, data.hpplmn); + + printf("LOCI:\n"); + printf("\tTMSI = 0x%.4x\n", data.loci.tmsi); + printf("\tLAI\t: PLMN = "); + PRINT_PLMN(data.loci.lai.plmn); + printf(", LAC = 0x%.2x\n", data.loci.lai.lac); + printf("\tstatus\t= %d\n\n", data.loci.status); + + printf("PSLOCI:\n"); + printf("\tP-TMSI = 0x%.4x\n", data.psloci.p_tmsi); + printf("\tsignature = 0x%x 0x%x 0x%x\n", data.psloci.signature[0], + data.psloci.signature[1], data.psloci.signature[2]); + printf("\tRAI\t: PLMN = "); + PRINT_PLMN(data.psloci.rai.plmn); + printf(", LAC = 0x%.2x, RAC = 0x%.1x\n", data.psloci.rai.lac, + data.psloci.rai.rac); + printf("\tstatus\t= %d\n\n", data.psloci.status); + + printf("EPSLOCI:\n"); + printf("\tGUTI\t: GUMMEI\t: (PLMN = "); + PRINT_PLMN(data.epsloci.guti.gummei.plmn); + printf(", MMEgid = 0x%.2x, MMEcode = 0x%.1x)", + data.epsloci.guti.gummei.MMEgid, data.epsloci.guti.gummei.MMEcode); + printf(", M-TMSI = 0x%.4x\n", data.epsloci.guti.m_tmsi); + printf("\tTAI\t: PLMN = "); + PRINT_PLMN(data.epsloci.tai.plmn); + printf(", TAC = 0x%.2x\n", data.epsloci.tai.tac); + printf("\tstatus\t= %d\n\n", data.epsloci.status); + + printf("NASCONFIG:\n"); + printf("\tNAS_SignallingPriority\t\t: 0x%.2x\n", + data.nasconfig.NAS_SignallingPriority.value[0]); + printf("\tNMO_I_Behaviour\t\t\t: 0x%.2x\n", + data.nasconfig.NMO_I_Behaviour.value[0]); + printf("\tAttachWithImsi\t\t\t: 0x%.2x\n", + data.nasconfig.AttachWithImsi.value[0]); + printf("\tMinimumPeriodicSearchTimer\t: 0x%.2x\n", + data.nasconfig.MinimumPeriodicSearchTimer.value[0]); + printf("\tExtendedAccessBarring\t\t: 0x%.2x\n", + data.nasconfig.ExtendedAccessBarring.value[0]); + printf("\tTimer_T3245_Behaviour\t\t: 0x%.2x\n", + data.nasconfig.Timer_T3245_Behaviour.value[0]); + +} + + diff --git a/openair3/NAS/TOOLS/display.h b/openair3/NAS/TOOLS/display.h new file mode 100644 index 0000000000..fef721c490 --- /dev/null +++ b/openair3/NAS/TOOLS/display.h @@ -0,0 +1,16 @@ +#ifndef _DISPLAY_H +#define _DISPLAY_H + +#define DISPLAY_EMM 1 +#define DISPLAY_USIM 2 +#define DISPLAY_UEDATA 4 +#define DISPLAY_ALL 7 + +// return number of files displayed +int display_data_from_directory(const char *directory, int flags); + +void display_ue_data(const char *filename); +void display_emm_data(const char *filename); +void display_usim_data(const char *filename); + +#endif diff --git a/openair3/NAS/TOOLS/fs.c b/openair3/NAS/TOOLS/fs.c new file mode 100644 index 0000000000..c25f10a1e7 --- /dev/null +++ b/openair3/NAS/TOOLS/fs.c @@ -0,0 +1,52 @@ +#include +#include +#include + +#include "fs.h" +#include "user_api.h" +#include "utils.h" + +bool file_exist_and_is_readable(const char *filename) { + FILE *file ; + file = fopen(filename, "r"); + if ( file == NULL ) + return false; + fclose(file); + return true; +} + +char *get_ue_filename(const char *output_dir, int user_id) { + return make_filename(output_dir, USER_NVRAM_FILENAME, user_id); +} + +char *get_emm_filename(const char *output_dir, int user_id) { + return make_filename(output_dir, EMM_NVRAM_FILENAME, user_id); +} + +char *get_usim_filename(const char *output_dir, int user_id) { + return make_filename(output_dir, USIM_API_NVRAM_FILENAME, user_id); +} + +char *make_filename(const char *output_dir, const char *filename, int ueid) { + size_t size; + char *str_ueid, *str; + + str_ueid = itoa(ueid); + + if (str_ueid == NULL) { + perror("ERROR\t: itoa() failed"); + exit(EXIT_FAILURE); + } + + size = strlen(output_dir)+strlen(filename) + sizeof(ueid) + 1 + 1; // for \0 and for '/' + str = malloc(size); + if (str == NULL) { + perror("ERROR\t: make_filename() failed"); + exit(EXIT_FAILURE); + } + + snprintf(str, size, "%s/%s%s",output_dir, filename, str_ueid); + free(str_ueid); + + return str; +} diff --git a/openair3/NAS/TOOLS/fs.h b/openair3/NAS/TOOLS/fs.h new file mode 100644 index 0000000000..ecfca55955 --- /dev/null +++ b/openair3/NAS/TOOLS/fs.h @@ -0,0 +1,12 @@ +#ifndef _FS_H +#define _FS_H + +#include + +bool file_exist_and_is_readable(const char *filename); +char *get_ue_filename(const char *output_dir, int user_id); +char *get_emm_filename(const char *output_dir, int user_id); +char *get_usim_filename(const char *output_dir, int user_id); +char *make_filename(const char *output_dir, const char *filename, int ueid); + +#endif diff --git a/openair3/NAS/TOOLS/network.h b/openair3/NAS/TOOLS/network.h index b2c7977d2d..cde82f4560 100644 --- a/openair3/NAS/TOOLS/network.h +++ b/openair3/NAS/TOOLS/network.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source network.h @@ -68,7 +61,7 @@ Description Defines a list of PLMN network operators #define VDF5 11 -#define SELECTED_PLMN OAI_LTEBOX //SFR1 +#define SELECTED_PLMN TEST1 //SFR1 #define TEST_PLMN {0,0,0x0f,1,1,0} // 00101 #define SFR_PLMN_1 {0,2,0x0f,8,0,1} // 20810 diff --git a/openair3/NAS/TOOLS/nvram.c b/openair3/NAS/TOOLS/nvram.c new file mode 100644 index 0000000000..80d8b34893 --- /dev/null +++ b/openair3/NAS/TOOLS/nvram.c @@ -0,0 +1,162 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/***************************************************************************** +Source usim_data.c + +Version 0.1 + +Date 2012/10/31 + +Product NVRAM data generator + +Subsystem NVRAM data generator main process + +Author Frederic Maurel + +Description Implements the utility used to generate data stored in the + NVRAM application + + *****************************************************************************/ + +#include +#include +#include +#include + +#include "conf_parser.h" +#include "display.h" + +#define DEFAULT_NAS_PATH "PWD" +#define OUTPUT_DIR_ENV "NVRAM_DIR" +void _display_usage(const char* command); + +int main (int argc, char * const argv[]) +{ + enum usim_command { + NVRAM_COMMAND_NONE, + NVRAM_COMMAND_PRINT, + NVRAM_COMMAND_GEN, + } command = NVRAM_COMMAND_NONE; + + char *output_dir = NULL; + char *conf_file = NULL; + const char options[]="gpc:o:h"; + const struct option options_long_option[] = { + {"gen", no_argument, NULL, 'g'}, + {"print", no_argument, NULL, 'p'}, + {"conf", required_argument, NULL, 'c'}, + {"output", required_argument, NULL, 'o'}, + {"help", no_argument, NULL, 'h'}, + {NULL, 0, NULL, 0} + }; + int option_index; + char option_short; + + /* + * Read command line parameters + */ + while ( true ) { + option_short = getopt_long(argc, argv, options, options_long_option, &option_index ); + + if ( option_short == -1 ) + break; + + switch (option_short) { + case 'c': + conf_file = optarg; + break; + case 'g': + command = NVRAM_COMMAND_GEN; + break; + case 'p': + command = NVRAM_COMMAND_PRINT; + break; + case 'o': + output_dir = optarg; + break; + default: + break; + } + } + + if ( command == NVRAM_COMMAND_NONE ) { + _display_usage(argv[0]); + exit(EXIT_SUCCESS); + } + + /* compute default data directory if no output_dir is given */ + if ( output_dir == NULL ) { + output_dir = getenv(OUTPUT_DIR_ENV); + + if (output_dir == NULL) { + output_dir = getenv(DEFAULT_NAS_PATH); + } + + if (output_dir == NULL) { + fprintf(stderr, "%s and %s environment variables are not defined trying local directory", + OUTPUT_DIR_ENV, DEFAULT_NAS_PATH); + output_dir = "."; + } + } + + if ( command == NVRAM_COMMAND_GEN ) { + if ( conf_file == NULL ) { + printf("No Configuration file is given\n"); + _display_usage(argv[0]); + exit(EXIT_FAILURE); + } + + if ( parse_config_file(output_dir, conf_file, OUTPUT_UEDATA|OUTPUT_EMM) == false ) { + exit(EXIT_FAILURE); + } + } + + if ( display_data_from_directory(output_dir, DISPLAY_UEDATA|DISPLAY_EMM) == 0) { + fprintf(stderr, "No NVRAM files found in %s\n", output_dir); + } + + exit(EXIT_SUCCESS); +} + +/****************************************************************************/ +/********************* L O C A L F U N C T I O N S *********************/ +/****************************************************************************/ + +/* + * Displays command line usage + */ +void _display_usage(const char* command) +{ + fprintf(stderr, "usage: %s [OPTION]\n", command); + fprintf(stderr, "\t[--gen|-g]\tGenerate the NVRAM data file\n"); + fprintf(stderr, "\t[--print|-p]\tDisplay the content of the NVRAM data file\n"); + fprintf(stderr, "\t[-c]\tConfig file to use\n"); + fprintf(stderr, "\t[-o]\toutput file directory\n"); + fprintf(stderr, "\t[--help|-h]\tDisplay this usage\n"); + const char* path = getenv("NVRAM_DIR"); + + if (path != NULL) { + fprintf(stderr, "NVRAM_DIR = %s\n", path); + } else { + fprintf(stderr, "NVRAM_DIR environment variable is not defined\n"); + } +} diff --git a/openair3/NAS/TOOLS/ue_bcom_test.conf b/openair3/NAS/TOOLS/ue_bcom_test.conf new file mode 100644 index 0000000000..c60b628941 --- /dev/null +++ b/openair3/NAS/TOOLS/ue_bcom_test.conf @@ -0,0 +1,2334 @@ +PLMN: +{ + PLMN0: + { + FULLNAME="B<>COM Cubiq"; + SHORTNAME="BCOM"; + MNC="89"; + MCC="208"; + }; +}; + +UE0: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000000"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000000"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE1: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000001"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000001"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE2: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000002"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000002"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE3: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000003"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000003"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE4: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000004"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000004"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE5: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000005"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000005"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE6: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000006"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000006"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE7: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000007"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000007"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE8: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000008"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000008"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE9: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000009"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000009"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE10: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000010"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000010"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE11: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000011"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000011"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE12: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000012"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000012"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE13: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000013"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000013"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE14: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000014"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000014"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE15: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000015"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000015"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE16: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000016"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000016"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE17: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000017"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000017"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE18: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000018"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000018"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE19: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000019"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000019"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE20: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000020"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000020"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE21: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000021"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000021"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE22: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000022"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000022"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE23: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000023"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000023"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE24: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000024"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000024"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE25: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000025"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000025"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE26: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000026"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000026"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE27: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000027"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000027"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE28: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000028"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000028"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE29: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000029"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000029"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE30: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000030"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000030"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE31: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000031"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000031"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE32: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000032"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000032"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE33: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000033"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000033"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE34: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000034"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000034"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE35: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000035"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000035"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE36: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000036"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000036"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE37: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000037"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000037"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE38: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000038"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000038"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE39: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000039"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000039"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE40: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000040"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000040"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE41: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000041"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000041"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE42: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000042"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000042"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE43: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000043"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000043"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE44: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000044"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000044"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE45: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000045"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000045"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE46: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000046"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000046"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE47: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000047"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000047"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE48: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000048"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000048"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE49: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000049"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000049"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE50: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000050"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000050"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE51: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000051"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000051"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE52: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000052"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000052"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE53: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000053"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000053"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE54: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000054"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000054"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE55: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000055"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000055"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE56: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000056"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000056"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE57: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000057"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000057"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE58: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000058"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000058"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE59: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000059"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000059"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE60: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000060"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000060"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE61: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000061"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000061"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE62: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000062"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000062"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE63: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000063"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000063"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE64: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000064"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000064"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE65: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000065"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000065"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE66: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000066"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000066"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE67: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000067"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000067"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE68: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000068"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000068"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE69: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000069"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000069"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE70: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000070"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000070"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE71: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000071"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000071"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE72: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000072"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000072"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE73: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000073"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000073"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE74: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000074"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000074"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE75: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000075"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000075"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE76: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000076"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000076"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE77: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000077"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000077"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE78: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000078"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000078"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE79: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000079"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000079"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE80: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000080"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000080"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE81: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000081"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000081"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE82: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000082"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000082"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE83: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000083"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000083"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE84: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000084"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000084"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE85: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000085"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000085"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE86: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000086"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000086"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE87: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000087"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000087"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE88: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000088"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000088"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE89: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000089"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000089"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE90: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000090"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000090"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE91: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000091"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000091"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE92: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000092"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000092"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE93: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000093"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000093"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE94: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000094"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000094"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE95: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000095"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000095"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE96: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000096"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000096"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE97: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000097"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000097"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE98: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000098"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000098"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE99: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000099"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000099"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; +UE100: +{ +USER: + { + IMEI="35609204079299"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; +SIM: + { + MSIN="1000000100"; + USIM_API_K="00112233445566778899AABBCCDDEEFF"; + OPC="21C6FD3F84AA71BAC34FA8FCA0EAC64F"; + MSISDN="33600000100"; + }; +HPLMN= "20889"; +UCPLMN_LIST=(); +OPLMN_LIST=("20889"); +OCPLMN_LIST = (); +FPLMN_LIST = (); +EHPLMN_LIST= (); +}; diff --git a/openair3/NAS/TOOLS/ue_data.c b/openair3/NAS/TOOLS/ue_data.c deleted file mode 100644 index e99cb9b84c..0000000000 --- a/openair3/NAS/TOOLS/ue_data.c +++ /dev/null @@ -1,543 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source ue_data.c - -Version 0.1 - -Date 2012/11/02 - -Product UE data generator - -Subsystem UE data generator main process - -Author Frederic Maurel - -Description Implements the utility used to generate data stored in the - UE's non-volatile memory device - -*****************************************************************************/ - -#include "userDef.h" -#include "memory.h" - -#include "emmData.h" -#include "network.h" - -#include // perror, printf, fprintf, snprintf -#include // exit, free -#include // memset, strncpy - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -#define USER_IMEI "35611302209414" -#define USER_MANUFACTURER "EURECOM" -#define USER_MODEL "LTE Android PC" -//#define USER_MANUFACTURER "SAGEM" -//#define USER_MODEL "my225x" -#define USER_PIN "0000" - -#define PRINT_PLMN_DIGIT(d) if ((d) != 0xf) printf("%u", (d)) - -#define PRINT_PLMN(plmn) \ - PRINT_PLMN_DIGIT((plmn).MCCdigit1); \ - PRINT_PLMN_DIGIT((plmn).MCCdigit2); \ - PRINT_PLMN_DIGIT((plmn).MCCdigit3); \ - PRINT_PLMN_DIGIT((plmn).MNCdigit1); \ - PRINT_PLMN_DIGIT((plmn).MNCdigit2); \ - PRINT_PLMN_DIGIT((plmn).MNCdigit3) - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -static void _display_usage(const char* command); - -static void _gen_user_data(user_nvdata_t* data); -static void _gen_emm_data(emm_nvdata_t* data); - -static int _luhn(const char* cc); -static void _display_ue_data(const user_nvdata_t* data); -static void _display_emm_data(const emm_nvdata_t* data); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -int main (int argc, const char* argv[]) -{ - int rc; - char* path; - user_nvdata_t user_data; - emm_nvdata_t emm_data; - - unsigned char gen_data; - - /* - * ---------------------------- - * Read command line parameters - * ---------------------------- - */ - if (argc != 2) { - fprintf(stderr, "Invalid parameter\n"); - _display_usage(argv[0]); - exit(EXIT_FAILURE); - } else if ( (strcmp(argv[1], "--gen") == 0) || - (strcmp(argv[1], "-g") == 0) ) { - /* Generate UE data files */ - gen_data = TRUE; - } else if ( (strcmp(argv[1], "--print") == 0) || - (strcmp(argv[1], "-p") == 0) ) { - /* Display content of UE data files */ - gen_data = FALSE; - } else { - /* Display usage */ - _display_usage(argv[0]); - exit(EXIT_SUCCESS); - } - /* - * ---------------------- - * UE's non-volatile data - * ---------------------- - */ - path = memory_get_path(USER_NVRAM_DIRNAME, USER_NVRAM_FILENAME); - - if (path == NULL) { - perror("ERROR\t: memory_get_path() failed"); - exit(EXIT_FAILURE); - } - - if (gen_data) { - /* - * Initialize UE's non-volatile data - */ - memset(&user_data, 0, sizeof(user_nvdata_t)); - _gen_user_data(&user_data); - /* - * Write UE's non-volatile data - */ - rc = memory_write(path, &user_data, sizeof(user_nvdata_t)); - - if (rc != RETURNok) { - perror("ERROR\t: memory_write() failed"); - free(path); - exit(EXIT_FAILURE); - } - } - - /* - * Read UE's non-volatile data - */ - memset(&user_data, 0, sizeof(user_nvdata_t)); - rc = memory_read(path, &user_data, sizeof(user_nvdata_t)); - - if (rc != RETURNok) { - perror("ERROR\t: memory_read() failed"); - free(path); - exit(EXIT_FAILURE); - } - - free(path); - /* - * Display UE's non-volatile data - */ - printf("\nUE's non-volatile data:\n\n"); - _display_ue_data(&user_data); - - /* - * --------------------- - * EMM non-volatile data - * --------------------- - */ - path = memory_get_path(EMM_NVRAM_DIRNAME, EMM_NVRAM_FILENAME); - - if (path == NULL) { - perror("ERROR\t: memory_get_path() failed"); - exit(EXIT_FAILURE); - } - - if (gen_data) { - /* - * Initialize EMM non-volatile data - */ - memset(&emm_data, 0, sizeof(emm_nvdata_t)); - _gen_emm_data(&emm_data); - /* - * Write EMM non-volatile data - */ - rc = memory_write(path, &emm_data, sizeof(emm_nvdata_t)); - - if (rc != RETURNok) { - perror("ERROR\t: memory_write() failed"); - free(path); - exit(EXIT_FAILURE); - } - } - - /* - * Read EMM non-volatile data - */ - memset(&emm_data, 0, sizeof(emm_nvdata_t)); - rc = memory_read(path, &emm_data, sizeof(emm_nvdata_t)); - - if (rc != RETURNok) { - perror("ERROR\t: memory_read() failed "); - free(path); - exit(EXIT_FAILURE); - } - - free(path); - /* - * Display EMM non-volatile data - */ - printf("\nEMM non-volatile data:\n\n"); - _display_emm_data(&emm_data); - - /* - *--------------- - * Files location - *--------------- - */ - path = memory_get_path(USER_NVRAM_DIRNAME, USER_NVRAM_FILENAME); - printf("\nUE identity data file: %s\n", path); - free(path); - path = memory_get_path(EMM_NVRAM_DIRNAME, EMM_NVRAM_FILENAME); - printf("EPS Mobility Management data file: %s\n", path); - free(path); - - exit(EXIT_SUCCESS); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/* - * Displays command line usage - */ -static void _display_usage(const char* command) -{ - fprintf(stderr, "usage: %s [OPTION]\n", command); - fprintf(stderr, "\t[--gen|-g]\tGenerate the UE data files\n"); - fprintf(stderr, "\t[--print|-p]\tDisplay the content of the UE data files\n"); - fprintf(stderr, "\t[--help|-h]\tDisplay this usage\n"); - const char* path = getenv("NVRAM_DIR"); - - if (path != NULL) { - fprintf(stderr, "NVRAM_DIR = %s\n", path); - } else { - fprintf(stderr, "NVRAM_DIR environment variable is not defined\n"); - } -} - -/* - * Generates UE's non-volatile data - */ -static void _gen_user_data(user_nvdata_t* data) -{ - /* - * Product Serial Number Identification - * IMEI = AA-BBBBBB-CCCCCC-D - * AA-BBBBBB: Type Allocation Code (TAC) - * CCCCCC: Serial Number - * D: Luhn check digit - */ - snprintf(data->IMEI, USER_IMEI_SIZE+1, "%s%d", - USER_IMEI, _luhn(USER_IMEI)); - /* - * Manufacturer identifier - */ - strncpy(data->manufacturer, USER_MANUFACTURER, USER_MANUFACTURER_SIZE); - /* - * Model identifier - */ - strncpy(data->model, USER_MODEL, USER_MODEL_SIZE); - /* - * SIM Personal Identification Number - */ - strncpy(data->PIN, USER_PIN, USER_PIN_SIZE); -} - -/* - * Generates UE's non-volatile EMM data - */ -static void _gen_emm_data(emm_nvdata_t* data) -{ -#if (SELECTED_PLMN == FCT1) - /* - * International Mobile Subscriber Identity - * IMSI = MCC + MNC + MSIN = 310 (USA) + 028 (UNKNOWN) + 90832150 - */ -#warning "IMSI 310.028.90832150" - data->imsi.length = 8; - data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even - data->imsi.u.num.digit1 = 3; // MCC digit 1 - data->imsi.u.num.digit2 = 1; // MCC digit 2 - data->imsi.u.num.digit3 = 0; // MCC digit 3 - data->imsi.u.num.digit4 = 0; // MNC digit 1 - data->imsi.u.num.digit5 = 2; // MNC digit 2 - data->imsi.u.num.digit6 = 8; // MNC digit 3 - data->imsi.u.num.digit7 = 9; - data->imsi.u.num.digit8 = 0; - data->imsi.u.num.digit9 = 8; - data->imsi.u.num.digit10 = 3; - data->imsi.u.num.digit11 = 2; - data->imsi.u.num.digit12 = 1; - data->imsi.u.num.digit13 = 5; - data->imsi.u.num.digit14 = 0; - data->imsi.u.num.digit15 = 0xF; - /* - * Last registered home PLMN - */ - data->rplmn.MCCdigit1 = 3; - data->rplmn.MCCdigit2 = 1; - data->rplmn.MCCdigit3 = 0; - data->rplmn.MNCdigit1 = 0; - data->rplmn.MNCdigit2 = 2; - data->rplmn.MNCdigit3 = 8; -#endif -#if (SELECTED_PLMN == SFR1) - /* - * International Mobile Subscriber Identity - * IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234 - */ - data->imsi.length = 8; - data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even - data->imsi.u.num.digit1 = 2; // MCC digit 1 - data->imsi.u.num.digit2 = 0; // MCC digit 2 - data->imsi.u.num.digit3 = 8; // MCC digit 3 - data->imsi.u.num.digit4 = 1; // MNC digit 1 - data->imsi.u.num.digit5 = 0; // MNC digit 2 - data->imsi.u.num.digit6 = 0;//0xF; // MNC digit 3 - data->imsi.u.num.digit7 = 0; - data->imsi.u.num.digit8 = 0; - data->imsi.u.num.digit9 = 0; - data->imsi.u.num.digit10 = 0; - data->imsi.u.num.digit11 = 1; - data->imsi.u.num.digit12 = 2; - data->imsi.u.num.digit13 = 3; - data->imsi.u.num.digit14 = 4; - data->imsi.u.num.digit15 = 0xF; - - data->rplmn.MCCdigit1 = 2; - data->rplmn.MCCdigit2 = 0; - data->rplmn.MCCdigit3 = 8; - data->rplmn.MNCdigit1 = 1; - data->rplmn.MNCdigit2 = 0; - data->rplmn.MNCdigit3 = 0xf; -#endif -#if (SELECTED_PLMN == OAI_LTEBOX) - /* - * International Mobile Subscriber Identity - * IMSI = MCC + MNC + MSIN = 208 (France) + 93 (OAI) + 00001110 - */ - data->imsi.length = 8; - data->imsi.u.num.parity = ODD_PARITY; // Type of identity = IMSI, even - data->imsi.u.num.digit1 = 2; // MCC digit 1 - data->imsi.u.num.digit2 = 0; // MCC digit 2 - data->imsi.u.num.digit3 = 8; // MCC digit 3 - data->imsi.u.num.digit4 = 9; // MNC digit 1 - data->imsi.u.num.digit5 = 3; // MNC digit 2 - data->imsi.u.num.digit6 = 0; // MNC digit 3 - data->imsi.u.num.digit7 = 1; - data->imsi.u.num.digit8 = 0; - data->imsi.u.num.digit9 = 0; - data->imsi.u.num.digit10 = 0; - data->imsi.u.num.digit11 = 0; - data->imsi.u.num.digit12 = 1; - data->imsi.u.num.digit13 = 1; - data->imsi.u.num.digit14 = 1; - data->imsi.u.num.digit15 = 1; - - data->rplmn.MCCdigit1 = 2; - data->rplmn.MCCdigit2 = 0; - data->rplmn.MCCdigit3 = 8; - data->rplmn.MNCdigit1 = 9; - data->rplmn.MNCdigit2 = 3; - data->rplmn.MNCdigit3 = 0xf; -#endif -#if (SELECTED_PLMN == TEST1) - /* - * International Mobile Subscriber Identity - * IMSI = MCC + MNC + MSIN = 001 + 01 + 00001234 - */ - data->imsi.length = 8; - data->imsi.u.num.parity = 0x0; // Type of identity = IMSI, even - data->imsi.u.num.digit1 = 0; // MCC digit 1 - data->imsi.u.num.digit2 = 0; // MCC digit 2 - data->imsi.u.num.digit3 = 1; // MCC digit 3 - data->imsi.u.num.digit4 = 0; // MNC digit 1 - data->imsi.u.num.digit5 = 1; // MNC digit 2 - data->imsi.u.num.digit6 = 0; - data->imsi.u.num.digit7 = 0; - data->imsi.u.num.digit8 = 0; - data->imsi.u.num.digit9 = 0; - data->imsi.u.num.digit10 = 0; - data->imsi.u.num.digit11 = 1; - data->imsi.u.num.digit12 = 2; - data->imsi.u.num.digit13 = 3; - data->imsi.u.num.digit14 = 4; - data->imsi.u.num.digit15 = 0xF; - - /* - * Last registered home PLMN - */ - data->rplmn.MCCdigit1 = 0; - data->rplmn.MCCdigit2 = 0; - data->rplmn.MCCdigit3 = 1; - data->rplmn.MNCdigit1 = 0; - data->rplmn.MNCdigit2 = 1; - data->rplmn.MNCdigit3 = 0xf; -#endif - /* - * List of Equivalent PLMNs - */ - data->eplmn.n_plmns = 0; -} - -/* - * Computes the check digit using Luhn algorithm - */ -static int _luhn(const char* cc) -{ - const int m[] = {0,2,4,6,8,1,3,5,7,9}; - int odd = 1, sum = 0; - - for (int i = strlen(cc); i--; odd = !odd) { - int digit = cc[i] - '0'; - sum += odd ? m[digit] : digit; - } - - return 10 - (sum % 10); -} - -/* - * Displays UE's non-volatile data - */ -static void _display_ue_data(const user_nvdata_t* data) -{ - printf("IMEI\t\t= %s\n", data->IMEI); - printf("manufacturer\t= %s\n", data->manufacturer); - printf("model\t\t= %s\n", data->model); - printf("PIN\t\t= %s\n", data->PIN); -} - -/* - * Displays UE's non-volatile EMM data - */ -static void _display_emm_data(const emm_nvdata_t* data) -{ - printf("IMSI\t\t= "); - - if (data->imsi.u.num.digit6 == 0b1111) { - if (data->imsi.u.num.digit15 == 0b1111) { - printf("%u%u%u.%u%u.%u%u%u%u%u%u%u%u\n", - data->imsi.u.num.digit1, - data->imsi.u.num.digit2, - data->imsi.u.num.digit3, - data->imsi.u.num.digit4, - data->imsi.u.num.digit5, - - data->imsi.u.num.digit7, - data->imsi.u.num.digit8, - data->imsi.u.num.digit9, - data->imsi.u.num.digit10, - data->imsi.u.num.digit11, - data->imsi.u.num.digit12, - data->imsi.u.num.digit13, - data->imsi.u.num.digit14); - } else { - printf("%u%u%u.%u%u.%u%u%u%u%u%u%u%u%u\n", - data->imsi.u.num.digit1, - data->imsi.u.num.digit2, - data->imsi.u.num.digit3, - data->imsi.u.num.digit4, - data->imsi.u.num.digit5, - - data->imsi.u.num.digit7, - data->imsi.u.num.digit8, - data->imsi.u.num.digit9, - data->imsi.u.num.digit10, - data->imsi.u.num.digit11, - data->imsi.u.num.digit12, - data->imsi.u.num.digit13, - data->imsi.u.num.digit14, - data->imsi.u.num.digit15); - } - } else { - if (data->imsi.u.num.digit15 == 0b1111) { - printf("%u%u%u.%u%u%u.%u%u%u%u%u%u%u%u\n", - data->imsi.u.num.digit1, - data->imsi.u.num.digit2, - data->imsi.u.num.digit3, - data->imsi.u.num.digit4, - data->imsi.u.num.digit5, - data->imsi.u.num.digit6, - - data->imsi.u.num.digit7, - data->imsi.u.num.digit8, - data->imsi.u.num.digit9, - data->imsi.u.num.digit10, - data->imsi.u.num.digit11, - data->imsi.u.num.digit12, - data->imsi.u.num.digit13, - data->imsi.u.num.digit14); - } else { - printf("%u%u%u.%u%u%u.%u%u%u%u%u%u%u%u%u\n", - data->imsi.u.num.digit1, - data->imsi.u.num.digit2, - data->imsi.u.num.digit3, - data->imsi.u.num.digit4, - data->imsi.u.num.digit5, - data->imsi.u.num.digit6, - - data->imsi.u.num.digit7, - data->imsi.u.num.digit8, - data->imsi.u.num.digit9, - data->imsi.u.num.digit10, - data->imsi.u.num.digit11, - data->imsi.u.num.digit12, - data->imsi.u.num.digit13, - data->imsi.u.num.digit14, - data->imsi.u.num.digit15); - } - } - - printf("RPLMN\t\t= "); - PRINT_PLMN(data->rplmn); - printf("\n"); - - for (int i = 0; i < data->eplmn.n_plmns; i++) { - printf("EPLMN[%d]\t= ", i); - PRINT_PLMN(data->eplmn.plmn[i]); - printf("\n"); - } -} diff --git a/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf b/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf new file mode 100644 index 0000000000..33405805a6 --- /dev/null +++ b/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf @@ -0,0 +1,114 @@ +# List of known PLMNS +PLMN: { + PLMN0: { + FULLNAME="Test network"; + SHORTNAME="OAI4G"; + MNC="01"; + MCC="001"; + + }; + PLMN1: { + FULLNAME="SFR France"; + SHORTNAME="SFR"; + MNC="10"; + MCC="208"; + + }; + PLMN2: { + FULLNAME="SFR France"; + SHORTNAME="SFR"; + MNC="11"; + MCC="208"; + }; + PLMN3: { + FULLNAME="SFR France"; + SHORTNAME="SFR"; + MNC="13"; + MCC="208"; + }; + PLMN4: { + FULLNAME="OAI LTEBOX"; + SHORTNAME="OAIALU"; + MNC="93"; + MCC="208"; + }; + PLMN5: { + FULLNAME="T-Mobile USA"; + SHORTNAME="T-Mobile"; + MNC="280"; + MCC="310"; + }; + PLMN6: { + FULLNAME="FICTITIOUS USA"; + SHORTNAME="FICTITIO"; + MNC="028"; + MCC="310"; + }; + PLMN7: { + FULLNAME="Vodafone Italia"; + SHORTNAME="VODAFONE"; + MNC="10"; + MCC="222"; + }; + PLMN8: { + FULLNAME="Vodafone Spain"; + SHORTNAME="VODAFONE"; + MNC="01"; + MCC="214"; + }; + PLMN9: { + FULLNAME="Vodafone Spain"; + SHORTNAME="VODAFONE"; + MNC="06"; + MCC="214"; + }; + PLMN10: { + FULLNAME="Vodafone Germ"; + SHORTNAME="VODAFONE"; + MNC="02"; + MCC="262"; + }; + PLMN11: { + FULLNAME="Vodafone Germ"; + SHORTNAME="VODAFONE"; + MNC="04"; + MCC="262"; + }; +}; + +UE0: +{ + USER: { + IMEI="356113022094149"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; + + SIM: { + MSIN="0100001111"; + USIM_API_K="8baf473f2f8fd09487cccbd7097c6862"; + OPC="e734f8734007d6c5ce7a0508809e7e9c"; + MSISDN="33611123456"; + }; + + # Home PLMN Selector with Access Technology + HPLMN= "20893"; + + # User controlled PLMN Selector with Access Technology + UCPLMN_LIST = (); + + # Operator PLMN List + OPLMN_LIST = ("00101", "20810", "20811", "20813", "20893", "310280", "310028"); + + # Operator controlled PLMN Selector with Access Technology + OCPLMN_LIST = ("22210", "21401", "21406", "26202", "26204"); + + # Forbidden plmns + FPLMN_LIST = (); + + # List of Equivalent HPLMNs +#TODO: UE does not connect if set, to be fixed in the UE +# EHPLMN_LIST= ("20811", "20813"); + EHPLMN_LIST= (); +}; diff --git a/openair3/NAS/TOOLS/ue_tcl_test.conf b/openair3/NAS/TOOLS/ue_tcl_test.conf new file mode 100644 index 0000000000..05db6be4d1 --- /dev/null +++ b/openair3/NAS/TOOLS/ue_tcl_test.conf @@ -0,0 +1,114 @@ +# List of known PLMNS +PLMN: { + PLMN0: { + FULLNAME="Test network"; + SHORTNAME="OAI4G"; + MNC="01"; + MCC="001"; + + }; + PLMN1: { + FULLNAME="SFR France"; + SHORTNAME="SFR"; + MNC="10"; + MCC="208"; + + }; + PLMN2: { + FULLNAME="SFR France"; + SHORTNAME="SFR"; + MNC="11"; + MCC="208"; + }; + PLMN3: { + FULLNAME="SFR France"; + SHORTNAME="SFR"; + MNC="13"; + MCC="208"; + }; + PLMN4: { + FULLNAME="OAI LTEBOX"; + SHORTNAME="OAIALU"; + MNC="93"; + MCC="208"; + }; + PLMN5: { + FULLNAME="T-Mobile USA"; + SHORTNAME="T-Mobile"; + MNC="280"; + MCC="310"; + }; + PLMN6: { + FULLNAME="FICTITIOUS USA"; + SHORTNAME="FICTITIO"; + MNC="028"; + MCC="310"; + }; + PLMN7: { + FULLNAME="Vodafone Italia"; + SHORTNAME="VODAFONE"; + MNC="10"; + MCC="222"; + }; + PLMN8: { + FULLNAME="Vodafone Spain"; + SHORTNAME="VODAFONE"; + MNC="01"; + MCC="214"; + }; + PLMN9: { + FULLNAME="Vodafone Spain"; + SHORTNAME="VODAFONE"; + MNC="06"; + MCC="214"; + }; + PLMN10: { + FULLNAME="Vodafone Germ"; + SHORTNAME="VODAFONE"; + MNC="02"; + MCC="262"; + }; + PLMN11: { + FULLNAME="Vodafone Germ"; + SHORTNAME="VODAFONE"; + MNC="04"; + MCC="262"; + }; +}; + +UE0: +{ + USER: { + IMEI="356113022094149"; + MANUFACTURER="EURECOM"; + MODEL="LTE Android PC"; + PIN="0000"; + }; + + SIM: { + MSIN="000001234"; + USIM_API_K="000102030405060708090A0B0C0D0E0F"; + OPC="C42449363BBAD02B66D16BC975D77CC1"; + MSISDN="000000000000";//"33611123456"; + }; + + # Home PLMN Selector with Access Technology + HPLMN= "00101"; + + # User controlled PLMN Selector with Access Technology + UCPLMN_LIST = (); + + # Operator PLMN List + OPLMN_LIST = ("00101", "20810", "20811", "20813", "20893", "310280", "310028"); + + # Operator controlled PLMN Selector with Access Technology + OCPLMN_LIST = ("22210", "21401", "21406", "26202", "26204"); + + # Forbidden plmns + FPLMN_LIST = (); + + # List of Equivalent HPLMNs +#TODO: UE does not connect if set, to be fixed in the UE +# EHPLMN_LIST= ("20811", "20813"); + EHPLMN_LIST= (); +}; diff --git a/openair3/NAS/TOOLS/usim.c b/openair3/NAS/TOOLS/usim.c new file mode 100644 index 0000000000..84b4cfbdf8 --- /dev/null +++ b/openair3/NAS/TOOLS/usim.c @@ -0,0 +1,162 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/***************************************************************************** +Source usim_data.c + +Version 0.1 + +Date 2012/10/31 + +Product USIM data generator + +Subsystem USIM data generator main process + +Author Frederic Maurel + +Description Implements the utility used to generate data stored in the + USIM application + + *****************************************************************************/ + +#include +#include +#include +#include + +#include "conf_parser.h" +#include "display.h" + +#define DEFAULT_NAS_PATH "PWD" +#define OUTPUT_DIR_ENV "USIM_DIR" +void _display_usage(const char* command); + +int main (int argc, char * const argv[]) +{ + enum usim_command { + USIM_COMMAND_NONE, + USIM_COMMAND_PRINT, + USIM_COMMAND_GEN, + } command = USIM_COMMAND_NONE; + + char *output_dir = NULL; + char *conf_file = NULL; + const char options[]="gpc:o:h"; + const struct option options_long_option[] = { + {"gen", no_argument, NULL, 'g'}, + {"print", no_argument, NULL, 'p'}, + {"conf", required_argument, NULL, 'c'}, + {"output", required_argument, NULL, 'o'}, + {"help", no_argument, NULL, 'h'}, + {NULL, 0, NULL, 0} + }; + int option_index; + char option_short; + + /* + * Read command line parameters + */ + while ( true ) { + option_short = getopt_long(argc, argv, options, options_long_option, &option_index ); + + if ( option_short == -1 ) + break; + + switch (option_short) { + case 'c': + conf_file = optarg; + break; + case 'g': + command = USIM_COMMAND_GEN; + break; + case 'p': + command = USIM_COMMAND_PRINT; + break; + case 'o': + output_dir = optarg; + break; + default: + break; + } + } + + if ( command == USIM_COMMAND_NONE ) { + _display_usage(argv[0]); + exit(EXIT_SUCCESS); + } + + /* compute default data directory if no output_dir is given */ + if ( output_dir == NULL ) { + output_dir = getenv(OUTPUT_DIR_ENV); + + if (output_dir == NULL) { + output_dir = getenv(DEFAULT_NAS_PATH); + } + + if (output_dir == NULL) { + fprintf(stderr, "%s and %s environment variables are not defined trying local directory", + OUTPUT_DIR_ENV, DEFAULT_NAS_PATH); + output_dir = "."; + } + } + + if ( command == USIM_COMMAND_GEN ) { + if ( conf_file == NULL ) { + printf("No Configuration file is given\n"); + _display_usage(argv[0]); + exit(EXIT_FAILURE); + } + + if ( parse_config_file(output_dir, conf_file, OUTPUT_USIM) == false ) { + exit(EXIT_FAILURE); + } + } + + if ( display_data_from_directory(output_dir, DISPLAY_USIM) == 0) { + fprintf(stderr, "No USIM files found in %s\n", output_dir); + } + + exit(EXIT_SUCCESS); +} + +/****************************************************************************/ +/********************* L O C A L F U N C T I O N S *********************/ +/****************************************************************************/ + +/* + * Displays command line usage + */ +void _display_usage(const char* command) +{ + fprintf(stderr, "usage: %s [OPTION]\n", command); + fprintf(stderr, "\t[--gen|-g]\tGenerate the USIM data file\n"); + fprintf(stderr, "\t[--print|-p]\tDisplay the content of the USIM data file\n"); + fprintf(stderr, "\t[-c]\tConfig file to use\n"); + fprintf(stderr, "\t[-o]\toutput file directory\n"); + fprintf(stderr, "\t[--help|-h]\tDisplay this usage\n"); + const char* path = getenv("USIM_DIR"); + + if (path != NULL) { + fprintf(stderr, "USIM_DIR = %s\n", path); + } else { + fprintf(stderr, "USIM_DIR environment variable is not defined\n"); + } +} diff --git a/openair3/NAS/TOOLS/usim_data.c b/openair3/NAS/TOOLS/usim_data.c deleted file mode 100644 index ffde00c268..0000000000 --- a/openair3/NAS/TOOLS/usim_data.c +++ /dev/null @@ -1,666 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ -/***************************************************************************** -Source usim_data.c - -Version 0.1 - -Date 2012/10/31 - -Product USIM data generator - -Subsystem USIM data generator main process - -Author Frederic Maurel - -Description Implements the utility used to generate data stored in the - USIM application - - *****************************************************************************/ - -#include "network.h" - -#include "usim_api.h" -#include "memory.h" -#include "network.h" - -#include // perror, printf -#include // exit -#include // memset, memcpy, strncpy - - -/****************************************************************************/ -/**************** E X T E R N A L D E F I N I T I O N S ****************/ -/****************************************************************************/ - -#define KSI USIM_KSI_NOT_AVAILABLE -#define KSI_ASME USIM_KSI_NOT_AVAILABLE -#define INT_ALGO USIM_INT_EIA2 -#define ENC_ALGO USIM_ENC_EEA0 -#define SECURITY_ALGORITHMS (ENC_ALGO | INT_ALGO) - -#define MIN_TAC 0x0000 -#define MAX_TAC 0xFFFE - -#define DEFAULT_TMSI 0x0000000D -#define DEFAULT_P_TMSI 0x0000000D -#define DEFAULT_M_TMSI 0x0000000D -#define DEFAULT_LAC 0xFFFE -#define DEFAULT_RAC 0x01 -#define DEFAULT_TAC 0x0001 - -#define DEFAULT_MME_ID 0x0102 -#define DEFAULT_MME_CODE 0x0F - -#define PRINT_PLMN_DIGIT(d) if ((d) != 0xf) printf("%u", (d)) - -#define PRINT_PLMN(plmn) \ - PRINT_PLMN_DIGIT((plmn).MCCdigit1); \ - PRINT_PLMN_DIGIT((plmn).MCCdigit2); \ - PRINT_PLMN_DIGIT((plmn).MCCdigit3); \ - PRINT_PLMN_DIGIT((plmn).MNCdigit1); \ - PRINT_PLMN_DIGIT((plmn).MNCdigit2); \ - PRINT_PLMN_DIGIT((plmn).MNCdigit3) - -/****************************************************************************/ -/******************* L O C A L D E F I N I T I O N S *******************/ -/****************************************************************************/ - -static void _display_usage(const char* command); - -static void _display_usim_data(const usim_data_t* data); - -/****************************************************************************/ -/****************** E X P O R T E D F U N C T I O N S ******************/ -/****************************************************************************/ - -int main (int argc, const char* argv[]) -{ - int rc; - usim_data_t usim_data; - - unsigned char gen_data; - - /* - * Read command line parameters - */ - if (argc != 2) { - fprintf(stderr, "Invalid parameter\n"); - _display_usage(argv[0]); - exit(EXIT_FAILURE); - } else if ( (strcmp(argv[1], "--gen") == 0) || - (strcmp(argv[1], "-g") == 0) ) { - /* Generate USIM data files */ - gen_data = TRUE; - } else if ( (strcmp(argv[1], "--print") == 0) || - (strcmp(argv[1], "-p") == 0) ) { - /* Display content of USIM data files */ - gen_data = FALSE; - } else { - /* Display usage */ - _display_usage(argv[0]); - exit(EXIT_SUCCESS); - } - - if (gen_data) { - /* - * Initialize USIM data - */ - memset(&usim_data, 0, sizeof(usim_data_t)); - -#if (SELECTED_PLMN == FCT1) - /* - * International Mobile Subscriber Identity - * IMSI = MCC + MNC + MSIN = 310 (USA) + 028 (UNKNOWN) + 90832150 - */ -#warning "IMSI 310.028.90832150" - usim_data.imsi.length = 8; - usim_data.imsi.u.num.parity = EVEN_PARITY; // Parity: even - usim_data.imsi.u.num.digit1 = 3; // MCC digit 1 - usim_data.imsi.u.num.digit2 = 1; // MCC digit 2 - usim_data.imsi.u.num.digit3 = 0; // MCC digit 3 - usim_data.imsi.u.num.digit4 = 0; // MNC digit 1 - usim_data.imsi.u.num.digit5 = 2; // MNC digit 2 - usim_data.imsi.u.num.digit6 = 8; // MNC digit 3 - usim_data.imsi.u.num.digit7 = 9; - usim_data.imsi.u.num.digit8 = 0; - usim_data.imsi.u.num.digit9 = 8; - usim_data.imsi.u.num.digit10 = 3; - usim_data.imsi.u.num.digit11 = 2; - usim_data.imsi.u.num.digit12 = 1; - usim_data.imsi.u.num.digit13 = 5; - usim_data.imsi.u.num.digit14 = 0; - usim_data.imsi.u.num.digit15 = 0b1111; -#endif -#if (SELECTED_PLMN == SFR1) - - /* - * International Mobile Subscriber Identity - * IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234 - */ -#warning "IMSI 208.10.00001234" - - usim_data.imsi.length = 8; - usim_data.imsi.u.num.parity = EVEN_PARITY; // Parity: even - usim_data.imsi.u.num.digit1 = 2; // MCC digit 1 - usim_data.imsi.u.num.digit2 = 0; // MCC digit 2 - usim_data.imsi.u.num.digit3 = 8; // MCC digit 3 - usim_data.imsi.u.num.digit4 = 1; // MNC digit 1 - usim_data.imsi.u.num.digit5 = 0; // MNC digit 2 - usim_data.imsi.u.num.digit6 = 0;//0b1111; // MNC digit 3 - usim_data.imsi.u.num.digit7 = 0; - usim_data.imsi.u.num.digit8 = 0; - usim_data.imsi.u.num.digit9 = 0; - usim_data.imsi.u.num.digit10 = 0; - usim_data.imsi.u.num.digit11 = 1; - usim_data.imsi.u.num.digit12 = 2; - usim_data.imsi.u.num.digit13 = 3; - usim_data.imsi.u.num.digit14 = 4; - usim_data.imsi.u.num.digit15 = 0b1111; -#endif -#if (SELECTED_PLMN == OAI_LTEBOX) -#warning "IMSI 208.93.00001111" - /* - * International Mobile Subscriber Identity - * IMSI = MCC + MNC + MSIN = 208 (France) + 10 (SFR) + 00001234 - */ - #warning "IMSI 208.93.0100001110" - usim_data.imsi.length = 8; - usim_data.imsi.u.num.parity = ODD_PARITY; // Parity: even - usim_data.imsi.u.num.digit1 = 2; // MCC digit 1 - usim_data.imsi.u.num.digit2 = 0; // MCC digit 2 - usim_data.imsi.u.num.digit3 = 8; // MCC digit 3 - usim_data.imsi.u.num.digit4 = 9; // MNC digit 1 - usim_data.imsi.u.num.digit5 = 3; // MNC digit 2 - usim_data.imsi.u.num.digit6 = 0; // MNC digit 3 - usim_data.imsi.u.num.digit7 = 1; - usim_data.imsi.u.num.digit8 = 0; - usim_data.imsi.u.num.digit9 = 0; - usim_data.imsi.u.num.digit10 = 0; - usim_data.imsi.u.num.digit11 = 0; - usim_data.imsi.u.num.digit12 = 1; - usim_data.imsi.u.num.digit13 = 1; - usim_data.imsi.u.num.digit14 = 1; - usim_data.imsi.u.num.digit15 = 1; -#endif -#if (SELECTED_PLMN == TEST1) -#warning "IMSI 001.01.000001234" - usim_data.imsi.length = 8; - usim_data.imsi.u.num.parity = 0x0; // Type of identity = IMSI, even - usim_data.imsi.u.num.digit1 = 0; // MCC digit 1 - usim_data.imsi.u.num.digit2 = 0; // MCC digit 2 - usim_data.imsi.u.num.digit3 = 1; // MCC digit 3 - usim_data.imsi.u.num.digit4 = 0; // MNC digit 1 - usim_data.imsi.u.num.digit5 = 1; // MNC digit 2 - usim_data.imsi.u.num.digit6 = 0; - usim_data.imsi.u.num.digit7 = 0; - usim_data.imsi.u.num.digit8 = 0; - usim_data.imsi.u.num.digit9 = 0; - usim_data.imsi.u.num.digit10 = 0; - usim_data.imsi.u.num.digit11 = 1; - usim_data.imsi.u.num.digit12 = 2; - usim_data.imsi.u.num.digit13 = 3; - usim_data.imsi.u.num.digit14 = 4; - usim_data.imsi.u.num.digit15 = 0xF; -#endif - /* - * Ciphering and Integrity Keys - */ - usim_data.keys.ksi = KSI; - memset(&usim_data.keys.ck, 0, USIM_CK_SIZE); - memset(&usim_data.keys.ik, 0, USIM_IK_SIZE); - - /* - * Higher Priority PLMN search period - */ - usim_data.hpplmn = 0x00; /* Disable timer */ - - /* - * List of Forbidden PLMNs - */ - for (int i = 0; i < USIM_FPLMN_MAX; i++) { - memset(&usim_data.fplmn[i], 0xff, sizeof(plmn_t)); - } - - /* - * Location Information - */ - usim_data.loci.tmsi = DEFAULT_TMSI; - usim_data.loci.lai.plmn = network_records[SELECTED_PLMN].plmn; - usim_data.loci.lai.lac = DEFAULT_LAC; - usim_data.loci.status = USIM_LOCI_NOT_UPDATED; - /* - * Packet Switched Location Information - */ - usim_data.psloci.p_tmsi = DEFAULT_P_TMSI; - usim_data.psloci.signature[0] = 0x01; - usim_data.psloci.signature[1] = 0x02; - usim_data.psloci.signature[2] = 0x03; - usim_data.psloci.rai.plmn = network_records[SELECTED_PLMN].plmn; - usim_data.psloci.rai.lac = DEFAULT_LAC; - usim_data.psloci.rai.rac = DEFAULT_RAC; - usim_data.psloci.status = USIM_PSLOCI_NOT_UPDATED; - /* - * Administrative Data - */ - usim_data.ad.UE_Operation_Mode = USIM_NORMAL_MODE; - usim_data.ad.Additional_Info = 0xffff; - usim_data.ad.MNC_Length = 2; - /* - * EPS NAS security context - */ - usim_data.securityctx.length = 52; - usim_data.securityctx.KSIasme.type = USIM_KSI_ASME_TAG; - usim_data.securityctx.KSIasme.length = 1; - usim_data.securityctx.KSIasme.value[0] = KSI_ASME; - usim_data.securityctx.Kasme.type = USIM_K_ASME_TAG; - usim_data.securityctx.Kasme.length = USIM_K_ASME_SIZE; - memset(usim_data.securityctx.Kasme.value, 0, - usim_data.securityctx.Kasme.length); - usim_data.securityctx.ulNAScount.type = USIM_UL_NAS_COUNT_TAG; - usim_data.securityctx.ulNAScount.length = USIM_UL_NAS_COUNT_SIZE; - memset(usim_data.securityctx.ulNAScount.value, 0, - usim_data.securityctx.ulNAScount.length); - usim_data.securityctx.dlNAScount.type = USIM_DL_NAS_COUNT_TAG; - usim_data.securityctx.dlNAScount.length = USIM_DL_NAS_COUNT_SIZE; - memset(usim_data.securityctx.dlNAScount.value, 0, - usim_data.securityctx.dlNAScount.length); - usim_data.securityctx.algorithmID.type = USIM_INT_ENC_ALGORITHMS_TAG; - usim_data.securityctx.algorithmID.length = 1; - usim_data.securityctx.algorithmID.value[0] = SECURITY_ALGORITHMS; - /* - * Subcriber's Number - */ - usim_data.msisdn.length = 7; - usim_data.msisdn.number.ext = 1; - usim_data.msisdn.number.ton = MSISDN_TON_UNKNOWKN; - usim_data.msisdn.number.npi = MSISDN_NPI_ISDN_TELEPHONY; - usim_data.msisdn.number.digit[0].msb = 3; - usim_data.msisdn.number.digit[0].lsb = 3; - usim_data.msisdn.number.digit[1].msb = 6; - usim_data.msisdn.number.digit[1].lsb = 1; - usim_data.msisdn.number.digit[2].msb = 1; - usim_data.msisdn.number.digit[2].lsb = 1; - usim_data.msisdn.number.digit[3].msb = 2; - usim_data.msisdn.number.digit[3].lsb = 3; - usim_data.msisdn.number.digit[4].msb = 4; - usim_data.msisdn.number.digit[4].lsb = 5; - usim_data.msisdn.number.digit[5].msb = 6; - usim_data.msisdn.number.digit[5].lsb = 0xf; - usim_data.msisdn.number.digit[6].msb = 0xf; - usim_data.msisdn.number.digit[6].lsb = 0xf; - usim_data.msisdn.number.digit[7].msb = 0xf; - usim_data.msisdn.number.digit[7].lsb = 0xf; - usim_data.msisdn.number.digit[8].msb = 0xf; - usim_data.msisdn.number.digit[8].lsb = 0xf; - usim_data.msisdn.number.digit[9].msb = 0xf; - usim_data.msisdn.number.digit[9].lsb = 0xf; - usim_data.msisdn.conf1_record_id = 0xff; /* Not used */ - usim_data.msisdn.ext1_record_id = 0xff; /* Not used */ - - /* - * PLMN Network Name and Operator PLMN List - */ - for (int i = TEST1; i < VDF1; i++) { - network_record_t record = network_records[i]; - usim_data.pnn[i].fullname.type = USIM_PNN_FULLNAME_TAG; - usim_data.pnn[i].fullname.length = strlen(record.fullname); - strncpy((char*)usim_data.pnn[i].fullname.value, record.fullname, - usim_data.pnn[i].fullname.length); - usim_data.pnn[i].shortname.type = USIM_PNN_SHORTNAME_TAG; - usim_data.pnn[i].shortname.length = strlen(record.shortname); - strncpy((char*)usim_data.pnn[i].shortname.value, record.shortname, - usim_data.pnn[i].shortname.length); - usim_data.opl[i].plmn = record.plmn; - usim_data.opl[i].start = record.tac_start; - usim_data.opl[i].end = record.tac_end; - usim_data.opl[i].record_id = i; - } - - for (int i = VDF2; i < USIM_OPL_MAX; i++) { - memset(&usim_data.opl[i].plmn, 0xff, sizeof(plmn_t)); - } - - /* - * List of Equivalent HPLMNs - */ - usim_data.ehplmn[0] = network_records[SFR2].plmn; - usim_data.ehplmn[1] = network_records[SFR3].plmn; - /* - * Home PLMN Selector with Access Technology - */ - usim_data.hplmn.plmn = network_records[SELECTED_PLMN].plmn; - usim_data.hplmn.AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - - /* - * List of user controlled PLMN selector with Access Technology - */ - for (int i = 0; i < USIM_PLMN_MAX; i++) { - memset(&usim_data.plmn[i], 0xff, sizeof(plmn_t)); - } - - /* - * List of operator controlled PLMN selector with Access Technology - */ - usim_data.oplmn[0].plmn = network_records[VDF1].plmn; - usim_data.oplmn[0].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - usim_data.oplmn[1].plmn = network_records[VDF2].plmn; - usim_data.oplmn[1].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - usim_data.oplmn[2].plmn = network_records[VDF3].plmn; - usim_data.oplmn[2].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - usim_data.oplmn[3].plmn = network_records[VDF4].plmn; - usim_data.oplmn[3].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - usim_data.oplmn[4].plmn = network_records[VDF5].plmn; - usim_data.oplmn[4].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN); - - for (int i = 5; i < USIM_OPLMN_MAX; i++) { - memset(&usim_data.oplmn[i], 0xff, sizeof(plmn_t)); - } - - /* - * EPS Location Information - */ - usim_data.epsloci.guti.gummei.plmn = network_records[SELECTED_PLMN].plmn; - usim_data.epsloci.guti.gummei.MMEgid = DEFAULT_MME_ID; - usim_data.epsloci.guti.gummei.MMEcode = DEFAULT_MME_CODE; - usim_data.epsloci.guti.m_tmsi = DEFAULT_M_TMSI; - usim_data.epsloci.tai.plmn = usim_data.epsloci.guti.gummei.plmn; - usim_data.epsloci.tai.tac = DEFAULT_TAC; - usim_data.epsloci.status = USIM_EPSLOCI_UPDATED; - /* - * Non-Access Stratum configuration - */ - usim_data.nasconfig.NAS_SignallingPriority.type = USIM_NAS_SIGNALLING_PRIORITY_TAG; - usim_data.nasconfig.NAS_SignallingPriority.length = 1; - usim_data.nasconfig.NAS_SignallingPriority.value[0] = 0x00; - usim_data.nasconfig.NMO_I_Behaviour.type = USIM_NMO_I_BEHAVIOUR_TAG; - usim_data.nasconfig.NMO_I_Behaviour.length = 1; - usim_data.nasconfig.NMO_I_Behaviour.value[0] = 0x00; - usim_data.nasconfig.AttachWithImsi.type = USIM_ATTACH_WITH_IMSI_TAG; - usim_data.nasconfig.AttachWithImsi.length = 1; -#if defined(START_WITH_GUTI) - usim_data.nasconfig.AttachWithImsi.value[0] = 0x00; -#else - usim_data.nasconfig.AttachWithImsi.value[0] = 0x01; -#endif - usim_data.nasconfig.MinimumPeriodicSearchTimer.type = USIM_MINIMUM_PERIODIC_SEARCH_TIMER_TAG; - usim_data.nasconfig.MinimumPeriodicSearchTimer.length = 1; - usim_data.nasconfig.MinimumPeriodicSearchTimer.value[0] = 0x00; - usim_data.nasconfig.ExtendedAccessBarring.type = USIM_EXTENDED_ACCESS_BARRING_TAG; - usim_data.nasconfig.ExtendedAccessBarring.length = 1; - usim_data.nasconfig.ExtendedAccessBarring.value[0] = 0x00; - usim_data.nasconfig.Timer_T3245_Behaviour.type = USIM_TIMER_T3245_BEHAVIOUR_TAG; - usim_data.nasconfig.Timer_T3245_Behaviour.length = 1; - usim_data.nasconfig.Timer_T3245_Behaviour.value[0] = 0x00; - - /* - * Write USIM application data - */ - rc = usim_api_write(&usim_data); - - if (rc != RETURNok) { - perror("ERROR\t: usim_api_write() failed"); - exit(EXIT_FAILURE); - } - } - - /* - * Read USIM application data - */ - memset(&usim_data, 0, sizeof(usim_data_t)); - rc = usim_api_read(&usim_data); - - if (rc != RETURNok) { - perror("ERROR\t: usim_api_read() failed"); - exit(EXIT_FAILURE); - } - - /* - * Display USIM application data - */ - printf("\nUSIM data:\n\n"); - _display_usim_data(&usim_data); - - /* - * Display USIM file location - */ - char* path = memory_get_path("USIM_DIR", ".usim.nvram"); - printf("\nUSIM data file: %s\n", path); - free(path); - - exit(EXIT_SUCCESS); -} - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/* - * Displays command line usage - */ -static void _display_usage(const char* command) -{ - fprintf(stderr, "usage: %s [OPTION]\n", command); - fprintf(stderr, "\t[--gen|-g]\tGenerate the USIM data file\n"); - fprintf(stderr, "\t[--print|-p]\tDisplay the content of the USIM data file\n"); - fprintf(stderr, "\t[--help|-h]\tDisplay this usage\n"); - const char* path = getenv("USIM_DIR"); - - if (path != NULL) { - fprintf(stderr, "USIM_DIR = %s\n", path); - } else { - fprintf(stderr, "USIM_DIR environment variable is not defined\n"); - } -} - -/* - * Displays USIM application data - */ -static void _display_usim_data(const usim_data_t* data) -{ - int digits; - - printf("Administrative Data:\n"); - printf("\tUE_Operation_Mode\t= 0x%.2x\n", data->ad.UE_Operation_Mode); - printf("\tAdditional_Info\t\t= 0x%.4x\n", data->ad.Additional_Info); - printf("\tMNC_Length\t\t= %d\n\n", data->ad.MNC_Length); - - printf("IMSI:\n"); - printf("\tlength\t= %d\n", data->imsi.length); - printf("\tparity\t= %s\n", data->imsi.u.num.parity == EVEN_PARITY ? "Even" : "Odd"); - digits = (data->imsi.length * 2) - 1 - (data->imsi.u.num.parity == EVEN_PARITY ? 1 : 0); - printf("\tdigits\t= %d\n", digits); - - printf("\tdigits\t= %u%u%u%u%u%x%u%u%u%u", - data->imsi.u.num.digit1, // MCC digit 1 - data->imsi.u.num.digit2, // MCC digit 2 - data->imsi.u.num.digit3, // MCC digit 3 - data->imsi.u.num.digit4, // MNC digit 1 - data->imsi.u.num.digit5, // MNC digit 2 - data->imsi.u.num.digit6==0xf?0:data->imsi.u.num.digit6, // MNC digit 3 - data->imsi.u.num.digit7, - data->imsi.u.num.digit8, - data->imsi.u.num.digit9, - data->imsi.u.num.digit10); - - if (digits >= 11) - printf("%x", data->imsi.u.num.digit11); - - if (digits >= 12) - printf("%x", data->imsi.u.num.digit12); - - if (digits >= 13) - printf("%x", data->imsi.u.num.digit13); - - if (digits >= 14) - printf("%x", data->imsi.u.num.digit14); - - if (digits >= 15) - printf("%x", data->imsi.u.num.digit15); - - printf("\n\n"); - - printf("Ciphering and Integrity Keys:\n"); - printf("\tKSI\t: 0x%.2x\n", data->keys.ksi); - char key[USIM_CK_SIZE + 1]; - key[USIM_CK_SIZE] = '\0'; - memcpy(key, data->keys.ck, USIM_CK_SIZE); - printf("\tCK\t: \"%s\"\n", key); - memcpy(key, data->keys.ik, USIM_IK_SIZE); - printf("\tIK\t: \"%s\"\n", key); - - printf("EPS NAS security context:\n"); - printf("\tKSIasme\t: 0x%.2x\n", data->securityctx.KSIasme.value[0]); - char kasme[USIM_K_ASME_SIZE + 1]; - kasme[USIM_K_ASME_SIZE] = '\0'; - memcpy(kasme, data->securityctx.Kasme.value, USIM_K_ASME_SIZE); - printf("\tKasme\t: \"%s\"\n", kasme); - printf("\tulNAScount\t: 0x%.8x\n", - *(uint32_t*)data->securityctx.ulNAScount.value); - printf("\tdlNAScount\t: 0x%.8x\n", - *(uint32_t*)data->securityctx.dlNAScount.value); - printf("\talgorithmID\t: 0x%.2x\n\n", - data->securityctx.algorithmID.value[0]); - - printf("MSISDN\t= %u%u%u %u%u%u%u %u%u%u%u\n\n", - data->msisdn.number.digit[0].msb, - data->msisdn.number.digit[0].lsb, - data->msisdn.number.digit[1].msb, - data->msisdn.number.digit[1].lsb, - data->msisdn.number.digit[2].msb, - data->msisdn.number.digit[2].lsb, - data->msisdn.number.digit[3].msb, - data->msisdn.number.digit[3].lsb, - data->msisdn.number.digit[4].msb, - data->msisdn.number.digit[4].lsb, - data->msisdn.number.digit[5].msb); - - for (int i = 0; i < USIM_PNN_MAX; i++) { - printf("PNN[%d]\t= {%s, %s}\n", i, - data->pnn[i].fullname.value, data->pnn[i].shortname.value); - } - - printf("\n"); - - for (int i = 0; i < USIM_OPL_MAX; i++) { - printf("OPL[%d]\t= ", i); - PRINT_PLMN(data->opl[i].plmn); - printf(", TAC = [%.4x - %.4x], record_id = %d\n", - data->opl[i].start, data->opl[i].end, data->opl[i].record_id); - } - - printf("\n"); - - printf("HPLMN\t\t= "); - PRINT_PLMN(data->hplmn.plmn); - printf(", AcT = 0x%x\n\n", data->hplmn.AcT); - - for (int i = 0; i < USIM_FPLMN_MAX; i++) { - printf("FPLMN[%d]\t= ", i); - PRINT_PLMN(data->fplmn[i]); - printf("\n"); - } - - printf("\n"); - - for (int i = 0; i < USIM_EHPLMN_MAX; i++) { - printf("EHPLMN[%d]\t= ", i); - PRINT_PLMN(data->ehplmn[i]); - printf("\n"); - } - - printf("\n"); - - for (int i = 0; i < USIM_PLMN_MAX; i++) { - printf("PLMN[%d]\t\t= ", i); - PRINT_PLMN(data->plmn[i].plmn); - printf(", AcTPLMN = 0x%x", data->plmn[i].AcT); - printf("\n"); - } - - printf("\n"); - - for (int i = 0; i < USIM_OPLMN_MAX; i++) { - printf("OPLMN[%d]\t= ", i); - PRINT_PLMN(data->oplmn[i].plmn); - printf(", AcTPLMN = 0x%x", data->oplmn[i].AcT); - printf("\n"); - } - - printf("\n"); - - printf("HPPLMN\t\t= 0x%.2x (%d minutes)\n\n", data->hpplmn, data->hpplmn); - - printf("LOCI:\n"); - printf("\tTMSI = 0x%.4x\n", data->loci.tmsi); - printf("\tLAI\t: PLMN = "); - PRINT_PLMN(data->loci.lai.plmn); - printf(", LAC = 0x%.2x\n", data->loci.lai.lac); - printf("\tstatus\t= %d\n\n", data->loci.status); - - printf("PSLOCI:\n"); - printf("\tP-TMSI = 0x%.4x\n", data->psloci.p_tmsi); - printf("\tsignature = 0x%x 0x%x 0x%x\n", - data->psloci.signature[0], - data->psloci.signature[1], - data->psloci.signature[2]); - printf("\tRAI\t: PLMN = "); - PRINT_PLMN(data->psloci.rai.plmn); - printf(", LAC = 0x%.2x, RAC = 0x%.1x\n", - data->psloci.rai.lac, data->psloci.rai.rac); - printf("\tstatus\t= %d\n\n", data->psloci.status); - - printf("EPSLOCI:\n"); - printf("\tGUTI\t: GUMMEI\t: (PLMN = "); - PRINT_PLMN(data->epsloci.guti.gummei.plmn); - printf(", MMEgid = 0x%.2x, MMEcode = 0x%.1x)", - data->epsloci.guti.gummei.MMEgid, - data->epsloci.guti.gummei.MMEcode); - printf(", M-TMSI = 0x%.4x\n", data->epsloci.guti.m_tmsi); - printf("\tTAI\t: PLMN = "); - PRINT_PLMN(data->epsloci.tai.plmn); - printf(", TAC = 0x%.2x\n", - data->epsloci.tai.tac); - printf("\tstatus\t= %d\n\n", data->epsloci.status); - - printf("NASCONFIG:\n"); - printf("\tNAS_SignallingPriority\t\t: 0x%.2x\n", - data->nasconfig.NAS_SignallingPriority.value[0]); - printf("\tNMO_I_Behaviour\t\t\t: 0x%.2x\n", - data->nasconfig.NMO_I_Behaviour.value[0]); - printf("\tAttachWithImsi\t\t\t: 0x%.2x\n", - data->nasconfig.AttachWithImsi.value[0]); - printf("\tMinimumPeriodicSearchTimer\t: 0x%.2x\n", - data->nasconfig.MinimumPeriodicSearchTimer.value[0]); - printf("\tExtendedAccessBarring\t\t: 0x%.2x\n", - data->nasconfig.ExtendedAccessBarring.value[0]); - printf("\tTimer_T3245_Behaviour\t\t: 0x%.2x\n", - data->nasconfig.Timer_T3245_Behaviour.value[0]); -} - diff --git a/openair3/NAS/UE/API/USER/COPYING b/openair3/NAS/UE/API/USER/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/UE/API/USER/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/UE/API/USER/Makefile b/openair3/NAS/UE/API/USER/Makefile deleted file mode 100644 index d4981975fc..0000000000 --- a/openair3/NAS/UE/API/USER/Makefile +++ /dev/null @@ -1,49 +0,0 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -ifndef PROJDIR -PROJDIR = $(PWD)/../../.. -INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(IESDIR) -I$(EMMMSGDIR) -I$(ESMMSGDIR) -endif - -include $(PROJDIR)/Makerules -include $(PROJDIR)/Makefile.inc - -all: $(OBJS) - -%.o: %.c Makefile - @echo Compiling $< - @$(CC) $(CFLAGS) -c $< -o $@ - -clean: - $(RM) $(OBJS) *.bak *~ - -depend: - makedepend -- ${CFLAGS} -- ${SRCS} - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/openair3/NAS/UE/API/USER/at_command.c b/openair3/NAS/UE/API/USER/at_command.c index dc4dd3c040..ab85b2d2fa 100644 --- a/openair3/NAS/UE/API/USER/at_command.c +++ b/openair3/NAS/UE/API/USER/at_command.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_command.c @@ -61,6 +54,7 @@ Description Defines the ATtention (AT) command set supported by the NAS /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ +// FIXME Put this in .h extern int at_response_format_v1; extern int at_error_code_suppression_q1; extern at_error_format_t at_error_format; @@ -285,6 +279,7 @@ int at_command_decode(const char* buffer, int length, at_command_t* at_command) char* buf = strdup(buffer+2); char* cmd = strtok(buf, ";"); + // FIXME check overflow for (i=0; cmd && (rc != RETURNerror); i++) { rc = ParseString(cmd, &at_command[i]); cmd = strtok(NULL, ";"); diff --git a/openair3/NAS/UE/API/USER/at_command.h b/openair3/NAS/UE/API/USER/at_command.h index 4c65b0cf2c..b7bdb11b75 100644 --- a/openair3/NAS/UE/API/USER/at_command.h +++ b/openair3/NAS/UE/API/USER/at_command.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_command.h diff --git a/openair3/NAS/UE/API/USER/at_error.c b/openair3/NAS/UE/API/USER/at_error.c index 7b93fb5808..d004c89736 100644 --- a/openair3/NAS/UE/API/USER/at_error.c +++ b/openair3/NAS/UE/API/USER/at_error.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_error.c @@ -56,6 +49,7 @@ Description Defines error codes returned when execution of AT command /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ +// FIXME put this in .h extern int at_response_format_v1; /* diff --git a/openair3/NAS/UE/API/USER/at_error.h b/openair3/NAS/UE/API/USER/at_error.h index 1554f3fa3e..a84875a43c 100644 --- a/openair3/NAS/UE/API/USER/at_error.h +++ b/openair3/NAS/UE/API/USER/at_error.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_error.h diff --git a/openair3/NAS/UE/API/USER/at_response.c b/openair3/NAS/UE/API/USER/at_response.c index 68aa9137aa..a488aa78d9 100644 --- a/openair3/NAS/UE/API/USER/at_response.c +++ b/openair3/NAS/UE/API/USER/at_response.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_response.c diff --git a/openair3/NAS/UE/API/USER/at_response.h b/openair3/NAS/UE/API/USER/at_response.h index 2fa30fabeb..b0303c5875 100644 --- a/openair3/NAS/UE/API/USER/at_response.h +++ b/openair3/NAS/UE/API/USER/at_response.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source at_response.h diff --git a/openair3/NAS/UE/API/USER/tst/Makefile b/openair3/NAS/UE/API/USER/tst/Makefile deleted file mode 100644 index 3ec0f767ca..0000000000 --- a/openair3/NAS/UE/API/USER/tst/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -ifndef PROJDIR -PROJDIR = $(PWD)/../../../.. -endif - -include $(PROJDIR)/Makerules -include $(PROJDIR)/Makefile.inc - -LIBS = -lutil -lapi -lEMMmsg -lESMmsg -lies -INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(USERAPIDIR) - -LIBSAPI = $(LIBDIR)/$(LIBAPI).a $(LIBDIR)/$(LIBAPI).so - -TST_OBJ = at_parser.o - -TST_TARGET = at_parser - -TARGETS = $(TST_TARGET) - -all: $(TARGETS) - -%.o: %.c Makefile - $(CC) $(CFLAGS) -c $< -o $@ - -$(TST_TARGET): $(TST_OBJ) - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) - -clean: - $(RM) $(OBJS) $(TARGETS) *.bak *~ - -depend: - makedepend -- ${CFLAGS} -- ${SRCS} - -# DO NOT DELETE THIS LINE -- make depend depends on it. - -at_parser.o: $(USERAPIDIR)/at_command.h -at_parser.o: $(INCDIR)/commonDef.h $(INCDIR)/userDef.h -at_parser.o: $(INCDIR)/networkDef.h $(UTILDIR)/log.h diff --git a/openair3/NAS/UE/API/USER/tst/at_parser.c b/openair3/NAS/UE/API/USER/tst/at_parser.c index 9700018386..2039d81a63 100644 --- a/openair3/NAS/UE/API/USER/tst/at_parser.c +++ b/openair3/NAS/UE/API/USER/tst/at_parser.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source main.c Version 0.1 diff --git a/openair3/NAS/UE/API/USER/user_api.c b/openair3/NAS/UE/API/USER/user_api.c index 6762877ad0..83839a90f3 100644 --- a/openair3/NAS/UE/API/USER/user_api.c +++ b/openair3/NAS/UE/API/USER/user_api.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source user_api.c @@ -52,9 +45,9 @@ Description Implements the API used by the NAS layer running in the UE #include "device.h" #include "nas_user.h" -#include "at_command.h" #include "at_response.h" #include "at_error.h" +#include "esm_ebr.h" #include "user_indication.h" @@ -75,63 +68,12 @@ Description Implements the API used by the NAS layer running in the UE /* * Asynchronous notification procedure handlers */ -static int _user_api_registration_handler(unsigned char id, const void* data, size_t size); -static int _user_api_location_handler(unsigned char id, const void* data, size_t size); -static int _user_api_network_handler(unsigned char id, const void* data, size_t size); -static int _user_api_pdn_connection_handler(unsigned char id, const void* data, size_t size); +static int _user_api_registration_handler(user_api_id_t *user_api_id, unsigned char id, const void* data, size_t size); +static int _user_api_location_handler(user_api_id_t *user_api_id, unsigned char id, const void* data, size_t size); +static int _user_api_network_handler(user_api_id_t *user_api_id, unsigned char id, const void* data, size_t size); +static int _user_api_pdn_connection_handler(user_api_id_t *user_api_id, unsigned char id, const void* data, size_t size); -static int _user_api_send(at_response_t* data); - -/* ------------------- - * Connection endpoint - * ------------------- - * The connection endpoint is used to send/receive data to/from the - * user application layer. Its definition depends on the underlaying - * mechanism chosen to communicate (network socket, I/O terminal device). - * A connection endpoint is handled using an identifier, and functions - * used to retreive the file descriptor actually allocated by the system, - * to receive data, to send data, and to perform clean up when connection - * is shut down. - * Only one single end to end connection with the user is managed at a - * time. - */ -static struct { - /* Connection endpoint reference */ - void* endpoint; - /* Connection endpoint handlers */ - void* (*open) (int, const char*, const char*); - int (*getfd)(const void*); - ssize_t (*recv) (void*, char*, size_t); - ssize_t (*send) (const void*, const char*, size_t); - void (*close)(void*); -} _user_api_id; - -#define USER_API_OPEN(a, b, c) _user_api_id.open(a, b, c) -#define USER_API_GETFD() _user_api_id.getfd(_user_api_id.endpoint) -#define USER_API_RECV(a, b) _user_api_id.recv(_user_api_id.endpoint, a, b) -#define USER_API_SEND(a, b) _user_api_id.send(_user_api_id.endpoint, a, b) -#define USER_API_CLOSE() _user_api_id.close(_user_api_id.endpoint) - -/* - * The buffer used to receive data from the user application layer - */ -#define USER_API_RECV_BUFFER_SIZE 4096 -static char _user_api_recv_buffer[USER_API_RECV_BUFFER_SIZE]; - -/* - * The buffer used to send data to the user application layer - */ -#define USER_API_SEND_BUFFER_SIZE USER_API_RECV_BUFFER_SIZE -static char _user_api_send_buffer[USER_API_SEND_BUFFER_SIZE]; - -/* - * The decoded data received from the user application layer - */ -static struct { - int n_cmd; /* number of user data to be processed */ -#define USER_DATA_MAX 10 - at_command_t cmd[USER_DATA_MAX]; /* user data to be processed */ -} _user_data = {}; +static int _user_api_send(user_api_id_t *user_api_id, at_response_t* data); /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ @@ -154,44 +96,44 @@ static struct { ** Others: _user_api_id ** ** ** ***************************************************************************/ -int user_api_initialize(const char* host, const char* port, +int user_api_initialize(user_api_id_t *user_api_id, const char* host, const char* port, const char* devname, const char* devparams) { LOG_FUNC_IN; - gethostname(_user_api_send_buffer, USER_API_SEND_BUFFER_SIZE); + gethostname(user_api_id->send_buffer, USER_API_SEND_BUFFER_SIZE); if (devname != NULL) { /* Initialize device handlers */ - _user_api_id.open = device_open; - _user_api_id.getfd = device_get_fd; - _user_api_id.recv = device_read; - _user_api_id.send = device_write; - _user_api_id.close = device_close; + user_api_id->open = device_open; + user_api_id->getfd = device_get_fd; + user_api_id->recv = device_read; + user_api_id->send = device_write; + user_api_id->close = device_close; /* Initialize communication channel */ - _user_api_id.endpoint = USER_API_OPEN(DEVICE, devname, devparams); + user_api_id->endpoint = user_api_id->open(DEVICE, devname, devparams); - if (_user_api_id.endpoint == NULL) { + if (user_api_id->endpoint == NULL) { LOG_TRACE(ERROR, "USR-API - Failed to open connection endpoint, " "%s", strerror(errno)); LOG_FUNC_RETURN (RETURNerror); } LOG_TRACE(INFO, "USR-API - User's communication device %d is OPENED " - "on %s/%s", user_api_get_fd(), _user_api_send_buffer, devname); + "on %s/%s", user_api_get_fd(user_api_id), user_api_id->send_buffer, devname); } else { /* Initialize network socket handlers */ - _user_api_id.open = socket_udp_open; - _user_api_id.getfd = socket_get_fd; - _user_api_id.recv = socket_recv; - _user_api_id.send = socket_send; - _user_api_id.close = socket_close; + user_api_id->open = socket_udp_open; + user_api_id->getfd = socket_get_fd; + user_api_id->recv = socket_recv; + user_api_id->send = socket_send; + user_api_id->close = socket_close; /* Initialize communication channel */ - _user_api_id.endpoint = USER_API_OPEN(SOCKET_SERVER, host, port); + user_api_id->endpoint = user_api_id->open(SOCKET_SERVER, host, port); - if (_user_api_id.endpoint == NULL) { + if (user_api_id->endpoint == NULL) { const char* error = ( (errno < 0) ? gai_strerror(errno) : strerror(errno) ); LOG_TRACE(ERROR, "USR-API - Failed to open connection endpoint, " @@ -200,7 +142,7 @@ int user_api_initialize(const char* host, const char* port, } LOG_TRACE(INFO, "USR-API - User's UDP socket %d is BOUND to %s/%s", - user_api_get_fd(), _user_api_send_buffer, port); + user_api_get_fd(user_api_id), user_api_id->send_buffer, port); } /* Register the asynchronous notification handlers */ @@ -245,10 +187,10 @@ int user_api_initialize(const char* host, const char* port, ** Others: None ** ** ** ***************************************************************************/ -int user_api_get_fd(void) +int user_api_get_fd(user_api_id_t *user_api_id) { LOG_FUNC_IN; - LOG_FUNC_RETURN (USER_API_GETFD()); + LOG_FUNC_RETURN (user_api_id->getfd(user_api_id->endpoint)); } /**************************************************************************** @@ -260,19 +202,18 @@ int user_api_get_fd(void) ** before its usage. ** ** ** ** Inputs: index: Index of the user data structure to get ** - ** Others: _user_data ** ** ** ** Outputs: Return: A generic pointer to the user data ** ** structure ** ** Others: None ** ** ** ***************************************************************************/ -const void* user_api_get_data(int index) +const void* user_api_get_data(user_at_commands_t *commands, int index) { LOG_FUNC_IN; - if (index < _user_data.n_cmd) { - LOG_FUNC_RETURN ((void*)(&_user_data.cmd[index])); + if (index < commands->n_cmd) { + LOG_FUNC_RETURN ((void*)(&commands->cmd[index])); } LOG_FUNC_RETURN (NULL); @@ -284,33 +225,23 @@ const void* user_api_get_data(int index) ** ** ** Description: Read data received from the user application layer ** ** ** - ** Inputs: fd: File descriptor of the connection endpoint ** - ** from which data have been received ** ** Others: _user_api_id ** ** ** ** Outputs: Return: The number of bytes read when success; ** ** RETURNerror Otherwise ** - ** Others: _user_api_recv_buffer, _user_api_id ** + ** Others: user_api_id->recv_buffer, _user_api_id ** ** ** ***************************************************************************/ -int user_api_read_data(int fd) +int user_api_read_data(user_api_id_t *user_api_id) { LOG_FUNC_IN; int rbytes; - /* Sanity check */ - int sfd = user_api_get_fd(); - - if (fd != sfd) { - LOG_TRACE(ERROR, "USR-API - Endpoint %d is not the one created for communication with the user application layer (%d)", fd, sfd); - LOG_FUNC_RETURN (RETURNerror); - } - - memset(_user_api_recv_buffer, 0, USER_API_RECV_BUFFER_SIZE); + memset(user_api_id->recv_buffer, 0, USER_API_RECV_BUFFER_SIZE); /* Receive data from the user application layer */ - rbytes = USER_API_RECV(_user_api_recv_buffer, USER_API_RECV_BUFFER_SIZE); + rbytes = user_api_id->recv(user_api_id->endpoint, user_api_id->recv_buffer, USER_API_RECV_BUFFER_SIZE); if (rbytes == RETURNerror) { LOG_TRACE(ERROR, "USR-API - recv() failed, %s", strerror(errno)); @@ -320,7 +251,7 @@ int user_api_read_data(int fd) } else { LOG_TRACE(INFO, "USR-API - %d bytes received " "from the user application layer", rbytes); - LOG_DUMP(_user_api_recv_buffer, rbytes); + LOG_DUMP(user_api_id->recv_buffer, rbytes); } LOG_FUNC_RETURN (rbytes); @@ -336,45 +267,42 @@ int user_api_read_data(int fd) ** ** ** Outputs: Return: The number of bytes write when success; ** ** RETURNerror Otherwise ** - ** Others: _user_api_recv_buffer ** + ** Others: user_api_id->recv_buffer ** ** ** ***************************************************************************/ -int user_api_set_data(char *message) +int user_api_set_data(user_api_id_t *user_api_id, char *message) { LOG_FUNC_IN; int rbytes; - memset(_user_api_recv_buffer, 0, USER_API_RECV_BUFFER_SIZE); + memset(user_api_id->recv_buffer, 0, USER_API_RECV_BUFFER_SIZE); - strncpy(_user_api_recv_buffer, message, USER_API_RECV_BUFFER_SIZE); - rbytes = strlen(_user_api_recv_buffer); + strncpy(user_api_id->recv_buffer, message, USER_API_RECV_BUFFER_SIZE); + rbytes = strlen(user_api_id->recv_buffer); LOG_TRACE(INFO, "USR-API - %d bytes write", rbytes); - LOG_DUMP(_user_api_recv_buffer, rbytes); + LOG_DUMP(user_api_id->recv_buffer, rbytes); LOG_FUNC_RETURN (rbytes); } /**************************************************************************** ** ** - ** Name: user_api_send_data() ** +** Name: user_api_send_data() ** ** ** ** Description: Send data to the user application layer ** ** ** - ** Inputs: fd: File descriptor of the connection endpoint ** - ** to which data have to be sent ** ** length: Number of bytes to send ** - ** Others: _user_api_send_buffer, _user_api_id ** ** ** ** Outputs: Return: The number of bytes sent when success; ** ** RETURNerror Otherwise ** ** Others: None ** ** ** ***************************************************************************/ -static int _user_api_send_data(int length) +static int _user_api_send_data(user_api_id_t *user_api_id, int length) { - int sbytes = USER_API_SEND(_user_api_send_buffer, length); + int sbytes = user_api_id->send(user_api_id->endpoint, user_api_id->send_buffer, length); if (sbytes == RETURNerror) { LOG_TRACE(ERROR, "USR-API - send() failed, %s", strerror(errno)); @@ -384,28 +312,25 @@ static int _user_api_send_data(int length) } else { LOG_TRACE(INFO, "USR-API - %d bytes sent " "to the user application layer", sbytes); - LOG_DUMP(_user_api_send_buffer, sbytes); + LOG_DUMP(user_api_id->send_buffer, sbytes); } return sbytes; } -int user_api_send_data(int fd, int length) + +/**************************************************************************** + ** ** + ** Name: user_api_close() ** + ***************************************************************************/ + int user_api_send_data(user_api_id_t *user_api_id, int length) { LOG_FUNC_IN; - /* Sanity check */ - int sfd = user_api_get_fd(); - - if (fd != sfd) { - LOG_TRACE(ERROR, "USR-API - Endpoint %d is not the one created for communication with the user application layer (%d)", fd, sfd); - LOG_FUNC_RETURN (RETURNerror); - } - /* Send data to the user application layer */ int sbytes = 0; if (length > 0) { - sbytes = _user_api_send_data(length); + sbytes = _user_api_send_data(user_api_id, length); } LOG_FUNC_RETURN (sbytes); @@ -418,31 +343,18 @@ int user_api_send_data(int fd, int length) ** Description: Close the user API from which the NAS layer sent/received ** ** messages to/from the user application layer ** ** ** - ** Inputs: fd: File descriptor of the connection endpoint ** - ** allocated by the system to communicate ** - ** with the user application layer ** ** Others: None ** ** ** ** Outputs: Return: None ** - ** Others: _user_api_id ** ** ** ***************************************************************************/ -void user_api_close(int fd) +void user_api_close(user_api_id_t *user_api_id) { LOG_FUNC_IN; - /* Sanity check */ - int sfd = user_api_get_fd(); - - if (fd != sfd) { - LOG_TRACE(ERROR, "USR-API - Endpoint %d is not the one created for communication with the user application layer (%d)", fd, sfd); - LOG_FUNC_OUT; - return; - } - /* Cleanup the connection endpoint */ - USER_API_CLOSE(); - _user_api_id.endpoint = NULL; + user_api_id->close(user_api_id->endpoint) ; + user_api_id->endpoint = NULL; LOG_FUNC_OUT; } @@ -457,46 +369,45 @@ void user_api_close(int fd) ** layer when the AT command failed to be decoded. ** ** ** ** Inputs: length: Number of bytes to decode ** - ** Others: _user_api_recv_buffer ** ** ** ** Outputs: Return: The number of AT commands succeessfully ** ** decoded ** - ** Others: _user_api_send_buffer, _user_data ** ** ** ***************************************************************************/ -int user_api_decode_data(int length) +int user_api_decode_data(user_api_id_t *user_api_id, user_at_commands_t *commands, int length) { LOG_FUNC_IN; /* Parse the AT command line */ - LOG_TRACE(INFO, "USR-API - Decode user data: %s", _user_api_recv_buffer); - _user_data.n_cmd = at_command_decode(_user_api_recv_buffer, length, - _user_data.cmd); + LOG_TRACE(INFO, "USR-API - Decode user data: %s", user_api_id->recv_buffer); + commands->n_cmd = at_command_decode(user_api_id->recv_buffer, length, + commands->cmd); - if (_user_data.n_cmd > 0) { + if (commands->n_cmd > 0) { /* AT command data received from the user application layer * has been successfully decoded */ LOG_TRACE(INFO, "USR-API - %d AT command%s ha%s been successfully " - "decoded", _user_data.n_cmd, - (_user_data.n_cmd > 1) ? "s" : "", - (_user_data.n_cmd > 1) ? "ve" : "s"); + "decoded", commands->n_cmd, + (commands->n_cmd > 1) ? "s" : "", + (commands->n_cmd > 1) ? "ve" : "s"); } else { int bytes; /* Failed to decode AT command data received from the user * application layer; Return syntax error code message */ LOG_TRACE(ERROR, "USR-API - Syntax error: Failed to decode " - "AT command data %s", _user_api_recv_buffer); + "AT command data %s", user_api_id->recv_buffer); /* Encode the syntax error code message */ - bytes = at_error_encode(_user_api_send_buffer, AT_ERROR_SYNTAX, + bytes = at_error_encode(user_api_id->send_buffer, AT_ERROR_SYNTAX, AT_ERROR_OPERATION_NOT_SUPPORTED); + // FIXME move _user_data call /* Send the syntax error code message */ - (void) _user_api_send_data(bytes); + _user_api_send_data(user_api_id, bytes); } - LOG_FUNC_RETURN (_user_data.n_cmd); + LOG_FUNC_RETURN (commands->n_cmd); } /**************************************************************************** @@ -515,10 +426,9 @@ int user_api_decode_data(int length) ** Outputs: Return: The number of characters that have been ** ** successfully encoded; ** ** RETURNerror otherwise. ** - ** Others: _user_api_send_buffer ** ** ** ***************************************************************************/ -int user_api_encode_data(const void* data, int success_code) +int user_api_encode_data(user_api_id_t *user_api_id, const void* data, int success_code) { LOG_FUNC_IN; @@ -527,16 +437,16 @@ int user_api_encode_data(const void* data, int success_code) /* Encode AT command error message */ if (user_data->cause_code != AT_ERROR_SUCCESS) { - bytes = at_error_encode(_user_api_send_buffer, AT_ERROR_CME, + bytes = at_error_encode(user_api_id->send_buffer, AT_ERROR_CME, user_data->cause_code); } /* Encode AT command response message */ else { - bytes = at_response_encode(_user_api_send_buffer, user_data); + bytes = at_response_encode(user_api_id->send_buffer, user_data); /* Add success result code */ if ( (success_code) && (bytes != RETURNerror) ) { - bytes += at_error_encode(&_user_api_send_buffer[bytes], + bytes += at_error_encode(&user_api_id->send_buffer[bytes], AT_ERROR_OK, 0); } } @@ -574,7 +484,7 @@ int user_api_encode_data(const void* data, int success_code) ** Others: None ** ** ** ***************************************************************************/ -int user_api_emm_callback(Stat_t stat, tac_t tac, ci_t ci, AcT_t AcT, +int user_api_emm_callback(user_api_id_t *user_api_id, Stat_t stat, tac_t tac, ci_t ci, AcT_t AcT, const char* data, size_t size) { LOG_FUNC_IN; @@ -586,14 +496,14 @@ int user_api_emm_callback(Stat_t stat, tac_t tac, ci_t ci, AcT_t AcT, * The list of available operators present in the network has to be * displayed to the user application */ - rc = user_ind_notify(USER_IND_PLMN, (void*)data, size); + rc = user_ind_notify(user_api_id, USER_IND_PLMN, (void*)data, size); } else { user_indication_t ind; ind.notification.reg.status = stat; if (size > 0) { /* The UE's network registration status has changed */ - rc = user_ind_notify(USER_IND_REG, (void*)&ind, 0); + rc = user_ind_notify(user_api_id, USER_IND_REG, (void*)&ind, 0); } if (rc != RETURNerror) { @@ -603,7 +513,7 @@ int user_api_emm_callback(Stat_t stat, tac_t tac, ci_t ci, AcT_t AcT, ind.notification.loc.tac = tac; ind.notification.loc.ci = ci; ind.notification.loc.AcT = AcT; - rc = user_ind_notify(USER_IND_LOC, (void*)&ind, 0); + rc = user_ind_notify(user_api_id, USER_IND_LOC, (void*)&ind, 0); } } @@ -631,7 +541,7 @@ int user_api_emm_callback(Stat_t stat, tac_t tac, ci_t ci, AcT_t AcT, ** Others: None ** ** ** ***************************************************************************/ -int user_api_esm_callback(int cid, network_pdn_state_t state) +int user_api_esm_callback(user_api_id_t *user_api_id, int cid, network_pdn_state_t state) { LOG_FUNC_IN; @@ -641,7 +551,7 @@ int user_api_esm_callback(int cid, network_pdn_state_t state) ind.notification.pdn.cid = cid; ind.notification.pdn.status = state; /* The status of the specified PDN connection has changed */ - rc = user_ind_notify(USER_IND_PDN, (void*)&ind, 0); + rc = user_ind_notify(user_api_id, USER_IND_PDN, (void*)&ind, 0); LOG_FUNC_RETURN (rc); } @@ -657,23 +567,22 @@ int user_api_esm_callback(int cid, network_pdn_state_t state) ** Description: Encodes and sends data to the user application layer ** ** ** ** Inputs: data: The data to send ** - ** Others: _user_api_send_buffer, _user_api_id ** ** ** ** Outputs: Return: The number of bytes sent when success; ** ** RETURNerror Otherwise ** ** Others: None ** ** ** ***************************************************************************/ -static int _user_api_send(at_response_t* data) +static int _user_api_send(user_api_id_t *user_api_id, at_response_t* data) { LOG_FUNC_IN; /* Encode AT command response message */ - int bytes = at_response_encode(_user_api_send_buffer, data); + int bytes = at_response_encode(user_api_id->send_buffer, data); /* Send the AT command response message to the user application */ if (bytes != RETURNerror) { - bytes = _user_api_send_data(bytes); + bytes = _user_api_send_data(user_api_id, bytes); } LOG_FUNC_RETURN (bytes); @@ -700,7 +609,7 @@ static int _user_api_send(at_response_t* data) ** Others: None ** ** ** ***************************************************************************/ -static int _user_api_registration_handler(unsigned char id, const void* data, +static int _user_api_registration_handler(user_api_id_t *user_api_id, unsigned char id, const void* data, size_t size) { LOG_FUNC_IN; @@ -717,7 +626,7 @@ static int _user_api_registration_handler(unsigned char id, const void* data, at_response.response.cereg.stat = reg->status; /* Encode and send the AT command response message to the user */ - int bytes = _user_api_send(&at_response); + int bytes = _user_api_send(user_api_id, &at_response); LOG_FUNC_RETURN (bytes); } @@ -742,7 +651,7 @@ static int _user_api_registration_handler(unsigned char id, const void* data, ** Others: None ** ** ** ***************************************************************************/ -static int _user_api_location_handler(unsigned char id, const void* data, +static int _user_api_location_handler(user_api_id_t *user_api_id, unsigned char id, const void* data, size_t size) { LOG_FUNC_IN; @@ -766,7 +675,7 @@ static int _user_api_location_handler(unsigned char id, const void* data, } /* Encode and send the AT command response message to the user */ - int bytes = _user_api_send(&at_response); + int bytes = _user_api_send(user_api_id, &at_response); LOG_FUNC_RETURN (bytes); } @@ -789,7 +698,7 @@ static int _user_api_location_handler(unsigned char id, const void* data, ** Others: None ** ** ** ***************************************************************************/ -static int _user_api_network_handler(unsigned char id, const void* data, +static int _user_api_network_handler(user_api_id_t *user_api_id, unsigned char id, const void* data, size_t size) { LOG_FUNC_IN; @@ -802,7 +711,7 @@ static int _user_api_network_handler(unsigned char id, const void* data, at_response.response.cops.tst.size = size; /* Encode and send the AT command response message to the user */ - int bytes = _user_api_send(&at_response); + int bytes = _user_api_send(user_api_id, &at_response); LOG_FUNC_RETURN (bytes); } @@ -827,7 +736,7 @@ static int _user_api_network_handler(unsigned char id, const void* data, ** Others: None ** ** ** ***************************************************************************/ -static int _user_api_pdn_connection_handler(unsigned char id, const void* data, +static int _user_api_pdn_connection_handler(user_api_id_t *user_api_id, unsigned char id, const void* data, size_t size) { LOG_FUNC_IN; @@ -844,7 +753,7 @@ static int _user_api_pdn_connection_handler(unsigned char id, const void* data, at_response.response.cgev.code = pdn->status; /* Encode and send the AT command response message to the user */ - int bytes = _user_api_send(&at_response); + int bytes = _user_api_send(user_api_id, &at_response); LOG_FUNC_RETURN (bytes); } diff --git a/openair3/NAS/UE/API/USER/user_api.h b/openair3/NAS/UE/API/USER/user_api.h index a71ab458d4..e554b4ef0b 100644 --- a/openair3/NAS/UE/API/USER/user_api.h +++ b/openair3/NAS/UE/API/USER/user_api.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source user_api.h @@ -49,15 +42,14 @@ Description Implements the API used by the NAS layer running in the UE #include "commonDef.h" #include "networkDef.h" +#include "at_command.h" +#include "user_api_defs.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ /****************************************************************************/ -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - /****************************************************************************/ /******************** G L O B A L V A R I A B L E S ********************/ /****************************************************************************/ @@ -66,20 +58,20 @@ Description Implements the API used by the NAS layer running in the UE /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -int user_api_initialize(const char* host, const char* port, const char* devname, const char* devparams); +int user_api_initialize(user_api_id_t *user_api_id, const char* host, const char* port, const char* devname, const char* devparams); -int user_api_emm_callback(Stat_t stat, tac_t tac, ci_t ci, AcT_t AcT, const char* data, size_t size); -int user_api_esm_callback(int cid, network_pdn_state_t state); +int user_api_emm_callback(user_api_id_t *user_api_id, Stat_t stat, tac_t tac, ci_t ci, AcT_t AcT, const char* data, size_t size); +int user_api_esm_callback(user_api_id_t *user_api_id, int cid, network_pdn_state_t state); -int user_api_get_fd(void); -const void* user_api_get_data(int index); +int user_api_get_fd(user_api_id_t *user_api_id); +const void* user_api_get_data(user_at_commands_t *commands, int index); -int user_api_read_data(int fd); -int user_api_set_data(char *message); -int user_api_send_data(int fd, int length); -void user_api_close(int fd); +int user_api_read_data(user_api_id_t *user_api_id); +int user_api_set_data(user_api_id_t *user_api_id, char *message); +int user_api_send_data(user_api_id_t *user_api_id, int length); +void user_api_close(user_api_id_t *user_api_id); -int user_api_decode_data(int length); -int user_api_encode_data(const void* data, int add_success_code); +int user_api_decode_data(user_api_id_t *user_api_id, user_at_commands_t *commands, int length); +int user_api_encode_data(user_api_id_t *user_api_id, const void* data, int add_success_code); #endif /* __USER_API_H__ */ diff --git a/openair3/NAS/UE/API/USER/user_api_defs.h b/openair3/NAS/UE/API/USER/user_api_defs.h new file mode 100644 index 0000000000..ef4d8cd383 --- /dev/null +++ b/openair3/NAS/UE/API/USER/user_api_defs.h @@ -0,0 +1,50 @@ +#ifndef _USER_API_DEFS_H +#define _USER_API_DEFS_H + +#include +#include "at_command.h" + +/****************************************************************************/ +/************************ G L O B A L T Y P E S ************************/ +/****************************************************************************/ + +#define USER_API_RECV_BUFFER_SIZE 4096 +#define USER_API_SEND_BUFFER_SIZE USER_API_RECV_BUFFER_SIZE +#define USER_DATA_MAX 10 + +/* + * The decoded data received from the user application layer + */ +typedef struct { + int n_cmd; /* number of user data to be processed */ + at_command_t cmd[USER_DATA_MAX]; /* user data to be processed */ +} user_at_commands_t; + +/* ------------------- + * Connection endpoint + * ------------------- + * The connection endpoint is used to send/receive data to/from the + * user application layer. Its definition depends on the underlaying + * mechanism chosen to communicate (network socket, I/O terminal device). + * A connection endpoint is handled using an identifier, and functions + * used to retreive the file descriptor actually allocated by the system, + * to receive data, to send data, and to perform clean up when connection + * is shut down. + * Only one single end to end connection with the user is managed at a + * time. + */ +typedef struct { + /* Connection endpoint reference */ + void* endpoint; + /* Connection endpoint handlers */ + void* (*open) (int, const char*, const char*); + int (*getfd)(const void*); + ssize_t (*recv) (void*, char*, size_t); + ssize_t (*send) (const void*, const char*, size_t); + void (*close)(void*); + char recv_buffer[USER_API_RECV_BUFFER_SIZE]; + char send_buffer[USER_API_SEND_BUFFER_SIZE]; +} user_api_id_t; + + +#endif diff --git a/openair3/NAS/UE/API/USER/user_indication.c b/openair3/NAS/UE/API/USER/user_indication.c index a4e1b7cd93..2c102c1d46 100644 --- a/openair3/NAS/UE/API/USER/user_indication.c +++ b/openair3/NAS/UE/API/USER/user_indication.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source user_indication.c @@ -153,7 +146,7 @@ int user_ind_deregister(user_ind_t ind) ** Others: None ** ** ** ***************************************************************************/ -int user_ind_notify(user_ind_t ind, const void* data, size_t size) +int user_ind_notify(user_api_id_t *user_api_id, user_ind_t ind, const void* data, size_t size) { LOG_FUNC_IN; @@ -165,7 +158,7 @@ int user_ind_notify(user_ind_t ind, const void* data, size_t size) user_ind_callback_t notify = _user_ind_handler.callback[ind]; if (notify != NULL) { - rc = (*notify)(_user_ind_handler.id, data, size); + rc = (*notify)(user_api_id, _user_ind_handler.id, data, size); } } else { /* Silently discard not registered notification */ diff --git a/openair3/NAS/UE/API/USER/user_indication.h b/openair3/NAS/UE/API/USER/user_indication.h index 74679fb52a..d86ab43dca 100644 --- a/openair3/NAS/UE/API/USER/user_indication.h +++ b/openair3/NAS/UE/API/USER/user_indication.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source user_indication.h @@ -50,6 +43,7 @@ Description Defines functions which allow the user application to register #include "commonDef.h" #include "networkDef.h" +#include "user_api_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -108,7 +102,7 @@ typedef struct { /* * Type of procedure executed upon receiving registered notification */ -typedef int (*user_ind_callback_t) (unsigned char, const void*, size_t); +typedef int (*user_ind_callback_t) (user_api_id_t *user_api_id, unsigned char, const void*, size_t); /****************************************************************************/ /************************ G L O B A L T Y P E S ************************/ @@ -124,6 +118,6 @@ typedef int (*user_ind_callback_t) (unsigned char, const void*, size_t); int user_ind_register(user_ind_t ind, unsigned char id, user_ind_callback_t cb); int user_ind_deregister(user_ind_t ind); -int user_ind_notify(user_ind_t ind, const void* data, size_t size); +int user_ind_notify(user_api_id_t *user_api_id, user_ind_t ind, const void* data, size_t size); #endif /* __USER_IND_H__*/ diff --git a/openair3/NAS/UE/API/USIM/COPYING b/openair3/NAS/UE/API/USIM/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/NAS/UE/API/USIM/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/UE/API/USIM/Makefile b/openair3/NAS/UE/API/USIM/Makefile deleted file mode 100644 index d4981975fc..0000000000 --- a/openair3/NAS/UE/API/USIM/Makefile +++ /dev/null @@ -1,49 +0,0 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ -ifndef PROJDIR -PROJDIR = $(PWD)/../../.. -INCLUDES = -I. -I$(INCDIR) -I$(UTILDIR) -I$(IESDIR) -I$(EMMMSGDIR) -I$(ESMMSGDIR) -endif - -include $(PROJDIR)/Makerules -include $(PROJDIR)/Makefile.inc - -all: $(OBJS) - -%.o: %.c Makefile - @echo Compiling $< - @$(CC) $(CFLAGS) -c $< -o $@ - -clean: - $(RM) $(OBJS) *.bak *~ - -depend: - makedepend -- ${CFLAGS} -- ${SRCS} - -# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/openair3/NAS/UE/API/USIM/aka_functions.c b/openair3/NAS/UE/API/USIM/aka_functions.c index 1c30a17bfd..88a9415e08 100644 --- a/openair3/NAS/UE/API/USIM/aka_functions.c +++ b/openair3/NAS/UE/API/USIM/aka_functions.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /*------------------------------------------------------------------- * Example algorithms f1, f1*, f2, f3, f4, f5, f5* *------------------------------------------------------------------- @@ -18,26 +39,6 @@ #include "aka_functions.h" #include "nas_log.h" -/*--------- Operator Variant Algorithm Configuration Field --------*/ -/*------- Insert your value of OP here -------*/ -/* PFT OP used currently in HSS (OPENAIRHSS/auc/kdf.c) */ -#define OAI_LTEBOX - -#ifdef OAI_LTEBOX -//1006020f0a478bf6b699f15c062e42b3 -/*u8 OP[16] = {0xb3, 0x42, 0x2e, 0x06, 0x5c, 0xf1, 0x99, 0xb6, - 0xf6, 0x8b, 0x47, 0x0a, 0x0f, 0x02, 0x06, 0x10 - };*/ -u8 OP[16] = {0x10, 0x06, 0x02, 0x0f, 0x0a, 0x47, 0x8b, 0xf6, - 0xb6, 0x99, 0xf1, 0x5c, 0x06, 0x2e, 0x42, 0xb3 -}; -#else -u8 OP[16] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 - }; -#endif -/*------- Insert your value of OP here -------*/ - /*------------------------------------------------------------------- * Algorithm f1 *------------------------------------------------------------------- @@ -48,16 +49,14 @@ u8 OP[16] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, * *-----------------------------------------------------------------*/ void f1 ( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2], - u8 mac_a_pP[8] ) + u8 mac_a_pP[8], const u8 op_c[16]) { - u8 op_c[16]; u8 temp[16]; u8 in1[16]; u8 out1[16]; u8 rijndaelInput[16]; u8 i; RijndaelKeySchedule( k_pP ); - ComputeOPc( op_c ); for (i=0; i<16; i++) rijndaelInput[i] = rand_pP[i] ^ op_c[i]; @@ -103,9 +102,8 @@ void f1 ( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2], * *-----------------------------------------------------------------*/ void f2345 ( u8 k_pP[16], u8 rand_pP[16], - u8 res_pP[8], u8 ck_pP[16], u8 ik_pP[16], u8 ak_pP[6] ) + u8 res_pP[8], u8 ck_pP[16], u8 ik_pP[16], u8 ak_pP[6],const u8 op_c[16]) { - u8 op_c[16]; u8 temp[16]; u8 out[16]; u8 rijndaelInput[16]; @@ -121,7 +119,6 @@ void f2345 ( u8 k_pP[16], u8 rand_pP[16], rand_pP[8],rand_pP[9],rand_pP[10],rand_pP[11],rand_pP[12],rand_pP[13],rand_pP[14],rand_pP[15]); RijndaelKeySchedule( k_pP ); - ComputeOPc( op_c ); for (i=0; i<16; i++) rijndaelInput[i] = rand_pP[i] ^ op_c[i]; @@ -204,16 +201,14 @@ void f2345 ( u8 k_pP[16], u8 rand_pP[16], * *-----------------------------------------------------------------*/ void f1star( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2], - u8 mac_s_pP[8] ) + u8 mac_s_pP[8],const u8 op_c[16]) { - u8 op_c[16]; u8 temp[16]; u8 in1[16]; u8 out1[16]; u8 rijndaelInput[16]; u8 i; RijndaelKeySchedule( k_pP ); - ComputeOPc( op_c ); for (i=0; i<16; i++) rijndaelInput[i] = rand_pP[i] ^ op_c[i]; @@ -259,15 +254,13 @@ void f1star( u8 k_pP[16], u8 rand_pP[16], u8 sqn_pP[6], u8 amf_pP[2], * *-----------------------------------------------------------------*/ void f5star( u8 k_pP[16], u8 rand_pP[16], - u8 ak_pP[6] ) + u8 ak_pP[6], const u8 op_c[16]) { - u8 op_c[16]; u8 temp[16]; u8 out[16]; u8 rijndaelInput[16]; u8 i; RijndaelKeySchedule( k_pP ); - ComputeOPc( op_c ); for (i=0; i<16; i++) rijndaelInput[i] = rand_pP[i] ^ op_c[i]; @@ -295,17 +288,17 @@ void f5star( u8 k_pP[16], u8 rand_pP[16], * Function to compute OPc from OP and K. Assumes key schedule has already been performed. *-----------------------------------------------------------------*/ -void ComputeOPc( u8 op_c_pP[16] ) +void ComputeOPc(const u8 op[16], u8 op_c_pP[16]) { u8 i; LOG_TRACE(DEBUG, - "USIM-API - ComputeOPc : OP[0..15]=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", - OP[0],OP[1],OP[2], OP[3], OP[4], OP[5], OP[6], OP[7], - OP[8],OP[9],OP[10],OP[11],OP[12],OP[13],OP[14],OP[15]); - RijndaelEncrypt( OP, op_c_pP ); + "USIM-API - ComputeOPc : op[0..15]=%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", + op[0],op[1],op[2], op[3], op[4], op[5], op[6], op[7], + op[8],op[9],op[10],op[11],op[12],op[13],op[14],op[15]); + RijndaelEncrypt( op, op_c_pP ); for (i=0; i<16; i++) - op_c_pP[i] ^= OP[i]; + op_c_pP[i] ^= op[i]; return; } /* end of function ComputeOPc */ @@ -463,7 +456,7 @@ void MixColumn(u8 state[4][4]) * 16-byte output (using round keys already derived from 16-byte * key). *-----------------------------------------------------------------*/ -void RijndaelEncrypt( u8 input[16], u8 output[16] ) +void RijndaelEncrypt(const u8 input[16], u8 output[16] ) { u8 state[4][4]; int i, r; diff --git a/openair3/NAS/UE/API/USIM/aka_functions.h b/openair3/NAS/UE/API/USIM/aka_functions.h index 0d1a6fe1df..4e28ead86a 100644 --- a/openair3/NAS/UE/API/USIM/aka_functions.h +++ b/openair3/NAS/UE/API/USIM/aka_functions.h @@ -1,42 +1,35 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ typedef unsigned char u8; /*--------------------------- prototypes --------------------------*/ void f1 ( u8 k[16], u8 rand[16], u8 sqn[6], u8 amf[2], - u8 mac_a[8] ); + u8 mac_a[8], const u8 op[16]); void f2345 ( u8 k[16], u8 rand[16], - u8 res[8], u8 ck[16], u8 ik[16], u8 ak[6] ); + u8 res[8], u8 ck[16], u8 ik[16], u8 ak[6], const u8 op[16]); void f1star( u8 k[16], u8 rand[16], u8 sqn[6], u8 amf[2], - u8 mac_s[8] ); + u8 mac_s[8], const u8 op[16]); void f5star( u8 k[16], u8 rand[16], - u8 ak[6] ); -void ComputeOPc( u8 op_c[16] ); + u8 ak[6], const u8 op[16]); +void ComputeOPc(const u8 op[16], u8 op_c_pP[16] ); void RijndaelKeySchedule( u8 key[16] ); -void RijndaelEncrypt( u8 input[16], u8 output[16] ); +void RijndaelEncrypt(const u8 input[16], u8 output[16] ); diff --git a/openair3/NAS/UE/API/USIM/usim_api.c b/openair3/NAS/UE/API/USIM/usim_api.c index 807ee46724..d8a3807ab3 100644 --- a/openair3/NAS/UE/API/USIM/usim_api.c +++ b/openair3/NAS/UE/API/USIM/usim_api.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source usim_api.h @@ -48,11 +41,13 @@ Description Implements the API used by the NAS layer to read/write #include "usim_api.h" #include "nas_log.h" +#include "utils.h" #include "memory.h" - +#include #include "aka_functions.h" #include // memcpy, memset #include // malloc, free +#include /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ @@ -62,45 +57,6 @@ Description Implements the API used by the NAS layer to read/write /******************* L O C A L D E F I N I T I O N S *******************/ /****************************************************************************/ -/* - * The name of the file where are stored data of the USIM application - */ -#define USIM_API_NVRAM_FILENAME ".usim.nvram" - -/* - * The name of the environment variable which defines the directory - * where the USIM application file is located - */ -#define USIM_API_NVRAM_DIRNAME "USIM_DIR" - -/* - * Subscriber authentication security key - */ -#define USIM_API_K_SIZE 16 -//#define USIM_API_K_VALUE "fec86ba6eb707ed08905757b1bb44b8f" -#define USIM_API_K_VALUE "8BAF473F2F8FD09487CCCBD7097C6862" - -static uint8_t _usim_api_k[USIM_API_K_SIZE]; - - -/* - * List of last used Sequence Numbers SQN - */ -#define USIM_API_AK_SIZE 6 -#define USIM_API_SQN_SIZE USIM_API_AK_SIZE -#define USIM_API_SQNMS_SIZE USIM_API_SQN_SIZE - -static struct _usim_api_data_s { - /* Highest sequence number the USIM has ever accepted */ - uint8_t sqn_ms[USIM_API_SQNMS_SIZE]; - /* List of the last used sequence numbers */ -#define USIM_API_SQN_LIST_SIZE 32 - uint8_t n_sqns; - uint32_t sqn[USIM_API_SQN_LIST_SIZE]; -} _usim_api_data; - -static uint8_t _usim_api_hex_char_to_hex_value (char c); -static void _usim_api_hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size); static int _usim_api_check_sqn(uint32_t seq, uint8_t ind); /****************************************************************************/ @@ -121,31 +77,17 @@ static int _usim_api_check_sqn(uint32_t seq, uint8_t ind); ** Others: None ** ** ** ***************************************************************************/ -int usim_api_read(usim_data_t* data) +int usim_api_read(const char *filename, usim_data_t* data) { LOG_FUNC_IN; - /* Get USIM application pathname */ - char* path = memory_get_path(USIM_API_NVRAM_DIRNAME, - USIM_API_NVRAM_FILENAME); - - if (path == NULL) { - LOG_TRACE(ERROR, "USIM-API - Failed to get USIM pathname"); - LOG_FUNC_RETURN (RETURNerror); - } - /* Read USIM application data */ - if (memory_read(path, data, sizeof(usim_data_t)) != RETURNok) { + if (memory_read(filename, data, sizeof(usim_data_t)) != RETURNok) { LOG_TRACE(ERROR, "USIM-API - %s file is either not valid " - "or not present", path); - free(path); + "or not present", filename); LOG_FUNC_RETURN (RETURNerror); } - /* initialize the subscriber authentication security key */ - _usim_api_hex_string_to_hex_value(_usim_api_k, USIM_API_K_VALUE, USIM_API_K_SIZE); - - free(path); LOG_FUNC_RETURN (RETURNok); } @@ -163,28 +105,201 @@ int usim_api_read(usim_data_t* data) ** Others: None ** ** ** ***************************************************************************/ -int usim_api_write(const usim_data_t* data) +int usim_api_write(const char *filename, const usim_data_t* data) { LOG_FUNC_IN; - /* Get USIM application pathname */ - char* path = memory_get_path(USIM_API_NVRAM_DIRNAME, - USIM_API_NVRAM_FILENAME); - - if (path == NULL) { - LOG_TRACE(ERROR, "USIM-API - Failed to get USIM pathname"); - LOG_FUNC_RETURN (RETURNerror); - } - /* Write USIM application data */ - if (memory_write(path, data, sizeof(usim_data_t)) != RETURNok) { + if (memory_write(filename, data, sizeof(usim_data_t)) != RETURNok) { - LOG_TRACE(ERROR, "USIM-API - Unable to write USIM file %s", path); - free(path); + LOG_TRACE(ERROR, "USIM-API - Unable to write USIM file %s", filename); + LOG_FUNC_RETURN (RETURNerror); + } + + LOG_FUNC_RETURN (RETURNok); +} + +/**************************************************************************** + ** ** + ** Name: usim_api_authenticate_test() ** + ** ** + ** Description: Performs mutual authentication of the USIM to the network,** + ** checking whether authentication token AUTN can be accep- ** + ** ted. If so, returns an authentication response RES and ** + ** the ciphering and integrity keys. ** + ** In case of synch failure, returns a re-synchronization ** + ** token AUTS. ** + ** ** + ** Key Generation for Test USIM based on 34.108 ** + ** ** + ** Authentication and key generating function algorithms are ** + ** specified in 3GPP TS 35.206. ** + ** ** + ** Inputs: rand_pP: Random challenge number ** + ** autn_pP: Authentication token ** + ** AUTN = (SQN xor AK) || AMF || MAC ** + ** 48 16 64 bits ** + ** Others: Security key ** + ** ** + ** Outputs: auts_pP: Re-synchronization token ** + ** res_pP: Authentication response ** + ** ck_pP: Ciphering key ** + ** ik_pP Integrity key ** + ** ** + ** Return: RETURNerror, RETURNok ** + ** Others: None ** + ** ** + ***************************************************************************/ +int usim_api_authenticate_test(usim_data_t *usim_data, + const OctetString* rand_pP, const OctetString* autn_pP, + OctetString* auts_pP, OctetString* res_pP, + OctetString* ck_pP, OctetString* ik_pP) +{ + LOG_FUNC_IN; + + int rc; + int i; + + LOG_TRACE(INFO, "USIM-API - rand :%s",dump_octet_string(rand_pP)); + LOG_TRACE(INFO, "USIM-API - autn :%s",dump_octet_string(autn_pP)); + + //step1: XDOUT = RAND xor K + // RES = XDOUT + for (i=0; ivalue[i] = rand_pP->value[i] ^ usim_data->keys.usim_api_k[i]; + } + + //step2: res = f2(xdout,n) + // ck = f3(xdout) + // ik = f4(xdout) + // ak = f5(xdout) + u8 ak[USIM_API_AK_SIZE]; + for (i=0; i<15; i++) + { + ck_pP->value[i] = res_pP->value[i+1]; + } + ck_pP->value[15] = res_pP->value[0]; + + for (i=0; i<14; i++) + { + ik_pP->value[i] = res_pP->value[i+2]; + } + ik_pP->value[14] = res_pP->value[0]; + ik_pP->value[15] = res_pP->value[1]; + + for (i=0; ivalue[i+3]; + } + LOG_TRACE(INFO, "USIM-API - res(f2) :%s",dump_octet_string(res_pP)); + LOG_TRACE(INFO, "USIM-API - ck(f3) :%s",dump_octet_string(ck_pP)); + LOG_TRACE(INFO, "USIM-API - ik(f4) :%s",dump_octet_string(ik_pP)); + LOG_TRACE(INFO, "USIM-API - ak(f5) : %02X%02X%02X%02X%02X%02X", + ak[0],ak[1],ak[2],ak[3],ak[4],ak[5]); + + //step3: concatenate SQN with AMP SQN||AMF + // SQN = AUTN xor ak + u8 sqn[USIM_API_SQN_SIZE]; + for (i = 0; i < USIM_API_SQN_SIZE; i++) { + sqn[i] = autn_pP->value[i] ^ ak[i]; + } + LOG_TRACE(INFO, "USIM-API - Retrieved SQN %02X%02X%02X%02X%02X%02X", + sqn[0],sqn[1],sqn[2],sqn[3],sqn[4],sqn[5]); + LOG_TRACE(INFO, "USIM-API - Retrieved AMF %02X%02X", + autn_pP->value[USIM_API_SQN_SIZE],autn_pP->value[USIM_API_SQN_SIZE+1]); + +#define USIM_API_XMAC_SIZE 8 + u8 cdout[USIM_API_XMAC_SIZE]; + for (i = 0; i < USIM_API_XMAC_SIZE; i++) + { + if(i < USIM_API_SQN_SIZE) + { + cdout[i] = sqn[i]; + } + else + { + cdout[i] = autn_pP->value[i]; + } + } + LOG_TRACE(INFO, "USIM-API - Retrieved CDOUT %02X%02X%02X%02X%02X%02X%02X%02X", + cdout[0],cdout[1],cdout[2],cdout[3],cdout[4],cdout[5],cdout[6],cdout[7]); + + //step4:calculate XMAC from cdout and xdout + u8 xmac[USIM_API_XMAC_SIZE]; + for(i = 0; i < USIM_API_XMAC_SIZE; i++) + { + xmac[i] = res_pP->value[i] ^ cdout[i]; + } + LOG_TRACE(INFO, + "USIM-API - Computed XMAC %02X%02X%02X%02X%02X%02X%02X%02X", + xmac[0],xmac[1],xmac[2],xmac[3], + xmac[4],xmac[5],xmac[6],xmac[7]); + + /* Compare the XMAC with the MAC included in AUTN */ +#define USIM_API_AMF_SIZE 2 + + if ( memcmp(xmac, &autn_pP->value[USIM_API_SQN_SIZE + USIM_API_AMF_SIZE], + USIM_API_XMAC_SIZE) != 0 ) { + LOG_TRACE(INFO, + "USIM-API - Comparing the XMAC with the MAC included in AUTN Failed"); + rc = RETURNerror; + //LOG_FUNC_RETURN (RETURNerror); + } else { + LOG_TRACE(INFO, + "USIM-API - Comparing the XMAC with the MAC included in AUTN Succeeded"); + /* Verify that the received sequence number SQN is in the correct range */ + rc = _usim_api_check_sqn(*(uint32_t*)(sqn), sqn[USIM_API_SQN_SIZE - 1]); + } + + + if (rc != RETURNok) { + /* Synchronisation failure; compute the AUTS parameter */ + + /* Concealed value of the counter SQNms in the USIM: + * Conc(SQNMS) = SQNMS ⊕ f5*K(RAND) */ + f5star(usim_data->keys.usim_api_k, rand_pP->value, ak, usim_data->keys.opc); + + + u8 sqn_ms[USIM_API_SQNMS_SIZE]; + memset(sqn_ms, 0, USIM_API_SQNMS_SIZE); + + //#define USIM_API_SQN_MS_SIZE 3 + printf("usim_data->usim_sqn_data.sqn_ms %p\n", usim_data->usim_sqn_data.sqn_ms); + for (i = 0; i < USIM_API_SQNMS_SIZE; i++) { + //#warning "LG:BUG HERE TODO" + printf("i %d: ((uint8_t*)(usim_data->usim_sqn_data.sqn_ms))[USIM_API_SQNMS_SIZE - i] %d\n",i, ((uint8_t*)(usim_data->usim_sqn_data.sqn_ms))[USIM_API_SQNMS_SIZE - i]); + sqn_ms[USIM_API_SQNMS_SIZE - i] = + ((uint8_t*)(usim_data->usim_sqn_data.sqn_ms))[USIM_API_SQNMS_SIZE - i]; + } + + u8 sqnms[USIM_API_SQNMS_SIZE]; + + for (i = 0; i < USIM_API_SQNMS_SIZE; i++) { + sqnms[i] = sqn_ms[i] ^ ak[i]; + } + + LOG_TRACE(DEBUG, "USIM-API - SQNms %02X%02X%02X%02X%02X%02X", + sqnms[0],sqnms[1],sqnms[2],sqnms[3],sqnms[4],sqnms[5]); + + /* Synchronisation message authentication code: + * MACS = f1*K(SQNMS || RAND || AMF) */ +#define USIM_API_MACS_SIZE USIM_API_XMAC_SIZE + u8 macs[USIM_API_MACS_SIZE]; + f1star(usim_data->keys.usim_api_k, rand_pP->value, sqn_ms, + &rand_pP->value[USIM_API_SQN_SIZE], macs, usim_data->keys.opc); + LOG_TRACE(DEBUG, "USIM-API - MACS %02X%02X%02X%02X%02X%02X%02X%02X", + macs[0],macs[1],macs[2],macs[3], + macs[4],macs[5],macs[6],macs[7]); + + /* Synchronisation authentication token: + * AUTS = Conc(SQNMS) || MACS */ + memcpy(&auts_pP->value[0], sqnms, USIM_API_SQNMS_SIZE); + memcpy(&auts_pP->value[USIM_API_SQNMS_SIZE], macs, USIM_API_MACS_SIZE); + auts_pP->length = USIM_API_SQNMS_SIZE + USIM_API_MACS_SIZE; LOG_FUNC_RETURN (RETURNerror); } - free(path); LOG_FUNC_RETURN (RETURNok); } @@ -208,7 +323,6 @@ int usim_api_write(const usim_data_t* data) ** autn_pP: Authentication token ** ** AUTN = (SQN xor AK) || AMF || MAC ** ** 48 16 64 bits ** - ** Others: Security key ** ** ** ** Outputs: auts_pP: Re-synchronization token ** ** res_pP: Authentication response ** @@ -219,7 +333,7 @@ int usim_api_write(const usim_data_t* data) ** Others: None ** ** ** ***************************************************************************/ -int usim_api_authenticate(const OctetString* rand_pP, const OctetString* autn_pP, +int usim_api_authenticate(usim_data_t *usim_data, const OctetString* rand_pP, const OctetString* autn_pP, OctetString* auts_pP, OctetString* res_pP, OctetString* ck_pP, OctetString* ik_pP) { @@ -237,8 +351,8 @@ int usim_api_authenticate(const OctetString* rand_pP, const OctetString* autn_pP /* Compute the anonymity key AK = f5K (RAND) */ u8 ak[USIM_API_AK_SIZE]; - f2345(_usim_api_k, rand_pP->value, - res_pP->value, ck_pP->value, ik_pP->value, ak); + f2345(usim_data->keys.usim_api_k, rand_pP->value, + res_pP->value, ck_pP->value, ik_pP->value, ak, usim_data->keys.opc); LOG_TRACE(INFO, "USIM-API - res(f2) :%s",dump_octet_string(res_pP)); LOG_TRACE(INFO, "USIM-API - ck(f3) :%s",dump_octet_string(ck_pP)); LOG_TRACE(INFO, "USIM-API - ik(f4) :%s",dump_octet_string(ik_pP)); @@ -259,7 +373,7 @@ int usim_api_authenticate(const OctetString* rand_pP, const OctetString* autn_pP /* Compute XMAC = f1K (SQN || RAND || AMF) */ #define USIM_API_XMAC_SIZE 8 u8 xmac[USIM_API_XMAC_SIZE]; - f1(_usim_api_k, rand_pP->value, sqn, &autn_pP->value[USIM_API_SQN_SIZE], xmac); + f1(usim_data->keys.usim_api_k, rand_pP->value, sqn, &autn_pP->value[USIM_API_SQN_SIZE], xmac, usim_data->keys.opc); LOG_TRACE(DEBUG, "USIM-API - Computed XMAC %02X%02X%02X%02X%02X%02X%02X%02X", xmac[0],xmac[1],xmac[2],xmac[3], @@ -287,19 +401,19 @@ int usim_api_authenticate(const OctetString* rand_pP, const OctetString* autn_pP /* Concealed value of the counter SQNms in the USIM: * Conc(SQNMS) = SQNMS ⊕ f5*K(RAND) */ - f5star(_usim_api_k, rand_pP->value, ak); + f5star(usim_data->keys.usim_api_k, rand_pP->value, ak, usim_data->keys.opc); u8 sqn_ms[USIM_API_SQNMS_SIZE]; memset(sqn_ms, 0, USIM_API_SQNMS_SIZE); //#define USIM_API_SQN_MS_SIZE 3 - printf("_usim_api_data.sqn_ms %p\n",_usim_api_data.sqn_ms); + printf("usim_data->usim_sqn.sqn_ms %p\n",usim_data->usim_sqn_data.sqn_ms); for (i = 0; i < USIM_API_SQNMS_SIZE; i++) { //#warning "LG:BUG HERE TODO" - printf("i %d: ((uint8_t*)(_usim_api_data.sqn_ms))[USIM_API_SQNMS_SIZE - i] %d\n",i, ((uint8_t*)(_usim_api_data.sqn_ms))[USIM_API_SQNMS_SIZE - i]); + printf("i %d: ((uint8_t*)(usim_data->usim_sqn_data.sqn_ms))[USIM_API_SQNMS_SIZE - i] %d\n",i, ((uint8_t*)(usim_data->usim_sqn_data.sqn_ms))[USIM_API_SQNMS_SIZE - i]); sqn_ms[USIM_API_SQNMS_SIZE - i] = - ((uint8_t*)(_usim_api_data.sqn_ms))[USIM_API_SQNMS_SIZE - i]; + ((uint8_t*)(usim_data->usim_sqn_data.sqn_ms))[USIM_API_SQNMS_SIZE - i]; } u8 sqnms[USIM_API_SQNMS_SIZE]; @@ -315,8 +429,8 @@ int usim_api_authenticate(const OctetString* rand_pP, const OctetString* autn_pP * MACS = f1*K(SQNMS || RAND || AMF) */ #define USIM_API_MACS_SIZE USIM_API_XMAC_SIZE u8 macs[USIM_API_MACS_SIZE]; - f1star(_usim_api_k, rand_pP->value, sqn_ms, - &rand_pP->value[USIM_API_SQN_SIZE], macs); + f1star(usim_data->keys.usim_api_k, rand_pP->value, sqn_ms, + &rand_pP->value[USIM_API_SQN_SIZE], macs, usim_data->keys.opc); LOG_TRACE(DEBUG, "USIM-API - MACS %02X%02X%02X%02X%02X%02X%02X%02X", macs[0],macs[1],macs[2],macs[3], macs[4],macs[5],macs[6],macs[7]); @@ -336,57 +450,6 @@ int usim_api_authenticate(const OctetString* rand_pP, const OctetString* autn_pP /********************* L O C A L F U N C T I O N S *********************/ /****************************************************************************/ -/**************************************************************************** - ** ** - ** Name: _usim_api_hex_char_to_hex_value() ** - ** ** - ** Description: Converts an hexadecimal ASCII coded digit into its value. ** - ** ** - ** Inputs: c: A char holding the ASCII coded value ** - ** Others: None ** - ** ** - ** Outputs: None ** - ** Return: Converted value ** - ** Others: None ** - ** ** - ***************************************************************************/ -static uint8_t _usim_api_hex_char_to_hex_value (char c) -{ - if (c >= 'A') { - /* Remove case bit */ - c &= ~('a' ^ 'A'); - - return (c - 'A' + 10); - } else { - return (c - '0'); - } -} - -/**************************************************************************** - ** ** - ** Name: _usim_api_hex_string_to_hex_value() ** - ** ** - ** Description: Converts an hexadecimal ASCII coded string into its value.** - ** ** - ** Inputs: hex_value: A pointer to the location to store the ** - ** conversion result ** - ** size: The size of hex_value in bytes ** - ** Others: None ** - ** ** - ** Outputs: hex_value: Converted value ** - ** Return: None ** - ** Others: None ** - ** ** - ***************************************************************************/ -static void _usim_api_hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size) -{ - int i; - - for (i=0; i < size; i++) { - hex_value[i] = (_usim_api_hex_char_to_hex_value(hex_string[2 * i]) << 4) | _usim_api_hex_char_to_hex_value(hex_string[2 * i + 1]); - } -} - /**************************************************************************** ** ** ** Name: _usim_api_check_sqn() ** diff --git a/openair3/NAS/UE/API/USIM/usim_api.h b/openair3/NAS/UE/API/USIM/usim_api.h index f7e85f95e7..f332b5ffc8 100644 --- a/openair3/NAS/UE/API/USIM/usim_api.h +++ b/openair3/NAS/UE/API/USIM/usim_api.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source usim_api.h @@ -55,6 +48,23 @@ Description Implements the API used by the NAS layer to read/write /********************* G L O B A L C O N S T A N T S *******************/ /****************************************************************************/ +/* + * Subscriber authentication security key + */ +#define USIM_API_K_SIZE 16 +#define USIM_API_K_VALUE "fec86ba6eb707ed08905757b1bb44b8f" + +/* + * The name of the file where are stored data of the USIM application + */ +#define USIM_API_NVRAM_FILENAME ".usim.nvram" + +/* + * The name of the environment variable which defines the directory + * where the USIM application file is located + */ +#define USIM_API_NVRAM_DIRNAME "USIM_DIR" + /****************************************************************************/ /************************ G L O B A L T Y P E S ************************/ /****************************************************************************/ @@ -113,8 +123,27 @@ typedef struct { /* Integrity key */ #define USIM_IK_SIZE 16 Byte_t ik[USIM_IK_SIZE]; + uint8_t usim_api_k[USIM_API_K_SIZE]; + uint8_t opc[16]; } usim_keys_t; +/* + * List of last used Sequence Numbers SQN + */ +#define USIM_API_AK_SIZE 6 +#define USIM_API_SQN_SIZE USIM_API_AK_SIZE +#define USIM_API_SQNMS_SIZE USIM_API_SQN_SIZE + +typedef struct { + /* Highest sequence number the USIM has ever accepted */ + uint8_t sqn_ms[USIM_API_SQNMS_SIZE]; + /* List of the last used sequence numbers */ +#define USIM_API_SQN_LIST_SIZE 32 + uint8_t n_sqns; + uint32_t sqn[USIM_API_SQN_LIST_SIZE]; +} usim_sqn_data_t; + + /* * EPS NAS Security Context * ------------------------ @@ -334,6 +363,9 @@ typedef struct { usim_epsloci_t epsloci; /* Non-Access Stratum configuration */ usim_nasconfig_t nasconfig; + /* usim test mode */ + uint8_t usimtestmode; + usim_sqn_data_t usim_sqn_data; } usim_data_t; /****************************************************************************/ @@ -344,12 +376,16 @@ typedef struct { /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -int usim_api_read(usim_data_t* data); +int usim_api_read(const char *filename, usim_data_t* data); -int usim_api_write(const usim_data_t* data); +int usim_api_write(const char *filename, const usim_data_t* data); -int usim_api_authenticate(const OctetString* rand, const OctetString* autn, +int usim_api_authenticate(usim_data_t *usim_data, const OctetString* rand_pP, const OctetString* autn_pP, OctetString* auts, OctetString* res, OctetString* ck, OctetString* ik); +int usim_api_authenticate_test(usim_data_t *usim_data, + const OctetString* rand, const OctetString* autn, + OctetString* auts, OctetString* res, + OctetString* ck, OctetString* ik); #endif /* __USIM_API_H__*/ diff --git a/openair3/NAS/UE/EMM/Attach.c b/openair3/NAS/UE/EMM/Attach.c old mode 100755 new mode 100644 index 8a589fa0a0..4029c8f702 --- a/openair3/NAS/UE/EMM/Attach.c +++ b/openair3/NAS/UE/EMM/Attach.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source Attach.c @@ -66,6 +59,7 @@ Description Defines the attach related EMM procedure executed by the #include "nas_timer.h" #include "emmData.h" +#include "emm_timers.h" #include "emm_sap.h" #include "esm_sap.h" @@ -97,24 +91,12 @@ static const char *_emm_attach_type_str[] = { /* * Timer handlers */ -void *_emm_attach_t3410_handler(void *); -static void *_emm_attach_t3411_handler(void *); -static void *_emm_attach_t3402_handler(void *); +static void *_emm_attach_t3411_handler(void *args); /* * Abnormal case attach procedure */ -static void _emm_attach_abnormal_cases_bcd(emm_sap_t *); - -/* - * Internal data used for attach procedure - */ -static struct { -#define EMM_ATTACH_COUNTER_MAX 5 - unsigned int attempt_count; /* Counter used to limit the number of - * subsequently rejected attach attempts */ -} _emm_attach_data = {0}; - +static void _emm_attach_abnormal_cases_bcd(nas_user_t *user, emm_sap_t *); /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ @@ -140,14 +122,14 @@ static struct { ** INITIATED. ** ** ** ** Inputs: type: Type of the requested attach ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** ** Others: T3402, T3410, T3411 ** ** ** ***************************************************************************/ -int emm_proc_attach(emm_proc_attach_type_t type) +int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type) { LOG_FUNC_IN; @@ -155,13 +137,14 @@ int emm_proc_attach(emm_proc_attach_type_t type) emm_as_establish_t *emm_as = &emm_sap.u.emm_as.u.establish; esm_sap_t esm_sap; int rc; + emm_timers_t *emm_timers = user->emm_data->emm_timers; LOG_TRACE(INFO, "EMM-PROC - Initiate EPS attach type = %s (%d)", _emm_attach_type_str[type], type); /* Update the emergency bearer service indicator */ if (type == EMM_ATTACH_TYPE_EMERGENCY) { - _emm_data.is_emergency = TRUE; + user->emm_data->is_emergency = TRUE; } /* Setup initial NAS information message to transfer */ @@ -170,7 +153,7 @@ int emm_proc_attach(emm_proc_attach_type_t type) emm_as->type = type; /* Set the RRC connection establishment cause */ - if (_emm_data.is_emergency) { + if (user->emm_data->is_emergency) { emm_as->RRCcause = NET_ESTABLISH_CAUSE_EMERGENCY; emm_as->RRCtype = NET_ESTABLISH_TYPE_EMERGENCY_CALLS; } else { @@ -179,7 +162,7 @@ int emm_proc_attach(emm_proc_attach_type_t type) } /* Set the PLMN identifier of the selected PLMN */ - emm_as->plmnID = &_emm_data.splmn; + emm_as->plmnID = &user->emm_data->splmn; /* * Process the EPS mobile identity */ @@ -189,55 +172,55 @@ int emm_proc_attach(emm_proc_attach_type_t type) emm_as->UEid.imei = NULL; /* Check whether the UE is configured for "AttachWithIMSI" */ - if (_emm_data.AttachWithImsi) { + if (user->emm_data->AttachWithImsi) { /* Check whether the selected PLMN is neither the registered PLMN * nor in the list of equivalent PLMNs */ - if ( (!_emm_data.is_rplmn) && (!_emm_data.is_eplmn) ) { + if ( (!user->emm_data->is_rplmn) && (!user->emm_data->is_eplmn) ) { LOG_TRACE(INFO, "EMM-PROC - Initiate EPS attach with IMSI"); /* Include the IMSI */ - emm_as->UEid.imsi = _emm_data.imsi; + emm_as->UEid.imsi = user->emm_data->imsi; } else { LOG_TRACE(INFO, "EMM-PROC - Initiate EPS attach with NO IMSI, is registered PLMN %d, is equivalent PLMN %d", - _emm_data.is_rplmn, - _emm_data.is_eplmn); + user->emm_data->is_rplmn, + user->emm_data->is_eplmn); } - } else if (_emm_data.guti) { + } else if (user->emm_data->guti) { LOG_TRACE(INFO, "EMM-PROC - Initiate EPS attach with GUTI"); /* Include a valid GUTI and the last visited registered TAI */ - emm_as->UEid.guti = _emm_data.guti; - emm_as->UEid.tai = _emm_data.tai; - } else if (!_emm_data.is_emergency) { + emm_as->UEid.guti = user->emm_data->guti; + emm_as->UEid.tai = user->emm_data->tai; + } else if (!user->emm_data->is_emergency) { LOG_TRACE(INFO, "EMM-PROC - Initiate EPS attach with IMSI cause is no emergency and no GUTI"); /* Include the IMSI if no valid GUTI is available */ - emm_as->UEid.imsi = _emm_data.imsi; + emm_as->UEid.imsi = user->emm_data->imsi; } else { /* The UE is attaching for emergency bearer services and * does not hold a valid GUTI */ - if (_emm_data.imsi) { + if (user->emm_data->imsi) { /* Include the IMSI if valid (USIM is present) */ LOG_TRACE(INFO, "EMM-PROC - Initiate EPS attach with IMSI cause is emergency and no GUTI"); - emm_as->UEid.imsi = _emm_data.imsi; + emm_as->UEid.imsi = user->emm_data->imsi; } else { LOG_TRACE(INFO, "EMM-PROC - Initiate EPS attach with IMSI cause is emergency and no GUTI and no IMSI"); /* Include the IMEI if the IMSI is not valid */ - emm_as->UEid.imei = _emm_data.imei; + emm_as->UEid.imei = user->emm_data->imei; } } /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_as->sctx, _emm_data.security, FALSE, FALSE); + emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, FALSE, FALSE); emm_as->ksi = EMM_AS_NO_KEY_AVAILABLE; - if (_emm_data.security) { - if (_emm_data.security->type != EMM_KSI_NOT_AVAILABLE) { - emm_as->ksi = _emm_data.security->eksi; + if (user->emm_data->security) { + if (user->emm_data->security->type != EMM_KSI_NOT_AVAILABLE) { + emm_as->ksi = user->emm_data->security->eksi; } - LOG_TRACE(INFO, "EMM-PROC - eps_encryption 0x%X", _emm_data.security->capability.eps_encryption); - LOG_TRACE(INFO, "EMM-PROC - eps_integrity 0x%X", _emm_data.security->capability.eps_integrity); - emm_as->encryption = _emm_data.security->capability.eps_encryption; - emm_as->integrity = _emm_data.security->capability.eps_integrity; + LOG_TRACE(INFO, "EMM-PROC - eps_encryption 0x%X", user->emm_data->security->capability.eps_encryption); + LOG_TRACE(INFO, "EMM-PROC - eps_integrity 0x%X", user->emm_data->security->capability.eps_integrity); + emm_as->encryption = user->emm_data->security->capability.eps_encryption; + emm_as->integrity = user->emm_data->security->capability.eps_integrity; } /* @@ -251,15 +234,15 @@ int emm_proc_attach(emm_proc_attach_type_t type) /* TODO: PDN type should be set according to the IP capability of the UE */ esm_sap.data.pdn_connect.pdn_type = NET_PDN_TYPE_IPV4; esm_sap.data.pdn_connect.apn = NULL; - esm_sap.data.pdn_connect.is_emergency = _emm_data.is_emergency; - rc = esm_sap_send(&esm_sap); + esm_sap.data.pdn_connect.is_emergency = user->emm_data->is_emergency; + rc = esm_sap_send(user, &esm_sap); if (rc != RETURNerror) { /* Setup EMM procedure handler to be executed upon receiving * lower layer notification */ - rc = emm_proc_lowerlayer_initialize(emm_proc_attach_request, + rc = emm_proc_lowerlayer_initialize(user->lowerlayer_data, emm_proc_attach_request, emm_proc_attach_failure, - emm_proc_attach_release, NULL); + emm_proc_attach_release, user); if (rc != RETURNok) { LOG_TRACE(WARNING, "Failed to initialize EMM procedure handler"); @@ -267,12 +250,12 @@ int emm_proc_attach(emm_proc_attach_type_t type) } /* Start T3410 timer */ - T3410.id = nas_timer_start(T3410.sec, _emm_attach_t3410_handler, NULL); + emm_timers->T3410.id = nas_timer_start(emm_timers->T3410.sec, emm_attach_t3410_handler, user); LOG_TRACE(INFO,"EMM-PROC - Timer T3410 (%d) expires in %ld seconds", - T3410.id, T3410.sec); + emm_timers->T3410.id, emm_timers->T3410.sec); /* Stop T3402 and T3411 timers if running */ - T3402.id = nas_timer_stop(T3402.id); - T3411.id = nas_timer_stop(T3411.id); + emm_timers->T3402.id = nas_timer_stop(emm_timers->T3402.id); + emm_timers->T3411.id = nas_timer_stop(emm_timers->T3411.id); /* * Notify EMM-AS SAP that a RRC connection establishment procedure @@ -283,7 +266,7 @@ int emm_proc_attach(emm_proc_attach_type_t type) /* Get the PDN connectivity request to transfer within the ESM * container of the initial attach request message */ emm_sap.u.emm_as.u.establish.NASmsg = esm_sap.send; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } LOG_FUNC_RETURN(rc); @@ -308,7 +291,7 @@ int emm_proc_attach(emm_proc_attach_type_t type) int emm_proc_attach_request(void *args) { LOG_FUNC_IN; - + nas_user_t *user=args; emm_sap_t emm_sap; int rc; @@ -316,7 +299,7 @@ int emm_proc_attach_request(void *args) * Notify EMM that Attach Request has been sent to the network */ emm_sap.primitive = EMMREG_ATTACH_REQ; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN(rc); } @@ -349,10 +332,10 @@ int emm_proc_attach_request(void *args) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data, T3412, T3402, T3423 ** + ** Others: user->emm_data-> T3412, T3402, T3423 ** ** ** ***************************************************************************/ -int emm_proc_attach_accept(long t3412, long t3402, long t3423, +int emm_proc_attach_accept(nas_user_t *user, long t3412, long t3402, long t3423, int n_tais, tai_t *tai, GUTI_t *guti, int n_eplmns, plmn_t *eplmn, const OctetString *esm_msg_pP) @@ -364,51 +347,52 @@ int emm_proc_attach_accept(long t3412, long t3402, long t3423, int rc; int i; int j; + emm_timers_t *emm_timers = user->emm_data->emm_timers; LOG_TRACE(INFO, "EMM-PROC - EPS attach accepted by the network"); /* Stop timer T3410 */ - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", T3410.id); - T3410.id = nas_timer_stop(T3410.id); + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", emm_timers->T3410.id); + emm_timers->T3410.id = nas_timer_stop(emm_timers->T3410.id); /* Delete old TAI list and store the received TAI list */ - _emm_data.ltai.n_tais = n_tais; + user->emm_data->ltai.n_tais = n_tais; for (i = 0; (i < n_tais) && (i < EMM_DATA_TAI_MAX); i++) { - _emm_data.ltai.tai[i] = tai[i]; + user->emm_data->ltai.tai[i] = tai[i]; } /* Update periodic tracking area update timer value */ - T3412.sec = t3412; + emm_timers->T3412.sec = t3412; /* Update attach failure timer value */ if ( !(t3402 < 0) ) { - T3402.sec = t3402; + emm_timers->T3402.sec = t3402; } /* Update E-UTRAN deactivate ISR timer value */ if ( !(t3423 < 0) ) { - T3423.sec = t3423; + emm_timers->T3423.sec = t3423; } /* Delete old GUTI and store the new assigned GUTI if provided */ if (guti) { - *_emm_data.guti = *guti; + *user->emm_data->guti = *guti; } /* Update the stored list of equivalent PLMNs */ - _emm_data.nvdata.eplmn.n_plmns = 0; + user->emm_data->nvdata.eplmn.n_plmns = 0; if (n_eplmns > 0) { for (i = 0; (i < n_eplmns) && (i < EMM_DATA_EPLMN_MAX); i++) { int is_forbidden = FALSE; - if (!_emm_data.is_emergency) { + if (!user->emm_data->is_emergency) { /* If the attach procedure is not for emergency bearer * services, the UE shall remove from the list any PLMN * code that is already in the list of forbidden PLMNs */ - for (j = 0; j < _emm_data.fplmn.n_plmns; j++) { - if (PLMNS_ARE_EQUAL(eplmn[i], _emm_data.fplmn.plmn[j])) { + for (j = 0; j < user->emm_data->fplmn.n_plmns; j++) { + if (PLMNS_ARE_EQUAL(eplmn[i], user->emm_data->fplmn.plmn[j])) { is_forbidden = TRUE; break; } @@ -416,15 +400,15 @@ int emm_proc_attach_accept(long t3412, long t3402, long t3423, } if ( !is_forbidden ) { - _emm_data.nvdata.eplmn.plmn[_emm_data.nvdata.eplmn.n_plmns++] = + user->emm_data->nvdata.eplmn.plmn[user->emm_data->nvdata.eplmn.n_plmns++] = eplmn[i]; } } /* Add the PLMN code of the registered PLMN that sent the list */ - if (_emm_data.nvdata.eplmn.n_plmns < EMM_DATA_EPLMN_MAX) { - _emm_data.nvdata.eplmn.plmn[_emm_data.nvdata.eplmn.n_plmns++] = - _emm_data.splmn; + if (user->emm_data->nvdata.eplmn.n_plmns < EMM_DATA_EPLMN_MAX) { + user->emm_data->nvdata.eplmn.plmn[user->emm_data->nvdata.eplmn.n_plmns++] = + user->emm_data->splmn; } } @@ -434,14 +418,14 @@ int emm_proc_attach_accept(long t3412, long t3402, long t3423, esm_sap.primitive = ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REQ; esm_sap.is_standalone = FALSE; esm_sap.recv = esm_msg_pP; - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); if ( (rc != RETURNerror) && (esm_sap.err == ESM_SAP_SUCCESS) ) { /* Setup EMM procedure handler to be executed upon receiving * lower layer notification */ - rc = emm_proc_lowerlayer_initialize(emm_proc_attach_complete, + rc = emm_proc_lowerlayer_initialize(user->lowerlayer_data, emm_proc_attach_complete, emm_proc_attach_failure, - NULL, NULL); + NULL, user); if (rc != RETURNok) { LOG_TRACE(WARNING, @@ -455,17 +439,17 @@ int emm_proc_attach_accept(long t3412, long t3402, long t3423, * be sent to the network */ emm_sap.primitive = EMMAS_DATA_REQ; - emm_sap.u.emm_as.u.data.guti = _emm_data.guti; - emm_sap.u.emm_as.u.data.ueid = 0; + emm_sap.u.emm_as.u.data.guti = user->emm_data->guti; + emm_sap.u.emm_as.u.data.ueid = user->ueid; /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.data.sctx, - _emm_data.security, FALSE, TRUE); + user->emm_data->security, FALSE, TRUE); /* Get the activate default EPS bearer context accept message * to be transfered within the ESM container of the attach * complete message */ emm_sap.u.emm_as.u.data.NASinfo = EMM_AS_NAS_DATA_ATTACH; emm_sap.u.emm_as.u.data.NASmsg = esm_sap.send; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } else if (esm_sap.err != ESM_SAP_DISCARDED) { /* 3GPP TS 24.301, section 5.5.1.2.6, case j * If the ACTIVATE DEFAULT BEARER CONTEXT REQUEST message combined @@ -474,7 +458,7 @@ int emm_proc_attach_accept(long t3412, long t3402, long t3423, * procedure by sending a DETACH REQUEST message to the network. */ emm_sap.primitive = EMMREG_DETACH_INIT; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } else { /* * ESM procedure failed and, received message has been discarded or @@ -504,22 +488,23 @@ int emm_proc_attach_accept(long t3412, long t3402, long t3423, ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data, _emm_attach_data, T3410 ** ** ** ***************************************************************************/ -int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg_pP) +int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *esm_msg_pP) { LOG_FUNC_IN; emm_sap_t emm_sap; int rc; + emm_timers_t *emm_timers = user->emm_data->emm_timers; + emm_attach_data_t *emm_attach_data = user->emm_data->emm_attach_data; LOG_TRACE(WARNING, "EMM-PROC - EPS attach rejected by the network, " "EMM cause = %d", emm_cause); /* Stop timer T3410 */ - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", T3410.id); - T3410.id = nas_timer_stop(T3410.id); + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", emm_timers->T3410.id); + emm_timers->T3410.id = nas_timer_stop(emm_timers->T3410.id); /* Update the EPS update status, the GUTI, the visited registered TAI and * the eKSI */ @@ -535,15 +520,15 @@ int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg_pP) case EMM_CAUSE_ROAMING_NOT_ALLOWED: case EMM_CAUSE_NO_SUITABLE_CELLS: /* Set the EPS update status to EU3 ROAMING NOT ALLOWED */ - _emm_data.status = EU3_ROAMING_NOT_ALLOWED; + user->emm_data->status = EU3_ROAMING_NOT_ALLOWED; /* Delete the GUTI */ - _emm_data.guti = NULL; + user->emm_data->guti = NULL; /* Delete the last visited registered TAI */ - _emm_data.tai = NULL; + user->emm_data->tai = NULL; /* Delete the eKSI */ - if (_emm_data.security) { - _emm_data.security->type = EMM_KSI_NOT_AVAILABLE; + if (user->emm_data->security) { + user->emm_data->security->type = EMM_KSI_NOT_AVAILABLE; } break; @@ -559,34 +544,34 @@ int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg_pP) case EMM_CAUSE_EPS_NOT_ALLOWED: case EMM_CAUSE_BOTH_NOT_ALLOWED: /* Consider the USIM as invalid for EPS services */ - _emm_data.usim_is_valid = FALSE; + user->emm_data->usim_is_valid = FALSE; /* Delete the list of equivalent PLMNs */ - _emm_data.nvdata.eplmn.n_plmns = 0; + user->emm_data->nvdata.eplmn.n_plmns = 0; break; case EMM_CAUSE_PLMN_NOT_ALLOWED: case EMM_CAUSE_NOT_AUTHORIZED_IN_PLMN: case EMM_CAUSE_ROAMING_NOT_ALLOWED: /* Delete the list of equivalent PLMNs */ - _emm_data.nvdata.eplmn.n_plmns = 0; + user->emm_data->nvdata.eplmn.n_plmns = 0; /* Reset the attach attempt counter */ - _emm_attach_data.attempt_count = 0; + emm_attach_data->attempt_count = 0; break; case EMM_CAUSE_TA_NOT_ALLOWED: case EMM_CAUSE_EPS_NOT_ALLOWED_IN_PLMN: case EMM_CAUSE_NO_SUITABLE_CELLS: /* Reset the attach attempt counter */ - _emm_attach_data.attempt_count = 0; + emm_attach_data->attempt_count = 0; break; case EMM_CAUSE_ESM_FAILURE: /* 3GPP TS 24.301, section 5.5.1.2.6, case d */ - if (_emm_data.NAS_SignallingPriority != 1) { + if (user->emm_data->NAS_SignallingPriority != 1) { /* The UE is not configured for NAS signalling low priority; * set the attach attempt counter to 5 */ - _emm_attach_data.attempt_count = EMM_ATTACH_COUNTER_MAX; + emm_attach_data->attempt_count = EMM_ATTACH_COUNTER_MAX; } break; @@ -598,7 +583,7 @@ int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg_pP) case EMM_CAUSE_PROTOCOL_ERROR: /* 3GPP TS 24.301, section 5.5.1.2.6, case d * Set the attach attempt counter to 5 */ - _emm_attach_data.attempt_count = EMM_ATTACH_COUNTER_MAX; + emm_attach_data->attempt_count = EMM_ATTACH_COUNTER_MAX; break; default : @@ -610,25 +595,25 @@ int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg_pP) case EMM_CAUSE_PLMN_NOT_ALLOWED: case EMM_CAUSE_NOT_AUTHORIZED_IN_PLMN: /* Store the PLMN identity in the "forbidden PLMN list" */ - _emm_data.fplmn.plmn[_emm_data.fplmn.n_plmns++] = _emm_data.splmn; + user->emm_data->fplmn.plmn[user->emm_data->fplmn.n_plmns++] = user->emm_data->splmn; break; case EMM_CAUSE_TA_NOT_ALLOWED: /* Store the current TAI in the list of "forbidden tracking * areas for regional provision of service" */ - _emm_data.ftai.tai[_emm_data.ftai.n_tais++] = *_emm_data.tai; + user->emm_data->ftai.tai[user->emm_data->ftai.n_tais++] = *user->emm_data->tai; break; case EMM_CAUSE_ROAMING_NOT_ALLOWED: /* Store the current TAI in the list of "forbidden tracking * areas for roaming" */ - _emm_data.ftai_roaming.tai[_emm_data.ftai_roaming.n_tais++] = *_emm_data.tai; + user->emm_data->ftai_roaming.tai[user->emm_data->ftai_roaming.n_tais++] = *user->emm_data->tai; break; case EMM_CAUSE_EPS_NOT_ALLOWED_IN_PLMN: /* Store the PLMN identity in the "forbidden PLMNs for GPRS * service" list */ - _emm_data.fplmn_gprs.plmn[_emm_data.fplmn_gprs.n_plmns++] = _emm_data.splmn; + user->emm_data->fplmn_gprs.plmn[user->emm_data->fplmn_gprs.n_plmns++] = user->emm_data->splmn; break; default : @@ -669,7 +654,7 @@ int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg_pP) break; case EMM_CAUSE_IMEI_NOT_ACCEPTED: - if (_emm_data.is_emergency) { + if (user->emm_data->is_emergency) { /* * Notify EMM that the UE failed to register to the network * for emergency bearer services because "IMEI not accepted" @@ -683,11 +668,11 @@ int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg_pP) default : /* Other values are considered as abnormal cases * 3GPP TS 24.301, section 5.5.1.2.6, case d */ - _emm_attach_abnormal_cases_bcd(&emm_sap); + _emm_attach_abnormal_cases_bcd(user, &emm_sap); break; } - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); /* * Notify ESM that the network rejected connectivity to the PDN @@ -697,7 +682,7 @@ int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg_pP) esm_sap.primitive = ESM_PDN_CONNECTIVITY_REJ; esm_sap.is_standalone = FALSE; esm_sap.recv = esm_msg_pP; - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); } LOG_FUNC_RETURN(rc); @@ -721,13 +706,14 @@ int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg_pP) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data, _emm_attach_data ** ** ** ***************************************************************************/ int emm_proc_attach_complete(void *args) { LOG_FUNC_IN; + nas_user_t *user = args; + emm_attach_data_t *emm_attach_data = user->emm_data->emm_attach_data; emm_sap_t emm_sap; esm_sap_t esm_sap; int rc; @@ -735,22 +721,22 @@ int emm_proc_attach_complete(void *args) LOG_TRACE(INFO, "EMM-PROC - EPS attach complete"); /* Reset EMM procedure handler */ - (void) emm_proc_lowerlayer_initialize(NULL, NULL, NULL, NULL); + emm_proc_lowerlayer_initialize(user->lowerlayer_data, NULL, NULL, NULL, NULL); /* Reset the attach attempt counter */ - _emm_attach_data.attempt_count = 0; + emm_attach_data->attempt_count = 0; /* TODO: Reset the tracking area updating attempt counter */ /* Set the EPS update status to EU1 UPDATED */ - _emm_data.status = EU1_UPDATED; - _emm_data.is_attached = TRUE; + user->emm_data->status = EU1_UPDATED; + user->emm_data->is_attached = TRUE; /* * Notify EMM that network attach complete message has been delivered * to the network */ emm_sap.primitive = EMMREG_ATTACH_CNF; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { /* @@ -760,7 +746,7 @@ int emm_proc_attach_complete(void *args) */ esm_sap.primitive = ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_CNF; esm_sap.is_standalone = FALSE; - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); } LOG_FUNC_RETURN(rc); @@ -793,19 +779,20 @@ int emm_proc_attach_complete(void *args) int emm_proc_attach_failure(int is_initial, void *args) { LOG_FUNC_IN; - int rc = RETURNok; esm_sap_t esm_sap; + nas_user_t *user=args; + emm_timers_t *emm_timers = user->emm_data->emm_timers; LOG_TRACE(WARNING, "EMM-PROC - EPS attach failure"); /* Reset EMM procedure handler */ - (void) emm_proc_lowerlayer_initialize(NULL, NULL, NULL, NULL); + emm_proc_lowerlayer_initialize(user->lowerlayer_data, NULL, NULL, NULL, NULL); /* Stop timer T3410 if still running */ - if (T3410.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", T3410.id); - T3410.id = nas_timer_stop(T3410.id); + if (emm_timers->T3410.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", emm_timers->T3410.id); + emm_timers->T3410.id = nas_timer_stop(emm_timers->T3410.id); } if (is_initial) { @@ -828,13 +815,13 @@ int emm_proc_attach_failure(int is_initial, void *args) esm_sap.recv = NULL; } - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); if (rc != RETURNerror) { /* Start T3411 timer */ - T3411.id = nas_timer_start(T3411.sec, _emm_attach_t3411_handler, NULL); + emm_timers->T3411.id = nas_timer_start(emm_timers->T3411.sec, _emm_attach_t3411_handler, NULL); LOG_TRACE(INFO, "EMM-PROC - Timer T3411 (%d) expires in %ld seconds", - T3411.id, T3411.sec); + emm_timers->T3411.id, emm_timers->T3411.sec); } LOG_FUNC_RETURN(rc); @@ -862,16 +849,16 @@ int emm_proc_attach_failure(int is_initial, void *args) int emm_proc_attach_release(void *args) { LOG_FUNC_IN; - + nas_user_t *user=args; emm_sap_t emm_sap; int rc; LOG_TRACE(WARNING, "EMM-PROC - NAS signalling connection released"); /* Execute abnormal case attach procedure */ - _emm_attach_abnormal_cases_bcd(&emm_sap); + _emm_attach_abnormal_cases_bcd(user, &emm_sap); - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN(rc); } @@ -890,7 +877,7 @@ int emm_proc_attach_release(void *args) ** Others: None ** ** ** ***************************************************************************/ -int emm_proc_attach_restart(void) +int emm_proc_attach_restart(nas_user_t *user) { LOG_FUNC_IN; @@ -903,8 +890,8 @@ int emm_proc_attach_restart(void) * Notify EMM that the attach procedure has to be restarted */ emm_sap.primitive = EMMREG_ATTACH_INIT; - emm_sap.u.emm_reg.u.attach.is_emergency = _emm_data.is_emergency; - rc = emm_sap_send(&emm_sap); + emm_sap.u.emm_reg.u.attach.is_emergency = user->emm_data->is_emergency; + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN(rc); } @@ -920,17 +907,17 @@ int emm_proc_attach_restart(void) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ***************************************************************************/ -int emm_proc_attach_set_emergency(void) +int emm_proc_attach_set_emergency(emm_data_t *emm_data) { LOG_FUNC_IN; LOG_TRACE(WARNING, "EMM-PROC - UE is now attached to the network for " "emergency bearer services only"); - _emm_data.is_emergency = TRUE; + emm_data->is_emergency = TRUE; LOG_FUNC_RETURN(RETURNok); } @@ -947,26 +934,27 @@ int emm_proc_attach_set_emergency(void) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ***************************************************************************/ -int emm_proc_attach_set_detach(void) +int emm_proc_attach_set_detach(void *nas_user) { LOG_FUNC_IN; + nas_user_t *user=nas_user; int rc; LOG_TRACE(WARNING, "EMM-PROC - UE is now locally detached from the network"); /* Reset the network attachment indicator */ - _emm_data.is_attached = FALSE; + user->emm_data->is_attached = FALSE; /* * Notify that the UE is locally detached from the network */ emm_sap_t emm_sap; emm_sap.primitive = EMMREG_DETACH_CNF; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN(rc); } @@ -1002,25 +990,27 @@ int emm_proc_attach_set_detach(void) ** Others: T3410 ** ** ** ***************************************************************************/ -void *_emm_attach_t3410_handler(void *args) +void *emm_attach_t3410_handler(void *args) { LOG_FUNC_IN; + nas_user_t *user=args; + emm_timers_t *emm_timers = user->emm_data->emm_timers; emm_sap_t emm_sap; int rc; LOG_TRACE(WARNING, "EMM-PROC - T3410 timer expired"); /* Stop T3410 timer */ - T3410.id = nas_timer_stop(T3410.id); + emm_timers->T3410.id = nas_timer_stop(emm_timers->T3410.id); /* Execute abnormal case attach procedure */ - _emm_attach_abnormal_cases_bcd(&emm_sap); + _emm_attach_abnormal_cases_bcd(user, &emm_sap); - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { /* Locally release the NAS signalling connection */ - _emm_data.ecm_status = ECM_IDLE; + user->emm_data->ecm_status = ECM_IDLE; } LOG_FUNC_RETURN(NULL); @@ -1048,20 +1038,22 @@ static void *_emm_attach_t3411_handler(void *args) { LOG_FUNC_IN; + nas_user_t *user=args; + emm_timers_t *emm_timers = user->emm_data->emm_timers; emm_sap_t emm_sap; LOG_TRACE(WARNING, "EMM-PROC - T3411 timer expired"); /* Stop T3411 timer */ - T3411.id = nas_timer_stop(T3411.id); + emm_timers->T3411.id = nas_timer_stop(emm_timers->T3411.id); /* * Notify EMM that timer T3411 expired and attach procedure has to be * restarted */ emm_sap.primitive = EMMREG_ATTACH_INIT; - emm_sap.u.emm_reg.u.attach.is_emergency = _emm_data.is_emergency; + emm_sap.u.emm_reg.u.attach.is_emergency = user->emm_data->is_emergency; - (void) emm_sap_send(&emm_sap); + (void) emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN(NULL); } @@ -1085,29 +1077,31 @@ static void *_emm_attach_t3411_handler(void *args) ** ** ** Outputs: None ** ** Return: None ** - ** Others: _emm_attach_data, T3402 ** ** ** ***************************************************************************/ static void *_emm_attach_t3402_handler(void *args) { LOG_FUNC_IN; + nas_user_t *user = args; + emm_timers_t *emm_timers = user->emm_data->emm_timers; + emm_attach_data_t *emm_attach_data = user->emm_data->emm_attach_data; emm_sap_t emm_sap; LOG_TRACE(WARNING, "EMM-PROC - T3402 timer expired"); /* Stop T3402 timer */ - T3402.id = nas_timer_stop(T3402.id); + emm_timers->T3402.id = nas_timer_stop(emm_timers->T3402.id); /* Reset the attach attempt counter */ - _emm_attach_data.attempt_count = 0; + emm_attach_data->attempt_count = 0; /* * Notify EMM that timer T3402 expired and attach procedure has to be * restarted */ emm_sap.primitive = EMMREG_ATTACH_INIT; - emm_sap.u.emm_reg.u.attach.is_emergency = _emm_data.is_emergency; + emm_sap.u.emm_reg.u.attach.is_emergency = user->emm_data->is_emergency; - (void) emm_sap_send(&emm_sap); + (void) emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN(NULL); } @@ -1135,30 +1129,30 @@ static void *_emm_attach_t3402_handler(void *args) ** ** ** Outputs: emm_sap: EMM service access point ** ** Return: None ** - ** Others: _emm_data, _emm_attach_data, T3402, T3410, ** ** T3411 ** ** ** ***************************************************************************/ -static void _emm_attach_abnormal_cases_bcd(emm_sap_t *emm_sap) +static void _emm_attach_abnormal_cases_bcd(nas_user_t *user, emm_sap_t *emm_sap) { LOG_FUNC_IN; - + emm_timers_t *emm_timers = user->emm_data->emm_timers; + emm_attach_data_t *emm_attach_data = user->emm_data->emm_attach_data; LOG_TRACE(WARNING, "EMM-PROC - Abnormal case, attach counter = %d", - _emm_attach_data.attempt_count); + emm_attach_data->attempt_count); /* Stop timer T3410 */ - if (T3410.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", T3410.id); - T3410.id = nas_timer_stop(T3410.id); + if (emm_timers->T3410.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", emm_timers->T3410.id); + emm_timers->T3410.id = nas_timer_stop(emm_timers->T3410.id); } - if (_emm_attach_data.attempt_count < EMM_ATTACH_COUNTER_MAX) { + if (emm_attach_data->attempt_count < EMM_ATTACH_COUNTER_MAX) { /* Increment the attach attempt counter */ - _emm_attach_data.attempt_count += 1; + emm_attach_data->attempt_count += 1; /* Start T3411 timer */ - T3411.id = nas_timer_start(T3411.sec, _emm_attach_t3411_handler, NULL); + emm_timers->T3411.id = nas_timer_start(emm_timers->T3411.sec, _emm_attach_t3411_handler, NULL); LOG_TRACE(INFO, "EMM-PROC - Timer T3411 (%d) expires in %ld seconds", - T3411.id, T3411.sec); + emm_timers->T3411.id, emm_timers->T3411.sec); /* * Notify EMM that the attempt to attach for EPS services failed and * the attach attempt counter didn't reach its maximum value; network @@ -1167,26 +1161,26 @@ static void _emm_attach_abnormal_cases_bcd(emm_sap_t *emm_sap) emm_sap->primitive = EMMREG_ATTACH_FAILED; } else { /* Delete the GUTI */ - _emm_data.guti = NULL; + user->emm_data->guti = NULL; /* Delete the TAI list */ - _emm_data.ltai.n_tais = 0; + user->emm_data->ltai.n_tais = 0; /* Delete the last visited registered TAI */ - _emm_data.tai = NULL; + user->emm_data->tai = NULL; /* Delete the list of equivalent PLMNs */ - _emm_data.nvdata.eplmn.n_plmns = 0; + user->emm_data->nvdata.eplmn.n_plmns = 0; /* Delete the eKSI */ - if (_emm_data.security) { - _emm_data.security->type = EMM_KSI_NOT_AVAILABLE; + if (user->emm_data->security) { + user->emm_data->security->type = EMM_KSI_NOT_AVAILABLE; } /* Set the EPS update status to EU2 NOT UPDATED */ - _emm_data.status = EU2_NOT_UPDATED; + user->emm_data->status = EU2_NOT_UPDATED; /* Start T3402 timer */ - T3402.id = nas_timer_start(T3402.sec, _emm_attach_t3402_handler, NULL); + emm_timers->T3402.id = nas_timer_start(emm_timers->T3402.sec, _emm_attach_t3402_handler, user); LOG_TRACE(INFO, "EMM-PROC - Timer T3402 (%d) expires in %ld seconds", - T3402.id, T3402.sec); + emm_timers->T3402.id, emm_timers->T3402.sec); /* * Notify EMM that the attempt to attach for EPS services failed and * the attach attempt counter reached its maximum value. diff --git a/openair3/NAS/UE/EMM/Authentication.c b/openair3/NAS/UE/EMM/Authentication.c old mode 100755 new mode 100644 index 6285534450..5b10e60893 --- a/openair3/NAS/UE/EMM/Authentication.c +++ b/openair3/NAS/UE/EMM/Authentication.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source Authentication.c @@ -66,25 +59,22 @@ Description Defines the authentication EMM procedure executed by the #include "nas_timer.h" #include "emmData.h" +#include "emm_timers.h" #include "emm_sap.h" #include "emm_cause.h" +#include "emm_timers.h" #include "usim_api.h" #include "secu_defs.h" +#include "Authentication.h" /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ -/* - * Retransmission timer handlers - */ -extern void *_emm_attach_t3410_handler(void *); -extern void *_emm_service_t3417_handler(void *); -extern void *_emm_detach_t3421_handler(void *); -extern void *_emm_tau_t3430_handler(void *); +extern uint8_t usim_test; /****************************************************************************/ /******************* L O C A L D E F I N I T I O N S *******************/ @@ -102,34 +92,15 @@ static void *_authentication_t3416_handler(void *); static void *_authentication_t3418_handler(void *); static void *_authentication_t3420_handler(void *); -/* - * Internal data used for authentication procedure - */ -static struct { - uint8_t rand[AUTH_RAND_SIZE]; /* Random challenge number */ - uint8_t res[AUTH_RES_SIZE]; /* Authentication response */ - uint8_t ck[AUTH_CK_SIZE]; /* Ciphering key */ - uint8_t ik[AUTH_IK_SIZE]; /* Integrity key */ -#define AUTHENTICATION_T3410 0x01 -#define AUTHENTICATION_T3417 0x02 -#define AUTHENTICATION_T3421 0x04 -#define AUTHENTICATION_T3430 0x08 - unsigned char timers; /* Timer restart bitmap */ -#define AUTHENTICATION_COUNTER_MAX 3 - unsigned char mac_count:2; /* MAC failure counter (#20) */ - unsigned char umts_count:2; /* UMTS challenge failure counter (#26) */ - unsigned char sync_count:2; /* Sync failure counter (#21) */ -} _authentication_data; - /* * Abnormal case authentication procedure */ -static int _authentication_abnormal_cases_cde(int emm_cause, +static int _authentication_abnormal_cases_cde(nas_user_t *user, int emm_cause, const OctetString *auts); -static int _authentication_abnormal_case_f(void); +static int _authentication_abnormal_case_f(nas_user_t *user); -static int _authentication_stop_timers(void); -static int _authentication_start_timers(void); +static int _authentication_stop_timers(nas_user_t *user); +static int _authentication_start_timers(nas_user_t *user); static int _authentication_kasme(const OctetString *autn, const OctetString *ck, const OctetString *ik, const plmn_t *plmn, OctetString *kasme); @@ -168,21 +139,21 @@ static int _authentication_kasme(const OctetString *autn, ** ksi: The NAS ket sey identifier ** ** rand: Authentication parameter RAND ** ** autn: Authentication parameter AUTN ** - ** Others: _emm_data, _authentication_data ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data, _authentication_data, T3416, ** ** T3418, T3420 ** ** ** ***************************************************************************/ -int emm_proc_authentication_request(int native_ksi, int ksi, +int emm_proc_authentication_request(nas_user_t *user, int native_ksi, int ksi, const OctetString *rand, const OctetString *autn) { LOG_FUNC_IN; int rc = RETURNerror; + authentication_data_t *authentication_data = user->authentication_data; + emm_timers_t *emm_timers = user->emm_data->emm_timers; LOG_TRACE(INFO, "EMM-PROC - Authentication requested ksi type = %s, ksi = %d", native_ksi ? "native" : "mapped", ksi); @@ -190,29 +161,29 @@ int emm_proc_authentication_request(int native_ksi, int ksi, * The UE shall proceed with an EPS authentication challenge only if a * USIM is present */ - if (!_emm_data.usim_is_valid) { + if (!user->emm_data->usim_is_valid) { LOG_TRACE(WARNING, "EMM-PROC - USIM is not present or not valid"); LOG_FUNC_RETURN (RETURNerror); } /* Stop timer T3418, if running */ - if (T3418.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3418 (%d)", T3418.id); - T3418.id = nas_timer_stop(T3418.id); + if (emm_timers->T3418.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3418 (%d)", emm_timers->T3418.id); + emm_timers->T3418.id = nas_timer_stop(emm_timers->T3418.id); } /* Stop timer T3420, if running */ - if (T3420.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3420 (%d)", T3420.id); - T3420.id = nas_timer_stop(T3420.id); + if (emm_timers->T3420.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3420 (%d)", emm_timers->T3420.id); + emm_timers->T3420.id = nas_timer_stop(emm_timers->T3420.id); } /* Setup security keys */ - OctetString ck = {AUTH_CK_SIZE, _authentication_data.ck}; - OctetString ik = {AUTH_IK_SIZE, _authentication_data.ik}; - OctetString res = {AUTH_RES_SIZE, _authentication_data.res}; + OctetString ck = {AUTH_CK_SIZE, authentication_data->ck}; + OctetString ik = {AUTH_IK_SIZE, authentication_data->ik}; + OctetString res = {AUTH_RES_SIZE, authentication_data->res}; - if (memcmp(_authentication_data.rand, rand->value, AUTH_CK_SIZE) != 0) { + if (memcmp(authentication_data->rand, rand->value, AUTH_CK_SIZE) != 0) { /* * There is no valid stored RAND in the ME or the stored RAND is * different from the new received value in the AUTHENTICATION @@ -240,7 +211,14 @@ int emm_proc_authentication_request(int native_ksi, int ksi, * of the core network by means of the received AUTN parameter and * request the USIM to compute RES, CK and IK for given RAND */ - rc = usim_api_authenticate(rand, autn, &auts, &res, &ck, &ik); + if(usim_test == 0) + { + rc = usim_api_authenticate(&user->usim_data, rand, autn, &auts, &res, &ck, &ik); + } + else + { + rc = usim_api_authenticate_test(&user->usim_data, rand, autn, &auts, &res, &ck, &ik); + } } if (rc != RETURNok) { @@ -252,24 +230,24 @@ int emm_proc_authentication_request(int native_ksi, int ksi, (sbit == 0) ? "Non-EPS authentication unacceptable" : "MAC code failure"); /* Delete any previously stored RAND and RES and stop timer T3416 */ - (void) emm_proc_authentication_delete(); + emm_proc_authentication_delete(user); /* Proceed authentication abnormal cases procedure */ if (auts.length > 0) { /* 3GPP TS 24.301, section 5.4.2.6, case e * SQN failure */ rc = _authentication_abnormal_cases_cde( - EMM_CAUSE_SYNCH_FAILURE, &auts); + user, EMM_CAUSE_SYNCH_FAILURE, &auts); } else if (sbit == 0) { /* 3GPP TS 24.301, section 5.4.2.6, case d * Non-EPS authentication unacceptable */ rc = _authentication_abnormal_cases_cde( - EMM_CAUSE_NON_EPS_AUTH_UNACCEPTABLE, NULL); + user, EMM_CAUSE_NON_EPS_AUTH_UNACCEPTABLE, NULL); } else { /* 3GPP TS 24.301, section 5.4.2.6, case c * MAC code failure */ rc = _authentication_abnormal_cases_cde( - EMM_CAUSE_MAC_FAILURE, NULL); + user, EMM_CAUSE_MAC_FAILURE, NULL); } /* Free the AUTS parameter */ @@ -282,18 +260,18 @@ int emm_proc_authentication_request(int native_ksi, int ksi, /* Store the new RAND in the volatile memory */ if (rand->length <= AUTH_RAND_SIZE) { - memcpy(_authentication_data.rand, rand->value, rand->length); + memcpy(authentication_data->rand, rand->value, rand->length); } /* Start, or reset and restart timer T3416 */ - if (T3416.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3416 (%d)", T3416.id); - T3416.id = nas_timer_stop(T3416.id); + if (emm_timers->T3416.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3416 (%d)", emm_timers->T3416.id); + emm_timers->T3416.id = nas_timer_stop(emm_timers->T3416.id); } - T3416.id = nas_timer_start(T3416.sec, _authentication_t3416_handler, NULL); + emm_timers->T3416.id = nas_timer_start(emm_timers->T3416.sec, _authentication_t3416_handler, NULL); LOG_TRACE(INFO, "EMM-PROC - Timer T3416 (%d) expires in %ld seconds", - T3416.id, T3416.sec); + emm_timers->T3416.id, emm_timers->T3416.sec); } /* @@ -302,7 +280,7 @@ int emm_proc_authentication_request(int native_ksi, int ksi, * the authenticity of the core network */ /* Start any retransmission timers */ - rc = _authentication_start_timers(); + rc = _authentication_start_timers(user); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-PROC - Failed to start retransmission timers"); @@ -311,7 +289,7 @@ int emm_proc_authentication_request(int native_ksi, int ksi, /* Setup EMM procedure handler to be executed upon receiving * lower layer notification */ - rc = emm_proc_lowerlayer_initialize(NULL, NULL, NULL, NULL); + rc = emm_proc_lowerlayer_initialize(user->lowerlayer_data, NULL, NULL, NULL, NULL); if (rc != RETURNok) { LOG_TRACE(WARNING, @@ -325,46 +303,46 @@ int emm_proc_authentication_request(int native_ksi, int ksi, */ emm_sap_t emm_sap; emm_sap.primitive = EMMAS_SECURITY_RES; - emm_sap.u.emm_as.u.security.guti = _emm_data.guti; - emm_sap.u.emm_as.u.security.ueid = 0; + emm_sap.u.emm_as.u.security.guti = user->emm_data->guti; + emm_sap.u.emm_as.u.security.ueid = user->ueid; emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_AUTH; emm_sap.u.emm_as.u.security.emm_cause = EMM_CAUSE_SUCCESS; emm_sap.u.emm_as.u.security.res = &res; /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - _emm_data.security, FALSE, TRUE); - rc = emm_sap_send(&emm_sap); + user->emm_data->security, FALSE, TRUE); + rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { /* Reset the authentication failure counters */ - _authentication_data.mac_count = 0; - _authentication_data.umts_count = 0; - _authentication_data.sync_count = 0; + authentication_data->mac_count = 0; + authentication_data->umts_count = 0; + authentication_data->sync_count = 0; /* Create non-current EPS security context */ - if (_emm_data.non_current == NULL) { - _emm_data.non_current = + if (user->emm_data->non_current == NULL) { + user->emm_data->non_current = (emm_security_context_t *)malloc(sizeof(emm_security_context_t)); } - if (_emm_data.non_current) { - memset(_emm_data.non_current, 0, sizeof(emm_security_context_t)); + if (user->emm_data->non_current) { + memset(user->emm_data->non_current, 0, sizeof(emm_security_context_t)); /* Set the security context type */ if (native_ksi) { - _emm_data.non_current->type = EMM_KSI_NATIVE; + user->emm_data->non_current->type = EMM_KSI_NATIVE; } else { - _emm_data.non_current->type = EMM_KSI_MAPPED; + user->emm_data->non_current->type = EMM_KSI_MAPPED; } /* Set the EPS key set identifier */ - _emm_data.non_current->eksi = ksi; + user->emm_data->non_current->eksi = ksi; /* Derive the Kasme from the authentication challenge using * the PLMN identity of the selected PLMN */ - _emm_data.non_current->kasme.length = AUTH_KASME_SIZE; - _emm_data.non_current->kasme.value = malloc(32); - _authentication_kasme(autn, &ck, &ik, &_emm_data.splmn, - &_emm_data.non_current->kasme); + user->emm_data->non_current->kasme.length = AUTH_KASME_SIZE; + user->emm_data->non_current->kasme.value = malloc(32); + _authentication_kasme(autn, &ck, &ik, &user->emm_data->splmn, + &user->emm_data->non_current->kasme); /* NAS integrity and cyphering keys are not yet available */ } } @@ -390,66 +368,67 @@ int emm_proc_authentication_request(int native_ksi, int ksi, ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data, _authentication_data, T3410, ** ** T3417, T3430 ** ** ** ***************************************************************************/ -int emm_proc_authentication_reject(void) +int emm_proc_authentication_reject(nas_user_t *user) { LOG_FUNC_IN; emm_sap_t emm_sap; int rc; + authentication_data_t *authentication_data = user->authentication_data; + emm_timers_t *emm_timers = user->emm_data->emm_timers; LOG_TRACE(WARNING, "EMM-PROC - Authentication not accepted by the network"); /* Delete any previously stored RAND and RES and stop timer T3416 */ - (void) emm_proc_authentication_delete(); + (void) emm_proc_authentication_delete(user); /* Set the EPS update status to EU3 ROAMING NOT ALLOWED */ - _emm_data.status = EU3_ROAMING_NOT_ALLOWED; + user->emm_data->status = EU3_ROAMING_NOT_ALLOWED; /* Delete the stored GUTI */ - _emm_data.guti = NULL; + user->emm_data->guti = NULL; /* Delete the TAI list */ - _emm_data.ltai.n_tais = 0; + user->emm_data->ltai.n_tais = 0; /* Delete the last visited registered TAI */ - _emm_data.tai = NULL; + user->emm_data->tai = NULL; /* Delete the eKSI */ - if (_emm_data.security) { - _emm_data.security->type = EMM_KSI_NOT_AVAILABLE; + if (user->emm_data->security) { + user->emm_data->security->type = EMM_KSI_NOT_AVAILABLE; } /* Consider the USIM invalid */ - _emm_data.usim_is_valid = FALSE; + user->emm_data->usim_is_valid = FALSE; /* Stop timer T3410 */ - if (T3410.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", T3410.id); - T3410.id = nas_timer_stop(T3410.id); + if (emm_timers->T3410.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", emm_timers->T3410.id); + emm_timers->T3410.id = nas_timer_stop(emm_timers->T3410.id); } /* Stop timer T3417 */ - if (T3417.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3417 (%d)", T3417.id); - T3417.id = nas_timer_stop(T3417.id); + if (emm_timers->T3417.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3417 (%d)", emm_timers->T3417.id); + emm_timers->T3417.id = nas_timer_stop(emm_timers->T3417.id); } /* Stop timer T3430 */ - if (T3430.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3430 (%d)", T3430.id); - T3430.id = nas_timer_stop(T3430.id); + if (emm_timers->T3430.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3430 (%d)", emm_timers->T3430.id); + emm_timers->T3430.id = nas_timer_stop(emm_timers->T3430.id); } /* Abort any EMM signalling procedure (prevent the retransmission timers to * be restarted) */ - _authentication_data.timers = 0x00; + authentication_data->timers = 0x00; /* * Notify EMM that authentication is not accepted by the network */ emm_sap.primitive = EMMREG_AUTH_REJ; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -473,24 +452,25 @@ int emm_proc_authentication_reject(void) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _authentication_data, T3416 ** ** ** ***************************************************************************/ -int emm_proc_authentication_delete(void) +int emm_proc_authentication_delete(nas_user_t *user) { LOG_FUNC_IN; + authentication_data_t *authentication_data = user->authentication_data; + emm_timers_t *emm_timers = user->emm_data->emm_timers; LOG_TRACE(INFO, "EMM-PROC - Delete authentication data RAND and RES"); /* Stop timer T3416, if running */ - if (T3416.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3416 (%d)", T3416.id); - T3416.id = nas_timer_stop(T3416.id); + if (emm_timers->T3416.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3416 (%d)", emm_timers->T3416.id); + emm_timers->T3416.id = nas_timer_stop(emm_timers->T3416.id); } /* Delete any previously stored RAND and RES */ - memset(_authentication_data.rand, 0, AUTH_RAND_SIZE); - memset(_authentication_data.res, 0, AUTH_RES_SIZE); + memset(authentication_data->rand, 0, AUTH_RAND_SIZE); + memset(authentication_data->res, 0, AUTH_RES_SIZE); LOG_FUNC_RETURN (RETURNok); } @@ -527,13 +507,15 @@ int emm_proc_authentication_delete(void) static void *_authentication_t3416_handler(void *args) { LOG_FUNC_IN; + nas_user_t *user=args; + emm_timers_t *emm_timers = user->emm_data->emm_timers; LOG_TRACE(WARNING, "EMM-PROC - T3416 timer expired"); /* Stop timer T3416 */ - T3416.id = nas_timer_stop(T3416.id); + emm_timers->T3416.id = nas_timer_stop(emm_timers->T3416.id); /* Delete previouly stored RAND and RES authentication data */ - (void) emm_proc_authentication_delete(); + (void) emm_proc_authentication_delete(user); LOG_FUNC_RETURN (NULL); } @@ -554,7 +536,6 @@ static void *_authentication_t3416_handler(void *args) ** ** ** Outputs: None ** ** Return: None ** - ** Others: _authentication_data, T3418 ** ** ** ***************************************************************************/ static void *_authentication_t3418_handler(void *args) @@ -562,16 +543,19 @@ static void *_authentication_t3418_handler(void *args) LOG_FUNC_IN; int rc; + nas_user_t *user=args; + emm_timers_t *emm_timers = user->emm_data->emm_timers; + authentication_data_t *authentication_data = user->authentication_data; LOG_TRACE(WARNING, "EMM-PROC - T3418 timer expired"); /* Stop timer T3418 */ - T3418.id = nas_timer_stop(T3418.id); + emm_timers->T3418.id = nas_timer_stop(emm_timers->T3418.id); /* Reset the MAC failure and UMTS challenge failure counters */ - _authentication_data.mac_count = 0; - _authentication_data.umts_count = 0; + authentication_data->mac_count = 0; + authentication_data->umts_count = 0; /* 3GPP TS 24.301, section 5.4.2.7, case f */ - rc = _authentication_abnormal_case_f(); + rc = _authentication_abnormal_case_f(user); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-PROC - Failed to proceed abnormal case f"); @@ -595,7 +579,6 @@ static void *_authentication_t3418_handler(void *args) ** ** ** Outputs: None ** ** Return: None ** - ** Others: _authentication_data, T3420 ** ** ** ***************************************************************************/ static void *_authentication_t3420_handler(void *args) @@ -603,15 +586,18 @@ static void *_authentication_t3420_handler(void *args) LOG_FUNC_IN; int rc; + nas_user_t *user=args; + authentication_data_t *authentication_data = user->authentication_data; + emm_timers_t *emm_timers = user->emm_data->emm_timers; LOG_TRACE(WARNING, "EMM-PROC - T3420 timer expired"); /* Stop timer T3420 */ - T3420.id = nas_timer_stop(T3420.id); + emm_timers->T3420.id = nas_timer_stop(emm_timers->T3420.id); /* Reset the sync failure counter */ - _authentication_data.sync_count = 0; + authentication_data->sync_count = 0; /* 3GPP TS 24.301, section 5.4.2.7, case f */ - rc = _authentication_abnormal_case_f(); + rc = _authentication_abnormal_case_f(user); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-PROC - Failed to proceed abnormal case f"); @@ -639,20 +625,21 @@ static void *_authentication_t3420_handler(void *args) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _authentication_data, T3418, T3420 ** ** ** ***************************************************************************/ -static int _authentication_abnormal_cases_cde(int emm_cause, +static int _authentication_abnormal_cases_cde(nas_user_t *user, int emm_cause, const OctetString *auts) { LOG_FUNC_IN; int rc; + authentication_data_t *authentication_data = user->authentication_data; + emm_timers_t *emm_timers = user->emm_data->emm_timers; LOG_TRACE(WARNING, "EMM-PROC - " "Abnormal case, authentication counters c/d/e = %d/%d/%d", - _authentication_data.mac_count, _authentication_data.umts_count, - _authentication_data.sync_count); + authentication_data->mac_count, authentication_data->umts_count, + authentication_data->sync_count); /* * Notify EMM-AS SAP that Authentication Failure message has to be sent @@ -660,15 +647,15 @@ static int _authentication_abnormal_cases_cde(int emm_cause, */ emm_sap_t emm_sap; emm_sap.primitive = EMMAS_SECURITY_RES; - emm_sap.u.emm_as.u.security.guti = _emm_data.guti; - emm_sap.u.emm_as.u.security.ueid = 0; + emm_sap.u.emm_as.u.security.guti = user->emm_data->guti; + emm_sap.u.emm_as.u.security.ueid = user->ueid; emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_AUTH; emm_sap.u.emm_as.u.security.emm_cause = emm_cause; emm_sap.u.emm_as.u.security.auts = auts; /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - _emm_data.security, FALSE, TRUE); - rc = emm_sap_send(&emm_sap); + user->emm_data->security, FALSE, TRUE); + rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { /* @@ -678,34 +665,34 @@ static int _authentication_abnormal_cases_cde(int emm_cause, case EMM_CAUSE_MAC_FAILURE: /* 3GPP TS 24.301, section 5.4.2.6, case c * Update the MAC failure counter */ - _authentication_data.mac_count += 1; + authentication_data->mac_count += 1; /* Start timer T3418 */ - T3418.id = nas_timer_start(T3418.sec, - _authentication_t3418_handler, NULL); + emm_timers->T3418.id = nas_timer_start(emm_timers->T3418.sec, + _authentication_t3418_handler, user); LOG_TRACE(INFO,"EMM-PROC - Timer T3418 (%d) expires in " - "%ld seconds", T3418.id, T3418.sec); + "%ld seconds", emm_timers->T3418.id, emm_timers->T3418.sec); break; case EMM_CAUSE_NON_EPS_AUTH_UNACCEPTABLE: /* 3GPP TS 24.301, section 5.4.2.6, case d * Update the UMTS challenge failure counter */ - _authentication_data.umts_count += 1; + authentication_data->umts_count += 1; /* Start timer T3418 */ - T3418.id = nas_timer_start(T3418.sec, - _authentication_t3418_handler, NULL); + emm_timers->T3418.id = nas_timer_start(emm_timers->T3418.sec, + _authentication_t3418_handler, user); LOG_TRACE(INFO,"EMM-PROC - Timer T3418 (%d) expires in " - "%ld seconds", T3418.id, T3418.sec); + "%ld seconds", emm_timers->T3418.id, emm_timers->T3418.sec); break; case EMM_CAUSE_SYNCH_FAILURE: /* 3GPP TS 24.301, section 5.4.2.6, case e * Update the synch failure counter */ - _authentication_data.sync_count += 1; + authentication_data->sync_count += 1; /* Start timer T3420 */ - T3420.id = nas_timer_start(T3420.sec, - _authentication_t3420_handler, NULL); + emm_timers->T3420.id = nas_timer_start(emm_timers->T3420.sec, + _authentication_t3420_handler, user); LOG_TRACE(INFO,"EMM-PROC - Timer T3420 (%d) expires in " - "%ld seconds", T3420.id, T3420.sec); + "%ld seconds", emm_timers->T3420.id, emm_timers->T3420.sec); break; default: @@ -717,7 +704,7 @@ static int _authentication_abnormal_cases_cde(int emm_cause, /* * Stop any retransmission timers that are running */ - rc = _authentication_stop_timers(); + rc = _authentication_stop_timers(user); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-PROC - " @@ -731,17 +718,17 @@ static int _authentication_abnormal_cases_cde(int emm_cause, int failure_counter = 0; if (emm_cause == EMM_CAUSE_MAC_FAILURE) { - failure_counter = _authentication_data.mac_count - + _authentication_data.sync_count; + failure_counter = authentication_data->mac_count + + authentication_data->sync_count; } else if (emm_cause == EMM_CAUSE_SYNCH_FAILURE) { - failure_counter = _authentication_data.mac_count - + _authentication_data.umts_count - + _authentication_data.sync_count; + failure_counter = authentication_data->mac_count + + authentication_data->umts_count + + authentication_data->sync_count; } if (failure_counter >= AUTHENTICATION_COUNTER_MAX) { /* 3GPP TS 24.301, section 5.4.2.6, case f */ - rc = _authentication_abnormal_case_f(); + rc = _authentication_abnormal_case_f(user); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-PROC - " @@ -769,7 +756,7 @@ static int _authentication_abnormal_cases_cde(int emm_cause, ** Others: None ** ** ** ***************************************************************************/ -static int _authentication_abnormal_case_f(void) +static int _authentication_abnormal_case_f(nas_user_t *user) { LOG_FUNC_IN; @@ -783,16 +770,16 @@ static int _authentication_abnormal_case_f(void) */ emm_sap_t emm_sap; emm_sap.primitive = EMMAS_RELEASE_REQ; - emm_sap.u.emm_as.u.release.guti = _emm_data.guti; + emm_sap.u.emm_as.u.release.guti = user->emm_data->guti; emm_sap.u.emm_as.u.release.cause = EMM_AS_CAUSE_AUTHENTICATION; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { /* Start any retransmission timers (e.g. T3410, T3417, T3421 or * T3430), if they were running and stopped when the UE received * the first AUTHENTICATION REQUEST message containing an invalid * MAC or SQN */ - rc = _authentication_start_timers(); + rc = _authentication_start_timers(user); } LOG_FUNC_RETURN (rc); @@ -816,40 +803,41 @@ static int _authentication_abnormal_case_f(void) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _authentication_data, T3410, T3417, T3421, ** ** T3430 ** ** ** ***************************************************************************/ -static int _authentication_stop_timers(void) +static int _authentication_stop_timers(nas_user_t *user) { LOG_FUNC_IN; + authentication_data_t *authentication_data = user->authentication_data; + emm_timers_t *emm_timers = user->emm_data->emm_timers; /* Stop attach timer */ - if (T3410.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", T3410.id); - T3410.id = nas_timer_stop(T3410.id); - _authentication_data.timers |= AUTHENTICATION_T3410; + if (emm_timers->T3410.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3410 (%d)", emm_timers->T3410.id); + emm_timers->T3410.id = nas_timer_stop(emm_timers->T3410.id); + authentication_data->timers |= AUTHENTICATION_T3410; } /* Stop service request timer */ - if (T3417.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3417 (%d)", T3417.id); - T3417.id = nas_timer_stop(T3417.id); - _authentication_data.timers |= AUTHENTICATION_T3417; + if (emm_timers->T3417.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3417 (%d)", emm_timers->T3417.id); + emm_timers->T3417.id = nas_timer_stop(emm_timers->T3417.id); + authentication_data->timers |= AUTHENTICATION_T3417; } /* Stop detach timer */ - if (T3421.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3421 (%d)", T3421.id); - T3421.id = nas_timer_stop(T3421.id); - _authentication_data.timers |= AUTHENTICATION_T3421; + if (emm_timers->T3421.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3421 (%d)", emm_timers->T3421.id); + emm_timers->T3421.id = nas_timer_stop(emm_timers->T3421.id); + authentication_data->timers |= AUTHENTICATION_T3421; } /* Stop tracking area update timer */ - if (T3430.id != NAS_TIMER_INACTIVE_ID) { - LOG_TRACE(INFO, "EMM-PROC - Stop timer T3430 (%d)", T3430.id); - T3430.id = nas_timer_stop(T3430.id); - _authentication_data.timers |= AUTHENTICATION_T3430; + if (emm_timers->T3430.id != NAS_TIMER_INACTIVE_ID) { + LOG_TRACE(INFO, "EMM-PROC - Stop timer T3430 (%d)", emm_timers->T3430.id); + emm_timers->T3430.id = nas_timer_stop(emm_timers->T3430.id); + authentication_data->timers |= AUTHENTICATION_T3430; } LOG_FUNC_RETURN (RETURNok); @@ -867,43 +855,44 @@ static int _authentication_stop_timers(void) ** 3GPP TS 24.301, section 5.4.2.7, case f ** ** ** ** Inputs: None ** - ** Others: _authentication_data ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** ** Others: T3410, T3417, T3421, T3430 ** ** ** ***************************************************************************/ -static int _authentication_start_timers(void) +static int _authentication_start_timers(nas_user_t *user) { LOG_FUNC_IN; + authentication_data_t *authentication_data = user->authentication_data; + emm_timers_t *emm_timers = user->emm_data->emm_timers; - if (_authentication_data.timers & AUTHENTICATION_T3410) { + if (authentication_data->timers & AUTHENTICATION_T3410) { /* Start attach timer */ - T3410.id = nas_timer_start(T3410.sec, _emm_attach_t3410_handler, NULL); + emm_timers->T3410.id = nas_timer_start(emm_timers->T3410.sec, emm_attach_t3410_handler, NULL); LOG_TRACE(INFO,"EMM-PROC - Timer T3410 (%d) expires in " - "%ld seconds", T3410.id, T3410.sec); + "%ld seconds", emm_timers->T3410.id, emm_timers->T3410.sec); } - if (_authentication_data.timers & AUTHENTICATION_T3417) { + if (authentication_data->timers & AUTHENTICATION_T3417) { /* Start service request timer */ - T3417.id = nas_timer_start(T3417.sec, _emm_service_t3417_handler, NULL); + emm_timers->T3417.id = nas_timer_start(emm_timers->T3417.sec, emm_service_t3417_handler, NULL); LOG_TRACE(INFO,"EMM-PROC - Timer T3417 (%d) expires in " - "%ld seconds", T3417.id, T3417.sec); + "%ld seconds", emm_timers->T3417.id, emm_timers->T3417.sec); } - if (_authentication_data.timers & AUTHENTICATION_T3421) { + if (authentication_data->timers & AUTHENTICATION_T3421) { /* Start detach timer */ - T3421.id = nas_timer_start(T3421.sec, _emm_detach_t3421_handler, NULL); + emm_timers->T3421.id = nas_timer_start(emm_timers->T3421.sec, emm_detach_t3421_handler, NULL); LOG_TRACE(INFO,"EMM-PROC - Timer T3421 (%d) expires in " - "%ld seconds", T3421.id, T3421.sec); + "%ld seconds", emm_timers->T3421.id, emm_timers->T3421.sec); } - if (_authentication_data.timers & AUTHENTICATION_T3430) { + if (authentication_data->timers & AUTHENTICATION_T3430) { /* Start tracking area update timer */ - T3430.id = nas_timer_start(T3430.sec, _emm_tau_t3430_handler, NULL); + emm_timers->T3430.id = nas_timer_start(emm_timers->T3430.sec, emm_tau_t3430_handler, NULL); LOG_TRACE(INFO,"EMM-PROC - Timer T3430 (%d) expires in " - "%ld seconds", T3430.id, T3430.sec); + "%ld seconds", emm_timers->T3430.id, emm_timers->T3430.sec); } LOG_FUNC_RETURN (RETURNok); diff --git a/openair3/NAS/UE/EMM/Authentication.h b/openair3/NAS/UE/EMM/Authentication.h new file mode 100644 index 0000000000..50b2d990aa --- /dev/null +++ b/openair3/NAS/UE/EMM/Authentication.h @@ -0,0 +1,23 @@ +#ifndef _AUTHENTICATION_H +#define _AUTHENTICATION_H + +/* + * Internal data used for authentication procedure + */ +typedef struct { + uint8_t rand[AUTH_RAND_SIZE]; /* Random challenge number */ + uint8_t res[AUTH_RES_SIZE]; /* Authentication response */ + uint8_t ck[AUTH_CK_SIZE]; /* Ciphering key */ + uint8_t ik[AUTH_IK_SIZE]; /* Integrity key */ +#define AUTHENTICATION_T3410 0x01 +#define AUTHENTICATION_T3417 0x02 +#define AUTHENTICATION_T3421 0x04 +#define AUTHENTICATION_T3430 0x08 + unsigned char timers; /* Timer restart bitmap */ +#define AUTHENTICATION_COUNTER_MAX 3 + unsigned char mac_count:2; /* MAC failure counter (#20) */ + unsigned char umts_count:2; /* UMTS challenge failure counter (#26) */ + unsigned char sync_count:2; /* Sync failure counter (#21) */ +} authentication_data_t; + +#endif diff --git a/openair3/NAS/UE/EMM/Detach.c b/openair3/NAS/UE/EMM/Detach.c old mode 100755 new mode 100644 index 7ec7a3d74d..c18dc0ad28 --- a/openair3/NAS/UE/EMM/Detach.c +++ b/openair3/NAS/UE/EMM/Detach.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source Detach.c @@ -56,6 +49,7 @@ Description Defines the detach related EMM procedure executed by the #include "nas_timer.h" #include "emmData.h" +#include "emm_timers.h" #include "emm_sap.h" #include "esm_sap.h" @@ -82,29 +76,11 @@ static const char *_emm_detach_type_str[] = { * Internal data handled by the detach procedure in the UE * -------------------------------------------------------------------------- */ -/* - * Timer handlers - */ -void *_emm_detach_t3421_handler(void *); /* * Abnormal case detach procedures */ -static int _emm_detach_abort(emm_proc_detach_type_t type); - -/* - * Internal data used for detach procedure - */ -static struct { -#define EMM_DETACH_COUNTER_MAX 5 - unsigned int count; /* Counter used to limit the number of - * subsequently detach attempts */ - int switch_off; /* UE switch-off indicator */ - emm_proc_detach_type_t type; /* Type of the detach procedure - * currently in progress */ -} _emm_detach_data = {0, FALSE, EMM_DETACH_TYPE_RESERVED}; - - +static int _emm_detach_abort(nas_user_t *user, emm_proc_detach_type_t type); /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ @@ -131,34 +107,34 @@ static struct { ** Inputs: type: Type of the requested detach ** ** switch_off: Indicates whether the detach is required ** ** because the UE is switched off or not ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_detach_data ** ** ** ***************************************************************************/ -int emm_proc_detach(emm_proc_detach_type_t type, int switch_off) +int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, int switch_off) { LOG_FUNC_IN; emm_sap_t emm_sap; emm_as_data_t *emm_as = &emm_sap.u.emm_as.u.data; + emm_detach_data_t *emm_detach_data = user->emm_data->emm_detach_data; int rc; LOG_TRACE(INFO, "EMM-PROC - Initiate EPS detach type = %s (%d)", _emm_detach_type_str[type], type); /* Initialize the detach procedure internal data */ - _emm_detach_data.count = 0; - _emm_detach_data.switch_off = switch_off; - _emm_detach_data.type = type; + emm_detach_data->count = 0; + emm_detach_data->switch_off = switch_off; + emm_detach_data->type = type; /* Setup EMM procedure handler to be executed upon receiving * lower layer notification */ - rc = emm_proc_lowerlayer_initialize(emm_proc_detach_request, + rc = emm_proc_lowerlayer_initialize(user->lowerlayer_data, emm_proc_detach_request, emm_proc_detach_failure, - emm_proc_detach_release, NULL); + emm_proc_detach_release, user); if (rc != RETURNok) { LOG_TRACE(WARNING, "Failed to initialize EMM procedure handler"); @@ -174,17 +150,17 @@ int emm_proc_detach(emm_proc_detach_type_t type, int switch_off) /* Set the switch-off indicator */ emm_as->switch_off = switch_off; /* Set the EPS mobile identity */ - emm_as->guti = _emm_data.guti; - emm_as->ueid = 0; + emm_as->guti = user->emm_data->guti; + emm_as->ueid = user->ueid; /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_as->sctx, _emm_data.security, FALSE, TRUE); + emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, FALSE, TRUE); /* * Notify EMM-AS SAP that Detach Request message has to * be sent to the network */ emm_sap.primitive = EMMAS_DATA_REQ; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN(rc); } @@ -209,21 +185,24 @@ int emm_proc_detach_request(void *args) { LOG_FUNC_IN; + nas_user_t *user = args; + emm_timers_t *emm_timers = user->emm_data->emm_timers; + emm_detach_data_t *emm_detach_data = user->emm_data->emm_detach_data; emm_sap_t emm_sap; int rc; - if ( !_emm_detach_data.switch_off ) { + if ( !emm_detach_data->switch_off ) { /* Start T3421 timer */ - T3421.id = nas_timer_start(T3421.sec, _emm_detach_t3421_handler, NULL); + emm_timers->T3421.id = nas_timer_start(emm_timers->T3421.sec, emm_detach_t3421_handler, user); LOG_TRACE(INFO, "EMM-PROC - Timer T3421 (%d) expires in %ld seconds", - T3421.id, T3421.sec); + emm_timers->T3421.id, emm_timers->T3421.sec); } /* * Notify EMM that Detach Request has been sent to the network */ emm_sap.primitive = EMMREG_DETACH_REQ; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN(rc); } @@ -250,19 +229,21 @@ int emm_proc_detach_request(void *args) ** Others: T3421 ** ** ** ***************************************************************************/ -int emm_proc_detach_accept(void) +int emm_proc_detach_accept(void* args) { LOG_FUNC_IN; + nas_user_t *user=args; + emm_timers_t *emm_timers = user->emm_data->emm_timers; int rc; LOG_TRACE(INFO, "EMM-PROC - UE initiated detach procedure completion"); /* Reset EMM procedure handler */ - (void) emm_proc_lowerlayer_initialize(NULL, NULL, NULL, NULL); + (void) emm_proc_lowerlayer_initialize(user->lowerlayer_data, NULL, NULL, NULL, NULL); /* Stop timer T3421 */ - T3421.id = nas_timer_stop(T3421.id); + emm_timers->T3421.id = nas_timer_stop(emm_timers->T3421.id); /* * Notify ESM that all EPS bearer contexts have to be locally deactivated @@ -270,7 +251,7 @@ int emm_proc_detach_accept(void) esm_sap_t esm_sap; esm_sap.primitive = ESM_EPS_BEARER_CONTEXT_DEACTIVATE_REQ; esm_sap.data.eps_bearer_context_deactivate.ebi = ESM_SAP_ALL_EBI; - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); /* * XXX - Upon receiving notification from ESM that all EPS bearer @@ -292,7 +273,6 @@ int emm_proc_detach_accept(void) ** ** ** Inputs: is_initial: Not used ** ** args: Not used ** - ** Others: _emm_detach_data ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** @@ -303,23 +283,26 @@ int emm_proc_detach_failure(int is_initial, void *args) { LOG_FUNC_IN; + nas_user_t *user = args; + emm_detach_data_t *emm_detach_data = user->emm_data->emm_detach_data; + emm_timers_t *emm_timers = user->emm_data->emm_timers; emm_sap_t emm_sap; int rc; LOG_TRACE(WARNING, "EMM-PROC - Network detach failure"); /* Reset EMM procedure handler */ - (void) emm_proc_lowerlayer_initialize(NULL, NULL, NULL, NULL); + (void) emm_proc_lowerlayer_initialize(user->lowerlayer_data, NULL, NULL, NULL, NULL); /* Stop timer T3421 */ - T3421.id = nas_timer_stop(T3421.id); + emm_timers->T3421.id = nas_timer_stop(emm_timers->T3421.id); /* * Notify EMM that detach procedure has to be restarted */ emm_sap.primitive = EMMREG_DETACH_INIT; - emm_sap.u.emm_reg.u.detach.switch_off = _emm_detach_data.switch_off; - rc = emm_sap_send(&emm_sap); + emm_sap.u.emm_reg.u.detach.switch_off = emm_detach_data->switch_off; + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN(rc); } @@ -336,7 +319,6 @@ int emm_proc_detach_failure(int is_initial, void *args) ** The detach procedure shall be aborted. ** ** ** ** Inputs: args: not used ** - ** Others: _emm_detach_data ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** @@ -349,8 +331,10 @@ int emm_proc_detach_release(void *args) LOG_TRACE(WARNING, "EMM-PROC - NAS signalling connection released"); + nas_user_t *user = args; + emm_detach_data_t *emm_detach_data = user->emm_data->emm_detach_data; /* Abort the detach procedure */ - int rc = _emm_detach_abort(_emm_detach_data.type); + int rc = _emm_detach_abort(user, emm_detach_data->type); LOG_FUNC_RETURN(rc); } @@ -375,50 +359,52 @@ int emm_proc_detach_release(void *args) ** 3GPP TS 24.301, section 5.5.2.2.4 case c ** ** On the first four expiries of the timer, the UE shall re- ** ** transmit the DETACH REQUEST message and shall reset and ** - ** restart timer T3421. On the fifth expiry of timer T3421, ** + ** restart timer emm_timers->T3421. On the fifth expiry of timer T3421, ** ** the detach procedure shall be aborted. ** ** ** ** Inputs: args: handler parameters ** - ** Others: _emm_detach_data ** ** ** ** Outputs: None ** ** Return: None ** ** Others: None ** ** ** ***************************************************************************/ -void *_emm_detach_t3421_handler(void *args) +void *emm_detach_t3421_handler(void *args) { LOG_FUNC_IN; + nas_user_t *user = args; + emm_detach_data_t *emm_detach_data = user->emm_data->emm_detach_data; + emm_timers_t *emm_timers = user->emm_data->emm_timers; int rc; /* Increment the retransmission counter */ - _emm_detach_data.count += 1; + emm_detach_data->count += 1; LOG_TRACE(WARNING, "EMM-PROC - T3421 timer expired, " - "retransmission counter = %d", _emm_detach_data.count); + "retransmission counter = %d", emm_detach_data->count); - if (_emm_detach_data.count < EMM_DETACH_COUNTER_MAX) { + if (emm_detach_data->count < EMM_DETACH_COUNTER_MAX) { /* Retransmit the Detach Request message */ emm_sap_t emm_sap; emm_as_data_t *emm_as = &emm_sap.u.emm_as.u.data; /* Stop timer T3421 */ - T3421.id = nas_timer_stop(T3421.id); + emm_timers->T3421.id = nas_timer_stop(emm_timers->T3421.id); /* Setup NAS information message to transfer */ emm_as->NASinfo = EMM_AS_NAS_INFO_DETACH; emm_as->NASmsg.length = 0; emm_as->NASmsg.value = NULL; /* Set the detach type */ - emm_as->type = _emm_detach_data.type; + emm_as->type = emm_detach_data->type; /* Set the switch-off indicator */ - emm_as->switch_off = _emm_detach_data.switch_off; + emm_as->switch_off = emm_detach_data->switch_off; /* Set the EPS mobile identity */ - emm_as->guti = _emm_data.guti; - emm_as->ueid = 0; + emm_as->guti = user->emm_data->guti; + emm_as->ueid = user->ueid; /* Setup EPS NAS security data */ - emm_as_set_security_data(&emm_as->sctx, _emm_data.security, + emm_as_set_security_data(&emm_as->sctx, user->emm_data->security, FALSE, TRUE); /* @@ -426,17 +412,17 @@ void *_emm_detach_t3421_handler(void *args) * be sent to the network */ emm_sap.primitive = EMMAS_DATA_REQ; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { /* Start T3421 timer */ - T3421.id = nas_timer_start(T3421.sec, _emm_detach_t3421_handler, NULL); + emm_timers->T3421.id = nas_timer_start(emm_timers->T3421.sec, emm_detach_t3421_handler, user); LOG_TRACE(INFO, "EMM-PROC - Timer T3421 (%d) expires in %ld " - "seconds", T3421.id, T3421.sec); + "seconds", emm_timers->T3421.id, emm_timers->T3421.sec); } } else { /* Abort the detach procedure */ - rc = _emm_detach_abort(_emm_detach_data.type); + rc = _emm_detach_abort(user, emm_detach_data->type); } LOG_FUNC_RETURN(NULL); @@ -455,34 +441,34 @@ void *_emm_detach_t3421_handler(void *args) ** Description: Aborts the detach procedure ** ** ** ** Inputs: type: not used ** - ** Others: _emm_detach_data ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** ** Others: T3421 ** ** ** ***************************************************************************/ -static int _emm_detach_abort(emm_proc_detach_type_t type) +static int _emm_detach_abort(nas_user_t *user, emm_proc_detach_type_t type) { LOG_FUNC_IN; + emm_timers_t *emm_timers = user->emm_data->emm_timers; emm_sap_t emm_sap; int rc ; LOG_TRACE(WARNING, "EMM-PROC - Abort the detach procedure"); /* Reset EMM procedure handler */ - (void) emm_proc_lowerlayer_initialize(NULL, NULL, NULL, NULL); + emm_proc_lowerlayer_initialize(user->lowerlayer_data, NULL, NULL, NULL, NULL); /* Stop timer T3421 */ - T3421.id = nas_timer_stop(T3421.id); + emm_timers->T3421.id = nas_timer_stop(emm_timers->T3421.id); /* * Notify EMM that detach procedure failed */ emm_sap.primitive = EMMREG_DETACH_FAILED; emm_sap.u.emm_reg.u.detach.type = type; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } diff --git a/openair3/NAS/UE/EMM/EmmStatusHdl.c b/openair3/NAS/UE/EMM/EmmStatusHdl.c old mode 100755 new mode 100644 index 126b2a94f6..367d0327f4 --- a/openair3/NAS/UE/EMM/EmmStatusHdl.c +++ b/openair3/NAS/UE/EMM/EmmStatusHdl.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source Emmstatus.c @@ -122,7 +115,7 @@ int emm_proc_status_ind(unsigned int ueid, int emm_cause) ** Others: None ** ** ** ***************************************************************************/ -int emm_proc_status(unsigned int ueid, int emm_cause) +int emm_proc_status(nas_user_t *user, int emm_cause) { LOG_FUNC_IN; @@ -139,15 +132,15 @@ int emm_proc_status(unsigned int ueid, int emm_cause) */ emm_sap.primitive = EMMAS_STATUS_IND; emm_sap.u.emm_as.u.status.emm_cause = emm_cause; - emm_sap.u.emm_as.u.status.ueid = ueid; + emm_sap.u.emm_as.u.status.ueid = user->ueid; - emm_sap.u.emm_as.u.status.guti = _emm_data.guti; - sctx = _emm_data.security; + emm_sap.u.emm_as.u.status.guti = user->emm_data->guti; + sctx = user->emm_data->security; /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.status.sctx, sctx, FALSE, TRUE); - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } diff --git a/openair3/NAS/UE/EMM/Identification.c b/openair3/NAS/UE/EMM/Identification.c old mode 100755 new mode 100644 index 80eede61be..0d2d6644a1 --- a/openair3/NAS/UE/EMM/Identification.c +++ b/openair3/NAS/UE/EMM/Identification.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source Identification.c @@ -56,6 +49,7 @@ Description Defines the identification EMM procedure executed by the #include "emm_sap.h" #include "msc.h" +#include "user_defs.h" #include // malloc, free #include // memcpy @@ -109,7 +103,7 @@ static const char *_emm_identity_type_str[] = { ** Others: None ** ** ** ***************************************************************************/ -int emm_proc_identification_request(emm_proc_identity_type_t type) +int emm_proc_identification_request(nas_user_t *user, emm_proc_identity_type_t type) { LOG_FUNC_IN; @@ -121,7 +115,7 @@ int emm_proc_identification_request(emm_proc_identity_type_t type) /* Setup EMM procedure handler to be executed upon receiving * lower layer notification */ - rc = emm_proc_lowerlayer_initialize(NULL, NULL, NULL, NULL); + rc = emm_proc_lowerlayer_initialize(user->lowerlayer_data, NULL, NULL, NULL, NULL); if (rc != RETURNok) { LOG_TRACE(WARNING, @@ -136,8 +130,8 @@ int emm_proc_identification_request(emm_proc_identity_type_t type) imsi_t modified_imsi; /* International Mobile Subscriber Identity is requested */ - if (_emm_data.imsi) { - memcpy (&modified_imsi, _emm_data.imsi, sizeof (modified_imsi)); + if (user->emm_data->imsi) { + memcpy (&modified_imsi, user->emm_data->imsi, sizeof (modified_imsi)); /* LW: Eventually replace the 0xF value set in MNC digit 3 by a 0 to avoid IMSI to be truncated before reaching HSS */ if (modified_imsi.u.num.digit6 == 0xF) { @@ -173,9 +167,9 @@ int emm_proc_identification_request(emm_proc_identity_type_t type) case EMM_IDENT_TYPE_IMEI: /* International Mobile Equipment Identity is requested */ - if (_emm_data.imei) { + if (user->emm_data->imei) { emm_sap.u.emm_as.u.security.identType = EMM_IDENT_TYPE_IMEI; - emm_sap.u.emm_as.u.security.imei = _emm_data.imei; + emm_sap.u.emm_as.u.security.imei = user->emm_data->imei; } break; @@ -183,9 +177,9 @@ int emm_proc_identification_request(emm_proc_identity_type_t type) case EMM_IDENT_TYPE_TMSI: /* Temporary Mobile Subscriber Identity is requested */ - if (_emm_data.guti) { + if (user->emm_data->guti) { emm_sap.u.emm_as.u.security.identType = EMM_IDENT_TYPE_TMSI; - emm_sap.u.emm_as.u.security.tmsi = _emm_data.guti->m_tmsi; + emm_sap.u.emm_as.u.security.tmsi = user->emm_data->guti->m_tmsi; } break; @@ -200,13 +194,13 @@ int emm_proc_identification_request(emm_proc_identity_type_t type) * to the MME */ emm_sap.primitive = EMMAS_SECURITY_RES; - emm_sap.u.emm_as.u.security.guti = _emm_data.guti; - emm_sap.u.emm_as.u.security.ueid = 0; + emm_sap.u.emm_as.u.security.guti = user->emm_data->guti; + emm_sap.u.emm_as.u.security.ueid = user->ueid; emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_IDENT; /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - _emm_data.security, FALSE, TRUE); - rc = emm_sap_send(&emm_sap); + user->emm_data->security, FALSE, TRUE); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } diff --git a/openair3/NAS/UE/EMM/IdleMode.c b/openair3/NAS/UE/EMM/IdleMode.c old mode 100755 new mode 100644 index b04670819b..362d5e5b4a --- a/openair3/NAS/UE/EMM/IdleMode.c +++ b/openair3/NAS/UE/EMM/IdleMode.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source IdleMode.c @@ -66,6 +59,7 @@ Description Defines EMM procedures executed by the Non-Access Stratum #include "emm_proc.h" #include "nas_log.h" +#include "utils.h" #include "emm_sap.h" @@ -85,56 +79,8 @@ Description Defines EMM procedures executed by the Non-Access Stratum /****************************************************************************/ static int _IdleMode_plmn_str(char *plmn_str, const plmn_t *plmn); -static int _IldlMode_get_opnn_id(const plmn_t *plmn); -static int _IdleMode_get_suitable_cell(int index); - -/* - * A list of PLMN identities in priority order is maintained locally - * to perform the PLMN selection procedure. - * - * In automatic mode of operation, this list is used for PLMN selection when - * the UE is switched on, or upon recovery from lack of coverage, or when the - * user requests the UE to initiate PLMN reselection, and registration. - * In manual mode of operation, this list is displayed to the user that may - * select an available PLMN and initiate registration. - * - * The list may contain PLMN identifiers in the following order: - * - The last registered PLMN or each equivalent PLMN present in the list of - * "equivalent PLMNs" (EPLMN_MAX), when UE is switched on or following - * recovery from lack of coverage; - * - The highest priority PLMN in the list of "equivalent HPLMNs" or the - * HPLMN derived from the IMSI (1) - * - Each PLMN/access technology combination in the "User Controlled PLMN - * Selector with Access Technology" (PLMN_MAX) - * - Each PLMN/access technology combination in the "Operator Controlled PLMN - * Selector with Access Technology" (OPLMN_MAX) - * - Other PLMN/access technology combinations with received high quality - * signal in random order (TODO) - * - Other PLMN/access technology combinations in order of decreasing signal - * quality (TODO) - * - The last selected PLMN again (1) - */ -static struct { - int n_plmns; -#define EMM_PLMN_LIST_SIZE (EMM_DATA_EPLMN_MAX + EMM_DATA_PLMN_MAX + \ - EMM_DATA_OPLMN_MAX + 2) - plmn_t *plmn[EMM_PLMN_LIST_SIZE]; - int index; /* Index of the PLMN for which selection is ongoing */ - int hplmn; /* Index of the home PLMN or the highest priority - * equivalent home PLMN */ - int fplmn; /* Index of the first forbidden PLMN */ - int splmn; /* Index of the currently selected PLMN */ - int rplmn; /* Index of the currently registered PLMN */ - struct plmn_param_t { - char fullname[NET_FORMAT_LONG_SIZE+1]; /* PLMN full identifier */ - char shortname[NET_FORMAT_SHORT_SIZE+1]; /* PLMN short identifier */ - char num[NET_FORMAT_NUM_SIZE+1]; /* PLMN numeric identifier */ - int stat; /* Indication of the PLMN availability */ - int tac; /* Location/Tracking Area Code */ - int ci; /* Serving cell identifier */ - int rat; /* Radio Access Technology supported by the serving cell */ - } param[EMM_PLMN_LIST_SIZE]; -} _emm_plmn_list; +static int _IldlMode_get_opnn_id(emm_data_t *emm_data, const plmn_t *plmn); +static int _IdleMode_get_suitable_cell(nas_user_t *user, int index); /* Callback executed whenever a network indication is received */ static IdleMode_callback_t _emm_indication_notify; @@ -159,21 +105,23 @@ static IdleMode_callback_t _emm_indication_notify; ** Others: _emm_plmn_list, _emm_indication_notify ** ** ** ***************************************************************************/ -void IdleMode_initialize(IdleMode_callback_t cb) +void IdleMode_initialize(nas_user_t *user, IdleMode_callback_t cb) { + emm_plmn_list_t *emm_plmn_list = calloc_or_fail( sizeof(emm_plmn_list_t)); + user->emm_plmn_list = emm_plmn_list; /* Initialize the list of available PLMNs */ - _emm_plmn_list.n_plmns = 0; - _emm_plmn_list.index = 0; - _emm_plmn_list.hplmn = -1; - _emm_plmn_list.fplmn = -1; - _emm_plmn_list.splmn = -1; - _emm_plmn_list.rplmn = -1; + emm_plmn_list->n_plmns = 0; + emm_plmn_list->index = 0; + emm_plmn_list->hplmn = -1; + emm_plmn_list->fplmn = -1; + emm_plmn_list->splmn = -1; + emm_plmn_list->rplmn = -1; /* Initialize the network notification handler */ _emm_indication_notify = *cb; /* Initialize EMM Service Access Point */ - emm_sap_initialize(); + emm_sap_initialize(user); } /* @@ -197,9 +145,9 @@ void IdleMode_initialize(IdleMode_callback_t cb) ** Others: None ** ** ** ***************************************************************************/ -int IdleMode_get_nb_plmns(void) +int IdleMode_get_nb_plmns(emm_plmn_list_t *emm_plmn_list) { - return _emm_plmn_list.n_plmns; + return emm_plmn_list->n_plmns; } /**************************************************************************** @@ -218,9 +166,9 @@ int IdleMode_get_nb_plmns(void) ** Others: None ** ** ** ***************************************************************************/ -int IdleMode_get_hplmn_index(void) +int IdleMode_get_hplmn_index(emm_plmn_list_t *emm_plmn_list) { - return _emm_plmn_list.hplmn; + return emm_plmn_list->hplmn; } /**************************************************************************** @@ -239,9 +187,9 @@ int IdleMode_get_hplmn_index(void) ** Others: None ** ** ** ***************************************************************************/ -int IdleMode_get_rplmn_index(void) +int IdleMode_get_rplmn_index(emm_plmn_list_t *emm_plmn_list) { - return _emm_plmn_list.rplmn; + return emm_plmn_list->rplmn; } /**************************************************************************** @@ -252,16 +200,15 @@ int IdleMode_get_rplmn_index(void) ** available PLMNs. ** ** ** ** Inputs: None ** - ** Others: _emm_plmn_list ** ** ** ** Outputs: None ** ** Return: The index of the selected PLMN in the list ** ** Others: None ** ** ** ***************************************************************************/ -int IdleMode_get_splmn_index(void) +int IdleMode_get_splmn_index(emm_plmn_list_t *emm_plmn_list) { - return _emm_plmn_list.splmn; + return emm_plmn_list->splmn; } /**************************************************************************** @@ -272,38 +219,36 @@ int IdleMode_get_splmn_index(void) ** tors present in the network ** ** ** ** Inputs: i: Index of the first operator to update ** - ** Others: _emm_plmn_list ** ** ** ** Outputs: None ** ** Return: The size of the list in bytes ** - ** Others: _emm_data.plist ** ** ** ***************************************************************************/ -int IdleMode_update_plmn_list(int i) +int IdleMode_update_plmn_list(emm_plmn_list_t *emm_plmn_list, emm_data_t *emm_data, int i) { int offset = 0; int n = 1; - while ( (i < _emm_plmn_list.n_plmns) && (offset < EMM_DATA_BUFFER_SIZE) ) { - struct plmn_param_t *plmn = &(_emm_plmn_list.param[i++]); + while ( (i < emm_plmn_list->n_plmns) && (offset < EMM_DATA_BUFFER_SIZE) ) { + struct plmn_param_t *plmn = &(emm_plmn_list->param[i++]); if (n++ > 1) { - offset += snprintf(_emm_data.plist.buffer + offset, + offset += snprintf(emm_data->plist.buffer + offset, EMM_DATA_BUFFER_SIZE - offset, ","); } - offset += snprintf(_emm_data.plist.buffer + offset, + offset += snprintf(emm_data->plist.buffer + offset, EMM_DATA_BUFFER_SIZE - offset, "(%d,%s,%s,%s", plmn->stat, plmn->fullname, plmn->shortname, plmn->num); if (plmn->rat != NET_ACCESS_UNAVAILABLE) { - offset += snprintf(_emm_data.plist.buffer + offset, + offset += snprintf(emm_data->plist.buffer + offset, EMM_DATA_BUFFER_SIZE - offset, ",%d", plmn->rat); } - offset += snprintf(_emm_data.plist.buffer + offset, + offset += snprintf(emm_data->plist.buffer + offset, EMM_DATA_BUFFER_SIZE - offset, ")"); } @@ -327,13 +272,13 @@ int IdleMode_update_plmn_list(int i) ** Others: None ** ** ** ***************************************************************************/ -const char *IdleMode_get_plmn_fullname(const plmn_t *plmn, int index, +const char *IdleMode_get_plmn_fullname(emm_plmn_list_t *emm_plmn_list, const plmn_t *plmn, int index, size_t *len) { - if (index < _emm_plmn_list.n_plmns) { - assert( PLMNS_ARE_EQUAL(*plmn, *_emm_plmn_list.plmn[index]) ); - *len = strlen(_emm_plmn_list.param[index].fullname); - return _emm_plmn_list.param[index].fullname; + if (index < emm_plmn_list->n_plmns) { + assert( PLMNS_ARE_EQUAL(*plmn, *emm_plmn_list->plmn[index]) ); + *len = strlen(emm_plmn_list->param[index].fullname); + return emm_plmn_list->param[index].fullname; } return NULL; @@ -356,13 +301,13 @@ const char *IdleMode_get_plmn_fullname(const plmn_t *plmn, int index, ** Others: None ** ** ** ***************************************************************************/ -const char *IdleMode_get_plmn_shortname(const plmn_t *plmn, int index, +const char *IdleMode_get_plmn_shortname(emm_plmn_list_t *emm_plmn_list, const plmn_t *plmn, int index, size_t *len) { - if (index < _emm_plmn_list.n_plmns) { - assert( PLMNS_ARE_EQUAL(*plmn, *_emm_plmn_list.plmn[index]) ); - *len = strlen(_emm_plmn_list.param[index].shortname); - return _emm_plmn_list.param[index].shortname; + if (index < emm_plmn_list->n_plmns) { + assert( PLMNS_ARE_EQUAL(*plmn, *emm_plmn_list->plmn[index]) ); + *len = strlen(emm_plmn_list->param[index].shortname); + return emm_plmn_list->param[index].shortname; } return NULL; @@ -386,12 +331,12 @@ const char *IdleMode_get_plmn_shortname(const plmn_t *plmn, int index, ** Others: None ** ** ** ***************************************************************************/ -const char *IdleMode_get_plmn_id(const plmn_t *plmn, int index, size_t *len) +const char *IdleMode_get_plmn_id(emm_plmn_list_t *emm_plmn_list, const plmn_t *plmn, int index, size_t *len) { - if (index < _emm_plmn_list.n_plmns) { - assert( PLMNS_ARE_EQUAL(*plmn, *_emm_plmn_list.plmn[index]) ); - *len = strlen(_emm_plmn_list.param[index].num); - return _emm_plmn_list.param[index].num; + if (index < emm_plmn_list->n_plmns) { + assert( PLMNS_ARE_EQUAL(*plmn, *emm_plmn_list->plmn[index]) ); + *len = strlen(emm_plmn_list->param[index].num); + return emm_plmn_list->param[index].num; } return NULL; @@ -413,13 +358,13 @@ const char *IdleMode_get_plmn_id(const plmn_t *plmn, int index, size_t *len) ** Others: None ** ** ** ***************************************************************************/ -int IdleMode_get_plmn_fullname_index(const char *plmn) +int IdleMode_get_plmn_fullname_index(emm_plmn_list_t *emm_plmn_list, const char *plmn) { int index; /* Get the index of the PLMN identifier with specified full name */ - for (index = 0; index < _emm_plmn_list.n_plmns; index++) { - if ( strncmp(plmn, _emm_plmn_list.param[index].fullname, + for (index = 0; index < emm_plmn_list->n_plmns; index++) { + if ( strncmp(plmn, emm_plmn_list->param[index].fullname, NET_FORMAT_LONG_SIZE) != 0 ) { continue; } @@ -446,13 +391,13 @@ int IdleMode_get_plmn_fullname_index(const char *plmn) ** Others: None ** ** ** ***************************************************************************/ -int IdleMode_get_plmn_shortname_index(const char *plmn) +int IdleMode_get_plmn_shortname_index(emm_plmn_list_t *emm_plmn_list, const char *plmn) { int index; /* Get the index of the PLMN identifier with specified short name */ - for (index = 0; index < _emm_plmn_list.n_plmns; index++) { - if ( !strncmp(plmn, _emm_plmn_list.param[index].shortname, + for (index = 0; index < emm_plmn_list->n_plmns; index++) { + if ( !strncmp(plmn, emm_plmn_list->param[index].shortname, NET_FORMAT_SHORT_SIZE) ) { continue; } @@ -479,13 +424,13 @@ int IdleMode_get_plmn_shortname_index(const char *plmn) ** Others: None ** ** ** ***************************************************************************/ -int IdleMode_get_plmn_id_index(const char *plmn) +int IdleMode_get_plmn_id_index(emm_plmn_list_t *emm_plmn_list, const char *plmn) { int index; /* Get the index of the PLMN identifier with specified numeric identifier */ - for (index = 0; index < _emm_plmn_list.n_plmns; index++) { - if ( !strncmp(plmn, _emm_plmn_list.param[index].num, + for (index = 0; index < emm_plmn_list->n_plmns; index++) { + if ( !strncmp(plmn, emm_plmn_list->param[index].num, NET_FORMAT_LONG_SIZE) ) { continue; } @@ -510,66 +455,67 @@ int IdleMode_get_plmn_id_index(const char *plmn) ** to PLMN selection procedure. ** ** ** ** Inputs: None ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** ** Others: _emm_plmn_list ** ** ** ***************************************************************************/ -int emm_proc_initialize(void) +int emm_proc_initialize(nas_user_t *user) { LOG_FUNC_IN; emm_sap_t emm_sap; int rc; int i; + emm_plmn_list_t *emm_plmn_list = user->emm_plmn_list; - if (!_emm_data.usim_is_valid) { + if (!user->emm_data->usim_is_valid) { /* The USIM application is not present or not valid */ LOG_TRACE(WARNING, "EMM-IDLE - USIM is not valid"); emm_sap.primitive = EMMREG_NO_IMSI; } else { /* The highest priority is given to either the "equivalent PLMNs" * if available, or the last registered PLMN */ - if (_emm_data.nvdata.eplmn.n_plmns > 0) { - for (i=0; i < _emm_data.nvdata.eplmn.n_plmns; i++) { - _emm_plmn_list.plmn[_emm_plmn_list.n_plmns++] = - &_emm_data.nvdata.eplmn.plmn[i]; + if (user->emm_data->nvdata.eplmn.n_plmns > 0) { + for (i=0; i < user->emm_data->nvdata.eplmn.n_plmns; i++) { + emm_plmn_list->plmn[emm_plmn_list->n_plmns++] = + &user->emm_data->nvdata.eplmn.plmn[i]; } - } else if ( PLMN_IS_VALID(_emm_data.nvdata.rplmn) ) { - _emm_plmn_list.plmn[_emm_plmn_list.n_plmns++] = - &_emm_data.nvdata.rplmn; + } else if ( PLMN_IS_VALID(user->emm_data->nvdata.rplmn) ) { + emm_plmn_list->plmn[emm_plmn_list->n_plmns++] = + &user->emm_data->nvdata.rplmn; } /* Update the index of the HPLMN or EHPLM of highest priority. * When switched on, the UE will try to automatically register * to each previous PLMN within the ordered list of available * PLMNs regardless of the network selection mode of operation */ - _emm_plmn_list.hplmn = _emm_plmn_list.n_plmns - 1; - // LG_emm_plmn_list.hplmn = _emm_plmn_list.n_plmns; + emm_plmn_list->hplmn = emm_plmn_list->n_plmns - 1; + // LGemm_plmn_list->hplmn = emm_plmn_list->n_plmns; /* Add the highest priority PLMN in the list of "equivalent HPLMNs" if present and not empty, or the HPLMN derived from the IMSI */ - if (_emm_data.ehplmn.n_plmns > 0) { - _emm_plmn_list.plmn[_emm_plmn_list.n_plmns++] = - &_emm_data.ehplmn.plmn[0]; + if (user->emm_data->ehplmn.n_plmns > 0) { + emm_plmn_list->plmn[emm_plmn_list->n_plmns++] = + &user->emm_data->ehplmn.plmn[0]; } else { - _emm_plmn_list.plmn[_emm_plmn_list.n_plmns++] = &_emm_data.hplmn; + emm_plmn_list->plmn[emm_plmn_list->n_plmns++] = &user->emm_data->hplmn; } /* Each PLMN/access technology combination in the "User * Controlled PLMN Selector with Access Technology" */ - for (i=0; i < _emm_data.plmn.n_plmns; i++) { - _emm_plmn_list.plmn[_emm_plmn_list.n_plmns++] = - &_emm_data.plmn.plmn[i]; + for (i=0; i < user->emm_data->plmn.n_plmns; i++) { + emm_plmn_list->plmn[emm_plmn_list->n_plmns++] = + &user->emm_data->plmn.plmn[i]; } /* Each PLMN/access technology combination in the "Operator * Controlled PLMN Selector with Access Technology" */ - for (i=0; i < _emm_data.oplmn.n_plmns; i++) { - _emm_plmn_list.plmn[_emm_plmn_list.n_plmns++] = - &_emm_data.oplmn.plmn[i]; + for (i=0; i < user->emm_data->oplmn.n_plmns; i++) { + emm_plmn_list->plmn[emm_plmn_list->n_plmns++] = + &user->emm_data->oplmn.plmn[i]; } /* Other PLMN/access technology combinations with received @@ -581,21 +527,21 @@ int emm_proc_initialize(void) /* TODO: Schedule periodic network selection attemps (hpplmn timer) */ /* Initialize the PLMNs' parameters */ - for (i=0; i < _emm_plmn_list.n_plmns; i++) { - struct plmn_param_t *plmn = &(_emm_plmn_list.param[i]); - int id = _IldlMode_get_opnn_id(_emm_plmn_list.plmn[i]); + for (i=0; i < emm_plmn_list->n_plmns; i++) { + struct plmn_param_t *plmn = &(emm_plmn_list->param[i]); + int id = _IldlMode_get_opnn_id(user->emm_data, emm_plmn_list->plmn[i]); if (id < 0) { plmn->fullname[0] = '\0'; plmn->shortname[0] = '\0'; } else { - strncpy(plmn->fullname, _emm_data.opnn[id].fullname, + strncpy(plmn->fullname, user->emm_data->opnn[id].fullname, NET_FORMAT_LONG_SIZE); - strncpy(plmn->shortname, _emm_data.opnn[id].shortname, + strncpy(plmn->shortname, user->emm_data->opnn[id].shortname, NET_FORMAT_SHORT_SIZE); } - (void)_IdleMode_plmn_str(plmn->num, _emm_plmn_list.plmn[i]); + (void)_IdleMode_plmn_str(plmn->num, emm_plmn_list->plmn[i]); plmn->stat = NET_OPER_UNKNOWN; plmn->tac = 0; plmn->ci = 0; @@ -603,14 +549,14 @@ int emm_proc_initialize(void) } LOG_TRACE(INFO, "EMM-IDLE - %d PLMNs available for network selection", - _emm_plmn_list.n_plmns); + emm_plmn_list->n_plmns); /* Notify EMM that PLMN selection procedure has to be executed */ emm_sap.primitive = EMMREG_REGISTER_REQ; emm_sap.u.emm_reg.u.regist.index = 0; } - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN(rc); @@ -634,35 +580,38 @@ int emm_proc_initialize(void) ** mode. ** ** ** ** Inputs: None ** - ** Others: _emm_plmn_list, _emm_data ** + ** Others: _emm_plmn_list, user->emm_data-> ** ** ** ** Outputs: None ** ** Return: None ** - ** Others: _emm_plmn_list.index ** + ** Others: emm_plmn_list->index ** ** ** ***************************************************************************/ -int emm_proc_plmn_selection(int index) +int emm_proc_plmn_selection(nas_user_t *user, int index) { LOG_FUNC_IN; + emm_data_t *emm_data = user->emm_data; + user_api_id_t *user_api_id = user->user_api_id; + emm_plmn_list_t *emm_plmn_list = user->emm_plmn_list; int rc = RETURNok; - if (_emm_data.plmn_mode != EMM_DATA_PLMN_AUTO) { + if (emm_data->plmn_mode != EMM_DATA_PLMN_AUTO) { /* * Manual or manual/automatic mode of operation * -------------------------------------------- */ - if (index >= _emm_plmn_list.hplmn) { + if (index >= emm_plmn_list->hplmn) { /* * Selection of the last registered or equivalent PLMNs failed */ - if (_emm_data.plmn_index < 0) { + if (emm_data->plmn_index < 0) { /* * The user did not select any PLMN yet; display the ordered * list of available PLMNs to the user */ index = -1; - rc = emm_proc_network_notify(_emm_plmn_list.hplmn); + rc = emm_proc_network_notify(emm_plmn_list, user_api_id, emm_data, emm_plmn_list->hplmn); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-IDLE - Failed to notify " @@ -672,7 +621,7 @@ int emm_proc_plmn_selection(int index) /* * Try to register to the PLMN manually selected by the user */ - index = _emm_data.plmn_index; + index = emm_data->plmn_index; } } } @@ -685,8 +634,8 @@ int emm_proc_plmn_selection(int index) * or any other PLMN in the ordered list of available PLMNs in * automatic mode. */ - _emm_plmn_list.index = index; - rc = _IdleMode_get_suitable_cell(index); + emm_plmn_list->index = index; + rc = _IdleMode_get_suitable_cell(user, index); } LOG_FUNC_RETURN (rc); @@ -721,47 +670,48 @@ int emm_proc_plmn_selection(int index) ** ci: The identifier of the cell ** ** rat: The radio access technology supported by ** ** the cell ** - ** Others: _emm_plmn_list, _emm_data ** ** ** ** Outputs: None ** ** Return: None ** - ** Others: _emm_plmn_list, _emm_data ** ** ** ***************************************************************************/ -int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) +int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, AcT_t rat) { LOG_FUNC_IN; emm_sap_t emm_sap; int rc = RETURNerror; - int index = _emm_plmn_list.index; + emm_data_t *emm_data = user->emm_data; + emm_plmn_list_t *emm_plmn_list = user->emm_plmn_list; + user_api_id_t *user_api_id = user->user_api_id; + int index = emm_plmn_list->index; int select_next_plmn = FALSE; LOG_TRACE(INFO, "EMM-IDLE - %s cell found for PLMN %d in %s mode", (found)? "One" : "No", index, - (_emm_data.plmn_mode == EMM_DATA_PLMN_AUTO)? "Automatic" : - (_emm_data.plmn_mode == EMM_DATA_PLMN_MANUAL)? "Manual" : + (emm_data->plmn_mode == EMM_DATA_PLMN_AUTO)? "Automatic" : + (emm_data->plmn_mode == EMM_DATA_PLMN_MANUAL)? "Manual" : "Automatic/manual"); if (found) { int is_forbidden = FALSE; /* Select the PLMN of which a suitable cell has been found */ - _emm_data.splmn = *_emm_plmn_list.plmn[index]; + emm_data->splmn = *emm_plmn_list->plmn[index]; /* Update the selected PLMN's parameters */ - _emm_plmn_list.param[index].tac = tac; - _emm_plmn_list.param[index].ci = ci; - _emm_plmn_list.param[index].rat = rat; + emm_plmn_list->param[index].tac = tac; + emm_plmn_list->param[index].ci = ci; + emm_plmn_list->param[index].rat = rat; /* Update the location data and notify EMM that data have changed */ - rc = emm_proc_location_notify(tac, ci , rat); + rc = emm_proc_location_notify(user_api_id, emm_data, tac, ci , rat); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-IDLE - Failed to notify location update"); } - if (_emm_data.plmn_mode == EMM_DATA_PLMN_AUTO) { + if (emm_data->plmn_mode == EMM_DATA_PLMN_AUTO) { /* * Automatic mode of operation * --------------------------- @@ -769,17 +719,17 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) int i; /* Check if the selected PLMN is in the forbidden list */ - for (i = 0; i < _emm_data.fplmn.n_plmns; i++) { - if (PLMNS_ARE_EQUAL(_emm_data.splmn, _emm_data.fplmn.plmn[i])) { + for (i = 0; i < emm_data->fplmn.n_plmns; i++) { + if (PLMNS_ARE_EQUAL(emm_data->splmn, emm_data->fplmn.plmn[i])) { is_forbidden = TRUE; break; } } if (!is_forbidden) { - for (i = 0; i < _emm_data.fplmn_gprs.n_plmns; i++) { - if (PLMNS_ARE_EQUAL(_emm_data.splmn, - _emm_data.fplmn_gprs.plmn[i])) { + for (i = 0; i < emm_data->fplmn_gprs.n_plmns; i++) { + if (PLMNS_ARE_EQUAL(emm_data->splmn, + emm_data->fplmn_gprs.plmn[i])) { is_forbidden = TRUE; break; } @@ -789,12 +739,12 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) /* Check if the selected PLMN belongs to a forbidden * tracking area */ tai_t tai; - tai.plmn = _emm_data.splmn; + tai.plmn = emm_data->splmn; tai.tac = tac; if (!is_forbidden) { - for (i = 0; i < _emm_data.ftai.n_tais; i++) { - if (TAIS_ARE_EQUAL(tai, _emm_data.ftai.tai[i])) { + for (i = 0; i < emm_data->ftai.n_tais; i++) { + if (TAIS_ARE_EQUAL(tai, emm_data->ftai.tai[i])) { is_forbidden = TRUE; break; } @@ -802,8 +752,8 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) } if (!is_forbidden) { - for (i = 0; i < _emm_data.ftai_roaming.n_tais; i++) { - if (TAIS_ARE_EQUAL(tai, _emm_data.ftai_roaming.tai[i])) { + for (i = 0; i < emm_data->ftai_roaming.n_tais; i++) { + if (TAIS_ARE_EQUAL(tai, emm_data->ftai_roaming.tai[i])) { is_forbidden = TRUE; break; } @@ -814,30 +764,28 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) if (is_forbidden) { /* The selected cell is known not to be able to provide normal * service */ - LOG_TRACE(INFO, "EMM-IDLE - UE may camp on this acceptable cell ", - "for limited services"); + LOG_TRACE(INFO, "EMM-IDLE - UE may camp on this acceptable cell for limited services"); /* Save the index of the first forbidden PLMN */ - if (_emm_plmn_list.fplmn < 0) { - _emm_plmn_list.fplmn = index; + if (emm_plmn_list->fplmn < 0) { + emm_plmn_list->fplmn = index; } - _emm_plmn_list.param[index].stat = NET_OPER_FORBIDDEN; + emm_plmn_list->param[index].stat = NET_OPER_FORBIDDEN; } else { /* A suitable cell has been found and the PLMN or tracking area * is not in the forbidden list */ - LOG_TRACE(INFO, "EMM-IDLE - UE may camp on this suitable cell ", - "for normal services"); - _emm_plmn_list.fplmn = -1; - _emm_plmn_list.param[index].stat = NET_OPER_CURRENT; + LOG_TRACE(INFO, "EMM-IDLE - UE may camp on this suitable cell for normal services"); + emm_plmn_list->fplmn = -1; + emm_plmn_list->param[index].stat = NET_OPER_CURRENT; emm_sap.primitive = EMMREG_REGISTER_CNF; } /* Duplicate the new selected PLMN at the end of the ordered list */ - _emm_plmn_list.plmn[_emm_plmn_list.n_plmns] = &_emm_data.splmn; + emm_plmn_list->plmn[emm_plmn_list->n_plmns] = &emm_data->splmn; } - else if (_emm_data.plmn_mode == EMM_DATA_PLMN_AUTO) { + else if (emm_data->plmn_mode == EMM_DATA_PLMN_AUTO) { /* * Automatic mode of operation * --------------------------- @@ -848,12 +796,12 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) select_next_plmn = TRUE; /* Bypass the previously selected PLMN */ - if (index == _emm_plmn_list.splmn) { + if (index == emm_plmn_list->splmn) { index += 1; } } - else if (_emm_data.plmn_index < 0) { + else if (emm_data->plmn_index < 0) { /* * Manual or manual/automatic mode of operation * -------------------------------------------- @@ -864,7 +812,7 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) select_next_plmn = TRUE; } - else if (_emm_data.plmn_mode == EMM_DATA_PLMN_MANUAL) { + else if (emm_data->plmn_mode == EMM_DATA_PLMN_MANUAL) { /* * Manual mode of operation * ------------------------ @@ -880,8 +828,8 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) * Attempt to find a suitable cell of the PLMN selected by the user * failed; Try to automatically select another PLMN */ - _emm_data.plmn_mode = EMM_DATA_PLMN_AUTO; - index = _emm_plmn_list.hplmn; + emm_data->plmn_mode = EMM_DATA_PLMN_AUTO; + index = emm_plmn_list->hplmn; select_next_plmn = TRUE; } @@ -889,17 +837,17 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) * Force an attempt to register to the next PLMN */ if (select_next_plmn) { - int last_plmn_index = _emm_plmn_list.n_plmns; + int last_plmn_index = emm_plmn_list->n_plmns; - if (_emm_plmn_list.splmn != -1) { + if (emm_plmn_list->splmn != -1) { /* The last attempt was to register the previously selected PLMN */ last_plmn_index += 1; } if (index < last_plmn_index) { /* Try to select the next PLMN in the list of available PLMNs */ - _emm_plmn_list.index = index; - rc = emm_proc_plmn_selection(index); + emm_plmn_list->index = index; + rc = emm_proc_plmn_selection(user, index); } else { /* No suitable cell of any PLMN within the ordered list * of available PLMNs has been found */ @@ -912,43 +860,43 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) * Or terminate the PLMN selection procedure */ if (!select_next_plmn) { - if (!(_emm_plmn_list.fplmn) < 0) { // FIXME this comparison makes no sense (bool < 0) + if (emm_plmn_list->fplmn >= 0) { /* There were one or more PLMNs which were available and allowable, * but an LR failure made registration on those PLMNs unsuccessful * or an entry in any of the forbidden area lists prevented a * registration attempt; select the first such PLMN and enters a * limited service state. */ - index = _emm_plmn_list.fplmn; - _emm_plmn_list.fplmn = -1; + index = emm_plmn_list->fplmn; + emm_plmn_list->fplmn = -1; emm_sap.primitive = EMMREG_REGISTER_REJ; } /* Update the availability indicator of the previously selected PLMN */ - if (_emm_plmn_list.splmn != -1) { - _emm_plmn_list.param[_emm_plmn_list.splmn].stat = NET_OPER_UNKNOWN; + if (emm_plmn_list->splmn != -1) { + emm_plmn_list->param[emm_plmn_list->splmn].stat = NET_OPER_UNKNOWN; } /* Update the index of the new selected PLMN */ if (emm_sap.primitive != EMMREG_NO_CELL) { - _emm_plmn_list.splmn = index; + emm_plmn_list->splmn = index; } else { - _emm_plmn_list.splmn = -1; + emm_plmn_list->splmn = -1; } /* * Notify EMM that PLMN selection procedure has completed */ - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); - if (_emm_plmn_list.splmn != -1) { - if (_emm_plmn_list.splmn == _emm_plmn_list.rplmn) { + if (emm_plmn_list->splmn != -1) { + if (emm_plmn_list->splmn == emm_plmn_list->rplmn) { /* The selected PLMN is the registered PLMN */ LOG_TRACE(INFO, "EMM-IDLE - The selected PLMN is the registered PLMN"); - _emm_data.is_rplmn = TRUE; - } else if (_emm_plmn_list.splmn < _emm_plmn_list.hplmn) { + emm_data->is_rplmn = TRUE; + } else if (emm_plmn_list->splmn < emm_plmn_list->hplmn) { /* The selected PLMN is in the list of equivalent PLMNs */ LOG_TRACE(INFO, "EMM-IDLE - The selected PLMN is in the list of equivalent PLMNs"); - _emm_data.is_eplmn = TRUE; + emm_data->is_eplmn = TRUE; } /* @@ -956,7 +904,7 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) * to register the presence of the UE to the selected PLMN */ emm_sap.primitive = EMMREG_ATTACH_INIT; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } } @@ -982,20 +930,20 @@ int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ***************************************************************************/ -int emm_proc_registration_notify(Stat_t status) +int emm_proc_registration_notify(user_api_id_t *user_api_id, emm_data_t *emm_data, Stat_t status) { LOG_FUNC_IN; int rc = RETURNok; /* Update the network registration status */ - if (_emm_data.stat != status) { - _emm_data.stat = status; + if (emm_data->stat != status) { + emm_data->stat = status; /* Notify EMM that data has changed */ - rc = (*_emm_indication_notify)(1); + rc = (*_emm_indication_notify)(user_api_id, emm_data, 1); } LOG_FUNC_RETURN (rc); @@ -1016,24 +964,24 @@ int emm_proc_registration_notify(Stat_t status) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ***************************************************************************/ -int emm_proc_location_notify(tac_t tac, ci_t ci, AcT_t rat) +int emm_proc_location_notify(user_api_id_t *user_api_id, emm_data_t *emm_data, tac_t tac, ci_t ci, AcT_t rat) { LOG_FUNC_IN; int rc = RETURNok; /* Update the location information */ - if ( (_emm_data.tac != tac) || - (_emm_data.ci != ci) || - (_emm_data.rat != rat) ) { - _emm_data.tac = tac; - _emm_data.ci = ci; - _emm_data.rat = rat; + if ( (emm_data->tac != tac) || + (emm_data->ci != ci) || + (emm_data->rat != rat) ) { + emm_data->tac = tac; + emm_data->ci = ci; + emm_data->rat = rat; /* Notify EMM that data has changed */ - rc = (*_emm_indication_notify)(0); + rc = (*_emm_indication_notify)(user_api_id, emm_data, 0); } LOG_FUNC_RETURN (rc); @@ -1053,17 +1001,17 @@ int emm_proc_location_notify(tac_t tac, ci_t ci, AcT_t rat) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ***************************************************************************/ -int emm_proc_network_notify(int index) +int emm_proc_network_notify(emm_plmn_list_t *emm_plmn_list, user_api_id_t *user_api_id, emm_data_t *emm_data, int index) { LOG_FUNC_IN; /* Update the list of operators present in the network */ - int size = IdleMode_update_plmn_list(index); + int size = IdleMode_update_plmn_list(emm_plmn_list, emm_data, index); /* Notify EMM that data has changed */ - int rc = (*_emm_indication_notify)(size); + int rc = (*_emm_indication_notify)(user_api_id, emm_data, size); LOG_FUNC_RETURN (rc); } @@ -1132,7 +1080,6 @@ static int _IdleMode_plmn_str(char *plmn_str, const plmn_t *plmn) ** tor network name records ** ** ** ** Inputs: plmn: The PLMN identifier ** - ** Others: _emm_data ** ** ** ** Outputs: None ** ** Return: The index of the PLMN if found in the list ** @@ -1141,32 +1088,32 @@ static int _IdleMode_plmn_str(char *plmn_str, const plmn_t *plmn) ** Others: None ** ** ** ***************************************************************************/ -static int _IldlMode_get_opnn_id(const plmn_t *plmn) +static int _IldlMode_get_opnn_id(emm_data_t *emm_data, const plmn_t *plmn) { int i; - for (i = 0; i < _emm_data.n_opnns; i++) { - if (plmn->MCCdigit1 != _emm_data.opnn[i].plmn->MCCdigit1) { + for (i = 0; i < emm_data->n_opnns; i++) { + if (plmn->MCCdigit1 != emm_data->opnn[i].plmn->MCCdigit1) { continue; } - if (plmn->MCCdigit2 != _emm_data.opnn[i].plmn->MCCdigit2) { + if (plmn->MCCdigit2 != emm_data->opnn[i].plmn->MCCdigit2) { continue; } - if (plmn->MCCdigit3 != _emm_data.opnn[i].plmn->MCCdigit3) { + if (plmn->MCCdigit3 != emm_data->opnn[i].plmn->MCCdigit3) { continue; } - if (plmn->MNCdigit1 != _emm_data.opnn[i].plmn->MNCdigit1) { + if (plmn->MNCdigit1 != emm_data->opnn[i].plmn->MNCdigit1) { continue; } - if (plmn->MNCdigit2 != _emm_data.opnn[i].plmn->MNCdigit2) { + if (plmn->MNCdigit2 != emm_data->opnn[i].plmn->MNCdigit2) { continue; } - if (plmn->MNCdigit3 != _emm_data.opnn[i].plmn->MNCdigit3) { + if (plmn->MNCdigit3 != emm_data->opnn[i].plmn->MNCdigit3) { continue; } @@ -1187,22 +1134,23 @@ static int _IldlMode_get_opnn_id(const plmn_t *plmn) ** ** ** Inputs: index: Index of the selected PLMN in the ordered ** ** list of available PLMNs ** - ** Others: _emm_plmn_list.plmn ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** ** Others: None ** ** ** ***************************************************************************/ -static int _IdleMode_get_suitable_cell(int index) +static int _IdleMode_get_suitable_cell(nas_user_t *user, int index) { emm_sap_t emm_sap; - const plmn_t *plmn = _emm_plmn_list.plmn[index]; + emm_data_t *emm_data = user->emm_data; + emm_plmn_list_t *emm_plmn_list = user->emm_plmn_list; + const plmn_t *plmn = emm_plmn_list->plmn[index]; LOG_TRACE(INFO, "EMM-IDLE - Trying to search a suitable cell " "of PLMN %d in %s mode", index, - (_emm_data.plmn_mode == EMM_DATA_PLMN_AUTO)? "Automatic" : - (_emm_data.plmn_mode == EMM_DATA_PLMN_MANUAL)? "Manual" : + (emm_data->plmn_mode == EMM_DATA_PLMN_AUTO)? "Automatic" : + (emm_data->plmn_mode == EMM_DATA_PLMN_MANUAL)? "Manual" : "Automatic/manual"); /* * Notify EMM-AS SAP that cell information related to the given @@ -1212,12 +1160,12 @@ static int _IdleMode_get_suitable_cell(int index) emm_sap.u.emm_as.u.cell_info.plmnIDs.n_plmns = 1; emm_sap.u.emm_as.u.cell_info.plmnIDs.plmn[0] = *plmn; - if (_emm_data.plmn_rat != NET_ACCESS_UNAVAILABLE) { - emm_sap.u.emm_as.u.cell_info.rat = (1 << _emm_data.plmn_rat); + if (emm_data->plmn_rat != NET_ACCESS_UNAVAILABLE) { + emm_sap.u.emm_as.u.cell_info.rat = (1 << emm_data->plmn_rat); } else { emm_sap.u.emm_as.u.cell_info.rat = NET_ACCESS_UNAVAILABLE; } - return emm_sap_send(&emm_sap); + return emm_sap_send(user, &emm_sap); } diff --git a/openair3/NAS/UE/EMM/IdleMode.h b/openair3/NAS/UE/EMM/IdleMode.h old mode 100755 new mode 100644 index c0e13c9a7d..4584877974 --- a/openair3/NAS/UE/EMM/IdleMode.h +++ b/openair3/NAS/UE/EMM/IdleMode.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source IdleMode.h @@ -48,6 +41,7 @@ Description Defines the functions used to get information from the list #define __IDLEMODE_H__ #include "commonDef.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -57,7 +51,7 @@ Description Defines the functions used to get information from the list /************************ G L O B A L T Y P E S ************************/ /****************************************************************************/ -typedef int (*IdleMode_callback_t) (int); +typedef int (*IdleMode_callback_t) (user_api_id_t *user_api_id, emm_data_t *emm_data, int); /****************************************************************************/ /******************** G L O B A L V A R I A B L E S ********************/ @@ -67,23 +61,23 @@ typedef int (*IdleMode_callback_t) (int); /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -void IdleMode_initialize(IdleMode_callback_t cb); +void IdleMode_initialize(nas_user_t *user, IdleMode_callback_t cb); -int IdleMode_get_nb_plmns(void); -int IdleMode_get_hplmn_index(void); -int IdleMode_get_rplmn_index(void); -int IdleMode_get_splmn_index(void); +int IdleMode_get_nb_plmns(emm_plmn_list_t *emm_plmn_list); +int IdleMode_get_hplmn_index(emm_plmn_list_t *emm_plmn_list); +int IdleMode_get_rplmn_index(emm_plmn_list_t *emm_plmn_list); +int IdleMode_get_splmn_index(emm_plmn_list_t *emm_plmn_list); -int IdleMode_update_plmn_list(int index); +int IdleMode_update_plmn_list(emm_plmn_list_t *emm_plmn_list, emm_data_t *emm_data, int i); -const char *IdleMode_get_plmn_fullname(const plmn_t *plmn, int index, +const char *IdleMode_get_plmn_fullname(emm_plmn_list_t *emm_plmn_list, const plmn_t *plmn, int index, size_t *len); -const char *IdleMode_get_plmn_shortname(const plmn_t *plmn, int index, +const char *IdleMode_get_plmn_shortname(emm_plmn_list_t *emm_plmn_list, const plmn_t *plmn, int index, size_t *len); -const char *IdleMode_get_plmn_id(const plmn_t *plmn, int index, size_t *len); +const char *IdleMode_get_plmn_id(emm_plmn_list_t *emm_plmn_list, const plmn_t *plmn, int index, size_t *len); -int IdleMode_get_plmn_fullname_index(const char *plmn); -int IdleMode_get_plmn_shortname_index(const char *plmn); -int IdleMode_get_plmn_id_index(const char *plmn); +int IdleMode_get_plmn_fullname_index(emm_plmn_list_t *emm_plmn_list, const char *plmn); +int IdleMode_get_plmn_shortname_index(emm_plmn_list_t *emm_plmn_list, const char *plmn); +int IdleMode_get_plmn_id_index(emm_plmn_list_t *emm_plmn_list, const char *plmn); #endif /* __IDLEMODE_H__*/ diff --git a/openair3/NAS/UE/EMM/IdleMode_defs.h b/openair3/NAS/UE/EMM/IdleMode_defs.h new file mode 100644 index 0000000000..8ef6c8e86d --- /dev/null +++ b/openair3/NAS/UE/EMM/IdleMode_defs.h @@ -0,0 +1,52 @@ +#ifndef _IDLEMODE_DEFS_H +#define _IDLEMODE_DEFS_H + +/* + * A list of PLMN identities in priority order is maintained locally + * to perform the PLMN selection procedure. + * + * In automatic mode of operation, this list is used for PLMN selection when + * the UE is switched on, or upon recovery from lack of coverage, or when the + * user requests the UE to initiate PLMN reselection, and registration. + * In manual mode of operation, this list is displayed to the user that may + * select an available PLMN and initiate registration. + * + * The list may contain PLMN identifiers in the following order: + * - The last registered PLMN or each equivalent PLMN present in the list of + * "equivalent PLMNs" (EPLMN_MAX), when UE is switched on or following + * recovery from lack of coverage; + * - The highest priority PLMN in the list of "equivalent HPLMNs" or the + * HPLMN derived from the IMSI (1) + * - Each PLMN/access technology combination in the "User Controlled PLMN + * Selector with Access Technology" (PLMN_MAX) + * - Each PLMN/access technology combination in the "Operator Controlled PLMN + * Selector with Access Technology" (OPLMN_MAX) + * - Other PLMN/access technology combinations with received high quality + * signal in random order (TODO) + * - Other PLMN/access technology combinations in order of decreasing signal + * quality (TODO) + * - The last selected PLMN again (1) + */ +typedef struct { + int n_plmns; +#define EMM_PLMN_LIST_SIZE (EMM_DATA_EPLMN_MAX + EMM_DATA_PLMN_MAX + \ + EMM_DATA_OPLMN_MAX + 2) + plmn_t *plmn[EMM_PLMN_LIST_SIZE]; + int index; /* Index of the PLMN for which selection is ongoing */ + int hplmn; /* Index of the home PLMN or the highest priority + * equivalent home PLMN */ + int fplmn; /* Index of the first forbidden PLMN */ + int splmn; /* Index of the currently selected PLMN */ + int rplmn; /* Index of the currently registered PLMN */ + struct plmn_param_t { + char fullname[NET_FORMAT_LONG_SIZE+1]; /* PLMN full identifier */ + char shortname[NET_FORMAT_SHORT_SIZE+1]; /* PLMN short identifier */ + char num[NET_FORMAT_NUM_SIZE+1]; /* PLMN numeric identifier */ + int stat; /* Indication of the PLMN availability */ + int tac; /* Location/Tracking Area Code */ + int ci; /* Serving cell identifier */ + int rat; /* Radio Access Technology supported by the serving cell */ + } param[EMM_PLMN_LIST_SIZE]; +} emm_plmn_list_t; + +#endif diff --git a/openair3/NAS/UE/EMM/LowerLayer.c b/openair3/NAS/UE/EMM/LowerLayer.c old mode 100755 new mode 100644 index 6e264d2a54..01b07fc356 --- a/openair3/NAS/UE/EMM/LowerLayer.c +++ b/openair3/NAS/UE/EMM/LowerLayer.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source LowerLayer.c @@ -67,17 +60,6 @@ Description Defines EMM procedures executed by the Non-Access Stratum /******************* L O C A L D E F I N I T I O N S *******************/ /****************************************************************************/ -/* - * Data structure used to handle EMM procedures executed by the UE upon - * receiving lower layer notifications - */ -static struct { - lowerlayer_success_callback_t success; /* Successful data delivery */ - lowerlayer_failure_callback_t failure; /* Lower layer failure */ - lowerlayer_release_callback_t release; /* NAS signalling release */ - void *args; /* EMM procedure argument parameters */ -} _lowerlayer_data; - /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ @@ -95,7 +77,6 @@ static struct { ** Description: Notify the EPS Mobility Management entity that data have ** ** been successfully delivered to the network ** ** ** - ** Inputs: ueid: UE lower layer identifier ** ** Others: None ** ** ** ** Outputs: None ** @@ -103,7 +84,7 @@ static struct { ** Others: None ** ** ** ***************************************************************************/ -int lowerlayer_success(unsigned int ueid) +int lowerlayer_success(nas_user_t *user) { LOG_FUNC_IN; @@ -111,8 +92,8 @@ int lowerlayer_success(unsigned int ueid) int rc; emm_sap.primitive = EMMREG_LOWERLAYER_SUCCESS; - emm_sap.u.emm_reg.ueid = ueid; - rc = emm_sap_send(&emm_sap); + emm_sap.u.emm_reg.ueid = user->ueid; + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -124,7 +105,6 @@ int lowerlayer_success(unsigned int ueid) ** Description: Notify the EPS Mobility Management entity that lower la- ** ** yers failed to deliver data to the network ** ** ** - ** Inputs: ueid: UE lower layer identifier ** ** Others: None ** ** ** ** Outputs: None ** @@ -132,7 +112,7 @@ int lowerlayer_success(unsigned int ueid) ** Others: None ** ** ** ***************************************************************************/ -int lowerlayer_failure(unsigned int ueid) +int lowerlayer_failure(nas_user_t *user) { LOG_FUNC_IN; @@ -140,8 +120,8 @@ int lowerlayer_failure(unsigned int ueid) int rc; emm_sap.primitive = EMMREG_LOWERLAYER_FAILURE; - emm_sap.u.emm_reg.ueid = ueid; - rc = emm_sap_send(&emm_sap); + emm_sap.u.emm_reg.ueid = user->ueid; + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -162,12 +142,12 @@ int lowerlayer_failure(unsigned int ueid) ** Others: None ** ** ** ***************************************************************************/ -int lowerlayer_establish(void) +int lowerlayer_establish(nas_user_t *user) { LOG_FUNC_IN; /* Update the EPS Connection Management status */ - _emm_data.ecm_status = ECM_CONNECTED; + user->emm_data->ecm_status = ECM_CONNECTED; LOG_FUNC_RETURN (RETURNok); } @@ -187,7 +167,7 @@ int lowerlayer_establish(void) ** Others: None ** ** ** ***************************************************************************/ -int lowerlayer_release(int cause) +int lowerlayer_release(nas_user_t *user, int cause) { LOG_FUNC_IN; @@ -195,11 +175,11 @@ int lowerlayer_release(int cause) int rc; /* Update the EPS Connection Management status */ - _emm_data.ecm_status = ECM_IDLE; + user->emm_data->ecm_status = ECM_IDLE; emm_sap.primitive = EMMREG_LOWERLAYER_RELEASE; - emm_sap.u.emm_reg.ueid = 0; - rc = emm_sap_send(&emm_sap); + emm_sap.u.emm_reg.ueid = user->ueid; + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -211,7 +191,6 @@ int lowerlayer_release(int cause) ** Description: Notify the EPS Session Management entity that data have ** ** been received from lower layers ** ** ** - ** Inputs: ueid: UE lower layer identifier ** ** data: Data transfered from lower layers ** ** Others: None ** ** ** @@ -220,7 +199,7 @@ int lowerlayer_release(int cause) ** Others: None ** ** ** ***************************************************************************/ -int lowerlayer_data_ind(unsigned int ueid, const OctetString *data) +int lowerlayer_data_ind(nas_user_t *user, const OctetString *data) { esm_sap_t esm_sap; int rc; @@ -230,10 +209,10 @@ int lowerlayer_data_ind(unsigned int ueid, const OctetString *data) esm_sap.primitive = ESM_UNITDATA_IND; esm_sap.is_standalone = TRUE; - esm_sap.ueid = ueid; + esm_sap.ueid = user->ueid; esm_sap.recv = data; - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); LOG_FUNC_RETURN (rc); } @@ -245,7 +224,6 @@ int lowerlayer_data_ind(unsigned int ueid, const OctetString *data) ** Description: Notify the EPS Mobility Management entity that data have ** ** to be transfered to lower layers ** ** ** - ** Inputs: ueid: UE lower layer identifier ** ** data: Data to be transfered to lower layers ** ** Others: None ** ** ** @@ -254,7 +232,7 @@ int lowerlayer_data_ind(unsigned int ueid, const OctetString *data) ** Others: None ** ** ** ***************************************************************************/ -int lowerlayer_data_req(unsigned int ueid, const OctetString *data) +int lowerlayer_data_req(nas_user_t *user, const OctetString *data) { LOG_FUNC_IN; @@ -264,16 +242,16 @@ int lowerlayer_data_req(unsigned int ueid, const OctetString *data) //struct emm_data_context_s *ctx = NULL; emm_sap.primitive = EMMAS_DATA_REQ; - emm_sap.u.emm_as.u.data.guti = _emm_data.guti; - emm_sap.u.emm_as.u.data.ueid = 0; - sctx = _emm_data.security; + emm_sap.u.emm_as.u.data.guti = user->emm_data->guti; + emm_sap.u.emm_as.u.data.ueid = user->ueid; + sctx = user->emm_data->security; emm_sap.u.emm_as.u.data.NASinfo = 0; emm_sap.u.emm_as.u.data.NASmsg.length = data->length; emm_sap.u.emm_as.u.data.NASmsg.value = data->value; /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.data.sctx, sctx, FALSE, TRUE); - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -304,17 +282,17 @@ int lowerlayer_data_req(unsigned int ueid, const OctetString *data) ** Others: _lowerlayer_data ** ** ** ***************************************************************************/ -int emm_proc_lowerlayer_initialize(lowerlayer_success_callback_t success, +int emm_proc_lowerlayer_initialize(lowerlayer_data_t *lowerlayer_data, lowerlayer_success_callback_t success, lowerlayer_failure_callback_t failure, lowerlayer_release_callback_t release, void *args) { LOG_FUNC_IN; - _lowerlayer_data.success = success; - _lowerlayer_data.failure = failure; - _lowerlayer_data.release = release; - _lowerlayer_data.args = args; + lowerlayer_data->success = success; + lowerlayer_data->failure = failure; + lowerlayer_data->release = release; + lowerlayer_data->args = args; LOG_FUNC_RETURN (RETURNok); } @@ -335,17 +313,17 @@ int emm_proc_lowerlayer_initialize(lowerlayer_success_callback_t success, ** Others: None ** ** ** ***************************************************************************/ -int emm_proc_lowerlayer_success(void) +int emm_proc_lowerlayer_success(lowerlayer_data_t *lowerlayer_data) { LOG_FUNC_IN; int rc = RETURNok; - lowerlayer_success_callback_t emm_callback = _lowerlayer_data.success; + lowerlayer_success_callback_t emm_callback = lowerlayer_data->success; if (emm_callback) { - rc = (*emm_callback)(_lowerlayer_data.args); - _lowerlayer_data.success = NULL; + rc = (*emm_callback)(lowerlayer_data->args); + lowerlayer_data->success = NULL; } LOG_FUNC_RETURN (rc); @@ -367,17 +345,17 @@ int emm_proc_lowerlayer_success(void) ** Others: None ** ** ** ***************************************************************************/ -int emm_proc_lowerlayer_failure(int is_initial) +int emm_proc_lowerlayer_failure(lowerlayer_data_t *lowerlayer_data, int is_initial) { LOG_FUNC_IN; int rc = RETURNok; - lowerlayer_failure_callback_t emm_callback = _lowerlayer_data.failure; + lowerlayer_failure_callback_t emm_callback = lowerlayer_data->failure; if (emm_callback) { - rc = (*emm_callback)(is_initial, _lowerlayer_data.args); - _lowerlayer_data.failure = NULL; + rc = (*emm_callback)(is_initial, lowerlayer_data->args); + lowerlayer_data->failure = NULL; } LOG_FUNC_RETURN (rc); @@ -398,17 +376,17 @@ int emm_proc_lowerlayer_failure(int is_initial) ** Others: None ** ** ** ***************************************************************************/ -int emm_proc_lowerlayer_release(void) +int emm_proc_lowerlayer_release(lowerlayer_data_t *lowerlayer_data) { LOG_FUNC_IN; int rc = RETURNok; - lowerlayer_release_callback_t emm_callback = _lowerlayer_data.release; + lowerlayer_release_callback_t emm_callback = lowerlayer_data->release; if (emm_callback) { - rc = (*emm_callback)(_lowerlayer_data.args); - _lowerlayer_data.release = NULL; + rc = (*emm_callback)(lowerlayer_data->args); + lowerlayer_data->release = NULL; } LOG_FUNC_RETURN (rc); diff --git a/openair3/NAS/UE/EMM/LowerLayer.h b/openair3/NAS/UE/EMM/LowerLayer.h old mode 100755 new mode 100644 index 80ee4acb2a..0d8eefc7f3 --- a/openair3/NAS/UE/EMM/LowerLayer.h +++ b/openair3/NAS/UE/EMM/LowerLayer.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source lowerlayer.h @@ -50,33 +43,17 @@ Description Defines EMM procedures executed by the Non-Access Stratum #define __LOWERLAYER_H__ #include "OctetString.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ /****************************************************************************/ -/* - * Type of EMM procedure callback function executed whenever data are - * successfully delivered to the network - */ -typedef int (*lowerlayer_success_callback_t)(void *); - -/* - * Type of EMM procedure callback function executed when data are not - * delivered to the network because a lower layer failure occurred - */ -typedef int (*lowerlayer_failure_callback_t)(int, void *); - -/* - * Type of EMM procedure callback function executed when NAS signalling - * connection is released - */ -typedef int (*lowerlayer_release_callback_t)(void *); - /****************************************************************************/ /************************ G L O B A L T Y P E S ************************/ /****************************************************************************/ + /****************************************************************************/ /******************** G L O B A L V A R I A B L E S ********************/ /****************************************************************************/ @@ -85,12 +62,26 @@ typedef int (*lowerlayer_release_callback_t)(void *); /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -int lowerlayer_success(unsigned int ueid); -int lowerlayer_failure(unsigned int ueid); -int lowerlayer_establish(void); -int lowerlayer_release(int cause); +/* + *--------------------------------------------------------------------------- + * Lower layer procedure + *--------------------------------------------------------------------------- + */ +int emm_proc_lowerlayer_initialize(lowerlayer_data_t *lowerlayer_data, lowerlayer_success_callback_t success, + lowerlayer_failure_callback_t failure, + lowerlayer_release_callback_t release, + void *args); +int emm_proc_lowerlayer_success(lowerlayer_data_t *lowerlayer_data); +int emm_proc_lowerlayer_failure(lowerlayer_data_t *lowerlayer_data, int is_initial); +int emm_proc_lowerlayer_release(lowerlayer_data_t *lowerlayer_data); -int lowerlayer_data_ind(unsigned int ueid, const OctetString *data); -int lowerlayer_data_req(unsigned int ueid, const OctetString *data); + +int lowerlayer_success(nas_user_t *user); +int lowerlayer_failure(nas_user_t *user); +int lowerlayer_establish(nas_user_t *user); +int lowerlayer_release(nas_user_t *user, int cause); + +int lowerlayer_data_ind(nas_user_t *user, const OctetString *data); +int lowerlayer_data_req(nas_user_t *user, const OctetString *data); #endif /* __LOWERLAYER_H__*/ diff --git a/openair3/NAS/UE/EMM/LowerLayer_defs.h b/openair3/NAS/UE/EMM/LowerLayer_defs.h new file mode 100644 index 0000000000..6035d4ed12 --- /dev/null +++ b/openair3/NAS/UE/EMM/LowerLayer_defs.h @@ -0,0 +1,33 @@ +#ifndef _LOWER_LAYER_DEFS_H +#define _LOWER_LAYER_DEFS_H + +/* + * Type of EMM procedure callback function executed whenever data are + * successfully delivered to the network + */ +typedef int (*lowerlayer_success_callback_t)(void *); + +/* + * Type of EMM procedure callback function executed when data are not + * delivered to the network because a lower layer failure occurred + */ +typedef int (*lowerlayer_failure_callback_t)(int, void *); + +/* + * Type of EMM procedure callback function executed when NAS signalling + * connection is released + */ +typedef int (*lowerlayer_release_callback_t)(void *); + +/* + * Data structure used to handle EMM procedures executed by the UE upon + * receiving lower layer notifications + */ +typedef struct { + lowerlayer_success_callback_t success; /* Successful data delivery */ + lowerlayer_failure_callback_t failure; /* Lower layer failure */ + lowerlayer_release_callback_t release; /* NAS signalling release */ + void *args; /* EMM procedure argument parameters */ +} lowerlayer_data_t; + +#endif diff --git a/openair3/NAS/UE/EMM/SAP/COPYING b/openair3/NAS/UE/EMM/SAP/COPYING deleted file mode 100755 index 94a9ed024d..0000000000 --- a/openair3/NAS/UE/EMM/SAP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c b/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c old mode 100755 new mode 100644 index 13a55b3846..71e2c4a49c --- a/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregistered.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregistered.c @@ -61,6 +54,7 @@ Description Implements the EPS Mobility Management procedures executed #include "nas_log.h" #include "emm_proc.h" +#include "user_defs.h" #include @@ -93,17 +87,17 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmDeregistered(const emm_reg_t *evt) +int EmmDeregistered(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; int rc = RETURNerror; - assert(emm_fsm_get_status() == EMM_DEREGISTERED); + assert(emm_fsm_get_status(user) == EMM_DEREGISTERED); /* Delete the authentication data RAND and RES */ - rc = emm_proc_authentication_delete(); + rc = emm_proc_authentication_delete(user); if (rc != RETURNok) { LOG_FUNC_RETURN (rc); @@ -123,7 +117,7 @@ int EmmDeregistered(const emm_reg_t *evt) /* * The UE was powered on without a valid USIM application present */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_NO_IMSI); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_NO_IMSI); break; case _EMMREG_REGISTER_REQ: @@ -131,11 +125,11 @@ int EmmDeregistered(const emm_reg_t *evt) * The default EMM primary substate when the UE is switched on * with valid USIM application shall be PLMN-SEARCH */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_PLMN_SEARCH); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_PLMN_SEARCH); if (rc != RETURNerror) { /* Process the network registration request */ - rc = emm_fsm_process(evt); + rc = emm_fsm_process(user, evt); } break; @@ -149,14 +143,14 @@ int EmmDeregistered(const emm_reg_t *evt) /* Move to the corresponding initial EMM state */ if (evt->u.attach.is_emergency) { - rc = emm_fsm_set_status(EMM_DEREGISTERED_LIMITED_SERVICE); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_LIMITED_SERVICE); } else { - rc = emm_fsm_set_status(EMM_DEREGISTERED_NORMAL_SERVICE); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_NORMAL_SERVICE); } if (rc != RETURNerror) { /* Restart the attach procedure */ - rc = emm_proc_attach_restart(); + rc = emm_proc_attach_restart(user); } break; diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c old mode 100755 new mode 100644 index 0d0301c392..834311be74 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredAttachNeeded.c @@ -54,6 +47,7 @@ Description Implements the EPS Mobility Management procedures executed #include "emm_fsm.h" #include "commonDef.h" #include "nas_log.h" +#include "user_defs.h" #include @@ -84,11 +78,11 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmDeregisteredAttachNeeded(const emm_reg_t *evt) +int EmmDeregisteredAttachNeeded(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; - assert(emm_fsm_get_status() == EMM_DEREGISTERED_ATTACH_NEEDED); + assert(emm_fsm_get_status(user) == EMM_DEREGISTERED_ATTACH_NEEDED); /* TODO */ diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c old mode 100755 new mode 100644 index 40911608bf..f58cf4b9e0 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredAttemptingToAttach.c @@ -86,13 +79,13 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmDeregisteredAttemptingToAttach(const emm_reg_t *evt) +int EmmDeregisteredAttemptingToAttach(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; int rc = RETURNerror; - assert(emm_fsm_get_status() == EMM_DEREGISTERED_ATTEMPTING_TO_ATTACH); + assert(emm_fsm_get_status(user) == EMM_DEREGISTERED_ATTEMPTING_TO_ATTACH); switch (evt->primitive) { case _EMMREG_ATTACH_INIT: @@ -104,14 +97,14 @@ int EmmDeregisteredAttemptingToAttach(const emm_reg_t *evt) /* Move to the corresponding initial EMM state */ if (evt->u.attach.is_emergency) { - rc = emm_fsm_set_status(EMM_DEREGISTERED_LIMITED_SERVICE); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_LIMITED_SERVICE); } else { - rc = emm_fsm_set_status(EMM_DEREGISTERED_NORMAL_SERVICE); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_NORMAL_SERVICE); } if (rc != RETURNerror) { /* Restart the attach procedure */ - rc = emm_proc_attach_restart(); + rc = emm_proc_attach_restart(user); } break; @@ -120,14 +113,14 @@ int EmmDeregisteredAttemptingToAttach(const emm_reg_t *evt) /* * Data successfully delivered to the network */ - rc = emm_proc_lowerlayer_success(); + rc = emm_proc_lowerlayer_success(user->lowerlayer_data); break; case _EMMREG_LOWERLAYER_FAILURE: /* * Data failed to be delivered to the network */ - rc = emm_proc_lowerlayer_failure(FALSE); + rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, FALSE); break; default: diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c old mode 100755 new mode 100644 index 060329f2e5..a44438a3a8 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredInitiated.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredInitiated.c @@ -85,13 +78,13 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmDeregisteredInitiated(const emm_reg_t *evt) +int EmmDeregisteredInitiated(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; int rc = RETURNerror; - assert(emm_fsm_get_status() == EMM_DEREGISTERED_INITIATED); + assert(emm_fsm_get_status(user) == EMM_DEREGISTERED_INITIATED); switch (evt->primitive) { @@ -101,7 +94,7 @@ int EmmDeregisteredInitiated(const emm_reg_t *evt) * bearer contexts have been deactivated as UE initiated * detach procedure successfully completed) */ - rc = emm_fsm_set_status(EMM_DEREGISTERED); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED); break; case _EMMREG_DETACH_FAILED: @@ -110,9 +103,9 @@ int EmmDeregisteredInitiated(const emm_reg_t *evt) * The detach procedure failed */ if (evt->u.detach.type == EMM_DETACH_TYPE_IMSI) { - rc = emm_fsm_set_status(EMM_REGISTERED_NORMAL_SERVICE); + rc = emm_fsm_set_status(user, EMM_REGISTERED_NORMAL_SERVICE); } else { - rc = emm_fsm_set_status(EMM_DEREGISTERED); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED); } break; @@ -130,7 +123,8 @@ int EmmDeregisteredInitiated(const emm_reg_t *evt) * Lower layer failure or release of the NAS signalling connection * before the Detach Accept is received */ - rc = emm_proc_lowerlayer_release(); + // FIXME review + rc = emm_proc_lowerlayer_release(user->lowerlayer_data); break; default: diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c old mode 100755 new mode 100644 index 92df829b8d..4310f963cd --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredLimitedService.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredLimitedService.c @@ -90,24 +83,24 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmDeregisteredLimitedService(const emm_reg_t *evt) +int EmmDeregisteredLimitedService(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; int rc = RETURNerror; - assert(emm_fsm_get_status() == EMM_DEREGISTERED_LIMITED_SERVICE); + assert(emm_fsm_get_status(user) == EMM_DEREGISTERED_LIMITED_SERVICE); switch (evt->primitive) { case _EMMREG_REGISTER_REQ: /* * The user manually re-selected a PLMN to register to */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_PLMN_SEARCH); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_PLMN_SEARCH); if (rc != RETURNerror) { /* Process the network registration request */ - rc = emm_fsm_process(evt); + rc = emm_fsm_process(user, evt); } break; @@ -116,7 +109,7 @@ int EmmDeregisteredLimitedService(const emm_reg_t *evt) /* * Initiate attach procedure for emergency bearer services */ - rc = emm_proc_attach(EMM_ATTACH_TYPE_EMERGENCY); + rc = emm_proc_attach(user, EMM_ATTACH_TYPE_EMERGENCY); break; case _EMMREG_ATTACH_REQ: @@ -125,7 +118,7 @@ int EmmDeregisteredLimitedService(const emm_reg_t *evt) * (Attach Request message successfully delivered to the network); * enter state EMM-REGISTERED-INITIATED */ - rc = emm_fsm_set_status(EMM_REGISTERED_INITIATED); + rc = emm_fsm_set_status(user, EMM_REGISTERED_INITIATED); break; case _EMMREG_LOWERLAYER_SUCCESS: @@ -133,21 +126,21 @@ int EmmDeregisteredLimitedService(const emm_reg_t *evt) * Initial NAS message has been successfully delivered * to the network */ - rc = emm_proc_lowerlayer_success(); + rc = emm_proc_lowerlayer_success(user->lowerlayer_data); break; case _EMMREG_LOWERLAYER_FAILURE: /* * Initial NAS message failed to be delivered to the network */ - rc = emm_proc_lowerlayer_failure(TRUE); + rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, TRUE); break; case _EMMREG_LOWERLAYER_RELEASE: /* * NAS signalling connection has been released */ - rc = emm_proc_lowerlayer_release(); + rc = emm_proc_lowerlayer_release(user->lowerlayer_data); break; default: diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c old mode 100755 new mode 100644 index 65154d4d97..84820568cc --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredNoCellAvailable.c @@ -91,13 +84,15 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmDeregisteredNoCellAvailable(const emm_reg_t *evt) +int EmmDeregisteredNoCellAvailable(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; int rc = RETURNerror; + emm_data_t *emm_data = user->emm_data; + user_api_id_t *user_api_id = user->user_api_id; - assert(emm_fsm_get_status() == EMM_DEREGISTERED_NO_CELL_AVAILABLE); + assert(emm_fsm_get_status(user) == EMM_DEREGISTERED_NO_CELL_AVAILABLE); switch (evt->primitive) { /* TODO: network re-selection is not allowed when in No Cell @@ -108,14 +103,14 @@ int EmmDeregisteredNoCellAvailable(const emm_reg_t *evt) /* * The user manually re-selected a PLMN to register to */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_PLMN_SEARCH); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_PLMN_SEARCH); if (rc != RETURNerror) { /* * Notify EMM that the MT is currently searching an operator * to register to */ - rc = emm_proc_registration_notify(NET_REG_STATE_ON); + rc = emm_proc_registration_notify(user_api_id, emm_data, NET_REG_STATE_ON); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-FSM - " @@ -125,7 +120,7 @@ int EmmDeregisteredNoCellAvailable(const emm_reg_t *evt) /* * Perform network re-selection procedure */ - rc = emm_proc_plmn_selection(evt->u.regist.index); + rc = emm_proc_plmn_selection(user, evt->u.regist.index); } break; diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c old mode 100755 new mode 100644 index 7740b22e9b..6dc1d3304a --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNoImsi.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredNoImsi.c @@ -85,11 +78,11 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmDeregisteredNoImsi(const emm_reg_t *evt) +int EmmDeregisteredNoImsi(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; - assert(emm_fsm_get_status() == EMM_DEREGISTERED_NO_IMSI); + assert(emm_fsm_get_status(user) == EMM_DEREGISTERED_NO_IMSI); LOG_TRACE(ERROR, "EMM-FSM - USIM is not present or not valid"); diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c old mode 100755 new mode 100644 index 25924fd9f2..fe18a98d38 --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredNormalService.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredNormalService.c @@ -62,6 +55,7 @@ Description Implements the EPS Mobility Management procedures executed /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ +extern uint8_t usim_test; /****************************************************************************/ /******************* L O C A L D E F I N I T I O N S *******************/ @@ -90,24 +84,24 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmDeregisteredNormalService(const emm_reg_t *evt) +int EmmDeregisteredNormalService(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; int rc = RETURNerror; - assert(emm_fsm_get_status() == EMM_DEREGISTERED_NORMAL_SERVICE); + assert(emm_fsm_get_status(user) == EMM_DEREGISTERED_NORMAL_SERVICE); switch (evt->primitive) { case _EMMREG_REGISTER_REQ: /* * The user manually re-selected a PLMN to register to */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_PLMN_SEARCH); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_PLMN_SEARCH); if (rc != RETURNerror) { /* Process the network registration request */ - rc = emm_fsm_process(evt); + rc = emm_fsm_process(user, evt); } break; @@ -116,7 +110,14 @@ int EmmDeregisteredNormalService(const emm_reg_t *evt) /* * Initiate the attach procedure for EPS services */ - rc = emm_proc_attach(EMM_ATTACH_TYPE_EPS); + if(usim_test == 0) + { + rc = emm_proc_attach(user, EMM_ATTACH_TYPE_EPS); + } + else + { + rc = emm_proc_attach(user, EMM_ATTACH_TYPE_IMSI); // CMW500 IMSI initial attach expected + } break; case _EMMREG_ATTACH_REQ: @@ -125,7 +126,7 @@ int EmmDeregisteredNormalService(const emm_reg_t *evt) * message successfully delivered to the network); * enter state EMM-REGISTERED-INITIATED */ - rc = emm_fsm_set_status(EMM_REGISTERED_INITIATED); + rc = emm_fsm_set_status(user, EMM_REGISTERED_INITIATED); break; case _EMMREG_LOWERLAYER_SUCCESS: @@ -133,21 +134,21 @@ int EmmDeregisteredNormalService(const emm_reg_t *evt) * Initial NAS message has been successfully delivered * to the network */ - rc = emm_proc_lowerlayer_success(); + rc = emm_proc_lowerlayer_success(user->lowerlayer_data); break; case _EMMREG_LOWERLAYER_FAILURE: /* * Initial NAS message failed to be delivered to the network */ - rc = emm_proc_lowerlayer_failure(TRUE); + rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, TRUE); break; case _EMMREG_LOWERLAYER_RELEASE: /* * NAS signalling connection has been released */ - rc = emm_proc_lowerlayer_release(); + rc = emm_proc_lowerlayer_release(user->lowerlayer_data); break; case _EMMREG_ATTACH_CNF: @@ -156,7 +157,7 @@ int EmmDeregisteredNormalService(const emm_reg_t *evt) * context activated; * enter state EMM-REGISTERED. */ - rc = emm_fsm_set_status(EMM_REGISTERED); + rc = emm_fsm_set_status(user, EMM_REGISTERED); break; default: diff --git a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c old mode 100755 new mode 100644 index 08c3ff5ea1..8560b2a4bb --- a/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c +++ b/openair3/NAS/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmDeregisteredPlmnSearch.c @@ -89,27 +82,29 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmDeregisteredPlmnSearch(const emm_reg_t *evt) +int EmmDeregisteredPlmnSearch(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; + emm_data_t *emm_data = user->emm_data; + user_api_id_t *user_api_id = user->user_api_id; int rc = RETURNerror; - assert(emm_fsm_get_status() == EMM_DEREGISTERED_PLMN_SEARCH); + assert(emm_fsm_get_status(user) == EMM_DEREGISTERED_PLMN_SEARCH); switch (evt->primitive) { case _EMMREG_NO_CELL: /* * No suitable cell of the selected PLMN has been found to camp on */ - rc = emm_proc_registration_notify(NET_REG_STATE_DENIED); + rc = emm_proc_registration_notify(user_api_id, emm_data, NET_REG_STATE_DENIED); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-FSM - " "Failed to notify registration update"); } - rc = emm_fsm_set_status(EMM_DEREGISTERED_NO_CELL_AVAILABLE); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_NO_CELL_AVAILABLE); break; case _EMMREG_REGISTER_REQ: @@ -119,7 +114,7 @@ int EmmDeregisteredPlmnSearch(const emm_reg_t *evt) * may be selected either automatically or manually. * Or the user manually re-selected a PLMN to register to. */ - rc = emm_proc_registration_notify(NET_REG_STATE_ON); + rc = emm_proc_registration_notify(user_api_id, emm_data, NET_REG_STATE_ON); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-FSM - " @@ -129,7 +124,7 @@ int EmmDeregisteredPlmnSearch(const emm_reg_t *evt) /* * Perform network selection procedure */ - rc = emm_proc_plmn_selection(evt->u.regist.index); + rc = emm_proc_plmn_selection(user, evt->u.regist.index); break; case _EMMREG_REGISTER_REJ: @@ -137,14 +132,14 @@ int EmmDeregisteredPlmnSearch(const emm_reg_t *evt) * The selected cell is known not to be able to provide normal * service */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_LIMITED_SERVICE); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_LIMITED_SERVICE); break; case _EMMREG_REGISTER_CNF: /* * A suitable cell of the selected PLMN has been found to camp on */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_NORMAL_SERVICE); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_NORMAL_SERVICE); break; default: diff --git a/openair3/NAS/UE/EMM/SAP/EmmNull.c b/openair3/NAS/UE/EMM/SAP/EmmNull.c old mode 100755 new mode 100644 index f36d579e5c..e2e45c99cc --- a/openair3/NAS/UE/EMM/SAP/EmmNull.c +++ b/openair3/NAS/UE/EMM/SAP/EmmNull.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmNull.c @@ -53,6 +46,7 @@ Description Implements the EPS Mobility Management procedures executed #include "nas_log.h" #include "emm_proc.h" +#include "user_defs.h" #include @@ -83,16 +77,16 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmNull(const emm_reg_t *evt) +int EmmNull(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; int rc; - assert(emm_fsm_get_status() == EMM_NULL); + assert(emm_fsm_get_status(user) == EMM_NULL); /* Delete the authentication data RAND and RES */ - rc = emm_proc_authentication_delete(); + rc = emm_proc_authentication_delete(user); if (rc != RETURNok) { LOG_FUNC_RETURN (rc); @@ -104,14 +98,14 @@ int EmmNull(const emm_reg_t *evt) * The EPS capability has been enabled in the UE: * Move to the DEREGISTERED state; */ - rc = emm_fsm_set_status(EMM_DEREGISTERED); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED); /* * And initialize the EMM procedure call manager in order to * establish an EMM context and make the UE reachable by an MME. */ if (rc != RETURNerror) { - rc = emm_proc_initialize(); + rc = emm_proc_initialize(user); } break; diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegistered.c b/openair3/NAS/UE/EMM/SAP/EmmRegistered.c old mode 100755 new mode 100644 index 889d22663c..fbd3e1ce63 --- a/openair3/NAS/UE/EMM/SAP/EmmRegistered.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegistered.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegistered.c @@ -88,13 +81,13 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmRegistered(const emm_reg_t *evt) +int EmmRegistered(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; int rc = RETURNerror; - assert(emm_fsm_get_status() == EMM_REGISTERED); + assert(emm_fsm_get_status(user) == EMM_REGISTERED); switch (evt->primitive) { @@ -103,7 +96,7 @@ int EmmRegistered(const emm_reg_t *evt) /* * Initiate detach procedure for EPS services */ - rc = emm_proc_detach(EMM_DETACH_TYPE_EPS, evt->u.detach.switch_off); + rc = emm_proc_detach(user, EMM_DETACH_TYPE_EPS, evt->u.detach.switch_off); break; case _EMMREG_DETACH_REQ: @@ -112,7 +105,7 @@ int EmmRegistered(const emm_reg_t *evt) * message successfully delivered to the network); * enter state EMM-DEREGISTERED-INITIATED */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_INITIATED); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_INITIATED); break; case _EMMREG_DETACH_CNF: @@ -120,7 +113,7 @@ int EmmRegistered(const emm_reg_t *evt) * The UE implicitly detached from the network (all EPS * bearer contexts may have been deactivated) */ - rc = emm_fsm_set_status(EMM_DEREGISTERED); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED); break; case _EMMREG_TAU_REQ: @@ -143,21 +136,21 @@ int EmmRegistered(const emm_reg_t *evt) /* * Data transfer message has been successfully delivered */ - rc = emm_proc_lowerlayer_success(); + rc = emm_proc_lowerlayer_success(user->lowerlayer_data); break; case _EMMREG_LOWERLAYER_FAILURE: /* * Data transfer message failed to be delivered */ - rc = emm_proc_lowerlayer_failure(FALSE); + rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, FALSE); break; case _EMMREG_LOWERLAYER_RELEASE: /* * NAS signalling connection has been released */ - rc = emm_proc_lowerlayer_release(); + rc = emm_proc_lowerlayer_release(user->lowerlayer_data); break; default: diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c old mode 100755 new mode 100644 index 0dcaec5868..cf95cd3f56 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredAttemptingToUpdate.c @@ -85,11 +78,11 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmRegisteredAttemptingToUpdate(const emm_reg_t *evt) +int EmmRegisteredAttemptingToUpdate(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; - assert(emm_fsm_get_status() == EMM_REGISTERED_ATTEMPTING_TO_UPDATE); + assert(emm_fsm_get_status(user) == EMM_REGISTERED_ATTEMPTING_TO_UPDATE); /* TODO */ diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c old mode 100755 new mode 100644 index 24de58db86..26de1cd377 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredImsiDetachInitiated.c @@ -85,11 +78,11 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmRegisteredImsiDetachInitiated(const emm_reg_t *evt) +int EmmRegisteredImsiDetachInitiated(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; - assert(emm_fsm_get_status() == EMM_REGISTERED_IMSI_DETACH_INITIATED); + assert(emm_fsm_get_status(user) == EMM_REGISTERED_IMSI_DETACH_INITIATED); /* TODO */ diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c old mode 100755 new mode 100644 index 18c41c8ad4..36929fc4d7 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredInitiated.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredInitiated.c @@ -85,13 +78,15 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmRegisteredInitiated(const emm_reg_t *evt) +int EmmRegisteredInitiated(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; int rc = RETURNerror; + emm_data_t *emm_data = user->emm_data; + user_api_id_t *user_api_id = user->user_api_id; - assert(emm_fsm_get_status() == EMM_REGISTERED_INITIATED); + assert(emm_fsm_get_status(user) == EMM_REGISTERED_INITIATED); switch (evt->primitive) { case _EMMREG_ATTACH_INIT: @@ -103,14 +98,14 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) /* Move to the corresponding initial EMM state */ if (evt->u.attach.is_emergency) { - rc = emm_fsm_set_status(EMM_DEREGISTERED_LIMITED_SERVICE); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_LIMITED_SERVICE); } else { - rc = emm_fsm_set_status(EMM_DEREGISTERED_NORMAL_SERVICE); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_NORMAL_SERVICE); } if (rc != RETURNerror) { /* Restart the attach procedure */ - rc = emm_proc_attach_restart(); + rc = emm_proc_attach_restart(user); } break; @@ -121,7 +116,7 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) * timer T3410 expired). The network attach procedure shall be * restarted when timer T3411 expires. */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_ATTEMPTING_TO_ATTACH); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_ATTEMPTING_TO_ATTACH); break; case _EMMREG_ATTACH_EXCEEDED: @@ -133,7 +128,7 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) * SEARCH in order to perform a PLMN selection. */ /* TODO: ATTEMPTING-TO-ATTACH or PLMN-SEARCH ??? */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_ATTEMPTING_TO_ATTACH); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_ATTEMPTING_TO_ATTACH); break; case _EMMREG_ATTACH_CNF: @@ -141,13 +136,13 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) * EPS network attach accepted by the network; * enter state EMM-REGISTERED. */ - rc = emm_fsm_set_status(EMM_REGISTERED); + rc = emm_fsm_set_status(user, EMM_REGISTERED); if (rc != RETURNerror) { /* * Notify EMM that the MT is registered */ - rc = emm_proc_registration_notify(NET_REG_STATE_HN); + rc = emm_proc_registration_notify(user_api_id, emm_data, NET_REG_STATE_HN); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-FSM - " @@ -168,13 +163,13 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) * EPS network attach rejected by the network; * enter state EMM-DEREGISTERED. */ - rc = emm_fsm_set_status(EMM_DEREGISTERED); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED); if (rc != RETURNerror) { /* * Notify EMM that the MT's registration is denied */ - rc = emm_proc_registration_notify(NET_REG_STATE_DENIED); + rc = emm_proc_registration_notify(user_api_id, emm_data, NET_REG_STATE_DENIED); if (rc != RETURNok) { LOG_TRACE(WARNING, "EMM-FSM - " @@ -188,11 +183,11 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) /* * The UE has to select a new PLMN to register to */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_PLMN_SEARCH); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_PLMN_SEARCH); if (rc != RETURNerror) { /* Process the network registration request */ - rc = emm_fsm_process(evt); + rc = emm_fsm_process(user, evt); } break; @@ -201,7 +196,7 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) /* * The UE failed to register to the network for normal EPS service */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_LIMITED_SERVICE); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_LIMITED_SERVICE); break; case _EMMREG_NO_IMSI: @@ -209,14 +204,14 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) * The UE failed to register to the network for emergency * bearer services */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_NO_IMSI); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_NO_IMSI); break; case _EMMREG_DETACH_INIT: /* * Initiate detach procedure for EPS services */ - rc = emm_proc_detach(EMM_DETACH_TYPE_EPS, evt->u.detach.switch_off); + rc = emm_proc_detach(user, EMM_DETACH_TYPE_EPS, evt->u.detach.switch_off); break; case _EMMREG_DETACH_REQ: @@ -225,7 +220,7 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) * message successfully delivered to the network); * enter state EMM-DEREGISTERED-INITIATED */ - rc = emm_fsm_set_status(EMM_DEREGISTERED_INITIATED); + rc = emm_fsm_set_status(user, EMM_DEREGISTERED_INITIATED); break; case _EMMREG_LOWERLAYER_SUCCESS: @@ -235,7 +230,7 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) * any message transfered by EMM common procedures requested * by the network. */ - rc = emm_proc_lowerlayer_success(); + rc = emm_proc_lowerlayer_success(user->lowerlayer_data); break; case _EMMREG_LOWERLAYER_FAILURE: @@ -245,7 +240,7 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) * any message transfered by EMM common procedures requested * by the network. */ - rc = emm_proc_lowerlayer_failure(FALSE); + rc = emm_proc_lowerlayer_failure(user->lowerlayer_data, FALSE); break; case _EMMREG_LOWERLAYER_RELEASE: @@ -254,7 +249,7 @@ int EmmRegisteredInitiated(const emm_reg_t *evt) * Accept, Attach Reject, or any message transfered by EMM common * procedures requested by the network, is received. */ - rc = emm_proc_lowerlayer_release(); + rc = emm_proc_lowerlayer_release(user->lowerlayer_data); break; default: diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c old mode 100755 new mode 100644 index 1d78a97509..af60b566b8 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredLimitedService.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredLimitedService.c @@ -81,11 +74,11 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmRegisteredLimitedService(const emm_reg_t *evt) +int EmmRegisteredLimitedService(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; - assert(emm_fsm_get_status() == EMM_REGISTERED_LIMITED_SERVICE); + assert(emm_fsm_get_status(user) == EMM_REGISTERED_LIMITED_SERVICE); /* TODO */ diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c old mode 100755 new mode 100644 index 8385f4359f..5aa408a8f9 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredNoCellAvailable.c @@ -82,11 +75,11 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmRegisteredNoCellAvailable(const emm_reg_t *evt) +int EmmRegisteredNoCellAvailable(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; - assert(emm_fsm_get_status() == EMM_REGISTERED_NO_CELL_AVAILABLE); + assert(emm_fsm_get_status(user) == EMM_REGISTERED_NO_CELL_AVAILABLE); /* TODO */ diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c old mode 100755 new mode 100644 index 4f3dc54f46..4ee503ab9f --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredNormalService.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredNormalService.c @@ -81,11 +74,11 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmRegisteredNormalService(const emm_reg_t *evt) +int EmmRegisteredNormalService(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; - assert(emm_fsm_get_status() == EMM_REGISTERED_NORMAL_SERVICE); + assert(emm_fsm_get_status(user) == EMM_REGISTERED_NORMAL_SERVICE); /* TODO */ diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c old mode 100755 new mode 100644 index a5b28bed43..e300ac58db --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredPlmnSearch.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmRegisteredPlmnSearch.c @@ -81,46 +74,13 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmRegisteredPlmnSearch(const emm_reg_t *evt) +int EmmRegisteredPlmnSearch(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; - assert(emm_fsm_get_status() == EMM_REGISTERED_PLMN_SEARCH); + assert(emm_fsm_get_status(user) == EMM_REGISTERED_PLMN_SEARCH); /* TODO */ LOG_FUNC_RETURN (RETURNok); } - -#if 0 -/**************************************************************************** - ** ** - ** Name: EmmRegisteredPlmnSearch_xxx() ** - ** ** - ** Description: Procedure executed when xxx ** - ** while the EMM-SAP is in EMM-REGISTERED.PLMN-SEARCH state. ** - ** ** - ** Inputs: evt: The received EMM-SAP event ** - ** Others: emm_fsm_status ** - ** ** - ** Outputs: None ** - ** Return: RETURNok, RETURNerror ** - ** Others: emm_fsm_status ** - ** ** - ***************************************************************************/ -int EmmRegisteredPlmnSearch_xxx(const emm_reg_t *evt) -{ - LOG_FUNC_IN; - - assert(emm_fsm_get_status() == EMM_REGISTERED_PLMN_SEARCH); - - /* TODO */ - - LOG_FUNC_RETURN (RETURNok); -} -#endif - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c b/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c old mode 100755 new mode 100644 index 9f960082f0..dceb0a87d1 --- a/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c +++ b/openair3/NAS/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** ource EmmRegisteredUpdateNeeded.c @@ -87,11 +80,11 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmRegisteredUpdateNeeded(const emm_reg_t *evt) +int EmmRegisteredUpdateNeeded(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; - assert(emm_fsm_get_status() == EMM_REGISTERED_UPDATE_NEEDED); + assert(emm_fsm_get_status(user) == EMM_REGISTERED_UPDATE_NEEDED); /* TODO */ diff --git a/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c old mode 100755 new mode 100644 index 47744d8db9..fa1944458e --- a/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmServiceRequestInitiated.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmServiceRequestInitiated.c @@ -83,11 +76,11 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmServiceRequestInitiated(const emm_reg_t *evt) +int EmmServiceRequestInitiated(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; - assert(emm_fsm_get_status() == EMM_SERVICE_REQUEST_INITIATED); + assert(emm_fsm_get_status(user) == EMM_SERVICE_REQUEST_INITIATED); /* TODO */ diff --git a/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c b/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c old mode 100755 new mode 100644 index 4539c63a93..610eb13b36 --- a/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c +++ b/openair3/NAS/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EmmTrackingAreaUpdatingInitiated.c @@ -83,11 +76,11 @@ Description Implements the EPS Mobility Management procedures executed ** Others: emm_fsm_status ** ** ** ***************************************************************************/ -int EmmTrackingAreaUpdatingInitiated(const emm_reg_t *evt) +int EmmTrackingAreaUpdatingInitiated(nas_user_t *user, const emm_reg_t *evt) { LOG_FUNC_IN; - assert(emm_fsm_get_status() == EMM_TRACKING_AREA_UPDATING_INITIATED); + assert(emm_fsm_get_status(user) == EMM_TRACKING_AREA_UPDATING_INITIATED); /* TODO */ diff --git a/openair3/NAS/UE/EMM/SAP/emm_as.c b/openair3/NAS/UE/EMM/SAP/emm_as.c old mode 100755 new mode 100644 index daf2d50c33..fbb54d548b --- a/openair3/NAS/UE/EMM/SAP/emm_as.c +++ b/openair3/NAS/UE/EMM/SAP/emm_as.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_as.c @@ -60,6 +53,8 @@ Description Defines the EMMAS Service Access Point that provides #include "emm_cause.h" #include "LowerLayer.h" +#include "emm_proc.h" + #include // memset #include // malloc, free @@ -72,10 +67,6 @@ Description Defines the EMMAS Service Access Point that provides /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ -extern int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat); - -extern int emm_proc_status(unsigned int ueid, int emm_cause); - /****************************************************************************/ /******************* L O C A L D E F I N I T I O N S *******************/ /****************************************************************************/ @@ -106,19 +97,19 @@ static const char *_emm_as_primitive_str[] = { * Functions executed to process EMM procedures upon receiving * data from the network */ -static int _emm_as_recv(unsigned int ueid, const char *msg, int len, +static int _emm_as_recv(nas_user_t *user, const char *msg, int len, int *emm_cause); -static int _emm_as_establish_cnf(const emm_as_establish_t *msg, int *emm_cause); -static int _emm_as_establish_rej(void); -static int _emm_as_release_ind(const emm_as_release_t *msg); +static int _emm_as_establish_cnf(nas_user_t *user, const emm_as_establish_t *msg, int *emm_cause); +static int _emm_as_establish_rej(nas_user_t *user); +static int _emm_as_release_ind(nas_user_t *user, const emm_as_release_t *msg); static int _emm_as_page_ind(const emm_as_page_t *msg); -static int _emm_as_cell_info_res(const emm_as_cell_info_t *msg); +static int _emm_as_cell_info_res(nas_user_t *user, const emm_as_cell_info_t *msg); static int _emm_as_cell_info_ind(const emm_as_cell_info_t *msg); -static int _emm_as_data_ind(const emm_as_data_t *msg, int *emm_cause); +static int _emm_as_data_ind(nas_user_t *user, const emm_as_data_t *msg, int *emm_cause); /* * Functions executed to send data to the network when requested @@ -140,18 +131,18 @@ static int _emm_as_encrypt( int length, emm_security_context_t *emm_security_context); -static int _emm_as_send(const emm_as_t *msg); +static int _emm_as_send(const nas_user_t *user, const emm_as_t *msg); -static int _emm_as_security_res(const emm_as_security_t *, +static int _emm_as_security_res(const emm_data_t *emm_data, const emm_as_security_t *, ul_info_transfer_req_t *); -static int _emm_as_establish_req(const emm_as_establish_t *, +static int _emm_as_establish_req(const emm_data_t *emm_data, const emm_as_establish_t *, nas_establish_req_t *); static int _emm_as_cell_info_req(const emm_as_cell_info_t *, cell_info_req_t *); -static int _emm_as_data_req(const emm_as_data_t *, ul_info_transfer_req_t *); -static int _emm_as_status_ind(const emm_as_status_t *, ul_info_transfer_req_t *); +static int _emm_as_data_req(const emm_data_t *emm_data, const emm_as_data_t *msg, ul_info_transfer_req_t *); +static int _emm_as_status_ind(const emm_data_t *emm_data, const emm_as_status_t *, ul_info_transfer_req_t *); static int _emm_as_release_req(const emm_as_release_t *, nas_release_req_t *); /****************************************************************************/ @@ -172,7 +163,7 @@ static int _emm_as_release_req(const emm_as_release_t *, nas_release_req_t *); ** Others: NONE ** ** ** ***************************************************************************/ -void emm_as_initialize(void) +void emm_as_initialize(nas_user_t *user) { LOG_FUNC_IN; @@ -195,7 +186,7 @@ void emm_as_initialize(void) ** Others: None ** ** ** ***************************************************************************/ -int emm_as_send(const emm_as_t *msg) +int emm_as_send(nas_user_t *user, const emm_as_t *msg) { LOG_FUNC_IN; @@ -203,28 +194,25 @@ int emm_as_send(const emm_as_t *msg) int emm_cause = EMM_CAUSE_SUCCESS; emm_as_primitive_t primitive = msg->primitive; - uint32_t ueid = 0; - LOG_TRACE(INFO, "EMMAS-SAP - Received primitive %s (%d)", _emm_as_primitive_str[primitive - _EMMAS_START - 1], primitive); switch (primitive) { case _EMMAS_DATA_IND: - rc = _emm_as_data_ind(&msg->u.data, &emm_cause); - ueid = msg->u.data.ueid; + rc = _emm_as_data_ind(user, &msg->u.data, &emm_cause); break; case _EMMAS_ESTABLISH_CNF: - rc = _emm_as_establish_cnf(&msg->u.establish, &emm_cause); + rc = _emm_as_establish_cnf(user, &msg->u.establish, &emm_cause); break; case _EMMAS_ESTABLISH_REJ: - rc = _emm_as_establish_rej(); + rc = _emm_as_establish_rej(user); break; case _EMMAS_RELEASE_IND: - rc = _emm_as_release_ind(&msg->u.release); + rc = _emm_as_release_ind(user, &msg->u.release); break; case _EMMAS_PAGE_IND: @@ -232,7 +220,7 @@ int emm_as_send(const emm_as_t *msg) break; case _EMMAS_CELL_INFO_RES: - rc = _emm_as_cell_info_res(&msg->u.cell_info); + rc = _emm_as_cell_info_res(user, &msg->u.cell_info); break; case _EMMAS_CELL_INFO_IND: @@ -241,7 +229,7 @@ int emm_as_send(const emm_as_t *msg) default: /* Other primitives are forwarded to the Access Stratum */ - rc = _emm_as_send(msg); + rc = _emm_as_send(user, msg); if (rc != RETURNok) { LOG_TRACE(ERROR, "EMMAS-SAP - " @@ -273,7 +261,7 @@ int emm_as_send(const emm_as_t *msg) LOG_TRACE(WARNING, "EMMAS-SAP - Received EMM message is not valid " "(cause=%d)", emm_cause); /* Return an EMM status message */ - rc = emm_proc_status(ueid, emm_cause); + rc = emm_proc_status(user, emm_cause); } if (rc != RETURNok) { @@ -313,7 +301,7 @@ int emm_as_send(const emm_as_t *msg) ** Others: None ** ** ** ***************************************************************************/ -static int _emm_as_recv(unsigned int ueid, const char *msg, int len, +static int _emm_as_recv(nas_user_t *user, const char *msg, int len, int *emm_cause) { LOG_FUNC_IN; @@ -328,7 +316,7 @@ static int _emm_as_recv(unsigned int ueid, const char *msg, int len, emm_security_context_t *security = NULL; /* Current EPS NAS security context */ - security = _emm_data.security; + security = user->emm_data->security; /* Decode the received message */ decoder_rc = nas_message_decode(msg, &nas_msg, len, security); @@ -345,34 +333,34 @@ static int _emm_as_recv(unsigned int ueid, const char *msg, int len, switch (emm_msg->header.message_type) { case EMM_STATUS: - rc = emm_recv_status(ueid, &emm_msg->emm_status, emm_cause); + rc = emm_recv_status(user->ueid, &emm_msg->emm_status, emm_cause); break; case IDENTITY_REQUEST: - rc = emm_recv_identity_request(&emm_msg->identity_request, + rc = emm_recv_identity_request(user, &emm_msg->identity_request, emm_cause); break; case AUTHENTICATION_REQUEST: - rc = emm_recv_authentication_request( + rc = emm_recv_authentication_request(user, &emm_msg->authentication_request, emm_cause); break; case AUTHENTICATION_REJECT: - rc = emm_recv_authentication_reject( + rc = emm_recv_authentication_reject(user, &emm_msg->authentication_reject, emm_cause); break; case SECURITY_MODE_COMMAND: - rc = emm_recv_security_mode_command( + rc = emm_recv_security_mode_command(user, &emm_msg->security_mode_command, emm_cause); break; case DETACH_ACCEPT: - rc = emm_recv_detach_accept(&emm_msg->detach_accept, emm_cause); + rc = emm_recv_detach_accept(user, &emm_msg->detach_accept, emm_cause); break; @@ -413,7 +401,7 @@ static int _emm_as_recv(unsigned int ueid, const char *msg, int len, ** Others: None ** ** ** ***************************************************************************/ -static int _emm_as_data_ind(const emm_as_data_t *msg, int *emm_cause) +static int _emm_as_data_ind(nas_user_t *user, const emm_as_data_t *msg, int *emm_cause) { LOG_FUNC_IN; @@ -435,7 +423,7 @@ static int _emm_as_data_ind(const emm_as_data_t *msg, int *emm_cause) memset(&header, 0, sizeof(header)); /* Decrypt the received security protected message */ - security = _emm_data.security; + security = user->emm_data->security; int bytes = nas_message_decrypt((char *)(msg->NASmsg.value), plain_msg, &header, @@ -450,23 +438,23 @@ static int _emm_as_data_ind(const emm_as_data_t *msg, int *emm_cause) } else if (header.protocol_discriminator == EPS_MOBILITY_MANAGEMENT_MESSAGE) { /* Process EMM data */ - rc = _emm_as_recv(msg->ueid, plain_msg, bytes, emm_cause); + rc = _emm_as_recv(user, plain_msg, bytes, emm_cause); } else if (header.protocol_discriminator == EPS_SESSION_MANAGEMENT_MESSAGE) { const OctetString data = {bytes, (uint8_t *)plain_msg}; /* Foward ESM data to EPS session management */ - rc = lowerlayer_data_ind(msg->ueid, &data); + rc = lowerlayer_data_ind(user, &data); } free(plain_msg); } } else { /* Process successfull lower layer transfer indication */ - rc = lowerlayer_success(msg->ueid); + rc = lowerlayer_success(user); } } else { /* Process lower layer transmission failure of NAS message */ - rc = lowerlayer_failure(msg->ueid); + rc = lowerlayer_failure(user); } LOG_FUNC_RETURN (rc); @@ -489,7 +477,7 @@ static int _emm_as_data_ind(const emm_as_data_t *msg, int *emm_cause) ** Others: None ** ** ** ***************************************************************************/ -static int _emm_as_establish_cnf(const emm_as_establish_t *msg, +static int _emm_as_establish_cnf(nas_user_t *user, const emm_as_establish_t *msg, int *emm_cause) { LOG_FUNC_IN; @@ -501,11 +489,11 @@ static int _emm_as_establish_cnf(const emm_as_establish_t *msg, if (msg->NASmsg.length > 0) { /* The NAS signalling connection is established */ - (void) lowerlayer_establish(); + (void) lowerlayer_establish(user); } else { /* The initial NAS message has been successfully delivered to * lower layers */ - rc = lowerlayer_success(0); + rc = lowerlayer_success(user); LOG_FUNC_RETURN (rc); } @@ -516,7 +504,7 @@ static int _emm_as_establish_cnf(const emm_as_establish_t *msg, decoder_rc = nas_message_decode((char *)(msg->NASmsg.value), &nas_msg, msg->NASmsg.length, - _emm_data.security); + user->emm_data->security); if (decoder_rc < 0) { LOG_TRACE(WARNING, "EMMAS-SAP - Failed to decode initial NAS message" @@ -530,11 +518,11 @@ static int _emm_as_establish_cnf(const emm_as_establish_t *msg, switch (emm_msg->header.message_type) { case ATTACH_ACCEPT: - rc = emm_recv_attach_accept(&emm_msg->attach_accept, emm_cause); + rc = emm_recv_attach_accept(user, &emm_msg->attach_accept, emm_cause); break; case ATTACH_REJECT: - rc = emm_recv_attach_reject(&emm_msg->attach_reject, emm_cause); + rc = emm_recv_attach_reject(user, &emm_msg->attach_reject, emm_cause); break; case DETACH_ACCEPT: @@ -570,7 +558,7 @@ static int _emm_as_establish_cnf(const emm_as_establish_t *msg, ** Others: None ** ** ** ***************************************************************************/ -static int _emm_as_establish_rej(void) +static int _emm_as_establish_rej(nas_user_t *user) { LOG_FUNC_IN; @@ -580,7 +568,7 @@ static int _emm_as_establish_rej(void) "failure"); /* Process lower layer transmission failure of initial NAS message */ - rc = lowerlayer_failure(0); + rc = lowerlayer_failure(user); LOG_FUNC_RETURN (rc); } @@ -602,7 +590,7 @@ static int _emm_as_establish_rej(void) ** Others: None ** ** ** ***************************************************************************/ -static int _emm_as_release_ind(const emm_as_release_t *msg) +static int _emm_as_release_ind(nas_user_t *user, const emm_as_release_t *msg) { LOG_FUNC_IN; @@ -612,7 +600,7 @@ static int _emm_as_release_ind(const emm_as_release_t *msg) "(cause=%d)", msg->cause); /* Process NAS signalling connection release indication */ - rc = lowerlayer_release(msg->cause); + rc = lowerlayer_release(user, msg->cause); LOG_FUNC_RETURN (rc); } @@ -670,7 +658,7 @@ static int _emm_as_page_ind(const emm_as_page_t *msg) ** Others: None ** ** ** ***************************************************************************/ -static int _emm_as_cell_info_res(const emm_as_cell_info_t *msg) +static int _emm_as_cell_info_res(nas_user_t *user, const emm_as_cell_info_t *msg) { LOG_FUNC_IN; @@ -692,7 +680,7 @@ static int _emm_as_cell_info_res(const emm_as_cell_info_t *msg) } /* Notify EMM that a cell has been found */ - rc = emm_proc_plmn_selection_end(msg->found, msg->tac, msg->cellID, AcT); + rc = emm_proc_plmn_selection_end(user, msg->found, msg->tac, msg->cellID, AcT); LOG_FUNC_RETURN (rc); } @@ -935,7 +923,7 @@ _emm_as_encrypt( ** Others: None ** ** ** ***************************************************************************/ -static int _emm_as_send(const emm_as_t *msg) +static int _emm_as_send(const nas_user_t *user, const emm_as_t *msg) { LOG_FUNC_IN; @@ -944,13 +932,13 @@ static int _emm_as_send(const emm_as_t *msg) switch (msg->primitive) { case _EMMAS_DATA_REQ: - as_msg.msgID = _emm_as_data_req( + as_msg.msgID = _emm_as_data_req(user->emm_data, &msg->u.data, &as_msg.msg.ul_info_transfer_req); break; case _EMMAS_STATUS_IND: - as_msg.msgID = _emm_as_status_ind( + as_msg.msgID = _emm_as_status_ind(user->emm_data, &msg->u.status, &as_msg.msg.ul_info_transfer_req); break; @@ -963,13 +951,13 @@ static int _emm_as_send(const emm_as_t *msg) case _EMMAS_SECURITY_RES: - as_msg.msgID = _emm_as_security_res( + as_msg.msgID = _emm_as_security_res(user->emm_data, &msg->u.security, &as_msg.msg.ul_info_transfer_req); break; case _EMMAS_ESTABLISH_REQ: - as_msg.msgID = _emm_as_establish_req( + as_msg.msgID = _emm_as_establish_req(user->emm_data, &msg->u.establish, &as_msg.msg.nas_establish_req); break; @@ -1003,7 +991,8 @@ static int _emm_as_send(const emm_as_t *msg) case AS_CELL_INFO_REQ: { nas_itti_cell_info_req( as_msg.msg.cell_info_req.plmnID, - as_msg.msg.cell_info_req.rat); + as_msg.msg.cell_info_req.rat, + user->ueid); LOG_FUNC_RETURN (RETURNok); } break; @@ -1015,7 +1004,8 @@ static int _emm_as_send(const emm_as_t *msg) as_msg.msg.nas_establish_req.s_tmsi, as_msg.msg.nas_establish_req.plmnID, as_msg.msg.nas_establish_req.initialNasMsg.data, - as_msg.msg.nas_establish_req.initialNasMsg.length); + as_msg.msg.nas_establish_req.initialNasMsg.length, + user->ueid); LOG_FUNC_RETURN (RETURNok); } break; @@ -1024,7 +1014,8 @@ static int _emm_as_send(const emm_as_t *msg) nas_itti_ul_data_req( as_msg.msg.ul_info_transfer_req.UEid, as_msg.msg.ul_info_transfer_req.nasMsg.data, - as_msg.msg.ul_info_transfer_req.nasMsg.length); + as_msg.msg.ul_info_transfer_req.nasMsg.length, + user->ueid); LOG_FUNC_RETURN (RETURNok); } break; @@ -1033,7 +1024,8 @@ static int _emm_as_send(const emm_as_t *msg) nas_itti_rab_establish_rsp( as_msg.msg.rab_establish_rsp.s_tmsi, as_msg.msg.rab_establish_rsp.rabID, - as_msg.msg.rab_establish_rsp.errCode); + as_msg.msg.rab_establish_rsp.errCode, + user->ueid); LOG_FUNC_RETURN (RETURNok); } break; @@ -1072,7 +1064,7 @@ static int _emm_as_send(const emm_as_t *msg) ** Others: None ** ** ** ***************************************************************************/ -static int _emm_as_data_req(const emm_as_data_t *msg, +static int _emm_as_data_req(const emm_data_t *emm_data, const emm_as_data_t *msg, ul_info_transfer_req_t *as_msg) { LOG_FUNC_IN; @@ -1119,7 +1111,7 @@ static int _emm_as_data_req(const emm_as_data_t *msg, int bytes; emm_security_context_t *emm_security_context = NULL; - emm_security_context = _emm_data.security; + emm_security_context = emm_data->security; if (emm_security_context) { @@ -1168,7 +1160,7 @@ static int _emm_as_data_req(const emm_as_data_t *msg, ** Others: None ** ** ** ***************************************************************************/ -static int _emm_as_status_ind(const emm_as_status_t *msg, +static int _emm_as_status_ind(const emm_data_t *emm_data, const emm_as_status_t *msg, ul_info_transfer_req_t *as_msg) { LOG_FUNC_IN; @@ -1200,7 +1192,7 @@ static int _emm_as_status_ind(const emm_as_status_t *msg, if (size > 0) { emm_security_context_t *emm_security_context = NULL; - emm_security_context = _emm_data.security; + emm_security_context = emm_data->security; if (emm_security_context) { @@ -1282,7 +1274,7 @@ static int _emm_as_release_req(const emm_as_release_t *msg, ** Others: None ** ** ** ***************************************************************************/ -static int _emm_as_security_res(const emm_as_security_t *msg, +static int _emm_as_security_res(const emm_data_t *emm_data, const emm_as_security_t *msg, ul_info_transfer_req_t *as_msg) { LOG_FUNC_IN; @@ -1347,7 +1339,7 @@ static int _emm_as_security_res(const emm_as_security_t *msg, int bytes = _emm_as_encode(&as_msg->nasMsg, &nas_msg, size, - _emm_data.security); + emm_data->security); if (bytes > 0) { LOG_FUNC_RETURN (AS_UL_INFO_TRANSFER_REQ); @@ -1376,7 +1368,7 @@ static int _emm_as_security_res(const emm_as_security_t *msg, ** Others: None ** ** ** ***************************************************************************/ -static int _emm_as_establish_req(const emm_as_establish_t *msg, +static int _emm_as_establish_req(const emm_data_t *emm_data, const emm_as_establish_t *msg, nas_establish_req_t *as_msg) { LOG_FUNC_IN; @@ -1440,7 +1432,7 @@ static int _emm_as_establish_req(const emm_as_establish_t *msg, &as_msg->initialNasMsg, &nas_msg, size, - _emm_data.security); + emm_data->security); if (bytes > 0) { LOG_FUNC_RETURN (AS_NAS_ESTABLISH_REQ); diff --git a/openair3/NAS/UE/EMM/SAP/emm_as.h b/openair3/NAS/UE/EMM/SAP/emm_as.h old mode 100755 new mode 100644 index 1e46431a56..24ecef6926 --- a/openair3/NAS/UE/EMM/SAP/emm_as.h +++ b/openair3/NAS/UE/EMM/SAP/emm_as.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_as.h @@ -48,6 +41,7 @@ Description Defines the EMMAS Service Access Point that provides #define __EMM_AS_H__ #include "emm_asDef.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -65,8 +59,8 @@ Description Defines the EMMAS Service Access Point that provides /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -void emm_as_initialize(void); +void emm_as_initialize(nas_user_t *user); -int emm_as_send(const emm_as_t *msg); +int emm_as_send(nas_user_t *user, const emm_as_t *msg); #endif /* __EMM_AS_H__*/ diff --git a/openair3/NAS/UE/EMM/SAP/emm_asDef.h b/openair3/NAS/UE/EMM/SAP/emm_asDef.h old mode 100755 new mode 100644 index f7b9fa23f8..7bd464ec04 --- a/openair3/NAS/UE/EMM/SAP/emm_asDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_asDef.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_asDef.h @@ -127,6 +120,7 @@ typedef struct emm_as_security_s { uint8_t ucs2; uint8_t uia; /* Replayed UMTS integrity algorithms */ uint8_t gea; /* Replayed GPRS encryption algorithms */ + uint8_t imeisv_request; uint8_t umts_present; uint8_t gprs_present; diff --git a/openair3/NAS/UE/EMM/SAP/emm_esm.c b/openair3/NAS/UE/EMM/SAP/emm_esm.c old mode 100755 new mode 100644 index b4baca66af..5d45da8591 --- a/openair3/NAS/UE/EMM/SAP/emm_esm.c +++ b/openair3/NAS/UE/EMM/SAP/emm_esm.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_esm.c @@ -115,7 +108,7 @@ void emm_esm_initialize(void) ** Others: None ** ** ** ***************************************************************************/ -int emm_esm_send(const emm_esm_t *msg) +int emm_esm_send(nas_user_t *user, const emm_esm_t *msg) { LOG_FUNC_IN; @@ -130,7 +123,7 @@ int emm_esm_send(const emm_esm_t *msg) case _EMMESM_ESTABLISH_REQ: /* ESM requests EMM to initiate an attach procedure before * requesting subsequent connectivity to additional PDNs */ - rc = emm_proc_attach_restart(); + rc = emm_proc_attach_restart(user); break; case _EMMESM_ESTABLISH_CNF: @@ -141,11 +134,11 @@ int emm_esm_send(const emm_esm_t *msg) if (msg->u.establish.is_emergency) { /* Consider the UE attached for emergency bearer services * only */ - rc = emm_proc_attach_set_emergency(); + rc = emm_proc_attach_set_emergency(user->emm_data); } } else { /* Consider the UE locally detached from the network */ - rc = emm_proc_attach_set_detach(); + rc = emm_proc_attach_set_detach(user); } break; @@ -156,7 +149,7 @@ int emm_esm_send(const emm_esm_t *msg) case _EMMESM_UNITDATA_REQ: /* ESM requests EMM to transfer ESM data unit to lower layer */ - rc = lowerlayer_data_req(msg->ueid, &msg->u.data.msg); + rc = lowerlayer_data_req(user, &msg->u.data.msg); break; default: diff --git a/openair3/NAS/UE/EMM/SAP/emm_esm.h b/openair3/NAS/UE/EMM/SAP/emm_esm.h old mode 100755 new mode 100644 index 55c3b361a9..e74e1f7dc0 --- a/openair3/NAS/UE/EMM/SAP/emm_esm.h +++ b/openair3/NAS/UE/EMM/SAP/emm_esm.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_esm.h @@ -49,6 +42,7 @@ Description Defines the EMMESM Service Access Point that provides #define __EMM_ESM_H__ #include "emm_esmDef.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -68,6 +62,6 @@ Description Defines the EMMESM Service Access Point that provides void emm_esm_initialize(void); -int emm_esm_send(const emm_esm_t *msg); +int emm_esm_send(nas_user_t *user, const emm_esm_t *msg); #endif /* __EMM_ESM_H__*/ diff --git a/openair3/NAS/UE/EMM/SAP/emm_esmDef.h b/openair3/NAS/UE/EMM/SAP/emm_esmDef.h old mode 100755 new mode 100644 index 8251ee57b9..aac37b46bf --- a/openair3/NAS/UE/EMM/SAP/emm_esmDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_esmDef.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_esmDef.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_fsm.c b/openair3/NAS/UE/EMM/SAP/emm_fsm.c old mode 100755 new mode 100644 index dc0e1efa28..a2ede7ae17 --- a/openair3/NAS/UE/EMM/SAP/emm_fsm.c +++ b/openair3/NAS/UE/EMM/SAP/emm_fsm.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_fsm.c @@ -50,6 +43,7 @@ Description Defines the EPS Mobility Management procedures executed at #include "nas_log.h" #include "emmData.h" +#include "user_defs.h" @@ -134,30 +128,30 @@ static const char *_emm_fsm_status_str[EMM_STATE_MAX] = { */ /* Type of the EPS Mobility Management state machine handler */ -typedef int(*emm_fsm_handler_t)(const emm_reg_t *); +typedef int(*emm_fsm_handler_t)(nas_user_t *user, const emm_reg_t *); -int EmmNull(const emm_reg_t *); -int EmmDeregistered(const emm_reg_t *); -int EmmRegistered(const emm_reg_t *); -int EmmDeregisteredInitiated(const emm_reg_t *); -int EmmDeregisteredNormalService(const emm_reg_t *); -int EmmDeregisteredLimitedService(const emm_reg_t *); -int EmmDeregisteredAttemptingToAttach(const emm_reg_t *); -int EmmDeregisteredPlmnSearch(const emm_reg_t *); -int EmmDeregisteredNoImsi(const emm_reg_t *); -int EmmDeregisteredAttachNeeded(const emm_reg_t *); -int EmmDeregisteredNoCellAvailable(const emm_reg_t *); -int EmmRegisteredInitiated(const emm_reg_t *); -int EmmRegisteredNormalService(const emm_reg_t *); -int EmmRegisteredAttemptingToUpdate(const emm_reg_t *); -int EmmRegisteredLimitedService(const emm_reg_t *); -int EmmRegisteredPlmnSearch(const emm_reg_t *); -int EmmRegisteredUpdateNeeded(const emm_reg_t *); -int EmmRegisteredNoCellAvailable(const emm_reg_t *); -int EmmRegisteredAttemptingToUpdate(const emm_reg_t *); -int EmmRegisteredImsiDetachInitiated(const emm_reg_t *); -int EmmTrackingAreaUpdatingInitiated(const emm_reg_t *); -int EmmServiceRequestInitiated(const emm_reg_t *); +int EmmNull(nas_user_t *user, const emm_reg_t *); +int EmmDeregistered(nas_user_t *user, const emm_reg_t *); +int EmmRegistered(nas_user_t *user, const emm_reg_t *); +int EmmDeregisteredInitiated(nas_user_t *user, const emm_reg_t *); +int EmmDeregisteredNormalService(nas_user_t *user, const emm_reg_t *); +int EmmDeregisteredLimitedService(nas_user_t *user, const emm_reg_t *); +int EmmDeregisteredAttemptingToAttach(nas_user_t *user, const emm_reg_t *); +int EmmDeregisteredPlmnSearch(nas_user_t *user, const emm_reg_t *); +int EmmDeregisteredNoImsi(nas_user_t *user, const emm_reg_t *); +int EmmDeregisteredAttachNeeded(nas_user_t *user, const emm_reg_t *); +int EmmDeregisteredNoCellAvailable(nas_user_t *user, const emm_reg_t *); +int EmmRegisteredInitiated(nas_user_t *user, const emm_reg_t *); +int EmmRegisteredNormalService(nas_user_t *user, const emm_reg_t *); +int EmmRegisteredAttemptingToUpdate(nas_user_t *user, const emm_reg_t *); +int EmmRegisteredLimitedService(nas_user_t *user, const emm_reg_t *); +int EmmRegisteredPlmnSearch(nas_user_t *user, const emm_reg_t *); +int EmmRegisteredUpdateNeeded(nas_user_t *user, const emm_reg_t *); +int EmmRegisteredNoCellAvailable(nas_user_t *user, const emm_reg_t *); +int EmmRegisteredAttemptingToUpdate(nas_user_t *user, const emm_reg_t *); +int EmmRegisteredImsiDetachInitiated(nas_user_t *user, const emm_reg_t *); +int EmmTrackingAreaUpdatingInitiated(nas_user_t *user, const emm_reg_t *); +int EmmServiceRequestInitiated(nas_user_t *user, const emm_reg_t *); /* EMM state machine handlers */ @@ -187,14 +181,6 @@ static const emm_fsm_handler_t _emm_fsm_handlers[EMM_STATE_MAX] = { EmmServiceRequestInitiated, }; -/* - * ----------------------------------------------------------------------------- - * Current EPS Mobility Management status - * ----------------------------------------------------------------------------- - */ - -emm_fsm_state_t _emm_fsm_status[EMM_FSM_NB_UE_MAX]; - /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ @@ -213,14 +199,12 @@ emm_fsm_state_t _emm_fsm_status[EMM_FSM_NB_UE_MAX]; ** Others: _emm_fsm_status ** ** ** ***************************************************************************/ -void emm_fsm_initialize(void) +emm_fsm_state_t emm_fsm_initialize() { - //int ueid; LOG_FUNC_IN; - _emm_fsm_status[0] = EMM_NULL; - LOG_FUNC_OUT; + return EMM_NULL; } /**************************************************************************** @@ -238,22 +222,18 @@ void emm_fsm_initialize(void) ** Others: _emm_fsm_status ** ** ** ***************************************************************************/ -int emm_fsm_set_status( +int emm_fsm_set_status(nas_user_t *user, emm_fsm_state_t status) { LOG_FUNC_IN; - unsigned int ueid = 0; - - - - if ( (status < EMM_STATE_MAX) && (ueid < EMM_FSM_NB_UE_MAX) ) { + if ( status < EMM_STATE_MAX ) { LOG_TRACE(INFO, "EMM-FSM - Status changed: %s ===> %s", - _emm_fsm_status_str[_emm_fsm_status[ueid]], + _emm_fsm_status_str[user->emm_fsm_status], _emm_fsm_status_str[status]); - if (status != _emm_fsm_status[ueid]) { - _emm_fsm_status[ueid] = status; + if (status != user->emm_fsm_status) { + user->emm_fsm_status = status; } LOG_FUNC_RETURN (RETURNok); @@ -277,9 +257,9 @@ int emm_fsm_set_status( ** Others: None ** ** ** ***************************************************************************/ -emm_fsm_state_t emm_fsm_get_status(void) +emm_fsm_state_t emm_fsm_get_status(nas_user_t *user) { - return (_emm_fsm_status[0]); + return user->emm_fsm_status; } /**************************************************************************** @@ -296,7 +276,7 @@ emm_fsm_state_t emm_fsm_get_status(void) ** Others: None ** ** ** ***************************************************************************/ -int emm_fsm_process(const emm_reg_t *evt) +int emm_fsm_process(nas_user_t *user, const emm_reg_t *evt) { int rc; emm_fsm_state_t status; @@ -306,7 +286,7 @@ int emm_fsm_process(const emm_reg_t *evt) primitive = evt->primitive; - status = _emm_fsm_status[0]; + status = user->emm_fsm_status; LOG_TRACE(INFO, "EMM-FSM - Received event %s (%d) in state %s", _emm_fsm_event_str[primitive - _EMMREG_START - 1], primitive, @@ -314,7 +294,7 @@ int emm_fsm_process(const emm_reg_t *evt) /* Execute the EMM state machine */ - rc = (_emm_fsm_handlers[status])(evt); + rc = (_emm_fsm_handlers[status])(user, evt); LOG_FUNC_RETURN (rc); } diff --git a/openair3/NAS/UE/EMM/SAP/emm_fsm.h b/openair3/NAS/UE/EMM/SAP/emm_fsm.h old mode 100755 new mode 100644 index c929890e05..bc1faf2f85 --- a/openair3/NAS/UE/EMM/SAP/emm_fsm.h +++ b/openair3/NAS/UE/EMM/SAP/emm_fsm.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_fsm.h @@ -48,48 +41,13 @@ Description Defines the EPS Mobility Management procedures executed at #define __EMM_FSM_H__ #include "emm_regDef.h" +#include "emm_fsm_defs.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ /****************************************************************************/ -/****************************************************************************/ -/************************ G L O B A L T Y P E S ************************/ -/****************************************************************************/ - -/* - * States of the EPS Mobility Management sublayer - * ---------------------------------------------- - * The EMM protocol of the UE and the network is described by means of two - * different state machines. - */ -typedef enum { - EMM_INVALID, - EMM_NULL, - EMM_DEREGISTERED, - EMM_REGISTERED, - EMM_DEREGISTERED_INITIATED, - EMM_DEREGISTERED_NORMAL_SERVICE, - EMM_DEREGISTERED_LIMITED_SERVICE, - EMM_DEREGISTERED_ATTEMPTING_TO_ATTACH, - EMM_DEREGISTERED_PLMN_SEARCH, - EMM_DEREGISTERED_NO_IMSI, - EMM_DEREGISTERED_ATTACH_NEEDED, - EMM_DEREGISTERED_NO_CELL_AVAILABLE, - EMM_REGISTERED_INITIATED, - EMM_REGISTERED_NORMAL_SERVICE, - EMM_REGISTERED_ATTEMPTING_TO_UPDATE, - EMM_REGISTERED_LIMITED_SERVICE, - EMM_REGISTERED_PLMN_SEARCH, - EMM_REGISTERED_UPDATE_NEEDED, - EMM_REGISTERED_NO_CELL_AVAILABLE, - EMM_REGISTERED_ATTEMPTING_TO_UPDATE_MM, - EMM_REGISTERED_IMSI_DETACH_INITIATED, - EMM_TRACKING_AREA_UPDATING_INITIATED, - EMM_SERVICE_REQUEST_INITIATED, - EMM_STATE_MAX -} emm_fsm_state_t; - /****************************************************************************/ /******************** G L O B A L V A R I A B L E S ********************/ /****************************************************************************/ @@ -98,12 +56,12 @@ typedef enum { /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -void emm_fsm_initialize(void); +emm_fsm_state_t emm_fsm_initialize(void); -int emm_fsm_set_status(emm_fsm_state_t status); -emm_fsm_state_t emm_fsm_get_status(void); +int emm_fsm_set_status(nas_user_t *user, emm_fsm_state_t status); +emm_fsm_state_t emm_fsm_get_status(nas_user_t *user); -int emm_fsm_process(const emm_reg_t *evt); +int emm_fsm_process(nas_user_t *user, const emm_reg_t *evt); #endif /* __EMM_FSM_H__*/ diff --git a/openair3/NAS/UE/EMM/SAP/emm_recv.c b/openair3/NAS/UE/EMM/SAP/emm_recv.c old mode 100755 new mode 100644 index 12efa89f86..2c901eb49b --- a/openair3/NAS/UE/EMM/SAP/emm_recv.c +++ b/openair3/NAS/UE/EMM/SAP/emm_recv.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_recv.c @@ -132,7 +125,7 @@ int emm_recv_status(unsigned int ueid, emm_status_msg *msg, int *emm_cause) ** Others: None ** ** ** ***************************************************************************/ -int emm_recv_attach_accept(attach_accept_msg *msg, int *emm_cause) +int emm_recv_attach_accept(nas_user_t *user, attach_accept_msg *msg, int *emm_cause) { LOG_FUNC_IN; @@ -144,8 +137,15 @@ int emm_recv_attach_accept(attach_accept_msg *msg, int *emm_cause) /* * Message checking */ - if (msg->tailist.typeoflist != - TRACKING_AREA_IDENTITY_LIST_ONE_PLMN_CONSECUTIVE_TACS) { + // supported cases: + // typeoflist = 1 Or + // typeoflist = 0 and numberofelements = 1 (ie numberofelements equal to zero see 3gpp 24.301 9.9.3.33.1) + LOG_TRACE(DEBUG,"attach accept type of list: %d, number of element: %d\n",msg->tailist.typeoflist, msg->tailist.numberofelements); + if (!( (msg->tailist.typeoflist == TRACKING_AREA_IDENTITY_LIST_ONE_PLMN_CONSECUTIVE_TACS) || + ((msg->tailist.typeoflist == 0) && ( msg->tailist.numberofelements == 0)) + ) + ) + { /* Only list of TACs belonging to one PLMN with consecutive * TAC values is supported */ *emm_cause = EMM_CAUSE_IE_NOT_IMPLEMENTED; @@ -224,7 +224,7 @@ int emm_recv_attach_accept(attach_accept_msg *msg, int *emm_cause) } /* Execute attach procedure accepted by the network */ - rc = emm_proc_attach_accept(T3412, T3402, T3423, n_tais, tai, pguti, + rc = emm_proc_attach_accept(user, T3412, T3402, T3423, n_tais, tai, pguti, n_eplmns, &eplmn, &msg->esmmessagecontainer.esmmessagecontainercontents); @@ -245,7 +245,7 @@ int emm_recv_attach_accept(attach_accept_msg *msg, int *emm_cause) ** Others: None ** ** ** ***************************************************************************/ -int emm_recv_attach_reject(attach_reject_msg *msg, int *emm_cause) +int emm_recv_attach_reject(nas_user_t *user, attach_reject_msg *msg, int *emm_cause) { LOG_FUNC_IN; @@ -275,11 +275,11 @@ int emm_recv_attach_reject(attach_reject_msg *msg, int *emm_cause) */ if (msg->presencemask & ATTACH_REJECT_ESM_MESSAGE_CONTAINER_PRESENT) { /* Execute attach procedure rejected by the network */ - rc = emm_proc_attach_reject(msg->emmcause, + rc = emm_proc_attach_reject(user, msg->emmcause, &msg->esmmessagecontainer.esmmessagecontainercontents); } else { /* Execute attach procedure rejected by the network */ - rc = emm_proc_attach_reject(msg->emmcause, NULL); + rc = emm_proc_attach_reject(user, msg->emmcause, NULL); } LOG_FUNC_RETURN (rc); @@ -299,7 +299,7 @@ int emm_recv_attach_reject(attach_reject_msg *msg, int *emm_cause) ** Others: None ** ** ** ***************************************************************************/ -int emm_recv_detach_accept(detach_accept_msg *msg, int *emm_cause) +int emm_recv_detach_accept(nas_user_t *user, detach_accept_msg *msg, int *emm_cause) { LOG_FUNC_IN; @@ -311,7 +311,7 @@ int emm_recv_detach_accept(detach_accept_msg *msg, int *emm_cause) * Message processing */ /* Execute the UE initiated detach procedure completion by the UE */ - rc = emm_proc_detach_accept(); + rc = emm_proc_detach_accept(user); LOG_FUNC_RETURN (rc); } @@ -330,7 +330,7 @@ int emm_recv_detach_accept(detach_accept_msg *msg, int *emm_cause) ** Others: None ** ** ** ***************************************************************************/ -int emm_recv_identity_request(identity_request_msg *msg, int *emm_cause) +int emm_recv_identity_request(nas_user_t *user, identity_request_msg *msg, int *emm_cause) { LOG_FUNC_IN; @@ -358,7 +358,7 @@ int emm_recv_identity_request(identity_request_msg *msg, int *emm_cause) } /* Execute the identification procedure initiated by the network */ - rc = emm_proc_identification_request(type); + rc = emm_proc_identification_request(user, type); LOG_FUNC_RETURN (rc); } @@ -377,7 +377,7 @@ int emm_recv_identity_request(identity_request_msg *msg, int *emm_cause) ** Others: None ** ** ** ***************************************************************************/ -int emm_recv_authentication_request(authentication_request_msg *msg, +int emm_recv_authentication_request(nas_user_t *user, authentication_request_msg *msg, int *emm_cause) { LOG_FUNC_IN; @@ -404,7 +404,7 @@ int emm_recv_authentication_request(authentication_request_msg *msg, * Message processing */ /* Execute the authentication procedure initiated by the network */ - rc = emm_proc_authentication_request( + rc = emm_proc_authentication_request(user, msg->naskeysetidentifierasme.tsc != NAS_KEY_SET_IDENTIFIER_MAPPED, msg->naskeysetidentifierasme.naskeysetidentifier, &msg->authenticationparameterrand.rand, @@ -427,7 +427,7 @@ int emm_recv_authentication_request(authentication_request_msg *msg, ** Others: None ** ** ** ***************************************************************************/ -int emm_recv_authentication_reject(authentication_reject_msg *msg, +int emm_recv_authentication_reject(nas_user_t *user, authentication_reject_msg *msg, int *emm_cause) { LOG_FUNC_IN; @@ -440,7 +440,7 @@ int emm_recv_authentication_reject(authentication_reject_msg *msg, * Message processing */ /* Execute the authentication procedure not accepted by the network */ - rc = emm_proc_authentication_reject(); + rc = emm_proc_authentication_reject(user); LOG_FUNC_RETURN (rc); } @@ -459,7 +459,7 @@ int emm_recv_authentication_reject(authentication_reject_msg *msg, ** Others: None ** ** ** ***************************************************************************/ -int emm_recv_security_mode_command(security_mode_command_msg *msg, +int emm_recv_security_mode_command(nas_user_t *user, security_mode_command_msg *msg, int *emm_cause) { LOG_FUNC_IN; @@ -472,13 +472,15 @@ int emm_recv_security_mode_command(security_mode_command_msg *msg, * Message processing */ /* Execute the security mode control procedure initiated by the network */ - rc = emm_proc_security_mode_command( + LOG_TRACE(INFO,"Execute the security mode control procedure initiated by the network: imeisvrequest %d\n",msg->imeisvrequest); + rc = emm_proc_security_mode_command(user, msg->naskeysetidentifier.tsc != NAS_KEY_SET_IDENTIFIER_MAPPED, msg->naskeysetidentifier.naskeysetidentifier, msg->selectednassecurityalgorithms.typeofcipheringalgorithm, msg->selectednassecurityalgorithms.typeofintegrityalgorithm, msg->replayeduesecuritycapabilities.eea, - msg->replayeduesecuritycapabilities.eia); + msg->replayeduesecuritycapabilities.eia, + msg->imeisvrequest & 0x7); LOG_FUNC_RETURN (rc); } diff --git a/openair3/NAS/UE/EMM/SAP/emm_recv.h b/openair3/NAS/UE/EMM/SAP/emm_recv.h old mode 100755 new mode 100644 index 71398f98d0..ccfc8fd2a2 --- a/openair3/NAS/UE/EMM/SAP/emm_recv.h +++ b/openair3/NAS/UE/EMM/SAP/emm_recv.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_recv.h @@ -66,7 +59,7 @@ Description Defines functions executed at the EMMAS Service Access #include "EmmInformation.h" #include "DownlinkNasTransport.h" #include "CsServiceNotification.h" - +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ /****************************************************************************/ @@ -95,17 +88,17 @@ int emm_recv_status(unsigned int ueid, emm_status_msg *msg, int *emm_cause); * Functions executed by the UE upon receiving EMM message from the network * -------------------------------------------------------------------------- */ -int emm_recv_attach_accept(attach_accept_msg *msg, int *emm_cause); -int emm_recv_attach_reject(attach_reject_msg *msg, int *emm_cause); +int emm_recv_attach_accept(nas_user_t *user, attach_accept_msg *msg, int *emm_cause); +int emm_recv_attach_reject(nas_user_t *user, attach_reject_msg *msg, int *emm_cause); -int emm_recv_detach_accept(detach_accept_msg *msg, int *emm_cause); +int emm_recv_detach_accept(nas_user_t *user, detach_accept_msg *msg, int *emm_cause); -int emm_recv_identity_request(identity_request_msg *msg, int *emm_cause); -int emm_recv_authentication_request(authentication_request_msg *msg, +int emm_recv_identity_request(nas_user_t *user, identity_request_msg *msg, int *emm_cause); +int emm_recv_authentication_request(nas_user_t *user, authentication_request_msg *msg, int *emm_cause); -int emm_recv_authentication_reject(authentication_reject_msg *msg, +int emm_recv_authentication_reject(nas_user_t *user, authentication_reject_msg *msg, int *emm_cause); -int emm_recv_security_mode_command(security_mode_command_msg *msg, +int emm_recv_security_mode_command(nas_user_t *user, security_mode_command_msg *msg, int *emm_cause); #endif /* __EMM_RECV_H__*/ diff --git a/openair3/NAS/UE/EMM/SAP/emm_reg.c b/openair3/NAS/UE/EMM/SAP/emm_reg.c old mode 100755 new mode 100644 index b73f75975a..87c1f1bbd1 --- a/openair3/NAS/UE/EMM/SAP/emm_reg.c +++ b/openair3/NAS/UE/EMM/SAP/emm_reg.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_reg.c @@ -80,12 +73,12 @@ Description Defines the EMMREG Service Access Point that provides ** Others: NONE ** ** ** ***************************************************************************/ -void emm_reg_initialize(void) +void emm_reg_initialize(nas_user_t *user) { LOG_FUNC_IN; /* Initialize the EMM state machine */ - emm_fsm_initialize(); + user->emm_fsm_status = emm_fsm_initialize(); LOG_FUNC_OUT; } @@ -104,7 +97,7 @@ void emm_reg_initialize(void) ** Others: None ** ** ** ***************************************************************************/ -int emm_reg_send(const emm_reg_t *msg) +int emm_reg_send(nas_user_t *user, const emm_reg_t *msg) { LOG_FUNC_IN; @@ -118,7 +111,7 @@ int emm_reg_send(const emm_reg_t *msg) (void)primitive; /* Execute the EMM procedure */ - rc = emm_fsm_process(msg); + rc = emm_fsm_process(user, msg); LOG_FUNC_RETURN (rc); } diff --git a/openair3/NAS/UE/EMM/SAP/emm_reg.h b/openair3/NAS/UE/EMM/SAP/emm_reg.h old mode 100755 new mode 100644 index 9660f641c1..96a68f1fce --- a/openair3/NAS/UE/EMM/SAP/emm_reg.h +++ b/openair3/NAS/UE/EMM/SAP/emm_reg.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_reg.h @@ -49,6 +42,7 @@ Description Defines the EMMREG Service Access Point that provides #define __EMM_REG_H__ #include "emm_regDef.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -66,8 +60,8 @@ Description Defines the EMMREG Service Access Point that provides /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -void emm_reg_initialize(void); +void emm_reg_initialize(nas_user_t *user); -int emm_reg_send(const emm_reg_t *msg); +int emm_reg_send(nas_user_t *user, const emm_reg_t *msg); #endif /* __EMM_REG_H__*/ diff --git a/openair3/NAS/UE/EMM/SAP/emm_regDef.h b/openair3/NAS/UE/EMM/SAP/emm_regDef.h old mode 100755 new mode 100644 index 7f96326ffb..b66c0565ea --- a/openair3/NAS/UE/EMM/SAP/emm_regDef.h +++ b/openair3/NAS/UE/EMM/SAP/emm_regDef.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_regDef.h diff --git a/openair3/NAS/UE/EMM/SAP/emm_sap.c b/openair3/NAS/UE/EMM/SAP/emm_sap.c old mode 100755 new mode 100644 index 2da5da75ce..3f48cf3d8f --- a/openair3/NAS/UE/EMM/SAP/emm_sap.c +++ b/openair3/NAS/UE/EMM/SAP/emm_sap.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_sap.c @@ -53,6 +46,7 @@ Description Defines the EMM Service Access Points at which the EPS #include "emm_reg.h" #include "emm_esm.h" #include "emm_as.h" +#include "user_defs.h" /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ @@ -80,13 +74,13 @@ Description Defines the EMM Service Access Points at which the EPS ** Others: NONE ** ** ** ***************************************************************************/ -void emm_sap_initialize(void) +void emm_sap_initialize(nas_user_t *user) { LOG_FUNC_IN; - emm_reg_initialize(); + emm_reg_initialize(user); emm_esm_initialize(); - emm_as_initialize(); + emm_as_initialize(user); LOG_FUNC_OUT; } @@ -105,7 +99,7 @@ void emm_sap_initialize(void) ** Others: None ** ** ** ***************************************************************************/ -int emm_sap_send(emm_sap_t *msg) +int emm_sap_send(nas_user_t *user, emm_sap_t *msg) { int rc = RETURNerror; @@ -118,17 +112,17 @@ int emm_sap_send(emm_sap_t *msg) (primitive < (emm_primitive_t)EMMREG_PRIMITIVE_MAX) ) { /* Forward to the EMMREG-SAP */ msg->u.emm_reg.primitive = primitive; - rc = emm_reg_send(&msg->u.emm_reg); + rc = emm_reg_send(user, &msg->u.emm_reg); } else if ( (primitive > (emm_primitive_t)EMMESM_PRIMITIVE_MIN) && (primitive < (emm_primitive_t)EMMESM_PRIMITIVE_MAX) ) { /* Forward to the EMMESM-SAP */ msg->u.emm_esm.primitive = primitive; - rc = emm_esm_send(&msg->u.emm_esm); + rc = emm_esm_send(user, &msg->u.emm_esm); } else if ( (primitive > (emm_primitive_t)EMMAS_PRIMITIVE_MIN) && (primitive < (emm_primitive_t)EMMAS_PRIMITIVE_MAX) ) { /* Forward to the EMMAS-SAP */ msg->u.emm_as.primitive = primitive; - rc = emm_as_send(&msg->u.emm_as); + rc = emm_as_send(user, &msg->u.emm_as); } else { LOG_TRACE(WARNING, "EMM-SAP - Out of range primitive (%d)", primitive); diff --git a/openair3/NAS/UE/EMM/SAP/emm_sap.h b/openair3/NAS/UE/EMM/SAP/emm_sap.h old mode 100755 new mode 100644 index eda2bde514..98088a66f3 --- a/openair3/NAS/UE/EMM/SAP/emm_sap.h +++ b/openair3/NAS/UE/EMM/SAP/emm_sap.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_sap.h @@ -53,6 +46,7 @@ Description Defines the EMM Service Access Points at which the EPS #include "emm_regDef.h" #include "emm_esmDef.h" #include "emm_asDef.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -163,8 +157,8 @@ typedef struct emm_sap_s { /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -void emm_sap_initialize(void); +void emm_sap_initialize(nas_user_t *user); -int emm_sap_send(emm_sap_t *msg); +int emm_sap_send(nas_user_t *user, emm_sap_t *msg); #endif /* __EMM_SAP_H__*/ diff --git a/openair3/NAS/UE/EMM/SAP/emm_send.c b/openair3/NAS/UE/EMM/SAP/emm_send.c old mode 100755 new mode 100644 index d8e434f5a2..56708eded3 --- a/openair3/NAS/UE/EMM/SAP/emm_send.c +++ b/openair3/NAS/UE/EMM/SAP/emm_send.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_send.c @@ -862,6 +855,34 @@ int emm_send_security_mode_complete(const emm_as_security_t *msg, /* Mandatory - Message type */ emm_msg->messagetype = SECURITY_MODE_COMPLETE; + if(msg->imeisv_request) + { + // configure imeisv param + emm_msg->presencemask |= SECURITY_MODE_COMPLETE_IMEISV_PRESENT; + + // 33 85 76 02 05 26 84 01 F1 + emm_msg->imeisv.imeisv.digit1 = 0x3; + emm_msg->imeisv.imeisv.oddeven = 0x0; + emm_msg->imeisv.imeisv.typeofidentity = 0x3; + emm_msg->imeisv.imeisv.digit2 = 0x5; + emm_msg->imeisv.imeisv.digit3 = 0x7; + emm_msg->imeisv.imeisv.digit4 = 0x4; + emm_msg->imeisv.imeisv.digit5 = 0x7; + emm_msg->imeisv.imeisv.digit6 = 0x3; + emm_msg->imeisv.imeisv.digit7 = 0x0; + emm_msg->imeisv.imeisv.digit8 = 0x4; + emm_msg->imeisv.imeisv.digit9 = 0x0; + emm_msg->imeisv.imeisv.digit10 = 0x0; + emm_msg->imeisv.imeisv.digit11 = 0x7; + emm_msg->imeisv.imeisv.digit12 = 0x0; + emm_msg->imeisv.imeisv.digit13 = 0x5; + emm_msg->imeisv.imeisv.digit14 = 0x3; + emm_msg->imeisv.imeisv.digit15 = 0x0; + emm_msg->imeisv.imeisv.digit16 = 0x0; + emm_msg->imeisv.imeisv.parity = IMEI_ODD_PARITY; + + size += SECURITY_MODE_COMPLETE_MAXIMUM_LENGTH; + } LOG_FUNC_RETURN (size); } diff --git a/openair3/NAS/UE/EMM/SAP/emm_send.h b/openair3/NAS/UE/EMM/SAP/emm_send.h old mode 100755 new mode 100644 index 18c8eb37f0..7cd4fb132f --- a/openair3/NAS/UE/EMM/SAP/emm_send.h +++ b/openair3/NAS/UE/EMM/SAP/emm_send.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_send.h diff --git a/openair3/NAS/UE/EMM/SecurityModeControl.c b/openair3/NAS/UE/EMM/SecurityModeControl.c old mode 100755 new mode 100644 index fd7e4c3991..7bdd21572e --- a/openair3/NAS/UE/EMM/SecurityModeControl.c +++ b/openair3/NAS/UE/EMM/SecurityModeControl.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source SecurityModeControl.c @@ -71,6 +64,11 @@ Description Defines the security mode control EMM procedure executed by the # include "assertions.h" #include "secu_defs.h" #include "msc.h" +#include "SecurityModeControl.h" + +#if defined(NAS_BUILT_IN_UE) +#include "nas_itti_messaging.h" +#endif /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ @@ -95,13 +93,6 @@ static int _security_knas_int(const OctetString *kasme, OctetString *knas_int, static int _security_kenb(const OctetString *kasme, OctetString *kenb, uint32_t count); -/* - * Internal data used for security mode control procedure - */ -static struct { - OctetString kenb; /* eNodeB security key */ -} _security_data; - static void _security_release(emm_security_context_t *ctx); /* @@ -148,26 +139,27 @@ static void _security_release(emm_security_context_t *ctx); ** Others: None ** ** ** ***************************************************************************/ -int emm_proc_security_mode_command(int native_ksi, int ksi, - int seea, int seia, int reea, int reia) +int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi, + int seea, int seia, int reea, int reia, int imeisv_request) { LOG_FUNC_IN; int rc = RETURNerror; int emm_cause = EMM_CAUSE_SUCCESS; int security_context_is_new = FALSE; + security_data_t *security_data = user->security_data; LOG_TRACE(INFO, "EMM-PROC - Security mode control requested (ksi=%d)", ksi); /* Delete any previously stored RAND and RES and stop timer T3416 */ - (void) emm_proc_authentication_delete(); + (void) emm_proc_authentication_delete(user); /* * Check the replayed UE security capabilities */ - uint8_t eea = (0x80 >> _emm_data.security->capability.eps_encryption); - uint8_t eia = (0x80 >> _emm_data.security->capability.eps_integrity); + uint8_t eea = (0x80 >> user->emm_data->security->capability.eps_encryption); + uint8_t eia = (0x80 >> user->emm_data->security->capability.eps_integrity); if ( (reea != eea) || (reia != eia) ) { LOG_TRACE(WARNING, "EMM-PROC - Replayed UE security capabilities " @@ -183,7 +175,7 @@ int emm_proc_security_mode_command(int native_ksi, int ksi, /* * Check the non-current EPS security context */ - else if (_emm_data.non_current == NULL) { + else if (user->emm_data->non_current == NULL) { LOG_TRACE(WARNING, "EMM-PROC - Non-current EPS security context " "is not valid"); emm_cause = EMM_CAUSE_SECURITY_MODE_REJECTED; @@ -194,53 +186,53 @@ int emm_proc_security_mode_command(int native_ksi, int ksi, else { LOG_TRACE(INFO, "EMM-PROC - Update the non-current EPS security context seea=%u seia=%u", seea, seia); /* Update selected cyphering and integrity algorithms */ - //LG COMENTED _emm_data.non_current->capability.encryption = seea; - //LG COMENTED _emm_data.non_current->capability.integrity = seia; + //LG COMENTED user->emm_data->non_current->capability.encryption = seea; + //LG COMENTED user->emm_data->non_current->capability.integrity = seia; - _emm_data.non_current->selected_algorithms.encryption = seea; - _emm_data.non_current->selected_algorithms.integrity = seia; + user->emm_data->non_current->selected_algorithms.encryption = seea; + user->emm_data->non_current->selected_algorithms.integrity = seia; /* Derive the NAS cyphering key */ - if (_emm_data.non_current->knas_enc.value == NULL) { - _emm_data.non_current->knas_enc.value = + if (user->emm_data->non_current->knas_enc.value == NULL) { + user->emm_data->non_current->knas_enc.value = (uint8_t *)calloc(1,AUTH_KNAS_ENC_SIZE); - _emm_data.non_current->knas_enc.length = AUTH_KNAS_ENC_SIZE; + user->emm_data->non_current->knas_enc.length = AUTH_KNAS_ENC_SIZE; } - if (_emm_data.non_current->knas_enc.value != NULL) { + if (user->emm_data->non_current->knas_enc.value != NULL) { LOG_TRACE(INFO, "EMM-PROC - Update the non-current EPS security context knas_enc"); - rc = _security_knas_enc(&_emm_data.non_current->kasme, - &_emm_data.non_current->knas_enc, seea); + rc = _security_knas_enc(&user->emm_data->non_current->kasme, + &user->emm_data->non_current->knas_enc, seea); } /* Derive the NAS integrity key */ - if (_emm_data.non_current->knas_int.value == NULL) { - _emm_data.non_current->knas_int.value = + if (user->emm_data->non_current->knas_int.value == NULL) { + user->emm_data->non_current->knas_int.value = (uint8_t *)calloc(1,AUTH_KNAS_INT_SIZE); - _emm_data.non_current->knas_int.length = AUTH_KNAS_INT_SIZE; + user->emm_data->non_current->knas_int.length = AUTH_KNAS_INT_SIZE; } - if (_emm_data.non_current->knas_int.value != NULL) { + if (user->emm_data->non_current->knas_int.value != NULL) { if (rc != RETURNerror) { LOG_TRACE(INFO, "EMM-PROC - Update the non-current EPS security context knas_int"); - rc = _security_knas_int(&_emm_data.non_current->kasme, - &_emm_data.non_current->knas_int, seia); + rc = _security_knas_int(&user->emm_data->non_current->kasme, + &user->emm_data->non_current->knas_int, seia); } } /* Derive the eNodeB key */ - if (_security_data.kenb.value == NULL) { - _security_data.kenb.value = (uint8_t *)calloc(1,AUTH_KENB_SIZE); - _security_data.kenb.length = AUTH_KENB_SIZE; + if (security_data->kenb.value == NULL) { + security_data->kenb.value = (uint8_t *)calloc(1,AUTH_KENB_SIZE); + security_data->kenb.length = AUTH_KENB_SIZE; } - if (_security_data.kenb.value != NULL) { + if (security_data->kenb.value != NULL) { if (rc != RETURNerror) { LOG_TRACE(INFO, "EMM-PROC - Update the non-current EPS security context kenb"); - // LG COMMENT rc = _security_kenb(&_emm_data.security->kasme, - rc = _security_kenb(&_emm_data.non_current->kasme, - &_security_data.kenb, - *(uint32_t *)(&_emm_data.non_current->ul_count)); + // LG COMMENT rc = _security_kenb(&user->emm_data->security->kasme, + rc = _security_kenb(&user->emm_data->non_current->kasme, + &security_data->kenb, + *(uint32_t *)(&user->emm_data->non_current->ul_count)); } } @@ -251,13 +243,13 @@ int emm_proc_security_mode_command(int native_ksi, int ksi, LOG_TRACE(INFO, "EMM-PROC - NAS security mode command accepted by the UE"); /* Update the current EPS security context */ - if ( native_ksi && (_emm_data.security->type != EMM_KSI_NATIVE) ) { + if ( native_ksi && (user->emm_data->security->type != EMM_KSI_NATIVE) ) { /* The type of security context flag included in the SECURITY * MODE COMMAND message is set to "native security context" and * the UE has a mapped EPS security context as the current EPS * security context */ - if ( (_emm_data.non_current->type == EMM_KSI_NATIVE) && - (_emm_data.non_current->eksi == ksi) ) { + if ( (user->emm_data->non_current->type == EMM_KSI_NATIVE) && + (user->emm_data->non_current->eksi == ksi) ) { /* The KSI matches the non-current native EPS security * context; the UE shall take the non-current native EPS * security context into use which then becomes the @@ -266,33 +258,36 @@ int emm_proc_security_mode_command(int native_ksi, int ksi, LOG_TRACE(INFO, "EMM-PROC - Update Current security context"); /* Release non-current security context */ - _security_release(_emm_data.security); - _emm_data.security = _emm_data.non_current; + _security_release(user->emm_data->security); + user->emm_data->security = user->emm_data->non_current; /* Reset the uplink NAS COUNT counter */ - _emm_data.security->ul_count.overflow = 0; - _emm_data.security->ul_count.seq_num = 0; + user->emm_data->security->ul_count.overflow = 0; + user->emm_data->security->ul_count.seq_num = 0; /* Set new security context indicator */ security_context_is_new = TRUE; } } - if ( !native_ksi && (_emm_data.security->type != EMM_KSI_NATIVE) ) { + if ( !native_ksi && (user->emm_data->security->type != EMM_KSI_NATIVE) ) { /* The type of security context flag included in the SECURITY * MODE COMMAND message is set to "mapped security context" and * the UE has a mapped EPS security context as the current EPS * security context */ - if (ksi != _emm_data.security->eksi) { + if (ksi != user->emm_data->security->eksi) { /* The KSI does not match the current EPS security context; * the UE shall reset the uplink NAS COUNT counter */ LOG_TRACE(INFO, "EMM-PROC - Reset uplink NAS COUNT counter"); - _emm_data.security->ul_count.overflow = 0; - _emm_data.security->ul_count.seq_num = 0; + user->emm_data->security->ul_count.overflow = 0; + user->emm_data->security->ul_count.seq_num = 0; } } - _emm_data.security->selected_algorithms.encryption = seea; - _emm_data.security->selected_algorithms.integrity = seia; + user->emm_data->security->selected_algorithms.encryption = seea; + user->emm_data->security->selected_algorithms.integrity = seia; +#if defined(NAS_BUILT_IN_UE) + nas_itti_kenb_refresh_req(security_data->kenb.value); +#endif } /* @@ -303,17 +298,17 @@ int emm_proc_security_mode_command(int native_ksi, int ksi, emm_cause = EMM_CAUSE_SECURITY_MODE_REJECTED; /* Release security mode control internal data */ - if (_security_data.kenb.value) { - free(_security_data.kenb.value); - _security_data.kenb.value = NULL; - _security_data.kenb.length = 0; + if (security_data->kenb.value) { + free(security_data->kenb.value); + security_data->kenb.value = NULL; + security_data->kenb.length = 0; } } } /* Setup EMM procedure handler to be executed upon receiving * lower layer notification */ - rc = emm_proc_lowerlayer_initialize(NULL, NULL, NULL, NULL); + rc = emm_proc_lowerlayer_initialize(user->lowerlayer_data, NULL, NULL, NULL, NULL); if (rc != RETURNok) { LOG_TRACE(WARNING, @@ -327,14 +322,15 @@ int emm_proc_security_mode_command(int native_ksi, int ksi, */ emm_sap_t emm_sap; emm_sap.primitive = EMMAS_SECURITY_RES; - emm_sap.u.emm_as.u.security.guti = _emm_data.guti; - emm_sap.u.emm_as.u.security.ueid = 0; + emm_sap.u.emm_as.u.security.guti = user->emm_data->guti; + emm_sap.u.emm_as.u.security.ueid = user->ueid; emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_SMC; + emm_sap.u.emm_as.u.security.imeisv_request = imeisv_request; emm_sap.u.emm_as.u.security.emm_cause = emm_cause; /* Setup EPS NAS security data */ emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx, - _emm_data.security, security_context_is_new, TRUE); - rc = emm_sap_send(&emm_sap); + user->emm_data->security, security_context_is_new, TRUE); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } diff --git a/openair3/NAS/UE/EMM/SecurityModeControl.h b/openair3/NAS/UE/EMM/SecurityModeControl.h new file mode 100644 index 0000000000..314c168544 --- /dev/null +++ b/openair3/NAS/UE/EMM/SecurityModeControl.h @@ -0,0 +1,11 @@ +#ifndef _SECURITYMODECONTROL_H +#define _SECURITYMODECONTROL_H + +/* + * Internal data used for security mode control procedure + */ +typedef struct { + OctetString kenb; /* eNodeB security key */ +} security_data_t; + +#endif diff --git a/openair3/NAS/UE/EMM/ServiceRequestHdl.c b/openair3/NAS/UE/EMM/ServiceRequestHdl.c old mode 100755 new mode 100644 index d34e1f9f88..b305ee1690 --- a/openair3/NAS/UE/EMM/ServiceRequestHdl.c +++ b/openair3/NAS/UE/EMM/ServiceRequestHdl.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source ServiceRequest.c @@ -74,11 +67,6 @@ Description Defines the service request EMM procedure executed by the * Internal data handled by the service request procedure in the UE * -------------------------------------------------------------------------- */ -/* - * Timer handlers - */ -void *_emm_service_t3417_handler(void *); - /* * -------------------------------------------------------------------------- * Internal data handled by the service request procedure in the MME @@ -116,14 +104,16 @@ void *_emm_service_t3417_handler(void *); ** Others: None ** ** ** ***************************************************************************/ -void *_emm_service_t3417_handler(void *args) +void *emm_service_t3417_handler(void *args) { LOG_FUNC_IN; + nas_user_t *user = args; + emm_timers_t *emm_timers = user->emm_data->emm_timers; LOG_TRACE(WARNING, "EMM-PROC - T3417 timer expired"); /* Stop timer T3417 */ - T3417.id = nas_timer_stop(T3417.id); + emm_timers->T3417.id = nas_timer_stop(emm_timers->T3417.id); LOG_FUNC_RETURN(NULL); } diff --git a/openair3/NAS/UE/EMM/TrackingAreaUpdate.c b/openair3/NAS/UE/EMM/TrackingAreaUpdate.c old mode 100755 new mode 100644 index ac7944d18b..b8632ef257 --- a/openair3/NAS/UE/EMM/TrackingAreaUpdate.c +++ b/openair3/NAS/UE/EMM/TrackingAreaUpdate.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source TrackingAreaUpdate.c @@ -74,10 +67,6 @@ Description Defines the tracking area update EMM procedure executed by the * Internal data handled by the tracking area update procedure in the UE * -------------------------------------------------------------------------- */ -/* - * Timer handlers - */ -void *_emm_tau_t3430_handler(void *); /* * -------------------------------------------------------------------------- @@ -117,14 +106,16 @@ void *_emm_tau_t3430_handler(void *); ** Others: None ** ** ** ***************************************************************************/ -void *_emm_tau_t3430_handler(void *args) +void *emm_tau_t3430_handler(void *args) { LOG_FUNC_IN; + nas_user_t *user = args; + emm_timers_t *emm_timers = user->emm_data->emm_timers; LOG_TRACE(WARNING, "EMM-PROC - T3430 timer expired"); /* Stop timer T3430 */ - T3430.id = nas_timer_stop(T3430.id); + emm_timers->T3430.id = nas_timer_stop(emm_timers->T3430.id); LOG_FUNC_RETURN(NULL); } diff --git a/openair3/NAS/UE/EMM/emmData.h b/openair3/NAS/UE/EMM/emmData.h old mode 100755 new mode 100644 index d3e720eab0..dfdfb34e77 --- a/openair3/NAS/UE/EMM/emmData.h +++ b/openair3/NAS/UE/EMM/emmData.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emmData.h @@ -54,6 +47,7 @@ Description Defines internal private data handled by EPS Mobility #include "nas_timer.h" #include "esmData.h" +#include "emm_proc_defs.h" @@ -100,6 +94,29 @@ Description Defines internal private data handled by EPS Mobility /************************ G L O B A L T Y P E S ************************/ /****************************************************************************/ +/* + * Internal data used for attach procedure + */ + +#define EMM_ATTACH_COUNTER_MAX 5 + +typedef struct { + unsigned int attempt_count; /* Counter used to limit the number of + * subsequently rejected attach attempts */ +} emm_attach_data_t; + +/* + * Internal data used for detach procedure + */ +typedef struct { +#define EMM_DETACH_COUNTER_MAX 5 + unsigned int count; /* Counter used to limit the number of + * subsequently detach attempts */ + int switch_off; /* UE switch-off indicator */ + emm_proc_detach_type_t type; /* Type of the detach procedure + * currently in progress */ +} emm_detach_data_t; + /* * -------------------------------------------------------------------------- * EPS NAS security context handled by EPS Mobility Management sublayer in @@ -204,6 +221,20 @@ typedef struct emm_nvdata_s { PLMN_LIST_T(EMM_DATA_EPLMN_MAX) eplmn; } emm_nvdata_t; +typedef struct { + struct nas_timer_t T3402; /* attach failure timer */ + struct nas_timer_t T3410; /* attach timer */ + struct nas_timer_t T3411; /* attach restart timer */ + struct nas_timer_t T3412; /* periodic tracking area update timer */ + struct nas_timer_t T3416; /* EPS authentication challenge timer */ + struct nas_timer_t T3417; /* Service request timer */ + struct nas_timer_t T3418; /* MAC authentication failure timer */ + struct nas_timer_t T3420; /* Synch authentication failure timer */ + struct nas_timer_t T3421; /* Detach timer */ + struct nas_timer_t T3430; /* tracking area update timer */ + struct nas_timer_t T3423; /* E-UTRAN deactivate ISR timer */ +} emm_timers_t; + /* * Structure of the EMM data * ------------------------- @@ -331,7 +362,13 @@ typedef struct emm_data_s { */ emm_security_context_t *security; /* current security context */ emm_security_context_t *non_current; /* non-current security context */ - + /* + * EPS mobility management timers – UE side + * ---------------------------------------- + */ + emm_timers_t *emm_timers; + emm_detach_data_t *emm_detach_data; + emm_attach_data_t *emm_attach_data; } emm_data_t; @@ -340,18 +377,6 @@ typedef struct emm_data_s { /******************** G L O B A L V A R I A B L E S ********************/ /****************************************************************************/ -/* - * -------------------------------------------------------------------------- - * EPS mobility management data (used within EMM only) - * -------------------------------------------------------------------------- - */ -emm_data_t _emm_data; - -/* - * -------------------------------------------------------------------------- - * EPS mobility management timers – UE side - * -------------------------------------------------------------------------- - */ #define T3402_DEFAULT_VALUE 720 /* 12 minutes */ #define T3410_DEFAULT_VALUE 15 /* 15 seconds */ #define T3411_DEFAULT_VALUE 10 /* 10 seconds */ @@ -366,19 +391,6 @@ emm_data_t _emm_data; #define T3430_DEFAULT_VALUE 15 /* 15 seconds */ #define T3440_DEFAULT_VALUE 10 /* 10 seconds */ -struct nas_timer_t T3402; /* attach failure timer */ -struct nas_timer_t T3410; /* attach timer */ -struct nas_timer_t T3411; /* attach restart timer */ -struct nas_timer_t T3412; /* periodic tracking area update timer */ -struct nas_timer_t T3416; /* EPS authentication challenge timer */ -struct nas_timer_t T3417; /* Service request timer */ -struct nas_timer_t T3418; /* MAC authentication failure timer */ -struct nas_timer_t T3420; /* Synch authentication failure timer */ -struct nas_timer_t T3421; /* Detach timer */ -struct nas_timer_t T3430; /* tracking area update timer */ - -struct nas_timer_t T3423; /* E-UTRAN deactivate ISR timer */ - /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ diff --git a/openair3/NAS/UE/EMM/emm_fsm_defs.h b/openair3/NAS/UE/EMM/emm_fsm_defs.h new file mode 100644 index 0000000000..4e5b4a8ee6 --- /dev/null +++ b/openair3/NAS/UE/EMM/emm_fsm_defs.h @@ -0,0 +1,42 @@ +#ifndef _EMM_FSM_DEFS_H +#define _EMM_FSM_DEFS_H + +/****************************************************************************/ +/************************ G L O B A L T Y P E S ************************/ +/****************************************************************************/ + +/* + * States of the EPS Mobility Management sublayer + * ---------------------------------------------- + * The EMM protocol of the UE and the network is described by means of two + * different state machines. + */ +typedef enum { + EMM_INVALID, + EMM_NULL, + EMM_DEREGISTERED, + EMM_REGISTERED, + EMM_DEREGISTERED_INITIATED, + EMM_DEREGISTERED_NORMAL_SERVICE, + EMM_DEREGISTERED_LIMITED_SERVICE, + EMM_DEREGISTERED_ATTEMPTING_TO_ATTACH, + EMM_DEREGISTERED_PLMN_SEARCH, + EMM_DEREGISTERED_NO_IMSI, + EMM_DEREGISTERED_ATTACH_NEEDED, + EMM_DEREGISTERED_NO_CELL_AVAILABLE, + EMM_REGISTERED_INITIATED, + EMM_REGISTERED_NORMAL_SERVICE, + EMM_REGISTERED_ATTEMPTING_TO_UPDATE, + EMM_REGISTERED_LIMITED_SERVICE, + EMM_REGISTERED_PLMN_SEARCH, + EMM_REGISTERED_UPDATE_NEEDED, + EMM_REGISTERED_NO_CELL_AVAILABLE, + EMM_REGISTERED_ATTEMPTING_TO_UPDATE_MM, + EMM_REGISTERED_IMSI_DETACH_INITIATED, + EMM_TRACKING_AREA_UPDATING_INITIATED, + EMM_SERVICE_REQUEST_INITIATED, + EMM_STATE_MAX +} emm_fsm_state_t; + + +#endif diff --git a/openair3/NAS/UE/EMM/emm_main.c b/openair3/NAS/UE/EMM/emm_main.c old mode 100755 new mode 100644 index dbeacaa149..329b59fae6 --- a/openair3/NAS/UE/EMM/emm_main.c +++ b/openair3/NAS/UE/EMM/emm_main.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_main.c @@ -46,7 +39,10 @@ Description Defines the EPS Mobility Management procedure call manager, #include "emm_main.h" #include "nas_log.h" +#include "utils.h" #include "emmData.h" +#include "MobileIdentity.h" +#include "emm_proc_defs.h" #include "memory.h" #include "usim_api.h" @@ -59,6 +55,7 @@ Description Defines the EPS Mobility Management procedure call manager, /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ +extern uint8_t usim_test; /****************************************************************************/ /******************* L O C A L D E F I N I T I O N S *******************/ @@ -68,27 +65,58 @@ static int _emm_main_get_imei(imei_t *imei, const char *imei_str); static int _emm_main_imsi_cmp(imsi_t *imsi1, imsi_t *imsi2); -static const char *_emm_main_get_plmn(const plmn_t *plmn, int index, +static const char *_emm_main_get_plmn(emm_plmn_list_t *emm_plmn_list, const plmn_t *plmn, int index, int format, size_t *size); -static int _emm_main_get_plmn_index(const char *plmn, int format); - -/* - * USIM application data - */ -static usim_data_t _usim_data; +static int _emm_main_get_plmn_index(emm_plmn_list_t *emm_plmn_list, const char *plmn, int format); /* * Callback executed whenever a change in the network has to be notified * to the user application */ static emm_indication_callback_t _emm_main_user_callback; -static int _emm_main_callback(int); +static int _emm_main_callback(user_api_id_t *user_api_id, emm_data_t *emm_data, int size); /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ + /* + * Initialize EMM timers + */ +void _emm_timers_initialize(emm_timers_t *emm_timers) { + emm_timers->T3410.id = NAS_TIMER_INACTIVE_ID; + emm_timers->T3410.sec = T3410_DEFAULT_VALUE; + emm_timers->T3411.id = NAS_TIMER_INACTIVE_ID; + emm_timers->T3411.sec = T3411_DEFAULT_VALUE; + emm_timers->T3402.id = NAS_TIMER_INACTIVE_ID; + emm_timers->T3402.sec = T3402_DEFAULT_VALUE; + emm_timers->T3416.id = NAS_TIMER_INACTIVE_ID; + emm_timers->T3416.sec = T3416_DEFAULT_VALUE; + emm_timers->T3417.id = NAS_TIMER_INACTIVE_ID; + emm_timers->T3417.sec = T3417_DEFAULT_VALUE; + emm_timers->T3418.id = NAS_TIMER_INACTIVE_ID; + emm_timers->T3418.sec = T3418_DEFAULT_VALUE; + emm_timers->T3420.id = NAS_TIMER_INACTIVE_ID; + emm_timers->T3420.sec = T3420_DEFAULT_VALUE; + emm_timers->T3421.id = NAS_TIMER_INACTIVE_ID; + emm_timers->T3421.sec = T3421_DEFAULT_VALUE; + emm_timers->T3423.id = NAS_TIMER_INACTIVE_ID; + emm_timers->T3423.sec = T3423_DEFAULT_VALUE; + emm_timers->T3430.id = NAS_TIMER_INACTIVE_ID; + emm_timers->T3430.sec = T3430_DEFAULT_VALUE; +} + +void _emm_attach_initialize(emm_attach_data_t *emm_attach_data) { + emm_attach_data->attempt_count = 0; +} + +void _emm_detach_initialize(emm_detach_data_t *emm_detach) { + emm_detach->count = 0; + emm_detach->switch_off = FALSE; + emm_detach->type = EMM_DETACH_TYPE_RESERVED; +} + /**************************************************************************** ** ** ** Name: emm_main_initialize() ** @@ -98,75 +126,74 @@ static int _emm_main_callback(int); ** Inputs: cb: The user notification callback ** ** imei: The IMEI read from the UE's non-volatile ** ** memory ** - ** Others: _usim_data ** ** ** ** Outputs: None ** ** Return: None ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ***************************************************************************/ -void emm_main_initialize(emm_indication_callback_t cb, const char *imei) +void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const char *imei) { LOG_FUNC_IN; - + user->emm_data = calloc_or_fail(sizeof(emm_data_t)); /* USIM validity indicator */ - _emm_data.usim_is_valid = FALSE; + user->emm_data->usim_is_valid = FALSE; /* The IMEI read from the UE's non-volatile memory */ - _emm_data.imei = (imei_t *)malloc(sizeof(imei_t)); - _emm_data.imei->length = _emm_main_get_imei(_emm_data.imei, imei); + user->emm_data->imei = (imei_t *)malloc(sizeof(imei_t)); + user->emm_data->imei->length = _emm_main_get_imei(user->emm_data->imei, imei); /* The IMSI, valid only if USIM is present */ - _emm_data.imsi = NULL; + user->emm_data->imsi = NULL; /* EPS location information */ - _emm_data.guti = NULL; - _emm_data.tai = NULL; - _emm_data.ltai.n_tais = 0; + user->emm_data->guti = NULL; + user->emm_data->tai = NULL; + user->emm_data->ltai.n_tais = 0; /* EPS Connection Management status */ - _emm_data.ecm_status = ECM_IDLE; + user->emm_data->ecm_status = ECM_IDLE; /* Network selection mode of operation */ - _emm_data.plmn_mode = EMM_DATA_PLMN_AUTO; + user->emm_data->plmn_mode = EMM_DATA_PLMN_AUTO; /* Index of the PLMN manually selected by the user */ - _emm_data.plmn_index = -1; + user->emm_data->plmn_index = -1; /* Selected Radio Access Technology */ - _emm_data.plmn_rat = NET_ACCESS_UNAVAILABLE; + user->emm_data->plmn_rat = NET_ACCESS_UNAVAILABLE; /* Selected PLMN */ - memset(&_emm_data.splmn, 0xFF, sizeof(plmn_t)); - _emm_data.is_rplmn = FALSE; - _emm_data.is_eplmn = FALSE; + memset(&user->emm_data->splmn, 0xFF, sizeof(plmn_t)); + user->emm_data->is_rplmn = FALSE; + user->emm_data->is_eplmn = FALSE; /* Radio Access Technology of the serving cell */ - _emm_data.rat = NET_ACCESS_UNAVAILABLE; + user->emm_data->rat = NET_ACCESS_UNAVAILABLE; /* Network registration status */ - _emm_data.stat = NET_REG_STATE_OFF; - _emm_data.is_attached = FALSE; - _emm_data.is_emergency = FALSE; + user->emm_data->stat = NET_REG_STATE_OFF; + user->emm_data->is_attached = FALSE; + user->emm_data->is_emergency = FALSE; /* Location/Tracking area code */ - _emm_data.tac = 0; // two byte in hexadecimal format + user->emm_data->tac = 0; // two byte in hexadecimal format /* Identifier of the serving cell */ - _emm_data.ci = 0; // four byte in hexadecimal format + user->emm_data->ci = 0; // four byte in hexadecimal format /* List of operators present in the network */ - memset(_emm_data.plist.buffer, 0, EMM_DATA_BUFFER_SIZE + 1); + memset(user->emm_data->plist.buffer, 0, EMM_DATA_BUFFER_SIZE + 1); /* Home PLMN */ - memset(&_emm_data.hplmn, 0xFF, sizeof(plmn_t)); + memset(&user->emm_data->hplmn, 0xFF, sizeof(plmn_t)); /* List of Forbidden PLMNs */ - _emm_data.fplmn.n_plmns = 0; + user->emm_data->fplmn.n_plmns = 0; /* List of Forbidden PLMNs for GPRS service */ - _emm_data.fplmn_gprs.n_plmns = 0; + user->emm_data->fplmn_gprs.n_plmns = 0; /* List of Equivalent HPLMNs */ - _emm_data.ehplmn.n_plmns = 0; + user->emm_data->ehplmn.n_plmns = 0; /* List of user controlled PLMNs */ - _emm_data.plmn.n_plmns = 0; + user->emm_data->plmn.n_plmns = 0; /* List of operator controlled PLMNs */ - _emm_data.oplmn.n_plmns = 0; + user->emm_data->oplmn.n_plmns = 0; /* List of operator network name records */ - _emm_data.n_opnns = 0; + user->emm_data->n_opnns = 0; /* List of Forbidden Tracking Areas */ - _emm_data.ftai.n_tais = 0; + user->emm_data->ftai.n_tais = 0; /* List of Forbidden Tracking Areas for roaming */ - _emm_data.ftai_roaming.n_tais = 0; + user->emm_data->ftai_roaming.n_tais = 0; /* * Get USIM application data */ - if ( usim_api_read(&_usim_data) != RETURNok ) { + if ( usim_api_read(user->usim_data_store, &user->usim_data) != RETURNok ) { /* The USIM application may not be present or not valid */ LOG_TRACE(WARNING, "EMM-MAIN - Failed to read USIM application data"); } else { @@ -174,138 +201,184 @@ void emm_main_initialize(emm_indication_callback_t cb, const char *imei) /* The USIM application is present and valid */ LOG_TRACE(INFO, "EMM-MAIN - USIM application data successfully read"); - _emm_data.usim_is_valid = TRUE; + user->emm_data->usim_is_valid = TRUE; + + /* print keys (for debugging) */ + { + char usim_api_k[256]; + char opc[256]; + sprintf(usim_api_k, + "%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x " + "%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x", + user->usim_data.keys.usim_api_k[0], + user->usim_data.keys.usim_api_k[1], + user->usim_data.keys.usim_api_k[2], + user->usim_data.keys.usim_api_k[3], + user->usim_data.keys.usim_api_k[4], + user->usim_data.keys.usim_api_k[5], + user->usim_data.keys.usim_api_k[6], + user->usim_data.keys.usim_api_k[7], + user->usim_data.keys.usim_api_k[8], + user->usim_data.keys.usim_api_k[9], + user->usim_data.keys.usim_api_k[10], + user->usim_data.keys.usim_api_k[11], + user->usim_data.keys.usim_api_k[12], + user->usim_data.keys.usim_api_k[13], + user->usim_data.keys.usim_api_k[14], + user->usim_data.keys.usim_api_k[15]); + sprintf(opc, + "%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x " + "%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x", + user->usim_data.keys.opc[0], + user->usim_data.keys.opc[1], + user->usim_data.keys.opc[2], + user->usim_data.keys.opc[3], + user->usim_data.keys.opc[4], + user->usim_data.keys.opc[5], + user->usim_data.keys.opc[6], + user->usim_data.keys.opc[7], + user->usim_data.keys.opc[8], + user->usim_data.keys.opc[9], + user->usim_data.keys.opc[10], + user->usim_data.keys.opc[11], + user->usim_data.keys.opc[12], + user->usim_data.keys.opc[13], + user->usim_data.keys.opc[14], + user->usim_data.keys.opc[15]); + LOG_TRACE(INFO, "EMM-MAIN - usim_api_k: %s", usim_api_k); + LOG_TRACE(INFO, "EMM-MAIN - opc: %s", opc); + } /* Get the Home PLMN derived from the IMSI */ - _emm_data.hplmn.MCCdigit1 = _usim_data.imsi.u.num.digit1; - _emm_data.hplmn.MCCdigit2 = _usim_data.imsi.u.num.digit2; - _emm_data.hplmn.MCCdigit3 = _usim_data.imsi.u.num.digit3; - _emm_data.hplmn.MNCdigit1 = _usim_data.imsi.u.num.digit4; - _emm_data.hplmn.MNCdigit2 = _usim_data.imsi.u.num.digit5; - _emm_data.hplmn.MNCdigit3 = _usim_data.imsi.u.num.digit6; + user->emm_data->hplmn.MCCdigit1 = user->usim_data.imsi.u.num.digit1; + user->emm_data->hplmn.MCCdigit2 = user->usim_data.imsi.u.num.digit2; + user->emm_data->hplmn.MCCdigit3 = user->usim_data.imsi.u.num.digit3; + user->emm_data->hplmn.MNCdigit1 = user->usim_data.imsi.u.num.digit4; + user->emm_data->hplmn.MNCdigit2 = user->usim_data.imsi.u.num.digit5; + user->emm_data->hplmn.MNCdigit3 = user->usim_data.imsi.u.num.digit6; /* Get the list of forbidden PLMNs */ for (i=0; (i < EMM_DATA_FPLMN_MAX) && (i < USIM_FPLMN_MAX); i++) { - if ( PLMN_IS_VALID(_usim_data.fplmn[i]) ) { - _emm_data.fplmn.plmn[i] = _usim_data.fplmn[i]; - _emm_data.fplmn.n_plmns += 1; + if ( PLMN_IS_VALID(user->usim_data.fplmn[i]) ) { + user->emm_data->fplmn.plmn[i] = user->usim_data.fplmn[i]; + user->emm_data->fplmn.n_plmns += 1; } } /* Get the list of Equivalent HPLMNs */ for (i=0; (i < EMM_DATA_EHPLMN_MAX) && (i < USIM_EHPLMN_MAX); i++) { - if ( PLMN_IS_VALID(_usim_data.ehplmn[i]) ) { - _emm_data.ehplmn.plmn[i] = _usim_data.ehplmn[i]; - _emm_data.ehplmn.n_plmns += 1; + if ( PLMN_IS_VALID(user->usim_data.ehplmn[i]) ) { + user->emm_data->ehplmn.plmn[i] = user->usim_data.ehplmn[i]; + user->emm_data->ehplmn.n_plmns += 1; } } /* Get the list of User controlled PLMN Selector */ for (i=0; (i < EMM_DATA_PLMN_MAX) && (i < USIM_PLMN_MAX); i++) { - if ( PLMN_IS_VALID(_usim_data.plmn[i].plmn) ) { - _emm_data.plmn.plmn[i] = _usim_data.plmn[i].plmn; - _emm_data.userAcT[i] = _usim_data.plmn[i].AcT; - _emm_data.plmn.n_plmns += 1; + if ( PLMN_IS_VALID(user->usim_data.plmn[i].plmn) ) { + user->emm_data->plmn.plmn[i] = user->usim_data.plmn[i].plmn; + user->emm_data->userAcT[i] = user->usim_data.plmn[i].AcT; + user->emm_data->plmn.n_plmns += 1; } } /* Get the list of Operator controlled PLMN Selector */ for (i=0; (i < EMM_DATA_OPLMN_MAX) && (i < USIM_OPLMN_MAX); i++) { - if ( PLMN_IS_VALID(_usim_data.oplmn[i].plmn) ) { - _emm_data.oplmn.plmn[i] = _usim_data.oplmn[i].plmn; - _emm_data.operAcT[i] = _usim_data.oplmn[i].AcT; - _emm_data.oplmn.n_plmns += 1; + if ( PLMN_IS_VALID(user->usim_data.oplmn[i].plmn) ) { + user->emm_data->oplmn.plmn[i] = user->usim_data.oplmn[i].plmn; + user->emm_data->operAcT[i] = user->usim_data.oplmn[i].AcT; + user->emm_data->oplmn.n_plmns += 1; } } /* Get the list of Operator network name records */ for (i=0; (i < EMM_DATA_OPNN_MAX) && (i < USIM_OPL_MAX); i++) { - if ( PLMN_IS_VALID(_usim_data.opl[i].plmn) ) { - int pnn_id = _usim_data.opl[i].record_id; - _emm_data.opnn[i].plmn = &_usim_data.opl[i].plmn; - _emm_data.opnn[i].fullname = (char *)_usim_data.pnn[pnn_id].fullname.value; - _emm_data.opnn[i].shortname = (char *)_usim_data.pnn[pnn_id].shortname.value; - _emm_data.n_opnns += 1; + if ( PLMN_IS_VALID(user->usim_data.opl[i].plmn) ) { + int pnn_id = user->usim_data.opl[i].record_id; + user->emm_data->opnn[i].plmn = &user->usim_data.opl[i].plmn; + user->emm_data->opnn[i].fullname = (char *)user->usim_data.pnn[pnn_id].fullname.value; + user->emm_data->opnn[i].shortname = (char *)user->usim_data.pnn[pnn_id].shortname.value; + user->emm_data->n_opnns += 1; } } /* TODO: Get the Higher Priority PLMN search period parameter */ /* Get the EPS location information */ - if (PLMN_IS_VALID(_usim_data.epsloci.guti.gummei.plmn)) { - _emm_data.guti = &_usim_data.epsloci.guti; + if (PLMN_IS_VALID(user->usim_data.epsloci.guti.gummei.plmn)) { + user->emm_data->guti = &user->usim_data.epsloci.guti; } - if (TAI_IS_VALID(_usim_data.epsloci.tai)) { - _emm_data.tai = &_usim_data.epsloci.tai; + if (TAI_IS_VALID(user->usim_data.epsloci.tai)) { + user->emm_data->tai = &user->usim_data.epsloci.tai; } - _emm_data.status = _usim_data.epsloci.status; + user->emm_data->status = user->usim_data.epsloci.status; /* Get NAS configuration parameters */ - _emm_data.NAS_SignallingPriority = - _usim_data.nasconfig.NAS_SignallingPriority.value[0]; - _emm_data.NMO_I_Behaviour = _usim_data.nasconfig.NMO_I_Behaviour.value[0]; - _emm_data.AttachWithImsi = _usim_data.nasconfig.AttachWithImsi.value[0]; - _emm_data.MinimumPeriodicSearchTimer = - _usim_data.nasconfig.MinimumPeriodicSearchTimer.value[0]; - _emm_data.ExtendedAccessBarring = - _usim_data.nasconfig.ExtendedAccessBarring.value[0]; - _emm_data.Timer_T3245_Behaviour = - _usim_data.nasconfig.Timer_T3245_Behaviour.value[0]; + user->emm_data->NAS_SignallingPriority = + user->usim_data.nasconfig.NAS_SignallingPriority.value[0]; + user->emm_data->NMO_I_Behaviour = user->usim_data.nasconfig.NMO_I_Behaviour.value[0]; + user->emm_data->AttachWithImsi = user->usim_data.nasconfig.AttachWithImsi.value[0]; + user->emm_data->MinimumPeriodicSearchTimer = + user->usim_data.nasconfig.MinimumPeriodicSearchTimer.value[0]; + user->emm_data->ExtendedAccessBarring = + user->usim_data.nasconfig.ExtendedAccessBarring.value[0]; + user->emm_data->Timer_T3245_Behaviour = + user->usim_data.nasconfig.Timer_T3245_Behaviour.value[0]; /* * Get EPS NAS security context */ /* Create NAS security context */ - _emm_data.security = + user->emm_data->security = (emm_security_context_t *)malloc(sizeof(emm_security_context_t)); - if (_emm_data.security != NULL) { - memset(_emm_data.security, 0, sizeof(emm_security_context_t)); + if (user->emm_data->security != NULL) { + memset(user->emm_data->security, 0, sizeof(emm_security_context_t)); /* Type of security context */ - if (_usim_data.securityctx.KSIasme.value[0] != + if (user->usim_data.securityctx.KSIasme.value[0] != USIM_KSI_NOT_AVAILABLE) { - _emm_data.security->type = EMM_KSI_NATIVE; + user->emm_data->security->type = EMM_KSI_NATIVE; } else { - _emm_data.security->type = EMM_KSI_NOT_AVAILABLE; + user->emm_data->security->type = EMM_KSI_NOT_AVAILABLE; } /* EPS key set identifier */ - _emm_data.security->eksi = _usim_data.securityctx.KSIasme.value[0]; + user->emm_data->security->eksi = user->usim_data.securityctx.KSIasme.value[0]; /* ASME security key */ - _emm_data.security->kasme.length = - _usim_data.securityctx.Kasme.length; - _emm_data.security->kasme.value = - (uint8_t *)malloc(_emm_data.security->kasme.length); + user->emm_data->security->kasme.length = + user->usim_data.securityctx.Kasme.length; + user->emm_data->security->kasme.value = + (uint8_t *)malloc(user->emm_data->security->kasme.length); - if (_emm_data.security->kasme.value) { - memcpy(_emm_data.security->kasme.value, - _usim_data.securityctx.Kasme.value, - _emm_data.security->kasme.length); + if (user->emm_data->security->kasme.value) { + memcpy(user->emm_data->security->kasme.value, + user->usim_data.securityctx.Kasme.value, + user->emm_data->security->kasme.length); } /* Downlink count parameter */ - if (_usim_data.securityctx.dlNAScount.length <= sizeof(uint32_t)) { - memcpy(&_emm_data.security->dl_count, - _usim_data.securityctx.dlNAScount.value, - _usim_data.securityctx.dlNAScount.length); + if (user->usim_data.securityctx.dlNAScount.length <= sizeof(uint32_t)) { + memcpy(&user->emm_data->security->dl_count, + user->usim_data.securityctx.dlNAScount.value, + user->usim_data.securityctx.dlNAScount.length); } /* Uplink count parameter */ - if (_usim_data.securityctx.ulNAScount.length <= sizeof(uint32_t)) { - memcpy(&_emm_data.security->ul_count, - _usim_data.securityctx.ulNAScount.value, - _usim_data.securityctx.ulNAScount.length); + if (user->usim_data.securityctx.ulNAScount.length <= sizeof(uint32_t)) { + memcpy(&user->emm_data->security->ul_count, + user->usim_data.securityctx.ulNAScount.value, + user->usim_data.securityctx.ulNAScount.length); } /* Ciphering algorithm */ - _emm_data.security->capability.eps_encryption = - ((_usim_data.securityctx.algorithmID.value[0] >> 4) & 0xf); + user->emm_data->security->capability.eps_encryption = + ((user->usim_data.securityctx.algorithmID.value[0] >> 4) & 0xf); /* Identity protection algorithm */ - _emm_data.security->capability.eps_integrity = - (_usim_data.securityctx.algorithmID.value[0] & 0xf); + user->emm_data->security->capability.eps_integrity = + (user->usim_data.securityctx.algorithmID.value[0] & 0xf); /* NAS integrity and cyphering keys are not available */ } else { LOG_TRACE(WARNING, @@ -315,78 +388,65 @@ void emm_main_initialize(emm_indication_callback_t cb, const char *imei) /* * Get EMM data from the UE's non-volatile memory */ - memset(&_emm_data.nvdata.rplmn, 0xFF, sizeof(plmn_t)); - _emm_data.nvdata.eplmn.n_plmns = 0; - /* Get EMM data pathname */ - char *path = memory_get_path(EMM_NVRAM_DIRNAME, EMM_NVRAM_FILENAME); + memset(&user->emm_data->nvdata.rplmn, 0xFF, sizeof(plmn_t)); + user->emm_data->nvdata.eplmn.n_plmns = 0; - if (path == NULL) { - LOG_TRACE(ERROR, "EMM-MAIN - Failed to get EMM data pathname"); - } else { - /* Get EMM data stored in the non-volatile memory device */ - int rc = memory_read(path, &_emm_data.nvdata, sizeof(emm_nvdata_t)); + /* Get EMM data stored in the non-volatile memory device */ + int rc = memory_read(user->emm_nvdata_store, &user->emm_data->nvdata, sizeof(emm_nvdata_t)); - if (rc != RETURNok) { - LOG_TRACE(ERROR, "EMM-MAIN - Failed to read %s", path); - } else { - /* Check the IMSI */ - LOG_TRACE(INFO, "EMM-MAIN - EMM data successfully read"); - _emm_data.imsi = &_usim_data.imsi; - int imsi_ok = _emm_main_imsi_cmp(&_emm_data.nvdata.imsi, - &_usim_data.imsi); + if (rc != RETURNok) { + LOG_TRACE(ERROR, "EMM-MAIN - Failed to read %s", user->emm_nvdata_store); + exit(EXIT_FAILURE); + } - if (!imsi_ok) { - LOG_TRACE(WARNING, "EMM-MAIN - IMSI checking failed nvram: " - "%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x, " - "usim: %02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x", - _emm_data.nvdata.imsi.u.value[0], - _emm_data.nvdata.imsi.u.value[1], - _emm_data.nvdata.imsi.u.value[2], - _emm_data.nvdata.imsi.u.value[3], - _emm_data.nvdata.imsi.u.value[4], - _emm_data.nvdata.imsi.u.value[5], - _emm_data.nvdata.imsi.u.value[6], - _emm_data.nvdata.imsi.u.value[7], - _usim_data.imsi.u.value[0], - _usim_data.imsi.u.value[1], - _usim_data.imsi.u.value[2], - _usim_data.imsi.u.value[3], - _usim_data.imsi.u.value[4], - _usim_data.imsi.u.value[5], - _usim_data.imsi.u.value[6], - _usim_data.imsi.u.value[7]); - memset(&_emm_data.nvdata.rplmn, 0xFF, sizeof(plmn_t)); - _emm_data.nvdata.eplmn.n_plmns = 0; - } - } + /* Check the IMSI */ + LOG_TRACE(INFO, "EMM-MAIN - EMM data successfully read"); + user->emm_data->imsi = &user->usim_data.imsi; + int imsi_ok = _emm_main_imsi_cmp(&user->emm_data->nvdata.imsi, + &user->usim_data.imsi); - free(path); + if (!imsi_ok) { + LOG_TRACE(WARNING, "EMM-MAIN - IMSI checking failed nvram: " + "%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x, " + "usim: %02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x", + user->emm_data->nvdata.imsi.u.value[0], + user->emm_data->nvdata.imsi.u.value[1], + user->emm_data->nvdata.imsi.u.value[2], + user->emm_data->nvdata.imsi.u.value[3], + user->emm_data->nvdata.imsi.u.value[4], + user->emm_data->nvdata.imsi.u.value[5], + user->emm_data->nvdata.imsi.u.value[6], + user->emm_data->nvdata.imsi.u.value[7], + user->usim_data.imsi.u.value[0], + user->usim_data.imsi.u.value[1], + user->usim_data.imsi.u.value[2], + user->usim_data.imsi.u.value[3], + user->usim_data.imsi.u.value[4], + user->usim_data.imsi.u.value[5], + user->usim_data.imsi.u.value[6], + user->usim_data.imsi.u.value[7]); + memset(&user->emm_data->nvdata.rplmn, 0xFF, sizeof(plmn_t)); + user->emm_data->nvdata.eplmn.n_plmns = 0; } } /* * Initialize EMM timers */ - T3410.id = NAS_TIMER_INACTIVE_ID; - T3410.sec = T3410_DEFAULT_VALUE; - T3411.id = NAS_TIMER_INACTIVE_ID; - T3411.sec = T3411_DEFAULT_VALUE; - T3402.id = NAS_TIMER_INACTIVE_ID; - T3402.sec = T3402_DEFAULT_VALUE; - T3416.id = NAS_TIMER_INACTIVE_ID; - T3416.sec = T3416_DEFAULT_VALUE; - T3417.id = NAS_TIMER_INACTIVE_ID; - T3417.sec = T3417_DEFAULT_VALUE; - T3418.id = NAS_TIMER_INACTIVE_ID; - T3418.sec = T3418_DEFAULT_VALUE; - T3420.id = NAS_TIMER_INACTIVE_ID; - T3420.sec = T3420_DEFAULT_VALUE; - T3421.id = NAS_TIMER_INACTIVE_ID; - T3421.sec = T3421_DEFAULT_VALUE; - T3423.id = NAS_TIMER_INACTIVE_ID; - T3423.sec = T3423_DEFAULT_VALUE; - T3430.id = NAS_TIMER_INACTIVE_ID; - T3430.sec = T3430_DEFAULT_VALUE; + user->emm_data->emm_timers = calloc_or_fail(sizeof(emm_timers_t)); + _emm_timers_initialize(user->emm_data->emm_timers); + + /* + * Initialize Internal data used for detach procedure + */ + user->emm_data->emm_detach_data = calloc_or_fail(sizeof(emm_detach_data_t)); + _emm_detach_initialize(user->emm_data->emm_detach_data); + + /* + * Initialize Internal data used for attach procedure + */ + user->emm_data->emm_attach_data = calloc_or_fail(sizeof(emm_attach_data_t)); + _emm_attach_initialize(user->emm_data->emm_attach_data); /* * Initialize the user notification callback @@ -396,7 +456,7 @@ void emm_main_initialize(emm_indication_callback_t cb, const char *imei) /* * Initialize EMM internal data used for UE in idle mode */ - IdleMode_initialize(&_emm_main_callback); + IdleMode_initialize(user, &_emm_main_callback); LOG_FUNC_OUT; } @@ -416,56 +476,16 @@ void emm_main_initialize(emm_indication_callback_t cb, const char *imei) ** Others: None ** ** ** ***************************************************************************/ -void emm_main_cleanup(void) +void emm_main_cleanup(nas_user_t *user) { LOG_FUNC_IN; - if (_emm_data.usim_is_valid) { + emm_data_t *emm_data = user->emm_data; + + if (emm_data->usim_is_valid) { /* * TODO: Update USIM application data */ -#if 0 - int i; - - /* Update the list of Forbidden PLMNs */ - for (i=0; (i < _emm_data.fplmn.n_plmns) && (i < USIM_FPLMN_MAX); i++) { - _usim_data.fplmn[i] = _emm_data.fplmn.plmn[i]; - } - - /* Update the list of Equivalent HPLMNs */ - for (i=0; (i < _emm_data.ehplmn.n_plmns) && (i < USIM_EHPLMN_MAX); i++) { - _usim_data.ehplmn[i] = _emm_data.ehplmn.plmn[i]; - } - - /* Update the GUTI */ - if (_emm_data.guti) { - _usim_data.epsloci.guti = *(_emm_data.guti); - } - - /* Update the last visited registered TAI */ - if (_emm_data.tai) { - _usim_data.epsloci.tai = *(_emm_data.tai); - } - - /* Update the EPS location information */ - _usim_data.epsloci.status = _emm_data.status; - - if (_emm_data.security && (_emm_data.security->type == EMM_KSI_NATIVE)) { - /* TODO: Update the EPS security context parameters from the full - * native EPS security context */ - } - - /* - * Store USIM application data - * - List of forbidden PLMNs - */ - if ( usim_api_write(&_usim_data) != RETURNok ) { - /* The USIM application may not be present or not valid */ - LOG_TRACE(WARNING, "EMM-MAIN - " - "Failed to write USIM application data"); - } - -#endif } /* @@ -473,26 +493,20 @@ void emm_main_cleanup(void) * - Registered PLMN * - List of equivalent PLMNs */ - char *path = memory_get_path(EMM_NVRAM_DIRNAME, EMM_NVRAM_FILENAME); + int rc = memory_write(user->emm_nvdata_store, &emm_data->nvdata, sizeof(emm_nvdata_t)); - if (path == NULL) { - LOG_TRACE(ERROR, "EMM-MAIN - Failed to get EMM data pathname"); - } else { - int rc = memory_write(path, &_emm_data.nvdata, sizeof(emm_nvdata_t)); - - if (rc != RETURNok) { - LOG_TRACE(ERROR, "EMM-MAIN - Failed to write %s", path); - } + if (rc != RETURNok) { + LOG_TRACE(ERROR, "EMM-MAIN - Failed to write %s", user->emm_nvdata_store); } /* Release dynamically allocated memory */ - if (_emm_data.imei) { - free(_emm_data.imei); - _emm_data.imei = NULL; + if (emm_data->imei) { + free(emm_data->imei); + emm_data->imei = NULL; } - if (_emm_data.security) { - emm_security_context_t *security = _emm_data.security; + if (emm_data->security) { + emm_security_context_t *security = emm_data->security; if (security->kasme.value) { free(security->kasme.value); @@ -512,8 +526,8 @@ void emm_main_cleanup(void) security->knas_int.length = 0; } - free(_emm_data.security); - _emm_data.security = NULL; + free(emm_data->security); + emm_data->security = NULL; } LOG_FUNC_OUT; } @@ -525,17 +539,17 @@ void emm_main_cleanup(void) ** Description: Get the International Mobile Subscriber Identity number ** ** ** ** Inputs: None ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ** Outputs: None ** ** Return: Pointer to the IMSI ** ** Others: None ** ** ** ***************************************************************************/ -const imsi_t *emm_main_get_imsi(void) +const imsi_t *emm_main_get_imsi(emm_data_t *emm_data) { LOG_FUNC_IN; - LOG_FUNC_RETURN (&_emm_data.nvdata.imsi); + LOG_FUNC_RETURN (&emm_data->nvdata.imsi); } /**************************************************************************** @@ -545,17 +559,16 @@ const imsi_t *emm_main_get_imsi(void) ** Description: Get the Mobile Subscriber Dialing Number from the USIM ** ** ** ** Inputs: None ** - ** Others: _usim_data ** ** ** ** Outputs: None ** ** Return: Pointer to the subscriber dialing number ** ** Others: None ** ** ** ***************************************************************************/ -const msisdn_t *emm_main_get_msisdn(void) +const msisdn_t *emm_main_get_msisdn(nas_user_t *user) { LOG_FUNC_IN; - LOG_FUNC_RETURN (&_usim_data.msisdn.number); + LOG_FUNC_RETURN (&user->usim_data.msisdn.number); } /**************************************************************************** @@ -576,32 +589,34 @@ const msisdn_t *emm_main_get_msisdn(void) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ***************************************************************************/ -int emm_main_set_plmn_selection_mode(int mode, int format, +int emm_main_set_plmn_selection_mode(nas_user_t *user, int mode, int format, const network_plmn_t *plmn, int rat) { LOG_FUNC_IN; int index; + emm_data_t *emm_data = user->emm_data; + emm_plmn_list_t *emm_plmn_list = user->emm_plmn_list; LOG_TRACE(INFO, "EMM-MAIN - PLMN selection: mode=%d, format=%d, plmn=%s, " "rat=%d", mode, format, (const char *)&plmn->id, rat); - _emm_data.plmn_mode = mode; + emm_data->plmn_mode = mode; if (mode != EMM_DATA_PLMN_AUTO) { /* Get the index of the PLMN in the list of available PLMNs */ - index = _emm_main_get_plmn_index((const char *)&plmn->id, format); + index = _emm_main_get_plmn_index(emm_plmn_list, (const char *)&plmn->id, format); if (index < 0) { LOG_TRACE(WARNING, "EMM-MAIN - PLMN %s not available", (const char *)&plmn->id); } else { /* Update the manually selected network selection data */ - _emm_data.plmn_index = index; - _emm_data.plmn_rat = rat; + emm_data->plmn_index = index; + emm_data->plmn_rat = rat; } } else { /* @@ -609,7 +624,7 @@ int emm_main_set_plmn_selection_mode(int mode, int format, * register to when switched on; the equivalent PLMNs list shall not be * applied to the user reselection in Automatic Network Selection Mode. */ - index = IdleMode_get_hplmn_index(); + index = IdleMode_get_hplmn_index(emm_plmn_list); } LOG_FUNC_RETURN (index); @@ -623,17 +638,17 @@ int emm_main_set_plmn_selection_mode(int mode, int format, ** operation ** ** ** ** Inputs: None ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ** Outputs: None ** ** Return: The value of the network selection mode ** ** Others: None ** ** ** ***************************************************************************/ -int emm_main_get_plmn_selection_mode(void) +int emm_main_get_plmn_selection_mode(emm_data_t *emm_data) { LOG_FUNC_IN; - LOG_FUNC_RETURN (_emm_data.plmn_mode); + LOG_FUNC_RETURN (emm_data->plmn_mode); } /**************************************************************************** @@ -643,19 +658,19 @@ int emm_main_get_plmn_selection_mode(void) ** Description: Get the list of available PLMNs ** ** ** ** Inputs: None ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ** Outputs: plist: Pointer to the list of available PLMNs ** ** Return: The size of the list in bytes ** ** Others: None ** ** ** ***************************************************************************/ -int emm_main_get_plmn_list(const char **plist) +int emm_main_get_plmn_list(emm_plmn_list_t *emm_plmn_list, emm_data_t *emm_data, const char **plist) { LOG_FUNC_IN; - int size = IdleMode_update_plmn_list(0); - *plist = _emm_data.plist.buffer; + int size = IdleMode_update_plmn_list(emm_plmn_list, emm_data, 0); + *plist = emm_data->plist.buffer; LOG_FUNC_RETURN (size); } @@ -668,7 +683,6 @@ int emm_main_get_plmn_list(const char **plist) ** ** ** Inputs: format: The requested format of the string repre- ** ** sentation of the PLMN identifier ** - ** Others: _emm_data ** ** ** ** Outputs: plmn: The selected PLMN identifier coded in the ** ** requested format ** @@ -677,7 +691,7 @@ int emm_main_get_plmn_list(const char **plist) ** Others: None ** ** ** ***************************************************************************/ -const char *emm_main_get_selected_plmn(network_plmn_t *plmn, int format) +const char *emm_main_get_selected_plmn(emm_plmn_list_t *emm_plmn_list, emm_data_t *emm_data, network_plmn_t *plmn, int format) { LOG_FUNC_IN; @@ -685,10 +699,10 @@ const char *emm_main_get_selected_plmn(network_plmn_t *plmn, int format) /* * Get the identifier of the selected PLMN in the list of available PLMNs */ - int index = IdleMode_get_splmn_index(); + int index = IdleMode_get_splmn_index(emm_plmn_list); if ( !(index < 0) ) { - const char *name = _emm_main_get_plmn(&_emm_data.splmn, index, + const char *name = _emm_main_get_plmn(emm_plmn_list, &emm_data->splmn, index, format, &size); if (size > 0) { @@ -707,7 +721,6 @@ const char *emm_main_get_selected_plmn(network_plmn_t *plmn, int format) ** ** ** Inputs: format: The requested format of the string repre- ** ** sentation of the PLMN identifier ** - ** Others: _emm_data ** ** ** ** Outputs: plmn: The registered PLMN identifier coded in ** ** the requested format ** @@ -716,7 +729,7 @@ const char *emm_main_get_selected_plmn(network_plmn_t *plmn, int format) ** Others: None ** ** ** ***************************************************************************/ -const char *emm_main_get_registered_plmn(network_plmn_t *plmn, int format) +const char *emm_main_get_registered_plmn(emm_plmn_list_t *emm_plmn_list, emm_data_t *emm_data, network_plmn_t *plmn, int format) { LOG_FUNC_IN; @@ -725,10 +738,10 @@ const char *emm_main_get_registered_plmn(network_plmn_t *plmn, int format) /* * Get the identifier of the registered PLMN in the list of available PLMNs */ - int index = IdleMode_get_rplmn_index(); + int index = IdleMode_get_rplmn_index(emm_plmn_list); if ( !(index < 0) ) { - const char *name = _emm_main_get_plmn(&_emm_data.nvdata.rplmn, + const char *name = _emm_main_get_plmn(emm_plmn_list, &emm_data->nvdata.rplmn, index, format, &size); if (size > 0) { @@ -748,17 +761,16 @@ const char *emm_main_get_registered_plmn(network_plmn_t *plmn, int format) ** registration of the UE ** ** ** ** Inputs: None ** - ** Others: _emm_data ** ** ** ** Outputs: None ** ** Return: The current network registration status ** ** Others: None ** ** ** ***************************************************************************/ -Stat_t emm_main_get_plmn_status(void) +Stat_t emm_main_get_plmn_status(emm_data_t *emm_data) { LOG_FUNC_IN; - LOG_FUNC_RETURN (_emm_data.stat); + LOG_FUNC_RETURN (emm_data->stat); } /**************************************************************************** @@ -769,17 +781,16 @@ Stat_t emm_main_get_plmn_status(void) ** belongs to ** ** ** ** Inputs: None ** - ** Others: _emm_data ** ** ** ** Outputs: None ** ** Return: The Location/Tracking area code ** ** Others: None ** ** ** ***************************************************************************/ -tac_t emm_main_get_plmn_tac(void) +tac_t emm_main_get_plmn_tac(emm_data_t *emm_data) { LOG_FUNC_IN; - LOG_FUNC_RETURN (_emm_data.tac); + LOG_FUNC_RETURN (emm_data->tac); } /**************************************************************************** @@ -789,17 +800,16 @@ tac_t emm_main_get_plmn_tac(void) ** Description: Get the identifier of the serving cell ** ** ** ** Inputs: None ** - ** Others: _emm_data ** ** ** ** Outputs: None ** ** Return: The serving cell identifier ** ** Others: None ** ** ** ***************************************************************************/ -ci_t emm_main_get_plmn_ci(void) +ci_t emm_main_get_plmn_ci(emm_data_t *emm_data) { LOG_FUNC_IN; - LOG_FUNC_RETURN (_emm_data.ci); + LOG_FUNC_RETURN (emm_data->ci); } /**************************************************************************** @@ -810,7 +820,6 @@ ci_t emm_main_get_plmn_ci(void) ** ving cell ** ** ** ** Inputs: None ** - ** Others: _emm_data ** ** ** ** Outputs: None ** ** Return: The value of the Radio Access Technology ** @@ -818,10 +827,10 @@ ci_t emm_main_get_plmn_ci(void) ** Others: None ** ** ** ***************************************************************************/ -AcT_t emm_main_get_plmn_rat(void) +AcT_t emm_main_get_plmn_rat(emm_data_t *emm_data) { LOG_FUNC_IN; - LOG_FUNC_RETURN (_emm_data.rat); + LOG_FUNC_RETURN (emm_data->rat); } /**************************************************************************** @@ -832,7 +841,7 @@ AcT_t emm_main_get_plmn_rat(void) ** network for EPS services or emergency service only ** ** ** ** Inputs: None ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ** Outputs: None ** ** Return: TRUE if the UE is currently attached to ** @@ -840,10 +849,10 @@ AcT_t emm_main_get_plmn_rat(void) ** Others: None ** ** ** ***************************************************************************/ -int emm_main_is_attached(void) +int emm_main_is_attached(emm_data_t *emm_data) { LOG_FUNC_IN; - LOG_FUNC_RETURN (_emm_data.is_attached); + LOG_FUNC_RETURN (emm_data->is_attached); } /**************************************************************************** @@ -854,7 +863,7 @@ int emm_main_is_attached(void) ** network for emergency bearer services ** ** ** ** Inputs: None ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ** Outputs: None ** ** Return: TRUE if the UE is currently attached or is ** @@ -863,10 +872,10 @@ int emm_main_is_attached(void) ** Others: None ** ** ** ***************************************************************************/ -int emm_main_is_emergency(void) +int emm_main_is_emergency(emm_data_t *emm_data) { LOG_FUNC_IN; - LOG_FUNC_RETURN (_emm_data.is_attached && _emm_data.is_emergency); + LOG_FUNC_RETURN (emm_data->is_attached && emm_data->is_emergency); } /****************************************************************************/ @@ -885,21 +894,21 @@ int emm_main_is_emergency(void) ** present in the network. The list has to be ** ** displayed to the user application when ** ** size > 0. ** - ** Others: _emm_data ** + ** Others: user->emm_data-> ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** ** Others: None ** ** ** ***************************************************************************/ -static int _emm_main_callback(int size) +static int _emm_main_callback(user_api_id_t *user_api_id, emm_data_t *emm_data, int size) { LOG_FUNC_IN; /* Forward the notification to the user API */ - int rc = (*_emm_main_user_callback)(_emm_data.stat, _emm_data.tac, - _emm_data.ci, _emm_data.rat, - _emm_data.plist.buffer, size); + int rc = (*_emm_main_user_callback)(user_api_id, emm_data->stat, emm_data->tac, + emm_data->ci, emm_data->rat, + emm_data->plist.buffer, size); LOG_FUNC_RETURN (rc); } @@ -924,7 +933,7 @@ static int _emm_main_get_imei(imei_t *imei, const char *imei_str) int len = strlen(imei_str); if (len % 2) { - imei->u.num.parity = ODD_PARITY; + imei->u.num.parity = IMEI_ODD_PARITY; } else { imei->u.num.parity = EVEN_PARITY; } @@ -999,24 +1008,24 @@ static int _emm_main_imsi_cmp(imsi_t *imsi1, imsi_t *imsi2) ** Others: None ** ** ** ***************************************************************************/ -static const char *_emm_main_get_plmn(const plmn_t *plmn, int index, +static const char *_emm_main_get_plmn(emm_plmn_list_t *emm_plmn_list, const plmn_t *plmn, int index, int format, size_t *size) { if ( PLMN_IS_VALID(*plmn) ) { switch (format) { case NET_FORMAT_LONG: /* Get the long alpha-numeric representation of the PLMN */ - return IdleMode_get_plmn_fullname(plmn, index, size); + return IdleMode_get_plmn_fullname(emm_plmn_list, plmn, index, size); break; case NET_FORMAT_SHORT: /* Get the short alpha-numeric representation of the PLMN */ - return IdleMode_get_plmn_shortname(plmn, index, size); + return IdleMode_get_plmn_shortname(emm_plmn_list, plmn, index, size); break; case NET_FORMAT_NUM: /* Get the numeric representation of the PLMN */ - return IdleMode_get_plmn_id(plmn, index, size); + return IdleMode_get_plmn_id(emm_plmn_list, plmn, index, size); break; default: @@ -1049,24 +1058,24 @@ static const char *_emm_main_get_plmn(const plmn_t *plmn, int index, ** Others: None ** ** ** ***************************************************************************/ -static int _emm_main_get_plmn_index(const char *plmn, int format) +static int _emm_main_get_plmn_index(emm_plmn_list_t *emm_plmn_list, const char *plmn, int format) { int index = -1; switch (format) { case NET_FORMAT_LONG: /* Get the index of the long alpha-numeric PLMN identifier */ - index = IdleMode_get_plmn_fullname_index(plmn); + index = IdleMode_get_plmn_fullname_index(emm_plmn_list, plmn); break; case NET_FORMAT_SHORT: /* Get the index of the short alpha-numeric PLMN identifier */ - index = IdleMode_get_plmn_shortname_index(plmn); + index = IdleMode_get_plmn_shortname_index(emm_plmn_list, plmn); break; case NET_FORMAT_NUM: /* Get the index of the numeric PLMN identifier */ - index = IdleMode_get_plmn_id_index(plmn); + index = IdleMode_get_plmn_id_index(emm_plmn_list, plmn); break; default: diff --git a/openair3/NAS/UE/EMM/emm_main.h b/openair3/NAS/UE/EMM/emm_main.h old mode 100755 new mode 100644 index b985f806a5..055127b15d --- a/openair3/NAS/UE/EMM/emm_main.h +++ b/openair3/NAS/UE/EMM/emm_main.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_main.h @@ -48,6 +41,7 @@ Description Defines the EPS Mobility Management procedure call manager, #include "commonDef.h" #include "networkDef.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -57,6 +51,15 @@ Description Defines the EPS Mobility Management procedure call manager, /************************ G L O B A L T Y P E S ************************/ /****************************************************************************/ +/* + * User notification callback, executed whenever a change of data with + * respect of network information (e.g. network registration and/or + * location change, new PLMN becomes available) is notified by the + * EPS Mobility Management sublayer + */ +typedef int (*emm_indication_callback_t) (user_api_id_t *user_api_id, Stat_t, tac_t, ci_t, AcT_t, + const char*, size_t); + /****************************************************************************/ /******************** G L O B A L V A R I A B L E S ********************/ /****************************************************************************/ @@ -65,34 +68,34 @@ Description Defines the EPS Mobility Management procedure call manager, /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -void emm_main_initialize(emm_indication_callback_t cb, const char *imei); +void emm_main_initialize(nas_user_t *user, emm_indication_callback_t cb, const char *imei); -void emm_main_cleanup(void); +void emm_main_cleanup(nas_user_t *user); /* User's getter of UE's identity */ -const imsi_t *emm_main_get_imsi(void); +const imsi_t *emm_main_get_imsi(emm_data_t *emm_data); /* User's getter of the subscriber dialing number */ -const msisdn_t *emm_main_get_msisdn(void); +const msisdn_t *emm_main_get_msisdn(nas_user_t *user); /* User's getter/setter for network selection */ -int emm_main_set_plmn_selection_mode(int mode, int format, +int emm_main_set_plmn_selection_mode(nas_user_t *user, int mode, int format, const network_plmn_t *plmn, int rat); -int emm_main_get_plmn_selection_mode(void); -int emm_main_get_plmn_list(const char **plist); -const char *emm_main_get_selected_plmn(network_plmn_t *plmn, int format); +int emm_main_get_plmn_selection_mode(emm_data_t *emm_data); +int emm_main_get_plmn_list(emm_plmn_list_t *emm_plmn_list, emm_data_t *emm_data, const char **plist); +const char *emm_main_get_selected_plmn(emm_plmn_list_t *emm_plmn_list, emm_data_t *emm_data, network_plmn_t *plmn, int format); /* User's getter for network registration */ -Stat_t emm_main_get_plmn_status(void); -tac_t emm_main_get_plmn_tac(void); -ci_t emm_main_get_plmn_ci(void); -AcT_t emm_main_get_plmn_rat(void); -const char *emm_main_get_registered_plmn(network_plmn_t *plmn, int format); +Stat_t emm_main_get_plmn_status(emm_data_t *emm_data); +tac_t emm_main_get_plmn_tac(emm_data_t *emm_data); +ci_t emm_main_get_plmn_ci(emm_data_t *emm_data); +AcT_t emm_main_get_plmn_rat(emm_data_t *emm_data); +const char *emm_main_get_registered_plmn(emm_plmn_list_t *emm_plmn_list, emm_data_t *emm_data, network_plmn_t *plmn, int format); /* User's getter for network attachment */ -int emm_main_is_attached(void); -int emm_main_is_emergency(void); +int emm_main_is_attached(emm_data_t *emm_data); +int emm_main_is_emergency(emm_data_t *emm_data); #endif /* __EMM_MAIN_H__*/ diff --git a/openair3/NAS/UE/EMM/emm_proc.h b/openair3/NAS/UE/EMM/emm_proc.h old mode 100755 new mode 100644 index 65ebe4e8e2..7d4024d9d6 --- a/openair3/NAS/UE/EMM/emm_proc.h +++ b/openair3/NAS/UE/EMM/emm_proc.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source emm_proc.h @@ -49,38 +42,12 @@ Description Defines the EPS Mobility Management procedures executed at #include "commonDef.h" #include "OctetString.h" #include "LowerLayer.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ /****************************************************************************/ -/* Type of network attachment */ -typedef enum { - EMM_ATTACH_TYPE_EPS = 0, - EMM_ATTACH_TYPE_IMSI, - EMM_ATTACH_TYPE_EMERGENCY, - EMM_ATTACH_TYPE_RESERVED, -} emm_proc_attach_type_t; - -/* Type of network detach */ -typedef enum { - EMM_DETACH_TYPE_EPS = 0, - EMM_DETACH_TYPE_IMSI, - EMM_DETACH_TYPE_EPS_IMSI, - EMM_DETACH_TYPE_REATTACH, - EMM_DETACH_TYPE_NOT_REATTACH, - EMM_DETACH_TYPE_RESERVED, -} emm_proc_detach_type_t; - -/* Type of requested identity */ -typedef enum { - EMM_IDENT_TYPE_NOT_AVAILABLE = 0, - EMM_IDENT_TYPE_IMSI, - EMM_IDENT_TYPE_IMEI, - EMM_IDENT_TYPE_IMEISV, - EMM_IDENT_TYPE_TMSI -} emm_proc_identity_type_t; - /****************************************************************************/ /************************ G L O B A L T Y P E S ************************/ /****************************************************************************/ @@ -99,48 +66,35 @@ typedef enum { *--------------------------------------------------------------------------- */ int emm_proc_status_ind(unsigned int ueid, int emm_cause); -int emm_proc_status(unsigned int ueid, int emm_cause); - -/* - *--------------------------------------------------------------------------- - * Lower layer procedure - *--------------------------------------------------------------------------- - */ -int emm_proc_lowerlayer_initialize(lowerlayer_success_callback_t success, - lowerlayer_failure_callback_t failure, - lowerlayer_release_callback_t release, - void *args); -int emm_proc_lowerlayer_success(void); -int emm_proc_lowerlayer_failure(int is_initial); -int emm_proc_lowerlayer_release(void); +int emm_proc_status(nas_user_t *user, int emm_cause); /* *--------------------------------------------------------------------------- * UE's Idle mode procedure *--------------------------------------------------------------------------- */ -int emm_proc_initialize(void); -int emm_proc_plmn_selection(int index); -int emm_proc_plmn_selection_end(int found, tac_t tac, ci_t ci, AcT_t rat); +int emm_proc_initialize(nas_user_t *user); +int emm_proc_plmn_selection(nas_user_t *user, int index); +int emm_proc_plmn_selection_end(nas_user_t *user, int found, tac_t tac, ci_t ci, AcT_t rat); /* * -------------------------------------------------------------------------- * Attach procedure * -------------------------------------------------------------------------- */ -int emm_proc_attach(emm_proc_attach_type_t type); +int emm_proc_attach(nas_user_t *user, emm_proc_attach_type_t type); int emm_proc_attach_request(void *args); -int emm_proc_attach_accept(long T3412, long T3402, long T3423, int n_tais, +int emm_proc_attach_accept(nas_user_t *user, long T3412, long T3402, long T3423, int n_tais, tai_t *tai, GUTI_t *guti, int n_eplmns, plmn_t *eplmn, const OctetString *esm_msg); -int emm_proc_attach_reject(int emm_cause, const OctetString *esm_msg); +int emm_proc_attach_reject(nas_user_t *user, int emm_cause, const OctetString *esm_msg); int emm_proc_attach_complete(void *args); int emm_proc_attach_failure(int is_initial, void *args); int emm_proc_attach_release(void *args); -int emm_proc_attach_restart(void); +int emm_proc_attach_restart(nas_user_t *user); -int emm_proc_attach_set_emergency(void); -int emm_proc_attach_set_detach(void); +int emm_proc_attach_set_emergency(emm_data_t *emm_data); +int emm_proc_attach_set_detach(void *user); @@ -149,9 +103,9 @@ int emm_proc_attach_set_detach(void); * Detach procedure * -------------------------------------------------------------------------- */ -int emm_proc_detach(emm_proc_detach_type_t type, int switch_off); +int emm_proc_detach(nas_user_t *user, emm_proc_detach_type_t type, int switch_off); int emm_proc_detach_request(void *args); -int emm_proc_detach_accept(void); +int emm_proc_detach_accept(void *args); int emm_proc_detach_failure(int is_initial, void *args); int emm_proc_detach_release(void *args); @@ -161,7 +115,7 @@ int emm_proc_detach_release(void *args); * Identification procedure * -------------------------------------------------------------------------- */ -int emm_proc_identification_request(emm_proc_identity_type_t type); +int emm_proc_identification_request(nas_user_t *user, emm_proc_identity_type_t type); /* @@ -169,10 +123,10 @@ int emm_proc_identification_request(emm_proc_identity_type_t type); * Authentication procedure * -------------------------------------------------------------------------- */ -int emm_proc_authentication_request(int native_ksi, int ksi, +int emm_proc_authentication_request(nas_user_t *user, int native_ksi, int ksi, const OctetString *rand, const OctetString *autn); -int emm_proc_authentication_reject(void); -int emm_proc_authentication_delete(void); +int emm_proc_authentication_reject(nas_user_t *user); +int emm_proc_authentication_delete(nas_user_t *user); /* @@ -180,16 +134,16 @@ int emm_proc_authentication_delete(void); * Security mode control procedure * -------------------------------------------------------------------------- */ -int emm_proc_security_mode_command(int native_ksi, int ksi, int seea, int seia, - int reea, int reia); +int emm_proc_security_mode_command(nas_user_t *user, int native_ksi, int ksi, int seea, int seia, + int reea, int reia, int imeisv_request); /* *--------------------------------------------------------------------------- * Network indication handlers *--------------------------------------------------------------------------- */ -int emm_proc_registration_notify(Stat_t status); -int emm_proc_location_notify(tac_t tac, ci_t ci, AcT_t rat); -int emm_proc_network_notify(int index); +int emm_proc_registration_notify(user_api_id_t *user_api_id, emm_data_t *emm_data, Stat_t status); +int emm_proc_location_notify(user_api_id_t *user_api_id, emm_data_t *emm_data, tac_t tac, ci_t ci, AcT_t rat); +int emm_proc_network_notify(emm_plmn_list_t *emm_plmn_list, user_api_id_t *user_api_id, emm_data_t *emm_data, int index); #endif /* __EMM_PROC_H__*/ diff --git a/openair3/NAS/UE/EMM/emm_proc_defs.h b/openair3/NAS/UE/EMM/emm_proc_defs.h new file mode 100644 index 0000000000..3779626ac0 --- /dev/null +++ b/openair3/NAS/UE/EMM/emm_proc_defs.h @@ -0,0 +1,31 @@ +#ifndef _EMM_PROC_DEFS_H +#define _EMM_PROC_DEFS_H + +/* Type of network attachment */ +typedef enum { + EMM_ATTACH_TYPE_EPS = 0, + EMM_ATTACH_TYPE_IMSI, + EMM_ATTACH_TYPE_EMERGENCY, + EMM_ATTACH_TYPE_RESERVED, +} emm_proc_attach_type_t; + +/* Type of network detach */ +typedef enum { + EMM_DETACH_TYPE_EPS = 0, + EMM_DETACH_TYPE_IMSI, + EMM_DETACH_TYPE_EPS_IMSI, + EMM_DETACH_TYPE_REATTACH, + EMM_DETACH_TYPE_NOT_REATTACH, + EMM_DETACH_TYPE_RESERVED, +} emm_proc_detach_type_t; + +/* Type of requested identity */ +typedef enum { + EMM_IDENT_TYPE_NOT_AVAILABLE = 0, + EMM_IDENT_TYPE_IMSI, + EMM_IDENT_TYPE_IMEI, + EMM_IDENT_TYPE_IMEISV, + EMM_IDENT_TYPE_TMSI +} emm_proc_identity_type_t; + +#endif diff --git a/openair3/NAS/UE/EMM/emm_timers.h b/openair3/NAS/UE/EMM/emm_timers.h new file mode 100644 index 0000000000..abf7c9ff87 --- /dev/null +++ b/openair3/NAS/UE/EMM/emm_timers.h @@ -0,0 +1,14 @@ +#ifndef EMM_TIMERS_H +#define EMM_TIMERS_H + +/* + * Retransmission timer handlers + */ + +void *emm_attach_t3410_handler(void *); +void *emm_service_t3417_handler(void *); +void *emm_detach_t3421_handler(void *); +void *emm_tau_t3430_handler(void *); + + +#endif diff --git a/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c b/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c old mode 100755 new mode 100644 index 6a9e140ad4..21c3da3f19 --- a/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c +++ b/openair3/NAS/UE/ESM/DedicatedEpsBearerContextActivation.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source DedicatedEpsBearerContextActivation.c @@ -111,20 +104,20 @@ Description Defines the dedicated EPS bearer context activation ESM ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_dedicated_eps_bearer_context_request(int ebi, int default_ebi, +int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int default_ebi, const esm_proc_qos_t *qos, const esm_proc_tft_t *tft, int *esm_cause) { LOG_FUNC_IN; - + esm_data_t *esm_data = user->esm_data; int rc = RETURNerror; LOG_TRACE(INFO, "ESM-PROC - Dedicated EPS bearer context activation " "requested by the network (ebi=%d)", ebi); /* Get the PDN connection the dedicated EPS bearer is linked to */ - int pid = esm_ebr_context_get_pid(default_ebi); + int pid = esm_ebr_context_get_pid(esm_data, default_ebi); if (pid < 0) { /* 3GPP TS 24.301, section 6.4.2.5, abnormal case c @@ -138,7 +131,7 @@ int esm_proc_dedicated_eps_bearer_context_request(int ebi, int default_ebi, } /* Assign dedicated EPS bearer context */ - int new_ebi = esm_ebr_assign(ebi, pid+1, FALSE); + int new_ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, FALSE); if (new_ebi == ESM_EBI_UNASSIGNED) { /* 3GPP TS 24.301, section 6.4.2.5, abnormal cases a and b @@ -148,7 +141,7 @@ int esm_proc_dedicated_eps_bearer_context_request(int ebi, int default_ebi, int old_pid, old_bid; /* Locally deactivate the existing EPS bearer context and proceed * with the requested dedicated EPS bearer context activation */ - rc = esm_proc_eps_bearer_context_deactivate(TRUE, ebi, + rc = esm_proc_eps_bearer_context_deactivate(user, TRUE, ebi, &old_pid, &old_bid); if (rc != RETURNok) { @@ -156,13 +149,13 @@ int esm_proc_dedicated_eps_bearer_context_request(int ebi, int default_ebi, *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; } else { /* Assign new dedicated EPS bearer context */ - ebi = esm_ebr_assign(ebi, pid+1, FALSE); + ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, FALSE); } } if (ebi != ESM_EBI_UNASSIGNED) { /* Check syntactical errors in packet filters */ - rc = esm_ebr_context_check_tft(pid, ebi, tft, + rc = esm_ebr_context_check_tft(esm_data, pid, ebi, tft, ESM_EBR_CONTEXT_TFT_CREATE); if (rc != RETURNok) { @@ -172,7 +165,7 @@ int esm_proc_dedicated_eps_bearer_context_request(int ebi, int default_ebi, *esm_cause = ESM_CAUSE_SYNTACTICAL_ERROR_IN_PACKET_FILTER; } else { /* Create new dedicated EPS bearer context */ - default_ebi = esm_ebr_context_create(pid, ebi, FALSE, qos, tft); + default_ebi = esm_ebr_context_create(esm_data, user->ueid, pid, ebi, FALSE, qos, tft); if (default_ebi != ESM_EBI_UNASSIGNED) { /* Dedicated EPS bearer contextx successfully created */ @@ -213,12 +206,14 @@ int esm_proc_dedicated_eps_bearer_context_request(int ebi, int default_ebi, ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_dedicated_eps_bearer_context_accept(int is_standalone, int ebi, +int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi, OctetString *msg, int ue_triggered) { LOG_FUNC_IN; int rc; + esm_ebr_data_t *esm_ebr_data = user->esm_ebr_data; + user_api_id_t *user_api_id = user->user_api_id; LOG_TRACE(INFO,"ESM-PROC - Dedicated EPS bearer context activation " "accepted by the UE (ebi=%d)", ebi); @@ -229,14 +224,14 @@ int esm_proc_dedicated_eps_bearer_context_accept(int is_standalone, int ebi, * Notity EMM that ESM PDU has to be forwarded to lower layers */ emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = 0; + emm_sap.u.emm_esm.ueid = user->ueid; emm_esm->msg.length = msg->length; emm_esm->msg.value = msg->value; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { /* Set the EPS bearer context state to ACTIVE */ - rc = esm_ebr_set_status(ebi, ESM_EBR_ACTIVE, ue_triggered); + rc = esm_ebr_set_status(user_api_id, esm_ebr_data, ebi, ESM_EBR_ACTIVE, ue_triggered); if (rc != RETURNok) { /* The EPS bearer context was already in ACTIVE state */ @@ -273,7 +268,7 @@ int esm_proc_dedicated_eps_bearer_context_accept(int is_standalone, int ebi, ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_dedicated_eps_bearer_context_reject(int is_standalone, int ebi, +int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi, OctetString *msg, int ue_triggered) { LOG_FUNC_IN; @@ -283,9 +278,9 @@ int esm_proc_dedicated_eps_bearer_context_reject(int is_standalone, int ebi, LOG_TRACE(WARNING, "ESM-PROC - Dedicated EPS bearer context activation " "not accepted by the UE (ebi=%d)", ebi); - if ( !esm_ebr_is_not_in_use(ebi) ) { + if ( !esm_ebr_is_not_in_use(user->esm_ebr_data, ebi) ) { /* Release EPS bearer data currently in use */ - rc = esm_ebr_release(ebi); + rc = esm_ebr_release(user->esm_ebr_data, ebi); } if (rc != RETURNok) { @@ -297,10 +292,10 @@ int esm_proc_dedicated_eps_bearer_context_reject(int is_standalone, int ebi, * Notity EMM that ESM PDU has to be forwarded to lower layers */ emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = 0; + emm_sap.u.emm_esm.ueid = user->ueid; emm_esm->msg.length = msg->length; emm_esm->msg.value = msg->value; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } LOG_FUNC_RETURN (rc); diff --git a/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c b/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c old mode 100755 new mode 100644 index 1884590437..7c528d7569 --- a/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c +++ b/openair3/NAS/UE/ESM/DefaultEpsBearerContextActivation.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source DefaultEpsBearerContextActivation.c @@ -70,19 +63,6 @@ Description Defines the default EPS bearer context activation ESM /******************* L O C A L D E F I N I T I O N S *******************/ /****************************************************************************/ -/* - * -------------------------------------------------------------------------- - * Internal data handled by the default EPS bearer context activation - * procedure in the UE - * -------------------------------------------------------------------------- - */ -static struct { - int ebi; /* EPS bearer identity of the default EPS bearer associated - * to the PDN connection to be activated */ -} _default_eps_bearer_context_data = {ESM_EBI_UNASSIGNED}; - - - /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ @@ -108,22 +88,22 @@ static struct { ** Outputs: esm_cause: Cause code returned upon ESM procedure ** ** failure ** ** Return: RETURNok, RETURNerror ** - ** Others: _default_eps_bearer_context_data ** ** ** ***************************************************************************/ -int esm_proc_default_eps_bearer_context_request(int pid, int ebi, +int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int ebi, const esm_proc_qos_t *qos, int *esm_cause) { LOG_FUNC_IN; - + esm_data_t *esm_data = user->esm_data; + default_eps_bearer_context_data_t *default_eps_bearer_context_data = user->default_eps_bearer_context_data; int rc = RETURNerror; LOG_TRACE(INFO, "ESM-PROC - Default EPS bearer context activation " "requested by the network (ebi=%d)", ebi); /* Assign default EPS bearer context */ - int new_ebi = esm_ebr_assign(ebi, pid+1, TRUE); + int new_ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, TRUE); if (new_ebi == ESM_EBI_UNASSIGNED) { /* 3GPP TS 24.301, section 6.4.1.5, abnormal cases a and b @@ -133,7 +113,7 @@ int esm_proc_default_eps_bearer_context_request(int pid, int ebi, int old_pid, old_bid; /* Locally deactivate the existing EPS bearer context and proceed * with the requested default EPS bearer context activation */ - rc = esm_proc_eps_bearer_context_deactivate(TRUE, ebi, + rc = esm_proc_eps_bearer_context_deactivate(user, TRUE, ebi, &old_pid, &old_bid); if (rc != RETURNok) { @@ -141,17 +121,17 @@ int esm_proc_default_eps_bearer_context_request(int pid, int ebi, *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; } else { /* Assign new default EPS bearer context */ - ebi = esm_ebr_assign(ebi, pid+1, TRUE); + ebi = esm_ebr_assign(user->esm_ebr_data, ebi, pid+1, TRUE); } } if (ebi != ESM_EBI_UNASSIGNED) { /* Create new default EPS bearer context */ - ebi = esm_ebr_context_create(pid, ebi, TRUE, qos, NULL); + ebi = esm_ebr_context_create(esm_data, user->ueid, pid, ebi, TRUE, qos, NULL); if (ebi != ESM_EBI_UNASSIGNED) { /* Default EPS bearer contextx successfully created */ - _default_eps_bearer_context_data.ebi = ebi; + default_eps_bearer_context_data->ebi = ebi; rc = RETURNok; } else { /* No resource available */ @@ -195,12 +175,14 @@ int esm_proc_default_eps_bearer_context_request(int pid, int ebi, ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_default_eps_bearer_context_accept(int is_standalone, int ebi, +int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi, OctetString *msg, int ue_triggered) { LOG_FUNC_IN; int rc = RETURNok; + esm_ebr_data_t *esm_ebr_data = user->esm_ebr_data; + user_api_id_t *user_api_id = user->user_api_id; LOG_TRACE(INFO,"ESM-PROC - Default EPS bearer context activation " "accepted by the UE (ebi=%d)", ebi); @@ -212,15 +194,15 @@ int esm_proc_default_eps_bearer_context_accept(int is_standalone, int ebi, * Notity EMM that ESM PDU has to be forwarded to lower layers */ emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = 0; + emm_sap.u.emm_esm.ueid = user->ueid; emm_esm->msg.length = msg->length; emm_esm->msg.value = msg->value; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } if (rc != RETURNerror) { /* Set the EPS bearer context state to ACTIVE */ - rc = esm_ebr_set_status(ebi, ESM_EBR_ACTIVE, ue_triggered); + rc = esm_ebr_set_status(user_api_id, esm_ebr_data, ebi, ESM_EBR_ACTIVE, ue_triggered); if (rc != RETURNok) { /* The EPS bearer context was already in ACTIVE state */ @@ -263,7 +245,7 @@ int esm_proc_default_eps_bearer_context_accept(int is_standalone, int ebi, ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_default_eps_bearer_context_reject(int is_standalone, int ebi, +int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi, OctetString *msg, int ue_triggered) { LOG_FUNC_IN; @@ -273,9 +255,9 @@ int esm_proc_default_eps_bearer_context_reject(int is_standalone, int ebi, LOG_TRACE(WARNING, "ESM-PROC - Default EPS bearer context activation " "not accepted by the UE (ebi=%d)", ebi); - if ( !esm_ebr_is_not_in_use(ebi) ) { + if ( !esm_ebr_is_not_in_use(user->esm_ebr_data, ebi) ) { /* Release EPS bearer data currently in use */ - rc = esm_ebr_release(ebi); + rc = esm_ebr_release(user->esm_ebr_data, ebi); } if (rc != RETURNok) { @@ -287,10 +269,10 @@ int esm_proc_default_eps_bearer_context_reject(int is_standalone, int ebi, * Notity EMM that ESM PDU has to be forwarded to lower layers */ emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = 0; + emm_sap.u.emm_esm.ueid = user->ueid; emm_esm->msg.length = msg->length; emm_esm->msg.value = msg->value; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } else { /* An error is returned to notify EMM that the default EPS bearer * activation procedure initiated as part of the initial attach @@ -317,10 +299,9 @@ int esm_proc_default_eps_bearer_context_reject(int is_standalone, int ebi, ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _default_eps_bearer_context_data ** ** ** ***************************************************************************/ -int esm_proc_default_eps_bearer_context_complete(void) +int esm_proc_default_eps_bearer_context_complete(default_eps_bearer_context_data_t *default_eps_bearer_context_data) { LOG_FUNC_IN; @@ -328,7 +309,7 @@ int esm_proc_default_eps_bearer_context_complete(void) "ESM-PROC - Default EPS bearer context activation complete"); /* Reset default EPS bearer context internal data */ - _default_eps_bearer_context_data.ebi = ESM_EBI_UNASSIGNED; + default_eps_bearer_context_data->ebi = ESM_EBI_UNASSIGNED; LOG_FUNC_RETURN (RETURNok); } @@ -346,40 +327,29 @@ int esm_proc_default_eps_bearer_context_complete(void) ** ACCEPT message was sent. ** ** ** ** Inputs: None ** - ** Others: _default_eps_bearer_context_data ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _default_eps_bearer_context_data ** ** ** ***************************************************************************/ -int esm_proc_default_eps_bearer_context_failure(void) +int esm_proc_default_eps_bearer_context_failure(nas_user_t *user) { LOG_FUNC_IN; + default_eps_bearer_context_data_t *default_eps_bearer_context_data = user->default_eps_bearer_context_data; - int ebi = _default_eps_bearer_context_data.ebi; + int ebi = default_eps_bearer_context_data->ebi; int pid, bid; LOG_TRACE(WARNING, "ESM-PROC - Default EPS bearer context activation failure"); /* Release the default EPS bearer context and enter state INACTIVE */ - int rc = esm_proc_eps_bearer_context_deactivate(TRUE, ebi, &pid, &bid); + int rc = esm_proc_eps_bearer_context_deactivate(user, TRUE, ebi, &pid, &bid); if (rc != RETURNerror) { /* Reset default EPS bearer context internal data */ - _default_eps_bearer_context_data.ebi = ESM_EBI_UNASSIGNED; + default_eps_bearer_context_data->ebi = ESM_EBI_UNASSIGNED; } LOG_FUNC_RETURN (rc); } - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - -/* - * -------------------------------------------------------------------------- - * Timer handlers - * -------------------------------------------------------------------------- - */ diff --git a/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c b/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c old mode 100755 new mode 100644 index bceeebeff1..1a7328a81f --- a/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c +++ b/openair3/NAS/UE/ESM/EpsBearerContextDeactivation.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EpsBearerContextDeactivation.c @@ -81,7 +74,7 @@ Description Defines the EPS bearer context deactivation ESM procedure * in the UE * -------------------------------------------------------------------------- */ -static int _eps_bearer_release(int ebi, int *pid, int *bid); +static int _eps_bearer_release(nas_user_t *user, int ebi, int *pid, int *bid); /****************************************************************************/ @@ -109,7 +102,6 @@ static int _eps_bearer_release(int ebi, int *pid, int *bid); ** gnalling between the UE and the MME ** ** ebi: EPS bearer identity of the EPS bearer con- ** ** text to be deactivated ** - ** Others: _esm_data ** ** ** ** Outputs: pid: Identifier of the PDN connection the EPS ** ** bearer belongs to ** @@ -119,25 +111,25 @@ static int _eps_bearer_release(int ebi, int *pid, int *bid); ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_eps_bearer_context_deactivate(int is_local, int ebi, +int esm_proc_eps_bearer_context_deactivate(nas_user_t *user, int is_local, int ebi, int *pid, int *bid) { LOG_FUNC_IN; int rc = RETURNerror; int i; - + esm_data_t *esm_data = user->esm_data; if (is_local) { if (ebi != ESM_SAP_ALL_EBI) { /* Locally release the EPS bearer context */ - rc = _eps_bearer_release(ebi, pid, bid); + rc = _eps_bearer_release(user, ebi, pid, bid); } else { /* Locally release all the EPS bearer contexts */ *bid = 0; for (*pid = 0; *pid < ESM_DATA_PDN_MAX; (*pid)++) { - if (_esm_data.pdn[*pid].data) { - rc = _eps_bearer_release(ESM_EBI_UNASSIGNED, pid, bid); + if (esm_data->pdn[*pid].data) { + rc = _eps_bearer_release(user, ESM_EBI_UNASSIGNED, pid, bid); if (rc != RETURNok) { break; @@ -153,17 +145,17 @@ int esm_proc_eps_bearer_context_deactivate(int is_local, int ebi, ebi); if (*pid < ESM_DATA_PDN_MAX) { - if (_esm_data.pdn[*pid].pid != *pid) { + if (esm_data->pdn[*pid].pid != *pid) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection identifier %d " "is not valid", *pid); - } else if (_esm_data.pdn[*pid].data == NULL) { + } else if (esm_data->pdn[*pid].data == NULL) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection %d has not been " "allocated", *pid); - } else if (!_esm_data.pdn[*pid].is_active) { + } else if (!esm_data->pdn[*pid].is_active) { LOG_TRACE(WARNING, "ESM-PROC - PDN connection %d is not active", *pid); } else { - esm_pdn_t *pdn = _esm_data.pdn[*pid].data; + esm_pdn_t *pdn = esm_data->pdn[*pid].data; for (i = 0; i < pdn->n_bearers; i++) { if (pdn->bearer[i]->ebi != ebi) { @@ -196,18 +188,19 @@ int esm_proc_eps_bearer_context_deactivate(int is_local, int ebi, ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_eps_bearer_context_deactivate_request(int ebi, int *esm_cause) +int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, int *esm_cause) { LOG_FUNC_IN; int pid, bid; int rc = RETURNok; + esm_data_t *esm_data = user->esm_data; LOG_TRACE(INFO, "ESM-PROC - EPS bearer context deactivation " "requested by the network (ebi=%d)", ebi); /* Release the EPS bearer context entry */ - if (esm_ebr_context_release(ebi, &pid, &bid) == ESM_EBI_UNASSIGNED) { + if (esm_ebr_context_release(user, ebi, &pid, &bid) == ESM_EBI_UNASSIGNED) { LOG_TRACE(WARNING, "ESM-PROC - Failed to release EPS bearer context"); *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; LOG_FUNC_RETURN (RETURNerror); @@ -229,7 +222,7 @@ int esm_proc_eps_bearer_context_deactivate_request(int ebi, int *esm_cause) "connection reactivation"); /* Get PDN context parameters */ - rc = esm_main_get_pdn(pid + 1, &esm_sap.data.pdn_connect.pdn_type, + rc = esm_main_get_pdn(esm_data, pid + 1, &esm_sap.data.pdn_connect.pdn_type, &esm_sap.data.pdn_connect.apn, &esm_sap.data.pdn_connect.is_emergency, &active); @@ -250,7 +243,7 @@ int esm_proc_eps_bearer_context_deactivate_request(int ebi, int *esm_cause) esm_sap.is_standalone = TRUE; esm_sap.data.pdn_connect.is_defined = TRUE; esm_sap.data.pdn_connect.cid = pid + 1; - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); } } } @@ -282,12 +275,14 @@ int esm_proc_eps_bearer_context_deactivate_request(int ebi, int *esm_cause) ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_eps_bearer_context_deactivate_accept(int is_standalone, int ebi, +int esm_proc_eps_bearer_context_deactivate_accept(nas_user_t *user, int is_standalone, int ebi, OctetString *msg, int ue_triggered) { LOG_FUNC_IN; int rc = RETURNok; + esm_ebr_data_t *esm_ebr_data = user->esm_ebr_data; + user_api_id_t *user_api_id = user->user_api_id; LOG_TRACE(INFO,"ESM-PROC - EPS bearer context deactivation accepted"); @@ -297,15 +292,15 @@ int esm_proc_eps_bearer_context_deactivate_accept(int is_standalone, int ebi, * Notity EMM that ESM PDU has to be forwarded to lower layers */ emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = 0; + emm_sap.u.emm_esm.ueid = user->ueid; emm_sap.u.emm_esm.u.data.msg.length = msg->length; emm_sap.u.emm_esm.u.data.msg.value = msg->value; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } if (rc != RETURNerror) { /* Set the EPS bearer context state to INACTIVE */ - rc = esm_ebr_set_status(ebi, ESM_EBR_INACTIVE, ue_triggered); + rc = esm_ebr_set_status(user_api_id, esm_ebr_data, ebi, ESM_EBR_INACTIVE, ue_triggered); if (rc != RETURNok) { /* The EPS bearer context was already in INACTIVE state */ @@ -316,7 +311,7 @@ int esm_proc_eps_bearer_context_deactivate_accept(int is_standalone, int ebi, } /* Release EPS bearer data */ - rc = esm_ebr_release(ebi); + rc = esm_ebr_release(esm_ebr_data, ebi); } LOG_FUNC_RETURN (rc); @@ -359,27 +354,29 @@ int esm_proc_eps_bearer_context_deactivate_accept(int is_standalone, int ebi, ** Others: None ** ** ** ***************************************************************************/ -static int _eps_bearer_release(int ebi, int *pid, int *bid) +static int _eps_bearer_release(nas_user_t *user, int ebi, int *pid, int *bid) { LOG_FUNC_IN; int rc = RETURNerror; + esm_ebr_data_t *esm_ebr_data = user->esm_ebr_data; + user_api_id_t *user_api_id = user->user_api_id; /* Release the EPS bearer context entry */ - ebi = esm_ebr_context_release(ebi, pid, bid); + ebi = esm_ebr_context_release(user, ebi, pid, bid); if (ebi == ESM_EBI_UNASSIGNED) { LOG_TRACE(WARNING, "ESM-PROC - Failed to release EPS bearer context"); } else { /* Set the EPS bearer context state to INACTIVE */ - rc = esm_ebr_set_status(ebi, ESM_EBR_INACTIVE, FALSE); + rc = esm_ebr_set_status(user_api_id, esm_ebr_data, ebi, ESM_EBR_INACTIVE, FALSE); if (rc != RETURNok) { /* The EPS bearer context was already in INACTIVE state */ LOG_TRACE(WARNING, "ESM-PROC - EBI %d was already INACTIVE", ebi); } else { /* Release EPS bearer data */ - rc = esm_ebr_release(ebi); + rc = esm_ebr_release(esm_ebr_data, ebi); if (rc != RETURNok) { LOG_TRACE(WARNING, diff --git a/openair3/NAS/UE/ESM/EsmStatusHdl.c b/openair3/NAS/UE/ESM/EsmStatusHdl.c old mode 100755 new mode 100644 index 9aafc271dd..def498a89b --- a/openair3/NAS/UE/ESM/EsmStatusHdl.c +++ b/openair3/NAS/UE/ESM/EsmStatusHdl.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source EsmStatus.c @@ -168,7 +161,7 @@ int esm_proc_status_ind( ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_status(int is_standalone, +int esm_proc_status(nas_user_t *user, int is_standalone, int ebi, OctetString *msg, int ue_triggered) { @@ -183,10 +176,10 @@ int esm_proc_status(int is_standalone, * Notity EMM that ESM PDU has to be forwarded to lower layers */ emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = 0; + emm_sap.u.emm_esm.ueid = user->ueid; emm_sap.u.emm_esm.u.data.msg.length = msg->length; emm_sap.u.emm_esm.u.data.msg.value = msg->value; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } diff --git a/openair3/NAS/UE/ESM/PdnConnectivity.c b/openair3/NAS/UE/ESM/PdnConnectivity.c old mode 100755 new mode 100644 index 8c9d123209..2efed604f0 --- a/openair3/NAS/UE/ESM/PdnConnectivity.c +++ b/openair3/NAS/UE/ESM/PdnConnectivity.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source PdnConnectivity.c @@ -88,15 +81,15 @@ Description Defines the PDN connectivity ESM procedure executed by the /* * PDN connection handlers */ -static int _pdn_connectivity_create(int pid, const OctetString *apn, +static int _pdn_connectivity_create(esm_data_t *esm_data, int pid, const OctetString *apn, esm_proc_pdn_type_t pdn_type, int is_emergency); -static int _pdn_connectivity_update(int pid, const OctetString *apn, +static int _pdn_connectivity_update(esm_data_t *esm_data, int pid, const OctetString *apn, esm_proc_pdn_type_t pdn_type, const OctetString *pdn_addr, int esm_cause); -static int _pdn_connectivity_delete(int pid); +static int _pdn_connectivity_delete(esm_data_t *esm_data, int pid); -static int _pdn_connectivity_set_pti(int pid, int pti); -static int _pdn_connectivity_find_apn(const OctetString *apn); -static int _pdn_connectivity_find_pdn(const OctetString *apn, +static int _pdn_connectivity_set_pti(esm_data_t *esm_data, int pid, int pti); +static int _pdn_connectivity_find_apn(esm_data_t *esm_data, const OctetString *apn); +static int _pdn_connectivity_find_pdn(esm_data_t * esm_data, const OctetString *apn, esm_proc_pdn_type_t pdn_type); /* @@ -138,10 +131,9 @@ static void *_pdn_connectivity_t3482_handler(void *); ** the new PDN connection or the released PDN ** ** connection ** ** Return: RETURNok, RETURNerror ** - ** Others: _esm_data ** ** ** ***************************************************************************/ -int esm_proc_pdn_connectivity(int cid, int is_to_define, +int esm_proc_pdn_connectivity(nas_user_t *user, int cid, int is_to_define, esm_proc_pdn_type_t pdn_type, const OctetString *apn, int is_emergency, unsigned int *pti) @@ -150,15 +142,17 @@ int esm_proc_pdn_connectivity(int cid, int is_to_define, int rc = RETURNerror; int pid = cid - 1; + esm_data_t *esm_data = user-> esm_data; + esm_pt_data_t *esm_pt_data = user-> esm_pt_data; if (!is_to_define) { LOG_TRACE(INFO, "ESM-PROC - Undefine PDN connection (cid=%d)", cid); /* Delete the PDN connection entry */ - int pti = _pdn_connectivity_delete(pid); + int pti = _pdn_connectivity_delete(esm_data, pid); if (pti != ESM_PT_UNASSIGNED) { /* Release the procedure transaction data */ - rc = esm_pt_release(pti); + rc = esm_pt_release(esm_pt_data, pti); } LOG_FUNC_RETURN(rc); @@ -166,7 +160,7 @@ int esm_proc_pdn_connectivity(int cid, int is_to_define, LOG_TRACE(INFO, "ESM-PROC - Assign new procedure transaction identity " "(cid=%d)", cid); /* Assign new procedure transaction identity */ - *pti = esm_pt_assign(); + *pti = esm_pt_assign(esm_pt_data); if (*pti == ESM_PT_UNASSIGNED) { LOG_TRACE(WARNING, "ESM-PROC - Failed to assign new procedure " @@ -175,7 +169,7 @@ int esm_proc_pdn_connectivity(int cid, int is_to_define, } /* Update the PDN connection data */ - rc = _pdn_connectivity_set_pti(pid, *pti); + rc = _pdn_connectivity_set_pti(esm_data, pid, *pti); if (rc != RETURNok) { LOG_TRACE(WARNING, "ESM-PROC - Failed to update PDN connection"); @@ -189,14 +183,14 @@ int esm_proc_pdn_connectivity(int cid, int is_to_define, (pdn_type == ESM_PDN_TYPE_IPV6)? "IPv6" : "IPv4v6", apn->value, cid); - if (is_emergency && _esm_data.emergency) { + if (is_emergency && esm_data->emergency) { /* The UE shall not request additional PDN connection for * emergency bearer services */ LOG_TRACE(WARNING, "ESM-PROC - PDN connection for emergency bearer " "services is already active"); LOG_FUNC_RETURN (RETURNerror); } else if (pid < ESM_DATA_PDN_MAX) { - if ((pid == _esm_data.pdn[pid].pid) && (_esm_data.pdn[pid].is_active)) { + if ((pid == esm_data->pdn[pid].pid) && (esm_data->pdn[pid].is_active)) { /* PDN connection with the specified identifier is active */ LOG_TRACE(WARNING, "ESM-PROC - PDN connection is active"); LOG_FUNC_RETURN (RETURNerror); @@ -208,15 +202,15 @@ int esm_proc_pdn_connectivity(int cid, int is_to_define, if (apn && apn->length > 0) { /* The UE requested subsequent connectivity to additionnal PDNs */ - int pid = _pdn_connectivity_find_apn(apn); + int pid = _pdn_connectivity_find_apn(esm_data, apn); - if ( (pid >= 0) && _esm_data.pdn[pid].is_active ) { + if ( (pid >= 0) && esm_data->pdn[pid].is_active ) { /* An active PDN connection to this APN already exists */ - if ( (_esm_data.pdn[pid].data->type != ESM_PDN_TYPE_IPV4V6) && - (_esm_data.pdn[pid].data->type != pdn_type) ) { + if ( (esm_data->pdn[pid].data->type != ESM_PDN_TYPE_IPV4V6) && + (esm_data->pdn[pid].data->type != pdn_type) ) { /* The UE is requesting PDN connection for other IP version * than the one already activated */ - if (!_esm_data.pdn[pid].data->addr_realloc) { + if (!esm_data->pdn[pid].data->addr_realloc) { /* The network does not allow PDN connectivity using * IPv4 and IPv6 address versions to the same APN */ if (pdn_type != ESM_PDN_TYPE_IPV4V6) { @@ -227,7 +221,7 @@ int esm_proc_pdn_connectivity(int cid, int is_to_define, } else { LOG_TRACE(WARNING, "ESM-PROC - %s PDN connection to %s " "already exists", - (_esm_data.pdn[pid].data->type != + (esm_data->pdn[pid].data->type != ESM_PDN_TYPE_IPV4)? "IPv6" : "IPv4", apn->value); } @@ -239,8 +233,8 @@ int esm_proc_pdn_connectivity(int cid, int is_to_define, * same IP version than the one already activated */ LOG_TRACE(WARNING, "ESM-PROC - %s PDN connection to %s " "already exists", - (_esm_data.pdn[pid].data->type != ESM_PDN_TYPE_IPV4)? - (_esm_data.pdn[pid].data->type != ESM_PDN_TYPE_IPV6)? + (esm_data->pdn[pid].data->type != ESM_PDN_TYPE_IPV4)? + (esm_data->pdn[pid].data->type != ESM_PDN_TYPE_IPV6)? "IPv4v6" : "IPv6" : "IPv4", apn->value); LOG_FUNC_RETURN (RETURNerror); } @@ -255,7 +249,7 @@ int esm_proc_pdn_connectivity(int cid, int is_to_define, * not already established, or may have been allowed to request PDN * connectivity for other IP version than the one already activated */ - rc = _pdn_connectivity_create(pid, apn, pdn_type, is_emergency); + rc = _pdn_connectivity_create(esm_data, pid, apn, pdn_type, is_emergency); LOG_FUNC_RETURN(rc); } @@ -286,11 +280,11 @@ int esm_proc_pdn_connectivity(int cid, int is_to_define, ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_pdn_connectivity_request(int is_standalone, int pti, +int esm_proc_pdn_connectivity_request(nas_user_t *user, int is_standalone, int pti, OctetString *msg, int sent_by_ue) { LOG_FUNC_IN; - + esm_pt_data_t *esm_pt_data = user->esm_pt_data; int rc = RETURNok; LOG_TRACE(INFO, "ESM-PROC - Initiate PDN connectivity (pti=%d)", pti); @@ -302,21 +296,21 @@ int esm_proc_pdn_connectivity_request(int is_standalone, int pti, * Notity EMM that ESM PDU has to be forwarded to lower layers */ emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = 0; + emm_sap.u.emm_esm.ueid = user->ueid; emm_esm->msg.length = msg->length; emm_esm->msg.value = msg->value; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { /* Start T3482 retransmission timer */ - rc = esm_pt_start_timer(pti, msg, T3482_DEFAULT_VALUE, + rc = esm_pt_start_timer(user, pti, msg, T3482_DEFAULT_VALUE, _pdn_connectivity_t3482_handler); } } if (rc != RETURNerror) { /* Set the procedure transaction state to PENDING */ - rc = esm_pt_set_status(pti, ESM_PT_PENDING); + rc = esm_pt_set_status(esm_pt_data, pti, ESM_PT_PENDING); if (rc != RETURNok) { /* The procedure transaction was already in PENDING state */ @@ -353,15 +347,17 @@ int esm_proc_pdn_connectivity_request(int is_standalone, int pti, ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_pdn_connectivity_accept(int pti, esm_proc_pdn_type_t pdn_type, +int esm_proc_pdn_connectivity_accept(nas_user_t *user, int pti, esm_proc_pdn_type_t pdn_type, const OctetString *pdn_addr, const OctetString *apn, int *esm_cause) { LOG_FUNC_IN; - + esm_data_t *esm_data = user->esm_data; + esm_pt_data_t *esm_pt_data = user->esm_pt_data; int rc; int pid = RETURNerror; char apn_first_char[4]; + char str[128]; if (isprint(apn->value[0])) { apn_first_char[0] = '\0'; @@ -371,14 +367,14 @@ int esm_proc_pdn_connectivity_accept(int pti, esm_proc_pdn_type_t pdn_type, LOG_TRACE(INFO, "ESM-PROC - PDN connectivity accepted by the network " "(pti=%d) APN = %s\"%s\", IP address = %s", pti, apn_first_char, isprint(apn->value[0]) ? &apn->value[0] : &apn->value[1], - (pdn_type == ESM_PDN_TYPE_IPV4)? esm_data_get_ipv4_addr(pdn_addr) : - (pdn_type == ESM_PDN_TYPE_IPV6)? esm_data_get_ipv6_addr(pdn_addr) : - esm_data_get_ipv4v6_addr(pdn_addr)); + (pdn_type == ESM_PDN_TYPE_IPV4)? esm_data_get_ipv4_addr(pdn_addr, str) : + (pdn_type == ESM_PDN_TYPE_IPV6)? esm_data_get_ipv6_addr(pdn_addr, str) : + esm_data_get_ipv4v6_addr(pdn_addr, str)); /* Stop T3482 timer if running */ - (void) esm_pt_stop_timer(pti); + esm_pt_stop_timer(esm_pt_data, pti); /* Set the procedure transaction state to INACTIVE */ - rc = esm_pt_set_status(pti, ESM_PT_INACTIVE); + rc = esm_pt_set_status(esm_pt_data, pti, ESM_PT_INACTIVE); if (rc != RETURNok) { /* The procedure transaction was already in INACTIVE state @@ -398,7 +394,7 @@ int esm_proc_pdn_connectivity_accept(int pti, esm_proc_pdn_type_t pdn_type, */ /* Check whether a PDN connection exists to this APN */ - pid = _pdn_connectivity_find_pdn(apn, pdn_type); + pid = _pdn_connectivity_find_pdn(esm_data, apn, pdn_type); if (pid < 0) { /* No any PDN connection has been defined to establish connectivity @@ -410,7 +406,7 @@ int esm_proc_pdn_connectivity_accept(int pti, esm_proc_pdn_type_t pdn_type, } /* Update the PDN connection */ - rc = _pdn_connectivity_update(pid, apn, pdn_type, pdn_addr, *esm_cause); + rc = _pdn_connectivity_update(esm_data, pid, apn, pdn_type, pdn_addr, *esm_cause); if (rc != RETURNok) { LOG_TRACE(WARNING, "ESM-PROC - Failed to update PDN connection " @@ -445,19 +441,19 @@ int esm_proc_pdn_connectivity_accept(int pti, esm_proc_pdn_type_t pdn_type, ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_pdn_connectivity_reject(int pti, int *esm_cause) +int esm_proc_pdn_connectivity_reject(nas_user_t *user, int pti, int *esm_cause) { LOG_FUNC_IN; - + esm_pt_data_t *esm_pt_data = user->esm_pt_data; int rc; LOG_TRACE(WARNING, "ESM-PROC - PDN connectivity rejected by " "the network (pti=%d), ESM cause = %d", pti, *esm_cause); /* Stop T3482 timer if running */ - (void) esm_pt_stop_timer(pti); + (void) esm_pt_stop_timer(esm_pt_data, pti); /* Set the procedure transaction state to INACTIVE */ - rc = esm_pt_set_status(pti, ESM_PT_INACTIVE); + rc = esm_pt_set_status(esm_pt_data, pti, ESM_PT_INACTIVE); if (rc != RETURNok) { /* The procedure transaction was already in INACTIVE state */ @@ -465,7 +461,7 @@ int esm_proc_pdn_connectivity_reject(int pti, int *esm_cause) *esm_cause = ESM_CAUSE_MESSAGE_TYPE_NOT_COMPATIBLE; } else { /* Release the procedure transaction identity */ - rc = esm_pt_release(pti); + rc = esm_pt_release(user->esm_pt_data, pti); if (rc != RETURNok) { LOG_TRACE(WARNING, "ESM-PROC - Failed to release PTI %d", pti); @@ -496,21 +492,21 @@ int esm_proc_pdn_connectivity_reject(int pti, int *esm_cause) ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_pdn_connectivity_complete(void) +int esm_proc_pdn_connectivity_complete(nas_user_t *user) { LOG_FUNC_IN; - + esm_pt_data_t *esm_pt_data = user->esm_pt_data; int rc = RETURNerror; LOG_TRACE(INFO, "ESM-PROC - PDN connectivity complete"); /* Get the procedure transaction identity assigned to the PDN connection * entry which is still pending in the inactive state */ - int pti = esm_pt_get_pending_pti(ESM_PT_INACTIVE); + int pti = esm_pt_get_pending_pti(esm_pt_data, ESM_PT_INACTIVE); if (pti != ESM_PT_UNASSIGNED) { /* Release the procedure transaction identity */ - rc = esm_pt_release(pti); + rc = esm_pt_release(esm_pt_data, pti); } LOG_FUNC_RETURN(rc); @@ -537,10 +533,10 @@ int esm_proc_pdn_connectivity_complete(void) ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_pdn_connectivity_failure(int is_pending) +int esm_proc_pdn_connectivity_failure(nas_user_t *user, int is_pending) { LOG_FUNC_IN; - + esm_pt_data_t *esm_pt_data = user->esm_pt_data; int rc; int pti; @@ -550,7 +546,7 @@ int esm_proc_pdn_connectivity_failure(int is_pending) if (is_pending) { /* Get the procedure transaction identity assigned to the pending PDN * connection entry */ - pti = esm_pt_get_pending_pti(ESM_PT_PENDING); + pti = esm_pt_get_pending_pti(esm_pt_data, ESM_PT_PENDING); if (pti == ESM_PT_UNASSIGNED) { LOG_TRACE(ERROR, "ESM-PROC - No procedure transaction is PENDING"); @@ -558,15 +554,15 @@ int esm_proc_pdn_connectivity_failure(int is_pending) } /* Set the procedure transaction state to INACTIVE */ - (void) esm_pt_set_status(pti, ESM_PT_INACTIVE); + (void) esm_pt_set_status(esm_pt_data, pti, ESM_PT_INACTIVE); } else { /* Get the procedure transaction identity assigned to the PDN * connection entry which is still pending in the inactive state */ - pti = esm_pt_get_pending_pti(ESM_PT_INACTIVE); + pti = esm_pt_get_pending_pti(esm_pt_data, ESM_PT_INACTIVE); } /* Release the procedure transaction identity */ - rc = esm_pt_release(pti); + rc = esm_pt_release(esm_pt_data, pti); if (rc != RETURNok) { LOG_TRACE(WARNING, "ESM-PROC - Failed to release PTI %d", pti); @@ -610,6 +606,7 @@ int esm_proc_pdn_connectivity_failure(int is_pending) ** Others: None ** ** ** ***************************************************************************/ +// FIXME static void *_pdn_connectivity_t3482_handler(void *args) { LOG_FUNC_IN; @@ -617,7 +614,9 @@ static void *_pdn_connectivity_t3482_handler(void *args) int rc; /* Get retransmission timer parameters data */ - esm_pt_timer_data_t *data = (esm_pt_timer_data_t *)(args); + esm_pt_timer_data_t *data = args; + nas_user_t *user = data->user; + esm_pt_data_t *esm_pt_data = user->esm_pt_data; /* Increment the retransmission counter */ data->count += 1; @@ -633,19 +632,19 @@ static void *_pdn_connectivity_t3482_handler(void *args) * has to be sent again */ emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = 0; + emm_sap.u.emm_esm.ueid = user->ueid; emm_esm->msg.length = data->msg.length; emm_esm->msg.value = data->msg.value; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { /* Restart the timer T3482 */ - rc = esm_pt_start_timer(data->pti, &data->msg, T3482_DEFAULT_VALUE, + rc = esm_pt_start_timer(user, data->pti, &data->msg, T3482_DEFAULT_VALUE, _pdn_connectivity_t3482_handler); } } else { /* Set the procedure transaction state to INACTIVE */ - rc = esm_pt_set_status(data->pti, ESM_PT_INACTIVE); + rc = esm_pt_set_status(esm_pt_data, data->pti, ESM_PT_INACTIVE); if (rc != RETURNok) { /* The procedure transaction was already in INACTIVE state */ @@ -653,7 +652,7 @@ static void *_pdn_connectivity_t3482_handler(void *args) data->pti); } else { /* Release the transaction identity assigned to this procedure */ - rc = esm_pt_release(data->pti); + rc = esm_pt_release(esm_pt_data, data->pti); if (rc != RETURNok) { LOG_TRACE(WARNING, "ESM-PROC - Failed to release PTI %d", @@ -683,14 +682,12 @@ static void *_pdn_connectivity_t3482_handler(void *args) ** pdn_type: PDN type (IPv4, IPv6, IPv4v6) ** ** is_emergency: TRUE if the PDN connection has to be esta- ** ** blished for emergency bearer services ** - ** Others: _esm_data ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _esm_data ** ** ** ***************************************************************************/ -static int _pdn_connectivity_create(int pid, const OctetString *apn, +static int _pdn_connectivity_create(esm_data_t *esm_data, int pid, const OctetString *apn, esm_proc_pdn_type_t pdn_type, int is_emergency) { @@ -700,14 +697,14 @@ static int _pdn_connectivity_create(int pid, const OctetString *apn, if (pid >= ESM_DATA_PDN_MAX) { return (RETURNerror); - } else if (_esm_data.pdn[pid].is_active) { + } else if (esm_data->pdn[pid].is_active) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection is active"); return (RETURNerror); } - if (_esm_data.pdn[pid].data != NULL) { + if (esm_data->pdn[pid].data != NULL) { /* Update existing non-active PDN connection */ - pdn = _esm_data.pdn[pid].data; + pdn = esm_data->pdn[pid].data; } else { /* Create new PDN connection */ pdn = (esm_pdn_t *)malloc(sizeof(esm_pdn_t)); @@ -720,13 +717,13 @@ static int _pdn_connectivity_create(int pid, const OctetString *apn, memset(pdn, 0, sizeof(esm_pdn_t)); /* Increment the number of PDN connections */ - _esm_data.n_pdns += 1; + esm_data->n_pdns += 1; /* Set the PDN connection identifier */ - _esm_data.pdn[pid].pid = pid; + esm_data->pdn[pid].pid = pid; /* Reset the PDN connection active indicator */ - _esm_data.pdn[pid].is_active = FALSE; + esm_data->pdn[pid].is_active = FALSE; /* Setup the PDN connection data */ - _esm_data.pdn[pid].data = pdn; + esm_data->pdn[pid].data = pdn; } /* Update the PDN connection data */ @@ -767,10 +764,9 @@ static int _pdn_connectivity_create(int pid, const OctetString *apn, ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _esm_data ** ** ** ***************************************************************************/ -static int _pdn_connectivity_update(int pid, const OctetString *apn, +static int _pdn_connectivity_update(esm_data_t *esm_data, int pid, const OctetString *apn, esm_proc_pdn_type_t pdn_type, const OctetString *pdn_addr, int esm_cause) @@ -779,21 +775,21 @@ static int _pdn_connectivity_update(int pid, const OctetString *apn, if (pid >= ESM_DATA_PDN_MAX) { return (RETURNerror); - } else if (pid != _esm_data.pdn[pid].pid) { + } else if (pid != esm_data->pdn[pid].pid) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection identifier is not valid"); return (RETURNerror); - } else if (_esm_data.pdn[pid].data == NULL) { + } else if (esm_data->pdn[pid].data == NULL) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection has not been allocated"); return (RETURNerror); - } else if (_esm_data.pdn[pid].is_active) { + } else if (esm_data->pdn[pid].is_active) { LOG_TRACE(WARNING, "ESM-PROC - Active %s PDN connection to %s already " - "exists", (_esm_data.pdn[pid].data->type != ESM_PDN_TYPE_IPV4)? - "IPv6" : "IPv4", _esm_data.pdn[pid].data->apn.value); + "exists", (esm_data->pdn[pid].data->type != ESM_PDN_TYPE_IPV4)? + "IPv6" : "IPv4", esm_data->pdn[pid].data->apn.value); return (RETURNerror); } /* Get the PDN connection */ - esm_pdn_t *pdn = _esm_data.pdn[pid].data; + esm_pdn_t *pdn = esm_data->pdn[pid].data; /* Setup the Access Point Name value */ if ( apn && (apn->length > 0) ) { @@ -854,49 +850,47 @@ static int _pdn_connectivity_update(int pid, const OctetString *apn, ** ** ** Inputs: pid: Identifier of the PDN connection to be ** ** released ** - ** Others: _esm_data ** ** ** ** Outputs: None ** ** Return: The identity of the procedure transaction ** ** assigned to the PDN connection when suc- ** ** cessfully released; ** ** UNASSIGNED value otherwise. ** - ** Others: _esm_data ** ** ** ***************************************************************************/ -static int _pdn_connectivity_delete(int pid) +static int _pdn_connectivity_delete(esm_data_t *esm_data, int pid) { int pti = ESM_PT_UNASSIGNED; if (pid < ESM_DATA_PDN_MAX) { - if (pid != _esm_data.pdn[pid].pid) { + if (pid != esm_data->pdn[pid].pid) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection identifier is not valid"); - } else if (_esm_data.pdn[pid].data == NULL) { + } else if (esm_data->pdn[pid].data == NULL) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection has not been allocated"); - } else if (_esm_data.pdn[pid].is_active) { + } else if (esm_data->pdn[pid].is_active) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection is active"); } else { /* Get the identity of the procedure transaction that created * the PDN connection */ - pti = _esm_data.pdn[pid].data->pti; + pti = esm_data->pdn[pid].data->pti; } } if (pti != ESM_PT_UNASSIGNED) { /* Decrement the number of PDN connections */ - _esm_data.n_pdns -= 1; + esm_data->n_pdns -= 1; /* Set the PDN connection as available */ - _esm_data.pdn[pid].pid = -1; + esm_data->pdn[pid].pid = -1; /* Release allocated PDN connection data */ - if (_esm_data.pdn[pid].data->apn.length > 0) { - free(_esm_data.pdn[pid].data->apn.value); + if (esm_data->pdn[pid].data->apn.length > 0) { + free(esm_data->pdn[pid].data->apn.value); } - free(_esm_data.pdn[pid].data); - _esm_data.pdn[pid].data = NULL; + free(esm_data->pdn[pid].data); + esm_data->pdn[pid].data = NULL; LOG_TRACE(WARNING, "ESM-PROC - PDN connection %d released", pid); } @@ -917,24 +911,23 @@ static int _pdn_connectivity_delete(int pid) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _esm_data ** ** ** ***************************************************************************/ -static int _pdn_connectivity_set_pti(int pid, int pti) +static int _pdn_connectivity_set_pti(esm_data_t *esm_data, int pid, int pti) { if (pid < ESM_DATA_PDN_MAX) { - if (pid != _esm_data.pdn[pid].pid) { + if (pid != esm_data->pdn[pid].pid) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection identifier is not valid"); - } else if (_esm_data.pdn[pid].data == NULL) { + } else if (esm_data->pdn[pid].data == NULL) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection has not been allocated"); - } else if (_esm_data.pdn[pid].is_active) { + } else if (esm_data->pdn[pid].is_active) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection is active"); } else { /* Update the identity of the procedure transaction assigned to * the PDN connection */ - _esm_data.pdn[pid].data->pti = pti; + esm_data->pdn[pid].data->pti = pti; return (RETURNok); } } @@ -950,7 +943,6 @@ static int _pdn_connectivity_set_pti(int pid, int pti) ** for the specified APN ** ** ** ** Inputs: apn: Access Point Name of the PDN connection ** - ** Others: _esm_data ** ** ** ** Outputs: None ** ** Return: The identifier of the PDN connection if ** @@ -958,17 +950,17 @@ static int _pdn_connectivity_set_pti(int pid, int pti) ** Others: None ** ** ** ***************************************************************************/ -static int _pdn_connectivity_find_apn(const OctetString *apn) +static int _pdn_connectivity_find_apn(esm_data_t *esm_data, const OctetString *apn) { int i; for (i = 0; i < ESM_DATA_PDN_MAX; i++) { - if ( (_esm_data.pdn[i].pid != -1) && _esm_data.pdn[i].data ) { - if (_esm_data.pdn[i].data->apn.length != apn->length) { + if ( (esm_data->pdn[i].pid != -1) && esm_data->pdn[i].data ) { + if (esm_data->pdn[i].data->apn.length != apn->length) { continue; } - if (memcmp(_esm_data.pdn[i].data->apn.value, + if (memcmp(esm_data->pdn[i].data->apn.value, apn->value, apn->length) != 0) { continue; } @@ -979,7 +971,7 @@ static int _pdn_connectivity_find_apn(const OctetString *apn) } /* Return the identifier of the PDN connection */ - return (_esm_data.pdn[i].pid); + return (esm_data->pdn[i].pid); } /**************************************************************************** @@ -991,7 +983,6 @@ static int _pdn_connectivity_find_apn(const OctetString *apn) ** ** ** Inputs: apn: Access Point Name of the PDN connection ** ** pdn_type: PDN address type ** - ** Others: _esm_data ** ** ** ** Outputs: None ** ** Return: The identifier of the PDN connection if ** @@ -999,38 +990,38 @@ static int _pdn_connectivity_find_apn(const OctetString *apn) ** Others: None ** ** ** ***************************************************************************/ -static int _pdn_connectivity_find_pdn(const OctetString *apn, +static int _pdn_connectivity_find_pdn(esm_data_t *esm_data, const OctetString *apn, const esm_proc_pdn_type_t pdn_type) { int i; for (i = 0; i < ESM_DATA_PDN_MAX; i++) { - if ( (_esm_data.pdn[i].pid != -1) && _esm_data.pdn[i].data ) { + if ( (esm_data->pdn[i].pid != -1) && esm_data->pdn[i].data ) { /* PDN connection established during initial network attachment */ - if (_esm_data.pdn[i].data->apn.length == 0) { + if (esm_data->pdn[i].data->apn.length == 0) { break; } /* Subsequent PDN connection established for the specified APN */ - if (_esm_data.pdn[i].data->apn.length != apn->length) { + if (esm_data->pdn[i].data->apn.length != apn->length) { continue; } - if (memcmp(_esm_data.pdn[i].data->apn.value, + if (memcmp(esm_data->pdn[i].data->apn.value, apn->value, apn->length) != 0) { continue; } - if (_esm_data.pdn[i].data->type == ESM_PDN_TYPE_IPV4V6) { + if (esm_data->pdn[i].data->type == ESM_PDN_TYPE_IPV4V6) { break; } - if (_esm_data.pdn[i].data->type == pdn_type) { + if (esm_data->pdn[i].data->type == pdn_type) { break; } } } /* Return the identifier of the PDN connection */ - return (_esm_data.pdn[i].pid); + return (esm_data->pdn[i].pid); } diff --git a/openair3/NAS/UE/ESM/PdnDisconnect.c b/openair3/NAS/UE/ESM/PdnDisconnect.c old mode 100755 new mode 100644 index e9ab748f8d..6665126e40 --- a/openair3/NAS/UE/ESM/PdnDisconnect.c +++ b/openair3/NAS/UE/ESM/PdnDisconnect.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source PdnDisconnect.c @@ -80,7 +73,7 @@ Description Defines the PDN disconnect ESM procedure executed by the /* * PDN disconnection handlers */ -static int _pdn_disconnect_get_default_ebi(int pti); +static int _pdn_disconnect_get_default_ebi(esm_data_t *esm_data, int pti); /* * Timer handlers @@ -111,7 +104,6 @@ static void *_pdn_disconnect_t3492_handler(void *); ** tifier ** ** ** ** Inputs: cid: PDN context identifier ** - ** Others: _esm_data ** ** ** ** Outputs: pti: Procedure transaction identity assigned to ** ** the PDN connection to be released ** @@ -121,7 +113,7 @@ static void *_pdn_disconnect_t3492_handler(void *); ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_pdn_disconnect(int cid, unsigned int *pti, unsigned int *ebi) +int esm_proc_pdn_disconnect(esm_data_t *esm_data, int cid, unsigned int *pti, unsigned int *ebi) { LOG_FUNC_IN; @@ -129,21 +121,21 @@ int esm_proc_pdn_disconnect(int cid, unsigned int *pti, unsigned int *ebi) int pid = cid - 1; if (pid < ESM_DATA_PDN_MAX) { - if (pid != _esm_data.pdn[pid].pid) { + if (pid != esm_data->pdn[pid].pid) { LOG_TRACE(WARNING, "ESM-PROC - PDN connection identifier %d is " "not valid", pid); - } else if (_esm_data.pdn[pid].data == NULL) { + } else if (esm_data->pdn[pid].data == NULL) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection %d has not been " "allocated", pid); - } else if (!_esm_data.pdn[pid].is_active) { + } else if (!esm_data->pdn[pid].is_active) { LOG_TRACE(WARNING, "ESM-PROC - PDN connection is not active"); } else { /* Get the procedure transaction identity assigned to the PDN * connection to be released */ - *pti = _esm_data.pdn[pid].data->pti; + *pti = esm_data->pdn[pid].data->pti; /* Get the EPS bearer identity of the default bearer associated * with the PDN to disconnect from */ - *ebi = _esm_data.pdn[pid].data->bearer[0]->ebi; + *ebi = esm_data->pdn[pid].data->bearer[0]->ebi; rc = RETURNok; } } @@ -175,13 +167,13 @@ int esm_proc_pdn_disconnect(int cid, unsigned int *pti, unsigned int *ebi) ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_pdn_disconnect_request(int is_standalone, int pti, +int esm_proc_pdn_disconnect_request(nas_user_t *user, int is_standalone, int pti, OctetString *msg, int sent_by_ue) { LOG_FUNC_IN; int rc = RETURNok; - + esm_pt_data_t *esm_pt_data = user->esm_pt_data; LOG_TRACE(INFO, "ESM-PROC - Initiate PDN disconnection (pti=%d)", pti); if (is_standalone) { @@ -191,21 +183,21 @@ int esm_proc_pdn_disconnect_request(int is_standalone, int pti, * Notity EMM that ESM PDU has to be forwarded to lower layers */ emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = 0; + emm_sap.u.emm_esm.ueid = user->ueid; emm_esm->msg.length = msg->length; emm_esm->msg.value = msg->value; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { /* Start T3482 retransmission timer */ - rc = esm_pt_start_timer(pti, msg, T3492_DEFAULT_VALUE, + rc = esm_pt_start_timer(user, pti, msg, T3492_DEFAULT_VALUE, _pdn_disconnect_t3492_handler); } } if (rc != RETURNerror) { /* Set the procedure transaction state to PENDING */ - rc = esm_pt_set_status(pti, ESM_PT_PENDING); + rc = esm_pt_set_status(esm_pt_data, pti, ESM_PT_PENDING); if (rc != RETURNok) { /* The procedure transaction was already in PENDING state */ @@ -239,7 +231,7 @@ int esm_proc_pdn_disconnect_request(int is_standalone, int pti, ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_pdn_disconnect_accept(int pti, int *esm_cause) +int esm_proc_pdn_disconnect_accept(esm_pt_data_t *esm_pt_data, int pti, int *esm_cause) { LOG_FUNC_IN; @@ -247,9 +239,9 @@ int esm_proc_pdn_disconnect_accept(int pti, int *esm_cause) "(pti=%d)", pti); /* Stop T3492 timer if running */ - (void) esm_pt_stop_timer(pti); + (void) esm_pt_stop_timer(esm_pt_data, pti); /* Set the procedure transaction state to INACTIVE */ - int rc = esm_pt_set_status(pti, ESM_PT_INACTIVE); + int rc = esm_pt_set_status(esm_pt_data, pti, ESM_PT_INACTIVE); if (rc != RETURNok) { /* The procedure transaction was already in INACTIVE state */ @@ -258,7 +250,7 @@ int esm_proc_pdn_disconnect_accept(int pti, int *esm_cause) } else { /* Immediately release the transaction identity assigned to this * procedure */ - rc = esm_pt_release(pti); + rc = esm_pt_release(esm_pt_data, pti); if (rc != RETURNok) { LOG_TRACE(WARNING, "ESM-PROC - Failed to release PTI %d", pti); @@ -291,19 +283,19 @@ int esm_proc_pdn_disconnect_accept(int pti, int *esm_cause) ** Others: None ** ** ** ***************************************************************************/ -int esm_proc_pdn_disconnect_reject(int pti, int *esm_cause) +int esm_proc_pdn_disconnect_reject(nas_user_t *user, int pti, int *esm_cause) { LOG_FUNC_IN; - + esm_data_t *esm_data = user->esm_data; int rc; LOG_TRACE(WARNING, "ESM-PROC - PDN disconnection rejected by the network " "(pti=%d), ESM cause = %d", pti, *esm_cause); /* Stop T3492 timer if running */ - (void) esm_pt_stop_timer(pti); + (void) esm_pt_stop_timer(user->esm_pt_data, pti); /* Set the procedure transaction state to INACTIVE */ - rc = esm_pt_set_status(pti, ESM_PT_INACTIVE); + rc = esm_pt_set_status(user->esm_pt_data, pti, ESM_PT_INACTIVE); if (rc != RETURNok) { /* The procedure transaction was already in INACTIVE state @@ -312,7 +304,7 @@ int esm_proc_pdn_disconnect_reject(int pti, int *esm_cause) *esm_cause = ESM_CAUSE_MESSAGE_TYPE_NOT_COMPATIBLE; } else { /* Release the transaction identity assigned to this procedure */ - rc = esm_pt_release(pti); + rc = esm_pt_release(user->esm_pt_data, pti); if (rc != RETURNok) { LOG_TRACE(WARNING, "ESM-PROC - Failed to release PTI %d", pti); @@ -320,7 +312,7 @@ int esm_proc_pdn_disconnect_reject(int pti, int *esm_cause) } else if (*esm_cause != ESM_CAUSE_LAST_PDN_DISCONNECTION_NOT_ALLOWED) { /* Get the identity of the default EPS bearer context allocated to * the PDN connection entry assigned to this procedure transaction */ - int ebi = _pdn_disconnect_get_default_ebi(pti); + int ebi = _pdn_disconnect_get_default_ebi(esm_data, pti); if (ebi < 0) { LOG_TRACE(ERROR, "ESM-PROC - No default EPS bearer found"); @@ -338,7 +330,7 @@ int esm_proc_pdn_disconnect_reject(int pti, int *esm_cause) esm_sap.recv = NULL; esm_sap.send.length = 0; esm_sap.data.eps_bearer_context_deactivate.ebi = ebi; - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); if (rc != RETURNok) { *esm_cause = ESM_CAUSE_PROTOCOL_ERROR; @@ -389,7 +381,8 @@ int esm_proc_pdn_disconnect_reject(int pti, int *esm_cause) static void *_pdn_disconnect_t3492_handler(void *args) { LOG_FUNC_IN; - + nas_user_t *user = args; + esm_data_t *esm_data = user->esm_data;; int rc; /* Get retransmission timer parameters data */ @@ -409,19 +402,19 @@ static void *_pdn_disconnect_t3492_handler(void *args) * has to be sent again */ emm_sap.primitive = EMMESM_UNITDATA_REQ; - emm_sap.u.emm_esm.ueid = 0; + emm_sap.u.emm_esm.ueid = user->ueid; emm_esm->msg.length = data->msg.length; emm_esm->msg.value = data->msg.value; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); if (rc != RETURNerror) { /* Restart the timer T3492 */ - rc = esm_pt_start_timer(data->pti, &data->msg, T3492_DEFAULT_VALUE, + rc = esm_pt_start_timer(user, data->pti, &data->msg, T3492_DEFAULT_VALUE, _pdn_disconnect_t3492_handler); } } else { /* Set the procedure transaction state to INACTIVE */ - rc = esm_pt_set_status(data->pti, ESM_PT_INACTIVE); + rc = esm_pt_set_status(user->esm_pt_data, data->pti, ESM_PT_INACTIVE); if (rc != RETURNok) { /* The procedure transaction was already in INACTIVE state */ @@ -429,7 +422,7 @@ static void *_pdn_disconnect_t3492_handler(void *args) data->pti); } else { /* Release the transaction identity assigned to this procedure */ - rc = esm_pt_release(data->pti); + rc = esm_pt_release(user->esm_pt_data, data->pti); if (rc != RETURNok) { LOG_TRACE(WARNING, "ESM-PROC - Failed to release PTI %d", @@ -438,7 +431,7 @@ static void *_pdn_disconnect_t3492_handler(void *args) /* Get the identity of the default EPS bearer context * allocated to the PDN connection entry assigned to * this procedure transaction */ - int ebi = _pdn_disconnect_get_default_ebi(data->pti); + int ebi = _pdn_disconnect_get_default_ebi(esm_data, data->pti); if (ebi < 0) { LOG_TRACE(ERROR, "ESM-PROC - No default EPS bearer found"); @@ -455,7 +448,7 @@ static void *_pdn_disconnect_t3492_handler(void *args) esm_sap.recv = NULL; esm_sap.send.length = 0; esm_sap.data.eps_bearer_context_deactivate.ebi = ebi; - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); } } } @@ -478,7 +471,6 @@ static void *_pdn_disconnect_t3492_handler(void *args) ** ven procedure transaction identity has been assigned ** ** ** ** Inputs: pti: The procedure transaction identity ** - ** Others: _esm_data ** ** ** ** Outputs: None ** ** Return: The EPS bearer identity of the default EPS ** @@ -486,22 +478,22 @@ static void *_pdn_disconnect_t3492_handler(void *args) ** Others: None ** ** ** ***************************************************************************/ -static int _pdn_disconnect_get_default_ebi(int pti) +static int _pdn_disconnect_get_default_ebi(esm_data_t *esm_data, int pti) { int ebi = -1; int i; for (i = 0; i < ESM_DATA_PDN_MAX; i++) { - if ( (_esm_data.pdn[i].pid != -1) && _esm_data.pdn[i].data ) { - if (_esm_data.pdn[i].data->pti != pti) { + if ( (esm_data->pdn[i].pid != -1) && esm_data->pdn[i].data ) { + if (esm_data->pdn[i].data->pti != pti) { continue; } /* PDN entry found */ - if (_esm_data.pdn[i].data->bearer[0] != NULL) { + if (esm_data->pdn[i].data->bearer[0] != NULL) { /* Get the EPS bearer identity of the default EPS bearer * context associated to the PDN connection */ - ebi = _esm_data.pdn[i].data->bearer[0]->ebi; + ebi = esm_data->pdn[i].data->bearer[0]->ebi; } break; diff --git a/openair3/NAS/UE/ESM/SAP/COPYING b/openair3/NAS/UE/ESM/SAP/COPYING deleted file mode 100755 index 94a9ed024d..0000000000 --- a/openair3/NAS/UE/ESM/SAP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/NAS/UE/ESM/SAP/esm_recv.c b/openair3/NAS/UE/ESM/SAP/esm_recv.c old mode 100755 new mode 100644 index 72b322e966..ca859f75f2 --- a/openair3/NAS/UE/ESM/SAP/esm_recv.c +++ b/openair3/NAS/UE/ESM/SAP/esm_recv.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_recv.c @@ -81,7 +74,7 @@ Description Defines functions executed at the ESM Service Access ** ** ** Description: Processes ESM status message ** ** ** - ** Inputs: ueid: UE local identifier ** + ** Inputs: ** ** pti: Procedure transaction identity ** ** ebi: EPS bearer identity ** ** msg: The received ESM message ** @@ -142,7 +135,7 @@ int esm_recv_status(int pti, int ebi, const esm_status_msg *msg) ** Others: None ** ** ** ***************************************************************************/ -int esm_recv_pdn_connectivity_reject(int pti, int ebi, +int esm_recv_pdn_connectivity_reject(nas_user_t *user, int pti, int ebi, const pdn_connectivity_reject_msg *msg) { LOG_FUNC_IN; @@ -161,7 +154,7 @@ int esm_recv_pdn_connectivity_reject(int pti, int ebi, */ LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } else if ( esm_pt_is_not_in_use(pti) ) { + } else if ( esm_pt_is_not_in_use(user->esm_pt_data, pti) ) { /* 3GPP TS 24.301, section 7.3.1, case a * Assigned value that does not match any PTI in use */ @@ -171,7 +164,7 @@ int esm_recv_pdn_connectivity_reject(int pti, int ebi, /* * EPS bearer identity checking */ - else if ( (ebi != ESM_EBI_UNASSIGNED) || esm_ebr_is_reserved(ebi) ) { + else if ( (ebi != ESM_EBI_UNASSIGNED) || esm_ebr_is_reserved(user->esm_ebr_data, ebi) ) { /* 3GPP TS 24.301, section 7.3.2, case a * Assigned or reserved EPS bearer identity value */ LOG_TRACE(WARNING, "ESM-SAP - Invalid EPS bearer identity (ebi=%d)", @@ -186,7 +179,7 @@ int esm_recv_pdn_connectivity_reject(int pti, int ebi, esm_cause = msg->esmcause; /* Execute the PDN connectivity procedure not accepted by the network */ - int rc = esm_proc_pdn_connectivity_reject(pti, &esm_cause); + int rc = esm_proc_pdn_connectivity_reject(user, pti, &esm_cause); if (rc != RETURNerror) { esm_cause = ESM_CAUSE_SUCCESS; @@ -213,7 +206,7 @@ int esm_recv_pdn_connectivity_reject(int pti, int ebi, ** Others: None ** ** ** ***************************************************************************/ -int esm_recv_pdn_disconnect_reject(int pti, int ebi, +int esm_recv_pdn_disconnect_reject(nas_user_t *user, int pti, int ebi, const pdn_disconnect_reject_msg *msg) { LOG_FUNC_IN; @@ -232,7 +225,7 @@ int esm_recv_pdn_disconnect_reject(int pti, int ebi, */ LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } else if ( esm_pt_is_not_in_use(pti) ) { + } else if ( esm_pt_is_not_in_use(user->esm_pt_data, pti) ) { /* 3GPP TS 24.301, section 7.3.1, case b * Assigned value that does not match any PTI in use */ @@ -242,7 +235,7 @@ int esm_recv_pdn_disconnect_reject(int pti, int ebi, /* * EPS bearer identity checking */ - else if ( (ebi != ESM_EBI_UNASSIGNED) || esm_ebr_is_reserved(ebi) ) { + else if ( (ebi != ESM_EBI_UNASSIGNED) || esm_ebr_is_reserved(user->esm_ebr_data, ebi) ) { /* 3GPP TS 24.301, section 7.3.2, case b * Assigned or reserved EPS bearer identity value */ LOG_TRACE(WARNING, "ESM-SAP - Invalid EPS bearer identity (ebi=%d)", @@ -257,7 +250,7 @@ int esm_recv_pdn_disconnect_reject(int pti, int ebi, esm_cause = msg->esmcause; /* Execute the PDN disconnect procedure not accepted by the network */ - int rc = esm_proc_pdn_disconnect_reject(pti, &esm_cause); + int rc = esm_proc_pdn_disconnect_reject(user, pti, &esm_cause); if (rc != RETURNerror) { esm_cause = ESM_CAUSE_SUCCESS; @@ -285,12 +278,13 @@ int esm_recv_pdn_disconnect_reject(int pti, int ebi, ** Others: None ** ** ** ***************************************************************************/ -int esm_recv_activate_default_eps_bearer_context_request(int pti, int ebi, +int esm_recv_activate_default_eps_bearer_context_request(nas_user_t *user, int pti, int ebi, const activate_default_eps_bearer_context_request_msg *msg) { LOG_FUNC_IN; int esm_cause = ESM_CAUSE_SUCCESS; + esm_pt_data_t *esm_pt_data = user->esm_pt_data; LOG_TRACE(INFO, "ESM-SAP - Received Activate Default EPS Bearer Context " "Request message (pti=%d, ebi=%d)", pti, ebi); @@ -304,7 +298,7 @@ int esm_recv_activate_default_eps_bearer_context_request(int pti, int ebi, */ LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } else if ( esm_pt_is_not_in_use(pti) ) { + } else if ( esm_pt_is_not_in_use(esm_pt_data, pti) ) { /* 3GPP TS 24.301, section 7.3.1, case g * Assigned value that does not match any PTI in use */ @@ -314,7 +308,7 @@ int esm_recv_activate_default_eps_bearer_context_request(int pti, int ebi, /* * EPS bearer identity checking */ - else if ( (ebi == ESM_EBI_UNASSIGNED) || esm_ebr_is_reserved(ebi) ) { + else if ( (ebi == ESM_EBI_UNASSIGNED) || esm_ebr_is_reserved(user->esm_ebr_data, ebi) ) { /* 3GPP TS 24.301, section 7.3.2, case g * Reserved or unassigned EPS bearer identity value */ @@ -376,14 +370,14 @@ int esm_recv_activate_default_eps_bearer_context_request(int pti, int ebi, } /* Execute the PDN connectivity procedure accepted by the network */ - int pid = esm_proc_pdn_connectivity_accept(pti, pdn_type, + int pid = esm_proc_pdn_connectivity_accept(user, pti, pdn_type, &msg->pdnaddress.pdnaddressinformation, &msg->accesspointname.accesspointnamevalue, &esm_cause); if (pid != RETURNerror) { /* Create local default EPS bearer context */ - int rc = esm_proc_default_eps_bearer_context_request(pid, ebi, &qos, + int rc = esm_proc_default_eps_bearer_context_request(user, pid, ebi, &qos, &esm_cause); if (rc != RETURNerror) { @@ -413,7 +407,7 @@ int esm_recv_activate_default_eps_bearer_context_request(int pti, int ebi, ** Others: None ** ** ** ***************************************************************************/ -int esm_recv_activate_dedicated_eps_bearer_context_request(int pti, int ebi, +int esm_recv_activate_dedicated_eps_bearer_context_request(nas_user_t *user, int pti, int ebi, const activate_dedicated_eps_bearer_context_request_msg *msg) { LOG_FUNC_IN; @@ -421,6 +415,7 @@ int esm_recv_activate_dedicated_eps_bearer_context_request(int pti, int ebi, int esm_cause = ESM_CAUSE_SUCCESS; int i; int j; + esm_pt_data_t *esm_pt_data = user->esm_pt_data; LOG_TRACE(INFO, "ESM-SAP - Received Activate Dedicated EPS Bearer " "Context Request message (pti=%d, ebi=%d)", pti, ebi); @@ -434,7 +429,7 @@ int esm_recv_activate_dedicated_eps_bearer_context_request(int pti, int ebi, */ LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } else if ( (pti != ESM_PT_UNASSIGNED) && esm_pt_is_not_in_use(pti) ) { + } else if ( (pti != ESM_PT_UNASSIGNED) && esm_pt_is_not_in_use(esm_pt_data, pti) ) { /* 3GPP TS 24.301, section 7.3.1, case i * Assigned value that does not match any PTI in use */ @@ -444,7 +439,7 @@ int esm_recv_activate_dedicated_eps_bearer_context_request(int pti, int ebi, /* * EPS bearer identity checking */ - else if ( (ebi == ESM_EBI_UNASSIGNED) || esm_ebr_is_reserved(ebi) ) { + else if ( (ebi == ESM_EBI_UNASSIGNED) || esm_ebr_is_reserved(user->esm_ebr_data, ebi) ) { /* 3GPP TS 24.301, section 7.3.2, case h * Reserved or unassigned EPS bearer identity value */ @@ -587,7 +582,7 @@ int esm_recv_activate_dedicated_eps_bearer_context_request(int pti, int ebi, } /* Execute the dedicated EPS bearer context activation procedure */ - int rc = esm_proc_dedicated_eps_bearer_context_request(ebi, + int rc = esm_proc_dedicated_eps_bearer_context_request(user, ebi, msg->linkedepsbeareridentity, &qos, &tft, &esm_cause); @@ -621,13 +616,14 @@ int esm_recv_activate_dedicated_eps_bearer_context_request(int pti, int ebi, ** Others: None ** ** ** ***************************************************************************/ -int esm_recv_deactivate_eps_bearer_context_request(int pti, int ebi, +int esm_recv_deactivate_eps_bearer_context_request(nas_user_t *user, int pti, int ebi, const deactivate_eps_bearer_context_request_msg *msg) { LOG_FUNC_IN; int rc = RETURNok; int esm_cause; + esm_pt_data_t *esm_pt_data = user->esm_pt_data; LOG_TRACE(INFO, "ESM-SAP - Received Deactivate EPS Bearer Context " "Request message (pti=%d, ebi=%d)", pti, ebi); @@ -641,7 +637,7 @@ int esm_recv_deactivate_eps_bearer_context_request(int pti, int ebi, */ LOG_TRACE(WARNING, "ESM-SAP - Invalid PTI value (pti=%d)", pti); LOG_FUNC_RETURN (ESM_CAUSE_INVALID_PTI_VALUE); - } else if ( esm_pt_is_not_in_use(pti) ) { + } else if ( esm_pt_is_not_in_use(esm_pt_data, pti) ) { /* 3GPP TS 24.301, section 7.3.1, case m * Assigned value does not match any PTI in use */ @@ -651,8 +647,8 @@ int esm_recv_deactivate_eps_bearer_context_request(int pti, int ebi, /* * EPS bearer identity checking */ - else if ( (ebi == ESM_EBI_UNASSIGNED) || esm_ebr_is_reserved(ebi) || - esm_ebr_is_not_in_use(ebi) ) { + else if ( (ebi == ESM_EBI_UNASSIGNED) || esm_ebr_is_reserved(user->esm_ebr_data, ebi) || + esm_ebr_is_not_in_use(user->esm_ebr_data, ebi) ) { /* 3GPP TS 24.301, section 7.3.2, case j * Reserved or unassigned EPS bearer identity value or, * assigned value that does not match an existing EPS bearer context @@ -672,12 +668,12 @@ int esm_recv_deactivate_eps_bearer_context_request(int pti, int ebi, /* Execute the PDN disconnect procedure accepted by the network */ if (pti != ESM_PT_UNASSIGNED) { - rc = esm_proc_pdn_disconnect_accept(pti, &esm_cause); + rc = esm_proc_pdn_disconnect_accept(esm_pt_data, pti, &esm_cause); } if (rc != RETURNerror) { /* Execute the EPS bearer context deactivation procedure */ - rc = esm_proc_eps_bearer_context_deactivate_request(ebi, &esm_cause); + rc = esm_proc_eps_bearer_context_deactivate_request(user, ebi, &esm_cause); if (rc != RETURNerror) { esm_cause = ESM_CAUSE_SUCCESS; diff --git a/openair3/NAS/UE/ESM/SAP/esm_recv.h b/openair3/NAS/UE/ESM/SAP/esm_recv.h old mode 100755 new mode 100644 index 35e3ee49ce..29fcb47092 --- a/openair3/NAS/UE/ESM/SAP/esm_recv.h +++ b/openair3/NAS/UE/ESM/SAP/esm_recv.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_recv.h @@ -49,6 +42,7 @@ Description Defines functions executed at the ESM Service Access #include "EsmStatus.h" #include "emmData.h" +#include "user_defs.h" #include "PdnConnectivityReject.h" #include "PdnDisconnectReject.h" @@ -95,23 +89,23 @@ int esm_recv_status(int pti, int ebi, const esm_status_msg *msg); * Transaction related messages * ---------------------------- */ -int esm_recv_pdn_connectivity_reject(int pti, int ebi, +int esm_recv_pdn_connectivity_reject(nas_user_t *user, int pti, int ebi, const pdn_connectivity_reject_msg *msg); -int esm_recv_pdn_disconnect_reject(int pti, int ebi, +int esm_recv_pdn_disconnect_reject(nas_user_t *user, int pti, int ebi, const pdn_disconnect_reject_msg *msg); /* * Messages related to EPS bearer contexts * --------------------------------------- */ -int esm_recv_activate_default_eps_bearer_context_request(int pti, int ebi, +int esm_recv_activate_default_eps_bearer_context_request(nas_user_t *user, int pti, int ebi, const activate_default_eps_bearer_context_request_msg *msg); -int esm_recv_activate_dedicated_eps_bearer_context_request(int pti, int ebi, +int esm_recv_activate_dedicated_eps_bearer_context_request(nas_user_t *user, int pti, int ebi, const activate_dedicated_eps_bearer_context_request_msg *msg); -int esm_recv_deactivate_eps_bearer_context_request(int pti, int ebi, +int esm_recv_deactivate_eps_bearer_context_request(nas_user_t *user, int pti, int ebi, const deactivate_eps_bearer_context_request_msg *msg); diff --git a/openair3/NAS/UE/ESM/SAP/esm_sap.c b/openair3/NAS/UE/ESM/SAP/esm_sap.c old mode 100755 new mode 100644 index d23aa07390..42deac629e --- a/openair3/NAS/UE/ESM/SAP/esm_sap.c +++ b/openair3/NAS/UE/ESM/SAP/esm_sap.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_sap.c @@ -70,9 +63,9 @@ Description Defines the ESM Service Access Points at which the EPS /******************* L O C A L D E F I N I T I O N S *******************/ /****************************************************************************/ -static int _esm_sap_recv(int msg_type, int is_standalone, +static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, const OctetString *req, OctetString *rsp, esm_sap_error_t *err); -static int _esm_sap_send(int msg_type, int is_standalone, int pti, int ebi, +static int _esm_sap_send(nas_user_t *user, int msg_type, int is_standalone, int pti, int ebi, const esm_sap_data_t *data, OctetString *rsp); @@ -102,12 +95,6 @@ static const char *_esm_sap_primitive_str[] = { "ESM_UNITDATA_IND", }; -/* - * Buffer used to encode ESM messages before being returned to the EPS - * Mobility Management sublayer in order to be sent onto the network - */ -#define ESM_SAP_BUFFER_SIZE 4096 -static char _esm_sap_buffer[ESM_SAP_BUFFER_SIZE]; /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ @@ -151,9 +138,11 @@ void esm_sap_initialize(void) ** Others: None ** ** ** ***************************************************************************/ -int esm_sap_send(esm_sap_t *msg) +int esm_sap_send(nas_user_t *user, esm_sap_t *msg) { LOG_FUNC_IN; + esm_data_t *esm_data = user->esm_data; + msg->send.value = esm_data->send_buffer; int rc = RETURNerror; int pid; @@ -179,7 +168,7 @@ int esm_sap_send(esm_sap_t *msg) } /* Define new PDN context */ - rc = esm_proc_pdn_connectivity(pdn_connect->cid, TRUE, + rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, TRUE, pdn_connect->pdn_type, &apn, pdn_connect->is_emergency, NULL); @@ -191,13 +180,13 @@ int esm_sap_send(esm_sap_t *msg) if (pdn_connect->is_defined) { unsigned int pti; /* Assign new procedure transaction identity */ - rc = esm_proc_pdn_connectivity(pdn_connect->cid, TRUE, + rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, TRUE, pdn_connect->pdn_type, NULL, pdn_connect->is_emergency, &pti); if (rc != RETURNerror) { /* Send PDN connectivity request */ - rc = _esm_sap_send(PDN_CONNECTIVITY_REQUEST, + rc = _esm_sap_send(user, PDN_CONNECTIVITY_REQUEST, msg->is_standalone, pti, EPS_BEARER_IDENTITY_UNASSIGNED, &msg->data, &msg->send); @@ -213,16 +202,16 @@ int esm_sap_send(esm_sap_t *msg) if ( msg->is_standalone && pdn_connect->is_defined ) { /* Undefine the specified PDN context */ - rc = esm_proc_pdn_connectivity(pdn_connect->cid, FALSE, + rc = esm_proc_pdn_connectivity(user, pdn_connect->cid, FALSE, pdn_connect->pdn_type, NULL, pdn_connect->is_emergency, NULL); } else if (msg->recv != NULL) { /* The UE received a PDN connectivity reject message */ - rc = _esm_sap_recv(PDN_CONNECTIVITY_REJECT, msg->is_standalone, + rc = _esm_sap_recv(user, PDN_CONNECTIVITY_REJECT, msg->is_standalone, msg->recv, &msg->send, &msg->err); } else { /* The PDN connectivity procedure locally failed */ - rc = esm_proc_pdn_connectivity_failure(TRUE); + rc = esm_proc_pdn_connectivity_failure(user, TRUE); } } break; @@ -233,12 +222,12 @@ int esm_sap_send(esm_sap_t *msg) /* Get the procedure transaction identity and the EPS bearer * identity of the default bearer assigned to the PDN to * disconnect from */ - rc = esm_proc_pdn_disconnect(msg->data.pdn_disconnect.cid, + rc = esm_proc_pdn_disconnect(esm_data, msg->data.pdn_disconnect.cid, &pti, &ebi); if (rc != RETURNerror) { /* Send PDN disconnect request */ - rc = _esm_sap_send(PDN_DISCONNECT_REQUEST, TRUE, pti, ebi, + rc = _esm_sap_send(user, PDN_DISCONNECT_REQUEST, TRUE, pti, ebi, &msg->data, &msg->send); } } @@ -261,7 +250,7 @@ int esm_sap_send(esm_sap_t *msg) case ESM_DEFAULT_EPS_BEARER_CONTEXT_ACTIVATE_REQ: /* The UE received activate default ESP bearer context request */ - rc = _esm_sap_recv(ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST, + rc = _esm_sap_recv(user, ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST, msg->is_standalone, msg->recv, &msg->send, &msg->err); break; @@ -271,10 +260,10 @@ int esm_sap_send(esm_sap_t *msg) * The activate default ESP bearer context accept message * has been successfully delivered to the other side */ - rc = esm_proc_default_eps_bearer_context_complete(); + rc = esm_proc_default_eps_bearer_context_complete(user->default_eps_bearer_context_data); if (rc != RETURNerror) { - rc = esm_proc_pdn_connectivity_complete(); + rc = esm_proc_pdn_connectivity_complete(user); } break; @@ -283,10 +272,10 @@ int esm_sap_send(esm_sap_t *msg) /* * Default ESP bearer context activation procedure locally failed */ - rc = esm_proc_default_eps_bearer_context_failure(); + rc = esm_proc_default_eps_bearer_context_failure(user); if (rc != RETURNerror) { - rc = esm_proc_pdn_connectivity_failure(FALSE); + rc = esm_proc_pdn_connectivity_failure(user, FALSE); } break; @@ -314,7 +303,7 @@ int esm_sap_send(esm_sap_t *msg) /* * Locally deactivate EPS bearer context */ - rc = esm_proc_eps_bearer_context_deactivate(TRUE, + rc = esm_proc_eps_bearer_context_deactivate(user, TRUE, msg->data.eps_bearer_context_deactivate.ebi, &pid, &bid); } break; @@ -323,7 +312,7 @@ int esm_sap_send(esm_sap_t *msg) break; case ESM_UNITDATA_IND: - rc = _esm_sap_recv(-1, msg->is_standalone, msg->recv, + rc = _esm_sap_recv(user, -1, msg->is_standalone, msg->recv, &msg->send, &msg->err); break; @@ -365,10 +354,9 @@ int esm_sap_send(esm_sap_t *msg) ** turned upon ESM procedure completion ** ** err: Error code of the ESM procedure ** ** Return: RETURNok, RETURNerror ** - ** Others: _esm_sap_buffer ** ** ** ***************************************************************************/ -static int _esm_sap_recv(int msg_type, int is_standalone, +static int _esm_sap_recv(nas_user_t *user, int msg_type, int is_standalone, const OctetString *req, OctetString *rsp, esm_sap_error_t *err) { @@ -446,7 +434,7 @@ static int _esm_sap_recv(int msg_type, int is_standalone, * received from the MME */ esm_cause = esm_recv_activate_default_eps_bearer_context_request( - pti, ebi, + user, pti, ebi, &esm_msg.activate_default_eps_bearer_context_request); if ( (esm_cause == ESM_CAUSE_SUCCESS) || @@ -484,7 +472,7 @@ static int _esm_sap_recv(int msg_type, int is_standalone, * received from the MME */ esm_cause = esm_recv_activate_dedicated_eps_bearer_context_request( - pti, ebi, + user, pti, ebi, &esm_msg.activate_dedicated_eps_bearer_context_request); if ( (esm_cause == ESM_CAUSE_SUCCESS) || @@ -524,7 +512,7 @@ static int _esm_sap_recv(int msg_type, int is_standalone, * Process deactivate EPS bearer context request message * received from the MME */ - esm_cause = esm_recv_deactivate_eps_bearer_context_request(pti, ebi, + esm_cause = esm_recv_deactivate_eps_bearer_context_request(user, pti, ebi, &esm_msg.deactivate_eps_bearer_context_request); if ( (esm_cause == ESM_CAUSE_INVALID_PTI_VALUE) || @@ -560,7 +548,7 @@ static int _esm_sap_recv(int msg_type, int is_standalone, /* * Process PDN connectivity reject message received from the MME */ - esm_cause = esm_recv_pdn_connectivity_reject(pti, ebi, + esm_cause = esm_recv_pdn_connectivity_reject(user, pti, ebi, &esm_msg.pdn_connectivity_reject); if ( (esm_cause == ESM_CAUSE_INVALID_PTI_VALUE) || @@ -583,7 +571,7 @@ static int _esm_sap_recv(int msg_type, int is_standalone, /* * Process PDN disconnect reject message received from the MME */ - esm_cause = esm_recv_pdn_disconnect_reject(pti, ebi, + esm_cause = esm_recv_pdn_disconnect_reject(user, pti, ebi, &esm_msg.pdn_disconnect_reject); if ( (esm_cause == ESM_CAUSE_INVALID_PTI_VALUE) || @@ -648,16 +636,13 @@ static int _esm_sap_recv(int msg_type, int is_standalone, if ( (rc != RETURNerror) && (esm_procedure != NULL) ) { /* Encode the returned ESM response message */ - int size = esm_msg_encode(&esm_msg, (uint8_t *)_esm_sap_buffer, + int size = esm_msg_encode(&esm_msg, rsp->value, ESM_SAP_BUFFER_SIZE); - if (size > 0) { - rsp->length = size; - rsp->value = (uint8_t *)(_esm_sap_buffer); - } + rsp->length = size; /* Complete the relevant ESM procedure */ - rc = (*esm_procedure)(is_standalone, ebi, rsp, triggered_by_ue); + rc = (*esm_procedure)(user, is_standalone, ebi, rsp, triggered_by_ue); if (is_discarded) { /* Return indication that received message has been discarded */ @@ -697,10 +682,9 @@ static int _esm_sap_recv(int msg_type, int is_standalone, ** Outputs: rsp: The encoded ESM response message to be re- ** ** turned upon ESM procedure completion ** ** Return: RETURNok, RETURNerror ** - ** Others: _esm_sap_buffer ** ** ** ***************************************************************************/ -static int _esm_sap_send(int msg_type, int is_standalone, +static int _esm_sap_send(nas_user_t *user, int msg_type, int is_standalone, int pti, int ebi, const esm_sap_data_t *data, OctetString *rsp) { @@ -778,18 +762,15 @@ static int _esm_sap_send(int msg_type, int is_standalone, if (rc != RETURNerror) { /* Encode the returned ESM response message */ - int size = esm_msg_encode(&esm_msg, (uint8_t *)_esm_sap_buffer, + int size = esm_msg_encode(&esm_msg, rsp->value, ESM_SAP_BUFFER_SIZE); - if (size > 0) { - rsp->length = size; - rsp->value = (uint8_t *)(_esm_sap_buffer); - } - + rsp->length = size; /* Execute the relevant ESM procedure */ if (esm_procedure) { - rc = (*esm_procedure)(is_standalone, pti, rsp, sent_by_ue); + rc = (*esm_procedure)(user, is_standalone, pti, rsp, sent_by_ue); } + } LOG_FUNC_RETURN(rc); diff --git a/openair3/NAS/UE/ESM/SAP/esm_sap.h b/openair3/NAS/UE/ESM/SAP/esm_sap.h old mode 100755 new mode 100644 index 693185c473..28d6cda1db --- a/openair3/NAS/UE/ESM/SAP/esm_sap.h +++ b/openair3/NAS/UE/ESM/SAP/esm_sap.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_sap.h @@ -48,6 +41,7 @@ Description Defines the ESM Service Access Points at which the EPS #define __ESM_SAP_H__ #include "esm_sapDef.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -67,6 +61,6 @@ Description Defines the ESM Service Access Points at which the EPS void esm_sap_initialize(void); -int esm_sap_send(esm_sap_t *msg); +int esm_sap_send(nas_user_t *user, esm_sap_t *msg); #endif /* __ESM_SAP_H__*/ diff --git a/openair3/NAS/UE/ESM/SAP/esm_sapDef.h b/openair3/NAS/UE/ESM/SAP/esm_sapDef.h old mode 100755 new mode 100644 index 2430696319..4ff7c7e9dd --- a/openair3/NAS/UE/ESM/SAP/esm_sapDef.h +++ b/openair3/NAS/UE/ESM/SAP/esm_sapDef.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_sapDef.h diff --git a/openair3/NAS/UE/ESM/SAP/esm_send.c b/openair3/NAS/UE/ESM/SAP/esm_send.c old mode 100755 new mode 100644 index 51cd96fdc8..020d9d89e3 --- a/openair3/NAS/UE/ESM/SAP/esm_send.c +++ b/openair3/NAS/UE/ESM/SAP/esm_send.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_send.c diff --git a/openair3/NAS/UE/ESM/SAP/esm_send.h b/openair3/NAS/UE/ESM/SAP/esm_send.h old mode 100755 new mode 100644 index 8f4056df6f..f97454027a --- a/openair3/NAS/UE/ESM/SAP/esm_send.h +++ b/openair3/NAS/UE/ESM/SAP/esm_send.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_send.h diff --git a/openair3/NAS/UE/ESM/esmData.h b/openair3/NAS/UE/ESM/esmData.h old mode 100755 new mode 100644 index 7571e25e64..16f4707a37 --- a/openair3/NAS/UE/ESM/esmData.h +++ b/openair3/NAS/UE/ESM/esmData.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esmData.h @@ -59,11 +52,23 @@ Description Defines internal private data handled by EPS Session /* Total number of active EPS bearers */ #define ESM_DATA_EPS_BEARER_TOTAL 11 +#define ESM_SAP_BUFFER_SIZE 4096 /****************************************************************************/ /************************ G L O B A L T Y P E S ************************/ /****************************************************************************/ +/* + * -------------------------------------------------------------------------- + * Internal data handled by the default EPS bearer context activation + * procedure in the UE + * -------------------------------------------------------------------------- + */ +typedef struct { + int ebi; /* EPS bearer identity of the default EPS bearer associated + * to the PDN connection to be activated */ +} default_eps_bearer_context_data_t; + /* * Minimal and maximal value of an EPS bearer identity: * The EPS Bearer Identity (EBI) identifies a message flow @@ -79,8 +84,6 @@ typedef enum { ESM_EBR_STATE_MAX } esm_ebr_state; - - /* * ----------------------- * EPS bearer context data @@ -179,6 +182,7 @@ typedef struct esm_data_context_s { } pdn[ESM_DATA_PDN_MAX+1]; esm_ebr_data_t ebr; + uint8_t send_buffer[ESM_SAP_BUFFER_SIZE]; } esm_data_context_t; /* @@ -192,27 +196,16 @@ typedef struct esm_data_context_s { */ typedef esm_data_context_t esm_data_t; - /****************************************************************************/ /******************** G L O B A L V A R I A B L E S ********************/ /****************************************************************************/ -/* - * ESM internal data (used within ESM only) - * ---------------------------------------- - */ -esm_data_t _esm_data; - /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -extern char ip_addr_str[100]; - -extern char *esm_data_get_ipv4_addr(const OctetString *ip_addr); - -extern char *esm_data_get_ipv6_addr(const OctetString *ip_addr); - -extern char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr); +char *esm_data_get_ipv4_addr(const OctetString *ip_addr, char *ret); +char *esm_data_get_ipv6_addr(const OctetString *ip_addr, char *ret); +char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr, char *ret); #endif /* __ESMDATA_H__*/ diff --git a/openair3/NAS/UE/ESM/esm_ebr.c b/openair3/NAS/UE/ESM/esm_ebr.c old mode 100755 new mode 100644 index b305dc778b..a1d78bc62c --- a/openair3/NAS/UE/ESM/esm_ebr.c +++ b/openair3/NAS/UE/ESM/esm_ebr.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_ebr.c @@ -51,15 +44,13 @@ Description Defines functions used to handle state of EPS bearer contexts #include "esm_ebr.h" #include "commonDef.h" #include "nas_log.h" +#include "utils.h" /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ -#define ESM_EBR_NB_UE_MAX 1 - - /****************************************************************************/ /******************* L O C A L D E F I N I T I O N S *******************/ /****************************************************************************/ @@ -70,16 +61,6 @@ static const char *_esm_ebr_state_str[ESM_EBR_STATE_MAX] = { "BEARER CONTEXT ACTIVE", }; -/* - * ---------------------------------- - * List of EPS bearer contexts per UE - * ---------------------------------- - */ - -#if !defined(NAS_BUILT_IN_EPC) -static esm_ebr_data_t _esm_ebr_data[ESM_EBR_NB_UE_MAX]; -#endif - /* * ---------------------- * User notification data @@ -109,7 +90,7 @@ static const network_pdn_state_t _esm_ebr_pdn_state[2][2][2] = { /* Returns the index of the next available entry in the list of EPS bearer * context data */ -static int _esm_ebr_get_available_entry(unsigned int ueid); +static int _esm_ebr_get_available_entry(esm_ebr_data_t *esm_ebr_data); /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ @@ -126,41 +107,46 @@ static int _esm_ebr_get_available_entry(unsigned int ueid); ** ** ** Outputs: None ** ** Return: None ** - ** Others: _esm_ebr_data ** ** ** ***************************************************************************/ -void esm_ebr_initialize( - esm_indication_callback_t cb -) + +esm_ebr_data_t *esm_ebr_initialize(void) { -#if !defined(NAS_BUILT_IN_EPC) - int ueid, i; LOG_FUNC_IN; - for (ueid = 0; ueid < ESM_EBR_NB_UE_MAX; ueid++) { - _esm_ebr_data[ueid].index = 0; + int i; + esm_ebr_data_t *esm_ebr_data = calloc_or_fail(sizeof(esm_ebr_data_t)); - /* Initialize EPS bearer context data */ - for (i = 0; i < ESM_EBR_DATA_SIZE + 1; i++) { - _esm_ebr_data[ueid].context[i] = NULL; - } + esm_ebr_data->index = 0; + + /* Initialize EPS bearer context data */ + for (i = 0; i < ESM_EBR_DATA_SIZE + 1; i++) { + esm_ebr_data->context[i] = NULL; } + LOG_FUNC_OUT; + return esm_ebr_data; +} + +void esm_ebr_register_callback(esm_indication_callback_t cb) +{ + + LOG_FUNC_IN; + /* Initialize the user notification callback */ _esm_ebr_callback = *cb; LOG_FUNC_OUT; -#endif } + /**************************************************************************** ** ** ** Name: esm_ebr_assign() ** ** ** ** Description: Assigns a new EPS bearer context ** ** ** - ** Inputs: ueid: Lower layers UE identifier ** ** ebi: Identity of the new EPS bearer context ** ** cid: Identifier of the PDN context the EPS bea- ** ** rer context is associated to ** @@ -172,18 +158,16 @@ void esm_ebr_initialize( ** Return: The identity of the new EPS bearer context ** ** if successfully assigned; ** ** the not assigned EBI (0) otherwise. ** - ** Others: _esm_ebr_data ** ** ** ***************************************************************************/ -int esm_ebr_assign(int ebi, int cid, int default_ebr) +int esm_ebr_assign(esm_ebr_data_t *esm_ebr_data, int ebi, int cid, int default_ebr) { esm_ebr_context_t *ebr_ctx = NULL; - unsigned int ueid = 0; int i; LOG_FUNC_IN; - ebr_ctx = _esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN]; + ebr_ctx = esm_ebr_data->context[ebi - ESM_EBI_MIN]; if (ebi != ESM_EBI_UNASSIGNED) { @@ -199,7 +183,7 @@ int esm_ebr_assign(int ebi, int cid, int default_ebr) i = ebi - ESM_EBI_MIN; } else { /* Search for an available EPS bearer identity */ - i = _esm_ebr_get_available_entry(ueid); + i = _esm_ebr_get_available_entry(esm_ebr_data); if (i < 0) { LOG_FUNC_RETURN(ESM_EBI_UNASSIGNED); @@ -218,10 +202,10 @@ int esm_ebr_assign(int ebi, int cid, int default_ebr) } - _esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN] = ebr_ctx; + esm_ebr_data->context[ebi - ESM_EBI_MIN] = ebr_ctx; /* Store the index of the next available EPS bearer identity */ - _esm_ebr_data[ueid].index = i + 1; + esm_ebr_data->index = i + 1; /* Set the EPS bearer identity */ ebr_ctx->ebi = ebi; @@ -242,7 +226,7 @@ int esm_ebr_assign(int ebi, int cid, int default_ebr) ** ** ** Description: Release the given EPS bearer identity ** ** ** - ** Inputs: ueid: Lower layers UE identifier ** + ** Inputs: ** ** ebi: The identity of the EPS bearer context to ** ** be released ** ** Others: None ** @@ -251,13 +235,11 @@ int esm_ebr_assign(int ebi, int cid, int default_ebr) ** Return: RETURNok if the EPS bearer context has ** ** been successfully released; ** ** RETURNerror otherwise. ** - ** Others: _esm_ebr_data ** ** ** ***************************************************************************/ -int esm_ebr_release( +int esm_ebr_release(esm_ebr_data_t *esm_ebr_data, int ebi) { - unsigned int ueid = 0; esm_ebr_context_t *ebr_ctx; LOG_FUNC_IN; @@ -267,7 +249,7 @@ int esm_ebr_release( } /* Get EPS bearer context data */ - ebr_ctx = _esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN]; + ebr_ctx = esm_ebr_data->context[ebi - ESM_EBI_MIN]; if ( (ebr_ctx == NULL) || (ebr_ctx->ebi != ebi) ) { /* EPS bearer context not assigned */ @@ -297,7 +279,6 @@ int esm_ebr_release( ** Description: Set the status of the specified EPS bearer context to the ** ** given state ** ** ** - ** Inputs: ueid: Lower layers UE identifier ** ** ebi: The identity of the EPS bearer ** ** status: The new EPS bearer context status ** ** ue_requested: TRUE/FALSE if the modification of the EPS ** @@ -307,10 +288,9 @@ int esm_ebr_release( ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _esm_ebr_data ** ** ** ***************************************************************************/ -int esm_ebr_set_status( +int esm_ebr_set_status(user_api_id_t *user_api_id, esm_ebr_data_t *esm_ebr_data, int ebi, esm_ebr_state status, int ue_requested) { esm_ebr_context_t *ebr_ctx; @@ -318,19 +298,13 @@ int esm_ebr_set_status( LOG_FUNC_IN; - unsigned int ueid = 0; - - if (ueid >= ESM_EBR_NB_UE_MAX) { - LOG_FUNC_RETURN (RETURNerror); - } - if ( (ebi < ESM_EBI_MIN) || (ebi > ESM_EBI_MAX) ) { LOG_FUNC_RETURN (RETURNerror); } /* Get EPS bearer context data */ - ebr_ctx = _esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN]; + ebr_ctx = esm_ebr_data->context[ebi - ESM_EBI_MIN]; if ( (ebr_ctx == NULL) || (ebr_ctx->ebi != ebi) ) { /* EPS bearer context not assigned */ @@ -351,7 +325,7 @@ int esm_ebr_set_status( /* * Notify the user that the state of the EPS bearer has changed */ - (*_esm_ebr_callback)(ebr_ctx->cid, + (*_esm_ebr_callback)(user_api_id, ebr_ctx->cid, _esm_ebr_pdn_state[ue_requested][ebr_ctx->is_default_ebr][status]); LOG_FUNC_RETURN (RETURNok); } @@ -367,9 +341,7 @@ int esm_ebr_set_status( ** Description: Get the current status value of the specified EPS bearer ** ** context ** ** ** - ** Inputs: ueid: Lower layers UE identifier ** ** ebi: The identity of the EPS bearer ** - ** Others: _esm_ebr_data ** ** ** ** Outputs: None ** ** Return: The current value of the EPS bearer con- ** @@ -378,26 +350,25 @@ int esm_ebr_set_status( ** ** ***************************************************************************/ -esm_ebr_state esm_ebr_get_status( +esm_ebr_state esm_ebr_get_status(esm_ebr_data_t *esm_ebr_data, int ebi) { - unsigned int ueid = 0; if ( (ebi < ESM_EBI_MIN) || (ebi > ESM_EBI_MAX) ) { return (ESM_EBR_INACTIVE); } - if (_esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN] == NULL) { + if (esm_ebr_data->context[ebi - ESM_EBI_MIN] == NULL) { /* EPS bearer context not allocated */ return (ESM_EBR_INACTIVE); } - if (_esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN]->ebi != ebi) { + if (esm_ebr_data->context[ebi - ESM_EBI_MIN]->ebi != ebi) { /* EPS bearer context not assigned */ return (ESM_EBR_INACTIVE); } - return (_esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN]->status); + return (esm_ebr_data->context[ebi - ESM_EBI_MIN]->status); } /**************************************************************************** @@ -415,7 +386,7 @@ esm_ebr_state esm_ebr_get_status( ** Others: None ** ** ** ***************************************************************************/ -int esm_ebr_is_reserved(int ebi) +int esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi) { return ( (ebi != ESM_EBI_UNASSIGNED) && (ebi < ESM_EBI_MIN) ); } @@ -427,23 +398,20 @@ int esm_ebr_is_reserved(int ebi) ** Description: Check whether the given EPS bearer identity does not ** ** match an assigned EBI value currently in use ** ** ** - ** Inputs: ueid: Lower layers UE identifier ** ** ebi: The identity of the EPS bearer ** - ** Others: _esm_ebr_data ** ** ** ** Outputs: None ** ** Return: TRUE, FALSE ** ** Others: None ** ** ** ***************************************************************************/ -int esm_ebr_is_not_in_use( +int esm_ebr_is_not_in_use(esm_ebr_data_t *esm_ebr_data, int ebi) { - unsigned int ueid = 0; return ( (ebi == ESM_EBI_UNASSIGNED) || - (_esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN] == NULL) || - (_esm_ebr_data[ueid].context[ebi - ESM_EBI_MIN]->ebi) != ebi); + (esm_ebr_data->context[ebi - ESM_EBI_MIN] == NULL) || + (esm_ebr_data->context[ebi - ESM_EBI_MIN]->ebi) != ebi); } /****************************************************************************/ @@ -457,8 +425,6 @@ int esm_ebr_is_not_in_use( ** Description: Returns the index of the next available entry in the list ** ** of EPS bearer context data ** ** ** - ** Inputs: ueid: Lower layers UE identifier ** - ** Others: _esm_ebr_data ** ** ** ** Outputs: None ** ** Return: The index of the next available EPS bearer ** @@ -467,20 +433,20 @@ int esm_ebr_is_not_in_use( ** Others: None ** ** ** ***************************************************************************/ -static int _esm_ebr_get_available_entry(unsigned int ueid) +static int _esm_ebr_get_available_entry(esm_ebr_data_t *esm_ebr_data) { int i; - for (i = _esm_ebr_data[ueid].index; i < ESM_EBR_DATA_SIZE; i++) { - if (_esm_ebr_data[ueid].context[i] != NULL) { + for (i = esm_ebr_data->index; i < ESM_EBR_DATA_SIZE; i++) { + if (esm_ebr_data->context[i] != NULL) { continue; } return i; } - for (i = 0; i < _esm_ebr_data[ueid].index; i++) { - if (_esm_ebr_data[ueid].context[i] != NULL) { + for (i = 0; i < esm_ebr_data->index; i++) { + if (esm_ebr_data->context[i] != NULL) { continue; } diff --git a/openair3/NAS/UE/ESM/esm_ebr.h b/openair3/NAS/UE/ESM/esm_ebr.h old mode 100755 new mode 100644 index 1298aa1243..dece5c3645 --- a/openair3/NAS/UE/ESM/esm_ebr.h +++ b/openair3/NAS/UE/ESM/esm_ebr.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_ebr.h @@ -49,8 +42,10 @@ Description Defines functions used to handle state of EPS bearer contexts #include "OctetString.h" #include "networkDef.h" +#include "esmData.h" #include "nas_timer.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -63,6 +58,13 @@ Description Defines functions used to handle state of EPS bearer contexts /************************ G L O B A L T Y P E S ************************/ /****************************************************************************/ +/* + * User notification callback, executed whenever a change of status with + * respect of PDN connection or EPS bearer context is notified by the EPS + * Session Management sublayer + */ +typedef int (*esm_indication_callback_t) (user_api_id_t *user_api_id, int, network_pdn_state_t); + /****************************************************************************/ /******************** G L O B A L V A R I A B L E S ********************/ /****************************************************************************/ @@ -71,15 +73,17 @@ Description Defines functions used to handle state of EPS bearer contexts /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -int esm_ebr_is_reserved(int ebi); +void esm_ebr_register_callback(esm_indication_callback_t cb); -void esm_ebr_initialize(esm_indication_callback_t cb); -int esm_ebr_assign(int ebi, int cid, int default_ebr); -int esm_ebr_release(int ebi); +int esm_ebr_is_reserved(esm_ebr_data_t *esm_ebr_data, int ebi); -int esm_ebr_set_status(int ebi, esm_ebr_state status, int ue_requested); -esm_ebr_state esm_ebr_get_status(int ebi); +esm_ebr_data_t *esm_ebr_initialize(void); +int esm_ebr_assign(esm_ebr_data_t *esm_ebr_data, int ebi, int cid, int default_ebr); +int esm_ebr_release(esm_ebr_data_t *esm_ebr_data, int ebi); -int esm_ebr_is_not_in_use(int ebi); +int esm_ebr_set_status(user_api_id_t *user_api_id, esm_ebr_data_t *esm_ebr_data, int ebi, esm_ebr_state status, int ue_requested); +esm_ebr_state esm_ebr_get_status(esm_ebr_data_t *esm_ebr_data, int ebi); + +int esm_ebr_is_not_in_use(esm_ebr_data_t *esm_ebr_data, int ebi); #endif /* __ESM_EBR_H__*/ diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.c b/openair3/NAS/UE/ESM/esm_ebr_context.c old mode 100755 new mode 100644 index 539403f7e4..e2a327f488 --- a/openair3/NAS/UE/ESM/esm_ebr_context.c +++ b/openair3/NAS/UE/ESM/esm_ebr_context.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_ebr_context.h @@ -54,6 +47,7 @@ Description Defines functions used to handle EPS bearer contexts. #include "esm_ebr_context.h" #include "emm_sap.h" +#include "system.h" #if defined(ENABLE_ITTI) # include "assertions.h" @@ -89,36 +83,33 @@ static int _esm_ebr_context_check_precedence(const network_tft_t *, ** Description: Creates a new EPS bearer context to the PDN with the spe- ** ** cified PDN connection identifier ** ** ** - ** Inputs: ueid: UE identifier ** + ** Inputs: ** ** pid: PDN connection identifier ** ** ebi: EPS bearer identity ** ** is_default: TRUE if the new bearer is a default EPS ** ** bearer context ** ** esm_qos: EPS bearer level QoS parameters ** ** tft: Traffic flow template parameters ** - ** Others: _esm_data ** ** ** ** Outputs: None ** ** Return: The EPS bearer identity of the default EPS ** ** bearer associated to the new EPS bearer ** ** context if successfully created; ** ** UNASSIGN EPS bearer value otherwise. ** - ** Others: _esm_data ** ** ** ***************************************************************************/ int esm_ebr_context_create( - + esm_data_t *esm_data, int ueid, int pid, int ebi, int is_default, const network_qos_t *qos, const network_tft_t *tft) { int bid = 0; esm_data_context_t *esm_ctx = NULL; esm_pdn_t *pdn = NULL; - //unsigned int ueid = 0; LOG_FUNC_IN; - esm_ctx = &_esm_data; + esm_ctx = esm_data; bid = ESM_DATA_EPS_BEARER_MAX; @@ -216,7 +207,7 @@ int esm_ebr_context_create( char *netmask = NULL; char broadcast[INET_ADDRSTRLEN]; struct in_addr in_addr; - char command_line[128]; + char command_line[500]; int res; switch (pdn->type) { @@ -282,15 +273,32 @@ int esm_ebr_context_create( } res = sprintf(command_line, - "ifconfig oip1 %s netmask %s broadcast %s", - ipv4_addr, netmask, broadcast); - (void)res; /* avoid gcc warning "set but not used" */ - // AssertFatal((res > 0) && (res < 128), - // "error in system command line"); + "ifconfig oip%d %s netmask %s broadcast %s up && " + "ip rule add from %s/32 table %d && " + "ip rule add to %s/32 table %d && " + "ip route add default dev oip%d table %d", + ueid + 1, ipv4_addr, netmask, broadcast, + ipv4_addr, ueid + 201, + ipv4_addr, ueid + 201, + ueid + 1, ueid + 201); + if ( res<0 ) { + LOG_TRACE(WARNING, "ESM-PROC - Failed to system command string"); + } LOG_TRACE(INFO, "ESM-PROC - executing %s ", command_line); - if (system(command_line)) ; /* TODO: what to do? */ + /* Calling system() here disrupts UE's realtime processing in some cases. + * This may be because of the call to fork(), which, for some + * unidentified reason, interacts badly with other (realtime) threads. + * background_system() is a replacement mechanism relying on a + * background process that does the system() and reports result to + * the parent process (lte-softmodem, oaisim, ...). The background + * process is created very early in the life of the parent process. + * The processes interact through standard pipes. See + * common/utils/system.c for details. + */ + if (background_system(command_line) != 0) + LOG_TRACE(ERROR, "ESM-PROC - failed command '%s'", command_line); break; @@ -323,9 +331,8 @@ int esm_ebr_context_create( ** Description: Releases EPS bearer context entry previously allocated ** ** to the EPS bearer with the specified EPS bearer identity ** ** ** - ** Inputs: ueid: UE identifier ** + ** Inputs: ** ** ebi: EPS bearer identity ** - ** Others: _esm_data ** ** ** ** Outputs: pid: Identifier of the PDN connection entry the ** ** EPS bearer context belongs to ** @@ -334,22 +341,20 @@ int esm_ebr_context_create( ** Return: The EPS bearer identity associated to the ** ** EPS bearer context if successfully relea- ** ** sed; UNASSIGN EPS bearer value otherwise. ** - ** Others: _esm_data ** ** ** ***************************************************************************/ -int esm_ebr_context_release( - +int esm_ebr_context_release(nas_user_t *user, int ebi, int *pid, int *bid) { int found = FALSE; esm_pdn_t *pdn = NULL; esm_data_context_t *esm_ctx; - - //unsigned int ueid = 0; + esm_ebr_data_t *esm_ebr_data = user->esm_ebr_data; + user_api_id_t *user_api_id = user->user_api_id; LOG_FUNC_IN; - esm_ctx = &_esm_data; + esm_ctx = user->esm_data; if (ebi != ESM_EBI_UNASSIGNED) { /* @@ -463,11 +468,11 @@ int esm_ebr_context_release( } /* Set the EPS bearer context state to INACTIVE */ - (void) esm_ebr_set_status(pdn->bearer[i]->ebi, + esm_ebr_set_status(user_api_id, esm_ebr_data, pdn->bearer[i]->ebi, ESM_EBR_INACTIVE, TRUE); /* Release EPS bearer data */ - (void) esm_ebr_release(pdn->bearer[i]->ebi); + esm_ebr_release(esm_ebr_data, pdn->bearer[i]->ebi); // esm_ebr_release() /* Release dedicated EPS bearer data */ @@ -499,7 +504,7 @@ int esm_ebr_context_release( emm_sap_t emm_sap; emm_sap.primitive = EMMESM_ESTABLISH_CNF; emm_sap.u.emm_esm.u.establish.is_attached = FALSE; - (void) emm_sap_send(&emm_sap); + (void) emm_sap_send(user, &emm_sap); } /* 3GPP TS 24.301, section 6.4.4.3, 6.4.4.6 * If due to the EPS bearer context deactivation only the PDN @@ -512,7 +517,7 @@ int esm_ebr_context_release( emm_sap.primitive = EMMESM_ESTABLISH_CNF; emm_sap.u.emm_esm.u.establish.is_attached = TRUE; emm_sap.u.emm_esm.u.establish.is_emergency = TRUE; - (void) emm_sap_send(&emm_sap); + (void) emm_sap_send(user, &emm_sap); } LOG_FUNC_RETURN (ebi); @@ -531,7 +536,6 @@ int esm_ebr_context_release( ** ** ** Inputs: ebi: The EPS bearer identity of the default EPS ** ** bearer context ** - ** Others: _esm_data ** ** ** ** Outputs: None ** ** Return: The identifier of the PDN connection entry ** @@ -540,22 +544,22 @@ int esm_ebr_context_release( ** Others: None ** ** ** ***************************************************************************/ -int esm_ebr_context_get_pid(int ebi) +int esm_ebr_context_get_pid(esm_data_t *esm_data, int ebi) { LOG_FUNC_IN; int pid; for (pid = 0; pid < ESM_DATA_PDN_MAX; pid++) { - if (_esm_data.pdn[pid].data == NULL) { + if (esm_data->pdn[pid].data == NULL) { continue; } - if (_esm_data.pdn[pid].data->bearer[0] == NULL) { + if (esm_data->pdn[pid].data->bearer[0] == NULL) { continue; } - if (_esm_data.pdn[pid].data->bearer[0]->ebi == ebi) { + if (esm_data->pdn[pid].data->bearer[0]->ebi == ebi) { break; } } @@ -583,14 +587,13 @@ int esm_ebr_context_get_pid(int ebi) ** tft: The traffic flow template (set of packet ** ** filters) to be checked ** ** operation: Traffic flow template operation ** - ** Others: _esm_data ** ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** ** Others: None ** ** ** ***************************************************************************/ -int esm_ebr_context_check_tft(int pid, int ebi, +int esm_ebr_context_check_tft(esm_data_t *esm_data, int pid, int ebi, const network_tft_t *tft, esm_ebr_context_tft_t operation) { @@ -600,14 +603,14 @@ int esm_ebr_context_check_tft(int pid, int ebi, int i; if (pid < ESM_DATA_PDN_MAX) { - if (pid != _esm_data.pdn[pid].pid) { + if (pid != esm_data->pdn[pid].pid) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection identifier %d " "is not valid", pid); - } else if (_esm_data.pdn[pid].data == NULL) { + } else if (esm_data->pdn[pid].data == NULL) { LOG_TRACE(ERROR, "ESM-PROC - PDN connection %d has not been " "allocated", pid); } else if (operation == ESM_EBR_CONTEXT_TFT_CREATE) { - esm_pdn_t *pdn = _esm_data.pdn[pid].data; + esm_pdn_t *pdn = esm_data->pdn[pid].data; /* For each EPS bearer context associated to the PDN connection */ for (i = 0; i < pdn->n_bearers; i++) { diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.h b/openair3/NAS/UE/ESM/esm_ebr_context.h old mode 100755 new mode 100644 index a93fb94eb1..d7dfb1da70 --- a/openair3/NAS/UE/ESM/esm_ebr_context.h +++ b/openair3/NAS/UE/ESM/esm_ebr_context.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_ebr_context.h @@ -46,6 +39,7 @@ Description Defines functions used to handle EPS bearer contexts. #define __ESM_EBR_CONTEXT_H__ #include "networkDef.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -72,14 +66,14 @@ typedef enum { /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -int esm_ebr_context_create(int pid, int ebi, int is_default, +int esm_ebr_context_create(esm_data_t *esm_data, int ueid, int pid, int ebi, int is_default, const network_qos_t *qos, const network_tft_t *tft); -int esm_ebr_context_release(int ebi, int *pid, int *bid); +int esm_ebr_context_release(nas_user_t *user, int ebi, int *pid, int *bid); -int esm_ebr_context_get_pid(int ebi); +int esm_ebr_context_get_pid(esm_data_t *esm_data, int ebi); -int esm_ebr_context_check_tft(int pid, int ebi, const network_tft_t *tft, +int esm_ebr_context_check_tft(esm_data_t *esm_data, int pid, int ebi, const network_tft_t *tft, esm_ebr_context_tft_t operation); diff --git a/openair3/NAS/UE/ESM/esm_ip.c b/openair3/NAS/UE/ESM/esm_ip.c old mode 100755 new mode 100644 index 041d186b8d..55be45d182 --- a/openair3/NAS/UE/ESM/esm_ip.c +++ b/openair3/NAS/UE/ESM/esm_ip.c @@ -1,73 +1,64 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include "emmData.h" #include "esmData.h" -char ip_addr_str[100]; - -inline char *esm_data_get_ipv4_addr(const OctetString *ip_addr) +char *esm_data_get_ipv4_addr(const OctetString *ip_addr, char *ret) { if (ip_addr->length > 0) { - sprintf(ip_addr_str, "%u.%u.%u.%u", + sprintf(ret, "%u.%u.%u.%u", ip_addr->value[0], ip_addr->value[1], ip_addr->value[2], ip_addr->value[3]); - return ip_addr_str; + return ret; } return (NULL); } -inline char *esm_data_get_ipv6_addr(const OctetString *ip_addr) +char *esm_data_get_ipv6_addr(const OctetString *ip_addr, char *ret) { if (ip_addr->length > 0) { - sprintf(ip_addr_str, "%x%.2x:%x%.2x:%x%.2x:%x%.2x", + sprintf(ret, "%x%.2x:%x%.2x:%x%.2x:%x%.2x", ip_addr->value[0], ip_addr->value[1], ip_addr->value[2], ip_addr->value[3], ip_addr->value[4], ip_addr->value[5], ip_addr->value[6], ip_addr->value[7]); - return ip_addr_str; + return ret; } return (NULL); } -inline char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr) +char *esm_data_get_ipv4v6_addr(const OctetString *ip_addr, char *ret) { if (ip_addr->length > 0) { - sprintf(ip_addr_str, "%u.%u.%u.%u / %x%.2x:%x%.2x:%x%.2x:%x%.2x", + sprintf(ret, "%u.%u.%u.%u / %x%.2x:%x%.2x:%x%.2x:%x%.2x", ip_addr->value[0], ip_addr->value[1], ip_addr->value[2], ip_addr->value[3], ip_addr->value[4], ip_addr->value[5], ip_addr->value[6], ip_addr->value[7], ip_addr->value[8], ip_addr->value[9], ip_addr->value[10], ip_addr->value[11]); - return ip_addr_str; + return ret; } return (NULL); diff --git a/openair3/NAS/UE/ESM/esm_main.c b/openair3/NAS/UE/ESM/esm_main.c old mode 100755 new mode 100644 index f507b0a53f..288e748679 --- a/openair3/NAS/UE/ESM/esm_main.c +++ b/openair3/NAS/UE/ESM/esm_main.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_main.c @@ -47,11 +40,13 @@ Description Defines the EPS Session Management procedure call manager, #include "esm_main.h" #include "commonDef.h" #include "nas_log.h" +#include "utils.h" #include "emmData.h" #include "esmData.h" #include "esm_pt.h" #include "esm_ebr.h" +#include "user_defs.h" /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ @@ -76,35 +71,46 @@ Description Defines the EPS Session Management procedure call manager, ** ** ** Outputs: None ** ** Return: None ** - ** Others: _esm_data ** ** ** ***************************************************************************/ -void esm_main_initialize(esm_indication_callback_t cb) +void esm_main_initialize(nas_user_t *user, esm_indication_callback_t cb) { LOG_FUNC_IN; int i; + esm_data_t *esm_data = calloc_or_fail(sizeof(esm_data_t)); + user->esm_data = esm_data; + + default_eps_bearer_context_data_t *default_eps_bearer_context = calloc(1, sizeof(default_eps_bearer_context_data_t)); + if ( default_eps_bearer_context == NULL ) { + LOG_TRACE(ERROR, "ESM-MAIN - Can't malloc default_eps_bearer_context"); + exit(EXIT_FAILURE); + } + default_eps_bearer_context->ebi = ESM_EBI_UNASSIGNED; + user->default_eps_bearer_context_data = default_eps_bearer_context; /* Total number of active EPS bearer contexts */ - _esm_data.n_ebrs = 0; + esm_data->n_ebrs = 0; /* List of active PDN connections */ - _esm_data.n_pdns = 0; + esm_data->n_pdns = 0; for (i = 0; i < ESM_DATA_PDN_MAX + 1; i++) { - _esm_data.pdn[i].pid = -1; - _esm_data.pdn[i].is_active = FALSE; - _esm_data.pdn[i].data = NULL; + esm_data->pdn[i].pid = -1; + esm_data->pdn[i].is_active = FALSE; + esm_data->pdn[i].data = NULL; } /* Emergency bearer services indicator */ - _esm_data.emergency = FALSE; + esm_data->emergency = FALSE; /* Initialize the procedure transaction identity manager */ - esm_pt_initialize(); + + user->esm_pt_data = esm_pt_initialize(); /* Initialize the EPS bearer context manager */ - esm_ebr_initialize(cb); - + user->esm_ebr_data = esm_ebr_initialize(); + // FIXME only one callback for all user or many for many ? + esm_ebr_register_callback(cb); LOG_FUNC_OUT; } @@ -123,7 +129,7 @@ void esm_main_initialize(esm_indication_callback_t cb) ** Others: None ** ** ** ***************************************************************************/ -void esm_main_cleanup(void) +void esm_main_cleanup(esm_data_t *esm_data) { LOG_FUNC_IN; @@ -134,8 +140,8 @@ void esm_main_cleanup(void) /* De-activate EPS bearers and clean up PDN connections */ for (pid = 0; pid < ESM_DATA_PDN_MAX; pid++) { - if (_esm_data.pdn[pid].data) { - esm_pdn_t *pdn = _esm_data.pdn[pid].data; + if (esm_data->pdn[pid].data) { + esm_pdn_t *pdn = esm_data->pdn[pid].data; if (pdn->apn.length > 0) { free(pdn->apn.value); @@ -159,7 +165,7 @@ void esm_main_cleanup(void) } /* Release the PDN connection */ - free(_esm_data.pdn[pid].data); + free(esm_data->pdn[pid].data); } } } @@ -175,7 +181,6 @@ void esm_main_cleanup(void) ** a defined state at the same time ** ** ** ** Inputs: None ** - ** Others: _esm_data ** ** ** ** Outputs: None ** ** Return: The maximum number of PDN connections that ** @@ -183,7 +188,7 @@ void esm_main_cleanup(void) ** Others: None ** ** ** ***************************************************************************/ -int esm_main_get_nb_pdns_max(void) +int esm_main_get_nb_pdns_max(esm_data_t *esm_data) { LOG_FUNC_IN; @@ -197,18 +202,17 @@ int esm_main_get_nb_pdns_max(void) ** Description: Get the number of active PDN connections ** ** ** ** Inputs: None ** - ** Others: _esm_data ** ** ** ** Outputs: None ** ** Return: The number of active PDN connections ** ** Others: None ** ** ** ***************************************************************************/ -int esm_main_get_nb_pdns(void) +int esm_main_get_nb_pdns(esm_data_t *esm_data) { LOG_FUNC_IN; - LOG_FUNC_RETURN (_esm_data.n_pdns); + LOG_FUNC_RETURN (esm_data->n_pdns); } /**************************************************************************** @@ -219,7 +223,6 @@ int esm_main_get_nb_pdns(void) ** vices is established ** ** ** ** Inputs: None ** - ** Others: _esm_data ** ** ** ** Outputs: None ** ** Return: TRUE if a PDN connection for emergency ** @@ -227,11 +230,11 @@ int esm_main_get_nb_pdns(void) ** Others: None ** ** ** ***************************************************************************/ -int esm_main_has_emergency(void) +int esm_main_has_emergency(esm_data_t *esm_data) { LOG_FUNC_IN; - LOG_FUNC_RETURN (_esm_data.emergency); + LOG_FUNC_RETURN (esm_data->emergency); } /**************************************************************************** @@ -241,7 +244,6 @@ int esm_main_has_emergency(void) ** Description: Get the status of the specified PDN connection ** ** ** ** Inputs: cid: PDN connection identifier ** - ** Others: _esm_data ** ** ** ** Outputs: state: TRUE if the current state of the PDN con- ** ** nection is ACTIVE; FALSE otherwise. ** @@ -252,28 +254,30 @@ int esm_main_has_emergency(void) ** Others: None ** ** ** ***************************************************************************/ -int esm_main_get_pdn_status(int cid, int *state) +int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state) { LOG_FUNC_IN; unsigned int pid = cid - 1; + esm_data_t *esm_data = user->esm_data; + esm_ebr_data_t *esm_ebr_data = user-> esm_ebr_data; if (pid >= ESM_DATA_PDN_MAX) { return (FALSE); - } else if (pid != _esm_data.pdn[pid].pid) { + } else if (pid != esm_data->pdn[pid].pid) { LOG_TRACE(WARNING, "ESM-MAIN - PDN connection %d is not defined", cid); return (FALSE); - } else if (_esm_data.pdn[pid].data == NULL) { + } else if (esm_data->pdn[pid].data == NULL) { LOG_TRACE(ERROR, "ESM-MAIN - PDN connection %d has not been allocated", cid); return (FALSE); } - if (_esm_data.pdn[pid].data->bearer[0] != NULL) { + if (esm_data->pdn[pid].data->bearer[0] != NULL) { /* The status of a PDN connection is the status of the default EPS bearer * that has been assigned to this PDN connection at activation time */ - int ebi = _esm_data.pdn[pid].data->bearer[0]->ebi; - *state = (esm_ebr_get_status(ebi) == ESM_EBR_ACTIVE); + int ebi = esm_data->pdn[pid].data->bearer[0]->ebi; + *state = (esm_ebr_get_status(esm_ebr_data, ebi) == ESM_EBR_ACTIVE); } /* The PDN connection has not been activated yet */ @@ -287,7 +291,6 @@ int esm_main_get_pdn_status(int cid, int *state) ** Description: Get parameters defined for the specified PDN connection ** ** ** ** Inputs: cid: PDN connection identifier ** - ** Others: _esm_data ** ** ** ** Outputs: type: PDN connection type (IPv4, IPv6, IPv4v6) ** ** apn: Access Point logical Name in used ** @@ -297,7 +300,7 @@ int esm_main_get_pdn_status(int cid, int *state) ** Others: None ** ** ** ***************************************************************************/ -int esm_main_get_pdn(int cid, int *type, const char **apn, +int esm_main_get_pdn(esm_data_t *esm_data, int cid, int *type, const char **apn, int *is_emergency, int *is_active) { LOG_FUNC_IN; @@ -306,29 +309,29 @@ int esm_main_get_pdn(int cid, int *type, const char **apn, if (pid >= ESM_DATA_PDN_MAX) { return (RETURNerror); - } else if (pid != _esm_data.pdn[pid].pid) { + } else if (pid != esm_data->pdn[pid].pid) { LOG_TRACE(WARNING, "ESM-MAIN - PDN connection %d is not defined", cid); return (RETURNerror); - } else if (_esm_data.pdn[pid].data == NULL) { + } else if (esm_data->pdn[pid].data == NULL) { LOG_TRACE(ERROR, "ESM-MAIN - PDN connection %d has not been allocated", cid); return (RETURNerror); } /* Get the PDN type */ - *type = _esm_data.pdn[pid].data->type; + *type = esm_data->pdn[pid].data->type; /* Get the Access Point Name */ - if (_esm_data.pdn[pid].data->apn.length > 0) { - *apn = (char *)(_esm_data.pdn[pid].data->apn.value); + if (esm_data->pdn[pid].data->apn.length > 0) { + *apn = (char *)(esm_data->pdn[pid].data->apn.value); } else { *apn = NULL; } /* Get the emergency bearer services indicator */ - *is_emergency = _esm_data.pdn[pid].data->is_emergency; + *is_emergency = esm_data->pdn[pid].data->is_emergency; /* Get the active PDN connection indicator */ - *is_active = _esm_data.pdn[pid].is_active; + *is_active = esm_data->pdn[pid].is_active; LOG_FUNC_RETURN (RETURNok); } @@ -341,7 +344,6 @@ int esm_main_get_pdn(int cid, int *type, const char **apn, ** tion ** ** ** ** Inputs: cid: PDN connection identifier ** - ** Others: _esm_data ** ** ** ** Outputs: ipv4adddr: IPv4 address ** ** ipv6adddr: IPv6 address ** @@ -349,7 +351,7 @@ int esm_main_get_pdn(int cid, int *type, const char **apn, ** Others: None ** ** ** ***************************************************************************/ -int esm_main_get_pdn_addr(int cid, const char **ipv4addr, const char **ipv6addr) +int esm_main_get_pdn_addr(esm_data_t *esm_data, int cid, const char **ipv4addr, const char **ipv6addr) { LOG_FUNC_IN; @@ -357,35 +359,30 @@ int esm_main_get_pdn_addr(int cid, const char **ipv4addr, const char **ipv6addr) if (pid >= ESM_DATA_PDN_MAX) { return (RETURNerror); - } else if (pid != _esm_data.pdn[pid].pid) { + } else if (pid != esm_data->pdn[pid].pid) { LOG_TRACE(WARNING, "ESM-MAIN - PDN connection %d is not defined", cid); return (RETURNerror); - } else if (_esm_data.pdn[pid].data == NULL) { + } else if (esm_data->pdn[pid].data == NULL) { LOG_TRACE(ERROR, "ESM-MAIN - PDN connection %d has not been allocated", cid); return (RETURNerror); - } else if (!_esm_data.pdn[pid].is_active) { + } else if (!esm_data->pdn[pid].is_active) { /* No any IP address has been assigned to this PDN connection */ return (RETURNok); } - if (_esm_data.pdn[pid].data->type == NET_PDN_TYPE_IPV4) { + if (esm_data->pdn[pid].data->type == NET_PDN_TYPE_IPV4) { /* Get IPv4 address */ - *ipv4addr = _esm_data.pdn[pid].data->ip_addr; - } else if (_esm_data.pdn[pid].data->type == NET_PDN_TYPE_IPV6) { + *ipv4addr = esm_data->pdn[pid].data->ip_addr; + } else if (esm_data->pdn[pid].data->type == NET_PDN_TYPE_IPV6) { /* Get IPv6 address */ - *ipv6addr = _esm_data.pdn[pid].data->ip_addr; + *ipv6addr = esm_data->pdn[pid].data->ip_addr; } else { /* IPv4v6 dual-stack terminal */ - *ipv4addr = _esm_data.pdn[pid].data->ip_addr; - *ipv6addr = _esm_data.pdn[pid].data->ip_addr+ESM_DATA_IPV4_ADDRESS_SIZE; + *ipv4addr = esm_data->pdn[pid].data->ip_addr; + *ipv6addr = esm_data->pdn[pid].data->ip_addr+ESM_DATA_IPV4_ADDRESS_SIZE; } LOG_FUNC_RETURN (RETURNok); } - -/****************************************************************************/ -/********************* L O C A L F U N C T I O N S *********************/ -/****************************************************************************/ - diff --git a/openair3/NAS/UE/ESM/esm_main.h b/openair3/NAS/UE/ESM/esm_main.h old mode 100755 new mode 100644 index de95ba26f9..6e6ecc0db4 --- a/openair3/NAS/UE/ESM/esm_main.h +++ b/openair3/NAS/UE/ESM/esm_main.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_main.h @@ -48,6 +41,9 @@ Description Defines the EPS Session Management procedure call manager, #define __ESM_MAIN_H__ #include "networkDef.h" +#include "esm_ebr.h" +#include "esmData.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -65,19 +61,19 @@ Description Defines the EPS Session Management procedure call manager, /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -void esm_main_initialize(esm_indication_callback_t cb); +void esm_main_initialize(nas_user_t *user, esm_indication_callback_t cb); -void esm_main_cleanup(void); +void esm_main_cleanup(esm_data_t *esm_data); /* User's getter for PDN connections and EPS bearer contexts */ -int esm_main_get_nb_pdns_max(void); -int esm_main_get_nb_pdns(void); -int esm_main_has_emergency(void); -int esm_main_get_pdn_status(int cid, int *state); -int esm_main_get_pdn(int cid, int *type, const char **apn, int *is_emergency, +int esm_main_get_nb_pdns_max(esm_data_t *esm_data); +int esm_main_get_nb_pdns(esm_data_t *esm_data); +int esm_main_has_emergency(esm_data_t *esm_data); +int esm_main_get_pdn_status(nas_user_t *user, int cid, int *state); +int esm_main_get_pdn(esm_data_t *esm_data, int cid, int *type, const char **apn, int *is_emergency, int *is_active); -int esm_main_get_pdn_addr(int cid, const char **ipv4addr, const char **ipv6addr); +int esm_main_get_pdn_addr(esm_data_t *esm_data, int cid, const char **ipv4addr, const char **ipv6addr); #endif /* __ESM_MAIN_H__*/ diff --git a/openair3/NAS/UE/ESM/esm_proc.h b/openair3/NAS/UE/ESM/esm_proc.h old mode 100755 new mode 100644 index 094907257b..941cfa620d --- a/openair3/NAS/UE/ESM/esm_proc.h +++ b/openair3/NAS/UE/ESM/esm_proc.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_proc.h @@ -50,6 +43,7 @@ Description Defines the EPS Session Management procedures executed at #include "OctetString.h" #include "emmData.h" #include "ProtocolConfigurationOptions.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -85,7 +79,7 @@ typedef enum { * Type of the ESM procedure callback executed when requested by the UE * or initiated by the network */ -typedef int (*esm_proc_procedure_t) (int, int, OctetString *, int); +typedef int (*esm_proc_procedure_t) (nas_user_t *user, int, int, OctetString *, int); /* EPS bearer level QoS parameters */ typedef network_qos_t esm_proc_qos_t; @@ -119,7 +113,7 @@ typedef struct { * -------------------------------------------------------------------------- */ int esm_proc_status_ind(int pti, int ebi, int *esm_cause); -int esm_proc_status(int is_standalone, int pti, OctetString *msg, +int esm_proc_status(nas_user_t *user, int is_standalone, int pti, OctetString *msg, int sent_by_ue); @@ -128,16 +122,16 @@ int esm_proc_status(int is_standalone, int pti, OctetString *msg, * PDN connectivity procedure * -------------------------------------------------------------------------- */ -int esm_proc_pdn_connectivity(int cid, int to_define, +int esm_proc_pdn_connectivity(nas_user_t *user, int cid, int to_define, esm_proc_pdn_type_t pdn_type, const OctetString *apn, int is_emergency, unsigned int *pti); -int esm_proc_pdn_connectivity_request(int is_standalone, int pti, +int esm_proc_pdn_connectivity_request(nas_user_t *user, int is_standalone, int pti, OctetString *msg, int sent_by_ue); -int esm_proc_pdn_connectivity_accept(int pti, esm_proc_pdn_type_t pdn_type, +int esm_proc_pdn_connectivity_accept(nas_user_t *user, int pti, esm_proc_pdn_type_t pdn_type, const OctetString *pdn_address, const OctetString *apn, int *esm_cause); -int esm_proc_pdn_connectivity_reject(int pti, int *esm_cause); -int esm_proc_pdn_connectivity_complete(void); -int esm_proc_pdn_connectivity_failure(int is_pending); +int esm_proc_pdn_connectivity_reject(nas_user_t *user, int pti, int *esm_cause); +int esm_proc_pdn_connectivity_complete(nas_user_t *user); +int esm_proc_pdn_connectivity_failure(nas_user_t *user, int is_pending); /* @@ -145,12 +139,12 @@ int esm_proc_pdn_connectivity_failure(int is_pending); * PDN disconnect procedure * -------------------------------------------------------------------------- */ -int esm_proc_pdn_disconnect(int cid, unsigned int *pti, unsigned int *ebi); -int esm_proc_pdn_disconnect_request(int is_standalone, int pti, +int esm_proc_pdn_disconnect(esm_data_t *esm_data, int cid, unsigned int *pti, unsigned int *ebi); +int esm_proc_pdn_disconnect_request(nas_user_t *user, int is_standalone, int pti, OctetString *msg, int sent_by_ue); -int esm_proc_pdn_disconnect_accept(int pti, int *esm_cause); -int esm_proc_pdn_disconnect_reject(int pti, int *esm_cause); +int esm_proc_pdn_disconnect_accept(esm_pt_data_t *esm_pt_data, int pti, int *esm_cause); +int esm_proc_pdn_disconnect_reject(nas_user_t *user, int pti, int *esm_cause); /* * -------------------------------------------------------------------------- @@ -158,14 +152,14 @@ int esm_proc_pdn_disconnect_reject(int pti, int *esm_cause); * -------------------------------------------------------------------------- */ -int esm_proc_default_eps_bearer_context_request(int pid, int ebi, +int esm_proc_default_eps_bearer_context_request(nas_user_t *user, int pid, int ebi, const esm_proc_qos_t *esm_qos, int *esm_cause); -int esm_proc_default_eps_bearer_context_complete(void); -int esm_proc_default_eps_bearer_context_failure(void); +int esm_proc_default_eps_bearer_context_complete(default_eps_bearer_context_data_t *default_eps_bearer_context_data); +int esm_proc_default_eps_bearer_context_failure(nas_user_t *user); -int esm_proc_default_eps_bearer_context_accept(int is_standalone, int ebi, +int esm_proc_default_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi, OctetString *msg, int ue_triggered); -int esm_proc_default_eps_bearer_context_reject(int is_standalone, int ebi, +int esm_proc_default_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi, OctetString *msg, int ue_triggered); /* @@ -174,12 +168,12 @@ int esm_proc_default_eps_bearer_context_reject(int is_standalone, int ebi, * -------------------------------------------------------------------------- */ -int esm_proc_dedicated_eps_bearer_context_request(int ebi, int default_ebi, +int esm_proc_dedicated_eps_bearer_context_request(nas_user_t *user, int ebi, int default_ebi, const esm_proc_qos_t *qos, const esm_proc_tft_t *tft, int *esm_cause); -int esm_proc_dedicated_eps_bearer_context_accept(int is_standalone, int ebi, +int esm_proc_dedicated_eps_bearer_context_accept(nas_user_t *user, int is_standalone, int ebi, OctetString *msg, int ue_triggered); -int esm_proc_dedicated_eps_bearer_context_reject(int is_standalone, int ebi, +int esm_proc_dedicated_eps_bearer_context_reject(nas_user_t *user, int is_standalone, int ebi, OctetString *msg, int ue_triggered); /* @@ -188,11 +182,11 @@ int esm_proc_dedicated_eps_bearer_context_reject(int is_standalone, int ebi, * -------------------------------------------------------------------------- */ -int esm_proc_eps_bearer_context_deactivate(int is_local, int ebi, int *pid, +int esm_proc_eps_bearer_context_deactivate(nas_user_t *user, int is_local, int ebi, int *pid, int *bid); -int esm_proc_eps_bearer_context_deactivate_request(int ebi, int *esm_cause); +int esm_proc_eps_bearer_context_deactivate_request(nas_user_t *user, int ebi, int *esm_cause); -int esm_proc_eps_bearer_context_deactivate_accept(int is_standalone, int ebi, +int esm_proc_eps_bearer_context_deactivate_accept(nas_user_t *user, int is_standalone, int ebi, OctetString *msg, int ue_triggered); #endif /* __ESM_PROC_H__*/ diff --git a/openair3/NAS/UE/ESM/esm_pt.c b/openair3/NAS/UE/ESM/esm_pt.c old mode 100755 new mode 100644 index 9b2f4f7451..c372ad25f4 --- a/openair3/NAS/UE/ESM/esm_pt.c +++ b/openair3/NAS/UE/ESM/esm_pt.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_pt.c @@ -44,9 +37,12 @@ Description Defines functions used to handle ESM procedure transactions. *****************************************************************************/ #include "esm_pt.h" +#include "esm_pt_defs.h" +#include "user_defs.h" #include "commonDef.h" #include "nas_log.h" +#include "utils.h" #include // malloc, free #include // memcpy @@ -55,14 +51,6 @@ Description Defines functions used to handle ESM procedure transactions. /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ -/* - * Minimal and maximal value of a procedure transaction identity: - * The Procedure Transaction Identity (PTI) identifies bi-directional - * messages flows - */ -#define ESM_PTI_MIN (PROCEDURE_TRANSACTION_IDENTITY_FIRST) -#define ESM_PTI_MAX (PROCEDURE_TRANSACTION_IDENTITY_LAST) - /****************************************************************************/ /******************* L O C A L D E F I N I T I O N S *******************/ /****************************************************************************/ @@ -73,33 +61,9 @@ static const char *_esm_pt_state_str[ESM_PT_STATE_MAX] = { "PROCEDURE TRANSACTION PENDING" }; -/* - * -------------------------- - * Procedure transaction data - * -------------------------- - */ -typedef struct { - unsigned char pti; /* Procedure transaction identity */ - esm_pt_state status; /* Procedure transaction status */ - struct nas_timer_t timer; /* Retransmission timer */ - esm_pt_timer_data_t *args; /* Retransmission timer parameters data */ -} esm_pt_context_t; - -/* - * ------------------------------ - * List of procedure transactions - * ------------------------------ - */ -static struct { - unsigned char index; /* Index of the next procedure transaction - * identity to be used */ -#define ESM_PT_DATA_SIZE (ESM_PTI_MAX - ESM_PTI_MIN + 1) - esm_pt_context_t *context[ESM_PT_DATA_SIZE + 1]; -} _esm_pt_data; - /* Return the index of the next available entry in the list of procedure * transaction data */ -static int _esm_pt_get_available_entry(void); +static int _esm_pt_get_available_entry(esm_pt_data_t *esm_pt_data); /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ @@ -116,22 +80,22 @@ static int _esm_pt_get_available_entry(void); ** ** ** Outputs: None ** ** Return: None ** - ** Others: _esm_pt_data ** ** ** ***************************************************************************/ -void esm_pt_initialize(void) +esm_pt_data_t *esm_pt_initialize(void) { LOG_FUNC_IN; - + esm_pt_data_t *esm_pt_data = calloc_or_fail(sizeof(esm_pt_data_t)); int i; - _esm_pt_data.index = 0; + esm_pt_data->index = 0; for (i = 0; i < ESM_PT_DATA_SIZE + 1; i++) { - _esm_pt_data.context[i] = NULL; + esm_pt_data->context[i] = NULL; } LOG_FUNC_OUT; + return esm_pt_data; } /**************************************************************************** @@ -147,43 +111,42 @@ void esm_pt_initialize(void) ** Return: The identity of the new procedure transac- ** ** tion when successfully assigned; ** ** the unassigned PTI (0) otherwise. ** - ** Others: _esm_pt_data ** ** ** ***************************************************************************/ -int esm_pt_assign(void) +int esm_pt_assign(esm_pt_data_t *esm_pt_data) { LOG_FUNC_IN; /* Search for an available procedure transaction identity */ - int i = _esm_pt_get_available_entry(); + int i = _esm_pt_get_available_entry(esm_pt_data); if (i < 0) { LOG_FUNC_RETURN (ESM_PT_UNASSIGNED); } /* Assign new procedure transaction */ - _esm_pt_data.context[i] = + esm_pt_data->context[i] = (esm_pt_context_t *)malloc(sizeof(esm_pt_context_t)); - if (_esm_pt_data.context[i] == NULL) { + if (esm_pt_data->context[i] == NULL) { LOG_FUNC_RETURN (ESM_PT_UNASSIGNED); } /* Store the index of the next available procedure transaction identity */ - _esm_pt_data.index = i + 1; + esm_pt_data->index = i + 1; /* An available procedure transaction identity is found */ - _esm_pt_data.context[i]->pti = i + ESM_PTI_MIN; + esm_pt_data->context[i]->pti = i + ESM_PTI_MIN; /* Set the procedure transaction status to INACTIVE */ - _esm_pt_data.context[i]->status = ESM_PT_INACTIVE; + esm_pt_data->context[i]->status = ESM_PT_INACTIVE; /* Disable the retransmission timer */ - _esm_pt_data.context[i]->timer.id = NAS_TIMER_INACTIVE_ID; + esm_pt_data->context[i]->timer.id = NAS_TIMER_INACTIVE_ID; /* Setup retransmission timer parameters */ - _esm_pt_data.context[i]->args = NULL; + esm_pt_data->context[i]->args = NULL; LOG_TRACE(INFO, "ESM-FSM - Procedure transaction identity %d assigned", - _esm_pt_data.context[i]->pti); - LOG_FUNC_RETURN (_esm_pt_data.context[i]->pti); + esm_pt_data->context[i]->pti); + LOG_FUNC_RETURN (esm_pt_data->context[i]->pti); } /**************************************************************************** @@ -200,10 +163,9 @@ int esm_pt_assign(void) ** Return: RETURNok if the procedure transaction iden-** ** tity has been successfully released; ** ** RETURNerror otherwise. ** - ** Others: _esm_pt_data ** ** ** ***************************************************************************/ -int esm_pt_release(int pti) +int esm_pt_release(esm_pt_data_t *esm_pt_data, int pti) { LOG_FUNC_IN; @@ -212,7 +174,7 @@ int esm_pt_release(int pti) } /* Get procedure transaction data */ - esm_pt_context_t *ctx = _esm_pt_data.context[pti - ESM_PTI_MIN]; + esm_pt_context_t *ctx = esm_pt_data->context[pti - ESM_PTI_MIN]; if ( (ctx == NULL) || (ctx->pti != pti) ) { /* Procedure transaction not assigned */ @@ -243,8 +205,8 @@ int esm_pt_release(int pti) } /* Release transaction procedure data */ - free(_esm_pt_data.context[pti - ESM_PTI_MIN]); - _esm_pt_data.context[pti - ESM_PTI_MIN] = NULL; + free(esm_pt_data->context[pti - ESM_PTI_MIN]); + esm_pt_data->context[pti - ESM_PTI_MIN] = NULL; LOG_TRACE(INFO, "ESM-FSM - Procedure transaction %d released", pti); @@ -268,20 +230,20 @@ int esm_pt_release(int pti) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _esm_pt_data ** ** ** ***************************************************************************/ -int esm_pt_start_timer(int pti, const OctetString *msg, +int esm_pt_start_timer(nas_user_t *user, int pti, const OctetString *msg, long sec, nas_timer_callback_t cb) { LOG_FUNC_IN; + esm_pt_data_t *esm_pt_data = user->esm_pt_data; if ( (pti < ESM_PTI_MIN) || (pti > ESM_PTI_MAX) ) { LOG_FUNC_RETURN (RETURNerror); } /* Get procedure transaction data */ - esm_pt_context_t *ctx = _esm_pt_data.context[pti - ESM_PTI_MIN]; + esm_pt_context_t *ctx = esm_pt_data->context[pti - ESM_PTI_MIN]; if ( (ctx == NULL) || (ctx->pti != pti) ) { /* Procedure transaction not assigned */ @@ -298,6 +260,7 @@ int esm_pt_start_timer(int pti, const OctetString *msg, ctx->args = (esm_pt_timer_data_t *)malloc(sizeof(esm_pt_timer_data_t)); if (ctx->args) { + ctx->args->user = user; /* Set the EPS bearer identity */ ctx->args->pti = pti; /* Reset the retransmission counter */ @@ -339,10 +302,9 @@ int esm_pt_start_timer(int pti, const OctetString *msg, ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _esm_pt_data ** ** ** ***************************************************************************/ -int esm_pt_stop_timer(int pti) +int esm_pt_stop_timer(esm_pt_data_t *esm_pt_data, int pti) { LOG_FUNC_IN; @@ -351,7 +313,7 @@ int esm_pt_stop_timer(int pti) } /* Get procedure transaction data */ - esm_pt_context_t *ctx = _esm_pt_data.context[pti - ESM_PTI_MIN]; + esm_pt_context_t *ctx = esm_pt_data->context[pti - ESM_PTI_MIN]; if ( (ctx == NULL) || (ctx->pti != pti) ) { /* Procedure transaction not assigned */ @@ -391,10 +353,9 @@ int esm_pt_stop_timer(int pti) ** ** ** Outputs: None ** ** Return: RETURNok, RETURNerror ** - ** Others: _esm_pt_data ** ** ** ***************************************************************************/ -int esm_pt_set_status(int pti, esm_pt_state status) +int esm_pt_set_status(esm_pt_data_t *esm_pt_data, int pti, esm_pt_state status) { LOG_FUNC_IN; @@ -405,7 +366,7 @@ int esm_pt_set_status(int pti, esm_pt_state status) } /* Get procedure transaction data */ - esm_pt_context_t *ctx = _esm_pt_data.context[pti - ESM_PTI_MIN]; + esm_pt_context_t *ctx = esm_pt_data->context[pti - ESM_PTI_MIN]; if ( (ctx == NULL) || (ctx->pti != pti) ) { /* Procedure transaction not assigned */ @@ -438,7 +399,6 @@ int esm_pt_set_status(int pti, esm_pt_state status) ** transaction ** ** ** ** Inputs: pti: The identity of the procedure transaction ** - ** Others: _esm_pt_data ** ** ** ** Outputs: None ** ** Return: The current value of the ESM procedure ** @@ -446,23 +406,23 @@ int esm_pt_set_status(int pti, esm_pt_state status) ** Others: None ** ** ** ***************************************************************************/ -esm_pt_state esm_pt_get_status(int pti) +esm_pt_state esm_pt_get_status(esm_pt_data_t *esm_pt_data, int pti) { if ( (pti < ESM_PTI_MIN) || (pti > ESM_PTI_MAX) ) { return (ESM_PT_INACTIVE); } - if (_esm_pt_data.context[pti - ESM_PTI_MIN] == NULL) { + if (esm_pt_data->context[pti - ESM_PTI_MIN] == NULL) { /* Procedure transaction not allocated */ return (ESM_PT_INACTIVE); } - if (_esm_pt_data.context[pti - ESM_PTI_MIN]->pti != pti) { + if (esm_pt_data->context[pti - ESM_PTI_MIN]->pti != pti) { /* Procedure transaction not assigned */ return (ESM_PT_INACTIVE); } - return (_esm_pt_data.context[pti - ESM_PTI_MIN]->status); + return (esm_pt_data->context[pti - ESM_PTI_MIN]->status); } /**************************************************************************** @@ -474,7 +434,6 @@ esm_pt_state esm_pt_get_status(int pti) ** given state ** ** ** ** Inputs: status: The PDN connection status ** - ** Others: _esm_pt_data ** ** ** ** Outputs: None ** ** Return: The procedure transaction identity of the ** @@ -483,18 +442,18 @@ esm_pt_state esm_pt_get_status(int pti) ** Others: None ** ** ** ***************************************************************************/ -int esm_pt_get_pending_pti(esm_pt_state status) +int esm_pt_get_pending_pti(esm_pt_data_t *esm_pt_data, esm_pt_state status) { LOG_FUNC_IN; int i; for (i = 0; i < ESM_PT_DATA_SIZE; i++) { - if (_esm_pt_data.context[i] == NULL) { + if (esm_pt_data->context[i] == NULL) { continue; } - if (_esm_pt_data.context[i]->status != status) { + if (esm_pt_data->context[i]->status != status) { continue; } @@ -503,7 +462,7 @@ int esm_pt_get_pending_pti(esm_pt_state status) } if (i < ESM_PT_DATA_SIZE) { - LOG_FUNC_RETURN (_esm_pt_data.context[i]->pti); + LOG_FUNC_RETURN (esm_pt_data->context[i]->pti); } /* PDN connection entry not found */ @@ -518,18 +477,17 @@ int esm_pt_get_pending_pti(esm_pt_state status) ** does not match an assigned PTI value currently in use ** ** ** ** Inputs: pti: The identity of the procedure transaction ** - ** Others: _esm_pt_data ** ** ** ** Outputs: None ** ** Return: TRUE, FALSE ** ** Others: None ** ** ** ***************************************************************************/ -int esm_pt_is_not_in_use(int pti) +int esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti) { return ( (pti == ESM_PT_UNASSIGNED) || - (_esm_pt_data.context[pti - ESM_PTI_MIN] == NULL) || - (_esm_pt_data.context[pti - ESM_PTI_MIN]->pti) != pti); + (esm_pt_data->context[pti - ESM_PTI_MIN] == NULL) || + (esm_pt_data->context[pti - ESM_PTI_MIN]->pti) != pti); } /**************************************************************************** @@ -564,7 +522,6 @@ int esm_pt_is_reserved(int pti) ** of procedure transaction data ** ** ** ** Inputs: None ** - ** Others: _esm_pt_data ** ** ** ** Outputs: None ** ** Return: The index of the next available procedure ** @@ -573,20 +530,20 @@ int esm_pt_is_reserved(int pti) ** Others: None ** ** ** ***************************************************************************/ -static int _esm_pt_get_available_entry(void) +static int _esm_pt_get_available_entry(esm_pt_data_t *esm_pt_data) { int i; - for (i = _esm_pt_data.index; i < ESM_PT_DATA_SIZE; i++) { - if (_esm_pt_data.context[i] != NULL) { + for (i = esm_pt_data->index; i < ESM_PT_DATA_SIZE; i++) { + if (esm_pt_data->context[i] != NULL) { continue; } return i; } - for (i = 0; i < _esm_pt_data.index; i++) { - if (_esm_pt_data.context[i] != NULL) { + for (i = 0; i < esm_pt_data->index; i++) { + if (esm_pt_data->context[i] != NULL) { continue; } diff --git a/openair3/NAS/UE/ESM/esm_pt.h b/openair3/NAS/UE/ESM/esm_pt.h old mode 100755 new mode 100644 index 8821b3be91..3179e0f47b --- a/openair3/NAS/UE/ESM/esm_pt.h +++ b/openair3/NAS/UE/ESM/esm_pt.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source esm_pt.h @@ -47,6 +40,8 @@ Description Defines functions used to handle ESM procedure transactions. #include "OctetString.h" #include "nas_timer.h" +#include "user_defs.h" +#include "esm_pt_defs.h" #include "ProcedureTransactionIdentity.h" @@ -61,21 +56,6 @@ Description Defines functions used to handle ESM procedure transactions. /************************ G L O B A L T Y P E S ************************/ /****************************************************************************/ -/* Procedure transaction states */ -typedef enum { - ESM_PT_INACTIVE, /* No procedure transaction exists */ - ESM_PT_PENDING, /* The UE has initiated a procedure transaction - * towards the network */ - ESM_PT_STATE_MAX -} esm_pt_state; - -/* ESM message timer retransmission data */ -typedef struct { - unsigned char pti; /* Procedure transaction identity */ - unsigned int count; /* Retransmission counter */ - OctetString msg; /* Encoded ESM message to re-transmit */ -} esm_pt_timer_data_t; - /****************************************************************************/ /******************** G L O B A L V A R I A B L E S ********************/ /****************************************************************************/ @@ -86,19 +66,19 @@ typedef struct { int esm_pt_is_reserved(int pti); -void esm_pt_initialize(void); +esm_pt_data_t *esm_pt_initialize(void); -int esm_pt_assign(void); -int esm_pt_release(int pti); +int esm_pt_assign(esm_pt_data_t *esm_pt_data); +int esm_pt_release(esm_pt_data_t *esm_pt_data, int pti); -int esm_pt_start_timer(int pti, const OctetString *msg, long sec, +int esm_pt_start_timer(nas_user_t *user, int pti, const OctetString *msg, long sec, nas_timer_callback_t cb); -int esm_pt_stop_timer(int pti); +int esm_pt_stop_timer(esm_pt_data_t *esm_pt_data, int pti); -int esm_pt_set_status(int pti, esm_pt_state status); -esm_pt_state esm_pt_get_status(int pti); -int esm_pt_get_pending_pti(esm_pt_state status); +int esm_pt_set_status(esm_pt_data_t *esm_pt_data, int pti, esm_pt_state status); +esm_pt_state esm_pt_get_status(esm_pt_data_t *esm_pt_data, int pti); +int esm_pt_get_pending_pti(esm_pt_data_t *esm_pt_data, esm_pt_state status); -int esm_pt_is_not_in_use(int pti); +int esm_pt_is_not_in_use(esm_pt_data_t *esm_pt_data, int pti); #endif /* __ESM_PT_H__*/ diff --git a/openair3/NAS/UE/ESM/esm_pt_defs.h b/openair3/NAS/UE/ESM/esm_pt_defs.h new file mode 100644 index 0000000000..36cc52dda9 --- /dev/null +++ b/openair3/NAS/UE/ESM/esm_pt_defs.h @@ -0,0 +1,63 @@ +#ifndef _ESM_PT_DEFS_H +#define _ESM_PT_DEFS_H + +#include "UTIL/nas_timer.h" +#include "IES/ProcedureTransactionIdentity.h" + +/****************************************************************************/ +/********************* G L O B A L C O N S T A N T S *******************/ +/****************************************************************************/ + +/* + * Minimal and maximal value of a procedure transaction identity: + * The Procedure Transaction Identity (PTI) identifies bi-directional + * messages flows + */ +#define ESM_PTI_MIN (PROCEDURE_TRANSACTION_IDENTITY_FIRST) +#define ESM_PTI_MAX (PROCEDURE_TRANSACTION_IDENTITY_LAST) + +/****************************************************************************/ +/************************ G L O B A L T Y P E S ************************/ +/****************************************************************************/ + +/* Procedure transaction states */ +typedef enum { + ESM_PT_INACTIVE, /* No procedure transaction exists */ + ESM_PT_PENDING, /* The UE has initiated a procedure transaction + * towards the network */ + ESM_PT_STATE_MAX +} esm_pt_state; + +/* ESM message timer retransmission data */ +typedef struct { + unsigned char pti; /* Procedure transaction identity */ + unsigned int count; /* Retransmission counter */ + OctetString msg; /* Encoded ESM message to re-transmit */ + void *user; /* user reference - void to avoid cyclic dependency */ +} esm_pt_timer_data_t; + +/* + * -------------------------- + * Procedure transaction data + * -------------------------- + */ +typedef struct { + unsigned char pti; /* Procedure transaction identity */ + esm_pt_state status; /* Procedure transaction status */ + struct nas_timer_t timer; /* Retransmission timer */ + esm_pt_timer_data_t *args; /* Retransmission timer parameters data */ +} esm_pt_context_t; + +/* + * ------------------------------ + * List of procedure transactions + * ------------------------------ + */ +typedef struct { + unsigned char index; /* Index of the next procedure transaction + * identity to be used */ +#define ESM_PT_DATA_SIZE (ESM_PTI_MAX - ESM_PTI_MIN + 1) + esm_pt_context_t *context[ESM_PT_DATA_SIZE + 1]; +} esm_pt_data_t; + +#endif diff --git a/openair3/NAS/UE/UEprocess.c b/openair3/NAS/UE/UEprocess.c index 0f45697f18..6a70911e21 100644 --- a/openair3/NAS/UE/UEprocess.c +++ b/openair3/NAS/UE/UEprocess.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source UEprocess.c @@ -53,6 +46,7 @@ #include "nas_user.h" #include "nas_network.h" #include "nas_parser.h" +#include "user_defs.h" #include // exit #include // poll @@ -76,7 +70,12 @@ static void *_nas_network_mngr(void *); static int _nas_set_signal_handler(int signal, void (handler)(int)); static void _nas_signal_handler(int signal); -static void _nas_clean(int usr_fd, int net_fd); +static void _nas_clean(user_api_id_t *user_api_id, int net_fd); + +uint8_t usim_test = 0; +// FIXME user must be set up with right itti message instance +// FIXME allocate user and initialize its fields +nas_user_t *user = NULL; /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ @@ -85,6 +84,8 @@ static void _nas_clean(int usr_fd, int net_fd); /****************************************************************************/ int main(int argc, const char *argv[]) { + // FIXME allocate and put it in user + user_api_id_t *user_api_id = NULL; /* * Get the command line options */ @@ -113,19 +114,19 @@ int main(int argc, const char *argv[]) /* * Initialize the User interface */ - if (user_api_initialize (uhost, uport, devpath, devparams) != RETURNok) { + if (user_api_initialize (user_api_id, uhost, uport, devpath, devparams) != RETURNok) { LOG_TRACE (ERROR, "UE-MAIN - user_api_initialize() failed"); exit (EXIT_FAILURE); } - int user_fd = user_api_get_fd (); + int user_fd = user_api_get_fd (user_api_id); /* * Initialize the Network interface */ if (network_api_initialize (nhost, nport) != RETURNok) { LOG_TRACE (ERROR, "UE-MAIN - network_api_initialize() failed"); - user_api_close (user_fd); + user_api_close (user_api_id); exit (EXIT_FAILURE); } @@ -134,7 +135,7 @@ int main(int argc, const char *argv[]) /* * Initialize the NAS contexts */ - nas_user_initialize (&user_api_emm_callback, &user_api_esm_callback, + nas_user_initialize (user, &user_api_emm_callback, &user_api_esm_callback, FIRMWARE_VERSION); nas_network_initialize (); @@ -162,7 +163,7 @@ int main(int argc, const char *argv[]) if (pthread_create (&user_mngr, &attr, _nas_user_mngr, &user_fd) != 0) { LOG_TRACE (ERROR, "UE-MAIN - " "Failed to create the user management thread"); - user_api_close (user_fd); + user_api_close (user_api_id); network_api_close (network_fd); exit (EXIT_FAILURE); } @@ -176,7 +177,7 @@ int main(int argc, const char *argv[]) &network_fd) != 0) { LOG_TRACE (ERROR, "UE-MAIN - " "Failed to create the network management thread"); - user_api_close (user_fd); + user_api_close (user_api_id); network_api_close (network_fd); exit (EXIT_FAILURE); } @@ -189,12 +190,12 @@ int main(int argc, const char *argv[]) */ while ((user_fd != -1) && (network_fd != -1)) { poll (NULL, 0, NAS_SLEEP_TIMEOUT); - user_fd = user_api_get_fd (); + user_fd = user_api_get_fd (user_api_id); network_fd = network_api_get_fd (); } /* Termination cleanup */ - _nas_clean (user_fd, network_fd); + _nas_clean (user_api_id, network_fd); LOG_TRACE (WARNING, "UE-MAIN - NAS main process exited"); @@ -223,6 +224,7 @@ static void *_nas_user_mngr(void *args) { LOG_FUNC_IN; + pthread_setname_np( pthread_self(), "nas_user_mngr"); int exit_loop = FALSE; int *fd = (int *) args; @@ -231,11 +233,11 @@ static void *_nas_user_mngr(void *args) /* User receiving loop */ while (!exit_loop) { - exit_loop = nas_user_receive_and_process(fd, NULL); + exit_loop = nas_user_receive_and_process(user, NULL); } /* Close the connection to the user application layer */ - user_api_close (*fd); + user_api_close (user->user_api_id); LOG_TRACE (WARNING, "UE-MAIN - " "The user connection endpoint manager exited"); @@ -296,7 +298,7 @@ static void *_nas_network_mngr(void *args) } /* Process the network data message */ - ret_code = nas_network_process_data (network_message_id, + ret_code = nas_network_process_data (user, network_message_id, network_api_get_data ()); if (ret_code != RETURNok) { @@ -384,7 +386,8 @@ static void _nas_signal_handler(int signal) LOG_FUNC_IN; LOG_TRACE (WARNING, "UE-MAIN - Signal %d received", signal); - _nas_clean (user_api_get_fd (), network_api_get_fd ()); + // FIXME acces to global + _nas_clean (user->user_api_id, network_api_get_fd ()); exit (EXIT_SUCCESS); LOG_FUNC_OUT @@ -405,17 +408,19 @@ static void _nas_signal_handler(int signal) ** Others: None ** ** ** ***************************************************************************/ -static void _nas_clean(int usr_fd, int net_fd) +static void _nas_clean(user_api_id_t *user_api_id, int net_fd) { LOG_FUNC_IN; LOG_TRACE (INFO, "UE-MAIN - Perform EMM and ESM cleanup"); - nas_network_cleanup (); + // FIXME nas_network_cleanup depends on nas_user_t + // Why this program should interfere like that with oaisim ? + //nas_network_cleanup (); LOG_TRACE (INFO, "UE-MAIN - " "Closing user connection %d and network connection %d", - usr_fd, net_fd); - user_api_close (usr_fd); + user_api_get_fd (user_api_id), net_fd); + user_api_close (user_api_id); network_api_close (net_fd); LOG_FUNC_OUT diff --git a/openair3/NAS/UE/nas_itti_messaging.c b/openair3/NAS/UE/nas_itti_messaging.c old mode 100755 new mode 100644 index 7b8f630b89..0389106ec3 --- a/openair3/NAS/UE/nas_itti_messaging.c +++ b/openair3/NAS/UE/nas_itti_messaging.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include "intertask_interface.h" @@ -187,7 +180,40 @@ int nas_itti_protected_msg(const char *buffer, const nas_message_t *msg, const i extern unsigned char NB_eNB_INST; -int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat) +int nas_itti_kenb_refresh_req(const Byte_t kenb[32]) +{ + MessageDef *message_p; + + message_p = itti_alloc_new_message(TASK_NAS_UE, NAS_KENB_REFRESH_REQ); + + memcpy(NAS_KENB_REFRESH_REQ(message_p).kenb, kenb, sizeof(NAS_KENB_REFRESH_REQ(message_p).kenb)); + + MSC_LOG_TX_MESSAGE( + MSC_NAS_UE, + MSC_RRC_UE, + NULL,0, + "0 NAS_KENB_REFRESH_REQ KeNB " + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x" + "%02x%02x%02x%02x", + kenb[0], kenb[1], kenb[2], kenb[3], + kenb[4], kenb[5], kenb[6], kenb[7], + kenb[8], kenb[9], kenb[10], kenb[11], + kenb[12], kenb[13], kenb[14], kenb[15], + kenb[16], kenb[17], kenb[18], kenb[19], + kenb[20], kenb[21], kenb[22], kenb[23], + kenb[24], kenb[25], kenb[26], kenb[27], + kenb[28], kenb[29], kenb[30], kenb[31]); + + return itti_send_msg_to_task(TASK_RRC_UE, NB_eNB_INST + 0 /* TODO to be virtualized */, message_p); +} + +int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat, int user_id) { MessageDef *message_p; @@ -204,10 +230,10 @@ int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat) plmnID.MCCdigit1, plmnID.MCCdigit2, plmnID.MCCdigit3, plmnID.MNCdigit1, plmnID.MNCdigit2, plmnID.MNCdigit3); - return itti_send_msg_to_task(TASK_RRC_UE, NB_eNB_INST + 0 /* TODO to be virtualized */, message_p); + return itti_send_msg_to_task(TASK_RRC_UE, NB_eNB_INST + user_id, message_p); } -int nas_itti_nas_establish_req(as_cause_t cause, as_call_type_t type, as_stmsi_t s_tmsi, plmn_t plmnID, Byte_t *data, uint32_t length) +int nas_itti_nas_establish_req(as_cause_t cause, as_call_type_t type, as_stmsi_t s_tmsi, plmn_t plmnID, Byte_t *data, uint32_t length, int user_id) { MessageDef *message_p; @@ -229,10 +255,10 @@ int nas_itti_nas_establish_req(as_cause_t cause, as_call_type_t type, as_stmsi_t plmnID.MCCdigit1, plmnID.MCCdigit2, plmnID.MCCdigit3, plmnID.MNCdigit1, plmnID.MNCdigit2, plmnID.MNCdigit3); - return itti_send_msg_to_task(TASK_RRC_UE, NB_eNB_INST + 0 /* TODO to be virtualized */, message_p); + return itti_send_msg_to_task(TASK_RRC_UE, NB_eNB_INST + user_id, message_p); } -int nas_itti_ul_data_req(const uint32_t ue_id, void *const data, const uint32_t length) +int nas_itti_ul_data_req(const uint32_t ue_id, void *const data, const uint32_t length, int user_id) { MessageDef *message_p; @@ -242,10 +268,10 @@ int nas_itti_ul_data_req(const uint32_t ue_id, void *const data, const uint32_t NAS_UPLINK_DATA_REQ(message_p).nasMsg.data = data; NAS_UPLINK_DATA_REQ(message_p).nasMsg.length = length; - return itti_send_msg_to_task(TASK_RRC_UE, NB_eNB_INST + 0 /* TODO to be virtualized */, message_p); + return itti_send_msg_to_task(TASK_RRC_UE, NB_eNB_INST + user_id, message_p); } -int nas_itti_rab_establish_rsp(const as_stmsi_t s_tmsi, const as_rab_id_t rabID, const nas_error_code_t errCode) +int nas_itti_rab_establish_rsp(const as_stmsi_t s_tmsi, const as_rab_id_t rabID, const nas_error_code_t errCode, int user_id) { MessageDef *message_p; @@ -261,5 +287,5 @@ int nas_itti_rab_establish_rsp(const as_stmsi_t s_tmsi, const as_rab_id_t rabID, NULL,0, "0 NAS_RAB_ESTABLI_RSP MME code %u m-TMSI %u rb id %u status %u", s_tmsi.MMEcode, s_tmsi.m_tmsi,rabID, errCode ); - return itti_send_msg_to_task(TASK_RRC_UE, NB_eNB_INST + 0 /* TODO to be virtualized */, message_p); + return itti_send_msg_to_task(TASK_RRC_UE, NB_eNB_INST + user_id, message_p); } diff --git a/openair3/NAS/UE/nas_itti_messaging.h b/openair3/NAS/UE/nas_itti_messaging.h old mode 100755 new mode 100644 index 9ea80f63c0..d958317e5a --- a/openair3/NAS/UE/nas_itti_messaging.h +++ b/openair3/NAS/UE/nas_itti_messaging.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include @@ -54,12 +47,15 @@ int nas_itti_protected_msg( # if defined(NAS_BUILT_IN_UE) -int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat); -int nas_itti_nas_establish_req(as_cause_t cause, as_call_type_t type, as_stmsi_t s_tmsi, plmn_t plmnID, Byte_t *data_pP, uint32_t lengthP); +int nas_itti_kenb_refresh_req(const Byte_t kenb[32]); -int nas_itti_ul_data_req(const uint32_t ue_idP, void *const data_pP, const uint32_t lengthP); +int nas_itti_cell_info_req(const plmn_t plmnID, const Byte_t rat, int user_id); -int nas_itti_rab_establish_rsp(const as_stmsi_t s_tmsi, const as_rab_id_t rabID, const nas_error_code_t errCode); +int nas_itti_nas_establish_req(as_cause_t cause, as_call_type_t type, as_stmsi_t s_tmsi, plmn_t plmnID, Byte_t *data_pP, uint32_t lengthP, int user_id); + +int nas_itti_ul_data_req(const uint32_t ue_idP, void *const data_pP, const uint32_t lengthP, int user_id); + +int nas_itti_rab_establish_rsp(const as_stmsi_t s_tmsi, const as_rab_id_t rabID, const nas_error_code_t errCode, int user_id); # endif #endif /* NAS_ITTI_MESSAGING_H_ */ diff --git a/openair3/NAS/UE/nas_network.c b/openair3/NAS/UE/nas_network.c old mode 100755 new mode 100644 index d6aa625b36..f7a292df3f --- a/openair3/NAS/UE/nas_network.c +++ b/openair3/NAS/UE/nas_network.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_network.h @@ -50,6 +43,7 @@ Description NAS procedure functions triggered by the network #include "as_message.h" #include "nas_proc.h" +#include "user_defs.h" /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ @@ -98,11 +92,11 @@ void nas_network_initialize(void) ** Others: None ** ** ** ***************************************************************************/ -void nas_network_cleanup(void) +void nas_network_cleanup(nas_user_t *user) { LOG_FUNC_IN; - nas_proc_cleanup(); + nas_proc_cleanup(user); LOG_FUNC_OUT; } @@ -125,7 +119,7 @@ void nas_network_cleanup(void) ** Others: None ** ** ** ***************************************************************************/ -int nas_network_process_data(int msg_id, const void *data) +int nas_network_process_data(nas_user_t *user, int msg_id, const void *data) { LOG_FUNC_IN; @@ -149,7 +143,7 @@ int nas_network_process_data(int msg_id, const void *data) /* Received cell information confirm */ const cell_info_cnf_t *info = &msg->msg.cell_info_cnf; int cell_found = (info->errCode == AS_SUCCESS); - rc = nas_proc_cell_info(cell_found, info->tac, + rc = nas_proc_cell_info(user, cell_found, info->tac, info->cellID, info->rat, info->rsrp, info->rsrq); break; @@ -167,12 +161,12 @@ int nas_network_process_data(int msg_id, const void *data) if ( (confirm->errCode == AS_SUCCESS) || (confirm->errCode == AS_TERMINATED_NAS) ) { - rc = nas_proc_establish_cnf(confirm->nasMsg.data, + rc = nas_proc_establish_cnf(user, confirm->nasMsg.data, confirm->nasMsg.length); } else { LOG_TRACE(WARNING, "NET-MAIN - " "Initial NAS message not delivered"); - rc = nas_proc_establish_rej(); + rc = nas_proc_establish_rej(user); } break; @@ -180,7 +174,7 @@ int nas_network_process_data(int msg_id, const void *data) case AS_NAS_RELEASE_IND: /* Received NAS signalling connection releaase indication */ - rc = nas_proc_release_ind(msg->msg.nas_release_ind.cause); + rc = nas_proc_release_ind(user, msg->msg.nas_release_ind.cause); break; case AS_UL_INFO_TRANSFER_CNF: @@ -189,9 +183,9 @@ int nas_network_process_data(int msg_id, const void *data) if (msg->msg.ul_info_transfer_cnf.errCode != AS_SUCCESS) { LOG_TRACE(WARNING, "NET-MAIN - " "Uplink NAS message not delivered"); - rc = nas_proc_ul_transfer_rej(); + rc = nas_proc_ul_transfer_rej(user); } else { - rc = nas_proc_ul_transfer_cnf(); + rc = nas_proc_ul_transfer_cnf(user); } break; @@ -199,7 +193,7 @@ int nas_network_process_data(int msg_id, const void *data) case AS_DL_INFO_TRANSFER_IND: { const dl_info_transfer_ind_t *info = &msg->msg.dl_info_transfer_ind; /* Received downlink data transfer indication */ - rc = nas_proc_dl_transfer_ind(info->nasMsg.data, + rc = nas_proc_dl_transfer_ind(user, info->nasMsg.data, info->nasMsg.length); break; } diff --git a/openair3/NAS/UE/nas_network.h b/openair3/NAS/UE/nas_network.h old mode 100755 new mode 100644 index d56542ba42..1c13d67b63 --- a/openair3/NAS/UE/nas_network.h +++ b/openair3/NAS/UE/nas_network.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_network.h @@ -47,6 +40,8 @@ Description NAS procedure functions triggered by the network #ifndef __NAS_NETWORK_H__ #define __NAS_NETWORK_H__ +#include "user_defs.h" + /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ /****************************************************************************/ @@ -66,9 +61,9 @@ Description NAS procedure functions triggered by the network void nas_network_initialize(void); -void nas_network_cleanup(void); +void nas_network_cleanup(nas_user_t *user); -int nas_network_process_data(int command_id, const void *data); +int nas_network_process_data(nas_user_t *user, int command_id, const void *data); const void *nas_network_get_data(void); diff --git a/openair3/NAS/UE/nas_parser.c b/openair3/NAS/UE/nas_parser.c old mode 100755 new mode 100644 index 40ba7152b3..d62ebc3529 --- a/openair3/NAS/UE/nas_parser.c +++ b/openair3/NAS/UE/nas_parser.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_parser.c diff --git a/openair3/NAS/UE/nas_parser.h b/openair3/NAS/UE/nas_parser.h old mode 100755 new mode 100644 index 003dd0895e..0924654e3f --- a/openair3/NAS/UE/nas_parser.h +++ b/openair3/NAS/UE/nas_parser.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_parser.h diff --git a/openair3/NAS/UE/nas_proc.c b/openair3/NAS/UE/nas_proc.c old mode 100755 new mode 100644 index e9f61b9d8b..6312a7dc97 --- a/openair3/NAS/UE/nas_proc.c +++ b/openair3/NAS/UE/nas_proc.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_proc.c @@ -45,6 +38,8 @@ Description NAS procedure call manager #include "nas_proc.h" #include "nas_log.h" +#include "nas_user.h" +#include "utils.h" #include "emm_main.h" #include "emm_sap.h" @@ -69,20 +64,9 @@ Description NAS procedure call manager #define NAS_PROC_RSRQ_UNKNOWN 255 #define NAS_PROC_RSRP_UNKNOWN 255 -/* - * Local NAS data - */ -static struct { - /* EPS capibility status */ - int EPS_capability_status; - /* Reference signal received quality */ - int rsrq; - /* Reference signal received power */ - int rsrp; -} _nas_proc_data; -static int _nas_proc_activate(int cid, int apply_to_all); -static int _nas_proc_deactivate(int cid, int apply_to_all); +static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all); +static int _nas_proc_deactivate(nas_user_t *user, int cid, int apply_to_all); /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ @@ -104,21 +88,24 @@ static int _nas_proc_deactivate(int cid, int apply_to_all); ** Others: _nas_proc_data ** ** ** ***************************************************************************/ -void nas_proc_initialize(emm_indication_callback_t emm_cb, +void nas_proc_initialize(nas_user_t *user, emm_indication_callback_t emm_cb, esm_indication_callback_t esm_cb, const char *imei) { LOG_FUNC_IN; /* Initialize local NAS data */ - _nas_proc_data.EPS_capability_status = FALSE; - _nas_proc_data.rsrq = NAS_PROC_RSRQ_UNKNOWN; - _nas_proc_data.rsrp = NAS_PROC_RSRP_UNKNOWN; + user->proc.EPS_capability_status = FALSE; + user->proc.rsrq = NAS_PROC_RSRQ_UNKNOWN; + user->proc.rsrp = NAS_PROC_RSRP_UNKNOWN; + + user->authentication_data = calloc_or_fail(sizeof(authentication_data_t)); + user->security_data = calloc_or_fail( sizeof(security_data_t)); /* Initialize the EMM procedure manager */ - emm_main_initialize(emm_cb, imei); + emm_main_initialize(user, emm_cb, imei); /* Initialize the ESM procedure manager */ - esm_main_initialize(esm_cb); + esm_main_initialize(user, esm_cb); LOG_FUNC_OUT; } @@ -138,12 +125,12 @@ void nas_proc_initialize(emm_indication_callback_t emm_cb, ** Others: None ** ** ** ***************************************************************************/ -void nas_proc_cleanup(void) +void nas_proc_cleanup(nas_user_t *user) { LOG_FUNC_IN; /* Detach the UE from the EPS network */ - int rc = nas_proc_detach(TRUE); + int rc = nas_proc_detach(user, TRUE); if (rc != RETURNok) { LOG_TRACE(ERROR, "NAS-PROC - Failed to detach from the network"); @@ -151,10 +138,10 @@ void nas_proc_cleanup(void) /* Perform the EPS Mobility Manager's clean up procedure */ - emm_main_cleanup(); + emm_main_cleanup(user); /* Perform the EPS Session Manager's clean up procedure */ - esm_main_cleanup(); + esm_main_cleanup(user->esm_data); LOG_FUNC_OUT; } @@ -179,7 +166,7 @@ void nas_proc_cleanup(void) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_enable_s1_mode(void) +int nas_proc_enable_s1_mode(nas_user_t *user) { LOG_FUNC_IN; @@ -190,9 +177,9 @@ int nas_proc_enable_s1_mode(void) * Notify the EMM procedure call manager that EPS capability * of the UE is enabled */ - _nas_proc_data.EPS_capability_status = TRUE; + user->proc.EPS_capability_status = TRUE; emm_sap.primitive = EMMREG_S1_ENABLED; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -212,7 +199,7 @@ int nas_proc_enable_s1_mode(void) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_disable_s1_mode(void) +int nas_proc_disable_s1_mode(nas_user_t *user) { LOG_FUNC_IN; @@ -223,9 +210,9 @@ int nas_proc_disable_s1_mode(void) * Notify the EMM procedure call manager that EPS capability * of the UE is disabled */ - _nas_proc_data.EPS_capability_status = FALSE; + user->proc.EPS_capability_status = FALSE; emm_sap.primitive = EMMREG_S1_DISABLED; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -245,11 +232,11 @@ int nas_proc_disable_s1_mode(void) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_eps(int *stat) +int nas_proc_get_eps(nas_user_t *user, int *stat) { LOG_FUNC_IN; - *stat = _nas_proc_data.EPS_capability_status; + *stat = user->proc.EPS_capability_status; LOG_FUNC_RETURN (RETURNok); } @@ -268,11 +255,11 @@ int nas_proc_get_eps(int *stat) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_imsi(char *imsi_str) +int nas_proc_get_imsi(emm_data_t *emm_data, char *imsi_str) { LOG_FUNC_IN; - const imsi_t *imsi = emm_main_get_imsi(); + const imsi_t *imsi = emm_main_get_imsi(emm_data); if (imsi != NULL) { int offset = 0; @@ -316,11 +303,11 @@ int nas_proc_get_imsi(char *imsi_str) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_msisdn(char *msisdn_str, int *ton_npi) +int nas_proc_get_msisdn(nas_user_t *user, char *msisdn_str, int *ton_npi) { LOG_FUNC_IN; - const msisdn_t *msisdn = emm_main_get_msisdn(); + const msisdn_t *msisdn = emm_main_get_msisdn(user); if (msisdn != NULL) { union { @@ -365,12 +352,12 @@ int nas_proc_get_msisdn(char *msisdn_str, int *ton_npi) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_signal_quality(int *rsrq, int *rsrp) +int nas_proc_get_signal_quality(nas_user_t *user, int *rsrq, int *rsrp) { LOG_FUNC_IN; - *rsrq = _nas_proc_data.rsrq; - *rsrp = _nas_proc_data.rsrp; + *rsrq = user->proc.rsrq; + *rsrp = user->proc.rsrp; LOG_FUNC_RETURN (RETURNok); } @@ -394,7 +381,7 @@ int nas_proc_get_signal_quality(int *rsrq, int *rsrp) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_register(int mode, int format, const network_plmn_t *oper, int AcT) +int nas_proc_register(nas_user_t *user, int mode, int format, const network_plmn_t *oper, int AcT) { LOG_FUNC_IN; @@ -403,7 +390,7 @@ int nas_proc_register(int mode, int format, const network_plmn_t *oper, int AcT) /* * Set the PLMN selection mode of operation */ - int index = emm_main_set_plmn_selection_mode(mode, format, oper, AcT); + int index = emm_main_set_plmn_selection_mode(user, mode, format, oper, AcT); if ( !(index < 0) ) { /* @@ -413,7 +400,7 @@ int nas_proc_register(int mode, int format, const network_plmn_t *oper, int AcT) emm_sap_t emm_sap; emm_sap.primitive = EMMREG_REGISTER_REQ; emm_sap.u.emm_reg.u.regist.index = index; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } LOG_FUNC_RETURN (rc); @@ -433,7 +420,7 @@ int nas_proc_register(int mode, int format, const network_plmn_t *oper, int AcT) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_deregister(void) +int nas_proc_deregister(nas_user_t *user) { LOG_FUNC_IN; @@ -463,22 +450,22 @@ int nas_proc_deregister(void) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_reg_data(int *mode, int *selected, int format, +int nas_proc_get_reg_data(nas_user_t *user, int *mode, int *selected, int format, network_plmn_t *oper, int *AcT) { LOG_FUNC_IN; /* Get the PLMN selection mode of operation */ - *mode = emm_main_get_plmn_selection_mode(); + *mode = emm_main_get_plmn_selection_mode(user->emm_data); /* Get the currently selected operator */ - const char *oper_name = emm_main_get_selected_plmn(oper, format); + const char *oper_name = emm_main_get_selected_plmn(user->emm_plmn_list, user->emm_data, oper, format); if (oper_name != NULL) { /* An operator is currently selected */ *selected = TRUE; /* Get the supported Radio Access Technology */ - *AcT = emm_main_get_plmn_rat(); + *AcT = emm_main_get_plmn_rat(user->emm_data); } else { /* No any operator is selected */ *selected = FALSE; @@ -502,11 +489,11 @@ int nas_proc_get_reg_data(int *mode, int *selected, int format, ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_oper_list(const char **oper_list) +int nas_proc_get_oper_list(nas_user_t *user, const char **oper_list) { LOG_FUNC_IN; - int size = emm_main_get_plmn_list(oper_list); + int size = emm_main_get_plmn_list(user->emm_plmn_list, user->emm_data, oper_list); LOG_FUNC_RETURN (size); } @@ -527,11 +514,11 @@ int nas_proc_get_oper_list(const char **oper_list) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_reg_status(int *stat) +int nas_proc_get_reg_status(nas_user_t *user, int *stat) { LOG_FUNC_IN; - *stat = emm_main_get_plmn_status(); + *stat = emm_main_get_plmn_status(user->emm_data); LOG_FUNC_RETURN (RETURNok); } @@ -555,13 +542,13 @@ int nas_proc_get_reg_status(int *stat) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_loc_info(char *tac, char *ci, int *AcT) +int nas_proc_get_loc_info(nas_user_t *user, char *tac, char *ci, int *AcT) { LOG_FUNC_IN; - sprintf(tac, "%.4x", emm_main_get_plmn_tac()); // two byte - sprintf(ci, "%.8x", emm_main_get_plmn_ci()); // four byte - *AcT = emm_main_get_plmn_rat(); // E-UTRAN + sprintf(tac, "%.4x", emm_main_get_plmn_tac(user->emm_data)); // two byte + sprintf(ci, "%.8x", emm_main_get_plmn_ci(user->emm_data)); // four byte + *AcT = emm_main_get_plmn_rat(user->emm_data); // E-UTRAN LOG_FUNC_RETURN (RETURNok); } @@ -580,18 +567,18 @@ int nas_proc_get_loc_info(char *tac, char *ci, int *AcT) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_detach(int switch_off) +int nas_proc_detach(nas_user_t *user, int switch_off) { LOG_FUNC_IN; emm_sap_t emm_sap; int rc = RETURNok; - if ( emm_main_is_attached() ) { + if ( emm_main_is_attached(user->emm_data) ) { /* Initiate an Detach procedure */ emm_sap.primitive = EMMREG_DETACH_INIT; emm_sap.u.emm_reg.u.detach.switch_off = switch_off; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } LOG_FUNC_RETURN (rc); @@ -611,18 +598,18 @@ int nas_proc_detach(int switch_off) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_attach(void) +int nas_proc_attach(nas_user_t *user) { LOG_FUNC_IN; emm_sap_t emm_sap; int rc = RETURNok; - if ( !emm_main_is_attached() ) { + if ( !emm_main_is_attached(user->emm_data) ) { /* Initiate an Attach procedure */ emm_sap.primitive = EMMREG_ATTACH_INIT; emm_sap.u.emm_reg.u.attach.is_emergency = FALSE; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } LOG_FUNC_RETURN (rc); @@ -643,11 +630,11 @@ int nas_proc_attach(void) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_attach_status(void) +int nas_proc_get_attach_status(nas_user_t *user) { LOG_FUNC_IN; - int is_attached = emm_main_is_attached(); + int is_attached = emm_main_is_attached(user->emm_data); LOG_FUNC_RETURN (is_attached); } @@ -666,11 +653,11 @@ int nas_proc_get_attach_status(void) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_pdn_range(void) +int nas_proc_get_pdn_range(esm_data_t *esm_data) { LOG_FUNC_IN; - int max_pdn_id = esm_main_get_nb_pdns_max(); + int max_pdn_id = esm_main_get_nb_pdns_max(esm_data); LOG_FUNC_RETURN (max_pdn_id); } @@ -691,7 +678,7 @@ int nas_proc_get_pdn_range(void) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_pdn_status(int *cids, int *states, int n_pdn_max) +int nas_proc_get_pdn_status(nas_user_t *user, int *cids, int *states, int n_pdn_max) { LOG_FUNC_IN; @@ -699,13 +686,13 @@ int nas_proc_get_pdn_status(int *cids, int *states, int n_pdn_max) int n_defined_pdn = 0; /* Get the maximum number of supported PDN contexts */ - int n_pdn = esm_main_get_nb_pdns_max(); + int n_pdn = esm_main_get_nb_pdns_max(user->esm_data); /* For all PDN contexts */ for (cid = 1; (cid < n_pdn+1) && (n_defined_pdn < n_pdn_max); cid++) { /* Get the status of this PDN */ int state = FALSE; - int is_defined = esm_main_get_pdn_status(cid, &state); + int is_defined = esm_main_get_pdn_status(user, cid, &state); if (is_defined != FALSE) { /* This PDN has been defined */ @@ -735,7 +722,7 @@ int nas_proc_get_pdn_status(int *cids, int *states, int n_pdn_max) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_pdn_param(int *cids, int *types, const char **apns, +int nas_proc_get_pdn_param(esm_data_t *esm_data, int *cids, int *types, const char **apns, int n_pdn_max) { LOG_FUNC_IN; @@ -744,13 +731,13 @@ int nas_proc_get_pdn_param(int *cids, int *types, const char **apns, int n_defined_pdn = 0; /* Get the maximum number of supported PDN contexts */ - int n_pdn = esm_main_get_nb_pdns_max(); + int n_pdn = esm_main_get_nb_pdns_max(esm_data); /* For all PDN contexts */ for (cid = 1; (cid < n_pdn+1) && (n_defined_pdn < n_pdn_max); cid++) { int emergency, active; /* Get PDN connection parameters */ - int rc = esm_main_get_pdn(cid, types, apns, &emergency, &active); + int rc = esm_main_get_pdn(esm_data, cid, types, apns, &emergency, &active); if (rc != RETURNerror) { /* This PDN has been defined */ @@ -787,7 +774,7 @@ int nas_proc_get_pdn_param(int *cids, int *types, const char **apns, ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_get_pdn_addr(int cid, int *cids, const char **addr1, +int nas_proc_get_pdn_addr(nas_user_t *user, int cid, int *cids, const char **addr1, const char **addr2, int n_pdn_max) { LOG_FUNC_IN; @@ -797,7 +784,7 @@ int nas_proc_get_pdn_addr(int cid, int *cids, const char **addr1, if (cid > 0) { /* Get addresses assigned to the specified PDN */ - rc = esm_main_get_pdn_addr(cid, addr1, addr2); + rc = esm_main_get_pdn_addr(user->esm_data, cid, addr1, addr2); if (rc != RETURNerror) { *cids = cid; @@ -805,12 +792,12 @@ int nas_proc_get_pdn_addr(int cid, int *cids, const char **addr1, } } else if (cid < 0) { /* Get the maximum number of supported PDN contexts */ - int n_pdn = esm_main_get_nb_pdns_max(); + int n_pdn = esm_main_get_nb_pdns_max(user->esm_data); /* For all PDN contexts */ for (cid = 1; (cid < n_pdn+1) && (n_defined_pdn < n_pdn_max); cid++) { /* Get PDN connection addresses */ - rc = esm_main_get_pdn_addr(cid, addr1, addr2); + rc = esm_main_get_pdn_addr(user->esm_data, cid, addr1, addr2); if (rc != RETURNerror) { /* This PDN has been defined */ @@ -850,7 +837,7 @@ int nas_proc_get_pdn_addr(int cid, int *cids, const char **addr1, ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_set_pdn(int cid, int type, const char *apn, int ipv4_addr, +int nas_proc_set_pdn(nas_user_t *user, int cid, int type, const char *apn, int ipv4_addr, int emergency, int p_cscf, int im_cn_signal) { LOG_FUNC_IN; @@ -869,7 +856,7 @@ int nas_proc_set_pdn(int cid, int type, const char *apn, int ipv4_addr, * Notify ESM that a new PDN context has to be defined for * the specified APN */ - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); LOG_FUNC_RETURN (rc); } @@ -888,7 +875,7 @@ int nas_proc_set_pdn(int cid, int type, const char *apn, int ipv4_addr, ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_reset_pdn(int cid) +int nas_proc_reset_pdn(nas_user_t *user, int cid) { LOG_FUNC_IN; @@ -902,7 +889,7 @@ int nas_proc_reset_pdn(int cid) /* * Notify ESM that the specified PDN context has to be undefined */ - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); LOG_FUNC_RETURN (rc); } @@ -922,7 +909,7 @@ int nas_proc_reset_pdn(int cid) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_deactivate_pdn(int cid) +int nas_proc_deactivate_pdn(nas_user_t *user, int cid) { LOG_FUNC_IN; @@ -930,15 +917,15 @@ int nas_proc_deactivate_pdn(int cid) if (cid > 0) { /* Deactivate only the specified PDN context */ - rc = _nas_proc_deactivate(cid, FALSE); + rc = _nas_proc_deactivate(user, cid, FALSE); } else { /* Do not deactivate the PDN connection established during initial * network attachment (identifier 1) */ cid = 2; /* Deactivate all active PDN contexts */ - while ((rc != RETURNerror) && (cid < esm_main_get_nb_pdns_max()+1)) { - rc = _nas_proc_deactivate(cid++, TRUE); + while ((rc != RETURNerror) && (cid < esm_main_get_nb_pdns_max(user->esm_data)+1)) { + rc = _nas_proc_deactivate(user, cid++, TRUE); } } @@ -961,20 +948,20 @@ int nas_proc_deactivate_pdn(int cid) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_activate_pdn(int cid) +int nas_proc_activate_pdn(nas_user_t *user, int cid) { LOG_FUNC_IN; int rc = RETURNok; - if ( !emm_main_is_attached() ) { + if ( !emm_main_is_attached(user->emm_data) ) { /* * If the UE is not attached to the network, perform EPS attach * procedure prior to attempt to request any PDN connectivity */ LOG_TRACE(WARNING, "NAS-PROC - UE is not attached to the network"); - rc = nas_proc_attach(); - } else if (emm_main_is_emergency()) { + rc = nas_proc_attach(user); + } else if (emm_main_is_emergency(user->emm_data)) { /* The UE is attached for emergency bearer services; It shall not * request a PDN connection to any other PDN */ LOG_TRACE(WARNING,"NAS-PROC - Attached for emergency bearer services"); @@ -984,13 +971,13 @@ int nas_proc_activate_pdn(int cid) if (rc != RETURNerror) { if (cid > 0) { /* Activate only the specified PDN context */ - rc = _nas_proc_activate(cid, FALSE); + rc = _nas_proc_activate(user, cid, FALSE); } else { cid = 1; /* Activate all defined PDN contexts */ - while ((rc != RETURNerror) && (cid < esm_main_get_nb_pdns_max()+1)) { - rc = _nas_proc_activate(cid++, TRUE); + while ((rc != RETURNerror) && (cid < esm_main_get_nb_pdns_max(user->esm_data)+1)) { + rc = _nas_proc_activate(user, cid++, TRUE); } } } @@ -1028,7 +1015,7 @@ int nas_proc_activate_pdn(int cid) ** Others: _nas_proc_data ** ** ** ***************************************************************************/ -int nas_proc_cell_info(int found, tac_t tac, ci_t ci, AcT_t AcT, +int nas_proc_cell_info(nas_user_t *user, int found, tac_t tac, ci_t ci, AcT_t AcT, uint8_t rsrq, uint8_t rsrp) { LOG_FUNC_IN; @@ -1037,8 +1024,8 @@ int nas_proc_cell_info(int found, tac_t tac, ci_t ci, AcT_t AcT, int rc; /* Store LTE signal strength/quality measurement data */ - _nas_proc_data.rsrq = rsrq; - _nas_proc_data.rsrp = rsrp; + user->proc.rsrq = rsrq; + user->proc.rsrp = rsrp; /* * Notify the EMM procedure call manager that cell information @@ -1051,7 +1038,7 @@ int nas_proc_cell_info(int found, tac_t tac, ci_t ci, AcT_t AcT, emm_sap.u.emm_as.u.cell_info.tac = tac; emm_sap.u.emm_as.u.cell_info.cellID = ci; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -1073,7 +1060,7 @@ int nas_proc_cell_info(int found, tac_t tac, ci_t ci, AcT_t AcT, ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_establish_cnf(const Byte_t *data, uint32_t len) +int nas_proc_establish_cnf(nas_user_t *user, const Byte_t *data, uint32_t len) { LOG_FUNC_IN; @@ -1088,7 +1075,7 @@ int nas_proc_establish_cnf(const Byte_t *data, uint32_t len) emm_sap.primitive = EMMAS_ESTABLISH_CNF; emm_sap.u.emm_as.u.establish.NASmsg.length = len; emm_sap.u.emm_as.u.establish.NASmsg.value = (uint8_t *)data; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -1110,7 +1097,7 @@ int nas_proc_establish_cnf(const Byte_t *data, uint32_t len) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_establish_rej(void) +int nas_proc_establish_rej(nas_user_t *user) { LOG_FUNC_IN; @@ -1123,7 +1110,7 @@ int nas_proc_establish_rej(void) * from lower layers */ emm_sap.primitive = EMMAS_ESTABLISH_REJ; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -1143,7 +1130,7 @@ int nas_proc_establish_rej(void) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_release_ind(int cause) +int nas_proc_release_ind(nas_user_t *user, int cause) { LOG_FUNC_IN; @@ -1156,7 +1143,7 @@ int nas_proc_release_ind(int cause) */ emm_sap.primitive = EMMAS_RELEASE_IND; emm_sap.u.emm_as.u.release.cause = cause; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -1177,7 +1164,7 @@ int nas_proc_release_ind(int cause) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_ul_transfer_cnf(void) +int nas_proc_ul_transfer_cnf(nas_user_t *user) { LOG_FUNC_IN; @@ -1190,10 +1177,10 @@ int nas_proc_ul_transfer_cnf(void) * receiver side */ emm_sap.primitive = EMMAS_DATA_IND; - emm_sap.u.emm_as.u.data.ueid = 0; + emm_sap.u.emm_as.u.data.ueid = user->ueid; emm_sap.u.emm_as.u.data.delivered = TRUE; emm_sap.u.emm_as.u.data.NASmsg.length = 0; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -1214,7 +1201,7 @@ int nas_proc_ul_transfer_cnf(void) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_ul_transfer_rej(void) +int nas_proc_ul_transfer_rej(nas_user_t *user) { LOG_FUNC_IN; @@ -1227,10 +1214,10 @@ int nas_proc_ul_transfer_rej(void) * from lower layers */ emm_sap.primitive = EMMAS_DATA_IND; - emm_sap.u.emm_as.u.data.ueid = 0; + emm_sap.u.emm_as.u.data.ueid = user->ueid; emm_sap.u.emm_as.u.data.delivered = FALSE; emm_sap.u.emm_as.u.data.NASmsg.length = 0; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); LOG_FUNC_RETURN (rc); } @@ -1251,7 +1238,7 @@ int nas_proc_ul_transfer_rej(void) ** Others: None ** ** ** ***************************************************************************/ -int nas_proc_dl_transfer_ind(const Byte_t *data, uint32_t len) +int nas_proc_dl_transfer_ind(nas_user_t *user, const Byte_t *data, uint32_t len) { LOG_FUNC_IN; @@ -1264,11 +1251,11 @@ int nas_proc_dl_transfer_ind(const Byte_t *data, uint32_t len) * indication has been received from the Access-Stratum sublayer */ emm_sap.primitive = EMMAS_DATA_IND; - emm_sap.u.emm_as.u.data.ueid = 0; + emm_sap.u.emm_as.u.data.ueid = user->ueid; emm_sap.u.emm_as.u.data.delivered = TRUE; emm_sap.u.emm_as.u.data.NASmsg.length = len; emm_sap.u.emm_as.u.data.NASmsg.value = (uint8_t *)data; - rc = emm_sap_send(&emm_sap); + rc = emm_sap_send(user, &emm_sap); } LOG_FUNC_RETURN (rc); @@ -1298,7 +1285,7 @@ int nas_proc_dl_transfer_ind(const Byte_t *data, uint32_t len) ** Others: None ** ** ** ***************************************************************************/ -static int _nas_proc_activate(int cid, int apply_to_all) +static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all) { LOG_FUNC_IN; @@ -1308,7 +1295,7 @@ static int _nas_proc_activate(int cid, int apply_to_all) esm_sap_t esm_sap; /* Get PDN context parameters */ - rc = esm_main_get_pdn(cid, &esm_sap.data.pdn_connect.pdn_type, + rc = esm_main_get_pdn(user->esm_data, cid, &esm_sap.data.pdn_connect.pdn_type, &esm_sap.data.pdn_connect.apn, &esm_sap.data.pdn_connect.is_emergency, &active); @@ -1330,7 +1317,7 @@ static int _nas_proc_activate(int cid, int apply_to_all) } if (esm_sap.data.pdn_connect.is_emergency) { - if (esm_main_has_emergency()) { + if (esm_main_has_emergency(user->esm_data)) { /* There is already a PDN connection for emergency * bearer services established; the UE shall not * request an additional PDN connection for emer- @@ -1349,7 +1336,7 @@ static int _nas_proc_activate(int cid, int apply_to_all) esm_sap.is_standalone = TRUE; esm_sap.data.pdn_connect.is_defined = TRUE; esm_sap.data.pdn_connect.cid = cid; - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); LOG_FUNC_RETURN (rc); } @@ -1371,7 +1358,7 @@ static int _nas_proc_activate(int cid, int apply_to_all) ** Others: None ** ** ** ***************************************************************************/ -static int _nas_proc_deactivate(int cid, int apply_to_all) +static int _nas_proc_deactivate(nas_user_t *user, int cid, int apply_to_all) { LOG_FUNC_IN; @@ -1382,7 +1369,7 @@ static int _nas_proc_deactivate(int cid, int apply_to_all) int active = FALSE; /* Get PDN context parameters */ - rc = esm_main_get_pdn(cid, &pdn_type, &apn, &emergency, &active); + rc = esm_main_get_pdn(user->esm_data, cid, &pdn_type, &apn, &emergency, &active); if (rc != RETURNok) { /* No any context is defined for the specified PDN */ @@ -1400,7 +1387,7 @@ static int _nas_proc_deactivate(int cid, int apply_to_all) LOG_FUNC_RETURN (RETURNok); } - if (esm_main_get_nb_pdns() > 1) { + if (esm_main_get_nb_pdns(user->esm_data) > 1) { /* * Notify ESM that all EPS bearers towards the specified PDN * has to be released @@ -1408,7 +1395,7 @@ static int _nas_proc_deactivate(int cid, int apply_to_all) esm_sap_t esm_sap; esm_sap.primitive = ESM_PDN_DISCONNECT_REQ; esm_sap.data.pdn_disconnect.cid = cid; - rc = esm_sap_send(&esm_sap); + rc = esm_sap_send(user, &esm_sap); } else { /* For EPS, if an attempt is made to disconnect the last PDN * connection, then the MT responds with an error */ diff --git a/openair3/NAS/UE/nas_proc.h b/openair3/NAS/UE/nas_proc.h old mode 100755 new mode 100644 index 666c97f6dc..4e653549ae --- a/openair3/NAS/UE/nas_proc.h +++ b/openair3/NAS/UE/nas_proc.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_proc.h @@ -47,6 +40,10 @@ Description NAS procedure call manager #include "commonDef.h" #include "networkDef.h" +#include "user_defs.h" +#include "emm_main.h" +#include "esm_ebr.h" +#include "esmData.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -64,10 +61,10 @@ Description NAS procedure call manager /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -void nas_proc_initialize(emm_indication_callback_t emm_cb, +void nas_proc_initialize(nas_user_t *user, emm_indication_callback_t emm_cb, esm_indication_callback_t esm_cb, const char *imei); -void nas_proc_cleanup(void); +void nas_proc_cleanup(nas_user_t *user); /* * -------------------------------------------------------------------------- @@ -75,39 +72,39 @@ void nas_proc_cleanup(void); * -------------------------------------------------------------------------- */ -int nas_proc_enable_s1_mode(void); -int nas_proc_disable_s1_mode(void); -int nas_proc_get_eps(int *stat); +int nas_proc_enable_s1_mode(nas_user_t *user); +int nas_proc_disable_s1_mode(nas_user_t *user); +int nas_proc_get_eps(nas_user_t *user, int *stat); -int nas_proc_get_imsi(char *imsi_str); -int nas_proc_get_msisdn(char *msisdn_str, int *ton_npi); +int nas_proc_get_imsi(emm_data_t *emm_data, char *imsi_str); +int nas_proc_get_msisdn(nas_user_t *user, char *msisdn_str, int *ton_npi); -int nas_proc_get_signal_quality(int *rsrq, int *rsrp); +int nas_proc_get_signal_quality(nas_user_t *user, int *rsrq, int *rsrp); -int nas_proc_register(int mode, int format, const network_plmn_t *oper, int AcT); -int nas_proc_deregister(void); -int nas_proc_get_reg_data(int *mode, int *selected, int format, +int nas_proc_register(nas_user_t *user, int mode, int format, const network_plmn_t *oper, int AcT); +int nas_proc_deregister(nas_user_t *user); +int nas_proc_get_reg_data(nas_user_t *user, int *mode, int *selected, int format, network_plmn_t *oper, int *AcT); -int nas_proc_get_oper_list(const char **oper_list); +int nas_proc_get_oper_list(nas_user_t *user, const char **oper_list); -int nas_proc_get_reg_status(int *stat); -int nas_proc_get_loc_info(char *tac, char *ci, int *AcT); +int nas_proc_get_reg_status(nas_user_t *user, int *stat); +int nas_proc_get_loc_info(nas_user_t *user, char *tac, char *ci, int *AcT); -int nas_proc_detach(int switch_off); -int nas_proc_attach(void); -int nas_proc_get_attach_status(void); +int nas_proc_detach(nas_user_t *user, int switch_off); +int nas_proc_attach(nas_user_t *user); +int nas_proc_get_attach_status(nas_user_t *user); -int nas_proc_reset_pdn(int cid); -int nas_proc_set_pdn(int cid, int type, const char *apn, int ipv4_addr, +int nas_proc_reset_pdn(nas_user_t *user, int cid); +int nas_proc_set_pdn(nas_user_t *user, int cid, int type, const char *apn, int ipv4_addr, int emergency, int p_cscf, int im_cn_signal); -int nas_proc_get_pdn_range(void); -int nas_proc_get_pdn_status(int *cids, int *states, int n_pdn_max); -int nas_proc_get_pdn_param(int *cids, int *types, const char **apns, +int nas_proc_get_pdn_range(esm_data_t *esm_data); +int nas_proc_get_pdn_status(nas_user_t *user, int *cids, int *states, int n_pdn_max); +int nas_proc_get_pdn_param(esm_data_t *esm_data, int *cids, int *types, const char **apns, int n_pdn_max); -int nas_proc_get_pdn_addr(int cid, int *cids, const char **addr1, +int nas_proc_get_pdn_addr(nas_user_t *user, int cid, int *cids, const char **addr1, const char **addr2, int n_addr_max); -int nas_proc_deactivate_pdn(int cid); -int nas_proc_activate_pdn(int cid); +int nas_proc_deactivate_pdn(nas_user_t *user, int cid); +int nas_proc_activate_pdn(nas_user_t *user, int cid); /* * -------------------------------------------------------------------------- @@ -115,17 +112,17 @@ int nas_proc_activate_pdn(int cid); * -------------------------------------------------------------------------- */ -int nas_proc_cell_info(int found, tac_t tac, ci_t ci, AcT_t rat, uint8_t rsrp, +int nas_proc_cell_info(nas_user_t *user, int found, tac_t tac, ci_t ci, AcT_t rat, uint8_t rsrp, uint8_t rsrq); -int nas_proc_establish_cnf(const Byte_t *data, uint32_t len); -int nas_proc_establish_rej(void); +int nas_proc_establish_cnf(nas_user_t *user, const Byte_t *data, uint32_t len); +int nas_proc_establish_rej(nas_user_t *user); -int nas_proc_release_ind(int cause); +int nas_proc_release_ind(nas_user_t *user, int cause); -int nas_proc_ul_transfer_cnf(void); -int nas_proc_ul_transfer_rej(void); -int nas_proc_dl_transfer_ind(const Byte_t *data, uint32_t len); +int nas_proc_ul_transfer_cnf(nas_user_t *user); +int nas_proc_ul_transfer_rej(nas_user_t *user); +int nas_proc_dl_transfer_ind(nas_user_t *user, const Byte_t *data, uint32_t len); diff --git a/openair3/NAS/UE/nas_proc_defs.h b/openair3/NAS/UE/nas_proc_defs.h new file mode 100644 index 0000000000..1ce2bfd929 --- /dev/null +++ b/openair3/NAS/UE/nas_proc_defs.h @@ -0,0 +1,43 @@ +#ifndef _NAS_PROC_DEFS_H +#define _NAS_PROC_DEFS_H + +/* + * Local NAS data + */ +typedef struct { + /* EPS capibility status */ + int EPS_capability_status; + /* Reference signal received quality */ + int rsrq; + /* Reference signal received power */ + int rsrp; +} proc_data_t; + +/* + * MT SIM pending status (see ETSI TS 127 007 V10.6.0, Note 2) + * Commands which interact with MT that are accepted when MT is pending SIM PIN, + * SIM PUK, or PH-SIM are: +CGMI, +CGMM, +CGMR, +CGSN, D112; (emergency call), + * +CPAS, +CFUN, +CPIN, +CPINR, +CDIS (read and test command only), and +CIND + * (read and test command only). +*/ +typedef enum { + NAS_USER_READY, /* MT is not pending for any password */ + NAS_USER_SIM_PIN, /* MT is waiting SIM PIN to be given */ + NAS_USER_SIM_PUK, /* MT is waiting SIM PUK to be given */ + NAS_USER_PH_SIM_PIN /* MT is waiting phone-to-SIM card + * password to be given */ +} nas_user_sim_status; + +/* + * The local UE context + */ +typedef struct { + /* Firmware version number */ + const char *version; + /* SIM pending status */ + nas_user_sim_status sim_status; + /* Level of functionality */ + int fun; +} nas_user_context_t; + +#endif diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c index ff57901970..e41156d113 100644 --- a/openair3/NAS/UE/nas_ue_task.c +++ b/openair3/NAS/UE/nas_ue_task.c @@ -1,51 +1,50 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +#include "utils.h" #if defined(ENABLE_ITTI) # include "assertions.h" # include "intertask_interface.h" # include "nas_ue_task.h" # include "UTIL/LOG/log.h" -# include "nas_user.h" +# include "user_defs.h" # include "user_api.h" # include "nas_parser.h" # include "nas_proc.h" # include "msc.h" +# include "memory.h" +#include "nas_user.h" + +// FIXME make command line option for NAS_UE_AUTOSTART # define NAS_UE_AUTOSTART 1 +// FIXME review these externs extern unsigned char NB_eNB_INST; extern unsigned char NB_UE_INST; -static int user_fd; +char *make_port_str_from_ueid(const char *base_port_str, int ueid); -static int nas_ue_process_events(struct epoll_event *events, int nb_events) +static int nas_ue_process_events(nas_user_container_t *users, struct epoll_event *events, int nb_events) { int event; int exit_loop = FALSE; @@ -55,8 +54,9 @@ static int nas_ue_process_events(struct epoll_event *events, int nb_events) for (event = 0; event < nb_events; event++) { if (events[event].events != 0) { /* If the event has not been yet been processed (not an itti message) */ - if (events[event].data.fd == user_fd) { - exit_loop = nas_user_receive_and_process(&user_fd, NULL); + nas_user_t *user = find_user_from_fd(users, events[event].data.fd); + if ( user != NULL ) { + exit_loop = nas_user_receive_and_process(user, NULL); } else { LOG_E(NAS, "[UE] Received an event from an unknown fd %d!\n", events[event].data.fd); } @@ -66,6 +66,24 @@ static int nas_ue_process_events(struct epoll_event *events, int nb_events) return (exit_loop); } +// Initialize user api id and port number +void nas_user_api_id_initialize(nas_user_t *user) { + user_api_id_t *user_api_id = calloc_or_fail(sizeof(user_api_id_t)); + user->user_api_id = user_api_id; + char *port = make_port_str_from_ueid(NAS_PARSER_DEFAULT_USER_PORT_NUMBER, user->ueid); + if ( port == NULL ) { + LOG_E(NAS, "[UE %d] can't get port from ueid!", user->ueid); + exit (EXIT_FAILURE); + } + if (user_api_initialize (user_api_id, NAS_PARSER_DEFAULT_USER_HOSTNAME, port, NULL, + NULL) != RETURNok) { + LOG_E(NAS, "[UE %d] user interface initialization failed!", user->ueid); + exit (EXIT_FAILURE); + } + free(port); + itti_subscribe_event_fd (TASK_NAS_UE, user_api_get_fd(user_api_id)); +} + void *nas_ue_task(void *args_p) { int nb_events; @@ -75,25 +93,45 @@ void *nas_ue_task(void *args_p) instance_t instance; unsigned int Mod_id; int result; + nas_user_container_t *users=args_p; itti_mark_task_ready (TASK_NAS_UE); MSC_START_USE(); /* Initialize UE NAS (EURECOM-NAS) */ + for (int i=0; i < users->count; i++) { - /* Initialize user interface (to exchange AT commands with user process) */ - { - if (user_api_initialize (NAS_PARSER_DEFAULT_USER_HOSTNAME, NAS_PARSER_DEFAULT_USER_PORT_NUMBER, NULL, - NULL) != RETURNok) { - LOG_E(NAS, "[UE] user interface initialization failed!"); - exit (EXIT_FAILURE); - } + nas_user_t *user = &users->item[i]; + user->ueid=i; - user_fd = user_api_get_fd (); - itti_subscribe_event_fd (TASK_NAS_UE, user_fd); + /* Get USIM data application filename */ + user->usim_data_store = memory_get_path_from_ueid(USIM_API_NVRAM_DIRNAME, USIM_API_NVRAM_FILENAME, user->ueid); + if ( user->usim_data_store == NULL ) { + LOG_E(NAS, "[UE %d] - Failed to get USIM data application filename", user->ueid); + exit(EXIT_FAILURE); } + /* Get UE's data pathname */ + user->user_nvdata_store = memory_get_path_from_ueid(USER_NVRAM_DIRNAME, USER_NVRAM_FILENAME, user->ueid); + if ( user->user_nvdata_store == NULL ) { + LOG_E(NAS, "[UE %d] - Failed to get USIM nvdata filename", user->ueid); + exit(EXIT_FAILURE); + } + + /* Get EMM data pathname */ + user->emm_nvdata_store = memory_get_path_from_ueid(EMM_NVRAM_DIRNAME, EMM_NVRAM_FILENAME, user->ueid); + if ( user->emm_nvdata_store == NULL ) { + LOG_E(NAS, "[UE %d] - Failed to get EMM nvdata filename", user->ueid); + exit(EXIT_FAILURE); + } + + /* Initialize user interface (to exchange AT commands with user process) */ + nas_user_api_id_initialize(user); + /* allocate needed structures */ + user->user_at_commands = calloc_or_fail(sizeof(user_at_commands_t)); + user->at_response = calloc_or_fail(sizeof(at_response_t)); + user->lowerlayer_data = calloc_or_fail(sizeof(lowerlayer_data_t)); /* Initialize NAS user */ - nas_user_initialize (&user_api_emm_callback, &user_api_esm_callback, FIRMWARE_VERSION); + nas_user_initialize (user, &user_api_emm_callback, &user_api_esm_callback, FIRMWARE_VERSION); } /* Set UE activation state */ @@ -112,6 +150,12 @@ void *nas_ue_task(void *args_p) msg_name = ITTI_MSG_NAME (msg_p); instance = ITTI_MSG_INSTANCE (msg_p); Mod_id = instance - NB_eNB_INST; + if (instance == INSTANCE_DEFAULT) { + printf("%s:%d: FATAL: instance is INSTANCE_DEFAULT, should not happen.\n", + __FILE__, __LINE__); + abort(); + } + nas_user_t *user = &users->item[Mod_id]; switch (ITTI_MSG_ID(msg_p)) { case INITIALIZE_MESSAGE: @@ -121,7 +165,7 @@ void *nas_ue_task(void *args_p) /* Send an activate modem command to NAS like UserProcess should do it */ char *user_data = "at+cfun=1\r"; - nas_user_receive_and_process (&user_fd, user_data); + nas_user_receive_and_process (user, user_data); } #endif break; @@ -141,7 +185,7 @@ void *nas_ue_task(void *args_p) { int cell_found = (NAS_CELL_SELECTION_CNF (msg_p).errCode == AS_SUCCESS); - nas_proc_cell_info (cell_found, NAS_CELL_SELECTION_CNF (msg_p).tac, + nas_proc_cell_info (user, cell_found, NAS_CELL_SELECTION_CNF (msg_p).tac, NAS_CELL_SELECTION_CNF (msg_p).cellID, NAS_CELL_SELECTION_CNF (msg_p).rat, NAS_CELL_SELECTION_CNF (msg_p).rsrq, NAS_CELL_SELECTION_CNF (msg_p).rsrp); } @@ -167,7 +211,7 @@ void *nas_ue_task(void *args_p) if ((NAS_CONN_ESTABLI_CNF (msg_p).errCode == AS_SUCCESS) || (NAS_CONN_ESTABLI_CNF (msg_p).errCode == AS_TERMINATED_NAS)) { - nas_proc_establish_cnf(NAS_CONN_ESTABLI_CNF (msg_p).nasMsg.data, NAS_CONN_ESTABLI_CNF (msg_p).nasMsg.length); + nas_proc_establish_cnf(user, NAS_CONN_ESTABLI_CNF (msg_p).nasMsg.data, NAS_CONN_ESTABLI_CNF (msg_p).nasMsg.length); /* TODO checks if NAS will free the nas message, better to do it there anyway! */ // result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.data); @@ -180,7 +224,7 @@ void *nas_ue_task(void *args_p) LOG_I(NAS, "[UE %d] Received %s: cause %u\n", Mod_id, msg_name, NAS_CONN_RELEASE_IND (msg_p).cause); - nas_proc_release_ind (NAS_CONN_RELEASE_IND (msg_p).cause); + nas_proc_release_ind (user, NAS_CONN_RELEASE_IND (msg_p).cause); break; case NAS_UPLINK_DATA_CNF: @@ -188,9 +232,9 @@ void *nas_ue_task(void *args_p) NAS_UPLINK_DATA_CNF (msg_p).UEid, NAS_UPLINK_DATA_CNF (msg_p).errCode); if (NAS_UPLINK_DATA_CNF (msg_p).errCode == AS_SUCCESS) { - nas_proc_ul_transfer_cnf (); + nas_proc_ul_transfer_cnf (user); } else { - nas_proc_ul_transfer_rej (); + nas_proc_ul_transfer_rej (user); } break; @@ -199,7 +243,7 @@ void *nas_ue_task(void *args_p) LOG_I(NAS, "[UE %d] Received %s: UEid %u, length %u\n", Mod_id, msg_name, NAS_DOWNLINK_DATA_IND (msg_p).UEid, NAS_DOWNLINK_DATA_IND (msg_p).nasMsg.length); - nas_proc_dl_transfer_ind (NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.data, NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.length); + nas_proc_dl_transfer_ind (user, NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.data, NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.length); if (0) { /* TODO checks if NAS will free the nas message, better to do it there anyway! */ @@ -222,10 +266,41 @@ void *nas_ue_task(void *args_p) nb_events = itti_get_events(TASK_NAS_UE, &events); if ((nb_events > 0) && (events != NULL)) { - if (nas_ue_process_events(events, nb_events) == TRUE) { + if (nas_ue_process_events(users, events, nb_events) == TRUE) { LOG_E(NAS, "[UE] Received exit loop\n"); } } } + + free(users); + return NULL; +} + +nas_user_t *find_user_from_fd(nas_user_container_t *users, int fd) { + for (int i=0; icount; i++) { + nas_user_t *user = &users->item[i]; + if (fd == user_api_get_fd(user->user_api_id)) { + return user; + } + } + return NULL; +} + +char *make_port_str_from_ueid(const char *base_port_str, int ueid) { + int port; + int base_port; + char *endptr = NULL; + + base_port = strtol(base_port_str, &endptr, 10); + if ( base_port_str == endptr ) { + return NULL; + } + + port = base_port + ueid; + if ( port<1 || port > 65535 ) { + return NULL; + } + + return itoa(port); } #endif diff --git a/openair3/NAS/UE/nas_ue_task.h b/openair3/NAS/UE/nas_ue_task.h new file mode 100644 index 0000000000..c9890719cb --- /dev/null +++ b/openair3/NAS/UE/nas_ue_task.h @@ -0,0 +1,40 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#ifndef NAS_UE_TASK_H_ +#define NAS_UE_TASK_H_ + +#include "openairinterface5g_limits.h" +#include "user_defs.h" + +// XXX simple array container for multiple users +typedef struct { + size_t count; + nas_user_t item[NUMBER_OF_UE_MAX]; +} nas_user_container_t; + +nas_user_t *find_user_from_fd(nas_user_container_t *users, int fd); + +# if defined(ENABLE_ITTI) +void *nas_ue_task(void *args_p); +# endif + +#endif /* NAS_TASK_H_ */ diff --git a/openair3/NAS/UE/nas_user.c b/openair3/NAS/UE/nas_user.c index 447198b897..d3467eddd5 100644 --- a/openair3/NAS/UE/nas_user.c +++ b/openair3/NAS/UE/nas_user.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_user.c @@ -44,8 +37,7 @@ Description NAS procedure functions triggered by the user *****************************************************************************/ -#include "nas_user.h" -#include "userDef.h" +#include "user_defs.h" #include "nas_log.h" #include "memory.h" @@ -54,6 +46,8 @@ Description NAS procedure functions triggered by the user #include "at_error.h" #include "user_indication.h" #include "nas_proc.h" +#include "nas_user.h" +#include "utils.h" #include "user_api.h" #include // memset, strncpy, strncmp @@ -72,30 +66,30 @@ Description NAS procedure functions triggered by the user * Functions executed upon receiving AT command from the user * --------------------------------------------------------------------- */ -static int _nas_user_proc_cgsn (const at_command_t *data); -static int _nas_user_proc_cgmi (const at_command_t *data); -static int _nas_user_proc_cgmm (const at_command_t *data); -static int _nas_user_proc_cgmr (const at_command_t *data); -static int _nas_user_proc_cimi (const at_command_t *data); -static int _nas_user_proc_cfun (const at_command_t *data); -static int _nas_user_proc_cpin (const at_command_t *data); -static int _nas_user_proc_csq (const at_command_t *data); -static int _nas_user_proc_cesq (const at_command_t *data); -static int _nas_user_proc_cops (const at_command_t *data); -static int _nas_user_proc_cgatt (const at_command_t *data); -static int _nas_user_proc_creg (const at_command_t *data); -static int _nas_user_proc_cgreg (const at_command_t *data); -static int _nas_user_proc_cereg (const at_command_t *data); -static int _nas_user_proc_cgdcont (const at_command_t *data); -static int _nas_user_proc_cgact (const at_command_t *data); -static int _nas_user_proc_cmee (const at_command_t *data); -static int _nas_user_proc_clck (const at_command_t *data); -static int _nas_user_proc_cgpaddr (const at_command_t *data); -static int _nas_user_proc_cnum (const at_command_t *data); -static int _nas_user_proc_clac (const at_command_t *data); +static int _nas_user_proc_cgsn (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cgmi (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cgmm (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cgmr (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cimi (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cfun (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cpin (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_csq (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cesq (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cops (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cgatt (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_creg (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cgreg (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cereg (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cgdcont (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cgact (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cmee (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_clck (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cgpaddr (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_cnum (nas_user_t *user, const at_command_t *data); +static int _nas_user_proc_clac (nas_user_t *user, const at_command_t *data); /* NAS procedures applicable to AT commands */ -typedef int (*_nas_user_procedure_t) (const at_command_t *); +typedef int (*_nas_user_procedure_t) (nas_user_t *, const at_command_t *); static _nas_user_procedure_t _nas_user_procedure[AT_COMMAND_ID_MAX] = { NULL, @@ -122,31 +116,12 @@ static _nas_user_procedure_t _nas_user_procedure[AT_COMMAND_ID_MAX] = { _nas_user_proc_cgpaddr, /* CGPADDR */ }; -/* - * Internal representation of data structure returned to the user - * as the result of NAS procedure function call - */ -static at_response_t _nas_user_data = {}; - /* * --------------------------------------------------------------------- * Local UE context * --------------------------------------------------------------------- */ -/* - * MT SIM pending status (see ETSI TS 127 007 V10.6.0, Note 2) - * Commands which interact with MT that are accepted when MT is pending SIM PIN, - * SIM PUK, or PH-SIM are: +CGMI, +CGMM, +CGMR, +CGSN, D112; (emergency call), - * +CPAS, +CFUN, +CPIN, +CPINR, +CDIS (read and test command only), and +CIND - * (read and test command only). -*/ -typedef enum { - NAS_USER_READY, /* MT is not pending for any password */ - NAS_USER_SIM_PIN, /* MT is waiting SIM PIN to be given */ - NAS_USER_SIM_PUK, /* MT is waiting SIM PUK to be given */ - NAS_USER_PH_SIM_PIN /* MT is waiting phone-to-SIM card - * password to be given */ -} nas_user_sim_status; + static const char *_nas_user_sim_status_str[] = { "READY", "SIM PIN", @@ -154,29 +129,16 @@ static const char *_nas_user_sim_status_str[] = { "PH-SIM PIN" }; -/* - * The local UE context - */ -static struct { - /* Firmware version number */ - const char *version; - /* SIM pending status */ - nas_user_sim_status sim_status; - /* Level of functionality */ - int fun; -} _nas_user_context; - -/* - * --------------------------------------------------------------------- - * UE parameters stored in the UE's non-volatile memory device - * --------------------------------------------------------------------- - */ -static user_nvdata_t _nas_user_nvdata; - /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ +void _nas_user_context_initialize(nas_user_context_t *nas_user_context, const char *version) { + nas_user_context->version = version; + nas_user_context->sim_status = NAS_USER_SIM_PIN; + nas_user_context->fun = AT_CFUN_FUN_DEFAULT; +} + /**************************************************************************** ** ** ** Name: nas_user_initialize() ** @@ -190,38 +152,27 @@ static user_nvdata_t _nas_user_nvdata; ** ** ** Outputs: None ** ** Return: None ** - ** Others: _nas_user_nvdata, _nas_user_context ** ** ** ***************************************************************************/ -void nas_user_initialize(emm_indication_callback_t emm_cb, +void nas_user_initialize(nas_user_t *user, emm_indication_callback_t emm_cb, esm_indication_callback_t esm_cb, const char *version) { LOG_FUNC_IN; - /* Get UE's data pathname */ - char *path = memory_get_path(USER_NVRAM_DIRNAME, USER_NVRAM_FILENAME); - - if (path == NULL) { - LOG_TRACE(ERROR, "USR-MAIN - Failed to get UE's data pathname"); - } + user->nas_user_nvdata = calloc_or_fail(sizeof(user_nvdata_t)); /* Get UE data stored in the non-volatile memory device */ - else { - int rc = memory_read(path, &_nas_user_nvdata, sizeof(user_nvdata_t)); - - if (rc != RETURNok) { - LOG_TRACE(ERROR, "USR-MAIN - Failed to read %s", path); - } - - free(path); + int rc = memory_read(user->user_nvdata_store, user->nas_user_nvdata, sizeof(user_nvdata_t)); + if (rc != RETURNok) { + LOG_TRACE(ERROR, "USR-MAIN - Failed to read non volatile memory"); + abort(); } - _nas_user_context.version = version; - _nas_user_context.sim_status = NAS_USER_SIM_PIN; - _nas_user_context.fun = AT_CFUN_FUN_DEFAULT; + user->nas_user_context = calloc_or_fail(sizeof(nas_user_context_t)); + _nas_user_context_initialize(user->nas_user_context, version); /* Initialize the internal NAS processing data */ - nas_proc_initialize(emm_cb, esm_cb, _nas_user_nvdata.IMEI); + nas_proc_initialize(user, emm_cb, esm_cb, user->nas_user_nvdata->IMEI); LOG_FUNC_OUT; } @@ -239,7 +190,7 @@ void nas_user_initialize(emm_indication_callback_t emm_cb, ** Outputs: Return: FALSE, TRUE ** ** ** ***************************************************************************/ -int nas_user_receive_and_process(int *fd, char *message) +int nas_user_receive_and_process(nas_user_t *user, char *message) { LOG_FUNC_IN; @@ -247,13 +198,14 @@ int nas_user_receive_and_process(int *fd, char *message) int nb_command; int bytes; int i; + user_api_id_t *user_api_id = user->user_api_id; if (message != NULL) { /* Set the message in receive buffer (Use to simulate reception of data from UserProcess) */ - bytes = user_api_set_data(message); + bytes = user_api_set_data(user_api_id, message); } else { /* Read the user data message */ - bytes = user_api_read_data (*fd); + bytes = user_api_read_data (user_api_id); if (bytes == RETURNerror) { /* Failed to read data from the user application layer; @@ -270,11 +222,11 @@ int nas_user_receive_and_process(int *fd, char *message) } /* Decode the user data message */ - nb_command = user_api_decode_data (bytes); + nb_command = user_api_decode_data (user_api_id, user->user_at_commands, bytes); for (i = 0; i < nb_command; i++) { /* Get the user data to be processed */ - const void *data = user_api_get_data (i); + const void *data = user_api_get_data (user->user_at_commands, i); if (data == NULL) { /* Failed to get user data at the given index; @@ -286,7 +238,7 @@ int nas_user_receive_and_process(int *fd, char *message) } /* Process the user data message */ - ret_code = nas_user_process_data (data); + ret_code = nas_user_process_data (user, data); if (ret_code != RETURNok) { /* The user data message has not been successfully @@ -300,7 +252,7 @@ int nas_user_receive_and_process(int *fd, char *message) /* Send response to UserProcess (If not in simulated reception) */ if (message == NULL) { /* Encode the user data message */ - bytes = user_api_encode_data (nas_user_get_data (), i == nb_command - 1); + bytes = user_api_encode_data (user->user_api_id, nas_user_get_data (user), i == nb_command - 1); if (bytes == RETURNerror) { /* Failed to encode the user data message; @@ -309,7 +261,7 @@ int nas_user_receive_and_process(int *fd, char *message) } /* Send the data message to the user */ - bytes = user_api_send_data (*fd, bytes); + bytes = user_api_send_data (user_api_id, bytes); if (bytes == RETURNerror) { /* Failed to send data to the user application layer; @@ -338,12 +290,12 @@ int nas_user_receive_and_process(int *fd, char *message) ** Outputs: None ** ** Return: RETURNok if the command has been success- ** ** fully executed; RETURNerror otherwise ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -int nas_user_process_data(const void *data) +int nas_user_process_data(nas_user_t *user, const void *data) { LOG_FUNC_IN; + at_response_t *at_response = user->at_response; int ret_code = RETURNerror; @@ -362,18 +314,18 @@ int nas_user_process_data(const void *data) nas_procedure = _nas_user_procedure[user_data->id]; if (nas_procedure != NULL) { - ret_code = (*nas_procedure)(user_data); + ret_code = (*nas_procedure)(user, user_data); } else { /* AT command related to result format only */ - _nas_user_data.id = user_data->id; - _nas_user_data.type = user_data->type; - _nas_user_data.mask = user_data->mask; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = user_data->id; + at_response->type = user_data->type; + at_response->mask = user_data->mask; + at_response->cause_code = AT_ERROR_SUCCESS; ret_code = RETURNok; } } else { LOG_TRACE(ERROR, "USR-MAIN - Data to be processed is null"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } LOG_FUNC_RETURN (ret_code); @@ -396,10 +348,10 @@ int nas_user_process_data(const void *data) ** Others: None ** ** ** ***************************************************************************/ -const void *nas_user_get_data(void) +const void *nas_user_get_data(nas_user_t *user) { LOG_FUNC_IN; - LOG_FUNC_RETURN ((void *) &_nas_user_data); + LOG_FUNC_RETURN ((void *) user->at_response); } /****************************************************************************/ @@ -418,30 +370,29 @@ const void *nas_user_get_data(void) ** ning the IMEI. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_nvdata ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cgsn(const at_command_t *data) +static int _nas_user_proc_cgsn(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cgsn_resp_t *cgsn = &_nas_user_data.response.cgsn; + at_cgsn_resp_t *cgsn = &at_response->response.cgsn; memset(cgsn, 0, sizeof(at_cgsn_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CGSN_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CGSN_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_ACT: /* Get the Product Serial Number Identification (IMEI) */ - strncpy(cgsn->sn, _nas_user_nvdata.IMEI, + strncpy(cgsn->sn, user->nas_user_nvdata->IMEI, AT_RESPONSE_INFO_TEXT_SIZE); break; @@ -452,7 +403,7 @@ static int _nas_user_proc_cgsn(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CGSN command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -470,30 +421,29 @@ static int _nas_user_proc_cgsn(const at_command_t *data) ** le Equipment to which it is connected to. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_nvdata ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cgmi(const at_command_t *data) +static int _nas_user_proc_cgmi(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cgmi_resp_t *cgmi = &_nas_user_data.response.cgmi; + at_cgmi_resp_t *cgmi = &at_response->response.cgmi; memset(cgmi, 0, sizeof(at_cgmi_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CGMI_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CGMI_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_ACT: /* Get the Manufacturer identifier */ - strncpy(cgmi->manufacturer, _nas_user_nvdata.manufacturer, + strncpy(cgmi->manufacturer, user->nas_user_nvdata->manufacturer, AT_RESPONSE_INFO_TEXT_SIZE); break; @@ -504,7 +454,7 @@ static int _nas_user_proc_cgmi(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CGMI command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -522,30 +472,29 @@ static int _nas_user_proc_cgmi(const at_command_t *data) ** Equipment to which it is connected to. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_nvdata ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cgmm(const at_command_t *data) +static int _nas_user_proc_cgmm(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cgmm_resp_t *cgmm = &_nas_user_data.response.cgmm; + at_cgmm_resp_t *cgmm = &at_response->response.cgmm; memset(cgmm, 0, sizeof(at_cgmm_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CGMM_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CGMM_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_ACT: /* Get the Model identifier */ - strncpy(cgmm->model, _nas_user_nvdata.model, + strncpy(cgmm->model, user->nas_user_nvdata->model, AT_RESPONSE_INFO_TEXT_SIZE); break; @@ -556,7 +505,7 @@ static int _nas_user_proc_cgmm(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CGMM command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -575,30 +524,30 @@ static int _nas_user_proc_cgmm(const at_command_t *data) ** Equipment to which it is connected to. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cgmr(const at_command_t *data) +static int _nas_user_proc_cgmr(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cgmr_resp_t *cgmr = &_nas_user_data.response.cgmr; + at_cgmr_resp_t *cgmr = &at_response->response.cgmr; memset(cgmr, 0, sizeof(at_cgmr_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CGMR_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CGMR_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_ACT: /* Get the revision identifier */ - strncpy(cgmr->revision, _nas_user_context.version, + strncpy(cgmr->revision, nas_user_context->version, AT_RESPONSE_INFO_TEXT_SIZE); break; @@ -609,7 +558,7 @@ static int _nas_user_proc_cgmr(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CGMR command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -631,39 +580,39 @@ static int _nas_user_proc_cgmr(const at_command_t *data) ** ning the IMSI. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_nvdata ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cimi(const at_command_t *data) +static int _nas_user_proc_cimi(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cimi_resp_t *cimi = &_nas_user_data.response.cimi; + at_cimi_resp_t *cimi = &at_response->response.cimi; memset(cimi, 0, sizeof(at_cimi_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CIMI_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CIMI_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_ACT: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } /* Get the International Mobile Subscriber Identity (IMSI) */ - ret_code = nas_proc_get_imsi(cimi->IMSI); + ret_code = nas_proc_get_imsi(user->emm_data, cimi->IMSI); if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to get IMSI number"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -675,7 +624,7 @@ static int _nas_user_proc_cimi(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CIMI command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -692,27 +641,27 @@ static int _nas_user_proc_cimi(const at_command_t *data) ** to different power consumption states. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cfun(const at_command_t *data) +static int _nas_user_proc_cfun(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cfun_resp_t *cfun = &_nas_user_data.response.cfun; + at_cfun_resp_t *cfun = &at_response->response.cfun; memset(cfun, 0, sizeof(at_cfun_resp_t)); int fun = AT_CFUN_FUN_DEFAULT; - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CFUN_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CFUN_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_SET: @@ -728,7 +677,7 @@ static int _nas_user_proc_cfun(const at_command_t *data) * return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid" " (%d)", data->command.cfun.rst); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -741,7 +690,7 @@ static int _nas_user_proc_cfun(const at_command_t *data) * is not valid; return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid" " (%d)", data->command.cfun.fun); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -758,7 +707,7 @@ static int _nas_user_proc_cfun(const at_command_t *data) case AT_CFUN_FULL: /* Notify the NAS procedure call manager that the UE is * operational */ - ret_code = nas_proc_enable_s1_mode(); + ret_code = nas_proc_enable_s1_mode(user); break; default: @@ -768,14 +717,14 @@ static int _nas_user_proc_cfun(const at_command_t *data) if (ret_code != RETURNerror) { /* Update the functionality level */ - _nas_user_context.fun = fun; + nas_user_context->fun = fun; } break; case AT_COMMAND_GET: /* Get the MT's functionality level */ - cfun->fun = _nas_user_context.fun; + cfun->fun = nas_user_context->fun; break; case AT_COMMAND_TST: @@ -787,7 +736,7 @@ static int _nas_user_proc_cfun(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CFUN command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -805,25 +754,25 @@ static int _nas_user_proc_cfun(const at_command_t *data) ** can be operated. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_context, _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cpin(const at_command_t *data) +static int _nas_user_proc_cpin(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cpin_resp_t *cpin = &_nas_user_data.response.cpin; + at_cpin_resp_t *cpin = &at_response->response.cpin; memset(cpin, 0, sizeof(at_cpin_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CPIN_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CPIN_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_SET: @@ -832,24 +781,24 @@ static int _nas_user_proc_cpin(const at_command_t *data) * Set command sends to the MT a password which is necessary * before it can be operated */ - if (_nas_user_context.sim_status == NAS_USER_SIM_PIN) { + if (nas_user_context->sim_status == NAS_USER_SIM_PIN) { /* The MT is waiting for PIN password; check the PIN code */ - if (strncmp(_nas_user_nvdata.PIN, + if (strncmp(user->nas_user_nvdata->PIN, data->command.cpin.pin, USER_PIN_SIZE) != 0) { /* The PIN code is NOT matching; return an error message */ LOG_TRACE(ERROR, "USR-MAIN - PIN code is not correct " "(%s)", data->command.cpin.pin); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PASSWD; + at_response->cause_code = AT_ERROR_INCORRECT_PASSWD; ret_code = RETURNerror; } else { /* The PIN code is matching; update the user's PIN * pending status */ - _nas_user_context.sim_status = NAS_USER_READY; + nas_user_context->sim_status = NAS_USER_READY; } } else { /* The MT is NOT waiting for PIN password; * return an error message */ - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_ALLOWED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_ALLOWED; ret_code = RETURNerror; } @@ -861,7 +810,7 @@ static int _nas_user_proc_cpin(const at_command_t *data) * whether some password is required or not. */ strncpy(cpin->code, - _nas_user_sim_status_str[_nas_user_context.sim_status], + _nas_user_sim_status_str[nas_user_context->sim_status], AT_CPIN_RESP_SIZE); break; @@ -873,7 +822,7 @@ static int _nas_user_proc_cpin(const at_command_t *data) /* Other types of AT CPIN command are not valid */ LOG_TRACE(ERROR, "USR-MAIN - AT+CPIN command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -891,30 +840,30 @@ static int _nas_user_proc_cpin(const at_command_t *data) ** Equipment. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_csq(const at_command_t *data) +static int _nas_user_proc_csq(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_csq_resp_t *csq = &_nas_user_data.response.csq; + at_csq_resp_t *csq = &at_response->response.csq; memset(csq, 0, sizeof(at_csq_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CSQ_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CSQ_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_ACT: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } @@ -935,7 +884,7 @@ static int _nas_user_proc_csq(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CSQ command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -952,30 +901,30 @@ static int _nas_user_proc_csq(const at_command_t *data) ** meters. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cesq(const at_command_t *data) +static int _nas_user_proc_cesq(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cesq_resp_t *cesq = &_nas_user_data.response.cesq; + at_cesq_resp_t *cesq = &at_response->response.cesq; memset(cesq, 0, sizeof(at_cesq_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CESQ_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CESQ_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_ACT: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } @@ -986,7 +935,7 @@ static int _nas_user_proc_cesq(const at_command_t *data) cesq->ber = AT_CESQ_BER_UNKNOWN; cesq->rscp = AT_CESQ_RSCP_UNKNOWN; cesq->ecno = AT_CESQ_ECNO_UNKNOWN; - ret_code = nas_proc_get_signal_quality(&cesq->rsrq, &cesq->rsrp); + ret_code = nas_proc_get_signal_quality(user, &cesq->rsrq, &cesq->rsrp); break; case AT_COMMAND_TST: @@ -998,7 +947,7 @@ static int _nas_user_proc_cesq(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CESQ command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -1017,19 +966,19 @@ static int _nas_user_proc_cesq(const at_command_t *data) ** slot. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cops(const at_command_t *data) +static int _nas_user_proc_cops(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cops_resp_t *cops = &_nas_user_data.response.cops; + at_cops_resp_t *cops = &at_response->response.cops; memset(cops, 0, sizeof(at_cops_resp_t)); static int read_format = AT_COPS_FORMAT_DEFAULT; @@ -1042,15 +991,15 @@ static int _nas_user_proc_cops(const at_command_t *data) int oper_is_selected; - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_NO_PARAM; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_NO_PARAM; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_SET: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } @@ -1086,7 +1035,7 @@ static int _nas_user_proc_cops(const at_command_t *data) /* field shall be present */ if ( !(data->mask & AT_COPS_OPER_MASK) ) { LOG_TRACE(ERROR, "USR-MAIN - parameter is not present"); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1094,7 +1043,7 @@ static int _nas_user_proc_cops(const at_command_t *data) /* field shall be present */ if ( !(data->mask & AT_COPS_FORMAT_MASK) ) { LOG_TRACE(ERROR, "USR-MAIN - parameter is not present"); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1105,7 +1054,7 @@ static int _nas_user_proc_cops(const at_command_t *data) /* The value of field is not valid */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid (%d)", data->command.cops.format); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1119,7 +1068,7 @@ static int _nas_user_proc_cops(const at_command_t *data) /* The value of field is not valid */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid (%d)", data->command.cops.AcT); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1147,7 +1096,7 @@ static int _nas_user_proc_cops(const at_command_t *data) /* The value of field is not valid */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid (%d)", data->command.cops.format); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1163,7 +1112,7 @@ static int _nas_user_proc_cops(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - parameter is not supported (%d)", mode); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -1175,22 +1124,22 @@ static int _nas_user_proc_cops(const at_command_t *data) if (ret_code != RETURNerror) { if (mode == AT_COPS_DEREG) { /* Force an attempt to deregister from the network */ - ret_code = nas_proc_deregister(); + ret_code = nas_proc_deregister(user); if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Network deregistration failed"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; break; } } else if (mode != AT_COPS_FORMAT) { /* Force an attempt to automatically/manualy select * and register the GSM/UMTS/EPS network operator */ - ret_code = nas_proc_register(mode, format, + ret_code = nas_proc_register(user, mode, format, &data->command.cops.plmn, AcT); if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Network registration failed (=%d)", mode); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; break; } } @@ -1205,14 +1154,14 @@ static int _nas_user_proc_cops(const at_command_t *data) */ /* Get the current network registration data */ - ret_code = nas_proc_get_reg_data(&mode, + ret_code = nas_proc_get_reg_data(user, &mode, &oper_is_selected, read_format, &cops->get.plmn, &cops->get.AcT); if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to get registration data (=%d)", mode); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; break; } @@ -1228,11 +1177,11 @@ static int _nas_user_proc_cops(const at_command_t *data) /* Set optional parameter bitmask */ if (oper_is_selected) { cops->get.format = read_format; - _nas_user_data.mask |= (AT_COPS_RESP_FORMAT_MASK | + at_response->mask |= (AT_COPS_RESP_FORMAT_MASK | AT_COPS_RESP_OPER_MASK); if (cops->get.AcT != NET_ACCESS_UNAVAILABLE) { - _nas_user_data.mask |= AT_COPS_RESP_ACT_MASK; + at_response->mask |= AT_COPS_RESP_ACT_MASK; } } @@ -1243,13 +1192,13 @@ static int _nas_user_proc_cops(const at_command_t *data) * Test command returns a set of parameters, each representing * an operator present in the network. */ - cops->tst.size = nas_proc_get_oper_list(&cops->tst.data); + cops->tst.size = nas_proc_get_oper_list(user, &cops->tst.data); break; default: LOG_TRACE(ERROR, "USR-MAIN - AT+COPS command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -1266,30 +1215,30 @@ static int _nas_user_proc_cops(const at_command_t *data) ** or detach the MT from, the EPS service. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cgatt(const at_command_t *data) +static int _nas_user_proc_cgatt(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cgatt_resp_t *cgatt = &_nas_user_data.response.cgatt; + at_cgatt_resp_t *cgatt = &at_response->response.cgatt; memset(cgatt, 0, sizeof(at_cgatt_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CGATT_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CGATT_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_SET: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } @@ -1304,7 +1253,7 @@ static int _nas_user_proc_cgatt(const at_command_t *data) * return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid (%d)", data->command.cgatt.state); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1315,16 +1264,16 @@ static int _nas_user_proc_cgatt(const at_command_t *data) ret_code = RETURNerror; if (data->command.cgatt.state == AT_CGATT_ATTACHED) { - ret_code = nas_proc_attach(); + ret_code = nas_proc_attach(user); } else if (data->command.cgatt.state == AT_CGATT_DETACHED) { - ret_code = nas_proc_detach(FALSE); + ret_code = nas_proc_detach(user, FALSE); } if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to attach/detach " "to/from EPS service (=%d)", data->command.cgatt.state); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } } @@ -1335,7 +1284,7 @@ static int _nas_user_proc_cgatt(const at_command_t *data) /* * Read command returns the current EPS service state. */ - if (nas_proc_get_attach_status() != TRUE) { + if (nas_proc_get_attach_status(user) != TRUE) { cgatt->state = AT_CGATT_DETACHED; } else { cgatt->state = AT_CGATT_ATTACHED; @@ -1353,7 +1302,7 @@ static int _nas_user_proc_cgatt(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CGATT command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -1371,32 +1320,32 @@ static int _nas_user_proc_cgatt(const at_command_t *data) ** location information in GERA/UTRA/E-UTRA Network. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_creg(const at_command_t *data) +static int _nas_user_proc_creg(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_creg_resp_t *creg = &_nas_user_data.response.creg; + at_creg_resp_t *creg = &at_response->response.creg; memset(creg, 0, sizeof(at_creg_resp_t)); static int n = AT_CREG_N_DEFAULT; - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_NO_PARAM; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_NO_PARAM; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_SET: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } @@ -1413,7 +1362,7 @@ static int _nas_user_proc_creg(const at_command_t *data) * return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid" " (%d)", data->command.creg.n); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1439,7 +1388,7 @@ static int _nas_user_proc_creg(const at_command_t *data) if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to disable logging of network notification"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -1454,7 +1403,7 @@ static int _nas_user_proc_creg(const at_command_t *data) if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to enable logging of registration status"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -1481,11 +1430,11 @@ static int _nas_user_proc_creg(const at_command_t *data) case AT_CREG_OFF: case AT_CREG_ON: /* Get network registration status */ - ret_code = nas_proc_get_reg_status(&creg->stat); + ret_code = nas_proc_get_reg_status(user, &creg->stat); if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to get registration status"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -1502,7 +1451,7 @@ static int _nas_user_proc_creg(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CREG command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -1520,32 +1469,32 @@ static int _nas_user_proc_creg(const at_command_t *data) ** information in GERA/UTRA Network. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cgreg(const at_command_t *data) +static int _nas_user_proc_cgreg(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cgreg_resp_t *cgreg = &_nas_user_data.response.cgreg; + at_cgreg_resp_t *cgreg = &at_response->response.cgreg; memset(cgreg, 0, sizeof(at_cgreg_resp_t)); static int n = AT_CGREG_N_DEFAULT; - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_NO_PARAM; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_NO_PARAM; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_SET: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } @@ -1562,7 +1511,7 @@ static int _nas_user_proc_cgreg(const at_command_t *data) * return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid" " (%d)", data->command.cgreg.n); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1588,7 +1537,7 @@ static int _nas_user_proc_cgreg(const at_command_t *data) if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to disable logging of network notification"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -1603,7 +1552,7 @@ static int _nas_user_proc_cgreg(const at_command_t *data) if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to enable logging of registration status"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -1630,11 +1579,11 @@ static int _nas_user_proc_cgreg(const at_command_t *data) case AT_CGREG_OFF: case AT_CGREG_ON: /* Get network registration status */ - ret_code = nas_proc_get_reg_status(&cgreg->stat); + ret_code = nas_proc_get_reg_status(user, &cgreg->stat); if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to get registration status"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -1651,7 +1600,7 @@ static int _nas_user_proc_cgreg(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CGREG command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -1669,32 +1618,32 @@ static int _nas_user_proc_cgreg(const at_command_t *data) ** information in E-UTRA Network. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cereg(const at_command_t *data) +static int _nas_user_proc_cereg(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cereg_resp_t *cereg = &_nas_user_data.response.cereg; + at_cereg_resp_t *cereg = &at_response->response.cereg; memset(cereg, 0, sizeof(at_cereg_resp_t)); static int n = AT_CEREG_N_DEFAULT; - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_NO_PARAM; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_NO_PARAM; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_SET: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } @@ -1711,7 +1660,7 @@ static int _nas_user_proc_cereg(const at_command_t *data) * return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid" " (%d)", data->command.cereg.n); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1737,7 +1686,7 @@ static int _nas_user_proc_cereg(const at_command_t *data) if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to disable logging of network notification"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -1748,7 +1697,7 @@ static int _nas_user_proc_cereg(const at_command_t *data) if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to enable logging of location information"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -1760,7 +1709,7 @@ static int _nas_user_proc_cereg(const at_command_t *data) if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to enable logging of registration status"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -1783,21 +1732,21 @@ static int _nas_user_proc_cereg(const at_command_t *data) switch (n) { case AT_CEREG_BOTH: /* Get EPS location information */ - ret_code = nas_proc_get_loc_info(cereg->tac, cereg->ci, + ret_code = nas_proc_get_loc_info(user, cereg->tac, cereg->ci, &cereg->AcT); if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to get location information"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; break; } if (cereg->tac[0] != 0) { - _nas_user_data.mask |= (AT_CEREG_RESP_TAC_MASK | + at_response->mask |= (AT_CEREG_RESP_TAC_MASK | AT_CEREG_RESP_CI_MASK); if (cereg->AcT != NET_ACCESS_UNAVAILABLE) { - _nas_user_data.mask |= (AT_CEREG_RESP_ACT_MASK); + at_response->mask |= (AT_CEREG_RESP_ACT_MASK); } } @@ -1806,11 +1755,11 @@ static int _nas_user_proc_cereg(const at_command_t *data) case AT_CEREG_OFF: case AT_CEREG_ON: /* Get network registration status */ - ret_code = nas_proc_get_reg_status(&cereg->stat); + ret_code = nas_proc_get_reg_status(user, &cereg->stat); if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to get registration status"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -1827,7 +1776,7 @@ static int _nas_user_proc_cereg(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CEREG command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -1850,19 +1799,19 @@ static int _nas_user_proc_cereg(const at_command_t *data) ** fault bearer and traffic flows in EPS. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cgdcont(const at_command_t *data) +static int _nas_user_proc_cgdcont(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cgdcont_get_t *cgdcont = &_nas_user_data.response.cgdcont.get; + at_cgdcont_get_t *cgdcont = &at_response->response.cgdcont.get; memset(cgdcont, 0, sizeof(at_cgdcont_resp_t)); int cid = AT_CGDCONT_CID_DEFAULT; @@ -1874,15 +1823,15 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) int im_cn_signalling = AT_CGDCONT_IM_CM_DEFAULT; int reset_pdn = TRUE; - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_NO_PARAM; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_NO_PARAM; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_SET: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } @@ -1896,7 +1845,7 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) * return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid" " (%d)", data->command.cgdcont.cid); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1916,7 +1865,7 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) * return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not " "valid (%s)", data->command.cgdcont.PDP_type); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1935,7 +1884,7 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) * not valid; return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not " "valid (%d)", data->command.cgdcont.d_comp); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1950,7 +1899,7 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) * not valid; return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not " "valid (%d)", data->command.cgdcont.h_comp); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1966,7 +1915,7 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) LOG_TRACE(ERROR, "USR-MAIN - parameter " "is not valid (%d)", data->command.cgdcont.IPv4AddrAlloc); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1982,7 +1931,7 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) LOG_TRACE(ERROR, "USR-MAIN - " "parameter is not valid (%d)", data->command.cgdcont.emergency_indication); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -1998,7 +1947,7 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) LOG_TRACE(ERROR, "USR-MAIN - " "parameter is not valid (%d)", data->command.cgdcont.P_CSCF_discovery); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -2015,7 +1964,7 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) LOG_TRACE(ERROR, "USR-MAIN - " "parameter is not valid (%d)", data->command.cgdcont.IM_CN_Signalling_Flag_Ind); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -2029,10 +1978,10 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) if (reset_pdn) { /* A special form of the set command, +CGDCONT= causes * the values for context number to become undefined */ - ret_code = nas_proc_reset_pdn(cid); + ret_code = nas_proc_reset_pdn(user, cid); } else { /* Define a new PDN connection */ - ret_code = nas_proc_set_pdn(cid, pdn_type, apn, + ret_code = nas_proc_set_pdn(user, cid, pdn_type, apn, ipv4_addr_allocation, emergency, p_cscf, im_cn_signalling); } @@ -2040,7 +1989,7 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to setup PDN connection " "(=%d)", data->command.cgdcont.cid); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -2050,14 +1999,14 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) * Read command returns the current settings for each * defined PDN connection/default EPS bearer context */ - cgdcont->n_pdns = nas_proc_get_pdn_param(cgdcont->cid, + cgdcont->n_pdns = nas_proc_get_pdn_param(user->esm_data, cgdcont->cid, cgdcont->PDP_type, cgdcont->APN, AT_CGDCONT_RESP_SIZE); if (cgdcont->n_pdns == 0) { LOG_TRACE(ERROR, "USR-MAIN - No any PDN context is defined"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -2068,15 +2017,15 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) */ { /* Get the maximum value of a PDN context identifier */ - int cid_max = nas_proc_get_pdn_range(); + int cid_max = nas_proc_get_pdn_range(user->esm_data); if (cid_max > AT_CGDCONT_RESP_SIZE) { /* The range is defined by the user interface */ - _nas_user_data.response.cgdcont.tst.n_cid = + at_response->response.cgdcont.tst.n_cid = AT_CGDCONT_RESP_SIZE; } else { /* The range is defined by the ESM sublayer application */ - _nas_user_data.response.cgdcont.tst.n_cid = cid_max; + at_response->response.cgdcont.tst.n_cid = cid_max; } } break; @@ -2084,7 +2033,7 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CGDCONT command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -2102,33 +2051,33 @@ static int _nas_user_proc_cgdcont(const at_command_t *data) ** for E-UTRAN ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cgact(const at_command_t *data) +static int _nas_user_proc_cgact(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cgact_resp_t *cgact = &_nas_user_data.response.cgact; + at_cgact_resp_t *cgact = &at_response->response.cgact; memset(cgact, 0, sizeof(at_cgact_resp_t)); int cid = -1; int state = AT_CGACT_STATE_DEFAULT; - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CGACT_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CGACT_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_SET: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } @@ -2143,7 +2092,7 @@ static int _nas_user_proc_cgact(const at_command_t *data) * not valid; return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is " "not valid (%d)", data->command.cgact.state); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -2157,7 +2106,7 @@ static int _nas_user_proc_cgact(const at_command_t *data) * return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is " "not valid (%d)", data->command.cgact.cid); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -2171,9 +2120,9 @@ static int _nas_user_proc_cgact(const at_command_t *data) ret_code = RETURNerror; if (state == AT_CGACT_DEACTIVATED) { - ret_code = nas_proc_deactivate_pdn(cid); + ret_code = nas_proc_deactivate_pdn(user, cid); } else if (state == AT_CGACT_ACTIVATED) { - ret_code = nas_proc_activate_pdn(cid); + ret_code = nas_proc_activate_pdn(user, cid); } if (ret_code != RETURNok) { @@ -2181,7 +2130,7 @@ static int _nas_user_proc_cgact(const at_command_t *data) "(=%d,=%d)", (state != AT_CGACT_ACTIVATED)? "deactivate" : "activate", state, cid); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -2191,12 +2140,12 @@ static int _nas_user_proc_cgact(const at_command_t *data) * The read command returns the current activation states for * all the defined PDN/EPS bearer contexts */ - cgact->n_pdns = nas_proc_get_pdn_status(cgact->cid, cgact->state, + cgact->n_pdns = nas_proc_get_pdn_status(user, cgact->cid, cgact->state, AT_CGACT_RESP_SIZE); if (cgact->n_pdns == 0) { LOG_TRACE(ERROR, "USR-MAIN - No any PDN context is defined"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -2211,7 +2160,7 @@ static int _nas_user_proc_cgact(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CGACT command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -2233,23 +2182,23 @@ static int _nas_user_proc_cgact(const at_command_t *data) ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cmee(const at_command_t *data) +static int _nas_user_proc_cmee(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; int ret_code = RETURNok; - at_cmee_resp_t *cmee = &_nas_user_data.response.cmee; + at_response_t *at_response = user->at_response; + at_cmee_resp_t *cmee = &at_response->response.cmee; memset(cmee, 0, sizeof(at_cmee_resp_t)); int n = AT_CMEE_N_DEFAULT; - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CMEE_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CMEE_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_ACT: /* ATV0, ATV1 response format commands */ @@ -2267,7 +2216,7 @@ static int _nas_user_proc_cmee(const at_command_t *data) * return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid" " (%d)", data->command.cmee.n); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -2311,7 +2260,7 @@ static int _nas_user_proc_cmee(const at_command_t *data) if (cmee->n == RETURNerror) { LOG_TRACE(ERROR, "USR-MAIN - Failed to get format of the final result code"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -2325,7 +2274,7 @@ static int _nas_user_proc_cmee(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CMEE command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -2346,21 +2295,21 @@ static int _nas_user_proc_cmee(const at_command_t *data) ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_clck(const at_command_t *data) +static int _nas_user_proc_clck(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_clck_resp_t *clck = &_nas_user_data.response.clck; + at_clck_resp_t *clck = &at_response->response.clck; memset(clck, 0, sizeof(at_clck_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CLCK_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CLCK_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_SET: @@ -2376,7 +2325,7 @@ static int _nas_user_proc_clck(const at_command_t *data) /* Facilities other than SIM is not supported */ LOG_TRACE(ERROR, "USR-MAIN - Facility is not supported (%s)", data->command.clck.fac); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -2384,12 +2333,12 @@ static int _nas_user_proc_clck(const at_command_t *data) /* Check password parameter */ if (data->mask & AT_CLCK_PASSWD_MASK) { /* Check the PIN code */ - if (strncmp(_nas_user_nvdata.PIN, + if (strncmp(user->nas_user_nvdata->PIN, data->command.clck.passwd, USER_PIN_SIZE) != 0) { /* The PIN code is NOT matching; return an error message */ LOG_TRACE(ERROR, "USR-MAIN - Password is not correct " "(%s)", data->command.clck.passwd); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PASSWD; + at_response->cause_code = AT_ERROR_INCORRECT_PASSWD; ret_code = RETURNerror; break; } @@ -2404,14 +2353,14 @@ static int _nas_user_proc_clck(const at_command_t *data) /* unlock requires password */ LOG_TRACE(ERROR, "USR-MAIN - unlock mode of operation " "requires a password"); - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; ret_code = RETURNerror; break; } LOG_TRACE(ERROR, "USR-MAIN - unlock mode of operation " "is not supported"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; @@ -2422,14 +2371,14 @@ static int _nas_user_proc_clck(const at_command_t *data) /* unlock requires password */ LOG_TRACE(ERROR, "USR-MAIN - lock mode of operation " "requires a password"); - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; ret_code = RETURNerror; break; } LOG_TRACE(ERROR, "USR-MAIN - lock mode of operation " "is not supported"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; @@ -2441,7 +2390,7 @@ static int _nas_user_proc_clck(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - parameter is not valid" " (%d)", data->command.clck.mode); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -2457,7 +2406,7 @@ static int _nas_user_proc_clck(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CLCK command type %d is not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -2474,32 +2423,32 @@ static int _nas_user_proc_clck(const at_command_t *data) ** for the specified context identifiers ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cgpaddr(const at_command_t *data) +static int _nas_user_proc_cgpaddr(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cgpaddr_resp_t *cgpaddr = &_nas_user_data.response.cgpaddr; + at_cgpaddr_resp_t *cgpaddr = &at_response->response.cgpaddr; memset(cgpaddr, 0, sizeof(at_cgpaddr_resp_t)); int cid = -1; - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CGPADDR_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CGPADDR_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_SET: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } @@ -2513,7 +2462,7 @@ static int _nas_user_proc_cgpaddr(const at_command_t *data) * return an error message */ LOG_TRACE(ERROR, "USR-MAIN - parameter is " "not valid (%d)", data->command.cgpaddr.cid); - _nas_user_data.cause_code = AT_ERROR_INCORRECT_PARAMETERS; + at_response->cause_code = AT_ERROR_INCORRECT_PARAMETERS; ret_code = RETURNerror; break; } @@ -2524,14 +2473,14 @@ static int _nas_user_proc_cgpaddr(const at_command_t *data) /* * Get the PDP addresses */ - cgpaddr->n_pdns = nas_proc_get_pdn_addr(cid, cgpaddr->cid, + cgpaddr->n_pdns = nas_proc_get_pdn_addr(user, cid, cgpaddr->cid, cgpaddr->PDP_addr_1, cgpaddr->PDP_addr_2, AT_CGPADDR_RESP_SIZE); if (cgpaddr->n_pdns == 0) { LOG_TRACE(ERROR, "USR-MAIN - No any PDN context is defined"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -2540,7 +2489,7 @@ static int _nas_user_proc_cgpaddr(const at_command_t *data) /* * The test command returns a list of defined s. */ - cgpaddr->n_pdns = nas_proc_get_pdn_addr(cid, cgpaddr->cid, + cgpaddr->n_pdns = nas_proc_get_pdn_addr(user, cid, cgpaddr->cid, cgpaddr->PDP_addr_1, cgpaddr->PDP_addr_2, AT_CGPADDR_RESP_SIZE); @@ -2549,7 +2498,7 @@ static int _nas_user_proc_cgpaddr(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CGPADDR command type %d is " "not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -2566,39 +2515,39 @@ static int _nas_user_proc_cgpaddr(const at_command_t *data) ** subscriber. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_cnum(const at_command_t *data) +static int _nas_user_proc_cnum(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; + nas_user_context_t *nas_user_context = user->nas_user_context; + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_cnum_resp_t *cnum = &_nas_user_data.response.cnum; + at_cnum_resp_t *cnum = &at_response->response.cnum; memset(cnum, 0, sizeof(at_cnum_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CNUM_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CNUM_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_ACT: - if (_nas_user_context.sim_status != NAS_USER_READY) { - _nas_user_data.cause_code = AT_ERROR_SIM_PIN_REQUIRED; + if (nas_user_context->sim_status != NAS_USER_READY) { + at_response->cause_code = AT_ERROR_SIM_PIN_REQUIRED; LOG_FUNC_RETURN(RETURNerror); } /* Get the International Mobile Subscriber Identity (IMSI) */ - ret_code = nas_proc_get_msisdn(cnum->number, &cnum->type); + ret_code = nas_proc_get_msisdn(user, cnum->number, &cnum->type); if (ret_code != RETURNok) { LOG_TRACE(ERROR, "USR-MAIN - Failed to get MS dialing number"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -2610,7 +2559,7 @@ static int _nas_user_proc_cnum(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CNUM command type %d is " "not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } @@ -2627,25 +2576,23 @@ static int _nas_user_proc_cnum(const at_command_t *data) ** are available for the user. ** ** ** ** Inputs: data: Pointer to the AT command data structure ** - ** Others: _nas_user_context ** ** ** ** Outputs: None ** ** Return: RETURNok; RETURNerror; ** - ** Others: _nas_user_data ** ** ** ***************************************************************************/ -static int _nas_user_proc_clac(const at_command_t *data) +static int _nas_user_proc_clac(nas_user_t *user, const at_command_t *data) { LOG_FUNC_IN; - + at_response_t *at_response = user->at_response; int ret_code = RETURNok; - at_clac_resp_t *clac = &_nas_user_data.response.clac; + at_clac_resp_t *clac = &at_response->response.clac; memset(clac, 0, sizeof(at_clac_resp_t)); - _nas_user_data.id = data->id; - _nas_user_data.type = data->type; - _nas_user_data.mask = AT_RESPONSE_CLAC_MASK; - _nas_user_data.cause_code = AT_ERROR_SUCCESS; + at_response->id = data->id; + at_response->type = data->type; + at_response->mask = AT_RESPONSE_CLAC_MASK; + at_response->cause_code = AT_ERROR_SUCCESS; switch (data->type) { case AT_COMMAND_ACT: @@ -2655,7 +2602,7 @@ static int _nas_user_proc_clac(const at_command_t *data) if (clac->n_acs == 0) { LOG_TRACE(ERROR, "USR-MAIN - Failed to get the list of " "supported AT commands"); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; } break; @@ -2667,7 +2614,7 @@ static int _nas_user_proc_clac(const at_command_t *data) default: LOG_TRACE(ERROR, "USR-MAIN - AT+CLAC command type %d is " "not supported", data->type); - _nas_user_data.cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; + at_response->cause_code = AT_ERROR_OPERATION_NOT_SUPPORTED; ret_code = RETURNerror; break; } diff --git a/openair3/NAS/UE/nas_user.h b/openair3/NAS/UE/nas_user.h index 24603f3160..1ded438ddd 100644 --- a/openair3/NAS/UE/nas_user.h +++ b/openair3/NAS/UE/nas_user.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /***************************************************************************** Source nas_user.h @@ -47,6 +40,9 @@ Description NAS procedure functions triggered by the user #include "commonDef.h" #include "networkDef.h" +#include "emm_main.h" +#include "esm_ebr.h" +#include "user_defs.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -64,13 +60,13 @@ Description NAS procedure functions triggered by the user /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ -void nas_user_initialize(emm_indication_callback_t emm_cb, +void nas_user_initialize(nas_user_t *user, emm_indication_callback_t emm_cb, esm_indication_callback_t esm_cb, const char *version); -int nas_user_receive_and_process(int * fd, char *message); +int nas_user_receive_and_process(nas_user_t *user, char *message); -int nas_user_process_data(const void *data); +int nas_user_process_data(nas_user_t *user, const void *data); -const void *nas_user_get_data(void); +const void *nas_user_get_data(nas_user_t *nas_user); #endif /* __NAS_USER_H__*/ diff --git a/openair3/NAS/UE/user_defs.h b/openair3/NAS/UE/user_defs.h new file mode 100644 index 0000000000..5143a939b0 --- /dev/null +++ b/openair3/NAS/UE/user_defs.h @@ -0,0 +1,84 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/***************************************************************************** +Source user_defs.h + +Version 0.1 + +Date 2016/07/01 + +Product NAS stack + +Subsystem NAS main process + +Author Frederic Leroy + +Description NAS type definition to manage a user equipment + +*****************************************************************************/ +#ifndef __USER_DEFS_H__ +#define __USER_DEFS_H__ + +#include "nas_proc_defs.h" +#include "esmData.h" +#include "esm_pt_defs.h" +#include "EMM/emm_fsm_defs.h" +#include "EMM/emmData.h" +#include "EMM/Authentication.h" +#include "EMM/IdleMode_defs.h" +#include "EMM/LowerLayer_defs.h" +#include "API/USIM/usim_api.h" +#include "API/USER/user_api_defs.h" +#include "SecurityModeControl.h" +#include "userDef.h" +#include "at_response.h" + +typedef struct { + int ueid; /* UE lower layer identifier */ + proc_data_t proc; + // Eps Session Management + esm_data_t *esm_data; // ESM internal data (used within ESM only) + esm_pt_data_t *esm_pt_data; + esm_ebr_data_t *esm_ebr_data; // EPS bearer contexts + default_eps_bearer_context_data_t *default_eps_bearer_context_data; + // Eps Mobility Management + emm_fsm_state_t emm_fsm_status; // Current EPS Mobility Management status + emm_data_t *emm_data; // EPS mobility management data + const char *emm_nvdata_store; + emm_plmn_list_t *emm_plmn_list; // list of PLMN identities + authentication_data_t *authentication_data; + security_data_t *security_data; //Internal data used for security mode control procedure + // Hardware persistent storage + usim_data_t usim_data; // USIM application data + const char *usim_data_store; // USIM application data filename + user_nvdata_t *nas_user_nvdata; //UE parameters stored in the UE's non-volatile memory device + const char *user_nvdata_store; //UE parameters stored in the UE's non-volatile memory device + // + nas_user_context_t *nas_user_context; + at_response_t *at_response; // data structure returned to the user as the result of NAS procedure function call + // + user_at_commands_t *user_at_commands; //decoded data received from the user application layer + user_api_id_t *user_api_id; + lowerlayer_data_t *lowerlayer_data; +} nas_user_t; + +#endif diff --git a/openair3/S1AP/COPYING b/openair3/S1AP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/MESSAGES/ASN1/COPYING b/openair3/S1AP/MESSAGES/ASN1/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/MESSAGES/ASN1/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/MESSAGES/ASN1/R10.5/COPYING b/openair3/S1AP/MESSAGES/ASN1/R10.5/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/MESSAGES/ASN1/R10.5/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/MESSAGES/ASN1/R8.10/COPYING b/openair3/S1AP/MESSAGES/ASN1/R8.10/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/MESSAGES/ASN1/R8.10/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/MESSAGES/ASN1/R9.8/COPYING b/openair3/S1AP/MESSAGES/ASN1/R9.8/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/MESSAGES/ASN1/R9.8/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py b/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py index 446266d6a3..4603e869a6 100644 --- a/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py +++ b/openair3/S1AP/MESSAGES/ASN1/asn1tostruct.py @@ -33,35 +33,26 @@ def printDebug(string): def outputHeaderToFile(f, filename): now = datetime.datetime.now() - f.write("""/******************************************************************************* - - Eurecom OpenAirInterface - Copyright(c) 1999 - 2015 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fr/openairinterface - Address : EURECOM, Campus SophiaTech, 450 Route des Chappes - 06410 Biot FRANCE - -*******************************************************************************/ + f.write("""/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ """) f.write("/*******************************************************************************\n") diff --git a/openair3/S1AP/MESSAGES/COPYING b/openair3/S1AP/MESSAGES/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/S1AP/MESSAGES/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/S1AP/s1ap_common.c b/openair3/S1AP/s1ap_common.c index 055641d12e..0bd132a228 100644 --- a/openair3/S1AP/s1ap_common.c +++ b/openair3/S1AP/s1ap_common.c @@ -1,36 +1,29 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /*! \file s1ap_common.c * \brief s1ap procedures for both eNB and MME - * \author Sebastien ROUX - * \date 2012 + * \author Sebastien ROUX and Navid Nikaein + * \email navid.nikaein@eurecom.fr + * \date 2012-2015 * \version 0.1 */ diff --git a/openair3/S1AP/s1ap_common.h b/openair3/S1AP/s1ap_common.h index 3631535903..003bdd2d62 100644 --- a/openair3/S1AP/s1ap_common.h +++ b/openair3/S1AP/s1ap_common.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /** @defgroup _s1ap_impl_ S1AP Layer Reference Implementation diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c index 1b683d4aa3..301df6e816 100644 --- a/openair3/S1AP/s1ap_eNB.c +++ b/openair3/S1AP/s1ap_eNB.c @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/*! \file s1ap_eNB.c + * \brief S1AP eNB task + * \author S. Roux and Navid Nikaein + * \date 2010 - 2015 + * \email: navid.nikaein@eurecom.fr + * \version 1.0 + * @ingroup _s1ap + */ #include #include @@ -64,10 +65,7 @@ #include "oaisim_mme_test_s1c.h" #endif - -#if !defined(OAI_EMU) s1ap_eNB_config_t s1ap_config; -#endif static int s1ap_eNB_generate_s1_setup_request( s1ap_eNB_instance_t *instance_p, s1ap_eNB_mme_data_t *s1ap_mme_data_p); @@ -105,7 +103,8 @@ static void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, MessageDef *message_p = NULL; sctp_new_association_req_t *sctp_new_association_req_p = NULL; s1ap_eNB_mme_data_t *s1ap_mme_data_p = NULL; - + struct s1ap_eNB_mme_data_s *mme = NULL; + DevAssert(instance_p != NULL); DevAssert(mme_ip_address != NULL); @@ -126,27 +125,56 @@ static void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p, memcpy(&sctp_new_association_req_p->local_address, local_ip_addr, sizeof(*local_ip_addr)); + + S1AP_INFO("[eNB %d] check the mme registration state\n",instance_p->instance); + + mme = s1ap_eNB_get_MME_from_instance(instance_p); - /* Create new MME descriptor */ - s1ap_mme_data_p = calloc(1, sizeof(*s1ap_mme_data_p)); - DevAssert(s1ap_mme_data_p != NULL); + if ( mme == NULL ) { + + /* Create new MME descriptor */ + s1ap_mme_data_p = calloc(1, sizeof(*s1ap_mme_data_p)); + DevAssert(s1ap_mme_data_p != NULL); + + s1ap_mme_data_p->cnx_id = s1ap_eNB_fetch_add_global_cnx_id(); + sctp_new_association_req_p->ulp_cnx_id = s1ap_mme_data_p->cnx_id; + + s1ap_mme_data_p->assoc_id = -1; + s1ap_mme_data_p->s1ap_eNB_instance = instance_p; + + STAILQ_INIT(&s1ap_mme_data_p->served_gummei); + + /* Insert the new descriptor in list of known MME + * but not yet associated. + */ + RB_INSERT(s1ap_mme_map, &instance_p->s1ap_mme_head, s1ap_mme_data_p); + s1ap_mme_data_p->state = S1AP_ENB_STATE_WAITING; + instance_p->s1ap_mme_nb ++; + instance_p->s1ap_mme_pending_nb ++; + } else if (mme->state == S1AP_ENB_STATE_WAITING) { + instance_p->s1ap_mme_pending_nb ++; + sctp_new_association_req_p->ulp_cnx_id = mme->cnx_id; - s1ap_mme_data_p->cnx_id = s1ap_eNB_fetch_add_global_cnx_id(); - sctp_new_association_req_p->ulp_cnx_id = s1ap_mme_data_p->cnx_id; - - s1ap_mme_data_p->assoc_id = -1; - s1ap_mme_data_p->s1ap_eNB_instance = instance_p; - - STAILQ_INIT(&s1ap_mme_data_p->served_gummei); - - /* Insert the new descriptor in list of known MME - * but not yet associated. - */ - RB_INSERT(s1ap_mme_map, &instance_p->s1ap_mme_head, s1ap_mme_data_p); - s1ap_mme_data_p->state = S1AP_ENB_STATE_WAITING; - instance_p->s1ap_mme_nb ++; - instance_p->s1ap_mme_pending_nb ++; + S1AP_INFO("[eNB %d] MME already registered, retrive the data (state %d, cnx %d, mme_nb %d, mme_pending_nb %d)\n", + instance_p->instance, + mme->state, mme->cnx_id, + instance_p->s1ap_mme_nb, instance_p->s1ap_mme_pending_nb); + /*s1ap_mme_data_p->cnx_id = mme->cnx_id; + sctp_new_association_req_p->ulp_cnx_id = mme->cnx_id; + + s1ap_mme_data_p->assoc_id = -1; + s1ap_mme_data_p->s1ap_eNB_instance = instance_p; + */ + } else { + + S1AP_WARN("[eNB %d] MME already registered but not in the waiting state, retrive the data (state %d, cnx %d, mme_nb %d, mme_pending_nb %d)\n", + instance_p->instance, + mme->state, mme->cnx_id, + instance_p->s1ap_mme_nb, instance_p->s1ap_mme_pending_nb); + + } + itti_send_msg_to_task(TASK_SCTP, instance_p->instance, message_p); } @@ -155,13 +183,14 @@ void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t * { s1ap_eNB_instance_t *new_instance; uint8_t index; - + DevAssert(s1ap_register_eNB != NULL); /* Look if the provided instance already exists */ new_instance = s1ap_eNB_get_instance(instance); - - if (new_instance != NULL) { + + + if (new_instance != NULL) { /* Checks if it is a retry on the same eNB */ DevCheck(new_instance->eNB_id == s1ap_register_eNB->eNB_id, new_instance->eNB_id, s1ap_register_eNB->eNB_id, 0); DevCheck(new_instance->cell_type == s1ap_register_eNB->cell_type, new_instance->cell_type, s1ap_register_eNB->cell_type, 0); @@ -191,7 +220,7 @@ void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t * /* Add the new instance to the list of eNB (meaningfull in virtual mode) */ s1ap_eNB_insert_new_instance(new_instance); - S1AP_DEBUG("Registered new eNB[%d] and %s eNB id %u\n", + S1AP_INFO("Registered new eNB[%d] and %s eNB id %u\n", instance, s1ap_register_eNB->cell_type == CELL_MACRO_ENB ? "macro" : "home", s1ap_register_eNB->eNB_id); @@ -203,7 +232,7 @@ void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t * /* Trying to connect to provided list of MME ip address */ for (index = 0; index < s1ap_register_eNB->nb_mme; index++) { s1ap_eNB_register_mme(new_instance, - &s1ap_register_eNB->mme_ip_address[index], + &s1ap_register_eNB->mme_ip_address[index], &s1ap_register_eNB->enb_ip_address, s1ap_register_eNB->sctp_in_streams, s1ap_register_eNB->sctp_out_streams); @@ -327,6 +356,18 @@ void *s1ap_eNB_task(void *arg) } break; + case S1AP_E_RAB_SETUP_RESP: { + s1ap_eNB_e_rab_setup_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg), + &S1AP_E_RAB_SETUP_RESP(received_msg)); + } + break; + + case S1AP_E_RAB_MODIFY_RESP: { + s1ap_eNB_e_rab_modify_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg), + &S1AP_E_RAB_MODIFY_RESP(received_msg)); + } + break; + case S1AP_NAS_NON_DELIVERY_IND: { s1ap_eNB_nas_non_delivery_ind(ITTI_MESSAGE_GET_INSTANCE(received_msg), &S1AP_NAS_NON_DELIVERY_IND(received_msg)); @@ -359,6 +400,12 @@ void *s1ap_eNB_task(void *arg) } break; + case S1AP_E_RAB_RELEASE_RESPONSE: { + s1ap_eNB_e_rab_release_resp(ITTI_MESSAGE_GET_INSTANCE(received_msg), + &S1AP_E_RAB_RELEASE_RESPONSE(received_msg)); + } + break; + default: S1AP_ERROR("Received unhandled message: %d:%s\n", ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg)); diff --git a/openair3/S1AP/s1ap_eNB.h b/openair3/S1AP/s1ap_eNB.h index 9c372493e9..e122703d82 100644 --- a/openair3/S1AP/s1ap_eNB.h +++ b/openair3/S1AP/s1ap_eNB.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -43,13 +35,9 @@ typedef struct s1ap_eNB_config_s { unsigned char mme_enabled; ///< MME enabled ? } s1ap_eNB_config_t; -#if defined(OAI_EMU) -# define EPC_MODE_ENABLED oai_emulation.info.s1ap_config.mme_enabled -#else extern s1ap_eNB_config_t s1ap_config; -# define EPC_MODE_ENABLED s1ap_config.mme_enabled -#endif +#define EPC_MODE_ENABLED s1ap_config.mme_enabled void *s1ap_eNB_task(void *arg); diff --git a/openair3/S1AP/s1ap_eNB_context_management_procedures.c b/openair3/S1AP/s1ap_eNB_context_management_procedures.c old mode 100755 new mode 100644 index 801dfd8780..49c5ed28ac --- a/openair3/S1AP/s1ap_eNB_context_management_procedures.c +++ b/openair3/S1AP/s1ap_eNB_context_management_procedures.c @@ -1,32 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ +/*! \file s1ap_eNB_context_management_procedures.c + * \brief S1AP context management procedures + * \author S. Roux and Navid Nikaein + * \date 2010 - 2015 + * \email: navid.nikaein@eurecom.fr + * \version 1.0 + * @ingroup _s1ap + */ #include #include #include diff --git a/openair3/S1AP/s1ap_eNB_context_management_procedures.h b/openair3/S1AP/s1ap_eNB_context_management_procedures.h old mode 100755 new mode 100644 index be9e0b24b4..c8f7532023 --- a/openair3/S1AP/s1ap_eNB_context_management_procedures.h +++ b/openair3/S1AP/s1ap_eNB_context_management_procedures.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef S1AP_ENB_CONTEXT_MANAGEMENT_PROCEDURES_H_ #define S1AP_ENB_CONTEXT_MANAGEMENT_PROCEDURES_H_ diff --git a/openair3/S1AP/s1ap_eNB_decoder.c b/openair3/S1AP/s1ap_eNB_decoder.c index f8230520ce..eac52c53ba 100644 --- a/openair3/S1AP/s1ap_eNB_decoder.c +++ b/openair3/S1AP/s1ap_eNB_decoder.c @@ -1,36 +1,29 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file s1ap_eNB_decoder.c * \brief s1ap pdu decode procedures for eNB - * \author Sebastien ROUX - * \date 2013 + * \author Sebastien ROUX and Navid Nikaein + * \email navid.nikaein@eurecom.fr + * \date 2013 - 2015 * \version 0.1 */ @@ -115,11 +108,66 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message, ret = s1ap_decode_s1ap_pagingies( &message->msg.s1ap_PagingIEs, &initiating_p->value); s1ap_xer_print_s1ap_paging(s1ap_xer__print2sp, message_string, message); - S1AP_ERROR("TODO Paging initiating message\n"); + message_id = S1AP_PAGING_LOG; + message_string_size = strlen(message_string); + message_p = itti_alloc_new_message_sized(TASK_S1AP, + message_id, + message_string_size + sizeof (IttiMsgText)); + message_p->ittiMsg.s1ap_paging_log.size = message_string_size; + memcpy(&message_p->ittiMsg.s1ap_paging_log.text, message_string, message_string_size); + itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); + S1AP_INFO("Paging initiating message\n"); free(message_string); break; + case S1ap_ProcedureCode_id_E_RABSetup: + ret = s1ap_decode_s1ap_e_rabsetuprequesties( + &message->msg.s1ap_E_RABSetupRequestIEs, &initiating_p->value); + //s1ap_xer_print_s1ap_e_rabsetuprequest(s1ap_xer__print2sp, message_string, message); + message_id = S1AP_E_RAB_SETUP_REQUEST_LOG; + message_string_size = strlen(message_string); + message_p = itti_alloc_new_message_sized(TASK_S1AP, + message_id, + message_string_size + sizeof (IttiMsgText)); + message_p->ittiMsg.s1ap_e_rab_setup_request_log.size = message_string_size; + memcpy(&message_p->ittiMsg.s1ap_e_rab_setup_request_log.text, message_string, message_string_size); + itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); + free(message_string); + S1AP_INFO("E_RABSetup initiating message\n"); + break; + + case S1ap_ProcedureCode_id_E_RABModify: + ret = s1ap_decode_s1ap_e_rabmodifyrequesties( + &message->msg.s1ap_E_RABModifyRequestIEs, &initiating_p->value); + message_id = S1AP_E_RAB_MODIFY_REQUEST_LOG; + message_string_size = strlen(message_string); + message_p = itti_alloc_new_message_sized(TASK_S1AP, + message_id, + message_string_size + sizeof (IttiMsgText)); + message_p->ittiMsg.s1ap_e_rab_modify_request_log.size = message_string_size; + memcpy(&message_p->ittiMsg.s1ap_e_rab_modify_request_log.text, message_string, message_string_size); + itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); + free(message_string); + S1AP_INFO("E_RABModify initiating message\n"); + break; + + case S1ap_ProcedureCode_id_E_RABRelease: + ret = s1ap_decode_s1ap_e_rabreleasecommandies( + &message->msg.s1ap_E_RABReleaseCommandIEs, &initiating_p->value); + s1ap_xer_print_s1ap_e_rabreleasecommand(s1ap_xer__print2sp, message_string, message); + message_id = S1AP_E_RAB_RELEASE_REQUEST_LOG; + message_string_size = strlen(message_string); + message_p = itti_alloc_new_message_sized(TASK_S1AP, + message_id, + message_string_size + sizeof (IttiMsgText)); + message_p->ittiMsg.s1ap_e_rab_release_request_log.size = message_string_size; + memcpy(&message_p->ittiMsg.s1ap_e_rab_release_request_log.text, message_string, message_string_size); + itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); + free(message_string); + S1AP_INFO("TODO E_RABRelease nitiating message\n"); + break; + default: S1AP_ERROR("Unknown procedure ID (%d) for initiating message\n", (int)initiating_p->procedureCode); @@ -144,6 +192,7 @@ static int s1ap_eNB_decode_successful_outcome(s1ap_message *message, DevAssert(successfullOutcome_p != NULL); message_string = malloc(sizeof(char) * 10000); + memset((void*)message_string,0,sizeof(char) * 10000); s1ap_string_total_size = 0; diff --git a/openair3/S1AP/s1ap_eNB_decoder.h b/openair3/S1AP/s1ap_eNB_decoder.h index 4c3f5f4327..f321f8227f 100644 --- a/openair3/S1AP/s1ap_eNB_decoder.h +++ b/openair3/S1AP/s1ap_eNB_decoder.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include "s1ap_ies_defs.h" diff --git a/openair3/S1AP/s1ap_eNB_default_values.h b/openair3/S1AP/s1ap_eNB_default_values.h index c0fde9f6eb..44521e8dbf 100644 --- a/openair3/S1AP/s1ap_eNB_default_values.h +++ b/openair3/S1AP/s1ap_eNB_default_values.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef S1AP_ENB_DEFAULT_VALUES_H_ #define S1AP_ENB_DEFAULT_VALUES_H_ diff --git a/openair3/S1AP/s1ap_eNB_defs.h b/openair3/S1AP/s1ap_eNB_defs.h index 2bf2758b89..11e64703ec 100644 --- a/openair3/S1AP/s1ap_eNB_defs.h +++ b/openair3/S1AP/s1ap_eNB_defs.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include diff --git a/openair3/S1AP/s1ap_eNB_encoder.c b/openair3/S1AP/s1ap_eNB_encoder.c index a93bdc68f2..9a5f422158 100644 --- a/openair3/S1AP/s1ap_eNB_encoder.c +++ b/openair3/S1AP/s1ap_eNB_encoder.c @@ -1,36 +1,29 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file s1ap_eNB_encoder.c * \brief s1ap pdu encode procedures for eNB - * \author Sebastien ROUX - * \date 2013 + * \author Sebastien ROUX and Navid Nikaein + * \email navid.nikaein@eurecom.fr + * \date 2013 - 2015 * \version 0.1 */ @@ -38,6 +31,8 @@ #include #include +#include "assertions.h" + #include "conversions.h" #include "intertask_interface.h" @@ -100,6 +95,21 @@ int s1ap_eNB_encode_ue_context_release_request( uint8_t **buffer, uint32_t *length); +static inline +int s1ap_eNB_encode_e_rab_setup_response(S1ap_E_RABSetupResponseIEs_t *E_RABSetupResponseIEs, + uint8_t **buffer, + uint32_t *length); + +static inline +int s1ap_eNB_encode_e_rab_modify_response(S1ap_E_RABModifyResponseIEs_t *E_RABModifyResponseIEs, + uint8_t **buffer, + uint32_t *length); + +static inline +int s1ap_eNB_encode_e_rab_release_response(S1ap_E_RABReleaseResponseIEs_t *s1ap_E_RABReleaseResponseIEs, + uint8_t **buffer, + uint32_t *length); + int s1ap_eNB_encode_pdu(s1ap_message *message, uint8_t **buffer, uint32_t *len) { DevAssert(message != NULL); @@ -251,8 +261,47 @@ int s1ap_eNB_encode_successfull_outcome(s1ap_message *s1ap_message_p, free(message_string); break; + case S1ap_ProcedureCode_id_E_RABSetup: + + ret = s1ap_eNB_encode_e_rab_setup_response ( + &s1ap_message_p->msg.s1ap_E_RABSetupResponseIEs, buffer, len); + //s1ap_xer_print_s1ap_e_rabsetupresponse (s1ap_xer__print2sp, message_string, s1ap_message_p); + message_id = S1AP_E_RAB_SETUP_RESPONSE_LOG ; + message_p = itti_alloc_new_message_sized(TASK_S1AP, message_id, message_string_size + sizeof (IttiMsgText)); + message_p->ittiMsg.s1ap_e_rab_setup_response_log.size = message_string_size; + memcpy(&message_p->ittiMsg.s1ap_e_rab_setup_response_log.text, message_string, message_string_size); + itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); + free(message_string); + S1AP_INFO("E_RABSetup successful message\n"); + break; + + case S1ap_ProcedureCode_id_E_RABModify: + ret = s1ap_eNB_encode_e_rab_modify_response ( + &s1ap_message_p->msg.s1ap_E_RABModifyResponseIEs, buffer, len); + message_id = S1AP_E_RAB_MODIFY_RESPONSE_LOG ; + message_p = itti_alloc_new_message_sized(TASK_S1AP, message_id, message_string_size + sizeof (IttiMsgText)); + message_p->ittiMsg.s1ap_e_rab_modify_response_log.size = message_string_size; + memcpy(&message_p->ittiMsg.s1ap_e_rab_modify_response_log.text, message_string, message_string_size); + itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); + free(message_string); + S1AP_INFO("E_RABModify successful message\n"); + break; + + case S1ap_ProcedureCode_id_E_RABRelease: + ret = s1ap_eNB_encode_e_rab_release_response ( + &s1ap_message_p->msg.s1ap_E_RABReleaseResponseIEs, buffer, len); + s1ap_xer_print_s1ap_e_rabreleaseresponse(s1ap_xer__print2sp, message_string, s1ap_message_p); + message_id = S1AP_E_RAB_RELEASE_RESPONSE_LOG ; + message_p = itti_alloc_new_message_sized(TASK_S1AP, message_id, message_string_size + sizeof (IttiMsgText)); + message_p->ittiMsg.s1ap_e_rab_release_response_log.size = message_string_size; + memcpy(&message_p->ittiMsg.s1ap_e_rab_release_response_log.text, message_string, message_string_size); + itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); + free(message_string); + S1AP_INFO("E_RAB Release successful message\n"); + break; + default: - S1AP_DEBUG("Unknown procedure ID (%d) for successfull outcome message\n", + S1AP_WARN("Unknown procedure ID (%d) for successfull outcome message\n", (int)s1ap_message_p->procedureCode); return ret; break; @@ -528,3 +577,70 @@ int s1ap_eNB_encode_ue_context_release_request( ue_context_release_request_p); } +static inline +int s1ap_eNB_encode_e_rab_setup_response(S1ap_E_RABSetupResponseIEs_t *s1ap_E_RABSetupResponseIEs, + uint8_t **buffer, + uint32_t *length) +{ + S1ap_E_RABSetupResponse_t e_rab_setup_response; + S1ap_E_RABSetupResponse_t *e_rab_setup_response_p = &e_rab_setup_response; + + memset((void *)e_rab_setup_response_p, 0, + sizeof(e_rab_setup_response)); + + if (s1ap_encode_s1ap_e_rabsetupresponseies (e_rab_setup_response_p, s1ap_E_RABSetupResponseIEs) < 0) { + return -1; + } + + return s1ap_generate_successfull_outcome(buffer, + length, + S1ap_ProcedureCode_id_E_RABSetup, + S1ap_Criticality_reject, + &asn_DEF_S1ap_E_RABSetupResponse, + e_rab_setup_response_p); +} + +static inline +int s1ap_eNB_encode_e_rab_modify_response(S1ap_E_RABModifyResponseIEs_t *s1ap_E_RABModifyResponseIEs, + uint8_t **buffer, + uint32_t *length) +{ + S1ap_E_RABModifyResponse_t e_rab_modify_response; + S1ap_E_RABModifyResponse_t *e_rab_modify_response_p = &e_rab_modify_response; + + memset((void *)e_rab_modify_response_p, 0, + sizeof(e_rab_modify_response)); + + if (s1ap_encode_s1ap_e_rabmodifyresponseies (e_rab_modify_response_p, s1ap_E_RABModifyResponseIEs) < 0) { + return -1; + } + + return s1ap_generate_successfull_outcome(buffer, + length, + S1ap_ProcedureCode_id_E_RABModify, + S1ap_Criticality_reject, + &asn_DEF_S1ap_E_RABModifyResponse, + e_rab_modify_response_p); +} +static inline +int s1ap_eNB_encode_e_rab_release_response(S1ap_E_RABReleaseResponseIEs_t *s1ap_E_RABReleaseResponseIEs, + uint8_t **buffer, + uint32_t *length) +{ + S1ap_E_RABReleaseResponse_t e_rab_release_response; + S1ap_E_RABReleaseResponse_t *e_rab_release_response_p = &e_rab_release_response; + + memset((void *)e_rab_release_response_p, 0, + sizeof(e_rab_release_response)); + + if (s1ap_encode_s1ap_e_rabreleaseresponseies (e_rab_release_response_p, s1ap_E_RABReleaseResponseIEs) < 0) { + return -1; + } + + return s1ap_generate_successfull_outcome(buffer, + length, + S1ap_ProcedureCode_id_E_RABRelease, + S1ap_Criticality_reject, + &asn_DEF_S1ap_E_RABReleaseResponse, + e_rab_release_response_p); +} diff --git a/openair3/S1AP/s1ap_eNB_encoder.h b/openair3/S1AP/s1ap_eNB_encoder.h index b55cf2c261..5b135a3f76 100644 --- a/openair3/S1AP/s1ap_eNB_encoder.h +++ b/openair3/S1AP/s1ap_eNB_encoder.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef S1AP_ENB_ENCODER_H_ #define S1AP_ENB_ENCODER_H_ diff --git a/openair3/S1AP/s1ap_eNB_handlers.c b/openair3/S1AP/s1ap_eNB_handlers.c index fb9722dbc8..0b02fc6db9 100644 --- a/openair3/S1AP/s1ap_eNB_handlers.c +++ b/openair3/S1AP/s1ap_eNB_handlers.c @@ -1,36 +1,29 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file s1ap_eNB_handlers.c * \brief s1ap messages handlers for eNB part - * \author Sebastien ROUX - * \date 2013 + * \author Sebastien ROUX and Navid Nikaein + * \email navid.nikaein@eurecom.fr + * \date 2013 - 2015 * \version 0.1 */ @@ -82,6 +75,27 @@ int s1ap_eNB_handle_ue_context_release_command(uint32_t assoc_id, uint32_t stream, struct s1ap_message_s *s1ap_message_p); + +static +int s1ap_eNB_handle_e_rab_setup_request(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *s1ap_message_p); + +static +int s1ap_eNB_handle_paging(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *message_p); + +static +int s1ap_eNB_handle_e_rab_modify_request(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *s1ap_message_p); + +static +int s1ap_eNB_handle_e_rab_release_command(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *s1ap_message_p); + /* Handlers matrix. Only eNB related procedure present here */ s1ap_message_decoded_callback messages_callback[][3] = { { 0, 0, 0 }, /* HandoverPreparation */ @@ -89,12 +103,12 @@ s1ap_message_decoded_callback messages_callback[][3] = { { 0, 0, 0 }, /* HandoverNotification */ { 0, 0, 0 }, /* PathSwitchRequest */ { 0, 0, 0 }, /* HandoverCancel */ - { 0, 0, 0 }, /* E_RABSetup */ - { 0, 0, 0 }, /* E_RABModify */ - { 0, 0, 0 }, /* E_RABRelease */ + { s1ap_eNB_handle_e_rab_setup_request, 0, 0 }, /* E_RABSetup */ + { s1ap_eNB_handle_e_rab_modify_request, 0, 0 }, /* E_RABModify */ + { s1ap_eNB_handle_e_rab_release_command, 0, 0 }, /* E_RABRelease */ { 0, 0, 0 }, /* E_RABReleaseIndication */ { s1ap_eNB_handle_initial_context_request, 0, 0 }, /* InitialContextSetup */ - { 0, 0, 0 }, /* Paging */ + { s1ap_eNB_handle_paging, 0, 0 }, /* Paging */ { s1ap_eNB_handle_nas_downlink, 0, 0 }, /* downlinkNASTransport */ { 0, 0, 0 }, /* initialUEMessage */ { 0, 0, 0 }, /* uplinkNASTransport */ @@ -205,7 +219,7 @@ int s1ap_eNB_handle_message(uint32_t assoc_id, int32_t stream, if (message.procedureCode > sizeof(messages_callback) / (3 * sizeof( s1ap_message_decoded_callback)) || (message.direction > S1AP_PDU_PR_unsuccessfulOutcome)) { - S1AP_ERROR("[SCTP %d] Either procedureCode %d or direction %d exceed expected\n", + S1AP_ERROR("[SCTP %d] Either procedureCode %ld or direction %d exceed expected\n", assoc_id, message.procedureCode, message.direction); return -1; } @@ -214,7 +228,7 @@ int s1ap_eNB_handle_message(uint32_t assoc_id, int32_t stream, * This can mean not implemented or no procedure for eNB (wrong direction). */ if (messages_callback[message.procedureCode][message.direction-1] == NULL) { - S1AP_ERROR("[SCTP %d] No handler for procedureCode %d in %s\n", + S1AP_ERROR("[SCTP %d] No handler for procedureCode %ld in %s\n", assoc_id, message.procedureCode, s1ap_direction2String[message.direction]); return -1; @@ -452,10 +466,10 @@ int s1ap_eNB_handle_error_indication(uint32_t assoc_id, return -1; } if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_MME_UE_S1AP_ID_PRESENT) { - S1AP_WARN("Received S1 Error indication MME UE S1AP ID 0x%x\n", s1_error_indication_p->mme_ue_s1ap_id); + S1AP_WARN("Received S1 Error indication MME UE S1AP ID 0x%lx\n", s1_error_indication_p->mme_ue_s1ap_id); } if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_ENB_UE_S1AP_ID_PRESENT) { - S1AP_WARN("Received S1 Error indication eNB UE S1AP ID 0x%x\n", s1_error_indication_p->eNB_UE_S1AP_ID); + S1AP_WARN("Received S1 Error indication eNB UE S1AP ID 0x%lx\n", s1_error_indication_p->eNB_UE_S1AP_ID); } if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_CAUSE_PRESENT) { @@ -710,7 +724,7 @@ int s1ap_eNB_handle_initial_context_request(uint32_t assoc_id, if ((ue_desc_p = s1ap_eNB_get_ue_context(mme_desc_p->s1ap_eNB_instance, initialContextSetupRequest_p->eNB_UE_S1AP_ID)) == NULL) { S1AP_ERROR("[SCTP %d] Received initial context setup request for non " - "existing UE context 0x%06x\n", assoc_id, + "existing UE context 0x%06lx\n", assoc_id, initialContextSetupRequest_p->eNB_UE_S1AP_ID); return -1; } @@ -762,7 +776,8 @@ int s1ap_eNB_handle_initial_context_request(uint32_t assoc_id, malloc(sizeof(uint8_t) * item_p->nAS_PDU->size); memcpy(S1AP_INITIAL_CONTEXT_SETUP_REQ(message_p).e_rab_param[i].nas_pdu.buffer, - item_p->nAS_PDU->buf, item_p->nAS_PDU->size); + item_p->nAS_PDU->buf, item_p->nAS_PDU->size); + S1AP_DEBUG("Received NAS message with the E_RAB setup procedure\n"); } else { S1AP_INITIAL_CONTEXT_SETUP_REQ(message_p).e_rab_param[i].nas_pdu.length = 0; S1AP_INITIAL_CONTEXT_SETUP_REQ(message_p).e_rab_param[i].nas_pdu.buffer = NULL; @@ -834,7 +849,7 @@ int s1ap_eNB_handle_ue_context_release_command(uint32_t assoc_id, if ((ue_desc_p = s1ap_eNB_get_ue_context(mme_desc_p->s1ap_eNB_instance, enb_ue_s1ap_id)) == NULL) { S1AP_ERROR("[SCTP %d] Received UE context release command for non " - "existing UE context 0x%06x\n", + "existing UE context 0x%06lx\n", assoc_id, enb_ue_s1ap_id); /*MessageDef *msg_complete_p; @@ -873,3 +888,491 @@ int s1ap_eNB_handle_ue_context_release_command(uint32_t assoc_id, } } +static +int s1ap_eNB_handle_e_rab_setup_request(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *s1ap_message_p) { + + int i; + + s1ap_eNB_mme_data_t *mme_desc_p = NULL; + s1ap_eNB_ue_context_t *ue_desc_p = NULL; + MessageDef *message_p = NULL; + + S1ap_E_RABSetupRequestIEs_t *s1ap_E_RABSetupRequest; + DevAssert(s1ap_message_p != NULL); + + s1ap_E_RABSetupRequest = &s1ap_message_p->msg.s1ap_E_RABSetupRequestIEs; + + if ((mme_desc_p = s1ap_eNB_get_MME(NULL, assoc_id, 0)) == NULL) { + S1AP_ERROR("[SCTP %d] Received initial context setup request for non " + "existing MME context\n", assoc_id); + return -1; + } + + + if ((ue_desc_p = s1ap_eNB_get_ue_context(mme_desc_p->s1ap_eNB_instance, + s1ap_E_RABSetupRequest->eNB_UE_S1AP_ID)) == NULL) { + S1AP_ERROR("[SCTP %d] Received initial context setup request for non " + "existing UE context 0x%06lx\n", assoc_id, + s1ap_E_RABSetupRequest->eNB_UE_S1AP_ID); + return -1; + } + + /* Initial context request = UE-related procedure -> stream != 0 */ + if (stream == 0) { + S1AP_ERROR("[SCTP %d] Received UE-related procedure on stream (%d)\n", + assoc_id, stream); + return -1; + } + + ue_desc_p->rx_stream = stream; + + if ( ue_desc_p->mme_ue_s1ap_id != s1ap_E_RABSetupRequest->mme_ue_s1ap_id){ + S1AP_WARN("UE context mme_ue_s1ap_id is different form that of the message (%d != %ld)", + ue_desc_p->mme_ue_s1ap_id, s1ap_E_RABSetupRequest->mme_ue_s1ap_id); + + } + message_p = itti_alloc_new_message(TASK_S1AP, S1AP_E_RAB_SETUP_REQ); + + S1AP_E_RAB_SETUP_REQ(message_p).ue_initial_id = ue_desc_p->ue_initial_id; + + S1AP_E_RAB_SETUP_REQ(message_p).mme_ue_s1ap_id = s1ap_E_RABSetupRequest->mme_ue_s1ap_id; + S1AP_E_RAB_SETUP_REQ(message_p).eNB_ue_s1ap_id = s1ap_E_RABSetupRequest->eNB_UE_S1AP_ID; + + S1AP_E_RAB_SETUP_REQ(message_p).nb_e_rabs_tosetup = + s1ap_E_RABSetupRequest->e_RABToBeSetupListBearerSUReq.s1ap_E_RABToBeSetupItemBearerSUReq.count; + + for (i = 0; i < s1ap_E_RABSetupRequest->e_RABToBeSetupListBearerSUReq.s1ap_E_RABToBeSetupItemBearerSUReq.count; i++) { + S1ap_E_RABToBeSetupItemBearerSUReq_t *item_p; + + item_p = (S1ap_E_RABToBeSetupItemBearerSUReq_t *)s1ap_E_RABSetupRequest->e_RABToBeSetupListBearerSUReq.s1ap_E_RABToBeSetupItemBearerSUReq.array[i]; + + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].e_rab_id = item_p->e_RAB_ID; + + // check for the NAS PDU + if (item_p->nAS_PDU.size > 0 ) { + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.length = item_p->nAS_PDU.size; + + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.buffer = malloc(sizeof(uint8_t) * item_p->nAS_PDU.size); + + memcpy(S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.buffer, + item_p->nAS_PDU.buf, item_p->nAS_PDU.size); + // S1AP_INFO("received a NAS PDU with size %d (%02x.%02x)\n",S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.length, item_p->nAS_PDU.buf[0], item_p->nAS_PDU.buf[1]); + } else { + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.length = 0; + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].nas_pdu.buffer = NULL; + + S1AP_WARN("NAS PDU is not provided, generate a E_RAB_SETUP Failure (TBD) back to MME \n"); + // return -1; + } + + /* Set the transport layer address */ + memcpy(S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].sgw_addr.buffer, + item_p->transportLayerAddress.buf, item_p->transportLayerAddress.size); + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].sgw_addr.length = + item_p->transportLayerAddress.size * 8 - item_p->transportLayerAddress.bits_unused; + + /* S1AP_INFO("sgw addr %s len: %d (size %d, index %d)\n", + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].sgw_addr.buffer, + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].sgw_addr.length, + item_p->transportLayerAddress.size, i); + */ + /* GTP tunnel endpoint ID */ + OCTET_STRING_TO_INT32(&item_p->gTP_TEID, S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].gtp_teid); + + /* Set the QOS informations */ + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].qos.qci = item_p->e_RABlevelQoSParameters.qCI; + + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].qos.allocation_retention_priority.priority_level = + item_p->e_RABlevelQoSParameters.allocationRetentionPriority.priorityLevel; + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].qos.allocation_retention_priority.pre_emp_capability = + item_p->e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionCapability; + S1AP_E_RAB_SETUP_REQ(message_p).e_rab_setup_params[i].qos.allocation_retention_priority.pre_emp_vulnerability = + item_p->e_RABlevelQoSParameters.allocationRetentionPriority.pre_emptionVulnerability; + } + + itti_send_msg_to_task(TASK_RRC_ENB, ue_desc_p->eNB_instance->instance, message_p); + + return 0; +} + +static +int s1ap_eNB_handle_paging(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *s1ap_message_p) +{ + S1ap_PagingIEs_t *paging_p; + s1ap_eNB_mme_data_t *mme_desc_p = NULL; + s1ap_eNB_instance_t *s1ap_eNB_instance = NULL; + MessageDef *message_p = NULL; + + DevAssert(s1ap_message_p != NULL); + // received Paging Message from MME + S1AP_DEBUG("[SCTP %d] Received Paging Message From MME\n",assoc_id); + + paging_p = &s1ap_message_p->msg.s1ap_PagingIEs; + + /* Paging procedure -> stream != 0 */ + if (stream == 0) { + S1AP_ERROR("[SCTP %d] Received Paging procedure on stream (%d)\n", + assoc_id, stream); + return -1; + } + + if ((mme_desc_p = s1ap_eNB_get_MME(NULL, assoc_id, 0)) == NULL) { + S1AP_ERROR("[SCTP %d] Received Paging for non " + "existing MME context\n", assoc_id); + return -1; + } + + s1ap_eNB_instance = mme_desc_p->s1ap_eNB_instance; + if (s1ap_eNB_instance == NULL) { + S1AP_ERROR("[SCTP %d] Received Paging for non existing MME context : s1ap_eNB_instance is NULL\n", + assoc_id); + return -1; + } + + message_p = itti_alloc_new_message(TASK_S1AP, S1AP_PAGING_IND); + + /* convert S1ap_PagingIEs_t to s1ap_paging_ind_t */ + /* convert UE Identity Index value */ + S1AP_PAGING_IND(message_p).ue_index_value = BIT_STRING_to_uint32(&paging_p->ueIdentityIndexValue); + S1AP_DEBUG("[SCTP %d] Received Paging ue_index_value (%d)\n", + assoc_id,(uint32_t)S1AP_PAGING_IND(message_p).ue_index_value); + + S1AP_PAGING_IND(message_p).ue_paging_identity.choice.s_tmsi.mme_code = 0; + S1AP_PAGING_IND(message_p).ue_paging_identity.choice.s_tmsi.m_tmsi = 0; + + /* convert UE Paging Identity */ + if (paging_p->uePagingID.present == S1ap_UEPagingID_PR_s_TMSI) { + S1AP_PAGING_IND(message_p).ue_paging_identity.presenceMask = UE_PAGING_IDENTITY_s_tmsi; + OCTET_STRING_TO_INT8(&paging_p->uePagingID.choice.s_TMSI.mMEC, S1AP_PAGING_IND(message_p).ue_paging_identity.choice.s_tmsi.mme_code); + OCTET_STRING_TO_INT32(&paging_p->uePagingID.choice.s_TMSI.m_TMSI, S1AP_PAGING_IND(message_p).ue_paging_identity.choice.s_tmsi.m_tmsi); + } else if (paging_p->uePagingID.present == S1ap_UEPagingID_PR_iMSI) { + S1AP_PAGING_IND(message_p).ue_paging_identity.presenceMask = UE_PAGING_IDENTITY_imsi; + S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.length = 0; + for (int i = 0; i < paging_p->uePagingID.choice.iMSI.size; i++) { + S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.buffer[2*i] = (uint8_t)(paging_p->uePagingID.choice.iMSI.buf[i] & 0x0F ); + S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.length++; + S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.buffer[2*i+1] = (uint8_t)((paging_p->uePagingID.choice.iMSI.buf[i]>>4) & 0x0F); + LOG_D(S1AP,"paging : i %d %d imsi %d %d \n",2*i,2*i+1,S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.buffer[2*i], S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.buffer[2*i+1]); + if (S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.buffer[2*i+1] == 0x0F) { + if(i != paging_p->uePagingID.choice.iMSI.size - 1){ + /* invalid paging_p->uePagingID.choise.iMSI.buffer */ + S1AP_ERROR("[SCTP %d] Received Paging : uePagingID.choise.iMSI error(i %d 0x0F)\n", assoc_id,i); + return -1; + } + } else { + S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.length++; + } + } + if (S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.length >= S1AP_IMSI_LENGTH) { + /* invalid paging_p->uePagingID.choise.iMSI.size */ + S1AP_ERROR("[SCTP %d] Received Paging : uePagingID.choise.iMSI.size(%d) is over IMSI length(%d)\n", assoc_id, S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.length, S1AP_IMSI_LENGTH); + return -1; + } +} else { + /* invalid paging_p->uePagingID.present */ + S1AP_ERROR("[SCTP %d] Received Paging : uePagingID.present(%d) is unknown\n", assoc_id, paging_p->uePagingID.present); + return -1; + } + +#if 0 + /* convert Paging DRX(optional) */ + if (paging_p->presenceMask & S1AP_PAGINGIES_PAGINGDRX_PRESENT) { + switch(paging_p->pagingDRX) { + case S1ap_PagingDRX_v32: + S1AP_PAGING_IND(message_p).paging_drx = PAGING_DRX_32; + break; + case S1ap_PagingDRX_v64: + S1AP_PAGING_IND(message_p).paging_drx = PAGING_DRX_64; + break; + case S1ap_PagingDRX_v128: + S1AP_PAGING_IND(message_p).paging_drx = PAGING_DRX_128; + break; + case S1ap_PagingDRX_v256: + S1AP_PAGING_IND(message_p).paging_drx = PAGING_DRX_256; + break; + default: + // when UE Paging DRX is no value + S1AP_PAGING_IND(message_p).paging_drx = PAGING_DRX_256; + break; + } + } +#endif + S1AP_PAGING_IND(message_p).paging_drx = PAGING_DRX_256; + + /* convert cnDomain */ + if (paging_p->cnDomain == S1ap_CNDomain_ps) { + S1AP_PAGING_IND(message_p).cn_domain = CN_DOMAIN_PS; + } else if (paging_p->cnDomain == S1ap_CNDomain_cs) { + S1AP_PAGING_IND(message_p).cn_domain = CN_DOMAIN_CS; + } else { + /* invalid paging_p->cnDomain */ + S1AP_ERROR("[SCTP %d] Received Paging : cnDomain(%ld) is unknown\n", assoc_id, paging_p->cnDomain); + return -1; + } + + memset (&S1AP_PAGING_IND(message_p).plmn_identity[0], 0, sizeof(plmn_identity_t)*256); + memset (&S1AP_PAGING_IND(message_p).tac[0], 0, sizeof(int16_t)*256); + S1AP_PAGING_IND(message_p).tai_size = 0; + + for (int i = 0; i < paging_p->taiList.s1ap_TAIItem.count; i++) { + S1AP_INFO("[SCTP %d] Received Paging taiList: i %d, count %d\n", assoc_id, i, paging_p->taiList.s1ap_TAIItem.count); + S1ap_TAIItem_t s1ap_TAIItem; + memset (&s1ap_TAIItem, 0, sizeof(S1ap_TAIItem_t)); + + memcpy(&s1ap_TAIItem, paging_p->taiList.s1ap_TAIItem.array[i], sizeof(S1ap_TAIItem_t)); + + TBCD_TO_MCC_MNC(&s1ap_TAIItem.tAI.pLMNidentity, S1AP_PAGING_IND(message_p).plmn_identity[i].mcc, + S1AP_PAGING_IND(message_p).plmn_identity[i].mnc, + S1AP_PAGING_IND(message_p).plmn_identity[i].mnc_digit_length); + OCTET_STRING_TO_INT16(&s1ap_TAIItem.tAI.tAC, S1AP_PAGING_IND(message_p).tac[i]); + S1AP_PAGING_IND(message_p).tai_size++; + S1AP_DEBUG("[SCTP %d] Received Paging: MCC %d, MNC %d, TAC %d\n", assoc_id, S1AP_PAGING_IND(message_p).plmn_identity[i].mcc, S1AP_PAGING_IND(message_p).plmn_identity[i].mnc, S1AP_PAGING_IND(message_p).tac[i]); + } + +#if 0 + // CSG Id(optional) List is not used + if (paging_p->presenceMask & S1AP_PAGINGIES_CSG_IDLIST_PRESENT) { + // TODO + } + + /* convert pagingPriority (optional) if has value */ + if (paging_p->presenceMask & S1AP_PAGINGIES_PAGINGPRIORITY_PRESENT) { + switch(paging_p->pagingPriority) { + case S1ap_PagingPriority_priolevel1: + S1AP_PAGING_IND(message_p).paging_priority = PAGING_PRIO_LEVEL1; + break; + case S1ap_PagingPriority_priolevel2: + S1AP_PAGING_IND(message_p).paging_priority = PAGING_PRIO_LEVEL2; + break; + case S1ap_PagingPriority_priolevel3: + S1AP_PAGING_IND(message_p).paging_priority = PAGING_PRIO_LEVEL3; + break; + case S1ap_PagingPriority_priolevel4: + S1AP_PAGING_IND(message_p).paging_priority = PAGING_PRIO_LEVEL4; + break; + case S1ap_PagingPriority_priolevel5: + S1AP_PAGING_IND(message_p).paging_priority = PAGING_PRIO_LEVEL5; + break; + case S1ap_PagingPriority_priolevel6: + S1AP_PAGING_IND(message_p).paging_priority = PAGING_PRIO_LEVEL6; + break; + case S1ap_PagingPriority_priolevel7: + S1AP_PAGING_IND(message_p).paging_priority = PAGING_PRIO_LEVEL7; + break; + case S1ap_PagingPriority_priolevel8: + S1AP_PAGING_IND(message_p).paging_priority = PAGING_PRIO_LEVEL8; + break; + default: + /* invalid paging_p->pagingPriority */ + S1AP_ERROR("[SCTP %d] Received paging : pagingPriority(%ld) is invalid\n", assoc_id, paging_p->pagingPriority); + return -1; + } + } +#endif + //paging parameter values + S1AP_DEBUG("[SCTP %d] Received Paging parameters: ue_index_value %d cn_domain %d paging_drx %d paging_priority %d\n",assoc_id, + S1AP_PAGING_IND(message_p).ue_index_value, S1AP_PAGING_IND(message_p).cn_domain, + S1AP_PAGING_IND(message_p).paging_drx, S1AP_PAGING_IND(message_p).paging_priority); + S1AP_DEBUG("[SCTP %d] Received Paging parameters(ue): presenceMask %d s_tmsi.m_tmsi %d s_tmsi.mme_code %d IMSI length %d (0-5) %d%d%d%d%d%d\n",assoc_id, + S1AP_PAGING_IND(message_p).ue_paging_identity.presenceMask, S1AP_PAGING_IND(message_p).ue_paging_identity.choice.s_tmsi.m_tmsi, + S1AP_PAGING_IND(message_p).ue_paging_identity.choice.s_tmsi.mme_code, S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.length, + S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.buffer[0], S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.buffer[1], + S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.buffer[2], S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.buffer[3], + S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.buffer[4], S1AP_PAGING_IND(message_p).ue_paging_identity.choice.imsi.buffer[5]); + + /* send message to RRC */ + itti_send_msg_to_task(TASK_RRC_ENB, s1ap_eNB_instance->instance, message_p); + + return 0; +} + +static +int s1ap_eNB_handle_e_rab_modify_request(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *s1ap_message_p) { + + int i; + + s1ap_eNB_mme_data_t *mme_desc_p = NULL; + s1ap_eNB_ue_context_t *ue_desc_p = NULL; + MessageDef *message_p = NULL; + int nb_of_e_rabs_failed = 0; + + S1ap_E_RABModifyRequestIEs_t *s1ap_E_RABModifyRequest; + DevAssert(s1ap_message_p != NULL); + + s1ap_E_RABModifyRequest = &s1ap_message_p->msg.s1ap_E_RABModifyRequestIEs; + + if ((mme_desc_p = s1ap_eNB_get_MME(NULL, assoc_id, 0)) == NULL) { + S1AP_ERROR("[SCTP %d] Received E-RAB modify request for non " + "existing MME context\n", assoc_id); + return -1; + } + + + if ((ue_desc_p = s1ap_eNB_get_ue_context(mme_desc_p->s1ap_eNB_instance, + s1ap_E_RABModifyRequest->eNB_UE_S1AP_ID)) == NULL) { + S1AP_ERROR("[SCTP %d] Received E-RAB modify request for non " + "existing UE context 0x%06lx\n", assoc_id, + s1ap_E_RABModifyRequest->eNB_UE_S1AP_ID); + return -1; + } + + /* E-RAB modify request = UE-related procedure -> stream != 0 */ + if (stream == 0) { + S1AP_ERROR("[SCTP %d] Received UE-related procedure on stream (%d)\n", + assoc_id, stream); + return -1; + } + + ue_desc_p->rx_stream = stream; + + if ( ue_desc_p->mme_ue_s1ap_id != s1ap_E_RABModifyRequest->mme_ue_s1ap_id){ + S1AP_WARN("UE context mme_ue_s1ap_id is different form that of the message (%d != %ld)", + ue_desc_p->mme_ue_s1ap_id, s1ap_E_RABModifyRequest->mme_ue_s1ap_id); + message_p = itti_alloc_new_message (TASK_RRC_ENB, S1AP_E_RAB_MODIFY_RESP); + + S1AP_E_RAB_MODIFY_RESP (message_p).eNB_ue_s1ap_id = s1ap_E_RABModifyRequest->eNB_UE_S1AP_ID; +// S1AP_E_RAB_MODIFY_RESP (msg_fail_p).e_rabs[S1AP_MAX_E_RAB]; + S1AP_E_RAB_MODIFY_RESP (message_p).nb_of_e_rabs = 0; + + for(nb_of_e_rabs_failed = 0; nb_of_e_rabs_failed < s1ap_E_RABModifyRequest->e_RABToBeModifiedListBearerModReq.s1ap_E_RABToBeModifiedItemBearerModReq.count; nb_of_e_rabs_failed++) { + S1AP_E_RAB_MODIFY_RESP (message_p).e_rabs_failed[nb_of_e_rabs_failed].e_rab_id = + ((S1ap_E_RABToBeModifiedItemBearerModReq_t *)s1ap_E_RABModifyRequest->e_RABToBeModifiedListBearerModReq.s1ap_E_RABToBeModifiedItemBearerModReq.array[nb_of_e_rabs_failed])->e_RAB_ID; + S1AP_E_RAB_MODIFY_RESP (message_p).e_rabs_failed[nb_of_e_rabs_failed].cause = S1AP_CAUSE_RADIO_NETWORK; + S1AP_E_RAB_MODIFY_RESP (message_p).e_rabs_failed[nb_of_e_rabs_failed].cause_value = 13;//S1ap_CauseRadioNetwork_unknown_mme_ue_s1ap_id; + } + S1AP_E_RAB_MODIFY_RESP (message_p).nb_of_e_rabs_failed = nb_of_e_rabs_failed; + + s1ap_eNB_e_rab_modify_resp(mme_desc_p->s1ap_eNB_instance->instance, + &S1AP_E_RAB_MODIFY_RESP(message_p)); + + message_p = NULL; + return -1; + } + + message_p = itti_alloc_new_message(TASK_S1AP, S1AP_E_RAB_MODIFY_REQ); + + S1AP_E_RAB_MODIFY_REQ(message_p).ue_initial_id = ue_desc_p->ue_initial_id; + + S1AP_E_RAB_MODIFY_REQ(message_p).mme_ue_s1ap_id = s1ap_E_RABModifyRequest->mme_ue_s1ap_id; + S1AP_E_RAB_MODIFY_REQ(message_p).eNB_ue_s1ap_id = s1ap_E_RABModifyRequest->eNB_UE_S1AP_ID; + + S1AP_E_RAB_MODIFY_REQ(message_p).nb_e_rabs_tomodify = + s1ap_E_RABModifyRequest->e_RABToBeModifiedListBearerModReq.s1ap_E_RABToBeModifiedItemBearerModReq.count; + + for (i = 0; i < s1ap_E_RABModifyRequest->e_RABToBeModifiedListBearerModReq.s1ap_E_RABToBeModifiedItemBearerModReq.count; i++) { + S1ap_E_RABToBeModifiedItemBearerModReq_t *item_p; + + item_p = (S1ap_E_RABToBeModifiedItemBearerModReq_t *)s1ap_E_RABModifyRequest->e_RABToBeModifiedListBearerModReq.s1ap_E_RABToBeModifiedItemBearerModReq.array[i]; + + S1AP_E_RAB_MODIFY_REQ(message_p).e_rab_modify_params[i].e_rab_id = item_p->e_RAB_ID; + + // check for the NAS PDU + if (item_p->nAS_PDU.size > 0 ) { + S1AP_E_RAB_MODIFY_REQ(message_p).e_rab_modify_params[i].nas_pdu.length = item_p->nAS_PDU.size; + + S1AP_E_RAB_MODIFY_REQ(message_p).e_rab_modify_params[i].nas_pdu.buffer = malloc(sizeof(uint8_t) * item_p->nAS_PDU.size); + + memcpy(S1AP_E_RAB_MODIFY_REQ(message_p).e_rab_modify_params[i].nas_pdu.buffer, + item_p->nAS_PDU.buf, item_p->nAS_PDU.size); + } else { + S1AP_E_RAB_MODIFY_REQ(message_p).e_rab_modify_params[i].nas_pdu.length = 0; + S1AP_E_RAB_MODIFY_REQ(message_p).e_rab_modify_params[i].nas_pdu.buffer = NULL; + continue; + } + + /* Set the QOS informations */ + S1AP_E_RAB_MODIFY_REQ(message_p).e_rab_modify_params[i].qos.qci = item_p->e_RABLevelQoSParameters.qCI; + + S1AP_E_RAB_MODIFY_REQ(message_p).e_rab_modify_params[i].qos.allocation_retention_priority.priority_level = + item_p->e_RABLevelQoSParameters.allocationRetentionPriority.priorityLevel; + S1AP_E_RAB_MODIFY_REQ(message_p).e_rab_modify_params[i].qos.allocation_retention_priority.pre_emp_capability = + item_p->e_RABLevelQoSParameters.allocationRetentionPriority.pre_emptionCapability; + S1AP_E_RAB_MODIFY_REQ(message_p).e_rab_modify_params[i].qos.allocation_retention_priority.pre_emp_vulnerability = + item_p->e_RABLevelQoSParameters.allocationRetentionPriority.pre_emptionVulnerability; + + } + + itti_send_msg_to_task(TASK_RRC_ENB, ue_desc_p->eNB_instance->instance, message_p); + + return 0; +} +// handle e-rab release command and send it to rrc_end +static +int s1ap_eNB_handle_e_rab_release_command(uint32_t assoc_id, + uint32_t stream, + struct s1ap_message_s *s1ap_message_p) { + + int i; + + s1ap_eNB_mme_data_t *mme_desc_p = NULL; + s1ap_eNB_ue_context_t *ue_desc_p = NULL; + MessageDef *message_p = NULL; + + S1ap_E_RABReleaseCommandIEs_t *s1ap_E_RABReleaseCommand; + DevAssert(s1ap_message_p != NULL); + s1ap_E_RABReleaseCommand = &s1ap_message_p->msg.s1ap_E_RABReleaseCommandIEs; + + if ((mme_desc_p = s1ap_eNB_get_MME(NULL, assoc_id, 0)) == NULL) { + S1AP_ERROR("[SCTP %d] Received E-RAB release command for non existing MME context\n", assoc_id); + return -1; + } + if ((ue_desc_p = s1ap_eNB_get_ue_context(mme_desc_p->s1ap_eNB_instance, + s1ap_E_RABReleaseCommand->eNB_UE_S1AP_ID)) == NULL) { + S1AP_ERROR("[SCTP %d] Received E-RAB release command for non existing UE context 0x%06lx\n", assoc_id, + s1ap_E_RABReleaseCommand->eNB_UE_S1AP_ID); + return -1; + } + + /* Initial context request = UE-related procedure -> stream != 0 */ + if (stream == 0) { + S1AP_ERROR("[SCTP %d] Received UE-related procedure on stream (%d)\n", + assoc_id, stream); + return -1; + } + + ue_desc_p->rx_stream = stream; + + if ( ue_desc_p->mme_ue_s1ap_id != s1ap_E_RABReleaseCommand->mme_ue_s1ap_id){ + S1AP_WARN("UE context mme_ue_s1ap_id is different form that of the message (%d != %ld)", + ue_desc_p->mme_ue_s1ap_id, s1ap_E_RABReleaseCommand->mme_ue_s1ap_id); + } + + S1AP_DEBUG("[SCTP %d] Received E-RAB release command for eNB_UE_S1AP_ID %ld mme_ue_s1ap_id %ld\n", + assoc_id, s1ap_E_RABReleaseCommand->eNB_UE_S1AP_ID, s1ap_E_RABReleaseCommand->mme_ue_s1ap_id); + + message_p = itti_alloc_new_message(TASK_S1AP, S1AP_E_RAB_RELEASE_COMMAND); + + S1AP_E_RAB_RELEASE_COMMAND(message_p).eNB_ue_s1ap_id = s1ap_E_RABReleaseCommand->eNB_UE_S1AP_ID; + S1AP_E_RAB_RELEASE_COMMAND(message_p).mme_ue_s1ap_id = s1ap_E_RABReleaseCommand->mme_ue_s1ap_id; + if(s1ap_E_RABReleaseCommand->nas_pdu.size > 0 ){ + S1AP_E_RAB_RELEASE_COMMAND(message_p).nas_pdu.length = s1ap_E_RABReleaseCommand->nas_pdu.size; + + S1AP_E_RAB_RELEASE_COMMAND(message_p).nas_pdu.buffer = + malloc(sizeof(uint8_t) * s1ap_E_RABReleaseCommand->nas_pdu.size); + + memcpy(S1AP_E_RAB_RELEASE_COMMAND(message_p).nas_pdu.buffer, + s1ap_E_RABReleaseCommand->nas_pdu.buf, + s1ap_E_RABReleaseCommand->nas_pdu.size); + } else { + S1AP_E_RAB_RELEASE_COMMAND(message_p).nas_pdu.length = 0; + S1AP_E_RAB_RELEASE_COMMAND(message_p).nas_pdu.buffer = NULL; + } + + S1AP_E_RAB_RELEASE_COMMAND(message_p).nb_e_rabs_torelease = s1ap_E_RABReleaseCommand->e_RABToBeReleasedList.s1ap_E_RABItem.count; + for(i=0; i < s1ap_E_RABReleaseCommand->e_RABToBeReleasedList.s1ap_E_RABItem.count; i++){ + S1ap_E_RABItem_t *item_p; + item_p = (S1ap_E_RABItem_t*)s1ap_E_RABReleaseCommand->e_RABToBeReleasedList.s1ap_E_RABItem.array[i]; + S1AP_E_RAB_RELEASE_COMMAND(message_p).e_rab_release_params[i].e_rab_id = item_p->e_RAB_ID; + S1AP_DEBUG("[SCTP] Received E-RAB release command for e-rab id %ld\n", item_p->e_RAB_ID); + } + + itti_send_msg_to_task(TASK_RRC_ENB, ue_desc_p->eNB_instance->instance, message_p); + + return 0; +} diff --git a/openair3/S1AP/s1ap_eNB_handlers.h b/openair3/S1AP/s1ap_eNB_handlers.h index 145fd04721..d0e93faa4d 100644 --- a/openair3/S1AP/s1ap_eNB_handlers.h +++ b/openair3/S1AP/s1ap_eNB_handlers.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef S1AP_ENB_HANDLERS_H_ #define S1AP_ENB_HANDLERS_H_ diff --git a/openair3/S1AP/s1ap_eNB_itti_messaging.c b/openair3/S1AP/s1ap_eNB_itti_messaging.c index b6cdf368f4..a0cdfd2dbc 100644 --- a/openair3/S1AP/s1ap_eNB_itti_messaging.c +++ b/openair3/S1AP/s1ap_eNB_itti_messaging.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include "intertask_interface.h" #include "s1ap_eNB_itti_messaging.h" diff --git a/openair3/S1AP/s1ap_eNB_itti_messaging.h b/openair3/S1AP/s1ap_eNB_itti_messaging.h index 4021d623c4..cd6b3cebcc 100644 --- a/openair3/S1AP/s1ap_eNB_itti_messaging.h +++ b/openair3/S1AP/s1ap_eNB_itti_messaging.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef S1AP_ENB_ITTI_MESSAGING_H_ #define S1AP_ENB_ITTI_MESSAGING_H_ diff --git a/openair3/S1AP/s1ap_eNB_management_procedures.c b/openair3/S1AP/s1ap_eNB_management_procedures.c index eb30a8dada..fc7ae70e49 100644 --- a/openair3/S1AP/s1ap_eNB_management_procedures.c +++ b/openair3/S1AP/s1ap_eNB_management_procedures.c @@ -1,31 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/*! \file s1ap_eNB_management_procedures.c + * \brief S1AP eNB task + * \author S. Roux and Navid Nikaein + * \date 2010 - 2016 + * \email: navid.nikaein@eurecom.fr + * \version 1.0 + * @ingroup _s1ap + */ #include #include @@ -116,6 +117,23 @@ struct s1ap_eNB_mme_data_s *s1ap_eNB_get_MME( return NULL; } +struct s1ap_eNB_mme_data_s *s1ap_eNB_get_MME_from_instance( + s1ap_eNB_instance_t *instance_p) +{ + + struct s1ap_eNB_mme_data_s *mme = NULL; + struct s1ap_eNB_mme_data_s *mme_next = NULL; + + for (mme = RB_MIN(s1ap_mme_map, &instance_p->s1ap_mme_head); mme!=NULL ; mme = mme_next) { + mme_next = RB_NEXT(s1ap_mme_map, &instance_p->s1ap_mme_head, mme); + if (mme->s1ap_eNB_instance == instance_p) { + return mme; + } + } + + return NULL; +} + s1ap_eNB_instance_t *s1ap_eNB_get_instance(instance_t instance) { s1ap_eNB_instance_t *temp = NULL; @@ -130,3 +148,41 @@ s1ap_eNB_instance_t *s1ap_eNB_get_instance(instance_t instance) return NULL; } + +void s1ap_eNB_remove_mme_desc(s1ap_eNB_instance_t * instance) +{ + + struct s1ap_eNB_mme_data_s *mme = NULL; + struct s1ap_eNB_mme_data_s *mmeNext = NULL; + struct plmn_identity_s* plmnInfo; + struct served_group_id_s* groupInfo; + struct served_gummei_s* gummeiInfo; + struct mme_code_s* mmeCode; + + for (mme = RB_MIN(s1ap_mme_map, &instance->s1ap_mme_head); mme; mme = mmeNext) { + mmeNext = RB_NEXT(s1ap_mme_map, &instance->s1ap_mme_head, mme); + RB_REMOVE(s1ap_mme_map, &instance->s1ap_mme_head, mme); + while (!STAILQ_EMPTY(&mme->served_gummei)) { + gummeiInfo = STAILQ_FIRST(&mme->served_gummei); + STAILQ_REMOVE_HEAD(&mme->served_gummei, next); + + while (!STAILQ_EMPTY(&gummeiInfo->served_plmns)) { + plmnInfo = STAILQ_FIRST(&gummeiInfo->served_plmns); + STAILQ_REMOVE_HEAD(&gummeiInfo->served_plmns, next); + free(plmnInfo); + } + while (!STAILQ_EMPTY(&gummeiInfo->served_group_ids)) { + groupInfo = STAILQ_FIRST(&gummeiInfo->served_group_ids); + STAILQ_REMOVE_HEAD(&gummeiInfo->served_group_ids, next); + free(groupInfo); + } + while (!STAILQ_EMPTY(&gummeiInfo->mme_codes)) { + mmeCode = STAILQ_FIRST(&gummeiInfo->mme_codes); + STAILQ_REMOVE_HEAD(&gummeiInfo->mme_codes, next); + free(mmeCode); + } + free(gummeiInfo); + } + free(mme); + } +} diff --git a/openair3/S1AP/s1ap_eNB_management_procedures.h b/openair3/S1AP/s1ap_eNB_management_procedures.h index 2e00add882..83df7f8919 100644 --- a/openair3/S1AP/s1ap_eNB_management_procedures.h +++ b/openair3/S1AP/s1ap_eNB_management_procedures.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef S1AP_ENB_MANAGEMENT_PROCEDURES_H_ #define S1AP_ENB_MANAGEMENT_PROCEDURES_H_ @@ -34,6 +26,10 @@ struct s1ap_eNB_mme_data_s *s1ap_eNB_get_MME( s1ap_eNB_instance_t *instance_p, int32_t assoc_id, uint16_t cnx_id); +struct s1ap_eNB_mme_data_s *s1ap_eNB_get_MME_from_instance(s1ap_eNB_instance_t *instance_p); + +void s1ap_eNB_remove_mme_desc(s1ap_eNB_instance_t * instance); + void s1ap_eNB_insert_new_instance(s1ap_eNB_instance_t *new_instance_p); s1ap_eNB_instance_t *s1ap_eNB_get_instance(uint8_t mod_id); diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.c b/openair3/S1AP/s1ap_eNB_nas_procedures.c index 43f5ad49e5..d6d9b52c07 100644 --- a/openair3/S1AP/s1ap_eNB_nas_procedures.c +++ b/openair3/S1AP/s1ap_eNB_nas_procedures.c @@ -1,32 +1,32 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ +/*! \file s1ap_eNB_nas_procedures.c + * \brief S1AP eNb NAS procedure handler + * \author S. Roux and Navid Nikaein + * \date 2010 - 2015 + * \email: navid.nikaein@eurecom.fr + * \version 1.0 + * @ingroup _s1ap + */ #include #include #include @@ -288,9 +288,13 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id, downlink_NAS_transport_p->eNB_UE_S1AP_ID, downlink_NAS_transport_p->mme_ue_s1ap_id); - S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%"PRIx32" %u\n", + /* TODO: fix this log - the original version is suspicious (twice downlink_NAS_transport_p->eNB_UE_S1AP_ID?) */ + /*S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%"PRIx32" %u\n", assoc_id, downlink_NAS_transport_p->eNB_UE_S1AP_ID, + downlink_NAS_transport_p->eNB_UE_S1AP_ID);*/ + S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%lx\n", + assoc_id, downlink_NAS_transport_p->eNB_UE_S1AP_ID); return -1; } @@ -311,7 +315,7 @@ int s1ap_eNB_handle_nas_downlink(const uint32_t assoc_id, } else { /* We already have a mme ue s1ap id check the received is the same */ if (ue_desc_p->mme_ue_s1ap_id != downlink_NAS_transport_p->mme_ue_s1ap_id) { - S1AP_ERROR("[SCTP %d] Mismatch in MME UE S1AP ID (0x%"PRIx32" != 0x%"PRIx32")\n", + S1AP_ERROR("[SCTP %d] Mismatch in MME UE S1AP ID (0x%lx != 0x%"PRIx32"\n", assoc_id, downlink_NAS_transport_p->mme_ue_s1ap_id, ue_desc_p->mme_ue_s1ap_id @@ -579,6 +583,14 @@ int s1ap_eNB_initial_ctxt_resp( new_item->transportLayerAddress.size = initial_ctxt_resp_p->e_rabs[i].eNB_addr.length; new_item->transportLayerAddress.bits_unused = 0; + S1AP_DEBUG("initial_ctxt_resp_p: e_rab ID %ld, enb_addr %d.%d.%d.%d, SIZE %d \n", + new_item->e_RAB_ID, + new_item->transportLayerAddress.buf[0], + new_item->transportLayerAddress.buf[1], + new_item->transportLayerAddress.buf[2], + new_item->transportLayerAddress.buf[3], + new_item->transportLayerAddress.size); + ASN_SEQUENCE_ADD(&initial_ies_p->e_RABSetupListCtxtSURes.s1ap_E_RABSetupItemCtxtSURes, new_item); } @@ -688,3 +700,419 @@ int s1ap_eNB_ue_capabilities(instance_t instance, return ret; } +//------------------------------------------------------------------------------ +int s1ap_eNB_e_rab_setup_resp(instance_t instance, + s1ap_e_rab_setup_resp_t *e_rab_setup_resp_p) +//------------------------------------------------------------------------------ +{ + s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL; + struct s1ap_eNB_ue_context_s *ue_context_p = NULL; + + S1ap_E_RABSetupResponseIEs_t *initial_ies_p = NULL; + + s1ap_message message; + + uint8_t *buffer = NULL; + uint32_t length; + int ret = -1; + int i; + + /* Retrieve the S1AP eNB instance associated with Mod_id */ + s1ap_eNB_instance_p = s1ap_eNB_get_instance(instance); + + DevAssert(e_rab_setup_resp_p != NULL); + DevAssert(s1ap_eNB_instance_p != NULL); + + if ((ue_context_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance_p, + e_rab_setup_resp_p->eNB_ue_s1ap_id)) == NULL) { + /* The context for this eNB ue s1ap id doesn't exist in the map of eNB UEs */ + S1AP_WARN("Failed to find ue context associated with eNB ue s1ap id: 0x%06x\n", + e_rab_setup_resp_p->eNB_ue_s1ap_id); + return -1; + } + + /* Uplink NAS transport can occur either during an s1ap connected state + * or during initial attach (for example: NAS authentication). + */ + if (!(ue_context_p->ue_state == S1AP_UE_CONNECTED || + ue_context_p->ue_state == S1AP_UE_WAITING_CSR)) { + S1AP_WARN("You are attempting to send NAS data over non-connected " + "eNB ue s1ap id: %06x, current state: %d\n", + e_rab_setup_resp_p->eNB_ue_s1ap_id, ue_context_p->ue_state); + return -1; + } + + /* Prepare the S1AP message to encode */ + memset(&message, 0, sizeof(s1ap_message)); + + message.direction = S1AP_PDU_PR_successfulOutcome; + message.procedureCode = S1ap_ProcedureCode_id_E_RABSetup; + message.criticality = S1ap_Criticality_reject; + + initial_ies_p = &message.msg.s1ap_E_RABSetupResponseIEs; + + initial_ies_p->eNB_UE_S1AP_ID = e_rab_setup_resp_p->eNB_ue_s1ap_id; + initial_ies_p->mme_ue_s1ap_id = ue_context_p->mme_ue_s1ap_id; + + if ( e_rab_setup_resp_p->nb_of_e_rabs >= 1 ) + initial_ies_p->presenceMask |= S1AP_E_RABSETUPRESPONSEIES_E_RABSETUPLISTBEARERSURES_PRESENT; + + for (i = 0; i < e_rab_setup_resp_p->nb_of_e_rabs; i++) { + S1ap_E_RABSetupItemBearerSURes_t *new_item; + + new_item = calloc(1, sizeof(S1ap_E_RABSetupItemBearerSURes_t)); + + new_item->e_RAB_ID = e_rab_setup_resp_p->e_rabs[i].e_rab_id; + GTP_TEID_TO_ASN1(e_rab_setup_resp_p->e_rabs[i].gtp_teid, &new_item->gTP_TEID); + + /* + new_item->transportLayerAddress.buf = MALLOC(e_rab_setup_resp_p->e_rabs[i].eNB_addr.length); + memcpy (new_item->transportLayerAddress.buf, + e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer, + e_rab_setup_resp_p->e_rabs[i].eNB_addr.length); + + */ + /* + new_item->transportLayerAddress.buf[0] = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer[0]; + new_item->transportLayerAddress.buf[1] = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer[1]; + new_item->transportLayerAddress.buf[2] = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer[2]; + new_item->transportLayerAddress.buf[3] = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer[3]; + */ + new_item->transportLayerAddress.buf = e_rab_setup_resp_p->e_rabs[i].eNB_addr.buffer; + new_item->transportLayerAddress.size = e_rab_setup_resp_p->e_rabs[i].eNB_addr.length; + new_item->transportLayerAddress.bits_unused = 0; + + S1AP_DEBUG("e_rab_setup_resp: e_rab ID %ld, teid %u, enb_addr %d.%d.%d.%d, SIZE %d\n", + new_item->e_RAB_ID, + e_rab_setup_resp_p->e_rabs[i].gtp_teid, + new_item->transportLayerAddress.buf[0], + new_item->transportLayerAddress.buf[1], + new_item->transportLayerAddress.buf[2], + new_item->transportLayerAddress.buf[3], + new_item->transportLayerAddress.size); + + S1ap_IE_t *ie = s1ap_new_ie(S1ap_ProtocolIE_ID_id_E_RABSetupItemBearerSURes, + S1ap_Criticality_ignore, + &asn_DEF_S1ap_E_RABSetupItemBearerSURes, + new_item); + /* + S1ap_IE_t *ie = s1ap_new_ie(S1ap_ProtocolIE_ID_id_E_RABSetupListBearerSURes, + S1ap_Criticality_ignore, + &asn_DEF_S1ap_E_RABSetupListBearerSURes, + new_item); + */ + ASN_SEQUENCE_ADD(&initial_ies_p->e_RABSetupListBearerSURes.s1ap_E_RABSetupItemBearerSURes, + ie); + } + + /* S1ap_E_RABSetupListBearerSURes_t e_RABSetupListBearerSURes; + memset(&e_RABSetupListBearerSURes, 0, sizeof(S1ap_E_RABSetupListBearerSURes_t)); + if (s1ap_encode_s1ap_e_rabsetuplistbearersures(&e_RABSetupListBearerSURes, &initial_ies_p->e_RABSetupListBearerSURes.s1ap_E_RABSetupItemBearerSURes) < 0 ) + return -1; + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_S1ap_E_RABSetupListBearerSURes, &e_RABSetupListBearerSURes); + */ + fprintf(stderr, "start encode\n"); + if (s1ap_eNB_encode_pdu(&message, &buffer, &length) < 0) { + S1AP_ERROR("Failed to encode uplink transport\n"); + /* Encode procedure has failed... */ + return -1; + } + + + + MSC_LOG_TX_MESSAGE( + MSC_S1AP_ENB, + MSC_S1AP_MME, + (const char *)buffer, + length, + MSC_AS_TIME_FMT" E_RAN Setup successfulOutcome eNB_ue_s1ap_id %u mme_ue_s1ap_id %u", + 0,0,//MSC_AS_TIME_ARGS(ctxt_pP), + initial_ies_p->eNB_UE_S1AP_ID, + initial_ies_p->mme_ue_s1ap_id); + + /* UE associated signalling -> use the allocated stream */ + s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance, + ue_context_p->mme_ref->assoc_id, buffer, + length, ue_context_p->tx_stream); + + return ret; +} + +//------------------------------------------------------------------------------ +int s1ap_eNB_e_rab_modify_resp(instance_t instance, + s1ap_e_rab_modify_resp_t *e_rab_modify_resp_p) +//------------------------------------------------------------------------------ +{ + s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL; + struct s1ap_eNB_ue_context_s *ue_context_p = NULL; + + S1ap_E_RABModifyResponseIEs_t *initial_ies_p = NULL; + + s1ap_message message; + + uint8_t *buffer = NULL; + uint32_t length; + int ret = -1; + int i; + + /* Retrieve the S1AP eNB instance associated with Mod_id */ + s1ap_eNB_instance_p = s1ap_eNB_get_instance(instance); + + DevAssert(e_rab_modify_resp_p != NULL); + DevAssert(s1ap_eNB_instance_p != NULL); + + if ((ue_context_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance_p, + e_rab_modify_resp_p->eNB_ue_s1ap_id)) == NULL) { + /* The context for this eNB ue s1ap id doesn't exist in the map of eNB UEs */ + S1AP_WARN("Failed to find ue context associated with eNB ue s1ap id: 0x%06x\n", + e_rab_modify_resp_p->eNB_ue_s1ap_id); + return -1; + } + + /* Uplink NAS transport can occur either during an s1ap connected state + * or during initial attach (for example: NAS authentication). + */ + if (!(ue_context_p->ue_state == S1AP_UE_CONNECTED || + ue_context_p->ue_state == S1AP_UE_WAITING_CSR)) { + S1AP_WARN("You are attempting to send NAS data over non-connected " + "eNB ue s1ap id: %06x, current state: %d\n", + e_rab_modify_resp_p->eNB_ue_s1ap_id, ue_context_p->ue_state); + return -1; + } + + /* Prepare the S1AP message to encode */ + memset(&message, 0, sizeof(s1ap_message)); + + message.direction = S1AP_PDU_PR_successfulOutcome; + message.procedureCode = S1ap_ProcedureCode_id_E_RABModify; + message.criticality = S1ap_Criticality_reject; + + initial_ies_p = &message.msg.s1ap_E_RABModifyResponseIEs; + + initial_ies_p->eNB_UE_S1AP_ID = e_rab_modify_resp_p->eNB_ue_s1ap_id; + initial_ies_p->mme_ue_s1ap_id = ue_context_p->mme_ue_s1ap_id; + + if ( e_rab_modify_resp_p->nb_of_e_rabs >= 1 ) + initial_ies_p->presenceMask |= S1AP_E_RABMODIFYRESPONSEIES_E_RABMODIFYLISTBEARERMODRES_PRESENT; + + for (i = 0; i < e_rab_modify_resp_p->nb_of_e_rabs; i++) { + S1ap_E_RABModifyItemBearerModRes_t *modify_item; + + modify_item = calloc(1, sizeof(S1ap_E_RABModifyItemBearerModRes_t)); + + modify_item->e_RAB_ID = e_rab_modify_resp_p->e_rabs[i].e_rab_id; + + S1AP_DEBUG("e_rab_modify_resp: modified e_rab ID %ld\n", + modify_item->e_RAB_ID); + + S1ap_IE_t *ie = s1ap_new_ie(S1ap_ProtocolIE_ID_id_E_RABModifyItemBearerModRes, + S1ap_Criticality_ignore, + &asn_DEF_S1ap_E_RABModifyItemBearerModRes, + modify_item); + + ASN_SEQUENCE_ADD(&initial_ies_p->e_RABModifyListBearerModRes.s1ap_E_RABModifyItemBearerModRes, + ie); + } + + if ( e_rab_modify_resp_p->nb_of_e_rabs_failed >= 1 ) + initial_ies_p->presenceMask |= S1AP_E_RABMODIFYRESPONSEIES_E_RABFAILEDTOMODIFYLIST_PRESENT; + + for (i = 0; i < e_rab_modify_resp_p->nb_of_e_rabs_failed; i++) { + S1ap_E_RABItem_t *failed_item; + + failed_item = calloc(1, sizeof(S1ap_E_RABItem_t)); + + failed_item->e_RAB_ID = e_rab_modify_resp_p->e_rabs_failed[i].e_rab_id; + switch(e_rab_modify_resp_p->e_rabs_failed[i].cause) + { + case S1AP_CAUSE_RADIO_NETWORK: + failed_item->cause.present = S1ap_Cause_PR_radioNetwork; + failed_item->cause.choice.radioNetwork = e_rab_modify_resp_p->e_rabs_failed[i].cause_value; + break; + case S1AP_CAUSE_TRANSPORT: + failed_item->cause.present = S1ap_Cause_PR_transport; + failed_item->cause.choice.transport = e_rab_modify_resp_p->e_rabs_failed[i].cause_value; + break; + case S1AP_CAUSE_NAS: + failed_item->cause.present = S1ap_Cause_PR_nas; + failed_item->cause.choice.nas = e_rab_modify_resp_p->e_rabs_failed[i].cause_value; + break; + case S1AP_CAUSE_PROTOCOL: + failed_item->cause.present = S1ap_Cause_PR_protocol; + failed_item->cause.choice.protocol = e_rab_modify_resp_p->e_rabs_failed[i].cause_value; + break; + case S1AP_CAUSE_MISC: + failed_item->cause.present = S1ap_Cause_PR_misc; + failed_item->cause.choice.misc = e_rab_modify_resp_p->e_rabs_failed[i].cause_value; + break; + default: + break; + } + S1AP_DEBUG("e_rab_modify_resp: failed e_rab ID %ld\n", + failed_item->e_RAB_ID); + + S1ap_IE_t *ie = s1ap_new_ie(S1ap_ProtocolIE_ID_id_E_RABItem, + S1ap_Criticality_ignore, + &asn_DEF_S1ap_E_RABItem, + failed_item); + + ASN_SEQUENCE_ADD(&initial_ies_p->e_RABFailedToModifyList.s1ap_E_RABItem, + ie); + } + + fprintf(stderr, "start encode\n"); + if (s1ap_eNB_encode_pdu(&message, &buffer, &length) < 0) { + S1AP_ERROR("Failed to encode uplink transport\n"); + /* Encode procedure has failed... */ + return -1; + } + + MSC_LOG_TX_MESSAGE( + MSC_S1AP_ENB, + MSC_S1AP_MME, + (const char *)buffer, + length, + MSC_AS_TIME_FMT" E_RAN Modify successful Outcome eNB_ue_s1ap_id %u mme_ue_s1ap_id %u", + 0,0,//MSC_AS_TIME_ARGS(ctxt_pP), + initial_ies_p->eNB_UE_S1AP_ID, + initial_ies_p->mme_ue_s1ap_id); + + /* UE associated signalling -> use the allocated stream */ + s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance, + ue_context_p->mme_ref->assoc_id, buffer, + length, ue_context_p->tx_stream); + + return ret; +} +//------------------------------------------------------------------------------ +int s1ap_eNB_e_rab_release_resp(instance_t instance, + s1ap_e_rab_release_resp_t *e_rab_release_resp_p) +//------------------------------------------------------------------------------ +{ + s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL; + struct s1ap_eNB_ue_context_s *ue_context_p = NULL; + + S1ap_E_RABReleaseResponseIEs_t *release_response_ies_p = NULL; + + s1ap_message message; + + uint8_t *buffer = NULL; + uint32_t length; + int ret = -1; + int i; + /* Retrieve the S1AP eNB instance associated with Mod_id */ + s1ap_eNB_instance_p = s1ap_eNB_get_instance(instance); + DevAssert(e_rab_release_resp_p != NULL); + DevAssert(s1ap_eNB_instance_p != NULL); + + /* Prepare the S1AP message to encode */ + memset(&message, 0, sizeof(s1ap_message)); + + message.direction = S1AP_PDU_PR_successfulOutcome; + message.procedureCode = S1ap_ProcedureCode_id_E_RABRelease; + message.criticality = S1ap_Criticality_ignore; + + if ((ue_context_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance_p, + e_rab_release_resp_p->eNB_ue_s1ap_id)) == NULL) { + /* The context for this eNB ue s1ap id doesn't exist in the map of eNB UEs */ + S1AP_WARN("Failed to find ue context associated with eNB ue s1ap id: %u\n", + e_rab_release_resp_p->eNB_ue_s1ap_id); + return -1; + } + + release_response_ies_p = &message.msg.s1ap_E_RABReleaseResponseIEs; + release_response_ies_p->eNB_UE_S1AP_ID = e_rab_release_resp_p->eNB_ue_s1ap_id; + release_response_ies_p->mme_ue_s1ap_id = ue_context_p->mme_ue_s1ap_id; + + if ( e_rab_release_resp_p->nb_of_e_rabs_released > 0 ) + release_response_ies_p->presenceMask |= S1AP_E_RABRELEASERESPONSEIES_E_RABRELEASELISTBEARERRELCOMP_PRESENT; + + //release + for (i = 0; i < e_rab_release_resp_p->nb_of_e_rabs_released; i++) { + + S1ap_E_RABReleaseItemBearerRelComp_t *new_item; + + new_item = calloc(1, sizeof(S1ap_E_RABReleaseItemBearerRelComp_t)); + + new_item->e_RAB_ID = e_rab_release_resp_p->e_rab_release[i].e_rab_id; + + S1AP_DEBUG("e_rab_release_resp: e_rab ID %ld\n",new_item->e_RAB_ID); + + ASN_SEQUENCE_ADD(&release_response_ies_p->e_RABReleaseListBearerRelComp.s1ap_E_RABReleaseItemBearerRelComp, + new_item); + + } + + if ( e_rab_release_resp_p->nb_of_e_rabs_failed > 0 ) + release_response_ies_p->presenceMask |= S1AP_E_RABRELEASERESPONSEIES_E_RABFAILEDTORELEASELIST_PRESENT; + + //release failed + for (i = 0; i < e_rab_release_resp_p->nb_of_e_rabs_failed; i++) { + S1ap_E_RABItem_t *new_rabitem; + new_rabitem = calloc(1, sizeof(S1ap_E_RABItem_t)); + //e_rab_id + new_rabitem->e_RAB_ID = e_rab_release_resp_p->e_rabs_failed[i].e_rab_id; + //cause + switch(e_rab_release_resp_p->e_rabs_failed[i].cause) + { + case S1AP_CAUSE_NOTHING: + new_rabitem->cause.present = S1ap_Cause_PR_NOTHING; + break; + + case S1AP_CAUSE_RADIO_NETWORK: + new_rabitem->cause.present = S1ap_Cause_PR_radioNetwork; + new_rabitem->cause.choice.radioNetwork = e_rab_release_resp_p->e_rabs_failed[i].cause_value; + break; + + case S1AP_CAUSE_TRANSPORT: + new_rabitem->cause.present = S1ap_Cause_PR_transport; + new_rabitem->cause.choice.transport = e_rab_release_resp_p->e_rabs_failed[i].cause_value; + break; + + case S1AP_CAUSE_NAS: + new_rabitem->cause.present = S1ap_Cause_PR_nas; + new_rabitem->cause.choice.nas = e_rab_release_resp_p->e_rabs_failed[i].cause_value; + break; + + case S1AP_CAUSE_PROTOCOL: + new_rabitem->cause.present = S1ap_Cause_PR_protocol; + new_rabitem->cause.choice.protocol = e_rab_release_resp_p->e_rabs_failed[i].cause_value; + break; + + case S1AP_CAUSE_MISC: + default: + new_rabitem->cause.present = S1ap_Cause_PR_misc; + new_rabitem->cause.choice.misc = e_rab_release_resp_p->e_rabs_failed[i].cause_value; + break; + } + S1AP_DEBUG("e_rab_release_resp: failed e_rab ID %ld\n",new_rabitem->e_RAB_ID); + ASN_SEQUENCE_ADD(&release_response_ies_p->e_RABFailedToReleaseList.s1ap_E_RABItem, new_rabitem); + } + + fprintf(stderr, "start encode\n"); + if (s1ap_eNB_encode_pdu(&message, &buffer, &length) < 0) { + S1AP_ERROR("Failed to encode release response\n"); + /* Encode procedure has failed... */ + return -1; + } + + MSC_LOG_TX_MESSAGE( + MSC_S1AP_ENB, + MSC_S1AP_MME, + (const char *)buffer, + length, + MSC_AS_TIME_FMT" E_RAN Release successfulOutcome eNB_ue_s1ap_id %u mme_ue_s1ap_id %u", + 0,0,//MSC_AS_TIME_ARGS(ctxt_pP), + e_rab_release_resp_p->eNB_ue_s1ap_id, + ue_context_p->mme_ue_s1ap_id); + + /* UE associated signalling -> use the allocated stream */ + s1ap_eNB_itti_send_sctp_data_req(s1ap_eNB_instance_p->instance, + ue_context_p->mme_ref->assoc_id, buffer, + length, ue_context_p->tx_stream); + + S1AP_INFO("e_rab_release_response sended eNB_UE_S1AP_ID %d mme_ue_s1ap_id %d nb_of_e_rabs_released %d nb_of_e_rabs_failed %d\n", + e_rab_release_resp_p->eNB_ue_s1ap_id, ue_context_p->mme_ue_s1ap_id,e_rab_release_resp_p->nb_of_e_rabs_released,e_rab_release_resp_p->nb_of_e_rabs_failed); + + return ret; +} diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.h b/openair3/S1AP/s1ap_eNB_nas_procedures.h index 552726e8ed..bb2a0488bf 100644 --- a/openair3/S1AP/s1ap_eNB_nas_procedures.h +++ b/openair3/S1AP/s1ap_eNB_nas_procedures.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef S1AP_ENB_NAS_PROCEDURES_H_ #define S1AP_ENB_NAS_PROCEDURES_H_ @@ -49,5 +41,12 @@ int s1ap_eNB_initial_ctxt_resp( int s1ap_eNB_ue_capabilities(instance_t instance, s1ap_ue_cap_info_ind_t *ue_cap_info_ind_p); +int s1ap_eNB_e_rab_setup_resp(instance_t instance, + s1ap_e_rab_setup_resp_t *e_rab_setup_resp_p); +int s1ap_eNB_e_rab_modify_resp(instance_t instance, + s1ap_e_rab_modify_resp_t *e_rab_modify_resp_p); + +int s1ap_eNB_e_rab_release_resp(instance_t instance, + s1ap_e_rab_release_resp_t *e_rab_release_resp_p); #endif /* S1AP_ENB_NAS_PROCEDURES_H_ */ diff --git a/openair3/S1AP/s1ap_eNB_nnsf.c b/openair3/S1AP/s1ap_eNB_nnsf.c index cf3d4436ed..8b7d65cb01 100644 --- a/openair3/S1AP/s1ap_eNB_nnsf.c +++ b/openair3/S1AP/s1ap_eNB_nnsf.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file s1ap_eNB_nnsf.c * \brief s1ap NAS node selection functions diff --git a/openair3/S1AP/s1ap_eNB_nnsf.h b/openair3/S1AP/s1ap_eNB_nnsf.h index 687f40dd1d..78405f34d1 100644 --- a/openair3/S1AP/s1ap_eNB_nnsf.h +++ b/openair3/S1AP/s1ap_eNB_nnsf.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef S1AP_ENB_NNSF_H_ #define S1AP_ENB_NNSF_H_ diff --git a/openair3/S1AP/s1ap_eNB_overload.c b/openair3/S1AP/s1ap_eNB_overload.c index 2c32f4f9de..82167bfeeb 100644 --- a/openair3/S1AP/s1ap_eNB_overload.c +++ b/openair3/S1AP/s1ap_eNB_overload.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file s1ap_eNB_overload.c * \brief s1ap procedures for overload messages within eNB diff --git a/openair3/S1AP/s1ap_eNB_overload.h b/openair3/S1AP/s1ap_eNB_overload.h index baa1ad1232..1b0ee443de 100644 --- a/openair3/S1AP/s1ap_eNB_overload.h +++ b/openair3/S1AP/s1ap_eNB_overload.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef S1AP_ENB_OVERLOAD_H_ #define S1AP_ENB_OVERLOAD_H_ diff --git a/openair3/S1AP/s1ap_eNB_trace.c b/openair3/S1AP/s1ap_eNB_trace.c index fd192d7320..e640c9292a 100644 --- a/openair3/S1AP/s1ap_eNB_trace.c +++ b/openair3/S1AP/s1ap_eNB_trace.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include diff --git a/openair3/S1AP/s1ap_eNB_trace.h b/openair3/S1AP/s1ap_eNB_trace.h index 7d7d49781b..922197afb4 100644 --- a/openair3/S1AP/s1ap_eNB_trace.h +++ b/openair3/S1AP/s1ap_eNB_trace.h @@ -1,32 +1,23 @@ -/******************************************************************************* - - Eurecom OpenAirInterface - Copyright(c) 1999 - 2013 Eurecom - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information - Openair Admin: openair_admin@eurecom.fr - Openair Tech : openair_tech@eurecom.fr - Forums : http://forums.eurecom.fr/openairinterface - Address : EURECOM, Campus SophiaTech, 450 Route des Chappes - 06410 Biot FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef S1AP_ENB_TRACE_H_ #define S1AP_ENB_TRACE_H_ diff --git a/openair3/S1AP/s1ap_eNB_ue_context.c b/openair3/S1AP/s1ap_eNB_ue_context.c index 50df294dce..9cc8910ac5 100644 --- a/openair3/S1AP/s1ap_eNB_ue_context.c +++ b/openair3/S1AP/s1ap_eNB_ue_context.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file s1ap_eNB_ue_context.c * \brief s1ap UE context management within eNB diff --git a/openair3/S1AP/s1ap_eNB_ue_context.h b/openair3/S1AP/s1ap_eNB_ue_context.h index 43c9d0e2c2..d78c6f7f1a 100644 --- a/openair3/S1AP/s1ap_eNB_ue_context.h +++ b/openair3/S1AP/s1ap_eNB_ue_context.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "tree.h" #include "queue.h" diff --git a/openair3/SCTP/COPYING b/openair3/SCTP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/SCTP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/SCTP/sctp_common.c b/openair3/SCTP/sctp_common.c index 8e26679e6a..c467290b36 100644 --- a/openair3/SCTP/sctp_common.c +++ b/openair3/SCTP/sctp_common.c @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /*! \file sctp_common.c diff --git a/openair3/SCTP/sctp_common.h b/openair3/SCTP/sctp_common.h index bffc61a919..f88c07730c 100644 --- a/openair3/SCTP/sctp_common.h +++ b/openair3/SCTP/sctp_common.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ /*! \file sctp_common.h diff --git a/openair3/SCTP/sctp_default_values.h b/openair3/SCTP/sctp_default_values.h index 4eaa4e88c2..5008ea0b72 100644 --- a/openair3/SCTP/sctp_default_values.h +++ b/openair3/SCTP/sctp_default_values.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #ifndef SCTP_DEFAULT_VALUES_H_ #define SCTP_DEFAULT_VALUES_H_ diff --git a/openair3/SCTP/sctp_eNB_defs.h b/openair3/SCTP/sctp_eNB_defs.h index 6844b1be31..9d3b4119b5 100644 --- a/openair3/SCTP/sctp_eNB_defs.h +++ b/openair3/SCTP/sctp_eNB_defs.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include "queue.h" #ifndef SCTP_ENB_DEFS_H_ diff --git a/openair3/SCTP/sctp_eNB_itti_messaging.c b/openair3/SCTP/sctp_eNB_itti_messaging.c index 6e26b2c56d..3517c0597b 100644 --- a/openair3/SCTP/sctp_eNB_itti_messaging.c +++ b/openair3/SCTP/sctp_eNB_itti_messaging.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include "intertask_interface.h" #include "sctp_common.h" diff --git a/openair3/SCTP/sctp_eNB_itti_messaging.h b/openair3/SCTP/sctp_eNB_itti_messaging.h index 37af2a9b19..665c5f0e66 100644 --- a/openair3/SCTP/sctp_eNB_itti_messaging.h +++ b/openair3/SCTP/sctp_eNB_itti_messaging.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef SCTP_ITTI_MESSAGING_H_ #define SCTP_ITTI_MESSAGING_H_ diff --git a/openair3/SCTP/sctp_eNB_task.c b/openair3/SCTP/sctp_eNB_task.c index 6812c6bce3..7771cab712 100644 --- a/openair3/SCTP/sctp_eNB_task.c +++ b/openair3/SCTP/sctp_eNB_task.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include diff --git a/openair3/SCTP/sctp_eNB_task.h b/openair3/SCTP/sctp_eNB_task.h index 0953b63826..31cb683102 100644 --- a/openair3/SCTP/sctp_eNB_task.h +++ b/openair3/SCTP/sctp_eNB_task.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef SCTP_ENB_TASK_H_ #define SCTP_ENB_TASK_H_ diff --git a/openair3/SCTP/sctp_primitives_client.c b/openair3/SCTP/sctp_primitives_client.c index 762629d405..bb71a854e1 100644 --- a/openair3/SCTP/sctp_primitives_client.c +++ b/openair3/SCTP/sctp_primitives_client.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SCTP/sctp_primitives_client.h b/openair3/SCTP/sctp_primitives_client.h index 89cf9f1db2..bec4d3ed95 100644 --- a/openair3/SCTP/sctp_primitives_client.h +++ b/openair3/SCTP/sctp_primitives_client.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include diff --git a/openair3/SECU/COPYING b/openair3/SECU/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/SECU/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/SECU/kdf.c b/openair3/SECU/kdf.c index 13bd680ccb..1073df8ebe 100644 --- a/openair3/SECU/kdf.c +++ b/openair3/SECU/kdf.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include @@ -70,3 +63,43 @@ int derive_keNB(const uint8_t kasme[32], const uint32_t nas_count, uint8_t *keNB } #endif +int derive_keNB_star( + const uint8_t *kenb_32, + const uint16_t pci, + const uint32_t earfcn_dl, + const bool is_rel8_only, + uint8_t *kenb_star) +{ + // see 33.401 section A.5 KeNB* derivation function + uint8_t s[10] = {0}; + + // FC = 0x13 + s[0] = FC_KENB_STAR; + // P0 = PCI (target physical cell id) + s[1] = (pci & 0x0000ff00) >> 8; + s[2] = (pci & 0x000000ff); + // L0 = length of PCI (i.e. 0x00 0x02) + s[3] = 0x00; + s[4] = 0x02; + // P1 = EARFCN-DL (target physical cell downlink frequency) + if (is_rel8_only) { + s[5] = (earfcn_dl & 0x0000ff00) >> 8; + s[6] = (earfcn_dl & 0x000000ff); + s[7] = 0x00; + s[8] = 0x02; + kdf (kenb_32, 32, s, 9, kenb_star, 32); + } else { + s[5] = (earfcn_dl & 0x00ff0000) >> 16; + s[6] = (earfcn_dl & 0x0000ff00) >> 8; + s[7] = (earfcn_dl & 0x000000ff); + s[8] = 0x00; + s[9] = 0x03; + kdf (kenb_32, 32, s, 10, kenb_star, 32); + } + // L1 length of EARFCN-DL (i.e. L1 = 0x00 0x02 if EARFCN-DL is between 0 and 65535, and L1 = 0x00 0x03 if EARFCN-DL is between 65536 and 262143) + // NOTE: The length of EARFCN-DL cannot be generally set to 3 bytes for backward compatibility reasons: A Rel-8 + // entity (UE or eNB) would always assume an input parameter length of 2 bytes for the EARFCN-DL. This + // would lead to different derived keys if another entity assumed an input parameter length of 3 bytes for the + // EARFCN-DL. + return 0; +} diff --git a/openair3/SECU/key_nas_deriver.c b/openair3/SECU/key_nas_deriver.c index 6653d05ee7..59546be081 100644 --- a/openair3/SECU/key_nas_deriver.c +++ b/openair3/SECU/key_nas_deriver.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/key_nas_encryption.c b/openair3/SECU/key_nas_encryption.c index 70e6ed6895..aa641137ef 100644 --- a/openair3/SECU/key_nas_encryption.c +++ b/openair3/SECU/key_nas_encryption.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include "secu_defs.h" diff --git a/openair3/SECU/nas_stream_eea1.c b/openair3/SECU/nas_stream_eea1.c old mode 100755 new mode 100644 index 142df9e0dc..efe924851f --- a/openair3/SECU/nas_stream_eea1.c +++ b/openair3/SECU/nas_stream_eea1.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/nas_stream_eea2.c b/openair3/SECU/nas_stream_eea2.c index 25ef340f4e..0cd3d91761 100644 --- a/openair3/SECU/nas_stream_eea2.c +++ b/openair3/SECU/nas_stream_eea2.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include @@ -85,8 +78,13 @@ int nas_stream_encrypt_eea2(nas_stream_cipher_t *stream_cipher, uint8_t *out) } #endif +#if NETTLE_VERSION_MAJOR < 3 nettle_aes128.set_encrypt_key(ctx, stream_cipher->key_length, stream_cipher->key); +#else + nettle_aes128.set_encrypt_key(ctx, + stream_cipher->key); +#endif nettle_ctr_crypt(ctx, nettle_aes128.encrypt, nettle_aes128.block_size, m, diff --git a/openair3/SECU/nas_stream_eia1.c b/openair3/SECU/nas_stream_eia1.c old mode 100755 new mode 100644 index a0712754f6..629d40d612 --- a/openair3/SECU/nas_stream_eia1.c +++ b/openair3/SECU/nas_stream_eia1.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/nas_stream_eia2.c b/openair3/SECU/nas_stream_eia2.c index 4841dfc90b..a2ec6a6dd4 100644 --- a/openair3/SECU/nas_stream_eia2.c +++ b/openair3/SECU/nas_stream_eia2.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/rijndael.c b/openair3/SECU/rijndael.c index 747ea0df51..c245af80f1 100644 --- a/openair3/SECU/rijndael.c +++ b/openair3/SECU/rijndael.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include /* Rijndael S-box SR */ diff --git a/openair3/SECU/rijndael.h b/openair3/SECU/rijndael.h index 8014e828ef..f0c090cc3f 100644 --- a/openair3/SECU/rijndael.h +++ b/openair3/SECU/rijndael.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef RIJNDAEL_H_ #define RIJNDAEL_H_ /* Rijndael S-box SR */ diff --git a/openair3/SECU/secu_defs.h b/openair3/SECU/secu_defs.h index 0f27d8d309..8ec05f3daf 100644 --- a/openair3/SECU/secu_defs.h +++ b/openair3/SECU/secu_defs.h @@ -1,35 +1,29 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #ifndef SECU_DEFS_H_ #define SECU_DEFS_H_ #include "security_types.h" +#include #define EIA0_ALG_ID 0x00 #define EIA1_128_ALG_ID 0x01 @@ -51,6 +45,9 @@ void kdf(const uint8_t *key, int derive_keNB(const uint8_t kasme[32], const uint32_t nas_count, uint8_t *keNB); +int derive_keNB_star(const uint8_t *kenb_32, const uint16_t pci, const uint32_t earfcn_dl, + const bool is_rel8_only, uint8_t * kenb_star); + int derive_key_nas(algorithm_type_dist_t nas_alg_type, uint8_t nas_enc_alg_id, const uint8_t kasme[32], uint8_t *knas); diff --git a/openair3/SECU/snow3g.c b/openair3/SECU/snow3g.c index 78184af9c1..faab013541 100644 --- a/openair3/SECU/snow3g.c +++ b/openair3/SECU/snow3g.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/SECU/snow3g.h b/openair3/SECU/snow3g.h index d278db2dcf..fcad5e9f8d 100644 --- a/openair3/SECU/snow3g.h +++ b/openair3/SECU/snow3g.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file snow3g.h * \brief * \author Open source Adapted from Specification of the 3GPP Confidentiality and diff --git a/openair3/TEST/COPYING b/openair3/TEST/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/TEST/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/TEST/EPC_TEST/generate_scenario.c b/openair3/TEST/EPC_TEST/generate_scenario.c index 69e707dcf9..b8d9d9c588 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.c +++ b/openair3/TEST/EPC_TEST/generate_scenario.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* generate_scenario.c diff --git a/openair3/TEST/EPC_TEST/generate_scenario.h b/openair3/TEST/EPC_TEST/generate_scenario.h index 88c0d28e17..09fa5318ef 100644 --- a/openair3/TEST/EPC_TEST/generate_scenario.h +++ b/openair3/TEST/EPC_TEST/generate_scenario.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* generate_scenario.h diff --git a/openair3/TEST/EPC_TEST/play_scenario.c b/openair3/TEST/EPC_TEST/play_scenario.c index b2207d39d7..edb4323d5f 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.c +++ b/openair3/TEST/EPC_TEST/play_scenario.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* play_scenario.c diff --git a/openair3/TEST/EPC_TEST/play_scenario.h b/openair3/TEST/EPC_TEST/play_scenario.h index c1458047bd..f9601fe904 100644 --- a/openair3/TEST/EPC_TEST/play_scenario.h +++ b/openair3/TEST/EPC_TEST/play_scenario.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* play_scenario.h diff --git a/openair3/TEST/EPC_TEST/play_scenario_decode.c b/openair3/TEST/EPC_TEST/play_scenario_decode.c index aba1703eb3..be63a171c5 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_decode.c +++ b/openair3/TEST/EPC_TEST/play_scenario_decode.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* play_scenario_decode.c diff --git a/openair3/TEST/EPC_TEST/play_scenario_display.c b/openair3/TEST/EPC_TEST/play_scenario_display.c index 2a924e952c..e10cbdf9bf 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_display.c +++ b/openair3/TEST/EPC_TEST/play_scenario_display.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* play_scenario_display.c diff --git a/openair3/TEST/EPC_TEST/play_scenario_fsm.c b/openair3/TEST/EPC_TEST/play_scenario_fsm.c index f5b142d2fd..1589b83cae 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_fsm.c +++ b/openair3/TEST/EPC_TEST/play_scenario_fsm.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* play_scenario_fsm.c diff --git a/openair3/TEST/EPC_TEST/play_scenario_parse.c b/openair3/TEST/EPC_TEST/play_scenario_parse.c index e4f7b48c51..040db30398 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_parse.c +++ b/openair3/TEST/EPC_TEST/play_scenario_parse.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* play_scenario_parse.c diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c index 64071981fb..f10126d5b5 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* play_scenario_s1ap.c diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c index 5d43b211ee..08f79ef206 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_compare_ie.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* play_scenario_s1ap_compare_ie.c diff --git a/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h b/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h index ac77b88b24..532e14bb1d 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h +++ b/openair3/TEST/EPC_TEST/play_scenario_s1ap_eNB_defs.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include diff --git a/openair3/TEST/EPC_TEST/play_scenario_sctp.c b/openair3/TEST/EPC_TEST/play_scenario_sctp.c index 5d5489089b..8a9bc491c8 100644 --- a/openair3/TEST/EPC_TEST/play_scenario_sctp.c +++ b/openair3/TEST/EPC_TEST/play_scenario_sctp.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* play_scenario_sctp.c diff --git a/openair3/TEST/Makefile.am b/openair3/TEST/Makefile.am index 7bc55fe600..211c7e62f2 100644 --- a/openair3/TEST/Makefile.am +++ b/openair3/TEST/Makefile.am @@ -1,31 +1,24 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# -################################################################################ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ + AM_CFLAGS = @ADD_CFLAGS@ \ @CHECK_CFLAGS@ \ -I$(top_srcdir)/COMMON \ diff --git a/openair3/TEST/oaisim_mme_client_test.c b/openair3/TEST/oaisim_mme_client_test.c index b2eea62424..0e89511865 100644 --- a/openair3/TEST/oaisim_mme_client_test.c +++ b/openair3/TEST/oaisim_mme_client_test.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_itti_test.c b/openair3/TEST/oaisim_mme_itti_test.c index 06fb3e191c..243023e610 100644 --- a/openair3/TEST/oaisim_mme_itti_test.c +++ b/openair3/TEST/oaisim_mme_itti_test.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_list_benchmark.c b/openair3/TEST/oaisim_mme_list_benchmark.c index 8aaf8d1ddd..bfd9274b8a 100644 --- a/openair3/TEST/oaisim_mme_list_benchmark.c +++ b/openair3/TEST/oaisim_mme_list_benchmark.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_s1ap_test.c b/openair3/TEST/oaisim_mme_s1ap_test.c index af3585ded0..1f7c1d3bbf 100644 --- a/openair3/TEST/oaisim_mme_s1ap_test.c +++ b/openair3/TEST/oaisim_mme_s1ap_test.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_sctp_test.c b/openair3/TEST/oaisim_mme_sctp_test.c index 4c433c8bf3..d810f9ee8f 100644 --- a/openair3/TEST/oaisim_mme_sctp_test.c +++ b/openair3/TEST/oaisim_mme_sctp_test.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c.c b/openair3/TEST/oaisim_mme_test_s1c.c index d7af00086b..1f130af0d3 100644 --- a/openair3/TEST/oaisim_mme_test_s1c.c +++ b/openair3/TEST/oaisim_mme_test_s1c.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #define _GNU_SOURCE #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c.h b/openair3/TEST/oaisim_mme_test_s1c.h index 0927ab6ad6..91e4472caf 100644 --- a/openair3/TEST/oaisim_mme_test_s1c.h +++ b/openair3/TEST/oaisim_mme_test_s1c.h @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ typedef struct s1c_test_s { int scenario_index; diff --git a/openair3/TEST/oaisim_mme_test_s1c_s1ap.c b/openair3/TEST/oaisim_mme_test_s1c_s1ap.c old mode 100755 new mode 100644 index 836a54b42f..993fad2f89 --- a/openair3/TEST/oaisim_mme_test_s1c_s1ap.c +++ b/openair3/TEST/oaisim_mme_test_s1c_s1ap.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #define _GNU_SOURCE #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_s1ap.h b/openair3/TEST/oaisim_mme_test_s1c_s1ap.h old mode 100755 new mode 100644 index a4570b97bc..3633f11e86 --- a/openair3/TEST/oaisim_mme_test_s1c_s1ap.h +++ b/openair3/TEST/oaisim_mme_test_s1c_s1ap.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #define _GNU_SOURCE #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario.c b/openair3/TEST/oaisim_mme_test_s1c_scenario.c old mode 100755 new mode 100644 index 1cf9208870..60d74866c8 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario.c +++ b/openair3/TEST/oaisim_mme_test_s1c_scenario.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #include #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario.h b/openair3/TEST/oaisim_mme_test_s1c_scenario.h index 6187f02d7f..8c33f45741 100644 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario.h +++ b/openair3/TEST/oaisim_mme_test_s1c_scenario.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #include #include diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario1.c b/openair3/TEST/oaisim_mme_test_s1c_scenario1.c index 3fc1fbad7b..87a63b876a 100644 --- a/openair3/TEST/oaisim_mme_test_s1c_scenario1.c +++ b/openair3/TEST/oaisim_mme_test_s1c_scenario1.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ #include #include "oaisim_mme_test_s1c_scenario.h" diff --git a/openair3/TEST/test_aes128_cmac_encrypt.c b/openair3/TEST/test_aes128_cmac_encrypt.c index 22eb244579..666271d4e0 100644 --- a/openair3/TEST/test_aes128_cmac_encrypt.c +++ b/openair3/TEST/test_aes128_cmac_encrypt.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_aes128_ctr_decrypt.c b/openair3/TEST/test_aes128_ctr_decrypt.c index f3740b48ff..928853c9ba 100644 --- a/openair3/TEST/test_aes128_ctr_decrypt.c +++ b/openair3/TEST/test_aes128_ctr_decrypt.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include @@ -48,7 +41,12 @@ void test_uncipher_ctr(const struct nettle_cipher *cipher, const uint8_t *key, uint8_t *data = malloc(length); uint8_t *ctr = malloc(cipher->block_size); - cipher->set_encrypt_key(ctx, key_length, key); +#if NETTLE_VERSION_MAJOR < 3 + cipher->set_encrypt_key(ctx, key_length, key); +#else + cipher->set_encrypt_key(ctx, key); +#endif + memcpy(ctr, ictr, cipher->block_size); ctr_crypt(ctx, cipher->encrypt, diff --git a/openair3/TEST/test_aes128_ctr_encrypt.c b/openair3/TEST/test_aes128_ctr_encrypt.c index a089ac549d..071aa603a9 100644 --- a/openair3/TEST/test_aes128_ctr_encrypt.c +++ b/openair3/TEST/test_aes128_ctr_encrypt.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include @@ -47,7 +40,12 @@ static void test_cipher_ctr(const struct nettle_cipher *cipher, const uint8_t *k uint8_t *data = malloc(length); uint8_t *ctr = malloc(cipher->block_size); +#if NETTLE_VERSION_MAJOR < 3 cipher->set_encrypt_key(ctx, key_length, key); +#else + cipher->set_encrypt_key(ctx, key); +#endif + memcpy(ctr, ictr, cipher->block_size); ctr_crypt(ctx, cipher->encrypt, diff --git a/openair3/TEST/test_kdf.c b/openair3/TEST/test_kdf.c index 121efcb953..50a2ad347a 100644 --- a/openair3/TEST/test_kdf.c +++ b/openair3/TEST/test_kdf.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_s1ap.c b/openair3/TEST/test_s1ap.c index e070e7018d..a366796f77 100644 --- a/openair3/TEST/test_s1ap.c +++ b/openair3/TEST/test_s1ap.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include diff --git a/openair3/TEST/test_secu.c b/openair3/TEST/test_secu.c index ac3788eebd..244999e9be 100644 --- a/openair3/TEST/test_secu.c +++ b/openair3/TEST/test_secu.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_kenb.c b/openair3/TEST/test_secu_kenb.c index 967e457229..9323062a1d 100644 --- a/openair3/TEST/test_secu_kenb.c +++ b/openair3/TEST/test_secu_kenb.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas.c b/openair3/TEST/test_secu_knas.c index 9b9cdc415a..bc48eaaad1 100644 --- a/openair3/TEST/test_secu_knas.c +++ b/openair3/TEST/test_secu_knas.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eea1.c b/openair3/TEST/test_secu_knas_encrypt_eea1.c old mode 100755 new mode 100644 index 83a4077d89..aa1b57a6ba --- a/openair3/TEST/test_secu_knas_encrypt_eea1.c +++ b/openair3/TEST/test_secu_knas_encrypt_eea1.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eea2.c b/openair3/TEST/test_secu_knas_encrypt_eea2.c index d0ff01c1e6..78a2b6fecc 100644 --- a/openair3/TEST/test_secu_knas_encrypt_eea2.c +++ b/openair3/TEST/test_secu_knas_encrypt_eea2.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eia1.c b/openair3/TEST/test_secu_knas_encrypt_eia1.c old mode 100755 new mode 100644 index 9a53079098..b28d4f9888 --- a/openair3/TEST/test_secu_knas_encrypt_eia1.c +++ b/openair3/TEST/test_secu_knas_encrypt_eia1.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas_encrypt_eia2.c b/openair3/TEST/test_secu_knas_encrypt_eia2.c index f85ddc0fea..9a9b7e102e 100644 --- a/openair3/TEST/test_secu_knas_encrypt_eia2.c +++ b/openair3/TEST/test_secu_knas_encrypt_eia2.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_secu_knas_stream_int.c b/openair3/TEST/test_secu_knas_stream_int.c index 731af2df8a..2fdf5fc791 100644 --- a/openair3/TEST/test_secu_knas_stream_int.c +++ b/openair3/TEST/test_secu_knas_stream_int.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ #include #include #include diff --git a/openair3/TEST/test_util.c b/openair3/TEST/test_util.c deleted file mode 100644 index 87fd2428f0..0000000000 --- a/openair3/TEST/test_util.c +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright (C) 2004-2012 Free Software Foundation, Inc. - * - * Author: Simon Josefsson - * - * This file is part of GnuTLS. - * - * GnuTLS 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 3 of the License, or - * (at your option) any later version. - * - * GnuTLS 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 GnuTLS; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include - -#include "test_util.h" - -int debug = 0; -int error_count = 0; -int break_on_error = 0; - -/* -1 means invalid */ -static const signed char hex_digits[0x100] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -}; - -void -fail (const char *format, ...) -{ - char str[1024]; - va_list arg_ptr; - - va_start (arg_ptr, format); - vsnprintf ( str, sizeof(str), format, arg_ptr); - va_end (arg_ptr); - fputs(str, stderr); - error_count++; - - if (break_on_error) - exit (1); -} - -void -success (const char *format, ...) -{ - char str[1024]; - va_list arg_ptr; - - va_start (arg_ptr, format); - vsnprintf ( str, sizeof(str), format, arg_ptr); - va_end (arg_ptr); - fputs(str, stderr); -} - -void -escapeprint (const char *str, size_t len) -{ - size_t i; - - printf (" (length %d bytes):\n\t", (int) len); - - for (i = 0; i < len; i++) { - if (((str[i] & 0xFF) >= 'A' && (str[i] & 0xFF) <= 'Z') || - ((str[i] & 0xFF) >= 'a' && (str[i] & 0xFF) <= 'z') || - ((str[i] & 0xFF) >= '0' && (str[i] & 0xFF) <= '9') - || (str[i] & 0xFF) == ' ' || (str[i] & 0xFF) == '.') - printf ("%c", (str[i] & 0xFF)); - else - printf ("\\x%02X", (str[i] & 0xFF)); - - if ((i + 1) % 16 == 0 && (i + 1) < len) - printf ("'\n\t'"); - } - - printf ("\n"); -} - -void -hexprint (const void *_str, size_t len) -{ - size_t i; - const char* str = _str; - - printf ("\t;; "); - - for (i = 0; i < len; i++) { - printf ("%02x ", (str[i] & 0xFF)); - - if ((i + 1) % 8 == 0) - printf (" "); - - if ((i + 1) % 16 == 0 && i + 1 < len) - printf ("\n\t;; "); - } - - printf ("\n"); -} - -void -binprint (const void *_str, size_t len) -{ - size_t i; - const char* str = _str; - - printf ("\t;; "); - - for (i = 0; i < len; i++) { - printf ("%d%d%d%d%d%d%d%d ", - (str[i] & 0xFF) & 0x80 ? 1 : 0, - (str[i] & 0xFF) & 0x40 ? 1 : 0, - (str[i] & 0xFF) & 0x20 ? 1 : 0, - (str[i] & 0xFF) & 0x10 ? 1 : 0, - (str[i] & 0xFF) & 0x08 ? 1 : 0, - (str[i] & 0xFF) & 0x04 ? 1 : 0, - (str[i] & 0xFF) & 0x02 ? 1 : 0, (str[i] & 0xFF) & 0x01 ? 1 : 0); - - if ((i + 1) % 3 == 0) - printf (" "); - - if ((i + 1) % 6 == 0 && i + 1 < len) - printf ("\n\t;; "); - } - - printf ("\n"); -} - -int -compare_buffer(const uint8_t *buffer, const uint32_t length_buffer, - const uint8_t *pattern, const uint32_t length_pattern) -{ - int i; - - if (length_buffer != length_pattern) { - printf("Length mismatch, expecting %d bytes, got %d bytes\n", length_pattern, - length_buffer); - hexprint(buffer, length_buffer); - return -1; - } - - for (i = 0; i < length_buffer; i++) { - if (pattern[i] != buffer[i]) { - printf("Expecting:\n"); - hexprint(pattern, length_pattern); - printf("Received:\n"); - hexprint(buffer, length_buffer); - printf("Mismatch fount in byte %d\nExpecting 0x%02x, got 0x%02x\n", - i, pattern[i], buffer[i]); - return -1; - } - } - - return 0; -} - -unsigned -decode_hex_length(const char *h) -{ - const unsigned char *hex = (const unsigned char *) h; - unsigned count; - unsigned i; - - for (count = i = 0; hex[i]; i++) { - if (isspace(hex[i])) - continue; - - if (hex_digits[hex[i]] < 0) - abort(); - - count++; - } - - if (count % 2) - abort(); - - return count / 2; -} - -int -decode_hex(uint8_t *dst, const char *h) -{ - const unsigned char *hex = (const unsigned char *) h; - unsigned i = 0; - - for (;;) { - int high, low; - - while (*hex && isspace(*hex)) - hex++; - - if (!*hex) - return 1; - - high = hex_digits[*hex++]; - - if (high < 0) - return 0; - - while (*hex && isspace(*hex)) - hex++; - - if (!*hex) - return 0; - - low = hex_digits[*hex++]; - - if (low < 0) - return 0; - - dst[i++] = (high << 4) | low; - } -} - -uint8_t * -decode_hex_dup(const char *hex) -{ - uint8_t *p; - unsigned length = decode_hex_length(hex); - - p = malloc(length * sizeof(uint8_t)); - - if (decode_hex(p, hex)) - return p; - else { - free(p); - return NULL; - } -} - -int -main (int argc, char *argv[]) -{ - do - if (strcmp (argv[argc - 1], "-v") == 0 || - strcmp (argv[argc - 1], "--verbose") == 0) - debug = 1; - else if (strcmp (argv[argc - 1], "-b") == 0 || - strcmp (argv[argc - 1], "--break-on-error") == 0) - break_on_error = 1; - else if (strcmp (argv[argc - 1], "-h") == 0 || - strcmp (argv[argc - 1], "-?") == 0 || - strcmp (argv[argc - 1], "--help") == 0) { - printf ("Usage: %s [-vbh?] [--verbose] [--break-on-error] [--help]\n", - argv[0]); - return 1; - } - - while (argc-- > 1); - - doit (); - - if (debug || error_count > 0) - printf ("Self test `%s' finished with %d errors\n", argv[0], error_count); - - return error_count ? 1 : 0; -} diff --git a/openair3/TEST/test_util.h b/openair3/TEST/test_util.h deleted file mode 100644 index 541f41e1e0..0000000000 --- a/openair3/TEST/test_util.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2004-2012 Free Software Foundation, Inc. - * - * Author: Simon Josefsson - * - * This file is part of GnuTLS. - * - * GnuTLS 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 3 of the License, or - * (at your option) any later version. - * - * GnuTLS 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 GnuTLS; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifndef TEST_UTIL_H -#define TEST_UTIL_H - -#include -#include - -#ifndef __attribute__ -#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) -#define __attribute__(Spec) /* empty */ -#endif -#endif - -extern int debug; -extern int error_count; -extern int break_on_error; - -extern void fail (const char *format, ...) -__attribute__ ((format (printf, 1, 2))); -extern void success (const char *format, ...) -__attribute__ ((format (printf, 1, 2))); - -extern void escapeprint (const char *str, size_t len); -extern void hexprint (const void *str, size_t len); -extern void binprint (const void *str, size_t len); - -extern uint8_t * decode_hex_dup(const char *hex); -extern int decode_hex(uint8_t *dst, const char *h); -extern unsigned decode_hex_length(const char *h); - -#define H(x) decode_hex_dup(x) -#define HL(x) decode_hex_dup(x), decode_hex_length(x) - -extern int -compare_buffer(const uint8_t *buffer, const uint32_t length_buffer, - const uint8_t *pattern, const uint32_t length_pattern); - -/* This must be implemented elsewhere. */ -extern void doit (void); - -#endif /* TEST_UTIL_H_ */ diff --git a/openair3/UDP/COPYING b/openair3/UDP/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/openair3/UDP/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/openair3/UDP/udp_eNB_task.c b/openair3/UDP/udp_eNB_task.c index d2a73d9b95..868d86ad9c 100644 --- a/openair3/UDP/udp_eNB_task.c +++ b/openair3/UDP/udp_eNB_task.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file udp_eNB_task.c * \brief * \author Sebastien ROUX, Lionel Gauthier @@ -106,7 +99,7 @@ void udp_eNB_receiver(struct udp_socket_desc_s *udp_sock_pP); void *udp_eNB_task(void *args_p); -int udp_enb_init(const Enb_properties_t *enb_config_p); +int udp_enb_init(void); /* @brief Retrieve the descriptor associated with the task_id */ static @@ -302,7 +295,7 @@ void *udp_eNB_task(void *args_p) MessageDef *received_message_p = NULL; //const char *msg_name = NULL; //instance_t instance = 0; - udp_enb_init(NULL); + udp_enb_init(); itti_mark_task_ready(TASK_UDP); MSC_START_USE(); @@ -386,7 +379,7 @@ void *udp_eNB_task(void *args_p) sizeof(struct sockaddr_in)); if (bytes_written != udp_data_req_p->buffer_length) { - LOG_E(UDP_, "There was an error while writing to socket %u rc %d" + LOG_E(UDP_, "There was an error while writing to socket %d rc %zd" "(%d:%s) May be normal if GTPU kernel module loaded on same host (may NF_DROP IP packet)\n", udp_sd, bytes_written, errno, strerror(errno)); } @@ -434,7 +427,7 @@ on_error: return NULL; } -int udp_enb_init(const Enb_properties_t *enb_config_p) +int udp_enb_init(void) { LOG_I(UDP_, "Initializing UDP task interface\n"); STAILQ_INIT(&udp_socket_list); diff --git a/openair3/UDP/udp_eNB_task.h b/openair3/UDP/udp_eNB_task.h index 37ff413bf7..6585162125 100644 --- a/openair3/UDP/udp_eNB_task.h +++ b/openair3/UDP/udp_eNB_task.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ /*! \file udp_eNB_task.h * \brief * \author Sebastien ROUX, Lionel Gauthier @@ -100,6 +93,6 @@ void *udp_eNB_task(void *args_p); * \param enb_config_p configuration of eNB * @returns always 0 */ -int udp_enb_init(const Enb_properties_t *enb_config_p); +int udp_enb_init(void); #endif /* UDP_ENB_TASK_H_ */ diff --git a/openair3/UTILS/COPYING b/openair3/UTILS/COPYING deleted file mode 100644 index c888423064..0000000000 --- a/openair3/UTILS/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ \ No newline at end of file diff --git a/openair3/UTILS/HASHTABLE/COPYING b/openair3/UTILS/HASHTABLE/COPYING deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openair3/UTILS/HASHTABLE/Makefile.am b/openair3/UTILS/HASHTABLE/Makefile.am deleted file mode 100755 index d6bdbbc3c8..0000000000 --- a/openair3/UTILS/HASHTABLE/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ - -AM_CFLAGS = @ADD_CFLAGS@ \ - -I$(top_srcdir)/COMMON - -noinst_LTLIBRARIES = libhashtable.la -libhashtable_la_LDFLAGS = -all-static -libhashtable_la_SOURCES = \ - hashtable.c hashtable.h \ - obj_hashtable.c obj_hashtable.h - \ No newline at end of file diff --git a/openair3/UTILS/HASHTABLE/Makefile.eNB b/openair3/UTILS/HASHTABLE/Makefile.eNB deleted file mode 100755 index 2cde7da837..0000000000 --- a/openair3/UTILS/HASHTABLE/Makefile.eNB +++ /dev/null @@ -1,35 +0,0 @@ - -all: libhashtable.a - -libhashtable_OBJECTS = \ - hashtable.o \ - obj_hashtable.o \ - - -CFLAGS = \ - -DUSER_MODE \ - -DENABLE_USE_MME \ - -g \ - -O2 \ - -Wall \ - -Werror=implicit-function-declaration - --include .deps/*.d - -$(libhashtable_OBJECTS): %.o : %.c - $(CC) -c $(CFLAGS) -o $@ $< - @if ! test -d ".deps" ; then mkdir -p .deps/; fi - @$(CC) -MM $(CFLAGS) $*.c > .deps/$*.d - @mv -f .deps/$*.d .deps/$*.d.tmp - @sed -e 's|.*:|$*.o:|' < .deps/$*.d.tmp > .deps/$*.d - @sed -e 's/.*://' -e 's/\\$$//' < .deps/$*.d.tmp | fmt -1 | \ - sed -e 's/^ *//' -e 's/$$/:/' >> .deps/$*.d - @rm -f .deps/$*.d.tmp - -libhashtable.a: $(libhashtable_OBJECTS) - $(AR) rcvs $@ $(libhashtable_OBJECTS) - -clean: - rm -f libhashtable.a - rm -rf .deps/ - rm -f $(libhashtable_OBJECTS) \ No newline at end of file diff --git a/openair3/UTILS/HASHTABLE/hashtable.c b/openair3/UTILS/HASHTABLE/hashtable.c deleted file mode 100755 index a557211b23..0000000000 --- a/openair3/UTILS/HASHTABLE/hashtable.c +++ /dev/null @@ -1,360 +0,0 @@ -/* from: http://en.literateprograms.org/Hash_table_%28C%29#chunk%20def:node - * Original licence Creative Commons CC0 1.0 Waiver. - */ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ -#include -#include -#include -#include "hashtable.h" - - -//------------------------------------------------------------------------------------------------------------------------------- -char* hashtable_rc_code2string(hashtable_rc_t rcP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - switch (rcP) { - case HASH_TABLE_OK: - return "HASH_TABLE_OK"; - break; - - case HASH_TABLE_INSERT_OVERWRITTEN_DATA: - return "HASH_TABLE_INSERT_OVERWRITTEN_DATA"; - break; - - case HASH_TABLE_KEY_NOT_EXISTS: - return "HASH_TABLE_KEY_NOT_EXISTS"; - break; - - case HASH_TABLE_KEY_ALREADY_EXISTS: - return "HASH_TABLE_KEY_ALREADY_EXISTS"; - break; - - case HASH_TABLE_BAD_PARAMETER_HASHTABLE: - return "HASH_TABLE_BAD_PARAMETER_HASHTABLE"; - break; - - default: - return "UNKNOWN hashtable_rc_t"; - } -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * free int function - * hash_free_int_func() is used when this hashtable is used to store int values as data (pointer = value). - */ - -void hash_free_int_func(void* memoryP) {} - -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Default hash function - * def_hashfunc() is the default used by hashtable_create() when the user didn't specify one. - * This is a simple/naive hash function which adds the key's ASCII char values. It will probably generate lots of collisions on large hash tables. - */ - -static hash_size_t def_hashfunc(const uint64_t keyP) -{ - return (hash_size_t)keyP; -} - -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Initialisation - * hashtable_create() sets up the initial structure of the hash table. The user specified size will be allocated and initialized to NULL. - * The user can also specify a hash function. If the hashfunc argument is NULL, a default hash function is used. - * If an error occurred, NULL is returned. All other values in the returned hash_table_t pointer should be released with hashtable_destroy(). - */ -hash_table_t *hashtable_create(hash_size_t sizeP, hash_size_t (*hashfuncP)(const uint64_t ), void (*freefuncP)(void*)) -{ - hash_table_t *hashtbl; - - if(!(hashtbl=malloc(sizeof(hash_table_t)))) return NULL; - - if(!(hashtbl->nodes=calloc(sizeP, sizeof(hash_node_t*)))) { - free(hashtbl); - return NULL; - } - - hashtbl->size=sizeP; - - if(hashfuncP) hashtbl->hashfunc=hashfuncP; - else hashtbl->hashfunc=def_hashfunc; - - if(freefuncP) hashtbl->freefunc=freefuncP; - else hashtbl->freefunc=free; - - return hashtbl; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Cleanup - * The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the hash_table_t. - */ -hashtable_rc_t hashtable_destroy(hash_table_t *hashtblP) -{ - hash_size_t n; - hash_node_t *node, *oldnode; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - for(n=0; nsize; ++n) { - node=hashtblP->nodes[n]; - - while(node) { - oldnode=node; - node=node->next; - - if (oldnode->data) { - hashtblP->freefunc(oldnode->data); - } - - free(oldnode); - } - } - - free(hashtblP->nodes); - free(hashtblP); - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -hashtable_rc_t hashtable_is_key_exists (hash_table_t *hashtblP, const uint64_t keyP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - return HASH_TABLE_OK; - } - - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -hashtable_rc_t hashtable_apply_funct_on_elements (hash_table_t *hashtblP, void functP(uint64_t keyP, void* dataP, void* parameterP), void* parameterP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - hash_node_t *node = NULL; - unsigned int i = 0; - unsigned int num_elements = 0; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - while ((num_elements < hashtblP->num_elements) && (i < hashtblP->size)) { - if (hashtblP->nodes[i] != NULL) { - node=hashtblP->nodes[i]; - - while(node) { - num_elements += 1; - functP(node->key, node->data, parameterP); - node=node->next; - } - } - - i += 1; - } - - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Adding a new element - * To make sure the hash value is not bigger than size, the result of the user provided hash function is used modulo size. - */ -hashtable_rc_t hashtable_insert(hash_table_t *hashtblP, const uint64_t keyP, void *dataP) -{ - hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - if (node->data) { - hashtblP->freefunc(node->data); - } - - node->data=dataP; - return HASH_TABLE_INSERT_OVERWRITTEN_DATA; - } - - node=node->next; - } - - if(!(node=malloc(sizeof(hash_node_t)))) return -1; - - node->key=keyP; - node->data=dataP; - - if (hashtblP->nodes[hash]) { - node->next=hashtblP->nodes[hash]; - } else { - node->next = NULL; - } - - hashtblP->nodes[hash]=node; - hashtblP->num_elements += 1; - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * To remove an element from the hash table, we just search for it in the linked list for that hash value, - * and remove it if it is found. If it was not found, it is an error and -1 is returned. - */ -hashtable_rc_t hashtable_remove(hash_table_t *hashtblP, const uint64_t keyP) -{ - hash_node_t *node, *prevnode=NULL; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - if(prevnode) prevnode->next=node->next; - else hashtblP->nodes[hash]=node->next; - - if (node->data) { - hashtblP->freefunc(node->data); - } - - free(node); - hashtblP->num_elements -= 1; - return HASH_TABLE_OK; - } - - prevnode=node; - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Searching for an element is easy. We just search through the linked list for the corresponding hash value. - * NULL is returned if we didn't find it. - */ -hashtable_rc_t hashtable_get(hash_table_t *hashtblP, const uint64_t keyP, void** dataP) -{ - hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - *dataP = NULL; - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP)%hashtblP->size; - /* fprintf(stderr, "hashtable_get() key=%s, hash=%d\n", key, hash);*/ - - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - *dataP = node->data; - return HASH_TABLE_OK; - } - - node=node->next; - } - - *dataP = NULL; - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Resizing - * The number of elements in a hash table is not always known when creating the table. - * If the number of elements grows too large, it will seriously reduce the performance of most hash table operations. - * If the number of elements are reduced, the hash table will waste memory. That is why we provide a function for resizing the table. - * Resizing a hash table is not as easy as a realloc(). All hash values must be recalculated and each element must be inserted into its new position. - * We create a temporary hash_table_t object (newtbl) to be used while building the new hashes. - * This allows us to reuse hashtable_insert() and hashtable_remove(), when moving the elements to the new table. - * After that, we can just free the old table and copy the elements from newtbl to hashtbl. - */ - -hashtable_rc_t hashtable_resize(hash_table_t *hashtblP, hash_size_t sizeP) -{ - hash_table_t newtbl; - hash_size_t n; - hash_node_t *node,*next; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - newtbl.size = sizeP; - newtbl.hashfunc = hashtblP->hashfunc; - - if(!(newtbl.nodes=calloc(sizeP, sizeof(hash_node_t*)))) return -1; - - for(n=0; nsize; ++n) { - for(node=hashtblP->nodes[n]; node; node=next) { - next = node->next; - hashtable_insert(&newtbl, node->key, node->data); - // Lionel GAUTHIER: BAD CODE TO BE REWRITTEN - hashtable_remove(hashtblP, node->key); - - } - } - - free(hashtblP->nodes); - hashtblP->size=newtbl.size; - hashtblP->nodes=newtbl.nodes; - - return HASH_TABLE_OK; -} - - - diff --git a/openair3/UTILS/HASHTABLE/hashtable.h b/openair3/UTILS/HASHTABLE/hashtable.h deleted file mode 100755 index 051a2929b0..0000000000 --- a/openair3/UTILS/HASHTABLE/hashtable.h +++ /dev/null @@ -1,79 +0,0 @@ -/* from: http://en.literateprograms.org/Hash_table_%28C%29#chunk%20def:node - * Original licence Creative Commons CC0 1.0 Waiver.(http://creativecommons.org/publicdomain/zero/1.0/) - */ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ -#ifndef _UTILS_COLLECTION_HASH_TABLE_H_ -#define _UTILS_COLLECTION_HASH_TABLE_H_ -#include -#include -#include - -typedef size_t hash_size_t; - -typedef enum hashtable_return_code_e { - HASH_TABLE_OK = 0, - HASH_TABLE_INSERT_OVERWRITTEN_DATA = 1, - HASH_TABLE_KEY_NOT_EXISTS = 2, - HASH_TABLE_KEY_ALREADY_EXISTS = 3, - HASH_TABLE_BAD_PARAMETER_HASHTABLE = 4, - HASH_TABLE_SYSTEM_ERROR = 5, - HASH_TABLE_CODE_MAX -} hashtable_rc_t; - - -typedef struct hash_node_s { - uint64_t key; - void *data; - struct hash_node_s *next; -} hash_node_t; - -typedef struct hash_table_s { - hash_size_t size; - hash_size_t num_elements; - struct hash_node_s **nodes; - hash_size_t (*hashfunc)(const uint64_t); - void (*freefunc)(void*); -} hash_table_t; - -char* hashtable_rc_code2string(hashtable_rc_t rcP); -void hash_free_int_func(void* memoryP); -hash_table_t *hashtable_create (hash_size_t size, hash_size_t (*hashfunc)(const uint64_t ), void (*freefunc)(void*)); -hashtable_rc_t hashtable_destroy(hash_table_t *hashtbl); -hashtable_rc_t hashtable_is_key_exists (hash_table_t *hashtbl, const uint64_t key); -hashtable_rc_t hashtable_apply_funct_on_elements (hash_table_t *hashtblP, void funct(uint64_t keyP, void* dataP, void* parameterP), void* parameterP); -hashtable_rc_t hashtable_insert (hash_table_t *hashtbl, const uint64_t key, void *data); -hashtable_rc_t hashtable_remove (hash_table_t *hashtbl, const uint64_t key); -hashtable_rc_t hashtable_get (hash_table_t *hashtbl, const uint64_t key, void **dataP); -hashtable_rc_t hashtable_resize (hash_table_t *hashtbl, hash_size_t size); - - - -#endif - diff --git a/openair3/UTILS/HASHTABLE/obj_hashtable.c b/openair3/UTILS/HASHTABLE/obj_hashtable.c deleted file mode 100755 index 55e86cd8f3..0000000000 --- a/openair3/UTILS/HASHTABLE/obj_hashtable.c +++ /dev/null @@ -1,319 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ -#include -#include -#include -#include "obj_hashtable.h" -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Default hash function - * def_hashfunc() is the default used by hashtable_create() when the user didn't specify one. - * This is a simple/naive hash function which adds the key's ASCII char values. It will probably generate lots of collisions on large hash tables. - */ - -static hash_size_t def_hashfunc(const void *keyP, int key_sizeP) -{ - hash_size_t hash=0; - - while(key_sizeP) hash^=((unsigned char*)keyP)[key_sizeP --]; - - return hash; -} - -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Initialisation - * hashtable_create() sets up the initial structure of the hash table. The user specified size will be allocated and initialized to NULL. - * The user can also specify a hash function. If the hashfunc argument is NULL, a default hash function is used. - * If an error occurred, NULL is returned. All other values in the returned obj_hash_table_t pointer should be released with hashtable_destroy(). - */ -obj_hash_table_t *obj_hashtable_create(hash_size_t sizeP, hash_size_t (*hashfuncP)(const void*, int ), void (*freekeyfuncP)(void*), void (*freedatafuncP)(void*)) -{ - obj_hash_table_t *hashtbl; - - if(!(hashtbl=malloc(sizeof(obj_hash_table_t)))) return NULL; - - if(!(hashtbl->nodes=calloc(sizeP, sizeof(obj_hash_node_t*)))) { - free(hashtbl); - return NULL; - } - - hashtbl->size=sizeP; - - if(hashfuncP) hashtbl->hashfunc=hashfuncP; - else hashtbl->hashfunc=def_hashfunc; - - if(freekeyfuncP) hashtbl->freekeyfunc=freekeyfuncP; - else hashtbl->freekeyfunc=free; - - if(freedatafuncP) hashtbl->freedatafunc=freedatafuncP; - else hashtbl->freedatafunc=free; - - return hashtbl; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Cleanup - * The hashtable_destroy() walks through the linked lists for each possible hash value, and releases the elements. It also releases the nodes array and the obj_hash_table_t. - */ -hashtable_rc_t obj_hashtable_destroy(obj_hash_table_t *hashtblP) -{ - hash_size_t n; - obj_hash_node_t *node, *oldnode; - - for(n=0; nsize; ++n) { - node=hashtblP->nodes[n]; - - while(node) { - oldnode=node; - node=node->next; - hashtblP->freekeyfunc(oldnode->key); - hashtblP->freedatafunc(oldnode->data); - free(oldnode); - } - } - - free(hashtblP->nodes); - free(hashtblP); - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -hashtable_rc_t obj_hashtable_is_key_exists (obj_hash_table_t *hashtblP, void* keyP, int key_sizeP) -//------------------------------------------------------------------------------------------------------------------------------- -{ - obj_hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - return HASH_TABLE_OK; - } else if (node->key_size == key_sizeP) { - if (memcmp(node->key, keyP, key_sizeP) == 0) { - return HASH_TABLE_OK; - } - } - - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Adding a new element - * To make sure the hash value is not bigger than size, the result of the user provided hash function is used modulo size. - */ -hashtable_rc_t obj_hashtable_insert(obj_hash_table_t *hashtblP, void* keyP, int key_sizeP, void *dataP) -{ - obj_hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - if (node->data) { - hashtblP->freedatafunc(node->data); - } - - node->data=dataP; - // waste of memory here (keyP is lost) we should free it now - return HASH_TABLE_INSERT_OVERWRITTEN_DATA; - } - - node=node->next; - } - - if(!(node=malloc(sizeof(obj_hash_node_t)))) return -1; - - node->key=keyP; - node->data=dataP; - - if (hashtblP->nodes[hash]) { - node->next=hashtblP->nodes[hash]; - } else { - node->next = NULL; - } - - hashtblP->nodes[hash]=node; - return HASH_TABLE_OK; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * To remove an element from the hash table, we just search for it in the linked list for that hash value, - * and remove it if it is found. If it was not found, it is an error and -1 is returned. - */ -hashtable_rc_t obj_hashtable_remove(obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP) -{ - obj_hash_node_t *node, *prevnode=NULL; - hash_size_t hash; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if ((node->key == keyP) || ((node->key_size == key_sizeP) && (memcmp(node->key, keyP, key_sizeP) == 0))) { - if(prevnode) { - prevnode->next=node->next; - } else { - hashtblP->nodes[hash]=node->next; - } - - hashtblP->freekeyfunc(node->key); - hashtblP->freedatafunc(node->data); - free(node); - return HASH_TABLE_OK; - } - - prevnode=node; - node=node->next; - } - - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Searching for an element is easy. We just search through the linked list for the corresponding hash value. - * NULL is returned if we didn't find it. - */ -hashtable_rc_t obj_hashtable_get(obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP, void** dataP) -{ - obj_hash_node_t *node; - hash_size_t hash; - - if (hashtblP == NULL) { - *dataP = NULL; - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - hash=hashtblP->hashfunc(keyP, key_sizeP)%hashtblP->size; - node=hashtblP->nodes[hash]; - - while(node) { - if(node->key == keyP) { - *dataP = node->data; - return HASH_TABLE_OK; - } else if (node->key_size == key_sizeP) { - if (memcmp(node->key, keyP, key_sizeP) == 0) { - *dataP = node->data; - return HASH_TABLE_OK; - } - } - - node=node->next; - } - - *dataP = NULL; - return HASH_TABLE_KEY_NOT_EXISTS; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Function to return all keys of an object hash table - */ -hashtable_rc_t obj_hashtable_get_keys(obj_hash_table_t *hashtblP, void ** keysP, unsigned int *sizeP) -{ - size_t n = 0; - obj_hash_node_t *node = NULL; - obj_hash_node_t *next = NULL; - - *sizeP = 0; - keysP = calloc(hashtblP->num_elements, sizeof(void *)); - - if (keysP) { - for(n=0; nsize; ++n) { - for(node=hashtblP->nodes[n]; node; node=next) { - keysP[*sizeP++] = node->key; - next = node->next; - } - } - - return HASH_TABLE_OK; - } - - return HASH_TABLE_SYSTEM_ERROR; -} -//------------------------------------------------------------------------------------------------------------------------------- -/* - * Resizing - * The number of elements in a hash table is not always known when creating the table. - * If the number of elements grows too large, it will seriously reduce the performance of most hash table operations. - * If the number of elements are reduced, the hash table will waste memory. That is why we provide a function for resizing the table. - * Resizing a hash table is not as easy as a realloc(). All hash values must be recalculated and each element must be inserted into its new position. - * We create a temporary obj_hash_table_t object (newtbl) to be used while building the new hashes. - * This allows us to reuse hashtable_insert() and hashtable_remove(), when moving the elements to the new table. - * After that, we can just free the old table and copy the elements from newtbl to hashtbl. - */ -hashtable_rc_t obj_hashtable_resize(obj_hash_table_t *hashtblP, hash_size_t sizeP) -{ - obj_hash_table_t newtbl; - hash_size_t n; - obj_hash_node_t *node,*next; - - if (hashtblP == NULL) { - return HASH_TABLE_BAD_PARAMETER_HASHTABLE; - } - - newtbl.size = sizeP; - newtbl.hashfunc = hashtblP->hashfunc; - - if(!(newtbl.nodes=calloc(sizeP, sizeof(obj_hash_node_t*)))) return HASH_TABLE_SYSTEM_ERROR; - - for(n=0; nsize; ++n) { - for(node=hashtblP->nodes[n]; node; node=next) { - next = node->next; - obj_hashtable_insert(&newtbl, node->key, node->key_size, node->data); - obj_hashtable_remove(hashtblP, node->key, node->key_size); - } - } - - free(hashtblP->nodes); - hashtblP->size=newtbl.size; - hashtblP->nodes=newtbl.nodes; - - return HASH_TABLE_OK; -} - - - diff --git a/openair3/UTILS/HASHTABLE/obj_hashtable.h b/openair3/UTILS/HASHTABLE/obj_hashtable.h deleted file mode 100755 index d74e1e97d4..0000000000 --- a/openair3/UTILS/HASHTABLE/obj_hashtable.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. - */ -#ifndef _OBJ_HASH_TABLE_H_ -#define _OBJ_HASH_TABLE_H_ -#include -#include -#include - -#include "hashtable.h" - -typedef size_t hash_size_t; - - -typedef struct obj_hash_node_s { - int key_size; - void *key; - void *data; - struct obj_hash_node_s *next; -} obj_hash_node_t; - -typedef struct obj_hash_table_s { - hash_size_t size; - hash_size_t num_elements; - struct obj_hash_node_s **nodes; - hash_size_t (*hashfunc)(const void*, int); - void (*freekeyfunc)(void*); - void (*freedatafunc)(void*); -} obj_hash_table_t; - -obj_hash_table_t *obj_hashtable_create (hash_size_t size, hash_size_t (*hashfunc)(const void*, int ), void (*freekeyfunc)(void*), void (*freedatafunc)(void*)); -hashtable_rc_t obj_hashtable_destroy (obj_hash_table_t *hashtblP); -hashtable_rc_t obj_hashtable_is_key_exists (obj_hash_table_t *hashtblP, void* keyP, int key_sizeP); -hashtable_rc_t obj_hashtable_insert (obj_hash_table_t *hashtblP, void* keyP, int key_sizeP, void *dataP); -hashtable_rc_t obj_hashtable_remove (obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP); -hashtable_rc_t obj_hashtable_get (obj_hash_table_t *hashtblP, const void* keyP, int key_sizeP, void ** dataP); -hashtable_rc_t obj_hashtable_get_keys(obj_hash_table_t *hashtblP, void ** keysP, unsigned int *sizeP); -hashtable_rc_t obj_hashtable_resize (obj_hash_table_t *hashtblP, hash_size_t sizeP); - - - -#endif - diff --git a/openair3/UTILS/conversions.c b/openair3/UTILS/conversions.c index f2c324568f..2def84abb0 100644 --- a/openair3/UTILS/conversions.c +++ b/openair3/UTILS/conversions.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/UTILS/conversions.h b/openair3/UTILS/conversions.h index 47912f0d92..00287341b2 100644 --- a/openair3/UTILS/conversions.h +++ b/openair3/UTILS/conversions.h @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #include "assertions.h" diff --git a/openair3/UTILS/enum_string.c b/openair3/UTILS/enum_string.c index cab5b0319e..c2eccc7a9e 100644 --- a/openair3/UTILS/enum_string.c +++ b/openair3/UTILS/enum_string.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include #include diff --git a/openair3/UTILS/enum_string.h b/openair3/UTILS/enum_string.h index c0a921c98e..7b53ab31e3 100644 --- a/openair3/UTILS/enum_string.h +++ b/openair3/UTILS/enum_string.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #ifndef ENUM_STRING_H_ #define ENUM_STRING_H_ diff --git a/openair3/UTILS/log.c b/openair3/UTILS/log.c index 6aebde8280..5ddebd415c 100644 --- a/openair3/UTILS/log.c +++ b/openair3/UTILS/log.c @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #if HAVE_CONFIG_H # include "config.h" #endif diff --git a/openair3/UTILS/log.h b/openair3/UTILS/log.h index 34700522af..7b712df755 100644 --- a/openair3/UTILS/log.h +++ b/openair3/UTILS/log.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include "mme_config.h" #ifndef LOG_H_ diff --git a/openair3/UTILS/mcc_mnc_itu.c b/openair3/UTILS/mcc_mnc_itu.c old mode 100755 new mode 100644 index 8c59b8e53a..6b999c36df --- a/openair3/UTILS/mcc_mnc_itu.c +++ b/openair3/UTILS/mcc_mnc_itu.c @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #include diff --git a/openair3/UTILS/mcc_mnc_itu.h b/openair3/UTILS/mcc_mnc_itu.h old mode 100755 new mode 100644 index b59db73720..a6b7343b99 --- a/openair3/UTILS/mcc_mnc_itu.h +++ b/openair3/UTILS/mcc_mnc_itu.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + /***************************************************************************** Source mcc_mnc.h diff --git a/openair3/UTILS/mme_config.c b/openair3/UTILS/mme_config.c index bc1a408312..d2c25af10a 100644 --- a/openair3/UTILS/mme_config.c +++ b/openair3/UTILS/mme_config.c @@ -1,30 +1,22 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ #if HAVE_CONFIG_H diff --git a/openair3/UTILS/mme_config.h b/openair3/UTILS/mme_config.h index 5301a9c59d..37b7dff865 100644 --- a/openair3/UTILS/mme_config.h +++ b/openair3/UTILS/mme_config.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #include #include diff --git a/openair3/UTILS/mme_default_values.h b/openair3/UTILS/mme_default_values.h index 779e5a4661..6965c7c57c 100644 --- a/openair3/UTILS/mme_default_values.h +++ b/openair3/UTILS/mme_default_values.h @@ -1,31 +1,24 @@ /* - * Copyright (c) 2015, EURECOM (www.eurecom.fr) - * All rights reserved. + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: + * http://www.openairinterface.org/?page_id=698 * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those - * of the authors and should not be interpreted as representing official policies, - * either expressed or implied, of the FreeBSD Project. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org */ + #ifndef MME_DEFAULT_VALUES_H_ #define MME_DEFAULT_VALUES_H_ diff --git a/pre-commit b/pre-commit new file mode 100644 index 0000000000..82587fce34 --- /dev/null +++ b/pre-commit @@ -0,0 +1,31 @@ + +#!/bin/bash +# Installation: +# cp pre-commit .git/hooks +# chmod +x .git/hooks/pre-commit + +OPTIONS="--convert-tabs --indent=spaces=2 --indent-switches --indent-col1-comments --break-blocks --delete-empty-lines --align-pointer=name --keep-one-line-blocks --keep-one-line-statements --lineend=linux" + +RETURN=0 +ASTYLE=$(which astyle) +if [ $? -ne 0 ]; then + echo "[!] astyle not installed. Unable to check source file format policy." >&2 + exit 1 +fi + +FILES=`git diff --cached --name-only --diff-filter=ACMR | grep -E "\.(c|cpp|h)$"` +for FILE in $FILES; do + $ASTYLE $OPTIONS < $FILE | cmp -s $FILE - + if [ $? -ne 0 ]; then + echo "[!] $FILE does not respect the agreed coding style." >&2 + RETURN=1 + fi +done + +if [ $RETURN -eq 1 ]; then + echo "" >&2 + echo "Make sure you have run astyle with the following options:" >&2 + echo $OPTIONS >&2 +fi + +exit $RETURN \ No newline at end of file diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c index 6cc1d8c5d2..5ded228f6b 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** bladerf_lib.c * @@ -90,6 +82,48 @@ openair0_timestamp trx_get_timestamp(openair0_device *device, bladerf_module mod * \returns 0 on success */ int trx_brf_start(openair0_device *device) { + brf_state_t *brf = (brf_state_t*)device->priv; + int status; + + brf->meta_tx.flags = 0; + + if ((status = bladerf_sync_config(brf->dev, + BLADERF_MODULE_TX, + BLADERF_FORMAT_SC16_Q11_META, + brf->num_buffers, + brf->buffer_size, + brf->num_transfers, + 100/*brf->tx_timeout_ms*/)) != 0 ) { + fprintf(stderr,"Failed to configure TX sync interface: %s\n", bladerf_strerror(status)); + abort(); + } + if ((status = bladerf_sync_config(brf->dev, + BLADERF_MODULE_RX, + BLADERF_FORMAT_SC16_Q11_META, + brf->num_buffers, + brf->buffer_size, + brf->num_transfers, + 100/*brf->rx_timeout_ms*/)) != 0 ) { + fprintf(stderr,"Failed to configure RX sync interface: %s\n", bladerf_strerror(status)); + abort(); + } + if ((status=bladerf_enable_module(brf->dev, BLADERF_MODULE_TX, true)) != 0) { + fprintf(stderr,"Failed to enable TX module: %s\n", bladerf_strerror(status)); + abort(); + } + if ((status=bladerf_enable_module(brf->dev, BLADERF_MODULE_RX, true)) != 0) { + fprintf(stderr,"Failed to enable RX module: %s\n", bladerf_strerror(status)); + abort(); + } + + if ((status=bladerf_calibrate_dc(brf->dev, BLADERF_MODULE_TX)) != 0) { + fprintf(stderr,"Failed to calibrate TX DC: %s\n", bladerf_strerror(status)); + abort(); + } + if ((status=bladerf_calibrate_dc(brf->dev, BLADERF_MODULE_RX)) != 0) { + fprintf(stderr,"Failed to calibrate RX DC: %s\n", bladerf_strerror(status)); + abort(); + } return 0; } @@ -141,7 +175,7 @@ static int trx_brf_write(openair0_device *device,openair0_timestamp ptimestamp, brf->tx_count++; - return(0); + return nsamps; //brf->meta_tx.actual_count; } /*! \brief Receive samples from hardware. @@ -163,6 +197,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, // BRF has only one rx/tx chain int16_t *samples = (int16_t*)buff[0]; + brf->meta_rx.actual_count = 0; brf->meta_rx.flags = BLADERF_META_FLAG_RX_NOW; status = bladerf_sync_rx(brf->dev, samples, (unsigned int) nsamps, &brf->meta_rx, 2*brf->rx_timeout_ms); @@ -178,6 +213,10 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, brf->num_overflows,brf->meta_rx.timestamp, brf->meta_rx.actual_count, nsamps); } + if (brf->meta_rx.actual_count != nsamps) { + printf("RX bad samples count, wanted %d, got %d\n", nsamps, brf->meta_rx.actual_count); + } + //printf("Current RX timestampe %u\n", brf->meta_rx.timestamp); //printf("[BRF] (buff %p) ts=0x%"PRIu64" %s\n",samples, brf->meta_rx.timestamp,bladerf_strerror(status)); brf->rx_current_ts=brf->meta_rx.timestamp; @@ -188,7 +227,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, *ptimestamp = brf->meta_rx.timestamp; - return brf->meta_rx.actual_count; + return nsamps; //brf->meta_rx.actual_count; } @@ -196,6 +235,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, * \param device the hardware to use */ void trx_brf_end(openair0_device *device) { +abort(); int status; brf_state_t *brf = (brf_state_t*)device->priv; @@ -233,7 +273,7 @@ int trx_brf_reset_stats(openair0_device* device) { * \param card the hardware to use * \returns 0 in success */ -int trx_brf_stop(int card) { +int trx_brf_stop(openair0_device* device) { return(0); @@ -902,8 +942,8 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { brf_state_t *brf = (brf_state_t*)malloc(sizeof(brf_state_t)); memset(brf, 0, sizeof(brf_state_t)); /* device specific */ - openair0_cfg->txlaunch_wait = 1;//manage when TX processing is triggered - openair0_cfg->txlaunch_wait_slotcount = 1; //manage when TX processing is triggered + //openair0_cfg->txlaunch_wait = 1;//manage when TX processing is triggered + //openair0_cfg->txlaunch_wait_slotcount = 1; //manage when TX processing is triggered openair0_cfg->iq_txshift = 0;// shift openair0_cfg->iq_rxrescale = 15;//rescale iqs @@ -912,22 +952,18 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { case 30720000: openair0_cfg->samples_per_packet = 2048; openair0_cfg->tx_sample_advance = 0; - openair0_cfg->tx_scheduling_advance = 8*openair0_cfg->samples_per_packet; break; case 15360000: openair0_cfg->samples_per_packet = 2048; openair0_cfg->tx_sample_advance = 0; - openair0_cfg->tx_scheduling_advance = 4*openair0_cfg->samples_per_packet; break; case 7680000: openair0_cfg->samples_per_packet = 1024; openair0_cfg->tx_sample_advance = 0; - openair0_cfg->tx_scheduling_advance = 4*openair0_cfg->samples_per_packet; break; case 1920000: openair0_cfg->samples_per_packet = 256; openair0_cfg->tx_sample_advance = 50; - openair0_cfg->tx_scheduling_advance = 8*openair0_cfg->samples_per_packet; break; default: printf("Error: unknown sampling rate %f\n",openair0_cfg->sample_rate); @@ -1093,6 +1129,15 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { // memcpy((void*)&device->openair0_cfg,(void*)&openair0_cfg[0],sizeof(openair0_config_t)); + if ((status=bladerf_enable_module(brf->dev, BLADERF_MODULE_TX, false)) != 0) { + fprintf(stderr,"Failed to enable TX module: %s\n", bladerf_strerror(status)); + abort(); + } + if ((status=bladerf_enable_module(brf->dev, BLADERF_MODULE_RX, false)) != 0) { + fprintf(stderr,"Failed to enable RX module: %s\n", bladerf_strerror(status)); + abort(); + } + return 0; } diff --git a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h index 743baf1bc8..31a7173630 100644 --- a/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h +++ b/targets/ARCH/BLADERF/USERSPACE/LIB/bladerf_lib.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** bladerf_lib.h * diff --git a/targets/ARCH/COMMON/COPYING b/targets/ARCH/COMMON/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/COMMON/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c index b82fc98981..eb9f80872e 100644 --- a/targets/ARCH/COMMON/common_lib.c +++ b/targets/ARCH/COMMON/common_lib.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file common_lib.c * \brief common APIs for different RF frontend device * \author HongliangXU, Navid Nikaein @@ -49,25 +42,25 @@ int set_device(openair0_device *device) { switch (device->type) { case EXMIMO_DEV: - printf("[%s] has loaded EXPRESS MIMO device.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH")); + printf("[%s] has loaded EXPRESS MIMO device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU")); break; case USRP_B200_DEV: - printf("[%s] has loaded USRP B200 device.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH")); + printf("[%s] has loaded USRP B200 device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU")); break; case USRP_X300_DEV: - printf("[%s] has loaded USRP X300 device.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH")); + printf("[%s] has loaded USRP X300 device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU")); break; case BLADERF_DEV: - printf("[%s] has loaded BLADERF device.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH")); + printf("[%s] has loaded BLADERF device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU")); break; case LMSSDR_DEV: - printf("[%s] has loaded LMSSDR device.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH")); + printf("[%s] has loaded LMSSDR device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU")); break; case NONE_DEV: - printf("[%s] has not loaded a HW device.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH")); + printf("[%s] has not loaded a HW device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU")); break; default: - printf("[%s] invalid HW device.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH")); + printf("[%s] invalid HW device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU")); return -1; } return 0; @@ -78,15 +71,15 @@ int set_transport(openair0_device *device) { switch (device->transp_type) { case ETHERNET_TP: - printf("[%s] has loaded ETHERNET trasport protocol.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH")); + printf("[%s] has loaded ETHERNET trasport protocol.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU")); return 0; break; case NONE_TP: - printf("[%s] has not loaded a transport protocol.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH")); + printf("[%s] has not loaded a transport protocol.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU")); return 0; break; default: - printf("[%s] invalid transport protocol.\n",((device->host_type == BBU_HOST) ? "BBU": "RRH")); + printf("[%s] invalid transport protocol.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU")); return -1; break; } @@ -101,7 +94,7 @@ int load_lib(openair0_device *device, openair0_config_t *openair0_cfg, eth_param oai_transport_initfunc_t tp ; int ret=0; - if (flag == BBU_LOCAL_RADIO_HEAD) { + if (flag == RAU_LOCAL_RADIO_HEAD) { lib_handle = dlopen(OAI_RF_LIBNAME, RTLD_LAZY); if (!lib_handle) { fprintf(stderr,"Unable to locate %s: HW device set to NONE_DEV.\n", OAI_RF_LIBNAME); @@ -146,25 +139,20 @@ int load_lib(openair0_device *device, openair0_config_t *openair0_cfg, eth_param int openair0_device_load(openair0_device *device, openair0_config_t *openair0_cfg) { int rc=0; - //ToDo: EXMIMO harmonization is not complete. That is the reason for this ifdef - #ifdef EXMIMO - int device_init(openair0_device *device, openair0_config_t *openair0_cfg); - rc = device_init(device, openair0_cfg); - #else - rc=load_lib(device, openair0_cfg, NULL,BBU_LOCAL_RADIO_HEAD ); + rc=load_lib(device, openair0_cfg, NULL,RAU_LOCAL_RADIO_HEAD ); + if ( rc >= 0) { if ( set_device(device) < 0) { fprintf(stderr, "%s %d:Unsupported radio head\n",__FILE__, __LINE__); return -1; } } - #endif return rc; } int openair0_transport_load(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t * eth_params) { int rc; - rc=load_lib(device, openair0_cfg, eth_params, BBU_REMOTE_RADIO_HEAD); + rc=load_lib(device, openair0_cfg, eth_params, RAU_REMOTE_RADIO_HEAD); if ( rc >= 0) { if ( set_transport(device) < 0) { fprintf(stderr, "%s %d:Unsupported transport protocol\n",__FILE__, __LINE__); diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index dc0b31af58..2dc1650bfd 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file common_lib.h * \brief common APIs for different RF frontend device * \author HongliangXU, Navid Nikaein @@ -48,8 +41,12 @@ #define OAI_TP_LIBNAME "liboai_transpro.so" /* flags for BBU to determine whether the attached radio head is local or remote */ -#define BBU_LOCAL_RADIO_HEAD 0 -#define BBU_REMOTE_RADIO_HEAD 1 +#define RAU_LOCAL_RADIO_HEAD 0 +#define RAU_REMOTE_RADIO_HEAD 1 + +#ifndef MAX_CARDS +#define MAX_CARDS 8 +#endif typedef int64_t openair0_timestamp; typedef volatile int64_t openair0_vtimestamp; @@ -59,9 +56,9 @@ typedef volatile int64_t openair0_vtimestamp; typedef struct openair0_device_t openair0_device; -#ifndef EXMIMO -#define MAX_CARDS 1 -#endif + + + //#define USRP_GAIN_OFFSET (56.0) // 86 calibrated for USRP B210 @ 2.6 GHz to get equivalent RS EPRE in OAI to SMBV100 output @@ -69,10 +66,13 @@ typedef enum { max_gain=0,med_gain,byp_gain } rx_gain_t; +#if OCP_FRAMEWORK +#include +#else typedef enum { duplex_mode_TDD=1,duplex_mode_FDD=0 } duplex_mode_t; - +#endif /** @addtogroup _GENERIC_PHY_RF_INTERFACE_ @@ -80,6 +80,9 @@ typedef enum { */ /*!\brief RF device types */ +#ifdef OCP_FRAMEWORK +#include +#else typedef enum { MIN_RF_DEV_TYPE = 0, /*!\brief device is ExpressMIMO */ @@ -97,6 +100,7 @@ typedef enum { MAX_RF_DEV_TYPE } dev_type_t; +#endif /*!\brief transport protocol types */ @@ -114,10 +118,10 @@ typedef enum { /*!\brief openair0 device host type */ typedef enum { MIN_HOST_TYPE = 0, - /*!\brief device functions within a BBU */ - BBU_HOST, - /*!\brief device functions within a RRH */ - RRH_HOST, + /*!\brief device functions within a RAU */ + RAU_HOST, + /*!\brief device functions within a RRU */ + RRU_HOST, MAX_HOST_TYPE }host_type_t; @@ -131,6 +135,16 @@ typedef struct { double offset; } rx_gain_calib_table_t; +/*! \brief Clock source types */ +typedef enum { + //! This tells the underlying hardware to use the internal reference + internal=0, + //! This tells the underlying hardware to use the external reference + external=1, + //! This tells the underlying hardware to use the gpsdo reference + gpsdo=2 +} clock_source_t; + /*! \brief RF frontend parameters set by application */ typedef struct { //! Module ID for this configuration @@ -145,27 +159,27 @@ typedef struct { unsigned int samples_per_frame; //! the sample rate for both transmit and receive. double sample_rate; - //! number of samples per RX/TX packet (USRP + Ethernet) - unsigned int samples_per_packet; - //! delay in sending samples (write) due to hardware access, softmodem processing and fronthaul delay if exist - int tx_scheduling_advance; + //! flag to indicate that the device is doing mmapped DMA transfers + int mmapped_dma; //! offset in samples between TX and RX paths int tx_sample_advance; - //! configurable tx thread lauch delay - int txlaunch_wait; /* 1 or 0 */ - //! configurable tx thread lauch delay - int txlaunch_wait_slotcount; + //! samples per packet on the fronthaul interface + int samples_per_packet; //! number of RX channels (=RX antennas) int rx_num_channels; //! number of TX channels (=TX antennas) int tx_num_channels; + //! \brief RX base addresses for mmapped_dma + int32_t* rxbase[4]; + //! \brief TX base addresses for mmapped_dma + int32_t* txbase[4]; //! \brief Center frequency in Hz for RX. //! index: [0..rx_num_channels[ double rx_freq[4]; //! \brief Center frequency in Hz for TX. //! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels double tx_freq[4]; - + //! \brief memory //! \brief Pointer to Calibration table for RX gains rx_gain_calib_table_t *rx_gain_calib_table; @@ -183,22 +197,25 @@ typedef struct { double rx_bw; //! TX bandwidth in Hz double tx_bw; + //! clock source + clock_source_t clock_source; //! Auto calibration flag int autocal[4]; //! rf devices work with x bits iqs when oai have its own iq format //! the two following parameters are used to convert iqs int iq_txshift; int iq_rxrescale; - //! remote IP/MAC addr for Ethernet interface - char *remote_addr; - //! remote port number for Ethernet interface - unsigned int remote_port; - //! local IP/MAC addr for Ethernet interface (eNB/BBU, UE) - char *my_addr; - //! local port number for Ethernet interface (eNB/BBU, UE) - unsigned int my_port; //! Configuration file for LMS7002M char *configFilename; +#if defined(USRP_REC_PLAY) + unsigned short sf_mode; // 1=record, 2=replay + char sf_filename[1024]; // subframes file path + unsigned int sf_max; // max number of recorded subframes + unsigned int sf_loops; // number of loops in replay mode + unsigned int sf_read_delay; // read delay in replay mode + unsigned int sf_write_delay; // write delay in replay mode + unsigned int eth_mtu; // ethernet MTU +#endif } openair0_config_t; /*! \brief RF mapping */ @@ -212,31 +229,42 @@ typedef struct { typedef struct { char *remote_addr; - //! remote port number for Ethernet interface - uint16_t remote_port; - //! local IP/MAC addr for Ethernet interface (eNB/BBU, UE) + //! remote port number for Ethernet interface (control) + uint16_t remote_portc; + //! remote port number for Ethernet interface (user) + uint16_t remote_portd; + //! local IP/MAC addr for Ethernet interface (eNB/RAU, UE) char *my_addr; - //! local port number for Ethernet interface (eNB/BBU, UE) - uint16_t my_port; - //! local Ethernet interface (eNB/BBU, UE) + //! local port number (control) for Ethernet interface (eNB/RAU, UE) + uint16_t my_portc; + //! local port number (user) for Ethernet interface (eNB/RAU, UE) + uint16_t my_portd; + //! local Ethernet interface (eNB/RAU, UE) char *local_if_name; - //! tx_sample_advance for RF + ETH - uint8_t tx_sample_advance; - //! tx_scheduling_advance for RF + ETH - uint8_t tx_scheduling_advance; - //! iq_txshift for RF + ETH - uint8_t iq_txshift; //! transport type preference (RAW/UDP) uint8_t transp_preference; - //! radio front end preference (EXMIMO,USRP, BALDERF,LMSSDR) - uint8_t rf_preference; + //! compression enable (0: No comp/ 1: A-LAW) + uint8_t if_compress; } eth_params_t; +typedef struct { + //! Tx buffer for if device, keep one per subframe now to allow multithreading + void *tx[10]; + //! Tx buffer (PRACH) for if device + void *tx_prach; + //! Rx buffer for if device + void *rx; +} if_buffer_t; + + /*!\brief structure holds the parameters to configure USRP devices */ struct openair0_device_t { /*!brief Module ID of this device */ int Mod_id; + + /*!brief Component Carrier ID of this device */ + int CC_id; /*!brief Type of this device */ dev_type_t type; @@ -244,12 +272,15 @@ struct openair0_device_t { /*!brief Transport protocol type that the device suppports (in case I/Q samples need to be transported) */ transport_type_t transp_type; - /*!brief Type of the device's host (BBU/RRH) */ + /*!brief Type of the device's host (RAU/RRU) */ host_type_t host_type; /* !brief RF frontend parameters set by application */ openair0_config_t *openair0_cfg; + /* !brief ETH params set by application */ + eth_params_t *eth_params; + /*!brief Can be used by driver to hold internal structure*/ void *priv; @@ -260,19 +291,19 @@ struct openair0_device_t { */ int (*trx_start_func)(openair0_device *device); - /*! \brief Called to send a request message between BBU-RRH + /*! \brief Called to send a request message between RAU-RRU on control port @param device pointer to the device structure specific to the RF hardware target - @param msg pointer to the message structure passed between BBU-RRH + @param msg pointer to the message structure passed between RAU-RRU @param msg_len length of the message */ - int (*trx_request_func)(openair0_device *device, void *msg, ssize_t msg_len); + int (*trx_ctlsend_func)(openair0_device *device, void *msg, ssize_t msg_len); - /*! \brief Called to send a reply message between BBU-RRH + /*! \brief Called to receive a reply message between RAU-RRU on control port @param device pointer to the device structure specific to the RF hardware target - @param msg pointer to the message structure passed between BBU-RRH + @param msg pointer to the message structure passed between RAU-RRU @param msg_len length of the message */ - int (*trx_reply_func)(openair0_device *device, void *msg, ssize_t msg_len); + int (*trx_ctlrecv_func)(openair0_device *device, void *msg, ssize_t msg_len); /*! \brief Called to send samples to the RF target @param device pointer to the device structure specific to the RF hardware target @@ -315,9 +346,8 @@ struct openair0_device_t { void (*trx_end_func)(openair0_device *device); /*! \brief Stop operation of the transceiver - * \param card RF Card to use */ - int (*trx_stop_func)(int card); + int (*trx_stop_func)(openair0_device *device); /* Functions API related to UE*/ @@ -336,6 +366,11 @@ struct openair0_device_t { */ int (*trx_set_gains_func)(openair0_device* device, openair0_config_t *openair0_cfg); + /*! \brief RRU Configuration callback + * \param idx RU index + * \param arg pointer to capabilities or configuration + */ + void (*configure_rru)(int idx, void* arg); }; /* type of device init function, implemented in shared lib */ diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/COPYING b/targets/ARCH/ETHERNET/USERSPACE/LIB/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index a360f26556..acb4c2ec9b 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -1,34 +1,27 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file ethernet_lib.c * \brief API to stream I/Q samples over standard ethernet - * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp + * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp, Tien-Thinh Nguyen * \date 2015 * \version 0.2 * \company Eurecom @@ -52,38 +45,30 @@ #include "common_lib.h" #include "ethernet_lib.h" -#define DEBUG 0 +//#define DEBUG 0 -struct sockaddr_ll dest_addr[MAX_INST]; -struct sockaddr_ll local_addr[MAX_INST]; -int addr_len[MAX_INST]; -struct ifreq if_index[MAX_INST]; -struct ether_header eh; +//struct sockaddr_ll dest_addr[MAX_INST]; +//struct sockaddr_ll local_addr[MAX_INST]; +//int addr_len[MAX_INST]; +//struct ifreq if_index[MAX_INST]; int eth_socket_init_raw(openair0_device *device) { - int i = 0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; const char *local_mac, *remote_mac; - int local_port=0, remote_port=0; int sock_dom=0; int sock_type=0; int sock_proto=0; - if (device->host_type == RRH_HOST ) { /* RRH doesn't know remote MAC(will be retrieved from first packet send from BBU) and remote port(don't care) */ - local_mac = device->openair0_cfg->my_addr; - local_port = device->openair0_cfg->my_port; + if (device->host_type == RRU_HOST ) { /* RRU doesn't know remote MAC(will be retrieved from first packet send from RAU) and remote port(don't care) */ + local_mac = device->eth_params->my_addr; remote_mac = malloc(ETH_ALEN); - memset(remote_mac,0,ETH_ALEN); - remote_port = 0; - printf("[%s] local MAC addr %s remote MAC addr %s\n","RRH", local_mac,remote_mac); + memset((void*)remote_mac,0,ETH_ALEN); + printf("[%s] local MAC addr (user) %s remote MAC addr (user) %s\n","RRU", local_mac,remote_mac); } else { - local_mac = device->openair0_cfg->my_addr; - local_port = device->openair0_cfg->my_port; - remote_mac = device->openair0_cfg->remote_addr; - remote_port = device->openair0_cfg->remote_port; - printf("[%s] local MAC addr %s remote MAC addr %s\n","BBU", local_mac,remote_mac); + local_mac = device->eth_params->my_addr; + remote_mac = device->eth_params->remote_addr; + printf("[%s] local MAC addr (user) %s remote MAC addr (user) %s\n","RAU", local_mac,remote_mac); } @@ -91,40 +76,64 @@ int eth_socket_init_raw(openair0_device *device) { sock_dom=AF_PACKET; sock_type=SOCK_RAW; sock_proto=IPPROTO_RAW; - if ((eth->sockfd[Mod_id] = socket(sock_dom, sock_type, sock_proto)) == -1) { - perror("ETHERNET: Error opening RAW socket"); + if ((eth->sockfdc = socket(sock_dom, sock_type, sock_proto)) == -1) { + perror("ETHERNET: Error opening RAW socket (control)"); + exit(0); + } + if ((eth->sockfdd = socket(sock_dom, sock_type, sock_proto)) == -1) { + perror("ETHERNET: Error opening RAW socket (user)"); exit(0); } /* initialize destination address */ - for (i=0; i< MAX_INST; i++) { - bzero((void *)&(local_addr[i]), sizeof(struct sockaddr_ll)); - bzero((void *)&(if_index[i]), sizeof(struct ifreq)); - } + bzero((void *)&(eth->local_addrc_ll), sizeof(struct sockaddr_ll)); + bzero((void *)&(eth->local_addrd_ll), sizeof(struct sockaddr_ll)); + bzero((void *)&(eth->if_index), sizeof(struct ifreq)); + /* Get the index of the interface to send on */ - strcpy(if_index[Mod_id].ifr_name,eth->if_name[Mod_id]); - if (ioctl(eth->sockfd[Mod_id], SIOCGIFINDEX, &(if_index[Mod_id])) < 0) + strcpy(eth->if_index.ifr_name,eth->if_name); + if (ioctl(eth->sockfdc, SIOCGIFINDEX, &(eth->if_index)) < 0) + perror("SIOCGIFINDEX"); + if (ioctl(eth->sockfdd, SIOCGIFINDEX, &(eth->if_index)) < 0) perror("SIOCGIFINDEX"); - local_addr[Mod_id].sll_family = AF_PACKET; - local_addr[Mod_id].sll_ifindex = if_index[Mod_id].ifr_ifindex; + eth->local_addrc_ll.sll_family = AF_PACKET; + eth->local_addrc_ll.sll_ifindex = eth->if_index.ifr_ifindex; + eth->local_addrd_ll.sll_family = AF_PACKET; + eth->local_addrd_ll.sll_ifindex = eth->if_index.ifr_ifindex; /* hear traffic from specific protocol*/ - local_addr[Mod_id].sll_protocol = htons((short)device->openair0_cfg->my_port); - local_addr[Mod_id].sll_halen = ETH_ALEN; - local_addr[Mod_id].sll_pkttype = PACKET_OTHERHOST; - addr_len[Mod_id] = sizeof(struct sockaddr_ll); + if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + eth->local_addrd_ll.sll_protocol = htons(0xbffe); + } else{ + eth->local_addrc_ll.sll_protocol = htons((short)device->eth_params->my_portc); + eth->local_addrd_ll.sll_protocol = htons((short)device->eth_params->my_portd); + } + eth->local_addrc_ll.sll_halen = ETH_ALEN; + eth->local_addrc_ll.sll_pkttype = PACKET_OTHERHOST; + eth->local_addrd_ll.sll_halen = ETH_ALEN; + eth->local_addrd_ll.sll_pkttype = PACKET_OTHERHOST; + eth->addr_len = sizeof(struct sockaddr_ll); - if (bind(eth->sockfd[Mod_id],(struct sockaddr *)&local_addr[Mod_id],addr_len[Mod_id])<0) { - perror("ETHERNET: Cannot bind to socket"); - exit(0); - } + if ((eth->flags != ETH_RAW_IF5_MOBIPASS ) && + (bind(eth->sockfdc,(struct sockaddr *)ð->local_addrc_ll,eth->addr_len)<0)) { + perror("ETHERNET: Cannot bind to socket (control)"); + exit(0); + } + if (bind(eth->sockfdd,(struct sockaddr *)ð->local_addrd_ll,eth->addr_len)<0) { + perror("ETHERNET: Cannot bind to socket (user)"); + exit(0); + } /* Construct the Ethernet header */ - ether_aton_r(local_mac, (struct ether_addr *)(&(eh.ether_shost))); - ether_aton_r(remote_mac, (struct ether_addr *)(&(eh.ether_dhost))); - eh.ether_type = htons((short)device->openair0_cfg->my_port); - - printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eh.ether_shost[0],eh.ether_shost[1],eh.ether_shost[2],eh.ether_shost[3],eh.ether_shost[4],eh.ether_shost[5]); + ether_aton_r(local_mac, (struct ether_addr *)(&(eth->ehd.ether_shost))); + ether_aton_r(remote_mac, (struct ether_addr *)(&(eth->ehd.ether_dhost))); + if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + eth->ehd.ether_type = htons(0xbffe); + } else { + eth->ehc.ether_type = htons((short)device->eth_params->my_portc); + eth->ehd.ether_type = htons((short)device->eth_params->my_portd); + } + printf("[%s] binding to hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"),eth->ehd.ether_shost[0],eth->ehd.ether_shost[1],eth->ehd.ether_shost[2],eth->ehd.ether_shost[3],eth->ehd.ether_shost[4],eth->ehd.ether_shost[5]); return 0; } @@ -134,13 +143,12 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi int bytes_sent=0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; int sendto_flag =0; int i=0; //sendto_flag|=flags; eth->tx_nsamps=nsamps; - + for (i=0;iehd,MAC_HEADER_SIZE_BYTES); *(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t))=1+(i<<1); *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)) = timestamp; + + int sent_byte; - /*printf("[RRH]write mod_%d %d , len %d, buff %p \n", + + /*printf("[RRU]write mod_%d %d , len %d, buff %p \n", Mod_id,eth->sockfd[Mod_id],RAW_PACKET_SIZE_BYTES(nsamps), buff2);*/ - while(bytes_sent < RAW_PACKET_SIZE_BYTES(nsamps)) { + while(bytes_sent < sent_byte) { #if DEBUG printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n", (void *)(buff2+bytes_sent), - RAW_PACKET_SIZE_BYTES(nsamps) - bytes_sent, + sent_byte - bytes_sent, bytes_sent); #endif /* Send packet */ - bytes_sent += send(eth->sockfd[Mod_id], - buff2, - RAW_PACKET_SIZE_BYTES(nsamps), - sendto_flag); + + bytes_sent += send(eth->sockfdd, + buff2, + sent_byte, + sendto_flag); if ( bytes_sent == -1) { eth->num_tx_errors++; perror("ETHERNET WRITE: "); @@ -180,9 +192,11 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi printf("------- TX ------: nu=%x an_id=%d ts%d bytes_sent=%d\n", *(uint8_t *)(buff2+ETH_ALEN), *(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t)), - *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)), + *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)), bytes_sent); - dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, RAW_PACKET_SIZE_BYTES(nsamps), TX_FLAG); + + dump_packet((device->host_type == RAU_HOST)? "RAU":"RRU", buff2, sent_byte, TX_FLAG); + #endif eth->tx_actual_nsamps=bytes_sent>>2; eth->tx_count++; @@ -198,13 +212,62 @@ int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, voi } + +int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + + int nblocks = nsamps; + int bytes_sent = 0; + + eth_state_t *eth = (eth_state_t*)device->priv; + + ssize_t packet_size; + + if (flags == IF4p5_PDLFFT) { + packet_size = RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks); + } else if (flags == IF4p5_PULFFT) { + packet_size = RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks); + } else if (flags == IF4p5_PULTICK) { + packet_size = RAW_IF4p5_PULTICK_SIZE_BYTES; + } else if (flags == IF5_MOBIPASS) { + packet_size = RAW_IF5_MOBIPASS_SIZE_BYTES; + } else { + packet_size = RAW_IF4p5_PRACH_SIZE_BYTES; + } + + eth->tx_nsamps = nblocks; + + memcpy(buff[0], (void*)ð->ehd, MAC_HEADER_SIZE_BYTES); + + + bytes_sent = send(eth->sockfdd, + buff[0], + packet_size, + 0); + + if (bytes_sent == -1) { + eth->num_tx_errors++; + perror("ETHERNET WRITE: "); + exit(-1); + } else { + eth->tx_actual_nsamps = bytes_sent>>1; + eth->tx_count++; + } + + return (bytes_sent-MAC_HEADER_SIZE_BYTES); +} + + + int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { - + + int ret; int bytes_received=0; int i=0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; int rcvfrom_flag =0; + + int block_cnt=0; + int again_cnt=0; eth->rx_nsamps=nsamps; @@ -212,25 +275,57 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi /* buff[i] points to the position in rx buffer where the payload to be received will be placed buff2 points to the position in rx buffer where the packet header will be placed */ void *buff2 = (void*)(buff[i]-APP_HEADER_SIZE_BYTES-MAC_HEADER_SIZE_BYTES); - + /* we don't want to ovewrite with the header info the previous rx buffer data so we store it*/ struct ether_header temp = *(struct ether_header *)buff2; int32_t temp0 = *(int32_t *)(buff2 + MAC_HEADER_SIZE_BYTES); openair0_timestamp temp1 = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)); - + bytes_received=0; + int receive_bytes; + if (eth->compression == ALAW_COMPRESS) { + receive_bytes = RAW_PACKET_SIZE_BYTES_ALAW(nsamps); + } else { + receive_bytes = RAW_PACKET_SIZE_BYTES(nsamps); + } - while(bytes_received < RAW_PACKET_SIZE_BYTES(nsamps)) { - bytes_received +=recv(eth->sockfd[Mod_id], + while(bytes_received < receive_bytes) { + again: + ret = recv(eth->sockfdd, buff2, - RAW_PACKET_SIZE_BYTES(nsamps), + receive_bytes, rcvfrom_flag); - - if (bytes_received ==-1) { + + if (ret ==-1) { eth->num_rx_errors++; - perror("ETHERNET READ: "); - exit(-1); + if (errno == EAGAIN) { + again_cnt++; + usleep(10); + if (again_cnt == 1000) { + perror("ETHERNET IF5 READ (EAGAIN): "); + exit(-1); + } else { + printf("AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN \n"); + goto again; + } + } else if (errno == EWOULDBLOCK) { + block_cnt++; + usleep(10); + if (block_cnt == 1000) { + perror("ETHERNET IF5 READ (EWOULDBLOCK): "); + exit(-1); + } else { + printf("BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK \n"); + goto again; + } + } else { + perror("ETHERNET IF5 READ"); + printf("(%s):\n", strerror(errno)); + exit(-1); + } + } else { + bytes_received+=ret; /* store the timestamp value from packet's header */ *timestamp = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)); eth->rx_actual_nsamps=bytes_received>>2; @@ -244,7 +339,8 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi *(int16_t *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int16_t)), *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)), bytes_received); - dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, RAW_PACKET_SIZE_BYTES(nsamps),RX_FLAG); + + dump_packet((device->host_type == RAU_HOST)? "RAU":"RRU", buff2, RAW_PACKET_SIZE_BYTES(nsamps),RX_FLAG); #endif @@ -256,17 +352,150 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi return (bytes_received-APP_HEADER_SIZE_BYTES-MAC_HEADER_SIZE_BYTES)>>2; } - +int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + + int ret; + // Read nblocks info from packet itself + int nblocks = nsamps; + int bytes_received=0; + eth_state_t *eth = (eth_state_t*)device->priv; + + ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t; + IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0] + MAC_HEADER_SIZE_BYTES); + + int block_cnt=0; + int again_cnt=0; + + while (bytes_received < packet_size) { + again: + ret = recv(eth->sockfdd, + buff[0], + packet_size, + MSG_PEEK); + if (ret ==-1) { + eth->num_rx_errors++; + if (errno == EAGAIN) { + again_cnt++; + usleep(10); + if (again_cnt == 1000) { + perror("ETHERNET IF4p5 READ (EAGAIN): "); + exit(-1); + } else { + printf("AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN AGAIN \n"); + goto again; + } + } else if (errno == EWOULDBLOCK) { + block_cnt++; + usleep(10); + if (block_cnt == 1000) { + perror("ETHERNET IF4p5 READ (EWOULDBLOCK): "); + exit(-1); + } else { + printf("BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK \n"); + goto again; + } + } else { + perror("ETHERNET IF4p5 READ"); + printf("(%s):\n", strerror(errno)); + exit(-1); + } + } + else bytes_received+=ret; + } + +#ifdef DEBUG + for (int i=0;isub_type; + + if (test_header->sub_type == IF4p5_PDLFFT) { + packet_size = RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks); + } else if (test_header->sub_type == IF4p5_PULFFT) { + packet_size = RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks); + } else { + packet_size = RAW_IF4p5_PRACH_SIZE_BYTES; + } + + while(bytes_received < packet_size) { + ret = recv(eth->sockfdd, + buff[0], + packet_size, + 0); + if (ret ==-1) { + eth->num_rx_errors++; + perror("ETHERNET IF4p5 READ (payload): "); + return(-1); + } else { + bytes_received+=ret; + eth->rx_actual_nsamps = bytes_received>>1; + eth->rx_count++; + } + } + + eth->rx_nsamps = nsamps; + return(bytes_received); +} + + +int trx_eth_read_raw_IF5_mobipass(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + // Read nblocks info from packet itself + + int bytes_received=0; + eth_state_t *eth = (eth_state_t*)device->priv; + int ret; + + ssize_t packet_size = 28; //MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t ; +// ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 640*sizeof(int16_t); + + bytes_received = recv(eth->sockfdd, + buff[0], + packet_size, + MSG_PEEK); + + if (bytes_received ==-1) { + eth->num_rx_errors++; + perror("[MOBIPASS]ETHERNET IF5 READ (header): "); + exit(-1); + } + + IF5_mobipass_header_t *test_header = (IF5_mobipass_header_t*)((uint8_t *)buff[0] + MAC_HEADER_SIZE_BYTES); + *timestamp = test_header->time_stamp; + packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + 640*sizeof(int16_t); + + while(bytes_received < packet_size) { + ret = recv(eth->sockfdd, + buff[0], + packet_size, + 0); + if (bytes_received ==-1) { + eth->num_rx_errors++; + perror("[MOBIPASS] ETHERNET IF5 READ (payload): "); + return(-1); + } else { + bytes_received+=ret; + eth->rx_actual_nsamps = bytes_received>>1; + eth->rx_count++; + } + } + + eth->rx_nsamps = nsamps; + return(bytes_received); + + +} + int eth_set_dev_conf_raw(openair0_device *device) { - int Mod_id = device->Mod_id; eth_state_t *eth = (eth_state_t*)device->priv; void *msg; ssize_t msg_len; - /* a BBU client sends to RRH a set of configuration parameters (openair0_config_t) + /* a RAU client sends to RRU a set of configuration parameters (openair0_config_t) so that RF front end is configured appropriately and frame/packet size etc. can be set */ @@ -274,13 +503,44 @@ int eth_set_dev_conf_raw(openair0_device *device) { msg_len = MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t); - memcpy(msg,(void*)&eh,MAC_HEADER_SIZE_BYTES); + memcpy(msg,(void*)ð->ehc,MAC_HEADER_SIZE_BYTES); memcpy((msg+MAC_HEADER_SIZE_BYTES),(void*)device->openair0_cfg,sizeof(openair0_config_t)); - if (send(eth->sockfd[Mod_id], - msg, - msg_len, - 0)==-1) { + if (send(eth->sockfdc, + msg, + msg_len, + 0)==-1) { + perror("ETHERNET: "); + exit(0); + } + + return 0; +} + + + +int eth_set_dev_conf_raw_IF4p5(openair0_device *device) { + // use for cc_id info + + eth_state_t *eth = (eth_state_t*)device->priv; + void *msg; + ssize_t msg_len; + + /* a RAU client sends to RRU a set of configuration parameters (openair0_config_t) + so that RF front end is configured appropriately and + frame/packet size etc. can be set */ + + msg = malloc(MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t)); + msg_len = MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t); + + + memcpy(msg,(void*)ð->ehc,MAC_HEADER_SIZE_BYTES); + memcpy((msg+MAC_HEADER_SIZE_BYTES),(void*)device->openair0_cfg,sizeof(openair0_config_t)); + + if (send(eth->sockfdc, + msg, + msg_len, + 0)==-1) { perror("ETHERNET: "); exit(0); } @@ -292,16 +552,14 @@ int eth_set_dev_conf_raw(openair0_device *device) { int eth_get_dev_conf_raw(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; - char str[INET_ADDRSTRLEN]; void *msg; ssize_t msg_len; msg = malloc(MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t)); msg_len = MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t); - /* RRH receives from BBU openair0_config_t */ - if (recv(eth->sockfd[Mod_id], + /* RRU receives from RAU openair0_config_t */ + if (recv(eth->sockfdc, msg, msg_len, 0)==-1) { @@ -309,11 +567,40 @@ int eth_get_dev_conf_raw(openair0_device *device) { exit(0); } - /* RRH stores the remote MAC address */ - memcpy(eh.ether_dhost,(msg+ETH_ALEN),ETH_ALEN); + /* RRU stores the remote MAC address */ + memcpy(eth->ehd.ether_dhost,(msg+ETH_ALEN),ETH_ALEN); //memcpy((void*)&device->openair0_cfg,(msg + MAC_HEADER_SIZE_BYTES), sizeof(openair0_config_t)); device->openair0_cfg=(openair0_config_t *)(msg + MAC_HEADER_SIZE_BYTES); - printf("[%s] binding mod_%d to hardware address %x:%x:%x:%x:%x:%x hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == BBU_HOST) ? "BBU": "RRH"),Mod_id,eh.ether_shost[0],eh.ether_shost[1],eh.ether_shost[2],eh.ether_shost[3],eh.ether_shost[4],eh.ether_shost[5],eh.ether_dhost[0],eh.ether_dhost[1],eh.ether_dhost[2],eh.ether_dhost[3],eh.ether_dhost[4],eh.ether_dhost[5]); + printf("[%s] binding mod to hardware address %x:%x:%x:%x:%x:%x hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"),eth->ehd.ether_shost[0],eth->ehd.ether_shost[1],eth->ehd.ether_shost[2],eth->ehd.ether_shost[3],eth->ehd.ether_shost[4],eth->ehd.ether_shost[5],eth->ehd.ether_dhost[0],eth->ehd.ether_dhost[1],eth->ehd.ether_dhost[2],eth->ehd.ether_dhost[3],eth->ehd.ether_dhost[4],eth->ehd.ether_dhost[5]); + + return 0; +} + + +int eth_get_dev_conf_raw_IF4p5(openair0_device *device) { + // use for cc_id info + + eth_state_t *eth = (eth_state_t*)device->priv; + void *msg; + ssize_t msg_len; + + msg = malloc(MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t)); + msg_len = MAC_HEADER_SIZE_BYTES + sizeof(openair0_config_t); + + /* RRU receives from RAU openair0_config_t */ + if (recv(eth->sockfdc, + msg, + msg_len, + 0)==-1) { + perror("ETHERNET: "); + exit(0); + } + + /* RRU stores the remote MAC address */ + memcpy(eth->ehd.ether_dhost,(msg+ETH_ALEN),ETH_ALEN); + //memcpy((void*)&device->openair0_cfg,(msg + MAC_HEADER_SIZE_BYTES), sizeof(openair0_config_t)); + //device->openair0_cfg=(openair0_config_t *)(msg + MAC_HEADER_SIZE_BYTES); + printf("[%s] binding mod to hardware address %x:%x:%x:%x:%x:%x hardware address %x:%x:%x:%x:%x:%x\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"),eth->ehd.ether_shost[0],eth->ehd.ether_shost[1],eth->ehd.ether_shost[2],eth->ehd.ether_shost[3],eth->ehd.ether_shost[4],eth->ehd.ether_shost[5],eth->ehd.ether_dhost[0],eth->ehd.ether_dhost[1],eth->ehd.ether_dhost[2],eth->ehd.ether_dhost[3],eth->ehd.ether_dhost[4],eth->ehd.ether_dhost[5]); return 0; } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c index a9706c73bd..ad5bbda3fe 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_udp.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file ethernet_lib.c * \brief API to stream I/Q samples over standard ethernet * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp @@ -52,43 +45,51 @@ #include "common_lib.h" #include "ethernet_lib.h" +#include "common/ran_context.h" #define DEBUG 0 -struct sockaddr_in dest_addr[MAX_INST]; -struct sockaddr_in local_addr[MAX_INST]; -int addr_len[MAX_INST]; - +// These are for IF5 and must be put into the device structure if multiple RUs in the same RAU !!!!!!!!!!!!!!!!! uint16_t pck_seq_num = 1; uint16_t pck_seq_num_cur=0; uint16_t pck_seq_num_prev=0; - int eth_socket_init_udp(openair0_device *device) { +int eth_socket_init_udp(openair0_device *device) { - int i = 0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; + eth_params_t *eth_params = device->eth_params; + char str_local[INET_ADDRSTRLEN]; char str_remote[INET_ADDRSTRLEN]; - const char *local_ip, *remote_ip; - int local_port=0, remote_port=0; + + const char *local_ip, *remote_ipc,*remote_ipd; + int local_portc=0,local_portd=0, remote_portc=0,remote_portd=0; int sock_dom=0; int sock_type=0; int sock_proto=0; int enable=1; + const char str[2][4] = {"RRU\0","RAU\0"}; + int hostind = 0; - if (device->host_type == RRH_HOST ) { - local_ip = device->openair0_cfg->my_addr; - local_port = device->openair0_cfg->my_port; - remote_ip = "0.0.0.0"; - remote_port = 0; - printf("[%s] local ip addr %s port %d\n", "RRH", local_ip, local_port); - } else { - local_ip = device->openair0_cfg->my_addr; - local_port = device->openair0_cfg->my_port; - remote_ip = device->openair0_cfg->remote_addr; - remote_port = device->openair0_cfg->remote_port; - printf("[%s] local ip addr %s port %d\n","BBU", local_ip, local_port); + local_ip = eth_params->my_addr; + local_portc = eth_params->my_portc; + local_portd = eth_params->my_portd; + + + if (device->host_type == RRU_HOST ) { + + remote_ipc = "0.0.0.0"; + remote_ipd = eth_params->remote_addr; + remote_portc = 0; + remote_portd = eth_params->remote_portd;; + printf("[%s] local ip addr %s portc %d portd %d\n", "RRU", local_ip, local_portc, local_portd); + } else { + remote_ipc = eth_params->remote_addr; + remote_ipd = "0.0.0.0"; + remote_portc = eth_params->remote_portc; + remote_portd = 0; + hostind = 1; + printf("[%s] local ip addr %s portc %d portd %d\n","RAU", local_ip, local_portc, local_portd); } /* Open socket to send on */ @@ -96,58 +97,184 @@ uint16_t pck_seq_num_prev=0; sock_type=SOCK_DGRAM; sock_proto=IPPROTO_UDP; - if ((eth->sockfd[Mod_id] = socket(sock_dom, sock_type, sock_proto)) == -1) { - perror("ETHERNET: Error opening socket"); + if ((eth->sockfdc = socket(sock_dom, sock_type, sock_proto)) == -1) { + perror("ETHERNET: Error opening socket (control)"); + exit(0); + } + + if ((eth->sockfdd = socket(sock_dom, sock_type, sock_proto)) == -1) { + perror("ETHERNET: Error opening socket (user)"); exit(0); } /* initialize addresses */ - for (i=0; i< MAX_INST; i++) { - bzero((void *)&(dest_addr[i]), sizeof(dest_addr[i])); - bzero((void *)&(local_addr[i]), sizeof(local_addr[i])); - } + bzero((void *)&(eth->dest_addrc), sizeof(eth->dest_addrc)); + bzero((void *)&(eth->local_addrc), sizeof(eth->local_addrc)); + bzero((void *)&(eth->dest_addrd), sizeof(eth->dest_addrd)); + bzero((void *)&(eth->local_addrd), sizeof(eth->local_addrd)); + - addr_len[Mod_id] = sizeof(struct sockaddr_in); + eth->addr_len = sizeof(struct sockaddr_in); - dest_addr[Mod_id].sin_family = AF_INET; - inet_pton(AF_INET,remote_ip,&(dest_addr[Mod_id].sin_addr.s_addr)); - dest_addr[Mod_id].sin_port=htons(remote_port); - inet_ntop(AF_INET, &(dest_addr[Mod_id].sin_addr), str_remote, INET_ADDRSTRLEN); + eth->dest_addrc.sin_family = AF_INET; + inet_pton(AF_INET,remote_ipc,&(eth->dest_addrc.sin_addr.s_addr)); + eth->dest_addrc.sin_port=htons(remote_portc); + inet_ntop(AF_INET, &(eth->dest_addrc.sin_addr), str_remote, INET_ADDRSTRLEN); + + eth->dest_addrd.sin_family = AF_INET; + inet_pton(AF_INET,remote_ipd,&(eth->dest_addrd.sin_addr.s_addr)); + eth->dest_addrd.sin_port=htons(remote_portd); + + eth->local_addrc.sin_family = AF_INET; + inet_pton(AF_INET,local_ip,&(eth->local_addrc.sin_addr.s_addr)); + eth->local_addrc.sin_port=htons(local_portc); + inet_ntop(AF_INET, &(eth->local_addrc.sin_addr), str_local, INET_ADDRSTRLEN); + + eth->local_addrd.sin_family = AF_INET; + inet_pton(AF_INET,local_ip,&(eth->local_addrd.sin_addr.s_addr)); + eth->local_addrd.sin_port=htons(local_portd); - local_addr[Mod_id].sin_family = AF_INET; - inet_pton(AF_INET,local_ip,&(local_addr[Mod_id].sin_addr.s_addr)); - local_addr[Mod_id].sin_port=htons(local_port); - inet_ntop(AF_INET, &(local_addr[Mod_id].sin_addr), str_local, INET_ADDRSTRLEN); /* set reuse address flag */ - if (setsockopt(eth->sockfd[Mod_id], SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int))) { - perror("ETHERNET: Cannot set SO_REUSEADDR option on socket"); + if (setsockopt(eth->sockfdc, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int))) { + perror("ETHERNET: Cannot set SO_REUSEADDR option on socket (control)"); + exit(0); + } + if (setsockopt(eth->sockfdd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int))) { + perror("ETHERNET: Cannot set SO_REUSEADDR option on socket (user)"); exit(0); } /* want to receive -> so bind */ - if (bind(eth->sockfd[Mod_id],(struct sockaddr *)&local_addr[Mod_id],addr_len[Mod_id])<0) { - perror("ETHERNET: Cannot bind to socket"); - exit(0); - } else { - printf("[%s] binding mod_%d to %s:%d\n","RRH",Mod_id,str_local,ntohs(local_addr[Mod_id].sin_port)); - } + if (bind(eth->sockfdc,(struct sockaddr *)ð->local_addrc,eth->addr_len)<0) { + perror("ETHERNET: Cannot bind to socket (control)"); + exit(0); + } else { + printf("[%s] binding to %s:%d (control)\n",str[hostind],str_local,ntohs(eth->local_addrc.sin_port)); + } + if (bind(eth->sockfdd,(struct sockaddr *)ð->local_addrd,eth->addr_len)<0) { + perror("ETHERNET: Cannot bind to socket (user)"); + exit(0); + } else { + printf("[%s] binding to %s:%d (user)\n",str[hostind],str_local,ntohs(eth->local_addrd.sin_port)); + } return 0; } +int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + + // Read nblocks info from packet itself + int nblocks = nsamps; + int bytes_received=-1; + eth_state_t *eth = (eth_state_t*)device->priv; + + ssize_t packet_size = sizeof_IF4p5_header_t; + IF4p5_header_t *test_header = (IF4p5_header_t*)(buff[0]); + + int block_cnt=0; + + packet_size = max(UDP_IF4p5_PRACH_SIZE_BYTES, max(UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks), UDP_IF4p5_PDLFFT_SIZE_BYTES(nblocks))); + + while(bytes_received == -1) { + again: + bytes_received = recvfrom(eth->sockfdd, + buff[0], + packet_size, + 0, + (struct sockaddr *)ð->dest_addrd, + (socklen_t *)ð->addr_len); + if (bytes_received ==-1) { + eth->num_rx_errors++; + if (errno == EAGAIN) { + printf("Lost IF4p5 connection with %s\n", inet_ntoa(eth->dest_addrd.sin_addr)); + } else if (errno == EWOULDBLOCK) { + block_cnt++; + usleep(10); + if (block_cnt == 1000) { + perror("ETHERNET IF4p5 READ (EWOULDBLOCK): "); + } else { + printf("BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK BLOCK \n"); + goto again; + } + } else { + perror("ETHERNET IF4p5 READ"); + printf("(%s):\n", strerror(errno)); + } + } else { + *timestamp = test_header->sub_type; + eth->rx_actual_nsamps = bytes_received>>1; + eth->rx_count++; + } + } + //printf("size of third %d subtype %d frame %d subframe %d symbol %d \n", bytes_received, test_header->sub_type, ((test_header->frame_status)>>6)&0xffff, ((test_header->frame_status)>>22)&0x000f, ((test_header->frame_status)>>26)&0x000f) ; + + eth->rx_nsamps = nsamps; + return(bytes_received); +} + +int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + + int nblocks = nsamps; + int bytes_sent = 0; + + + eth_state_t *eth = (eth_state_t*)device->priv; + + ssize_t packet_size; + + char str[INET_ADDRSTRLEN]; + + inet_ntop(AF_INET, &(eth->dest_addrd.sin_addr), str, INET_ADDRSTRLEN); + + if (flags == IF4p5_PDLFFT) { + packet_size = UDP_IF4p5_PDLFFT_SIZE_BYTES(nblocks); + } else if (flags == IF4p5_PULFFT) { + packet_size = UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks); + } else if (flags == IF4p5_PULTICK) { + packet_size = UDP_IF4p5_PULTICK_SIZE_BYTES; + } else if ((flags >= IF4p5_PRACH)&& + (flags <= (IF4p5_PRACH+4))) { + packet_size = UDP_IF4p5_PRACH_SIZE_BYTES; + } else { + printf("trx_eth_write_udp_IF4p5: unknown flags %d\n",flags); + return(-1); + } + + eth->tx_nsamps = nblocks; + // printf("Sending %d bytes to %s:%d\n",packet_size,str,ntohs(eth->local_addrd.sin_port)); + + bytes_sent = sendto(eth->sockfdd, + buff[0], + packet_size, + 0, + (struct sockaddr*)ð->dest_addrd, + eth->addr_len); + + if (bytes_sent == -1) { + eth->num_tx_errors++; + perror("error writing to remote unit (user) : "); + exit(-1); + } else { + eth->tx_actual_nsamps = bytes_sent>>1; + eth->tx_count++; + } + return (bytes_sent); +} + int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags) { int bytes_sent=0; eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; int sendto_flag =0; int i=0; //sendto_flag|=flags; eth->tx_nsamps=nsamps; + + for (i=0;ipck_header.seq_num = pck_seq_num; //eth->pck_header.antenna_id = 1+(i<<1); //eth->pck_header.timestamp = timestamp; - *(uint16_t *)buff2 = pck_seq_num; + *(uint16_t *)buff2 = eth->pck_seq_num; *(uint16_t *)(buff2 + sizeof(uint16_t)) = 1+(i<<1); *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = timestamp; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM, pck_seq_num); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM, eth->pck_seq_num); + + int sent_byte; + if (eth->compression == ALAW_COMPRESS) { + sent_byte = UDP_PACKET_SIZE_BYTES_ALAW(nsamps); + } else { + sent_byte = UDP_PACKET_SIZE_BYTES(nsamps); + } - while(bytes_sent < UDP_PACKET_SIZE_BYTES(nsamps)) { + //while(bytes_sent < sent_byte) { + //printf("eth->pck_seq_num: %d\n", eth->pck_seq_num); #if DEBUG printf("------- TX ------: buff2 current position=%d remaining_bytes=%d bytes_sent=%d \n", (void *)(buff2+bytes_sent), - UDP_PACKET_SIZE_BYTES(nsamps) - bytes_sent, + sent_byte - bytes_sent, bytes_sent); #endif /* Send packet */ - bytes_sent += sendto(eth->sockfd[Mod_id], + bytes_sent += sendto(eth->sockfdd, buff2, - UDP_PACKET_SIZE_BYTES(nsamps), + sent_byte, sendto_flag, - (struct sockaddr*)&dest_addr[Mod_id], - addr_len[Mod_id]); + (struct sockaddr*)ð->dest_addrd, + eth->addr_len); if ( bytes_sent == -1) { eth->num_tx_errors++; @@ -194,14 +329,16 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi *(int16_t *)(buff2 + sizeof(int16_t)), *(openair0_timestamp *)(buff2 + sizeof(int32_t)), bytes_sent); - dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps), TX_FLAG); + + dump_packet((device->host_type == RAU_HOST)? "RAU":"RAU", buff2, UDP_PACKET_SIZE_BYTES(nsamps), TX_FLAG); #endif eth->tx_actual_nsamps=bytes_sent>>2; eth->tx_count++; - pck_seq_num++; - if ( pck_seq_num > MAX_PACKET_SEQ_NUM(nsamps,76800) ) pck_seq_num = 1; + eth->pck_seq_num++; + if ( eth->pck_seq_num > MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame) ) eth->pck_seq_num = 1; } - } + //} + /* tx buffer values restored */ *(int32_t *)buff2 = temp0; *(openair0_timestamp *)(buff2 + sizeof(int32_t)) = temp1; @@ -216,8 +353,7 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi int bytes_received=0; eth_state_t *eth = (eth_state_t*)device->priv; - openair0_timestamp prev_timestamp = -1; - int Mod_id = device->Mod_id; + // openair0_timestamp prev_timestamp = -1; int rcvfrom_flag =0; int block_cnt=0; int again_cnt=0; @@ -236,22 +372,27 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi bytes_received=0; block_cnt=0; + int receive_bytes; + if (eth->compression == ALAW_COMPRESS) { + receive_bytes = UDP_PACKET_SIZE_BYTES_ALAW(nsamps); + } else { + receive_bytes = UDP_PACKET_SIZE_BYTES(nsamps); + } - - while(bytes_received < UDP_PACKET_SIZE_BYTES(nsamps)) { + while(bytes_received < receive_bytes) { again: #if DEBUG printf("------- RX------: buff2 current position=%d remaining_bytes=%d bytes_recv=%d \n", (void *)(buff2+bytes_received), - UDP_PACKET_SIZE_BYTES(nsamps) - bytes_received, + receive_bytes - bytes_received, bytes_received); #endif - bytes_received +=recvfrom(eth->sockfd[Mod_id], + bytes_received +=recvfrom(eth->sockfdd, buff2, - UDP_PACKET_SIZE_BYTES(nsamps), + receive_bytes, rcvfrom_flag, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&addr_len[Mod_id]); + (struct sockaddr *)ð->dest_addrd, + (socklen_t *)ð->addr_len); if (bytes_received ==-1) { eth->num_rx_errors++; @@ -283,28 +424,30 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi *(int16_t *)(buff2 + sizeof(int16_t)), *(openair0_timestamp *)(buff2 + sizeof(int32_t)), bytes_received); - dump_packet((device->host_type == BBU_HOST)? "BBU":"RRH", buff2, UDP_PACKET_SIZE_BYTES(nsamps),RX_FLAG); + + dump_packet((device->host_type == RAU_HOST)? "RAU":"RRU", buff2, UDP_PACKET_SIZE_BYTES(nsamps),RX_FLAG); #endif /* store the timestamp value from packet's header */ *timestamp = *(openair0_timestamp *)(buff2 + sizeof(int32_t)); /* store the sequence number of the previous packet received */ - if (pck_seq_num_cur == 0) { - pck_seq_num_prev = *(uint16_t *)buff2; + if (eth->pck_seq_num_cur == 0) { + eth->pck_seq_num_prev = *(uint16_t *)buff2; } else { - pck_seq_num_prev = pck_seq_num_cur; + eth->pck_seq_num_prev = eth->pck_seq_num_cur; } /* get the packet sequence number from packet's header */ - pck_seq_num_cur = *(uint16_t *)buff2; - //printf("cur=%d prev=%d buff=%d\n",pck_seq_num_cur,pck_seq_num_prev,*(uint16_t *)(buff2)); - if ( ( pck_seq_num_cur != (pck_seq_num_prev + 1) ) && !((pck_seq_num_prev==75) && (pck_seq_num_cur==1 ))){ - printf("out of order packet received1! %d|%d|%d\n",pck_seq_num_cur,pck_seq_num_prev, *timestamp); + eth->pck_seq_num_cur = *(uint16_t *)buff2; + if ( ( eth->pck_seq_num_cur != (eth->pck_seq_num_prev + 1) ) && !((eth->pck_seq_num_prev==MAX_PACKET_SEQ_NUM(nsamps,device->openair0_cfg->samples_per_frame)) && (eth->pck_seq_num_cur==1 )) && !((eth->pck_seq_num_prev==1) && (eth->pck_seq_num_cur==1))) { + //#if DEBUG + printf("Out of order packet received: current_packet=%d previous_packet=%d timestamp=%"PRId64"\n",eth->pck_seq_num_cur,eth->pck_seq_num_prev,*timestamp); + //#endif } - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM,pck_seq_num_cur); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM_PRV,pck_seq_num_prev); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM,eth->pck_seq_num_cur); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_SEQ_NUM_PRV,eth->pck_seq_num_prev); eth->rx_actual_nsamps=bytes_received>>2; eth->rx_count++; - } + } } /* tx buffer values restored */ @@ -314,70 +457,26 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, voi } return (bytes_received-APP_HEADER_SIZE_BYTES)>>2; } - -int eth_set_dev_conf_udp(openair0_device *device) { +int trx_eth_ctlsend_udp(openair0_device *device, void *msg, ssize_t msg_len) { - int Mod_id = device->Mod_id; - eth_state_t *eth = (eth_state_t*)device->priv; - void *msg; - ssize_t msg_len; - - - /* a BBU client sents to RRH a set of configuration parameters (openair0_config_t) - so that RF front end is configured appropriately and - frame/packet size etc. can be set */ - - msg=malloc(sizeof(openair0_config_t)); - msg_len=sizeof(openair0_config_t); - memcpy(msg,(void*)device->openair0_cfg,msg_len); - - if (sendto(eth->sockfd[Mod_id],msg,msg_len,0,(struct sockaddr *)&dest_addr[Mod_id],addr_len[Mod_id])==-1) { - perror("ETHERNET: "); - exit(0); - } - - return 0; + return(sendto(((eth_state_t*)device->priv)->sockfdc, + msg, + msg_len, + 0, + (struct sockaddr *)&((eth_state_t*)device->priv)->dest_addrc, + ((eth_state_t*)device->priv)->addr_len)); } -int eth_get_dev_conf_udp(openair0_device *device) { - eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; - char str1[INET_ADDRSTRLEN],str[INET_ADDRSTRLEN]; - void *msg; - ssize_t msg_len; +int trx_eth_ctlrecv_udp(openair0_device *device, void *msg, ssize_t msg_len) { - msg=malloc(sizeof(openair0_config_t)); - msg_len=sizeof(openair0_config_t); - - inet_ntop(AF_INET, &(local_addr[Mod_id].sin_addr), str, INET_ADDRSTRLEN); - inet_ntop(AF_INET, &(dest_addr[Mod_id].sin_addr), str1, INET_ADDRSTRLEN); - - /* RRH receives from BBU openair0_config_t */ - if (recvfrom(eth->sockfd[Mod_id], - msg, - msg_len, - 0, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&addr_len[Mod_id])==-1) { - perror("ETHERNET: "); - exit(0); - } - device->openair0_cfg=(openair0_config_t *)msg; - - /* get remote ip address and port */ - /* inet_ntop(AF_INET, &(dest_addr[Mod_id].sin_addr), str1, INET_ADDRSTRLEN); */ - /* device->openair0_cfg->remote_port =ntohs(dest_addr[Mod_id].sin_port); */ - /* device->openair0_cfg->remote_addr =str1; */ - - /* /\* restore local ip address and port *\/ */ - /* inet_ntop(AF_INET, &(local_addr[Mod_id].sin_addr), str, INET_ADDRSTRLEN); */ - /* device->openair0_cfg->my_port =ntohs(local_addr[Mod_id].sin_port); */ - /* device->openair0_cfg->my_addr =str; */ - - /* printf("[RRH] mod_%d socket %d connected to BBU %s:%d %s:%d\n", Mod_id, eth->sockfd[Mod_id],str1, device->openair0_cfg->remote_port, str, device->openair0_cfg->my_port); */ - return 0; + return (recvfrom(((eth_state_t*)device->priv)->sockfdc, + msg, + msg_len, + 0, + (struct sockaddr *)&((eth_state_t*)device->priv)->dest_addrc, + (socklen_t *)&((eth_state_t*)device->priv)->addr_len)); } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index f15f2d98eb..108c4ca069 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -1,31 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file ethernet_lib.c * \brief API to stream I/Q samples over standard ethernet * \author add alcatel Katerina Trilyraki, Navid Nikaein, Pedro Dinis, Lucio Ferreira, Raymond Knopp @@ -34,7 +27,7 @@ * \company Eurecom * \maintainer: navid.nikaein@eurecom.fr * \note - * \warning + * \warning */ #include @@ -48,6 +41,8 @@ #include #include #include +#include +#include #include "common_lib.h" #include "ethernet_lib.h" @@ -63,31 +58,96 @@ int trx_eth_start(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; /* initialize socket */ - if ((eth->flags & ETH_RAW_MODE) != 0 ) { + if (eth->flags == ETH_RAW_MODE) { + printf("Setting ETHERNET to ETH_RAW_IF5_MODE\n"); if (eth_socket_init_raw(device)!=0) return -1; - /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ - if (device->host_type == BBU_HOST) { + /* RRU gets device configuration - RAU sets device configuration*/ + + printf("Setting Timenout to 999999 usecs\n"); + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; + + /* + if (device->host_type == RAU_HOST) { if(eth_set_dev_conf_raw(device)!=0) return -1; } else { if(eth_get_dev_conf_raw(device)!=0) return -1; - } + }*/ + /* adjust MTU wrt number of samples per packet */ - if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; - } else { - if (eth_socket_init_udp(device)!=0) return -1; - /* RRH gets openair0 device configuration - BBU sets openair0 device configuration*/ - if (device->host_type == BBU_HOST) { + if(eth->compression == ALAW_COMPRESS) { + if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES_ALAW(device->openair0_cfg->samples_per_packet))!=0) return -1; + } else { + if(ethernet_tune (device,MTU_SIZE,RAW_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; + } + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; + } else if (eth->flags == ETH_RAW_IF4p5_MODE) { + + printf("Setting ETHERNET to ETH_RAW_IF4p5_MODE\n"); + if (eth_socket_init_raw(device)!=0) return -1; + + printf("Setting Timenout to 999999 usecs\n"); + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; + + /* + if (device->host_type == RAU_HOST) { + if(eth_set_dev_conf_raw_IF4p5(device)!=0) return -1; + } else { + if(eth_get_dev_conf_raw_IF4p5(device)!=0) return -1; + } + */ + + /* adjust MTU wrt number of samples per packet */ + if(ethernet_tune (device,MTU_SIZE,RAW_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; + + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; + } else if (eth->flags == ETH_UDP_IF4p5_MODE) { + printf("Setting ETHERNET to UDP_IF4p5_MODE\n"); + if (eth_socket_init_udp(device)!=0) return -1; + + printf("Setting Timeout to 999999 usecs\n"); + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; + + /* + if (device->host_type == RAU_HOST) { if(eth_set_dev_conf_udp(device)!=0) return -1; } else { if(eth_get_dev_conf_udp(device)!=0) return -1; } + */ + /* adjust MTU wrt number of samples per packet */ - //if(ethernet_tune (device,MTU_SIZE,UDP_PACKET_SIZE_BYTES(device->openair0_cfg->samples_per_packet))!=0) return -1; + if(ethernet_tune (device,MTU_SIZE,UDP_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; + + + + + } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + printf("Setting ETHERNET to RAW_IF5_MODE\n"); + if (eth_socket_init_raw(device)!=0) return -1; + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; + + } else { + printf("Setting ETHERNET to UDP_IF5_MODE\n"); + if (eth_socket_init_udp(device)!=0) return -1; + + /* + if (device->host_type == RAU_HOST) { + if(eth_set_dev_conf_udp(device)!=0) return -1; + } else { + if(eth_get_dev_conf_udp(device)!=0) return -1; + }*/ + + /* adjust MTU wrt number of samples per packet */ + if(ethernet_tune (device,MTU_SIZE,UDP_IF4p5_PRACH_SIZE_BYTES)!=0) return -1; + + if(ethernet_tune (device,RCV_TIMEOUT,999999)!=0) return -1; } /* apply additional configuration */ if(ethernet_tune (device, SND_BUF_SIZE,2000000000)!=0) return -1; if(ethernet_tune (device, RCV_BUF_SIZE,2000000000)!=0) return -1; - + if(ethernet_tune (device, KERNEL_SND_BUF_MAX_SIZE, 200000000)!=0) return -1; + if(ethernet_tune (device, KERNEL_RCV_BUF_MAX_SIZE, 200000000)!=0) return -1; + return 0; } @@ -95,92 +155,55 @@ int trx_eth_start(openair0_device *device) { void trx_eth_end(openair0_device *device) { eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; /* destroys socket only for the processes that call the eth_end fuction-- shutdown() for beaking the pipe */ - if ( close(eth->sockfd[Mod_id]) <0 ) { + if ( close(eth->sockfdd) <0 ) { perror("ETHERNET: Failed to close socket"); exit(0); } else { - printf("[%s] socket for mod_id %d has been successfully closed.\n",(device->host_type == BBU_HOST)? "BBU":"RRH",Mod_id); + printf("[%s] socket has been successfully closed.\n",(device->host_type == RAU_HOST)? "RAU":"RRU"); } - } -int trx_eth_request(openair0_device *device, void *msg, ssize_t msg_len) { - - int Mod_id = device->Mod_id; - eth_state_t *eth = (eth_state_t*)device->priv; - - /* BBU sends a message to RRH */ - if (sendto(eth->sockfd[Mod_id],msg,msg_len,0,(struct sockaddr *)&dest_addr[Mod_id],dest_addr_len[Mod_id])==-1) { - perror("ETHERNET: "); - exit(0); - } - - return 0; -} - - -int trx_eth_reply(openair0_device *device, void *msg, ssize_t msg_len) { - - eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id = device->Mod_id; - - /* RRH receives from BBU a message */ - if (recvfrom(eth->sockfd[Mod_id], - msg, - msg_len, - 0, - (struct sockaddr *)&dest_addr[Mod_id], - (socklen_t *)&dest_addr_len[Mod_id])==-1) { - perror("ETHERNET: "); - exit(0); - } - - return 0; -} - - - -int trx_eth_stop(int card) { - return(0); +int trx_eth_stop(openair0_device *device) { + return(0); } int trx_eth_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) { - return(0); + return(0); } int trx_eth_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { - return(0); + return(0); } int trx_eth_get_stats(openair0_device* device) { - return(0); + return(0); } int trx_eth_reset_stats(openair0_device* device) { - return(0); + return(0); } int ethernet_tune(openair0_device *device, unsigned int option, int value) { eth_state_t *eth = (eth_state_t*)device->priv; - int Mod_id=device->Mod_id; struct timeval timeout; struct ifreq ifr; - char system_cmd[256]; - char* if_name=DEFAULT_IF; - struct in_addr ia; - struct if_nameindex *ids; + char system_cmd[256]; + int rname[] = { CTL_NET, NET_CORE, NET_CORE_RMEM_MAX }; + int wname[] = { CTL_NET, NET_CORE, NET_CORE_WMEM_MAX }; + int namelen=3; + int newval[1]; + int newlen=sizeof(newval); int ret=0; - int i=0; + // int i=0; /****************** socket level options ************************/ switch(option) { case SND_BUF_SIZE: /* transmit socket buffer size */ - if (setsockopt(eth->sockfd[Mod_id], + if (setsockopt(eth->sockfdd, SOL_SOCKET, SO_SNDBUF, &value,sizeof(value))) { @@ -191,7 +214,7 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { break; case RCV_BUF_SIZE: /* receive socket buffer size */ - if (setsockopt(eth->sockfd[Mod_id], + if (setsockopt(eth->sockfdd, SOL_SOCKET, SO_RCVBUF, &value,sizeof(value))) { @@ -202,28 +225,44 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { break; case RCV_TIMEOUT: - timeout.tv_sec = value/1000000000; - timeout.tv_usec = value%1000000000;//less than rt_period? - if (setsockopt(eth->sockfd[Mod_id], + timeout.tv_sec = value/1000000; + timeout.tv_usec = value%1000000;//less than rt_period? + if (setsockopt(eth->sockfdc, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,sizeof(timeout))) { perror("[ETHERNET] setsockopt()"); } else { - printf( "receive timeout= %d,%d sec\n",timeout.tv_sec,timeout.tv_usec); + printf( "receive timeout= %u usec\n",(unsigned int)timeout.tv_usec); + } + if (setsockopt(eth->sockfdd, + SOL_SOCKET, + SO_RCVTIMEO, + (char *)&timeout,sizeof(timeout))) { + perror("[ETHERNET] setsockopt()"); + } else { + printf( "receive timeout= %u usec\n",(unsigned int)timeout.tv_usec); } break; case SND_TIMEOUT: timeout.tv_sec = value/1000000000; timeout.tv_usec = value%1000000000;//less than rt_period? - if (setsockopt(eth->sockfd[Mod_id], + if (setsockopt(eth->sockfdc, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,sizeof(timeout))) { perror("[ETHERNET] setsockopt()"); } else { - printf( "send timeout= %d,%d sec\n",timeout.tv_sec,timeout.tv_usec); + printf( "send timeout= %d,%d sec\n",(int)timeout.tv_sec,(int)timeout.tv_usec); + } + if (setsockopt(eth->sockfdd, + SOL_SOCKET, + SO_SNDTIMEO, + (char *)&timeout,sizeof(timeout))) { + perror("[ETHERNET] setsockopt()"); + } else { + printf( "send timeout= %d,%d sec\n",(int)timeout.tv_sec,(int)timeout.tv_usec); } break; @@ -231,33 +270,33 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { /******************* interface level options *************************/ case MTU_SIZE: /* change MTU of the eth interface */ ifr.ifr_addr.sa_family = AF_INET; - strncpy(ifr.ifr_name,eth->if_name[Mod_id], sizeof(ifr.ifr_name)); + strncpy(ifr.ifr_name,eth->if_name, sizeof(ifr.ifr_name)); ifr.ifr_mtu =value; - if (ioctl(eth->sockfd[Mod_id],SIOCSIFMTU,(caddr_t)&ifr) < 0 ) + if (ioctl(eth->sockfdd,SIOCSIFMTU,(caddr_t)&ifr) < 0 ) perror ("[ETHERNET] Can't set the MTU"); else - printf("[ETHERNET] %s MTU size has changed to %d\n",eth->if_name[Mod_id],ifr.ifr_mtu); + printf("[ETHERNET] %s MTU size has changed to %d\n",eth->if_name,ifr.ifr_mtu); break; case TX_Q_LEN: /* change TX queue length of eth interface */ ifr.ifr_addr.sa_family = AF_INET; - strncpy(ifr.ifr_name,eth->if_name[Mod_id], sizeof(ifr.ifr_name)); + strncpy(ifr.ifr_name,eth->if_name, sizeof(ifr.ifr_name)); ifr.ifr_qlen =value; - if (ioctl(eth->sockfd[Mod_id],SIOCSIFTXQLEN,(caddr_t)&ifr) < 0 ) + if (ioctl(eth->sockfdd,SIOCSIFTXQLEN,(caddr_t)&ifr) < 0 ) perror ("[ETHERNET] Can't set the txqueuelen"); else - printf("[ETHERNET] %s txqueuelen size has changed to %d\n",eth->if_name[Mod_id],ifr.ifr_qlen); + printf("[ETHERNET] %s txqueuelen size has changed to %d\n",eth->if_name,ifr.ifr_qlen); break; /******************* device level options *************************/ case COALESCE_PAR: - ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -C %s rx-usecs %d",eth->if_name[Mod_id],value); + ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -C %s rx-usecs %d",eth->if_name,value); if (ret > 0) { ret=system(system_cmd); if (ret == -1) { fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); } else { - printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); + printf ("[ETHERNET] status of %s is %d\n", system_cmd, WEXITSTATUS(ret)); } printf("[ETHERNET] Coalesce parameters %s\n",system_cmd); } else { @@ -266,15 +305,15 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { break; case PAUSE_PAR: - if (value==1) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg off rx off tx off",eth->if_name[Mod_id]); - else if (value==0) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg on rx on tx on",eth->if_name[Mod_id]); + if (value==1) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg off rx off tx off",eth->if_name); + else if (value==0) ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -A %s autoneg on rx on tx on",eth->if_name); else break; if (ret > 0) { ret=system(system_cmd); if (ret == -1) { fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); } else { - printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); + printf ("[ETHERNET] status of %s is %d\n", system_cmd, WEXITSTATUS(ret)); } printf("[ETHERNET] Pause parameters %s\n",system_cmd); } else { @@ -283,19 +322,37 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { break; case RING_PAR: - ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -G %s rx %d tx %d",eth->if_name[Mod_id],value); + ret=snprintf(system_cmd,sizeof(system_cmd),"ethtool -G %s val %d",eth->if_name,value); if (ret > 0) { ret=system(system_cmd); if (ret == -1) { - fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); + fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno)); } else { - printf ("[ETHERNET] status of %s is %i\n",WEXITSTATUS(ret)); + printf ("[ETHERNET] status of %s is %d\n", system_cmd, WEXITSTATUS(ret)); } printf("[ETHERNET] Ring parameters %s\n",system_cmd); } else { perror("[ETHERNET] Can't set ring parameters\n"); } break; + case KERNEL_RCV_BUF_MAX_SIZE: + newval[0] = value; + ret=sysctl(rname, namelen, NULL, 0, newval, newlen); + if (ret) { + fprintf(stderr,"[ETHERNET] Error using sysctl():%s\n",strerror(errno)); + } else{ + printf("[ETHERNET] Kernel network receive buffer max size is set to %u\n",newval[0]); + } + break; + case KERNEL_SND_BUF_MAX_SIZE: + newval[0] = value; + ret=sysctl(wname, namelen, NULL, 0, newval, newlen); + if (ret) { + fprintf(stderr,"[ETHERNET] Error using sysctl():%s\n",strerror(errno)); + } else{ + printf("[ETHERNET] Kernel network send buffer max size is set to %u\n",newval[0]); + } + break; default: break; @@ -305,76 +362,105 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value) { } - int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t * eth_params ) { eth_state_t *eth = (eth_state_t*)malloc(sizeof(eth_state_t)); memset(eth, 0, sizeof(eth_state_t)); - + if (eth_params->transp_preference == 1) { eth->flags = ETH_RAW_MODE; - } else { + } else if (eth_params->transp_preference == 0) { eth->flags = ETH_UDP_MODE; + } else if (eth_params->transp_preference == 3) { + eth->flags = ETH_RAW_IF4p5_MODE; + } else if (eth_params->transp_preference == 2) { + eth->flags = ETH_UDP_IF4p5_MODE; + } else if (eth_params->transp_preference == 4) { + eth->flags = ETH_RAW_IF5_MOBIPASS; + } else { + printf("transport_init: Unknown transport preference %d - default to RAW", eth_params->transp_preference); + eth->flags = ETH_RAW_MODE; + } + + if (eth_params->if_compress == 0) { + eth->compression = NO_COMPRESS; + } else if (eth_params->if_compress == 1) { + eth->compression = ALAW_COMPRESS; + } else { + printf("transport_init: Unknown compression scheme %d - default to ALAW", eth_params->if_compress); + eth->compression = ALAW_COMPRESS; } - printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); - device->Mod_id = num_devices_eth++; + printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == RAU_HOST) ? "RAU": "RRU")); + device->Mod_id = 0;//num_devices_eth++; device->transp_type = ETHERNET_TP; device->trx_start_func = trx_eth_start; - device->trx_request_func = trx_eth_request; - device->trx_reply_func = trx_eth_reply; device->trx_get_stats_func = trx_eth_get_stats; device->trx_reset_stats_func = trx_eth_reset_stats; device->trx_end_func = trx_eth_end; device->trx_stop_func = trx_eth_stop; device->trx_set_freq_func = trx_eth_set_freq; device->trx_set_gains_func = trx_eth_set_gains; - - if ((eth->flags & ETH_RAW_MODE) != 0 ) { + + if (eth->flags == ETH_RAW_MODE) { device->trx_write_func = trx_eth_write_raw; device->trx_read_func = trx_eth_read_raw; - } else { + } else if (eth->flags == ETH_UDP_MODE) { device->trx_write_func = trx_eth_write_udp; - device->trx_read_func = trx_eth_read_udp; + device->trx_read_func = trx_eth_read_udp; + device->trx_ctlsend_func = trx_eth_ctlsend_udp; + device->trx_ctlrecv_func = trx_eth_ctlrecv_udp; + } else if (eth->flags == ETH_RAW_IF4p5_MODE) { + device->trx_write_func = trx_eth_write_raw_IF4p5; + device->trx_read_func = trx_eth_read_raw_IF4p5; + } else if (eth->flags == ETH_UDP_IF4p5_MODE) { + device->trx_write_func = trx_eth_write_udp_IF4p5; + device->trx_read_func = trx_eth_read_udp_IF4p5; + device->trx_ctlsend_func = trx_eth_ctlsend_udp; + device->trx_ctlrecv_func = trx_eth_ctlrecv_udp; + } else if (eth->flags == ETH_RAW_IF5_MOBIPASS) { + device->trx_write_func = trx_eth_write_raw_IF4p5; + device->trx_read_func = trx_eth_read_raw_IF5_mobipass; + } else { + //device->trx_write_func = trx_eth_write_udp_IF4p5; + //device->trx_read_func = trx_eth_read_udp_IF4p5; } - - eth->if_name[device->Mod_id] = eth_params->local_if_name; + + eth->if_name = eth_params->local_if_name; device->priv = eth; /* device specific */ - openair0_cfg[0].txlaunch_wait = 0;//manage when TX processing is triggered - openair0_cfg[0].txlaunch_wait_slotcount = 0; //manage when TX processing is triggered - openair0_cfg[0].iq_rxrescale = 15;//rescale iqs - openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift - openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance; + // openair0_cfg[0].iq_rxrescale = 15;//rescale iqs + // openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift + // openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance; - /* RRH does not have any information to make this configuration atm */ - if (device->host_type == BBU_HOST) { - /*Note scheduling advance values valid only for case 7680000 */ + /* RRU does not have any information to make this configuration atm */ + /* + if (device->host_type == RAU_HOST) { + switch ((int)openair0_cfg[0].sample_rate) { case 30720000: - openair0_cfg[0].samples_per_packet = 4096; + openair0_cfg[0].samples_per_packet = 3840; break; case 23040000: - openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].samples_per_packet = 2880; break; case 15360000: - openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].samples_per_packet = 1920; break; case 7680000: - openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].samples_per_packet = 960; break; case 1920000: - openair0_cfg[0].samples_per_packet = 256; + openair0_cfg[0].samples_per_packet = 240; break; default: printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); exit(-1); break; } - openair0_cfg[0].tx_scheduling_advance = eth_params->tx_scheduling_advance*openair0_cfg[0].samples_per_packet; - } - + }*/ + device->openair0_cfg=&openair0_cfg[0]; return 0; } @@ -384,87 +470,85 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth * DEBUGING-RELATED FUNCTIONS * **************************************************************************************************************************/ void dump_packet(char *title, unsigned char* pkt, int bytes, unsigned int tx_rx_flag) { - - static int numSend = 1; - static int numRecv = 1; - int num, k; - char tmp[48]; - unsigned short int cksum; - - num = (tx_rx_flag)? numSend++:numRecv++; - for (k = 0; k < 24; k++) sprintf(tmp+k, "%02X", pkt[k]); - cksum = calc_csum((unsigned short *)pkt, bytes>>2); - printf("%s-%s (%06d): %s 0x%04X\n", title,(tx_rx_flag)? "TX":"RX", num, tmp, cksum); + + static int numSend = 1; + static int numRecv = 1; + int num, k; + char tmp[48]; + unsigned short int cksum; + + num = (tx_rx_flag)? numSend++:numRecv++; + for (k = 0; k < 24; k++) sprintf(tmp+k, "%02X", pkt[k]); + cksum = calc_csum((unsigned short *)pkt, bytes>>2); + printf("%s-%s (%06d): %s 0x%04X\n", title,(tx_rx_flag)? "TX":"RX", num, tmp, cksum); } unsigned short calc_csum (unsigned short *buf, int nwords) { - - unsigned long sum; - for (sum = 0; nwords > 0; nwords--) - sum += *buf++; - sum = (sum >> 16) + (sum & 0xffff); - sum += (sum >> 16); - return ~sum; + + unsigned long sum; + for (sum = 0; nwords > 0; nwords--) + sum += *buf++; + sum = (sum >> 16) + (sum & 0xffff); + sum += (sum >> 16); + return ~sum; } void dump_dev(openair0_device *device) { - eth_state_t *eth = (eth_state_t*)device->priv; - - printf("Ethernet device interface %i configuration:\n" ,device->openair0_cfg->Mod_id); - printf(" Log level is %i :\n" ,device->openair0_cfg->log_level); - printf(" RB number: %i, sample rate: %lf \n" , - device->openair0_cfg->num_rb_dl, device->openair0_cfg->sample_rate); - printf(" Scheduling_advance: %i, Sample_advance: %u \n" , - device->openair0_cfg->tx_scheduling_advance, device->openair0_cfg->tx_sample_advance); - printf(" BBU configured for %i tx/%i rx channels)\n", - device->openair0_cfg->tx_num_channels,device->openair0_cfg->rx_num_channels); - printf(" Running flags: %s %s %s\n", - ((eth->flags & ETH_RAW_MODE) ? "RAW socket mode - ":""), - ((eth->flags & ETH_UDP_MODE) ? "UDP socket mode - ":"")); - printf(" Number of iqs dumped when displaying packets: %i\n\n",eth->iqdumpcnt); - + eth_state_t *eth = (eth_state_t*)device->priv; + + printf("Ethernet device interface %i configuration:\n" ,device->openair0_cfg->Mod_id); + printf(" Log level is %i :\n" ,device->openair0_cfg->log_level); + printf(" RB number: %i, sample rate: %lf \n" , + device->openair0_cfg->num_rb_dl, device->openair0_cfg->sample_rate); + printf(" RAU configured for %i tx/%i rx channels)\n", + device->openair0_cfg->tx_num_channels,device->openair0_cfg->rx_num_channels); + printf(" Running flags: %s %s (\n", + ((eth->flags & ETH_RAW_MODE) ? "RAW socket mode - ":""), + ((eth->flags & ETH_UDP_MODE) ? "UDP socket mode - ":"")); + printf(" Number of iqs dumped when displaying packets: %i\n\n",eth->iqdumpcnt); + } void inline dump_txcounters(openair0_device *device) { - eth_state_t *eth = (eth_state_t*)device->priv; - printf(" Ethernet device interface %i, tx counters:\n" ,device->openair0_cfg->Mod_id); - printf(" Sent packets: %llu send errors: %i\n", eth->tx_count, eth->num_tx_errors); + eth_state_t *eth = (eth_state_t*)device->priv; + printf(" Ethernet device interface %i, tx counters:\n" ,device->openair0_cfg->Mod_id); + printf(" Sent packets: %llu send errors: %i\n", (long long unsigned int)eth->tx_count, eth->num_tx_errors); } void inline dump_rxcounters(openair0_device *device) { - eth_state_t *eth = (eth_state_t*)device->priv; - printf(" Ethernet device interface %i rx counters:\n" ,device->openair0_cfg->Mod_id); - printf(" Received packets: %llu missed packets errors: %i\n", eth->rx_count, eth->num_underflows); -} + eth_state_t *eth = (eth_state_t*)device->priv; + printf(" Ethernet device interface %i rx counters:\n" ,device->openair0_cfg->Mod_id); + printf(" Received packets: %llu missed packets errors: %i\n", (long long unsigned int)eth->rx_count, eth->num_underflows); +} void inline dump_buff(openair0_device *device, char *buff,unsigned int tx_rx_flag, int nsamps) { - - char *strptr; - eth_state_t *eth = (eth_state_t*)device->priv; - /*need to add ts number of iqs in printf need to fix dump iqs call */ - strptr = (( tx_rx_flag == TX_FLAG) ? "TX" : "RX"); - printf("\n %s, nsamps=%i \n" ,strptr,nsamps); - - if (tx_rx_flag == 1) { - dump_txcounters(device); - printf(" First %i iqs of TX buffer\n",eth->iqdumpcnt); - dump_iqs(buff,eth->iqdumpcnt); - } else { - dump_rxcounters(device); - printf(" First %i iqs of RX buffer\n",eth->iqdumpcnt); - dump_iqs(buff,eth->iqdumpcnt); - } - + + char *strptr; + eth_state_t *eth = (eth_state_t*)device->priv; + /*need to add ts number of iqs in printf need to fix dump iqs call */ + strptr = (( tx_rx_flag == TX_FLAG) ? "TX" : "RX"); + printf("\n %s, nsamps=%i \n" ,strptr,nsamps); + + if (tx_rx_flag == 1) { + dump_txcounters(device); + printf(" First %i iqs of TX buffer\n",eth->iqdumpcnt); + dump_iqs(buff,eth->iqdumpcnt); + } else { + dump_rxcounters(device); + printf(" First %i iqs of RX buffer\n",eth->iqdumpcnt); + dump_iqs(buff,eth->iqdumpcnt); + } + } void dump_iqs(char * buff, int iq_cnt) { - int i; - for (i=0;i. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file ethernet_lib.h * \brief API to stream I/Q samples over standard ethernet * \author Katerina Trilyraki, Navid Nikaein @@ -52,35 +45,51 @@ #define MAX_INST 4 #define DEFAULT_IF "lo" -#define ETH_RAW_MODE 1 -#define ETH_UDP_MODE 0 - #define TX_FLAG 1 #define RX_FLAG 0 -#define MAX_PACKET_SEQ_NUM(spp,spf) (spf/spp) -#define MAC_HEADER_SIZE_BYTES (sizeof(struct ether_header)) +#include "if_defs.h" #define APP_HEADER_SIZE_BYTES (sizeof(int32_t) + sizeof(openair0_timestamp)) -#define PAYLOAD_SIZE_BYTES(nsamps) (nsamps<<2) -#define UDP_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) -#define RAW_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) - /*!\brief opaque ethernet data structure */ typedef struct { - /*!\brief socket file desc */ - int sockfd[MAX_INST]; + /*!\brief socket file desc (control)*/ + int sockfdc; + /*!\brief socket file desc (user)*/ + int sockfdd; /*!\brief interface name */ - char *if_name[MAX_INST]; + char *if_name; /*!\brief buffer size */ unsigned int buffer_size; + /*!\brief destination address (control) for UDP socket*/ + struct sockaddr_in dest_addrc; + /*!\brief local address (control) for UDP socket*/ + struct sockaddr_in local_addrc; + /*!\brief destination address (user) for UDP socket*/ + struct sockaddr_in dest_addrd; + /*!\brief local address (user) for UDP socket*/ + struct sockaddr_in local_addrd; + /*!\brief address length for both UDP and RAW socket*/ + int addr_len; + /*!\brief destination address (control) for RAW socket*/ + struct sockaddr_ll dest_addrc_ll; + /*!\brief local address (control) for RAW socket*/ + struct sockaddr_ll local_addrc_ll; + /*!\brief destination address (user) for RAW socket*/ + struct sockaddr_ll dest_addrd_ll; + /*!\brief local address (user) for RAW socket*/ + struct sockaddr_ll local_addrd_ll; + /*!\brief inteface index for RAW socket*/ + struct ifreq if_index; /*!\brief timeout ms */ unsigned int rx_timeout_ms; /*!\brief timeout ms */ unsigned int tx_timeout_ms; /*!\brief runtime flags */ uint32_t flags; + /*!\compression enalbe */ + uint32_t compression; /*!\ time offset between transmiter timestamp and receiver timestamp */ double tdiff; /*!\ calibration */ @@ -101,7 +110,7 @@ typedef struct { int num_seq_errors; /*!\brief number of errors in interface's receiver */ int num_rx_errors; - /*!\brief umber of errors in interface's transmitter */ + /*!\brief number of errors in interface's transmitter */ int num_tx_errors; /*!\brief current TX timestamp */ @@ -120,7 +129,16 @@ typedef struct { uint64_t tx_count; /*!\brief number of packets received */ uint64_t rx_count; - + /*!\brief TX sequence number*/ + uint16_t pck_seq_num; + /*!\brief Current RX sequence number*/ + uint16_t pck_seq_num_cur; + /*!\brief Previous RX sequence number */ + uint16_t pck_seq_num_prev; + /*!\brief precomputed ethernet header (control) */ + struct ether_header ehc; + /*!\brief precomputed ethernet header (data) */ + struct ether_header ehd; } eth_state_t; @@ -156,9 +174,14 @@ typedef enum { COALESCE_PAR, /*!\brief pause parameters of ethernet device */ PAUSE_PAR, + /*!\brief kernel network receive buffer maximun size */ + KERNEL_RCV_BUF_MAX_SIZE, + /*!\brief kernel network send buffer maximun size */ + KERNEL_SND_BUF_MAX_SIZE, MAX_OPT } eth_opt_t; + /* #define SND_BUF_SIZE 1 #define RCV_BUF_SIZE 1<<1 @@ -182,9 +205,10 @@ typedef struct { void dump_packet(char *title, unsigned char* pkt, int bytes, unsigned int tx_rx_flag); unsigned short calc_csum (unsigned short *buf, int nwords); void dump_dev(openair0_device *device); -void inline dump_buff(openair0_device *device, char *buff,unsigned int tx_rx_flag,int nsamps); +/*void inline dump_buff(openair0_device *device, char *buff,unsigned int tx_rx_flag,int nsamps); void inline dump_rxcounters(openair0_device *device); void inline dump_txcounters(openair0_device *device); +*/ void dump_iqs(char * buff, int iq_cnt); @@ -212,22 +236,22 @@ int ethernet_tune(openair0_device *device, unsigned int option, int value); int eth_socket_init_udp(openair0_device *device); int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); -int eth_get_dev_conf_udp(openair0_device *device); -/*! \fn static int eth_set_dev_conf_udp(openair0_device *device) -* \brief -* \param[in] *device openair device -* \param[out] -* \return 0 on success, otherwise -1 -* \note -* @ingroup _oai -*/ -int eth_set_dev_conf_udp(openair0_device *device); + int eth_socket_init_raw(openair0_device *device); int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); +int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); +int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); +int trx_eth_read_raw_IF5_mobipass(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); +int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); +int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); +int trx_eth_ctlsend_udp(openair0_device *device, void *msg, ssize_t msg_len); +int trx_eth_ctlrecv_udp(openair0_device *device, void *msg, ssize_t msg_len); + int eth_get_dev_conf_raw(openair0_device *device); int eth_set_dev_conf_raw(openair0_device *device); - +int eth_get_dev_conf_raw_IF4p5(openair0_device *device); +int eth_set_dev_conf_raw_IF4p5(openair0_device *device); #endif diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h new file mode 100644 index 0000000000..95d0029027 --- /dev/null +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -0,0 +1,86 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +* \brief +* \author S. Sandeep Kumar, Raymond Knopp +* \date 2016 +* \version 0.1 +* \company Eurecom +* \email: ee13b1025@iith.ac.in, knopp@eurecom.fr +* \note +* \warning +*/ + +#include +#include + +#include "PHY/LTE_TRANSPORT/if4_tools.h" +#include "PHY/LTE_TRANSPORT/if5_tools.h" + +// ETH transport preference modes +#ifdef OCP_FRAMEWORK +#include "enums.h" +#else +#define ETH_UDP_MODE 0 +#define ETH_RAW_MODE 1 +#define ETH_UDP_IF4p5_MODE 2 +#define ETH_RAW_IF4p5_MODE 3 +#define ETH_RAW_IF5_MOBIPASS 4 +#endif + +// COMMOM HEADER LENGTHS + +#define NO_COMPRESS 0 +#define ALAW_COMPRESS 1 + +#define UDP_HEADER_SIZE_BYTES 8 +#define IPV4_HEADER_SIZE_BYTES 60 // This is the maximum IPv4 header length + +// Time domain RRH packet sizes +#define MAC_HEADER_SIZE_BYTES (sizeof(struct ether_header)) +#define MAX_PACKET_SEQ_NUM(spp,spf) (spf/spp) +#define PAYLOAD_SIZE_BYTES(nsamps) (nsamps<<2) +#define UDP_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) +#define RAW_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) + +#define PAYLOAD_SIZE_BYTES_ALAW(nsamps) (nsamps<<1) +#define UDP_PACKET_SIZE_BYTES_ALAW(nsamps) (APP_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES_ALAW(nsamps)) +#define RAW_PACKET_SIZE_BYTES_ALAW(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES_ALAW(nsamps)) + +// Packet sizes for IF4p5 interface format +#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(uint16_t)*scaled_nblocks) +#define PRACH_NUM_SAMPLES (839*2) +#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*PRACH_NUM_SAMPLES) + +#define RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4p5_PULTICK_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t) +#define RAW_IF4p5_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + PRACH_BLOCK_SIZE_BYTES) +#define UDP_IF4p5_PDLFFT_SIZE_BYTES(nblocks) (UDP_HEADER_SIZE_BYTES + IPV4_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define UDP_IF4p5_PULFFT_SIZE_BYTES(nblocks) (UDP_HEADER_SIZE_BYTES + IPV4_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define UDP_IF4p5_PULTICK_SIZE_BYTES (UDP_HEADER_SIZE_BYTES + IPV4_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t) +#define UDP_IF4p5_PRACH_SIZE_BYTES (UDP_HEADER_SIZE_BYTES + IPV4_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + PRACH_BLOCK_SIZE_BYTES) + +// Mobipass packet sizes +#define RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES 1280 +#define RAW_IF5_MOBIPASS_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES) +#define PAYLOAD_MOBIPASS_NUM_SAMPLES 640 diff --git a/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.cfi b/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.cfi index a4f200dfc2..f49f521e91 100644 --- a/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.cfi +++ b/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.cfi @@ -1,11 +1,11 @@ -# PROMGEN: Xilinx Prom Generator P.20131013 -# Copyright (c) 1995-2013 Xilinx, Inc. All rights reserved. +# PROMGEN: Xilinx Prom Generator O.76xd +# Copyright (c) 1995-2011 Xilinx, Inc. All rights reserved. -SOFTWARE_VERSION P.20131013 -DATE 6/16/2015 - 16:10 -SOURCE /homes/maatalla/openair/openair0/express-mimo2/backup_houssem/express-mimo2/grlib-gpl-1.1.0-b4113/designs/express-mimo2/exmimo2_prom.mcs +SOFTWARE_VERSION O.76xd +DATE 1/ 3/2017 - 11:49 +SOURCE /homes/kaltenbe/Devel/openair/openairinterface5g/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.mcs DEVICE 8192K DATA_WIDTH 4 FILL_DATA 0xFF -SIGNATURE 0x41521D58 +SIGNATURE 0x416AB633 START_ADDRESS 0x00000000 END_ADDRESS 0x00406577 DIRECTION_UP "express-mimo2.bit" 6slx150tfgg900 diff --git a/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.mcs b/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.mcs index 8cbd9481a3..8bc7817f09 100644 --- a/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.mcs +++ b/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.mcs @@ -17,8 +17,8 @@ :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF :1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000201CC -:1001300000000000000000000000000000000000BF +:10012000000000000000000000000000000082014C +:1001300000008001004000000000000000000000FE :1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F :10016000000000000000000000000000000000008F @@ -26,7 +26,7 @@ :10018000000000000000000000000000000000006F :10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F -:1001B000208200000000000000000000000000009D +:1001B00000920000000000000000000000000000AD :1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F @@ -34,7 +34,7 @@ :1002000000000000000000000000000000000000EE :1002100000000000000000000000000000000000DE :1002200000000000000000000000000000000000CE -:1002300000000800000000000000000000000000B6 +:100230000000080000000000002000000000000096 :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E @@ -43,12 +43,12 @@ :10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E -:1002C0000000000000000000080B03000000000018 +:1002C0002800000000000000080B030000000000F0 :1002D000000000000000000000000000000000001E :1002E000000000000000000000000000000000000E -:1002F00000000000000000000000000000000000FE -:10030000200020000000000020000000200000006D -:1003100020000000000000000000000000000000BD +:1002F00000000000000000000000200000000000DE +:10030000000020002000000000000000200000008D +:1003100000000000000000000000000000000000DD :1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD @@ -63,9 +63,9 @@ :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD -:1004000000000000000010020000000000000000DA +:1004000000000000000040080000000000000000A4 :1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000001002BA +:100420000000000000000000000000000000400884 :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000100200000000000000000000000000008A @@ -82,7 +82,7 @@ :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB :1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB +:1005300000000000000000000000000000030000B8 :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B @@ -95,10 +95,10 @@ :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB -:10060000000000000000000000000000C00000002A -:100610000000000000008400000000000000000056 -:1006200000000000000000000000000000000000CA -:100630000000C0000800A000000000000000000052 +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:100620000000000000000000000000000000A0002A +:10063000A00000000000A000A000000000000000DA :1006400000000000000000000000000000000000AA :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A @@ -111,10 +111,10 @@ :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA -:1007000000000000000000000000080000000000E1 -:100710000000000000000000000000000000900049 -:100720008200000000000000000000000000000047 -:1007300008000000000000000000000000000000B1 +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000800000000000000D1 +:1007200000000000000004000011000000000004B0 +:1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 @@ -123,15 +123,15 @@ :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 -:1007C0000000080000000000000000000000000021 +:1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000000000D8 -:1008200008000000000008000000000000000000B8 -:1008300000000000000008000000000000000000B0 -:1008400008000000000000000000000000000000A0 +:1008100000000000000000000000000000000800D0 +:100820000800C0000000A000000000000000080058 +:10083000C0000000000008000800000000000000E8 +:10084000080000000000820000000000000000001E :100850000000000000000000000000000000000098 :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 @@ -148,31 +148,31 @@ :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 -:100950004000000000000000000000000000000057 +:100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000324 +:1009C0000000000000000000000000000000000027 :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 -:100A30008000800000000040000000000000000076 +:100A300080008000000000110000000000000000A5 :100A400000000000000000000000000000000000A6 -:100A50000000000080000000000300000000000013 +:100A50000000000080000000000500000000000011 :100A60000000000000000000000000000000000086 :100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 -:100AB0000000020002000000000000000000000032 +:100AB0000000100004000000000000000000000022 :100AC0000000000000000000000000000000000026 -:100AD00000000000C0008200000000410000000093 +:100AD0000000000040008200000000400000000014 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 @@ -196,8 +196,8 @@ :100C200000000000000000000000000000000000C4 :100C300000000000000000000005000000000500AA :100C400000000000000000000000000000000000A4 -:100C5000000000000000000000020005004000004D -:100C60000300000000000000000000000000000081 +:100C5000000000000000000000020005000000008D +:100C60004000000000000000000000000000000044 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 @@ -205,15 +205,15 @@ :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 :100CD0000000000000000000000000000000000014 -:100CE0000000010000000000000000000000000003 +:100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 -:100D30000000000000000000000000008181005061 -:100D40000A00900900000000000000000000000000 +:100D30000000000000000000000000008181009021 +:100D40000900C8430000000000000000000000008F :100D50000000000000000000000000000000818191 -:100D600000500A0090090000000000000000000090 +:100D600000900900C84300000000000000000000DF :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 @@ -235,17 +235,17 @@ :100E90000000000000000000000000000000000052 :100EA0000000000000000000000002000000000040 :100EB00000400000000000000000000000000000F2 -:100EC00000000040032004C00200000000000000F9 +:100EC00000000040030810C0020000000000000005 :100ED00000000200000000000040000000000000D0 -:100EE000000000000040032004C0020000000000D9 +:100EE000000000000040030810C0020000000000E5 :100EF00000000000020000000000004000000000B0 :100F000000000000000000000000000000000000E1 :100F10000000004000000000000000000000000091 :100F20000000310000000000000000000000000090 :100F300000000000000000000000000000000000B1 -:100F40000000000008020020040040100000000023 +:100F4000000000000802000810004010000000002F :100F50000000000000000000000000000000000091 -:100F60000000000000000802002004004010000003 +:100F6000000000000000080200081000401000000F :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 :100F90000000000000000000000000000000000051 @@ -331,7 +331,7 @@ :10149000000000000000000000000000000000004C :1014A000000000000000000000000000000000003C :1014B000000000000000000000000000000000002C -:1014C0000000000000000000080000000000000014 +:1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C :1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC @@ -364,8 +364,8 @@ :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A :1016C000000000000000000000000000000000001A -:1016D0000000000000000000000000000004000006 -:1016E00000000000000000000000000000000000FA +:1016D000000000000000000000000000000000000A +:1016E00000000000000009000000000000000000F1 :1016F00000000000000000000000000000000000EA :1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 @@ -443,7 +443,7 @@ :101B90000000000000020000000000000000000043 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 +:101BC0000000000000000000000000000000001005 :101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 :101BF00000000000000000000000000000000000E5 @@ -452,7 +452,7 @@ :101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 :101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 +:101C50000001000000000000000000000000000083 :101C60000000000000000000000000000000000074 :101C70000000000000000000000000000000000064 :101C80000000000000000000000000000000000054 @@ -460,7 +460,7 @@ :101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 :101CC0000000000000000000000000000000000014 -:101CD00000004100000000000007000000000000BC +:101CD000000081000000000000070000000000007C :101CE00000000000000000000000000000000000F4 :101CF00000000000000000000000000000000000E4 :101D000000000000000000000000000000000000D3 @@ -534,11 +534,11 @@ :10214000000000000000000000000000000000008F :10215000000000000000000000000000000000007F :10216000000000000000000000000040000000002F -:10217000000000000000000000000000000000005F +:1021700040000000200000000000000000000000FF :10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F +:10219000000000002000000000000000000000001F :1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F +:1021B00000000000000020000000000000000000FF :1021C000000000000000000000000000000000000F :1021D00000000000000000000000000000000000FF :1021E00000000000000000000000000000000000EF @@ -566,10 +566,10 @@ :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D :10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D +:102370000000000004000000000000000000000059 :10238000000000000000000000000000000000004D :10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D +:1023A000A00000000000000000000000000000008D :1023B000000000000000000000000000000000001D :1023C000000000000000000000000000000000000D :1023D00000000000000000000000000000000000FD @@ -589,7 +589,7 @@ :1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C :1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC +:1024E00000000800000000000000000000000000E4 :1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB @@ -609,15 +609,15 @@ :1025F00000000000000000000000000000000000DB :1026000000000000000000000000000000000000CA :1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA +:10262000100000000000000000000000000000009A :10263000000000000000000000000000000000009A :10264000000000000000000000000000000000008A :10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A -:102670000000000000000000000000000004000056 +:102670000000000000000000030000000000000057 :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A +:1026A0000000000008000000000000000000000022 :1026B000000000000000000000000000000000001A :1026C000000000000000000000000000000000000A :1026D00000000000000000000000000000000000FA @@ -818,8 +818,8 @@ :1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D -:10333000000082000000000000000000000000000B -:103340000000000000000000000000000000040079 +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D :10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D @@ -989,39 +989,39 @@ :103DB0000000000000000000000000000000000003 :103DC00000000000000000000000000000000000F3 :103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 -:103DF0000000000020000000000020000000000083 -:103E000000000000000000000000000000000000B2 -:103E10000000000020000000000020000002000060 -:103E20000000000000000000000000000000000092 -:103E30000000000000002000000000002000000042 +:103DE0000000000000000000200000002000000093 +:103DF00000002000000000000000000000000000A3 +:103E00000000000000000000200000002000000072 +:103E10000000200000000000000000000002000080 +:103E20000000000000000000000020000000000072 +:103E30000000000000000000000000000000000082 :103E40000000000000000000000000000000000072 :103E50000000000000000000000000000000000062 :103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 +:103E700040000000000000000000000000000040C2 :103E80000000000000000000000000000000000032 :103E90000000000000000000000000000000000022 :103EA0000000000000000000000000000000000012 :103EB0000000000000000000000000000000000002 :103EC00000000000000000000000000000000000F2 :103ED00000000000000000000000000000000000E2 -:103EE0000000000000000000000000000000004092 -:103EF00000000000000000000000000000000000C2 +:103EE00000000000000000000000000000000200D0 +:103EF00000000000000008000000000000000000BA :103F000000000000000000000000000000000000B1 -:103F10000000000000000040000000000000000061 +:103F1000000000000000021000000000000000008F :103F20000000000000000000000000000000000091 -:103F30000000000000000000004000000000000041 +:103F3000000000000000000002000000000000007F :103F40000000000000000000000000000000000071 -:103F50000040000000000000000000000000000021 +:103F5000020000000000000000000000000000005F :103F60000000000000000000000000000000000051 -:103F70000000000000000000001000000000000031 +:103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 -:103F90000000000000000000001000000000000011 +:103F90000000000000000000000000000000000021 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 :103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 +:103FE00000000000000000000000000000200000B1 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 @@ -1029,7 +1029,7 @@ :104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 :104050000000000000000000000000000000000060 -:1040600000000000C0000000000000000000000090 +:104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 :104080000000000000000000000000000000000030 :104090000000000000000000000000000000000020 @@ -1043,15 +1043,15 @@ :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F :10413000000000000000000000000000000000007F -:1041400000000000000000000000840000000000EB -:10415000000000000000000000000000000000005F -:104160000000000000000000080000000000000047 +:104140000000A000000000000000000000000000CF +:104150000000000000000800000000000000000057 +:10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F -:104180000008000000000000000000000000000027 +:10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F :1041A000000000000000000000000000000000000F :1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF +:1041C00000000800000000000000000000000000E7 :1041D00000000000000000000000000000000000DF :1041E00000000000000000000000000000000000CF :1041F00000000000000000000000000000000000BF @@ -1060,8 +1060,8 @@ :10422000000000000000000000000000000000008E :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E -:10425000000000000000A00000000000000040007E -:104260000000000000000800000000000000000046 +:1042500000000000000082000000080000000000D4 +:10426000400000000000000000000000000000000E :10427000000000000000000000000000000000003E :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E @@ -1075,9 +1075,9 @@ :10431000000000000000000000000000000000009D :10432000000000000000000000000000000000008D :10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:1043500000008400000000000000000000000000D9 -:1043600000008200000000000000000000000000CB +:104340000000080000000000000000000000000065 +:104350000000000000000000000000000000080055 +:10436000000000000000000000000000000000004D :10437000000000000000000000000000000000003D :10438000000000000000000000000000000000002D :10439000000000000000000000000000000000001D @@ -1101,8 +1101,8 @@ :1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC :1044D00000000000000000000000000000000000DC -:1044E00000000000000000000800000000000000C4 -:1044F00000000000000000000000000000000000BC +:1044E00000000000000000000000000000000000CC +:1044F00003000000000000000000000000000000B9 :1045000000000000000000000000000000000000AB :10451000000000000000000000000000000000009B :10452000000000000000000000000000000000008B @@ -1110,23 +1110,23 @@ :10454000000000000000000000000000000000006B :10455000000000000000000000000000000000005B :10456000000000000000000000000000000000004B -:104570000020000000000000000900000000000012 +:104570000003000000000000002000000000000018 :10458000000000000000000000000000000000002B :10459000000000000000000000000000000000001B :1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB :1045C00000000000000000000000000000000000EB :1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000020000000AB -:1045F00000000000020000000000000000000000B9 +:1045E000000000000000000000000000900000003B +:1045F000000000002000000000000000000000009B :1046000000000000000000000000000000000000AA :10461000000000000000000000000000000000009A :10462000000000000000000000000000000000008A :10463000000000000000000000000000000000007A :10464000000000000000000000000000000000006A :10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000400A -:104670000000000000000004000002000000000034 +:104660000000000000000000000000000000000248 +:1046700000000000000000400000400000000300B7 :10468000000000000000000000000000000000002A :10469000000000000000000000000000000000001A :1046A000000000000000000000000000000000000A @@ -1134,7 +1134,7 @@ :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA :1046E00000000000000000000000000000000000CA -:1046F00000000000000000000080000080000000BA +:1046F00000800000000000000080000000000000BA :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 @@ -1142,7 +1142,7 @@ :104740000002000000000000000000000000000067 :104750000000000000000000000000000000000059 :104760000000000000000000000000000000000049 -:104770000000000000000080000000050000008034 +:1047700000000008000000800000004100000080F0 :104780000000000000000000000000000000000029 :104790000000000000000000000000000000000019 :1047A0000000000000000000000000000000000009 @@ -1150,7 +1150,7 @@ :1047C00000000000000000000000000000000000E9 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000002000000000000B7 +:1047F00000000000000000000004000000000000B5 :104800000040000000000000000000000000000068 :104810000000000000000000000000000000000098 :104820000000000000000000000000000000000088 @@ -1158,7 +1158,7 @@ :104840000000000000000000000000000000000068 :104850000000000000000000000000000000000058 :104860000000000000000000000000000000000048 -:10487000000000000000884100000000E0078421E3 +:10487000000000000000818100000000E007884186 :1048800000000000E0070000000000000000000041 :104890000000000000000000000000000000000018 :1048A0000000000000000000000000000000000008 @@ -1233,11 +1233,11 @@ :104CF00000000000000000000000000000000000B4 :104D000000000000000000000000000000000000A3 :104D10000000000000000000000000000000000093 -:104D20002000200000000000000000000000000043 -:104D30002000000000000000000000000000000053 -:104D40002000200000000000000000000000000023 -:104D50002000000000000000000000000000000033 -:104D60000000000000000000000000000000000043 +:104D20002000000000000000200000000000000043 +:104D30000000000000002000000000000000000053 +:104D40002000000000000000000000000000000043 +:104D500000000000000020000000880000000000AB +:104D60000000200000000000000000000000000023 :104D70000000000000000000000000000000000033 :104D80000000000000000000000000000000000023 :104D90000000000000000000000000000000000013 @@ -1257,7 +1257,7 @@ :104E70000000000000000000000000000000000032 :104E80000000000000000000000000000000000022 :104E900000000000000002000000000000400000D0 -:104EA000000000000000000000000000008800007A +:104EA0000000000000000000000000000000000002 :104EB00000000000000000000000000000000000F2 :104EC00000000000000000000000000000000000E2 :104ED00000000000000000000000000000000000D2 @@ -1278,16 +1278,16 @@ :104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000008000000A9 -:10500000000000000000000000000000030000009D -:10501000000003000000000000000000000000008D +:104FF00000000000000000000000000000000000B1 +:1050000000000000000000000000000000000000A0 +:10501000000000002100000000000300000000006C :105020000000000000000000000000000000000080 :105030000000000000000000000000000000000070 :105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 +:105050000000000008000000000000000000000048 :105060000000000000000000000000000000000040 -:105070000000000000000000000000000000C00070 -:1050800000000000C0000000000000000000000060 +:105070000000000000000000000000000000000030 +:10508000000000004000080000000000A000000038 :105090000000000000000000000000000000000010 :1050A0000000000000000000000000000000000000 :1050B00000000000000000000000000000000000F0 @@ -1302,10 +1302,10 @@ :10514000000000000000000000000000000000005F :10515000000000000000000000000000000000004F :10516000000000000000000000000000000000003F -:1051700000000000000000000000A000A0000000EF +:10517000000000000000000000000000000000002F :10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF +:10519000000000000000000000008200000000008D +:1051A00000000000000000110000000000000000EE :1051B00000000000000000000000000000000000EF :1051C00000000000000000000000000000000000DF :1051D00000000000000000000000000000000000CF @@ -1313,14 +1313,14 @@ :1051F00000000000000000000000000000000000AF :10520000000000000000000000000000000000009E :10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E +:10522000000021000000000000000000000000005D +:10523000000000020000000000000000000000006C :10524000000000000000000000000000000000005E :10525000000000000000000000000000000000004E :10526000000000000000000000000000000000003E -:10527000000000000000080008000000000000001E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E +:10527000000000000000000000000000000000002E +:105280000000000000000000000000000800000016 +:105290000000000000000800000000008200000084 :1052A00000000000000000000000000000000000FE :1052B00000000000000000000000000000000000EE :1052C00000000000000000000000000000000000DE @@ -1353,16 +1353,16 @@ :10547000000000000000000000000000000000002C :10548000000000000000000000000000000000001C :10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000200000DC -:1054B00000000000002000000000000000000000CC +:1054A000000000000000000000000000002080005C +:1054B00000000000000300000000000000000000E9 :1054C00000000000000000000000000000000000DC :1054D00000000000000000000000000000000000CC :1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC :10550000000000000000000000000000000000009B :10551000000000000000000000000000000000008B -:1055200000000000000000009000000000000000EB -:10553000200000000000000000000000000000004B +:10552000000000000000000020000000000000005B +:10553000100000000000000000000000000000005B :10554000000000000000000000000000000000005B :10555000000000000000000000000000000000004B :10556000000000000000000000000000000000003B @@ -1484,16 +1484,16 @@ :105CA00000000000000000000000000000000000F4 :105CB00000000000000000000000000000000000E4 :105CC00000000000000000000000000000000000D4 -:105CD0000000000000002000000000000000200084 -:105CE0000000000000002000000000000000000094 -:105CF0000000000020002000000000000000200044 -:105D00000000000000002000000000000000000073 -:105D10000000000020000000200000000000000043 +:105CD00000000000000000000000000000002000A4 +:105CE0000000000000000000000000000000200094 +:105CF0000000200000000000000000000000200064 +:105D00000000000000000000000000000000200073 +:105D10000000200000000000000000000000000063 :105D20002000000000000000000000000000000053 -:105D30000000000000000000000000000000000063 +:105D30000000000020000000000000000000000043 :105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D60000000000000000000000000000000000033 +:105D50000000000000000000000040000000000003 +:105D60000000000000000000000010000000000023 :105D70000000000000000000000000000000000023 :105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 @@ -1503,43 +1503,43 @@ :105DD00000000000000000000000000000000000C3 :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 +:105E00000010000000000000000000000000000082 :105E10000000000000000000000000000000000082 :105E20000000000000000000000000000000000072 :105E30000000000000000000000000000000000062 :105E40000000000000000000000000000000000052 :105E50000000000000000000000000000000000042 -:105E6000000000080000000000000000000000002A -:105E70000000008400000000000000080000000096 -:105E80000000001000000000000000000000000002 -:105E900000000000000000000000000800000000FA -:105EA00000000000001000000000000000000000E2 -:105EB00000000000000000000000000000100000D2 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 :105EC00000000000000000000000000000000000D2 :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 :105EF00000000000000000000000000000000000A2 -:105F00000000000000080000000000000000000089 +:105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 :105F20000000000000000000000000000000000071 :105F30000000000000000000000000000000000061 :105F40000000000000000000000000000000000051 -:105F50004000000000000000000000000000000001 +:105F50000000400000000000000000000000000001 :105F60000000000000000000000000000000000031 :105F70000000000000000000000000000000000021 :105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 :105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD000030003000000000041000000000000007A +:105FC00000000000000000000000080000000000C9 +:105FD0004100000000000000000000000000000080 :105FE00000000000000000000000000000000000B1 :105FF00000000000000000000000000000000000A1 :106000000000000000000000000000000000000090 :106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 :106030000000000000000000000000000000000060 -:106040000000C000080000000000A00000000000E8 +:106040000000000000000000000000000000000050 :106050000000000000000000000000000000000040 :106060000000000000000000000000000000000030 :106070000000000000000000000000000000000020 @@ -1554,9 +1554,9 @@ :10610000000000000000000000000000000000008F :10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F -:106130000000000000000000080000000000000057 -:10614000000000000000000000000000000000004F -:106150000800000000000000000000000000000037 +:10613000000000000000000000000000000000005F +:106140000000000000000000A000000000000000AF +:10615000000000000000000000000000000000003F :10616000000000000000000000000000000000002F :10617000000000000000000000000000000000001F :10618000000000000000000000000000000000000F @@ -1565,13 +1565,13 @@ :1061B00000000000000000000000000000000000DF :1061C00000000000000000000000000000000000CF :1061D00000000000000000000000000000000000BF -:1061E00003000000000000000000000000000000AC +:1061E00000000000000008000000000000000000A7 :1061F000000000000000000000000000000000009F :10620000000000000000000000000000000000008E :10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E -:106240000000000000000000000008000000000046 +:106240000000000008000000000000000000000046 :10625000000000000000000000000000000000003E :10626000000000000000000000000000000000002E :10627000000000000000000000000000000000001E @@ -1680,16 +1680,16 @@ :1068E00000000000000000000000000000000000A8 :1068F0000000000000000000000000000000000098 :106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000000000000000000000000000057 -:106940000000000000000002000000000000000045 -:106950000000000000000000000000000000000037 +:106910000000000000000000000000002000000057 +:106920000000000020000000000000000000000047 +:106930000000000000000000000000002000000037 +:106940000000000020000002000000000000000025 +:106950000000000000000000000000000000200017 :106960000000000000000000000000000000000027 :106970000000000000000000000000000000008097 :106980000000000000000000000000000000000007 :1069900000000000000000000000000000000000F7 -:1069A00000000040000000000000000000000000A7 +:1069A00000000000000000000000000000000000E7 :1069B00000000000000000000000000000000000D7 :1069C00000000000000000000000000000000000C7 :1069D00000000000000000000000000000000000B7 @@ -1702,15 +1702,15 @@ :106A40000000000000000000000000000000000046 :106A50000000000000000000000000000000000036 :106A60000000000000000000000000000000000026 -:106A70000000000000000000000000100000000006 +:106A70000000000000000000000000000000000016 :106A800000000008000000000000000000000000FE :106A900000000000000000000000000000000000F6 :106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 +:106AB00000000000000000000000000800000000CE :106AC00000000000000000000000000000000000C6 -:106AD00000000000000000000000000000000000B6 +:106AD00000000000000000000000000000080000AE :106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 +:106AF0000000000000000000000000000010000086 :106B00000000000000010000000000000000000084 :106B10000000000000000000000000000000000075 :106B20000000000000000000000000000000000065 @@ -1742,9 +1742,9 @@ :106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 :106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 +:106CF000000000000800000000000000000000008C :106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 +:106D1000000000000000000000000000000500006E :106D20000000000000000000000000000000000063 :106D30000000000000000000000000000000000053 :106D40000000000000000000000000000000000043 @@ -1761,14 +1761,14 @@ :106DF0000000000000000000000000000000000093 :106E00000000000000000000000000000000000082 :106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 +:106E2000000000000000000000080000000000005A :106E30000000000000000000000000000000000052 :106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 :106E60000000000000000000000000000000000022 :106E70000000000000000000000000000000000012 :106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 +:106E900000000800000000000000000000000000EA :106EA00000000000000000000000000000000000E2 :106EB00000000000000000000000000000000000D2 :106EC00000000000000000000000000000000000C2 @@ -1792,7 +1792,7 @@ :106FE00000000000000000000000000000000000A1 :106FF0000000000000000000000000000000000091 :107000000000000000000000000000000000000080 -:107010000000000000000000000020000000000050 +:107010000000000000000000000000000000000070 :107020000000000000000000000000000000000060 :107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 @@ -1801,7 +1801,7 @@ :107070000000000000000000000000000000000010 :107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 -:1070A00000000020000000000000000000000000C0 +:1070A00000000005000000000000000000000000DB :1070B00000000000000000000000000000000000D0 :1070C00000000000000000000000000000000000C0 :1070D00000000000000000000000000000000000B0 @@ -1833,7 +1833,7 @@ :10727000000000000000000000000000000000000E :1072800000000000000000000000000000000000FE :1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE +:1072A00000000000002000000000000000000000BE :1072B00000000000000000000000000000000000CE :1072C00000000000000000000000000000000000BE :1072D00000000000000000000000000000000000AE @@ -1849,7 +1849,7 @@ :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED -:1073A0000000000000000007880000000000000747 +:1073A000000000000000000781000000000000074E :1073B00000000000000000000000000000000000CD :1073C00000000000000000000000000000000000BD :1073D00000000000000000000000000000000000AD @@ -1923,15 +1923,15 @@ :107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 :107830000000020000000000000000000000000046 -:107840000000000000000000000000000000000038 -:107850008800000000000000200000000000000080 -:1078600020000000000000000000000000000000F8 -:1078700020000000000000002000000000000000C8 -:1078800020000002000000000000000000000000D6 -:1078900000002000000000000000200000000000A8 +:107840000000000000000000000020000000000018 +:1078500040000000000000000000000000000000E8 +:1078600000000000000000000000200000000000F8 +:1078700020000000000000000000000000000000E8 +:1078800000000002000000000000000020000000D6 +:1078900000000000000000000000000000000000E8 :1078A00000000000000000000000000000000000D8 :1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 +:1078C00000000000000000000000000000020000B6 :1078D00000000000000000000000000000000000A8 :1078E0000000000000000000000000000000000098 :1078F0000000000000000000000000000000000088 @@ -1940,15 +1940,15 @@ :107920000000000000000000000000000000000057 :107930000000000000000000000000000000000047 :107940000000000000000000000000000000000037 -:107950000000000000000000000000000000000027 +:1079500000000000004000000000000000400000A7 :107960000000000000000000000000000000000017 -:107970000000000000000000000000000000000007 +:1079700000000000000000000000000000400000C7 :1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 +:1079900000000000000000000000000000000040A7 :1079A00000000000000000000000000000000000D7 -:1079B0000000000000000000000000000000C00007 +:1079B0000000000000000040000000000000000087 :1079C00000000000000000000000000000000000B7 -:1079D00000000000000000000000000000000000A7 +:1079D0000000000000000000000000000000001097 :1079E0000000000000000000000000000000000097 :1079F0000000000000000000000000000000000087 :107A00000000000000000000000000000000000076 @@ -1962,7 +1962,7 @@ :107A800000000000000000000000000000000000F6 :107A900000000000000000000000000000000000E6 :107AA00000000000000000000000000000000000D6 -:107AB0000000000000000000000000004000000086 +:107AB0000000000000000000000000000000400086 :107AC00000000000000000000000000000000000B6 :107AD00000000000000000000000000000000000A6 :107AE0000000000000000000000000000000000096 @@ -1970,22 +1970,22 @@ :107B00000000000000000000000000000000000075 :107B10000000000000000000000000000000000065 :107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000400005 -:107B4000000000000800000000000000000000002D +:107B30000000000000000000000000000000000045 +:107B400040000000000000000000000000000000F5 :107B50000000000000000000000000000000000025 :107B60000000000000000000000000000000000015 :107B70000000000000000000000000000000000005 :107B800000000000000000000000000000000000F5 :107B900000000000000000000000000000000000E5 :107BA00000000000000000000000000000000000D5 -:107BB000000000000000A000000000000000000025 +:107BB0000000000000004000000000000000000085 :107BC00000000000000000000000000000000000B5 :107BD00000000000000000000000000000000000A5 :107BE0000000000000000000000000000000000095 :107BF0000000000000000000000000000000000085 :107C00000000000000000000000000000000000074 :107C10000000000000000000000000000000000064 -:107C20000000000000000000000000000000000054 +:107C2000080000000000000000000000000000004C :107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 :107C50000000000000000000000000000000000024 @@ -1994,8 +1994,8 @@ :107C800000000000000000000000000000000000F4 :107C900000000000000000000000000000000000E4 :107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000800000000000000000000000000AC +:107CB00000000000000000000000000008000000BC +:107CC00000000000000000000000000000000000B4 :107CD00000000000000000000000000000000000A4 :107CE0000000000000000000000000000000000094 :107CF0000000000000000000000000000000000084 @@ -2010,8 +2010,8 @@ :107D800000000000000000000000000000000000F3 :107D900000000000000000000000000000000000E3 :107DA00000000000000000000000000000000000D3 -:107DB00000000000000008000000000000000000BB -:107DC00000000000000000000000000000000000B3 +:107DB00000000000000000000000000000000000C3 +:107DC0000000000000000000000000000000C000F3 :107DD00000000000000000000000000000000000A3 :107DE0000000000000000000000000000000000093 :107DF0000000000000000000000000000000000083 @@ -2035,7 +2035,7 @@ :107F10000000000000000000000000000000000061 :107F20000000000000000000000000000000000051 :107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000080029 +:107F40000000000000000000000000000000000031 :107F50000000000000000000000000000000000021 :107F60000000000000000000000000000000000011 :107F70000000000000000000000000000000000001 @@ -2044,7 +2044,7 @@ :107FA00000000000000000000000000000000000D1 :107FB00000000000000000000000000000000000C1 :107FC00000000000000000000000000000000000B1 -:107FD00080000000000300200000000000000020DE +:107FD0000000000000000008000000000000000594 :107FE0000000000000000000000000000000000091 :107FF0000000000000000000000000000000000081 :108000000000000000000000000000000000000070 @@ -2052,7 +2052,7 @@ :108020000000000000000000000000000000000050 :108030000000000000000000000000000000000040 :108040000000000000000000000000000000000030 -:1080500000004000000000000000000000000000E0 +:10805000000090000000000000010000000000008F :108060000000000000000000000000000000000010 :108070000000000000000000000000000000000000 :1080800000000000000000000000000000000000F0 @@ -2060,7 +2060,7 @@ :1080A00000000000000000000000000000000000D0 :1080B00000000000000000000000000000000000C0 :1080C00000000000000000000000000000000000B0 -:1080D0000000000000900000000000000000000010 +:1080D0000000000000880000000000000000000018 :1080E0000000000000000000000000000000000090 :1080F0000000000000000000000000000000000080 :10810000000000000000000000000000000000006F @@ -2076,7 +2076,7 @@ :1081A00000000000000000000000000000000000CF :1081B00000000000000000000000000000000000BF :1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F +:1081D0000000000000000000000800000000000097 :1081E000000000000000000000000000000000008F :1081F000000000000000000000000000000000007F :10820000000000000000000000000000000000006E @@ -2092,7 +2092,7 @@ :1082A00000000000000000000000000000000000CE :1082B00000000000000000000000000000000000BE :1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000004100005D +:1082D000000000000000000000000000008100001D :1082E0000000E007000000000000000000000000A7 :1082F000000000000000000000000000000000007E :10830000000000000000000000000000000000006D @@ -2176,14 +2176,14 @@ :1087E0000000000000000000000000000000000089 :1087F0000000000000000000000000000000000079 :108800000000000000000000000000000000000068 -:108810000000000000002000000020000000000018 +:108810000000000000000000000000000000000058 :108820000000000000000000000000000000000048 -:1088300000000000000020000000200000000000F8 +:108830000000000000000000000000000000000038 :108840000000000000000000000000000000000028 -:1088500000000000000000002000000000000000F8 +:108850000000000000000000840000000000000094 :108860000000000000000000000000000000000008 :1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000004000A8 +:1088800000000000000000000000000000000000E8 :1088900000000000000000000000000000000000D8 :1088A00000000000000000000000000000000000C8 :1088B00000000000000000000000000000000000B8 @@ -2197,7 +2197,7 @@ :108930000000000000000000000000000000000037 :108940000000000000000000000000000000000027 :108950000000000000000000000000000000000017 -:1089600000000000001000000000000000100000E7 +:1089600000000000000000000000000000100000F7 :1089700000000000000000000000000000000200F5 :1089800000000000000000000000000000000000E7 :1089900000000000000000000000000000000000D7 @@ -2222,8 +2222,8 @@ :108AC00000000000000000000000000000000000A6 :108AD0000000000000000000000000000000000096 :108AE0000000000000000000000000000000000086 -:108AF0000000000000000000000041000000000035 -:108B0000000008000000000000000000000000005D +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 :108B10000000000000000000000000000000000055 :108B20000000000000000000000000000000000045 :108B30000000000000000000000000000000000035 @@ -2245,8 +2245,8 @@ :108C30000000000000000000000000000000000034 :108C40000000000000000000000000000000000024 :108C50000000000000000000000000000000000014 -:108C600000000000000000000000000008000000FC -:108C70000000C00000000000000000000000000034 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000000000000000000F4 :108C800000000000000000000000000000000000E4 :108C900000000000000000000000000000000000D4 :108CA00000000000000000000000000000000000C4 @@ -2255,7 +2255,7 @@ :108CD0000000000000000000000000000000000094 :108CE0000000000000000000000000000000000084 :108CF0000000000000000000000000000000000074 -:108D0000000000000000000000000900000000005A +:108D00000000000000000090000008880000000043 :108D10000000000000000000000000000000000053 :108D20000000000000000000000000000000000043 :108D30000000000000000000000000000000000033 @@ -2418,16 +2418,16 @@ :109700000000000000000000000000000000000059 :109710000000000000000000000000000000000049 :109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 -:1097400000000000200020000000000000000000D9 -:109750000000000000000000000000000000000009 -:1097600000000000200020000000000000000000B9 -:1097700000000000000000000000000000020000E7 -:109780000000000000002000200000000000000099 +:109730000000000000000000000000002000000009 +:109740000000000000000000000000000000000019 +:1097500020000000000000000000000020000000C9 +:1097600000000000000000000000000000000000F9 +:1097700020000000000000000000000000022000A7 +:1097800000000000000000000000000000000000D9 :1097900000000000000000000000000000000000C9 :1097A00000000000000000000000000000000000B9 :1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 +:1097C0000000000000000000000000000000004059 :1097D0000000000000000000000000000000000089 :1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 @@ -2435,7 +2435,7 @@ :109810000000000000000000000000000000000048 :109820000000000000000000000000000000000038 :109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 +:109840000000000000000010000000000000000008 :109850000000000000000000000000000000000008 :1098600000000000000000000000000000000000F8 :1098700000000000000000000000000000000000E8 @@ -2443,22 +2443,22 @@ :1098900000000000000000000000000000000000C8 :1098A00000000000000000000000000000000000B8 :1098B0000000100000000000000220000000000076 -:1098C0000000000000000000000000000000000098 -:1098D0000000000000000000000000000000000088 -:1098E0000000000000000000000000000000000078 +:1098C0000000000000000000000800000000000090 +:1098D0000000000000000000008400000000000004 +:1098E0000008000000000000000800000000000068 :1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 +:10990000000800000000000000000010000000003F :109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 +:109920000000001000000000000000000000000027 :109930000000000080000000000000018000000026 :109940000000000000000000000000000000000017 :109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 +:1099600000000000000000000000001000000000E7 :1099700000000000000000000000000000000000E7 :1099800000000000000000000000000000000000D7 :1099900000000000000000000000000000000000C7 :1099A00000000000000000000000000000000000B7 -:1099B0000000000000004000000000000000000067 +:1099B0000000000000000000400000000000000067 :1099C0000000000000000000000000000000000097 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 @@ -2481,7 +2481,7 @@ :109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 :109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 +:109B2000080000000000000000000000000000002D :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 @@ -2489,8 +2489,8 @@ :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 :109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 -:109BB0000000000000000000000000000000A00005 +:109BA00000000000000000000000000000000800AD +:109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 @@ -2499,15 +2499,15 @@ :109C10000000000000000000000000000000000044 :109C20000000000000000000000000000000000034 :109C30000000000000000000000000000000000024 -:109C40000000000004000000000000000000000010 +:109C400000201000000000000000000000000000E4 :109C50000000000000000000000000000000000004 :109C600000000000000000000000000000000000F4 :109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 :109C900000000000000000000000000000000000C4 :109CA00000000000000000000000000000000000B4 -:109CB0000000000000000000000008000800000094 -:109CC0000000000000000000000000000000000094 +:109CB00000000000000000000000000000000000A4 +:109CC000C0000000000000000000000000000000D4 :109CD0000000000000000000000000000000000084 :109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 @@ -2523,16 +2523,16 @@ :109D900000000000000000000000000000000000C3 :109DA00000000000000000000000000000000000B3 :109DB00000000000000000000000000000000000A3 -:109DC000000000000000000004000000000000008F -:109DD0000000000000000000000000000000000083 +:109DC0000000000000000000000000000000000093 +:109DD0000000000001000000000000000000000082 :109DE0000000000000000000000000000000000073 :109DF0000000000000000000000000000000000063 :109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 :109E20000000000000000000000000000000000032 :109E30000000000000000000000000000000000022 -:109E4000000000000000000008008000000000008A -:109E500000000000000003000000000000000000FF +:109E40000000000000000000000000000000000012 +:109E500000000000000010000000000000000000F2 :109E600000000000000000000000000000000000F2 :109E700000000000000000000000000000000000E2 :109E800000000000000000000000000000000000D2 @@ -2540,7 +2540,7 @@ :109EA00000000000000000000000000000000000B2 :109EB00000000000000000000000000000000000A2 :109EC0000000000000000000000000000000000092 -:109ED000000300000000000000000000000000007F +:109ED000000500000000000000000000000000007D :109EE0000000000000000000000000000000000072 :109EF0000000000000000000000000000000000062 :109F00000000000000000000000000000000000051 @@ -2548,7 +2548,7 @@ :109F20000000000000000000000000000000000031 :109F30000000000000000000000000000000000021 :109F40000000000000000000000000000000000011 -:109F500000000001200000000000000000000000E0 +:109F500000000000200000000000000000000000E1 :109F600000000000000000000000000000000000F1 :109F700000000000000000000000000000000000E1 :109F800000000000000000000000000000000000D1 @@ -2572,7 +2572,7 @@ :10A0A00000000000000000000000000000000000B0 :10A0B00000000000000000000000000000000000A0 :10A0C0000000000000000000000000000000000090 -:10A0D0000000000000000000000000000000000080 +:10A0D0000000000800000000000000000000000078 :10A0E0000000000000000000000000000000000070 :10A0F0000000000000000000000000000000000060 :10A10000000000000000000000000000000000004F @@ -2588,7 +2588,7 @@ :10A1A00000000000000000000000000000000000AF :10A1B000000000000000000000000000000000009F :10A1C000000000000000000000000000000000008F -:10A1D00000000000000088000000000000070000F0 +:10A1D00000000000000081000000000000070000F7 :10A1E00000000000E000000000000000000000008F :10A1F000000000000000000000000000000000005F :10A20000000000000000000000000000000000004E @@ -2671,12 +2671,12 @@ :10A6D000000000000000000000000000000000007A :10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A -:10A700000000000000000000200000000000000029 -:10A7100000002000200020002000000000000000B9 -:10A720000000000000000000200000000000000009 -:10A730000000200020002000200000020000000097 -:10A7400000000000000000000000200000000000E9 -:10A7500000000000000000000000000000000000F9 +:10A700000000000000000000000020002000000009 +:10A7100020002000000000000000000000000000F9 +:10A7200000000000000000000000200020000000E9 +:10A7300020002000000000000000000200000000D7 +:10A7400000000000000000000000000020000000E9 +:10A750000000000000000000840000000000000075 :10A7600000000000000000000000000000000000E9 :10A7700000000000000000000000000000000000D9 :10A7800000000000000000000000000000000000C9 @@ -2691,7 +2691,7 @@ :10A810000000000000000000000000000000000038 :10A820000000000000000000000000000000000028 :10A830000000000000000000000000000000000018 -:10A8400000000000000000000000000000000010F8 +:10A840000000000000000000000000000000000008 :10A8500000000000000000100000000000000000E8 :10A8600000000000000000000000000000000000E8 :10A8700000000000000000000000000000000000D8 @@ -2710,7 +2710,7 @@ :10A940000000000000000000000000000000000007 :10A9500000000000000000000000000000000000F7 :10A9600000000000000000000000000000000000E7 -:10A97000000000000000000000000000880000004F +:10A970000000000000000000000000008200000055 :10A9800000000000000000000000000000000000C7 :10A9900000000000000000000000000000000000B7 :10A9A00000000000000000000000000000000000A7 @@ -2718,31 +2718,31 @@ :10A9C0000000000000000000000000000000000087 :10A9D0000000000000000000000000000000000077 :10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000300000000000000000054 +:10A9F000000000000000080000000000000000004F :10AA00000000000000000000000000000000000046 :10AA10000000000000000000000000000000000036 :10AA20000000000000000000000000000000000026 :10AA30000000000000000000000000000000000016 :10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA60000800000000000800C00000000000000016 -:10AA700000000000000000000000000000000000D6 +:10AA500000000000000000000000080000000000EE +:10AA600008000000000000000000000000000000DE +:10AA70008200000000000000000000000000000054 :10AA800000000000000000000000000000000000C6 :10AA900000000000000000000000000000000000B6 :10AAA00000000000000000000000000000000000A6 :10AAB0000000000000000000000000000000000096 :10AAC0000000000000000000000000000000000086 :10AAD0000000000000000000000000000000000076 -:10AAE000000000000000080000000000000000005E -:10AAF000000000000000000008000000000000004E +:10AAE000080000000000000000000000000000005E +:10AAF0000000000000000000000000000000000056 :10AB00000000000000000000000000000000000045 :10AB10000000000000000000000000000000000035 :10AB20000000000000000000000000000000000025 :10AB30000000000000000000000000000000000015 :10AB40000000000000000000000000000000000005 :10AB500000000000000000000000000000000000F5 -:10AB600000000000000008000000000000000000DD -:10AB700000000000000000000000000000000000D5 +:10AB60000000000000000000000000000000820063 +:10AB700000000000C0000000000000000000000015 :10AB800000000000000000000000000000000000C5 :10AB900000000000000000000000000000000000B5 :10ABA00000000000000000000000000000000000A5 @@ -2751,14 +2751,14 @@ :10ABD0000000000000000000000000000000000075 :10ABE0000000000000000000000000000000000065 :10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 +:10AC0000000000000000000000000800000000003C :10AC10000000000000000000000000000000000034 :10AC20000000000000000000000000000000000024 :10AC30000000000000000000000000000000000014 :10AC40000000000000000000000000000000000004 :10AC500000000000000000000000000000000000F4 :10AC600000000000000000000000000000000000E4 -:10AC700000000000000000008200000000008200D0 +:10AC700000000000000000000000000000000000D4 :10AC800000000000000000000000000000000000C4 :10AC900000000000000000000000000000000000B4 :10ACA00000000000000000000000000000000000A4 @@ -2783,7 +2783,7 @@ :10ADD0000000000000000000000000000000000073 :10ADE0000000000000000000000000000000000063 :10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000200022 +:10AE00000000000000000000000000000000000042 :10AE10000000000000000000000000000000000032 :10AE20000000000000000000000000000000000022 :10AE30000000000000000000000000000000000012 @@ -2791,16 +2791,16 @@ :10AE500000000000000000000000000000000000F2 :10AE600000000000000000000000000000000000E2 :10AE700000000000000000000000000000000000D2 -:10AE8000000000000000000080000000000000053D -:10AE900000000000000000100000000000000000A2 +:10AE800000000000000000000000000000000003BF +:10AE90000000000000000020000000000000000092 :10AEA00000000000000000000000000000000000A2 :10AEB0000000000000000000000000000000000092 :10AEC0000000000000000000000000000000000082 :10AED0000000000000000000000000000000000072 :10AEE0000000000000000000000000000000000062 :10AEF0000000000000000000000000000000000052 -:10AF0000000000000000000000000400000000003D -:10AF100000009000000000000001000000000000A0 +:10AF000000000000000000000000900000000000B1 +:10AF100000004000000000000000000000000000F1 :10AF20000000000000000000000000000000000021 :10AF30000000000000000000000000000000000011 :10AF40000000000000000000000000000000000001 @@ -2824,7 +2824,7 @@ :10B0600000000000000000000000000000000000E0 :10B0700000000000000000000000000000000000D0 :10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 +:10B090000000000000000000002000000000000090 :10B0A00000000000000000000000000000000000A0 :10B0B0000000000000000000000000000000000090 :10B0C0000000000000000000000000000000000080 @@ -2840,7 +2840,7 @@ :10B1600000000000000000000000000000000000DF :10B1700000000000000000000000000000000000CF :10B1800000000000000000000000000000000000BF -:10B190000000000000000000000000008800000027 +:10B19000000000000000000000000000810000002E :10B1A0000000000700000000000000000000000098 :10B1B000000000000000000000000000000000008F :10B1C000000000000000000000000000000000007F @@ -2914,21 +2914,21 @@ :10B60000000000000000000000000000000000003A :10B61000000000000000000000000000000000002A :10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A +:10B6300000000000000020000000000000000000EA :10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA +:10B6500000000000000020000000000000000000CA :10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA +:10B6700000000000000000002000000000000000AA :10B6800000000000000000000000000000000000BA :10B6900000000000000000000000000000000000AA :10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A +:10B6B000000000000000000000004000000000004A +:10B6C0000002000000000000000000000000000078 :10B6D000000000000000000000000000000000006A :10B6E000000000000000000000000000000000005A :10B6F000000000000000000000000000000000004A :10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 +:10B7100000000000000000000000000040000000E9 :10B720000000000000000000000000000000000019 :10B730000000000000000000000000000000000009 :10B7400000000000000000000000000000000000F9 @@ -2938,7 +2938,7 @@ :10B7800000000000000000000000000000000000B9 :10B7900000000000000000000000000000000000A9 :10B7A0000000001000000000000000000000000089 -:10B7B0000000000000000000000000000000000089 +:10B7B0000000000000000000000000000004000085 :10B7C0000000000000000000000000000000000079 :10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 @@ -2954,7 +2954,7 @@ :10B8800000000000000000000000000000000000B8 :10B8900000000000000000000000000000000000A8 :10B8A0000000000000000000000000000000000098 -:10B8B0004000000000000000000000000000000048 +:10B8B0000000400000000000000000000000000048 :10B8C0000000000000000000000000000000000078 :10B8D0000000000000000000000000000000000068 :10B8E0000000000000000000000000000000000058 @@ -2962,15 +2962,15 @@ :10B900000000000000000000000000000000000037 :10B910000000000000000000000000000000000027 :10B920000000000000000000000000000000000017 -:10B9300000004000000000000000000000000000C7 +:10B930000000000040000000410000000000000086 :10B9400000000000000000000000000000000000F7 :10B9500000000000000000000000000000000000E7 :10B9600000000000000000000000000000000000D7 :10B9700000000000000000000000000000000000C7 :10B9800000000000000000000000000000000000B7 :10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B000A0000000000000000000004000000000A7 +:10B9A00000000000000000000000A00000000000F7 +:10B9B0000000000000000000000000000000000087 :10B9C0000000000000000000000000000000000077 :10B9D0000000000000000000000000000000000067 :10B9E0000000000000000000000000000000000057 @@ -2986,7 +2986,7 @@ :10BA800000000000000000000000000000000000B6 :10BA900000000000000000000000000000000000A6 :10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 +:10BAB000A0000000000000000000000000000000E6 :10BAC0000000000000000000000000000000000076 :10BAD0000000000000000000000000000000000066 :10BAE0000000000000000000000000000000000056 @@ -2995,15 +2995,15 @@ :10BB10000000000000000000000000000000000025 :10BB20000000000000000000000000000000000015 :10BB30000000000000000000000000000000000005 -:10BB400000000000000003002100000000000000D1 +:10BB400003000000000000000000000000000000F2 :10BB500000000000000000000000000000000000E5 :10BB600000000000000000000000000000000000D5 :10BB700000000000000000000000000000000000C5 :10BB800000000000000000000000000000000000B5 :10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0004000000000000000000000000000000045 -:10BBC0000000400000000000000000000000000035 +:10BBA000000000000000000000004000080000004D +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 :10BBD0000000000000000000000000000000000065 :10BBE0000000000000000000000000000000000055 :10BBF0000000000000000000000000000000000045 @@ -3186,7 +3186,7 @@ :10C700000000000000000000000000000000000029 :10C710000000000000000000000000000000000019 :10C720000000000000000000000000000000000009 -:10C7300000000000000000100000000000000000E9 +:10C7300000000000000000000000000000000000F9 :10C7400008000000000000000000000000000000E1 :10C7500000000000000000000000000000000000D9 :10C7600000000000000000000000000000000000C9 @@ -3411,9 +3411,9 @@ :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB +:10D5400000022000000000000000000000000000B9 :10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB +:10D56000000020000000000000000000000000009B :10D5700000020000000000000000000000000000A9 :10D58000000000000000000000000000000000009B :10D59000000000000000000000000000000000008B @@ -3423,9 +3423,9 @@ :10D5D000000000000000000000000000000000004B :10D5E000000000000000000000000000000000003B :10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A +:10D6000000000000000020000000000000000000FA :10D61000000000000000000000000000000000000A -:10D6200000000000000000C000000000000000003A +:10D620000000000000C0000000000000000000003A :10D6300000000000000000000000000000000000EA :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA @@ -3433,23 +3433,23 @@ :10D6700000000000000000000000000000000000AA :10D680000000000000000000000000000800000092 :10D69000000000000000000000000000000000008A -:10D6A0000000000000000200000000000000020076 +:10D6A0000000000000000200000000000000000078 :10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000000000005A +:10D6C0000000000000000000000000000000000852 :10D6D000000000000000000000000000000000004A -:10D6E000000000000000000000000000000000003A +:10D6E0000000000000000000000000000000000832 :10D6F000000000000000000000000000000000002A :10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 -:10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 +:10D710000008000000000000000000000000000001 +:10D7200040000000000000000000000000000000B9 +:10D7300000400000000000000000000000000000A9 :10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 :10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 :10D780000000000000000000000000000000000099 :10D790000000000000000000000000000000000089 -:10D7A0000000000000000000000040000000000039 +:10D7A0000000000000000000000000004000000039 :10D7B0000000000000000000000000000000000069 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 @@ -3464,7 +3464,7 @@ :10D8600000000000000000000000000000000000B8 :10D8700000000000000000000000000000000000A8 :10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 +:10D89000000000000000C0000000000000000000C8 :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 :10D8C0000000000000000000000000000000000058 @@ -3480,7 +3480,7 @@ :10D9600000000000000000000000000000000000B7 :10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 -:10D990000000000000000000000000000000000087 +:10D99000000000000800000000000000000000007F :10D9A0000000000000000000000000000000000077 :10D9B0000000000000000000000000000000000067 :10D9C0000000000000000000000000000000000057 @@ -3497,7 +3497,7 @@ :10DA700000000000000000000000000000000000A6 :10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 +:10DAA00000000000000000000000000000008200F4 :10DAB0000000000000000000000000000000000066 :10DAC0000000000000000000000000000000000056 :10DAD0000000000000000000000000000000000046 @@ -3514,7 +3514,7 @@ :10DB80000000000000000000000000000000000095 :10DB90000000000000000000000000000000000085 :10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000000000000000000065 +:10DBB0000000000000000000000000002000000045 :10DBC0000000000000000000000000000000000055 :10DBD0000000000000000000000000000000000045 :10DBE0000000000000000000000000000000000035 @@ -3522,7 +3522,7 @@ :10DC00000000000000000000000000000000000014 :10DC10000000000000000000000000000000000004 :10DC200000000000000000000000000000000000F4 -:10DC300000000000000000000000000008000000DC +:10DC300000000000000000000000000000000000E4 :10DC400000000000000000000000000000000000D4 :10DC500000000000000000000000000000000000C4 :10DC600000000000000000000000000000000000B4 @@ -3531,7 +3531,7 @@ :10DC90000000000000000000000000000000000084 :10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 -:10DCC0000000000000040000000000000000000050 +:10DCC0000000000000030000000000000000000051 :10DCD0000000000000000000000000000000000044 :10DCE0000000000000000000000000000000000034 :10DCF0000000000000000000000000000000000024 @@ -3547,7 +3547,7 @@ :10DD90000000000000000000000000000000000083 :10DDA0000000000000000000000000000000000073 :10DDB0000000000000000000000000000000000063 -:10DDC00000000040000020000000000000000000F3 +:10DDC000000000040000000000000000000000004F :10DDD0000000000000000000000000000000000043 :10DDE0000000000000000000000000000000000033 :10DDF0000000000000000000000000000000000023 @@ -3563,7 +3563,7 @@ :10DE90000000000000000000000000000000000082 :10DEA0000000000000000000000000000000000072 :10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 +:10DEC000000000000000000800000000000000004A :10DED0000000000000000000000000000000000042 :10DEE0000000000000000000000000000000000032 :10DEF0000000000000000000000000000000000022 @@ -3579,7 +3579,7 @@ :10DF90000000000000000000000000000000000081 :10DFA0000000000000000000000000000000000071 :10DFB0000000000000000000000000000000000061 -:10DFC0000000000000000000000000410000000010 +:10DFC00000000000000000000000008100000000D0 :10DFD000E000000000000000000000000000000061 :10DFE0000000000000000000000000000000000031 :10DFF0000000000000000000000000000000000021 @@ -3662,12 +3662,12 @@ :10E4C000000000000000000000000000000000004C :10E4D000000000000000000000000000000000003C :10E4E000000000000000000000000000000000002C -:10E4F00020000000000000000000200000000000DC -:10E5000000000000000000002000000000000000EB -:10E5100020000000000000000000200000000000BB -:10E5200000000000000000002000000000000000CB -:10E53000000020000000000000000000200000009B -:10E5400000000000000000000000200000000000AB +:10E4F00020000000000000002000000000000000DC +:10E50000000000000000000000000000000000000B +:10E5100020000000000000002000000000000000BB +:10E5200000000000000000000000000000000000EB +:10E53000000020000000000000002000000000009B +:10E5400000000000000000000000000000000000CB :10E5500000000000000000000000000000000000BB :10E5600000000000000000000000000000000000AB :10E57000000000000000000000000000000000009B @@ -3681,14 +3681,14 @@ :10E5F000000000000000000000000000000000001B :10E60000000000000000000000000000000000000A :10E6100000000000000000000000000000000000FA -:10E6200008000000000000000000000000000000E2 +:10E6200000000000000000000000000000000000EA :10E6300000000000000000000000000000000000DA :10E6400000000000000000000000000000000000CA :10E6500000000000000000000000000000000000BA :10E6600000000000000000000000000000000000AA :10E67000000000000000000000000000000000009A :10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A +:10E69000000000004000000000000000000000003A :10E6A000000000000000000000000000000000006A :10E6B000000000000000000000000000000000005A :10E6C000000000000000000000000000000000004A @@ -3709,7 +3709,7 @@ :10E7B0000000000000000000000000000000000059 :10E7C0000000000000000000000000000000000049 :10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000800000000000000000021 +:10E7E0000000000008000000000000000000000021 :10E7F0000000000000000000000000000000000019 :10E800000000000000000000000000000000000008 :10E8100000000000000000000000000000000000F8 @@ -3720,7 +3720,7 @@ :10E8600000000000000000000000000000000000A8 :10E870000000000000000000000000000000000098 :10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000000000078 +:10E890000000000000000000000000001000000068 :10E8A0000000000000000000000000000000000068 :10E8B0000000000000000000000000000000000058 :10E8C0000000000000000000000000000000000048 @@ -3734,7 +3734,7 @@ :10E9400000000000000000000000000000000000C7 :10E9500000000000000000000000000000000000B7 :10E9600000000000000000000000A0000000000007 -:10E97000C0000000000000000000080000000000CF +:10E97000C0000000000000000000000000000000D7 :10E980000000000000000000000000000000000087 :10E990000000000000000000000000000000000077 :10E9A0000000000000000000000000000000000067 @@ -3783,7 +3783,7 @@ :10EC500000000000000000000000000000000000B4 :10EC600000000000000000000000000000000000A4 :10EC70000000000000000000000000000000000094 -:10EC80000000000080000000000000030000000001 +:10EC80000000000000000000000000030000000081 :10EC90000000000000000000000000000000000074 :10ECA0000000000000000000000000000000000064 :10ECB0000000000000000000000000000000000054 @@ -3791,7 +3791,7 @@ :10ECD0000000000000000000000000000000000034 :10ECE0000000000000000000000000000000000024 :10ECF0000000000000000000000000000000000014 -:10ED000000000000000008000000000000000000FB +:10ED000000000000000020000000000000000000E3 :10ED100000000000000000000000000000000000F3 :10ED200000000000000000000000000000000000E3 :10ED300000000000000000000000000000000000D3 @@ -3905,21 +3905,21 @@ :10F3F000000000000000000000000000000000000D :10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC -:10F4200000000000000000000000000000000000DC -:10F4300084000000000088000000000000000000C0 -:10F44000000000002000000020000000000000007C -:10F45000200000000000200000000000000000006C -:10F46000000000002000000020000002000000005A -:10F47000000020000000000020000000000000004C -:10F48000000000000000000000002000000000005C +:10F4200000000000000000000000200000000000BC +:10F4300020002000880000002000000000000000E4 +:10F44000200020002000000000002000000000003C +:10F45000000020002000000020000000000000004C +:10F46000200020002000000000000002200000001A +:10F4700000004000200020000000200000000000EC +:10F48000000020000000000000000000000000005C :10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C -:10F4B000000000000000000000000000000000004C +:10F4B000000000000020000000000000000000002C :10F4C000000000000000000000000000000000003C :10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C :10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB +:10F5000000000000000020000000000000000000DB :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB :10F5300000000000000000000000000000000000CB @@ -3932,7 +3932,7 @@ :10F5A000000000000000000000000000000000005B :10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B -:10F5D000000000000000000000000000000000002B +:10F5D0000000000000000000050000000000000026 :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B :10F6000000000000000000000000000000000000FA @@ -3945,7 +3945,7 @@ :10F67000000000000000000000000000000000008A :10F68000000000000000000000000000000000007A :10F69000000000000000000000000000000000006A -:10F6A000000000004000000000000000000000001A +:10F6A000000000000000400000000000000000001A :10F6B000000000000000000000000000000000004A :10F6C000000000000000000000000000000000003A :10F6D000000000000000000000000000000000002A @@ -3953,31 +3953,31 @@ :10F6F000000000000000000000000000000000000A :10F7000000000000000000000000000000000000F9 :10F7100000000000000000000000000000000000E9 -:10F7200000000000000000000000000000000000D9 +:10F7200000000000000003000000000000000000D6 :10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 :10F7500000000000000000000000000000000000A9 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 :10F780000000000000000000000000000000000079 -:10F790000000000000000000000000000000080061 -:10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000800000000000000000041 -:10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 -:10F7E0000000000000000000000000000000000019 -:10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 -:10F8200000000000000000000000000000000000D8 -:10F8300000000000000000000000000000000000C8 +:10F790000000000000000000080000000000000061 +:10F7A0000000000000000800000000000000000051 +:10F7B0000000000000000000000000000000080041 +:10F7C000080003000000000000002100000000000D +:10F7D0000800000000000000000000000000080019 +:10F7E0000800080000000000000000000000000009 +:10F7F00008000000000000000000000000001000F1 +:10F8000010000800080000000000000000000000D8 +:10F8100000000000050000000000000000001000D3 +:10F8200008000800080000000000000000000000C0 +:10F8300000000020000000000000000000000000A8 :10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 :10F870000000000000000000000000000000000088 :10F880000000000000000000000000000000000078 :10F890000000000000000000000000000000A000C8 -:10F8A00000000000C0000000080000004000000050 +:10F8A00000000000C0000000840000000000000014 :10F8B000A0000000000000000000000000000000A8 :10F8C0000000000000000000000000000000000038 :10F8D0000000000000000000000000000000000028 @@ -3987,22 +3987,22 @@ :10F9100000000000000000000000000000000000E7 :10F9200000000000000000000000000000000000D7 :10F9300000000000000000000000000000000000C7 -:10F9400000000000000200000000000000000000B5 +:10F9400000000000000000000800000000000000AF :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 :10F99000000000000000000000000800000000005F -:10F9A000000000000000000000000000080000004F -:10F9B00000000000000082000000000000000000C5 +:10F9A00000000000000000000000000084000000D3 +:10F9B0000000000000000000000000000000000047 :10F9C0000000000000000000000000000000000037 -:10F9D0000000000000000000000000000000000027 +:10F9D000000000000000080000000000000000001F :10F9E0000000000000000000000000000000000017 -:10F9F0000000000000000000000000000000000007 +:10F9F00000000000000008000000000000000000FF :10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 +:10FA100000000000000000000800000000000000DE :10FA200000000000000000000000000000000000D6 -:10FA300000000000000021000000000000000000A5 +:10FA3000000000000000210008000000000000009D :10FA400000000000000000000000000000000000B6 :10FA500000000000000000000000000000000000A6 :10FA60000000000000000000000000000000000096 @@ -4018,7 +4018,7 @@ :10FB000000000000000000000000000000000000F5 :10FB100000000000000000000000000000000000E5 :10FB200000000000000000000000000000000000D5 -:10FB300000000000000008000000000000000000BD +:10FB300000000000000000000000000000000800BD :10FB400000000000000000000000000000000000B5 :10FB500000000000000000000000000000000000A5 :10FB60000000000000000000000000000000000095 @@ -4027,7 +4027,7 @@ :10FB90000000000000000000000000000000000065 :10FBA0000000000000000000000000000000000055 :10FBB0000000000000000000000000000000000342 -:10FBC0000000000000000005000000000000000030 +:10FBC00000000000000000400000000000000000F5 :10FBD0000000000000000000000000000000000025 :10FBE0000000000000000000000000000000000015 :10FBF0000000000000000000000000000000000005 @@ -4035,7 +4035,7 @@ :10FC100000000000000000000000000000000000E4 :10FC200000000000000000000000000000000000D4 :10FC30000000000000000000000090000000000034 -:10FC400000000200000000000000000000000000B2 +:10FC40000000200000000000000000000000000094 :10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 :10FC70000000000000000000000000000000000084 @@ -4043,7 +4043,7 @@ :10FC90000000000000000000000000000000000064 :10FCA0000000000000000000000000000000000054 :10FCB0000000000000000000000000000002000042 -:10FCC0000000000000020000020000000000000030 +:10FCC0000000000000020000000000000000000032 :10FCD0000000000000000000000000000000000024 :10FCE0000000000000000000000000000000000014 :10FCF0000000000000000000000000000000000004 @@ -4051,7 +4051,7 @@ :10FD100000000000000000000000000000000000E3 :10FD200000000000000000000000000000000000D3 :10FD30000000000000000000000000000000008043 -:10FD400000000000000000800000800000000000B3 +:10FD40000000000000000080000000000000000033 :10FD500000000000000000000000000000000000A3 :10FD60000000000000000000000000000000000093 :10FD70000000000000000000000000000000000083 @@ -4059,7 +4059,7 @@ :10FD90000000000000000000000000000000000063 :10FDA0000000000000000000000000000000000053 :10FDB0000000000000000000000000000000000043 -:10FDC000000300000080000000030000008000002D +:10FDC0000008000000800000000300000080000028 :10FDD0000000000000000000000000000000000023 :10FDE0000000000000000000000000000000000013 :10FDF0000000000000000000000000000000000003 @@ -4067,7 +4067,7 @@ :10FE100000000000000000000000000000000000E2 :10FE200000000000000000000000000000000000D2 :10FE300000000000000000000000000000000000C2 -:10FE40000000000000000040000000000000004032 +:10FE4000000000000000000400000000000000406E :10FE500000000000000000000000000000000000A2 :10FE60000000000000000000000000000000000092 :10FE70000000000000000000000000000000000082 @@ -4075,7 +4075,7 @@ :10FE90000000000000000000000000000000000062 :10FEA0000000000000000000000000000000000052 :10FEB0000000000000000000000000000000000042 -:10FEC00000000000884100000000E00784210000DD +:10FEC00000000000818100000000E0078841000080 :10FED0000000E0070000000000000000000000003B :10FEE0000000000000000000000000000000000012 :10FEF0000000000000000000000000000000000002 @@ -4158,16 +4158,16 @@ :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D -:1003E0000000000000000000000000000000840089 -:1003F00000000000000000000000000000000000FD -:1004000000000000000000000000000000002000CC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:10043000200000000000000000000000000000009C -:1004400000000000000000000000000000000000AC +:1003E00000000000000000002000C000200000000D +:1003F00020002000040000000000880020002000F1 +:10040000C000840020002000200020002000000008 +:100410002000200020000000040020002000200018 +:1004200020002000200020000003200020002000E9 +:10043000000020002000200000000000000020003C +:10044000200000000000000000000000000000008C :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C +:10047000000000000000000000002000000000005C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C @@ -4176,23 +4176,23 @@ :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC -:1005000000000000000000000000000000000000EB +:1005000000000000000000000000200800000000C3 :1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB +:1005200000000000000000000000200800000000A3 :10053000000000000040000000000000000000007B -:1005400000000000000000000000000000000000AB +:1005400000000000000000000000000000040000A7 :10055000000000000000000000000000000000009B -:10056000000000000000004000000000000000004B -:10057000000000000000000000000000000000007B -:10058000000000000000000000000000000000006B +:100560000000000000000040000000000004000047 +:10057000200000000000000000000000000000005B +:1005800000000000000000000000000080010000EA :10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B +:1005A00000000000000000000000000080010000CA :1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B +:1005C0000000090000000000000000000000000121 :1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B +:1005E000000000000000000000000000000000010A :1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA +:1006000000000000000000000000000000110000D9 :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA @@ -4204,33 +4204,33 @@ :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000000000000000000000000FA -:1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000800000091 +:1006C0000000000000000800000000000000000022 +:1006D0000000000000000000080000000000000012 +:1006E00000000000210000000000000000000000E9 +:1006F0000000000082000800820082008200820068 +:100700000000820082000000820082000800820057 +:10071000080082008200A000820082008200820025 +:100720000000820082008400820082008200820039 +:1007300000008200000082008200820082008200AD +:10074000820000008200820000008200820082009D +:1007500082000000088082004000820000008200C9 :100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 +:1007700000000000008000000000000000000000F9 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 +:1007A00000000000400000200000000000000000E9 +:1007B0000800000000000000000000000000000031 +:1007C0000000000000000000080000000000000021 +:1007D0000000080000000008000000000000000009 :1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000000000000F9 -:1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000000000D8 -:1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 +:1007F00000000000000000080800000000000000E9 +:1008000000000800080000000000000008000000D0 +:1008100000000000000000000800000000000000D0 +:1008200000000800000000000000000008000000B8 +:1008300000000000080000000000080000000000A8 +:100840000000000008000000000000000000080098 +:100850000000080000000800000008000800000078 +:10086000C000C0000800C000000000000000080038 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 @@ -4239,15 +4239,15 @@ :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 -:1008F00000000300000000000000000000000000F5 -:1009000000000002000000000000000000000000E5 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 +:1008F00000000800000000000000000000000000F0 +:10090000A000A000000000000400000000000000A3 +:10091000080000000005400200000800400200003E +:100920000000A000A000100008000000000000006F +:100930000800000000000000000008000000400067 +:10094000C0000000A000A00000000800100000008F +:100950000000080000000000000000008200840089 +:10096000C0000000A0000800000008000000000017 +:10097000000008000000000000000000000000006F :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 @@ -4256,79 +4256,79 @@ :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 :1009F000000011880000000000000000000000005E -:100A000000000000000000000000000000000000E6 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 -:100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 +:100A000000010001000100C00001000100C100035D +:100A100000000201004000200001020100C00000AF +:100A200000010001000100C00001000100C100033D +:100A300000000401004000200001020100C000008D +:100A4000000000010001000100C00001000100C120 +:100A5000000300000001004000040001020100C08A +:100A6000000000010001000100C00001000100C100 +:100A7000000300000001004000200001020100C04E +:100A8000000000410041004100C0004100410090D1 +:100A900020C10040894100000000004180410085E4 +:100AA000000000410041004100C0004100410090B1 +:100AB00020C10040C041000000000041804100858D +:100AC0000000000000410041004100C00041004121 +:100AD000009020C100402041000000800041804182 +:100AE0000085000000410041004100C0004100417C +:100AF000009020C1004020410000000000418041E2 +:100B00000085000041000300000000804100C0009B +:100B10000000020020002000000083004100C1000E +:100B20000080800041000300000000804100C00000 +:100B30000000020008002000000083004100C10006 +:100B400000808000000041000300000000804100A0 +:100B5000C00000000200200040000000A000410092 +:100B6000C1000080800041000300000000804100BF +:100B7000C000000002002000880000008300410047 +:100B8000C1000080800001000100000000C00100E1 +:100B9000C00000000100820090400090C1004100B0 +:100BA000C1000004820001000100000000C001003B +:100BB000C00000000100830090080090C1004100C7 +:100BC000C10000048200000301000100000000C019 +:100BD0000100C00000000100820090080090C000E9 +:100BE0004100C1000004820001000100000000C0BB +:100BF0000100C00000000100820002400090C0001F +:100C00004100C1000004820000C00001C0C100001A +:100C10000000000100C0400200410001A0C100002E +:100C2000000000010000000000C00001C0C1000081 +:100C30000000000100C0400200410001A0C100000E +:100C40000000000100000000000000C00001C0C161 +:100C500000000000000100C0400200410001A0C1EE +:100C60000000000000010000000000C00001C0C141 +:100C700000000000000100C0040200410001A0C10A +:100C8000000000000001000000000080004180C161 +:100C900000000000004100C1008500C1004100C10A +:100CA000000000000041000500000080004180C1FC +:100CB00000000000004100C1008500C1004100C1EA +:100CC000000000000041000500000000008000411D +:100CD00080C100000000004100C1008500C100414A +:100CE00000C100000000004100050000008000413C +:100CF00080C100000000004100C180C000C100416F +:100D000000C100000000004100050000C10080009B +:100D100080C100004110000082004100C1C10000FC +:100D2000800500004100000080004100C1008000FB +:100D300080C100004110002090004100C1C10000AE +:100D40008005000041000000800041000000C1005B +:100D5000800080C100004110800002004100C1C13C +:100D60000000800500004100000080004100C1003B +:100D7000800080C100004105800002004100C141A7 +:100D80000000800500004100000080004100C1001B +:100D90004000C0C100000101400004000100C10981 +:100DA0008200C000000001000000C0000100C1007E +:100DB0004000C0C100000101400083000100C105E6 +:100DC0008200C000000001000000C000010000001F +:100DD000C1004000C0C100000101040091000100F9 +:100DE000C1058200C000000001000000C000010039 +:100DF000C1004000C0C100000100040091000100DA +:100E0000C1058200C000000001000000C000010018 +:100E10000000000000000042000000000000000090 +:100E2000811200410700480000000000000000009F +:100E30000000000000000042000000000000000070 +:100E4000811200410700480000000000000000007F +:100E50000000000000000000004200000000000050 +:100E6000000081120041070048000000000000005F +:100E70000000000000000000004200000000000030 +:100E8000000081120041070048000000000000003F :100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 :100EB0000000000000000000000000000000000032 @@ -4345,53 +4345,53 @@ :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 +:100F9000000000000000757B000000000000000061 :100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 +:100FB00000000000DEAE757B0000000000000000B5 :100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 +:100FD00000000000DEAE0000757B00000000000095 :100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 +:100FF000000000000000DEAE757B00000000000075 :1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A00000008800000000008800880000000000A8 -:1010B0000000000000000000200000000000000010 -:1010C00000002000000000002000200000000000C0 -:1010D00000000000000000002000000200000000EE -:1010E00000000000200000000000200000000000C0 +:10101000000000000000DEAE60C60300000000001B +:1010200000000031E0000000000000000C000000A3 +:101030000000000000C0630660C60300000000005E +:1010400000000031E0000000000000000C00000083 +:101050000000000000C06306000060C6030000003E +:10106000000000000031E0000000000000000C0063 +:1010700000000000000000C0630660C6030000001E +:10108000000000000031E0000000000000000C0043 +:1010900000000000000000C0630640000000840063 +:1010A0002000000020000000200040002000200060 +:1010B0002000200020000000000020000000200090 +:1010C0002000880020000000200088002000200070 +:1010D00000002000200000000000000220000000AE +:1010E0002000200000002000000000000000200080 :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF :1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF +:1011200000000000000000000000000000020000BD :1011300000000000000000000000000000000000AF :10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F +:10115000200005000000000000000000000000006A :10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F +:10117000000020000000000000000000000000004F :10118000000000000000000000000000000000005F :10119000000000000000000000000000000000004F :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F +:1011D0000000000000080000000000000000000007 :1011E00000000000000000000000000000000000FF :1011F00000000000000000400000000000000000AF :1012000000000000000000000000000000000000DE -:10121000004000000000000000400000000000004E +:101210000040000000000009000000000000000085 :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E +:1012700000000000000000000088000000000000E6 :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E @@ -4401,56 +4401,56 @@ :1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD -:1013100000000000A000000000000000000000002D -:1013200000000000000000000000000000000000BD -:1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000000C00000000000000000007D -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D +:1013100000000000000088000000000084000000C1 +:1013200000000000000000000000080008000300AA +:10133000000009000800000000000000000000009C +:10134000000000000000000008000800000003008A +:101350000000050000000000000000000000000088 +:101360000000000000000000000000000800030072 +:101370002100000041000000000000000000080003 +:101380000000000000000000000000000800030052 +:1013900021000000410000000000000000000000EB +:1013A000000000000000000000000000000000003D +:1013B000820000000000080000000000000008009B +:1013C0008200A00000008200000000000000000079 +:1013D0000000000000000800000000000000040001 :1013E00000000000000000000000000000000000FD -:1013F00000000000000000000800000000000000E5 -:101400000000000000000800820000000000000052 +:1013F00000000000000000000000000000000000ED +:1014000040000000000000000000A00000000000FC :1014100000000000000000000000000000000000CC :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C +:101450000000000000000000000000000000080084 :10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C +:101470000000000000000000080000000000000064 :10148000000000000000000000000000000000005C -:101490000000000000000000080000000000000044 +:10149000000000000000000000000000000000004C :1014A000000000000000000000000000000000003C :1014B000000000000000000000000000000000002C :1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC +:1014E000000000000000000000000000820000007A :1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB +:1015000000000000000000000000000008000000D3 +:101510000000000000000000000000000000820049 :1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B +:101530000000000003000800000000000800080090 +:10154000000000000000000021000000000000007A +:101550000000000003C008000300000003000800B2 :10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B +:101570000000000000000800080021000000080032 +:101580000800000000000000000000000000000053 +:101590000000000000000000080021000000000022 +:1015A0000800000000000000000000000000000033 :1015B000000000000000000000000000000000002B -:1015C000000000000000000000000000000000001B +:1015C0000000080000000000000000000000000013 :1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB -:1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:101610000000000000000000080000000000820040 -:10162000A000000088000000000000000000000092 +:1015F00000004000080000000000000000000000A3 +:1016000000000000000000000000080000000000D2 +:101610000000400008000000000000000000000082 +:10162000900000000000000000000000000000002A :1016300000000000000000000000000000000000AA :10164000000000000000000000000000000000009A :10165000000000000000000000000000000000008A @@ -4474,7 +4474,7 @@ :101770000000000000000000000000000000000069 :101780000000000000000000000000000000000059 :101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 +:1017A0000000000000000000000000000000200019 :1017B0000000000000000000000000000000000029 :1017C0000000000000000000000000000000000019 :1017D0000000000000000000000000000000000009 @@ -4482,16 +4482,16 @@ :1017F00000000000000000000000000000000000E9 :1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000005B3 -:101830000000000000000020000000000000000088 +:101820000000000000000000000000000000002098 +:101830008000000000000020000000000000000008 :101840000000000000000000000000000000000098 :101850000000000000000000000000000000000088 :101860000000000000000000000000000000000078 :101870000000000000000000000000000000000068 :101880000000000000000000000000000000000058 :101890000000000000000000000000000000000048 -:1018A00000000000000000000000400000000000F8 -:1018B0000000900000000000000000000000000098 +:1018A00000000000000000000000900000000000A8 +:1018B0000000020000000000000000000000000026 :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 :1018E00000000000000000000000000000000000F8 @@ -4499,7 +4499,7 @@ :1019000000000000000000000000000000000000D7 :1019100000000000000000000000000000000000C7 :1019200000000000000000000000000000A0000017 -:101930000000000000400000040000000000000063 +:1019300000000000000400000000000000000000A3 :101940000000000000000000000000000000000097 :101950000000000000000000000000000000000087 :101960000000000000000000000000000000000077 @@ -4507,7 +4507,7 @@ :101980000000000000000000000000000000000057 :101990000000000000000000000000000000000047 :1019A0000000000000000000000000000000000037 -:1019B0000000000000000080000080000000000027 +:1019B00000000000000000800000000000000000A7 :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 :1019E00000000000000000000000000000000000F7 @@ -4515,7 +4515,7 @@ :101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 :101A200000000000000000000000000000000000B6 -:101A3000000500000000000000050000008000001C +:101A30000010000000000000000500000080000011 :101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 :101A60000000000000000000000000000000000076 @@ -4523,7 +4523,7 @@ :101A80000000000000000000000000000000000056 :101A90000000000000000000000000000000000046 :101AA0000000000000000000000000000000000036 -:101AB00000000000000000C0000000000000000462 +:101AB00000000001000000C0000000000000004025 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 :101AE00000000000000000000000000000000000F6 @@ -4531,7 +4531,7 @@ :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 -:101B300000000000818100000000E00781810000BA +:101B300000000000818100000000E00788410000F3 :101B40000000E007000000000000000000000000AE :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 @@ -4605,96 +4605,96 @@ :101FA0000000000000000000000000000000000031 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 -:101FD000000000000000000000000000840000007D -:101FE00000000000000000000000200000000000D1 -:101FF00000000000200000000000000020000000A1 -:1020000000000000000000000000200000000000B0 -:10201000000000002000000200000000000020007E -:1020200000000000000000000000000000000000B0 +:101FD00000000000000020000000000020000000C1 +:101FE00000000000000020000400000000002000AD +:101FF0004000000020002000000000000000000061 +:102000000000000000002000200000000000200070 +:10201000200000002000000220000000000000005E +:10202000000000000000000000000000000084002C :1020300000000000000000000000000000000000A0 :102040000000000000000000000000000000000090 :102050000000000000000000000000000000000080 :102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 +:102070000000200000000000000000000000000040 :102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 +:10209000000000000000050000000000000000003B :1020A0000000000000000000000000000000000030 :1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000000000000010 :1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 +:1020E00000000000000000000008000000000000E8 :1020F00000000000000000000000000000000000E0 -:10210000000000000000000000400000000000008F +:1021000000000000000000000008000000000000C7 :1021100000100000000000000000000000000000AF -:1021200000000000000800000000000000000000A7 +:102120000000000000080000000000100000000097 :10213000000000000000000000000000000000009F :10214000000000000000000000000000000000008F :10215000000000000000000000000000000000007F :10216000000000000000000000000000000000006F :10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F +:10218000000000000000000000000010000000003F :10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F +:1021A0000000000000000000000000000008000027 :1021B000000000000000000000000000000000001F -:1021C00000000000000000100000000000000000FF +:1021C00000000000000000100000000000100000EF :1021D00000000000000000000000000000000000FF :1021E00000000000000000000000000000000000EF :1021F00000000000000000000000000000000000DF :1022000000000000000000000000000000000000CE -:1022100000000000000000000000000000000000BE +:1022100008000000000000000000000000000000B6 :1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E +:102230000000080000000000000000000000000096 :10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E +:1022500000008200000000000000000000000000FC :10226000000000000000000000000000000000006E :10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E +:102280000000000000000800000000000000000046 :10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E :1022B000000000000000000000000000000000001E :1022C000000000000000000000000000000000000E -:1022D00000000000000000000300000000000000FB +:1022D00003000300000000004100000000000000B7 :1022E00000000000000000000000000000000000EE :1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD :1023100000000000000000000000000000000000BD :1023200000000000000000000000000000000000AD -:102330000000000000000000000000000000C000DD -:102340000000000000000000000008000000000085 +:10233000000000000000000000000000A0000800F5 +:1023400000000800080004000000C00000000000B9 :10235000000000000000000000000000000000007D :10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D +:10237000000000100000000000000000000000004D :10238000000000000000000000000000000000004D :10239000000000000000000000000000000000003D :1023A000000000000000000000000000000000002D :1023B000000000000000000000000000000000001D -:1023C0000000000008000000000000000000000005 +:1023C000000000000000000000000000000000000D :1023D00000000000000000000000000000000000FD :1023E00000000000000000000000000000000000ED :1023F00000000000000000000000000000000000DD :1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC -:102430000000000000000000000000000800000094 -:10244000000000000000000000000000000000008C -:1024500000008200000000000000000000000000FA +:10243000000000000000000000000000000000009C +:102440000800000000000000000000000000000084 +:102450008200820000000000000000000000000078 :10246000000000000000000000000000000000006C -:10247000000000000000000000000000000000005C +:102470000000000009000000000000000000000053 :10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C :1024A000000000000000000000000000000000002C :1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000002100000000000000CB -:1024F00000020000000000000000000000000000DA +:1024D00000000000000000000000030000000000F9 +:1024E00008000000000000000000000000000000E4 +:1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B +:102530000000000000000000000000000800000093 :10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000040000000000000000000000000002B +:1025500000000000840000000000000000000000F7 +:10256000000000000000000000000000000000006B :10257000000000000000000000000000000000005B :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B @@ -4718,7 +4718,7 @@ :1026B000000000000000000000000000000000001A :1026C000000000000000000000000000000000000A :1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA +:1026E00000000300000000000000000000000000E7 :1026F00000000000000000000000000000000000DA :1027000000000000000000000000000000000000C9 :1027100000000000000000000000000000000000B9 @@ -4726,7 +4726,7 @@ :102730000000000000000000000000000000000099 :102740000000000000000000000000000000000089 :102750000000000000000000000000000000000079 -:102760000000000003000000000000100000000056 +:1027600000000000A00000000000001000000000B9 :102770000000000000000000000000000000000059 :102780000000000000000000000000000000000049 :102790000000000000000000000000000000000039 @@ -4734,7 +4734,7 @@ :1027B0000000000000000000000000000000000019 :1027C0000000000000000000000000000000000009 :1027D00000000000000000000000000000000000F9 -:1027E0000000000000009000000000000001000058 +:1027E00000000000000004000000000000010000E4 :1027F00000000000000000000000000000000000D9 :1028000000000000000000000000000000000000C8 :1028100000000000000000000000000000000000B8 @@ -4742,7 +4742,7 @@ :102830000000000000000000000000000000000098 :102840000000000000000000000000000000000088 :102850000000000000000000000000000000000078 -:102860000000000000000000000000000000200048 +:102860000000000000000000000000000000400028 :102870000000000000000000000000000000000058 :102880000000000000000000000000000000000048 :102890000000000000000000000000000000000038 @@ -4758,7 +4758,7 @@ :102930000000000000000000000000000000000097 :102940000000000000000000000000000000000087 :102950000000000000000000000000000000000077 -:102960000000000000000000000000000020000047 +:102960000000000000000000000000000000000067 :102970000000000000000000000000000000000057 :102980000000000000000000000000000000000047 :102990000000000000000000000000000000000037 @@ -4775,7 +4775,7 @@ :102A40000000000000000000000000000000000086 :102A50000000000000000000000000000000000076 :102A60000000000000000000000000000000000066 -:102A7000008100000000E0000000000000000000F5 +:102A7000004100000000E000000000000000000035 :102A80000000000000000000000000000000000046 :102A90000000000000000000000000000000000036 :102AA0000000000000000000000000000000000026 @@ -4857,15 +4857,15 @@ :102F60000000000000000000000000000000000061 :102F70000000000000000000000000000000000051 :102F80000000000000000000000000000000000041 -:102F90000000000000000000000000002000000011 -:102FA0000000000000000000000000000000200001 -:102FB00000000000000000000000000020000000F1 -:102FC00000000000000000000000000000002000E1 +:102F90000000000000000000000000000000000031 +:102FA00000000000200000000000000000002000E1 +:102FB0000000000000000000000000000000000011 +:102FC00000000000200000000000000000002000C1 :102FD00000000000000000000000000000000000F1 :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 :1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 +:1030100000000000000010000000000000000000A0 :1030200000000000000000000000000000000000A0 :103030000000000000000000000000000000000090 :103040000000000000000000000000000000000080 @@ -4873,22 +4873,22 @@ :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 +:103090000000000000000000000000000000000927 :1030A0000000000000040004000000000004000410 -:1030B0000000000000040000000000000004000404 +:1030B0000000000000040000000000000004000800 :1030C00000000000000400040000000000000000F8 :1030D00000000000000000000000000800000000E8 -:1030E00000100008000000000000000000000000C8 +:1030E00000080000000000000000000000000000D8 :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF :1031100000000000000000000000000000000000AF -:10312000400000000000000000000000000000005F +:103120000000000000000000000000040004000097 :10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F +:10314000001000000000000000000000000000006F :10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F +:10316000000000100000000000000000000000004F :10317000000000000000000000000000001000003F -:10318000000000000010000000000000000000002F +:10318000000000100000000000000000000000002F :10319000000000000000000000000000000000002F :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F @@ -4904,15 +4904,15 @@ :10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E :10327000000000000000000000000000000000004E -:103280000000000000000000000003000000030038 +:1032800003000000000000004100000000000000FA :10329000000000000000000000000000000000002E :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E :1032C00000000000000000000000000000000000FE :1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000008000000C6 -:10330000C0000000000000004000000000000000BD +:1032F00000000800000000000000000000000000C6 +:1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D :10333000000000000000000000000000000000008D @@ -4927,27 +4927,27 @@ :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED :1033E00000000000000000000000000000000000DD -:1033F000000000000000A00000000000000000002D -:1034000000000000000000000000000000000000BC +:1033F00000000000000000000000000000000000CD +:103400000000000000000000A0000000000000001C :1034100000000000000000000000010000000000AB :10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C +:10343000100000000000000000000000000000007C :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C :10346000000000000000000000000000000000005C :10347000000000000000000000000000000000004C :10348000000000000000000000000000000000003C -:103490000000000000000000000000000800030021 +:103490000000000000000000000000000800000024 :1034A000000000000000000000000000000000001C :1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC :1034D00000000000000000000000000000000000EC :1034E00000000000000000000000000000000000DC -:1034F00000000800000000000000000000000000C4 -:1035000000000000000000000000000000000000BB +:1034F00000000000000000000000000000000000CC +:1035000000000000080000000000000000000000B3 :1035100000000000000000000000000000000000AB :10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B +:103530000008000000000000000000000000000083 :10354000000000000000000000000000000000007B :10355000000000000000000000000000000000006B :10356000000000000000000000000000000000005B @@ -5109,7 +5109,7 @@ :103F20000000000000000000000000000000000091 :103F30000000000000000000000000000000000081 :103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 +:103F50000000000000000000000000002000000041 :103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 @@ -5117,8 +5117,8 @@ :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 -:103FE00000030000000000000000000000000000CE +:103FD00000000000000000000000000500000000DC +:103FE00000030005000000000000000000000000C9 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 @@ -5126,17 +5126,17 @@ :104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 :104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 +:1040600000000000000000000000000000840000CC :104070000000000000100000000000000010000020 :104080000000000000000000000000000000001020 -:104090000000000000000000000000000000000020 +:104090000000000000100000000000000000000010 :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 :1040C00000000000000000000000000000000000F0 :1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF +:1040E00000000000000000000000000000000005CB +:1040F0000000000000000008000000000000002197 +:1041000000000000000000000000000000000005AA :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F :10413000000000000000000000000000000000007F @@ -5157,16 +5157,16 @@ :10422000000000000000000000000000000000008E :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000308000000000500000000003E -:10427000000000000000000800000800000000002E +:1042500000000000000000000000000000000090CE +:104260000000000000080000000000000000000046 +:104270000000080008000008000000000000000026 :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E :1042A000000000000000000000000000000000000E :1042B00000000000000000000000000000000000FE :1042C00000000000000000000000000000000000EE :1042D00000000000000000000000000000000000DE -:1042E000900000000000000000000000000000003E +:1042E00000000000000000000000000000000000CE :1042F00000000000000000000000000000000000BE :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D @@ -5184,14 +5184,14 @@ :1043D00000000000000000000000000000000000DD :1043E00000000000000000000000000000000000CD :1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC +:10440000000000400000000000000000000000006C :10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C +:10442000000000400000000000000000000000004C :10443000000000000000000000000000000000007C :10444000000000000000000000000000000000006C :10445000000000000000000000000000000000005C :10446000000000000000000000000000000000004C -:1044700000000000410000000000000000000000FB +:10447000000000000000000000000000000000003C :10448000000000000000000000000000000000002C :10449000000000000000000000000000000000001C :1044A000000000000000000000000000000000000C @@ -5297,162 +5297,162 @@ :104AE00000000000000000000000000000000000C6 :104AF00000000000000000000000000000000000B6 :104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000010001075 -:104B20000000000000050004000000000005000077 -:104B3000000000000040001000000000000200041F +:104B100000800000000000000000000000100010F5 +:104B2000001000100002000500000000000400005A +:104B3000000000000004000000000000000200026D :104B40000000000000000000000000000000000065 :104B50000000000000000000000000000000000055 :104B60000000000000000000000000000000000045 :104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000100000000000004 +:104B9000000000080000000000000000000000000D +:104BA0000000000100010001000000000000000101 :104BB00000000000000000010000000000000001F3 :104BC00000010000000000000000000000000000E4 :104BD00000000000000000000000000000000000D5 :104BE00000000000000000000000000000000000C5 :104BF00000000000000000000000000000000000B5 -:104C00000000000000080008001000050005000575 -:104C1000000500050000000000000000000000008A -:104C20000000000000800080008000000080000084 -:104C30000080008000800000008000800080000074 +:104C0000000000000005000000000008000800008F +:104C1000001000080000000000000000000000007C +:104C20000000000000800000008000800080000084 +:104C300000000080008000000080008000800000F4 :104C40000080008000000000000000000000000064 :104C50000000000000000000000000000000000054 :104C60000000000000000000000000000000000044 :104C70000000000000000000000000000000000034 -:104C8000000000000000008400000084000800080C -:104C900000000010000800080000000800080008DC -:104CA00000840008000800200010000400840010A8 -:104CB00000000004000400100000000400020010C6 -:104CC00000000040000200000000000000000000A2 +:104C80000000000000000008000000840084000014 +:104C900000000084008400080000001000080008E4 +:104CA000008400080008002000000004000200103A +:104CB000000000840002001000000040000400100A +:104CC00000000040000400000000000000000000A0 :104CD00000000000000000000000000000000000D4 :104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 -:104D0000000000000000000000000000000800108B -:104D1000000500000008000500410000001000210F -:104D20000021000300210021000000000002000219 -:104D30000021000300020002000000000002000445 -:104D4000001000000004000000000000000000004F +:104D00000000000000000000000000000010001083 +:104D1000000000000008000500410000000800211C +:104D200000210000002100210000000000210004FB +:104D30000003000300020004000000000002000263 +:104D4000000000000004000000000000000000005F :104D50000000000000000000000000000000000053 :104D60000000000000000000000000000000000043 :104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000210002 +:104D80000000000000000000000000000000000023 :104D9000000000000000000000000000000000A073 -:104DA0000000000000000000000000000000000102 +:104DA0000000000000000000000000000000000003 :104DB00000010000000000010001000000000001EF :104DC00000010000000000010000000000000000E1 :104DD00000000000000000000000000000000000D3 :104DE00000000000000000000000000000000000C3 :104DF00000000000000000000000000000000000B3 -:104E0000000000000000000000000000C000C00022 -:104E100082000800A0000000080008000800000050 -:104E200000000000000000000000080082000000F8 +:104E00000000000000000000000000000800C000DA +:104E100008004000000000008200000000000000C8 +:104E200000000000000000000000C00000000000C2 :104E30000000000000000000000000000000000072 :104E40000000000000000000000000000000000062 :104E50000000000000000000000000000000000052 :104E60000000000000000000000000000000000042 :104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA00000000000040000000000000000000000FE +:104E8000000000000000000000000000000000849E +:104E9000000000080000000000000000000000000A +:104EA0000000000000000000000000000000000002 :104EB00000000000000000000000000000000000F2 :104EC00000000000000000000000000000000000E2 :104ED00000000000000000000000000000000000D2 :104EE00000000000000000000000000000000000C2 :104EF00000000000000000000000000000000000B2 :104F000000000000000000000000000000000000A1 -:104F10000000000000000000820008000000000007 -:104F2000820008000800A0008200000000000000CD -:104F30000010000000000000000000000000000061 -:104F40000010000000000000000000000000000051 +:104F1000000000000000080008000800C0000800B1 +:104F20000800820082000000080000000000080065 +:104F300000000000C00000000000C00000000000F1 +:104F40000010000000000010000000000000000041 :104F50000000000000000000000000000000000051 :104F60000000000000000000000000000000000041 :104F70000000000000000000000000000000000031 :104F80000000000000000000000000000000000021 :104F90000000000000000000000000000000000011 :104FA0000000000000000000000000000000000001 -:104FB00000000001000000000000000000000000F0 +:104FB00000000000000000000000000000000000F1 :104FC00000000000000000000000000000000000E1 :104FD00000000001000000000000000000000000D0 :104FE00000000000000000000000000000000000C1 :104FF00000000000000000000000000000000000B1 :1050000000000000000000000000000000000000A0 -:105010000000000008000800000000000000000080 -:105020000000820000080000000082100000000064 -:105030000800000000000000000200000000000066 +:1050100000000000000008000000820000210000E5 +:105020000800000000000800080008100000000050 +:105030000800000000000000000000000000000068 :105040000000000000000000000000000000000060 :105050000000000000000000000000000000000050 :105060000000000000000000000000000000000040 :105070000000000000000000000000000000000030 :105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 -:1050A00000000000000000010000000008000000F7 +:1050A00000000000000041000000000000000000BF :1050B00000000000000000000000000000000000F0 :1050C00000000000000000000000000000000000E0 :1050D00000000000000000010000000000000000CF :1050E00000000000000000000000000000000000C0 :1050F00000000000000000000000000000000000B0 :10510000000000000000000000000000000000009F -:1051100000000000000000000100C10000000100CC -:105120000100050001000000010001000100010074 -:105130000000C100000101000001C00000010001E9 +:105110000000000000000000010005000000010088 +:1051200001004100010000000100C1000000010079 +:1051300001000500000001000001C00000010001A5 :10514000C101C00000830101C000C0000083010153 :105150000000C0000001010100000000000000008C :10516000000000000000000000000000000000003F :10517000000000000000000000000000000000002F :10518000000000000000000000000000000000001F -:10519000000000000000000000004100C1210341A8 -:1051A00041004100C1212041000041004121024154 -:1051B00041000000C10003034100004180000005E0 -:1051C0000003C141800000834103C041800000838F +:10519000000000000000000000004100C1210541A6 +:1051A000410041004121034100004100C12105416E +:1051B00041004100C1004041410000418000000524 +:1051C0000003C141800000834103834180000083CC :1051D0004103004180000003410300000000000083 :1051E00000000000000000000000000000000000BF :1051F00000000000000000000000000000000000AF :10520000000000000000000000000000000000009E :10521000000000000000000000000000414100808C -:10522000004185414141808000410341414180006E -:1052300000418341C141808000418500800003001E +:1052200000418341414180800041054141418080EE +:105230000041C041C1418080004183008000038063 :105240000080008000412100008080000041C100FA :1052500000C18000C141C100004180000000000089 :10526000000000000000000000000000000000003E :10527000000000000000000000000000000000002E :10528000000000000000000000000000000000001E :10529000000000000000000000000000000000010D -:1052A00000C0000182010001C0C000010101000135 -:1052B0002040000120014001C00200018200C00026 -:1052C000010000C000C00001000000C08200000119 +:1052A00000C0000141010001C0C000010001000177 +:1052B0002002000182014001C00200014100C00043 +:1052C00001C000C000C00001000000C08200000159 :1052D000400000C18200C1014000000182000000C6 :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE :10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D -:1053200000000000C084C10100000000C041002155 -:1053300001000000C188028500830000400900824E +:1053200000000000C084C10100000000C085012011 +:1053300001000000C103888400400000C105008313 :1053400000C000000200000000000000C0000000DB :1053500000400000C000000000400000C00000004D :10536000000000000000000000000000000000003D :10537000000000000000000000000000000000002D :10538000000000000000000000000000000000001D :10539000000000000000000000000000000000000D -:1053A0000000004100418083C1030041004180852D -:1053B000038341410041C121808341830021038552 -:1053C00040A0008000008500000000000000800078 +:1053A0000000004100418083C1030041004180832F +:1053B00041C041410041C183008300C10041828559 +:1053C00005820080000085000000000000008000D1 :1053D000000000C100218041000000C100008041A8 :1053E00000000000000000000000000000000000BD :1053F00000000000000000000000000000000000AD :10540000000000000000000000000000000000009C :10541000000000000000000000000000000000008C -:1054200000000000410500A100800000C1C100C0D3 -:1054300000000200410000C000410500414100C1E0 -:105440000003030000418000C1850041808080008E +:1054200000000000410500A100800000C18000854F +:10543000000040004100008300410500410000C120 +:105440000002030000418000C1850041808080008F :1054500000C0004100418000008000410041000088 :1054600000C100410000000000000000000000003A :10547000000000000000000000000000000000002C :10548000000000000000000000000000000000001C :10549000000000000000000000000000000000000C -:1054A000000000000000010000C000C0000040C17A -:1054B00000C000000100000000C000010100010167 -:1054C00000C1000001000001200041C0000140C0F7 +:1054A000000000000000010000C000C0000040C07B +:1054B00000C000000000000000C000010100010069 +:1054C00000C1000101000001200041C0000140C0F6 :1054D000400000C000010001200000C000010001E8 :1054E000000000C1000100000000000000000000FA :1054F00000000000000000000000000000000000AC @@ -5460,7 +5460,7 @@ :10551000000000000000000000000000000000008B :10552000000000000000000000000081210048424F :1055300088000000000048420000000000004842CF -:1055400000120042000048428412008121004842BB +:1055400000120044000048428412008121004842B9 :10555000001200000000484288000042000048425B :1055600000000000000048420000000000000000B1 :10557000000000000000000000000000000000002B @@ -7230,7 +7230,7 @@ :10C3B000000000000000000000000000000000007D :10C3C000000000000000000000000000000000006D :10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D +:10C3E000000000000000000000000020000000002D :10C3F000000000000000000000000000000000003D :10C40000000000000000000000000000000000002C :10C41000000000000000000000000000000000001C @@ -7522,7 +7522,7 @@ :10D5F000000000000000000000000000000000002B :10D60000000000000000000000000000000000001A :10D61000000000000000000000000000000000000A -:10D6200000000000000000000000000000000000FA +:10D6200000000000002000000000000000000000DA :10D6300000000000000000000000000000000000EA :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA @@ -7742,7 +7742,7 @@ :10E3B000000000000000000000000000000000005D :10E3C000000000000000000000000000000000004D :10E3D000000000000000000000000000000000003D -:10E3E0000000000000000000040000000000000029 +:10E3E000000000000000000000000000000000002D :10E3F000000000000000000000000000000000001D :10E40000000000000000000000000000000000000C :10E4100000000000000000000000000000000000FC @@ -7750,7 +7750,7 @@ :10E4300000000000000000000000000000000000DC :10E4400000000000000000000000000000000000CC :10E4500000000000000000000000000000000000BC -:10E4600000000000000000000000000000000000AC +:10E4600000000000040000000000000000000000A8 :10E47000000000000000000000000000000000009C :10E48000000000000000000000000000000000008C :10E49000000000000000000000000000000000007C @@ -7993,16 +7993,16 @@ :10F36000000000000000000000000000000000009D :10F37000000000000000000000000000000000008D :10F38000000000000000000000000000000000007D -:10F39000000000000000000000000000000000006D -:10F3A000000000000000000000000000000000005D +:10F390000000000000000000040004000000000065 +:10F3A0000000000004000000000000000000000059 :10F3B000000000000000000000000000000000004D :10F3C000000000000000000000000000000000003D :10F3D000000000000000000000000000000000002D :10F3E000000000000000000000000000000000001D :10F3F000000000000000000000000000000000000D :10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC -:10F4200000000000000000000000000000000000DC +:10F4100000000000000000000000000004000000E8 +:10F4200000000000040000000004000000000000D4 :10F4300000000000000000000000000000000000CC :10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC @@ -8238,8 +8238,8 @@ :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E +:1002D000000000000000000000000000040000001A +:1002E000040000000000000000000000000000000A :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD @@ -8247,7 +8247,7 @@ :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D -:10036000000000000000000000000000000000008D +:100360000400000004000000000000000000040081 :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D @@ -8475,14 +8475,14 @@ :10117000000000000000000000000000000000006F :10118000000000000000000000000000000000005F :10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F +:1011A000000000000000000000000000000400003B :1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F :1011D000000000000000000000000000000000000F :1011E00000000000000000000000000000000000FF :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE +:10121000004000000000000000000000000000008E :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E @@ -8490,7 +8490,7 @@ :10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E :10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E +:10129000000000000000000000000000000004004A :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E @@ -8498,8 +8498,8 @@ :1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD +:1013100000000000040004000000000000000000C5 +:1013200000000000000004000000000000000400B5 :1013300000000000000000000000000000000000AD :10134000000000000000000000000000000000009D :10135000000000000000000000000000000000008D @@ -8735,16 +8735,16 @@ :1021B000000000000000000000000000000000001F :1021C000000000000000000000000000000000000F :1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF +:1021E00000000000000000000400000000000000EB :1021F00000000000000000000000000000000000DF :1022000000000000000000000000000000000000CE :1022100000000000000000000000000000000000BE :1022200000000000000000000000000000000000AE :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E -:10225000000000000000000000000000000002007C -:10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E +:102250000000000000000000040004000000000076 +:10226000000000000000000000000000000004006A +:10227000000000000000000004000000000000005A :10228000000000000000000000000000000000004E :10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E @@ -8972,7 +8972,7 @@ :103080000000000000000000000000000000000040 :103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 +:1030B000000000000000000400000000000000000C :1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 :1030E00000000000000000000000000000000000E0 @@ -8985,10 +8985,10 @@ :10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F +:10318000000000000000000000000000020002003B +:10319000040000000000000002000400040004001D :1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F +:1031B000000000000000040000000000000000000B :1031C00000000000000000000000000000000000FF :1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF @@ -8996,7 +8996,7 @@ :1032000000000000000000000000000000000000BE :1032100000000000000000000000000000000000AE :10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E +:10323000040000000000000000000000000000008A :10324000000000000000000000000000000000007E :10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E @@ -9214,11 +9214,11 @@ :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 -:103FD00000000000200000000000000000000000C1 +:103FD00000000000000000000000200000000000C1 :103FE00000000000000000000000000000000000D1 -:103FF00000000000200000000000000000000000A1 +:103FF00000000000000000000000200000000000A1 :1040000000000000000000000000000000000000B0 -:104010000000000000002000000000000000000080 +:104010000000000000000000000000002000000080 :104020000000000000000000000000000000000090 :104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 @@ -9230,8 +9230,8 @@ :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 :1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 +:1040D00002000000020000000000000000000000DC +:1040E00004000400000000000000000000000000C8 :1040F00000000000000000000000000000000000C0 :1041000000000000000000000000000000000000AF :10411000000000000000000000000000000000009F @@ -9272,8 +9272,8 @@ :10434000000000000000000000000000000000006D :10435000000000000000000000000000000000005D :10436000000000000000000000000000000000004D -:104370000400000000000000000000000000000039 -:10438000000000000000000000000000000000002D +:10437000000000000000000000000000000000003D +:104380000400000000000000000000000000000029 :10439000000000000000000000000000000000001D :1043A000000000000000000000000000000000000D :1043B00000000000000000000000000000000000FD @@ -9301,16 +9301,16 @@ :10451000000000000000000000000000000000009B :10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B -:104540000000000000000000000008000000000063 +:10454000000000000000000000000000000000006B :10455000000000000000000000000000000000005B :10456000000000000000000000000000000000004B :10457000000000000000000000000000000000003B :10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B +:1045900000000020000000000000000000000000FB :1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB :1045C00000000000000000000000000000000000EB -:1045D00000000000210000000000000000000000BA +:1045D00000000800000000000000000000000000D3 :1045E00000000000000000000000000000000000CB :1045F00000000000000000000000000000000000BB :1046000000000000000000000000000000000000AA @@ -9465,11 +9465,11 @@ :104F50000000000000000000000000000000000051 :104F60000000000000000000000000000000000041 :104F70000000000000000000000000000000000031 -:104F80000000000000000000200000000000000001 -:104F900000000000000000002000000000000000F1 -:104FA00000000000000000002000000000000000E1 -:104FB00000000000000000002000000000000000D1 -:104FC00004000000000000000000200000000000BD +:104F800000000000000000000000200020000000E1 +:104F90000000000000000000000000000000000011 +:104FA00000000000000000000000200020000000C1 +:104FB00000000000000000000000000000000000F1 +:104FC000042000000000000000000000200020007D :104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 :104FF00000000000000000000000000000000000B1 @@ -9477,15 +9477,15 @@ :105010000000000000000000000000000000000090 :105020000000000000000000000000000000000080 :105030000000000000000000000000000000000070 -:1050400000008000000100000000000000000000DF +:1050400000008001000100000000000000000000DE :105050000000000000000000000000000000000050 :105060000000000000000000000000000000000040 :105070000000000000000000000000000000000030 :105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 +:10509000000002000400000000000000000000000A :1050A0000000000000000000000000000000000000 :1050B00000000000000000000000000000000000F0 -:1050C00000000000002000000000000000000000C0 +:1050C00000000000000000000000000000000000E0 :1050D00000000000000000000000000000000000D0 :1050E00000000000000000000000000000000000C0 :1050F00000000000000000000000000000000000B0 @@ -9493,7 +9493,7 @@ :10511000000000000000000000000000000000008F :10512000000000000000000000000000000000007F :10513000000000000000000000000000000000006F -:10514000000000000000000100000000000000005E +:10514000000000000000000000000000000000005F :10515000000000000000000000000000000000004F :10516000000000000000000000000000000000003F :10517000000000000000000000000000000000002F @@ -9516,11 +9516,11 @@ :10528000000000000000000000000000000000001E :10529000000000000000000000000000000000000E :1052A00000000000000000000000000000000000FE -:1052B00000000000400000000000000000000000AE +:1052B00000000000000000000000000000000000EE :1052C00000000000000000000000000000000000DE :1052D00000000000000000000000000000000000CE :1052E00000000000000000000000000000000800B6 -:1052F00000000000C00000000000000000000000EE +:1052F00000000000000000000000000000000000AE :10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D :10532000000000000000000000000000000000007D @@ -9536,8 +9536,8 @@ :1053C00000000000000000000000000000000000DD :1053D00000000000000000000000000000000000CD :1053E00000000000000000000000000000000000BD -:1053F0000000A00000000000000008000000000005 -:10540000C00000000000C00000000000000000001C +:1053F000000000000000000000000000080008009D +:10540000000000000000000000000000000000009C :10541000000000000000000000000000000000008C :10542000000000000000000000000000000000007C :10543000000000000000000000000000000000006C @@ -9549,11 +9549,11 @@ :10549000000000000000000000000000000000000C :1054A00000000000000000000000000000000000FC :1054B00000000000000000000000000000000000EC -:1054C000000000000000000000000000820000005A +:1054C0000000000000000000040000004000000098 :1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000800B4 +:1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC -:105500000000000000008200000000000000000019 +:105500000000000000008200000000009000C000C9 :10551000000000000000000000000000000000008B :10552000000000000000000000000000000000007B :10553000000000000000000000000000000000006B @@ -9586,7 +9586,7 @@ :1056E00000000000000000000000000000000000BA :1056F00000000000000000000000000000000000AA :105700000000000000000000000000000000000099 -:105710008000000000400005800000000000002024 +:10571000800000000000000580000000000500057A :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 :105740000000000000000000000000000000000059 @@ -9594,11 +9594,11 @@ :105760000000000000000000000000000000000039 :105770000000000000000000000000000000000029 :105780000000000000000000000000000000000019 -:1057900000004000000000000000020000000000C7 -:1057A00000010000000000000000000000000000F8 +:1057900000000200000000000000400000000000C7 +:1057A00000000000000000000000000000000000F9 :1057B00000000000000000000000000000000000E9 :1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 +:1057D00000000000000000000000000000010000C8 :1057E00000000000000000000000000000000000B9 :1057F00000000000000000000000000000000000A9 :105800000000000000000000000000000000000098 @@ -9606,7 +9606,7 @@ :105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 :105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 +:105850000000000000000000000000000000004008 :105860000000000000000000000000000000000038 :105870000000000000000000000000000000000028 :105880000000000000000000000000000000000018 @@ -9615,7 +9615,7 @@ :1058B00000000000000000000000000000000000E8 :1058C00000000000000000000000000000000000D8 :1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 +:1058E0008000000000000000000000000000000038 :1058F00000000000000000000000000000000000A8 :105900000000000000000000000000000000000097 :105910000000000000000000000000000000000087 @@ -9623,7 +9623,7 @@ :105930000000000000000000000000000000000067 :105940000000000000000000000000000000000057 :105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 +:105960000000040000000000000000000000000033 :105970000000000000000000000000000000000027 :105980000000000000000000000000000000000017 :105990000000000000000000000000000000000007 @@ -9734,7 +9734,7 @@ :106020000000000000000000000000000000000070 :106030000000000000000000000000000000000060 :106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 +:106050000000000000000000000000000000004000 :106060000000000000000000000000000000000030 :106070000000000000000000000000000000000020 :106080000000000000000000000000000000000010 @@ -9985,10 +9985,10 @@ :106FD00000000000000000000000000000000000B1 :106FE00000000000000000000000000000000000A1 :106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000010000000000000000000000000000040 +:107000000000020002000200000000000000020078 +:10701000020002000200000000000000000000006A +:10702000000000000000000000000000020000005E +:107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 :107050000000000000000000000000000000000030 :107060000000000000000000000000000000000020 @@ -10229,8 +10229,8 @@ :107F10000000000000000000000000000000000061 :107F20000000000000000000000000000000000051 :107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000000000000000000021 +:107F40000000000000000200080002000000000025 +:107F5000000000000000020002000000000000001D :107F60000000000000000000000000000000000011 :107F70000000000000000000000000000000000001 :107F800000000000000000000000000000000000F1 @@ -10481,7 +10481,7 @@ :108ED0000000000000000000000000000000000092 :108EE0000000000000000000000000000000000082 :108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 +:108F0000000000000000000002000200000000005D :108F10000000000000000000000000000000000051 :108F20000000000000000000000000000000000041 :108F30000000000000000000000000000000000031 @@ -10490,7 +10490,7 @@ :108F60000000000000000000000000000000000001 :108F700000000000000000000000000000000000F1 :108F800000000000000000000000000000000000E1 -:108F900000000000000000000000000000100000C1 +:108F900000000000000000000000000000000000D1 :108FA00000000000000000000000000000000000C1 :108FB00000000000000000000000000000000000B1 :108FC00000000000000000000000000000000000A1 @@ -10976,10 +10976,10 @@ :10ADC0000000000000000000000000000000000083 :10ADD0000000000000000000000000000000000073 :10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 +:10ADF00000000000000000400040000000000000D3 +:10AE00000000004000000040004000000000000082 :10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 +:10AE200000400000000000000000000000000000E2 :10AE30000000000000000000000000000000000012 :10AE40000000000000000000000000000000000002 :10AE500000000000000000000000000000000000F2 @@ -11009,7 +11009,7 @@ :10AFD0000000000000000000000000000000000071 :10AFE0000000000000000000000000000000000061 :10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 +:10B0000000000040000000000000000000400000C0 :10B010000000000000000000000000000000000030 :10B020000000000000000000000000000000000020 :10B030000000000000000000000000000000000010 @@ -11220,7 +11220,7 @@ :10BD00000000000000000000000000000000000033 :10BD10000000000000000000000000000000000023 :10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 +:10BD30000000000000000000000000400040004043 :10BD400000000000000000000000000000000000F3 :10BD500000000000000000000000000000000000E3 :10BD600000000000000000000000000000000000D3 @@ -11229,7 +11229,7 @@ :10BD900000000000000000000000000000000000A3 :10BDA0000000000000000000000000000000000093 :10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 +:10BDC00000000000000000000000000000400040F3 :10BDD0000000000000000000000000000000000063 :10BDE0000000000000000000000000000000000053 :10BDF0000000000000000000000000000000000043 @@ -11472,7 +11472,7 @@ :10CCC0000000000000000000000000000000000064 :10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 +:10CCF0000010001000000000000000000040004193 :10CD00000000000000000000000000000000000023 :10CD10000000000000000000000000000000000013 :10CD20000000000000000000000000000000000003 @@ -11481,7 +11481,7 @@ :10CD500000000000000000000000000000000000D3 :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 +:10CD80000000000000000000000000000010000093 :10CD90000000000000000000000000000000000093 :10CDA0000000000000000000000000000000000083 :10CDB0000000000000000000000000000000000073 @@ -11512,8 +11512,8 @@ :10CF400000000000000000000000000000000000E1 :10CF500000000000000000000000000000000000D1 :10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 +:10CF700000000000000000000000000000000004AD +:10CF8000008400000000000000000000000000001D :10CF90000000000000000000000000000000000091 :10CFA0000000000000000000000000000000000081 :10CFB0000000000000000000000000000000000071 @@ -11537,7 +11537,7 @@ :10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F +:10D1000000000000000000000000000000000040DF :10D11000000000000000000000000000000000000F :10D1200000000000000000000000000000000000FF :10D1300000000000000000000000000000000000EF @@ -13660,7 +13660,7 @@ :10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B :10559000000000000000000000000000000000000B -:1055A00000000000000000000000000000000000FB +:1055A00000000000000000000002000000000000F9 :1055B00000000000000000000000000000000000EB :1055C00000000000000000000000000000000000DB :1055D00000000000000000000000000000000000CB @@ -13912,14 +13912,14 @@ :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B +:106560000000000000000000000000000000000427 :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB :1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB +:1065D00000000000000000000000001100000000AA :1065E00000000000000000000000000000000000AB :1065F000000000000000000000000000000000009B :10660000000000000000000000000000000000008A @@ -13967,7 +13967,7 @@ :1068A00000000000000000000000000000000000E8 :1068B00000000000000000000000000000000000D8 :1068C00000000000000000000000000000000000C8 -:1068D00000000000000000000000000000000000B8 +:1068D000000000000000002100000000000800008F :1068E00000000000000000000000000000000000A8 :1068F0000000000000000000000000000000000098 :106900000000000000000000000000000000000087 @@ -14130,7 +14130,7 @@ :1072D00000000000000000000000000000000000AE :1072E000000000000000000000000000000000009E :1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D +:10730000000000000000000000000000400000003D :10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D :10733000000000000000000000000000000000004D @@ -14146,7 +14146,7 @@ :1073D00000000000000000000000000000000000AD :1073E000000000000000000000000000000000009D :1073F000000000000000000000000000000000008D -:10740000000000000000000000000000000000007C +:107400000000000000000000000004000400000074 :10741000000000000000000000000000000000006C :10742000000000000000000000000000000000005C :10743000000000000000000000000000000000004C @@ -14156,9 +14156,9 @@ :10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC :1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC +:1074A00000080000000000000000000000000000D4 +:1074B00000000004000000000000000000000000C8 +:1074C000009000000000000000000000000000002C :1074D00000000000000000000000000000000000AC :1074E000000000000000000000000000000000009C :1074F000000000000000000000000000000000008C @@ -14170,7 +14170,7 @@ :10755000000000000000000000000000000000002B :10756000000000000000000000000000000000001B :10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB +:107580000000000000000000008200000000000079 :1075900000000000000000000000000000000000EB :1075A00000000000000000000000000000000000DB :1075B00000000000000000000000000000000000CB @@ -14179,7 +14179,7 @@ :1075E000000000000000000000000000000000009B :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A +:10761000000000000020000000000000000000004A :10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A @@ -14188,14 +14188,14 @@ :10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA +:1076A00008000000000000000000000000000000D2 :1076B00000000000000000000000000000000000CA :1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A :1076F000000000000000000000000000000000008A :107700000000000000000000000000000000000079 -:107710000000000000000000000000000000000069 +:107710000000000000000000000000000008000061 :107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 :107740000000000000000000000000000000000039 @@ -14204,7 +14204,7 @@ :107770000000000000000000000000000000000009 :1077800000000000000000000000000000000000F9 :1077900000000000000000000000000000000000E9 -:1077A00000000000000000000000000000000000D9 +:1077A00002000000000000000000000000000000D7 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 :1077D00000000000000000000000000000000000A9 @@ -14220,9 +14220,9 @@ :107870000000000000000000000000000000000008 :1078800000000000000000000000000000000000F8 :1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 +:1078A00000001000000000000000000000000000C8 :1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 +:1078C00000000800000000000000000000000000B0 :1078D00000000000000000000000000000000000A8 :1078E0000000000000000000000000000000000098 :1078F0000000000000000000000000000000000088 @@ -14381,11 +14381,11 @@ :1082800000000000000000000000000000000000EE :1082900000000000000000000000000000000000DE :1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E +:1082B0000000000000000000000000008800000036 +:1082C000000040000000000000000000000020004E +:1082D000C0000000000000000000000000000000DE :1082E000000000000000000000000000000000008E -:1082F000000000000000000000000000000000007E +:1082F000000000030000000000000000000000007B :10830000000000000000000000000000000000006D :10831000000000000000000000000000000000005D :10832000000000000000000000000000000000004D @@ -14398,7 +14398,7 @@ :1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD :1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD +:1083C00004000000000000000000000000000000A9 :1083D000000000000000000000000000000000009D :1083E000000000000000000000000000000000008D :1083F000000000000000000000000000000000007D @@ -14406,7 +14406,7 @@ :10841000000000000000000000000000000000005C :10842000000000000000000000000000000000004C :10843000000000000000000000000000000000003C -:10844000000000000000000000000000000000002C +:10844000000000000000200000000000000000000C :10845000000000000000000000000000000000001C :10846000000000000000000000000000000000000C :1084700000000000000000000000000000000000FC @@ -14432,21 +14432,21 @@ :1085B00000000000000000000000000000000000BB :1085C00000000000000000000000000000000000AB :1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B +:1085E000000000004000000000000000000000004B :1085F000000000000000000000000000000000007B :10860000000000000000000000000000000000006A :10861000000000000000000000000000000000005A :10862000000000000000000000000000000000004A :10863000000000000000000000000000000000003A -:10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A -:1086700000000000000000000000000000000000FA +:10864000000000000000000000000000002000000A +:108650001000210000002100410000000000000087 +:108660000000000000000002080000000000000000 +:1086700008002100000003000000000000000000CE :1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA :1086A00000000000000000000000000000000000CA :1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA +:1086C00000000000000000000000000008000000A2 :1086D000000000000000000000000000000000009A :1086E000000000000000000000000000000000008A :1086F000000000000000000000000000000000007A @@ -14463,18 +14463,18 @@ :1087A00000000000000000000000000000000000C9 :1087B00000000000000000000000000000000000B9 :1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 +:1087D00082000000400000000000000000000000D7 :1087E0000000000000000000000000000000000089 -:1087F0000000000000000000000000000000000079 +:1087F0000800000000000000000000000000000071 :108800000000000000000000000000000000000068 :108810000000000000000000000000000000000058 :108820000000000000000000000000000000000048 :108830000000000000000000000000000000000038 :108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000000000E8 +:108850000000002000000000000000000000008870 +:108860000000000008000000000000000000000000 +:108870000000000000000000000000000000008870 +:1088800000000000080008000000000000000000D8 :1088900000000000000000000000000000000000D8 :1088A00000000000000000000000000000000000C8 :1088B00000000000000000000000000000000000B8 @@ -14625,17 +14625,17 @@ :1091C000000000000000000000000000000000009F :1091D000000000000000000000000000000000008F :1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E +:1091F000000000000000000000002000000020002F +:109200000000040004000005200000000000000031 +:109210000000000000000008000000000000000046 :10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E +:10923000000000000000000200010000000000002B :10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E :1092600000000000000000000000000000000000FE :1092700000000000000000000000000000000000EE :1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE +:1092900000000000000000000005000000000000C9 :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE :1092C000000000000000000000000000000000009E @@ -14644,13 +14644,13 @@ :1092F000000000000000000000000000000000006E :10930000000000000000000000000000000000005D :10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D +:109320000000000000000000880084000000000031 +:10933000C00000000000000000000000000000006D :10934000000000000000000000000000000000001D :10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD +:1093800000000000000004200000000000000000B9 :1093900000000000000000000000000000000000CD :1093A00000000000000000000000000000000000BD :1093B00000000000000000000000000000000000AD @@ -14658,42 +14658,42 @@ :1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D :1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C +:109400000200000500050000000000000000000050 +:109410000000000000000000000000000000000448 :10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C +:10943000000000000000000000000000000010809C :10944000000000000000000000000000000000001C :10945000000000000000000000000000000000000C :1094600000000000000000000000000000000000FC :1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC +:1094800000000000000000000000000000002100BB :1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC +:1094A00000010000000000000000000000000000BB :1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C +:1094C0008004000000000000000000000000000018 :1094D000000000000000000000000000000000008C :1094E000000000000000000000000000000000007C :1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000000000003B +:1095000000000000000088000000C000820082000F +:1095100082008200840082000000820082008200BB +:1095200082008200820082000000000082000000B1 :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B :10955000000000000000000000000000000000000B :1095600000000000000000000000000000000000FB :1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB +:1095800000000000000000000000000000000800D3 +:1095900020000000000000000000000000000000AB :1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B :1095E000000000000000000000000000000000007B :1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A -:10963000000000000000000000000000000000002A +:109600000000000000000000000000000000C0009A +:1096100008000000A000000008000000000000009A +:1096200000000000000000000000000000008200B8 +:109630000000000000000000080000000000000022 :10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A :1096600000000000000000000000000000000000FA @@ -14706,10 +14706,10 @@ :1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A :1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 +:109700000000000000000000000000000000080051 +:1097100008000800040020040020000000000000F1 +:109720000000000000000000000000000000080031 +:10973000840008001000080008000000000000007D :109740000000000000000000000000000000000019 :109750000000000000000000000000000000000009 :1097600000000000000000000000000000000000F9 @@ -14723,75 +14723,75 @@ :1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 +:1098100000010001000100C10001000100C000C101 +:1098200001000001008200200001000100C10000D1 +:1098300000010001000100C10001000100C000C1E1 +:1098400001000501000400820001000100C10000C8 :109850000000000000000000000000000000000008 :1098600000000000000000000000000000000000F8 :1098700000000000000000000000000000000000E8 :1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000000000098 +:10989000000000410041004100820041004100A061 +:1098A00008412005034100000000004100410085FF +:1098B000000000410041004100820041004100A041 +:1098C00008412005A0410080008000410041008542 :1098D0000000000000000000000000000000000088 :1098E0000000000000000000000000000000000078 :1098F0000000000000000000000000000000000068 :109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 -:109940000000000000000000000000000000000017 -:109950000000000000000000000000000000000007 +:1099100000000000410003000000008041008500BD +:10992000000020000200A000000082004100C100F1 +:10993000008080804100030000000080410085001D +:10994000000020000200A000000090004100C100C3 +:109950000080808000000000000000000000000087 :1099600000000000000000000000000000000000F7 :1099700000000000000000000000000000000000E7 :1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 -:1099B00000000000000000000000000000000000A7 -:1099C0000000000000000000000000000000000097 -:1099D0000000000000000000000000000000000087 +:1099900000000000000001000100000000C0010004 +:1099A000C00000000000210020400020C100410054 +:1099B000C1000084020201000100000000C001009B +:1099C000C00000000000410020400020C100410014 +:1099D000C10000840202000100000000000000003D :1099E0000000000000000000000000000000000077 :1099F0000000000000000000000000000000000067 :109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000036 -:109A30000000000000000000000000000000000026 -:109A40000000000000000000000000000000000016 -:109A50000000000000000000000000000000000006 +:109A1000000000000000000000C00001C0C1000004 +:109A20000000000100C040050091000102C10000DB +:109A3000000000010000000000C00001C0C10000E3 +:109A40000000000100C040050091000100C10000BD +:109A50000000000100000000000000000000000005 :109A600000000000000000000000000000000000F6 :109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000000B6 -:109AB00000000000000000000000000000000000A6 -:109AC0000000000000000000000000000000000096 -:109AD0000000000000000000000000000000000086 +:109A9000000000000000000000000080004180C1C4 +:109AA00000000000004100C000820041004180C170 +:109AB000000000000041000300000080004180C160 +:109AC00000000000004100C000820041004100C1D0 +:109AD0000000000000410003000000000000000042 :109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B40000000000000000000000000000000000015 -:109B50000000000000000000000000000000000005 +:109B1000000000000000000000000000C100800004 +:109B200080C100004140800041004100C1C180006F +:109B3000800400004100000080004100C10080005E +:109B400080C1000041408000C1004100C1410000CF +:109B50008002000041000000800041000000000081 :109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000000000000000A5 -:109BC0000000000000000000000000000000000095 -:109BD0000000000000000000000000000000000085 +:109B90000000000000000000000000000000C10004 +:109BA0004000C0C100000100020090000100C1415E +:109BB0000400C000000001000000C0000100C1005E +:109BC0004000C0C100000100020004000100C1917A +:109BD0009000C001000001000000C0000100000072 :109BE0000000000000000000000000000000000075 :109BF0000000000000000000000000000000000065 :109C00000000000000000000000000000000000054 :109C10000000000000000000000000000000000044 -:109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 -:109C40000000000000000000000000000000000014 -:109C50000000000000000000000000000000000004 +:109C200000000000000000420000000000000000F2 +:109C30008112004107004800000000000000000001 +:109C400000000000000000420000000000000000D2 +:109C500081120041070048000000000000000000E1 :109C600000000000000000000000000000000000F4 :109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 @@ -14812,25 +14812,25 @@ :109D700000000000000000000000000000000000E3 :109D800000000000000000000000000000000000D3 :109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000000B3 +:109DA000000000000000757B0000000000000000C3 :109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000000000000000093 +:109DC00000000000DEAE757B000000000000000017 :109DD0000000000000000000000000000000000083 -:109DE0000000000000000000000000000000000073 +:109DE00000000000DEAE00000000000000000000E7 :109DF0000000000000000000000000000000000063 :109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 -:109E40000000000000000000000000000000000012 -:109E50000000000000000000000000000000000002 -:109E600000000000000000000000000000000000F2 +:109E2000000000000000000060C603000000000009 +:109E300000000031E0000000000000000C00000005 +:109E40000000000000C0630660C6030000000000C0 +:109E500000000031E0000000000000000C000000E5 +:109E60000000000000C063060000000000000000C9 :109E700000000000000000000000000000000000E2 :109E800000000000000000000000000000000000D2 :109E900000000000000000000000000000000000C2 :109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 -:109EC0000000000000000000000000000000000092 +:109EB00040000000880020000000840084000400AE +:109EC000880000000000000000000000000000000A :109ED0000000000000000000000000000000000082 :109EE0000000000000000000000000000000000072 :109EF0000000000000000000000000000000000062 @@ -14856,7 +14856,7 @@ :10A030000000000000000000000000000000000020 :10A040000000000000000000000000000000000010 :10A050000000000000000000000000000000000000 -:10A0600000000000000000000000000000000000F0 +:10A0600020000000000000000000000000000000D0 :10A0700000000000000000000000000000000000E0 :10A0800000000000000000000000000000000000D0 :10A0900000000000000000000000000000000000C0 @@ -14869,16 +14869,16 @@ :10A10000000000000000000000000000000000004F :10A11000000000000000000000000000000000003F :10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A1500000000000000000000000000000000000FF -:10A1600000000000000000000000000000000000EF +:10A1300000000000000000002100100021000300CA +:10A1400008002100000000000000000000000000E6 +:10A1500003000000000000002100080000000800CB +:10A1600008000000000000000000000000000000E7 :10A1700000000000000000000000000000000000DF :10A1800000000000000000000000000000000000CF :10A1900000000000000000000000000000000000BF :10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F +:10A1B000000000000000000000000000A0000000FF +:10A1C000000010000000000000000000000000007F :10A1D000000000000000000000000000000000007F :10A1E000000000000000000000000000000000006F :10A1F000000000000000000000000000000000005F @@ -14902,16 +14902,16 @@ :10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D :10A33000000000000000000000000000000000001D -:10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD -:10A3600000000000000000000000000000000000ED -:10A3700000000000000000000000000000000000DD +:10A3400000002100000000001000000000000000DC +:10A3500000000300000000000000000000000000FA +:10A3600000000000000000000000000008000800DD +:10A3700008000800000000000000000000000000CD :10A3800000000000000000000000000000000000CD :10A3900000000000000000000000000000000000BD :10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D +:10A3B0000000000000000000000000000000080095 +:10A3C000000000008200000000000000000000000B +:10A3D0000000000000000000000008000000000075 :10A3E000000000000000000000000000000000006D :10A3F000000000000000000000000000000000005D :10A40000000000000000000000000000000000004C @@ -15080,24 +15080,24 @@ :10AE30000000000000000000000000000000000012 :10AE40000000000000000000000000000000000002 :10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 +:10AE600000000000000000000000000000000400DE +:10AE700000000000000000040000000000000000CE :10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 +:10AE900000000000000000040000000000000000AE :10AEA00000000000000000000000000000000000A2 :10AEB0000000000000000000000000000000000092 :10AEC0000000000000000000000000000000000082 :10AED0000000000000000000000000000000000072 :10AEE0000000000000000000000000000000000062 :10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 +:10AF0000000004000000000000000000000000003D :10AF10000000000000000000000000000000000031 :10AF20000000000000000000000000000000000021 :10AF30000000000000000000000000000000000011 :10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 :10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 +:10AF700000000000020000000000000000000000CF :10AF800000000000000000000000000000000000C1 :10AF900000000000000000000000000000000000B1 :10AFA00000000000000000000000000000000000A1 @@ -15105,17 +15105,17 @@ :10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 :10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 +:10AFF000000000000000000002400000000000000F +:10B00000000000000000040000000000000000003C :10B010000000000000000000000000000000000030 :10B020000000000000000000000000000000000020 :10B030000000000000000000000000000000000010 :10B040000000000000000000000000000000000000 :10B0500000000000000000000000000000000000F0 :10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 +:10B070000000000000000000000000000000A00030 :10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 +:10B090000000000000000000000000000000A00010 :10B0A00000000000000000000000000000000000A0 :10B0B0000000000000000000000000000000000090 :10B0C0000000000000000000000000000000000080 @@ -15162,9 +15162,9 @@ :10B3500000000000000000000000000000000000ED :10B3600000000000000000000000000000000000DD :10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD +:10B3800000000400000000000000000000000000B9 :10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D +:10B3A0000000080000000000000000000000000095 :10B3B000000000000000000000000000000000008D :10B3C000000000000000000000000000000000007D :10B3D000000000000000000000000000000000006D @@ -15348,11 +15348,11 @@ :10BEF0000000000000000000000000000000000042 :10BF00000000000000000000000000000000000031 :10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 +:10BF2000000000000000000000000200000000000F :10BF30000000000000000000000000000000000001 :10BF400000000000000000000000000000000000F1 :10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 +:10BF600000000000000000000000000004000000CD :10BF700000000000000000000000000000000000C1 :10BF800000000000000000000000000000000000B1 :10BF900000000000000000000000000000000000A1 @@ -15576,11 +15576,11 @@ :10CD300000000000000000000000000000000000F3 :10CD400000000000000000000000000000000000E3 :10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 +:10CD600000000020000000000000000000000000A3 :10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 +:10CD8000000400000000000000000000000000009F :10CD90000000000000000000000000000000000093 -:10CDA0000000000000000000000000000000000083 +:10CDA0000002000000000000000000000000000081 :10CDB0000000000000000000000000000000000073 :10CDC0000000000000000000000000000000000063 :10CDD0000000000000000000000000000000000053 @@ -15588,22 +15588,22 @@ :10CDF0000000000000000000000000000000000033 :10CE00000000000000000000000000000000000022 :10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 +:10CE200000000004000000000000000000000000FE :10CE300000000000000000000000000000000000F2 :10CE400000000000000000000000000000000000E2 :10CE500000000000000000000000000000000000D2 :10CE600000000000000000000000000000000000C2 :10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 +:10CE9000000002000200000000000000000000008E :10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 :10CEC0000000000000000000000000000000000062 :10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 +:10CEE000000000000000000000000400000000003E +:10CEF000000000000400000000000000000000002E +:10CF0000000004000000000000000000000000001D +:10CF1000040000000000000000000000020000000B :10CF20000000000000000000000000000000000001 :10CF300000000000000000000000000000000000F1 :10CF400000000000000000000000000000000000E1 @@ -15841,11 +15841,11 @@ :10DDC0000000000000000000000000000000000053 :10DDD0000000000000000000000000000000000043 :10DDE0000000000000000000000000000000000033 -:10DDF0000000000000000000000000000000000023 +:10DDF000000000000400000000000000000000001F :10DE00000000000000000000000000000000000012 :10DE10000000000000000000000000000000000002 -:10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000000000000000E2 +:10DE200000000000000004000000000000000400EA +:10DE300000000000040000000000000000000000DE :10DE400000000000000000000000000000000000D2 :10DE500000000000000000000000000000000000C2 :10DE600000000000000000000000000000000000B2 @@ -16074,9 +16074,9 @@ :10EC500000000000000000000000000000000000B4 :10EC600000000000000000000000000000000000A4 :10EC70000000000000000000000000000000000094 -:10EC80000000000000000000000000000000000084 +:10EC80000000000000000000000000040000000080 :10EC90000000000000000000000000000000000074 -:10ECA0000000000000000000000000000000000064 +:10ECA0000000000000000000000000000004000060 :10ECB0000000000000000000000000000000000054 :10ECC0000000000000000000000000000000000044 :10ECD0000000000000000000000000000000000034 @@ -16088,18 +16088,18 @@ :10ED300000000000000000000000000000000000D3 :10ED400000000000000000000000000000000000C3 :10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 +:10ED6000000000000000000002000000000004009D +:10ED7000000000000000000000000000040000008F :10ED80000000000000000000000000000000000083 :10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 +:10EDA000000000000000040000000000000000005F :10EDB0000000000000000000000000000000000053 :10EDC0000000000000000000000000000000000043 :10EDD0000000000000000000000000000000000033 :10EDE0000000000000000000000000000000000023 -:10EDF0000000000000000000000000000000000013 -:10EE00000000000000000000000000000000000002 -:10EE100000000000000000000000000000000000F2 +:10EDF000000000000400000000000000000000000F +:10EE000000000000000000000000000004000000FE +:10EE100000000000000000000000040000000000EE :10EE200000000000000000000000000000000000E2 :10EE300000000000000000000000000000000000D2 :10EE400000000000000000000000000000000000C2 @@ -16332,8 +16332,8 @@ :10FC70000000000000000000000000000000000084 :10FC80000000000000000000000000000000000074 :10FC90000000000000000000000000000000000064 -:10FCA0000000000000000000000000000000000054 -:10FCB0000000000000000000000000000000000044 +:10FCA000000000000000000004000000000004004C +:10FCB000000000000000040000000000040000003C :10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 :10FCE0000000000000000000000000000000000014 @@ -16341,7 +16341,7 @@ :10FD000000000000000000000000000000000000F3 :10FD100000000000000000000000000000000000E3 :10FD200000000000000000000000000000000000D3 -:10FD300000000000000000000000000000000000C3 +:10FD300000000000000000000000000000000400BF :10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 :10FD60000000000000000000000000000000000093 @@ -16572,37 +16572,37 @@ :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 +:100B90000000000000040000000000000000000051 :100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 +:100BB0000000000000000004000000000000000031 :100BC0000000000000000000000000000000000025 :100BD0000000000000000000000000000000000015 :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 +:100C100000000000000000020000000000000000D2 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 :100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 +:100C70000000000000000000000000000400000070 +:100C80000000000000000200000000000000000062 :100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 +:100CA0000000000004000000000000000000000040 :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 +:100CD0000000000000000000000000000084000090 +:100CE0000000000000000000000000840000000080 +:100CF00000000000000000000000000400000000F0 +:100D000000000000000000000000020000000000E1 +:100D100000000000000004000000000800000000C7 :100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 +:100D300000000000000000000000000000020000B1 :100D400000000000000000000000000000000000A3 :100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 +:100D60000000000000000000000000000000000380 +:100D7000000000000000000000000000000800006B :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 :100DA0000000000000000000000000000000000043 @@ -16635,7 +16635,7 @@ :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 +:100F80000000000000200000000000000000000041 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 @@ -16839,7 +16839,7 @@ :101C100000000000000000000000000000000000C4 :101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 +:101C40000000000000000000040000000000000090 :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 :101C70000000000000000000000000000000000064 @@ -16873,7 +16873,7 @@ :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 +:101E60000000000000000000100000000000000062 :101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 @@ -16904,9 +16904,9 @@ :1020200000000000000000000000000000000000B0 :1020300000000000000000000000000000000000A0 :102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 +:102050000000000000000000002000000000000060 :102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 +:10207000000000000000000000000200000000005E :102080000000000000000000000000000000000050 :102090000000000000000000000000000000000040 :1020A0000000000000000000000000000000000030 @@ -17008,13 +17008,13 @@ :1026A000000000000000000000000000000000002A :1026B000000000000000000000000000000000001A :1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA +:1026D00002000000000000000000000000000000F8 :1026E00000000000000000000000000000000000EA -:1026F00000000000000000000000000000000000DA +:1026F00020040000000000000000000000000000B6 :1027000000000000000000000000000000000000C9 -:1027100000000000000000000000000000000000B9 +:102710000000200400000000000000000000000095 :1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 +:102730000000000400000000000000000000000095 :102740000000000000000000000000000000000089 :102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 @@ -17024,19 +17024,19 @@ :1027A0000000000000000000000000000000000029 :1027B0000000000000000000000000000000000019 :1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000000000000F9 +:1027D00000000000004000000000000000000000B9 :1027E00000000000000000000000000000000000E9 :1027F00000000000000000000000000000000000D9 :1028000000000000000000000000000000000000C8 :1028100000000000000000000000000000000000B8 :1028200000000000000000000000000000000000A8 :102830000000000000000000000000000000000098 -:102840000000000000000000000000000000000088 -:102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 +:102840000000000000000000000000000000400048 +:102850000000000000000004000000000000000074 +:102860000000000002000000000000000000000066 :102870000000000000000000000000000000000058 -:102880000000000000000000000000000000000048 -:102890000000000000000000000000000000000038 +:102880000000000040000000000000000000000008 +:102890000000000004000000000000000000000034 :1028A0000000000000000000000000000000000028 :1028B0000000000000000000000000000000000018 :1028C0000000000000000000000000000000000008 @@ -17056,19 +17056,19 @@ :1029A0000000000000000000000000000000000027 :1029B0000000000000000000000000000000000017 :1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 +:1029D00000000000000000000000000000400000B7 :1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 +:102A000000110000000000000000000000000000B5 +:102A100000000000000000000000000000000002B4 :102A200000000000000000000000000000000000A6 :102A30000000000000000000000000000000000096 :102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000000000076 +:102A50000000000000001000000000000000000066 :102A60000000000000000000000000000000000066 :102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 +:102A80000000000000000000000000000000040042 +:102A90000000000000000200000000000000000034 :102AA0000000000000000000000000000000000026 :102AB0000000000000000000000000000000000016 :102AC0000000000000000000000000000000000006 @@ -17097,13 +17097,13 @@ :102C30000000000000000000000000000000000094 :102C40000000000000000000000000000000000084 :102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 +:102C60000200000000000000000000000000000062 :102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 +:102C8000000000000000080000000000000000003C :102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 +:102CA000000000000000000008000000000000001C +:102CB000118800000000000000000000000000007B +:102CC00000000000000000000800000000000000FC :102CD00000000000000000000000000000000000F4 :102CE00000000000000000000000000000000000E4 :102CF00000000000000000000000000000000000D4 @@ -17259,18 +17259,18 @@ :10365000000000000000000000000000000000006A :10366000000000000000000000000000000000005A :10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA +:10368000000020000000000000004000400000009A +:103690000000000000002000000000008800200062 +:1036A00000002000000000000000000000000000FA +:1036B00000000000000000000000000000002000EA +:1036C00000000000000000008400000040004000F6 :1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA +:1036E00020000000000000000000000000000000BA :1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 :1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 +:103730000000000000000000200000000000000069 :103740000000000000000000000000000000000079 :103750000000000000000000000000000000000069 :103760000000000000000000000000000000000059 @@ -17279,19 +17279,19 @@ :103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 +:1037C00000000000000000000000000000210000D8 +:1037D00000000021000000000000000000000000C8 :1037E00000000000000000000000000000000000D9 :1037F00000000000000000000000000000000000C9 :1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 +:103810000000024000000000024000000000000024 :103820000000000000000000000000000000000098 :103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 +:103840000000000000000000040000000000000074 +:103850000000000005000000000000000000000063 :103860000000000000000000000000000000000058 :103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 +:103880000000000000000000000000000005000033 :103890000000000000000000000000000000000028 :1038A0000000000000000000000000000000000018 :1038B0000000000000000000000000000000000008 @@ -17308,21 +17308,21 @@ :103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 :103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 +:103990000000000000000000020000000000000025 :1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 +:1039B000A000000000000000000000000000000067 :1039C00000000000000000000000000000000000F7 :1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 +:1039E0000000900000000000000000000000000047 +:1039F0000000820000000000000000000000000045 :103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 +:103A1000000021000800210010001000110000002B +:103A20000000000008000084020000000800000000 +:103A30000000000010000500080008000000000061 +:103A4000000000000000000000000000080000006E +:103A500000000000210040000000100040000000B5 +:103A600000900000000000000000000000000800BE +:103A7000000000001000080000000800080000001E :103A80000000000000000000000000000000000036 :103A90000000000000000000000000000000000026 :103AA0000000000000000000000000000000000016 @@ -17340,23 +17340,23 @@ :103B60000000000000000000000000000000000055 :103B70000000000000000000000000000000000045 :103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 +:103B9000000000000800000000000000000000001D +:103BA00000400000000000000000000000000000D5 +:103BB00008000000004000000000000000000000BD :103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 +:103BD00008000000000000000000000000000000DD :103BE00000000000000000000000000000000000D5 :103BF00000000000000000000000000000000000C5 :103C000000000000000000000000000000000000B4 :103C100000000000000000000000000000000000A4 -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 +:103C20000000020040000000020000000000000050 +:103C30000000080008000000000000000000000074 +:103C400000000088000000000000030000000000E9 +:103C50000000000008000000002008000000000034 +:103C600000000000008800000000000011000000BB +:103C7000000000000000080000000000000000003C +:103C800000000000008800000000000003000000A9 +:103C9000000000000000080000000000000000001C :103CA0000000000000000000000000000000000014 :103CB0000000000000000000000000000000000004 :103CC00000000000000000000000000000000000F4 @@ -17503,78 +17503,78 @@ :10459000000000000000000000000000000000001B :1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A +:1045C00020000000000000000400200000000000A7 +:1045D000200004000000000000000088000002002D +:1045E000200000000000000020000000000000008B +:1045F00020002000000000000000008800030000F0 +:104600002000200000000000000004000000000066 +:104610000000000000000000000000000088000012 :10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A +:104630000000000000000000000000000008000072 :10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A +:104650000000000000000000000000000005000055 +:104660000000000000000000000004000000000046 +:104670000000000000000000000000000004000036 :10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A +:104690000000000000000000000000000000000416 :1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA +:1046B00000000000000000000000000000000001F9 :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA :1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA +:1046F000000000000000000000000000000000803A :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 +:104720000080000000000000000000000000000009 :104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 +:1047400000800000000000000000000000000008E1 :104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 +:104760000008000000000000000000080000002019 :104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 +:1047800000080000000000000000000000400000E1 +:1047900000000300000000000000000000000020F6 +:1047A0000000000800000000000000000000000001 :1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 +:1047C00000000004000500000000000000000000E0 +:1047D00000080000000000000000000000000000D1 +:1047E000000000110000002100050000000800008A +:1047F00000000000000000050000000000000000B4 +:104800000000000000000005000000000000004162 :104810000000000000000000000000000000000098 :104820000000000000000000000000000000000088 :104830000000000000000000000000000000000078 :104840000000000000000000000000000000000068 :104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 +:104860000000000000002100000000000000000027 :104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 +:104880000000000000000002000000000000000026 :104890000000000000000000000000000000000018 :1048A0000000000000000000000000000000000008 :1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 +:1048C0000000000000000000A000000000008200C6 +:1048D000820000000000820008000000000082202A +:1048E0008200000000008200820040000000820080 +:1048F00082000000020082004000000000008200F0 +:104900008200000082008200000282008800000015 +:1049100082008200000082008200A00000000000EF +:10492000820082000000820082008200C00000003D +:104930004000000000000000000000000000000037 :104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 +:10495000000000000000000008000000000000004F +:104960000800050000000000210000000000000019 +:104970000000000000000040000000004000400077 +:104980002100000000000000000000000000000006 +:1049900000000000000000004000000003000000D4 +:1049A0000000000000000400000000000000000003 :1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 :1049D00000000000000000000000000000000000D7 :1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 +:1049F0009000100000000000000000000000000017 +:104A00000000080000000000C000001100000000CD +:104A1000000000000000A0000000080000000000EE +:104A200000000000000000000000A00000000000E6 +:104A300008000000A000C00000009000000000007E :104A40000000000000000000000000000000000066 :104A50000000000000000000000000000000000056 :104A60000000000000000000000000000000000046 @@ -17584,14 +17584,14 @@ :104AA0000000000000000000000000000000000006 :104AB00000000000000000000000000000000000F6 :104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 +:104AD0000800000008000002A00800000000040018 +:104AE000000000000000080008210009000040004C +:104AF000000000000800A0020000000004200800E0 +:104B0000000000000000A000002100080000A0003C +:104B100000009000C0000800A00202400000040055 +:104B20000000000000000800080000000020000055 +:104B3000A00000000000080084020000000008003F +:104B400000000000000000008200000000000000E3 :104B50000000000000000000000000000000000055 :104B60000000000000000000000000000000000045 :104B70000000000000000000000000000000000035 @@ -17600,79 +17600,79 @@ :104BA0000000000000000000000000000000000005 :104BB00000000000000000000000000000000000F5 :104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 +:104BD0000000000000010001000100C00001A00170 +:104BE00000C1008501000001000200040001000175 +:104BF00000C1000000010001000100C0000100012F +:104C000000C000C100004101000400820001000159 +:104C100000C10000000000010001000100C000010F +:104C2000000100C100C100000301000400020001F6 +:104C3000000100C1000000010001000100C00001EE +:104C4000000100C100C10000410100040002000198 +:104C5000000100C1000000410041004100C040418E +:104C60000041008302412009094100000080004109 +:104C7000004100A0000000410041004100C040414F +:104C8000004100A02041000220410080008000413E +:104C9000004100A00000000000410041004100C0B0 +:104CA00040410041008220410005C1410080008058 +:104CB0000041004100A0000000410041004100C04F +:104CC000404100410082204100404141008000807D +:104CD0000041004100A000004100030000000080EE +:104CE0004100A1000000200040008200000082007E +:104CF0004100C1000000800041000300000000806E +:104D00004100A10000000500020002000000900028 +:104D10004100C100000080000000410003000000CD +:104D200000804100A10000000400C000020000411A +:104D300083004100C100000080004100030000002A +:104D400000804100A10000000800A0000200004116 +:104D500083004100C100000080000100010000004C +:104D600000C00100C000000000008200210400908B +:104D7000C1002100C10000A00800010001000000E6 +:104D800000C00100C0000000000041002184008834 +:104D9000C1002100C10000A00800000301000100C3 +:104DA000000000C00100C0000000010040002140E0 +:104DB0000083C1002100C10000A008000100010023 +:104DC000000000C00100C000000000004000219071 +:104DD0000021C1002100C10000A0040000C00001AA +:104DE000C0C100000000000100C04082009100012D +:104DF00000C10000000000010001000000C000012F +:104E0000C0C100000000000100C04082001100018C +:104E100000C100000000000100010000000000C00F +:104E20000001C0C100000000000100C04005009169 +:104E3000000100C10000000000010001000000C0EE +:104E40000001C0C100000000000100C04005009149 +:104E5000000100C10000000000010001000000800E +:104E6000004180C10000000000410090001000419E +:104E7000004100C10000000000410020000000804F +:104E8000004180C100000000004100C1001000C1CD +:104E9000004100C1000000000041002000000000AF +:104EA0000080004180C100000000004100C000827D +:104EB0000041004100C1000000000041002000004E +:104EC0000080004180C100000000004100C000825D +:104ED0000041004100C1000000000041002000002E +:104EE000C100800080C100004100000005004100B9 +:104EF000C1C10000800200004100000080004100AC +:104F0000C100800080C10000410380000500410015 +:104F1000C1C180008002000041000000800041000B +:104F20000000C100800080C1000041008000050039 +:104F30004100C1008000801000004100000080009E +:104F40004100C100800080C10000410080000500D8 +:104F50004100C1000000800200004100000080000C +:104F60004100C1004000C0C100000100A00082005B +:104F70000100C1050200C001000001000000C000E6 +:104F80000100C1004000C0C100000100020090000B +:104F90000100C1090800C001000001000000C000BC +:104FA00001000000C1004000C0C100000100040079 +:104FB00090000100C1A00800C00100000100000035 +:104FC000C0000100C1004000C0C10000010002009B +:104FD00090000100C1A09000C0010000010000008D +:104FE000C0000100000000000000004200000000BE +:104FF000000000008112004107004800000000008E +:10500000000000000000000000000042000000005E +:10501000000000008112004107004800000000006D +:10502000000000000000000000000000004200003E +:10503000000000000000411200410700A023000012 +:10504000000000000000000000000000004200001E +:10505000000000000000601200410700A0230000D3 :105060000000000000000000000000000000000040 :105070000000000000000000000000000000000030 :105080000000000000000000000000000000000020 @@ -17689,37 +17689,37 @@ :10513000000000000000000000000000000000006F :10514000000000000000000000000000000000005F :10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F +:1051600000000000000000000000757B000000004F :10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F +:105180000000000000000000DEAE757B00000000A3 :10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF +:1051A0000000000000000000DEAE0000757B000083 :1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF +:1051C00000000000000000000000DEAE757B000063 :1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE +:1051E00000000000000000000000DEAE60C603000A +:1051F0000000000000000031E0000000000000009E +:105200000C0000000000000000C0630660C6030040 +:105210000000000000000031E0000000000000007D +:105220000C0000000000000000C06306000060C623 +:1052300003000000000000000031E000000000005A +:1052400000000C0000000000000000C0630660C603 +:1052500003000000000000000031E000000000003A +:1052600000000C0000000000000000C06306000009 +:10527000000000000000000000000400000000002A +:1052800000002000000000000000000020000000DE +:1052900004000000840000000000200000008800DE +:1052A000000000000000000000000000840000007A +:1052B00000000000000020000000000020000000AE +:1052C0000400000000008800000000000000000052 :1052D00000000000000000000000000000000000CE :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D +:105300000000000000000500000000000000000098 :10531000000000000000000000000000000000008D -:10532000000000000000000000000000000000007D +:105320000000000000000000000005000500000073 :10533000000000000000000000000000000000006D -:10534000000000000000000000000000000000005D +:105340000000000000000500000000000000000058 :10535000000000000000000000000000000000004D :10536000000000000000000000000000000000003D :10537000000000000000000000000000000000002D @@ -17732,35 +17732,35 @@ :1053E00000000000000000000000000000000000BD :1053F00000000000000000000000000000000000AD :10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C +:105410000000000000000000008800000000000004 +:10542000000000000000000000000010000000006C :10543000000000000000000000000000000000006C :10544000000000000000000000000000000000005C :10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C +:105470000000000000000000000000080000000024 :10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C +:1054900000000000000000000000004100000000CB :1054A00000000000000000000000000000000000FC :1054B00000000000000000000000000000000000EC :1054C00000000000000000000000000000000000DC :1054D00000000000000000000000000000000000CC :1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B +:1054F00000000000000000000000000000000300A9 +:1055000000000000000000000800000000A00008EB +:105510000000000000000000000000002100210049 +:105520000000210000000000030000000000001047 :10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:10556000000000000000000000000000000000003B +:10554000080000002100000000000800000000002A +:105550000000000000000000080000000000000043 +:105560000800030003000300000003000000000027 :10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B -:10559000000000000000000000000000000000000B +:10558000A00000000000000000000000000000007B +:1055900000000000000000000000400000000000CB :1055A00000000000000000000000000000000000FB :1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB +:1055C000A000A0000000A0000000000008000000F3 +:1055D0000000000040008200040000008200400043 :1055E00000000000000000000000000000000000BB :1055F00000000000000000000000000000000000AB :10560000000000000000000000000000000000009A @@ -17776,22 +17776,22 @@ :1056A00000000000000000000000000000000000FA :1056B00000000000000000000000000000000000EA :1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA +:1056D000000000000080000000000000000000004A +:1056E000000000000000000000000000008000003A :1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 -:105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 +:105700000000000000002100000000000000000078 +:105710000000210000000300000000000000000065 +:105720000000000000C02100000000000800000090 +:1057300000000000088400000000000000000000DD +:105740000000000000000000210000000000080030 +:105750000000000000000310030000000000000033 +:105760000000000000000000000000000000081021 +:105770000000080003000000080000000000000016 +:105780000000000000000000000000000800000011 +:105790000000000000000000000000000000040005 +:1057A00040000000040000000000000000000000B5 +:1057B0000000000000000000000000000000401099 +:1057C00008000000000008000000000000000000C9 :1057D00000000000000000000000000000000000C9 :1057E00000000000000000000000000000000000B9 :1057F00000000000000000000000000000000000A9 @@ -17967,7 +17967,7 @@ :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE +:1062C00000000000030000000000000000000000CB :1062D00000000000000000000000000000000000BE :1062E00000000000000000000000000000000000AE :1062F000000000000000000000000000000000009E @@ -17997,7 +17997,7 @@ :10647000000000000000000000000000000000001C :10648000000000000000000000000000000000000C :1064900000000000000000000000000000000000FC -:1064A00000000000000000000000000000000000EC +:1064A000000000008200000000000000000000006A :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC :1064D00000000000000000000000000000000000BC @@ -18012,7 +18012,7 @@ :10656000000000000000000000000000000000002B :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB +:1065900000000000000000000400000000000000F7 :1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB @@ -18465,7 +18465,7 @@ :1081B00000000000000000000000000000000000BF :1081C00000000000000000000000000000000000AF :1081D000000000000000000000000000000000009F -:1081E000000000000000000000000001000000018D +:1081E000000000000000000000008001000080018D :1081F000000000000000000000000000000000007F :10820000000000000000000000000000000000006E :10821000000000000000000000000000000000005E @@ -18473,7 +18473,7 @@ :10823000000000000000000000000000000000003E :10824000000000000000000000000000000000002E :10825000000000000000000000000000000000001E -:10826000000000000000000000000000208000006E +:10826000000000000000000000000000009000007E :1082700000000000000000000000000000000000FE :1082800000000000000000000000000000000000EE :1082900000000000000000000000000000000000DE @@ -18494,15 +18494,15 @@ :1083800000000000000000000000000000000000ED :1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD -:1083B000000000002000200000000000200020003D -:1083C0002000000020002000C0000000200020004D -:1083D000000000002000200000000000200020001D -:1083E0008800000020002000200000002000200065 -:1083F0000000880000002000200000000000200095 -:1084000020000000000020002000000000002000EC -:1084100020000000000000002000000000002000FC -:108420002000000000002000000088000000200064 -:10843000200000000000000000000000000000001C +:1083B000000000000000200020000000100020004D +:1083C000000000002000200000000000000020004D +:1083D00000000000C000400000000000000020007D +:1083E00088000000200020000000000000002000A5 +:1083F000000000000000200020000000000000003D +:1084000020001000000020002000000000000000FC +:10841000000000000000000040000000000000001C +:108420002000200000002000200088000000000044 +:10843000000000000000000000000000000000003C :10844000000000000000000000000000000000002C :10845000000000000000000000000000000000001C :10846000000000000000000000000000000000000C @@ -18514,23 +18514,23 @@ :1084C00000000000000000000000000000000000AC :1084D000000000000000000000000000000000009C :1084E000000000000000000000000000000000008C -:1084F000000000000000000000000000100200006A -:108500000000000000000000000000004008000023 +:1084F0000000000000000000000000004008000034 +:108500000000000000000000000000001002000059 :10851000000000000000000000000000000000005B :10852000000000000000000000000000000000004B :10853000000000000000000000000000000000003B :10854000000000000000000000000000000000002B -:108550000000000000080000000000000000000013 +:1085500000000000000800000000000020000000F3 :10856000000000000000000000000000000000000B -:108570000000000000080000000000000000800172 -:10858000000000000000000000000000000080016A +:108570000000000000080000000000000000890169 +:108580000000000000000000000000000000890161 :1085900000000000000000080000000000000000D3 :1085A00000000000000000000000000000000000CB :1085B00000000000000000080000000000000000B3 :1085C00000000000000000000000000000000000AB :1085D000000000000000000000000000000000009B :1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B +:1085F0000000000000000000000300000000000078 :10860000000000000000000000000000000000006A :10861000000000000000000000000000000000005A :10862000000000000000000000000000000000004A @@ -18540,16 +18540,16 @@ :10866000000000000000000000000000000000000A :1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA -:1086900000000000000000000000000008000000D2 +:1086900000000000000000000000000000000000DA :1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C00000000000080000000000000000000000A2 -:1086D0000000000082000000000000008400000094 -:1086E0000000000000000000000000000800000082 -:1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000080061 -:108710000000000000000800000000000000000051 -:10872000000008000000A0000000000000000000A1 +:1086B000000000000000000000000000C0000000FA +:1086C0000000820000000000000000000000000028 +:1086D00000008200C000000000000000A0000000B8 +:1086E0000000820000000000000000000000000008 +:1086F000000010000000000000000000000000006A +:108700000000000010000000000000000000080051 +:108710000000000000000000000000000000000059 +:10872000000000000000A0000000000000000000A9 :108730000000000000000000000000000000000039 :108740000000000000000000000000000000000029 :108750000000000000000000000000000000000019 @@ -18559,14 +18559,14 @@ :1087900000000000000000000000000000000000D9 :1087A00000000000000000000000000000000000C9 :1087B00000000000000000000000000000000000B9 -:1087C0000000000082000000000000000000000027 -:1087D0000000000000000000080000000000000091 -:1087E0000000A0000000C000C0000000C0000000A9 -:1087F0000000000000000000000000000000000079 +:1087C00000000000A00000000000000008110000F0 +:1087D0000000C000000000001000000000000000C9 +:1087E0000000000000000000080000000800000079 +:1087F0000000C000000000000000000000000000B9 :108800000000000000000000000000000000000068 :108810000000000000000000000000000000000058 -:1088200000000000000000000000000000009000B8 -:1088300000000000C00082000000000000000000F6 +:10882000080000000000C000080000000000A000D8 +:1088300000000000C0000000000000000000000078 :108840000000000000000000000000000000000028 :108850000000000000000000000000000000000018 :108860000000000000000000000000000000000008 @@ -18575,14 +18575,14 @@ :1088900000000000000000000000000000000000D8 :1088A00000000000000000000000000000000000C8 :1088B00000000000000000000000000000000000B8 -:1088C0000000000000000000000082000000000026 -:1088D0000000000000000000000000000000080090 -:1088E0000000000000000000000000000000000088 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000800000090 +:1088E0000000000000000000000000008200000006 :1088F0000000000000000000000000000000000078 :108900000000000000000000000000000000000067 :108910000000000000000000000000000000000057 -:1089200000000000000082000000000000000000C5 -:10893000000000000000000000000000080000002F +:1089200000000000000082000000080000000000BD +:108930000000000000000000000000001000000027 :108940000000000000000000000000000000000027 :108950000000000000000000000000000000000017 :108960000000000000000000000000000000000007 @@ -18592,7 +18592,7 @@ :1089A00000000000000000000000000000000000C7 :1089B00000000000000000000000000000000000B7 :1089C00000000000000000000000000000000000A7 -:1089D000000088000000000000000000000000000F +:1089D0000000020000000000000000000000000095 :1089E0000000000000000000000000000000000087 :1089F0000000000000000000000000000000000077 :108A00000000000000000000000000000000000066 @@ -18600,30 +18600,30 @@ :108A20000000000000000000000000000000000046 :108A30000000000000000000000000000000000036 :108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A600000000000000000000000200000000000E6 +:108A50000000400080000000000000000000000056 +:108A60000000000000000000000000000000000006 :108A700000000000000000000000400000000000B6 -:108A800000000000000000000000000300000000E3 +:108A800000000000000000000000000000000000E6 :108A900000000000000000000000000000000000D6 :108AA00000000000000000000000000000000000C6 -:108AB0000000000040000000000000000000000076 +:108AB00000000000000000000000000000000000B6 :108AC0000000000040000000000000000000000066 -:108AD0000000000000008000000000030000000013 +:108AD000000000008000800000080003000000008B :108AE0000000000000000000000000000000000086 -:108AF00000000020000000000000000000008000D6 -:108B00000000000300000000000000000000000062 +:108AF0000000000300000000000000008000800073 +:108B0000000000C0000000000000000000000000A5 :108B10000000000000000000000000000000000055 :108B20000000000000000000000000000000000045 -:108B300000000000000000008000000000000000B5 -:108B4000000000000000800080000000000800001D -:108B50000000000000009000020000000001000082 +:108B30000000000000008000800000030000000032 +:108B40000000000000008000800000000005000020 +:108B500000000000000010004000000000010000C4 :108B60000000000000000000000000000000000005 -:108B70000000000000000000000000000000840071 -:108B800002000000000000000000000000000000E3 +:108B700000000000000000000000000000000400F1 +:108B80008200000000020000000000000000000061 :108B900000000000000000000000000000000000D5 :108BA00000000000000000000000000000000000C5 -:108BB0000000000000000000820020000000000013 -:108BC00000000000000000000200020000000001A0 +:108BB0000000000000000000400002000000000073 +:108BC0000000000000000000020082000000002001 :108BD0000000000000000000000000000000000095 :108BE0000000000000000000000000000000000085 :108BF0000000000000000000000000000000000075 @@ -18640,31 +18640,31 @@ :108CA00000000000000000000000000000000000C4 :108CB00000000000000000000000000000000000B4 :108CC00000000000000000000000000000000000A4 -:108CD0000000000000000000000000000010000084 -:108CE000000005000000000000000000000000007F -:108CF0000000000000000000000040000000000034 -:108D00000000000000000020000003000000000040 +:108CD0000000000000000000000000000000000094 +:108CE0000000400000000000000000000000000044 +:108CF0000000000000050000000008000000000067 +:108D00000000000000000000000003000000000060 :108D10000000000000020000000000000000000051 :108D20000000000000000000000000000000000043 :108D3000000000000000000000000000000000052E :108D4000000000000800000000000000000000001B -:108D5000000000000500000000000000000000010D +:108D5000000000000800000000000000000000000B :108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000001000000E2 +:108D700000000000000000000000000001000000F2 +:108D800000000000000000000000000000000000E3 :108D900000000000000000000000000000000000D3 :108DA00000000000000000000000000000000000C3 :108DB00000000000000000000000000000000000B3 :108DC00000000000000001000000000000000000A2 :108DD0000000000000000000000000000000000093 -:108DE000818100500A00900900000000000000008E -:108DF0000000000000000000004100000A00900098 -:108E00000000000000000000884100500A009009A6 +:108DE000884100900900C843000000000000000016 +:108DF0000000000000000000008100000900C80021 +:108E00000000000000000000884100900900C843F5 :108E10000000000000000000000000000000000052 :108E20000000000000000000000000000000000042 :108E30000000000000000000000000000000000032 -:108E40000000818100500A0090090000000000002D -:108E50000000884100500A00900900000000000056 +:108E40000000818100900900C8430000000000007C +:108E50000000884100900900C843000000000000A5 :108E60000000000000000000000000000000000002 :108E700000000000000000000000000000000000F2 :108E800000000000000000000000000000000000E2 @@ -18681,22 +18681,22 @@ :108F30000000000000000000000000000000000031 :108F4000000000000000001000001401900200006A :108F50000000000000000010000014019402000056 -:108F60000000000000000040032004C002000000D8 +:108F60000000000000000040030810C002000000E4 :108F700000000000000000000000000000000040B1 -:108F8000032000000000000000000000000000407E -:108F9000032004C0020000000000000000000000E8 +:108F80000308000000000000000000000000004096 +:108F9000030810C0020000000000000000000000F4 :108FA000020000000000004000000000000000007F :108FB000020000000000004000000000000000006F -:108FC00000000000000000000040032004C0020078 -:108FD00000000000000000000040032004C0020068 -:108FE0000000000000000000080200200400401003 +:108FC00000000000000000000040030810C0020084 +:108FD00000000000000000000040030810C0020074 +:108FE000000000000000000008020008100040100F :108FF0000000000000000000000000000000000071 -:109000000802002000000000000000000000000036 -:1090100008020020040040100000000000000000D2 +:10900000080200080000000000000000000000004E +:1090100008020008100040100000000000000000DE :109020000000000000000000000000000000000040 :109030000000000000000000000000000000000030 -:1090400000000000000000000000080200200400F2 -:109050004010000000000000000008020020040092 +:1090400000000000000000000000080200081000FE +:10905000401000000000000000000802000810009E :1090600040100000000000000000000000000000B0 :1090700000000000000000000000000000000000F0 :1090800000000000000000000000000000000000E0 @@ -18738,13 +18738,13 @@ :1092C000000000000000000000000000000000009E :1092D00000000000000000909A0000000000000064 :1092E00000000000000000909A0000000000000054 -:1092F000000000000000000020000000000000004E +:1092F000000000000000000000002000000000004E :10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D +:10931000000000000000000000002000000000002D :10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D +:10933000000000000000000000000000200000000D :10934000000000000000000000000000000000001D -:1093500000000000000000000000000040000000CD +:10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED :1093800000000000000000000000000000000000DD @@ -18754,7 +18754,7 @@ :1093C000000000000000000000000000000000009D :1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D +:1093F00000000000000084000000000000000000E9 :10940000000000000000000000000000000000005C :10941000000000000000000000000000000000004C :10942000000000000000000000000000000000003C @@ -18773,21 +18773,21 @@ :1094F000000000000000000000000000000000006C :10950000000000000000000000000000000000005B :10951000000000000000000000000000000000004B -:109520000000000002000000000000000000000039 +:10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B :10955000000000000000000000000000000000000B :1095600000000000000000000000000000000000FB :1095700000000000000000000000000000000000EB -:1095800000000000000008000000000000000300D0 -:1095900000000000020000000000000000000000C9 -:1095A00000000800000000000000000000000000B3 +:1095800000000000000000000000000000000000DB +:1095900000000800000000000000000000000000C3 +:1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B +:1095E000000000000000000000000000000021005A :1095F000000000000000000000000000000000006B -:10960000100000000000000000000000000000004A +:10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A :10963000000000000000000000000000000000002A @@ -18811,14 +18811,14 @@ :109750000000000000000000000000000000000009 :109760000000000000000080000000000000000079 :1097700000000000000000000000000000000000E9 -:109780000000000000001000000000204000000069 -:1097900000000000000000000000000000000000C9 +:1097800000000000000000000000080000000000D1 +:109790000000000000000000000000000000009039 :1097A00000000000000000000000000000000000B9 :1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 :1097D0000000000000000000000000000000000089 -:1097E0000000000000000000004000000020000019 -:1097F0000000000000000000000000000000000465 +:1097E0000000000000000000004000000000000039 +:1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 :109810000000000000000000000000000000000048 :109820000000000000000000000000000000000038 @@ -18826,7 +18826,7 @@ :109840000000000000000000000000000000000018 :109850000000000000000000000000000000000008 :1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 +:1098700008000000000000000000000000000000E0 :1098800000000000000000000000000000000000D8 :1098900000000000000000000000000000000000C8 :1098A00000000000000000000000000000000000B8 @@ -18983,20 +18983,20 @@ :10A21000000000000000000000000000000000003E :10A22000000000000000000000000000000000002E :10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000000000000FE +:10A2400000000000000000000000000000004000CE +:10A2500040000000000000000000000000000000BE :10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE +:10A27000200020000000000000000000000000009E :10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE +:10A29000000020000000000000000000000000009E :10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E +:10A2B000000004000000000000000000000000009A +:10A2C000100000000000000000000000000000007E +:10A2D000100000000000000000000000000000006E +:10A2E000040000000000000000000000000000006A :10A2F000000000000000000000000000000000005E -:10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D +:10A300000000040000000000000000000000000049 +:10A310000000040000000000000000000000000039 :10A32000000000000000000000000000000000002D :10A33000000000000000000000000000000000001D :10A34000000000000000000000000000000000000D @@ -19005,16 +19005,16 @@ :10A3700000000000001000000000000000000000CD :10A3800000000000000000000000000000000000CD :10A3900000000000000000000000000000000000BD -:10A3A000000000000000000000000000001000009D -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D +:10A3A0000000000000000000000000000010000895 +:10A3B000000000080008000000000000000000008D +:10A3C0000000000000000000000000000004000485 +:10A3D0000000000400040000000000000000000075 :10A3E000000000000000000000000000000000006D :10A3F000000000000000000000000000000000005D :10A40000000000000000000000000000000000004C :10A41000000000000000000000000000000000003C :10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C +:10A4300000000000000000000000000040000000DC :10A44000000000000000000000000000000000000C :10A4500000000000000000000000000000000000FC :10A4600000000000000000000000000000000000EC @@ -19045,7 +19045,7 @@ :10A5F000000000000000000000000000000000005B :10A60000000000000000000000000000000000004A :10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A +:10A62000000010000000000000000000000000001A :10A63000000000000000000000000000000000001A :10A64000000000000000000000000000000000000A :10A6500000000000000000000000000000000000FA @@ -19056,7 +19056,7 @@ :10A6A00000000000000000000000000000000000AA :10A6B000000000000000000000000000000000009A :10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A +:10A6D0000000000000000000000004000000000076 :10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A :10A700000000000000000000000000000000000049 @@ -19077,7 +19077,7 @@ :10A7F0000000000000000000000000000000000059 :10A800000000000000000000000000000000000048 :10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 +:10A820000000000000000800000000000000000020 :10A830000000000000000000000000000000000018 :10A840000000000000000000000000000000000008 :10A8500000000000000000000000000000000000F8 @@ -19234,11 +19234,11 @@ :10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F :10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000020000000000000000000000002C -:10B22000000000000002000000000000000000001C -:10B23000000000000000000000000000000000000E +:10B1F00000001000000020001000100010001000DF +:10B200000000000020000000000000000000880096 +:10B210000000200000002000200020002000C000CE +:10B2200000000000C000000200000000000000005C +:10B2300020008800000088000000000000000000DE :10B2400000000000000000000000000000000000FE :10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE @@ -19247,7 +19247,7 @@ :10B2900000000000000000000000000000000000AE :10B2A000000000000000000000000000000000009E :10B2B000000000000000000000000000000000008E -:10B2C000000000000000000040000000000000003E +:10B2C000000000000000000000000000000000007E :10B2D000000000000000000000000000000000006E :10B2E000000000000000000000000000000000005E :10B2F000000000000000000000000000000000004E @@ -19257,16 +19257,16 @@ :10B33000000000000000000000000000000000000D :10B3400000000000000000000000000000000000FD :10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD +:10B3600000000000000000000000100000000000CD +:10B370000000000000820002000000000002000245 +:10B3800000020002000000000000000000000000B9 :10B3900000000000000000000000000000000000AD :10B3A000000000000000000000000000000000009D :10B3B000000000000000000000000000000000008D :10B3C000000000000000000000000000000000007D :10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F0000000000000000000000000000400000049 +:10B3E00000000000000000000000000080000000DD +:10B3F000000000000000000000000000000000004D :10B40000000000000000000000000000000000003C :10B41000000000000000000000000000000000002C :10B42000000000000000000000000000000000001C @@ -19283,14 +19283,14 @@ :10B4D000000000000000000000000000000000006C :10B4E000000000000000000000000000000000005C :10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B +:10B500000000000000000000000008000000000033 :10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000100000000000000000000000CB -:10B5700000000000000000000000000000000000CB +:10B520000000000000000000000000008400000097 +:10B5300008000000000000000000C0000000000043 +:10B54000000000000800C000000082000000A00011 +:10B55000A0000800820000000000000008000000B9 +:10B5600000000800000000000000000000000000D3 +:10B5700000000004000000000000000000000000C7 :10B5800000000000000000000000000000000000BB :10B5900000000000000000000000000000000000AB :10B5A000000000000000000000000000000000009B @@ -19298,14 +19298,14 @@ :10B5C000000000000000000000000000000000007B :10B5D000000000000000000000000000000000006B :10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B +:10B5F000000000000001000000000000000000004A :10B60000000000000000000000000000000000003A :10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A +:10B620000000000000000000000000000000080012 :10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000000000000DA +:10B6400000000000080000000000000000000800EA +:10B6500008000000C000000084000000000082001C +:10B660004000080004000800000000000000000086 :10B6700000000000000000000000000000000000CA :10B6800000000000000000000000000000000000BA :10B6900000000000000000000000000000000000AA @@ -19319,10 +19319,10 @@ :10B710000000000000000000000000000000000029 :10B720000000000000000000000000000000000019 :10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 +:10B7400000000000000000000000000000000800F1 +:10B750000800000000000000000000000000C00021 +:10B760009000C00000000000000000000000000089 +:10B77000C000000000000000000000000000000009 :10B7800000000000000000000000000000000000B9 :10B7900000000000000000000000000000000000A9 :10B7A0000000000000000000000000000000000099 @@ -19337,73 +19337,73 @@ :10B830000000000000000000000000000000000008 :10B8400000000000000000000000000000000000F8 :10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 +:10B8600000014001000100C10001000100C00021F1 +:10B8700000000001000800880001000100C0000075 :10B8800000000000000000000000000000000000B8 :10B8900000000000000000000000000000000000A8 :10B8A0000000000000000000000000000000000098 :10B8B0000000000000000000000000000000000088 :10B8C0000000000000000000000000000000000078 :10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000000000000000000000000000000048 +:10B8E000000000410041004100830041004100C0D0 +:10B8F0000841001010410000000000410041008597 :10B900000000000000000000000000000000000037 :10B910000000000000000000000000000000000027 :10B920000000000000000000000000000000000017 :10B930000000000000000000000000000000000007 :10B9400000000000000000000000000000000000F7 :10B9500000000000000000000000000000000000E7 -:10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 +:10B96000000000004100030000000080410085004D +:10B970000000030008000880000083004100C100AF +:10B980000080000000000000000000000000000037 :10B9900000000000000000000000000000000000A7 :10B9A0000000000000000000000000000000000097 :10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 +:10B9C0000000000000020000000000000000000075 :10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000000036 +:10B9E00000000000000001000100000000C0010094 +:10B9F000C00000000000200021020090C0004100B3 +:10BA0000C100000440000000000000000000000031 :10BA10000000000000000000000000000000000026 :10BA20000000000000000000000000000000000016 :10BA30000000000000000000000000000000000006 :10BA400000000000000000000000000000000000F6 :10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 +:10BA6000000000000000000000C00001C0C1000094 +:10BA70000000000100C004900041000100C100006E +:10BA800000000001000000000000000000000000B5 :10BA900000000000000000000000000000000000A6 :10BAA0000000000000000000000000000000000096 :10BAB0000000000000000000000000000000000086 :10BAC0000000000000000000000000000000000076 :10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000000000035 +:10BAE000000000000000000000000080004180C154 +:10BAF00000000000004100C180030041004100C17E +:10BB000000000000004100050000000000000000EF :10BB10000000000000000000000000000000000025 :10BB20000000000000000000000000000000000015 :10BB30000000000000000000000000000000000005 :10BB400000000000000000000000000000000000F5 :10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 +:10BB6000000000000000000000000000C100800094 +:10BB700080C1000041408000C0004100C141000080 +:10BB8000800800004100000080004100000000002B :10BB900000000000000000000000000000000000A5 :10BBA0000000000000000000000000000000000095 :10BBB0000000000000000000000000000000000085 :10BBC0000000000000000000000000000000000075 :10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 +:10BBE0000000000000000000000000000000C10094 +:10BBF0004000C0C100000100020004000100C1912A +:10BC00008200C000000001000000C0000100000030 :10BC10000000000000000000000000000000000024 :10BC20000000000000000000000000000000000014 :10BC30000000000000000000000000000000000004 :10BC400000000000000000000000000000000000F4 :10BC500000000000000000000000000000000000E4 :10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000000000B4 +:10BC70000000000000000042000000000000000082 +:10BC80008112004107004800000000000000000091 :10BC900000000000000000000000000000000000A4 :10BCA0000000000000000000000000000000000094 :10BCB0000000000000000000000000000000000084 @@ -19426,228 +19426,228 @@ :10BDC0000000000000000000000000000000000073 :10BDD0000000000000000000000000000000000063 :10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 +:10BDF000000000000000757B000000000000000053 :10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000000000000022 +:10BE100000000000DEAE0000000000000000000096 :10BE20000000000000000000000000000000000012 :10BE30000000000000000000000000000000000002 :10BE400000000000000000000000000000000000F2 :10BE500000000000000000000000000000000000E2 :10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0002000000000002000000000000000000042 -:10BEC0000000000000000000000000000000000072 -:10BED0002000000000002000000000000000000022 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000200000000000200000000000000002 -:10BF00000000000000000000000000000000000031 -:10BF100000002000000000002000000000000000E1 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 +:10BE7000000000000000000060C603000000000099 +:10BE800000000031E0000000000000000C00000095 +:10BE90000000000000C06306000000000000000079 +:10BEA0000000000020000000200010000000200022 +:10BEB0000000000000000000000000000000000082 +:10BEC00000000000200000402040400000402040D2 +:10BED0004000000000000000000100000000000021 +:10BEE0000000000000002000000020000000000012 +:10BEF0002000000000000000000000000000000022 +:10BF000000000000000020000000200000000000F1 +:10BF10002000000000000000000000000000000001 +:10BF200000000000004000000000000000000000D1 +:10BF300010004000000000000000000000000000B1 :10BF400000000000000000000000000000000000F1 :10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 +:10BF60000000000000000000000000400000000091 +:10BF700000000000000008000000000000000000B9 :10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 +:10BF90004000000000000000000000000000000061 :10BFA0000000000000000000000000000000000091 -:10BFB0000000000800000000000000000000000079 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000800000000000000080000E0 -:10C0500000000000000800000000000000000000D8 -:10C060000000000000000040000000000000000888 -:10C0700000000000000000080000000000000000B8 -:10C0800000000000000000000000000000000010A0 -:10C090000000000000000008000000000000000098 -:10C0A0000000000000000000000000000000000090 +:10BFB000000000000000002000000000000004005D +:10BFC0000000082000000020000000200000000009 +:10BFD0000000080000000000000000000000000059 +:10BFE000000000000200000000000000000000004F +:10BFF000000000000200000000000000000000003F +:10C000000000000000000000000000000800000028 +:10C010000000000000000000000800000000000018 +:10C02000000000000000000000000000000000040C +:10C0300000000002000000000001000000000000FD +:10C04000800000000001000000010000000100006D +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C09000000000000000000000000001000000009F +:10C0A000000000000000000000000000040000008C :10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 +:10C0C0000000000000000000002000000000000050 :10C0D0000000000000000000000000000000000060 :10C0E0000000000000000000000000000000000050 :10C0F0000000000000000000000000000000000040 :10C10000000000000000000000000000000000002F :10C11000000000000000000000000000000000001F :10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF +:10C1300000000020000000000000000000000000DF +:10C1400000000000000000000000000100000000EE +:10C1500000001000080000001000000000000000B7 :10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F +:10C1700000000000000000000000000008000000B7 +:10C180000000000000000000000041000400020068 +:10C1900000000000000000000000000400A00000FB +:10C1A0000000000000000800000000000000000087 :10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F +:10C1C000C00000000080000000000000000000002F :10C1D000000000000000000000000000000000005F :10C1E000000000000000000000000000000000004F :10C1F000000000000000000000000000000000003F :10C20000000000000000000000000000000000002E :10C21000000000000000000000000000000000001E -:10C220000000000000000000000000000008000006 -:10C2300000000000000800000000000000000000F6 -:10C24000000000000000000000000000001000825C +:10C22000000000800180000000000000000000000D +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000200000000000000000CE :10C2500000000000000000000000000000000000DE :10C2600000000000000000000000000000000000CE :10C2700000000000000000000000000000000000BE :10C2800000000000000000000000000000000000AE :10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000104E +:10C2A0000000000000200404000000000000000066 +:10C2B0000000000000000000000082000000840078 +:10C2C000000000000000A0000000000000000000CE +:10C2D000000000000000000000000000000000005E :10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D +:10C2F0000000000000000000000000000800000036 +:10C300000000C0000000000000000000000000006D +:10C31000000000000000000000000000000090008D +:10C32000900000000000020000000000000000007B :10C3300000000000000000000000000000000000FD :10C3400000000000000000000000000000000000ED :10C3500000000000000000000000000000000000DD :10C3600000000000000000000000000000000000CD :10C3700000000000000000000000000000000000BD :10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D +:10C390000000000000000000090000001190409023 +:10C3A000000000000000000080000000000000000D :10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D +:10C3C00000008500C100010000800100A000010004 +:10C3D000008000000000000000800000000000005D :10C3E000000000000000000000000000000000004D :10C3F000000000000000000000000000000000003D :10C40000000000000000000000000000000000002C :10C41000000000000000000000000000000000001C :10C42000000000000000000000000000000000000C :10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC +:10C4400000000000040004A004000020040000001C +:10C450000400002000000000000000200000000098 :10C4600000000000000000000000000000000000CC :10C4700000000000000000000000000000000000BC -:10C4800000000000000002000000000000000000AA +:10C4800000000000000000000000000000000000AC :10C49000000000000000000000000000000000009C :10C4A000000000000000000000000000000000008C :10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C +:10C4C000000000000000000000C00090000000001C +:10C4D00000C000900000000000C0009000000000BC :10C4E000000000000000000000000000000000004C :10C4F000000000000000000000000000000000003C :10C50000000000000000000000000000000000002B :10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B +:10C5200000000000000000000000010090209000CA :10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB +:10C5400000000000000000000000038000800000E8 +:10C5500000000580008000000000008000800000D6 :10C5600000000000000000000000000000000000CB :10C5700000000000000000000000000000000000BB :10C5800000000000000000000000000000000000AB :10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B +:10C5A0000000000000000000000000000900808082 +:10C5B000A0000000000000000000000000000000DB +:10C5C00000000000000000000000800000000000EB +:10C5D000800080800000000080008080000000005B +:10C5E00080008080000000000000000000000000CB :10C5F000000000000000000000000000000000003B :10C60000000000000000000000000000000000002A :10C61000000000000000000000000000000000001A :10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA +:10C630000080000300000000000000000000000077 +:10C64000000000000000000000000000900000005A +:10C6500000008400C090000000008400C090000032 +:10C6600000008400C09000000000000000000000F6 +:10C6700000000000000000020000000000000000B8 :10C6800000000000000000000000000000000000AA :10C69000000000000000000000000000000000009A :10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A +:10C6B0000000000200000020000000000000000058 :10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A +:10C6D00000000000009000C000000000009000C0BA +:10C6E00000000000009000C00000000000000000FA :10C6F000000000000000000000000000000000003A :10C700000000000000000000000000000000000029 :10C710000000000000000000000000000000000019 :10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 +:10C7300000000100008888000000000000000000E8 :10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000000000000C9 +:10C750002000000000000080008000000000008039 +:10C760000080000000000080008000000000000049 :10C7700000000000000000000000000000000000B9 :10C7800000000000000000000000000000000000A9 :10C790000000000000000000000000000000000099 :10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 +:10C7B0000000000041000080000021000000000097 +:10C7C0000000000000000000000000000040000326 +:10C7D0000000000080118003000000008011800331 +:10C7E0000000000080050040000000000000000084 :10C7F0000000000000000000000000000000000039 :10C800000000000000000000000000000000000028 :10C810000000000000000000000000000000000018 :10C820000000000000000000000000000000000008 -:10C8300000000000000000000000000000000000F8 +:10C8300000000000000000110020008080000000C7 :10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 +:10C85000000100000000C001200000000000C00135 +:10C86000200000000000C000900000000000000058 :10C8700000000000000000000000000000000000B8 :10C8800000000000000000000000000000000000A8 :10C890000000000000000000000000000000000098 :10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 +:10C8B00000000000000000000001000000408800AF :10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 +:10C8D0000081000007000000004100000700000088 +:10C8E0000041000007000000008100000700000078 :10C8F0000000000000000000000000000000000038 :10C900000000000000000000000000000000000027 :10C910000000000000000000000000000000000017 :10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 +:10C930000000000000000000000000000041820034 +:10C940008200000000000000000000000000000065 +:10C9500000000000000000000000000000FF0000D8 +:10C9600000FF000000FF000000FF000000FF0000CB +:10C9700000FF0000000000000000000000000000B8 :10C9800000000000000000000000000000000000A7 :10C990000000000000000000000000000000000097 :10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 +:10C9B0000000000000000000000000003C3C0000FF +:10C9C000F0F0000000000000000000000000000087 +:10C9D000000000000000000000000000000000FF58 +:10C9E000000000FF000000FF000000FF000000FF4B +:10C9F000000000FF00000000000000000000000038 :10CA00000000000000000000000000000000000026 :10CA10000000000000000000000000000000000016 :10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 +:10CA300000000000000000000000000000003C3C7E +:10CA40000000F0F000000000000000000000000006 +:10CA500000000000000000000000FFFF0000FF00D9 +:10CA60000000FF000000FF000000FF000000FF00CA +:10CA70000000FF00000000000000000000000000B7 :10CA800000000000000000000000000000000000A6 :10CA90000000000000000000000000000000000096 :10CAA0000000000000000000000000000000000086 :10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 +:10CAC0000000FF000000FFFF000000000000000069 +:10CAD000000000000000000000000000FFFF000058 +:10CAE000FF000000FF000000FF000000FF0000004A +:10CAF000FF000000FF000000000000000000000038 :10CB00000000000000000000000000000000000025 :10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 :10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 +:10CB400000000000FF0000000000000000000000E6 +:10CB5000000000000000000000000000003800009D +:10CB600010C0038203380C0092C0038203380C000B +:10CB700092C0038203380C008AC00000000000004D :10CB800000000000000000000000000000000000A5 :10CB90000000000000000000000000000000000095 :10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 +:10CBC0000000000015612A0F054C00A800000000BD :10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 :10CBF0000000000000000000000000000000000035 @@ -19655,7 +19655,7 @@ :10CC10000000000000000000000000000000000014 :10CC20000000000000000000000000000000000004 :10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 +:10CC400000000000000000000000AAAA0000000090 :10CC500000000000000000000000000000000000D4 :10CC600000000000000000000000000000000000C4 :10CC700000000000000000000000000000000000B4 @@ -19663,7 +19663,7 @@ :10CC90000000000000000000000000000000000094 :10CCA0000000000000000000000000000000000084 :10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 +:10CCC000000000000000000000000000AAAA000010 :10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 :10CCF0000000000000000000000000000000000034 @@ -19680,178 +19680,178 @@ :10CDA0000000000000000000000000000000000083 :10CDB0000000000000000000000000000000000073 :10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000002000200013 -:10CDE0000000000000000000000000002000000023 -:10CDF00000000000000000000000000020002000F3 -:10CE00000000000000000000000000002000000002 -:10CE100000000000000000000000000000002000F2 -:10CE200020000000000000000000000000002000C2 -:10CE300000000000000000000000000000002000D2 -:10CE400020000000000000000000000000002000A2 -:10CE500000000000000000000000000000000000D2 -:10CE600000000002000000000000000000000000C0 +:10CDD0000000000000000000000000002000000033 +:10CDE0000000000000000000000000000000000043 +:10CDF00000002000000000000000000020000000F3 +:10CE00000000000000000000000000000000000022 +:10CE100000002000000100000000000000002000D1 +:10CE20000000000000000000000000000000000002 +:10CE300000000000200000000000000000002000B2 +:10CE4000000000000000C000000000000000000022 +:10CE500000000000200000000000000000000000B2 +:10CE600000000000000000000000000000000000C2 :10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 :10CE90000000000000000000000000000000000092 -:10CEA0000000000000001000000000000000000072 -:10CEB0000000000000000000400000000000000032 -:10CEC0000000000000020000000000000000000060 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED00000000000000000000000000000000080D2 +:10CEE0000000000000000080000002000000A00020 +:10CEF00090000000000000000000000000000000A2 :10CF00000000000000000000000000000000000021 :10CF10000000000000000000000000000000000011 :10CF20000000000000000000000000000000000001 :10CF300000000000000000000000000000000000F1 :10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000088008800000000A1 -:10CF80000000000000000000000800000000000099 +:10CF5000000000000000000082000000000000004F +:10CF600000020000000000000040000080000000FF +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 :10CF90000000000000000000000000000000000091 -:10CFA0000000000000000000000000080000000079 +:10CFA0000000000000000000000000000000000081 :10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000080000000059 -:10CFD0000000000000000000000000000008000049 -:10CFE0000000000000000000000000080000000039 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 :10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 +:10D000000000000500090000000000000000000012 :10D010000000000000000000000000000000000010 :10D020000000000000000000000000000000000000 :10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 +:10D040000000000000000400000000008400400018 +:10D050000000040088000000000000000000000044 +:10D0600000000000000000000000000008000000B8 :10D0700000000000000000000000000000000000B0 :10D0800000000000000000000000000000000000A0 :10D090000000000000000000000000000000000090 :10D0A0000000000000000000000000000000000080 :10D0B0000000000000000000000000000000000070 :10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 +:10D0D00000000000210041000000000000000000EE +:10D0E000A00000000000010000000000000000009F +:10D0F0000000000000090000000088110009000580 :10D10000000000000000000000000000000000001F :10D11000000000000000000000000000000000000F :10D1200000000000000000000000000000000000FF :10D1300000000000000000000000000000000000EF :10D1400000000000000000000000000000000000DF :10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF +:10D16000000021000000000004400000000000005A :10D1700000000000000000000000000000000000AF :10D18000000000000000000000000000000000009F :10D19000000000000000000000000000000000008F :10D1A000000000000000000000000000000000007F -:10D1B00000000000000000000088000000000000E7 +:10D1B000000000000000000000000000000000006F :10D1C000000000000000000000000000000000005F :10D1D000000000000000000000000000000000004F -:10D1E00000000000000000000000004100000000FE -:10D1F000000000000000000000000000000000002F +:10D1E000000000000000C00040000000000000003F +:10D1F00000000000200000000020000000000000EF :10D20000000000000000000000000000000000001E :10D21000000000000000000000000000000000000E :10D2200000000000000000000000000000000000FE :10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE +:10D2400000000000000000000000000000001000CE :10D2500000000000000000000000000000000000CE :10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE +:10D2700000000000000000000000000100000000AD :10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E +:10D29000030000000000000000000000000000008B :10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E :10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D +:10D2D00000900500000000000400400000C000C0F5 +:10D2E00000000000000000840000C000C00000003A +:10D2F0000000C0000000000000200020900000207E +:10D300000000000001000000000900000000001102 +:10D3100000000000000000110000000000000000FC :10D3200000000000000000000000000000000000FD :10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD +:10D3500000000000000010000000000000000000BD :10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D +:10D3700000000000000000000000000100010000AB +:10D3800000010000000002001190000000000000F9 :10D39000000000000000000000000000000000008D :10D3A000000000000000000000000000000000007D :10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D :10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C +:10D3E000000000000000000000000000000001003C +:10D3F000880000000002000800040008000000008F +:10D400000000000000C000C0000408A000000000F0 :10D41000000000000000000000000000000000000C :10D4200000000000000000000000000000000000FC :10D4300000000000000000000000000000000000EC :10D4400000000000000000000000000000000000DC :10D4500000000000000000000000000000000000CC :10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C +:10D47000110000000000008000800080008040005B +:10D48000000000000000028000800080800000009A :10D49000000000000000000000000000000000008C :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C :10D4D000000000000000000000000000000000004C :10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B +:10D4F000000000000000000000000010008000009C +:10D50000000000000000000000000080000080809B :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB :10D5400000000000000000000000000000000000DB :10D5500000000000000000000000000000000000CB :10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B +:10D57000000000000008000000100000004100044E +:10D5800000000000008800000088020088C0C00081 +:10D5900002C00000000000000000000000000000C9 :10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B +:10D5B000000000010000000000000000000000006A :10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B :10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A +:10D5F0000000000001010000080100000800000018 +:10D60000000010000100000008000000A108002038 +:10D61000C0A000C0000000000000000000000000EA :10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA +:10D6300000000000000100000000000000000000E9 :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA :10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D69000000000000000000000000000000000008A +:10D6700000000000000010110003001100038000F2 +:10D680000000000080001000000000000000418049 +:10D69000008080000000000000000000000000008A :10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000000000006A +:10D6B0000000000000000001000000000000000069 :10D6C000000000000000000000000000000000005A :10D6D000000000000000000000000000000000004A :10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 +:10D6F000000000000000000000050008000000001D +:10D700000000800000000000000000050000000094 +:10D7100080048008800080000000000000000000FD :10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 +:10D7300000000000000000000001000000000000E8 :10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 :10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 +:10D78000000088000400080088000000000000007D +:10D790000000C000C000C088C00000000000000001 :10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 +:10D7B0000000000000000000000000010000000068 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 :10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 +:10D7F00000000000000000000000000000810000A8 +:10D8000007000000000000000000000000410000D0 +:10D8100007000000000000008200484200000000F5 :10D8200000000000000000000000000000000000F8 :10D8300000000000000000000000000000000000E8 :10D8400000000000000000000000000000000000D8 :10D8500000000000000000000000000000000000C8 :10D8600000000000000000000000000000000000B8 :10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 +:10D880000000000000007EF67E9000000000000016 :10D890000000000000000000000000000000000088 :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 @@ -19859,7 +19859,7 @@ :10D8D0000000000000000000000000000000000048 :10D8E0000000000000000000000000000000000038 :10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 +:10D90000000000000000000018F618900000000061 :10D910000000000000000000000000000000000007 :10D9200000000000000000000000000000000000F7 :10D9300000000000000000000000000000000000E7 @@ -19868,39 +19868,39 @@ :10D9600000000000000000000000000000000000B7 :10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 +:10D99000000000000000000000004008400000847B +:10D9A0002000000000000000000000000000000057 :10D9B0000000000000000000000000000000000067 :10D9C0000000000000000000000000000000000057 :10D9D0000000000000000000000000000000000047 :10D9E0000000000000000000000000000000000037 :10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 +:10DA0000000000000000000000000000F0FF6C6C4F +:10DA10000000000000000000FFFFFFFF000000000A :10DA200000000000000000000000000000000000F6 :10DA300000000000000000000000000000000000E6 :10DA400000000000000000000000000000000000D6 :10DA500000000000000000000000000000000000C6 :10DA600000000000000000000000000000000000B6 :10DA700000000000000000000000000000000000A6 -:10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 +:10DA80000000000000000000000000000000000F87 +:10DA90006C6C0000000000000000FFFFFFFF0000B2 :10DAA0000000000000000000000000000000000076 :10DAB0000000000000000000000000000000000066 :10DAC0000000000000000000000000000000000056 :10DAD0000000000000000000000000000000000046 :10DAE0000000000000000000000000000000000036 :10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 +:10DB0000000000000000000005610A3E050D00A0B5 +:10DB1000000030000000000005000A38050010A6D3 +:10DB200030000000000008000000000000000000BD :10DB300000000000000000000000000000000000E5 :10DB400000000000000000000000000000000000D5 :10DB500000000000000000000000000000000000C5 :10DB600000000000000000000000000000000000B5 :10DB700000000000000000000000000000000000A5 -:10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000000000000085 +:10DB800000000000000000000000000000000AFA91 +:10DB90003F3F000000000000000000000000000007 :10DBA0000000000000000000000000000000000075 :10DBB0000000000000000000000000000000000065 :10DBC0000000000000000000000000000000000055 @@ -19908,7 +19908,7 @@ :10DBE0000000000000000000000000000000000035 :10DBF0000000000000000000000000000000000025 :10DC00000000000000000000000000000000000014 -:10DC10000000000000000000000000000000000004 +:10DC10000AFA3030000000000000000000000000A0 :10DC200000000000000000000000000000000000F4 :10DC300000000000000000000000000000000000E4 :10DC400000000000000000000000000000000000D4 @@ -19933,71 +19933,71 @@ :10DD700000000000000000000000000000000000A3 :10DD80000000000000000000000000000000000093 :10DD90000000000000000000000000000000000083 -:10DDA0000000000000000000000000000000000073 -:10DDB00020004000000000000000400000000000C3 -:10DDC0000000000000000000000000000000000053 -:10DDD00020000000400000000000000020000000C3 -:10DDE00000000000880000000000000000000000AB -:10DDF00000002000200000000000000020000000C3 -:10DE000000000000200000000000000000000000F2 -:10DE100000002000000000000000000000000000E2 -:10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000000000000000E2 +:10DDA0000000000000000000000040000000000033 +:10DDB0000000000210000000000000000000000051 +:10DDC00000000000000000000000200000004000F3 +:10DDD00000000000000020000000400040000000A3 +:10DDE0000000000000000000000000002000000013 +:10DDF00020000000000000000000000020020000E1 +:10DE000000000000000000000000000020410000B1 +:10DE100020000000000000000000000040000000A2 +:10DE200000000000000000000002000000000000F0 +:10DE300000000002400040000002400040000000DE :10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 +:10DE50000000000000004000000000000000000082 :10DE600000000000000000000000000000000000B2 -:10DE700000000000000000000000000000000000A2 +:10DE70000000000000000000000010000000000092 :10DE80000000000000000000000000000000000092 -:10DE90000000000000000000000000000000000082 +:10DE90000000000000020000000000000000000080 :10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 +:10DEB0000800000008000000000000000000000052 :10DEC0000000000000000000000000000000000052 :10DED0000000000000000000000000000000000042 :10DEE0000000000000000000000000000000000032 :10DEF0000000000000000000000000000000000022 :10DF00000000000000000000000000000000000011 :10DF10000000000000000000000000000000000001 -:10DF200000000000000000080000000000000008E1 -:10DF300000000000000000080000000000000008D1 -:10DF400000000000000800080000000000000008B9 -:10DF500000000000000000080000000000000000B9 -:10DF60000008000000000088000800000000000019 -:10DF70000008000000000000000800000000000091 -:10DF80000008000000000000008400000000000005 -:10DF90000008000000000000001000000000000069 -:10DFA0000000000000000008000000000000000069 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000800000000000000000000A9 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000100000000000000000000081 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 :10DFB0000000000000000000000000000000000061 :10DFC0000000000000000000000000000000000051 :10DFD0000000000000000000000000000000000041 :10DFE0000000000000000000000000000000000031 :10DFF0000000000000000000000000000000000021 -:10E000000000000000000000000000000000000010 -:10E0100000000000000000000000000800000000F8 -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 +:10E00000000000000000000000000000000004000C +:10E01000000000008400000000000000000000007C +:10E0200000000000000000000004000000000000EC +:10E0300000000010000000000000000000000000D0 :10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 :10E0600000000000000000000000000000000000B0 :10E0700000000000000000000000000000000000A0 -:10E080000000000000000000000000000000000090 +:10E080000800000008001000000000000000000070 :10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000000000060 +:10E0A000000000000000000200000000000000006E +:10E0B0000000000000100000000900000000000047 :10E0C0000000000000000000000000000000000050 :10E0D0000000000000000000000000000000000040 -:10E0E0000800000000000000000000000000000028 +:10E0E0000000000000000000000000000000000030 :10E0F0000000000000000000000000000000000020 :10E10000000000000000000000000000000000000F :10E1100000000000000000000000000000000000FF :10E1200000000000000000000000000000000000EF -:10E1300000000000000000000000000000000000DF +:10E1300000000500000000000090000000880000C2 :10E1400000000000000000000000000000000000CF :10E1500000000000000000000000000000000000BF :10E1600000000000000000000000000000000000AF :10E17000000000000000000000000000000000009F :10E18000000000000000000000000000000000008F :10E19000000000000000000000000000000000007F -:10E1A000000000000000000000100000000000005F +:10E1A000000000000000000000000000000000006F :10E1B000000000000000000000000000000000005F :10E1C000000000000000000000000000000000004F :10E1D000000000000000000000000000000000003F @@ -20005,24 +20005,24 @@ :10E1F000000000000000000000000000000000001F :10E20000000000000000000000000000000000000E :10E2100000000000000000000000000000000000FE -:10E2200000000000000000000000000000000000EE -:10E2300000000000000000000000000000000000DE -:10E2400000000000000000000000000000000000CE +:10E220000000000000000000000011844004000411 +:10E230000000000000000004000011880000001031 +:10E2400000000010000000000000000000000008B6 :10E2500000000000000000000000000000000000BE :10E2600000000000000000000000000000000000AE :10E27000000000000000000000000000000000009E -:10E28000000000000000000000000000000000008E -:10E29000000000000000000000000000000000007E -:10E2A0000000000000000000000000000008000066 -:10E2B000000000000000000000000000000000005E +:10E28000000000000000000000000000000004008A +:10E29000000000000000000000002100000000005D +:10E2A000000000000000000000000000000000006E +:10E2B000000000000002000000000000000000005C :10E2C000000000000000000000000000000000004E :10E2D000000000000000000000000000000000003E :10E2E000000000000000000000000000000000002E :10E2F000000000000000000000000000000000001E :10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD +:10E310000000000084000000000000000000000079 :10E3200000000000000000000000000000000000ED -:10E3300000000000000000000000000000000000DD +:10E3300000000010000000000000000000000000CD :10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD :10E3600000000000000000000000000000000000AD @@ -20127,97 +20127,97 @@ :10E990000000000000000000000000000000000077 :10E9A0000000000000000000000000000000000067 :10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000000000000000047 -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 -:10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 +:10E9C00000000000000000000000000000800000C7 +:10E9D0000000008000800280208000000000000015 +:10E9E000000000000000000000000000000088009F +:10E9F00000000000000020002000000000000000D7 +:10EA00000000000300000000000000000000000003 +:10EA100000000000000000000000200001000000D5 :10EA200000000000000000000000000000000000E6 -:10EA300000000000000000000000000000000000D6 -:10EA400000000000000000000000000000000000C6 -:10EA500000020000000000000000000000000000B4 +:10EA300000000000000000000000200000000000B6 +:10EA400000000800000000000000000000000008B6 +:10EA50000000000000080008800800080000000016 :10EA600000000000000000000000000000000000A6 -:10EA70000002000000000000000000000000000094 -:10EA80000000000200000000000000000000000084 -:10EA90000000000000004000000000000000000036 -:10EAA0000000000000000000000000000000000066 -:10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000000000000026 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000200056 +:10EAA000000009000000000000000000000000005D +:10EAB0000002000000000000000000000000000054 +:10EAC00000000000800000000000000000000000C6 +:10EAD00010000000000010401000100010000000A6 +:10EAE00082000000000000000000000000000000A4 :10EAF0000000000000000000000000000000000016 :10EB00000000000000000000000000000000000005 :10EB100000000000000000000000000000000000F5 :10EB200000000000000000000000000000000000E5 :10EB300000000000000000000000000000000000D5 -:10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 +:10EB400000000000000002000000000000000000C3 +:10EB50000000800000000000800180008000800034 :10EB600000000000000000000000000000000000A5 :10EB70000000000000000000000000000000000095 :10EB80000000000000000000000000000000000085 :10EB90000000000000000000000000000000000075 :10EBA0000000000000000000000000000000000065 :10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000000045 -:10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 +:10EBC00000000000000000000000000020008400A1 +:10EBD0004000000000000000900000000000000065 +:10EBE000880000000000A0000000000000000000FD :10EBF0000000000000000000000000000000000015 :10EC00000000000000000000000000000000000004 :10EC100000000000000000000000000000000000F4 :10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000000000000000D4 +:10EC30000000000000000000000000000400400090 :10EC400000000000000000000000000000000000C4 -:10EC500000000000000000000000000000000000B4 +:10EC50000000000000004000000000000000000074 :10EC600000000000000000000000000000000000A4 :10EC70000000000000000000000000000000000094 :10EC80000000000000000000000000000000000084 :10EC90000000000000000000000000000000000074 :10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 -:10ECC0000000000000000000000000000000000044 -:10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000000000024 +:10ECB00000004000000000000000000000004000D4 +:10ECC0000400000000000000000000000000000040 +:10ECD000000008000000000000000000000000002C +:10ECE00001000080010000000000A0000000000002 :10ECF0000000000000000000000000000000000014 :10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 +:10ED100000000000000000000000000008000000EB +:10ED20000000000000000000000000000100008062 :10ED300000000000000000000000000000000000D3 :10ED400000000000000000000000000000000000C3 :10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 +:10ED60000000040003200400000000000000000474 :10ED70000000000000000000000000000000000093 :10ED80000000000000000000000000000000000083 :10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000000000000053 +:10EDA0000000000000000000000000000000200043 +:10EDB000000400000000000000000000000000004F :10EDC0000000000000000000000000000000000043 -:10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 +:10EDD000000000000000040000000000000090009F +:10EDE00000000000040000200000000000000000FF :10EDF0000000000000000000000000000000000013 :10EE00000000000000000000000000000000000002 :10EE100000000000000000000000000000000000F2 -:10EE200000000000000000000000000000000000E2 +:10EE2000000000000000000008009000000010003A :10EE300000000000000000000000000000000000D2 :10EE400000000000000000000000000000000000C2 -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 +:10EE50000000000000000000000000900000000022 +:10EE60000000000000908000000100880000000009 :10EE70000000000000000000000000000000000092 :10EE80000000000000000000000000000000000082 :10EE90000000000000000000000000000000000072 :10EEA0000000000000000000000000000000000062 -:10EEB0000000000000000000000000000000000052 +:10EEB00080000000000000000000000000000000D2 :10EEC0000000000000000000000000000000000042 :10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000000000000012 +:10EEE00000008800000000000040820400000000D4 +:10EEF000000200040000000000000000000000000C :10EF00000000000000000000000000000000000001 :10EF100000000000000000000000000000000000F1 :10EF200000000000000000000000000000000000E1 :10EF300000000000000000000000000000000000D1 :10EF400000000000000000000000000000000000C1 -:10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 +:10EF500000000000000000000000000008000000A9 +:10EF600000000000000000000000000100000000A0 :10EF70000000000000000000000000000000000091 :10EF80000000000000000000000000000000000081 :10EF90000000000000000000000000000000000071 @@ -20225,7 +20225,7 @@ :10EFB0000000000000000000000000000000000051 :10EFC0000000000000000000000000000000000041 :10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 +:10EFE000000000000000000000000101880088000F :10EFF0000000000000000000000000000000000011 :10F000000000000000000000000000000000000000 :10F0100000000000000000000000000000000000F0 @@ -20233,81 +20233,81 @@ :10F0300000000000000000000000000000000000D0 :10F0400000000000000000000000000000000000C0 :10F0500000000000000000000000000000000000B0 -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 +:10F060000000000000000900000000001141002124 +:10F07000000400200000000000000000000000006C :10F080000000000000000000000000000000000080 :10F090000000000000000000000000000000000070 :10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000000050 +:10F0B0000000000000000000000040000000000010 :10F0C0000000000000000000000000000000000040 :10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000000000000010 +:10F0E000000000000000000000000000000011000F +:10F0F00008801100418000000000000000000000B6 :10F1000000000000000000000000000000000000FF :10F1100000000000000000000000000000000000EF :10F1200000000000000000000000000000000000DF -:10F1300000000000000000000000000000000000CF +:10F13000000000000000000000410000000300008B :10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF +:10F1500000000000000000000000800000008000AF :10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F +:10F170000088000201000182000000000000000081 :10F18000000000000000000000000000000000007F :10F19000000000000000000000000000000000006F -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000000000000000000000004F +:10F1A000000300000000000000000000000000005C +:10F1B000000000000000000000000001000000004E :10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F +:10F1D000000000000000000000000000100000001F +:10F1E000900000000000000000000000000100008E +:10F1F00001012101008988000101000000000000D8 :10F2000000000000000000000000000000000000FE :10F2100000000000000000000000000000000000EE :10F2200000000000000000000000000000000000DE -:10F2300000000000000000000000000000000000CE +:10F230000000000000000000000000000000880046 :10F2400000000000000000000000000000000000BE :10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E +:10F260000000000000000000000000000003000398 +:10F2700000091141081000834109114100000000FC :10F28000000000000000000000000000000000007E :10F29000000000000000000000000000000000006E :10F2A000000000000000000000000000000000005E -:10F2B000000000000000000000000000000000004E -:10F2C000000000000000000000000000000000003E +:10F2B000000000000000000000000000000000034B +:10F2C000000000000300000000000000000000003B :10F2D000000000000000000000000000000000002E -:10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E +:10F2E0000000000000000000000000000000000816 +:10F2F0000000000000004111114005808300000063 :10F3000000000000000000000000000000000000FD :10F3100000000000000000000000000000000000ED :10F3200000000000000000000000000000000000DD :10F3300000000000000000000000000000000000CD -:10F3400000000000000000000000000000000000BD +:10F3400000000011000000000000000000000000AC :10F3500000000000000000000000000000000000AD :10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D +:10F3700000000000000000000105010000408800BE :10F38000000000000000000000000000000000007D :10F39000000000000000000000000000000000006D :10F3A000000000000000000000000000000000005D :10F3B000000000000000000000000000000000004D -:10F3C000000000000000000000000000000000003D +:10F3C000000000000001000000000000000000003C :10F3D000000000000000000000000000000000002D -:10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D +:10F3E000000000000090000000000000000000008D +:10F3F0000000810000E000000000480000E0820002 :10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC :10F4200000000000000000000000000000000000DC :10F4300000000000000000000000000000000000CC -:10F4400000000000000000000000000000000000BC +:10F4400000000000000000410000810000000000FA :10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000000007C +:10F460000000000000000000070000000000000095 +:10F470000000000000000000000000003C3C000014 +:10F48000F0F000000000000000000000000000009C :10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C :10F4B000000000000000000000000000000000004C :10F4C000000000000000000000000000000000003C :10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB +:10F4F00000000000000000000000000000003C3C94 +:10F500000000F0F00000000000000000000000001B :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB :10F5300000000000000000000000000000000000CB @@ -20315,14 +20315,14 @@ :10F5500000000000000000000000000000000000AB :10F56000000000000000000000000000000000009B :10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000007B +:10F580000000FFFF0000FFFF00000000000000007F :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B :10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B :10F5D000000000000000000000000000000000002B -:10F5E000000000000000000000000000000000001B -:10F5F000000000000000000000000000000000000B +:10F5E0000000000000000000000000000000AFAFBD +:10F5F0000505000000000000000000000000000001 :10F6000000000000000000000000000000000000FA :10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA @@ -20330,90 +20330,90 @@ :10F6400000000000000000000000000000000000BA :10F6500000000000000000000000000000000000AA :10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A +:10F67000AFAF0505000000000000000000610006BB +:10F68000C008000015002A08C54000A800000000BE :10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A :10F6B000000000000000000000000000000000004A -:10F6C000000000000000000000000000000000003A -:10F6D000000000000000000000000000000000002A +:10F6C00000000000000000000000000000000061D9 +:10F6D0000007000C00000000000000000000000017 :10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 +:10F700000000F0F000FF4D4DFF00F0F014BE0000CF :10F7100000000000000000000000000000000000E9 :10F7200000000000000000000000000000000000D9 :10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 -:10F7500000000000000000000000000000000000A9 +:10F75000000000003C3C0000000000000000000031 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 -:10F780000000000000000000000000000000000079 +:10F7800000000000F0F03C3C4D4DFF00F0F014BED6 :10F790000000000000000000000000000000000069 :10F7A0000000000000000000000000000000000059 :10F7B0000000000000000000000000000000000049 :10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 +:10F7D0000000000000003C3C0000000000000000B1 :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 +:10F80000000000000000000000000F0FFF0000FFDC +:10F81000FCFC0000000000000000000000000000F0 :10F8200000000000000000000000000000000000D8 :10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 :10F870000000000000000000000000000000000088 -:10F880000000000000000000000000000000000078 -:10F890000000000000000000000000000000000068 +:10F880000000000000000000000000003C3CFF0001 +:10F8900000FFC0C0000000000000000000000000E9 :10F8A0000000000000000000000000000000000058 :10F8B0000000000000000000000000000000000048 :10F8C0000000000000000000000000000000000038 :10F8D0000000000000000000000000000000000028 :10F8E0000000000000000000000000000000000018 :10F8F0000000000000000000000000000000000008 -:10F9000000000000000000000000000000000000F7 -:10F9100000000000200000000000000020000000A7 -:10F9200000000000000000000000000000000000D7 -:10F930000000000020000000000000002000000285 -:10F9400000000000000000000000000000000000B7 -:10F950000000000000002000000000000000200067 -:10F960000000000000000000000000000000000097 -:10F970000000000000002000000000000000200047 -:10F980000000000000000000000000000000000077 -:10F9900040000000000000004000000000000000E7 -:10F9A0000000000000000000000000000000000057 -:10F9B0004000000000000000000000000000000007 +:10F900000000000000002000200000000000410076 +:10F910000100008011004000000000000000000015 +:10F920000000000000002000200000000000000097 +:10F930000000000000004000000000000000000186 +:10F940000000000000000000200020000000000077 +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000200000000000000077 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000400000020000000035 +:10F99000100210000008100010000000000000001D +:10F9A0000000000000000000000000004000000017 +:10F9B00020000000000020002000000000000000E7 :10F9C0000000000000000000000000000000000037 -:10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000000000000000017 -:10F9F0000000000000000000000000000000000007 -:10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 +:10F9D0000000000000000000000020000000000007 +:10F9E0000000000000000000000200000000000015 +:10F9F00000000000400000000000000000000000C7 +:10FA00000000000002000000000000000000008074 +:10FA100000001000100001001000000000000000B5 :10FA200000000000000000000000000000000000D6 :10FA300000000000000000000000000000000000C6 -:10FA400000000000000000000000000000000000B6 -:10FA500000000000000000000000000000000000A6 +:10FA40000000000000000000000000400000000076 +:10FA50000000000000000000000000400000000066 :10FA60000000000000000000000000000000000096 :10FA70000000000000000000000000000000000086 -:10FA80000000000000000000000000000000000076 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000000000000000000000000000056 +:10FA800000000000000080000000000000000000F6 +:10FA90000040000080008000100080000000000096 +:10FAA0000000000000000000000000400000000016 :10FAB0000000000000000000000000000000000046 :10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000000026 +:10FAD0000000000000080000000000000008000016 :10FAE0000000000000000000000000000000000016 -:10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 +:10FAF00000000000004000000000000000080000BE +:10FB000000000000000000000000000000002000D5 +:10FB100020002000C00000000000C0000000000223 :10FB200000000000000000000000000000000000D5 -:10FB300000000000000000000000000000000000C5 +:10FB300000000000000800000000000000080000B5 :10FB400000000000000000000000000000000000B5 :10FB500000000000000000000000000000000000A5 :10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 -:10FB90000000000000000000000000000000000065 -:10FBA0000000000000000000000000000000000055 +:10FB900091048000800005000000000000000000CB +:10FBA0000001000000000000000000000000000054 :10FBB0000000000000000000000000000000000045 :10FBC0000000000000000000000000000000000035 :10FBD0000000000000000000000000000000000025 @@ -20421,145 +20421,145 @@ :10FBF0000000000000000000000000000000000005 :10FC000000000000000000000000000000000000F4 :10FC100000000000000000000000000000000000E4 -:10FC200000000000000000000000000000000000D4 +:10FC200000000000000000020005000000000000CD :10FC300000000000000000000000000000000000C4 :10FC400000000000000000000000000000000000B4 :10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 -:10FC7000000000000000000004000400010001007A -:10FC80000000000000000000000040000000000034 +:10FC7000000000000000080000000000000000007C +:10FC80000000000000000000000000000000000074 :10FC90000000000000000000000000000000000064 :10FCA0000000000000000000000000000000000054 :10FCB0000000000000000000000000000000000044 -:10FCC0000000000000000000000000000000000034 +:10FCC00000000040000000000000000000000000F4 :10FCD0000000000000000000000000000000000024 :10FCE0000000000000000000000000000000000014 -:10FCF0000000000000000000000080008000040000 -:10FD0000040000000000000000000000800000006F -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000000000D3 +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000000000002000D3 +:10FD100000002000000000008800880040800000F3 +:10FD200000000000000000000005000000000000CE :10FD300000000000000000000000000000000000C3 :10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 :10FD60000000000000000000000000000000000093 :10FD70000000000000000000000000000000000083 -:10FD800000000400040004000002C00000000000A5 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000000000000000053 +:10FD80000000000000000000000000000000000073 +:10FD900000000000000000000004000000C0050496 +:10FDA00041900084058821840000000000000000CC :10FDB0000000000000000000000000000000000043 :10FDC0000000000000000000000000000000000033 :10FDD0000000000000000000000000000000000023 -:10FDE0000000000000000000000000000000000013 +:10FDE000000000000000000000C0000000000084CF :10FDF0000000000000000000000000000000000003 -:10FE00000000000080008000800000010000000071 -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000000000000D2 -:10FE300000000000000000000000000000000000C2 +:10FE000000000000000000000000000003000000EF +:10FE10000000000090000000000000000000000052 +:10FE2000C000000000000000000000000002000010 +:10FE3000000200000040000000210000000000005F :10FE400000000000000000000000000000000000B2 :10FE500000000000000000000000000000000000A2 :10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 -:10FE800000000000040000030000010000800000EA -:10FE90000000000000000000000000000000000062 +:10FE70000000000000000000000200000000000080 +:10FE80000000000000000000000000000000000072 +:10FE9000000000000000000000000008000000005A :10FEA0000000000000000000000000000000000052 -:10FEB0000000000000000000000000000000000042 +:10FEB000000000A0000000000000000000000000A2 :10FEC0000000000000000000000000000000000032 :10FED0000000000000000000000000000000000022 :10FEE0000000000000000000000000000000000012 :10FEF0000000000000000000000000000000000002 -:10FF0000000000000000800000000000040000204D -:10FF1000410003000300000000000000000000009A -:10FF200000000000000000000000000000000000D1 -:10FF300000000000000000000000000000000000C1 +:10FF000000000000000000000000000000000000F1 +:10FF1000000000000000000000000000000000C021 +:10FF200010C0002008200101010084000001000031 +:10FF300000010001000000000000000000000000BF :10FF400000000000000000000000000000000000B1 :10FF500000000000000000000000000000000000A1 :10FF60000000000000000000000000000000000091 :10FF70000000000000000000000000000000000081 -:10FF8000000000000000000000C000900000000021 -:10FF900000C0909000000000000000000000000081 -:10FFA0000000000000000000000000000000000051 -:10FFB0000000000000000000000000000000000041 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA00002800080400000001141102080410008C4 +:10FFB000000000040002000000000000000000003B :10FFC0000000000000000000000000000000000031 :10FFD0000000000000000000000000000000000021 :10FFE0000000000000000000000000000000000011 :10FFF0000000000000000000000000000000000001 :020000040005F5 -:1000000000000000000000000000008000800000F0 -:10001000000000A080800000000000000000000040 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:100020000000800800808008008041000800031163 +:10003000411100000000000000000000000000006E :1000400000000000000000000000000000000000B0 :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 -:100080000000000000008000000080800000800070 -:10009000000080800580A1004000C08300000000B7 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A00000000000400020C0820088C00000010065 +:1000B00000010184000000000000000000000000BA :1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 +:1000D000000000000000000000000000000100001F :1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 -:10010000000000000000000082000000C09000001D -:1001100082000000C090000283000000C091000037 -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000009028890C002009000005A +:1001300000010100010100000000000000000000BB :1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F +:10015000000000000000000000000000000000019E :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F -:1001800000000000000000000000000000900000DF -:1001900000000000009000C000000000009100C0BE -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A0000000000000000000418000008080080086 +:1001B00000000003080811410000000000000000DA :1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F +:1001E000000100000000000000000000000000000E :1001F00000000000000000000000000000000000FF -:10020000000000000000000000000000000000806E -:10021000000000000000008000800020000000A11D -:10022000008000000000000000000000000000004E -:1002300000000000000000000000000000000000BE +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000800480058080C5 +:1002300080004100201110000304000000000000B5 :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E +:10026000000000010000000000000000000000008D :10027000000000000000000000000000000000007E -:100280000000000000000000000000000000000965 -:100290000000000080118011000000809191830512 -:1002A0001100031100000000000000000000000029 -:1002B000000000000000000000000000000000003E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000C001C000CD +:1002B000C084C00001000001010001000000000036 :1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E +:1002E000000000000001000000000000000000000D :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED -:10031000000000000000C001200000000082C1C1F8 -:1003200020010100000100000000000000000000AA -:1003300000000000000000000000000000000000BD +:1003100000000000000000000000000000000000DD +:10032000000000000000000000000000000081004C +:1003300000E082004842600000E000000000000091 :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D -:10039000000000000700000000000000070000004F -:1003A000000000E0070088000000000000000000DE +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC -:10041000000000000000FF00FF00FF000000FF00E0 -:100420000000FF000000FF000000000000000000CE +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C -:100490000000000000000000FF00FF00FF0000005F -:1004A000FF000000FF000000FF000000000000004F -:1004B000000000000000000000000000000000003C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B0000000000040084000008420000000000010 :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C @@ -20567,88 +20567,88 @@ :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB :1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB +:100530000000FFFFFFFF00000000000000000000BF :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B -:1005900000000000000000000000000000000F0F3D -:1005A000000000FF00000F0F000000FFFFFFF0F051 -:1005B000000000000000000000000000000000003B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B00000000000FFFFFFFF00000000000000003F :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA -:100620000F0F000000FF00000F0F000000FFFFFF92 -:10063000F0F00000000000000000000000000000DA -:1006400000000000000000000000000000000000AA +:1006200000000000000000000000000000000000CA +:100630000000000000000000100630610007C00D3F +:10064000080000000000C000000000610006000D6E :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A -:100690000000000000000000000000000000000852 -:1006A0000C0012C0038203080C0092C003E3030E87 -:1006B0000C09A2C0000000000000000000000000C3 -:1006C000000000000000000000000000000000002A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C00000000000FF0F3C3CF0F0FFAA000000001B :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 -:100730000000C3FFC3FF0000000000000000000035 -:1007400000000000000000000000000000000000A9 +:1007300000000000000000000000000000000000B9 +:10074000000000000000F0003C3CF0F000AA0000B7 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 -:1007B00000100000C3FFC3FF0000000000000000A5 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 +:1007B0000000000000000000000000000000000039 +:1007C00000000000000000003C3C0F0F3C3CA0AFCC +:1007D0000F000F00000000000000000000000000FB :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 -:1008300000000000FFFFAAAAAAAA00000000000012 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000FF000F0F3C3C13 +:10085000A0AF0F000F00000000000000000000002B :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 -:1008B000000000000000FFFFAAAAAA8A00000000B2 +:1008B0000000000000000000000000000000000038 :1008C0000000000000000000000000000000000028 -:1008D00000002000000020000000000000000000D8 +:1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 -:1008F00000002000000020000000000000000000B8 +:1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 -:100910000000000020000000200000000000000097 +:1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 -:100930000000000020000000200000000000000077 -:100940000000000000000000000000900000000017 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 -:100980004000000000000000000000000002000025 +:100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 -:1009A0000000000000000000000000000002000045 -:1009B0000000000000000000000000000000000037 +:1009A0000000000000000002000000000000004005 +:1009B0000000000200000000000000000000000035 :1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000000000000000017 +:1009D0000000020000000000000000000000000015 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 +:100A40000200000000900000000000000000000014 :100A50000000000000000000000000000000000096 :100A60000000000000000000000000000000000086 :100A70000000000000000000000000000000000076 @@ -20656,24 +20656,24 @@ :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 +:100AC000000000000000000000000400000008001A +:100AD000000000000000C000000000000000000056 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000001000000000000000000B4 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 +:100B200000000000000000000000040000000000C1 +:100B30000000000000000400400000000000000071 +:100B40000000000000000000020040000220000041 +:100B5000042004000000002000000000000000004D :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 -:100BB0000000000000000000020000000000000033 +:100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 +:100BD00000000000000000000000000000000040D5 :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 @@ -20682,23 +20682,23 @@ :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 +:100C60000000000000000000000000820000000002 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF00000000000000000000000000000000000F4 +:100CD0000000040000000000C00000000000002030 +:100CE000000040000000000090000009000000002B +:100CF00000000000000000000000004100000000B3 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 +:100D40000000000000000000000000000000001093 +:100D500000000000000040000800418200200484E0 +:100D6000008809000088000000000000000000006A :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 @@ -20706,16 +20706,16 @@ :100DB0000000000000000000000000000000000033 :100DC0000000000000000000000000000000000023 :100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 +:100DE00000000000000000000040000000000000C3 :100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 :100E300000000000000000000000000000000000B2 -:100E40000000000000009000000000000000000012 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 +:100E400000000000000000000000000000000000A2 +:100E50000000090000000000400000000000000049 +:100E600000000082000000000000090000004100B6 +:100E70000000000041000000000000000000000031 :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 @@ -20745,7 +20745,7 @@ :1010200000000000000000000000000000000000C0 :1010300000000000000000000000000000000000B0 :1010400000000000000000000000000000000000A0 -:101050000000000000008000800000000000000090 +:101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 :101070000000000000000000000000000000000070 :101080000000000000000000000000000000000060 @@ -20753,7 +20753,7 @@ :1010A0000000000000000000000000000000000040 :1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 -:1010D00000000000A00082000400C000000000002A +:1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF @@ -20761,7 +20761,7 @@ :1011200000000000000000000000000000000000BF :1011300000000000000000000000000000000000AF :10114000000000000000000000000000000000009F -:10115000000000000000000000A000A000C000008F +:10115000000000000000000000000000000000008F :10116000000000000000000000000000000000007F :10117000000000000000000000000000000000006F :10118000000000000000000000000000000000005F @@ -20769,7 +20769,7 @@ :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000808F +:1011D000000000000000000000000000000000000F :1011E00000000000000000000000000000000000FF :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE @@ -20777,7 +20777,7 @@ :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E -:10125000000000000000000000000002000000800C +:10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E :10128000000000000000000000000000000000005E @@ -20785,8 +20785,8 @@ :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000100C04D -:1012E00000400000000000000000000000000000BE +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD @@ -20801,16 +20801,16 @@ :1013A000000000000000000000000000000000003D :1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000FFFFFFFF11 -:1013E000FFFFFFFF000000F0000000000000000011 +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD :1013F00000000000000000000000000000000000ED :1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C -:101450000000000000000000000000000000FFFF8E -:10146000FFFFFFFFFFFF000000F000000000000092 +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C @@ -20818,7 +20818,7 @@ :1014B000000000000000000000000000000000002C :1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C -:1014E000FFFFFFFFFFFFFFFF00040C0000000000F4 +:1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC :1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB @@ -20826,7 +20826,7 @@ :1015300000000000000000000000000000000000AB :10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B -:101560000000FFFFFFFFFFFFFFFF00000000000083 +:10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B @@ -20834,7 +20834,7 @@ :1015B000000000000000000000000000000000002B :1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B -:1015E0000000000000A010000000000000008A00C1 +:1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA @@ -20868,195 +20868,195 @@ :1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 -:101800004000200000000000000000000000000078 -:1018100000000000000000000000000000000000C8 -:101820002000200000000000000000000000000078 -:1018300000000000000000000000000000000000A8 -:101840000000200020000000000000000000000058 -:101850000000000000000000000000000000000088 -:101860000000200020000000000000000000000038 -:101870000000000000000000000010000000000058 -:101880000000100000000000000000000000000048 -:101890000000000000000000000040000000000008 -:1018A0000000000000000000000000000000000038 +:1018000000000000000000000000000020000000B8 +:101810000000000000000000400000000000000088 +:101820000000000000000000000000002000000098 +:101830000000000000000000000220000000000086 +:101840000000000000000000000000000000200078 +:101850000000000000000000000020000000000068 +:101860000000000000000000000000000000200058 +:101870000000000000000000010040000000000027 +:101880000000400000000000000000000000000216 +:101890000000000000004000000200400000004086 +:1018A00000004000000000000000000000000000F8 :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 +:1018D0000000000000000000000000000000404088 +:1018E00000000002000200000000000000020000F2 +:1018F0000000000000000000000040400400020062 +:101900000400040000000000000088000000000047 +:101910000000000002000200004002200000000061 :1019200000000000000000000000000000000000B7 :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 :101950000000000000000000000000000000000087 :101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 +:1019700000000000000000000000000000008000E7 +:101980008000800080000000000000000084000053 +:1019900000000000000080008000000180010000C5 +:1019A0000000040000000000000000000000000033 +:1019B000000000000010000000000000000800000F +:1019C00000000000000000100000000000000008FF +:1019D00000000000000000080000000000000008F7 +:1019E000000000000000000800000000000000846B +:1019F00000000000000000080000000000000008D7 +:101A00000000000000000000200040002000400016 +:101A1000400000000010200000000000000000084E +:101A20000000000000000000002100000000000095 +:101A300000000000000000000003000000000000A3 :101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 :101A60000000000000000000000000000000000076 :101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 +:101A80000010000000000000000000000000000046 +:101A900000000000000000018000000000000000C5 :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 :101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 +:101B000000000000000000200000000000000000B5 +:101B1000A0000000000000000100008000000100A3 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 +:101B70000000040004000500010000000000000057 +:101B80000000000000000000000100000000000054 +:101B90000000000000000000000020000004000021 +:101BA0000400000000000000000000000000000031 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 +:101BF000000000008000800084000400000000005D :101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 +:101C10000000000000109011008001000880A00862 +:101C20000080C000008000000000000000000008EC +:101C30000003000000000008000000000000000891 :101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 +:101C5000000800000000000000000000000000007C :101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000000000034 +:101C7000000000000000000000000000040004005C +:101C8000040200000400002000000000000000002A +:101C9000000000000000000100000004200080049B +:101CA00000000020000000200000000000000000F4 :101CB0000000000000000000000000000000000024 :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 +:101CF0000000000000000000000000000000800064 +:101D00008000800000008000000100000000000052 +:101D1000820000000003000000008221000000009B +:101D2000080500000000000000040000000300039C :101D300000000000000000000000000000000000A3 :101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 :101D60000000000000000000000000000000000073 :101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 +:101D800000000000010000800000000000000000D2 +:101D900000000000000000000000008400000000BF +:101DA0000900800000000000020000000200110095 :101DB0000000000000000000000000000000000023 :101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 :101DE00000000000000000000000000000000000F3 :101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 +:101E00000000000000000400002041000300030067 +:101E100000C0C04000022090000000000000000050 +:101E2000000000000000000000C0084000042090F6 :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 :101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 +:101E8000000000C000900000000000C000900000B2 +:101E900000000980808000000000000000000000B9 +:101EA0000000000000000900000002808080008027 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 +:101F000000000000008000800000000000800080D1 +:101F1000000000008000801100418080000000006F +:101F2000000000000041000000030000800080204D +:101F300000418000000000000000000000000000E0 :101F40000000000000000000000000000000000091 :101F50000000000000000000000000000000000081 :101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 +:101F800080000000808000008000000080801180C0 +:101F9000A1000300C091400040008801C00400007F +:101FA00000000000000000010000000000004000F0 +:101FB00040058801C084000000000000000000000F :101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 +:101FD0000000000000000001000000000000000000 :101FE00000000000000000000000000000000000F1 :101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 +:10200000000082000000C090000082000000C0902C +:10201000000283000000C09190400082C08401C093 +:102020000000000000000000000088000000010027 +:1020300090020082408401C0000000000000000007 :102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 +:10205000000000000000000000010000000000007F :102060000000000000000000000000000000000070 :102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 +:102080000000000000000090000000000000009030 +:1020900000C000010000009100C00080008080802E +:1020A000418000000000000000000000000000006F +:1020B0000800118000808080418000000000000046 :1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 +:1020D00000000000000000000000000100000000FF :1020E00000000000000000000000000000000000F0 :1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F +:10210000000000000000000000800000000000004F +:10211000008010800010000000A10380800080403B +:1021200080208080000000000000000000000011FE +:102130000000000080098040802080000000000036 :10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F +:10215000000000000000000000000000000100007E :10216000000000000000000000000000000000006F :10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F +:10218000000000000000001100210000000080118C +:102190008003000000008391C04105004011C00091 +:1021A0004000842110080000000000000000000032 +:1021B000000100000000C0008200842102900000A5 :1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF +:1021D00000000000000000000000000000000001FE :1021E00000000000000000000000000000000000EF :1021F00000000000000000000000000000000000DF :1022000000000000000000000000000000000000CE -:1022100000000000000000000000000000000000BE -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E +:10221000C001200100000000C09120010100000168 +:1022200000000000400050420000000000000000DC +:10223000000000410000810000000000400000425A :10224000000000000000000000000000000000008E :10225000000000000000000000000000000000007E :10226000000000000000000000000000000000006E :10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E -:10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000000002E +:102280000000000000000000000000000000070047 +:1022900000000000000007000000000000E0070050 +:1022A00041000000000000000000000000000000ED :1022B000000000000000000000000000000000001E :1022C000000000000000000000000000000000000E :1022D00000000000000000000000000000000000FE :1022E00000000000000000000000000000000000EE :1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD +:10231000FF00FF00FF000000FF000000FF000000C2 +:10232000FF000000000000000000000000000000AE :10233000000000000000000000000000000000009D :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D :10236000000000000000000000000000000000006D :10237000000000000000000000000000000000005D :10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D -:1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D +:102390000000FF00FF00FF000000FF000000FF0042 +:1023A0000000FF00000041084000008421060000FA +:1023B00000000000000000000000000000004308D2 +:1023C00040000084218600000000000000000000A2 :1023D00000000000000000000000000000000000FD :1023E00000000000000000000000000000000000ED :1023F00000000000000000000000000000000000DD @@ -21069,24 +21069,24 @@ :10246000000000000000000000000000000000006C :10247000000000000000000000000000000000005C :10248000000000000000000000000000000000004C -:10249000000000000000000000000000000000003C -:1024A000000000000000000000000000000000002C +:1024900000000000000000000F0F000000FF00001F +:1024A0000F0F000000FFFFFFF0F000000000000031 :1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C :1024D00000000000000000000000000000000000FC :1024E00000000000000000000000000000000000EC :1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB -:1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B +:10251000000000000000000000000F0F000000FF9E +:1025200000000F0F000000FFFFFFF0F000000008A8 +:10253000000000080000000000000000006100072B +:10254000000D0000100020080040000800000000FE :10255000000000000000000000000000000000007B :10256000000000000000000000000000000000006B :10257000000000000000000000000000000000005B :10258000000000000000000000000000000000004B -:10259000000000000000000000000000000000003B -:1025A000000000000000000000000000000000002B +:10259000000000000000000000080C0012C00382D0 +:1025A00003080C0092C003E3030E0C09A2C0000054 :1025B000000000000000000000000000000000001B :1025C000000000000000000000000000000000000B :1025D00000000000000000000000000000000000FB @@ -21094,7 +21094,7 @@ :1025F00000000000000000000000000000000000DB :1026000000000000000000000000000000000000CA :1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA +:10262000000000000000000000000000C3FFC3FF26 :10263000000000000000000000000000000000009A :10264000000000000000000000000000000000008A :10265000000000000000000000000000000000007A @@ -21102,8 +21102,8 @@ :10267000000000000000000000000000000000005A :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A +:1026A0000000000000000000000010000000C3FF58 +:1026B000C3FF000000000000000000000000000058 :1026C000000000000000000000000000000000000A :1026D00000000000000000000000000000000000FA :1026E00000000000000000000000000000000000EA @@ -21111,7 +21111,7 @@ :1027000000000000000000000000000000000000C9 :1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 +:10273000AAAA2AAA00000000000000000000000071 :102740000000000000000000000000000000000089 :102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 @@ -21119,31 +21119,31 @@ :102780000000000000000000000000000000000049 :102790000000000000000000000000000000000039 :1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C00000000000200000000000000000002000C9 -:1027D0002000200020000000000000000000000099 -:1027E00000000000200000000000000000002000A9 -:1027F0002000200020000000000000000000000079 -:1028000000000000000020000000000000000000A8 -:102810002000200020002000000000000000000038 -:102820000000000000002000000000000000000088 -:102830002000200020002000000000000000000018 -:102840000000000000020000000000000000000086 +:1027B0000000AAAAAAAA0000000000000000000071 +:1027C0000000000000002011200000414000200017 +:1027D00000000000000000000000000000000000F9 +:1027E0000000000000002000200000002000200069 +:1027F00000000000000000000000000000000000D9 +:102800000000000000000000200020000000200068 +:102810002000000000000000000000000000000098 +:102820000000000000000000200020000000200048 +:1028300020000000000000000000009000000000E8 +:102840000000000000000000000000000000000088 :102850000000000000000000000000000000000078 -:102860000000000000020000400000000000000026 -:102870000000000000000002000000000000000056 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 :102880000000000000000000000000000000000048 -:102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 -:1028B00000000000000040000000000000000000D8 -:1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000000000F8 +:102890000000000000000000000010000000000028 +:1028A0000000000000400000009000400000000018 +:1028B0000000000000000000000000000000000018 +:1028C0000000000002000000000002000200000002 +:1028D0000000000000000000000000008400000074 :1028E00000000000000000000000000000000000E8 :1028F00000000000000000000000000000000000D8 :1029000000000000000000000000000000000000C7 :1029100000000000000000000000000000000000B7 :1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 +:102930000000000000000000000002000000000095 :102940000000000000000000000000000000000087 :102950000000000000000000000000000000000077 :102960000000000000000000000000000000000067 @@ -21152,23 +21152,23 @@ :102990000000000000000000000000000000000037 :1029A0000000000000000000000000000000000027 :1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000200000005 -:1029D00000000000000000000000000000000000F7 +:1029C0000000400000004000000000000000000087 +:1029D00000000000080000000000000000000000EF :1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 :102A000000000000000000000000000000000000C6 :102A100000000000000000000000000000000000B6 :102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000000000076 +:102A300000004000000000000000000000000080D6 +:102A40000000000000000000000000000000000482 +:102A5000000000040000080000000000000000006A :102A60000000000000000000000000000000000066 :102A70000000000000000000000000000000000056 :102A80000000000000000000000000000000000046 :102A90000000000000000000000000000000000036 :102AA0000000000000000000000000000000000026 :102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 +:102AC0000002000000000000000000000000000004 :102AD00000000000000000000000000000000000F6 :102AE00000000000000000000000000000000000E6 :102AF00000000000000000000000000000000000D6 @@ -21176,41 +21176,41 @@ :102B100000000000000000000000000000000000B5 :102B200000000000000000000000000000000000A5 :102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 +:102B40000000000000000000000005000000000080 +:102B5000000000000000000000400040008800402D +:102B600000880000000000000000000000000000DD :102B70000000000000000000000000000000000055 :102B80000000000000000000000000000000000045 :102B90000000000000000000000000000000000035 :102BA0000000000000000000000000000000000025 :102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD00000000000000000000000000000000000F5 -:102BE00000000000000000000000000000000000E5 +:102BC0000000000000000000000001800000000084 +:102BD00000000000200000000000000000000000D5 +:102BE0000000018000000000000000000000000064 :102BF00000000000000000000000000000000000D5 :102C000000000000000000000000000000000000C4 :102C100000000000000000000000000000000000B4 :102C200000000000000000000000000000000000A4 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 +:102C30000000000000000000020000000000000092 +:102C400000000000000000800000000008100300E9 +:102C500000000000000000C0009000000084080098 +:102C6000000000000810210000000000000011001A :102C70000000000000000000000000000000000054 :102C80000000000000000000000000000000000044 :102C90000000000000000000000000000000000034 :102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 +:102CB0000000000000000000000080000000000094 +:102CC00000000000000000004102000000000000C1 +:102CD0000000000000000000000090000000000064 +:102CE00008000000000000020000000000000000DA +:102CF00000090000000000000000000000000000CB :102D000000000000000000000000000000000000C3 :102D100000000000000000000000000000000000B3 :102D200000000000000000000000000000000000A3 :102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D60000000000000000000000000000000000063 +:102D400090000000000000000000000000000000F3 +:102D5000000000000000000000000900000000006A +:102D60004100000421000000000005840000000074 :102D70000000000000000000000000000000000053 :102D80000000000000000000000000000000000043 :102D90000000000000000000000000000000000033 @@ -21224,7 +21224,7 @@ :102E100000000000000000000000000000000000B2 :102E200000000000000000000000000000000000A2 :102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 +:102E4000000000000000000000C0000000000000C2 :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 :102E70000000000000000000000000000000000052 @@ -21232,7 +21232,7 @@ :102E90000000000000000000000000000000000032 :102EA0000000000000000000000000000000000022 :102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 +:102EC0000000000000000000000000800000000082 :102ED00000000000000000000000000000000000F2 :102EE00000000000000000000000000000000000E2 :102EF00000000000000000000000000000000000D2 @@ -21240,24 +21240,24 @@ :102F100000000000000000000000000000000000B1 :102F200000000000000000000000000000000000A1 :102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 +:102F40000000000000000000000080000000000001 +:102F50008000800000000000000000000000000071 :102F60000000000000000000000000000000000061 :102F70000000000000000000000000000000000051 :102F80000000000000000000000000000000000041 :102F90000000000000000000000000000000000031 :102FA0000000000000000000000000000000000021 :102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 +:102FC000000000000000000000000000C000A000A1 +:102FD00082000400C00000000000000000000000AB :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 :1030000000000000000000000000000000000000C0 :1030100000000000000000000000000000000000B0 :1030200000000000000000000000000000000000A0 :103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 -:103050000000000000000000000000000000000070 +:10304000000000000000000000000000000000C0C0 +:10305000000000A000A000C0000000000000000070 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 @@ -21265,7 +21265,7 @@ :1030A0000000000000000000000000000000000020 :1030B0000000000000000000000000000000000010 :1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 +:1030D00000800000000000030080000000000000ED :1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF @@ -21273,7 +21273,7 @@ :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F :10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F +:10315000000000008002000000800000000000006D :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F :10318000000000000000000000000000000000003F @@ -21281,7 +21281,7 @@ :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF +:1031D000000000000000C00100C00040000000002E :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE @@ -21297,40 +21297,40 @@ :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E :1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE +:1032D0000000000000000000FFFF0000FFFF0000F2 +:1032E00000F00000000000000000000000000000EE :1032F00000000000000000000000000000000000CE :1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D :10333000000000000000000000000000000000008D :10334000000000000000000000000000000000007D -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D +:1033500000000000000000000000FFFF0000FFFF71 +:10336000000000F00000000000000000000000006D :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D :1033A000000000000000000000000000000000001D :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD +:1033D00000000000000000000000FFFF0000FFFFF1 +:1033E000000000040C0000000000000000000000CD :1033F00000000000000000000000000000000000CD :1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC :10342000000000000000000000000000000000009C :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C +:10345000000000000000000000000000FFFF00006E +:10346000FFFF00000000000000000000000000005E :10347000000000000000000000000000000000004C :10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C :1034A000000000000000000000000000000000001C :1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC +:1034D000000000000000000000000000000000A04C +:1034E000920000E30006000D8A00000000000000CA :1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB @@ -21338,7 +21338,7 @@ :10353000000000000000000000000000000000008B :10354000000000000000000000000000000000007B :10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B +:103560000000000000000000FF00FF00000000005D :10357000000000000000000000000000000000004B :10358000000000000000000000000000000000003B :10359000000000000000000000000000000000002B @@ -21346,7 +21346,7 @@ :1035B000000000000000000000000000000000000B :1035C00000000000000000000000000000000000FB :1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000000000DB +:1035E00000000000000000000000FF00FF000000DD :1035F00000000000000000000000000000000000CB :1036000000000000000000000000000000000000BA :1036100000000000000000000000000000000000AA @@ -21363,73 +21363,73 @@ :1036C00000000000000000000000000000000000FA :1036D00000000000000000000000000000000000EA :1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 +:1036F000000020000000000000000000000000406A +:103700000000008001000080008000000000000038 +:103710000000200000000000000000000000000089 :103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 +:103730000000000120000000000000000000000068 :103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 +:103750000000000020000000000000000000000049 :103760000000000000000000000000000000000059 -:103770000000000000000000000000000000000049 -:1037800000000000400000000000000000000000F9 +:103770000000000000000000000000000000000247 +:1037800040010000404002000040104040000000A6 :103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000000000000000000000000B8 +:1037C0000000000000000000400040000000000079 +:1037D00000000000000000000000000000400000A9 +:1037E0000000000000004000000000000000000099 +:1037F0000000000000000000024000000000000087 +:103800000000900090000200020002000240000050 :1038100000000000000000000000000000000000A8 :103820000000000000000000000000000000000098 :103830000000000000000000000000000000000088 :103840000000000000000000000000000000000078 :103850000000000000000000000000000000000068 :103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 +:10387000000000000000000000080001000000003F +:1038800000000000000000000000000080000001B7 +:103890000000000000000000000800000000000020 +:1038A0000000000000000000000000000400000014 +:1038B0000000000000000000000000080000000000 +:1038C0000084000000000000000000000000000074 +:1038D00000000000000000000000000800000000E0 :1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 +:1038F00000100000000000000000000000000000B8 +:1039000000000000C0000000880088000000008067 +:1039100001000000000000000000000000000000A6 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 :103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 +:10395000000000080000000000000000000000005F :103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 +:1039800000000000000000000000410000000000F6 +:103990000004200000000000000000000000000003 :1039A0000000000000000000000000000000000017 :1039B0000000000000000000000000000000000007 :1039C00000000000000000000000000000000000F7 :1039D00000000000000000000000000000000000E7 :1039E00000000000000000000000000000000000D7 :1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 +:103A000000040000C00000000000000000000040B2 +:103A10000040000000000000000000000000000066 :103A20000000000000000000000000000000000096 :103A30000000000000000000000000000000000086 :103A40000000000000000000000000000000000076 :103A50000000000000000000000000000000000066 :103A60000000000000000000000000000000000056 :103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 +:103A80000000000000000000000000000010001016 +:103A90000001000100000000000000000000000024 :103AA0000000000000000000000000000000000016 :103AB0000000000000000000000000000000000006 :103AC00000000000000000000000000000000000F6 :103AD00000000000000000000000000000000000E6 :103AE00000000000000000000000000000000000D6 :103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 +:103B0000000090008400880000000000000088038E +:103B10000000011100090004000000000000000086 :103B20000000000000000000000000000000000095 :103B30000000000000000000000000000000000085 :103B40000000000000000000000000000000000075 @@ -21437,16 +21437,16 @@ :103B60000000000000000000000000000000000055 :103B70000000000000000000000000000000000045 :103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000000000015 +:103B90000000000020000000000100000000000004 +:103BA000000000000000000000000008000000000D :103BB0000000000000000000000000000000000005 :103BC00000000000000000000000000000000000F5 :103BD00000000000000000000000000000000000E5 :103BE00000000000000000000000000000000000D5 :103BF00000000000000000000000000000000000C5 :103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C20000000000000000000000000000000000094 +:103C10000000900000000000000000000000000014 +:103C2000000000090000000000000000000000008B :103C30000000000000000000000000000000000084 :103C40000000000000000000000000000000000074 :103C50000000000000000000000000000000000064 @@ -21454,14 +21454,14 @@ :103C70000000000000000000000000000000000044 :103C80000000000000000000000000000000000034 :103C90000000000000000000000000000000000024 -:103CA0000000000000000000000000000000000014 +:103CA00009000000000011000000000000000000FA :103CB0000000000000000000000000000000000004 :103CC00000000000000000000000000000000000F4 :103CD00000000000000000000000000000000000E4 :103CE00000000000000000000000000000000000D4 :103CF00000000000000000000000000000000000C4 :103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 +:103D1000000000C000C00020900211C00090009080 :103D20000000000000000000000000000000000093 :103D30000000000000000000000000000000000083 :103D40000000000000000000000000000000000073 @@ -21469,88 +21469,88 @@ :103D60000000000000000000000000000000000053 :103D70000000000000000000000000000000000043 :103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000000000000013 +:103D9000000000000380008000000080918000800F +:103DA000050000000000000000000000000000000E :103DB0000000000000000000000000000000000003 :103DC00000000000000000000000000000000000F3 :103DD00000000000000000000000000000000000E3 :103DE00000000000000000000000000000000000D3 :103DF00000000000000000000000000000000000C3 :103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 +:103E100000000000000080008080801000800041D1 +:103E20008021800980800000000000000000000068 :103E30000000000000000000000000000000000082 :103E40000000000000000000000000000000000072 :103E50000000000000000000000000000000000062 :103E60000000000000000000000000000000000052 :103E70000000000000000000000000000000000042 :103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 +:103E90000000000000000000100040C0100088C0BA +:103EA000900182000800C0900000000000000000A7 :103EB0000000000000000000000000000000000002 :103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 +:103ED00000010000000000000000000000000000E1 :103EE00000000000000000000000000000000000D2 :103EF00000000000000000000000000000000000C2 :103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 +:103F10000000000000000000000003880090C08442 +:103F2000008205C0A088009082C000000000000050 :103F30000000000000000000000000000000000081 :103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 +:103F50000000000100000000000000000000000060 :103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 +:103F9000000000000000000000000000C100000060 +:103FA00080802000100000000080C0800000000021 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 +:103FD00000000000000100000000000000000000E0 :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 +:104010000000000000000000000000000000800020 +:10402000802080808000801100118000000000004E :104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 +:10405000000000000000000100000000000000005F :104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 :104080000000000000000000000000000000000030 :104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 +:1040A000C000C001C020C000C0010401400488005D :1040B0000000000000000000000000000000000000 :1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 +:1040D00000000000000000000001000000000000DF :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 :1041000000000000000000000000000000000000AF :10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F +:104120000000000000008200484200060041070035 +:1041300081000000000000000000000000000000FE :10414000000000000000000000000000000000006F :10415000000000000000000000000000000000005F :10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F :10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF +:1041A000000000000000000000000000FF00F0F030 +:1041B000B4B4FF0000000000000000000000000098 :1041C00000000000000000000000000000000000EF :1041D00000000000000000000000000000000000DF :1041E00000000000000000000000000000000000CF :1041F00000000000000000000000000000000000BF :1042000000000000000000000000000000000000AE :10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E +:1042200000000000000000000000000000003C3C16 +:10423000F0F0B4B4FF000000000000000000000037 :10424000000000000000000000000000000000006E :10425000000000000000000000000000000000005E :10426000000000000000000000000000000000004E :10427000000000000000000000000000000000003E :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E +:1042A00000000000000000004008400000842000E2 :1042B00000000000000000000000000000000000FE :1042C00000000000000000000000000000000000EE :1042D00000000000000000000000000000000000DE @@ -21558,24 +21558,24 @@ :1042F00000000000000000000000000000000000BE :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D +:10432000000000000000FFFFFFFF00000000000091 +:10433000000000FF6F6F0F0F3CFF00000000000047 :10434000000000000000000000000000000000006D :10435000000000000000000000000000000000005D :10436000000000000000000000000000000000004D :10437000000000000000000000000000000000003D :10438000000000000000000000000000000000002D :10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD +:1043A0000000000000000000FFFFFFFF0000000011 +:1043B0000000000000FF09090F0F3C000000000092 :1043C00000000000000000000000000000000000ED :1043D00000000000000000000000000000000000DD :1043E00000000000000000000000000000000000CD :1043F00000000000000000000000000000000000BD :1044000000000000000000000000000000000000AC :10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C +:104420000000000000000000000000001006300046 +:1044300000000000080010612037004D0008000057 :10444000000000000000000000000000000000006C :10445000000000000000000000000000000000005C :10446000000000000000000000000000000000004C @@ -21615,232 +21615,232 @@ :10468000000000000000000000000000000000002A :10469000000000000000000000000000000000001A :1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000200000020000C8 +:1046B000000000000080008000800080000000807A +:1046C00000800080000000000000000000000000EA :1046D00000000000000000000000000000000000DA :1046E00000000000000000000000000000000000CA -:1046F00000020000000000000000000000000000B8 +:1046F00000010000000000000000000000000000B9 :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000100000000000000000000000000049 +:1047300000000000000000202020002000200000D9 +:104740000020002000200000000000000000000009 +:104750000000000000000000000000000000000059 :104760000000000000000000000000000000000049 :104770000000000000000000000000000000000039 -:104780000002000000000000000000000000000027 -:104790000000000000000000000000000000000019 -:1047A00040020000000000000000000000000000C7 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 +:104780000000000000000000000000000000000029 +:104790004000000000004040000000400000000019 +:1047A0000000000200000002000000000000000005 +:1047B00000000000000000009000900000000000D9 +:1047C00000000000000002000000000000000000E7 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 :1047F00000000000000000000000000000000000B9 :1048000000000000000000000000000000000000A8 :104810000000000000000000000000000000000098 -:104820000000000001000000000000000000000087 -:104830000000000000000000000000000000000078 +:104820000000000000000000000000000000000088 +:104830000000000002000000000000000000000076 :104840000000000000000000000000000000000068 :104850000000000000000000000000000000000058 :104860000000000000000000000000000000000048 :104870000000000000000000000000000000000038 -:10488000000000000000000000000900000000001F +:104880000000000000000000000000000000000028 :104890000000000000000000000000000000000018 -:1048A00000000000000040000000000000000000C8 -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 +:1048A0000000000000000000000000000000000008 +:1048B000000000000000000000000000C0800100B7 +:1048C0000400000000000000040004800400000058 :1048D00000000000000000000000000000000000D8 :1048E00000000000000000000000000000000000C8 :1048F00000000000000000000000000000000000B8 :1049000000000000000000000000000000000000A7 :104910000000000000000000000000000000000097 -:104920000000000000000000002100000005002041 -:1049300000200020000000200020000000000000F7 -:104940000000000000000000000000000000000067 +:104920000000000000000000000010000400000073 +:104930000000000000000000000000000000412016 +:104940000400800000000000000080008020800043 :104950000000000000000000000000000000000057 :104960000000000000000000000000000000000047 :104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 :104990000000000000000000000000000000000017 :1049A0000000000000000000000000000000000007 -:1049B00000010001000100000001000100000000F2 +:1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 :1049D00000000000000000000000000000000000D7 :1049E00000000000000000000000000000000000C7 :1049F00000000000000000000000000000000000B7 -:104A0000A000000000000000000000000000040002 -:104A10008200040004000400A00000000400040060 -:104A20008200000000000000000000000002000002 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 :104A30000000000000000000000000000000000076 :104A40000000000000000000000000000000000066 :104A50000000000000000000000000000000000056 :104A60000000000000000000000000000000000046 :104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 -:104A90008000000080008000800000000000800096 -:104AA0008000000000000000000000000000000185 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000006 :104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 +:104AC00000000100000000000100008001000080E3 +:104AD00001800100008001000000000000000000D3 :104AE00000000000000000000000000000000000C6 :104AF00000000000000000000000000000000000B6 :104B000000000000000000000000000000000000A5 -:104B1000000000008200000000000000040000000F -:104B200000000000820000000000000000000020E3 -:104B300000200000820000000000000000000000D3 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000004000000000004000320040036 +:104B500000200420040000200400000000000000E9 :104B60000000000000000000000000000000000045 :104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000800095 +:104B90000000000000000000000000000000000015 :104BA0000000000000000000000000000000000005 -:104BB00000010001000000000000000000000000F3 -:104BC00000000000000000000000000000000000E5 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000C020000000000000A000000065 :104BD00000000000000000000000000000000000D5 :104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000800AD +:104BF00000000000000000000000000000000000B5 :104C000000000000000000000000000000000000A4 -:104C10000000000000000000040000000000000090 -:104C2000000004000000010040000000000000211E -:104C30000020000000000120002000000000000013 -:104C40000020000000000000000000000000000044 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C40000000000000000001000000000000000063 :104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 +:104C60000000110011000000000000000000000022 :104C70000000000000000000000000000000000034 :104C80000000000000000000000000000000000024 -:104C90000000000000000000000080000000000094 -:104CA0000000000080000000040080000000000000 -:104CB00000000001000000000401000100000000ED -:104CC00000000001000000000000000000000000E3 -:104CD00000000000000000000000000000000000D4 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000000F4 +:104CC000000000000000000000C000900000000094 +:104CD00000C000900000000000C000900000000034 :104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 :104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000C00090000043 -:104D2000000000C000900000000000C09090400013 -:104D3000000100C000900200000000C000900000D0 -:104D4000000000C000900000000000000000000013 -:104D50000000000000000000000000000000000053 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000003800080000060 +:104D50000000058000800000000005800080000049 :104D60000000000000000000000000000000000043 :104D70000000000000000000000000000000000033 :104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000080008013 -:104DA000000000000380008000000000008380916C -:104DB00000000021038009800000000000800080C6 -:104DC00000000000038000800000000000000000E0 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000003 +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00080008080000000008000808000000000D3 +:104DE0008000808000000000000000000000000043 :104DF00000000000000000000000000000000000B3 :104E000000000000000000000000000000000000A2 :104E10000000000000000000000000000000000092 -:104E20000000800080800000000080008080400042 -:104E3000090083008291090005008000C080000005 -:104E40000000800080800000000080008080000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 +:104E20000000000000000000000000000000000082 +:104E30000000000000000000000000000000000072 +:104E40000000000000000000000000000000000062 +:104E500000008400C090000000008400C0900000AA +:104E600000008400C090000000000000000000006E :104E70000000000000000000000000000000000032 :104E80000000000000000000000000000000000022 :104E90000000000000000000000000000000000012 -:104EA000000000008400C090000000008400C0905A -:104EB000000200008500C091000000008400C09046 -:104EC000000000008400C090000000008400C0903A -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000000000000000000F2 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000009000C000000000009000C032 +:104EE00000000000009000C0000000000000000072 :104EF00000000000000000000000000000000000B2 :104F000000000000000000000000000000000000A1 :104F10000000000000000000000000000000000091 -:104F2000000000000000009000C0000000000090A1 -:104F300000C000000100019100C0000000000091CD -:104F400000C000000000009000C0000000000090C1 -:104F500000C0000000000000000000000000000091 -:104F60000000000000000000000000000000000041 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F40000000000000000000000000000000000061 +:104F500000000000000000800080000000000080D1 +:104F600000800000000000800080000000000000C1 :104F70000000000000000000000000000000000031 :104F80000000000000000000000000000000000021 :104F90000000000000000000000000000000000011 -:104FA0000000000000000000008000800000000001 -:104FB000008000800009030211A14082004000210E -:104FC00000A10080000000000080008000000000C0 -:104FD00000800080000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000000000000000000000F1 +:104FC00000000000000000000000000000000000E1 +:104FD000000000008011801000000000801180108F +:104FE00000000000801180100000000000000000A0 :104FF00000000000000000000000000000000000B1 :1050000000000000000000000000000000000000A0 :105010000000000000000000000000000000000090 -:10502000000000000000804000000000000080112F -:10503000800000000000A140000005001100801168 -:10504000800000000040804000000000000080114F -:1050500080000000000000000000000000000000D0 -:105060000000000000000000000000000000000040 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000000000070 +:105040000000000000000000000000000000000060 +:10505000000000000000C001200100000000C001AD +:10506000200100000000C00120010000000000003D :105070000000000000000000000000000000000030 :105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 -:1050A0000000000000000000900000000000000070 -:1050B000C001200000000000C100000000009000BE -:1050C000C041200000000000C0000000000090006F -:1050D000C0012000000000000000000000000000EF -:1050E00000000000000000000000000000000000C0 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000000000E0 +:1050D0000000000000000000004100000700000088 +:1050E0000041000007000000004100000700000030 :1050F00000000000000000000000000000000000B0 :10510000000000000000000000000000000000009F :10511000000000000000000000000000000000008F -:1051200000000000000000000000008100000700F7 -:10513000000000410000070000000081000007009F -:10514000000000410000070000000081000007008F -:105150000000004100000700000000000000000007 -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000000000000000000005F +:1051500000000000000000000000000000FF000050 +:1051600000FF000000FF000000FF000000FF000043 +:1051700000FF000000000000000000000000000030 :10518000000000000000000000000000000000001F :10519000000000000000000000000000000000000F -:1051A0000000000000000000000000000000FFFF01 -:1051B000000000FF000000FF000000FF00003C3C7A -:1051C000000000FF000000FF000000FF00003C3C6A -:1051D000000000FF000000FF000000FF00000000D2 -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000000000000000000DF +:1051D000000000000000000000000000000000FFD0 +:1051E000000000FF000000FF000000FF000000FFC3 +:1051F000000000FF000000000000000000000000B0 :10520000000000000000000000000000000000009E :10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E -:10523000FFFF000000FF000000FF000000FF000073 -:105240003C3C000000FF000000FF000000FF0000E9 -:105250003C3C000000FF000000FF000000FF0000D9 -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E +:10523000000000000000000000000000000000006E +:10524000000000000000000000000000000000005E +:105250000000000000000000000000000000FF004F +:105260000000FF000000FF000000FF000000FF0042 +:105270000000FF000000000000000000000000002F :10528000000000000000000000000000000000001E :10529000000000000000000000000000000000000E :1052A00000000000000000000000000000000000FE -:1052B000FF000000FF000000FF000000FF000000F2 -:1052C000FF000000FF000000FF000000FF000000E2 -:1052D000FF000000FF000000FF00000000FFFFFFD4 -:1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E000FF000000FF000000FF000000FF000000C2 +:1052F000FF000000FF0000000000000000000000B0 :10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D :10532000000000000000000000000000000000007D -:105330000000FF000000FF000000FF000000FF0071 -:105340000000FF000000FF000000FF000000FF0061 -:105350000000FF000000FF000000FF00000000FF51 -:10536000FFFF00000000000000000000000000003F -:10537000000000000000000000000000000000002D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:105360000000038203380C0092C0038203380C0053 +:1053700092C0038203380C008AC0000000000000C5 :10538000000000000000000000000000000000001D :10539000000000000000000000000000000000000D :1053A00000000000000000000000000000000000FD -:1053B00000000000030203300C0092C0038203309F -:1053C0000C0092C003E303360C0D92C003E30336D6 -:1053D0000C0D92C0038203300C0092C00382033094 -:1053E0000C0082C00000000000000000000000006F +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD :1053F00000000000000000000000000000000000AD :10540000000000000000000000000000000000009C :10541000000000000000000000000000000000008C :10542000000000000000000000000000000000007C :10543000000000000000000000000000000000006C -:105440000000000000000404000000000020000034 -:10545000000000200020000000000000000000000C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C :10547000000000000000000000000000000000002C :10548000000000000000000000000000000000001C :10549000000000000000000000000000000000000C :1054A00000000000000000000000000000000000FC :1054B00000000000000000000000000000000000EC -:1054C00000000000000000000000000000000020BC +:1054C00000000000000000000000000000000000DC :1054D00000000000000000000000000000000000CC :1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC @@ -21848,8 +21848,8 @@ :10551000000000000000000000000000000000008B :10552000000000000000000000000000000000007B :10553000000000000000000000000000000000006B -:105540000000000000000000000014000000000047 -:1055500000300000000000002020000000000000DB +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B :10556000000000000000000000000000000000003B :10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B @@ -21857,26 +21857,26 @@ :1055A00000000000000000000000000000000000FB :1055B00000000000000000000000000000000000EB :1055C00000000000000000000000000000000000DB -:1055D000000000300000000000000000000000009B -:1055E00000000000000000000000000001000000BA -:1055F000000000800000000000000000000000002B +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000000000000000000000BB +:1055F000000000000000000000000000000020008B :10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A +:10561000000000000000000000000000000020006A :10562000000000000000000000000000000000007A :10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A +:10564000200000000000000000000000000000003A :10565000000000000000000000000000000000004A -:105660000000000000000000000000000000080032 -:10567000000000000010000000000000000000001A -:10568000000000000000000000000000000000001A +:1056600020000000000000000000000000004000DA +:1056700000000000000040000000000000000000EA +:105680000000000200000000000000000002000016 :10569000000000000000000000000000000000000A :1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 +:1056B000000040004000000000000000000000006A +:1056C000000000000000000040000000000000009A +:1056D000400000000000004000400000000000000A +:1056E00000904000000000000000000000000000EA +:1056F00002000200020002000000000000000200A0 +:105700008200000000000000020002000000020011 :105710000000000000000000000000000000000089 :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 @@ -21884,13 +21884,13 @@ :105750000000000000000000000000000000000049 :105760000000000000000000000000000000000039 :105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 +:105780000000000000000000000000080000000011 :105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 +:1057A00000000000000000000000000800000000F1 :1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 +:1057C00000000000000000000000000000080000D1 +:1057D0000000000000000000000000004000400049 +:1057E00000000000000000000000000000080000B1 :1057F00000000000000000000000000000000000A9 :105800000000000000000000000000000000000098 :105810000000000000000000000000000000000088 @@ -21907,16 +21907,16 @@ :1058C00000000000000000000000000000000000D8 :1058D00000000000000000000000000000000000C8 :1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 +:1058F0000000000000000000000000040000001094 :105900000000000000000000000000000000000097 :105910000000000000000000000000000000000087 :105920000000000000000000000000000000000077 -:105930000000000000000000000000000000000067 +:105930000000000000000000000000000000002047 :105940000000000000000000000000000000000057 :105950000000000000000000000000000000000047 :105960000000000000000000000000000000000037 :105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 +:105980000000000000000000000000000004000013 :105990000000000000000000000000000000000007 :1059A00000000000000000000000000000000000F7 :1059B00000000000000000000000000000000000E7 @@ -21932,29 +21932,29 @@ :105A50000000000000000000000000000000000046 :105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 +:105A800021000000000000002100000000000000D4 +:105A900021000000000000000000000000000000E5 :105AA00000000000000000000000000000000000F6 :105AB00000000000000000000000000000000000E6 :105AC00000000000000000000000000000000000D6 :105AD00000000000000000000000000000000000C6 -:105AE0000000000000000000000000000000210095 -:105AF0000000000000000000000000000000210085 -:105B00000000000000000000000000000000000095 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000A000000000000000A0000000000055 :105B10000000000000000000000000000000000085 :105B20000000000000000000000000000000000075 :105B30000000000000000000000000000000000065 :105B40000000000000000000000000000000000055 :105B50000000000000000000000000000000000045 -:105B600000000000000000009000000000000000A5 -:105B70000000000000000000900000000000000095 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 +:105B900000000000000000000000000011001100E3 :105BA00000000000000000000000000000000000F5 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE00000000000000000000000000000000000B5 +:105BD00000000000000000000000050000000000C0 +:105BE00000000000000000000000050000000000B0 :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 :105C10000000000000000000000000000000000084 @@ -21972,7 +21972,7 @@ :105CD00000000000000000000000000000000000C4 :105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000080000000000013 +:105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 :105D20000000000000000000000000000000000073 :105D30000000000000000000000000000000000063 @@ -21980,7 +21980,7 @@ :105D50000000000000000000000000000000000043 :105D60000000000000000000000000000000000033 :105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000200000011 +:105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 :105DA00000000000000000000000000000000000F3 :105DB00000000000000000000000000000000000E3 @@ -22013,7 +22013,7 @@ :105F60000000000000000000000000000000000031 :105F70000000000000000000000000000000000021 :105F80000000000000000000000000000000000011 -:105F900000000000000000004000000000000000C1 +:105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 :105FB00000000000000000000000000000000000E1 :105FC00000000000000000000000000000000000D1 @@ -22029,7 +22029,7 @@ :106060000000000000000000000000000000000030 :106070000000000000000000000000000000000020 :106080000000000000000000000000000000000010 -:10609000000000000000C3C3C3C3000000000000F4 +:106090000000000000000000000000000000000000 :1060A00000000000000000000000000000000000F0 :1060B00000000000000000000000000000000000E0 :1060C00000000000000000000000000000000000D0 @@ -22037,7 +22037,7 @@ :1060E00000000000000000000000000000000000B0 :1060F00000000000000000000000000000000000A0 :10610000000000000000000000000000000000008F -:106110000000000000000000C3C3C3C30000000073 +:10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F :10614000000000000000000000000000000000004F @@ -22054,7 +22054,7 @@ :1061F000000000000000000000000000000000009F :10620000000000000000000000000000000000008E :10621000000000000000000000000000000000007E -:10622000F0F0F0F0000000000000000000000000AE +:10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E :10624000000000000000000000000000000000004E :10625000000000000000000000000000000000003E @@ -22062,7 +22062,7 @@ :10627000000000000000000000000000000000001E :10628000000000000000000000000000000000000E :1062900000000000000000000000000000000000FE -:1062A0000000F0F0F0F0000000000000000000002E +:1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE :1062C00000000000000000000000000000000000CE :1062D00000000000000000000000000000000000BE @@ -22111,83 +22111,83 @@ :10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB :1065A00000000000000000000000000020000000CB -:1065B00000000000000020000000000000000000BB -:1065C000000000002000000000000000200000008B -:1065D000000000000000200000000000000000009B -:1065E0000000000020000000000000020000200069 -:1065F000000000000000000020000000000000007B -:10660000000000000000200000000000000020004A -:10661000000000000000000020000000000000005A -:10662000000000000000200000000000000000004A -:106630000000000000000000000400000000000056 +:1065B00000000000200000000000000000000000BB +:1065C000000000000000000000004000200000006B +:1065D000000000002000000000000000000000009B +:1065E0000000000000000000000000030000200088 +:1065F000000000000000200000000000000000007B +:1066000000000000010000000000008000002000E9 +:10661000000000000000200000000000000000005A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A -:1066500000000000000000000040000000000000FA -:106660000000000000000000000000020000000028 -:10667000000000000000000000000000000000001A -:1066800000000000000000000000400000000000CA +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:1066700000000000000000000000210000000000F9 +:106680002100210000001000000000000008400070 :1066900000000000000000000000000000000000FA :1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA +:1066B00000000000000000000009000000000000D1 :1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA +:1066D00002000000000000000000000000000000B8 :1066E00000000000000000000000000000000000AA :1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 +:106700000000000000000000000010000100000078 :106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 +:106720000000000000000000000000000000020067 :106730000000000000000000000000000000000059 :106740000000000000000000000000000000000049 -:106750000000000000000000000000000000000039 +:1067500040000000000000000000000000000000F9 :106760000000000000000000000000000000000029 -:106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 -:1067900000000000040000000000000000000000F5 -:1067A00000000000000000000000000000000000E9 +:1067700000002000000000000000000000000000F9 +:106780000000000000000000000000008000100079 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000004000A9 :1067B00000000000000000000000000000000000D9 :1067C00000000000000000000000000000000000C9 :1067D00000000000000000000000000000000000B9 :1067E00000000000000000000000000000000000A9 :1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 +:106800000000010000000000000000000000000087 +:106810000000010000000000000000000000000077 :106820000000000000000000000000000000000068 :106830000000000000000000000000000000000058 :106840000000000000000000000000000000000048 :106850000000000000000000000000000000000038 :106860000000000000000000000000000000000028 :106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 +:1068800000000000200000000000000000000000E8 +:1068900000000000200000000000000000000000D8 :1068A00000000000000000000000000000000000E8 :1068B00000000000000000000000000000000000D8 -:1068C00000000000000000000000000000000000C8 +:1068C0000041000000000040000000000000000047 :1068D00000000000000000000000000000000000B8 :1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000A000000000000000000000000000C7 -:106930000000000000000100000000000000000056 -:106940000000000000000000000000000000000047 +:1068F0000000000001000000000000000000000097 +:1069000010000000C10000000000000000000000B6 +:106910000100000000800180000000000000000075 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000400000000007 :106950000000000000000000000000000000000037 :106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 -:106980000000000000000000000000000000000007 -:1069900000000000000000000000000004000000F3 +:106970000000000000000400000000000000000013 +:106980000000800000002000000000000000000067 +:1069900000000200000000200220000000000000B3 :1069A00000000000000000000000000000000000E7 -:1069B00000000000000000000400000000000000D3 +:1069B00000000000000000000000000000000000D7 :1069C00000000000000000000000000000000000C7 :1069D00000000000000000000000000000000000B7 :1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000000086 -:106A10000000000000000000000000000000000076 +:1069F0000000020000000020000000000000000075 +:106A00000000C000000000000000000020000000A6 +:106A100090000000000000000000000000000000E6 :106A20000000000000000000000000000000000066 -:106A30000000A000000000000000000000000000B6 +:106A30000000000000000000000000000000000056 :106A40000000000000000000000000000000000046 :106A50000000000000000000000000000000000036 :106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 +:106A70000000000080000000000100000000000095 :106A80000000000000000000000000000000000006 :106A900000000000000000000000000000000000F6 :106AA00000000000000000000000000000000000E6 @@ -22197,119 +22197,119 @@ :106AE00000000000000000000000000000000000A6 :106AF0000000000000000000000000000000000096 :106B00000000000000000000000000000000000085 -:106B10000000000000000000000000000000000075 -:106B20000000040000000000000000000000200041 +:106B1000000000000009000000000000000000006C +:106B2000000000000009000000000000000000005C :106B30000000000000000000000000000000000055 -:106B40000000000000000000000000000000000045 -:106B50000000000000000000000000000000000035 +:106B40000000000000000000000002000000000043 +:106B50000000000000000000110011000000000013 :106B60000000000000000000000000000000000025 :106B70000000000000000000000000000000000015 :106B80000000000000000000000000000000000005 :106B900000000000000000000000000000000000F5 :106BA00000000000000000000000000000000000E5 :106BB00000000000000000000000000000000000D5 -:106BC00004000000000000000000000000000000C1 +:106BC00000000000000000000000000000000000C5 :106BD00000000000000000000000000000000000B5 :106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 +:106BF0000000000000000000000000009000000005 +:106C00000020000000000000000000000100000063 +:106C100000000000000000000000000001009000E3 :106C20000000000000000000000000000000000064 :106C30000000000000000000000000000000000054 :106C40000000000000000000000000000000000044 :106C50000000000000000000000000000000000034 :106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 +:106C70000000000000000000000000001100800083 +:106C800000000000000000000000000000001100F3 +:106C900021000000000000000000000000001100C2 +:106CA0008021000000000000000000000000000043 :106CB00000000000000000000000000000000000D4 :106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 :106CE00000000000000000000000000000000000A4 :106CF0000000000000000000000000000000000094 -:106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 +:106D00000080000000800000000000000000000083 +:106D100000410900000900800000000000000000A0 +:106D20000040008011400000000000000000000052 :106D30000000000000000000000000000000000053 :106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 :106D60000000000000000000000000000000000023 :106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 +:106D800000000020000000C0000000000000000023 +:106D90000000000101000000008800000000000069 +:106DA0000000000000020100008800000000000058 :106DB00000000000000000000000000000000000D3 -:106DC000000000000000000000880000000000003B +:106DC00000000000000000000000000000000000C3 :106DD00000000000000000000000000000000000B3 :106DE00000000000000000000000000000000000A3 :106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 +:106E00000000010000888800010000000000000070 +:106E100000000000000088000000010000000000E9 +:106E20000000000021009088020001000000000026 :106E30000000000000000000000000000000000052 :106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 :106E60000000000000000000000000000000000022 :106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 +:106E80000000000041000080000009000000000038 +:106E900000000000000000000000000041000000B1 +:106EA0000000000000004100008080090800000090 :106EB00000000000000000000000000000000000D2 :106EC00000000000000000000000000000000000C2 :106ED00000000000000000000000000000000000B2 :106EE00000000000000000000000000000000000A2 :106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 +:106F000000000000000000110000008000000000F0 +:106F1000000000000000000000202111000000001F +:106F200000000000000000000011110000800000BF :106F30000000000000000000000000000000000051 -:106F400000000000000000000040000300000000FE +:106F40000000000000000000000000000000000041 :106F50000000000000000000000000000000000031 :106F60000000000000000000000000000000000021 :106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 +:106F800000000000000000000001000000400000C0 +:106F900000000000000000000000000000010000F0 +:106FA000000000000000000000000001010000409F :106FB00000000000000000000000000000000000D1 :106FC00000000000000000000000000000000000C1 :106FD00000000000000000000000000000000000B1 :106FE00000000000000000000000000000000000A1 :106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:1070400000000000000000000000000000810000BF -:107050000700000000000000000000000000000029 +:107000000000000000000000000000000000070079 +:10701000822100000000000000000000000000E0ED +:10702000000081410000000000000000000000E0BE +:1070300007008200000000000000000000000000C7 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 :107060000000000000000000000000000000000020 :107070000000000000000000000000000000000010 :107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 +:10709000F0F0000000000000000000000000000010 :1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 +:1070B0000000F0F0000000000000000000000000F0 :1070C00000000000000000000000000000000000C0 :1070D00000000000000000000000000000000000B0 :1070E00000000000000000000000000000000000A0 :1070F0000000000000000000000000000000000090 :10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F +:107110000000F0F00000000000000000000000008F :10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F +:1071300000000000F0F0000000000000000000006F :10714000000000000000000000000000000000003F :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F :10717000000000000000000000000000000000000F :1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF +:1071900000003C3C0000FFFF000000000000000079 :1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF +:1071B00000000000FFFF0000FFFF000000000000D3 :1071C00000000000000000000000000000000000BF :1071D00000000000000000000000000000000000AF :1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F :10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E +:10721000000000003C3C00000000000000000000F6 :10722000000000000000000000000000000000005E :10723000000000000000000000000000000000004E :10724000000000000000000000000000000000003E @@ -22317,25 +22317,25 @@ :10726000000000000000000000000000000000001E :10727000000000000000000000000000000000000E :1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE +:107290000000000005002A00054000A800000000D2 +:1072A00000000000000000400006000C000000008C +:1072B00000000000000005002A06054C00A80000A0 :1072C00000000000000000000000000000000000BE -:1072D00000000000000000000038000001A00000D5 +:1072D00000000000000000000000000000000000AE :1072E000000000000000000000000000000000009E :1072F000000000000000000000000000000000008E :10730000000000000000000000000000000000007D :10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D +:1073200000000000000000000000FF00FFFF000060 +:1073300000000000000000000000FF0000FF00004F :10734000000000000000000000000000000000003D :10735000000000000000000000000000000000002D :10736000000000000000000000000000000000001D :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD +:1073A000000000000000000000000000FF000000DE +:1073B000000000000000000000000000FF0000FFCF :1073C00000000000000000000000000000000000BD :1073D00000000000000000000000000000000000AD :1073E000000000000000000000000000000000009D @@ -22343,44 +22343,44 @@ :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C :10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C +:10743000F0F0000000000000000000000000FF006D +:1074400000FF00000000000000000000000000003D :10745000000000000000000000000000000000002C :10746000000000000000000000000000000000001C :10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC :1074900000000000000000000000000000000000EC :1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC +:1074B0000000F0F0000000000000000000000000EC +:1074C000FF0000FF000000000000000000000000BE :1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C -:10750000000000000000000000000000000000007B -:10751000000000000000000000000000000000006B -:107520000000000000000002000000000000000059 -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:107560000000100000000400000000000000000007 -:10757000000000000000000000000000000000000B +:1074E00000000000000020000000000082000000FA +:1074F000000000002000000000000000400000002C +:1075000020000000000020008800000000000000B3 +:10751000400000002000000000000000000000000B +:1075200020000000000000022000000000004000D9 +:1075300040000000000020000000000000000000EB +:1075400000002000000000002000000000002000DB +:10755000200040000000200000000000000040006B +:1075600004002000000000000000000000000000F7 +:107570000000000200000000000000000002000007 :1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB +:10759000000000000000000000004000400000006B :1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB +:1075B000000040000000000000004000000000004B +:1075C00000004100410000000000000040000000F9 :1075D00000000000000000000000000000000000AB -:1075E000000000008000000080000000400000005B -:1075F000000000000000000000000000000000008B +:1075E0000000000000000000000000000200000099 +:1075F000004100000000000000000000000000004A :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A :10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A +:107630000041000000000000000000000000000009 :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA +:1076700000004100000011880000024000000000EE +:1076800000400000000000000000000000000000BA :1076900000000000000000000000000000000000EA :1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA @@ -22394,144 +22394,144 @@ :107730000000000000000000000000000000000049 :107740000000000000000000000000000000000039 :107750000000000000000000000000000000000029 -:107760000000000000000000000000000000000019 +:107760000000900000000000000000000000000089 :107770000000000000000000000000000000000009 :1077800000000000000000000000000000000000F9 :1077900000000000000000000000000000000000E9 -:1077A00000000000000000000000000000000000D9 -:1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 +:1077A00000000000000008000000000000000000D1 +:1077B00000000000080000000000000000000000C1 +:1077C000000003000000000000C0000000000000F6 :1077D00000000000000000000000000000000000A9 :1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 +:1077F0000000000000040000000000000000000085 +:107800000000000010000000000000000000000068 :107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 -:107830000000000000000000000000000000000048 +:1078300000000000A00000000000000000000000A8 :107840000000000000000000000000000000000038 -:1078500000000000000000000000000000004000E8 -:107860000000000000000000000000000000000018 -:107870009009010008001000000041000000000015 -:1078800000000000080000000000000000000000F0 -:1078900000000000000000000000000000000000E8 +:107850000000010000000000000000000000000027 +:107860000000000000000000000000000000040014 +:1078700000000000000000000000200000000800E0 +:1078800000000000000000400000000000000000B8 +:1078900000000000000000000000080010001000C0 :1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000000000000000000098 -:1078F0000000000020000000000000000000000068 +:1078B0000000000000000000000020001000100088 +:1078C00008000000000000000000000000000000B0 +:1078D000000000000400000000000500080008008F +:1078E0001000000000000000000000000000002068 +:1078F0000020000000000000000000000000000068 :107900000000000000000000000000000000000077 :107910000000000000000000000000000000000067 :107920000000000000000000000000000000000057 :107930000000000000000000000000000000000047 :107940000000000000000000000000000000000037 -:107950000000000000000000000000000000000027 +:107950000100000000200000000000000000000006 :107960000000000000000000000000000000000017 -:107970000000000000000080000000000000000087 +:107970000000000000000000000000000000000007 :1079800000000000000000000000000000000000F7 :1079900000000000000000000000000000000000E7 :1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C00000000000000000000000000000000000B7 -:1079D00000000000000000000000000000000000A7 +:1079B0000000000000000084000000000000000043 +:1079C000000000000000008400000000000000C073 +:1079D000000002840000000100840000000000009C :1079E0000000000000000000000000000000000097 -:1079F0000000000000000000002000000000000067 -:107A00000000000000000000000000000000000076 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000004036 :107A10000000000000000000000000000000000066 :107A20000000000000000000000000000000000056 -:107A30000000000000000000000000000000000046 -:107A40000000000000000000000000000000000036 -:107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 -:107A70000000000000000100000000000000000005 -:107A800000000800000000000000000000000000EE -:107A900000000000000000000000000000000000E6 -:107AA00000000000000000000000000000000000D6 +:107A30000000100000000000000000000000000036 +:107A40000000000200000000000000000000100024 +:107A50000002000000000000000000000002000022 +:107A60000000000200000000000000000000000014 +:107A70000000000000000000000000000000000006 +:107A800000000000110000C0028402000200020099 +:107A9000004002000088000000001100000000000B +:107AA00000000000000000000000100000000000C6 :107AB00000000000000000000000000000000000C6 :107AC00000000000000000000000000000000000B6 :107AD00000000000000000000000000000000000A6 :107AE0000000000000000000000000000000000096 -:107AF0000000000000000000020000000000000084 +:107AF0000000000000000000000000000000000086 :107B00000000000000000000000000000000000075 :107B10000000000000000000000000000000000065 :107B20000000000000000000000000000000000055 :107B30000000000000000000000000000000000045 :107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 +:107B50000000000000000000000090040000000091 :107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000100000004 +:107B70000000000000000000000000000000000005 :107B800000000000000000000000000000000000F5 :107B900000000000000000000000000000000000E5 :107BA00000000000000000000000000000000000D5 :107BB00000000000000000000000000000000000C5 :107BC00000000000000000000000000000000000B5 -:107BD00000000000000000000000000000000000A5 +:107BD0000000000000000000000011008080000094 :107BE0000000000000000000000000000000000095 -:107BF0000000000000000000000000000000200065 +:107BF0000000000000000000000000000000000085 :107C00000000000000000000000000000000000074 :107C10000000000000000000000000000000000064 :107C20000000000000000000000000000000000054 :107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 -:107C50000000000000000000000000000000000024 -:107C60000000000000000000000000000000000014 -:107C70000000000000000000000000000000800084 +:107C500000000000000000000000000000000080A4 +:107C60000000008000000000000000000000000094 +:107C70000000000000000000000000000000000004 :107C800000000000000000000000000000000000F4 :107C900000000000000000000000000000000000E4 :107CA00000000000000000000000000000000000D4 :107CB00000000000000000000000000000000000C4 :107CC00000000000000000000000000000000000B4 :107CD00000000000000000000000000000000000A4 -:107CE0000000000000000000000000000000000094 +:107CE0000020000000C000000000000000000000B4 :107CF0000000000000000000000000000000000084 -:107D000088000000000800000000000000000000E3 +:107D00000000000000000000000000000000000073 :107D10000000000000000000000000000000000063 :107D20000000000000000000000000000000000053 :107D30000000000000000000000000000000000043 :107D40000000000000000000000000000000000033 :107D50000000000000000000000000000000000023 -:107D60000000000000000000000000000000000013 +:107D60000100008888000100000000000000000001 :107D70000000000000000000000000000000000003 -:107D800000000000000100000000000000000000F2 +:107D800000000000000000000000000000000000F3 :107D900000000000000000000000000000000000E3 :107DA00000000000000000000000000000000000D3 :107DB00000000000000000000000000000000000C3 :107DC00000000000000000000000000000000000B3 :107DD00000000000000000000000000000000000A3 -:107DE0000000000000000000000000000000000093 +:107DE00000004100008000000900000000000000C9 :107DF0000000000000000000000000000000000083 -:107E00000000000000000008090000000000000061 +:107E00000000000000000000000000000000000072 :107E10000000000000000000000000000000000062 :107E20000000000000000000000000000000000052 :107E30000000000000000000000000000000000042 :107E40000000000000000000000000000000000032 :107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 +:107E60000000000000110000008000000000000081 :107E70000000000000000000000000000000000002 -:107E80000000000000400020000000000000000092 +:107E800000000000000000000000000000000000F2 :107E900000000000000000000000000000000000E2 :107EA00000000000000000000000000000000000D2 :107EB00000000000000000000000000000000000C2 :107EC00000000000000000000000000000000000B2 :107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000000000000000092 +:107EE0000000000000000001000000400000000051 :107EF0000000000000000000000000000000000082 -:107F00000000000000000000000100000000000070 +:107F00000000000000000000000000000000000071 :107F10000000000000000000000000000000000061 :107F20000000000000000000000000000000000051 :107F30000000000000000000000000000000000041 :107F40000000000000000000000000000000000031 :107F50000000000000000000000000000000000021 -:107F60000000000000000000000000000000000011 +:107F60000000000000000000000000000700822167 :107F70000000000000000000000000000000000001 -:107F80000000000000000000818100E00707000001 +:107F800000000000000000000000000000000000F1 :107F900000000000000000000000000000000000E1 :107FA00000000000000000000000000000000000D1 :107FB00000000000000000000000000000000000C1 :107FC00000000000000000000000000000000000B1 :107FD00000000000000000000000000000000000A1 :107FE0000000000000000000000000000000000091 -:107FF0000000000000000000000000000000000081 +:107FF000F0F00000000000000000000000000000A1 :108000000000000000000000000000000000000070 :108010000000000000000000000000000000000060 :108020000000000000000000000000000000000050 @@ -22539,7 +22539,7 @@ :108040000000000000000000000000000000000030 :108050000000000000000000000000000000000020 :108060000000000000000000000000000000000010 -:108070000000000000000000000000000000000000 +:108070000000F0F000000000000000000000000020 :1080800000000000000000000000000000000000F0 :1080900000000000000000000000000000000000E0 :1080A00000000000000000000000000000000000D0 @@ -22555,25 +22555,25 @@ :10814000000000000000000000000000000000002F :10815000000000000000000000000000000000001F :10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF +:1081700000FF0000FFFF0000000000000000000002 :1081800000000000000000000000000000000000EF -:10819000000000000F0F00000000000000000000C1 +:1081900000000000000000000000000000000000DF :1081A00000000000000000000000000000000000CF :1081B00000000000000000000000000000000000BF :1081C00000000000000000000000000000000000AF :1081D000000000000000000000000000000000009F :1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F +:1081F000000000FF00000000000000000000000080 :10820000000000000000000000000000000000006E -:108210000000000000000F0F000000000000000040 +:10821000000000000000000000000000000000005E :10822000000000000000000000000000000000004E :10823000000000000000000000000000000000003E :10824000000000000000000000000000000000002E :10825000000000000000000000000000000000001E :10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE +:108270000000000005002A00054000A800000000E2 :1082800000000000000000000000000000000000EE -:10829000000000000061003FC00C20A800000000AA +:1082900000000000000000000000000000000000DE :1082A00000000000000000000000000000000000CE :1082B00000000000000000000000000000000000BE :1082C00000000000000000000000000000000000AE @@ -22581,7 +22581,7 @@ :1082E000000000000000000000000000000000008E :1082F000000000000000000000000000000000007E :10830000000000000000000000000000000000006D -:108310000000000000000000000000FF000000005E +:10831000000000000000000000000000000000005D :10832000000000000000000000000000000000004D :10833000000000000000000000000000000000003D :10834000000000000000000000000000000000002D @@ -22589,7 +22589,7 @@ :10836000000000000000000000000000000000000D :1083700000000000000000000000000000000000FD :1083800000000000000000000000000000000000ED -:1083900000000000000000000000000000FF0000DE +:1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD :1083B00000000000000000000000000000000000BD :1083C00000000000000000000000000000000000AD @@ -22606,45 +22606,45 @@ :1084700000000000000000000000000000000000FC :1084800000000000000000000000000000000000EC :1084900000000000000000000000000000000000DC -:1084A00000000000000000000000000000000000CC -:1084B00000020000000000000000000000000000BA -:1084C00000840180000000000000000000000000A7 -:1084D000000000000000000000000000000000009C -:1084E000000000000001000000000000000000008B -:1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B -:10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:1085400000000021082000000000000000000000E2 +:1084A000000000000000000020000000200082000A +:1084B0000400880020002000200020002000200070 +:1084C000000088008800880020008800200020002C +:1084D00020000000000020008800200000000000B4 +:1084E0000000880000032000200020000000200081 +:1084F000200020000000C0000000200020008800B4 +:1085000000008800200020008800200000002000DB +:1085100020000400000020000000200020002000B7 +:1085200000008800200000000000000000000000A3 +:108530000000000000000300000000000000000038 +:10854000000000000000000000000000000000002B :10855000000000000000000000000000000000001B :10856000000000000000000000000000000000000B -:1085700000000000100200000000000000000000E9 +:1085700000000000000000004100000000000000BA :1085800000000000000000000000000000000000EB -:10859000000000000040000000000000000000009B -:1085A00000000000000000000000000000000000CB -:1085B000000000000000000000000000C0000000FB -:1085C0000000000000081002000000000000000091 +:1085900000000000200000A000A000A000000000DB +:1085A00000000000000000000000000002000200C7 +:1085B0000000820000008400200000400000000055 +:1085C000200020000000000000000000000000006B :1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B -:10860000000000000000000000000000000000006A +:1085E0000000000000000004000000000000000087 +:1085F000000000000000002100000000000000005A +:108600000000000000000000000800000000000062 :10861000000000000000000000000000000000005A -:10862000000000000000000000000000000000004A -:1086300000000500410000000500000000000000EF -:1086400000000500000000018001000000000000A3 -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A -:1086700000000000000000000000000000000000FA -:1086800000000000000000000000000000000000EA +:108620000000000000000000020800000000000040 +:108630000000000000000008200000C00000000052 +:108640000000000000000000000000000000090021 +:108650000000000000000008000000000000000012 +:108660000000000000000000000100000000000009 +:10867000400000000000000041A0000000000000D9 +:1086800000000000000000000000000100000000E9 :1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000000000000000000000000000009A +:1086A00000000000000000000000000100000005C4 +:1086B0000005000500000041000500050000000065 +:1086C0000000000000000000002100000000001178 +:1086D0000000000000000000000200000000000098 :1086E000000000000000000000000000000000008A -:1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000000069 +:1086F00000000000000000000000C00000000000BA +:108700008800A00000000000000000000000000041 :108710000000000000000000000000000000000059 :108720000000000000000000000000000000000049 :108730000000000000000000000000000000000039 @@ -22652,131 +22652,131 @@ :108750000000000000000000000000000000000019 :108760000000000000000000000000000000000009 :1087700000000000000000000000000000000000F9 -:1087800000000000000000000000000000000000E9 +:1087800021002100000000000000000003000000A4 :1087900000000000000000000000000000000000D9 :1087A00000000000000000000000000000000000C9 -:1087B00000000000000900000000000000000000B0 -:1087C00000000000000000000000000000000004A5 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000000000000089 -:1087F0000000000000000000000000000000000079 -:108800000000000000000000000000000000000068 -:108810000000000000000000000000000000000058 -:108820000000000000000000000000000000000048 -:108830000000000000000000000000000000000038 -:108840000000210000000000000000000000000007 -:108850000001000000000000000000000000000017 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000000000E8 -:1088900000000000000000000000000000000000D8 -:1088A00000000000000000000000000000000000C8 -:1088B000000000000000000000000000A000000018 -:1088C000820090000000000000040000000008206A -:1088D0000000000000000000001100040000000083 -:1088E0000000000000000000000000000000000088 -:1088F0000000000000000000000000000000000078 -:108900000000000000000000000000000000000067 -:108910000000000000000000000000000000000057 -:108920000000000000000000000000000000000047 +:1087B00082000000820000058205900908059005EE +:1087C0009009A00090009000820082000000A000AC +:1087D000A0008200A000000082008200000084004F +:1087E000820000008400000082008200000082807D +:1087F0000000820008008200A00082008200400089 +:10880000A0008200C00082008200C0008200000040 +:1088100082808200080082008200A0008200100096 +:108820008200820000008200820008008200820034 +:108830008280000000000000000000000000000036 +:10884000000008004000030000900000000000004D +:1088500021000000000000000000000000000000F7 +:1088600040000800000008000000000000000000B8 +:1088700000080000000000000000000000000000F0 +:108880002100000004004000000000000000000083 +:1088900000000004000000000000000000000000D4 +:1088A00000000000000003000000000000000000C5 +:1088B000080000040000A0000000C000000000004C +:1088C000C0000800000000000000000008000000D8 +:1088D000000000008200A0000000C000900008001E +:1088E000C00000000000000082000000080000003E +:1088F0000000000000000800A0000000C000000010 +:108900000800C0000000000008000800000000008F +:1089100000000000000008000000000000008200CD +:108920000800000000000000000008000000000037 :108930000000000000000000000000000000000037 :108940000000000000000000000000000000000027 :108950000000000000000000000000000000000017 :108960000000000000000000000000000000000007 :1089700000000000000000000000000000000000F7 :1089800000000000000000000000000000000000E7 -:1089900000000000000000000000000000000000D7 -:1089A00000000000000000000000000000000000C7 -:1089B000000000000000008408000000900000009B -:1089C0000800000000000000000000000003840018 -:1089D0000003000000000000000000000000000094 -:1089E0000000000000000000000000000000000087 -:1089F0000000000000000000000000000000000077 -:108A00000000000000000000000000000000000066 -:108A10000000000000000000000000000000000056 -:108A20000000000000000000000000000000000046 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 +:108990000000000000000084000000000000000053 +:1089A0000000000000000000000000900000000037 +:1089B00000000000000000000000000000000000B7 +:1089C000C0000809040800098204000000098809A1 +:1089D000A000080082008380000000008200820066 +:1089E000C000840008000800002000008200000091 +:1089F0000000080000000800000000000000100057 +:108A00000800C000840008000000002000000800EA +:108A100000008200000000000800A000820010009A +:108A2000A0020000A00008000000000000000800F4 +:108A30000000000000000800080000000000000026 +:108A40000000000000001190000000000000000085 +:108A500000000000090011001004000000000000E8 :108A60000000000000000000000000000000000006 :108A700000000000000000000000000000000000F6 :108A800000000000000000000000000000000000E6 :108A900000000000000000000000000000000000D6 -:108AA00000000000000000000000000000000400C2 -:108AB00000000000110000000000000000000000A5 -:108AC0000000000101000000000001200100C100C1 -:108AD0000002C0820000C000000100000000000091 -:108AE0000000000000000000000000000000000086 -:108AF0000000000000000000000000000000000076 -:108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B20000000000000000000000000000000000045 -:108B30000000000000000000000000000000000035 -:108B400000000000000802000000004108001009B9 -:108B5000880000808080000080000003000000008A -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B800000000000000000000000000000000000E5 -:108B900000000000000000000000000000000000D5 -:108BA00000000000000000000000000000000000C5 -:108BB00000000000000000000000000000000000B5 -:108BC0000000200000000000000002000000100073 -:108BD00088008380002003000000000000808020C7 -:108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000000000000000075 -:108C00000000000000000000000000000000000064 -:108C10000000000000000000000000000000000054 -:108C20000000000000000000000000000000000044 -:108C30000000000000000000000000000000000034 -:108C40000000000000000000000000000100000023 -:108C5000000004004020000001008200000000C06D -:108C60008200000000000000000000000000000082 -:108C700000000000000000000000000000000000F4 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 -:108CC00000000000000000000000000000000000A4 -:108CD00008008200008800008900000000000000F9 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 -:108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000000000053 -:108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D500000000005001100000000410000000000BC -:108D600000000041000000000000000000000000C2 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000000E3 -:108D900000000000000000000000000000000000D3 -:108DA00000000000000000000000000000000000C3 -:108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000020800000C1000042 -:108DD0000020800089000000004100000003000026 -:108DE00000410000000003850000000000000000BA -:108DF0000000000000000000000000000000000073 -:108E00000000000000000000000000000000000062 -:108E10000000000000000000000000000000000052 -:108E20000000000000000000000000000000000042 -:108E30000000000000000000000000000000000032 -:108E400000000000000000000000000020000040C2 -:108E50000000000040004000000000210800000069 -:108E600000000001000000000010000000000000F1 -:108E700000000000000000000000000000000000F2 -:108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED000000000000000000000000000811200E01F -:108EE000220048420000000000004842000000004C -:108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000010001B4 +:108AC000000100C00001040100C101830000010198 +:108AD000004000880001400100C0000000010001CA +:108AE000000100C00001000100C1000300000101FD +:108AF000002000020001020100C00000000000018F +:108B00000001000100C00001000100C100030000DD +:108B10000101004000200001020100C0000000012E +:108B20000001000100C00001000100C100030000BD +:108B30000101004000020001020100C000000041EC +:108B40000041004100890041004100C040C1004097 +:108B50000241000000000041804100C000000041CF +:108B600000410041008500410041009040C10040AB +:108B700002410000008000418041008500000000AB +:108B8000004100410041008500410041009020C1AA +:108B900000400241000000000041804100850000CB +:108BA00000410041004100C000410041009020C14F +:108BB000004002410000008000418041008500002B +:108BC00041000300000000804100A00000000200FE +:108BD00010000580000090004100C10000408000AE +:108BE00041000300000000804100C00000000200BE +:108BF00002004080000085004100C100008080002C +:108C0000000041000300000000804100C00000009F +:108C1000020020004080000090004100C100008060 +:108C2000800041000300000000804100C0000000FF +:108C3000020020004080000090004100C100008040 +:108C4000800001000100000000C00100C100000020 +:108C50000100210090020090C1004100C1000040CD +:108C6000820001000100000000C00100C0000000FF +:108C70000100210090020090C0004100C1000004EA +:108C80008200000301000100000000C00100C000DC +:108C900000000100820090020090C1004100C1006C +:108CA0000004820001000100000000C00100C000BB +:108CB00000000100820090040090C1004100C1004A +:108CC0000004820000C00001C0C1000000000001DB +:108CD00000C0088300410001C0C100000000000185 +:108CE0000000000000C00001C0C100000000000141 +:108CF00000C004020091000100C10000000000015A +:108D000000000000000000C00001C0C10000000021 +:108D1000000100C004020091000100C10000000039 +:108D200000010000000000C00001C0C10000000000 +:108D3000000100C040020091000100C100000000DD +:108D40000001000000000080004180C10000000020 +:108D5000004100C1808800C1004180C100000000C6 +:108D60000041004000000080004180C10000000080 +:108D7000004100C180A00041004100C1000000008E +:108D800000410005000000000080004180C100009B +:108D90000000004100C180C00041004100C100004E +:108DA00000000041000500000080004180C100007B +:108DB0000000004100C100850041004100C10000E9 +:108DC0000000004100050000C100800080C10000DB +:108DD0004109000409004100C1C1000080050000F4 +:108DE0004100000080004100C100800080C10000FF +:108DF0004109000005004100C1C18000800500005C +:108E000041000000800041000000C100800080C1DE +:108E100000004109000005004100C1C1800080053B +:108E200000004100000080004100C100800080C1BE +:108E300000004110000005004100C1410000800514 +:108E400000004100000080004100C1004000C0C19E +:108E500000000100A00102000100C1050200C000E5 +:108E6000000001000000C0000100C1004000C0C1BE +:108E700000000100A00010000100C1050400C000B6 +:108E8000000001000000C00001000000C10040001F +:108E9000C0C100000100200082000100C1050400E3 +:108EA000C000000001000000C0000100C10040003F +:108EB000C0C100000101200082000100C1050400C2 +:108EC000C000000001000000C00001000000000020 +:108ED000000000420000000000000000811200417C +:108EE000070048060000000000000000000000002D +:108EF000000000420000000000000000811200415C +:108F00000700480000000000000000000000000012 +:108F1000000000000042000000000000000081127C +:108F200000410700480000000000000000000000B1 +:108F3000000000000042000000000000000081125C +:108F40000041070048000000000000000000000091 :108F50000000000000000000000000000000000011 :108F60000000000000000000000000000000000001 :108F700000000000000000000000000000000000F1 @@ -22795,112 +22795,112 @@ :109040000000000000000000000000000000000020 :109050000000757B00000000000000000000000020 :109060000000000000000000000000000000000000 -:10907000DEAE000000000000000000000000000064 +:10907000DEAE757B00000000000000000000000074 :1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 +:10909000DEAE0000757B0000000000000000000054 :1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 +:1090B0000000DEAE757B0000000000000000000034 :1090C00000000000000000000000000000000000A0 -:1090D0000000000061260340000000000000023094 -:1090E000A0000000000000000C4000000000000094 -:1090F00002C06486000000000000000000000000C4 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:10913000000000000000000000000000000000002F -:10914000000000000000000000000000000000001F -:1091500000000000000000000000200000000000EF -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF -:1091900000000000000000020000000000000000CD -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000000000000AF -:1091C000000000000000000000000000000000009F -:1091D000000000000000200000000000000000006F -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E -:10925000000000000000000080000000000000008E -:1092600000000000000000000000000000000000FE -:1092700020000000000000000000000000000000CE +:1090D0000000DEAE60C603000000000000000031AA +:1090E000E0000000000000000C0000000000000094 +:1090F00000C0630660C603000000000000000031ED +:10910000E0000000000000000C0000000000000073 +:1091100000C06306000060C60300000000000000FD +:109120000031E0000000000000000C000000000022 +:10913000000000C0630660C60300000000000000DD +:109140000031E0000000000000000C000000000002 +:10915000000000C063060000840000000000000062 +:1091600020000000200020002000200020008800B7 +:109170002000000004000000200000008400000027 +:1091800088000000200020002000200020000000B7 +:10919000200084000000000000000000000020000B +:1091A00088002000000020002000200084004000F3 +:1091B00084002000000000000000000000002000EB +:1091C00020002000000020002000200020002000BF +:1091D000200020000000000000001000000010002F +:1091E000000000000000000000000000000200007D +:1091F000090005000000044000004000400000009D +:109200004000000000000000000000000000050019 +:1092100005000000000000000000400040000000C9 +:1092200000000000000000000000000040000000FE +:109230000000000005000000000000000000000029 +:109240000900000000000000000000000000000015 +:109250000000000000000000000002000200020008 +:10926000020000000000000090402000000000000C +:1092700000008840020088008840000020000000B4 :1092800000000000000000000000000000000000DE :1092900000000000000000000000000000000000CE :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE :1092C000000000000000000000000000000000009E :1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F0000000000005000000000000000000000069 -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D +:1092E0000000000000080000000000000040000036 +:1092F00000000000000800004100410000000000E4 +:109300000000000000080000000000000000000055 +:109310000000000000080000000000000000000045 +:1093200000000000008400040000000000000000B5 +:109330000000000000080004000000000000000021 :10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D +:109350000000000000880000000000000000000085 :1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD +:1093800000000000000000030000000000000000DA +:1093900000000000000800000000000000000000C5 :1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD +:1093B000000000000000004100000000000000006C :1093C000000000000000000000000000000000009D -:1093D000000000000000000000000000000020006D -:1093E00000000800000041000000410008000800E3 -:1093F00000000000008241000000000000000000AA -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C -:10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C -:10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C -:10946000800000000000000000000000000000007C -:1094700000000000000000000000000000000000EC +:1093D000000000000000000000000000000000008D +:1093E000000000000000000003000000000000007A +:1093F000000000000000000000000000000000006D +:10940000000008000000410003000000030000000D +:10941000000000000010000000000000000000003C +:1094200000000000080041000800030000000000E8 +:1094300041000000000000000000000000000000EB +:109440000000000000000300080008000000000009 +:1094500000000000000000000000000010000000FC +:109460000000000000040000400008050009820020 +:10947000821100000000000000004080040940004C :1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C -:1094D000000000000000000000000000A0000000EC -:1094E00000009100000000000000410000000000AA -:1094F000000000000000000000000000000000006C +:109490000000C00000000000000008000000000004 +:1094A0000000000000000000C000000000000000FC +:1094B0000000000000000000820084004000000066 +:1094C0000000000000000000A0008200000000007A +:1094D0000000000000000000000000000800400044 +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000004000002C :10950000000000000000000000000000000000005B :10951000000000000000000000000000000000004B :10952000000000000000000000000000000000003B -:10953000000000000000000000000000000000002B +:109530000000000000000000000000000800000023 :10954000000000000000000000000000000000001B :10955000000000000000000000000000000000000B -:1095600000000000040000000000900000008400E3 -:1095700000000000002000000000000000000000CB -:1095800000200000000000000000000000000000BB -:1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB +:1095600000000000000000000000000000000800F3 +:109570000000000000000000000000008200A000C9 +:1095800000000000000000000000000000080000D3 +:109590000800000000000000000000000041000082 +:1095A0000000000008000000820000000000000031 :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B -:1095E00000000200000000000082000000000000F7 -:1095F0000004000000000004000000880002088849 -:109600000000000000000000000000000800000052 -:10961000000000000000000000000000000000004A +:1095E000000000000000000000000000000000007B +:1095F0000084000000000000082008000500410071 +:10960000000000000000000000040800000000004E +:109610000000030000000000080008000000050032 :10962000000000000000000000000000000000003A -:10963000000000000000000000000000000000002A -:10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A -:10966000000000008000000000000000000000007A -:1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA +:10963000000000000800000000000800080008000A +:109640000500000000000000000000000000000015 +:1096500000000300080000000000080008000300EC +:1096600003000000000000000000000000020000F5 +:1096700000000000000000000000024000000000A8 +:1096800004000000000000000000000000000000D6 +:1096900000210000000000000000000000000000A9 :1096A00000000000000000000000000000000000BA :1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A -:1096D00000000000000000000000000090000000FA +:1096C0000000000000000000080000000000000092 +:1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A :1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 +:109700000000000011000000000000000000000048 :109710000000000000000000000000000000000049 :109720000000000000000000000000000000000039 :109730000000000000000000000000000000000029 @@ -22908,13 +22908,13 @@ :109750000000000000000000000000000000000009 :1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 +:1097800000000000000010900090004040400000E9 :1097900000000000000000000000000000000000C9 :1097A00000000000000000000000000000000000B9 :1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 :1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000100000078 +:1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 :109810000000000000000000000000000000000048 @@ -22922,9 +22922,9 @@ :109830000000000000000000000000000000000028 :109840000000000000000000000000000000000018 :109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000400F4 +:1098600000000000000000000000000000000000F8 :1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 +:1098800000000000000000000000000080880000D0 :1098900000000000000000000000000000000000C8 :1098A00000000000000000000000000000000000B8 :1098B00000000000000000000000000000000000A8 @@ -22932,56 +22932,56 @@ :1098D0000000000000000000000000000000000088 :1098E0000000000000000000000000000000000078 :1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 +:1099000000000000000000000000000008001083BC +:109910000840882000000000000000000000000057 :109920000000000000000000000000000000000037 :109930000000000000000000000000000000000027 :109940000000000000000000000000000000000017 :109950000000000000000000000000000000000007 :1099600000000000000000000000000000000000F7 -:109970000000000000A00000000000000000000047 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 +:1099700000000000000000000000000000000000E7 +:109980000000000000000000000000000000C00215 +:1099900000022040C00400000000000000000000A1 :1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 -:1099F00000000000840000000000000000000000E3 +:1099F0000000000000000000000000000000000067 :109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 +:109A100000000080000080800000000000000000C6 :109A20000000000000000000000000000000000036 :109A30000000000000000000000000000000000026 :109A40000000000000000000000000000000000016 :109A50000000000000000000000000000000000006 :109A600000000000000000000000000000000000F6 -:109A700000000000000000000300000000000000E3 +:109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 +:109A90000000000000000000800000000000000046 :109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 :109AC0000000000000000000000000000000000096 :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 -:109AF0000000000000050041000000000000000020 +:109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 +:109B100000000000100088404040080000000000E5 :109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 -:109B7000000000000000000000000088000000005D +:109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 +:109B9000000000000000000000000000000A0000BB :109BA00000000000000000000000000000000000B5 :109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 -:109BF0000000000000000000818100E0070100007B +:109BF0000000000000000000000000000000000065 :109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 +:109C10000000000000000000F151A101C3FFC300DB :109C20000000000000000000000000000000000034 :109C30000000000000000000000000000000000024 :109C40000000000000000000000000000000000014 @@ -22989,24 +22989,24 @@ :109C600000000000000000000000000000000000F4 :109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 -:109C900000000000000000000000000000000000C4 -:109CA00000000000000000000000000000000000B4 +:109C900000000000000000000000FB5BAB0B550F54 +:109CA000550F000000000000000000000000000050 :109CB00000000000000000000000000000000000A4 :109CC0000000000000000000000000000000000094 :109CD0000000000000000000000000000000000084 :109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 :109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 +:109D1000000000000000000000000000202C232FA5 +:109D20004141EBEB000000000000000000000000DB :109D30000000000000000000000000000000000023 :109D40000000000000000000000000000000000013 :109D50000000000000000000000000000000000003 :109D600000000000000000000000000000000000F3 :109D700000000000000000000000000000000000E3 -:109D800000000000FFFF00000000000000000000D5 -:109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000000B3 +:109D800000000000000000000000000000000000D3 +:109D90000000000000000000000000000000E0ECF7 +:109DA000E3EFA0F5A0F500000000000000000000B7 :109DB00000000000000000000000000000000000A3 :109DC0000000000000000000000000000000000093 :109DD0000000000000000000000000000000000083 @@ -23014,13 +23014,13 @@ :109DF0000000000000000000000000000000000063 :109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 +:109E20000000000000C00000000000000000000072 :109E30000000000000000000000000000000000022 :109E40000000000000000000000000000000000012 :109E50000000000000000000000000000000000002 :109E600000000000000000000000000000000000F2 :109E700000000000000000000000000000000000E2 -:109E800000000061003FC00D20A80000000000009D +:109E800000000000000000000000000000000000D2 :109E900000000000000000000000000000000000C2 :109EA00000000000000000000000000000000000B2 :109EB00000000000000000000000000000000000A2 @@ -23053,65 +23053,65 @@ :10A0600000000000000000000000000000000000F0 :10A0700000000000000000000000000000000000E0 :10A0800000000000000000000000000000000000D0 -:10A0900000000000000000002000000000000000A0 -:10A0A0000000000000002000000000000000000090 -:10A0B0000000000000000000200000000000000080 -:10A0C0000000000000002000000000000000000070 -:10A0D0000000000000000000000020000000000060 -:10A0E0000000000000000000200000000000000050 -:10A0F0000000000000000000000000000000000060 -:10A10000000000000000000020000000000000002F -:10A1100000004000000000000000000000000000FF +:10A0900000002000000000000000000000000000A0 +:10A0A0000000200000000000000000000000000090 +:10A0B000040020000000000000000000000000007C +:10A0C0000000200000000000000040000000000030 +:10A0D0000000000020000000000000000000000060 +:10A0E0000000000020000000000000002000000030 +:10A0F000000084002000000000004000000000007C +:10A1000000000000200000000000000020001000FF +:10A11000000020000000000000000000000000001F :10A12000000000000000000000000000000000002F :10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A1500000000002000000000000000000000000FD -:10A1600000000000000000000000000000000000EF -:10A17000000000004000000000000000000000009F +:10A14000000000000000000004000000000000000B +:10A1500000000000000000000000000000000000FF +:10A1600000000000000000000000040000000000EB +:10A1700000000400000000000000000000000000DB :10A1800000000000000000000000000000000000CF -:10A1900000000000800000000000820000000000BD -:10A1A000000008000800000000000000000004009B -:10A1B0000400000004410000000000000000040052 +:10A1900000000000000000000800000082008200B3 +:10A1A00082008200820082000000000000000000A7 +:10A1B0000000000004000000020000000000000099 :10A1C000000000000000000000000000000000008F -:10A1D000000000000000000000000000000000007F +:10A1D0000000080000000000000000000000000077 :10A1E000000000000000000000000000000000006F -:10A1F000000000000000000000000000000000005F +:10A1F000000002000000000000000000000000005D :10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E -:10A220000000000000000500000000000000000029 +:10A21000000000000000020000000000000000003C +:10A22000000800000000000000880000000000009E :10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000000000000000EE +:10A240000008000000000000000000000000000006 +:10A25000000000000000008400000000000000007A +:10A2600000000004000000000008000000000000E2 :10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE +:10A2800000000000000000000010000000000000BE :10A2900000000000000000000000000000000000BE -:10A2A00000000000000000008800400000002000C6 -:10A2B000840000000000000000000000000000001A -:10A2C000000010000000000000000000000000007E +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000100000000000007E :10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E +:10A2E000000000000000000000000010000000005E :10A2F000000000000000000000000000000000005E :10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000210000001C -:10A32000000000000000000000000000000000002D -:10A330000000000000000000000400000000000019 -:10A34000000000000000000000000000000000000D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000021000000000000000C +:10A330000800030000000000000000A000820000F0 +:10A34000000000000000000000000300000000000A :10A3500000000000000000000000000000000000FD -:10A3600000000000000000000000000000000000ED +:10A3600000000000000000000000000003000000EA :10A3700000000000000000000000000000000000DD :10A3800000000000000000000000000000000000CD :10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D +:10A3A00000000000080000000000000000000000A5 +:10A3B0000000000000000000000000000400000099 :10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D +:10A3D0000000000000000000000000000800000075 :10A3E000000000000000000000000000000000006D :10A3F000000000000000000000000000000000005D -:10A400000000000000000800000000000000000044 +:10A40000000000000000000000000000000000004C :10A41000000000000000000000000000000000003C :10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C +:10A43000000000000000000000000000000011000B :10A44000000000000000000000000000000000000C :10A4500000000000000000000000000000000000FC :10A4600000000000000000000000000000000000EC @@ -23121,20 +23121,20 @@ :10A4A00000000000000000000000000000000000AC :10A4B000000000000000000000000000000000009C :10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C +:10A4D0000008000000000000000000000000000074 :10A4E000000000000000000000000000000000006C :10A4F000000000000000000000000000000000005C :10A50000000000000000000000000000000000004B -:10A5100000000000000000000000820000000000B9 -:10A52000000000000000000000200000000000000B -:10A530000000000000020000000400000000000015 -:10A54000000000000000000000000000000000000B +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B +:10A530000000000000000000000000001100000406 +:10A5400000040808000000000000000000000000F7 :10A5500000000000000000000000000000000000FB :10A5600000000000000000000000000000000000EB :10A5700000000000000000000000000000000000DB :10A5800000000000000000000000000000000000CB :10A5900000000000000000000000000000000000BB -:10A5A0000000000000840000000000000000000027 +:10A5A00000000000000000000000080000000000A3 :10A5B000000000000000000000000000000000009B :10A5C000000000000000000000000000000000008B :10A5D000000000000000000000000000000000007B @@ -23199,7 +23199,7 @@ :10A9800000000000000000000000000000000000C7 :10A9900000000000000000000000000000000000B7 :10A9A00000000000000000000000000000000000A7 -:10A9B0000003000000000000000000000000000094 +:10A9B0000000000000000000000000000000000097 :10A9C0000000000000000000000000000000000087 :10A9D0000000000000000000000000000000000077 :10A9E0000000000000000000000000000000000067 @@ -23272,7 +23272,7 @@ :10AE10000000000000000000000000000000000032 :10AE20000000000000000000000000000000000022 :10AE30000000000000000000000000000000000012 -:10AE400000610006000D000000000000000000008E +:10AE40000000000000000000000000000000000002 :10AE500000000000000000000000000000000000F2 :10AE600000000000000000000000000000000000E2 :10AE700000000000000000000000000000000000D2 @@ -23280,7 +23280,7 @@ :10AE900000000000000000000000000000000000B2 :10AEA00000000000000000000000000000000000A2 :10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000F0F0F0F00000000000046 +:10AEC0000000000000000000000000000000000082 :10AED0000000000000000000000000000000000072 :10AEE0000000000000000000000000000000000062 :10AEF0000000000000000000000000000000000052 @@ -23288,7 +23288,7 @@ :10AF10000000000000000000000000000000000031 :10AF20000000000000000000000000000000000021 :10AF30000000000000000000000000000000000011 -:10AF400000000000000000000F0F0F0F00000000C5 +:10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 :10AF600000000000000000000000000000000000E1 :10AF700000000000000000000000000000000000D1 @@ -23305,57 +23305,57 @@ :10B020000000000000000000000000000000000020 :10B030000000000000000000000000000000000010 :10B040000000000000000000000000000000000000 -:10B0500000000000000000004002000000000000AE -:10B0600000000000000000000000200000000000C0 -:10B0700000000000000000002000000000000000B0 -:10B0800000000000000000000000200000000000A0 -:10B090000000000000000000000020000000000090 -:10B0A0000000000000000000000000002000000080 -:10B0B0000000000000000000000020000000000070 -:10B0C0000000000000000000000000002000000060 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 +:10B0500000002000000000000000000000000000D0 +:10B0600020000000000000000000200000000000A0 +:10B0700000000000000000000000000000000000D0 +:10B080002000000000000000000020000000000080 +:10B0900000000000000000000000000000000000B0 +:10B0A000000020000000000000000002200000005E +:10B0B000000000000000000000000002000000008E +:10B0C0000000200000000000000000002000000040 +:10B0D000000000000000000000000000000200006E +:10B0E000000040004000400200004000000000005E :10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F +:10B1000000004000400000000000000000000000BF +:10B1100000000000000040000000100000000000DF :10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B1500000000000000002000000000000002000CD -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000004000000CB -:10B1800000000000000000000000000000000000BF +:10B1300000000000000000000000000000004000CF +:10B1400000000000100000000000000000000000EF +:10B1500000000000000002000000000082008200E9 +:10B16000000082100000000000000000000000004D +:10B1700000000000000000000000840000008800C3 +:10B1800004000400000000000000000000000000B7 :10B1900000000000000000000000000000000000AF :10B1A000000000000000000000000000000000009F :10B1B000000000000000000000000000000000008F :10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F +:10B1E000000000000000000800080000000000004F :10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E +:10B20000000000000000000800080000000000002E :10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E +:10B22000000000000000000000080008000000000E :10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000000000FE +:10B2400000000000000000000008000800000000EE :10B2500000000000000000000000000000000000EE -:10B2600000000800000000000400000000000000D2 -:10B2700000000000000000000000000000000000CE +:10B2600000000000000000000000000000000000DE +:10B2700084000000C0000000000008000000000082 :10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE :10B2A000000000000000000000000000000000009E :10B2B000000000000000000000000000000000008E :10B2C000000000000000000000000000000000007E :10B2D000000000000000000000000000000000006E -:10B2E000000000000000000004000000000000005A -:10B2F000000000200020000000000000000000000E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E :10B30000000000000000000000000000000000003D :10B31000000000000000000000000000000000002D :10B32000000000000000000000000000000000001D :10B33000000000000000000000000000000000000D :10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD +:10B3500000000000000000000000000000000004E9 +:10B3600000000000001000000000000000000000CD +:10B3700000000000000020000000000000000000AD :10B3800000000000000000000000000000000000BD :10B3900000000000000000000000000000000000AD :10B3A000000000000000000000000000000000009D @@ -23371,15 +23371,15 @@ :10B4400000000000000000000000000000000000FC :10B4500000000000000000000000000000000000EC :10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC +:10B470000000000000008400000000000000000048 :10B4800000000000000000000000000000000000BC :10B4900000000000000000000000000000000000AC :10B4A000000000000000000000000000000000009C :10B4B000000000000000000000000000000000008C :10B4C000000000000000000000000000000000007C :10B4D000000000000000000000000000000000006C -:10B4E0000000000000000000000000000000040058 -:10B4F000000000000000000000000000000000004C +:10B4E000000000000000000000000000000000005C +:10B4F00000000090000000000000000000000000BC :10B50000000000000000000000000000000000003B :10B51000000000000000000000000000000000002B :10B52000000000000000000000000000000000001B @@ -23549,31 +23549,31 @@ :10BF600000000000000000000000000000000000D1 :10BF700000000000000000000000000000000000C1 :10BF800000000000000000000000000000000000B1 -:10BF9000000000000000000000040000000000009D +:10BF900000000000000000000000000000000000A1 :10BFA0000000000000000000000000000000000091 :10BFB0000000000000000000000000000000000081 :10BFC0000000000000000000000000000000000071 :10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000010000000000020 -:10C01000000000000000000000000002000000001E -:10C0200000000000000010000002000000000000FE -:10C030000000000000000000000000000000000000 +:10BFE000000000000000000400000000000000004D +:10BFF0000000000000000000100000000000000031 +:10C0000000004000100000000000000000000000E0 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C0300000000000000040000000000000000000C0 :10C0400000000000000000000000000000000000F0 -:10C05000000000000000000000000002000240009C -:10C0600000000000000000000000000000000000D0 +:10C0500000000000000000000000000000000000E0 +:10C060000000000000004000000000000000000090 :10C0700000000000000000000000000000000000C0 :10C0800000000000000000000000000000000000B0 -:10C090000000000000000000000000000000001090 -:10C0A000000000000200000000000000000004404A +:10C09000000000000200000000000200000002009A +:10C0A000020000000000000000000200000000008C :10C0B0000000000000000000000000000000000080 :10C0C0000000000000000000000000000000000070 :10C0D0000000000000000000000000000000000060 :10C0E0000000000000000000000000000000000050 :10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C110000008000000000000000000000000000017 +:10C10000000000000000000010000000000000001F +:10C11000100000000000000000000000000000000F :10C12000000000000000000000000000000000000F :10C1300000000000000000000000000000000000FF :10C1400000000000000000000000000000000000EF @@ -23582,30 +23582,30 @@ :10C1700000000000000000000000000000000000BF :10C1800000000000000000000000000000000000AF :10C19000000000000000000000000000000000009F -:10C1A00000000000040000000000900000000000FB -:10C1B000000004000000000000000000000000007B +:10C1A000000000000000000000000000000000008F +:10C1B00090000400000000000000000000000000EB :10C1C000000000000000000000000000000000006F :10C1D000000000000000000000000000000000005F :10C1E000000000000000000000000000000000004F :10C1F000000000000000000000000000000000003F :10C20000000000000000000000000000000000002E :10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E +:10C2200000000000040010000000000000000000FA :10C2300000000000000000000000000000000000FE :10C2400000000000000000000000000000000000EE :10C2500000000000000000000000000000000000DE :10C2600000000000000000000000000000000000CE :10C2700000000000000000000000000000000000BE :10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E +:10C29000000000000000000000000000000000405E :10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E +:10C2B000004000000000000000000000000000003E :10C2C000000000000000000000000000000000006E :10C2D000000000000000000000000000000000005E :10C2E000000000000000000000000000000000004E :10C2F000000000000000000000000000000000003E :10C30000000000000000000000000000000000002D -:10C31000100000000000000000000000000000000D +:10C31000000000000000000000100000000000000D :10C32000000000000000000000000000000000000D :10C3300000000000000000000000000000000000FD :10C3400000000000000000000000000000000000ED @@ -23613,16 +23613,16 @@ :10C3600000000000000000000000000000000000CD :10C3700000000000000000000000000000000000BD :10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D +:10C39000000000000000000000004140000000001C :10C3A000000000000000000000000000000000008D :10C3B000000000000000000000000000000000007D :10C3C000000000000000000000000000000000006D :10C3D000000000000000000000000000000000005D :10C3E000000000000000000000000000000000004D :10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C +:10C400000000000000000000000000000000040028 :10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C +:10C420000000000000000000000000000000080004 :10C4300000000000000000000000000000000000FC :10C4400000000000000000000000000000000000EC :10C4500000000000000000000000000000000000DC @@ -23744,46 +23744,46 @@ :10CB90000000000000000000000000000000000095 :10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000200020000000000025 +:10CBC0000000000000000000000000000000000065 :10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000200020000000000005 +:10CBE0000000000000000000000000000000000045 :10CBF0000000000000000000000000000000000035 -:10CC000000000000000000000000200020000000E4 -:10CC100000004000400000000000C000A0004000F4 -:10CC20001000000010000000100020002000C000D4 -:10CC3000A0001000400000000000A0004000000024 -:10CC400000000000000000000000000000020000E2 -:10CC500000000000000000000002000000000000D2 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 +:10CC00000000000000000000000000000000000024 +:10CC100000000000000000000000000000004000D4 +:10CC2000400040004000C000A0004000A0004000C4 +:10CC300040004000A000C0000000C000C000400252 +:10CC40004000400200001000000000000000004012 +:10CC50000000000200000000000000000000400092 +:10CC60004000000000000000000000000000000084 +:10CC70004000000000000000000000000000000074 :10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 +:10CC90000000000000000000000040000000000054 :10CCA0000000000000000000000000000000000084 -:10CCB0000000000000001000000000000000000064 +:10CCB0000000000000000000000010000000000064 :10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 +:10CCD000020000000000000002000200000002004C +:10CCE0000000020000000000000000000000000042 :10CCF0000000000000000000000000000000000034 :10CD00000000000000000000000000000000000023 :10CD10000000000000000000000000000000000013 -:10CD200000001000000000080000000000000000EB -:10CD300000000000000000000008A0081000080823 -:10CD4000900800000000000800080008000000082B -:10CD500000080008000000080208000000000008A9 -:10CD6000000800000000000800080008000000089B -:10CD7000000800080000000800080000000000088B -:10CD80000008000000000000000800080008000083 -:10CD9000000800080008000000080008000000006B -:10CDA00000080008000000000084000800080000DF -:10CDB00000080008000800000008008400000000CF -:10CDC00000840010000000000000000000000000CF +:10CD20000000000000000000000000000000000003 +:10CD30000008100000000008900810001000000813 +:10CD4000A00800080000000000000000000000082B +:10CD500000000000000000080008000000000208B9 +:10CD600000080008000000000000000000000008AB +:10CD7000000000000000000800080000000000089B +:10CD80000008000000080000000000000000000093 +:10CD9000000800000000000000080008000000007B +:10CDA000000800080008000000080008000000005B +:10CDB0000008000000000000008400840000000063 +:10CDC0000010001000000000000000000000000043 :10CDD0000000000000000000000000000000000053 :10CDE0000000000000000000000000000000000043 :10CDF0000000000000000000000000000000000033 :10CE00000000000000000000000000000000000022 :10CE10000000000000000000000000000000000012 :10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000002100000000D1 +:10CE300000000000000000000000000000000000F2 :10CE400000000000000000000000000000000000E2 :10CE500000000000000000000000000000000000D2 :10CE600000000000000000000000000000000000C2 @@ -23792,48 +23792,48 @@ :10CE90000000000000000000000000000000000092 :10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 +:10CEC0000000000000000000004000400040004062 +:10CED000000400000000000000000000000000004E :10CEE0000000000000000000000000000000000042 :10CEF0000000000000000000000000000000000032 :10CF00000000000000000000000000000000000021 :10CF10000000000000000000000000000000000011 :10CF20000000000000000000000000000000000001 -:10CF30000000000000000000C00000000000080029 -:10CF400000001000000008000800000000000000C1 -:10CF500000000000000000000000000000000000D1 +:10CF300000000000100000000000000000000000E1 +:10CF4000101000418200A00010410000000000000D +:10CF50000000000000000000004000000000000091 :10CF600000000000000000000000000000000000C1 :10CF700000000000000000000000000000000000B1 :10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000000091 +:10CF90000008000800000000000000000000000081 :10CFA0000000000000000000000000000000000081 :10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000A000000000C1 +:10CFC000000000000000000000A0000000000000C1 :10CFD0000000000000000000000000000000000051 :10CFE0000000000000000000000000000000000041 :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 :10D010000000000000000000000000000000000010 -:10D0200000000000000000000000000000000400FC -:10D030000000000000000000000000000000A00050 -:10D0400000000000080040008400C000C000000094 +:10D020000000000000000000000000000000000000 +:10D0300000000000000010000000000010000000D0 +:10D0400000000000C000A000000010000000000070 :10D0500000000000000000000000000000000000D0 -:10D0600000000000002000000000000000000000A0 +:10D060000000000000000000000000880000000038 :10D0700000000000000000000000000000000000B0 :10D0800000000000000000000000000000000000A0 :10D090000000000000000000000000000000000090 :10D0A0000000000000000000000000000000000080 :10D0B0000000000000000000000000000000000070 -:10D0C000000000000000000000040000000000005C +:10D0C0000000000000000000000000000000000060 :10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 :10D10000000000000000000000000000000000001F :10D11000000000000000000000000000000000000F :10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000100000000000DF -:10D1400000001000000000000000A000000010001F -:10D15000820000000000000000000000000000004D +:10D1300000000000000000000000000000000000EF +:10D14000000084000000C000000010001000C000BB +:10D1500000000000200000000000000000000000AF :10D1600000000000000000000000000000000000BF :10D1700000000000000000000000000000000000AF :10D18000000000000000000000000000000000009F @@ -23988,69 +23988,69 @@ :10DAD0000000000000000000000000000000000046 :10DAE0000000000000000000000000000000000036 :10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 -:10DB10000000000000020000000000000000000003 -:10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 +:10DB000000000000000020000000000000000000F5 +:10DB10008200000000000000000000000000000083 +:10DB200000000000000020000000000000000000D5 +:10DB30002000000000000000000000000000400085 +:10DB400000000000000000002000000000000000B5 :10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000002A3 +:10DB600000000002000000000000000000000000B3 +:10DB70000000000000000000000010000000000095 :10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000000000000085 +:10DB90000000400000000000000000000000000045 :10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000100200000000000053 -:10DBC0000000000000000000000000000000000055 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000100000000000000000000000000045 :10DBD0000000000000000000000000000000000045 -:10DBE00000004000000000000000000000000000F5 -:10DBF0000000000000000000000000000000000025 -:10DC000000000000000000000040001000000000C4 -:10DC10000000000000000200000002000000000000 +:10DBE0002000000000000000000000000000000015 +:10DBF00000000000000200000000000000000040E3 +:10DC0000000090090000000000000000000000007B +:10DC10000000000000000000000000000000020002 :10DC200000000000000000000000000000000000F4 -:10DC300000000000000000000000000000000000E4 +:10DC300000000000000000000040000000000000A4 :10DC400000000000000000000000000000000000D4 :10DC500000000000000000000000000000000000C4 -:10DC600000000000000000000000000000100000A4 -:10DC7000000000000009000000000010000000008B -:10DC80000000020000000000000000000040000052 -:10DC90000000000000000200000000000000000082 -:10DCA0000000000000000200000000000000000072 -:10DCB0000000000000000000000000000000000064 -:10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 -:10DCE0000000000000000000000000000000000034 -:10DCF0000000000000000000000000000000000024 +:10DC600000000000000000000000000000000000B4 +:10DC7000000000000000900000000000080000000C +:10DC80000000000000000000000000080008000084 +:10DC9000000000080000000000000008000800006C +:10DCA000000000000000000000000084008200006E +:10DCB000000000080000000000000088008800004C +:10DCC000000000000000000000000000000800004C +:10DCD0000000000000080000000002000008000032 +:10DCE00000000000000000000000000000840000B0 +:10DCF0000000000000880000000000000088000014 :10DD00000000000000000000000000000000000013 :10DD10000000000000000000000000000000000003 -:10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000000000000000E3 +:10DD200000000000000000000000000000080000EB +:10DD300000000000000000000000000000080000DB :10DD400000000000000000000000000000000000D3 :10DD500000000000000000000000000000000000C3 :10DD600000000000000000000000000000000000B3 -:10DD700000000000000000000000000000000000A3 +:10DD70000000000000000000000000000000001093 :10DD80000000000000000000000000000000000093 :10DD90000000000000000000000000000000000083 :10DDA0000000000000000000000000000000000073 :10DDB0000000000000000000000000000000000063 :10DDC0000000000000000000000000000000000053 -:10DDD000000000000000000009000000000000003A -:10DDE0000000000000000000000000001000000023 -:10DDF0000000000000001000000000000000000013 -:10DE00000000000000000000000000000000000012 -:10DE10000000000000000000000000000000000002 -:10DE200000000000000000000000000000000000F2 +:10DDD0000000000000000000000000000000000043 +:10DDE000000000000900000000000000100000001A +:10DDF00000000000100000004100100000000000C2 +:10DE00000000000000090000000000400040004049 +:10DE10000040004000400000000000000000000042 +:10DE200000000040000000000000000000000000B2 :10DE300000000000000000000000000000000000E2 :10DE400000000000000000000000000000000000D2 :10DE500000000000000000000000000000000000C2 :10DE600000000000000000000000000000000000B2 -:10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000000000092 +:10DE70000000000000000000000000000010000092 +:10DE8000000000000004000000000000200000006E :10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000000000000000000072 +:10DEA000000000A0000000000000000000000000D2 :10DEB0000000000000000000000000000000000062 :10DEC0000000000000000000000000000000000052 :10DED0000000000000000000000000000000000042 -:10DEE0000000000000000000000000000000000032 +:10DEE0000000000000000000210000000000000011 :10DEF0000000000000000000000000000000000022 :10DF00000000000000000000000000000000000011 :10DF10000000000000000000000000000000000001 @@ -24059,10 +24059,10 @@ :10DF400000000000000000000000000000000000D1 :10DF500000000000000000000000000000000000C1 :10DF600000000000000000000000000000000000B1 -:10DF700000000000000000000000000000000000A1 +:10DF70000000000000000000080000000000000099 :10DF80000000000000000000000000000000000091 :10DF90000000000000000000000000000000000081 -:10DFA0000000000000000000000000000000000071 +:10DFA0000000000000000000002000000000000051 :10DFB0000000000000000000000000000000000061 :10DFC0000000000000000000000000000000000051 :10DFD0000000000000000000000000000000000041 @@ -24074,17 +24074,17 @@ :10E0300000000000000000000000000000000000E0 :10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 +:10E0600000000000000008000000000000000000A8 :10E0700000000000000000000000000000000000A0 :10E080000000000000000000000000000000000090 :10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 +:10E0A000000000000000000400000000000000006C :10E0B0000000000000000000000000000000000060 :10E0C0000000000000000000000000000000000050 :10E0D0000000000000000000000000000000000040 :10E0E0000000000000000000000000000000000030 :10E0F0000000000000000000000000000000000020 -:10E10000000000000000000000000000000000000F +:10E10000000000000000000000000000000002000D :10E1100000000000000000000000000000000000FF :10E1200000000000000000000000000000000000EF :10E1300000000000000000000000000000000000DF @@ -24239,99 +24239,99 @@ :10EA80000000000000000000000000000000000086 :10EA90000000000000000000000000000000000076 :10EAA0000000000000000000000000000000000066 -:10EAB00000000000000020000000200020040000F2 -:10EAC0000000200020002000200000002000400066 -:10EAD0002000200020002000000020002000000076 -:10EAE0000000200020002000200000002000200066 -:10EAF00020000000200000002000000000000000B6 -:10EB0000000000002000200000008800000020001D -:10EB100000002000000000000000000000000000D5 +:10EAB00000000000000020000000200020002000D6 +:10EAC000200020002000C0000000200020002000C6 +:10EAD0002000200020002000000020002000200056 +:10EAE0002000200020002000000020002000200046 +:10EAF0002000200020000000200000002000200056 +:10EB00002000200020002000100000000000000075 +:10EB100000000000000000000000000000000000F5 :10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000000000D5 -:10EB4000000200020002009000000000000000002F -:10EB500000020002000000000000000000000000B1 +:10EB30000000000000000000000040000000000095 +:10EB400000000002000000004000400000900000B3 +:10EB50000000000000000000000040000000000075 :10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000200075 -:10EB80002000000000000000000041000000000024 -:10EB90000000200000000000000020000000000035 -:10EBA00041000900000020002000000000000000DB -:10EBB0000000000000000000000000000000000055 +:10EB70000000000000000000000000000000000293 +:10EB800000000000100000000000200041002000F4 +:10EB90002000200220002000200020004100200052 +:10EBA000410020044100200020200000000000005F +:10EBB0000000000000000000000200000040000013 :10EBC0000000000000000000000000000000000045 :10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 +:10EBE0000200000002000000000000000000000021 :10EBF0000000000000000000000000000000000015 :10EC00000000000000000000000000000000000004 :10EC100000000000000000000000000000000000F4 -:10EC200000000010000000000000001000000000C4 -:10EC3000001000100800001000100010000002007A -:10EC400000000000000802000008000000080008A2 -:10EC500000080000000000000000000000000000AC -:10EC60000000040000080000000800000008000880 -:10EC7000000800000000000000000000000000008C -:10EC8000000000000000000800000008000000086C -:10EC9000000800100000000000000000000000005C -:10ECA0000000000000000010000000100000001034 -:10ECB0000010000000000000000000000000000044 +:10EC200000000000000000000000000008000000DC +:10EC300000000000821000000000821000000000B0 +:10EC400000080008000000000008000800000000A4 +:10EC5000008800000000000000080008000000001C +:10EC60000008000800000000020800080000000082 +:10EC70000000000000000000000800080000000084 +:10EC80000000000800084000000000080008000024 +:10EC90000000000000080000000000080010000054 +:10ECA000000000100010050000000010001000001F +:10ECB0000000000000100000000000100000000034 :10ECC0000000000000000000000000000000000044 :10ECD0000000000000000000000000000000000034 :10ECE0000000000000000000000000000000000024 :10ECF0000000000000000000000000000000000014 :10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000800EB -:10ED200000000000000000000000000000000000E3 -:10ED3000000008000000000084000800C00000007F +:10ED100000000000000000000000000000000000F3 +:10ED20000000000000000000000008000000880053 +:10ED3000000000000000840000000000000000004F :10ED400000000000000000000000000000000000C3 :10ED500000000000000000000000000000000000B3 :10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 +:10ED7000000000000000000800000000000000008B :10ED80000000000000000000000000000000000083 :10ED90000000000000000000000000000000000073 :10EDA0000000000000000000000000000000000063 :10EDB0000000000000000000000000000000000053 -:10EDC0000000000000000000000000000000000043 -:10EDD0000000000000000000000000000000000033 +:10EDC00000000000000000000000004000400000C3 +:10EDD00000400000000000000000000000000000F3 :10EDE0000000000000000000000000000000000023 :10EDF0000000000000000000000000000000000013 -:10EE0000000000000000C000000000000000000042 -:10EE1000000000000000000000000000A000000052 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 :10EE200000000000000000000000000000000000E2 :10EE300000000000000000000000000000000000D2 -:10EE400000000000000000000000040000000000BE -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000002000000A0 -:10EE70000000000000000000000000000000000092 +:10EE400000090000000000000000000000040000B5 +:10EE50000000000200000000000000000000009020 +:10EE600000000000000000000000000000000000A2 +:10EE7000040000000000000000000000000000008E :10EE80000000000000000000000000000000000082 :10EE90000000000000000000000000000000000072 :10EEA0000000000000000000000000000000000062 -:10EEB0000000000000000000000000000000000052 -:10EEC0000000000000000000000000000000000042 -:10EED0000000000000000000000000000000000032 +:10EEB0000000000000000000000000002000000032 +:10EEC00000000000000000000000000090000011A1 +:10EED0000000C00000000000000000000000000072 :10EEE0000000000000000000000000000000000022 :10EEF0000000000000000000000000000000000012 -:10EF000000000800000000000000000000000000F9 +:10EF00000000000000000000000000000000000001 :10EF100000000000000000000000000000000000F1 :10EF200000000000000000000000000000000000E1 -:10EF300000000000000000000000000000000800C9 +:10EF300000000000000000000000000000000000D1 :10EF400000000000000000000000000000000000C1 :10EF500000000000000000000000000000000000B1 :10EF600000000000000000000000000000000000A1 :10EF70000000000000000000000000000000000091 :10EF80000000000000000000000000000000000081 -:10EF90000000000000000000000000000800000069 +:10EF90000000000000000000000000000000000071 :10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC0000000000000000000000000000000000041 +:10EFB0000800000000000000000000000000000049 +:10EFC000000000000000000000000000000300003E :10EFD0000000000000000000000000000000000031 :10EFE0000000000000000000000000000000000021 :10EFF0000000000000000000000000000000000011 :10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000008000000E8 +:10F0100000000000000000000000000000000000F0 :10F0200000000000000000000000000000000000E0 :10F0300000000000000000000000000000000000D0 -:10F0400000000000000000000000000000000000C0 -:10F0500000000000000000000000000000000000B0 +:10F040000000000000000000000000002000200080 +:10F050000004210400000000000000000000410046 :10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 +:10F070000000000000000000000000400000000050 :10F080000000000000000000000000000000000080 :10F090000000000000000000000000000000000070 :10F0A0000000000000000000000000000000000060 @@ -24483,38 +24483,38 @@ :10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 :10F9E0000000000000000000000000000000000017 -:10F9F00000000000200000000000200000000000C7 -:10FA00000000200000000000200020000000200076 -:10FA10002000000020000000000020000000000086 -:10FA20000000200000000000200020000000200056 -:10FA30002000000000002000000000000000000086 -:10FA40000000000020000000000000000000000096 -:10FA50002000000000000000000000000000000086 +:10F9F0000000200000000000200082002000200005 +:10FA00002000200000002000200020002000200016 +:10FA10002000200000000000200000002000200046 +:10FA20002000200000008400200020002000200092 +:10FA30002000000020000000000020000000000066 +:10FA40002000200020000000200020000000000016 +:10FA500000000000000000000000000000000000A6 :10FA60000000000000000000000000000000000096 -:10FA70000000000000000000000000000000000086 -:10FA8000000400020000000000000004000000026A +:10FA70000000000000000000000000004000000046 +:10FA80000040000000000000000000000000000036 :10FA900000900000000000000000000000000000D6 -:10FAA0000000000000000000000000000000000056 +:10FAA0000000000000000000200000000000000036 :10FAB0000000000000000000000000000000000046 -:10FAC0000040004000000000000000002000200076 -:10FAD0000000000000000000200000000000000006 -:10FAE0000000000000000000000000000000000016 -:10FAF00000200000000000000000000000000000E6 -:10FB000000000000000000000000000000000000F5 +:10FAC0000000000000000000000000000000200016 +:10FAD00000000000000020000000000020000040A6 +:10FAE00000000000002000000000002000000000D6 +:10FAF000000000000000410040000300020000413F +:10FB000000000000000082008800880088000000DB :10FB100000000000000000000000000000000000E5 -:10FB200000000000000000000000000000000000D5 +:10FB200000000010000000000000000000000000C5 :10FB300000000000000000000000000000000000C5 :10FB400000000000000000000000000000000000B5 -:10FB50000000000000000800000000000000080095 -:10FB60000000000000000000000000000000000095 -:10FB70000000000000000000000000000000000085 -:10FB80000000000000080008000000000200000063 -:10FB90000000000000000000000000000000000065 -:10FBA0000000000000080004000000000000000049 +:10FB500000000000000000000000000000000000A5 +:10FB60000000040000000000000000000000000091 +:10FB700000000000000002008400800010008000EF +:10FB8000000000C0000000000040118800000000DC +:10FB90000000000000000300400000000000090019 +:10FBA000000000000800000000000000000000004D :10FBB0000000000000000000000000000000000045 -:10FBC000000000000000000800000000000000002D +:10FBC0000000000000000000000000000000000035 :10FBD0000000000000000000000000000000000025 -:10FBE0000000000000000010000000000000000005 +:10FBE0000000000000000000000000000000000015 :10FBF0000000000000000000000000000000000005 :10FC000000000000000000000000000000000000F4 :10FC100000000000000000000000000000000000E4 @@ -24524,81 +24524,81 @@ :10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 :10FC70000000000000000000000000000000000084 -:10FC80000000000000000000000000000000000074 +:10FC8000000000000800000000000000000000006C :10FC90000000000000000000000000000000000064 :10FCA0000000000000000000000000000000000054 :10FCB0000000000000000000000000000000000044 -:10FCC000000000000000080000000000000000002C -:10FCD000000000000000000000000000080000001C -:10FCE000000000000000000000000000000008000C -:10FCF0000000000000000000000000000000000004 -:10FD000000000000000000000000000000020000F1 -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000000200000000000000002B1 -:10FD300000000000000000200000000000000000A3 +:10FCC000000000000000000008000000000000002C +:10FCD0000000000000000000080000000800000014 +:10FCE00041000000000000000000000008000000CB +:10FCF0000000000000000000000000000000010003 +:10FD00000500044004040004000400040004004052 +:10FD100000410000A00000000000000020000000E2 +:10FD200000000000000000000000001000000000C3 +:10FD300000000000000000000000000000000000C3 :10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 :10FD60000000000000000000000000000000000093 :10FD70000000000000000000000000000000000083 -:10FD80000000000000000000000000000000000073 -:10FD9000000000000400000000000000000002005D -:10FDA0000000000000000000000000000000000053 +:10FD80000200A00080898000000000000000000048 +:10FD9000000000000000210000000000000000043E +:10FDA0000000000000000000090000000000030047 :10FDB0000000000000000000000000000000000043 :10FDC0000000000000000000000000000000000033 :10FDD0000000000000000000000000000000000023 :10FDE0000000000000000000000000000000000013 -:10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000000000000000F2 +:10FDF00000000000000008002000000000000000DB +:10FE0000000400090000000800800000001100004C :10FE100000000000000000000000000000000000E2 :10FE200000000000000000000000000000000000D2 :10FE300000000000000000000000000000000000C2 :10FE400000000000000000000000000000000000B2 :10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 +:10FE6000080000000000000000000000000000008A :10FE70000000000000000000000000000000000082 -:10FE80000000000000000000000000000000000072 +:10FE80000000000000000000000100040900000064 :10FE90000000000000000000000000000000000062 :10FEA0000000000000000000000000000000000052 :10FEB0000000000000000000000000000000000042 :10FEC0000000000000000000000000000000000032 :10FED0000000000000000000000000000000000022 :10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 -:10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000000000000000E1 +:10FEF00000000800000000000000000000000000FA +:10FF000000000000000001000000010301000005E6 +:10FF100000000000020000090000000000000000D6 :10FF200000000000000000000000000000000000D1 :10FF300000000000000000000000000000000000C1 :10FF400000000000000000000000000000000000B1 :10FF500000000000000000000000000000000000A1 :10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 -:10FF90000000080000000000000000000000000059 -:10FFA0000000000000000000000000000000000051 -:10FFB0000000000000000000000000000000000041 +:10FF7000000000000000000000000000000002007F +:10FF8000000000000000000020840000200020008D +:10FF9000000002000000000020000000000021001E +:10FFA000000002000000000000000000000000004F +:10FFB0000800000000000500000000000000000034 :10FFC0000000000000000000000000000000000031 :10FFD0000000000000000000000000000000000021 -:10FFE0000000000000000000000000000000000011 +:10FFE000050000000000000000000000000000000C :10FFF0000000000000000000000000000000000001 :020000040006F4 -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 +:100000000000000000000000210200C1A0000089E3 +:10001000A00400000000000000000000000000003C :1000200000000000000000000000000000000000D0 :1000300000000000000000000000000000000000C0 :1000400000000000000000000000000000000000B0 :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 +:1000800000000000000000000000000011C180001E +:100090004108000000000000000000000000000017 :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 :1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF +:1001000000000000000000000000000000000021CE +:10011000000400210080000000000000000000003A :1001200000000000000000000000000000000000CF :1001300000000000000000000000000000000000BF :1001400000000000000000000000000000000000AF @@ -24606,7 +24606,7 @@ :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F :10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F +:1001900000010000000100C000000000000000009D :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F :1001C000000000000000000000000000000000002F @@ -24614,7 +24614,7 @@ :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF :1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE +:10021000000084A0A000008801C0000000000000D1 :1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE @@ -24622,7 +24622,7 @@ :10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E +:100290000000000000008000410008800000000015 :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E @@ -24630,7 +24630,7 @@ :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED -:1003100000000000000000000000000000000000DD +:10031000000000000000A1400041000000000000BB :1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD @@ -24638,7 +24638,7 @@ :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D -:10039000000000000000000000000000000000005D +:100390000000000000000000C10100018800C00052 :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D @@ -24646,24 +24646,24 @@ :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC +:10041000000000000000000000000000000180005B +:100420008221000000000000000000000000000029 :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C +:100490000000000000000000000000000C0C0F0F26 +:1004A00000FF003C00000000000000000000000011 :1004B000000000000000000000000000000000003C :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB +:1005100000000000000000000000000000000C0CC3 +:1005200000000000003C000000000000000000008F :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B @@ -24679,7 +24679,7 @@ :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA -:1006200000000000000000000000000000000000CA +:1006200000003030F0F0000000000000000000008A :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA :10065000000000000000000000000000000000009A @@ -24687,7 +24687,7 @@ :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A -:1006A000000000000000000000000000000000004A +:1006A00000000000303000000000000000000000EA :1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A @@ -24695,7 +24695,7 @@ :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 +:10072000000000000000A061500F009D00A000002C :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 @@ -24703,7 +24703,7 @@ :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 +:1007A00000000000000000000000FFFF000000004B :1007B0000000000000000000000000000000000039 :1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 @@ -24711,7 +24711,7 @@ :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 -:1008200000000000000000000000000000000000C8 +:10082000000000000000000000000000FFFF0000CA :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 @@ -24719,7 +24719,7 @@ :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000000048 +:1008A000000000000000000000000000F0F0FFFF6A :1008B0000000000000000000000000000000000038 :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 @@ -24728,7 +24728,7 @@ :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 +:100930000F0F000000000000000000000000000099 :1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 @@ -24736,218 +24736,218 @@ :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 -:1009B00020002000000020000400200000000000B3 -:1009C00000000000200020030000000000000000E4 -:1009D0002000200000002000000020000000000097 -:1009E00000000000200020000000000000000000C7 -:1009F0000000200020000000200000002000000077 -:100A000000000000000020002000000000000000A6 +:1009B00000800100008000808200000000008200B2 +:1009C0002000200004000000880000000000020059 +:1009D000000002000000000020004000880020000D +:1009E00084000000000000008800000000002000DB +:1009F000000300002000000000000000400088000C +:100A0000880020000000000000000000000000003E :100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A30000000000000000000000020000000000096 -:100A40000020000000000000002000000020000046 +:100A20000000000000000000000000400000000086 +:100A30000000402004000020002000000000000012 +:100A400000000000410080A0000000000000000045 :100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 +:100A6000000000000000000000000900000000007D :100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 -:100A900000000020002000000020000000200000D6 -:100AA0000000000000000020002000000000000006 -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000003000043 +:100AB00000000000040004000020002000000000EE +:100AC0000000004100400000002000000040020043 +:100AD00000000021000000000000000000000000F5 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000002000000000000000000D3 -:100B200000000000000000000000000000000200C3 -:100B300002000000020000000000000800080000A1 -:100B40000008000800080000000000000008000085 -:100B50000000000800080000000000080008000075 -:100B60000008000800080000000000000008000065 -:100B70000000000800080000000000000008000855 -:100B8000000000080008000800000000000000103D -:100B9000000000000008001000000000001000101D -:100BA0000000001000100010000000000000000015 -:100BB00000000000004000000000000000000000F5 -:100BC0000000000000000000040000000000000021 -:100BD0000000000000000000000000000000000015 +:100B000000000000000000000000020000000000E3 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B30000200880088008000800000010001000899 +:100B40000000000000080208000000010088000802 +:100B50000000000005080000000000000000000880 +:100B6000000000000008000820000000000000084D +:100B7000000000000008000000000000000000006D +:100B800020080000000000080008000080000000AD +:100B90000008000000000008000000000000000045 +:100BA00000100000000000100040000000000000E5 +:100BB00000400000000000400000000000000002B3 +:100BC0000000000000000000000000000000C00065 +:100BD0000000000000000000000000000000010014 :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 +:100C000000000000000000000100000000000000E3 :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 +:100C60000400000000000000000000000000000080 :100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 +:100C80000000000000000000000004000000000060 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 -:100CC0008200820000000000000000000800040014 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 -:100D400010000000400041001000100000000000F2 -:100D5000000000000000080010000000000000007B -:100D60000300210040000800000000000000000017 +:100CC00000008200900900000000080000200020C1 +:100CD0000000002090000000A000000002000000C2 +:100CE0000000000082000000000090008200000070 +:100CF00008000000000000000400820000008400E2 +:100D000000000000C000000000000000080000001B +:100D10000000000083000800000000000800000040 +:100D200000000000840000000000080082000000B5 +:100D300000000000000000000000000200000000B1 +:100D4000000000000000000020000000050000017D +:100D50000001008811890288000000000000800066 +:100D600002400000410003001000050000000000E8 :100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC00000008200000000000000000000000000A1 -:100DD000000000000000000000000000080000000B -:100DE0000000C00000000000000000000000000043 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 +:100D800000000800000041001000080000000800FA +:100D90000000000000000200002000000000000031 +:100DA00000000800410003000300080000000000EC +:100DB0000000000000000000002000000000000013 +:100DC000000000000000000088000000A0000000FB +:100DD000000000000000000082000000000082000F +:100DE00000000000002000000000000000000000E3 +:100DF00000000000000000000800000000000000EB +:100E0000000082000000820000000040000000207E :100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 +:100E20008200000000000000000000000000000040 +:100E30000000080000000000820000000000002008 +:100E40000000008400840000002000002100000059 +:100E50002100000000000000000000000000000071 +:100E60000000000000000001000000000000000081 :100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 +:100E80000000000000000000000000000001000061 +:100E90000001000000000000000000000000000051 :100EA0000000000000000000000000000000000042 :100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED000000000000000000000000000000008000A -:100EE00040000000000000000000000000000000C2 -:100EF00000000000000000000000000000000000F2 +:100EC00000000000000090000800900000020002F6 +:100ED000000000000000000008000000000000000A +:100EE0000000000000000000000000000000000002 +:100EF00000090000000000000000000000000000E9 :100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 +:100F100000000800C000010001000009008000007E :100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F40000000000000000000000000000000110090 -:100F50000020000000000000080003000300000063 -:100F60000400000008000300210000000000410010 -:100F70000000000000000000000000000020000051 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 +:100F300000000000000000000000000002000000AF +:100F400000000000000000000900000000002088F0 +:100F500000040000200002000800000000C00000A3 +:100F60000000000000000000000000000000080079 +:100F700000000000088808000800000000020000CF +:100F800000000000000000000000008200000000DF +:100F90000800000000000300020002000000002022 :100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 +:100FB0001000000000000800000000000000000019 +:100FC00000000000000041000000000000000000E0 :100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 +:100FE000000000000000000000009000000200006F :100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 +:1010100000000000900200000000000000900000AE :1010200000000000000000000000000000000000C0 :1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 +:101040000000101000200082C040000000000000DE :101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 +:10106000000000000000000000001100800000806F :101070000000000000000000000000000000000070 :101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 +:1010900000000000110080800000000000000080BF :1010A0000000000000000000000000000000000040 :1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 +:1010C00000000000008000000000800000000080A0 +:1010D0000000008000000000000000000000000090 +:1010E0000000000000000000000000000000008080 +:1010F0000000008000000000000000000000000070 :1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF +:1011100000000000000000000080000000800000CF +:10112000000000000080000000000000000000003F :1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F +:10114000000000000000000000C10002008000005C +:101150000008000000C000000000000000000000C7 +:10116000002000000040000000000000000000001F +:101170000020000000C0000000000000000000008F :10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F +:10119000000000000000000000000020000000C06F +:1011A0008800009000000004000000000000000023 :1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF +:1011C0000000000000000000040008828285400248 +:1011D00001000000400001000000000000000000CD +:1011E00000000000020000000000000000000000FD +:1011F000010000880800010000000000000000005D :1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000000BE +:10121000000000000000000000000100008808003D +:101220000100000000000490000000000000000029 :1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E +:1012400000000000000000000000C090000240828A +:1012500082404100000080002000000000000000EB +:1012600000000300000080000000000000000000FB +:101270000000410000808000090000000000000024 :10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E +:10129000000000000000000000000000410000808D +:1012A0008000090040000000808000000000000075 :1012B000000000000000000000000000000000002E -:1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E +:1012C000000000000000000000000000000000809E +:1012D00000000000002000000000000000000000EE :1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE +:1012F000000000000011000000800000000000005D :1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD +:1013100000000000000000000000000000000011BC +:1013200000000080000000118000000000000000AC :1013300000000000000000000000000000000000AD :10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D +:10135000000000008000000100000000000000000C :10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D +:10137000000000000000000100000040000000002C :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D +:1013A00000010000004000000001200000000000DB :1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED +:1013D000900088A040080400000000000700840A74 +:1013E00000000000000000000000000007000000F6 +:1013F0000000000000000000000000000700822143 :1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC +:10142000000000000000070082210000000007000B :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C +:10145000000000000000000000820000000000000A :10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C +:101470000000000000000000000000000000F0F08C :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C +:1014A0000000000000000000F0F0000000FF00005D +:1014B00000FF00000000000000000000000000002D :1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C +:1014D0000000000053535353000F55C30000000099 :1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB +:10150000F0F00000000000000000000000000000FB :1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB +:1015200000000000000000000000F0F0000000FFDC +:10153000000000FF000000000000000000000000AC :10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B +:10155000000000000000FF0FF000FF0F55C3000067 :10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B +:101580000F0F0000FFFF000000000000000000003F :10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B +:1015A00000000000000000000000FF000000FFFF3E +:1015B0000000FF0000003C3C0000000000000000B4 :1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B +:1015D0000000000000000000808C838FC3F0AA0090 :1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA +:1016000000000F0F000000000000000000000000BC :1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA +:10162000000000000000000000000000FF000000BB +:1016300000000000FF0000003C3C00000000000033 :10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A +:1016500000000000000000000000B0BCB3BFC3F0F9 +:10166000AAFF05180A00050005A000000000000000 +:10167000000005180A00050005A000000000000099 +:10168000000005002A00054000A80000000000003E :10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B000000000000000000000000000000000002A +:1016A00000000000000000000000000005002A000B +:1016B000054000A815002A00054000A80000000011 :1016C000000000000000000000000000000000001A :1016D000000000000000000000000000000000000A -:1016E00000000000000000000000000000000000FA +:1016E00000C000000000000000000000000000003A :1016F00000000000000000000000000000000000EA :1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 @@ -24980,176 +24980,176 @@ :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 :1018E00000000000000000000000000000000000F8 -:1018F00000000000200000000000000500000000C3 -:101900000000000000000000008400000000000053 -:1019100000000020000000000000000000000000A7 -:1019200000000000000000000180018800010000AC -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 +:1018F00088000200000000000000000082000000DC +:10190000880000002000000000008480840088001F +:101910008800200000000000000004000400000017 +:101920008800880000000000040020000003200060 +:10193000200020002000880000000000200000009F +:101940000000200000000000000000001000000067 :101950000000000000000000000000000000000087 :101960000000000000000000000000000000000077 -:101970000000002000000000000000000000000047 -:101980000000000000000000000000210000000036 +:101970000000000000000000000000000000200047 +:101980000000000000000000000000000004000053 :101990000000000000000000000000000000000047 -:1019A00000000000000000000000202008210000CE -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000081000BE -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000800082B4 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000200000000000000046 -:101A8000000000000000000000000000000000094D -:101A900080080000000000000000000000000000BE -:101AA000000000000000000000000000000000082E -:101AB0000005000000000000000000000000000021 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000020000000000000000000025 +:1019C0000000000000000000000040000000800057 +:1019D0000000000000000000000200000000000005 +:1019E00000000000000000000004000000000000F3 +:1019F0000000000082000000000000000000000065 +:101A000000200000040000030000000000000000AF +:101A100000000200000000000000000000000000C4 +:101A200000000000000000000000000000001100A5 +:101A30000000000000000000880000008800000096 +:101A40008800000000000000000088000000000086 +:101A50000000000088000000000000000000880076 +:101A60008800880084008800000002000000000058 +:101A700000000000000000020000000000000084E0 +:101A80000000000000A0000000000000008800002E +:101A9000000040A000000000000000000000000066 +:101AA0000000200000000000000000000000000016 +:101AB000A000000000000000000000000000000086 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B1000000008A00000000000000000000000001D +:101AE00005000000000000000000000000000000F1 +:101AF00000000000002100000005000500000000BB +:101B00000021000000410000000000000000000073 +:101B100000101000000000000000000000000000A5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 +:101B50000000000001040000000000000000000080 :101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000110000000000000000000034 -:101BA0000000000000000000000000000000000035 +:101B700000000000008000000000000008000000DD +:101B80004100000000C00000000000000000000054 +:101B900000000000800000000000080000000000BD +:101BA000000000000000000000000000000008002D :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF000000000000000000082008200820000005F -:101C000000000000000000000000000000000000D4 -:101C100000000200000002844000000000000000FC -:101C20000000000000000000840000000000000030 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000300000000000041 -:101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF000000000000000000000000000A000000044 -:101D00000000000000000000820000000800000049 -:101D1000000000000000080000000800A000000013 -:101D2000C000000084000000A000000000000000CF -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 +:101BD00000000000000020000000000000000000E5 +:101BE00000000000000000000000090000000000EC +:101BF00000000000000000080000820082002000B9 +:101C0000820020000800200020004000A000820088 +:101C1000820082000000820082000400A000820096 +:101C20008200820000008200000082000800820022 +:101C30008200820004008200000000008200820016 +:101C40000000820082000009820200004000820041 +:101C50000800A0008200080008000800820082003E +:101C6000000008000000000000000041000000002B +:101C7000000000000000000900400000000000001B +:101C800000000000000000000088000005000000C7 +:101C90001100000000000000000000000000000033 +:101CA000000000000000000000000500050000002A +:101CB0000400000000000000000000000000000020 +:101CC00009000000000000000000000040000000CB +:101CD0000000000200000000000000000000000002 +:101CE0000000000000000000000021004000210072 +:101CF0004100000000000000000000001000000093 +:101D0000A000000000000000000000000000000033 +:101D100000000000000000000000000010000000B3 +:101D200000000000000000000000000000000000B3 +:101D30008200000000000000000000000000100011 +:101D4000000000000000000000000000080000008B +:101D5000000008000000000000000000000000007B +:101D600000000000A0008200000000000800000049 +:101D700000000800000000000000000000800000DB +:101D8000000000000000000000000000080000004B :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 :101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 +:101DC000000000000000000000840000000000008F +:101DD00008000000000000000000000000000000FB :101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000400A000A020820082000800000062 -:101E10000000000000000000900000000000000032 -:101E200000000000040000000800C00000000000E6 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 +:101DF00000000000000000000400000000040804CF +:101E00000008000000000204000000002004C004DC +:101E100000000000000000000000004182000000FF +:101E20004000820082000800A00040000000000086 +:101E30000000000082000020000000000000000000 +:101E400000000800080008000800A0004000000092 +:101E500000009011000008000000000000000000D9 +:101E60008202000008000800080000004000000096 +:101E7000000000000000080000000000000000005A +:101E800000000088000000000000000000000000CA :101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 +:101EA000050000000000000000000000000000002D :101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 +:101EC00000000000000000000000000000002100F1 +:101ED000210011000000000000000000000041008F :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F1000000001820100C1000082C0820000C000F8 -:101F200000010000000000000000000101000000AE -:101F3000000000820000C0000088C0820000C000D5 -:101F40000001000000000000000000000000000090 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000040000011 -:101F90000000000504002040820000008080000056 -:101FA000800000030000000000000000002004008A -:101FB0000000004103000005850000008080000053 -:101FC000800000030000000000000000000000008E -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000020000000000CE -:102010000000020000001000820021000000030008 -:102020008000000000A0800300000200000000000B -:1020300000000200000020000800830000000300F0 -:102040000000000000808010000000000000000080 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:10208000000000000000000000000000010000004F -:10209000000000000100000001000500A040000059 -:1020A00001004000000000C18200000001000000AB -:1020B00000000000010000000100840003C00000D7 -:1020C00001208400000000C0820100000000000028 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:10211000000000000000000000002000004000005F -:10212000410000000000000000000000000000006E -:10213000000000000000000000014000004000001E -:10214000030000000000000000000000000000008C -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:1021900000000000000000000000000300050080B7 -:1021A00000004100000000000000004100000000AD -:1021B00000000000000000000000000200200000FD -:1021C0000000C1000000000000000041000000000D -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE -:102210000000000200830000000080002000000099 -:1022200000C1800000050000004100000000032004 -:102230000000000200830000004000009000000049 -:1022400000020000004100000041002000000340A7 -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E -:102290000000000082010083000000000400C10073 -:1022A0000000000304000000000000010000000026 -:1022B00000090000820100830000000020004100AE -:1022C000000000912000000000000001000000005C -:1022D00001200000000000000000000000000000DD -:1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000811200E0800048420000000030 -:102330000000484200000000000000000000000013 -:1023400000000000411200E02200484200000000AE -:1023500000004842000000000000000000000000F3 -:10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D +:101F00000000000000010001000100C1000100010B +:101F100000C10005010000010040008200014001F5 +:101F200000C0000000010001000100C0000100012C +:101F300000C10003010000010082008800010201CD +:101F400000C00000000000010001000100C000010D +:101F5000000100C100030001000100400008000171 +:101F6000020100C0000000010001000100C00001EA +:101F7000000100C100410000010100400002000119 +:101F8000020100C000000041004100410084004106 +:101F9000004100A005412020404100000000004118 +:101FA000804100C0000000410041004100C00041EC +:101FB000004100A005C12020204100000000004198 +:101FC000804100850000000000410041004100C048 +:101FD00000410041008805C100022041000000804E +:101FE000004180410085000000410041004100C0E7 +:101FF00000410041008205410020024100000080B4 +:102000000041804100850000410003000000008085 +:1020100041008400000004000800A000008085004A +:102020004100C1000040800041000300000000802A +:102030004100C00000000900050002000080A0006F +:102040004100C1000080800000004100030000004A +:1020500000804100C00000002000050002000000D8 +:10206000A0004100C100008080004100030000008A +:1020700000804100C000000020004000400000003F +:1020800088004100C10000808000010001000000C4 +:1020900000C00100C10000000000850082840040F3 +:1020A000C0A04100C100004082000100010000000A +:1020B00000C00100C000000000004000914000404E +:1020C000C1004100C10000048200000301000100C2 +:1020D000000000C00100C0000000000002009140AC +:1020E0000090C1004100C100000482000100010015 +:1020F000000000C00100C000000000000800200433 +:102100000090C0004100C1000004820000C0000136 +:10211000C0C1000000000001C0C0848300C10001F4 +:1021200000C10000000000010000000000C000012C +:10213000C0C100000000000100C0408300C10001D8 +:1021400000C100000000000100000000000000C00D +:102150000001C0C100000000000100C14083004137 +:102160000001C0C10000000000010000000000C02C +:102170000001C0C100000000000100C1C083004197 +:102180000001C0C10000000000010000000000804C +:10219000004180C100000000004100C100A00041DA +:1021A000004100C10000000000410040000000802C +:1021B000004180C100000000004100C1002000413A +:1021C000004100C1000000000041000500000000C7 +:1021D0000080004180C100000000004100A00020FC +:1021E00000C1004180C10000000000410005000066 +:1021F0000080004180C100000000004100A080205C +:1022000000C1004180C10000000000410005000045 +:10221000C100800080C100004104804004004100F2 +:10222000C14180008010000041000000800041009A +:10223000C100800080C100004140800005004100D5 +:10224000C14180008010000041000000800041007A +:102250000000C100800080C1000041008040850076 +:102260004100C1418000801000004100000080005A +:102270004100C100800080C1000041008040850015 +:102280004100C1418000801000004100000080003A +:102290004100C1004000C0C1000001014001030035 +:1022A0000100C1050800C001000001000000C000DD +:1022B0000100C1004000C0C1000001010400840011 +:1022C0000100C1830400C001000001000000C00043 +:1022D00001000000C1004000C0C100000100040076 +:1022E00082000100C1050400C001000001000000DF +:1022F000C0000100C1004000C0C100000100040096 +:1023000082000100C1830400C00100000100000040 +:10231000C0000100000000000000004200000000BA +:10232000000000008112004107004800000000008A +:10233000000000000000000000000042000000005B +:10234000000000008112004107004800000000006A +:10235000000000000000000000000000004200003B +:102360000000000000008112004107004806000044 +:10237000000000000000000000000000004200001B +:10238000000000000006811200410700480600001E :10239000000000000000000000000000000000003D :1023A000000000000000000000000000000000002D :1023B000000000000000000000000000000000001D @@ -25170,110 +25170,110 @@ :1024A000000000000000000000000000000000002C :1024B0000000000000000000DEAE757B00000000A0 :1024C000000000000000000000000000000000000C -:1024D0000000000000000000DEAE00000000000070 +:1024D0000000000000000000DEAE0000757B000080 :1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC +:1024F00000000000000000000000DEAE757B000060 :1025000000000000000000000000000000000000CB -:1025100000000000000000000000000061260340F1 -:102520000000000000000230A000000000000000D9 -:102530000C4000000000000002C0648661260340D9 -:102540000000000000000230A000000000000000B9 -:102550000C4000000000000002C064860000000083 -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000020001B -:1025A00000002000200000000000000000000000EB -:1025B00000002000000020000000000000000000DB -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB +:1025100000000000000000000000DEAE60C6030006 +:102520000000000000000031E0000000000000009A +:102530000C0000000000000000C0630660C603003D +:102540000000000000000031E0000000000000007A +:102550000C0000000000000000C06306000060C620 +:1025600003000000000000000031E0000000000057 +:1025700000000C0000000000000000C0630660C600 +:1025800003000000000000000031E0000000000037 +:1025900000000C0000000000000000C06306000006 +:1025A0000000000000008800880000000000020019 +:1025B0000000200000000000000000008400000077 +:1025C000000000000000000000000000040088007F +:1025D00000002000000000000000000020000003B8 +:1025E00000000000000000000080000000000080EB +:1025F0000000880020000000000000000000000033 :1026000000000000000000000000000000000000CA :1026100000000000000000000000000000000000BA -:10262000000000000000000000202020002000002A -:10263000000000000000000000200020000000005A +:10262000000000000000000000000040000000006A +:102630008000000000000000000005000000000015 :10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:10267000000000000000000000000000000000005A +:102650000000000000000000050005000000000070 +:102660000000000000000002000000080000000060 +:10267000000800000000000000000402000000004C :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B0000000000000000000000900000000000011 -:1026C000000000000000000000000000000000000A +:1026A0000004000000000010000000000000000016 +:1026B0000000000000410000004100000000000098 +:1026C00000000000000000000040000002000000C8 :1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F00000000000000000000000000000000000DA +:1026E00000000000000000000000000000000100E9 +:1026F000000800000000880020000000000000002A :1027000000000000000000000000000000000000C9 -:1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000008000091 +:10271000000000000200000000008400840084002B +:1027200084000200000000000000000000C0000063 +:102730000000001000000000000000000000000089 :102740000000000000000000000000000000000089 -:102750000000000000000000000000000008000071 +:102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000851 -:102780000000000000000000000000000000000049 -:1027900000000000000000000000000000000040F9 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 +:102770001000000100000000000000000000000048 +:102780000000000000000000000000000000090040 +:102790000000000000000000000000000000000039 +:1027A00000000000000000000000000000410000E8 +:1027B0000000000000000000000000000100000018 :1027C0000000000000000000000000000000000009 :1027D00000000000000000000000000000000000F9 :1027E00000000000000000000000000000000000E9 :1027F00000000000000000000000000000000000D9 :1028000000000000000000000000000000000000C8 :1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000300A5 -:102830000000000000000000000000000000000098 -:102840000000000000000000410000002100210005 -:102850002100000003002100000000000300000030 -:102860000800000000000000000000000000000060 -:102870000000000000000000000000000000000058 +:1028200000008800000040000000000000000000E0 +:102830000300080000000000000000000000040089 +:102840000000000000000020000000000000000068 +:102850000800080000000000000000000000000068 +:102860000000000000000000000000000000000068 +:102870002100000003000000000000000000000034 :102880000000000000000000000000000000000048 -:102890000000000000000000000000000000000038 +:1028900021000300410000000000000000000000D3 :1028A0000000000000000000000000000000000028 -:1028B0000000000000000800080000000000000008 -:1028C00000000000000008000000000000000800F8 -:1028D00000000000000000000000000000000000F8 -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 -:1029000000000000000000000000000000000000C7 +:1028B0000000000000000000000000000000018097 +:1028C0000180000000000000C000040000000000C3 +:1028D000000000000000000082000800000000006E +:1028E0000000000040000000820000000000040022 +:1028F00000000000000900090009090000000000B4 +:10290000000000004009000000000000000000007E :1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 +:102920000000000000400000000400000000000063 :102930000000000000000000000000000000000097 -:102940000000000000000000000000000000000087 +:102940002020020400000000000000000000000041 :102950000000000000000000000000000000000077 :102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 +:102970000000000000000000000000002000000037 :102980000000000000000000000000000000000047 -:102990000000000000000000000000000000000037 +:1029900000000000210000004100000000000000D5 :1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C00000000000000000000800000000000000FF +:1029B00000000000000000000000900090001000E7 +:1029C00000000000100000000000000000000000F7 :1029D00000000000000000000000000000000000F7 -:1029E0000000008000000000000000000000000067 +:1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 +:102A000000000000000000000000000000000800BE +:102A100000000000C00000000000000000000000F6 :102A200000000000000000000000000000000000A6 -:102A30000000000000002100000000000300000072 -:102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000500000071 -:102A600009000000001000880000000021000000A4 +:102A30000000000000000000001000000000000086 +:102A4000800000000800800000000000000000007E +:102A50000000000000000000000000000000000076 +:102A6000032000000800000000000000000000003B :102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 +:102A800000C0080003000800000000000000000073 :102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000820084 -:102AD0008200080000000000080000000000000064 -:102AE00000000000000008000000000000000000DE -:102AF00000000000000000000000000000000000D6 +:102AA0000000020008000800000000000000000014 +:102AB0000000001000000000000000000000000006 +:102AC00000000000010000000000000000000009FC +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF0004000000082000000000000000000000014 :102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 +:102B10000000820000000000000000000000000033 :102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 +:102B3000000000000000090000000000000000008C +:102B40000000000020002000000000000000000045 :102B50000000000000000000000000000000000075 :102B60000000000000000000000000000000000065 :102B70000000000000000000000000000000000055 @@ -25281,80 +25281,80 @@ :102B90000000000000000000000000000000000035 :102BA0000000000000000000000000000000000025 :102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 +:102BC00000000000000001009084000000000000F0 :102BD00000000000000000000000000000000000F5 :102BE00000000000000000000000000000000000E5 :102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 +:102C000001000000000000000000000000000000C3 :102C100000000000000000000000000000000000B4 :102C200000000000000000000000000000000000A4 :102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 +:102C400000000000000000001100A10000000000D2 :102C50000000000000000000000000000000000074 :102C60000000000000000000000000000000000064 :102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 +:102C80000000110000210000000000000000000012 :102C90000000000000000000000000000000000034 :102CA0000000000000000000000000000000000024 :102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 +:102CC0000000000000000000000000080980000370 :102CD00000000000000000000000000000000000F4 :102CE00000000000000000000000000000000000E4 :102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 +:102D00000000000000200000110200000000000090 :102D100000000000000000000000000000000000B3 :102D200000000000000000000000000000000000A3 :102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 +:102D4000000000000000000000000000000101027F +:102D500000000088000000000000000000000000EB :102D60000000000000000000000000000000000063 :102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 +:102D80000000000000000000000001010000000041 :102D90000000000000000000000000000000000033 :102DA0000000000000000000000000000000000023 :102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 +:102DC0000000000000000000000000000000010002 +:102DD00088880800000000000200000000000000D9 :102DE00000000000000000000000000000000000E3 :102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 +:102E000000000000000000000000200000010000A1 :102E100000000000000000000000000000000000B2 :102E200000000000000000000000000000000000A2 :102E30000000000000000000000000000000000092 :102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 +:102E50004100008080004100000080000000000070 :102E60000000000000000000000000000000000062 :102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 +:102E800000000000000000000000000080000008BA +:102E900040000000000000000000000000000000F2 :102EA0000000000000000000000000000000000022 :102EB0000000000000000000000000000000000012 :102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 +:102ED000000000110000008004000000000000005D :102EE00000000000000000000000000000000000E2 :102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 +:102F000000000000000000000000000000051100AB :102F100000000000000000000000000000000000B1 :102F200000000000000000000000000000000000A1 :102F30000000000000000000000000000000000091 :102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 +:102F5000000000000001000000400100000000002F :102F60000000000000000000000000000000000061 :102F70000000000000000000000000000000000051 :102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 +:102F90000100000000000000000000000000000030 :102FA0000000000000000000000000000000000021 :102FB0000000000000000000000000000000000011 :102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 +:102FD000000000000000000000E007008200000088 :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 :1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 +:10301000000000E0000000000000000000000000D0 :1030200000000000000000000000000000000000A0 :103030000000000000000000000000000000000090 :103040000000000000000000000000000000000080 -:103050000000000000000000000000000000000070 +:103050000000000000000000000000000000F0F090 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 @@ -25363,7 +25363,7 @@ :1030B0000000000000000000000000000000000010 :1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 +:1030E000F0F0000000000000000000000000000000 :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF :1031100000000000000000000000000000000000AF @@ -25378,8 +25378,8 @@ :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF +:1031D000000000000000000000000000000000FFF0 +:1031E0000000FFFF000000000000000000000000E1 :1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE :1032100000000000000000000000000000000000AE @@ -25387,7 +25387,7 @@ :10323000000000000000000000000000000000008E :10324000000000000000000000000000000000007E :10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E +:1032600000FF00000000000000000000000000005F :10327000000000000000000000000000000000004E :10328000000000000000000000000000000000003E :10329000000000000000000000000000000000002E @@ -25395,136 +25395,136 @@ :1032B000000000000000000000000000000000000E :1032C00000000000000000000000000000000000FE :1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE +:1032E000000005402A06054C00A800000000000070 :1032F00000000000000000000000000000000000CE :1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D +:1033100000000000000000000000000000000006A7 +:10332000000C000000000000000000000000000091 :10333000000000000000000000000000000000008D :10334000000000000000000000000000000000007D :10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D +:103360000000000000003C3CFFFF000000000000E7 :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D +:1033A000FF0000FF0000000000000000000000001F :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD +:1033E00000000000000000003C3C00000000000065 :1033F00000000000000000000000000000000000CD :1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C +:103420000000FF0000FF000000000000000000009E :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C +:10346000000000000000000000000000F0F000007C :10347000000000000000000000000000000000004C :10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C +:1034A00000000000FF0000FF00000000000000001E :1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC :1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC +:1034E0000000000000000000000000000000F0F0FC :1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B +:10352000000000000000FF0000FF0000000000009D :10353000000000000000000000000000000000008B :10354000000000000000000000000000000000007B -:10355000000000000000000000000000C0000000AB -:10356000000000000000000000000000200000003B -:103570000000040000000000000000000000000047 +:10355000000000000000000000000000000000006B +:103560000000000000000000000000000200000059 +:10357000000000000000000000000000000000004B :10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B +:103590000000000000000000000000000001040026 :1035A000000000000000000000000000000000001B :1035B000000000000000000000000000000000000B :1035C00000000000000000000000000000000000FB :1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000200000BB -:1035F00000000000000000000020000000000000AB -:1036000000000000000000000000000000000000BA +:1035E0000000000000000000000000000000820059 +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000400B6 :1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A +:10362000000000000000000000004000000000005A :10363000000000000000000000000000000000008A :10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000001000004A -:103670000000000000000000000000000000004109 +:10365000400000000000000000000000000000002A +:103660000200000000000000000000000000000058 +:10367000000000000000000000000000000000004A :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C000004000000000000000400000000000007A -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F00000080000000000000000000000000000C2 +:1036A0000000000000000000000000000000820098 +:1036B0008200000000000000000000000000000088 +:1036C00000002000000000000000000000000000DA +:1036D00084008200840000000000000000008200DE +:1036E0008200000000000000000000000000000058 +:1036F000000000000000000000400000000000008A :1037000000000000000000000000000000000000B9 -:103710000010000000000000000000000000000099 +:1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 +:103730000000040000000000000000000000000085 +:103740000000000000000000000000000000020077 :103750000000000000000000000000000000000069 :103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 -:103780000000000008000000000000000000000031 -:103790000000000008000000000000000000000021 +:103780000000000000000000000000000000000039 +:103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 +:1037C00000000000000008000000000000000000F1 +:1037D0000000000000008200000000001000000057 +:1037E00000000000040000100000000000000000C5 :1037F00000000000000000000000000000000000C9 -:103800000000000000000000000021000000000097 +:1038000000000000000000000000000000000000B8 :1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 +:103820000000000000000000030000000000000095 :103830000000000000000000000000000000000088 :103840000000000000000000000000000000000078 :103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 +:1038600000000000000000000000004000400010C8 +:103870000000000000000000000000000000010047 :103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 +:103890000000000000000000080000000000000020 :1038A0000000000000000000000000000000000018 :1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 +:1038C00000000000000000000000080000000000F0 :1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 +:1038E0000000000000000020004000000000000078 +:1038F0000000000000000000000000000040004048 +:10390000048800000000000000000000000000002B :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 :103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 +:103950000000000000000000000000000300000064 :103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 +:103980000020000000000000000000000000000017 :103990000000000000000000000000000000000027 :1039A0000000000000000000000000000000000017 :1039B0000000000000000000000000000000000007 :1039C00000000000000000000000000000000000F7 :1039D00000000000000000000000000000000000E7 :1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A10000000000000000000000000000000009016 -:103A2000000000000800000000000000000000008E -:103A30000000000000000000000000000000000086 +:1039F0000000000000000084000000C000C00000C3 +:103A000000000085008400000000000000000000AD +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000008402 :103A40000000000000000000000000000000000076 :103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A8000000000000000000000000000080000002E +:103A60000000000000000000040000000000000052 +:103A7000000900000000000000000000000000003D +:103A80000009000000000000000000000002000229 :103A90000000000000000000000000000000000026 :103AA0000000000000000000000000000000000016 :103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 +:103AC00000000000000000000002000000000000F4 :103AD00000000000000000000000000000000000E6 :103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 +:103AF0000000000000000000004000000000000086 :103B000000000000000000000000000000000000B5 :103B100000000000000000000000000000000000A5 :103B20000000000000000000000000000000000095 @@ -25533,7 +25533,7 @@ :103B50000000000000000000000000000000000065 :103B60000000000000000000000000000000000055 :103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 +:103B80000000000000009000000000A00000000005 :103B90000000000000000000000000000000000025 :103BA0000000000000000000000000000000000015 :103BB0000000000000000000000000000000000005 @@ -25541,7 +25541,7 @@ :103BD00000000000000000000000000000000000E5 :103BE00000000000000000000000000000000000D5 :103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 +:103C00000000000000001100800000000000000023 :103C100000000000000000000000000000000000A4 :103C20000000000000000000000000000000000094 :103C30000000000000000000000000000000000084 @@ -25549,7 +25549,7 @@ :103C50000000000000000000000000000000000064 :103C60000000000000000000000000000000000054 :103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 +:103C80000000000000000000000000800000008034 :103C90000000000000000000000000000000000024 :103CA0000000000000000000000000000000000014 :103CB0000000000000000000000000000000000004 @@ -25557,24 +25557,24 @@ :103CD00000000000000000000000000000000000E4 :103CE00000000000000000000000000000000000D4 :103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 +:103D00000000000000000000000000000020000093 +:103D100000C00000000000000000000000000000E3 :103D20000000000000000000000000000000000093 :103D30000000000000000000000000000000000083 :103D40000000000000000000000000000000000073 :103D50000000000000000000000000000000000063 :103D60000000000000000000000000000000000053 :103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 +:103D800000000000000000000000000001000088AA +:103D9000880001000000000000000000000000009A :103DA0000000000000000000000000000000000013 :103DB0000000000000000000000000000000000003 :103DC00000000000000000000000000000000000F3 :103DD00000000000000000000000000000000000E3 :103DE00000000000000000000000000000000000D3 :103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 +:103E00000000000000000000000000000000410071 +:103E10000080000009000000000000000000000019 :103E20000000000000000000000000000000000092 :103E30000000000000000000000000000000000082 :103E40000000000000000000000000000000000072 @@ -25582,7 +25582,7 @@ :103E60000000000000000000000000000000000052 :103E70000000000000000000000000000000000042 :103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 +:103E90000011000000800000000000000000000091 :103EA0000000000000000000000000000000000012 :103EB0000000000000000000000000000000000002 :103EC00000000000000000000000000000000000F2 @@ -25590,7 +25590,7 @@ :103EE00000000000000000000000000000000000D2 :103EF00000000000000000000000000000000000C2 :103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 +:103F10000000000100000040000000000000000060 :103F20000000000000000000000000000000000091 :103F30000000000000000000000000000000000081 :103F40000000000000000000000000000000000071 @@ -25598,7 +25598,7 @@ :103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 +:103F90000000000000000000070082210000000077 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 @@ -25606,7 +25606,7 @@ :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 +:1040100000000000000000000000F0F000000000C0 :104020000000000000000000000000000000000090 :104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 @@ -25614,7 +25614,7 @@ :104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 :104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 +:10409000000000000000000000000000F0F0000040 :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 :1040C00000000000000000000000000000000000F0 @@ -25622,15 +25622,15 @@ :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 :1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F +:104110000000000000000000000000003C3C000027 +:10412000FFFF000000000000000000000000000091 :10413000000000000000000000000000000000007F :10414000000000000000000000000000000000006F :10415000000000000000000000000000000000005F :10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F :10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F +:1041900000000000000000000000000000003C3CA7 :1041A000000000000000000000000000000000000F :1041B00000000000000000000000000000000000FF :1041C00000000000000000000000000000000000EF @@ -25638,8 +25638,8 @@ :1041E00000000000000000000000000000000000CF :1041F00000000000000000000000000000000000BF :1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E +:104210000000000000000000000000000000050099 +:104220002A00054000A80000000000000000000077 :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E :10425000000000000000000000000000000000005E @@ -25679,39 +25679,39 @@ :10447000000000000000000000000000000000003C :10448000000000000000000000000000000000002C :10449000000000000000000000000000000000001C -:1044A00000000000000000002000000000000000EC +:1044A000000000000000000000000000000000000C :1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC :1044D00000000000000000000000000000000000DC :1044E00000000000000000000000000000000000CC :1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000200000000000006B +:10450000000000000000000000004000000000006B +:104510000000000000000000000200000000000099 +:104520000004000000000000000000000000000087 :10453000000000000000000000000000000000007B :10454000000000000000000000000000000000006B :10455000000000000000000000000000000000005B :10456000000000000000000000000000000000004B :10457000000000000000000000000000000000003B :10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A00000000010000000000000000000000000FB +:104590000000000000820000004000000000000059 +:1045A0000000880000000000000000000000000083 :1045B00000000000000000000000000000000000FB :1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000200B9 +:1045D00000000000000000000800000000000000D3 +:1045E0000000000000008200820082000000000045 +:1045F0000000020000008200000000000000000037 :1046000000000000000000000000000000000000AA -:104610000000000000000200000000000000000098 -:10462000000000000000000000000000000000008A -:104630000000000000000000000800000000000072 +:1046100000000000000004000200820002000040D0 +:1046200000400000001000000000000000880000B2 +:10463000000000000000000000000000000000007A :10464000000000000000000000000000000000006A -:104650000000000000000000000800000000000052 +:10465000000000000000000000000000000000005A :10466000000000000000000000000000000000004A -:104670000000000000000000000000080000000032 +:104670000000000000000000000004000000000036 :10468000000000000000000000000000000000002A -:1046900000000000000000000000004000000200D8 -:1046A000000000000000000000000000000000000A +:104690000000000000000000050000000000000015 +:1046A00000000010000000000000000000000000FA :1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA @@ -25719,7 +25719,7 @@ :1046F00000000000000000000000000000000000BA :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 +:104720000400000000000000000000000000000085 :104730000000000000000000000000000000000079 :104740000000000000000000000000000000000069 :104750000000000000000000000000000000000059 @@ -25727,15 +25727,15 @@ :104770000000000000000000000000000000000039 :104780000000000000000000000000000000000029 :104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 +:1047A00000000000001100000000000000000041B7 +:1047B0000041000000000000000000100000004068 :1047C00000000000000000000000000000000000E9 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 :1047F00000000000000000000000000000000000B9 :1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 +:104810000000000000000000000000000000000494 +:104820000000004000000000000000000000000048 :104830000000000000000000000000000000000078 :104840000000000000000000000000000000000068 :104850000000000000000000000000000000000058 @@ -25753,15 +25753,15 @@ :104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:10495000000000000000000000000800000000004F +:1049400000840000000000000000000000000000E3 +:104950000000000000000000000000000000000057 :104960000000000000000000000000000000000047 :104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 :104990000000000000000000000000000000000017 :1049A0000000000000000000000000000000000007 :1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 +:1049C00000000000000000000000000200000000E5 :1049D00000000000000000000000000000000000D7 :1049E00000000000000000000000000000000000C7 :1049F00000000000000000000000000000000000B7 @@ -25938,31 +25938,31 @@ :1054A00000000000000000000000000000000000FC :1054B00000000000000000000000000000000000EC :1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC +:1054D00000000000000000000000000000040000C8 :1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC :10550000000000000000000000000000000000009B -:10551000000000000000000000000000000000008B +:105510000000400000000000000000000000000249 :10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:10556000000000000000000000100000000000002B -:1055700000000000000000000040000000000000EB +:10553000000000000000000000004000000000002B +:105540001000000200000000000000000000000049 +:1055500000020000000000000000000000008200C7 +:10556000880088000000000000000000000000002B +:10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B :10559000000000000000000000000000000000000B -:1055A00000000000000000000000001000000000EB -:1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB +:1055A00000000200000002000000020000000000F5 +:1055B00000000000020000000000040000000200E3 +:1055C00000000000000000000000020000000000D9 +:1055D0000200000002000000000082000000000045 :1055E00000000000000000000000000000000000BB -:1055F00000000008000000000000000000000000A3 +:1055F00000000000000000000000000000000000AB :10560000000000000000000000000000000000009A -:105610000000000800000000000000000000000082 +:105610000000000000000000000002000000000088 :10562000000000000000000000000000000000007A -:10563000000000000010000000000000000000005A -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A +:10563000000000000000000000000000000000006A +:105640000000000000000000000002000000020056 +:105650000200000000000000040003000000000041 :10566000000000000000000000000000000000003A :10567000000000000000000000000000000000002A :10568000000000000000000000000000000000001A @@ -25979,7 +25979,7 @@ :105730000000000000000000000000000000000069 :105740000000000000000000000000000000000059 :105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 +:1057600000000000000000400000000000000000F9 :105770000000000000000000000000000000000029 :105780000000000000000000000000000000000019 :105790000000000000000000000000000000000009 @@ -25989,7 +25989,7 @@ :1057D00000000000000000000000000000000000C9 :1057E00000000000000000000000000000000000B9 :1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 +:105800000000000000000040000000000000000058 :105810000000000000000000000000000000000088 :105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 @@ -26019,9 +26019,9 @@ :1059B00000000000000000000000000000000000E7 :1059C00000000000000000000000000000000000D7 :1059D00000000000000000000000000000000000C7 -:1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 +:1059E00000000000000000000000000000000004B3 +:1059F0000000200000000000000000000000000087 +:105A0000020000000000000000000000000005008F :105A10000000000000000000000000000000000086 :105A20000000000000000000000000000000000076 :105A30000000000000000000000000000000000066 @@ -26175,8 +26175,8 @@ :10637000000000000000000000000000000000001D :10638000000000000000000000000000000000000D :1063900000000000000000000000000000000000FD -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD +:1063A00000000000000000000011000000000000DC +:1063B000008000000000000000000000000000005D :1063C00000000000000000000000000000000000CD :1063D00000000000000000000000000000000000BD :1063E00000000000000000000000000000000000AD @@ -26184,31 +26184,31 @@ :10640000000000000000000000000000000000008C :10641000000000000000000000000000000000007C :10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC +:10643000000000400000000000000000000000001C +:10644000000000000002000000000000000000004A +:10645000000000000000000000000002000000003A +:10646000000000000000000000000000000000022A +:1064700000000000000040000000000000000000DC +:1064800000000000100000000000000000000000FC +:1064900000000000000020002000000400040000B4 +:1064A00000000000000000000000000000000400E8 +:1064B0000440040004000000000000000000000090 :1064C00000000000000000000000000000000000CC :1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC +:1064E00000000000000000000000020002000000A8 :1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B -:10652000000000000000000000000000000000006B -:10653000000000000000000000000000000000005B +:106500000000000000000000020000000000020087 +:106510008200000082000000800080000001000175 +:10652000000000C000C000000000000000000000EB +:10653000800080018000800000000000000000005A :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B :10656000000000000000000000000000000000002B :10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB +:106580000000000004000000000000000000000007 +:1065900000000200020002000200000000000000F3 :1065A00000000000000000000000000000000000EB -:1065B00000000000000000000000000000000000DB +:1065B00000000005010000000010000000000000C5 :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB :1065E00000000000000000000000000000000000AB @@ -26216,15 +26216,15 @@ :10660000000000000000000000000000000000008A :10661000000000000000000000000000000000007A :10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A +:106630000000000000000800000000010000000051 :10664000000000000000000000000000000000004A :10665000000000000000000000000000000000003A :10666000000000000000000000000000000000002A :10667000000000000000000000000000000000001A :10668000000000000000000000000000000000000A :1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA +:1066A000000000110000A000000000000000000039 +:1066B00000090000000000000000000000000000D1 :1066C00000000000000000000000000000000000CA :1066D00000000000000000000000000000000000BA :1066E00000000000000000000000000000000000AA @@ -26240,7 +26240,7 @@ :106780000000000000000000000000000000000009 :1067900000000000000000000000000000000000F9 :1067A00000000000000000000000000000000000E9 -:1067B00000000000000000000000000000000000D9 +:1067B0000000000000000000A00000000000000039 :1067C00000000000000000000000000000000000C9 :1067D00000000000000000000000000000000000B9 :1067E00000000000000000000000000000000000A9 @@ -26255,10 +26255,10 @@ :106870000000000000000000000000000000000018 :106880000000000000000000000000000000000008 :1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B00000000000000000000000000000000000D8 -:1068C00000000000000000000000000000000000C8 -:1068D00000000000000000000000000000000000B8 +:1068A00000000000000020000000000000000000C8 +:1068B0000000000084210000000000000000000033 +:1068C00000000000000000090000000000000000BF +:1068D0000040000000000000000000000000000078 :1068E00000000000000000000000000000000000A8 :1068F0000000000000000000000000000000000098 :106900000000000000000000000000000000000087 @@ -26271,50 +26271,50 @@ :106970000000000000000000000000000000000017 :106980000000000000000000000000000000000007 :1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 -:1069B00000000000000000000000000000000000D7 -:1069C00000000000000000000000000000000000C7 +:1069A00000000000000000000000000040000100A6 +:1069B00001000000840000000100000084000000CD +:1069C000010001C0900400000088000008000000E1 :1069D00000000000000000000000000000000000B7 :1069E00000000000000000000000000000000000A7 :1069F0000000000000000000000000000000000097 :106A00000000000000000000000000000000000086 :106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 -:106A40000000000000000000000000000000000046 +:106A200000000000000000000000000000008000E6 +:106A30004000030000008000000003000000800010 +:106A400000000300058000004100000000008000FD :106A50000000000000000000000000000000000036 :106A60000000000000000000000000000000000026 :106A70000000000000000000000000000000000016 :106A80000000000000000000000000000000000006 :106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000000000000000000C6 +:106AA00000000000000000000000000000000004E2 +:106AB00000000020000000000000000000000000B6 +:106AC0000000000000000000000080008080004105 :106AD00000000000000000000000000000000000B6 :106AE00000000000000000000000000000000000A6 :106AF0000000000000000000000000000000000096 :106B00000000000000000000000000000000000085 :106B10000000000000000000000000000000000075 :106B20000000000000000000000000000000000065 -:106B30000000000000000000000000000000000055 -:106B40000000000000000000000000000000000045 -:106B50000000000000000000000000000000000035 +:106B30000001000000010000000000000000000053 +:106B40000000000000000000080084002000C08455 +:106B50000001000000000000000000000000000034 :106B60000000000000000000000000000000000025 :106B70000000000000000000000000000000000015 :106B80000000000000000000000000000000000005 :106B900000000000000000000000000000000000F5 :106BA00000000000000000000000000000000000E5 -:106BB00000000000000000000000000000000000D5 -:106BC00000000000000000000000000000000000C5 +:106BB0000000000040002000000000000000000075 +:106BC0000000000000000000000084000000C00081 :106BD00000000000000000000000000000000000B5 :106BE00000000000000000000000000000000000A5 :106BF0000000000000000000000000000000000095 :106C00000000000000000000000000000000000084 :106C10000000000000000000000000000000000074 :106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 +:106C30000000000000008000800009000200000049 +:106C4000000000000000000000000000C000000084 +:106C500080000000000000000000000000000000B4 :106C60000000000000000000000000000000000024 :106C70000000000000000000000000000000000014 :106C80000000000000000000000000000000000004 @@ -26322,24 +26322,24 @@ :106CA00000000000000000000000000000000000E4 :106CB00000000000000000000000000000000000D4 :106CC00000000000000000000000000000000000C4 -:106CD00000000000000000000000000000000000B4 +:106CD0000041000000000000000000000000000073 :106CE00000000000000000000000000000000000A4 :106CF0000000000000000000000000000000000094 :106D00000000000000000000000000000000000083 :106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 :106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 -:106D50000000000000000000000000000000000033 +:106D400000000000000000000000000000000084BF +:106D50000000000100000000000000000000000032 :106D60000000000000000000000000000000000023 :106D70000000000000000000000000000000000013 :106D80000000000000000000000000000000000003 :106D900000000000000000000000000000000000F3 :106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 +:106DB00000000000000000000000000000100000C3 :106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 +:106DD00000000000000040008241000000000000B0 +:106DE0008200000000000000000000000000000021 :106DF0000000000000000000000000000000000093 :106E00000000000000000000000000000000000082 :106E10000000000000000000000000000000000072 @@ -26370,24 +26370,24 @@ :106FA00000000000000000000000000000000000E1 :106FB00000000000000000000000000000000000D1 :106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 +:106FD0000000000000000000000000C3C3C3030362 +:106FE00000C30000000000000000000000000000DE :106FF0000000000000000000000000000000000091 :107000000000000000000000000000000000000080 :107010000000000000000000000000000000000070 :107020000000000000000000000000000000000060 :107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 +:1070500000000000000000000000000000C300006D +:10706000030300C300000000000000000000000057 :107070000000000000000000000000000000000010 :107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 :1070A00000000000000000000000000000000000E0 :1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 +:1070C00000000000000000610007000D000000004B +:1070D00000000000000000000000000000000500AB +:1070E000500805000005000000000000000000003E :1070F0000000000000000000000000000000000090 :10710000000000000000000000000000000000007F :10711000000000000000000000000000000000006F @@ -26427,7 +26427,7 @@ :10733000000000000000000000000000000000004D :10734000000000000000000000000000000000003D :10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D +:107360000000000000040000000000000000000019 :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED @@ -26436,29 +26436,29 @@ :1073C00000000000000000000000000000000000BD :1073D00000000000000000000000000000000000AD :1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D +:1073F000000000000000000000000000400000004D :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C +:10742000000000004000000000000000000000001C :10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C +:10744000000000000000000000000002000000003A +:1074500000020000004000000000000000000000EA :10746000000000000000000000000000000000001C :10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC :1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC +:1074A00000000200020000000000000000000000D8 +:1074B00000000000000002000000000000000000CA :1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E000000000000010000000000000000000008C -:1074F0000000000000080000000000000000000084 -:10750000000000000000000000000000000000007B -:10751000000000000010000000000000000000005B -:10752000000000000000000000000000000000005B +:1074D00000000200020000000000000000000000A8 +:1074E0000000000000080000000000000000000094 +:1074F000000000000000000000000000000000008C +:107500000000000000080000000000000000000073 +:10751000000000000000000000000000000000006B +:10752000000000000000040800000000000000004F :10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B +:10754000000000000000020802000200000000002D +:107550000000000004000000000000000000000027 :10756000000000000000000000000000000000001B :10757000000000000000000000000000000000000B :1075800000000000000000000000000000000000FB @@ -26467,7 +26467,7 @@ :1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB :1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B +:1075E0000900000000000000000000000000000092 :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A @@ -26475,7 +26475,7 @@ :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A +:107660000004000000000000000000000000000016 :10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA @@ -26499,8 +26499,8 @@ :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 :1077D00000000000000000000000000000000000A9 -:1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 +:1077E0000000000000000090000000000000000009 +:1077F00000000000000000000000059000000000F4 :107800000000000000000000000000000000000078 :107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 @@ -26683,27 +26683,27 @@ :10833000000000000000000000000000000000003D :10834000000000000000000000000000000000002D :10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D +:1083600040000000000000000000000000000000CD :1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED +:1083800000000000000000000000000000020002E9 :1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD +:1083A000000000410000000000000000000000008C :1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D -:1083E000000000000000000000000000000000008D -:1083F000000002000000000000000000000000007B -:10840000000000000000000000000200000000006A -:10841000000000000000000000000000000000005C +:1083C00000000000000000000000000002000000AB +:1083D0000000000000000000000002000200020097 +:1083E000000000000000000000000200000000008B +:1083F000000000000000000000000000000000007D +:108400000000000000000000000000000200020068 +:10841000020000000000000000000000000000005A :10842000000000000000000000000000000000004C :10843000000000000000000000000000000000003C :10844000000000000000000000000000000000002C :10845000000000000000000000000000000000001C -:10846000000000000000000000000000000000000C +:10846000000000000000000002000000000000000A :1084700000000000000000000000000000000000FC -:1084800000000000000000000000000000000000EC +:1084800000000000000000000000000002000400E6 :1084900000000000000000000000000000000000DC -:1084A00000000000000000000000000000000000CC +:1084A00000000000000000000000000010000000BC :1084B00000000000000000000000000000000000BC :1084C00000000000000000000000000000000000AC :1084D000000000000000000000000000000000009C @@ -26711,7 +26711,7 @@ :1084F000000000000000000000000000000000007C :10850000000000000000000000000000000000006B :10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B +:108520000000000000000200000000000000000049 :10853000000000000000000000000000000000003B :10854000000000000000000000000000000000002B :10855000000000000000000000000000000000001B @@ -26719,7 +26719,7 @@ :1085700000000000000000000000000000000000FB :1085800000000000000000000000000000000000EB :1085900000000000000000000000000000000000DB -:1085A00000000000000000000000000000000000CB +:1085A00000000010000000000000000000000000BB :1085B00000000000000000000000000000000000BB :1085C00000000000000000000000000000000000AB :1085D000000000000000000000000000000000009B @@ -26727,7 +26727,7 @@ :1085F000000000000000000000000000000000007B :10860000000000000000000000000000000000006A :10861000000000000000000000000000000000005A -:10862000000000000000000000000000000000004A +:108620000200000000000000000000000000000048 :10863000000000000000000000000000000000003A :10864000000000000000000000000000000000002A :10865000000000000000000000000000000000001A @@ -26743,8 +26743,8 @@ :1086F000000000000000000000000000000000007A :108700000000000000000000000000000000000069 :108710000000000000000000000000000000000059 -:108720000000000000000000000000000000000049 -:108730000000000000000000000000000000000039 +:108720000000210000000000000000000000000028 +:108730000000000000001000000000000000000029 :108740000000000000000000000000000000000029 :108750000000000000000000000000000000000019 :108760000000000000000000000000000000000009 @@ -26759,7 +26759,7 @@ :1087F0000000000000000000000000000000000079 :108800000000000000000000000000000000000068 :108810000000000000000000000000000000000058 -:108820000000000000000000000000000000000048 +:108820000000000000002000000000000000000028 :108830000000000000000000000000000000000038 :108840000000000000000000000000000000000028 :108850000000000000000000000000000000000018 @@ -26923,7 +26923,7 @@ :10923000000000000000000000000000000000002E :10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE +:1092600000000000000000000000000000000004FA :1092700000000000000000000000000000000000EE :1092800000000000000000000000000000000000DE :1092900000000000000000000000000000000000CE @@ -26931,30 +26931,30 @@ :1092B00000000000000000000000000000000000AE :1092C000000000000000000000000000000000009E :1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E +:1092E000000000000000400000000000000000003E :1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D +:10930000000000000000000000000000000040001D +:10931000000000400000000000000000000000000D :10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD +:109330000000000200000002000000000000000029 +:10934000000000000002000000000000000000001B +:10935000000000000040004000000000002140002C +:10936000400040004000000000000000000000003D :1093700000000000000000000000000000000000ED :1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD -:1093C000000000000000000000000000000000009D +:1093900000000000000002000000020000000200C7 +:1093A00000000000000000000200000000000400B7 +:1093B00000000200000000000000000000000000AB +:1093C0000000000000000000020000000000020099 :1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D :1093F000000000000000000000000000000000006D :10940000000000000000000000000000000000005C :10941000000000000000000000000000000000004C :10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C -:10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C +:10943000020000000000000000000000000000002A +:109440000200000000000200000000000000000018 +:109450000400000000000000000000000000000008 :1094600000000000000000000000000000000000FC :1094700000000000000000000000000000000000EC :1094800000000000000000000000000000000000DC @@ -26970,7 +26970,7 @@ :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B +:1095500000000000000000000009004000000000C2 :1095600000000000000000000000000000000000FB :1095700000000000000000000000000000000000EB :1095800000000000000000000000000000000000DB @@ -26979,14 +26979,14 @@ :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B +:1095E000410000000000000000000000000000003A :1095F000000000000000000000000000000000006B :10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A :10963000000000000000000000000000000000002A :10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A +:10965000000000000000000000000000900000007A :1096600000000000000000000000000000000000FA :1096700000000000000000000000000000000000EA :1096800000000000000000000000000000000000DA @@ -27011,7 +27011,7 @@ :1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 :1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 +:1097E0000000000000040000000000000000000075 :1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 :109810000000000000000000000000000000000048 @@ -27166,30 +27166,30 @@ :10A1600000000000000000000000000000000000EF :10A1700000000000000000000000000000000000DF :10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF +:10A1900000000000000200000000000000000000BD +:10A1A000000000000021000000000000000000008E :10A1B000000000000000000000000000000000009F :10A1C000000000000000000000000000000000008F :10A1D000000000000000000000000000000000007F :10A1E000000000000000000000000000000000006F :10A1F000000000000000000000000000000000005F :10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E +:10A2100041000000000000000000000000000000FD :10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E +:10A23000000000000000000000020000000000001C +:10A24000000000000000000000004000000000408E :10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE +:10A2600000000002000000000000000000000000EC +:10A2700000000000000000020000000000000000DC +:10A28000000000000000000000000040004000004E :10A2900000000000000000000000000000000000BE :10A2A00000000000000000000000000000000000AE :10A2B000000000000000000000000000000000009E :10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E -:10A2F000000000000000000000000000000000005E -:10A30000000000000000000000000000000000004D +:10A2D000000000000000000000000000000002007C +:10A2E000020000000000000000000000000000006C +:10A2F000040000000000000000000000004000001A +:10A300000000020002000000020000000000000047 :10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D :10A33000000000000000000000000000000000001D @@ -27215,8 +27215,8 @@ :10A4700000000000000000000000000000000000DC :10A4800000000000000000000000000000000000CC :10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C +:10A4A00000004000000000000000004000400040AC +:10A4B000004000000000000000000000000000005C :10A4C000000000000000000000000000000000008C :10A4D000000000000000000000000000000000007C :10A4E000000000000000000000000000000000006C @@ -27238,7 +27238,7 @@ :10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B :10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A +:10A61000000000000000000000000010000000002A :10A62000000000000000000000000000000000002A :10A63000000000000000000000000000000000001A :10A64000000000000000000000000000000000000A @@ -27254,8 +27254,8 @@ :10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A :10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 +:10A710000000000000000000000000000000001029 +:10A720000000009000002000040000000000000075 :10A730000000000000000000000000000000000019 :10A740000000000000000000000000000000000009 :10A7500000000000000000000000000000000000F9 @@ -27417,39 +27417,39 @@ :10B11000000000000000000000000000000000002F :10B12000000000000000000000000000000000001F :10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF +:10B140000000000001009100010001000200200049 +:10B1500000000000000000000000000020000000CF +:10B1600000000000000000000000000000002000BF +:10B17000000000000100000000400100200000006D +:10B1800000000000000300000000000000000000BC :10B1900000000000000000000000000000000000AF :10B1A000000000000000000000000000000000009F :10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F +:10B1C00000000000000004000400040004008000EF +:10B1D000400000000000000000000000000000002F :10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F +:10B1F000000000000000020000000001020000004A :10B20000000000000000000000000000000000003E :10B21000000000000000000000000000000000002E :10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E -:10B24000000000000000000000800040004000807E +:10B23000000000000000000000004000000000903E +:10B2400000000000000200000004000400040004EC :10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE +:10B2700000000000000000000000020000000000CC :10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000040000100013C -:10B2D000004000000000000000000000000000002E +:10B2900000000200000002000200020000000000A6 +:10B2A000000000000000000000000200000000009C +:10B2B0000000020000000000040000000000000088 +:10B2C0000000000000000200020000010001000177 +:10B2D000000100000000000000000000000000006D :10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E +:10B2F00000000000000000000000000080000000CE :10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D +:10B31000000000008000000000000000800000002D :10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD +:10B33000000000008000000000000000000000008D +:10B3400000000000000000000000040000000000F9 :10B3500000000000000000000000000000000000ED :10B3600000000000000000000000000000000000DD :10B3700000000000000000000000000000000000CD @@ -27457,7 +27457,7 @@ :10B3900000000000000000000000000000000000AD :10B3A000000000000000000000000000000000009D :10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D +:10B3C0000000000000000000000000000000090074 :10B3D000000000000000000000000000000000006D :10B3E000000000000000000000000000000000005D :10B3F000000000000000000000000000000000004D @@ -27466,172 +27466,172 @@ :10B42000000000000000000000000000000000001C :10B43000000000000000000000000000000000000C :10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC +:10B4500001000005000000000000000000000100E5 :10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC +:10B4700000000800000000000000000000000000C4 +:10B48000000000000100018000000000000000003A :10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C +:10B4A0000100000000000000010008000000000092 :10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C +:10B4C000010000000000000000000000000000007B +:10B4D000000010000000000000000000000000005C +:10B4E0000400000000000000000000000000000058 :10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B +:10B500000000000000002000040400000000000013 :10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B +:10B520000000040000000000000004000000000013 :10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000004000000000AB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB +:10B5400000000400000000000000000000000000F7 +:10B5500000000000000000000000000000000000EB +:10B5600000200000000000000000000000000000BB +:10B5700000000000000000000000000008000000C3 +:10B58000000090000000000000001000000000001B :10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B +:10B5A0000800002000000000000000200000000053 :10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000000000000000000100006A -:10B5E000000000000000000000000000000000005B +:10B5C000000000200000000000000000000000005B +:10B5D000000000000000000000000000000000006B +:10B5E000000000010000000000000000000000005A :10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A +:10B6000000000000000000000000000080000000BA :10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A +:10B620000000000000010000000000000001000018 :10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000400000AA -:10B6600000000000000000000000000000000000DA +:10B6400000000000000100000000000000000000F9 +:10B6500000000000000000000000000000000000EA +:10B6600000090009000000000000000000000000C8 :10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA +:10B6800000000000000000001000000000000000AA :10B6900000000000000000000000000000000000AA :10B6A000000000000000000000000000000000009A :10B6B000000000000000000000000000000000008A :10B6C000000000000000000000000000000000007A -:10B6D0000000000000000000000000000000000169 +:10B6D000000000000000000000000000000000006A :10B6E000000000000000000000000000000000005A :10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 +:10B7000000000000000000000000800000000000B9 :10B710000000000000000000000000000000000029 :10B720000000000000000000000000000000000019 :10B730000000000000000000000000000000000009 :10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000C0000425 -:10B7600000000000000000000000000000000000D9 +:10B7500000000000000000000000000000000000E9 +:10B760000100000000009000000000000000000048 :10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 +:10B780000000000000000000000000000100009028 :10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D00000000000000000000000000000000080E9 -:10B7E00000800000000000000000000000000000D9 +:10B7A0000000000000000000900000000000000009 +:10B7B00090000000000000000000000000000000F9 +:10B7C00000000000000000009000000000000000E9 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000400000001100800000000000000088 :10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 +:10B800000000000000000000000000000000110027 +:10B810002180000000000000000000000000000087 +:10B820000000000000000000110080000000000087 +:10B830001100800000000000000000000000000077 +:10B840000000000000000000110080000000000067 :10B8500000000000000000000000000000000000E8 -:10B860000000000000008000000000000000000058 +:10B8600010090000040041800000008000000080FA :10B8700000000000000000000000000000000000C8 :10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000C00000000000000098 -:10B8F0000000000000000000000000000000000048 +:10B8900000410900000300800000000000000000DB +:10B8A0000000000000000000000000000080000018 +:10B8B0000080000000800000008000000000000008 +:10B8C00000000000000000000000000000800000F8 +:10B8D00000800000000000000000000000000000E8 +:10B8E0000000010000C0010001C0000000200000B5 +:10B8F00000C0000000000000000000000000000088 :10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B960000000000000020000000000C00000000015 -:10B9700000000000000000000000000000000000C7 +:10B9100000000001014000000002000000000000E3 +:10B9200000000000000000000000000000000020F7 +:10B93000000000C000000020000000C00000000067 +:10B9400000000000000000000000000000000020D7 +:10B95000000000C000000000000000000000000027 +:10B960000000000000002000A000010091000088FD +:10B97000880001000000000000000000000000003E :10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000080000000000080000057 -:10B9F0000000000000000000000000000000000047 +:10B99000000000000000880020900000000002006D +:10B9A0000000000000000000000000000000010096 +:10B9B0000088880003002100008888000100000042 +:10B9C0000000000000000000000000000000410036 +:10B9D0000088880001000000000000000000000056 +:10B9E0000000000000000900800080000800410005 +:10B9F00000800000090000000000000000000000BE :10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 +:10BA100000000000000020000000808041000500C0 +:10BA20008000000000000000000000000000000096 +:10BA300041000080000089004100008000000900F2 :10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA60000000000000000000800080000080000056 -:10BA700000000000000000000000000000000000C6 +:10BA5000410000800000090000000000000000001C +:10BA60000000000000000000004000040000000290 +:10BA70000011000000800000000000000000000035 :10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 +:10BA900000000000000000000011A01100000000E4 :10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 +:10BAB0000000001100000080000000110000008064 :10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE00000000000000000000000C0000200000292 -:10BAF0000000000000000000000000000000000046 +:10BAD00000000011000000800000000000000000D5 +:10BAE0000000000000000000000000010001000054 +:10BAF0000001000100000040000000000000000004 :10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 +:10BB1000000000000000000000000001200100887B :10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 +:10BB300000000000000100000040000000010000C3 +:10BB400000400000000000000000000000000000B5 +:10BB500000000000000100000040000000000000A4 +:10BB600000000000000000000000000000000020B5 +:10BB700004000021000000000700822100000000F6 :10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 +:10BB9000000000000000000000000000000000E0C5 +:10BBA000070081000000000000000000000000000D +:10BBB00000000000000000000000070082210000DB +:10BBC00000000700822100000000000000000000CB +:10BBD00000000000000000000000070082210000BB :10BBE0000000000000000000000000000000000055 -:10BBF00000FF00003C3C00000000000000000000CE +:10BBF00000000000000000000000F0F00000000065 :10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 +:10BC1000000000000000000000000000000000FF25 +:10BC2000000000FF00000000000000000000000015 +:10BC3000000000000000000000000000F0F0000024 +:10BC400000000000F0F00000000000000000000014 +:10BC5000000000000000000000000000F0F0000004 :10BC600000000000000000000000000000000000D4 -:10BC7000000000FF00003C3C00000000000000004D +:10BC7000000000000000000000000000F0F00000E4 :10BC800000000000000000000000000000000000B4 :10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 +:10BCA00000FF000000FF0000000000000000000096 +:10BCB0000000000000000000000000000000F0F0A4 +:10BCC000000000000000F0F0000000000000000094 +:10BCD0000000000000000000000000000000F0F084 :10BCE0000000000000000000000000000000000054 -:10BCF0000000FF0000000000FFFF00000000000047 -:10BD00000000000000000000000000000000000033 +:10BCF000000000000000000000000000FFFF000046 +:10BD0000FFFF000000000000000000000000000035 :10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000FF000000FFFFFFFF00000000C8 +:10BD200000000000FF000000FFFF00000000000016 +:10BD30000000000000000000000000000000555559 +:10BD40000000FFFF0000FFFF0000FFFF00000000F9 +:10BD50000000000000000000000000000000FFFFE5 +:10BD60000000FFFF000000000000000000000000D5 +:10BD700000000000000000000000000000000000C3 :10BD800000000000000000000000000000000000B3 :10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 +:10BDA000000000000000FF00000000000000000094 :10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 +:10BDC00055550000000000000000000000000000C9 :10BDD0000000000000000000000000000000000063 :10BDE0000000000000000000000000000000000053 -:10BDF000000000000000408280000020820200005D -:10BE00000000000000000000000000000000000032 +:10BDF00000000000000005610A0F050500A0050015 +:10BE00002A00054000A8000000000000000000001B :10BE10000000000000000000000000000000000022 -:10BE20000000000000000000000000000000000012 +:10BE200000000000000015402A06054C00A8000094 :10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 +:10BE400005002A00054000A805002A00054000A8BA :10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 +:10BE600005002A00054000A80000000000000000B6 :10BE700000000000000000000000000000000000C2 :10BE800000000000000000000000000000000000B2 :10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 +:10BEA00000000000000000000000FF00FFFF000095 :10BEB0000000000000000000000000000000000082 :10BEC0000000000000000000000000000000000072 :10BED0000000000000000000000000000000000062 @@ -27639,62 +27639,62 @@ :10BEF0000000000000000000000000000000000042 :10BF00000000000000000000000000000000000031 :10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 +:10BF2000000000000000000000000000FF00000012 :10BF30000000000000000000000000000000000001 :10BF400000000000000000000000000000000000F1 :10BF500000000000000000000000000000000000E1 :10BF600000000000000000000000000000000000D1 :10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 +:10BF800000C38282000000000000000000000000EA :10BF900000000000000000000000000000000000A1 :10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 +:10BFB000F0F00000000000000000000000000000A1 :10BFC0000000000000000000000000000000000071 :10BFD0000000000000000000000000000000000061 :10BFE0000000000000000000000000000000000051 :10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 +:10C00000000000C382820000000000000000000069 :10C010000000000000000000000000000000000020 :10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 +:10C030000000F0F000000000000000000000000020 :10C0400000000000000000000000000000000000F0 :10C0500000000000000000000000000000000000E0 :10C0600000000000000000000000000000000000D0 :10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C090002000000000000000000000000000000080 -:10C0A0000000000000000000000000000000000090 -:10C0B0002000000000000000000000000000000060 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000200000000000000000000000000040 +:10C0800020000000200000000000000020008800C8 +:10C090000000000000002000200000000000000060 +:10C0A0000000000020000000000000000000000070 +:10C0B000010000000000210000000000000000005E +:10C0C000000300000000200000000000000000004D +:10C0D0000000000000000000200000000000000040 :10C0E0000000000000000000000000000000000050 -:10C0F0000000200000000000000000000000000020 +:10C0F0000000000000000000200000000000000020 :10C10000000000000000000000000000000000002F :10C11000000000000000000000000000000000001F :10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF +:10C1300000001000000000001000000000000000DF :10C1400000000000000000000000000000000000EF :10C1500000000000000000000000000000000000DF :10C1600000000000000000000000000000000000CF :10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF +:10C1800000020002000000000000000000000000AB :10C19000000000000000000000000000000000009F :10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000020000000000000000004D -:10C1F000000000000000000000000000000002003D -:10C20000000000000000000000000000000000002E +:10C1B000000000000000100010000000000000005F +:10C1C000020000000000000000000000000002006B +:10C1D0000200020000000000000000000000020059 +:10C1E000000000000000000000000000000002004D +:10C1F000000000000000000000000000000000003F +:10C200000200020002000008000000000000000020 :10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C2400000000000000000000000000000000000EE +:10C220000000000000000008000000000000000006 +:10C2300000000000000000008000800000000000FE +:10C2400000000000000000000008000000000000E6 :10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE +:10C2600000000000000000000010000000000000BE +:10C27000800000000000000000000000000000003E :10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E +:10C29000008000000000000000000000000000001E :10C2A000000000000000000000000000000000008E :10C2B000000000000000000000000000000000007E :10C2C000000000000000000000000000000000006E @@ -27702,54 +27702,54 @@ :10C2E000000000000000000000000000000000004E :10C2F000000000000000000000000000000000003E :10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D +:10C310000000000800000000000000000000000015 :10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000000000000FD +:10C3300000001000000008000000000000000000E5 :10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD +:10C3500000000000030000000000000000000000DA :10C3600000000000000000000000000000000000CD :10C3700000000000000000000000000000000000BD :10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D +:10C390000000000000000000010000800800000014 +:10C3A00000000000000400040004000482000000FB :10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D +:10C3C0000000010008000000000000000000000064 :10C3D000000000000000000000000000000000005D :10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D +:10C3F000000000000000000000000000010000003C :10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C +:10C4100000000000000000000000200000040000F8 :10C42000000000000000000000000000000000000C :10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC +:10C4400000000000200000000000000000000000CC :10C4500000000000000000000000000000000000DC :10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC +:10C4700000000000000000000000000000000400B8 :10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C +:10C490000000000000009000000008000000000004 :10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C +:10C4B000080000000000000000000000000008006C :10C4C000000000000000000000000000000000006C :10C4D000000000000000000000000000000000005C :10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C +:10C4F0000000000000000800000000000000002014 :10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B +:10C51000000000840000000008000000000000008F +:10C52000088400000000000000000000000000007F :10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB +:10C5400000C0000000000084008400000000000023 :10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB +:10C5600000000084000000000000008400000000C3 :10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B +:10C580000001008400000000000000000000000026 +:10C590000000000000000000000000000002000099 +:10C5A0000000000000000000000000020000000089 :10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A +:10C5C0000000C000000000000000000000000000AB +:10C5D0000002000200000000000000000000000057 +:10C5E0000000000000000000000000000002000049 +:10C5F0000000000000020000000000000000000039 +:10C600000000000000000000000000000002000028 :10C61000000000000000000000000000000000001A :10C62000000000000000000000000000000000000A :10C6300000000000000000000000000000000000FA @@ -27759,78 +27759,78 @@ :10C6700000000000000000000000000000000000BA :10C6800000000000000000000000000000000000AA :10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A +:10C6A0000100000000000000000000000000000089 :10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A +:10C6C0000000000000000000010000000000000069 :10C6D000000000000000000000000000000000005A :10C6E000000000000000000000000000000000004A :10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 +:10C700000000000090020000000000000000000097 :10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 +:10C7200000001100210000000000000000000000D7 :10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 +:10C7400000000000000000000000110000210000B7 :10C7500000000000000000000000000000000000D9 :10C7600000000000000000000000000000000000C9 :10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 +:10C780000000000011008080000000000000000098 :10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 +:10C7A00000000000004109000003008000000000BC :10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 +:10C7C0000000000000000000000000000040000029 +:10C7D0001103000000000000000000000000000045 :10C7E0000000000000000000000000000000000049 :10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 +:10C800000000000000000000008000000080000028 :10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 +:10C82000000000000000000101000000008800007E :10C8300000000000000000000000000000000000F8 :10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 +:10C8500000000100000000000000000000000000D7 :10C8600000000000000000000000000000000000C8 :10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 +:10C88000000000000000000000000020000000C0C8 :10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 +:10C8A00000000000000000000000880000000100FF :10C8B0000000000000000000000000000000000078 :10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 +:10C8D00000009000000100000000000000000000C7 :10C8E0000000000000000000000000000000000048 :10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 +:10C900000000000000000000000001000088880016 +:10C910000100000000000000000000000000000016 :10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 +:10C9300041000000000000000000000000000000B6 :10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 +:10C9500000000000000000080500000000000000CA :10C9600000000000000000000000000000000000C7 :10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 +:10C9800000000000000000000000000041000080E6 +:10C99000000009000000000000000000000000008E +:10C9A0000000000000000000000000000000001176 +:10C9B0000000030000000000000000000000000074 :10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 +:10C9D0000000000000001100000000000000000046 :10C9E0000000000000000000000000000000000047 :10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 +:10CA00000000000000000000000000000000001115 +:10CA10000000008000000000000000000000000096 :10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 +:10CA300000010000000000000000000000000000F5 :10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 +:10CA500000000000000000000100000000000000D5 :10CA600000000000000000000000000000000000C6 :10CA700000000000000000000000000000000000B6 :10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 +:10CA90000001000000400000000000000000000055 :10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 +:10CAB000000000E0000081410000000000000000D4 :10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 +:10CAD0000000000000000000000000E00000000076 :10CAE0000000000000000000000000000000000046 :10CAF0000000000000000000000000000000000036 :10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 +:10CB1000000000000000070082210000000000006B :10CB20000000000000000000000000000000000005 :10CB300000000000000000000000000000000000F5 :10CB400000000000000000000000000000000000E5 @@ -27838,7 +27838,7 @@ :10CB600000000000000000000000000000000000C5 :10CB700000000000000000000000000000000000B5 :10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 +:10CB900000000000000000000000F0F000000000B5 :10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 :10CBC0000000000000000000000000000000000065 @@ -27846,7 +27846,7 @@ :10CBE0000000000000000000000000000000000045 :10CBF0000000000000000000000000000000000035 :10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 +:10CC1000000000000000000000000000F0F0000034 :10CC20000000000000000000000000000000000004 :10CC300000000000000000000000000000000000F4 :10CC400000000000000000000000000000000000E4 @@ -27862,7 +27862,7 @@ :10CCE0000000000000000000000000000000000044 :10CCF0000000000000000000000000000000000034 :10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 +:10CD10000000000000000000000000FF0000FFFF16 :10CD20000000000000000000000000000000000003 :10CD300000000000000000000000000000000000F3 :10CD400000000000000000000000000000000000E3 @@ -27870,75 +27870,75 @@ :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 :10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 +:10CD900000000000000000000000000000FF000094 :10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 +:10CDB000000000000000000000000000004000062D +:10CDC000000C000000000000000000000000000057 :10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 +:10CDE0000000000000000006000C00000000000031 :10CDF0000000000000000000000000000000000033 :10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 +:10CE1000000000000000000000000000000005000D +:10CE20002A00054000A800000000000000000000EB :10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 +:10CE40003C3CFFFF0000000000000000000000006C :10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 +:10CE60000000000000000000FF0000FF00000000C4 :10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 :10CE90000000000000000000000000000000000092 :10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 +:10CEC00000003C3C000000000000000000000000EA :10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 +:10CEE00000000000000000000000FF0000FF000044 :10CEF0000000000000000000000000000000000032 :10CF00000000000000000000000000000000000021 :10CF10000000000000000000000000000000000011 :10CF20000000000000000000000000000000000001 :10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 +:10CF4000000000000000F0F0000000000000000001 :10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 +:10CF6000000000000000000000000000FF0000FFC3 :10CF700000000000000000000000000000000000B1 :10CF800000000000000000000000000000000000A1 :10CF90000000000000000000000000000000000091 :10CFA0000000000000000000000000000000000081 :10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 +:10CFC0000000000000000000F0F000000000000081 :10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 +:10CFE0000000000000000000000000000000FF0042 +:10CFF00000FF000000000000000000000000000032 :10D000000000000000000000000000000000000020 :10D010000000000000000000000000000000000010 :10D020000000000000000000000000000000000000 :10D0300000000000000000000000000000000000F0 -:10D0400000000000200000000000000000000000C0 -:10D0500000000000200000000000000000000000B0 -:10D0600000000000200000000000000000000000A0 -:10D070000000000020000000000000000000000090 -:10D080000000000000002000000000000000000080 -:10D090000000000000002000000000000000000070 -:10D0A0000000000000002000000000000000000060 -:10D0B0000000000000002000000000000000000050 +:10D04000000000000002200020000000000020007E +:10D0500000000000000000000000000000000000D0 +:10D060000000000000002000200000000000000080 +:10D0700000000000000000000000000000000000B0 +:10D080000000000000000000200020000000000060 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000200020000000000040 +:10D0B0000000000000000000000000000000000070 :10D0C0000000000000000000000000000000000060 :10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 :10D10000000000000000000000000000000000001F :10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF +:10D1200000000000100000400000000400000000AB +:10D1300000000000000000000002000000000000ED :10D1400000000000000000000000000000000000DF :10D1500000000000000000000000000000000000CF :10D1600000000000000000000000000000000000BF :10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F +:10D18000000000000000000000000200000002009B +:10D19000000002000000000000000000020000008B +:10D1A000000002000000004000000000000000003D +:10D1B000000000000000000000000000020000006D +:10D1C000000002000000000000000000000000005D +:10D1D000000000000040004000400040000000004F :10D1E000000000000000000000000000000000003F :10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E @@ -27953,7 +27953,7 @@ :10D29000000000000000000000000000000000008E :10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E +:10D2C000400000000000000000000000000000001E :10D2D000000000000000000000000000000000004E :10D2E000000000000000000000000000000000003E :10D2F000000000000000000000000000000000002E @@ -27969,7 +27969,7 @@ :10D39000000000000000000000000000000000008D :10D3A000000000000000000000000000000000007D :10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000000000005D +:10D3C000000000000000000000000000000020003D :10D3D000000000000000000000000000000000004D :10D3E000000000000000000000000000000000003D :10D3F000000000000000000000000000000000002D @@ -27986,22 +27986,22 @@ :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C +:10D4D00000000000000000C0000000000084000008 :10D4E000000000000000000000000000000000003C :10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B +:10D50000080000000000008400000000000000008F :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB +:10D540000084000000000000000000000000000057 +:10D5500000000000000400000000000000000000C7 +:10D5600000000000000000020000000000000000B9 :10D5700000000000000000000000000000000000AB :10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B +:10D590000002000000000000000000000000000089 :10D5A000000000000000000000000000000000007B :10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B +:10D5C0000000000000000000000000020000000059 :10D5D000000000000000000000000000000000004B :10D5E000000000000000000000000000000000003B :10D5F000000000000000000000000000000000002B @@ -28165,37 +28165,37 @@ :10DFD0000000000000000000000000000000000041 :10DFE0000000000000000000000000000000000031 :10DFF0000000000000000000000000000000000021 -:10E000000000000000000000000000000000000010 +:10E00000000000000000000000040000000000000C :10E010000000000000000000000000000000000000 :10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 +:10E0300000000000000000000000000000010000DF :10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 :10E0600000000000000000000000000000000000B0 :10E0700000000000000000000000000000000000A0 -:10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 +:10E08000000000000000000000000000000400008C +:10E090000000000000004000000000000000000040 +:10E0A000000000000000000000000000000000026E :10E0B0000000000000000000000000000000000060 :10E0C0000000000000000000000000000000000050 -:10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 +:10E0D000000000000000000000020000000000003E +:10E0E000000000000000000000000000000200002E :10E0F0000000000000000000000000000000000020 :10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000000000FF +:10E1100000000000000000002000200000040004B7 :10E1200000000000000000000000000000000000EF :10E1300000000000000000000000000000000000DF :10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000000BF +:10E1500000000000020002000000000000000000BB :10E1600000000000000000000000000000000000AF -:10E17000000000000000000000000000000000009F +:10E170000000000000000000020002000000020099 :10E18000000000000000000000000000000000008F -:10E190000008000000000000000000000000000077 -:10E1A000000000000000000000000000000000006F +:10E190000008000000000000000080008000000176 +:10E1A000000100000000000000000000000000006E :10E1B0000008000000000000000000000000000057 :10E1C000000000000000000000000000000000004F :10E1D0000000000800000000000000000000000037 -:10E1E000000000000000000000000000000000002F +:10E1E000000000000000000002000000000000002D :10E1F0000000000800000000000000000000000017 :10E20000000000000000000000000000000000000E :10E2100000000000000000000000000000000000FE @@ -28213,9 +28213,9 @@ :10E2D000000000000000000000000000000000003E :10E2E000000000000000000000000000000000002E :10E2F000000000000000000000000000000000001E -:10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD -:10E3200000000000000000000000000000000000ED +:10E300000000000000000000000000000800000005 +:10E3100000004000000000000000000000000000BD +:10E32000000000000000000000200020002000206D :10E3300000000000000000000000000000000000DD :10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD @@ -28223,8 +28223,8 @@ :10E37000000000000000000000000000000000009D :10E38000000000000000000000000000000000008D :10E39000000000000000000000000000000000007D -:10E3A000000000000000000000000000000000006D -:10E3B000000000000000000000000000000000005D +:10E3A000000000000000000000000001000100016A +:10E3B000000100000000000000000000000000005C :10E3C000000000000000000000000000000000004D :10E3D000000000000000000000000000000000003D :10E3E000000000000000000000000000000000002D @@ -28247,7 +28247,7 @@ :10E4F000000000000000000000000000000000001C :10E50000000000000000000000000000000000000B :10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB +:10E5200000000000820000002000200020002000E9 :10E5300000000000000000000000000000000000DB :10E5400000000000000000000000000000000000CB :10E5500000000000000000000000000000000000BB @@ -28263,7 +28263,7 @@ :10E5F000000000000000000000000000000000001B :10E60000000000000000000000000000000000000A :10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000000000EA +:10E6200000000000000000000000000000004000AA :10E6300000000000000000000000000000000000DA :10E6400000000000000000000000000000000000CA :10E6500000000000000000000000000000000000BA @@ -28272,7 +28272,7 @@ :10E68000000000000000000000000000000000008A :10E69000000000000000000000000000000000007A :10E6A000000000000000000000000000000000006A -:10E6B000000000000000000000000000000000005A +:10E6B0000000050000000000000000000000000055 :10E6C000000000000000000000000000000000004A :10E6D000000000000000000000000000000000003A :10E6E000000000000000000000000000000000002A @@ -28280,7 +28280,7 @@ :10E700000000000000000000000000000000000009 :10E7100000000000000000000000000000000000F9 :10E7200000000000000000000000000000000000E9 -:10E7300000000000000000000000000000000000D9 +:10E7300000040000000400000000008000000080D1 :10E7400000000000000000000000000000000000C9 :10E7500000000000000000000000000000000000B9 :10E7600000000000000000000000000000000000A9 @@ -28288,24 +28288,24 @@ :10E780000000000000000000000000000000000089 :10E790000000000000000000000000000000000079 :10E7A0000000000000000000000000000000000069 -:10E7B0000000000000000000000000000000000059 -:10E7C0000000000000000000000000000000000049 +:10E7B0000000000100000001000000000004000053 +:10E7C0000004000000000000000000000000000045 :10E7D0000000000000000000000000000000000039 :10E7E0000000000000000000000000000000000029 :10E7F0000000000000000000000000000000000019 :10E800000000000000000000000000000000000008 :10E8100000000000000000000000000000000000F8 :10E8200000000000000000000000000000000000E8 -:10E8300000000000000000000000000000000000D8 -:10E8400000000000000000000000000000000000C8 +:10E830000000000000008400000001000000000053 +:10E8400004000000000000000000000000000000C4 :10E8500000000000000000000000000000000000B8 :10E8600000000000000000000000000000000000A8 :10E870000000000000000000000000000000000098 :10E880000000000000000000000000000000000088 :10E890000000000000000000000000000000000078 :10E8A0000000000000000000000000000000000068 -:10E8B0000000000000000000000000000000000058 -:10E8C0000000000000000000000000000000000048 +:10E8B000000000000000000000000000040005004F +:10E8C00000008000000000000000000000000000C8 :10E8D0000000000000000000000000000000000038 :10E8E0000000000000000000000000000000000028 :10E8F0000000000000000000000000000000000018 @@ -28328,8 +28328,8 @@ :10EA00000000000000000000000000000000000006 :10EA100000000000000000000000000000000000F6 :10EA200000000000000000000000000000000000E6 -:10EA300000000000000000000000000000000000D6 -:10EA400000000000000000000000000000000000C6 +:10EA30000000000000000000000000000000004294 +:10EA400000000000000000000704000000000000BB :10EA500000000000000000000000000000000000B6 :10EA600000000000000000000000000000000000A6 :10EA70000000000000000000000000000000000096 @@ -28377,8 +28377,8 @@ :10ED100000000000000000000000000000000000F3 :10ED200000000000000000000000000000000000E3 :10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 +:10ED4000000000000000000000610007000D00004E +:10ED500005180A00050004A00000000000000000E3 :10ED600000000000000000000000000000000000A3 :10ED70000000000000000000000000000000000093 :10ED80000000000000000000000000000000000083 @@ -28424,29 +28424,29 @@ :10F000000000000000000000000000000000000000 :10F0100000000000000000000000000000000000F0 :10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000000000000000D0 +:10F0300000000000000200000000000000000000CE :10F0400000000000000000000000000000000000C0 :10F0500000000000000000000000000000000000B0 :10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 :10F080000000000000000000000000000000000080 -:10F090000000000000000000000000000000000070 +:10F090000000000010000000000000000000000060 :10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000000050 +:10F0B000000000000000000000000002000000004E :10F0C0000000000000000000000000000000000040 :10F0D0000000000000000000000000000000000030 :10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000000FF -:10F1100000000000000000000000000000000000EF -:10F1200000000000000000000000000000000000DF -:10F1300000000000000000000000000000000000CF +:10F1000000000000000000000000000002000200FB +:10F1100000000800000000000000000000000000E7 +:10F1200002000000000000000200000000000200D9 +:10F1300000000000000000000000000002000200CB :10F1400000000000000000000000000000000000BF :10F1500000000000000000000000000000000000AF :10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F -:10F19000000000000000000000000000000000006F +:10F17000000002000000000000000000000000008D +:10F18000000000000000000000000200000000007D +:10F19000000002000000000000000000000000006D :10F1A000000000000000000000000000000000005F :10F1B000000000000000000000000000000000004F :10F1C000000000000000000000000000000000003F @@ -28456,8 +28456,8 @@ :10F2000000000000000000000000000000000000FE :10F2100000000000000000000000000000000000EE :10F2200000000000000000000000000000000000DE -:10F2300000000000000000000000000000000000CE -:10F2400000000000000000000000000000000000BE +:10F2300000000000000000000000000004000000CA +:10F24000000000000020002000200000000000005E :10F2500000000000000000000000000000000000AE :10F26000000000000000000000000000000000009E :10F27000000000000000000000000000000000008E @@ -28662,36 +28662,36 @@ :10FEE0000000000000000000000000000000000012 :10FEF0000000000000000000000000000000000002 :10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000000000000000E1 +:10FF100000000004000400000000000000000000D9 :10FF200000000000000000000000000000000000D1 :10FF300000000000000000000000000000000000C1 :10FF400000000000000000000000000000000000B1 :10FF500000000000000000000000000000000000A1 :10FF60000000000000000000000000000000000091 :10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 +:10FF80004000000000000000000000000000000031 :10FF90000000000000000000000000000000000061 :10FFA0000000000000000000000000000000000051 :10FFB0000000000000000000000000000000000041 :10FFC0000000000000000000000000000000000031 :10FFD0000000000000000000000000000000000021 :10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 +:10FFF00000000000000000020040000000000000BF :020000040007F3 -:1000000000000000000000000000000000000000F0 +:1000000000000000000000100010000000000000D0 :1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000000000000A0 -:100060000000000000000000000000000000000090 -:100070000000000002000000000000000008000076 +:1000200000000000000000000000000000000200CE +:1000300000000000000002000000000000000000BE +:1000400000000000020002000200000000000000AA +:10005000000000000200000000000000000000009E +:10006000000000000200000000000000000000008E +:100070000400000000000200020002000000000076 :100080000000000000000000000000000000000070 -:100090000000000000000000000000000008000058 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000838 +:100090000000000000000000000000000000000060 +:1000A000000000000000000000000000000002004E +:1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 -:1000D00000000000000000000000000000000040E0 +:1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF @@ -28712,7 +28712,7 @@ :1001F00000000000000000000000000000000000FF :1002000000000000000000000000000000000000EE :1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE +:1002200000000004000400040004000000000000BE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E @@ -28921,31 +28921,31 @@ :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 +:100F300000000000000000000000000000040000AD :100F400000000000000000000000000000000000A1 :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 +:100F90000000000000000000004000000000000011 +:100FA000000000000000000000000000000000023F :100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 +:1010000002000000020000000200000000000000DA +:1010100000000400000000000000040000000000C8 :1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 +:1010300000000200000000000200000000000000AC :1010400000000000000000000000000000000000A0 -:101050000000000000000000000800000000000088 +:101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 -:101070000000000000000000000800000000000068 +:10107000000000000000000000000000000004006C :101080000000000000000000000000000000000060 -:101090000000000000000000000000080000000048 +:10109000000000000000000000000200000000004E :1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000080000000028 +:1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 :1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 @@ -28967,11 +28967,11 @@ :1011E00000000000000000000000000000000000FF :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE +:10121000000000000000000000000040000000008E :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E +:10125000000000000000000000004100000000004D :10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E :10128000000000000000000000000000000000005E @@ -28979,7 +28979,7 @@ :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E +:1012D0000000000000000800000000000000000006 :1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD @@ -29008,7 +29008,7 @@ :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C +:1014A0000000000000000000050005000000000032 :1014B000000000000000000000000000000000002C :1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C @@ -29157,36 +29157,36 @@ :101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 :101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 +:101DF00000000000000000000000000020040004BB :101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 +:101E10000000820082008200000000000004000434 :101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 +:101E3000000300000000000000000000000000009F :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 :101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 +:101EA00000000040000000000000000000000000F2 :101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 +:101EC0000000000000000000000000000002000010 :101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 +:101EE00000020000400000000000000000000000B0 :101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 +:101F000000000000000000000000000002000200CD +:101F100000000000008000800080008000000000C1 :101F200000000000000000000000000000000000B1 :101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 +:101F4000000000000000020002000200000000008B :101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 +:101F6000000000000000000000000000020002006D +:101F7000000002000000000800080008000800003F :101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 +:101F900000000000000003200020002000200000BE :101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 +:101FB000000000000000000000000400000000001D +:101FC0000000000000000000800000000000000091 :101FD0000000000000000000000000000000000001 :101FE00000000000000000000000000000000000F1 :101FF00000000000000000000000000000000000E1 @@ -29194,8 +29194,8 @@ :1020100000000000000000000000000000000000C0 :1020200000000000000000000000000000000000B0 :1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 +:10204000000000000000000000000000000001008F +:10205000010000000000000000000000000000007F :102060000000000000000000000000000000000070 :102070000000000000000000000000000000000060 :102080000000000000000000000000000000000050 @@ -29203,129 +29203,129 @@ :1020A0000000000000000000000000000000000030 :1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 +:1020D00020000400000000000000000000000000DC :1020E00000000000000000000000000000000000F0 :1020F00000000000000000000000000000000000E0 :1021000000000000000000000000000000000000CF :1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF +:1021200000000000000000000800000000000000A7 :10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F +:10214000000009000880C000000000000000000836 +:10215000000000800180000000000000000000007E :10216000000000000000000000000000000000006F :10217000000000000000000000000000000000005F :10218000000000000000000000000000000000004F :10219000000000000000000000000000000000003F :1021A000000000000000000000000000000000002F :1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF +:1021C00000000000200000040000000000000000EB +:1021D00000010000002002040000000000000000D8 :1021E00000000000000000000000000000000000EF :1021F00000000000000000000000000000000000DF :1022000000000000000000000000000000000000CE :1022100000000000000000000000000000000000BE :1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E +:10223000000000000000000000000000000090000E +:1022400000001000080000000000000000009000E6 +:1022500090000000000000001000000000000000DE :10226000000000000000000000000000000000006E :10227000000000000000000000000000000000005E :10228000000000000000000000000000000000004E :10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E :1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE +:1022C000000000008000000000000000000000008E +:1022D000000000000000000000008000000000007E :1022E00000000000000000000000000000000000EE :1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD :1023100000000000000000000000000000000000BD :1023200000000000000000000000000000000000AD :10233000000000000000000000000000000000009D -:10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D -:10236000000000000000000000000000000000006D +:10234000820000000000000000000000000000000B +:10235000000000000000000001000000000000007C +:10236000000900090000000000000000000000005B :10237000000000000000000000000000000000005D :10238000000000000000000000000000000000004D :10239000000000000000000000000000000000003D :1023A000000000000000000000000000000000002D :1023B000000000000000000000000000000000001D :1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD -:1023E00000000000000000000000000000000000ED +:1023D0000000000000004100000020000000030099 +:1023E00000000000000005000000000000000000E8 :1023F00000000000000000000000000000000000DD :1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC :10243000000000000000000000000000000000009C -:10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C +:10244000000000000000000000000100000000008B +:1024500000000000000000000000010090000040AB :10246000000000000000000000000000000000006C :10247000000000000000000000000000000000005C :10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C :1024A000000000000000000000000000000000002C :1024B000000000000000000000000000000000001C -:1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC +:1024C00000000000000000000000000011002100DA +:1024D0000000000000000000000000001100A1004A :1024E00000000000000000000000000000000000EC :1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB :10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B +:10254000000000000000000000000000000000414A +:1025500009000003008000000000000000000008E7 +:1025600009800003000000000000000000000000DF :10257000000000000000000000000000000000005B :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B +:1025B0000084000000840000000000000000000013 :1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB +:1025D0000001010000000088000000000000000071 +:1025E000000101020000008800000000000000005F :1025F00000000000000000000000000000000000DB :1026000000000000000000000000000000000000CA :1026100000000000000000000000000000000000BA :1026200000000000000000000000000000000000AA -:10263000000000000000000000000000000000009A +:102630000100000084000000000000000000000015 :10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A +:1026500000000000880000000100000000000000F1 +:1026600000000100088808000000000002000000CF :10267000000000000000000000000000000000005A :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A :1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A +:1026B0000000040000000000000000000000000016 :1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA +:1026D00000000000000000000000410000000000B9 +:1026E0000000000041008080800041000000800068 :1026F00000000000000000000000000000000000DA :1027000000000000000000000000000000000000C9 :1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 +:102730000000000000020000000000000000000097 :102740000000000000000000000000000000000089 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 +:102750000000000000000000001105000000000063 +:102760000000000000000011000000804000000098 :102770000000000000000000000000000000000059 :102780000000000000000000000000000000000049 :102790000000000000000000000000000000000039 :1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 +:1027B0000000000000000001000000000000000018 :1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 +:1027D00000000000000000000000000100000000F8 +:1027E00000000000000000000001000000400000A8 :1027F00000000000000000000000000000000000D9 :1028000000000000000000000000000000000000C8 :1028100000000000000000000000000000000000B8 :1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 +:10283000000000000000000000810000070400000C :102840000000000000000000000000000000000088 -:102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 +:1028500000000000000000000000000000E0000098 +:1028600081410000000000000000000000E00700BF +:1028700082000000000000000000000000000000D6 :102880000000000000000000000000000000000048 :102890000000000000000000000000000000000038 :1028A0000000000000000000000000000000000028 @@ -29333,7 +29333,7 @@ :1028C0000000000000000000000000000000000008 :1028D00000000000000000000000000000000000F8 :1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 +:1028F0000000F0F0000000000000000000000000F8 :1029000000000000000000000000000000000000C7 :1029100000000000000000000000000000000000B7 :1029200000000000000000000000000000000000A7 @@ -29341,7 +29341,7 @@ :102940000000000000000000000000000000000087 :102950000000000000000000000000000000000077 :102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 +:1029700000000000F0F00000000000000000000077 :102980000000000000000000000000000000000047 :102990000000000000000000000000000000000037 :1029A0000000000000000000000000000000000027 @@ -29357,7 +29357,7 @@ :102A40000000000000000000000000000000000086 :102A50000000000000000000000000000000000076 :102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 +:102A700000000F0F0000FFFF00000000000000003A :102A80000000000000000000000000000000000046 :102A90000000000000000000000000000000000036 :102AA0000000000000000000000000000000000026 @@ -29365,31 +29365,31 @@ :102AC0000000000000000000000000000000000006 :102AD00000000000000000000000000000000000F6 :102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 +:102AF000000000000F0F00000000000000000000B8 :102B000000000000000000000000000000000000C5 :102B100000000000000000000000000000000000B5 :102B200000000000000000000000000000000000A5 :102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 +:102B40000000000005180A20050004A00000000095 :102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 +:102B600000000000000000400006000C0000000013 +:102B700000000000000005402A06054C00A80000E7 :102B80000000000000000000000000000000000045 :102B90000000000000000000000000000000000035 :102BA0000000000000000000000000000000000025 :102BB0000000000000000000000000000000000015 :102BC0000000000000000000000000000000000005 :102BD00000000000000000000000000000000000F5 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 +:102BE000000000000000000000000F0FFFFF0000C9 +:102BF000000000000000000000003C3CFFFF00005F :102C000000000000000000000000000000000000C4 :102C100000000000000000000000000000000000B4 :102C200000000000000000000000000000000000A4 :102C30000000000000000000000000000000000094 :102C40000000000000000000000000000000000084 :102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 +:102C60000000000000000000000000000F0F000046 +:102C70000000000000000000000000003C3C0000DC :102C80000000000000000000000000000000000044 :102C90000000000000000000000000000000000034 :102CA0000000000000000000000000000000000024 @@ -29397,56 +29397,56 @@ :102CC0000000000000000000000000000000000004 :102CD00000000000000000000000000000000000F4 :102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 +:102CF000F0F00000000000000000000000000000F4 +:102D0000F0F00000000000000000000000000000E3 :102D100000000000000000000000000000000000B3 :102D200000000000000000000000000000000000A3 :102D30000000000000000000000000000000000093 :102D40000000000000000000000000000000000083 :102D50000000000000000000000000000000000073 :102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 +:102D70000000F0F000000000000000000000000073 +:102D80000000F0F000000000000000000000000063 :102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 +:102DA0000000000000000000000000000000200003 +:102DB00000002000000000000000000000002000D3 +:102DC00000000000000420000000000000002000BF +:102DD00000002000000000000000000000000000D3 +:102DE00000000000000000000000000000000003E0 :102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 +:102E00000000010000800000000000000000000041 :102E100000000000000000000000000000000000B2 :102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 +:102E300000A000A080A00000000000000000000032 :102E40000000000000000000000000000000000082 :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 :102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 +:102E8000000000001000000800000000000000002A :102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 +:102EA000000000000000000000020002000000021C +:102EB000000001800180008001800000000000000F :102EC0000000000000000000000000000000000002 :102ED00000000000000000000000000000000000F2 :102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 +:102EF00008000000000008040004000000000000BA +:102F000002000200020000000000100002000000A9 +:102F100000000000020000000000000000000000AF +:102F2000000002000000000000000000000000009F +:102F300002000200200420040004200440000000DD :102F40000000000000000000000000000000000081 :102F50000000000000000000000000000000000071 :102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 +:102F7000000080000000000080010001000000004F +:102F800000000000000080000400000080008000BD :102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 +:102FA000000000000400000000000000000000001D :102FB0000000000000000000000000000000000011 :102FC0000000000000000000000000000000000001 :102FD00000000000000000000000000000000000F1 :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 +:1030000000000000000000000000000000040100BB :1030100000000000000000000000000000000000B0 :1030200000000000000000000000000000000000A0 :103030000000000000000000000000000000000090 @@ -29455,389 +29455,389 @@ :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 +:103090002000000000000000000000000000000010 :1030A0000000000000000000000000000000000020 :1030B0000000000000000000000000000000000010 :1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF +:1030E00000000000000000001000000010000000C0 +:1030F0000000000500000000C0000000A00000006B +:10310000080000800000000000000000000800002F +:1031100000800180000000000000010000000000AD :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F :10314000000000000000000000000000000000007F :10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F +:10317000000005001000000000001000000000002A +:10318000000000000004000000000000000000013A +:1031900002000020022020000000000004000000C7 :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF :1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE +:1031E00000000000000000000000000000000800D7 +:1031F000000000000000100004000000400000007B +:1032000008048204200000002000000090008200DA +:10321000000000008200000000000000002000000C :10322000000000000000000000000000000000009E :10323000000000000000000000000000000000008E :10324000000000000000000000000000000000007E :10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E +:10327000000000000000000000000000000080C00E +:10328000000000010001008400000084000000C074 +:1032900000C00000000000000084000000000001E9 :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE +:1032C00000000000000000020000000000000000FC :1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D +:1032F00000000000000000000000080010000000B6 +:1033000082000000000400000180010000000000B5 +:103310009002C00000090000000000000000000052 +:103320000009000200000000000000000000000092 :10333000000000000000000000000000000000008D :10334000000000000000000000000000000000007D :10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D +:1033800000000000000000010300200420000000F5 +:1033900041000000000000000000000000000000EC +:1033A00000000000000000000000000000000040DD :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED :1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C +:1033F00000000000000000000000000000002000AD +:10340000880010001000000000A0900988080091BA +:1034100000000000000000000100900000A000007B +:10342000000090020000000000000000000000000A :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C :10346000000000000000000000000000000000005C :10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C +:103480000000000080008000000000C1050802204C +:103490000003000000000000000011008021000077 +:1034A000000011008080000000000000000000000B :1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC +:1034C000000000000000000000000040000000407C :1034D00000000000000000000000000000000000EC :1034E00000000000000000000000000000000000DC :1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B +:10350000000080000000800080000000088010089B +:103510001083030500000000000000000040008050 +:103520001105000000000080000000800000000085 :10353000000000000000000000000000000000008B :10354000000000000000000000000000000000007B :10355000000000000000000000000000000000006B :10356000000000000000000000000000000000005B :10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B +:103580000000000008009000A0008200000001027E +:10359000010000900000000000000000000000009A +:1035A00000020100008800000020000000C00000B0 :1035B000000000000000000000000000000000000B :1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB +:1035D00040000000000000000000000000000000AB :1035E00000000000000000000000000000000000DB :1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A +:103600000000000000000090002100200091000058 +:1036100020019001010009010000000000000000ED +:1036200001000288020000000100008888000100FB :10363000000000000000000000000000000000008A :10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A +:10365000000000000000400000000000000000002A :10366000000000000000000000000000000000005A :10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A +:10368000000000000000000000200090002000105A +:1036900000008010901008081003000000000000D7 +:1036A000000041008080800905004100008000008A +:1036B0000900000000000000000000000000000001 :1036C00000000000000000000000000000000000FA :1036D00000000000000000000000000000000000EA :1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 +:103700000000000000000000000000080000004170 +:103710000000000090809010080088080000000061 +:1037200000000000001111000080000000110000E6 +:103730000080000000000000000000000000000009 :103740000000000000000000000000000000000079 :103750000000000000000000000000000000000069 :103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 +:103780000000000000000000000000000000002019 +:1037900000900000000083C08200210002010000B0 +:1037A00000000000000000010100004000000001D6 +:1037B00000000040000000000000000000000000C9 :1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 +:1037D000000000000000000002E000000000000007 :1037E00000000000000000000000000000000000D9 :1037F00000000000000000000000000000000000C9 :1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 +:103810000000000000000000000000E00000410087 +:103820000000000000000000000000E0070082002F +:1038300000000000070082210000000000000000DE :103840000000000000000000000000000000000078 :103850000000000000000000000000000000000068 :103860000000000000000000000000000000000058 :103870000000000000000000000000000000000048 :103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 +:1038900000000000004D00000000CF55C0550000A2 +:1038A0000000000000000000000000000000F0F038 +:1038B000000000000000F0F0000000000000000028 :1038C00000000000000000000000000000000000F8 :1038D00000000000000000000000000000000000E8 :1038E00000000000000000000000000000000000D8 :1038F00000000000000000000000000000000000C8 :1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 +:10391000000000000000FF4DFFFF00005555555509 :103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 +:10393000F0F0000000000000F0F0000000000000C7 :103940000000000000000000000000000000000077 :103950000000000000000000000000000000000067 :103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 :103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 +:1039900000000000000000000FFF00F0000005071D +:1039A000F5F700000000000000000000000000002B +:1039B0000F0F0000FFFF0000FF000000FFFF0000EE :1039C00000000000000000000000000000000000F7 :1039D00000000000000000000000000000000000E7 :1039E00000000000000000000000000000000000D7 :1039F00000000000000000000000000000000000C7 :103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 +:103A1000000000000000000000000DFD08F800009C +:103A20000504F5F4000000000000000000000000A4 +:103A300000000F0F000000000000FF000000000069 :103A40000000000000000000000000000000000076 :103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 +:103A600000650006000F20000000000000000000BC :103A70000000000000000000000000000000000046 :103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 +:103A9000000000000000000000610006000D0000B2 +:103AA00000000061000100010000000000000000B3 +:103AB000000005002A06054C00A805002A00054064 +:103AC00000A800000000000000000000000000004E :103AD00000000000000000000000000000000000E6 :103AE00000000000000000000000000000000000D6 :103AF00000000000000000000000000000000000C6 :103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 +:103B100000000000000000000000000000000A0C8F +:103B200000000000FFFFFFFFBEBFFFFF000000001E +:103B3000000000000000FF0000FF00000000000087 :103B40000000000000000000000000000000000075 :103B50000000000000000000000000000000000065 :103B60000000000000000000000000000000000055 :103B70000000000000000000000000000000000045 :103B80000000000000000000000000000000000035 :103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 +:103BA0000A0C000000003F0F7F5FBEBFBEBF0000D9 +:103BB0000000000000000000FF0000FF0000000007 :103BC00000000000000000000000000000000000F5 :103BD00000000000000000000000000000000000E5 :103BE00000000000000000000000000000000000D5 :103BF00000000000000000000000000000000000C5 :103C000000000000000000000000000000000000B4 :103C100000000000000000000000000000000000A4 -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 +:103C20000000000000000000FFFFFFFFFFFFFFFF9C +:103C300000000000000000000000FF0000FF000086 :103C40000000000000000000000000000000000074 :103C50000000000000000000000000000000000064 :103C60000000000000000000000000000000000054 :103C70000000000000000000000000000000000044 :103C80000000000000000000000000000000000034 :103C90000000000000000000000000000000000024 -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 +:103CA00000000000000000000000FFFFC7053E3ECE +:103CB0003EFF00000000000000000000FF0000FFC9 :103CC00000000000000000000000000000000000F4 :103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 +:103CE0000000000000000000000020000000200094 :103CF00000000000000000000004000000000000C0 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 +:103D000000000000000000020002000000000000AF +:103D1000900000000000000000000400000000000F +:103D2000080004000400000200020003000000007C :103D30000000000000000000000000000000000083 :103D40000000000000000000000000000000000073 :103D50000000000000000000000000000000000063 :103D60000000000000000000000000000000000053 :103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 +:103D800000000000000000000000000000004000F3 :103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000000000000013 +:103DA0000000800080008000000000000000000093 :103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 +:103DC00000000000000000000000000000001000E3 :103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 +:103DE00000000000000000000000000200000000D1 :103DF00000000000000000000000000000000000C3 :103E000000000000000000000000000000000000B2 :103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000020000000000000050 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 +:103E2000000002000000000040000200000000004E +:103E300000000800000040000000002000200020DA +:103E4000820000000000000000008400000000105C +:103E500084000000000000000000000000000000DE +:103E6000000000000200000010001000020002002C +:103E7000000000000000000000000000000400003E +:103E80000000000000000000000000080004000422 :103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 +:103EA000000000000000000000008008000000008A +:103EB0000000000080000000800000000001000100 +:103EC00000010000040000000000000000080000E5 +:103ED00000010000000000000000000000000000E1 +:103EE0000000000000000000000000000040000092 :103EF00000000000000000000000000000000000C2 :103F000000000000000000000000000000000000B1 :103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 +:103F20000000000000000000000000000000010090 +:103F30000000000000000000000000000020002041 +:103F40000000000000000000000000000000001160 :103F50000000000000000000000000000000000061 :103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 :103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 +:103FA00000000900400000001100000000000000B7 +:103FB00004000500000000000000000000000001F7 +:103FC0000021000000C00000000000000000000010 :103FD00000000000000000000000000000000000E1 :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 +:104010000000000000000800000008000000000090 :104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 +:104030000080000000000000000000008400A000DC +:1040400000C000400040040000000000000000002C +:104050000040000000000000000000000000000020 +:10406000000000110000000000000000000000003F :104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 +:104080000000000000000000100000000000000020 :104090000000000000000000000000000000000020 :1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 +:1040B00000A00020000000C000000000000021005F +:1040C00021000020050000008000000041004100A8 +:1040D00008000000000000000000000000000000D8 :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 :1041000000000000000000000000000000000000AF :10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F +:10412000000000000000000000008200000082008B +:1041300004000020000084914000000040020000C4 +:1041400088000100000000000400C0000000A00082 :10415000000000000000000000000000000000005F :10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F :10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F :1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF +:1041B0000000000005850000052085000000400487 +:1041C0000000210408880000000000C0000000007A +:1041D00000000000008400000000000000840000D7 :1041E00000000000000000000000000000000000CF :1041F00000000000000000000000000000000000BF :1042000000000000000000000000000000000000AE :10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E +:104220000000000000000000000084000000840086 +:1042300000000000000000200000840084800000D6 +:1042400010020000C00008000000842000A001004F +:104250000000000082008200000000000000000258 +:10426000000000000000000200000000000000004C :10427000000000000000000000000000000000003E :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E :1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE +:1042B00000840082000000000001000000000520D2 +:1042C00000000001000000000000000000010021CB +:1042D00004000800000000000000080008000000C2 +:1042E000000000000000000000000040000000008E :1042F00000000000000000000000000000000000BE :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D :10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D +:1043300000000000000000000000C0401090900845 +:104340009002000001A1000990050083A10890825D +:104350008241020300000000000000000200200073 +:10436000000020000000000000000000000000002D :10437000000000000000000000000000000000003D :10438000000000000000000000000000000000002D :10439000000000000000000000000000000000001D :1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD +:1043B000000000000000000000000000809110825A +:1043C000002080A0000010A003A00090001020207A +:1043D0008383809080910000000000000000800036 :1043E00000000000000000000000000000000000CD :1043F00000000000000000000000000000000000BD :1044000000000000000000000000000000000000AC :10441000000000000000000000000000000000009C :10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C +:10443000000000000000000000008000000080007C +:1044400000118083800300002000211005800500FA +:104450002000832110808080000000000000000008 +:10446000000000008000800000000000000000004C :10447000000000000000000000000000000000003C :10448000000000000000000000000000000000002C :10449000000000000000000000000000000000001C :1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC +:1044B00000000000000000000000900004008800E0 +:1044C0000420200102029001000091008801A00850 +:1044D000000088002000030402A00000000000008B +:1044E000000020009000A0008200000000000000FA :1044F00000000000000000000000000000000000BC :1045000000000000000000000000000000000000AB :10451000000000000000000000000000000000009B :10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B +:104540000000400200089188C0850000880100003A +:10455000000182019004000890A1919100000000E8 +:104560000000000000200090000400040000000093 :10457000000000000000000000000000000000003B :10458000000000000000000000000000000000002B :10459000000000000000000000000000000000001B :1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB +:1045C0000000000080A011009020809000000008F2 +:1045D00000210521804000A02000809010080000EC +:1045E00000000000000000000000008000800000CB :1045F00000000000000000000000000000000000BB :1046000000000000000000000000000000000000AA :10461000000000000000000000000000000000009A :10462000000000000000000000000000000000008A :10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A +:10464000000000000000A10020081011020000007E +:10465000008200108080800300A180418080802043 :10466000000000000000000000000000000000004A :10467000000000000000000000000000000000003A :10468000000000000000000000000000000000002A :10469000000000000000000000000000000000001A :1046A000000000000000000000000000000000000A :1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA +:1046C00000000088009000009100080989892100FD +:1046D000000010C1909104040401904182890240BD +:1046E00004000000000000000000000000900040F6 :1046F00000000000000000000000000000000000BA :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 :104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 +:104740000000000000000000000000000000070062 +:104750006082000000000000000050000000000027 +:104760000700410000000000000000000000000001 :104770000000000000000000000000000000000039 :104780000000000000000000000000000000000029 :104790000000000000000000000000000000000019 :1047A0000000000000000000000000000000000009 :1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 +:1047C000000000000000000000000000BDBDBD00B2 +:1047D000BDBDB0B000009099939900000000FF7F2C +:1047E000FF7EFFFFFF24000000000000000000002B +:1047F0000000003F80BF000000000000000000003B :1048000000000000000000000000000000000000A8 :104810000000000000000000000000000000000098 :104820000000000000000000000000000000000088 :104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 +:1048400000000000000000000000000000000D0D4E +:104850000D0000BD00B000009C999F990000000071 +:10486000FF6FFF66FFFFFFF4000000000000000084 +:1048700000000000C0FF80BF00000000000000003A :104880000000000000000000000000000000000028 :104890000000000000000000000000000000000018 :1048A0000000000000000000000000000000000008 @@ -29851,490 +29851,490 @@ :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 :104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 +:1049500000000FFF0C3C24043C0C00002CBC2CBCC1 +:10496000000000006FFFEFFFFFFFFFFF00000000EF +:104970000000000000000000FF00E6E6000000006C :104980000000000000000000000000000000000027 :104990000000000000000000000000000000000017 :1049A0000000000000000000000000000000000007 :1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 +:1049D000006090F0099908186606FF0F0000FFFFBD +:1049E000000020B020B066FFE7FF7E7F3C3F000064 +:1049F00000000000000000000000FF00262600006C :104A000000000000000000000000000000000000A6 :104A10000000000000000000000000000000000096 :104A20000000000000000000000000000000000086 :104A30000000000000000000000000000000000076 :104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 +:104A50000000000000000061000E000D00000000DA +:104A600000610006000D00000061000E000D000056 :104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 :104A90000000000000000000000000000000000016 :104AA0000000000000000000000000000000000006 :104AB00000000000000000000000000000000000F6 :104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 +:104AD00000000000000000001454BEFEC30082006D +:104AE000000000000000F330F33000000000000080 +:104AF000C3000000000000000000000000000000F3 :104B000000000000000000000000000000000000A5 :104B10000000000000000000000000000000000095 :104B20000000000000000000000000000000000085 :104B30000000000000000000000000000000000075 :104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 +:104B5000000000000000000000001404BEAE0000D1 +:104B60008200000000000000E320F7340000000095 +:104B70008200820000000000000000000000000031 :104B80000000000000000000000000000000000025 :104B90000000000000000000000000000000000015 :104BA0000000000000000000000000000000000005 :104BB00000000000000000000000000000000000F5 :104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 +:104BD000000000000000000000000000202F00FF87 +:104BE0000000000000000000000082000A00000039 +:104BF000503083008300000000000000000000002F :104C000000000000000000000000000000000000A4 :104C10000000000000000000000000000000000094 :104C20000000000000000000000000000000000084 :104C30000000000000000000000000000000000074 :104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 +:104C50000000000000000000000000000000E0EF85 +:104C600000FF000000000000C303C000D7FF5FFF8B +:104C700000005030800080000000000000000000B4 :104C80000000000000000000000000000000000024 :104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 +:104CA000000000000000000000000000000088007C +:104CB00000000000000000000000200000000000D4 +:104CC0008800040000000100100000000000000443 +:104CD00001002100000005000000000000000000AD +:104CE00000000000000000000003000000000000C1 :104CF00000000000000000000000000000000000B4 :104D000000000000000000000000000000000000A3 :104D10000000000000000000000000000000000093 :104D20000000000000000000000000000000000083 :104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 +:104D4000000000008000000008000000400000009B +:104D50000000040084000000840000000000000047 :104D60000000000000000000000000000000000043 :104D70000000000000000000000000000000000033 :104D80000000000000000000000000000000000023 :104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 +:104DA0000000000200000000000000000000000001 :104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 +:104DC00000000400000000000000000000000000DF +:104DD00000000000000000002000200090004000C3 +:104DE000A010400900000300000040000000000087 +:104DF000000000000000000008000000000010009B +:104E0000000000000000040000800080008000001E +:104E1000000000000000000000000000000008008A +:104E2000080000000000020010000800020000005E +:104E3000000000000004000000000000000004006A +:104E4000040000000000000240000000000000001C +:104E50000000000000000000000080008000000052 +:104E60008000000080000000C00000008000000002 +:104E700000000000000000000000800000000000B2 +:104E800080000000000000008000002000200020C2 +:104E9000000004000000000000000000000000000E :104EA0000000000000000000000000000000000002 :104EB00000000000000000000000000000000000F2 :104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 +:104ED0000000000000000000010000000080000051 +:104EE00000000010000000000000080200050000A3 +:104EF00000000021C0008805400082000000000082 +:104F000000000003000000118800000000000020E5 :104F10000000000000000000000000000000000091 :104F20000000000000000000000000000000000081 :104F30000000000000000000000000000000000071 :104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 +:104F5000000000000000100000000400000000201D +:104F60000000050008001100110008000000090001 +:104F70000000000041C010000000000021040000FB +:104F800000000000030021000000030000000000FA +:104F90000001000000000000000000000000000010 :104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 +:104FB00000000000000000000000080008000000E1 +:104FC00000000000080000000000010008000020B0 +:104FD0000000080082000000100000000100000036 +:104FE00000002000000500050011C010880000002E +:104FF000000000000000C00000000000C040C00031 +:1050000008000000A0400000000001000080000037 :105010000000000000000000000000000000000090 :105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 +:105030000000000000200000000000000000100040 +:105040000800000000000000000000000400002034 +:1050500000010082000000000000000000002000AD +:10506000000000008000000000000000008500003B :105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 +:1050800000000000000000000000000020000004FC +:10509000000000000000000002000000000000000E :1050A0000000000000000000000000000000000000 :1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000000000008F +:1050C0000000000000000000000040000020000080 +:1050D0000000000000000000100000210000080097 +:1050E0000400040001000000840300009000880018 +:1050F0004000C000C00800200000C000C000000048 +:105100000000C000840084009000C0000200A011D4 +:1051100000000000000000000020A00000000000CF :10512000000000000000000000000000000000007F :10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F +:10514000000000000000000000000000000000015E :10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F +:105160000000000080000400000005000000119015 +:105170000084000005004184002000000888419060 +:1051800009000300400405000504088200008000B7 +:105190000000000003000300000000010000000008 :1051A00000000000000000000000000000000000FF :1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E +:1051C00000000000000000000000000001000000DE +:1051D00000000000000000000100000000000000CE +:1051E0000000000000000400200010008403008084 +:1051F000A0000000000400080000000800000800F3 +:10520000C00000210800000084008421000082000A +:10521000C0020000000002000020000000000000AA :10522000000000000000000000000000000000007E :10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE +:10524000000000000000000000000000100002004C +:105250000000000008000000000004000000000042 +:10526000000000000000000080008000000000003E +:10527000001000000000000000000000000000001E +:10528000000000000000800000000200000000009C +:1052900020000000000000000000000100000000ED +:1052A000000000000000000000000090000041002D :1052B00000000000000000000000000000000000EE :1052C00000000000000000000000000000000000DE -:1052D00000000000000000000000000000000000CE -:1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D -:10531000000000000000000000000000000000008D -:10532000000000000000000000000000000000007D +:1052D0000000900000000040028290200000820048 +:1052E00000000000000000000991018884109091E6 +:1052F00040A190C18403829000000000840100015D +:105300000000000000000000000000A00004008277 +:1053100000C00100000000000000C00282044082C2 +:1053200040820000000000000000000000000000BB :10533000000000000000000000000000000000006D :10534000000000000000000000000000000000005D -:10535000000000000000000000000000000000004D -:10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD +:105350000000110080000000000088008080000034 +:1053600080000000000000000000911108208291E0 +:1053700080108088090880088003000803038020CB +:10538000001000000000000000000000008000800D +:10539000000000001100210000000000C0802080FB +:1053A00080000080000000000000000000000000FD :1053B00000000000000000000000000000000000ED :1053C00000000000000000000000000000000000DD -:1053D00000000000000000000000000000000000CD -:1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C +:1053D00000000000000000800000008000000020AD +:1053E0008080800000000000000000002080C111CB +:1053F000111190101000084188408805108083002A +:10540000031008030000800080000000000000007E +:105410000009000000000041890000030080000036 +:1054200080020080008000000000000000000000FA :10543000000000000000000000000000000000006C :10544000000000000000000000000000000000005C -:10545000000000000000000000000000000000004C -:10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000000FC +:1054500000000000000000000020000000C000006C +:10546000100882A010000000000000000000404072 +:1054700020018889914121200300A10805080940E5 +:1054800002009001014000000200020088000000BC +:105490000000000000A0000040010500200000887E +:1054A000A0000401828482A000000000000000002F :1054B00000000000000000000000000000000000EC :1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B +:1054D00000000000000000000100008888000100BA +:1054E000209000900090009000000000000000005C +:1054F000404001889021039120080089018904918E +:105500000000000000010001000000000000000099 +:1055100000002000000000000200000088000000E1 +:10552000010090020090008208A00000000000002E :10553000000000000000000000000000000000006B :10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:10556000000000000000000000000000000000003B -:10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B -:10559000000000000000000000000000000000000B -:1055A00000000000000000000000000000000000FB +:10555000000000000000000000004100008000008A +:105560000900000000000000000000000000000032 +:10557000000080891103C105911000A021081021AD +:10558000801000050303412100100000000000000E +:10559000000000000000000000008000000000008B +:1055A0000000410000850021000300000000000011 :1055B00000000000000000000000000000000000EB :1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000000000AB -:10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A +:1055D00000000000000000000000000000110000BA +:1055E0000080000000000008000000000000000033 +:1055F0000000000089109182030008112184050831 +:105600001000841121100380058003200000000099 +:10561000000000800000800080008000000000008A +:105620000091208000000011802000000000000098 :10563000000000000000000000000000000000006A :10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:10568000000000000000000000000000000000001A -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA +:105650000000000000000000000000000000000149 +:10566000000000400000880020102008100000000A +:10567000000000000000909111109090400189C03E +:1056800088048990080001910002000200000000D7 +:1056900000000090000800000400040002008200E6 +:1056A00000000009010200000801048282908800C5 :1056B00000000000000000000000000000000000EA :1056C00000000000000000000000000000000000DA :1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 +:1056E0000000000007008221000000000700000009 +:1056F0000000000000000000000000E007000000C3 +:105700000000000000008100000000000000000018 :105710000000000000000000000000000000000089 -:105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 +:105720000000000000E000008141000000000700D0 +:1057300082000000000000000000000000000000E7 :105740000000000000000000000000000000000059 :105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 +:10576000000000000000F0F00000FF03AAAAFFFF05 +:105770002075000000000000000070707D7D0C3C72 +:105780000FFFC3C305C3C3C3C5C0000000000000B2 +:1057900000000000000000000000000055535550BC +:1057A000000000000000000000000000AEFFFFFF4E +:1057B000FFFFFFFF000000000000000000000000ED :1057C00000000000000000000000000000000000D9 :1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 -:1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 +:1057E0000000000000000000F0F00000FF00AAAA86 +:1057F00000002075000000000000000070007D0027 +:1058000004140555C3C3F5C3C3C3C5CF00000000CE +:105810000000000000000000000000000000555FD4 +:10582000555C000000000000000000000000AEFF1A +:10583000AEFFFC3CFEBE00000000000000000000C7 :105840000000000000000000000000000000000058 :105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 -:105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000000E8 +:1058600000000000000000003C3C0000FFFFFF00C3 +:10587000FFFF0000000000000000000000007D7D30 +:10588000007D2CAF2CAF7F027F0214D714D700000D +:105890000000000000000000000000008280828004 +:1058A0005515FFBF0000000000000000C000C00050 +:1058B000FFFFFF7CFFFF1FFF000000000000000053 :1058C00000000000000000000000000000000000D8 :1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 -:105920000000000000000000000000000000000077 -:105930000000000000000000000000000000000067 +:1058E000000000000000000000003C3C0000000040 +:1058F000000000FFF0A050000000000000000000C9 +:10590000707000702CAF00000000FFFF14D70CCFA8 +:1059100000000000B010B010000000000000020005 +:1059200002000010AABA0000000000000000404081 +:105930004040FFFFFF50FFFF1F1F0000000000005E :105940000000000000000000000000000000000057 :105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 -:105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 +:105960000000000000000000000005002A000540C3 +:1059700000A800000E080000000000000000000069 +:105980000000006100090001000000610006000D38 +:10599000000000610006000D000100000000000092 +:1059A00000000000000000000000000000400006B1 +:1059B000000C00010061000E000D0000000000005E :1059C00000000000000000000000000000000000D7 :1059D00000000000000000000000000000000000C7 :1059E00000000000000000000000000000000000B7 :1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 +:105A0000000000004545CFCF00E0E0E05500FFAAD0 +:105A1000EF2CEB280F4D0F4DEB28EB28000000007A :105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 +:105A30000F0FFFFF000000000000C200C2000000C6 :105A40000000000000000000000000000000000056 :105A50000000000000000000000000000000000046 :105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 +:105A80000000000000004500CF0000EBEBEB15101C +:105A9000BFBAE320EB280000FFFFE320EF2C00005B :105AA00000000000000000000000000000000000F6 -:105AB00000000000000000000000000000000000E6 +:105AB00000000F0F00000000000000004000400048 :105AC00000000000000000000000000000000000D6 :105AD00000000000000000000000000000000000C6 :105AE00000000000000000000000000000000000B6 :105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 +:105B00000000000000000000F500340030203C28B8 +:105B1000AAC0AAAAC5550555C382C3D2FFF2000286 :105B20000000000000000000000000000000000075 -:105B30000000000000000000000000000000000065 +:105B3000000000000000F0F0000000000000000085 :105B40000000000000000000000000000000000055 :105B50000000000000000000000000000000000045 :105B60000000000000000000000000000000000035 :105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000000000000000E5 +:105B800000000000000000000000F5F53434F0A033 +:105B9000FFAAAACFAAAAC555F555C387C3D7FFF751 +:105BA00000070000000000000000000000000000EE +:105BB0000000000000000000F0F000000000000005 :105BC00000000000000000000000000000000000D5 :105BD00000000000000000000000000000000000C5 -:105BE00000000000000000000000000000000000B5 -:105BF00000000000000000000000000000000000A5 -:105C00000000000400000000000000000000000090 -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 +:105BE0000000000000000000200000000000000095 +:105BF0000004000040000100000000000000000060 +:105C00000011000400000800000000000000000077 +:105C1000000400040000000000000000000000007C +:105C20000000000000030000000000000000000071 :105C30000000000000000000000000000000000064 :105C40000000000000000000000000000000000054 :105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000000024 +:105C60000000000000002000000000000000000014 +:105C70000000000000000000100000000000000014 :105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 +:105C900000000000000005000000000000000000FF :105CA00000000000000000000000000000000000F4 :105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 +:105CC00000020000000000000000000000000000D2 +:105CD0000000000000400000000000000000000084 :105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 +:105CF000000040000000000010000400910010802F :105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 +:105D100000000000000090000000000000000000F3 +:105D2000000008000800080000000000000000005B +:105D30000000000000000000080002000000000059 +:105D4000000000000000000000000000040000004F +:105D5000000002000200020002000000000000003B +:105D600002000810081090109000000000000000D1 +:105D7000000000008082000000048000800010000D +:105D800080200040004000000000000000000000F3 :105D90000000000000000000000000000000000003 :105DA00000000000000000000000000000000000F3 :105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 +:105DD00000000000800080008000800000000000C3 +:105DE000000000000000000000880000000000002B +:105DF00000000000000000000000000000000100A2 +:105E00000100000000000000000000000000000091 +:105E1000000000000000000000000000080000205A +:105E200000000000000000008400000000004000AE +:105E30000400000004009000000084000000000046 +:105E40000020000000000000000000000000000032 :105E50000000000000000000000000000000000042 :105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000000000000000000E2 -:105EC00000000000000000000000000000000000D2 +:105E70000000000000000000000000000000100012 +:105E80000400020040000000000000000000034089 +:105E900003A00300002041000000000000000000FB +:105EA00010000000000004000000000000000000DE +:105EB000030008A004000000000000000300000030 +:105EC00000001000040000000000000000000000BE :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 -:105F00000000000000000000000000000000000091 +:105EF00040000000820000000000000010000000D0 +:105F000008000800A0000080000000000000080059 :105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000000061 -:105F40000000000000000000000000000000000051 +:105F2000400000000011000000000000C000000060 +:105F30000000000000000000000000040004000059 +:105F400000000000000000400009000400000008FC :105F50000000000000000000000000000000000041 -:105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 +:105F600001000000000000000000004000000040B0 +:105F7000000000000000000003000000000000001E +:105F8000000000000000000000040000000000000D :105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 +:105FB00000000000000000A0000000000000000041 +:105FC00000040000000002000000000000000000CB :105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 -:106000000000000000000000000000000000000090 -:106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 +:105FE00000000400000000000000000000000000AD +:105FF000000000008200080000000800000000000F +:1060000000009000000000000000000000020000FE +:106010000000000000000200080000200000000056 +:106020000000000000000000000040000000000030 :106030000000000000000000000000000000000060 :106040000000000000000000000000000000000050 :106050000000000000000000000000000000000040 :106060000000000000000000000000000000000030 :106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 -:106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 +:10608000000000000000000000000000008440004C +:1060900020040300090000000000000000002000B0 +:1060A0000000208803000800102004204020050084 +:1060B00004000400402000000000082000900000C0 +:1060C00000000000000000C0000000000484000088 +:1060D00011900000400005000000000000000000DA :1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:10611000000000000000000000000000000000007F +:1060F000000000000000000000000000840000021A +:106100000800080008000000000000000100010075 +:106110000003000900000002000000000000000071 :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F :10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F +:10615000000000000000000200000000000000003D :10616000000000000000000000000000000000002F :10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000000000000EF +:1061800000000000000010000000000000000800F7 +:1061900004000000000000000000000000000000FB +:1061A00000000000410000000000000000000000AE :1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF +:1061C00000000000110000000000000000000000BE :1061D00000000000000000000000000000000000BF :1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E +:1061F000000000000000000000100000000000008F +:1062000000000000000100010001000001A00004E6 +:106210000040000800000000000000000000000036 :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E :10624000000000000000000000000000000000004E :10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E +:10626000000000000000000000900000000000009E :10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE +:10628000000000000000001000100020000311803A +:1062900000A100000000000000000000000000005D :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE :1062C00000000000000000000000000000000000CE :1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE +:1062E000000000000000000000000080000000002E :1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D +:10630000000000000000000000800000000000000D +:106310000040000991900000000000000000000013 :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D :10634000000000000000000000000000000000004D :10635000000000000000000000000000000000003D :10636000000000000000000000000000000000002D :10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD +:10638000000000000000000000000002000000000B +:10639000000082000400A11188000000000000003D :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD :1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000000000000009D +:1063E0000000000000000000000000000000008429 +:1063F000000000C0000000000000000000000000DD :10640000000000000000000000000000000000008C -:10641000000000000000000000000000000000007C +:1064100000000000049082880008C1100000000005 :10642000000000000000000000000000000000006C :10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C :10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C +:10646000000000000000000000000000000001002B +:106470000000A090000000000000000000000000EC :10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC +:10649000030005000000800000030000A0000000D1 :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC :1064D00000000000000000000000000000000000BC :1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C +:1064F000020000000080000000000000000000001A :10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B +:106510002100200010000800800511880000000004 :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B :10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B +:10657000000000118000000000000000000000008A :10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB +:10659000000001000000010001000800A12008081F +:1065A0008800000000000000000000000000000063 :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB :1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B +:1065F00000000000000120000088000000000000F2 :10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A +:10661000000000000000000000000000000000E09A +:1066200007000082000000000000000000000000E1 :10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A :10665000000000000000000000000000000000003A :10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A +:106670000000000000000000000007000000000013 :10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA +:106690000000000000000000000000000000F0808A +:1066A000FF8FF03CF0000000000000000000000040 :1066B00000000000000000000000000000000000DA :1066C00000000000000000000000000000000000CA :1066D00000000000000000000000000000000000BA :1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A +:1066F00000000000000000000000FF000000FF009C :106700000000000000000000000000000000000089 :106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 +:10672000FF8FFF8FF03CF000000000000000000031 :106730000000000000000000000000000000000059 :106740000000000000000000000000000000000049 :106750000000000000000000000000000000000039 :106760000000000000000000000000000000000029 -:106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 +:10677000000000000000000000000000FF0000001A +:10678000FF0000000000000000000000000000000A :1067900000000000000000000000000000000000F9 :1067A00000000000000000000000000000000000E9 :1067B00000000000000000000000000000000000D9 @@ -30344,31 +30344,31 @@ :1067F0000000000000000000000000000000000099 :106800000000000000000000000000000000000088 :106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 +:10682000000000000F0F0F0F24BD24BD000000006A :106830000000000000000000000000000000000058 :106840000000000000000000000000000000000048 :106850000000000000000000000000000000000038 :106860000000000000000000000000000000000028 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 +:10687000000000000000000000000000000000FF19 +:106880000000FFFF0000000000000000000000000A :1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 +:1068A000000000000000FFFF00812DBD24BD00009E :1068B00000000000000000000000000000000000D8 :1068C00000000000000000000000000000000000C8 :1068D00000000000000000000000000000000000B8 :1068E00000000000000000000000000000000000A8 :1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 +:1069000000FF000000000000000000000000000088 :106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 +:1069200000610006000D00008000000E000C000059 :106930000000000000000000000000000000000057 :106940000000000000000000000000000000000047 :106950000000000000000000000000000000000037 :106960000000000000000000000000000000000027 :106970000000000000000000000000000000000017 -:106980000000000000000000000000000000000007 +:10698000000015002A00054000A8000000000000DB :1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 +:1069A00000000008AA08000000000000FF00F0F04E :1069B00000000000000000000000000000000000D7 :1069C00000000000000000000000000000000000C7 :1069D00000000000000000000000000000000000B7 @@ -30376,237 +30376,237 @@ :1069F0000000000000000000000000000000000097 :106A00000000000000000000000000000000000086 :106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 +:106A2000000000000008AA08000000000000FF00AD +:106A3000F0F0000000000000000000000000000076 :106A40000000000000000000000000000000000046 :106A50000000000000000000000000000000000036 :106A60000000000000000000000000000000000026 :106A70000000000000000000000000000000000016 :106A80000000000000000000000000000000000006 :106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 +:106AA00000000000000000E1AAE10000000000007A +:106AB000FF0000FF000000000000000000000000D8 :106AC00000000000000000000000000000000000C6 :106AD00000000000000000000000000000000000B6 :106AE00000000000000000000000000000000000A6 :106AF0000000000000000000000000000000000096 :106B00000000000000000000000000000000000085 :106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 -:106B30000000000000000000000000000000000055 +:106B2000000000000000000055E1FFE1000000004F +:106B30000000FF0000FF0000000000000000000057 :106B40000000000000000000000000000000000045 :106B50000000000000000000000000000000000035 :106B60000000000000000000000000000000000025 :106B70000000000000000000000000000000000015 :106B80000000000000000000000000000000000005 :106B900000000000000000000000000000000000F5 -:106BA00000000000000000000000000000000000E5 -:106BB00000000000000000000000000000000000D5 -:106BC00000000000000000000000000000000000C5 -:106BD00000000000000000000000000000000000B5 -:106BE00000000000000000000000000000000000A5 +:106BA0000000000020002000000088000000C0005D +:106BB000840000000100A10000031000000000009C +:106BC0000000000000000000000000004000000085 +:106BD00000000000000004000403000000000000AA +:106BE00000000001000000000000000000000000A4 :106BF0000000000000000000000000000000000095 :106C00000000000000000000000000000000000084 :106C10000000000000000000000000000000000074 -:106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 +:106C2000000000000000000000000000000009005B +:106C3000000000002000040004000000000000002C +:106C40000000110000000000000000000000000033 +:106C500000000000000040008000800000020000F2 :106C60000000000000000000000000000000000024 :106C70000000000000000000000000000000000014 :106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000000000000000000D4 -:106CC00000000000000000000000000000000000C4 -:106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 -:106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 +:106C900000000000000000000000000000020002F0 +:106CA00000000002000000000000000000000000E2 +:106CB00000000000000000000000042000000000B0 +:106CC000000000000000040004000010001000009C +:106CD00000000000000004410400000082000000E9 +:106CE00000000000020000000000020000000000A0 +:106CF000000004000000000002000000000000008E +:106D0000020000000000000002000000000000007F +:106D10000000000000000200080004000000000065 +:106D2000000000000200021000000000000000004F +:106D300000000000000000000000000080010000D2 :106D40000000000000000000000000000000000043 -:106D50000000000000000000000000000000000033 +:106D50000000000000000000800080000000000033 :106D60000000000000000000000000000000000023 :106D70000000000000000000000000000000000013 :106D80000000000000000000000000000000000003 :106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 +:106DA00000000000000000100800000000000000CB +:106DB00000000000000000000000000004000000CF +:106DC000000090008400400020000000000000004F +:106DD0000000000000000000000088000000080023 +:106DE0000400080000000000000000000000000097 +:106DF000000004000400080000000400000000007F +:106E0000000000000000C0000000000004000000BE +:106E10000000000000000000000000000010000062 :106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 +:106E300003000000000000000000000000000088C7 +:106E4000000000000000000000000004002000001E +:106E50000000000000000000000000901000000290 +:106E60002000800000000000000000000000000082 +:106E7000000004000000000000000000000000000E +:106E800000000000080000000000000000000000FA :106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 +:106EA00000000000000000000000000000000800DA +:106EB00082000000820000000000000000000000CE +:106EC0000020080000000000000008000000000092 +:106ED0000800820000009000000000000000000098 +:106EE0000004080000000000000000000000000096 +:106EF0000000000000410000000000000000000051 :106F00000000000000000000000000000000000081 :106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 -:106F50000000000000000000000000000000000031 +:106F20000000001000000000000000000010001130 +:106F30000000000008000000000000000300000046 +:106F400000000385000008000000080000000000A9 +:106F5000000000000800000000000500080000001C :106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 +:106F700000000000000000002000000000000000F1 +:106F8000020000000000000002000084000200086F +:106F900000000040000000000000000000000000B1 :106FA00000000000000000000000000000000000E1 :106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 +:106FC00000000000080000000000000000000000B9 +:106FD000000000000000000000000000000082002F +:106FE0000000000000000020000000000000000081 :106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 +:107000000000000000000000080000000000000078 :107010000000000000000000000000000000000070 :107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 +:107030000000000000000000000000000820000028 +:10704000210008C00020090000042090000000007A +:10705000050000000000000000000000000000002B +:10706000000000900000000000010000000000008F +:1070700000000000000000200000030000000000ED +:1070800000000000000000200000000000001000D0 :1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 +:1070A000000000000084000000000000000000005C +:1070B00000000000000000000000100000020000BE +:1070C00090000000820000000000000000000000AE +:1070D00000040000000000000000000000000000AC +:1070E0000000000000000000000000800000000020 +:1070F000004100000000000000000000000000004F :10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000000FF +:10711000000000000000000000210000000000004E +:10712000000000000000000000000000000000025D +:10713000000000000000000000004000000000000F +:107140000300000000000002000003000000000037 +:1071500041000000000000000000000000000000EE +:1071600008000020000008000000030000200000CC +:10717000000000000000000000000000000000C04F +:107180000000000000000040208800000000000017 :1071900000000000000000000000000000000000EF :1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F +:1071B00000000000000000002000000000000000AF +:1071C000000000000000000000000840000800006F +:1071D0000488000000000000000000000000000023 +:1071E000000000000000000000001010904000406F +:1071F000908200000000000000000000000000007D :10720000000000000000000000000000000000007E :10721000000000000000000000000000000000006E :10722000000000000000000000000000000000005E :10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E +:1072400000000000000000000000000008000080B6 +:1072500000008000000000000000000000000000AE +:10726000000000000000000000000000808080801E +:10727000000080800000000000000000000000000E :1072800000000000000000000000000000000000FE :1072900000000000000000000000000000000000EE :1072A00000000000000000000000000000000000DE :1072B00000000000000000000000000000000000CE :1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE +:1072D00080A000000000000000000000000000008E :1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E +:1072F000801100108000000000000000000000006D :10730000000000000000000000000000000000007D :10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D :10733000000000000000000000000000000000004D :10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D +:1073500090000420881040000000000000000000A1 :10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D +:1073700090000201848890000000000000000000DE :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED :1073A00000000000000000000000000000000000DD :1073B00000000000000000000000000000000000CD :1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD +:1073D000000000000008009000A000000000000075 :1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D +:1073F0000000909000100088C09000000000000085 :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C :10742000000000000000000000000000000000005C :10743000000000000000000000000000000000004C :10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C +:1074500000000000000000000000008000000000AC :10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C +:10747000000000000000000000008000000000008C :1074800000000000000000000000000000000000FC :1074900000000000000000000000000000000000EC :1074A00000000000000000000000000000000000DC :1074B00000000000000000000000000000000000CC :1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC +:1074D000000000000000000000200080000000000C :1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C +:1074F0000000000000008000000900000000000003 :10750000000000000000000000000000000000007B :10751000000000000000000000000000000000006B :10752000000000000000000000000000000000005B :10753000000000000000000000000000000000004B :10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B +:107550000000000000000000A000A0101090080033 :10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B +:10757000000000000000000090001010888840000B :1075800000000000000000000000000000000000FB :1075900000000000000000000000000000000000EB :1075A00000000000000000000000000000000000DB :1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB +:1075D00000000000000000000000000000000700A4 :1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B -:10760000000000000000000000000000000000007A +:1075F0000000000000000000000000000000070084 +:1076000000820000000000000000000000000000F8 :10761000000000000000000000000000000000006A :10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA +:10765000000000000000000000000000AAABFFFFD7 +:1076600055F500A000000000000000000000000030 +:10767000000000000000000000000000007D7D7D93 +:10768000C2C2FAFA00000000000000000000000082 :1076900000000000000000000000000000000000EA :1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA :1076C00000000000000000000000000000000000BA -:1076D00000000000000000000000000000000000AA -:1076E000000000000000000000000000000000009A -:1076F000000000000000000000000000000000008A -:107700000000000000000000000000000000000079 +:1076D00000000000000000000000000000000001A9 +:1076E0005555FFF5AAA000000000000000000000B2 +:1076F0000000000000000000000000000000000D7D +:107700000D0DC200FA0000000000000000000000A3 :107710000000000000000000000000000000000069 :107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 :107740000000000000000000000000000000000039 :107750000000000000000000000000000000000029 -:107760000000000000000000000000000000000019 +:107760003C00FFC3002D82AF0000000000000000BD :107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 +:107780000F0C0A08CF0045000000000000000000B8 :1077900000000000000000000000000000000000E9 :1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 :1077D00000000000000000000000000000000000A9 -:1077E0000000000000000000000000000000000099 +:1077E00000003C00FFC3507DD2FF000000000000FD :1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 +:107800000000FF3CAA28CFCF454500000000000043 :107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 :107830000000000000000000000000000000000048 :107840000000000000000000000000000000000038 :107850000000000000000000000000000000000028 -:107860000000000000000000000000000000000018 +:107860000000000000000E08000000000000000002 :107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 +:1078800000000000000000080000000000000000F0 :1078900000000000000000000000000000000000E8 :1078A00000000000000000000000000000000000D8 :1078B00000000000000000000000000000000000C8 @@ -30644,94 +30644,94 @@ :107AB00000000000000000000000000000000000C6 :107AC00000000000000000000000000000000000B6 :107AD00000000000000000000000000000000000A6 -:107AE0000000000000000000000000000002000094 -:107AF0000000000000000000000000000000000086 -:107B00000000000000000000000000000002000073 -:107B10000000000000000000000000000000000065 +:107AE0002000840020002002880088050005200076 +:107AF0000000200000000000000000880088000056 +:107B0000000000000000000000000000000500115F +:107B10000000000000000000000000880082000358 :107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 +:107B300000000000000000000000000000000180C4 :107B40000000000000000000000000000000000035 :107B50000000000000000000000000000000000025 -:107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000000D5 +:107B600041000000000000000000000000000000D4 +:107B700000000000000000000000000000210010D4 +:107B800000004100000000000000000000000000B4 +:107B900000000000000200000000000000210021A1 +:107BA0000000000040000000000000000040000055 :107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000000000000000B5 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000000095 -:107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 -:107C10000000000000000000000000000000000064 -:107C20000000000000000000000000000000000054 -:107C30000000000000000000000000000000000044 +:107BC000200800000000000000000000000000008D +:107BD00000000000000000000000000000000002A3 +:107BE000000000000000000000000000000900008C +:107BF0000000000000000000000000000000008005 +:107C000000800000000004000000000000000000F0 +:107C100000000000000002000000000002000280DE +:107C20000080000000000200000000400041004110 +:107C30000000002102000009004100210041000075 :107C40000000000000000000000000000000000034 -:107C50000000000000000000000000000000000024 -:107C60000000000000000000000000000000000014 -:107C700000000000000000000000000000080000FC -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000080000DC -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000008BC +:107C5000000000000000000002000000020002001E +:107C60000200020000000000000000000000000010 +:107C70000000000000000000000000000000000004 +:107C800000040008000000000000000000000000E8 +:107C900000000000000000000000000000000000E4 +:107CA00000040004000000000000000000000000CC +:107CB00000000000000000000000000000000000C4 :107CC00000000000000000000000000000000000B4 :107CD0000000000000000000000000000000004064 :107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 -:107D20000000000000000000000000000000000053 +:107CF0000000000000000000000020009000400094 +:107D00000000900840A000000000000000000000FB +:107D10000000000000000000000000004000000023 +:107D2000000000004088000040000000000000004B :107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 +:107D40000000000004000000000500050000000025 :107D50000000000000000000000000000000000023 -:107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 +:107D60000000000000000000000000001000000003 +:107D700000000200020000000000090040000000B6 +:107D80000000008800888005000008000040000016 :107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 +:107DA00000000020000000110000000000000000A2 :107DB00000000000000000000000000000000000C3 :107DC00000000000000000000000000000000000B3 :107DD00000000000000000000000000000000000A3 -:107DE0000000000000000000000000000000000093 -:107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 +:107DE0000000000000000000000008008200820087 +:107DF00082000000000084000000820082008200F7 +:107E0000820084004000820008008200820082001C +:107E10008200820000000000A000080000000004B2 +:107E20000011000000000000000000000000000041 +:107E30000000000000110000000000110000000020 +:107E4000000000000005000000000000000000002D :107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 +:107E60000000000000040000000900000000000005 :107E70000000000000000000000000000000000002 :107E800000000000000000000000000000000000F2 :107E900000000000000000000000000000000000E2 :107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 +:107EB00000000000009000000000008800000000AA +:107EC000008400000000000000000000000000002E :107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000000000000000092 -:107EF0000000000000000000000000000000000082 -:107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 +:107EE0000000000000000000000000040000A000EE +:107EF0000000000000000000840082000000C000BC +:107F00000000000000000000000000000000A000D1 +:107F100000000000000000008200080000000000D7 :107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000000000000000000021 +:107F30000000000000000000000020000000000021 +:107F400000000000000000000041000000000005EB +:107F50000000000000000000000000000010000011 :107F60000000000000000000000000000000000011 :107F70000000000000000000000000000000000001 -:107F800000000000000000000000000000000000F1 +:107F800005044000009011000000000000001100F6 :107F900000000000000000000000000000000000E1 -:107FA00000000000000000000000000000000000D1 +:107FA00000000000082004020000000000000000A3 :107FB00000000000000000000000000000000000C1 :107FC00000000000000000000000000000000000B1 :107FD00000000000000000000000000000000000A1 :107FE0000000000000000000000000000000000091 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 +:107FF0000000000000001000C00008008200000027 +:10800000000000000000000208000800000000005E +:1080100090000000000008000800080008000000B0 +:108020008200000000000002A0000000000000002C :108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:108050000000000000000000000000000000000020 +:1080400000000002000000000041000000080040A5 +:1080500000040002004000000000000300100010B7 :108060000000000000000000000000000000000010 :108070000000000000000000000000000000000000 :1080800000000000000000000000000000000000F0 @@ -30742,76 +30742,76 @@ :1080D00000000000000000000000000000000000A0 :1080E0000000000000000000000000000000000090 :1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F +:108100000000000001040000C0000020C082000048 +:10811000C00000010000000000000000000000009E +:108120000000000001020001C0000020C082000029 +:10813000C00000010000000000010001000100C0BB +:108140000001000100C000890000000100080008D3 +:108150000101200100C0000000000000000000003C :10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000000000000EF -:1081900000000000000000000000000000000000DF -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F +:1081700000000000000000000000000000000005FA +:1081800000000000000920800541A100000080805F +:108190000000800000030000000000000000000557 +:1081A00000000000000520800520A1000000808064 +:1081B0000000800000030000000000410041004179 +:1081C00000890041004100901041000910410080E9 +:1081D00000800441804100C1000000000000000058 :1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F -:10820000000000000000000000000000000000006E -:10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E +:1081F000000000000000000000000000020000007D +:1082000000000000400000000300400005000010D6 +:108210000300000000000080800300000200000056 +:1082200000000000410000204000C00005000000E8 +:1082300003000000000000808040000041000300B7 +:10824000000000804100C000000008008300090019 +:1082500000118400C100C100008080000000000007 :10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE -:1082800000000000000000000000000000000000EE -:1082900000000000000000000000000000000000DE -:1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E +:1082700000000000000000000000000000000100FD +:10828000000000000000010000000000A0002040ED +:10829000000101002000000000C082000000010079 +:1082A0000000000000000000000101000200824008 +:1082B000000001004000000000C082000002010038 +:1082C0000100000000C00100C100000001004000EA +:1082D00088040004C1000900C100004082000000C1 :1082E000000000000000000000000000000000008E :1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:10831000000000000000000000000000000000005D -:10832000000000000000000000000000000000004D -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D +:1083000000000000000000000000000020010090BC +:10831000000001000000000000000000000000005C +:10832000000000000000000000000000200100909C +:10833000000001000000000000000000000000003C +:1083400000C00001C0C100000000000100C1C12147 +:108350000011000100C10000000000010000000049 :10836000000000000000000000000000000000000D :1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED -:1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D +:1083800000000000000000000000000000200010BD +:10839000000000004100000000000000004100005B +:1083A000000000000000000000000000004000107D +:1083B000000000004100000000000000004100003B +:1083C00000000080004180C10000000000410085E5 +:1083D000C01000C1004100C1000000000041004188 :1083E000000000000000000000000000000000008D :1083F000000000000000000000000000000000007D -:10840000000000000000000000000000000000006C -:10841000000000000000000000000000000000005C -:10842000000000000000000000000000000000004C -:10843000000000000000000000000000000000003C -:10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C -:10846000000000000000000000000000000000000C +:108400000000000000020083000000108000050052 +:10841000000000C10000004000000041000000001A +:10842000208200000002008300000010800009008C +:10843000000000C1000000400000004100100000EA +:1084400003C00000C100800080C10000410480041E +:1084500083004100C10000008004000041040000CE +:10846000800041000000000000000000000000004B :1084700000000000000000000000000000000000FC -:1084800000000000000000000000000000000000EC -:1084900000000000000000000000000000000000DC -:1084A00000000000000000000000000000000000CC -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000000AC -:1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C +:1084800000000000000082010083000000012000C5 +:108490008200000000034000000000000001000016 +:1084A00000000005000082010083000000012000A0 +:1084B00082000000000340000000000000010001F5 +:1084C000000001040000C1004000C0C10000010123 +:1084D000200109000100C1020200C00100000101E9 +:1084E0000000C000010000000000000000000000CB :1084F000000000000000000000000000000000007C :10850000000000000000000000000000000000006B -:10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B +:10851000000000000000811200E007004842000057 +:1085200000000000484200000000000000000000C1 +:10853000000000000000811200E007004842000037 +:10854000000000004842000000000000000000425F +:10855000000000000000000A411200410700000076 :10856000000000000000000000000000000000000B :1085700000000000000000000000000000000000FB :1085800000000000000000000000000000000000EB @@ -30830,123 +30830,123 @@ :10865000000000000000000000000000000000001A :10866000000000000000000000000000000000000A :1086700000000000000000000000000000000000FA -:1086800000000000000000000000000000000000EA +:10868000000000000000000000000000257B00004A :1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000000000CA +:1086A00000000000000000000000DEA4257B0000A8 :1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA +:1086C00000000000000000000000DEA40000757B38 :1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A +:1086E000000000000000000000000000DEAE0000FE :1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000000069 -:108710000000000000000000000000000000000059 -:108720000000000000000000000000000000000049 -:108730000000000000000000000000000000000039 -:108740000000000000000000000000000000000029 -:108750000000000000000000000000000000000019 -:108760000000000000000000000000000000000009 +:1087000000000000000000000000000000006126E2 +:1087100003400000000000000230A0000000000044 +:1087200000000C4000000000000002C064866126CA +:1087300003400000000000000230A0000000000024 +:1087400000000C4000000000000002C06486000031 +:1087500060C603000000000000000031E0000000DF +:10876000000000000C0000000000000000C06306D4 :1087700000000000000000000000000000000000F9 :1087800000000000000000000000000000000000E9 -:1087900000000000000000000000000000000000D9 -:1087A00000000000000000000000000000000000C9 +:1087900000000000000000000000000020000000B9 +:1087A0000000000000000000000021000000008028 :1087B00000000000000000000000000000000000B9 :1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 +:1087D0000001000000000000000000000000000098 :1087E0000000000000000000000000000000000089 :1087F0000000000000000000000000000000000079 :108800000000000000000000000000000000000068 :108810000000000000000000000000000000000058 -:108820000000000000000000000000000000000048 -:108830000000000000000000000000000000000038 +:108820000000000000000000000000902000000098 +:10883000000440004000000000C0000000000000F4 :108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 +:1088500000020000000000000000000040000000D6 :108860000000000000000000000000000000000008 :1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000000000E8 +:1088800000000000000000000000000200000000E6 :1088900000000000000000000000000000000000D8 -:1088A00000000000000000000000000000000000C8 +:1088A0000000000000000000001002100000200086 :1088B00000000000000000000000000000000000B8 -:1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000000000000000000098 -:1088E0000000000000000000000000000000000088 +:1088C0000000000002000200004002000000000062 +:1088D0000000020900000000000000090000000084 +:1088E000020900000000020000000000000000007B :1088F0000000000000000000000000000000000078 -:108900000000000000000000000000000000000067 -:108910000000000000000000000000000000000057 +:108900000000000000000200824090000800020009 +:1089100002008200020000080000000000000000C9 :108920000000000000000000000000000000000047 -:108930000000000000000000000000000000000037 +:108930008000000000820010000000000000000025 :108940000000000000000000000000000000000027 :108950000000000000000000000000000000000017 :108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000000F7 -:1089800000000000000000000000000000000000E7 -:1089900000000000000000000000000000000000D7 -:1089A00000000000000000000000000000000000C7 -:1089B00000000000000000000000000000000000B7 +:1089700000400000000000000000000000000000B7 +:108980000000000000000010004000C000000000D7 +:108990000000000000400000000000000000000097 +:1089A0000000000000000000840000000800040037 +:1089B000880000004000000084000000000000006B :1089C00000000000000000000000000000000000A7 :1089D0000000000000000000000000000000000097 :1089E0000000000000000000000000000000000087 :1089F0000000000000000000000000000000000077 :108A00000000000000000000000000000000000066 -:108A10000000000000000000000000000000000056 -:108A20000000000000000000000000000000000046 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 -:108A700000000000000000000000000000000000F6 +:108A10000000000000000000000000000800050049 +:108A200021004000080021000000080000000000B4 +:108A30000000080009200000000000000000000005 +:108A40002100000000000300000000000000000002 +:108A500000000000000000000020000000000000F6 +:108A60000000110000000000000000000008008865 +:108A700000880000008800000000000000000000E6 :108A800000000000000000000000000000000000E6 :108A900000000000000000000000000000000000D6 -:108AA00000000000000000000000000000000000C6 -:108AB00000000000000000000000000000000000B6 -:108AC00000000000000000000000000000000000A6 +:108AA0000000000008000000A0000000000000001E +:108AB0000000C000820000008200000400000000EE +:108AC0000000820000000000020000000000000022 :108AD0000000000000000000000000000000000096 :108AE0000000000000000000000000000000000086 :108AF0000000000000000000000000000000000076 :108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B20000000000000000000000000000000000045 -:108B30000000000000000000000000000000000035 -:108B40000000000000000000000000000000000025 -:108B50000000000000000000000000000000000015 +:108B10000000000000000000000000400004000011 +:108B20000000001000000000000000000000000035 +:108B30002000000000000000000000000001000014 +:108B40000000000000000000000010000000000015 +:108B5000000000000000000800000000000000000D :108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 +:108B700000000000000000000000000000080000ED :108B800000000000000000000000000000000000E5 :108B900000000000000000000000000000000000D5 -:108BA00000000000000000000000000000000000C5 -:108BB00000000000000000000000000000000000B5 +:108BA0000000000000000000A00000000000000025 +:108BB0008400000000000000000000000000000031 :108BC00000000000000000000000000000000000A5 :108BD0000000000000000000000000000000000095 :108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000000000000000075 +:108BF00000000000000000800000000000000000F5 :108C00000000000000000000000000000000000064 :108C10000000000000000000000000000000000054 -:108C20000000000000000000000000000000000044 -:108C30000000000000000000000000000000000034 -:108C40000000000000000000000000000000000024 -:108C50000000000000000000000000000000000014 -:108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 +:108C20000000000000000000000008000000080034 +:108C3000000005000800040041900000000000044E +:108C40000002000000000000000003000000080017 +:108C50000000000000000000030000000800000009 +:108C60000000000000000000000000000002000002 +:108C700021000008000000080010000000000000B3 :108C800000000000000000000000000000000000E4 :108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 -:108CC00000000000000000000000000000000000A4 +:108CA00000000000080000000800000000000000B4 +:108CB0000000000000000000000000000000008034 +:108CC000000008000000000000000000000000009C :108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 +:108CE0000000000000000000000020000000000064 :108CF0000000000000000000000000000000000074 :108D00000000000000000000000000000000000063 :108D10000000000000000000000000000000000053 :108D20000000000000000000000000000000000043 :108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 +:108D4000000400000000000000000000000000001F +:108D500000000000004000002004000000000000AF +:108D600002000300000000001000000000000000EE :108D700000000000000000000000000000000000F3 :108D800000000000000000000000000000000000E3 :108D900000000000000000000000000000000000D3 :108DA00000000000000000000000000000000000C3 :108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000000000000A3 +:108DC0000000000190010000000000000000000011 :108DD0000000000000000000000000000000000093 :108DE0000000000000000000000000000000000083 :108DF0000000000000000000000000000000000073 @@ -30954,7 +30954,7 @@ :108E10000000000000000000000000000000000052 :108E20000000000000000000000000000000000042 :108E30000000000000000000000000000000000032 -:108E40000000000000000000000000000000000022 +:108E400000000000001008100020000000000000DA :108E50000000000000000000000000000000000012 :108E60000000000000000000000000000000000002 :108E700000000000000000000000000000000000F2 @@ -30962,7 +30962,7 @@ :108E900000000000000000000000000000000000D2 :108EA00000000000000000000000000000000000C2 :108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 +:108EC0000000000008000800200008080000000062 :108ED0000000000000000000000000000000000092 :108EE0000000000000000000000000000000000082 :108EF0000000000000000000000000000000000072 @@ -30970,7 +30970,7 @@ :108F10000000000000000000000000000000000051 :108F20000000000000000000000000000000000041 :108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 +:108F40000000000000000010000000000000000011 :108F50000000000000000000000000000000000011 :108F60000000000000000000000000000000000001 :108F700000000000000000000000000000000000F1 @@ -30978,7 +30978,7 @@ :108F900000000000000000000000000000000000D1 :108FA00000000000000000000000000000000000C1 :108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 +:108FC000000000000000000000000000A000000100 :108FD0000000000000000000000000000000000091 :108FE0000000000000000000000000000000000081 :108FF0000000000000000000000000000000000071 @@ -30986,24 +30986,24 @@ :109010000000000000000000000000000000000050 :109020000000000000000000000000000000000040 :109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 +:10904000000000000000000000000020004180033C +:10905000000300000000000000000000000000000D :109060000000000000000000000000000000000000 :1090700000000000000000000000000000000000F0 :1090800000000000000000000000000000000000E0 :1090900000000000000000000000000000000000D0 :1090A00000000000000000000000000000000000C0 :1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 +:1090C0000000000000000000000000000821211145 +:1090D000030000100000000000000000000000007D :1090E0000000000000000000000000000000000080 :1090F0000000000000000000000000000000000070 :10910000000000000000000000000000000000005F :10911000000000000000000000000000000000004F :10912000000000000000000000000000000000003F :10913000000000000000000000000000000000002F -:10914000000000000000000000000000000000001F -:10915000000000000000000000000000000000000F +:1091400000000000000000000000000000000121FD +:10915000000100000000000000000000000000000E :1091600000000000000000000000000000000000FF :1091700000000000000000000000000000000000EF :1091800000000000000000000000000000000000DF @@ -31011,7 +31011,7 @@ :1091A00000000000000000000000000000000000BF :1091B00000000000000000000000000000000000AF :1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000000000008F +:1091D000000000E0000000000000000000000000AF :1091E000000000000000000000000000000000007F :1091F000000000000000000000000000000000006F :10920000000000000000000000000000000000005E @@ -31051,7 +31051,7 @@ :10942000000000000000000000000000000000003C :10943000000000000000000000000000000000002C :10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C +:10945000000000000000000000000061000500099D :1094600000000000000000000000000000000000FC :1094700000000000000000000000000000000000EC :1094800000000000000000000000000000000000DC @@ -31059,16 +31059,16 @@ :1094A00000000000000000000000000000000000BC :1094B00000000000000000000000000000000000AC :1094C000000000000000000000000000000000009C -:1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C +:1094D000000000000000000000000000505F505F2E +:1094E0000F410FEB00000000000000000000000032 :1094F000000000000000000000000000000000006C :10950000000000000000000000000000000000005B :10951000000000000000000000000000000000004B :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB +:109550000000000000000000000000000000000FFC +:10956000F0FF0F410FEB00000000000000000000C2 :1095700000000000000000000000000000000000EB :1095800000000000000000000000000000000000DB :1095900000000000000000000000000000000000CB @@ -31076,7 +31076,7 @@ :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B +:1095E000303F303F2C3C0000000000000000000035 :1095F000000000000000000000000000000000006B :10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A @@ -31084,104 +31084,104 @@ :10963000000000000000000000000000000000002A :10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA +:109660000000303F303F2C3CFFFF000000000000B6 :1096700000000000000000000000000000000000EA :1096800000000000000000000000000000000000DA :1096900000000000000000000000000000000000CA :1096A00000000000000000000000000000000000BA :1096B00000000000000000000000000000000000AA :1096C000000000000000000000000000000000009A -:1096D000000000000000000000000000000000008A -:1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 +:1096D000000000002000000000000000000000006A +:1096E0000000000000020041000000000000000037 +:1096F0000000000000000000000000000000010069 +:1097000000030000008000800000008000010000D5 :109710000000000000000000000000000000000049 :109720000000000000000000000000000000000039 :109730000000000000000000000000000000000029 :109740000000000000000000000000000000000019 :109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000000000000B9 +:1097600000000000000000010000000000000000F8 +:109770000000000000840000000000000000000065 +:1097800004820082009000200020210000200000C0 +:1097900000020002000200000000000000000000C3 +:1097A00000000002000000000002000000000000B5 :1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 -:109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 +:1097D0000000000000000000000002000000000087 +:1097E0000200000000000200000010002000000045 +:1097F0000000000000000000000000000000004029 +:1098000090000400000008000820082000400880A4 +:1098100000000000001000100010084100000000CF +:109820000241020000000000000082000000000071 +:109830000000000000000000000000000200020024 +:10984000020000000000000002000200020082008E +:109850000200000000000000000000000000000006 +:109860000000000000400040000000000082800076 +:10987000000800000000000041000000000000009F +:109880000000000080000000000000010041000016 +:1098900000200000000000000800000000000000A0 :1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000000000098 -:1098D0000000000000000000000000000000000088 -:1098E0000000000000000000000000000000000078 -:1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 +:1098B00000000000000002000000000002000000A4 +:1098C0000000000000000000000000400000000058 +:1098D0000000004000000000000000000000000048 +:1098E00000000000000008000800000089000000DF +:1098F00000000080000000000000000000000000E8 +:109900000000000000008800000088020000000045 +:109910000000880000009000000000000000000926 +:109920000000000000000000002000000000000017 :109930000000000000000000000000000000000027 :109940000000000000000000000000000000000017 -:109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 -:1099700000000000000000000000000000000000E7 +:1099500000000000000000000000000000000800FF +:109960000000000000000300090040000300200088 +:1099700000000000000211000000000000A0000034 :1099800000000000000000000000000000000000D7 :1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 +:1099A0000000000000000000008200000000000035 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 -:1099D0000000000000000000000000000000000087 -:1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 -:109A00000000000000000000000000000000000056 +:1099D0000000000000000000080000000000080077 +:1099E000000000000000000000000800000000006F +:1099F00000000002000200040000820000000000DD +:109A000088000000000000000000000000040010BA :109A10000000000000000000000000000000000046 :109A20000000000000000000000000000000000036 :109A30000000000000000000000000000000000026 :109A40000000000000000000000000000000000016 -:109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 +:109A500000000004000000400000000000001000B2 +:109A600000000800000000000000000008000000E6 +:109A700000000000000000010001000000000000E4 +:109A80000000000000000000000000000000009046 +:109A90000001000000000000004000000000000085 :109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 :109AC0000000000000000000000000000000000096 :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000000066 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 +:109AF00000000800000000800000000000000000DE +:109B00000020840008000000000000000000880021 +:109B10002000000000000000000000000000000025 +:109B20000020000000000000000000000000000015 +:109B3000000000000000000000000000000800001D :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 -:109B700000000000000000000000000000000000E5 +:109B7000000000000000400021400000050000003F :109B800000000000000000000000000000000000D5 :109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000000000000000A5 +:109BA00000000000000000100000000000000000A5 +:109BB0000000000000C000080000000200000000DB :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 -:109BF0000000000000000000000000000000000065 -:109C00000000000000000000000000000000000054 +:109BF00000000800080000000000018000000000D4 +:109C0000000000000000002100000000C000000073 :109C10000000000000000000000000000000000044 -:109C20000000000000000000000000000000000034 +:109C2000000000000021000000090000000000000A :109C30000000000000000000000000000000000024 :109C40000000000000000000000000000000000014 :109C50000000000000000000000000000000000004 :109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000000E4 +:109C70000000000008000000050000004004000093 :109C800000000000000000000000000000000000D4 :109C900000000000000000000000000000000000C4 :109CA00000000000000000000000000000000000B4 @@ -31189,91 +31189,91 @@ :109CC0000000000000000000000000000000000094 :109CD0000000000000000000000000000000000084 :109CE0000000000000000000000000000000000074 -:109CF0000000000000000000000000000000000064 -:109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 +:109CF0000000000000000000000000000001000162 +:109D0000C001000000000000000000000000000092 +:109D100000000000C1009040008290000320000875 +:109D2000000890100000000000000000000000008B :109D30000000000000000000000000000000000023 :109D40000000000000000000000000000000000013 :109D50000000000000000000000000000000000003 :109D600000000000000000000000000000000000F3 -:109D700000000000000000000000000000000000E3 -:109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000000B3 +:109D700000000000000000000000000000000810CB +:109D80002002201000080000000000000000000079 +:109D90000000000000009000800000000000A00013 +:109DA00000000000808000000000000000000000B3 :109DB00000000000000000000000000000000000A3 :109DC0000000000000000000000000000000000093 :109DD0000000000000000000000000000000000083 :109DE0000000000000000000000000000000000073 :109DF0000000000000000000000000000000000063 -:109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 +:109E00002000210008008000000000000000000089 +:109E10000000000000000000800000A10080008021 +:109E20008000002100808080000000000000000011 :109E30000000000000000000000000000000000022 :109E40000000000000000000000000000000000012 :109E50000000000000000000000000000000000002 :109E600000000000000000000000000000000000F2 :109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 +:109E80000000002088001100080000000000000011 +:109E90000000000000000000000088009082100414 +:109EA000840288000200888408100000000000007E :109EB00000000000000000000000000000000000A2 :109EC0000000000000000000000000000000000092 :109ED0000000000000000000000000000000000082 :109EE0000000000000000000000000000000000072 :109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 -:109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 +:109F0000000000000000000100010100000000004E +:109F100000000000000000000000000008A0001089 +:109F20000010000840020088001088900000000027 :109F30000000000000000000000000000000000021 :109F40000000000000000000000000000000000011 :109F50000000000000000000000000000000000001 :109F600000000000000000000000000000000000F1 :109F700000000000000000000000000000000000E1 -:109F800000000000000000000000000000000000D1 +:109F80000000000000000020031005101111000067 :109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 +:109FA0000000000010000080000000000000000021 :109FB00000000000000000000000000000000000A1 :109FC0000000000000000000000000000000000091 :109FD0000000000000000000000000000000000081 :109FE0000000000000000000000000000000000071 :109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 +:10A0000000000000000000002000088000000800A0 :10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 +:10A02000000480A000000000000000090080000083 :10A030000000000000000000000000000000000020 :10A040000000000000000000000000000000000010 :10A050000000000000000000000000000000000000 :10A0600000000000000000000000000000000000F0 :10A0700000000000000000000000000000000000E0 -:10A0800000000000000000000000000000000000D0 -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 +:10A08000000000000000000000000020008200200E +:10A0900001000000000000000000000000000000BF +:10A0A00000008800822020109000A000080888107E +:10A0B0008800000000000000000000000000000018 :10A0C0000000000000000000000000000000000090 :10A0D0000000000000000000000000000000000080 :10A0E0000000000000000000000000000000000070 :10A0F0000000000000000000000000000000000060 -:10A10000000000000000000000000000000000004F +:10A10000000000000000000000000000000000E06F :10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F +:10A1200000000000000000000700820000000000A6 +:10A130000700000000000000000000000000000018 :10A14000000000000000000000000000000000000F :10A1500000000000000000000000000000000000FF :10A1600000000000000000000000000000000000EF :10A1700000000000000000000000000000000000DF :10A1800000000000000000000000000000000000CF :10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F +:10A1A0000000000000007E7F7E7EC303C393FFFF9C +:10A1B000FFFF99FF91F70000000000000000000081 :10A1C000000000000000000000000000000000008F :10A1D000000000000000000000000000000000007F :10A1E000000000000000000000000000000000006F :10A1F000000000000000000000000000000000005F :10A20000000000000000000000000000000000004E :10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E +:10A22000000000000000000018191818C3F3C393C1 +:10A23000FFE6E6E698FE90F6000000000000000051 :10A24000000000000000000000000000000000000E :10A2500000000000000000000000000000000000FE :10A2600000000000000000000000000000000000EE @@ -31287,48 +31287,48 @@ :10A2E000000000000000000000000000000000006E :10A2F000000000000000000000000000000000005E :10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D -:10A33000000000000000000000000000000000001D +:10A310000000000000000000F0F0F0F0000000007D +:10A32000000000000000000000000000F0FFF0FF4F +:10A33000C0C0CFCF3FBFFFFFFFFFFFFF0000000007 :10A34000000000000000000000000000000000000D :10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED :10A3700000000000000000000000000000000000DD :10A3800000000000000000000000000000000000CD -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D +:10A3900000000000000000000000FF00999900008C +:10A3A0000000000000000000000000000000F000BD +:10A3B000F000C6C0C6CF3CBDFFFF7E6E6E6E0000D3 :10A3C000000000000000000000000000000000008D :10A3D000000000000000000000000000000000007D :10A3E000000000000000000000000000000000006D :10A3F000000000000000000000000000000000005D :10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C +:10A4100000000000000000000061000100010001D8 :10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C +:10A4300000000E08001000000000000800100000DE :10A44000000000000000000000000000000000000C :10A4500000000000000000000000000000000000FC :10A4600000000000000000000000000000000000EC :10A4700000000000000000000000000000000000DC :10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC +:10A49000000000000000000000003C3C287DAAAA4B +:10A4A000AAAA000000000000000000000000000058 :10A4B000000000000000000000000000000000009C :10A4C000000000000000000000000000000000008C :10A4D000000000000000000000000000000000007C :10A4E000000000000000000000000000000000006C :10A4F000000000000000000000000000000000005C :10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B +:10A510000000000000000000000000003C3C287D1E +:10A5200082B2BEB200000000000000000000000087 :10A53000000000000000000000000000000000001B :10A54000000000000000000000000000000000000B :10A5500000000000000000000000000000000000FB :10A5600000000000000000000000000000000000EB :10A5700000000000000000000000000000000000DB :10A5800000000000000000000000000000000000CB -:10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB +:10A590000000000000000000000000000000BF15E7 +:10A5A000BA10F0F0F0F00000000000000000000021 :10A5B000000000000000000000000000000000009B :10A5C000000000000000000000000000000000008B :10A5D000000000000000000000000000000000007B @@ -31336,242 +31336,242 @@ :10A5F000000000000000000000000000000000005B :10A60000000000000000000000000000000000004A :10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A +:10A62000BA10BA10C0FCC0FC00000000000000001E :10A63000000000000000000000000000000000001A :10A64000000000000000000000000000000000000A :10A6500000000000000000000000000000000000FA :10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA :10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA +:10A69000A000000000000000000000000100000019 +:10A6A00010800000000040002000000000000000BA :10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A +:10A6C0000000000000000000000000010000000089 :10A6D000000000000000000000000000000000007A :10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A :10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 +:10A7100000000000000200000000000021C0200036 +:10A720000000000400000000200000000002000003 +:10A730000000000000000000000000001000000009 +:10A7400000000000100200000000000000000002F5 +:10A7500000020002000200000000000200000040B1 +:10A7600000000000000000000000000000400000A9 :10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 +:10A7800000000000000200020000009000000080B5 +:10A790000010088008000000000000000000000019 +:10A7A00020000400208400000000000000000002DF +:10A7B00000000800000000000000900008000200F7 +:10A7C0000200080002000000080000000000000075 :10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 +:10A7E0000000000000000000020000000000000067 +:10A7F000020008000000000000000000000002004D +:10A800000200020000000000000000008200820040 +:10A810000010000100100084000000020000000091 +:10A820000000800280008011000000000000000095 +:10A83000020002000000000000000000090000000B +:10A840000000000000000088000000000000000080 :10A8500000000000000000000000000000000000F8 :10A8600000000000000000000000000000000000E8 :10A8700000000000000000000000000000000000D8 :10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 +:10A8900000000000000000000000100000000000A8 +:10A8A0000100000000000000000884008400820015 +:10A8B0008200000000000000000000000000000016 :10A8C0000000000000000000000000000000000088 :10A8D0000000000000000000000000000000000078 :10A8E0000000000000000000000000000000000068 :10A8F0000000000000000000000000000000000058 :10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 +:10A9100000000000000000000000000080000000B7 +:10A9200000002000050021002100090000000000B7 +:10A930000000030000000004000000000000000010 +:10A940000300210041000000000000000000002082 +:10A950000020002000000000000000900000000027 :10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 +:10A9700000000000000000000010000000000000C7 :10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 +:10A9900000000000000000008200010082000000B2 +:10A9A000000009000800000000000040000000094D +:10A9B0000000821100000000000000000000000004 +:10A9C0000000000000000000000000000040000047 +:10A9D0000000000000000000000000400000000037 +:10A9E00000000040000000000040000000000000E7 :10A9F0000000000000000000000000000000000057 :10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 +:10AA100000000000004000400000000002000000B4 +:10AA20000000000020000000110000000000008471 +:10AA30000000000003000000000000000000000013 :10AA40000000000000000000000000000000000006 :10AA500000000000000000000000000000000000F6 :10AA600000000000000000000000000000000000E6 :10AA700000000000000000000000000000000000D6 :10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 +:10AA9000000000000000000000001000080000009E +:10AAA00000000000820000000800010020110000EA :10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 +:10AAC0000000000020000000000000000000000066 :10AAD0000000000000000000000000000000000076 :10AAE0000000000000000000000000000000000066 :10AAF0000000000000000000000000000000000056 :10AB00000000000000000000000000000000000045 :10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 +:10AB2000000000000000000000000000080080009D +:10AB300000000000040421040004050000000000DF +:10AB40000000000000000000000000000400009071 +:10AB500010000800000400000820080400000000A5 +:10AB600000000000000000000020000000000000C5 :10AB700000000000000000000000000000000000D5 :10AB800000000000000000000000000000000000C5 :10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 +:10ABA000000000000000000082000800C00001005A +:10ABB0008500000901000000000200000004000000 +:10ABC000000000000800000000000000000000007D :10ABD0000000000000000000000000000000000075 :10ABE0000000000000000000000000000000000065 :10ABF0000000000000000000000000000000000055 :10AC00000000000000000000000000000000000044 :10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC30000000000000000000000000000000000014 +:10AC2000080000000000000000000000058208008D +:10AC30000402040000000400000000000500000001 :10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 +:10AC500000000000000000000000000000000200F2 :10AC600000000000000000000000000000000000E4 :10AC700000000000000000000000000000000000D4 :10AC800000000000000000000000000000000000C4 :10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 +:10ACA000000040A000200000202001000000000063 +:10ACB00000000221000500880001000000000000E3 :10ACC0000000000000000000000000000000000084 :10ACD0000000000000000000000000000000000074 :10ACE0000000000000000000000000000000000064 :10ACF0000000000000000000000000000000000054 :10AD00000000000000000000000000000000000043 :10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000000000000000000013 +:10AD200000000000808000000000000011002100F1 +:10AD300000000000A01009900503001000000000B2 :10AD40000000000000000000000000000000000003 :10AD500000000000000000000000000000000000F3 :10AD600000000000000000000000000000000000E3 :10AD700000000000000000000000000000000000D3 :10AD800000000000000000000000000000000000C3 :10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 +:10ADA0000000000000000000001000090000004149 +:10ADB0000900000900801000C02121009009000056 :10ADC0000000000000000000000000000000000083 :10ADD0000000000000000000000000000000000073 :10ADE0000000000000000000000000000000000063 :10ADF0000000000000000000000000000000000053 :10AE00000000000000000000000000000000000042 :10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000000012 +:10AE20000000000000000000000000000089000099 +:10AE300000010100000000882082040021000500BC :10AE40000000000000000000000000000000000002 :10AE500000000000000000000000000000000000F2 :10AE600000000000000000000000000000000000E2 :10AE700000000000000000000000000000000000D2 :10AE800000000000000000000000000000000000C2 :10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000000000000A2 -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 +:10AEA00000000000000000000000409000000808C2 +:10AEB0000402000088000000010000210189040153 +:10AEC00002900000000000000000000000000000F0 :10AED0000000000000000000000000000000000072 :10AEE0000000000000000000000000000000000062 :10AEF0000000000000000000000000000000000052 :10AF00000000000000000000000000000000000041 :10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 +:10AF200000000000000000000000000080000000A1 +:10AF3000000080800000000000004100000221119C +:10AF4000902180C000000000000000000000000010 :10AF500000000000000000000000000000000000F1 :10AF600000000000000000000000000000000000E1 :10AF700000000000000000000000000000000000D1 :10AF800000000000000000000000000000000000C1 :10AF900000000000000000000000000000000000B1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 +:10AFA0000000000000000000000000000000800021 +:10AFB000000000000000000000110200000021A0BD +:10AFC0008941208080100000000000000000000087 :10AFD0000000000000000000000000000000000071 :10AFE0000000000000000000000000000000000061 :10AFF0000000000000000000000000000000000051 :10B000000000000000000000000000000000000040 :10B010000000000000000000000000000000000030 :10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 +:10B03000C000200088001000000000010100000096 +:10B0400089C0040800400801000000000000000062 :10B0500000000000000000000000000000000000F0 :10B0600000000000000000000000000000000000E0 :10B0700000000000000000000000000000000000D0 :10B0800000000000000000000000000000000000C0 :10B0900000000000000000000000000000000000B0 :10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 +:10B0B00000000000000000000000000000E00000B0 +:10B0C0008141000000E00700600000000000000077 :10B0D0000000000000000000000000000000000070 :10B0E0000000000000000000000000000000000060 :10B0F0000000000000000000000000000000000050 :10B10000000000000000000000000000000000003F :10B11000000000000000000000000000000000002F :10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF +:10B130000000000082825F0AC3C3C3C30000000096 +:10B1400000000000FF3C003C0404EFEF00000000A2 :10B1500000000000000000000000000000000000EF :10B1600000000000000000000000000000000000DF :10B1700000000000000000000000000000000000CF :10B1800000000000000000000000000000000000BF :10B1900000000000000000000000000000000000AF :10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F +:10B1B000000000000000D7D75F0AFFAA00AA000025 +:10B1C0000000000000003C3C3C3C0404EFEF0000A9 :10B1D000000000000000000000000000000000006F :10B1E000000000000000000000000000000000005F :10B1F000000000000000000000000000000000004F :10B20000000000000000000000000000000000003E :10B21000000000000000000000000000000000002E :10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000000000FE +:10B2300000000000000000003C00FFC30000000010 +:10B240000000000000000000550F5555FFCF3000F2 :10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE :10B2700000000000000000000000000000000000CE :10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE :10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E +:10B2B000000000000000000000007D417D41000012 +:10B2C00000000000000000000000550F5555DFDFB2 +:10B2D000101000000000000000000000000000004E :10B2E000000000000000000000000000000000005E :10B2F000000000000000000000000000000000004E :10B30000000000000000000000000000000000003D :10B31000000000000000000000000000000000002D :10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED +:10B33000000000000000000000000000A00000006D +:10B340000000000000400006000C00000061000D3D +:10B3500000090000000000000000000000000000E4 :10B3600000000000000000000000000000000000DD :10B3700000000000000000000000000000000000CD :10B3800000000000000000000000000000000000BD :10B3900000000000000000000000000000000000AD :10B3A000000000000000000000000000000000009D :10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000000000006D +:10B3C00000000000000000000F0FFFFF0000FFFA68 +:10B3D0005550F330F3300000000000000000000082 :10B3E000000000000000000000000000000000005D :10B3F000000000000000000000000000000000004D :10B40000000000000000000000000000000000003C :10B41000000000000000000000000000000000002C :10B42000000000000000000000000000000000001C :10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC +:10B44000000000000000000000000F0F00000000DE +:10B45000AAFA0050FF3CC3000000000000000000FA :10B4600000000000000000000000000000000000DC :10B4700000000000000000000000000000000000CC :10B4800000000000000000000000000000000000BC :10B4900000000000000000000000000000000000AC :10B4A000000000000000000000000000000000009C :10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C +:10B4C0000000000000000000000000000000F0F09C +:10B4D0000000F505F505FF00FF000000000000007A :10B4E000000000000000000000000000000000005C :10B4F000000000000000000000000000000000004C :10B50000000000000000000000000000000000003B @@ -31579,97 +31579,97 @@ :10B52000000000000000000000000000000000001B :10B53000000000000000000000000000000000000B :10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB +:10B55000F0F00000F5C5F5052C2C3C3C0000000087 :10B5600000000000000000000000000000000000DB :10B5700000000000000000000000000000000000CB :10B5800000000000000000000000000000000000BB :10B5900000000000000000000000000000000000AB :10B5A000000000000000000000000000000000009B :10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B +:10B5C00000000000000010000000000000000080EB :10B5D000000000000000000000000000000000006B :10B5E000000000000000000000000000000000005B :10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A +:10B600000000000000000001000000000000000039 :10B61000000000000000000000000000000000002A :10B62000000000000000000000000000000000001A :10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000040000000000000000E6 +:10B64000000000000000000080000000000000007A +:10B6500000020000000000000000000000000000E8 :10B6600000000000000000000000000000000000DA -:10B6700000000000000000040000000000000000C6 -:10B6800000000000000000000000000000000000BA +:10B6700000000000000000000000000000020000C8 +:10B6800000000002000000000000000000000000B8 :10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A +:10B6A000000000000040000000000000000000005A :10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 +:10B6C0000000000000000002000000000400040070 +:10B6D000000000001000880040000100040000008D +:10B6E000040200000000000008000000000002004A +:10B6F0000000000000000000000000000800021030 +:10B70000080008000000020008000000000000001F :10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 +:10B720000400000000000000000000000000000015 +:10B730000000000000000000000000000000040005 +:10B740000200000002000200820000000000000869 +:10B75000000000000408000800A08088100080009D +:10B760000000800000000000000000000000000455 +:10B770000000000000100010001000000000000099 :10B7800000000000000000000000000000000000B9 :10B7900000000000000000000000000000000000A9 :10B7A0000000000000000000000000000000000099 :10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000000000000000000000059 +:10B7C0000000000000000000000000000000001168 +:10B7D0000000010000000000000000000000010067 +:10B7E00001008500000088000000900002000000B9 :10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 +:10B8000040000000000040004000900000000000E8 :10B810000000000000000000000000000000000028 :10B820000000000000000000000000000000000018 :10B830000000000000000000000000000000000008 :10B8400000000000000000000000000000000000F8 -:10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000000000000000000D8 +:10B8500000000000200000000804110009002188F9 +:10B8600008000400200010200000000000880000F4 :10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 +:10B880000020000000000000000000000000000098 :10B8900000000000000000000000000000000000A8 :10B8A0000000000000000000000000000000000098 :10B8B0000000000000000000000000000000000088 :10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000000000000000000058 +:10B8D00000000000000000000080000000000000E8 +:10B8E0000000000000000000010000000000000057 :10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 +:10B9000000000000000000000004000000400009EA +:10B9100000000000000000400000000000000000E7 :10B920000000000000000000000000000000000017 :10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 +:10B9400000000000000000000000000000200000D7 +:10B950000040004000000000000000040000000063 +:10B960001108000008000900058820000000000000 +:10B9700000000000080000000002000000000000BD +:10B9800000000000000000000000040000000000B3 :10B9900000000000000000000000000000000000A7 :10B9A0000000000000000000000000000000000097 :10B9B0000000000000000000000000000000000087 :10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 +:10B9D00000000000000088008200000084000000D9 +:10B9E0000000080000000100090000000100000044 +:10B9F000000000090000000000000000000000003E :10BA00000000000000000000000000000000000036 :10BA10000000000000000000000000000000000026 :10BA20000000000000000000000000000000000016 :10BA30000000000000000000000000000000000006 :10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 +:10BA50000000000000000000000000000088030457 +:10BA600000000000008400000200208805200488F7 +:10BA700000000000000011000000000000000000B5 +:10BA800000000000000000000000090000000000AD +:10BA900000000000000000000000000000000500A1 :10BAA0000000000000000000000000000000000096 :10BAB0000000000000000000000000000000000086 :10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 +:10BAD00000000000000000000000000082000000E4 +:10BAE000080000000009000008000000000000023B +:10BAF000000000000009000000000000000000003D :10BB00000000000000000000000000000000000035 :10BB10000000000000000000000000000000000025 :10BB20000000000000000000000000000000000015 @@ -31677,80 +31677,80 @@ :10BB400000000000000000000000000000000000F5 :10BB500000000000000000000000000000000000E5 :10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 +:10BB70000000000040002000200000040000000041 :10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 +:10BB900000040000000000000000000000000000A1 +:10BBA0000000000000000000000000000000004055 :10BBB0000000000000000000000000000000000085 :10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000000000000000045 +:10BBD0000000000000000004000000000000010060 +:10BBE00000000000000001000001A001000001A011 +:10BBF0000020002000040000000000000000000001 :10BC00000000000000000000000000000000000034 :10BC10000000000000000000000000000000000024 :10BC20000000000000000000000000000000000014 :10BC30000000000000000000000000000000000004 :10BC400000000000000000000000000000000000F4 :10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 +:10BC60001100210000000000101020210010000829 +:10BC70001180210000000080000000000000000092 :10BC800000000000000000000000000000000000B4 :10BC900000000000000000000000000000000000A4 :10BCA0000000000000000000000000000000000094 :10BCB0000000000000000000000000000000000084 :10BCC0000000000000000000000000000000000074 :10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 +:10BCE00000000041090000030000030021000200E1 +:10BCF000109000408900804100000000000000001A :10BD00000000000000000000000000000000000033 :10BD10000000000000000000000000000000000023 :10BD20000000000000000000000000000000000013 :10BD30000000000000000000000000000000000003 :10BD400000000000000000000000000000000000F3 :10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 +:10BD60000000000000010100000000000090000041 +:10BD7000010001A120010300A08990000000000043 :10BD800000000000000000000000000000000000B3 :10BD900000000000000000000000000000000000A3 :10BDA0000000000000000000000000000000000093 :10BDB0000000000000000000000000000000000083 :10BDC0000000000000000000000000000000000073 :10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 +:10BDE000000000000000000008000000010000004A +:10BDF00000000100000120A00810002010880000B1 :10BE00000000000000000000000000000000000032 :10BE10000000000000000000000000000000000022 :10BE20000000000000000000000000000000000012 :10BE30000000000000000000000000000000000002 :10BE400000000000000000000000000000000000F2 :10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 +:10BE60000000000000000000000080000000200032 +:10BE70000020210321030010000080000000830047 :10BE800000000000000000000000000000000000B2 :10BE900000000000000000000000000000000000A2 :10BEA0000000000000000000000000000000000092 :10BEB0000000000000000000000000000000000082 :10BEC0000000000000000000000000000000000072 :10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 +:10BEE0000000000000000000000000000011000041 +:10BEF0000000088805404100080300000010000011 +:10BF000080000000000000000000000000000000B1 :10BF10000000000000000000000000000000000021 :10BF20000000000000000000000000000000000011 :10BF30000000000000000000000000000000000001 :10BF400000000000000000000000000000000000F1 :10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 +:10BF600000000000000000000000000000000001D0 +:10BF70000000000000C100000000010100002011CD +:10BF8000A0201000000000000000000000000000E1 :10BF900000000000000000000000000000000000A1 :10BFA0000000000000000000000000000000000091 :10BFB0000000000000000000000000000000000081 :10BFC0000000000000000000000000000000000071 :10BFD0000000000000000000000000000000000061 :10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 +:10BFF00000E0000081000000000000008800000058 +:10C0000000E00700008200000000000000000000C7 :10C010000000000000000000000000000000000020 :10C020000000000000000000000000000000000010 :10C030000000000000000000000000000000000000 @@ -31758,7 +31758,7 @@ :10C0500000000000000000000000000000000000E0 :10C0600000000000000000000000000000000000D0 :10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 +:10C0800066CF66CFFF3000300000000000000000E7 :10C0900000000000000000000000000000000000A0 :10C0A0000000000000000000000000000000000090 :10C0B0000000000000000000000000000000000080 @@ -31766,7 +31766,7 @@ :10C0D0000000000000000000000000000000000060 :10C0E0000000000000000000000000000000000050 :10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F +:10C10000000066CF66CFFF30003000000000000066 :10C11000000000000000000000000000000000001F :10C12000000000000000000000000000000000000F :10C1300000000000000000000000000000000000FF @@ -31782,7 +31782,7 @@ :10C1D000000000000000000000000000000000005F :10C1E000000000000000000000000000000000004F :10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E +:10C2000000000000000000FF00FF0DCF0CCF000079 :10C21000000000000000000000000000000000001E :10C22000000000000000000000000000000000000E :10C2300000000000000000000000000000000000FE @@ -31790,15 +31790,15 @@ :10C2500000000000000000000000000000000000DE :10C2600000000000000000000000000000000000CE :10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE +:10C280000000000000000000FFFF101009CB00C3F9 :10C29000000000000000000000000000000000009E :10C2A000000000000000000000000000000000008E :10C2B000000000000000000000000000000000007E :10C2C000000000000000000000000000000000006E :10C2D000000000000000000000000000000000005E :10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D +:10C2F0000000000000000000000000600006000CCC +:10C30000000000610006000D00000060000E001C2F :10C31000000000000000000000000000000000001D :10C32000000000000000000000000000000000000D :10C3300000000000000000000000000000000000FD @@ -31806,15 +31806,15 @@ :10C3500000000000000000000000000000000000DD :10C3600000000000000000000000000000000000CD :10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D +:10C38000FFFF0000540004000080FFFF00000000D9 +:10C39000FFFF00000000000000000000000000009F :10C3A000000000000000000000000000000000008D :10C3B000000000000000000000000000000000007D :10C3C000000000000000000000000000000000006D :10C3D000000000000000000000000000000000005D :10C3E000000000000000000000000000000000004D :10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C +:10C400000000000000005555555500A0FFFF00003A :10C41000000000000000000000000000000000001C :10C42000000000000000000000000000000000000C :10C4300000000000000000000000000000000000FC @@ -31822,16 +31822,16 @@ :10C4500000000000000000000000000000000000DC :10C4600000000000000000000000000000000000CC :10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C +:10C4800000000000F0F000003C2C3C04FBFBFFC36C +:10C4900000000000F0F000000000000000000000BC :10C4A000000000000000000000000000000000008C :10C4B000000000000000000000000000000000007C :10C4C000000000000000000000000000000000006C :10C4D000000000000000000000000000000000005C :10C4E000000000000000000000000000000000004C :10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B +:10C50000000000000000F0F0000010003800F0F023 +:10C51000F0C000000000F0F000000000000000008B :10C52000000000000000000000000000000000000B :10C5300000000000000000000000000000000000FB :10C5400000000000000000000000000000000000EB @@ -31842,224 +31842,224 @@ :10C59000000000000000000000000000000000009B :10C5A000000000000000000000000000000000008B :10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B +:10C5C000000000000001000000000000000000006A :10C5D000000000000000000000000000000000005B :10C5E000000000000000000000000000000000004B :10C5F000000000000000000000000000000000003B :10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A +:10C610000000410000000000009000040000000045 +:10C6200000A000000000000000004000000000002A :10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA +:10C64000000000000040000000004000000000006A +:10C65000000000000000000040000000000000009A :10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA +:10C670000000000000000000000000000000008238 :10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A +:10C690000080040008000400000000000004020004 +:10C6A0000000204000200404000000000000000002 +:10C6B0000000000000000000020000000000000078 :10C6C000000000000000000000000000000000006A :10C6D000000000000000000000000000000000005A :10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 +:10C6F0000000000000000000000002000200000036 +:10C700000200000002000200000000840000008817 +:10C71000001000408000C1848084001000000002EE +:10C720000000000280000001800100000000000005 +:10C7300000000000000000000000040004000000F1 +:10C7400000000000000400000000000000000000E5 :10C7500000000000000000000000000000000000D9 :10C7600000000000000000000000000000000000C9 :10C7700000000000000000000000000000000000B9 :10C7800000000000000000000000000000000000A9 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 +:10C7900000001000001000000010008008040000DD +:10C7A000C000000000402040900304210000000071 +:10C7B000C000000000000000000000400000000079 +:10C7C0000000000000000400000000000000020063 :10C7D0000000000000000000000000000000000059 :10C7E0000000000000000000000000000000000049 :10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 +:10C800000000000000000000000000009000080090 +:10C8100041000000000041010300410141400000CF +:10C820000000000000000000808200000000000006 :10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 +:10C8400000000000000000000000040000000000E4 :10C8500000000000000000000000000000000000D8 :10C8600000000000000000000000000000000000C8 :10C8700000000000000000000000000000000000B8 :10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 +:10C89000000008000000100008000000A0000800D0 +:10C8A000000000000004000000090020000000005B :10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 +:10C8C00000000000010000910000000000200002B4 +:10C8D0000000000000000000000000000004000054 +:10C8E00000000040001100000000000000000000F7 :10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 +:10C900000000000000000040000000400011000096 +:10C910000004000000000000000000000000000013 +:10C920000000000000000000000000000001000006 :10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 +:10C9400000000000000020000004000000000000C3 :10C9500000000000000000000000000000000000D7 :10C9600000000000000000000000000000000000C7 :10C9700000000000000000000000000000000000B7 :10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 +:10C99000000000008200080000001000C00000003D +:10C9A000A000020000008805A00082000000000036 +:10C9B000002005000003004000000000000000000F +:10C9C0000000904000000000000000000000A000F7 :10C9D0000000000000000000000000000000000057 :10C9E0000000000000000000000000000000000047 :10C9F0000000000000000000000000000000000037 :10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 +:10CA1000000000000000020000000000089000027A +:10CA200040044100830000044100212000840000F4 +:10CA300000000083A0A00000000000000000000033 +:10CA400000000000000010000000000000000000D6 +:10CA500000000020000000000000000000000000B6 :10CA600000000000000000000000000000000000C6 :10CA700000000000000000000000000000000000B6 :10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000000000066 +:10CA90000000000000000000000000000800080086 +:10CAA00000000000C0000000000082004000C00044 +:10CAB000000000080000000200000000000000006C +:10CAC0000000000000000000010002000000000063 :10CAD0000000000000000000000000000000000056 :10CAE0000000000000000000000000000000000046 :10CAF0000000000000000000000000000000000036 :10CB00000000000000000000000000000000000025 :10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 +:10CB200000000000000000002100000000000000E4 :10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 +:10CB400000001002000000000000100000000000C3 +:10CB50000204000000000000020000004100000488 +:10CB60000000000000000040000000002000000065 :10CB700000000000000000000000000000000000B5 :10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 +:10CB90000000000000000000200000400000000035 +:10CBA00000000000901000100088880000000000C5 +:10CBB0000000000040A12105008382020000000067 +:10CBC0000000000000000000000000000100000064 :10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 :10CBF0000000000000000000000000000000000035 :10CC00000000000000000000000000000000000024 :10CC10000000000000000000000000000000000014 :10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 +:10CC3000000000000000008402910409800200004E +:10CC400000000000000000000000000000001100D3 +:10CC500021000000000000000000000000000000B3 :10CC600000000000000000000000000000000000C4 :10CC700000000000000000000000000000000000B4 :10CC800000000000000000000000000000000000A4 :10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 +:10CCA00000000000000000000000004100008000C3 +:10CCB0000000000000000000910020008500882096 :10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 +:10CCD0000041090000030000000000000000000007 :10CCE0000000000000000000000000000000000044 :10CCF0000000000000000000000000000000000034 :10CD00000000000000000000000000000000000023 :10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 +:10CD20000000000000000000000010009001020858 +:10CD30001000000000000000000002A0C1001084EC +:10CD400005010000000000000000000000000000DD +:10CD500000000001010000000000000000000000D1 :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 :10CD800000000000000000000000000000000000A3 :10CD90000000000000000000000000000000000093 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 +:10CDA00000000000000000000000000002400088B9 +:10CDB000208410C0000000000000000020090005D1 +:10CDC000008340030000000000000000000000009D +:10CDD00000000000000088000000000000000000CB :10CDE0000000000000000000000000000000000043 :10CDF0000000000000000000000000000000000033 :10CE00000000000000000000000000000000000022 :10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 +:10CE20000000000000000000000000000000008082 +:10CE3000008000800580000000000000000000105D +:10CE40000391052100200000000000000000000008 +:10CE500000000000000000000000000020000000B2 :10CE600000000000000000000000000000000000C2 :10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 :10CE90000000000000000000000000000000000092 :10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 +:10CEB00000008040000000000000000000000000B2 +:10CEC000A1828240C10000020000000000000000BA +:10CED0000000000000000000000000110000000041 :10CEE0000000000000000000000000000000000042 :10CEF0000000000000000000000000000000000032 :10CF00000000000000000000000000000000000021 :10CF10000000000000000000000000000000000011 :10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 +:10CF300000000800A00004880200000000000000BB +:10CF400000000303118810820000000000000000B0 +:10CF500000000000000000000000000000010000D0 :10CF600000000000000000000000000000000000C1 :10CF700000000000000000000000000000000000B1 :10CF800000000000000000000000000000000000A1 :10CF90000000000000000000000000000000000091 :10CFA0000000000000000000000000000000000081 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 +:10CFB000000000000000000007006000000000000A +:10CFC00000000000000000E007000000000000007A +:10CFD000000000000000000000000000000000E071 +:10CFE00000008100000000000000000000000000C0 :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 :10D010000000000000000000000000000000000010 :10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 +:10D03000000000000000FFAA5500C3050505000020 +:10D0400000000000000000AA0F0FFBF3F3F3000044 :10D0500000000000000000000000000000000000D0 :10D0600000000000000000000000000000000000C0 :10D0700000000000000000000000000000000000B0 :10D0800000000000000000000000000000000000A0 :10D090000000000000000000000000000000000090 :10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 +:10D0B0000000000000000000CFCFCFCFC3AFAFAF64 +:10D0C000000000000000000000AA0F0F0B03030384 :10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 :10D10000000000000000000000000000000000001F :10D11000000000000000000000000000000000000F :10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF +:10D13000000000000000000000005555AA0ACC00C5 +:10D14000CC00000000000000000055FF55403C3CB2 +:10D150005555000000000000000000000000000025 :10D1600000000000000000000000000000000000BF :10D1700000000000000000000000000000000000AF :10D18000000000000000000000000000000000009F :10D19000000000000000000000000000000000008F :10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F +:10D1B0000000000000000000000000000000A000CF +:10D1C000CCC00C00000000000000000040FF404008 +:10D1D0003C3C0F3C0000000000000000000000008C :10D1E000000000000000000000000000000000003F :10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E :10D21000000000000000000000000000000000000E :10D2200000000000000000000000000000000000FE :10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE +:10D240004008009000010000000000000000806124 +:10D25000000D0009000000000000000000000000B8 +:10D2600000000000000000600006000C000000004C :10D2700000000000000000000000000000000000AE :10D28000000000000000000000000000000000009E :10D29000000000000000000000000000000000008E :10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E :10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E +:10D2D00055FF5500C3C3F0F000000000000000003F +:10D2E000000000000000000000000000FFFF000040 :10D2F000000000000000000000000000000000002E :10D30000000000000000000000000000000000001D :10D31000000000000000000000000000000000000D :10D3200000000000000000000000000000000000FD :10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD +:10D350000000F0FFF000FF00FF00000000000000F0 :10D3600000000000000000000000000000000000BD :10D3700000000000000000000000000000000000AD :10D38000000000000000000000000000000000009D @@ -32067,119 +32067,119 @@ :10D3A000000000000000000000000000000000007D :10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D +:10D3D00000000000FFFF0000000FFF0F0000000032 :10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D +:10D3F000F0F000000000000000000000000000004D :10D40000000000000000000000000000000000001C :10D41000000000000000000000000000000000000C :10D4200000000000000000000000000000000000FC :10D4300000000000000000000000000000000000EC :10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC +:10D450000000000000008F0F8F0F000FEB0F000087 :10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC +:10D470000000F0F0000000000000000000000000CC :10D48000000000000000000000000000000000009C :10D49000000000000000000000000000000000008C :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000024A -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000022A +:10D4C0000000000000002003000000000000000039 +:10D4D000000000000000000000000000000000004C +:10D4E00000000000000040000000000000020000FA +:10D4F000000000020000000000000000000000002A :10D50000000000000000000000000000000000001B :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB +:10D5400000000000000000001100000000000000CA :10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB +:10D5600000000000000000020000000000000000B9 :10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B +:10D580000000000000C0000200C000000000000019 +:10D590004100000000000002000000000002000046 :10D5A000000000000000000000000000000000007B :10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A +:10D5C000000000000000000000000000000000401B +:10D5D000000000000000000000000000000000400B +:10D5E000000000000000000000100000000000002B +:10D5F00000000000000000000000000000400040AB +:10D60000000000400000000000000000000000409A +:10D6100000000000000000000000000000000040CA :10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA -:10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA +:10D630000040020002000000000000000200004064 +:10D640000000000002000000000000000010008246 +:10D6500000000000000000000004000000000000C6 :10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA +:10D67000000000000000000000400000000000006A :10D68000000000000000000000000000000000009A :10D69000000000000000000000000000000000008A :10D6A000000000000000000000000000000000007A :10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000000000005A -:10D6D000000000000000000000000000000000004A +:10D6C0000300020000000000000000000000000055 +:10D6D000020004000000041100000000000000002F :10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 +:10D6F00000000000000000000000400000000000EA +:10D700009000200000000000000000000000000069 :10D710000000000000000000000000000000000009 :10D7200000000000000000000000000000000000F9 :10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 +:10D7400000000000000000000000000000000800D1 +:10D75000002000000000000000880804080000000D +:10D760000088000000000000000000000000000031 +:10D770000000000000000000210000000000000088 :10D780000000000000000000000000000000000099 :10D790000000000000000000000000000000000089 :10D7A0000000000000000000000000000000000079 :10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 -:10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 +:10D7C0000000000000000000000000080800000049 +:10D7D0000000000000000000000000000040000009 +:10D7E00000000040000000000040000000000000B9 +:10D7F00000000000000000000000000000400040A9 :10D800000000000000000000000000000000000018 :10D810000000000000000000000000000000000008 :10D8200000000000000000000000000000000000F8 :10D8300000000000000000000000000000000000E8 :10D8400000000000000000000000000000000000D8 -:10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 +:10D8500000001000000000000000110000000000A7 +:10D8600000000000000005000000000000000400AF +:10D870000000000000000000090000000000090096 +:10D880000000000002000000200011000000000065 +:10D890000000000000900000000000000090000068 :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 :10D8C0000000000000000000000000000000000058 :10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 +:10D8E0000000000008000000000000000000000030 :10D8F0000000000000000000000000000000000028 :10D900000000000000000000000000000000000017 :10D910000000000000000000000000000000000007 :10D9200000000000000000000000000000000000F7 :10D9300000000000000000000000000000000000E7 :10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 +:10D95000000000000000000020001188000000000E +:10D960000990030000000000000000000000008893 +:10D970000888000000000000000000000000000017 +:10D9800000C0000000000084000000000000000053 :10D990000000000000000000000000000000000087 :10D9A0000000000000000000000000000000000077 :10D9B0000000000000000000000000000000000067 :10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000000037 -:10D9F0000000000000000000000000000000000027 +:10D9D0000000002000000000000000000000000027 +:10D9E0000000000000000000000000000400000033 +:10D9F000000000000000000000000800000000001F :10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 +:10DA10000002000000000000000000000000000004 :10DA200000000000000000000000000000000000F6 :10DA300000000000000000000000000000000000E6 :10DA400000000000000000000000000000000000D6 :10DA500000000000000000000000000000000000C6 -:10DA600000000000000000000000000000000000B6 -:10DA700000000000000000000000000000000000A6 -:10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 -:10DAB0000000000000000000000000000000000066 +:10DA600000000000000000000008000000000800A6 +:10DA70004100050005002100000000000500000035 +:10DA800000000000008800000000110011040000E8 +:10DA900000002000050000000000000405000888C8 +:10DAA00000001000000000400040000000001100D5 +:10DAB0000000000000000500000000000000000061 :10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 +:10DAD0000900008820402000000000000000000035 :10DAE0000000000000000000000000000000000036 :10DAF0000000000000000000000000000000000026 :10DB00000000000000000000000000000000000015 @@ -32334,8 +32334,4105 @@ :10E4500000000000000000000000000000000000BC :10E4600000000000000000000000000000000000AC :10E47000000000000000000000000000000000009C +:10E4800000002000200400000003880200020000B9 +:10E49000008000800000000020000000000000005C +:10E4A0000000000200000002000200000000000066 +:10E4B00001020000008000800000000000840003D2 +:10E4C000008000800080008000000082008000400A +:10E4D000000000000000C00000000000000000007C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000800000000000009C +:10E500000000000000000000000400900000000176 +:10E5100000000008090200022000000000000000C6 +:10E52000400200000000000000000000000000A009 +:10E530004000020000000040004000C000C0000594 +:10E540000000094000400040004000000040004042 +:10E5500000010000000000000000000000000000BA +:10E5600000000000000000000000000000000000AB +:10E5700000000000000000000090004000000000CB +:10E580000000000000000040004000000200000009 +:10E5900000100100210002080204000001410400F3 +:10E5A0000202000001000000020001000100024020 +:10E5B0002182030801000340010000000000000068 +:10E5C00020800000000000000000000000000000AB +:10E5D0000000000002001000100000000200000017 +:10E5E00000000000004000400000000000000000AB +:10E5F0000000000000000000820000000000000099 +:10E600000200020000000000001000000000800472 +:10E61000200000080200824080C1800100C002008A +:10E6200000008008000002000040A000020002007C +:10E6300080008205100010009000100000000040D3 +:10E640000000800400000000000000000000000046 +:10E65000000000000000800880008000000400002E +:10E6600000000000000000000000000000000000AA +:10E670000000000000000240020000000000000056 +:10E68000000000000000000000000000000000008A +:10E6900004008400000001044000C10000000000EC +:10E6A0004000000001000000000400000004000021 +:10E6B0000000000000000000000000000100000059 +:10E6C0000100010901030000000200000000000039 +:10E6D0000000000000000000000000000000010039 +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E71000000000000082009002048000100004004D +:10E7200000000000000002000000000000000000E7 +:10E7300000000000000000000000000000002000B9 +:10E74000000002000200020000000085000021001D +:10E7500000000000000000000000000000000000B9 +:10E760002000000000000000000000000000000089 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000082000000820085 +:10E790008200A00001004000000082000200008012 +:10E7A0000204A100C000C10000008300C0000900F5 +:10E7B00090050000000008000000030000000200B7 +:10E7C0000000020000000000C0000000040004007F +:10E7D0000000000000000000000000000008000031 +:10E7E0000080018800000000000000000000000020 +:10E7F0000000000000000000000002000000000017 +:10E8000000000000000000090011000010000000DE +:10E81000000800001000021000100000000080003E +:10E820000004830102000008020000000200000052 +:10E83000020000000000410000004140A000000074 +:10E8400080000000800000000000000000000000C8 +:10E8500000000000000000000000000000000001B7 +:10E860000000002002210000000000000000000065 +:10E870000000000000000000000000000000000098 +:10E88000000000000000000000000088000082007E +:10E8900000008200000008000800840010008200D0 +:10E8A00008200200A00000110000842084008200E3 +:10E8B0000200C00040000000000082208405822188 +:10E8C000C04082110040C00000008400020000002F +:10E8D0000000C0000002A0002040000090000000E6 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000008400000000000000000083 +:10E9100000A000000000000000040020050000002E +:10E9200000040000800040000004000000000020FF +:10E9300000008000000080000000000000000000D7 +:10E9400000880001000000010000000000008000BD +:10E9500000000000000000010000000100000000B5 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E99000000082000000000000000000C000100025 +:10E9A0008200C180000000000000C0000209C00910 +:10E9B00090058200C000100008034000C0000080E5 +:10E9C000A1408200C00000000208A00008800209E7 +:10E9D000840000000000C0004000C0000040004073 +:10E9E00000400040000000000000000000000000A7 +:10E9F000000900000000000000000000000000000E +:10EA000000000000000000002000080000000000DE +:10EA100000000000000000000000000000000000F6 +:10EA2000000000004002000002020200000080001E +:10EA300000000808000000000000000000000000C6 +:10EA400000400200000800400000000000000040FC +:10EA50008000000000000000000000000000000135 +:10EA60000001000100010308000000000000000098 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000040000000000000000046 +:10EA90000000000000000000000000000000000076 +:10EAA0000100200000000809208984900482404071 +:10EAB00088880002020240400002A004C0900504C1 +:10EAC00008901040089040C00002002020910202EF +:10EAD00000A0012002020000040500820090020252 +:10EAE0000202008400024004010090400000000087 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB1000901000A000A0C0840000000000000000D1 +:10EB20000000100000000000404105100811808224 +:10EB30008080000000808080400005800080800090 +:10EB4000898020008500000040000080000000084F +:10EB5000A080000004008080000080890041000344 +:10EB600080898080000000800080110080210000EA +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB900000000000000000008000000000000000F5 +:10EBA00000001000200010004100200009A1A00872 +:10EBB000C090000080C180A00000800080A1800083 +:10EBC00000000300C040410091000005804091A07A +:10EBD000000080008005800000000000C000A1400F +:10EBE000C0099000000000100080808000040080B8 +:10EBF00011400000000000000000000000000000C4 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000C10000800000000000B3 +:10EC20000000000001001000080041000890204092 +:10EC3000401105C0400040C0020288880400021054 +:10EC4000408888881000029108408202400002C07B +:10EC500003418484020020A084202082000004005C +:10EC6000038384A10504200000850002C004000184 +:10EC70000002010100880000000000000000000008 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000008400A08388A008C00000DD +:10ECA00000000000000000010000A0000001414041 +:10ECB000082008080491A120000290902020110350 +:10ECC00000904005C10403030004084110084102FC +:10ECD00082044040829091020040042021200000E4 +:10ECE00003020104C1C0040409A00002040440049A +:10ECF0000100848802000100000000000000000004 +:10ED00000000000000000000000000000000000003 +:10ED10000000000000000000100800A004A0820411 +:10ED200000000000000000000009004180110010F8 +:10ED30004120820388859141080000800000000086 +:10ED400090820040808589C0C190008300218002AC +:10ED5000108000808089C0000280008000000400D4 +:10ED60000000C0800980030088804000008080800F +:10ED70000080410000808009410000000000000088 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000800000800073 +:10EDA00080800000000000000000000000000080E3 +:10EDB000000008A1A1902080890800000000000048 +:10EDC00000008010808080800000808080090080AA +:10EDD00000038020918500008000800000000080FA +:10EDE00080000000800589918980894000008000B2 +:10EDF00000008000001111000080000000000000F1 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000004EE +:10EE20000000000000000000000000000008008852 +:10EE30000002000821038482400204008800400888 +:10EE4000202040000201020204044000021004419C +:10EE5000880240010201050488900400040040205B +:10EE600020020400000002A0208202020500C0006F +:10EE70000400409004000001010000400000000078 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000A000D2 +:10EEA00020A140A0C0000000000000000000000001 +:10EEB000000000000000000000E0000081210000D0 +:10EEC00000000000820000000000000000060000BA +:10EED00000E000004100000000E000000000000031 +:10EEE00000E0000000000000000000000000000042 +:10EEF0000000000000000000000000E00700820A9F +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000060820000000000000000FF +:10EF3000000000000000000099969696FF0038C778 +:10EF4000AA695596E41BF00F665A5A5AF00FA55A53 +:10EF5000A5999999A857FF00E4E41B1B639C699647 +:10EF6000C33CC3C6665A5A5A0000A58DA50F2FD0C0 +:10EF7000AF5063339CCC01FEFE0100000000F0F0B6 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA00000008787550005CF05C000000000000065 +:10EFB000000000000000000000009999999900FFEE +:10EFC000C738AA65559ACC33CC3366666666F00FAF +:10EFD00027D85A5A5A5A57A800FFCCE4331B3CC3CF +:10EFE0003CC33CC33C396666666600005A725AF000 +:10EFF000D02F50AF3C3CC3C3C33C3CC30000000017 +:10F00000F0F0000000000000000000000000000020 +:10F0100000000000000000000000000000000000F0 +:10F02000000000008787FFAAF5CFF5C000000000B0 +:10F030000000000000000000FF0F0FFFAA55A956B6 +:10F040006A5595AA33CC1BE441BEBE41F0D8CCCC66 +:10F0500080C37F3CF00F33CC6969699902FDFD02E2 +:10F0600033F0CC0FE31C1CE3C33CC9360000C33CA7 +:10F07000CC33827DA25DC33CC33C3C3CFFFF00001F +:10F08000FF000000FFFF0000000000000000000083 +:10F090000000000000000000000000000000000070 +:10F0A000000000000000CA00CAF00151A1F10000F8 +:10F0B000000000000000000000005555AAAAA55A53 +:10F0C000A55AAAAA5555F00FF00F51AEAE510F2711 +:10F0D00033337F3C80C3728D33CC696996960FF0D1 +:10F0E000F00F1BF0E40F00FFFF00CC33CC33000027 +:10F0F000C936CC337D825DA2699639C63C3C00009E +:10F100000000FF0000000000000000000000000000 +:10F1100000000000000000000000000000000000EF +:10F120000000000000000000CA0FCAFF0B5BABFB31 +:10F13000000000000000000000610006000D100249 +:10F140004061800700201002400080000020100273 +:10F1500040618006002D10024061800700291002E6 +:10F1600040008006002C100240618007002D100234 +:10F17000000040618006002D100240008000002049 +:10F18000420205002A06054C00A80000000000000D +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000C09F +:10F1B00000000000000000000000000000004141CD +:10F1C00041EB0F0F0F0FB2B2C3FF000000000000B1 +:10F1D000000000000000FFFFFFFF00000000000033 +:10F1E00000000000FF0000FF000000000000000021 +:10F1F0000000000000C000C000000000000000008F +:10F20000000000000000FF0000FF00000000000000 +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F24000050505AF553C0000B2B2003C00000000CF +:10F250000000000000000000FEFFFFFF00000000B3 +:10F26000000008000000FF0000FF00000000000098 +:10F2700000000000000000C000C00000000000000E +:10F280000000000000000000FF0000FF0000000080 +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C00000000F0FFFFF0000A5000028C3EB0000A7 +:10F2D000000000000000000000000000000000002E +:10F2E0000000FFFFFFFF00003C3C00FF00000000AB +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000FF0000FF0000FF +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000F3F0FFFCF0F025203030F3F374 +:10F3500000000000000000000000000000000000AD +:10F3600000000000FEFFFFFF00003C3C00FF00002B +:10F3700000000000000000000000000000804000CD +:10F38000000000000000000000000000FF0000FF7F +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000004100000C +:10F3C0002000840020020000000020000000A08037 +:10F3D000A0832000200020000000000000020000A8 +:10F3E00000002000000000004000000000000000BD +:10F3F0000000000000000000A0000002000000006B +:10F4000000000000000000000000200000000000DC +:10F4100002000000000000000000200000000000CA +:10F4200000000000000000000000000000000000DC +:10F4300020000000000000000000000000000000AC +:10F4400000000000000000000000000000000000BC +:10F45000001020100000000000000000000000006C +:10F46000000000000000000000000000000200009A +:10F47000000200000000090200000000000000007F +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B00000000000000000000000009000000000BC +:10F4C0000200020000000000080002090000000025 +:10F4D0000210000000000000000000008400000096 +:10F4E000000084000000841000108400000000412F +:10F4F00000000000004000100000020000000000BA +:10F5000000000000000000000000000000000000FB +:10F5100002000000000000000000080000000000E1 +:10F5200000000000000000000000000000000000DB +:10F530000000020090000000000000000200000037 +:10F5400000000088000000000004020000001040DD +:10F550000000000900000000000000000000004062 +:10F560000000000002000000000000080000081079 +:10F57000000000C00000000000400000000000404B +:10F580000000000000000000000000100004000067 +:10F5900000008000000000004000000000000000AB +:10F5A000000000000000000000000000000000005B +:10F5B0000000000000000000000002000200020045 +:10F5C00000000000000400400000000000000000F7 +:10F5D0000005000004000000000000000000000022 +:10F5E00000080000000000000000000800000040CB +:10F5F00000000000C000000000000000000000004B +:10F6000000200000000000000000000000000000DA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F64000000000000000110002000000080011008E +:10F6500021000900030400884000400000000088E9 +:10F6600000900000000003000000080000000000FF +:10F67000030003200800000008000800000000004C +:10F680000000000000002100000000000000000059 +:10F690000000000010C0000000000000000000009A +:10F6A000000000000000000000000000000000005A +:10F6B00000000000100000000000410000000000F9 +:10F6C00000000000000408000000104100050000D8 +:10F6D0000008A000002100004041A010000400210B +:10F6E0000000900008000000000000000041001031 +:10F6F0000810000000000000001100110040001080 +:10F7000000000800000000000000000000000000F1 +:10F710000010000000000000000000110040010087 +:10F7200000000000000000000000000000000000D9 +:10F7300000100000000000000000001100000000A8 +:10F740000040000000000000000000000000000079 +:10F75000000000000000000040000900000011004F +:10F760000008000000000000000000000000000091 +:10F7700021000000000000A0000000400000000088 +:10F780000040000000000000000000000000000039 +:10F790000000000000000000000000000000000069 +:10F7A0000400000000000000210000000000000034 +:10F7B0000000001000000000000000000000080031 +:10F7C0000000000000000200000000000000020035 +:10F7D00000002000C0000000000000000000000049 +:10F7E0000000000000000000000000000000000019 +:10F7F00000000020000004000100000000000000E4 +:10F800000180002000000000000000000000000057 +:10F8100000000000000000000000000000000000E8 +:10F8200000200000000000000000000000000000B8 +:10F8300000000000000000000000080000000000C0 +:10F8400000000000000000000000000000000000B8 +:10F85000000000002000000021021100400008907C +:10F86000082020001100028400A000900400000085 +:10F87000038811020200000005004040008400825D +:10F88000080008100000000000000904000000004B +:10F890002100210000000800000003C0000000005B +:10F8A00000000001008400000000000000000000D3 +:10F8B0000000000000000000000000000000000048 +:10F8C00000000000000000000000000808400000E8 +:10F8D0000000840000000000000008001008000084 +:10F8E0000000000000400011000000000000400087 +:10F8F00000034000000000000000000000000000C5 +:10F90000000000000000080208008800000000005D +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000010000000000000000002C5 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F950000000000000000000000000000000008423 +:10F9600000040040000041000900000003041000F2 +:10F97000000000000000050000000008000000007A +:10F980000000000002000200004000000000020031 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000200000000000000000035 +:10F9D0000000000000000000000000000000000027 +:10F9E000000003A0002000A020C0000000000000D4 +:10F9F0000000000000000000000000000100820084 +:10FA0000000084008400000082000000000000006C +:10FA100000000000000000000000000000000000E6 +:10FA20000000000000009000000000A000000000A6 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000090800080008000000000000086 +:10FA70000000000000000000000000000000410045 +:10FA800000000000000000000000800000000000F6 +:10FA90000000000000000000000000000000000066 +:10FAA00000000000000011008000000000000000C5 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000000000001080000000000086 +:10FAF0000000000000000000000000000000000006 +:10FB00000000000000000000000080000000000075 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000008000000080D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB600000000000000000009000A001A040000084 +:10FB70000000000000000000000000000000000085 +:10FB8000000000000000000002008200A0008200CF +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000000020000035 +:10FBB00000C0000000000000000000000000000085 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000000000000000025 +:10FBE00000000000000000000000201000C0009095 +:10FBF000C010000000000000000000000000000035 +:10FC000000000000000000000001000200100020C1 +:10FC10000082000000000000000000000000000062 +:10FC2000000000000000000000000000010000884B +:10FC3000880001000000000000000000000000003B +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC70000000800000000000000000000000000004 +:10FC80000000000000050021000500400080008009 +:10FC900000000080000000000000000000000000E4 +:10FCA0000000000000000000000000000000410013 +:10FCB00000800000090000000000000000000000BB +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE000000000000000000000000000000000090B +:10FCF0000020808080000000000000000000000064 +:10FD000000000000000000020000000000000000F1 +:10FD100000020000000000000000000000000000E1 +:10FD200000000000000000000000000000000000D3 +:10FD30000011000000800000000000000000000032 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD7000820020018240040000000000000000001A +:10FD80000000000000000000000100000000000072 +:10FD90000000002100C00000000000000000000082 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000100000040000000000000000002 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF0000000000000000000000A000000000000F9 +:10FE000000000000000000000000000000000000F2 +:10FE10005000000000000000000000000000000092 +:10FE200000000000000000000000000000000000D2 +:10FE30000000000000000000070082210000000018 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE700000000000000000000199919900000000BE +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000999903990000000094 +:10FEA0000000000000000000000000000000000052 +:10FEB000000000000000000000000000F0F0000062 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000000012 +:10FEF0000000000000000000839F67FFF7FF000084 +:10FF000000000000000000000000000000000000F1 +:10FF1000000000000000000000009999F399000023 +:10FF200000000000000000000000000000000000D1 +:10FF30000000000000000000000000000000F0F0E1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000008D0FC0FCA9 +:020000040008F2 +:10000000C0FC000000000000000000000000000034 +:100010000000000000000000000000000000FF00E1 +:100020007F7F0000000000000000000000000000D2 +:100030000000000000000000000000003C3C000048 +:10004000FFFF0000000000000000000000000000B2 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000FF0F72 +:10008000C3FFC3FF000000000000000000000000EC +:100090000000000000000000000000000000000060 +:1000A000FF00101000000000000000000000000031 +:1000B00000000000000000000000000000003C3CC8 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000610006000D000000006B +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400005002A00054000A8000000000000000093 +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000100DD +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:100370000000000000000000000020000400200039 +:1003800020000000900000008800000002800010A3 +:100390000003000404800000000020000000400072 +:1003A000200000000000000000000000000000002D +:1003B0000000000000000000000104000000040034 +:1003C00000000000C000000000000000000000006D +:1003D00000000000000000000000200000002000DD +:1003E0000004000000000000000000000200000007 +:1003F0000000000000000000C0000000000000003D +:100400000000000000000000000040000000891013 +:100410000001000400000040000040000000000057 +:1004200000000000000000000000000000000000CC +:1004300000000002000200020000000000000000B6 +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:100480000000000000000200020000000000000068 +:1004900001000200848000804090080004000400F5 +:1004A00000000041000004090000000000000000FE +:1004B000000004000400040000000400000000002C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F0000200000002400000024102410000000032 +:100500000084000000000008001000000010000837 +:100510000002040400C0001000028010000000006F +:1005200000040000008800040000000000000540F6 +:10053000040000000082000000000004000400002D +:1005400000000000000004000000000000000000A7 +:100550000810000000000000000000000000000083 +:100560000088000000000000000000000000000003 +:10057000000000000000000000000000004000003B +:100580000000000000000008000084008800000255 +:100590008800402182009040880008000800010087 +:1005A00000400021880000000204A0000800900024 +:1005B00008080040000000000000000000000000EB +:1005C000000000000000002100000800A000000062 +:1005D0000000000000000005000000000000000016 +:1005E000000000000000000000000000000000000B +:1005F0000000000000000000000088000000000073 +:1006000000000000000000000000030000000300E4 +:10061000404000000000002000010082800000082F +:100620004008000000000800000000000000080072 +:1006300000020000000000000000000000000000B8 +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000800C0008200820000118210FB +:1006900082000800000009000020000000000000A7 +:1006A0000000000200000000000008000000000040 +:1006B000000000000000000000000000000000003A +:1006C000000000100000000000000000000000001A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000002000000000000000000F8 +:1007000000000000000000000000000000000000E9 +:1007100000000000000000C00800419100080084B3 +:1007200021400000000000A0410000102000000057 +:1007300000000000000010C0000000A003000084C2 +:1007400009001188100100001000002000000000C6 +:1007500000000500000005000000000000842000EB +:1007600000840000000000000000000000004000C5 +:10077000000008000000000000400040008400006D +:1007800000000000000205000040004000000021C1 +:100790000000000000008200000010000000820045 +:1007A00000002003100000000004000900400003C6 +:1007B0000000000000040000400000000000820073 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000400000A8 +:100810000000000000024000000208040300000283 +:1008200003000000000005200000000000000000A0 +:1008300011020000000000000000000000000000A5 +:1008400000000000000008000000000000000000A0 +:100850000000000000000000000000000000000098 +:100860000000008400000000000000000000000004 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000860 +:1008900000100010000000000000000000008200B6 +:1008A0000000108000000000000000030010820023 +:1008B000000900000000000000000000000000002F +:1008C0001009000000000000000000000000000807 +:1008D0000800000000000000000000000000000010 +:1008E00000000000000000000000000800020041BD +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000004000000000A7 +:1009100000000000000000000000000002000000D5 +:10092000009000000020000008000000020000000D +:10093000000000100000000000C009840000000852 +:100940000088080000000000000005000000000012 +:10095000000000000000080000000000000000008F +:100960002010001000000000000000000000000047 +:100970000000000000000000000000000000000077 +:10098000004002880000000000000000000000009D +:100990000000000000000000000000000000000057 +:1009A00002C010880010908282A18900200210A04D +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A2000000000800000000000800088A00000900E +:100A300000110000000000000000000000000000A5 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000002008000800800030534 +:100AB00040004103000000000000000000000000B2 +:100AC0000000000000000000000000000000000026 +:100AD0008000800000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000800A0841090008277 +:100B30000100002001410000000000000000000052 +:100B4000000000000000000000000000000008009D +:100B500090000400020000000000000000000000FF +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA00000000000000000000820A0028410C10224 +:100BB000000300021020C00300000000000000003D +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000008080008080C4 +:100C30008980001003C0204100C1000000000000B6 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA000000000000000000000000000001080C0F4 +:100CB00000008000A1092000090090080000000049 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000080000000000000000094 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D2000000000000000000000000000000088003B +:100D3000022090880800419183008800040100008F +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000200900000000001 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB00000000000070000820000000000000000AA +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E3000000028F828F8FFFF000028787D788A0A4B +:100E40008000000000000000000000000000000022 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000028F82FFFCF8ACF8A2828282892 +:100EC0008AAA80A0000000000000000000000000CE +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000C0CA500A500E0E08F +:100F4000EFEF0000000000000000000000000000C3 +:100F50000000000000000000000000000000000091 +:100F60000000FF14FF170000000000000000000058 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB000000000000000000082828301A5A005005F +:100FC000E0E0EFEF00000000000000000000000083 +:100FD0000000000000000000000000000000000011 +:100FE00000000000141417170000000000000000AB +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000800050080500D3 +:10104000000080610006000D0000000000000000AC +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C00000000000DF008A00FF20FF700000000029 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:101140000000000000005D000800FF00FF500000EC +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C00000000000000000002D2D2D2D5F4300FFCA +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000007D7D28285F43B2 +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C0000002000000000041000300000002840052 +:1012D00010001100000088000000820000050000DE +:1012E000000000000000000000000008880020004E +:1012F000000221040003000084008400200000009C +:1013000000000000000088000000000088002000AD +:10131000000500000000000020008800040082009A +:10132000000000000000200000000000000000009D +:1013300000000000000000000000000000040002A7 +:10134000000000202000000000000000000000005D +:1013500000000000A0000000000000C0000000002D +:10136000000000C0000000000002000000000000BB +:1013700000000000100000000000008200000900D2 +:10138000000000000000000000000002000000005B +:10139000000200000000200000000000000000002B +:1013A000000000000000000000000000000000003D +:1013B00000000000000002020000000000008200A7 +:1013C000A0000000000082000000820082000000F7 +:1013D00082050400840000000000000000000041BD +:1013E000000000000000000000000000820000007B +:1013F00000000000000000000000000000000000ED +:101400000005000000000000000090050041000001 +:1014100000000000000400001000000000000000B8 +:101420000000900000000200020000000000000028 +:10143000020000000000000002000008001000028E +:101440000008000000040000008400000088000084 +:1014500000000000000000020082001005000000F3 +:101460000002000000000000000000000000040076 +:1014700000000008000000000000000000840000E0 +:101480000000000000000082008800000088008248 +:101490000000000200840000000080000000000046 +:1014A000000000000000000000000000000000003C +:1014B00000000240000000000000004000000000AA +:1014C000044000000000002000000000880004002C +:1014D000040004000010000000210040000800216A +:1014E00000030010001000200008000000000008A9 +:1014F000000000000020000000002021000010215A +:1015000000050005000000000000000300210002AB +:101510000000000000080000004000000008000576 +:101520000000000000000041004100000000000039 +:101530000000000000000000000000002000000289 +:101540002000000200000000000000000000000079 +:1015500000200500000200880088008800000020AC +:101560000088008800040000000000000040000027 +:1015700000001100002000000000000080A000001A +:10158000000008000000080000000000000000004B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B00000000000000008000000000000008000A3 +:1015C00000000000000000000841000000030003CC +:1015D00000112000000000000009000000000000D1 +:1015E0000000820000000000200020000000A00099 +:1015F00000000000A0002000000082000000820225 +:101600000000A00000008200A00020008200000076 +:101610008200000000118800820082008200000029 +:101620008204000000000000000082008200A00090 +:1016300082000000000000000000820082008200A2 +:10164000820000000000080000001000000000C040 +:1016500000000000000005000000000040000088BD +:10166000100000000002050000001000000005004E +:10167000100005081100000005000000008841006E +:101680000000000000000500000000000000000055 +:1016900000000000000000000390000000000000B7 +:1016A0000000000100000000000000000000000039 +:1016B00000002100000040000000000000000000C9 +:1016C00000000040000000000000000000000000DA +:1016D00000000000000000050005000000410000BF +:1016E00000000000000000000000020000000008F0 +:1016F0009000000000000000000090008200004107 +:10170000000000000000000000000000C000000019 +:101710000000000000008200000200000008080035 +:10172000004000000000200000008200C000000017 +:101730000000000000000800000000000000080099 +:101740000041000001110000000000002000000026 +:10175000020000000000000000040502040203046F +:1017600000A000000802000020000020004000004F +:101770000000000000200000000000000000400009 +:101780000000050000000000000000000000000054 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000001000000000000000000009 +:1017D00000002000000000000000000000210021A7 +:1017E0000008001000410400000000000000880014 +:1017F0000000900088000000000000000041100080 +:101800002008000000210400000000054000400006 +:101810008200000400210005000000000000000418 +:101820000002002100210000000200000800080062 +:1018300008002008C00000000000000000000000B8 +:101840000040000400000000000000000000200034 +:1018500000000000000011000084000000000000F3 +:1018600000000088000000000000000005000000EB +:10187000000000000002050005001000000000004C +:1018800010004000080008002100000000000000D7 +:101890001100050205020000000005000000000024 +:1018A000000005000000080000000000000000002B +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000001000116 +:1018D000000100C10001000100C00005000103017A +:1018E000008200840001200100C00000000100010E +:1018F000000100C00001000100C00003010100015F +:10190000000800100101200100C0000000000001DB +:101910000001000100C00001100100C0010300002F +:101920000101001000080001000100C100000001D9 +:101930000001000100C00001000100C10089010098 +:101940000001000200100001000100C10000004180 +:10195000004100410084004100410089104100081D +:101960000841008000000241804100C100000041A8 +:1019700000410041008500410041008310414108C1 +:101980000341008000800441804100C1000000004C +:101990000041004100410085004180410090034129 +:1019A000000203410000008000410041008500006A +:1019B00000410041004100C0004100410088094150 +:1019C0002009054100000080004100410085000021 +:1019D0004100030000000080410084000000080076 +:1019E000890084000011C0004100C1000080800017 +:1019F0004100030000000080410084000000080056 +:101A00008900C00000C0C000C100C100008080008B +:101A1000000041000300000000804100850000003C +:101A20000800890082000040A0004100C100008041 +:101A3000808041000300000000804100850000001C +:101A40000300410082000040C0004100C10000804E +:101A5000808001000100000000C00100C000000003 +:101A60000100400005040010C1008500C1000040D5 +:101A7000820001000100000000C00100C000000061 +:101A80000100400004840005C1000900C1000040BD +:101A90008200000301000100000000C00100C0003E +:101AA00000000100400009840041C1C04100C100A4 +:101AB0000084020201000100000000C00100C0001B +:101AC00000000000200021840021C1004100C1006D +:101AD0000084020200C00001C0C10000000000013B +:101AE00000C1110800030001C0C100000000000196 +:101AF0000000000000C00001C0C1000000000001A3 +:101B000000C004C10003000100C10000000000018A +:101B100000000000000000C00001C0C10000000083 +:101B2000000100C040040011000110C100000000CD +:101B300000010000000000C00001C0C10000000062 +:101B4000000100C040820011000100C1000000003F +:101B50000001000000000080004180C10000000082 +:101B60000041008584900041004180C100000000D8 +:101B70000041004100000080004180C100000000E1 +:101B80000041008980020041004100C100000000C6 +:101B900000410041000000000080004180C10000C1 +:101BA00000000041008500890041004180C1000023 +:101BB00000000041000300000080004180C10000DF +:101BC000000000410085000500C1004100C1000087 +:101BD0000000004100030000C100800080C100003F +:101BE0004102800011004100C120800080040000FB +:101BF0004102000080004100C100800080C100005F +:101C00004104800403004100C10000008002000084 +:101C100041040000800041000000C100800080C13C +:101C200000004140800041004100C141800080042B +:101C300000004100000080004100C100800080C120 +:101C400000004140800041004100C1C1000080040B +:101C500000004100000080004100C1004000C0C100 +:101C600000000100200002000100C1102000C0019E +:101C7000000001000000C0000100C1004000C0C120 +:101C800000000101200105000100C1040200C000A4 +:101C9000000001010000C00001000000C100400080 +:101CA000C0C100000100020004000100C1054000A5 +:101CB000C001000001000000C0000100C1004000A0 +:101CC000C0C100000100020004000100C1050200C3 +:101CD000C000000001000000C00001000000000082 +:101CE00000000042000000000000000084120041DB +:101CF000070000420000000000000000000000009B +:101D000000000042000000000000000088120041B6 +:101D10000700480000000000000000000000000074 +:101D200000000000004200000000000000008112DE +:101D30000041070048000000000000000000000013 +:101D400000000000004200000000000000008112BE +:101D500000410700480000000000000000000000F3 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000757B00000000000000000000000082 +:101E70000000000000000000000000000000000062 +:101E8000DEAE757B000000000000000000000000D6 +:101E90000000000000000000000000000000000042 +:101EA000DEAE0000757B00000000000000000000B6 +:101EB0000000000000000000000000000000000022 +:101EC0000000DEAE757B0000000000000000000096 +:101ED0000000000000000000000000000000000002 +:101EE0000000DEAE60C6030000000000000000310C +:101EF000E0000000000000000C00000000000000F6 +:101F000000C0630660C6030000000000000000314E +:101F1000E0000000000000000C00000000000000D5 +:101F200000C06306000060C603000000000000005F +:101F30000031E0000000000000000C000000000084 +:101F4000000000C0630660C603000000000000003F +:101F50000031E0000000000000000C000000000064 +:101F6000000000C06306000001002000890400801A +:101F7000029101000000844002088200A1000000DC +:101F80008800880020C0018088000185200000852D +:101F9000008502800300000200C00008004000022B +:101FA00000000000000000030000004000000000EE +:101FB000000000800040004000000000000004001D +:101FC000000000000000000004000000000000000D +:101FD0000000000088000000000000000000001069 +:101FE00000000000020000001000020000000200DB +:101FF0000040804040040000400100A1000220A0F9 +:102000000000000000028009200200002002800081 +:10201000004000408040C00020010003000100019A +:1020200000000000000000000000000000010000AF +:10203000000000000040000100010000000000005E +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:1020600005010000000000000000000020000280C8 +:102070000000000002000000000400401140024087 +:1020800003000000088000C002401000032101404E +:102090000200004000400008024020800040004054 +:1020A000004000000040008000800000044010401C +:1020B000004000800040004000400040000004005C +:1020C000020000800200000000000000000000008C +:1020D00000000000000008000800000000000000F0 +:1020E00002000000000000000200020000042000C6 +:1020F0008040000000000004001000010001900179 +:102100004005020400000002000303018000820079 +:10211000200110000001000102008008004000833F +:102120000201000100000001004000400000000129 +:1021300084010001004000010001008900850000C9 +:1021400080000000002000000000000000000000EF +:10215000000000000000000000000000000000007F +:10216000000000000000000000000040000000210E +:10217000000000C00000000000000384020000080E +:102180001040004100001000010000030100002188 +:102190000205010001000141900000080300400514 +:1021A00000000121002182400040000000000000EA +:1021B00001000000004000040011000000000100C8 +:1021C00000000020004000000000000000000005AA +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000050000000000000000EA +:1021F00000A000A00040000000841100A0058000A5 +:10220000000080010088001000A002102008400299 +:1022100000008000020010084082000000009000D2 +:102220008000000010880000000108010000080084 +:102230000000100000000001080100000020000064 +:1022400040000000008900010000008200880000BA +:10225000000000000000000000102100000003004A +:10226000000000000000000000000000000000006E +:102270000000C000080003400000A0119080820010 +:1022800040000800088082000000C18588400840A6 +:102290008300C185C00082000100820040004040F0 +:1022A000010311C0100091804000820010008400E2 +:1022B0000040000084000200A00001840000000033 +:1022C000000000000000004000800000000000004E +:1022D00040000000000000000000000000000000BE +:1022E00000000000000000000000080000004000A6 +:1022F00000000000000041888285000000000040CE +:102300000300800000A04108030000842040210158 +:1023100000082008020440000300020003848882B1 +:102320008301020040028000100888A010004100D4 +:10233000000000000000000088000082200500006E +:10234000000000000000000000000020000021004C +:102350000000000800000000000000000000000075 +:10236000000000000000000000000000000000006D +:1023700000000000000082008200000000009000C9 +:102380000400200400000800C0219002090002009F +:10239000A04190800000A0210402208008C082009B +:1023A0000021820084008202080410880821822112 +:1023B000C00040002005000082004000000810041A +:1023C000A01188110802C0110011040000200011A2 +:1023D00000000000000000000000000000000021DC +:1023E00000000000000000000000000000050041A7 +:1023F00000000000000000000000000000000000DD +:1024000000000000800100080000000800840200B5 +:1024100080000082004000080000000100400041F0 +:102420000000000000080008000100028003009086 +:10243000000000008000000000000000800000019B +:10244000800100000000000100A0000080000001E9 +:10245000000000000000000000000000000000007C +:102460000000008200000000008200000000000068 +:102470000000000000000000000002008200820056 +:1024800000000000008483840000002110884100C7 +:102490000000C000A003832100408240820004802D +:1024A0000908A021820384091000410200000908E4 +:1024B0000000A003C009080000020000C000A00343 +:1024C000400000848200001102090900020000009F +:1024D00000090120000900000000000004000000C5 +:1024E00000000010000000000000000000000000DC +:1024F00000000000000000000240024080000000D8 +:1025000000000000000005402005000000088209CE +:1025100082040000080000000202410103014000A3 +:10252000080420000000088800004100C0010000ED +:102530001001000803000500000008010000000071 +:102540000000A1844105030000008000020000009B +:102550000000000004010000000000000000000076 +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:10258000A0200008008211020020909000000002AC +:1025900088880090820000200104101008000208C2 +:1025A0000104880001020810208810089088081192 +:1025B0000405C0108288040488080288820900008B +:1025C00002030390C08840880290219040888808C8 +:1025D0004008004000400000000000000000000033 +:1025E00000000000000000000000000000000000EB +:1025F00010000000000020000000000000000000AB +:10260000000000000080008090800900C080000071 +:102610004000C0800500800000001091C0800009CB +:1026200080090285850002202040852080890005E0 +:1026300040C1830880C18003C08591038041802010 +:10264000000091C1A00885400003910090000000A7 +:102650000080A0800000008000000000000000005A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:1026800000000000000900000000110021A0888265 +:10269000118088008309028010001000A1901000B2 +:1026A00020218500100040094111A000A0880310DE +:1026B0000303408011089002C103C000914008004C +:1026C000830000009008C1089041C141C000028809 +:1026D00011000880000080210090800000000000B0 +:1026E00000000000000000000000000000000000EA +:1026F000000000000000000080000000000000005A +:1027000000000000000020A01000000488009004D9 +:1027100090910202020088890040002009400502D1 +:102720000108008902A009100000019008408440BF +:10273000900040C120402040032105A004000282F7 +:10274000104020840000030920C1111183030400FC +:1027500091102088A08200004000000304000000C7 +:102760000000000000000000000000000000000069 +:1027700000000000000088008800A0009000000019 +:10278000000000000000004000200208888801418D +:102790000021049182018803009020000091031021 +:1027A00000040504010011020088820800000211E3 +:1027B00000118208821089A00008048803212102E8 +:1027C00000844184039100000504014083A041215D +:1027D00004042002084090020802000800040000DF +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000088009000900088A9 +:1028000000000000000000000080000000800000C8 +:10281000049000208008C0104010002000110041EA +:1028200088090485858004101000210983020000B6 +:10283000880811900503809182C000A1C183904156 +:1028400002C020A09083A0410000C180032010118D +:102850009141A0C0008580C111A0008000000080CF +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000808048 +:102890000000000400108080001100020080800011 +:1028A00000084190A180020020004182858820001C +:1028B0008208C1800311888040402189C0808280C5 +:1028C00020C080A18000800000400000C1A19020B5 +:1028D0008380404080C00000808000408000004035 +:1028E00080008000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:102900000000000000000000000000002000009017 +:102910000808880000A19091400200000211000800 +:102920000220000189C104100188000003C00421B5 +:102930008890020111100008110840009104101045 +:102940008888830802C108880420820000000511DD +:1029500005020940100004040882840420000400D9 +:1029600020080290020000000000000000000000AB +:102970000000000000000000000000000000000057 +:10298000009000880000000000000000000000002F +:10299000000000000000000000E0000000008100D6 +:1029A00000E000000000000000E000006000000007 +:1029B00000E00000420000000000000000000000F5 +:1029C0000000000000210000000000005000000096 +:1029D000480000E00000602100000000000000004E +:1029E00000000000070000000000000000000000E0 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A1000CFCFFFFFCC3C3C3C96F096F05C3C5C3C5E +:102A200096966666CCCCF0F099996666C03FC03F3A +:102A3000CCCCF0CC4DF04DF00F0F3F3F01C109F968 +:102A40001010DF100F810FBDC0C900990206839FCF +:102A5000000093C39000060087C3080B18DB8D9914 +:102A60000C00FF30303064046404000000000000FB +:102A70000000000000000000000000000000000056 +:102A80000000000000001899D89900000000000024 +:102A9000000030300000CC3C3C3CF0F0F0F05C3CFE +:102AA0005C3C969696960F0FF0F0FF990066FF003B +:102AB000FF00CCCCF0CC4DF04DF0F0F0C0C03DFDAF +:102AC00009F910DFDFDF8181BDBDCFC9FF993E0667 +:102AD000BF9F000093C39FFF1E3C9FFFF8FB18DBC6 +:102AE0008D99CFFFFF307676640464040000000007 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000001B99DB99000000009D +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000003C3A3C3A06F906F9000645 +:102BA000FFF9F0DBFFDBF0FFF0F0CBCBCBCBFFFF8F +:102BB00000F0CBCBCBCBFFFF00C3F8F8F8F8E7E091 +:102BC0008180F7917610CFC08980F690C3C3F690CC +:102BD000E781DFD01F100000F0F0F099FB202020EB +:102BE000D8DBD818F424D000F0F0F0FF06060F0F61 +:102BF00000000000000000000000000000000000D5 +:102C0000000000000000000000000000D310FF3CA6 +:102C100000000000000000003C3A3C3A00FF00FFCA +:102C20000006FFF90F2400240F000F0F3434343452 +:102C30000000FF0F343434340000FF3C070707075F +:102C4000E7EF818FF3F33030CFC0EFE6F690F690E8 +:102C5000F0F0C3C3DBDB18180000C3C3C399FBFB50 +:102C600020FBF0FFF000FF2FDB0B000000FF000057 +:102C70000909000000000000000000000000000042 +:102C80000000000000000000000000000000C30081 +:102C9000EF2C000000000000000040008000002039 +:102CA000100240618007002D100240618007C0289B +:102CB0001002406180030029100240618003002956 +:102CC000100240618006002D100240618006002D38 +:102CD000100240618006002D100200004061800754 +:102CE000C028100240618006002D0002800000080C +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D20000000000000000000878787780000000096 +:102D3000FF000C0CC0CFF5F525252424C30014C1D9 +:102D40000AFF0AFF6530CFCF14FFF4FF00FF00FF3A +:102D5000A2A25DA200000000AAAA65650000A6A6C6 +:102D60005555AA0050500000000028F828F800002F +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000087877878000025 +:102DB000000000000000C0CF050520202424C3002F +:102DC00014010A0A0A0AAAFF00001400F4F0F3F33F +:102DD000A2A2A2A25D5D00000000AA0065CF0000D3 +:102DE000F3A60055AA0000500000000028F8EBFBF5 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E2000000000000000000000000000F3FB30BACA +:102E300000000000AFA0BFBC14141414C303FF3F74 +:102E400055AA552882B2C3F33F3FAF0F3333C33C7B +:102E5000F0F0C0C000F355A63D05FDF541BE41B1FF +:102E60000000A6F355003C30696500000000F2F058 +:102E7000FEFC000000000000000000000000000058 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA000000000000000000000000000000030BA38 +:102EB00030BA00000000A0A0BCBC550055000003C3 +:102EC0003C3F0082000082B200303C3CAA001B1B49 +:102ED000EB140FFF00C000F3FF0C3D053D057D82A4 +:102EE0007D8D00000CF3FF003C30C3CF00000000DC +:102EF0008200BE3C00000000000000000000000056 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F2000000000002000000000008400020010806B +:102F30000200010082000000040304044102200496 +:102F40000000210085008400000020000000000037 +:102F50000800004000000400000800040000000019 +:102F6000000000040001000000000000000000005C +:102F7000000000000004000000000000000000004D +:102F80000000000000000000000000000000000041 +:102F90000008000000000000000000000000000029 +:102FA00000000000000000000000000000008000A1 +:102FB000801000004000008200008002800040007D +:102FC000000000002002400000020000200000027B +:102FD0000002800000031040000000020000000218 +:102FE00000020000000200000000000000000000DD +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:10303000831000038300820000000020008004044D +:103040000080400001020384000000000200000034 +:103050000000000000000000000000000000000070 +:103060000000000002000000000000100800000046 +:1030700000000000001000000000020082000000BC +:103080000000000002000000820084000000000038 +:1030900000000000000000000000000000000040F0 +:1030A0000000000000000000000000840200020098 +:1030B0000008080000400804000000880009002003 +:1030C00080050020800240854003000000000000D1 +:1030D00000040200000802000000000000020004DA +:1030E00000100000000009000000000000000000C7 +:1030F00004000000000000100000000000000000BC +:103100000088000000000000000000000000000037 +:1031100000000000000000000000000000000200AD +:10312000000000000000000002400000000000005D +:10313000000000000021000000000010004000001E +:103140000400000000219000000000050041000084 +:103150000000010402C100800041008000040080E2 +:1031600000000005840000000004000000000000D2 +:1031700001000180000000000080000000800000CD +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000000001F +:1031B00004000000000000004184410041010900BA +:1031C00000008000080009C0000000A04000038447 +:1031D000038441000804C110410821001002089036 +:1031E00003402100030008000582030021000000C5 +:1031F00020001090080203000300000841000002B4 +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000900A5 +:10322000000000000000000400000000000000009A +:10323000000008008400080004210009881108002B +:10324000100004008800100000000000A00000082A +:103250000809C000820088000800000208000082FF +:1032600040000009000008094000080000000000BC +:103270000000000040090000A00000000000000065 +:10328000000000000000000000000000000000003E +:10329000000000000000100000000000000000001E +:1032A000000000000000000000000000000000001E +:1032B0000000008400C00000000091002100000018 +:1032C00008000000800021080010000040004000BD +:1032D000110180004088030000004000050040000C +:1032E00000404000050000000000400008004000D1 +:1032F00008C000000090080000000000000000006E +:1033000000C00000000000000000000000000000FD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:1033300000000000C00000008200C000000000008B +:10334000000000000000108088A000000400008041 +:10335000088202051000021108800184008000002C +:103360008420A0008880002008000005088000005C +:1033700001C101C1000082900880000008800000A7 +:1033800000000000008000000000000000000000BD +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B00000000000000000200400000000002100C8 +:1033C0000308400040A008404002030303089100A6 +:1033D00010400011838805208000A00240022102D5 +:1033E0000804098300C00302410105040010000223 +:1033F0000900080208020000081008400000050249 +:1034000003042100098805102100080021C00300E1 +:103410000000000000082100000000000000000083 +:103420000004000000000000044040040300008885 +:10343000000000000000000084000800000082007E +:103440000021000010008280904190C04000208048 +:1034500000A14000002100004000A00202009021D5 +:103460000003A08208410000401100004000410913 +:10347000408000001000084100000000080000002B +:103480000000820082029000C000000000000000E6 +:1034900040000000000000000000000000000000EC +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C0000000000000000000002000000320099020 +:1034D00080040820400200820000080000028000F2 +:1034E000030000C00511000041C0000040000300BF +:1034F0008200030800000000000000000000080037 +:10350000000003004100000008004102000000002C +:10351000000080000000000000000000000000002B +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:1035400000000000A0A000400882C0C0104091828E +:1035500041040282048440200002C0C040000001F7 +:10356000A000020010C00890038282840021909085 +:1035700020400082C1000001040082010000C1005F +:103580000800C000040000000100840000000000EA +:103590000000A0000000000000000000000000008B +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C00000000000000080800400000000008080F7 +:1035D000888002000080800285030502802080042C +:1035E00004030009802085890505210280842002CA +:1035F000C19100030020822003030020002000006E +:103600000200080080008000000010008000000020 +:1036100000000500000000000000000000000000A5 +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:103640000000000000000000800000080000800072 +:10365000400002000910850808800208C0110321FB +:10366000C0000402894082000000000380800083C3 +:103670000000002100828000910083002000C10032 +:10368000000040000209C18010008000000080009E +:10369000000000000000000000000000000000002A +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000080002011010CF +:1036D000900003C01000880090C1C010020090113B +:1036E0009101090082018408C190A0200801844052 +:1036F00082908200A08288838200040021008200E0 +:1037000003840000400091004082910002004000CC +:103710008400A08200000000000000000000000003 +:103720000000000000000000000000000000000099 +:103730000000000000000000000000000000000089 +:1037400000000000000000000000000040400041B8 +:10375000848205C11010000982C1020502020140E5 +:10376000210205C00009000400080090C0A00082EA +:1037700000C0A009880121000000090000A10190FB +:10378000000500A1000000400082000200210000AE +:103790000000000000010000000000000000000028 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000000000000000000000009 +:1037C0000000000000000000000000000000008475 +:1037D00000208008A1C1809100400040001100112C +:1037E00002890510910900880585030900118011DF +:1037F0002020080880C100100305404090090010F7 +:1038000003080405042000000040008900C10341B2 +:1038100000200005000300410005004000200005D5 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000011800200000000090805C109000340B2 +:10386000C10082080200A0208000808000000010BB +:10387000040485400480410080400088000000006E +:103880000080000000800040000000C000808080B8 +:103890008040000000000000000000000000000068 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000000F8 +:1038D000000002012089C0C004A00085012000C0B2 +:1038E000000091A0098209020801C00204044008F6 +:1038F000020104000482044008001001402008A0D6 +:10390000820000C000A0000400000000C005A082EA +:1039100004400201000000200090000000000000B0 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:10395000000000000000000007000000000000E080 +:1039600007000000000000E00700000A000000005F +:1039700000000000000000000700500000000000F0 +:1039800007000000000000000000840000000000AC +:103990000000000000210000000000000000000006 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000000F7 +:1039D000000000000000F8F8282800F000F00000C7 +:1039E000000000C0C3FC80EB83EBC0EAFFFF282887 +:1039F000D727F08D007DFAFCF0FC3CFC00F00C00B9 +:103A000000AA0000000000000000F0A53C690000D2 +:103A10008D82A5AAC3006CAF00000000000000006A +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A5000000000000000000028FF28283C3CAAAA23 +:103A60000000000082C082FC80288328C0EA00AAEF +:103A7000AAAA55A5FF820F72AA3C003CAAFA00F040 +:103A8000AC0000AA00000000000000000F0FC3C33C +:103A900000008D7DA555FF3C509300000000000004 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD000000000000000000000008A820800FCF0E6 +:103AE0007C500F000F004D4D4D4D3F0F3C00FF75BA +:103AF000FF20000000005603FCFC0F000F0055558E +:103B00000000A5A0A5003F0F3C0000000000FDFC48 +:103B10007D3C0000000000000F33CCF000000000EE +:103B2000A5B15541000000000000000000000000A9 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B5000000000000000000000000000BABEFBFFF3 +:103B6000BCA03C00FF2D002D03C303007F4F7D410F +:103B70007575202000000000AAFF00003C3C555550 +:103B8000FD5DFC0C252025207F4F7D4100000000BD +:103B9000D5C055000000000000000A36C9F500003D +:103BA0000000A5B1AABE0000000000000000000057 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD0000000000000000000000000000000006184 +:103BE000000E009D00000061000F00090000006150 +:103BF000400F00010001A0610006000D00050061FA +:103C0000500E001D000000613E0E000D000100611D +:103C10000006000D0000000000610006000D00011C +:103C200000610006000D000000610006000D0000AC +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C6000000000002828D7271F1FBF1FC0B2C0B206 +:103C70000CFF0C550C0FF0F000000000303030FF4E +:103C8000FF05FF3D003F556A00000000A903A9A9F8 +:103C900000000000143C1B3300000000000055FF32 +:103CA0009A30000000002C2CD32C00000000A0E370 +:103CB000FFFF000000000000000000000000000006 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE000000000000000AAAA55A51414BE1400B2DA +:103CF000C3B20C000C5500030000000000003A3A6B +:103D00003AFF0505053D003FFFC00000000059F3E4 +:103D1000595900000000EBC31B33000000000000F5 +:103D20000000CFCF000000002C2CD3D300000000F7 +:103D3000A0E3A0A0000000000000000000000000C0 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D700003AB3FBF1F1FBF1FAAAEABAF5D0CFFAEB3 +:103D800028FF2BFF4EBE4E4100000000CCF096AA4B +:103D9000000000000539C6FA00FF5FA00000000027 +:103DA0000000A0BCA0BC000000000000000000005B +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF000000000AA3CBE1414BE14000C030F5D0C9E +:103E00005D0C28282B2BF000F0FF00000000CCCC2C +:103E10009696000000000F33CCF000C35F9C0000BA +:103E200000000000A0BCE3FF000000000000000054 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E6000400020000408000020000200A00010080C +:103E7000880204800404C00400000402040400005A +:103E800088000200900500102000000000000400DF +:103E900000000400000000000000000020000000FE +:103EA0000001000000000000000000000000000011 +:103EB00000000000040000000000000000000000FE +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE0000000400000002000000040000000000032 +:103EF0000000000000048003000100008001800237 +:103F00000900400000000000000020002000000028 +:103F10000000000000000000000000040040000459 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F5000000000000000000000000200000000005F +:103F600002000000000000000010000082000000BD +:103F700000009000001000200020000000040080DD +:103F8000088001880200000000800000000000009E +:103F90000000000000000010000000000000001001 +:103FA00020100000000000002000000000000000C1 +:103FB000000000000000000082000000000000007F +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000002000000DF +:103FE0000000020000000010001040C000000000AF +:103FF0000004028800100001001100850200000189 +:1040000041200902200300002000040211000900E1 +:104010000200000000040010000000000000021078 +:104020000200040002000000000000000400000084 +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:10405000000000000000000000000200000000005E +:10406000000002000000000000000000002100002D +:104070000000000040110000A00000000110C0007E +:1040800040100000048088004002040000109010DE +:1040900040000202080040098800C0001002000031 +:1040A000000002004000081000004000C000004175 +:1040B000018000000200A000A00000000800C00075 +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000003100400A9 +:104100002100410800200020030041001010411050 +:104110000000830088820400830011000800410130 +:104120000000000080000000830000000800000084 +:104130004100401000008000050000000000000069 +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:1041600000000000000000000000000082000400C9 +:10417000000008000021820008000400C0000400C4 +:1041800008008200C100210000000990A000400248 +:1041900000110020820040111000080008040000F7 +:1041A000400000400041000000000000000000004E +:1041B00000050009000400000000000000000000ED +:1041C00000000000000000000000080000000000E7 +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F0000400000000000000000000100300110097 +:10420000830000000890208840102000100408045B +:1042100040204000410003824002400000A000888E +:1042200010028020002040C00800210020880000EB +:10423000000000002100000000000000000000005D +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000030000005B +:10426000000000000000000000000000000000004E +:104270000000001000000000040004000000900096 +:104280000000090000000800C000100082200800A3 +:10429000000000001000080000000100C000A02085 +:1042A0000011000500100841A000000040001000AF +:1042B00000000000000000000000000000000004FA +:1042C0000880000000000000000000000000000066 +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000880090A6 +:1043000000000008040400020988000200020801FD +:104310001000000008880800800003001000000062 +:1043200005002100008808040500090000000000C5 +:104330002100000008002100080000000800210002 +:104340000500001000000000000000000000000058 +:10435000000000000000000000000000000000005D +:1043600003000000009000000000000000000000BA +:1043700000000000001000000004000088000000A1 +:1043800000008400900040008400400002002000F3 +:1043900002000080C000400040218441A0030000D2 +:1043A00000020000081082004021080040418802FD +:1043B000080090000000820010000800400000008B +:1043C00000020000000000000000000000000000EB +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:104400000000000000000900001000000900110079 +:104410002190410002042100050021201000118498 +:104420000310090500824088040040880000000055 +:1044300010000300200000002100850083002100FF +:10444000000011000000000000000000000000005B +:10445000000000000000000000000000000000005C +:104460000000000000000000000008000000000044 +:10447000000000000000000000000000000000003C +:104480000000000000000000C08200900002101038 +:1044900040012104008200000104832008830002FF +:1044A0000001400082010000000001000000000047 +:1044B00000000000000000000000A0000100020059 +:1044C0008400000000000000000000000000000068 +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:10450000000000000000000000008000008020008B +:1045100000008010030005800000218521A1800299 +:104520000083004011050020001100002000000061 +:104530000000000000000000000000004000020039 +:1045400080000000000000000000000000000000EB +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000418010401A +:104590001091000090002111089085C0C080030098 +:1045A0000580408340008500050003002080210035 +:1045B00002002108000000008000800000000000D0 +:1045C00000008000000080000000800080000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000002A8 +:1046100000010191000010849109900208890904A9 +:104620004000A10490A190000400C0008500010892 +:10463000010001000101040040000200C000000070 +:1046400082000800400004000400C0008400C0088C +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000101000A10090C00340080020908200A1EB +:1046A000880101000100C0010000010000010001BB +:1046B00000010001000100000000000000000000F7 +:1046C00000000008002000030111000000000000AD +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:1047100000000010002000830011800500028008C6 +:1047200000A00021020810108009000302054120AA +:10473000004100020008001000040000000000001A +:104740000000000000050089008504C10000000091 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:1047900000000000100091200000C04041000420F3 +:1047A000888002009000050002004008000300001D +:1047B0000080004002000210030040400000008022 +:1047C0000000000000000005008000000000000064 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:1048100000000000000002009100C00091019140E2 +:10482000090809C0880010904082A1C08201009050 +:10483000009000080000014001010100000000009C +:104840000004009000000000000000200082000032 +:10485000000000A000A00000000000000000000018 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000E007006000D1 +:1048A000000000E00700000600000000000000110A +:1048B00000000000000000000000000000000000F8 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:1049100000000000000000000000000000007373B1 +:104920004040F078F67E202CE3EF9898981800002D +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:10495000FC0C03F300000000000000000000000059 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000116 +:1049A00073704340F0789018202CE3EF9898981893 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000009A6A03F300000000000000000000DD +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000000016 +:104AA0000606060600000000FF0FFF0FCFCFC0C0B4 +:104AB0009D009D9DF690CAAC00000000F606FE3EEB +:104AC00000000000000000000000000000FC9965EC +:104AD0000000000000000167FFFF00000000000F61 +:104AE000DBD4000000000000000000000000000017 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 +:104B10000000000000000000000000000000000095 +:104B2000000008896EEF00000000F000F000FF6652 +:104B300099009D000000F690096F00000000060635 +:104B40003E3E00000000000000000000000000FCED +:104B5000FF03000000000000016701670000000083 +:104B600000FFDB2400000000000000000000000047 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B90000000000000000000000000000000000015 +:104BA000000000000061000D0001000000610E0B1C +:104BB0000009000000614006000D000000610006D1 +:104BC000000D000100610006000D00000000000063 +:104BD00000000005000000610006000D000000005C +:104BE00000000000000500000000000000000000C0 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000000000000094 +:104C20000000000000003C00D71400C033F300FF78 +:104C3000555500F3FFF35D085D08FCA0FCAF0000D4 +:104C400000003C3CC333FAFDFAFDFFFFFF0000000B +:104C50000000000000000000000000000AAAC9696E +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA00000000000000000003C00D71400C033F3F7 +:104CB000C3C30F0F0030FF30555500000CA00CAFE0 +:104CC000000000001414EB1BFA55FAFF0303FFFF6A +:104CD00000000000000000000000000000000AAA20 +:104CE000F55500000000000000000000000000007A +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000242E31 +:104D3000242E0000FFFF3C0FFFFF04040004733328 +:104D40007F3F0F3C5A690F1FAFBF0000000000AA51 +:104D500000AA0000000000000000000000000000A9 +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000003 +:104DB000242E242E0000FFFF3C0F00000000000402 +:104DC00000000000F0C3F0C30515A5B50000000009 +:104DD0002F2F070700000000000000000000000067 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000200072 +:104E2000C0800000880489808800008000000000A5 +:104E30009000000040000080208002840500008473 +:104E4000000004800084840000850100C000000090 +:104E500000800200000204000000000000000003C7 +:104E600000008400000300100000A000A00000105B +:104E7000000000000100000000000000000000042D +:104E80000000200000000000000000000000000002 +:104E90000000000000000000000000000000000012 +:104EA00021002020000421002008410200200000F1 +:104EB0004090009000908000000400080020C00096 +:104EC00000094000800400090000002004000004E4 +:104ED00000000020000000050004000000040000A5 +:104EE00000000000000000000001000000000000C1 +:104EF0000001000000C020000004000200000000CB +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000000000000000091 +:104F2000000200050002000802000200000000006C +:104F30000209000002002040000002000000A00260 +:104F400084A00000000400A00000000000800020F9 +:104F500001A108000000010000000080080000809E +:104F6000000400000000008000800000000000003D +:104F70000000000002000000040000040000000027 +:104F80000000000000000000080000000200000017 +:104F9000000000000080008000000200000000000F +:104FA00000000000000000110088000841C0000857 +:104FB0000310200800080404008400880008000092 +:104FC0000009054100000001000500082000002044 +:104FD0004000100200040000400000000004000037 +:104FE00000200001000000000020000400820000FA +:104FF0000000000000000000000820000001000088 +:1050000000000000000000000000000000000000A0 +:105010000000020002000004000400000000000084 +:10502000000000000200002100000000001000004D +:105030000020844084100021840084000000C0000F +:1050400084008200900000410000C008A10020827E +:10505000A08004A0C12082002000A00090000000D9 +:10506000012008008400000000008200000000040D +:1050700000008400000000000008000000000000A4 +:105080000000000000000000000000000000000020 +:1050900000000800000000000000C0004000000008 +:1050A000C00000000000000000000000000040827E +:1050B000000000002100410000000300100000007B +:1050C000008440000088098400840008000120005A +:1050D0000020002080030401000080080000000080 +:1050E00000000401000000000000000000000800B3 +:1050F00000010000000000000000000000000000AF +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:1051200000000000000000000000000082000000FD +:10513000000008802000A00000000800C000082037 +:1051400084008200000082094000100082001002EA +:105150000800400040004000822040080800C000D5 +:1051600000020005010400000000000000030089A7 +:1051700000080002000000000000000000800000A5 +:10518000840000000800C0000000A000000008002B +:10519000820000008200000000000000000000000B +:1051A00000040004000000000000000000002100D6 +:1051B00000000800000408040000030000A003C071 +:1051C00021904000008211000400000080000000D7 +:1051D000800000000000C088A100039000C14000D2 +:1051E000000200A10300040104880300000000A0E5 +:1051F0000002210100000000210000200000000446 +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:1052200000000001000100000000000000009000EC +:1052300004000000000000080000418200008821F6 +:10524000C0000000080008058800A0200900848331 +:105250002180008000051180080000021120C1415A +:10526000010082008200000004008203820000002E +:1052700000048404000000001004A00000000840A6 +:1052800000040004200400000000000000000000F2 +:10529000000000000000000010000800080082006C +:1052A00001002000000000000000000000000000DD +:1052B000000080000000000000010000C003008822 +:1052C000004020000500000005A02000410102A0D0 +:1052D0000810A00441040004042010000001A001F3 +:1052E000400020000088080200008000080008003C +:1052F00000000001000100000000000000000000AC +:10530000000000010001800100000000000000001A +:10531000000000000000000000000000000000008D +:1053200000002000800000000000000000000000DD +:1053300000000000A000100000000004400008A0D1 +:10534000004100000800A0000000880000400800A4 +:1053500084002041820004000011A00240218280CC +:1053600000040000010400000004840008000400A0 +:10537000100000000004048000090002080000037F +:1053800000020000000801000000200000000000F2 +:10539000000000000000000000000000100082007B +:1053A00010000000000000000000000000000000ED +:1053B00000000000000000000800000000052004BC +:1053C0002003000000A00084008800000408038877 +:1053D0000020200041020800800841000001000474 +:1053E0000020000000000408000000000000000091 +:1053F0008000030000000003C0081000000000004F +:1054000000000000000021002000000080000000DB +:10541000000000000200000000000000000000008A +:10542000000000000000000000000000000000007C +:1054300000000000000000080090000000080001CB +:1054400000000000020001000000100000000190B8 +:105450008204820200A12001820184010400101054 +:105460000591849104A0000584904083002108A147 +:105470008201A10388000000080390050800820053 +:105480000200000000009000010089008800000177 +:10549000000000000000000000000000000000000C +:1054A00000000000000000000201000004000000F5 +:1054B00000000000000000000000008000000080EC +:1054C0000011001005208004100021008000000061 +:1054D00011090484C041001003410303C0100040BF +:1054E00008038482C0110009050840858503000473 +:1054F0000010082010A00003000000C191A0A0052A +:105500008005800000000000000011050821200334 +:105510000003000000000000000000000000000088 +:105520000000000000000000000080102005C00501 +:10553000002000000000000000000000000000004B +:1055400000002000050011004100000000000000E4 +:105550000000910021859180C000400021090500D4 +:10556000410320808410110083A102000500050082 +:10557000418411000203200000030000C0801110CC +:105580008200052080000000800080001080410023 +:1055900008110303000000000000000000000000EC +:1055A000000000000000000000000000A08090004B +:1055B00005002003000000000000000000000000C3 +:1055C00000000000000000000000010000000000DA +:1055D00000000000080004100284910200A00000F6 +:1055E00001A0012111102001C10491091100040042 +:1055F000C100A1A10490832189A04041000088023C +:1056000021891188080102000800A0001000011083 +:105610000000000101010000000000000000000087 +:105620000000000000000000000000000000918861 +:1056300003008200000000000000000000000200E3 +:1056400000000000000000000010049000040000B2 +:10565000000000010001A00800040090882100045F +:10566000010402910011C020000400918989000109 +:1056700001010001010140A10121900100A10000F0 +:1056800020A1012001080011000800080008000204 +:105690000000000001010101000000000000000006 +:1056A00000000000000000000000000000000000FA +:1056B0000002010904400002000000000000000098 +:1056C000000000000000000000001180C180000008 +:1056D00000040005002000200089004000830041F4 +:1056E00000051000859000020004090504851140A2 +:1056F000002003400305110480100202A021009045 +:10570000000000100208204000410080000000005E +:1057100000800005080803051108000000000000D3 +:105720000000000000000000000000000000000079 +:1057300000000085090883A000A000000000000010 +:105740000000090011080900030000880041000062 +:105750000004000000000000000000000040000005 +:105760000000418010082000C040C18082C00200BB +:1057700002094002118800002140030011888900BD +:10578000890000008300888482002020000000003F +:105790000000000005800811030003110000000054 +:1057A00000000000000000000000000000000000F9 +:1057B0000000000041C0030020004008000000007D +:1057C0000000000000000000000000000089000050 +:1057D000000000000000000000000000820008043B +:1057E000A0888800A1409100A0000300910411103E +:1057F000C1A0110000A10120008201018840824067 +:10580000A0089000000004820209A110820100009B +:1058100000080088000000040001000001010000F1 +:105820000000000000000000000000000000000078 +:1058300000000000000000040008009000010000CB +:105840000000000000000000000007000000000051 +:1058500000E0070000000000000000000000000061 +:1058600000E007000000000000E00700000000006A +:1058700000E007000000000000E00700000000005A +:1058800000E0070000000000000000E0070000004A +:105890000000000000000000000000E00000000028 +:1058A00000000000000000000000000000000000F8 +:1058B0000000000000000000000000E00000000008 +:1058C00000000000000000000000000000000000D8 +:1058D00000000000000F0FFF0000000000000000AB +:1058E00000F500C30033C0F33A0A3F0FB0B3B3B3BF +:1058F000BAA0FBA03A3FF0F000000000000000005A +:105900000000FFFF2F2F2020000041F0FFF0FFF1EB +:10591000000100000000D38383830000000000002A +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000463 +:105940000105000000000000000000000000000051 +:10595000000000000000000F00F000000000000048 +:105960000000FFF5FFC30033C0F330003F0F80831A +:10597000808010A051A03035000000000000000021 +:105980000000F4F0F4F0EFEFE0E0000000F0FFF0D2 +:10599000FFFB000B00000000D3D383D30000000006 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C0000004010500000000000000003C003C0055 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000AAAA00FF4706470600000000CA +:1059F000000000009E9E9E1C5F0A5F0A0F00FC0CC8 +:105A000000000000FFFFF0F0C3C303F30000FFFF3E +:105A1000000055C3F5C3000000000FFF02F20000B4 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000FF3C1B +:105A5000C300000000000000000000000000000083 +:105A6000000000000000C0C000FFC7864504000021 +:105A700000000000000008088A08AA8228000F0021 +:105A8000FC0CD0C010000000F0F0AAAA03F3000044 +:105A900000FF00FF55C305C3000000000DFD00F02E +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC000000000002A202A20000000000000000042 +:105AD0000061000E000D00000060000B000D0000D2 +:105AE00000610006000D00000061300B000D000099 +:105AF00000600009000100000061000F00010000CB +:105B00000061000D0009000000610E09000900009D +:105B1000000000210E09001000000000000000003D +:105B20000000006100010001000000000000000012 +:105B30000000000000000000000000000000000065 +:105B400000000061000100110001000000000000E1 +:105B50000000000000C00000000000000000000085 +:105B60000000000000003065F3A600000000003CCB +:105B70005F6305353535BEAABEFF0C550CFF101509 +:105B8000FFFF3C3C3C3CF8F828285F5F0A0A3CFFDA +:105B90003DFF00000C550C550FFF3A3A0000000085 +:105BA0000000000005040F0C8082A0AA0000000085 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000FFFF5F55FAFBFFFF0000000030 +:105BD00000000000000000C0000000000000000005 +:105BE0000000000000000000CFCF0C0C00000000FF +:105BF00000FF5FA0F5353535140014550C550C0029 +:105C0000101510153C3CFF3C28FF2828FFD7280022 +:105C100000C301C30000FF55005500F03A3A0000F0 +:105C20000000000000005514FF3CC0C3F0FF00005E +:105C30000000000000000000000000000000000064 +:105C4000000000000000FFFF7F7DFAFBFAFB000070 +:105C500000000000000000000000000000009E9E08 +:105C60009E1C7DAA505000000000000000000F00A4 +:105C70003C0F03000000FF53FF5555FFC3F0FFC763 +:105C800005C73C7D7C7CFFC7FF053A3A303F3C3C72 +:105C90007F75F0FCF0FC00003F3F7D41F0F0003CE0 +:105CA0000000000000000000CF45CF45A0AA20283A +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000007F5F7F5FF0FFFAFF30 +:105CD00000000000000000000000000000000000C4 +:105CE000088A08082800505000000000000000004A +:105CF0000F003C0F03000000005300555500C3F097 +:105D0000FF0505050055505005C705050A0A000F97 +:105D10003C3C2A20000C000C000003037D41F0F005 +:105D2000AAAA00000000000000000000CF45F0FF1C +:105D3000303C0000000000000000000000000000F7 +:105D400000000000000000000000FFFF7F5FFCFF7C +:105D5000FEFF00000000000000002008C00000005E +:105D600020000000050010008900890000000000EC +:105D70008400000088204100020000002000000094 +:105D800002000000000000048800820040000000C3 +:105D9000200000800000000000040003000000005C +:105DA00000000000002100000411A000000000001D +:105DB000000088000000000000000000000000005B +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000004020008000040020000200AD +:105DF00010040900000000010404000000A0C1001C +:105E00000900000000000400400141000000000003 +:105E1000000000000004000000000001000000007D +:105E200000000000000000000090000000000000E2 +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E6000020000000000010000020000008090809D +:105E70000000000000000000020484000000000098 +:105E80000204002000890000000000000040000023 +:105E90000000000000800000000000000000000082 +:105EA000000400400000000000A00080000000008E +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000020000000000D0 +:105ED00000000000000000000000000000000200C0 +:105EE00000100004001000084010204100040020B1 +:105EF00000040040000000080000098500000000C8 +:105F000000040001008504200008001000000400C7 +:105F100000000000000000020088000000000000F7 +:105F2000000000010000000000000021002000002F +:105F3000000000000040020000000000000000001F +:105F40000000000000000000000000000000000051 +:105F5000000000000000000000000000000002003F +:105F600000000041000000030000000800082000BD +:105F700000100000000004000000A0009000840059 +:105F8000842182800010A0000000000000080000B2 +:105F90000021000000000041820000000000840099 +:105FA00000A00000840009000000000000000000C4 +:105FB00000800880000000000000000000000000D9 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000000000000C1 +:105FE000000000000400410040000900000004001F +:105FF00090000800098221000000100041200000EC +:106000000000030003100000000008000000000072 +:10601000000003A0214005000300038441000500A7 +:106020000300002100002100020000000000000029 +:10603000000003200020000000000000000000001D +:106040000000000000000000000000000000000050 +:10605000050008000800000000000000000000002B +:106060000000000000008200C00002008400C000A8 +:10607000820005118280100008000840C040A00086 +:106080000000840008840000080040008400000034 +:10609000C0008400080000008200004104000000ED +:1060A000100010000800000000000080000009003F +:1060B00005000500000005000000000000000000D1 +:1060C00000000000000000000000000000000000D0 +:1060D0000000000000400000000000000040000040 +:1060E000000000000000000000020010004000005E +:1060F000000002004000090200000300040000004C +:1061000003004100040003054100400200A000001C +:1061100000000004089000A00000002009C0000456 +:1061200041200000118800000000008840040000A9 +:1061300020000400040003000400410041000400AA +:10614000110000000000000000000000000000003E +:10615000000005000000000000000000000000003A +:10616000000000000000000000000200080008001D +:106170000000080020418400000088001000820018 +:106180008400000004008400822100000800040054 +:10619000000000000000001000050800A000000042 +:1061A0000000000482000800C000000000000000A1 +:1061B00020000000004182008200008000000000FA +:1061C000000000000000900000000000000000003F +:1061D00000000000000000000000000000000000BF +:1061E000000000000000000000000000800000002F +:1061F0008000000000208008000000000000000077 +:106200000000080008088000080005A008008500BC +:106210008000000003C02100000000000000000812 +:1062200000000084000508C0218803000000410030 +:1062300000908090030000000000100000200090FB +:106240000000009008900000000000000000000026 +:1062500000000000000000000000000000000990A5 +:106260000000059008000000000000000000000091 +:106270000000020800000000100084000000080078 +:10628000C040000000000080820084808300000085 +:10629000820000210000C041040020008841020467 +:1062A00000000400002004000400000000200000A2 +:1062B0000200A000400020000100008000800000DB +:1062C00000090000000000000000000000000000C5 +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F0000000000003000000000400000000000295 +:106300000000400200900000000240000302080468 +:10631000028820000000030400840820832000007D +:106320000000210200C00002000000000000030184 +:106330000000110000000090C00004004120402037 +:106340000000080008020500008803400300110057 +:1063500003004100000000000000050005000000EF +:10636000000000000000000000000000000000002D +:106370000000820000000000C0000001A0018400B5 +:1063800000000001100000010001A00141832190E4 +:106390000283900000040002C0C000000000000062 +:1063A000000000000000040000000001890100005E +:1063B0000000000001010101100000004004004045 +:1063C0000008088800000000000000000000000035 +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F00000000000000000000000800000410321B8 +:10640000A00500200011800205030040004141402A +:106410000309800800000000080080000000000060 +:106420002000000000000000800000000511820232 +:1064300040200000000011020320884100208080DD +:10644000000000000000000000000000000000004C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000080000000000000009C +:106480000900040083840000000000000000008078 +:10649000C10020A0914100808003804080880000DE +:1064A00003001100040000000000000000000000D4 +:1064B0000000000000800000028041002011202028 +:1064C0008000004000880000000000000000000084 +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F0000000000000000000000002000400900006 +:106500000084040008009102000000000000000068 +:10651000A040028889A00301004010018800049176 +:106520000000010001000020000000000000000049 +:10653000000000000000008200002140840084016F +:1065400084200800400008840808000000000000C3 +:10655000000000000000000000000000000000003B +:10656000000000000000000000000000000000002B +:1065700000000000000000000000002000A000401B +:1065800001C0000101010100010100000100000043 +:10659000000000020182898900A0020200A000021E +:1065A00000A0000000000000000000010000000149 +:1065B00000000001000100000101000000010100D5 +:1065C00000000001C004000400900402000000006C +:1065D00000000000000000000000000000000000BB +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:10660000000021800020020221054005000040001A +:106610004100000000A01183912103408080008090 +:106620000000000000000000000000000020001139 +:1066300000020005000421030008114100000002CF +:1066400011032020001180000080000080800000E5 +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:106670000000000000000000000000000000000416 +:10668000008000800000200040A0052103020008D7 +:10669000000000000000A0804005400010008900BC +:1066A00011050480910000000000000000000000BF +:1066B0000000000000000004004000000000000096 +:1066C00002C0201141000311800000400080000042 +:1066D00000000000000000000000000000000000BA +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000002000100000010401080101000049 +:10671000000000000000000040C02090C088C000C1 +:10672000C000C1A003040800000400000000000035 +:106730000000000000000000000100000000000058 +:106740000000010200C10004010102000810400421 +:1067500090000000000000000000000000000000A9 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:1067800000000000000000000021000000E0070001 +:106790000000000000E000000000000000E0070032 +:1067A0004212000000E007000006000000E00000C8 +:1067B00000000000000000000000004100E00700B1 +:1067C00000000000000000E00000000000000000E9 +:1067D000070088000000000000000000000000002A +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000F0C0F0E00000000008 +:106810000000000000000000000000006C606C6FD1 +:10682000BD9924003F3F3F30FFFF00000000000003 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000FF7ECB +:10685000FF3CFF7EFFFE0000000000000000000083 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000C000E0000068 +:1068900000000000000000000000000000006C602C +:1068A0006C6FF0F0F0F030303F30F0F2F0F20000BA +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D000FFFEFFFCFF66FFF6000000000000000066 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000060FF2 +:10699000F6FF00000000006096F600000000000016 +:1069A00000003C0F3C0F66660CCF00FF00FF0F0F8E +:1069B000666600000000000000000000000000000B +:1069C00000000000000000000000000000000000C7 +:1069D000A930A53C7F7FFF7FF6FFFEFF000000008F +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000600F6F000000000006096F6000000009E +:106A2000000000003C0F3C0F666600C30C0C0C0C11 +:106A300000FF66660000000000000000000000008B +:106A40000000000000000000000000000000000046 +:106A50000000CF56C35A3F3FFF3F66FF7EFF000056 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A90000000009000000061000D00050000006192 +:106AA0000003000D000000610E0D00090000A06150 +:106AB000000D000D000000610007000500000061EE +:106AC0000006000D00000061003B000900A000006E +:106AD000006100010001000100000008000000004A +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000557F5575FFEFBEAE7D +:106B200000000000000000007F2F702000FFF0F048 +:106B30000C0C3535000000000000000000000000D3 +:106B40000000000001000000000000003C3C30F3A9 +:106B5000000005040F0C00E0E0E000000000000071 +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000003F0030002066 +:106BA00082A20000000000000000FFAF500014FFB0 +:106BB000F0F00C0CF50500000000000000000000E3 +:106BC00000000000000001000000000000000000C4 +:106BD000C0C000005514FF3C00EBEBEB00000000D0 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000000000000000000000000095 +:106C00000000000000000000000000000000000084 +:106C1000000000000000000000000000C7C7C7041B +:106C20000000F0F0BEA83E28000000005C5C00F010 +:106C300000F00FFF00000000000000000000000056 +:106C4000000000FF00000000000000005FAA0A0032 +:106C50000000000000005541FFC3E0EBE0EB000046 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000404EC +:106CA000C70400050A0F96801600000000005C5C17 +:106CB0000FFF00F000F000000000000000000000E6 +:106CC000000000FFF0F000000000000000005FAADC +:106CD0000A0000000000000005010F03E0EB0000C7 +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D100000000000000000008400840000008404E3 +:106D200020000000400000000000010020081004C6 +:106D300004802080C0200400008400A00000000027 +:106D40000080008020100880000000000400000087 +:106D5000000000008800200200032004040000005E +:106D600000100010000000100000200000000000D3 +:106D700000000000000000000020000000000000F3 +:106D800000020000000000000002000000000000FF +:106D9000000000000000000000004040000009006A +:106DA000000000000000000000000000400000059E +:106DB0008001400440202001000800030009000079 +:106DC0000000000200200001890200000084A020D1 +:106DD000000004A0002000000009000080018000E5 +:106DE0000000000100010000000100008000000020 +:106DF000000000000500000041000000000000004D +:106E00000000000100000000000000A100000000E0 +:106E10000000000000000000000000000000000072 +:106E2000001000000200000002000200000000004C +:106E300082000000000000000100000000020000CD +:106E4000000000200000008000050000010000801C +:106E50000000008000000005020004800000000027 +:106E600002002000000500000000000000000000FB +:106E7000020000000000042002000000008000006A +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000040004000000EA +:106EA000008400080088000000080010001040085E +:106EB0000010050800000000004020000000000154 +:106EC000040000840001000000200000001020C029 +:106ED00000200084000400000000000000100000FA +:106EE0000000000080000000000000000000000022 +:106EF00000000000000000008001000000000020F1 +:106F00000000000000000000000000000000000081 +:106F10000000000000C000C00000000000000000F1 +:106F2000400000008200100000000000000000008F +:106F3000000088089000900800000800C0000000D1 +:106F400000000000820000858400000000000000B6 +:106F5000004100008220000082000841A021820937 +:106F60000000C0000020C00484000000A021C02157 +:106F7000C00500000080A0080008000000200020DC +:106F80000000000000000000000000000000000001 +:106F9000000000000000820000000000000000006F +:106FA000000000000000030021A00000000000001D +:106FB00008004100410010000500000041000000F1 +:106FC0001000000000000300050400002100000084 +:106FD000000000001000050100000800000008008B +:106FE000210000000000000100010000000000007E +:106FF0000800000000000010000000000000000178 +:107000000001000008000300000000000000000074 +:10701000030000000000000000000000000000006D +:1070200000000000000082098200080088000011B2 +:10703000A0000000000982008208404008000420EF +:107040008300A14000114002824000004000840003 +:10705000840082002000A1048200C0000000A00083 +:107060000800A0000000C00000040020C0110000C3 +:10707000C00000000800820020000800000000009E +:1070800000090800004082000800C0000000000065 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B000039000000008000000000911000011907A +:1070C000C1010400200000000001020100000000D6 +:1070D000100200C00500000004850000000000044C +:1070E0000004008800820000000000000000000092 +:1070F00000004100000000000200800000000000CD +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000008000800000040002000100084004B +:10714000000021004004A000080008000000000426 +:107150000800000000418200000004200420000517 +:1071600082008200820582000000C000A020202151 +:1071700084000080A100C0008200A1000000200067 +:107180002100040082800000C00000000000C04018 +:10719000C0000000000082000000000000000100AC +:1071A00001000000000000000000000000001000CE +:1071B000000000000000000000008000000000004F +:1071C0000300008284040011001000000000000091 +:1071D00008C10000000000000000000080018001E4 +:1071E000000000000000000000900000000003010B +:1071F00089000000000240000000000020000000A4 +:10720000C10088008000002000000800000000008D +:107210000001000000000000000000000800000065 +:1072200040004000000000000000000000000000DE +:107230008200000000008200820000004000000088 +:1072400000008200820490800400A0000000C08042 +:10725000018000800000A0008841202000801020D4 +:10726000830009820000A041040004080000C0005F +:10727000C0000004C010C005A00082008200C0044D +:10728000C002008090040400A00008000002C000BA +:10729000A000002000000000A0000000000000008E +:1072A00000000000000400000000000000000000DA +:1072B000000000000000000000000000000091003D +:1072C0004000000000004191000400044140000023 +:1072D00000204010002000000300000000002002F9 +:1072E0000001200210090000000000000000000062 +:1072F000000000002001200000000000000000004D +:107300000001000000040001800000900000000067 +:107310000040000000000000000000000500000028 +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:107340000001000189010100A0A185012082000146 +:1073500001A1400884A082820000900902A0C1001F +:10736000A00001000204002104000400400082008B +:10737000000002839091A00102A0020282A00002FC +:10738000A0820005000503C00000919001409020FC +:10739000A0A000000000020000000000000040006B +:1073A000000000000000400000000000000000009D +:1073B00000000000000000000000000000000000CD +:1073C0000000004110104105090805118505412004 +:1073D000001011C0852140058040031088A100A045 +:1073E000030800040540C08300040300820000007D +:1073F000800000008002C12140030000808300095A +:1074000000830080009120A0820300091000038007 +:107410000000800000000500800000000000030064 +:10742000000000000000400000000000000000001C +:10743000000000000000000000000000000000004C +:1074400000000000208005001005108811800883CE +:107450002008830320000200909105411000A090B5 +:1074600010809108C10040C1880340411000C00055 +:10747000C100820000009180C0208511408580807D +:10748000000580808003A080C10005110541000037 +:107490008003800300804000050503802000050074 +:1074A000050003002000020005004000000000006D +:1074B00000000000000000000000000000000000CC +:1074C00000000000000001400000010000890210DF +:1074D000A040C004050183A04100A109820191825E +:1074E00010059140820010848805028805019100F2 +:1074F0000400A0000800000009900240A19102A031 +:107500000202A00002020401054002000001400145 +:10751000820020000820400200000000000201005C +:107520000000000000000100010000000000000059 +:10753000000000000000000000000000000000004B +:107540000000000000000000000000010000000139 +:1075500040880108909000A1042100000021101132 +:1075600040410005C103000540900004910300A0C4 +:1075700000910040001100100000008400049041C0 +:10758000002104A000020082C0A00201010100004D +:10759000830182A0002000211004000000000401EB +:1075A00000000001000000010000000000000001D8 +:1075B00000000000000000000000000000000000CB +:1075C0000000000000000000000000090002400868 +:1075D000000580201120C1100091800304030402E3 +:1075E00080C18010024010A10008800402C0C04089 +:1075F00000850010000500A10082000000404083CB +:1076000005900010800005804180008080401103BB +:10761000050511200005008500118080000500414E +:107620008021002000200005002100090003000542 +:107630000004000000000000000000000000000046 +:1076400000000000000000000000000041210821AF +:107650000821401190102040209103112102824006 +:107660004180082020C0104041008241410041403B +:107670008200110300800000000000410000414131 +:1076800003C0020008000020838503804000400200 +:10769000209105800311000200020000000080001C +:1076A0000040000000030080000000000040008057 +:1076B00000000000000400000000000000000000C6 +:1076C00000000000000000000000000000000109B0 +:1076D0000100000101058591A0820491C001090209 +:1076E0009121A0080101A010832004000801C10419 +:1076F0009090A182C00000020040008200010000C2 +:1077000008830804832085004001A008C10283008B +:1077100001C10005004001018201A021208220005A +:1077200040204000A0000001000200000000000016 +:107730000002000000000001000000000000000046 +:107740000000000000000000000000000000000039 +:10775000000000E000000081000000E007000000E1 +:10776000000000E007000006000000000700001114 +:10777000000000E0070041060000000000000011CA +:107780000000000000E00700820000000000000090 +:107790000000000000E000000006000000000700FC +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 +:1077D0000000000000000000000014BE14BE7F2F57 +:1077E000702000AAF0F0003CFF3CFF3CFF3CF3F0AF +:1077F0000F03EBAAF0F04FEF40E000000000FFFFA6 +:1078000000000000F0F1FFFF0000070278783C3C28 +:10781000FF3D003D0000000000000000FEFFFEFEF6 +:10782000FFFFFFFF00550000000000000000000007 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:1078500000000000000000000000000014BE15BF82 +:107860007F2F702000AAF0F0003C003C0A3C003C56 +:10787000CF3303CCAAAAF0F04FEF40E000000000A5 +:10788000F7C73404000000010F0FFFFFF7F2FF00FD +:10789000FF00FF3800380000000000000000BEFFBD +:1078A000BEBE0CFFAEFF5050000000000000000004 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 +:1078D0000000000000000000000000000000FFFFAA +:1078E000F0F070F240C2CFCF0C8E0C0CFF00FF0006 +:1078F000FF00002A0002CFCFCFCF00C30A0A00004A +:10790000000055FF40EA00003C3C00FF0CFC0CFC72 +:10791000AAAAA3A3E8AAE8AA0000000F8282808096 +:10792000FF5F5F5FFFFFDFD7000000000000000087 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 +:107950000000000000000000000000000000000027 +:107960000000F0F070F27CFECFCF0C0C0E0EFF0A80 +:10797000F0F0F0F0002A0002C0C0C0C0FFC35F5F9B +:107980000000000015BF00AA00003C3C00FF0EFEF6 +:1079900004F4AAAAA0AF28AAEBAA0000005502028C +:1079A0000000FF7F7F7FFFFF5F55000000000000A9 +:1079B00000000000000000000000000000000000C7 +:1079C00000000000000000000000000000000000B7 +:1079D0000000000000000000000000610007000936 +:1079E000000000610E090001000080610009000034 +:1079F000000000610E0E000D000000410E090001A4 +:107A0000000000610006000D0000000000610E0B88 +:107A10000005000000610006000D0000006100018B +:107A2000000100000061000E000D000080610006F2 +:107A3000000D000000610006000D0000006100065E +:107A4000000D000000000000000000000000000029 +:107A50000000000000000000000000000000000026 +:107A6000A0F0F5F005040F0C80A0C0F0AFAA05004F +:107A7000FA0AFCFCC3AAC3F0B2B2F0F055550F0FDE +:107A80005575FF75000000005702FFAA0000FFF5C2 +:107A90003F35D5C180C1A020A02000000000150006 +:107AA0003F00C0C3F0FF0000000000000000000025 +:107AB00000000F00FFF0000000007D287D2800007E +:107AC00000004041404100000000000000000000B4 +:107AD0000000000000000000000000000000503026 +:107AE000F000A0C3F5C35514FF3C82AAC3FF3C3C81 +:107AF0003C3CFA0A0C0CC3C3C3C3FF00FF003C3C70 +:107B0000FF000020AA20000000005500FDA8000092 +:107B100000053035DFCB8ACB0020002000000000BC +:107B200015153F3F40415055000000008083808381 +:107B3000000000001F10BFB00000000075207F2A69 +:107B40000000000000010001000000000000000033 +:107B50000000000000000000000000000000000025 +:107B6000C3FF0F0FAA3C303C4155010528AA20A0B5 +:107B7000FFFF8A0800FFB2B205F505F51C001000F2 +:107B80005F50505082BEB2B200000000FBEB10000C +:107B90000000AF05AA003F303F300000AA0A0000F5 +:107BA0000000D7D0D7D0A0AA2028000000000000F5 +:107BB0000000000000001FFF100000000000FF0098 +:107BC000FF000000000000000000000000000000B6 +:107BD00000000000000000000000000000000000A5 +:107BE000000000000000AA003000C3FF030F3CFFAC +:107BF00030F08A088A0800FF828207F704F4DFFF6A +:107C0000D3FF5C5C5C5C82BE828200000000FFEF00 +:107C100014040000AF05FF55FFF00F000000A000A6 +:107C200000000000D7D00000F0FF303C0000000052 +:107C30000000000000000000DFFFD0000000000096 +:107C4000DFD08F80000000003A003A000000000002 +:107C50000000000020008800200020030400200015 +:107C60004008001020800010008000000000040088 +:107C70000084880000008400201000000000200024 +:107C8000C002880000200000000004000000840002 +:107C900000000000000300020000000000000000DF +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD0000000000000004000400000004040004064 +:107CE000000004400001001000000002000000003D +:107CF00000400911000000402000000100000000C9 +:107D00000940090100A0000100000000000000007F +:107D10000000020000000000000100000000000060 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D5000000000000000000000000009000000001A +:107D600002000000000000400000200000000008A9 +:107D70000080000002802000000000800000000061 +:107D80000000000000800080000008200000008942 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB0000000000000000000000010001000040897 +:107DC00010000000000000000000000000000000A3 +:107DD000020000000000020000000008008800000F +:107DE0000088000000100088200900000008001032 +:107DF000000000100082000880C000080020000081 +:107E00000000410004000020002000000089110053 +:107E100000200000000000000000000000900000B2 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000008000800042 +:107E400000018000000000000000000000000000B1 +:107E50000000000000000000000000000000000022 +:107E600010000000000300000200000000004000BD +:107E70000000000000800000000000000000000082 +:107E800082000000000000000000008000000000F0 +:107E900000000000000008050000080000000000CD +:107EA0000000A00000000000000008000800000022 +:107EB00000000000000000000000000000000000C2 +:107EC00000000100000000000000000000000000B1 +:107ED00000000000000000000000000000000000A2 +:107EE000000800000000000000000000090003007E +:107EF0004100080003000802000009040800100007 +:107F000003000582030000000000080010200000AC +:107F1000000000000000000021000000030000003D +:107F20000000000000000000000008002100000028 +:107F300000000000210021000200210000002100BB +:107F4000000000000400000000000000000000002D +:107F50000000000000000000000000000000000021 +:107F6000040000008200C0000000000082411000F8 +:107F700000004000820008000400400090801000D3 +:107F8000080040000000080000000080820084001B +:107F90000800000000004000000000000000000099 +:107FA00000000000000000080000000000000000C9 +:107FB00008000000000000000800000000000000B1 +:107FC000000001000000000001800000000000002F +:107FD00000000000000000000000000000000000A1 +:107FE000000000000000000003000000000003008B +:107FF000034000000010000000100000C100400419 +:10800000800000000000400000000000002000840C +:1080100000000000000000008000000000000000E0 +:10802000000000000000000000010000000000004F +:108030000000000000000040000000000000000000 +:1080400000000000020000000084020400000000A4 +:10805000000000000000000000040000000000001C +:108060000000000000000800880000000000000080 +:108070000800000004000800820010050000040051 +:1080800000400000000005000000400082000003E6 +:108090000020000000100080008000800000000030 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C0000000000090000000000000000020000000 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F000000000000000A100080000888088210026 +:1081000088840801000000888400000080000804C2 +:1081100040000001050000000308001003200010CB +:1081200000000000030000000388080005000300B1 +:10813000000000000000000000000000000000003F +:108140000000080000000300000000000000000123 +:10815000000000000000000000000000000000001F +:108160000000000000000000000008000000000007 +:1081700008000000000001008200400020002000F4 +:108180000011002000040090020082A04000400086 +:108190000009042000A00020011088000004000055 +:1081A0000000000082000400000000000040080001 +:1081B000000000000000080008000000400000006F +:1081C000880040000000880000000000000000005F +:1081D0000000000000090004000000000000000092 +:1081E000000000000000000000000000000003008C +:1081F000000000000000200402000000080200004F +:108200000084000000010001000440000321090077 +:108210000000000000010021000104000000200017 +:108220000000000000000000000000000000080046 +:1082300000880000000000000000000000000000B6 +:1082400000000000008200000000000000000000AC +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:108270000000000040020082009040900100820057 +:108280000000000040A1019185039000408890000B +:1082900090008220080441409088824000C0A140A4 +:1082A000A00482C0000000000000000000000001E7 +:1082B00000000001000000000000000000000000BD +:1082C00000000000000000000000000000000100AD +:1082D00090000000004000000000000000000000CE +:1082E000000000000000000000000000000000008E +:1082F000000000000000008000800000000010006E +:1083000000000000000080C12111A089000380004E +:1083100080000000000083800300008080000000D7 +:1083200011000000800000000000000000000000BC +:1083300000410008002000050000000000000000CF +:10834000000000000000000000000000000000002D +:10835000110080210000000000000000000000006B +:10836000000000000000000000000000000000000D +:1083700000000000000000000000008380000000FA +:1083800009002109038008100000A1030591409015 +:108390000000004080208000910020111184218085 +:1083A00000000008808000000000000000000000C5 +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D0000000000500801105000000000000000002 +:1083E000000000000000000000000000000000008D +:1083F0000000000000000000000020000011A0901C +:10840000200400A001000140010188880500828944 +:108410000989900040090804820040004001204082 +:10842000419020004001A0840404000000000000EE +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000801000088000000008B +:10846000000000000000000000000000000000000C +:10847000000000000000000000000000400200902A +:1084800084088888000000000000000000080191B6 +:1084900010C003A082910008009000A0409000024C +:1084A0002020044040400040840390010000000070 +:1084B00000000000000000000100000000000000BB +:1084C00000000000000000000000000000000000AC +:1084D0000000000000000100C088900001000000C2 +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000080807C +:1085000000000000008004000000000000000041A6 +:10851000400840209185001000A1002000898008BB +:1085200000050005802080840004008400410000D4 +:10853000000000000000000000002000000000001B +:10854000000000000000000000000000000000002B +:10855000000000000000000041000083000008004F +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800080008000000000004191824020008308AC +:10859000C105C0002080004100090040000000002B +:1085A000002080C000000010000000050000000056 +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D00000000000000000000000001111000080F9 +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:108600000000400004209040880005C121000100C6 +:108610001001C12020100984C001A00082900482B2 +:10862000C000080820022082000140000082A084CF +:1086300082000000000000000000000000000000B8 +:10864000000000000000000000000000000000002A +:108650000000000000000000000000000001010018 +:1086600000400000000000000000000000000000CA +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900007004200000000E0070000410000000069 +:1086A00007000000000000000700000000000000BC +:1086B00007000000000000000000000000000000B3 +:1086C00000000000000000000000000000000000AA +:1086D000000000000000000000000000000000009A +:1086E00000E0070082000000000000000000000021 +:1086F000000000000000000000000000000000007A +:10870000000000000000D0DF404F193D5B7F66662F +:10871000666600000000FF007C66FE02FE027E7FAF +:1087200018196664FFFD0000006FFF7EFF3CB4B4C3 +:10873000BDBDFC0CFC0C00000000000000000000AF +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:10876000000000000000F0F0000000000000000029 +:1087700000000000000000000000000000000000F9 +:108780000000000000000000D0DFD0DFE6C2A480BF +:10879000665A666600000000000066660000FFFF83 +:1087A0007E7E1818004099D900000060FFFEFFFC93 +:1087B000B4B42424F000F000000000000000000029 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000F0F0000000000000A9 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:1088700000000000000000000000000000000000F8 +:10888000000000000000000000000000CBCB080842 +:10889000E766FF7E00000000000000006666660FCD +:1088A0000000C1010000FFFFF710E700FFFFFFFF1E +:1088B000F6FFFEFF0636F63600FF3C3C00000000E7 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000003C3C0000FFFF0000000012 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000FBCBA1 +:108910003808FF3CC300000000000000000066664D +:10892000660FFFFFFD3DC3C3C3C3FF18EF082F2F22 +:10893000FF2F66FF7EFF6636663660FF3C3C000018 +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 +:1089600000000000000000003C3C0000000000008F +:1089700000000000000000000000000000000000F7 +:1089800000000000000000000000000000000000E7 +:1089900000003000000000000561000E000D000026 +:1089A000106100070001000000610E0E000D0000C4 +:1089B0008061000E000D00000061000E000D00003F +:1089C0000000000000000000000000610006000D33 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000005002A06054C01 +:1089F00000A80000000000000000000000000000CF +:108A00000000000000000000000000000000000066 +:108A1000000000000000000000000F0C5A59000088 +:108A20000000FFF000F0F8FFF8FF00000000100069 +:108A3000510000000000000043400000000000550D +:108A4000F03C0000000000000000000000000000FA +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000FF0007 +:108A7000F0F0000000000000000000000000000016 +:108A800000000000000000000000000000000000E6 +:108A90000000000000000000000000000F0056551C +:108AA00000000000AAAA0000F8FFFFFF000000007D +:108AB0001000510000000000FFFF7F7C000000005C +:108AC000FF55F03C00000000000000000000000026 +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000000000000000000086 +:108AF000FF00F0F000000000000000000000000097 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B2000000000C305C6C3410000000FAAAF00004B +:108B3000000000000000000000000FFF00F0000037 +:108B40000000000000000000000000000000000025 +:108B5000F505CACA00000000000000000000000087 +:108B60000000000000000000000000000000000005 +:108B70000000FF0000FF00000000000000000000F7 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000FF3CAF6CC341C340FFFFFFFF6C +:108BB0000000000000000000000000001FBF10B017 +:108BC00000000000000000000000000000000000A5 +:108BD0000000F505CACA0000000000000000000007 +:108BE0000000000000000000000000000000000085 +:108BF00000000000FF0000FF000000000000000077 +:108C00000000000000000000000000000000000064 +:108C100000000000040000000000010001800408C2 +:108C20000504000000002000000400000000000017 +:108C300040000400000000100000000000000000E0 +:108C40000000000000000000000000000000000024 +:108C50000000000100000000000000000000000013 +:108C60000000000000000000000000000080000084 +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C90000000000010000000090000002000200873 +:108CA0008001A00100000000000000010000200081 +:108CB0000000000000004100000100000000000072 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000004044 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D100000000000000200802000880090002080F9 +:108D20002000890290800000004000000000000048 +:108D300000000040000000410000000000000000B2 +:108D40000000000000000000000000000010000013 +:108D50000200000000000000000000000000000011 +:108D6000000090000000000002000000020000006F +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000200E1 +:108D90000000000000000000001000082008000093 +:108DA00000040000100109400010008400000010C1 +:108DB0000000000000100000000000880008000013 +:108DC000000800000000000000000000000000009B +:108DD0000000000000000000000000000090009073 +:108DE0000000001000000000000000000000000073 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E100000000000000000000000900000000000C2 +:108E20000000000000200000008500008500010017 +:108E300040000000A021080000000000A088000001 +:108E400000000000A0100000A00000000000820050 +:108E500000000000000000000000000000004000D2 +:108E600040000000000000000000000000000000C2 +:108E700000000000000000000000000000000000F2 +:108E80000000000000000000004100080000000099 +:108E900000000005000000000000000003000000CA +:108EA0000800090000000001000000080000400068 +:108EB00010000000000000004100030004004120F9 +:108EC00003840500410000000000000000000000D5 +:108ED0000000000000000000410000000000000051 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000005000000400040C0000000A01100113A +:108F3000000010008402004020000000000000003B +:108F40000000040084000000000008000000004051 +:108F500000200000000000000000000000000000F1 +:108F600008090004C0040011000000000000000017 +:108F700000400000000000000000000000000000B1 +:108F800000000000000000000040000000000000A1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000008200000000000000000040FF +:108FB000000000008000000400000000000000002D +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000008200000000000804002092 +:109030000041000000000000410000000000C0806E +:109040000000000008A000008400000000000000F4 +:1090500009000000008000000800000000008200FD +:109060000800000004000080000000000000000074 +:109070000000C00000000000C00000000000000070 +:10908000004000000000000000000011000000008F +:1090900000000000000000000000000000000000D0 +:1090A00000000000000008000000000003080801A4 +:1090B00008010000000400000900209009000300DE +:1090C00041400000000005210000050000000300F1 +:1090D0000000400000000040080083000000000085 +:1090E0000000000000000000001000000000000070 +:1090F0000000000000000000000000000000000070 +:109100000000000000C00084210000000084000076 +:10911000000000000000000000000000000000004F +:10912000000000000000080090000000080000009F +:109130000041000001110000080000400004880008 +:109140008200080002040000C0000000840000004B +:1091500000000020000000000000000000000000EF +:10916000000000000000000000000000000000807F +:1091700000000000000000008200000082000000EB +:1091800000008800000000000008000000400021EE +:1091900000020000000000020000000000000000CB +:1091A00000000000000000080000000000000000B7 +:1091B0000300000011000400000000000000000097 +:1091C0000000000008000000000000000000000097 +:1091D000000000000000000000000000000000008F +:1091E000000000000000000000000020000000005F +:1091F000004000000000000000000000000000002F +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000001050102404000C0000100000001E3 +:109240000000010000000000000004009000008207 +:10925000204000000000820000000000000000002C +:1092600000000000000000000000000000C000023C +:10927000000000C00000000000000000000000002E +:10928000000000009008009000100208000000009C +:1092900000000000000000000000000000000000CE +:1092A00000000000000000000000000000000000BE +:1092B0000000000010C1030389410040004100008C +:1092C0000040000810000000000000008000800046 +:1092D0000000000000000500000000000000000089 +:1092E00000000000000000000000000000000080FE +:1092F00000800000000000000000000000000000EE +:1093000000000000000000800000000000000000DD +:10931000000000000000000000000000000000004D +:10932000000000000000000000000000000000003D +:1093300000040000000011002020040000A0200014 +:109340002000000040080000002100800000000014 +:109350000085800500000000000000000000000003 +:1093600000008000800000000000000000000000FD +:1093700000000000000000000000000000000000ED +:10938000000000000000000080000083008000005A +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000001004000000090018500020090C4 +:1093C0000184000000000100000000000002000015 +:1093D000A00020408284C0000000000000000000C7 +:1093E0000000A0000200C00000000000000000001B +:1093F000000000000000000000000000000000006D +:10940000000000000000000000001000888210042E +:1094100084040000000000000000000000000000C4 +:10942000000000000000000000000000000000003C +:1094300000000000000000000000C00100009011CA +:10944000030100000100A101010100000000000073 +:109450000000000200200008A0A0000000000001A1 +:1094600000010000000000000000000000000000FB +:109470000000000040000000080084000000000020 +:10948000000000000000000000000000C0100010FC +:1094900002081008000000000000000000000000AA +:1094A00000000000000000000000000000000000BC +:1094B00000000000000000000000000080084000E4 +:1094C000A005824100000341820411110000000048 +:1094D0000000000000800000008000800000000309 +:1094E000001000400000000000000000000000002C +:1094F00000000000000080000000000000000000EC +:10950000000000000000000000000000000080805B +:10951000000000800080000000000000000000004B +:10952000000000000000000000000000000000003B +:109530000000000000008000800080008000C180EA +:1095400041052100800408212100040010090000C9 +:109550000000800000000000000200008000000009 +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:10959000800000008080000000000000000000004B +:1095A00000000000000000000000000000000000BB +:1095B000000000000000000010000800100008007B +:1095C000050240A0890002000085000000000100A3 +:1095D000C000900010000000A000840504200400DA +:1095E00000000000000000000000008400A0000057 +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A +:109610000000040010840808900000000000000012 +:10962000000000000000000000000000000000003A +:10963000000000000000000000000000000000002A +:109640000000000000E007004100000000E0000012 +:109650000000000000000000000000000000070003 +:1096600000000000000000000000000000000000FA +:1096700000000000000000000000000000000000EA +:1096800000000000000000000000000000000000DA +:109690000000000000000000000042000000000088 +:1096A00000000000000000000000000000000000BA +:1096B000000000000000000000000000AF2D870542 +:1096C000000000000028FF28FF00FF00000000004D +:1096D00000000000500050000000000082BE82BE6A +:1096E000C3FF003C0000000000000000000000007C +:1096F000000000000000000000000000000000006A +:109700000000000000000000000000000000000059 +:10971000000000000000C05FC05050CF50C00000EB +:109720000000000000000000000000000000000039 +:109730000000000000000000000000000000000029 +:1097400000000000000000E8FFE8FF00FF0000004C +:10975000000000000000000055000000000082BE74 +:1097600083BFCBFB083800000000000000000000B1 +:1097700000000000000000000000000000000000E9 +:1097800000000000000000000000000000000000D9 +:109790000000000000000000CF5FCF505FCF5FC02F +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000000000FFFA0F0AAAAAAAAADF +:1097D0000000000000000000000000000000000089 +:1097E000878787870ACA3AFA000000000000000055 +:1097F00000000000F5F5F505000000000000000085 +:109800000000D7D7D71400000000000000000000BF +:10981000000000000000000000000AFA0AFAAAF0A6 +:10982000AAF000000000000000000000000000009E +:109830000000000000000000000000000000000028 +:1098400000000000000000000000FDF80D08AAAABA +:10985000AAAA0000000000000000000000000000B4 +:10986000000087878787AAAAAAAA00000000000034 +:109870000000000000000505F505000000000000E4 +:10988000000000001414D7140000000000000000C5 +:10989000000000000000000000000000C0C0CFCFAA +:1098A00000C3FFC300000000000000000000000033 +:1098B00000000000000000000000000000000000A8 +:1098C00000000000000000000000000000613E09F0 +:1098D000000900000061000600090000800000008F +:1098E0000000000000000E080000000000610006FB +:1098F000000D000000000000000000050000000056 +:109900000000000000000000500000000000000007 +:109910000000000000000000000000000000000047 +:10992000000000C000000000000000000000000077 +:109930000000000000000000000000000000000027 +:109940000000000000000000000000000000F5F52D +:10995000FF5555FF41EB00FF00FF00F0FFF0000056 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000000000000000000000000000097 +:1099D000A0A0AA0000AA41EBFFFFE8E800F0FFF01A +:1099E0000000000000000000000000000000000077 +:1099F00000000000A000AF00000000000000000018 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A50000000ACFCFCFC5F505F50F5F5383830304E +:109A6000A6A60000000000000000000000000000AA +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD00000000000AC0C0C0CC3C3C3C300000000AA +:109AE00000005555000000000000000000000000CC +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B30000000000000000000000000000000000025 +:109B40000000000000000000000000000000000015 +:109B50000002000000020000000000000000000001 +:109B600000000000000000000020000000000000D5 +:109B700000000000000000000000000000000000E5 +:109B800000000000000004000000000000000000D1 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000020000000000000000A3 +:109BC0000000000000000000000000000000000095 +:109BD0000000000000000000002000002000000045 +:109BE00020002020000000000020000020000400D1 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C500000000000020000000009000000000000F9 +:109C600000000040000000000000000000000000B4 +:109C700000000000001000000000000000000000D4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000020000000008000000080000000072 +:109CE0000000000000000000000000000000000074 +:109CF0000200000000000040000000100000000012 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D40000000000000000000000000000000000013 +:109D500000000000000000000000000000100000F3 +:109D600000000000400000000800000000000000AB +:109D70008400000008000000A000000000000000B7 +:109D80008200000000000000000000000000000051 +:109D9000000000000000000000008800000000003B +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD000000000000000000000000000080041003A +:109DE0000000210000000800000000000004000046 +:109DF0000000050000000800000000000000000056 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E3000000000000000000000000000008400009E +:109E40000002000000000000000000000000000010 +:109E500000000000000000000000000008000000FA +:109E6000004100000009000400090000000000009B +:109E7000000000008440000000000000000000001E +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB000000084000000000000000000000000001E +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000000000000000000082 +:109EE0000000410000000000000000000000000031 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 +:109FC0000000000000000000000000000000000091 +:109FD0000000000000000000000000000000000081 +:109FE000000000000300000000000004000003C0A7 +:109FF0000000030000000000000005000000080051 +:10A00000000000000000000000000300000000004D +:10A010000000000000000000000000000000000040 +:10A020000000000000000000000000000000000030 +:10A030000000000000000000000008000088000090 +:10A0400040000000000000000300000000000000CD +:10A0500011000000000000000000000000000000EF +:10A0600000000000080000000000000000000000E8 +:10A070000000000000000000000000009000000050 +:10A0800000000000000000000000000000000000D0 +:10A0900000000000000000000000000000000000C0 +:10A0A00000000000000000000000000000000000B0 +:10A0B00000000000000000000000000000000000A0 +:10A0C0000000000000000000000000000000004050 +:10A0D0000000000000000000000000000000000080 +:10A0E000000000000000000003000000000000006D +:10A0F000110000000000000000000000000000004F +:10A10000000000000000000000000000000000004F +:10A11000000000000000000000000000000000201F +:10A120000000000000000090090020200000000056 +:10A13000000000000000000000000010000000000F +:10A14000000000000000000000000000000000000F +:10A1500000000000000000000000000000000000FF +:10A1600000000000000000000000000000000000EF +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A1900000000000000000000000000000000000BF +:10A1A00000000000000000000000000000000000AF +:10A1B000000000000000000000000000000000009F +:10A1C000000000000000000000000000000000008F +:10A1D000000000000000000000000000000000007F +:10A1E000000000000000000000000000000000006F +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A21000000000000000000000000000000000003E +:10A22000000000000000000000000000000000002E +:10A23000000000000000000000000000000000001E +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000000000000BE +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000000000000000008E +:10A2D000000000000000000000000000000000007E +:10A2E000000000000000000000000000000000006E +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000000000002D +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A3900000000000000000000000000000000000BD +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000008D +:10A3D000000000000000000000000000000000007D +:10A3E000000000000000000000000000000000006D +:10A3F000000000000000000000000000000000005D +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000000000000000000000000009C +:10A4C000000000000000000000000000000000008C +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000000000000000000000006C +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B +:10A53000000000000000000000000000000000001B +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB +:10A5600000000000000000000000000000000000EB +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000000009B +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000000000000000000007B +:10A5E000000000000000000000000000000000006B +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000000000000000004A +:10A61000000000000000000000000000000000003A +:10A62000000000000000000000000000000000002A +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000000000000FA +:10A6600000000000000000000000000000000000EA +:10A6700000000000000000000000000000000000DA +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000000AA +:10A6B000000000000000000000000000000000009A +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000082000000000084000000C3 +:10A7900000000000000000000000040004000000B1 +:10A7A0000000000000000000000000004000000069 +:10A7B0000000000000000000000000000000000297 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000040000029 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000400008 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A880000000000000000000004100410000000046 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000800000000000000A0 +:10A8B0000000004100000000000000000000000057 +:10A8C0000000000000000000020000000000000086 +:10A8D0000000000000000000000000000000004038 +:10A8E0000000000000000000000000000041000027 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A9100000000000001000840000000000C00000E3 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A9400000000000000000000240000000000000C5 +:10A9500000000000000000000000000000000200F5 +:10A9600000000000000000000000000000000300E4 +:10A9700000000000000000000000000000000000D7 +:10A9800000000200020000000010000000000000B3 +:10A990000000001000000000100000001000000087 +:10A9A000000000000000000000080000000000009F +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000040002000200007 +:10A9D0000000000000000000000000000000000077 +:10A9E00000000000000082000000000000000000E5 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000010000000000026 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000008000800006 +:10AA50008000000000000000100000000000000066 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000008000000000000CE +:10AA800000000000000000000000000000040000C2 +:10AA9000000400040000004000400000002100000D +:10AAA00000000004000000000000000000000000A2 +:10AAB0000000000000000000000000000004C000D2 +:10AAC0000000000000000000000000000000004046 +:10AAD000000000000000000000000800000400006A +:10AAE0000000001100000000000000000000000055 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000110034 +:10AB10000000000000000000000000000004000031 +:10AB20000020000400000000000000000000000001 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB000000000000000000000000000080000008D +:10ABC0000000000000000000000008000800000075 +:10ABD0000100000000000000000000000000000074 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000002000000000000000000000000000D4 +:10AC600000000000000000000000000000000004E0 +:10AC700000000000000000000000000000000000D4 +:10AC80000040000000000000000000000000000084 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC00000000000000000000000000000008800FC +:10ACD0000200000000000000000000000000000072 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000200110020 +:10AD200000002000000000000200000008000000F9 +:10AD30000000000000000008000000000800000003 +:10AD400000000000200000000000000000000000E3 +:10AD500002000000000000000000000000000000F1 +:10AD600000000000000000000200000000000000E1 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000101014000000030 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE50000000000000000000000000044004052085 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED000000000000000000000000000040021004D +:10AEE000030004000000000000000000000000005B +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF5000000000000000000000000000000001A050 +:10AF600001000000010000000000000000000000DF +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE000000101000101010000000000000000005C +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B06000000000042000050540050000000000006D +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000004800000040004400000000094 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000001020000010001010000D9 +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E0000000000000000000000000E0000000007F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F00000000000006100030001000000000000E7 +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B570000000000000000F0F1414C3AAFFAA00006F +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F00000000000000000000F0F141400AA3CAA75 +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B67000000000000000000000000F0F0F0FD3FBC0 +:10B6800050FA000000000000000000000000000070 +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000FF00AAAAF7 +:10B7000050505050000000000000000000000000F9 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B740000000000000000002C00000000000000037 +:10B7500000000000880082000200000000000000DD +:10B7600000000000000000000000000000000000D9 +:10B770000000000000002000200088000000000001 +:10B780000000000000000000400040000000000039 +:10B7900000000000000000000000200020008800E1 +:10B7A000020000008800000000000000000000000F +:10B7B0000000000002000000000020002000000047 +:10B7C0000000000000000000000100000000000078 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B840000000000000000000004000000000008038 +:10B8500000000040000000000000000000000000A8 +:10B8600000000005000000000000000000000000D3 +:10B870000000004000000008000000000000000080 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000800000000000000000000A0 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000001000000000000000000000000068 +:10B8D00000020082001000000000008403C000008D +:10B8E0000040000000000000000000000000000018 +:10B8F0000000000000000000000000000000000840 +:10B900000000000000000000000000000000000037 +:10B9100000080000000000080000000800002000EF +:10B92000000800000000000002000000000000000D +:10B9300000080000000000080000004000000000B7 +:10B9400002400000000000000002000200000000B1 +:10B950004000400000000000000010000000000057 +:10B9600000000000000000000000000000020000D5 +:10B9700000000000000000080000000000000000BF +:10B9800000000000000000000000000000000000B7 +:10B99000000000080000000000000000000000009F +:10B9A0000000000090000000000000000000000007 +:10B9B000000000080000000000000000000000007F +:10B9C0000000000000000000000000000000000077 +:10B9D0000000800080000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000030000000000000000000000000033 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500002000000000900000000000000000000DB +:10BA600000000000000090000000000088000000BE +:10BA70000000000004008200000000000000000040 +:10BA800000000000000000000000000000000000B6 +:10BA9000C000000000000000000090000000000056 +:10BAA000820800000000000000000200000000000A +:10BAB0000000000000000000000000000000000086 +:10BAC0000040000000000000000000000000000036 +:10BAD00000000000000005880088000000000084CD +:10BAE000000000A000040040110000000000000061 +:10BAF000410000004100080811000000000000841F +:10BB0000000000000000000800000000000000002D +:10BB1000000041000000100010000000008800003C +:10BB20000084000000000000000808000000000081 +:10BB300000000300210008000800210000000000B0 +:10BB400000A000000000000000400800000000000D +:10BB500000000000000000000000000000000000E5 +:10BB60000000000082000000000000000000000053 +:10BB7000A000000000000000000000000000000025 +:10BB800000000000080000000000000000000000AD +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000080000000000C000CD +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC50000000820000002000000000000000000042 +:10BC600000000000000000000000000002080000CA +:10BC700000000000000000000000000000000000C4 +:10BC8000000000000000000000000009002100008A +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000002173 +:10BCB0000000820000000000020000000000000000 +:10BCC0000000000000000000000000000000020072 +:10BCD0000000000000000000000000400000000024 +:10BCE0002188000000880000000000000000000023 +:10BCF0001100000000000000000000000000000033 +:10BD00001100000000840300008800000000000013 +:10BD10000300000000000000000000000000000020 +:10BD20000000000000880008000000000000000083 +:10BD300008000800000000000000000000000000F3 +:10BD400000004100030000080000000000000000A7 +:10BD500008000800000000000000000000000001D2 +:10BD600000010001000000000000000000000000D1 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE000000400100021000000000000000000001E +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE6000200004000400100000000000000000009A +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE00000000188000001000100000000000000C7 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000001000101010000000000CD +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE00000000000000000001005052104200000F2 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C060000000000000000000218002000400040025 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000001C0010000008E +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C17000000050000000000000000000000000006F +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F00000000000000000610006000D00000000C9 +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C470000000000000000000C392613000FF0F0FB9 +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F00000000000000000000000C392613000FF57 +:10C500000F0F00000000000000000000000000000D +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C57000000000000000000000000000FEAEFEAE63 +:10C58000C3C30F0F00000000000000000000000007 +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F00000000000000000000000000000005E0ECF +:10C600005E0EC3C3FF000000000000000000000039 +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C670000000000000000000000088000000020030 +:10C680000000000000000000000000000000880022 +:10C690000000000000000180000000008800200071 +:10C6A0000000000000000000000000000000840006 +:10C6B00000000200000001800003000000002000D4 +:10C6C00020000000000000008400000000000200C4 +:10C6D0002000000000000000010088000000200091 +:10C6E0000000000000000000200084000000200086 +:10C6F00002000400000000000008000041000000EB +:10C7000041000000000000000000000000000000E8 +:10C7100000000000000000002008000000000000F1 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000001004000000000000E5 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000200000000000B9 +:10C7600000000000000000000000000000000000C9 +:10C770000000200000000000000000090000000090 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F00000000000000000000000000000800000B9 +:10C800000000000000000000000000000000000028 +:10C8100000000000000800840008008400000010F0 +:10C820000000000000000000000000000000000008 +:10C8300000000000000800080040000000000000A8 +:10C840000000000000000000008800100008000840 +:10C850000040000000000008001000000000000080 +:10C86000000000000000000000000000000800843C +:10C870000000000000000040000000000000000474 +:10C880000008000000050041000000000041000316 +:10C890000000000000000000000000000000002177 +:10C8A0000010000000410000000800080008000817 +:10C8B0000000000000000000000000000000002157 +:10C8C0000000000500030000000000000000000858 +:10C8D0000008000000000000000000000000000050 +:10C8E000102100000000000000000000000000080F +:10C8F0000021000000000000000000000000000017 +:10C900000010000000000300080000000000008488 +:10C9100000A000000000000000000008000000006F +:10C920000000000000000000000000000000000007 +:10C9300000000008000000000000000000000000EF +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C960000000800000000000000000000000000047 +:10C9700000000000000000000000000000000000B7 +:10C98000000000000000820000002000880000007D +:10C990009000200000000000A00082008200000043 +:10C9A00082008200000008000000400082000000B9 +:10C9B000820082008800000000000802820000005F +:10C9C00082008200000082002000000082008200BD +:10C9D00000000000820002000400000082008200CB +:10C9E000000000008200000082000000820082003F +:10C9F00000000000820000000000000082008200B1 +:10CA00000000000082000000020000000040000062 +:10CA10000040004000040000000000000000200072 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000300400000000000B3 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600005000800000000000000000000000000B9 +:10CA70000020000000000000000040004000000016 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000041000055 +:10CAA0000021002100000000200000000000000024 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0001000004100000000000000000000000005 +:10CAE000080000000000C00000000000000000007E +:10CAF000080000000000000000000000000000002E +:10CB00000000000000000000001100840000000090 +:10CB100000000500210021000000000000000000CE +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000800000000BD +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000200A3 +:10CB900002000200004000002004004000000000ED +:10CBA000002100080008000800210000000000002B +:10CBB00082000802000000000000000000000000E9 +:10CBC0000041820800080040002100000000000031 +:10CBD00000000800080000050200000000000040FE +:10CBE0000000004100080010000900210000820040 +:10CBF000C00008000002A00000009000000000003B +:10CC000000000041004004200009002100000084D1 +:10CC1000200000C0088400000000000000000000A8 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC900000010001000100C10001000100C000030B +:10CCA00000000101000800100001000100C10000A7 +:10CCB00000010001000100C00001000100C00003EC +:10CCC00000018501000800820001000100C1000090 +:10CCD000000000010001000100C00001000100C0CF +:10CCE000000300000401000800820001000100C1EF +:10CCF000000000010001000100C00001000100C0AF +:10CD0000000300000001000800820001000100C1D2 +:10CD100000000041004100410084004100410089C1 +:10CD2000094100020341008000800041004100A051 +:10CD3000000000410041004100C04041004100842A +:10CD4000094100400241008000800041004100A0F4 +:10CD50000000000000410041004100C0404100418E +:10CD60000084094100408941008000800041004169 +:10CD700000A0000000410041004100C040410041CE +:10CD80000084094100020941008000000041004187 +:10CD900000A0000041000300000000804100C0002E +:10CDA00000000800890040000011C0004100C100DF +:10CDB0000000800041000300000000804100A1004D +:10CDC00000000300890040000002C0004100C100D3 +:10CDD00000008000000041000300000000804100CE +:10CDE000A10000000800890082000040840041008A +:10CDF000C1000000800041000300000000804100ED +:10CE0000A10000000800090082000080A00041008D +:10CE1000C1000000800001000100000000C001000E +:10CE2000C10000000100400088840004C1048500A6 +:10CE3000C10000A0080001000100000000C00100C6 +:10CE4000C00000000000400088A00090C100210048 +:10CE5000C10000A00400000301000100000000C0A8 +:10CE60000100C00000000100400083400091C1C0EB +:10CE70002100C10000A0080001000100000000C066 +:10CE80000100C00000000100820083400004C1C016 +:10CE90002100C10000A0080000C00001C0C10000C6 +:10CEA0000000000100C184820011000100C10000E7 +:10CEB000000000010001000000C00001C0C100002E +:10CEC0000000000100C040820041000188C1000054 +:10CED0000000000100010000000000C00001C0C10E +:10CEE00000000000000100C040820041000188C134 +:10CEF0000000000000010001000000C00001C0C1EE +:10CF000000000000000100C040830011000100C1CA +:10CF1000000000000001000100000080004180C10D +:10CF200000000000004100A000850041004100C158 +:10CF3000000000000041002000000080004180C18E +:10CF400000000000004100C0000500C1004100C118 +:10CF500000000000004100200000000000800041AF +:10CF600080C100000000004100C0000500C1004178 +:10CF700000C10000000000410020000000800041CE +:10CF800080C10000000000410090000300C100418A +:10CF900000C100000000004100200000C10080002E +:10CFA00080C100004104804004004100C141800074 +:10CFB000800200004100000080004100C1008000AC +:10CFC00080C100004100000085004100C141800097 +:10CFD0008002000041000000800041000000C1000C +:10CFE000800080C100004100800085004100C141F7 +:10CFF0000000800200004100000080004100C100EC +:10D00000800080C100004100800385004100C1C153 +:10D010000000800200004100000080004100C100CB +:10D020004000C0C100000101200105000100C10550 +:10D030000800C001000001000000C0000100C100A4 +:10D040004000C0C100000100A00008000100C103B1 +:10D050000800C001000001000000C0000100000045 +:10D06000C1004000C0C10000010002000800010032 +:10D07000C1851000C001000001000000C0000100D7 +:10D08000C1004000C0C10000010004000800010010 +:10D09000C1059000C001000001000000C0000100B7 +:10D0A000000000000000004200000000000000003E +:10D0B000811200410700480000000000000000004D +:10D0C000000000000000004200000000000000001E +:10D0D000811200410700480000000000000000002D +:10D0E00000000000000000000042000000000000FE +:10D0F000000081120041070048000000000000000D +:10D1000000000000000000000042000000000000DD +:10D1100000008112004107004800000000000000EC +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D22000000000000000757B00000000000000000E +:10D2300000000000000000000000000000000000EE +:10D2400000000000DEAE757B000000000000000062 +:10D2500000000000000000000000000000000000CE +:10D2600000000000DEAE0000757B00000000000042 +:10D2700000000000000000000000000000000000AE +:10D28000000000000000DEAE757B00000000000022 +:10D29000000000000000000000000000000000008E +:10D2A000000000000000DEAE60C6030000000000C9 +:10D2B00000000031E0000000000000000C00000051 +:10D2C0000000000000C0630660C60300000000000C +:10D2D00000000031E0000000000000000C00000031 +:10D2E0000000000000C06306000060C603000000EC +:10D2F000000000000031E0000000000000000C0011 +:10D3000000000000000000C0630660C603000000CB +:10D31000000000000031E0000000000000000C00F0 +:10D3200000000000000000C0630600400080000014 +:10D33000018000008800000088000000000000005C +:10D3400000000000000020000000000000000000BD +:10D350000000000020000000200088000000000005 +:10D36000000000000000200000000000000000009D +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D390000000008000000400000000008800000081 +:10D3A0000400000000000000000002000001004036 +:10D3B000000002100000000000000000000000005B +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E0000000000000000500050000000000000033 +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D4100000000000001000000000000000000000FC +:10D4200000000000000000000500050000000000F2 +:10D4300000000010000000000000000000000000DC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B0000000000800010000000000000000000063 +:10D4C00000000010000000840000000000000000C8 +:10D4D00000840010000000000000000000000000B8 +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D510000008000000000000000000000000000003 +:10D5200000000000000000000000000000000000FB +:10D53000004000000000000000400000000000006B +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000010000000000000BB +:10D5600000000003000000000000000000000000B8 +:10D57000000000000000001000000000000000009B +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B0000000000003000000000000C100000000A7 +:10D5C00000000000000000000000000000840000D7 +:10D5D000000000000000000000000010000000003B +:10D5E0000000000003000000000000000000000038 +:10D5F000000000000000000000000000000000002B +:10D600000000000000000800000000000000000012 +:10D610000084000000000000000000000000000086 +:10D620000000000000000300000000A00000000057 +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D65000000000000000400000000000000000008A +:10D660000000000000000000A0000000000000001A +:10D670000000000000000000000082000000000028 +:10D68000000008000000080000000000000000008A +:10D69000000000000000000040004000000000000A +:10D6A000000000000000000000000000000020005A +:10D6B000000000000000000000000040000000002A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000008000000000000A1 +:10D780000000000000000000000000000000000099 +:10D790000000000000008200000082000000000085 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C00000000000000000000000008400000010C5 +:10D7D0000000000000000000000000000000000049 +:10D7E000000000000000000000000000000021A078 +:10D7F00000000084000000000000000000000000A5 +:10D800000000000000000000000000000084000094 +:10D810000300000000840000000000000000000081 +:10D820000000000000000000000000000084000074 +:10D8300003000000000000000000000000000008DD +:10D8400000100000000000000002000400000000C2 +:10D850000000000000210000000000000000002186 +:10D8600000000000000000000400000000000000B4 +:10D8700000000000000000000000000000080000A0 +:10D880000000000000000000000000000000000098 +:10D890000000000000000004000000000800000874 +:10D8A0000000000200000000000000000000000076 +:10D8B0000000000000000004000000000000020062 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D94000000041A000040004C0020000000000002C +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C00000000000A00000000000808000000000B7 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000008021808280000000B3 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000800000008000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000400008C0A009C000E5 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000020004000400EB +:10DB300000000000000000000000000000000000E5 +:10DB40000000000000000000000040200002888467 +:10DB5000C1C0000000000000000000000000000044 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000008000008055 +:10DBD000008009800000000000000000000000003C +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC40000000000000000000000000000000800054 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB00000000080000000000000000000000000E4 +:10DCC0000000000000000000000000000000000054 +:10DCD000400004C0044040000000000000000000BC +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD30000000000000020090000000000000000051 +:10DD400000000000000000000000000000000000D3 +:10DD50000000000000000000000A000000000000B9 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD000000000000363F363C3C3CFC00000000072 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000003F3F3F366666F6000004B +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000C9C0C0C00109AE +:10DF600000080000000000000000000000000000A9 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC000018101810000000000000000000000004D +:10DFD000000000000000000000000000C9CFC0CF1A +:10DFE00099999999000000000000000000000000CD +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000100010000000000000000000000CE +:10E0500000000000000000000000000000000000C0 +:10E0600030000090000500000000000000000000EB +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000200EB +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000030000000000000000000000000000006A +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C :10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000007C +:10E49000000000000040000000000000000000003C :10E4A000000000000000000000000000000000006C :10E4B000000000000000000000000000000000005C :10E4C000000000000000000000000000000000004C @@ -32382,4110 +36479,13 @@ :10E7500000000000000000000000000000000000B9 :10E7600000000000000000000000000000000000A9 :10E770000000000000000000000000000000000099 -:10E780000000000000000000000000000000000089 +:10E780000008000000000000000000000000000081 :10E790000000000000000000000000000000000079 :10E7A0000000000000000000000000000000000069 :10E7B0000000000000000000000000000000000059 :10E7C0000000000000000000000000000000000049 :10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000000000000000000000029 -:10E7F0000000000000000000000000000000000019 -:10E800000000000000000000000000000000000008 -:10E8100000000000000000000000000000000000F8 -:10E8200000000000000000000000000000000000E8 -:10E8300000000000000000000000000000000000D8 -:10E8400000000000000000000000000000000000C8 -:10E8500000000000000000000000000000000000B8 -:10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 -:10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000000000078 -:10E8A0000000000000000000000000000000000068 -:10E8B0000000000000000000000000000000000058 -:10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 -:10E9200000000000000000000000000000000000E7 -:10E9300000000000000000000000000000000000D7 -:10E9400000000000000000000000000000000000C7 -:10E9500000000000000000000000000000000000B7 -:10E9600000000000000000000000000000000000A7 -:10E970000000000000000000000000000000000097 -:10E980000000000000000000000000000000000087 -:10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000000000000000067 -:10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000000000000000047 -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 -:10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 -:10EA200000000000000000000000000000000000E6 -:10EA300000000000000000000000000000000000D6 -:10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000000000B6 -:10EA600000000000000000000000000000000000A6 -:10EA70000000000000000000000000000000000096 -:10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000000076 -:10EAA0000000000000000000000000000000000066 -:10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000000000000026 -:10EAF0000000000000000000000000000000000016 -:10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 -:10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000000000D5 -:10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000075 -:10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000000045 -:10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 -:10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 -:10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000000000000000D4 -:10EC400000000000000000000000000000000000C4 -:10EC500000000000000000000000000000000000B4 -:10EC600000000000000000000000000000000000A4 -:10EC70000000000000000000000000000000000094 -:10EC80000000000000000000000000000000000084 -:10EC90000000000000000000000000000000000074 -:10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 -:10ECC0000000000000000000000000000000000044 -:10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000000000024 -:10ECF0000000000000000000000000000000000014 -:10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 -:10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000000083 -:10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000000000000053 -:10EDC0000000000000000000000000000000000043 -:10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 -:10EDF0000000000000000000000000000000000013 -:10EE00000000000000000000000000000000000002 -:10EE100000000000000000000000000000000000F2 -:10EE200000000000000000000000000000000000E2 -:10EE300000000000000000000000000000000000D2 -:10EE400000000000000000000000000000000000C2 -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 -:10EE70000000000000000000000000000000000092 -:10EE80000000000000000000000000000000000082 -:10EE90000000000000000000000000000000000072 -:10EEA0000000000000000000000000000000000062 -:10EEB0000000000000000000000000000000000052 -:10EEC0000000000000000000000000000000000042 -:10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000000000000012 -:10EF00000000000000000000000000000000000001 -:10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000000000000000000E1 -:10EF300000000000000000000000000000000000D1 -:10EF400000000000000000000000000000000000C1 -:10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 -:10EF70000000000000000000000000000000000091 -:10EF80000000000000000000000000000000000081 -:10EF90000000000000000000000000000000000071 -:10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC0000000000000000000000000000000000041 -:10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 -:10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000000000000000D0 -:10F0400000000000000000000000000000000000C0 -:10F0500000000000000000000000000000000000B0 -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F090000000000000000000000000000000000070 -:10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000000050 -:10F0C0000000000000000000000000000000000040 -:10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000000FF -:10F1100000000000000000000000000000000000EF -:10F1200000000000000000000000000000000000DF -:10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF -:10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F -:10F19000000000000000000000000000000000006F -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F2000000000000000000000000000000000000FE -:10F2100000000000000000000000000000000000EE -:10F2200000000000000000000000000000000000DE -:10F2300000000000000000000000000000000000CE -:10F2400000000000000000000000000000000000BE -:10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E -:10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000000005E -:10F2B000000000000000000000000000000000004E -:10F2C000000000000000000000000000000000003E -:10F2D000000000000000000000000000000000002E -:10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F3000000000000000000000000000000000000FD -:10F3100000000000000000000000000000000000ED -:10F3200000000000000000000000000000000000DD -:10F3300000000000000000000000000000000000CD -:10F3400000000000000000000000000000000000BD -:10F3500000000000000000000000000000000000AD -:10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D -:10F38000000000000000000000000000000000007D -:10F39000000000000000000000000000000000006D -:10F3A000000000000000000000000000000000005D -:10F3B000000000000000000000000000000000004D -:10F3C000000000000000000000000000000000003D -:10F3D000000000000000000000000000000000002D -:10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D -:10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC -:10F4200000000000000000000000000000000000DC -:10F4300000000000000000000000000000000000CC -:10F4400000000000000000000000000000000000BC -:10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000000007C -:10F49000000000000000000000000000000000006C -:10F4A000000000000000000000000000000000005C -:10F4B000000000000000000000000000000000004C -:10F4C000000000000000000000000000000000003C -:10F4D000000000000000000000000000000000002C -:10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB -:10F5100000000000000000000000000000000000EB -:10F5200000000000000000000000000000000000DB -:10F5300000000000000000000000000000000000CB -:10F5400000000000000000000000000000000000BB -:10F55000000000000000200000000000000000008B -:10F56000000000000000000000000000000000009B -:10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000007B -:10F59000000000000000000000000000000000006B -:10F5A000000000000000000000000000000000005B -:10F5B000000000000000000000000000000000004B -:10F5C000000000000000000000000000000000003B -:10F5D000000000000000000000000000000000002B -:10F5E000000000000000000000000000000000001B -:10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA -:10F6100000000000000000000000000000000000EA -:10F6200000000000000000000000000000000000DA -:10F6300000000000000000000000000000000000CA -:10F6400000000000000000000000000000000000BA -:10F6500000000000000000000000000000000000AA -:10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A -:10F69000000000000000000000000000000000006A -:10F6A000000000000000000000000000000000005A -:10F6B000000000000000000000000000000000004A -:10F6C000000000000000000000000000000000003A -:10F6D000000000000000000000000000000000002A -:10F6E000000000000000000000000000000000001A -:10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 -:10F7100000000000000000000000000000000000E9 -:10F7200000000000000000000000000000000000D9 -:10F7300000000000000000000000000000000000C9 -:10F7400000000000000000000000000000000000B9 -:10F7500000000000000000000000000000000000A9 -:10F760000000000000000000000000000000000099 -:10F770000000000000000000000000000000000089 -:10F780000000000000000000000000000000000079 -:10F790000000000000000000000000000000000069 -:10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000000000000000000000049 -:10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 -:10F7E0000000000000000000000000000000000019 -:10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 -:10F8200000000000000000000000000000000000D8 -:10F8300000000000000000000000000000000000C8 -:10F8400000000000000000000000000000000000B8 -:10F8500000000000000000000000000000000000A8 -:10F860000000000000000000000000000000000098 -:10F870000000000000000000000000000000000088 -:10F880000000000000000000000000000000000078 -:10F890000000000000000000000000000000000068 -:10F8A0000000000000000000000000000000000058 -:10F8B0000000000000000000000000000000000048 -:10F8C0000000000000000000000000000000000038 -:10F8D0000000000000000000000000000000000028 -:10F8E0000000000000000000000000000000000018 -:10F8F0000000000000000000000000000000000008 -:10F9000000000000000000000000000000000000F7 -:10F9100000000000000000000000000000000000E7 -:10F9200000000000000000000000000000000000D7 -:10F9300000000000000000000000000000000000C7 -:10F9400000000000000000000000000000000000B7 -:10F9500000000000000000000000000000000000A7 -:10F960000000000000000000000000000000000097 -:10F970000000000000000000000000000000000087 -:10F980000000000000000000000000000000000077 -:10F990000000000000000000000000000000000067 -:10F9A0000000000000000000000000000000000057 -:10F9B0000000000000000000000000000000000047 -:10F9C0000000000000000000000000000000000037 -:10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000000000000000017 -:10F9F0000000000000000000000000000000000007 -:10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 -:10FA200000000000000000000000000000000000D6 -:10FA300000000000000000000000000000000000C6 -:10FA400000000000000000000000000000000000B6 -:10FA500000000000000000000000000000000000A6 -:10FA60000000000000000000000000000000000096 -:10FA70000000000000000000000000000000000086 -:10FA80000000000000000000000000000000000076 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000000000000000000000000000056 -:10FAB0000000000000000000000000000000000046 -:10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000000026 -:10FAE0000000000000000000000000000000000016 -:10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB200000000000000000000000000000000000D5 -:10FB300000000000000000000000000000000000C5 -:10FB400000000000000000000000000000000000B5 -:10FB500000000000000000000000000000000000A5 -:10FB60000000000000000000000000000000000095 -:10FB70000000000000000000000000000000000085 -:10FB80000000000000000000000000000000000075 -:10FB90000000000000000000000000000000000065 -:10FBA0000000000000000000000000000000000055 -:10FBB0000000000000000000000000000000000045 -:10FBC0000000000000000000000000000000000035 -:10FBD0000000000000000000000000000000000025 -:10FBE0000000000000000000000000000000000015 -:10FBF0000000000000000000000000000000000005 -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 -:10FC200000000000000000000000000000000000D4 -:10FC300000000000000000000000000000000000C4 -:10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000000000000000A4 -:10FC60000000000000000000000000000000000094 -:10FC70000000000000000000000000000000000084 -:10FC80000000000000000000000000000000000074 -:10FC90000000000000000000000000000000000064 -:10FCA0000000000000000000000000000000000054 -:10FCB0000000000000000000000000000000000044 -:10FCC0000000000000000000000000000000000034 -:10FCD0000000000000000000000000000000000024 -:10FCE0000000000000000000000000000000000014 -:10FCF0000000000000000000000000000000000004 -:10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000000000D3 -:10FD300000000000000000000000000000000000C3 -:10FD400000000000000000000000000000000000B3 -:10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000000000000000000093 -:10FD70000000000000000000000000000000000083 -:10FD80000000000000000000000000000000000073 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000000000000043 -:10FDC0000000000000000000000000000000000033 -:10FDD0000000000000000000000000000000000023 -:10FDE0000000000000000000000000000000000013 -:10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000000000000000F2 -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000000000000D2 -:10FE300000000000000000000000000000000000C2 -:10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 -:10FE80000000000000000000000000000000000072 -:10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000000000000000052 -:10FEB0000000000000000000000000000000000042 -:10FEC0000000000000000000000000000000000032 -:10FED0000000000000000000000000000000000022 -:10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 -:10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000000000000000E1 -:10FF200000000000000000000000000000000000D1 -:10FF300000000000000000000000000000000000C1 -:10FF400000000000000000000000000000000000B1 -:10FF500000000000000000000000000000000000A1 -:10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 -:10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000000000000000000051 -:10FFB0000000000000000000000000000000000041 -:10FFC0000000000000000000000000000000000031 -:10FFD0000000000000000000000000000000000021 -:10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 -:020000040008F2 -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000000000000A0 -:100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 -:1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F -:1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E -:1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED -:1003100000000000000000000000000000000000DD -:1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD -:1003400000000000000000000000000000000000AD -:10035000000000000000000000000000000000009D -:10036000000000000000000000000000000000008D -:10037000000000000000000000000000000000007D -:10038000000000000000000020000000200000002D -:10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D -:1003F00000000000000000000000000000000000FD -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC -:1004400000000000000000000000000000000000AC -:10045000000000000000000000000000000000009C -:10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C -:10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B000000000000000000000000000000000003C -:1004C000000000000000000000000000000000002C -:1004D000000000000000000000000000000000001C -:1004E000000000000000000000000000000000000C -:1004F00000000000000000000000000000000000FC -:1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000000AB -:10055000000000000000000000000000000000009B -:10056000000000000000000000000000000000008B -:10057000000000000000000000000000000000007B -:10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B -:1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA -:1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A -:10066000000000000000000000000000000000008A -:10067000000000000000000000000000000000007A -:10068000000000000000000000000000000000006A -:10069000000000000000000000000000000000005A -:1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000000000000000000000000FA -:1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:100780000000000000000000000000000000000069 -:100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 -:1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000000000000F9 -:1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000000000D8 -:1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 -:100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000800CF -:1009200000000800000000000000000000000000BF -:1009300000000000000000000000000000000800AF -:10094000000008000000000000000000000000009F -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 -:100990000000000000000000000000000000000057 -:1009A0000000000000000000000000000000000047 -:1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000000000000000017 -:1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 -:100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF -:1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F -:1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000000BE -:1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E -:1012B000000000000000040000000000000020000A -:1012C00020000000000000000000000000000000FE -:1012D000000000800000000000000000000000008E -:1012E00000000000000000000000000000000000FE -:1012F000000000800001000000000000000000006D -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D -:101350000000000000040000000000000000000089 -:10136000000000000000000000000000000000007D -:101370000000000000040000000000000000000069 -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C -:1014C000000000000000000000000000000000001C -:1014D00000000000000000000000000000110000FB -:1014E00000000000000000000000000000000000FC -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C0000000080082000800820000000000000007 -:1015D0000000000082000000080008000000000079 -:1015E00000000800820004008200000000000000EB -:1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A -:10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B000000000000000000000000000000000002A -:1016C0000000000000000000000000000000080012 -:1016D0000800000000000000000000000000000002 -:1016E00000000000000000000000000000000800F2 -:1016F00008000000000000000000000000000000E2 -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 -:101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 -:101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D0000000820000000000000000000000000087 -:1017E00000000000000000000000000000000000F9 -:1017F00084008200000000000000000000000000E3 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D0000000000001000000000000000000000007 -:1018E00000C0000000000000000000000000000038 -:1018F00000000000010000000000000000000000E7 -:1019000000C0000000000000000000000000000017 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:101950000000000000004100000000000000000343 -:1019600005000080000000000000000000000000F2 -:101970000000000000004100000000000000000323 -:1019800005000080000000000000000000000000D2 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000030000000080000080000000000004 -:1019E0002000200000000000000000000000004176 -:1019F00000000300000000800000800000000000E4 -:101A00002000200000000000000000000000004155 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A5000000000000100000000C0000020000000A5 -:101A60000000900041200020A00040000000000085 -:101A7000000100000100000000C000002000000084 -:101A80000000900041900020A000400000000000F5 -:101A90000001000000000000000000000000000045 -:101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD0000000000000000000C00000000000000046 -:101AE00000000000000200000000000000000000F4 -:101AF0000000000000000000C00000000000000026 -:101B000000000000000400000000000000000000D1 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000080000000000005 -:101B60000000000000000000000000000000000075 -:101B700000000000000000000000800000000000E5 -:101B800000000000000000800000000000000000D5 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD00000000000000000000000800000C10000C4 -:101BE000000000000000000000C1000000400000F4 -:101BF00000000000000000000000800000C10000A4 -:101C0000000000000000000000C1000000400000D3 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C5000000000000000000000000000400000C183 -:101C60000000000000000000000000034000000031 -:101C7000000000000000000000000000400000C163 -:101C80000000000000000000000000034000000011 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE000000000420000000000004800810000E009 -:101CF000000048000000000000000042000000005A -:101D0000000000420000000000004800810000E0E8 -:101D10000000480000000000000000420000000039 -:101D200000000000000000000000000000000000B3 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000747B00000000000000000000000083 -:101E70000000000000000000000000000000000062 -:101E8000DE2E747B00000000000000000000000057 -:101E90000000000000000000000000000000000042 -:101EA000DE2E000000000000000000000000000026 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000615603400000000000000231C5 -:101EF000E0000000000000000C40000000000000B6 -:101F000002C06A86615603400000000000000231F2 -:101F1000E0000000000000000C4000000000000095 -:101F200002C06A86000000000000000000000000FF -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F6000000000000000000000000000040020004D -:101F70002000200000000000000000000000000021 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000800080008000000C7 -:1022000000000000000000000000000000000000CE -:10221000410000000000000008000000080000006D -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E -:10227000000000000000000004000000000000005A -:10228000000000000000000000000000000000004E -:102290000000000000000000080000000000000036 -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD -:10233000000000000000000000000000000000009D -:10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D -:10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D -:102390000800000000000000000000000000000035 -:1023A0000800000000000000000000000000000025 -:1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD -:1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000300C9 -:10241000000000000000000041000000000000007B -:102420000000000000000000410000000000030068 -:10243000000000000000000000000000000000009C -:10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C -:10247000000000000000000000000000000000005C -:10248000000000000000000000000000000000004C -:10249000000000000000000000000000000000003C -:1024A000000000000000000000000000000000002C -:1024B000000000000000000000000000000000001C -:1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC -:1025000000000000000000000000000000000000CB -:1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000000003B -:1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA -:1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA -:10263000000000000000000000000000000000009A -:10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:10267000000000000000000000000000000000005A -:10268000000000000000000000000000000000004A -:10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A -:1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F00000000000000000000000000000000000DA -:1027000000000000000000000000000000000000C9 -:1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 -:102740000000000000000000000000000000000089 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:102840000000000000000000000000000000000088 -:102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 -:102880000000000000000000000000000000000048 -:102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 -:1028B0000000000000000000000000000000000018 -:1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000000000F8 -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 -:1029000000000000000000000000000000000000C7 -:1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:102940000000000000000000000000000000000087 -:102950000000000000000000000000000000000077 -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:102990000000000000000000000000000000000037 -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 -:1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 -:102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000000000076 -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 -:102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD00000000000000000000000000000000000F5 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 -:103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A -:10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A -:10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 -:103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 -:103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE -:1052D00000000000000000000000000000000000CE -:1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D -:10531000000000000000000000000000000000008D -:10532000000000000000000000000000000000007D -:10533000000000000000000000000000000000006D -:10534000000000000000000000000000000000005D -:10535000000000000000000000000000000000004D -:10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED -:1053C00000000000000000000000000000000000DD -:1053D00000000000000000000000000000000000CD -:1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000006C -:10544000000000000000000000000000000000005C -:10545000000000000000000000000000000000004C -:10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC -:1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:10556000000000000000000000000000000000003B -:10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B -:10559000000000000000000000000000000000000B -:1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000000000AB -:10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A -:10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:10568000000000000000000000000000000000001A -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 -:105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 -:1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 -:105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 -:105920000000000000000000000000000000000077 -:105930000000000000000000000000000000000067 -:105940000000000000000000000000000000000057 -:105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 -:105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000000000000000C7 -:1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 -:105A40000000000000000000000000000000000056 -:105A50000000000000000000000000000000000046 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000000000000F6 -:105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000000000D6 -:105AD00000000000000000000000000000000000C6 -:105AE00000000000000000000000000000000000B6 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 -:105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000000000000000E5 -:105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE00000000000000000000000000000000000B5 -:105BF00000000000000000000000000000000000A5 -:105C00000000000000000000000000000000000094 -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000000024 -:105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 -:105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000000000000000000E2 -:105EC00000000000000000000000000000000000D2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 -:105F00000000000000000000000000000000000091 -:105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000000061 -:105F40000000000000000000000000000000000051 -:105F50000000000000000000000000000000000041 -:105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 -:105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 -:106000000000000000000000000000000000000090 -:106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 -:106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:10611000000000000000000000000000000000007F -:10612000000000000000000000000000000000006F -:10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000000000000EF -:1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E -:10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D -:10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:10635000000000000000000000000000000000003D -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C -:10641000000000000000000000000000000000007C -:10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC -:1064C00000000000000000000000000000000000CC -:1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B -:10652000000000000000000000000000000000006B -:10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB -:1065B00000000000000000000000000000000000DB -:1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A -:10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 -:106730000000000000000000000000000000000059 -:106740000000000000000000000000000000000049 -:106750000000000000000000000000000000000039 -:106760000000000000000000000000000000000029 -:106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 -:1067900000000000000000000000000000000000F9 -:1067A00000000000000000000000000000000000E9 -:1067B00000000000000000000000000000000000D9 -:1067C00000000000000000000000000000000000C9 -:1067D00000000000000000000000000000000000B9 -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 -:106830000000000000000000000000000000000058 -:106840000000000000000000000000000000000048 -:106850000000000000000000000000000000000038 -:106860000000000000000000000000000000000028 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B00000000000000000000000000000000000D8 -:1068C00000000000000000000000000000000000C8 -:1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000000000000000000000000000057 -:106940000000000000000000000000000000000047 -:106950000000000000000000000000000000000037 -:106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 -:106980000000000000000000000000000000000007 -:1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 -:1069B00000000000000000000000000000000000D7 -:1069C00000000000000000000000000000000000C7 -:1069D00000000000000000000000000000000000B7 -:1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000000086 -:106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 -:106A40000000000000000000000000000000000046 -:106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 -:106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000000000000000000C6 -:106AD00000000000000000000000000000000000B6 -:106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 -:106B00000000000000000000000000000000000085 -:106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 -:106B30000000000000000000000000000000000055 -:106B40000000000000000000000000000000000045 -:106B50000000000000000000000000000000000035 -:106B60000000000000000000000000000000000025 -:106B70000000000000000000000000000000000015 -:106B80000000000000000000000000000000000005 -:106B900000000000000000000000000000000000F5 -:106BA00000000000000000000000000000000000E5 -:106BB00000000000000000000000000000000000D5 -:106BC00000000000000000000000000000000000C5 -:106BD00000000000000000000000000000000000B5 -:106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 -:106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000000000000000000D4 -:106CC00000000000000000000000000000000000C4 -:106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 -:106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 -:106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 -:106F50000000000000000000000000000000000031 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E -:1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D -:10740000000000000000000000000000000000007C -:10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C -:1074800000000000000000000000000000000000FC -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C -:10750000000000000000000000000000000000007B -:10751000000000000000000000000000000000006B -:10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B -:10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A -:10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA -:1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D00000000000000000000000000000000000AA -:1076E000000000000000000000000000000000009A -:1076F000000000000000000000000000000000008A -:107700000000000000000000000000000000000079 -:107710000000000000000000000000000000000069 -:107720000000000000000000000000000000000059 -:107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 -:107750000000000000000000000000000000000029 -:107760000000000000000000000000000000000019 -:107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 -:1077900000000000000000000000000000000000E9 -:1077A00000000000000000000000000000000000D9 -:1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 -:1077D00000000000000000000000000000000000A9 -:1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 -:107810000000000000000000000000000000000068 -:107820000000000000000000000000000000000058 -:107830000000000000000000000000000000000048 -:107840000000000000000000000000000000000038 -:107850000000000000000000000000000000000028 -:107860000000000000000000000000000000000018 -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000000000000000000098 -:1078F0000000000000000000000000000000000088 -:107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 -:107920000000000000000000000000000000000057 -:107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 -:107950000000000000000000000000000000000027 -:107960000000000000000000000000000000000017 -:107970000000000000000000000000000000000007 -:1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 -:1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C00000000000000000000000000000000000B7 -:1079D00000000000000000000000000000000000A7 -:1079E0000000000000000000000000000000000097 -:1079F0000000000000000000000000000000000087 -:107A00000000000000000000000000000000000076 -:107A10000000000000000000000000000000000066 -:107A20000000000000000000000000000000000056 -:107A30000000000000000000000000000000000046 -:107A40000000000000000000000000000000000036 -:107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 -:107A70000000000000000000000000000000000006 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 -:107AA00000000000000000000000000000000000D6 -:107AB00000000000000000000000000000000000C6 -:107AC00000000000000000000000000000000000B6 -:107AD00000000000000000000000000000000000A6 -:107AE0000000000000000000000000000000000096 -:107AF0000000000000000000000000000000000086 -:107B00000000000000000000000000000000000075 -:107B10000000000000000000000000000000000065 -:107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 -:107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 -:107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000000D5 -:107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000000000000000B5 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000000095 -:107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 -:107C10000000000000000000000000000000000064 -:107C20000000000000000000000000000000000054 -:107C30000000000000000000000000000000000044 -:107C40000000000000000000000000000000000034 -:107C50000000000000000000000000000000000024 -:107C60000000000000000000000000000000000014 -:107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD00000000000000000000000000000000000A4 -:107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 -:107D20000000000000000000000000000000000053 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 -:107D50000000000000000000000000000000000023 -:107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 -:107DB00000000000000000000000000000000000C3 -:107DC00000000000000000000000000000000000B3 -:107DD00000000000000000000000000000000000A3 -:107DE0000000000000000000000000000000000093 -:107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 -:107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 -:107E70000000000000000000000000000000000002 -:107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 -:107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 -:107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000000000000000092 -:107EF0000000000000000000000000000000000082 -:107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 -:107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000000000000000000021 -:107F60000000000000000000000000000000000011 -:107F70000000000000000000000000000000000001 -:107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 -:107FA00000000000000000000000000000000000D1 -:107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 -:107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000000091 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 -:108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:108050000000000000000000000000000000000020 -:108060000000000000000000000000000000000010 -:108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000000000000000000090 -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000000000000EF -:1081900000000000000000000000000000000000DF -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F -:10820000000000000000000000000000000000006E -:10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE -:1082800000000000000000000000000000000000EE -:1082900000000000000000000000000000000000DE -:1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E -:1082E000000000000000000000000000000000008E -:1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:10831000000000000000000000000000000000005D -:10832000000000000000000000000000000000004D -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D -:1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED -:1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D -:1083E000000000000000000000000000000000008D -:1083F000000000000000000000000000000000007D -:10840000000000000000000000000000000000006C -:10841000000000000000000000000000000000005C -:10842000000000000000000000000000000000004C -:10843000000000000000000000000000000000003C -:10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C -:10846000000000000000000000000000000000000C -:1084700000000000000000000000000000000000FC -:1084800000000000000000000000000000000000EC -:1084900000000000000000000000000000000000DC -:1084A00000000000000000000000000000000000CC -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000000AC -:1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C -:1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B -:10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000000FB -:1085800000000000000000000000000000000000EB -:1085900000000000000000000000000000000000DB -:1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B -:10860000000000000000000000000000000000006A -:10861000000000000000000000000000000000005A -:10862000000000000000000000000000000000004A -:10863000000000000000000000000000000000003A -:10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A -:1086700000000000000000000000000000000000FA -:1086800000000000000000000000000000000000EA -:1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A -:1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000000069 -:108710000000000000000000000000000000000059 -:108720000000000000000000000000000000000049 -:108730000000000000000000000000000000000039 -:108740000000000000000000000000000000000029 -:108750000000000000000000000000000000000019 -:108760000000000000000000000000000000000009 -:1087700000000000000000000000000000000000F9 -:1087800000000000000000000000000000000000E9 -:1087900000000000000000000000000000000000D9 -:1087A00000000000000000000000000000000000C9 -:1087B00000000000000000000000000000000000B9 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000000000000089 -:1087F0000000000000000000000000000000000079 -:108800000000000000000000000000000000000068 -:108810000000000000000000000000000000000058 -:108820000000000000000000000000000000000048 -:108830000000000000000000000000000000000038 -:108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000000000E8 -:1088900000000000000000000000000000000000D8 -:1088A00000000000000000000000000000000000C8 -:1088B00000000000000000000000000000000000B8 -:1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000000000000000000098 -:1088E0000000000000000000000000000000000088 -:1088F0000000000000000000000000000000000078 -:108900000000000000000000000000000000000067 -:108910000000000000000000000000000000000057 -:108920000000000000000000000000000000000047 -:108930000000000000000000000000000000000037 -:108940000000000000000000000000000000000027 -:108950000000000000000000000000000000000017 -:108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000000F7 -:1089800000000000000000000000000000000000E7 -:1089900000000000000000000000000000000000D7 -:1089A00000000000000000000000000000000000C7 -:1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000000097 -:1089E0000000000000000000000000000000000087 -:1089F0000000000000000000000000000000000077 -:108A00000000000000000000000000000000000066 -:108A10000000000000000000000000000000000056 -:108A20000000000000000000000000000000000046 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 -:108A700000000000000000000000000000000000F6 -:108A800000000000000000000000000000000000E6 -:108A900000000000000000000000000000000000D6 -:108AA00000000000000000000000000000000000C6 -:108AB00000000000000000000000000000000000B6 -:108AC00000000000000000000000000000000000A6 -:108AD0000000000000000000000000000000000096 -:108AE0000000000000000000000000000000000086 -:108AF0000000000000000000000000000000000076 -:108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B20000000000000000000000000000000000045 -:108B30000000000000000000000000000000000035 -:108B40000000000000000000000000000000000025 -:108B50000000000000000000000000000000000015 -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B800000000000000000000000000000000000E5 -:108B900000000000000000000000000000000000D5 -:108BA00000000000000000000000000000000000C5 -:108BB00000000000000000000000000000000000B5 -:108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000000000000000075 -:108C00000000000000000000000000000000000064 -:108C10000000000000000000000000000000000054 -:108C20000000000000000000000000000000000044 -:108C30000000000000000000000000000000000034 -:108C40000000000000000000000000000000000024 -:108C50000000000000000000000000000000000014 -:108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 -:108CC00000000000000000000000000000000000A4 -:108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 -:108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000000000053 -:108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000000E3 -:108D900000000000000000000000000000000000D3 -:108DA00000000000000000000000000000000000C3 -:108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE0000000000000000000000000000000000083 -:108DF0000000000000000000000000000000000073 -:108E00000000000000000000000000000000000062 -:108E10000000000000000000000000000000000052 -:108E20000000000000000000000000000000000042 -:108E30000000000000000000000000000000000032 -:108E40000000000000000000000000000000000022 -:108E50000000000000000000000000000000000012 -:108E60000000000000000000000000000000000002 -:108E700000000000000000000000000000000000F2 -:108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 -:108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F900000000000000000000000000000000000D1 -:108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 -:108FF0000000000000000000000000000000000071 -:109000000000000000000000000000000000000060 -:109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 -:109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:10913000000000000000000000000000000000002F -:10914000000000000000000000000000000000001F -:10915000000000000000000000000000000000000F -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF -:1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000000000000AF -:1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000000000008F -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E -:10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E -:1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD -:1093C000000000000000000000000000000000009D -:1093D000000000000000000000000000000000008D -:1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C -:10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C -:10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C -:1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000000000003B -:10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB -:1095C000000000000000000000000000000000009B -:1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A -:10963000000000000000000000000000000000002A -:10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A -:1096D000000000000000000000000000000000008A -:1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000000000000B9 -:1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 -:109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000000000098 -:1098D0000000000000000000000000000000000088 -:1098E0000000000000000000000000000000000078 -:1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 -:109940000000000000000000000000000000000017 -:109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 -:1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 -:1099B00000000000000000000000000000000000A7 -:1099C0000000000000000000000000000000000097 -:1099D0000000000000000000000000000000000087 -:1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 -:109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000036 -:109A30000000000000000000000000000000000026 -:109A40000000000000000000000000000000000016 -:109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000000B6 -:109AB00000000000000000000000000000000000A6 -:109AC0000000000000000000000000000000000096 -:109AD0000000000000000000000000000000000086 -:109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000000066 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B40000000000000000000000000000000000015 -:109B50000000000000000000000000000000000005 -:109B600000000000000000000000000000000000F5 -:109B700000000000000000000000000000000000E5 -:109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000000000000000A5 -:109BC0000000000000000000000000000000000095 -:109BD0000000000000000000000000000000000085 -:109BE0000000000000000000000000000000000075 -:109BF0000000000000000000000000000000000065 -:109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 -:109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 -:109C40000000000000000000000000000000000014 -:109C50000000000000000000000000000000000004 -:109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000000E4 -:109C800000000000000000000000000000000000D4 -:109C900000000000000000000000000000000000C4 -:109CA00000000000000000000000000000000000B4 -:109CB00000000000000000000000000000000000A4 -:109CC0000000000000000000000000000000000094 -:109CD0000000000000000000000000000000000084 -:109CE0000000000000000000000000000000000074 -:109CF0000000000000000000000000000000000064 -:109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 -:109D30000000000000000000000000000000000023 -:109D40000000000000000000000000000000000013 -:109D50000000000000000000000000000000000003 -:109D600000000000000000000000000000000000F3 -:109D700000000000000000000000000000000000E3 -:109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000000B3 -:109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000000000000000093 -:109DD0000000000000000000000000000000000083 -:109DE0000000000000000000000000000000000073 -:109DF0000000000000000000000000000000000063 -:109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 -:109E40000000000000000000000000000000000012 -:109E50000000000000000000000000000000000002 -:109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 -:109EC0000000000000000000000000000000000092 -:109ED0000000000000000000000000000000000082 -:109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 -:109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 -:109F30000000000000000000000000000000000021 -:109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000000001 -:109F600000000000000000000000000000000000F1 -:109F700000000000000000000000000000000000E1 -:109F800000000000000000000000000000000000D1 -:109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000000081 -:109FE0000000000000000000000000000000000071 -:109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 -:10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 -:10A030000000000000000000000000000000000020 -:10A040000000000000000000000000000000000010 -:10A050000000000000000000000000000000000000 -:10A0600000000000000000000000000000000000F0 -:10A0700000000000000000000000000000000000E0 -:10A0800000000000000000000000000000000000D0 -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 -:10A0C0000000000000000000000000000000000090 -:10A0D0000000000000000000000000000000000080 -:10A0E0000000000000000000000000000000000070 -:10A0F0000000000000000000000000000000000060 -:10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A1500000000000000000000000000000000000FF -:10A1600000000000000000000000000000000000EF -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F -:10A1D000000000000000000000000000000000007F -:10A1E000000000000000000000000000000000006F -:10A1F000000000000000000000000000000000005F -:10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E -:10A2F000000000000000000000000000000000005E -:10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D -:10A33000000000000000000000000000000000001D -:10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD -:10A3600000000000000000000000000000000000ED -:10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000000CD -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D -:10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC -:10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000000000000000006C -:10A4F000000000000000000000000000000000005C -:10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000000000001B -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000000000FB -:10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000000000000000DB -:10A5800000000000000000000000000000000000CB -:10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB -:10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E000000000000000000000000000000000006B -:10A5F000000000000000000000000000000000005B -:10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000000FA -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000040000C5 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F0000000000000000000000000000000000058 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 -:10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC30000000000000000000000000000000000014 -:10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000000000000000000013 -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000000000000A2 -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000000000000000000000006B -:10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 -:10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000080008000000000000000000000056 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000001000000E3 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD000000000000000000000000000000008005C -:10BCE0000000080000000000080000000000000044 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 -:10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000000000000022 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C690000000000000000004000000000000000096 -:10C6A000000000000000000000000000000000008A -:10C6B0000000000000000000000100000000000079 -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000100000000000018 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 -:10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 -:10C98000000000000000080000008200820000009B -:10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA9000000000000800000000000000000000008E -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 -:10CB9000000000000000080000000000000000008D -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC9000000084000000010000008400000001008A -:10CCA0000001010000C000000000000000000000C2 -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000080000000030000008000000010 -:10CD20000300000502000080000000000000000079 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000300000000800000000010 -:10CDA00000000000900020000020000000000000B3 -:10CDB0000000004100000000000000000000000032 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE100000000000000000000100000000C0000051 -:10CE2000A0000000000041004008009140004000C8 -:10CE300000000000000100000000000000000000F1 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE9000000000000000000000000000C0000000D2 -:10CEA0000000000000000000000200000000000080 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000800091 -:10CF20000000000000000000000000800000000081 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000800011 -:10CFA00000C10000000000000000000000418000FF -:10CFB0000020000000000000000000000000000051 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D02000400000C10000000000000000000000837C -:10D0300004000001000000000000000000000000EB -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000000000000090 -:10D0A000000000000000004200000000000000003E -:10D0B000810000E000004800000000000000004285 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D22000000000000000747B00000000000000000F -:10D2300000000000000000000000000000000000EE -:10D2400000000000DE2E00000000000000000000D2 -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E -:10D2A0000000000000000000615603400000000084 -:10D2B00000000231E0000000000000000C4000000F -:10D2C0000000000002C06A860000000000000000AC -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000000000000FD -:10D3300000000000000000000000000000000000ED -:10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D -:10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC -:10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000041002A -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA -:10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D69000000000000000000000000000000000008A -:10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000000000005A -:10D6D000000000000000000000000000000000004A -:10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 -:10D7200000000000000000000000000000000000F9 -:10D730000000000000000000000000000000C00029 -:10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 -:10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000080051 -:10D7D0000000080000000000000000000000000041 -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 -:10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 -:10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000000037 -:10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 -:10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 -:10DA600000000000000000000000000000000000B6 -:10DA700000000000000000000000000000000000A6 -:10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 -:10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 -:10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000000000000085 -:10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 -:10DBD0000000000000000000000000000000000045 -:10DBE0000000000000000000000000000000000035 -:10DBF0000000000000000000000000000000000025 -:10DC00000000000000000000000000000000000014 -:10DC10000000000000000000000000000000000004 -:10DC200000000000000000000000000000000000F4 -:10DC300000000000000000000000000000000000E4 -:10DC400000000000000000000000000000000000D4 -:10DC500000000000000000000000000000000000C4 -:10DC600000000000000000000000000000000000B4 -:10DC700000000000000000000000000000000000A4 -:10DC80000000000000000000000000000000000094 -:10DC90000000000000000000000000000000000084 -:10DCA0000000000000000000000000000000000074 -:10DCB0000000000000000000000000000000000064 -:10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 -:10DCE0000000000000000000000000000000000034 -:10DCF0000000000000000000000000000000000024 -:10DD00000000000000000000000000000000000013 -:10DD10000000000000000000000000000000000003 -:10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000000000000C3 -:10DD600000000000000000000000000000000000B3 -:10DD700000000000000000000000000000000000A3 -:10DD80000000000000000000000000000000000093 -:10DD90000000000000000000000000000000000083 -:10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000000000000053 -:10DDD0000000000000000000000000000000000043 -:10DDE0000000000000000000000000000000000033 -:10DDF0000000000000000000000000000000000023 -:10DE00000000000000000000000000000000000012 -:10DE10000000000000000000000000000000000002 -:10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000000000000000E2 -:10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000000000000B2 -:10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000000000092 -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 -:10DED0000000000000000000000000000000000042 -:10DEE0000000000000000000000000000000000032 -:10DEF0000000000000000000000000000000000022 -:10DF00000000000000000000000000000000000011 -:10DF10000000000000000000000000000000000001 -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000000000000E1 -:10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000000000000C1 -:10DF600000000000000000000000000000000000B1 -:10DF700000000000000000000000000000000000A1 -:10DF80000000000000000000000000000000000091 -:10DF90000000000000000000000000000000000081 -:10DFA0000000000000000000000000000000000071 -:10DFB0000000000000000000000000000000000061 -:10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000000000000031 -:10DFF0000000000000000000000000000000000021 -:10E000000000000000000000000000000000000010 -:10E010000000000000000000000000000000000000 -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 -:10E0400000000000000000000000000000000000D0 -:10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 -:10E0700000000000000000000000000000000000A0 -:10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000000000060 -:10E0C0000000000000000000000000000000000050 -:10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 -:10E0F0000000000000000000000000000000000020 -:10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000000000FF -:10E1200000000000000000000000000000000000EF -:10E1300000000000000000000000000000000000DF -:10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000000BF -:10E1600000000000000000000000000000000000AF -:10E17000000000000000000000000000000000009F -:10E18000000000000000000000000000000000008F -:10E19000000000000000000000000000000000007F -:10E1A000000000000000000000000000000000006F -:10E1B000000000000000000000000000000000005F -:10E1C000000000000000000000000000000000004F -:10E1D000000000000000000000000000000000003F -:10E1E000000000000000000000000000000000002F -:10E1F000000000000000000000000000000000001F -:10E20000000000000000000000000000000000000E -:10E2100000000000000000000000000000000000FE -:10E2200000000000000000000000000000000000EE -:10E2300000000000000000000000000000000000DE -:10E2400000000000000000000000000000000000CE -:10E2500000000000000000000000000000000000BE -:10E2600000000000000000000000000000000000AE -:10E27000000000000000000000000000000000009E -:10E28000000000000000000000000000000000008E -:10E29000000000000000000000000000000000007E -:10E2A000000000000000000000000000000000006E -:10E2B000000000000000000000000000000000005E -:10E2C000000000000000000000000000000000004E -:10E2D000000000000000000000000000000000003E -:10E2E000000000000000000000000000000000002E -:10E2F000000000000000000000000000000000001E -:10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD -:10E3200000000000000000000000000000000000ED -:10E3300000000000000000000000000000000000DD -:10E3400000000000000000000000000000000000CD -:10E3500000000000000000000000000000000000BD -:10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D -:10E3A000000000000000000000000000000000006D -:10E3B000000000000000000000000000000000005D -:10E3C000000000000000000000000000000000004D -:10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000001D -:10E40000000000000000000000000000000000000C -:10E4100000000000000000000000000000000000FC -:10E4200000000000000000000000000000000000EC -:10E4300000000000000000000000000000000000DC -:10E4400000000000000000000000000000000000CC -:10E4500000000000000000000000000000000000BC -:10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C -:10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C -:10E4C000000000000000000000000000000000004C -:10E4D000000000000000000000000000000000003C -:10E4E000000000000000000000000000000000002C -:10E4F000000000000000000000000000000000001C -:10E500000000080000000000000000000000000003 -:10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000000000000CB -:10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C000000000000000000000000000000000004B -:10E5D000000000000000000000000000000000003B -:10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A -:10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000000000EA -:10E6300000000000000000000000000000000000DA -:10E6400000000000000000000000000000000000CA -:10E6500000000000000000000000000000000000BA -:10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000000000000009A -:10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A -:10E6A000000000000000000000000000000000006A -:10E6B000000000000000000000000000000000005A -:10E6C000000000000000000000000000000000004A -:10E6D000000000000000000000000000000000003A -:10E6E000000000000000000000000000000000002A -:10E6F000000000000000000000000000000000001A -:10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000000F9 -:10E7200000000000000000000000000000000000E9 -:10E7300000000000000000000000000000000000D9 -:10E7400000000000000000000000000000000000C9 -:10E7500000000000000000000000000000000000B9 -:10E7600000000000000000000000000000000000A9 -:10E770000000000000000000000000000000000099 -:10E780000000000000000000000000000000000089 -:10E790000000000000000000000000000000000079 -:10E7A0000000000000000000000000000000000069 -:10E7B0000000000000000000000000000000000059 -:10E7C0000000000000000000000000000000000049 -:10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000000000000000000000029 +:10E7E0000800000000000000000000000000000021 :10E7F0000000000000000000000000000000000019 :10E800000000000000000000000000000000000008 :10E8100000000000000000000000000000000000F8 @@ -36914,7 +36914,7 @@ :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E -:1002A0000000000000000001000000010048000004 +:1002A000000000000000800100008001000000004C :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E @@ -36922,7 +36922,7 @@ :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD -:10032000000000000000000020800000000000002D +:10032000000000000000000000900000000000003D :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D @@ -36930,27 +36930,27 @@ :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D +:1003A0000000000000000000000040000004000009 :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F0000000A40000000000000000000000000059 :1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000800000000000000B4 -:1004400000000002000000000000000000000000AA +:100410000000000000000000000000040A000000CE +:10042000000000006000000000000000000000006C +:1004300000000000000000000000000000000000BC +:1004400000000008000000000000000000000000A4 :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C -:1004700000002000880000002000C00020000000D4 -:1004800020002000200020002000200000000000AC -:1004900088002000880000002000200020000000CC -:1004A0002000200088002000200020000000000024 -:1004B0000000200020008800000020000400200030 -:1004C0000000200020008800200020002000000004 -:1004D000000020002000200000002000200020005C -:1004E00000008800200020002000200020000000E4 +:1004700088008800880000000000200000000000C4 +:100480002000200020000000880020000000000064 +:100490002000200020000000880020000000000054 +:1004A00020002000200000002000200000000000AC +:1004B000000020002000200000002000200000009C +:1004C000000020002000C0000000200020000000EC +:1004D00000000000C00020000000200020000000FC +:1004E0000000200020008800000000002000000024 :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB @@ -36959,27 +36959,27 @@ :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B -:100570000000000000000000000000000000100269 +:100570000000000000000000000000000000400833 :10058000000000000000000000000000000000006B -:100590000000000000004008000000000000000013 -:1005A0000000000000001002000000000000000039 +:100590000000000000001002000000000000000049 +:1005A0000000000000004008000000000000000003 :1005B000000000000000000000000000000000003B :1005C0000000000000000000100200000000000019 :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B -:1005F000100200000000000800840000000000005D -:100600008001000000000000000000000000004029 -:1006100000080000000000828001000000000000CF +:1005F00010000000000000000000000000000000EB +:100600008001000000000000000000000002000067 +:100610000008000000000000800100000000000051 :100620000000000000000000800100000000000049 :1006300000080000000000000000000000000000B2 :100640000000000000000000000080010000000029 :100650000000000800000000000000000000000092 -:10066000000000000000000000000000000000008A -:1006700000008009000000000000000000000000F1 -:100680000000000000000000000000110000000059 +:10066000000000000000000000000000200000006A +:1006700000008008000000000000000000000000F2 +:10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A +:1006B0000000000000020000000000000000000038 :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A @@ -36990,16 +36990,16 @@ :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 -:100760000000000000000000000000000000002069 +:100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 -:1007800008000000000000000000000084000000DD -:1007900082000000000000000000000000000000D7 -:1007A0000800000000000000000000000000000041 -:1007B0000800000000000000000000000000000031 -:1007C0000000080000000000000000000000C00061 -:1007D000000008000000000000000000000082008F -:1007E0000000000000000000000000000000080001 -:1007F0008400000000000000000000000000000075 +:1007800000000000C00000000000000000000000A9 +:100790000000000008000000000000000000000051 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000080000000000000000000000000011 +:1007E00008008200C00000000000000000000000BF +:1007F00082008200000000000100000000000000F4 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 @@ -37007,16 +37007,16 @@ :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 :100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000004000000000000000000000000000064 +:100870000000000000000000000040000000000038 +:100880000000080000000000000000000000000060 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000800000020 +:1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 -:1008E00000000000000000000000002000000000E8 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 +:1008E00000000800000000004000001100000000AF +:1008F0000000000000000000820000000000000076 +:1009000000200000000000000000000000000000C7 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 @@ -37027,11 +37027,11 @@ :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 -:1009B00000000000000000008200000000000000B5 +:1009B000000000000000000008000000000000002F :1009C0000000000000000000000000000000000027 :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 +:1009F00000000000000000000000000000000800EF :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 @@ -37044,7 +37044,7 @@ :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 -:100AC0000000000000000000900000000000000096 +:100AC0000000000000000000000000000000000026 :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 @@ -37052,7 +37052,7 @@ :100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 :100B300000000000000000000000000000000000B5 -:100B400000000000000000020000000000000000A3 +:100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 :100B60000000000000000000000000000000000085 :100B70004000000000000000000000000000000035 @@ -37061,17 +37061,17 @@ :100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 -:100BD0000003000000000000000000000000000012 +:100BD000000800000000000000000000000000000D :100BE0000000000000000000000000000000000005 -:100BF00000008000800000000008000000000000ED +:100BF00000008000800000000020000000000000D5 :100C000000000000000000000000000000000000E4 :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 -:100C40000000000000000000000000000000100094 +:100C40000000000000000000000000000000900014 :100C50000000000100000000000000000000000093 :100C60000000000000000000000000000000000084 -:100C700000000000100082000000002100000000C1 +:100C700000000000100082000000000800000000DA :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 @@ -37093,10 +37093,10 @@ :100DA0000000000000000000000000000000000043 :100DB0000000000000000000000000000000000033 :100DC0000000000000000000000000000000000023 -:100DD00000020005000000001000000000000000FC +:100DD0000002000500000000080000000000000004 :100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 -:100E000004000000000000000000000000000000DE +:100E000003000000000000000000000000000000DF :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 :100E300000000000000000000000000000000000B2 @@ -37109,10 +37109,10 @@ :100EA0000000000000000000000000000000000042 :100EB0000000000000000000000000000000000032 :100EC0000000000000000000000000000000000022 -:100ED000000000000000818100500A00900900001D +:100ED000000000000000818100900900C84300006C :100EE0000000000000000000000000000000000002 :100EF0000000000000000000000000000000884129 -:100F000000500A00900900000000000000000000EE +:100F000000900900C843000000000000000000003D :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 @@ -37133,18 +37133,18 @@ :10102000000002000000000000400000000000007E :1010300000000000000000000000020000000000AE :10104000004000000000000000000200000000005E -:1010500000400000000000000000000000400320ED -:1010600004C00200000000000000000002000000B8 +:101050000040000000000000000000000040030805 +:1010600010C00200000000000000000002000000AC :101070000000004000000000000000000000000030 -:10108000000000000040032004C002000000000037 +:10108000000000000040030810C002000000000043 :10109000000000000200000000000040000000000E :1010A0000000000000000000000000000000000040 :1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 :1010D0000000000000000000000000000000080206 -:1010E000002004004010000000000000000000008C +:1010E0000008100040100000000000000000000098 :1010F00000000000000000000000000000000000F0 -:101100000000000000000802002004004010000061 +:10110000000000000000080200081000401000006D :1011100000000000000000000000000000000000CF :1011200000000000000000000000000000000000BF :1011300000000000000000000000000000000000AF @@ -37187,18 +37187,18 @@ :10138000000000000000000000000000000000005D :10139000000000909A000000000000000000000023 :1013A0000000000900000000000000000000000034 -:1013B000000000004000200040000000000000008D +:1013B00000000000400020000000000000000000CD :1013C00000000000000020000000000000000000FD -:1013D00000000000200020002000000000000000AD -:1013E0000000000000008800000000000000000075 -:1013F000000000000000200020002000000000008D -:1014000000000000000000000000000000000000DC -:10141000000000000000200000002000000000008C -:1014200000000000000000000000000000000000BC +:1013D000000000002000200040000000000000008D +:1013E0000000000088002000000000000000000055 +:1013F00000000000000020002000000000000000AD +:1014000000000000000020000000000000000000BC +:10141000000000000000200020000000000000008C +:10142000000000000000200000000000000000009C :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C -:10146000000000000000000020000000000000005C +:10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C @@ -37211,10 +37211,10 @@ :1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB :1015200000000000000000000000000000000000BB -:1015300000000000000000000000000400040000A3 -:10154000000000000000000000000008000400008F +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B -:101560000000000000000000000000040000000077 +:10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B @@ -37223,22 +37223,22 @@ :1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB -:1015F000000000000000000000000080000000006B +:1015F00000000000000000000000000000000000EB :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA -:101630000000000000000000210000000000080081 +:1016300000000000000000000000000000000000AA :10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000404A +:10165000000000000000000000000000000000008A :10166000000000000000000000000000000000007A -:10167000000000000000000000000000004000002A -:10168000000000200000000000000000000000003A -:101690000000000000000000000021000000000029 -:1016A0000000080000000000000000000000000032 +:10167000000000000000000000000000000000006A +:101680000000000008000000000000000000000052 +:10169000000008000000000000000500000000003D +:1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A :1016C000000000000000000000000000000000001A :1016D000000000000000000000000000000000000A -:1016E00000001000000000000000000000000000EA +:1016E00010000000000000000000000000000000EA :1016F00000000000000000000000000000000000EA :1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 @@ -37255,4115 +37255,18 @@ :1017C0000000000000000000000000000000000019 :1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 +:1017F00000000000000000000000010000000000E8 :1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 :1018300000000000000000000000000000000000A8 :101840000000000000000000000000000000000098 -:101850000000000000000000020000000000000086 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000001000000058 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000040000000034 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000008000000BF -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000001000000000000020 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE -:1022100000000000000000000000000000000000BE -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E -:10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD -:10233000000000000000000000000000000000009D -:10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D -:10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D -:1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD -:1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000010CD -:1024000000000000000000000000000000000010BC -:1024100000000000000000000000000000000000BC -:1024200000000000000000000000000000000000AC -:10243000001000000000000000000000000000008C -:10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C -:10247000000000000000000000000000000000005C -:10248000000000000000000000000000000000004C -:10249000000000000000000000000000000000003C -:1024A000000000000000000000000000000000002C -:1024B000000000000000000000000000000000001C -:1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC -:1024F0000000840000000000000000000000000058 -:1025000000000000000000000000000000000000CB -:1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000000003B -:1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA -:1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA -:10263000000000000000000000000000000000009A -:10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:1026700000001000400003004100050000000000C1 -:102680000000000000000000210000000000000029 -:10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A -:1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000010000000000000000000000000DA -:1026F00000000000000000000000000000000000DA -:1027000000000000000000000000000000000000C9 -:1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 -:102740000000000000000000000000000000000089 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:102800000000000000008200000000000000000046 -:1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:102840000000000000000000000000000000000088 -:102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000001000000048 -:102880000000000000000000000000000000000048 -:102890000800000000000000000000000000000030 -:1028A0000000000000000000000000000000000028 -:1028B0000000000000000000000000000000000018 -:1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000000000F8 -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 -:1029000000000000000000000000000000000000C7 -:1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:102940000000000000000000000000000000000087 -:102950000000000000000000000000000000000077 -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:102990000000000000000000000000000000000037 -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 -:1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 -:102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000000000076 -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 -:102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD00000000000000000000000000000000000F5 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 -:103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000021C -:1032B000000200000000000000000000000000828A -:1032C00001200000000000000000000000000002DB -:1032D00000020000000000000000000000000002EA -:1032E00000000001000000000000000000000000DD -:1032F00000020000000000000000000000000000CC -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000001000000000000000000000008D -:10333000000000000000000000000000000000008D -:103340000020080100000000000000000000000054 -:10335000000000004000000000000000000000002D -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000010001D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C0000000008820020000000000000000000053 -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C -:1034400000000000000580010000000000000000F6 -:10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000004000000A7 -:103520000000000000000000000000000900000092 -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A0000000000000000000000000000000840097 -:1035B00084000000C000000000000000A000C00067 -:1035C000000000000000000000000000008000007B -:1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA -:103610000000000000000041000000000000000069 -:10362000000000000000000000000000000000009A -:10363000000000000000000000000000000000008A -:103640000000000000000000000000000000000872 -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A -:10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000A00000000000C0000000AA -:1036C00008000000000000000000000000000000F2 -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 -:103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B000000000000000C000000040000800000001 -:1037C00082000800000000000000000082000000ED -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C000000000002000000000900000C0000090F8 -:1038D000C0820000C00000010000000000000000E5 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000004005000000004108000008C10020 -:1039500000008080000080000003000000000000E4 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00002000000000000000200000003001000E0 -:1039D000050000050300000000000080804000009A -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000010000000000000001000000010073 -:103A500041002008000001009000000000C082002A -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD0004001008200000100000000000000000022 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B500000410002000000004100000000000000E1 -:103B60000041000000000000000000000000000014 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC000000000000000000000020083000000026E -:103BD00000000500000000418000002000000041BE -:103BE00000000000050200000000000000000000CE -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C4000000000000000000000008201008300006E -:103C5000000120008200000000410200000000007E -:103C60000001000000000041000000000000000012 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000811200E08000F1 -:103CE00048420000000000004842000000000000C0 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E5000757B000000000000000000000000000072 -:103E60000000000000000000000000000000DEAEC6 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED0000000612603400000000000000230A00046 -:103EE0000000000000000C4000000000000002C0C4 -:103EF00064860000000000000000000000000000D8 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000002000000031 -:103F70000000200000000000000000000000000021 -:103F80000000000000000000000000002000000011 -:103F90000000200000000000000000000000000001 -:103FA00000000000000000000000000000002000F1 -:103FB00000000000200000000000000000000000E1 -:103FC00000000000000000000000000000002000D1 -:103FD00000000000200000000000000000000000C1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:1040400000000000009000000000000000000002DE -:104050000000000000000000000000000000000060 -:104060000000000000000040000000000000900080 -:104070000000000000000000000000000000004000 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B00000400000000000000000000000000000C0 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000100000000000000000000000000000C0 -:1040F00000080000000000000000000000000000B8 -:1041000000000000000000000000000000000000AF -:10411000004000000000000000000000000000005F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E000410003000000000008000000040000007F -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:1042600000000000000000000000000000008200CC -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000001000000000000100DD -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000010000000000000AE -:1043000000000000000000000000000000000000AD -:10431000000000000000000000100000000000008D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:104350000800000000000000000000000000000055 -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000009000000C4 -:1043F00000000800000000000800000009000000A4 -:1044000000000000030000000000000000000000A9 -:10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C000000000000000000000000000000001806B -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:104550000810100000000000000000000000000033 -:104560000000030000000000000002000000000046 -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E900000000000000000002000200000000000D2 -:104EA00000000000000000002000000000002000C2 -:104EB00000000000000000002000200000000000B2 -:104EC00000000000000000002000000000002000A2 -:104ED0000000000000000000000020002000000092 -:104EE00000000000000000000000200000000000A2 -:104EF0000000000000000000000020002000000072 -:104F00000000000000000000000020000000000081 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000400000000000000000000000000031 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F6000000000020000000000000000000000003F -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA00000100010000000000000000000000000E1 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF0000000000000000400022000200400000067 -:105000000000000000000200022004000440000034 -:105010000000000000000000000000000008000088 -:1050200000000000008800000000000000000000F8 -:105030000000000000000000000000000008000068 -:1050400000000000008800000000000000000000D8 -:105050000000000000000000000000000000000848 -:105060000000000000000000000000000000000040 -:10507000000000000000000080008001000180822C -:10508000000000000000000080008001800080011E -:105090000000000000000000000000000000000010 -:1050A0000000000000000808080088000000000060 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:105100000000000000000000000000030000000597 -:105110000000000000000000000800000000000087 -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F0000000C000000000000000000008000000E7 -:1052000000008200000002000000000000000020FA -:10521000000000400000000000000000000000004E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000080000000000000009E -:10529000000100000001000000000000000000000C -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE -:1052D00000000000000000000000000000000000CE -:1052E00000000000000000000000000000000000BE -:1052F00004000000000000000000000000000000AA -:105300000800000000000000000002400000A000B3 -:10531000002100000000000000000000000000006C -:105320000041000000000400000000000000000038 -:105330000000000000000800000000000000000065 -:10534000000000000000000000000000000000005D -:10535000000000000000000000000000000000004D -:10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:10538000000000000000000000000000800100009C -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED -:1053C00000000000000000000000000000000000DD -:1053D00000000000000000000000000000000000CD -:1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:1054000000000000000000000000C000000002409A -:105410000000A00082000000000000000000000367 -:105420000000000900210000000000000000000052 -:10543000000000000000000000000000000000006C -:10544000000000000000000000000000000000005C -:10545000000000000000000000000000000000004C -:10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000800100000000000000000000000000008B -:1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC -:1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:105500000000000000000000000000C010A000101B -:10551000C0C0000000000000000000C01040008279 -:105520000402000000000000000000000000000075 -:10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:10556000000000000000000000000000000000003B -:10557000000000000000000000000000000000002B -:105580000000000000000000000000000280800019 -:1055900000808000000000000000000010800080FB -:1055A00000008080000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000000000AB -:10560000000000000000000000000000000080001A -:1056100000418000800000000000000000008000C9 -:1056200080030041808000000000000000000000B6 -:10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:10568000000000000000000000000000000000001A -:105690000800A0011000C08400000000000000000D -:1056A000400040028201C00800000000000000002D -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F00000010000000000000000000000000000A9 -:105700000000000000000000000000000000000099 -:105710000000C00800A0004000C000000000000021 -:10572000000002040082108401C00000000000009C -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000100000000000000000000000028 -:105780000000000000000000000000000000000019 -:105790000000000080800000008000800000000009 -:1057A000000000008980008000804180000000002F -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 -:1057F00000000000000100000000000000000000A8 -:105800000000000000000000000000000000000098 -:105810000000000000008020804080820000000026 -:105820000000000000008000804080880000000030 -:105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 -:105870000000000000000001000000000000000027 -:105880000000000000000000000000000000000018 -:105890000000000000000000C001200040C0C01057 -:1058A0000000000000000000C000820084054010DD -:1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000800007 -:105920006006000000000000000000000000800091 -:105930000042000000000000000000000000000025 -:105940000000000000000000000000000000000057 -:105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 -:105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000000000000000C7 -:1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 -:105A40000000000000000000000000000000000056 -:105A50000000000000000000000000000000000046 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 -:105AA00041084000008421060000000000000000C2 -:105AB0004308400000842186000000000000000030 -:105AC00000000000000000000000000000000000D6 -:105AD00000000000000000000000000000000000C6 -:105AE00000000000000000000000000000000000B6 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 -:105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000000000000000E5 -:105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE00000000000000000000000000000000000B5 -:105BF00000000000000000000000000000000000A5 -:105C00000000000000000000000000000000000094 -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000800000008000064 -:105C300000000010000010002008004000080000D4 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000000024 -:105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 -:105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000002000000012 -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000000000000000000E2 -:105EC00000000000000000000000000000001000C2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 -:105F00000000000000000000000000000000000091 -:105F10000000000000000000000000000000000081 -:105F20000000000000000000090000000000000068 -:105F30000000000000000000000000000000000061 -:105F40000000000000000000000000000000000051 -:105F50000000000000000000000000000000000041 -:105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 -:105F90000000000000000000000000000000000001 -:105FA0000000000000000000000088000000000069 -:105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000800000000B9 -:105FE00000000000000000000000001000000000A1 -:105FF0000000000000000000000000080000000099 -:106000000000000000000000000000000000000090 -:106010000000000000000000000000000010000070 -:106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 -:106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000000000000E0 -:1060C0000000000000009000000000000000000040 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:10611000000000000000000000000000000000007F -:10612000000000000000000000000000000000006F -:10613000000000000000000000000000000000005F -:106140000000000000000000000800000000000047 -:1061500000080082000000A0008400000000000091 -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF -:1061A0000000A0000000000000000000000000004F -:1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E -:10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE -:1062F0000800000000000000000000000000000096 -:10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D -:10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:1063500000000000000000000084000000000000B9 -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD -:1063A00008000000000000000000000000000000E5 -:1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E00000000008000000000000000000000000A5 -:1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C -:10641000000000000000000000000000000000007C -:10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC -:1064C00000000000000000000000000000000000CC -:1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B -:10652000000000000000000000000000000000006B -:10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB -:1065B00000000000000000000000000000000000DB -:1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A -:10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 -:106730000000000000000000000000000000000059 -:106740000000000000000000000000000000000049 -:106750000000000000000000000000000000000039 -:106760000000000000000000000000000000000029 -:106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 -:1067900000000000000000000000000000000000F9 -:1067A00000000000000000000000000000000000E9 -:1067B00000000000000000000000000000000000D9 -:1067C00000000000000000000000000000000000C9 -:1067D00000000000000000000000000000000000B9 -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 -:106830000000000000000000000000000000000058 -:106840000000000000000000000000000000000048 -:106850000000000000000000000000000000000038 -:106860000000000000000000000000000000000028 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B00000000000000000000000000000000000D8 -:1068C00000000000000000000000000000000000C8 -:1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000000000000000000000000000057 -:106940000000000000000000000000000000000047 -:106950000000000000000000000000000000000037 -:106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 -:106980000000000000000000000000000000000007 -:1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 -:1069B00000000000000000000000000000000000D7 -:1069C00000000000000000000000000000000000C7 -:1069D00000000000000000000000000000000000B7 -:1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000000086 -:106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 -:106A40000000000000000000000000000000000046 -:106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 -:106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000000000000000000C6 -:106AD00000000000000000000000000000000000B6 -:106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 -:106B0000000000000000000000000000000400047D -:106B10004000000000000000000000000004000031 -:106B2000000000000000000000000000000400045D -:106B30000000000000000000000000000004000051 -:106B40000000000000000000000000000000000441 -:106B50000000000000000000000000000000000035 -:106B60000000000000000000000000000000000025 -:106B700000020000000000000040000000000000D3 -:106B80000000000000000000000000000000000005 -:106B900000000000000000000000000000000000F5 -:106BA00000400000000000000000000000000000A5 -:106BB00000000000000000000000000000000000D5 -:106BC00000000000000000000000000000000000C5 -:106BD00000000000000008000800000000000000A5 -:106BE000000000000000080000000010000000008D -:106BF0000000000082000000820000000000000091 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 -:106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000000000000000000D4 -:106CC00000000000000000000000000000000000C4 -:106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 -:106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 -:106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 -:106F50000000000000000000000000000000000031 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F800000040000000000000000000000000000FD -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E -:1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D -:10740000000000000000000000000000000000007C -:10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C -:1074800000000000000000000000000000000000FC -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C -:10750000000000000000000000000000000000007B -:10751000000000000000000000000000000000006B -:10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B -:10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A -:10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA -:1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D00000000000000000000000000000000000AA -:1076E000000000000000000000000000000000009A -:1076F000000000000000000000000000000000008A -:107700000000000000000000000000000000000079 -:107710000000000000000000000000000000000069 -:107720000000000000000000000000000000000059 -:107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 -:107750000000000000000000000000000000000029 -:107760000000000000000000000000000000000019 -:107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 -:1077900000000000000000000000000000000000E9 -:1077A00000000000000000000000000000000000D9 -:1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 -:1077D00000000000000000000000000000000000A9 -:1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 -:107810000000000000000000000000000000000068 -:107820000000000000000000000000000000000058 -:107830000000000000000000000000000000000048 -:107840000000000000000000000000000000000038 -:107850000000000000000000000000000000000028 -:107860000000000000000000000000000000000018 -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000000000000000000098 -:1078F0000000000000000000000000000000000088 -:107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 -:107920000000000000000000000000000000000057 -:107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 -:107950000000000000000000000000000000000027 -:107960000000000000000000000000000000000017 -:107970000000000000000000000000000000000007 -:1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 -:1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C00000040000000000000000000000000000B3 -:1079D0002000000000000000200000000000000067 -:1079E0000000000000000000000000000000000097 -:1079F0002000000000000000200000000000000047 -:107A00000000000000000000000000000000000076 -:107A10000000200000000000000020000000000026 -:107A20000000000000000000000000000000000056 -:107A30000000200000000000000020000000000006 -:107A40000000000000000000000200000000000034 -:107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 -:107A70000000000000000000000000000000000006 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 -:107AA00000000000000000000000000000000000D6 -:107AB00000000000000200000000000000000000C4 -:107AC00000000000000000000000000000000000B6 -:107AD0000000000000400000000000000000000066 -:107AE0000000000000000000000000000000000096 -:107AF0000000000000000000000000000000000086 -:107B00000000000000000000000000000000000075 -:107B10000000000000000000000000000000000065 -:107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 -:107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 -:107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000000D5 -:107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000000000000000B5 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000000095 -:107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 -:107C10000000000000000000000000000000000064 -:107C20000000000000000000000000000000000054 -:107C30000000000000000000000000000000000044 -:107C40000000000000000000000000000000000034 -:107C50000000000000000000000000000000000024 -:107C60000000000000000000000000000000000014 -:107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD00000000000000000000000000000000000A4 -:107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 -:107D20000000000000000000000000000000000053 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 -:107D50000000000000000000000000000000000023 -:107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 -:107DB00000000000000000000000000000000000C3 -:107DC00000000000000000000000000000000000B3 -:107DD00000000000000000000000000000000000A3 -:107DE0000000000000000000000000000000000093 -:107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 -:107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 -:107E70000000000000000000000000000000000002 -:107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 -:107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 -:107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000000000000000092 -:107EF0000000000000000000000000000000000082 -:107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 -:107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000000000000000000021 -:107F60000000000000000000000000000000000011 -:107F70000000000000000000000000000000000001 -:107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 -:107FA00000000000000000000000000000000000D1 -:107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 -:107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000000091 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 -:108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:108050000000000000000000000000000000000020 -:108060000000000000000000000000000000000010 -:108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000000000000000000090 -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000000000000EF -:1081900000000000000000000000000000000000DF -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F -:10820000000000000000000000000000000000006E -:10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE -:1082800000000000000000000000000000000000EE -:1082900000000000000000000000000000000000DE -:1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E -:1082E000000000000000000000000000000000008E -:1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:10831000000000000000000000000000000000005D -:10832000000000000000000000000000000000004D -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D -:1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED -:1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D -:1083E000000000000000000000000000000000008D -:1083F000000000000000000000000000000000007D -:10840000000000000000000000000000000000006C -:10841000000000000000000000000000000000005C -:10842000000000000000000000000000000000004C -:10843000000000000000000000000000000000003C -:10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C -:10846000000000000000000000000000000000000C -:1084700000000000000000000000000000000000FC -:1084800000000000000000000000000000000000EC -:1084900000000000000000000000000000000000DC -:1084A00000000000000000000000000000000000CC -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000000AC -:1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C -:1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B -:10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000000FB -:1085800000000000000000000000000000000000EB -:1085900000000000000000000000000000000000DB -:1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B -:10860000000000000000000000000000000000006A -:10861000000000000000000000000000000000005A -:10862000000000000000000000000000000000004A -:10863000000000000000000000000000000000003A -:10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A -:1086700000000000000000000000000000000000FA -:1086800000000000000000000000000000000000EA -:1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A -:1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000000069 -:108710000000000000000000000000000000000059 -:108720000000000000000000000000000000000049 -:108730000000000000000000000000000000000039 -:108740000000000000000000000000000000000029 -:108750000000000000000000000000000000000019 -:108760000000000000000000000000000000000009 -:1087700000000000000000000000000000000000F9 -:1087800000000000000000000000000000000000E9 -:1087900000000000000000000000000000000000D9 -:1087A00000000000000000000000000000000000C9 -:1087B00000000000000000000000000000000000B9 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000000000000089 -:1087F0000000000000000000000000000000000079 -:108800000000000000000000000000000000000068 -:108810000000000000000000000000000000000058 -:108820000000000000000000000000000000000048 -:108830000000000000000000000000000000000038 -:108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000000000E8 -:1088900000000000000000000000000000000000D8 -:1088A00000000000000000000000000000000000C8 -:1088B00000000000000000000000000000000000B8 -:1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000000000000000000098 -:1088E0000000000000000000000000000000000088 -:1088F0000000000000000000000000000000000078 -:108900000000000000000000000000000000000067 -:108910000000000000000000000000000000000057 -:108920000000000000000000000000000000000047 -:108930000000000000000000000000000000000037 -:108940000000000000000000000000000000000027 -:108950000000000000000000000000000000000017 -:108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000000F7 -:1089800000000000000400000000000000002000C3 -:1089900000002000000400040000000000000000AF -:1089A00000000000000400000000000000002000A3 -:1089B000000020000004000400000000000000008F -:1089C00000000000000000040000000000000000A3 -:1089D0002000000020000002000000000000000055 -:1089E0000000000000000000000000000000000087 -:1089F00020000000200000000000400000020000F5 -:108A00000000000000000000000000000000000066 -:108A10000000000000000000000000000000000056 -:108A20000000000000000000000000000000000046 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000200020000000022 -:108A50000000000000000000000000000000000016 -:108A600000000000400000000000000000000000C6 -:108A700000000000000000000000000000000000F6 -:108A800000000000000000000000001000000000D6 -:108A900000000000000000000000000000000000D6 -:108AA00000000000000000000000000000000000C6 -:108AB00000000000000000000000000000000000B6 -:108AC00000000000000000000000000000000000A6 -:108AD000000000000800000000000000000002008C -:108AE0000200000000000000000000000000020082 -:108AF0000200000000000000000000000000000074 -:108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B20000000000000000000000000000000000045 -:108B30000000000000000000000000000000000035 -:108B40000000000000000000000000000000000025 -:108B50000000000000000000000000000000000015 -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B800000000000000000000000000000000000E5 -:108B900000000000000000000000000000000000D5 -:108BA00000000000000000000000000000000000C5 -:108BB00000000000000000000000000000000000B5 -:108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 -:108BF0000000400000000000000000000000000035 -:108C00000000000000000000000000000000000064 -:108C10000000000000000000000000000000000054 -:108C20000000000000000000000000000000000044 -:108C30000000000000000000000000000000000034 -:108C40000000000000000000000000000000000024 -:108C50000000000000000000000000000000000014 -:108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 -:108CC00000000000000000000000000000000000A4 -:108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000040000044 -:108CF00000000000000000000000004000400000F4 -:108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000000000053 -:108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000000E3 -:108D900000000000000000000000000000000000D3 -:108DA00000000000000000000000000000000000C3 -:108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE0000000000000000000000000000000000083 -:108DF0000000000000000000000000000000000073 -:108E00000000000000000000000000000000000062 -:108E10000000000000000000000000000000000052 -:108E20000000000000000000000000000000000042 -:108E30000000000000000000000000000000000032 -:108E40000000000000000000000000000000000022 -:108E50000000000000000000000000000000000012 -:108E60000000000000000000000000000000000002 -:108E700000000000000000000000000000000000F2 -:108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 -:108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F900000000000000000000000000000000000D1 -:108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 -:108FF0000000000000000000000000000000000071 -:109000000000000000000000000000000000000060 -:109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 -:109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:10913000000000000000000000000000000000002F -:10914000000000000000000000000000000000001F -:10915000000000000000000000000000000000000F -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF -:1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000000000000AF -:1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000000000008F -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E -:10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E -:1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD -:1093C000000000000000000000000000000000009D -:1093D000000000000000000000000000000000008D -:1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C -:10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C -:10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C -:1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000000000003B -:10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB -:1095C000000000000000000000000000000000009B -:1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A -:10963000000000000000000000000000000000002A -:10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A -:1096D000000000000000000000000000000000008A -:1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000000000000B9 -:1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 -:109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000040000000094 -:1098D0000000000000000000000000000000400048 -:1098E0000000000000000000000000000000000078 -:1098F0000000000000000000000000000000000068 -:109900002000000000000000000000000000000037 -:109910000000000000000000000000000000000047 -:109920002000000000000000000000000000000017 -:109930000000000000000000000000000000000027 -:109940000000000000000000000000000000000017 -:109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 -:1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 -:1099B0000000000000020000000000000000001095 -:1099C0000000000000000000000000000000000097 -:1099D0000000000000000000000000000000000087 -:1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 -:109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000036 -:109A30000000000000000000000000000000000026 -:109A40000000000000000000000000000000000016 -:109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000000B6 -:109AB00000000000000000000000000000000000A6 -:109AC0000000000000000000000000000000000096 -:109AD0000000000000000000000000000000000086 -:109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000000066 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B40000000000000000000000000000000000015 -:109B50000000000000000000000000000000000005 -:109B600000000000000000000000000000000000F5 -:109B700000000000000000000000000000000000E5 -:109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000000000000000A5 -:109BC0000000000000000000000000000000000095 -:109BD0000000000000000000000000000000000085 -:109BE0000000000000000000000000000000000075 -:109BF0000000000000000000000000000000000065 -:109C00000000000000000000000000000000000054 -:109C1000000500000000000000000000000000003F -:109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 -:109C40000000000000000000000000000000000014 -:109C50000000000000000000000000000000000004 -:109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000000E4 -:109C800000000000000000000000000000000000D4 -:109C900000000000000000000000000000000000C4 -:109CA00000000000000000000000000000000000B4 -:109CB00000000000000000000000000000000000A4 -:109CC0000000000000000000000000000000000094 -:109CD0000000000000000000000000000000000084 -:109CE0000000000000000000000000000000000074 -:109CF0000000000000000000000000000000000064 -:109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 -:109D30000000000000000000000000000000000023 -:109D40000000000000000000000000000000000013 -:109D50000000000000000000000000000000000003 -:109D600000000000000000000000000000000000F3 -:109D700000000000000000000000000000000000E3 -:109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000000B3 -:109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000000000000000093 -:109DD0000000000000000000000000000000000083 -:109DE0000000000000000000000000000000000073 -:109DF0000000000000000000000000000000000063 -:109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E200000400000000000000000000000000000F2 -:109E30000000000000000000000000000000000022 -:109E40000000000000000000000000000000000012 -:109E50000000000000000000000000000000000002 -:109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 -:109EC0000000000000000000000000000000000092 -:109ED0000000000000000000000000000000000082 -:109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 -:109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 -:109F30000000000000000000000000000000000021 -:109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000000001 -:109F600000000000000000000000000000000000F1 -:109F700000000000000000000000000000000000E1 -:109F800000000000000000000000000000000000D1 -:109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000000081 -:109FE0000000000000000000000000000000000071 -:109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 -:10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 -:10A030000000000000000000000000000000000020 -:10A040000000000000000000000000000000000010 -:10A050000000000000000000000000000000000000 -:10A0600000000000000000000000000000000000F0 -:10A0700000000000000000000000000000000000E0 -:10A0800000000000000000000000000000000000D0 -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 -:10A0C0000000000000000000000000000000000090 -:10A0D0000000000000000000000000000000000080 -:10A0E0000000000000000000000000000000000070 -:10A0F0000000000000000000000000000000000060 -:10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A1500000000000000000000000000000000000FF -:10A1600000000000000000000000000000000000EF -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F -:10A1D000000000000000000000000000000000007F -:10A1E000000000000000000000000000000000006F -:10A1F000000000000000000000000000000000005F -:10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E -:10A2F000000000000000000000000000000000005E -:10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D -:10A33000000000000000000000000000000000001D -:10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD -:10A3600000000000000000000000000000000000ED -:10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000000CD -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D -:10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC -:10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000000000000000006C -:10A4F000000000000000000000000000000000005C -:10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000000000001B -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000000000FB -:10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000000000000000DB -:10A5800000000000000000000000000000000000CB -:10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB -:10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E000000000000000000000000000000000006B -:10A5F000000000000000000000000000000000005B -:10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000000FA -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000004D4 -:10A8800020000000000000000000400040004004E4 -:10A890004000000000000000000000000000000474 -:10A8A0002004000000000000000020002000200420 -:10A8B0002000000000000000000000000000000078 -:10A8C0000004200400000000000000002000200020 -:10A8D0002004200000000000000000000000000034 -:10A8E0000000200000000000000000002000200008 -:10A8F0002000200000000000000000000000000018 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A9400000000000000000000000000000004000C7 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000004000000000000000000000A7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000400000000037 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 -:10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000200000064 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000400000000000000000000035 -:10ABE0000000000000000004000000000000000061 -:10ABF000000000000004000400000000000000004D -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC30000000000000000000000000000000000014 -:10AC40000000000000000000000000000000000004 -:10AC500000000000004000000000000000000000B4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000000000000000000013 -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE70000000000000000000000000400000004052 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000000000000A2 -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000000000000000000000006B -:10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000040000000000000000000065 -:10B7E0000000000000000000000000000000000059 -:10B7F00000000000000000000000000000008200C7 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000002000006 -:10B8400000000000000000000000400000000000B8 -:10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000240000000000056 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 -:10BB000000000000000000410000000400000000F0 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB300000000011000000000000000000000000F4 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB00000900000000000000000000000000000F5 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD300000000800000000000000000000000000FB -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 -:10BD90000000000020000000000000000000000083 -:10BDA0000000000000000000000000000000000093 -:10BDB000000000000800000000000000210000005A -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 -:10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000000000000022 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000000002000A9 -:10C7700000000000010001000104010400000000AD -:10C780000000000000002000000400000000200065 -:10C790000000000000000000000400000000000095 -:10C7A0000000000000000000000400040000000081 -:10C7B00000000000000001000000008400000000F4 -:10C7C0000000000000000000000000020004000063 -:10C7D0000000000000000000000000040000000055 -:10C7E0000000000000000000400000000002000007 -:10C7F0000002000000000200020008000800000023 -:10C800000000000000000000000000000000000028 -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 -:10C8300000000000000000000800000000400002AE -:10C8400000000000000000000000000000040000E4 -:10C8500010000000000000000000000000000000C8 -:10C8600000000000000000000000000000000000C8 -:10C870000200020000400040000000000000000034 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000400000000000000000000018 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000800080000001000100000000000036 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000562 -:10C9D0000000000000000000000200000000000055 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000100000000D5 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB000000008000000000000000000000000006E -:10CAC0000000000000050000004000000000000021 -:10CAD00000000000000000000000000200001088BC -:10CAE0000000000400800004008000C000040080FA -:10CAF0000004000000000000000000000000000032 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB4000000000000000000011000001000000A033 -:10CB500000040000000000000000000000010000D0 -:10CB6000800900000001000400010004000400012D -:10CB700000040001000000000000000000000000B0 -:10CB80000040004000000000000000000000000025 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE00040000000840000000000C00000000000C1 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000100010000000000000000000022 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC60000000800000000000000000000000000044 -:10CC700000000000000000000000000000000000B4 -:10CC80000040000000000000000000000000000064 -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC000000000000800000000000000018000805B -:10CCD00000000000002100000040000000000000F3 -:10CCE000000000400000000000000000010084007F -:10CCF00040000002004000080000000000000000AA -:10CD00000000000100000000000000000000000022 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000820BB -:10CD50000040000000000010000000000000000083 -:10CD600000000000000000000000000000001000B3 -:10CD700000008000000141000001000000000000F0 -:10CD80000000000002C000000002000000000000DF -:10CD90000000200000000000000000000000000073 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC000000000000000000000000000000000C0A3 -:10CDD00000000088000800000000000000000000C3 -:10CDE0000000000000000001000100000001000040 -:10CDF000000002000000000100000001000100002E -:10CE000000000000000080800000008000000000A2 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE50000080000000800080000000000000000052 -:10CE6000000000000000000000410003000000047A -:10CE700003000400C100000000410003400400045E -:10CE80000000000000000000000000000000800022 -:10CE90000000000000008000000000000000000012 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000200000000000000000000032 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000900000020000000000000000504 -:10CF00000000000000000000000000000000000021 -:10CF1000C000200040000000C00000000000000031 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF70000000002000000000000000000000000091 -:10CF800000000000000000000000000000000000A1 -:10CF9000000000C000000040002000C000000000B1 -:10CFA0000000000000000000000000000000000081 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD000000000000000020000000000000000004F -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000C00000000001000070 -:10D000004000880000000000000000000000000058 -:10D010000000000000800000000000000080000010 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000800900000041E6 -:10D08000000080008000050000000000000000009B -:10D090008000000000000000002000000080000070 -:10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000080408009800087 -:10D0E0000000000000000000000000000000000040 -:10D0F000000021000000000000000000000000000F -:10D10000000000000000000000000000000000001F -:10D110000000C000002000004000000000000040AF -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D15000000000000000000000000000C00004000B -:10D16000400000000000000000000000000000007F -:10D1700000000000010000000000000000000000AE -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E00000008000000000000000000000000000BF -:10D1F000000000000000000000000000000000002F -:10D2000000010000420000000001000000000000DA -:10D2100000000000000000003C3C0000AAAA000042 -:10D220000000FF0F0F0F00000000000000000000D2 -:10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D2600000F0FFF0000000000000000000000000DF -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000003C3C0000AAAAC2 -:10D2A00000000000FF0FFFFF000000000000000072 -:10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E0000000FFF000F0000000000000000000005F -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000F0F0000AAAA9B -:10D32000FFFF00000000F0F0F3F300000000000039 -:10D3300000000000000000000000000000000000ED -:10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D36000000000000F0F0C0C000000000000000087 -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D -:10D390000000000000000000000000000F0F00006F -:10D3A000AAAAFFFF00000000FFFFF3F30000000047 -:10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E00000000000000000000C0C00000000000025 -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000040824A -:10D420008000002082020000000000900005000043 -:10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D460000000000000000000A000500800000000C4 -:10D4700000000000000000000000000000000000AC -:10D4800000610006000D00000061000700090000B7 -:10D4900000610003000D000000000000000000001B -:10D4A000000000000000000000000000000000007C -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D5000000000000FFFF0000000000000000A0A0DD -:10D51000AAAA0000000000000000000000000000B7 -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB -:10D58000000000000000FFFF00000000000000009D -:10D59000A0A000000000000000000000000000004B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D600000000000000003C003CFF000000000000A3 -:10D610000000000000003C000F00000000000000BF -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA -:10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D6800000000000000000003C003CFF0000000023 -:10D6900000000000000000003C000F00000000003F -:10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000002000000000004A -:10D6C00020002000200000000000000000000000FA -:10D6D0000000000000000000000000000000000446 -:10D6E00020002000200000000000000000000000DA -:10D6F000000000000000000000000000000000002A -:10D7000000002000000020000000000000000000D9 -:10D710000000000000000000000000000000000009 -:10D7200000000000000000800080000000000000F9 -:10D7300000000000400000000000000000000000A9 -:10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000010000000000000000000000079 -:10D7A0000000000000000000001000100000000059 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 -:10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 -:10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 -:10D8F0000000000000000000000000000000000028 -:10D9000000000000000000000000000000000041D6 -:10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 -:10D9300000000300080003000300000000000000D6 -:10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 -:10D9700000000000000003000000000000000000A4 -:10D980000000000000000000000000000000000097 -:10D990000000030000000000210000000000000063 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E000000000000000080000000000000000002F -:10D9F00000000000000000000000000000000084A3 -:10DA00000004020488040000000000000000000080 -:10DA1000080000000000000000410000004100413B -:10DA2000820000410000000000000000000008002B -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 -:10DA600000000000000000000000000000000000B6 -:10DA700000000000000000000000000000000000A6 -:10DA800000210001800100010000000000020000F0 -:10DA90000000000000000000000000000000000086 -:10DAA0001100000000000000000000000000000065 -:10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB0000000000000800000000000000000000000D -:10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 -:10DB300000000000000008000000000000000000DD -:10DB400000000000000000000000000000000000D5 -:10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB80000000000000008000000000000000000015 -:10DB90000000000000000000000000000000000085 -:10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 -:10DBD0000000000000000000000000000000000045 -:10DBE0000000000000000000000000000000000035 -:10DBF0000000000000000000000000000000000025 -:10DC00000000000000000000010000800000000093 -:10DC10000000001100000000000082000000000071 -:10DC200000000000000000000000000000000000F4 -:10DC300000000000000000000000000000000000E4 -:10DC400000000000000000000000000000000000D4 -:10DC500000000000000000000000000000000000C4 -:10DC600000000000000000000000000000000000B4 -:10DC700000000000000000000000000000000000A4 -:10DC80000000000000000000000004000920200047 -:10DC90000000000000000000000000000000000084 -:10DCA0000000000000000000000000000000000074 -:10DCB0001100000000002000000000000000000033 -:10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 -:10DCE0000000000000000000000000000000000034 -:10DCF0000000000000000000000000000000000024 -:10DD00000000000000000000000001C0208400109E -:10DD100000C0000000000000000000000000000043 -:10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000000000000C3 -:10DD600000000000000000000000000000000000B3 -:10DD700000000000000000000000000000000000A3 -:10DD80000000000000000000000000002180800072 -:10DD90000200000000000000000000000000000081 -:10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000000000000053 -:10DDD0000000000000000000000000000000000043 -:10DDE0000000000000000000000000000000000033 -:10DDF0000000000000000000000000000000000023 -:10DE000000000000000000000000000000000020F2 -:10DE1000000000A10000000300000000000000005E -:10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000000000000000E2 -:10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000000000000B2 -:10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000000000092 -:10DE90000001000000080000000000000000000079 -:10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC0000000400000000000000000000000000012 -:10DED0000000000000000000000000000000000042 -:10DEE0000000000000000000000000000000000032 -:10DEF0000000000000000000000000000000000022 -:10DF00000000000000000000000000000000000011 -:10DF100000000000C00084000100000000000000BC -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000000000000E1 -:10DF40000000000000900000000000000000000041 -:10DF500000000000000000000000000000000000C1 -:10DF600000000000000000000000000000000000B1 -:10DF700000000000000000000000000000000000A1 -:10DF80000000000000000000000000000000000091 -:10DF90000000000000008000800009000000000078 -:10DFA0000000000000000000000000000000000071 -:10DFB0000000000000000000000000000000000061 -:10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000000000000031 -:10DFF0000000000000000000000000000000000021 -:10E000000000000000000000000000000000000010 -:10E01000000000000000800000040000000000007C -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 -:10E0400000000000000000000000000000000000D0 -:10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 -:10E0700000000000000000000000000000000000A0 -:10E080000000000000000000000000000000000090 -:10E090000000000000000000C00000000400C000FC -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000000000060 -:10E0C0000000000000000000000000000000000050 -:10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 -:10E0F0000000000000000000000000000000000020 -:10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000100800E7 -:10E12000820000000000000000000000000000006D -:10E1300000000000000000000000000000000000DF -:10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000000BF -:10E1600000000000000000000000000000000000AF -:10E17000000000000000000000000000000000009F -:10E18000000000000000000000000000000000008F -:10E1900000000000000000000000000030302424D7 -:10E1A000000000000000000000000000000000006F -:10E1B000000000000000000000000000000000005F -:10E1C000000000000000000000000000000000004F -:10E1D0000F0F0F0F00000000000000000000000003 -:10E1E000000000000000000000000000000000002F -:10E1F000000000000000000000000000000000001F -:10E20000000000000000000000000000000000000E -:10E21000000000000000000000000000000030309E -:10E2200024240000000000000000000000000000A6 -:10E2300000000000000000000000000000000000DE -:10E2400000000000000000000000000000000000CE -:10E2500000000F0F0F0F0000000000000000000082 -:10E2600000000000000000000000000000000000AE -:10E27000000000000000000000000000000000009E -:10E28000000000000000000000000000000000008E -:10E29000000000000000000000000000000000007E -:10E2A000000000000000000000000000000000006E -:10E2B000000000000000000000000000000000005E -:10E2C000000000000000000000000000000000004E -:10E2D000000000000000000000000000000000003E -:10E2E000000000000000000000000000000000002E -:10E2F000000000000000000000000000000000001E -:10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD -:10E3200000000C0C003C0000000000000000000099 -:10E3300000000000000000000000000000000000DD -:10E3400000000000000000000000000000000000CD -:10E35000000000000000F0F0F0F0000000000000FD -:10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D -:10E3A000000000000C0C003C000000000000000019 -:10E3B000000000000000000000000000000000005D -:10E3C000000000000000000000000000000000004D -:10E3D0000000000000000000F0F0F0F0000000007D -:10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000001D -:10E40000000000000000000000000000000000000C -:10E4100000000000000000000000000000000000FC -:10E42000000000000000A061500F050D000000007A -:10E4300000000000000000000000000000000000DC -:10E4400000000000000000000000000000000000CC -:10E4500000000000000000000000000000000000BC -:10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C -:10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C -:10E4C000000000000000000000000000000000004C -:10E4D000000000000000000000000000000000003C -:10E4E000000000000000000000000000000000002C -:10E4F000000000000000000000000000000000001C -:10E50000000000000000000000000000000000000B -:10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000000000000CB -:10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C000000000000000000000000000000000004B -:10E5D000000000000000000000000000000000003B -:10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A -:10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000000000EA -:10E6300000000000000000000000000000000000DA -:10E6400000000000000000000000000000000000CA -:10E6500000000000000000000000000000000000BA -:10E66000000000000000C00020000000400000008A -:10E67000000020000000000000000000000020005A -:10E6800020000004200420002000000020000000E2 -:10E690000000200400000000000000000000200036 -:10E6A0002000000420000000000020000000000006 -:10E6B00000000000200482040000000000000000B0 -:10E6C00020002000000400000000200000000000E6 -:10E6D0000000000020040004000000000000000012 -:10E6E0000000200000040000000000000000000006 -:10E6F000000000000000000000000000000000001A -:10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000000F9 -:10E7200000000000000000000000000000000000E9 -:10E7300000000000000000000000000000000000D9 -:10E7400000000000000000000000000000000000C9 -:10E750000000000041000000000000000000000078 -:10E7600000000000000000000000000000000000A9 -:10E770000000000000000000000000000000000099 -:10E780000000000000000000000000000000000089 -:10E790000000000000000000000000000000000079 -:10E7A0000000000000000000000000000000000069 -:10E7B0000000000000200000000000000000000039 -:10E7C0000000000000000000000000000000000049 -:10E7D00000000000000000000000000000000080B9 -:10E7E00000000080000000000000000000000000A9 -:10E7F0000000000000000000000000000000000019 -:10E8000000002000000040000000000000000000A8 -:10E8100000000000000000000000000000000000F8 -:10E8200000000000000000000000000000000000E8 -:10E8300000000000200000010000000000000000B7 -:10E840004100000000000000000000000000000087 -:10E85000000000000000000000000000000000A018 -:10E860000010000000400000000000000000000058 -:10E870000000000000000000000000000000000098 -:10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000000000078 -:10E8A0000000000000000000000000000000000068 -:10E8B0000000000000000000000000000000000058 -:10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 -:10E9200000000000000000000000000000000000E7 -:10E9300000000000000000000000000000000000D7 -:10E9400000000000001000000000000000000000B7 -:10E9500000000000000000000000000000000000B7 -:10E9600000000000000000000000000000000000A7 -:10E970000000000000000000000000000000000097 -:10E980000003000000000000000000000000000084 -:10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000000000000000067 -:10E9B00000000000000000000000000000000080D7 -:10E9C0000080008000000000000000000000000047 -:10E9D0000000000000000000200000000000000017 -:10E9E0000000000001000100010000000000000024 -:10E9F0000000000000000000000000000000000017 -:10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 -:10EA200000000000000000000000000000000000E6 -:10EA30000000000000000000000041000000000095 -:10EA40000020002000200000000041000000000025 -:10EA50000000000000000000000041000000000471 -:10EA6000000000040000040004040400000400008E -:10EA70000000000000000000000000000000000096 -:10EA80000000000000000000000000110000000075 -:10EA90000000000000000000000000000000000076 -:10EAA0000000000000000000000000000000000066 -:10EAB0000000000008000000080000000000000046 -:10EAC000000000000000C00000000000000000087E -:10EAD000000000000000080000000000000000002E -:10EAE00000000000000084000000000000000000A2 -:10EAF0000000000000000000000000000000000016 -:10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 -:10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000000000D5 -:10EB400000000000000000C0000000000000000005 -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 -:10EB7000000008000000000000000000000000008D -:10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000075 -:10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000008000835 -:10EBD0000000000000000000000000000000000035 -:10EBE000000000000000000000000800000000001D -:10EBF0000000010000000000000000000000000014 -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 -:10EC200000000000000000000000000000000000E4 -:10EC3000000000000000000000000000000008C00C -:10EC40000000000008000088110011880900000081 -:10EC500000000000000000000000000000000004B0 -:10EC600000000000000000000000000000000000A4 -:10EC70000000000004000000000000000000000090 -:10EC80000000000000000000000000000000000084 -:10EC90000000000000000000000000000000000074 -:10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 -:10ECC0000000000000000000000000000000000044 -:10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000000000024 -:10ECF00000C0000000A000A0000000000000000014 -:10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 -:10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED70000000008000000000000000000000000013 -:10ED80000000000000000000000000000000000083 -:10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000000000000053 -:10EDC00000000000000000000000000000000080C3 -:10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 -:10EDF0000000000000000000000000800000000093 -:10EE00000000000000000000000000000000000002 -:10EE100000000000000000000000000000000000F2 -:10EE200000000000000000000000000000000000E2 -:10EE300000000000000000000000000000000000D2 -:10EE400000000000000000000000000000000000C2 -:10EE50000008000000840000000000000000000026 -:10EE600000000000000000000000000000000000A2 -:10EE7000000000000000000000000000000400008E -:10EE80000000000000000000000000000000000082 -:10EE90000000000000000000000000000000000072 -:10EEA0000000000000000000000000000000000062 -:10EEB0000000000000000000000000000000000052 -:10EEC0000000000000000000000000000000000042 -:10EED00000000000400000000000000000000000F2 -:10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000850000008400010008 -:10EF00000000000000000000000000000000000001 -:10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000000000000000000E1 -:10EF300000000000000000000000000000000000D1 -:10EF400000000000000000000000000000000000C1 -:10EF50000000090000008000000000000000000028 -:10EF600000000000000000000000000000000000A1 -:10EF7000000000000000000000000200000080000F -:10EF80000900000000000000000000000000000078 -:10EF90000000000000000000000000000000000071 -:10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC0000000000000000000000000000000000041 -:10EFD000000000000011000400000000000000001C -:10EFE0000000000000000000000000000000000021 -:10EFF00000000000000000000000000000000040D1 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 -:10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000000000000000D0 -:10F0400000000000000000000000000000000000C0 -:10F0500000000000000000000001000000000000AF -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F090000000000000000000000000000000000070 -:10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000000050 -:10F0C0000000000000000000000000000000000040 -:10F0D00000000000000000000000000080000000B0 -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000000000000010 -:10F1000000000000400000000000000000000000BF -:10F1100000000000000000000000000000000000EF -:10F1200000000000000000000000000000000000DF -:10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF -:10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F -:10F19000000000000000000000000000000000006F -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F2000000000000000000000000000000000000FE -:10F2100000000000000000000000000000000000EE -:10F2200000000000000000000000000000000000DE -:10F2300000000000000000000000000000000000CE -:10F2400000000000000000000000000000000000BE -:10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F280000000000000000C0C3C3C000000000000EE -:10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000000005E -:10F2B000000000000000000000000000000000004E -:10F2C000000000000000000000000000000000003E -:10F2D000000000000000000000000000000000002E -:10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F3000000000000000000000C0C000000000000E5 -:10F3100000000000000000000000000000000000ED -:10F3200000000000000000000000000000000000DD -:10F3300000000000000000000000000000000000CD -:10F3400000000000000000000000000000000000BD -:10F3500000000000000000000000000000000000AD -:10F36000000005000A08050000A0000000000000E1 -:10F37000000000000000000000000000000000008D -:10F38000000000000000000000000500500805001B -:10F3900000A00000000000000000000000000000CD -:10F3A000000000000000000000000000000000005D -:10F3B000000000000000000000000000000000004D -:10F3C000000000000000000000000000000000003D -:10F3D000000000000000000000000000000000002D -:10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D -:10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC -:10F4200000000000000000000000000000000000DC -:10F4300000000000000000000000000000000000CC -:10F4400000000000000000000000000000000000BC -:10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000000007C -:10F49000000000000000000000000000000000006C -:10F4A000000000000000000000000000000000005C -:10F4B000000000000000000000000000000000004C -:10F4C000000000000000000000000000000000003C -:10F4D000000000000000000000000000000000002C -:10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB -:10F5100000000000000000000000000000000000EB -:10F5200000000000000000000000000000000000DB -:10F5300000000000000000000000000000000000CB -:10F5400000000000000000000000000000000000BB -:10F5500000000000000000000000000000000000AB -:10F56000000000000000000000000000000000009B -:10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000007B -:10F59000000000000000000000000000000000006B -:10F5A00000004000C000200020000000C00020003B -:10F5B0000000880020000000400000004000200003 -:10F5C00020004000000020002000000088002000F3 -:10F5D000000088002000000020004000880000009B -:10F5E000200000022000000020002004000088000D -:10F5F000200000002000200000004000000000006B -:10F6000000000000200000000000200000000000BA -:10F6100000000000200000000000000000000000CA -:10F6200000000000000000000000000000000000DA -:10F6300000020000000000000000000000000000C8 -:10F6400000000000000000000000000000000000BA -:10F6500000000000000000000000000000000000AA -:10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A -:10F6900000000000000000000000000000820000E8 -:10F6A000000000000000000000000000000000005A -:10F6B0000000000000000000000000080000000042 -:10F6C000000000000000000000000000000000003A -:10F6D000000000000000000000000000000000002A -:10F6E000000000000000000000040004000400040A -:10F6F00000040004000400041080108010841080B6 -:10F7000000000000000000000080008000800080F9 -:10F710002000200020002000000000000000000069 -:10F7200000000000000000000000000000000000D9 -:10F730000000000000000000000000002000200089 -:10F740004000000000000000000000000000000079 -:10F750000000000000000000000800000008090090 -:10F760000000000020000000000000010001000176 -:10F7700000010001000100010001800480048009F3 -:10F7800080040000000000000000000400040004E9 -:10F790000004800080008000800000000000000065 -:10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000000000000000000000049 -:10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 -:10F7E0000000000000000000000000000000000019 -:10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000020D8 -:10F8100000000020000000000000000000000004C4 -:10F8200000000004000000000000000000000000D4 -:10F8300000000000000000000000000000000000C8 -:10F8400000000000000000000000000000000000B8 -:10F8500000000000000000000000000000000000A8 -:10F860000000000000000000000000000000000098 -:10F870000000000000000000080000000000000080 -:10F880000000000000000000000000000000000078 -:10F89000090100002101000000000000000000003C -:10F8A000000100000001000000000000000008004E -:10F8B00008000000820000000800000000000000B6 -:10F8C000000000008200000082000000000008002C -:10F8D000000000008200000008000000000000009E -:10F8E0000000000000000000080000000000000010 -:10F8F0000000000000000000100000000000880070 -:10F9000000000000000000000000000000000800EF -:10F9100000000000000000000000000000000000E7 -:10F9200000000000000000000000000000000000D7 -:10F930000000410000000000000003000000000083 -:10F9400000000300000000000000000000000000B4 -:10F95000000008001000410000000000000000004E -:10F9600008000008000041080000030000000082B9 -:10F970000000000041000000410880000300210059 -:10F980000000000000000000080000000800000067 -:10F9900000000000000021004100000008000000FD -:10F9A000000000000800000021000000000000002E -:10F9B0000000000000000000000000000000000047 -:10F9C000000000000000000000000800000000002F -:10F9D0000000000000000000000010000000000017 -:10F9E00000000000000000000000100000000800FF -:10F9F00000000000000000080008000000000000F7 -:10FA000010001000000000000000000008000005C9 -:10FA100000008200000000000000A0000000A00024 -:10FA20000000A00000000000000000001000000026 -:10FA300000000000000000000000000000000000C6 -:10FA400000000000000000000800000000000000AE -:10FA500000000000000000000000000000000000A6 -:10FA60000000000000000000000000000000000096 -:10FA70000000000000000000000000000000000086 -:10FA80000000800080000000000000000000000076 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000000000000000000000000000056 -:10FAB0000000000000000000000000000000000046 -:10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000000026 -:10FAE0000000000000000000000000000000000016 -:10FAF00000000003000000000000880008009000E3 -:10FB000000001009000500000000000000030000D4 -:10FB10000005000040058200002088110020A000A0 -:10FB20000005000000058200000400000004000041 -:10FB30000002000200020000410008000000000076 -:10FB400000000000000000000008000000000000AD -:10FB500000000000000000000000000000000000A5 -:10FB60000000000000000000000000000084000011 -:10FB700000000000000000000000000800000088F5 -:10FB800000000000800008022100000000000000CA -:10FB9000100000000000000000000001000008014B -:10FBA0000000000000000802000000010000000149 -:10FBB000080000000000000000000000000000003D -:10FBC0000000000000000000000000000000000035 -:10FBD0000000000000000000000000000000000025 -:10FBE0000000000000000000000000000000000015 -:10FBF0000000000000000000000000000000000005 -:10FC0000000000000000A100000000000000000053 -:10FC100000000000000000000000000000000000E4 -:10FC200000000000000004000100000000000000CF -:10FC300000000000000000000000000000000000C4 -:10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000000000000000A4 -:10FC60000000000000000000000000000000000094 -:10FC70000000000000000000000000000000000084 -:10FC8000000009000000000003000900000000005F -:10FC90000003080000000000000000000000000059 -:10FCA00000002000000000008000030000000300AE -:10FCB0000000410000000000000000000000000003 -:10FCC0000000000000000000000000000000000034 -:10FCD0000000000000000000000000000000000024 -:10FCE0000000000000000000000000000000000014 -:10FCF0000000000000000000000000000000000004 -:10FD00000008000000050000002000000440000082 -:10FD100000090000000900000000000000000000D1 -:10FD200000090000000900000004000000040000B9 -:10FD300000090000000900000000000000000000B1 -:10FD400000000000000000000000000000000000B3 -:10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000000000000000000093 -:10FD70000000000000000000000000000000000083 -:10FD8000000000010000000100040001000001016A -:10FD900000840000000000000000000000000000DF -:10FDA0000000000000840000008400010000000149 -:10FDB0000000000000000000000000000000000043 -:10FDC0000000000000000000000000000000000033 -:10FDD0000000000000000000000000000000000023 -:10FDE0000000000000000000000000000000000013 -:10FDF0000000000000000000000000000000000003 -:10FE000000000000000004000000000000000400EA -:10FE100000000100000002000000000000000000DF -:10FE200000000000000002000400000000000400C8 -:10FE300000000000000008000000010000000000B9 -:10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 -:10FE8000000000000000000000000000040000006E -:10FE90008000410041000000000500000200000059 -:10FEA000000000000000040000000000020000004C -:10FEB000000000000400000080000000410000007D -:10FEC0000000000000000000000000000000000032 -:10FED0000000000000000000000000000000000022 -:10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 -:10FF000000000000000000000000000000000000F1 -:10FF10000004040000000000000003000000004096 -:10FF20000000000000000000001000400000000081 -:10FF300000000000000000000000000000000000C1 -:10FF400000000000000000000000000000000000B1 -:10FF500000000000000000000000000000000000A1 -:10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 -:10FF9000000000010100000000000000000000005F -:10FFA000000000000000000000000001000100004F -:10FFB0000000000000000000000000000000000041 -:10FFC0000000000000000000000000000000000031 -:10FFD0000000000000000000000000000000000021 -:10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 -:02000004000AF0 -:1000000000000000000000000000000000000020D0 -:1000100000000000000000420000000A410000E073 -:10002000000000000000000000000000810000E06F -:100030004000000000000008000000000000000870 -:100040000000000A000000000000000000000000A6 -:1000500000000000000000000000000000000000A0 -:100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 -:1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F -:1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E -:1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED -:10031000000000000000000000610007000D000068 -:1003200000000007000C000000000007800C000027 -:10033000000000000000000005610A0F850D00A00C -:1003400000610007000D000000610007000D0000C3 -:10035000000000000000000000000000000000009D -:10036000000000000000000000000000000000008D -:10037000000000000000000000000000000000007D -:10038000000000000000000000000000000000006D -:10039000000000000000000000000000000000005D -:1003A00000000000FF00FFFF00000000FF00F0F071 -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D -:1003F00000000000000000000000000000000000FD -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:10042000000000000000FF00000000000000FF00CE -:10043000F0F00000000000000000000000000000DC -:1004400000000000000000000000000000000000AC -:10045000000000000000000000000000000000009C -:10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C -:10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C -:1004A0000000000000000000FFFF00FF000000004F -:1004B000FF00AAAA000000000000000000000000E9 -:1004C000000000000000000000000000000000002C -:1004D000000000000000000000000000000000001C -:1004E000000000000000000000000000000000000C -:1004F00000000000000000000000000000000000FC -:1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000FF0000CC -:100530000000FF00AAAA0000000000000000000068 -:1005400000000000000000000000000000000000AB -:10055000000000000000000000000000000000009B -:10056000C0000000200020002000C000000020008B -:1005700020000000200020002000200000000000DB -:10058000200000002000200020002000000884043B -:1005900000000000000020000000880000080000AB -:1005A00000032000000020008800200000008808D0 -:1005B000C0000000000000008800000088000084E7 -:1005C00000902000000000000000880000000004EF -:1005D00000000000000000000000000020000004F7 -:1005E00000A000000020000000000000200000002B -:1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA -:1006200000000000000000000000000000000000CA -:1006300000000004000000000000000000000000B6 -:100640000021002100000000000000000000000068 -:10065000000000000000000000000000000000009A -:100660000001001100000040000000000000000038 -:1006700000000000400000000000000000008400B6 -:10068000000810040000000000000000000000004E -:10069000000000000000000000000000000000005A -:1006A00000084004000000000000000000000000FE -:1006B000000000000000000000000000000000003A -:1006C000000000081000000000000000880000008A -:1006D0008800840000000000880000000000000086 -:1006E0000000008840080000000009000000000031 -:1006F00000000000000000000000000000000000FA -:100700000000000180010000000000000000000067 -:1007100000000000000000000000000000000500D4 -:100720000000000180010000000000000000000047 -:1007300000000000000400000000000000000000B5 -:1007400040000000000980000000000000000000E0 -:100750000000000000020000000000000000000097 -:1007600000000000002180010021000000000000C6 -:100770000000000000000004001100000000000064 -:100780000000000000000000000400000000000065 -:1007900000000041000000410000000000000000D7 -:1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000210000000008 -:1007D0000000000000000000000000020000000017 -:1007E0000000000000000000000000000800000001 -:1007F00000000000000000000000000000000000F9 -:1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000000000D8 -:1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000500000000000000A3 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000200000100058 -:10087000C0009000820040000000820000004000A4 -:100880000000A000820082000000C08010008200F2 -:10089000C0000400820004000000080008000000FE -:1008A0000000820008000800A00082800000820092 -:1008B00000000000080082000800000082008200A2 -:1008C0000000000004008200080000008284820012 -:1008D0000400000000000000000900000002000009 -:1008E00000000009000000000000C000008000407F -:1008F00000000000000000000000050021000000D2 -:1009000003000000000000000000000000020000E2 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000080000BF -:1009300000000000000000000000000000000000B7 -:10094000000000000000080000000000000000039C -:100950000000000000000000000021000000030073 -:100960000000000000000000000000000000000483 -:10097000C00000000000A000000000000000000017 -:10098000100000000011000000000021000008001D -:10099000000000000000A0000000840000008200B1 -:1009A0000000000000000000000000050000000042 -:1009B0000000A00000000000840008008200A000E9 -:1009C0000000C000000000000800000084000000DB -:1009D0000000A0000000000000000800A000A0002F -:1009E00000000000000000000800000000000000FF -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000001000000000B6 -:100A300000000000000000000000000000000000B6 -:100A4000000000000000000000880000000000001E -:100A50000000000005000000000000000000000091 -:100A60000000000000000000000000000000000086 -:100A7000000000001000000082008200A0000000C2 -:100A80000000840000000000000082000000400020 -:100A90000000102100000000100082000000000093 -:100AA000000000000000000008000000400082007C -:100AB0000000004100000000A011080082000000BA -:100AC000000082000800000000000000A0001000EC -:100AD0000005000000000000902008000800000051 -:100AE000000008000800000000000000A000000056 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B20000000000000000000000041000000000084 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B600000000000000021900000000000000000D4 -:100B70000000000000000000010020000000000153 -:100B800000009000000101020001000000081010A8 -:100B90000000000000010000000000000000000153 -:100BA0000000820000000182000000000008C00474 -:100BB0000000000000010000000000000000000034 -:100BC000000100008200000100C00001C000002000 -:100BD000C0820000C0000001000000000000000012 -:100BE000000000000000000100C00001C000002063 -:100BF000C0820000C0000001000020008000000052 -:100C00000010000000000003048008102100000014 -:100C10008000000000000041000000000000000013 -:100C2000001000000000002010800841210000009A -:100C30000000000000000041000000000000000073 -:100C40000000004000000000002040000010A00054 -:100C50000000808000008000000300000000000011 -:100C6000000000400000000000024000001088006A -:100C700000008080000080000003000000002100D0 -:100C800000000000000002000000050091000200CA -:100C90000000090000000000000080400000050086 -:100CA00000000000000040000000200003004000A1 -:100CB000004009000000000000008020000000004B -:100CC00002000000000000000500000003004100D9 -:100CD0008200000203008000000000838003000007 -:100CE00002000000000000004000000010000300AF -:100CF00002000000030000000000008080200000CF -:100D000000000000000000000100000000000400DE -:100D1000910800000000400000000000C00000003A -:100D20000000000000000000000000000000400083 -:100D3000900800000000400000000000C00000001B -:100D400000000100000000000000000000000100A1 -:100D500040000990000101004000000000C0820036 -:100D60000000010000000000000000000000010081 -:100D700040004190000001009000000000C082008F -:100D800000000000C0000000000000000000820021 -:100D9000000200000100000000000000000100004F -:100DA00000000000000000000000000000018200C0 -:100DB00000880000000000000000000000010000AA -:100DC0000000000000000000000000000000000023 -:100DD0000401000200000300000000000000000009 -:100DE0000000000000000000000000000000000003 -:100DF00004010002000003000000000000000000E9 -:100E00000000000000008000000000000000002042 -:100E100080200000000003000000000000000041EE -:100E200000000000000000000000000000000002C0 -:100E300080050000000011000000000000000041DB -:100E400000000000000000000000000000000000A2 -:100E50000003800200800000C100000000000000CC -:100E60000041000000000000000000000000000041 -:100E70000003800200800000C100000000000000AC -:100E8000004100000000800000C100000008804018 -:100E90008500000000410040000800000000000044 -:100EA000000005080000800500830000000880089D -:100EB00085000000004180000008000000000000E4 -:100EC000000020020000000000020083000000205B -:100ED0008010C100000000418000000500000041BA -:100EE0000000000005030000000200830000002055 -:100EF0000010C1000000004180000005000000411A -:100F00000002000003050000400000C100000000D6 -:100F1000020040000000004140010000000000000D -:100F20000000000000090000040000830000000031 -:100F3000020040000000002102000000000000004C -:100F40000000000000090000000082010083000092 -:100F500000010201820000000003400000000000C8 -:100F600000010000000000820000820100830000F8 -:100F7000000120018200000000114000000000007C -:100F800000010001000001820000000000000011CB -:100F90000000000000000000811200E0070048008F -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000811200E0070048006F -:100FC0000000000000000000000000000000000021 -:100FD00000000000000000000000811200E080001E -:100FE00048420000000000004842000000000000ED -:100FF00000000000000000000000811200E08000FE -:1010000048420000000000004842000000000000CC -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:101100000000000000000000000000000000757BEF -:1011100000000000000000000000000000000000CF -:10112000000000000000000000000000DEAE757B43 -:1011300000000000000000000000000000000000AF -:10114000000000000000000000000000DEAE000013 -:10115000757B00000000000000000000000000009F -:101160000000000000000000000000000000DEAEF3 -:10117000757B00000000000000000000000000007F -:101180000000000000000000000000000000DEAED3 -:10119000612603400000000000000230A0000000B3 -:1011A000000000000C4000000000000002C0648647 -:1011B000612603400000000000000230A000000093 -:1011C000000000000C4000000000000002C0648627 -:1011D0000000612603400000000000000230A00073 -:1011E0000000000000000C4000000000000002C0F1 -:1011F0006486612603400000000000000230A00069 -:101200000000000000000C4000000000000002C0D0 -:101210006486000040002000200020002000200004 -:1012200020002000200000002000200020002000DE -:1012300020004000200020000400200020002000AA -:1012400020002000200000002000200020000000DE -:101250002000000020002000200088002000200046 -:1012600020002000000020000000200420000000DA -:1012700000008400000020002000000000000000AA -:1012800020002000000000000000200000000000FE -:101290000000000000000000000009000400090038 -:1012A00000000000090000000500000040000000F0 -:1012B000000000000000000000000000040000002A -:1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000040000000A -:1012E00000000000000000000000000000000000FE -:1012F000000000000000000000000000004020008E -:1013000000000000000000002000000000000000BD -:1013100000000000000000000000000000000000CD -:10132000000000000000000000000000900000002D -:1013300000000000000000000000000000000000AD -:10134000000000000000080008000800080908006C -:101350000800080008000000000000000000000075 -:1013600000000000000000000000000000009000ED -:10137000000000000000000000000000000000006D -:1013800000002000880000000000840000008409A4 -:10139000000000000000200000000000000000002D -:1013A000000000000000000000000000000000003D -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D00000000000000000000000000000000010FD -:1013E00000000000000000000000200000000000DD -:1013F00000000000200000000000000000000000CD -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:10147000400000000000000000000000000000002C -:10148000000000000000000000000000000000005C -:101490000000000000000000000000000000080044 -:1014A00041004100000000000000000000000000BA -:1014B0000000000000000000008400000000410067 -:1014C00021000300000003000000000000000000F5 -:1014D00000004100090000000000080000000000BA -:1014E0000000000008000000200041000000000093 -:1014F0004100400000000400000000000000000067 -:101500000000410000000000000041000000000059 -:1015100000000000410000880200000000001000F0 -:10152000000000004000000000000000000010006B -:1015300000000000400000004000000000008200A9 -:101540000000000008000000000000000000000093 -:1015500000090000820000000000080000000000F8 -:101560000000000000000000000000000400000077 -:1015700000000000000000000000000082000000E9 -:1015800000000000000084000011000000090000BD -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C00000004100000000000000000000000000DA -:1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB -:1015F00000000000000000000000000000000000EB -:101600000000000000000000000000000000410099 -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000100000000000AA -:101630000000000000000000C00000000000A0004A -:101640000400000000000000000040000000000056 -:10165000000000000000000000000000000000008A -:1016600000000000000000000000820000000000F8 -:1016700082000000000000000000000000000000E8 -:10168000000008000000000000000800A0000000AA -:101690000000000000000000000000000800000042 -:1016A0000000000000000000030000001000000027 -:1016B000000000001000000008000300009000007F -:1016C00000000000000000004100000000000000D9 -:1016D0002100000003000090000000000000000056 -:1016E00000000000000000000000000000000000FA -:1016F000080000000000080000000000202000009A -:1017000000000000000000000000000000000000D9 -:1017100008000300000010000000000003000000AB -:1017200000000000080000000000001000000000A1 -:1017300000000000000000000000080000000000A1 -:101740000000C000000000000000040800000000CD -:101750000000000000000000000000000000000089 -:101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:101780000000000000000000080000000000000051 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:101800000000000000000000000000000000410097 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 :101850000000000000000000000000000000000088 :101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 +:101870000000000000000000000000000200000066 +:101880000000000200000000000000000000000056 :101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 +:1018A0000000000000000000040000000000000034 :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 @@ -41491,7 +37394,7 @@ :102070000000000000000000000000000000000060 :102080000000000000000000000000000000000050 :102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 +:1020A0000010000000000000000000000000000020 :1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000000000000010 :1020D0000000000000000000000000000000000000 @@ -41501,96 +37404,96 @@ :1021100000000000000000000000000000000000BF :1021200000000000000000000000000000000000AF :10213000000000000000000000000000000000009F -:10214000000000000000000000000000000020006F -:102150008800000020000000200004000000A00013 -:1021600020002000200020000000000020002000AF -:10217000000000002000000000000000000000003F -:10218000000000000000200000000000000400002B -:10219000000000000000200000000000000000001F -:1021A0000000000000000000200000000004000407 -:1021B00000000000000020000000000000000000FF -:1021C00000000000400000000000000000040000CB -:1021D00004000000000000000000000000000400F7 -:1021E00020000000040000000000000000000000CB +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF :1021F00000000000000000000000000000000000DF :1022000000000000000000000000000000000000CE -:1022100000000000000000000000040000000000BA +:1022100000000000000000000000000000000000BE :1022200000000000000000000000000000000000AE :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E -:102250000000000000000000000000000000080076 -:10226000001000000000000000000000000000005E -:1022700000000000000000000000000084000800D2 -:102280000800000000000000000000000000000046 +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E :10229000000000000000000000000000000000003E -:1022A0000800000000000000000000000000000026 -:1022B0000000820000000000000000000400820016 -:1022C0000800001000000000820000000000000074 +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E :1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE +:1022E00000000000000200000000000000000000EC :1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD :1023100000000000000000000000000000000000BD :1023200000000000000000000000000000000000AD :10233000000000000000000000000000000000009D -:1023400000000000000000900000000000000000FD +:10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D -:10236000080000000000400008000800080000000D -:1023700000000000000084000800000000000000D1 -:10238000080008000000080008000800080000001D -:102390000000000000000000080000000000000035 +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D :1023A000000000000000000000000000000000002D :1023B000000000000000000000000000000000001D -:1023C00000000000000000000000400000000000CD +:1023C000000000000000000000000000000000000D :1023D00000000000000000000000000000000000FD :1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000000CC +:1023F00000000000000000000000000000000010CD +:1024000000000000000000000000000000000010BC :1024100000000000000000000000000000000000BC -:1024200000000000000000000000000800000000A4 -:102430000000000000000020040000000000000078 +:1024200000000000000000000000000000000000AC +:10243000001000000000000000000000000000008C :10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:102460000000080000000000000000000000000064 -:102470000000000000000000000000000800000054 +:102450000008000000000000000000000000000074 +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C :10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C :1024A000000000000000000000000000000000002C :1024B000000000000000000000000000000000001C -:1024C0000000000000000000000000040000000008 -:1024D00000020000000000000000000000000000FA -:1024E00000000000000000000000000000000000EC +:1024C00000000000000000000000000800080000FC +:1024D00000080000000000000000000000000000F4 +:1024E00000000000000000000000000800000000E4 :1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B -:10254000110000000000000000000000000000007A -:10255000000000000000000000000000000000007B +:10253000000000080000880000000000000000000B +:10254000000000000000000000000000000000008B +:1025500000000000000000009000000004000000E7 :10256000000000000000000000000000000000006B :10257000000000000000000000000000000000005B :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B -:1025C000000000000000000000000000000000000B +:1025B00000000000000000000000000000000020FB +:1025C0000000000000000000000000000000040007 :1025D00000000000000000000000000000000000FB :1025E00000000000000000000000000000000000EB -:1025F00000000000000000000300000000000000D8 +:1025F00000000000000000000000000000000000DB :1026000000000000000000000000000000000000CA -:1026100000000300000000000000000000000800AF +:1026100000000000000000000000000000000000BA :1026200000000000000000000000000000000000AA :10263000000000000000000000000000000000009A :10264000000000000000000000000000000000008A -:10265000000000000000000000000000002000005A +:10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A :10267000000000000000000000000000000000005A :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A +:1026A00000000000000000A000000000000000008A +:1026B000000800000008000000000000000000000A :1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000008000000F2 +:1026D00000000000000000000000000000000000FA :1026E00000000000000000000000000000000000EA :1026F00000000000000000000000000000000000DA :1027000000000000000000000000000000000000C9 @@ -41754,70 +37657,70 @@ :1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF -:10311000000000004000000000000000000000006F -:10312000000000000000200000000000000000007F +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F -:10314000000000000000200000000000000000005F +:10314000000000000000000000000000000000007F :10315000000000000000000000000000000000006F -:10316000000000000000000020000000000000003F -:103170000000000000040000040000000000000047 -:10318000000000000000000020000000000010000F -:1031900000000000000020000000002000004000AF +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF :1031D00000000000000000000000000000000000EF -:1031E000000000000000000040000000000000009F -:1031F00004000000000000000000000000000000CB +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE :1032100000000000000000000000000000000000AE :10322000000000000000000000000000000000009E -:10323000000000000000001000000000000000007E -:1032400000008200000000000000000000000000FC +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E :10325000000000000000000000000000000000006E -:103260000000020002000200020000000000000056 -:1032700000000400000000000010820084008200B2 +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E :10328000000000000000000000000000000000003E :10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E +:1032A000000000000000000200000000000000001C :1032B000000000000000000000000000000000000E :1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:103330000000000000000000000000000800000085 -:10334000000000000000000000000000000000007D +:1032D0000000C000000000000000A000000000008E +:1032E00000000001000000000000000000000000DD +:1032F000000000002000000000000000200000008E +:1033000000001000000000000000000000000000AD +:10331000000000002000000000000000200000006D +:10332000000020000000000000000000000000007D +:10333000000000000000000000000000000000008D +:10334000100000001000000000000000000000005D :10335000000000000000000000000000000000006D -:10336000000000000000000000000200000000005B +:10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D -:1033A0000000000000000000000000000000080015 +:1033A000000000000000000000000000000000001D :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD +:1033E00000000000200800000000000000000000B5 +:1033F00000080000000000000000000000000000C5 :1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:10348000000000400040004000400000000000003C -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC +:103420000000000000000000000000000084000018 +:1034300000840008000800000084000000840008E8 +:1034400000080084000800000000000000000000E8 +:103450000000000800880000000000000000008854 +:1034600000880000008480010000000000000000CF +:10347000000000000008000000000008000800082C +:103480000008000000000000000000000000000034 +:103490000000000800080000000000080008000804 +:1034A0000008000000000000000000000000000014 +:1034B0000000000000000000000000000000000507 +:1034C00000000021000000000000000500000005D1 +:1034D00000000005000500020000000000000000E0 :1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB +:1034F00000000000000000000021000000000000AB +:10350000000000000000000000200000000000009B :1035100000000000000000000000000000000000AB :10352000000000000000000000000000000000009B :10353000000000000000000000000000000000008B @@ -41846,8 +37749,8 @@ :1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A :1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA +:1036D0000000000000000000000002000208880056 +:1036E0000000000800030000000800410000000086 :1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 :1037100000000000000000000000000000000000A9 @@ -41857,13 +37760,13 @@ :103750000000000000000000000000000000000069 :103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 +:103780000000000004000000000000000000000035 :103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 +:1037A00000200000000000000000000000000000F9 :1037B0000000000000000000000000000000000009 :1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 +:1037D00000000021000000000000000000000003C5 +:1037E000000000050000000800080008004100007B :1037F00000000000000000000000000000000000C9 :1038000000000000000000000000000000000000B8 :1038100000000000000000000000000000000000A8 @@ -41878,74 +37781,74 @@ :1038A0000000000000000000000000000000000018 :1038B0000000000000000000000000000000000008 :1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 +:1038D00000000000000000000000000100010001E5 +:1038E00000C00001080100C1001100000001000833 +:1038F00000020001000100C0000000000000000004 :1039000000000000000000000000000000000000B7 :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 :103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 +:1039500000000000000000000000000000410041E5 +:103960000041009100418041008308C100082041CE +:1039700000000080004100410082000000000000C3 :103980000000000000000000000000000000000037 :103990000000000000000000000000000000000027 :1039A0000000000000000000000000000000000017 :1039B0000000000000000000000000000000000007 :1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 +:1039D00000000000000000000000000000004100A6 +:1039E0000300000000804100C10000090800100031 +:1039F0008800000088004100C10000800000000035 :103A000000000000000000000000000000000000B6 :103A100000000000000000000000000000000000A6 :103A20000000000000000000000000000000000096 :103A30000000000000000000000000000000000086 :103A40000000000000000000000000000000000076 :103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 +:103A600001000100000000C00100C00000000100D2 +:103A7000900003900088C1000900C1000084020288 +:103A80000001000000000000000000000000000035 :103A90000000000000000000000000000000000026 :103AA0000000000000000000000000000000000016 :103AB0000000000000000000000000000000000006 :103AC00000000000000000000000000000000000F6 :103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 +:103AE000000000C00001C0C100000000000100C1D2 +:103AF00008880021000100C1000000000001000052 :103B000000000000000000000000000000000000B5 :103B100000000000000000000000000000000000A5 :103B20000000000000000000000000000000000095 :103B30000000000000000000000000000000000085 :103B40000000000000000000000000000000000075 :103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 +:103B6000000000000080004180C100000000004112 +:103B7000008380030041004100C1000000000041BB +:103B80000002000000000000000000000000000033 :103B90000000000000000000000000000000000025 :103BA0000000000000000000000000000000000015 :103BB0000000000000000000000000000000000005 :103BC00000000000000000000000000000000000F5 :103BD00000000000000000000000000000000000E5 -:103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 +:103BE000000000000000C100800080C10000411101 +:103BF000801104004100C14100008010000041001C +:103C000000008000410000000000000000000000F3 :103C100000000000000000000000000000000000A4 :103C20000000000000000000000000000000000094 :103C30000000000000000000000000000000000084 :103C40000000000000000000000000000000000074 :103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 +:103C60000000000000000000C1004000C0C10000D2 +:103C70000100200010000100C1119000C0010000EF +:103C800001000000C0000100000000000000000072 :103C90000000000000000000000000000000000024 :103CA0000000000000000000000000000000000014 :103CB0000000000000000000000000000000000004 :103CC00000000000000000000000000000000000F4 :103CD00000000000000000000000000000000000E4 :103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 +:103CF00000420000000000000000811200410700A7 +:103D0000480000000000000000000000000000006B :103D100000000000000000000000000000000000A3 :103D20000000000000000000000000000000000093 :103D30000000000000000000000000000000000083 @@ -41968,6 +37871,4103 @@ :103E40000000000000000000000000000000000072 :103E50000000000000000000000000000000000062 :103E60000000000000000000000000000000000052 +:103E7000757B000000000000000000000000000052 +:103E80000000000000000000000000000000DEAEA6 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF000000060C603000000000000000031E00088 +:103F00000000000000000C0000000000000000C0E5 +:103F10006306000000000000000000000000000038 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50000000000000002000000000000000000041 +:103F60002000000020000000000020008800000069 +:103F70000000000000002000000000000000000021 +:103F800020000000200000000000200000000000D1 +:103F90000000000000010000200000000000000000 +:103FA00000002000000020000000000020000000B1 +:103FB00000000000000000002000000000000000E1 +:103FC0000000200000002000000000002000000091 +:103FD00000000000000000000002000000000000DF +:103FE00000000000000000000000000000000000D1 +:103FF00000020000000000000000000000000000BF +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:104050000000000000000000000000000000080058 +:104060000000000000000200000000000000080541 +:1040700000000000000004000000000000000040FC +:10408000000000000000000000000000000002101E +:104090000000000000000000000000000000000020 +:1040A0000000000000800000000000000000000090 +:1040B00002000000000000000000000000000000FE +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000000200000000000000DE +:1040E00000000000000000000000000000000000D0 +:1040F0000000000000000000800000000000000040 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:104120000000000000000002000000000008000085 +:104130000008001000000000000000000000000067 +:104140000000000000000000000000000008000067 +:104150000008000000000000000000000000000057 +:10416000000000000000000000000000002100002E +:10417000000000000000000000000000000200003D +:10418000000000030000000800090000000000001B +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:10420000000000000000200002000000000000008C +:104210000000000800200020000000000000000056 +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:104260000000000000000200C0000000000000008C +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:104290000000000000000000080000000000000016 +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E000000000000000000080000000000000004E +:1042F00000000082000000840000000000000000B8 +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000002100000000000000000000005C +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:1043600000000000000088000000000000000000C5 +:104370000000000500008400000000000000200391 +:1043800000020002C0020002000200000000000063 +:104390000009001000000000000000000000000004 +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:104400000000000000000000000000000000008428 +:104410000900000000850400200405041188000044 +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000001000003C +:1044700000000000002000200000080000000021D3 +:1044800000000021000300000003000000000010F5 +:10449000000000000000000000080000000000080C +:1044A000000000000000000000000000000000000C +:1044B000000082000000000000000000000000007A +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000001CB +:1044F00000000000000000010001000080000082B8 +:1045000000000000000000000000000000000000AB +:10451000000100000000000000000000000000009A +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:104560000000000000000000000000000040008883 +:1045700000880088000000000000000000A000206B +:104580000020004002020000008808000000001027 +:1045900000100010008800880088008800000000DB +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F0000000000000000300000000000000008038 +:104600000000000000008091001000828011000076 +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:10467000000000800080000000000000000000003A +:1046800000000010008000008000A1419000100098 +:10469000800000008000000080000000800080009A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C00000080000000000000000000000000000E2 +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000001000A000000000000000000A +:104700000008000000000008000008020501A08861 +:10471000900002008800A0009000A0002000A000EF +:10472000A0000000000000000000000000000000E9 +:1047300000000001000000000000000000900000E8 +:104740000000000100000000000000000000000068 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:1047700000000000C0000002009010400000000097 +:1047800010000000100000000000100000A0001049 +:1047900001A0001000100010001010100089008906 +:1047A00000890089000000000000000000000000F7 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F0000000000000008000008000800000000039 +:104800000000000000008000000000008000008028 +:1048100011000580110000000000000080800008E9 +:104820000008000800080000000000000000000070 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 +:1048700000000000000000000010000000008000A8 +:104880000000001000000000000080000000800018 +:1048900000001180110011000000008000000000E5 +:1048A0000000008000800000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000000000100010000000000000000000C8 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000020188008800A5 +:10490000080000000000000000000200080088000D +:104910001000101010A010881000000000A00088E7 +:104920000000000020A020020000000000000000A5 +:104930000000000000000000000000000000000077 +:104940000000000000000100010000000000000065 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000000047 +:1049700000000000000000000000000000810000B6 +:10498000820042000041000007000000000000001B +:104990000000000000000000820041000000000054 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F0000000000000000000000000000000003087 +:104A000000BA00FFF0F000000000000000003C3C95 +:104A100010FF00000000FFFFFFFFAAAAAAAA0000E3 +:104A2000000000030000F000F000FFFF03000000A2 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A8000003000BA00FFF0F000000000000000005D +:104A9000000010FF00000000AAAABAFF08AA000048 +:104AA0000000000000030000F000F000FFFF030022 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000000000D6 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 +:104B000000007F004F0000000000000000000000D7 +:104B10000000002A002A000000000F0F00005F5F65 +:104B20005F5F61026102434000000030C3F3101078 +:104B30001010000000000000000000000000000055 +:104B40000000000000000000000000000000000065 +:104B50000000000000000000000000000000000055 +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B8000000000007C004000000000000000000069 +:104B90000000000000FF002A000000000F0F0000CE +:104BA0005F5FFF7F61026102000000000030C3F31D +:104BB0003C300C000000000000000000000000007D +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C00000000000000000000302000000000000054 +:104C10000038050000A000000000000000008061D6 +:104C20000006000D00000000000000000000006110 +:104C30000006000D00000000000000000000000061 +:104C40000000000000000000000000000000000064 +:104C500000610006000D00000000000000000000E0 +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0000F900F90000000000000000000000000C6 +:104CB0000000000000033F3300000000000000007F +:104CC00000000000000000000000000000000000E4 +:104CD0000000A000A0000000000000000000000094 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D200000000F900F900000000000000000000045 +:104D300000000000000000033F33000000000000FE +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA0000000000001107D00000000000000000075 +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E200000000000000048407DC000F000000000CD +:104E30000000000000000000000000000000000072 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000000032 +:104E80000000000000000000000000000000000022 +:104E900000000000000000002000000000000000F2 +:104EA00000000000000000000000000000002000E2 +:104EB00000000000000000002000040004000400C6 +:104EC00000000000000000020010000000002000B0 +:104ED000000300000000000000002000200020006F +:104EE000200000000000000000008400000000001E +:104EF0002000000000000000000020000000000072 +:104F00004000000000000000000000000000000061 +:104F10002000000000000000000000000000000071 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000008000800071 +:104F400080000000000000000000000000000000E1 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F7000000000000000000000000000000000022F +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB0000000000000000000000000000000008071 +:104FC00000800090000000000000000000000000D1 +:104FD00000000000000000000000000000000000D1 +:104FE00000000000000000000000000000000000C1 +:104FF00000000000000000000000000000000000B1 +:1050000000000000000000000000000000000000A0 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000000000070 +:105040000020002000200000000000000000000000 +:105050000000000000000000000000000000000848 +:105060000000000000000008000000000000000038 +:105070000000000000000000000000000000000828 +:105080000000000000000008000000000000000018 +:105090000000000000000000000000000000000010 +:1050A000000000000000000000000080000000047C +:1050B00000000000000000000080018001800188E5 +:1050C00000800080008084000400000004000000D4 +:1050D0004000000000000000000000000000000090 +:1050E00000000000000000000000000000000000C0 +:1050F0000000000000000000002000000000000090 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:1051200000000000030041000020000000100020EB +:105130000001008400000000000000200420042082 +:1051400004200020002004200004000000000000D3 +:10515000000000200000000000000000000000002F +:10516000000000000000000000000000000000003F +:10517000000000000000000000000001000000002E +:10518000000000000000000000000000000000001F +:10519000000000000000000000000000000000000F +:1051A000A00000000000000000000100000000045A +:1051B000830000000000000000000000000000006C +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:105200000000000000000000080008000800000086 +:10521000000000000000000082000000000000000C +:10522000000000000000000000000000040000007A +:10523000000120000000000000000000000000004D +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A000000004000000020000000004044190051A +:1052B000000020008200000000000000A1800080AB +:1052C0000000008083000080008000800080008853 +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:10531000000000000000000000000000000082000B +:105320008200218200000084808200000001800051 +:10533000000000008000000000A000000000042029 +:105340000020000000200400002004200020002095 +:105350000020002000000000008800000000000085 +:105360000000000000000000000000000000080035 +:10537000080008A00000000000000000000000007D +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D +:1053A00000000000000000000003C00000410008F1 +:1053B000000800080000000082000011000000004A +:1053C00000000000000300000000000000000000DA +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:105410000000000000000000000000000000080084 +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:10549000000000000000000000000000000000000C +:1054A00000000000000000000008000800080008DC +:1054B0000000000000000000000000880000000064 +:1054C000000000000000000000C00090000000008C +:1054D00000C000900000000000000000000000007C +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:1055200000000000000000000000008000800080FB +:1055300000804000000000000000000000000000AB +:10554000000000000000000000000080008000005B +:10555000000000800080000000000000000000004B +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A0000000000000000000000000000000008378 +:1055B00000808080000000000000008000000000EB +:1055C000004100000000800000008080000080009A +:1055D000000080800000800000008080000000004B +:1055E00000000000000000000000000000000000BB +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A +:10561000000000000000000000000000000000008A +:10562000000000000000000000000000000000007A +:10563000901100089090000200000000000400009B +:10564000000000010000000082000000C090000087 +:1056500082000000C090000082000000C0900000A6 +:105660000000000000000000000000000000000139 +:10567000000000000000000000000000000000002A +:105680000000000000000000000000000000000812 +:10569000000000000000000000000000000000000A +:1056A00000000000000000000000000000000000FA +:1056B00000000000000090000000000088000000D2 +:1056C00000008800000003000000000000900000BF +:1056D00000000000009000C000000000009000C02A +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:1057300000000000000000008000000000000000E9 +:105740000000000300030000910000000000008042 +:1057500000000000000000800080000000000080C9 +:1057600000800000000000000000000000000000B9 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B0000000000080058000000080000000110053 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000801180000000000080118000A7 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000000000000A9 +:105800000000000000000000000000000000000296 +:105810000008000000000000000000000000000080 +:105820000000000000000000000000000000000078 +:1058300000000000000008000800880002000000CE +:105840000100000000000000000000000000000057 +:10585000000000000000C001200000000000C001A6 +:105860002000000000000000000000000000000018 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:105890000001000100000000000000000000000006 +:1058A00000000000000000000000000000000000F8 +:1058B0000000000000000000818100E007000000FF +:1058C000884100E007000000000000E00000002127 +:1058D00000060000820000000006000082000000B8 +:1058E0000006000082000000000000000000000030 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000000000000097 +:1059100000000081000007000000000000000000FF +:105920000000000000000000000000000000000077 +:1059300000000000000000000000FFFF090D000053 +:105940000000000000000000000000000000000057 +:10595000000000000000FF00FF00FF000000FF004B +:105960000000FF000000FF00000000000000000039 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B000000000000000000000000000FFFF000DDC +:1059C00000000000000000000000000000000000D7 +:1059D0000000000000000000FF00FF00FF000000CA +:1059E000FF000000FF000000FF00000000000000BA +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00020FFFFFF0F0FFFFF00000000000000009D +:105AD00000990099000000000000000000000F0F76 +:105AE000000000FF00000F0F000000FF00000F0F7C +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B4000000020FFFFFF0F0FFFFF0000000000001C +:105B50000000009900990000000000000000000013 +:105B60000F0F000000FF00000F0F000000FF0000FB +:105B70000F0F000000000000000000000000000007 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC0000000000000613036C00D000000610024BC +:105BD000850D00A0006100060009000000000030F3 +:105BE0000C0012C0038203300C0092C00382033009 +:105BF0000C008AC00000000000000000000000004F +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000000084 +:105C20000038000000A0000000000000000000009C +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000FF5500 +:105C5000FF550000000000000000C0C0C0C00000F0 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD000FF55FF550000000000000000C0C0C0C01C +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E20000000000000000000000000000000000072 +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E80000000000000000002000000000000000010 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000020000000000000000000000000000C0 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F2000000200000000000000000000000000026D +:105F3000000000000000000000000000000000025F +:105F40000000000000000000000000000000100041 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC00000000000000000000000000000000000D1 +:105FD0000000900000000000000000080000000029 +:105FE00000000000000000000000001000000000A1 +:105FF0000000000000000000000000100000000091 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:10606000000000000400000000000000000000002C +:106070000000000000000000000000000000000020 +:106080000000000000000000000004000400000008 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000000000000000000000D0 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F000000000000000000000000000000002009E +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000052A +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E0000800000000000010000000000000008412 +:1062F000000000000084000000000000000000001A +:10630000000000000000000000000000000000008D +:10631000002000000000000000000000000000005D +:10632000000000000000000000000000000000006D +:106330000000000000000000000000000000000459 +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:106370000000000000000000000200000000000219 +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000000000000000000000CD +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:10642000000000000000000000000000000000006C +:10643000000000000000000000000000000000005C +:10644000000000000000000000000000000000004C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C +:1064900000000000000000000000000000000000FC +:1064A00000000000000000000000000000000000EC +:1064B00000000000000000000000000000000000DC +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:10651000000000000000000000000000000000007B +:10652000000000000000000000000000000000006B +:10653000000000000000000000000000000000005B +:10654000000000000000000000000000000000004B +:10655000000000000000000000000000000000003B +:10656000000000000000000000000000000000002B +:10657000000000000000000000000000000000001B +:10658000000000000000000000000000000000000B +:1065900000000000000000000000000000000000FB +:1065A00000000000000000000000000000000000EB +:1065B00000000000000000000000000000000000DB +:1065C00000000000000000000000000000000000CB +:1065D00000000000000000000000000000000000BB +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A00000000000000000000000000000000000EA +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000000069 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000076 +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000200000000000000000000000D6 +:106AA00040000000000000000000000000000000A6 +:106AB00000000000200000000000000000000002B4 +:106AC00000000000000000000000000000000000C6 +:106AD0000000000000002000000000000080000016 +:106AE00000000000C00000000000000000000000E6 +:106AF0000000000000002000000000000000000076 +:106B00000000000000020000000000000000000083 +:106B100000000000000000000000004000000040F5 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000243 +:106B50000000000000000000000000000000000431 +:106B600041000000000000000000000000020000E2 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 +:106BA00008000000000000000000000000000000DD +:106BB00000000000000000000000000000000000D5 +:106BC0000040000000000000000000000000000085 +:106BD00000000000000000000000000000000000B5 +:106BE0002000000000000000000000000000000085 +:106BF0000000000000000000000000000000000095 +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C6000090080000000000000000000000000009B +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000004000000000000000400CC +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE000000000000000880000000000000000001C +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000000000000000043 +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000000000C3 +:106DD000000000000000A000000000000000000013 +:106DE0000000000000000000000000800000000023 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000020000002 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE000000000008400900000000000000000008E +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000008000000000000000000A9 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000002000000000000000000040 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000030000000000008C +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:1072700000000000000000000000000000200000EE +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000004000004D +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000608100E0070000000000000000000000B3 +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000000000000000BB +:1075D00000000000000000000000000000000000AB +:1075E000000000000000000000000000000000009B +:1075F000000000000000000000000000000000008B +:10760000000000000000000000000000000000007A +:10761000000000000000000000000000000000006A +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00000000000000000000000000000000000BA +:1076D00000000000000000000000000000000000AA +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000000039 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:107780000000000000000000000000610036C00D95 +:1077900000A0000000000000000000000000000049 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 +:107910000000000000000000000000000000000067 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 +:107950000000000000000000000000000000000027 +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000020000000A7 +:1079C000000040002000A0000000000000000000B7 +:1079D0004000000000002000000000002000000027 +:1079E0000000200020002000000000000000000235 +:1079F0002000000000002000000000010000000046 +:107A00000000000020002000000000000000000036 +:107A10000000200000000000000000000000000046 +:107A20000000000020002000000000000000000016 +:107A30000000000000000000000000000000000244 +:107A40000000000000000000000000000000000036 +:107A500000008000000000020000000000000000A4 +:107A60000000000000000000000000820000000094 +:107A70000000000200020000000000000000000002 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000000000000000000D6 +:107AB0000000000000004000000000000000000086 +:107AC0000000000000000000000000000040000076 +:107AD0000000000000400000000000000040000026 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000400000000000000000000046 +:107B00000000000000000000000000000000000075 +:107B10000000000000000040000000000000000025 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B400000000000000000400000000000080000ED +:107B50000000000000000000000000000000000025 +:107B6000000000000000000000000000000800000D +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000008ED +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000008CD +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C20000000A000000000000000000000000000B4 +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C9000000008000000000000000000410000009B +:107CA00000000800000000000000000000000000CC +:107CB00000000000000000000000000000000000C4 +:107CC0000000410000000000000000000000000073 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D400000000000C0000000000000000000000073 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000200000000000000B1 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000083 +:107E0000000000000000000000000000000008006A +:107E100000000000C00000000000000000000000A2 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000000000000042 +:107E4000000008000000000000000000000000002A +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA0000000000000C000000000200000000000F2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000000000000000000000B2 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 +:107F20000000000000000800000000000000000049 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000005F +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000001000100018C +:1081F000000100000000000000000000000000007E +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:1082600000000000000000000000000000200003EB +:1082700000042011000000000000000000000000C9 +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000000000000000000CD +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F0000000000000E0000000000000000000009D +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:10862000000000000000000000000000000000004A +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000000000001A +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C00000000000000000000000000000000000AA +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A +:1086F0000000000000000000000000000000006119 +:108700000006000D00000000000000000000000056 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000FCF00C000000000000000000F1 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:10880000000000000000FCF00C0000000000000070 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 +:108960000000000000000000000000000000000007 +:108970000000000000000000008000000000000077 +:108980000000000000000080000000000000000067 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000001000000000000B6 +:1089C00000000000000000000000000000000000A7 +:1089D0000000000000000000000000000000000097 +:1089E0000000000004000000000000000000000083 +:1089F0000000000000000000000000200000000057 +:108A0000000000000000400000044000410000C0E1 +:108A10000000000000000000000000000000000056 +:108A2000000200000002000000020002000200003C +:108A30000002000200000000000000000000000032 +:108A40000000000000000000000000000000000026 +:108A50000000000000000000000000000000000016 +:108A60000000000000000002000000000000000004 +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000001000000000B6 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000040000000000000082 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC00000000000000000000000000000000000A5 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10004100000000000000000000000000000013 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000400000000000030 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 +:108C600000000000000000080000000000000000FC +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D8000000000000000000088000000000000005B +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900001000000000000000000000000000000D0 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000100000000000000000000000000040 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:10915000000000000000000000000000000000000F +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000000000000000000000000000000000CF +:1091A00000000000020000010000000000000000BC +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F +:1091D000000000000000000000000000000000008F +:1091E000000000000000000000000000000000007F +:1091F000000000000000000000000000000000006F +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000004E +:10922000000000100000800000110000000000009D +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E +:10925000000000000000000000000000000000000E +:1092600000000000000000000000000000000000FE +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE +:10929000000000000000000000000000800000004E +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000000000000000000000000000008E +:1092E000000000000000000000000000000000007E +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:1093100000000000000000000000000000009000BD +:1093200000000000400000000000000000000000FD +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D +:1093600000000000000000000000000000000000FD +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A0000041000007000000840000E00000000011 +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000000000000004C +:1094200000003C3CFFFF00000000000000000000C6 +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC +:1094A000000000003C3CFFFF000000000000000046 +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000000000008C +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000000000005B +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C000000000000000000000000000000000009B +:1095D000000000000000000000000000000000008B +:1095E000000000000000000000000000000000007B +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000003000000A +:10963000000000610006C0090000000000000000FA +:10964000000000000000000000000000000000001A +:10965000000000000000000000000000000000000A +:1096600000000000000000000000000000000000FA +:1096700000000000000000000000000000000000EA +:1096800000000000000000000000000000000000DA +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000000000000000003C3CFFFF0000000034 +:1096C000000000000000000000000000000000009A +:1096D000000000000000000000000000000000008A +:1096E000000000000000000000000000000000007A +:1096F000000000000000000000000000000000006A +:109700000000000000000000000000000000000059 +:109710000000000000000000000000000000000049 +:109720000000000000000000000000000000000039 +:10973000000000000000000000003C3CFFFF0000B3 +:109740000000000000000000000000000000000019 +:109750000000000000000000000000000000000009 +:1097600000000000000000000000000000000000F9 +:1097700000000000000000000000000000000000E9 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000000000000000000000000099 +:1097D0000000000000000000000000000000000089 +:1097E0000000000000000000000000000000000079 +:1097F0000000000000000000000000000000000069 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 +:109830000000000000000000000000000000000028 +:109840000000000000000000000000000000000018 +:109850000000000000000000000000000000000008 +:1098600000000000000000000000000000000000F8 +:1098700000000000000000000000000000000000E8 +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000000000000000000000A8 +:1098C0000000200000000000200000000000000058 +:1098D0000000200000000000000000000000000068 +:1098E0000000200000000000200000000000000038 +:1098F0000000200000010000000000000000000047 +:109900000000000020000000000020000000000017 +:109910000000000020000000000000000000000027 +:109920000000000000000000000020000000000017 +:109930000000000000000002000000000000000025 +:10994000000000C000000000000000000000000057 +:109950000000000000000000000000000000000007 +:1099600000000000000000020002000200000002EF +:1099700000000000000000000000000000000000E7 +:1099800000000000000000020000000000000000D5 +:1099900000000000000200000000000000000000C5 +:1099A0004000000000020000000000000000000075 +:1099B0004000004000000000200000000000000007 +:1099C0000000000000000010010000000000000086 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A400000080000000000000008200000000000E6 +:109A5000008400000000000800000000000000007A +:109A600000100000000000000008000000000000DE +:109A700000000000000000080000000000000000DE +:109A800000000010000000000000000800000000BE +:109A900000000000000000000008000000000000BE +:109AA00000000000000000000000000800000000AE +:109AB00000000000000000000004000000000000A2 +:109AC0000000001000000000A00000000080000066 +:109AD0000000000000000000000000000000000086 +:109AE000000000080000000000000000000000006E +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B30000000000000000000000000000000000025 +:109B4000000000000000000041000000410000048F +:109B50000000000000000000000000000000000005 +:109B600000000000000000000000000000000000F5 +:109B700000000000000000000000000000000000E5 +:109B800000000000000000000000000000000000D5 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 +:109BC0000000000000000000000000000000000095 +:109BD0000000000000000000000000000000000085 +:109BE0000000000000000000000000000000000075 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C3000000000000000C000000000000000000064 +:109C4000080000000000000000000000000000000C +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000000000E4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000008000000840000000000000008 +:109CD000A0002000000000000000000000000000C4 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D3000000000000800000000000000000000001B +:109D40000000000008000000000000000800000003 +:109D50000000000080000000000000000000000083 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000000000000000000000D3 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC000000000000000000000000000080000008B +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000020000000000000010 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000200000000000000062 +:109EE0000000000000000000000000000000000072 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 +:109FC0000000000000000000000000000000000091 +:109FD0000000000000000000000000000000000081 +:109FE0000041000000000000000000000000000030 +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 +:10A010000000000000000000000000000000000040 +:10A020000000000000000000000000000000000030 +:10A030000000000000000000000000000000000020 +:10A040000000000000000000000000000000000010 +:10A050000000000000000000000000000000000000 +:10A0600000000001000000000000000000000000EF +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000000D0 +:10A0900000000000000000000000000000000000C0 +:10A0A00000000000000000000000000000000000B0 +:10A0B00000000000000000000000000000000000A0 +:10A0C0000000000000000000000000000000000090 +:10A0D0000000000000000000000000000000000080 +:10A0E0000000000000000000000000000000000070 +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F +:10A11000000000000000000000000000000000003F +:10A12000000000000000000000000000000000002F +:10A13000000000000000000000000000000000001F +:10A14000000000000000000000000000000000000F +:10A1500000000000000000000000000000000000FF +:10A1600000000003002000000000000000000000CC +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A1900000000000000000000000000000000000BF +:10A1A00000000000000000000000000000000000AF +:10A1B000000000000000000000000000000000009F +:10A1C000000000000000000000000000000000008F +:10A1D000000000000000000000000000000000007F +:10A1E000000000000000000000000000000000006F +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A21000000000000000000000000000000000003E +:10A22000000000000000000000000000000000002E +:10A23000000000000000000000000000000000001E +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000000000000BE +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000000000000000008E +:10A2D000000000000000000000000000000000007E +:10A2E00000000000600000E000000000600000E0EE +:10A2F00000006000000000000000000000000000FE +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000000000002D +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A3900000000000000000000000000000000000BD +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000008D +:10A3D000000000000000000000000000000000007D +:10A3E000000000000000000000000000000000006D +:10A3F000000000000000000000000000000000005D +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000000000000000000000000009C +:10A4C000000000000000000000000000000000008C +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000000000000000000000006C +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B +:10A53000000000000000000000000000000000001B +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB +:10A5600000000000000000000000000000000000EB +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000000009B +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000000000000000000007B +:10A5E000000000000000000000000000000000006B +:10A5F00000610006C009000000610006C00D0000F7 +:10A60000000000000000000000000000000000004A +:10A61000000000000000000000000000000000003A +:10A62000000000000000000000000000000000002A +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000000000000FA +:10A6600000000000000000000000000000000000EA +:10A6700000000000000000AA000000000000000030 +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000000AA +:10A6B000000000000000000000000000000000009A +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A +:10A6F000000000000000000000AA000000000000B0 +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A880000000400040000000200020000000000008 +:10A8900000000000000000000000000000000000B8 +:10A8A0000000200020000000200020000000000028 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000020002000000020002000000008 +:10A8D0000000000000000000000000000000000078 +:10A8E00000000000200020000000200020000000E8 +:10A8F0000000000040000000000200000000000016 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A920000000000200000000000000900000000095 +:10A930000000000000000000000000000000000017 +:10A940000000000200000000000000000000000005 +:10A9500000000000000000000000000000000000F7 +:10A9600000020000000000000000000000000000E5 +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000020000000000000000000000B5 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000002000000000000000000000075 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000040000000000000000000000000092 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB0000050005000000000000000000000000003B +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000021000000B4 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000100000A5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF000000000000000080000000000000000004D +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF000000000000000000000000000000008004B +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000200079 +:10B7B0000000000000000000000000000000200069 +:10B7C0000000000000000000000000000000200059 +:10B7D0000000000000000000000000000000200049 +:10B7E0000000000000000000000000000000000059 +:10B7F0002000000000000000000000000000000029 +:10B800002000000000000000000000000000000018 +:10B810002000000000000000000000000000000008 +:10B820000000000000000000000000000000000018 +:10B830000000000200000000000000000000000006 +:10B8400000000000000000000000000200000000F6 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000200020002000000000000D2 +:10B8700000000000000000000000000000000000C8 +:10B880000000000000000000000040000000000078 +:10B890000000000000000000000040000000400028 +:10B8A0000000400000000000000040000000000018 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B9300000000000000800000000000000000000FF +:10B9400000000000000000000000000000000000F7 +:10B9500000000000040800000000000000000000DB +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000080000000000000000BF +:10B9800000000000000000000000000000000000B7 +:10B99000000000000000000800000000000000009F +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000200000000000000066 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000A00000000000000064 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD300000000000080000000000000000000000FB +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000005000000BE +:10BD800005000000000000000000000000000000AE +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C770000000400000000000000000000000000079 +:10C780002000000000000000000000000000000089 +:10C7900000002000000000000000000000800000F9 +:10C7A00020000080000000000000000000030000E6 +:10C7B0000000000020000000000000000000000059 +:10C7C0000000200000000000000000000000000049 +:10C7D0000000000020000000000000000000000039 +:10C7E0000000000000000000000000000000400009 +:10C7F00040000000000000000000000000000000F9 +:10C800000000000000000000000000000000000028 +:10C8100000000000000200000002000000020040D2 +:10C8200000020000004000020000000000000000C4 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000200000000D6 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C880000000000000000000000000000000820026 +:10C890000000000000000000000000000000000098 +:10C8A0000000000001000000000000000000000087 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000200000000000000000005 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000001000000010000000400000081 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA200000000000000010000000200000000000D6 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA70000000410000000000000000000000000075 +:10CA800000000000000000000000000000000000A6 +:10CA90000800000000000100A000000000000000ED +:10CAA00000000000000000000000004000000180C5 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000002000000000000000000000044 +:10CAF00000000000820000000000000000000000B4 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000040000000000000011 +:10CB20000000000000000000000000000001000004 +:10CB300004040000000000000000000000000000ED +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000002000000000000075 +:10CBA0000000000082000000000090000000000073 +:10CBB0000000100000000000000000000000000065 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF00000000800000000008200000004000000A7 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000010000000013 +:10CC20000000000000000000000000000000000004 +:10CC30000000000080000000000000000000000074 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000084000000008000B0 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000020000000000000092 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000010000000000000000090000000961 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000080000000000093 +:10CD20000000000000000000000000000000000003 +:10CD300000000000200000000000000000000000D3 +:10CD400005000000000000000000000000000000DE +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000900003 +:10CDA0000000000000000000000000000000000083 +:10CDB00000000000010000900000000000000000E2 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000110001 +:10CE20008000000000000000000000000000000082 +:10CE30000000000000001100218000000000000040 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000008000000080000000000000000082 +:10CEB00000000000000000000008090000030080DE +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF000000000000000000008000000000000000A1 +:10CF10000000000000000000000000000000000011 +:10CF2000000000000020000000C000000000000021 +:10CF3000000000000000000000000001019000005F +:10CF400000080000000000000000000000000000D9 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF80000000000000000000000090000000000011 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000001000088880009000000000067 +:10CFB0000000000000000000000000000000080069 +:10CFC00002900000000002000000000000000000CD +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000004100008000000900000036 +:10D0300000000000000000000000000000004000B0 +:10D04000800080804100000080000000000000009F +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A00000000000000000000011000000800000EF +:10D0B0000000000000000000000000000000000070 +:10D0C00000118000200000000000000000000000AF +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D1000000000000000000000000004000100000CF +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000100000040BE +:10D1300000000000000000000000000000000000EF +:10D140000000000120000088000000000000000036 +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000019E +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B00007008221000000000000000000000000C5 +:10D1C00000000000000000E0070000000000000078 +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000819D +:10D210000000070000000000000000000000000007 +:10D2200000000000000000000000000000000000FE +:10D230000000F0F00000000000000000000000000E +:10D2400000000000000000FF000000FF00000000E0 +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B00000000000F0F0000000000000000000008E +:10D2C000000000000000000000FF000000FF000060 +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D330000000000055550000FFFF00000000000045 +:10D34000000000000000000000000000FF000000DE +:10D35000FFFF0000000000000000000000000000CF +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D390000000000000000000FFFF0000000000008F +:10D3A000000000000000000000000000000000007D +:10D3B00000000000000055550000000000000000C3 +:10D3C0000000000000000000000000000000FF005E +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D4100000000000000000000000FFFF000000000E +:10D4200000000000000000000000000000000000FC +:10D4300000000000000005002A00054000A80000D0 +:10D440000000000000000000000000000000154087 +:10D450002A06054C00A800000000000000000000A3 +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000038000010C084 +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D00000000F0FFFFF0000000000000000000030 +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D55000000000000F0F00000000000000000000AD +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D0000000000000000000F0F00000000000006B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000F0F000000000EA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000002000000000004A +:10D6C000000020000000000000000000000000003A +:10D6D000000000000000000000002000000000002A +:10D6E0000000200000000000000100000000000019 +:10D6F000000000000000000000000000200000000A +:10D7000000000000200000000000000000000000F9 +:10D7100000000000000000000000000020000000E9 +:10D7200000000000000000000000000200000000F7 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D750000000000000000000000000900090009019 +:10D7600000000004000000000000000000000000B5 +:10D770000000000040000000000000020000000067 +:10D7800000000000400000004002000040000000D7 +:10D790000000000010000000000200000000000077 +:10D7A0000000000000000000400000000000000039 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D00000000000008000000000000000000000C9 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200008000000000000000000000000000008E8 +:10D8300000000000000000080000000000000000E0 +:10D8400000000000000000080000000000000002CE +:10D850000000000000000040000000000000040084 +:10D8600000000000000000080000000000000000B0 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000800000000000090 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000800000000000070 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000100000000000000000037 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D960000300000000000000200000000000000094 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D00000000800000000000000000000800000BF +:10D9E0000180018000000000010000000000000034 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000400000000000000000A6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000008BE +:10DA60000000202002200000000020000000000034 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000200000009000000096 +:10DAE000000004000000000401000000001100001C +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB50000000000000000000008400000000000041 +:10DB6000000000840000000000C110000000000060 +:10DB70000084000000000000000000000000000021 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB000000000000000080000000000004000001D +:10DBC0000002000000000000000000000000000053 +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000200000100000001000009000028 +:10DBF000000000000000000000090002000000001A +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000800000000000000DC +:10DC400000000000000000000000000000000000D4 +:10DC50000000000000000000000000000000008242 +:10DC60000000000000000000200000001000000084 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE000000000000000000001009008000000009B +:10DCF0000100000000000000000000000000000023 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD6000000000000000000000001100A100000001 +:10DD70000000110021000000000000000000000071 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE00000000000000000000000000000080980A2 +:10DDF0000010000000C109000009008000000000C0 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000009A9 +:10DE7000010200010088000301000000008800008A +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000100888802000000000088000000010086 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF7000000041000080800011000000000000004F +:10DF80004100000000000000000000000000000050 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000000000000000031 +:10DFF000000000000011000000800000000000117F +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E07000000000000000000100000040000000005F +:10E08000000100000000000000000000000000008F +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000E007008200B7 +:10E10000000000E00000814100000000000000006D +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000F0F00000000000000000000000000000AF +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E200000000F0F00000000000000000000000002E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E3000000FF0000FFFF0000000000000000000010 +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000FF0000000000000000000000008E +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E400000000000005402A06054C00A80040000658 +:10E41000000C0000000000000000000000000000F0 +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E4800000000000000000005555FFFF00000000E4 +:10E490005555FFFF000000000000000000000000D4 +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E500000000000000000000000055550000000061 +:10E510000000555500000000000000000000000051 +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E580000000000000000000000000000000F0F0AB +:10E59000000000000000F0F000000000000000009B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E61000F0F0000000000000F0F00000000000003A +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E660000000000000000000200000000004000086 +:10E67000200000000000000000000000000000007A +:10E68000000000000000000020000000000000006A +:10E69000200000000000000000000000000000005A +:10E6A0000000000000000001000020000000000049 +:10E6B000000020000000000000000000000000003A +:10E6C000000000000000000000002000000000002A +:10E6D000000020000000000000000000000000001A +:10E6E0000000000000000000000000000002000028 +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000900000000000000090D9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000020000000000000000D7 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000200000000000000000000B7 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000008000021 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000088000080 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000400000000000000000000000000D4 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E860000000000000000000000040000000000068 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000100078 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000C0000000000000000037 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000008000800000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000040000000000000000000063 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D00000400000000000000000000000000000F7 +:10E9E0000000000000000000000000000000000027 +:10E9F00000000000000221044000000000000000B0 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000040000020000000090 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000080000000000096 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000084000000C00000B1 +:10EB20000000210000840084000000002184000017 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000080000015 +:10EB80000180000000000000000000000000000004 +:10EB900000000000000000000000000088000000ED +:10EBA00000000009000090000000000000000002CA +:10EBB0000002000000000002000000000000000051 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF00000000000000000000000000000000020F5 +:10EC000000020404000000000000000000000000FA +:10EC100000000500000000000000020000000000ED +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000020000000000B2 +:10EC600000000000000000000000000000000000A4 +:10EC7000000000000000000000000000000002A0F2 +:10EC800000900082880100000000000000000000E9 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED0000A0A020050020001000000000000000006E +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000A0000521A00090100000000000007D +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000010889000A02091000000000089 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000220000189210291000022 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF000000000000000000008003001010218011AC +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000090059108020051 +:10EF9000000300000000000000000000000000006E +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F0000000000000000000000000000041000501B9 +:10F0100091820001000000000000000000000000DC +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F08000000000000000000000000000000081817E +:10F0900000E0070000000000000000000000000089 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000500140000000000000000000000D6 +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000FFFF0000FF03FC0000000000F2 +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000555F5550FFC33C00000017 +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000061002480090000DF +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F390000000000000000000000055555555003FDA +:10F3A000C0FF00000000000000000000000000009E +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F41000000000000000000000000000FF00F505F3 +:10F42000003CC3FF000000000000000000000000DE +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000C0AC +:10F4A0000000080000000000000000000000000054 +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000080000000000000000000000D3 +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A00000002000000000000000000040000000FB +:10F5B000000000000000000000000000000000004B +:10F5C00000002000000000000000000040000000DB +:10F5D0004000000000000000000000008800000063 +:10F5E00000000001200000000000000000200000DA +:10F5F00000002000000000000000000000002000CB +:10F60000000000002000000000000000000040009A +:10F6100000002000000000000000000000002000AA +:10F6200000000000000000020000000000000000D8 +:10F6300000000000000000000000000000000002C8 +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000008000440C000009E +:10F66000000000000000000000000000000010008A +:10F67000000040000000400000000000000000000A +:10F68000000000000000000000000000000000007A +:10F6900000004000000040000000000000004000AA +:10F6A00000000000000002000200004000400200D4 +:10F6B00002000040004000000000000000000000C8 +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000000000000000002A +:10F6E0000000000000000000040000000000000016 +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000008000800000010001D7 +:10F7300080008008000100090004000000080000AB +:10F7400000000000000000000000000000000000B9 +:10F750000000000800000008000000000008000091 +:10F760000000000000000000000000000000000099 +:10F770000000000000080000000800000000000871 +:10F780000000000000000000000000000000000079 +:10F790000000000000080000000800000000000851 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000010000000000000048 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000400040000000000000008800880099 +:10F7E0008800000000000000000000000000000091 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F830000000000000000000009002000000000036 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C000000000000000000000000009000000002F +:10F8D0000000000000000000080000000000000020 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000080000000000BF +:10F9400000000000000000000000000000000000B7 +:10F950000000000000000000100010000000000087 +:10F960000000000000000000000000000000000097 +:10F97000000000000000000000001000080000006F +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000010001000000047 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000828000008480088000002000000099 +:10F9C000000800000000000000000000000000002F +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000007 +:10FA000000000008000000000000000000000000EE +:10FA100000000000000000000000000000000000E6 +:10FA200000000000000000000000000000000000D6 +:10FA3000000000000340210005400040000080005D +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000000000000000000000000056 +:10FAB00000000000000040000000A0002000000046 +:10FAC00000000040000000000000000900000000ED +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000000000000000000000000016 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000082000000008000C3 +:10FB400000000008000100000000000000080000A4 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000800000000000000000008000085 +:10FB700000000500000000000000008200000000FE +:10FB80000000000000080000000000000000000865 +:10FB900000000000058800000000000000000000D8 +:10FBA000000000000008000000080000000000083D +:10FBB0000000000000000000000000C0000040C085 +:10FBC000000040C000000400000000000000000031 +:10FBD0000000000000000000000000000000000025 +:10FBE0000000000000000000000000000000000015 +:10FBF0000000000000000000000000000000000005 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000000000000000000000000000000D4 +:10FC3000000000000000000000000000008500033C +:10FC40000020000380C0000380400000000000008E +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB000000000000000000000000000000005003F +:10FCC0000340200080002000410005118310000047 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 +:10FD4000004000010000C000000000000001C001F0 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC00000000000010004A100C100000100820049 +:10FDD00003C100000000000000000000000000005F +:10FDE0000000000000000000000000000000000013 +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000004009418021009100410203B0 +:10FE50000903919100000000000000000000000074 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC000000000000000A182118005004040A185D3 +:10FED00041000380830000000000000000000000DB +:10FEE0000000000000000000000000000000000012 +:10FEF0000000000000000000000000000000000002 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF40000000000000000000C1C10190000001009D +:10FF5000C140000000840400000000000000000018 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC00000000000000000000000810000E00000D0 +:10FFD0004200810000E0000000000000000000007E +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000000001 +:02000004000AF0 +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:10004000000000000000000000000000FFFF0000B2 +:10005000FF0000003C3C000066660000000000005D +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000FF0000003C3C0000666600000000DD +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000F0F0000666600006666FFFF6B +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:100250000000000000000F0F0000666600006666E8 +:10026000FFFFFFFF00000000000000000000000092 +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D00000000000000040E380048029920240E317 +:1002E0008004802182020000000000000000000065 +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:100350000000000000000000FF2FD00000F20DFFA1 +:10036000FFFF0000B0A0F1F5000000000000000059 +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D00000000000000000000000FF2FD00000F22D +:1003E0000DFFFC3C0C3CB0A0F1F50000000000004B +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000108C +:100460000200020000A000003C3CF03C0000000044 +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E00000100000000000000000F03CF03C0000A4 +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000020002000000000004B +:1005700020002000000040022000200000000000B9 +:1005800000000000C0000000C00020008800000043 +:100590002000200000002000200020000000C000FB +:1005A00000030000000020000000200020002000C8 +:1005B00000002000100004002000200020000000A7 +:1005C000C000000000002000000020002000880083 +:1005D000880020002000200020002000880000006B +:1005E000000000000000000000000000000000000B +:1005F00000001000000000000000000000000000EB +:1006000000000000000000000020000000A000002A +:1006100000A0000000A0000000A0002000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000002A8 +:10065000200000000000000000000000000000007A +:10066000000000000000000000000000200000006A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A00000000080000000000000000000000000CA +:1006B000000000000000000000000000000000003A +:1006C0000000000000040000000000000000000026 +:1006D000000000000000000000000000000000001A +:1006E0000000000000000000000000080000000002 +:1006F00000000000000000000008000800000000EA +:10070000008400000000000000000008000000005D +:100710000000000800000000008400080000000045 +:10072000000000000008000000000000008400003D +:1007300000000000008200000000000800840000AB +:1007400000000000000000010000000000000000A8 +:10075000000000000000000000080084000000000D +:1007600000000084000000000000000000050021DF +:1007700000210000002100210000000000000021F5 +:1007800000210000002100210000000000050021E0 +:100790000021000500210021880300000000002145 +:1007A00008210005002100210000000000210000B8 +:1007B00000210005000000210021000000050005C7 +:1007C00000210000000000210021000000000021A5 +:1007D00000210000000000210021000000000003B3 +:1007E000002100000000002101210800000000009D +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000008000000D0 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000800B0 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000010008200C00036 +:100870008200000000000000000000008200C000B4 +:1008800082000000C0000000C00001008200820061 +:1008900082000000820000000000000082000000D2 +:1008A00082000000820000000000000000008200C2 +:1008B00000008200000082000000000000008200B2 +:1008C000C000820500008200A00020000880820095 +:1008D000820082000000820082008200000082000C +:1008E00000008200000082000000000009000000FB +:1008F00000000000000000000000000000000800F0 +:10090000400000002100000000000000100800A0CE +:1009100000000000000008000000000000000800C7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:100940000800400000000000000000000000000857 +:10095000000000000000000000000000000800008F +:100960000800000000000000000008000000200057 +:10097000C0000000C000C0000200C000C000C000F5 +:100980000000820800088800000008000000000045 +:10099000C000000000000000000000000000C000D7 +:1009A000000000210008000008000800000000040A +:1009B0000000C00000000000C00000000000C000F7 +:1009C000C000000000050021000000000000000041 +:1009D00000000000A0000000A00040000000C000D7 +:1009E00000000008000500030000080000100000DF +:1009F00000000000000000000000000000000800EF +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A20000000080021000900000000000000000094 +:100A300000010000000000000000000000000000B5 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A700000000000000088110008000008000800C5 +:100A80000008820000000005002100110000002184 +:100A900000000080000000000008000008000800BE +:100AA000820800000000000800000011000900009A +:100AB000000000000000000088110021000000007C +:100AC00008000800000000080808000000110009E4 +:100AD000A008000408000000000000000000C000A2 +:100AE000080008008400000000210021001100001F +:100AF0008221000000000000000000000000000053 +:100B000000000000000000000000000000000000E5 +:100B100000000000020400000000000000000000CF +:100B200000000500050000000000000000000000BB +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B7000000000000000000000010001000100C0B2 +:100B80000001000100C1001100000101004000024D +:100B90000001C00100C0000000010001000100C010 +:100BA0000001000100C10011000085010040008229 +:100BB0000001C00100C000000000000100010001B0 +:100BC00000C00001000100C100110000210100402F +:100BD00000200001000100C100000001000100012F +:100BE00000C00001000100C100110000010100402F +:100BF00000040001400100C000000041004100412C +:100C000000820041004100C009C1054002410000CE +:100C10000080004180410089000000410041004106 +:100C200000820041004100C009C1054002410000AE +:100C30000080004180410089000000000041004127 +:100C4000004100820041004100C009C10040024152 +:100C5000000000000041004100840000004100410C +:100C6000004100820041004100C009C10040024132 +:100C7000000000800041804100C0000041000300EE +:100C8000000000804100890000000800A00085806D +:100C900000008800C100C100008080004100030006 +:100CA000000000804100890000000800200085004D +:100CB000000090004100C100008080000000410061 +:100CC00003000000008041008900000008002000AF +:100CD0000580000083004100C100000000004100C9 +:100CE000030000000080410089000000080020008F +:100CF0000500000083004100C100004080000100A9 +:100D00000100000000C00100C0000000010002005E +:100D100020020090C1000300C10000088200010011 +:100D20000100000000C00100C000000001008200BE +:100D300020400090C1004100C10000088200000373 +:100D400001000100000000C00100C000000001001F +:100D5000820090020090C1004100C1000084C000E8 +:100D600001000100000000C00100C00000000100FF +:100D7000820090400090C0004100C100004082000D +:100D800000C00001C0C100000000000100C002114D +:100D90000091000100C100000000000100000000FF +:100DA00000C00001C0C100000000000100C002112D +:100DB0000091000100C100000000000100000000DF +:100DC000000000C00001C0C100000000000100C020 +:100DD00002110091000100C10000000000010001AB +:100DE000000000C00001C0C100000000000100C1FF +:100DF00002110003000100C100000000000100001A +:100E000000000080004180C100000000004100C1DE +:100E100000880041004100C10000000000410009BD +:100E200000000080004180C100000000004100C1BE +:100E300000880041004100C100000000004100099D +:100E4000000000000080004180C10000000000415F +:100E500000C100880041004100C1000000000041C5 +:100E6000000400000080004180C10000000000413B +:100E70000083008800C1004100C100000000004163 +:100E800000400000C100800080C1000041028000DD +:100E900082004100C141800080100000410000003C +:100EA00080004100C100800080C1000041020000BC +:100EB00002004100C1C18000800500004100000027 +:100EC000800041000000C100800080C10000410995 +:100ED000800002004100C1C1800080050000410087 +:100EE000000080004100C100800080C1000041403E +:100EF000801182004100C1C1000080050000410056 +:100F0000000080004100C1004000C0C1000001009D +:100F1000040008000100C1210200C001000001001E +:100F20000000C0000100C1004000C0C1000001007D +:100F3000020010000100C1090200C0000000010011 +:100F40000000C00001000000C1004000C0C100005E +:100F50000100040010000100C1090200C0000000EF +:100F600001000000C0000100C1004000C0C100003D +:100F70000101200008000100C1051000C0000000B0 +:100F800001000000C000010000000000000000425D +:100F9000000000000000000081120041070048002E +:100FA00000000000000042000000000000000042BD +:100FB000000000000000000081120041070048000E +:100FC00000000000000042000000000000000000DF +:100FD00000420000000000000000811200410700F4 +:100FE00048000000000000000000000000000000B9 +:100FF00000420000000000000000811200410700D4 +:101000004800000000000000000000000000000098 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:101100000000000000000000000000000000757BEF +:1011100000000000000000000000000000000000CF +:10112000000000000000000000000000DEAE757B43 +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000DEAE000013 +:10115000757B00000000000000000000000000009F +:101160000000000000000000000000000000DEAEF3 +:10117000757B00000000000000000000000000007F +:101180000000000000000000000000000000DEAED3 +:1011900060C603000000000000000031E000000015 +:1011A000000000000C0000000000000000C063060A +:1011B00060C603000000000000000031E0000000F5 +:1011C000000000000C0000000000000000C06306EA +:1011D000000060C603000000000000000031E000D5 +:1011E0000000000000000C0000000000000000C033 +:1011F000630660C603000000000000000031E0004C +:101200000000000000000C0000000000000000C012 +:1012100063060000000020000000200010002000F5 +:101220002000000020008800200000000000C00016 +:10123000C100008800000000000020002000200005 +:10124000200084002000000040000000000020007A +:1012500020000001000000000000002020004000ED +:101260000000200020002000000020000000880076 +:10127000200020000000000000000080200020006E +:10128000000020002000200040002000000020007E +:1012900000000000000200000000000000008000CC +:1012A00000008000000000000000000005000500B4 +:1012B000000020000041000000000000404000004D +:1012C0000000000000000000000000000500000019 +:1012D000400000000000400000000000000000008E +:1012E00000000000000200000000000000000500F7 +:1012F0000500400200004000000000000010400017 +:1013000000000002000000000000000000000000DB +:1013100000000000000000000000000000002000AD +:10132000000000000000000000000000010000407C +:10133000000000000000000000000000000020008D +:10134000200020002000000000000000000000003D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000200000000005B +:10139000000000000000000000000000000000004D +:1013A000000800000000000800000000000020000D +:1013B00000850000000000000000000000000000A8 +:1013C0008084800080008084000000000000000015 +:1013D0000008000000000000000000000000000005 +:1013E0000000000800000000000000000000008471 +:1013F000008800080000000000000000000000005D +:1014000000000008000000000000000800000000CC +:1014100000100008000000000000000000000000B4 +:1014200000000000000000000000000000000000BC +:1014300000000000000000000004000000000100A7 +:101440000100200820000000000000000000000053 +:101450000008002100000000002100000000000042 +:101460000000000000050000000000050000000072 +:10147000000000000000000000000000000000006C +:10148000004100000000000000000000000000001B +:10149000000000000000000000000000000000004C +:1014A000000000000800080000000000000000002C +:1014B00000000000000000000900000141000000E1 +:1014C00004002000880080000000000000000000F0 +:1014D00000080800000000000000000000000000FC +:1014E0000000000000000800210000004100000092 +:1014F000000000A004000000000000000000000048 +:101500000000000040000800000000000000000093 +:101510000000000000000000008400000000000047 +:1015200000001000400085000000840084000000DE +:10153000000000000080000000000000C00000006B +:101540000000010001080000000000000000000091 +:101550000000000008000000000000000000000083 +:1015600000000000000082000000080008000000E9 +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:1015900000000000000000004000000008000800FB +:1015A000000000000000000020000000000000001B +:1015B00000000000000000042108000003000300F8 +:1015C00000000000200002010000000041000000B7 +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:101620000000C000000000000000000000000000FA +:10163000900008000000200082000000C0000000B0 +:101640000800001100000800042100000000000450 +:10165000000000000000000000000000000000008A +:1016600000000000900000000000000000000000EA +:10167000000000000000000000000000000000006A +:1016800082000000000000000000000000000000D8 +:10169000000000000000000000000000000000004A +:1016A0000000000000000000000000000008000032 +:1016B0000000000800000800880008880000000002 +:1016C00000000000000000000000800000A00000FA +:1016D000000100A000000800080008000000000051 +:1016E0000000000000000000000000000000008476 +:1016F0000000000000840800080000000300000053 +:101700000000000000000000000000000000008455 +:101710000000000000840800080000000000000035 +:101720000000000000000000000000000005820032 +:10173000000000002021A0000000000000000000C8 +:1017400000000000000000000100C00000020000D6 +:101750000009000900040000000000000000000073 +:101760000000000000000000000010000000000069 +:101770000000000000000000000800000000000859 +:101780000000000000000000000000000000000059 +:101790000000000000000000000800000000001031 +:1017A0000000000000000000000000000000000039 +:1017B00000000000000080000000000000000000A9 +:1017C00000000000000000000000200000000000F9 +:1017D0000000000000000001000000000000000008 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:101830000000000040000100000000000000010066 +:101840000000400800400188822001009000000054 +:101850000008000000000000000000000000000080 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B00000000000400000000300000000000000E5 +:1018C0001000000000000080100000001100A100C6 +:1018D0000000008000000000000000000000000088 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:101930000000000000000021008000000000000006 +:101940000000000300000000009000A0000000085C +:1019500009800009000000100000000500000000E0 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:1019900000008000000000000000000000000000C7 +:1019A0000000000000000000000000000000000037 +:1019B000000000000000000000000088000000009F +:1019C000000000000000000004000482A01020407D +:1019D0000001010800000088000100000000000074 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000020000000000000000000000C4 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A400001000000000000000000C09000024020E3 +:101A5000082001008888100000000000200000001D +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000003080000000000000005000000008086 +:101AD0000000830041000080000020000000800022 +:101AE00000004000000000000000000000000000B6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B4000000000000000000500000000000080050B +:101B500000000000000000110000008011000003E0 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD00010002020208410000001000000400000C0 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000880000E000020000810000E00000C9 +:101C50000000810000E000000000000000E007003C +:101C60008200000002E00000000000000000000010 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000053F05300550FC3000000000047 +:101CE000F0F0000000000000000000000000000014 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D500000000000000053FF530F550FC3FF0000A9 +:101D60000000F0F000000000000000000000000093 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000283028F38282A0F5F7 +:101DE00000003C3C0000FFFF00000000000000007D +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E2000000000000000F0F0F0F0000000000000F2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E500000000000000000000000EB30EBF3D7D7DB +:101E6000A0F500003C3C0000000000000000000065 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000F0F0F0F00000000072 +:101EB0000000000000000000000000000000000022 +:101EC00000000000000000000000000000610007AA +:101ED000C00C200000610007C00F20000061000757 +:101EE000C0CD200005402A06054C00A8006500066C +:101EF000000F2000000000000000000000000000B3 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F5000000000FF00000000000000000000000082 +:101F600000000000000000003C3CFFFF00000000FB +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000FF0000000000000000000002 +:101FE000000000000000000000003C3C0000000079 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000F0F090 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F000F0F0000000000000000000000000000000 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:1021500000000000200000000000000000008400DB +:1021600000000000000200000000000000008400E9 +:102170000000840084000000000000000000200037 +:10218000000000000000000000000000000000004F +:1021900020000000200020000000000000000000DF +:1021A000200000000000000000000000000000000F +:1021B000200000004000200000000000000000009F +:1021C0002000000088000000000000000000400027 +:1021D00000000000000205000000000000000000F8 +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000002BC +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000200009C +:10224000000000000000000000000000000000008E +:1022500000000000840000000000000000000000FA +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A00000000000000000008200000000000000AC +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D0000000000000840000000000000008000072 +:1022E0000000000000880000000000000000000066 +:1022F00000000000000000000000000000080000D6 +:1023000000000000000800000000000000000000C5 +:1023100000000000000000000000000000000008B5 +:102320000000000000100008000000000000000095 +:102330000000000000000000000000000000000895 +:102340000000000000000008000000000000000085 +:10235000000000000000000000000000000000007D +:102360000000000000000008000000000000000065 +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000900000000000000000000000000000007D +:1023D0000000000000000000040000004100410077 +:1023E00000000000000000000000000008000800DD +:1023F00000000000000011000082000000000090BA +:102400000000000000840000000000000000000048 +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000000AC +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C +:1024B000000000000000000000000000000000001C +:1024C0000800000000000000000000000000000004 +:1024D00000000000000000000000000000000000FC +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000000DC +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000000000000000000000009B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:102580000000000000000000000000000008000043 +:10259000000000000000000000000000000000003B +:1025A000000000000000000000000000000000002B +:1025B000000000000000000000000000000000001B +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E000000000000000000000840000000000C0A7 +:1025F00000200800000000000084210000001020DE +:10260000020000000084008400000000000021009F +:10261000000000000000000000900000000000002A +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:102660000000000000000000000200000000000068 +:102670000000000208000000000000000000000050 +:102680000000000900000000080000000000000237 +:102690000002000000000002000000000000000036 +:1026A000000000000000000000000000000000002A +:1026B000000000000000000000000000000000001A +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000000000000000000099 +:102740000000000000000000000000000000000089 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 +:102790000000000000000000000000000000000039 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000000048 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C0000000000000000000000000000000000008 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:102940000000000000000000000000000000000087 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:10311000000000000000000000000004200000008B +:10312000000000000000200020000000000000005F +:10313000000000000000000000000000200000006F +:10314000000000000000200000000000000200005D +:1031500000000000008000000000010000000000EE +:10316000000000000000010020000000000000003E +:10317000020001000000000000000000000040000C +:10318000000000000000000020000000000000001F +:10319000000200000000000000000000000000002D +:1031A00000000000000010004002000000000000CD +:1031B000000000000400000000004000000040008B +:1031C000400000000000000040000000000000007F +:1031D00000000000000000100000000008000000D7 +:1031E000400000000000000040000000000000005F +:1031F000000080000200000000000000000000004D +:1032000000000000000000000000000000000000BE +:1032100002000200000000000200020000000000A6 +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000002000000000000000000000000006C +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:103290000800000000000000000000100000000016 +:1032A000000000080008000000000000000000000E +:1032B000000000000000000000000000000000000E +:1032C00000000008000800000000000000000000EE +:1032D00000000000000000000000000000000000EE +:1032E00000000000000800080000000000000000CE +:1032F00000000000000000000000000000000000CE +:1033000000000000000800080000000000000000AD +:1033100000000000000000000000000000000000AD +:103320000000000000000000000000008800000015 +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000020000004B +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F000000000000000000000000000000080004D +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:103450000000000008000000000000000000000064 +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000010000000000000000000000000000003B +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000400000000000000000000000000B7 +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:103560000000000000000000000000000000080053 +:10357000000000000000400000000000000000808B +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B0000000000000000000000000000084000087 +:1035C00000000000000000000000000011000000EA +:1035D00000000000000010000000000000000000DB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:10360000004000000000000000000000000000007A +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:103640000000000000000004000000000000000076 +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000001000000000003A +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000000000000000000000CA +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 +:103730000000000000000000000000000000000089 +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000000000000049 +:1037800000000000000000000090000000000000A9 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000000000000000000000000000C9 +:103800000000000000000003200000800000000015 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:1038800000000000000000000000000000800000B8 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:103900000000000000000000000000000000002097 +:10391000000000080000000000000000000000009F +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000400000000007 +:103980000000000000000000000000000000000037 +:103990000000029000000000000000000000000095 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000000F7 +:1039D00000000000000000000000000000000000E7 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A100005000000808000000000000000000000A1 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A90000000001180000000000000000000000095 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF0000000000000000090000000000000000036 +:103B000000000000000000000000000000000000B5 +:103B100000000000000120000088000000000000FC +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B9000000000000000000000000700000000001E +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000FF00FF000000000000000000B6 +:103C1000000000000000000000FF000000FF0000A6 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000000044 +:103C8000000000000000FF00FF0000000000000036 +:103C90000000000000000000000000FF000000FF26 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D0000AAAAAAAA0000000000000000000000000B +:103D10000000000000000000000000000000FF00A4 +:103D20000000FFFF00000000000000000000000095 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000AAAAAAAA000000000000000000008B +:103D90000000000000000000000000000000000023 +:103DA000FF00000000000000000000000000000014 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E1000000000000000000000610006000D00002E +:103E200015002A00054000A8000000000000000066 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 :103E70000000000000000000000000000000000042 :103E80000000000000000000000000000000000032 :103E90000000000000000000000000000000000022 @@ -41986,8 +41986,8 @@ :103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 +:103F90000000000000000000000000000000C3C39B +:103FA000C3C300000000000000000000000000008B :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 :103FD00000000000000000000000000000000000E1 @@ -41995,33 +41995,33 @@ :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 +:10402000C3C3C3C300000000000000000000000084 :104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 +:104040000000000000000000000020000000000050 :104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 +:104060000000000000000000000020000000000030 +:10407000000000000000000200000000000000003E :104080000000000000000000000000000000000030 -:10409000000000000000000000040000000000001C +:104090000000000000000000000000000000000020 :1040A0000000000000000000000000000000000010 -:1040B00000000000000000040002000000000000FA +:1040B00000000000000000000000400000000000C0 :1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 +:1040D0000000000000000000104000000000000090 +:1040E00000020000000000000000000000000000CE :1040F00000000000000000000000000000000000C0 :1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000100000000000000000020000000000006D -:10414000000000000000000000000002000000006D -:10415000000000000000000000000000020000005D -:10416000000000000000020000000200000000004B +:10411000000000000000000000000000000200009D +:10412000100000000000000000000000000000007F +:10413000000000000000000200001000000000006D +:10414000000000000000000000000000000000006F +:10415000000000000200000000000000000000005D +:10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F -:1041800000000000000000000000004000000000EF +:10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F -:1041A00000000000000000000000000008400000C7 -:1041B00000000000020000000200020000000000F9 -:1041C0000200820000000000000000000200000069 +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF :1041D00000000000000000000000000000000000DF :1041E00000000000000000000000000000000000CF :1041F00000000000000000000000000000000000BF @@ -42031,19 +42031,19 @@ :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E :10425000000000000000000000000000000000005E -:10426000100000000000000000000000000000003E +:10426000000000000000000000000000000000004E :10427000000000000000000000000000000000003E :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E :1042A000000000000000000000000000000000000E :1042B00000000000000000000000000000000000FE -:1042C00000000000040000000000000000000000EA +:1042C00000000000000000000000000000000000EE :1042D00000000000000000000000000000000000DE :1042E00000000000000000000000000000000000CE :1042F00000000000000000000000000000000000BE :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D +:10432000000000000000000000000000100000007D :10433000000000000000000000000000000000007D :10434000000000000000000000000000000000006D :10435000000000000000000000000000000000005D @@ -42061,7 +42061,7 @@ :10441000000000000000000000000000000000009C :10442000000000000000000000000000000000008C :10443000000000000000000000000000000000007C -:10444000000000000000200000000000000000004C +:10444000000000000000000000000000000000006C :10445000000000000000000000000000000000005C :10446000000000000000000000000000000000004C :10447000000000000000000000000000000000003C @@ -42072,12 +42072,12 @@ :1044C00000000000000000000000000000000000EC :1044D00000000000000000000000000000000000DC :1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B +:1044F00000000000000000000400000000000000B8 +:10450000000000000000000000400000000000006B +:104510000000000000000000000000000000080093 :10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B +:1045400000000084000000000000000000000000E7 :10455000000000000000000000000000000000005B :10456000000000000000000000000000000000004B :10457000000000000000000000000000000000003B @@ -42085,7 +42085,7 @@ :10459000000000000000000000000000000000001B :1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB +:1045C00000000000000000000000000000020000E9 :1045D00000000000000000000000000000000000DB :1045E00000000000000000000000000000000000CB :1045F00000000000000000000000000000000000BB @@ -42193,45 +42193,45 @@ :104C50000000000000000000000000000000000054 :104C60000000000000000000000000000000000044 :104C70000000000000000000000000000000000034 -:104C800000000000200020000000000000000000E4 -:104C90000000000000000000000000000000000014 -:104CA00000000000200020000000000000000000C4 -:104CB00000000000000000000003000000000000F1 -:104CC00000000000000020002000000000000000A4 -:104CD0000000000000000000000000000041000093 -:104CE0000000000000002000200000000000000084 -:104CF0000004000000000000000040000000000070 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000002000000000000000091 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000040000000000000000000000023 -:104D50000000004000000000000000000000000013 -:104D60000000000000000000000000000000000043 -:104D700000000000400000000000000000000000F3 -:104D80000000000000000000000000000000000023 -:104D90000000021000000000000000000000000001 -:104DA00000000000002004000400002004000400B3 -:104DB00000200020000000000000000000000000B3 -:104DC00000000000000500000000000000000000DE -:104DD000000000000040000000000000000004008F -:104DE000040000200020000002000200000000007B -:104DF00002000000844000000000000002000000EB -:104E00000000000800080008000000080008000872 -:104E10000000000800080000000000080008000072 -:104E200000000008000800098000800800098008D0 -:104E300080000009000900000000000800080000D0 -:104E4000000000000008000800080000000800083A -:104E5000000800000008000800000000000800082A -:104E60008000800000090009000800000008000818 -:104E70000008000000080208000000000008000808 +:104C80000000000000000000000000000000000024 +:104C90000000000000000004000000000000000010 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000000F4 +:104CC000880000000000000000000000000000005C +:104CD00000000000000000000000000000000000D4 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000200000000B2 +:104D00000000000040000000000000000000000063 +:104D100000000000000040000000400040000000D3 +:104D20000000400040000000000000000000000003 +:104D30000000000000000000000000004000000033 +:104D40000000000010000000000000020000000051 +:104D500000020000000000000040000040000000D1 +:104D60000000000000000000000200000000000041 +:104D70000000000000000000000000000000000033 +:104D80000000000002000000000000000000000021 +:104D90000000000000000000000000000000000013 +:104DA00000000000020002000200020000000000FB +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF0000040000000000000000000000800000863 +:104E0000000000000000000000000008000000009A +:104E1000000000080008000000000008000800086A +:104E2000000000000000000000000008000000007A +:104E30000000000800080000000000080008000052 +:104E40000008000000000000000000000008000052 +:104E50000000000000080008000000000008000832 +:104E60000008000000000000000000000008000032 +:104E70000000000000080008000000000008000812 :104E80000000000000000000000000000000000022 :104E90000000000000000000000000000000000012 :104EA0000000000000000000000000000000000002 :104EB00000000000000000000000000000000000F2 :104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000010000000000000C2 -:104EE00000000000000000000000000000000000C2 +:104ED000000000000000000000008400000000004E +:104EE00000000000000000000800000000000000BA :104EF00000000000000000000000000000000000B2 :104F000000000000000000000000000000000000A1 :104F10000000000000000000000000000000000091 @@ -42244,7 +42244,7 @@ :104F80000000000000000000000000000000000021 :104F90000000000000000000000000000000000011 :104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 +:104FB00000000000000000000000C0000000000031 :104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 @@ -42260,7 +42260,7 @@ :105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 :1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 +:1050B0009000000000000000000000000000000060 :1050C00000000000000000000000000000000000E0 :1050D00000000000000000000000000000000000D0 :1050E00000000000000000000000000000000000C0 @@ -42276,13 +42276,13 @@ :10518000000000000000000000000000000000001F :10519000000000000000000000000000000000000F :1051A00000000000000000000000000000000000FF -:1051B000000000000000000000000000004000406F -:1051C000004000400040004000400040000000005F +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000000000000000000DF :1051D00000000000000000000000000000000000CF -:1051E00000000000000010000000000000000000AF -:1051F000000000000000000400040004000400009F +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF :10520000000000000000000000000000000000009E -:105210000000080000000000000000000000000086 +:10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E :10523000000000000000000000000000000000006E :10524000000000000000000000000000000000005E @@ -42300,7 +42300,7 @@ :10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D :10532000000000000000000000000000000000007D -:105330000000000000000000000008000000000065 +:10533000000000000000000000000000000000006D :10534000000000000000000000000000000000005D :10535000000000000000000000000000000000004D :10536000000000000000000000000000000000003D @@ -42308,60 +42308,60 @@ :10538000000000000000000000000000000000001D :10539000000000000000000000000000000000000D :1053A00000000000000000000000000000000000FD -:1053B000000000000000000000000000000000806D -:1053C000000000800000008000000080000000005D +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD :1053D00000000000000000000000000000000000CD :1053E00000000000000000000000000000000000BD -:1053F00000000000000000000080000000800000AD +:1053F00000000000000000000000000000000000AD :10540000000000000000000000000000000000009C :10541000000000000000000000000000000000008C :10542000000000000000000000000000000000007C :10543000000000000000000000000000000000006C -:10544000000800000008000000080000000800003C +:10544000000000000000000000000000000000005C :10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C -:10547000000000000000000000000008000000081C +:10547000000000000000000000000000000000002C :10548000000000000000000000000000000000001C :10549000000000000000000000000000000000000C :1054A00000000000000000000000000000000000FC :1054B00000000000000000000000000000000000EC -:1054C00000000000080000000000000008000000CC +:1054C00000000000000000000000000000000000DC :1054D00000000000000000000000000000000000CC :1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000800A4 +:1054F00000000000000000000000000000000000AC :10550000000000000000000000000000000000009B :10551000000000000000000000000000000000008B :10552000000000000000000000000000000000007B :10553000000000000000000000000000000000006B -:105540000000090000008000000009000000800049 +:10554000000000000000000000000000000000005B :10555000000000000000000000000000000000004B :10556000000000000000000000000000000000003B -:105570000000000000000000000000000900000022 -:10558000800000000000000000000000000000009B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B :10559000000000000000000000000000000000000B :1055A00000000000000000000000000000000000FB :1055B00000000000000000000000000000000000EB -:1055C0000000000000100021000000800010000515 +:1055C00000000000000000000000000000000000DB :1055D00000000000000000000000000000000000CB :1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000000005A6 -:10560000002000000000000000000000000000007A +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A :10561000000000000000000000000000000000008A :10562000000000000000000000000000000000007A :10563000000000000000000000000000000000006A -:1056400000000000000000010000000000820001D6 -:105650000001000000000000000000000000000049 +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A :10566000000000000000000000000000000000003A :10567000000000000000000000000000000000002A :10568000000000000000000000000000000000001A :10569000000000000000000000000000000000000A :1056A00000000000000000000000000000000000FA :1056B00000000000000000000000000000000000EA -:1056C0000000000000000000004100000700000092 -:1056D0000081000007000000000000000000000042 +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA :1056E00000000000000000000000000000000000BA :1056F00000000000000000000000000000000000AA -:105700000000008100000700000000000000000011 +:105700000000000000000000000000000000000099 :105710000000000000000000000000000000000089 :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 @@ -42398,11 +42398,11 @@ :105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 :105940000000000000000000000000000000000057 -:10595000000005000A28050000A005000A2805002F -:1059600000A0000000000000000000000000000097 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 :105970000000000000000000000000000000000027 -:1059800000000000000000000000000005000A28E0 -:10599000050000A000000000000000000000000062 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 :1059A00000000000000000000000000000000000F7 :1059B00000000000000000000000000000000000E7 :1059C00000000000000000000000000000000000D7 @@ -42436,41 +42436,41 @@ :105B80000000000000000000000000000000000015 :105B90000000000000000000000000000000000005 :105BA00000000000000000000000000000000000F5 -:105BB00000000000010000000000000020000000C4 -:105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000020000000A5 -:105BE00000000000000000000000000000000000B5 -:105BF00000000000000000000000000000000000A5 -:105C00000000000000000000000000000000000094 -:105C1000000000000008000000000000000000007C -:105C20000000000000000000000000000000000074 -:105C30000000000200004000000000000000000022 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 +:105BB00000000000000000000000000000000000E5 +:105BC00000002000008000000000008000000000B5 +:105BD00000000000000000000000000000000000C5 +:105BE0000000200000000000000000000000000095 +:105BF00000000002000100000000000000000000A2 +:105C00000000000020000000000000000000000074 +:105C10000000000000000000000000000000000084 +:105C20000000000020000000000000000000000054 +:105C30000000000000004000000000020000000022 +:105C400000000000000000400000000000400000D4 +:105C50000000000000020000000000000000000042 :105C60000000000000000000000000000000000034 :105C70000000000000000000000000000000000024 -:105C80000000000000000000000000000000000014 -:105C90000000000000020000000000000000000002 -:105CA00000000000000000000000000000000000F4 -:105CB00000000002000000000102000000000000DF -:105CC0000000000000400000000000000000000094 +:105C800040000000000200000000000000000000D2 +:105C900000000000000000001000000000000000F4 +:105CA00000000002000000000000000000000000F2 +:105CB00000000000000000000000000000000000E4 +:105CC0000000000000000000000000000040000094 :105CD00000000000000000000000000000000000C4 -:105CE000000000000040084000000000000000002C +:105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 -:105D00000000000000000040001000000000000043 -:105D10000000000000000000004000000000000043 -:105D20000000000000000040000000000000000033 -:105D30000000000000000000001040010000000012 -:105D4000000000000000000000080000000000004B -:105D50000000000000000000000000000000000043 -:105D6000000000000000000000080000000000002B -:105D70000000000000000000000000000000000023 -:105D8000000000000000000000000008000000000B -:105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000800000000EB -:105DB00000000000000000000000000200000000E1 +:105D00000000000000000000000000000000020091 +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D4000000000000000000800080000000000093A +:105D50000000000000000008000800000000000033 +:105D6000000000000000000800080000000000081B +:105D70000000000000000008000800000000000013 +:105D80000000000000000000000800080000000003 +:105D900000080000000000000008000800000000EB +:105DA00000000000000000000008000800000000E3 +:105DB00000080000000000000008000800000000CB :105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 +:105DD00000000000000000000000000000110000B2 :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 :105E00000000000000000000000000000000000092 @@ -42482,116 +42482,116 @@ :105E60000000000000000000000000000000000032 :105E70000000000000000000000000000000000022 :105E80000000000000000000000000000000000012 -:105E900000000000000000000000000041000000C1 +:105E900010000000000000000000000000000000F2 :105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 -:105EC00000000000000000000000000000000000D2 -:105ED00000000000000000000000000000000000C2 -:105EE0000000000000000000000000400000000072 +:105EC00000000000000001000000000000000000D1 +:105ED0000000004001000180000000000000000000 +:105EE00000000000000000000000000000000000B2 :105EF00000000000000000000000000000000000A2 :105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 -:105F200000000000000000000000004000400000F1 -:105F30000000000000000040000000000000000021 -:105F400000000000008800000000000000000000C9 -:105F50000000000000000000000000000000000041 +:105F20000000000000000000000000000000000071 +:105F30000000000000000000000000000000000061 +:105F4000000000000000000004000000000000004D +:105F50000000000000012000040400000000000018 :105F60000000000000000000000000000000000031 :105F70000000000000000000000000000000000021 :105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 :105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 +:105FC000000000000000000000200000A000000011 +:105FD0000000900000000000000010000000000021 :105FE00000000000000000000000000000000000B1 :105FF00000000000000000000000000000000000A1 -:106000000000000000000000000000000000080088 -:10601000000000000000000000000000C0000000C0 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 :106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000080028 -:10607000000000000000050000000000000000001B +:10604000000000000000000000000001000000004F +:1060500000000000000000000000000080000000C0 +:10606000000000000000000400000000000000002C +:106070000000000000000000000000000000000020 :106080000000000000000000000000000000000010 :106090000000000000000000000000000000000000 :1060A00000000000000000000000000000000000F0 :1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 +:1060C000000000000000000002000040000000008E +:1060D00000000000000000001000000000000000B0 :1060E00000000000000000000000000000000000B0 :1060F00000000000000000000000000000000000A0 :10610000000000000000000000000000000000008F :10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F +:1061400000000000000000000000800000000000CF +:1061500000000000000000000000800000000000BF :10616000000000000000000000000000000000002F :10617000000000000000000000000000000000001F :10618000000000000000000000000000000000000F :1061900000000000000000000000000000000000FF :1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF +:1061C000000000000000000000000000000090003F +:1061D00000000040000000000000000001000090EE :1061E00000000000000000000000000000000000AF :1061F000000000000000000000000000000000009F :10620000000000000000000000000000000000008E :10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E -:106240000000000000000000000000000000000549 -:1062500000400005002000000000000000000000D9 -:10626000000000000000000000000000000000002E +:10624000000000000000000000000000000011003D +:1062500080000000000000000000000000001100AD +:10626000218000000000000000000000000000008D :10627000000000000000000000000000000000001E :10628000000000000000000000000000000000000E :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE :1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE +:1062D00000000080000000800000000000000000BE +:1062E00000410900000300800000000000000000E1 :1062F000000000000000000000000000000000009E :10630000000000000000000000000000000000008D :10631000000000000000000000000000000000007D :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D :10634000000000000000000000000000000000004D -:10635000000000000000000000000000000000003D -:10636000000000000000000000000000000000002D +:10635000000000000020000000C00000000000005D +:106360000000000101900000000200000000000099 :10637000000000000000000000000000000000001D :10638000000000000000000000000000000000000D :1063900000000000000000000000000000000000FD :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD -:1063D00000000000000001000100000000000000BB -:1063E00000000000000000000000000000000000AD +:1063D00000000000010000888800010000000000AB +:1063E0000000000000008800209000000000020073 :1063F000000000000000000000000000000000009D :10640000000000000000000000000000000000008C :10641000000000000000000000000000000000007C :10642000000000000000000000000000000000006C :10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C -:106450000000000000000000200005000500000012 -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C +:106450000000000000004100008000000900000072 +:1064600000000000000002000000808041000500E4 +:10647000800000000000000000000000000000009C :10648000000000000000000000000000000000000C :1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC -:1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC +:1064D000000000000000000000110000008000002B +:1064E00000000000000000000011A01100000000EA :1064F000000000000000000000000000000000009C :10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B +:1065500000000000000000000000000100000040FA +:106560000000000000000000000000012001008881 :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB @@ -42599,24 +42599,24 @@ :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B +:1065E000070082210000000000000000000000E021 +:1065F0000700810000000000000000000000000013 :10660000000000000000000000000000000000008A :10661000000000000000000000000000000000007A :10662000000000000000000000000000000000006A :10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A :10665000000000000000000000000000000000003A -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A +:1066600000000000F0F0000000000000000000004A +:10667000FF000000FF00000000000000000000001C :10668000000000000000000000000000000000000A :1066900000000000000000000000000000000000FA :1066A00000000000000000000000000000000000EA :1066B00000000000000000000000000000000000DA :1066C00000000000000000000000000000000000CA :1066D00000000000000000000000000000000000BA -:1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A +:1066E000000000000000F0F00000000000000000CA +:1066F0000000FF000000FF0000000000000000009C :106700000000000000000000000000000000000089 :106710000000000000000000000000000000000079 :106720000000000000000000000000000000000069 @@ -42631,24 +42631,24 @@ :1067B00000000000000000000000000000000000D9 :1067C00000000000000000000000000000000000C9 :1067D00000000000000000000000000000000000B9 -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 +:1067E000000000003C3C0000FFFF00000000000033 +:1067F0000000000000FF0000FFFF0000000000009C :106800000000000000000000000000000000000088 :106810000000000000000000000000000000000078 :106820000000000000000000000000000000000068 :106830000000000000000000000000000000000058 :106840000000000000000000000000000000000048 :106850000000000000000000000000000000000038 -:106860000000000000000000000000000000000028 -:106870000000000000000000000000000000000018 +:106860000000000000003C3C0000000000000000B0 +:1068700000000000000000FF000000000000000019 :106880000000000000000000000000000000000008 :1068900000000000000000000000000000000000F8 :1068A00000000000000000000000000000000000E8 :1068B00000000000000000000000000000000000D8 :1068C00000000000000000000000000000000000C8 :1068D00000000000000000000000000000000000B8 -:1068E000000000000000000000610006000D000034 -:1068F0000000000000000000000000000000000098 +:1068E000000000000000000005002A00054000A88C +:1068F000000000000000000015402A06054C00A81A :106900000000000000000000000000000000000087 :106910000000000000000000000000000000000077 :106920000000000000000000000000000000000067 @@ -42656,7 +42656,7 @@ :106940000000000000000000000000000000000047 :106950000000000000000000000000000000000037 :106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 +:10697000000000000000000000000000FF00FFFF1A :106980000000000000000000000000000000000007 :1069900000000000000000000000000000000000F7 :1069A00000000000000000000000000000000000E7 @@ -42664,129 +42664,129 @@ :1069C00000000000000000000000000000000000C7 :1069D00000000000000000000000000000000000B7 :1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 +:1069F0000000000000000000000000000000FF0098 :106A00000000000000000000000000000000000086 :106A10000000000000000000000000000000000076 :106A20000000000000000000000000000000000066 :106A30000000000000000000000000000000000056 :106A40000000000000000000000000000000000046 :106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000FF0027 -:106A7000FF3D0000000000000000000000000000DA -:106A80000000000000000000000000000000000006 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000F0F000000000000000000000000026 :106A900000000000000000000000000000000000F6 :106AA00000000000000000000000000000000000E6 :106AB00000000000000000000000000000000000D6 :106AC00000000000000000000000000000000000C6 :106AD00000000000000000000000000000000000B6 :106AE00000000000000000000000000000000000A6 -:106AF000FF00FF0500000000000000000000000093 -:106B00000000000000000000000000000000000085 +:106AF0000000000000000000000000000000000096 +:106B000000000000F0F000000000000000000000A5 :106B10000000000000000000000000000000000075 :106B20000000000000000000000000000000000065 :106B30000000000000000000000000000000000055 :106B40000000000000000000000000000000000045 :106B50000000000000000000000000000000000035 :106B60000000000000000000000000000000000025 -:106B70000000200020002000200020002000200035 -:106B80002000200020000000200020002000200025 -:106B90002000200020002000200020000000200015 -:106BA0002000200020000000200020002000200005 -:106BB0002000000020002000200020000000000035 -:106BC00020002000200020000000200020002000E5 -:106BD0002000200020000000200020000000000015 -:106BE00020002000200020000000200000002000E5 -:106BF0002000200000000000000000000000000055 -:106C00000000000000000000000000000000000084 +:106B70000000200000002000200020002000200451 +:106B80004000000000002000200020002000200025 +:106B90002000200000002000200020002000200015 +:106BA0002004000000002000200020002000200021 +:106BB0002000000120000000200020002000200014 +:106BC0002000200000000000200020002000200005 +:106BD00020002000200000002000200020002000D5 +:106BE00020002000000000002000200020002000E5 +:106BF0002000200000000002000000000000000053 +:106C00004000000040001000000000401000400262 :106C10000000000000000000000000000000000074 -:106C20000000000000000000000000004000000024 -:106C30000000000000000000000000000000200034 -:106C40000000000000000000000000000000000044 -:106C500000000000000000000000000000004000F4 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000010000004 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000001000100000D4 +:106C20000000000040000000000000000000000024 +:106C30000000000000000000000000000000000054 +:106C400000000000100040000000000000000000F4 +:106C50000000000000000000000000000000000034 +:106C60000000000000004000400040000000000064 +:106C7000000000000000020002000000000002000E +:106C80000200000000000000000000000000000002 +:106C900000000000000000000000000000000000F4 :106CA00000000000000000000000000000000000E4 :106CB00000000000000000000000000000000000D4 -:106CC00000000000000000000000000000100010A4 +:106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 :106CE00000000000000000000000000000000000A4 -:106CF000000000000000000000000000000000088C -:106D00000008000000080000000800080008000853 -:106D1000000000000000000000000000000000086B -:106D20000008200040080000000800080008008259 -:106D30000000000000000000000000000000000053 -:106D4000001000080000000800000008000800080B -:106D50000000000000000000000000002000000013 -:106D600000000008000002080000000800080008F9 -:106D700000002000400000000000000000000000B3 +:106CF0000000000000000000000000000008000884 +:106D00000000090000080008000000000008000062 +:106D1000000000000008000800000008000800084B +:106D2000000000000008000800000000000800004B +:106D30000000000000080008000002000008000831 +:106D40000008000000000008000800000000000823 +:106D5000000000000000000800080000001000080B +:106D60000008000000000008000800000000000803 +:106D70000000000000000008000800000000000003 :106D80000000000000000000000000000000000003 :106D900000000000000000000000000000000000F3 -:106DA00000000800000000000000000000000000DB -:106DB00000100000000000000000000000000000C3 +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 :106DD00000000000000000000000000000000000B3 :106DE00000000000000000000000000000000000A3 :106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 +:106E0000000000000000000005000000000000007D :106E10000000000000000000000000000000000072 -:106E2000000000000800000000000000000000005A +:106E20000000000000000000000000000000000062 :106E30000000000000000000000000000000000052 :106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 :106E60000000000000000000000000000000000022 :106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 +:106E80000000000000000000000000000000020000 +:106E900000000000010000000000000000000000F1 :106EA00000000000000000000000000000000000E2 :106EB00000000000000000000000000000000000D2 :106EC00000000000000000000000000000000000C2 -:106ED00000400040000000400000000000000000F2 -:106EE0000040000000000010000000000000000052 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 :106EF0000000000000000000000000000000000092 :106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000001061 -:106F200000000000000000A00000000000000000C1 +:106F100080000000000004000000000000000000ED +:106F20000000000000000000000000000000000061 :106F30000000000000000000000000000000000051 :106F40000000000000000000000000000000000041 :106F50000000000000000000000000000000000031 -:106F6000000000000000000000000000020000001F +:106F60000000000000000000000000000000000021 :106F70000000000000000000000000000000000011 :106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 +:106F900000000000000000200000000000000000D1 :106FA00000000000000000000000000000000000E1 :106FB00000000000000000000000000000000000D1 :106FC00000000000000000000000000000000000C1 :106FD00000000000000000000000000000000000B1 :106FE00000000000000000000000000000000000A1 :106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 +:1070000000000000000000000000008400000000FC +:10701000000000C011000000008500840000000096 +:10702000000000000300000000000000000000005D :107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 :107050000000000000000000000000000000000030 :107060000000000000000000000000000000000020 :107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 +:1070800000000000000000000008000000000000F8 +:1070900000000000000200000000000000000000EE +:1070A00000000002000200000000000000000000DC :1070B00000000000000000000000000000000000D0 :1070C00000000000000000000000000000000000C0 :1070D00000000000000000000000000000000000B0 :1070E00000000000000000000000000000000000A0 :1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F +:107100000000000500000200000000000000000078 :10711000000000000000000000000000000000006F -:10712000001000000000000000000000000000004F -:10713000000000000000000000000200000000004D +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F :10714000000000000000000000000000000000003F -:107150000000080000000000000000000000020025 +:10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F -:10717000000002000000000000000000000000000D +:10717000000000000000000000000000008400008B :1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF +:10719000000000000000000000000000900000005F :1071A00000000000000000000000000000000000DF :1071B00000000000000000000000000000000000CF :1071C00000000000000000000000000000000000BF @@ -42794,7 +42794,7 @@ :1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F :10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E +:1072100000000000000000000000000011008000DD :10722000000000000000000000000000000000005E :10723000000000000000000000000000000000004E :10724000000000000000000000000000000000003E @@ -42803,7 +42803,7 @@ :10727000000000000000000000000000000000000E :1072800000000000000000000000000000000000FE :1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE +:1072A00000800000008000000000000000000000DE :1072B00000000000000000000000000000000000CE :1072C00000000000000000000000000000000000BE :1072D00000000000000000000000000000000000AE @@ -42811,7 +42811,7 @@ :1072F000000000000000000000000000000000008E :10730000000000000000000000000000000000007D :10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D +:1073200000000020000000C000000000000000007D :10733000000000000000000000000000000000004D :10734000000000000000000000000000000000003D :10735000000000000000000000000000000000002D @@ -42819,7 +42819,7 @@ :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD +:1073A00000002100008888000100000000000000AB :1073B00000000000000000000000000000000000CD :1073C00000000000000000000000000000000000BD :1073D00000000000000000000000000000000000AD @@ -42827,7 +42827,7 @@ :1073F000000000000000000000000000000000008D :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C +:107420000000000041000080000009000000000092 :10743000000000000000000000000000000000004C :10744000000000000000000000000000000000003C :10745000000000000000000000000000000000002C @@ -42835,7 +42835,7 @@ :10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC :1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC +:1074A000000000000000001100000080000000004B :1074B00000000000000000000000000000000000CC :1074C00000000000000000000000000000000000BC :1074D00000000000000000000000000000000000AC @@ -42843,7 +42843,7 @@ :1074F000000000000000000000000000000000008C :10750000000000000000000000000000000000007B :10751000000000000000000000000000000000006B -:10752000000000000000000000000000000000005B +:10752000000000000000000000010000004000001A :10753000000000000000000000000000000000004B :10754000000000000000000000000000000000003B :10755000000000000000000000000000000000002B @@ -42851,8 +42851,8 @@ :10757000000000000000000000000000000000000B :1075800000000000000000000000000000000000FB :1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB +:1075A00000000000000000000000000000000700D4 +:1075B0008221000000000000000000000000000028 :1075C00000000000000000000000000000000000BB :1075D00000000000000000000000000000000000AB :1075E000000000000000000000000000000000009B @@ -42860,7 +42860,7 @@ :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A :10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A +:10763000F0F000000000000000000000000000006A :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A @@ -42868,7 +42868,7 @@ :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA :1076A00000000000000000000000000000000000DA -:1076B00000000000000000000000000000000000CA +:1076B0000000F0F0000000000000000000000000EA :1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A @@ -42876,7 +42876,7 @@ :107700000000000000000000000000000000000079 :107710000000000000000000000000000000000069 :107720000000000000000000000000000000000059 -:107730000000000000000000000000000000000049 +:107730000000FFFF0000FFFF00000000000000004D :107740000000000000000000000000000000000039 :107750000000000000000000000000000000000029 :107760000000000000000000000000000000000019 @@ -42892,7 +42892,7 @@ :107800000000000000000000000000000000000078 :107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 -:107830000000000000000000000000000000000048 +:107830000000000005002A00054000A8000000002C :107840000000000000000000000000000000000038 :107850000000000000000000000000000000000028 :107860000000000000000000000000000000000018 @@ -42931,104 +42931,104 @@ :107A70000000000000000000000000000000000006 :107A800000000000000000000000000000000000F6 :107A900000000000000000000000000000000000E6 -:107AA00000000000000000000000000000002000B6 -:107AB00020002000000088000000000020002000BE -:107AC0000000000020002000000020002000000036 -:107AD0002000000000002000000040000000200006 -:107AE0000000000020002000000020002000000016 -:107AF0000000200000000000200000002000000026 -:107B000020000000000020002000000020002000D5 -:107B100000002000000000002000820000000000A3 -:107B200020000000000020002000000020002000B5 -:107B30000000000000000000000000000000000045 -:107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 -:107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B900000000000004000000000000000000004A1 -:107BA0000004009000000000000000000000000041 -:107BB00000040000000000000000000000000000C1 -:107BC000000000400000000000000000000008006D -:107BD000084000000000000000000000000000005D -:107BE000000000000000000000000000000008008D +:107AA000000000000000000000000000000088004E +:107AB00040000000200020002000200020000000E6 +:107AC00000002000000000002000200020008800AE +:107AD0000000000088002000200020002000880016 +:107AE000000020008800000020002000200000008E +:107AF0002000000000000000C00020002000200046 +:107B000020000000200088008800200020002000C5 +:107B1000200000000000880020002000200020003D +:107B20002000000020002000200020002000200075 +:107B30000000000000000000000000000040000005 +:107B400000000000000000040000000000900000A1 +:107B50000000000000000000000000000000000421 +:107B600000000000000000004000000000000000D5 +:107B700000004000000000000000000000000000C5 +:107B80000000004000400000000000000000000075 +:107B900000000000000000000000000000020040A3 +:107BA00000000000000000000000000000000000D5 +:107BB0000000000000000000000000400000000085 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 :107BF0000000000000000000000000000000000085 -:107C0000000008000000000000000000000000006C -:107C10000010004000000000000000000000000014 -:107C2000000008000000000000000000000000004C -:107C30000800084000840000000000000000000070 -:107C400000080000000000000000008400000000A8 -:107C50000008008800000000000000000000400054 -:107C6000000800000000000000000000000000000C -:107C70000084001000000000000000000000000070 -:107C800000000004000800000000000000000000E8 -:107C900000000000000000000000000000000300E1 -:107CA000000000080008000005000000400000007F +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 +:107C600000000000400000080000000000000000CC +:107C70000000000000000000000000000000000004 +:107C8000000000000082000000080000000000006A +:107C900000000000000040000000000000000000A4 +:107CA00000000000000000000010000000000000C4 :107CB00000000000000000000000000000000000C4 -:107CC00000000000000000030000000000000000B1 -:107CD000000000000000000000000000000500009F +:107CC00000000000000000000008000000000000AC +:107CD000000000000000000008000000000000009C :107CE0000000000000000000000000000000000094 :107CF0000000000000000000000000000000000084 -:107D0000000000000008004000000000000000002B -:107D10000000000000000000000000000000000063 -:107D20000000000000000000000000000000000053 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 +:107D00000000000000000000000000000000000073 +:107D10000000000000000021000000000000000042 +:107D2000000000000000000500000000000000004E +:107D3000000000000000000000000000080000003B +:107D40001000000000000000000000000000000023 :107D50000000000000000000000000000000000023 :107D60000000000000000000000000000000000013 -:107D700000000000000000A0000000000000000063 +:107D70000000000000000000000000000000000003 :107D800000000000000000000000000000000000F3 :107D900000000000000000000000000000000000E3 :107DA00000000000000000000000000000000000D3 :107DB00000000000000000000000000000000000C3 -:107DC000000008000000000000000020000000008B -:107DD0000041000000400000000000000000000022 -:107DE0000000000000000000000000000000000093 +:107DC00000000000000000000000080000040000A7 +:107DD0000800000000000000000008000000000093 +:107DE0000800000000000000000800000000000083 :107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000969 -:107E10000000000000000000000000000000000062 -:107E200000000040000000400040900900000002F7 -:107E30000040000000000000000000000000000002 -:107E40000800000000000000000000000400000026 -:107E50000000000003000000000000000800000017 -:107E600008000000000020000000000000000000EA +:107E00000000080008000000000000210000000041 +:107E1000000008000000000000000000000000005A +:107E20000000000000000008000000050008000835 +:107E30000000000000000000000000000000000042 +:107E40000010000000000000000000002100000001 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 :107E70000000000000000000000000000000000002 :107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 +:107E900000000000000000000000000000A0000042 :107EA00000000000000000000000000000000000D2 -:107EB000000021000000000000000000030000009E +:107EB00000000000000000000000000000000000C2 :107EC00000000000000000000000000000000000B2 -:107ED000000000000000000000000000000800009A +:107ED00000000000000000000000000000000000A2 :107EE0000000000000000000000000000000000092 :107EF0000000000000000000000000000000000082 :107F00000000000000000000000000000000000071 :107F10000000000000000000000000000000000061 :107F20000000000000000000000000000000000051 :107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000000000000000000021 +:107F40000000000000000000002000000000000011 +:107F5000000000000000008400000000000000009D :107F60000000000000000000000000000000000011 :107F70000000000000000000000000000000000001 :107F800000000000000000000000000000000000F1 :107F900000000000000000000000000000000000E1 :107FA00000000000000000000000000000000000D1 :107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 +:107FC000000000000021000000000200000000008E :107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000000091 -:107FF0000008000000000000000000000000000079 +:107FE000000200000000000000000000000000008F +:107FF0000000000000000000000000000000000081 :108000000000000000000000000000000000000070 :108010000000000000000000000000000000000060 :108020000000000000000000000000000000000050 -:108030000800000000000000000000000000000038 -:108040000000000000000000000000000800000028 -:108050000000080002000000000000000000009086 +:10803000000000000000000000000010000000032D +:10804000000500000000000000000000000000002B +:1080500000000000210000000000000000000000FF :108060000000000000000000000000000000000010 -:1080700000000800110000000000000000000000E7 +:108070000000000000000000000000000000000000 :1080800000000000000000000000000000000000F0 -:1080900000000000110000000000000000000000CF -:1080A00000000000000000000000000000002000B0 -:1080B000200000000000000000400004000000005C +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000084098400000000AF :1080C00000000000000000000000000000000000B0 :1080D00000000000000000000000000000000000A0 :1080E0000000000000000000000000000000000090 @@ -43183,225 +43183,225 @@ :108A30000000000000000000000000000000000036 :108A40000000000000000000000000000000000026 :108A50000000000000000000000000000000000016 -:108A600000000000000000000000000020002000C6 -:108A70000000200020002000000000002000200056 -:108A80002000200020002000200000002000200006 -:108A90000000200020002000000000004000200016 -:108AA0002000200020002000200000000002200004 -:108AB0002000000020002000200000000000200016 -:108AC00020002000200020002000200000002000C6 -:108AD00020000000200020002000000000002000F6 -:108AE00020002000200020002000200002000000C4 -:108AF0000000000000000000000000000000000076 -:108B00000000000000000000000040200000000005 -:108B10000000000000004000000000000000000015 +:108A600000000000000000000000000000002000E6 +:108A70002000C000000088000000200088002000C6 +:108A80000000200020000000000420000000200062 +:108A9000880020000000000000000000020020000C +:108AA0008800200000000000000000040003000017 +:108AB00020002000000000004000000088000400AA +:108AC0002000000020000000000000000000000066 +:108AD0000000200000000000000000002000200036 +:108AE000200088000000000000000000000040029C +:108AF0000000000000002000400000000000000016 +:108B00000000000000000000000000000000400025 +:108B100000000000000000000000000000008000D5 :108B20000000000000000000000000000000000045 -:108B30000000000000000000000000000000000035 -:108B400000000000000000004000000000000000E5 -:108B50000000000000000000000002000000000013 -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B80000000000000100040000000000000000095 -:108B90000000000000000000000000000040000095 -:108BA00000000000000000000000000000000000C5 +:108B300040000000000000400000000000000002B3 +:108B40000000000000020000000000000000000023 +:108B50004000410009000000000000000002000089 +:108B600000004000000000000000000000000000C5 +:108B700000000000000000002000000000000000D5 +:108B800000000000000000000000000000000000E5 +:108B9000040004000020002000000000000000008D +:108BA00000000000000000000400040004000400B5 :108BB00000000000000000000000000000000000B5 :108BC00000000000000000000000000000000000A5 -:108BD00000000000000000002080000000000000F5 -:108BE0000000000000000000000000000000000085 -:108BF000000000000000000800080900000800084C -:108C000000084008000000000008050000000008FF -:108C10000008050000000008000800000008050822 -:108C200000080040004000004084000040000008B0 -:108C30000008000000000000000800840000000898 -:108C400000080008000000000000000800004000CC -:108C500000080008004000400008800400000008F0 -:108C600002080008000000000000000800000000EA -:108C700000080008000000000000002100000000C3 -:108C800000000000000000000000002100000000C3 -:108C900000000000000000000000002100000000B3 -:108CA00000000000000000000000000800000000BC -:108CB00000000000000000000000000000080000AC -:108CC0000000000000000000000000000021000083 -:108CD000000000000000000000000000000800008C +:108BD0000000040004000403040000000000000082 +:108BE000000000000000000000000000000000097C +:108BF000020000000000000000000008000000006B +:108C0000000800080000000000080508000000003F +:108C10000008890080000001000100080000000039 +:108C2000000800080008000000088008800080009C +:108C300080080000000000000000000000080000A4 +:108C4000000000080008000800000088000800007C +:108C50000000000880008000800080000008000004 +:108C60000000000800080010000000840008000058 +:108C700000000008000000000000000000000000EC +:108C800000000000000000080000000000000000DC +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000200000000B2 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000094 :108CE0000000000000000000000000000000000084 :108CF0000000000000000000000000000000000074 :108D00000000000000000000000000000000000063 :108D10000000000000000000000000000000000053 :108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 +:108D30000000000000000000210000000000000012 +:108D4000000000000000000000000000000000081B :108D50000000000000000000000000000000000013 :108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000000E3 -:108D900010000000000000000000000000000000C3 -:108DA00040000000900000000800400000000000AB -:108DB00000000000820000000000000082000000AF -:108DC0000000000000009000000000000000000013 -:108DD0000000000000000000000000000000000093 -:108DE00000000000000000000000000002008800F9 -:108DF00088000000000000000000040000001000D7 -:108E00000300030004004000000000000008000010 -:108E1000101000000000009008000000000010008A -:108E200010000000004040000000000000000000B2 -:108E3000410000000000000010820000000000005F -:108E40001000101041001000000041000000000060 -:108E50000000000000001000000000000000000002 -:108E600000002000000000000000000000000000E2 -:108E70000000024000001000002000400000000040 +:108D70000000000000000000C0000000000008002B +:108D80000000000000000000080000000800820051 +:108D900000000000080000000000000008000000C3 +:108DA00000008400C0000800000000000000010076 +:108DB00000000000000008000000000000000000AB +:108DC0000000000000000000000000000000C000E3 +:108DD0000000000000000000000000000800C000CB +:108DE0000000000000000000000001000000000082 +:108DF000090000000000000000000000000000006A +:108E000021000240080000000000000000000000F7 +:108E1000000800000020000000000000000000002A +:108E2000000010000800000000000000000000A08A +:108E30000408000000000000000000000000000026 +:108E40000000000000001000000000000000000012 +:108E5000000000080000000000000000000000000A +:108E600000000000000008000000000002000000F8 +:108E7000000004A00000000000000000000000004E :108E800000000000000000000000000000000000E2 :108E900000000000000000000000000000000000D2 -:108EA0000000000082000000000000000000000040 -:108EB0000000000000000000000000000000820030 -:108EC000A0080010000000000000000000000000EA -:108ED0000000000000000000000082000000000010 +:108EA00000008200000000008200000000000000BE +:108EB0000020000000000000000000000000000092 +:108EC000000000000000000000000000A0000800FA +:108ED00000000000000000000000A000C000000032 :108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 +:108EF0000000002000000000000000000000000052 :108F00000000000000000000000000000000000061 :108F10000000000000000000000000000000000051 :108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 +:108F30000000000100000000000000000000000030 :108F40000000000000000000000000000000000021 :108F50000000000000000000000000000000000011 :108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800004000000000000000000000000000000DD +:108F700000000000000100000000000000000000F0 +:108F800000000021000000000000000000000000C0 :108F900000000000000000000000000000000000D1 -:108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000040000030000AA -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 +:108FA00000000000000000000040004000400040C1 +:108FB00008000000000000000800000000000000A1 +:108FC0000000000000000000080000000000000099 +:108FD0000000000000000800000000000000000089 :108FE0000000000000000000000000000000000081 :108FF0000000000000000000000000000000000071 -:109000000000000000000020000021000000008897 -:1090100000880000000000001100000000000000B7 -:10902000000000020000000000000000000011002D -:109030000000000040000084110003000400002034 -:109040000000000000080000000000000000000018 -:1090500003000000200003040000200000000000C6 -:1090600000000000000400000000000011000040AB -:1090700002001100000002200900090000000000A9 -:1090800000020000000000000000000000000000DE +:109000000000000000000000000000000000000060 +:1090100000000000080000000088000000000000C0 +:109020000000000000000000000000000000000040 +:109030000000000008000000000000000000000028 +:109040000000000000000000000000000000000020 +:109050000000000000000800000000000000000008 +:109060000000000000000000000000000000000000 +:109070000000000000000888090009080000000046 +:1090800000000000000000000000000000000000E0 :1090900000000000000000000000000000000000D0 :1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 +:1090B000000000000000900200000000000000001E :1090C00000000000000000000000000000000000A0 :1090D0000000000000000000000000000000000090 :1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 +:1090F00000000000000000009040000000000000A0 :10910000000000000000000000000000000000005F :10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:10913000000000000000000000000000000000002F +:1091200000000000000040000000000000000000FF +:10913000000000000000110080800000000000001E :10914000000000000000000000000000000000001F :10915000000000000000000000000000000000000F :1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF +:10917000000000000000000011008000000000005E :1091800000000000000000000000000000000000DF :1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000000000000AF +:1091A00000000000000000000000008000000080BF +:1091B00000000000000000000000008000000080AF :1091C000000000000000000000000000000000009F :1091D000000000000000000000000000000000008F :1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E +:1091F00000000000000000000000000000800000EF +:1092000000800000000000000000000000000000DE :10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E +:109220000000000000000000000000000008000036 +:109230000008000000000000000000000020000006 +:1092400000C00000004000000040000000000000DE :10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE +:1092600000000000000000000000000000000020DE +:1092700000000008000000000000000000000020C6 +:10928000000000C00000000000000000000000001E :1092900000000000000000000000000000000000CE :1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E +:1092B000080000000000000000000000010000881D +:1092C00088000100000000004000000000000000D5 :1092D000000000000000000000000000000000008E :1092E000000000000000000000000000000000007E -:1092F000000000000001000000000000000000006D -:10930000000000000000000000000000000000005D +:1092F000000040000000000000000000000001002D +:10930000008888000100000000000000000000004C :10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D +:109320000000000000000000000000000000090034 +:10933000000080000000000000000000000041006C +:10934000008000000900050000000000000000008F :10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD -:1093700000000000000000110000000000000000DC -:1093800000000000000000000000000000000000DD +:1093700003000000000000000000000000000000EA +:109380004100008000000900000000000000000013 :1093900000000000000000000000000000000000CD :1093A00000000000000000000000000000000000BD :1093B00000000000000000000000000000000000AD -:1093C000000000000000000000000000000000009D +:1093C000001100000080000000000000000000000C :1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D :1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C +:1094000000000011000000800000000000000000CB :10941000000000000000000000000000000000004C :10942000000000000000000000000000000000003C :10943000000000000000000000000000000000002C -:10944000000000000000000000000000000000001C +:1094400000000001000000400000000000000000DB :10945000000000000000000000000000000000000C :1094600000000000000000000000000000000000FC :1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC +:10948000000000000001000000400000000000009B :1094900000000000000000000000000000000000CC :1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C -:1094D000000000000000000000000000000000008C +:1094B0000000000000410000070000000000000064 +:1094C00000000000000000000700822100000000F2 +:1094D0000700000000000000000000000000000085 :1094E000000000000000000000000000000000007C -:1094F000000000000000600000E00000000000002C -:10950000000000000000000000000000000000005B +:1094F0000000000000000000000007000000000065 +:1095000000000000000000000000070082210000B1 :10951000000000000000000000000000000000004B :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B +:1095400000000000000000000000F0F0000000003B :10955000000000000000000000000000000000000B :1095600000000000000000000000000000000000FB :1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB +:10958000000000000000000000000000F0F00000FB :1095900000000000000000000000000000000000CB :1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB -:1095C000000000000000000000000000000000009B +:1095C000000000000000000000000000F0F00000BB :1095D000000000000000000000000000000000008B :1095E000000000000000000000000000000000007B :1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A +:109600000000000000000000000000000000F0F07A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A :10963000000000000000000000000000000000002A -:10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A +:10964000000000000000000000000000FF0000001B +:10965000FFFF00000000000000000000000000000C :1096600000000000000000000000000000000000FA :1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA +:109680000000000000000000000000000000FF00DB +:109690000000FFFF000000000000000000000000CC :1096A00000000000000000000000000000000000BA :1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A +:1096C0000000000000000000000000000000FF009B :1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A :1096F000000000000000000000000000000000006A :109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 +:10971000FF0000000000000000000000000000004A :109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000000000000000000000000000000009 +:10973000000000000000000000000000000005180C +:109740000A20050005A00000000000000000050040 +:109750002A00054000A805180A00050005A0000021 :1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 -:1097800000610006800900000000000000000000E9 -:1097900000000000000000000000000000000000C9 +:1097800005180A00050005A0000000000000000008 +:1097900005002A00054000A80000000000000000AD :1097A00000000000000000000000000000000000B9 :1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 :1097D0000000000000000000000000000000000089 :1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 -:10980000000000000000FFFF00000000000000005A +:109800000000000000000000000000000000000058 :109810000000000000000000000000000000000048 :109820000000000000000000000000000000000038 :109830000000000000000000000000000000000028 @@ -43409,7 +43409,7 @@ :109850000000000000000000000000000000000008 :1098600000000000000000000000000000000000F8 :1098700000000000000000000000000000000000E8 -:109880000000000000000000FFFF000000000000DA +:1098800000000000000000000000000000000000D8 :1098900000000000000000000000000000000000C8 :1098A00000000000000000000000000000000000B8 :1098B00000000000000000000000000000000000A8 @@ -43427,96 +43427,96 @@ :1099700000000000000000000000000000000000E7 :1099800000000000000000000000000000000000D7 :1099900000000000000000000000000000000000C7 -:1099A0000000000000000000000020002000C000B7 -:1099B000200020002000000820002000200040009F -:1099C00020002000200020000000200020002000B7 -:1099D000200088002000000020002000200020003F -:1099E00020002000200020000003000020002000B4 -:1099F00020002000000020000000200000000000E7 -:109A00000000000020002008C0040000000000004A -:109A1000400020000000880000002000000000003E -:109A2000000000002000008420A0000000000000D2 +:1099A00000000000000000008400880000000000AB +:1099B0008800880020002000000000000000000057 +:1099C0000000000020000080C00000000000000433 +:1099D0000000200020002000000000000000000027 +:1099E00000000000200000880003200000000000AC +:1099F0004000000000000000200000000000000007 +:109A000000000000000020000180000000000000B5 +:109A1000200000000000880020000400000000007A +:109A2000000084000000000001800000000000022F :109A30000000000000000000000000000000000026 -:109A400000000000030040000000000000000000D3 -:109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800010000000000000000021000100000000A4 -:109A900000002000000000000000000000000000A6 -:109AA0000000000000000020002100110000000064 -:109AB0000000000000000000000000100000000096 -:109AC000000000000000000000082002000000006C -:109AD0000000000000000000000000400000000046 -:109AE000000000000000000000081002000000005C +:109A400000000000000000000008200000000000EE +:109A50000000400000000000000040000000000086 +:109A600000000000000000000005000000004000B1 +:109A70004000000000000000000200004000000064 +:109A800000000000000000000000200800000000AE +:109A900000000000000000020000000000000000C4 +:109AA000000000004000000000002008000000004E +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 :109B10000000000000000000000000000000000045 -:109B2000000000000000000000000008100000001D -:109B300000000500200009000000000805000000EA -:109B4000000000000000090000000009800900007A -:109B500000000000000000000000000800080000F5 -:109B60000000000000000000000000098009000063 -:109B700000000000000000000000000000100010C5 -:109B800000000000000000000000000000080008C5 -:109B900000000000000000000000000000000000C5 -:109BA0000000000000000000000000000009800824 -:109BB0000000000000000000000000410000004123 -:109BC0000000000000000000000000000000000095 -:109BD000002100000000000000050000000000005F -:109BE0000005000000000000000000000000000070 -:109BF0000000000000000000000000000000000065 -:109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 -:109C200000000000C0000000000000000000000074 -:109C30000000000000000000000000000000000024 +:109B20000000000000000000000000000000000035 +:109B3000000000000000000000000900000000001C +:109B40000000000000840000000000000008000089 +:109B500000080000000000000000000800000000F5 +:109B600000000000008400000000000000840000ED +:109B70000000008400000000000000000008000059 +:109B80000000000000000008000000000000008449 +:109B90000000000000080000000000000008008431 +:109BA00000000000008400840000000000000000AD +:109BB0000000000800050021002100210021000014 +:109BC0000000000000000008002100210021200802 +:109BD0000000000800050005002100210021000010 +:109BE00000000000000000210021002100210008E9 +:109BF00000000000002100080005002100210005F0 +:109C000000050000002100000000002100210021CB +:109C100000210000000500000000002100050008F0 +:109C20000009000000000000000000100000000912 +:109C3000000500000000000000000000000000001F :109C40000000000000000000000000000000000014 -:109C50000000000000000000000000000000000004 +:109C5000800000000800000000000000000000007C :109C600000000000000000000000000000000000F4 :109C700000000000000000000000000000000000E4 -:109C800000000000000000000000000000000000D4 +:109C8000000800000000000000000000000041008B :109C900000000000000000000000000000000000C4 -:109CA00000000000000000000000000000000000B4 -:109CB00000000000820082000000820040000000DE -:109CC0000000820082008200000082000000A000EC -:109CD00000008280820082000000820010000000EC -:109CE000A0008200820082009000820082000000BA -:109CF000000082800000820082008200820000005A -:109D00000000000000000000000000000800080043 -:109D10000000A000008800008800080020008200E9 -:109D2000A0002000A000C00082008200820082000B -:109D30008200080000820000000000000000000017 -:109D400000004000210000000000000000000000B2 -:109D500000000000000800000000000040000000BB -:109D60000000400040000000210000000000000052 -:109D700000000000000400000000000000000000DF -:109D800000000000000000000000000000000000D3 -:109D900000000000000000030000000000000000C0 -:109DA0000000200000000010000041002000000022 -:109DB000000000000000000500000000A000A0005E -:109DC000000000050000000000000000000040004E -:109DD00082004005000000000000000000000000BC -:109DE00000008200000000000000000000000000F1 -:109DF000100000050000000000000000000000004E -:109E00000000000000000000000000000000000052 -:109E100000000000A0000000080000000000C000DA -:109E200000000000C0000800000000000000004129 +:109CA000008800000000000000000000000000002C +:109CB000000000008200040082000000820000001A +:109CC00000004000820082008200000000000000CE +:109CD000A0008200820082008200000008000000D4 +:109CE000100000004000820082000000820000009E +:109CF0008200000000000400820082000000820058 +:109D0000000000000000000000008200000082004F +:109D10000000A0000000000000008200000082009F +:109D2000000082000000000040008200000082006D +:109D30000000000000000000000000000000000023 +:109D40000000000000004000400000000000000093 +:109D50000000000000000000000000000000000003 +:109D600000000300000005004000000000000000AB +:109D700000000000000000000000000000000000E3 +:109D8000000000000000000000000500004000008E +:109D900000000000000000000000000000000000C3 +:109DA000000000000000000005044000000000006A +:109DB0000000000000A00000000000000000000003 +:109DC0000000000082000000000000000000000011 +:109DD0000000000000000000000000000000000083 +:109DE0000000000010000000000000000000000063 +:109DF0000000000000000000000000000000000063 +:109E00000000000000008200000000000000A00030 +:109E1000000000000000000000000800000000003A +:109E20000000000000000000000000000000000032 :109E30000000000000000000000000000000000022 :109E40000000000000000000000000000000000012 :109E50000000000000000000000000000000000002 :109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 +:109E7000008400000000000000000000000000005E :109E800000000000000000000000000000000000D2 :109E900000000000000000000000000000000000C2 :109EA00000000000000000000000000000000000B2 -:109EB0000000000000000000000000000010000092 -:109EC00040008800820008050000000000004005F6 -:109ED0000000000000212004000000000000884174 -:109EE0001000C00010000800000000000009000081 -:109EF0000000000000090400820000410000000092 -:109F00000011A000C0008200080000000000000056 -:109F100008000800400000000000000000000000F1 -:109F20000800000082008200A00082000000000003 -:109F30000004000000000400000082004000000057 +:109EB000000000840000000000000000404100009D +:109EC00000000000A0008200100800000000002137 +:109ED000A021002100000000000000000800000098 +:109EE00000000000A000080082088421000000217A +:109EF00000000008000000000000000200008200D6 +:109F0000000000000000A000080008000008000099 +:109F1000002102080008000000000000000000000E +:109F2000000000000000000000040000C02100004C +:109F300000080021002100050008080000020000C0 :109F40000000000000000000000000000000000011 :109F50000000000000000000000000000000000001 :109F600000000000000000000000000000000000F1 @@ -43524,81 +43524,81 @@ :109F800000000000000000000000000000000000D1 :109F900000000000000000000000000000000000C1 :109FA00000000000000000000000000000000000B1 -:109FB0000000000000C000000000000008000000D9 -:109FC000000000000000000100000000000001A0EF -:109FD00001000000008210100000000000010000DD -:109FE00000000000000000010000900000010004DB -:109FF000000001000082C004000000000001000019 -:10A00000000000000000000000010000000000004F -:10A010000004000001000020C0A0000000000001BA -:10A02000000000000000000000010000A00000018E -:10A0300001840000C0000084C0820000C000000154 -:10A04000000000000000000000020000000000030B -:10A0500002000440210000008000000000000041D8 -:10A0600000000000000000000002000000000003EB -:10A0700008800340100000000000000000000041C4 -:10A0800000000000000000000000000200000000CE -:10A090000020088000401000000080000000000048 -:10A0A000004100000000000000000004000000006B -:10A0B0000004020000038300000080800000800094 -:10A0C0000003000000000900000000000000400044 -:10A0D0000000050009000500000004000000000069 -:10A0E00000008020000005000000000000000500C6 -:10A0F00000000200200085000000090000000000B0 -:10A1000000008020000000000500000000000000AA -:10A11000100000000200200082000000400000004B -:10A1200000000000800500000200000000000000A8 -:10A13000040000000300A000030000000300000072 -:10A1400000000080804000000000000000000000CF -:10A150000100000000008200824000000100900029 -:10A1600000000000C000000000000000000000002F -:10A1700000000000010021002040000000009000CD -:10A1800000000000C001000000000000000000000E -:10A190000000010000000100210005400000010056 -:10A1A000900000000000C00000000100000000005E -:10A1B00000000100000001000500A140000001C0F6 -:10A1C0000400000000C08200000000000000000049 -:10A1D000000000000001210000020000000000005B -:10A1E000000000000001000000000000000000006E -:10A1F0000000000000002000000800000000000037 -:10A20000000000000001000000000000000000004D -:10A21000000000000000000020000082000001009B -:10A22000000000000000000100000000000000002D -:10A23000000000000000000110000040000041008C -:10A24000000000000000000000000000000000000E -:10A250000000000000000005404000000000040075 -:10A2600000000000000000410000000000000000AD -:10A2700000000000000000410040008000001100CC -:10A28000000000000000004100000000000000008D -:10A29000000000000000000000410040000000003D -:10A2A000030000000000000000410000000000006A -:10A2B000000000000000000000208004008000007A -:10A2C000410000000000000000410000000080008C -:10A2D00000910000000380000500000000C10000A4 -:10A2E0000040000000000000000003820000800524 -:10A2F00000830000002000000500000000C10000F5 -:10A3000000400000000000000000400200000000CB -:10A31000800500830000002000000500000000C14F -:10A320000004004000000000000000002088000041 -:10A3300000020083000000008000200000000041B7 -:10A3400080000005000000410000000040090000FE -:10A35000080000100000000020008200000000053E -:10A36000A0000000000000000000000000C100008C -:10A3700004000083000000010800820000000005C6 -:10A38000A00000000000000000000000011100001B -:10A3900000000400008300000001080082000000AB -:10A3A0000005400100000000000000000000000364 -:10A3B000000082010083000000000800C1000000CE -:10A3C000008904000000000000010000000001906E -:10A3D000000000000000000000000000000000007D -:10A3E000811200E0070048000000000000000006A5 -:10A3F000000000000000000000000000000000005D -:10A40000811200E00700480000000000000000008A -:10A41000000000000000000000000000000000003C -:10A420000000811200E00700480A00000000000060 -:10A43000000000000000000000000000000000001C -:10A440000000811200E0800048420000000000008F -:10A450004842000000000000000000000000000072 +:109FB00000001100119000000000000000000000EF +:109FC00000010001000100C00001000100C10041CA +:109FD00001008401004000820001000100C1000076 +:109FE00000010001000100C00001000100C1008566 +:109FF00001000101004000040001000100C1000057 +:10A00000000000010001000100C00001000100C1CA +:10A01000010501000101004000080001400100C0ED +:10A02000000000010001000100C00001000100C0AB +:10A03000010501000101004000200001400100C0B5 +:10A0400000000041004100410082004100410088C1 +:10A0500004412020044100000080004100410085AF +:10A0600000000041004100410082004100410088A1 +:10A070000441202002410000008000410041008591 +:10A080000000000000410041004100890041004102 +:10A09000008804412020024100000000004180416E +:10A0A000008500000041004100410089004100415D +:10A0B0000082044120200241000000000041804154 +:10A0C00000C0000041000300000000804100890042 +:10A0D0000000020002000200008090004100C10068 +:10A0E0000080000041000300000000804100890062 +:10A0F0000000400002002000008082004100C100FA +:10A1000000800000000041000300000000804100CA +:10A110008900000010000500200000808800410038 +:10A12000C100008580004100030000000080410064 +:10A130008400000008000900200000808500410024 +:10A14000C1000040800001000100000000C00100CB +:10A15000C000000001004100C1400040C1004100BA +:10A16000C1000084101001000100000000C00100C7 +:10A17000C00000000000410090400040C0004100CD +:10A18000C10000841010000301000100000000C0A5 +:10A190000100C00000000000880090400040C100A5 +:10A1A0004100C1000004820001000100000000C065 +:10A1B0000100C10000000100840010840040C000C4 +:10A1C0004100C1000040820000C00001C0C1000089 +:10A1D0000000000100C002080005000100C10000ED +:10A1E000000000010000000000C00001C0C100002C +:10A1F0000000000100C008020005000100C10000CD +:10A200000000000100000000000000C00001C0C10B +:10A2100000000000000100C008020041000100C170 +:10A220000000000000010000000000C00001C0C1EB +:10A2300000000000000100C0088800C1000100C14A +:10A24000000000000001000000000080004180C10B +:10A2500000000000004100C1009000C1004100C1A9 +:10A26000000000000041001000000080004180C19B +:10A2700000000000004100C1801000C1004100C189 +:10A2800000000000004100100000000000800041BC +:10A2900080C100000000004100C180100041004169 +:10A2A00000C10000000000410005000000800041E6 +:10A2B00080C100000000004100C180100041004149 +:10A2C00000C100000000004100400000C10080000B +:10A2D00080C100004102000082004100C1C1800035 +:10A2E000800500004100000080004100C1008000A6 +:10A2F00080C100004102000002004100C1C1800095 +:10A300008005000041000000800041000000C10005 +:10A31000800080C100004102000009004100C1C16D +:10A320008000801000004100000080004100C1005A +:10A33000800080C100004102800009004100C1414D +:10A340008000801000004100000080004100C1003A +:10A350004000C0C100000100020008000100C1036C +:10A360000400C000000001000000C0000100C100A6 +:10A370004000C0C100000100020004000100C10350 +:10A380000400C000000001000000C0000100000047 +:10A39000C1004000C0C10000010002000200010035 +:10A3A000C1030400C001000001000000C000010062 +:10A3B000C1004000C0C10000010008001000010001 +:10A3C000C1030800C001000001000000C00001003E +:10A3D000000000000000004200000000000000003B +:10A3E000811200410700480000000000000000004A +:10A3F000000000000000004200000000000000001B +:10A400008112004107004800000000000000000029 +:10A4100000000000000000000042000000000000FA +:10A420000000811200410700480000000000000009 +:10A4300000000000000000000042000000000000DA +:10A4400000008112004107004800000000000000E9 +:10A4500000000000000000000000000000000000FC :10A4600000000000000000000000000000000000EC :10A4700000000000000000000000000000000000DC :10A4800000000000000000000000000000000000CC @@ -43622,104 +43622,104 @@ :10A5A00000000000000000000000000000000000AB :10A5B000000000000000DEAE757B0000000000001F :10A5C000000000000000000000000000000000008B -:10A5D000000000000000DEAE612603400000000025 -:10A5E00000000230A0000000000000000C4000004D -:10A5F0000000000002C064866126034000000000E5 -:10A6000000000230A0000000000000000C4000002C -:10A610000000000002C064860000612603400000C4 -:10A62000000000000230A0000000000000000C400C -:10A6300000000000000002C06486612603400000A4 -:10A64000000000000230A0000000000000000C40EC -:10A6500000000000000002C064862000000004002A -:10A660002000040020000000200000002000200046 -:10A670002000200088002000200020000000200092 -:10A6800088008800200088002000000020002000B2 -:10A6900020002000200020002000000020000000FA -:10A6A0002000040000000400200020000000000042 -:10A6B00020002000200020002000000020000000DA -:10A6C00020002000000020002000200000000000EA -:10A6D00020000000200020002000000009000000F1 -:10A6E0000000090020000000200000000000000021 -:10A6F000050005004000000000000000040000000C -:10A70000000020000000090000000500000000001B -:10A71000050005000000050000000000000000002A -:10A7200000000000000040002000000000000000C9 +:10A5D000000000000000DEAE60C6030000000000C6 +:10A5E00000000031E0000000000000000C0000004E +:10A5F0000000000000C0630660C603000000000009 +:10A6000000000031E0000000000000000C0000002D +:10A610000000000000C06306000060C603000000E8 +:10A62000000000000031E0000000000000000C000D +:10A6300000000000000000C0630660C603000000C8 +:10A64000000000000031E0000000000000000C00ED +:10A6500000000000000000C06306200000000000B1 +:10A6600004008800000000040004008000000000D6 +:10A67000008000000000000000002000000000003A +:10A680002000040088000004000000000000840096 +:10A690000000000000000000000000012000000099 +:10A6A00000002000880000000000000400000000FE +:10A6B000200000000000000000000000000000007A +:10A6C0000000000000008800000000000000000002 +:10A6D0002000000000000000000000000000000258 +:10A6E00000000000000000000000000040400000EA +:10A6F0000000004005000002000000000000000013 +:10A700000000000000000000000000004000000009 +:10A7100000000000400005000000000000000000F4 +:10A7200000000000000000000000000200004000E7 :10A730000000000000000000000000000000000019 -:10A740000000000000000000040000000000000005 -:10A7500005000000000000000500050000000000EA -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000900000000000000000000D0 +:10A740004000000000000000000000000000400089 +:10A7500000000000000000000000000000000040B9 +:10A760000040000000000040004000000000000029 +:10A7700000000010001000000000000000000000B9 :10A7800000000000000000000000000000000000C9 -:10A7900000000000000900000000000000000000B0 +:10A7900000000000000000000000000000000000B9 :10A7A00000000000000000000000000000000000A9 :10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000009000000000000000070 -:10A7E0000000000000000008000000000000000061 -:10A7F0000000000000000008000800000000000049 -:10A800000000000000000008000000000000000040 -:10A810000000000000000008000800000000000028 -:10A820000000000000000000000800000000000020 -:10A830000000000000000000008800080000000088 -:10A840000000000000000000008800000000000080 -:10A8500000000000000000000000000800000000F0 -:10A8600000000000000000000010000000000000D8 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 +:10A7C0000000000000000000000500000010000074 +:10A7D0000000000000100010000000000000000059 +:10A7E0000000000000000000000000000000000861 +:10A7F0000000000000000008000000000000000051 +:10A800000000000000000000000000000000000840 +:10A81000040000000000000800000000000000002C +:10A8200000000000000000000000000000000088A0 +:10A830000008000000000000000800000000000008 +:10A840000000000000000000000000880000000080 +:10A8500000840000000000000084000000000000F0 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000210000000000000000B7 +:10A8800000000000000000050000000000000000C3 :10A8900000000000000000000000000000000000B8 :10A8A00000000000000000000000000000000000A8 :10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000021000000000047 -:10A8F0000000000000000000000021000000000037 -:10A900000010000000000000000003000300000031 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000021000890080066 -:10A9300000000300000000000000000003004100D0 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A96000000000000000000000000000A000000047 -:10A97000C000A000000000000000000082000400F1 -:10A98000080082000000000000000000000000003D -:10A99000000000000000A000000000000000A00077 -:10A9A0000000040000000000820000000000C00061 +:10A8C0000000000000000000000008000000000080 +:10A8D0000000000000000000000000000002000076 +:10A8E000000000100000000000A0000003000000B5 +:10A8F0000000000000000000000000080800000048 +:10A900000000000000000000008441000800030077 +:10A91000000000000000000000000008000000002F +:10A9200000000000000000000000008400000300A0 +:10A9300008000000000000000000001000080000F7 +:10A9400000000000000000000000000000000800FF +:10A950000300000041000000000000C000A00084CF +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000001000000D6 +:10A980004000000000000000000000000000000087 +:10A990000000000000000000000000000000400077 +:10A9A00000000000000000000000000000000000A7 :10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D00000000000000000000000000000008800EF -:10A9E0000000000004000000000000000000000063 -:10A9F0000000000000000000000000000000000057 +:10A9C0000000400000000000000000000000000047 +:10A9D0000000000000000000000000000000001166 +:10A9E00040004000000000000000000000000000E7 +:10A9F0000000000000000000000000000000040053 :10AA00000000000000000000000000000000000046 :10AA10000000000000000000000000000000000036 :10AA20000000000000000000000000000000000026 :10AA30000000000000000000000000000000000016 :10AA40000000000000000000000000000000000006 :10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000800DE -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000800000000000000000000000000AE -:10AAA000C0001000000000000000000000000000D6 -:10AAB000000000000000000000000000000008008E -:10AAC0000000000000000000000000000000000086 +:10AA600000000000000000000000000000000000E6 +:10AA70000000900000000000000000000200010043 +:10AA80000000C00000000000000000000000000006 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC000000000000000000000000000080000007E :10AAD0000000000000000000000000000000000076 :10AAE0000000000000000000000000000000000066 -:10AAF0000000050000000000000000000000000051 -:10AB0000000000000000000000000800000000003D -:10AB1000000000000800000000000000210000000C -:10AB2000000000000000000000000800000000001D -:10AB3000000000000000030000000000000003000F -:10AB4000000000000000009000000000080000006D -:10AB500000000000000000000000000000000000F5 -:10AB60000084000000000000000000000000000061 -:10AB7000000082100000000000000000040000003F +:10AAF00000000000000000000000000800008000CE +:10AB00000200000000000000000000000000000043 +:10AB1000000000000000000000000008210000000C +:10AB20000000000000000000000000000000000025 +:10AB300000000000000000080000000000082100E4 +:10AB40000000080000880000000000000000000075 +:10AB500000000000000000080000000000080000E5 +:10AB600000000800000000000000000000100000CD +:10AB700000000000000000000000000000000000D5 :10AB800000000000000000000000000000000000C5 -:10AB900000000000000004000000000000000400AD -:10ABA00000000000000000000000C00000000000E5 -:10ABB0000000000000000000000000000000000095 +:10AB900000000000000004000000000800000000A9 +:10ABA00000000000000000000000000000000000A5 +:10ABB000000000000000000008000000004100004C :10ABC0000000000000000000000000000000000085 :10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000800000000090000A000B4 +:10ABE0000000000000000000000000000000000065 :10ABF0000000000000000000000000000000000055 :10AC00000000000000000000000000000000000044 :10AC10000000000000000000000000000000000034 @@ -43727,9 +43727,9 @@ :10AC30000000000000000000000000000000000014 :10AC40000000000000000000000000000000000004 :10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 +:10AC600000001100110000000000000000000000C2 :10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 +:10AC80000000000000900000000000000000000034 :10AC900000000000000000000000000000000000B4 :10ACA00000000000000000000000000000000000A4 :10ACB0000000000000000000000000000000000094 @@ -43737,7 +43737,7 @@ :10ACD0000000000000000000000000000000000074 :10ACE0000000000000000000000000000000000064 :10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 +:10AD000000000000000000800000000000000000C3 :10AD10000000000000000000000000000000000033 :10AD20000000000000000000000000000000000023 :10AD30000000000000000000000000000000000013 @@ -43745,7 +43745,7 @@ :10AD500000000000000000000000000000000000F3 :10AD600000000000000000000000000000000000E3 :10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 +:10AD80000000000000000000000000000080000043 :10AD900000000000000000000000000000000000B3 :10ADA00000000000000000000000000000000000A3 :10ADB0000000000000000000000000000000000093 @@ -43753,7 +43753,7 @@ :10ADD0000000000000000000000000000000000073 :10ADE0000000000000000000000000000000000063 :10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 +:10AE000000000000000000000000009000000002B0 :10AE10000000000000000000000000000000000032 :10AE20000000000000000000000000000000000022 :10AE30000000000000000000000000000000000012 @@ -43761,7 +43761,7 @@ :10AE500000000000000000000000000000000000F2 :10AE600000000000000000000000000000000000E2 :10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 +:10AE800000000000000000000000000000009090A2 :10AE900000000000000000000000000000000000B2 :10AEA00000000000000000000000000000000000A2 :10AEB0000000000000000000000000000000000092 @@ -43769,16 +43769,16 @@ :10AED0000000000000000000000000000000000072 :10AEE0000000000000000000000000000000000062 :10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 +:10AF00000000000000000000000000000800000039 +:10AF100000800000000000000000000000000000B1 :10AF20000000000000000000000000000000000021 :10AF30000000000000000000000000000000000011 :10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 :10AF600000000000000000000000000000000000E1 :10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 +:10AF800000000000000000000000000000000011B0 +:10AF90008000000000000000000000000000000031 :10AFA00000000000000000000000000000000000A1 :10AFB0000000000000000000000000000000000091 :10AFC0000000000000000000000000000000000081 @@ -43786,7 +43786,7 @@ :10AFE0000000000000000000000000000000000061 :10AFF0000000000000000000000000000000000051 :10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 +:10B010000001200000880000000000000000000087 :10B020000000000000000000000000000000000020 :10B030000000000000000000000000000000000010 :10B040000000000000000000000000000000000000 @@ -43794,7 +43794,7 @@ :10B0600000000000000000000000000000000000E0 :10B0700000000000000000000000000000000000D0 :10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 +:10B0900000000000000007000000000000000000A9 :10B0A00000000000000000000000000000000000A0 :10B0B0000000000000000000000000000000000090 :10B0C0000000000000000000000000000000000080 @@ -43802,7 +43802,7 @@ :10B0E0000000000000000000000000000000000060 :10B0F0000000000000000000000000000000000050 :10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F +:10B11000000000000000FF000000FF000000000031 :10B12000000000000000000000000000000000001F :10B13000000000000000000000000000000000000F :10B1400000000000000000000000000000000000FF @@ -43810,7 +43810,7 @@ :10B1600000000000000000000000000000000000DF :10B1700000000000000000000000000000000000CF :10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF +:10B190000000000000000000FF000000FF000000B1 :10B1A000000000000000000000000000000000009F :10B1B000000000000000000000000000000000008F :10B1C000000000000000000000000000000000007F @@ -43826,7 +43826,7 @@ :10B2600000000000000000000000000000000000DE :10B2700000000000000000000000000000000000CE :10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE +:10B290000000000000000000000000FF0000FFFFB1 :10B2A000000000000000000000000000000000009E :10B2B000000000000000000000000000000000008E :10B2C000000000000000000000000000000000007E @@ -43834,7 +43834,7 @@ :10B2E000000000000000000000000000000000005E :10B2F000000000000000000000000000000000004E :10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D +:10B3100000000000000000000000000000FF00002E :10B32000000000000000000000000000000000001D :10B33000000000000000000000000000000000000D :10B3400000000000000000000000000000000000FD @@ -43842,8 +43842,8 @@ :10B3600000000000000000000000000000000000DD :10B3700000000000000000000000000000000000CD :10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D +:10B390000000000000000000000000000000150098 +:10B3A0002A00054000A80000000000000000000086 :10B3B000000000000000000000000000000000008D :10B3C000000000000000000000000000000000007D :10B3D000000000000000000000000000000000006D @@ -43882,45 +43882,45 @@ :10B5E000000000000000000000000000000000005B :10B5F000000000000000000000000000000000004B :10B60000000000000000000000000000000000003A -:10B6100000000000000000000000840000000000A6 -:10B6200000000000040000002000000000000400F2 -:10B6300000000000200000000000200000000000CA -:10B640000000000020008800200000000000200012 -:10B6500000000000200000000000000000000000CA +:10B6100000000000000000000000880000000000A2 +:10B62000008000000000000000000000000000009A +:10B6300000000000000000000000200000000000EA +:10B6400000000000000000001000010001000104E3 +:10B6500000000000000000000003010000000000E6 :10B6600000000000000000000000200000000000BA -:10B6700000000000000020000000000000000000AA -:10B68000000000000000000000002000000000009A -:10B69000000000000000200000000000000000008A -:10B6A0002000000000002000000000000000040056 -:10B6B0000000040000000000000000000000000086 -:10B6C0000000040000000000000000000000000076 -:10B6D000000000000000000000000000000000006A +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A0000000000800000000000000000000000092 +:10B6B0000000400000000400000040000000000006 +:10B6C00000000000000000000000800010001000DA +:10B6D0001000000000000000000000000200000058 :10B6E000000000000000000000000000000000005A -:10B6F000000020000000000000000000000000002A -:10B700000000000000000000000000000000000039 +:10B6F000000000000000000000000000000000004A +:10B7000000000000400000020000000020000000D7 :10B710000000000000000000000000000000000029 -:10B720000000000000000000001000000000000009 -:10B7300000000000000000000040001000000000B9 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 :10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000040000000000000A9 -:10B760000000000000000000000000000040000099 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 :10B7700000000000000000000000000000000000C9 -:10B780000000000000000000000000100040000069 -:10B790000000000000000000000000400041000028 -:10B7A0000000000000000000000000082000000071 -:10B7B0000000000000080000000000000040000041 -:10B7C0000000000000000000000000100000000069 -:10B7D00000000000008400000000000000080000DD +:10B7800000000000000000000000000000000000B9 +:10B790000000000010000000000000000000000099 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000841 -:10B800000000000000000000000000000000000830 -:10B8100000000000000000000000000000000040E8 -:10B8200000000000000000000000000000000021F7 -:10B8300000000000000008000000C0000000000838 -:10B84000000000000000000000000000080082006E +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 :10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000005000000000800CB -:10B8700008000000000000000000000000000000C0 +:10B8600000000000000000000000000000000000D8 +:10B870000000000000000000900000000000000038 :10B8800000000000000000000000000000000000B8 :10B8900000000000000000000000000000000000A8 :10B8A0000000000000000000000000000000000098 @@ -43932,43 +43932,43 @@ :10B900000000000000000000000000000000000037 :10B910000000000000000000000000000000000027 :10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000400000000000000000000000000F3 -:10B9500000000000000000000000000000000000E7 -:10B960000000000000000000000000000000C00017 +:10B930000100008000000000000000000000000086 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000010000000000E6 +:10B9600000000000000000000000000001000000D6 :10B9700000000000000000000000000000000000C7 :10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000084000013 -:10B9B0000000000000000000000000000000000087 -:10B9C00000000000000000000000000000840000F3 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 +:10B990000000000000000000000000000009000599 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000200000040000000000000000000063 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000002000000047 +:10B9E0000000000000000000000000000000040053 :10B9F0000000000000000000000000000000000047 -:10BA00000000000000000004000000000000000032 +:10BA00000000000000000000000000000000000036 :10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA300000000000000000000000000008000000FE +:10BA2000000000000000000000000800000090007E +:10BA30000000000000000000000000000000000006 :10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000008000000CE +:10BA500000002000000000000000100000000000B6 +:10BA600000000000000000000000000008000020AE :10BA700000000000000000000000000000000000C6 :10BA800000000000000000000000000000000000B6 :10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 +:10BAA0000000000000000000000000900000000006 +:10BAB000000000000000000000000400080000007A +:10BAC00000840000000000000000000000000000F2 :10BAD0000000000000000000000000000000000066 :10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000010000000000036 -:10BB00000000000003000000000000000000000032 +:10BAF00000010000000000000000000000900000B5 +:10BB00000000000000000000000000000000000035 :10BB10000000000000000000000000000000000025 :10BB20000000000000000000000000000000000015 -:10BB300000000000000000000000001000000000F5 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000001000000000D5 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000200000000F3 +:10BB500000000000000000000000000000000000E5 :10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000080000BD +:10BB700000000000000000000000000000000000C5 :10BB800000000000000000000000000000000000B5 :10BB900000000000000000000000000000000000A5 :10BBA0000000000000000000000000000000000095 @@ -43979,77 +43979,77 @@ :10BBF0000000000000000000000000000000000045 :10BC00000000000000000000000000000000000034 :10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 +:10BC20001100000000000000000000000000000003 +:10BC30000000000000000000010000000000000003 :10BC400000000000000000000000000000000000F4 :10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 +:10BC600001000000000000000000000000000000D3 +:10BC70000000000090000000000000000000000034 :10BC800000000000000000000000000000000000B4 :10BC900000000000000000000000000000000000A4 :10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 +:10BCB0000000000000000000000011002100000052 :10BCC0000000000000000000000000000000000074 :10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 +:10BCE0000000110000210000000000000000000022 +:10BCF00000000000110080000000000000000000B3 :10BD00000000000000000000000000000000000033 :10BD10000000000000000000000000000000000023 :10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 +:10BD300000000000000000000000000000C1090039 +:10BD40000003008000000000000000000000000070 :10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 +:10BD600000000000000300001108000000000000B7 +:10BD700000000000000000000080000000800000C3 :10BD800000000000000000000000000000000000B3 :10BD900000000000000000000000000000000000A3 :10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 +:10BDB0000000000000000000000000000000000380 +:10BDC00001000000008800000000000000000000EA :10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 +:10BDE0000000000000000000000001000000000052 +:10BDF000000000000000000000000020000000C063 :10BE00000000000000000000000000000000000032 :10BE10000000000000000000000000000000000022 :10BE20000000000000000000000000000000000012 :10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 +:10BE40000000880000000100000000000000000069 :10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 +:10BE600000000000000000000000200000010000B1 +:10BE700000000000000000000000010000888800B1 +:10BE800003000000000000000000000000000000AF :10BE900000000000000000000000000000000000A2 :10BEA0000000000000000000000000000000000092 :10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 +:10BEC0000000000000000000410000000000000031 :10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 +:10BEE000000000000000000000000000000000084A +:10BEF000030000000000000000000000410000807E +:10BF000000008900000000000000000000000000A8 :10BF10000000000000000000000000000000000021 :10BF20000000000000000000000000000000000011 :10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 +:10BF400000000000000000110000000000000000E0 :10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 +:10BF600000000000000000000000000000001100C0 +:10BF700000000000000000000000000000000011B0 +:10BF80000000008000000000000000000000000031 :10BF900000000000000000000000000000000000A1 :10BFA0000000000000000000000000000000000091 :10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 +:10BFC0000000000000000000000100000000000070 :10BFD0000000000000000000000000000000000061 :10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 +:10BFF0000100000000000000000000000000000040 +:10C0000000010000004000000000000000000000EF :10C010000000000000000000000000000000000020 :10C020000000000000000000000000000000000010 :10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 +:10C040000000000000000000000000E0000081414E :10C0500000000000000000000000000000000000E0 :10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 +:10C07000000000E0000000000000000000000000E0 +:10C080000000000000000700822100000000000006 :10C0900000000000000000000000000000000000A0 :10C0A0000000000000000000000000000000000090 :10C0B0000000000000000000000000000000000080 @@ -44057,7 +44057,7 @@ :10C0D0000000000000000000000000000000000060 :10C0E0000000000000000000000000000000000050 :10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F +:10C100000000000000000000F0F00000000000004F :10C11000000000000000000000000000000000001F :10C12000000000000000000000000000000000000F :10C1300000000000000000000000000000000000FF @@ -44065,7 +44065,7 @@ :10C1500000000000000000000000000000000000DF :10C1600000000000000000000000000000000000CF :10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF +:10C1800000000000000000000000F0F000000000CF :10C19000000000000000000000000000000000009F :10C1A000000000000000000000000000000000008F :10C1B000000000000000000000000000000000007F @@ -44073,7 +44073,7 @@ :10C1D000000000000000000000000000000000005F :10C1E000000000000000000000000000000000004F :10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E +:10C200000000000000000000000055550000FFFF86 :10C21000000000000000000000000000000000001E :10C22000000000000000000000000000000000000E :10C2300000000000000000000000000000000000FE @@ -44081,100 +44081,100 @@ :10C2500000000000000000000000000000000000DE :10C2600000000000000000000000000000000000CE :10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE +:10C280000000000000000000000000005555000004 :10C29000000000000000000000000000000000009E :10C2A000000000000000000000000000000000008E :10C2B000000000000000000000000000000000007E :10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E +:10C2D000000000400006000C00000000000000000C :10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D +:10C2F0000000000000000000000000000006000C2C +:10C3000000000000000000000000000005002A00FE +:10C31000054000A800000000000000000000000030 :10C32000000000000000000000000000000000000D :10C3300000000000000000000000000000000000FD :10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD +:10C350000000000000005555FFFF00000000000035 :10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD +:10C370000000000000000000000000000000FF00BE +:10C3800000FF0000000000000000000000000000AE :10C39000000000000000000000000000000000009D :10C3A000000000000000000000000000000000008D :10C3B000000000000000000000000000000000007D :10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D +:10C3D00000000000000000005555000000000000B3 :10C3E000000000000000000000000000000000004D :10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C +:10C40000FF0000FF0000000000000000000000002E :10C41000000000000000000000000000000000001C :10C42000000000000000000000000000000000000C :10C4300000000000000000000000000000000000FC :10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC +:10C45000000000000000000000000000F0F00000FC :10C4600000000000000000000000000000000000CC :10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC +:10C480000000FF0000FF00000000000000000000AE :10C49000000000000000000000000000000000009C :10C4A000000000000000000000000000000000008C :10C4B000000000000000000000000000000000007C :10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C +:10C4D0000000000000000000000000000000F0F07C :10C4E000000000000000000000000000000000004C :10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B +:10C5000000000000FF0000FF00000000000000002D :10C51000000000000000000000000000000000001B :10C52000000000000000000000000000000000000B :10C5300000000000000000000000000000000000FB :10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000020000000BB -:10C56000000000002000200000000000000000008B -:10C5700000000000000000000000000000000000BB -:10C58000000000002000200000000000000000006B -:10C59000000000000000000000000000000000009B -:10C5A000000000000000200020000000000000004B -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000200000000000000000004B -:10C5D000000000000000000000000000000040001B +:10C5500000000000000000000000000000000000DB +:10C5600000040004000000000000000000000000C3 +:10C5700000040004000000000000000000000000B3 +:10C5800000000000000000000000000000000000AB +:10C590000004000000020000000000000000000095 +:10C5A000000000000000000001000080000000000A +:10C5B0000000000000040000000000000000000077 +:10C5C000000000000000000000000000000000006B +:10C5D0000000000000004002000000000000000019 :10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000020001B -:10C6000000000000000000000000000000004000EA -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A +:10C5F00000000000000040000000000000004000BB +:10C60000000000000000000000000000000000002A +:10C6100000000000000000004000000000000000DA +:10C6200000000000000000020000020000400000C6 +:10C6300000000000000000004000000000000000BA +:10C6400000000000000200000000000000000000E8 +:10C65000000000004000000000000000001000107A +:10C66000004000000000000000000000000000008A +:10C6700000000000000000000200020000000000B6 +:10C68000000000000008000800000000000000009A +:10C69000020002000200020000000400000000008E +:10C6A0000000100410040084008800000000000056 +:10C6B0000000080000000800000002000200020064 :10C6C0000200000000000000000000000000000068 -:10C6D000000000000000000000000000000000005A -:10C6E00000080084000000000000000000000000BE -:10C6F00000000000000800000088000000000000AA -:10C700000010000000000000000000000000000019 -:10C710000008000000080000000000000000000009 -:10C720000000000800000000000000000000000001 -:10C730000000008800000008000000000000000069 -:10C7400000000010000000000000000000000000D9 -:10C7500000000000000000080000000000000000D1 -:10C7600000000000000300000000000000000000C6 -:10C7700000000000000300000000000000000000B6 +:10C6D0000000000000000000020000000000000058 +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C7200000000000800180010009000500000000F9 +:10C7300000000000000000000000000000000000F9 +:10C740000000000000000000000000000000008465 +:10C7500000100000000000000000000000000000C9 +:10C760000000000000000000000000000000880041 +:10C7700000000000000000000000000000000000B9 :10C7800000000000000000000000000000000000A9 :10C790000000000000000000000000000000000099 :10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 +:10C7B000000000000000000300000000002100084D +:10C7C0000008001000100000000000000008000039 :10C7D0000000000000000000000000000000000059 :10C7E0000000000000000000000000000000000049 :10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 +:10C800000000000000000000050000000000002003 :10C810000000000000000000000000000000000018 :10C820000000000000000000000000000000000008 :10C8300000000000000000000000000000000000F8 :10C8400000000000000000000000000000000000E8 -:10C850000000000000000000410000000000000097 +:10C8500000000000000000000000000000000000D8 :10C8600000000000000000000000000000000000C8 :10C8700000000000000000000000000000000000B8 :10C8800000000000000000000000000000000000A8 @@ -44182,7 +44182,7 @@ :10C8A0000000000000000000000000000000000088 :10C8B0000000000000000000000000000000000078 :10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 +:10C8D00000000000000000009004000000000000C4 :10C8E0000000000000000000000000000000000048 :10C8F0000000000000000000000000000000000038 :10C900000000000000000000000000000000000027 @@ -44192,28 +44192,28 @@ :10C9400000000000000000000000000000000000E7 :10C9500000000000000000000000000000000000D7 :10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000800000000AF -:10C98000000000000000000000000008000000009F +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 :10C990000000000000000000000000000000000097 :10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D000000000000000000008000000000000004F -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 +:10C9B00000000000000001000008000800800000E6 +:10C9C000000000000000000000000000000800005F +:10C9D0000000000000000000000000000000000057 +:10C9E00000000000000003000000000000C0000084 +:10C9F00000000084000000000000000000000000B3 :10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 +:10CA10000000000000000000000000000084000092 +:10CA20000000000000000000000000000000008482 +:10CA300000000000000000000200000000000040B4 :10CA400000000000000000000000000000000000E6 :10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000010B6 -:10CA700000000000000000000000000000000000B6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000020000B4 :10CA800000000000000000000000000000000000A6 :10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000000000066 +:10CAA0000000000000000002000004000000000080 +:10CAB0000000000000000000000200210021002111 +:10CAC00000A10000000000000000000000000000C5 :10CAD0000000000000000000000000000000000056 :10CAE0000000000000000000000000000000000046 :10CAF0000000000000000000000000000000000036 @@ -44221,7 +44221,7 @@ :10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 :10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 +:10CB400000000020000000000000000000000000C5 :10CB500000000000000000000000000000000000D5 :10CB600000000000000000000000000000000000C5 :10CB700000000000000000000000000000000000B5 @@ -44229,22 +44229,22 @@ :10CB90000000000000000000000000000000000095 :10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 +:10CBC00000900000000000000000000000000000D5 :10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 :10CBF0000000000000000000000000000000000035 :10CC00000000000000000000000000000000000024 :10CC10000000000000000000000000000000000014 :10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 +:10CC300000000000000000000000000000000002F2 +:10CC40000000008000000000000000000000000064 :10CC500000000000000000000000000000000000D4 :10CC600000000000000000000000000000000000C4 :10CC700000000000000000000000000000000000B4 :10CC800000000000000000000000000000000000A4 :10CC90000000000000000000000000000000000094 :10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 +:10CCB0000000000000000000000000090000000962 :10CCC0000000000000000000000000000000000064 :10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 @@ -44253,7 +44253,7 @@ :10CD10000000000000000000000000000000000013 :10CD20000000000000000000000000000000000003 :10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 +:10CD400000000000880000080000008800000000CB :10CD500000000000000000000000000000000000D3 :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 @@ -44261,7 +44261,7 @@ :10CD90000000000000000000000000000000000093 :10CDA0000000000000000000000000000000000083 :10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 +:10CDC000080000000000000000009090000000003B :10CDD0000000000000000000000000000000000053 :10CDE0000000000000000000000000000000000043 :10CDF0000000000000000000000000000000000033 @@ -44269,7 +44269,7 @@ :10CE10000000000000000000000000000000000012 :10CE20000000000000000000000000000000000002 :10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 +:10CE400000028000000009002000000000800000B7 :10CE500000000000000000000000000000000000D2 :10CE600000000000000000000000000000000000C2 :10CE700000000000000000000000000000000000B2 @@ -44277,7 +44277,7 @@ :10CE90000000000000000000000000000000000092 :10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 +:10CEC00000000005000011000011001180000000AA :10CED0000000000000000000000000000000000052 :10CEE0000000000000000000000000000000000042 :10CEF0000000000000000000000000000000000032 @@ -44285,7 +44285,7 @@ :10CF10000000000000000000000000000000000011 :10CF20000000000000000000000000000000000001 :10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 +:10CF400000000000000000000000000000012000C0 :10CF500000000000000000000000000000000000D1 :10CF600000000000000000000000000000000000C1 :10CF700000000000000000000000000000000000B1 @@ -44293,8 +44293,8 @@ :10CF90000000000000000000000000000000000091 :10CFA0000000000000000000000000000000000081 :10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 +:10CFC000000000000000810043E00022000000009B +:10CFD000000007000000000000000000000000004A :10CFE0000000000000000000000000000000000041 :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 @@ -44302,7 +44302,7 @@ :10D020000000000000000000000000000000000000 :10D0300000000000000000000000000000000000F0 :10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 +:10D050000000FF000000FF000000000000000000D2 :10D0600000000000000000000000000000000000C0 :10D0700000000000000000000000000000000000B0 :10D0800000000000000000000000000000000000A0 @@ -44310,7 +44310,7 @@ :10D0A0000000000000000000000000000000000080 :10D0B0000000000000000000000000000000000070 :10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 +:10D0D00000000000FF000000FF0000000000000052 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 :10D10000000000000000000000000000000000001F @@ -44326,7 +44326,7 @@ :10D1A000000000000000000000000000000000007F :10D1B000000000000000000000000000000000006F :10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F +:10D1D00000000000000000FF00003C3C00000000D8 :10D1E000000000000000000000000000000000003F :10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E @@ -44334,7 +44334,7 @@ :10D2200000000000000000000000000000000000FE :10D2300000000000000000000000000000000000EE :10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE +:10D25000000000000000000000FF00003C3C000057 :10D2600000000000000000000000000000000000BE :10D2700000000000000000000000000000000000AE :10D28000000000000000000000000000000000009E @@ -44342,15 +44342,15 @@ :10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E :10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E +:10D2D000000000040006800E200015002A00054012 +:10D2E00000A8000000000000000000000000000096 :10D2F000000000000000000000000000000000002E :10D30000000000000000000000000000000000001D :10D31000000000000000000000000000000000000D :10D3200000000000000000000000000000000000FD :10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD +:10D350000000000000000F0F3C3C00000000000037 :10D3600000000000000000000000000000000000BD :10D3700000000000000000000000000000000000AD :10D38000000000000000000000000000000000009D @@ -44358,7 +44358,7 @@ :10D3A000000000000000000000000000000000007D :10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D +:10D3D00000000000000000000F0F3C3C00000000B7 :10D3E000000000000000000000000000000000003D :10D3F000000000000000000000000000000000002D :10D40000000000000000000000000000000000001C @@ -44366,7 +44366,7 @@ :10D4200000000000000000000000000000000000FC :10D4300000000000000000000000000000000000EC :10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC +:10D45000000000000000000000003C3CAAAA000000 :10D4600000000000000000000000000000000000BC :10D4700000000000000000000000000000000000AC :10D48000000000000000000000000000000000009C @@ -44374,56 +44374,56 @@ :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C +:10D4D0000000000000000000000000003C3CAAAA80 :10D4E000000000000000000000000000000000003C :10D4F000000000000000000000000000000000002C :10D50000000000000000000000000000000000001B :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB -:10D5300004000000000000000000000000000000E7 +:10D5300000000000000000000000000000000000EB :10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB +:10D5500000000000000000000000000400000000C7 :10D5600000000000000000000000000000000000BB :10D5700000000000000000000000000000000000AB :10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B +:10D590000000000000000000000200004000000049 +:10D5A000000000004000000000000000000000003B +:10D5B000000000000000410000000000000000002A :10D5C000000000000000000000000000000000005B -:10D5D000000020000000000000000000000000002B -:10D5E00000000000000000000040000000000000FB +:10D5D000000000000000000000000000000000004B +:10D5E00000000002000000000000000000004000F9 :10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A +:10D600000002000000000000000000000000000018 :10D61000000000000000000000000000000000000A -:10D6200000000010000000000000000000000000EA -:10D6300000000000004000000000000000000000AA -:10D6400000000010000000000000000000000000CA +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA :10D6600000000000000000000000000000000000BA :10D6700000000000000000000000000000000000AA -:10D68000000000000010000000000000000000008A -:10D6900000000000001000000084000000000008EE -:10D6A0000000000000040000000800000000000866 -:10D6B0000000000000080008008400000000008452 -:10D6C00000000000000000000084000000000008CE -:10D6D000000000000008000800000000000000003A -:10D6E00000000000000000000084000000000000B6 -:10D6F000000800000000001000080000000000000A -:10D700000000000000000000001000000000000009 -:10D7100000080000000000000040000000000000C1 -:10D7200000000000000000000000002100000000D8 -:10D7300000000000000000000000000300000000E6 -:10D7400000000000000000000000000300000000D6 -:10D7500000050000000000000000000000030000C1 +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D740000000000000000000000000000000880051 +:10D7500000000000000000000000000000000000C9 :10D7600000000000000000000000000000000000B9 -:10D770000000000000000000000000100000000099 +:10D7700000000000000000000000000000000000A9 :10D780000000000000000000000000000000000099 :10D790000000000000000000000000000000000089 :10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 +:10D7B0000000000000000000000000000000100059 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 +:10D7E0000000000000000400000000000000000035 :10D7F0000000000000000000000000000000000029 :10D800000000000000000000000000000000000018 :10D810000000000000000000000000000000000008 @@ -44431,11 +44431,11 @@ :10D8300000000000000000000000000000000000E8 :10D8400000000000000000000000000000000000D8 :10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 +:10D8600000001000000000000000000000000000A8 :10D8700000000000000000000000000000000000A8 :10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000001068 +:10D890000000000000002000200000000000000048 +:10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 :10D8C0000000000000000000000000000000000058 :10D8D0000000000000000000000000000000000048 @@ -44446,25 +44446,25 @@ :10D9200000000000000000000000000000000000F7 :10D9300000000000000000000000000000000000E7 :10D9400000000000000000000000000000000000D7 -:10D9500000080000000000000000000000000000BF -:10D9600000100000000000000000000000000000A7 -:10D97000000000080000000000000000000000009F +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 :10D990000000000000000000000000000000000087 :10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 +:10D9B000000000000800000000000000000000005F :10D9C0000000000000000000000000000000000057 :10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000000037 -:10D9F0000000000000000000000000000000000027 +:10D9E00000000000000000000000000000000084B3 +:10D9F0000000000000000000030000000020000004 :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 -:10DA200000000000000000080000000000000000EE +:10DA200000000000000000000000000000000000F6 :10DA300000000000000000000000000000000000E6 :10DA400000000000000000000000000000000000D6 :10DA500000000000000000000000000000000000C6 -:10DA60000000000000400000000000000000000076 -:10DA700000000000000000000000000000000000A6 +:10DA600000000000000000000000000000000000B6 +:10DA70000000000000000000001100000000000095 :10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 :10DAA0000000000000000000000000000000000076 @@ -44622,49 +44622,49 @@ :10E4200000000000000000000000000000000000EC :10E4300000000000000000000000000000000000DC :10E4400000000000000000000000000000000000CC -:10E4500000000000000000000000000000040000B8 -:10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C +:10E4500000000000000000000000000400000000B8 +:10E4600000000000000000000000000400040000A4 +:10E470000000000000000000000000040004000094 :10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000007C +:10E490000000000000000000000000000004000078 :10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C +:10E4B0000000000000000000000000000000000458 :10E4C000000000000000000000000000000000004C -:10E4D000000000000000000000000000000000003C -:10E4E000000000000000000000000000000000002C -:10E4F00000000000000000004000000000000000DC -:10E50000000000000000000000000000000000000B -:10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB +:10E4D000000000020000000000000000000000003A +:10E4E00020000000000000004000000200000000CA +:10E4F000000000000000000000000000000000001C +:10E5000040000000000000000000000000000000CB +:10E5100000000000000000000000000000000002F9 +:10E5200000004000000000000000000000000000AB +:10E53000000000000000000000000000000040009B :10E5400000000000000000000000000000000000CB :10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E59000000000000000000000000000000000007B +:10E56000000000000000000000000000000000109B +:10E57000001000000000000000000000000000008B +:10E58000000000000000000000000800080000106B +:10E59000001000000000000000000000000000006B :10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C000000000000000000000000000000000004B -:10E5D00000000000000000000000008800000000B3 -:10E5E0000000000000000000000000080000000023 +:10E5B0000000000000000000000000000000000853 +:10E5C0000008000000000000000000000000000043 +:10E5D000000000000000000000000000000000003B +:10E5E0000002000000000000000000000000000029 :10E5F000000000000000000000000000000000001B -:10E600000000000000000000000000080000000002 +:10E60000000000000000000000000000000000000A :10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000080000E2 +:10E6200000000000000000000000000000000000EA :10E6300000000000000000000000000000000000DA -:10E6400000000000000000000000000000100000BA +:10E6400000000000000000000000000000000000CA :10E6500000000000000000000000000000000000BA :10E6600000000000000000000000000000000000AA :10E67000000000000000000000000000000000009A :10E68000000000000000000000000000000000008A :10E69000000000000000000000000000000000007A -:10E6A000000000000000000000000000000000006A +:10E6A000000000000000000000004000000000002A :10E6B000000000000000000000000000000000005A :10E6C000000000000000000000000000000000004A :10E6D000000000000000000000000000000000003A :10E6E000000000000000000000000000000000002A -:10E6F000000000000000000000000000000000001A +:10E6F0000000040000000000000000000000000016 :10E700000000000000000000000000000000000009 :10E7100000000000000000000000000000000000F9 :10E7200000000000000000000000000000000000E9 @@ -44686,7 +44686,7 @@ :10E8200000000000000000000000000000000000E8 :10E8300000000000000000000000000000000000D8 :10E8400000000000000000000000000000000000C8 -:10E8500000000000000000000000000000000000B8 +:10E850000000000020000000000000000000000098 :10E8600000000000000000000000000000000000A8 :10E870000000000000000000000000000000000098 :10E880000000000000000000000000000000000088 @@ -44698,7 +44698,7 @@ :10E8E0000000000000000000000000000000000028 :10E8F0000000000000000000000000000000000018 :10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 +:10E9100000000900000000000000000000000000EE :10E9200000000000000000000000000000000000E7 :10E9300000000000000000000000000000000000D7 :10E9400000000000000000000000000000000000C7 @@ -44875,46 +44875,46 @@ :10F3F000000000000000000000000000000000000D :10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC -:10F4200000000000000000000004000000000000D8 +:10F4200000000000000000000000000000000000DC :10F4300000000000000000000000000000000000CC :10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C +:10F460000000000000040000000000000000000098 :10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000000007C -:10F49000000000000000000000000000000000006C -:10F4A000000000000000000000000000000000005C +:10F48000000000000000000000000000000040003C +:10F4900000000000000000000000000000A00000CC +:10F4A000100000000000000000000000000000004C :10F4B000000000000000000000000000000000004C -:10F4C000000000000000000000000000000000003C -:10F4D00000000000400000000000000000000000EC +:10F4C000100000000000000000000000000000002C +:10F4D00000000000000000004000000000000000EC :10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C +:10F4F000000000000000000000000002000000000A :10F5000000000000000000000000000000000000FB -:10F5100000000000000000000000000000000010DB +:10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB :10F5300000000000000000000000000000000000CB :10F5400000000000000000000000000000000000BB :10F5500000000000000000000000000000000000AB -:10F56000000000000000000000000000000000108B -:10F57000000000000000000000000000000000107B +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B :10F58000000000000000000000000000000000007B -:10F59000000000000000000000000000000000006B -:10F5A0000008000000000000000000000000001043 -:10F5B000000800000000000000080000000000003B +:10F5900084000000000000000000000000000000E7 +:10F5A0000008000000000000000000000000000053 +:10F5B000000000000000000000000000000000004B :10F5C0000008000000000000000000000000000033 -:10F5D000000800000000000000000084000000009F +:10F5D000000000000000000000000000000000002B :10F5E0000000000800000000000000000000000013 -:10F5F0000000008400000000000000000000000087 -:10F600000000008400000000000000000000000076 -:10F6100000000008000000000000000000000000E2 +:10F5F000000000000000000000000000000000000B +:10F6000000000008000000000000000000000000F2 +:10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA :10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA :10F6500000000000000000000000000000000000AA -:10F660000000000000000000000000000005000095 +:10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A -:10F680000000000000080000000000000000000072 -:10F69000000000000010000000000000000000005A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A :10F6B000000000000000000000000000000000004A :10F6C000000000000000000000000000000000003A @@ -44922,7 +44922,7 @@ :10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A :10F7000000000000000000000000000000000000F9 -:10F7100000000000000000000000000000000000E9 +:10F7100000000000000000000800000000000000E1 :10F7200000000000000000000000000000000000D9 :10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 @@ -44938,8 +44938,8 @@ :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 :10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 -:10F8200000000008000000000000000000000000D0 +:10F8100000000200000000000000000000000000E6 +:10F8200000000000000000000000000000000000D8 :10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 @@ -44949,7 +44949,7 @@ :10F890000000000000000000000000000000000068 :10F8A0000000000000000000000000000000000058 :10F8B0000000000000000000000000000000000048 -:10F8C0000000000000000000000000000000000038 +:10F8C0000000000000000000000000000000110027 :10F8D0000000000000000000000000000000000028 :10F8E0000000000000000000000000000000000018 :10F8F0000000000000000000000000000000000008 @@ -44961,7 +44961,7 @@ :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 -:10F98000000800000000000000000000000000006F +:10F980000000000000000000000000000000000077 :10F990000000000000000000000000000000000067 :10F9A0000000000000000000000000000000000057 :10F9B0000000000000000000000000000000000047 @@ -45119,44 +45119,44 @@ :1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD -:10035000000000000000000000000000000000009D -:100360000000000000000004000000000000000089 -:10037000000000000000000000000000000000007D -:10038000000000000000000000000000000000006D +:100350000000000000040000000000000000000099 +:100360000000000000040000000000000000000089 +:100370000000000000040004000000000000000075 +:100380000000000000040004000100000000000064 :10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D +:1003A0000000000000000204000000000000000047 :1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E00000004000000000000000000000000000CD -:1003F00000000000000000000000000000000000FD -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC +:1003C0000000000000000000000400020000000027 +:1003D00000004000000000000000000000000000DD +:1003E00000000000000000000000400000000000CD +:1003F00000000000000000000000000200000000FB +:1004000000000000000000000000000040000000AC +:1004100000000000000000000000000200000000DA +:10042000000000000000000040000000000000008C +:1004300000000000000000000002000000000000BA :1004400000000000000000000000000000000000AC -:10045000000000000000000000000000000000009C -:10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C -:10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B000000000000000000000000000000000003C -:1004C000000000000000000000000000000000002C -:1004D000000000000000000000000000000000001C +:10045000000000000000000000100010000000007C +:100460000000000000000000000000000200020088 +:10047000000000000000000000100010000000005C +:10048000000000000200000000000000000000006A +:100490000000000000000200020000000000000058 +:1004A000000000000000000000000000000002004A +:1004B0000200020002000000000000000000000036 +:1004C000000000100010000000000000000000000C +:1004D0000000000004000000000000000000000018 :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB :1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000000AB +:10054000000000000000000000000000200000A0EB :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B +:1005A0000000000004000000000000000000000047 :1005B000000000000000000000000000000000003B :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B @@ -45170,23 +45170,23 @@ :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A -:10068000000000000000000000000000000000006A -:10069000000000000000000000000000000000005A +:1006800001000080000000000000000000000000E9 +:1006900000000040000000400000000000000000DA :1006A000000000000000000000000000000000004A -:1006B00000000000000500000000000000400000F5 +:1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A +:1006D00000000000004000000000000000000000DA :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA -:1007000000000000000000000000000000000000E9 +:1007000000002000000400000000000000000000C5 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 +:100730000040001000100008000000000000000051 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:100780000000000000000000000000000000000069 +:1007700000000000000000000000000000009000E9 +:1007800000800000000000000000000000000000E9 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 @@ -45194,31 +45194,31 @@ :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 -:1008000000000000000000000000000000000000E8 +:1008000000000008000000000000000000000000E0 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 +:100860000000000200000000000000000000000086 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 -:1008C00000000000004000000000000000000000E8 -:1008D0000000000000000000000000000000000018 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000008000000000010 :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 +:1009100000000000000000000200020000000000D3 :1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 +:1009300000000000000000000000000002000000B5 :1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 +:100980000000000000000000010000000000000066 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 @@ -45226,7 +45226,7 @@ :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 +:100A000000000000000000000000110021000000B4 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 @@ -45234,16 +45234,16 @@ :100A50000000000000000000000000000000000096 :100A60000000000000000000000000000000000086 :100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 +:100A8000000000000000000000000000004109001C +:100A90000003000000000000000000000000000053 :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 :100AC0000000000000000000000000000000000026 :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 +:100B000000000000000000000000000000000001E4 +:100B100001000000000000000000000000000000D4 :100B200000000000000000000000000000000000C5 :100B300000000000000000000000000000000000B5 :100B400000000000000000000000000000000000A5 @@ -45251,7 +45251,7 @@ :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 +:100B900000008800000000000000000000000000CD :100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 @@ -45259,7 +45259,7 @@ :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 +:100C100000000000000000002000000000000000B4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 @@ -45267,7 +45267,7 @@ :100C60000000000000000000000000000000000084 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 +:100C90000000000000000011000000000000000043 :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 @@ -45275,7 +45275,7 @@ :100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 +:100D100000000000000000000001000000000000D2 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 :100D400000000000000000000000000000000000A3 @@ -45283,7 +45283,7 @@ :100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 +:100D90000000000000000000000000E000008100F2 :100DA0000000000000000000000000000000000043 :100DB0000000000000000000000000000000000033 :100DC0000000000000000000000000000000000023 @@ -45332,7 +45332,7 @@ :101070000000000000000000000000000000000070 :101080000000000000000000000000000000000060 :101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 +:1010A0000000000000600006000C000000000000CE :1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 :1010D0000000000000000000000000000000000010 @@ -45340,7 +45340,7 @@ :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF :1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF +:1011200000000000000000000000FFFF00000000C1 :1011300000000000000000000000000000000000AF :10114000000000000000000000000000000000009F :10115000000000000000000000000000000000008F @@ -45356,7 +45356,7 @@ :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE :1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000000BE +:101220000000000000000000000000000000F0F0DE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E @@ -45365,7 +45365,7 @@ :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E -:1012B000000000000000000000000000000000002E +:1012B000F0F000000000000000000000000000004E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E :1012E00000000000000000000000000000000000FE @@ -45373,34 +45373,34 @@ :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD :1013200000000000000000000000000000000000BD -:1013300000000004000000000000000000000000A9 -:10134000000000000000000000000000000000009D +:1013300000000000000000000000000000000200AB +:10134000000000000000000100000000000000009C :10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D +:101360000000000000000000000000000000000479 :10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D +:101380000000000000000000000000000004000059 :10139000000000000000000000000000000000004D :1013A000000000000000000000000000000000003D -:1013B00000000000000000000000000040000000ED -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED +:1013B000000000000000000000000000000000002D +:1013C000C00000000000000000000000000000005D +:1013D00000400000000000020000000000000000CB +:1013E00000200000000000000000000000000000DD +:1013F00000000000000200000000000000000000EB :1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C +:10145000000000000000000000000000200020004C +:101460002005000400000000000000000000000053 :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C -:101490000000000000000000000800000000000044 -:1014A0000000000000000000000800000000000034 -:1014B0000000000000000000000800000000000024 -:1014C0000000000000000000000800000000000014 -:1014D00000000000000000000000001000000000FC -:1014E00000000000000000000000001000000000EC +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000080008C +:1014E00080008000000100000000000000000000FB :1014F00000000000000000000000000000000000EC :1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB @@ -45409,11 +45409,11 @@ :10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B :10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B +:101570000000000000030000000000000000000068 :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B +:1015B00000000000000041000000000000000000EA :1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB @@ -45422,48 +45422,48 @@ :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA :1016300000000000000000000000000000000000AA -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A +:101640000000000000000000000000090000000091 +:101650000100000000000000000000000000000089 +:101660000000000000000005000000000000000075 :10167000000000000000000000000000000000006A :10168000000000000000000000000000000000005A :10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A :1016C000000000000000000000000000000000001A -:1016D000000000000000000000000000000000000A +:1016D0000000040000000000000000000000000006 :1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA :1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 +:101720000000000000000000000000000000900029 :1017300000000000000000000000000000000000A9 -:101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 +:101740000000000000009000000000000000000009 +:101750000000002000000000000000000000000069 :101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 +:101780000000000300000000001000000000000046 :101790000000000000000000000000000000000049 :1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 +:1017B000000000000000000000000000000000C069 +:1017C0000000000000840000000000000000000095 +:1017D0000000000000010000000000000000000008 :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 :1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 :1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 +:101840000000000000000000000000000000000296 :101850000000000000000000000000000000000088 :101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 +:10187000000000000000000900000000000000005F :101880000000000000000000000000000000000058 :101890000000000000000000000000000000000048 :1018A0000000000000000000000000000000000038 :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 +:1018D00000000000000011000000000000000000F7 :1018E00000000000000000000000000000000000F8 :1018F00000000000000000000000000000000000E8 :1019000000000000000000000000000000000000D7 @@ -45471,7 +45471,7 @@ :1019200000000000000000000000000000000000B7 :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 +:1019500000000000000000009000000000000000F7 :101960000000000000000000000000000000000077 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 @@ -45479,48 +45479,48 @@ :1019A0000000000000000000000000000000000037 :1019B0000000000000000000000000000000000027 :1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 +:1019D0000000000000000000110080000000000076 :1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 +:1019F00000000000000002000000000000000000E5 :101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 :101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 :101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 +:101A50000000000000000000000000000080000006 +:101A600000800000000000000000000000000000F6 +:101A70000000000000210000004100000000000004 :101A80000000000000000000000000000000000056 :101A90000000000000000000000000000000000046 :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 +:101AD00000000000000000000000000000000020E6 +:101AE00000000002000000000000000000000000F4 +:101AF00000000000000000000004000100040000DD :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 +:101B50000000000000000000000000000000010084 +:101B60000088880000000000000000000000000065 +:101B70000000000000000000000004000000000061 :101B80000000000000000000000000000000000055 :101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 +:101BE0004100008000000000000000000000000034 :101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 +:101C000004000000000000000000000000000000D0 :101C100000000000000000000000000000000000C4 :101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 :101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 +:101C600000000011000000800000000000000000E3 :101C70000000000000000000000000000000000064 :101C80000000000000000000000000000000000054 :101C90000000000000000000000000000000000044 @@ -45528,7 +45528,7 @@ :101CB0000000000000000000000000000000000024 :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 +:101CE00000000000000100000040000000000000B3 :101CF00000000000000000000000000000000000E4 :101D000000000000000000000000000000000000D3 :101D100000000000000000000000000000000000C3 @@ -45536,15 +45536,15 @@ :101D300000000000000000000000000000000000A3 :101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 +:101D600000000000000000000000070082000000EA :101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 +:101D800000000020000000410000000000000000F2 :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 :101DB0000000000000000000000000000000000023 :101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 +:101DE000000000000000000000000000F0F0000013 :101DF00000000000000000000000000000000000E3 :101E000000000000000000000000000000000000D2 :101E100000000000000000000000000000000000C2 @@ -45552,7 +45552,7 @@ :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 +:101E60000000000000000000000000000000F0F092 :101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 @@ -45561,7 +45561,7 @@ :101EC0000000000000000000000000000000000012 :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 +:101EF0000000FFFF000000000000000000000000E4 :101F000000000000000000000000000000000000D1 :101F100000000000000000000000000000000000C1 :101F200000000000000000000000000000000000B1 @@ -45577,8 +45577,8 @@ :101FC0000000000000000000000000000000000011 :101FD0000000000000000000000000000000000001 :101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 +:101FF00005000A00054000A80000000000000000E5 +:102000000000000000000000000000610007000D5B :1020100000000000000000000000000000000000C0 :1020200000000000000000000000000000000000B0 :1020300000000000000000000000000000000000A0 @@ -45615,185 +45615,185 @@ :1022200000000000000000000000000000000000AE :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E -:10227000000200000000000000000000000000005C -:10228000000000010000000000000000000000004D -:10229000000000000000000000000000000000003E +:1022500000000000000000000000008000000002FC +:10226000000000000000000000000000000000046A +:10227000000000000000000000000000000000025C +:10228000000200010000000000000000000000004B +:102290000008000400000000000000000000000032 :1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C00000000000000000000000000040000000CE -:1022D00000000000000000000000000000000000FE +:1022B000000200000000000000000000000000001C +:1022C000000000000000000200000000000000000C +:1022D00000080000400000000000000000080002AC :1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE +:1022F000000000004000000000000000000000009E :1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD +:10231000000040400000000000000000000000003D :1023200000000000000000000000000000000000AD :10233000000000000000000000000000000000009D -:10234000000000000000008001800080008000800C +:10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D -:10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D +:10236000000008000800000000000000000000005D +:10237000000000000000000000000000000002005B +:10238000020000000000000000000000000000004B :10239000000000000000000000000000000000003D -:1023A00000000000000000410000000000000000EC +:1023A000000000000000000000000000001000100D :1023B000000000000000000000000000000000001D -:1023C000000000000000000000400240004000400B -:1023D00000400000000000080000000000000000B5 -:1023E00000000000000000080000000000000000E5 -:1023F00000000082000000840000000000000000D7 -:1024000000000000000000020000000000000000CA +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000400F9 +:1023E00000000000000000000000000000000000ED +:1023F00000000000000200000000000000000000DB +:1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC -:1024200000000000000000000002000000000000AA -:10243000000000000000000000000000000000009C -:102440000000000000000000000000000004000088 -:10245000000000000040000000000000000000003C +:1024200000000000000000000000000000000000AC +:102430000000000000000004000000000000000098 +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C :10246000000000000000000000000000000000006C :10247000000000000000000000000000000000005C -:102480000000000000000000000800000000000044 +:10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C :1024A000000000000000000000000000000000002C :1024B000000000000000000000000000000000001C -:1024C000000000000000000000000000008200008A -:1024D0000000008200000001000000000000000079 +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC :1024E00000000000000000000000000000000000EC :1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB :10253000000000000000000000000000000000009B -:10254000000000000000000000000000000011007A -:102550000000010001020040004000400040000077 -:10256000000000000000000000000000000000006B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:1025600000000000000000000000010000800000EA :10257000000000000000000000000000000000005B :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B :1025B000000000000000000000000000000000001B :1025C000000000000000000000000000000000000B -:1025D0008200000002000200000100090001000169 -:1025E00000000000000000000000000000000000EB +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000020000004C7 :1025F00000000000000000000000000000000000DB :1026000000000000000000000000000000000000CA :1026100000000000000000000000000000000000BA :1026200000000000000000000000000000000000AA :10263000000000000000000000000000000000009A :10264000000000000000000000000000000000008A -:1026500000000000100000002000004000000040CA -:10266000004000000000000000000000000000002A +:10265000200000000000000000000000000000005A +:102660000000000000000000900000008400000056 :10267000000000000000000000000000000000005A :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A :1026A000000000000000000000000000000000002A :1026B000000000000000000000000000000000001A :1026C000000000000000000000000000000000000A -:1026D00000000000000080000000800000010000F9 -:1026E00000010001000000000000000000000000E8 -:1026F00000000000000000000000000000000000DA +:1026D00000000000000000000000000000000000FA +:1026E000000000000090000000000000000000005A +:1026F000000000000000000000000000009000004A :1027000000000000000000000000000000000000C9 -:1027100000000000000000000000000000000000B9 +:102710000000008400000000000000000000000035 :1027200000000000000000000000000000000000A9 :102730000000000000000000000000000000000099 :102740000000000000000000000000000000000089 -:102750000000000000000004000000000000000075 +:102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 :102770000000000000000000000000000000000059 :102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 +:102790000000000000000000000000000000000237 :1027A0000000000000000000000000000000000029 :1027B0000000000000000000000000000000000019 :1027C0000000000000000000000000000000000009 -:1027D00000000000000000000001000000000000F8 +:1027D00000000000000000000000000000000000F9 :1027E00000000000000000000000000000000000E9 :1027F00000000000000000000000000000000000D9 :1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000000000000B8 +:10281000008800000000200000000004000000000C :1028200000000000000000000000000000000000A8 -:102830000000000000000000200000000000000078 -:102840002000000000000000000000000000000068 -:102850000000000000000000000000C100001101A5 -:10286000880002C00000000200000000000000001C -:102870000000000000000000000000000000000058 +:102830000000000000000000000000000000000098 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000010000000000000000000000000057 :102880000000000000000000000000000000000048 :102890000000000000000000000000000000000038 :1028A0000000000000000000000000000000000028 :1028B0000000000000000000000000000000000018 :1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000C1110521 -:1028E0008209800580800000008000000000000058 -:1028F00000000000000000000000000000000000D8 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000110021000000000000000000A6 :1029000000000000000000000000000000000000C7 :1029100000000000000000000000000000000000B7 :1029200000000000000000000000000000000000A7 :102930000000000000000000000000000000000097 :102940000000000000000000000000000000000087 -:1029500000000000000000000000000000000280F5 -:1029600008008800C1050000000000008000000091 -:102970000000000000000000000000000000000057 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:10297000000000000000004109000003000000000A :102980000000000000000000000000000000000047 :102990000000000000000000000000000000000037 :1029A0000000000000000000000000000000000027 :1029B0000000000000000000000000000000000017 :1029C0000000000000000000000000000000000007 :1029D00000000000000000000000000000000000F7 -:1029E000018801009000C100000000000000C0004C -:1029F00000000000000000000000000000000000D7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000001010000000000D5 :102A000000000000000000000000000000000000C6 :102A100000000000000000000000000000000000B6 :102A200000000000000000000000000000000000A6 :102A30000000000000000000000000000000000096 :102A40000000000000000000000000000000000086 :102A50000000000000000000000000000000000076 -:102A6000000000010000000082C100000000000022 -:102A700000C0000000000000000000000000000096 +:102A60000000000000000000000000000000000066 +:102A700000000000000000000000000088000000CE :102A80000000000000000000000000000000000046 :102A90000000000000000000000000000000000036 :102AA0000000000000000000000000000000000026 :102AB0000000000000000000000000000000000016 :102AC0000000000000000000000000000000000006 :102AD00000000000000000000000000000000000F6 -:102AE0000000000000020808000080C10000000093 -:102AF0000000008000000000000000000000000056 -:102B000000000000000000000000000000000000C5 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000300000000000000000000000000C2 :102B100000000000000000000000000000000000B5 :102B200000000000000000000000000000000000A5 :102B30000000000000000000000000000000000095 :102B40000000000000000000000000000000000085 :102B50000000000000000000000000000000000075 -:102B6000000000000000C140081180000911800031 +:102B60000000000000000000000000000000000065 :102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 +:102B80000011000000000000000000000000000034 :102B90000000000000000000000000000000000035 :102BA0000000000000000000000000000000000025 :102BB0000000000000000000000000000000000015 :102BC0000000000000000000000000000000000005 :102BD00000000000000000000000000000000000F5 -:102BE0000000000000000000C1000001880001009A -:102BF000C000004000004000000000000000000095 -:102C000000000000000000000000000000000000C4 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000001000000000000000000000000C3 :102C100000000000000000000000000000000000B4 :102C200000000000000000000000000000000000A4 :102C30000000000000000000000000000000000094 :102C40000000000000000000000000000000000084 :102C50000000000000000000000000000000000074 -:102C600000000000000000000000810000E0000003 +:102C60000000000000000000000000000000000064 :102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 +:102C80000000000000E000008100000000000000E3 :102C90000000000000000000000000000000000034 :102CA0000000000000000000000000000000000024 :102CB0000000000000000000000000000000000014 :102CC0000000000000000000000000000000000004 :102CD00000000000000000000000000000000000F4 -:102CE000000000000000000000000000F0F0000004 -:102CF000FFFF00003C3C0000666600000000000092 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 :102D000000000000000000000000000000000000C3 :102D100000000000000000000000000000000000B3 :102D200000000000000000000000000000000000A3 :102D30000000000000000000000000000000000093 :102D40000000000000000000000000000000000083 :102D50000000000000000000000000000000000073 -:102D60000000000000000000000000000000F0F083 -:102D70000000000000003C3C00006666000000000F +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 :102D80000000000000000000000000000000000043 :102D90000000000000000000000000000000000033 :102DA0000000000000000000000000000000000023 @@ -45809,39 +45809,39 @@ :102E40000000000000000000000000000000000082 :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 -:102E7000000000006666000000FF00000F0FFFFF6B -:102E80009999000000000000000000000000000010 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 :102EA0000000000000000000000000000000000022 :102EB0000000000000000000000000000000000012 :102EC0000000000000000000000000000000000002 :102ED00000000000000000000000000000000000F2 :102EE00000000000000000000000000000000000E2 -:102EF0000000000000006666000000FF00000F0FE9 -:102F0000FFFF999900000000000000000000000091 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 :102F100000000000000000000000000000000000B1 :102F200000000000000000000000000000000000A1 :102F30000000000000000000000000000000000091 :102F40000000000000000000000000000000000081 :102F50000000000000000000000000000000000071 :102F60000000000000000000000000000000000061 -:102F70000000000000004082800180209202408218 -:102F8000800000208202000000000000000000001D -:102F90000000000000000000000000000000000031 +:102F70000000000000000000000000000000000051 +:102F800000000000000000000000000000000060E1 +:102F90000006000C0000000000000000000000001F :102FA0000000000000000000000000000000000021 :102FB0000000000000000000000000000000000011 :102FC0000000000000000000000000000000000001 :102FD00000000000000000000000000000000000F1 :102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000002020303C7 +:102FF00000000000000000000000000000000000D1 :1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 +:1030100000000000FFFF00000000000000000000B2 :1030200000000000000000000000000000000000A0 :103030000000000000000000000000000000000090 :103040000000000000000000000000000000000080 :103050000000000000000000000000000000000070 :103060000000000000000000000000000000000060 -:1030700000000000000000000000003C00550202BB +:103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 :103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 @@ -45849,452 +45849,452 @@ :1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 :1030E00000000000000000000000000000000000E0 -:1030F000000000000000000000000000820002024A -:103100008200C0000000000000000000000000007D -:1031100000000000000000000000000000000000AF +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:103110000000000000000000F0F0000000000000CF :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F :10314000000000000000000000000000000000007F :10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F -:1031700000000000000000000000000000008200CD -:1031800002028200C00000000000000000000000F9 -:10319000000000000000000000000000000000002F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:1031900000000000000000000000F0F0000000004F :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF :1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF -:103200000000000000400000040000000400200056 -:10321000000000000000000088000000880000009E -:10322000000000000000000020000000200020003E -:10323000000000000000000000000000000400008A -:10324000000300000000000000002000000020003B -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000100000000000000003D -:10329000000000000000000000000000000000002E -:1032A00000000000000040000000000000000000DE -:1032B000000000000000000000000000000000000E +:10320000000000000000200020000000000000007E +:10321000008000000004000000000000000000002A +:10322000000000000000000000000000000000009E +:10323000008000000000000082000000000000008C +:1032400000010000000000000000000088000000F5 +:10325000000000000000000000002000000000004E +:10326000000000000000000000000000200000003E +:10327000000000000000000000042000000000002A +:10328000000000000000000000000000000000003E +:1032900000000040000000000000000000000000EE +:1032A00000000000000000000000400000000000DE +:1032B00000000008000000000000400000000000C6 :1032C00000000000000000000000000000000000FE :1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE +:1032E000000000000000000000000000000000904E :1032F00000000000000000000000000000000000CE :1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD -:103320000000000000000008000000000080008095 -:103330000080008000880000000000800080008085 -:1033400000800080000000800080008000800080FD -:1033500000800080008000800080008000800000ED -:10336000000000000000004000400040004000401D -:1033700000400000008000400080008000400040CD -:10338000004000400040000000000000000000007D +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000200020004D +:103340002000200000000000000000000800000035 +:10335000000000000000000000410000000000002C +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D -:1033A00000000000000000000000000000000040DD -:1033B0000040004000400040000000080040004085 -:1033C000004000400040000000400040004000403D -:1033D00000400040004000400040004000400040ED -:1033E00000000000000000000001000100010001D9 -:1033F0000001000100000040000100400040000109 -:1034000000010001000100010000000000000000B8 -:103410000000000000000000000800030003000896 -:1034200000210021002100080008002100080008F8 -:1034300000080008000800080000008800000000E4 -:10344000000000000021000000000000000000005B -:103450000000000000000009000000000000000063 +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000080008D +:1033C000800080008000000000000000000000007D +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C :10346000000000000000000000000000000000005C -:103470000008000000000000000000000000000044 +:10347000000000000000000000000000000000004C :10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C +:103490000000000000000000000000000800000024 :1034A000000000000000000000000000000000001C -:1034B00000000000000000000000000000400000CC +:1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC :1034D00000000000000000000000000000000000EC :1034E00000000000000000000000000000000000DC :1034F00000000000000000000000000000000000CC -:10350000000000000000000000000000000000209B -:103510000000000008000400080000000000000097 -:103520001000000000008200000000000000000009 -:1035300082000000008082000021000000000000E6 -:103540008280000008808200080000000000000067 -:103550000000820000000080000000000808000059 -:103560000008820800210080008000808280000026 -:1035700000008200000008000000088082000000B7 -:1035800000000000000000000000000000004000FB -:103590004000400040000000000000000400000067 -:1035A0000000000000000000000000080000000013 -:1035B0000000000000000008000000000000000003 -:1035C00000000040000800080000000000000000AB -:1035D00000000000000000000008000000000000E3 -:1035E00000000000000000000040004000400040DB -:1035F00000080000008800000000000000400000FB -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000008A2 -:103620000040002100080021000800080000000000 -:1036300000000000820000000000000000042000E4 -:1036400002000000820000400004000000040000AE -:10365000000002000000820000408204000082049A -:103660002000000000008200004000000000000474 -:10367000200002000000820000400004000000045E -:10368000200002000000820000408204000082044A -:103690002000000000020000000000000000000008 -:1036A000000000000000000000000000000000001A -:1036B0000000000000000000000000000000000109 -:1036C00080008000000000000001000100000001F7 -:1036D0000000000080000000000000010001000068 -:1036E0000001800000000000000000010000000058 -:1036F00000018000800000000000000100010000C7 -:1037000000018000800000000000000100010000B6 -:103710000001800000000000000000000008000818 -:103720000008002100210000002100050000000029 -:103730000000002100000000000000000000100058 -:103740000000000000000200004000000000100027 -:1037500000082000000000000200004000000000FF -:103760001000000800000000000000400000000001 -:103770001000000000000000020090400000000067 -:103780001000A008000000000200A040000000009F -:103790001000000800000500410000000800400083 -:1037A00003000002400000000000100010000000B4 -:1037B0000000000005000000000003000000000001 -:1037C00080000000000000008000000100000000F8 -:1037D0008000000180000000000080000001000067 -:1037E0000000800000010000000000000001000057 -:1037F00000008000000000000000800000010000C8 -:1038000000008000000100000000800000010000B6 -:103810000000800000010000029000080020081055 -:1038200090080020000208080000000000000000CE +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000001000000000000000000000000009A +:103530000000080000000000000000000000000083 +:10354000010000800000880500000000000000006D +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B +:1035800000000000001000100000000000400000DB +:10359000000000000000000000000000000000002B +:1035A0000000000004000000000000000000000017 +:1035B000000000000000000000000000000000000B +:1035C00000002000000400000000110000000000C6 +:1035D00000000000001000000000000000000000DB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000010AA +:1036100000000000000000000000000000000000AA +:10362000000000000020000000000000000000007A +:1036300000000000000000000000000000009000FA +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A +:1036A000000008000000000100C0000000000084CD +:1036B0000000000000000000000008000000000002 +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000000000000000000000CA +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 +:103730000000000000000000000200000000000087 +:103740000000000000000000000000000000000079 +:103750000000000000000000001100000000000058 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000000000000049 +:103780000000000000000000000000000000000039 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000005000000000000000000D4 +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000090000000000008 :103830000000000000000000000000000000000088 -:1038400010C000000000008800C00004000000005C -:1038500010C1000000000088000000C0000400004B -:10386000000010C100000100008800C0000400003A -:10387000000010C001000100008800C0000400002A -:10388000000010C101000001008800C00004000019 -:10389000000010C10100000100880000008000004D -:1038A0000000000000000000008000000000000098 +:103840000000000000000000010000000000000077 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000011008000000087 :1038B0000000000000000000000000000000000008 -:1038C0000000808000000200008000800080000076 -:1038D000000080C10005020000830000008000801D -:1038E0000000000080C10005080000830080008007 -:1038F0000000000080800300200000800080008025 -:103900000000000080C103050505008300800080E1 -:103910000000000080C10305050500830000009140 -:103920000080808000000091008000800000000086 +:1038C00000000000000000000000110021000000C6 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000000000000000000000B7 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000008017 :103930000000000000000000000000000000000087 -:1039400000000000098040000009C10000000000E4 -:1039500000008000098040000009C1000000000054 -:10396000000000008000098040000009C100000044 -:10397000800000008000098000000509C1000000EF -:10398000000000008000098000000509C10000005F -:10399000000000008000098000000509C100080047 -:1039A00008C0080808C0880088C0880888C00000CF -:1039B0000000000000000000000000000000000007 -:1039C000000000000000894000000001C10000006C -:1039D00000000000C000894000000001C10000009C -:1039E000000000000000C000894000000001C1008C -:1039F000000002000000C000014000000101C140C1 -:103A0000000000000000C000014000000101C140B2 -:103A1000000000000000C000014000000101C140A2 -:103A200003200004C090021011020002C0402010C8 -:103A30000000000000000000000000000000000086 -:103A4000000000000000000000000000000000C1B5 -:103A500000000010000000C000000000000000C1D5 -:103A6000000000000010000000C000000000000086 -:103A700000C100000000000200C0000000000000C3 -:103A800000C100000010000000C0000000000000A5 -:103A900000C100000010000000C000000000000095 -:103AA00000C1C100000080000000410000008080D3 -:103AB0000080000000000000000000000000000086 -:103AC000000000000000000000000011004000099C -:103AD00000C100000080000000800011004041098A -:103AE00000C10000000000800000008000110040C4 -:103AF000410900C1000000000080008000110000AA -:103B0000000900C1000000800000008000110000DA -:103B1000000900C1000000800000008000110000CA -:103B2000000900C1800080000000000080080080C3 -:103B30000080000000000000000000000000000005 -:103B40000000000000000000000000004140A1094A -:103B5000000009038000800000800000C140A1092E -:103B60000000090300008000000000808000C140C8 -:103B7000A109000009038000800000000000410945 -:103B80008009408009038000800000800000C10996 -:103B90008009408009038000800000800000C10986 -:103BA00080094080090308000402900220000800F8 -:103BB00008109010880000000000000000000000C5 -:103BC00000000000000000000000000000000100F4 -:103BD000900100000101C000020000080000C100C7 -:103BE0009001000001010000C00000000008040076 -:103BF000C100900100000101C000020000000000AF -:103C00000101900100400101C00002000008000015 -:103C1000C101900100400101C00002000008000045 -:103C2000C101900100400101000000000000484275 -:103C300000000000000048420000000000000000FA +:10394000000000000000000000000000004109002D +:10395000000300000008000000400000000000001C +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000000000000000000017 +:1039B00000200000000800000000000000000000DF +:1039C00000000000000000000000000000000001F6 +:1039D00001000000000000010000000100000000E4 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000100008888000000000000000000000075 +:103A40000000000000000000000000000000000076 +:103A500000008800000000000000200000000100BD +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB0000000410000800000000000000000000045 +:103AC00000000000000000000000000000000000F6 +:103AD0000000000000000000400000008000000026 +:103AE0004100000000000000000000000000000095 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B300000000000001100000080000000000000F4 +:103B40000000000000000000000000000000000075 +:103B50000000000000000011000000000004000050 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB00000000000000000010000004000000000C4 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000001000000000001E3 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C300000000000000000000000000007008200FB :103C40000000000000000000000000000000000074 -:103C5000600000E000000000000000000000000024 -:103C6000600000E000000000000000000000000014 -:103C70000000600000E00000000000000000000004 -:103C80000000600000E000000000000000000000F4 -:103C90000000600000E000000000000000000000E4 -:103CA0000000600000E00000000004081020220076 -:103CB0000022408010200000096000000000000089 +:103C50000000000000000000000000E00000810003 +:103C6000480002E00000000A000000000000000020 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000F0F024 :103CC00000000000000000000000000000000000F4 -:103CD000000000FF00FF0000AAAA000000FF000093 -:103CE000F0F0000000FF0000AAAA000000003C3C29 -:103CF0000000F0F0000000FF0000AAAA000000FF92 -:103D0000000000FF00FF00FF0000AAAA000000FF63 -:103D10000000F0F0000000FF0000AAAA000000FF71 -:103D20000000F0F0000000FF0000AAAA010240809D -:103D300011000011010204080960000000000000E9 -:103D40000000000000000000000000000000000073 -:103D50000000000000FF00FF0000AAAA000000FF12 -:103D60000000F0F0000000FF0000AAAA0000000020 -:103D70003C3C0000F0F0000000FF0000AAAA000098 -:103D800000FF000000FF00FF00FF0000AAAA0000E3 -:103D900000FF0000F0F0000000FF0000AAAA0000F1 -:103DA00000FF0000F0F0000000FF0000AAAA0410CD -:103DB00001400408010204100140060090000000C8 -:103DC00000000000000000000000000000000000F3 -:103DD0000000000000003C3C00003C3C0000FF00F4 -:103DE0000000FFFF00003C3C00003C3C00000000E5 -:103DF000FF000000FFFF00003C3C00003C3C0000D6 -:103E0000FF000000F0F0FFFF3C3C0000FFFF00005F -:103E1000FF000000FFFF00003C3C0000FFFF00002F -:103E2000FF000000FFFF00003C3C0000FFFF00001F -:103E300008200280102040800820028000060090A8 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D4000F0F0000000000000000000000000000093 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000FFFF00000000000000000000F5 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 :103E40000000000000000000000000000000000072 -:103E500000000000000000003C3C00003C3C000072 -:103E6000FF000000000000003C3C00003C3C000063 -:103E70000000FF000000000000003C3C00003C3C53 -:103E80000000FF000000F0F0FFFF3C3C00000000DD -:103E90000000FF000000000000003C3C00000000AB -:103EA0000000FF000000000000003C3C000000009B -:103EB0000000600000000000100000000000000092 -:103EC00008000000000000000000000000000000EA -:103ED000000000000000000000004042800580203B -:103EE0009202408280000020920240828001802065 -:103EF00092020000408280000020920240828001F5 -:103F00008020920240828000002082024042800590 -:103F10008020920240828000002092024082800134 -:103F20008020920240828000002092024082800124 -:103F3000802092020000000000000000000000004D +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC000000005000A00054000A8000000000000F6 +:103ED00000000000000000000000000000000000E2 +:103EE000000000600006000C000000650006800F66 +:103EF00020000000000000000000000000000000A2 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 :103F40000000000000000000000000000000000071 -:103F500000000000000000000000000055003C00D0 -:103F6000303000F0000000000000000055003C0070 -:103F7000303000F00000000000000000000055009C -:103F80003C00303000F0000000000000000005059B -:103F90000C0C3C3C00FF0000000000000000050588 -:103FA0000C0C3C3C00FF0000000000000000050578 -:103FB0000C0C3C3C00FF0000000000000000000072 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000FFFF00000000000053 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 -:103FD000000000000000000000000000000055008C -:103FE0003C00303000F000000000000000005500F0 -:103FF0003C00303000F00000000000000000000035 -:1040000055003C00303000F00000000000000000CF -:1040100005050C0C0000000000000000000000007E -:1040200005050C0C0000000000000000000000006E -:1040300005050C0C0000000000000000000000005E +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 :104050000000000000000000000000000000000060 -:1040600000000000A0A030300000000000000000B0 -:104070003C3CFF00A0A03030000000000000000029 -:1040800000003C3CFF00A0A0303000000000000019 -:1040900000000000000000AA003C0000000000003A -:1040A00000000C0C0F0000AA003C00000000000003 -:1040B00000000C0C0F0000AA003C000000000000F3 +:10406000000000000000000000000000F0F0000070 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 :1040C00000000000000000000000000000000000F0 :1040D00000000000000000000000000000000000E0 -:1040E000000000000000A0A0303000000000000030 -:1040F000000000000000A0A0303000000000000020 -:104100000000000000000000A0A03030000000000F -:10411000000000000000000000AA003C00000000B9 -:10412000000000000C0C0F0000AA003C0000000082 -:10413000000000000C0C0F0000AA003C0000000072 -:10414000000000000000000000000000200000004F +:1040E0000000000000000000000000000000F0F0F0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:1041400020000000200020002000200000000000CF :10415000000020000000000000000000000000003F -:10416000000000000000000000000000200000002F -:10417000000000000000000000000000000100003E -:10418000000000000000000000000000000020000F -:10419000000000000000000000000000000000001F -:1041A00000000000000000000000000000002000EF -:1041B00000000000000000000000000000000000FF +:10416000000004000000200020002000008000006B +:104170000000200002000000000400000003020014 +:104180000000840020000200200020002000888021 +:104190000000000020002000000000008804200033 +:1041A000000020002000000020002000200020004F +:1041B0000000000020002000000000040000400279 :1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E +:1041D000000000000000000000000000000040009F +:1041E000000000000000000000000000000000408F +:1041F000000000000000000000004000400000003F +:1042000080000000000000008000000000000002AC +:10421000004000000000000000000000000000005E +:10422000000000000000000000000000000200008C :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000045A -:1042600000000000000000800000000000000000CE +:10425000000000000000000000000000000000005E +:10426000020002000000000000000000000000004A :10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:104290000000000000000000000000000000000915 -:1042A0000000000000000009000000000000000005 +:10428000000000000000000000000200020000002A +:10429000000000000000000000000000000000001E +:1042A000000002000000020000000000000000000A :1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000004000000000000000000000000DA -:1042E0000000000000000000000400000000008842 -:1042F0000088000000000000000000000000000036 -:1043000000000000000000000000000000000000AD -:10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:104340000000000000000021020000080000000042 -:10435000000000000000000200000100000000005A +:1042C00000000008000000000000000000000000E6 +:1042D00000080000000000000000000000000000D6 +:1042E00000000008000000000000000000000000C6 +:1042F00000080000000000000000000000000000B6 +:1043000000000000000800000000000000000000A5 +:104310000000000400000000000000000000000099 +:104320000000000000080000000000000000000085 +:10433000000000000010001000000000000000005D +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D :10436000000000000000000000000000000000004D :10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D +:10438000000000000000000000000000010000002C :10439000000000000000000000000000000000001D :1043A000000000000000000000000000000000000D :1043B00000000000000000000000000000000000FD -:1043C000000000000000110011008000110000003A -:1043D0000084000800820088000100000400000042 +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD :1043E00000000000000000000000000000000000CD :1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC +:1044000000000000000000000000000000000400A8 :10441000000000000000000000000000000000009C :10442000000000000000000000000000000000008C :10443000000000000000000000000000000000007C -:10444000000000000000000000000000000020004C -:104450000000000000000000000200000008010051 -:104460000000000000000000000000000000000448 -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000100000001DA -:1044E00020000000000000000000000000000000AC -:1044F00000010000000000000000000000000000BB -:104500000800000000000000000000001000000093 -:1045100000000000000000001000000000C000C00B -:1045200000C000C000C0000000000000000000004B -:10453000000000000000000000000000000000007B -:1045400000000000000000000000000000009000DB -:10455000000000000000000000000000001100004A -:10456000004100000000000000000000000000000A -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:104460000000080008000000000000000800000034 +:1044700008000000820000000000000082000080B0 +:104480008200000000000100000010000000018018 +:104490000100000000000000C1000000000000005A +:1044A00001000000000000000000000000400000CB +:1044B00000400000000000000000000000000000BC +:1044C00000000000000000000800000000000000E4 +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000200000000000C0040000008000000047 +:104510002020020000000000000004000008000845 +:104520000010041000000000000000000000000067 +:104530000000000008000000000000000000000073 +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000002000000000000000000000001B +:104580000020000000000000902000000000A000BB +:1045900000000000100400000000002000000000E7 +:1045A00000000020000000000000000000000000EB :1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000002E9 -:1045D0000500050005000090008805880908000016 -:1045E000000000000000000000000000000000C00B -:1045F000000000000000000000000000000000C0FB -:1046000000000000000000000000000000000000AA -:1046100000C00000000000000000000000000010CA -:10462000000000000000000000000000000000008A +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E0000000000000840000000000000000000047 +:1045F00000000000000000000000000000C0008477 +:104600000000008500000000000000010000000024 +:104610000000000000008001000000000001000018 +:104620000000000000010000000000000000000089 :10463000000000000000000000000000000000007A :10464000000000000000000000000000000000006A :10465000000000000000000000000000000000005A -:104660000000002000090000000000000009000018 -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A +:104660000000000000000000000000000000000248 +:1046700000000000000000000000820000000000B8 +:1046800000000000000000000240000000020000E6 +:104690000000000001000000000000000000000910 :1046A000000000000000000000000000000000000A :1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA -:1046D000000041000000008800000300000003000B +:1046D00000000000000000000000000000000000DA :1046E00000000000000000000000000000000000CA :1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 +:1047000000000000000000000000808200000000A7 +:104710000000000000002000000000000000000079 :104720000000000000000000000000000000000089 :104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000020A020400004820488020082A3 -:1047600000A090C000010000000000010000000057 -:104770000000000000000000010000000000000038 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 +:104740000000000000000000000000C000000000A9 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000009004000000000000900005 +:104790000040000000000100900000400000000008 +:1047A00090200000000000009000000000000000C9 :1047B00000000000000000000000000000000000F9 :1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000008080800080D9 -:1047E000000000000000004100202009000200003D -:1047F00000000000000000000000100000000000A9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:104800000000000000001100808000000000110086 +:1048100080000000000000001100A1000000000066 +:104820001100800000000000110080000000000066 :104830000000000000000000000000000000000078 :104840000000000000000000000000000000000068 -:104850000000000000000000000000850000008053 -:104860000000009080800080000000000000000038 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 :104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 +:104880000000000000000000000000800000008028 +:104890000000008000000080000000080980001077 +:1048A0000000000000800000008000000080000088 :1048B00000000000000000000000000000000000F8 :1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000400082C18820AD -:1048E00082C0840084C1100884C000000000000061 -:1048F0000040000000000000000000000000000078 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:104900000000000000000000000000000020000087 +:1049100000C000000020000000C0000000010102F3 +:104920000001008800000020000000C000000020FE +:104930000000002000000000000000000000000057 :104940000000000000000000000000000000000067 -:10495000000000000000000000000000030400044C -:10496000C08220A083900008C08488A001000000BD -:104970000100010000000000000000000000000035 -:104980000000010000000000000000000000000026 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:10498000000000000000000000000000010000889E +:104990000200010001000088880001000000010001 +:1049A00088880800000001000288880001000100DA +:1049B00000888800000000000000000000000000E7 :1049C00000000000000000000000000000000000E7 -:1049D0000000000000000000000000000000C18096 -:1049E000008080000000C1000080800000004100C5 -:1049F000210008001000000000000000000000007E -:104A00000000000010000000000000000000000096 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A00000000000000000000000000000000410065 +:104A100000808000090041000080000009000000C3 +:104A200041000080800041004100808000000900BA +:104A300041000080000000000000000000000000B5 :104A40000000000000000000000000000000000066 :104A50000000000000000000000000000000000056 -:104A600000100000008800000000000000000000AE -:104A700021110020090000000000000000000000DB +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 +:104A900000110000008000000011000000800000F4 +:104AA00000000011000000804000001100000080A4 +:104AB0000000001100000080000000000000000065 :104AC00000000000000000000000000000000000E6 :104AD00000000000000000000000000000000000D6 -:104AE0000000820140904041A0008200208882881E -:104AF0008200010100000100000000000000000031 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 :104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 +:104B10000000000100000040000000010000004013 +:104B20000000000000010000004000000001000043 +:104B300000400000000100000040000000000000F4 :104B40000000000000000000000000000000000065 :104B50000000000000000000000000000000000055 -:104B600000000000000000000000484200000000BB -:104B700000004842500000E00700840000000000F0 -:104B800000000000500000E00000000000000000F5 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B9000000000000000000007008221000000006B +:104BA000070082210000000000E0070082000000F2 +:104BB00000000700822100000000070082000000C2 :104BC00000000000000000000000000000000000E5 :104BD00000000000000000000000000000000000D5 -:104BE00000000000000020401080A00005002841C7 -:104BF000000028410000000000000000000000004C +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 :104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 +:104C1000000000000000000000000000F0F00000B4 +:104C200000000000F0F00000000000000000F0F0C4 +:104C3000000000000000F0F0000000000000F0F0B4 :104C40000000000000000000000000000000000064 :104C50000000000000000000000000000000000054 -:104C600000000000000000000402080100A0000590 -:104C70000000284100002841000000000000000062 +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 :104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 +:104C90000000000000000000000000000000F0F034 +:104CA000000000000000F0F0000000000000000024 +:104CB000F0F0000000000000F0F000000000000034 +:104CC000F0F0000000000000000000000000000004 :104CD00000000000000000000000000000000000D4 :104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 @@ -46304,275 +46304,275 @@ :104D30000000000000000000000000000000000073 :104D40000000000000000000000000000000000063 :104D50000000000000000000000000000000000053 -:104D600000000000000000000000000000820014AD -:104D700000008214008200140108020400000000F8 +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 :104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 +:104D900000000000000000000000000000FF000014 +:104DA000FFFF00000F0F0000FFFF000000000F0FCB +:104DB0000000FFFF000000FF0000FFFF00000000F8 +:104DC0000000FFFF000000000000000000000000E5 :104DD00000000000000000000000000000000000D3 -:104DE0000000000000000000000000000000820041 -:104DF0001400821400008200140080104020000083 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 :104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 +:104E1000000000000000000000000000000000FF93 +:104E20000000000000000F0F000000000000000064 +:104E30000F0F00000000000000FF00000000000055 :104E40000000000000000000000000000000000062 :104E50000000000000000000000000000000000052 :104E60000000000000000000000000000000000042 -:104E700060000000000010000000000000000800BA -:104E80000561000F800D20A0000000000000000060 -:104E900000610007800D20000000000000000000FD -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 +:104E70000000000000000000000000000000000032 +:104E80000000000000000000000000000000000022 +:104E90000000000000000000000000000000000012 +:104EA00005002A00054000A805002A00054000A8CA +:104EB000000005402A06054C00A805002A00054010 +:104EC00000A805000A00054000A80000000000003E :104ED00000000000000000000000000000000000D2 :104EE00000000000000000000000000000000000C2 :104EF00000000000000000000000000000000000B2 -:104F000000000000F0F000000000000000000000C1 +:104F000000000000000000000000000000000000A1 :104F10000000000000000000000000000000000091 :104F20000000000000000000000000000000000081 -:104F30000000000000000000000000000000000071 +:104F30000000000000003C3CFFFF000000000000FB :104F40000000000000000000000000000000000061 :104F50000000000000000000000000000000000051 :104F60000000000000000000000000000000000041 :104F70000000000000000000000000000000000031 -:104F8000000000000000F0F0000000000000000041 +:104F80000000000000000000000000000000000021 :104F90000000000000000000000000000000000011 :104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 +:104FB00000000000000000003C3C00000000000079 :104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 :104FF00000000000000000000000000000000000B1 -:10500000000000000000FF553C0F00000000000001 +:1050000000000000000000000000000000000000A0 :105010000000000000000000000000000000000090 :105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 +:10503000000000000000000000000000F0F0000090 :105040000000000000000000000000000000000060 :105050000000000000000000000000000000000050 :105060000000000000000000000000000000000040 :105070000000000000000000000000000000000030 -:10508000000000000000000000553C0F0000000080 +:105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 :1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 +:1050B0000000000000000000000000000000F0F010 :1050C00000000000000000000000000000000000E0 :1050D00000000000000000000000000000000000D0 :1050E00000000000000000000000000000000000C0 -:1050F0000000000000000000000000000000200090 -:10510000210000000200000000000000000000007C -:10511000200000000000000000000010000000005F -:10512000A0000000A000000000000000000000003F -:10513000200000000000000000000001000000004E -:105140000000880000000000004000000000000097 -:10515000000020000000000000000000000000002F -:10516000000020000000000000000000000000001F -:10517000000020000000000000000000000000000F -:105180000900020000008000000000000000000094 -:1051900010000000000000000000000000000000FF -:1051A00000000000000000000000000000000000FF +:1050F0000000000000000000000000008800000028 +:10510000000020002000000000000000200000003F +:10511000000000000000000000000000200000046B +:10512000000021002000000000000000000000003E +:10513000000000000000000000000001000000006E +:10514000000000002000200000000000000000001F +:10515000000000000000000000000000000000004F +:10516000000000002000200000000000840000007B +:10517000000000000000000000000000000000002F +:10518000000000000000000000000000000000001F +:1051900000000000400000000000000000000000CF +:1051A00000000000020000000000000000000000FD :1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000100000000DE +:1051C000000000000000000000000040000000009F :1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000080000002000000000000001C +:1051E000000000000000000000900000000000002F +:1051F000000000000000000010000000000000009F +:10520000000000000000000000000000000000009E :10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E +:10522000000000000000000000000000000000047A +:10523000000490040004000082000000000000024E :10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E +:10525000004000400040000000000000000000008E :10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000400008000000000009A -:10529000000000000000000000000000000400000A +:1052700008040804080408040000000000000000FE +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E :1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE +:1052B00000010001000100010000000000000000EA :1052C00000000000000000000000000000000000DE :1052D00000000000000000000000000000000000CE :1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:105300000000040004000300C00004800400C0008A -:10531000020000000000000000000000000000008B +:1052F00000000001000100010001000000000000AA +:10530000000000000000000000000000000000009D +:10531000000000000000000082000000000000000B :10532000000000000000000000000000000000007D :10533000000000000000000000000000000000006D -:10534000000000000000000000000000000000005D -:10535000000000000000000000000000001000102D -:1053600000000000001000210021001000100010BB -:1053700000100010000000100010000000000000ED -:105380000000000080008000840000008040830056 -:10539000110080000000000000000000000000007C +:1053400000000000000000100000000000410041CB +:1053500000410041000000000000000000000000CB +:10536000000000000000000000000000000000003D +:105370009000000000000000000000050000000098 +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D :1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED -:1053C00000000000000000000000000000000000DD -:1053D00000000000000000000000000000000000CD +:1053B000000000C00000000000000000000000002D +:1053C00000000000000000000800000000000000D5 +:1053D000000000004100000000000000000000008C :1053E00000000000000000000000000000000000BD :1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C +:105400000000000000000000000000000800000094 :10541000000000000000000000000000000000008C -:105420000000000000000000000000000800000074 -:1054300008000000000010001000100082001000A2 -:10544000000010001000000010000000100010000C +:10542000000000000000000000000000000000007C +:1054300000000000850000000021000000000000C6 +:10544000000000000000000000000000000000005C :10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C -:1054800000000000000000002100000008000000F3 +:10547000000000000000000000080008000800080C +:10548000000000000000000000000000000000001C :10549000000000000000000000000000000000000C -:1054A00000001000000000000000000000000000EC -:1054B00000000000000400000000000000000000E8 +:1054A00000000000000000000000000000000000FC +:1054B00000000000000004000000000000000000E8 :1054C00000000000000000000000000000000000DC :1054D00000000000000000000000000000000000CC :1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC -:105500000000000000000000000001008380828095 -:1055100002800080008901800180000000000000FE +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B :10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B -:105540000000000010000000000000008200820047 -:10555000000008000000080000000000001000101B -:1055600000000000002100210000000000000000F9 +:10553000000000000000002000000000000000004B +:1055400000000000A000000000000000C0000000FB +:10555000000000000000000000000000000000004B +:10556000000000000000000000000000000000003B :10557000000000000000000000000000000000002B -:1055800000000000000000000000000004000440D3 -:105590000040802021200020022002202100001055 -:1055A000080000840000000000000000000021004E -:1055B00008000000000000000000000000000000E3 -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A00000000000000000000000000000000000FB +:1055B00000000000000000000001000000000000EA +:1055C000000000000084000000C000840000000013 +:1055D000210000840084000000000000008400001E +:1055E0000000000000840000000000000000000037 :1055F00000000000000000000000000000000000AB -:105600000000000000000000000000000000028018 -:105610000800A003000002000000000000000000DD -:105620000000000000000000100000000002000068 +:10560000000000000000000000000000000000009A +:10561000000000000000000000000000000000008A +:10562000000000000000000000000000000000007A :10563000000000000000000000000000000000006A -:1056400000000000000000008200000000000000D8 -:10565000C000A00082000000100000000000000058 -:1056600000000000001000100000000000210021D8 +:105640000800000000000021882100210021000046 +:10565000000900000000000200000000000200023B +:105660000000000000000002000000000000000236 :10567000000000000000000000000000000000002A -:10568000000000000000000000000000000000001A -:1056900080042000030005008500000005000000D4 +:105680000000000000000000000000050000000411 +:10569000000000000000000000000000000000000A :1056A00000000000000000000000000000000000FA -:1056B00000000000050000000000000000000000E5 +:1056B00000000000000000000000000000000000EA :1056C00000000000000000000000000000000000DA :1056D00000000000000000000000000000000000CA :1056E00000000000000000000000000000000000BA :1056F00000000000000000000000000000000000AA :105700000000000000000000000000000000000099 -:10571000000001C00490000490A000C0000000043C -:105720000020000000000000000000000000000059 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:1057500000000000000000000000000004900004B1 -:10576000000810084008008400081008000000002D -:105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 -:1057900000000000118080002080000000800000D8 -:1057A0000080000000000000000000000000000079 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 -:1057D0000000000000000000000000000000800049 -:1057E00000000080008085000000008080800000B4 -:1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000005002100808000000062 -:105820000005800080000000000000000000000073 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:1057300000000000000000000000000090000000D9 +:105740000000000002000000010000000001000055 +:105750000041000000000000000000000000000008 +:105760000000000000000000000000000000000039 +:1057700000000000000000000000000000008400A5 +:105780000000010001000000010000000000000016 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B0000000000000000000000000001100800058 +:1057C00000000000000000000400050000000005CB +:1057D00000000010000000000000000000000000B9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000002000000A7 +:105800008000000003004000000041000000000094 +:105810000000000000000000000000000000000088 +:105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860008000008580800080000000A10040008052 +:1058400000800000000000090000000900000000C6 +:105850000000000000100001000000000000000037 +:105860000000000000000000000000000000000038 :105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000200000008282C00024 -:1058A000400000000400C0000000000000000000F4 +:1058800000000000000000000005000000410000D2 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 :1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000000000000C8 -:1058E0000000020002C0040284C0400004C008841A -:1058F00084C0000000000000000000000000000064 -:105900000000000000000000000000000000000097 -:1059100000000000000000000000C00000409004F3 -:1059200090C0004000A09004A0C000000000000053 +:1058C00000000020000000080000000000000000B0 +:1058D00000000000000000010000000000000000C7 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000010000000096 +:105910000084000000000000000000000000000003 +:105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 -:105940000000000000000000000000000000000057 -:105950000000000000000000010000000000000046 -:105960000000000083400010C01002400920001019 -:10597000C002204000000000000000000000000005 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000008000008007 -:1059A00000808380008000000080008000000000F4 +:10594000000001000088880000000000080000003E +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000C00057 +:105990000000000001000000000000000000000006 +:1059A00000000000000000000000000000000000F7 :1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000020000000000C5 -:1059E0000000000000004100008080808000410035 -:1059F00000808000000000000000000000000000A7 +:1059C0000000000041000080000000000000800096 +:1059D00000000900000000000000000000000000BE +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 :105A00000000000000000000000000000000000096 -:105A100000000000000000000000000000008010F6 -:105A200080088080000080000008800000000000E6 +:105A100080000000210004000000000000000000E1 +:105A20000000000000000000000000000000000076 :105A30000000000000000000000000000000000066 -:105A40000000000000000000000000000000000056 -:105A500000000000000000008000000000000000C6 -:105A600000000000000000000000000000800000B6 +:105A400000000000000000110000008000000000C5 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 :105A80000000000000000000000000000000000016 :105A90000000000000000000000000000000000006 -:105AA000C00020010404C000C00040010440000008 +:105AA00000000000000000000000000000000000F6 :105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000000000D6 -:105AD0000000000000000000000082000020000024 -:105AE000000000000000000000000400400204026A -:105AF00004000200200282080200000000000000F2 +:105AC0000000000000000000000100000040000095 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 :105B10000000000000000000000000000000000085 -:105B20000000000680E00700820000060000070079 +:105B20000000000000000000000000000000000075 :105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 -:105B70000000484200000000000048420000000011 +:105B4000000000000000000000000000000007004E +:105B50008200000000420000000000000048070032 +:105B600048000000000000000000000000000000ED +:105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 -:105BA00000000000F5FF0C0CFF00F000000F0F0FCD -:105BB000F0003C00000000000000000000000000B9 +:105B9000000000000000002000008813000000004A +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE0000000000000000000000000000000600055 -:105BF0000060220000220000812424000024000014 +:105BD000F0F00000000000000000000000000000E5 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 :105C10000000000000000000000000000000000084 -:105C2000000000000000F0FA0C0C0000F000000F73 -:105C30000000F0003C000000000000000000000038 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 :105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 +:105C50000000F0F000000000000000000000000064 :105C60000000000000000000000000000000000034 -:105C70000900000911000011812400008100008149 +:105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 :105C90000000000000000000000000000000000004 -:105CA00000000000000000003F3FF0000000000086 -:105CB0003030505000FF003C0000000000000000A9 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 :105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 +:105CD000000000000000FFFF0000000000000000C6 :105CE00000000000000000000000000000000000B4 -:105CF00000000408010206900000040801024400AC -:105D0000004400000000000000000000000000004F +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 -:105D2000000000000000000000005F5FF000FF00C6 -:105D30003C3C303050500000003C000000000000AF +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 :105D40000000000000000000000000000000000053 :105D50000000000000000000000000000000000043 :105D60000000000000000000000000000000000033 -:105D700000000000102040800000069010204080AD -:105D80008800008800000000000000000000000003 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 -:105DA0000000000000000000000000001069202F2B -:105DB000004D0008100020280040000800000000EE +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF0000000000000006000000000001000000033 -:105E0000000000000800000000000000000000008A -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 +:105DD0000000000005000A00054000A8006100075F +:105DE000000D0000000000000000000000000000A6 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000006121 +:105E20000007000D0000000000000000000000005E :105E30000000000000000000000000000000000062 :105E40000000000000000000000000000000000052 :105E50000000000000000000000000000000000042 @@ -46606,196 +46606,196 @@ :106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 :106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 +:10604000000000000000000000000000000010013F +:10605000000000000143000144A14200C9C0220227 +:1060600001089A101800005849336001D20C000052 :106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 +:106080000000100000000000000000000000000000 :106090000000000000000000000000000000000000 :1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000800000000D8 -:1060C00000000000000000040000020000000000CA -:1060D00000000000000000000020000000000000A0 -:1060E00000000000000000080000000000000000A8 -:1060F000000000000000000000010000000000009F -:10610000000000000000000000000000000000008F -:10611000000000000000000000000000000000007F -:10612000000000000000000000000000000000006F -:10613000000000000000000000000000000000005F -:1061400000000000000000000000000080000000CF -:10615000000000000000000000000001000000003E -:1061600000000000000000000004410000000000EA -:1061700000000000000041000004000000000000DA +:1060B00000000000000000000000000000002000C0 +:1060C00000000000000000000000000000000000D0 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000400000000000000008B +:10611000000000000000000000040000000040003B +:10612000000000000000000000040000000000006B +:10613000000000000000000000000000000200005D +:10614000000000000000000000004000000000000F +:106150000000000000020004000000000000000039 +:1061600000000000000040041000000000000000DB +:106170000000000000000004000400000000000017 :10618000000000000000000000000000000000000F -:1061900000000000000000000000000400000000FB -:1061A00000000000000000000000000000000000EF -:1061B00000000000000000000000000000840080DB -:1061C000000000400000000000800000008000800F -:1061D000008000800080008000800080008400C07B -:1061E00000800080008000800080008000000000AF -:1061F000008000000000000000000000000000001F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000004000000000000EB +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D000000000000000000000400040000000003F +:1061E00000000000000000000000000000000000AF +:1061F000000000000200020000000000000000009B :10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E +:106210000000000010000008000800080000000056 :10622000000000000000000000000000000000006E -:10623000000000000000000000000000000000411D -:106240000040000000010008000000400010004075 -:10625000004000400040004000400040004000413D -:10626000004100400040004000400040004000006D -:10627000000000400000000000000084000000005A +:10623000000000000000000000000000000000005E +:106240000000000000000000000000000008000046 +:10625000000000000000000000000000000000003E +:106260000000000000000000000000000008000026 +:10627000000000000000000000000000000000001E :106280000000000000000000000000000000000806 :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000008E6 -:1062B00000000000000000000000000000000000DE -:1062C000018800050140008800C000080008004067 -:1062D0000000000000400000000000000108000075 -:1062E0000000002100000000000500000000000583 -:1062F00000400020002000200000000000000000FE -:10630000000000000000000000000000000000107D +:1062B00000000000000000820082008200820000D6 +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D :10631000000000000000000000000000000000007D :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D -:1063400000000220000020090340000500000000BA -:106350000001000000000001000000000000020039 -:10636000000000000000000000000000000000002D -:106370000000000100010001100100000000000009 -:1063800000000000000000000000000021000000EC -:1063900005000500000000000010000000000000E3 +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:106360000000000000000000080000000000000025 +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD -:1063C00000000000908010004000000000800000ED -:1063D000400000008200088082000200020002806B -:1063E000080002008300900082008300A0000000EB -:1063F000000000000000008000000000000000001D -:10640000002100000000000000000000000000006B -:10641000000000100000000000000000000000006C -:10642000000000000000000000000000000000006C +:1063C00000000000000000000000000000000000CD +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:106420000000000000000000000400000004000064 :10643000000000000000000000000000000000005C -:1064400000000000000004408482000200084104B3 -:1064500000000000000800000040030080008000F1 -:10646000884000008000028400000000020000005C -:1064700000000300000000000040000000000000D9 +:10644000000000000000000000000000000000004C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C :10648000000000000000000000000000000000000C :1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC -:1064C000000000000000000010008203A000200077 -:1064D0000020000000400040000000000008000014 -:1064E0000000000082000000102182002000202116 -:1064F000820000008200820000000800000000000E -:10650000000000000000000000000000000000008B +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:10650000000000000100000000000000000000008A :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B -:10654000000000000000000000008800080008842F -:1065500080000001080000A1000100000000000010 -:10656000000000000000000000008000000080002B -:10657000800000000000000000000000000000009B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000090000000000F2 +:10654000000000000000000000000000000000004B +:10655000000000000000000000000000000000003B +:10656000000000000000000000000000000000002B +:106570000000000000000000008400000000000097 +:106580000000000000000800000000000000000003 +:1065900000000000000000000000000000000000FB :1065A00000000000000000000000000000000000EB -:1065B00000000000000000000000000000000000DB -:1065C000000000000000000000000000402000402B -:1065D0008209100000400040002100090200000074 -:1065E00000000000A021000008000000A100000041 -:1065F0000221100000408200A04000400020000066 -:1066000000000040000000000021000000008400A5 +:1065B00000000000000000000020000000000000BB +:1065C00000000000000000000000000000000000CB +:1065D00000000000000000000000000000000000BB +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:106600000000000200000000000000000000000088 :10661000000000000000000000000000000000007A :10662000000000000000000000000000000000006A :10663000000000000000000000000000000000005A -:106640000000000000000000000000000000000149 -:106650000091210888000301000103000800A00048 -:1066600000002000080000000000000000000400FE -:106670000000A100A00000010000000100010001D5 -:106680000000030000010000000000000000000006 +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A :1066900000000000000000000000000000000000FA :1066A00000000000000000000000000000000000EA :1066B00000000000000000000000000000000000DA :1066C00000000000000000000000000000000000CA -:1066D00001C100000201000000C000A00000000095 -:1066E00010C000000000000000C000000008000012 -:1066F00000C100000000000100C000020000000016 -:1067000000C0004000400200000000000000000047 +:1066D00000000000000000000000000000000000BA +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 :106710000000000000000000000000000000000079 :106720000000000000000000000000000000000069 :106730000000000000000000000000000000000059 :106740000000000000000000000000000000000049 -:10675000000020C10021090200090080000005009E -:106760000000808000000000000000800000008029 -:10677000000040C1002104400008008000800000AB -:1067800000004080000000008000000000000000C9 +:106750000000000000000000000000000000000039 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 :1067900000000000000000000000000000000000F9 :1067A00000000000000000000000000000000000E9 :1067B00000000000000000000000000000000000D9 :1067C00000000000000000000000000000000000C9 -:1067D00000000000200011000200C10000020000C3 -:1067E00000008000000000400000800000008000E9 -:1067F00000008000400000004000C11000000000C8 -:1068000000008000000080210000800000000000E7 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 :106810000000000000000000000000000000000078 :106820000000000000000000000000000000000068 :106830000000000000000000000000000000000058 :106840000000000000000000000000000000000048 -:1068500000000000000001A000000100C1000001D4 -:1068600000000000C000000000000000C0000000A8 -:1068700010000000C000004000000000C101000046 -:1068800000000000C000400004000000C000000044 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 :1068900000000000000000000000000000000000F8 :1068A00000000000000000000000000000000000E8 :1068B00000000000000000000000000000000000D8 :1068C00000000000000000000000000000000000C8 -:1068D000000000000000000021010000018901C14A -:1068E00000000000000200C008000000000000C01E -:1068F00000000010000000C020000000058800C05B -:1069000000000000000200C040400002004002C041 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 :106910000000000000000000000000000000000077 :106920000000000000000000000000000000000067 :106930000000000000000000000000000000000057 :106940000000000000000000000000000000000047 -:106950000000000000000000000002200009058285 -:1069600009C10500000000800080800000000000D8 -:10697000008000000080000000800300000088808C -:106980000380000000000080008000000080000004 -:1069900080800000000000000000000000000000F7 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 :1069A00000000000000000000000000000000000E7 :1069B00000000000000000000000000000000000D7 :1069C00000000000000000000000000000000000C7 -:1069D000000000000000000000000000418089C0AD -:1069E0000200110080000090000080008000000084 -:1069F000000000008000000000000000C18009824B -:106A00000900000980000080000080008000004133 -:106A100000800000000000000000000000000000F6 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000076 :106A20000000000000000000000000000000000066 :106A30000000000000000000000000000000000056 :106A40000000000000000000000000000000000046 -:106A5000000000000000000000000000000001082D -:106A6000059001000000C000000300000400C00009 -:106A7000000200000000C000000000000200C10889 -:106A8000119100000000C000000200000400C000DE -:106A900040414004400000000000000000000000F1 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 :106AA00000000000000000000000000000000000E6 :106AB00000000000000000000000000000000000D6 :106AC00000000000000000000000000000000000C6 :106AD00000000000000000000000000000000000B6 -:106AE000500A00E007000000600000E0070000001E +:106AE00000000000000000000000000000000000A6 :106AF0000000000000000000000000000000000096 -:106B0000840000E00700000000000000000000001A -:106B10000006000007004200000000000000000026 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 :106B20000000000000000000000000000000000065 :106B30000000000000000000000000000000000055 :106B40000000000000000000000000000000000045 :106B50000000000000000000000000000000000035 -:106B60000000FF00FF00FF0000003C3C0000FF00B1 -:106B70000000FFFF0000666600003C3C0000F0F0F3 -:106B80000000FF000000FF0000003C3C0000FF0090 -:106B9000000000F0003C0030003C0000000000005D +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 :106BA00000000000000000000000000000000000E5 :106BB00000000000000000000000000000000000D5 :106BC00000000000000000000000000000000000C5 :106BD00000000000000000000000000000000000B5 -:106BE00000000000FF00FF00FF0000003C3C000030 -:106BF000FF00000000000000666600003C3C000052 -:106C0000F0F00000FF000000FF0000003C3C00002E -:106C1000FF00000000000000003000000000000045 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000000000000000000000000095 +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 :106C20000000000000000000000000000000000064 :106C30000000000000000000000000000000000054 :106C40000000000000000000000000000000000044 @@ -46808,32 +46808,32 @@ :106CB00000000000000000000000000000000000D4 :106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000FFFF00006666DA -:106CF000000000FF000066660000FFFF00006666FF -:106D000000000F0F00000F0F0000FFFF000066667D -:106D1000000000FFFFFF999900F060601818080854 +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 :106D30000000000000000000000000000000000053 :106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 :106D60000000000000000000000000000000000023 -:106D70006666000000FF000066660000000000007C -:106D8000666600000F0F00000F0F000000000000FB -:106D90006666000000FFFFFF9999000000000000F8 -:106DA00008080000000000000000000000000000D3 +:106D70000000000000000000000000000000000013 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 :106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 :106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000045128029A3 -:106DF0008020920245E7800F802D92024082800021 -:106E00000020920240828000002092024582800988 -:106E100080259202408280000020820210002028FB -:106E2000004000080000000000000000000000001A +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 :106E30000000000000000000000000000000000052 :106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 -:106E600000000000000000000000000000005000D2 -:106E7000101028003000000000000000000000009A +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 :106E80000000000000000000000000000000000002 :106E900000000000000000000000000000000000F2 :106EA00000000000000000000000000000000000E2 @@ -46841,237 +46841,237 @@ :106EC00000000000000000000000000000000000C2 :106ED00000000000000000000000000000000000B2 :106EE00000000000000000000000000000000000A2 -:106EF00050001010280030000000000000000000CA +:106EF0000000000000000000000000000000000092 :106F00000000000000000000000000000000000081 -:106F10005500050500000000000000000000000012 +:106F10000000000000000000000000000000000071 :106F20000000000000000000000000000000000061 :106F30000000000000000000000000000000000051 :106F40000000000000000000000000000000000041 :106F50000000000000000000000000000000000031 :106F60000000000000000000000000000000000021 -:106F70000000F00030003C00300000000000000085 +:106F70000000000000000000000000000000000011 :106F80000000000000000000000000000000000001 -:106F90000000F00030003C0028000000000000006D +:106F900000000000000000000000000000000000F1 :106FA00000000000000000000000000000000000E1 :106FB00000000000000000000000000000000000D1 :106FC00000000000000000000000000000000000C1 :106FD00000000000000000000000000000000000B1 :106FE00000000000000000000000000000000000A1 -:106FF0000000000000003000000030000000000031 +:106FF0000000000000000000000000000000000091 :107000000000000000000000000000000000000080 -:107010000000000000003000000028000000000018 +:107010000000000000000000000000000000000070 :107020000000000000000000000000000000000060 :107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 :107050000000000000000000000000000000000030 :107060000000000000000000000000000000000020 -:1070700000000000000000000000200000000000F0 -:1070800000000040000000002000000000000000A0 -:1070900000000000000001000100050004000000E5 -:1070A0000000C0400000C00088008800C000000050 -:1070B00000000000000000010000000000000000CF +:1070700000000000000020000000000000020000EE +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000400000000DC +:1070B00000000000000000000000000000000000D0 :1070C00000000000000000000000000000000000C0 :1070D00000000000000000000000000000000000B0 :1070E00000000000000000000000000000000000A0 :1070F0000000000000000000000000000000000090 -:10710000000020000001000000000000000000005E -:107110000000000000000000040004008200800065 -:107120004100090009014100090000004100090077 -:107130000900000000000000000000000000000046 +:10710000400000000000000000000000000000003F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000100000000000000000003F :10714000000000000000000000000000000000003F :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F -:10717000000000000000000000000080000000008F +:10717000000000000000000000000000000000000F :1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000001000007F -:10720000000000880000000000000000000000886E -:1072100000000000008800000000000000000000E6 -:1072200000000000000000000082000000000000DC -:107230000084000000820082008200000000000044 -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E -:10728000000000000041000000410000000000007C -:107290000000000000000021002100210021002149 -:1072A00000050000C0020002840200110002000973 +:1071900000000000000000000000001008000010C7 +:1071A00000100000000000000000000000000000CF +:1071B0000000020002000040004000000010080033 +:1071C000001000400000000000000000000000006F +:1071D000000000000000000000000000080008009F +:1071E000001000100000000000000000000000007F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:107240000000000000000000000000000000000836 +:107250000008000800080000000000000000000016 +:10726000000000000000000000000000000000C05E +:1072700000C000C000C000000000000000000000CE +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A000000000000000000000000000C00000001E :1072B00000000000000000000000000000000000CE -:1072C00000020011000200000000000000000000A9 -:1072D000080008000800080000000000000000008E -:1072E000000000000000000000000000000000009E +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000040000009A :1072F000000000000000000000000000000000008E :10730000000000000000000000000000000000007D -:10731000000000000000000011000000000000005C -:107320000000000000000000090000C00000000094 -:1073300000000000410000004100000000000000CB -:10734000000000000000080008000000000000002D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D :10735000000000000000000000000000000000002D :10736000000000000000000000000000000000001D :10737000000000000000000000000000000000000D -:10738000000008000800000004800000C0000000A9 -:10739000C00008008200000008000000080008008B -:1073A00000008200020008008300A000000001002D -:1073B00000000000000000000000000000000000CD +:1073800000200000000000000000000000000000DD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000008000800080008000000000000AD :1073C00000000000000000000000000000000000BD :1073D00000000000000000000000000000000000AD :1073E000000000000000000000000000000000009D :1073F000000000000000000000000000000000008D -:10740000000000000000410000880820000000008B -:107410000000000000000000080000000000000064 -:1074200000000800000080000000040000000000D0 -:1074300002820000000011000000000000000000B7 +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C :10744000000000000000000000000000000000003C :10745000000000000000000000000000000000002C :10746000000000000000000000000000000000001C :10747000000000000000000000000000000000000C -:1074800000000000000020008200C0000041000059 -:10749000100000080800000000000008002108009B -:1074A000000000008202040004000400C000A000EC -:1074B00000000000A0000002081100000009000206 -:1074C00000000002001100000000000000000000A9 +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000008000000000000000000D4 +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC :1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C +:1074E000000000000000200000000000000000007C :1074F000000000000000000000000000000000008C -:1075000000000000000000008000000000000000FB -:107510000000080000000000000000000000000063 -:10752000000000000000000080848000A1000084B2 +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B :10753000000000000000000000000000000000004B :10754000000000000000000000000000000000003B -:107550000000000000000800000000000000000023 +:10755000000000000000000000000000000000002B :10756000000000000000000000000000000000001B :10757000000000000000000000000000000000000B -:107580000000000000000000000004004000A00017 -:107590000011C02040000000000082000000000038 -:1075A0000000A0088208400810000200000002004D -:1075B00002000002C00300000002000000004000C2 +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB :1075D00000000000000000000000000000000000AB :1075E000000000000000000000000000000000009B :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A -:1076200000000000000000000000000080000000DA -:1076300080008000000000000000000000001188B1 -:1076400040000000000000002100000000000000D9 +:10762000000000000000000000000000000000005A +:107630000000000000000000000000000000000446 +:10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000100F9 -:10769000000001000000041000200004100210820D -:1076A000000800022010000000000000000000C0E0 -:1076B0000082000490A020880020002010104120AB -:1076C00040020082401000000000000000000000A6 +:1076700000004100000000000000050005000000BF +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A :1076F000000000000000000000000000000000008A :107700000000000000000000000000000000000079 -:1077100011000000200000008080000000800000B8 -:1077200080000080008000000000000000000000D9 -:1077300000800000008000001000000000008000B9 -:107740008800000000800000000000000000000031 +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000000039 :107750000000000000000000000000000000000029 :107760000000000000000000000000000000000019 :107770000000000000000000000000000000000009 :1077800000000000000000000000000000000000F9 -:1077900000000009000400800000000000A00000BC -:1077A0000080000000910000008000000000000048 -:1077B00000000000000280808000800000A1808026 -:1077C00080800000008580A0008000000000000094 +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 :1077D00000000000000000000000000000000000A9 :1077E0000000000000000000000000000000000099 :1077F0000000000000000000000000000000000089 :107800000000000000000000000000000000000078 -:10781000000000000000000000400082820002C161 -:1078200020A020C0900002C00220A0C000000000E4 -:1078300000000000200000010402C000020010C08F -:10784000040202C0400010C0400288C000000000D6 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 :107850000000000000000000000000000000000028 :107860000000000000000000000000000000000018 :107870000000000000000000000000000000000008 :1078800000000000000000000000000000000000F8 -:10789000000000000000000000000000000089104F -:1078A0000088C040A00205100010C0A010400000D9 -:1078B000000000000000040000400004C0C091105F -:1078C0000088C040102091020010C0021002000089 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 :1078D00000000000000000000000000000000000A8 :1078E0000000000000000000000000000000000098 :1078F0000000000000000000000000000000000088 :107900000000000000000000000000000000000077 :107910000000000000000000000000000000000067 -:107920004100000080000080C100000080000000D5 -:107930000000000000000000800000000080808047 -:107940004180000080800000410000008000008035 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 :107950000000000000000000000000000000000027 :107960000000000000000000000000000000000017 :107970000000000000000000000000000000000007 :1079800000000000000000000000000000000000F7 -:1079900000000000000000000000800080200000C7 -:1079A0008000800080000000000080208080800037 -:1079B000000000000000000000008000800880003F -:1079C0008000004000000000000080008000800077 -:1079D0008000000000000000000000000000000027 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000000C7 +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000000000000000000A7 :1079E0000000000000000000000000000000000097 :1079F0000000000000000000000000000000000087 :107A00000000000000000000000000000000000076 -:107A10000000000000000000000000000200020161 -:107A2000C00004001000040202888800080104203D -:107A3000088820000000000000000000C0000401D1 -:107A400004200400080040109088880010001040B6 -:107A500002201000000000000000000000000000F4 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000000000000000000026 :107A60000000000000000000000000000000000016 :107A70000000000000000000000000000000000006 :107A800000000000000000000000000000000000F6 -:107A90000000000000000000000000000000000ADC -:107AA00000E0070000000000000000004842000065 -:107AB0000000000048420000000000000000000A32 -:107AC00080000700000A000000000000484200009B -:107AD000000000004842000000000000000000001C +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 :107AE0000000000000000000000000000000000096 :107AF0000000000000000000000000000000000086 :107B00000000000000000000000000000000000075 :107B10000000000000000000000000000000000065 -:107B200082BEFCFC00000000041008200009006078 -:107B300000810024028008200000000000000000F6 -:107B4000F0FF0C0CFF00F00002088020000009602C -:107B50000000096000090060000000000000000053 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 :107B60000000000000000000000000000000000015 :107B70000000000000000000000000000000000005 :107B800000000000000000000000000000000000F5 :107B900000000000000000000000000000000000E5 -:107BA000000082BEC0C00000000001400280090049 -:107BB000600081002400014004100000000000006B -:107BC0000000FAFA0C0C0000F000010440100960FB -:107BD00000000960000009006000000000000000D3 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 :107BE0000000000000000000000000000000000095 :107BF0000000000000000000000000000000000085 :107C00000000000000000000000000000000000074 :107C10000000000000000000000000000000000064 -:107C200000000000000000000000000004011040FF -:107C300006900000240081000408102000000000CD -:107C4000000000005F3FF0F000FF003C2400002433 -:107C500006900000440088004400880000000000F6 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 :107C60000000000000000000000000000000000014 :107C70000000000000000000000000000000000004 :107C800000000000000000000000000000000000F4 :107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000802CA -:107CB0002080000006900024008101024080000026 -:107CC0000000000000005F3F00000000003C810059 -:107CD00000810000069000440088004400880000F5 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD00000000000000000000000000000000000A4 :107CE0000000000000000000000000000000000094 :107CF0000000000000000000000000000000000084 :107D00000000000000000000000000000000000073 :107D10000000000000000000000000000000000063 -:107D200000000000000000000061002F000D01A015 -:107D300060000000000010000000000000000800CB -:107D4000000000000000000010082028004000088B -:107D500060000000000010000000000000000800AB +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D50000000000000000000000000000000000023 :107D60000000000000000000000000000000000013 :107D70000000000000000000000000000000000003 :107D800000000000000000000000000000000000F3 @@ -47109,192 +47109,192 @@ :107F800000000000000000000000000000000000F1 :107F900000000000000000000000000000000000E1 :107FA00000000000000000000000000000000000D1 -:107FB0000000840084008400200000000000000015 -:107FC000000400002000000000000000000000008D -:107FD000000400000000000020000000000000007D -:107FE0000000000020000000000000000000000071 -:107FF000000400030000000000000000000000007A -:10800000000000040000000000000000000000006C -:108010000000000000000000000000000000000060 +:107FB00000000000000000000000000000000004BD +:107FC00000000000000000000000000000000000B1 +:107FD000000000000000000000000000000000029F +:107FE0000000000000000000000000000000000889 +:107FF000000000020000000000000000000000007F +:108000000004000400000000000000000000000068 +:10801000000200000000000000000000000000005E :10802000000000040000000000000000000000004C -:108030000000000000000000000000000000000040 +:1080300000040004400200000000000000000000F6 :108040000000000000000000000000000000000030 -:108050000000000000000000000020000000000000 +:1080500040000000000000000000000000000000E0 :108060000000000000000000000000000000000010 :108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 +:1080800000000000000200000000410000000000AD :1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 +:1080A00000000002000000000000000000000000CE :1080B00000000000000000000000000000000000C0 -:1080C000840000000000000000000000000000002C -:1080D0000000000000000000000000000000008020 -:1080E0000080000000000080000000000000000090 -:1080F00000000000000000000000000000002080E0 -:10810000008000000000000000002000000000804F -:10811000000000000000000000000000000000005F +:1080C00000000000001000000000000000000000A0 +:1080D0000000000000000040004000000000000020 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:1081000000400040000000000000000000000000EF +:10811000000000000000000011000000000000004E :10812000000000000000000000000000000000004F -:108130000000000000000000000800000000200017 -:10814000000000000000000000000010000000001F -:108150000000000000000000000800000000000017 -:10816000004000400084008400400000000000083F -:10817000000000840084008400000008000000006B -:10818000004000400000000000000000000000006F -:108190000040000000000000000000080000000097 +:10813000000000000000000000000000000000003F +:108140000000000000080000000000000000000027 +:108150000004000200000082000000000000000097 +:10816000000000000004000000000000000000000B +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:108190000000000000000008000082000000000055 :1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000415E -:1081E0000000000800000000008000000000008582 -:1081F000008000000000004000400000008000A15E -:108200000080000000850040004000400000004069 +:1081B00000000000000000020000000000000000BD +:1081C000000000000000001000000000000000009F +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E :10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000021001D -:1082400003000300000000000800410021080000B6 -:1082500000A0000003A000080008030808000800B0 -:1082600008000308030000000300034000840084AA -:108270000040004000A000A000A100A100000040BC -:1082800000400040000000400001008500010000A7 -:1082900000010000000000000000000000000000DD -:1082A00000000000000000000000000000000000CE +:1082200001800100000000000000000000000000CC +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000404040000000000000000000000C2 :1082B00000000000000000000000000000000000BE -:1082C00000000000400082000000000040000000AC -:1082D00000000800820008000000400008000000C4 -:1082E00000000000000002000000000000009000FC -:1082F00000001000000010009000A000000000002E -:1083000000000000820000001000000000000000DB +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000110000000000000000000000006D +:10830000000000000000000000100010001000003D :10831000000000000000000000000000000000005D -:10832000000000000000000000000000000000004D +:10832000000000000000010000000000000000004C :10833000000000000000000000000000000000003D :10834000000000000000000000000000000000002D :10835000000000000000000000000000000000001D -:10836000000000000000000080000000000000008D -:1083700000000000800000008000000000000000FD -:10838000000000000000000000008000000000006D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED :1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD +:1083A0000000000000040040020400000000000083 :1083B00000000000000000000000000000000000BD -:1083C000000082000000000000000000000000002B +:1083C00000000000000000000000000000000000AD :1083D000000000000000000000000000000000009D -:1083E000000000000000000000000080008003008A -:1083F00002000080010000000000000410000000E6 -:108400002000000082000100000001400000100078 -:1084100000002000000000000000004000000000FC -:10842000000000000000000000000000000000004C +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:108420000000000000000000000010040000000038 :10843000000000000000000000000000000000003C -:10844000000000000000000000000000000800081C -:1084500000080008001000000000210800000000D3 -:10846000000000000000000003A0000000400040E9 -:1084700082A0A1A0004002A000002108000180000D -:108480000000800000000000020000000201000067 -:1084900080000000800000000000000000010000DB -:1084A00000000000000000000000000000000000CC +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A000000000000000000000000000800100004B :1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000800A4 -:1084D0000000000008000000000000000000000094 -:1084E000000000000000000000000000400000004C -:1084F00002000000400000040204400400080040A4 -:108500000040000400000000824002000040000023 -:1085100000040000000000000040000000400000D7 -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000100000000004A +:108530000000000900090000000000000000000029 :10854000000000000000000000000000000000002B :10855000000000000000000000000000000000001B :10856000000000000000000000000000000000000B -:1085700000008000000000000001800100010001F7 -:108580000001000100000000000000018000000167 -:1085900000000001000000000000000100000001D8 -:1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000000000000000BB +:1085700000000000000000000000000009000000F2 +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000082000000000000020020000040E7 +:1085B00000000000000000000500000000000000B6 :1085C00000000000000000000000000000000000AB :1085D000000000000000000000000000000000009B :1085E000000000000000000000000000000000008B -:1085F000000000C000080000080001C18800000160 -:10860000820000C1000001018800000002C00000DB -:108610000002000000C100004101880002C000000B -:108620000002000000000000000000000000000048 -:10863000000000000000000000000000000000003A +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:1086200000000000000000000000000001009000B9 +:1086300000000084000000000000000000000000B6 :10864000000000000000000000000000000000002A :10865000000000000000000000000000000000001A :10866000000000000000000000000000000000000A -:1086700000000000008000800000800009C1A1030C -:108680000902800000C111050409800000008080FB -:1086900000000080000000C11105040980038080F3 -:1086A000000000800000000000000000000000004A -:1086B00000000000000000000000000000000000BA +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000001100B9 +:1086B000A100000000000000000000000000000019 :1086C00000000000000000000000000000000000AA :1086D000000000000000000000000000000000009A :1086E000000000000000000000000000000000008A -:1086F00000000000000000000000000080002000DA -:1087000005000900C100008002008500C1000000D2 -:10871000800000000000800005800000C000C10053 -:1087200000000000000080000000000000000000C9 -:108730000000000000000000000000000000000039 +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000008098000100000000000000000000098 :108740000000000000000000000000000000000029 :108750000000000000000000000000000000000019 :108760000000000000000000000000000000000009 -:108770000000000000000000000000000000C00039 -:1087800001A000000100C100008801009000C100AC -:108790000000080000000000C000008800009000F9 -:1087A000C100000000000000C00000000000000048 -:1087B00000000000000000000000000000000000B9 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B0000000000101080001008800000000000026 :1087C00000000000000000000000000000000000A9 :1087D0000000000000000000000000000000000099 :1087E0000000000000000000000000000000000089 :1087F0000000000000000000000000000000000079 -:1088000000C000010001830191C12000910100001E -:1088100000C1000000000000000000C02000900027 -:10882000000000C100000000000000C000000000C7 -:108830000000000000000000000000000000000038 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:10883000000000000100A088080000000000020005 :108840000000000000000000000000000000000028 :108850000000000000000000000000000000000018 :108860000000000000000000000000000000000008 :1088700000000000000000000000000000000000F8 -:108880000000008000200203400289C180098202AA -:10889000050500C100000000000000000080800904 -:1088A0008000400300C100000000000000800000C4 -:1088B00000000000000000000000000000000000B8 -:1088C00000000000000000000000000000000000A8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B0000000000000004100008080004100000036 +:1088C0008000000000000000000000000000000028 :1088D0000000000000000000000000000000000098 :1088E0000000000000000000000000000000000088 -:1088F00000000000000000000000000000008000F8 -:10890000000000800000C189838002004000C18017 -:10891000020985000903000080000000000000003B -:10892000C1C040098300090380000000000000006E -:108930000000000000000000000000000000000037 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:1089300000000000000000000011040000800000A2 :108940000000000000000000000000000000000027 :108950000000000000000000000000000000000017 :108960000000000000000000000000000000000007 :1089700000000000000000000000000000000000F7 -:108980000800000000080000C141201001000000A4 -:10899000C1C00101880001010000C000000000000A -:1089A0004000C1C0000188000101C000004000007B -:1089B0004000000000000000000000000000000077 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B0000000000000000000000000010100004075 :1089C00000000000000000000000000000000000A7 :1089D0000000000000000000000000000000000097 :1089E0000000000000000000000000000000000087 :1089F0000000000000000000000000000000000077 -:108A000000000000000000000000500000E0000036 -:108A10000000500000E000004200000000000000E4 -:108A200000000000810000E00000420000000000A3 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 +:108A00000000000000000000000000000000000066 +:108A10000000000000000000000000000000000056 +:108A20000000000000000000000000000000000046 +:108A3000000000000000000000000000000000E056 +:108A4000070082000000000000000000000000009D :108A50000000000000000000000000000000000016 :108A60000000000000000000000000000000000006 :108A700000000000000000000000000000000000F6 -:108A800000000000FFFF0000FFFF0000FF000000EB -:108A9000FFFF0000F0F00000FFFF000000003C3C82 -:108AA000000066660000F0F00000FFFF00003C3CA4 -:108AB00000006666000000000000000000000000EA -:108AC00000000000000000000000000000000000A6 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000F0F000000000000000000000C6 :108AD0000000000000000000000000000000000096 :108AE0000000000000000000000000000000000086 :108AF0000000000000000000000000000000000076 -:108B0000000000000000FFFF000000000000FF0068 -:108B1000000000000000F0F0000000000000000075 -:108B20003C3C000066660000F0F000000000000021 -:108B30003C3C0000666600000000000000000000F1 -:108B40000000000000000000000000000000000025 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 +:108B4000000000000000F0F0000000000000000045 :108B50000000000000000000000000000000000015 :108B60000000000000000000000000000000000005 :108B700000000000000000000000000000000000F5 @@ -47306,173 +47306,173 @@ :108BD0000000000000000000000000000000000095 :108BE0000000000000000000000000000000000085 :108BF0000000000000000000000000000000000075 -:108C000000000000000000000000000000FF000065 -:108C1000FFFF00006666000066660000FFFF0000C0 -:108C200000FF000000000F0F00003C3C0000FFFFB1 -:108C3000000000FF00000F0FFFFF999900000000E7 -:108C40000000000000000000000000000000000024 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C4000000000003C3C0000FFFF000000000000AE :108C50000000000000000000000000000000000014 :108C60000000000000000000000000000000000004 :108C700000000000000000000000000000000000F4 -:108C8000000000000000000000000000000000FFE5 -:108C9000000000000000666600006666000000003C -:108CA000000000FF000000000F0F00003C3C00002F -:108CB0000000000000FF00000F0FFFFF9999000067 -:108CC00000000000000000000000000000000000A4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC0000000000000003C3C00000000000000002C :108CD0000000000000000000000000000000000094 :108CE0000000000000000000000000000000000084 :108CF0000000000000000000000000000000000074 -:108D00000000000000000000000000000000400221 -:108D100080000020920240828001802092024082E6 -:108D20008001802092020000408280000020920298 -:108D300040828001802092024082800000208202D6 -:108D40000000000000000000000000000000000023 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D4000000000000000000005402A06054C00A8B5 :108D50000000000000000000000000000000000013 :108D60000000000000000000000000000000000003 :108D700000000000000000000000000000000000F3 :108D800000000000000000000000000000000000E3 -:108D90000000000000000000A0002020C300C00070 -:108DA000003000500C000F00000000000000000028 -:108DB00000000030005014005500000000000000CA -:108DC00000000000000000000000000000000000A3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC000000000000000000000000000FF00FFFFA6 :108DD0000000000000000000000000000000000093 :108DE0000000000000000000000000000000000083 :108DF0000000000000000000000000000000000073 :108E00000000000000000000000000000000000062 -:108E100000000000000000000000A0002020000072 -:108E2000C000003000500C000000000000000000F6 -:108E3000000000000030005014000000000000009E -:108E40000000000000000000000000000000000022 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000FF0023 :108E50000000000000000000000000000000000012 :108E60000000000000000000000000000000000002 :108E700000000000000000000000000000000000F2 :108E800000000000000000000000000000000000E2 :108E900000000000000000000000000000000000D2 -:108EA00000000000000000000F000A0000000000A9 -:108EB00000000000000000000000C300820000006D +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 :108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000000000092 +:108ED0000000F0F0000000000000000000000000B2 :108EE0000000000000000000000000000000000082 :108EF0000000000000000000000000000000000072 :108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000F00061 -:108F2000505000C3C0C0AA000A0A00000A00000096 -:108F30000000000000000000C300030300008200E6 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 :108F40000000000000000000000000000000000021 -:108F50000000000000000000000000000000000011 +:108F500000000000F0F00000000000000000000031 :108F60000000000000000000000000000000000001 -:108F700000000000000000000000020000000000EF -:108F800000000000000000000000200000000000C1 +:108F700000000000000000000000000000040000ED +:108F800000000000000000000000000000000000E1 :108F900000000000000000000000000000000000D1 :108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 +:108FB00000020000000000040000000000000000AB +:108FC0000000000088000000000000000000000019 :108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 +:108FE0000000000020000000000000000000000061 :108FF0000000000000000000000000000000000071 -:10900000040000000040000000000000000000001C +:109000000000000000000000000000000000000060 :109010000000000000000000000000000000000050 :109020000000000000000000000000000000000040 :109030000000000000000000000000000000000030 :109040000000000000000000000000000000000020 :109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 +:1090600000000000000000000000000000400000C0 :1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 +:1090800000000000000000000000001000000000D0 :1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 +:1090A000001000100820040004100410000000004C :1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 +:1090C0000000000000000080008000900090000080 +:1090D000000000000000030000000000000000008D :1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:109110002000000000080000000000000000000027 -:10912000000000000000000000000000000000003F -:109130002000000000080000000000000000000007 -:10914000000000000000000000000000000000001F -:109150000000000000000008000000000000000007 +:1090F0000000000000000084000000840008000060 +:10910000000000000000000800080008000800003F +:1091100000000000000000000000000000840000CB +:1091200000000000000000098008800880040000A2 +:10913000000000000000000000000000000000002F +:10914000000000000000000000200020002000209F +:10915000000000000000000090000000000000007F :1091600000000000000000000000000000000000FF -:1091700000000000000000080000000000000000E7 -:1091800000000000000000000000000000000000DF +:1091700000000000000000000000000000000000EF +:10918000000000200000000000100000001000009F :1091900000000000000000000000000000000000CF -:1091A00000000800000000000000000000000000B7 +:1091A00000000000000000000000000000000008B7 :1091B00000000000000000000000000000000000AF :1091C000000000000000000000000000000000009F :1091D000000000000000000000000000000000008F -:1091E000000000000000000000000000000000007F +:1091E000010000000000000000000000000000007E :1091F000000000000000000000000000000000006F :10920000000000000000000000000000000000005E :10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E +:1092200000400000000000000000000000000000FE :10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E +:109240000000000000000000050000000000000019 :10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE +:1092600000002000000000000000000000000000DE :1092700000000000000000000000000000000000EE :1092800000000000000000000000000000000000DE :1092900000000000000000000000000000000000CE :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E +:1092C000A0000000000000000000000000000000FE :1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E +:1092E000000001800180000000000000000000403C +:1092F00000400040004000000000000000000000AE :10930000000000000000000000000000000000005D :10931000000000000000000000000000000000004D :10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D +:10933000000002000000000000000000000000002B :10934000000000000000000000000000000000001D :10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD +:10936000000000002020022000000000000000009B :1093700000000000000000000000000000000000ED :1093800000000000000000000000000000000000DD :1093900000000000000000000000000000000000CD :1093A00000000000000000000000000000000000BD :1093B00000000000000000000000000000000000AD :1093C000000000000000000000000000000000009D -:1093D000000000000000000000000000000000008D -:1093E000000000000000000000000000000000007D +:1093D00000000000000000000000200000009000DD +:1093E0000005000000000000100000000000000068 :1093F000000000000000000000000000000000006D :10940000000000000000000000000000000000005C :10941000000000000000000000000000000000004C :10942000000000000000000000000000000000003C :10943000000000000000000000000000000000002C :10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC +:109450000000000000000000000000000084000088 +:1094600000000000000021000000808400000000D7 :1094700000000000000000000000000000000000EC :1094800000000000000000000000000000000000DC :1094900000000000000000000000000000000000CC :1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC +:1094B00000000000000000000000000000000200AA :1094C000000000000000000000000000000000009C :1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C +:1094E000884100410041000901000000000900001E +:1094F0000000000900020000000000000000000061 :10950000000000000000000000000000000000005B :10951000000000000000000000000000000000004B :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB +:1095400000400000000000000000000000000000DB +:109550000000000005000000000000000000000006 +:1095600000000000000000000000200000000000DB :1095700000000000000000000000000000000000EB :1095800000000000000000000000000000000000DB :1095900000000000000000000000000000000000CB :1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB +:1095B00000000000000000000000A000000000000B :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B +:1095E00000000000000000000000010090000000EA +:1095F00000A00000000000000000000000000000CB :10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A :10963000000000000000000000000000000000002A :10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA +:109660000000000000000000000000001100A10048 :1096700000000000000000000000000000000000EA :1096800000000000000000000000000000000000DA :1096900000000000000000000000000000000000CA @@ -47480,57 +47480,57 @@ :1096B00000000000000000000000000000000000AA :1096C000000000000000000000000000000000009A :1096D000000000000000000000000000000000008A -:1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A +:1096E0000080000000800000000000000000000872 +:1096F00009800009000000000000000000000000D8 :109700000000000000000000000000000000000059 :109710000000000000000000000000000000000049 :109720000000000000000000000000000000000039 :109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 +:109740000084000000840000000000000000000011 :109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 +:1097600000000008000000080000000000000000E9 +:10977000000101020000008800000000000000005D :1097800000000000000000000000000000000000D9 :1097900000000000000000000000000000000000C9 :1097A00000000000000000000000000000000000B9 :1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 +:1097C0000100000084000000000000000000000014 :1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 +:1097E0000000000000000800000000000000000071 +:1097F0000000010088880200000000000200000054 :109800000000000000000000000000000000000058 :109810000000000000000000000000000000000048 :109820000000000000000000000000000000000038 :109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 +:109840000000040000000000000000000000000014 :109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 +:109860000000000011000000800000000000000067 +:1098700000000000410000808000410000008000E6 :1098800000000000000000000000000000000000D8 :1098900000000000000000000000000000000000C8 :1098A00000000000000000000000000000000000B8 :1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000000000098 +:1098C0000000000000000008000000000000000090 :1098D0000000000000000000000000000000000088 -:1098E0000000000000000000000000000000000078 -:1098F0000000000000000000000000000000000068 +:1098E0000000000000000040000000000000000038 +:1098F0000000000000000011000000804000000097 :109900000000000000000000000000000000000057 :109910000000000000000000000000000000000047 :109920000000000000000000000000000000000037 :109930000000000000000000000000000000000027 -:109940000000000000000000000000000000000017 +:109940000000000000000000000100000000000016 :109950000000000000000000000000000000000007 :1099600000000000000000000000000000000000F7 -:1099700000000000000000000000000000000000E7 +:1099700000000000000000000001000000400100A5 :1099800000000000000000000000000000000000D7 :1099900000000000000000000000000000000000C7 :1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 -:1099C0000000000000000000000000000000000097 +:1099C0000000000000000000000000001200000085 :1099D0000000000000000000000000000000000087 -:1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 -:109A00000000000000000000000000000000000056 +:1099E00000000000000000000000008100000700EF +:1099F00000000000000000000000000000E0070080 +:109A000082000000000000000000000000000000D4 :109A10000000000000000000000000000000000046 :109A20000000000000000000000000000000000036 :109A30000000000000000000000000000000000026 @@ -47538,7 +47538,7 @@ :109A50000000000000000000000000000000000006 :109A600000000000000000000000000000000000F6 :109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 +:109A8000F0F00000000000000000000000000000F6 :109A900000000000000000000000000000000000C6 :109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 @@ -47546,7 +47546,7 @@ :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 -:109B00000000000000000000000000000000000055 +:109B00000000F0F000000000000000000000000075 :109B10000000000000000000000000000000000045 :109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 @@ -47554,7 +47554,7 @@ :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 -:109B800000000000000000000000000000000000D5 +:109B800000003C3C0000FFFF00000000000000005F :109B900000000000000000000000000000000000C5 :109BA00000000000000000000000000000000000B5 :109BB00000000000000000000000000000000000A5 @@ -47562,15 +47562,15 @@ :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 :109BF0000000000000000000000000000000000065 -:109C00000000000000000000000000000000000054 +:109C0000000000003C3C00000000000000000000DC :109C10000000000000000000000000000000000044 :109C20000000000000000000000000000000000034 :109C30000000000000000000000000000000000024 :109C40000000000000000000000000000000000014 -:109C50000000000000000000000000000000000004 +:109C5000000005000A08050000A000000000000048 :109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000000E4 -:109C800000000000000000000000000000000000D4 +:109C70000000000005180A20050005A000000000F3 +:109C80000000000005402A06054C00A80000000066 :109C900000000000000000000000000000000000C4 :109CA00000000000000000000000000000000000B4 :109CB00000000000000000000000000000000000A4 @@ -47578,7 +47578,7 @@ :109CD0000000000000000000000000000000000084 :109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 -:109D00000000000000000000000000000000000053 +:109D000000000000000000003C3CFFFF00000000DD :109D10000000000000000000000000000000000043 :109D20000000000000000000000000000000000033 :109D30000000000000000000000000000000000023 @@ -47586,7 +47586,7 @@ :109D50000000000000000000000000000000000003 :109D600000000000000000000000000000000000F3 :109D700000000000000000000000000000000000E3 -:109D800000000000000000000000000000000000D3 +:109D8000000000000000000000003C3C000000005B :109D900000000000000000000000000000000000C3 :109DA00000000000000000000000000000000000B3 :109DB00000000000000000000000000000000000A3 @@ -47594,7 +47594,7 @@ :109DD0000000000000000000000000000000000083 :109DE0000000000000000000000000000000000073 :109DF0000000000000000000000000000000000063 -:109E00000000000000000000000000000000000052 +:109E00000000000000000000000000000000F0F072 :109E10000000000000000000000000000000000042 :109E20000000000000000000000000000000000032 :109E30000000000000000000000000000000000022 @@ -47603,55 +47603,55 @@ :109E600000000000000000000000000000000000F2 :109E700000000000000000000000000000000000E2 :109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 +:109E9000F0F00000000000000000000000000000E2 :109EA00000000000000000000000000000000000B2 -:109EB000000000000000000000000004000000009E -:109EC000000000000000000000000004000000008E -:109ED000000000000000000000000004000000007E -:109EE0000000000000000000000000000000000072 -:109EF000000000000000000000000000000400005E -:109F0000000000000000000000000000000400004D -:109F10000000000000000000000000000000000041 -:109F2000000000000000000000000000000400002D -:109F30000000000000000000000000000000000021 -:109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000000001 +:109EB000000000000000000020040000000000007E +:109EC000000000000000000000040000000000008E +:109ED0000000000000020000200000000000000060 +:109EE000000000000000000000040000000200006C +:109EF0000000000000000000000020000000000042 +:109F00000000000000000000000000040004000049 +:109F10000000000000000000000020000000000021 +:109F2000000000000000010000000000000400002C +:109F300000020000000000000000400000000000DF +:109F4000000000000000000000020000000000000F +:109F500000000000000000000000000200000000FF :109F600000000000000000000000000000000000F1 :109F700000000000000000000000000000000000E1 :109F800000000000000000000000000000000000D1 -:109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 +:109F900000000000000000000000000000020000BF +:109FA00000000000000000001000000000000000A1 :109FB00000000000000000000000000000000000A1 -:109FC000000000000000040000000000000000008D +:109FC0000000000000000000000000000000000091 :109FD0000000000000000000000000000000000081 :109FE0000000000000000000000000000000000071 :109FF0000000000000000000000000000000000061 :10A000000000000000000000000000000000000050 :10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 -:10A030000000000000000000000000000000000020 -:10A040000000000000000000000000000000000010 -:10A050000000000000000000000000000000000000 -:10A0600000000000000000000000000000000000F0 -:10A0700000000000000000000000000000000000E0 -:10A0800000000000000000000000000000000000D0 -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 -:10A0C0000000000000000000000000000000000090 -:10A0D0000000000000000000000000000000000080 -:10A0E0000000000000000000000000000000000070 +:10A02000000004000000000000000000000000101C +:10A0300000100008000800080008008400000084E8 +:10A0400000080010001000000000000000080000E0 +:10A050000000000800080008000800840000000854 +:10A060000008000000000000000000400010008414 +:10A0700000000000000800080008000800000000C0 +:10A0800000040004000000000000000000000000C8 +:10A0900000000000000800080008000800000000A0 +:10A0A00000040000000000000000000000000000AC +:10A0B0000000000000000000000000000008000098 +:10A0C0000008000000000000000000000008000080 +:10A0D0000008000000000000000000000000000078 +:10A0E0000000000000000000000000000010000060 :10A0F0000000000000000000000000000000000060 -:10A10000000000000000000000000000000000004F +:10A100000000000800000000000000000000000047 :10A11000000000000000000000000000000000003F :10A12000000000000000000000000000000000002F :10A13000000000000000000000000000000000001F :10A14000000000000000000000000000000000000F :10A1500000000000000000000000000000000000FF :10A1600000000000000000000000000000000000EF -:10A1700000000000000000000000000000000000DF +:10A1700000000000000000000000000021000000BE :10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF +:10A1900000000000000000C00000000000000000FF :10A1A00000000000000000000000000000000000AF :10A1B000000000000000000000000000000000009F :10A1C000000000000000000000000000000000008F @@ -47661,15 +47661,15 @@ :10A20000000000000000000000000000000000004E :10A21000000000000000000000000000000000003E :10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E +:10A23000000000000000010000800000000000009D :10A24000000000000000000000000000000000000E :10A2500000000000000000000000000000000000FE :10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE +:10A27000000000000040000000000000000000009E :10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE +:10A29000000000400000000000000000000000007E :10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000000009E +:10A2B000000000000000000020000004000000007A :10A2C000000000000000000000000000000000008E :10A2D000000000000000000000000000000000007E :10A2E000000000000000000000000000000000006E @@ -47677,31 +47677,31 @@ :10A30000000000000000000000000000000000004D :10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D -:10A33000000000000000000000000000000000001D +:10A33000000000009000000000000000000000008D :10A34000000000000000000000000000000000000D :10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED -:10A3700000000000000000000000000000000000DD +:10A370000000008400000000000000000000000059 :10A3800000000000000000000000000000000000CD -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD +:10A3900000000000000000000084000000C0000079 +:10A3A00000000000008400840000000000000000A5 :10A3B000000000000000000000000000000000009D :10A3C000000000000000000000000000000000008D :10A3D000000000000000000000000000000000007D :10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D +:10A3F000000000000000000000000000400200001B :10A40000000000000000000000000000000000004C :10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C +:10A420000000000900000000000000000000000221 +:10A43000000200000000000000000000000000001A :10A44000000000000000000000000000000000000C :10A4500000000000000000000000000000000000FC :10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC +:10A4700000000000000000040000000000000900CF +:10A4800000000000000000000000000000041104B3 +:10A4900000040000000000000000000000000000B8 :10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C +:10A4B0000000050000000000000000000000000097 :10A4C000000000000000000000000000000000008C :10A4D000000000000000000000000000000000007C :10A4E000000000000000000000000000000000006C @@ -47709,7 +47709,7 @@ :10A50000000000000000000000000000000000004B :10A51000000000000000000000000000000000003B :10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000000000001B +:10A53000000000000000000000000000000001001A :10A54000000000000000000000000000000000000B :10A5500000000000000000000000000000000000FB :10A5600000000000000000000000000000000000EB @@ -47718,7 +47718,7 @@ :10A5900000000000000000000000000000000000BB :10A5A00000000000000000000000000000000000AB :10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B +:10A5C0001100210000000000000000000000000059 :10A5D000000000000000000000000000000000007B :10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B @@ -47726,7 +47726,7 @@ :10A61000000000000000000000000000000000003A :10A62000000000000000000000000000000000002A :10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A +:10A64000000000410900000300800000000000003D :10A6500000000000000000000000000000000000FA :10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA @@ -47734,7 +47734,7 @@ :10A6900000000000000000000000000000000000BA :10A6A00000000000000000000000000000000000AA :10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A +:10A6C0000000000000910100000000880000000070 :10A6D000000000000000000000000000000000007A :10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A @@ -47742,7 +47742,7 @@ :10A710000000000000000000000000000000000039 :10A720000000000000000000000000000000000029 :10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 +:10A740000000000000000000880000000100000080 :10A7500000000000000000000000000000000000F9 :10A7600000000000000000000000000000000000E9 :10A7700000000000000000000000000000000000D9 @@ -47750,7 +47750,7 @@ :10A7900000000000000000000000000000000000B9 :10A7A00000000000000000000000000000000000A9 :10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 +:10A7C0000000000000000000000000000000410048 :10A7D0000000000000000000000000000000000079 :10A7E0000000000000000000000000000000000069 :10A7F0000000000000000000000000000000000059 @@ -47758,7 +47758,7 @@ :10A810000000000000000000000000000000000038 :10A820000000000000000000000000000000000028 :10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 +:10A8400000000000000000000000000000110000F7 :10A8500000000000000000000000000000000000F8 :10A8600000000000000000000000000000000000E8 :10A8700000000000000000000000000000000000D8 @@ -47766,7 +47766,7 @@ :10A8900000000000000000000000000000000000B8 :10A8A00000000000000000000000000000000000A8 :10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 +:10A8C0000000000000000000000000000000000187 :10A8D0000000000000000000000000000000000078 :10A8E0000000000000000000000000000000000068 :10A8F0000000000000000000000000000000000058 @@ -47775,7 +47775,7 @@ :10A920000000000000000000000000000000000027 :10A930000000000000000000000000000000000017 :10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 +:10A9500000E0000081410000000000000000000055 :10A9600000000000000000000000000000000000E7 :10A9700000000000000000000000000000000000D7 :10A9800000000000000000000000000000000000C7 @@ -47823,7 +47823,7 @@ :10AC20000000000000000000000000000000000024 :10AC30000000000000000000000000000000000014 :10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 +:10AC50000000000000000000000000400006000CA2 :10AC600000000000000000000000000000000000E4 :10AC700000000000000000000000000000000000D4 :10AC800000000000000000000000000000000000C4 @@ -47831,8 +47831,8 @@ :10ACA00000000000000000000000000000000000A4 :10ACB0000000000000000000000000000000000094 :10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 +:10ACD00000000000000000000000000000005555CA +:10ACE000FFFF000000000000000000000000000066 :10ACF0000000000000000000000000000000000054 :10AD00000000000000000000000000000000000043 :10AD10000000000000000000000000000000000033 @@ -47840,7 +47840,7 @@ :10AD30000000000000000000000000000000000013 :10AD40000000000000000000000000000000000003 :10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 +:10AD60005555000000000000000000000000000039 :10AD700000000000000000000000000000000000D3 :10AD800000000000000000000000000000000000C3 :10AD900000000000000000000000000000000000B3 @@ -47848,7 +47848,7 @@ :10ADB0000000000000000000000000000000000093 :10ADC0000000000000000000000000000000000083 :10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 +:10ADE00000000000F0F00000000000000000000083 :10ADF0000000000000000000000000000000000053 :10AE00000000000000000000000000000000000042 :10AE10000000000000000000000000000000000032 @@ -47856,176 +47856,176 @@ :10AE30000000000000000000000000000000000012 :10AE40000000000000000000000000000000000002 :10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000040000000000000000000000CE -:10AE800000000000000000000000000000000000C2 -:10AE900000000000040000000000000000000000AE -:10AEA00000000000000000000000000000000000A2 -:10AEB000000000000000040000000000000000008E -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0004000000000000000000000000000000012 +:10AE6000000000000000F0F00000000000000004FE +:10AE700000000000000000000000000000000000D2 +:10AE8000200000000000000420000000000000007E +:10AE900000000000000000000000000000000000B2 +:10AEA000200400000000000020000003000000005B +:10AEB000000000040000000000000000000000008E +:10AEC000000400000200000000002000020000005A +:10AED00000000000000000000000000088000000EA +:10AEE0000000000020000000000000000000000042 +:10AEF000000000040000000000000000000000004E :10AF00000000000000000000000000000000000041 :10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 +:10AF2000000000000000000000020000000000001F :10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 +:10AF40000000000000008000000000000000800001 +:10AF50000000000000000000409000000000000021 +:10AF600000000000000000000000000000A0000041 :10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF90000000000000000000200000000000000091 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000020000000000071 +:10AF800000000000000000000000000000000800B9 +:10AF900000000010000000000000000000000000A1 +:10AFA00000000000000000000000008000800000A1 +:10AFB00000000200001000100020002000200020EF :10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000020000000000051 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B0500000000000000000000000000000000000F0 +:10AFD000020002000000000000000000000000006D +:10AFE000040000000000000000000000000000005D +:10AFF000000000000000000800080008008404842D +:10B000000000000800000082000800080010001086 +:10B010000000004000000010408400840000000098 +:10B020000000008800000000004000400004000410 +:10B03000000000000000000000000001000100010D +:10B0400000010000000000000000000000000000FF +:10B0500000000008000800080008000000000000D0 :10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 +:10B0700000000000000800000010000000000000B8 +:10B0800000000000000000000000000000000008B8 +:10B0900000080000000000000000000000000000A8 +:10B0A0000000000000000000000000040004000098 :10B0B0000000000000000000000000000000000090 :10B0C0000000000000000000000000000000000080 -:10B0D0000000000000000000000000000000000070 +:10B0D000000000000000000000000100000000006F :10B0E0000000000000000000000000000000000060 :10B0F0000000000000000000000000000000000050 :10B10000000000000000000000000000000000003F :10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F +:10B12000000000000000000000000000000100011D :10B13000000000000000000000000000000000000F :10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF +:10B1500000000000000000000000000004000000EB :10B1600000000000000000000000000000000000DF :10B1700000000000000000000000000000000000CF :10B1800000000000000000000000000000000000BF :10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F +:10B1A0000000000000000000000000008800000017 :10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F +:10B1C0000000000000000000000000000000080077 +:10B1D00000000000000001001000000001800100DC +:10B1E00000000000000000002000200020002000DF +:10B1F0000000000000000000000000000800000047 :10B20000000000000000000000000000000000003E :10B21000000000000000000000000000000000002E :10B22000000000000000000000000000000000001E :10B23000000000000000000000000000000000000E :10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE +:10B25000000000000000000004008000000020202A +:10B2600002000000000000000000000000000000DC :10B2700000000000000000000000000000000000CE :10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE :10B2A000000000000000000000000000000000009E :10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E +:10B2C00000008200000000000000000000000000FC +:10B2D00000000000000000009020000000000000BE +:10B2E000000010040000000000000000000000004A :10B2F000000000000000000000000000000000004E :10B30000000000000000000000000000000000003D :10B31000000000000000000000000000000000002D :10B32000000000000000000000000000000000001D :10B33000000000000000000000000000000000000D :10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD +:10B3500000000000000000000000000100000000EC +:10B36000000000008001000000000000000000005C +:10B370000000000000C00000000000840800000081 :10B3800000000000000000000000000000000000BD :10B3900000000000000000000000000000000000AD :10B3A000000000000000000000000000000000009D :10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D +:10B3C000000800080008000800000000000000005D :10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D +:10B3E0000000010000000000000000000009000053 :10B3F000000000000000000000000000000000004D :10B40000000000000000000000000000000000003C :10B41000000000000000000000000000000000002C :10B42000000000000000000000000000000000001C :10B43000000000000000000000000000000000000C :10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC +:10B45000000000000000000000000082000000006A +:10B4600000000000200000000000000000000000BC :10B4700000000000000000000000000000000000CC :10B4800000000000000000000000000000000000BC :10B4900000000000000000000000000000000000AC :10B4A000000000000000000000000000000000009C :10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C +:10B4C0000000000000000000000000000000C000BC +:10B4D000000000000000000000000000000090904C +:10B4E000000000000100900000000040000000008B :10B4F000000000000000000000000000000000004C :10B50000000000000000000000000000000000003B :10B51000000000000000000000000000000000002B :10B52000000000000000000000000000000000001B :10B53000000000000000000000000000000000000B :10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB +:10B5500000000000000000000000000000001100DA +:10B560008000000000001100A100000000000000A9 :10B5700000000000000000000000000000000000CB :10B5800000000000000000000000000000000000BB :10B5900000000000000000000000000000000000AB :10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000000000000000000000006B -:10B5E000000000000000000000000000000000005B +:10B5B0000000000000000000000000000000000982 +:10B5C00000000009000000000000000000000080F2 +:10B5D0000041008000210080000400000000000005 +:10B5E00000000080000000800008098000100000BA :10B5F000000000000000000000000000000000004B :10B60000000000000000000000000000000000003A :10B61000000000000000000000000000000000002A :10B62000000000000000000000000000000000001A :10B63000000000000000000000000000000000000A :10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA +:10B650000020000000C0000000C00000000000004A +:10B66000000000000020000000C0000101020001F5 +:10B670000088000000000000000000000000000042 :10B6800000000000000000000000000000000000BA :10B6900000000000000000000000000000000000AA :10B6A000000000000000000000000000000000009A :10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A +:10B6C0000000000008000000000000000000000072 +:10B6D0000000000001000000C000010000000000A8 +:10B6E0000000000001000088880001000100888837 +:10B6F0000800000000000200000000000000000040 :10B700000000000000000000000000000000000039 :10B710000000000000000000000000000000000029 :10B720000000000000000000000000000000000019 :10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 +:10B740000000000000008000000009000000000070 +:10B7500000000000000003000000000040000000A6 +:10B7600000000000000041000080000009004100CE +:10B770000080800041000000800000000000000008 :10B7800000000000000000000000000000000000B9 :10B7900000000000000000000000000000000000A9 :10B7A0000000000000000000000000000000000099 :10B7B0000000000000000000000000000000000089 :10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000049 +:10B7D0000000000000410000000000050000000023 +:10B7E00000000000000000000011000000800000C8 +:10B7F0000011000000802000000000000000000098 :10B800000000000000000000000000000000000038 :10B810000000000000000000000000000000000028 :10B820000000000000000000000000000000000018 :10B830000000000000000000000000000000000008 :10B8400000000000000000000000000000000000F8 -:10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 +:10B85000000000000000000100A000000001000046 +:10B860000000000000000000000000010000004097 +:10B870000000000100000040000000000000000087 :10B8800000000000000000000000000000000000B8 :10B8900000000000000000000000000000000000A8 :10B8A0000000000000000000000000000000000098 :10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000000000000000000000000000000048 +:10B8C00000000000000000000000500002E0000046 +:10B8D0000000000000000000000000410000000027 +:10B8E0004000822100000000000000000000000075 +:10B8F00007008221000000E0070082000000000035 :10B900000000000000000000000000000000000037 :10B910000000000000000000000000000000000027 :10B920000000000000000000000000000000000017 @@ -48033,7 +48033,7 @@ :10B9400000000000000000000000000000000000F7 :10B9500000000000000000000000000000000000E7 :10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 +:10B970000000F0F0000000000000F0F00000000007 :10B9800000000000000000000000000000000000B7 :10B9900000000000000000000000000000000000A7 :10B9A0000000000000000000000000000000000097 @@ -48041,7 +48041,7 @@ :10B9C0000000000000000000000000000000000077 :10B9D0000000000000000000000000000000000067 :10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 +:10B9F00000000000F0F0000000000000F0F0000087 :10BA00000000000000000000000000000000000036 :10BA10000000000000000000000000000000000026 :10BA20000000000000000000000000000000000016 @@ -48049,24 +48049,24 @@ :10BA400000000000000000000000000000000000F6 :10BA500000000000000000000000000000000000E6 :10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 +:10BA700000000000FF000000FFFF00003C3C000051 +:10BA8000FFFF0000000000000000000000000000B8 :10BA900000000000000000000000000000000000A6 :10BAA0000000000000000000000000000000000096 :10BAB0000000000000000000000000000000000086 :10BAC0000000000000000000000000000000000076 :10BAD0000000000000000000000000000000000066 :10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 +:10BAF000000000000000FF000000000000003C3CCF :10BB00000000000000000000000000000000000035 :10BB10000000000000000000000000000000000025 :10BB20000000000000000000000000000000000015 :10BB30000000000000000000000000000000000005 :10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 +:10BB50000000000000650006800F200000000000CB +:10BB600000000000000005000A08050000A0000019 +:10BB700000000000000005002A00054000A8054064 +:10BB80002A06054C00A8000000000000000000008C :10BB900000000000000000000000000000000000A5 :10BBA0000000000000000000000000000000000095 :10BBB0000000000000000000000000000000000085 @@ -48074,7 +48074,7 @@ :10BBD0000000000000000000000000000000000065 :10BBE0000000000000000000000000000000000055 :10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 +:10BC000000003C3CFFFF00000000000000000000BE :10BC10000000000000000000000000000000000024 :10BC20000000000000000000000000000000000014 :10BC30000000000000000000000000000000000004 @@ -48082,7 +48082,7 @@ :10BC500000000000000000000000000000000000E4 :10BC600000000000000000000000000000000000D4 :10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000000000B4 +:10BC8000000000003C3C000000000000000000003C :10BC900000000000000000000000000000000000A4 :10BCA0000000000000000000000000000000000094 :10BCB0000000000000000000000000000000000084 @@ -48090,7 +48090,7 @@ :10BCD0000000000000000000000000000000000064 :10BCE0000000000000000000000000000000000054 :10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 +:10BD00000000000000000000F0F000000000000053 :10BD10000000000000000000000000000000000023 :10BD20000000000000000000000000000000000013 :10BD30000000000000000000000000000000000003 @@ -48098,58 +48098,58 @@ :10BD500000000000000000000000000000000000E3 :10BD600000000000000000000000000000000000D3 :10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 +:10BD800000000000000000000000F0F000000000D3 :10BD900000000000000000000000000000000000A3 -:10BDA000000000000000000000000000040000008F -:10BDB0000000000000000000200000000000000063 -:10BDC000000000000004000000000000000000006F -:10BDD000000000000004000000000000000000005F -:10BDE000000000000004000000000000000002004D -:10BDF0000000000000000000000000000000000043 -:10BE0000000000000000000400000000000000002E -:10BE1000000000000000000400000000000000001E -:10BE20000000000000000000000000000000000012 +:10BDA0000000000000000000000040000000000053 +:10BDB0000000000000024000000000000000200021 +:10BDC0002000000200000000000020000000000031 +:10BDD000000000040000200000000000000020001F +:10BDE0002000000040000000C00000002000000013 +:10BDF000000000000004000000000000000000003F +:10BE000000000000000400042000000020000000EA +:10BE1000000000000004000400000000000000001A +:10BE2000000000000004000000020000000000000C :10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 +:10BE400000000002000000000000000000000000F0 +:10BE500000000000000200000000000000000000E0 :10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA000000000000000000000000000040000008E -:10BEB0002000000002000000000000000000000060 +:10BE700000000000000000000002000000000000C0 +:10BE800000000000000000020000000000000000B0 +:10BE900000000000000000020000000000000000A0 +:10BEA0000000000000000002000000000000000090 +:10BEB0000000000000000000000000020000000080 :10BEC0000000000000000000000000000000000072 -:10BED0002000000000000000000000002000000022 +:10BED0000000000000000000000000000000000062 :10BEE0000000000000000000000000000000000052 -:10BEF000000002000000000000000000000002003E -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 -:10BF300000000000000000000000000400000000FD -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000020000000000000000000000BF -:10BF800000000000000000000000000000000000B1 -:10BF90000000000020000000000000000000000081 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 +:10BEF0000000000000000000000000000000000042 +:10BF0000000000000000000000000000020000002F +:10BF10000000000000000000001000000000000011 +:10BF20000000000000000000000000000008000009 +:10BF30002000000000000000000400080084000051 +:10BF40004000200800000008000800000008000071 +:10BF50000000000000000000000800840000000055 +:10BF60000000008400000008000800040000000831 +:10BF700000000000000000000000000800000000B9 +:10BF8000000000000000000000080008000000841D +:10BF90000000000000000000000000080084000015 +:10BFA0000000000000000000000800080000000081 +:10BFB0000000000000000000000000080000000079 +:10BFC0000000000000000000000000000008000366 :10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 +:10BFE0000000000000000000000000000020000031 +:10BFF000000000000000000500000000000000003C :10C000000000000000000000000000000000000030 :10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 +:10C020000003000000000000000000000000000805 :10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 +:10C0400000000000000000000000000000000020D0 :10C0500000000000000000000000000000000000E0 :10C0600000000000000000000000000000000000D0 :10C0700000000000000000000000000000000000C0 :10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 +:10C09000000041000000000000000000000000005F :10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 +:10C0B000000000000000000000000000000000027E :10C0C0000000000000000000000000000000000070 :10C0D0000000000000000000000000000000000060 :10C0E0000000000000000000000000000000000050 @@ -48157,40 +48157,40 @@ :10C10000000000000000000000000000000000002F :10C11000000000000000000000000000000000001F :10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF +:10C1300000000000000008000000000000000000F7 +:10C14000000000A00000000000000000000000004F :10C1500000000000000000000000000000000000DF :10C1600000000000000000000000000000000000CF :10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F +:10C180000000000000000882000000000000000025 +:10C190000000000008000000000000000000000097 +:10C1A000000000000010000000000000000000007F +:10C1B0000000000000000800000000000000000077 :10C1C000000000000000000000000000000000006F :10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F +:10C1E000000000000020000000000000000000002F :10C1F000000000000000000000000000000000003F :10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E +:10C2100000000800000000200000000000000000F6 :10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE +:10C2300000000000000000200000000000000000DE :10C2400000000000000000000000000000000000EE :10C2500000000000000000000000000000000000DE :10C2600000000000000000000000000000000000CE :10C2700000000000000000000000000000000000BE :10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E +:10C2900000000884000000C0008400002100008429 +:10C2A000008400000000000000000000000000000A :10C2B000000000000000000000000000000000007E :10C2C000000000000000000000000000000000006E :10C2D000000000000000000000000000000000005E :10C2E000000000000000000000000000000000004E :10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D +:10C300000000000000000000000000080000000025 +:10C31000000000000000880000000000000900008C +:10C320000000000200000000000200020000000007 :10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED +:10C3400000000000000000000000410000000000AC :10C3500000000000000000000000000000000000DD :10C3600000000000000000000000000000000000CD :10C3700000000000000000000000000000000000BD @@ -48352,80 +48352,80 @@ :10CD300000000000000000000000000000000000F3 :10CD400000000000000000000000000000000000E3 :10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 +:10CD600000000000040020002000880020002000B7 +:10CD7000200000002000200000042004200000000B +:10CD800000000400200000000000C000200020007F +:10CD900020040000200020000000200040000000CF +:10CDA00000002000000320000000000020042000FC +:10CDB0009000000000002000200000002003400040 +:10CDC00000000000400000000000000420002000DF +:10CDD000200000000000200020000000400088002B +:10CDE0000000000020000000000000000000000023 +:10CDF00000820000000000000000000000001000A1 :10CE00000000000000000000000000000000000022 :10CE10000000000000000000000000000000000012 :10CE20000000000000000000000000000000000002 :10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 +:10CE400000004000000000000000000000000000A2 :10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 +:10CE60002000000000000000001008000000020088 +:10CE70000200000004200400000000000010000078 +:10CE80000000000000000000000000004000200042 +:10CE900000000100000000000040020008400840BF +:10CEA0000800080008000800000000000000000062 +:10CEB0000000000000002000000000000000000052 :10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000000091 -:10CFA0000000000000000000000000000000000081 -:10CFB0000000000000000000000000000000000071 +:10CED000000000000000000008000000000000004A +:10CEE00000000000000000000000000180004090F1 +:10CEF00080888008000080018000000000000000A1 +:10CF000000080008000000000000000000002000F1 +:10CF1000208200080800000000000000000000005F +:10CF200000080008000000000000000000000000F1 +:10CF30000000000840880000000000000000000021 +:10CF40000000008400080000000000000000000055 +:10CF500000000088009000004000800000000000F9 +:10CF600000000000000800000000000000000000B9 +:10CF70000009000800200004000000090000000073 +:10CF8000000000000000000000000000000200009F +:10CF90000000000800000000000000000000000089 +:10CFA0000000000000210000000000000000000060 +:10CFB0000000000000000008000000000000000069 :10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 +:10CFD00000000000000800000000900000000000B9 :10CFE0000000000000000000000000000000000041 :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 :10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 +:10D0200000000000000008000000000000000000F8 :10D0300000000000000000000000000000000000F0 :10D0400000000000000000000000000000000000E0 :10D0500000000000000000000000000000000000D0 :10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 +:10D070000010100000000040000000000000080048 +:10D08000000082000000000000000000000082009C :10D090000000000000000000000000000000000090 :10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF +:10D0B0000000000000000000000000000000080068 +:10D0C00000000000000000000000080000008200D6 +:10D0D000000000400000000000008200000000008E +:10D0E0000000000000000000080001000000000037 +:10D0F0000100080110000000100100000000000005 +:10D10000000000000000000000A00000000000007F +:10D110000000000008000000000000000000000007 +:10D1200000000000000000000000040000000000FB :10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF +:10D14000000000000000210000000000400000007E +:10D1500000000800080000000000000000000000BF +:10D1600000000000000000000000000002000000BD +:10D170000000040002000400000300400000002042 :10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F +:10D1900000000000000082001000000000000000FD :10D1A000000000000000000000000000000000007F :10D1B000000000000000000000000000000000006F :10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F +:10D1D000000000000000000000000000100000003F :10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F +:10D1F000000000200000000000000000000000000F :10D20000000000000000000000000000000000001E :10D21000000000000000000000000000000000000E :10D2200000000000000000000000000000000000FE @@ -48433,137 +48433,137 @@ :10D2400000000000000000000000000000000000DE :10D2500000000000000000000000000000000000CE :10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E +:10D27000000000000001000000000800001008404D +:10D28000000000000000000000210000000000007D :10D29000000000000000000000000000000000008E :10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E +:10D2C0000000000008000000000000000000000056 :10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D +:10D2E00040000000000000000000000000000000FE +:10D2F00000000000000000000000000080000001AD +:10D300008801000000001100000000000000000083 :10D31000000000000000000000000000000000000D :10D3200000000000000000000000000000000000FD :10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD :10D3500000000000000000000000000000000000CD :10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D +:10D3700000000000000000000000000008C00020C5 +:10D3800000880090039020820040829000000000FE :10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D +:10D3A0000000000000020002000800400000000031 :10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D :10D3D000000000000000000000000000000000004D :10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C +:10D3F000000000000000000090000000000000801D +:10D40000000000000000A1008080000080000000FB :10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC +:10D4200000000000000000800080000000000000FC :10D4300000000000000000000000000000000000EC :10D4400000000000000000000000000000000000DC :10D4500000000000000000000000000000000000CC :10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C +:10D47000000000000000000011008000000000001B +:10D480008000800580000000800000050000808092 :10D49000000000000000000000000000000000008C :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C :10D4D000000000000000000000000000000000004C :10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B +:10D4F000800000000000000000000000008000002C +:10D500000080880004880410820008000800901041 +:10D510000204000000000000000000000000000005 :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB :10D5400000000000000000000000000000000000DB :10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B +:10D560000000000000000000000000009000080023 +:10D570000000040000000000000000000000002087 +:10D58000000000C02000000400208988401000A096 +:10D5900020200890000000000000000000000000B3 +:10D5A0000000000000000000000000000200000079 :10D5B000000000000000000000000000000000006B :10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B :10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A +:10D5F000000000000000000000000000000021000A +:10D600000088880001000000008000000980800080 +:10D61000008000000000000000000000000000008A :10D6200000000000000000000000000000000000FA :10D6300000000000000000000000000000000000EA :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA :10D6600000000000000000000000000000000000BA :10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D69000000000000000000000000000000000008A +:10D680004100008000000900800000808080800050 +:10D690000000000800000000000000000000000082 :10D6A000000000000000000000000000000000007A :10D6B000000000000000000000000000000000006A :10D6C000000000000000000000000000000000005A :10D6D000000000000000000000000000000000004A :10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 +:10D6F00000000000000000800000000000000000AA +:10D700000000001100000080000002000882840276 +:10D71000040088008288880888000000000000005B :10D7200000000000000000000000000000000000F9 :10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 :10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 +:10D77000000000000000004000C0000000000000A9 +:10D780000000000000010000004000000000000058 +:10D790000000000000000000070000000000000082 :10D7A0000000000000000000000000000000000079 :10D7B0000000000000000000000000000000000069 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 :10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 +:10D7F0000000000000000000000000000006000023 +:10D80000000000000000000000000700822120EF5F +:10D8100000000000F505BFB2AFA2F5F5F5750000F8 :10D8200000000000000000000000000000000000F8 :10D8300000000000000000000000000000000000E8 :10D8400000000000000000000000000000000000D8 :10D8500000000000000000000000000000000000C8 :10D8600000000000000000000000000000000000B8 :10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 +:10D88000000000000000000000000000F0F00000B8 +:10D8900000FF00000000F505BDB0ADA0F5F5F5F501 :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 :10D8C0000000000000000000000000000000000058 :10D8D0000000000000000000000000000000000048 :10D8E0000000000000000000000000000000000038 :10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 -:10D9300000000000000000000000000000000000E7 +:10D900000000000000000000000000000000F0F037 +:10D9100000000FC30FAA004380C355141515F5F07E +:10D92000FFF0000000000000000000000000000008 +:10D93000000000000000000000003C3C3C3C0000F7 :10D9400000000000000000000000000000000000D7 :10D9500000000000000000000000000000000000C7 :10D9600000000000000000000000000000000000B7 :10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 +:10D980007F7F707000000000000000000000FFFFBB +:10D990000000FFFFF0C3F0AA004180C15555555566 +:10D9A000F4F0FFF0000000000000000000000000A4 +:10D9B000000000000000000000000000FFF00F0069 :10D9C0000000000000000000000000000000000057 :10D9D0000000000000000000000000000000000047 :10D9E0000000000000000000000000000000000037 :10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 -:10DA200000000000000000000000000000000000F6 +:10DA000000004F4F404000000000000000000000F8 +:10DA100000000000000000005000001000000000A6 +:10DA200000080010000000000000000000000000DE :10DA300000000000000000000000000000000000E6 :10DA400000000000000000000000000000000000D6 :10DA500000000000000000000000000000000000C6 :10DA600000000000000000000000000000000000B6 :10DA700000000000000000000000000000000000A6 :10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 +:10DA900005002A00054000A800000000000000006A :10DAA0000000000000000000000000000000000076 :10DAB0000000000000000000000000000000000066 :10DAC0000000000000000000000000000000000056 @@ -48596,193 +48596,193 @@ :10DC700000000000000000000000000000000000A4 :10DC80000000000000000000000000000000000094 :10DC90000000000000000000000000000000000084 -:10DCA000000004000000000000000000000000046C -:10DCB0000000000000000000000000000000000460 -:10DCC0000000000000000000000000000000000450 -:10DCD0000000000000000000000000000000000440 -:10DCE0000000000000000000000000000000000034 -:10DCF0000004000000000000000000000000000020 -:10DD00000000000000000000000000000000000013 -:10DD100000040000000000000000000000000000FF -:10DD200000040000000000000000000000000000EF -:10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000000000000C3 +:10DCA0008400200040004000400000000400840088 +:10DCB0002000200020002000200020000004200080 +:10DCC0002000000040002000200084002000A00070 +:10DCD000200020002000C0002000000000042000E0 +:10DCE000000384000000400020000000000020002D +:10DCF00020042000200020004000000084000008D4 +:10DD000020002000C0002000C000C000400020040F +:10DD100000042000200000000000000000000011AE +:10DD20002004100000C020000000000000000000DF +:10DD30000000000000000000000000000090000053 +:10DD40000000000000000000000000020000004091 +:10DD500020000000000000000000000000000000A3 :10DD600000000000000000000000000000000000B3 :10DD700000000000000000000000000000000000A3 :10DD80000000000000000000000000000000000093 -:10DD90000000000000000000000000000000000083 -:10DDA0000000000000002000000000000000000053 -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000002000000000000000000033 +:10DD900000900000000000000000000000000000F3 +:10DDA0000000000000000000000000002000200033 +:10DDB0008204200001000100400008000000000073 +:10DDC0000002000000002000000000000000000031 :10DDD0000000000000000000000000000000000043 -:10DDE0000000000000000000000000000000000033 -:10DDF0000000000000000000000000000000000023 -:10DE00000000000000000000000000000000000012 -:10DE10000000000000000000000000000000000002 -:10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000000000000000E2 -:10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000000000000B2 -:10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000000000092 -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 +:10DDE00000004000000000000000000000000000F3 +:10DDF00020000000000000000000200000000000E3 +:10DE00000000000000000080000001008900000008 +:10DE10000000000000000000000000000000020000 +:10DE200000000000000009000000008400008900DC +:10DE30008000090580841004020080008008000032 +:10DE400000000090000040000000040000000000FE +:10DE500000000008008409000000000020084008BD +:10DE600000080008C10800000000000000000000D9 +:10DE70000008000000040000000000000900000885 +:10DE8000000800080010008400020000200040008C +:10DE900000840000000000000000000000000008F6 +:10DEA00080040008000400000000001100000000D1 +:10DEB0000009000000000008001100200009000017 +:10DEC000000000080000000800050000000000003D :10DED0000000000000000000000000000000000042 -:10DEE0000000000000000000000000000000000032 -:10DEF0000000000000000000000000000000000022 +:10DEE00000000000000000400000000000000000F2 +:10DEF00000000000000000000000008000000000A2 :10DF00000000000000000000000000000000000011 -:10DF10000000000000000000000000000000000001 -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000000000000E1 -:10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000000000000C1 +:10DF100000000000000000000008000000000000F9 +:10DF2000000000080000000000000002008840001F +:10DF30000084000000400000000000840088000011 +:10DF400000000000000000000300000000000000CE +:10DF50000000004000000000004000000000000041 :10DF600000000000000000000000000000000000B1 -:10DF700000000000000000000000000000000000A1 -:10DF80000000000000000000000000000000000091 -:10DF90000000000000000000000000000000000081 -:10DFA0000000000000000000000000000000000071 -:10DFB0000000000000000000000000000000000061 -:10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000000000000031 -:10DFF0000000000000000000000000000000000021 -:10E0000000000000002000000000000000000000F0 -:10E010000000000000000000000000000000000000 -:10E0200000000000002000000000000000000000D0 -:10E0300000000000000000000000000000000000E0 -:10E0400000000000000000000000000000000000D0 +:10DF70000000000000000000000000000040000061 +:10DF80000000000000000000000000880000000009 +:10DF9000000000000000000000000000030000007E +:10DFA000000000000000000000000000040000006D +:10DFB00000090880000000000020820082000000AC +:10DFC00004000000000000000800000582000000BE +:10DFD000820000000000000082000000C00000007D +:10DFE0000000000000000800000000000000080021 +:10DFF000000008000000080000000000000082008F +:10E000000000000009000000000000000000820085 +:10E0100000040000080000000000000000001040A4 +:10E020000000080082000000000000000100000065 +:10E0300000000088412000000000000841000000AE +:10E04000000041001000000000000000000010006F :10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 -:10E0700000000000000000000000000000000000A0 -:10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000000000060 -:10E0C0000000000000000000000000000000000050 -:10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 +:10E0600000000300000000000000000000000000AD +:10E070000000100000000800000000000000000088 +:10E08000008200000000040000000000000000000A +:10E09000210000010000000000000000000021003D +:10E0A0000000000000000000000008000000040064 +:10E0B00008008211000000040000080000000800B1 +:10E0C0000000400000000000000000000000000010 +:10E0D00000000000080000000000C0000000000078 +:10E0E00040000000000040000000000000000000B0 :10E0F0000000000000000000000000000000000020 -:10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000000000FF -:10E1200000000000000000000000000000000000EF -:10E1300000000000000000000000000000000000DF -:10E1400000000000000000000000000000000000CF +:10E10000000000000000002000008200000000006D +:10E1100000400000000000000000000000000000BF +:10E1200000000000000000000800000000000020C7 +:10E1300000000088000404000004000240040902FA +:10E140000990000000000000000000000000000036 :10E1500000000000000000000000000000000000BF :10E1600000000000000000000000000000000000AF :10E17000000000000000000000000000000000009F -:10E18000000000000000000000000000000000008F +:10E18000000000000000000000010000000000008E :10E19000000000000000000000000000000000007F -:10E1A000000000000000000000000000000000006F -:10E1B000000000000000000000000000000000005F -:10E1C000000000000000000000000000000000004F -:10E1D000000000000000000000000000000000003F -:10E1E000000000000000000000000000000000002F -:10E1F000000000000000000000000000000000001F -:10E20000000000000000000000000000000000000E -:10E2100000000000000000000000000000000000FE -:10E2200000000000000000000000000000000000EE -:10E2300000000000000000000000000000000000DE -:10E2400000000000000000000000000002000000CC -:10E2500000000000000000000000000000000000BE +:10E1A0000020080000000000000000000000000047 +:10E1B000000100840010000000000000C00000000A +:10E1C0000800000200210000000500000008000017 +:10E1D000000800000000000000000020000800000F +:10E1E00000000000000084000000000000000000AB +:10E1F0000000000000000008000000000000000017 +:10E200008200000000000000000000000000080084 +:10E21000000000000000000000000000820000027A +:10E2200000080000000000000000000000000000E6 +:10E2300000000000000003A010A000000000080281 +:10E2400005020000100000000000000000000000B7 +:10E2500000000000000000000500000000000000B9 :10E2600000000000000000000000000000000000AE :10E27000000000000000000000000000000000009E :10E28000000000000000000000000000000000008E :10E29000000000000000000000000000000000007E :10E2A000000000000000000000000000000000006E -:10E2B000000000000000000000000000000000005E -:10E2C000000000000000000000000000000000004E +:10E2B00000000000000000009000000000001000BE +:10E2C000000000000100000000000000000000004D :10E2D000000000000000000000000000000000003E :10E2E000000000000000000000000000000000002E -:10E2F000000000000000000000000000000000001E -:10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD +:10E2F0000001050190000001000000000000000086 +:10E300000000000000000000000000009004000079 +:10E3100000000000000000000000000000001101EB :10E3200000000000000000000000000000000000ED -:10E3300000000000000000000000000000000000DD -:10E3400000000000000000000000000000000000CD +:10E33000000000009000000200000000000000004B +:10E3400000000000000004000000000000000000C9 :10E3500000000000000000000000000000000000BD :10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D -:10E3A000000000000000000000000000000000006D -:10E3B000000000000000000000000000000000005D -:10E3C000000000000000000000000000000000004D -:10E3D000000000000000000000000000000000003D +:10E3700000000010A11000080010000000000000C4 +:10E38000000000000000000000000000110080807C +:10E39000000000000000000000000000000908204C +:10E3A0000811002000000000000000000000000034 +:10E3B000000000001100800000800000000000004C +:10E3C000800080000009000000090000C10020005A +:10E3D0008510C100000000000000000000000000E7 :10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000001D +:10E3F00000000000100010001000030800000000E2 :10E40000000000000000000000000000000000000C -:10E4100000000000000000000000000000000000FC -:10E4200000000000000000000000000000000000EC -:10E4300000000000000000000000000000000000DC -:10E4400000000000000000000000000000000000CC -:10E4500000000000000000000000000000000000BC +:10E410000080000000800000000000000000088074 +:10E4200008002000210000000000000000000000A3 +:10E4300000000000000000000080000000802000BC +:10E440009000A0009000000000000000000002000A +:10E4500008000501C14000000000000000000000AD :10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C +:10E470000000000000000100010001000101000097 :10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C -:10E4C000000000000000000000000000000000004C +:10E4900000000020000000C000000000000000009C +:10E4A0000104000000000100000000000000000066 +:10E4B000000000000000000000000020000000C07C +:10E4C00000040010000800820000020000000000AC :10E4D000000000000000000000000000000000003C :10E4E000000000000000000000000000000000002C -:10E4F000000000000000000000000000000000001C +:10E4F000000000000000000000010000000100001A :10E50000000000000000000000000000000000000B -:10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000000000000CB -:10E5500000000000000000000000000000000000BB +:10E5100000000100008888000100000000000000E9 +:10E5200000000001010100000100000000000000E7 +:10E5300000000000000000000000010000888800CA +:10E5400001000080000000000080000000000000CA +:10E5500004000000000000000000000000000000B7 :10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C000000000000000000000000000000000004B -:10E5D000000000000000000000000000000000003B +:10E57000000000000000000000000021030503214E +:10E58000002000000000000000000000000000006B +:10E5900000000000410000800000090000000000B1 +:10E5A000000000000008030803200208000000002B +:10E5B000000000000000000000000000410000809A +:10E5C00000000900000200C0000000000000000080 +:10E5D00000000000008000000000000300000000B8 :10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A -:10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000000000EA -:10E6300000000000000000000000000000000000DA -:10E6400000000000000000000000000000000000CA -:10E6500000000000000000000000000000000000BA +:10E5F0000000000000000000000000001080084043 +:10E6000020000340000000000000000000000000A7 +:10E610000000000000000011000000800000000069 +:10E620000000000000001000092003000820000086 +:10E6300000000000000000000000000000000011C9 +:10E64000000000800000000000200090000000009A +:10E6500000000000000000040090004000000000E6 :10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000000000000009A -:10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A -:10E6A000000000000000000000000000000000006A +:10E670000000000000000000000000000000010891 +:10E680000100000001000000000000000000000088 +:10E690000000000000000000000100000040000039 +:10E6A00000000000000000000182000001000100E5 :10E6B000000000000000000000000000000000005A -:10E6C000000000000000000000000000000000004A -:10E6D000000000000000000000000000000000003A +:10E6C0000001000000400000000000000700000002 +:10E6D000500000E00000000000000000000000000A :10E6E000000000000000000000000000000000002A :10E6F000000000000000000000000000000000001A :10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000000F9 -:10E7200000000000000000000000000000000000E9 +:10E7100000000000000000000000000000000700F2 +:10E7200082210000000000000000000000E0000066 :10E7300000000000000000000000000000000000D9 -:10E7400000000000000000000000000000000000C9 -:10E7500000000000000000000000000000000000B9 +:10E740000000000000000700822100000000FFF030 +:10E75000FFF20000000000000000000000000000C8 :10E7600000000000000000000000000000000000A9 :10E770000000000000000000000000000000000099 :10E780000000000000000000000000000000000089 :10E790000000000000000000000000000000000079 -:10E7A0000000000000000000000000000000000069 +:10E7A0000000F0F000000000000000000000000089 :10E7B0000000000000000000000000000000000059 -:10E7C0000000000000000000000000000000000049 -:10E7D0000000000000000000000000000000000039 +:10E7C00000000000000000000000F0F00000000069 +:10E7D00000F000B000000000000000000000000099 :10E7E0000000000000000000000000000000000029 :10E7F0000000000000000000000000000000000019 :10E800000000000000000000000000000000000008 :10E8100000000000000000000000000000000000F8 -:10E8200000000000000000000000000000000000E8 +:10E8200000000000F0F00000000000000000000008 :10E8300000000000000000000000000000000000D8 -:10E8400000000000000000000000000000000000C8 +:10E84000000000000000000000000000F0F00000E8 :10E8500000000000000000000000000000000000B8 :10E8600000000000000000000000000000000000A8 :10E870000000000000000000000000000000000098 @@ -48791,479 +48791,479 @@ :10E8A0000000000000000000000000000000000068 :10E8B0000000000000000000000000000000000058 :10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 +:10E8D00000000000040DF4FD000000000000000036 +:10E8E000000000000C6E0CFF0000000000000000A3 :10E8F0000000000000000000000000000000000018 :10E900000000000000000000000000000000000007 :10E9100000000000000000000000000000000000F7 -:10E9200000000000000000000000000000000000E7 +:10E92000000000FF0000FFFF0000000000000000EA :10E9300000000000000000000000000000000000D7 -:10E9400000000000000000000000000000000000C7 -:10E9500000000000000000000000000000000000B7 -:10E9600000000000000000000000000000000000A7 +:10E94000000000000000000000000F0F0000FFFFAB +:10E950000000000000000000FFFF000000000000B9 +:10E960000000000000000C6E0C0C00000000000015 :10E970000000000000000000000000000000000097 :10E980000000000000000000000000000000000087 :10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000000000000000067 +:10E9A0000000000000FF0000000000000000000068 :10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000000000000000047 -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 +:10E9C0000000000000000000000000000F0F000029 +:10E9D00000000000000000000000000000610007CF +:10E9E000800D000000610006000D00050000000021 :10E9F0000000000000000000000000000000000017 -:10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 -:10EA200000000000000000000000000000000000E6 -:10EA300000000000000000000000000000000000D6 -:10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000000000B6 +:10EA0000000000000000000000000000006100069F +:10EA1000000D0000000000000000000000000000E9 +:10EA200000000000000005002A00054000A80000CA +:10EA3000000000000000006100050005000000006B +:10EA400000000000000000000000000000000500C1 +:10EA50002A00054000A8000000000000000000009F :10EA600000000000000000000000000000000000A6 :10EA70000000000000000000000000000000000096 -:10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000000076 +:10EA80000000000000000000000000000000300F47 +:10EA90000000FA00F2F20000000000000000000098 :10EAA0000000000000000000000000000000000066 -:10EAB0000000000000000000000000000000000056 +:10EAB000000000000000000055553F3055F355F0B0 :10EAC0000000000000000000000000000000000046 :10EAD0000000000000000000000000000000000036 :10EAE0000000000000000000000000000000000026 :10EAF0000000000000000000000000000000000016 :10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 +:10EB100030000000FF00F7F70000000000000000D8 :10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000000000D5 -:10EB400000000000000000000000000000000000C5 +:10EB30000000000000000000000055553F30FFF3CA +:10EB4000FFF00000000000000000000000000000D6 :10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000000095 +:10EB60000000000000000000000000000000BCBC2D +:10EB7000A0FF0000000000000000000000000000F6 :10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000075 +:10EB900000003C0FFF5500020000000000000000D4 :10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000000045 +:10EBB00000000000000000000000000000E8C3E8C2 +:10EBC000FFFF2C28000000000000000000000000F3 :10EBD0000000000000000000000000000000000035 :10EBE0000000000000000000000000000000000025 -:10EBF0000000000000000000000000000000000015 +:10EBF000A0A0A0A000000000000000000000000095 :10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 +:10EC1000000000003C0F00550F020F000000000034 :10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000000000000000D4 -:10EC400000000000000000000000000000000000C4 -:10EC500000000000000000000000000000000000B4 -:10EC600000000000000300000000000000000000A1 -:10EC7000000000008800000000000000000000000C -:10EC80000000000000000000000000000000000084 -:10EC90000000000000000000000000000000000074 -:10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 -:10ECC0000000000000000000000000000000000044 -:10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000000000024 -:10ECF0000000000000000000000000000000000014 -:10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 -:10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000000083 -:10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 +:10EC300000000000000000000000000000003CE8B0 +:10EC4000FFE855550400000000000000000000002F +:10EC50000000000000000000000000000000400074 +:10EC6000880800000020200820002000200200006A +:10EC700000002000840388002000200020002000E5 +:10EC800020000004000420000000880000000000B4 +:10EC9000400020000400000040008804A0000001A3 +:10ECA00020002000880088002000C0008800880024 +:10ECB00040002000200040030400880000001000F5 +:10ECC0002000400020000000400000000000400044 +:10ECD0002000200020038800000088008800000039 +:10ECE0000000000000000001000000000000000023 +:10ECF000000000000900000000000000000000000B +:10ED000000000000000000004000000000000000C3 +:10ED100000000000000000000900000000020000E8 +:10ED20000000000000000000000010004000000093 +:10ED30001000000000000000200000000000200083 +:10ED400000000000000000002100000000000000A2 +:10ED50000000000000000000000020000000000093 +:10ED60002000100200804000000008001080000019 +:10ED70000100400000020000000000000000000050 +:10ED80000000020000000010001000000000000061 +:10ED900000000000000040000000880000000000AB +:10EDA00000000000000000000000000088000000DB :10EDB0000000000000000000000000000000000053 -:10EDC0000000000000000000000000000000000043 +:10EDC00000000000824000400000000084000000BD :10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 -:10EDF0000000000000000000000000000000000013 -:10EE00000000000000000000000000000000000002 -:10EE100000000000000000000000000000000000F2 -:10EE200000000000000000000000000000000000E2 -:10EE300000000000000000000000000000000000D2 -:10EE400000000000000000000000000000000000C2 -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 -:10EE70000000000000000000000000000000000092 -:10EE80000000000000000000000000000000000082 -:10EE90000000000000000000000000000000000072 -:10EEA0000000000000000000000000000000000062 +:10EDE00000000000C108002080882000849080106E +:10EDF0000484080880002001400041084004000805 +:10EE000005040500001000080000090000082000AB +:10EE10000084418200000004410041080000040217 +:10EE2000000000000000400040400000000000889A +:10EE3000000000000000000000004000000800008A +:10EE40000000090000004000000000000000000079 +:10EE50000000000000000000000000000082000030 +:10EE6000000000000000824001008210024000000B +:10EE70001000040090214000000000040000002069 +:10EE80000100000900200000000000000000000058 +:10EE900000009000000000000000000000000000E2 +:10EEA0000000000900000000000000000000000059 :10EEB0000000000000000000000000000000000052 :10EEC0000000000000000000000000000000000042 -:10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000000000000012 -:10EF00000000000000000000000000000000000001 -:10EF100000000000000000000000000000000000F1 +:10EED000000004000000000000000000000000002E +:10EEE0000000000000000000008804000000000096 +:10EEF00000048384000800000004000000020000F9 +:10EF000000000800000000000000000000000000F9 +:10EF100000004000000008000000000000000300A6 :10EF200000000000000000000000000000000000E1 :10EF300000000000000000000000000000000000D1 -:10EF400000000000000000000000000000000000C1 -:10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 -:10EF70000800000000000000000000000000000089 -:10EF80000000000000000000000000000000000081 -:10EF90000000000000000000000000000000000071 -:10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC0000000000000000000000000000000000041 -:10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 -:10F0100000000000000002000000000000000000EE -:10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000200000000000000CE +:10EF4000000000000800020008001100000000009E +:10EF50000000000000880000000000000000000029 +:10EF60000000000000000400000004C000000800D1 +:10EF70000020A0000003100082000000000210002A +:10EF800008000800008282008200000000000000EB +:10EF9000A0008200000008008200000000000400C1 +:10EFA00008000800080008008200000000000800B7 +:10EFB0000000000082008200080000000000000045 +:10EFC00000000000840000000000000000000800B5 +:10EFD0001000080008000800080008000040820037 +:10EFE0008200100082000800C000820000210000A2 +:10EFF00000000001002008000000000000000001E7 +:10F00000002021000000004100001000000000006E +:10F0100003000500400008000000000000000000A0 +:10F0200010000000000000000000080000000000C8 +:10F03000000003000000000040000000000000008D :10F0400000000000000000000000000000000000C0 -:10F0500000000000000000000200000000000000AE -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F090000000000000000000000000000000000070 -:10F0A0000000000000000000000000000000000060 +:10F05000000000004100030010000000000000005C +:10F06000000000000000000003004100000000005C +:10F070001180040082204000000000200840102081 +:10F0800000000000040000008800000300000000F1 +:10F090000040000000000000000000000800000028 +:10F0A0001000000000000000000000000000000050 :10F0B0000000000000000000000000000000000050 -:10F0C0000000000000000000000000000000000040 +:10F0C00000000000000000008200000000000000BE :10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000000FF +:10F0E0000000080000000800000000000000000010 +:10F0F00040000420402005010000404009000000BD +:10F100001000210000041140000000000000000079 :10F1100000000000000000000000000000000000EF -:10F1200000000000000000000000000000000000DF +:10F1200000000000000000004000050011044088BD :10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF +:10F1400000000000000000000084008800000000B3 +:10F15000000011040002000400880000000000000C :10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F -:10F19000000000000000000000000000000000006F +:10F170000084082009801021000400210400000000 +:10F1800090000000000800000000000000000000E7 +:10F190001000000900000000000000000000000056 :10F1A000000000000000000000000000000000005F :10F1B000000000000000000000000000000000004F :10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F +:10F1D000000000020000000000000000000000002D :10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F2000000000000000000001100030000000000EA +:10F1F00000000000000104200800000021000000C1 +:10F200000088000000001000410000000300000022 :10F2100000000000000000000000000000000000EE -:10F2200000000000000000000000080000000000D6 -:10F2300000000000000000000000000000000000CE -:10F2400000000000000000000000000000000000BE +:10F220000000000000000000410000004100080054 +:10F2300000020000000000000000000000000800C4 +:10F2400000000000000200000300000000000000B9 :10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E -:10F29000000000000000000000000000000000006E +:10F26000000000000000000000000000000241005B +:10F27000080000200000A010019004C0000803A0B6 +:10F280000102021088100000000000000000C00011 +:10F290000091008910100000000000000000000034 :10F2A000000000000000000000000000000000005E :10F2B000000000000000000000000000000000004E :10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E :10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F3000000000000000000000000000000000000FD -:10F3100000000000000000000000000000000000ED +:10F2F000000000000000000000002100800000006D +:10F30000A0804080808000002000002100080003D1 +:10F3100080110008000580200000000000000000AF :10F3200000000000000000000000000000000000DD :10F3300000000000000000000000000000000000CD :10F3400000000000000000000000000000000000BD :10F3500000000000000000000000000000000000AD :10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D -:10F38000000000000000000000000000000000007D -:10F39000000000000000000000000000000000006D +:10F370000000000000000000000088008811054027 +:10F38000C1C1000000038080008000000000000078 +:10F3900000088000000080008003000000000000E2 :10F3A000000000000000000000000000000000005D :10F3B000000000000000000000000000000000004D :10F3C000000000000000000000000000000000003D :10F3D000000000000000000000000000000000002D :10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D -:10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC +:10F3F0000000000000000000000000008940410003 +:10F4000089C103A10800900140A082A00040000033 +:10F410000000000108000000A00002100000000031 :10F4200000000000000000000000000000000000DC :10F4300000000000000000000000000000000000CC :10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000000007C -:10F49000000000000000000000000000000000006C +:10F470000000000000000000000000000000829179 +:10F4800000040088A00090090009009110A100006C +:10F490000000000000000000018800088802000051 :10F4A000000000000000000000000000000000005C :10F4B000000000000000000000000000000000004C :10F4C000000000000000000000000000000000003C :10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C :10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB -:10F5100000000000000000000000000000000000EB +:10F50000800400A00040000500080008004000C181 +:10F510000000000020000000000010000800008033 :10F5200000000000000000000000000000000000DB :10F5300000000000000000000000000000000000CB :10F5400000000000000000000000000000000000BB :10F5500000000000000000000000000000000000AB :10F56000000000000000000000000000000000009B :10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000007B -:10F59000000000000000000000000000000000006B -:10F5A000000000000000000000000000000000005B +:10F580000000820820218200041100000005800094 +:10F5900080000821210008000000210003802000D5 +:10F5A0000900000000000000000000000000000052 :10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B :10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA -:10F6100000000000000000000000000000000000EA -:10F6200000000000000000000000000000000000DA +:10F600000000000009001090031089002000204035 +:10F610000408820000010000000000000100000258 +:10F6200000200100000000000000000000000000B9 :10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA :10F6500000000000000000000000000000000000AA :10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A +:10F68000000000000000000000000700000600006D :10F69000000000000000000000000000000000006A -:10F6A000000000000000000000000000000000005A +:10F6A00000000000880000000000000000000000D2 :10F6B000000000000000000000000000000000004A :10F6C000000000000000000000000000000000003A :10F6D000000000000000000000000000000000002A :10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 -:10F7100000000000000000000000000000000000E9 -:10F7200000000000000000000000000000000000D9 +:10F7000000000000000000001BB10FA5AFC3AFC395 +:10F7100000000000F0B030B0000000000000000069 +:10F7200000000000AAFFA0A00000000000000000F0 :10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 :10F7500000000000000000000000000000000000A9 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 -:10F780000000000000000000000000000000000079 -:10F790000000000000000000000000000000000069 -:10F7A0000000000000000000000000000000000059 +:10F78000000000000000000000005AF04EE4AFC38B +:10F79000AFC3FF00FFF1F3B333B30000000000007C +:10F7A000000000000000AAFFF5F5000000000000C6 :10F7B0000000000000000000000000000000000049 :10F7C0000000000000000000000000000000000039 :10F7D0000000000000000000000000000000000029 :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 -:10F8200000000000000000000000000000000000D8 +:10F8000000000000000000000000000000FF04FBFA +:10F810005CFCA303303C3034FBBAEFAE00000000C8 +:10F8200000000000F0BEF0BE828200AA00000000CE :10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 :10F870000000000000000000000000000000000088 -:10F880000000000000000000000000000000000078 -:10F890000000000000000000000000000000000068 -:10F8A0000000000000000000000000000000000058 +:10F88000000000000000000000000000000000FF79 +:10F8900000FF0C0CF3F33C3C3434088A20A2000037 +:10F8A000000000000000F0BEF0BE3C3CFF00000085 :10F8B0000000000000000000000000000000000048 :10F8C0000000000000000000000000000000000038 :10F8D0000000000000000000000000000000000028 :10F8E0000000000000000000000000000000000018 :10F8F0000000000000000000000000000000000008 :10F9000000000000000000000000000000000000F7 -:10F9100000000000000000000000000000000000E7 -:10F9200000000000000000000000000000000000D7 +:10F910000061000E001D000000610006000D0000E7 +:10F9200000610006000D000000614006000D0001AE :10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 -:10F990000000000000000000000000000000000067 -:10F9A0000000000000000000000000000000000057 +:10F990000000CFCF0C0CCFCA4F4A000000004545F5 +:10F9A0003C0000FFFAA000000000303330330000BC :10F9B0000000000000000000000000000000000047 :10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 :10F9E0000000000000000000000000000000000017 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 -:10FA200000000000000000000000000000000000D6 +:10FA10000000000014D714D7C5C045400000000006 +:10FA2000CFCF3C000AA5A5FA00000000F0FF0000BF :10FA300000000000000000000000000000000000C6 :10FA400000000000000000000000000000000000B6 :10FA500000000000000000000000000000000000A6 :10FA60000000000000000000000000000000000096 :10FA70000000000000000000000000000000000086 :10FA80000000000000000000000000000000000076 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000000000000000000000000000056 -:10FAB0000000000000000000000000000000000046 +:10FA900000000000000000000000F3030505000066 +:10FAA000000000000000033F033F00000000999C9D +:10FAB000C9CC0000000000000000000000000000B1 :10FAC0000000000000000000000000000000000036 :10FAD0000000000000000000000000000000000026 :10FAE0000000000000000000000000000000000016 :10FAF0000000000000000000000000000000000006 :10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB200000000000000000000000000000000000D5 -:10FB300000000000000000000000000000000000C5 +:10FB1000000000000000000000000000F3030505E5 +:10FB200000000000000000003F033F030000000051 +:10FB3000393C696C0000000000000000000000007B :10FB400000000000000000000000000000000000B5 :10FB500000000000000000000000000000000000A5 :10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 -:10FB90000000000000000000000000000000000065 -:10FBA0000000000002000000000200002000000031 -:10FBB00000000000000000000004000000008800B9 -:10FBC0000200880020000000000200000000000089 -:10FBD000000000000000000000040003000000001E -:10FBE0002000200088002000000000040000000029 -:10FBF0000000000000000000000000040000000001 -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000400000000E0 -:10FC200000000000000000000000000000000000D4 -:10FC300000000000000000000000000100000000C3 -:10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000000100000000A3 -:10FC60000000000000000000000000000000000094 -:10FC70000000000000000000000000000001000083 -:10FC80000000000000000000000000000000000074 -:10FC90000000000000000000000000000001000063 -:10FCA0000000000000000000000000000000000054 -:10FCB0000000000020000000000000000000000024 -:10FCC0000000000000000000000000000000000034 -:10FCD0000200000000000000000000000000000022 +:10FB900000000000000000000000000088030000DA +:10FBA00088004000880040042004200040004000FD +:10FBB0002000200088022088218004022000880084 +:10FBC00020000000880020040000880088008800D1 +:10FBD00020000004880084002082000320008800A8 +:10FBE00000008400040020002004000200008800BF +:10FBF0008800200000000000880820828800200083 +:10FC0000000020002000000000000002880000002A +:10FC100088002000A00000000088208800820000EA +:10FC20000000200000000000000000840902000025 +:10FC300009000000000000040005040800000000A6 +:10FC4000000000002000000000020004000020006E +:10FC50000400000000000000000000090000000097 +:10FC60000000000004000000000000000008000088 +:10FC700000000000000000004100000900094000F1 +:10FC800000000000000000000000009000000000E4 +:10FC9000000000000000000000004121000490006E +:10FCA000000000004000000000000000000088008C +:10FCB0000004000000000000000000000000000040 +:10FCC0000000000000210000000000000000000013 +:10FCD00000000000000000000000008000000000A4 :10FCE0000000000000000000000000000000000014 -:10FCF0000000020000000000000000000000000002 +:10FCF00040000000000000000000000000000000C4 :10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000000008CB -:10FD300000000000000000000008000000000000BB -:10FD400000000000000000000000000000000004AF -:10FD5000000020000000000000080000000000007B -:10FD60000000000000000000000000000000000093 -:10FD7000000000000000000000000008000000007B -:10FD80000000000000000000000000000000000073 -:10FD9000000000000000000000000008000000005B -:10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000000000000043 -:10FDC0000000000000000000000000000000000033 -:10FDD0000000000000000000000000000000000023 +:10FD10000000000000000000000000000000008063 +:10FD200000082000200000820408000820020000D3 +:10FD30000000000000000000000000000008400873 +:10FD40000084040000000000008200820000000027 +:10FD5000040000000000000000002000000800086F +:10FD60000000040000000900000000000000000086 +:10FD70000000000000000000000000000000000083 +:10FD8000000800000000000000000000000000006B +:10FD900000840000000000000000000000000008D7 +:10FDA00000020000000020000400840004000400A1 +:10FDB00000000020400000000004000000000409D2 +:10FDC0004090000000000000004000000000000023 +:10FDD00040000403000000000400000000000400D4 :10FDE0000000000000000000000000000000000013 :10FDF0000000000000000000000000000000000003 -:10FE000000000000002100000000000000000000D1 -:10FE100000000000000400000000000000000000DE -:10FE200000000000000000000000000000000000D2 -:10FE30000000004000000000000000000000000082 -:10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 -:10FE80000000000000000000000000000000000072 -:10FE90000000000000000000000000000000000062 -:10FEA000000000000000000002000000020010003E -:10FEB000000000000000A000C000A00000008200C0 -:10FEC00000008400000082008200820002008200A4 -:10FED0000000000000008200820090000000A000EE -:10FEE0000000000000000000820082008200080084 -:10FEF0000800000000000000820082008200000074 -:10FF000082000000000000008200820082000800E1 -:10FF1000820000000000000000000000000000005F -:10FF200000000000000000000000000000000000D1 -:10FF300000000000000000000000000000000000C1 -:10FF400000000000000000000000000000000000B1 -:10FF500000000000000000000000000000000000A1 +:10FE00000000008000002000000000002000000032 +:10FE100000000400000000000000000000000000DE +:10FE2000008008A0000011022100002005000090C1 +:10FE300041A02100000000000088412000000000D7 +:10FE400080209005000000000090030000000000EA +:10FE50000500030000000500000000840000000011 +:10FE6000000000000000000005000000000000008D +:10FE7000000000000000080000000000000000007A +:10FE8000000000000004000000000000000000006E +:10FE90000002000000000000000000000000000060 +:10FEA000000000048009080000021000A00000000B +:10FEB00008000000822084208441080082000000A5 +:10FEC000A0000000820082008200100010000000EC +:10FED00008000000000000000800C00082000800C8 +:10FEE000C000080000000000000008000800080032 +:10FEF0000000000082000000C0000800080082002E +:10FF0000A0000800080084000800820004008200AD +:10FF10001000080000000000000008000800820037 +:10FF200000008200080000001088000020900000FF +:10FF30000000100021000000100000000000000080 +:10FF40000400080004000000100000000000400051 +:10FF50000000000000000000080000000000000099 :10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 +:10FF7000030000000000000004000000000000007A +:10FF80000000000000000000000000000800000069 :10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000000000000800000049 -:10FFB000C00000000000C0000000000000000000C1 -:10FFC0000000000000000000000000000000000031 -:10FFD000000000000000820000000000000000009F -:10FFE000000000000000000000050000000000000C -:10FFF0000000000000000000000000000000000001 +:10FFA0000000000000000000000000000000080049 +:10FFB0001000900000001000000000000000002071 +:10FFC0000000000000000000000084000000100499 +:10FFD0000000000000000800840000000004080089 +:10FFE000000000000000000000200000A000000051 +:10FFF0000000000082008200820000000000000477 :02000004000CEE -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000000000000A0 -:100060000000000000000000000000000000000090 +:100000000000000000001000000000008800000058 +:100010008200000000000000080000000000000056 +:1000200000000000400084000000000040904002FA +:10003000000409A0059010400010402000000000BE +:100040000000009040040000000400900000000048 +:10005000000000000000000000040000000000009C +:10006000000000000020000000200002000000004E :100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 +:1000800000000000000000200020000000000088A8 +:10009000000000000000000000000002000000005E :1000A0000000000000000000000000000000000050 -:1000B000000000000000C0000200820000000000FC -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000080000000000840094 -:1000E0000000000000000000000000000000000010 -:1000F000000000000800004082000800A00000008E -:1001000000000000000000000000000000000000EF -:10011000000000000800000008000800A000000027 -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF +:1000B00000000400C00000008200000000000000FA +:1000C0000800000084000000000000009000000014 +:1000D00000000000A0000000080000000800000070 +:1000E00000000000A000900000000000900400004C +:1000F0000000000000008400040008000000000070 +:10010000100000000000C00000000000000000001F +:1001100000000000100000008200820000000000CB +:1001200000000000000000009000000000009000AF +:1001300000A011000000000000004100200010009D +:10014000000021000000000000000000000000008E :10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F +:10016000000000000000000000000000000000018E :10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000002100000000000000000000002E -:1001B000000000000000000000000100000000003E -:1001C00000000000050000C000000000000000006A -:1001D000000000000000000000000100000000001E -:1001E00000000000040000C000000000000000004B -:1001F00000000000000000000000000001000000FE -:10020000000000000000050000C000000000000029 -:1002100000000000000000000000000001000000DD -:10022000000000000000050000C000000000000009 -:10023000000000000000000000000000410000007D -:10024000000000000005A000008000000000000089 -:10025000000000000000000000000000410000005D -:10026000000000000040910000800000000000003D -:10027000000000000000000000000000000041003D -:10028000000000000000004083000080000000002B -:10029000000000000000000000000000000041001D -:1002A000000000000000004083000080000000000B -:1002B00000000000000000000300000000800000BB -:1002C000800000000000200003000080800000008B -:1002D000000000000041000003000000008000005A -:1002E00080000000000020004000000080000000AE -:1002F000000000000041000000000300000000803A -:100300000000800000000000050040000080800028 -:100310000000000000000041000003000000008019 -:100320000000800000000000050040000080800008 -:10033000000000000000004100000100000000C0BB -:10034000000020000000000090004008000482002F -:10035000400000000000000100000100000000C09B -:100360000000200000000000900082080040820091 -:10037000400000000000000100000000010000003B -:1003800000C0000020000000000090008202000475 -:100390008284400000000000000100000100000015 -:1003A00000C000002000000000009000820800044F -:1003B0008284400000000000000100000000C00036 -:1003C00000000000000000000000008800000000A5 -:1003D0000000000000000000000000000000C0005D -:1003E000000000000000000000000002000000000B +:10018000040000000000000000000000000000006B +:1001900000000040200000000000000000000000FF +:1001A0000000200000000400040000000000000027 +:1001B000000000000000000000000000000000003F +:1001C00000040001C0000084C0820000C0000001E3 +:1001D000000000000000000000000000000000011E +:1001E00000020001C0000084C0820000C0000001C5 +:1001F00000000000000000000000000000000000FF +:10020000000101880000C0000020C0820000C00082 +:1002100000010000000000000000000000000000DD +:10022000000001400001C0000020C0820000C000AA +:1002300000010000000000000000000500000000B8 +:100240000004108000108300008080800000800087 +:10025000000300000000000000000040000000005B +:100260000002108000108300008080800000800069 +:100270000003000000000000000000000005000076 +:100280000000000520000520A10000008080000083 +:1002900080000003000000000000000000200000BB +:1002A0000000004008000010830000008080000073 +:1002B00080000003000000000400000000000000B7 +:1002C00003000000100020000200000003000000F6 +:1002D000000000808002000010000000000000000C +:1002E00003000000110040000200000003000000B5 +:1002F00000000080802000000000200000000000BE +:10030000000040000000030003000500000003009F +:1003100000000000008080100000100000000000BD +:100320000000030000001000820002000000030033 +:1003300000000000008080100000000000000000AD +:10034000000000000000010040009120000001902A +:100350000200000000C08201000001000000000057 +:1003600000000000000000008200914000000190A9 +:100370000800000000C08200000000000000000033 +:1003800000000000010000000020A00082400000EA +:1003900001002000000000C08201000001000000F8 +:1003A0000000000000000000010005009140000076 +:1003B00001004000000000C08201000000000000B9 +:1003C0000000000000000001A00100A000000100EA +:1003D000000000000000000000000000000000001D +:1003E0000000000000000001040100400000910036 :1003F00000000000000000000000000000000000FD -:10040000C00000000000000000000000001000001C -:1004100000000000000000000000000000000000DC -:10042000C0000000000000000000000000100000FC -:1004300000000000000000000000000000000000BC -:10044000800000000000000000000000000000002C -:10045000000000000000000000000000000000009C -:10046000800000000000000000000000008000008C -:10047000000000000000000000000000000000007C -:1004800000008000000000000000000000000000EC -:10049000000000000000000000000000000000005C -:1004A00000008000000000000000000000000000CC -:1004B000000000000000000000000000000000003C -:1004C000800000C1000000000000000000000041AA -:1004D00000000040000000000000000000000000DC -:1004E000800000C10000000000000000000000418A -:1004F00000000040000000000000000000000000BC -:100500000000800000C100000000000000000000AA -:10051000004100000040000000000000000000005A -:100520000000800000C1000000000000000000008A -:10053000004100000040000000000000000000003A -:100540000000400000C100000000000000000000AA -:100550000021A000000000000000000000000000DA -:100560000000400000C1000000000000000000008A -:100570000021A000000000000000000000000000BA -:1005800000000000400000C100000000000000006A -:1005900000000021400000000000000000000000FA -:1005A00000000000400000C100000000000000004A -:1005B00000000021400000000000000000000000DA -:1005C00000000000000000000042000000000000E9 -:1005D0004800810000E0000048000000000000002A -:1005E0000042000000000000004200000000000087 -:1005F0004800810000E0000048000000000000000A -:100600000042000000000000000000420000000066 -:1006100000004800810000E00000480000000000E9 -:100620000000004200000000000000420000000046 -:1006300000004800810000E00000480000000000C9 -:100640000000004200000000000000000000000068 +:100400000000000000000000000004010090000057 +:1004100001000000000000000000000000000000DB +:100420000000000000000000000182000020000029 +:1004300001000000000000000000000000000000BB +:100440000000000000000000000511400000000056 +:10045000410000000000000000410000000000001A +:100460000000000000000000000380020080000087 +:1004700041000000000000000041000000000000FA +:1004800000000000000000000000002080100000BC +:1004900000004100000000000000004100000000DA +:1004A0000000000000000000000000030020000029 +:1004B00000004100000000000000004100000004B6 +:1004C000800000C10000000000004000000000416A +:1004D000800000080000004100000000051100102D +:1004E000800000C100000000000840000000004142 +:1004F00080000040000000410000000005400000B6 +:100500000020800000C100000010800011000000E9 +:1005100000C1000000400000004100000000030591 +:100520000010800000C100000000000883000000EF +:100530000041800000200000004100000000400356 +:10054000000020000040000000002000200000000B +:1005500000A1040000000000000100000000008471 +:1005600000012000004000000000200020000000EA +:1005700000A10400000000000001000000000021B4 +:100580000000000020000040000000012000820068 +:100590000000000340000000000000010000000017 +:1005A00000200001200000400000000020000400A6 +:1005B000000000C104000000000000010000000075 +:1005C00001A000000000000000000000000000008A +:1005D0000000811200E00700484200000000000017 +:1005E0004842000000000000000000000000000081 +:1005F0000000811200E007004842000000000000F7 +:100600004842000000000000000000000000000060 +:1006100000000000811200E00700484200000000D6 +:100620000000484200000000000000000000000040 +:1006300000000000811200E00700484200000000B6 +:100640000000484200000000000000000000000020 :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A @@ -49279,448 +49279,448 @@ :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 :1007300000000000000000000000000000000000B9 -:100740000000000000000000747B000000000000BA +:100740000000000000000000257B00000000000009 :100750000000000000000000000000000000000099 -:10076000000000000000DE2E747B0000000000008E +:10076000000000000000DEA4257B00000000000067 :100770000000000000000000000000000000000079 -:10078000000000000000DE2E0000747B000000006E +:10078000000000000000DEA40000257B0000000047 :100790000000000000000000000000000000000059 -:1007A0000000000000000000DE2E747B000000004E +:1007A0000000000000000000DEA4257B0000000027 :1007B0000000000000000000000000000000000039 -:1007C0000000000000000000DE2E61560340000023 -:1007D000000000000231E0000000000000000C40BA -:1007E00000000000000002C06A866156034000005D -:1007F000000000000231E0000000000000000C409A -:1008000000000000000002C06A860000615603403C -:100810000000000000000231E000000000000000C5 -:100820000C4000000000000002C06A8661560340D0 -:100830000000000000000231E000000000000000A5 -:100840000C4000000000000002C06A8600000000AA -:100850000000000088008800000000000000000088 -:100860000000C000000000000000000000000000C8 -:100870000000000000002000000000000000000058 -:100880000000200000000000000000000000000048 -:100890000000000000000000200000000000000038 -:1008A0000000000020000000000000000000000028 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 -:100990000000000000000000000000000000000057 -:1009A0000000000000000000000000000000000047 +:1007C0000000000000000000DEA4612603400000DD +:1007D000000000000230A0000000000000000C40FB +:1007E00000000000000002C0648661260340000093 +:1007F000000000000230A0000000000000000C40DB +:1008000000000000000002C0648600006126034072 +:100810000000000000000230A00000000000000006 +:100820000C4000000000000002C064866126034006 +:100830000000000000000230A000000000000000E6 +:100840000C4000000000000002C06486000220008E +:100850008800200020912080200002100402200047 +:10086000200220C0000088022000100284008400C2 +:100870008400040404022000040204000000200498 +:100880000002200484000400200004000003200073 +:100890002010040004002000200020048400000038 +:1008A0002000C000200000000000000088002000A0 +:1008B000200004000100200084402000000004000B +:1008C0002000A0000000C000C00000002000414047 +:1008D0002000040000000508000200009001000054 +:1008E00000000001000305000001000000000000FE +:1008F00004000400000000004100000000000900A6 +:10090000090000000000000040000000000000009E +:10091000400000012000090000000000000000006D +:10092000090020000900000009002000000010005C +:100930000000000000004000000000000000000077 +:100940000000000020000000000000000000000087 +:10095000010320108800A0880400010004000202A6 +:1009600000004000011020104000000000000000C6 +:1009700000002000000000000000008000000000D7 +:10098000000001C0000000000040004000000040E6 +:100990000000080000000000000000000800020045 +:1009A000000000000000000200000000200088009D :1009B0000000000000000000000000000000000037 -:1009C0000000000000000000200000000000000007 -:1009D0000000000000000000000000000000000017 -:1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 +:1009C000020000000000000008000000000000001D +:1009D000000040088000400009044000400800007A +:1009E0008241000480004008098289000000400024 +:1009F0000000000200000200000800000010008259 +:100A000020000000200400404040000000000000E2 +:100A100000000000800800000000000800008400C2 +:100A200000000000001000100001000000000000A5 +:100A300000000000000800000000000200000000AC +:100A40000000000000000000000080000000000026 +:100A500000000000400090409000880040044009E1 +:100A6000900010C004218400100040020005002006 +:100A70000009840300400002000900000000840017 +:100A800000000000000000400000000082000000A4 +:100A900000001000000000000000000000800000C6 :100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000000000000234 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000030013 -:100AE00003000000000000000000090000000000FA -:100AF00000000000000000000000000000000800EE -:100B000008000000000000000000000000000000DD -:100B100000000000000000000000000000000000D5 -:100B200000000800000000000000000000000000BD -:100B300000A0000000000000000000000000000015 -:100B4000000008000000000000000000000000009D -:100B50000090000000000000000000000000000005 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC000000000000000000000000009000000001C -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 +:100AB0000000000000000000100000000400000022 +:100AC00000000000000000000000008000000000A6 +:100AD0000000000000080804004003000800058230 +:100AE0002188000003400000000000820001210076 +:100AF00000000000000000000000080008000000E6 +:100B00004100000000000008000800824100410090 +:100B100005000000030000000000000005000310B5 +:100B2000410000002100000003001000000003004D +:100B30000800000000000800000080000800050018 +:100B400041820000030008040000218841200000C9 +:100B5000410000000000000008008840000302047B +:100B60008209C0004000400000090000000004802D +:100B70008300100082000000A000080010000000A8 +:100B80008200820082000400080008008200040045 +:100B900082000000A0001000000082000000C000E1 +:100BA0000800820000008200080004000400000029 +:100BB00000000000000082000000000900000000AA +:100BC0000000000000000400000000000020000001 +:100BD00000200000000000000000410004001000A0 +:100BE00010400040218402008084030000000800BF +:100BF00000404000000400000300000000A00000CE :100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 +:100C100000000000080000000000000000000000CC :100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 +:100C300000000000000000000000000000000900AB +:100C40000000000000000000000010000000000193 +:100C500000000001000000000000000084402000AF +:100C6000C020000040400011820008009000404079 +:100C7000000040400020001100200400000000009F +:100C8000C040820008000000080000000000C00012 +:100C90000000000010000011000008000000080023 +:100CA00082000000000082000400000082000000BA :100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF000009000000500000000000000000000005F -:100D000000000000000000000000000000000000E3 -:100D100000000000080000000000000000000000CB -:100D200000000000000000000000000000000000C3 -:100D300000000000000008000000000000000000AB -:100D400000000000000000000000000000000000A3 -:100D5000000000000000080000000000000000008B -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 +:100CC0008200000000000000000010001021000061 +:100CD0000400000000050020000000000000049057 +:100CE0008002040000002100100021000000090023 +:100CF0000000080008200000000000004040210023 +:100D000000001000100000000000000000000900BA +:100D100003000800080000000000000000000000C0 +:100D20000000000000000000089000000800000023 +:100D3000000000000000210000000000080000008A +:100D400003000020000008000090000005000000E3 +:100D500009008000000008000000000003000000FF +:100D6000100082041003004010008221400884001B +:100D70000800840800000108040000000020002092 +:100D800000080000C000000000000000000000009B +:100D90000000000008000000000082008200000047 +:100DA00000000000840008000000000000000000B7 +:100DB000C000000000000000000000000000000073 +:100DC000000000000000000000000000080000001B :100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 +:100DE00008082000000100002041000000008000F1 +:100DF0004100000020000000020000000800000088 +:100E000000000000000000000200000000000000E0 +:100E100000000000000000000000000000000200D0 :100E200000000000000000000000000000000000C2 :100E300000000000000000000000000000000000B2 :100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 +:100E5000000000000004000000001100000000007D +:100E60000000000040098888404002100002211064 +:100E7000900200101004210382A020040001000051 +:100E800000000000000000000000000090A0200210 +:100E9000008200820000000000000000000000004E +:100EA00000000000000008A0000800A0100201409F +:100EB000002000A000400001000100000000000030 +:100EC0000000000000000100000000000000000021 +:100ED0000000000000004020900000908210000000 +:100EE0000000000000002020030580918008080019 +:100EF000A1000000008000A00388008300A1000280 +:100F00000005000300080000000000000000408011 +:100F100000800080000000000000000000000000D1 +:100F20000000000000000000008000000080008041 +:100F300021000080000000000010001000400003AD +:100F40000000000000000000200021000000000060 +:100F50000000000000000000800080000000800011 +:100F600000000000000000001180A0A190219085E9 +:100F7000020003020880418340800003A090030820 +:100F800000C00000000000000000000000000000A1 +:100F90000000802180000000000000000000001020 +:100FA00000000000000000000000800000108080B1 +:100FB000800000000005000000002000210020004B +:100FC0000208000000000000000000000000000017 +:100FD0000000000000000000000080000020808869 +:100FE0000000000000000000000008842040A189EB +:100FF00082028890858820C009A10840904082A183 +:1010000010090002000000000000000000000000C5 +:10101000000040000200A01088000008000000004E +:10102000000000000000000000000000A000880197 +:10103000A0040200000000000020000000080100E1 +:10104000000001000000000000000000000000009F +:101050000000000000000000000000004000889137 +:1010600010A1080000000000000000000490012012 +:1010700010110383C00000010200030040080004B7 +:101080000483A00800000000000000000000000031 +:1010900000000000004000900004A090000000004C +:1010A00000000000000000000000000000008808B0 +:1010B0000004008882001000000008008800000082 :1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF +:1010D0000000000100010000000000000000008886 +:1010E000000200080008000000000000000080026C +:1010F000030909219191800000200041092080000E +:1011000002A089A1918500000000030000000000FA +:1011100000000000000000000000008080000000CF :1011200000000000000000000000000000000000BF -:1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F -:1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F +:1011300000000080000080000000000000000000AF +:101140000000080000000000000000000000000097 +:101150000011001000080041000000000000000025 +:1011600000000080000000000000000000000000FF +:1011700020108990038090410010890880804003EE +:10118000210591028500C0082100200000002000F8 +:1011900000000000000000000000800000000000CF +:1011A0001000101108000300000000000000000003 +:1011B00000000008004000800000800000000000E7 +:1011C00080002100034003004003000000000000F5 :1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000000BE -:1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E +:1011E0000000800800210080800000000000000056 +:1011F00000009011419121400201100940A110848A +:10120000020111002011050204010100000000008C +:1012100000000000000000000000820002900808AA +:101220008200010001010100010000000000000037 +:101230000000000010008840004090004000A00026 +:101240004000020001000000010000010000000059 :10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E +:10126000000000000200A00888C008000000000084 +:1012700000000000000000E000000041000000004D +:10128000000041820000000000000000000000009B :10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E +:1012A00000000000000000E000000000000000005E :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E -:1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D +:1012E00000000000000000000000070000060000F1 +:1012F0000000000000001C1C1C1CAC00A000EFE063 +:101300000F000000000000AA00AEC141C1C30000F0 +:101310000000000000000000000000000000FF3F8F +:10132000FF3F28C028FC0000000000000000000073 +:101330000000000000000000EB28EB28C1FDC1FD0B +:101340005F035003000000000000000000000000E8 :10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D +:101360000000000000000000AFA3AFA00F2F5F7FC0 +:1013700000000000000000001C1CBC1C53535F5FF9 +:10138000EFE0FFF00000000000AF00AF80008082BF :10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D +:1013A000FDFD0D0D28C028FC00000000000000001D +:1013B000000000000000000000002828EBEB80BCCB +:1013C00080BC5FF350F3000000000000000000004C :1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C +:1013E00000000000000000000000AFA0AFA000203F +:1013F00050700000000000000000CF5555554D41D1 +:101400005555C0C0FCC0C3E3CFE30F0F000000F789 +:101410000034000000000000000000000000000098 +:101420000000101010F0CDCDC1C100000000000080 +:1014300000000000000000000000000080C1C1C1E9 +:10144000B01041EB070700FF0000000000000000A3 :10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C -:1014C000000000000000000000000000000000001C +:101460000000000000000000000000000C0CFCFC6C +:10147000CF0CC30000000000000000000F555555C0 +:101480007D715555C0E8FCE8F3E3FFE31FFF000062 +:1014900000C7000400000000000000000000000081 +:1014A00000000000101010F0FF00FF00000000001E +:1014B00000000000000000000000000000009CC9C7 +:1014C000C9C9F05000AA040400FF00000000000099 :1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB +:1014E00000000000000000000000000000000C0CE4 +:1014F000FCFC55555555000000000000000000613F +:1015000030040009000100613006000D0000006198 +:101510003006000D000000610006000D0000000014 +:10152000000000000000000000000000000000615A +:101530000004000D0000000000000000000000009A :10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B +:1015500000610006000D0000000000000000000017 +:1015600000610006000D0000000000000000000007 +:1015700000000E0800000000000000000000000055 +:101580007D417D41AB01AB0169696969055A55052A +:10159000FDC1FDC1A55AF00555D7558200000000D8 :1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B +:1015B000283C783C00000000000000000000000013 :1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB +:1015D0000000CDFFCD000000000000000000000072 +:1015E00000000000000030F3F3F3000000000000F2 :1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA +:1016000000007D4175450000FFFFFF00FF005FA562 +:10161000AFAAFDFD0D0D5F05F50F55D755820000F2 :1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA +:1016300000002D3C783C000000000000000000008D :10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A +:1016500000000000C1FFC100000000000000000009 +:10166000000000000000000030F3303000000000F7 :10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A -:10169000000000000000000000000000000000004A +:10168000000000007F734F43565AFEFA000000002E +:10169000FAFA1414C082C0BEAAAA3CC33FC0FCF32D :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A :1016C000000000000000000000000000000000001A -:1016D000000000000000000000000000000000000A +:1016D000000000000000370734040014F0F00000A0 :1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 +:101700000000000000007C704C40A6AAAEAA0000B9 +:101710000000FFAAFFFFFC82FCBEAAAA3CC3003364 +:1017200003FC0000000000000000000000000000BA :1017300000000000000000000000000000000000A9 :101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 +:101750000000000000000000370734040014F0F01F :101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 -:101780000000000000000000000002000000000057 -:1017900000000000000000000000A00000000000A9 -:1017A000000000000000000800000200000000002F -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000004000000000400000011 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000004000000000000F5 -:1017F00000000000000000000000000000000000E9 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000200038 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000200018 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D00020000000000000000000000000000000E8 -:1018E00000000000000000000000000000000000F8 -:1018F00020000000000000000000000000000000C8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000002000095 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A00000004000000000000000000000000000F7 -:1019B0000000000000000000000000000000000027 -:1019C000000008000000000000000000000000000F +:10178000000000000000000088020080890840007E +:101790000402000284048420400004002000880029 +:1017A00004002020040400028400020420008400BD +:1017B0002000000420002000000004002000202061 +:1017C0002000200020048802000320008400000084 +:1017D00020004004020088000000040020002000D7 +:1017E000200088000000200200002000000000000F +:1017F000200020000000000000000000C000A00049 +:1018000084000000000000000000200104201001FE +:101810000000000000010000400120000040040022 +:101820002000000000000020000100000000000077 +:1018300000000004000000000000000000000000A4 +:101840000000000000000000000000000400000094 +:101850000000000000000400000000004000000044 +:101860000400000020000000000000000000000054 +:101870000000000000000000000200000000000066 +:101880002000000000000000000000000100042013 +:101890000108000084400200880090400108848014 +:1018A0000202880000002080840000000000000088 +:1018B00000000000010000820100000000000000A4 +:1018C00000000000000000000000004000000000D8 +:1018D00020000000000000000000200000000000C8 +:1018E0000000004000002000200000002000000058 +:1018F0000000000000400000200000000000100078 +:10190000C1000100200000000000000000004000B5 +:10191000A08904010088090400084000090810019A +:101920000020000502040900004000000008000833 +:101930000008000000004008000340000002000012 +:101940000000400200000004000000000008000049 +:10195000000400080000000400040008000000006B +:10196000000000080000000000000000000040022D +:1019700000000004000000000000008400000000DF +:10198000800010081008000002000010000000088D +:101990000941900800009040000000000009C000CC +:1019A0000004820900040800900004400011208017 +:1019B000000000000000080800000000C04088008F +:1019C00000000000A000000008000000000000402F :1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A00000000000040000000000000000000000096 -:101A100000000000000000000000000000000000C6 -:101A200008000000000000000000000000000000AE -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 -:101A80000000000000200000000000000000000036 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 +:1019E00000000000000008000000000300000000EC +:1019F00000000000000000000000000000000800DF +:101A00004000000000000000000008000008000086 +:101A10000000C0000004410041882088109010029E +:101A2000080400820000410004900808000200A0A1 +:101A30000040000009000000000000000008000055 +:101A40000000000008080088000000000400088270 +:101A500000000000000000000800000005A00000D9 +:101A60004082000000900000000000000000000024 +:101A70000000080000000000030000004100000218 +:101A80000000000008000800000000000000000046 +:101A900008C000008200C00800000800A008000084 +:101AA0000040C1040009000000000000000900001F +:101AB000000000000800100000008400000000008A +:101AC000C0000480080000000000000000000009C1 +:101AD000820000000000000000000000000008007C +:101AE00000000000000000000000A0000000000056 :101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 +:101B000000000000000000000000000001080000CC +:101B100000000000000003002010088821000500DC +:101B200003000800028400040000400000000000E0 +:101B30000000000003000800000010880000000002 +:101B40000000000000020000000000000000000093 :101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 +:101B60004100000003000800000000000008000021 +:101B70000000000800000008000000000000000055 +:101B80000000000000000000000000000000200134 +:101B90000000000000000000100004000020000011 +:101BA000820008008200900090A0C0110004002173 +:101BB00000001000000000200000001100001000D4 :101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000004000000D0 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000004000000B0 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000041000000000000000000000003 -:101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 +:101BD00000000000000000000000000002040000FF +:101BE00000000000000000000000000000200000D5 +:101BF00000000000080000000000000008000000D5 +:101C00000040000000000000000000000000000094 +:101C1000000000000000000000000302030409911E +:101C20000400119010A00088034002080800000280 +:101C30000310000008000000008800000000000001 +:101C40000084400020000900028803000300000017 +:101C50000804000008000000000000000900000463 +:101C600000400020082000000000400002000000AA +:101C70000000400000000000000000000000000024 +:101C800000000040210000000000000021000504C9 +:101C90000004089000000000000000008408840494 +:101CA000A020000000000000000000001000000064 +:101CB00010080021000000000000000000000000EB +:101CC00000000000000000000800002100000000EB :101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D300000000000000000000000000000000000A3 +:101CE00000000000000000000000080000000000EC +:101CF0000000000000000000000000000000C00024 +:101D0000000000000000080040000000000000008B +:101D10000000000000000000000000000000009033 +:101D200000000001000008000500000005000000A0 +:101D30000000100841004000000000000300000007 :101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 +:101D50000000000003000000000000000000000080 +:101D60000300000000000000000000000000000070 +:101D70000000000000000000000000000000100053 :101D80000000000000000000000000000000000053 :101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 +:101DA000024190020089908200A18205010208820E +:101DB000C040019090A0880800020020A0201040A0 +:101DC0000000000000000000000189000001000187 :101DD0000000000000000000000000000000000003 :101DE00000000000000000000000000000000000F3 :101DF00000000000000000000000000000000000E3 :101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 +:101E100000000100000000000000000000000000C1 +:101E2000000000418003008200A000C10088100073 +:101E3000001180800480008000002080210080004C +:101E400080000000000000000000000821080008D9 +:101E5000000300000000000000000000000000007F :101E60000000000000000000000000000000000072 :101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 +:101E90000000000011000021000000000000000010 +:101EA000000000008000002000800000800000058D +:101EB000808080030300031120A0C1800000008007 +:101EC00080000080000000000000000010000800FA +:101ED00010000910000000000000000000000000D9 :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 :101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 +:101F10000000000000000020000011400000000050 +:101F2000000000000000040088001084A040880821 +:101F30004000A01084014000918900A003A0A000EF +:101F40009082A00020A0000000000000000000908F +:101F5000010000000101000000000000000000007E :101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 :101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 +:101F9000000000000000000000000000010100003F +:101FA000000000000000000002400102009090A02C +:101FB00040200088000410C0904000880803A090D2 +:101FC000400500041010A0400000000000000000C8 +:101FD00000000001010000000000000000000000FF :101FE00000000000000000000000000000000000F1 :101FF00000000000000000000000000000000000E1 :1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 +:1020100000000000000000000000000004000001BB +:10202000010000000000000000000000020000802D +:10203000008000000000408091800003000400A0A8 +:10204000882080A0000080058003000000000000C0 +:1020500000000020201021200000000000000000EF :102060000000000000000000000000000000000070 :102070000000000000000000000000000000000060 :102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 +:1020900000000000000000000000000000008000C0 +:1020A0000008410000000000000000000000008067 +:1020B0000000800090212188898004008080000039 +:1020C0008000800000000000008080000000000010 +:1020D0000000000041000800200010100000000077 :1020E00000000000000000000000000000000000F0 :1020F00000000000000000000000000000000000E0 :1021000000000000000000000000000000000000CF :1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F +:10212000110000000000000000000000000004009A +:102130008804020202001001A0A085081000408857 +:1021400020888488A000000000904002A0000000C9 +:102150000000000000000108000000000100000075 :10216000000000000000000000000000000000006F :10217000000000000000000000000000000000005F :10218000000000000000000000000000000000004F :10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F +:1021A000000001000000000000000000000000002E +:1021B0000000000007000000000000000700000011 +:1021C000000000E0070041000000000000000000E7 :1021D00000000000000000000000000000000000FF :1021E00000000000000000000000000000000000EF :1021F00000000000000000000000000000000000DF :1022000000000000000000000000000000000000CE :1022100000000000000000000000000000000000BE -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E +:102220000000000000E00000000A000000000000C4 +:102230000000918191819D04DB4200F3000300FFC7 +:10224000F30C3CFF36FF4AC34A0CC0C0C0C000FFBD +:10225000FFFF000000000000000000000000000080 :10226000000000000000000000000000000000006E :10227000000000000000000000000000000000005E :10228000000000000000000000000000000000004E :10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE +:1022B0000000000081819191FF00FF0000F600F610 +:1022C000FFFF0C0C3C0036004AC34AC3C0C0C0C06C +:1022D000F0F0C3C300000000000000000000000098 :1022E00000000000000000000000000000000000EE :1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD @@ -49734,494 +49734,494 @@ :10238000000000000000000000000000000000004D :10239000000000000000000000000000000000003D :1023A000000000000000000000000000000000002D -:1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD +:1023B00000000000000000001E1E7818FFBCC38053 +:1023C000093C000081E701F700FF4E4E1313C3C321 +:1023D000F818FF1FFF3CC3000000000000000000D1 :1023E00000000000000000000000000000000000ED :1023F00000000000000000000000000000000000DD :1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC -:10243000000000000000000000000000000000009C -:10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C +:10243000000000000000000000003C3C3C3CFF3C71 +:10244000C300FFFF00009966996600FF0F0F13138A +:102450001818FFFFFFFFD8D8D8D8000000000000F0 :10246000000000000000000000000000000000006C :10247000000000000000000000000000000000005C :10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C :1024A000000000000000000000000000000000002C -:1024B000000000000000000000000000000000001C -:1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC +:1024B0000000000000000000000000008061000635 +:1024C000000D00000061400E009D000000600E063F +:1024D000000D000000613006000D0001000000004A +:1024E0000000000000610006000D00000000000078 :1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B +:102530000006000C00000000000000000000000089 +:102540000000000000005501FFFF00000000000037 +:102550000000FAF0F3F000000000000000000000AE +:10256000000000000000C3C3FC0CCF00CF0000003F :10257000000000000000000000000000000000005B :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B +:1025B0000000FF0000FF000000000000000000001D :1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB +:1025D0000000000050F030F0000000000000008219 +:1025E0000000000000000000AAAAF505FF30FF303F :1025F00000000000000000000000000000000000DB :1026000000000000000000000000000000000000CA :1026100000000000000000000000000000000000BA :1026200000000000000000000000000000000000AA -:10263000000000000000000000000000000000009A -:10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:10267000000000000000000000000000000000005A +:1026300000000000FF0000FF00000000000000009C +:1026400000000F3F0F5F000000000000003C000092 +:10265000000000000000FFF0003C0000000000004F +:10266000000000000000000000006C6C6C693CFF82 +:102670003CFF00000000000000000000000000001F :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A :1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A -:1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F00000000000000000000000000000000000DA +:1026B000000000000000FF0000FF0000000000001C +:1026C000000000000F3F0F5F00000000FF00003C13 +:1026D000000000000000000000F0003C00000000CE +:1026E000000000000000000000000000939393969B +:1026F000383BF8FB00000000000000000000000074 :1027000000000000000000000000000000000000C9 :1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 -:102740000000000000000000000000000000000089 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:102840000000000000000000000000000000000088 -:102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 -:102880000000000000000000000000000000000048 -:102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 -:1028B0000000000000000000000000008200000096 -:1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000000000F8 -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 -:1029000000000000000000000000000000000000C7 -:1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:102940000000000000000000000000000000000087 -:102950000000000000000000000000000000000077 -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:102990000000000000000000000000000000000037 -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 -:1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 +:102730000000000000000000FF0000FF000000009B +:10274000000000000000C08004002082041020006F +:1027500020002000200000038820000088000003E3 +:10276000000000002082901188020000200200007A +:1027700020000400201040040000000308020000B4 +:1027800088000000200000030000011000002082EB +:1027900000004000200000000000000000002000B9 +:1027A0000000C000000420004000C0000000000045 +:1027B0000000000040004000000000000000000099 +:1027C0000000000088001000000200080808000156 +:1027D000000040C009400084004000012184100036 +:1027E0000090000000000002000000000000100047 +:1027F00005004000000021010900000000008000E9 +:10280000000000040040000000000000040100007F +:102810000020000000000002000000000000000096 +:102820000000000000004102A100000000000000C4 +:102830000000000200000000000000000000000096 +:1028400000000000004000000000028801021002A9 +:102850009120830000840004C0088240000004002E +:10286000008810002000000040000040000004002C +:1028700000040900008000100000000000000200B9 +:1028800000100000000000000008000000800000B0 +:102890000010200002000000000000050000000001 +:1028A000840000040080000020800084820000007A +:1028B00000002000020000000000000000000000F6 +:1028C0000000820800000000000000000409080564 +:1028D00000110483400400050504050504000008F8 +:1028E0000000000420020484110080000000008425 +:1028F00000840088840000400005000000080902F0 +:1029000000900091000800900008000000000040C6 +:10291000008200820082000000000000000000022F +:102920000000000000880002040080020003000094 +:102930000000000800000002000840000000000045 +:1029400000C000000000000000000000000091A096 +:1029500010050040C00882112040C0008820900867 +:10296000A0400008100000000000000040400008E7 +:10297000001000400008001000100000400040005F +:1029800000400021000000000000004000000000A6 +:102990009004400000080000000000080003080048 +:1029A000040000414000400000000000000000085A +:1029B0000000000000040000000000000000000013 +:1029C0008800C000040090004000000000000000EB +:1029D000020808080000110000908008050040056A +:1029E00005A0400003A004A000000000004040013A +:1029F0000500210808080500000000010000002073 +:102A000000900084000000080000000000000000AA +:102A100000000800000000000000000000000000AE :102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000000000076 -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 +:102A3000000100000000000000002100080000006C +:102A4000000000000008000000000000000000007E +:102A500000000000C002A04008028240C0830000C5 +:102A600010080800100000000400000000004000F2 +:102A700004008200C000C000000000A0C00001A14E +:102A80000000000000000020000000000000000026 +:102A90000000000000800120000000000000000095 :102AA0000000000000000000000000000000000026 :102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 -:102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 +:102AC00008001000000010000000080000000800CE +:102AD00000000000000220A10000001121004004BD +:102AE00008008403000021A00000088405A000085D +:102AF00000881000080000000000032041200010A2 +:102B00000420211000000000000000000000000070 +:102B1000000000000000412004A00000100041005F +:102B2000080000000000000000C000A0000000003D +:102B300000000088080041000000000000000000C4 :102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 +:102B5000000000000000080804054002A0108400E6 +:102B60000400A00082A001200280010000000008F3 +:102B700000000820A0000000080004000000000081 :102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD00000000000000000000000000000000000F5 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 +:102B9000820000000000000000000800000000208B +:102BA0000009000000000000080000080000840088 +:102BB000000008000000000000000000000000000D +:102BC00000000000100000000000000000000000F5 +:102BD000000000000000000000894002850800415C +:102BE00010900482000400080288404008A011826E +:102BF0000220100010000300080003000000000085 +:102C000008900420082010200000000000000804A4 :102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 +:102C20004001000000000000000040000000000023 :102C30000000000000000000000000000000000094 :102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000000093 +:102C500000840000000000000300112100008480B7 +:102C600001054000210400020108000000090000E5 +:102C700010000000820000080040000082000000F8 +:102C800040000000000000000000002100000021C2 +:102C90000008000000210000040000000000010006 +:102CA0000000008000000000004100000000000063 +:102CB0000000000000000080008001000208000009 +:102CC00000000008000000000000000000000000FC +:102CD0000000000000000000000008028800000062 +:102CE000004040000400A0410408108900001000CA +:102CF00040844100040000000000030100000000C7 +:102D000000000000000000000000000000000800BB +:102D1000000000000282000000A00000000000008F +:102D20000400000004200008000000000000000271 +:102D300005000000400000840002000420000000A4 :102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 +:102D50000004000000000000000000000000080166 +:102D60001005080288020000900008010000910090 +:102D70000000020200009002004004A09008000041 +:102D800000000000000008A0000400080804000083 :102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 +:102DA000900200000010A0200000000000000000C1 +:102DB0000000000000000000000000010001000011 :102DC0000000000000000000000000000000000003 :102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 +:102DE000004180A100210089040521402005000345 +:102DF000090003000080000008800000008000003F +:102E0000000000000000000008800080008080803A :102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 +:102E200000000080000000800000000000000000A2 +:102E30000000000000000000000000201021081128 :102E40000000000000000000000000000000000082 :102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 +:102E60000000C00003088500C108410508000808EB +:102E7000A0A1030002A140800200000000830080A6 +:102E800000800000000000000000800000218000A1 :102E90000000000000000000000000000000000032 :102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 +:102EB00000000000000000000000000008002100E9 +:102EC00000000908000000000000000000000000F1 :102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 +:102EE0000000000003102001A184838490A0110041 +:102EF000A0018289000091C0900201000000002121 +:102F000000A0000400000000000000000800100005 +:102F1000A010200040002000400000000000000041 :102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 +:102F30000000000000000000000000000000019000 +:102F4000010000000001000000000000000000007F :102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 +:102F600000000000000000214120A1082102000112 +:102F700090010001000000882011000911C14020CB +:102F80000090908504010000000000000000088807 +:102F900000000040004000000000000000000000B1 +:102FA0000000000000000000C02000A00010880207 :102FB0000000000000000000000000000000000011 :102FC0000000000000000000000000000000000001 :102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 +:102FE00000000000000000000010404185C0028881 +:102FF0000008A008411000200005008300A191886E +:1030000080400000008890200000000000000000C8 +:103010000000000000800000000000000000000030 +:1030200000000000000000000000800000800000A0 +:103030000080000000000000000000000000000010 +:10304000000000090320200300030000000000002E :103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 +:1030600000000000000000000000800288100280C4 +:10307000884041210920210020410000002000005B +:103080008040000000000000000000000000000080 +:1030900000008003000800000000004000000080E5 +:1030A0000000000000000000000000000000000818 +:1030B0000000800000000000000000000000000090 +:1030C000000000004110100041001003000000004B :1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F +:1030E000000000000000000000000000C04120833C +:1030F0000904880001040010018800008882088803 +:103100008800A00140009000080088000000000036 +:10311000000000000200400100821000000000A03A +:10312000004000000000000000000000000000005F +:103130000088000004000000000000000000000003 +:10314000000000000000012100000000000000005D :10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F +:10317000000007000000000000E007000000000061 +:1031800000E0070050000000000000000000000008 +:103190000000000000000000000007000000000028 :1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF +:1031B00000000000070042000000000000000000C6 +:1031C0000000000000000000000000E0000000001F :1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE +:1031F00066290303FA0ACACA0000000000000000A2 +:10320000AAAAAAAA3420F5A0303C3C3C8090809029 +:10321000000000000000000000FFAAAA00BEFFBEE0 :10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E +:103230000000C3C3C3C38080C3410000000000007E :10324000000000000000000000000000000000007E :10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E +:1032700000007D640303FF0FCFCF000000000000BB +:1032800000005A6955553420F5A00C1C0C1C001088 +:103290000010000000000000000000FFC3C3001485 +:1032A000FF1400000000000000000000000000000B +:1032B00000000000C3C3C3C3C1C1C341000000007C :1032C00000000000000000000000000000000000FE :1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D +:1032F00000000000D4E8D4E83C3C3C3C0000000066 +:103300000303000AA5A5A5A5A000A0003434000071 +:10331000000000000000000000000000F33CF3008B +:10332000CFCF003C000000008DE78DE700000000DB +:103330000000000000005F5F3C3CAAAAAAAA0000AF :10334000000000000000000000000000000000007D :10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D +:10337000000000000000D4E8D4E800FFA0FF000037 +:10338000000003030A0AA5A5A5A5A000A0005514E6 +:103390000000000000000000000000000000F3FF3B +:1033A000F3C3CFCFC3FF0000000062D062D00000A3 +:1033B00000000000000000000A0A3C3CAAAAAAAAD9 :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED :1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C +:1033F0000000000000000000A061400E001D000061 +:103400000041000D000D000000610E0E009900014A +:1034100000613006000D0000000000000000000008 +:103420000000000800000001000000000000000093 +:103430000000000000000000000000000008001074 :10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C +:103450000000006100070001000000000000000003 :10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C +:103470000000000000000000000068E968E9DD4687 +:1034800072B057FF55FFC7C3D39200000000F0F0A1 +:1034900014C30000000028EB14D700000000000057 :1034A000000000000000000000000000000000001C :1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC +:1034D000000000003C3C1E1E00FFF3F30000000053 :1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB +:1034F00000000000000000000000000099E299E2D6 +:10350000DD4672B057FFD7FFFFFF711000000000CB +:10351000F0F0F0F00000000028EB14D700000000ED :10352000000000000000000000000000000000009B :10353000000000000000000000000000000000008B :10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B +:10355000000000000000FF005F0A00FF03030000FE :10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B +:10357000000000000000000000000000000000C388 +:103580002020F5A0E1E1000000003A3FCAFF000062 +:103590000000F755000000000000000000000000DF :1035A000000000000000000000000000000000001B :1035B000000000000000000000000000000000000B :1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB +:1035D000000000000000000000AA55FF1414BEBE49 :1035E00000000000000000000000000000000000DB :1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA +:1036000000C33C3C5F0A4B4BF303FA0A3A3FCAEF54 +:103610000000000055550000000000000000000000 :10362000000000000000000000000000000000009A :10363000000000000000000000000000000000008A :10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A +:1036500000000000000000000000A0A0F5F5B4B4D8 +:10366000B4B40000000000000000000000000000F2 :10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A -:103690000000000000000000020000000000000028 -:1036A000000000000000000000000000000000001A -:1036B0000000000002000000000000000000000008 -:1036C00000000000000000000000000000000000FA -:1036D00000000004000002000000000000000000E4 -:1036E00000000000000000000000000000000000DA -:1036F00000000004000000000000000000000000C6 -:1037000000000000000000000000000000000000B9 -:1037100000000004000000000000000000000000A5 -:103720000000000000000000000000000000000099 -:103730000000000400000000000000000000000085 -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 -:103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 -:103790000000000000000000000000000200000027 -:1037A0000000000000000000000000000000000019 -:1037B00000000000000000000000000020000000E9 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000200000000000C9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000200000000000A9 -:1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:103890000000000000000000000000000400000024 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000400C4 -:1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 -:103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 +:103680000000000000008400400000900982000259 +:10369000008420008400200084108202880004043A +:1036A000400840808800400388020000880500042C +:1036B000840084001008840020002088080810047A +:1036C00000000003000000000000000000100000E7 +:1036D0000004210300408400880420100002000040 +:1036E0002000880400000000000084008400000026 +:1036F00088000400C000200200000002000000005A +:1037000000000000090000004090002000038840F5 +:103710000004000280022100C020200500000010EB +:103720000090800000200000200000000000000049 +:10373000000200C00000000000400000A10580C1A0 +:103740008091000400002000000000000000000143 +:10375000000000002004000100000000000100A0A3 +:1037600000208000000100000000000000000000B8 +:103770000000000200040000000020000000000023 +:103780000000000000000221000205901000080463 +:1037900084040084000405042000200020000000B0 +:1037A000400440000000901001100809049020001F +:1037B000000000000880000020000000200004033A +:1037C0004008059001000000000200020000008097 +:1037D00040000000400020800280008002000800BD +:1037E000200020081004200000000000000000005D +:1037F00000000000000000000000000000000200C7 +:10380000000000000000000000100303C02080043E +:1038100080830489044100090805C10084008000F8 +:103820004000800080900082000504018000400379 +:103830008000000000840040000800020008000032 +:10384000000080C120112084000000010001000060 +:10385000000280000084808480048010001080902A +:1038600000848000800180018000000000000000D2 +:1038700000000000000800040008000000820000B2 +:103880008082000000000000000040080005840065 +:103890000008900000820800820004084008000828 +:1038A00040040480000800040002000000410020E1 +:1038B00000C1402104009008000900000000000041 +:1038C00000020403000500050000000000000005E0 +:1038D00090000000000000020484848500000008BD +:1038E0000010880000020009004000400000002194 +:1038F00000000003000000000000100300000004AE +:1039000040000440000000000000000008A008A0E3 +:10391000050008040800030308080002058400826B +:1039200000000000210200000000030100880000E8 +:10393000000105200000030000000000009000A02E +:10394000000000080800000000400900000000001E +:1039500000000000000000000883000205020800CB +:1039600005000501000000000900000100000084BE +:103970000008000000A0000000000000000000009F +:10398000000000000000000041001100080040009D +:103990001005C00082008500858000008400404042 +:1039A0000800A0101000000008000000080000003F +:1039B00000008500A0000000400000000000080595 +:1039C0000000080040000800C00009800800000056 +:1039D000840008000400820082008200C000840885 +:1039E000C04008000000000008000811100001009D +:1039F00082008200000000000000000000000000C3 +:103A00000000820000000804000000000800000020 +:103A1000400040200000409008000402080011000F +:103A200020040000400141000400000011080000D3 +:103A300000000000040008000000A10021000000B8 +:103A40004100210040000300000000000808880039 +:103A50000000410000000800000000A00000030872 +:103A60000001000008000000000041000300830086 +:103A70001000000000000000000000000000000036 +:103A80000082000000000000410000000000000073 +:103A90000000C0000009080008209100100010403C +:103AA000C00001200400088082050003000400001B +:103AB0008200020000000000000801000800400031 +:103AC0000008A000C00082000004000008000040C0 +:103AD00008000000820004408210081000110880D5 +:103AE00000034000080282218420840801000008AD +:103AF00000000000000000000000000082008200C2 +:103B00000008080000000000C020000000000000C5 +:103B100000209000004004880000418808880304C9 +:103B2000040521A008040502001040200802080036 +:103B30000500030200000000000000002000000853 +:103B400000900000400000000000000000020000A3 +:103B500000000000000000020000008803010000D7 +:103B600000020000800000040000000000002000AF +:103B70000001000009A0000000000000000000009B +:103B80000000000000000000000000001102000022 +:103B90000000000000000000000090210200001062 +:103BA00008100809200008410421002100210021FB +:103BB0000000002104210000840010000021040006 +:103BC0008400000000008405C00082001000080886 +:103BD0000100000000000000000900218421000015 +:103BE00082000008000010004009000008000005E5 +:103BF00001800000008000210000000000000000A3 +:103C00000008000000008400000000000000000028 +:103C100000000000000000002100000204008040BD +:103C20001101400100000020000200000000080017 +:103C30000004001004000000040000000000100058 +:103C40004000000000001000110000000000000013 +:103C5000000110000000000000000900000000004A +:103C60000000000008000000800800000000008242 +:103C70000000100800002104000000000000000007 :103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000000000000000C3 +:103C9000000000000000000000000811A040900992 +:103CA0001002009108411108000882A0018808054F +:103CB00010C00000A1008200000008089140002010 +:103CC00082820190202000200040000000000000BF +:103CD000000090034141848800C000000101000001 +:103CE00040000000401001109005024010A000C0EC +:103CF00000404008000103004001000100000000F6 +:103D00000000000000000000000000000210008819 +:103D1000001008020000000000000000801085086C +:103D20000008000511201120840500210000200555 +:103D30000520802000059003800300040800910006 +:103D400000000000110080000500000000000000DD +:103D50000000000000C140A182850003000008416E +:103D6000200080080040A080030320880003C0805A +:103D7000000000800000004188030840004000006F +:103D80000000000000000000000000000000C080F3 +:103D900000000000008000000000000000000000A3 +:103DA000100000000321000908009002902188C043 +:103DB0001010C00090411080020020002008000078 +:103DC000802100000080000900C100000003000005 +:103DD000000000000000098008108221C1000000DE +:103DE00041001000A010C0218080A121C011908945 +:103DF0000000002100008000028040030380411089 :103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF +:103E10000000002100800000000000000000000001 +:103E2000000001000000010140849100089082011F +:103E3000A0022100A0040301010201000100000012 +:103E400008008200202082900008001100880001F4 +:103E5000000000000000000000100901A02183A064 +:103E60000000202021001100C00188401100A004A2 +:103E700009880000900020900400000200000184E6 +:103E800001410000000000000000000000000000F0 +:103E900000000000004000A0000000000000000042 +:103EA0000000821101A000400411C00108010301BB +:103EB00090019040008200918804000000010101FF +:103EC0000101C00500200020108540000000100006 +:103ED00002000000000000000000088800880010B8 +:103EE000020300000000000088010000100300C071 +:103EF000010009C104820002008441C000000000EA +:103F000002000001000000000000000000000000AE +:103F10000000000040900008008810100000000021 +:103F200000000000002108A003C000208008A108B4 +:103F30002021090800000005412003A000200508F9 +:103F4000052102208002000300004088800000005C +:103F500000008300000000000000000000030000DB +:103F6000419080C1000000080021C1210040800272 +:103F700000000510918280000080008021800003F5 +:103F80000340C105004100000000000000000000E7 +:103F900000000000000000000000000080000000A1 +:103FA0000000000000004105042009004000A1407D +:103FB000C11040000440C008A0800080404010A014 +:103FC000210008000940801180C000110000080095 +:103FD00008000300080000000000000000008884C2 +:103FE000890041008211000041050389200003037C +:103FF000C108900241809003800000000000000092 +:10400000C140C0204100032000000000000000006B +:104010000000000000000000000000000000800020 +:10402000000000000000000001000000000001008E +:10403000C121A00141200001024182A08808100096 +:1040400000A000000100000010012082080582008D +:104050009000200040001000000000000000000060 +:10406000050204040820040000000088002100402C +:1040700001000909A0090410A001C000A008400423 +:10408000400005904101C000C10000000000000098 +:104090000000000000000000000002002000C0003E +:1040A0000400000000000000000000000000070005 +:1040B0000000604100E007006000000000E0000038 +:1040C00000060000000000000000000000000700E3 +:1040D0008200000000E000008400000000000000FA +:1040E0000000000000E000000000000000000000F0 +:1040F00000000000000000E00000000000000000E0 +:1041000000000000000000E00000000000000000CF :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F +:104130002D2D6F6FF0000606000000003CF6000019 +:10414000000000000000000000000000F978E160BD +:10415000F93C603C900030000000000000000000CE +:1041600000000000F0FFF0000083838300000000E7 +:10417000000000000000000036FFFFFFCCCC202034 +:10418000E3E33F033F03096F00000000000000006D :10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE +:1041A00000004646666600000000000000000000B7 +:1041B0000000002D006FF0000606000000003CF03B +:1041C00000002C0C3C1C0000000000000000FF1848 +:1041D000E700F9FF600000000000000000000000A0 +:1041E000000000000000663C663C00838383000002 +:1041F0000000000000000000000000FFFDFDCDCD2C +:104200003000F3C37E7E424281E7000000000000E0 :10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E +:10422000FD99D99942664266000000000000000036 :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E :10425000000000000000000000000000000000005E @@ -50230,404 +50230,404 @@ :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E :1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD +:1042B00000000000FF7F0000000000000000000080 +:1042C00030306C6C0F0FFFFF030000000000000097 +:1042D0000000EFEFE0EF0F27FF27000004000000D1 +:1042E00000000000000000000000F0C0F0E000004E +:1042F000000000000000000060609BBF3C343830CC +:10430000DB420F0FFFFF0000606060F9000000005B :10431000000000000000000000000000000000009D :10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D +:10433000000000000000FFFF00000000000001007E +:10434000000C000C0CFC0F0F9999010000000000FC +:10435000000000002020202F0F2700270004040465 +:10436000000000000000000000000000FFC3FFE7A5 +:10437000F090FF99000000000000666699993C34B7 +:104380003C34DB4200000DFD0000F960F9F900004B :10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C +:1043A0000000000000003C663C0F00000000000020 +:1043B0000000000000000061400E000D0000A06140 +:1043C000003F800D0001006100010001000000615C +:1043D0000006000D00000061000E000D00000061ED +:1043E0003007000D000000000000000000008061A8 +:1043F000000300010000000000610006000D000540 +:104400000061000700990000A0000000009000007B +:1044100080610001000100000000000000000000B9 +:10442000000000000000000000003000000000005C +:10443000000000000000000000F03FFFC282C0004A +:10444000000C0F0F45550455FFFF00D7AAFFAAFA2D +:10445000AFBE00003C3C340000000000F3F33333F7 +:1044600000F0C3AA000000000000000000000000EF +:104470007D410F0FEBEBEB2800005555FFFFD700F8 +:104480000700555500FF0028C3EB000000000000A6 +:10449000000005F53535A0AFACAF0000000000000E :1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B +:1044B0000000000000000000000000F030FFC38397 +:1044C000C303080C0F0F04550455000000D7AAFFC2 +:1044D000AA0A000000003C3C000000000000FFFFB2 +:1044E0003F3FFFF0C3AA00000000000000000000F2 +:1044F00000007D410F0F2828EB2800001514BFBED7 +:10450000D700D7003C3CF0F0143CD7FF000000007F +:104510000000000035353535A0AFA0A30000000035 :10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B +:104530000000000000000000000000000800000073 +:104540000000F0F03C3C3C000F00AFAAFCFCFCFC7F +:1045500000FF00FFD4D4003C0C0F0C05000000004D :10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B +:1045700000000000FC0CFCFCAAAAAAAA0000000093 +:104580000C0CFFFF0000C0C3C0C3FF00FF00000011 +:1045900000000000000055555555AFAFAFA3000017 :1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB +:1045C00000000000F0F03C303C140000AAAA0C00EF +:1045D0000C00EAEAC0C0D4D4C3FF0C0A0C000000EF :1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A +:1045F000000000000000FC0C0C0C3C3C0CFC00001B +:10460000C3C30000AA3CF0F0F0FFF0FF55550F0FB8 +:1046100000000000000000000F3C3C3CA0A0A0A354 :10462000000000000000000000000000000000008A :10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000002000000F7 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 +:1046400002C04000000482104000400008000082C8 +:10465000840020054004040500050004040284824F +:104660008891C0040000000888002000004100007C +:1046700000008400000500040400040088201000ED +:104680000003001000100000400020000010C002D5 +:104690001000880088000000000000000000C0003A +:1046A000020088008500A00020081000000000041F +:1046B0002000880000000000000000000000000052 +:1046C0000000801189C000C021008000030090908C +:1046D00010100002000000000004000240050084E9 +:1046E0004010100400000000000000020000000460 +:1046F0001000000000000004200000008500000100 +:1047000000000000000100010000000000C00001E6 +:104710000000000041000000000000000000000058 +:104720002002890000000490000200040000000044 +:10473000400000000900000000000000000200002E +:104740000000000008000410021002108400C010D5 +:10475000000003110000020000000200050020001C +:1047600000100400040000408400059004000000D4 +:104770000400A021000001008209208501000080C2 +:1047800000004000000040400000001000800000D9 +:1047900000400000001000000000000000040000C5 +:1047A00000800040000008000420048000A10000F8 +:1047B00004000000020000000000000000000000F3 +:1047C00000000000840085100303000300050908B1 +:1047D0000405020840040502040000084000080423 +:1047E000800805010004200000820008C020200489 +:1047F0000402000800084084088440104020100093 +:10480000000400848010000080080400008900403B +:10481000009000000008000400840008000000016F +:1048200000000004000000088008800180200020B3 +:104830000008000000080008000800100008000040 +:104840000008000000840082400484409084A00896 +:10485000C0030008100010080405100090050009AE +:10486000080408000008080000009020000000096B +:104870008408A0000009841040080008000004001B +:104880000420000804200021000000058421A089E4 +:10489000840800210000002100049000001088001E +:1048A0002021002100000808C000002000000008AE +:1048B00008100021000000000000000000000000BF +:1048C0000000022100000021000008040402000290 +:1048D000080404A00800034003882010410804C015 +:1048E00008080084839010000508000403012100DB +:1048F000004009000000000200400000000041826A +:10490000C0822100020011010808000004200000FC +:10491000211009000002202041004101000800216F +:1049200000A08040410800000000000000020000DC +:10493000000008000800000008000000000000005F +:104940000000000000000040000003908910088370 +:104950000004C0902040820009200809A0204000E7 +:104960000009C0024000080508110021000484006D +:1049700000000800000210218204C0800000C00076 +:1049800020020000C0028220012000000000080078 +:10499000C000000000028211C000C0001000A00092 +:1049A0000000000200110000000900000800C00023 +:1049B000000000000000000000000000820008006D +:1049C0000000000000400000A000040008002000DB +:1049D000000208080009090000004000040005006A +:1049E00000901100400100000000000008000001DC +:1049F0000000000000002001000000011110000074 +:104A0000000000001100000000010401000000008F +:104A100000004100000021000000000021400008CB +:104A20000000000000000000000000400000000046 :104A30000000000000000000000000000000000076 :104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 +:104A5000A00340080000C0038204000040020002DE +:104A6000000040020000840384000208820200006B +:104A70001000100000208200A0049000C00010026E +:104A800040008400A0050000C000202008020000B3 +:104A9000000008000800880084218200080000004F +:104AA0000000100008008400A000C0200800820060 :104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 +:104AC00000000000000000000000000000000800DE +:104AD000000003402100000408200484400410A1C9 +:104AE0004101089003040820401004000000000465 +:104AF0000302002000020000000020A0000003A02C +:104B000021001100000000000000410080892121E7 +:104B100040000000400000880088009020002084B1 +:104B2000410000104100210040000000080000008A +:104B300003880000000000000000000000000000EA +:104B400000000000000000000004404000000000E1 +:104B5000004000C0000002080000A0210800000082 +:104B6000000000004008000040001000824090005B +:104B70000810840040080821000008000000000020 +:104B80000800C000080008000802820000000000C1 +:104B9000830540000000000000004008C0104008ED +:104BA0008200400020000000000300080005100003 +:104BB000880000000009000000000000080000213B +:104BC00000000021000800000800000000000000B4 +:104BD00000000000000000000000000000000820AD +:104BE00000000000200000000300000000000000A2 +:104BF000000003200800210000000000000000A0C9 +:104C0000000003000000000000000000030011008D +:104C10000002400003000000000008000000000047 +:104C20000000000000008000000000000000000004 :104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 +:104C40000000000000002100000000000000000043 +:104C50000000000004000000C1A000200000048546 +:104C60000289009084A020820000000090000000D3 +:104C70000020001100A0202190A0019010200584A8 +:104C8000028510010000C021100240820020822015 +:104C9000C0A0908284000408000089C00020004069 +:104CA000A00020A0C0200108048200A000820020F3 +:104CB0000090C0000200014082C008828282008809 +:104CC000820800000000000000000000000000005A +:104CD0000000000000000000000089A000841120F6 +:104CE000802083402120808300110000020000000A +:104CF00000000305004005C1001000A0038005204E +:104D00009180800800050908801000800080000064 +:104D1000800080808500800080800000098400C0C1 +:104D20000010000508808080028080800080008064 +:104D3000050000008000800010008000800000005E +:104D40000000808000000000000000000000000063 +:104D50000000000000000000000000002000100023 +:104D600005000288400002008000000000000000F2 +:104D7000000000000000000280800005000000111B +:104D8000808080008000004180840000000080005E +:104D90008000808082000802028041030000000041 +:104DA00000410008000000000040800000000000FA +:104DB000000300000080000000030080000080006D +:104DC000800800800080000000000000000000005B +:104DD00000000000000000000000000000008290C1 +:104DE00090000188C08982000100A000842000009A +:104DF00000000000000020881000A08420C00800EF +:104E00000200A0100240A0004001A083A000080002 +:104E10008200A00004901008110089080908000011 +:104E2000000000000020000082009001A020080087 +:104E300000000001009000020000008300A000407C +:104E400004000201828400900000000000000000C5 :104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 +:104E6000020800A0010801C004A00000A190900465 +:104E70000000000000000000C000010810901002B7 +:104E800020030000008908914010000282A01082D7 +:104E9000029000080088A09002010082904190A139 +:104EA00000009008010001089120A08800200088DF +:104EB000A08890000000000021000040C090002069 +:104EC000002002020004000282080000000000002E :104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000000061 +:104EE00000000000400021002180002005418500D5 +:104EF000088500400010001100408000088020005C +:104F000091000088000500200020800003001000B0 +:104F1000800080000000000000008002004180A1AD +:104F200000900000000004000500080000000000E0 +:104F30000000890000000000000040000000008028 +:104F400000000300808000800080108000000000CE :104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 +:104F600000000000410010000580820000000000E9 +:104F70000000000800000000000000002100C190B7 +:104F800008800300000280000000000000000021F3 +:104F9000008000000000000000800000A01020C081 +:104FA000400003100000000080000000800000406E +:104FB0000080008000000020000000008000804091 +:104FC00080008000000000000008808000000000D9 :104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 +:104FE0000000000000000940410090020500002080 +:104FF000002000A000000000000000000000910060 +:105000000282838200002001209020088800840012 +:105010008891208202000000008800020000100138 +:1050200088400802100000002000A0008800020054 +:10503000100190209004080088002000900090004B +:1050400002008200020040001000908284080400E8 :105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 +:105060000000000000000000000000E000008400DC :105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 +:10508000000000E000008100000000E007000000D8 +:10509000000000E000004182000000000700000066 +:1050A000000000E007008200000000000000000097 +:1050B0000000600000E000006000810000E00000EF +:1050C0000000810000E00000600000000000070018 :1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E +:1050E00000000000000000000000DD4672B09716CE +:1050F00000C300000000699696D700000000000081 +:10510000000055555555FF0FFF0F3F55FFFF140089 +:10511000000000002020000030F300000000455592 +:105120004505FDFF0D0F00A0FFA000000000F33CAF +:105130000000C35575555555003CC3FFA03CA03C2D +:105140000000000000071417001700FFE82828EBF4 +:1051500000F500F500000000000000000000000065 +:10516000000000000000000000000000DD4672B0FA +:10517000479900C30000000082EB82960000000007 +:105180000000000000F00FFFFFFFFF003F55C0AA26 +:10519000FFFFFFFF0000000A0000BEBE000000008D +:1051A000300030F0F0F0000000AFFFAF0000000072 +:1051B0007979FFFFC355FFFFFFFFE8E8E8E800FF4C +:1051C000F0FF0000000000D714D700FF00FF2828E0 +:1051D0002828D5D55555000000000000000000002B +:1051E00000000000000000000000000000003C0083 +:1051F0000000F0F00F0F100000003C3C3C000000ED +:10520000000000000000F0F0FFFD00FF43FFD3109E +:10521000DF1CC0C0C0C13C3CBEBE0000F0303C3C06 +:10522000555517170F0F1455BEFF505000C30000FF +:10523000FA5005AF0000000000000000B0BEA0AAB8 +:10524000FCFCFCFC000000003F3F3F3F0000000072 +:1052500055F000F0D580D58000000000000000006F :10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE -:1052D00000000000000000000000000000000000CE +:10527000000000003C3C3C3C000000003C3C14149E +:105280000000000000000000F0F0FCFD00FF40FF07 +:10529000C300FF3CCFCFCFCBFFFFBEBE0000F070FE +:1052A000FF000F0F3F030F0F1400BEAA5F5FFFC385 +:1052B0000000FA50000000000000FABAFFBFF0FF43 +:1052C000F0FF8088FCFC000000003F3F3F3F0000F3 +:1052D000000055F141F1DF8ADF8A00000000000084 :1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D -:10531000000000000000000000000000000000008D -:10532000000000000000000000000000000000007D -:10533000000000000000000000000000000000006D -:10534000000000000000000000000000000000005D -:10535000000000000000000000000000000000004D +:1052F000000000610003009D000000610006000D39 +:10530000000000610006000D000000610005000DB6 +:10531000000000610003000D000000610007000DA7 +:10532000000000000000000000000061000C000D03 +:105330000000000000615006001D00000061000731 +:10534000C00D000000610007C00D000000613007C3 +:10535000C00D000000000008000000000000000078 :10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD +:105370000000000028EBCFCF00000000000000007C +:105380007676F0F0000000000FFFACAC0000CFCF4D +:10539000000000000000000050FA50FA0000000079 +:1053A0000000000000000000000000003A3A303F1A :1053B00000000000000000000000000000000000ED :1053C00000000000000000000000000000000000DD :1053D00000000000000000000000000000000000CD :1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000006C +:1053F00000000000000028EB0C0C00000000000082 +:10540000000098982E2E0000000000F0ACAC0000C8 +:10541000D7CF000000000000000028287D7D00009C +:1054200000000000000000000000000000003C3C04 +:105430003C3C081C3C3C0000000000000000000058 :10544000000000000000000000000000000000005C :10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC +:1054700000000000000000000C0C00003030303054 +:105480007F737C708E8E8E8E000000000000000006 +:1054900000540000000000000F0FFFFF000000009C +:1054A000AFAFBE14000000000000000000000000CC +:1054B000000000005F0A4B4B00000FFF3C5500004E :1054C00000000000000000000000000000000000DC :1054D00000000000000000000000000000000000CC :1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B +:1054F00000000000000000000000CFCF82C3FF3C8E +:10550000C3004F434C40B2B2B2B2000000000000F2 +:105510000000FF54FF00000000000F0FFFFF00001D +:1055200000000505BE14000000000000000000009F +:105530000000000000005F0A4B4B00000F003C55CC :10554000000000000000000000000000000000005B :10555000000000000000000000000000000000004B :10556000000000000000000000000000000000003B -:10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B -:105590000000000000000000000000020000000009 -:1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000200000000E9 -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000020000C9 -:1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000020000A9 -:105600000000000000000000000000000000000298 -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A -:105630000000000000000000000000000004000066 -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:105670000002000000000000000000000000000028 -:105680000000020000000000000000000000000018 -:10569000000000000000000000000000000000000A -:1056A00000000200000000000000000000000000F8 -:1056B00000000000000000000000000000000000EA -:1056C00000000000020000000000000000000000D8 -:1056D00000000000000000000000000000000000CA -:1056E00000000000020000000000000000000000B8 -:1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 -:105720000004000000000000000000000000000075 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 -:1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 +:1055700000000000000000000000000020110400F6 +:1055800020002000400000000203040820208800C2 +:1055900088000003000088000002000820022000AC +:1055A00000002003000000050002C041200320008D +:1055B000A000A00000000000000288000000000021 +:1055C0000000840020000000000000040002200011 +:1055D00020204000000000000000000220024000E7 +:1055E0000000200420000000000000000005200052 +:1055F0002000200000004000000000022002000205 +:1056000000001002050004020000000000002190CC +:105610000000080220000040000000000982000095 +:105620000000000040000000000000000002000038 +:10563000000000C000000040000000000004000066 +:105640000000000000000002004000000000000018 +:105650000000000200000000000000000004400400 +:105660000000000000000000000000000004000036 +:10567000000000000000000000000000000000002A +:10568000001000000004000000000040880000003E +:1056900084100010021000102000004004000000E0 +:1056A00000000000000000000000000000002000DA +:1056B0000010000000000400000000000000840052 +:1056C00000000000020000000000000000000400D4 +:1056D00084002000000000000000000002410000E3 +:1056E0000040000000000000000000000200000078 +:1056F0000000020000000000820000000000000026 +:105700000000040802C00400000805002182000017 +:1057100000000300000805004108400004080500DF +:10572000000200080084400000880402000000001D +:1057300000040000001040004004000000080000C9 +:1057400000020000009000000000000000000000C7 +:10575000001000000000000005000000000002082A +:105760000000020000000000000000000000000037 +:10577000000000000000000800000000000000041D +:1057800000000000880084009000840088008800E9 +:105790008400842082408800100088408400000437 +:1057A00008008404100000000000A00084004004F1 +:1057B0009000000010000020000000008800202061 +:1057C000000040000000000004008400000400000D +:1057D000C000880010000000100882009000000047 +:1057E0000000C000000000000000000000000000F9 +:1057F0000000000000000000000002004000000067 +:1058000000000000002103A00808039011A0200858 +:1058100000100000030041000000400009200300C8 +:1058200005A003000200208400200090402000001A +:1058300040042100088200900300024000A0000004 +:10584000080021000200000041900300110000C088 +:105850002100210240001188000400000800080017 :105860000000000000000000000000000000000038 -:105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 -:105920000000000000000000000000000000000077 -:105930000000000000000000000000000000000067 -:105940000000000000000000000000000000000057 -:105950000000000000000000000000000000000047 +:1058700000080000000000A0000000000000000080 +:105880000000000000000000C0008204C000000012 +:10589000080010110809080910000040002000400D +:1058A00000020000A04008000000C000000000004E +:1058B000000000100010820000021020080000000C +:1058C0000000000900110000000000090000820033 +:1058D00000000000840200400004000400410000B9 +:1058E0000000004000000000000000000000000078 +:1058F000000000000000000900000000000000009F +:105900000040000000000000000000000300400014 +:1059100021000200100040400040088810202000B4 +:105920000000000003882100000003201020000078 +:1059300011000800050000000000000441001100F3 +:1059400040000000000011880088000000000000F6 +:1059500003C0000000000000000000200000000064 :105960000000000000000000000000000000000037 :105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000000000000000C7 -:1059E00000000000000000000000000000000000B7 +:10598000000000000000008800000000000000008F +:1059900000000000000010000000000000000000F7 +:1059A0000000000000000000900000000000000067 +:1059B0000800000000000000080084000000000053 +:1059C00000020000000010000000000000000000C5 +:1059D0000000820000000000000000000000000045 +:1059E00000000000A0000000000000000000000017 :1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 -:105A40000000000000000000000000000000000056 -:105A50000000000000000000000000000000000046 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 +:105A00000000000000000000000000000000210075 +:105A10001100218810880588030403000000118804 +:105A20002100009000000800030040040004000270 +:105A30000502050005900020410403081004000041 +:105A400000000988040409000084114000000000DF +:105A5000000408020388110411040404050008046A +:105A6000000009880800080000000300000000048E +:105A700000002002000000080000000000000000FC :105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000000000000F6 -:105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000000000D6 -:105AD00000000000000000000000000000000000C6 -:105AE00000000000000000000000000000000000B6 +:105A900000210008000000050000080000000021AF +:105AA00000000000080000000000000084008800E2 +:105AB00000000000040000000010000000000000D2 +:105AC00000000000C0000000000000000000000016 +:105AD0000000080008210000000000000000000095 +:105AE00010000000000000000000000000000000A6 :105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 -:105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 +:105B100000001000000010000000000000C0110094 +:105B2000000020000000000040000000004011883C +:105B30004000000000002100000200000988000071 +:105B4000000000000000000040000000080000000D +:105B50000000000000000000000000000000211014 +:105B6000000000000000080000000000000000002D :105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 +:105B800000000000000000400000000000000000D5 :105B90000000000000000000000000000000000005 :105BA00000000000000000000000000000000000F5 :105BB00000000000000000000000000000000000E5 @@ -50782,37 +50782,4134 @@ :10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B -:10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B +:106530000000000000000000000020004100018079 +:106540008200828000028204880388112008880467 +:10655000400440800420000803040000200084045C +:10656000C0102082000220001008100000844000AB +:106570002020200200004004201000030000000042 +:1065800040042002201140002000208020008800CC +:106590002000200020004000200020040000000017 +:1065A00020002004200020002000000000002080A7 +:1065B00000000002200020000011200000C00800A0 +:1065C0000420040000101000210010904102090076 +:1065D000000500000020C001004120824000008230 +:1065E00021A020050020000300020003000000029B +:1065F0000000100300000000000021000000210046 +:10660000000000000005040000000040002000021F +:1066100000000000000000000000219000000000C9 +:106620000000000000000004000000000000000066 +:106630000020000021000000000000020000020015 +:1066400020800200038000000000200888058200EE +:106650000000C1050002022140004000204000204F +:106660000000080508000209010504801000001060 +:1066700000000800002000000000000000040000EE +:10668000000000000000001082000000C000082090 +:106690000400000002000000000082000040000032 +:1066A00002000000000000000200000000000000E6 +:1066B00000000020040800000000000000000000AE +:1066C000000084040008200420820008200204083E +:1066D00020080404200803100982020004048884AE +:1066E00003010400020200900400080289208008CF +:1066F0000408400200080405040004020000001120 +:1067000000004100040020000288408400080000CE +:106710008009C0040410C00400040908000400003B +:1067200000000900000040080200400200080000CC +:10673000000800000009A0000000000800000000A0 +:1067400000008440200000002008040084408410E1 +:10675000108004034080080008000000400800008A +:1067600004088900100000094121218088211000BF +:1067700001C08221000088218408880000080005EB +:106780004000000004022000A0099004040820003A +:10679000000488054000000802000000001100000D +:1067A00000000000000000004000000000000000A9 +:1067B0000000000000000000000040000000000099 +:1067C0000000000040008000030083000000000083 +:1067D0000000084010004120020240000000A1001B +:1067E0000300412004001000000002880410004053 +:1067F0000000020200000000000000000090000005 +:1068000040040000000000881000040000000000A8 +:106810000008000000000000009080000000000060 +:106820000000000000000000000000000000004028 +:106830000040000000000000000000000000000018 +:106840000000000000002000918009042080040066 +:106850000002C011A100C0400010824008000002E8 +:1068600005041004080482000000A000C02010905D +:10687000A00404000820C002C00200000080100034 +:10688000000082002080000004000800C080044155 +:106890008240000000100080820900008240000059 +:1068A0000000000000000000100000008200000056 +:1068B000000000000000080008000000040008407C +:1068C000000000000800820000A0200404008004F2 +:1068D000218200C0410008840400410002040088B5 +:1068E00004200400098200902100410000100000F3 +:1068F0001021410009000001038408000200100477 +:1069000000880810410080040000000000002140C1 +:1069100000840000000000000004210000000000CE +:106920000300000000000000000000000000000064 +:1069300000000000000000000000000000008000D7 +:1069400000000000000000000000100082000000B5 +:10695000C080080208008200820040000402840017 +:106960000021080004000880000208024004821090 +:10697000C000080010000205080840002000A02008 +:10698000C041901010200021880000000000A000ED +:106990000004000000000000A020008001000000B2 +:1069A0000080000000000000000000000000000067 +:1069B00000000000000000000000000000000000D7 +:1069C0000000000000000000000000080004008833 +:1069D00002400804400400A00000080005008004F4 +:1069E00003000000000000000002000100000000A1 +:1069F00004000000800000008090080110000400E6 +:106A00000000000400010000009009000000408820 +:106A1000000000200004009004000000002004009A +:106A20000000004000200000000000000000000006 +:106A30000000000000000000000000000000000056 +:106A400000000000000000000000000000008200C4 +:106A50000800000008001000000000008440200032 +:106A600040009000C008C1000000840001008820A0 +:106A700040000000C003C04109088500848800056B +:106A8000A0000803820384084002A0410010000017 +:106A900084001000040800009000000810000005A9 +:106AA00000000000000400100000000000000000D2 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000008BE +:106AD0000400008200000002204000000002208428 +:106AE000400280000000030804000800000020208D +:106AF0002000100000000008200884020404080997 +:106B00000800050811000300208805054004400125 +:106B100000000000030040001004210000004002BB +:106B20000300000000000000000000000000000062 +:106B30000000000000000000000000000000000055 +:106B400000000000000000000084000000000000C1 +:106B500000009020032082400402038800200020CF +:106B6000841000A0909001400082000500049082F3 +:106B70000000000200880010008801C00140214090 +:106B800000040201000041000000030200409005E3 +:106B900004400000010000000000000001000000AF +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000000D5 +:106BC000000000004000002000C0000000000000A5 +:106BD000000000000305824110C000C0A100008039 +:106BE00000000080038080001080008009410808B8 +:106BF000104100100000000000000000218008008B +:106C0000408000808810002104030002890205C131 +:106C1000200880200000100000000000000020007C +:106C2000000010000000050000000000000000004F +:106C30000000000000000000000000000000000054 +:106C400000000000000080000000000000000000C4 +:106C500000000000000005804100400240030000E9 +:106C60008080802180000800210204000508208027 +:106C7000202002800510000000918000000020808C +:106C80000883088002A10580C100881090A18300BC +:106C90009003059005A10000200021102080100025 +:106CA00080000000000000000000000300800000E1 +:106CB00000000000000000000000000000000000D4 +:106CC0000000000000000000000080910040000073 +:106CD0000000000000000000004000000001000172 +:106CE00040000440A0890200009001010040000023 +:106CF00000C00001000400000800A008848840884B +:106D000001C001100002000940028200A1000891A8 +:106D1000A01021019003400500000000000100C008 +:106D2000010002001000400000C0000000000088C8 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000020008240200839 +:106D500088080000000000000000888200A00505EF +:106D6000A088100400A000C08882200000008200DB +:106D700010000000000000010000400000000200C0 +:106D800009000000000010014000009002104005C2 +:106D9000001040000040A0041002000000010000AC +:106DA00000010000000000000000000000000000E2 +:106DB00000000000000000000000000000000000D3 +:106DC0000000000000000000000000004040002023 +:106DD00090C000A0000000000000000000034188F7 +:106DE00085210905000000000000000000000000EF +:106DF0000000000000091121202111098900000074 +:106E000000008900040500200021804000109090BF +:106E100009A1040080104141838382910000000891 +:106E20000002002100110000000000000900000025 +:106E30000000000000000000000000000000000052 +:106E400000000000000000000000000000008000C2 +:106E50000080800000800000000000000000218011 +:106E60001004050005090000800000000000C105B5 +:106E7000A0004000024188A1200221000803000870 +:106E8000008800800000C1828540830002112180BB +:106E900002800800400521032180C000C0030000DB +:106EA00000808010800000030000000500800000CA +:106EB0008011800080000000000000000000000041 +:106EC00000000000000000000000000000000000C2 +:106ED0000008000400800000000000000000000026 +:106EE00001400101000000000000028800200000B5 +:106EF00002202000200090010205A00141001100A5 +:106F00000200102002848800C109040040008900AA +:106F10000140010801040000114090A0A0041000ED +:106F20000000100408010200040100000020000815 +:106F30000000C001200004008400000000000000E8 +:106F40000000000000000000000000000000000041 +:106F50000000900120100890840000000000000054 +:106F60000000000000E0070000000000000000003A +:106F70000000000000E007000006000000E007003D +:106F800041000000000007000000000000E00700D2 +:106F90004100000000E007000000000000E00000E9 +:106FA000000000000000000000000082004100E03E +:106FB0000700000000410000070000000000000082 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000700000000000000AA +:106FE0000000000000000000FFFFEBFF550055000F +:106FF000AAAAAAAAC3003C00000000000FFFBFFF1E +:107000000000000000D700D400000000AA82FF00AA +:1070100000000000000000000C0D0C0F0F0F0F0F00 +:107020005F5F505F0000F050A00000000000000013 +:107030000000000000003C3C303F00000000000069 +:107040000000000000000000000000000000000040 +:10705000000000000000AA3CAA3CD7F582A0000076 +:10706000000000000000000000000F0F0B1F550083 +:1070700055008AAA8A0ACB003400000000000FFFE6 +:107080000FFF00000000FFD7FFD4000000000A82BD +:10709000000000000000000000000C0D0C0F0B1F92 +:1070A0000F0F000000000000C0C0C0C000000000C2 +:1070B0000000000000000000AAAA303F000000000D +:1070C00000000000000000000000000000000000C0 +:1070D0000000000000000000AA3CAF3CD7F582A0F1 +:1070E0000000000000000000F3C3B28200000000B6 +:1070F0001000150000A200AA3030303A0000000055 +:10710000FFFF0FFF00000000A0ACA0AC5757D75501 +:10711000C0C0030200000000000000003F173F3F16 +:10712000203030302820AAA000000000000000001D +:10713000000000000000F535F535000000000000FB +:10714000000000000000000000000000000000003F +:10715000000000000000000000000FFF0FFF280AE1 +:1071600028FA0000000000000000F3FFB2BE00009B +:1071700000005500550000AA00AA3C3C3C3C000021 +:107180000000FFFF0FFF00000000A0ACA3AF7F7F57 +:10719000FF7DC0C0030200000000000000000F0FD0 +:1071A0000F0F00100000AAA0AAA00000000000001D +:1071B000000000000000000005350535000000005B +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000F000F0CF +:1071E000EB0AEBFA00000000000000000061000D57 +:1071F00000090000000030000000000000610007EE +:10720000000500000061000F000D000005003008BF +:1072100000000000A5415A0F050D00A00061000705 +:10722000000D000000610007001D000000008061EB +:107230000006000D00000061003F000D00A01000DE +:10724000003000000000000000000000000000000E +:10725000000000000000000000000000000000002E +:107260000E080000000000000000000000001800F0 +:10727000DBC3FFC3D3D300000000000000000455AF +:10728000555500000000FF14F0503F3F3E3E000007 +:1072900000000000000000F0FFFF000028280000B0 +:1072A0000000DF00DF00F0F0F0F0F00071000000FF +:1072B000000000003C00FCF00000000000000000A6 +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F0003C3C3C3C3C00D3D30000000000000000BC +:107300000055555500000000F014F0503F3F3E3C42 +:10731000000000000000000000713C3C080028282C +:107320002C00FFFFDF00DF0020F00000F000F00085 +:107330000000000000003C00FCF000000000000025 +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:107370000000AFAFFCFEABFFABBE000000000000A2 +:107380000000000000000F4F0F0FC3FF5C00000063 +:107390008A00000000000000000000000000E0F093 +:1073A000C000000020000000000040434141F0F018 +:1073B0003030000000000000F434C404000000007D +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F00000000000AFFEFFAFFFEDFFBE0000000089 +:1074000000000000000000000F4F0F4F00005C0064 +:10741000AAAAAAAA000000000000000000000000C4 +:10742000F0F0D000000028080D3DCDFD0000000068 +:10743000F0F0A000000000000000F737C7070000D0 +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:107470000000000000008400848084100010880256 +:107480000200C00840048400200040038300200064 +:107490008400200021002011030204000284040063 +:1074A00021002002C0002080C08020002080020037 +:1074B0008500020000040003200040028804040844 +:1074C0002000200088200004200088002000880080 +:1074D0002000200020088400200000000000200080 +:1074E000C00020002004000420002080881020809C +:1074F000200020002011200040C041042001008510 +:10750000410040020004000241080400A0002040A5 +:1075100000020000000004000900A0004000040276 +:1075200000900400000400000002000200000002BD +:107530000000200000002100000000C00500200124 +:1075400000000000000200004000410000000002B6 +:107550000000000200000000000000000000000029 +:1075600000002000000000400000000000104083E8 +:1075700000200000000000040000000083002090B4 +:107580000200040201808410C000400020408308F3 +:1075900000000400050021202080A0402000882059 +:1075A00000100000040020009140898802100003B0 +:1075B000A004082002040000208200004000000017 +:1075C00000800800000000000200018000000000B0 +:1075D0000000000584000200000000000000000020 +:1075E000000000000000000000000000008000001B +:1075F00000000010000000100000000000882000C3 +:1076000080040004A00908400003000880008341B2 +:1076100002400040840084008401C1100504090078 +:1076200000414101050885088308400440030089A2 +:1076300000040000840200080000C111000080085E +:1076400000000020A00000400010200408040008F2 +:1076500000000002000840C0004000000004008458 +:1076600000000400000409080000000000000040C1 +:107670000000000000410000000000040084002021 +:10768000882100000000000000000202000020210C +:10769000100404210002000000100403400204084A +:1076A0000002000484000005850390020011892077 +:1076B000000240218808100300000041100800006B +:1076C000000004030002004140000400C000000567 +:1076D0008200880000050000000000000000000893 +:1076E000040000080000000200000000000000008C +:1076F000001000000000200000000000000000005A +:107700000000050011001000410008902100400019 +:107710002108050011000091000000090084030801 +:1077200000102102084110A000A02020000011201C +:107730000401080010A0210021900002030200A013 +:10774000000000828000410000000008800000006E +:107750000000000200900000000000000000000097 +:1077600000000000000000000000050021004100B2 +:107770000000000100000000000000000088000080 +:1077800000000040840000400041042040111041EE +:10779000C01104C0C004042000829000080340040B +:1077A000A109A0418404840084098540009104A0BB +:1077B00082111002C000040090000108880908111D +:1077C00020000000C0090800100082000080820034 +:1077D0004000881000C0080400400000A004000021 +:1077E000A0000040000008000800000000000000A9 +:1077F0000000002000000020001000200000000019 +:10780000000000000800000000A011A0024040405D +:107810001100210480200908210140050990002061 +:1078200000404000048810A14008008408000304C0 +:1078300091201108A1010000410800000200098206 +:10784000400480C000000300000000200000001081 +:107850000000200000400004000000000000004084 +:107860000300030003000500000004000000000006 +:1078700000001000000000000009080100010000E5 +:10788000000000000000A005040082090820880014 +:107890000221082100210000201104042000000022 +:1078A000004000410000080590212002200208004D +:1078B0008484040408410482880082208200080035 +:1078C0002000040408000000002000004020842064 +:1078D000000900200000000200000000000000007D +:1078E0000000000000000000000000000000840014 +:1078F0000000000082000000000004000000008082 +:1079000000000000000000000004082000404000CB +:107910000004800800880000400083008001880087 +:107920000008100000000404800200008003892089 +:1079300040A0004005A10082800304000002214015 +:10794000400088009101040200000500410421006C +:107950000590040000014100000100000400000047 +:107960000000020000000000000000000000000015 +:10797000000000000000000000002000800800005F +:107980000002000000000000000040080004400069 +:10799000820008C040028200820088202021210944 +:1079A00010008202820000200184400000000403D5 +:1079B00001008209050584201021C008402190059E +:1079C000C0404000080820854004000084040003F3 +:1079D00000210005000000200000012120000021FE +:1079E00010000021000000000040000000008200A4 +:1079F0000000000000000000000000000000000087 +:107A0000008000000000000000410008001000108D +:107A10000008001000042010208408C0040180A089 +:107A2000A0022000200002000001044100820000AA +:107A30008000200000004090030141004000000051 +:107A400000000800000000829110000100002100E9 +:107A50000388002000000000100520002004200002 +:107A600000000000084000000000000010000000BE +:107A70000000000000000000002020040508009025 +:107A8000000000402000000000000000000003880B +:107A900020820110821089000002008540A10000B0 +:107AA0009001A001000103C09020A0A082900000DE +:107AB000000020000000030021004100040001A09C +:107AC00005A0A1000803A0A08588A08288A00000CE +:107AD00010840191828502080000010083000000EB +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 +:107B000009A000208808100000000000000000000C +:107B1000A100808010008080110900A10882000867 +:107B20000003052104030020A180858010808000CF +:107B300011002100080000008200080090000000F1 +:107B400010838208020880908011030311C0000393 +:107B500000008003088200A08011000003001000D4 +:107B600000000000000040000000000000000000D5 +:107B70000000000000000000000000000000000005 +:107B800000001080000000800000000000000000E5 +:107B9000000003002103A00085028004000080098A +:107BA000800080000304C0850885000000100040AC +:107BB00080000200401020850000808000A000C0EE +:107BC00000410200A12183804100C0002120200942 +:107BD00040410000850020119180A10000000009B3 +:107BE00080000000002000000000000000000000F5 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000021800080000000000053 +:107C10000000000088404001A08802C140009000A0 +:107C20000200044010008800090521108800028825 +:107C3000022010048200410100090002881004099A +:107C40008483080191200900A18401200820A1005B +:107C500088C0C0210000020009C10584059004000D +:107C600090880200A09000000000000000000000CA +:107C70000000000000000000000000000000000004 +:107C800000000000000000002000A010080000001C +:107C9000000000000000104000A0822010044104F9 +:107CA00000001010A0A00000100110010000100939 +:107CB000002008201191000008000201000000A02F +:107CC00084030821000285900000C085A040C00800 +:107CD00008880991C0C000000091001000918890B0 +:107CE0000000000100000001000000000000000092 +:107CF0000000000000000000000000000000000084 +:107D0000000000000000000002910002000320C0FB +:107D100000000000000000008080008000008080E3 +:107D2000C0802000C18080801000201083211104B9 +:107D300085050083800208A00011802100104120E9 +:107D400003050082804000894110002105A18203C3 +:107D500080C083A1912104850000002021050590A9 +:107D6000000800050020002021082000000000007D +:107D70000000000000000000000000000000000003 +:107D80000000000000000000000080400000001023 +:107D9000008000000000000000004080800005001E +:107DA000000900110009000000008000100221807D +:107DB000208080100090801180000088001000005A +:107DC0008011C0081090C1002000210490200840BC +:107DD00008100321A088A0100905000000838080FE +:107DE0000080002080000010000000000000000063 +:107DF0000000000000000000000000000000000083 +:107E0000000000000000000000000000804000882A +:107E10000000800000000000000000000340080493 +:107E20004090880100010082002000000804092021 +:107E300011904008020008C1042184000209824018 +:107E4000A0882001030120110488C10041884084DA +:107E500041200501891104A004850001000010C023 +:107E6000040808400000020088A120400000000033 +:107E70000000000000000000000000000000000002 +:107E80000000000000000000000000000000C00032 +:107E90008820102002000000000000000000000008 +:107EA00000E000000000000000E00700000000000B +:107EB00000E007000000000000E0070041000000B3 +:107EC00000E007000000000000E0070000060000DE +:107ED00000E007004200000000E00700410A000047 +:107EE000000000E007004100000000E00700000083 +:107EF000000000E0000000000000000000000000A2 +:107F00000000000000000000000000000000000071 +:107F1000000000000700000000000000000000005A +:107F2000007000100000624200000000000081C3E9 +:107F30006C6C6C6C000000007E187E18C009CF09C4 +:107F400033111133000000004B004B9900C3990F0F +:107F5000F4F40404C3C3003C9000F0600B00000084 +:107F60000000F9F999FF1818FF1800F000FF000051 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 +:107F900000006F60909F00FF81BD000000000000A6 +:107FA000000000F000F00000664200000000000049 +:107FB00099FFFF0FF00000000000F6F69090C0F966 +:107FC000CFF9FF9999FF000000004B664BFFFFC3FC +:107FD000990FF9F00900FFFF003C9090F0F00B00C2 +:107FE00000FF0000606000663030FF30F0F0FFFFFF +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:10801000000000006F60C3C30F0F8D8D00000000D3 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A000000000000000C1000000033FBDBD9100C2 +:1080B0009100000081C100000000E78160609981AB +:1080C0003030C3F0E7F000000000EBEBEBEB00001A +:1080D000000000000000240024003F003F000000DA +:1080E000183C2424240000000DFD04F4D700D7D749 +:1080F00000000000660F3CFF0000000000000000D0 +:10810000000000000000000000000000000000006F +:108110000000000000000000FF06FF9F60606F6F1E +:108120000000000000000000C100C100033F818189 +:10813000919191910000818100000000E781F9F99F +:10814000FFC330300000000000000000282828286D +:10815000000000009990181000003C00420042000E +:1081600000000C3C2404240400000DFD04F4D7D7C7 +:10817000D70000000000660F3C0000000000000077 +:1081800000000000000000000000000000000000EF +:10819000000000000000000000000006009F6F606B +:1081A0006F60000000000000000000614005000555 +:1081B00000000561000F000D00018561000F050D35 +:1081C000000105615A0F050D00A00061000F050DAB +:1081D000000100610A0F051D00010560000F000D80 +:1081E00000000061000F059D0001000000610E0607 +:1081F0000005000000610A0F000D0000006100078B +:10820000000D000000000000000000000000000061 +:10821000000000000000000000000000A061000E4F +:10822000009D00000000000000000000FFFFFFFFB5 +:10823000000000000000000000000000C0F0C0F0DE +:10824000A50AFF0000000000435FC1F50000000028 +:10825000FFFFAA87AFFA83C2B2B2B2B25555454109 +:10826000EFEB454100000050000004FF000000005B +:1082700000008DCC0D0C00000000A8AAA0A20000F8 +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A000000028EB28EB0000000000000000A0A068 +:1082B0000000000000000000000000000000C3FFFC +:1082C000C3FF5FA5055F000000005F43F5C100002C +:1082D00000000000AA8783C2AFFA00C33CFF5555D7 +:1082E0004541EBEB41410000F030000000FF000091 +:1082F00000000000CCCC0C0C00000000080A0002BA +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D +:108320000000000028EB28EB000000000000000027 +:1083300000000000FFD3FFFF448855AA00000000A2 +:108340000000EB00F00FF00F000000000000000044 +:1083500000000000D703D703000000000000000069 +:1083600000000000FFFF000000D255D2C3B0C0B033 +:108370000000448855AA00CF10DF00000000000074 +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000000000000000000CD +:1083B000000000000000C3C3FFFFCCCCFFFF0000A3 +:1083C00000000000FA000000FFFF000000000000B5 +:1083D000000000000000D73FD73F00000000000071 +:1083E0000000C0000000F4FC0B03AAD2FFD2C3803F +:1083F000C0800000CCCCFFFF20EF30FF0000000069 +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:1084300000000000900504000290A00420112020FC +:10844000888020848288820200022000208020020E +:10845000881020808800400220401004040004009E +:10846000020920042000040040030003028002846B +:108470008480048400039000100200008208400001 +:1084800088000082A0000000200088030003C000D4 +:108490002000C000000004880400000220900400B6 +:1084A0000005000020028800200000000004008376 +:1084B00004048500010008020002002004A0050059 +:1084C00010411010102020200941000300900910D5 +:1084D000A000040500202102200009C08900848238 +:1084E000090204C080000000410004000204A04012 +:1084F00089400410C010000040C0000105000000C9 +:108500000000040200410000090000840500000092 +:108510002084000000A000000011000000030005FE +:108520000000000000000001040000000000000046 +:108530002040800002000800040002000000844087 +:1085400090000200000300080800050000A1418817 +:10855000024120C18200A18002809004900090021C +:10856000202021001040040000008500020000408F +:108570002100000000800510000003020000000040 +:10858000042004002080A10021829000040000004B +:108590000000008000000008000000004002001001 +:1085A00000008800020000000200400000000000FF +:1085B000000408000480004000800008000405005A +:1085C00000090482008803840910098440400920BE +:1085D0002003000082040588041005200009000023 +:1085E00004038203A0000984A008040820001104E9 +:1085F0000508880804080010880800002009040401 +:1086000020004189038800200408842100820000A2 +:1086100000080084004000080004000802048211E1 +:108620000211000400900002008400088000000095 +:1086300000100085808280400009001004418800FD +:108640008200002040211000880800058809902140 +:10865000040811A000038408000800118410882178 +:10866000A021400884000000C0080010820200A180 +:1086700000040021042000800421040300002041A4 +:1086800000080180408385204000009002080441DA +:1086900000000000000800210005C003A000000049 +:1086A0000008C00801040008000800000090000550 +:1086B00000004008C090001000080003900503046B +:1086C000100810A00311410002A0030003000400E1 +:1086D0000000029090040010098208A003004004EA +:1086E00040904000088208042190058441A00500C4 +:1086F00002042190080009040940000889000000D4 +:1087000008A0009020028302029100020040800035 +:108710000000000000000000080800000000080041 +:10872000080000000001020100004100000041417A +:108730000000000080000004000100840902000025 +:108740000800C000C004042102090011A0408240BA +:10875000410200000841100400001010A009A020F0 +:10876000042000041002028400050802000000C07A +:108770000102C0048241820020209040000000C01D +:10878000000004008200820400000482040008004B +:108790002080C00082000800000082000000080065 +:1087A00010001000000200000002000000000000A5 +:1087B0000000000000000802C011040008000800CA +:1087C00002200200100000001000090803880001C8 +:1087D00004C084824100400004A10588408205A0B5 +:1087E0000040210100010889820840A040010000EA +:1087F00003044082000100020510C0A01001000027 +:108800000020000000000000408500089040A1000A +:10881000208480400990000020040088000010A0FF +:108820000300000000002100040000000800050013 +:108830001000000000000000002000000000000008 +:10884000000000010000820000200020041004103D +:1088500008084010A000000040000800A008080020 +:10886000C01182414008200000000821A0081080AB +:10887000A04000202000040082000041C00002004F +:1088800000410085000004001000000884208220C0 +:1088900004800020404010000000C000C0008400A0 +:1088A000400010001000820008049000C000400545 +:1088B00000400000820000030100000000000000F2 +:1088C000000008800010058821A0080441200384CE +:1088D000A141000021910384100280900040008497 +:1088E0004082110011080800C1C01100008800007A +:1088F00005040008000510A00040400008844082E4 +:10890000C120080408200000008840000304212141 +:108910000808104008052000410021000000000068 +:108920000000000000000000000000010000000046 +:1089300000000001000000000000200000024108CB +:1089400000000000804000000000A041040008007A +:108950000240A00090004000C010080040109008A5 +:108960001011004184040400100804030400404175 +:108970000020010808008204002000000008000315 +:1089800020000900100088210000A000080000005D +:108990008805000810080021084004040021042173 +:1089A000A02104008200A000C00000000010000010 +:1089B0000000000008058209000000080008000807 +:1089C0000000000800400040000021000800820074 +:1089D0000200110111200090000000042088110401 +:1089E00000400320418441008000100008900440B2 +:1089F0000010000508880002202008090800110066 +:108A000000008000080000000000000000000000DE +:108A10000800080020000088000000010800000095 +:108A2000110000200000000000000000000005010F +:108A30000000000010000000009000000000000096 +:108A4000110000200000000100010000081000C01B +:108A500000040410A002008400A0200882890921DB +:108A600003219009840000000100840000400008F8 +:108A70004008000401410088000800910000000146 +:108A800000010000834000200120909000000001C0 +:108A900011000400000110C00002A00890020000B4 +:108AA0000000000000002000000000001000C0C115 +:108AB0000104101082100208200808008200000142 +:108AC00001008200000189002010001002889180BE +:108AD000000000800080A080000000800080001066 +:108AE0002110400803408000000041000000088081 +:108AF00009008500000011900008204100100003CB +:108B000000084002000310800000400080000000C8 +:108B100000208200C011001004802100200000808D +:108B20000000000000000000000000000000000045 +:108B300080C10889881000208800A1008000800082 +:108B400000104005030500100900800000800000AF +:108B50008000002180800080800000218000800053 +:108B60000200090811008940000080000080000315 +:108B70000200110020110900001000000005000093 +:108B80000000000000000020801100218090800083 +:108B90000000200005009100000303000903880085 +:108BA00091800000000000000000800000008000B4 +:108BB000800003000303A180C185000000C0808005 +:108BC0008000000009004000030800008041801080 +:108BD00080800800402010A0109002002000A00813 +:108BE000900008C0100008888300209004009002C4 +:108BF0008200000000000000010000A00000000052 +:108C0000001000880000000000018800200040A043 +:108C1000C0080000832090008200C0000400C00152 +:108C20008400C102000000000000000004002000D9 +:108C3000020004000240030109A011A08200A0C1AB +:108C400040A0C000000200000100000090001000E1 +:108C50004089C082101000400490A0104090009005 +:108C60009008029010080088059120A100880084D7 +:108C7000004000A090002000000002000800410019 +:108C8000C0008400000001000000000090400020AF +:108C9000201002C00000000100000101000008A136 +:108CA0000008020208C100000000000000000002ED +:108CB0000000002000A0C00001A1000410909082DC +:108CC0000004008208C10000010002010001401000 +:108CD0000008101002C080000000808080808000AA +:108CE00000000080800080040321A10211880000A0 +:108CF000000000800380820380030003800991004C +:108D000084000800090011000200410000000080FA +:108D100000000000808000000010102005210208E3 +:108D20008002000500C185910000000000000000E5 +:108D30000080000000000080804011A102C1088076 +:108D400000400009000000100041112080210008AF +:108D500080000080808000800010808500800000FE +:108D60000000000500000000418382050980829018 +:108D70008420830520009000008210100000000570 +:108D80002100201000000500210404040800050053 +:108D900000030021800000000000218010800800F6 +:108DA0002008800580038000001000000000000003 +:108DB00000000000000000000000A1C008000080CA +:108DC000020800000080000000004100400009008F +:108DD00008048000800880000000C0004020C0C05F +:108DE000C00000008890108810008340A104900209 +:108DF00005821000091140A00800000800010000D1 +:108E0000000001000101000000000101010001005B +:108E1000000088000088029010000000010801088E +:108E200001A00001C002400808C088010000000045 +:108E300000000000000000A0004000000304834088 +:108E40008202000102002010888240000000010020 +:108E500000000101C000A090081090000000000078 +:108E6000070000410000000007000000000000E0D3 +:108E700007000000000000E007000081000000E0A3 +:108E800007000000000000E007000000000000E014 +:108E900007000000000000E00700000000000000E4 +:108EA00000E007000000000000E0070000000000F4 +:108EB00000000000000000000000000000000000B2 +:108EC00000E00000840000000000000060000000DE +:108ED00000E0000000000000000007000000F000BB +:108EE000F0FF307DB2FF00000000000000803A007B +:108EF0003F00003C003CF757F25241C1C3C10000A3 +:108F00000000000000000000000000000000000061 +:108F1000000000000000FFFFA0A08A00AA000000DF +:108F200000000000000000003C3C3C3CAA3C0A3C25 +:108F3000000000000000000000000000410041416E +:108F4000F05FFF5FFF00FF0000300075000F000FB3 +:108F5000000000000000000028EBE8E88228C33C85 +:108F6000AA3CAA3C004D82CF004000400000000017 +:108F70000A000F00F5F5A0A0F757F2524180C38018 +:108F800000000000000000000000000000000000E1 +:108F90000000000000000000CFCF00000000AA0089 +:108FA0000000000000000000000000FFF0F0AA3CFC +:108FB000FA3C000000000000000000000000550026 +:108FC0005555F050FF50F5F5A0A000750075AEAFF7 +:108FD000AAAF000000000000000000C3C0C0C0280D +:108FE000C33C3F305F5FFFFAD7D2FF005555EFEF2C +:108FF000AE048200C3000F0F555500000000CFCF14 +:10900000CF8EC0A0CFA0000000005451A8A2000045 +:1090100000000000000000000000FFFF5555003C6C +:10902000FF100000000000004043C3C37C7F7D7D33 +:10903000FF78FF3C0000000000000000000000007E +:10904000020EC2CECACA353500FF00FF00FF5555DB +:109050005555FF5D00000000000000000F000F00EC +:10906000141414143F3050502D2805005C5C5C5CD7 +:1090700045EF0404C000C30000FF3C3C00000000BA +:10908000CF4DCF0CC0AFCFAF00000000FCF3FCF31E +:10909000000000000000000000000000C0FF40557C +:1090A000003CFF14000000000000C3C3C3C34043E2 +:1090B00041410078003C000000000000000000007A +:1090C0000000323EF2FECACAFF00404045450000A3 +:1090D00000000010FF1C0000000000000000002D38 +:1090E000002D0F0FFF00000030080000000080007E +:1090F0000008001000000061000F000D000000617A +:10910000000D000D00000541400F000D000005613D +:10911000000F000D00A00561000D000D00000061B2 +:10912000000F009D00A50000006100030005000085 +:10913000A061500F009D000500000000000000002D +:109140000000000000100000006150050009000050 +:1091500000613006000D00050061000500090000F7 +:10916000A0000008009000A5000000000000000022 +:1091700000000000000000008174003C00000000BE +:109180007FFF5F5F000000000000FF000D0C050482 +:109190001400000000000000F7D7FFFF00000000EF +:1091A0000000000000000000000000000000FF00C0 +:1091B000FFFF000000006909696000000000000076 +:1091C00000000000000000000000BEFF14FF2B2B79 +:1091D0002B2B000000000F0F55553F3F7DFF00FF78 +:1091E000A0AA000000000000000000000000000035 +:1091F00000000000000000000000FE91003C0000A4 +:1092000000805F5F5F5F000000000000FF000F0E46 +:10921000070614000000000000000000FFFF00002F +:10922000000000000000000000000000F3BE30BE9F +:109230005353FFFF00000000FF0FFFF0000000008D +:10924000000000000000000000000000BE0014004C +:1092500000FF00FF00000000C3C3C3C303034100BD +:10926000C0FFA0AA000000000000000000000000F5 +:10927000000000000000000000000000555555559A +:10928000FFFF3C7F00000000000000000000000025 +:1092900069090969CC4400440000000080A0C0F0C6 +:1092A0000000000000000000000000000000CFCF20 +:1092B0005555C0E8C0E80000000000C1C3C100006F +:1092C0000000000000000000000000000000FF0F90 +:1092D0007D4DFBD379510000000000000000FCC36D +:1092E0003C8200AAF0F00000000000000000000036 +:1092F00000000000000000000000000000005555C4 +:1093000055150000000000000000000000000000F3 +:109310000000FF0F0FFFFF550055000000008AAA54 +:10932000CFFF00000000000000000000000000006F +:10933000C0C05555FCE8FCE8000000000080C38078 +:10934000000000000000000000000000000000001D +:10935000F0007141BA9238100000000000000000D7 +:10936000FCC33C8200AAF0F00000000000000000F6 +:1093700020038402000020052000880020008804CB +:1093800000002000024084042000200320A0A082CE +:109390000000040000002000880000038800040092 +:1093A0008202200020040404000020002084010820 +:1093B000000300000200000820102000000320002D +:1093C00020040000200000002000000000000088B1 +:1093D00005820000000010000008040000000000EA +:1093E00020020000000000000002000000000084D5 +:1093F000908200401040004004002102080000005C +:10940000000200000400400410C000000000000939 +:109410002005001000020500000410040000008474 +:10942000400400000502410200000000090200099A +:1094300008090000000200000900000840020000C6 +:109440000000418400000040000000000000000017 +:1094500004080805000000004100000000000000B2 +:1094600000000000000000000400000000000000F8 +:109470000009200900000000A0000000000000001A +:1094800000100000000000090002001084000041EC +:109490009080900000410000041090000000000047 +:1094A00000008410004100000000020000000000E5 +:1094B000000004000000820000000009000000001D +:1094C000000000000000000000000000000000009C +:1094D0000000008000800000000000000008000084 +:1094E0000000000000000200000000000200000078 +:1094F000000008800080048804104100000000087B +:1095000005080004008400100000000003080004A7 +:109510000584030440000088051009000000049041 +:109520004010400002C00088000800004084008213 +:10953000000204880284000000000008000000000F +:10954000008800080200020800000588000000846E +:1095500000C0008400040008000800080008001093 +:1095600000000010000000080000000800000000DB +:10957000000000840020000400080208001084009D +:10958000002188219009900820080008201000057B +:1095900000089008400804081000900040400000B7 +:1095A0004008900820022008000090009000000071 +:1095B00040080021882008800000004082008400CC +:1095C000C0089041002100000011000000080000C8 +:1095D000000000000008008000880000000000007B +:1095E0000020000000080000000088000000842126 +:1095F0000000000000000000040840A0210000203E +:1096000040840004100004A041001082210040A00A +:10961000080441040004040002A0040020084000E3 +:109620002110410009A00000418800821100118230 +:1096300000C021844000000908200000400000A074 +:109640000920000400000090000000900800112094 +:109650000302000000820800002002200000030036 +:1096600003A0000000002088000200A0000000000D +:10967000000000000000000000088000A0050800B5 +:109680004000904110410800824020418800004184 +:10969000A0118200A0408409820282098211040480 +:1096A0000011820400040804002008040021840240 +:1096B0001000820800001004000400800000000078 +:1096C00008008409820000008400000000200000DF +:1096D0008200C00082002000820008000004000018 +:1096E0000800100008008200000082000000000056 +:1096F000000000000000000000000000000000006A +:1097000000C00088000040002000008441000800E4 +:109710000000050000000888102040001188200289 +:109720004188210009C008C00400008800C0112041 +:10973000102021004084408800202000000200000A +:10974000212040A0410000C00020000000000000D7 +:1097500000000000400000000000000000000000C9 +:109760000000000040000000000040000000000079 +:1097700000000000000000000000000000000000E9 +:10978000820000410000A000A00000008200000054 +:109790008200A0008210C00000008200C000009083 +:1097A0000800080082000000001100008200000094 +:1097B000000000030000000040110421000010041C +:1097C000000000000000100000000000C0000800C1 +:1097D000080000000005080000000000C0000000B4 +:1097E0000000A0000000A000002000000000080011 +:1097F000000000000000000000000000A0000000C9 +:109800000080020000020000000002004000402032 +:1098100040A010041020090411C00300419021A0B1 +:10982000081010902000009020000010090005048E +:109830001100000000001090000211000008050255 +:109840000501000041084020200009900484000028 +:1098500020000000000000000000200000000000C8 +:109860000000000000900000000400000000000064 +:1098700011000804009000000300080000024002EC +:109880000002201020009021840082000004840047 +:1098900088000803200082001041A0110021000070 +:1098A00084040408000500000000000082218200FA +:1098B000084100001000000000000800082100001E +:1098C000000000410000004190000000000008007E +:1098D000000000000000C040000000000400A002E2 +:1098E000004040000000000000000000840008006C +:1098F00002000000000000000800000082000020BC +:10990000000000000000000000000004000411003E +:1099100000000400110002C00400209000C00020DC +:1099200020900940A00311100582058411000988C8 +:1099300000901000000020200490000000000400AF +:1099400000000400080000004020000000000000AB +:1099500005000300000000002000000020000000BF +:1099600000020000000000000000000000000000F5 +:109970000000000000000000000020002000200087 +:1099800000000000000000000100000000000001D5 +:1099900000000000000001040001C0000008C082B7 +:1099A0000000C000000100000000000000000000F6 +:1099B00001000000000001100000C0000008C0828B +:1099C0000000C000000100000000000000000000D6 +:1099D000000000009000000100820001C000008231 +:1099E000C0820000C0000001000000000000000074 +:1099F000000000000000000101040001C00000821E +:109A0000C0820000C000000100000400000000004F +:109A10000020000000000003408000408300008020 +:109A200080800000800000030000000000000000B3 +:109A30000040020000000041408000408300000020 +:109A40008080000080000003000000000000000093 +:109A50000000004000000000000211800040830070 +:109A60000000808000008000000300000000000073 +:109A70000000004000000000000240800040830021 +:109A80000000808000008000000300000000210032 +:109A900000000000000004000000090004000200B3 +:109AA000000003008000000000808003000003002D +:109AB000000000000000200000004000050005003C +:109AC0000000030000000000008080400000000053 +:109AD000020000000000000020000000400005001F +:109AE000040000000300000000000080801000005F +:109AF000020000000000000040000000040085009B +:109B000040000000030000000000008080200000F2 +:109B100000000000000000000100000000008300C1 +:109B2000A184000001000800000000C082000000C5 +:109B300000000000000000000000000001008200A2 +:109B4000A040000001008400000000C0820000006E +:109B50000000010000000000000000000000010003 +:109B60000400A140000001008400000000C0820148 +:109B700000000100000000000000000000000000E4 +:109B80000800A082000001004000000000C0820028 +:109B90000000000000000000000000000001820141 +:109BA00000A0000001000000000000000000000014 +:109BB0000000000000000000000000008201200002 +:109BC00000A00000010001000000000000000000F3 +:109BD0000000000000000000000000000000000085 +:109BE000A001008200000100010000000000000050 +:109BF0000000000000000000000000000000000065 +:109C0000A001008200000100000000000000000030 +:109C10000000000000000000000000000000000440 +:109C200000040000000041000000000000000041AE +:109C30000000000000000000000000000000000420 +:109C40000040000000004100200000000000004132 +:109C50000000000000000000000000000000000004 +:109C6000000400040000000041002000000000008B +:109C700000410000000000000000000000000000A3 +:109C8000004100040000000041000000000000004E +:109C9000004100000004800000C1000000008000BE +:109CA0000500000000C10000002000000041000588 +:109CB000000005830003800000C100000003800055 +:109CC0009000000000C18000002000000041000062 +:109CD000000002A00000000000020083000000035A +:109CE00080009000000000C18000002000000041C2 +:109CF00000000000050300000002008300000003D4 +:109D000000009000000000418000002000000041A1 +:109D1000004000000385000120000040000000001A +:109D20000400C00000000009C000000000000001A5 +:109D30000000000000820000200000400000000041 +:109D40004000410000000009820000000000000106 +:109D500000000000010400000000820100830000F8 +:109D60000000040041000000000982000000000023 +:109D700000010000000000A000008201008300003C +:109D8000000020000300000000210400000000008B +:109D900000010000000001020000000000000000BF +:109DA0000000000000000000811200E007004842AF +:109DB0000000000000004842000000000000000019 +:109DC0000000000000000000811200E0070048428F +:109DD00000000000000048420000000000000000F9 +:109DE00000000000000000000000811200E00700F9 +:109DF000484200000000000048420000000000004F +:109E000000000000000000000000811200E00700D8 +:109E1000484200000000000048420000000000002E +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000000000000000012 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000000000000000000082 +:109EE0000000000000000000000000000000000072 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000257BA1 +:109F20000000000000000000000000000000000031 +:109F3000000000000000000000000000DEA4257BFF +:109F40000000000000000000000000000000000011 +:109F5000000000000000000000000000DEA400007F +:109F6000257B000000000000000000000000000051 +:109F70000000000000000000000000000000DEA45F +:109F8000257B000000000000000000000000000031 +:109F90000000000000000000000000000000DEA43F +:109FA000612603400000000000000230A000000015 +:109FB000000000000C4000000000000002C06486A9 +:109FC000612603400000000000000230A0000000F5 +:109FD000000000000C4000000000000002C0648689 +:109FE0000000612603400000000000000230A000D5 +:109FF0000000000000000C4000000000000002C053 +:10A000006486612603400000000000000230A000CA +:10A010000000000000000C4000000000000002C032 +:10A0200064862000020040008480881120112000F6 +:10A030002040200041100400880484A00240C00099 +:10A040002004C00088C1050004082000880004C165 +:10A050002100030040808200041088000000840377 +:10A060000402000300400020820200042000880453 +:10A070004000200440804010000004808800000060 +:10A08000040004040000880040000000008000007C +:10A090000010000004408400000020C020000000E8 +:10A0A00020000000000020001000044004C0400216 +:10A0B000000200020904040089001184000221004A +:10A0C000000800024000001040040000000205905B +:10A0D00085100890C00209400020008905824004D4 +:10A0E00000000005000004000002000300030082DD +:10A0F000050105C040002010000100008040040060 +:10A10000000005000000000000000000000000103A +:10A11000000000010000800100000000002100009C +:10A1200000000002000003400400820002048808CE +:10A13000080202410000820808800020840002001A +:10A1400020C02020824005000800050982114041FE +:10A15000000008200821401090001140110082806A +:10A1600000000080000900000000000000000480E2 +:10A17000028500000204028000400010011020054A +:10A1800000000000000000050200000000000010B8 +:10A190000000004000100040000001A0032000412A +:10A1A00000000000A000000040080900049008859D +:10A1B0000804030409840984030000204085031077 +:10A1C000090880410305408204048400840000845F +:10A1D0008040000484018082898209004084C0108C +:10A1E000040200000002000800000000090009004D +:10A1F0000004001004000010411000000009044099 +:10A200000484200000000000008200084100008457 +:10A2100000000090000500000001000004418409D6 +:10A22000008200000008000803040000080000107D +:10A23000404040008800C004C00040048440400406 +:10A240008408C00010000004000388008402850216 +:10A250000405008284000405400302100002C0C00F +:10A260004008020002000000400000000108400217 +:10A27000000540009000100890058400004000098F +:10A28000000800100002C0000021000000000000D3 +:10A29000A0080005880008080021002004800000B4 +:10A2A0000040020000000000822100000000400089 +:10A2B00000000000008800021000080005002100D6 +:10A2C000040000200000082009000000000003A096 +:10A2D0000400080000030800890808008001000944 +:10A2E0004011C000080080002100008200000888A2 +:10A2F0000800009008000000004000000800000175 +:10A300000084000000010000000010A041000000D7 +:10A3100000000300000000008300030008018040EB +:10A32000000000A0A1000000000000000000C0002C +:10A3300002050810080008009000A00010090000A5 +:10A340004009820440418810210908104111080485 +:10A35000080082114120824100000011002040C00D +:10A36000C00582108203C0002000A009A0000000E8 +:10A370008200040082000009040000000000820046 +:10A38000840008000400040000008800A000080009 +:10A39000000084000800820000000000820000002D +:10A3A0000480040004000400000000008200C000DB +:10A3B0000500080041401090410008041100000011 +:10A3C000400403000409880011A08800020084A052 +:10A3D00021A010A0414004414100100421842140EB +:10A3E00008412002059108001000108800000004B8 +:10A3F0000000000000000302008210000800038239 +:10A40000040004004100008400000000000000007F +:10A41000050000000000000020000000008400A0F3 +:10A42000000000200000000080000000000000008C +:10A43000080002000400002010000020000000407E +:10A440009008820008000004880010004004C0202A +:10A4500008000041C0000004000983080002080051 +:10A4600004080000081100101020002000410821FD +:10A470000811000008000000820884048808040015 +:10A48000082100008200001084000111000000215A +:10A49000004000000000000008000000080000006C +:10A4A0000008020008000000004001000000A000B9 +:10A4B000820000008000000000000000100000008A +:10A4C0000088000800004000000100040000049122 +:10A4D00000010000040000820400000040880088A1 +:10A4E000100000100002008810030000210010007E +:10A4F0000000000000000090210009000000210081 +:10A500000900100002000000000400000400000028 +:10A510000000080000000300000000000000000030 +:10A52000000008A0800005000000000104000000F9 +:10A5300000000000000004110040A01000102000E6 +:10A5400004080040C040020004000400200008008D +:10A5500002000008040000200080080310008204AC +:10A560000020840041084021000008919000100064 +:10A570001004C020400900008205C000C021002155 +:10A580002005858084210009000200208221000826 +:10A5900000000008A00800000000200000002000CB +:10A5A00002000800000082030021084000000008AB +:10A5B0000000000000000000009000000000030800 +:10A5C0002100030020002000210080C082401100F3 +:10A5D00009208000032084080001110210A003104C +:10A5E00000020388020040C0040005008810080033 +:10A5F00010000820100005100000050009000400EC +:10A60000000003882004000000000801000008008A +:10A61000410000000040210003080000000000008D +:10A62000000400008800000000000000000102009B +:10A630000300000000000000200002890020100834 +:10A64000C0840000000000000000C0040100880079 +:10A65000040488A0859085A020000003840820A120 +:10A6600000030800400000008200C101000240A079 +:10A6700010A00001A101880000010000C1C02190CC +:10A680004040882000A000080004400200C140882B +:10A69000000810830000000000000000000000001F +:10A6A0000000000000C0029000028308A0C00084E7 +:10A6B0000002840200000000000000009102020578 +:10A6C000888400400000000000000000800021009D +:10A6D000030000804084410802C1004000840588D6 +:10A6E000000300908820900800418005902003041A +:10A6F000808000090410830200410021000089804D +:10A7000003000080000000A0008300830088088808 +:10A710008005008880880000000000000000000024 +:10A7200000000000000000808000000091002080F8 +:10A730000080008000800000000000000000080091 +:10A740002120108002000000000000000000208096 +:10A7500020000002001000800041001000030200F1 +:10A76000900285000088040020004008400010800E +:10A770004010858983214180840009058390000071 +:10A780009100040083804080800000028080800867 +:10A790000000802100A10000000000000000000077 +:10A7A00000000000000000008000000000800000A9 +:10A7B00080000040800080000000000000000000D9 +:10A7C0000000000800A000000000000000000000E1 +:10A7D0000110010000000001000400000008000357 +:10A7E000200810010382A0A190000400050020842D +:10A7F00085400401A0C0C00100081100880009883C +:10A800000000A0009000A10400C088A040000884BF +:10A810000803900008001005000000000000000080 +:10A82000000000000000000000001000200000A058 +:10A8300020000400A0004040C00000000000000014 +:10A84000000002040182A021200800000000000096 +:10A850000000C02100C10085040210208804080502 +:10A860000010040089A00100C085009001894011FA +:10A8700001A110200988A00808C000000101000003 +:10A880000000000004028803002109C182100104B5 +:10A890000140A020209001400090A0100000000086 +:10A8A000000000000000000000000000089000A070 +:10A8B0000082090420200000008420C00000000065 +:10A8C0000000000000910341C10802900000000058 +:10A8D0000000000000100003002111800091C02042 +:10A8E00083A004C1800940A01008000500110310D6 +:10A8F000A1A12090A0854040804100800020030459 +:10A9000041022010000080218021002191890080D7 +:10A910001180100080000000100003008080000003 +:10A9200000000000000000000000000000008000A7 +:10A9300000800000898000000000000040800000CE +:10A9400000000000000000400000000000110000B6 +:10A950000000000000000800084011002040A10293 +:10A96000C0A1C000A000210208C004840500008826 +:10A97000001000000008C121C1A120808500411005 +:10A980000210050003050000000000800000000523 +:10A99000082121004100880000050040008080005F +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000804000800000800080030000000054 +:10A9C00000000000000000000290900010008800CD +:10A9D0000000000000000000010001000000000174 +:10A9E0000900051085000500910102102140820038 +:10A9F00000C1004100880001C18908110210100047 +:10AA0000019000200090010000008882081088203A +:10AA100000001001890840020300A0002090A0401F +:10AA2000880000000000000000000000000000009E +:10AA300000000800049000848800C00004A12020C9 +:10AA400020000000000000000000000000E0000006 +:10AA500000000000000000000000000000E007000F +:10AA60004200000000E00700410000000000070075 +:10AA70000000000000000700880000000000000047 +:10AA8000608100000000000000000000000000E005 +:10AA900000004121000000E0000000000000000074 +:10AAA000070000000000000000000000000000009F +:10AAB000000000000000000007000000000000008F +:10AAC00007000000000000000000000000006666B3 +:10AAD00000000BDB00000000000000000000000090 +:10AAE000FFD3FFFF62469189629146893C3C000496 +:10AAF000FFFF0F0F0000000099FF9903BF99B9995C +:10AB000000900000000000000000000000000F099D +:10AB1000FFF99F9F06068000E000FFFFFFFFE7FFB1 +:10AB20000000FCC0C0C000000000000000000000E9 +:10AB30000000000000000000DBFFFF00CFCF3EFE62 +:10AB40007E7E3C007E42000000000000000000000D +:10AB500003F30FFF0BDB000000000000000000000B +:10AB60000000C3C3C3C3F3CFF3CFF3F3CFCFFFFFD3 +:10AB7000FFFFFFFF0F0F000000009FFF90009F9955 +:10AB80009999000000300000000000000000000063 +:10AB90000F09FFF942DB42DB80F0E0F0FC3CF00003 +:10ABA0006F6F0000FCFCC0FC000000000000000013 +:10ABB00000000000000000000000DBFFFF000C0CA4 +:10ABC00002C24242FFC37E420000000000000000BB +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC60000000C3C3C3C3000000000000000F6666FD +:10AC70000000F79100003CBCFFFF0000000004084A +:10AC80003438C100C100F938F03000000000FFF096 +:10AC90000F00000024247E66F060F060C200C30054 +:10ACA000C3C1C3C1F0F0FF00D3F7D3F70000000029 +:10ACB000000000000000000000000000F000C9C912 +:10ACC00066660C0C3C3C3C3C663CF03C00000000E2 +:10ACD000000000003C603CF90000000000000000A3 +:10ACE00000000000E7E7C3C3000000000000000010 +:10ACF00066660000F791F791FFFFFFFF000000007C +:10AD0000FBF7CBC7C1C1C1C1FF3CF0300000000060 +:10AD10006F6F6F6F00000000330324BD24BD00007F +:10AD20000000C3C3C0C09999C3C3103410340000DD +:10AD30000000000000000000000000000000FF0F05 +:10AD4000C9C96666FCFC00FF60F9663C663C000011 +:10AD50000000000000000061300700190000000042 +:10AD60000000000000000061000F000D0000006105 +:10AD7000000D050D00A80061000E000D000000612F +:10AD8000000E050D0000A0610006009D0005006199 +:10AD90000006000D0001000000615006009900014E +:10ADA00000610004001D00000061500E001D000045 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000500800000001A0005008009000059D +:10ADD000000000000000000000000000030003006D +:10ADE0000000000000000000445588AA6F006F00BA +:10ADF0005555FFFF458A51A2050100002A2F7A7F91 +:10AE00000000000000000030C300C1C106B106B15F +:10AE1000FF003D3D00000000000000000000F57D47 +:10AE20005555FFDFEFCF00000000000000000000DC +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000002B289F +:10AE60003F3C0000000000000000CCFFCCFF0000D1 +:10AE700000005450FFFFCFCFF3F301050000202561 +:10AE800070750000000000000000C30080801BE718 +:10AE90001BE700000505FFDFAF8F0000000000008A +:10AEA000A02800000008040C0000000000000000C2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED000000000000000000000000000FD3DCD0D5E +:10AEE000404141410000000000000000000000005F +:10AEF00090909090A0AAC0C30000000024813CC3A1 +:10AF00000F030F0355555D5500000015D78282D7FA +:10AF1000330CF00300BA45FF4101000000000000BF +:10AF20000000FFFF0A08F3553055000000005C5C8C +:10AF30005C5C000000000000000000000000000059 +:10AF40000000000000000000000000000000000001 +:10AF50000000000000000000000000000000F131CF +:10AF6000C10140404140000000000000000000001E +:10AF7000000090909090A0AAF0FF00000000A5A50E +:10AF8000FFFF0F030F0300000C0000000010D7822A +:10AF900082D7FF0F33CC00BF40FF550500000000F3 +:10AFA0000000000000000000FF55005500000000F8 +:10AFB000FF0FF00000000000000000000000000093 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000404880402008440C080888882000284AF +:10AFF000401120000400200840824080C0048902E3 +:10B0000020000400C002C002400288008482218027 +:10B0100000002000840420042108040000800010A7 +:10B02000000300008880000304100000200040009E +:10B03000A00088050800200008000280020004002B +:10B0400082824000880000002000000000000020F4 +:10B0500084004000000000008800880020002000DC +:10B060002000C10211C04000210800102010008201 +:10B070002010C100800200000000001020024002E9 +:10B0800004904000A08220002082000020020002E4 +:10B090009002000400000402000008900000000874 +:10B0A000000100000040000210900083000000A09A +:10B0B00000000000004080000940800000100000F7 +:10B0C000000000410000000000000000000000003F +:10B0D0000000000000000000000000002000000050 +:10B0E000000000000080900005000000000001103A +:10B0F00001910040000000840410200421200184FC +:10B100000020000504800000A02000102041000560 +:10B110000020000421889104009000000202012117 +:10B1200004050000000000000000000000C0000056 +:10B130000000004000000000000200030021008326 +:10B140000010000000A0408000000000000000008F +:10B1500000000000000000000000000000000000EF +:10B160000000000000004120020020040800050843 +:10B170004004082009C10204000483824100A009A0 +:10B180002040028540108802000041010409890422 +:10B19000048420090405C020400000202084040904 +:10B1A00040408300000800000008000800880040BC +:10B1B00000000000000800000084000100000008FA +:10B1C00020400009000000118010048800000008E1 +:10B1D00000000084000800000008000800000004CF +:10B1E000000000880000000810080000001088001F +:10B1F00090004002400840080010C100C00808004C +:10B2000002000208040011410088000082000000D2 +:10B21000400010110040200400800040A0210004E4 +:10B22000400584020100000900008405C0030020DD +:10B23000000404000000004100400000000800007D +:10B2400000100000000000000000000400020000E8 +:10B250008200002100080000000008000000000833 +:10B260000008000884080000000000004100000001 +:10B2700000000800050300820482200020881000DE +:10B28000C10021004000C0044000021005901000E1 +:10B29000104088C01088108283000510000304004D +:10B2A000082090200801408803000000214008A0E9 +:10B2B00009210408210000084000000000080000E7 +:10B2C00000000300000008A00000000000080300C8 +:10B2D000000003A00500000000000800210000009D +:10B2E0000000000000000500000000A08221000016 +:10B2F0000021020320C008000300A009C0000800CC +:10B30000C0001040020404028200401190040004B6 +:10B31000A0034002A0200480024085A00088904045 +:10B3200090000000100001000889002000000800C3 +:10B330000802080508001000000040001000820804 +:10B340008409820084008211000000008200000055 +:10B3500000000021A000C0000000000082000000EA +:10B36000000008090800C0008400000082000000FE +:10B37000080003000310C0041008040410A005080E +:10B380000400028203014000410508001140001141 +:10B3900021844000808440018020000004210004BA +:10B3A000048408001102400040082120030000002E +:10B3B00005880088000000A041000000080004008B +:10B3C000000000024000000000000088110000089A +:10B3D0000090000041C00000118800000000000043 +:10B3E0000000008821000082000000000000000032 +:10B3F0000000000000008800200084020810408047 +:10B4000008410284C140100004022104A002008807 +:10B4100090A004080800C080110484041120084092 +:10B420000020040200210020844040004000402110 +:10B430000000C00284008211A0110020C1008220FF +:10B4400008808800840000008410000000000000D4 +:10B45000A00000000800002100118241000000004F +:10B4600000000000080000000000A00040000008EC +:10B4700000000404112000000020C0000021000191 +:10B480008002000000040484090488000482000192 +:10B4900000202105400040820320080511410805D5 +:10B4A000888505018904008808012101800021A008 +:10B4B00088C00000410504020300048808900200CF +:10B4C0000004044040040590000205000000000054 +:10B4D00000000200000000000000000002900800D0 +:10B4E00000000800000000000000000000008000D4 +:10B4F0000000000008110010080308000400848008 +:10B5000084000000040020000409080840008503AE +:10B51000044004212010A0C0400820918221204036 +:10B52000040900C00808052110200008401100028D +:10B5300010098202000084400000000000030003A4 +:10B54000C000040220000000080000000800000005 +:10B5500000020000040000110000004100008421EE +:10B56000000008000000100000000000C000000003 +:10B570000000000000000004000041882000208836 +:10B5800040020020050021004040880010C08200D9 +:10B5900004408000A00882040320020021200882C9 +:10B5A00088000090102021408400000102008002E9 +:10B5B000000104000200000000000000030400007D +:10B5C00000000000000000200000008800000000D3 +:10B5D00040000000110000000000000000C000005A +:10B5E000000000000000000000000000000000005B +:10B5F0000000000000C0000000000000000000008B +:10B6000040C00903820882882041044000C182C0F2 +:10B610008800020083010201C101820084008200CF +:10B6200010A083C000408411020109018900820139 +:10B6300003018801040100000000208800880091B7 +:10B6400000020020004000020002A002000200A050 +:10B65000A00801C001200810201000000000000018 +:10B6600000010000000000000000000000000000D9 +:10B6700000000000000000000000000000001000BA +:10B680000000008008201183000940028089050520 +:10B6900080031120A1090304004090111003102021 +:10B6A0008020800010100508000380100808100991 +:10B6B0008021A04191218003004000000003000888 +:10B6C0000005008520000080008000808088000840 +:10B6D00000C0004040804180800000000040000029 +:10B6E0000040000200000000000000000000000018 +:10B6F000000000000000000000000000000000004A +:10B70000004000008002000400400003000000210F +:10B71000802000808983029010848221801080899B +:10B72000800000004109211188100008820485086A +:10B73000A021102110002005880041040000008095 +:10B740008083802180000040002100020000000072 +:10B7500080098080000080008003800000000000DD +:10B760000008008000000000000000000000000051 +:10B770000000000000000080000000000010000039 +:10B7800000000001000040910000A0A090012000F6 +:10B790001088A08208088840C1052008020508001A +:10B7A0001020A0881004409041840220820509895D +:10B7B00040031041098520049000418201000000EF +:10B7C00008020240A011202040000088C083000031 +:10B7D00090820400A00282000200040102000084A2 +:10B7E0000000000100020000000000000000000056 +:10B7F0000000000000000000001000000000000138 +:10B80000010000000000000004080001000540885D +:10B81000021000081090A1880140891111A00002B7 +:10B820000089010484C00102852188A01009100448 +:10B83000001082A021110009002040822100010196 +:10B840000000021001080400A100A0000000C000D8 +:10B85000A00000400002830482000208009000C0A3 +:10B86000C088000000000000000000000000000090 +:10B8700000000000000000000000000000000000C8 +:10B88000000040000000000000008020081004902C +:10B8900000A00080110011000900030440A08810DE +:10B8A000208920022011910808844021050280A1EE +:10B8B00082A011030004A0210040108811108541CE +:10B8C00020410000C10003009000080000000000BB +:10B8D0000000800000804000108000000090000800 +:10B8E0000003C091000011000000000000000000F3 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000010000000802140A0A105 +:10B9100088800000000400A10888090040A12102DD +:10B92000048004050000004000800000C11109905F +:10B930009084204185A008A18900094008090410CD +:10B9400010009110000002210302C1800500800058 +:10B9500080008000800003211000410005000011DC +:10B9600000C0008080008000000000000000000097 +:10B9700000000000000000000000000000000200C5 +:10B980002000040005000000000000000004210069 +:10B9900084A182402000A0002004C085110020C1A5 +:10B9A000908491C04100C000840288080200031105 +:10B9B000041103414190830285020240880041A1A5 +:10B9C0004109C10008010000890190910202400074 +:10B9D0004000022002A0A0009001A0029008900068 +:10B9E0000000A0A0204088000800200004004000C3 +:10B9F0000000000000000000000000000000000047 +:10BA00000000010000000000600600E007000000E8 +:10BA1000000000E007000000000000E00700000058 +:10BA2000000000E007008406000000E0070050006E +:10BA3000000000E007000000000000E00700000038 +:10BA400000000000070000000000000000000700E8 +:10BA500000000000000000000000000000000000E6 +:10BA60000000000000000700841200000000000039 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA90000000FF3C4D4DEB28EB2855555040EBEB9B +:10BAA000EBEB00003C30AF41054177000077000030 +:10BAB0000020AF8383AF070DD07033111133E7003F +:10BAC00000E754D67CFE18181818000000C50FC5F2 +:10BAD0002D2D2D2D28027D5700000000CF05C0051B +:10BAE00000000000003F003FCFCF0C0C28A028AA88 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB100000000000FFFFFFFFFFFF00005555500031 +:10BB20005550050000003838AFEB05EB7777777795 +:10BB3000000000005F43435FD77DD77DFF5555FF71 +:10BB4000E7E7E7E740C268EA18181818000000FFA6 +:10BB500000FF2D2D2D2D000A555F00000000CFF5B0 +:10BB6000C0F5EB0BEB0B00300030CF0CCF0C2800F6 +:10BB7000280A000000000000000000000000000093 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000050FA40C2D714D714828A77 +:10BBA000828A04D70CFF00000000B4BEB4BE0000BF +:10BBB000000000FB00FF07D00BE044CC88CC000065 +:10BBC00000000004000000000000BAFBBAFB000007 +:10BBD000F8FB383B0404040452FFF0FFC355C3557F +:10BBE000CFCFCBCF8000C3005050BE14BE0FBE0FCE +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC1000000000000000000050FA7CFEFFFF3C3CEA +:10BC20008A8A828A0CFF0CFF000000005555FFFF36 +:10BC30000000000000FF00FFD7D7EBEB55FFAAFF85 +:10BC4000000000000000000000000000BAFBBAFB8A +:10BC500000000F0F0F0FA5AFA0AA5200F000C3FF06 +:10BC6000C3FFCFCFCBCFFFFFFFFFFAFABE14820F87 +:10BC7000820F000000000000000000000000000033 +:10BC800000000000000000000000000000000000B4 +:10BC900000000561003FC00D000000615007000D6D +:10BCA00000000061300D050D000005610A0F051D43 +:10BCB00000A105610A0F050D00A005614A0F050DE1 +:10BCC00000A005610A0F050D00A10061000E051D11 +:10BCD000000000000061300E050D00000000300083 +:10BCE0000000000100610006000D00000061500E20 +:10BCF000001D000000610006000D000000000000B3 +:10BD000000000000000000000000000000610006CC +:10BD1000000D00000000000000000000550055006C +:10BD20002828282FF3F3F3F300000000C3FF0000DE +:10BD3000504000400000000007D00D700AFAFCFCE3 +:10BD40003C3C0303F0F2FAFA2F2F2F00010105010A +:10BD5000DADF8A8F00000F0F3CD7000000000000E0 +:10BD6000000000000000A2202020000000000000D1 +:10BD70000000F020F0700000000000000000000053 +:10BD800000000000000000000000000000005D5DF9 +:10BD9000FD5D0000000000000000000000005F00EA +:10BDA000550028282828F3F3F3F300000000C3F718 +:10BDB00000005050505000000000D7D77D7D0AFA97 +:10BDC0000C0C00FF0F00F0F0F0F0FFFFFF00050586 +:10BDD0000501D0D5808500000F0F3CD70000000082 +:10BDE0000000000000000000A22020200000000051 +:10BDF00000000000002000700000000000000000B3 +:10BE00000000000000000000000000000000000032 +:10BE10000C0CFC0C00000000000000000000000002 +:10BE200004000400000000000F0F3C3C0000000074 +:10BE300080B080B00A020A0280B08CBC0000000012 +:10BE4000AACFAACFC3AAC3AAFCFCFCFC3CAA3CAA6A +:10BE5000003C55555353F0FF00007D7F696300009F +:10BE600000000000000000000000808C838F0000B4 +:10BE7000000000000000000000003131010100005E +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA000000000000000000000005555FF000000E9 +:10BEB0000000F0F0000002020A0A83B38FBF000006 +:10BEC0000000AACFAACFF0FFF0FFF0FCFCFC00F0CE +:10BED000FFF0003CFCCC5353000F00003C3E3C36CE +:10BEE000000000000000000000000000B0BCB3BF74 +:10BEF00000000000000000000000000031310101DE +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000400048099 +:10BF200004412002C00009844104208000008800F0 +:10BF300088008802841040884010200002022002FD +:10BF4000880040840200008020022010880804003D +:10BF50002010000000008404000085000003C000E1 +:10BF60000500000020C0C0000040000000050200E5 +:10BF70000000400088000000201000102010000089 +:10BF8000200004802000020000008408000400005B +:10BF9000880020002000000000088400C000A1C02C +:10BFA000C002A102002140408811A0020404100038 +:10BFB00005040302090800002002040100000040FB +:10BFC000899005001010410220104000800100A05F +:10BFD00010000001000209841002050008C00000E2 +:10BFE000044040000000001000A000C120000040FC +:10BFF000000000002000000000000001000100011E +:10C00000000000000010000000000002000000001E +:10C010000000000000000000000000000000000020 +:10C02000914004020210004088040802C00020046D +:10C030002000028000000002044000000800080008 +:10C040000800840010000041880900008820044195 +:10C05000840000000241C02108000500001000001B +:10C060000000028200002010041002000000000006 +:10C070000040000002200000001000000510000039 +:10C08000000000000010000000100000020000008E +:10C09000020002000000000000004000010001005A +:10C0A000001040118588858409010405020540843B +:10C0B0000005049004400504000002C105828210BE +:10C0C0008488A004058208000300048400040000A2 +:10C0D0000900008202880484000800008208001021 +:10C0E00002880000200900A08484020004000200ED +:10C0F00000840008000804010082400800820882D1 +:10C100000010001000000041051000040400008829 +:10C1100000000084000400000084008280004000D1 +:10C12000100800082002042184404141040090804E +:10C130000404400002409008202088210800C0210B +:10C140009002900840002000880804214000C0822E +:10C15000402120089000001190024005C0030140DA +:10C160000011080800000090880888080200841167 +:10C1700040088800C00308000000102100000003F0 +:10C1800000000041000800400040000200000000E4 +:10C1900088000000200000000008000800000000E7 +:10C1A00000410021000208A004000500040008204E +:10C1B000004008019000410004200504108821205F +:10C1C000100003A003A09040024009A0A18289C0F2 +:10C1D000080211888020030441A000C000000890DC +:10C1E0000482000410040000090800900900800087 +:10C1F0000004032000204020000000000000050093 +:10C20000000000904108000008830009008200003F +:10C210000000000800000000000003000000000013 +:10C22000040000001000000102200240042004204D +:10C230000809820585108402A0020804042108046C +:10C2400085910008A08808100411840408110802D0 +:10C250000840A111A00208C0A00082000003000451 +:10C2600000410821000008000000820008090000C9 +:10C27000A011880000000021084000008400040094 +:10C28000000000000000000000000000820000002C +:10C290000000000000000000000008000000000096 +:10C2A000000000400882000008000301210920C1AD +:10C2B000C10141C0400040C009100391118210002B +:10C2C0000404020800C00304838840882189008890 +:10C2D00003880384404011000304402000A00000B4 +:10C2E00000880008030003880040000000000000F0 +:10C2F0000084000800000300028400010000000028 +:10C300004100000000000000210011000000211089 +:10C310000000000000000000000000C04000038496 +:10C320000000000000C00005000000000000020046 +:10C330000403080084000808848284000009820045 +:10C34000080884021041A00020080000080920838A +:10C3500008200041001101C0842140110021840007 +:10C360000020081100410004100008200000880887 +:10C3700000000000100500210020000083050000DF +:10C380000800001084000000000000000000000011 +:10C3900000400008002000000040000000080000ED +:10C3A000000000000000000000000100000000404C +:10C3B0008020C00000004102410020400300000432 +:10C3C0000282110800028382082089900010000870 +:10C3D000C110008920040582400205A0044011908C +:10C3E000210421080204108821C0088800200000D0 +:10C3F0000005031041821000050000040000020047 +:10C4000021000300100105000300000000000300EC +:10C410000000000800000001080000000000020009 +:10C4200000000000000000000000000020000000EC +:10C430000820010008040205C008000300001004E1 +:10C44000400884032000001001040200209185C0F0 +:10C45000821008080504A0C0200440028240009019 +:10C460000009A0118200820000410021200802087A +:10C47000000000080000000000000800000000218B +:10C48000001000000400400800080000A000404127 +:10C490000403000000000021000000000021002132 +:10C4A00000000000820000000000000000400000CA +:10C4B0000000400804001100000000400900410095 +:10C4C0001190114000000810020008100400080438 +:10C4D0004040090402C00440042000908882000803 +:10C4E000200400840804110420000040000004001F +:10C4F0000000000000010588088420000000000002 +:10C50000000005A000008000000000000000000006 +:10C5100000000000080800000000092000000000E2 +:10C520000000000000000400000000000000000007 +:10C530000000000000C090418802C01001021002FB +:10C5400085880090901000030003A0828290908460 +:10C5500082C010090040049101C00041A0A1200444 +:10C5600001A0900510A00084001008089008C020C9 +:10C5700000821010000001900188029000880008DD +:10C580000004000200080040909000C0908204C0A7 +:10C59000008200080010101000400088C0C0000099 +:10C5A000000000000000000000000000000000018A +:10C5B000000190000001208909A000808002118004 +:10C5C000A180C08000000089008300C00005080928 +:10C5D00009088910808811A0800804410004009097 +:10C5E0000010108500C080800000000080000080E6 +:10C5F000000000800000000010414100050200081A +:10C60000000000000000000000008000000080002A +:10C61000008000800080008080800000008000009A +:10C62000000000000000000000000000000000000A +:10C630000041052120090040908084418841A0905C +:10C64000C0118800050382808000800300A18080E3 +:10C650009080210883914121000000200083008008 +:10C6600080808002800080030000800380008000C2 +:10C6700000008000002180000000208003A105113F +:10C6800041880000008880800000000000838080D6 +:10C690008000000000008000000000008005800095 +:10C6A000800000000000000000000000000000000A +:10C6B0000000410004000411110241044121030162 +:10C6C000C00503200300A0010904A0004000A00948 +:10C6D000020802A04001848285830800200100092D +:10C6E0000008A0048200A0A0042184008201108818 +:10C6F0000890400040002001040000008840901095 +:10C70000839183A1820090C102849002900020C195 +:10C7100082A00840040090000400900488000800F3 +:10C720000800900000000000000000000000000071 +:10C73000000000000088000000010000C089010224 +:10C74000901100C1040102000001C001C0020004F8 +:10C7500085020000A0210088084102C010000300EB +:10C7600010000200A088000200002110084000A074 +:10C77000840882A09020000200040210000108003A +:10C7800000000000210088000000000011000002ED +:10C79000008800000220C09000A0008809A00400CA +:10C7A00000880040A0C00000000000000000000061 +:10C7B00000000000000000000000A100000188212E +:10C7C00040A1082100888020002000218204808070 +:10C7D000200085800400002108C100A180A0800005 +:10C7E00003008300A0000000050003000300808018 +:10C7F00000808080A0800000008000800000000198 +:10C8000000031010090809000000000000000900E2 +:10C81000000000000000800080000080000009008F +:10C820000000008000808080000000000000000008 +:10C83000000000000000000000200541A1090040A8 +:10C84000A18588202185081009002091200003007F +:10C850008000802100800080859080200021880851 +:10C860008008008280800000A103A1102000040045 +:10C87000800080A00000000000200089000000006F +:10C88000000110001100098010000000000000806D +:10C890000000000000040080800000200080008074 +:10C8A0000000004000408000800000000000000008 +:10C8B0000000000000000000000009080411410011 +:10C8C0000310C104030011C0110900008803008295 +:10C8D000110040000205C082A010A14040A02083AA +:10C8E00085010800C00904408800110008049184F3 +:10C8F00002001000080208080800000100210040A2 +:10C90000000000010882888220848800400004889A +:10C9100008841000820088022008A0000001008224 +:10C920000040000000008802041004000000000025 +:10C93000000000000000000000000000008900016D +:10C94000000001000000000007004842000000E075 +:10C950000000000A0000000000005000000000E09D +:10C9600007000000000000E007000000000000E0F9 +:10C9700000000000000000000000000000000000B7 +:10C98000070000000000000000E00000420000007E +:10C9900000000000420000000000070060000000EE +:10C9A000000000004100000000000700000000003F +:10C9B0000000000000000000000000000000000077 +:10C9C00000E00000000000000000000000003C004B +:10C9D0003C00000000003C663C6603430343FBF25E +:10C9E000FBFB0099FFFFF6F6BD2400000000E0808D +:10C9F000F0900000FFFF3CFF20FB0C000C3C00000F +:10CA00000000000000000000000000000000000026 +:10CA1000C0CF606F000000003C3C3C3C3C3CF0F070 +:10CA200000000000D242D2DBFC3CFC3C99FF6600D7 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA50003C003C0000000000FFF000F0000000007F +:10CA60002BB22B2B029BFCFC9090BD2400000000FD +:10CA7000E080600000001E1E3CFF24FF2C002C3CC8 +:10CA80000000000099989999000066666FE7000021 +:10CA90000000C0CFF0FF00000000666F66663C3CFF +:10CAA000000000000000D242D2DBF000F0000000E5 +:10CAB000F0F0000000000000000000000000000096 +:10CAC0000000000000000000000043084000008457 +:10CAD00021860000000000000000000000000000AF +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB5000000000003C3C3C3E66666766000000F05A +:10CB60006042F0FF9682961466666666DD0000DD20 +:10CB7000D8D8D8D8ACBCA5BDF0F06F6FFCFCFCFCDD +:10CB8000F300F3F36606660F606060E30000FFFFEA +:10CB900000000003FFFEC300DB18FEBCFFFF606F58 +:10CBA0006C6C00C30CCF3C0FC3F000660066B0B0E5 +:10CBB000B0806667E767000000000000000000002A +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000600000300000C40 +:10CBE000000CF0DBF0FFFFC3FF3C66066626DDDDD0 +:10CBF000DDDDDBDBDBDBACBCACBCF0306FEF0000C1 +:10CC00009900919191916606E70F60606060000065 +:10CC1000CF9F0000C3C37E7EF330DB18FEBC3C3CDC +:10CC2000606F6C6C24E724E76666C3F0000C00CFED +:10CC3000F0F0F0F00003C30300000000000000006B +:10CC400000000000000000000000000000000000E4 +:10CC50001061200E004D000880610007000D0001EA +:10CC600000610006000D00010060400F004D000152 +:10CC70000061000F050D00A000610007000D00001D +:10CC8000000000000000000000000008000000019B +:10CC900000000061300700050000000030000000C7 +:10CCA000000100000E08000000000000500000001D +:10CCB000000080000008009000010000000000005B +:10CCC00000000000000000000000006100050005F9 +:10CCD00000003C003C000000AAAAF30AF3AA0000EE +:10CCE000CF4500000000000000007D7D5555AB01E0 +:10CCF000FFFF00000000000000001F0F0F0F0000EA +:10CD00000000000000000000000000000000000023 +:10CD100000000000FF05FF35C355C35500000000AB +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD4000000000000000000000000000AF0FAA007B +:10CD50005353C355F5F0F0F0FF70FF70F30AF3AAD8 +:10CD60000000FF5500000000000000004141555543 +:10CD7000AB0154FE000000000000000014000000A1 +:10CD800000000000000000000000000000000000A3 +:10CD900000000000000005053535C30FC30F00007B +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC00000000000000000000000000000002F2F05 +:10CDD00028285353C3C355C355C3FFFFFFFF0000AB +:10CDE0000000C0FCFCC02481A5A50000000002C218 +:10CDF0003EFE3C3CFF550696909600000000000069 +:10CE00000000000000000000000000000000000022 +:10CE100000000000000000003030F3F3FCFCFF3C99 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE5000C704C7C7040EFFFF55FF5500C30F550F8A +:10CE600000000000C0FCFCC03CC3FFFF000000004D +:10CE700002C23EFE3C3CAF050FFFF0FF0000000089 +:10CE8000000004000000000000000000000000009E +:10CE9000000000000000000000002828EBEBC0C0EC +:10CEA000C3000000000000000000000000000000BF +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000C7040404040E040E88024080C12030 +:10CEE0004004008204800510050385048802048440 +:10CEF000C000890008A00000888404100010001100 +:10CF00000008001140090004002010000400008007 +:10CF10000402410200400520210200030482048231 +:10CF2000C00400850000880000000000200282008C +:10CF300000002000200040002000C00589000400FF +:10CF40008400C08088008400400588002000040020 +:10CF50008200C004880088004000C0000004002057 +:10CF60004021A0000410850288C18804400000C050 +:10CF7000050810000200902141040410000000C0C8 +:10CF800020000004400000000900000000028502AB +:10CF90000040000004200003040104000000001011 +:10CFA000211100C1401000C000000000000040003E +:10CFB0000002000000000000000000000000080067 +:10CFC000802000000040000000000000000400007D +:10CFD0000000000000050000000020000000000527 +:10CFE00000000010840802A000000404008000007B +:10CFF00084000400901000409000001000082004FD +:10D000000089002000808210000508200000002018 +:10D010000000000000200080A108010002C0000004 +:10D020000802008090080083000000040000000057 +:10D0300000000000000000000000000800000000E8 +:10D040000080010000100000000000000800000047 +:10D0500002000000000402040800000000000000BC +:10D060000000041004080010850204088908052047 +:10D07000000809080084038441090402040803101D +:10D0800000840004020503100500001000030000E6 +:10D0900000840084418400850020020002020421F3 +:10D0A0000000800900080005000400840008040056 +:10D0B00000000008000000000000000800880500D3 +:10D0C0000084004002080009058800084108800823 +:10D0D0000008008400080083000900080084008420 +:10D0E000008400419000000304200420A0100404E8 +:10D0F000042100410800C00890009100400584050B +:10D1000005040408200804908841000808801004E1 +:10D110000421040888008409C04090404002840033 +:10D1200000080000C00884102002058220000010C2 +:10D1300082088208840008080008820200030000B8 +:10D14000C000000800000280000000080008000085 +:10D1500000000003000800410080002100000000E2 +:10D160000008000010884000080003050085080042 +:10D170009084828221200090038221080200414095 +:10D18000000020A121208320840208000090A10239 +:10D190001141030088A008844000000441091008E0 +:10D1A00000A0110000001101000041A120030008AF +:10D1B0004140000003A000000000000000A00000AB +:10D1C00000000008000000A0802000000000000017 +:10D1D00000000002000003000000400411000000F5 +:10D1E0000000000000084041820382041010048403 +:10D1F000C082842005801080100390058202884040 +:10D200000484A00040A01002200200050402004196 +:10D210000008082000041089A004C0910210080032 +:10D2200004898410840400000800900000090400B0 +:10D2300010000000100000008200820000000000CA +:10D24000C00000000000100008000800000090006E +:10D2500004000800000000000000080000040800AE +:10D260000800080200000800800041080340410156 +:10D27000C120002040824020000211204110218561 +:10D2800004A0880205A0100408009105108821045C +:10D29000042003200020404000044002412009C136 +:10D2A0000020001020C000C00000008205A0211056 +:10D2B0000300000000000000001000044000000215 +:10D2C000000000000000000000000000000000005E +:10D2D00000004100000000000000110000000000FC +:10D2E0000300400000000000000088880880C02182 +:10D2F000A003001000100090102008050821401025 +:10D3000008000804A0034084C000080508020400C7 +:10D3100000030821C00010200880400508031020E9 +:10D32000A0104040C0C08304044100000002000877 +:10D330008200000500110000000000050000A000B0 +:10D3400000008200000000001000000000008200C9 +:10D35000000000200000104100000000000000005C +:10D360000008000000000000000000000820091074 +:10D3700020021190000000411010400000880004BD +:10D380000211100008404110A105418489901082CB +:10D390008002000482200520109108022000110064 +:10D3A00008910500218500400200059000000388D7 +:10D3B000050000044108040041080390000021001A +:10D3C00000000008100003A0040003000890000003 +:10D3D000000000040001040000000000000000C084 +:10D3E00000000000000000002110000000004000CC +:10D3F00082008200900008808983000008100421C8 +:10D4000040090810820808101000020404024000BD +:10D41000C0080808002100210800A004040004003E +:10D4200008824041088200400040A0001021000016 +:10D43000004000040008000004110800000900106A +:10D4400000000000000000080000000000000000D4 +:10D4500000000000000000000008000000000000C4 +:10D4600000218200000000000000400000000000D9 +:10D4700000880000200200000902040211020804D2 +:10D480000020000010012120110010100301029063 +:10D49000100000000820414020900090000008008B +:10D4A000C0820020048200210001098500042000C0 +:10D4B000000000000004090000100010002000001F +:10D4C000000000000000000000002000000000003C +:10D4D0000000000000000004000000000000000048 +:10D4E00000000000000000000000000000000040FC +:10D4F0000000010000000400000000A18800A0A1BD +:10D500002001000100001000000182A0C082014043 +:10D5100000000000000105000000010401020811E4 +:10D520000000040209400540C09002C000820004CF +:10D53000C010000008A1012083A0C002000000006C +:10D5400000000000000000000000000000000000DB +:10D5500000000000C0C00002000002A002000000A5 +:10D56000000090000000000000000000000000002B +:10D5700000000000040200108003000400A004204A +:10D580000083050200410410000300100380000026 +:10D590000580000040082140900300402090411188 +:10D5A000C1400003118011000380000080800080D2 +:10D5B00000008080000080C1100004918085000080 +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000808000800000000080004B +:10D5E0000000000000000000000008000000000033 +:10D5F0000000000000000200848011008400900000 +:10D600001005848082080500050040000400910098 +:10D610000804A09102839000030402090421000081 +:10D6200000040091000900048003002180800000B4 +:10D6300000118000808000009000030891204110BC +:10D6400000000000000000000000000000000000DA +:10D650000000000000000000000000038000808047 +:10D660000000000000000000000008001100080099 +:10D67000000000000000000020002002C00008841C +:10D680000220A088A0A008410100000001000000C5 +:10D6900020C02010A002A01140040500838483A1B3 +:10D6A0000040000000900000C0014088A001081068 +:10D6B000820088001002C0020000A0A02000A1018A +:10D6C00091000000000000000000000000000000C9 +:10D6D0000000000000000000000090002001A002F7 +:10D6E000C0900000000000000000000001000100E8 +:10D6F0000100000000000000000000000100020026 +:10D700000000C1400000410501C00000010100010E +:10D71000000190040020008202C0000140010201CB +:10D72000000000010001100100008200A0C14011B2 +:10D730001088C0000090000221C00000404100217C +:10D740009008908900000000000000000000000028 +:10D75000000000000000000000000000209000C059 +:10D7600000A020C00008002000000002000100010D +:10D770000000000100000000000000001105202151 +:10D78000882000208209092105A11084004008108A +:10D790001021002000800080000082800020A00373 +:10D7A000410808030010080280200041A04000202A +:10D7B000801080C080000000008009800000808907 +:10D7C00008020940204100000000000000000000A5 +:10D7D0000000000000000000000000000000000049 +:10D7E00000000000008000800000000000800008B1 +:10D7F00000080041001100000000000000000011BE +:10D8000000C00000000821050208A1800408008073 +:10D810000000000000024084081004008540214000 +:10D82000C010200040820421A109201084000011B2 +:10D8300000828000000080008083000080000000E3 +:10D84000C0804000A18040400000000000000000B7 +:10D8500000000000000000000000000000000000C8 +:10D860008040002180000000000000000000000057 +:10D8700000020000000000000000000000000000A6 +:10D880000003000800A0000141040390050200000D +:10D8900000C0000000000001A01109A12010080133 +:10D8A00085890404C0C0211191018400100010007A +:10D8B0008200880304C08200C00004042020040009 +:10D8C000000010C088900502020100000000000066 +:10D8D0000000000000000000000000000000000048 +:10D8E00000000801A02010A00400000000000000BB +:10D8F0000000000200000000000000000000000026 +:10D900000000000000000700000000000000070009 +:10D9100060000000000000004200000000E007007E +:10D920000000000000E007000000000000E0070029 +:10D930004100000000E007000000000000000700B8 +:10D9400042210000000000E000004206000000004C +:10D9500000000000000000000000000000000000C7 +:10D960000000000000000000070088000000000028 +:10D9700000000000000000E00000000000000000C7 +:10D9800000000000000000000000000000AAF0FA03 +:10D990000000003C000000000000000000FB00FF51 +:10D9A000F775C3003F3F152A00000000CF8AF3A29D +:10D9B00000000000F303F0000F050000FF3C5F3C97 +:10D9C000A0F5A0A00000F0FCFFFCF7F4F4F40000C8 +:10D9D0000000000000000000000000000000000047 +:10D9E000000000000000F8FF28FF414D000F00007C +:10D9F00000000000A0A000000000000000000000E7 +:10DA0000000000000000000000000000000000AA6C +:10DA100000AA003C0000000000000000000000FA26 +:10DA200000FFF775C300CFCF458A00000000CF4547 +:10DA3000F35100000000FFFFFFFF0F050F05003C42 +:10DA4000503CA0F5F5F50000000C0F0CF7F7F4F7CB +:10DA500000000000000000000000000000000000C6 +:10DA60000000000000000000F82828287D4DFF0F6E +:10DA7000000000003030A0A0000000000000000006 +:10DA80000000000000000000000000002C83AFAF89 +:10DA9000FFFF0F0FFF0CFF0C000000000000000054 +:10DAA0000000FFFFD75714540000000000C3F0AA85 +:10DAB000000F0F0000000000EFC76D45080C0B0FB2 +:10DAC000C0C040EAB4B4BE140000AAA8A8A80000D0 +:10DAD000FFFF000000000000000000000000000048 +:10DAE000000000000000000000003CFF7D7D0F0FE3 +:10DAF0000F0F000000000000000000000000000008 +:10DB0000000000000000000000000000000038C21B +:10DB1000FAFAFFFF00005D0C0C0C00000000000092 +:10DB200000000500FFFAFF7F004000000000FFC377 +:10DB3000F0AA000F0F0000000000AE862C040F0FAB +:10DB40000F0FCFCF45EFBE14BE140000A8A8A8A8A1 +:10DB500000000EFF000000000000000000000000B8 +:10DB600000000000000000000000000000C3414170 +:10DB7000417D55550000000000000000000000003D +:10DB800000000000000000000000000005610A0E17 +:10DB9000050D00A005610A0E059D00A000610006AC +:10DBA000000D00000061000F004D00000061000F3B +:10DBB000050D00000061000F050D000085614A0F92 +:10DBC000050D00A0A00050080090000500000061B5 +:10DBD0000007000D00000000000000000000000031 +:10DBE0000000000000000000000000000000000035 +:10DBF00050080090000500000000000000000061D7 +:10DC0000000700010000000000000000000000000C +:10DC10000000140C3C0C5D55FFFF000080D000009C +:10DC20000000001000209690909600000000070B66 +:10DC3000000007D70BEB44005500F35151F30000EF +:10DC40000000431CC1340000000000000000000080 +:10DC5000FFFFF8FF002800000000000000000000A7 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC8000000000003000F33C000000000000000035 +:10DC900000000000140C3C0C5555FFFF0000A0F0E4 +:10DCA0000000000000300030FFF0F0FF0000000036 +:10DCB00000000000D707EB0B00000000CF4545CF68 +:10DCC000000000005F5FF5F50000000000000000AC +:10DCD0000000FFFFFBFF002808000000000000001C +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000003000F33C000000000000B4 +:10DD10000000E700E7E7B4B455FF20A2A2A23CFA56 +:10DD200014500A0A03F3CF3F8A2A000000000CFABD +:10DD3000FCFA0EBEB0BEAF820582040000000000F7 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000AFAF2D2D0000080800000000FB +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD8000000000000000000000F000F000000000B3 +:10DD90000000000000E7E7E7B4B400AA30F3F3F3B3 +:10DDA00000FA0050FAFA03F3CF3F451500000000D7 +:10DDB0000C0AFC0A0BEBE0EBAFD705D70400000020 +:10DDC0000000000000000000000000000000000053 +:10DDD00000000000000005052D2D000808080000C7 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE000000000000000000000000000FF0FF000014 +:10DE10000000000000000400200000000404880945 +:10DE2000218220A0C0008502200040112000008334 +:10DE300004882010840302112083008420008400C1 +:10DE400004008800000000848809400020C004000D +:10DE50000011880040050003000020000082A0801F +:10DE60000000041002000200880088000400000086 +:10DE700020000000000088008800880000000400E6 +:10DE80008800880000002000100010201000A0046E +:10DE90002000000510841084009000902082210052 +:10DEA0000082202009050004200040C00000040278 +:10DEB0000002002021010002000000020002000018 +:10DEC0004182000005C020000041400000004003E6 +:10DED00040820000000000000000410000C0090373 +:10DEE000200200840000000080000000000000000C +:10DEF0000000000000000000000000000000000022 +:10DF000000000000000010000000400000012000A0 +:10DF100000004000000000100020909190000004DC +:10DF200090400408030440400400018900042000DC +:10DF30000004000400408205020000000405000007 +:10DF40002000000400000209000000210205040472 +:10DF500000040009000000090000000000020000A9 +:10DF600001000010400000000010029004000000BA +:10DF70000000040000000000008000030200000018 +:10DF80000000000000000000000000000000000091 +:10DF900000000000010000200000840020080008AC +:10DFA000040800084110200904000500200400882E +:10DFB00084840084000800820408211020081108CD +:10DFC0000840800804C1000800000408001005088B +:10DFD000004105090208008800080000000000094F +:10DFE00000104000028480000008000909050000BC +:10DFF0000010000002080484040000100000000863 +:10E000000400000000080000040809080010408413 +:10E0100000000084000808840009090000848808C2 +:10E0200088024041400090020040000400030000CC +:10E0300002000008020810009000880040118200D1 +:10E0400088414011002190400000400840A000009D +:10E0500084020480402140000004C000A0100000A1 +:10E06000902182A000214008C080029040008809D1 +:10E070000008000000080010000200000000000579 +:10E080002000000000000000000800000000000860 +:10E090000008000000000000000000000000000078 +:10E0A00003002100C1000800008300020905088860 +:10E0B00008C003001000218200A010C010820500DB +:10E0C0004002110000840310210000840802A11105 +:10E0D000000000A1850440820000110008024100F8 +:10E0E000000000004105000000840304800380C09C +:10E0F00000080000000000000800030021004100AB +:10E1000008080000080000000000000000000000F7 +:10E110000400000000000010040000000300008460 +:10E120000000820410004004C0008440888210096E +:10E130001004020090002000C0008240000240094C +:10E1400091008200C04000200020080008000489DF +:10E1500000C004C0841109050410C0000800008537 +:10E16000080000000821040000000000081008005A +:10E1700000002000C00008000800000082058200A6 +:10E1800008000000000000008200080000000800F5 +:10E1900008000000080000000400000000008300E8 +:10E1A00000004080410020882084200021844021FC +:10E1B00040C0080809200020C0C020101190008233 +:10E1C00010404000040000884000000510C040845A +:10E1D00011402004092008C0041020010004030499 +:10E1E00008040090000000000000210041C0000170 +:10E1F000000009048020000000000000000000086A +:10E20000000000840000000000000000000000008A +:10E2100000000000000040000800030000000400AF +:10E220000400000008200000820084008200080032 +:10E2300040802091000082880808A0200841A0109A +:10E24000081182400000A041A0111020214020416F +:10E25000080500808980C1412104009020008200CF +:10E2600000040804901100000000840000008200F7 +:10E2700000002000000000000000000500008400F5 +:10E280000000000000000000000000080000000383 +:10E2900000000000000300000000002000208200B9 +:10E2A00000000000C00000004004004000004010DA +:10E2B00000009104902040C0400491A00582800499 +:10E2C000000041000010080004001184030084884D +:10E2D000C0000000050204040490A089081180C059 +:10E2E000038800A000010004000003200302410491 +:10E2F000110008008000080000000000000000007D +:10E30000000000000000000000000000000000000D +:10E3100008000000000003000000000000090004E5 +:10E320000020002000000000000002000241022145 +:10E33000882100008800400482002040200008005E +:10E340004040080084208800000240114100100075 +:10E350002011A100C0042010410500030020010489 +:10E36000C01000094002C0890020000000000580A4 +:10E370000421000000400000000000080000080028 +:10E380000000000000000008000000000021000064 +:10E390000008001100000000000000000000000064 +:10E3A000020000000000000000000000000000006B +:10E3B0000000000008040420000411A000400282B4 +:10E3C000A000210420200005098840042000080046 +:10E3D00003108200204020A04108200808001100FE +:10E3E00004C120400004000040044000000005007B +:10E3F000C004030020000000210000000000000015 +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000004024000000000A6 +:10E4300001008400000090A004414188088290906F +:10E44000008800A02008000001412089400201A0AE +:10E450000084208400020101A0000100000090104F +:10E460000120848804080000000001000000000072 +:10E47000000000014101000090C040C00084820300 +:10E480000000000000000000880800820008A010C2 +:10E49000000000000000000000000000000000007C +:10E4A000001000900000008800A000200002008200 +:10E4B0000000040000000000118304848205008431 +:10E4C00000030020054000400320200880820090C7 +:10E4D00008800000410000800810A1080410110409 +:10E4E00040800580050080800000000040000000A2 +:10E4F000000020000304C0020020808300100805F3 +:10E50000801000000000000000000080000000807B +:10E51000008000000000000000000000000000007B +:10E5200000000080008000000000008000000080EB +:10E53000000000000400050041800980101021C087 +:10E54000A105C0038500800580001000051105802D +:10E55000090008044140208821A18089A0028391FC +:10E5600020C00005002180400020000000000008BD +:10E5700000000000000010804008002008802103F7 +:10E5800020802011000000000000000000000000BA +:10E59000000000000000000000000000000000007B +:10E5A00000000000000000000000000000008000EB +:10E5B0008005000000000000010001A00804A10186 +:10E5C0008884094040000800A00008000100000104 +:10E5D0000140000401210000011101090240040171 +:10E5E0000904C0080002028884010208000000003B +:10E5F00000000000000000C00140000000002002F8 +:10E60000010182A082400000000000000000000024 +:10E6100000000000000000000000000000000000FA +:10E620000000000000000000000000000000820068 +:10E630004000A0008200000100010001000100086C +:10E640000210828890A02010018800082010C000CD +:10E650000088A1820410000000011000A001000148 +:10E66000000001010001C01188891009A1C100004A +:10E67000000000000000000000000900210100006F +:10E68000042001A00082C101000000000000000081 +:10E69000101000A0001002080000000000000000A0 +:10E6A000000000000000000000000000000010005A +:10E6B000908400020008C0C000040040000504046B +:10E6C00000839105114011900000400041000000BE +:10E6D00080410020852091840010001080000902F4 +:10E6E00000212000082109089140008280C040825A +:10E6F0000000000000000000000000090841212186 +:10E7000000030000218000008904000000000000D8 +:10E710000000800000800000008000000000000079 +:10E7200000000000000000000000000000000000E9 +:10E730000000000000800080800000000000000059 +:10E740000020A140834140004010000300210080D0 +:10E7500000028083800080000003058008410500DE +:10E76000040408002004A010A008090005091100F5 +:10E77000110000000000000000000000200008055B +:10E78000210020008000038010800910000000009C +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000861 +:10E7B00000000000004080A18080000000000000F8 +:10E7C00000000001A1C0219010C0C1000000001194 +:10E7D00000820001100820000400828205840500E8 +:10E7E000040040008400C084030484000800200862 +:10E7F000010420000000000000000000000001C033 +:10E80000010001000000A0088290C1840101000005 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E83000000000000000880002020808100000002C +:10E84000000000000000000000E0070000000000E1 +:10E8500000E0000000000000000007006000000071 +:10E8600000E007000000000000E0070000000000DA +:10E8700000E007006000000000E000000000000071 +:10E88000000000E007000000000000E0000000823F +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000007000000000000000700001238 +:10E8C0000000000000000000F0D0F0C0FFFF407C1E +:10E8D00000000000C300C3C37E00F600F0FFF0009C +:10E8E000BD0DDB0B00000000E0E707E700000000C3 +:10E8F000C300C3FFFF0099BD00000000000000003E +:10E9000000000000000000000000F9F0F9FFFF4ED9 +:10E91000FF4E0000000000000000000000000000AA +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000FF3000303F3009 +:10E9400030300000000000000000E0C0F0C0FFFF19 +:10E95000003C000000000202C3C37EFFF6FF00007F +:10E9600000000DBD0BDB00000000D0DB0BDB000066 +:10E970000000000000000F0FB9B900000000000007 +:10E9800000000000000000000000000066FF6600BC +:10E99000004E004E000000000000000000000000DB +:10E9A00000000080000000000000000000000000E7 +:10E9B000000000000000000000000000FF300030F8 +:10E9C0003F30303000000000000000000000000078 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA40000000000000000000000000000000F0E0F6 +:10EA5000F0F8203C243C0B0B020BFCFCFCFC00807F +:10EA600000800000000000003C14000000000000D6 +:10EA70000000F00FA00500FF000099FF99000000C2 +:10EA80000000000000000000000000000000000086 +:10EA90009090CFC0BDFFBD0000000000000000004E +:10EAA0000000000000000000000000000000000066 +:10EAB000000000000000000000A542E70000000088 +:10EAC00000BCFFFF00FF0C3C000000000000000045 +:10EAD000F0E0F0F8003C043C00000000C0D8E4FC8A +:10EAE000FFFEFFFE0000000000003C1400000000DC +:10EAF00000000000FFFFA5A50080008099F099F0BC +:10EB00000000000000000000000000000000000005 +:10EB100000009F9FCFC081FF810000000000000027 +:10EB20000000800000000000000000000000000065 +:10EB30000000000000000000000000A542E7000007 +:10EB400000000080C3C309FF0C3C00610006000DFB +:10EB500000000061000F00050000006100030005D7 +:10EB6000000080610006000D00000061000F000D34 +:10EB700000A08061000F000D00A00561300F059D11 +:10EB8000000100610007000D0000000000610A0F95 +:10EB9000000D0000006150010009000100000000AC +:10EBA0000000000000000000000000000000000065 +:10EBB000000000000000000000000000000000084D +:10EBC000000000000000000800000000000000003D +:10EBD000800000004F4F7F7F0F0F030700000000F1 +:10EBE0000000000000000000003C0024FFC300C340 +:10EBF000CFCF8E8EF0C3AA003CFFFFFF5451FCF331 +:10EC0000E700E7E700000000000000000000EAEA7B +:10EC1000EAEB003C003CF707F707FFFF00000000AD +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC5000000000000000004F007F0F0F03030000C2 +:10EC60000000000000000000000000000000AFC332 +:10EC700055C3CFCF8E8EF0C3AAFF3CFF0000A8A2E1 +:10EC8000FCF3E7E7E70000000000000000000000E0 +:10EC9000AAAAAAAA00BC003CF202F202FFFF0000EE +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD00000000000000505052000F0F0FFFFFF0028 +:10ECE000555DF5FDBFBFBFBF000000035F1CAF2C2B +:10ECF00000000000C5C5C5F500020303A000000028 +:10ED00000000000000000000000000000000000003 +:10ED10000000FCF8FCF8FF0FFF0F3F032B2BFFFF59 +:10ED2000FFFF0000000000000000000000000000E5 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED5000000000000000000505052030F0F080FFF5 +:10ED600080000008A0A8BFBFBFBF0000C0C35F43B2 +:10ED7000AF8300000000C5C5C505000A0F0FA00045 +:10ED80000000000000000000000000000000000083 +:10ED900000000000FCFCFCFC000000003F032B2BEB +:10EDA0004D4DCF0C000000000000000000000000EE +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000050404400520008202040039 +:10EDE00004000002C0042100200088040400002068 +:10EDF0000403402000842002A002000084112002AD +:10EE0000C0020002000200002002208805008400E9 +:10EE10008908200000030200080004800982200005 +:10EE2000201004008400000000000010000000001A +:10EE3000C00804002000000000000000200088003E +:10EE40002000200020000000000088000000840056 +:10EE500084008400004040204002040004040000BC +:10EE60002104000840000900209011000000100457 +:10EE70000901210400054010000041900004040233 +:10EE8000A0C10083400000000040004110101002AB +:10EE90000000400000000000C10480020010881142 +:10EEA0000002040009A004000000000000000000AF +:10EEB0000000200020000000000000000000000012 +:10EEC00000000000090000000000000041000000F8 +:10EED00000000000000000010000004100000005EB +:10EEE000A1108400000084000009850400100200C5 +:10EEF0000000040000004000002000000041000865 +:10EF00000041080004000800090400000800101077 +:10EF100000000800884100090000004000000000D7 +:10EF20000000000000100000000000000000901031 +:10EF300000000000000000000000000000000004CD +:10EF400000000000000000000000000000000000C1 +:10EF50000000000000000000000020041108020072 +:10EF6000051040080900008400880082200904C0C0 +:10EF7000A0840082840800848508038309080000B7 +:10EF80000084008400C000040000208520080408DC +:10EF900000A0020000100000008400000003000830 +:10EFA00000040008000040000008000000004008C5 +:10EFB000050800840000000000080004000400842C +:10EFC0000008001000004008040800080008401075 +:10EFD0000010008800000088000400040041820046 +:10EFE0000000C04104050003841040108810000098 +:10EFF000888800880021841010100000824100A140 +:10F0000000211003A041884082200000C021A021DF +:10F0100082A1000540211000000584050000008445 +:10F02000082008C14000000300080000002100087B +:10F0300000000021000000000000000000080000A7 +:10F04000000800218208000000000000000000000D +:10F050000008840800000000000000000000218279 +:10F0600000000000098220000808404009002084B8 +:10F07000219021101010051000A040000088050408 +:10F08000090209820504080440204000030002042C +:10F0900000C0002000000804030008000300000076 +:10F0A0000940000141104000000000040000100071 +:10F0B00000C0000000000000000000000000000090 +:10F0C000008200000010004000000000000000006E +:10F0D0000000400000000000030008000000411094 +:10F0E000C0000800004140059041C00082040800B3 +:10F0F000901104110200200582008402A00208047D +:10F1000000040020080020000011840408000811F9 +:10F110000000A00020004004000000041000840053 +:10F1200000000000000000000000000000000000DF +:10F130000000000000000800080008000000A00017 +:10F1400000000800000008000000C00000000000EF +:10F15000000082000400840400000000040908008C +:10F1600000000000400021008004000000A021C039 +:10F17000040000000300052040004140080108038E +:10F18000200000010020028820100040008800C0FC +:10F1900080840040000000880020000000900000F3 +:10F1A0000000000000080000000000000000000057 +:10F1B000000000000000000000000000000000004F +:10F1C00000000000004000000300000000000000FC +:10F1D00000000000000000000000000000000088A7 +:10F1E000000000008208820004000008080040803F +:10F1F00000054040884010211000840200200002D9 +:10F2000000008200208800030008082082022004F9 +:10F21000C008000009000000040000008400820013 +:10F220000800108000000000000000100000000036 +:10F2300000050000000000000000000000080000C1 +:10F2400000000000000000000800000000000000B6 +:10F250000000000000088200000000000000000024 +:10F260000000000000000990000000000400088277 +:10F2700082400808A00400010040000211010010B3 +:10F280001083008408008504048402900200008535 +:10F290008010400005A02000000480840508004084 +:10F2A0000004000000100000050000000009020436 +:10F2B00000400000080000080000000000001000EE +:10F2C0000000000800000000000000000000000036 +:10F2D000000000000000000000100000000000001E +:10F2E00000000008000008001004020408C100002B +:10F2F000400082004010001108088221C010024026 +:10F30000000300080002888404108400100290208A +:10F3100010008811880904000041404020000002CC +:10F3200040058800900884080000000900000008DB +:10F330000010000000000002002100000021100069 +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F360000000000000000000880000000000001005 +:10F370000000000421008082000000A00010009026 +:10F380004000201000880089042080400400008490 +:10F3900000C0110000202004210400000000200013 +:10F3A0000000000000000040000400000000000019 +:10F3B000000000010000000000000000000000004C +:10F3C000000000000000000000000000000000003D +:10F3D0000000000008000000000000000000000025 +:10F3E0000000040000000000000008000000010010 +:10F3F0000800000000008400040100008390000861 +:10F40000C102C00841A189848809A010000104013B +:10F41000010100000400A00100010201C0880111E7 +:10F420000403080800000100000000000000201094 +:10F430000141400504100000000000000000000031 +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000400840004000200000E +:10F47000030080000000024021100040000910003D +:10F4800004800200808082C0210300050084040201 +:10F490000008030800050000801005038010000824 +:10F4A0000210202100830000210000000000000065 +:10F4B000008521A000A000C00000000000000000A6 +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000809C +:10F4F0000000000000000000048005000500030378 +:10F50000008000210009002005002111C00885406D +:10F51000001100200080000408009000880008000E +:10F5200002000341C002A08040000300050041A08A +:10F53000000089008011058902040000000000001D +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F570000000000000000000000401020000010083 +:10F5800082A1104090A0001008002008A001A0A0B7 +:10F59000822100A0000100400000C0840500A000FE +:10F5A000020009009104A01103A0092009009000A5 +:10F5B00001A00000039002898485A0C00000000023 +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000A07B +:10F5F00000100000000100010001000000000000F8 +:10F600000301000140040089040283A190880104E1 +:10F6100009218209010000000000000000040040F0 +:10F62000018200A09085008505910504000000007E +:10F6300000010000000000900190000300A0000005 +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000040005A +:10F6700000002000820000080008000400090005C6 +:10F680000441052003088082000400C18988000825 +:10F69000400302218082050003004000000000803A +:10F6A00021001000000000202120851109C0000069 +:10F6B00000020020001100000002030509A105A0BE +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000000000000000002A +:10F6E000000000000000000000000000000000001A +:10F6F000800000000000800000000000000000000A +:10F700004080400900000003C0209110118090004B +:10F71000898085040380058421020409C000020059 +:10F72000208804A008000300808500850080001068 +:10F730000300050002804002000010C080219000FC +:10F7400009000000000000000000000000000000B0 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000100000000000000000000079 +:10F78000000001080182008200014100089002840B +:10F79000084040A0059090C08810850003004000FC +:10F7A000890000C00008012001000802A082024078 +:10F7B000880000A0000801020101000008A0828268 +:10F7C0000282A00000000000000000000000000015 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000004002000C000400000000000E5 +:10F80000000000000000000000000000000000E018 +:10F810000000000A000000000700000A000000E0ED +:10F8200007000000000000E000008200000000E08F +:10F8300007000000000000000000000000000000C1 +:10F8400000000700000000000000000000000000B1 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000375 +:10F890003C3F0000FCFC000000B2E1C1E3C37D0D71 +:10F8A0007D7000000000000000000FACFFACCBFB3F +:10F8B000C101055515150000000000000000000002 +:10F8C000F03AFF3A43410000000000000000000051 +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000000000000000000000018 +:10F8F000000000000000000028A8F8F80000000048 +:10F9000000000000000000000000000000000000F7 +:10F910008282BEBE0000F8FDFFFFFFB2F1D1F3D33B +:10F92000D707D7D0000000000000000000ACF0AC0A +:10F93000CBCBC1C1000000000000000000000000AF +:10F940000000003A0F3A434143410000000000002C +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000028A8F8F80000C7 +:10F980000000000000000000000000000000000077 +:10F990005555FF3F7D7D7F7FFFFF0000CBC30000FB +:10F9A000AAEA00000000000000000000000083AF91 +:10F9B000C3FF15151010C3C380C300000000101C46 +:10F9C000101C0000C0C3F0FF000000000000000099 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000001F141514AB +:10FA000000000000000000000000000000000000F6 +:10FA100000000000C30341415757FFFF343CFFFF84 +:10FA20000000EBAA00000000000000000000000041 +:10FA300082AAC3FF5500550000C300C300000000A8 +:10FA4000303C303C0000C0C3F0FF0200000000006A +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA700000000000000000000000000000001F1453 +:10FA800014140000000000610006000D0000006179 +:10FA90000006000D000100613005001D000000613E +:10FAA0000006000D00000561000F000D0000006160 +:10FAB0000005000D00000061300B050D0000006125 +:10FAC0000006000D0000000080610A0E001D00000D +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000000000000000000000000016 +:10FAF0000000000000000000000000000000000006 +:10FB0000000030000000000000000000232FE3EFA1 +:10FB1000AAFFFFFF43831C2C00FF00FF0FACFFACCC +:10FB20000034003C3C3C3038040000000000000081 +:10FB30004D4D417D00000000000000001414CF0C6A +:10FB40002D2D2D2DFF000F0000008282D7D7000041 +:10FB50000F0800000000000000000000000000008E +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000202C29 +:10FB9000E0EC000000005FAF5FAFABFF00FF00AC28 +:10FBA000F0AC0004003C3C3C303C00000000000095 +:10FBB00000004D4D417D0000000000000000D7D73F +:10FBC000CF0CFF55AA00FFFF0F0F0000D2D2D2D2F8 +:10FBD0000000FFF80000000000000000000000002E +:10FBE0000000000000000000000000000000000015 +:10FBF0000000000000000000000000000000000005 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000DC9CDF9F4551CFF30000000096 +:10FC200000000000EFAF0000FF3EFFBEF60000F650 +:10FC300000000000ABBFABBF3C00FFF0FFFF0B0BB1 +:10FC4000F3005100000000000FEF0F2F000082A012 +:10FC5000D7A0FFFFC3C300000000000000000000A9 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000000000000000074 +:10FC900000000000000000000000CFF3455100000C +:10FCA0000000000000000000000000000000F6F668 +:10FCB000F6F600000000293D293D3CFFFFF0FFFF64 +:10FCC0000B0AF3F35151000000000FCF0F0F00009B +:10FCD00082F5D7F5FF00C30000000000000000001F +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000000000000000F3 +:10FD100084040100C1054085200020038400008088 +:10FD2000200002030405880288000005200040042A +:10FD300088038508840300050010200004050000E6 +:10FD4000200000002008000388410000200000007F +:10FD50000003200004002000020040002080888072 +:10FD60008880200088000400880020000000200017 +:10FD7000040020002000200020002000200084003B +:10FD800020002000200088002000020088000400DD +:10FD9000A00000C0048202A0002009820284400268 +:10FDA0000002008200020582000520C000A00000C1 +:10FDB000000100C04002042011001085000000C0B6 +:10FDC0001082004000000021004000400040000080 +:10FDD00000200000000000000000000000000020E3 +:10FDE00000200020000000000000000000000000D3 +:10FDF000000000004000000000000000400000047F +:10FE00000000000000000000000000400000400072 +:10FE1000400000008900000000080080A0000000F1 +:10FE2000000088000000000000000000000000004A +:10FE300000410400040088000000008020800000D1 +:10FE400008008282880004008840080090000000BA +:10FE5000001008000000000000000000000000008A +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE80000008000000000200000000000000000068 +:10FE9000000000000000040820100088040202088E +:10FEA0000410041040080220200000080084000014 +:10FEB0000008041002880084001000100002800472 +:10FEC000008200A0002104C00008000800080040D3 +:10FED0000040000000080000000800840040000806 +:10FEE00000C000080000000800000008000800082A +:10FEF00000880008000800080008000800840008C6 +:10FF0000008400100008000800000004000800043D +:10FF100000840010000800080210020504400808D0 +:10FF2000401000050008202140050008001190083D +:10FF30004010000910008808104190419008000806 +:10FF40002008820890000002A00588002000080513 +:10FF500008210000020900000000100000088808C5 +:10FF6000820084088400820000100000002100004C +:10FF70000000000800000000000000000021000058 +:10FF80000000000000000000000000000008A003C6 +:10FF90004000000800000000000080A080008501F3 +:10FFA00000201000410021000304C008030009885C +:10FFB0000804A0080304059003A000082100032002 +:10FFC0004100801000002100090103000000000230 +:10FFD000410008C00008000021A00000000000004F +:10FFE0000000000000A00000000800000000410028 +:10FFF0000000000000000000000000000000000001 +:02000004000DED +:1000000000000000000000000800000000000000E8 +:1000100008000000000000000000000002000200D4 +:10002000000008000409C0110200A0048200820040 +:10003000080982008211821182400800C011A011BB +:10004000824000041003A000A00200110100000083 +:1000500000000800000000008200040000000040D2 +:1000600008000000A00002000000000000000000E6 +:10007000020000000400000000000000000000007A +:10008000000010000020000004000000000000003C +:100090000400A00008008400000008000800A00080 +:1000A00080C0044000842100000020C004402120C2 +:1000B0004100000005000500400009900002028890 +:1000C000410400C003840000000009000300404018 +:1000D00003000300200000200300000000000000D7 +:1000E0000004000000000400040000000300000001 +:1000F0000000000000000000030400400000002099 +:1001000000000000000000000000000000000200ED +:100110000000000000000000000000200088000037 +:100120000000C0C102800100000084001000000037 +:10013000000008000000000082008280A000820011 +:100140000800820020000010C04104000000C00030 +:100150000000004100210005000000000008000030 +:100160000000840000000000000000000000080003 +:100170000000000000000800000000000000000077 +:10018000000000000000000000000000000000006F +:10019000000000000000000000000800000800004F +:1001A0000000080000409040020000A0000009008C +:1001B000000002A0040000C00320009004020420FC +:1001C00040A003100300088400C00500890005005A +:1001D0000008101008A00000080000001000000037 +:1001E0000000000008000090000003000000000074 +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:10022000000000000400000808000210A0002008E0 +:1002300002040011C000001010004000040304007C +:100240000000000500000200080000048200000019 +:1002500008400020000000200020020300080000E9 +:100260000000081100000000000010000000000065 +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:100290000000080000000000000000000000000056 +:1002A000000000000000020003400004880020005D +:1002B000000000040800002021000000030020408E +:1002C00020C01100210005020000000405020840C2 +:1002D000000000000200000020002104080000903F +:1002E00000002000000000000000000000000300EB +:1002F00000000000000000000000000000000000FE +:1003000000004100000000000000030000000300A6 +:100310000400020008001100000000C011000000ED +:10032000000000000000000000C004400290C0C0B7 +:100330000000010008000000000001004001000072 +:10034000A0C001C1A08500C1000120001000000173 +:1003500000024088840008840001000000010000C1 +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A0000000000000000000000005808280800046 +:1003B0008000000002000000000002204002804097 +:1003C00000098083020480A000200340884080410F +:1003D00000040000030005108040004100080010E8 +:1003E0000008000000000000000000000000000005 +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:10042000000000000000000000000000800080418B +:10043000004180800000000000000000000000007B +:1004400000000000210002411000004100000000F7 +:10045000000000038080A12009009103000000003B +:10046000000000000000000000000000000000008C +:1004700000000000000000000000000000800000FC +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000040000C +:1004B00040419001C0020000000000000000000068 +:1004C0000000000000000188000101200010004031 +:1004D0000010000000018802910188409001000096 +:1004E000000000000000000000000000000000000C +:1004F000000000000000000000000090000000026A +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:10053000C0890020404000C0000000000001000011 +:10054000000101000000000188030190A190918941 +:10055000000000000101000100900088A004038851 +:100560000000A000000000000000000000000000EB +:100570000001000000000000000000000000040076 +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B0000000C010008900890082000000200010A7 +:1005C00000000010082120050040001003418204B3 +:1005D00002910004042105050940001000418084B7 +:1005E0008441000003004100000000000000000002 +:1005F00000000001000000000000000000000000FA +:10060000800000000000000000000000000000006A +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:10063000000000008041802080C000800000000099 +:10064000000000000004000000000000A1001021D4 +:10065000100010032105030000004000C000A000AE +:1006600020800411000800000000000000000000CD +:100670000000000000010000000000000000000079 +:10068000004000000000000000000000000000002A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000C001200040C0C002000097 +:1006C0000000000000000000000000000000059095 +:1006D0009101C100C001010000000000000011886C +:1006E00009908384820000010000000000000000E7 +:1006F00000000000000000010000000000000000F9 +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:100730000000000000000000000000000700484228 +:1007400000000000000000000000000000000000A9 +:10075000000000E000004100000000000000000078 +:10076000000000E0070000000000000000000000A2 +:100770000000000000000000000000000000000079 +:100780000000000000000700000000000000000062 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D00000007A3C7AF36C606C6F0000000000004F +:1007E0000000028326A700003C000000000000007B +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:10085000000000007A3C7A3C6C606C6F0000000085 +:10086000000000001A9B3EBFFC003C00000000009E +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B00000000000000000000000000000004308ED +:1008C00040000084218600000000000000000000BD +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:10095000000000000000000080EFC2CB000000009B +:10096000000000000000000066663C661800DBD353 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000080EF80EF000039 +:1009E0000000000000000000000066663C66180081 +:1009F000DBCB000000000000000000000000000051 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A4000000000001061200E004D0008006100064B +:100A5000000D000000610006000D0000006150065E +:100A60000009000000610006000D000000610003A5 +:100A7000001D000000610006000D000000000000E5 +:100A80000000000000000000000000000000000066 +:100A90000A08050000A0000000000000000000009F +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC000000000000000000000003530F5000000CC +:100AD0000000F500F50000000000037D0341FF70F9 +:100AE000FF7F0C14CFD73C3C3C287700777782827D +:100AF000D7D70F0F0F050000000000000000000016 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B40000000000000000000000000003434F40445 +:100B500000000000F5FFF5FF000000003F7D3F4171 +:100B6000FF40FF4F0000FFFF141414007777770059 +:100B700050FA50FA0F0F03030000000000000000BD +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD000000000000000000000002CAF38FA000008 +:100BE00000000203A2F33C3C3C3C00CAF0CA0000F7 +:100BF00000003F3F3F3FAAAFFFFFC0CF0A0A0000FF +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C500000000000000000000000000083AFC2FAA6 +:100C600000000000A2F3A2F355F055F00FCAFFCA2E +:100C7000000000003F3F3F3F000FFFFFC0CFFAFAE8 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000001014 +:100CD00004008804010404000102040504820402E3 +:100CE000200800800004C08820A000882020004048 +:100CF00088900500050484100580200201A0008270 +:100D00000482000400028400010200088540000300 +:100D10000480040004802000880288008800880085 +:100D2000888220804010000020020400880000001B +:100D30002000880004002000200020002000000582 +:100D4000010420001108010400002000040000003C +:100D5000000220000582080880020400050004103B +:100D600040A00004090408000420004100044005DC +:100D700000850041080040000083080840830411FA +:100D800000110002000100050002040300412005DB +:100D900000000002200020021040000000000000BF +:100DA000000000080002800000000084090000002C +:100DB000000000000400000000200000000000000F +:100DC000000020014100A0012001000000002000DF +:100DD0000000010000001000000002000800880070 +:100DE0004100090001000010000040000880890057 +:100DF0004108404100004020000000400000000089 +:100E0000208000800080000200000082000000823C +:100E10000010000000400000000000000000000082 +:100E20000000000000000000000000800000000042 +:100E300000000000000000000000000000000000B2 +:100E40000000000000004080008000000000000062 +:100E50000000000002080510800202020484C08421 +:100E60000002880802840402040302108910800230 +:100E7000400088098010040080080084000000847D +:100E8000004000400904000400090008000300407D +:100E9000001100A100000000000000080000000098 +:100EA0000000000000000508000200080002000029 +:100EB0000002000000000008000800080000000018 +:100EC000000000000008000880080004000800007E +:100ED00000C00008000000210020000800210000E0 +:100EE000C00804080403028801000200880841A029 +:100EF00041200840838000210404C0800380408397 +:100F000082204090841008408880C040A0040803DC +:100F10008285820500A100000008040000218221D2 +:100F2000040000000405000800020005000200049F +:100F300000000000000800000000000000000000A9 +:100F40000008000000000000000010000000000089 +:100F5000000000000000002100004100000000002F +:100F60004000008488008900211008A0C090000083 +:100F7000400420A000200404100000012140A01023 +:100F8000002000A000200000000904100000002143 +:100F9000100000200040000800004100C1000000D7 +:100FA000000000000000000000000001000000013F +:100FB0000001000000000000000000000000000030 +:100FC0000000000000000000000008008000000099 +:100FD0000000000000000000000082021020A109B3 +:100FE000A00208028208900408000100880840025C +:100FF000A004C089820409000041A021020282826B +:101000000810004183118310850400000000830450 +:10101000820008004002408008800000C000C0003C +:10102000900082000000080008000000000082001C +:101030008200000000000000000008000000A00086 +:10104000820000000000000008000800A0C00000AE +:10105000821000400840C0008200820011010000A0 +:101060000800000180002101000041000200204131 +:10107000000004040010414004040000000080004F +:101080000002800108000400080140820000000006 +:10109000400100A000000800001002040000000051 +:1010A0000008000000000000000000000000000038 +:1010B00000080000000811000000410000001100BD +:1010C00008000000000011000000000011000008EE +:1010D00000080000000000000000000000000821DF +:1010E00083C0081000080800A000000082008205EC +:1010F0008300C1088280A040C0004080C021C000A1 +:101100000800A0A0A01000210002C000840021104F +:10111000C000C0100003C00082088240020000002E +:101120000000002100100004000000008221842043 +:10113000000000000000200000000000000000008F +:10114000000000000000000000000000000082001D +:101150000000000008000000000000210000000066 +:101160000000081000001100000003000000000053 +:101170000040080004100820050003C088400390C8 +:101180000000002000040000210220820320200033 +:1011900002000308000100000000000000008020A1 +:1011A000000000002000000000001100000000000E +:1011B00000000000000000008000000000000000AF +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E0000000820004808200084182000400104058 +:1011F0008300080008038280A10008030408080097 +:1012000020020800100008091010080010209005A6 +:1012100004090400C0009003000000000010002139 +:1012200000000000000000210040000304208200B4 +:101230000000400000000000001000000021040831 +:101240000000000000000400000000000800A000F2 +:10125000000000000000000000000000000000008E +:101260000000000000004108210000000000030011 +:10127000080004002000002002204000000091200F +:10128000080003018200000021002101410000A1AB +:10129000000000A0000008000000000000000000A6 +:1012A0000000000000000000000000000000080036 +:1012B000000000000000000000000000000000002E +:1012C000000000000000000200000888000000008C +:1012D0000088114000000000000000000002000033 +:1012E000002000000000000101002000C0002002DA +:1012F000000404A002400100200800A004840204AD +:101300000103C0A0900288C10491400382C002C0C2 +:10131000830820020282900401A141051085020584 +:10132000008220838211000000000000A000000065 +:10133000000000000000000000000401890000011E +:10134000000000000000000000000000000000009D +:101350000000000000000000000101018901000000 +:1013600000000000000000004041052100040000D2 +:1013700000800080808080000900858000000000DF +:10138000800003C0058300851182C12100108040C8 +:1013900080800800008080800820030882A100105F +:1013A00085410003081000A100000303210300038E +:1013B00000400000000000000000004000030203A5 +:1013C00000210000000000000000000000000000FC +:1013D000000000000000000000000041202104087F +:1013E00000110000000000000000000000000000EC +:1013F00000008000002080000000A00021081100F3 +:1014000090080080A182A080408403802121901157 +:101410000009100040880000108000A08303A0098C +:1014200002900300840205800321000009000200ED +:1014300040002100000000000000000009800900B9 +:101440001000410300000000000000000000000048 +:101450000000000000000000000000001000050077 +:101460000300414000000000000000002000880050 +:101470008400840002000010A000A00003C0418886 +:101480009108040900020304A008C1882002210079 +:10149000851120908400840400088304081104014D +:1014A000A1089089C09005A1904082010000000031 +:1014B0000010000001000000000000000000000417 +:1014C00000000000014100000000000000000000DA +:1014D000000000000000000000000000000000020A +:1014E00000000000010100000000000000000040BA +:1014F0000104018400C1048400002011A0011040F7 +:101500000088C00282C1C1018800410020A0C082C1 +:1015100021880509A1C1400100210005A089020818 +:101520000821008905C1040301C101910988000057 +:1015300000000100020000000000000000000000A8 +:101540000000000001010000000000000000000099 +:10155000000000000000000000000000000000008B +:10156000000000004000000100000000000000003A +:1015700000401080408910C180050011001000411A +:10158000804000A180A000C1850208204000000327 +:1015900080C18491C182A0A120100005009080C16B +:1015A0000000838820108890808810022102899191 +:1015B0000000004110204103000200000000000074 +:1015C000000000034005102100050000000000009D +:1015D000000000000000000000000000000000000B +:1015E0000000004100042004004100000000000051 +:1015F00000000000000000000000000080800000EB +:101600008000A08208C084802090C1801000021158 +:101610008802C00388119080C08300808000000091 +:10162000800241058300218082024100C0882100A0 +:101630008311000000910002000000400000000043 +:101640000000000021402040410004030000000091 +:10165000000000000000000000000000000000008A +:101660000000000008004000110000000000000021 +:10167000000000000000008200A00000040004043C +:1016800040400400C0C185A090049008C10283A01E +:1016900008210901C18209C11002A0A09002020222 +:1016A0002002A0009120A08891C0A100050008821E +:1016B000834008000000000200010000000000005C +:1016C0000000000000000104000000000001000014 +:1016D000000000000000000000000000000000000A +:1016E00000000000000001400000000000000000B9 +:1016F00000000000000000000000000000000000EA +:10170000000007000000000000E007008111000059 +:1017100000E007005000000000E00000810600002B +:10172000000007000000000000E0000000060000CC +:1017300000E00700000000000000000007000000BB +:101740000000000000000000000000E000000000B9 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000E00000000099 +:1017700000000000000000000000000030F3F3F360 +:10178000C3C3C3F355415541283CFFF00FFF3FFF52 +:10179000C3FFE8E800005555E8E8C3FFCFC00505E2 +:1017A000D0F0FFFF05AF05AF55551414A0F58282A8 +:1017B0003A3A3A3A00DF001C000000000000000046 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F000000000000000000000000000000030F3C6 +:101800003030F3C3F3F3FFC3FFC3280000F00F0F22 +:101810000303003CE8E8AAAAFFFFE8E8003CCFC0C9 +:10182000F5F5D050FFFFFFFF000055551514A0F54A +:10183000D7D70A0AFA0A00CB00080000000000000F +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880004488CCCC55555555D7FF82FFD4D7D4D7F3 +:10189000FF3CA0A0FFFC7DFC05F50FFF41EBA0A0E5 +:1018A00004100000AFA0C3C3A0A0C3C3555550503F +:1018B00051510000F5FFF5FC0C00FC000000000099 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:10190000000055AAFFFFF4F0F4FC00FF00FF1417DD +:101910001417FF3CAFAF00C041C005F500F041EB2C +:10192000F5F500000000AFA0505FF5F5C3C35555B5 +:1019300010515151FF00050F050C550055000000D6 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:1019800000610006009D000000610A06050D0000D0 +:10199000A0610A0E059500A1A5610A0305010001D9 +:1019A000A06150060095000105615A06000D00A0D7 +:1019B00000610007009D000000613E0F000900006B +:1019C000000000610A0E000D000000000000000091 +:1019D0000000006100070009000000000000000096 +:1019E00000000000000000000000000000000000F7 +:1019F0000000006100030001000000000000000082 +:101A0000000000000000BEBE3CFF0000000028EB0C +:101A1000E8E8BE3C000030F3F3F34B4BAAFF0000B4 +:101A2000787855D757576AEA69EB0000000053539E +:101A3000F0000F000000FF00FFAA04414541AA3F4B +:101A4000AA3000000000000082F0D7F00000000083 +:101A500000000000737DC3C32C20EFE300000000F2 +:101A60000000000000000000000000000000000076 +:101A70000000000000F0FFF055FF45EF00000000FF +:101A80000000000000000000828200C3000000008F +:101A900028EBE8E85010000030F330304B4B005595 +:101AA000FFFF78787DFF7F7F6AEAAAAA0000000026 +:101AB0005353FF0F00003CAA00000FAA04554555E0 +:101AC000AA3FAA3000000000000000000000000053 +:101AD0000000000000007D7D7D7D2C20EFE30000F4 +:101AE00000000000000000000000000000000000F6 +:101AF000000000000000AAF0AAF000AA04AE000056 +:101B00000000000000000FFF0F5500000000000063 +:101B100000000000000000000000D4D4FFFF3F0FD1 +:101B20003F0F00FFAAAA0F0F0F0F0F2F0F2F00005C +:101B30000000FFFF0F0F3C3CC1FD0500050FF0004A +:101B4000005CCF8E0C8E0000FFF0FF288255C2058E +:101B500000000000000000007D7D5FFF1EBEF00061 +:101B60000000000000000000000000000000000075 +:101B700000000000000000000FFF3F3FF3F3F330D0 +:101B800000000000000000000F000F5500000000E2 +:101B900000000000000000000000000000FF00FF47 +:101BA0001F1F1F1F0F0F0F0F04FF2CFF1F3F1F3F93 +:101BB000000000005C5C5C5C0000C1FDF5F0F5FF1E +:101BC000F0000F5CCF8E0C8E0000FFF0FFEBC20523 +:101BD000C20500000000000000007D7D5F5514B4C8 +:101BE000FF0F0000000000000000000000000000E7 +:101BF0000000000000000000000000F03030303035 +:101C0000F3300000000000000000200084002004E9 +:101C100040008800880000008804001120000200B5 +:101C200020004000040004008404200020008800FC +:101C30008803000000008800200000002000000051 +:101C4000200040002000200020000002200084002E +:101C500020008400C00000092000200000000000D7 +:101C600088002000880000000000000000008800BC +:101C700084000000010009800380888011800380B7 +:101C80000380018001801184098011800000000020 +:101C900040000000000000204000040041880000D7 +:101CA0000082000204000000000000020400400066 +:101CB0000082000010001000100000004100000031 +:101CC000050000001000000000000000000000827D +:101CD00000000000000000000000000000004000C4 +:101CE0000000400000002000000000000000000094 +:101CF0000000000000001000A00884080008820412 +:101D0000A0088408201010408820820404080000E5 +:101D100000000000000000000000002102000000A0 +:101D20009000000000200000000002000000000001 +:101D30000000000000000000001102000000000090 +:101D40000200000000000000001100000000000080 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000001043 +:101D9000000800820082000804000008001000080B +:101DA0002000000000400090009000080000048423 +:101DB000000802C0000000880000000804840088B9 +:101DC0000000000000000008000000080000000003 +:101DD00000000008008200000000004000084000F1 +:101DE0000288000000000000000800000010000849 +:101DF0000000004000000000000000880088000093 +:101E000000000000000000000084000000000088C6 +:101E100000000000000000000003C000000082007D +:101E20000000080000000000000808000000020098 +:101E300040000000A00000000000000000000000C2 +:101E400000080000900000002000000000000008D2 +:101E5000000000000000000000000000000800007A +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000080000010059 +:101E80000000000000000000000010000000000042 +:101E90000000400003000300020000A0000040001A +:101EA000058800200840100010900300030008007F +:101EB0000088030421000500210041000500088876 +:101EC0000984008400200088082000C0000003006E +:101ED0000090000000000000000000000800000862 +:101EE00000000300000000000000000000000000EF +:101EF000008400000000000000000000000000005E +:101F00004000080000000000000000008084000085 +:101F10000000000080000040080904110840080982 +:101F2000904190050800000004000800A011000482 +:101F30002009080900000000000900000000080452 +:101F40000800000400044009000000000000080030 +:101F50000000400000000000200000001000000011 +:101F60008200000000009000000008000000020055 +:101F700000000000000008000000A000A000000019 +:101F800008000000A0110800000000000800000088 +:101F900000000000000002001000054040000000AA +:101FA00040400040022020C00000008809001100CD +:101FB0000800400420000200000440202088088817 +:101FC00005900000219000200000000000C00000EB +:101FD00000000000000000000000040000000000FD +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000002001000AE +:102020000040000000000008000020000000A000A8 +:102030000000080000000000000000000000000098 +:102040000000000000000000000000000000100080 +:102050000000000000000000000000000000000080 +:1020600000000000000000000000000082000000EE +:1020700000000000A000000000008200000000003E +:1020800000000800A000A000000000000000000008 +:102090000000080008800000000000001000000898 +:1020A00000000002000041000800000000000304DE +:1020B000204000020090410021C0090009000308EF +:1020C0000810100005000900058820001084090090 +:1020D00010880590030041C0000011000000038833 +:1020E00000000000000000000000000000000000F0 +:1020F0004000000000A00000000000000000000000 +:1021000000000000000000000000000000000000CF +:102110000010000000840002000000000000000029 +:10212000000000000000000000008400100000001B +:1021300000008204000040008200820000000000D5 +:10214000000040000000000000000000000000004F +:10215000000000400002002100000000000000001C +:10216000000000000000000000000000000000006F +:102170000200000000000000000008000800C0008D +:1021800008000808080000000000400000001000DF +:1021900040000000820040000000000000000040FD +:1021A0001100000000000440202000040000002076 +:1021B000082040C011C0000208881188009041101A +:1021C000000040000000204000080300091011003A +:1021D00000004000100000000000000000000000AF +:1021E00000000000080000000000000000000000E7 +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:1022800000000000C100C001000000820000C0008A +:10229000018201C10100C000004000824100C10074 +:1022A000010041820000000000000000000000006A +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:102300000000000000009041A1400000008000415A +:1023100080414180410341038521008000804100CC +:10232000C121414141800000000000000000000088 +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:1023800000000000000000000000C1410041000505 +:102390008080414100418341C1C1A1400041804151 +:1023A00080C18041000000410000000000000000EA +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD +:102400000000000000000000000000824091000178 +:10241000000040C000A100018301C0C120C0000134 +:10242000040104C1200100002001000000000000A0 +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000004000000C +:10249000C000000000200000C18300820020000076 +:1024A000C183C00100400000C140000400000000E2 +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000000DC +:10250000000000000000000000000000000000804B +:102510000041834100000000002141830080004110 +:102520000000C183800300800021C1C10080000041 +:10253000000000000000000000000000000000009B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:10258000000000000000000000000000000000004B +:1025900020410080C14004C0824180C183C003410A +:1025A000418080418341038080C18000C1C00041DF +:1025B000000000000000000000000000000000001B +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:10261000000001830002409001C18521400383C175 +:1026200001C100C04001030101C040C1024040059A +:102630000001000000000000000000000000000099 +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000008112000000004842821200E0A9 +:1026A00000004842881200000000484281120000E9 +:1026B0000000484200000000000000000000000090 +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000000000000000000099 +:102740000000000000000000000000000000000089 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 +:102790000000000000000000000000000000003009 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:102820000000400000000000000000000000000068 +:102830000000000000000000000001030884008484 +:102840008804100084090004019101004111000472 +:1028500005848880000089000010000800840402BC +:1028600084900504008040C041400080000000804A +:1028700020400000000000000000000104000000F3 +:102880002004200484000000000400040000000074 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B00000000000820000000000000002008040D4 +:1028C0000010000800900000000020024000C0003E +:1028D000000040040002410040000001000400022A +:1028E00000050041400500108011A00500400000D7 +:1028F0000010000140400000000000000000000443 +:1029000000040000000000040000000000000000BF +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000001087 +:102940000000001000000000000000C101000800AD +:1029500000000082200000200000000000849000A1 +:10296000000000000080010000C00010008840004E +:1029700000000041000000000041000000000000D5 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000005000000842084090400080004201091 +:1029D000009002820009030000900004000000053E +:1029E0000400090000100002400000020300001172 +:1029F000804000000040400000000000000800008F +:102A000000004090000000000000000000000000F6 +:102A10000000000800000040000000000000000866 +:102A20000000000000000000008200000000000024 +:102A3000000000080000000000000000000000840A +:102A40000000000000000000000508000000000475 +:102A500000030005200020029003101040000888A9 +:102A600002050000000000000005091008008402B3 +:102A70000000C008400040080000000000000800FE +:102A800000400000000000000000000802000000FC +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC00000000000000000040300000008000040B7 +:102AD000000200080000800080000084800088045C +:102AE000000400024100000041000000A0000000BE +:102AF0000041050400000000808800000000000084 +:102B00000040000000002100000000000000000460 +:102B10000040000000000000000000000000000075 +:102B20000000000000000300410000000000210040 +:102B30000000000000000000000000004100000054 +:102B4000000000000000000482002000A0020440F9 +:102B500000044000001000200909C008900910007E +:102B60001000888208C0C00340000000200000025E +:102B70000000C04000020000000000000000000053 +:102B800000000000000000009000000000000000B5 +:102B900000000000000000008200000000000000B3 +:102BA0000000000000000000000000000000000025 +:102BB00000000000000000000000002100040004EC +:102BC0000004000000100000088403C04108110147 +:102BD0000000214021000541000820902000114004 +:102BE0009100050041051140419004042188000432 +:102BF00000210000048804010000082000000040BB +:102C00000000004000400000000000000000000044 +:102C100000000000000010000000000000000000A4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C400000000000000000000000A000C000A00084 +:102C50000800000040008200C000200000418210F7 +:102C600040000000840004040441A000080040412A +:102C70008200A0009000408084100000000000004E +:102C80008200000000000000008000000000000042 +:102C90000000000000000000000000000000000034 +:102CA0000000080000000000C0000000000000005C +:102CB000000000000800000000000000000000000C +:102CC0000000000000000000000000000000000004 +:102CD0000000000000008000000000400000000034 +:102CE000050080002100000040000090000000006E +:102CF0000000200008001100000400A003000004F0 +:102D000000400088000000001000100200000000D9 +:102D100000040000000000000000000000000000AF +:102D2000000000000000000000000000000008009B +:102D30000000080008000000000000000000000083 +:102D40000000000000000000000000000000001172 +:102D5000100008000000401110804121000408000C +:102D600004008800000004090200822100044021C0 +:102D70000000822109200000900400C100400010E2 +:102D8000000000000000080000000000000000003B +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB000040000000000000000000000000000000F +:102DC0000000000000000000000000000000000003 +:102DD00041C0C104050004044100004020821001EC +:102DE000408203040802034000C0022003002021A7 +:102DF000110221022084400403201100400220001F +:102E00000000210010000000000000000000000091 +:102E100000000000000000000000080000000800A2 +:102E2000080000000000000000000000000000009A +:102E30000000000000000000000000000000000092 +:102E4000000000040008000000000008000000006E +:102E5000000041000040A004040400010000030041 +:102E60000000000100004001000020010420044196 +:102E7000A020030082080820820490C083C1A0899A +:102E800000C0418920A000859002000001004000A0 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000820000000000000020102120FF +:102EE0008241000011410040850500022004800459 +:102EF00040828004820021808000800000830302E1 +:102F000000A0000589880000009000A000001000CB +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000800480080000100055 +:102F6000A0000408C04005004000200900400900FE +:102F700003828983C1840480A1808980A120048088 +:102F80002103A0800382400040202088030000002D +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000008800200108900000B0 +:102FE00085900200C001C00100A001000000008225 +:102FF000C0A0C082A04103A001020320A0A0A12084 +:10300000A1080100A1900189000000110040010801 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000040020088200581 +:10306000A0C10001000001010100000101000001F8 +:103070000100A0A00120058383A1C01000900008DA +:103080001020048800910040830040020002098261 +:1030900002C000010000000100000000000000006C +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D000000000000000000000000000800300A1CC +:1030E000000880C100214010042141400020030558 +:1030F0004121044080804041A0A140208084000301 +:10310000000800088000000203109040008000804A +:1031100004000080000800030010002000000000F0 +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:1031500000000000000000000000000000008009E6 +:103160008080000080002002210020000203200354 +:103170000000090008102121C108210020111008B9 +:10318000022041000803C10090A00500400000009B +:103190008000800000080000000000000000000027 +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF +:1031E0000200A004408404000088004001000000A8 +:1031F0000000000001000100218920842188820054 +:103200008583212020820101C14083022000A1008A +:1032100082A0400002000201000000000000000047 +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E +:1032600000000000000000000000000000E000007E +:103270000082000000E000000000000000E000000C +:1032800000000000000000008800000000E00000D6 +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE +:1032E00000000000666624E700663C000000000065 +:1032F000000000000000000000000000FFFF91003F +:10330000F8F8F8F80000F06609FF9999C0C0909F9E +:10331000CFC9CFC900FF0C0C00F06C6C000000009E +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:1033600000000000000066660CCF60600C0C0000DE +:103370000000000000000000000000000000FFFF4F +:103380009999F9F8F9F90000F06618FF1818CFCFED +:10339000909FCFC9CFC9FFFF09090FFF6C6C0000D8 +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:103460000000000000000000000072007200DB425B +:10347000DB4200000000606F303F000000000000F1 +:103480000000B0FFB0FF001CE3FFFFFFFFFFF9608B +:103490009900BDBD24243C183C18FFF0FFF000004B +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000072FF72FFFA +:1034F000F0F0F0F000000000606F303F00000000CE +:103500000000000000FF00FF0000000070F070F0FD +:103510000000000090F690F63C183C18C37E007E38 +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:1035600000000000000000000000000000000061FA +:103570000006009D000100610007000D00050061CC +:1035800000050009000000613007000D0000006127 +:103590003006000D0000A061500200010000006133 +:1035A0003006009D000000610006000D00000000D4 +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F00000000000B2B230F382D7A0A0FEFEFFFFB1 +:103600001414BEBEFF00FF2B415500000000F5A0C2 +:10361000EB504150AA00AAA000C3F0AA50F000A0AD +:103620000000000000000000000000005555555546 +:10363000000000000000000000000000000000008A +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000B2B230F382D7F5F554FE2E +:1036800055FFF0F0F0F0FF00FF2B45450000000073 +:10369000F5A055555555AA00AA28FFC3F0AA5FFF0B +:1036A0000FAF0000000000000000000000005155B6 +:1036B00001550000000000000000000000000000B4 +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA +:1036F0000000000000000000000000000000FF0AC1 +:103700003F33AAAA78780078CF8ACF8A40C250FA8D +:10371000287DD0800000000000000000CF00CFFF17 +:103720000F0F003C3333F3F3000D303D0000000079 +:103730000000000000000000000000000000000089 +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000000000FF004A +:10378000FF0AFFF3AAAA7878FF78CF8ACF8AC2C24D +:10379000FAFA287DDF8F000000002C283C3CC00096 +:1037A000C0FF0F0FFF3C3F3FFFFF00000000000085 +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F000000000000000000040002003000820033B +:1038000020038400008320040005894040042183B4 +:1038100088808280208002020140008084820080B3 +:103820000100002000800040880004008500840022 +:103830000000000004000000000100000000000083 +:103840000000000000000000000000002000000058 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000400200024 +:1038800000080900000000088001002002C00001BB +:10389000844000020040000800010801001041219E +:1038A0000020400000010020000100000000400056 +:1038B00000000000000020000000000040000000A8 +:1038C00040000000000000000000000000000000B8 +:1038D00000000000000000000000040000000000E4 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000800000080018000800080AE +:10391000010000880000000000000000000000001E +:103920000080008000000000000000000000000097 +:103930000000000000400000000000000000000047 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:10397000000000000000000000000000000009003E +:10398000098400844000030100000002402000027E +:10399000000420000008000011000382000000085D +:1039A00000000040001002844000004002000000BF +:1039B000000000000040000800000000004000007F +:1039C000000800000000000000000000008200006D +:1039D000000800080000000000840000000000084B +:1039E00000080000000000000000000000000008C7 +:1039F00000040008000000000000000000000008B3 +:103A00000005000000050100000340000008000060 +:103A10000000880240410000880090000000020081 +:103A200040100000000000800000000004000010B2 +:103A3000000000000000000000050000A0000008D9 +:103A40000000000000000000000000000000000076 +:103A500000000000840000000000000000000000E2 +:103A60000000000000000000000000050000000051 +:103A70000000000000000000000000000000000046 +:103A8000000003000388009010000088C1000800B7 +:103A9000000008000882809021C00300008821886F +:103AA0008908800100000500080800004000C008E7 +:103AB00003C10000000000C00800008400000000F6 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000010000000000000000000000000B6 +:103B000000000000910982418811C020204040023D +:103B100000000800880020208400080082002004A3 +:103B20000002824102110009001100028200C0005F +:103B30000080000000000000008000000000820003 +:103B4000A000000000000000840000000000000051 +:103B500000008200000000000000000000000000E3 +:103B60000000000000000000000000000000000055 +:103B70000000000400000000080000000000000039 +:103B8000000000000000020010002000110040C0F2 +:103B90008300000203000000800109000002090008 +:103BA0000800000000008000210240001000080012 +:103BB0004100001008200300118440104000000064 +:103BC0004000000008000000000000000800210084 +:103BD00000000300000000000800000008020800C8 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000A000A085 +:103C00000008000800000000080010008200A0006A +:103C10004000084140804080020010000400C08441 +:103C200000088200C000080008800880C0008900E9 +:103C300000008210000000000000004100000000B1 +:103C4000000000000800000000000000000000006C +:103C5000000000000000000000080000000000005C +:103C6000000000000000080000000000000000004C +:103C70000000000000000000000000000000000044 +:103C8000001000000000000000000000A000000084 +:103C90000010800000020020882080840000800046 +:103CA000000300000010000000A0402000200000E1 +:103CB0004000030008044100090000080808200033 +:103CC000008808000802000000000000000000005A +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D0000000000000000000000000000040888809F +:103D10000480010000080084002002900000820559 +:103D200085412085822090094000400202A002893E +:103D300084004000000000000000C040004000403F +:103D40000840000000000002000010000000840392 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000004003 +:103D800000000000000000000000000000000290A1 +:103D90002102001040844100004009010803000096 +:103DA00040004002100203000000009000000020CC +:103DB0001120000000004100409000000901200097 +:103DC00000000000000000000000212008000000AA +:103DD0000000410000000000210000880088110060 +:103DE00000000300000000000000000003200000AD +:103DF0000000410000000000008200000000000000 +:103E00000008009009000000000009000000000008 +:103E1000820000000000900000010100000100018C +:103E200002C0C121A041080900A18505A08200832C +:103E3000104090C104A0A0C00189002000A102117F +:103E40000100000000000000000000000000000071 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000010000000800000412005052007 +:103EA000000283C0032100A0000300414021000064 +:103EB000000200838321800500052004008900049E +:103EC000008410000000000000000000000000005E +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F10000000000080000000000080040800000095 +:103F20000000C109C100A100404080880000008954 +:103F3000800080030200400210C089880000000851 +:103F400080808000030000004100050000000000A8 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F900000000000000004A0000082001001058461 +:103FA00000008400C18802A003009100C089404045 +:103FB00082C0828202010940830520828211820030 +:103FC00082A1A00804000000000000000000000022 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:10401000000000000000000000A1000100A000C19D +:10402000000000010800010002020308084040C12E +:104030004000010084008300010001209105A040A0 +:10404000048800048208C0A00000000000000000F6 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:10409000000000000000000000000020002000419F +:1040A00000C1002021028340110480A0830040C091 +:1040B00003C0800420054104A14010052008A1216F +:1040C000801080000500418080000000000000009A +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:1041100000000000000000000000000041040084D6 +:1041200005004000218400890500404041A0088925 +:10413000100020038304098902000500C111848551 +:104140002000404080090041808000000000000005 +:10415000000000400000000000000000000000001F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000001011D +:1041A0000009002000000105000201A0010001C17A +:1041B000014000A00000080104088582A000C14160 +:1041C0004120C0C000000400A0201004A000000096 +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:104220000000000007000000000000E007000000A0 +:10423000000000E0070050000000000000008400C3 +:10424000000000000700000000000000070000124E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A00000000000000082BEC3FF0000000000000C +:1042B000000000000000FEFEBEFFC3F3C3030000C9 +:1042C00000005F50000000AAFFAA00AA55FFF03CC2 +:1042D000F0FF0000000000000000000000000000EF +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000082BE003C0000000011 +:10433000000000000000000040400041C353C303E0 +:10434000000000005F500F0F0F0F0F0F8080D5D5BA +:10435000F000F0C3000000000000000000000000BA +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A00000000000000000000000FFFF000000000F +:1043B0000000FF00FF003C3C3C3CD5D5D515FD007E +:1043C000FDFFF775F7F7707070003AFF3AFFAFAF77 +:1043D000FFBE717130F3000000000000000000001B +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000FFBE0014BB +:10443000000000003C3C55555C5CFC0C1515D51586 +:104440000000FFFF0CCF0C0C70707000000F0F0FFE +:1044500005055514FFFFFFFF0000000000000000ED +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000061000E009D00 +:1044B00000000061000F050900A50061200E004109 +:1044C000000800613006000D0001A5610A0E001D04 +:1044D00000A000613E0E000D000000610006000D0E +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000BEBE1E1ED3 +:10453000FCFC3CFF2C2C0404F0C3FFC355FFB4B4B7 +:10454000D755D7FFE0E4E0E40F0053532B00EB0016 +:104550001510050000000000000000000000000031 +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A00000000000000000000000000000001414E3 +:1045B0001E1EC0C000C3FFFFFFFF00C30FC300AA41 +:1045C000B4B4820082AA404EE0E4FFF053532B00C3 +:1045D0002800555045400000000000000000000089 +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:104630000000000000000000C3C3A8FDAAAABEBE7F +:104640003C3CFC0C417D417D4155000000000000D8 +:1046500007F5FFFF7C7DFEFF7D7D28280000000020 +:1046600000000000FF55BE14000000000000000024 +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B000000000000000000000000000A8FD000055 +:1046C00014143C3CFA0AF0F0F0F04155AAAA00009C +:1046D000000007F7FFFF3C3DBEBFAF05AF05000080 +:1046E000000000000000FF55BE14000000000000A4 +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:1047300000000000008400A084908490048800841D +:104740004088008400C000C04004000220C00088EF +:104750000004A00888808880000888108900A1884B +:104760008305890088820084880800800088008092 +:104770000004002000030000000000C0048000804E +:104780000080000400900082008400080002009075 +:1047900000C0000400200000000000002000000015 +:1047A0000000000000000000000000000000000009 +:1047B0000000000001800003000300030009004125 +:1047C000050900210040001100210009000100112D +:1047D0000005000900000010002002090401020089 +:1047E00004030482020004110041000100020011D0 +:1047F0000040040100090000000000000009001052 +:1048000000400002000100410011004100010001D0 +:104810000009000900010001000000000000000084 +:104820000000000000000000000000000000000088 +:104830000000000000001004000000000000000064 +:1048400000000000008000800000008000800080E8 +:1048500000800000008000000000008000000000D8 +:1048600000000000000000100000000000800000B8 +:104870000000000000800080000000800000008038 +:1048800000000000000000000000008000000000A8 +:104890000000000000000080008000000000000018 +:1048A00000000000000000000000000000400000C8 +:1048B00000000000000000000000000800082010B8 +:1048C0000000004000400004001000844004000884 +:1048D00000100008004000200010004000022000EE +:1048E0000000200000000000000100000000004067 +:1048F0000000000000000020001000000010000078 +:10490000000200000000000000000000000800009D +:104910000000000000000000002000100000000067 +:104920000000000000000000000000000000000087 +:1049300000000000000000000000000008C000109F +:10494000A0A00000004002A0000040A12080400084 +:104950004080000000000880080008A0000200005D +:10496000400088001000000020000000100010002F +:10497000080484000000008300080000000000001C +:10498000048010000000000005000000000000008E +:104990000000008400000000000000000000000093 +:1049A0000000000000000000000000000000000007 +:1049B0000000000000100010000000210002A1090A +:1049C0000001004100000310901103008004A108C1 +:1049D0008084804000000000C0400810880500016D +:1049E000000085100084000000A08000008480008A +:1049F0000000000000000800210800000000000086 +:104A00000000800200000000000090000000000094 +:104A10000000000000400000000000000000000056 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A400010001002100088004000C000000082002A +:104A500088009000080010000200004102000200DF +:104A60004000C000021108000000A0008200000009 +:104A7000400082000000820000008200820084006A +:104A800000008200820000004000080082008300D5 +:104A90008200000000000000000000000000000094 +:104AA0000000000000000000000000000000000006 +:104AB00000000000200020000000000000000000B6 +:104AC0000000000000000000008841000000080015 +:104AD00000040000000000000020000000000000B2 +:104AE00000000000009000C000200088400000008E +:104AF00000040000000000000000000000000000B2 +:104B00002100000000000000000000000000000084 +:104B10000400000000000000000000000000000091 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B400020000000C0038200838008000800088065 +:104B5000C00508201100C011410008000000A0801D +:104B6000C08041808400820009000800820040006B +:104B7000A000820000000004A011C000000000009E +:104B8000000008000000A0020800100082000000E1 +:104B90000800080008000000000008118200000062 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000210000D4 +:104BC0000000000000210084000020080000000018 +:104BD00000020000001140000300040200840000F5 +:104BE00000020808100200000000020003C00000DC +:104BF0000010080000000008000000000500000090 +:104C000000000000000000000001000000000000A3 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000400000000200000022 +:104C50008411040004000040C00408000004C000E7 +:104C60000020001000000020820804028200820060 +:104C700000000000200000408220C020C0059002FB +:104C800004000000002000000000080040000000B8 +:104C9000080084000000000000000820C000C000E0 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000021D3 +:104CC00000080008000800080000080004000000B8 +:104CD0000000200000001140002002000000000041 +:104CE00020000084000008042088110409000090BE +:104CF0000000000000024100000000000000000071 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000100000161 +:104D50000000849100008400018382902000000103 +:104D60000040C08200002000009104000000C1004B +:104D70000000C1830000000000088482C000C10060 +:104D80000084C0820000C001000304000000000095 +:104D9000C1000000C183000000000005C0A0C000E9 +:104DA000C1000084C0820000C0000041200000015A +:104DB0000001000100C00001000100C0000500006A +:104DC0000001000800840101200100C0000004105F +:104DD0002108000040410011004002852000081019 +:104DE0004108000000004005000941038000004127 +:104DF000C1410000C183000300030388000080203C +:104E00008241008080800005800240838000000095 +:104E10000041C1410000C1830003000303100000F2 +:104E20008020824100808080400580034083000014 +:104E300000410041004100820041004100840941DD +:104E400000021141008000000441804100C10000C7 +:104E50004000050300000080050941410000008377 +:104E600005890084002020008300034100C18010D8 +:104E70004100034100C10000100510410000004046 +:104E800082C10041004103008200034100C1802033 +:104E900000004100034100C1000010052041000056 +:104EA0000041C0C10041004103008200054100C132 +:104EB000804041000300000000804100910000009C +:104EC0000800C10004000040C0004100C100008093 +:104ED00080000100000100C000080000010100087E +:104EE000004089C0102100000000400090010083B4 +:104EF00082010000010100C1000201000101002047 +:104F0000000111C12041000101084100A00100C1C0 +:104F1000820000020000010100C100020100000146 +:104F20000020000110C12041000101084100A00142 +:104F300000C1820001000100000000C00100C000AB +:104F400000000100080089A00005C100A100C10007 +:104F500000408200000400018941000000000001BF +:104F6000C140110000090001098401000000000196 +:104F70000100000000400000C183000000000000AC +:104F800000A0900000020000C140000000000000EE +:104F9000A0000000000000400000C1400000000030 +:104FA000000000C0880000A00000C1400000000018 +:104FB00000000000000000C00001C0C100000000AF +:104FC000000100C102880011000100C100000000C2 +:104FD0000001000000000000000340A005000000E8 +:104FE000002005A1200008100002208541000000DB +:104FF00000030241400000800041C1830000000026 +:1050000000044111000000C10041C1C100000000C6 +:10501000004105410000000000800041C1C10000C6 +:10502000000000050308000000410041C1C100006C +:1050300000000003054100000080004180C1000025 +:1050400000000041008300100041004100C1000049 +:105050000000004100410000414180050083000044 +:105060004120000011C10440410800800080000080 +:105070004020004180804003C180804180020000C8 +:1050800009048000A0040385C141008080800000E5 +:1050900040410000800002400000C1C18000800249 +:1050A00000000941000010410305C1C1008080805B +:1050B00000004041000080000220C100800080C14B +:1050C00000004102804009004100C141800080048D +:1050D00000004104000080004100C021040004835E +:1050E000000000009000200500A08221000440C0C4 +:1050F0000000000000018202010840C0020182029B +:10510000000000010800038200C0409100C040C0C0 +:10511000000000010000408201A1000040C1020027 +:10512000400200000001880021820082400500C08A +:1051300040C0000000010000408201C1C1004000E9 +:10514000C0C100000100200102000100C1050800EB +:10515000C001000001010000C000010000000000CB +:10516000000048000000000000004842811200E0FA +:1051700007006042000000000000484200000000FC +:10518000000048420000000000004882811200E058 +:1051900007004842000000000000484200000000F4 +:1051A000000000004842000000000000480A811290 +:1051B00000E00700484200000000000048420000F4 +:1051C000000000000042000000000000000081120A +:1051D000004107004800000000000000000000003F +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E0000000252B0000000000000000000000006E +:1052F00000000000000000000000000000000000AE +:10530000D4A4757B00000000000000000000000035 +:10531000000000000000000000000000000000008D +:10532000DEAE0000757B0000000000000000000001 +:10533000000000000000000000000000000000006D +:105340000000DEAE757B00000000000000000000E1 +:10535000000000000000000000000000000000004D +:105360000000DEAE60DE03400000000000000230FE +:1053700000000000000000000C40000000000000E1 +:1053800002C07B0660DE0340000000000000023126 +:10539000E0000000000000000C40000000000000E1 +:1053A00002C07B06000060DE034000000000000039 +:1053B0000231E0000000000000000C40000000008E +:1053C000000002C07B0660C6030000000000000071 +:1053D0000031E0000000000000000C0000000000B0 +:1053E000000000C06306000000004000040004004C +:1053F0000000040002008400000084008880200077 +:105400000000000088808200000000008280008090 +:10541000888000008900038000000380028004006F +:105420000000000000000003000000000000200059 +:10543000000000000000000020000000200020000C +:10544000200000000000000000000000000000003C +:10545000000000000000000000000000000000004C +:1054600000000000048000000000040009000300A8 +:1054700000000000000000A0000000000000041078 +:1054800000000900000000200000000000000002F1 +:1054900000040004000040008840000088408010A4 +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E000000000000000802000000000000000001C +:1054F00000000000000000000002000000000000AA +:10550000000000000000000000000000000000009B +:1055100000000000000000000080008000C00000CB +:10552000000000000000000000000000000000007B +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:1055600000000000000000000080000000000008B3 +:10557000000000100000000000000001000800080A +:105580000000000000000000000000000000000813 +:1055900000000000000000000000000200100010E9 +:1055A00000000000000000000000000000000000FB +:1055B00000080000000000000000000000000000E3 +:1055C00000000000000000000000000800000000D3 +:1055D00000080000000000000000000000000000C3 +:1055E000000000000000000000000020000000009B +:1055F000010000000000000000001000000000009A +:105600000000820084000000000001800000900083 +:1056100000008200000000002000200001000000C7 +:10562000000000000000000000000000000000007A +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:105660000000000000000021001000000000000009 +:1056700008001000000041C0210041000800210086 +:1056800000000800000000822190000008100000C7 +:105690000000000041000000410083008000200065 +:1056A0000000000000842100000000000000000055 +:1056B0000000030041004100410003000800000019 +:1056C00000000000000000000300000000000000D7 +:1056D00000000000000000000000000000000000CA +:1056E0000000000000000000008400844100000071 +:1056F0004100080000000400080008000800000045 +:105700000800000020009000000000000800A00039 +:105710000400A000A00000000000C000000008007D +:1057200000000800000008000000820004000000E3 +:10573000000000000800000082004000000000009F +:105740000000000082000000400000000000000097 +:105750000000000084000000000040000000000085 +:105760002000A00082000000000082000800C000AD +:105770000000C00000000000000000000000200445 +:105780000000000800000000000000000000000011 +:1057900000000000008800900004000400100000D9 +:1057A00021000000030003000000080000000000CA +:1057B00000000000000000000000000000000000E9 +:1057C00000000000000000000000000000000000D9 +:1057D0000000000000000000000000008000000049 +:1057E00000000000000000000000000000000000B9 +:1057F0000000000000000000000008800080008021 +:105800000000000082000000008000000000000096 +:105810000041080408000000C00000050810000056 +:105820000000A00000800000000000400000080010 +:1058300000008200080000000000000000000000DE +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:105860000000000000000000080000000800000028 +:105870000800000000008200000000000510000287 +:1058800000404100080000000000051000900800E2 +:1058900003001000050000000000000005000001EA +:1058A00008000000030003020800000008010000D7 +:1058B00000000000000000000000000000000000E8 +:1058C0000000009003000504080000000000030031 +:1058D00000000000000000000000000000000000C8 +:1058E000000000A00000000000840000000800008C +:1058F0000000000000000000000090000800000010 +:1059000090000000000000000000082002200800B5 +:1059100000090420200420040400000000000820E6 +:10592000004000000020022008000000000001806C +:10593000010000000000000800200000000000003E +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:10596000000008000000000000000000000000002F +:1059700000000808000000000000004120000000B6 +:1059800020040000000000000000000000000000F3 +:105990000000000000001188020080C0000000002C +:1059A00000040001000000000000000000000000F2 +:1059B0000240400000000000000000000000000065 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A0000000000000000000104014000000100004F +:105A1000000000000000C00085000800C1000484F0 +:105A20004008900482A00000000001000000898866 +:105A300040888808829000000000000000000000FC +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A600000000000900000000000000000000000A6 +:105A7000000000000000000088000000000002009C +:105A800000002000000000000940A12000410003A8 +:105A900000000000000000008000040080001100F1 +:105AA00000800580008080000000000040000000B1 +:105AB0008900A1008080800000000000000000003C +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE0000000200021000000000000000000000075 +:105AF00000000000000000000000000000000000A6 +:105B000080000000000000000000080021000000EC +:105B100000098000800080008000800080008000FC +:105B200080808000808480A180000004000000103C +:105B30000000800000218090800000000000000034 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B8000000000000000000000000000018401008F +:105B9000000000000800080002001000880010004B +:105BA000840008A010000841A005040000000000C7 +:105BB0000001000010000000048808000000000040 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000001000100000001000091 +:105C1000000000010000000000000000000000C1C2 +:105C20000005008400C1400400854004C0830000DA +:105C3000A0000000000090200089900088C10000B2 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C800000020008009000040004000400410041EC +:105C90000010092120210004000000000000000085 +:105CA000004000C00084048480850004008580C01A +:105CB00000000003000000000003008200090089CA +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE0000000000000000000000000400020004014 +:105CF00000020000000000000000000000000000A2 +:105D00000000008000800080008000030000000090 +:105D10000000202109002000084000000000008051 +:105D2000000000000000000000008000800580806E +:105D30008000000000000000000080000002808061 +:105D400080000000000000000000000000000000D3 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D800000000000002000400000000000000000B3 +:105D90000000000001C1000001000101000000A09E +:105DA00000080000000000A00000000040000840C3 +:105DB000080404000000000000000000C000100102 +:105DC000080888000000000000000000000000003B +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E200000000000000000000000070082000000E9 +:105E3000000000000012000000E00000000000214F +:105E4000000007000000000000000000000000004B +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E8000000000000000000000810000070000008A +:105E90000000000000000000000000000000000002 +:105EA0000000000000000000000000000FFF0424BC +:105EB0000C3C0C3C04DB0718000000000000000054 +:105EC0000000000009097C7C0000000000000000C8 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F0000000000000000000000000000000000424F +:105F1000004200000000000000000000000000003F +:105F200000000000000000000000000000000F0062 +:105F300004000C3C6C3C04DB04DB000000000000AF +:105F400000006666D20009090000000000000000A1 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000040246400000000000000000000000039 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000000000000000A1 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:1060200000000000000000000000662642020000A0 +:1060300000000F0E0F8F0066FFFF0004F3F7000053 +:10604000000000000000000000040000000000004C +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A0000000000000000000000000000040246428 +:1060B000000000000F0E0F8F0002FF9B080CFBFF7B +:1060C000000000000000000000000000C30000C34A +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:106110000000000000000000000000610006000D0B +:10612000000000610006001D0000000000000000EB +:10613000000000610006009D000000613006000DB7 +:10614000000000610007000900001061403E004DA2 +:10615000000100000000000000000000000000003E +:10616000000000000000000000000000000000002F +:1061700000000000000000000000000000610006B8 +:10618000000D000000000000000000000000000002 +:1061900000000000000000380000000000000000C7 +:1061A0003CFFFCFC0FFF553CAFAFFFFF00000000C1 +:1061B0000000000000000000FFFFFFFF00000000E3 +:1061C000FF00C30C000000000F0F0F0F00000000C5 +:1061D000C0C0C0C0000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:106200000000FFFFF0F000000000000000000000B0 +:10621000000000000000000000000000000000007E +:10622000000000C3C0C00F00553CBFBFAAFF000064 +:1062300000000000000000000000C0FC82BE000062 +:1062400000007D02410E000000000F0F0F0F000044 +:106250000000F0E0C0C000000000000000000000EE +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:1062800000000000F8FBF8FB000000000000000028 +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000F8FA0F0F0F0FC0 +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000F8F0D7D7D7 +:10633000D7D70000000000000000000000000000AF +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000041009000110898004000000B2 +:1063B0000000000000002000040002000110008026 +:1063C0002080000200000400000000002000000007 +:1063D000000000000000880000002000840084000D +:1063E000000000000001000020000000000020006C +:1063F000000000000000000020000000000000007D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:1064200000000000000009018400040108200000B1 +:106430000000000000000000000000000000080153 +:106440000010001000010000040000000000000027 +:106450000000000000000000000004000000000038 +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C +:1064900000000000000000000000000000000000FC +:1064A00000000000000000000080000000000080EC +:1064B00000000000000000000000000000000000DC +:1064C000000000800000000000000000000000004C +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:10651000000000000000000000000000000000007B +:10652000000000000000000000000040000000002B +:10653000002000000000000000000000000000003B +:106540000000000000400000001000880000000073 +:1065500000000000000000000000004000000000FB +:106560000000000000000000000000000000000823 :10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B +:1065800000000000000000080000000000000010F3 :1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB -:1065B00000000000000000000000000000000000DB -:1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A +:1065A0000000000000000088000000000000000063 +:1065B00000000000000000008200000008008200CF +:1065C00082000800000002000100A0100800000086 +:1065D000000000000000A000C0000000000000005B +:1065E000080008000000000000000000000000009B +:1065F0000000000000000000000000008200000019 +:106600000000000008000000000000000000000082 :10661000000000000000000000000000000000007A :10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A -:10664000000000000000000000000000000000004A -:10665000000000000000000020000000000000001A -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A +:10663000000008000000000008000000080000083A +:1066400000000800000000008000020000010000BF +:106650000000000000000300000000000000000037 +:106660000000000000000000000800000000000022 +:1066700000000000210000000000000000000000F9 +:1066800000000000000000000800080000000000FA :1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E00000000000000000000000000000000000AA +:1066A00000000800000000000300000000000000DF +:1066B00000000800A0000000000000000000000032 +:1066C00000000800000000000800000000000000BA +:1066D0000000820000000000000000000000000038 +:1066E0000000000000000000040000000000400066 :1066F000000000000000000000000000000000009A :106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 +:106710000000000000000000000008000000000071 :106720000000000000000000000000000000000069 :106730000000000000000000000000000000000059 :106740000000000000000000000000000000000049 @@ -50823,26 +54920,26 @@ :1067900000000000000000000000000000000000F9 :1067A00000000000000000000000000000000000E9 :1067B00000000000000000000000000000000000D9 -:1067C00000000000000000000000000000000000C9 -:1067D00000000000000000000000000000000000B9 -:1067E00000000000000000000000000000000000A9 +:1067C0000000A0000000A000000000000080000009 +:1067D00000000000000000080000080000000000A9 +:1067E000000000000080028001A001000000000005 :1067F0000000000000000000000000000000000099 :106800000000000000000000000000000000000088 :106810000000000000000000000000000000000078 :106820000000000000000000000000000000000068 -:106830000000000000000000000000000000000058 -:106840000000000000000000000000000000000048 -:106850000000000000000000000000000000000038 -:106860000000000000000000000000000000000028 +:1068300000000000000000080000000000000084CC +:106840000000000000000000000041000000414086 +:106850000000000000000000210000000000000017 +:1068600021000000000000208840044104000000D6 :106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 +:106880000300000000000000000000000000000005 +:1068900000000000000000000000080000000000F0 :1068A00000000000000000000000000000000000E8 -:1068B0000000000000000000004000000000000098 -:1068C00000000000000000000000000000000000C8 -:1068D00000000000000000000000000000000000B8 +:1068B000000000C000000000000000000000080010 +:1068C000000008000000002100404000000002001D +:1068D0000000080000000000004008000004001153 :1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 +:1068F0000000000008000000000000000000000090 :106900000000000000000000000000000000000087 :106910000000000000000000000000000000000077 :106920000000000000000000000000000000000067 @@ -50854,123 +54951,123 @@ :106980000000000000000000000000000000000007 :1069900000000000000000000000000000000000F7 :1069A00000000000000000000000000000000000E7 -:1069B00000000000000000000000000000000000D7 -:1069C00000000000000000000000000000000000C7 -:1069D00000000000000000000000000000000000B7 -:1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 +:1069B00000000000000000000000000002A0002015 +:1069C0000082A0C0000000000000000000000000E5 +:1069D00000000000C0888504A08804820000000038 +:1069E0000000000000000000000000004010000057 +:1069F00000889090000000000000000000000000EF :106A00000000000000000000000000000000000086 :106A10000000000000000000000000000000000076 :106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 +:106A30000000000000000000000000000000808056 :106A40000000000000000000000000000000000046 -:106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 +:106A50000000000000000080040080800080000032 +:106A60000000000000000000000000000000808026 +:106A70000000008080800000000000000000000096 :106A80000000000000000000000000000000000006 :106A900000000000000000000000000000000000F6 :106AA00000000000000000000000000000000000E6 :106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000000000000000000C6 -:106AD00000000000000000000000000000000000B6 +:106AC0000000000400008000000000000000000042 +:106AD0000000000000000000000000048080800032 :106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 +:106AF000800000008089808000000000000000000D :106B00000000000000000000000000000000000085 :106B10000000000000000000000000000000000075 :106B20000000000000000000000000000000000065 :106B30000000000000000000000000000000000055 -:106B40000000000000000000000000000000000045 -:106B50000000000000000000000000000000000035 -:106B60000000000000000000000000000000000025 -:106B70000000000000000000000000000000000015 +:106B400000002000A00100880800000000000000F4 +:106B5000000000000000000000002000A000A008CD +:106B6000C000000000000000000000000000000065 +:106B700000004000A0008489C090000000000000D8 :106B80000000000000000000000000000000000005 :106B900000000000000000000000000000000000F5 :106BA00000000000000000000000000000000000E5 :106BB00000000000000000000000000000000000D5 -:106BC00000000000000000000000000000000000C5 -:106BD00000000000000000000000000000000000B5 -:106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000000095 +:106BC0000000000000200088840004C000000000D5 +:106BD000000000000000000000000000A0080010FD +:106BE000001108C0000000000000000000000000CC +:106BF0000000000090400088829002C00000000069 :106C00000000000000000000000000000000000084 :106C10000000000000000000000000000000000074 :106C20000000000000000000000000000000000064 :106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 +:106C40000000000000000000008080008480000040 +:106C500000000000000000000000000000000089AB +:106C6000002100C08084000000000000000000003F +:106C70000000000000008080008000808000000094 :106C80000000000000000000000000000000000004 :106C900000000000000000000000000000000000F4 :106CA00000000000000000000000000000000000E4 :106CB00000000000000000000000000000000000D4 :106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 +:106CE00080040080000000000000000000000000A0 +:106CF0000000000000000000804080A000000000B4 :106D00000000000000000000000000000000000083 :106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 :106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 +:106D400000000000000000000000000004908282AB :106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 +:106D60000000C00084040490000000000000000047 +:106D700000000000000000000000C000A089828226 +:106D8000C000000000000000000000000000000043 :106D900000000000000000000000000000000000F3 :106DA00000000000000000000000000000000000E3 :106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 +:106DD00007000000000000000000000000000000AC :106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 +:106DF0000000000000000000000000000081000012 +:106E0000070000000000000000000000000000007B :106E10000000000000000000000000000000000072 :106E20000000000000000000000000000000000062 :106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 +:106E400000000000000000000000000000000A0038 +:106E50000A003C3C3C3C0000000000000000000038 +:106E6000000000000000FF05F0000A5FF5A0000030 +:106E700000000000000000000000000000001010F2 +:106E800000300000201C0000000000000000000096 :106E900000000000000000000000000000000000F2 :106EA00000000000000000000000000000000000E2 :106EB00000000000000000000000000000000000D2 :106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 +:106ED0000A0F0A0FAAAAF0F000000000000000004C +:106EE0000000000000000000FFF5F000C3C3F5A0A3 :106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 +:106F0000101000300000003C0000000000000000F5 :106F10000000000000000000000000000000000071 :106F20000000000000000000000000000000000061 :106F30000000000000000000000000000000000051 :106F40000000000000000000000000000000000041 -:106F50000000000000000000000000000000000031 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 +:106F500000000000F7F4ACACACAC00000000000096 +:106F600000000000000000000000F200F300BE146A +:106F70000A0A0000000000000000000000000000FD +:106F80000000FBFBFFFF0B040909000000000000EC :106F900000000000000000000000000000000000F1 :106FA00000000000000000000000000000000000E1 :106FB00000000000000000000000000000000000D1 :106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 +:106FD000000000000000F7F4FFFF000000000000C8 +:106FE000000000000000000000000000C300C3001B +:106FF000BE145F5F00000000000000000000000001 +:107000000000000004040000000000000000000078 :107010000000000000000000000000000000000070 :107020000000000000000000000000000000000060 :107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 +:10705000000000000000000000000590000100009A +:107060000000000000000000000000000000A0611F +:107070000006009D00050000000000000000000068 +:1070800000000000000010000038000000080000B0 :1070900000000000000000000000000000000000F0 :1070A00000000000000000000000000000000000E0 :1070B00000000000000000000000000000000000D0 :1070C00000000000000000000000000000000000C0 :1070D00000000000000000000000000000000000B0 :1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 +:1070F00000000000FF0FFF0F000000000000000074 :10710000000000000000000000000000000000007F :10711000000000000000000000000000000000006F :10712000000000000000000000000000000000005F @@ -50978,7 +55075,7 @@ :10714000000000000000000000000000000000003F :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F +:1071700000000000000000C30055000000000000F7 :1071800000000000000000000000000000000000FF :1071900000000000000000000000000000000000EF :1071A00000000000000000000000000000000000DF @@ -51001,15 +55098,15 @@ :1072B00000000000000000000000000000000000CE :1072C00000000000000000000000000000000000BE :1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E +:1072E000000000000000000000000000000020007E :1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D +:10730000000000000000000000000000000020005D :10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D :10733000000000000000000000000000000000004D :10734000000000000000000000000000000000003D :10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D +:107360000000000000000000000000000400000019 :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED @@ -51025,25 +55122,25 @@ :10743000000000000000000000000000000000004C :10744000000000000000000000000000000000003C :10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C +:107460000000000000000000000800000000000014 :10747000000000000000000000000000000000000C -:1074800000000000000400000000000000000000F8 +:107480000000000000000000001000840000000068 :1074900000000000000000000000000000000000EC -:1074A00000000000000400000000000002000000D6 -:1074B00000000000000000000000000000000000CC -:1074C0000000000000000004000000000000200098 -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000020007C +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000080000C4 +:1074C00000000000000000000000000000000000BC +:1074D000000000000000000000000000001000009C +:1074E000000000000000000000000000000000009C :1074F000000000000000000000000000000000008C -:1075000000000000000000000090000000000000EB -:10751000000000000000000000000000000000006B +:107500000000000000000800000000000000000073 +:107510000000000000000000000000000008000063 :10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B +:107530000000000000000000080000000000000043 :10754000000000000000000000000000000000003B :10755000000000000000000000000000000000002B -:10756000000000000000000000000090000000008B -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB +:10756000000000000000000000000000000000001B +:107570000000000000000000000008000000000003 +:1075800000000000000000000000000000100000EB :1075900000000000000000000000000000000000EB :1075A00000000000000000000000000000000000DB :1075B00000000000000000000000000000000000CB @@ -51052,13 +55149,13 @@ :1075E000000000000000000000000000000000009B :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A -:107610000000020000000000000000000000000068 +:10761000000000000000000000000000000000006A :10762000000000000000000000000000000000005A -:107630000000020000000000000000000000000048 +:10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A -:107650000200000000000000000000000000000028 +:10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A -:107670000200000000000000000000000000000008 +:10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA :1076A00000000000000000000000000000000000DA @@ -51074,8 +55171,8 @@ :107740000000000000000000000000000000000039 :107750000000000000000000000000000000000029 :107760000000000000000000000000000000000019 -:107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 +:1077700000000000080000080000000000000000F9 +:1077800000000000000000000000000000002100D8 :1077900000000000000000000000000000000000E9 :1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 @@ -51083,7 +55180,7 @@ :1077D00000000000000000000000000000000000A9 :1077E0000000000000000000000000000000000099 :1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 +:107800000000000000000000080000000000000070 :107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 :107830000000000000000000000000000000000048 @@ -51244,4103 +55341,6 @@ :1081E000000000000000000000000000000000008F :1081F000000000000000000000000000000000007F :10820000000000000000000000000000000000006E -:10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE -:1082800000000000000000000000000000000000EE -:1082900000000000000000000000000000000000DE -:1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E -:1082E000000000000000000000000000000000008E -:1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:10831000000000000000000000000000000000005D -:10832000000000000000000000000000000000004D -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D -:1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED -:1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D -:1083E000000000000000000000000000000000008D -:1083F000000000000000000000000000000000007D -:10840000000000000000000000000000000000006C -:10841000000000000000000000000000000000005C -:10842000000000000000000000000000000000004C -:10843000000000000000000000000000000000003C -:1084400000000000000000008800000000000000A4 -:1084500000000000000000000000000000004000DC -:108460000000C0000000000020000000000000002C -:1084700000000000000000000000000000000000FC -:1084800000000000000000000000200000000000CC -:1084900000000000000000000000000000000000DC -:1084A000000000000000820000002000000000002A -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000000AC -:1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C -:1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B -:10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000000FB -:1085800000000000000000000000000000000000EB -:1085900000000000000000000000000000000000DB -:1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B -:10860000000000000000000000000000000000006A -:10861000000000000000000000000000000000005A -:10862000000000000000000000000000000000004A -:108630000000020000000000000000000000000038 -:10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A -:1086700000000000000000000000000000000000FA -:1086800000000000000000000000000000000000EA -:1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A -:1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000000069 -:108710000000000000000000000000000000000059 -:108720000000000000000000000000000000000049 -:108730000000000000000000000000000000000039 -:1087400000000000820000000000000000000000A7 -:108750000000000000000000000000000000000019 -:108760000000000000000000000000000000000009 -:1087700000000000000000000000000000000000F9 -:1087800000000000000000000000000000000000E9 -:1087900000000000000000000000000000000000D9 -:1087A00000000000000000000000000000000000C9 -:1087B00000000000000000000000000000000000B9 -:1087C0000000000000000000000008000300080096 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000001000000079 -:1087F0000500000000000000000000000000000074 -:108800000000000000000000000000001000080050 -:108810000000080000000000000000000000000050 -:108820000000000000000000000000000000000048 -:1088300000000000000000000000004000000000F8 -:108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000000000E8 -:1088900000000000000000000000000000000000D8 -:1088A00000000000000000000000000000000000C8 -:1088B00000000000000000000000000000000000B8 -:1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000000000000000000098 -:1088E0000000000000000000000000000000000088 -:1088F0000000000000000000000000000000000078 -:108900000000000000000000000000000000000067 -:108910000000000000000000000000000000000057 -:108920000000000000000000000000000000000047 -:108930000000000000000000000000000000000037 -:108940000000000000000000000000000000000027 -:108950000000000000000000000000000000000017 -:108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000000F7 -:1089800000000000000000000000000000000000E7 -:1089900000000000000000000000000000000000D7 -:1089A00000000000000000000000000000000000C7 -:1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000030094 -:1089E0000000000000000000000000000000000087 -:1089F000000000000000000000000000000008006F -:108A00000000000000000000000000000000000066 -:108A10000000000000000000000000000000000056 -:108A2000080000000000000000000000000000003E -:108A30000000000000000000000000002000000016 -:108A4000080000000000000000000000000000001E -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 -:108A700000000000000000000000000000000000F6 -:108A800000000000000000000000000000000000E6 -:108A900000000000000000000000000000000000D6 -:108AA00000000000000000000000000000000000C6 -:108AB00000000000000000000000000000000000B6 -:108AC00000000000000000000000000000000000A6 -:108AD0000000000000000000000000000000000096 -:108AE0000000000000000000000000000000000086 -:108AF0000000000000000000000000000000000076 -:108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B20000000000000000000000000000000000045 -:108B30000000000000000000000000000000000035 -:108B40000000000000000000000000000000000025 -:108B50000000000000000000000000000000000015 -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B800000000000000000000000000000000000E5 -:108B900000000000000000000000000000000000D5 -:108BA00000000000000000000000000000000000C5 -:108BB00000000000000000000000000000000000B5 -:108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000000000000000075 -:108C00000000000000000000000000000000000064 -:108C10000000000000000000000000000000000054 -:108C20000000000000000000000000000000000044 -:108C30000000000000000000000000000000000034 -:108C40000000000000000000000000000000000024 -:108C50000000000000000000000000000000000014 -:108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 -:108CC00000000000000000000000000000000000A4 -:108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 -:108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000000000053 -:108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000000E3 -:108D900000000000000000000000000000000000D3 -:108DA00000000000000000000000000000000000C3 -:108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE0000000000000000000000000000000000083 -:108DF0000000000000000000000000000000000073 -:108E00000000000000000000000000000000000062 -:108E10000000000000000000000000000000000052 -:108E20000000000000000000000000000000000042 -:108E30000000000000000000000000000000000032 -:108E40000000000000000000000000000000000022 -:108E50000000000000000000000000000000000012 -:108E60000000000000000000000000000000000002 -:108E700000000000000000000000000000000000F2 -:108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 -:108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F900000000000000000000000000000000000D1 -:108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 -:108FF0000000000000000000000000000000000071 -:109000000000000000000000000000000000000060 -:109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 -:109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:10913000000000000000000000000000000000002F -:10914000000000000000000000000000000000001F -:10915000000000000000000000000000000000000F -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF -:1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000000000000AF -:1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000000000008F -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E -:10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E -:1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD -:109370000000020000008800000020002000000023 -:109380008400000020000000200000000000000415 -:1093900000000200000000000000200000000000AB -:1093A00020008400200000002000000000000004D5 -:1093B00000030000020000000400000020008800FC -:1093C000000000000000000000000000000000009D -:1093D0000004000004000000200000002000200025 -:1093E000000000000000000000008800880000006D -:1093F00000800000000000000000000000000000ED -:1094000000000090000000000000000000000000CC -:109410000003000000000000000000000000000049 -:10942000000000000000000000000000000000003C -:109430000003000000000000000000000000000029 -:10944000000000000000000000000000000000001C -:109450000000000300000000000000000000000009 -:10946000000000000082000000000000000000007A -:1094700000000004000000000000000000000000E8 -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C -:1094D000000000000000000002000000000000008A -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000000000003B -:10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000A000000000003B -:1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB -:1095C000000000000000000000000000000000009B -:1095D000000000000000000000000000000000008B -:1095E00000000000000000000000000084000000F7 -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:109620000800000000000000000000000000000032 -:10963000000000000000000000000000000000002A -:10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000800E2 -:1096800082008200A0000000000000000000000036 -:1096900082000000A00000000000000000000800A0 -:1096A000820004000000000008000000000000002C -:1096B00082000000000000008200000000000000A6 -:1096C000080082000400A00000000000000000006C -:1096D0000000820000000800A00000000000000060 -:1096E00008008200080082008200000000000000E4 -:1096F00000008200000082008200000000000000E4 -:109700001000000000000000000000000000000049 -:109710000000080000000800000000000000000039 -:109720000000000000000000000000000000080031 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:1097500008000000080000000000000000000000F9 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000080008000000C9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000080008000000A9 -:1097B00000000000000000000000000000000000A9 -:1097C000000000000000000000000000080082000F -:1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000800080069 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 -:109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:1098800000000000A0001000000000000000A00088 -:109890000000000040000000000000000000000088 -:1098A0000000000000000000000000008200000036 -:1098B00000000000000000000000000008000000A0 -:1098C000000000000000A0000000000000000000F8 -:1098D0000000000000000000080000000000000080 -:1098E0000000000000000000000000000000000078 -:1098F00082000000000000000000000000000000E6 -:109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 -:109940000000000000000000000000000000000017 -:109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 -:1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000000D7 -:1099900001000000000000000000010000C0000005 -:1099A00000000000000000000000000000000000B7 -:1099B00001000000000000000000010000C00000E5 -:1099C0000000000000000000000000000000000097 -:1099D000000001000000000000000000010000C0C5 -:1099E0000000000000000000000000000000000077 -:1099F000000001000000000000000000000000C0A6 -:109A00000000000000000000000000000000000056 -:109A10000000410000000000000000030200008080 -:109A20000000000000000000000000000000000036 -:109A30000000410000000000000000030200008060 -:109A40000000000000000000000000000000000016 -:109A500000000000410000000000000000030200C0 -:109A60000080000000000000000000000000000076 -:109A7000000000004100000000000000000305009D -:109A80000080000000000000000000000000030053 -:109A90000000008000008000000000000200208024 -:109AA0000000000000000000000000410000030072 -:109AB0000000008000008000000000000500200081 -:109AC0000000000000000000000000410000000055 -:109AD0000300000000800000800000000000020081 -:109AE0002000000000000000000000000041000015 -:109AF0000300000000800000800000000000200043 -:109B000020000000000000000000000000410000F4 -:109B10000100000000C00000200000000000210043 -:109B200041040082400040000000000000010000ED -:109B30000100000000C00000200000000000200024 -:109B400041200020820020000000000000010000F1 -:109B500000000100000000C0000020000000000024 -:109B60002100410800888200400000000000000140 -:109B700000000100000000C0000020000000000004 -:109B8000040041200020A00040000000000000016F -:109B900000000000C0000000000000000000000005 -:109BA00000080000000000000000000000000000AD -:109BB00000000000C00000000000000000000000E5 -:109BC000000800000000000000000000000000008D -:109BD000000000000000C0000000000000000000C5 -:109BE0000000001000000000000000000000000065 -:109BF000000000000000C0000000000000000000A5 -:109C00000000001000000000000000000000000044 -:109C100000000000000080000000000000000000C4 -:109C20000000000000000000000000000000000034 -:109C300000000000000080000000000000000000A4 -:109C40000000000000000000000000000000000014 -:109C50000000000000000000800000000000000084 -:109C600000000000000000000000000000000000F4 -:109C70000000000000000000800000000000000064 -:109C800000000000000000000000000000000000D4 -:109C9000000000000000800000C100000000000083 -:109CA0000000000000C100000020000000000000D3 -:109CB000000000000000800000C100000000000063 -:109CC0000000000000C10000004000000000000093 -:109CD0000000000000000000800000C10000000043 -:109CE00000000000000000C1000000400000000073 -:109CF0000000000000000000800000C10000000023 -:109D000000000000000000C1000000400000000052 -:109D10000000000000000000400000C10000000042 -:109D200000000000000000034000000000000000F0 -:109D30000000000000000000400000C10000000022 -:109D400000000000000000034000000000000000D0 -:109D500000000000000000000000400000C1000002 -:109D600000000000000000000003400000000000B0 -:109D700000000000000000000000400000C10000E2 -:109D80000000000000000000000340000000000090 -:109D90000000000000000000000000000000004281 -:109DA0000000000000004800810000E000004800C2 -:109DB000000000000000004200000000000000421F -:109DC0000000000000004800810000E000004800A2 -:109DD0000000000000000042000000000000000041 -:109DE00000420000000000004800810000E0000088 -:109DF00048000000000000000042000000000000D9 -:109E000000420000000000004800810000E0000067 -:109E100048000000000000000042000000000000B8 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 -:109E40000000000000000000000000000000000012 -:109E50000000000000000000000000000000000002 -:109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 -:109EC0000000000000000000000000000000000092 -:109ED0000000000000000000000000000000000082 -:109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 -:109F10000000000000000000000000000000747B52 -:109F20000000000000000000000000000000000031 -:109F3000000000000000000000000000DE2E747B26 -:109F40000000000000000000000000000000000011 -:109F5000000000000000000000000000DE2E0000F5 -:109F6000747B000000000000000000000000000002 -:109F70000000000000000000000000000000DE2ED5 -:109F8000747B0000000000000000000000000000E2 -:109F90000000000000000000000000000000DE2EB5 -:109FA000615603400000000000000231E0000000A4 -:109FB000000000000C4000000000000002C06A86A3 -:109FC000615603400000000000000231E000000084 -:109FD000000000000C4000000000000002C06A8683 -:109FE0000000615603400000000000000231E00064 -:109FF0000000000000000C4000000000000002C053 -:10A000006A86615603400000000000000231E00053 -:10A010000000000000000C4000000000000002C032 -:10A020006A8600000000000000002000840000009C -:10A030000000000000000000000000000000000020 -:10A0400000000000000000000000200000000000F0 -:10A050000000000000000000000000000000000000 -:10A0600000000000000000000000000000000000F0 -:10A0700000000000000000000000000000000000E0 -:10A080000000000000000000000000008800C00088 -:10A090008800000000000000000000000000A00098 -:10A0A00000000000000000000000000000000000B0 -:10A0B000000000000000000000000000000002009E -:10A0C0000000000000000000000000000000000090 -:10A0D000000000000000000000000000050000007B -:10A0E0000000000000000000000000000000000070 -:10A0F0000000000000000000000000000000000060 -:10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A1500000000000000000000000000000000000FF -:10A1600000000000000000000000000000000000EF -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000002000000000000000000000000008D -:10A1D000000000000000000000000000000000007F -:10A1E000000000000000000000000000000000006F -:10A1F000000000000000000000000000000000005F -:10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE -:10A2B0000000000008000000000021000000000075 -:10A2C000000000000000000000000000000000008E -:10A2D0000000000008000800030000000300000068 -:10A2E000000000000000000000000000000000006E -:10A2F0000000000000000800000000000000000056 -:10A300000000000000000004000000000000000049 -:10A310000000000000000300050003000000000032 -:10A320000000000000000004000000000000000029 -:10A33000000000000000000000000000000000001D -:10A34000000000000000000000004000000040008D -:10A3500000000000000000000000000000000000FD -:10A3600000000000000000000000000000000000ED -:10A3700000000000000000000000000000000000DD -:10A38000000000000000000040000000400000004D -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D -:10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC -:10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000000000000000006C -:10A4F000000000000000000000000000000000005C -:10A5000000000000000000000000008400000000C7 -:10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000C00000005B -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000000000FB -:10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000000000000000DB -:10A5800000000000000000000000000000000000CB -:10A5900000000000000200000000000000000000B9 -:10A5A00000000000000000000000000000000000AB -:10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E000000000000000000000000000000000006B -:10A5F000000000000000000000000000000000005B -:10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000000FA -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F0000000000000000000000000000000000058 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 -:10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC30000000000000000000000000000000000014 -:10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000000000000000000013 -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000000000000A2 -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000200000000000000000000000000031 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F0000000000000000000000008000000000047 -:10B20000000000000000000000000000000000003E -:10B210000000000000000000000008000000000026 -:10B22000000000000000000000000000000000001E -:10B2300000000000000000000000000040000000CE -:10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000010006E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000000000000000000000006B -:10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 -:10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 -:10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000000000000022 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000004000000000000000000ED -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF70000000000000000000400000000000000081 -:10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C0200000000000000000000000200000000000F0 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000020000000B0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C18000100000000000000000000000000000009F -:10C19000000000000000000000000000000000009F -:10C1A0000800000000000000000000000000000087 -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 -:10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000400000000AD -:10CF800000000000000000000000000000000000A1 -:10CF9000000000000000000000000004000000008D -:10CFA0000000000000000000000000000000000081 -:10CFB000400000000000000000000000000400002D -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000200000000000000000000000000DE -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000000000000090 -:10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000010000000000000000000DF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE -:10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E -:10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000000000000FD -:10D3300000000000000000000000000000000000ED -:10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D -:10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC -:10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA -:10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D69000000000000000000000000000000000008A -:10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000000000005A -:10D6D000000000000000000000000000000000004A -:10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 -:10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 -:10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 -:10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 -:10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 -:10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000000037 -:10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 -:10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 -:10DA600000000000000000000000000000000000B6 -:10DA700000000000000000000000000000000000A6 -:10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 -:10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 -:10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000000000000085 -:10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 -:10DBD0000000000000000000000000000000000045 -:10DBE0000000000000000000000000000000000035 -:10DBF0000000000000000000000000000000000025 -:10DC00000000000000000000000000000000000014 -:10DC10000000000000000000000000000000000004 -:10DC200000000000000000000000000000000000F4 -:10DC300000000000000000000000000000000000E4 -:10DC400000000000000000000000000000000000D4 -:10DC500000000000000000000000000000000000C4 -:10DC600000000000000000000000000000000000B4 -:10DC700000000000000000000000000000000000A4 -:10DC80000000000000000000000000000000000094 -:10DC90000000000000000000000000000000000084 -:10DCA0000000000000000000000000000000000074 -:10DCB0000000000000000000000000000000000064 -:10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 -:10DCE0000000000000000000000000000000000034 -:10DCF0000000000000000000000000000000000024 -:10DD00000000000000000000000000000000000013 -:10DD10000000000000000000000000000000000003 -:10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000000000000C3 -:10DD600000000000000000000000000000000000B3 -:10DD700000000000000000000000000000000000A3 -:10DD80000000000000000000000000000000000093 -:10DD90000000000000000000000000000000000083 -:10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000000000000053 -:10DDD0000000000000000000000000000000000043 -:10DDE0000000000000000000000000000000000033 -:10DDF0000000000000000000000000000000000023 -:10DE00000000000000000000000000000000000012 -:10DE100000000000000000000000000000040000FE -:10DE200000020000000000000000000000000000F0 -:10DE300000000000000000000000000000000000E2 -:10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000000000000B2 -:10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000000000092 -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 -:10DED0000000000000000000000000000000000042 -:10DEE00000000000400000000000000000000000F2 -:10DEF0000000000000000000000000000000000022 -:10DF00000000000000000000000000000000000011 -:10DF10000000000000000000000000000000000001 -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000000000000E1 -:10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000000000000C1 -:10DF600000000000000000000000000000000000B1 -:10DF700000000000000000000000000000000000A1 -:10DF80000000000000000000000000000000000091 -:10DF90000000000000000000000000000008000079 -:10DFA0000004000000000008000000000000000065 -:10DFB000000000000000000000000000000200005F -:10DFC000000000000000000200000000000000004F -:10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000000000000031 -:10DFF0000000000000000000000000000000000021 -:10E000000000000000000000000000000000000010 -:10E010000000000000000000000000000000000000 -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 -:10E0400000000000000000000000000000000000D0 -:10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 -:10E0700000000000000000000000000000000000A0 -:10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000000000060 -:10E0C0000000000000000000000000000000000050 -:10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 -:10E0F0000000000000000000000000000000000020 -:10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000000000FF -:10E1200000000000000000000000000000000000EF -:10E1300000000000000000000000000000000000DF -:10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000000BF -:10E1600000000000000000000000000000000000AF -:10E17000000000000000000000000000000000009F -:10E18000000000000000000000000000000000008F -:10E19000000000000000000000000000000000007F -:10E1A000000000000000000000000000000000006F -:10E1B000000000000000000000000000000000005F -:10E1C000000000000000000000000000000000004F -:10E1D000000000000000000000000000000000003F -:10E1E000000000000000000000000000000000002F -:10E1F000000000000000000000000000000000001F -:10E20000000000000000000000000000000000000E -:10E2100000000000000000000000000000000000FE -:10E2200000000000000000000000000000000000EE -:10E2300000000000000000000000000000000000DE -:10E2400000000000000000000000000000000000CE -:10E2500000000000000000000000000000000000BE -:10E2600000000000000000000000000000000000AE -:10E27000000000000000000000000000000000009E -:10E28000000000000000000000000000000000008E -:10E29000000000000000000000000000000000007E -:10E2A000000000000000000000000000000000006E -:10E2B000000000000000000000000000000000005E -:10E2C000000000000000000000000000000000004E -:10E2D000000000000000000000000000000000003E -:10E2E000000000000000000000000000000000002E -:10E2F000000000000000000000000000000000001E -:10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD -:10E3200000000000000000000000000000000000ED -:10E3300000000000000000000000000000000000DD -:10E3400000000000000000000000000000000000CD -:10E3500000000000000000000000000000000000BD -:10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D -:10E3A000000000000000000000000000000000006D -:10E3B000000000000000000000000000000000005D -:10E3C000000000000000000000000000000000004D -:10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000001D -:10E40000000000000000000000000000000000000C -:10E4100000000000000000000000000000000000FC -:10E4200000000000000000000000000000000000EC -:10E4300000000000000000000000000000000000DC -:10E4400000000000000000000000000000000000CC -:10E4500000000000000000000000000000000000BC -:10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C -:10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C -:10E4C000000000000000000000000000000000004C -:10E4D000000000000000000000000000000000003C -:10E4E000000000000000000000000000000000002C -:10E4F000000000000000000000000000000000001C -:10E50000000000000000000000000000000000000B -:10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000000000000CB -:10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C000000000000000000000000000000000004B -:10E5D000000000000000000000000000000000003B -:10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A -:10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000000000EA -:10E6300000000000000000000000000000000000DA -:10E6400000000000000000000000000000000000CA -:10E6500000000000000000000000000000000000BA -:10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000000000000009A -:10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A -:10E6A000000000000000000000000000000000006A -:10E6B000000000000000000000000000000000005A -:10E6C000000000000000000000000000000000004A -:10E6D000000000000000000000000000000000003A -:10E6E000000000000000000000000000000000002A -:10E6F000000000000000000000000000000000001A -:10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000000F9 -:10E7200000000000000000000000000000000000E9 -:10E7300000000000000000000000000000000000D9 -:10E7400000000000000000000000000000000000C9 -:10E7500000000000000000000000000000000000B9 -:10E7600000000000000000000000000000000000A9 -:10E770000000000000000000000000000000000099 -:10E780000000000000000000000000000000000089 -:10E790000000000000000000000000000000000079 -:10E7A0000000000000000000000000000000000069 -:10E7B0000000000000000000000000000000000059 -:10E7C0000000000000000000000000000000000049 -:10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000000000000000000000029 -:10E7F0000000000000000000000000000000000019 -:10E800000000000000000000000000000000000008 -:10E8100000000000000000000000000000000000F8 -:10E8200000000000000000000000000000000000E8 -:10E8300000000000000000000000000000000000D8 -:10E8400000000000000000000000000000000000C8 -:10E8500000000000000000000000000000000000B8 -:10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 -:10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000000000078 -:10E8A0000000000000000000000000000000000068 -:10E8B0000000000000000000000000000000000058 -:10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 -:10E9200000000000000000000000000000000000E7 -:10E9300000000000000000000000000000000000D7 -:10E9400000000000000000000000000000000000C7 -:10E9500000000000000000000000000000000000B7 -:10E9600000000000000000000000000000000000A7 -:10E970000000000000000000000000000000000097 -:10E980000000000000000000000000000000000087 -:10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000000000000000067 -:10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000000000000000047 -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 -:10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 -:10EA200000000000000000000000000000000000E6 -:10EA300000000000000000000000000000000000D6 -:10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000000000B6 -:10EA600000000000000000000000000000000000A6 -:10EA70000000000000000000000000000000000096 -:10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000000076 -:10EAA0000000000000000000000000000000000066 -:10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000000000000026 -:10EAF0000000000000000000000000000000000016 -:10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 -:10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000000000D5 -:10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000075 -:10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000000045 -:10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 -:10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 -:10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000000000000000D4 -:10EC400000000000000000000000000000000000C4 -:10EC500000000000000000000000000000000000B4 -:10EC600000000000000000000000000000000000A4 -:10EC70000000000000000000000000000000000094 -:10EC80000000000000000000000000000000000084 -:10EC90000000000000000000000000000000000074 -:10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 -:10ECC0000000000000000000000000000000000044 -:10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000000000024 -:10ECF0000000000000000000000000000000000014 -:10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 -:10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000000083 -:10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000000000000053 -:10EDC0000000000000000000000000000000000043 -:10EDD0000000000000000000000000000000000033 -:10EDE000000000040000000000000000000000001F -:10EDF0000000000000000000000000000000000013 -:10EE000000000004000000000000000000000000FE -:10EE100000000000000000000000000000000000F2 -:10EE200000000000000400000000000000000000DE -:10EE300000000000000000000000000000000000D2 -:10EE400000000000000400000000000000000000BE -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 -:10EE70000000000000000000000000000000000092 -:10EE80000000000000000000000000000000000082 -:10EE90000000000000000000000040000000000032 -:10EEA0000000000000000000000000000000000062 -:10EEB0000000000000000000000000000000000052 -:10EEC0000000000000000000000000000000000042 -:10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000000000000012 -:10EF00000000000000000000000000000000000001 -:10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000000000000000000E1 -:10EF300000000000000000000000000000000000D1 -:10EF400000000000000000000000000000000000C1 -:10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 -:10EF70000000000000000000000000000000000091 -:10EF80000000000000000000000000000000000081 -:10EF90000000000000000000000000000000000071 -:10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC0000000000000000000000000000000000041 -:10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 -:10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000000000000000D0 -:10F0400000000000000000000000000000000000C0 -:10F0500000000000000000000000000000000000B0 -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F090000000000000000000000000000000000070 -:10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000000050 -:10F0C0000000000000000000000000000000000040 -:10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000000FF -:10F1100000000000000000000000000000000000EF -:10F1200000000000000000000000000000000000DF -:10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF -:10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F -:10F19000000000000000000000000000000000006F -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F2000000000000000000000000000000000000FE -:10F2100000000000000000000000000000000000EE -:10F2200000000000000000000000000000000000DE -:10F2300000000000000000000000000000000000CE -:10F2400000000000000000000000000000000000BE -:10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E -:10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000000005E -:10F2B000000000000000000000000000000000004E -:10F2C000000000000000000000000000000000003E -:10F2D000000000000000000000000000000000002E -:10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F3000000000000000000000000000000000000FD -:10F3100000000000000000000000000000000000ED -:10F3200000000000000000000000000000000000DD -:10F3300000000000000000000000000000000000CD -:10F3400000000000000000000000000000000000BD -:10F3500000000000000000000000000000000000AD -:10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D -:10F38000000000000000000000000000000000007D -:10F39000000000000000000000000000000000006D -:10F3A000000000000000000000000000000000005D -:10F3B000000000000000000000000000000000004D -:10F3C000000000000000000000000000000000003D -:10F3D000000000000000000000000000000000002D -:10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D -:10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC -:10F4200000000000000000000000000000000000DC -:10F4300000000000000000000000000000000000CC -:10F4400000000000000000000000000000000000BC -:10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000000007C -:10F49000000000000000000000000000000000006C -:10F4A000000000000000000000000000000000005C -:10F4B000000000000000000000000000000000004C -:10F4C000000000000000000000000000000000003C -:10F4D000000000000000000000000000000000002C -:10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB -:10F5100000000000000000000000000000000000EB -:10F5200000000000000000000000000000000000DB -:10F5300000000000000000000000000000000000CB -:10F5400000000000000000000000000000000000BB -:10F5500000000000000000000000000000000000AB -:10F56000000000000000000000000000000000009B -:10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000007B -:10F59000000000000000000000000000000000006B -:10F5A000000000000000000000000000000000005B -:10F5B000000000000000000000000000000000004B -:10F5C000000000000000000000000000000000003B -:10F5D000000000000000000000000000000000002B -:10F5E000000000000000000000000000000000001B -:10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA -:10F6100000000000000000000000000000000000EA -:10F6200000000000000000000000000000000000DA -:10F6300000000000000000000000000000000000CA -:10F6400000000000000000000000000000000000BA -:10F6500000000000000000000000000000000000AA -:10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A -:10F69000000000000000000000000000000000006A -:10F6A000000000000000000000000000000000005A -:10F6B000000000000000000000000000000000004A -:10F6C000000000000000000000000000000000003A -:10F6D000000000000000000000000000000000002A -:10F6E000000000000000000000000000000000001A -:10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 -:10F7100000000000000000000000000000000000E9 -:10F7200000000000000000000000000000000000D9 -:10F7300000000000000000000000000000000000C9 -:10F7400000000000000000000000000000000000B9 -:10F7500000000000000000000000000000000000A9 -:10F760000000000000000000000000000000000099 -:10F770000000000000000000000000000000000089 -:10F780000000000000000000000000000000000079 -:10F790000000000000000000000000000000000069 -:10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000000000000000000000049 -:10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 -:10F7E0000000000000000000000000000000000019 -:10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 -:10F8200000000000000000000000000000000000D8 -:10F8300000000000000000000000000000000000C8 -:10F8400000000000000000000000000000000000B8 -:10F8500000000000000000000000000000000000A8 -:10F860000000000000000000000000000000000098 -:10F870000000000000000000000000000000000088 -:10F880000000000000000000000000000000000078 -:10F890000000000000000000000000000000000068 -:10F8A0000000000000000000000000000000000058 -:10F8B0000000000000000000000000000000000048 -:10F8C0000000000000000000000000000000000038 -:10F8D0000000000000000000000000000000000028 -:10F8E0000000000000000000000000000000000018 -:10F8F0000000000000000000000000000000000008 -:10F9000000000000000000000000000000000000F7 -:10F9100000000000000000000000000000000000E7 -:10F9200000000000000000000000000000000000D7 -:10F9300000000000000000000000000000000000C7 -:10F9400000000000000000000000000000000000B7 -:10F9500000000000000000000000000000000000A7 -:10F960000000000000000000000000000000000097 -:10F970000000000000000000000000000000000087 -:10F980000000000000000000000000000000000077 -:10F990000000000000000000000000000000000067 -:10F9A0000000000000000000000000000000000057 -:10F9B0000000000000000000000000000000000047 -:10F9C0000000000000000000000000000000000037 -:10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000000000000000017 -:10F9F0000000000000000000000000000000000007 -:10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 -:10FA200000000000000000000000000000000000D6 -:10FA300000000000000000000000000000000000C6 -:10FA400000000000000000000000000000000000B6 -:10FA500000000000000000000000000000000000A6 -:10FA60000000000000000000000000000000000096 -:10FA70000000000000000000000000000000000086 -:10FA80000000000000000000000000000000000076 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000000000000000000000000000056 -:10FAB0000000000000000000000000000000000046 -:10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000000026 -:10FAE0000000000000000000000000000000000016 -:10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB200000000000000000000000000000000000D5 -:10FB300000000000000000000000000000000000C5 -:10FB400000000000000000000000000000000000B5 -:10FB500000000000000000000000000000000000A5 -:10FB60000000000000000000000000000000000095 -:10FB70000000000000000000000000000000000085 -:10FB80000000000000000000000000000000000075 -:10FB90000000000000000000000000000000000065 -:10FBA0000000000000000000000000000000000055 -:10FBB0000000000000000000000000000000000045 -:10FBC0000000000000000000000000000000000035 -:10FBD0000000000000000000000000000000000025 -:10FBE0000000000000000000000000000000000015 -:10FBF0000000000000000000000000000000000005 -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 -:10FC200000000000000000000000000000000000D4 -:10FC300000000000000000000000000000000000C4 -:10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000000000000000A4 -:10FC60000000000000000000000000000000000094 -:10FC70000000000000000000000000000000000084 -:10FC80000000000000000000000000000000000074 -:10FC90000000000000000000000000000000000064 -:10FCA0000000000000000000000000000000000054 -:10FCB0000000000000000000000000000000000044 -:10FCC0000000000000000000000000000000000034 -:10FCD0000000000000000000000000000000000024 -:10FCE0000000000000000000000000000000000014 -:10FCF0000000000000000000000000000000000004 -:10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000400040000000000000000CB -:10FD300000000000000000000000000000000000C3 -:10FD400000000000000000000000000000000000B3 -:10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000000000000000000093 -:10FD70000000000000000000000000000000000083 -:10FD80000000000000000000000000000000000073 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000000000000043 -:10FDC00000000000000000000000000040000000F3 -:10FDD0000000000000000000000000000000000023 -:10FDE0000000000000000000000000000000000013 -:10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000000000000000F2 -:10FE100000000000000000000000000000000200E0 -:10FE200000000000000000000000000000000000D2 -:10FE300000000000000000000000000000000000C2 -:10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 -:10FE60000200000000000000000000000000000090 -:10FE70000000000000000000000000000000000082 -:10FE80000000000000000000000000000000000072 -:10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000200000000000050 -:10FEB0000000000000000000000000000000000042 -:10FEC0000000000000000000000000000000000032 -:10FED0000000000000000000000000000000000022 -:10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 -:10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000000000000000E1 -:10FF200000000000000000000000000000000000D1 -:10FF300000000000000000000000000000000000C1 -:10FF400000000000000000000000000000000000B1 -:10FF500000000000000000000000000000000000A1 -:10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 -:10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000000000000000000051 -:10FFB0000000000000000000000000000000000041 -:10FFC0000000000000000000000000000000000031 -:10FFD0000000000000000000000000000000000021 -:10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 -:02000004000DED -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000000000000A0 -:100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 -:1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F -:1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E -:1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED -:1003100000000000000000000000000000000000DD -:1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD -:1003400000000000000000000000000000000000AD -:10035000000000000000000000000000000000009D -:10036000000000000000000000000000000000008D -:10037000000000000000000000000000000000007D -:10038000000000000000000000000000000000006D -:10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D -:1003F00000000000000000000000000000000000FD -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC -:1004400000000000000000000000000000000000AC -:10045000000000000000000000000000000000009C -:10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C -:10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B000000000000000000000000000000000003C -:1004C000000000000000000000000000000000002C -:1004D000000000000000000000000000000000001C -:1004E000000000000000000000000000000000000C -:1004F00000000000000000000000000000000000FC -:1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000000AB -:10055000000000000000000000000000000000009B -:10056000000000000000000000000000000000008B -:10057000000000000000000000000000000000007B -:10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B -:1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA -:1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A -:10066000000000000000000000000000000000008A -:10067000000000000000000000000000000000007A -:10068000000000000000000000000000000000006A -:10069000000000000000000000000000000000005A -:1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000000000000000000000000FA -:1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:100780000000000000000000000000000000000069 -:100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 -:1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000000000000F9 -:1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000000000D8 -:1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 -:100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 -:100990000000000000000000000000000000000057 -:1009A0000000000000000000000000000000000047 -:1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000000000000000017 -:1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 -:100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000004000000 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000040000DF -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000004BF -:100D300000000000000000000000000000000000B3 -:100D4000000000000000000000000000000000049F -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000400000000000000000000000000023 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000000000C2 -:100E300000000000000002000000000000000000B0 -:100E400000000000000000000000000000000000A2 -:100E5000000000000002000000000000000000028E -:100E6000000000000000000000000000000000047E -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF -:1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F -:1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000000BE -:1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E -:1012B000000000000000000000000000000000002E -:1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E -:1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C -:1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB -:1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A -:10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B000000000000000000000000000000000002A -:1016C000000000000000000000000000000000001A -:1016D000000000000000000000000000000000000A -:1016E00000000000000000000000000000000000FA -:1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 -:101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 -:101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000040000000000000000000000000000C0 -:101C200000000000000000000000000000000002B2 -:101C300000020000000000000000000000000000A2 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000002000000000000000042 -:101CA0000000000000000000000000000002000032 -:101CB00000000000000040020000000000000000E2 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D9000000200020004000000000000000000003B -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE -:1022100000000000000000000000000000000000BE -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E -:10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD -:10233000000000000000000000000000000000009D -:10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D -:10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D -:1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD -:1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000000CC -:1024100000000000000000000000000000000000BC -:1024200000000000000000000000000000000000AC -:10243000000000000000000000000000000000009C -:10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C -:10247000000000000000000000000000000000005C -:10248000000000000000000000000000000000004C -:10249000000000000000000000000000000000003C -:1024A000000000000000000000000000000000002C -:1024B000000000000000000000000000000000001C -:1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC -:1025000000000000000000000000000000000000CB -:1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000000003B -:1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA -:1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA -:10263000000000000000000000000000000000009A -:10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:10267000000000000000000000000000000000005A -:10268000000000000000000000000000000000004A -:10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A -:1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F00000000000000000000000000000000000DA -:1027000000000000000000000000000000000000C9 -:1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 -:102740000000000000000000000000000000000089 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:10284000000400000002000400040000000000007A -:102850000000000000000000000000000000000078 -:102860000000000000020000000400000000000062 -:102870000000000000000000000000010000000057 -:102880000000000000000000000000040000000044 -:102890000000000000000000000000000000000038 -:1028A0000000000000000000000000040000000024 -:1028B0000000000000000000000000000000000018 -:1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000004000B8 -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 -:1029000000000000000000000000000000000000C7 -:1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:102940000000008000800000000000000000000087 -:102950000000000000000000000000000000000077 -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:102990000000000000000000000000000000000037 -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C00000000000000400200002000000000000E1 -:1029D00000000000000000000000000000000000F7 -:1029E00000004000000000000000000000000000A7 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 -:102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A40000000000000200000000000000000000066 -:102A50000000000000000000000000000000000076 -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000001000000000000000005 -:102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000002008000000000000003 -:102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 -:102BC00000000000000000000000000440000000C1 -:102BD00000000000000000000000000000000000F5 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000400000080 -:102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000800084 -:102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 -:102E5000000002A090200090880000000000000008 -:102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED00000000000808080004000800000000000B2 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F5000000000000000008000218005809100003A -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 -:102FD000000000000000000040C00001A001828944 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 -:103050000000000000000000000040020008001016 -:10306000040000000000000000000000000000005C -:103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 -:1030D0000000000000000000000000000080000070 -:1030E0000000800000000000000000000000000060 -:1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:10315000000000000000000000000000000041101E -:10316000A1409000030000000000000000000000EB -:10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF -:1031E00011000490044020000000000000000000D6 -:1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:103260000000000000E00700600000000000000017 -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000C00FC0119011900000000A2 -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D -:10335000000000000000000000000000000000006D -:10336000000000000000FF0CFFFC677F677F00008B -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C -:1034600000000000000000000000F6F60606DB4247 -:10347000FF660000000000000000000000000000E7 -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E000000000000000000000000000F0FF000FDE -:1034F0009900BD2400000000000000000000000052 -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B -:1035600000000000000000000000000000000061FA -:10357000000D000D00000000000000000000000031 -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000000000DB -:1035F0007D28AFAF000000000000000000000000C8 -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A -:10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A -:1036700000007D280505000000000000000000009B -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 -:103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000200000000C7 -:10380000200002002000200420000080000420048A -:1038100000000000000000000000000000000000A8 -:103820000000000000000000200000000000200058 -:103830000000000000000000000100000000000087 -:103840000000400002000000000020000000000016 -:103850002000000000000000000000000000000048 -:1038600000002000200000000000200000000000F8 -:103870002000000000000000000000000000000028 -:103880000000000000000000000100000004000033 -:1038900000010000410000000000000000000000E6 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:103900000080000000000000000000000000010036 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000443 -:10398000000000040000008400000084000000002B -:1039900020000900000000000000000000040000FA -:1039A00000000000000000000000200020000000D7 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A00000000000000000000000000000040000076 -:103A10000000000000000000004000000040000026 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000050000000000000000A0000000A0F1 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B0000000000000002000041080020000000004A -:103B1000000220200000000000000004000000005F -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B800000000000000000012100200100000800EA -:103B9000080000008800210000000800000100006B -:103BA0000800000003000000000000000000080002 -:103BB00008000000000000000000000000000000FD -:103BC00000000000000000000000000000000000F5 -:103BD00010000000000000000000000000000000D5 -:103BE00000000000000000000000000000000000D5 -:103BF00008000800000000000000000000000000B5 -:103C000000000000000000000000000000000000B4 -:103C10000000000000044000000000000000000060 -:103C20000000000000000000000000000000000094 -:103C3000000000000000080000000000000000007C -:103C40000000000000000000000000000000000074 -:103C50000000000000000000100000000000000054 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C8000000000000000000000000000080000002C -:103C90000000000000000000000000000000000024 -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D0000000000000000000000000000000084002F -:103D10008200000004000400A00000000000000079 -:103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D900000000000000000000020000000000800FB -:103DA000000000000800000000000000000000000B -:103DB00000000000000000000000000000000800FB -:103DC00000004100080000000000000000000000AA -:103DD00000000000000000000000000000000000E3 -:103DE0000800000041000800000000000000000082 -:103DF00000000000000000000000000000000000C3 -:103E000008000000000000000000000000000000AA -:103E1000000100000000000000000000820000001F -:103E2000000004000200000000000000000000008C -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000004100204020000800000000050054 -:103EA000000000008000850000000000000000000D -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F1000000000004100200005110000000000002A -:103F2000000000000000000000000003000000008E -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000010000000020 -:103FA0000000000000000000000000000001000010 -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 -:10401000000000000000000000000000010000009F -:10402000000000000000000100000000000000018E -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000500020019 -:1040A0000000000000050008001100000020004092 -:1040B00000110000000000000000000000000000EF -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000110000000000000000200003114A -:10413000030000000000000000000000000000007C -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000010100000000000000000000000000FD -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000E000000000000000E000000000CE -:10423000000000E00000000000000000000000009E -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000061000700059F -:1044B000000000610007000900000061000500091C -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:104530000000000000000000A000AFF00FFF000F1F -:104540000050A5F500000000000000000000000081 -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000A000AFF00F00AD -:1045C000000F0050A5F500000000000000000000F2 -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:10463000C6053CFF24742474000000000000000044 -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B0000000FAFA000024742474000000000000D6 -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000002000000059 -:104740008800000320000000000088048800880022 -:104750000004000400000000000000002000000031 -:104760002000000000000000000000000000000029 -:1047700000000004000388000000000000000000AA -:104780008800200000000000000000000000000081 -:104790000000000000040000020000000000000013 -:1047A00020002000000000000000000000000000C9 -:1047B0000000000000040082000000000000000073 -:1047C00000040000000000000900000000000000DC -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000100000000000000000000B8 -:1048000000000000000000000000000000000000A8 -:104810000000000000000001000000000000000097 -:104820000000000000000000000000000000000088 -:104830000000000000000001000000000000000077 -:104840000000000000000000000000040011000053 -:1048500000000000000000800000000000000000D8 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000005000000F3 -:1048C00000000000000000000000000041000000A7 -:1048D00000000000000000000004000000000000D4 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000200000000B6 -:1049000000000000000000000000000000000000A7 -:10491000000000000000000000000000000009008E -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 -:10494000A0000000000000000004000000000000C3 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 -:1049C000000000880000000003000000000000005C -:1049D0004100000000000000000000000000000096 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A40008200820000208200820008000400000032 -:104A50000800820000008200820082000000000046 -:104A6000820082000000820082000000000000003E -:104A70000800040000000800080008000000000012 -:104A8000000282008200000082008200000000001C -:104A90000000000082009000820082000000000000 -:104AA0000000080082000000820082000000000078 -:104AB00000000000000000008200820000000000F2 -:104AC000000020000000000040000000400009023B -:104AD000000010001000000000000802410000006B -:104AE000000005004100000040000500000000003B -:104AF0000000400000000000000000000000000076 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B4000000000000000000900020000000000005A -:104B500082000000000000000800000000000800C3 -:104B600082000000000000000000000000000000C3 -:104B7000080000000000000000000000000000002D -:104B80000000000000000000000000000000000025 -:104B9000000008000000000000000000000000000D -:104BA0000000000000000000000082000000000083 -:104BB000C0008400000000000000000000000000B1 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C50000800080000000000000000000000000044 -:104C60000000000000000000000000000000000044 -:104C700008008200000000000000000000000000AA -:104C80000000000000000000000000000000000024 -:104C9000000008008200000000000000000000008A -:104CA0000000000000000000000000000000000004 -:104CB00000000000080008000000000000000000E4 -:104CC00000000000000000000000210404020000B9 -:104CD00000000000000008001000000000000000BC -:104CE000000040000000000200004100000200003F -:104CF0000000000010001000000000000000000094 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000001000000000000000000010051 -:104D600000C0000000000000000000000000000083 -:104D70000000000001000000000000000000010031 -:104D800000C0000000000000000000000000000063 -:104D90000000000000000100000000000000000012 -:104DA000010000C000000000000000000000000042 -:104DB00000000000000001000000000000000000F2 -:104DC000010000C000000000000000000100000021 -:104DD000000000000000410000000000000040054D -:104DE0000200008000000000000000000000000041 -:104DF000000000000000410000000000000040052D -:104E00000200008000000000000000000000000020 -:104E10000000000000000000410000000000000051 -:104E2000400541000080000000000000000000007C -:104E30000000000000000000410000000000000031 -:104E4000404102000080000000000000000041001E -:104E5000000003000000008000008000000000004F -:104E600090008300002000000000000000000041CE -:104E7000000003000000008000008000000000002F -:104E80009000A00000200000000000000000004191 -:104E9000000000000300000000800000800000000F -:104EA00000009000A00000200000000000000000B2 -:104EB00000410000030000000080000080000000AE -:104EC000000090008300004100000000000000008E -:104ED000001000000100000000C0000020000000E1 -:104EE000000041002140009140824000000000008D -:104EF000000100000100000000C0000020000000D0 -:104F000000004100214000914000400000000000EE -:104F10000001000000000100000000C000002000AF -:104F200000000000410021400091400040000000CE -:104F30000000000100000100000000C0000020008F -:104F400000000000030020400091400040000000ED -:104F50000000000100000000C00000000000000090 -:104F6000000000000002000000000000000000003F -:104F70000000000000000000C00000000000000071 -:104F8000000000000002000000000000000000001F -:104F900000000000000000000000C0000000000051 -:104FA00000000000000000020000000000000000FF -:104FB00000000000000000000000C0000000000031 -:104FC000000000000000004000000400000000009D -:104FD0000000000000000000000080000000000051 -:104FE0000000000000000080000000000000000041 -:104FF0000000000000000000000080000000000031 -:105000000000000000000080000000000000000020 -:105010000000000000000000000000008000000010 -:105020000000000000000000008000000000000000 -:1050300000000000000000000000000080000000F0 -:105040000000000000000000008000008000000060 -:1050500000000000000000000000800000C100000F -:10506000000000000000000000418000002000005F -:1050700000000000000000000000800000C10000EF -:10508000000000000000000000418000002000003F -:10509000000000000000000000000000800000C1CF -:1050A0000000000000000000000000008000002060 -:1050B000000000000000000000000000800000C1AF -:1050C00000000000000000000000004180000020FF -:1050D000000000000000000000000000400000C1CF -:1050E0000000000000000000000000830400000138 -:1050F000000000000000000000000000400000C1AF -:105100000000000000000000000000830400000117 -:10511000000000000000000000000000000040004F -:1051200000C1000000000000000000000082040038 -:10513000000100000000000000000000000040002E -:1051400000C1000000000000000000000083040017 -:10515000000100000000000000000000000000004E -:10516000000000420000000000004800810000E054 -:1051700000004800000000000000004200000000A5 -:10518000000000420000000000004800810000E034 -:105190000000480000000000000000420000000085 -:1051A0000000000000420000000000004800410034 -:1051B00000E00000C100000000000000004200000C -:1051C00000000000004200000000000048008100D4 -:1051D00000E000004805000000000000000500009D -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE -:1052D00000000000000000000000000000000000CE -:1052E0000000747B000000000000000000000000CF -:1052F00000000000000000000000000000000000AE -:10530000DE2E747B000000000000000000000000A2 -:10531000000000000000000000000000000000008D -:10532000DE2E0000747B0000000000000000000082 -:10533000000000000000000000000000000000006D -:105340000000DE2E747B0000000000000000000062 -:10535000000000000000000000000000000000004D -:105360000000DE2E61560340000000000000023104 -:10537000E0000000000000000C4000000000000001 -:1053800002C06A866156034000000000000002313E -:10539000E0000000000000000C40000000000000E1 -:1053A00002C06A8600006156034000000000000051 -:1053B0000231E0000000000000000C40000000008E -:1053C000000002C06A866156034000000000000031 -:1053D0000231E0000000000000000C40000000006E -:1053E000000002C06A862003042000002010000094 -:1053F0000000000300000005200000002000000065 -:105400000000000400000080000000A00000001068 -:10541000008000400002000020000000200000008A -:105420000000000004000001000000000000000077 -:10543000000000000000000000002000000020002C -:10544000000000000000200000000000000000003C -:10545000000000000000000000002000000020000C -:105460000000000000000000008400850000000132 -:1054700000000084000000000000000000000000A8 -:105480000000000000010000002000000005008472 -:1054900000010010000100010000000000000000F9 -:1054A00005000000000004000000000000000000F3 -:1054B00000000000000000000000000000000000EC -:1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000000BC -:1054F000000000000088000000020000000800001A -:105500000000000400800085008000800000000092 -:10551000008000000000000000A0000000800000EB -:10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:1055600000000000000000000000000040002000DB -:105570000000000000000005200000010000000005 -:10558000200000840001004000040010000400001E -:1055900000000002000000000000002100000004E4 -:1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB -:1055F00000000009900500000102008090080020D2 -:1056000000030009004001090020000000040021FF -:105610000000000000100000000000200005000451 -:10562000000000000020000000000000000000005A -:10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:1056700000000082000000000088200000100000F0 -:105680000001000000000085200000010000000172 -:105690000800000000000001000000000001000000 -:1056A00000010000000000010000000000000000F8 -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D0000000000000004100000000000000000089 -:1056E00000000000000000000000000000000000BA -:1056F000000090900005A0C020808200048000007F -:1057000020000080000008802082000008002000A7 -:1057100020000400000082000000000000000000E3 -:105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:1057700000000000000305000309000203200010E0 -:105780002184030421024084080800110300000062 -:10579000A1A08000800000000320000000000000A5 -:1057A00000000000000000000000000000000000F9 -:1057B00000200000000000000000000000000000C9 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 -:1057F0000000000000000008A00082808208C02095 -:105800000004840000210841C01182000005082026 -:10581000A0000811C000A003080004000800000058 -:1058200000000000C0200000200000000000000078 -:105830000000000000000000000000000000000068 -:1058400000000000000000000000000000800000D8 -:105850000000000000000800000000000000000040 -:105860000000000000000000000000000000000038 -:10587000000000000100080000000000000200021B -:105880000001000100000000000008000000080006 -:105890000001000000000000000000008000000087 -:1058A0000000000000000001000088000000080067 -:1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000008000010C0 -:1058D00008000000000000000000000000000000C0 -:1058E00000000000000000000000000008000000B0 -:1058F000080000000000080000000008A0808202EC -:10590000A0008202C009828082A1820040000810AB -:10591000840482004003012182212002040020002F -:105920009000000082020000C0000004000400009B -:105930000004000000000000000000000000000063 -:105940000000000000000000000000000000000057 -:105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 -:105970000000000000000000000000000004000221 -:10598000040420A0000108002002001000A041082B -:1059900021030300030000002000009080000000AD -:1059A00080000000000000884100000000010001AC -:1059B00000000001000000000000000000000000E6 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000000000000000C7 -:1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000201A4 -:105A000000904089100302404004C088C08208030F -:105A100083900808048200410090400000040100C7 -:105A20000000400000009102018220880210000165 -:105A30000000200000010000000000000000000045 -:105A40000000000000000000000000000000000056 -:105A50000000000000000000000000000000000046 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 -:105A800040411185800880A0C00085C085038089C1 -:105A90000041102080208083401108A1852000A0B3 -:105AA00011050503C0410020108021000080800006 -:105AB000001108204003001000000000000000005A -:105AC00000000000000000000000000000000000D6 -:105AD00000000000000000000000000000000000C6 -:105AE00000000000000000000000000000000000B6 -:105AF00000000000000000000000000000000000A6 -:105B00000000A1008589C000031003008221C104A8 -:105B1000080800000003000000000200A10311803B -:105B2000A00085008220910000000280802040803B -:105B3000C000000000000000800500000000000020 -:105B40000000000000000000000000000000000055 -:105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 -:105B80000000000008209008A1C00401404004006B -:105B9000840185118800200120002040410002007E -:105BA0002140C0000200090003009000A004200171 -:105BB00000A00400209020000000900000000000E1 -:105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE00000000000000000000000000000000000B5 -:105BF00000000000000000000000000000000000A5 -:105C000000000000000000100010C0C00488104018 -:105C1000001004894091202001910002100800002A -:105C200000010500A001000400210190000508000A -:105C300000820009210900000100000100010000AC -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000000024 -:105C8000000000000000000000202185032080208B -:105C90008040029191080041002003084183A083C5 -:105CA000000540039020201100A0201040A0008893 -:105CB0000003008500211002002010202010001198 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 -:105D0000000000000000000000008585A040820027 -:105D100003100811914120000205800500850080D4 -:105D20000000808000410000000580058040800068 -:105D30000000891009888580C009020020C0200069 -:105D40000300000000000000000000000000000050 -:105D50000000000000000000000000000000000043 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D8000000000000000000000000000C04004020D -:105D900003021000839121208888010090000020D8 -:105DA00020024000900820820090000090202020D7 -:105DB00002400000C08390824002A0000100000465 -:105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E1000000007000000000000E00700000A00008A -:105E2000000007000000000000E007000000000084 -:105E300000E0070000000000000007000000000074 -:105E400000E007000000000000000000000000006B -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 -:105E900026D9262600000000FF0FF000F0C0695947 -:105EA0003F3F0C0CFFF4FF2466FF0066000000007B -:105EB000FF0000003F0C3300F0F0FF0066660000BA -:105EC00000000000000000000000000000000000D2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 -:105F00000000000000000000000000000000000091 -:105F10000000D9D92626000000010F000F0096A628 -:105F20000F3F3333000024F424246699000000005E -:105F30000000F0FFF0003F0C330066663C3C999097 -:105F40000900000000000000000000000000000048 -:105F50000000000000000000000000000000000041 -:105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 -:105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 -:106000000000000000000000000000000000000090 -:1060100000000000000020EC20EC000000003CA587 -:106020000C95F90906F62F2F2FBFF069F00F00C36A -:10603000427E030F9A960000000039003F0066F090 -:1060400064F000000F0F000000002020ECEC0000C6 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 -:10609000000000000000000020EC20EC00100000D8 -:1060A000C3A5F395F9093ACA242424BDC35AC33CB5 -:1060B00000C3427E030FFCF00000000030003600F9 -:1060C00066F060F010107070000000002020ECEC12 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:1061100000000000000000000000A061000E000D63 -:1061200000000061000D000D00000061400E000D38 -:1061300000000061000B000100050061000B00057C -:106140000000A061000E000D0000006100090009C0 -:10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:10619000000000000000000000000000FF3DFF01C3 -:1061A000ACACACFF55550000C0F095A50000000058 -:1061B000F828F8FF0000000078AA7DAA000000007F -:1061C000A0FFBCFF0000008000010000F5F5050500 -:1061D0000C3E0D3F00000000000000000000000029 -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E -:1062100000000000000000000000000000003D3D04 -:106220000101A0A0A0FFBE1EB414C0F03F0F0000EB -:106230000000282828FF0000000028002D00000092 -:106240000000A000BC3C00000080000000005030B6 -:106250005030003201330000000000000000000058 -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE -:1062A000A6F30C0CC03FC06A00000000A903A9A916 -:1062B000C6FA0505000000005FF05F307075747469 -:1062C000FFAA2A02003C003C000000000000000081 -:1062D0000C350C350000000000000000000000003C -:1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D -:10632000000096C33C3CCF30CF6500800080953F95 -:106330009595CCF00F0F0000000050C050002025B4 -:10634000242455002A0230F330F3000000004100FD -:1063500000000CF50C05000000000000000000002B -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD -:1063A00000000000014000400200024020802080E8 -:1063B00000402008000088000000000000000004E9 -:1063C0000000000000000002000000040000008047 -:1063D00000020008000000000000000000000000B3 -:1063E00000000000000100000000000000000000AC -:1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C -:106410000000000000000000040000000000000078 -:10642000000000000000020109018000800100401E -:1064300000080001800000000000000000000000D3 -:106440000901200000000000000100000001000020 -:106450000002000100010000000000000000000038 -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A000000000000000000000000000008000006C -:1064B00000000000008000800000000000000000DC -:1064C00000000000000000000000008000000080CC -:1064D000008000000080008000000000000000003C -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B -:1065200000000000000000000000008200000040A9 -:106530000000000000000040000400000000000017 -:10654000000000000000000000000000004000000B -:106550000010000200000004000200000000000023 -:10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000210008C2 -:1065B00000100104000000050008038400040082AC -:1065C0000000080800200040001000000000000843 -:1065D00000000004000000000000000000000000B7 -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A -:1066300000000800200141A009002100A005000180 -:106640000021418483010301410108012100000070 -:1066500000012100090121002100030008000000C1 -:10666000000000C00000000000000000000000006A -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B000C000020084002080C0000200A002A000F0 -:1066C000A0000400850008008200A000C0000800AF -:1066D000000000000800080000000000000000802A -:1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 -:1067300000000000880000008802000880000001BE -:1067400000000000000008900000000000020002AD -:106750000000000000000000000000000000000039 -:106760000004000000000000000000000000000025 -:106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 -:1067900000000000000000000000000000000000F9 -:1067A00000000000000000000000000000000000E9 -:1067B000000000000000C000A000A004C003C0A1B1 -:1067C00000032084C010A121C04182020000008586 -:1067D000084182008200C00082000000000000002A -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 -:1068300000000000000000A000000300008521848B -:1068400000400800800521010400008400A1000030 -:106850000904080000000390000008000000080080 -:106860000800030008000500080003000300000002 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B0000000000000000000C003C01040114008AC -:1068C0008382C08301088484A00404400100820202 -:1068D0000000C004200400004000A02000000000D0 -:1068E00000000000000000040000000000000000A4 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000000000000000000001100000046 -:106940000000020900020201004100018001400034 -:1069500000000000000180010000000000000000B5 -:106960000000000000000000000100000000000026 -:106970000000000000000000000000000000000017 -:106980000000000000000000000000000000000007 -:1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 -:1069B0000000000000000000000000000440A002F1 -:1069C00005102102C0034082830388C004834091E4 -:1069D0004120104082000000010020000000000063 -:1069E00003000000000001000101000000000000A1 -:1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000000086 -:106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A300000000000000000000000000000000080D6 -:106A400005808480028040C1000382838009C011D8 -:106A500085A002038040000000000200000000004A -:106A600000008200000000402040021100030000EE -:106A70000000000000000000000000000000000016 -:106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC000800080908002801085000320A190410307 -:106AD0000310894141408303100003031100A00506 -:106AE00000008000000080090580050010000021E2 -:106AF0000000000000000000000000000000000096 -:106B00000000000000000000000000000000000085 -:106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 -:106B30000000000000000000000000000000000055 -:106B40000000082002A108C0820403040888404114 -:106B5000911182830401A0C0C0014120A000210046 -:106B60000300824002002000C0000002000001007B -:106B70000001000000000000000000000000000014 -:106B80000000000000000000000000000000000005 -:106B900000000000000000000000000000000000F5 -:106BA00000000000000000000000000000000000E5 -:106BB00000000000000000000000000000000000D5 -:106BC0000000000021820020100302024141010563 -:106BD00089822111C0910004010391110002000873 -:106BE00082020040000100000001010100000100DC -:106BF000A1000000000000000000000000000000F4 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 -:106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C40000000000000004010000380A01189201007 -:106C5000208305A011C18002218310C04040008024 -:106C600000800080000000020005000511410005C1 -:106C70001005C040004000000000000000000000BF -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000000000000000000D4 -:106CC00000000000000000008305A0008580400057 -:106CD0004103A108050020114182838885008305B6 -:106CE00083051141208020050340108041004000B1 -:106CF000418041401000100300000000000000002F -:106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D40000000000000000000000002000804020231 -:106D5000C000054004040502050189050403412023 -:106D6000100090C04190A1400000000001040040CC -:106D7000000001020000010001010000000000000D -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 -:106DC000000000000000000000000000810000E062 -:106DD00000000000820000E000000000000000E071 -:106DE00007006000000000E007000000000000E075 -:106DF00000000000000000E00000000000000000B3 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000F50548 -:106E5000C3C300550C4DD70F820FD714070469C365 -:106E6000693C3A3A3AFF0000F0F00F00727D0000F2 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED000F505F505FF55CF4DD7D78282D714F7F4C6 -:106EE00059F3590C303030FF00F00FFF0FFF728262 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 -:106F50000000AA30AAF3A0AFAAAA82D7C3C3101018 -:106F600010FB0F0F000027F0D70000000000FF14F7 -:106F70001F1F0000000027F0D700000000000000E5 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD000000000003030F3F3C0CFC3C3A0F5F0F0E1 -:106FE000FB10FBFB5555CF0C28FFD700000000001D -:106FF000FF1414140000000028FFD7000000000058 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:1070500000000000000040618007C02D1002406168 -:107060008007C02800020061000B000D00050061D0 -:10707000000D000500010061000700090005006126 -:1070800000070001000000000000000000000000F8 -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000007F753F304B4B4BB4B8 -:1070E000C6FA05055050000ECCC90F0A5555A6A684 -:1070F0000C0C353500000000FF3C3D3D3030083BB6 -:1071000051FB5151303333330000000000000000C8 -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000005F550F004BB46D -:107160004BB496AA55555050000EF0F50F0AFF008B -:107170000CF30C0CF50500000000FF000505303095 -:10718000083B51FBFBFB0000030000000000000077 -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E0000000000096AA55552828D727F5A5752533 -:1071F000C0FCEAFE00000000080D3F3F0000000058 -:10720000000000005F5F55550133013300000000AE -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:1072600000000000000093AF50503C3CC333D0807E -:107270005000003CAABE00000000080D30300000A5 -:107280000000000000003F0F3C0000320032000010 -:1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE -:1072E0000400820020000000040084002000000050 -:1072F000200004000000200000000000000000004A -:10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000010000000000000000000000D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D -:10740000000000000000000000000000000000007C -:10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:107460000000000000000000000000000008000014 -:10747000000000000000000000000000000000000C -:107480000000000000000000000000000088000074 -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000000000000010000082000000C00000003A -:107500000000080000000000000000000000000073 -:1075100000000800A0008200080008000000000031 -:10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:107560000000000000000000000000C02100030037 -:1075700003080010000021C0080041000000218421 -:1075800021000300000003000010000000000000C4 -:1075900000002100000000000000000000000000CA -:1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000900000000B -:1075F000A0000000880000110411900004000000A9 -:1076000000000000000000000000820000000000F8 -:10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A -:10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA -:1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D00000000000000000000000000000000000AA -:1076E000000000000000000000000000000000009A -:1076F00008000000000000000000A0000000C00022 -:107700000000000000000000000000000000000079 -:107710000000000008000000000000000000000061 -:107720000000000000000000000000000000000059 -:107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 -:107750000000000000000000000000000000000029 -:107760000000000000000000000000000000000019 -:10777000000008000000000008000800038440002A -:107780002184000021C003C0210008002100000066 -:107790000300030008002100000008004100080069 -:1077A00000000000000000000800000000000000D1 -:1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 -:1077D00000000000000000000000000000000000A9 -:1077E0000000000000000000000000000000000099 -:1077F00000000000000404004004040000009000A9 -:1078000082004000000008090000000400000000A1 -:107810000402000008000000040000000000000056 -:107820000000000000000000000000000000000058 -:107830000000000000000000000000000000000048 -:107840000000000000000000000000000000000038 -:107850000000000000000000000000000000000028 -:107860000000000000000000000000000000000018 -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000000000000000000098 -:1078F0000000000000000000000000000000000088 -:107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 -:107920000000000000000000000000000000000057 -:107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 -:107950000000000000000000000000000000000027 -:107960000000000000000000000000000000000017 -:107970000000000000000000000000000000000007 -:1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 -:1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C00000000000000000000000000000000000B7 -:1079D00000000000000000000000000000000000A7 -:1079E0000000000000000000000000000000000097 -:1079F0000000000000000000000000000000000087 -:107A00000000000000000000000000000000000076 -:107A10000000000000000000000000000000000066 -:107A20000000000000000000000000000000000056 -:107A30000000000000000000000000000000000046 -:107A40000000000000000000000000000000000036 -:107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 -:107A70000000000000000000000000000000000006 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 -:107AA00000000000000000000000000000000000D6 -:107AB00000000000000000000000000000000000C6 -:107AC00000000000000000000000000000000000B6 -:107AD00000000000000000000000000000000000A6 -:107AE0000000000000000000000000000000000096 -:107AF0000000000000000000000000000000000086 -:107B00000000000000000000000000000000000075 -:107B10000000000000000000000000000000000065 -:107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 -:107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 -:107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000000D5 -:107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000000000000000B5 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000000095 -:107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 -:107C10000000000000000000000000000000000064 -:107C20000000000000000000000000000000000054 -:107C30000000000000000000000000000000000044 -:107C40000000000000000000000000000000000034 -:107C50000000000000000000000000000000000024 -:107C60000000000000000000000000000000000014 -:107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD00000000000000000000000000000000000A4 -:107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 -:107D20000000000000000000000000000000000053 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 -:107D50000000000000000000000000000000000023 -:107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 -:107DB00000000000000000000000000000000000C3 -:107DC00000000000000000000000000000000000B3 -:107DD00000000000000000000000000000000000A3 -:107DE0000000000000000000000000000000000093 -:107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 -:107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 -:107E70000000000000000000000000000000000002 -:107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 -:107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 -:107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000000000000000092 -:107EF0000000000000000000000000000000000082 -:107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 -:107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000000000000000000021 -:107F60000000000000000000000000000000000011 -:107F70000000000000000000000000000000000001 -:107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 -:107FA00000000000000000000000000000000000D1 -:107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 -:107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000000091 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 -:108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:108050000000000000000000000000000000000020 -:108060000000000000000000000000000000000010 -:108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000000000000000000090 -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000000000000EF -:1081900000000000000000000000000000000000DF -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F -:10820000000000000000000000000000000000006E :10821000000000000000000000000000FFFFFFFF62 :10822000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E :10823000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E @@ -55362,7 +55362,7 @@ :10833000000000000000000000000000000000003D :10834000000000000000000000000000000000002D :10835000000000000000000000000000000000001D -:10836000000000010000000100000000000000000B +:1083600000008001000080010040000000000000CB :1083700000000000000000000000000000000000FD :1083800000000000000000000000000000000000ED :1083900000000000000000000000000000000000DD @@ -55370,7 +55370,7 @@ :1083B00000000000000000000000000000000000BD :1083C00000000000000000000000000000000000AD :1083D000000000000000000000000000000000009D -:1083E00000000000208000000000000000000000ED +:1083E00000000000009000000010000000000000ED :1083F000000000000000000000000000000000007D :10840000000000000000000000000000000000006C :10841000000000000000000000000000000000005C @@ -55386,19 +55386,19 @@ :1084B00000000000000000000000000000000000BC :1084C00000000000000000000000000000000000AC :1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C +:1084E000000000000000000000000000000081000B :1084F000000000000000000000000000000000007C :10850000000000000000000000000000000000006B :10851000000000000000000000000000000000005B -:10852000000000000000000000000000000020002B -:1085300088000000880000000000000020002000EB -:10854000200020002000200000000000000020008B -:108550008800000020000000000000002000200033 -:10856000200020002000200000000000000000008B -:10857000200020000000200000008800880020006B -:10858000200020002000200020000000000000004B -:10859000200020000000200000002000000020003B -:1085A000200020002000200020000000000000002B +:10852000000000000000000000000000000000004B +:1085300000000000000020000000000000002000FB +:1085400000000000000088000000000000000000A3 +:10855000000000000000200000000000C00020001B +:1085600000000000000020000000000000000000EB +:108570000000880000000000200000000000200033 +:10858000200000000000C0002000000000000000EB +:108590008800000000000000200000000000200013 +:1085A00020008800000020002000000000000000E3 :1085B00000000000000000000000000000000000BB :1085C00000000000000000000000000000000000AB :1085D000000000000000000000000000000000009B @@ -55409,28 +55409,28 @@ :10862000000000000000000000000000000000004A :10863000000000000000000000000000000000003A :10864000000000000000000000000000000000002A -:108650000000000200000000000000000000000018 +:1086500000004000000000000000000000000000DA :10866000000000000000000000000000000000000A -:1086700000000003000200000000000000000000F5 +:1086700000000000100200000000000000000000E8 :1086800000000000000000000000000000000000EA -:1086900000000000000800000000000010020000C0 +:1086900000000000000000000000000010020000C8 :1086A00000000000000000000000000000000000CA -:1086B00000000008000800000000000000080000A2 -:1086C0000082000000000000000000080008000018 -:1086D000000000040083000000000000008400008F -:1086E0000000000800000000000000400040000002 -:1086F000000000000008000500000000000000006D -:108700000000000000080008000000000000000851 -:1087100000000000000800020000000000008001CE -:108720000000000000820082000000000008000835 -:108730000000000000000011000000000000000028 +:1086B00000000000000000000000000000080000B2 +:1086C00000000000000000000000000000080000A2 +:1086D0000000000080000000000000000002000018 +:1086E000000000000000000000080000000800007A +:1086F00000000000000080010000000000000000F9 +:108700000000000000000000000000080000000859 +:1087100000000000000000000000000000008001D8 +:108720000000000000000000000000080000000839 +:108730000000000000000000000000000000000039 :108740000000000000000000000000000000000029 :108750000000000000000000000000000000000019 -:1087600000000000000000210000000000000008E0 -:1087700000000000000000000008000000000000F1 -:1087800000000000000000000011000000000008D0 -:1087900000000000000000000000000000000000D9 -:1087A00000000000000000000000000000000000C9 +:108760000000000000000000000000000000000009 +:1087700000030000000000000000000000000000F6 +:1087800000000000000000000000000000000000E9 +:1087900000000021000000000000000000000000B8 +:1087A0000000004000000000000000000000000089 :1087B00000000000000000000000000000000000B9 :1087C00000000000000000000000000000000000A9 :1087D0000000000000000000000000000000000099 @@ -55440,43 +55440,43 @@ :108810000000000000000000000000000000000058 :108820000000000000000000000000000000000048 :108830000000000000000000000000000000000038 -:108840000000000000000000000000008400C000E4 -:10885000000000000000000000000000080082008E -:108860000000000000000000000000000000000008 -:10887000000000000000A000A00000000080000038 -:1088800000000000000000000000000000000000E8 -:1088900000000000000000000000000000000000D8 -:1088A0000000000000000000000000000000C00008 +:1088400000001000C0000000000000000000000058 +:108850000000000082000000000000000000000096 +:10886000000000000000000000000000A000000068 +:1088700000000000000000000000000000000000F8 +:108880000000000000000000000000008400000064 +:1088900000000000000000000000000000000800D0 +:1088A00000000000000000000000C0008400840000 :1088B00000000000000000000000000000000000B8 :1088C00000000000000000000000000000000000A8 :1088D0000000000000000000000000000000000098 :1088E0000000000000000000000000000000000088 -:1088F000000000000000000300000000000000086D +:1088F0000000000000000003000000000000000075 :108900000000000000000000000000000000000067 :108910000000000000000000000000000000000057 :108920000000000000000000000000000000000047 :108930000000000000000000000000000000000037 -:108940000000000000000000000000008808000097 -:108950000000C0000002000300000000000800004A +:10894000000008000000000000000000000000001F +:1089500000000008900400000000C00000000000BB :108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000005F2 +:1089700000000000001100000000000000000000E6 :1089800000000000000000000000000000000000E7 -:1089900000000000000000000002000000000000D5 -:1089A00000000000000000000000000008000000BF -:1089B00000000000000000000000000000000000B7 +:1089900000000000000000040000000000000000D3 +:1089A00000000000000000000400000000000000C3 +:1089B00000000000000000110000000000000000A6 :1089C00000000000000000000000000000000000A7 :1089D0000000000000000000000000000000000097 :1089E0000000000000000000000000000000000087 -:1089F0000000000000000000000000000000000077 +:1089F0000000000000000020000000000000000057 :108A00000000000000000000000000000000000066 :108A10000000000000000000000000000000000056 :108A20000000000000000000000000000000000046 -:108A30000000000000000000002000000000000016 +:108A30000000000000000000000000000000000036 :108A40000000000000000000000000000000000026 -:108A50000000000000000000000000050000000011 -:108A600000000008000000000000000500000000F9 -:108A700000000008820082000000000000000000EA -:108A800000000000002100000000002100000000A4 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000008200000084 +:108A700000000000000000000000000000000000F6 +:108A80000000000000008200000000000000000064 :108A900000000000000000000000000000000000D6 :108AA00000000000000000000000000000000000C6 :108AB00000000000000000000000000000000000B6 @@ -55497,31 +55497,31 @@ :108BA00000000000000000000000000000000000C5 :108BB00000000000000000000000000000000000B5 :108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000030000000000000000000000000082 +:108BD0000000030000000000000000000000000092 +:108BE0000000400000000000000000000000000045 :108BF0000000000000000000000000000000000075 -:108C00000000000300000000000000000000000061 +:108C00000000000000000000000000000000000064 :108C10000000000000000000000000000000000054 :108C20000000000000000000000000000000000044 -:108C30000000000000000000000000000300000031 +:108C300000000000000000000000000040000000F4 :108C40000000000000000000000000000000000024 -:108C5000000000008000800000000009000000000B -:108C600000000000000000000000000900000000FB -:108C70000000000000000000000000000000800074 -:108C800000080009000000000000000000000000D3 -:108C90000000000000000000800000000020000034 +:108C50000000000000008000000000110000000083 +:108C600000000000000000000000000800000000FC +:108C70000000000000000000000000008000000074 +:108C800000000010000000000000000000000000D4 +:108C900000000000000000000000000000080000CC :108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 -:108CC00000000000000400000000000000000000A0 -:108CD0000000000000001000100000000000000074 -:108CE0000000000000000000000000000000000084 -:108CF00000000000000000000000000000009000E4 -:108D00004000000100000000000000000000000022 -:108D10000000000000000000100010000000000033 +:108CB0000000000000000000000000000000800034 +:108CC0000000000000200000000000000000000084 +:108CD000000000000000900082000000000800007A +:108CE0000000000000000000000000000001000083 +:108CF0000000000000000000000000000000100064 +:108D0000A0000000000000000000000000000000C3 +:108D10000000000000000000100002000000000140 :108D20000000000000000000000000000000000043 :108D30000000000000000000000000000000000033 -:108D40009000A000000000010000000000000000F2 -:108D50000000000000000000000000009000000083 +:108D4000100008000000000000000000000000000B +:108D50000000000000000000000000000000000013 :108D60000000000000000000000000000000000003 :108D700000000000000000000000000000000000F3 :108D800000000000000000000000000000000000E3 @@ -55539,12 +55539,12 @@ :108E40000000000000000000000000000000000022 :108E50000000000000000000000000000000000012 :108E600000001100000000000000000000000000F1 -:108E700000000200000000000000000000000000F0 -:108E8000000000000040000000001100000200008F -:108E90000000000000000000000000000000004092 -:108EA00000000000080000000000000000000000BA +:108E700000000300000000000000000000000000EF +:108E800000000000000500000000200000020000BB +:108E900000000000000000000000000000000005CD +:108EA00000000000110000000000000000000000B1 :108EB00000000000000000000000000000000000B2 -:108EC0000000000000000000000000001100000091 +:108EC0000000000000000000000000002000000082 :108ED0000000000000000000000000000000000092 :108EE0000000000000000000000000000000000082 :108EF0000000000000000000000000000000000072 @@ -55552,16 +55552,16 @@ :108F10000000000000000000000000000000000051 :108F20000000000000000000000000000000000041 :108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 +:108F40000000000000000000000000000000010020 :108F50000000000000000000000000000000000011 -:108F6000842100500A009009000000000000000069 -:108F7000004100000A009000000000000000000016 -:108F80000000000000000000818100500A009009EC +:108F6000884100900900C843000000000000000094 +:108F7000004100000900C8000000000000000000DF +:108F80000000000000000000818100900900C8433B :108F900000000000000000000000000000000000D1 -:108FA0000000818100500A009009000000000000CC +:108FA0000000818100900900C8430000000000001B :108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000884100500A007E -:108FD00090090000000000000000000000000000F8 +:108FC000000000000000000000008841009009003F +:108FD000C843000000000000000000000000000086 :108FE0000000000000000000000000000000000081 :108FF0000000000000000000000000000000000071 :109000000000000000000000000000000000000060 @@ -55578,22 +55578,22 @@ :1090B00000000000000000000000000000000000B0 :1090C0000000000000000000000000000000001090 :1090D00000001401940200000000000000000000E5 -:1090E0000000000000000040032004C00200000057 -:1090F00000000000000000400320000000400000CD +:1090E0000000000000000040030810C00200000063 +:1090F00000000000000000400308000000400000E5 :10910000000000000000000000000000000000401F -:10911000032004C002000000020000000000004024 -:1091200000000000000000000040032004C0020016 +:10911000030810C002000000020000000000004030 +:1091200000000000000000000040030810C0020022 :10913000000000000000000000000000000000002F :1091400002000000000000400000000000000000DD -:109150000040032004C002000000000000000000E6 -:109160000000000000000000080200200400401081 -:1091700000000000000000000802002000000000C5 +:109150000040030810C002000000000000000000F2 +:10916000000000000000000008020008100040108D +:1091700000000000000000000802000800000000DD :1091800000000000000000000000000000000000DF -:109190000802002004004010000000000000000051 -:1091A0000000000000000000000008020020040091 +:10919000080200081000401000000000000000005D +:1091A000000000000000000000000802000810009D :1091B000401000000000000000000000000000005F :1091C000000000000000000000000000000000009F -:1091D0000000080200200400401000000000000011 +:1091D000000008020008100040100000000000001D :1091E000000000000000000000000000000000007F :1091F000000000000000000000000000000000006F :10920000000000000000000000000000000000005E @@ -55635,13 +55635,13 @@ :109440000000000000000000000000000000000913 :10945000000000000000000000000000000000907C :109460009A00000000000000000000000000000062 -:1094700020002000000000000000000000000000AC +:1094700000004000000000000000000000000000AC :1094800000000000000000000000000000000000DC -:10949000200020000000000000000000000000008C -:1094A0000000880000000000000000000000000034 -:1094B000000020002000000000000000000000006C -:1094C000000000002000000000000000000000007C -:1094D000000020002000000000000000000000004C +:1094900000002000000000000000000000000000AC +:1094A00000000000000100000000000000000000BB +:1094B000000000002000000000000000000000008C +:1094C000000000004000000000000000000000005C +:1094D000000000002000000000000000000000006C :1094E000000000002000000000000000000000005C :1094F000000000000000000000000000000000006C :10950000000000000000000000000000000000005B @@ -55656,74 +55656,74 @@ :1095900000000000000000000000000000000000CB :1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB -:1095C0000000000000000008000000000000000093 +:1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B -:1095F000000000000000000800080000000000005B -:109600000000000000000000000800000000000052 -:109610000000000000000004000400000000000042 -:1096200000000000000000000088000000000000B2 -:10963000000000000000000000080004000000001E -:109640000000000000000000008400000000000096 -:109650000000000000000000000800000000000002 -:1096600000000000000000000008000800000000EA -:1096700000000000000000000000004000000000AA +:1095E00000000000000000000000008400000000F7 +:1095F0000000000000000000000000020002000067 +:109600000008000000000000000000000000000052 +:10961000000000000000000000000000000000004A +:109620000004000000000000000000000000000036 +:10963000000000000000000000000000000000002A +:10964000000000000000000000000000000000001A +:10965000000000000000000000000000000000000A +:1096600000000000000000000000000000000000FA +:1096700000000000000000000000000000400000AA :1096800000000000000000000000000000000000DA :1096900000000000000000000000000000000000CA :1096A00000000000000000000000000000000000BA :1096B00000000000000000000000000000000000AA :1096C000000000000000000000000000000000009A -:1096D000000000000000000000000040000000004A -:1096E000000000000000000000000000100000006A -:1096F000000000000000000000000000000010005A -:109700000000000000000000002000000000000039 -:1097100000000084000000000000000000080000BD -:109720000000000000000000000000000000000039 -:1097300000000000000000000000000000404000A9 -:109740000000000000000084000000000000000095 -:109750000000000000000084000000000000000085 -:109760000000000000000000000000000040004079 +:1096D000000000000000000000000000000000008A +:1096E000000000000000000000000000000000007A +:1096F0000000000000000000000000000000000169 +:109700000000000000000000000000000000000059 +:109710000000000000000000000010000000000039 +:109720000000000000000900000000000000000030 +:1097300000000000002000000000000000001000F9 +:1097400000000000410000200000000000000000B8 +:109750000000000000000000000000000000040005 +:1097600010000000000002000000000000000000E7 :1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000001000B9 +:1097800000000000000001000000000000000000D8 +:1097900000000000000000000000000000000000C9 :1097A00000000000000000000000000000000000B9 :1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 :1097D0000000000000000000000000000000000089 -:1097E0001000000000000000000000000000000069 +:1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 +:109800000000000000000000040000000000000054 :109810000000000000000000000000000000000048 :109820000000000000000000000000000000000038 :109830000000000000000000000000000000000028 :109840000000000000000000000000000000000018 :109850000000000000000000000000000000000008 -:1098600000000000000010000000000000001000D8 +:1098600000000000000000000000000000000000F8 :1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 +:1098800000000000000000000020000000000000B8 :1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 +:1098A00000000000000000000000040000000000B4 :1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000000000098 +:1098C0000000000004000000000000000000000094 :1098D0000000000000000000000000000000000088 :1098E0000000000000000000000000000000000078 :1098F0000000000000000000000000000000000068 -:109900000000000002000000040000000000000051 -:109910000000000000000000000000000000000047 +:109900000000000000000000000000012000000036 +:109910000000002000000000000000000020000007 :109920000000000000000000000000000000000037 -:10993000000000080200000000000000000000001D -:109940000000000000000000000000000000000017 -:109950000000000000000200000000000000000005 +:1099300000004100000000000000000000000000E6 +:109940000000000000000000000000000000009087 +:109950000000000000000000000000000000000007 :1099600000000000000000000000000000000000F7 -:1099700000000000000004000000000000000000E3 +:1099700000000000040000000000000000000000E3 :1099800000000000000000000000000000000000D7 :1099900000000000000000000000000000000000C7 -:1099A00000000000000800000000000000000000AF +:1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 -:1099D000000000000000000000080000000000007F -:1099E000000000000000000000080000000000006F -:1099F00000000000000000008200000000000000E5 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000000000000000067 :109A00000000000000000000000000000000000056 :109A10000000000000000000000000000000000046 :109A20000000000000000000000000000000000036 @@ -55732,16 +55732,16 @@ :109A50000000000000000000000000000000000006 :109A600000000000000000000000000000000000F6 :109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 +:109A80000000000000000000000000000000900046 +:109A900000000008000000000000000000000000BE :109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 :109AC0000000000000000000000000000000000096 :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 +:109B00000000000000000000000000000000110044 +:109B100080000000000000000000000000000000C5 :109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 @@ -55749,7 +55749,7 @@ :109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 +:109B900000000080000000800000000000000000C5 :109BA00000000000000000000000000000000000B5 :109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 @@ -55757,7 +55757,7 @@ :109BE0000000000000000000000000000000000075 :109BF0000000000000000000000000000000000065 :109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 +:109C1000000000000020000000C000000000000064 :109C20000000000000000000000000000000000034 :109C30000000000000000000000000000000000024 :109C40000000000000000000000000000000000014 @@ -55765,7 +55765,7 @@ :109C600000000000000000000000000000000000F4 :109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 -:109C900000000000000000000000000000000000C4 +:109C900000000000010000888800010000000000B2 :109CA00000000000000000000000000000000000B4 :109CB00000000000000000000000000000000000A4 :109CC0000000000000000000000000000000000094 @@ -55773,7 +55773,7 @@ :109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 :109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 +:109D10000000000000004100008000000900000079 :109D20000000000000000000000000000000000033 :109D30000000000000000000000000000000000023 :109D40000000000000000000000000000000000013 @@ -55781,7 +55781,7 @@ :109D600000000000000000000000000000000000F3 :109D700000000000000000000000000000000000E3 :109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 +:109D90000000000000000000001100000080000032 :109DA00000000000000000000000000000000000B3 :109DB00000000000000000000000000000000000A3 :109DC0000000000000000000000000000000000093 @@ -55789,7 +55789,7 @@ :109DE0000000000000000000000000000000000073 :109DF0000000000000000000000000000000000063 :109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 +:109E10000000000000000000000000010000004001 :109E20000000000000000000000000000000000032 :109E30000000000000000000000000000000000022 :109E40000000000000000000000000000000000012 @@ -55798,7 +55798,7 @@ :109E700000000000000000000000000000000000E2 :109E800000000000000000000000000000000000D2 :109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 +:109EA0000700822100000000000000000000000008 :109EB00000000000000000000000000000000000A2 :109EC0000000000000000000000000000000000092 :109ED0000000000000000000000000000000000082 @@ -55806,7 +55806,7 @@ :109EF0000000000000000000000000000000000062 :109F00000000000000000000000000000000000051 :109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 +:109F20000000F0F000000000000000000000000051 :109F30000000000000000000000000000000000021 :109F40000000000000000000000000000000000011 :109F50000000000000000000000000000000000001 @@ -55814,7 +55814,7 @@ :109F700000000000000000000000000000000000E1 :109F800000000000000000000000000000000000D1 :109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 +:109FA00000000000F0F000000000000000000000D1 :109FB00000000000000000000000000000000000A1 :109FC0000000000000000000000000000000000091 :109FD0000000000000000000000000000000000081 @@ -55822,7 +55822,7 @@ :109FF0000000000000000000000000000000000061 :10A000000000000000000000000000000000000050 :10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 +:10A02000000000003C3C0000FFFF000000000000BA :10A030000000000000000000000000000000000020 :10A040000000000000000000000000000000000010 :10A050000000000000000000000000000000000000 @@ -55830,7 +55830,7 @@ :10A0700000000000000000000000000000000000E0 :10A0800000000000000000000000000000000000D0 :10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 +:10A0A0000000000000003C3C000000000000000038 :10A0B00000000000000000000000000000000000A0 :10A0C0000000000000000000000000000000000090 :10A0D0000000000000000000000000000000000080 @@ -55838,7 +55838,7 @@ :10A0F0000000000000000000000000000000000060 :10A10000000000000000000000000000000000004F :10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F +:10A1200000000000000005002A00054000A8000013 :10A13000000000000000000000000000000000001F :10A14000000000000000000000000000000000000F :10A1500000000000000000000000000000000000FF @@ -55879,13 +55879,13 @@ :10A3800000000000000000000000000000000000CD :10A3900000000000000000000000000000000000BD :10A3A00000000000000000000000000000000000AD -:10A3B000000000000000200000000000000000007D -:10A3C000000000000000000040000000000000004D -:10A3D000000000000010200000000000000000004D +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000008D +:10A3D000000000000000000000000000000000007D :10A3E000000000000000000000000000000000006D -:10A3F000000000000000000020100000000000002D +:10A3F000000000000000000000000000000000005D :10A40000000000000000000000000000000000004C -:10A41000000000000000000020000000000000001C +:10A41000000000000000000000000000000000003C :10A42000000000000000000000000000000000002C :10A43000000000000000000000000000000000001C :10A44000000000000000000000000000000000000C @@ -55895,86 +55895,86 @@ :10A4800000000000000000000000000000000000CC :10A4900000000000000000000000000000000000BC :10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000002000000000007C +:10A4B000000000000000000000000000000000009C :10A4C000000000000000000000000000000000008C :10A4D000000000000000000000000010000000006C :10A4E000000000000000000000000000000000006C :10A4F000000000000000000000000000000000005C :10A50000000000000010000000000000000000003B :10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000001000000B +:10A52000000000000010000000000000000000001B +:10A53000000000000000000000000000000000001B :10A54000000000000000000000000000000000000B :10A5500000000000000000000000000000000000FB -:10A5600000000000000800000000000000000000E3 +:10A5600000000000000000000000000000000000EB :10A5700000000000000000000000000000000000DB -:10A5800000000000000000080000000000000000C3 +:10A5800000000000000000000000000000000000CB :10A5900000000000000000000000000000000000BB -:10A5A000000000000000001000000000000000009B -:10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000090000B +:10A5C0000000000000008400000000000000000007 :10A5D000000000000000000000000000000000007B :10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B -:10A6000000008800000000000000000000000000C2 +:10A6000000000000000000008400000000000000C6 :10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A +:10A6200000000000400000000000000000000000EA :10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A +:10A6400000000000000000200000000000000000EA :10A6500000000000000000000000000000000000FA :10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA :10A6800000000000000000000000000000000000CA :10A6900000000000000000000000000000000000BA :10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000020000000007A +:10A6B000000000000000000000000000000000009A :10A6C000000000000000000000000000000000008A -:10A6D00000000000000000000000840000000000F6 -:10A6E00000000000000000000000000000008400E6 +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A :10A700000000000000000000000000000000000049 :10A710000000000000000000000000000000000039 -:10A720000000840000000000000000008400000021 -:10A7300000001000410000000000000003000000C5 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 :10A740000000000000000000000000000000000009 :10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000500000003000000E1 -:10A7700010000000000021000000000000000000A8 -:10A7800003000000000000000000000000000000C6 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 :10A7900000000000000000000000000000000000B9 -:10A7A0000000000000000000000040001000000059 -:10A7B0000000000000000000000000000800000091 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 :10A7C0000000000000000000000000000000000089 :10A7D0000000000000000000000000000000000079 :10A7E0000000000000000000000000000000000069 :10A7F0000000000000000000000000000000000059 :10A800000000000000000000000000000000000048 :10A810000000000000000000000000000000000038 -:10A8200000000000000000000000840000000000A4 +:10A820000000000000000000000000000000000028 :10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 +:10A840000000000000000000008400000000000084 :10A8500000000000000000000000000000000000F8 :10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 +:10A8700004000000000000000000000000000000D4 :10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 +:10A8900000000400000000000000000000000000B4 :10A8A00000000000000000000000000000000000A8 :10A8B0000000000000000000000000000000000098 :10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 +:10A8D0000000000200000000000000000000000076 :10A8E0000000000000000000000000000000000068 -:10A8F0000000100000000000000000000000000048 +:10A8F0000000000000000000000000000000000058 :10A900000000000000000000000000000000000047 :10A910000000000000000000000000000000000037 :10A920000000000000000000000000000000000027 :10A930000000000000000000000000000000000017 -:10A9400000000000000000004100000000000000C6 -:10A9500000000000000800000000000000001000DF +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 :10A9600000000000000000000000000000000000E7 :10A9700000000000000000000000000000000000D7 -:10A9800008000000000000000000000000000000BF +:10A9800000000000000000000000000000000000C7 :10A9900000000000000000000000000000000000B7 -:10A9A000000000000000000000000000000008009F +:10A9A00000000000000000000000000000000000A7 :10A9B0000000000000000000000000000000000097 :10A9C0000000000000000000000000000000000087 :10A9D0000000000000000000000000000000000077 @@ -56129,98 +56129,98 @@ :10B32000000000000000000000000000000000001D :10B33000000000000000000000000000000000000D :10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000004000AD -:10B3600000000000000010000000000000020000CB -:10B3700000002000200000000000200800089000CD -:10B3800000009000100020000000000088008800ED -:10B39000000020002000000000002088008800033A -:10B3A000000000000000C0000000000000100000CD -:10B3B0000000000000002000000000002004002029 -:10B3C000000000000000200000000000A002C000FB -:10B3D0000000000000000000000000000008000065 -:10B3E000100000000000000000000000000000004D -:10B3F000000000000000000000000000000010003D +:10B3500000000000000000000000000000000000ED +:10B3600000000004000000000000000000000000D9 +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000200000000000000009B +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000100000003D :10B40000000000000000000000000000000000003C -:10B4100000000000000000000000000000200010FC +:10B4100000000000000000000000000000004000EC :10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000010B -:10B440004001000021000000000000002100000079 -:10B45000400000000000000000000000000010009C +:10B4300010000000000000000000000000000000FC +:10B4400000004000000000000000000000000000BC +:10B4500000000000000000000000000000001000DC :10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000008C4 -:10B48000200000000000000000000000000000009C -:10B490000000000000000000000000000000008824 -:10B4A00040800000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C :10B4B000000000000000000000000000000000008C -:10B4C0000088208000000000000000000000000054 +:10B4C000000000000000000000000000000000007C :10B4D000000000000000000000000000000000006C -:10B4E0000008400400000000000000000000000010 -:10B4F000000000000000000000000000000000004C -:10B5000000018000000000000000000000000000BA -:10B51000000000000000000000000000000000002B -:10B520000005802000000000000000000000000076 -:10B53000000000000000000000000000000000000B -:10B540000000002180100000000009000000000041 -:10B5500000000000000000000000000000000000EB -:10B560000000000180010000000000000000000059 -:10B5700000000000000000000000000000000000CB +:10B4E00000000000000000000084000000080008C8 +:10B4F000000800000008000000080008000800081C +:10B500000000000000000000000800000008000823 +:10B5100000080000000800000008000800080008FB +:10B520000008000000000000000000080000000803 +:10B5300000080008000000080000000800080008DB +:10B5400000080008000000000000000800000008DB +:10B5500000080008000000080000000800080008BB +:10B5600000080008000000000000000800000000C3 +:10B570000000000000000000000000054000000086 :10B5800000000000000000000000000000000000BB :10B5900000000000000000000000000000000000AB -:10B5A0000000000000000000000000030000000098 -:10B5B0000000000000000400000000000000000087 +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B :10B5C000000000000000000000000000000000007B :10B5D000000000000000000000000000000000006B -:10B5E000001100000000000000000000000000004A -:10B5F000000000000000000000000000000000004B -:10B600000000000000000000000000000000090031 -:10B610000000000000000000000009000000000021 -:10B620000900000000000000000000000000000011 +:10B5E000000000000000000000000000000000005B +:10B5F0000000000000000000000000000000040047 +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A :10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000009000000410000000000A0 -:10B6600008000000000000000400820000008200CA -:10B670008200000000000000000000000000000048 -:10B680000000000000000000088808000000000022 -:10B69000000000000000000000008400C000A000C6 -:10B6A000A0000000C0008400C084000082004000B0 -:10B6B0001000000000000000000000000800000072 -:10B6C00008000000000000000000008800000000EA -:10B6D00082000000000000000000A0000000000048 -:10B6E000000010000000A0000000828800000000A0 +:10B6400004000000000000000000000000000000F6 +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A :10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000030000000036 +:10B700000000000000000000000000000000000039 :10B710000000000000000000000000000000000029 -:10B720000000000000000000000000090000000010 +:10B720000000000000000000000000000000000019 :10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000030000F6 +:10B7400000000000000000000000000000000000F9 :10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000000210000B8 -:10B77000000000000000100000008200080000002F -:10B780000000000000000000000000000000200099 -:10B790000000040004000000C00040008200C0005F -:10B7A00000004000000000009004000000000000C5 -:10B7B00008000000080008000011000082000800D6 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 :10B7C0000000000000000000000000000000000079 -:10B7D00000000000000000000000880040000000A1 -:10B7E00000000000000000000400880000000011BC +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 :10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 +:10B8000000000000000000900000000000000000A8 :10B810000000000000000000000000000000000028 :10B820000000000000000000000000000000000018 :10B830000000000000000000000000000000000008 :10B8400000000000000000000000000000000000F8 -:10B8500004000000000000000000000000000000E4 +:10B8500000000000000000000000000000000000E8 :10B8600000000000000000000000000000000000D8 -:10B8700000000000C00000000800080008000000F0 -:10B880000000000000000000C000000000000000F8 -:10B89000000000000000000000000800000084001C -:10B8A0008400000000000000000000000000000014 -:10B8B0000000000000008200820082000800820078 -:10B8C0000000000000000000000010000000000068 -:10B8D00000000000000000000000840000000000E4 -:10B8E0000000000000008400000084000000000050 -:10B8F0000800000000000000000000000000000040 -:10B9000000000000000000000000000000900000A7 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000008B0 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 :10B910000000000000000000000000000000000027 :10B920000000000000000000000000000000000017 :10B930000000000000000000000000000000000007 @@ -56228,79 +56228,79 @@ :10B9500000000000000000000000000000000000E7 :10B9600000000000000000000000000000000000D7 :10B9700000000000000000000000000000000000C7 -:10B980000000000100400001200000028290000041 -:10B9900000000001000000000000000000010000A5 -:10B9A0008800000001020100C0000020C0820000E9 -:10B9B000C0000001000000000000000000000001C5 -:10B9C00000000000000001020100C1000040C08230 -:10B9D0000000C000000100000000000000000000A6 -:10B9E00000000000000000900000C0000090C08235 -:10B9F0000000C00000010000000000000000000581 -:10BA000000000000000205004010210000808000BE -:10BA100000000000004100000000000000000010D5 -:10BA200000000000000303801005820000008080F9 -:10BA30000000800000030000000000000000000083 -:10BA400000020000000000030280100590000000CA -:10BA50008080000080000003000000000000000063 -:10BA600000080200000000410800000883000000F8 -:10BA70008080000080000003000000004000000003 -:10BA800000000000400000002000A00005000000B1 -:10BA9000020000000000000080080000100000000C -:10BAA00000000000080000002000A000108000102E -:10BAB0000300000000000080802000000000100053 -:10BAC000000000000000030000000500C000C0806E -:10BAD0000010030000000000008080050000080046 -:10BAE00000000000000008000000100041002000DD -:10BAF00000400300000000000080802000000000E3 -:10BB00000000000000000000000000000400900899 -:10BB100000000100900000000000C00100000000D3 -:10BB2000000000000000010000000000400089202B -:10BB3000000101009000000000C082000000000031 -:10BB400001000000000000000000000000004000B4 -:10BB50000220000101008200000000C082000000FD -:10BB600000000000000000000000000000001000C5 -:10BB70009008000001009000000000C0820000005A -:10BB8000000000000000000000000000820100A092 -:10BB900000000000000000000000000100000000A4 -:10BBA00000000000000000000000000190010040C3 -:10BBB0000000110000000000000000000000000074 -:10BBC00000000000000000000000000000009001E4 -:10BBD000000800000100000000000000000000005C -:10BBE0000000000000000000000000000001040050 -:10BBF0000010000001000000000000000000000034 -:10BC00000000000000000000000000000020001004 -:10BC100000000000200000000000000000410000C3 -:10BC200000000000000000000000000000080020EC -:10BC300000800000C1000000000000000041000082 -:10BC400000000000000000000000000000000041B3 -:10BC50000020000000004100000000000000004142 -:10BC600000000000000000000000000000000008CC -:10BC7000800300800000410000000000000000413F -:10BC800000000040800000C1000000088000880023 -:10BC9000000000C1000000400000000000000000A3 -:10BCA00008050010800000C1000000030020C10052 -:10BCB00000000041000000080000004100000000FA -:10BCC000200300000010800000C10000000280007E -:10BCD000C00000000041800000080000004100009A -:10BCE000000040080008800000C1000000080010AB -:10BCF000C1000000004100080003000000410000F6 -:10BD000000000520000020000040000000000400AA -:10BD100040000000000340000000000000000000A0 -:10BD200000000108000020000040000000000800A2 -:10BD30008200000000110800000000000001000067 -:10BD40000000008800000001200000400000000109 -:10BD500004000400000000210400000000000001B5 -:10BD60000000000000090000200000400000000169 -:10BD70008801820000000011200000010000000185 -:10BD8000000000000089000000000000000000002A -:10BD9000000000000000811200E0070048000000E1 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 :10BDA0000000000000000000000000000000000093 -:10BDB000000000000000811200E040004842000046 -:10BDC00000000000484200000000000000000000E9 -:10BDD0000000000000000000811200E04000484226 -:10BDE00000000000000048420000000000000000C9 -:10BDF0000000000000000000811200E080004842C6 -:10BE000000000000000048420000000000000000A8 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 :10BE10000000000000000000000000000000000022 :10BE20000000000000000000000000000000000012 :10BE30000000000000000000000000000000000002 @@ -56316,115 +56316,115 @@ :10BED0000000000000000000000000000000000062 :10BEE0000000000000000000000000000000000052 :10BEF0000000000000000000000000000000000042 -:10BF0000000000000000000000000000757B000041 +:10BF00000000000000000000000000000000000031 :10BF10000000000000000000000000000000000021 -:10BF200000000000000000000000DEAE757B000095 +:10BF20000000000000000000000000000000000011 :10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000DEAE0000757B75 +:10BF400000000000000000000000000000000000F1 :10BF500000000000000000000000000000000000E1 -:10BF6000000000000000000000000000DEAE757B55 +:10BF600000000000000000000000000000000000D1 :10BF700000000000000000000000000000000000C1 -:10BF8000000000000000000000000000DEAE61269E -:10BF900003400000000000000230A000000000008C -:10BFA00000000C4000000000000002C06486612612 -:10BFB00003400000000000000230A000000000006C -:10BFC00000000C4000000000000002C06486000079 -:10BFD000612603400000000000000230A0000000C5 -:10BFE000000000000C4000000000000002C0648659 -:10BFF000612603400000000000000230A0000000A5 -:10C00000000000000C4000000000000002C0648638 -:10C010000000000000000000000000000000000020 -:10C0200000000000000000002000000000002000D0 -:10C03000000000004000000010000000A000000010 -:10C040004000A00000004000200000000000200090 -:10C0500000000000000020000000000000000000C0 -:10C0600000000000000000000000200000000000B0 -:10C070002000000000000000000000001000A000F0 -:10C0800000000000C00000000000200000000000D0 -:10C090002000000000000000000000000000000080 -:10C0A0000000000000000000000008000000000088 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C0100000000000000004000000000040000000DC +:10C0200000000000000020000000000000000000F0 +:10C0300000004000000000000000000020000000A0 +:10C0400000000000000020000000000000000000D0 +:10C050000003040020000000000000000000200099 +:10C060000000400000000000200000000000000070 +:10C070000000000020000000000000000000200080 +:10C080000000200000000000200000000000000070 +:10C090000000000000000000800000000000000020 +:10C0A0000000000000000000000000000000000090 :10C0B0000000000000000000000000000000000080 -:10C0C000100021000000000000000000000000003F -:10C0D0000000000000000000000000000000000060 +:10C0C000000400000000000000000000000000026A +:10C0D00000000000800000000000000000000000E0 :10C0E0000000000000000000000000000000000050 -:10C0F000000000000000000000000004000000003C -:10C1000010000000100021000000000000000000EE -:10C11000009000000000000000000000000000008F -:10C12000000000000000001100009000000000006E -:10C1300000000000000000000000000000000000FF -:10C14000000000000000000000009000000000005F -:10C1500000000000000000000000000000000000DF -:10C16000000000000000000000000000900000003F +:10C0F0000000000000000000000000000000000040 +:10C10000000200000000000000000000000000002D +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000020000000000FD +:10C1400000000000000000000000000000000000EF +:10C15000000000000000000000000000004000009F +:10C1600000000000000000000000000000000000CF :10C1700000000000000000000000000000000000BF -:10C18000000000000000000000000000900000001F -:10C19000000000000000000000000000000000009F +:10C1800000000000020000000000000000000000AD +:10C19000000000000000000000080008000000008F :10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D0000000000000000000000000000000000857 -:10C1E000000000000000000800000000000000083F -:10C1F0000000000000000000000000000000000837 -:10C2000000000000000000400000000000000008E6 +:10C1B0000000000000000000000800040000000073 +:10C1C0000000000000080000000000000000000067 +:10C1D00000000000008400000000000400000000D7 +:10C1E0000000000000000008000000000000000047 +:10C1F000000000000000000000000000000000003F +:10C20000000000000000001000000000000000001E :10C21000000000000000000000000000000000001E :10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE +:10C2300000000000000000080000000000000000F6 :10C2400000000000000000000000000000000000EE :10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE +:10C2600000000000000000000010000000000000BE :10C2700000000000000000000000000000000000BE :10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000041005D -:10C2A0000300410008004100000000000000000001 -:10C2B000000000000000000000000000000004007A -:10C2C0000404200400902000000000000000090089 -:10C2D00011004004000000001000000000000000F9 -:10C2E000000000000000100000000000000000003E -:10C2F00000000000000000000000400000000000FE -:10C30000000011000000410041001000000000008A -:10C31000008241044088110000000000000000007D -:10C32000A0000000000000000000820000000000EB +:10C29000000000004000000000000000000000005E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D :10C3300000000000000000000000000000000000FD -:10C34000000000000000000000000000C00000002D +:10C3400000000000000000200000000000000000CD :10C3500000000000000000000000000000000000DD :10C3600000000000000000000000000000000000CD -:10C37000000000000000A00000000000000000001D -:10C3800000000000000000000000000000000000AD -:10C390000000C00000000000000000008400000059 -:10C3A000000000000000000000000000000000008D -:10C3B00000000000000000820090000000840000E7 -:10C3C0000000000000000000000000000008000065 -:10C3D0000000000000080000000000000000000055 -:10C3E00000000000000000840000000000000000C9 +:10C3700000000000000000000000000000000800B5 +:10C38000000000000000000000000000000082002B +:10C390000000000004000000000000000000000099 +:10C3A00000000000000000000000000000A00000ED +:10C3B000000000000000000000000000000000007D +:10C3C000000000000010000000010000000000005C +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D :10C3F000000000000000000000000000000000003D :10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C -:10C42000000040000000C00000000000000000000C +:10C41000000000000000800000000000000000009C +:10C42000000200000000000000000000000000000A :10C4300000000000000000000000000000000000FC -:10C4400000000000000000080000400000000000A4 +:10C4400000000000000008000000000000000000E4 :10C4500000000000000000000000000000000000DC :10C4600000000000000000000000000000000000CC :10C4700000000000000000000000000000000000BC -:10C48000000000000000080090008200040000008E -:10C4900088000000000000000000000000200400F0 -:10C4A0000000000000000000000000000000080084 -:10C4B0000000080000000300080000040000000065 -:10C4C000030400000000090000000000009040206C -:10C4D0000004110040900000100000200004000043 -:10C4E0000900000003000000000000000800000038 -:10C4F00008000000210008000000080000040000FF -:10C5000000000000000000000000000004004020C7 -:10C510004090002041000500000000000490000051 -:10C520000000050000000000000000000000000006 -:10C53000000000000000000000800000000000007B -:10C5400000000000000000000000001000000000DB +:10C4800000000000000000000000000000000000AC +:10C490000000000084000000000000000000000018 +:10C4A0000400000000000000000000000000000088 +:10C4B000000000000000000000000000000000007C +:10C4C0000400000000000000000000000000000068 +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B +:10C52000000080000000010000000000000000008A +:10C5300000000008000000000000000000000000F3 +:10C5400000000000000000000000000000000000EB :10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000800C3 -:10C5700000000000001008000000000000000000A3 +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB :10C5800000000000000000000000000000000000AB :10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B0000000000000040000000000100000000067 -:10C5C0000900000000000000000000000000000062 +:10C5A00000000000000000000800000021840000DE +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B :10C5D000000000000000000000000000000000005B :10C5E000000000000000000000000000000000004B :10C5F000000000000000000000000000000000003B @@ -56437,7 +56437,7 @@ :10C6600000000000000000000000000000000000CA :10C6700000000000000000000000000000000000BA :10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A +:10C69000000000000000000000000000200000007A :10C6A000000000000000000000000000000000008A :10C6B000000000000000000000000000000000007A :10C6C000000000000000000000000000000000006A @@ -56445,24 +56445,24 @@ :10C6E000000000000000000000000000000000004A :10C6F000000000000000000000000000000000003A :10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 +:10C7100000000000000000000000000020000000F9 +:10C720000000000003000000000000000000000006 +:10C730000000800000000000000000000000000079 :10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 +:10C750000000000000000080000000000000000059 :10C7600000000000000000000000000000000000C9 :10C7700000000000000000000000000000000000B9 :10C7800000000000000000000000000000000000A9 :10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 +:10C7A0000000000000000000000000000080000009 +:10C7B00000000000900000000000000000000000E9 :10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 +:10C7D000000000000000000000C000000000000099 +:10C7E0000000000000000000000000000000000247 :10C7F0000000000000000000000000000000000039 :10C800000000000000000000000000000000000028 :10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 +:10C82000000000000000000000000000000000C048 :10C8300000000000000000000000000000000000F8 :10C8400000000000000000000000000000000000E8 :10C8500000000000000000000000000000000000D8 @@ -56479,15 +56479,15 @@ :10C900000000000000000000000000000000000027 :10C910000000000000000000000000000000000017 :10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 +:10C930000000000000100080000000000000000067 :10C9400000000000000000000000000000000000E7 :10C9500000000000000000000000000000000000D7 :10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 +:10C9700000000000000000080000000000000000AF :10C9800000000000000000000000000000000000A7 :10C990000000000000000000000000000000000097 :10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 +:10C9B0000000000000000000000200000000000075 :10C9C0000000000000000000000000000000000067 :10C9D0000000000000000000000000000000000057 :10C9E0000000000000000000000000000000000047 @@ -56495,15 +56495,15 @@ :10CA00000000000000000000000000000000000026 :10CA10000000000000000000000000000000000016 :10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 +:10CA3000000000000000000000810000070000006E :10CA400000000000000000000000000000000000E6 :10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 +:10CA6000000000000700600000000000000000005F +:10CA7000000000000000000000000081000007002E :10CA800000000000000000000000000000000000A6 :10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 +:10CAA0000000000000000000000000410000120033 +:10CAB00000000041000082000012000000000000A1 :10CAC0000000000000000000000000000000000066 :10CAD0000000000000000000000000000000000056 :10CAE0000000000000000000000000000000000046 @@ -56520,7 +56520,7 @@ :10CB90000000000000000000000000000000000095 :10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 +:10CBC0000000FFFF555500000000000000000000BD :10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 :10CBF0000000000000000000000000000000000035 @@ -56528,7 +56528,7 @@ :10CC10000000000000000000000000000000000014 :10CC20000000000000000000000000000000000004 :10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 +:10CC400000000000FFFF555500000000000000003C :10CC500000000000000000000000000000000000D4 :10CC600000000000000000000000000000000000C4 :10CC700000000000000000000000000000000000B4 @@ -56536,15 +56536,15 @@ :10CC90000000000000000000000000000000000094 :10CCA0000000000000000000000000000000000084 :10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 +:10CCC0000000000000200000000000000000000044 :10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 +:10CCE0000000000000000000000000000A0000003A :10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 +:10CD000000000000050000200000000000000000FE :10CD10000000000000000000000000000000000013 :10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 +:10CD30000000000000000060100000A000000020C3 +:10CD4000000001A000000000000000000000000042 :10CD500000000000000000000000000000000000D3 :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 @@ -56577,177 +56577,177 @@ :10CF20000000000000000000000000000000000001 :10CF300000000000000000000000000000000000F1 :10CF400000000000000000000000000000000000E1 -:10CF500000000000200000000000000000000000B1 -:10CF600000000000000000000000200000000000A1 -:10CF70000000000020000000000000000000000091 -:10CF80000000100000000000000020000000000071 -:10CF90000000000000002000000000000000000071 -:10CFA0000000000000000000000000002000000061 -:10CFB0000000000000004000400000001000C00021 -:10CFC00000000400000088000000000020000000B5 -:10CFD000000000000000000000000000000000024F -:10CFE000000000000000000000020000000000003F -:10CFF0000000000000000000000000000000000031 -:10D0000000002100000000000000000000000000FF -:10D0100000000000000010000000000000001000F0 -:10D0200000000000000000000000000000001000F0 -:10D0300000000000000021000000000000000000CF -:10D0400000000000000000000000000000020000DE -:10D05000000000000000C0000200020000100000FC -:10D060000400020004000420000000000000004151 -:10D0700000000000000000000000000000100000A0 -:10D08000000000000000000000000000000000415F -:10D090000000000000000000000000000000001080 +:10CF50000000000040000000000000000080008091 +:10CF60000020000000000000000020000000000081 +:10CF70000000000020004000000000000000000051 +:10CF8000000000000000000000002000000300007E +:10CF90000000000000002000200000000000000051 +:10CFA00040004000000000000000000020000000E1 +:10CFB0000000000000002000000000000000000051 +:10CFC0000000000000000000000000002000000041 +:10CFD0000000000000000000000000000000002031 +:10CFE000002000010000000000000002000000001E +:10CFF000000000000002000000000000100000001F +:10D00000000000020000000000000000000000001E +:10D01000000000000002000000000000000200000C +:10D0200040000000000000020000000000000000BE +:10D0300000000000000000000000000000020000EE +:10D0400000000000000000000000000200000000DE +:10D0500002000200020004000000000000000000C6 +:10D0600004000400040004000000000000000000B0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 :10D0A0000000000000000000000000000000000080 -:10D0B000004100000000000000000000000000101F -:10D0C0000010000000000000000000000000000050 -:10D0D000004100000000000000008000800000000F -:10D0E000000080008000800080010000000000003F -:10D0F0000000000000000000000800000000000028 -:10D10000000000000000000000820000000000009D -:10D11000008800000000000000000008000000007F -:10D1200000000008000000000000000000000000F7 -:10D1300000000008000000000000000800000000DF -:10D1400000000008000000000000000000000000D7 -:10D150000000008400000000000000000000080043 -:10D1600000030800000008000000000000050000A7 -:10D170000000000884030000000000000000000020 -:10D18000040000410003000004000400000000004F -:10D19000100000000000000000000000000000007F -:10D1A00000000000000000008200000008000000F5 -:10D1B00000000000000084000400000040000000A7 -:10D1C0000400040004008400880004000000000043 -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000200000000040 +:10D0D0000000800080008000800000000000000050 +:10D0E0000000800080008000800000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000010000DE +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000041000000000AB +:10D17000000000410000000000000000000000006E +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000400F +:10D1E00000000000000000000000000080010000BE :10D1F000000000000000000000000000000000002F -:10D2000000000000002000000004000000000000FA +:10D20000000000000000000000000000000000001E :10D21000000000000000000000000000000000000E :10D2200000000000000000000000000000000000FE :10D2300000000000000000000000000000000000EE -:10D2400000000900000000000000000000000400D1 -:10D2500000000000000000000200000000000000CC -:10D26000002000200020000000000020000000003E +:10D2400010000800000000000000000000000000C6 +:10D2500000000000000000000080002000200040CE +:10D2600000000000000000000000000000000000BE :10D2700000000000000000000000000000000000AE :10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000C0000000CE +:10D29000000000000000000000000000000000008E :10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E -:10D2C0000000080000000000000000000000000056 -:10D2D00000000000000000000000800000000000CE -:10D2E000000000010001000100000000000100003A +:10D2C000000010000000000000000000000000004E +:10D2D0000000C000840000000000002000010001E8 +:10D2E000000100000000000000000000000000003D :10D2F000000000000000000000000000000000002E :10D30000000000000000000000000000000000001D :10D31000000000000000000000000000000000000D :10D3200000000000000000000000000000000000FD :10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000002000000CB -:10D36000A000840000000000A000A0000000004118 -:10D37000000000410000000000000021000000004B -:10D380000000000000000000000000080000000095 -:10D390000000000000000000100000080000000075 +:10D350000000000000000000000000000000C0000D +:10D3600000000000C00000000000000200000000FB +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D :10D3A000000000000000000000000000000000007D :10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D -:10D3D00000000000000000000000000000008000CD +:10D3D0000800000000002000000000000000000025 :10D3E000000000000000000000000000000000003D :10D3F000000000000000000000000000000000002D -:10D4000004000000000000204000000000000000B8 -:10D4100040000000000400000000040000000000C4 +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C :10D4200000000000000000000000000000000000FC :10D4300000000000000000000000000000000000EC -:10D44000000000000000002000000000400000007C -:10D45000000000000000000010000020000000009C -:10D4600002000000A000840800000000A10001806C -:10D470000041000000050008000000000010000549 -:10D48000002100000000004100000000000000003A +:10D4400000000000000000000000000000000000DC +:10D45000000000000000000080000000000000004C +:10D460000000000000000002000000000020002179 +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C :10D49000000000000000000000000000000000008C :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E00000008000000000000000000000000200BA -:10D4F0000220000000000000000000000000000109 +:10D4D00000000000000008000000820000000200C0 +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C :10D50000000000000000000000000000000000001B :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB :10D5400000000000000000000000000000000000DB :10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000C01040AB -:10D570000008840200C01040000884C000000000C1 +:10D560008000000001C01040000420020000000004 +:10D5700000000000000000000000000000000000AB :10D58000000000000000000000000000000000009B :10D59000000000000000000000000000000000008B :10D5A000000000000000000000000000000000007B :10D5B000000000000000000000000000000000006B :10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B -:10D5E00000000000000000000000000000000280B9 -:10D5F000808005808080028080800580800000001F +:10D5E00000000000000040808080008000000000FB +:10D5F000000000000000000000000000000000002B :10D60000000000000000000000000000000000001A :10D61000000000000000000000000000000000000A :10D6200000000000000000000000000000000000FA :10D6300000000000000000000000000000000000EA :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D670008000800380418080800080038041808022 +:10D660000300000005000000800080888041808069 +:10D6700000000000000000000000008000000080AA :10D68000000000000000000000000000000000009A :10D69000000000000000000000000000000000008A :10D6A000000000000000000000000000000000007A :10D6B000000000000000000000000000000000006A :10D6C000000000000000000000000000000000005A :10D6D000000000000000000000000000000000004A -:10D6E000000000000000000000000000000000003A -:10D6F0000000400040C00801C00840004000080190 -:10D70000C008000000000000000000000000000051 +:10D6E00000000041004100050000400040C104016D +:10D6F000C0080000000000000000000000C00000A2 +:10D700000002000000000000000000000000000017 :10D710000000000000000000000000000000000009 -:10D7200000000000000000000000000000000000F9 +:10D7200000000000000000000000000200000000F7 :10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D770000000000002040082408401C002400082D8 -:10D78000C08401C000000000000000000000000094 +:10D7600000000000000000000000000088A000820F +:10D77000088401C00000000000000000010000005B +:10D78000C0000000000000000000000000000000D9 :10D790000000000000000000000000000000000089 :10D7A0000000000000000000000000000001000078 :10D7B0000000000000000000000000000000000069 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 -:10D7F000000000000000898000800080418080805F -:10D8000000808080418000000000000000000000D7 +:10D7E0000000000000000100000000000000100028 +:10D7F00000808080418000000000000000004100A7 +:10D800000000800000000000000000000000000098 :10D810000000000000000000000000000000000008 :10D8200000000000000000000000000000000001F7 :10D8300000000000000000000000000000000000E8 :10D8400000000000000000000000000000000000D8 :10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000008008802180C000003F -:10D880008000800880880000000000000000000088 +:10D860000000000000000000410000000000000077 +:10D870008000801080080000000000000000000010 +:10D880000000000000000000000000000000000098 :10D890000000000000000000000000000000000088 :10D8A0000000000000000000000000000000000078 :10D8B0000001000000000000000000000000000067 :10D8C0000000000000000000000000000000000058 :10D8D0000000000000000000000000000000000048 :10D8E0000000000000000000000000000000000038 -:10D8F00000000000000000000000C001820084045D -:10D900004002C00040008405C0A0000000000000EC +:10D8F0000000C0008200842102040000000000003B +:10D900000000000000000000000000000000000017 :10D910000000000000000000000000000000000007 :10D9200000000000000000000000000000000000F7 :10D9300000000001000000000000000000000000E6 :10D9400000000000000000000000000000000000D7 :10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 -:10D9700000000000000000000000000000000000A7 -:10D980004000004200000000400000420000000093 +:10D960000000000000000000000000002000000097 +:10D9700000000000000000004000504200000000D5 +:10D980000000000000000000070448420000000002 :10D990000000000000000000000000000000000087 :10D9A0000000000000000000000000000000000077 :10D9B0000000000000000000000000000000000067 :10D9C0000000000000000000000000000000000057 :10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000000037 -:10D9F0000000000000000000000000000000000027 +:10D9E00000000000000000000000000000008800AF +:10D9F000004107004200000000000000000000009D :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 :10DA200000000000000000000000000000000000F6 @@ -56763,9 +56763,9 @@ :10DAC0000000000000000000000000000000000056 :10DAD0000000000000000000000000000000000046 :10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000430840000084218641084000008452 -:10DB100021060000000000000000000000000000DE +:10DAF00000000000FFFF0000000043084000008419 +:10DB0000218600000000000000000000000000006E +:10DB10000000000000000000000000000000000005 :10DB200000000000000000000000000000000000F5 :10DB300000000000000000000000000000000000E5 :10DB400000000000000000000000000000000000D5 @@ -56788,14 +56788,14 @@ :10DC500000000000000000000000000000000000C4 :10DC600000000000000000000000000000000000B4 :10DC700000000000000000000000000000000000A4 -:10DC80000000000000100000100020080040000804 -:10DC90000000000800000008000000000000000074 +:10DC80001000200800400008000000000000000014 +:10DC900005180A00050004A00000000000000000B4 :10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 :10DCC0000000000000000000000000000000000054 :10DCD0000000000000000000000000000000000044 :10DCE0000000000000000000000000000000000034 -:10DCF0000000000000000000000000000000000024 +:10DCF0000000000000000000000085610007800DAA :10DD00000000000000000000000000000000000013 :10DD10000000000000000000000000000000000003 :10DD200000000000000000000000000000000000F3 @@ -56828,25 +56828,25 @@ :10DED0000000000000000000000000000000000042 :10DEE0000000000000000000000000000000000032 :10DEF0000000000000000000000000000000000022 -:10DF000000000000000000000000400000000000D1 -:10DF10000000000000000000000000000000000001 -:10DF200000000000000020002000000000000000B1 -:10DF300000020000000000000000000000000000DF -:10DF40000000400000000000200000000000000071 -:10DF500000000000000000000000000000000000C1 -:10DF60000000000000000000000020000000000091 -:10DF70000000000000000000000000001000000091 -:10DF8000000000040000000000002000000000006D -:10DF90000000000000000000000000000000000081 -:10DFA00040000000000000000000000040000000F1 -:10DFB0000000100000000000000040000000000011 -:10DFC0000000000000001000000000000000000041 +:10DF00000000000000000000000000000000000011 +:10DF100000000000000000000000000020000000E1 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000020000002BF +:10DF400000000000000000000002000000000000CF +:10DF5000000000000000000000000000000020029F +:10DF60000000000000000000000000004000000071 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000100071 +:10DFA000000000000000000000020000000000006F +:10DFB0000000000000000000000000000000000061 +:10DFC000000000000000000000020000000040000F :10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000001000000021 +:10DFE000000000000000000000000002000000002F :10DFF0000000000000000000000000000000000021 :10E000000000000000000000000000000000000010 -:10E0100008000000000000000000000000000000F8 -:10E0200000000000004000000000000000000000B0 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 :10E0300000000000000000000000000000000000E0 :10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 @@ -56854,30 +56854,30 @@ :10E0700000000000000000000000000000000000A0 :10E080000000000000000000000000000000000090 :10E090000000000000000000000000000000000080 -:10E0A0000000000000000008000000000000000068 -:10E0B0000000000000000000000000000000000060 +:10E0A0000000000000000000000000000000000070 +:10E0B00000000000000000840000000000000000DC :10E0C0000000000000000008000000000000000048 :10E0D0000000000000000000000800000000000038 :10E0E0000000000000000000000800000000000028 -:10E0F0000008000000000000000800000000000010 +:10E0F0000000000000000000000800000000000018 :10E100000000000000000000000800000000000007 -:10E1100000100000C000000000000000000000002F -:10E12000000000000000A000000000000800000047 -:10E1300000000800000000000008400004009000FB -:10E1400000001000040000000000040004000800AB -:10E1500000000000000000000000000000000000BF -:10E1600000000000000000000000000000000400AB -:10E170000000840000000000000000000000040017 -:10E180009000000000000400000000008400000077 -:10E1900000009000000000000000000000000000EF -:10E1A000000000000000000000000000100000005F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000008000000000000D7 +:10E1400000000000000000000010000000000000BF +:10E150000000000000008800000000000000000037 +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E1800000000000000000000000000000009000FF +:10E1900000000000000000000000000000820020DD +:10E1A0000000000000000000000000A000000000CF :10E1B000000000000000000000000000000000005F :10E1C000000000000000000000000000000000004F -:10E1D0000000000800000000000000000000000037 -:10E1E0000000000000000000000000000000080027 -:10E1F000000000000000000000000000000004001B -:10E20000000000000000000000000000000000000E -:10E2100000000000000000000000000000000011ED +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E200000000000000000000080000000000000006 +:10E2100000000000000000000000000000000000FE :10E2200000000000000000000000000000000000EE :10E2300000000000000000000000000000000000DE :10E2400000000000000000000000000000000000CE @@ -56886,7 +56886,7 @@ :10E27000000000000000000000000000000000009E :10E28000000000000000000000000000000000008E :10E29000000000000000000000000000000000007E -:10E2A000000011000000000000000000000000005D +:10E2A000000000000000000000000000000000006E :10E2B000000000000000000000000000000000005E :10E2C000000000000000000000000000000000004E :10E2D000000000000000000000000000000000003E @@ -56895,22 +56895,22 @@ :10E30000000000000000000000000000000000000D :10E3100000000000000000000000000000000000FD :10E3200000000000000000000000000000000000ED -:10E3300000000000000000000000000000000000DD +:10E3300000080000000000000000000000000000D5 :10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD :10E3600000000000000000000000000000000000AD :10E37000000000000000000000000000000000009D :10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D -:10E3A000000000000000000200000000000000006B -:10E3B000000000A0000000000000000000000000BD +:10E390000000000000000000000000000000000479 +:10E3A0000000000800000000000000000000000065 +:10E3B000000000000000000000000000000000005D :10E3C000000000000000000000000000000000004D :10E3D000000000000000000000000000000000003D :10E3E000000000000000000000000000000000002D :10E3F000000000000000000000000000000000001D -:10E4000000000000000010000000000000000400F8 +:10E40000000000000000000000000000000000000C :10E4100000000000000000000000000000000000FC -:10E4200000000000000000009000900000000000CC +:10E4200000000000000000000000000000000000EC :10E4300000000000000000000000000000000000DC :10E4400000000000000000000000000000000000CC :10E4500000000000000000000000000000000000BC @@ -56919,8 +56919,8 @@ :10E48000000000000000000000000000000000008C :10E49000000000000000000000000000000000007C :10E4A000000000000000000000000000000000006C -:10E4B000000021000000000000000000000000003B -:10E4C000000000000000000000000000000000004C +:10E4B000000000000000000000000000000000005C +:10E4C0000000000000000000000000040000000048 :10E4D000000000000000000000000000000000003C :10E4E000000000000000000000000000000000002C :10E4F000000000000000000000000000000000001C @@ -57023,97 +57023,97 @@ :10EB00000000000000000000000000000000000005 :10EB100000000000000000000000000000000000F5 :10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000020000D3 -:10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000500000000000000000000C0 +:10EB50000000C01001000000C00000000000000024 :10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000000000085 +:10EB70000000000000000000000000010000010093 +:10EB80000100000000000000000000000000000084 :10EB90000000000000000000000000000000000075 :10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000004000000000000000040000000001 -:10EBD0000000000000000000000200000000000231 -:10EBE0000002000000000000100000000000000013 -:10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000020000000002 -:10EC10000000000000004000400000040000000070 -:10EC200000000000000040000000000400000000A0 -:10EC30000000000000400000004000040040000010 -:10EC400000000000080000000000000000100000AC -:10EC5000840000000000000000000010020000001E -:10EC60000000000000000000000000000010000094 -:10EC70000000000000000000000000100200000082 -:10EC80000000000000000000000000000000001074 -:10EC90000000000000000000000000000010021052 -:10ECA0000000000000000000000000000000001054 -:10ECB0000000000000000000000000000010021032 +:10EBB0000000100000000000000000000000000045 +:10EBC0000000000000000000000000000000000045 +:10EBD00000020000000108400000000000000000EA +:10EBE0000000000000000000000000000000000025 +:10EBF00000000000000000000000000000004000D5 +:10EC000008000200000400000000000200000000F4 +:10EC100000000002000040000000000000000000B2 +:10EC200000000000000000000000000000000000E4 +:10EC30000000000000000000004000000000000094 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000800000008000000000000000000000074 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 :10ECC0000000000000000000000000000000000044 :10ECD0000000000000000000000000000000000034 :10ECE0000000000000000000000000000000000024 :10ECF0000000000000000000000000000000000014 -:10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 +:10ED00000000800000008000000000000000000003 +:10ED100000000000000000000000400000000000B3 +:10ED200000000000000000000000001000000000D3 :10ED300000000000000000000000000000000000D3 :10ED400000000000000000000000000000000000C3 -:10ED5000000000000000880000000000000000002B -:10ED6000000000000000000000000000040000009F -:10ED70000000000004000400000004000000000087 +:10ED50000000000000000000000000000020000093 +:10ED600000000000000000000000000000000000A3 +:10ED70000020000000000000000000000000000073 :10ED80000000000000000000000000000000000083 :10ED90000000000000000000000000000000000073 -:10EDA000000000000000000000000400000000005F -:10EDB000040000000000000000000000000000004F +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 :10EDC0000000000000000000000000000000000043 -:10EDD00000000000000000900000000000000000A3 +:10EDD0000000000000000000000000000000000132 :10EDE0000000000000000000000000000000000023 -:10EDF0000000000000000000000000000000000013 +:10EDF0000000000100000000000000000000000012 :10EE00000000000000000000000000000000000002 -:10EE100000000000000000000000000004000000EE +:10EE100000000000000000000000000000000000F2 :10EE200000000000000000000000000000000000E2 -:10EE300000000000000004000000000000000000CE -:10EE400000000000000000000000000000000004BE -:10EE500000040004000000000000000000000000AA +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000400040000BA +:10EE500000000000000000000000000000000000B2 :10EE600000000000000000000000000000000000A2 -:10EE70000000000000000000000000000000000092 -:10EE80000000000000000000000000000000000082 +:10EE7000000000000000000000000000000008008A +:10EE80000000000000000000000000000080000002 :10EE90000000000000000000000000000000000072 :10EEA0000000000000000000000000000000000062 :10EEB0000000000000000000000000000000000052 :10EEC0000000000000000000000000000000000042 -:10EED000000000000000000011000004000000001D +:10EED0000000000000000000000000000000000032 :10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000000000000012 -:10EF00000000000000000000000000000000000001 +:10EEF0000000000009000000000000000000000009 +:10EF000000000000000000000000000000000040C1 :10EF100000000000000000000000000000000000F1 :10EF200000000000000000000000000000000000E1 :10EF300000000000000000000000000000000000D1 :10EF400000000000000000000000000000000000C1 :10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 +:10EF60000000000000000000000000000000001190 :10EF70000000000000000000000000000000000091 -:10EF80000000000000000000000000000000000081 +:10EF800000000000000090000800000001000000E8 :10EF90000000000000000000000000000000000071 :10EFA0000000000000000000000000000000000061 :10EFB0000000000000000000000000000000000051 :10EFC0000000000000000000000000000000000041 :10EFD0000000000000000000000000000000000031 :10EFE0000000000000000000000000000000000021 -:10EFF00000000000000000000020000000000000F1 -:10F000000000000000000000000000000000000000 +:10EFF0000000000000000000000000000000000011 +:10F0000000000000000000000000000000002000E0 :10F0100000000000000000000000000000000000F0 :10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000002000000000B0 -:10F0400000000000000000000000000000200000A0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000020000000000000A0 :10F0500000000000000000000000000000000000B0 :10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 :10F080000000000000000000000000000000000080 -:10F090000000000000000000000000000000000070 +:10F090000000000000000000000800000000000068 :10F0A0000000000000000000000000000000000060 :10F0B0000000000000000000000000000000000050 :10F0C0000000000000000000000000000000000040 -:10F0D0000000000000000000000000000000000030 +:10F0D000000000040000000000000000000000002C :10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 :10F1000000000000000000000000000000000000FF @@ -57122,18 +57122,18 @@ :10F1300000000000000000000000000000000000CF :10F1400000000000000000000000000000000000BF :10F1500000000000000000000000000000000000AF -:10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F +:10F16000000000000000000000000120002000005E +:10F17000002000000000000000000000000000006F :10F18000000000000000000000000000000000007F -:10F19000000000000000000000000000000000006F +:10F1900000000000A008000000880000000000003F :10F1A000000000000000000000000000000000005F :10F1B000000000000000000000000000000000004F :10F1C000000000000000000000000000000000003F :10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F +:10F1E00000000000000000000000000021000000FE :10F1F000000000000000000000000000000000000F :10F2000000000000000000000000000000000000FE -:10F2100000000000000000000000000000000000EE +:10F21000000000000000808000000080000000006E :10F2200000000000000000000000000000000000DE :10F2300000000000000000000000000000000000CE :10F2400000000000000000000000000000000000BE @@ -57141,72 +57141,72 @@ :10F26000000000000000000000000000000000009E :10F27000000000000000000000000000000000008E :10F28000000000000000000000000000000000007E -:10F29000000000000000000000000000000000006E +:10F2900000000000000000000000001000800000DE :10F2A000000000000000000000000000000000005E :10F2B000000000000000000000000000000000004E :10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E :10F2E000000000000000000000000000000000001E :10F2F000000000000000000000000000000000000E -:10F3000000000000000000000000000000000000FD -:10F3100000000000000000000000000000000000ED +:10F3000000000000000000C000000000000000003D +:10F3100000000000000000000003000000010002E7 :10F3200000000000000000000000000000000000DD :10F3300000000000000000000000000000000000CD :10F3400000000000000000000000000000000000BD :10F3500000000000000000000000000000000000AD :10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D +:10F3700000009000000000001000000000000000ED :10F38000000000000000000000000000000000007D :10F39000000000000000000000000000000000006D -:10F3A000000000000000000000000000000000005D +:10F3A000411000000000000000000000000000000C :10F3B000000000000000000000000000000000004D :10F3C000000000000000000000000000000000003D :10F3D000000000000000000000000000000000002D :10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D +:10F3F000000000000000000000008000000000008D :10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC -:10F4200000000000000000000000000000000000DC +:10F4100000000000000000000000000000000300E9 +:10F42000410091000000000000000000000000000A :10F4300000000000000000000000000000000000CC :10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C +:10F4700000000000000000008021000000000000EB :10F48000000000000000000000000000000000007C :10F49000000000000000000000000000000000006C -:10F4A000000000000000000000000000000000005C +:10F4A00080110000000000000000000000000000CB :10F4B000000000000000000000000000000000004C :10F4C000000000000000000000000000000000003C :10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C +:10F4F00000000000000000000000A0010000020069 :10F5000000000000000000000000000000000000FB :10F5100000000000000000000000000000000000EB -:10F5200000000000000000000000000000000000DB +:10F520000000C001900090004000000000000000BA :10F5300000000000000000000000000000000000CB :10F5400000000000000000000000000000000000BB :10F5500000000000000000000000000000000000AB :10F56000000000000000000000000000000000009B -:10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000007B +:10F5700000000000000000000000004100008200C8 +:10F580000000000000000000000000000000070074 :10F59000000000000000000000000000000000006B -:10F5A000000000000000000000000000000000005B +:10F5A0000000000000000041820000000000000098 :10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B :10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B -:10F5F000000000000000000000000000000000000B +:10F5F0000000000000000000000000003C003C0093 :10F6000000000000000000000000000000000000FA :10F6100000000000000000000000000000000000EA -:10F6200000000000000000000000000000000000DA +:10F620000000000000000000000000AA00AA000086 :10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA :10F6500000000000000000000000000000000000AA :10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A +:10F6700000000000000000000000000000003C004E +:10F680003C0000000000000000000000000000003E :10F69000000000000000000000000000000000006A -:10F6A000000000000000000000000000000000005A +:10F6A00000000000000000000200080000AA00AAFC :10F6B000000000000000000000000000000000004A :10F6C000000000000000000000000000000000003A :10F6D000000000000000000000000000000000002A @@ -57214,24 +57214,24 @@ :10F6F000000000000000000000000000000000000A :10F7000000000000000000000000000000000000F9 :10F7100000000000000000000000000000000000E9 -:10F7200000000000000000000000000000000000D9 +:10F7200000000000000000000000F0F000000000F9 :10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 :10F7500000000000000000000000000000000000A9 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 -:10F780000000000000000000000000000000000079 +:10F780000000000028000000000000000000000051 :10F790000000000000000000000000000000000069 -:10F7A0000000000000000000000000000000000059 +:10F7A000000000000000000000000000F0F0000079 :10F7B0000000000000000000000000000000000049 :10F7C0000000000000000000000000000000000039 :10F7D0000000000000000000000000000000000029 :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 -:10F8200000000000000000000000000000000000D8 -:10F8300000000000000000000000000000000000C8 +:10F8000000000000000000280000000000000000D0 +:10F810000000000000000000000000A00000000048 +:10F820000000000000000000000000000000A561D2 +:10F830000002050D000000000000000000000000B4 :10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 @@ -57255,7 +57255,7 @@ :10F980000000000000000000000000000000000077 :10F990000000000000000000000000000000000067 :10F9A0000000000000000000000000000000000057 -:10F9B0000000000000000000000000000000000047 +:10F9B00000000000AAAAAAAA00000000000000009F :10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 :10F9E0000000000000000000000000000000000017 @@ -57267,73 +57267,73 @@ :10FA400000000000000000000000000000000000B6 :10FA500000000000000000000000000000000000A6 :10FA60000000000000000000000000000000000096 -:10FA70000000000000000000000000000000000086 -:10FA80000000000000000000000000002000000056 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000000000000000000002000000036 +:10FA70000000000000000000200020000000000046 +:10FA80002000000400002000000000000000000032 +:10FA90000000000000000000200020000000000026 +:10FAA0002000000000000000000000000000000036 :10FAB0000000000000000000000000000000000046 -:10FAC0000000000000000000000000000000200016 -:10FAD0000000000000000000000000000000000026 -:10FAE00000000000000000000000000000002000F6 -:10FAF00000000000000010000000000040000000B6 -:10FB00004000000000000000400000000000000075 -:10FB100000000000000010001000000200020002BF -:10FB20004000000000020000000000000000000093 -:10FB300000020000000000000000000000000000C3 -:10FB400000000000000000000000000000000000B5 -:10FB50000000400000000000000000000000000065 -:10FB6000000200020002000000020000000000008D -:10FB70000002000000020000000000000000000081 -:10FB8000080000000000000000000000000000006D -:10FB90000040002100000000000000000000000004 +:10FAC0000000200000000000000000000000000016 +:10FAD00000000000A0000000000040000000000046 +:10FAE00000002000000000000000000000000000F6 +:10FAF00000000000200000000000000000000000E6 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000200000000000000000000E3 +:10FB20000000000000000000400000000000000095 +:10FB300000000000000200000000000000000000C3 +:10FB40000000000000000000000040000000000075 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000002000000000000000093 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 :10FBA0000000000000000000000000000000000055 -:10FBB0000040000000000000000000000000000005 +:10FBB0000000000000000000000000000000000045 :10FBC0000000000000000000000000000000000035 -:10FBD00000000040000000000000000000000000E5 -:10FBE0000000000000000000000000000000000015 -:10FBF00000000040000000000000000000000000C5 +:10FBD0000000000000000000000000000000000025 +:10FBE00000000000000000000000004000000000D5 +:10FBF0000000000000000000000000000000000005 :10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 -:10FC200000000000000000000000000000000000D4 -:10FC300000000000000000000000000000000000C4 -:10FC400000000000000000000000000000000000B4 +:10FC100000000000000000000000000800000000DC +:10FC200000000008000000000000000000000000CC +:10FC300000000000000000000000000400000000C0 +:10FC400000000000000800000000000000000000AC :10FC500000000000000000000000000000000000A4 -:10FC60000000000000000000000000000000000094 +:10FC60000000000000080000000000080000000084 :10FC70000000000000000000000000000000000084 -:10FC80000000000000000000000000000000000074 +:10FC80000000400000000000000000000000000034 :10FC90000000000000000000000000000000000064 -:10FCA0000000000000004000000000000000000014 +:10FCA0000000000000000000000000000000000054 :10FCB0000000000000000000000000000000000044 :10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 :10FCE0000000000000000000000000000000000014 :10FCF0000000000000000000000000000000000004 :10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 +:10FD100003000300000003000000000000000000DA :10FD200000000000000000000000000000000000D3 :10FD300000000000000000000000000000000000C3 -:10FD400000000000000000000000000000000000B3 +:10FD400000000000000000000000000000000008AB :10FD500000000000000000000000000000000000A3 :10FD60000000000000000000000000000000000093 :10FD70000000000000000000000000000000000083 -:10FD8000000000000000000000000004004100002E +:10FD8000000008000800000008000000000000005B :10FD90000000000000000000000000000000000063 :10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000000000000043 +:10FDB000000008000000000000000000000000003B :10FDC0000000000000000000000000000000000033 :10FDD0000000000000000000000000000000000023 :10FDE0000000000000000000000000000000000013 :10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000000000040000EE +:10FE000000000000000000000900000000000000E9 :10FE100000000000000000000000000000000000E2 :10FE200000000000000000000000000000000000D2 -:10FE300000000000000000000000000000000000C2 +:10FE30000000000000000000400000000000000082 :10FE400000000000000000000000000000000000B2 :10FE500000000000000000000000000000000000A2 :10FE60000000000000000000000000000000000092 :10FE70000000000000000000000000000000000082 -:10FE80000000000000000000000000000000000072 -:10FE90000000000000000000000000000000000062 +:10FE8000000000000000000000000000000800006A +:10FE9000000000000000080000000000000000005A :10FEA0000000000000000000000000000000000052 :10FEB0000000000000000000000000000000000042 :10FEC0000000000000000000000000000000000032 @@ -57341,10 +57341,10 @@ :10FEE0000000000000000000000000000000000012 :10FEF0000000000000000000000000000000000002 :10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000400000000000A1 -:10FF200000000000000000000000000000000000D1 +:10FF100000000000000000000000000000000000E1 +:10FF20000000000000004100000000000800000088 :10FF300000000000000000000000000000000000C1 -:10FF400000000000000000000000000000000000B1 +:10FF40000000000000C000000000030008000800DE :10FF500000000000000000000000000000000000A1 :10FF60000000000000000000000000000000000091 :10FF70000000000000000000000000000000000081 @@ -57360,7 +57360,7 @@ :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 +:1000300000000200000000000000000000000000BE :1000400000000000000000000000000000000000B0 :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 @@ -57521,29 +57521,29 @@ :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 -:100A40000004000000000000000010000000000092 -:100A50000000000400000000000000000000000092 -:100A60000000000000000000000020000000400026 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 :100A70000000000000000000000000000000000076 -:100A80000000000000000000000000002000000046 -:100A90002000000000000000000000000000000036 -:100AA0000000000400000000000000002000000022 -:100AB0002000000400000000000000000000000012 -:100AC0000000000000000002000000000000000024 -:100AD000000400000000000200000000000000020E -:100AE00000020000000200000002000200000000FE -:100AF00000020000000000000000000000020000F2 -:100B00004000400000020000000000000000000063 -:100B1000400000000002000000020000000000028F -:100B200040020002400200004000000200020000FB -:100B300000000002000200000000000000000000B1 -:100B4000000000000800000000000000000000009D -:100B50000000000000000010000000000000000085 -:100B60000000000000100000000000000000000075 -:100B70000000000000000010000000000000000065 -:100B80000000000000000010001000000000000045 -:100B90000000000000000000001000000000000045 -:100BA0000000000000000010001000000000000025 +:100A80000000000000000000000000000004000062 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC00000004000000000000000000000000000E6 +:100AD0000000000200000000000000000002000012 +:100AE00000000002000040000000000200000000C2 +:100AF00000000000000000000000000000020000F4 +:100B000041000000000200000000000000000002A0 +:100B100000000000000000000000000000000000D5 +:100B20000000000040020000000000000000000083 +:100B300000000002000000000000000000000000B3 +:100B4000000000000000000002000200020002009D +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 :100BD0000000000000000000000000000000000015 @@ -57553,7 +57553,7 @@ :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 -:100C400000000004000000000000000000000000A0 +:100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 :100C60000000000000000000000000000000000084 :100C70000000000000000000000000000000000074 @@ -57569,18 +57569,18 @@ :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 -:100D40000041000000000000000000400000000022 -:100D50000040004000400040000000000000000093 +:100D40000000000000400000000000000000000063 +:100D50000000000000000000000000000000000093 :100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD00000000000000000000040000000000000D3 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 +:100DA000000000000000000000000400000000003F +:100DB00000000000000000000000820000000000B1 +:100DC0000000000000000000000000000000000221 +:100DD0000000000000000000000000000000000013 +:100DE000000000000000008800000000000000007B +:100DF00000000000000000000000000000004000B3 :100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 @@ -57601,19 +57601,19 @@ :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 -:100F4000000000000000000000000000000002009F +:100F400000000000000000000000000000000000A1 :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 +:100F800000000000008000000000000000000000E1 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD000000020400004200021000000000000006C +:100FC0000000000000000000000000400040204041 +:100FD00020400000000000000000000000000000B1 :100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 +:1010000000000000000000100000000000000000D0 :1010100000000000000000000000000000000000D0 :1010200000000000000000000000000000000000C0 :1010300000000000000000000000000000000000B0 @@ -57764,232 +57764,232 @@ :101940000000000000000000000000000000000097 :101950000000000000000000000000000000000087 :101960000000000000000000000000000000000077 -:101970000000000000000000000400000000000063 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000004000000000000000000000000000A7 -:101A00000000000000000000000040000000000096 -:101A10000000000000000002009000020000000032 -:101A200000000002000000000002000200000000B0 -:101A30000000000000000000000000004000000066 -:101A40000000000000000000000000000002000094 -:101A50000002000000000000000000020002000080 -:101A60000000000200020000000000000000000072 -:101A700000000000000000040000080000800000DA -:101A80000020000000000000000000000000000036 -:101A90000000000000000000000000100000000036 +:1019700000000000000000000000000000008800DF +:101980000000000020000000000000000004200013 +:101990000000000000000000000000000000200027 +:1019A00000000000200000000000000000002000F7 +:1019B000000300000000020004000000000000001E +:1019C00020080000000020000000000000000000CF +:1019D000200088000000200020000000000000001F +:1019E000880000000000200000000000000000004F +:1019F0002000000000000000000000000084000043 +:101A00000000004000000000000000000000000294 +:101A10000000400000000000000000000000000086 +:101A200000000000000000040000000000000002B0 +:101A30000004000041000000800080000000000061 +:101A40000000000000004002000000000000000054 +:101A50000002000000000000000000000000000084 +:101A60000000000000000000000000004000000036 +:101A700000000000002004080020002000000000FA +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 :101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000010000016 -:101AC0000000000000000000000000000000000016 -:101AD00000000000000000000000000000100000F6 +:101AB0000000000000000000000000000020000006 +:101AC0000000000000000100000000000000000015 +:101AD0000000000000000000000000000000000006 :101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000020C6 -:101B00000000410100000000000041000000000052 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B800000000000000000000000900000000000C5 -:101B90000000000000000000000000000000000045 -:101BA0000400000000000000000000000000000031 +:101AF0000000000000000001800100010001000062 +:101B000000000000000000000000000000000000D5 +:101B1000000000880000000000000000000000003D +:101B200000000000000000000000000000080000AD +:101B30000000000000080000008400000000000910 +:101B40000000000000000084040000000000000805 +:101B5000000000000000001000000000000000086D +:101B600000000000000000080000000000000084E9 +:101B7000000000000000001000000000A0040000B1 +:101B80000000002100000021000000000000000013 +:101B9000000300030000002100000000000000001E +:101BA000000000000000000800000000000000002D :101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 +:101BC0000000000000000000000000030000000012 +:101BD0000000000000008800000800000000000075 +:101BE00000000003000000200000000000000000D2 +:101BF00000000000000000000000000000000001E4 :101C000000000000000000000000000000000000D4 :101C100000000000000000000000000000000000C4 :101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 +:101C3000000000000000000000000000090000009B :101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C800000000000001000840000008000000080C0 +:101C7000000000000000000000000000008800805C +:101C80000080008000800080008000800000000054 :101C90000000000000000000000000000000000044 :101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 +:101CB000000000000000000000000000000000C064 +:101CC000000000A000000000000000000000040070 +:101CD00000000000000000000000000040000000C4 :101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000002000000000000001120098800200000EF -:101D10000040000000000000000000000000000083 +:101CF00000000000000000000000000000000005DF +:101D00000004000800040020002000200020000043 +:101D100000000000000000000000000000000000C3 :101D200000000000000000000000000000000000B3 :101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000020000000000000110000000022 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 +:101D40000021000000210000000000004100000010 +:101D50008000000000000000000000000000800083 +:101D6000000000000000000000000000000008006B +:101D7000000000000000000800000000000000005B +:101D800000000000A000A0000000004000000020B3 +:101D9000000000000000000800000000000000003B +:101DA0000008000000000008000000000000000023 +:101DB000000020000000080000000000900000006B +:101DC0000000000000000000020000000000C00051 +:101DD00000000400000000000000000000000000FF +:101DE00000020000000000000000000000000000F1 +:101DF00000000000000000000003000000000008D8 +:101E000000000000000000000000000000010000D1 +:101E100000010000000000000000000000000000C1 :101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 +:101E30000000000000000000800000000000000022 +:101E40000000000000000000000080000000000012 +:101E50000000000080000000000000000000000002 +:101E60000000000100000000000000000000000071 :101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E900000000000000000C0000000000000000082 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 +:101E80000000000000000000A0000880000000002A +:101E9000010000000000000000100005000000002C +:101EA000000000080000000000000000000000002A +:101EB00000000000000001000000000020200000E1 +:101EC00000000000000000200120000000000000D1 +:101ED00000000000000004000000000000000040BE +:101EE00000000100000000000000000000000000F1 :101EF00000000000000000000000000000000000E2 -:101F0000000000000000000000000082000000004F -:101F1000419011001100000000410000000000008D -:101F200010000000000000000000000000000000A1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 +:101F0000000000000000218209001182A1080000E9 +:101F100000000400000000000000000100000000BC +:101F200000000000000000000000000000000000B1 +:101F30000000000000000000020000000000C101DD +:101F4000000000000000000021010201000000006C +:101F50000000000000000000800000000000000001 +:101F6000000100000200000000000000000000006E :101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 +:101F800000000000000000000100A10001000000AE +:101F900000C0104000088490000000000000000015 :101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 +:101FB00000000000000000000000400000000000E1 +:101FC00000000000000000000000910090200000D0 :101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 +:101FE000000000882040008208020000000000007D :101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 +:102000000000000000000000000040000321080064 +:102010000000028080800580800000000000000039 :1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 +:102030000000000000000000000000008000000020 +:102040000000000000000000000000008900808007 :102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 +:1020600000000000200000800080008000000000D0 :102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 +:10208000000000000000000000000000000500004B +:1020900000200003800080030041808000000000D9 :1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 +:1020B0000000000000000000000000008000800020 +:1020C0008009808000410000000000000000004006 +:1020D000008000218080000000000000000000005F +:1020E000000000000000800000A1000800000000C7 :1020F00000000000000000000000000000000000E0 :1021000000000000000000000000000000000000CF -:10211000000000000000000000A0000000A000007F -:102120008800000000000000000000000000000027 -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F +:1021100000A000010005400040008801C008000048 +:1021200000000000000000000000000000000000AF +:102130000000000000000000000000000000C000DF +:10214000C000C001C08200010000000800000003C0 +:10215000900100020001C09000000000000000009B +:102160000000000000000000040020820800902011 :10217000000000000000000000000000000000005F :10218000000000000000000000000000000000004F -:10219000000000000000000001000000C00000007E +:102190000100C000C000010002400082C08401C0F4 :1021A000000000000000000000000000000000002F :1021B000000000000000000000000000000000001F :1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF +:1021D000000101200088C08200C000000000000053 +:1021E0000000000000000000000020040021028820 +:1021F000009000000000000000000000000000004F :1022000000000000000000000000000000000000CE -:1022100000000000000000000000040000000000BA -:1022200004000000000000000000000000000000AA +:1022100000004000000000004000808000808080BE +:1022200041800000000000000000000000000000ED :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E +:1022500000000001410000808000008000000000BC +:1022600000000000090000000000000002800008DB :10227000000000000000000000000000000000005E :10228000000000000000000000000000000000004E -:10229000000000000000000000000000000000033B -:1022A000000000000000000000000000000000002E +:1022900000000000009000050000000080008002A7 +:1022A00080888000000000000000000000000000A6 :1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE +:1022C00000000000000900100080000000098000EC +:1022D000000000000001001100800080800000006C +:1022E00000000000000000000000000000000020CE +:1022F000001080000000000000000000000000004E :1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000010000000000000000000000000000AC +:102310000000000000000041000100000000C000BB +:1023200040008405040200000000000000000000DE :10233000000000000000000000000000000000009D -:10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D +:1023400000000000000000000001004000880000C4 +:10235000080000000000000100010040004088006B :10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D +:102370008800080140084000000000000000000044 :10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000004200008000000000000000000000006B +:1023900000000000000000008181000840000000F3 +:1023A00000000000400000420000000000000000AB :1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD -:1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD +:1023C000000000000000000000000000820000008B +:1023D000810000E0070060000000001184E0078534 +:1023E000824100000000000000000006000007001D +:1023F000000000000000820000000000000000005B :1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC :10243000000000000000000000000000000000009C :10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C +:102450000000FF66FF6600000000000000003C3C3A +:10246000FF7EF0F00000000000000000000000000F :10247000000000000000000000000000000000005C :10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C :1024A000000000000000000000000000000000002C :1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC +:1024D00000000000FF66FF66000000000000000032 +:1024E0003C3CFF7EF0F00000000000000000000017 :1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB +:102520000000000000004108400000842106000077 :10253000000000000000000000000000000000009B :10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B +:1025500000000080200600000000000000000000D5 :10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B +:10257000000000000000000000084000008420006F :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B -:1025B00000000000F0F0F0F000000000000000005B +:1025B000000000000000000000000000000000001B :1025C000000000000000000000000000000000000B :1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB +:1025E000000000FF0000FFFF42420000000000006A :1025F00000000000000000000000000000000000DB :1026000000000000000000000000000000000000CA :1026100000000000000000000000000000000000BA :1026200000000000000000000000000000000000AA -:10263000000000000000F0F0F0F0000000000000DA +:10263000000000000000000000000000000000009A :10264000000000000000000000000000000000008A :10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A +:102660000000000000FF00000000424200000000E7 :10267000000000000000000000000000000000005A :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A -:1026A00000000000000000000000000005000A38E3 -:1026B000050000A000000000000000010000000074 +:1026A0000000000005000A3FC50C00A00000000863 +:1026B0000000000800000000000000000000000012 :1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F00000000000000000000000000000000000DA -:1027000000000000000000000000000000000000C9 +:1026D000000000003000000000000005007100064E +:1026E000C00D00000000157D2A36054D04080000CD +:1026F0000000000000000500003000000000306114 +:10270000000600CD000000000000000000000000F6 :1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 +:102720000000000000000000FFFFFFFF00000000AD :102730000000000000000000000000000000000099 :102740000000000000000000000000000000000089 :102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 :102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 +:10278000000000000F0F0F0F00000000000000000D :102790000000000000000000000000000000000039 :1027A0000000000000000000000000000000000029 :1027B0000000000000000000000000000000000019 @@ -57997,9 +57997,9 @@ :1027D00000000000000000000000000000000000F9 :1027E00000000000000000000000000000000000E9 :1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 +:102800000000000000000F0F0F0F0000000000008C :1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 +:10282000000000000000000000000000FF00FFFFAB :102830000000000000000000000000000000000098 :102840000000000000000000000000000000000088 :102850000000000000000000000000000000000078 @@ -58007,7 +58007,7 @@ :102870000000000000000000000000000000000058 :102880000000000000000000000000000000000048 :102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 +:1028A0000000000000000000000000000000FF0029 :1028B0000000000000000000000000000000000018 :1028C0000000000000000000000000000000000008 :1028D00000000000000000000000000000000000F8 @@ -58015,422 +58015,422 @@ :1028F00000000000000000000000000000000000D8 :1029000000000000000000000000000000000000C7 :1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:102940000000000000000000000000040000000083 -:102950000000000000000000011000004002000024 -:102960000000000000000000000000000000000166 -:102970000000000000000000000000000000200037 -:102980000000000000000000000000000000000047 -:102990000000000000000000000000000000200017 -:1029A0000000000000000000000000000004000023 -:1029B000000000A000000000000000000000000077 -:1029C0000000000000000000000000000002000005 -:1029D0000000000200020000000208030002800163 -:1029E0000002000200000002400040000000000061 -:1029F0000000000000000000000040000000000295 -:102A00000000000000000002000040000000400044 -:102A10000000400000000002000000000040000232 -:102A200000904000000000000000000000000000D6 -:102A3000000402000040004000400200020000408C -:102A400008C00200008000400040000000000010AC -:102A50000200000000000000000000000000000074 -:102A60000010000000000000000000000000001046 -:102A70000210000000000000000000000000000044 -:102A80000000001000000000000000000000000036 -:102A90000010021000000000000000000000000014 +:10292000000000000000000000000000000000089F +:102930002000000020000000000000000000000057 +:102940000000000000000000000000000000000087 +:102950000000000020000000000000000000000057 +:102960000000000000004000000000000000000324 +:102970000000000000000000000000000000000057 +:1029800000000000840000002000000000000000A3 +:102990000000000000000004000000000000000033 +:1029A0000000000000008400200000000000000083 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000020000000000000000000005 +:1029D00040000000000000000000000000000000B7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000002D5 +:102A00000000000000000002000000000000400084 +:102A100000000000000000000000000000000000B6 +:102A20000000000000000002000000000002400062 +:102A300000000088048800A0C02000000000000002 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 :102AA0000000000000000000000000000000000026 -:102AB0000000021080000001000100018000800081 -:102AC0000001002180000040000100010000000022 -:102AD00000000000000000000000000000004100B5 -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B300000000000000000000041004100410404CA -:102B400000830009000000000000000000000000F9 +:102AB00000000000000580050005008900000000FE +:102AC0000000000000000000000000000000000006 +:102AD0000000000000840000000000000000000072 +:102AE00000000008000000000000000000000000DE +:102AF00000000000000000000000020000000000D4 +:102B000000000000000800000000000000000000BD +:102B10004100000000000000000000000000400034 +:102B2000000000000088000000000000000000001D +:102B30000000000000000000000000000004000091 +:102B40000000000000000000000000000000000085 :102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 +:102B600000000000000000110000000000000080D4 :102B70000000000000000000000000000000000055 :102B80000000000000000000000000000000000045 :102B90000000000000000000000000000000000035 :102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000001100000004 -:102BC0008000000441000000000000000000000040 +:102BB0000000000000000000000000000000000114 +:102BC0000000000000000000000000000000000005 :102BD00000000000000000000000000000000000F5 :102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000000000B4 +:102BF00005040000000000000000000000000000CC +:102C00000000000000000000000041002100000062 +:102C10002000000000000000000000000000000094 :102C200000000000000000000000000000000000A4 -:102C3000000000000000000000000000000500058A -:102C400000001000008000200000000000000000D4 -:102C50000000000000000000000000000000000074 -:102C60000000001000000000010000000000000053 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 +:102C300000000000000021000000002000000080D3 +:102C400000880000000000000000000000000000FC +:102C5000000000000000000000000000080000006C +:102C60000000000000000000000000000000000064 +:102C70000000004100000000000000000000000013 +:102C80000000000400000000000000000000000040 :102C90000000000000000000000000000000000034 :102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC000000000008000002000010500000000401E -:102CD0000004000000880000000000000000000068 -:102CE00000000000000100000000200000000000C3 +:102CB0000000000000000000000000000091000083 +:102CC0000008000300000088000000000000000071 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 :102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 +:102D000000000000000100000000000000000000C2 +:102D10002100000000000000000000000000000092 :102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000004053 -:102D40000003824020400004110008002000002001 -:102D500000000040004000000000000000000000F3 -:102D6000000084000000000084000000000000005B +:102D30000000000000000000000000000000000093 +:102D400000000041010000000000018000000000C0 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 :102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 +:102D800000000000000000000000900000000000B3 :102D90000000000000000000000000000000000033 :102DA0000000000000000000000000000000000023 :102DB0000000000000000000000000000000000013 -:102DC00000010000000100010000820000008000FE -:102DD00000000004000100010000000000000000ED +:102DC00005000000000040C00000000008100008DE +:102DD00000000000000000000000000000000000F3 :102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 +:102DF00000900300000000000000000000C0000080 +:102E000000000000000000000800000000000000BA +:102E100000000000000000000000000005881120F4 +:102E20000090000000000000000000000000000012 :102E30000000000000000000000000000000000092 -:102E40000000200002000000000000040004001147 -:102E5000000000400002000200000000000000002E -:102E60000000000000000000000001000000000061 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E700000009000000000000000000000000000C2 +:102E800001000000000900000000000000008400B4 :102E90000000000000000000000000000000000032 :102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC000000000000000800000000200000140023D -:102ED000090000002001000409002000000000009B -:102EE00000000000000000000000000008000000DA +:102EB000000000000000000008000000000000000A +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 :102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 +:102F0000000004000000004000000000000000007D +:102F10000000000000000000000040000000000071 +:102F20001100000000000000000000000000000090 :102F30000000000000000000000000000000000091 -:102F400000000000000002C000000002000000C1FC -:102F5000A0004101880102C0000000020000000042 -:102F6000000000000000000000000000000089A038 -:102F70008800889090000000000000000000000021 -:102F80000000000000000000000000000000000041 +:102F400000000000000000000400840000010000F8 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000010000000000000040 :102F90000000000000000000000000000000000031 :102FA0000000000000000000000000000000000021 :102FB0000000000000000000000000000000000011 -:102FC0000000000000000000808000000080000081 -:102FD00009C1110588098010808000000080000070 +:102FC00000000000000000000400000003000020DA +:102FD00000000000000000000000000000000000F1 :102FE00000000000000000000000000000000000E1 -:102FF00089808000000080000000000000000000C8 -:1030000000000000000000000000000000000000C0 +:102FF00000000000000000000000000000000000D1 +:103000000900000000000000000020000000000097 :1030100000000000000000000000000000000000B0 :1030200000000000000000000000000000000000A0 :103030000000000000000000000000000000000090 -:103040000000000000000000000080000000000000 -:103050008000408008809104C19000008000000042 -:1030600080000000000000000000000000000000E0 -:10307000000000000021808080800000000000002F -:103080000000000000000000000000000000000040 +:10304000000000000000000000000011208000418E +:1030500000800000000000000000000000000000F0 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:10308000000000050000000000000000000000003B :103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 :1030B0000000000000000000000000000000000010 -:1030C00000000000000000000000000008000000F8 -:1030D0000000C000018801089000C1C1000002008A -:1030E0000000C00000000000000000000000000020 -:1030F00000000000000000008484C0900000000078 -:1031000000000000000000000000000000000000BF +:1030C00000000000000000000000000000A001C09F +:1030D000000000C000000000000000000000000030 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:103100000000000000000000000000A0000000001F :1031100000000000000000000000000000000000AF :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:103150000000000000C0A0000000080000C1000046 -:103160000000000000C0000000000000000000009F -:1031700000000000000020400088889100C100008D +:10314000000000000000000000000000000001007E +:103150000400400101010000000000000000000028 +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F :10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F +:10319000000000000000010000000000000000002E :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF -:1031D000000000000000008005081111C14000C17E -:1031E000000000000000008000000000000000005F -:1031F0000000000000000000008000A0009103C15A +:1031D00008000000800340410000000000000000E3 +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE +:10321000000000000000000020000000000000008E :10322000000000000000000000000000000000009E :10323000000000000000000000000000000000008E :10324000000000000000000000000000000000007E -:1032500000008000000000000000C1081108C1004B -:1032600009118000000000000000000000000000C4 -:1032700000000000000000000000000080C180008D -:10328000000000000000000000000000000000003E +:10325000000000040040000000000000000000002A +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000004000000003A :10329000000000000000000000000000000000002E :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E :1032C00000000000000000000000000000000000FE -:1032D00000000000C000000000004000C108000124 -:1032E00088000100C0000000000040000000000055 -:1032F000000000000000000000000000200088899D -:1033000090880000000000000000000000000000A5 +:1032D00000000000000000010000000000000000ED +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D :10333000000000000000000000000000000000008D :10334000000000000000000000000000000000007D -:1033500000000000000000000000000000006011FC -:1033600000E01200000A0000000000000000000061 -:1033700000000000000000000000000000006006E7 -:1033800000E00700820000000000000000000000D4 -:10339000000000000000000000000000000000002D +:103350000000000000004182000180008221000086 +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000081417B +:1033900000E0070000000000880000E000000000DE :1033A000000000000000000000000000000000001D :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD -:1033D000000000000000000000003C3C0000AAAA21 -:1033E0000000F0F00000FFFF00003C3C0000AAAA33 +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD :1033F00000000000000000000000000000000000CD -:10340000000000A01818201C0000000000000000B0 +:1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC :10342000000000000000000000000000000000009C :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C -:103450000000000000000000000000003C3C0000F4 -:10346000AAAA0000F0F00000000000003C3C0000B0 -:10347000AAAA0000000000000000000000000000F8 -:103480000000000000002828003C000000000000B0 +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C :1034A000000000000000000000000000000000001C :1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC -:1034D0000000000000000000000000000F0F0000CE -:1034E0003C3C0000FFFF0000FF0000000F0F000049 -:1034F000F0F0FFFF000000000000000000000000EE -:10350000000000000F0FFFFFAA55AAAA000000004C +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB :10352000000000000000000000000000000000009B :10353000000000000000000000000000000000008B :10354000000000000000000000000000000000007B -:1035500000000000000000000000000000000F0F4D -:1035600000003C3C000000000000FF0000000F0FC6 -:103570000000F0F0FFFF000000000000000000006D -:103580000000000000000F0F00000000000000001D +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B :10359000000000000000000000000000000000002B :1035A000000000000000000000000000000000001B :1035B000000000000000000000000000000000000B :1035C00000000000000000000000000000000000FB :1035D00000000000000000000000000000000000EB -:1035E000408280000020920245828A39852092A282 -:1035F00040828000002082020000000000000000E5 -:1036000000000000000000000061002E804D000856 -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A +:1035E00005000A3FC50C00A000000000000000001C +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA +:10361000000000000000000000610036C00D00A0A6 +:10362000000000610006C00D000000000000000066 :10363000000000000000000000000000000000008A :10364000000000000000000000000000000000007A :10365000000000000000000000000000000000006A -:103660000000000000000000000030005000A080BA -:10367000F0C000000000000000000000000000009A -:103680000000000000000000000000000000AFAFDC -:1036900000AA000000000000000000000000000080 +:10366000000000005555AAAAFF000000000000005D +:10367000000000000000000000000000000000004A +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A :1036C00000000000000000000000000000000000FA :1036D00000000000000000000000000000000000EA -:1036E0000000000000000000000000003C00550049 -:1036F000A0800000000000000000000000000000AA +:1036E0000000000000005555AAAAFF0000000000DD +:1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 -:10371000AFAF00AA000000000000000000000000A1 +:1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 :103730000000000000000000000000000000000089 :103740000000000000000000000000000000000079 :103750000000000000000000000000000000000069 -:103760000000000000000000000000000000410018 -:103770000101000A000C0000000000000000000031 +:1037600000000000000000003C3CF0F00000000001 +:103770000000000000000000000000000000000049 :103780000000000000000000000000000000000039 :103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 :1037C00000000000000000000000000000000000F9 :1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F0005500050500AA003C000000000000000084 +:1037E000000000000000000000003C3CF0F0000081 +:1037F00000000000000000000000000000000000C9 :1038000000000000000000000000000000000000B8 :1038100000000000000000000000000000000000A8 :103820000000000000000000000000000000000098 :103830000000000000000000000000000000000088 :103840000000000000000000000000000000000078 :103850000000000000000000000000000000000068 -:103860000000000000000000000000002000000038 -:1038700000002000000000000000000000410000E7 -:103880000000000200000000000000000000000036 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F0000000000040000300000000000000000085 -:1039000000000000000000000002000200000002B1 -:1039100000020020000000000090000000000000F5 -:103920000000000040020000000000000000000055 -:103930000000000000000000000000000000000087 +:103860000000000000000000000020000100020035 +:103870000000000000000004000400000000000040 +:103880000000000000000000000020000000000018 +:103890000000000000000004000010000000000014 +:1038A00000000000000000000000000320000100F4 +:1038B00000040000000000000000000420000000E0 +:1038C00000000000000000000000000020000000D8 +:1038D00000000000000000000000000020000000C8 +:1038E00000000000000000000000000000000200D6 +:1038F0008000000000000000000000004000000008 +:1039000000000000000000000002000000000000B5 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000200000000000095 +:10393000080000000000000000000000000000007F :103940000000000000000000000000000000000077 -:1039500000000000000200020002000000900000D1 -:10396000000000000002000000020002000002004F -:103970000200004002000000000000000000000003 -:103980000000000000100000000000200000000007 -:1039900000000020000020000000000000000000E7 -:1039A0000000000000100000000000000000000007 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000100000000000000000E7 +:1039500000000000000040000000004000000000E7 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:103990000000000000000000010000000000000026 +:1039A0000000000000100000000001000000000006 +:1039B0000000010000000000000000000000000006 +:1039C0000100000000000000000000000080000076 :1039D00000000000000000000000000000000000E7 -:1039E00000000000000000100000000000000000C7 -:1039F00080008000000100000000000000000000C6 +:1039E00000000000000000000000000000000010C7 +:1039F00000080000000000000000000000000000BF :103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 +:103A10000008000000000000008202820084000014 +:103A2000000000000000000000000000020800820A +:103A3000000000080200000000000000000000007C +:103A40000000040000000000000000000000004032 +:103A5000000000080000000000000000000000045A :103A60000000000000000000000000000000000056 -:103A700000000000004100000040000400000004BD -:103A80000000001100000000000000000000000025 -:103A90000000000000000000000004000000000022 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000050100010000BF -:103B00000085000000000000000000000000000030 -:103B10002100000003000800000000000000000079 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 +:103A70000000000000000000000000000000000046 +:103A80000005000000050005000000000000000027 +:103A900000080000000000000021000000210000DC +:103AA00000000100000000000021000000052005CA +:103AB0000000000000000000000000050000000001 +:103AC0000021002100200000004000000000000054 +:103AD000C002C0090000000000000000000000005B +:103AE0000040000000000000000000000000000096 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000004000000000000000000000091 +:103B300080000000000000000900000000000000FC +:103B40000000000000000001030000000000000071 +:103B500000000088000000000000000000000000DD :103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000200025 -:103B8000008000800180100000000800000000009C -:103B90001000000000000000000000000000000015 -:103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 +:103B700000004000400000000000000000000000C5 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000C00000000000000055 +:103BB0000080000000000000000488000100C00038 +:103BC0000000000000000000000000000000820073 :103BD00000000000000000000000000000000000E5 :103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 -:103C000000000004000840044100410009002100B8 -:103C100000004100410041000000000003200000BE -:103C2000000000000000008800000000000000000C -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 +:103BF0000000000000000000000000200000002085 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C3000000000400000000000000000000002043E +:103C400000000000000000000084000000000000F0 +:103C50000000000000000000000000200000000044 +:103C60000000000000004100000000000000000013 :103C70000000000000000000000000000000000044 -:103C80008200000004080411A00004009000040059 -:103C90000400000000000000000000000000000020 -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D00000084000000008005C0880088800000005A -:103D100080008000000000000000000000000000A3 -:103D2000000000000000030000000084000000000C +:103C80000000000000080000000500000000000027 +:103C9000000000000000000000000000000008001C +:103CA00000000000C0000200000000000000000052 +:103CB00000009000880000000000000000110000DB +:103CC00000000005000000030000002104200000A7 +:103CD0000000820000000000002100000000000041 +:103CE000000082030000000000400000000000000F +:103CF000000000000000000000000000000000C004 +:103D00000090000000000000000000000000000023 +:103D100000000000000000000000000000000000A3 +:103D2000000000000000000080000000040000000F :103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000004003 -:103D800000409040820004080000004104800000D0 -:103D900004090809000200000000002000000000E3 -:103DA0000000820000000000000000000000000091 -:103DB0000000000000020000000000000000000001 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 +:103D40000000000000000000008200000000800170 +:103D50000000000000000000000000A000000000C3 +:103D60000000000003000000000000000000000050 +:103D70000000000000000000000000000000000043 +:103D800000000000000000080008000800210000FA +:103D900000000000002100000021000800000000D9 +:103DA0000000000000000000000000000000000013 +:103DB00000000000000000000000000900000000FA +:103DC00000000011000300000000000000080021B6 +:103DD000040082000000000300400000000000001A +:103DE00000200000000000030000000000000000B0 :103DF00000000000000000000000000000000000C3 -:103E0000008500010083030080010000000080089D -:103E10002100900008001100410021002100000055 -:103E2000000000000300000000000000210000006E -:103E30000000000000000000000000000000000082 +:103E000000040000000000000000000000000000AE +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E300000000000008400000000000000000000FE :103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 +:103E500000008000000000000000000100000000E1 :103E60000000000000000000000000000000000052 :103E70000000000000000000000000000000000042 -:103E8000000000C01000010001020100200001013B +:103E80000000000008000000C0000000000000006A :103E90000000000000000000000000000000000022 :103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 +:103EB0000000000000000000000000009000000072 +:103EC000C000000000C040200002100800000000F8 +:103ED0000000000000000000000000000010824010 +:103EE00000820288000000000000000000000000C6 :103EF00000000000000000000000000000000000C2 -:103F000000000000008000004100038003008000EA -:103F10000810000000000000000000000000000089 +:103F000000000000090080000000800000000000A8 +:103F100000000000000000000000000000000000A1 :103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 +:103F30000000000000000000000000001000000071 +:103F400000008000000003800080000080800000EE +:103F500000000000000000000000000000000580DC +:103F600000800080800000000000000000000000D1 :103F70000000000000000000000000000000000041 -:103F800000000000000080000003000080002011FD -:103F9000008000410080004100000021000000403E +:103F800000000000000000008000800080000000B1 +:103F90000000000000000000000000000000000021 :103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 +:103FB0000000000080000000000000000000000081 +:103FC00080008008000000000000000080000080E9 :103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 +:103FE000800000A18003000000000000000000002D :103FF00000000000000000000000000000000000C1 -:104000000000000000000000020000000000C010DE -:104010000100008400000020000000040000008275 +:10400000000000000000000002002000820008887C +:1040100000000000000000000000000000000000A0 :104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 +:10403000020010001000C00000000000000000009E +:10404000020020008200880200030200900040006D +:1040500088C0000000000000000000000000000018 +:1040600000000800828202000288000000000000B8 :104070000000000000000000000000000000000040 -:10408000000000000000000000000000000200002E -:1040900000C001008400C0000001010000004000D9 +:1040800000000000000000000000001000200210EE +:104090000008000000000000000000000000000018 :1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 +:1040B00000000000000000000000010000000000FF +:1040C0000000001000101084001000010210009089 +:1040D00000020010000000000000000000000000CE +:1040E00000000000050800821084010800000000A4 :1040F00000000000000000000000000000000000C0 -:10410000000000000000000000000000000000802F -:104110000000008003000004000509414100000088 -:10412000800000000000000000000000000000000F -:10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F +:1041000000000000000000000000000000800080AF +:10411000008000800000000000000000000000009F +:10412000000000000000000000000000000000008F +:104130000000000000000000000000000800000077 +:10414000000000000080008000800300000100806B +:1041500000000080000000000000000000000900D6 +:10416000000000000000A0800000008041800000EE :10417000000000000000000000000000000000003F -:1041800000000000000000000000000000008002AD -:1041900000000041000000202108004100800003D1 -:1041A000000500000000000000000000000000000A -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF +:104180000000000000000000000000000000000926 +:10419000000200800000000000000000000000009D +:1041A000000000000000000000000000000000000F +:1041B000000000000000000000020000008000007D +:1041C0000000000000000000000900800000000165 +:1041D000000200400080000000000000000000001D +:1041E000000000000000000080008005008000004A :1041F00000000000000000000000000000000000BF :1042000000000000000000000000000000000000AE -:10421000C000000000000000000100010001008259 -:10422000000100010000000000000000000000008C -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E +:104210000000000000080000000000000000000096 +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000200027A +:104240000000000000000000000000000008000066 +:10425000000100000001004000000000000000001C +:10426000000000000000000000001000820020029A +:1042700088000000000000000000000000000000B6 :10428000000000000000000000000000000000002E -:10429000000000000000000000414842000840000B -:1042A0000011000A00004000420000000000000071 -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE +:10429000000000000000820000120000000000008A +:1042A000000000000000000000000000000000000E +:1042B000000000000000000000000000000082007C +:1042C00000000000000007000000410000E0820044 +:1042D0000012000000000000820000120000000038 +:1042E00000000000000A00000700000000000000BD +:1042F0008200000600000000000000000000000036 :1043000000000000000000000000000000000000AD -:1043100000000000FFFF0000F0F0000000000000BF +:10431000000000000000000000000000000000009D :10432000000000000000000000000000000000008D :10433000000000000000000000000000000000007D :10434000000000000000000000000000000000006D @@ -58438,7 +58438,7 @@ :10436000000000000000000000000000000000004D :10437000000000000000000000000000000000003D :10438000000000000000000000000000000000002D -:1043900000000000000000000000F0F0000000003D +:10439000000000000000000000000000000000001D :1043A000000000000000000000000000000000000D :1043B00000000000000000000000000000000000FD :1043C00000000000000000000000000000000000ED @@ -58446,40 +58446,40 @@ :1043E00000000000000000000000000000000000CD :1043F00000000000000000000000000000000000BD :1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C +:104410000000000000000000000000000084208078 :10442000000000000000000000000000000000008C :10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C +:1044400000000000008020020000000000000000CA +:1044500000000000008420800000010800000084AB +:10446000200000000000000000000000000000002C +:104470000000000840000084200000000000000050 :10448000000000000000000000000000000000002C -:104490000000000000000000000000003C3CFFFFA6 -:1044A000C3C3000000000000000000000000000086 +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C :1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC :1044D00000000000000000000000000000000000DC :1044E00000000000000000000000000000000000CC :1044F00000000000000000000000000000000000BC :1045000000000000000000000000000000000000AB -:1045100000000000000000000000000000003C3C23 -:10452000FFFFC3C300000000000000000000000007 +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B :10454000000000000000000000000000000000006B :10455000000000000000000000000000000000005B :10456000000000000000000000000000000000004B :10457000000000000000000000000000000000003B :10458000000000000000000000000000000000002B -:104590000000000000000000000000000000408259 -:1045A00080000020820205000A3FC50C00A0050023 -:1045B0000A38050000A00000000000000000000014 -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB +:1045900000000000000000000000000000003000EB +:1045A00000000000000C00000000000000000000FF +:1045B00000000000000000000000000000000000FB +:1045C00000000000000030000000000000010500B5 +:1045D00000100000000030610006800F000C000099 +:1045E000300000000000000C00000000000000008F +:1045F00005000030000000003000000000C0000096 :1046000000000000000000000000000000000000AA :10461000000000000000000000000000000000009A -:1046200000000000000000000000FF00F0F0FF00AC +:10462000000000000000000000000000000000008A :10463000000000000000000000000000000000007A :10464000000000000000000000000000000000006A :10465000000000000000000000000000000000005A @@ -58487,16 +58487,16 @@ :10467000000000000000000000000000000000003A :10468000000000000000000000000000000000002A :10469000000000000000000000000000000000001A -:1046A000000000000000000000000000FF00F0F02B -:1046B000FF000000000000000000000000000000FB +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA :1046E00000000000000000000000000000000000CA :1046F00000000000000000000000000000000000BA :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 -:1047200000000000000000000000000000000F0F6B -:104730003C3C000000000000000000000000000001 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 :104740000000000000000000000000000000000069 :104750000000000000000000000000000000000059 :104760000000000000000000000000000000000049 @@ -58504,8237 +58504,43 @@ :104780000000000000000000000000000000000029 :104790000000000000000000000000000000000019 :1047A0000000000000000000000000000000000009 -:1047B0000F0F3C3C00000000000000000000000063 +:1047B00000000000000000000000000000000000F9 :1047C00000000000000000000000000000000000E9 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 :1047F00000000000000000000000000000000000B9 :1048000000000000000000000000000000000000A8 :104810000000000000000000000000000000000098 -:1048200000000000000000000000880000002000E0 -:1048300000000000000000000080000000000000F8 -:104840000000200000000000000020000000000028 -:104850004000000000110000000000000000000007 -:104860000000200000000000000300002000000005 -:1048700000000000880000000000000000000000B0 -:1048800000000000200000000000000020000000E8 -:104890000000000000000000000000000000000018 -:1048A00000000000200000000000000000000000E8 -:1048B00000000000000000000000001000000002E6 -:1048C00000000000000000000000000200000000E6 -:1048D00000000902090200000002000000020002BC -:1048E0000000400000020000000000000000000086 -:1048F0000002000020000000404000001000000006 -:104900000000000000000000400200001002000053 -:10491000000000020002000200020000000000028D -:104920000002000000000002004000002000200003 -:104930002010201000000000021000000000000005 -:104940000000000000200000002100100000001006 -:104950000021001000000000001000100000000006 -:104960000000000000000000000000100000000037 -:104970000000000000000000000000101010000007 -:1049800000000000000002020200020000400200DD -:1049900002000040004002000200004000900200BF -:1049A0000200004000400200020000400040800081 -:1049B00080008000800000900000000000000000E7 -:1049C00000020000000000010000410000000000A3 -:1049D00000010000000100000000000000000000D5 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A00000000000000000000800180008000000124 -:104A10008000800000010001800080000001004053 -:104A20008000800000010001800080000001000182 -:104A30000000002100000000000040000000000015 -:104A40000000001002000000000000000000000054 -:104A50000000000000000000000000000000000452 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A900000000000000000000000000000210000F5 -:104AA00000090400000000000000000000110000E8 -:104AB00000000000000000000000008400002184CD -:104AC0000000000000018000000000000000000065 -:104AD00000000000000000000000000000000000D6 -:104AE00000010000000000000000000000000000C5 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B300000000000080082000000000000000000EB -:104B4000080008000400000000000000A005A0000C -:104B500000000000000000000000000000800000D5 -:104B60000000000000000000000000000000040041 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000008400100091 -:104B90000000108000000000000000000080000005 -:104BA000080082000000000000000000000010006B -:104BB000820000000000000000C0000000C00000F3 -:104BC000000000040000800000000000000000025F -:104BD0000002000000020000000000004000002071 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C1000800000008008000000000000000000404C -:104C20000000000000000000000000000000000084 -:104C300080000000000000000000000000410000B3 -:104C40000400A0000000840082000090040504001D -:104C5000002000000000000000050000000090009F -:104C60000004000400000400000000000000000038 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C900084000000100000082000004000000040D8 -:104CA00000001000100000002000904000000000F4 -:104CB0000040000010000000200000000000000084 -:104CC00000000088210011020084410000218000C2 -:104CD0008000000000000000000000000000000054 -:104CE0000000000100010000800000000000000042 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000008000000180000001000091 -:104D20000001000080008000000080000001000001 -:104D30000000000100008000000080000000200052 -:104D40002000000000110000000300000809088096 -:104D500084090002000920008441040400050000C9 -:104D60000000080000040000408400000000000073 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA000020000008200000400000000000000007B -:104DB00002000040000000040000000000000000AD -:104DC000000011000000000000000000000000844E -:104DD00000100000110000008000000080010000B1 -:104DE0004000000000000000000040210000000022 -:104DF0000000210000000000000000000000000092 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000800000000000000100000000000001 -:104E300000008000000100000001000000000000F0 -:104E40000000000000000000000000000000000062 -:104E5000001000000088000089C02002001082A01D -:104E600000A1014100100088000090000000000037 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000C10000100041 -:104EA000880102C000000002000001C102001001E0 -:104EB000880102C000000002000001C10000900152 -:104EC0008800000000000900000000000000000051 -:104ED0000000008000000080090091808080058033 -:104EE000800009C1098905C10080200080004100BF -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F100000000000000000000000000011C102417C -:104F2000C1088008808000000080000010C10220BD -:104F3000C0098008808000000080000010C111209E -:104F40004009802000110000004000000000000027 -:104F500000000000000000C00000008080088011F8 -:104F600080C08000098085009111C10900080000FF -:104F700000030080000000000000000000000000AE -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000418050 -:104FA00008008302C14180000000000080004180B1 -:104FB00020008209C10380000000000080004180C1 -:104FC00020009020C103000000000001000000004C -:104FD000000000000000000000C000000002080007 -:104FE00084019088C000024088000901110100017D -:104FF000004000000004000000000000000000006D -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:10502000008801009000C101080000000000C000DD -:10503000008800009000C101080000000000C000CE -:10504000008800009100C100000020000000010065 -:1050500000000000000000000100000090000000BF -:1050600040089002902088C0A100010101011101B7 -:105070000000C00008000000000002000000000066 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 -:1050A000000020019000000101C10000000000008C -:1050B00000C020009000010100C1000000000000BD -:1050C00000C020009000010000C10000800000002E -:1050D0004000000000000000000010000000000080 -:1050E0000000808000808080C08089090303090956 -:1050F00011414000800000004100000080000000DD -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000000000008F -:105120000000000080088003000809C100000000A2 -:105130000000008080118520050505C100000000E9 -:105140000000008080098520102000C100090000B7 -:10515000000000000000000000000000800080202F -:1051600000000000800080A00080000041A191802C -:105170004180040500000010000000000000000055 -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A0000000000000004188210905000211800074 -:1051B000000000000000C1A0210985000905800051 -:1051C000000080000000C1A02109A000091100001A -:1051D0000000000000000000000000000000C0000F -:1051E000100000008800C00010882002400001A1CB -:1051F0009182108800000000000000000000000004 -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000009C1000101000000B2 -:10523000C000000000004000C1C000018900010062 -:10524000C000000002000000C1C000018800010091 -:10525000000000010000000000000000000000004D -:10526000000A000007006000500A00E0070000008C -:10527000500000E000000000500A00E0070082003B -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A00000000000000000000000410000E00000DD -:1052B00081060000000000000000880000E00000FF -:1052C00081000000000000000000880000E00000F5 -:1052D000810000000000000000000000000000004D -:1052E000000000FF00FF000000003CFFF0AAC3FF29 -:1052F000E8E8F00FF00F00000000000000000000E0 -:10530000000000000000000000000000000000009D -:10531000000000000000000000000000000000008D -:105320000000000000000000000000000000FFFF7F -:105330000000FFFF00003C3C0000AAAA0000F0F0C3 -:105340000000FFFF0000F0F00000AAAA0000F0F04B -:105350000000FFFF0000000000000000000000004F -:1053600000000000C3C33C3C000000003C00F0AA69 -:10537000003CE8E8F00FF00F000000000000000023 -:10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD -:1053B000FFFF0000000000003C3C0000AAAA000023 -:1053C000F0F0000000000000F0F00000AAAA0000C9 -:1053D000F0F00000000000000000000000000000ED -:1053E0000000000000000F0F000000000000353535 -:1053F000FF0FD7143F3FDFFFBFF9400280010000DD -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C -:10543000FFFF0000FF0000000F0F00003C3C0000D9 -:10544000FFFF0000FF0000000F0F00003C3C0000C9 -:10545000FFFF0000FF00000000000000000000004F -:1054600000000000000000000F0F0000000000001E -:105470003535F000D7140303FFFFF96F041008203F -:10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000000FC -:1054B000000000000000FF0000000F0F00003C3C57 -:1054C000000000000000FF0000000F0F00003C3C47 -:1054D000000000000000FF00000000610007000D58 -:1054E00000000000000000000000A5000A280500E0 -:1054F00000A01061202F804D0008000000058000F2 -:10550000000005610A2F850D00A0000000000000CA -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B -:1055300000000000404280058020920240828000EE -:1055400000209202408280018020920240828000EE -:105550000020920240828001802092020000000020 -:10556000000000000000000000000000000000003B -:10557000000000000000000000000000380438387F -:105580003C00300C000000000000000000000000A3 -:10559000000000000000000000000000000000000B -:1055A00000000000000000000000000000000000FB -:1055B0000000000000000C0014002828003C00003F -:1055C0000000000000003C005500A0A030300000AA -:1055D0000000000000003C0055003020F0A000005A -:1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000003C006F -:105600000404003C303000000000000000000000F6 -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A -:1056300000000000000000000F0055000808000CEA -:10564000000000000000000030005000A00030000A -:10565000000000000000000030005000302000007A -:10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:1056800055000000E8E83C000000000000000000B9 -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000003C303CA02082 -:1056C000F030000000000000000014000C0010305A -:1056D00050F0000000000000000055000F0080A006 -:1056E000C0F000000000000000000000000000000A -:1056F00000000000000000000000000000000000AA -:10570000000000000F0FE8E8003C0000000000006F -:105710000000000000000000000000000000000089 -:105720000000000000000000000000000000000079 -:10573000000000000000000000000000003C303CC1 -:10574000A0200000000000000000000055000F0035 -:1057500010300000000000000000000041000300C5 -:1057600080A00000200000000000000000000020D9 -:105770000000000000009000000000004000200039 -:1057800040000000200000000000000000000000B9 -:1057900000000000000020000000000020002000A9 -:1057A00020000000000100000000000000000000D8 -:1057B00000000000100040002000400040002000D9 -:1057C0002000200000000000880000000000000011 -:1057D0000000000000000000200000000000200089 -:1057E0002000200000004000040000000000000035 -:1057F0004000000000000000000000000000000069 -:105800000000000000000000000000400090404048 -:105810000000000000000090000000000002009066 -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 -:105840000002000000020000000000000000004014 -:105850000002000000000002000200000000000042 -:105860000000000000000000000000000000021026 -:105870000000200000002000200020002000200068 -:105880000000000000000000000000000000080010 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 -:1058B0000010000000000000000000000000900048 -:1058C00000000000000000000000000000000000D8 -:1058D00008000000000000000000000000000000C0 -:1058E00000000000000000000000000000000000B8 -:1058F0000000000080000000800080008000800028 -:105900008000000000000000000000000000000017 -:105910004000000000000000000000000000000047 -:105920000000000000000000000000000000000077 -:105930000000000000000000400000000000000027 -:105940000000000000000000000000000000000057 -:105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 -:1059700000410000000000000805000000000000D9 -:105980000000000000000000000000000000000017 -:1059900000000000000000000080408000000000C7 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000000000000200C5 -:1059E00000000000000000000000000000000000B7 -:1059F0000000000004000000000010000000000093 -:105A0000000041102100000000000000000008001C -:105A1000000000000000000000000004000400007E -:105A20000004000000000000000000000000000072 -:105A30000000000000000000000000000000040062 -:105A40000000000000000000000000000000000056 -:105A50000000410000000000000000000000000005 -:105A600000000300410021000000000003000000CE -:105A70000000000000000000008000000080000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000000000000F6 -:105AB00000000000000000000000000000000000E6 -:105AC00000000000100000000000000000000000C6 -:105AD00000000000C00000000000000000001000F6 -:105AE000100008000000080008000000000000008E -:105AF0000000000000000000080000040000000496 -:105B0000000000000000008800000000000000000D -:105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 -:105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 -:105B80000000A000004100410000000000000000F3 -:105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000000000000000E5 -:105BC00000000000000000000000000000000000D5 -:105BD00000000400000000000000000000000000C1 -:105BE00000000000080000000000000000000000AD -:105BF00000000000000000000000000000000000A5 -:105C00000002001000000002040000001100090062 -:105C100000000000000000C0000000000084000040 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 -:105C500000040020000400C000000000000000005C -:105C60000004000000001000000000000000000020 -:105C70000000100000000300000090090000100068 -:105C80000000A00000001000000000000011004112 -:105C900000000000000000000800000000000000FC -:105CA00000000000000000110000000000040004DB -:105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000800000000000000AC -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000172 -:105D3000000100000000000000000000080000005A -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D8000000000000000040000000000000004000B -:105D90000100000000000000000000000000000002 -:105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 -:105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000800009000000000009 -:105E100080004000000000000000000000000000C2 -:105E2000000000000000050000004100000000002C -:105E3000000008000000000000000000000000005A -:105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 -:105E80000000000000000000004100000041008010 -:105E900000410000002100800041008000210080BE -:105EA0000020008000000080000000800009000049 -:105EB00000000000002000000000000000000000C2 -:105EC00000000000000000000000000000000000D2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 -:105F0000000000000000000000000001000000018F -:105F100000100001000000000040000000820000AE -:105F200000400001008200000040000000820000EC -:105F300000820000000000000000000000000000DF -:105F40000000000000000000000000000000000051 -:105F50000000000000000000000000000000000041 -:105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000100001 -:105F9000000000000000C000000001000000000040 -:105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000010000000000E0 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 -:106000000000000000000000000000000000000090 -:1060100080000000090000000000000003000000F4 -:106020000000000000000000000000000000000070 -:106030000000000009000000000000001000000047 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 -:1060900000000008000000000000000800000000F0 -:1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:10611000000000000001000000000000000100007D -:10612000000000000000000000000000000000006F -:10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:1061900000000000000000420000814100000042B9 -:1061A0000000880000000000000000000000000067 -:1061B00000000000500000E000000000500000E07F -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E -:10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D -:10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:10635000000000000000000000000000000000003D -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C -:10641000000000000000000000000000000000007C -:10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A00000610007000D000000610007000D000002 -:1064B00000000000000000000000000000000000DC -:1064C00000610007800D000000610007800D0000E2 -:1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B -:10652000000000000000000000000000000000006B -:10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB -:1065B00000000000000000000000000000000000DB -:1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A -:10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 -:1067200000000000200020000000000000002010F9 -:1067300020000000000000000000200020000000F9 -:106740000000000020000000000000000000040025 -:1067500020000000000000000000200020000000D9 -:106760000000000000002000000000000000000009 -:106770002000000000000000000040002000200079 -:1067800000000000000020000000000000000000E9 -:106790002000000000000000000020002000200079 -:1067A00000004000000000000000000000000000A9 -:1067B0000000000000040000000000004000000095 -:1067C0000002000000000090009000004090009047 -:1067D0000090000000900090000000020000000007 -:1067E0004000400000000000000000000000000029 -:1067F0000000210400000000000000400000000034 -:106800000000000000000000000000040000000084 -:1068100000000090400000000000000000000000A8 -:106820000000000000009000000090000000000048 -:106830000000000002100000000000000000000046 -:1068400000000800084000000000000000000000F8 -:106850000000000008000000000000000000000030 -:1068600000000800084000000000000000000000D8 -:106870000800000000000000000000000000000010 -:106880000000000000100840000000000010001090 -:1068900000000000001000100000000000100800C0 -:1068A00000000000000002000040000000000000A6 -:1068B00000400040000000000040001000000010F8 -:1068C00000C00000000000000000000020000000E8 -:1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000004000000000000000000000053 -:1069400000008400000000000000000000000000C3 -:1069500000000000000000009000000000000000A7 -:106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 -:1069800000000000000040000200000000000000C5 -:1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000200000C7 -:1069B00000000000000000000000000000000020B7 -:1069C00000000000002000000000000000000000A7 -:1069D00000000000000000000800000000000000AF -:1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000000086 -:106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 -:106A40000000000000000000000000000000000046 -:106A5000000008000000000000000000000000002E -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000001006 -:106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000010000003000000C3 -:106AC00000000000000000000000000000000000C6 -:106AD00000000000000000000000000008000000AE -:106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 -:106B00000000000000000010001000000000000065 -:106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 -:106B30000000000000000000000000000000000055 -:106B40000000000000000000000000000000000045 -:106B50000000000000000000000000000000000035 -:106B60000000000000000000000000000000000025 -:106B70000000000000000000000000000000000015 -:106B80000000000000000000000000000000000005 -:106B900000000000000000000000000000000000F5 -:106BA00000000000000000000000000000000000E5 -:106BB00000000000000000000000000000000000D5 -:106BC00000C000000000000000100088000000006D -:106BD00000001000000000000000000000000000A5 -:106BE00000000000000000000300000000000000A2 -:106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 -:106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000000000000000000D4 -:106CC00003000000000000020000000000000000BF -:106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 -:106D0000110000000000000008000000000000006A -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 -:106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 -:106F50000000000000000000000000000000000031 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E -:1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D -:10740000000000000000000000000000000000007C -:10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C -:1074800000000000000000000000000000000000FC -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C -:10750000000000000000000000000000000000007B -:10751000000000000000000000000000000000006B -:10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B -:10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A -:10764000000000000000000000000000000000003A -:1076500000000000000000000000000000008400A6 -:1076600040000000202140004000000000004000D9 -:107670000000000088004000000020002000000002 -:10768000400000002000400020000000000020001A -:1076900000000000200000000000000020000002A8 -:1076A0004100210001002100200010000000000026 -:1076B0002000000000002000400088004000200062 -:1076C0002000200088004000000020004000000052 -:1076D0000000400010008800200000002000202052 -:1076E000000000000000000020000000400000003A -:1076F000000000000000200040020900000200A07D -:1077000000000040004000200000000000000000D9 -:107710000000000000000000000200002000000047 -:107720000000040004000400040000000000000049 -:1077300000000000000000000000410000002100E7 -:107740002100000000000000002000204040000058 -:107750000000000000000000004000004020000287 -:107760000000000000000000020000000000000017 -:107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 -:1077900000000000000000000010000000000000D9 -:1077A00000000000000000000000000000000000D9 -:1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 -:1077D00000000000000000000000000000000000A9 -:1077E0000000000000400040000000000000000019 -:1077F0000000000000000000000040000000000049 -:107800000000000000000000000000000000000078 -:107810000000000000000000000000000000000068 -:107820000000000000000000000000000000000058 -:107830000000000000000000000000000000000048 -:107840000000000000000000000000000000000038 -:10785000000000000000000000000000000009001F -:107860000000000000000000000000000000000018 -:107870000000000000000000000000000000000008 -:107880000000000000000000000000000000880070 -:107890000000000090000000880090000000000040 -:1078A0008400000000000000000000000000000054 -:1078B00000000000000000000000000000000000C8 -:1078C0000000400000004000000000000000000038 -:1078D0000000100000000000000000000000000098 -:1078E0000000000000000000000000000000000098 -:1078F0000000000000000000110000000000000077 -:107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 -:107920000000000000000000000000000000000057 -:107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 -:107950000000000000000000000000000000000027 -:1079600000001000000000000000100000000000F7 -:10797000020000000800000000008200000000007B -:1079800000000000000000000000080000000000EF -:107990000000000000000000000082000000400025 -:1079A00000000000000000000000000000000100D6 -:1079B000000001000000080000410041000000003C -:1079C000A000000000000000000000000000000017 -:1079D0000000080008000000000000000000000097 -:1079E0000000080000008400000000000300030005 -:1079F000080041000300000000000000000000003B -:107A0000000041000000030000000000030000002F -:107A10001000100002000000000000000000000044 -:107A20000000000000000000000010000000100036 -:107A30002000000020000000000005000000000001 -:107A40000000000000000000000000000000000036 -:107A500008004100000000000000000000001000CD -:107A60000000000010000000000000000000000006 -:107A70000000000000008400000000000000000082 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 -:107AA00000000000000000000000000000000000D6 -:107AB00000000000200000000000000000000000A6 -:107AC00000000000000000000000000000000400B2 -:107AD00000000000000000000000000000000000A6 -:107AE000000000200000000000000800100000005E -:107AF0000000000000000000000000000000000086 -:107B00000020000000000000000000000000000055 -:107B10000000000000000000000000000000002045 -:107B20000000000000000000000000000000000055 -:107B300000000000000080000000000000000000C5 -:107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 -:107B60000000000000000000000000000000000015 -:107B700000000041000000000000000000000000C4 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000000D5 -:107BB00000000000000000000000000000000000C5 -:107BC0009000000000000000000000000000000025 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000000095 -:107BF00000000000000008000000000000900020CD -:107C00000000110000000000000200000000000061 -:107C10000000000000000800000000000800000054 -:107C2000000000000000000000000020080000002C -:107C3000000000000000000000000000000008003C -:107C400000000088000000000000000008000000A4 -:107C50000000002000000000000000000000000004 -:107C6000000000820000080000000000000000008A -:107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD00000000000000000000000000000000000A4 -:107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 -:107D20000000000000000000000000000000000053 -:107D3000000000000000000000000000000008003B -:107D40000000000000000000000000000000000033 -:107D50000000000000000000000000000000000023 -:107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 -:107DB00000000000000000000000000000000000C3 -:107DC0000040000000000000000000000000000073 -:107DD00000000000000000000000000000000000A3 -:107DE0000000000000000000000000000000000093 -:107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 -:107E30000000000000000000000000000000000042 -:107E40000088000000880000000000000000000022 -:107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 -:107E70000000000000000000000000000000000002 -:107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 -:107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 -:107EC0000000900020000100000000000000000001 -:107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000000000000000092 -:107EF0000000000000000000000000000000000082 -:107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 -:107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 -:107F4000000040000000800010000300000000005E -:107F50000000000000000000000000000000000021 -:107F60000000000000000000000000000000000011 -:107F70000000000000000000000000000000000001 -:107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 -:107FA00000000000000000000000000000000000D1 -:107FB00000000000000000000000000000000000C1 -:107FC0000000000000080020000000000000000089 -:107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000000091 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 -:108030000000000000000000000000000000000040 -:10804000000000000000000000010000000000002F -:108050000000000000000000000000000000000020 -:108060000000000000000000000000000000000010 -:108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000000000C0 -:1080C0000000000000000000818100E007000000C7 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000000000000000000090 -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000000000000EF -:1081900000000000000000000000000000000000DF -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F -:10820000000000000000000000000000000000006E -:10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE -:1082800000000000000000000000000000000000EE -:1082900000000000000000000000000000000000DE -:1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E -:1082E000000000000000000000000000000000008E -:1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:10831000000000000000000000000000000000005D -:10832000000000000000000000000000000000004D -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D -:1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED -:1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D0000000000005610A2F850D00A000000000CC -:1083E000000000000000000000000000000000008D -:1083F000000000000000000000000000000000007D -:10840000000000000000000000000000000000006C -:10841000000000000000000000000000000000005C -:10842000000000000000000000000000000000004C -:10843000000000000000000000000000000000003C -:10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C -:10846000000000000000000000000000000000000C -:1084700000000000000000000000000000000000FC -:1084800000000000000000000000000000000000EC -:1084900000000000000000000000000000000000DC -:1084A00000000000000000000000000000000000CC -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000000AC -:1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C -:1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B -:10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000000FB -:1085800000000000000000000000000000000000EB -:1085900000000000000000000000000000000000DB -:1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B -:10860000000000000000000000000000000000006A -:10861000000000000000000000000000880088004A -:108620001000882004002000C000C0008800000066 -:10863000000088008800000088002000C0040000BE -:10864000200010004000000000002000200000007A -:108650000000200040000000000020000003200077 -:10866000A000200020002000C000A000C000A0004A -:1086700000008400880020000000C0A021800000CD -:108680002000C00020008800200200008800200098 -:10869000000020208800200088000000C0000000AA -:1086A0000000000000024000000000001000000078 -:1086B000000200020000104000000000000000C0A6 -:1086C000000000000000002000C0100010A000000A -:1086D00000A000A00000000000A0000000000000BA -:1086E0000000000000400500000000000000004005 -:1086F000000000000000000000000000000508204D -:1087000000200000000000A00020002000A0202089 -:108710000000002000A02000000000200000000059 -:1087200000000040000000400000000002000800BF -:1087300000000000000000000000000000084000F1 -:108740000000000000000000000000000000001019 -:1087500000000000000000000000000000084004CD -:108760000000000000000000000000000000000009 -:108770000010000000000000000000400040000861 -:108780001002004000400000000000000000000057 -:108790000000000000000000000000400040000851 -:1087A0002000004000000040000000000000000029 -:1087B0000000009000000000000000000000000128 -:1087C0008000000000000000000000000000000029 -:1087D0000000000000000000000000000000000198 -:1087E0008001000000000000000000000000000008 -:1087F0000000200020000000000000000000000039 -:108800000001800100000000000000002040004046 -:1088100000000000404000000000000000000000D8 -:108820000901C0000000000000000000000000007E -:108830000000000000000000000000000000000038 -:108840000000000000000000C000C0000000840024 -:108850000800820000008200840000000000000088 -:108860000000000000000000000000000000000008 -:108870000000C00000000000000000000000000038 -:10888000880000110000000000000000000000004F -:1088900000000000080000000000000000000000D0 -:1088A00000000000000008000000000000000000C0 -:1088B00000000000000000000000000000000000B8 -:1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000050000000000000093 -:1088E0000000000000000000000000000400000084 -:1088F000000000000000000009000000000000006F -:108900000000000000000000000000000000000067 -:10891000000000000000000000000900000000004E -:10892000000010000000000010000000000008001F -:10893000820000000800080000000000080000009D -:10894000000000000800C08808000800820008003D -:108950000000000082000000840000000400840089 -:10896000080000000000908800000000C000000027 -:1089700084008200000000008200A00000000000CF -:108980000000C00000000000C004A00000000000C3 -:1089900084000000C0008400C00082000000A0002D -:1089A000A0004000000082000882000000000000DB -:1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000005000000000000A2 -:1089D0000000000000000000000000000000000097 -:1089E0000000000000000000002100000000000066 -:1089F0000000030000000000000000000000030071 -:108A0000050000000000000000100311000000003D -:108A10000010000000000000000000000000004006 -:108A2000000000000000000000000509A000000098 -:108A30000800C000A000A000C000820008000000E4 -:108A4000000008000800080000008200000000008C -:108A50000000C0000000000008000000000000004E -:108A6000000000000000840008000000000000007A -:108A70000000000082000000000040008200900022 -:108A800004000000000000000000000000000800DA -:108A900000000800900000008800000000001000A6 -:108AA000000000110000000410000000C0210000C0 -:108AB0000000000000000020000000000000000096 -:108AC00000000000000000000000000000000000A6 -:108AD0000000000000000000000000000588090000 -:108AE00000000088000000000000000000000000FE -:108AF000110000840300008400000000000000005A -:108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B20000000000000000000000000000000000045 -:108B300090000800400040000800C00090001000B5 -:108B40000000000000000000000000000000000025 -:108B500000000000C0000000080008000000000045 -:108B60000000000000000000000000000000000005 -:108B700000001000000000004000A0000002000003 -:108B80000002000000000000080082000000000059 -:108B9000000000000000000000000000840240000F -:108BA00084000000000000009000000000000000B1 -:108BB00010000000000000000000000000000000A5 -:108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000000000008000865 -:108C000000102040000800000010001000000000CC -:108C10000200000000000000000000000000000052 -:108C20000000000000000000000000000000000044 -:108C30000000000000000000000000000100000033 -:108C40000000008200000000002002C000000000C0 -:108C500000010000000020000000000100000000F2 -:108C6000000001200100C0000020C0820000C00000 -:108C700000010000000000000000000000000000F3 -:108C80009000000101200001C0000002C08200002D -:108C9000C000000100000000000000000001000012 -:108CA0000000000001900001000000101010000002 -:108CB00000000001000000000000000000050200AC -:108CC0000000000505000005050000008000000010 -:108CD0000000004100000000000000000003000050 -:108CE0000000000308000205A100000080800000D1 -:108CF00080000003000000000000000000000020D1 -:108D00000000000000030800001083000080808045 -:108D100000008000000300000000000000000010C0 -:108D2000000000000003400000101100008000005F -:108D300000000000004100000000020000000000F0 -:108D40000000210000000300A000900000000500CA -:108D5000800000000003800200000200000000000C -:108D60000000200000000200400005000000030099 -:108D70008000000000C0802000000000080000000B -:108D80000000000020000000100040004000000033 -:108D900003000000000000808005000009000000C2 -:108DA000000000000800000020001100100000007A -:108DB00010000000000000008040000001000000E2 -:108DC0000000000000000000000002000308000096 -:108DD0000000400000000000C00100000100000091 -:108DE00000000000000000000100900040C00000F2 -:108DF00001004000000000C08200000000000000F0 -:108E000000000000000000000000010009000890C0 -:108E1000000001009000000000C08200000000007F -:108E2000000000000000010000000000080003082E -:108E300000000000820000000000C00000000000F0 -:108E40000000000000000000000090010090000001 -:108E50000000000000000000000100000000000011 -:108E600000000000000000000000400100020000BF -:108E700001000000000000000000000000000000F1 -:108E8000000000000000000000000000040100409D -:108E9000000083000000000000000000000000004F -:108EA00000000000000000000000080182000088AF -:108EB00000000000000000000000000100000000B1 -:108EC000000000000000000000000041000300005E -:108ED000000005000000000000000041000000004C -:108EE00000000000000000000000004100200080A1 -:108EF00000004100000000000000004100000000F0 -:108F00000000000000000000000000000041802080 -:108F100000800000C10003000000000000410000CC -:108F200000000000000000000000000000058310A9 -:108F300000000000100000000000000000410000E0 -:108F40000000000200830000001000020200000088 -:108F5000004180000020000000000000000003200D -:108F60000000000200830000000200000500000075 -:108F700000410000004000000041000000000340EC -:108F800000000008800000C1000000028010820084 -:108F900000000041800800020000004100000000C5 -:108FA000404000008009008300000008802082000B -:108FB00000000041800000080000000000000000E8 -:108FC00002C000008201008300000001C001C10056 -:108FD000000000830200000000000000000000000C -:108FE000008900008201008300000001200082004F -:108FF000000000214000000000000001000000000F -:1090000000080000000020000040000000010201F4 -:1090100082000000008982010001000000010000C0 -:1090200000000188000008000083000000004000EC -:1090300041000000002104000000000000000000CA -:10904000000001040000000000000000000000001B -:1090500000000000811200E007004800000000004E -:109060000000000000000000000000000000000000 -:1090700000000000811200E00800484200000000EB -:109080000000484200000000000000000000000056 -:10909000000000000000811200E080004842000053 -:1090A0000000000048420000000000000000000036 -:1090B000000000000000811200E0070048000000EE -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:10913000000000000000000000000000000000002F -:10914000000000000000000000000000000000001F -:10915000000000000000000000000000000000000F -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF -:1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000000000000AF -:1091C00000000000000000000000757B00000000AF -:1091D000000000000000000000000000000000008F -:1091E0000000000000000000DEAE757B0000000003 -:1091F000000000000000000000000000000000006F -:109200000000000000000000DEAE0000757B0000E2 -:10921000000000000000000000000000000000004E -:1092200000000000000000000000DEAE757B0000C2 -:10923000000000000000000000000000000000002E -:1092400000000000000000000000DEAE61260340C8 -:109250000000000000000230A0000000000000003C -:109260000C4000000000000002C06486612603403C -:109270000000000000000230A0000000000000001C -:109280000C4000000000000002C06486000061265F -:1092900003400000000000000230A00000000000B9 -:1092A00000000C4000000000000002C0648661263F -:1092B00003400000000000000230A0000000000099 -:1092C00000000C4000000000000002C06486200086 -:1092D00020000000880000001000100010001000A6 -:1092E00010000000400040000000000010002000BE -:1092F000C00040000400400040004000000040006A -:1093000000000000200020000000400010000002CB -:109310002000400000002000200020004080840049 -:1093200020000000880020002000850020000000B0 -:109330000000200040008400400020002000880041 -:109340002000400020002000400040002000880055 -:109350004000000000020400400000000000000087 -:1093600000904000090020001000000000000000F4 -:1093700000000000000000000000000000004000AD -:10938000200000000000004000000000000000007D -:109390000000000000000000000040000000094044 -:1093A0000000000000000000100000404090090292 -:1093B00000001000100000002000202040002100CC -:1093C0000020090200000000000000000000000072 -:1093D000000000000000000002000000200000006B -:1093E00000000000000000009000000000000000ED -:1093F0000000000000000000084000000000000025 -:1094000000000000000000009000000000000000CC -:10941000000000000000000000000000000000004C -:1094200000400000000000000200000000004000BA -:10943000000000000000000000000200000000002A -:10944000000000000000000000009000000000008C -:10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000001000000000000000000000000BB -:1094B000800000000000000000000000000000002C -:1094C0000000000000000000000000000000008814 -:1094D0000000000000000004000000000000000088 -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000004000C00000004B -:10952000000000000100000000000000000000003A -:109530000000040010009000000000050000000082 -:10954000000000000000000000000000000000001B -:1095500000000000000000000000000021000800E2 -:109560004100000009004100000000000000000070 -:109570000800080000000000000041004100410018 -:109580004100050021000800000003000000210048 -:109590000000000000004100000000004100000049 -:1095A000410000000000020000000000000009006F -:1095B000000000000000C1000900000009000400D4 -:1095C0000200000020000000000000000000000079 -:1095D0004004080000000084000000000000C000FB -:1095E00000000000000000000800C00000000800AB -:1095F00000000000000000000800820008000000D9 -:10960000080000000000080000000000000000004A -:10961000000000001000A00000000000000000009A -:109620000800A0000000000008000000000000008A -:10963000000000000000000000000800080000001A -:10964000840000000000000000000800000000008E -:109650008200100000000800000000000000000070 -:109660000000000000000200000000000040004078 -:10967000004000400000000000000000000000006A -:1096800000001000000000000000000000000000CA -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A -:1096D0000000000000000000000000000000820008 -:1096E000C0000000000000000800000000000000B2 -:1096F000080000000000C000000008008200000018 -:109700001000000000000000080000000000C00081 -:10971000080000000080C00000008200A0000000DF -:10972000040000000000100000000000C000C000A5 -:10973000000000000000880001000002000000009E -:109740000000000000000000040000000000000015 -:109750000000000000000000400000000000A00029 -:1097600000000000000000000800000008000000E9 -:109770000800000000000900009000000000000048 -:109780000000000000000000008800000000000051 -:10979000000000000090031000880000000000009E -:1097A00000000000000000000000080408000300A2 -:1097B0000000080000900090030020040000030057 -:1097C000090000000000050000400400000409003A -:1097D00000001100009008004000000000000000A0 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:1098000000000000000082000000000000000000D6 -:1098100082000000000010001000000000000000A6 -:1098200008000000000008008400000000000000A4 -:109830000000100000000005020000000008000900 -:109840000041000000000000000000000000004196 -:1098500000000000000000000000C0000000000048 -:1098600000000000000000000000000000000000F8 -:1098700000000200000000000000000000000000E6 -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000000000098 -:1098D0000000000000000000000000000000000088 -:1098E0000000000000000000000000000000000078 -:1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:109930002088400400842084890800020004200458 -:109940000001A00100000001000000000000000074 -:109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 -:1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 -:1099B0000000000000800000000010000000000017 -:1099C0000000004100210508000300000000000025 -:1099D0000000000000000000000000000000000087 -:1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 -:109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000036 -:109A3000000000000000008900008080800080A1FC -:109A40000000008000000000000000000000000096 -:109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A9000000000000000000000000000400008007E -:109AA0002000200000000000000000000000000076 -:109AB0000000000000000800C0C0C00882C008000C -:109AC00002C0082088C000900000000000000000D4 -:109AD0000000000000000000000000000000000086 -:109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000000066 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B3000000000000000000091100010C09090C0D4 -:109B400021100010C0080408000000008900000077 -:109B50000000000000000000000000000000000005 -:109B600000000000000000000000000000000000F5 -:109B700000000000000000000000000000000000E5 -:109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000410000008000E4 -:109BC00000004100000080808000000010000200C2 -:109BD0000000000000000000000000000000000085 -:109BE0000000000000000000000000000000000075 -:109BF0000000000000000000000000000000000065 -:109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 -:109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 -:109C4000800000000000008000800000100008007C -:109C500000000800000000000000000000000000FC -:109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000000E4 -:109C800000000000000000000000000000000000D4 -:109C900000000000000000000000000000000000C4 -:109CA000000000000000009000080000000000001C -:109CB0000000000000000000000000000000900014 -:109CC000A02004C08800C000C0020810C00001002D -:109CD0000100000001000000000000000000000082 -:109CE0000000000000000000000000000000000074 -:109CF0000000000000000000000000000000000064 -:109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 -:109D30000000000000000000000000000000000023 -:109D400000000000000048420000000000004842FF -:109D5000840000E00000000000000000000000009F -:109D600000000000000000000000000000000000F3 -:109D700000000000000000000000000000000000E3 -:109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000000B3 -:109DB00000000000000000000000000000000000A3 -:109DC000000022000022600000600410082024002F -:109DD000002400000000000000000000000000005F -:109DE0000000000000000000000000000000000073 -:109DF0000000000000000000000000000000000063 -:109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 -:109E4000000000001100001109000009014002801B -:109E50008100008100000000000000000000000000 -:109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB000000004000000000000000000000000009E -:109EC00000000000000006000006448800000408AE -:109ED0000102060000060000000000000000000073 -:109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 -:109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 -:109F30000000000000000000000000000000000021 -:109F40000000000000000000900000900000448825 -:109F500010204080900000900000000000000000F1 -:109F600000000000000000000000000000000000F1 -:109F700000000000000000000000000000000000E1 -:109F800000000000000000000000000000000000D1 -:109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000060000000000031 -:109FD0001000000000000000080000210003800DB8 -:109FE0000000000000000000000000000000000071 -:109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 -:10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 -:10A030000000000000000000000000000000000020 -:10A040000000000000000000000000000000000010 -:10A0500000000000000000000000000055FF415516 -:10A0600000000000000000000000000000000000F0 -:10A0700000000000000000000000000000000000E0 -:10A0800000000000000000000000000000000000D0 -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 -:10A0C0000000000000000000000000000000000090 -:10A0D000000000000000000000000000000055FF2C -:10A0E00041550000000000000000000000000000DA -:10A0F0000000000000000000000000000000000060 -:10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A1500000000000000000000000000000000000FF -:10A160000C000500000000000000000000000000DE -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F -:10A1D000000000000000000000000000000000007F -:10A1E00000000C0C0505000000000000000000004D -:10A1F000000000000000000000000000000000005F -:10A2000000000000000000000000000088000400C2 -:10A21000200000000000000000004000200040007E -:10A22000400020001000100020008800880000007E -:10A2300020000000000088008400400200000000B0 -:10A2400020000000000000000000000120000000CD -:10A250000000200088000000000000002000000036 -:10A2600000000000000000000000040004000000E6 -:10A27000000020002000A00000000000C00010002E -:10A280004000100004000000000020000002000058 -:10A29000000000000090100000000000000000021C -:10A2A0000000000040C0800080028000000000002C -:10A2B000000000004000000000000000410000001D -:10A2C00000004020000000000000000000004000EE -:10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000020004E -:10A2F00000000000000000001100000021004100EB -:10A30000210000000000000000000000000020000C -:10A31000200020002000040004000820028000002B -:10A32000000000000000000000000000021000001B -:10A3300000000000000000000000080008400000CD -:10A3400000000000000000000000020002100000F9 -:10A3500000000000000000000000000008000010E5 -:10A3600000000000000000000000000000000200EB -:10A3700020000000000000000000000008000000B5 -:10A38000000000000000000000000000000002418A -:10A39000800080008000800080008000000100209C -:10A3A0000000000000000000000000000040000865 -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000C0CD -:10A3D000000000000000000000000040000000003D -:10A3E000000000000000000000000000000000006D -:10A3F00000C000000000000000000000000000009D -:10A40000000000000000000000400000000000000C -:10A410000000000000030000000000000000000039 -:10A420000000000088000000000000210100000082 -:10A430000000000000000000000000080000000014 -:10A44000000000000000000000000000000000000C -:10A450000000000084001000000000000000000068 -:10A460000400000040008400000000000000000024 -:10A47000000000000000000000000000001040107C -:10A480000000400084000410000004000000C00030 -:10A4900000000000000000000000000000000000BC -:10A4A000000000000000000000000000000020008C -:10A4B0000000000000000800000000000000000094 -:10A4C000100021000000000000000000000000005B -:10A4D000080000000000030000000300210041000C -:10A4E000000003000800001000100000000000A0A1 -:10A4F00000A040000000000000A0000000000000DC -:10A500000000000000000004000000000000000047 -:10A51000000000000000000000008200C0000800F1 -:10A520000000000000000800100000008200010090 -:10A53000000020001000A000000008000000000043 -:10A540000000000082008200000084000000A000E3 -:10A550000800A000820000000000000000000000D1 -:10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000000000000000DB -:10A580000000000000000000000084000000000047 -:10A590000000000000000000000000820000000039 -:10A5A00000000000000000000000000000000000AB -:10A5B0002000000080008004000000000000000077 -:10A5C000000000000000000000000000000000008B -:10A5D0000000000000000008000000000000000073 -:10A5E000000000000000000000000000000000006B -:10A5F000000000000000000000000000000000005B -:10A600000000000000000000000008000000000042 -:10A6100000000000000000000000000000008200B8 -:10A620000000002100000000000000000000820087 -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000800F2 -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900010000000000000000000000000000000AA -:10A6A0000000000000002100000000000000000089 -:10A6B0000500000003000000000000000000000092 -:10A6C000000000000000000400000000000008007E -:10A6D0000300000000000020000000000000000057 -:10A6E0000000000000000510031008000300000037 -:10A6F00040900400080805200000102040200800B9 -:10A700000000000000000020200000000000000009 -:10A710000500000000000000000000000000020032 -:10A72000080002000000004100410041004100001B -:10A730008402000000001000000000000000000083 -:10A74000000000008200000000000000000008007F -:10A7500000000800000000000000000008000000E9 -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000800000000000000019 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000010100010015 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A0000000000000000000110000000000000097 -:10A8B0000000000000000000000000000041102027 -:10A8C0001020002000000000000000000000000038 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F0000000000000000000000000000000000058 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000009000000090000000015 -:10A930000080000000800000000000000000100007 -:10A94000200008004100000000000000000000009E -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B00000000008000000C00000000000000000CF -:10A9C0000120000000000100000000000000000065 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA2000000000000000000000000000080000001E -:10AA30000000000000000400000000000000000012 -:10AA40000000000000000000000100000000000005 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA0000000000000000000000000000000800026 -:10AAB0000000090005000000800000000000000008 -:10AAC00000000000000000050041004100000000FF -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB300000000000000000020021000000000000F2 -:10AB40000000000000004120210010000000000073 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000010000000100000083 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC30000000600000E000000000000600000700C7 -:10AC4000000A0000000000000000600000E00000BA -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000000000000000000013 -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000000000000A2 -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF300000000000000000000000000000000061B0 -:10AF40000007800D000005000A28050000A0000091 -:10AF50000000000000000000000180000000000070 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 -:10AFD00000000000000000000055000FF000FF001E -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B05000000000000000000000000055000FF0009C -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 -:10B0D000000000000000000000000000000F003C25 -:10B0E0000C0C000F00000000000000000000000039 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B150000000000000000000000000000000000FE0 -:10B16000003C0C0C000F000000000000000000007C -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C00000000000000000000000400000004000FF -:10B1D000200040004000200000000000000020008F -:10B1E0001000000000008800840040000000000003 -:10B1F0001000880040002000000000000000000057 -:10B200004000880000000000000000000000000076 -:10B2100000002000000000002000000000000000EE -:10B22000000000000000000000000000000000001E -:10B2300000002000000000002000000000000002CC -:10B2400000408400400000000000000010000000EA -:10B25000100040000000000000000002400040001C -:10B26000100040C04000400240004000000040008C -:10B2700020004000400010000002000040000000DC -:10B2800040002040000040002000000000000000BE -:10B29000000000000020400000000000000000004E -:10B2A00010000000100040000002000000004000FC -:10B2B000000040004000400000000000400040024C -:10B2C000000000004000000000020000000000003C -:10B2D000000000000000000000000000000000006E -:10B2E000000008090000000000000000000000004D -:10B2F00000000000000088000000000000000000C6 -:10B300000000000900000000001000000000000024 -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000010000000000000000000000000005D -:10B3E000000040000000000000000000000000001D -:10B3F000000000000000000000000000000000004D -:10B4000000008200000008000000000000000000B2 -:10B41000000000004000000000008400A0000800C0 -:10B420000000400000001000840008000800040034 -:10B430000000000000000000000000000000880084 -:10B4400000000000000000001000040000000000E8 -:10B4500000000000000000000000000008000800DC -:10B46000000005000800040041000000000000008A -:10B4700000000000000000000000080000000800BC -:10B48000000000000000000000002100000000009B -:10B49000000000000800000000000000000008009C -:10B4A000000000001000000000000000000000008C -:10B4B0000000000000000000000000000400040084 -:10B4C000000000000020000000000000000000005C -:10B4D000000000000000000000000000000000006C -:10B4E0000000100000000000000000000000080044 -:10B4F000000000000000080000000000000008003C -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000002000000E9 -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000000000000000000000006B -:10B5E000400000000000000000000000000000001B -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000100000000000CA -:10B670000000080005000900210000000000000093 -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000010008A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000000000000000000000005A -:10B6F000000010000000000000000000000000003A -:10B700000000000000000000000000001000000029 -:10B710000000000000000000000000000000000029 -:10B720000800000000000000000000000000000011 -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 -:10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 -:10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000000000000022 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C1000000000000C000000000000000000000006F -:10C1100020000000000000000000000000000000FF -:10C1200000000000200000000000000000000000EF -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000010004102410041C010C04A -:10C19000000000C000000000000200C000024000DB -:10C1A00000004000000040000000004010000000BF -:10C1B000000200020000400010000000000000002B -:10C1C000000000000000000000000002000000006D -:10C1D000000000001000000000020000000000004D -:10C1E000000000000000000000000000100000003F -:10C1F000000000020000000000000000000000003D -:10C20000000000000000000000000000000000002E -:10C2100000000000020008400000000000000000D4 -:10C2200000000000000000400000000000000000CE -:10C2300000000000000000100000000000000000EE -:10C2400000000000000002100000000000000000DC -:10C2500000000000000000000000000000000000DE -:10C26000000000000000000000400000000000008E -:10C2700000000000000000000010000000000000AE -:10C28000000000000000000002100000000000009C -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C3100000000000000020000000000000000000FD -:10C32000000000000000000082000000000000008B -:10C3300000000000000000000800000000000000F5 -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000001000CD -:10C360001000000000000000000004008800000031 -:10C370000000000000000000840000000400000035 -:10C3800004000000000000000000000000000000A9 -:10C39000000000000000110000000000000000008C -:10C3A0000400000000000000000000000000000089 -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D0000500000000000000000000000000410017 -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C410000000000000000000000000008400000098 -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000008200001A -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C5200000000000002000000000000000000000EB -:10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000000008000000000000000000D3 -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B0000500000000000000000000000000000076 -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C600000000040000000000000000000000000026 -:10C61000000000000000000000000000000000001A -:10C6200000000000000040000000000000000000CA -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A -:10C6A000000000000000000040000000000000004A -:10C6B0002100000000000000001000000000000049 -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 -:10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD300000000000100000000000010001804180A0 -:10CD4000218021800080010001000080200000007F -:10CD500000000000100000000000000000000000C3 -:10CD60002000200000000000000000000000000083 -:10CD700000000000000300000000000000000000B0 -:10CD80000000200020000000000000000000000063 -:10CD90000000000000000000000040000000000053 -:10CDA0000000200020000000000000000000000043 -:10CDB000000000000000400040001002040020209D -:10CDC00020202020202040200400040000204000DB -:10CDD0002000100200002000400000001000400071 -:10CDE00020004000000000000000000000000000E3 -:10CDF00040000040002000004000400040000000D3 -:10CE00000000400000000000000040000040210041 -:10CE1000408440000002000240024090000040C0F8 -:10CE20004000400000000000004000000000000042 -:10CE30004000000000000000040004000020022068 -:10CE4000050005002100050004000100010001406B -:10CE5000000000000000000000000000000008408A -:10CE60000000000000100000000000000000004072 -:10CE700000000008000000000000004000400040EA -:10CE800000400200020000402040004000400040FE -:10CE9000004000400040004000400200020000400E -:10CEA00002000200020000400040000000000000FC -:10CEB0000040000000000000000080048000000925 -:10CEC0000009A008A0008408A00880080400040845 -:10CED000040800080900000800080000000000081D -:10CEE0000008000800000008000800080000000812 -:10CEF0000008000410000008000800000001000104 -:10CF0000000900098008800000098009000900016B -:10CF100000090009000100410009000980008000AB -:10CF2000000980088008800000090009000800004E -:10CF300000080008000000000008000800000005CC -:10CF400001000000040000000000000000001000CC -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800088000000000000000000000000004000D9 -:10CF90000000000000000021000000000000000070 -:10CFA000000000000000000300000000000000007E -:10CFB0000000000000000000000000000000090068 -:10CFC000090004001100000000000000040000201F -:10CFD000030000000000000000000000000000004E -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000800000000000000000029 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D0200000004000000000000000000000000000C0 -:10D0300000000000000000000000000000000000F0 -:10D04000C00004000000C02000000800000900002B -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D08000000085000000000000000000000000001B -:10D09000200082800000010000000000000000006D -:10D0A000820000800000010000400000000000003D -:10D0B0000000000000000000000000000000000070 -:10D0C00000000000800000000000000000000000E0 -:10D0D00000000000000000000000009000000000C0 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000200000000000000000000001D -:10D110000000800000080000024000000000000045 -:10D1200000000000000800000200000000000000F5 -:10D1300000000000000000000000000000000000EF -:10D14000000000000880000000000000080000004F -:10D150000000C0000000000000000000000000000F -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D1800000000000000084000000200000000221D8 -:10D1900000000000C0008204000000002000022106 -:10D1A00000000000C0400004000000002000000358 -:10D1B000000000000040000000000000002000000F -:10D1C000000000000000002000000000000000003F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000800000009E -:10D21000800000000000000000010000000080000D -:10D2200080000000100000010001000000008000EC -:10D2300000000000000000010000000000000000ED -:10D240000000000000000000000000410000080095 -:10D25000000000400000000000000000000000008E -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000001100000000008D -:10D2900000000000020000400040000010000008F4 -:10D2A0000000000002000040000000001000000824 -:10D2B000000000000000004000000000000000002E -:10D2C000000000000000000000000000000000005E -:10D2D000001000000000000000000000000000003E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000A00000007D -:10D31000000000000000800000010001000080000B -:10D3200000010000000080000001000000008000FB -:10D3300000010000000000000001000000000000EB -:10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000C1DC -:10D3900000000001000000C000000100000041C1C9 -:10D3A00000000000008800C000040000000041C12F -:10D3B00000000000008800C0000400002000000001 -:10D3C000000000000000000000000000000020003D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D4100020C1002111090000088000000800000060 -:10D4200089C111001103008300800080000000000A -:10D4300089C11100110300830080008000000000FA -:10D4400000000000000000000000000000000000DC -:10D45000000000000000000000200000001000009C -:10D46000000000800000000000000000000000003C -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D490000000200000008900C1800000000300009F -:10D4A0008000400000004111C100000000000000A9 -:10D4B0008000400000004111C10000000000000099 -:10D4C00080000000000000000000000000000000DC -:10D4D000000000000090000000200000004000015B -:10D4E0000090000000C000000040000000000000AC -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D5100000000000002000008400C188000000001E -:10D520000000C000884000000001C10000000000B1 -:10D530000000C000884000000001C10000000000A1 -:10D540000000C0000000000000000000000000001B -:10D550000000000001000000880000000100200021 -:10D560004000000000000000020000000000000079 -:10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B -:10D5900000000000000040000090890001C004006D -:10D5A0000010000000C100000000000000C10000E9 -:10D5B0000010000000C000000000000000C10000DA -:10D5C0000000000000C0000000000000000000009B -:10D5D000000000000000100000000000000010002B -:10D5E0000000000005004000000080000000000076 -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D6100000000000000000008000008085000980FC -:10D62000800000800003009100400500000900C157 -:10D63000000000800000008000400500000900C1DB -:10D64000000000000000008000000000000000005A -:10D65000000000000000000000000040000000008A -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D690000000000000000000000041100900000030 -:10D6A00008098000000000800000C1108809000007 -:10D6B00009038000800000800000C110880900007C -:10D6C000090380008000000000000000000000004E -:10D6D000000000000000000000000000000000004A -:10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000101010006 -:10D7200000009100C000000000080000C10191014C -:10D7300000000101C000020000080000C1019101C9 -:10D7400000000101C00002000040000000000000D5 -:10D750000000000000000000000000000041000088 -:10D760000700000000000001800000000000000031 -:10D7700080006000000000000000000000000000C9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000810008 -:10D7A00000E000000000880000E0000000008100B0 -:10D7B00000E0000000000000000000000000810008 -:10D7C00000E0000000000000000000000000000079 -:10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D820003C3C3C3C0000F0F00000FFFF0000F0F04A -:10D83000000000FF0000AAAA000000FF0000F0F0B6 -:10D84000000000FF0000AAAA000000FF0000FFFF88 -:10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 -:10D8A00000003C3C3C3C0000F0F0000000000000A8 -:10D8B000F0F0000000FF0000AAAA000000FF000036 -:10D8C000F0F0000000FF0000AAAA000000FF000026 -:10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 -:10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 -:10D9200000000000FFFF0000FF000000FFFF0000FC -:10D93000FFFF00003C3C00003C3C0000FF000000FA -:10D94000FFFF00003C3C00003C3C0000FF000000EA -:10D950000000FFFF000000000000000000000000C9 -:10D9600000000000000000000000000000000000B7 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 -:10D990000000000000000000000000000000000087 -:10D9A00000000000000000000000FF000000000078 -:10D9B0000000000000003C3C00003C3C0000FF0078 -:10D9C0000000000000003C3C00003C3C0000FF0068 -:10D9D0000000FFFFFFFF000000000000000000004B -:10D9E00000000000000005000A28050000A00561F5 -:10D9F0000A86150D00A005000A00150000A0000011 -:10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 -:10DA200000000000000000004002800180259202FA -:10DA300040E3800780299202408280018020920288 -:10DA40004082800000209202408280018020920269 -:10DA500040828000002082020000000000000000E0 -:10DA600000000000000000000000000000000000B6 -:10DA700000000000000000000000000000000000A6 -:10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 -:10DAA00000000000000000000000141455000000F9 -:10DAB00000000000000000FF0000550014143C3C72 -:10DAC000003C0000000000000000550014143C3C25 -:10DAD000003C00000000000000000000000000000A -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 -:10DB20000000000000000000000000001414550078 -:10DB3000000000000000000000FF00005500141469 -:10DB40000000003C0000000000000000550014141C -:10DB50000000003C00000000000000000000000089 -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000000000000085 -:10DBA00000000000000000000000000000000F0066 -:10DBB000FF002828003C00000000000000000C0CC2 -:10DBC00005052828003C00000000000000000C0CA7 -:10DBD00005052828003C00000000000000000000AF -:10DBE0000000000000000000000000000000000035 -:10DBF0000000000000000000000000000000000025 -:10DC00000000000000000000000000000000000014 -:10DC10000000000000000000000000000000000004 -:10DC200000000000000000000000000000000000F4 -:10DC30000F0000002828003C000000000000000049 -:10DC40000C0C05052828003C000000000000000026 -:10DC50000C0C05052828003C000000000000000016 -:10DC600000000000000000000000000000000000B4 -:10DC7000000000004000200088000000200040005C -:10DC80000000200000000000200000000000200034 -:10DC90004000C00000001000200000002000200014 -:10DCA00000002000000088000000000000002000AC -:10DCB0000000C00020000000200020000000200024 -:10DCC00020000000200000002000000000000000F4 -:10DCD00020000000000000000000400000000000E4 -:10DCE0000000000000000000000000000000000034 -:10DCF00000000002000000000000400200001000D0 -:10DD000000004000000800001000000000000002B9 -:10DD100000001000000000000000000000000000F3 -:10DD200000000002000000000000000000400000B1 -:10DD30000000000040004000000000000000004023 -:10DD400000000000000000020000000000020000CF -:10DD5000000200200000000000000000000200009F -:10DD600000000000000200000002000000000000AF -:10DD700000000000004002000000004002000040DF -:10DD80000040080000090000000000000000000042 -:10DD9000000008400000000000000000000000003B -:10DDA0000040021000000000000000000000000021 -:10DDB00000400040000000000000000000000000E3 -:10DDC000000000400800000000000000000000000B -:10DDD0000000000000400200000000000000000001 -:10DDE00000000040001000000000000000000000E3 -:10DDF00000000000004000000000000800000002D9 -:10DE000000000008000020000008000000000000E2 -:10DE10000008000800084000000000080008000892 -:10DE200000000008000800000002000000002000C0 -:10DE3000000800820008000020000000008200842A -:10DE400000820000008800080000000000000000C0 -:10DE5000000000020000008200000000000000003E -:10DE600000000000000000080000000000000000AA -:10DE7000000000000000000000000000000000089A -:10DE80000008002000000008000000000000000062 -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 -:10DED0000005000000000000000900000000000034 -:10DEE0000000000000000000000000000000000032 -:10DEF0000000000000000000000003000800000017 -:10DF00000000000000000000000000000000000011 -:10DF10000000000000000000000000000000000001 -:10DF200000000000000000000000000000000000F1 -:10DF300000000300000000000000000000000000DE -:10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000011000000B0 -:10DF600000000800000000000000000000000000A9 -:10DF70000000000000000000000000000011000090 -:10DF80000000000000000000000000000000000091 -:10DF90000000000000000000000000000000000081 -:10DFA0000000080010000000000000000000000059 -:10DFB0000000000000000000000000000000000061 -:10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000000000000000041 -:10DFE000000000000000C000000008000800000061 -:10DFF0000800000000000000000000000000000019 -:10E00000000000400084000000000000000000004C -:10E0100000000000000000000000080000001000E8 -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 -:10E04000000008000500000000000000050041A0DD -:10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000800000000000000A8 -:10E07000210000000000000000000000000000007F -:10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000000000060 -:10E0C0000000080000000000000000000000000048 -:10E0D0000000000000000000000000000000000040 -:10E0E0000000000008000000000000000000000028 -:10E0F0000000000000000000000000000000000020 -:10E10000000008000000000040200000080010008F -:10E1100021000000000000000000000000000000DE -:10E1200000000000000000000000000000000000EF -:10E1300000000000000000000000000000000000DF -:10E1400000000000058400000000000000C0000086 -:10E1500000002140050000000084000000C0000015 -:10E160000000000008000000008400000000000023 -:10E17000000000000000000000000000000000009F -:10E18000000000000000000000001000000000007F -:10E19000000000400000000000000000000000003F -:10E1A000000000000000000000000000000000006F -:10E1B000000000000000000000000000000000005F -:10E1C00000000000000000000000000090000002BD -:10E1D000000000000000000000000000000000003F -:10E1E0000000000200100000000000000000C0005D -:10E1F000000000020000000000000000000082009B -:10E200000000820008000000000000000000000084 -:10E2100000000000000000000000000000000000FE -:10E2200000000000000000000000080000000000E6 -:10E2300000000000000000000000000000000000DE -:10E2400000000000000000000000000000000000CE -:10E2500000000000050000000000000000000000B9 -:10E2600000000000000000000000080000000000A6 -:10E270000000000000000000000000000000080096 -:10E28000000000000000030000000000000000008B -:10E29000000000000000000000000000000000007E -:10E2A000000000000000000000000000000000006E -:10E2B000000000000000000000000000000000005E -:10E2C000000000000000000000000000000000004E -:10E2D000000000000000000000000000000000003E -:10E2E000000000000000000000000000000000002E -:10E2F000000000000000000000000000000000001E -:10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD -:10E3200000000000000000000000000000000000ED -:10E3300000000000000000000000000000000000DD -:10E3400000000000000000000000000000000000CD -:10E3500000000000000000000000000000000000BD -:10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D -:10E3A000000000000000000000000000000000006D -:10E3B000000000000000000000000000000000005D -:10E3C000000000000000000000000000000000004D -:10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000001D -:10E40000000000000000000000000000000000000C -:10E4100000000000000000000000000000000000FC -:10E4200000000000000000000000000000000000EC -:10E4300000000000000000000000000000000000DC -:10E4400000000000000000000000000000000000CC -:10E4500000000000000000000000000000000000BC -:10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C -:10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C -:10E4C000000000000000000000000000000000004C -:10E4D000000000000000000000000000000000003C -:10E4E000000000000000000000000000000000002C -:10E4F000000000000000000000000000000000001C -:10E50000000000000000000000000000000000000B -:10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000000000000CB -:10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C000000000000000000000000000000000004B -:10E5D000000000000000000000000000000000003B -:10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A -:10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000000000EA -:10E6300000000000000000000000000000000000DA -:10E6400000000000000000000000000000000000CA -:10E6500000000000000000000000000000000000BA -:10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000000000000009A -:10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A -:10E6A000000000000000000000000000000000006A -:10E6B000000000000000000000000000000000005A -:10E6C000000000000000000000000000000000004A -:10E6D000000000000000000000000000000000003A -:10E6E000000000000000000000000000000000002A -:10E6F000000000000000000000000000000000001A -:10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000000F9 -:10E7200000000000000000000000000000000000E9 -:10E7300000000000000000000000000000000000D9 -:10E7400000000000000000000000000000000000C9 -:10E7500000000000000000000000000000000000B9 -:10E7600000000000000000000000000000000000A9 -:10E770000000000000000000000000000000000099 -:10E780000000000000000000000000000000000089 -:10E790000000000000000000000000000000000079 -:10E7A0000000000000000000000000000000000069 -:10E7B0000000000000000000000000000000000059 -:10E7C0000000000000000000000000000000000049 -:10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000000000000000000000029 -:10E7F0000000000000000000000000000000000019 -:10E800000000000000000000000000000000000008 -:10E8100000000000000000000000000000000000F8 -:10E8200000000000000000000000000000000000E8 -:10E8300000000000000000000000000000000000D8 -:10E8400000000000000000000000000000000000C8 -:10E8500000000000000000000000000000000000B8 -:10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 -:10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000000000078 -:10E8A0000000000000000000000000000000000068 -:10E8B0000000000000000000000000000000000058 -:10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 -:10E9200000000000000000000000000000000000E7 -:10E9300000000000000000000000000000000000D7 -:10E9400000000000000000000000000000000000C7 -:10E9500000000000000000000000000000000000B7 -:10E9600000000000000000000000000000000000A7 -:10E970000000000000000000000000000000000097 -:10E980000000000000000000000000000000000087 -:10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000000000000000067 -:10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000000000000000047 -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 -:10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 -:10EA200000000000000000000000000000000000E6 -:10EA300000000000000000000000000000000000D6 -:10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000000000B6 -:10EA600000000000000000000000000000000000A6 -:10EA70000000000000000000000000000000000096 -:10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000000076 -:10EAA0000000000000000000000000000000000066 -:10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000000000000026 -:10EAF0000000000000000000000000000000000016 -:10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 -:10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000000000D5 -:10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000075 -:10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000000045 -:10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 -:10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 -:10EC200000000000000000000000000000002100C3 -:10EC30002000208020002000400020002000400212 -:10EC400089002000208020002000200040002000BB -:10EC50002000200020802000208020002100C00013 -:10EC600020002000200020002000200020000003C1 -:10EC70002000210020002100210889002000200020 -:10EC800089002180000021802100200020802000B8 -:10EC900020002100200020008800400020002000EB -:10ECA00084802080008020802000200020002080A0 -:10ECB0001090410000020000400000000000000031 -:10ECC0000040404000020008100000004002000028 -:10ECD000000000000000001000004008000040C0DC -:10ECE0004000400040000000000040000000000024 -:10ECF000000000002000000020000400040040008C -:10ED000000002000200241004004200040020004D6 -:10ED10000000000010000000004020400000000043 -:10ED20000000402000200020002000000000000221 -:10ED30000010050000000102840400000000000033 -:10ED400000000000000000000010000000000800AB -:10ED5000040000000040000000000000000000046B -:10ED600000000040004000400040004000400040E3 -:10ED700000800000218420042040208404A004A0FE -:10ED800004A004A0008400840104008401000104A4 -:10ED900001100100000000000000404102000200DC -:10EDA000020002000100008001200080000001003C -:10EDB00000000000100800084009040800080008CE -:10EDC00003080000200800080008004004000408B0 -:10EDD000040000824008000904080408000800102C -:10EDE0000008008400090009000900090001000969 -:10EDF000000100400000A005800980858005802179 -:10EE00008041802180410005000520090005200087 -:10EE10002003200020100000008400008084C0082F -:10EE20008000800880000408002004090020000001 -:10EE30000200000000008403000000000000002128 -:10EE400000000000000000000000000000000003BF -:10EE500000000000000000000000000000000000B2 -:10EE6000000000400000000000000000000000055D -:10EE70000000000000050000000500000080000008 -:10EE800082090000002100001003000000041000AF -:10EE900000000000001100000021A000C0000040A0 -:10EEA000000000000000000400200008000000082E -:10EEB0000000000000000000000000000000000052 -:10EEC0000000000000000000000000000000000042 -:10EED000000003000000000000000000000000002F -:10EEE0000000000000010000000000000000000021 -:10EEF0000500000003000000000000000000040402 -:10EF000000000300000000080000000800000001ED -:10EF10008000000000000000000000000000000071 -:10EF200000090000000000000000000100000000D7 -:10EF3000000000000000000041000000040200008A -:10EF4000C010820008000000000000000000000067 -:10EF500000000000820000210008000000094000BD -:10EF6000000000A1048810000108081000108210A1 -:10EF700000908500820082000000000082000000F6 -:10EF8000821001418240000300000100080000409F -:10EF900082850002830000000000020000890080DA -:10EFA0000000000000030800000000000020000036 -:10EFB00000000000000000800000000010000000C1 -:10EFC0000000000021000000000000000000080018 -:10EFD0000000000803000300000000000000000023 -:10EFE00000000000004002401000020000A00000ED -:10EFF0000000004020A0008400000010000000106D -:10F000000010000002100311081000101010000082 -:10F0100000010040000902004100000080000040A3 -:10F020000040000000100000008200840000000189 -:10F030000000000000000000004000000000000090 -:10F0400000000000000000000000000000080000B8 -:10F05000000000000000000082000000000000002E -:10F060000000000000100000000000000000000090 -:10F070000000000000001000100000002000000050 -:10F08000004000000440201110001000200020006B -:10F0900000400040084020400000000020002009FF -:10F0A000004000000000001102000000000002000B -:10F0B0000820000000000020000000000000000008 -:10F0C0000000000000000000000000000000000040 -:10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000800080000000800090 -:10F10000000000010000000100008000800080007D -:10F110008000000100010001000100820000800069 -:10F1200080000001000000000000800000000000DE -:10F13000800000010000000000010000000000004D -:10F140000000A00000000000000000000800000017 -:10F1500000000000000000000000000000000000AF -:10F1600000001000000000000000010000801100FD -:10F17000000000800080A1000000000000002000CE -:10F1800000000000004000400000000801034009AA -:10F19000850000000021000800000008210421046F -:10F1A00001040084000000400040000082000200D2 -:10F1B00002008200000001209020000000000000FA -:10F1C00000000000000041000000200400000000DA -:10F1D000000000000000000000000000000000002F -:10F1E0000000000000000488000000000200004051 -:10F1F0000200000000400040020000000082000009 -:10F200008010000800000001000100000000200044 -:10F2100004000200000000000000001000A08201B5 -:10F220008201028500410088000100010000000009 -:10F230008000808403000000040100010000000041 -:10F2400000000000000000000000000000000000BE -:10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000001C0DD -:10F2700000004000001000C000000000008800C135 -:10F28000100010000001000000C00000000000029B -:10F2900000C103014001000000C000002000000286 -:10F2A00000C100018400008801C0000408000000C3 -:10F2B00000C0000800000000080800200002042030 -:10F2C000000000000000000000000000000000003E -:10F2D000000000000000000000000000000000002E -:10F2E000000000000000000000000000000000001E -:10F2F000028040008000000000800000000000004C -:10F3000020C1914182400003000000800000000005 -:10F31000008040C188080209000800800500000044 -:10F3200000804088090383090002208021800000BA -:10F330000000008000800000000008000000008045 -:10F3400080000000000000000000030010004000EA -:10F35000410000000000000000000000000000006C -:10F3600000400000000000000000800000000000DD -:10F37000800000000000000080000000000000008D -:10F38000800010800200C009C183000080100000CE -:10F3900000088000108008804000C1C1800900037F -:10F3A00000098010100088001100A020000000005B -:10F3B00000008000000080000000800000000021AC -:10F3C00000808000000000000000800000000100BC -:10F3D0000000010000000000000000000008000024 -:10F3E0000000000000000000000000000200A0007B -:10F3F0008200C000000000000000C000000000000B -:10F400000000C000008800008401C18900000201E2 -:10F4100000000001C000018801080000C1090220AD -:10F4200000000000C001010211000000C020000027 -:10F4300000000000C000000010000000C000080034 -:10F44000200090040400820040000400020000003C -:10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F4700000000000000000000010000000C10000BB -:10F480000000008800C040000190880001C1000019 -:10F4900000002002000000C000010090100084C1A4 -:10F4A00000000803820000C100010189010101C0C0 -:10F4B00000020001000000C100000000000800C0C0 -:10F4C00020200020000204200000000000000000B6 -:10F4D000000000000000000000000000000000002C -:10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000050020000800C11E -:10F50000000000000000008080020389C14009C1A2 -:10F510000000000080800000048009082191401153 -:10F5200080C100408090000509830008030308089B -:10F53000098200C00010004000C1000000000080EF -:10F54000008000000000008080000000000000003B -:10F5500000000000000000000005000000000000A6 -:10F5600000004120210503002000000000000000F1 -:10F57000000000000000000000000000000000008B -:10F5800000008000000000000000C1822109050089 -:10F59000031100008002000080000000C1882109E2 -:10F5A00002090311C12005104100020008000300F8 -:10F5B00008000209800580800000000080008000B3 -:10F5C00000000000000500A0000080000000000016 -:10F5D00000800000000000000000000000000000AB -:10F5E0000000000001000000010000000000000019 -:10F5F0000000000000000020008800001000000053 -:10F6000000880000C000889000000000C1100001C8 -:10F61000000089000000C000000004000000C111CB -:10F62000000101899100C10000010000010001906A -:10F63000910001000001C000200200000000C00095 -:10F6400010000000000020009004202004000000B2 -:10F6500000A0000400000000000000000000000006 -:10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F6800000000000000000000000000000008800F2 -:10F6900000E000000000000000000020000000006A -:10F6A000880000E012000006000000440000000096 -:10F6B000880000E0000000000000000000000000E2 -:10F6C00000000000000000000081000007000000B2 -:10F6D000000000000000000000000000000000002A -:10F6E000000000000000000000000000000000001A -:10F6F000000000000000000000000000000000000A -:10F700000000FFFF0000F0F0000000FF000000FF1D -:10F7100000003C3C0000F0F000000000F0F00000B1 -:10F72000F0F000003C3C0000F0F00000FFFF0000A3 -:10F73000F0F000FF00FF0000F0F0000000FF00000C -:10F740003C3C000000FF000000FF00002A8A00F09F -:10F7500000D00000000000000000000000000000D9 -:10F760000000000000000000000000000000000099 -:10F770000000000000000000000000000000000089 -:10F7800000000000FFFF0000F0F0000000FF00009C -:10F7900000FF00003C3C0000F0F000000000F0F032 -:10F7A0000000F0F000003C3C0000F0F00000000021 -:10F7B0000000F0F000FF00FF0000F0F0000000FF8C -:10F7C00000003C3C000000FF000000FF0000AAAA6F -:10F7D00000F00070000000000000000000000000C9 -:10F7E0000000000000000000000000000000000019 -:10F7F0000000000000000000000000000000000009 -:10F800007D3C3F3C3C3C0000FFFF00003C3C0000D6 -:10F8100055550000FFFF0000FF00000000003C3CC9 -:10F8200000003C3C000055550000FFFF00003C3C40 -:10F830000000C3C3FFFF3C3C00000F0F0000FF00AF -:10F84000000055550000FF000000F0F0FFFF0B0026 -:10F850000F000105050100000000FFFFFFFF000091 -:10F860000000000000000000000000000000000098 -:10F870000000000000000000000000000000000088 -:10F88000000055000F003C3C0000000000003C3C24 -:10F8900000005555000000000000FF0000000000BF -:10F8A0003C3C00003C3C00005555000000000000BE -:10F8B0003C3C0000C3C3FFFF3C3C00000F0F0000B6 -:10F8C000FF00000055550000FF000000F0F0FFFFB2 -:10F8D00007000F0005050505000000004303410077 -:10F8E00000610006000D00000000000000000000A4 -:10F8F00000610006000D0000000000000000000094 -:10F90000000000000000000540638006002D920208 -:10F91000408280000020920240828001802092027A -:10F92000000040E38086002D920245828A019520E6 -:10F9300092A240E38086002D8202406380018021F4 -:10F94000920240E38006002D920240828000002057 -:10F9500082020000002800000000000000000000FB -:10F960000001000000000000000000000000000096 -:10F9700000005F553F3C0000000000000000000058 -:10F980000000000000000000000000000000A0FFD8 -:10F9900030FF000000000000000055003C00303047 -:10F9A00028280000000000000000000055003C0076 -:10F9B000003C3030FF05FF0C00FF00FF51550000F8 -:10F9C0003C3C3C18000000003CFC3CBE0000000039 -:10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000000000000000017 -:10F9F000000000000F000F000000000000000000E9 -:10FA000000000000000000000000000000000000F6 -:10FA1000A0A03030000000000000000050003000C6 -:10FA2000300028000000000000000000000050002E -:10FA300030000014101005050C0C30FFBAFF5551B2 -:10FA40000000000000000000000000F000AA00001C -:10FA500000000000000000000000000000000000A6 -:10FA600000000000000000000000C0FF82FF000056 -:10FA70000000000000000000000000000000000086 -:10FA80000000000000000000000000000000000076 -:10FA90000000000000000000000000000000FC006A -:10FAA00054543030A0A0000000000000000000000E -:10FAB00005001400F030A02000000000000000004D -:10FAC0000B07000000E000D0000000000000000074 -:10FAD0000000000000000000000000000000000026 -:10FAE000000000000000000000000000C0FF82FFD6 -:10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB2000000000003000A000000000000000000005 -:10FB30000000050514140000A020000000000000D3 -:10FB400000000F0F000000F000F0000000000000B7 -:10FB500000000000000000000000000000000000A5 -:10FB60000000000000000000000000008880840009 -:10FB700020C188008800C000C00084002000200050 -:10FB8000200020000000200020008800200020002D -:10FB90002000200020002000200000002000200085 -:10FBA000200088000000200020000003400000002A -:10FBB000000000002000000000000000880000009D -:10FBC000000020002100008020002003200084008D -:10FBD0004000000020800000008020002000000085 -:10FBE000000020002000000020002000100000087D -:10FBF000000000020000000000000000208400025D -:10FC000000000040100000000000000000000000A4 -:10FC10000040000000000040104000002140210092 -:10FC20000000000000000000400000000000000094 -:10FC30000040000000000000004000000000004004 -:10FC4000000000000000080000200000000000008C -:10FC500000400000000080040002000480000090CA -:10FC60000000000000000000000000000000000094 -:10FC700001000100A10000000400000801100005BF -:10FC800088000100010001000100090008000100D6 -:10FC90001140010001000000000000000800900079 -:10FCA00000090000002100000000080000400000E2 -:10FCB000000000000000000000000000000900003B -:10FCC0000000000000000000000000200888080973 -:10FCD0000000000900000000000000800100080092 -:10FCE00000000000000000000000000008000040CC -:10FCF00000C002080200020040000000000002886C -:10FD00002000400002000200020002000208000081 -:10FD1000020082050200408400000000001000087C -:10FD200000844000000000080000000040040000C3 -:10FD300000000084000040000008000000000008EF -:10FD4000001000004000000000080000000100401A -:10FD500000080008000000000084000000022008E5 -:10FD600000000000008800000008000000000008FB -:10FD700000040010000000008800000000000000E7 -:10FD80000008000800000000000800000000000457 -:10FD90000000000800000000000300000000000058 -:10FDA00000000080008000800005000000000000CE -:10FDB000000000000008000000000000000000003B -:10FDC000000200000003000000000000000000002E -:10FDD00000A100000000000000410000000401023A -:10FDE000000400000000000000000005000000000A -:10FDF0000000000000A0000000000000000008005B -:10FE000000000000080000000000000000000000EA -:10FE100021000000000010000000000809000000A0 -:10FE200000000000050400040008000000000000BD -:10FE300000000002000000000000080000000500B3 -:10FE40000800080200000000000000A003000000FD -:10FE50000000004000000000000000000000410120 -:10FE6000400103010300000000000000000000004A -:10FE70000000000000001091080008800000100041 -:10FE8000840000400040824000408240004010401A -:10FE90008280000000404000000200000040A000FE -:10FEA0008200000000008220000200000000080024 -:10FEB000820000000000000082000800000008002E -:10FEC000820900090021C041040000080000000070 -:10FED000A000000003000800000000000000000077 -:10FEE00008000000000400110010004100000000A4 -:10FEF000820000000000000000400000414000823D -:10FF00008002008210410001210100011001000166 -:10FF1000800110400500100100C000C00000000179 -:10FF200000C00000410000000400000010000000BC -:10FF300000C000C000000090000000C000C000C071 -:10FF400000C00000000000000002040000000000EB -:10FF5000009000A0000082008000000000901000CF -:10FF60000000000000000001000000000000000090 -:10FF70000000000000000000000000210000000060 -:10FF8000002100001000002120000021900000004E -:10FF9000004000001000A000200000080000004009 -:10FFA0000440000000000008000000800100008004 -:10FFB0000080000000000021000000000800000098 -:10FFC000000000000000000000000800080082009F -:10FFD000C000820000410141C1000182A000C000B8 -:10FFE0000000000000000000000001000000000010 -:10FFF00000000000000000000000000003000000FE -:02000004000FEB -:1000000000000000000080000000800000000000F0 -:1000100000000001000080000000800000000000DF -:1000200000010091000000000000008400081000A2 -:100030000004000400840000000000000000000034 -:100040000000008409000000000800022084A100D4 -:1000500008000800210020A004A002A0081003004E -:100060000000000000000000000000002000000070 -:10007000210000000000000000000000000000005F -:10008000020000090108090400800000000000408F -:1000900002008240000000040800008000000440CC -:1000A00000000000000000009000880090000000A8 -:1000B0000000000000080000001100080008000017 -:1000C00000020000000000000400820000219000F7 -:1000D000400040000000000290000100000000000D -:1000E0004000C000000000000100A000000001006E -:1000F00000000000000000000000000000000008F8 -:1001000005028400032002820201004008400040F2 -:1001100000018000000100A0000108020040000072 -:100120001101400203000500000000000000000073 -:1001300008000000000000C109000000000000C02D -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000040000009B -:10016000000000000000000000002000000000006F -:10017000200011000000000000000000000000004E -:10018000000000C001000200002000C104010001C5 -:10019000880102C000000002000000C100009001C0 -:1001A000880002C00000C002000000000000000043 -:1001B00000000001000082010001000000000000BA -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000A010A002CD -:1001E0000002008200000000000000000001010188 -:1001F000A00100000000000000000000000000005E -:1002000000000000008002008000000020C191106A -:1002100011098003808000000080000000C11105EA -:1002200011098008808005000080000000000000A7 -:10023000000000002041090909020002000000003E -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000800080000000000000000040103E -:10027000212140200040000000000000000000009C -:1002800000000000000080000000000080000080EE -:1002900010008900C1008000000000008000038081 -:1002A00000009000C100000000000000800000007D -:1002B000000000000000048004000202410500006C -:1002C000000000000000000000000000000000002E -:1002D0000000000000000000000000050080000099 -:1002E000800000008000000000000000000000000E -:1002F000100021002000400000000000000000006D -:100300000000000000000000080000000000C00025 -:10031000008801009000C100080000000000C0003B -:10032000008800009100C100000000000000C00033 -:10033000000000000000000000400000010101007A -:1003400000000000000000000000000000000000AD -:10035000000000000000000000000000000000108D -:1003600000000200A000A00040000000000000000B -:10037000000001200100010000000000000000005A -:10038000000000000000000000000001002100004B -:1003900000C120009001020000C100000000000028 -:1003A00000C000000000090082C10000000100013F -:1003B00000C100000000000000000000000100017A -:1003C000000100000000000000000000000000002C -:1003D000000000000000000000000000000000001D -:1003E00000000000C00200040002A0C000000000E5 -:1003F00000000000000100000000000000000000FC -:1004000000000000000000000000000000200010BC -:10041000004000C18009C110000200C100000000BE -:100420000000008000090000100880C100030008DF -:10043000000300C1000000000000000000040540AF -:1004400041400041000000000000000000000000EA -:10045000000000000000000000000000000000009C -:10046000000000000000008000800080900000007C -:10047000000000000000001005050003004000001F -:1004800000000000000000000000000000008000EC -:10049000000080000000C1904109C10009038000F4 -:1004A000000000000000C1901011880009118000B8 -:1004B00000020000000000000000000000004104F5 -:1004C00021000500111100000000000000000000E4 -:1004D000000000000000000000000000000000001C -:1004E000000000008000000080058008000000007F -:1004F000000000000000000000800805200000034C -:1005000000000000000000000000000000000000EB -:10051000C000000002000000C1410001880001018C -:10052000C000000000004000C1410101880001003E -:10053000C00000210000400000000000000000009A -:1005400001A000000000000000000000000000000A -:10055000000000000000000000000000000000009B -:100560000000C000200010004000C000820120A058 -:10057000080000000000000000000004000000006F -:10058000000100000000000000000000000000006A -:1005900000000000000000000000880000E00000F3 -:1005A00000000000000000000000810000E00000EA -:1005B000000000000000000000000000000000003B -:1005C0000000880000E000000000000000000000C3 -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000008100008A -:1005F000070000000000000000000000880000E08C -:1006000000000000000000000000000000000000EA -:1006100000000000F0F00000F0F00000F0F000003A -:10062000FFFF00003C3C000066660000F0F00000A8 -:10063000FFFF00003C3C0000666600000000000078 -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A -:1006600000000000000020104080000000000F008B -:10067000CF00A00005000000000000000000000006 -:10068000000000000000000000000000000000006A -:10069000000000000000F0F00000F0F00000F0F0BA -:1006A0000000000000003C3C000066660000F0F026 -:1006B0000000000000003C3C0000666600000000F6 -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E00000000000000000000408020100000000FB -:1006F0000F00CF00A0000500000000000000000077 -:1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:100780000000000000000000000000000000000069 -:100790000000000000000000000000003C3C0000E1 -:1007A0003C3C0000FFFF000000FF00000F0F0000B6 -:1007B0003C3C00006666000000FF00000F0FFFFFDA -:1007C00099990000000000000000000000000000F7 -:1007D0000000000000000000000000000000000019 -:1007E0000000000000000000000000000000000009 -:1007F00000000000003C0038000000CC00000000B9 -:1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000003C3C60 -:1008200000003C3C00000000000000FF00000F0F33 -:1008300000003C3C00006666000000FF00000F0F57 -:10084000FFFF999900000000000000000000000078 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:10087000000000000000003C001C00CC0000000054 -:100880000000000000000000000000000000000068 -:10089000000000000000000000000000000040E335 -:1008A0008006002D920240828001802092024082C8 -:1008B000800000209202408280018020920240E36A -:1008C0008006002D820200000000000000000000F1 -:1008D0000001800000000000000000000000000097 -:1008E0000000000000000000000000000000000008 -:1008F0000000000000000000A00000280000000030 -:100900000000000000000000006100038001000002 -:1009100000000000000000000000000000000000D7 -:10092000000000003CBE3CFC003000500C000F00FA -:1009300000000000000000000030005014005500CE -:1009400000000000AAFA3CFC0000000000000000CB -:10095000BE000E00003C303000000000000000002F -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000A000A000FF28 -:1009900000DB00000000000000000000000000007C -:1009A00000000000000000AA00F0003000500C0021 -:1009B00000000000000000000000003000501400A3 -:1009C00000000000000000F000F000000000000047 -:1009D000000000000E0000141010000000000000D5 -:1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000A000A0A6 -:100A100000000000000000000000000000000000D6 -:100A20000000000000000000000000000028000A94 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000055503C303020F0A000000000A5 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A800000000000000000000000000000000B005B -:100A90000F00F0F0E0D000000000000000000000B7 -:100AA000000000000000000000000000000000281E -:100AB000000A000F0A0A0000000000000000C30046 -:100AC0000303AA003C00000000000000000000003A -:100AD00000000000000000000000302000000000C6 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B10000B000F00000000000000000000000000BB -:100B2000000000000000000001022080010220906F -:100B300020002000000000004000200020002008CD -:100B40002000208085008800040020000000200094 -:100B50002000200000008200400020002000200033 -:100B600020002000000820000001200020000000DC -:100B700020002000200000000000000020002000D5 -:100B80002000400020004080400021802000000024 -:100B9000200020002000000000008800200020002D -:100BA000200020002000200040004001210204918C -:100BB00000200000000020022000090200000000C8 -:100BC00000000000400802200040100040004040AB -:100BD00000000000400000000000000000000000D5 -:100BE0000000000000004000000000004000000085 -:100BF00000000000000040000000000000000000B5 -:100C00000000000041004100004000C00208000058 -:100C100000000000000000000000000000000000D4 -:100C20000000000800000000000000000080030039 -:100C3000000004000040000004020000000000006A -:100C4000000004000000000002000000000010008E -:100C50000000014000000000000001000010000042 -:100C600000400000001000004000000000000000F4 -:100C7000080000100010000000000000004000000C -:100C8000000000000000080000000000000000005C -:100C900000000110A0400000000000000000000063 -:100CA000000000001000000000000000000000082C -:100CB0000808000880080901020000090208000075 -:100CC0000910000009000008000080102008000042 -:100CD0008008000840080000000000080408200008 -:100CE00000100001400809080010801009080000E9 -:100CF000000000100008000800C000C00008000844 -:100D0000040000C000000008808400000008000803 -:100D100000400040080800080040004000080408A7 -:100D200000000000090000840900000000082008FD -:100D30000000104101410000000000000000000020 -:100D40008200000000000000000000000000010020 -:100D50000000000000000000001000100010400023 -:100D6000000000080010002100000000000000004A -:100D70000000000500050000004100080008001008 -:100D8000084100000000000000000000000000001A -:100D9000000000000000C000000000030000000090 -:100DA000000010000000000000080000000000002B -:100DB000000040008300400021000000000000000F -:100DC0000000000000001000000000000000030010 -:100DD00020000000000000000000030000000000F0 -:100DE0000000000000000000000000000000000003 -:100DF0000000000003000000000000C00000000030 -:100E000003000000000000000020040000000000BB -:100E10000000000404000000000041A000000000E9 -:100E200000000000000000000000000000000000C2 -:100E300000000000084011099020408411000000CB -:100E40008211820908110841400000008200000060 -:100E50000800100090000000C0000000A000840006 -:100E600000008200040000000000000000000000FC -:100E700008000000000082000000000000000000E8 -:100E80000000000000000800000000000000080052 -:100E900000000000000010000000400000000400FE -:100EA00000000400000000000000000090000400AA -:100EB0000000000000000000C00000018040109011 -:100EC000000002000000030000080384210011005C -:100ED0000008000000900000000000001100000861 -:100EE000210003000084000000000020002000001A -:100EF00000000000101000000010000000040000BE -:100F0000008200000000000000C00000000400009B -:100F1000000000000000000000000000840000004D -:100F200000200008400000000000000000000088D1 -:100F30000000000003001000C020C00000000004FA -:100F40000000A000000000002000880088001000C1 -:100F50001000200000000400001000090000000044 -:100F6000400000080000000040008800820090005F -:100F70000000100000000000000000000000000061 -:100F8000004000000000000000008200000000009F -:100F90000010040000000000C0004000000000003D -:100FA0000000000000000000000000000000000041 -:100FB0000010000000000000000008000000040015 -:100FC00000004000000000000000000000C0000021 -:100FD000000083008900000000000000000000887D -:100FE00000000000000000000900000000000000F8 -:100FF00000000000000000000000000000000000F1 -:1010000020000000000000000000000000000000C0 -:10101000000000000000000000840000000000004C -:10102000000000000000000000004100000000007F -:101030000000000000000000000000000011054159 -:10104000000900000000820000000400C011000040 -:101050000000000020000000200810008200821024 -:10106000001000100004000484000004820000004E -:1010700000000010009100000000000000000008C7 -:1010800000080000000000400040000000000000D8 -:101090000000000000004000000000000800000008 -:1010A000000000020000000000000000000000003E -:1010B0000000000000000000000000000000000030 -:1010C0008408000002200200000008000000022046 -:1010D0002100040005008000000080208000000046 -:1010E00000000000000000200020040010000300A9 -:1010F00000000000110000080000000000000000D7 -:1011000000000000000020000000001000000000AF -:1011100000000000000000041100000000000000BA -:101120000000000000000000202000200488048847 -:101130002008000000000000030000000000000084 -:1011400000C00183048200020200000000002000B1 -:1011500000000000000000009003000500080209E4 -:1011600002880182021088080000000000000000D0 -:1011700020C00084008210040802000400880202DB -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A00000008400000000000400000000000000B7 -:1011B000000000000000000000000000000000002F -:1011C00000000880044080030080800000000000D0 -:1011D0000000000000000000000040C1001010806E -:1011E000809080002000800000804000000000000F -:1011F00000000000000000000000808000000000EF -:10120000800000000000000000000000000000005E -:1012100000000000000000000000000000000000CE -:10122000000000000000000000008000000000003E -:1012300000000000000000000000000000000000AE -:1012400000000000030003004000411000002000E7 -:1012500002004100000000000000000000001084B7 -:1012600000004180800000900005808000000000A8 -:10127000000000008000008800008080050003C09E -:10128000028041800000000000000000000000001B -:10129000000000000000000000000000000000004E -:1012A00000100000000004002000030041000000C6 -:1012B000000000000000000000000000000000002E -:1012C00000000000000000820008000001A10000F2 -:1012D0000100010001000000000000000000820089 -:1012E00003C0208485C0400004C1028202C0000007 -:1012F000000000000090080004C0082002C0900018 -:1013000002C02102A1C00000000000000000000097 -:1013100000000000000000000000000000000000CD -:1013200000000001000400000100000000000100B6 -:1013300000000000000000000000000000000000AD -:101340000000000000000000200091000901900151 -:1013500000080088000200C000000000000000003B -:1013600009020111C002208305820009C011820513 -:10137000000000000000000091020002C09021085F -:1013800011080008C00202880000000000000000F0 -:10139000000000000000000000000000000000004D -:1013A0000000000000000000000000040090008227 -:1013B00000C000000000000000000000000000006D -:1013C000000000000000000000008005040321214F -:1013D00000410080000000800000000000000000CC -:1013E000000041850890800808C1C18800848040C1 -:1013F00000C100000000000000004100000080006B -:101400001000C1000080800080000000000000008B -:1014100000000000000000000000000000000000CC -:10142000000000000000000000000000008000003C -:1014300000800080000000000000000000000000AC -:101440000000000000000000000000002100200556 -:1014500021000240000000000000004000000000E9 -:101460000000000041008309088920088000000076 -:10147000008000000010002100000000000080003B -:10148000008000000000000000000040000000009C -:10149000000000000000000000000000000000004C -:1014A000000000000000800280008000000000803A -:1014B00000030000004000000000000000000000E9 -:1014C0000000000000000000000000000000010417 -:1014D0000000010001010090000000000000000079 -:1014E00000000000000021880302C1111001080063 -:1014F00040A0021002000001000000000000840073 -:101500008204840484000482080204900400000021 -:1015100000000000000000000000000000000000CB -:101520000000000000000000C00120000200400098 -:1015300000040000000000000000000000000000A7 -:10154000000000000000000000000000000000009B -:101550000041000007000000000000000000000043 -:101560000000000000000000880000E00000484289 -:101570000000000000004842004100000700000099 -:101580000000000000004842000000000000484247 -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C000000000000000000000000000000000001B -:1015D0000000000000000000000000000000B45502 -:1015E000B4FF000000000000000040108020401008 -:1015F000802000000960240000240000000000009A -:1016000000002400002400810024000081246000E8 -:10161000006000000000000000000000000000006A -:1016200000000000000000000000000028FFF8F8A3 -:101630000000000000000000BCBCA0FF0000000093 -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000B400B4AA00000000000000000104020859 -:1016700001040208096000008100008100000000F0 -:10168000000000008100008181002400812400000E -:101690000900000900000000000000000000000038 -:1016A00000000000000000000000000000002828EA -:1016B00028280000000000000000A0A0A0A000005A -:1016C000000000000000000000000000000000001A -:1016D0000000000000001F1FFF14000000000000B9 -:1016E00000000000000000000000000000002400D6 -:1016F0000024069000000410082044880000000028 -:101700000000000000004400880004100140069022 -:101710000000069000000000000000000000000033 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 -:101740000000000000000000000000000000000099 -:101750000000000000000000141414140000000039 -:101760000000000000000000000000000000000079 -:101770008100008100000690014002800000448842 -:1017800000000000000000000044008808200280E3 -:10179000000006900000069000000000000000001D -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000615A2E050D0E -:1017E00000A000610006001D0000000000000000D5 -:1017F0000000600000018000100000610006000D84 -:10180000080000000028000001A0600000000000A7 -:10181000100000610006000D08000000000000003C -:1018200000000000000000000000000000000000B8 -:1018300000000000A00000000000000000610006A1 -:10184000009D0000000000000000000000000000FB -:10185000000000000000000000000000FF00FF008A -:101860002D285000000000000000000000000000D3 -:10187000000000000303C3000C0C000F0000000078 -:1018800030BA3CBE00000000000000000000000074 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000FF5DAC -:1018E000FF0C282855000000000000000000000048 -:1018F0000000000000000303C3000C0C000F0000F8 -:10190000000030BA00AA0000000000000000000043 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:10196000000000000000000000000000F0FFFAFA94 -:101970000000000000000000003C00550F0F0A0AA4 -:101980000000000000000000000000000000000057 -:1019900000000000000000000000000030FF30BA2E -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C000000000000000F8F828F800000000000007 -:1019D0000000000000000000000000000000000007 -:1019E0000000005000502000010000000000F0F056 -:1019F000F0F00000000000000000003C0055000076 -:101A00000A0A0000000000000000000000000000C2 -:101A10000000000000000000000000000000303066 -:101A200030BA0000000000000000000000000000CC -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000282828F80000000026 -:101A50000000000000000000000000000000000086 -:101A6000000000008400200088008800880020001A -:101A700020002008840020008800200000002000B2 -:101A8000C180218088000400000020002000880020 -:101A9000200020002000C00288000000880088008C -:101AA0002000C000000300000400000088002000A7 -:101AB000200004100000200040000400000020006E -:101AC0002000880020000000040088004000200062 -:101AD00088002000000020002000200000002000DE -:101AE0002000200020000004090004000002400241 -:101AF0004002000009000000400000C0400000005B -:101B000000000404082000004100414000000000E3 -:101B100000000900000009040004050000000000A6 -:101B2000000041000000000000000900000000006B -:101B30000000000000000000000000204100000044 -:101B4000000400020004000000000000000000008B -:101B500000A000000000000000A0000000A00000A5 -:101B600000000000000000008200000000000000F3 -:101B7000000000000000004000000000000088009D -:101B800000000000000810400000000000000041BC -:101B900000000000000008400000000000000000FD -:101BA000000000000008200200000000000000000B -:101BB0000000820000000000001000000000000093 -:101BC00000000000000000081000000000000000FD -:101BD00000002000000000000010000000000000D5 -:101BE00000000000000000081004408800084000C9 -:101BF00040040440008810880000090000880000AC -:101C000000084100000000018008000800080000F2 -:101C1000008800000000000800080000000000002C -:101C20000088118800000009800900002088000851 -:101C300000000000000000C0090800400000000093 -:101C4000000000000000000020098008000000885B -:101C50000000200000000000050800000000000057 -:101C600000000000000000000409800900030000DB -:101C70000000000800000003000000000000001049 -:101C80000000000000030000000820000000000029 -:101C9000001100000000000000000000A000C002D1 -:101CA0000000000000000000001000000000000024 -:101CB0000000000000000000000000000000000024 -:101CC00000000000000000000000000000210441AE -:101CD00000030005000000000005040000410000B2 -:101CE000880000000000000000000000000000006C -:101CF00000A00084050000000000000011000000AA -:101D00000300040004201100000000000000000097 -:101D100020A0200000100500000805A041000000E0 -:101D20000000050000000000000000C000000000EE -:101D30000000000000000000000000100000000093 -:101D4000210041000000000009000900000000001F -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000809A0000809A0000000402000219000F0 -:101D8000840088004020900000008200A00088822B -:101D90000800820008008400C00008000000000065 -:101DA0000000A00008000400C0000000C000000007 -:101DB000000000000000820008008200C00008004F -:101DC0000000880008000800C000820082000000B7 -:101DD00000848200C00000008200000000000000BB -:101DE0009000820082000000820084000000000059 -:101DF000828041900000000040004100110020005E -:101E000000000000112041200020000421004000BB -:101E10000405402000040400200000000000000031 -:101E20000000002000200020000000000000000052 -:101E3000000000000000080000000000000000009A -:101E40000000000000000000000000000000000092 -:101E50000000000300000800000021000000000056 -:101E60000900000000000000000000000000000069 -:101E7000000000020008900000001000A000000018 -:101E8000C000A0200005004100000000000000008C -:101E9000080084008800C000C00000419000C0001D -:101EA0000800820000000800900008110000C00037 -:101EB0000000080000000000A000C0000000C000FA -:101EC000081082000000002100108221A0000005FF -:101ED000C021C0000000000000000000000000055C -:101EE0000800100000009000000000000000000545 -:101EF0001021000000001000000021000000080078 -:101F0000000000A0000040000400000000001104D8 -:101F100000040420092021C0001000040004040073 -:101F2000000010000000110010001000419000900F -:101F300000001000108400000000000000000000FD -:101F40000000000000000000000000000000000091 -:101F5000050000000000000010000000000000006C -:101F60000000000000000000000000000000000071 -:101F70000000000000000000A000004088000800F1 -:101F80000400900000080000000004000800C008E1 -:101F900004080000000082000000080082008200A7 -:101FA000C000A000820000000000000000008200CD -:101FB0000000080000000080000000000000900009 -:101FC00000028200C00000000800000000000000C5 -:101FD00082000000000000009000004000000000AF -:101FE00000008200820000090000000400110000CF -:101FF0000009000000000400902100100000000013 -:10200000000041000400040404040004000400046F -:1020100020C040000000000000040000100000008C -:1020200004000482040000200000200000000000E2 -:102030001100000000000000000800000000000087 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000100000000000000880001C10005 -:1020900000A0C0820000C00000010000000000009D -:1020A000000000000000C000000101040001C000A9 -:1020B00000A0C0820000C00000010000000000007D -:1020C00000000000000000000000000000100001FF -:1020D00000000020101000000000000100000000BF -:1020E0000000000000000000C00000010008010026 -:1020F000000000821010000000000001000000003D -:102100000000000000080000000000111100002085 -:1021100090000000808000008000000300000000AC -:102120000000000000050000000000030280001015 -:10213000C10000008080000080000003000000005B -:1021400000000000000000110000000000110280EB -:1021500000400200000080800000000000410000FC -:1021600000000000000000050000000000030480E3 -:102170000440210000008000000000000041000039 -:1021800000004000000000000000410000040400C6 -:10219000A000830000000300000000000080800217 -:1021A00000002000000000000000200000000400EB -:1021B00083000200000503008000000000A08008EA -:1021C00000000000200000000000000004000000EB -:1021D0001000830005800000118000000000000056 -:1021E00080200000400000000000000040000000CF -:1021F000040083000500000009000000000000004A -:10220000800300000000000000000000000000004B -:102210000000040005A0000001202000000000C014 -:10222000820100000000000000000000000000002B -:10223000000004008540000001004000000000C0D4 -:10224000820100000000000000000000000000000B -:1022500000000000040084820000000490000000E0 -:102260000000C000000000000000000000000100AD -:102270000000010004008440000000009000000005 -:102280000000C0000000000000000000000000008E -:1022900000001000004000000300000000000000EB -:1022A000000000000000000000000000000000002E -:1022B000000120000040000041000000000000007C -:1022C000000000000000000000000000000000000E -:1022D0000000840010010002000000000000000067 -:1022E00000000001000000000000000000000000ED -:1022F00000008401C1010002000001000000000094 -:1023000000000001000000000000000000000000CC -:102310000000004100090000000041000000000032 -:10232000000000410000000000000000000000006C -:1023300000000020000400800000410000000000B8 -:10234000000000410000000000000000000000004C -:102350000000000000058004008000001100000063 -:10236000000000000041000000000000000000002C -:10237000000000000005C0200080000003000000F5 -:1023800000000000004100000040800000C100008B -:10239000000200009000000000C18000004000002A -:1023A00000410010000005030020800000C1000073 -:1023B000002080000500000000C180000002000035 -:1023C000004100400000058300000020800000C1A3 -:1023D00000000000800004000000004180000003B5 -:1023E000000000000000000005030040800000C164 -:1023F00000000020800041000000004180400040BB -:102400000000000000000000031000002000004059 -:10241000000000008800040000000003020000002B -:102420000000000100010000000900002000004041 -:10243000000000012000C0000000000304000001B3 -:102440000000000100010000000300000000200067 -:102450000040000000004000C0000000009110009B -:1024600000000000000000000000008800002000C4 -:102470000040000000014000C00000000091100179 -:1024800000000000000000000000008900000000C3 -:10249000000000000000000000000000811200E0C9 -:1024A00022004842000000000000484200000000F6 -:1024B000000000000000000000000000811200E0A9 -:1024C00040004842000000000000484200000000B8 -:1024D0000000000000000000000000000000811269 -:1024E00000E00700480000000000000000000000BD -:1024F000000000000000000000000000000A81123F -:1025000000E007004800000000000000000000009C -:1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000000003B -:1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA -:102610000000757B000000000000000000000000CA -:1026200000000000000000000000000000000000AA -:10263000DEAE757B0000000000000000000000001E -:10264000000000000000000000000000000000008A -:10265000DEAE0000757B00000000000000000000FE -:10266000000000000000000000000000000000006A -:102670000000DEAE757B00000000000000000000DE -:10268000000000000000000000000000000000004A -:102690000000DEAE612603400000000000000230B2 -:1026A000A0000000000000000C400000000000003E -:1026B00002C0648661260340000000000000023072 -:1026C000A0000000000000000C400000000000001E -:1026D00002C0648600006126034000000000000084 -:1026E0000230A0000000000000000C4000000000CC -:1026F000000002C064866126034000000000000064 -:102700000230A0000000000000000C4000000000AB -:10271000000002C064868800200004112000200010 -:1027200020002002200221000500218001800400F9 -:102730000000848020002000000020000400200011 -:1027400021002000210000002000000004004000C3 -:1027500000002000200000012000000020000400F4 -:102760000400840020000200000000008800201007 -:1027700020008800200088002000000020002000A9 -:102780002000840020002000000088000400880051 -:102790002000880020002000050000004000040008 -:1027A0000000400000014001909020002008200817 -:1027B0000000400000400400410000000000200034 -:1027C0000000100040002000200000000000000079 -:1027D0000000400000000000000000000020000099 -:1027E0000000410000000200040009000000000099 -:1027F0000000000000020000000040000000000097 -:1028000000000000000000000500000000000500BE -:1028100000000000000000020000000000000000B6 -:1028200002000085000000004000000000000000E1 -:1028300000090080000000400000000000000000CF -:10284000000800000000000000000105000000007A -:10285000000800000000000000000000021002104C -:10286000020002000200020002000200000000005C -:10287000000000091000000000000000000000003F -:102880000000020000400040004000400000000046 -:102890000000000000000000000000000400000034 -:1028A000000040040008000000008008000005004F -:1028B000000000820010050005000000001020004C -:1028C00000000082001000000084000808000000E2 -:1028D0000810081000840000000000100000000133 -:1028E000000100840408000000000000000800004F -:1028F000000000000084008200000000008400004E -:1029000000000000000800000000000000040000BB -:102910000000000000880008000000000000A00087 -:102920008400000084088403000000050000000902 -:10293000000000000010000884400008900090058E -:10294000C0000083002120C000C100414021C00020 -:102950008400A00000118400A0098205000400008A -:102960000003000000000021000300000000000040 -:10297000000000000004004000080000000000000B -:102980001000000000000021000000000000000511 -:102990000000000000000021000000000000000016 -:1029A00000000000000000004100000000002100C5 -:1029B000080000000908080800004101080105009E -:1029C000400021004040210080082104090000004F -:1029D0000000000008002100000003820000000148 -:1029E00000000000000000000000000000004100A6 -:1029F0000000210000000010410000000000000065 -:102A000000000000000000000000000000000000C6 -:102A10000000090000000000000000000000008429 -:102A20000300A00010000800C00082004000904099 -:102A30004000100000004021A0008800A040A0003D -:102A4000900000000000000311004000A0002000E2 -:102A5000100084001000000982000800000000003F -:102A600001000000040000000200820000000800D5 -:102A700000000800000008000000820000000000C4 -:102A8000000008000400820000008200000008002E -:102A90000000820082000000080008000000000022 -:102AA0000000000002000000000000A021009100D2 -:102AB00020010000000000000000000000900083E2 -:102AC0000084000800000000000820000000000052 -:102AD00080008300008210000000110000900000C0 -:102AE0000000202000000084000000000000000022 -:102AF00000000000000000000000000000000000D6 -:102B000000001000000000000000000000000000B5 -:102B100000000000000000000000000000000000B5 -:102B200008000000000010008280820082088800F7 -:102B30008411840384000000100882008210820245 -:102B40000021082182080203000090000000840494 -:102B5000900390048221002100110080C000000831 -:102B60000000000000080000000300000000080052 -:102B70000800000000000040000000000004000801 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA00000000000000000000008004000000000DD -:102BB0000008000000080004218800010000000057 -:102BC0000001080040000000000400000800400070 -:102BD0000091000000000000000000000040210003 -:102BE0000400000000000388000000000000000056 -:102BF00000000000000000000000090000000000CC -:102C0000000005900000000003000000000000002C -:102C1000000000900000000000000900000000001B -:102C200000000090000000000800020008000400FE -:102C3000080410008200100020800002880888210B -:102C40000000000004008208020000000400901050 -:102C5000200000410004100804000000C003000030 -:102C60000021000000000000018000000000008042 -:102C7000004000008221000000000003000000006E -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000800000000000004008004A000F4 -:102CB000800440000000000000000002208221018A -:102CC0000000000000000000000100000000000003 -:102CD00000008000000000018001000000A0000052 -:102CE0000000100000000000000004040000038247 -:102CF00000100000000000000000000000000000C4 -:102D000000000000000000080000000000000000BB -:102D100000000000000000000000000000000000B3 -:102D2000000000000000000000000000000002A001 -:102D3000008200900140408500908804400490216A -:102D4000004000C00289000100000000000008905F -:102D500000200182020888410088004110C0000064 -:102D600000000000000000009000000000000000D3 -:102D70000108002000100008000000000000000012 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000080008020001100209040058902002042 -:102DC000404100C00208001008410010004100020C -:102DD000000000000800800020410082110800056A -:102DE00000000000000000000000000000000000E3 -:102DF0000000218000800000008000000000000032 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E300000000000001000008080888021A0400079 -:102E400041C0800008858503C19000000004800017 -:102E500080008000808880090080080000C1201167 -:102E60004189000000100080000000000000000305 -:102E700000800000000000000000000000000000D2 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB00000000000000002010020C0908308C0C193 -:102EC00084A085C0020003C008A011C00200400019 -:102ED0004004C000400008C1109082C0900804C0A7 -:102EE000908383C000000001000200000000000089 -:102EF00000000082000000000000009000000000C0 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F300000000000000040080000908808C0A102C6 -:102F40000104C190A0C1C1050084C002821100002B -:102F500000000000000009A00082C040908809A085 -:102F60000188C00590A100000000000000000000E2 -:102F70000000000000000000080000000000100039 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000800000008000008091 -:102FC000419010028510030841080020808880C1CC -:102FD00000000300410000004100000080001100DB -:102FE0004103030883088241000000000000000044 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:1030300000000000000000000000000500408000CB -:103040008000A102A08090801000410300A09000A9 -:1030500020038002008000800000001080088000B3 -:1030600080004109092191008210800000000000C9 -:10307000000000000011000000000000000000003F -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B00000000000000000000000000010004009B7 -:1030C0001008100005890802050283009100C01055 -:1030D0004188C000C0002010A0C0400010010220A4 -:1030E000044082004101C00404908201C000A0009D -:1030F000A0004000000000000000000000004000B0 -:1031000088000000880000000000000000000000AF -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000810E -:10314000000007000000810000E000004842880005 -:1031500000E000004842000000000000000681007E -:1031600000E000004842880042E0000048420000C1 -:10317000000000000000001100080704000000002B -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C000000000009900181828004100A005000028 -:1031D0002004100820401080F424FF240000000088 -:1031E000A00005002800002820104080A000050055 -:1031F000FF24FF300000000000000000000000007D -:1032000000001818BD990000000000000000000038 -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000001990018180028004100004B -:10325000A0054002800104020801F4242424000097 -:10326000000000A00005410000410408020100A088 -:1032700000052424303000000000000000000000A1 -:10328000000000001818BD990000000000000000B8 -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:1033400000000000000000000000F0F060600000DD -:1033500082140000884400A000051008200400002A -:103360000000000002000088004414000014000067 -:1033700082140000A0050000000000000000000012 -:103380000000000000000000006600660000000071 -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000800000006060BD -:1033D0008214000088440000A00005008001400223 -:1033E0000000000000000301880044008200008209 -:1033F00082140000A0050000000000000000000092 -:1034000000000000000000000000006003630000F6 -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C -:103440000000000000000000000000000028004014 -:10345000000860600007800D10000000000180007F -:103460000800A0610006000D120660610007800DD3 -:1034700030000000000180000800A00000000000F3 -:103480000000006100AE200D00A000000000000060 -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000007D000000F0F030302F -:1034E00000C3C0C000000000000000000000000099 -:1034F00000000000FFD70A0AF0003C0000000000B6 -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:10355000000000000000008000003D0000000000AE -:10356000303000C3C0C000000000000000000000B8 -:103570000000000000007D550A0AF0003C00000039 -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000003C3C73 -:1035E000C3000303000F0A0A4D4DFF3C000000001A -:1035F0000000000000000000F000BFBF828200C396 -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A -:10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A -:103650000000000000000000000000008000000FDB -:103660003C00C3000303000F0A0A4D4DC3000000D5 -:1036700000000000000000000000F0001F1F828218 -:1036800000C3000000000000000000000000000077 -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D0000000000004000400880005002000042110 -:1036E0000000200004020280040005889000000011 -:1036F00000002000040020000000200088002000BE -:103700000000200020002000200020008800000091 -:103710000000000000031010000202002000200042 -:10372000200000002000040020002000880000008D -:103730000000000000000000000000002000000267 -:10374000000004022000200000002000040000000F -:103750000000040000000000400000000200000023 -:10376000000000000000000108020000100200003C -:103770000000410000000000210021900000000036 -:1037800000402100210000000000000000000000B7 -:103790000000000000000000800120018000000007 -:1037A00000000000000000004000000000002000B9 -:1037B0000000000004000000000000000000000005 -:1037C00000002002000000000000000000000000D7 -:1037D000000000000000000000050800002000209C -:1037E0008400020000100000000000004000009073 -:1037F000200000040040884100000200000000009A -:10380000000000000010001002000000000000098D -:103810000000000000000020000000040110010072 -:10382000000005401000001001050000000000002D -:1038300000040080000000C08240208000400000A2 -:103840000080004000400040004000400000004078 -:10385000004000000000004000000004808200C121 -:1038600000850008000000080008000800888000AB -:10387000002184000001000800080484000000000A -:1038800000000488000000080940008800000900CA -:1038900000080088000000400009000000820801C4 -:1038A00020000000020180900008020800000000D3 -:1038B000000000080040000000400008A040000197 -:1038C0000000004000010001000900840001000028 -:1038D0000001000900000000000000840008000052 -:1038E000000000000000000000210009400300006B -:1038F0000080000500002000200400208208000055 -:10390000002110001100000800000000000300006A -:103910000021000000000000000000040000000082 -:103920000003002100000000000000000040000033 -:1039300000000009000000000000000000100080EE -:103940000021000000000000000000000000000056 -:10395000004000000000000000000000000802001D -:10396000080008000300418441000800000010A086 -:1039700040000802080021008300A1050011058213 -:103980000000050000002090090000000008100061 -:10399000000000880000000000000000000100009E -:1039A000080000000000000000000004000000917A -:1039B00008000000000000000000000000000000FF -:1039C00000040000000000000000000000000000F3 -:1039D00000000001000000000000000000000900DD -:1039E00082000000040008000000200000008200A7 -:1039F000C0004000202100000800000000418200BB -:103A0000208000000820A005080000000000000041 -:103A10000400001100002000000000000000000071 -:103A20000000000000000000A002020000C000C072 -:103A30000002004000401040004010800040004064 -:103A40000080004000A182800040000000000000D3 -:103A500000000080000000000000000000000000E6 -:103A6000000000040090800041844000100000002D -:103A70000010008400840000050000080800100009 -:103A80000500880400000001000000000000410063 -:103A90000000808400A00500C000000800000008AD -:103AA00000A000000008000000A0000980000541FF -:103AB00000410001000100018001000180400091EF -:103AC000000100400083004000400085000000002D -:103AD0000010000000400000000000000000000096 -:103AE0000000001008008200C00000204000080014 -:103AF0008200A000840000000041C000008000009F -:103B00000041C084002000000000900000008400FC -:103B1000000004218800000090000400010008005B -:103B200008000110000082800000848482000020D0 -:103B300002000000020000000000840000000000FD -:103B40001000000020000000000000000040000005 -:103B5000000000000010000008000000000000004D -:103B6000000000000000038403000000008803043C -:103B700003840800410003C00890090003100004FA -:103B800000000000000505040304032040884000F5 -:103B900004204020C004210010000000900040904C -:103BA00080008020020000000008090000050000DD -:103BB0000001800000008000000000000000030001 -:103BC00008008000000080000000000000000001EC -:103BD00008000000000000000000000000000800D5 -:103BE0004100000000000000000200000009040085 -:103BF000001100002000002108020002408004089B -:103C0000000808210020A1400000A00000000000E2 -:103C100010800000000000200800200000000000CC -:103C20000011410000000800000000000000002119 -:103C30000000000000000200000000040204000474 -:103C400000080004000000000000004000000040E8 -:103C50000000000000000000004000000000000024 -:103C60000000000000000000000000000000000054 -:103C700089400000000000000000110000850002E3 -:103C8000800100000000000004001000000041005E -:103C900000000004000000000303C10080001100C8 -:103CA0000000089008000000000200000000000072 -:103CB0000000000000000000800000000001800102 -:103CC00000010001000100000000000000010000F0 -:103CD00008010000000000000000000100000000DA -:103CE00000000000000000000000000000C0208272 -:103CF0000040008200000000000000000001A00160 -:103D0000900000010000000001000000000004001D -:103D10000100000000000000010000000000A00001 -:103D20000000000089C02004000200830000008819 -:103D3000000288C0009000C000088800080001C18F -:103D400088000100820100C100000101880002C05A -:103D500000000102000000C000000000000000C0E0 -:103D600000000000002000000000000000000080B3 -:103D70000000000000800000000000000900200595 -:103D80008940020200210000000010000000200015 -:103D90008000030000000000000010000000080088 -:103DA00080000200000011888080098000910000DE -:103DB00000001080020000000080208000008000D1 -:103DC00009C1A1200805801000C111050809800063 -:103DD00088800000028000000080000000000000D9 -:103DE0000080000000000000000000000000000053 -:103DF00000000000000000000000000000000000C3 -:103E000091808900A0090321000500000020000026 -:103E10000010000000000000001000000000000082 -:103E200000000021000000800000000000000000F1 -:103E3000000000800320118041A10000000000006C -:103E40008000830008000900C10000801000A0006D -:103E5000C1000010000000008000000000200000F1 -:103E60008000000000100000800000000000000042 -:103E70000000000000000000002000000000000022 -:103E80000000408402000400A19100000000000036 -:103E90000090000100000000000000010000000090 -:103EA0000020004000000000008200000000000030 -:103EB0000020000000100100011001A1000000001E -:103EC0000000C000088801000100C1000088010056 -:103ED0009000C100200100000000C00000000000B0 -:103EE0000000C000000000010000C0000000000051 -:103EF00000000000A00000000800400000002000BA -:103F0000000000000000000102000001000010009D -:103F10000000000000000000900001000000000010 -:103F2000000000000000000000000000C090001031 -:103F30000090C102000010000001000020010100FB -:103F40000000000000C100010000200191C120001C -:103F50009101000000C100000000000000C020002E -:103F60000000002000C000000020000000C0000091 -:103F700000000000000000000000000080000000C1 -:103F800000000000000000090303C0201108000029 -:103F90008000000040000000000000000800000059 -:103FA00000000000000000000000000021000500EB -:103FB000210003008880000000030003001020108F -:103FC00010100003000300C100080220000589C191 -:103FD00080099010202000C1000000000000008037 -:103FE00000000000000000800000000000000080D1 -:103FF00000000000000000000002001000000000AF -:10400000000000000000000041C1404141000411D7 -:10401000001000030000000000000003000000008A -:1040200000000005000000008900034000000800B7 -:10403000004000080000000000008988854003005F -:1040400020008000001000800000C10983001000E3 -:104050004000C1902009C100090380000000000059 -:104060000000800000000000000080000000000050 -:10407000000000000000000000000001000000003F -:104080000000000000000000000001090008000816 -:10409000000000010000000000000000000100001E -:1040A00000000000000000000000080000014000C7 -:1040B000040000010000000000000000C188A00111 -:1040C000A10082000800000100080000C1212000BA -:1040D00001000000C1C1000188000101C000000012 -:1040E00000004000C000000000900000C000004040 -:1040F000000000000000000000000000008100003F -:10410000070000000000000000000000880000E040 -:1041100007006000818100E007000000884100E0A6 -:1041200007000000000000E007000000410002E07E -:1041300007000000000600E00700000A000081817F -:1041400080E0070000000006000007000000840077 -:1041500000E000000000600000E000004200880075 -:1041600000E000000000000000000000000000006F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A0000000000000000000000000000000FFFF11 -:1041B000FFFF0000000000000000400000000000C1 -:1041C000FFFF0000000000000000FFFF0000FFFFF5 -:1041D000000000FF0000FFFF0000F0F00000FFFF04 -:1041E00000003C3C0000AAAA0000FFFF000000FF06 -:1041F0000000FFFF0000F0F00000000000000000E1 -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000F0F03C3C000000000000000040000000E6 -:104240000000E8E800FF000000000000FFFF0000A1 -:104250000000000000FF000000000000F0F000007F -:10426000000000003C3C0000AAAA00000000000082 -:1042700000FF000000000000F0F00000000000005F -:1042800000002F281F1400000000000000000000A4 -:10429000000000000000BE14BE140000000000007A -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000FF005555000055 -:1042C00000000000F0F0F0F000000000FF0000002F -:1042D000FFFF0000555500003C3C0000FFFF0000C0 -:1042E000FF0000000F0F00003C3C0000FFFF00003B -:1042F000FFFF00003C3C0000AAAAFFFF00000000F6 -:10430000000000000F000F0000000000000000008F -:104310000000000000000000AFAF05050000000035 -:10432000000000000000000000000000000000008D -:104330000000000000000000000000000F0F3C3CE7 -:1043400000000000000080C0C0C000000000FF00AE -:10435000000000000000555500003C3C000000003B -:104360000000FF0000000F0F00003C3C00000000B8 -:104370000000000000003C3C0000AAAAFFFF000073 -:1043800000000000000000005028050000A0000010 -:104390000000000000000041000F800D00A000613F -:1043A000002F800D00A00065002F850D0400006126 -:1043B000000F000D00A00061000D800D20A0006125 -:1043C000502B000D01A000001060002F80050000A0 -:1043D0004573802E002D920240828001802092023F -:1043E000408280018020920240E78007802D920267 -:1043F00040828000002092024082800000208202E1 -:1044000000000000000000000000000000000000AC -:104410000000000000000000EF0369695155000032 -:10442000000000000000000000000000000000008C -:1044300000000000000000007D7DFF3C0000000047 -:104440000000000000000000000003070003FF0060 -:10445000FF00000000003C3CF0F0A000202003031F -:104460000003003000500C000F00000000000000AE -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:1044900000000000000000000000EF030000555580 -:1044A000000000000000000000000000000000000C -:1044B000000000000000000000007D7DFF3C0000C7 -:1044C0000000000000000000000000000F0F0F0FB0 -:1044D000DF00000000000000AAAA00FFA0002020CA -:1044E00000000003003000500C000000000000003D -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:104510000000000000000000000000000B03030387 -:104520005C3C5000000000000000000000000000A3 -:10453000000000000000000000000000000000007B -:1045400000000000FFFFBEBE0000000000000000F1 -:1045500000000000F0000000000000000000000368 -:10456000004100000000000000000F000A000000F1 -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:1045900000000000000000000000000000000F0B01 -:1045A0000F0B0C3C000000000000000000000000A9 -:1045B00000000000000000000000000000000000FB -:1045C000000000000000FFFF1414000000000000C5 -:1045D00000000000F0F000F000000000000000000B -:1045E00000030041000F0C0CAA000A0A00000A0098 -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000400000004000880400000100200020004D -:10462000C000C00000002010000004002100008035 -:10463000040001002000200000000000C0008804E9 -:104640002000040000000000000400002000000022 -:104650000003000000000000000040000000000017 -:1046600000002100200000800080000000002000E9 -:1046700000050000000000000020200000000000F5 -:1046800000002000200000000000000000000000EA -:104690000004052040C0000000010000400000C0F0 -:1046A000000000080000000004000000800020C09E -:1046B0000004800004000000090005004000000024 -:1046C00000010000000000000000000100000000E8 -:1046D00000000000000000000000000000000000DA -:1046E0002000000008000000001000100000000082 -:1046F000000000C0000000000000000100000000F9 -:1047000000000000000000000000000000000000A9 -:104710000000000020000000201009100080A08090 -:10472000020404040500A040000002000000010093 -:104730000104010404000220000000054000000004 -:104740000400000500000800000000050000000053 -:10475000400000000000000002000400040000000F -:10476000000000000008000088800000040002092A -:1047700000000000000000000000000004400000F5 -:104780000000000000000000000000000009000020 -:1047900000000000000880840000800920890404D3 -:1047A0000004001100091008000141C04108000880 -:1047B00002000401028580840401000800008008D2 -:1047C0000400200000080010000000080008000895 -:1047D000000882000008000004000000000800003B -:1047E00000840000000000040000004000828008F7 -:1047F0000008000800000008000000000088800099 -:10480000000800000000008400000000000000829A -:10481000008400080000008800080403040004006D -:10482000A040000000000021840390044000A00488 -:10483000080000088400008888009121400088005A -:1048400084008800880082400005000800000011F4 -:104850000003000000000040000000008241004111 -:104860000010000800210021002100800004000940 -:104870000441010300090041004100030000002041 -:1048800000000041000000000005000000000000E2 -:10489000000000000000000000050000880080000B -:1048A00080000300008409004100000000010800AE -:1048B000080103000000200000200000100000009C -:1048C00005000000000003000000000000000000E0 -:1048D000030000000900050003000000080021A0FB -:1048E0000000000000200900032000000004000078 -:1048F0004000800004000000000000004100410072 -:104900004100000000000300000003000000000060 -:104910000000000000000000000000000000014056 -:1049200009000800820008008200A00000000000CA -:10493000820082100200080002000800000000044B -:104940008200850082008200C000A100840008006F -:1049500002000000000010118400A0000000000010 -:10496000820000000800000000000000010000417B -:104970000002A08000410021024104410441A00046 -:10498000000900000000000000000000000000001E -:104990000000000000000000000000000000009087 -:1049A00020A02000004003000500000000000800D7 -:1049B00000000000000183000000900000000800DB -:1049C00000830000200003C0000000002000000061 -:1049D00000008000030000000090000000000000C4 -:1049E00000000000000000000000000000000400C3 -:1049F000000000000010000000008000800080A087 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A200020800000002000008203000000008200BF -:104A300090800000C0020808040082000000A00569 -:104A4000101000002000C0800021000000000804B9 -:104A500000000000C000090001800800840400007C -:104A60000000000000800800009100008200820029 -:104A7000408000210000400000000000040002000F -:104A8000021000000000000000080000000000000C -:104A90000005000000000000000000000000000011 -:104AA000000080200000000000000008000000005E -:104AB00000000002090008008001830005000900D1 -:104AC00000008004090080000508110002000000B9 -:104AD0000300000000000090200410020804000001 -:104AE000400000000800001003000040009010008B -:104AF00000008804000000044000028405008000DB -:104B0000800080A0000000000000090000000000FC -:104B1000030000000300000000000000000000008F -:104B200008000000820000000020102100000000AA -:104B300020004000004100400088080000000804F8 -:104B40000240400000000000000002100000C00011 -:104B50000000C00000000000200083000021880049 -:104B60000000900500000010A0000040002100009F -:104B7000C00008000000000000000000000002105B -:104B800000100010002100000000000000000000E4 -:104B900000000000000000000000000000400000D5 -:104BA0000000000000000000000000010000000004 -:104BB000000000000000000000010004800000C0B0 -:104BC00000008000000000100002000080000000D3 -:104BD000000000880000000000000000200000002D -:104BE00000000000000000000001000000010000C3 -:104BF00000000000000000000000000000000400B1 -:104C00008000000000000000000000000000020022 -:104C10000000000000000000000000000000020092 -:104C20000000000000000000020082000100C0003F -:104C30000000000000000000000001001101000160 -:104C400000C090020000004000A08805018200889A -:104C5000000100000001000008400088008820A03A -:104C6000A011000300839002000000A00000008853 -:104C70000004000000000000000002080408010019 -:104C8000004088C090020000000400000000000006 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000080000000030081 -:104CB0008000000000000000000000001009044017 -:104CC0000020408000800300000008C1A18804C0CB -:104CD00000C0004000042008000800800000200000 -:104CE0000000009000100410000000000080000090 -:104CF000028000800000050011000000808000801C -:104D0000080000000080008000000000000000009B -:104D10000000000000000000000000000000000093 -:104D200000000000000000000000000000058000FE -:104D300000200000008900000002001000000800B0 -:104D40000800414100000000000380000000201026 -:104D500002854105000000000000000000000088FE -:104D600000028080A00003C085A0418000000000F8 -:104D700000100080000000000000000000008041E2 -:104D8000000500800080000080038000800000009B -:104D90000000000000000000000000000000000013 -:104DA00000000000000000000000000000002000E3 -:104DB00090901000880800C0000000000000828869 -:104DC000110021002101200000000001C0000000AE -:104DD0000090019001000000000000000000200091 -:104DE000A0C0408208C0080010C00802A1C0000096 -:104DF0000000000100C000000000000000000040B2 -:104E00008801400004A01082880002008204C000D3 -:104E10000000000000000090000000000000000002 -:104E20000000000000000000000000000000000082 -:104E300000909008204001200000000000000000C9 -:104E4000000000000200000020200008004000C018 -:104E500010000001000090010000010000000000AF -:104E600091880008C004048889400108C0100288A5 -:104E700000004000000000000000000100010001EF -:104E80000000201000900008000020020090001098 -:104E900088C00000000000000000000000000000CA -:104EA0000000000000000000000000000000000002 -:104EB0000000058000000000080000000000000065 -:104EC000200000002002850000000000000000809B -:104ED0002080A00021030308884100004000410019 -:104EE0004000410000008000C00041004000800000 -:104EF00080000000000000000000200000100010F2 -:104F00000008000000000000000000000080000019 -:104F1000000002800000000000000000000000000F -:104F20000000000000000000000000000000000081 -:104F300000000000000000900000000004000410C9 -:104F400003001100412121001000400080080011E1 -:104F500080008000C10983030000100800040000E5 -:104F6000000000000004800000800000000000003D -:104F700000000002000080008000000080000008A7 -:104F800000200000000080008010800000008020D1 -:104F900000030000000000000040000000000000CE -:104FA0000000000000000000000000000000000001 -:104FB0000000000000000000009100200000000040 -:104FC0000001010000000191008200080100C00002 -:104FD00040A002080200A1019100A000830000008F -:104FE000000000000000100004100240040004C093 -:104FF0004010028804010000C00004000800900076 -:1050000000000000000000001000A0210802900035 -:10501000C00088010088200000000000000000009F -:105020000000000000000000000000000000000080 -:105030000000000000000000600600E00700000A19 -:10504000000002E000004200840000E000000012C6 -:10505000884100E007000000500A00E0070000005F -:10506000000000E000000000000000E000004842F6 -:10507000820000E0000048420000600000E0000004 -:105080000082008100E007040000600000E00700EB -:105090006000008100000700000000000000070021 -:1050A0000000000000000000000000000000000000 -:1050B0000000000000000000000000000000BD240F -:1050C000F9F90000000000000000000000000000EE -:1050D00000000C0C0F00C300C0C000000000000066 -:1050E00000000000000000000000A00000A022005E -:1050F0001100280000282040040200003CFF66F058 -:10510000000000000000000000000000110000008E -:10511000E2F2E2F2000000000202030000000000E0 -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000BD246060000000000000000000000000BE -:10515000000000000C0C0F00C300C0C000010000E4 -:105160000000000000000000000000000500000535 -:1051700000220011410000411080080100003C00A5 -:1051800066F00000000000000000000000000000C9 -:105190001100E2F2E2F24242C30002020300000008 -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000004E4E4E4E000000000000000026 -:105250000000000000000000000000004242C3C344 -:10526000000000000000000000000000000000003E -:105270000088004400A00005010208040000A00509 -:10528000000000000000000000000000000000001E -:1052900000000000C33C00008383000000003000D9 -:1052A000F00000000000000000000000000000000E -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000C33CFF000000000000E0 -:1052D000000000000000001000003C3C00FF4242C3 -:1052E000000000008000000000000000000000003E -:1052F000000088004400A000050080401020A005A8 -:1053000000000000C0C0000000000000000000001D -:1053100000000000C33C0000006083E366003C0026 -:10532000300000000000000000000000000000004D -:10533000000000000000000000000000000000006D -:105340000000000005610A2F850D00A00065000423 -:10535000000F200000400005800100011061202F97 -:10536000804D000805404A2D8000000000610007C4 -:10537000000D000060610007000D100000650003D3 -:10538000800D08000000A0614007800D2000006132 -:10539000002F000900A00065000F801D00A1100073 -:1053A00020280040000800000008000000A00000C5 -:1053B00000000000000000000000000000000000ED -:1053C000000000000000000000000000000001419B -:1053D000014100000000AA28A0A000000000000079 -:1053E000000000000000003C00FF0F0F000F000055 -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C -:1054100000000000F0FFF0FF0000000000000000AE -:10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000006C -:10544000000000000000000000000000000000005C -:10545000F141014100000000AA280000FAFAFAFA1E -:105460000000000000000000003C00000000000FF1 -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000000000000000FCFCFCFC0000000000001C -:1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC -:1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000F5F5F5F50000F8 -:1054E0000000000000000000000000000000005567 -:1054F0005050FF3CC300000000000000000000000E -:105500000000FFAFFF05F0FCA0BC000000000000A1 -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000C100C100C9 -:1055600000F00F0F000000000000000000000080AD -:10557000005550504D4D4D4D000000000000000002 -:1055800000000000FFAFFF05003CA0BC00000000D1 -:10559000000000000000000000000000000000000B -:1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C000000000000000000000000000000040009B -:1055D00000000000002020000000880000C1888832 -:1055E0000080208021800000008000800080014039 -:1055F0000000000040008400000000000000A00047 -:10560000000000000000880000000000000000030F -:105610000000000004000000000000000000000086 -:10562000000800000400000000000000000000006E -:10563000000000000000001000000000000000005A -:10564000000000000000000000000000000000005A -:1056500009000000000000A1004000200500000239 -:1056600020080008000820080900000411040004B4 -:1056700002011000000010200000000000000000E7 -:105680000000000200000000000000000000000018 -:1056900000004000000000000000000000000000CA -:1056A00000000000000000000000000000020000F8 -:1056B0000004000000000000000000000090000056 -:1056C00000000000000000000000000000000000DA -:1056D000000000000000000000100000000020108A -:1056E000200000000000000002008580000400107F -:1056F0004010200000000000000500000000000035 -:105700000004000000000000000000000000000095 -:105710000040000000000000040500100000000030 -:105720000010001000000000000000080000001041 -:105730000000004000000000000000000200000027 -:105740000010000000000000000000000000000049 -:10575000001000000008000000000008008400089D -:10576000410800100084000000000008040400014B -:105770000008800080080000000000080408008481 -:105780000084000104100010008400840400000064 -:1057900000080000000000080000000000090008E8 -:1057A00000080088000000C004C000C000C0001055 -:1057B00000C000080000000800C0001000080084BD -:1057C0000090000000000008000000000008000039 -:1057D00000000008000090000100002008400800C0 -:1057E00088100000000020002000090008050003C8 -:1057F0000000000040000021020002000205042019 -:105800000008040804218203004100000004820013 -:105810000004821000210000000040000009000583 -:105820000000000004000005002100100009000035 -:1058300000000000000000108210000000000021A5 -:10584000000000000008000000000000000000054B -:105850000005000000000000008204820001030037 -:105860001000084008000800850083002084030021 -:10587000210403A000A0050003008020890080000F -:105880000385000008000300080000000900000173 -:105890000010000900004100000000A000082108DD -:1058A000000008000000040000002100410000008A -:1058B00000000840000000A00000000000000010F0 -:1058C00000000000000000000000000000000000D8 -:1058D0000000000000000000000808008200040032 -:1058E00084008200400084008200840000000000E8 -:1058F0000000080000000080C00082000000881145 -:105900000000A100000008000000040000000800E2 -:10591000080082000000C0004000000000000000FD -:105920000000200000000000000000040900010049 -:105930000109020001000100010001008200C00015 -:105940000000000000000000000000000080008057 -:10595000000900800080008000000080000000003E -:10596000800000A000820000000000000000000095 -:10597000000000000000000000040000080000001B -:10598000200000000400000000000010800000C0A3 -:10599000008800000300000000000000000000007C -:1059A00000000000080003002000200000000200AA -:1059B0000200020080A0022002040204022000046F -:1059C000000400100004000000000000000000407F -:1059D00000401184004000400040000000400000F2 -:1059E000080008000400000800000000000508008E -:1059F000820040000021040000000000840000C17B -:105A000000A1C100011008000000000020000800F3 -:105A100000008800C000000001000000011000002C -:105A2000000000000000008000000000880001006D -:105A3000000000000004820002000000C0000040DE -:105A400000040000000420000200000000000040EC -:105A500000040000080420000000000000000040D6 -:105A600004904100000080880090080000000000C1 -:105A7000050000080040000083000800000000004E -:105A80000920002004900400040004000000908419 -:105A90008008000809082108030820840200048403 -:105AA00000000300000000000004030000000000EC -:105AB000208405A02000000100C088100010001004 -:105AC000098500010000080180008000000000003E -:105AD0000001000100000001800000000000000043 -:105AE00000010040008000000000C000C000C000B5 -:105AF000000082000800100810118200000000045D -:105B000000408200000088000004A00000000000A7 -:105B10004040000200000000000200000000C00041 -:105B200000200000000000210000001082000000A2 -:105B30000000002100001000000020020000020010 -:105B4000C0400000010010800088009001000300A8 -:105B500000C00100040010000088000000000000E8 -:105B60000040004000000020000000000000000095 -:105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 -:105B900000000000030000C003000000000000003F -:105BA00000000000000000000000000000000200F3 -:105BB0000000000000002000A0000004A000001071 -:105BC0008010001105840200904000410340020053 -:105BD000820000410200000080001141000000002E -:105BE00000000001000001000000000000000000B3 -:105BF000000008000000000100000100000000019A -:105C000011010400000090C000900100022000007B -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C3000000000000000000010C00100010000880A -:105C400000C000040000000010C100000100008836 -:105C500000C000040000000010C1400001010088E5 -:105C600000C000040000000002000000000000006E -:105C700000004000800000002041002104000020BE -:105C800003102140C1110009C080000008008000FD -:105C900000000000050000000800000040000000B7 -:105CA00000000000400000000000000000000200B2 -:105CB0000000000000004000000080800300080099 -:105CC00000800080008000000000C0C1110320009F -:105CD00000830080008000000000C0C10005200398 -:105CE0000083008000800000000000000000000031 -:105CF0000000000000000000000020000000100074 -:105D000041001002030020404083000500210000F4 -:105D10008000000000000000000000000000000003 -:105D20000000000000000000000000000000000073 -:105D300080000080000000000000000009800000DA -:105D40000509C10000000000000080000980030078 -:105D50000009C10000000000000080000980400030 -:105D60000009C103800000000000800000000090D6 -:105D700000000020000000000000000000200000E3 -:105D80000100010001910100000000054000040035 -:105D90008400C000000000000000000000000000BF -:105DA000000400000000000000000090000020003F -:105DB0009000840040080000000000000000014046 -:105DC00000000101C140000000000000C0000140CF -:105DD00000000001C100000000000000C000014000 -:105DE00000000001C101040000000000C00000002C -:105DF00000000200000000000000000000000000A1 -:105E000001000000000100011100090100004040F4 -:105E10000002002000C0000000000000010000009F -:105E20000000000000000000200000000000000052 -:105E30000000000000000100000000000000000061 -:105E400000000000000000C100000010000000C0C1 -:105E500000000000000000C100000010000000C0B1 -:105E600000000000000000C100020000000000C0AF -:105E70000000000080000000001100200008001059 -:105E800000200205000800414021080508212040AB -:105E9000000000000000008003000000000040003F -:105EA00000000000000009000000000000000000E9 -:105EB00000000000000000000800000000000000DA -:105EC000400000110000000900C100000080000037 -:105ED000008000030500000900C1000000800000F0 -:105EE000008000110040000900C100800000000097 -:105EF00000800040002100000000000000000000C1 -:105F000000004182400005000000028004101100E2 -:105F1000021180020040000000000010002100007B -:105F200000008000800400008000000000400000AD -:105F30000000000000080000000000000000000059 -:105F40000000000041098009408009038000000032 -:105F500000808000C109800905800903800080005D -:105F600000800000C10980090080090380008000D2 -:105F70000000000000000000000000000000000021 -:105F800000000000010500000000000000400001CA -:105F900000000001C0010009821090000001000013 -:105FA000000000000400020100009000000000005A -:105FB0000000000000000000004000880000000019 -:105FC0000000000000000101900100400101C0003C -:105FD000000000080400C101900100400101C00060 -:105FE000020000080000C101900100400101C00052 -:105FF0000200000000000041000007000000000057 -:10600000000000000000810000E0000000006006C9 -:1060100000E007000000008100E007010000000030 -:1060200000E007000000880000E0070000006000BA -:1060300002E0070000000000810000E00000000016 -:10604000000000E000000000600000E00000000030 -:106050000000000000000000880000E000000000D8 -:106060000000000000000000880000E000000000C8 -:106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 -:1060900000000000000000000000000000C3FEFE41 -:1060A0000000000000000000287DFFFF000000004D -:1060B00000000000000000000000000000000000E0 -:1060C0000000000000000000000000FF00FF0000D2 -:1060D000AAAA00003C3C0000F0F0000000FF000015 -:1060E000AAAA000000FF0000F0F0000000FF00007E -:1060F000AAAA000000FF00003C3C000000000000D5 -:10610000000000000000000000000000000000008F -:10611000000000000000000000003C3CF0F000C364 -:106120003E3E0000000000000000287DFFFF000050 -:10613000000000000000000000000000000000005F -:1061400000000000000000000000000000FF00FF51 -:106150000000AAAA00003C3C0000F0F0000000FF94 -:106160000000AAAA000000FF0000F0F0000000FFFD -:106170000000AAAA000000FF00003C3C0000000054 -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF -:1061A0004141FFFC00000000000000000000000072 -:1061B00000000000000000000000000000000000DF -:1061C0000000A0F5414100000000000000003C3C40 -:1061D0000000FFFF0000FF000000FFFF00003C3C4C -:1061E0000000FFFF0000FF000000FFFF00003C3C3C -:1061F0000000FFFF0000FF000000C3C3FFFF00001E -:10620000000000000000000000000000000000008E -:1062100000000000000000000000000000003C3C06 -:10622000FF0041413F3C0000000000000000000072 -:10623000000000000000000000000000000000005E -:1062400000000000A0F5EBEB0000000000000000E3 -:106250003C3C000000000000FF00000000000000C7 -:106260003C3C000000000000FF00000000000000B7 -:106270003C3C000000000000FF000000C3C3FFFF23 -:1062800000000A28050000A000610006000D0000C3 -:1062900000000001800000000571002F800D00004B -:1062A0001061202F004D04080561000F000D000053 -:1062B0000061000F800D20000061000F800D00A024 -:1062C000000000610007800D200000610007000D44 -:1062D0000000404280058020920240828000002021 -:1062E0009202408280018020920240828000002041 -:1062F0009202408280018020920240828000002031 -:1063000082020000000000000000000000003030A9 -:106310003F3FAA000A0A00C3C0C00151A1F1050015 -:1063200045400000000000000000000000000000E8 -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:106350000000000005050C0C3C3C00FF00000000A4 -:106360000000000005050C0C3C3C003C0000000057 -:106370000000000055553C3C303000F000000000AB -:10638000000000000000000000000000000000000D -:106390000AFA0AFAAA000A0A00C3C0C00B5BABFBE8 -:1063A00055504540000000000000000000000000C3 -:1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD -:1063D00000000000000005050C0C0000000000009B -:1063E00000000000000005050C0C0000003C00004F -:1063F00000000000000000000000303000F000004D -:10640000000000000000000000000000000000008C -:10641000000000000000003C0055C3C300C3A0A062 -:10642000C0CF4141CF0C0000000000000000000080 -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C -:1064500000000000000000000000000000AA003C56 -:1064600000000000000000003C005500A0A03030FB -:1064700000000000000000000C0C0F00A0A0303055 -:10648000000000000000000000000000000000000C -:106490000000000000000000003C0055000000C3A8 -:1064A000AFAFC0CF7D7DCF0C00000000000000002A -:1064B00000000000000000000000000000000000DC -:1064C00000000000000000000000000000000000CC -:1064D000000000000000000000000000000000AA12 -:1064E000003C00000000000000003C005500A0A09F -:1064F000303000000000000000000C0C0F00A0A0D5 -:10650000303000000000000000008800000004009F -:106510008800200800000000100220000000000099 -:10652000200004080000000000000000000000003F -:1065300020004000000000000000000000000000FB -:106540002000000200000400001000030000000012 -:106550000000000000000000000000080000000033 -:106560000000200000000000000000040000000007 -:1065700000400000000000000000000000000000DB -:10658000000000000100000000800000000000008A -:1065900000000000000000001000000000000000EB -:1065A00000000000000040000000000000000000AB -:1065B000000000000000400000000000000000009B -:1065C000000000C0200010000000000000000000DB -:1065D00000000000000000000000000000000000BB -:1065E000000000000000000000400000000000006B -:1065F000000000010000000000000000000000009A -:106600000000000000004000000000080000000042 -:10661000040000000205000000000010021000004D -:106620000800000000002000000000000000000042 -:106630000000000000084000900000000000000082 -:10664000000000000000200000000000000000002A -:10665000020002000200020002000200020002002A -:106660000000000000000800100000000000000012 -:106670000000000000000200000000000000000018 -:10668000000000000000000000800000000000008A -:1066900000880500000004000084040000000004DD -:1066A00000000008008800080084000000000010BE -:1066B0000400000000000000890804000000000839 -:1066C00040000484000000080004040000000004EE -:1066D00000000000000000000004001000000400A2 -:1066E000008804000000000000840000000000009A -:1066F0000000000000000000000800000000000092 -:10670000001000000000000000080002000000A0CF -:106710000000000000108800C00000000000000021 -:106720000008000000000800C01000030800080076 -:106730008200080088000400820008030000004175 -:10674000C000080482008200000084210000820052 -:1067500082000000000300030000400000048400E9 -:106760000000000000000000020021000000000006 -:1067700000000000000900110000001000000004EB -:1067800000040009000000000000004100000000BB -:1067900000000000000003000800000008000000E6 -:1067A000000003000000000003000384000000005C -:1067B0000900400000A00090000000000000000060 -:1067C00000880000000140000000000003000000FD -:1067D00000000000000000000000000000000801B0 -:1067E0000000000000000000000080002000000801 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:1068100000000000000000000004821108000000D9 -:106820000000000004001000000000000400080048 -:1068300000000000000000002000080000004000F0 -:106840000000040005000000100910000000000016 -:1068500000000000000000004000820082000000F4 -:106860000000000000000009210000008500200059 -:106870004000C000C0000000000000000000000058 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000021000000000000002000A7 -:1068B0000000000041000000000000000000000097 -:1068C0000000000000002000000000000000410067 -:1068D00000000004000000000000000000000000B4 -:1068E00000000000000000002100900000001000E7 -:1068F0008000020000000000000000000000000016 -:1069000000000000000000000000000000880000FF -:106910000000000000000000000000000000000077 -:106920000000100000000000000010000000000047 -:10693000C000000000000000000082000000000015 -:106940000010820000000000000000210000000094 -:1069500000400000000000000000000000000000F7 -:106960000000080020038400000004200000100044 -:10697000200010080011A00000410011000090004C -:106980000000821100000000000000000041000033 -:1069900000000800000000000008000021040000C2 -:1069A00000000000080000000000000000000800D7 -:1069B000000000000000200000A041840500090044 -:1069C000080008880300000000000800000009001B -:1069D00000000000000000001000000000000204A1 -:1069E0000000000000088000050000008001000099 -:1069F00080008000801000000000080000000000FF -:106A00000000000000000000000000000000000086 -:106A10000000000000000000000000010000000075 -:106A2000000000000800000000000000000000005E -:106A3000000000000000000000000000000800004E -:106A400000000000084100000000000000000000FD -:106A500000800000010000000000000000000000B5 -:106A600000000000000008000000000000004000DE -:106A70001000200000000000C00040054008000099 -:106A8000A000000400000000000000000000000062 -:106A900000000041000000110000000000000000A4 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000040004000000000000000000BE -:106AD00000000040009004000000000000000000E2 -:106AE00000000000000000000000000000000000A6 -:106AF0000000800080000000000000000000000096 -:106B00000000000000000000000000000000000085 -:106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 -:106B30000000000000000000000000000000000055 -:106B40000000000000000000000000000000000144 -:106B50000000010000000100000000000000000033 -:106B60000000000000000000000000000000000025 -:106B7000000000009003008200A0A0C0100200846A -:106B800000A0108440A000040082908290040008BD -:106B9000000290040000000000000000010100005D -:106BA00000000001000000000000000000000000E4 -:106BB00000000000000000000000000000000000D5 -:106BC000000000000000000000000000200200049F -:106BD0004108000302000000050000000000000062 -:106BE00000000000000000000000000000000000A5 -:106BF00000000800000083410008090300038580AD -:106C00000000000000002000008000000000008064 -:106C100000000080000000000000000000001141A2 -:106C20000021000300080000000000000000000038 -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C500000000000000080108000000000800000A4 -:106C60000000000000000000000000000000000024 -:106C700000410000000000804000C088408041804A -:106C80000000008300800080800000A100000080E0 -:106C900000008090800000800000000000000000E4 -:106CA00000110000000000000000000000000000D3 -:106CB00000000000000000000000000000000000D4 -:106CC00000000000000000000000000000000000C4 -:106CD0000000000000000000900120000000C00241 -:106CE00000000000000000000000000000000000A4 -:106CF00000000001000000000004844008C12010D2 -:106D000085C08400C0C0044088C00200C0C040905C -:106D1000A0C0020008C1104088C0000000000000B0 -:106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 -:106D50000000000000000100000000000000000032 -:106D60000000000000000000000000000000000023 -:106D700000000000000000000000000011A00189D8 -:106D8000C0058809111000C0C0C0C00291820082F5 -:106D9000C02002C0A1040004C00408880000000054 -:106DA00000000000000000000100000000000000E2 -:106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000000000000C3 -:106DD000000000000000110002000500000000009B -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000C14092 -:106E00000410C105204141800000800000004100C5 -:106E10000000800080004100000080008000000031 -:106E20000000000000000000000002000000000060 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000001022 -:106E6000000800000000000000000000000000001A -:106E700000000000000000000020000800000000EA -:106E80004102101100800500000080000000000099 -:106E90000000000080000000000000000000000072 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE0000001000100A00000000000000000000000 -:106EF0000000000000000000000000000000000092 -:106F000000000501030582820400040002028402DD -:106F100004002000A08404C040004000A008A00895 -:106F2000C0000000000000000000000000000000A1 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 -:106F500000000000000000000000000000E0000051 -:106F60000000810000E007000000000000000000B9 -:106F7000000000000000000000000000008100E0B0 -:106F800007046000880040E0000048420000000064 -:106F900000004842000000000000484200000000DD -:106FA000000048420000000000000000000000E077 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 -:1070000000000000000020401080A00500002004C7 -:107010001008A00000A02010040828410000A000D3 -:1070200000A0201004080000000000000000000084 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 -:107080000000000000000000040208010000A0054C -:1070900040028001050000054080020100002841F7 -:1070A0000500000540800201000000000000000013 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:107160000000000000000000000000000000FFFF21 -:10717000FFFF000000000000000000000000000011 -:1071800000000000000000000000000005000005F5 -:107190000000884410082004008200141020080415 -:1071A00000880044010802040500000500000000FA -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F0000F0F3C3C000000000000000000000000F9 -:107200000000000000000000000000000000A000DE -:1072100000A08844000080014002820014008040E9 -:1072200001028800440080104020A00000A000005F -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:1072600000000000000000610007000D0000006544 -:10727000000F800D00010000000000000000000071 -:1072800000000000000000000061002F000D00A0C1 -:1072900060000001800010000000000000000800F5 -:1072A0006000000000001000000000000000080066 -:1072B000000000000000000000610006000D00005A -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D -:1073100000002828AA00C0C000C300000000000030 -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD -:10739000000000002828AA00C0C000C300000000B0 -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000823082F376 -:1073F000000000000000000000000000000000008D -:10740000000000000000000000000000000000007C -:107410000000000000000000FFFF00C3C0C000002B -:10742000000000000000000000000000000000005C -:1074300000000000000000000000000000000F0F2E -:10744000FC0C000000000000000000000000000034 -:10745000000000000000000000000000000000002C -:107460000000000000000000000000000000BE302E -:10747000BEF300000000000000000000000000005B -:1074800000000000000000000000000000000000FC -:107490000000000000000000FF002D2D00C3C0C050 -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C0000000FC0C00000000000020000000000490 -:1074D0000000000000000005000000000000841013 -:1074E0000000000200004000000000000004000056 -:1074F000000000000000C0000000000000000000CC -:107500000000000000000000000300000000000078 -:10751000000000000010000000000000000000005B -:10752000000000000000000000000000000000005B -:10753000000000C00080008000100000000000007B -:1075400000000000000000000000000000004000FB -:1075500009400000000000000000000000000000E2 -:107560001000000000000000410000020000009038 -:1075700000000002000200020000410000000000C4 -:1075800000000000000000200000000000000000DB -:1075900000000000000000000000000000001000DB -:1075A00000000000000000000000000000000000DB -:1075B0000000000000210010004000010000000059 -:1075C00000000000000000000000000000000200B9 -:1075D0000000200002000400001000000000000075 -:1075E0000000840000000000000002000002020011 -:1075F0000000000004000000000000100300000074 -:10760000001000000000000000000010000000005A -:107610000000000000000200000000000008000060 -:107620000000820084000000000000100000022121 -:107630000000000000000500010003100800000029 -:107640000000000000000000000000100000040026 -:107650000000000000000000001000000000000812 -:1076600000000200050800400000040800080001B6 -:107670000000050000080000000000000000088471 -:1076800000000000001004000000000800080000D6 -:1076900004000000000000100400000000000000D2 -:1076A00000000000000000000000000000080008CA -:1076B00000000400000000008200088884008008A8 -:1076C00000000000000000000000000000080008AA -:1076D0000000000000000008000000000009900009 -:1076E00000000000C00008000000080000000810B2 -:1076F00001800000A0000000000000000000000069 -:107700004000000000000000000000000000000039 -:1077100000000003880000000000000000080000D6 -:107720000000000000000000000000000000000059 -:107730000000000000000000000000000000202009 -:107740000004000000000000000000000000000035 -:107750000000000000000000000000000000000029 -:107760000000000000000000000010000000000009 -:1077700000004002000000000000000000000000C7 -:1077800000000400000000000000000000000000F5 -:1077900000000000000009000000000000000000E0 -:1077A000100008000000000000000000040041007C -:1077B00005A0000000020000000200000000000020 -:1077C00000010000000000000000000000000000B8 -:1077D000000000000000000000000800000004405D -:1077E000000008000000000000008200A00000006F -:1077F00000000000000008000000000082000000FF -:1078000000000000000000000100890000000000EE -:107810000000000000001000000500000000000053 -:1078200000400000000400000000000000004000D4 -:107830000000000000000000000000000000000048 -:1078400000410000000000000000000400000000F3 -:107850000000000000000000000000000000000028 -:107860000000000000100000000000000000000008 -:1078700000000000030000002100200000000000C4 -:1078800000000000000000000000020004000000F2 -:1078900000000010000000000000000000000000D8 -:1078A00000000208000000000000000000000000CE -:1078B0000000000000000040000000000000000088 -:1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000800000000000000A0 -:1078E000000000000000C0000000000000000000D8 -:1078F00000000800000000000180000000000000FF -:107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 -:107920000000000000000000001000000000040043 -:107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 -:10795000000000000000000000000000090000001E -:107960000000000000000000000000000000000017 -:1079700000000000100000000000400202000000B3 -:107980000000000000000000008440000000001023 -:1079900008000000000000000000000000000000DF -:1079A000000000000000000000000000032009208B -:1079B0000084000004000000000000A0000040045B -:1079C00021004000030400001100400400000000FA -:1079D0000000000000820000000000000000000025 -:1079E000000000000000000000000000080000008F -:1079F00000000000000082001000000001000000F4 -:107A00000000000000000000000000000000000076 -:107A10000000000200000021000000000000000043 -:107A2000000000000000000000080000000000004E -:107A300000000000000000000000400200004000C4 -:107A40000000000000000000000000000000000036 -:107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 -:107A70000000000000000000000000004000400086 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000040000000A6 -:107AA00000000000000003000000000800000000CB -:107AB00000000000000000000000000000000000C6 -:107AC00000000000000000000000000000000000B6 -:107AD00000000000000000000000000000000000A6 -:107AE0000000000000000000000000000000000096 -:107AF0000000000000000000000000000000000086 -:107B00000000000100010000000000000000000073 -:107B10000000000000000000000000000000000065 -:107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 -:107B40000000000000000000000088040020000881 -:107B50000090000000000000000000000000000095 -:107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000000000005 -:107B80000000000300200020004000000000000072 -:107B900000000800000000000000000000000000DD -:107BA00000000000000000000000000000000000D5 -:107BB00000000000000000000000000000000000C5 -:107BC000000000000000000000000000A080000095 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000000095 -:107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 -:107C10000000000000000040000000000000000024 -:107C20000000000000000000000000000000000054 -:107C30000000000000000000000000000000000044 -:107C400000000000000000000000000000008000B4 -:107C500000000080000000000000000000000000A4 -:107C60000000000000000000000000000000000014 -:107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000400C0000020 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD0000400200010889000000000000000000058 -:107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000100000072 -:107D10000000000000000000000000000000000063 -:107D20000000000000000000000000000000000053 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 -:107D5000000090000088009020C00000000000009B -:107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000000003 -:107D800000000000000000000000000005000200EC -:107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 -:107DB00000000000000000000000000000000000C3 -:107DC00000000000000000000000000000000000B3 -:107DD0000000000000000080008000800000000023 -:107DE0000000000000000000000000000000000093 -:107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000072 -:107E100000000000000000000000000080000009D9 -:107E20000000000000000000000000000000000052 -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 -:107E5000000000000000801180048000000000008D -:107E60000000000000000000000000000000000012 -:107E70000000000000000000000000000000000002 -:107E800000000000000000000000000000000000F2 -:107E90000000000000000000000000000000C00022 -:107EA000A00088004000000000000000000000006A -:107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 -:107ED0000000000000000000C001A00840200000D9 -:107EE0000000000000000000000000000000000092 -:107EF0000000000000000000000000000000000082 -:107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 -:107F20000041000007000000000000000000000009 -:107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F500000000000000000000000004100000700D9 -:107F60000000000000000000000000000000000011 -:107F70000000000000000000000000000000000001 -:107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 -:107FA0000000BEBEA0F500000000000000000000C0 -:107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 -:107FD0000000000000000000000000000055005AF2 -:107FE0005050A05000000000000000000000000001 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:10802000000000001414A0F5000000000000000093 -:108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:1080500000000000000000000000000000000055CB -:10806000005A5050A0500000000000000000000026 -:108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000AA00AA00000000000000003C -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:108160000000F0D0F0F0008A00AA0000000000003B -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000000000000EF -:108190000000000000000000000000610006000D6B -:1081A00000000000000000000000A0000028000007 -:1081B00001A000000000000000000000000000001E -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E0000000000010000028004000010000000016 -:1081F000000000000000000000000000000000007F -:10820000000000000000000000000000000000006E -:10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE -:1082800000000000000000000000000000000000EE -:1082900000000000000000000000000000000000DE -:1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E -:1082E000000000000000000000000000000000008E -:1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:10831000000000000000000000000000000000005D -:10832000100000000000000000000000000000003D -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D -:1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED -:1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D -:1083E000000000000000000000000000000000008D -:1083F000000000000000000000000000000000007D -:1084000000000000000004000080040000000000E4 -:10841000000000000000000000000000010001005A -:10842000000000080100030003000200000000003B -:1084300000000000880000000000000000000000B4 -:10844000000000000003C0000000000020020088BF -:108450000000018040020000000000002009000030 -:10846000000000000000000000000000000000000C -:1084700000000000000400000000000000000000F8 -:10848000000000000000410080000020800000008B -:108490004000000000000000000000000000040098 -:1084A0000400000000000400A000A0008000000004 -:1084B000000040000000000000000000000000007C -:1084C000000000000000000000000000000080012B -:1084D0000003000040088000000000000000800051 -:1084E00000000000000000000000000000A00000EC -:1084F000000000000000000000000000000000007C -:1085000000000000000000000140020001000440E3 -:108510000400044002000400020002000000020007 -:10852000040004200000000021400040010421005C -:108530000200000000000000000002000000000037 -:108540000000000000000000000000000200020027 -:108550000200000004020002000000000000000011 -:108560000000020000000400000000000000000005 -:1085700000000000000000000000000000000000FB -:10858000000000000000000000000400840004401F -:108590000088000000000000000000000400000847 -:1085A000041080000001000000048200200004018B -:1085B00084000000000002000000040000000088A9 -:1085C000000000000000020000080000000004009D -:1085D0000000000000000001000100000000000099 -:1085E000000000000000000000000004040009007A -:1085F00000000000000000000000000000900000EB -:1086000000000000009000000000000000000400D6 -:10861000000000000000000000000000000000005A -:10862000000000000000000000001000000000003A -:108630000000010000000000000000000000C00079 -:10864000000000000000000000000000000000002A -:108650000200000004000000000010000000000004 -:10866000C0000000000090000000000000000000BA -:108670000000000000000000881190009000000041 -:1086800000000000000000000000000000000000EA -:10869000800000000000000000000000000000005A -:1086A00000000000030000000000000000000000C7 -:1086B0000000000020004100000000000000000059 -:1086C00000000000000000000000000000000000AA -:1086D000000080000000800000000000000000009A -:1086E0000000000009000000000000000000000081 -:1086F000080003000000030000900000009000004C -:108700000000002000000000000000000000000049 -:108710000000080008000800000000000000004001 -:108720000000820082000800A0000000000000009D -:1087300021000104010008090000000040000000C1 -:108740000400C000000082000000000040000000A3 -:108750000000000082000000000000000000000097 -:108760000000000002000000020000000000000005 -:1087700000000000000000000840000000000000B1 -:1087800000000000000000000000000000000000E9 -:1087900000002100000000000000000000000000B8 -:1087A00000000000000000000000000000001100B8 -:1087B00000008400040102000000000040000000EE -:1087C0000000800000000000000000000400000025 -:1087D00000000000050008002188080000002100BA -:1087E000030021000008000000000000000800A0B5 -:1087F0000000000000000000000000000000000079 -:108800000000000000000000000003000000000065 -:108810000000000001000000000000000000000057 -:1088200000000000A000080008000000C0000000D8 -:108830000000C000000084000000000000400000B4 -:108840001000000000000000000000000000000018 -:10885000000004000000A0008200000000000003EF -:1088600000008400C000000082000004000400003A -:1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000000000E8 -:1088900000000000000004000000000000000000D4 -:1088A00000000000000200000000000000000000C6 -:1088B00000000000000000000000000000000000B8 -:1088C0000000000000000000000000000084000024 -:1088D0000000000080000000050000000000000013 -:1088E000000000000000000008000000000000017F -:1088F0000000000000000000000000000000000078 -:1089000000000000099008000000000000000000C6 -:108910000000000000000000000000000000000057 -:108920000800000000000000080000000000000037 -:108930000000C00000000000000000000000000077 -:1089400000000000000000000000C0000000000067 -:1089500004000000900000020000840008410800AC -:10896000080040000000000000000000004000007F -:1089700000400000000000000000000000000000B7 -:1089800000000000000000000000000000000000E7 -:1089900008000000000000000000000000000000CF -:1089A00000000000000000000000000000000000C7 -:1089B0000000000000000000000000000000410076 -:1089C0001100000000000000000000000000000096 -:1089D00000000000008400000000000000200000F3 -:1089E000000003008000000021000582000000025A -:1089F0000000000000000000000000000000000077 -:108A00000000000000000000000000000000000066 -:108A10000000000000000000000021000000000035 -:108A20000000000000000000000000000000000046 -:108A300000000000000000000000000008C040200E -:108A4000004082080000000000000000000000005C -:108A50000000000000000400000000000000000012 -:108A600001001000000000010000410000000000B3 -:108A700000000000000000000000000000000000F6 -:108A800000000000000000000000000000000000E6 -:108A900000000000000000000000000000000000D6 -:108AA00000000000000000000000000000000000C6 -:108AB0000000000000000800000000000000088026 -:108AC0000080110000000000000000000000000015 -:108AD0000000000000000000800000000000000016 -:108AE00020004100850000000541412040100009A0 -:108AF0000000000003000000000000000000000073 -:108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B20000000000000008080000000000000000045 -:108B30000000000000000000000000000000000035 -:108B40000020802100908000000000000000000054 -:108B50000000000000000000000000000000008095 -:108B6000000000000000800000002000210005102F -:108B7000418900000000000000000000000000002B -:108B800000000000000000000000000000000000E5 -:108B900000000000000000000000000000000000D5 -:108BA000000020008490840090020000000000007B -:108BB0000000000000000000000000000090000025 -:108BC0000000080004000083C00000000000000056 -:108BD0000000000000000000000000000000000095 -:108BE0000082000040000000020000000088010038 -:108BF000010101A0000000000000000000000000D2 -:108C00000000000000000000000000000000000064 -:108C10000000000000000000000000000000000054 -:108C20000000000000000000200000000000000024 -:108C30000000000000000000000000000100000033 -:108C40000000000000000200000200C00000000060 -:108C50000000000000000000000000000000000014 -:108C60000000000000000000000100010001000100 -:108C700000010000000100000000000000000000F2 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000000008000000000010000000AC -:108CB00000000000000000000000000000000800AC -:108CC0000000000000000000800000800380000021 -:108CD0000000000000000300000000000000000091 -:108CE0000000000000000000004000100020031100 -:108CF00000080908412100100500000000000300E1 -:108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000000000053 -:108D20000000000000000000000500C0000000007E -:108D30000000000000000000000000000000000033 -:108D4000000000200000000080100008000000006B -:108D500000000000000000000010000400000000FF -:108D6000000000400000000000000000000400803F -:108D700000001010090010000400000000000000B6 -:108D800000000000000000000000000000000000E3 -:108D900000000000000000000000000000000000D3 -:108DA00000000000000000000000000000820088B9 -:108DB00000000000000000000000000000000000B3 -:108DC00000000000000100000000C00100010040A0 -:108DD0004000000000000000000000010001000051 -:108DE00000000000000000000000000000000090F3 -:108DF00000C00000000000000000010000000000B2 -:108E00000000000000000000000000000000000062 -:108E10000000000000000000000000000000000052 -:108E200000000000000000000000000000810000C1 -:108E3000070000000000000000000000000000002B -:108E4000000000000041000007000000818100E0F8 -:108E5000070000000000000000000000008100008A -:108E6000070000000000000007000000000088006C -:108E700000E00700600A880000E000000000000039 -:108E800000E0000000000000000000000000000002 -:108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED00000009999990000000000000000000000C7 -:108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 -:108F50003C3C666600009900000000000000000034 -:108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F900000000000000000000000000000000000D1 -:108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 -:108FF0000000000000000000000000000000000071 -:109000000000000000000000000000000000000060 -:109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 -:109030000000000000000000BDBD818100000000B4 -:109040000000000000000000000000000000000020 -:10905000000000003C000F00C3C303030000000039 -:109060000000000000000000000000000000000000 -:10907000000000000000000000007E7E7E7E0000F8 -:1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000F330F33000006A -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000003C000F000000030300003F -:1090E0000000000000000000000000000000000080 -:1090F00000000000000000000000000066FF66FFA6 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:10913000000000000000000005000A28050000A152 -:10914000000000000000000000000000000000001F -:1091500005000A28000000001061202F804D000843 -:1091600000000000000000000510002800000000C2 -:1091700000000008000000A000000061000F800D4A -:10918000200100600007800D000000610007000D55 -:1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000000000000AF -:1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000000000008F -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000FA30FA3F03020302F000F0000000000011 -:10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E -:10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000A300A3F03570302F000F400000018 -:1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E -:1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E -:1093000000000000000000000A0AFF02C0C30300C2 -:10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED -:10938000000000000000000000000A0AFF00C0C347 -:1093900003000000000000000000000000000000CA -:1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD -:1093C00000008800000000000000890001028904FC -:1093D0008920000000000000200420004000200040 -:1093E0002000008000804080000084008400840011 -:1093F00000000141040004040400000000004100DA -:109400000000000300000000000000000000000059 -:10941000000000000000000000000000000000004C -:10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C -:1094400000000000000000000000000020002000DC -:1094500020002000000000000000000000000000CC -:1094600000000000000400040004009000020090CE -:1094700000900000040080028000800000000000D6 -:1094800010000000000000000000000000000000CC -:1094900000080000000000000000000000000000C4 -:1094A00000020000000000000000000000000000BA -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000020007C -:1094D0000404020404040400000000000000020070 -:1094E0000000000000102000200084042000000084 -:1094F00000000000001088000400002000000000B0 -:109500000000000004000000000000000000000057 -:1095100005800000001000000400000000000000B2 -:109520000400000000100000000000000000000027 -:109530000200018000100000000000008200000016 -:10954000000000000000011000000000000000000A -:1095500084080001040900850000000000000208E2 -:109560000000000009080040A00080000401800005 -:109570000008000000080000410080000001008297 -:10958000000000001108801000000400000002002C -:10959000000020040000000800000000000000009F -:1095A00000000000000000080000000000000000B3 -:1095B0000000000002400008000000000400000459 -:1095C0000000048204000408208200000000000063 -:1095D000000000000040000000000000000000004B -:1095E0000000000000000000000800000000000073 -:1095F00020000000000000000000820000000000C9 -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:109620000000000000030000000000000002100223 -:10963000100910210000040088000200A0000000B2 -:109640000000001100000000000000000000000009 -:1096500000000000000000000000004000000000CA -:109660000000002021002100000000000000000098 -:10967000000080000000000000000000000000006A -:1096800000000000210000000000000000001100A8 -:10969000050008004100000000000000000000106C -:1096A00000C00008000000000000000000000000F2 -:1096B00000000000000000008000000080000000AA -:1096C000000000000000000000000000000000009A -:1096D000000000000000A00000200840004008003A -:1096E00008000000000002400000000000000840E8 -:1096F000000000000400080000000820080084208A -:109700000000000000000804000082008200000049 -:109710000000A000000000000000000000000000A9 -:109720000000080008000800000000000800000019 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000010018 -:1097500003000000000000000800000400000800F2 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000004000000E5 -:109780000001400004000000000100000000000093 -:1097900000002100000000000000000000080000A0 -:1097A00000000000000000000000000000000000B9 -:1097B00000000000000000000000000000000000A9 -:1097C000000000000000000400000500000021006F -:1097D000400008000000000004000000000000003D -:1097E0000000001000000000000000000000000069 -:1097F00000000000820000000000000000000000E7 -:1098000000000000000000000800820008000800BE -:10981000080000000200C000C00002008400080030 -:1098200001800000000000000000000300000002B2 -:109830000002000000000000000000110100010013 -:109840000180008000000000840000200000000073 -:1098500000000000080000000000002000000000E0 -:1098600000000000000000000000000003000004F1 -:1098700000000000080021000010000000000000AF -:1098800000000000030000000000000000000000D5 -:10989000000000000000908805000000800000002B -:1098A00008024040000000044000000000000000EA -:1098B00000000000000000000000000000000400A4 -:1098C0000200022000200000000000000000000054 -:1098D0000000000000004000000000000000000048 -:1098E0000000000000000800080000000000000068 -:1098F00008000000000000000000000000008200DE -:109900000000040000008200000000000100A00030 -:109910000800000082000000820040800440040033 -:109920000800000008002000000000000003000004 -:109930000008000000000008000082008200820091 -:1099400002000000000000000000000020000000F5 -:109950000000000000000000000000000000000007 -:109960000000008200004100000000000000000034 -:1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000400D3 -:1099900000000000000000000000000041408000C6 -:1099A0008000000000000000000000000000000037 -:1099B00000000000000000000000000000000000A7 -:1099C00000008000000000000000000000002000F7 -:1099D0000000000000000000000000000000000087 -:1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000400010062 -:109A00000000000000000000000000000000000056 -:109A1000000000010000010100010000000200C080 -:109A200000840002024003880508409090020088EC -:109A300000020282000000000000000000000000A0 -:109A40000000000000C0000000901088000000002E -:109A50000000000000000100000000000000000005 -:109A600000000000000000001100000000000000E5 -:109A70000000000000000000000000000000800066 -:109A80002000000000000000000000004000000076 -:109A9000000000000841002140100011000000807B -:109AA0000000008000808000A12082C000000080B3 -:109AB0000000000080000000000000000000000026 -:109AC0000000000000000080000000000000000016 -:109AD000000000000000000003000500000000007E -:109AE0000000000000000005000000080000000069 -:109AF0000000000000000000000000000000004026 -:109B00000000000300000000000000000000000052 -:109B100000000000000000000000000000800000C5 -:109B20000000000000008080200504910380A190C7 -:109B30008000009000808080000000000000000095 -:109B40000000000000000000000080050000800010 -:109B50000000000000000000000000000000000005 -:109B600000000000000000000000000000000000F5 -:109B700000000000000000000000000000000000E5 -:109B800000000000000100000000000000000000D4 -:109B9000000000200000004000000000000000C0A5 -:109BA000000088000000A000C090884005C0A0040C -:109BB00083C1080002C0020404C0000000000000CD -:109BC0000000000000000000000000001000400045 -:109BD000C0000000000000000000000000000000C5 -:109BE00000900000000000000000000040000000A5 -:109BF0000100000000000000000000000000000064 -:109C000000000000A00000000000000000000000B4 -:109C10000000000000000400000000000000000040 -:109C200000000000C0200020009004C00389002133 -:109C3000C010048905880010C0C090080000000012 -:109C4000000000000000000000000000000000888C -:109C5000009004C0000000000000000000000000B0 -:109C600000010001000000000000000000000000F2 -:109C700000004100000000000000000000000000A3 -:109C800000000000000000000000030000000000D1 -:109C9000000000000500000080000000000003003C -:109CA00004000000000080000000000080804121CE -:109CB000000280038002410000008000008000005C -:109CC0000000000000000000000000000000000094 -:109CD0000000000080800000000000000000002064 -:109CE0000000002000020000000000000000000250 -:109CF0000000000000000000000000000000000064 -:109D00000000000000000010000000000000000043 -:109D1000000000000000001000210000000000050D -:109D20000008000000000000000500040000000022 -:109D30002002852083002004804080000000000075 -:109D40000000000000000000000000000000000013 -:109D500080080004800000000000000000000000F7 -:109D600000000000000000000000000000000000F3 -:109D700000010000000000000000000000000000E2 -:109D800000000000000000000001000000000000D2 -:109D900000000000000000000000000000000000C3 -:109DA0000000000100000000000000000021000091 -:109DB000000011C1044003881001040020821082B9 -:109DC0000200000000000000000000000000000091 -:109DD0000000C0019091040000000000000000009D -:109DE0000000000000000000000000000000000073 -:109DF0000000810000E000000006000000000000FC -:109E000000000000000000000000810000E00000F1 -:109E100000000000000000000000004100000700FA -:109E20000000818140E00700001200000081000076 -:109E300007006000810000E00000484200000000D0 -:109E40000000484200000000000000000000000088 -:109E5000000000000081000007000000000000007A -:109E600000000000600000E00000000000000000B2 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB0000000000F0C0C000900600011002202805D -:109EC000082040108020000000000000000000007A -:109ED000000000000000F000FF00F000FF000000A4 -:109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 -:109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 -:109F300000000000000F0C0C09006000110022005E -:109F400001400410010402080000000000000000AD -:109F50000000000000000000F0000000F000000021 -:109F600000000000000000000000000000000000F1 -:109F700000000000000000000000000000000000E1 -:109F800000000000000000000000000000000000D1 -:109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 -:109FB0000000FFFFFFFF4141C300248100000401B6 -:109FC0001040248100000600900000000000000006 -:109FD00000000000000000000000505030300A0A6D -:109FE000AA000000000000000000000000000000C7 -:109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 -:10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 -:10A0300000000000FFFFFF7F4141C30000002481BA -:10A04000080220800000248100060090000000002B -:10A050000000000000000000000000005050303000 -:10A060000A0AAA0000000000000000000000000032 -:10A070000000000000000000000000000061000778 -:10A08000800D000000000000000000000000000043 -:10A090000000000000610007800D000000000000CB -:10A0A0000000000005000A28050000A00021002B88 -:10A0B000800D01A000000000402800400008606101 -:10A0C0000007800D100000000000000008000000E4 -:10A0D0000000000000000000000000000000100070 -:10A0E000202800400008000000000000000000617F -:10A0F00000078009200000000000000000000000B0 -:10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000100000000000000000000000E -:10A1500000000000000000000000000000000000FF -:10A1600000000000000000000000000000000000EF -:10A17000000000003C3CFFFF000000000000000069 -:10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000080000000000000000000000F -:10A1D000000000000000000000000000000000007F -:10A1E000000000000000000000000000000000006F -:10A1F0000000000000003CFF3CFF000000000000E9 -:10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A2300000000055FF3C000000000000000000008E -:10A2400000000000FF0FFF0F0000000000000000F2 -:10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE -:10A2B000000000000055FF0F00000000000000003B -:10A2C000000000000000FF0FFF0F00000100000071 -:10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E -:10A2F000000000000000000000000000000000005E -:10A30000840020000400C0000080008001000400E0 -:10A310000000040000000000000000000000200019 -:10A32000208020002000000000000000000200004B -:10A33000000004000400029000000100000000037F -:10A3400004000000200000000000000000000000E9 -:10A35000000000000000000000000000C00000003D -:10A3600000000000000000000000000000000002EB -:10A3700000000000000000000000000000000002DB -:10A3800000000000000000000000000400042004A1 -:10A39000000000000000000000000000210000009C -:10A3A0008000000880008000000000000000000025 -:10A3B000000000000000000000110000020000008A -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D -:10A40000000000009000000002002000201020004A -:10A41000020000100800080000000000000000001A -:10A4200000000100050001000500014001000100DD -:10A4300001000000000000210000081008000510C5 -:10A440000000000002000200020002000200020000 -:10A4500002000200000004000000000020000000D4 -:10A4600000000000000001000100030001800180E5 -:10A4700001800100040000000080008000800000D6 -:10A4800000800000048404000000000080008000C0 -:10A490008002030800000440408200000000000029 -:10A4A000000000001000200010001000200020001C -:10A4B000200020080000000000A00000800105002E -:10A4C0000200000200002000000000002000000048 -:10A4D00000000400000800000000000000400040F0 -:10A4E0000000000000082084020002000200024078 -:10A4F000024002400208000000840040004000408A -:10A5000000000040000800000400000000000000FF -:10A5100000000000000000030000000000008200B6 -:10A520000000000000088400000000000800000097 -:10A53000000000000000000000000000000000809B -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000000800F3 -:10A56000000000000000000000400088008800405B -:10A570000000000000000000004002000000000099 -:10A580000020022100200000000000000000000068 -:10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB -:10A5B0000800100000000000000000000000000083 -:10A5C000211009002100000800000300080003001A -:10A5D0000000210000000000000000A000080008AA -:10A5E00000A00008008200080000000100400040B8 -:10A5F0000001000800A01100000005018000008299 -:10A6000000000000800000000000080000000000C2 -:10A610000000400000000000100400000000C0081E -:10A620004000A000100000008200000000040000B4 -:10A630000000000000000005000004000400040207 -:10A6400000080000000001020000000000000000FF -:10A6500000000000000000000000000000000000FA -:10A6600000000000004000000000000002000000A8 -:10A670000000000400000000100000001040C12095 -:10A680000100010001000100830001000000020040 -:10A690000000000040000000000000A100000000D9 -:10A6A0000000000003000000000000000000008225 -:10A6B0000800000000000040000000000000000052 -:10A6C0000000000000000000020000000000000088 -:10A6D000000000000000400000000000000000003A -:10A6E00000000000000000000000000000008000EA -:10A6F000000008000000000000008000000083014E -:10A70000020002000200020002000200020000003B -:10A71000000000000000200000000000080082008F -:10A7200000000000C00000000000C000C0200000C9 -:10A730000000000000000003000000000000000511 -:10A740000000000000080000000000800000000081 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A77000020802000000000000000000900001003C -:10A780008400102100002000004000200000014053 -:10A790000000000000000000800000000000000039 -:10A7A00000000000000000000000000000000000A9 -:10A7B0002100000000000000000000000000000078 -:10A7C0000000000000000000009020000040000099 -:10A7D0000000000803C00000000000080008210875 -:10A7E0000084000000A008A0080000000000000095 -:10A7F0000000800080000000000800A0098800A080 -:10A80000020000008000000080000001000008003D -:10A810000201000000000000000000000000000035 -:10A82000000040000000000000008200000008005E -:10A830000000000000000000000000000000000018 -:10A84000000008000000080284000008000000006A -:10A8500000000000900000008800000000000000E0 -:10A8600000000000000000000000000800000000E0 -:10A8700000000000000000000200020000040204CA -:10A880000004000800040021000000000000020095 -:10A890000040C000000000000000000000000000B8 -:10A8A0001100000000000000000000000040000057 -:10A8B0000000000000000000000020000082008274 -:10A8C0000000000000000000110000000000000077 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000200000066 -:10A8F0000000000000000000000080008000000157 -:10A9000080010001000100010000000000000000C3 -:10A9100080000801000000000000000000000000AE -:10A920000000010000000000000000000000000026 -:10A930000000000000000001000084000000000092 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A97000000000000000000000C000080000080007 -:10A9800001C189014000820000C1A00011018800BE -:10A9900002C00000000200000000000000000000F3 -:10A9A0000000000040000000000000000000000067 -:10A9B000000000000000000020410321910500007C -:10A9C0000000000011000000000000000000000076 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000800080000057 -:10AA0000800009C190108405801100C111028309E2 -:10AA1000800880800000008000000000000000002E -:10AA200000000020000000200000000000000000E6 -:10AA300000000000000000000000200020002000B6 -:10AA4000410000200000000800000000000000009D -:10AA500000000000000200000000000000000000F4 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000008000830009000900C105208000004B -:10AA90008200C10080000000000080000000000073 -:10AAA00000000000000000000001000000000000A5 -:10AAB0000000000000000000000000000020000076 -:10AAC0000000014000000000000000000000000045 -:10AAD00000000000000000010082000000000000F3 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB000000000000C000080000000100C100008833 -:10AB100000009000C100080000000000C00000001C -:10AB20000000000000000000200000000100000004 -:10AB30000000000000000000000000000000000015 -:10AB400000000000000100004000000000000000C4 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000C000000000000191C1B2 -:10AB900020009000000000C100000000000000C084 -:10ABA0000000000000000000000000000000100095 -:10ABB0000000000000000000000000000000000095 -:10ABC00000200300000000410000000000004000E1 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC000000000000000000000080000002090005B4 -:10AC100089C180208502000000C100000000000002 -:10AC200000800000000000000000000200000000A2 -:10AC30000000000000000000000000000000000014 -:10AC4000000041054000000040000000000000003E -:10AC500000000000000000000000000000000000F4 -:10AC60008000000000000000000000000000000064 -:10AC700000000000000000000000000000000000D4 -:10AC8000000000008000000000800000C109890071 -:10AC900003002000C1800209880009038000000031 -:10ACA00000000000000000000000000000010000A3 -:10ACB0000000000000000000000000000000000094 -:10ACC0000000000001000000000000000000000083 -:10ACD00000000000000000000000000020009000C4 -:10ACE0002000040000000000000000000000000040 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000800000000080000C191E1 -:10AD1000200000000000C1C0000188000101C00047 -:10AD20000000000040000000000000000000810062 -:10AD300000E0000000000000000000000000000033 -:10AD4000000000000000810000E0000000000000A2 -:10AD500000E0000000000000000000000000000013 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD9000410000E000000000600000E00000420010 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000040000000000000000000000000000023 -:10ADF0000000000000000000000000000000000053 -:10AE000000000000000000000000FFFF0000FFFF46 -:10AE10000000FF000000FFFF0000F0F00000FFFF57 -:10AE200000003C3C000066660000000000000000DE -:10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 -:10AE8000000000000000000000000000FFFF0000C4 -:10AE900000000000FF00000000000000F0F00000D3 -:10AEA000000000003C3C000066660000000000005E -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF9000000000FF0000FFFF0000666600003C3C70 -:10AFA0000000FFFF000000FF00000F0F00003C3C0E -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000FF0000000000006666000065 -:10B020003C3C00000000000000FF00000F0F00008B -:10B030003C3C000000000000000000610007800DA3 -:10B040000000000000000000000000000000000000 -:10B050000000000000018000000000610007000DFA -:10B060000000000000000000000080000000000060 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000400280000020920240828001F7 -:10B0A00080209202408280018020920240828000B3 -:10B0B00000209202000000000000000000000000DC -:10B0C0000000000000000000000000000000000080 -:10B0D00000000000AA002828C3C3828200000000EC -:10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000C36C -:10B120000003000000000030005002020303000092 -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B15000000000000000AA002828000082820000F1 -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000030A0A000F0030005002020000F5 -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D00000000000000000000055000F00C3C0C0C8 -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B220000000000300410000000000410003C300D3 -:10B23000820000000000000000000000000000008C -:10B2400000000000000000000000000000000000FE -:10B25000000000000000000000000055000F00C3C7 -:10B26000C0C000000000000000000000000000005E -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A0000000000000030041000F0C0C00410003EF -:10B2B000000082000000000000000000C00020002C -:10B2C000C000401100008200820082004000400067 -:10B2D0000000880004000289000402048800C00005 -:10B2E00000002004408002804080008000000000B8 -:10B2F00000000000200000000000200000032000EB -:10B3000020000004400088002000000000000480AD -:10B3100001000100038000000000000000000000A8 -:10B3200000000000200002000000020002000000F7 -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000400000000000000F9 -:10B35000000040400000800080040001800100C027 -:10B360000000000000000040802004400040410038 -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B39000004004020400044000000000000000001F -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C00000000200000000000200840000000000F5 -:10B3D000200000000010000005800400050001109E -:10B3E00000000300400004002000010020000100D4 -:10B3F000020000000000000000000000001000003B -:10B40000000000000000000000000200000000003A -:10B4100000000000000002000080000000000000AA -:10B42000000000800000000000000000000000009C -:10B43000000000000000000000000000000000000C -:10B44000000009004000000020880084000000087F -:10B4500000080000000000900004020489000204BB -:10B460000404090004008000000089002000800816 -:10B47000200841000000000000000000200000083B -:10B480000000000000000000000000840000000038 -:10B490004010000800000000040000040900400003 -:10B4A000001000000020000000000000000000006C -:10B4B000000000100000000000000000000000007C -:10B4C000000000000000000000000000000000007C -:10B4D00084000010000000000000000000030000D5 -:10B4E00082000000000000000000000004000000D6 -:10B4F000040004000000000000000008824000007A -:10B50000000000000000000000000000000000003B -:10B510000000000000000000020000000002000027 -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000041000200000000000000B8 -:10B5500000000000000000000000000000000300E8 -:10B56000080008080000080000000000000080003B -:10B57000000080008800000041000000080000007A -:10B5800000000000000000000008000000000000B3 -:10B59000000000000000000000008000210000000A -:10B5A000000000000000000000000000000000009B -:10B5B0000800000000000000000000000000000083 -:10B5C0000000000000000000000000000800024031 -:10B5D00004409004820400040800000000000040C1 -:10B5E000830401000104090000200000000900207C -:10B5F000820008000004000008000800002000008D -:10B600008200000000000000000082208200400054 -:10B61000080008000000000000000000000082098F -:10B62000000000000000000000000800080000000A -:10B630000000000008000000000000000000000002 -:10B64000000000008209000000000000000000006F -:10B6500000000800000000000000000000000000E2 -:10B66000020020002000040120004001000008002A -:10B670000001000008000500000000000088000034 -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000800000000000000A2 -:10B6A00021000000080000004100080021004100C6 -:10B6B0000300000000000000000000000300030081 -:10B6C0000000080040004000400040000000001161 -:10B6D000000000000000000000000000000000006A -:10B6E000000008000000000000000000040004004A -:10B6F0000000040800000000080000000000000036 -:10B700000000000000000000000000000000000039 -:10B7100000000000000082000000000000000000A7 -:10B7200000000000820000000000A00000000000F7 -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000400000000000B9 -:10B7500000000000000000000000030000000000E6 -:10B760000000000000000000000000000000800059 -:10B7700080000000800000000000000000000000C9 -:10B7800000000000000003000300000000000000B3 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B000000000000000000008000000000400007D -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E000400008008200000000000000000002008D -:10B7F00040000800050000000040000000000000BC -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000040024 -:10B820000000000000000400008004000000000090 -:10B830000000008000000000000000000000000088 -:10B840000000000000000000000000008200000076 -:10B8500000000000210000000000000002000000C5 -:10B8600020000000000010000000000000000000A8 -:10B8700000000000100084101000000021004000B3 -:10B880000300202000000000080000040000000069 -:10B8900000000000080000000000000000000000A0 -:10B8A0000000000000000000000003040000000091 -:10B8B000000000000220000000000000080000005E -:10B8C0000002050008000000000000000000040065 -:10B8D0000000000000000000000000000000000068 -:10B8E00000000000000000000000000020C0C000B8 -:10B8F00001029020000000000000000002C0009043 -:10B900000100000200000000000000000000000034 -:10B910000000000000000000000000000000000027 -:10B9200000000000000000C000080008080200003D -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B960000000000000000000000000000000408017 -:10B970000000038000000000000000000000C08004 -:10B9800000004000008000000000000000000000F7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000008000004000008057 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000008002180408000090041000408088000 -:10BA0000002000080082800000000000000000000C -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000800096 -:10BA30008000000000000000000000000000000086 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA70000000900090004000C00000000020000185 -:10BA80000004400002000041C0000000000000006F -:10BA900000000000000000000000000000000000A6 -:10BAA00000000000000000000000000088004000CE -:10BAB0000400C000000000000000000000000000C2 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000040404000000000C000000000C6 -:10BB00002000000040400400000400C000000000CD -:10BB10000000000000000000000000000000000025 -:10BB200000000000000000000000000000000040D5 -:10BB30000000000200C00000000000000000000043 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000008804000FD -:10BB800000000000000000008000008040800000F5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000804080000000000000000045 -:10BBC0000300000000000000000000000000000072 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF00000000000000000008005800480000000BC -:10BC00000002002000000002800500C000000000CB -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000200200080000000000000000062 -:10BC400000000000004000000000000000000000B4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000C00004000400FC -:10BC800000000085000100000000C0000803000063 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB00000000000000100890002000000000000F8 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF000000000000000000000000000818100E062 -:10BD0000070000000081000007000000008100E043 -:10BD1000070000000000000000000000000000001C -:10BD20000000000000000000000000000000000013 -:10BD3000000000000000008100E00700000000009B -:10BD400000000000000000000000070000000000EC -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD80000000C3C3828200000000000000000055D4 -:10BD9000555500C382820000000000000000000032 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000003C00FF0048 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 -:10BE0000F0F000FF0000828200000000000000004F -:10BE10000055000000C38282000000000000000006 -:10BE20000000000000000000000000000000000012 -:10BE300000000000000000000000000000003C00C6 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE8000000000000000003C000F00000000000067 -:10BE9000000000000000414103030000000000001A -:10BEA0000000000000000000000000000000000092 -:10BEB000000000000000000000000000C3000303B9 -:10BEC000FFFF000000000000000000000000000074 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF0000000000000F0F3C3C003C000F0000000050 -:10BF100000000000FF003C3C414103030000000022 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000C3003E -:10BF40000303553C0F0F000000000000000000003C -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF80000000000000001061202F804D00080561B6 -:10BF90000A2E050D00A01061202F004D00080000A2 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000061202F004D010800000000000000006B -:10BFD0000500000800000000000000000000000054 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C110000000000000000000550F00C300000000F8 -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C1900000000000000000000000550FFFC3000079 -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F00000000000000000000000C0000000C000BF -:10C200008800000088008802200000000000200054 -:10C21000200020002000200284008400840084008C -:10C220008800000004000000040004000400200056 -:10C2300040002000400020000003200020002000DB -:10C24000200000000000000000004000000000008E -:10C25000200020000000200000000000000000007E -:10C26000000000000000000000002000008000002E -:10C27000200000000000000000000000000021007D -:10C2800000000000090000000000000000000000A5 -:10C2900000008000C100800080000000000000005D -:10C2A000000000000000800000000000000000000E -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000002000000006C -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000024C -:10C2F00000000000100000000000000004000040EA -:10C3000000000200020002002000020004000440BD -:10C310000000020000400200000004000000004194 -:10C320000000000003000480001000000020000056 -:10C33000000040200000000000000000000000009D -:10C3400002000200020000020200000000000000E3 -:10C350000000008000000241000002000004000014 -:10C3600000000000844089000300C10089008800AB -:10C3700000008800000000000000000000004110E4 -:10C38000000000000000000000080000008400041D -:10C390000000400400000010090000040008000034 -:10C3A00004000000000004108040000000082091FC -:10C3B00000004000040100004000200000040000D4 -:10C3C00041000000000040000000000020000008C4 -:10C3D000000000000004000000000000050000084C -:10C3E00000000900090000010200840004000404A8 -:10C3F00041004100000000000000000000000004B7 -:10C40000000000000009000000000000000000081B -:10C410000008000000000000000000008200002171 -:10C4200000000040000000000000000008000021A3 -:10C4300000000000000800000000000000000008EC -:10C4400000000000000000000000000000030000E9 -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000003C9 -:10C470000000000800000000A021000000000000F3 -:10C4800000000000000005000000000000000000A7 -:10C490000000030000000000410000000300030052 -:10C4A0000000030000000900000009000000000077 -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E0000000002000000000000008000000000024 -:10C4F0000000000000000000000000000900000033 -:10C5000009000000C0090000000000000000080051 -:10C5100008400004404008000800000010008400AB -:10C520000005400000400009002000400802000013 -:10C53000408409040400048200090400040004008B -:10C54000A00005000000C000C000A000C00008005E -:10C550000020000004000800080008001000A000EF -:10C5600000000020A000820000000805000000007C -:10C5700000000002904020000400040004090802AA -:10C5800000020800000208001000000000001188EE -:10C59000008400880000000000A0200000000000CF -:10C5A00003000000400011820000038808004000E2 -:10C5B0002100000304018000802000028000800030 -:10C5C0000090200004200000000010001000000077 -:10C5D000030003000000830041004100100003003D -:10C5E0002000000021000300000000000000000007 -:10C5F00021004000000009010400000000000000CC -:10C6000000000000410000000021000000000800C0 -:10C610000800000000000000000000009000A000E2 -:10C620000000C000000000008200000000000002C6 -:10C6300000000000000000020000000000000000F8 -:10C640000800040004000000000000000000A0003A -:10C650000000040004000400000000050000008049 -:10C66000C000000000000000000008000800820078 -:10C6700082000000000000004000000000400000B8 -:10C680001000000084008800000000000500000089 -:10C69000000000000000000000000000000000009A -:10C6A000000008000000080008000000000000A0D2 -:10C6B0000000200000000000000100000000000059 -:10C6C000000000008000800000000000000000006A -:10C6D0000000000080848000800000000000000056 -:10C6E0000004000000000000000000000000000046 -:10C6F00000000000000000000000800000000000BA -:10C700000000000000000000000000000000000029 -:10C7100000000000000800000000100000000009F8 -:10C720000000000001000080010001000000820004 -:10C73000001000008480838001008200000000114E -:10C740000420000900000000040000000000820036 -:10C7500082000000820000800080050001000411BA -:10C760000000400004000004000040000000400001 -:10C770008200000040000000000000039000000064 -:10C780000000000000000400040004000400008415 -:10C7900000000002050000880000410000000000C9 -:10C7A000000000000000208203042000200041005F -:10C7B0000800001005901104040404840000000027 -:10C7C0000040800120000400002000000000000064 -:10C7D0000000000000000088032041200400040045 -:10C7E00003000300030005000304080041A0080043 -:10C7F0000000000000020000000000000000000037 -:10C800000000000000000000000000000000030223 -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 -:10C83000000000000000000001000000A000000057 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C870000000008800900088008403C001828800C6 -:10C88000A0A0000000000000000100000000000067 -:10C890000100000000000000000000000000000097 -:10C8A0000000000000000000000000000000030085 -:10C8B000000000000000000000001100040008005B -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000050000000000000043 -:10C8F0000000000000000000000000009080218087 -:10C900008000000000200020000300200000000044 -:10C91000000008000000000000000000000000000F -:10C9200000000000000000000000000000080000FF -:10C93000000900000000000000000000102020009E -:10C9400091049000000000800000008000000000C2 -:10C9500000000000000000000000000000000000D7 -:10C9600000800000008000000000002000000000A7 -:10C9700000000000000000000082008800004080ED -:10C980001105100091800000000000000008000068 -:10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000186 -:10C9B00000000000000000000000000000009100E6 -:10C9C0009140410109400000000400000004000003 -:10C9D00000200000004000000000000000000000F7 -:10C9E000000000040000000400000000000100003E -:10C9F00000000000000000000000004000040000F3 -:10CA0000208801000120C102000000000000000198 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000002000000001000000000000000000D5 -:10CA4000000140018401000100000000840000009A -:10CA50000000000040000000000000000000000096 -:10CA60000000000000004000000000000000000086 -:10CA70000000000000000000000040000000040072 -:10CA8000A00082008821000100C100000000000019 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000020000000000000074 -:10CAC00000002010001000084011050000000000C8 -:10CAD0000000400000000000000000000000000016 -:10CAE0000000000005000000000000000000000041 -:10CAF00000000000000000000000000080000000B6 -:10CB00008000000000008003002105C0000002003A -:10CB100040000000000000000000000000000000D5 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB4000000000000011009000800010000800218B -:10CB500000000000000000020000000000000000D3 -:10CB600000000000000000000011000000000010A4 -:10CB700000000000000000000000000000000000B5 -:10CB8000000000000000838080084011C0052100E3 -:10CB90000400100020000000000000000000000061 -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC00000000000000000890020000200010000B9 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000001000000000000000000000000000034 -:10CC00009000C00020000200200402A190A1880131 -:10CC10000100010000000100000000000000000011 -:10CC20000000000000000000000000000000000004 -:10CC30000000000000000000000000E00000000014 -:10CC40000000000000000000004200E007000000BB -:10CC500000000000070000000000000007000000C6 -:10CC600000000000000000000000000000000700BD -:10CC70000000810000E00000000000000000000053 -:10CC8000000000000000000000000041000007005C -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD000000000000069F42420000000000000000FA -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD8000000000000000069FDBDB00000000000048 -:10CD900000016666F0F000000000000000000000E6 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000B3B0838000000000000000006C -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000FF990099000071 -:10CE9000000000C3C3C30000000000000000000049 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED000000000000000BFBC8F8C000000000000BC -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF0000000000000000000000000000F0C3F0C3BB -:10CF10000000000000C300003C3C6666000000000A -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF40000000000000610007000D0000000000006C -:10CF50000000000005610A2F050D00A105000A0868 -:10CF6000050000A005000A08050000A00000000060 -:10CF700000000000000005000A08050000A0006194 -:10CF80000007800F0000000000000000000000000B -:10CF90003000000000008061202E004D000800617C -:10CFA0000006000D0000000000000000000000006E -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD000000000000000000000002C2FECEF00001B -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D01000000000000000000000008080000A000006 -:10D02000FFC30F030000000000000000000000002C -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D050000000000000000000000000002023E0E3CA -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000008080000090 -:10D0A00000000F030F03000000000000000000005C -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000CF0C75 -:10D0E0001414000000000000000000000000000018 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D16000CF0CD7D700000000000000000000000036 -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000001000000000000010000000000007D -:10D1B000000000000000850085000100010800005B -:10D1C00000800000200020400500400041002100B8 -:10D1D00004008300040088000400000004100480A0 -:10D1E000000004020410020020804000C020200043 -:10D1F0002000200002000003040088008800400096 -:10D200002020040020000400880020008803200063 -:10D21000200000004000000000002000040020006A -:10D220000000000000000000000000002000C0001E -:10D2300000000000000000000400040004A004A09E -:10D24000000000200000000000002000000020027C -:10D2500004008000040080000000800000008001C5 -:10D260000004000000010001000000200000200177 -:10D27000000000004000000000000000000000006E -:10D2800000000001400000008000000000000000DD -:10D29000000000000082000000000000000000000C -:10D2A000000000000000000000000000000000007E -:10D2B00000820000000000000000000900000000E3 -:10D2C00000410041000000000200200000040004B2 -:10D2D000000400000000008000800000000000004A -:10D2E0000100000000000000000000000009000034 -:10D2F00000800000000000000000000000000000AE -:10D300000000000002200120012000200200000097 -:10D31000000000000200000000000100000000000A -:10D3200000000000004000030000000000000003B7 -:10D3300000000000000000000000000300000000EA -:10D34000050000000000000000080010C0000001FF -:10D3500000010005000000000002001000000000B5 -:10D3600000004002400040824010400009000000E0 -:10D370000000050404000000090020000000200057 -:10D380000000000000000001040104010001000091 -:10D39000000000000000000000000000200000006D -:10D3A0000000000000000000000020000000050058 -:10D3B00000000000050020000000000000820005C1 -:10D3C0000000000300100200001100000000000037 -:10D3D000000000004008C011000900000100080022 -:10D3E00000000000880000002000200000820000F3 -:10D3F000000000000000000000000000000000002D -:10D4000000000011002100020000000200000000E6 -:10D41000000010001040100000000000000000009C -:10D42000000000000002000200020002002182024F -:10D4300000020104000200000100010021020102BB -:10D4400000000000000000010000000000000000DB -:10D450000000080000008000000000000000020042 -:10D460002100000000000000000080008000000596 -:10D47000000003A000000000030000000000000006 -:10D48000000000000000000000000000000100009B -:10D49000210000000000000100000000000000006A -:10D4A0000800100041000300000008000800000010 -:10D4B000000000002001000000001000100090405B -:10D4C0001000820082850000011182000011C0045A -:10D4D00000800400080000000800828088040080AA -:10D4E0004004040408020220820004000400040036 -:10D4F00009800800A00008000000A00082000000D1 -:10D500009020000082110800C00008008400400044 -:10D510004000C00000000000C00400002004011111 -:10D520002100C000010000200100101100041000C3 -:10D530001000080008004000C0400000100020005B -:10D540000800A00005C0052021844004000011024D -:10D55000020020024000030000002000200400011F -:10D5600041048001A1404000000120008000000033 -:10D570008904042000204020210000000000030056 -:10D580000000050000000000000000000000000096 -:10D5900000000000000000000000000005009001F5 -:10D5A0002000A000410004000585040009000301DB -:10D5B000002000A0008200000000410000000900DF -:10D5C00000001100000040020011084140A182004B -:10D5D000000800000000A00010200080A0048220AD -:10D5E000200020000000000001000020902000002A -:10D5F0002000000400000000040000000000A00063 -:10D600000020000082000000A000000090009000B8 -:10D6100000000000000008000804A00084000000D2 -:10D62000000000400800C0080000000900090002D6 -:10D6300000000000A000820000000800C00290006E -:10D6400010800100A008010000000000000080021E -:10D650000000000000000000008400000004000042 -:10D6600000018000800000000000040000010001B3 -:10D6700003008004050105840000800000002000F4 -:10D68000000000000000000000000000000000009A -:10D690000000000000000000000008000000000082 -:10D6A00000000000000000000000080000A00000D2 -:10D6B0000008000040000884030000000000000093 -:10D6C000008280042000000020000020080584095A -:10D6D0000920084000400040400000000800000011 -:10D6E00020200240900004020000A02082002009B7 -:10D6F00040000000040940200011024000400000EA -:10D700000002842000210011000000002000000021 -:10D7100084004000100084001000100010008200FF -:10D7200008008209110009210100110000A1000078 -:10D7300008A100822020002084000000A000C0007A -:10D74000C0400800080020009000000040010000D8 -:10D7500010104001000000040000800002020000E0 -:10D7600008000000110000008000000010010040CF -:10D770000000020003008900090100000000000011 -:10D780000000000000000400000000000000000491 -:10D7900000004002410021000000000000000000E5 -:10D7A000000000000000908210001020108821204E -:10D7B00000004120002080000500030000A00000C0 -:10D7C00000004100030008020004210000000000E6 -:10D7D000010004000000C0400102840002020100B8 -:10D7E000000040000000A040909082040290119040 -:10D7F000000200200890A0409008022082A0C0A053 -:10D80000000400840410000000000000000000007C -:10D810000000000000000000A00100010000040062 -:10D8200082880082000282044082C0A00102C021DE -:10D8300000000000000000000000000000000000E8 -:10D84000000000000000000000010000880100004E -:10D850000000410000000000C00040000000808087 -:10D860001100100088000000C000A10083000080AB -:10D8700090000080000080004000A18085008000B2 -:10D8800080800000400000800000000000000000D8 -:10D8900000000000000000000000401000200021F7 -:10D8A0008040000000000000008000000000030035 -:10D8B0000002000000000000000000000000200046 -:10D8C00000000000000005000000004105400920A4 -:10D8D00000000000808000000000000000210080A7 -:10D8E00000000009000000090000110410A1C1029D -:10D8F000A0800000802180A10000910510A1C1043A -:10D900002080800080108000008000000000000067 -:10D910000000000000000000000000000080000087 -:10D92000801180090005809100800080800580C002 -:10D930002005808000000080000000800040000082 -:10D9400000000000000000000003000003000400CD -:10D95000200041004000020404009040400002A06A -:10D9600010A0900000000000000000004101010430 -:10D97000A0A103040800404088090482A10090048B -:10D98000A005400408008201A088889000000000E3 -:10D990000000000000000000000000000000204027 -:10D9A0008208A0000220A00008C0A00488C002A035 -:10D9B00002C0824010C0000000040000000400010A -:10D9C0000000000000000000000000000000000057 -:10D9D00001000100010001000000400000010011F1 -:10D9E00000090088051100004000000001019105B8 -:10D9F000040810091008A09000048404A190884134 -:10DA000004888420028808900008000202020000B6 -:10DA10000000000000000000000000000000000006 -:10DA20000002012041820090831000A0C01010026B -:10DA300089100482C0090208000000008200000072 -:10DA40000000000000000000000082000000000054 -:10DA50000000000100010001020400090020200470 -:10DA6000008400040005A104004000110003040824 -:10DA70000408800800C00503050000A08080400065 -:10DA80000510804000088520800000800000C00054 -:10DA90000000000000000000000000000000000086 -:10DAA000000005800900C0000000C1000000808067 -:10DAB00000004100800080A00580090000000000F7 -:10DAC0000000000000000000000000000000000056 -:10DAD00000000010000440200041000500C000804C -:10DAE00000008002000500808000000000000000AF -:10DAF00000000091804000008020000080880080AD -:10DB0000800000890090000000200002002000003A -:10DB10000000000000000000000000000000000005 -:10DB200000000000214040030540200080088000E4 -:10DB30000000000080020000008080000002002140 -:10DB400000000000000000000000000000000000D5 -:10DB500000000000418020004000404100000083A0 -:10DB600000020000020188044010080000000000CC -:10DB7000000000009008200090889000C00008A1DC -:10DB800090021000829020A0042082000801080565 -:10DB900090C0100000000000000000000000000025 -:10DBA000000000000000010001A000A0010004002E -:10DBB000201010A0880008008810404010000001CC -:10DBC0000000000000000000000000000000000055 -:10DBD00000000000000001040100000000010081BD -:10DBE00000000700420000810000070084000000E0 -:10DBF00000E000000000000000E00700000000005E -:10DC0000000007000000818100E007000000818122 -:10DC100000E00700420000000000000000000000DB -:10DC200000000000000000000041000007000000AC -:10DC30000000000000004842000000E000004842F0 -:10DC40000000000007000000000000E000000000ED -:10DC5000820002E000000000600000E00002000618 -:10DC60000000000000000000C3C300AA00F00FFF86 -:10DC70000000000000000000F0F03C3C0AFAFCFC50 -:10DC8000CFCFC0C0B2B2C3FFC3FFC3004D3C4D00F5 -:10DC90000C0C0C0C0000FF00000000000000000055 -:10DCA0000000000000000000000000000000000074 -:10DCB000000000090060001100220410082000008C -:10DCC0001122000000000000000000000000000021 -:10DCD0000000000000000000000000000000000044 -:10DCE00000000000000000000000C3C3F0AAACACBC -:10DCF000ACAC000000000000000000FFAAAA0AFA75 -:10DD00000C0C5F505F50B2B2003C0F550F554DFFE9 -:10DD10004DC30C0C1C0C0000FF4000000000000074 -:10DD200000000000000000000000000000000000F3 -:10DD30000100000009006000110022000140028083 -:10DD400011220000000000000000000000000000A0 -:10DD500000000000000000000000000000000000C3 -:10DD600000000000000000002828EBEB41417D414D -:10DD70007F7C4F4C0000000000000000FF0F3C556E -:10DD8000FF00FF00CF0CD7D741417D7DC0C00AFA0C -:10DD90000A0AFAFA00000000C0C041C000000000FA -:10DDA0000000000000000000000000000000000073 -:10DDB00000000000000004080102069000000410AA -:10DDC0000820240081000000000000000000000086 -:10DDD0000000000000000000000000000000000043 -:10DDE00000000000000000000000C0FCC0FC414139 -:10DDF0007D41737043400000000000000000000FF0 -:10DE00003C550000C3C3CF0C1414033F033FCFCFD6 -:10DE10000AFAC0CFC0CF9E92AAAAC0C003C0000019 -:10DE200000000000000000000000000000000000F2 -:10DE300000000000000080001020408000000690DC -:10DE4000014002800024008100000000000000006A -:10DE500000000000000000000000000000000000C2 -:10DE6000000000000000000005610A2E050D00A062 -:10DE700000610E2E000D000000610007000D000083 -:10DE800005614A0F050D00A085610A0E050D00A071 -:10DE900005610A2F850D00A00061002F800D000094 -:10DEA0000000000000000000000000000000000072 -:10DEB000000005610A2E050D00A1600000000000B1 -:10DEC000100000000007000C080005000A0805000B -:10DED00000A000610007000D000000610007800D38 -:10DEE00000000000000180020000000000000000AF -:10DEF000000000000000000400000000000030BE30 -:10DF0000F3BE00000000CFCFC0C0000000000F0F24 -:10DF10000F0F000000003C3C00FF0000000000006C -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000000000000E1 -:10DF4000000000000000555500FF00000000000028 -:10DF500000000000000000000000000000000000C1 -:10DF600000000000000F003C3AFFFF00000000002E -:10DF70000000001000000000000000000000000091 -:10DF80003082F382000000005F505F50000000000C -:10DF90000F0F0F0F00000000AAAAF0F00000000011 -:10DFA0000000000000000000000000000000000071 -:10DFB00000000000000000800000000000000000E1 -:10DFC0000000000000000000555500FF00000000A8 -:10DFD0000000000000000000000000000000000041 -:10DFE000000000000000000F003C3AFF00000000AD -:10DFF0000000000000000000000000000000000021 -:10E00000000000000000000000000F3AFF3A00008E -:10E01000000000000000000000000055C30F0000D9 -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 -:10E04000000000000000000000003C3C00FF000059 -:10E0500000000000000000000000000000000000C0 -:10E060000000000000000000F000F0F03C00AFFFF6 -:10E0700000000000000000000000000000000000A0 -:10E08000000000000000000000000000003AF03A2C -:10E09000000000000000000000000000FF55C30F5A -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000040000020 -:10E0C0000000000000000000000000003C3C00FFD9 -:10E0D0000000000000000000000000000000000040 -:10E0E00000000000000000000000F00000003C0004 -:10E0F000A0FF000000000000000000000000000081 -:10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000000000FF -:10E1200000000000000000000000000000000000EF -:10E1300000000000000000000000000000000000DF -:10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000000BF -:10E1600000000000000000000000000000000000AF -:10E170000000000004000400210084004100200091 -:10E180002000840004000400040004004000880013 -:10E1900088008800040804000402210041004100B6 -:10E1A00021040000200004042000200004000400DA -:10E1B000040020000003210088002100020000006C -:10E1C0000400000088040400200000000400000097 -:10E1D00000000000000020002000200021000000BE -:10E1E0002000000082080000200000008200008063 -:10E1F000C0808480001080C08000040000002000E7 -:10E20000000000040000800080008000800000000A -:10E210000000000000048001800084012000040050 -:10E2200004000400000400004001400005008000DC -:10E230008000800000040000020000000400840050 -:10E2400000000000000000000000000000000000CE -:10E25000000000000000000080008000800020001E -:10E2600000000000000000040000000000000000AA -:10E270000020002000200005000002040000030927 -:10E280000108014085000300820002800040001068 -:10E290002000200008002000000000000000031003 -:10E2A00020000100010020800000008008A0000480 -:10E2B00000000200000001000000020002800200D5 -:10E2C0000200020002000200020000000200000042 -:10E2D00000100200000000000080000400040004A0 -:10E2E000028000000000000000800200000000002A -:10E2F0000000002000200080040500000011400004 -:10E3000020880440040004000404000005400004C8 -:10E3100000A1800080000000A084200002081100FD -:10E320000401A008200020008010000009208011B6 -:10E330004005040009000200040000000000201055 -:10E340000000040000100000008400102000000005 -:10E3500000000000000000000300000200010001B6 -:10E3600000010004000000000000000200000000A6 -:10E3700000000000000100090020800000000041B2 -:10E38000202100000010000000000000000000003C -:10E3900000080000008000000121000000100003C0 -:10E3A0000000000000000000A0210108000088001B -:10E3B0000010010000000040000300000000010008 -:10E3C0000100000000080000000000000000000044 -:10E3D000000000000000000000000008000000082D -:10E3E0000008400000050021000300050021002175 -:10E3F00000050000000200210005000801A1000046 -:10E40000000880000000000800000000000000007C -:10E410000008000000082120410004000000000066 -:10E42000000005C0411040000000000004001084FE -:10E4300000820001200000000000114000200000C8 -:10E440000400040000000800000000004100410832 -:10E45000000000002100100000A008A000A000A003 -:10E4600000A008A0030000000000000000080882CF -:10E4700000020008000000A12108000821A02020BF -:10E480000000200200090080000020002004090094 -:10E49000A041829040410809404100021004A08937 -:10E4A000C00408050102000000020800008082028A -:10E4B000C180080021808400080008000803C00013 -:10E4C000000000000100040000008210820008002B -:10E4D000C000A000A000C00001000000C009820030 -:10E4E000A000880040008200C00000000000200062 -:10E4F0000000000004008200090004000000040283 -:10E50000000020049182080011042120A100C10014 -:10E510002004000021400500C0000500100010018B -:10E520004020030100002090410003084100051035 -:10E530000000042021000404000002000084000008 -:10E5400000000000000008000000080008000800AB -:10E550000000000000001000030008000800000098 -:10E560000020000000000000210000904082000018 -:10E5700040000084000000A010A0200000080484D7 -:10E58000000811082000000000040400000800003A -:10E590000000C00000000000080090000820A080DB -:10E5A000A0201100200020008200C0008208C000CE -:10E5B000002008050804000000000000000310000F -:10E5C000000000000000C0000103008004828210EF -:10E5D00000008200A00084001000080000009011DC -:10E5E00082118400C0000000C0050811A003C00013 -:10E5F00000008208000400080008000800A10000D4 -:10E600000000000800888000100010018000000059 -:10E6100021001004000800A0000000000000080114 -:10E620000020080504908000800005A041C005047A -:10E6300000A000854000C0010000400410840000DC -:10E64000000000000000000000000800002080031F -:10E65000000000004100050000A000A0000000A094 -:10E660000000000800840000000000000088000294 -:10E670000000000000000000000000000000000496 -:10E680000000000000000004088008030409822044 -:10E69000820084008820040008200821C0000800AF -:10E6A000000008001000840000020080080400023E -:10E6B0000041402082088509200021032002012119 -:10E6C000A010A000A000000800000020000390009F -:10E6D000400008000804040000000000C0008200A0 -:10E6E00008009000C000080008000808100808058D -:10E6F000400584089005002140050808002182217A -:10E7000000080008882140210000030400004100A7 -:10E71000419005080000054005000000009000023F -:10E720004000080000000000000000040004000198 -:10E73000030100080000000004008300840080043E -:10E7400004000088008400000000000000000902AE -:10E750001100880000000000210000880000050072 -:10E76000000000000000110000000090090000906F -:10E770000000800200A040820408038203A00084FD -:10E780000484210000000008409004040000000000 -:10E790000000000000000000000000000000000079 -:10E7A00000000000000090000000000000000500D4 -:10E7B0008200000091009000000002000200900022 -:10E7C0000100020000000000000000000000004006 -:10E7D0000008404000C000000000000000000000F1 -:10E7E00000000000000040C0000889102002828262 -:10E7F00000088204A01008100002882040029082C5 -:10E800000140A088882000000000000000000000F7 -:10E8100000000200000000000000020000000000F4 -:10E8200000001100000011008000020000004020E4 -:10E83000A110C109000304008000020080008000D4 -:10E840000000030080000000000000000000000045 -:10E85000400009808000000000000000000000006F -:10E86000200000000000000003004180A000000024 -:10E8700009800500400000000080030080000000C7 -:10E880000000100040000000000000000500000033 -:10E890000004000000050000000900000005000061 -:10E8A00000000000000000800003000000410000A4 -:10E8B0001009A00003054110802000000004800022 -:10E8C0000020008000050080000000000000000023 -:10E8D00000000000008000000000000000000000B8 -:10E8E00000000000800080008000100040A110A007 -:10E8F000A080114083A021900380900510C0088063 -:10E900009080100003912000A08080000000800013 -:10E910008000000100400000002000000082000094 -:10E920000040080090208200820400010082000064 -:10E93000008211201040A00085090201908204018C -:10E94000822000000004000000040000008200009B -:10E9500000400000000000040000008200000000F1 -:10E96000000000009000020040001000200089C05C -:10E97000080509C0C00020C0020308C009000983BF -:10E98000410409C0110010C0A08802C00800208402 -:10E9900008001020010020000800010001004000D4 -:10E9A0004000000000000000400000000000C00027 -:10E9B0008400010000010901840000010020A01072 -:10E9C000404001A0004004840484002000000000B6 -:10E9D00082000000000020000091040040000000C0 -:10E9E0000000000000000000000000000000110313 -:10E9F00000C0C011028389044021C0858804A0039F -:10EA00000008C041081089020004C0090241010049 -:10EA10000000200001004100000080000200020010 -:10EA20000000000005002000000080000000090038 -:10EA30008000000041000321881010200520040000 -:10EA40000080008004002000800080000500090094 -:10EA50000000000000000000052000208040004071 -:10EA600000000000000000000000000000000000A6 -:10EA7000C120000480A1809041A000908021200549 -:10EA80004120008580A10085410800C080A10510BB -:10EA9000040000000000040000000011000000005D -:10EAA00000000009000000000020000200800000BB -:10EAB0000000000800090080038004110380110990 -:10EAC00000110089000000000000000300000000A9 -:10EAD000000000090000000000000000001100001C -:10EAE0000000000000000000000000000080008026 -:10EAF0000000800880050000000200820000800005 -:10EB0000000280C08080808000008089009080802A -:10EB10008003001000C000000000000000000000A2 -:10EB200000000000000000000000000100C0000420 -:10EB30000000000000000000000801840120000225 -:10EB40000000000100020090000000000000000032 -:10EB50002000000000000000000000000000000095 -:10EB60000000000000000000000000000000001095 -:10EB70000002000008402002024010011010200492 -:10EB80000888100004C0040208108800040420094A -:10EB9000408210010001002000900000000000E011 -:10EBA00007006000000000E0070000000000000017 -:10EBB00007000000000000E007008206000000E0FF -:10EBC00007000000004100E007000000000000E036 -:10EBD0000700000000000000070000000000000027 -:10EBE000000007000000000000000000000000001E -:10EBF000000000000000000000000000484250003B -:10EC000000E00000484200000000000041425000C7 -:10EC100000E000004842000A00E007000000000099 -:10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000000000000000D4 -:10EC4000000000000000000000008181033FC3C3FA -:10EC5000C3C3000008000000000000000000000026 -:10EC6000000000000F0F0F0F000000000000000068 -:10EC700000000000000000002004100828004100EF -:10EC80002800002820401080A000050020401080AF -:10EC9000A00500002200002200000000000000008B -:10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 -:10ECC000000000000000000000000000BDBD033F88 -:10ECD000C3C3C3C300000000000000000000000028 -:10ECE0000000000000000F0F0F0F000000000000E8 -:10ECF0000000000000000000000040028001002829 -:10ED00000041410000410402080100A00005040286 -:10ED100008010000A0051100001100000000000023 -:10ED200000000000000000000000000000000000E3 -:10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000000083 -:10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000000000000053 -:10EDC0000000000000000000006699FF0000000045 -:10EDD0000E6E9EFE0000000000000000000000001B -:10EDE0000000000000000000000000000000000023 -:10EDF0000000000000000000000000000000000013 -:10EE0000A0050000884410082004440000441008B5 -:10EE100020044020020410200804102008040000F0 -:10EE20000000F303F30300000000000000000000F6 -:10EE300000000000000000000000000400000000CE -:10EE4000000000000000000000001E1E1E1E00004A -:10EE50000000086898F800000000000000000000B2 -:10EE600000000000000000000000000100000000A1 -:10EE70000000000000000000000000008000000012 -:10EE8000A00500008844000080014002880000883E -:10EE90008001400280100108804001028040010290 -:10EEA00000000000F9F9090905610A0F050D00A02D -:10EEB00005610A0F050D00A005000A08050000A164 -:10EEC00005610A0F050D00A005610A0F050D00A0E0 -:10EED00005610A2F050D00A005610A0F050D00A0B0 -:10EEE00005000A08050000A0000005614A0E051D86 -:10EEF00000A0000000000000000000000000000072 -:10EF0000000060610006000D100000610007800D28 -:10EF1000080060610006000D100000610007800D10 -:10EF2000280005610A2F050D00A000000000000068 -:10EF300000000000000000000000000000000000D1 -:10EF4000000000000000000000007F752F2530FA4F -:10EF50003FFA000000000000000000000000000078 -:10EF600000000000000000000000000000000000A1 -:10EF70000008000000000000000000000000000089 -:10EF80000000000000000000AAAAAAAA00000000D9 -:10EF900000000000000000005500550000000000C7 -:10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC0000000000000000000000000007A702A200D -:10EFD000300A3F0A000000000000000000000000AE -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F0000000000000000000000000AAA8AAAA00005A -:10F010000000000100000000000055005700000043 -:10F0200000000001000000000000000000000000DF -:10F0300000000000000000000000000000000000D0 -:10F040000000000000000000000000000000D714D5 -:10F05000CFCF7D3C404000000000000000000000D9 -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F0900000000000000000000000000000FC00FF75 -:10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000000050 -:10F0C0000000000000000000000000000000000040 -:10F0D000D7140C0C4100404000000000000000006C -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000400FB -:10F11000000000000000020000000000000000FFEE -:10F1200000FF0000000001000000000000000000DF -:10F1300000008400200000002010040004000400EF -:10F140000400000088008400400303002100210027 -:10F1500020000400000004008402200020002100A0 -:10F1600020000400000004004000210020002100D5 -:10F17000210000030000890089008900040040008C -:10F1800088004000100020801000110000000000E6 -:10F190000000C0000400040088000400000088098A -:10F1A000000040002000200020002000200010006F -:10F1B00010001000200089000400840180008000FD -:10F1C0008000800020000000000080008400820099 -:10F1D0008200A00000000000830000010000000089 -:10F1E00020000000800000008000040020000900D2 -:10F1F0002000200000000400040004000400C000FF -:10F2000000000400040084008008800084000000E6 -:10F210000400040000008000800000008000200046 -:10F22000000000000000000000000000000080005E -:10F2300080008000800001000200010000800100C9 -:10F240002000000000800100000001000000030019 -:10F250000100000001800000031000000200010016 -:10F260000000008001000200010000000100000019 -:10F27000000000000000000000000080000000000E -:10F2800002200080008000000000010082000000D9 -:10F2900008000000000000000000008000800080E6 -:10F2A00000800000000000000000000000000000DE -:10F2B0000000000000000000200009000408000217 -:10F2C0002040820005000002040000000400050048 -:10F2D00020080400028404022000200800404100AD -:10F2E0002008098409102000008404002084040000 -:10F2F00000100410001000100000000000200000AA -:10F3000000082009202020200000208404000000A4 -:10F3100000000000000000000000000800200020A5 -:10F32000002000022000000000000000000000009B -:10F33000000000000000000020008200000801031F -:10F34000014100080000C008002100080011100859 -:10F350000003040000088208000882210000010068 -:10F360000003000500089041900000034000904019 -:10F370000000000300030005002100000020000041 -:10F38000000800020000A000000000200000A00013 -:10F3900001000000000000000000008000200000CC -:10F3A0000000000000000800000000000000000055 -:10F3B00000000000004100210000000903000800D7 -:10F3C00020000200210021002100000011000000A7 -:10F3D000000010000300050003000000030000000F -:10F3E000040003082182000000A003000500800043 -:10F3F00000010000410000000000000000000001CA -:10F4000000000000210103002000000000010900AD -:10F41000000004000800020010004000100241013A -:10F42000000405000084008400000304038400003D -:10F430002100030003A01108000000000000830069 -:10F4400021108510010082820000C00200808240ED -:10F45000C1050800100082000200040040400000C6 -:10F46000A0204021822083002111020240080010C8 -:10F47000A0008200820004002000040000000000C0 -:10F4800004009004200004801000402001000900C6 -:10F49000410040002040C100080082000800080030 -:10F4A0000000200008000800000082008400010025 -:10F4B00000009000000000000100010005000100B4 -:10F4C000040004042000040004400090040004042C -:10F4D0000340048441000000030000048300110580 -:10F4E0000000080103004001100090000088210185 -:10F4F00021014100008803000300C000090003202F -:10F500000000A00041098000080400000001040080 -:10F51000040020000000880020000000000000001F -:10F520000000000000000000000000880000210032 -:10F53000200000000000000000001000200020005B -:10F5400020002000820000000803000020082004A2 -:10F550008211902108008203002182000021820490 -:10F56000080020418200208008001041100010088F -:10F570008205010008000000080200000011C080A0 -:10F5800000030000200800000020202008020000E6 -:10F59000C000C0000080000000000000080008005B -:10F5A0000000820084000800C000820000001000FB -:10F5B0000880088000008241000000110103000063 -:10F5C0008200904100000000000000000000800068 -:10F5D0008000000021000000000000C000000000CA -:10F5E0000000000083000000830405008300800009 -:10F5F000A000400008000000000000000000000023 -:10F6000000040000000088000000000180010000EC -:10F6100000000000000000200000000008000300BF -:10F6200010100500000021C008100500000840A0CF -:10F630000000084008020588100821042184040005 -:10F64000000003000000040004041000A0020200F7 -:10F650000011000908900200100000200980A0009D -:10F66000080300000000A100209100000900020032 -:10F67000101102000000000800000000002100023C -:10F6800040110002200400000000108088040000E7 -:10F6900004008202000000000000000000000000E2 -:10F6A00020008204000010004000840004002000BC -:10F6B00082009000900004100041A0002000004152 -:10F6C0000008000090118805000008851100001056 -:10F6D000020020C02000100500000384110040201B -:10F6E0000300000003C0110004C0850209002000CF -:10F6F00041020000000000001000030000000000B4 -:10F70000000000900300A0000000000000040801B9 -:10F7100000000000000000000000000000000000E9 -:10F720000000000000000000000000000000800059 -:10F730000000000000000000000000000000008841 -:10F7400000000000000000004000A1C0A089830369 -:10F75000A002900003010300820000000000C0002E -:10F760000000000000009000000001019000050072 -:10F7700000000200C000010002001102400200214E -:10F780000209000000000100000000000100080064 -:10F790001100000000000000000000000001000057 -:10F7A0004100000000000100820000008200000013 -:10F7B0000000C00090A14002098802100802001059 -:10F7C0000008C008010100008200000091058320AC -:10F7D00088200085804021088210800500004000BC -:10F7E000000000000000090011000000114103109A -:10F7F00020410003800000000300000320880089EE -:10F8000000218008000000004000000000001100FE -:10F81000A10083000000000000000000000005417E -:10F82000032184040000000002000000000000002A -:10F8300000000000800000042091032080820080EE -:10F840000080008000801041052005200000850315 -:10F850001091C105051040031100910985050000B4 -:10F860000000000000800020008000020000400531 -:10F8700003002002090300080300000800000080C4 -:10F8800000820080009100080000001000000000CD -:10F890000004000000400080000000800000000024 -:10F8A0000580080040004100200010000800020010 -:10F8B0000000000080000080100008880200108016 -:10F8C0008000008480800080080005004100410025 -:10F8D000888800040210A090024010080400040868 -:10F8E0000000008200000004900000040001008875 -:10F8F000002000820001010900000000000000005B -:10F9000000C00021000200C0000000000000000054 -:10F91000000000010008000000C00000000400001A -:10F92000008200040088000001880100010000003E -:10F93000010004008440A000C004050020C1039021 -:10F9400021C0080008C01002C0C000200000000054 -:10F9500001009041410982080509014140030291DB -:10F960000111010000018401000188008288080063 -:10F97000000101008400900100000040900300405D -:10F980000182900400A0080420080000200000006C -:10F990000100000001000401C0000001010000009E -:10F9A00004000000010000008400010100000000CC -:10F9B00000010001002000208402008805C101C070 -:10F9C000C083C082838800C0C08202A00101000001 -:10F9D00004000001042140054183848541212082E7 -:10F9E000A02102A002050010802003400340002156 -:10F9F000000305200211030841214020000000857A -:10FA00000080080009802080C18003800000800001 -:10FA10000000100000002020801000084008400076 -:10FA20000000800000002040200080001041000005 -:10FA30000021002100084000000080800300C10870 -:10FA40002003902105A041000000800080004011AB -:10FA500041040004004105081009882185080800B8 -:10FA600008C002004003000000090000000000027E -:10FA700000110000000041841109080940850002BE -:10FA800005000000000021088804020010000008A2 -:10FA90000000000000000000000200210000000043 -:10FAA0000000000200000000414003094000000087 -:10FAB0000040000000000010004000050000008031 -:10FAC000008000840000001080038000000000001F -:10FAD00041C0412120000008880203400241040186 -:10FAE00001A0000300100100000000000000000061 -:10FAF000000000000000880001A100000101009149 -:10FB0000000000000000000083018200A100C1008D -:10FB100000000000000000000000000100000000E4 -:10FB200000000000000100000000010000000000D3 -:10FB3000000000210000000000000001009000A073 -:10FB400000A00284080404C0100104002020042046 -:10FB500004000140000000000001000000E0070078 -:10FB60000000000000E00700410000000000070066 -:10FB70000000000000E007000000000000E00700B7 -:10FB80000000000000E0000000000000000007008E -:10FB9000820A000000E0000000000000500A00E0BF -:10FBA0000700000A000A000007000000810000E0D2 -:10FBB00007000000000000000000000000810000BD -:10FBC00007000006000000E00000484200000000BE -:10FBD00000004842500A00E007020000CDC10D01BC -:10FBE000E8E8E8E800000000C8F8CBFB00000000EF -:10FBF000000000003C3C0000F0F0000000000000AD -:10FC000000000000000000001414CF0C00000000F1 -:10FC100000000000000000000000000000000000E4 -:10FC200000000000000000000000000000000000D4 -:10FC300000000000000000000000000000000000C4 -:10FC40000000000000002400002404100820000030 -:10FC50000960028008200000000000000000FDF1A3 -:10FC60003D313C00FFC30000000008380B3B0000A2 -:10FC70000000000000003C3C0000F0F0000000002C -:10FC800000000000000000000000D7D7CF0C0000EB -:10FC90000010400000000000000000000000000014 -:10FCA0000000000000000000000000000000000054 -:10FCB0000000000000000000000000000000000044 -:10FCC000000000000100000081000081014002806E -:10FCD0000960000001400410000000000000000066 -:10FCE0007F3E6B2ABEFFBEAA00000000D2D200AA4F -:10FCF00000000000000000000000FFFF00003C3C8E -:10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000000000D3 -:10FD300000000000000000000000000000000000C3 -:10FD40000000000000000000000004011040060058 -:10FD500000060408102006900000000000000000CB -:10FD6000000057164302BEFFBEFF00000000D2D2C3 -:10FD700055FF00000000000000000000000000002F -:10FD80003C3C0000000000000000000000000000FB -:10FD900000000000008000000000000000000000E3 -:10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000000000000043 -:10FDC0000000000000000000000080000802208009 -:10FDD00090000090010240800000069000000000AA -:10FDE0000000000005614A0F051D00A005610A0F13 -:10FDF000051D00A005610A0E050D00A015612A0F62 -:10FE0000054D00A805610A0F050D00A000000007C0 -:10FE1000000C000085610A0E050D00A000610007BE -:10FE2000000D0000000005610A2F850D00A00500EF -:10FE30000A28050000A005000A09850000A000614D -:10FE40000006000D000005000A28050000A0606102 -:10FE50000007000D10000000000000000800051061 -:10FE6000002980020000B2B2003CF3050305828243 -:10FE7000D7D7878755000000000000002000000051 -:10FE8000000017173C0028EBC0C00000F50500007B -:10FE9000FF00F0F000000000000000000000000083 -:10FEA000000000000000000000000000F131C1016E -:10FEB00000000000000000000A0AAA0014145555B2 -:10FEC0000000000000000000000000000000000032 -:10FED0000000000000000000000000000000000022 -:10FEE000000F00553CFFAA00B2B2C3FFF3F503F5C3 -:10FEF000A0F5A0F58787FFAA000000000000000021 -:10FF0000000000001717FFC328EBFCFC0000F30300 -:10FF10000000FF00F0F00000008000000000000082 -:10FF20000000000000000000000000000000FD3D97 -:10FF3000CD0D00000000000000000A0AAA00141401 -:10FF400000000000000000050000000000000000AC -:10FF500000000000000000010000000000000000A0 -:10FF60000000000F0055F0FFAA00303082BE4D4D5A -:10FF70003C008282C0FC1717C30000000000000094 -:10FF800000000000000000000000282830F338F8CE -:10FF90003BFB00003C3CF0F00000000000000000D3 -:10FFA0000000000000000000000000000000000051 -:10FFB0000000000000000000000000000055000FDD -:10FFC00000C3C0C0000000000000000000000000EE -:10FFD0000000000040E04AEA0100000000000000CC -:10FFE00000000000AA000A0A0000FFFFF3F382BE2F -:10FFF0004D4DFFC3BEBEC0FC1717FF3C0000000004 -:020000040010EA -:10000000000000000000000000000000EBEB30F3F7 -:1000100008C80BCB00003C3CF0F0000000000002E0 -:1000200000000000000000000000000000000000D0 -:10003000000000000000000000000000000000556B -:10004000000F00C3C0C0000000000000010000005D -:1000500000000000000045E54FEF00000000000038 -:10006000000000000000AA000A0A3C3CA0AF2000EB -:1000700020008400200088000502844000048400E1 -:10008000200084008400840004000404041085001F -:10009000010085102100880002008800040420006F -:1000A000200020000400040020002004200400039D -:1000B0000000000020002010048004200020040420 -:1000C00020002000840084008400000000008404DC -:1000D00000000000000020000200000002000200FA -:1000E00000002000840000802000000000002002AA -:1000F0008000000000000000040020000201408495 -:1001000000000000000000000900090000000009D4 -:1001100004000400040004000000200000000000AF -:1001200000000000000000000000000000000000CF -:100130000000000004000000040100200001000194 -:1001400000020000040000000000000000000000A9 -:10015000000800000000090000000000000000008E -:10016000000000000000000000100000000000007F -:10017000000002002000010004000300030004004E -:100180000204000002000000821000004000000095 -:100190000280000020000088840200008800000027 -:1001A000840000000400000000002100050005009C -:1001B00001000000202003000200020000000200F5 -:1001C0000400008000000400008000200000000007 -:1001D000020000000000000000000000000000001D -:1001E000040000000000000000000000000000000B -:1001F000000000000400A0002008028804000400A1 -:1002000080000403020820000008090000008000AC -:10021000000000022008049000040009004000844F -:1002200000000000008220000008200020002000C4 -:1002300020002002000080092090008400100008A7 -:1002400000000000002000108010002000010000CD -:10025000000000000000000809000000000000107D -:10026000001000000000000000000000000000007E -:1002700000000000000440410000000000080008E9 -:100280000005000008000802000000000000002037 -:100290000000A000202000000008000382000400ED -:1002A000040000000421840800080203202100004B -:1002B00000090000004100000000000000000020D4 -:1002C000000000000000000000800000001000009E -:1002D00000008800820000000000A0000800C000AC -:1002E00082000800000000008200A0000000000062 -:1002F000000000000000000000082184400200828D -:100300000040004000880000038809A000A0000011 -:1003100011012000110083400000000000000000D7 -:100320008808A1002100C1000000008280008090A8 -:10033000080000000000008200000000000400002F -:100340000001000008000000000000204100410002 -:1003500010000300080041000000000041000800F8 -:100360002190030000000300050008000500088438 -:1003700008100000000000000000830004040011C9 -:10038000110484108202820409208804C004A0049D -:100390000404040020400804000000040004820457 -:1003A0009004210083004100110900000000820038 -:1003B000000082008200A004000000000000400055 -:1003C0008204A004090001000800000000000800E9 -:1003D0000800000008400000400000000400000089 -:1003E00000000200080002000000000002000000FF -:1003F000020082008200000000000000048840002B -:100400002020040108C11000024020010001030166 -:1004100000890041030003000000080020011101D1 -:100420000091001104000400048404000400000092 -:1004300010000000000000000000000000000000AC -:1004400000000001000104000400000000000000A2 -:100450000000000004000000000000000000000098 -:10046000000000000000000000000000000000008C -:100470000000000000000000000000000000000577 -:10048000040900000000008020002011000000008E -:10049000000088000000008000800080410083216F -:1004A0000000082100000000C011208000008880AA -:1004B0000080008082000011004100000000000068 -:1004C0000080000000200402000000000800080076 -:1004D0000000008001000880880000000800000083 -:1004E000000000000000000000000000000000000C -:1004F000000000000000000000800000000000007C -:1005000000A0A00841100210000490028090008812 -:10051000080041000000200000200420002004907A -:100520002000030000000088409000000020000828 -:100530000004000400040500000005001100210073 -:100540000000082000000001800000000000000002 -:10055000000000000020040021200990000000009D -:10056000000000C00500000000000000099003002A -:100570000810001000080000210000040000000026 -:1005800021C0000210410100000200210008020009 -:100590000000C000200908200800400040000100C1 -:1005A00084000000A02108000000840040000841F1 -:1005B000C00440004000042082000000000000044D -:1005C0004000000000000009000000004002000898 -:1005D00001000900000000000000000000002000F1 -:1005E00000000800000000000000000000000800FB -:1005F00000008400000000000000400000008200B5 -:1006000000090000009000C004200000410200002A -:100610000888050200000000000000000000080239 -:1006200004000000000000000000000000000000C6 -:1006300000000000000000000000020000000000B8 -:1006400000000000000000000000000000000004A6 -:100650000000040004000000000000000000000092 -:10066000000000000000000000000000000000008A -:10067000000000000000000000000000000000007A -:100680000000000000000000A000010000000100C8 -:100690000000010000000000000001000000C00494 -:1006A000910488A040A00001A00083010000000088 -:1006B000000000000000032000900010208810902F -:1006C000821001C0821000000000900001000000B4 -:1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000000000000000000000000FA -:1007000000000000000000000000000040000000A9 -:100710002000000040000000000000004000000039 -:10072000A0809080400080001002881084020009A0 -:10073000000000000000000091000000090000001F -:100740000000000004008000000011008000020092 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:100780000000000000000400000000200080004085 -:10079000008000200005009000800004000000049C -:1007A0000000000080098009801102202100024021 -:1007B00010040000000000000000000500A10085FA -:1007C00080808004808900C08080000000200000BC -:1007D00080410080000000000000000000000000D8 -:1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000000000000F9 -:1008000000000000004000000000000000000002A6 -:100810000000000400000090004100C00001000042 -:100820000001000082104040A0090411010200886C -:10083000010001880000004000000082100088C014 -:10084000909004C0040010C0900202C0000082001A -:10085000208282008204000000400000008200002C -:100860000040000000400000000000000000000008 -:100870000000000000000000000000000000000078 -:100880000000000000000001000000000000010066 -:1008900020000400000001004000200000000000D3 -:1008A0000400000000000803002090A111A1010035 -:1008B0008400110100010100000008000000A108EF -:1008C0000408C08891A0830890A0C0A02008000060 -:1008D0000000C000400000000000020040000000D6 -:1008E00000000000400000000000000000000000C8 -:1008F00000000000000000000000000000000000F8 -:100900000000000000000000000000008400000063 -:100910004100000080004000400000000000400056 -:10092000000000000000040040840011002084202A -:1009300020050321A0210502040000008000000022 -:1009400041008000800082004100000080004000E3 -:10095000000009008000000041004000800000000D -:100960000000050000000000000000000000000082 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 -:1009900000000000000400000000000080040000CF -:1009A00000000000000000000000202020A00280C5 -:1009B000100002A1084002000211000000400000E7 -:1009C00000008000800000000000000000800000A7 -:1009D00000000000000000A0000000000000000275 -:1009E00000000000000000080000000000000000FF -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 -:100A1000000000000000000000000000A00008002E -:100A2000A000A00000000000000000008901A1A0BB -:100A3000A140C10001C1010101000001000000014D -:100A40000000000002009020089008002000100420 -:100A50008808880000000000000800C000000000B6 -:100A60000001000000000000000000000000000085 -:100A70000000000000000000000000000000000076 -:100A800000000000000000000000009000000000D6 -:100A9000000000000000000000E0070082000000ED -:100AA00000E007000012000000E0000000008800E5 -:100AB00000E007008200000000E0070042000000A4 -:100AC000000007000000000000E0000048420000B5 -:100AD00000E0000048420000000000E00700820043 -:100AE00000000000070000000000000007000000F8 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B1000840000E000000000000000000000000071 -:100B20000000004000000000000000000000000085 -:100B3000FC6F0C6FF03C66FF00000000000000003E -:100B40000000000000000000A0050000A00000A0C0 -:100B500020100408284100000000000000000000F0 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000FC600C60F03C6600000000000000DB -:100BC000000000000000000000000000A00505007B -:100BD00000054080020100002841000000000000E4 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB00000000000000070737C7F0CCF0CCF0000A0 -:100CC000000000000000000000000000000000A084 -:100CD000000500A00005440000444020020400007C -:100CE00000000000C3FF4E4E0000000000000000A6 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D3000000000000000000040434C4F2424E7E77F -:100D400000000000000000000000000000000000A3 -:100D5000A0000500A00005008800008880100108A0 -:100D6000000000000000003C4E4E000000000000AB -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D9000000000000000FFFFFFFF00000000000057 -:100DA000000005610A0F050D00A085610A0F050D01 -:100DB00000A000610007000D000085610A0F850D8D -:100DC00000A005610A0F050D00A005000A08050036 -:100DD00000A060610007000D100000610007000D19 -:100DE0000800000005610A0F050D00A005000A08B3 -:100DF000050000A005000A08050000A00000000092 -:100E000000000000000000000000000000000000E2 -:100E10000000000000000000000000000065000766 -:100E2000800D000000000000000000000000000035 -:100E3000000000000000000000000000FF553C0F13 -:100E40000FC35500C0CFA0A01414CF0C00000000A9 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 -:100EB00000000000000000000000000000000055DD -:100EC0003C0F0FC355FFC0CFAFAFD7D7CF0C00003B -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000A0A03F3173C17002D -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC00000000000000000000000FAFA03F317FF21 -:100FD00017C3000000000000000000000000000037 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000004000000BC -:10103000042020000400000000092000200004809B -:1010400020002000000020000400820000000000BA -:101050000000000004000400000004000400000080 -:1010600020000000840020000400040000030000B1 -:101070000400040004002000820000002000200082 -:101080000000200000000000200000000000000020 -:101090000000000000200000000000000000000030 -:1010A00000000000000000002000000000008000A0 -:1010B00020000901090000000000000000000000FD -:1010C000000400000002000009000000000004000D -:1010D0000000000004040000000000000000000008 -:1010E00020000000000004000402000020000000B6 -:1010F00000000000000000000000200000000900C7 -:1011000000000000000000000000090000000500D1 -:1011100000000400000000000000000000000000CB -:1011200000000000000000000000040000000000BB -:101130000000000090008800000000800000020015 -:101140008200000000800000000004000000000990 -:10115000008000009000000000000000000000007F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000300000001006B -:1011800000000200000082000000020000000000D9 -:10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F -:1011B00000000000000041080004000000041100CD -:1011C0000000000000100504000000000000000006 -:1011D00000084104000000020000000000000400BC -:1011E000000000000000000004900010000000005B -:1011F00000080000000000000000000004000000E3 -:101200000400000000000000000000820000000058 -:1012100000000008000000000000000000000000C6 -:10122000000000000000000000000000000020009E -:101230000000000800008880C000850000802002B7 -:10124000A0002000000000000000000000000000DE -:10125000000008000080000008008200C0000000BC -:10126000C000C000820000008200A00040004000DA -:10127000000000000000000082000000820000006A -:1012800000000000000000008200000400000000D8 -:101290000000080000000000000008000000A0009E -:1012A000A00082000800820082000000C000A000B0 -:1012B00000000000000003000020080004000004FB -:1012C00080010002800008002104210003002108A1 -:1012D0000000004000840304000000040020088295 -:1012E0000000030008000000030400000240110495 -:1012F00021040800008800000088000200A000000F -:10130000000000000000004000000000000000009D -:1013100000000300000000000000000000000800C2 -:1013200000000800000000000000000000000000B5 -:10133000000000000000000000808200A011822058 -:10134000000082000041084104200120002040806C -:101350009000000088000000040220020400000049 -:10136000820001040400A000000008000000080042 -:10137000000000000000100000000000200000003D -:10138000000000800400000000A000000000000039 -:101390000000040004000400000004000800000035 -:1013A000000000000000000000000000000000003D -:1013B00000000000000000000000052011000900EE -:1013C0004091000000002000800040012002002128 -:1013D00000040000400000000000000000000000C9 -:1013E00000000000040480000000400040004000B5 -:1013F00040000000000000000000000000000000AD -:10140000000000000020000000000021000000009B -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:101430000000000000000000000000001008204034 -:1014400000A01005208500000100000000800000C1 -:1014500020000000000082000000A00008000480BE -:1014600020000480000000000000000008000000D0 -:101470000000000800000000000000000000000064 -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A0000000000000000800000000000000000034 -:1014B00000000000000000000000000000008000AC -:1014C0008000000580000804030020000084100450 -:1014D0000884800000000200034000C000040020D7 -:1014E0000004C1840804040041000000000002045C -:1014F000024003002190034020000004030200008A -:1015000000000000000000000000000000000000DB -:1015100000000000000000000800000000000800BB -:1015200000000000000000000300030000000800AD -:1015300000000000080000000000000000000000A3 -:10154000018411808591A1800000100040090020D5 -:101550002040010000202188000000090000000058 -:1015600000000000000020040100000000052080B1 -:10157000000004000009000000000000000000005E -:1015800000000000000000000000000000800000DB -:101590000000000200020000000000000000000047 -:1015A000000004000800000000000000000000002F -:1015B0000000080000000000000000000000000023 -:1015C0000000200990042008200809021190000062 -:1015D00011024000040400008420002000000000EC -:1015E00003004100000000000001040000040000AE -:1015F00000200504000000000000000000000302BD -:101600004100000000000000000005000000002074 -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:101640000000000000009000010000000000040104 -:101650000100000101002000000000000000000067 -:101660000000000000000000010000000000000079 -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A -:10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B000000000000000000000000000000000002A -:1016C0000000000000001100800040110000002018 -:1016D0008003020300401100800040000000000071 -:1016E00000000000000003000000040000000000F3 -:1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 -:10174000000000000000000000080000044100004C -:10175000008400008020008300040000000200805C -:101760000000000000000000000200000041000036 -:1017700000000000000000800000000000000000E9 -:101780000000000000000000000000000000000059 -:101790000000000000800000008000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C00000000000000000000000000100400100D7 -:1017D00000409003A000A0008205000100880001E5 -:1017E00000020000000000000000000100000000F6 -:1017F000000000000082000000C0000000000000A7 -:1018000000000000000000000000000000000000D8 -:101810000000000000000008000000C00000000000 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000C001D7 -:101850000400010000828300000000A0010040009D -:1018600020000000000000000000000000008200D6 -:1018700000000100010000008400000000000000E2 -:101880000000000000000000000000000000000058 -:101890000000000000000000000040000000000008 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000040014 -:1018D000804000004100000005000300400041007E -:1018E0000000800040000300000000000000000035 -:1018F00000000000020002000000000000000000E4 -:1019000000000000000000000000000000000000D7 -:10191000000000000000000009000000800000003E -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:1019500000000440000000802100400020802000A2 -:101960000000000400000000000000000000000073 -:101970000000000000000000000000040000000063 -:101980000000000000000000000000000000000057 -:1019900000000000000000000000002000400000E7 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000001000000009001000008000865 -:1019E00000000000000100000000000000000000F6 -:1019F00000000000000000000000000000010000E6 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000010001C4 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A500000000000000000E007008212000000E02B -:101A600000000000000000E007008200000000000D -:101A700000000000000000E0000000000000000086 -:101A8000070000120000000000000000000000003D -:101A90000000000000000000000000000000000046 -:101AA00000000700000A0000000000000000000025 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 -:101AE0000000C3C300000000000000000000000070 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B600000000000C3C300000000000000000000EF -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C600000000000000000000000800000000000F4 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD00000000000000000000000000000000500FF -:101CE0000A0F050C00A000610007000D000005614F -:101CF0000A0F050D00A000000000000000000061B8 -:101D00000007000D000005000A08050000A0000003 -:101D100000000000000000000000000000000000C3 -:101D2000000000000000000005000A08050000A0F7 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000FF00F0F00000000000000000000094 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000FF00F0F0000080000000000094 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000F0F00FF00000000000055 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000F0F00FF00000000D5 -:101EF00000200000000000000000000000000000C2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F600000000000000000000000040000008800E5 -:101F700020032000000400040000040004102000DE -:101F80000004001100000002000004000000200016 -:101F900000000000000400040000200002002000F7 -:101FA00000000000000000840001000004000000A8 -:101FB0000000000000000004000400000000000019 -:101FC00020000000000000000004000000000000ED -:101FD00000000000000000000004000000000000FD -:101FE00000000000000000000000000000000000F1 -:101FF00000008000800000000000000000000000E1 -:1020000000000001000000002000000000000900A6 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000002000000000000AE -:10203000000004000000000000000000000000009C -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:10206000000000000000000000000000000002006E -:102070000000020000410080820082000300030093 -:1020800001000400000082000000000004000009BC -:10209000000002000000010001000000000000003C -:1020A000000000000000000000000000000002002E -:1020B0000200020002100200020002000200000002 -:1020C000200000000000820000000000000000006E -:1020D00000000000004000000000000000000200BE -:1020E00000000000000000000000000000000000F0 -:1020F0002000000003100000040200000200200085 -:10210000200020000010040004080000000400006B -:10211000200000000000020020002000020000005B -:10212000040000002000400000400000000000000B -:102130000000200003002000000000000400000058 -:10214000000000000000000000000000000000008F -:10215000000020000000000000000000000000005F -:10216000000004000000200000000000000000400B -:10217000400000008200000000000000000000009D -:1021800000000009000400000000401020000805C5 -:102190000004842090000000900000000000000077 -:1021A00000002000200090009000900000008900B6 -:1021B000000020110000840000000011000900044C -:1021C00000000000000908000000000000000000FE -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F000000021000000210041002100000000003B -:1022000000C0000000000088000041000001000044 -:1022100000000000000100000000080000000000B5 -:1022200000000000000000000000000000000000AE -:102230002000000000020000000000900000008864 -:10224000000000000000000000000000000000008E -:102250000000000800000000000000000000000076 -:10226000000000000000000000000000000000006E -:1022700000000000000000040000012000048200B3 -:102280002020210004000000080200040000880053 -:1022900082400000820000048305040089000804D5 -:1022A00000009004822000000000000000000000F8 -:1022B000900000000000000000000000000400206A -:1022C000002000110020000000400000000000403D -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE -:1022F0000000000000000400100400002000002086 -:1023000008008300C0000088000000880001004031 -:1023100000400004004000000000200000002000F9 -:10232000800100000001000009000800000000001A -:10233000000000000000000000000000000000009D -:10234000000000200000000000000020000000004D -:10235000000000000000000000000000000000007D -:10236000000000000000000000000000000000006D -:10237000000000000000000020001000C0402011FC -:102380000040204040402004A000842100000004C0 -:10239000001100030000820000202000C020000087 -:1023A000C000A000A00084000000A0000200C00047 -:1023B00000002002000400110000000200020000E2 -:1023C00000110000000000000000000000000000FC -:1023D00000000000000000000000000000000000FD -:1023E00000000000000000000000000000000000ED -:1023F000000000000000000000009000000000004D -:1024000090000000000000010500000000840000B2 -:10241000000000000000000000000001800000013A -:10242000000000000000000000000010000080001C -:1024300000000002800000012000000000000002F7 -:10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C -:10247000000000000000000000000000C000C100DB -:102480000500A0118400000000008400000420006A -:10249000400420092000000200050000A1004000C7 -:1024A000C02000A0080008008211000004004002C3 -:1024B0000800820900000000000000000000000089 -:1024C00000210009000200200000002000000000A0 -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC -:102500002000200000000800080021404100119038 -:1025100005000000000080000000200004402000B2 -:102520000000000111050000000000000000000094 -:10253000000000000000000000001100000000008A -:1025400000C00000000000010000000003000400C3 -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000A010C008010282C0A00284400520820978 -:10259000088402840108100800A000040010000450 -:1025A000000000000000000000A00008014000083A -:1025B0004010000200909020109000080589401102 -:1025C0000000000001000800000000000000000002 -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB -:1026000000000080000004008000008905028209AB -:102610000020000000004000800000800080058055 -:1026200000800000000009000000008000804000E1 -:102630000080C000008000000000858321C084115C -:1026400000C0000000000300800000000000000047 -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:10267000000000000000000000000000000000005A -:102680000000000000400082804000800082008244 -:102690008008008300030083808380000003002003 -:1026A00000000000000800000008000000050040D5 -:1026B000001000008000008580830080208221823D -:1026C00083022085000008002000100008000000A0 -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F00000000000000000000000000000000000DA -:102700000000000000001000A0C11082C0C09011A5 -:1027100090C182A1A0C1020090C0081082100000E8 -:10272000000000000000000100840001008400009F -:10273000000100210000020002C0400440C040919E -:10274000A1C0100302C00000000000000100002032 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780000000000000000000C1104002C09082A0C4 -:10279000C1100520C0C0089003082088108405845B -:1027A00082000000000010000100200084000100F1 -:1027B000200040000000A10021100010C010108275 -:1027C00021898321C00903100000000000000001DE -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:102800000000000000000000000041800000800087 -:1028100020004183020391008500410080000000F8 -:10282000C1000000000000008000040080000000E3 -:102830004100000000000000040041000000800092 -:1028400000804110209089A1820900000009000841 -:102850000021000400000000000000000000000053 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 -:102880000000000000000000000000000000000048 -:1028900000800000210010004000020080080000BD -:1028A000000000000000000080008000000800041C -:1028B000000000008000800000000000801100C0C7 -:1028C00000800000A19091A00300C0200000000043 -:1028D00000000000004100000000000000000000B7 -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 -:102900000000000000000000000000000000820045 -:1029100088A0881008000900C110890489000401FA -:102920002090209088004000A000020008000001D4 -:10293000000000000000020004002000000004006D -:102940008820881088001102030421908200000072 -:10295000000800000000000100000000000000006E -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:10299000000000E000004842000000E00000484263 -:1029A000000000E000004882000000E0000000009D -:1029B000000000E007000082000000E000000000CE -:1029C0000000000000004842000000E00000484213 -:1029D0000000000000000000008200000000000075 -:1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A10000000A00000A02010040828000028A0004A -:102A200000A02841000020104080000000000000AD -:102A30000000000000000000000000000000000096 -:102A40000000A00000A0280000282800002828413D -:102A50000000000000000000000000000000000076 -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A900000000000050000054080020141000041E7 -:102AA00005000005000028410408020100000300A1 -:102AB000000000000000000000000000000000090D -:102AC00000000000050000054100004141000041F8 -:102AD000000028410000000000000000000000008D -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B900000000000000000000102080440022004C0 -:102BA00000008214010802044020020410200804DE -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000400220041008200463 -:102BD0001400001410082004000000000000000091 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C10000000000000000000000080401020800143 -:102C200010088214000080104020801001088040AD -:102C30000102000080000000000000000000000011 -:102C400000000000800000000000800110088001EA -:102C5000400282000082800140020000000000006B -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C900000000000000000000000000000610007CC -:102CA000000D080060610007000D100000610007C2 -:102CB000000D080000610007000D000005610A0F0B -:102CC000050D00A000610007000D0000600000007D -:102CD0000000100000610007000D08000000006106 -:102CE0000006000D000000000000000000000000D1 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D200000000000000000AA00AA0000000000004F -:102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D500000000000000000000000C300C3000000ED -:102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA000000000000000000000EA00AA010101018B -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD000000000000000000000800000C300C700E9 -:102DE00000000000000000010000000000000000E2 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000BFFFB4 -:102E6000FFFF000000000000000000000000000064 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA00000000000000000000000000000008000A2 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED0000000000000000000000000000000800072 -:102EE00000000000000000000000000002000000E0 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F2000000000000000040004000400040300008E -:102F300002020000040000008204880088050000EE -:102F40000000000000000000000000000041000040 -:102F50000004000400000000000000000004000065 -:102F60000000000000400003004000400005004059 -:102F70000040000000000000000000000000000011 -:102F80000000000000000040000000000000000001 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000200000000000000001 -:102FB000000000010000000000000001000000040B -:102FC0000000000000000000000000000000000001 -:102FD00000000001000109000000000000000000E6 -:102FE00000000000000000010000000100010000DE -:102FF00000010001000000000000000000000000CF -:1030000000000000000000000001000000000000BF -:1030100000000000000000000000000000000000B0 -:10302000000000000000000000000100030001009B -:10303000000000000000000082000000000300000B -:10304000000000000000000000000000020000007E -:103050000080000401000000008002000000000069 -:10306000000000000000040000000000000000005C -:10307000000000000200000000000000000000004E -:10308000000000000220004000000040000000009E -:103090000000000000000000000000000000000030 -:1030A00000000000000000000000000020002000E0 -:1030B00020000000000000000000000000000000F0 -:1030C00000000000020000000000000000000000FE -:1030D00000000204000104C0000000040000000021 -:1030E000000000000000000000840000000000005C -:1030F00000000000040800000000000000000000C4 -:1031000000000000000000000001000000010000BD -:10311000000000000082000000000000000000002D -:10312000000000000000000000000000000001009E -:1031300000000000010800000000A000000800805E -:103140000000208000020011000000880000200024 -:1031500000800000A0080000000000000000000047 -:1031600002000200000004800480030004800000CC -:1031700000000080008000000000008500050005C0 -:10318000004000000040020300400000000000007A -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B00004000500059004A0000008002100110093 -:1031C00000040390800400000000100000100000C4 -:1031D00088000004080008004100000000004100D1 -:1031E00003008000A1000382C14085408484A14087 -:1031F000000000A00040004000A000A0004000002F -:10320000000000010000000180000001000000003B -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:103230000000820004004004200082000000000022 -:10324000001000000000400000000000000004002A -:103250000800880008000820900004000100010018 -:1032600009000200A0400040A000010091001000F1 -:103270000100000000000100014000400003104177 -:1032800082002040A080008000400000008000807C -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B00000000000000080000084A000000000006A -:1032C00000A0000000000800000000000000000056 -:1032D0000008000000000004000000008000200042 -:1032E00004002000C00000010001000002000200F4 -:1032F000C1000200000021000200020103010000E1 -:1033000080000088A0010040004000410082004091 -:10331000004000000000000000000000000000006D -:10332000000000000000000000000000000000009D -:103330000000000000008200840084008200000081 -:103340008200820040000041828000040080000072 -:1033500000000000000008000880008000800000DD -:103360000000200000000080830000800280000038 -:1033700000000240A00000000100000000000180E9 -:1033800001000009108011000040000000850005C8 -:1033900000000000004000000000000000000000ED -:1033A000000000000000000000000000000000001D -:1033B0000000000000000000000040000002008843 -:1033C00005901000058485902090200420020004C0 -:1033D0004184000000000000000400040004000418 -:1033E0000000080080000000004002000340804010 -:1033F000030000A0A00120A00000020003000000C4 -:103400000202020000008040820000010000004033 -:1034100000000000000000010000000000000000AB -:10342000000000000000000000000000000000009C -:103430000000000000000000000090419000040027 -:10344000000000208208202104000000004100202C -:103450000002001100090000080020042000000004 -:1034600000000000040040000400040009000800FF -:1034700008008204000400040008000000800080AE -:1034800000C0010011802080218001000100014066 -:10349000014000400000000000400040000000002B -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C -:1034C00080000000000000000000009000000000EC -:1034D00000000001000000001100080000010000D1 -:1034E00000000000000080000000800000000200DA -:1034F0000000000000010001000300010000034083 -:1035000041404141020082408340824002840200E7 -:10351000020102000001000000000401000100009F -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000000001000000039002820182A182841029 -:103550002188848804820000000000000000000030 -:10356000000000000000000000000000000000C09B -:1035700000080000080001C18800880082000000E7 -:1035800000C000000810000001C100000088000118 -:1035900000C000040000000000C000000000004067 -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C0000000000004000000A00480052080200905 -:1035D00040800200050000800000000000000000A4 -:1035E000000000004000000000000000400000005B -:1035F000008000800000800010C180210210800047 -:103600000000008004000000000010C1112109002A -:10361000001000800080000000000080000000001A -:10362000000000000000000000000000000000009A -:10363000000000000000000000000000000000008A -:1036400000000009000000050000008000858009DE -:1036500000C00320058303C00480000000000000B8 -:103660000000000400000020000000050000001021 -:103670000000000000000000800010001080090021 -:10368000C100000000000000000080009000090060 -:103690000000C100000000030000800000000000E6 -:1036A000000080000000000000000000000000009A -:1036B000000000000000000000000000000000000A -:1036C000000000000000004000000082204020C0F8 -:1036D00040A190C0110111C0C040A0C00000000076 -:1036E0000000000000010000000100000000008850 -:1036F00000010088000000000000C00001901104DB -:103700000100C1400000000000000000C0009190D6 -:1037100000000000C100000000000000C000000028 -:1037200000000000C00000000000000000000000D9 -:103730000000000000000000000000000000000089 -:1037400000000000000000000400400000008303AF -:1037500000A0C020024005888408C01182890000B2 -:1037600000000000000000008400000000000000D5 -:1037700004002000000000000000000000C0000164 -:103780000000040191C1000000010001008800C098 -:1037900000890100000000C100000002000000C01C -:1037A00000000040000000C0000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C000000000000000000005008000000005006F -:1037D0004102210983408000410900858021850242 -:1037E00000000000000000000000000000000500D4 -:1037F00020008000800040000300000000000080E6 -:1038000005100800800589C100000010004000205C -:1038100000C000100900004100C10000008000004D -:103820000080000000000000008000000000000098 -:103830000000000000000000000000000000000088 -:10384000000000000000000000000000000900006F -:103850000000210511808400110000000004000018 -:103860000040000000000000000000000000000018 -:103870000000000000040000000080000000008044 -:103880000000C10983020000400000008000000029 -:1038900080000000C102110000000911800000003A -:1038A0000080000080000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D0000000000091009002402090009084201091 -:1038E00020844000000000000000000000000000F4 -:1038F00000000000000000010000000008000000BF -:1039000000080000C1012001000000000000C0000C -:10391000000010100000C100000000008800C0007E -:10392000000000040000C000004000004000000053 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:1039500000E00700000000000000000048420000F6 -:1039600000E00000484200000000000000000000ED -:1039700000E000000000000000E007000000000080 -:10398000000000000000500000E007000000000000 -:103990000000000000000000500000E000000000F7 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D0000000000000000000000011220011002281 -:1039E0000000112204081020000000000000000068 -:1039F00000000000000000000000000000000000C7 -:103A00000000FFFF0000FFFF000000FF0000FFFFBD -:103A100000000000F0F0000000FF00003C3C00004F -:103A20003C3C0000FFFF0000F0F000003C3C0000C8 -:103A3000F0F00000000000000000000000000000A6 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000011220000110022 -:103A6000220011220000010240800000000000003E -:103A70000000000000000000000000000000000046 -:103A800000000000FFFF00000000000000FF000039 -:103A9000000000000000F0F0000000FF00003C3CCF -:103AA00000003C3C000000000000F0F000003C3C46 -:103AB0000000F0F000000000000000000000000026 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000004010802D7 -:103AE000240081002400810004080102000000007D -:103AF00000000000000000000000000000000000C6 -:103B000000000000FF000000FFFF0000555500000E -:103B10000F0F000000000F0F0000FFFF00000F0F4D -:103B200000003C3C0000FF000000FFFF00003C3CA8 -:103B30000000AAAAFFFF0000000000000000000033 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000104015 -:103B6000208000240081002400811020408000007B -:103B70000000000000000000000000000000000045 -:103B8000000000000000FF0000000000000055558C -:103B900000000F0F000000000F0F000000000000E9 -:103BA0000F0F00003C3C0000FF0000000000000080 -:103BB0003C3C0000AAAAFFFF00000000000000003B -:103BC00000000000000000000000000000000000F5 -:103BD000000000000000000005610A0F050D00A0B4 -:103BE00060610006000D100000610007000D080074 -:103BF000000000000000000000610007000D000050 -:103C000005610A0F050D00A040028000002092020D -:103C100045828A09852092A2000040E38006002D9B -:103C20009202408280018020920240828000002027 -:103C3000920240828000002082020000000000000A -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C600000005555555503000300000000000000FA -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C90000000550014142828003C0000000000001B -:103CA0000000000014145500003C3C3C00000000E3 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000551555550300030000000000BA -:103CF00000000001000000000000000000000000C3 -:103D000000000000000000000000000000000000B3 -:103D100000000000550014142828003C000000009A -:103D200000000100000014145500003C00000000D9 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D900000000000000055000F00003C3030000023 -:103DA000000000000000000055003C0028283030D2 -:103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000002800000000AB -:103DF00000000000000100000000000000000000C2 -:103E000000000000000000000000000000000000B2 -:103E1000000000000000000055000F00003C3030A2 -:103E20000000000000000000000055003C002828B1 -:103E30003030000000000000000000000000000022 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E600000000000020000000000000000800404C8 -:103E70000002000004000040040000C000400004F4 -:103E80000404000004000000000000000000000026 -:103E90000004000004000000000000000000000416 -:103EA0000004000300000000000004000000000007 -:103EB00000000004000004000000000000000000FA -:103EC00000040004000000000000200000000000CA -:103ED00000000004000004000000000000000000DA -:103EE00000000002000000000000000000000004CC -:103EF0008001000400000000000100000005000136 -:103F000000000008000000000000000004000000A5 -:103F100000000000000000000000000000000000A1 -:103F2000000000020000000000000000000000008F -:103F3000000000000002000000000000000000007F -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F6000000000000004000000000000000003004A -:103F7000030000410100004000400000020000403A -:103F800004400000020000000200000000000000E9 -:103F9000020000000200000000000000000002001B -:103FA000000000000000000000000000020002000D -:103FB00000000200000000000000004000000800B7 -:103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000208000000000200C5 -:103FF00004000400020004080001200900880300F6 -:104000000001004100000002000400000000000068 -:104010000000000000000008000020020000000076 -:104020000000000004000008000000000400000080 -:104030000000000000000000000800002000000058 -:104040000400000000000200000200000000000068 -:104050000000000000000200000800002000000036 -:1040600000000000000000000000038091800100BB -:10407000010002008300038083A102000200020508 -:104080000200088020802080008400008200000060 -:104090000000000000000000000000000000000020 -:1040A000000000000000000000000000A000080068 -:1040B000C0804000000000800080900000000000F0 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E000000000000000000000000000024002404C -:1040F0000200020080000200824002048000800072 -:104100008000808400408040804000411100000019 -:10411000000000000000000000000000000003009C -:1041200000000000000000002100000000000084EA -:1041300000020040800000000004000400000000B5 -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000002000003F -:104160000000000000000000000000000000A0802F -:104170000280008000000880018000800140100063 -:10418000A04000800080010040000180000000008D -:10419000080004000000A00020000800000020002B -:1041A00082408200000000000200A0000800000021 -:1041B000000000400000000000000000004000007F -:1041C00000000004000000000004000000000000E7 -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F0000040A1400040200200402040004020003C -:10420000808200000040004020001100204000009B -:104210000000000000040000000004000000200076 -:104220000000000000000010400004000300100027 -:104230000000020205000000200000200002000033 -:10424000000000C000C00020008800000000000046 -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:1042700000001000100001002000000000002000DD -:1042800000C00080108000802080000000000040FE -:1042900000400000000000000000000000000000DE -:1042A000000000000000000000000000820082000A -:1042B000A000000000000800000000000080008056 -:1042C00000830080000000050000000000000000E6 -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F0000000000080828000020080002100030096 -:10430000A100034121408340004088400800000094 -:104310000001000100000000000000000000038414 -:1043200000000084000000000000000021000000E8 -:104330000000088800000000000000004084000821 -:104340000008110803040000000000000000000045 -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:1043700000000000000082040802A02100A002400A -:104380000200004000000004001020040000004073 -:104390000080000401400400000000000000000054 -:1043A00000000000000090000002400008028200AF -:1043B0000000040004000000000040009100000024 -:1043C000000400000004000800410009000500028C -:1043D00000000009002000000000000000000000B4 -:1043E00000000000000000000000000000000000CD -:1043F000000000000000000040832000400000405A -:104400008005800000014000000100000000000065 -:104410000001000400002001000000040000020070 -:10442000002000000000000000000000000000006C -:104430000400000002000020000011024090400231 -:10444000408809010390090009C111000000000023 -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:104470000000000000000000000000C1000000017A -:10448000880002C000000002000000C1000000001F -:10449000880002C08200000200000000000000004E -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000082A000904A -:1044C0000890900885410008A0C104880000000001 -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000003C11121C6 -:1045000004098000808000000980000040C1114142 -:104510000409800080800000058000000000000089 -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:1045400041008000000020C100850402000000003E -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:1045700000000000000000000000000000000080BB -:1045800000008900C1008000000000408000008021 -:1045900000008909C1000040000000038000000005 -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C000030020C18540048080000288800441905F -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:10460000008800009000C100080000880000C088F9 -:10461000008800009001C100000000000001C000FF -:10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:104640000000C00040C00282C1C0080089C008410B -:1046500085C1000000000000000000000000000014 -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000020009000020000C101000400200092 -:1046900000C020009000000000C1000004000000E5 -:1046A00001C0000000000000000000000000000049 -:1046B00000000000000000000000000000000000FA -:1046C0000000000021400083C04082C0C1040005FA -:1046D000C11182090000000000000000000000007D -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:10470000000000008009C100000200C140008000DC -:104710008000208083098500000900C1000000009E -:1047200000004180000000000000000000000000C8 -:104730000000000000000000000000000000000079 -:1047400000000000000041200010808400114100A2 -:104750000040858540C1000000000000000000000E -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:10478000000000000000C18541098000090380008D -:10479000000980000000C180000989000911800023 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C000000000000000000080A0002000808005A4 -:1047D000410003030500000300000000000000008A -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:104800000000000000000000C1400001880001011C -:10481000C000000002000000C1C0000188000100CB -:10482000C000002000004000000000000000000068 +:104820000000000000000000000000000000000484 :104830000000000000000000000000000000000078 -:1048400000000000000000000000040320C1A0825E -:10485000020083A0A185A088C00100000000000024 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:1048800000000000000000000000810000E00000C7 -:104890000000000000E007000000880000E00000C9 -:1048A0008100000000E00000000A0000000000009D -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000004842880000E000004842000000005C -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:10490000000000000000000000000000F0F00000C7 -:10491000FFFF0000F0F0000066660000F0F000000D -:10492000FFFF00003C3C0000666600000000000045 -:104930000000000000000000000000000000000077 -:104940000000000000000000000000000000A000C7 -:1049500000A0200440022800410020400402000082 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:104860002000000000000000000300000000000025 +:104870000000000000000000000000000000040034 +:104880000000000000000000000000000000000028 +:1048900000000000000000000000000000002000F8 +:1048A00000041000000000000000000000000000F4 +:1048B00000000000000000000000400000000000B8 +:1048C00000000000000000020000000000000000E6 +:1048D0000002400000000002000000000000000292 +:1048E0000000800000000000000000000000000048 +:1048F0000002000000000000400200000000000074 +:104900000000000220000000000000000000000085 +:1049100000000000000000004040000040000000D7 +:104920000000000080000002000000000000000005 +:104930000000000000000000000000000200020073 +:104940000200020000000000000000000000000063 +:104950000000000000000000000000000000000057 :104960000000000000000000000000000000000047 :104970000000000000000000000000000000000037 -:104980000000000000000000000000000000F0F047 -:10499000000000000000F0F0000066660000F0F08B -:1049A0000000000000003C3C0000666600000000C3 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A000000000000000000000000000000000C047 :1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 -:1049D0000500000510088001002800411080080132 +:1049D00000000000000800000000000000000000CF :1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 +:1049F000000000000000008800000000000000002F :104A000000000000000000000000000000000000A6 :104A10000000000000000000000000000000000096 :104A20000000000000000000000000000000000086 @@ -66744,412 +58550,412 @@ :104A60000000000000000000000000000000000046 :104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 -:104A900000000000FFFF000000FF00000F0F0000FB -:104AA0003C3C0000FFFF000000FF00000F0FFFFF75 -:104AB00099990000000000000000000000000000C4 +:104A90000002000000000000000000000000000014 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 :104AC00000000000000000000000000000000000E6 -:104AD00000000000440000440500000500008214AE -:104AE0004020020400000000000000000000000060 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000FF00000F0F78 -:104B200000003C3C00000000000000FF00000F0FF0 -:104B3000FFFF999900000000000000000000000045 +:104AD00000000000000000000000000000000000D6 +:104AE00000000082008200000000000000000000C2 +:104AF000009000000000000000840084000000001E +:104B0000000000A000000000000005000000000000 +:104B10000000000000000000000200000000000093 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 :104B40000000000000000000000000000000000065 -:104B500000000000000088000088A00000A082146F -:104B600000008010010800000000000000000000AC +:104B50000000000000000000000000000000000055 +:104B60000000000000000000000000000000000045 :104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 -:104B9000000000000000408280018020920245E376 -:104BA0008A0F052D92A2408280018020920240E36C -:104BB0008007002D820200000000000000000000BD +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB0000000010000800000000000000004000070 :104BC00000000000000000000000000000000000E5 -:104BD000000000000000000060610006000D1000F1 -:104BE000000000018000080000000000000000003C +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 :104BF00000000000000000000000000000000000B5 :104C000000000000000000000000000000000000A4 -:104C100000000000000000003C005500003C00FFC8 -:104C200000000000000000000C0C0505003C00FF27 -:104C30000000000000000000000000000000000074 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000004000000044 +:104C30000000000020000004000000000000000050 :104C40000000000000000000000000000000000064 :104C50000000000000000000000000000000000054 -:104C600000000F00FF0000F000AA0000000000009C -:104C70000000000000000000000000000000000034 +:104C60000000000000000000000000000000000044 +:104C7000010400000000001100000000000000001E :104C80000000000000000000000000000000000024 -:104C9000000000000000000000003C005500003C47 -:104CA000000000000000000000000C0C0505003CA6 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB0009000000000000000000000000000410023 +:104CC00000080000000000000000000000000000DC :104CD00000000000000000000000000000000000D4 -:104CE000010000000F00000000F000AA000000001A -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000005500050534 -:104D200000FFAAAA000000000000000005050F0017 -:104D300000AA00FF000000000000000000000000CA +:104CE00000000000000000000000008400C0000080 +:104CF00000002001000000C0008400000900000046 +:104D0000000000840000000000000000000000001F +:104D10000000000000C000000000000200000000D1 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000001162 :104D40000000000000000000000000000000000063 :104D50000000000000000000000000000000000053 -:104D6000000000000000FF000F0FAAAAA0A0000092 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D900000000000000000000000000000005500BE -:104DA00005050000000000000000000000000505EF -:104DB0000F0000AA0000000000000000000000003A +:104D60000000000000000000000000000000000043 +:104D7000000000000004000000000000000000002F +:104D800000000000000500000000000200210000FB +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000003 +:104DB00000000000000000000000000000000000F3 :104DC00000000000000000000000000000000000E3 :104DD00000000000000000000000000000000000D3 -:104DE0000000000001000000000000000000A0A082 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000010000000000000000B2 +:104E00000000000000002000000000000000000082 :104E10000000000000000000000000000000000092 -:104E200000000000000000080000010000208400D5 -:104E30000400040004000000200020002000000006 -:104E400000800000008000900400000000000000CE -:104E500000000000000004000000008000000000CE -:104E6000000100000000000000040000000000003D -:104E70000000000000000000200000000000000012 +:104E20000000000000000000000000200000000062 +:104E30000000000000000000002000000000000052 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000000032 :104E80000000000000000000000000000000000022 :104E90000000000000000000000000000000000012 -:104EA00000000000000000000000000002000001FF -:104EB0000000000000000000000280008000800070 -:104EC0000000002000000020002100000000000081 -:104ED00000000000000000000000000000100000C2 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000000010000000000F1 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 :104EE00000000000000000000000000000000000C2 :104EF00000000000000000000000000000000000B2 :104F000000000000000000000000000000000000A1 -:104F10000000000000000000400000000000000051 +:104F10000000000000000000000000000000000091 :104F20000000000000000000000000000000000081 -:104F30000000C000000000000000000000000000B1 -:104F4000000000000000000002000000000000005F +:104F3000000000000000000000000000110021003F +:104F40000000000000000000000000000000000061 :104F50000000000000000000000000000000000051 :104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 +:104F700000000000000000000000000000400000F1 :104F80000000000000000000000000000000000021 :104F90000000000000000000000000000000000011 -:104FA00000000000000000000000000004040000F9 -:104FB00000004000020000000000000000080000A7 -:104FC00000000000000000000000000000040000DD -:104FD00000000000000000000000000000080000C9 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000000000000000000041B0 +:104FC0000900000300800000000000000000000055 +:104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000200000000000408A3 +:104FF00000000000000000000000000000000001B0 :1050000000000000000000000000000000000000A0 -:10501000000000000000000000000000000000048C -:1050200000000000000000002000900000000000D0 -:105030000000000000000000000000000041080027 -:10504000000000000000000000000400000000005C -:10505000000000000000004100000000000000000F -:1050600000000000A000000000000000000082001E +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000000000070 +:1050400000010100000000880000000000000000D6 +:105050000000000000000000000000000000000050 +:105060000000000000000000000000000000000040 :105070000000000000000000000000000000000030 :105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 -:1050A0000000000000000000000080000010000070 -:1050B00021000000000000000000000000000300CC -:1050C0000000000000000000000000008000000060 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C0000000000088000000010000000000000057 :1050D00000000000000000000000000000000000D0 -:1050E0000000410008002100000000000000000056 -:1050F00000000000000000100000000000000000A0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 :10510000000000000000000000000000000000009F :10511000000000000000000000000000000000008F :10512000000000000000000000000000000000007F -:105130004000030082000400008001000200A00083 -:1051400000008200000000000000200000000000BD -:10515000000000000000880000008200080020001D -:1051600008004000880000000800900000000000D7 +:10513000000000000000000000000000000000006F +:10514000000000000000000000004100000000001E +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F :10517000000000000000000000000000000000002F -:10518000000000400000004000000000000000009F +:10518000000000000004000000000000000000001B :10519000000000000000000000000000000000000F :1051A00000000000000000000000000000000000FF -:1051B000000000002000000080000020040000002B -:1051C000000000000000000000000000800000005F -:1051D00000001100000000000000000008000000B6 -:1051E00000000000000000000400000000000000BB -:1051F00000000000000000000202000400000000A7 -:10520000000000000000000000000000000000009E +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000011200000000000AE +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000100000000000000009D :10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E -:1052300000000004000000000000000000410041E8 -:105240000000000000000005820082000000000055 +:10523000000000000000000000000000000000006E +:10524000000000000000000000000001000000005D :10525000000000000000000000000000000000004E -:1052600000000800000000000000A000080082000C -:10527000000000000000C00000000000000000006E -:10528000000000000000000000000000000000001E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:105280000000000000000000810000E000000000BD :10529000000000000000000000000000000000000E :1052A00000000000000000000000000000000000FE -:1052B0000000000000C100000000000000840000A9 -:1052C000008400000000000000000010000000004A -:1052D00000000000000000000000000000000000CE -:1052E0000000000000000000000000C000000000FE -:1052F0000000000003000300030000000010001085 -:1053000021840010000000000000000000000000E8 +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000E00000FE +:1052D000814100000000000000000000000000000C +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D :10532000000000000000000000000000000000007D -:1053300000000000001100000204020400414020AF -:105340000000000000000002000000020000000059 -:105350000000002100020000000200000000000028 -:105360000000000000004000200000000800900045 -:10537000A00000000000A002A00088400002000978 -:1053800000000041000000000000000400090000CF +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D :10539000000000000000000000000000000000000D :1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000100010000EB -:1053C00000010000002000000000000000000000BC -:1053D00002000000000000000000000000000000CB +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD :1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000010001AB -:10540000080000000000000000000000000008008C +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C :10541000000000000000000000000000000000008C -:105420000000000000000000000000000000080074 -:10543000000000000000000090A00004010288A00D +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C :10544000000000000000000000000000000000005C -:1054500000000000000000000000900000000000BC +:10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C -:1054700000A000900008004000002002004020A092 -:1054800082A040A000A0000808A0000000000000CA +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C :10549000000000000000000000000000000000000C :1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000800000000480E8 +:1054B00000000000000000000000000000000000EC :1054C00000000000000000000000000000000000DC -:1054D0000000000000000400000000008000000048 +:1054D00000000000000000000000000000000000CC :1054E00000000000000000000000000000000000BC -:1054F0000000008000000080000000000080030029 -:10550000000000000000000000808000000000009B -:10551000000000000000000000000000000000008B +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:10551000000000610006C00D000000000000000057 :10552000000000000000000000000000000000007B -:105530000000000000000000000000008005008561 -:105540008088008000008000000080800000000053 -:1055500000000000000900000009000080000000B9 -:1055600080000000000000000000000000000000BB -:1055700000000000000000400000000000001000DB -:1055800020820900408000000082000000800000AE +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:105550000000000000400006000C000000000000F9 +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B :10559000000000000000000000000000000000000B :1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000800E3 -:1055C00010C0900588C040001082A0009004000028 -:1055D00000000000000000000000000000000200C9 -:1055E00088408200C0400000000000000000000071 -:1055F000000000000000000000000010000000009B -:10560000910021C1828884C0840004C104A082C0AA +:1055B00000000000000000000000000000000000EB +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000F0FFFFF00000000AF +:1055E00000000000000000000000000000000000BB +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A :10561000000000000000000000000000000000008A :10562000000000000000000000000000000000007A :10563000000000000000000000000000000000006A -:10564000118808A0C0021040000000000400010002 -:10565000000000000000000000004000C000010049 -:1056600000000000840000000000000000000000B6 -:105670000000000000000000000000000000020028 -:10568000000005A000C0C085408303C00004C040E6 -:1056900040040000000000000000000000000000C6 +:10564000000000000000000000000000000000005A +:10565000000000000000000000000F0F000000002C +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:10569000000000000000000000000000000000000A :1056A00000000000000000000000000000000000FA :1056B00000000000000000000000000000000000EA -:1056C0000000C10080008000900000000000800009 -:1056D0000400000000000000000000008000000046 -:1056E0004100400000000000000000000000000039 +:1056C00000000000000000000000000000000000DA +:1056D0000000000000000000000000000000F0F0EA +:1056E00000000000000000000000000000000000BA :1056F00000000000000000000000000000000000AA -:10570000800000004109000580210088C100008060 -:105710008080000000000000000000000000000089 +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 -:10574000000000000000001100800000000000C008 +:105740000000000000000000000000000000000059 :105750000000000000000000000000000000000049 -:1057600000000000000000020080000000000000B7 -:1057700000000000000000000000000080000000A9 -:105780000000800000000082802080000002800273 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C0000000000000000400C011048282000000FC -:1057D0000083002000000000000000000000000026 -:1057E000000000000000000000A100020000000016 -:1057F00000000000000000000000000000000800A1 -:105800009000A00008000000C005200404C0C001F2 -:1058100004014084C0048400000000000000000077 -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 -:105840000000000000000000000000E000004842EE -:105850000000000007000000000000000000000041 -:10586000000000E00000000A000000000700000047 +:10576000F0F00000000084000000200000000000B5 +:105770000000000400002000000000000000000005 +:1057800000040004000000000000200000000000F1 +:1057900000000000000020000000000000000400E5 +:1057A0000004400000020000000000002000000093 +:1057B000000004000000000020800040880000007D +:1057C0002000000020040000000000200000000075 +:1057D00000000000000000002000000000000000A9 +:1057E0002000001120004000000000000000000028 +:1057F00000000000000000000000000000000000A9 +:105800000000000200000000000000000000000096 +:105810000000000000000000000000000000000088 +:1058200000000002000000000000000000008000F6 +:105830000000000000000000000000400001000027 +:105840004000000000041000000000000000000004 +:1058500000000000008400000000000000000000C4 +:1058600000000000000000000000840000000000B4 :105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:1058900048420000000000004842000000000000F4 +:105880001000000000000000000000000000080000 +:105890000000000000000000000000000000000008 :1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000001100224080E5 -:1058D0001020000000000000000000000000000098 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 -:10590000000000000000000000000000041008205B -:105910000408102004100820020880200000000065 -:105920000000000000000000000000000000000077 -:105930000000000000000000000000000000000067 -:105940000000000000000000000000001100220024 -:105950000102040800000000000000000000000038 -:105960000000000000000000000000000000000037 +:1058B00000000000000000000000004000000000A8 +:1058C0000040000000000000000000000000000098 +:1058D00000000000000000000000000000000000C8 +:1058E0000000080008000800000000000040000060 +:1058F0000000040004000400000800000000000094 +:10590000000000080000000000000000200000006F +:10591000000000000000000000080000000000007F +:10592000000000080000000000000000000000006F +:10593000000000000000000000000008000104005A +:10594000000000010008000000000000000000004E +:105950000000000000000000000000100000000037 +:1059600000000000800880008000000000000000AF :105970000000000000000000000000000000000027 -:1059800000000000040000000000000000000140D2 -:1059900002800102408001400280010440100000AA -:1059A00000000000000000000000000000000000F7 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A0000000000000000000C00000000000000037 :1059B00000000000000000000000000000000000E7 -:1059C0000000000000000000000000000000069041 -:1059D0000000041008200000000082BE82BE00000B -:1059E00000000000000000000000000000000000B7 -:1059F00000007D7D2828000000000000000000005D -:105A0000000000000000F0F2F0F0000000000000D4 -:105A10000408102006009000240081000600000603 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000001100000000C011C000000015 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 :105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 +:105A30000000000000000000000000000000210045 :105A40000000000000000000000000000000000056 -:105A5000000006900140028000000000C0C0FCFC75 -:105A60000000000000000000000000000000000036 -:105A7000000000005F0A5F0A000000000000000054 -:105A80000000000000000000F0F2F0F00000000054 -:105A90000000010240800006009000240081900078 -:105AA0000090000000000000000000000000000066 -:105AB00000000000000000000000000000000000E6 +:105A500000000000000000A00000000000A0000006 +:105A6000000000000000080000000000000000002E +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000800000000000000DE :105AC00000000000000000000000000000000000D6 -:105AD000000000610007000D080000000A08050032 -:105AE00000A1000000000000000000610007000DA0 -:105AF000000005000A08050000A0000000000000EA +:105AD0000000040000000000080000000000880032 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 -:105B10000000000060610006000D100000000000A1 -:105B2000000008000000000000000000000000006D +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 :105B30000000000000000000000000000000000065 :105B40000000000000000000000000000000000055 :105B50000000000000000000000000000000000045 :105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 +:105B70001000000000000000000000000000000015 :105B80000000000000000000000000000000000015 :105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000000000000000E5 +:105BA0000000000000000000000090000000000065 +:105BB00000000000000000000000000001000000E4 :105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE00000000000000000000000000000000000B5 +:105BD00000030000000000080000000000000008B2 +:105BE00000000000000082000000A0008200000011 :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 -:105C10000000000000000000000000000001000083 +:105C10000000000000000000000000000000000084 :105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 +:105C30000000000000000000000000000000200044 :105C40000000000000000000000000000000000054 :105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000000024 +:105C6000000000000000000000000000000000C074 +:105C7000000000000084000000020000000000009E :105C80000000000000000000000000000000000014 :105C90000000000000000000000000000000000004 :105CA00000000000000000000000000000000000F4 :105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000000000000000000B4 +:105CC00020000000000000000000000000000000B4 +:105CD000008000000005000000000000000300003C +:105CE000000000000000080000008200000000002A :105CF00000000000000000000000000000000000A4 :105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 -:105D20004000000000000000000000000000000033 +:105D20000000000000000000000000000000000073 :105D30000000000000000000000000000000000063 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000200023 -:105D60000400000000000400000402040000000021 -:105D7000000000000400040004000404000004000B -:105D800000000400000020000004000400040000E3 -:105D900000000000000000000000000400000000FF -:105DA0000400000000000000000082040004000065 -:105DB00000000000000000000000000000040000DF -:105DC00004000000000000000000000400040000C7 -:105DD00000000000000000000000000000040000BF +:105D400000008000000000000000000000000000D3 +:105D50000000002000000000000000000000000023 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000100000000000000013 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD0000090000000000000000000000000000033 :105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000020000A1 -:105E00000000000000000000000000002000000072 +:105DF0000000000000000090004000020288000047 +:105E00000000000000000000000000000000000092 :105E10000000000000000000000000000000000082 :105E20000000000000000000000000000000000072 :105E30000000000000000000000000000000000062 :105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E6000000002000000000004000000020000002A -:105E70000400824000000200000002000000000058 +:105E500000000080000000000000000000000000C2 +:105E60000000000000000000000000000000000032 +:105E7000000000000000000005000080008080009D :105E80000000000000000000000000000000000012 :105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 -:105EB00000000000020000000000000000000000E0 -:105EC00000000000200000000000000000000000B2 -:105ED00000000000000000000000000000000000C2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000008000000080000000000000C2 :105EE00000000000000000000000000000000000B2 -:105EF000000000000300000000000000000000009F -:105F0000000000002000000000000000000005006C +:105EF000000000000000000000000000002100027F +:105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 -:105F20000000000000002010000000000000000041 -:105F30000000000005000400000000000000000058 -:105F4000000000000000000000000400000000004D -:105F50000000000000000000000000000000000041 +:105F20000000000000000000000000000000000071 +:105F30000000000000000000000000000000000061 +:105F4000000000020000000000000000000000004F +:105F500000000000880000080000001000000000A1 :105F60000000000000000000000000000000000031 :105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 +:105F80000001000000000000000000000000000010 :105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000008000000E9 -:105FB000A000000000000000000000000000000041 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE0000000000000000000000000000800001099 -:105FF000001000000084000000000000000000000D -:106000000000000000000000000000000000000090 -:106010000000000000000000000000000000080078 -:106020000800080000000000000000C000000000A0 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC00000000000000100010000000100000000CE +:105FD00000000000000000000000889000000000A9 +:105FE00000000000000000000000000000000000B1 +:105FF0000000000000000000000000000000040895 +:106000000002088200900000000000000000000074 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 :106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:1060600000000000000000000000000000000040F0 -:1060700000000000000000000040000000000020C0 -:1060800000000000000000000000000000000040D0 -:1060900000000000000000000000000000000002FE -:1060A00000000000000000000000000000400000B0 -:1060B0000000000000000000004000020004000991 -:1060C00000002000000000000000000000000000B0 -:1060D00000000000000000000000000000000009B7 +:10604000000000000000000100040000002000002B +:1060500000000000000000001000000000800000B0 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:10608000838000800000000000000000000000008D +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000000001000000000000CF +:1060D000000000000000000000000011800000002F :1060E00000000000000000000000000000000000B0 -:1060F0000000090000002100200000000000000056 -:106100000000000000000000000000000000080087 +:1060F00000000000000000000000000000000000A0 +:10610000000080410040800000000000000000000E :10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F -:106130000000020000000000020011000000210029 -:10614000000000000000000000000000000000004F -:10615000000000000300000000000000000000003C +:10613000000000000000000000000000000000005F +:10614000000000000000000000000001000000004E +:10615000000000000000000000000000000120001E :10616000000000000000000000000000000000002F :10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F +:10618000000000004001C000400088000000000046 :1061900000000000000000000000000000000000FF :1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF :1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF -:1061E000000000000000000000000000000000109F -:1061F000001000C00084000000000000000000004B -:10620000000000000000000000000000000000008E -:106210000008000000000000000000000000000076 -:10622000000000000000080008000000000000005E -:1062300000C00000008421000000000000000000F9 +:1061D00000E00000000000000000000000000000DF +:1061E00000000700000000000000000000000000A8 +:1061F000000000000000000000000000000000009F +:1062000000000000000000000000820060000000AC +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E :10624000000000000000000000000000000000004E :10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:106270000000000208000000000000000000000212 -:10628000000000000000000200000000000000000C +:106260000000FF000000FF00000000000000000030 +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E :1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000800E6 -:1062B0000000000040000000000000000800002076 +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE :1062C00000000000000000000000000000000000CE :1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE -:1062F000000000000040000000000000000000401E -:10630000000000002000000000001100000000005C -:10631000000002000000000000000000000000007B -:106320000000000000040000000000000000000069 -:106330000000000002000004020000000200020051 -:106340002000110000000000000000000204000016 +:1062E00000000000FF000000FF00000000000000B0 +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D :10635000000000000000000000000000000000003D -:106360000820000002000000000000000000000003 -:106370000400000000000000000000000000000019 -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:1063800000000000000000000000000000084000C5 +:106390000084000000000000000000000000000079 :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD :1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD +:1063E00000000000000000FF00003C3C0000000036 :1063F000000000000000000000000000000000009D :10640000000000000000000000000000000000008C :10641000000000000000000000000000000000007C @@ -67157,23 +58963,23 @@ :10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C :10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C +:10646000000000000000000000FF00003C3C0000B5 :10647000000000000000000000000000000000001C :10648000000000000000000000000000000000000C :1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC -:1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C +:1064D000000000000000000000000061000600094C +:1064E0000000000000000000000015002A00054028 +:1064F00000A80000000000000000000000000000F4 :10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B +:1065600000C300C3000000000000000000000000A5 :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB @@ -67181,7 +58987,7 @@ :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB +:1065E000000000C300C30000000000000000000025 :1065F000000000000000000000000000000000009B :10660000000000000000000000000000000000008A :10661000000000000000000000000000000000007A @@ -67201,23 +59007,23 @@ :1066F000000000000000000000000000000000009A :106700000000000000000000000000000000000089 :106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 -:106730000000000000000000000000000000000059 -:106740000000000000000000000000000000000049 -:106750000000000000000000000000000000000039 -:106760000000000000000000000000000000000029 +:106720000000000020000000000020002000040005 +:1067300004000000000000002040000000000000F5 +:1067400000000000200000000000200020000000E9 +:106750000000000000000000200000000000000019 +:1067600000000002000020000000000020002000C7 :106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 -:1067900000000000000000000000000000000000F9 -:1067A00000000000000000000000000000000000E9 -:1067B00000000000000000000000000000000000D9 +:1067800000000000000020000000000000002000C9 +:106790000000000001000100008001000000000076 +:1067A00000000000400000000000000000000000A9 +:1067B0000000000000000000000200004000000097 :1067C00000000000000000000000000000000000C9 :1067D00000000000000000000000000000000000B9 -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 +:1067E0004000000000000000000000000000000069 +:1067F0000000009000000000000000020000000007 +:1068000000004040100040000000000000000000B8 +:106810000000000000000800020000400800000026 +:106820000002000000000000000000000000000066 :106830000000000000000000000000000000000058 :106840000000000000000000000000000000000048 :106850000000000000000000000000000000000038 @@ -67225,7 +59031,7 @@ :106870000000000000000000000000000000000018 :106880000000000000000000000000000000000008 :1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 +:1068A00000000000000000000000004000000000A8 :1068B00000000000000000000000000000000000D8 :1068C00000000000000000000000000000000000C8 :1068D00000000000000000000000000000000000B8 @@ -67247,7 +59053,7 @@ :1069D00000000000000000000000000000000000B7 :1069E00000000000000000000000000000000000A7 :1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000000086 +:106A00000000000000000084000000000000000002 :106A10000000000000000000000000000000000076 :106A20000000000000000000000000000000000066 :106A30000000000000000000000000000000000056 @@ -67255,164 +59061,164 @@ :106A50000000000000000000000000000000000036 :106A60000000000000000000000000000000000026 :106A70000000000000000000000000000000000016 -:106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 +:106A800000000000000008000000000000000000FE +:106A900000000000000082008400000000000000F0 +:106AA0000000000000000000000000800000000066 +:106AB00000000000000002000400040000000000CC :106AC00000000000000000000000000000000000C6 :106AD00000000000000000000000000000000000B6 :106AE00000000000000000000000000000000000A6 :106AF0000000000000000000000000000000000096 :106B00000000000000000000000000000000000085 -:106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 +:106B10000000000000000000000005000000000070 +:106B20000000000000000000000003000020000042 :106B30000000000000000000000000000000000055 :106B40000000000000000000000000000000000045 :106B50000000000000000000000000000000000035 :106B60000000000000000000000000000000000025 :106B70000000000000000000000000000000000015 :106B80000000000000000000000000000000000005 -:106B900000000000000000000000000000000000F5 -:106BA00000000000000000000000000000000000E5 -:106BB00000000000000000000000000000000000D5 +:106B90000000100000002000000084000000000041 +:106BA0000000000000000000000000000000840061 +:106BB0008400000000000000000000000000000051 :106BC00000000000000000000000000000000000C5 :106BD00000000000000000000000000000000000B5 -:106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000000084 +:106BE0000000000000000000000000200000000085 +:106BF0000000000000000000000000000000008411 +:106C000000000000000000000000000000880000FC :106C10000000000000000000000000000000000074 -:106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 +:106C2000000000000000000000000000000000C0A4 +:106C30000000400004000000000000000000000010 :106C40000000000000000000000000000000000044 :106C50000000000000000000000000000000000034 :106C60000000000000000000000000000000000024 :106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000000000000000000D4 +:106C800000000000000000000011000000000000F3 +:106C900000000000000000000008008000008500E7 +:106CA000080000800000010000000000000000005B +:106CB00082008400000001000000000000000000CD :106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 +:106CE0000000000008000800000000000000000094 :106CF0000000000000000000000000000000000094 :106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 -:106D20002000000000000000000000000000000043 -:106D30000403200000000000040000000000000028 +:106D10000000000000000000000000000020410012 +:106D2000040000000020000004000000000000003B +:106D3000000000000000000004000000000000004F :106D40000000000000000000000000000000000043 -:106D50000003000000000000000000000000000030 -:106D60000000000002000000000084000000C000DD -:106D7000820084030000000000000000000000000A -:106D800000000400000000000000000000000000FF -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000090A0009033 +:106DA0000090882002A00090009008900000000051 +:106DB00000000000002090A0008820820000000059 :106DC00000000000000000000000000000000000C3 :106DD00000000000000000000000000000000000B3 :106DE00000000000000000000000000000000000A3 :106DF0000000000000000000000000000000000093 -:106E00000000400000000000000000000000000042 -:106E10000000000000000000000000000000000072 -:106E2000020000000000000000000000020000005E -:106E300000000000840000000000000000000000CE -:106E40000000000000000000000000000000020040 +:106E00000000000000000000000000000000000082 +:106E100000000000000000000000000000002080D2 +:106E2000008000000000A080008000000000000042 +:106E30000000000000004000800000800080000092 +:106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 :106E60000000000000000000000000000000000022 :106E70000000000000000000000000000000000012 :106E80000000000000000000000000000000000002 :106E900000000000000000000000000000000000F2 -:106EA000000000080000008200000008000002004E -:106EB00000000000000000A0000000000000000032 -:106EC0000000004000000000000000020000000080 +:106EA0008000002180A080000000004180808000E0 +:106EB0000000001000008000000000208000800022 +:106EC00000000000000000000000000000000000C2 :106ED00000000000000000000000000000000000B2 -:106EE0000000000000000000000009000000000099 -:106EF000000000000000050000000000000000008D +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 :106F00000000000000000000000000000000000081 :106F10000000000000000000000000000000000071 -:106F20000000000000400000000000000000000021 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 +:106F2000000040000000A084909000002001A08498 +:106F30009020900000010000C0002000A000A09060 +:106F400090000000000000000000000000000000B1 :106F50000000000000000000000000000000000031 :106F60000000000000000000000000000000000021 :106F70000000000000000000000000000000000011 :106F80000000000000000000000000000000000001 :106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 +:106FA0000000000000200000008882900000009097 +:106FB000002004200000000000000000009000906D +:106FC000004082900000000000000000000000006F :106FD00000000000000000000000000000000000B1 :106FE00000000000000000000000000000000000A1 :106FF0000000000000000000000000000000000091 :107000000000000000000000000000000000000080 :107010000000000000000000000000000000000070 -:1070200000000000000000000000880000000000D8 -:107030000000000088000000000082000000000046 -:107040000000000000000000000000000800000038 -:107050000000000000000000000000000000080028 -:10706000000000000000000000000000A0009000F0 -:10707000000000000000000000000000820000008E -:1070800020000000000000000400000000000000DC +:1070200000000000000000000000000080000000E0 +:1070300000000000800000000000000000000000D0 +:107040000000008080000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 -:1070A0000000000000000000000000200990100017 -:1070B0000000000000000400008800000000000044 -:1070C000000000000000108800000000030021887C -:1070D000000000000000100000000000000003009D -:1070E0000000000002000000000000001100090084 -:1070F0001100030011001100110000000000000247 -:107100000300024000900000110000200000050074 -:10711000100003001100000009000300000000003F -:10712000110000000000000000000000000000004E -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F +:1070A00000000000000000000010002000000000B0 +:1070B000000000800000000080058000000000004B +:1070C0000020002000000000000000000000000080 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000001089088201E +:1071300090009000200208900000C0002090404085 +:1071400000009000882020000000000000000000E7 :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F :10717000000000000000000000000000000000000F :1071800000000000000000000000000000000000FF :1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF +:1071A000000000000000000000000000008100005E +:1071B000070000000041000007004100000000003F +:1071C0000000000000410000070000000000000077 :1071D00000000000000000000000000000000000AF :1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F :10720000000000000000000000000000000000007E :10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:1072400000000000000000000000000082000000BC +:10722000000000000000000000000000000004005A +:10723000040014000000000005000000000000F041 +:107240000F0F000000000000000000000000000020 :10725000000000000000000000000000000000002E -:10726000000000000000000000000200000000001C +:10726000000000000000000000000000000000001E :10727000000000000000000000000000000000000E :1072800000000000000000000000000000000000FE :1072900000000000000000000000000000000000EE :1072A00000000000000000000000000000000000DE -:1072B00000002100000000000000000000000900A4 -:1072C00040880000000200020000000000200000D2 -:1072D00000000000000000000000000000020000AC -:1072E00000000000009008000000000000000800FE -:1072F000000000000000210000001140000000001C -:107300004000000000002000000000040002000017 -:107310000000000000000300000008000000000062 -:1073200008000002080008000800000000880000B3 -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D +:1072B000000000000000000000000000A00000002E +:1072C00000F0FFFF0000000000000A000000C00006 +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:107330000000FF7C8300FF00FF00FF758A00FF0A4A +:10734000F50000000000C3C3AAAA2D2D0F2DFFA831 +:1073500057000000000000000000000000000000D6 :10736000000000000000000000000000000000001D :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED :1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD +:1073B00000000000FF7C8300FFD72800FF758A00D3 +:1073C000FFAA550000000000FFFFFFFF2D2D0F2D2D +:1073D000FFA85700000000000000000000000000AF :1073E000000000000000000000000000000000009D :1073F000000000000000000000000000000000008D :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C :10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C +:10743000000000000000000000200000000000002C +:10744000002000000000A0000000000000058000F7 +:10745000002000000000000000000000000000000C :10746000000000000000000000000000000000001C :10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC @@ -67444,275 +59250,275 @@ :10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA -:1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA +:107650000000000000000000000000000000200802 +:10766000200000001000200000000404840020001E +:107670002000000020002000000000002004200066 +:107680002000000020002000000020040004200052 +:107690002000000020002000000000002000000268 +:1076A0002000200000002000000000000004000076 +:1076B000200020000000200000000000000000006A +:1076C00020000000000020000000C00000020004B4 :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A -:1076F000000000000000000000000000000000008A -:107700000000000000000000000000000000000079 -:107710000000000000000000000000000000000069 -:107720000000000000000000000000000000000059 +:1076F0000000000000000000000000000002000088 +:1077000000000000000000000000000000001090D9 +:107710000000000000000000000000000002000067 +:107720000000000000000000000040000000000019 :107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 +:107740000000000000000000000000000000090030 :107750000000000000000000000000000000000029 :107760000000000000000000000000000000000019 :107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 -:1077900000000000000000000000000000000000E9 -:1077A00000000000000000000000000000000000D9 +:1077800000000000000000000000040004000400ED +:1077900004000000000000000000000000000000E5 +:1077A00000000000000000000000001000000000C9 :1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 -:1077D00000000000000000000000000000000000A9 -:1077E0000000000000000000000000000000000099 +:1077C0000000000002000200004000400200020031 +:1077D00000400040020002000040004002000200A1 +:1077E000004000400000000000000004000000080D :1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 -:107810000000000000000000000000000000000068 -:107820000000000000000000000000000000000058 -:107830000000000000000000000000000000000048 -:107840000000000000000000000000000000000038 -:107850000000000000000000000000000000000028 -:107860000000000000000000000000000000000018 +:107800000000000000080000000000008000800868 +:107810008000800000000000000000000000000068 +:107820000000000000000010000000000000000048 +:107830000008000000000000000000000000000040 +:1078400000000000000080008400000100018000B2 +:107850008008000100018008800000010001800014 +:107860008000000100010000000000000000000096 :107870000000000000000000000000000000000008 :1078800000000000000000000000000000000000F8 :1078900000000000000000000000000000000000E8 :1078A00000000000000000000000000000000000D8 :1078B00000000000000000000000000000000000C8 :1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000000000000000000098 +:1078D0000080000000000000000000000000000028 +:1078E0000000000000009000000000000000000008 :1078F0000000000000000000000000000000000088 :107900000000000000000000000000000000000077 :107910000000000000000000000000000000000067 :107920000000000000000000000000000000000057 :107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 -:107950000000000000000000000000000000000027 -:107960000000000000000000000000000000000017 +:1079400000000300000003000800210008000500FB +:10795000050000400000000000002100410003007D +:10796000050003004100410000000000000000008D :107970000000000000000000000000000000000007 -:1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 +:107980000000A000A00008000000000000000000AF +:1079900000000004000400040004000000000000D7 :1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C00000000000000000000000000000000000B7 -:1079D00000000000000000000000000000000000A7 -:1079E0000000000000000000000000000000000097 +:1079B00000000000080000000800000000000000B7 +:1079C00000000000820000008200000000000000B3 +:1079D000C00084008200000082000000A08000003F +:1079E000A000010082000000C000000000000000B4 :1079F0000000000000000000000000000000000087 :107A00000000000000000000000000000000000076 -:107A10000000000000000000000000000000000066 +:107A10000000000000010001000100010000000062 :107A20000000000000000000000000000000000056 :107A30000000000000000000000000000000000046 :107A40000000000000000000000000000000000036 -:107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 +:107A500000004100000021000500000000000002BD +:107A60000000000002000000000000000000000014 :107A70000000000000000000000000000000000006 :107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 +:107A900000000000000000000000000008000000DE :107AA00000000000000000000000000000000000D6 :107AB00000000000000000000000000000000000C6 -:107AC00000000000000000000000000000000000B6 -:107AD00000000000000000000000000000000000A6 -:107AE0000000000000000000000000000000000096 +:107AC00000000000000000008200000082000800AA +:107AD00000800800840020008200C0008400208014 +:107AE000A000C000A040840082002000C10000006F :107AF0000000000000000000000000000000000086 :107B00000000000000000000000000000000000075 :107B10000000000000000000000000000000000065 :107B20000000000000000000000000000000000055 :107B30000000000000000000000000000000000045 -:107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 -:107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000000D5 +:107B4000000000080000000000000000000000002D +:107B5000000021400800050085900300210003007B +:107B6000A140080008000001080003C0A100029025 +:107B700009000000000000000000000000000000FC +:107B80000000400040000000000004000400040069 +:107B90000000A000A000A000000000000000000005 +:107BA00000000000002000000000000000000000B5 :107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000000000000000B5 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000000095 -:107BF0000000000000000000000000000000000085 +:107BC00000000000000000000000000008000000AD +:107BD00082000000A0000800C0000200C0000000F9 +:107BE000824000004000020082008200C0000200CB +:107BF000A0000040000000000000000000000000A5 :107C00000000000000000000000000000000000074 :107C10000000000000000000000000000000000064 :107C20000000000000000000000000000000000054 :107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 -:107C500000000000000020000000200000000200E2 -:107C6000200004000002000000000000820000006C -:107C700002000008000420000000200000000000B6 -:107C800020000000000400000000000000000200CE -:107C900000000408008800030004820000000000C7 -:107CA000000002000000880800000400000000003E -:107CB0002000000020080008000004000000000070 -:107CC000000000000000000200002000000004008E -:107CD000000000000008008200000000000000001A -:107CE0000000000000000004000000000000000090 -:107CF000000000000001000900000000000000007A -:107D00000000000000000000000000020000000071 -:107D1000000000000001000800000000000000005A -:107D200000000000000000000084000000000000CF -:107D30000000000000000001000900000000000039 -:107D4000000000000000000000040000000000002F -:107D5000000000000000000100050000000000001D -:107D60008800000002000000000000000000000089 -:107D7000020000000000000000C00000020000003F -:107D800000000000020000000200000000000000EF -:107D90000000020000000000008000000000000061 -:107DA00000000000000000000000000000000000D3 -:107DB0000000000000000000000000800000000043 +:107C500000000000000000000000000080000000A4 +:107C6000000800010008000080000008000000007B +:107C70008000000000010000000000000000000083 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD000000000000000000000C1000102C0000020 +:107CE00001C0000040C0000001C00000040100000D +:107CF00001C00001040000010000000000000000BD +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000000040000000000000000000000013 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D500000000000000000000000009000208020D3 +:107D6000000310C0000300410000098300038005E8 +:107D7000000309C0000380030010000000000000A1 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000000000000000000000E3 +:107DA0000000000500000005008000000000000049 +:107DB00000000000000000000000000000000000C3 :107DC00000000000000000000000000000000000B3 -:107DD0000000000000000000000000800000001013 -:107DE000000000C02040040000200000000020002F -:107DF0000000000000080000000000020000000079 -:107E00000000000000000000000000080000040066 -:107E10000000000000080000000000020000000058 -:107E2000000000000000000000000000000400004E -:107E30000000000000000008000000000004000036 -:107E4000000000000000000000000000000800002A -:107E50000000000000000008000000000008000012 -:107E600000000000000000410000000000000000D1 -:107E70000000000000000000000000000080000082 +:107DD0000000000000000000000000000000200083 +:107DE0002000A0414080210020008000030003000B +:107DF0004100A000408021000305908000000000A9 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 +:107E20000000000000000040000000C00000000052 +:107E30000000000000000000000000000000000042 +:107E40000000000000000000000000000000000032 +:107E50000000000000000000000000000000000022 +:107E600001000000C001000200000000C000008806 +:107E700000000000C020004000000000C10400001D :107E800000000000000000000000000000000000F2 -:107E90000000000000000000000000000080000062 -:107EA00000000000000000000000000000000000D2 -:107EB0000000000000000000000000000000008240 +:107E900000000000000000000000000000000000E2 +:107EA000000000000000000004004000000000008E +:107EB00002000000000000000000000000000000C0 :107EC00000000000000000000000000000000000B2 :107ED00000000000000000000000000000000000A2 -:107EE000000000000000000000000000000000088A -:107EF000000000000000000000000000000000087A +:107EE0000000010100A101C00000010004A100C1C7 +:107EF00000000000418583C100000100A08403C18F :107F00000000000000000000000000000000000071 -:107F1000000000000000000000000000000000045D -:107F20000000000000000000000000000800000049 -:107F3000000000000000000000000000000003003E -:107F40000021000000000000000000000000000010 +:107F10000000000000000000000000000000000061 +:107F200000000000000000004000800080004100D0 +:107F300000008000000000000000000000000000C1 +:107F40000000000000000000000000000000000031 :107F50000000000000000000000000000000000021 -:107F60000000A000A0000000A000000000008400AD -:107F7000000088008200C0008200A000A0008200F3 -:107F800002008200820082008200000000000000E7 +:107F60000000000309030021118300410905A0213D +:107F700000910005004108A1919100030541808313 +:107F800091910000000000000000000000000000CF :107F900000000000000000000000000000000000E1 -:107FA000400000000800000008000200000040003F -:107FB000A000900000002000A000820000008200CD -:107FC000000082004000820000000000000000006D -:107FD0000000000090000000000000000000000011 -:107FE0000800000000000800000020000000000061 -:107FF0000000000000000000000000000000000081 -:108000000000004000000000000000000000000030 +:107FA0000000000000000000000000200040000071 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE000000000002185118005000340A185C0919B +:107FF000050003118502C011050003C0A105400062 +:108000000300030500000000000000000000000065 :108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 -:1080300000000000200003000000000040000000DD +:10802000000000000000000000000000000100004F +:108030000000000000000000000000000000000040 :108040000000000000000000000000000000000030 :108050000000000000000000000000000000000020 -:10806000000000000000000000000000820000008E -:108070000000C00008000000000000000000000038 -:10808000000000000800A000000000000000080040 -:10809000A0000800820000000000000000000000B6 -:1080A00008000000000000000000000000000000C8 -:1080B00000000000000082000000000082000000BC -:1080C0000000C000000000000000000000000000F0 -:1080D0000000000000000800000000000000000098 -:1080E0000800000000000000000000000000000088 -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F +:1080600000000000000001C0019090000000C1026B +:10807000029100000100C001020500000108C100DA +:10808000A00400000000000000000000000000004C +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000200400000A0000000000000000000092 +:1080C00000000000000000000000000000000000B0 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000810000E000004206E7 +:1080F000810000E000000000810000E000000000BE +:10810000810000E00000000000000000000000000E :10811000000000000000000000000000000000005F :10812000000000000000000000000000000000004F :10813000000000000000000000000000000000003F :10814000000000000000000000000000000000002F :10815000000000000000000000000000000000001F -:108160000000000000000000000000000800000007 -:10817000000002000000040000008200C0000000B7 -:108180004000100008000000000000000400C000D3 -:10819000000482008200000088000000000000004F -:1081A00008020000000000000000000000002000A5 -:1081B0000200020000000200400000020000000077 -:1081C000000002020041000000004000040008001E -:1081D00082008202A00008000000000040000000B1 -:1081E000000040000002000000000000000000004D -:1081F000000000000000000000000000000000007F -:10820000210000000000000000000000000000004D +:1081600000000000000000000000F0F0F0F0FF0050 +:108170000000FF000000FF000000FF000000FF0003 +:108180000000FF000000FF000000000000000000F1 +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000F0F0F0F0CF +:1081F000FF000000FF000000FF000000FF00000083 +:10820000FF000000FF000000FF0000000000000071 :10821000000000000000000000000000000000005E :10822000000000000000000000000000000000004E :10823000000000000000000000000000000000003E :10824000000000000000000000000000000000002E :10825000000000000000000000000000000000001E :10826000000000000000000000000000000000000E -:1082700020000000000100000000000001200001BB -:108280000000008804C000000000000100000000A1 -:1082900000000000000100000000000000200000BD -:1082A00000000002C0040000000000010000000007 -:1082B00000000000000000000000C00000010108F4 -:1082C0000000C0000082C0820000C0000001000069 -:1082D000000000000000000000000000000100207D -:1082E0000000C10000A0C0820000C000000100002A -:1082F00003008000000000040000000000200200D5 -:1083000005400300000000000000000000410000E4 -:108310000000000000000002000000000040080013 -:1083200000400500008000800000000000410000C7 -:108330000000000000000000000900000000000331 -:108340002080000484000000808000008000000382 -:108350000000000000000000000500000000000513 -:1083600040000040C000000080800000800000034A -:1083700000000000210000000000000010000000CC -:108380001000A0009000004020000000000000004D -:10839000800900000500000000000000200000002F -:1083A0001000A00090000000048000000000000009 -:1083B0008005000000002000000000000000050013 -:1083C0000000040040002080000003008000000046 -:1083D00000C08040000020000000000000000500F8 -:1083E00000001000A00020800000030080000000BA -:1083F000008080400000000000000000000001003C -:108400000000010040002140000101009000000038 -:108410000000C0000000000000000000000000009C -:1084200000000100020083400000010290000000F3 -:108430000000C0000000000001000000000000007B -:1084400000000000000084008504000001004000DE -:10845000000000C1820100000100000000000000D7 -:108460000000000001A0040041040000010004001D -:10847000000000C0820100000000C00000000000F9 -:1084800000000001C00000400000040000000000E7 -:1084900000000001000000000000000000000000DB -:1084A0000000000082000004000001000000000045 -:1084B00000000001000000000000000000000000BB -:1084C000000000000001040100080000010000009D +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F00000000F0F0000666600000F0F00006666AA +:10830000000066660000666600006666000066663D +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:10837000000000000F0F0000666600000F0F0000F5 +:1083800066660000666600006666000066660000BD +:108390006666000000000000000000000000000011 +:1083A00000000000000000000000000000000000CD +:1083B0000000000000000000000005610A0F050D2C +:1083C00000A000000000000000000000000000000D +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F00000000000406380048029920240E3800472 +:108400008029920240E380048029920240E38004A4 +:10841000802992020000000000000000000000001F +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:10847000000000000000FFFF000040FE50FABF3F78 +:108480001030003EC1FF553C553500F20DFFFD7D1B +:108490000828B0A0F1F50000000000000000000076 +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC :1084D000000000000000000000000000000000009C -:1084E000000000000001040100080000010000007D -:1084F00000000000000000000000000080000000FC -:10850000000000000010801000000000C10000000A -:10851000000000000041000000000000000000001A -:10852000000000000003000900800000200000009F -:1085300000000000004100000000000000000000FA -:1085400000000000000000208004008000004100C6 -:1085500000000000000000410000000000000000DA -:1085600000000000000000208002008000004100A8 -:10857000000000000000004100000000800000C179 -:1085800000000000800040000000008480000040E7 -:10859000000000000000000040840000800500830F -:1085A0000000000000000500000000C100000040C5 -:1085B0000000000000000000088300000020800090 -:1085C00000820000000000000500000000410000E3 -:1085D0000004000000410000000009850020800028 -:1085E00000C1000000408000820000000041000047 -:1085F00000040000004100000000400500004000B1 -:1086000000C10000000004008200000000410200E0 -:108610000000000000000000000001040000040051 -:108620000083000000009000820000000003400072 -:108630000000000000000000000001C00000000178 -:108640002000004100000000820082000000008342 -:108650008200000100000001000000000002000193 -:1086600020000040000000002000050000000091F4 -:1086700082000001000000010000000000820000F4 -:10868000000000000011000000000000000A41127C -:1086900000E00700000000000000000000000000F3 -:1086A0000000000000000000000000000000811237 -:1086B00000E007004800000000000000000A000081 -:1086C00000000000000000000000000000000000AA -:1086D000811200E0400048420000000000004842D3 -:1086E000000000000000000000000000000000008A -:1086F000811200E0400048420000000000004842B3 +:1084E000000000000000000000000000000000008C +:1084F0000000000000000000FF03FC0040FE50FAF6 +:10850000BF3F1030003EC1FF553C553500F20DFF16 +:10851000FD7D0828B0A0F1F500000000000000007B +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000100A00E1 +:1085800000000000000000000000000000300002B9 +:10859000000000400000100000000000000000008B +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000106B +:10860000000000000050000008000800000000000A +:1086100000020000004000001000000088008800F8 +:108620008800000088008800200020002000200032 +:1086300020008800200020000000400020002000D2 +:1086400020000000200020002000200020008800E2 +:108650002000200020002000000020000002200058 +:1086600020002000000020008800000020002000E2 +:1086700020000000200020002000880000004000B2 +:108680000000000000002000200084000000200006 +:10869000200000000000200020000000000000007A +:1086A000000000000000400000000000000000008A +:1086B00000000000000000000000000200000000B8 +:1086C0000000000000020000000010020000000096 +:1086D0000000000200000000000000000000000098 +:1086E0000000000000020000000000001002200056 +:1086F0004000000000000002000000000000000038 :108700000000000000000000000000000000000069 -:108710000000000000000000000000000000000059 +:108710000000000000000000000000020000000057 :108720000000000000000000000000000000000049 :108730000000000000000000000000000000000039 :108740000000000000000000000000000000000029 @@ -67720,154 +59526,154 @@ :108760000000000000000000000000000000000009 :1087700000000000000000000000000000000000F9 :1087800000000000000000000000000000000000E9 -:1087900000000000000000000000000000000000D9 -:1087A00000000000000000000000000000000000C9 -:1087B00000000000000000000000000000000000B9 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000000000000089 -:1087F0000000000000000000000000000000000079 -:1088000000000000757B0000000000000000000078 -:108810000000000000000000000000000000000058 -:108820000000DEAE757B00000000000000000000CC -:108830000000000000000000000000000000000038 -:108840000000DEAE0000757B0000000000000000AC +:108790000000880020008800000020002000000069 +:1087A00000000000000000080000000000000000C1 +:1087B0000008000800000008000800000000000891 +:1087C0000008000000000008000800080000000881 +:1087D0000008000800000008000800000000000871 +:1087E0000008000000000000000800080008000069 +:1087F0000008000820840000000800840000000039 +:108800000084008400000000000800840084000050 +:1088100000840084000000000084000000000000CC +:108820000000000000000000000000080008000038 +:108830000008000800000000000000000000000028 +:108840000000000000000000000000000000000028 :108850000000000000000000000000000000000018 -:1088600000000000DEAE757B00000000000000008C -:1088700000000000000000000000000000000000F8 -:1088800000000000DEAE6126034000000000000092 -:108890000230A0000000000000000C4000000000BA -:1088A000000002C064866126034000000000000052 -:1088B0000230A0000000000000000C40000000009A -:1088C000000002C064860000612603400000000032 -:1088D00000000230A0000000000000000C4000007A -:1088E0000000000002C06486612603400000000012 -:1088F00000000230A0000000000000000C4000005A -:108900000000000002C0648600028800000000042D -:1089100000008400000000000000000200002000B1 -:108920000000000000000000000000000000000047 -:108930000000000000000000000000000000000037 -:108940000000000000000000000000000000000027 +:108860000000000000000000000000000000000008 +:1088700000000000100000000000000000000000E8 +:1088800000000000000000050000C000000500001E +:108890000000000308030000000000000021002188 +:1088A00000059021002100000000000000000000F1 +:1088B00000000000000000000000000000000000B8 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 +:108900000000000003000800000008004100000013 +:10891000000000000000080000000000000000004F +:108920000000000008000000000008000000C00077 +:108930000000000000000000000082000040004035 +:1089400000000000000000000000820000000000A5 :108950000000000000000000000000000000000017 -:108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000000F7 -:1089800000000000000000000000000000000000E7 -:1089900000000000000000000500000000000000D2 -:1089A00000020000000000000400000000000000C1 -:1089B00000000000000000000000000000000000B7 +:108960000000A00000000000000000000000000067 +:1089700000000000000008000000000000000800E7 +:1089800000000000000000000000080000000800D7 +:1089900000000000000000030000820000028200CE +:1089A00000000000000000001100000000000000B6 +:1089B0000000000000000000000000400000000077 :1089C00000000000000000000000000000000000A7 :1089D0000000000000000000000000000000000097 -:1089E0004000050000000000000000000000000042 -:1089F0000000000000000000000000000000000077 +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000800000000000000080067 :108A00000000000000000000000000000000000066 -:108A10000000000000000000000000000000000056 -:108A20000000000000000000000000000000000046 -:108A30000200000000000000000000000000000034 +:108A100000000000000000000000000040002100F5 +:108A200000000000000000000000A00000000000A6 +:108A30000000000000000000000000000000000036 :108A40000000000000000000000000000000000026 :108A50000000000000000000000000000000000016 :108A60000000000000000000000000000000000006 :108A700000000000000000000000000000000000F6 -:108A800000000000000000000000000000000000E6 -:108A900000000000000000000000000002000000D4 -:108AA000000000020088000000000000002000001C +:108A80000000000000000800080000000800C0000E +:108A900000000000C00000000000C000C00008008E +:108AA00000080008080008000800C000C00000001E :108AB00000000000000000000000000000000000B6 :108AC00000000000000000000000000000000000A6 :108AD0000000000000000000000000000000000096 :108AE0000000000000000000000000000000000086 :108AF0000000000000000000000000000000000076 :108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B20000000000000000000000000000000000045 -:108B30000000000000000000000000000000000035 +:108B1000000000000300210000C000000000080069 +:108B20000000000000000084000000000800002099 +:108B3000000000000008000000000000000000002D :108B40000000000000000000000000000000000025 :108B50000000000000000000000000000000000015 -:108B60000000000000000000000000000000000005 +:108B600000000800000000000000000000000000FD :108B700000000000000000000000000000000000F5 :108B800000000000000000000000000000000000E5 -:108B90000000000000000300410041000000000050 -:108BA0000000000000000000008400000000000041 -:108BB000000000000900000041004100000000002A -:108BC00000000000000000000000000000000000A5 +:108B900008000000000000000000081108000000AC +:108BA0000005000000050021001100000008000081 +:108BB00000020000000000000000000000000000B3 +:108BC00000000000020000000000000000000000A3 :108BD0000000000000000000000000000000000095 :108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000021000300000051 +:108BF0000000000000000000000000000000000075 :108C00000000000000000000000000000000000064 :108C10000000000000000000000000000000000054 -:108C200000000000A000000900000000000000009B -:108C300000000000820000000000000000000000B2 +:108C2000000000000800000000000000000000003C +:108C300041000000000000000000000000000000F3 :108C40000000000000000000000000000000000024 :108C50000000000000000000000000000000000014 -:108C600000000000000000000000000000004000C4 -:108C7000000000000000A000000000000000000054 -:108C800000000000000000000000000000001000D4 -:108C900010000000000000000000000000000000C4 -:108CA00000000000000021000000000000000000A3 -:108CB00000000000000000000000000000000000B4 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000010001000100C0000110 +:108CA000000100C1001100000101004000080001A6 +:108CB000C00100C000000000000000000000000033 :108CC00000000000000000000000000000000000A4 :108CD0000000000000000000000000000000000094 :108CE0000000000000000000000000000000000084 :108CF0000000000000000000000000000000000074 :108D00000000000000000000000000000000000063 -:108D100000000000000000000000820000000000D1 -:108D200000000000000000000000000000800000C3 -:108D30000800000000000000000008000000000023 +:108D1000000000000000000000410041004100820E +:108D20000041004100C009C10540024100000000AF +:108D300000418041008900000000000000000000A8 :108D40000000000000000000000000000000000023 :108D50000000000000000000000000000000000013 :108D60000000000000000000000000000000000003 :108D700000000000000000000000000000000000F3 :108D800000000000000000000000000000000000E3 -:108D900000000000000000000000000000000000D3 -:108DA000000005000900090000002100000000107B -:108DB00000C00000000000002100000000000000D2 -:108DC000000000000800090000000300000000008F -:108DD00000000090000000002100000000000000E2 +:108D9000000000000000000000004100030000008F +:108DA000008041008900000008002000858000004C +:108DB0008800C100C10000838000000000000000A6 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 :108DE0000000000000000000000000000000000083 -:108DF0000000000000000000000000000000000073 -:108E0000000000000000000021000000030000003E -:108E10000000000000000000000000000000000052 -:108E2000000000000800000000000000000000003A -:108E3000000008000000000000000020000000000A +:108DF0000000000000000000000000020000000071 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000100010050 +:108E2000000000C00100C000000001000800200296 +:108E30000090C1004100C100000882000000000055 :108E40000000000000000000000000000000000022 -:108E5000000008000000000000000000000000000A +:108E50000000000000000000000000000000000012 :108E60000000000000000000000000000000000002 -:108E700000000000000004000000000040000000AE -:108E800000000400000000000000000000000000DE -:108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E9000000000000000000000000000000000C012 +:108EA0000001C0C100000000000100C002110091DB +:108EB000000100C1000000000001000000000000EF :108EC00000000000000000000000000000000000A2 :108ED0000000000000000000000000000000000092 :108EE0000000000000000000000000000000000082 :108EF0000000000000000000000000000000000072 :108F00000000000000000000000000000000000061 :108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 +:108F20000080004180C100000000004100C10088B5 +:108F30000041004100C100000000004100090000A4 :108F40000000000000000000000000000000000021 :108F50000000000000000000000000000000000011 :108F60000000000000000000000000000000000001 :108F700000000000000000000000000000000000F1 :108F800000000000000000000000000000000000E1 :108F900000000000000000000000000000000000D1 -:108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 +:108FA0000000C100800080C100004102000082007A +:108FB0004100C1418000801000004100000080009D +:108FC0004100000000000000000000000000000060 :108FD0000000000000000000000000000000000091 :108FE0000000000000000000000000000000000081 :108FF0000000000000000000000000000000000071 :109000000000000000000000000000000000000060 :109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 -:109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 +:1090200000000000C1004000C0C1000001000200BB +:1090300008000100C1210200C00100000100000081 +:10904000C00001000000000000000000000000005F :109050000000000000000000000000000000000010 :109060000000000000000000000000000000000000 :1090700000000000000000000000000000000000F0 :1090800000000000000000000000000000000000E0 :1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 +:1090A000000000000000000000000000004200007E +:1090B000000000000000811200410700480000008D +:1090C000000000004200000000000000000000005E :1090D0000000000000000000000000000000000090 :1090E0000000000000000000000000000000000080 :1090F0000000000000000000000000000000000070 @@ -67889,53 +59695,53 @@ :1091F000000000000000000000000000000000006F :10920000000000000000000000000000000000005E :10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E +:10922000000000000000000000000000757B00004E :10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E +:1092400000000000000000000000DEAE0000000092 :10925000000000000000000000000000000000000E :1092600000000000000000000000000000000000FE :1092700000000000000000000000000000000000EE :1092800000000000000000000000000000000000DE :1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E -:1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D +:1092A000000000000000000000000000000060C698 +:1092B00003000000000000000031E000000000009A +:1092C00000000C0000000000000000C06306000069 +:1092D00000002000000020002000200020002000CE +:1092E0000000200020080000000000042000000012 +:1092F00000002000000020002000200020042000AA +:1093000000002000200000000000000420040002F3 +:1093100000000000200000002000200020002000AD +:109320002000840020002000000000000004000055 +:109330000000000020000000200088002000000045 +:109340002000200020002000000001000000880410 :10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD +:1093600000000000000000000000000000020000FB :1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD +:10938000000000000000000040000000000200009B :1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD +:1093A00000000000000000000000000000000002BB :1093B00000000000000000000000000000000000AD -:1093C000000000000000000000000000000000009D -:1093D000000000000000000000000000000000008D -:1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C +:1093C000000000000000000000000000020000009B +:1093D0000000000002000000880000000000000003 +:1093E000000000000000000000000200000000007B +:1093F00000000000000000000200820082008200E5 +:1094000082000000000000000000000000000000DA :10941000000000000000000000000000000000004C -:10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C -:10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C +:10942000000000000000000008100800000000001C +:10943000080008000000000008000800000000000C +:10944000080008000000200020100800020084002E +:1094500008000800000000000000000000080000F4 +:1094600000000008000000000000000000080002EA +:1094700000000000000000000000000000080000E4 +:1094800000000008000000000000001000080000BC +:1094900000000000000000000000000000000008C4 +:1094A00000000000000800000000000000000008AC +:1094B00000000000000000000000000000000008A4 +:1094C000000000000008000000000000000000088C :1094D000000000000000000000000000000000008C :1094E000000000000000000000000000000000007C :1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B +:10950000000000000000400000000000000000001B :10951000000000000000000000000000000000004B :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B @@ -67947,24 +59753,24 @@ :1095900000000000000000000000000000000000CB :1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB -:1095C000000000000000000000000000000000009B -:1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B +:1095C0000000080003000000000000000000000090 +:1095D000000000000000000000000020000000006B +:1095E000000000410000000000000000000000003A :1095F000000000000000000000000000000000006B :10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A -:10963000000000000000000000000000000000002A -:10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A +:1096300000000000000040000000000000000000EA +:1096400000000000000000000000080800000020EA +:10965000000000094000A0090040010000000000D7 :1096600000000000000000000000000000000000FA :1096700000000000000000000000000000000000EA :1096800000000000000000000000000000000000DA :1096900000000000000000000000000000000000CA :1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A -:1096D000000000000000000000000000000000008A +:1096B00000000000000000000000000008000000A2 +:1096C0000000000000000000080000000000000092 +:1096D000000000000800000002000000040000007C :1096E000000000000000000000000000000000007A :1096F000000000000000000000000000000000006A :109700000000000000000000000000000000000059 @@ -67972,64 +59778,64 @@ :109720000000000000000000000000000000000039 :109730000000000000000000000000000000000029 :109740000000000000000000000000000000000019 -:109750000000000000000000000000000000000009 +:109750000000000000000000000002000000000007 :1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 :1097800000000000000000000000000000000000D9 :1097900000000000000000000000000000000000C9 :1097A00000000000000000000000000000000000B9 :1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 +:1097C0000000000000000000000000080000000091 +:1097D0000008000008000800088800008000002041 :1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 :109810000000000000000000000000000000000048 :109820000000000000000000000000000000000038 :109830000000000000000000000000000000000028 -:10984000000000008800000000000004000020006C -:109850000000000000000000000000000400000004 -:1098600000000002000004000000000000000000F2 -:1098700000000000000000000000000000000000E8 -:1098800000000004000000000400000000000000D0 -:1098900000000000100000040000000000000000B4 -:1098A00000000000000200000200000000000000B4 -:1098B0000000000020000000000000000000000088 -:1098C000000000000002000000000000000009008D +:109840000000000000000000000000000000080010 +:10985000000000000000A000000000000000000068 +:1098600000000000000000000000000000000000F8 +:1098700000000000110000000000000000000000D7 +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000000000000000000000000098 :1098D0000000000000000000000000000000000088 -:1098E0000000000000080000000000000000000070 +:1098E0000000000000000000000000000000000078 :1098F0000000000000000000000000000000000068 :109900000000000000000000000000000000000057 :109910000000000000000000000000000000000047 :109920000000000000000000000000000000000037 :109930000000000000000000000000000000000027 -:1099400040000000000000000000020000000000D5 -:1099500000002000020008000200020000000200D7 -:109960008400020000000000000000000000000071 +:109940000000000000000000000000000000000017 +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 :1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000020000000B7 +:1099800000000000000000000000000000000000D7 :1099900000000000000000000000000000000000C7 -:1099A0000000000000000000000000002000000097 +:1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 -:1099D0000000020000000040000000000000000045 -:1099E0000000000000000000000400000000000073 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 :1099F0000000000000000000000000000000000067 -:109A00000000000000000000000200000000000054 -:109A10000000000000000000000000000000020044 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 :109A20000000000000000000000000000000000036 :109A30000000000000000000000000000000000026 :109A40000000000000000000000000000000000016 :109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000000F6 -:109A70000000000000000000000084000000000062 +:109A60000000000000000000000000800000000076 +:109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 :109A900000000000000000000000000000000000C6 :109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 -:109AC0000000000000000000000000000000030093 +:109AC0000000000000000000000000000000000096 :109AD0000000000000000000000000000000000086 -:109AE0000000000000000000000000000000000076 +:109AE000000000000000000000000000000800006E :109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 :109B10000000000000000000000000000000000045 @@ -68037,7 +59843,7 @@ :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 -:109B600000000000000000000000002000000000D5 +:109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 :109B900000000000000000000000000000000000C5 @@ -68053,24 +59859,24 @@ :109C30000000000000000000000000000000000024 :109C40000000000000000000000000000000000014 :109C50000000000000000000000000000000000004 -:109C600000000000000000000000000000000000F4 +:109C600000000000000000000000000000020005ED :109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 :109C900000000000000000000000000000000000C4 :109CA00000000000000000000000000000000000B4 :109CB00000000000000000000000000000000000A4 :109CC0000000000000000000000000000000000094 -:109CD0000000000000000000000000000000030081 -:109CE000080000000000000000000000000000006C -:109CF000000000000000080000000000000000005C -:109D00000800000000000000000000000000080043 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000173 +:109CF00000000088000000000000000000000000DC +:109D00000000000000000000000000000000000053 :109D10000000000000000000000000000000000043 :109D20000000000000000000000000000000000033 :109D30000000000000000000000000000000000023 :109D40000000000000000000000000000000000013 :109D50000000000000000000000000000000000003 :109D600000000000000000000000000000000000F3 -:109D700000000000000000000000000000000000E3 +:109D7000008100000701000000000000000000005A :109D800000000000000000000000000000000000D3 :109D900000000000000000000000000000000000C3 :109DA00000000000000000000000000000000000B3 @@ -68094,7 +59900,7 @@ :109EC0000000000000000000000000000000000092 :109ED0000000000000000000000000000000000082 :109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 +:109EF000000000000000000000000000FFFF000064 :109F00000000000000000000000000000000000051 :109F10000000000000000000000000000000000041 :109F20000000000000000000000000000000000031 @@ -68110,8 +59916,8 @@ :109FC0000000000000000000000000000000000091 :109FD0000000000000000000000000000000000081 :109FE0000000000000000000000000000000000071 -:109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 +:109FF0000000000000000000000000000038000029 +:10A0000001A80000000000000000000000000000A7 :10A010000000000000000000000000000000000040 :10A020000000000000000000000000000000000030 :10A030000000000000000000000000000000000020 @@ -68144,38 +59950,38 @@ :10A1E000000000000000000000000000000000006F :10A1F000000000000000000000000000000000005F :10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE +:10A2100000000000000000000000200020002000DE +:10A22000200000000000000000000000000000000E +:10A2300000000000000000000000200020002000BE +:10A2400020000000000000000000000000000000EE +:10A2500000000000000000000000000020002000BE +:10A2600020002000000000000000000000000000AE +:10A2700000008400000000000000000000008400D6 +:10A28000200020000000000000000000000000008E +:10A2900000000000000000000000100000000000AE +:10A2A00000020000000000000000000000000000AC :10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E +:10A2C000000000020000000000004000000040000C +:10A2D000000000000000000000000000000040003E +:10A2E000000000020000000000000002000000006A :10A2F000000000000000000000000000000000005E -:10A30000000000000000000000000000000000004D +:10A300000000000000000000000200020000000049 :10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D :10A33000000000000000000000000000000000001D :10A34000000000000000000000000000000000000D :10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED -:10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000000CD -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D -:10A40000000000000000000000000000000000004C +:10A37000000000000000000000000000820000005B +:10A3800000008200000000000000000000008400C7 +:10A390000082000000000000000800000002000031 +:10A3A00000080000000000000000000000000000A5 +:10A3B000000800000000000000080000000000008D +:10A3C0000008000000000000000000000000000085 +:10A3D000000000080000000000000008000000006D +:10A3E0000000000800000000000000000000000065 +:10A3F000000000080000000000000008000000004D +:10A400000000000800000000000000000000000044 :10A41000000000000000000000000000000000003C :10A42000000000000000000000000000000000002C :10A43000000000000000000000000000000000001C @@ -68183,7 +59989,7 @@ :10A4500000000000000000000000000000000000FC :10A4600000000000000000000000000000000000EC :10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC +:10A4800000000000820000000000900000000000BA :10A4900000000000000000000000000000000000BC :10A4A00000000000000000000000000000000000AC :10A4B000000000000000000000000000000000009C @@ -68198,7 +60004,7 @@ :10A54000000000000000000000000000000000000B :10A5500000000000000000000000000000000000FB :10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000000000000000DB +:10A5700000000000000000000400000000000000D7 :10A5800000000000000000000000000000000000CB :10A5900000000000000000000000000000000000BB :10A5A00000000000000000000000000000000000AB @@ -68215,16 +60021,16 @@ :10A6500000000000000000000000000000000000FA :10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA +:10A6800000000000000000000000000008000800BA +:10A6900000000000C00000000000C000000000003A :10A6A00000000000000000000000000000000000AA :10A6B000000000000000000000000000000000009A :10A6C000000000000000000000000000000000008A :10A6D000000000000000000000000000000000007A :10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 +:10A7000000000000000000000000000000000090B9 +:10A7100000000000000000000000000000840008AD :10A720000000000000000000000000000000000029 :10A730000000000000000000000000000000000019 :10A740000000000000000000000000000000000009 @@ -68234,13 +60040,13 @@ :10A7800000000000000000000000000000000000C9 :10A7900000000000000000000000000000000000B9 :10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 +:10A7B00000000000200020880000000000000000D1 :10A7C0000000000000000000000000000000000089 :10A7D0000000000000000000000000000000000079 :10A7E0000000000000000000000000000000000069 :10A7F0000000000000000000000000000000000059 -:10A800000000000000000000040000110000000033 -:10A810000004000000000000000400000000000030 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 :10A820000000000000000000000000000000000028 :10A830000000000000000000000000000000000018 :10A840000000000000000000000000000000000008 @@ -68249,29 +60055,29 @@ :10A8700000000000000000000000000000000000D8 :10A8800000000000000000000000000000000000C8 :10A8900000000000000000000000000000000000B8 -:10A8A00000000000000000000000000000000002A6 +:10A8A00000000000000000000000000000000000A8 :10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000040000000000048 +:10A8C0000000000000000000000000000000000088 :10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000400028 -:10A8F0004000000000000000000000000000000018 -:10A900000000000000000000020000000400000041 -:10A9100000000000020000008200000002000000B1 -:10A920000000000004000000000000000000000023 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A920000000000000000000000000000000000027 :10A930000000000000000000000000000000000017 :10A940000000000000000000000000000000000007 :10A9500000000000000000000000000000000000F7 :10A9600000000000000000000000000000000000E7 :10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000004000000040000BF -:10A9900000000002000000000008000000000008A5 -:10A9A00000000000000000000004000000000000A3 -:10A9B0000000000000000000004000000000000255 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 :10A9C0000000000000000000000000000000000087 :10A9D0000000000000000000000000000000000077 :10A9E0000000000000000000000000000000000067 :10A9F0000000000000000000000000000000000057 -:10AA0000000000000000000000000008000000003E +:10AA00000000000000000000000000000000000046 :10AA10000000000000000000000000000000000036 :10AA20000000000000000000000000000000000026 :10AA30000000000000000000000000000000000016 @@ -68282,7 +60088,7 @@ :10AA800000000000000000000000000000000000C6 :10AA900000000000000000000000000000000000B6 :10AAA00000000000000000000000000000000000A6 -:10AAB000000008000000000000000000000000008E +:10AAB0000000000000000000000000000000000096 :10AAC0000000000000000000000000000000000086 :10AAD0000000000000000000000000000000000076 :10AAE0000000000000000000000000000000000066 @@ -68396,47 +60202,47 @@ :10B1A000000000000000000000000000000000009F :10B1B000000000000000000000000000000000008F :10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000000000FE +:10B1D0000008000200000000200000000000000045 +:10B1E000000010002000000000000000000000002F +:10B1F000000000000004000020000000000000002B +:10B2000000002000200000040003000000000000F7 +:10B210000000000000000004000420000000000006 +:10B2200000000000200020000000000000000000DE +:10B2300000000000000000040000200000000100E9 +:10B2400000000000200020000000000000000002BC :10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE +:10B2600000000000000000020000000000000000DC +:10B27000000040000000004000000000000000004E +:10B2800000000000000000020000000000000000BC :10B2900000000000000000000000000000000000AE :10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E +:10B2B000000000000000000000020000000000008C +:10B2C00010000000000000000000000082000000EC +:10B2D0000000000000000000000000000400040066 +:10B2E000002000200000000000000000000000001E +:10B2F0000000000002000200020002000000000046 :10B30000000000000000000000000000000000003D :10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D +:10B32000000000000000000000000000000002001B +:10B330000200001000000200020000008200020073 +:10B3400000400000820002000200820000000000B5 +:10B350000000000800000004000000000000800859 +:10B360008008000100010002000000000000000051 +:10B3700000000008000000080000000000000008B5 +:10B3800000080000000000000000000000000000B5 +:10B390000000000000100000000800000000000095 +:10B3A000000800080000000000000000000000008D +:10B3B0000000000000000000000800000000000085 +:10B3C000000800080000000000000000000000006D :10B3D000000000000000000000000000000000006D :10B3E000000000000000000000000000000000005D :10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C +:10B4000040000000000000000000000000000000FC :10B41000000000000000000000000000000000002C :10B42000000000000000000000000000000000001C :10B43000000000000000000000000000000000000C :10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC +:10B4500000000000000000000000002000000000CC :10B4600000000000000000000000000000000000DC :10B4700000000000000000000000000000000000CC :10B4800000000000000000000000000000000000BC @@ -68444,22 +60250,22 @@ :10B4A000000000000000000000000000000000009C :10B4B000000000000000000000000000000000008C :10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C +:10B4D000000000002000000000000000000000004C :10B4E000000000000000000000000000000000005C :10B4F000000000000000000000000000000000004C :10B50000000000000000000000000000000000003B :10B51000000000000000000000000000000000002B :10B52000000000000000000000000000000000001B :10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB +:10B5400000000000010000000008000001000000F1 +:10B5500000040000000000000000000000000000E7 :10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB +:10B5700008000000000000000000000000000000C3 :10B5800000000000000000000000000000000000BB :10B5900000000000000000000000000000000000AB :10B5A000000000000000000000000000000000009B :10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B +:10B5C0000000000000000400000000010000200056 :10B5D000000000000000000000000000000000006B :10B5E000000000000000000000000000000000005B :10B5F000000000000000000000000000000000004B @@ -68467,203 +60273,203 @@ :10B61000000000000000000000000000000000002A :10B62000000000000000000000000000000000001A :10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA +:10B6400000000000000000200000010000000000D9 +:10B65000008000000000000000000000000000006A :10B6600000000000000000000000000000000000DA :10B6700000000000000000000000000000000000CA :10B6800000000000000000000000000000000000BA :10B6900000000000000000000000000000000000AA :10B6A000000000000000000000000000000000009A :10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000000000000000000000005A +:10B6C0000000000000000000000100001000000069 +:10B6D0000000000800000000000000000000000062 +:10B6E000000000002000000000000000000000003A :10B6F000000000000000000000000000000000004A :10B700000000000000000000000000000000000039 :10B710000000000000000000000000000000000029 :10B720000000000000000000000000000000000019 :10B730000000000000000000000000000000000009 -:10B7400000000000000000020000000200000000F5 -:10B7500000000000000300000000000000000000E6 -:10B7600000000000000000000000000000040000D5 +:10B7400000000000000002000000000000000000F7 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 :10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000004B5 +:10B7800000000000000000000000000000000000B9 :10B7900000000000000000000000000000000000A9 -:10B7A0000002000000000000000000000000000097 +:10B7A0000000000000000000000000000000000099 :10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000001000474 -:10B7D0000000000000000000000000000000000069 +:10B7C00000000000000000008000000000000000F9 +:10B7D0000000000400000000000000000000000065 :10B7E0000000000000000000000000000000000059 -:10B7F0000000000200000000000000000000000047 +:10B7F0000000000000000000000000000000000049 :10B800000000000000000000000000000000000038 :10B810000000000000000000000000000000000028 -:10B8200000000000000000000000400000000000D8 -:10B830000004000000000000000000000000000004 -:10B840000000000000000000020021004000410054 -:10B8500000000000200000000200400000008802FC -:10B860004000000000000000000000000200000096 -:10B8700002000000000000000000020000000000C4 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000090000090D8 +:10B8500000000100000000000000000000000000E7 +:10B8600000000000000000000000000000000000D8 +:10B870000000400000000000000000000000000088 :10B8800000000000000000000000000000000000B8 :10B8900000000000000000000000000000000000A8 :10B8A0000000000000000000000000000000000098 :10B8B0000000000000000000000000000000000088 -:10B8C00000000000000000000000000040008200B6 -:10B8D00090000082000000000000000080000000D6 -:10B8E0000001808200000200000000000000000053 -:10B8F0000000000000000000000000000000000048 +:10B8C00000000000000000000000000011008000E7 +:10B8D0000000000011000021000000000000000036 +:10B8E0000000000000000000000000000000000058 +:10B8F00000000000000000000000008000000000C8 :10B900000000000000000000000000000000000037 :10B910000000000000000000000000000000000027 -:10B920000000000000000000040000000000000013 +:10B920000000000000000000000000000000000017 :10B930000000000000000000000000000000000007 -:10B9400000000000000000000000004000000000B7 -:10B9500000000000000000000000000000000000E7 +:10B9400000000000000000000000000000000000F7 +:10B9500000800000008000200000110800000000AE :10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 +:10B97000000000000000000000C0000000C0000047 :10B9800000000000000000000000000000000000B7 :10B9900000000000000000000000000000000000A7 :10B9A0000000000000000000000000000000000097 :10B9B0000000000000000000000000000000000087 :10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 +:10B9D00000000020000000C0000000000100000086 :10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 +:10B9F0000000000000000000000000004000000007 :10BA00000000000000000000000000000000000036 :10BA10000000000000000000000000000000000026 :10BA20000000000000000000000000000000000016 :10BA30000000000000000000000000000000000006 :10BA400000000000000000000000000000000000F6 -:10BA500000000800000008000002000000000000D4 -:10BA60000000000000040000000000000000C00012 -:10BA700000000000000000000000000000000000C6 +:10BA500000000100008888000100000020000001B3 +:10BA600001000000000000000000000000000000D5 +:10BA70000000000000000000000005000000800041 :10BA800000000000000000000000000000000000B6 :10BA900000000000000000000000000000000000A6 :10BAA0000000000000000000000000000000000096 :10BAB0000000000000000000000000000000000086 :10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000040000010000000061 -:10BAE00000000082000000000000000000000000D4 -:10BAF0000000000000000000000010000000000036 -:10BB000041000000000000000000000000000000F4 +:10BAD000000000004100008000000900000080001C +:10BAE0000008080000000000000000000000000046 +:10BAF0000000000000000000000000000020000026 +:10BB00000000000000000000000000000000000035 :10BB10000000000000000000000000000000000025 :10BB20000000000000000000000000000000000015 :10BB30000000000000000000000000000000000005 :10BB400000000000000000000000000000000000F5 -:10BB50000000000088000000900004000400900035 -:10BB60000000400000000000000000020800000487 -:10BB700000000000000000000000000004000000C1 +:10BB5000000000000000001100000080000000054F +:10BB600011000000000000000000000000000000C4 +:10BB700000000000000000000000000000000001C4 :10BB800000000000000000000000000000000000B5 :10BB900000000000000000000000000000000000A5 :10BBA0000000000000000000000000000000000095 :10BBB0000000000000000000000000000000000085 :10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000001000054 +:10BBD0000000000000000000000100000040000024 +:10BBE0000000010000000000000000000000000054 :10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 +:10BC0000004100000700000A0000000000000000E2 :10BC10000000000000000000000000000000000024 :10BC20000000000000000000000000000000000014 :10BC30000000000000000000000000000000000004 :10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 +:10BC500000000000000000000000000000000700DD +:10BC60008221000000E00000000000000000000051 :10BC700000000000000000000000000000000000C4 :10BC800000000000000000000000000000000000B4 :10BC900000000000000000000000000000000000A4 :10BCA0000000000000000000000000000000000094 :10BCB0000000000000000000000000000000000084 :10BCC0000000000000000000000000000000000074 -:10BCD000000000000000000008000000000000005C -:10BCE0000000000000004100410000000020410071 +:10BCD0000000000000000000000000000000000064 +:10BCE000F0F0000000000000000000000000000074 :10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000030000000000000030 +:10BD00000000000000000000000000000000000033 :10BD10000000000000000000000000000000000023 :10BD20000000000000000000000000000000000013 :10BD30000000000000000000000000000000000003 :10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000001E2 -:10BD6000000088000000000000000000000000004B -:10BD70000001400000000000000000000000000082 +:10BD500000000000000000000000000000000000E3 +:10BD60000000F0F0000000000000000000000000F3 +:10BD700000000000000000000000000000000000C3 :10BD800000000000000000000000000000000000B3 :10BD900000000000000000000000000000000000A3 :10BDA0000000000000000000000000000000000093 :10BDB0000000000000000000000000000000000083 :10BDC0000000000000000000000000000000000073 :10BDD0000000000000000000000000000000000063 -:10BDE00020410821000300200000000000000000A6 -:10BDF00000080321001100080000000000000000FE +:10BDE00000000F0F0000FFFF000000000000000037 +:10BDF0000000000000000000000000000000000043 :10BE00000000000000000000000000000000000032 :10BE10000000000000000000000000000000000022 :10BE20000000000000000000000000000000000012 :10BE30000000000000000000000000000000000002 :10BE400000000000000000000000000000000000F2 :10BE500000000000000000000000000000000000E2 -:10BE6000000010001000000010080000000000009A -:10BE70000000100020000000002100000000000071 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 +:10BE6000000000000F0F00000000000000000000B4 +:10BE700000000000000000000000000000000000C2 +:10BE80000000000000000000000005180A20050066 +:10BE900005A00000000000000000000000000000FD :10BEA0000000000000000000000000000000000092 :10BEB0000000000000000000000000000000000082 :10BEC0000000000000000000000000000000000072 :10BED0000000000000000000000000000000000062 -:10BEE000000000000120010000000101000000002E -:10BEF0000000000001200000000000010000000020 +:10BEE0000000000005002A00054000A80000000630 +:10BEF000000C000000000000000000000000000036 :10BF00000000000000000000000000000000000031 :10BF10000000000000000000000000000000000021 :10BF20000000000000000000000000000000000011 :10BF30000000000000000000000000000000000001 :10BF400000000000000000000000000000000000F1 :10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000A0010000000030 -:10BF700000000000000000000100000100010000BE +:10BF600000000000000000000000000000000000D1 +:10BF7000FF0000FF000000000000000000000000C3 :10BF800000000000000000000000000000000000B1 :10BF900000000000000000000000000000000000A1 :10BFA0000000000000000000000000000000000091 :10BFB0000000000000000000000000000000000081 :10BFC0000000000000000000000000000000000071 :10BFD0000000000000000000000000000000000061 -:10BFE000000000000000000000204120A02100030C -:10BFF0000000000000000000004008084121000887 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000FF0000FF0000000000000000000043 :10C000000000000000000000000000000000000030 :10C010000000000000000000000000000000000020 :10C020000000000000000000000000000000000010 :10C030000000000000000000000000000000000000 :10C0400000000000000000000000000000000000F0 :10C0500000000000000000000000000000000000E0 -:10C06000000000000000000000002000410000006F -:10C070000300000000000000000010081000030092 -:10C080002010000000000000000000000000000080 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000FF0000FF0000000000000000C2 +:10C0800000000000000000000000000000000000B0 :10C0900000000000000000000000000000000000A0 :10C0A0000000000000000000000000000000000090 :10C0B0000000000000000000000000000000000080 :10C0C0000000000000000000000000000000000070 :10C0D0000000000000000000000000000000000060 :10C0E0000000000000000000000000000000000050 -:10C0F000000000000000000000000000010001003E +:10C0F000000000000000FF0000FF00000000000042 :10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF +:10C11000000000000000000000000000000010000F +:10C12000000000000000840000000000000000008B +:10C1300000000000000000000000000000002000DF +:10C1400000000000000000002000000000000000CF :10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF +:10C1600000000000000000002000000000000000AF :10C1700000000000000000000000000000000000BF :10C1800000000000000000000000000000000000AF :10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F +:10C1A000000000020000000000000000008200000B +:10C1B00000020040100040000000000200000000EB +:10C1C000000000000000000040000000000200002D +:10C1D0000000000200020000000000000000000259 :10C1E000000000000000000000000000000000004F :10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E +:10C20000000000020000000200000000000000002A :10C21000000000000000000000000000000000001E :10C22000000000000000000000000000000000000E :10C2300000000000000000000000000000000000FE :10C2400000000000000000000000000000000000EE :10C2500000000000000000000000000000000000DE :10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE +:10C2700000000000000000000000020000000200BA +:10C2800000000000020000000000000000000000AC :10C29000000000000000000000000000000000009E :10C2A000000000000000000000000000000000008E :10C2B000000000000000000000000000000000007E @@ -68686,391 +60492,391 @@ :10C3C000000000000000000000000000000000006D :10C3D000000000000000000000000000000000005D :10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D +:10C3F0000000000000000000040000000000000039 :10C40000000000000000000000000000000000002C :10C41000000000000000000000000000000000001C :10C42000000000000000000000000000000000000C :10C4300000000000000000000000000000000000FC :10C4400000000000000000000000000000000000EC :10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C470000000000000000000000000610006000D48 -:10C480000000000000000000000000610006000D38 +:10C4600000000000000000000000000008000000C4 +:10C4700000000000000000000000000000000000BC +:10C48000000000000040000000000040000000002C :10C49000000000000000000000000000000000009C :10C4A000000000000000000000000000000000008C :10C4B000000000000000000000000000000000007C :10C4C000000000000000000000000000000000006C :10C4D000000000000000000000000000000000005C :10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000003CC3FF3E -:10C5000014BEFAFA0000000000000000AFFAEBEBE6 -:10C510005F505F50000000000000000000000000BD +:10C4F000000000000000000000000000000000003C +:10C500000000000000000000090000000000000022 +:10C51000000000000000000000000000000000001B :10C52000000000000000000000000000000000000B :10C5300000000000000000000000000000000000FB :10C5400000000000000000000000000000000000EB :10C5500000000000000000000000000000000000DB :10C5600000000000000000000000000000000000CB -:10C570000000000000000000000000000000EBEBE5 -:10C58000EBEB14BE50500000000000000000A00AB9 -:10C590002828CFCFC0C0000000000000000000002D +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B :10C5A000000000000000000000000000000000008B :10C5B000000000000000000000000000000000007B :10C5C000000000000000000000000000000000006B :10C5D000000000000000000000000000000000005B :10C5E000000000000000000000000000000000004B :10C5F000000000000000000000000000000000003B -:10C600003C3C5555F0F03C3C0000000000000000B0 -:10C61000404340433A3A3A3A00000000000000002C +:10C60000000003000000008400040000000000841B +:10C61000000000000000000000000000000000001A :10C62000000000000000000000000000000000000A :10C6300000000000000000000000000000000000FA :10C6400000000000000000000000000000000000EA :10C6500000000000000000000000000000000000DA :10C6600000000000000000000000000000000000CA :10C6700000000000000000000000000000000000BA -:10C6800000000F0FFF00F0F03C3C00000000000035 -:10C690000000F0F300033A3A3A3A000000000000CC +:10C6800000000000000000000000000000000000AA +:10C690000002000000000000000200000000000096 :10C6A000000000000000000000000000000000008A :10C6B000000000000000000000000000000000007A :10C6C000000000000000000000000000000000006A :10C6D000000000000000000000000000000000005A :10C6E000000000000000000000000000000000004A -:10C6F00000000000000000000000000088804000F2 -:10C7000000100000000010000010000000050000F4 -:10C710000002000000000000000000040000000013 -:10C720000000000400000000000000000002000003 -:10C7300000000000000000000000000000010000F8 +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 :10C7400000000000000000000000000000000000E9 :10C7500000000000000000000000000000000000D9 :10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000010A9 -:10C7800000000001000000000000000100000000A7 -:10C790000002008500020000000000000000000010 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 :10C7A0000000000000000000000000000000000089 -:10C7B0000000210000000000000000000000000058 +:10C7B0000000000000000000000000000000000079 :10C7C0000000000000000000000000000000000069 -:10C7D00000000000000000004000400000000000D9 +:10C7D0000000000000000000000000000000000059 :10C7E0000000000000000000000000000000000049 :10C7F0000000000000000000000000000000000039 -:10C800002040210000000400080089000800040006 -:10C81000A0800502848204000200040008C0040015 -:10C820000000001003800400000000000000000071 -:10C83000200420800482200000000000000000008E +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 :10C8400000000000000000000000000000000000E8 :10C8500000000000000000000000000000000000D8 :10C8600000000000000000000000000000000000C8 :10C8700000000000000000000000000000000000B8 -:10C8800000000001040000848000C000040080005B -:10C8900080000010C008401180008002A0048011B8 -:10C8A000800000000005042080000000000040001F -:10C8B00000008001C12080218000000000000000F5 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 :10C8C0000000000000000000000000000000000068 :10C8D0000000000000000000000000000000000058 :10C8E0000000000000000000000000000000000048 :10C8F0000000000000000000000000000000000038 -:10C90000000000000100000900000000000090008D -:10C9100000000000000400400008001100000000BA -:10C9200000090000002100100021000000000000AC -:10C9300000000000002000000002000000000000D5 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 :10C9400000000000000000000000000000000000E7 :10C9500000000000000000000000000000000000D7 :10C9600000000000000000000000000000000000C7 :10C9700000000000000000000000000000000000B7 -:10C980000000000000000200100011000400000080 -:10C99000000000000000400041000000008802008C -:10C9A00000000000008200000001000000200000E4 -:10C9B0000000000000000001000000010000000075 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 :10C9C0000000000000000000000000000000000067 :10C9D0000000000000000000000000000000000057 :10C9E0000000000000000000000000000000000047 :10C9F0000000000000000000000000000000000037 -:10CA000000000000000000000210100000210000E3 -:10CA1000000004001000000010100421401000026B -:10CA20000000001110000000C00000008400C000E1 -:10CA300000000000000000000000002000000000D6 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 :10CA400000000000000000000000000000000000E6 :10CA500000000000000000000000000000000000D6 :10CA600000000000000000000000000000000000C6 :10CA700000000000000000000000000000000000B6 -:10CA80000000000000000000000080010000000025 -:10CA90000000000080000000000000018000800114 -:10CAA0000001000000000000000000004100000044 -:10CAB0000000000000000000000000000001000075 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 :10CAC0000000000000000000000000000000000066 :10CAD0000000000000000000000000000000000056 :10CAE0000000000000000000000000000000000046 :10CAF0000000000000000000000000000000000036 -:10CB0000000000000000000000000000080008080D -:10CB10004108000040038200A02100000004C00082 -:10CB200000040011C01004000805000008210800DE -:10CB300000204000C0001000C00004000000000001 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 :10CB400000000000000000000000000000000000E5 :10CB500000000000000000000000000000000000D5 :10CB600000000000000000000000000000000000C5 :10CB700000000000000000000000000000000000B5 :10CB800000000000000000000000000000000000A5 -:10CB900000000200000003040004210008820000DD -:10CBA0000000000000004091880000040800000020 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 :10CBC0000000000000000000000000000000000065 :10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 :10CBF0000000000000000000000000000000000035 :10CC00000000000000000000000000000000000024 -:10CC100000000409400000000000C0008421000062 -:10CC20000000C00000000000000000030000000041 -:10CC30000000000000210000000010008200C00081 -:10CC400000000000000000000000000000020000E2 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 :10CC500000000000000000000000000000000000D4 :10CC600000000000000000000000000000000000C4 :10CC700000000000000000000000000000000000B4 :10CC800000000000000000000000000000000000A4 -:10CC9000000000008000000000000800000000000C -:10CCA000000000000000000800000000100000006C -:10CCB0000000080000000000000000000800000064 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 :10CCC0000000000000000000000000000000000064 :10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 :10CCF0000000000000000000000000000000000034 :10CD00000000000000000000000000000000000023 -:10CD10000000000000A000900008009000100090AB -:10CD20000010029002A0A0919082009002A00090BA -:10CD30000090009040000090000890020000000069 -:10CD400000000000910300909021042100000000E9 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000020000E1 :10CD500000000000000000000000000000000000D3 :10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD9000000000000000008000800080008008800B -:10CDA00000800080808080A00290009000838080BE -:10CDB00000800000008080000000000080800000F3 -:10CDC00000000000000010910303401080020000EA -:10CDD0000000000000000000000000000000000053 +:10CD700000040000000000000000000000000000AF +:10CD8000000000000004000000000000000000009F +:10CD9000000000040004000000000000000000008B +:10CDA0000000000000000000000000000000000083 +:10CDB000000000040000000000000000000000006F +:10CDC0000000000000000000000000000000400023 +:10CDD000000200024000000000000000000000000F :10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 +:10CDF00000000090000000000000000000000000A3 :10CE00000000000000000000000000000000000022 -:10CE10000000000000000000800000008000800092 -:10CE200000008021808080000000200880008008B1 -:10CE30000000000080008000000000000010800062 -:10CE400000000000000000000080200580904002EB -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 +:10CE10000000000000020000000000000000000010 +:10CE20000000000000000000000000000000000002 +:10CE30000000000000900000000000400010021000 +:10CE400000000000000000000000000000000000E2 +:10CE50000000000000000000000000000000004092 +:10CE600002000200020002000000000000000000BA :10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000010000200A000E0 -:10CEA000900002000400A0A09000A088A001A000B3 -:10CEB000900090004000A088900090004000400149 -:10CEC0009000000000000000000008400900084138 -:10CED00090010000000000000000000000000000C1 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF1000000000000000000000000000020200020B -:10CF200000820200108800000004040008020008CB -:10CF300001011000900000000040C010004000A05F -:10CF400090080020000000000000000090880121EF -:10CF50000089A1A100000000000000000000000006 -:10CF600000000000000000000000000000000000C1 +:10CE8000000000000000000000000000000008405A +:10CE9000004000000000004000400000080000408A +:10CEA00000400000000000400040000002000000C0 +:10CEB00000400000824000400040000800000000E8 +:10CEC0000000000000000008000000000000000852 +:10CED0000008000000000008000800080000000032 +:10CEE0000000000000000008000000000000000832 +:10CEF0000008000000000008000800000008000012 +:10CF00000000000000000000000800000000000019 +:10CF100000080008000000000008000800080000E9 +:10CF200000000000000000000008000000000000F9 +:10CF300000080008000000000008000800000000D1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF60000000000000000000000000004000000081 :10CF700000000000000000000000000000000000B1 :10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000008011 -:10CFA000000000000300800000000080000000C0BE -:10CFB00000C02121101100000000000080800080CE -:10CFC0000080800000000000000000000000004021 -:10CFD0001103032191820000000000000000000006 -:10CFE0000000000000000000000000000000000041 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB00000008800000000000000000000000000E9 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000020000021 :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 :10D010000000000000000000000000000000000010 -:10D020000000808800800000000300A10000800054 -:10D03000A1881185058020080000802000000000E4 -:10D0400000000020000000000000000000000000C0 -:10D0500003009108050011200000000000000000FE +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D050000000000000000000004000000000000090 :10D0600000000000000000000000000000000000C0 :10D0700000000000000000000000000000000000B0 :10D0800000000000000000000000000000000000A0 :10D090000000000000000000000000000000000090 -:10D0A000000000008210820890000000901008022A -:10D0B0001000030220200084010100000490008879 -:10D0C0004000000000900008000000000000000088 -:10D0D000000090000310200809000000000000007C +:10D0A0000000000000000000000000000000000080 +:10D0B000000000000000000000000040000000022E +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 :10D10000000000000000000000000000000000001F :10D11000000000000000000000000000000000000F -:10D1200000000000000000000700000000000000F8 -:10D1300007000000000000000700000000000000E1 -:10D14000070000820000000007000000000000004F -:10D1500000000000000000E00700000000000000E8 +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000040040000000000000AB +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF :10D1600000000000000000000000000000000000BF :10D1700000000000000000000000000000000000AF :10D18000000000000000000000000000000000009F :10D19000000000000000000000000000000000008F -:10D1A0000000000000000CFC0CFCF03CF03C4D4D7D -:10D1B0004D4D3CFF3CFFFFFF00FFE8E8E8E8AA3CDC -:10D1C000AA3C00AA55FF00000000BEFA3C3C00004B -:10D1D000000000000000FF553C3CBCFDB4F5000021 +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F :10D1E000000000000000000000000000000000003F :10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E :10D21000000000000000000000000000000000000E -:10D2200000000000000000000CFC0CFCF03CF03C96 -:10D23000FF00FF003C003C00000000FFE8E8E8E8D9 -:10D24000AA3CAA3C00AA55FF0000000014503C3C38 -:10D250000000000000000000FA503C3C3C3C14146C +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE :10D2600000000000000000000000000000000000BE :10D2700000000000000000000000000000000000AE :10D28000000000000000000000000000000000009E :10D29000000000000000000000000000000000008E -:10D2A000000000000000000000007D287D28FD5DDA -:10D2B000A808FF00FF00BF3D83013F303F30BF1F84 -:10D2C000B010FF00FF00BF3D83013F033F03BF3DA0 -:10D2D000830100000000000000000FFF0F3F00006E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E :10D2E000000000000000000000000000000000003E :10D2F000000000000000000000000000000000002E :10D30000000000000000000000000000000000001D :10D31000000000000000000000000000000000000D -:10D32000000000000000000000000000FF0AF500FF -:10D33000FDFD08085C5CFC0CBFBF0101FF50AF00A5 -:10D34000BFBF1010FC5CAC0CBFBF01013F033F032B -:10D35000BFBF010100000000000000000FAF0FAFD1 -:10D3600057FFD7FF00000000000000000000000091 +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D34000000000000000000040000000000000009D +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD :10D3700000000000000000000000000000000000AD :10D38000000000000000000000000000000000009D :10D39000000000000000000000000000000000008D -:10D3A00000000000000000000000000000008000FD -:10D3B00000080010000000000008000000000061EC -:10D3C000000E000D000080000008001000000000AA -:10D3D00000080000000000000000000000000061E4 -:10D3E000000900090000000000000000000000002B +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D :10D3F000000000000000000000000000000000002D :10D40000000000000000000000000000000000001C :10D41000000000000000000000000000000000000C :10D4200000000000000000000000000000000000FC :10D4300000000000000000000000000000000000EC -:10D44000FDFDC1C100000000000000000000000060 +:10D4400000000000000000000000000000000000DC :10D4500000000000000000000000000000000000CC -:10D46000FF00FF00287DF0F0000000000000000039 +:10D4600000000000000000000000000000000000BC :10D4700000000000000000000000000000000000AC :10D48000000000000000000000000000000000009C :10D49000000000000000000000000000000000008C :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C -:10D4C00000007DFF41C301000000000000000000DB +:10D4C000000000000000000000000000000000005C :10D4D000000000000000000000000000000000004C -:10D4E00000001E1EBE147878F0F00000000000005E +:10D4E000000000000000000000000000000000003C :10D4F000000000000000000000000000000000002C :10D50000000000000000000000000000000000001B :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB -:10D54000000000003033F0F3F0F0F0F000000000D5 +:10D5400000000000000000000000000000000000DB :10D5500000000000000000000000000000000000CB -:10D5600000000000FDFDC101AAAAF0F000000000CB +:10D5600000000000000000000000000000000000BB :10D5700000000000000000000000000000000000AB :10D58000000000000000000000000000000000009B :10D59000000000000000000000000000000000008B :10D5A000000000000000000000000000000000007B :10D5B000000000000000000000000000000000006B -:10D5C0000000000000003C3FFCFFAAAAAAAA00003D +:10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B -:10D5E0000000000000003DFD0101AAAAF0F00000CB +:10D5E000000000000000000000000000000000003B :10D5F000000000000000000000000000000000002B :10D60000000000000000000000000000000000001A :10D61000000000000000000000000000000000000A :10D6200000000000000000000000000000000000FA -:10D63000000000000000000088000000C0000000A2 -:10D6400000020000200000000000000000020000B6 -:10D6500000000000000000020000000000000000C8 +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA :10D6600000000000000000000000000000000000BA -:10D6700000000000000000020000000000000000A8 +:10D6700000000000000000000000000000000000AA :10D68000000000000000000000000000000000009A -:10D690000000000000000000000200000000000088 +:10D69000000000000000000000000000000000008A :10D6A000000000000000000000000000000000007A -:10D6B0000000000000000000000200000000000068 +:10D6B000000000000000000000000000000000006A :10D6C000000000000000000000000000000000005A -:10D6D0000000000000000000400400000000000006 +:10D6D000000000000000000000000000000000004A :10D6E000000000000000000000000000000000003A -:10D6F0000000000000000000000400000000000026 -:10D7000000000000000000000040000000000000D9 -:10D7100000000000400000000000000400000000C5 +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 :10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000800000000E1 -:10D740000000000000000000000082000000000057 -:10D75000000002000040040004000000000000007F -:10D760000000000000000000000000008800000031 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 -:10D780000200000000000000000000000000000097 +:10D780000000000000000000000000000000000099 :10D790000000000000000000000000000000000089 -:10D7A0000200000000000000000000000000000077 +:10D7A0000000000000000000000000000000000079 :10D7B0000000000000000000000000000000000069 -:10D7C00000020000000200000000021002840008B5 -:10D7D0000000000000000400000000000000000045 -:10D7E00000000000400400000000000000000008ED -:10D7F0000000000800000000000000000008000019 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 :10D800000000000000000000000000000000000018 -:10D8100000020000000200000000000000000008FC +:10D810000000000000000000000000000000000008 :10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000004E4 -:10D840000000000000000000000084000000000054 -:10D850000000000084080000880088009000840810 -:10D860000000880000000000000000000000000030 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 :10D8700000000000000000000000000000000000A8 -:10D880000000000000200000000000000000000078 +:10D880000000000000000000000000000000000098 :10D890000000000000000000000000000000000088 :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 -:10D8C00000000000000008000000210008004100E6 -:10D8D000000000000000100000000000008821008F -:10D8E000109000000000000000000000410008004F -:10D8F000030005000000000000000000000400001C +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 :10D900000000000000000000000000000000000017 :10D910000000000000000000000000000000000007 :10D9200000000000000000000000000000000000F7 :10D9300000000000000000000000000000000000E7 -:10D940000000000000000040000000000000004057 -:10D9500000000009084000400000000000000840EE -:10D96000000008000800A0000000000900000000FE +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 :10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 :10D990000000000000000000000000000000000087 :10D9A0000000000000000000000000000000000077 :10D9B0000000000000000000000000000000000067 -:10D9C000000000000000000000000000080021002E -:10D9D0000000001000000800050005000900050017 -:10D9E00020001000000000001000210000001000C6 -:10D9F0000000000000001000040000000000000013 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 :10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000040000000000E2 -:10DA400000000000000000000000000000000808C6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 :10DA500000000000000000000000000000000000C6 -:10DA600000000000000000000000000008000000AE +:10DA600000000000000000000000000000000000B6 :10DA700000000000000000000000000000000000A6 :10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 :10DAA0000000000000000000000000000000000076 :10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000004016 -:10DAD0000000009011200000080009020904000065 -:10DAE00000001000050000881090030021000000D5 -:10DAF00021000000000000000000030003A011004E -:10DB00000590000000000000000000000000000080 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 :10DB10000000000000000000000000000000000005 :10DB200000000000000000000000000000000000F5 :10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000008000000CD -:10DB500000210000000000000000000000000000A4 -:10DB60001000000000008400080010000000000009 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 :10DB700000000000000000000000000000000000A5 :10DB80000000000000000000000000000000000095 :10DB90000000000000000000000000000000000085 :10DBA0000000000000000000000000000000000075 :10DBB0000000000000000000000000000000000065 :10DBC0000000000000000000000000000000000055 -:10DBD0000000000000000000000000100000000035 -:10DBE0000000000000001188000000000000080094 -:10DBF00000001000000011000302000000000000FF +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000000000000000000000000000025 :10DC00000000000000000000000000000000000014 :10DC10000000000000000000000000000000000004 :10DC200000000000000000000000000000000000F4 @@ -69078,6 +60884,8200 @@ :10DC400000000000000000000000000000000000D4 :10DC500000000000000000000000000000000000C4 :10DC600000000000000000000000000000000000B4 +:10DC70000000000000000000000000000000200084 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000200064 +:10DCA0000000000000000000000000000000000074 +:10DCB0000002000000000000000000004000000022 +:10DCC00020000000000000004000000000000000F4 +:10DCD0000000000000000000000000000000000044 +:10DCE0002000000000000000000000000000008094 +:10DCF0000000000000000000000000000000000222 +:10DD00000000000000000002000000000000000011 +:10DD100010001000000000000000000000000000E3 +:10DD20000000400000000000004000000000000073 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000002000000000000D1 +:10DD500000020000000000000000000000000000C1 +:10DD60000000000000000000000000000000009023 +:10DD7000000400020000000000000000000000009D +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0009000900000000000000000000000000013 +:10DDF0000000000000000000000000000000000023 +:10DE000000000008000800000000000800000000FA +:10DE100000000008000800000000000000000000F2 +:10DE200000000008000800000000000800000000DA +:10DE300000000008000800000000000000000000D2 +:10DE400000000000000800080000000000080000BA +:10DE500000000000000800080000000000000000B2 +:10DE6000000000000008000800000000000800009A +:10DE70000000000000080008000000000000000092 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE000000000000000000000000000A000000092 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE00000000000000000000000004000000000F1 +:10DFF00000040000080000000000000000400000D5 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E07000000002000000000000000000000000009E +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000100000000000000000008F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F0000800000000000000000000000000000017 +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000400000000000000000000000000008A +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E4000000000000000000000900110000000000F2 +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000010000008B +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E6900000880000000000000000000000000000F2 +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E710000000500000E000000000000000000000C9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA10000000000000000000000000000000006195 +:10EA20000006C0050000000000000000000000001B +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000F0FFF0FF0000000087 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000F000F0000C6 +:10EC30000000200020002000200020000000000034 +:10EC400000002000200020002000200020004000C4 +:10EC50000000200020002000200020000000000014 +:10EC600000002000200020002000200020000000E4 +:10EC700020000000200020002000200020040000D0 +:10EC800000000000200020002000200020002004C0 +:10EC900020000000200020002000200020040004AC +:10ECA00000000000200020002000200020002000A4 +:10ECB00000000000000200004002000200001000FE +:10ECC000000000000000000000020000000400003E +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000004000020 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000002F1 +:10ED200000000000000000000000000040000000A3 +:10ED300000000200000000000000000000000000D1 +:10ED40002000020002000000080000000000000097 +:10ED500000000000000000000000020002000200AD +:10ED600002000000000000000000000000000000A1 +:10ED70000000000000000000001000100000000073 +:10ED80000010001000000000080008000000000053 +:10ED90000800080002000200000008000200020053 +:10EDA000080008000200000000000000020002004D +:10EDB0000000000000000000000800080000000043 +:10EDC000000800080000000000080000000000002B +:10EDD0000008000800000000000800080000000013 +:10EDE000000800080000000000080000000000000B +:10EDF00000080008000000000000000800080000F3 +:10EE000000000008000800000000000800000000EA +:10EE100000000008000800000000000800080000D2 +:10EE200000000008020800000000000800000000C8 +:10EE300000000008000800000000000000000000C2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE6000000000000000040000000000000000009E +:10EE7000000000000400000000000000000000008E +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000004000000000000000000012 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000010000000000000000051 +:10EFB00000000000000040020040000000000000CF +:10EFC0000000000000000000000000000000000041 +:10EFD000000000000004000000000000000000002D +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F030000000000000400000009000000000000000 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F13000000000000000000000000000008400004B +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000050000000000000000000000200000000A +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000020000000000000000000004C8 +:10F24000000020000000000000000000000000009E +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000000000000000002A +:10F6E000000000000000000000000000000000001A +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 +:10FA200000000000000000000000000000000000D6 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000000000000000000000000016 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000000020000000000075 +:10FB700020000000200020002000200000002000C5 +:10FB800020000000200020002000200000000000D5 +:10FB900020000000200020002000200000002000A5 +:10FBA00020000000200020002000000320000000B2 +:10FBB000000020008800200020002000200000001D +:10FBC0002000200000002000200020000000000095 +:10FBD0004000200020002000200020002000000025 +:10FBE00020002000000020002000208000000000F5 +:10FBF0000000000000000000000000000000000005 +:10FC00000000000000400000000200004000000072 +:10FC10000000000040000040004000000000000024 +:10FC20000002000000004000000000000000000092 +:10FC30000000000240000000004000400000000002 +:10FC400000000000000200000000000000000000B2 +:10FC500040000000004000000000000000004000E4 +:10FC60000000000000000000009000000004A00060 +:10FC70000200020002000200020002000200020074 +:10FC80000200020002000200020002000200020064 +:10FC9000020002000200000000000000000000005E +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF0000000800080008000800080008000800084 +:10FD000080008000800080008000800080008000F3 +:10FD100080008000800080000000000000000000E3 +:10FD200000000000000000000000000009000000CA +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000011000000000000000000000082 +:10FD70000000000000000100000000000000001171 +:10FD80000000004100000000000000000000000032 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF00004000000000000002000000000000000DF +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE700000000000000000400000000000008400BE +:10FE80008200000082000000000000000000080066 +:10FE900000000000000000000000000000008200E0 +:10FEA00000001000000000000000000000008200C0 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000010000000000000000000000022 +:10FED000000000000000000008000000000000001A +:10FEE00000000000000000008240004100400000CF +:10FEF000000000400000000000A100000000000021 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000010000000000000000000C1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000001000000000000000A1 +:10FF5000000000000000030000000000000000009E +:10FF6000000000000000100410000000000000006D +:10FF7000000000000000000000000021000084409C +:10FF800020008400820320008200A04184002040E1 +:10FF900020000400001120002000000000000040AC +:10FFA0000040000000000000000000000000000011 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000000001 +:02000004000FEB +:1000000000018000000000008000000000000000EF +:1000100080018000000000008000800000000000DF +:1000200000010001000000000000000000000000CE +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:10007000000000000000000000000000000000215F +:100080008400100000408400C00000402040004177 +:10009000A000000000400000000000400040000000 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:10010000000000000000000100000000000180016C +:1001100000000000000000010000000000010001DC +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000011007E +:1001700000C00000000400000000000011000000AA +:10018000000490C101000200000491C0200084021C +:10019000000090C100000200000490C10000840330 +:1001A000000100C00000000200000000000000008C +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000100FE +:100200000000000083891020882000918989030361 +:1002100085C1004083890520A003008380891105E2 +:10022000A085002000800000008000000000000089 +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:1002800040000000000008000203090090410980BE +:1002900020201000C00341800503090383114000A2 +:1002A00005031000A04000000003000080000000D3 +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:100300000000000000000000000800000000C10123 +:10031000000800010100C04100C000000000C00052 +:10032000004000000100C140000000000000C000CB +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000010001006B +:1003900000C000000000010100C0000000000000DB +:1003A00000C000000000900100C100000000000239 +:1003B00000C000000000000000000000000000007D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000100021020B9 +:1004100041200089000920201010008900040520D7 +:100420004103008900404105031000A000000000C6 +:1004300000800080000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:1004800000000000000000000009000000118220B0 +:1004900009804100202083C00589400003118404A5 +:1004A000058903000303C1C00589200003118000F2 +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:10051000C020019000000000C00200910000010016 +:10052000C004009100000100C0C000910100010062 +:10053000C00000000090000000000000000000006B +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:100590000000880000E000000006810000E000008C +:1005A0000000880000E000006000810000E0000022 +:1005B00088000000000000000000000000000000B3 +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:10060000000000000000000000000000500000E0BA +:1006100000000000FFFF000066660000FFFF000012 +:1006200066660000FFFF000066660000FFFF000036 +:1006300066660000FFFF0000FF00000000000000F1 +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000006666000000008E +:1006A00000006666000000000000666600000000B2 +:1006B00000006666000000000000FF00000000006F +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000003C3C0000E1 +:1007A000666600000F0F0000666600003C3C00001B +:1007B000666600000F0F0000666600000F0FFFFF67 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000003C3C60 +:100820000000666600000F0F0000666600003C3C9A +:100830000000666600000F0F0000666600000F0FE4 +:10084000FFFFFFFF000000000000000000000000AC +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:10089000000000000000000000000000000040E335 +:1008A00080018021920240E380018021920240E396 +:1008B00080018021920240E38001802192024082E7 +:1008C0008000002082020000000000000000000004 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:10091000000000000000000000610006C0090000A7 +:1009200082008200000000000000000000000000C3 +:10093000001000300000000000280028030303021C +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000F0F077 +:1009A000F0F0800082000000EF0000002C3C00000E +:1009B0000F0B003000300000EF0000200028000086 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A20000000FFFFA0A00000000100410008000A34 +:100A30000000000002820000000D00000000000025 +:100A4000020202020000000000000000000000009E +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA00000000000000080A0000000410041000A9A +:100AB000000A0A020A0A82820000000F000000EF0A +:100AC0000000020202000000000000000000000020 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B30002000000000040000400000000000000051 +:100B40002000000000002000000040000000C00065 +:100B5000200000000004000020000000C00084000D +:100B600020000000400040000002000020000000C3 +:100B70002000200000000004880020000000200069 +:100B800084002000000020042000000020008400D9 +:100B90002000200082000000880420000200840061 +:100BA0008400200000002004200400000000000059 +:100BB0000000000000000000000020000000000015 +:100BC000000000020002000200000000000000001F +:100BD0000000000000000000000200000000000013 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000002000000000000E2 +:100C10000000000000004000000000000000000094 +:100C2000000000000000000040000900000000007B +:100C300000000203000000000000000000000000AF +:100C400000000000000000000000000000000000A4 +:100C5000000000000200020002000200000000008C +:100C60000010001000000000001000100000000044 +:100C70000000000000000000000000000000000074 +:100C80000000004000000000000000000000000024 +:100C90000200000000000000000000000000000052 +:100CA0000000000000000000000000000000000044 +:100CB000000000000000000800000000000800081C +:100CC00020000000400000080000000000000000BC +:100CD00000000000000000080000000000080008FC +:100CE00000000000000000080000000000080000F4 +:100CF00000000000000000000008000000000008E4 +:100D000000080000000000000008000000000008CB +:100D100000000000000000000008000000000008C3 +:100D2000000800000000200000080000000000088B +:100D300000000000000000000000000000000000B3 +:100D4000000000000000000000000000000000089B +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB000200041002100000000000000030010009E +:100DC0000000000000002100000000000000000002 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E30000000800000000000000000000000000032 +:100E4000000000000000080000000000000000009A +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E7000000008000000000000000000000000006A +:100E80000000000000000000000000000000000062 +:100E900000000000A00000000000000000000000B2 +:100EA000000000000800000000000000000000003A +:100EB0002000000000000000000000000000000012 +:100EC000050000000000000000000000000000001D +:100ED00000000000000000000000000000004100D1 +:100EE00005000000000000000000000000000000FD +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F20000900200000000000000000000900000887 +:100F30000990000400C0000000000000000000054F +:100F40000000000040000000000000000000000061 +:100F5000000000000000000000008200000000000F +:100F60000000000040000000000000000000000041 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000080039 +:100FB00000000000C000000000004100000021000F +:100FC000000000000300100000000000000000000E +:100FD0000000000008000000000000000000050004 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:10104000000000000000000010000021000000006F +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000008000000000000000000000048 +:1010A0000000000000000000000000000000000040 +:1010B000000000000000000000000000040000002C +:1010C0000000000000000000000000000000000020 +:1010D00041000000000000000000000000000000CF +:1010E0000000000000000000000000000000000000 +:1010F00041000000000000000000000000000000AF +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:101120000000000000C00000000000880000000077 +:1011300000000200090000000000020000000000A2 +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000100000000002E +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:10123000000000000000000000000000200000008E +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000100010000000000001B +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000900040011000000007E +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C00000000000000000000000880000E00000B3 +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000610006C00900000000000058 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000F0FFF0000029 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:1019500000000000000000000000000000F0FFF0A8 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000002000000010002000200006 +:101A700020002000000000000000000020002000E6 +:101A80004180418000002000000020002000200054 +:101A90002000000000000000000000000000000026 +:101AA0002100090000030000000000000000000009 +:101AB0000000040000000000000000000000000022 +:101AC0000000218021000000000000000000000054 +:101AD00000008800880000000000000000000000F6 +:101AE0000000200001800000000000000000000055 +:101AF0001000000200001000000000020000400082 +:101B00000000202004100000000000000000000081 +:101B10001000000000000000000000004000000075 +:101B200000008400840000000000000000000000AD +:101B30000000000000000000000040001002000053 +:101B4000400000008420040040000000000000006D +:101B50000000000000000000000010000000000075 +:101B6000400000000000100482000000840000001B +:101B70000000000000000000000000000000000065 +:101B8000000000000008100200000000000000003B +:101B90000000000000000000000000000000000045 +:101BA0000000000000082008000000000000000005 +:101BB0000000000000000000000000000000000025 +:101BC00000000000000000084008000000000000C5 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C00000000000000000001800100000000000052 +:101C100000000000000000000000000000000000C4 +:101C20000000000000000001800100000000000032 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000180010000000012 +:101C50000000000000000000020000000000000082 +:101C6000000000000000000000000000C0000000B4 +:101C70008400002100020004002100210000000077 +:101C800000000021000000000021012100000000F0 +:101C900000000009000000000021002100000000F9 +:101CA00000000000000000000021002100000000F2 +:101CB0000000000000000000000000090009000012 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000002100210021902100080004D4 +:101CF00008000000000000000000000000040000D8 +:101D000000000000000000000000080008000000C3 +:101D100008000000000000000000030000000000B8 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D6000000000000000000000000000000008006B +:101D700000008200820000008200000000000000DD +:101D800008008200820000008200840004001080AD +:101D900000008200820000008200820084000800AF +:101DA000000000008200C000820082008200C0802B +:101DB0000000000008008200C00082000000000057 +:101DC000000000000000000000000000000008000B +:101DD000088000000000000000000000000000007B +:101DE000A0004000C0002000000090002000400043 +:101DF0008200000000000000000000000000000061 +:101E00000000000000000000000000000000800052 +:101E100000040000000000000000000000000000BE +:101E200000000000000000000000000000000000B2 +:101E300000020000000000000000000000000000A0 +:101E40000000000000000000000000000000000092 +:101E500000008004000000000000000000000000FE +:101E60000000000020000000000000000000000052 +:101E7000000000000000000000200400000010002E +:101E80000800000000000000001100000000000039 +:101E900000000000000000000000080090000000AA +:101EA0000800000040000000001100000800400091 +:101EB000000008000000A0000000C00008000000B2 +:101EC0008400080000000000000000110000000075 +:101ED0000000000000000000000000000000000002 +:101EE00000000800000000000000000000000010DA +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000800080000000000000000000000000041 +:101F9000000008001000000000000000A000000089 +:101FA0000800080000000000000000000000000021 +:101FB0001000080008000000000000000000A00061 +:101FC0000000080008000000000000000000000001 +:101FD000820000000000000000000000000000007F +:101FE0008800000002000200000000000021002123 +:101FF00000080005000400000000000000000000D0 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000100880000C00007 +:102090000020C0820000C00000010000000000001D +:1020A0000000000100000000000001880000C000E6 +:1020B0000020C0820000C0000001000000000000FD +:1020C0000000000000000000000000000090000080 +:1020D000C0000020C0820000C0000001000000011C +:1020E0000001000100C00001000100C10005010164 +:1020F0000401008400820001000100C10000000012 +:1021000000000000000200000000000810000011A4 +:1021100083000000808000008000000300000000B9 +:102120000000000000080000000000201000001166 +:102130008300000080800000800000030000000099 +:102140000000000000000040000000000040080007 +:102150000011830000008080000080000003000068 +:10216000004100410041008200410041008804C15B +:1021700020048441000000800041004100850000EF +:102180000000050000000000000010000000020038 +:102190000300820000000300000000000080802097 +:1021A00000000500000000000000400000000200E8 +:1021B0000200820000000300000000000080804058 +:1021C00000000000050000000000000040000000CA +:1021D00008000300C00000000300000000000080B1 +:1021E00080204100030000000080410089000000C1 +:1021F000400009008200009184004100C10000807D +:1022000000000000000000000000000000000000CE +:102210000000A0000540000001004000000000C0D8 +:10222000820000000000000000000000000000002C +:102230000000A1000540000001004000000000C0B7 +:10224000820000020000000000000000000000000A +:1022500000000100200004200000010040000000F8 +:1022600000C0820001000100000000C00100C000A9 +:1022700000000100820041840040C000A100C100B4 +:1022800000841010000000000000000000000000AA +:1022900000010800009000000100000000000000A4 +:1022A000000000000000000000000000000000002E +:1022B0000001080000900000010000000000000084 +:1022C000000000000000000000000000000000000E +:1022D000000000004001009000000100000000002C +:1022E00000000000000000C00001C0C100000000AC +:1022F000000100C002080005000100C1000000004C +:1023000000010000000000000000000000000000CC +:10231000000000100002000000004100000000006A +:10232000000000410000000000000000000000006C +:10233000000000100002000000004100000000004A +:10234000000000410000000000000000000000004C +:102350000000000000030008000000004100000031 +:1023600000000000004100000080004180C100002A +:102370000000004100C100900041004100C1000088 +:1023800000000041001000000000800500830000F4 +:10239000000080088800000000C100000008000064 +:1023A0000041000000004010000080050083000094 +:1023B00000008000C000000000C100000008000014 +:1023C00000410000000020030000000080050083A1 +:1023D000000000038000C100000000C100000008F0 +:1023E00000000041000000000510C100800080C115 +:1023F00000004102000082004100C14180008005D0 +:102400000000410000008000410000000400008343 +:1024100000000000020082000000000540000000F3 +:102420000000000100000000002100000400008303 +:102430000000000002000400000000054000000051 +:10244000000000010000000000080000000004007F +:1024500000830000000002000400000000054000AE +:10246000000000000001000000000089C1004000E1 +:10247000C0C100000100020008000100C1A1080065 +:10248000C000000001000000C000010000000000CA +:10249000000000000000000000000000811200E0C9 +:1024A0000700484200000000000048420000000011 +:1024B000000000000000000000000000811200E0A9 +:1024C00007004842000000000000484200000000F1 +:1024D0000000000000000000000000000000811269 +:1024E00000E00700484200000000000048420000F1 +:1024F0000000000000420000000000000000811207 +:10250000004107004800000000000000000000003B +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000000000000000000000009B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:10258000000000000000000000000000000000004B +:10259000000000000000000000000000000000003B +:1025A000000000000000000000000000000000002B +:1025B000000000000000000000000000000000001B +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:102610000000257B0000000000000000000000001A +:1026200000000000000000000000000000000000AA +:10263000DEA4257B00000000000000000000000078 +:10264000000000000000000000000000000000008A +:10265000DEA40000257B0000000000000000000058 +:10266000000000000000000000000000000000006A +:102670000000DEA4757B00000000000000000000E8 +:10268000000000000000000000000000000000004A +:102690000000DEAE612603400000000000000230B2 +:1026A000A0000000000000000C400000000000003E +:1026B00002C0648661260340000000000000023072 +:1026C000A0000000000000000C400000000000001E +:1026D00002C0648600006126034000000000000084 +:1026E0000230A0000000000000000C4000000000CC +:1026F000000002C0648660C6030000000000000005 +:102700000031E0000000000000000C0000000000AC +:10271000000000C0630620008400000020000000CC +:102720000000200002000000200020002000000027 +:10273000000020040000200004000000040000004D +:102740000000000000000000000020002000000049 +:102750000000000400000000000000000000200055 +:102760000000000000000000000000000000000069 +:102770000000000000040000400000000000000015 +:102780000000000000040000000000000000000045 +:1027900040000000000000040200000000024000B1 +:1027A0000002000200020000000010000000000013 +:1027B0000002000000000000000000000000000017 +:1027C0000000000040004040000000000000000049 +:1027D00000000000000200000000000000000000F7 +:1027E00000000000000000000000000000000000E9 +:1027F0000000000040000000000000000000000099 +:102800000000000000004002000040000000000046 +:102810000000000040000000000002000000000076 +:1028200000000000000000000000020002000000A4 +:1028300090400000000000000000000000000000C8 +:102840000000020002000210201000000000000042 +:10285000000900000000000000000000000000006F +:102860000010000000000000000000000000000058 +:102870000040904000000000004000400040004048 +:1028800000000040004000400040004000400000C8 +:1028900000000000004000400000000000000000B8 +:1028A0000000000000080000000000000000000020 +:1028B0000000000000000084000000000000000094 +:1028C0000000000000080000000000000000000000 +:1028D00000000000000000000000000000000000F8 +:1028E0000000000000000090000000000000000058 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:10292000000000000000000000000800000000009F +:102930000000000000000000000000000000000097 +:10294000000000000000000000020800000000007D +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000020000000000000000000000300000004 +:1029B00000881100008241000800000000000000B3 +:1029C00000000000410000000000000003000000C3 +:1029D00000000000000000000300000000000000F4 +:1029E000000000000800000000004100210003007A +:1029F0000000000000000000410000000000000096 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000008000000000000AE +:102A200000000000000000000000000000000000A6 +:102A3000000000000000000000000000000008008E +:102A400000000000000000000000C00000000800BE +:102A50000040000008000000000000000000080026 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A900000000000000000000000000040000000F6 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC00000000000000000000010001000000000E6 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000000000000000000000B5 +:102B20000000000000000000000000000000820023 +:102B30000000000000009000000000000000000005 +:102B400000210000C000000008000000000000009C +:102B50000000000000000000000000000000000075 +:102B600000008200000000000000C0000000000023 +:102B7000A0000000000000000000000000000000B5 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA000000000000000000000000000000009001C +:102BB000000809000000008800000000080008006C +:102BC000000000000000000000900000000008006D +:102BD00000080900200000000000000008000800B4 +:102BE00000000000000000000000000000000000E5 +:102BF00000000090000009000090000000000800A4 +:102C0000080000900000000000000000000000002C +:102C100008000000000000000008000000000000A4 +:102C20000000000000000040000000000020000044 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C600000000000000000000000000008008200DA +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000000000000000FA +:1036D000000000000000000000000011A000000039 +:1036E00000000000A00000000000880000000000B2 +:1036F000000000000000000000000000400000008A +:103700000000000000004000000020000000000059 +:103710000000000000000000400000000000200049 +:103720000000000000000000400000000000000059 +:103730000000000000000000400000000000000049 +:1037400000000000000000008800000000000000F1 +:103750000000000000000000000000000000400029 +:1037600000002100210000000000000000400000D7 +:103770000000000400000000000000001000200015 +:103780000000000000000000000000020000000037 +:103790000000000000000000000010000002000017 +:1037A0004000000000000000400000000000009009 +:1037B0000000000000000000000000000000000009 +:1037C00020000000000000000000000000000000D9 +:1037D00000000002040000000000000000000000E3 +:1037E00000000000001000100000000000000000B9 +:1037F00000400040004000400040004000400040C9 +:1038000000000000001008000000000000000000A0 +:1038100000000000000000000000000000000000A8 +:103820000000000000000010001000000000000078 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000020000000000048 +:103860000000009000000090000000000000000038 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000000000000000000000000400E4 +:1038E0000000000000000000400040004000000018 +:1038F0000000820000000000000000000000000046 +:1039000000000000000000000000000008000000AF +:10391000000008000000100000000000000010007F +:10392000000000000000000000000000880000000F +:10393000000000000800000000000000000000007F +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:1039900000400000000000000000000000000000E7 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000000F7 +:1039D00000000000000000000000000000000000E7 +:1039E000004000400040824000000000000008004D +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A4000000000000800000000000000000000006E +:103A5000000000000800000000000000000000005E +:103A60000000000000000000000000400040104086 +:103A7000004000400040004000400000000000C046 +:103A800000C0000000000000000000000000000076 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B3000000000000000000008000000000000007D +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000010000000400401 +:103B70000000000000000000002000000000000025 +:103B800000000000000040000000000000000800ED +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB00040000900000000000000000000001000AC +:103BC00041000000000000000000000000000000B4 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C7000050000000000000000000000000000003F +:103C80000000000000000000030000000000000031 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:104610000000000000000000000000000000000496 +:10462000000000000000000000000000000000008A +:104630000000000000000000000000000004000076 +:104640000200000000000000000000000000000068 +:104650000001000000000000000000000000000455 +:10466000000020000000000000000000000000002A +:104670000000000000000000000000000000000436 +:104680000000000000000000000000000000000426 +:10469000000000000000000000000000000000001A +:1046A00000000000000000000000000200022104E1 +:1046B0002100400000000000000000000000000099 +:1046C0000004800000000000000000000000000066 +:1046D000000000000000000000000000000040009A +:1046E000000000004000000000000000000000008A +:1046F00040020000400000000000000040004000B8 +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000100000000089 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000100200020065 +:104740000200020000000000000000000000000065 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000008E1 +:1047D00000080000000000000008000800100010A1 +:1047E00000080084001000100008000800000010FD +:1047F0000010001000100010001000400000000029 +:104800000010001000000000001000100000000068 +:104810000010001000000000000000000000000078 +:104820000000000000000000000000000000000088 +:104830000000000000000000000000080008000068 +:104840000008000300210008000000080010000814 +:104850000000000000080008000000000000000048 +:1048600000000000840000000000000000000000C4 +:104870000000000000080000000000000000000030 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:10491000000000000000000000000000080000028D +:104920000800080000000000000000000000000077 +:1049300000800000000000000000000000000000F7 +:104940000000000000000000000000040000000063 +:104950000000010000000000000000000000000056 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:10498000000000000000000000000000000008001F +:10499000000000000000000000000000000000C057 +:1049A00040C000C0000000C000C000C000C0000047 +:1049B00000000040000000000000000000000000B7 +:1049C000008400000000000000000008000000005B +:1049D00000000000040000000000000000000000D3 +:1049E00000000000000000000000000800000000BF +:1049F000001000100000000000080000000000008F +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000441080000000000000039 +:104A30000000000008000000000800080010000549 +:104A400000080005002100210000000000000021F6 +:104A5000000800000020000000000000000000002E +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000010000000000000000D5 +:104AE00000000000000000000000000011000000B5 +:104AF00005000000000000000000000000000000B1 +:104B000000000000000000000000000000000000A5 +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000900400000080034 +:104B3000C000000082000800820082000000000324 +:104B40000000001000030021000000080000000821 +:104B50000000000000000000000000000000000055 +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C3000000000000000000008400088001010087C +:104C400040040810001082900000000000000000E6 +:104C5000000000000000000000009088000000003C +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB0000000000000000000000000800000000074 +:104CC0008080808080800000800000000000000064 +:104CD0000000000000000000000011008000000043 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D3000000000000000000000000000000080A053 +:104D400000888080800000900010808000000000BB +:104D500000000000000000000000000000000080D3 +:104D600000000080000000000000000000000000C3 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000003 +:104DB00000000000000000000000000000002000D3 +:104DC00010C0020402C0080010C188A110C0000079 +:104DD00000000000000000000000000000000000D3 +:104DE0000020000000C000000000000000000000E3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E20000000000000000000000000000000000082 +:104E30000000000000000000000000000000000072 +:104E400089080010C002100891200002C00210045E +:104E50000000000000000000000000000000000052 +:104E60000100008888000100000000000000000030 +:104E70000000000000000000000000000000000032 +:104E80000000000000000000000000000000000022 +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000000000000000000F2 +:104EC0000000410000808000800041000000800060 +:104ED00080800000000000000000000000000000D2 +:104EE00000004100008000000900000000000000F8 +:104EF00000000000000000000000000000000000B2 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000000000000000091 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F4000000000000000808000000000000380805E +:104F500000800000000000000000000000000000D1 +:104F600000000000001100000080000000000000B0 +:104F70000000000000000000000000000000000031 +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000000000000000000000F1 +:104FC0000000000000001000040804820400020039 +:104FD0002004100402000000000000000000000097 +:104FE0000000000000000001000000400000000080 +:104FF00000000000000000000000000000000000B1 +:1050000000000000000000000000000000000000A0 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000000000070 +:1050400000000000000000000000000000004842D6 +:1050500000000000000048420000000000000000C6 +:105060000000000000000000000000000700822196 +:105070000000000000000000000000000000000030 +:105080000000000000000000000000000000000020 +:105090000000000000000000000000000000000010 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C000000000000000000000002004100828413B +:1050D0000000284100002040040200000000000001 +:1050E00000000000000000000000000000000000C0 +:1050F000F0F00000000000000000000000000000D0 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000000000000400280019C +:1051500000002841000028411080080100000000E4 +:10516000000000000000000000000000000000003F +:105170000000F0F00000000000000000000000004F +:10518000000000000000000000000000000000001F +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:10524000000000000000000000000000000000005E +:10525000400220044400004405000005140000142E +:10526000000000000000000000000000000000003E +:1052700000FF0000FFFF0000000000000000000031 +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000008001100888000088A00000A0820063 +:1052E000008200000000000000000000000000003C +:1052F000000000FF000000000000000000000000AF +:10530000000000000000000000000000000000009D +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:1053500000000000600000000000100000000000DD +:105360000000080000000000000000000000000035 +:105370000000000005002A00054000A80000000011 +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:10552000000000000000000000000000000000007B +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A00000000000000000000000000000000000FB +:1055B00000000000000000000000000000000000EB +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000008000800400C7 +:1055E00000000000000000000000000000000000BB +:1055F000C000000000000080000000040000000067 +:105600000000000000000000000000000000000199 +:105610000000000200000000000000000000000088 +:10562000000000000000000000000000000000007A +:10563000000000000000000000000000000000006A +:10564000400000000000000000000000000000001A +:105650000000000000020000404000000010004078 +:1056600000000000000200004000000000000000F8 +:1056700000004000000000000008400000000000A2 +:10568000200040000000000040000000000000007A +:10569000000040002000000010000000000000009A +:1056A0000000000040400002000000000000000078 +:1056B00000000000000000000000000000000000EA +:1056C00000000002000000000000000000000000D8 +:1056D00000000000000000000000000005000000C5 +:1056E0000020000000000000000000000009001081 +:1056F00002000000000000000000000000000000A8 +:105700000000000000000000000000000000001089 +:105710000210000000000000000000000000000077 +:105720000000000000000000000000000000000079 +:105730000000004000000000000000000000000029 +:105740000000000000000000000000000000000059 +:1057500000000000000000000000000000008200C7 +:105760000000000100000000000000000000000038 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:1057900000000000000000000088000000000088F9 +:1057A00000880000000000880000000000000000E9 +:1057B00000000000000000000000000000000000E9 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000400C5 +:1057E0000400040004000410001000100000000079 +:1057F000000000000000042100000000000000087C +:105800000008000000000008000000000000000088 +:105810000000000000000000000000000000000088 +:105820000400000000000000000000000000000074 +:105830000200000000000000000000000000000066 +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:1058600003004000000000000800000000000000ED +:1058700000A000A00000000000A0000800C0000080 +:105880000000000000000000000000000000000018 +:105890000000000000000000000000000400040000 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000000000E8 +:1058C00000000000000000000000000000000000D8 +:1058D00000000000000000000000000000000000C8 +:1058E0000000080000000880080000000000000020 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000100008000000000000016 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:105940000000000000000000000000000000000057 +:1059500000000000000000000000000008400000FF +:105960000000000000000000001000000000000027 +:105970000000000000000000000000000000000027 +:1059800000000000000000002000000400000000F3 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E0000000000000000010A010000000050000F2 +:1059F00000000000000000000000000000000000A7 +:105A00000000000090000000000000000000000006 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A700000000088009000000300080003040300F9 +:105A80000000000000000000000000000000000016 +:105A9000000000000004008400000000000000007E +:105AA00000000020000000000000000000000000D6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE0000000080082040004000400000000001010 +:105AF0000010002100000000001000000000000065 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000002000000000000000000000000000073 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B600000000000200000000040000000000000D5 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000005000000E0 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE000000000000000209000040008100800C021 +:105BF000009000A0009000000000000000000000E5 +:105C00000000000000000000000000000000010093 +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C600000000000000000000000000000808080B4 +:105C70000080000000800000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C900011002100000000000000000000000000D2 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000800080A0000212 +:105CF0008080000000000000800000000000000024 +:105D00000000000000000000000000000000000093 +:105D100000000041090000030080000000000000B6 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D6000000000000000000000000000400010C023 +:105D7000400904C0880010009000C000000000002E +:105D80000000000000000000000000000000000013 +:105D900000000000009101000000008800000000E9 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE0000000000000000000000000000000410270 +:105DF0000010C002902008000040000402000000D3 +:105E00000000000000000000000000000000000092 +:105E100000000000000000008800000001000000F9 +:105E20000000000000000000000000000000000072 +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70004180008080000000800000000000800061 +:105E80000000000000000000000000000000000012 +:105E900000000000000000000000000000004100C1 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF0000000000200000080000000050002000019 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000011000070 +:105F20000000000000000000000000000000000071 +:105F30000000000000000000000000000000000061 +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000004009002044004000000002122 +:105F800000200000000000000000000000000000F1 +:105F90000000000000000000000000000000000100 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF0000000000000000000000000004842008196 +:106000000000070000000000000000000000000089 +:106010000000000000000000000000000000000080 +:1060200000E00000814100000000000000000000CE +:106030000000000000000000000000000000000060 +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:106070000000000000000000240000242200002294 +:106080000000000000F000F0000000000000000030 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000000000000000000000D0 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F000000000000000000000008100008111008D +:1061000000110000000000F000F00000000000009E +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000240081007A +:106180000410082003038000C3C3000000000000C7 +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000247B +:106200000081014002800303000000000002000042 +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:106280000000000000000800000050280000000589 +:1062900000000000000000000000000000000000FE +:1062A000000000000000000000400006000C00009C +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D +:106320000000000000000000000000005555FFFFC5 +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A0000000000000000000000000000000555543 +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000000000000000000000CD +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:10642000000000000000000000000000000000006C +:106430000000F0F00000000000000000000000007C +:10644000000000000000000000000000000000004C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C +:1064900000000000000000000000000000000000FC +:1064A00000000000000000000000000000000000EC +:1064B00000000000F0F000000000000000000000FC +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000800B +:106510000200840000000004000000800000000071 +:106520002000000000000000000440004000400087 +:1065300020000000000000044000000000000000F7 +:106540000000000000000004000400030000000040 +:10655000000020000000000000000000000000001B +:106560000000000000000000000400000000000027 +:1065700000000000000000000000000040000000DB +:1065800000000000000000000004000000C0000047 +:1065900000408000000200020002000040200000D5 +:1065A00000000000000200000000000000000000E9 +:1065B00000000000000000000000000000000000DB +:1065C0000000000000004000000200000000400049 +:1065D000000000000000000000004000000040003B +:1065E000000000000000400040000000000000002B +:1065F000000000000000000000000008000009008A +:106600000000000000000000000000000000040086 +:10661000040001800000840000000000000002006F +:106620000200000008400400040004000400000010 +:106630000000000000000200020002000200000052 +:10664000000000000000000000000000000000004A +:10665000000000000000000000800040008000807A +:106660000040000000400240004000400040004068 +:10667000004000400000004000400040004000405A +:10668000008000800840084000000000000000007A +:106690008040C1000810000000040000000000005D +:1066A00000000000000000008000800080008000EA +:1066B00000000000000000000008000000080008C2 +:1066C00000080008000000000000000000000000BA +:1066D0000000000000000000000000400001004039 +:1066E0000040000900080001000100010001000154 +:1066F0000001000100010000000100010001000193 +:1067000000010040004000014101000000000000C5 +:106710000000000000000100000000000000000078 +:106720000000040004080400000010000000A000A5 +:10673000A0000000000000000000000000000000B9 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 +:106760000000010000000000000000000000000028 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000800050000000000EC +:1067A00000000000000800000000000000002100C0 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E0000000000020000000000000000000000089 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000000805A000C0050009A0005D +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000080050 +:1068400000000000000400000000000008008200BA +:106850000000000000000000000000000000000038 +:10686000C000000000000800C00000800000000020 +:1068700083800000000000008200C000008009004A +:106880000000000000000000000000000000010007 +:106890000000000000000000008400000000000074 +:1068A0004008008400080008000800000000000004 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000300410000004100000000400500DE +:1068F00000000202000000000000210041000040F2 +:106900000200000000000000000000000000000085 +:106910000200000000000000000000000000000075 +:106920000000000000000000000000000000000067 +:106930000000000000200000000000000000000037 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000800080027 +:1069600008008200C000C0000000C000C00000009D +:106970008400000082000000A0008200820020004D +:106980000000000082000000840084000005200058 +:1069900000000000000000000000000000040800EB +:1069A00008000800030021000500000000000000AE +:1069B00010200000000000000000000000000000A7 +:1069C000000000C000000000008440000000000043 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00008000000000000000000000000000000006 +:106A100080000000000000000000000000000200F4 +:106A200084000000000000020000002000000400BC +:106A30000408040004000000000000000000000042 +:106A40000000000000000000000000000000000046 +:106A50000000000200000000000000000000000034 +:106A60000000080000000000820002008400000016 +:106A7000A1000204C0090080A000C10400000100C0 +:106A8000A000A0000000840000800003010020801E +:106A900000000000004000000010000000000000A6 +:106AA0001000000000000090000000000000000046 +:106AB00080008000800080000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE0000000000000000000000000008000000026 +:106AF0000500020080010000414003000201000087 +:106B0000020000000000000000000340000002003E +:106B1000C140000000000001000000000000000073 +:106B20000000C0C0022000A0C082000000000000E1 +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B600000000000000000000000000000C0000065 +:106B70000800000100C009012000000000C0000062 +:106B80000400000001C000002001000010C000004F +:106B90009000000040C00000020100000000000062 +:106BA00000000000808000000080008000000000E5 +:106BB0000000000000000000000000004000000095 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000000000000004083E2 +:106BF000000380200008008341100005000300C04E +:106C000000058020000309C000200008002000C00B +:106C100005000020000589C0000380080020000056 +:106C2000000000000000000000080000000000005C +:106C300000000000000000000000000000800000D4 +:106C40000080000000800000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C60000000000000000000000000000000000024 +:106C70000900850020008003038090000920900314 +:106C80004000410020098000400020004100A00099 +:106C900040000000200085202000400011118000ED +:106CA00000000000000000000000000000100000D4 +:106CB0000000000000000000000000400000001084 +:106CC00000000004000000040000000000000000BC +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF0000000010008000000C00000400900010081 +:106D0000C101008800000001C00000200000000058 +:106D1000C000000000000000C000002000000101D1 +:106D2000C000000000000000000008020040908247 +:106D300020A0000000000000000000000000400053 +:106D4000000000000000040000000000000000003F +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000A10883C1880000009E +:106D8000008900C188000100008900C100000000E6 +:106D9000008503C188000101000101C0000000015D +:106DA000000103C00000000000000000008000801F +:106DB0000000000000000000000000004000000093 +:106DC000000000000500000080000000000000003E +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000008004185838990000029 +:106E000005100021009100031020002100910003D3 +:106E1000000503A1919100000903032111A00020A6 +:106E20000003031091C00000000000000000800972 +:106E3000000400000000000000000000000000004E +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E7000000000000000000008A1A111100003089C +:106E8000A105031103008040A00511000500A040EA +:106E90008321208041000340A18510910300204000 +:106EA000A100031003808303000000000000000025 +:106EB000C00082010400400000000000000000004B +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 +:106EF000000000000000000000000003020101008B +:106F00000100C100000101009000C090019000004C +:106F10009000C001000290000000C1C001918900F2 +:106F20000000C120000101840401000000000000F5 +:106F30000000008100000700420000000000000087 +:106F400000000000000007040000004100000704EA +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F7000000000000000000000000000880000E0A9 +:106F800000000000810000E000006000810000E0DF +:106F900000000000480000E000000000810000E068 +:106FA00000004200880000E0000000000000000037 +:106FB00000000000000000002C002C000000000079 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000FF0092 +:10700000FF00FF0000003C3C0000FF0000003C3C93 +:107010000000FF000000F0F00000FF000000F0F0B2 +:107020000000666600003C3C000066660000000050 +:10703000000000000000FFC30004BC902C00000012 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:10708000FF00FF00FF0000003C3C0000FF0000008C +:107090003C3C0000FF000000F0F00000FF0000009A +:1070A000F0F00000666600003C3C000066660000F0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:10718000000000000000666600000F0F0000FFFF17 +:1071900000000F0F0000FFFF00006666000066663B +:1071A000000066660000FFFF00006666000066667D +:1071B000FFFF0000000000000000000010000FFFB3 +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:107200000000000000000000666600000F0F000094 +:10721000000000000F0F0000000000006666000084 +:1072200066660000666600000000000066660000FA +:107230006666FFFFFFFF0000000000000000A000E6 +:1072400050280000000000000000000000000518A9 +:107250000A00050004A005180A20050004A000008B +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:10728000000000000000000040638004802992029A +:1072900040E380048029920240E380048029920226 +:1072A00040E380048029920240E380048029920216 +:1072B00040E3800480218202000000000000000002 +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:1073000000000000000000000000FF003C3CB2B2A2 +:10731000F0B2FFFF000000F00FFF5555DF1000F442 +:107320000BFF0F3C0F2D00EA15FFFF0F000F00FFB2 +:1073300050FA3F7F3020E000F4FF00000000000022 +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:10738000000000000000000000000000FF003F308F +:10739000B2B2F0B20F5F0F0A00FA05FF5555DF10C9 +:1073A00000F40BFF0F3C0F2D00EA15FFFF3F000319 +:1073B00050FA50FA3F7F3020E000F4FF0000000058 +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000007C +:1074100000C000000000000000400001000000006B +:1074200080000000000000000000000100000000DB +:1074300000004100000000000000AEFFAEFF0000B1 +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000040004000000004000010000A3 +:1074A00000008000400040000000000300010000D8 +:1074B00000004040000000000000000300510051A7 +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E0000000040000002000000000000000000078 +:1074F000010000004000000000000000000000004B +:1075000000002000000400000003028000000000D2 +:10751000000000000000000000000000C0000000AB +:10752000000000000000000000002000000000003B +:107530000004000000000000000000000000000047 +:10754000000001000000000000000020000000001A +:1075500000004000000000000000000040020000A9 +:107560000000000040000000000000004000000299 +:1075700000001000000000000000400000000002B9 +:107580000000000000000000000000008008400033 +:1075900040040000000000000000000000000000A7 +:1075A000000000000000000000000000400000009B +:1075B00000000000000000000000000000000000CB +:1075C00000000000020000020000000000000000B7 +:1075D000000000000000000000100000000000009B +:1075E000000000000000000000000000000000009B +:1075F0000000000000000000001002100000000069 +:10760000000000000000000000000000000000007A +:10761000000000000000000000000000001000005A +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000000000003A +:107650000000008804000000000000000008000096 +:107660000000000000000000000000000000008298 +:1076700000820000000000000008000000080082F6 +:10768000008200000082000000000008008200006C +:10769000000000000000000000000088000000085A +:1076A0000000000000000000000000000088000052 +:1076B00000000000000000000000000000000008C2 +:1076C00000000000000000000000000000000000BA +:1076D000000000000800000000008400000000001E +:1076E00000080000000000080000000000088208F8 +:1076F000000000000000000000000000000000008A +:107700000000000000001000000000000000000069 +:107710000000000000000000010000000000000068 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000049 +:1077400000800000000000000000000000000000B9 +:107750000000000000000900000000000010000010 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000004100040000000000A4 +:1077A00008000000000005000300000041004190B7 +:1077B0000900410000000000030003000300030073 +:1077C0000000032000000000000000000000000096 +:1077D00000000000000000000000000000000000A9 +:1077E0000000080000000000000000000000000091 +:1077F0000000000000000000000000000000000089 +:1078000001000080000000000000000000000000F7 +:1078100000000000000000000000C1800100000026 +:107820000000000000008400000082004000C00052 +:1078300008000000C100000000000000000000007F +:107840000000000000000000000000000000000038 +:10785000000000000100000008000000000000001F +:1078600000000000000040000000000000001000C8 +:107870000000000000000000000000000000000008 +:1078800000002000000400000000000000000000D4 +:1078900000000000000000000000000020200200A6 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000004000000000000000000C4 +:1078C00000000000000000000000000000000000B8 +:1078D000000000000000040000410005000000005E +:1078E0000000000500000000000000000000000093 +:1078F00000000000000000000000000000009000F8 +:107900000000000000000000000000000000000077 +:1079100000000000900008000000000004000000CB +:10792000100400000000080000008400C0808200F5 +:107930000080000005800000208000000000820020 +:107940000000000004800000008000000000000033 +:1079500000000000000000200000000008000000FF +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000008001009000000800000005C00020D9 +:1079B000030000200500A02000008020000000003F +:1079C0004100008400008520000000040000080041 +:1079D0000000008400000000000100000008000812 +:1079E0000041004100410008002100210000000882 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A20000100000000000000000008090000400004 +:107A30004000820040000000000000000000000242 +:107A40000000000000000000000000000002000034 +:107A5000000000000000000000000000000209001B +:107A60000000000000000000000000000000000016 +:107A700000000000000000000000080008000000F6 +:107A800000000000000000000000000000000000F6 +:107A90000000000000000082000000000000000064 +:107AA00000002000000000000000000000000000B6 +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE000028800900002401000000000000000002A +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000010000000000000074 +:107B10000000000000000000000000000000000065 +:107B200000000100900000000000000000000000C4 +:107B3000000040A090200082008208A100208282E4 +:107B40000005000000000000000000A0208200826C +:107B5000A0000000000000000000000090000000F5 +:107B60000000000000000080000000000000000095 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000110021000000C3 +:107B900000000000000000000000000000000000E5 +:107BA000000000001100A100000000000000000023 +:107BB00000000000808080000080000080A0200580 +:107BC000000500A000000000000000000080200070 +:107BD0000080000000000000000000001100800094 +:107BE00000000000800000A00080808000000000F5 +:107BF0000000000000000000000000000000000085 +:107C0000000000000000000000000000004109002A +:107C100000030080000000000000000000000000E1 +:107C200000000000000000080980001000000000B3 +:107C30000000000000000000004180400080A080A3 +:107C400005008500A000000000000000000000000A +:107C500003408580A000000000000000000000003C +:107C6000008000000000080040C0040808C00000B8 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000001F3 +:107C9000010000000088000000000000000000005B +:107CA0000000000000000000000101020001008847 +:107CB000000000000000000000002000A0A0829052 +:107CC00002020000A1A00504000000000000000066 +:107CD00040002001A184914000000000000000004D +:107CE000000000200000002021080088C0100220B1 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D100000008800000001000000000000000000DA +:107D2000000000000000000000000100888808003A +:107D3000020000000200000000000220008200A0FB +:107D400000A000020005000303A0000000000000E6 +:107D50000000400200C100A102410000000000003C +:107D600000000100008888000000410000008080C1 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000004100000000000000A2 +:107DA0000000000000000000000000004100008012 +:107DB0008000C10000008000000000008000000082 +:107DC000000000000080008303A191050000000076 +:107DD0000000000000C0000200218011000000002F +:107DE0000000000041000080000000008000000052 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 +:107E10000000000000000011000020000000000031 +:107E20000000000000000000000000000000001141 +:107E300020000080000000000000000000000002A0 +:107E4000008000800000A185901103000500000063 +:107E5000000000000000800200000000004100005F +:107E6000000000000000001100000080000004007D +:107E7000084088A08800000000000000000000000A +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000001000000000000E1 +:107EA00000000000000000000000000000000000D2 +:107EB0000001000000400000000000000000000081 +:107EC000C00182C00004200003020591A188400087 +:107ED000000000000000000002A1A082A00000013C +:107EE0000000000000000000000100000040000051 +:107EF00000000000000048420000000000000000F8 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000E000008141BF +:107F20000000000000000000000000000000000051 +:107F30000000000000E007008200000000000000D8 +:107F400000000081000007008800818100E0070038 +:107F500000000000000000000000818100E0070038 +:107F6000000A000000000000000000000000070000 +:107F700082000280082040108020000000000000E5 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB0000000000000000000F0F0000000000000E1 +:107FC00000000000000000000000010002000000AE +:107FD000020000000000000000000000050000009A +:107FE0000000000000000000000000000000000091 +:107FF000F0F000000140041001040208000000003D +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:1080300000000000000000000000F0F00000000060 +:1080400000000000000000004100000001000200EC +:10805000000002000000000000000000000000001E +:108060000000C00000000000000000000000000050 +:108070000000F0F0000004011040440088000000FF +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B0000000000000000000000055550000FFFF18 +:1080C0000000000000000000FFCF000C5F50FF0028 +:1080D000FF570054FFAAFF820000000000000000CC +:1080E0005FFF5000FFD02F000000000000000000E4 +:1080F000000000000000FFFF08022080004400880C +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000005F +:10812000000000000000000000000000000000004F +:108130000000000000000000000000005555000095 +:1081400000000000000000000000FF0F000F5F5063 +:108150005F50FF57005455007D00000000000000F4 +:1081600000005F5F5050FFD02F00000000000000B3 +:1081700000000000000000000000000000000000FF +:1081800008000000000000000000000000000000E7 +:1081900000000000000000000000000000000000DF +:1081A000000000400006000C00000000000000007D +:1081B00000000000000000000000000005402A064A +:1081C000054C00A800000000000000000000002096 +:1081D0000000000000610024800900000000000091 +:1081E000000000000061002680090000000000007F +:1081F0000000000005000A00054000A80000000083 +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000005E +:108220000000000000003C3CFFFF000000000000D8 +:10823000000000000000000000000000000000003E +:10824000FF00FFFF00000000000000000000000031 +:10825000000000000000FF4F000E00FF00FF0000C4 +:108260000000000000000000000000FF00FF000010 +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000003C3C00000000000056 +:1082B00000000000000000000000000000000000BE +:1082C0000000FF00000000000000000000000000AF +:1082D0000000000000000000FF4F000E50FAF0F018 +:1082E000000000000000000000000000000CF3FF90 +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000F0F000006D +:10833000000000000000000000000000000000003D +:10834000000000000000F0F000000000000000004D +:10835000000000000000000000000000000000001D +:108360000000000000000000000000000000050008 +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A0000000000000000000000000000000F0F0ED +:1083B00000000000000000000000000000000000BD +:1083C0000000000000000000F0F0000000000000CD +:1083D00000000000000000000000000000C00000DD +:1083E000000300000000000000000000000000008A +:1083F000000000000000000000000000000000007D +:108400000000000000000000000400040000000064 +:108410000000000000000000000000000011A000AB +:10842000000401000000000000000000C000000087 +:108430000000000400000000000000000000000038 +:108440000004000000010000000000000000000027 +:108450000000000400040000000000000000000014 +:10846000000000000000000000000000000000000C +:1084700000000004000000000000000000000000F8 +:10848000000000000000400000001002000010008A +:1084900000000000000009000400040000000002C9 +:1084A00000020000200000000000000000000000AA +:1084B000400000000000100000000000000000006C +:1084C000000040000000000040000000000000002C +:1084D000400040000000000000000000000000001C +:1084E000000000000002000010000000000000007A +:1084F000000000000000000000000000000000007C +:108500000000000000000000010000000041001019 +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:1085300000000200000082000000000000000000B7 +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000080000000000E3 +:1085900000C0000000000000000000000000090012 +:1085A000000000000008008400000008000000082F +:1085B0000008000000000084000800080008008493 +:1085C0000008000000100000000000000010000083 +:1085D000001000100010001000100010001000101B +:1085E000000000100010001000100010000000003B +:1085F000001000100000000000000000000000005B +:1086000000000000000000000000000000804000AA +:108610000000000000000000000000080008000842 +:108620000008000800000000000200000000000038 +:1086300000000000000000000008820000000000B0 +:108640000000000000000000000800000000000022 +:108650000000000800000000820000000000A000F0 +:10866000A00000000000000000000000000000006A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000010DA +:1086900004000000000800000000000800000000C6 +:1086A00000000000000000000000000100000000C9 +:1086B000000000000000400800080000000000006A +:1086C000000000000000000800080300000800008F +:1086D0000000000000000008080003000000000087 +:1086E0002100210000000000000000000000000048 +:1086F0000000210000000000000000000000000059 +:108700000000000000004100000000000000000028 +:108710000800040040020000000000000000820089 +:1087200000000020002000000002000200001000F5 +:108730000000000000000000000000001000000029 +:108740000000000000000000000008000000000021 +:108750000000000000000000000000008200000097 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000008000800000000000000000000000D9 +:1087A00000000000030003000000000000010000C2 +:1087B0000000000000000000000000400000004039 +:1087C0000040000000000000000000000000000069 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000800000000000050 +:10882000000000008200080082000000000000003C +:108830000000000000110003000500090011000005 +:108840000000000000000008000000000000000020 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:108870000000000000000000000000000000A00058 +:1088800000000000000000000000000000000000E8 +:1088900000000000000008A040A000A000A0000010 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000C00000F8 +:1088C00000000084000000000000000000000084A0 +:1088D000000000C0000000000000210000840084AF +:1088E0000800000000000000000000000000000080 +:1088F00000000300000000840000000000000000F1 +:108900000000000000000000000000000000000067 +:1089100000000000000000840008000000000000CB +:108920000000000200210000840004000400080090 +:108930000000000000000100000200000000000034 +:108940000000000000030000000000000002000022 +:108950000000880000000000000000090000000086 +:108960000000080082000002000200000000000079 +:108970000000000082000000000010000000000065 +:1089800000020000000000000000000000000000E5 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B0000000000000880000080000000000000027 +:1089C00000000000000000000000000000000000A7 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 +:108A100000000000000000000000050000A0009021 +:108A2000000800040000000000000000000000003A +:108A300000000000880200108410041000000000F4 +:108A40000000000000000000000000000000000026 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 +:108A90000000000000000000000000000000008056 +:108AA0000080008000800000000000000000000046 +:108AB0000000000000000080030080008000000033 +:108AC00000000000000000000000000000000000A6 +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000200000000000000000000000043 +:108B300000000000000000009080A120910010883B +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA0000000000000010084000000000000000040 +:108BB00000000000000000000000A1C01100A0881B +:108BC0000989000000000000000000000000000013 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000040000000820000000000000082 +:108C3000000000000000000000000000042000A070 +:108C4000001040890000000000000000000000004B +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA0000000000000008000000000000000000044 +:108CB000000000000000000000000000000080082C +:108CC0000000008310910000000000000000000080 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D200000000000000000000004800000000000BF +:108D30000000000000000000000000000000000033 +:108D4000C1020500058011210000000000000000A4 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA0000000000000000000000008010800A00012 +:108DB000840000000000000000000000000000002F +:108DC0000000099190202084200100000000000094 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E200000000000000000000000000000810000C1 +:108E3000070000000000000000000000000000002B +:108E400000000000810000E0000050000000000071 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC000000000000000220011002040000000000F +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000F7FF0000000000000000000000003B +:108F4000000000000000000000220011108000005E +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000000000000000000000000040 +:10903000000000000F0F0CCF000000000000000037 +:109040000000000000000000000000000500000516 +:1090500000000014000000000000000000000000FC +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000FF00FF000000000000B2 +:1090C0000000000000000000000000000000A00000 +:1090D00000A00014000000000000000000000000DC +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F +:10912000000000000000000000000000000000003F +:10913000000000000000000000000020000000000F +:10914000000000000000000000000000000000001F +:1091500000614006800900000000000000000000DF +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F +:1091D000000000000000AA28AAEB00000000000028 +:1091E000000000000000000000000000000000007F +:1091F000000000000000000000000000000000006F +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E +:109250000000000000F000202828EBEB00000000D8 +:1092600000000000000000000000000000000000FE +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE +:1092900000000000000000000000000000000000CE +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000000000000000001030301000000E +:1092E000000000000000000000000000000000007E +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:10931000000000000000000000000000000000004D +:10932000000000000000000000000000000000003D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000303030304D +:1093600000000000000000000000000000000000FD +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C0000000000000000000000400000000000099 +:1093D0000000000000000000040000000000000089 +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000020000000000000000000000005A +:109410000004000000000000000400000000000044 +:10942000000000000000000000000000000000003C +:1094300000000000018000000000000200000000A9 +:10944000000000000000400000020002090240028B +:1094500000020002000010000002000000000000F6 +:1094600005000002400000000000100000000000A5 +:10947000000000000000400040000000000000006C +:1094800000000000000000020002000200020000D4 +:10949000000000000000400000000002000000008A +:1094A00000000000000000000000000000000000BC +:1094B00000000000000002080000000000000000A2 +:1094C000000000000000000000000000000000009C +:1094D000020000000000000000000000000010007A +:1094E0008400001002109000000090009000000026 +:1094F000000000000000000000000000000000006C +:109500000000000002100000000000000000000049 +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:109550000400000000000000000000000000000007 +:10956000800000000000000000000000000000007B +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C0000000000000000000000000008200C00059 +:1095D000000000000000000000000000000000008B +:1095E00000000100000000000000000000800000FA +:1095F00000800000004000000000000000000000AB +:10960000000000000000000000000000000000005A +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000000000003A +:10963000000000000000000000000000000000002A +:109640000000010000000000000000000000000019 +:1096500000000000410000000000000003000800BE +:109660000800080002000000000000001182004015 +:109670000084004000000001000000000000000025 +:1096800000000000000000000000000000000000DA +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000000000000000000000000000000000AA +:1096C000000000000400000000000000000008008E +:1096D000000000000000000000000000000000008A +:1096E000000000000000000000020111000800005E +:1096F00000880000000200000000000000000000E0 +:109700000000000008000000000000000000000051 +:109710000000000000000000000000000000000049 +:109720000000000000000000000000000000000039 +:109730000000000000000000000000000000000029 +:109740000000000001800080000000000000000018 +:109750000000000000000000000000000000000009 +:1097600000000000000000000000000102000001F5 +:1097700000000041000000010000000000000000A7 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000300000000000000C6 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000002020000400000000000055 +:1097D0000000000008000000000000000000000081 +:1097E000000000000000000000000000090003006D +:1097F0004100008500000000004001000000000062 +:109800000040000000000000000000000000000018 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 +:109830000000000000000000000000000000000028 +:109840009000900000008400000000000000000074 +:109850000000000000000000000000000000000008 +:10986000000000000000000000000000210002A035 +:109870008284828841400000000000010200000054 +:1098800000000001000000000000000000000000D7 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000000000000000000000000098 +:1098D0000000000000000000000000020000000086 +:1098E000000000000000080000000000000001006F +:1098F0000000108001000100000000400000004056 +:109900000000004000000000000000000000000017 +:109910000000000000000000000000000000000047 +:109920000000000000000000000000000000000037 +:109930000000000000000000000000000000000027 +:109940000000000000000000000001000000000016 +:1099500000000000000900000000000000000000FE +:1099600000000000000000000000000000000000F7 +:1099700040000800C0024000020000002101000079 +:1099800000010000000100000000000000000000D5 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000000000000000000002000000077 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F000000000C100820000000100C0000840001B +:109A0000000000C000200000000000000000000076 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000100900085 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A70000000000000C1004100110021038011001E +:109A800080000000008000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000110085 +:109AD000A1000000000000000000000000000000E5 +:109AE0000000000000000000000000000000000076 +:109AF000000000000000098041000509C1A100002C +:109B00000000000080000000000000008000000055 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B30000000000000000000000000000000000025 +:109B40000000000000000000000000000000000015 +:109B50000008098000030000000000000000000071 +:109B600000000000000000000000000000000000F5 +:109B70000000000000000000914000000101C1A1B0 +:109B8000000000000000C000000000000000C00055 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 +:109BC0000000000000000000000000000000000095 +:109BD00000000001010200000088000000000000F9 +:109BE0000000000000000000000000000000000075 +:109BF00000000000000000000000008800000101DB +:109C000000C100000008000000C1000000000020AA +:109C100000C0000000000000000000000000000084 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C500000000000010088880800000000000000EB +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000050200DD +:109C80000520038900030003000900C10000000053 +:109C90000000008000000000000000000000000044 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000004100008080000300000040 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000419192 +:109D0000210909000303800000000000000080001A +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D40000000000000000000000000000000000013 +:109D50000000000000000000001100000080000072 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800001C0880100000000C00000000008880039 +:109D9000C00000000020880000000000000000005B +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000000000000010000004042 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E000000000000000000008100000000000000D1 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000000000000000012 +:109E5000000000000000000000000000000000E022 +:109E60000700820000000000000000000000000069 +:109E700000000000000000000000000000000000E2 +:109E80000000000000FF00FF00003C3C00003C3CE4 +:109E90000000F0F000003C3C000000FF000000006B +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000000000000000000082 +:109EE0000000F0F000000000000000000000000092 +:109EF0000000000000000000000000000000000062 +:109F000000000000000000FF00FF00003C3C0000DB +:109F10003C3C0000F0F000003C3C000000FF000072 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000F0F00000000000000000000011 +:109F700000000000000000000000000000000000E1 +:109F80000000000000000000FF0000003C3C00005A +:109F9000FF000000FFFF0000FF0000000000FFFFC7 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 +:109FC0000000000000000000000000000000000091 +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000FFFF00000000000073 +:109FF0000000000000000000000000000000000061 +:10A0000000000000000000000000FF0000003C3CD9 +:10A010000000FF00000000000000FF000000FFFF44 +:10A02000FFFF000000000000000000000000000032 +:10A030000000000000000000000000000000000020 +:10A040000000000000000000000000000000000010 +:10A050000000000000000000000000000000000000 +:10A0600000000000000000000000000000000000F0 +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000040638006A7 +:10A09000002D920240E38006002D92024082800053 +:10A0A000002082020000000000000000000000000C +:10A0B00000000000000000000000000000000000A0 +:10A0C0000000000000000000000000000000000090 +:10A0D0000000000000000000000000000000000080 +:10A0E00000000000000005600A06054C00A8000002 +:10A0F0000000000000000000000000000000000060 +:10A100000000000000000000000000000000F6F663 +:10A1100096FF00C3003C000000006060FF6000008C +:10A12000000000000000000000000000000000002F +:10A13000000000000000000000000000000000001F +:10A14000000000000000000000000000000000000F +:10A1500000000000000000000000000000000000FF +:10A16000000000000000000000000000FFFF0000F1 +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A19000F0F000FF00C3003C00000000FFFFFF6084 +:10A1A00000000000000000000000000000000000AF +:10A1B000000000000000000000000000000000009F +:10A1C000000000000000000000000000000000008F +:10A1D000000000000000000000000000000000007F +:10A1E000000000000000000000000000000000006F +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A210000000FCF0BEAA00A5C3E70000000000009B +:10A22000000000000000000000000000000000002E +:10A23000000000000000000000000000000000001E +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A27000F0F00000000000000000000000000000FE +:10A2800000000000000000000000000000000000CE +:10A2900000000000F0FCAABEFFFFC3E700000000C2 +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000000000000000008E +:10A2D000000000000000000000000000000000007E +:10A2E000000000000000000000000000000000006E +:10A2F0000000F0F00000000000000000000000007E +:10A30000000000020000000000000000000000004B +:10A310000000000200020000000000000000000039 +:10A3200000000000000000004000000400000000E9 +:10A33000000000000000000000000000000200011A +:10A3400000000000000000000000200000040000E9 +:10A3500000000000000000000000000000020002F9 +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000020000DB +:10A3800000000000000000000002000200901040E9 +:10A39000004000400040000000024020100000008B +:10A3A000000000000000000000000000100000009D +:10A3B00040000000000000004000400000020000DB +:10A3C000000000000000000000000000000000008D +:10A3D000000040000000000000000000000000003D +:10A3E000000000000000000000000000000000006D +:10A3F000000000000000000000004000000000001D +:10A400000000020002000000000000000000000048 +:10A410000000020002000000020002000200020030 +:10A420000200000000000000000002000000000028 +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000020000000000FA +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000200020000000000D8 +:10A4800008000800000000000000000000000000BC +:10A4900000000000000000000000000000000000BC +:10A4A00000040000000000000000000000000000A8 +:10A4B000000002000000000000000000000000009A +:10A4C000000000000000000000000000000000008C +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000000000000000000000006C +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000040000000000000000B +:10A51000000000000000000000000000000000003B +:10A5200090000000C00000000000000000000400D7 +:10A53000000000000000000000000000000000001B +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB +:10A5600000000000000000000000000000000000EB +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A000000000000000000000000500050005009C +:10A5B000000000000000000000000000000000009B +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000000000000000000007B +:10A5E000000000000000000000000000000000006B +:10A5F0000000000008000000000000000000000053 +:10A600000000000000000000000000000000000446 +:10A610000000000000000000000004000000000036 +:10A6200000000000000000040011000000000020F5 +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000200000000F8 +:10A6600000000000000000000000000000000000EA +:10A6700000000000000000000000000000000000DA +:10A6800000000000000000000000000000000000CA +:10A690000000000002400000000000000400000074 +:10A6A000000000000500000000010000000000881C +:10A6B000002000000000004000000000000000003A +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000A00099 +:10A7200000000000000000000000008000000000A9 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A000000000000000000000040004000440005D +:10A7B0000090000000000000009000000000000079 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F000000000000000000000000084000000C015 +:10A8000000C0000000000084000400000000000000 +:10A810000000000000000000000008000000000030 +:10A8200000000000200020000000000008000000E0 +:10A83000008000000000000200090000000000008D +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000900000000000000000000BF +:10A89000000200000000000000000800004000006E +:10A8A0000000000000000000000000000000910413 +:10A8B0000000114000002100000000000000000026 +:10A8C0000200000000000000000000000000000086 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A92000000000000000000000000000000000C067 +:10A93000000400A00008000000000000000000006B +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000080000000000080000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000000000077 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000021001100104100000000000093 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000A001000100010100000000F2 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB3000000000000000A00000000000C0000000B5 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000800015 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC300000000000000000000000080405200500DE +:10AC400003400000000000000000000000000000C1 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB00000000000000000000000000000A10001F2 +:10ACC0000000010000000000000000000000000083 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000810092 +:10AD400000E0000000120000000000000000000011 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF4000000000000000FF06C7C70000000000006E +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000FF09CBCB00000000E3 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B0400000000000000000000000006150068005C4 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C000000000000000000000000000000000E0A0 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D0000000000050FAF0F0000000000000000045 +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000FFF0F00000000000000F +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000010007E +:10B2C0000000040400000000000000000000000076 +:10B2D000000000040000000000000000000000006A +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000100004D +:10B30000000000000000000000000000000000003D +:10B310000000000000000000000000040000000029 +:10B320000000000440004000000000000000400059 +:10B3300040000000000000000000000000000000CD +:10B34000800000000000000000000000000041003C +:10B3500000020000000000000000000000000000EB +:10B36000400040400000000000000000000000001D +:10B3700000000002000000000000000000000000CB +:10B38000404000000000000000000000000000003D +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000002000000008B +:10B3C00000050000000501050080000008000800DD +:10B3D00000400040004000402005200020002000E8 +:10B3E0000000008000800000000000000000080055 +:10B3F000008000000080000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B44000000000000000000020080040008400848C +:10B45000000800090085000100858400800080004C +:10B4600080000000004000400004000000000000D8 +:10B47000004000400000004000000000000000000C +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000002000000007A +:10B4D0000000004000210000000500050040014080 +:10B4E000014001400040842184008421004000404C +:10B4F000004000400000004000000040000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000103000000000000000001E6 +:10B560002001200120010001000000000000000176 +:10B5700000010001000100000001000000010000C6 +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C00000000000000000001000000091000000DA +:10B5D0008500C000C080C0031000100521002000BD +:10B5E0002000A000C000C000820082C182008280D2 +:10B5F00000000000000000000080000000000000CB +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000908400081000CE +:10B6500000840200000000400000C0008000900054 +:10B660008000890000000000000000880040000009 +:10B670000840000000000000000000400000000042 +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000200000005A +:10B6D00020081000840010002000200020400000FE +:10B6E00000081000000300210000002100000800F5 +:10B6F0000000002100000000000000000000000029 +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B740000000000000000000000000000000800079 +:10B7500000008000800000008000800080008001E8 +:10B7600000000000800000000090090000001100AF +:10B7700000000000000003000000000000000000C6 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D00000008300900000001121A1210021002120 +:10B7E0004000204000400040002182210021002133 +:10B7F0000000000400000004000000000000000041 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B85000000000C0200000000000A0000200000066 +:10B860000000000080010001000111022000090415 +:10B870002000000000000000000000001100000097 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D00000000000000140011100000100C1000053 +:10B8E0001001000000C100000000000001C10100C3 +:10B8F0000400009000C000000000000000C0000034 +:10B900000000009000C000000000400000000000A7 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B95000000000000000004140102009000320C149 +:10B9600009218509000000C102114009000311826C +:10B970004121000400090080000000000000008058 +:10B980000000000000000080000000000000000037 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000118010000000410382 +:10B9E000200005008940C180918005031100C1003D +:10B9F0000200030011008408000000000000800025 +:10BA00000000000000008000000000000000800036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000801000000DD +:10BA60000101002000008401C188020800000000DC +:10BA7000C10001A001000100C0C1000000000000E1 +:10BA8000C000000000000000C000000040000000F6 +:10BA9000C0000000000000000000000000000000E6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000165 +:10BAE0000100000140000090890001C10400000233 +:10BAF000000000C100210100010100C1820000001E +:10BB0000000800C000000040000000C0400000002D +:10BB1000000000C000000000000000000000000065 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000002E3 +:10BB600000100500094180200585850009C180106D +:10BB70000585000300C1000241044040009100001F +:10BB800000000000038000000000000000800000B2 +:10BB90000000000000800000000000000000000025 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0004104090000002010410005090300080974 +:10BBF000C1020500110040408205091140000341C7 +:10BC00008000800000800000800000000000000034 +:10BC100080000000000000000000000000000000A4 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC60000000014000000000000001000001010090 +:10BC70009100C101000000000000C18800414100A6 +:10BC80000101C000040000840000C000004040002A +:10BC90000000C000400000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE00000000000810000E000000000820000E091 +:10BCF00000000000810000E000000000810000E082 +:10BD00000000410A000000000000000000000000E8 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000003C3C5B +:10BD70003C3C0000F0F00000FFFF0000F0F000008D +:10BD8000F0F000003C3C000000FF000000FF00005D +:10BD9000F0F00000F0F0000000FF0000FFFF0000E6 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0003C3C3C3C0000F0F0000000000000F0F093 +:10BE00000000F0F000003C3C000000FF000000FFDC +:10BE10000000F0F00000F0F0000000FF0000000063 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE70000000FFFF0000FF000000FFFF00003C3C4F +:10BE800000003C3C000055550000FFFF0000FFFF94 +:10BE900000003C3C000055550000FFFF0000F0F0A2 +:10BEA000FFFF000000000000000000000000000094 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000FF0000000000000043 +:10BF00003C3C00003C3C0000555500000000000097 +:10BF1000000000003C3C00005555000000000000FF +:10BF2000F0F0FFFF00000000000000000000000033 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF70000001800000004002800180209202408287 +:10BF800080018020920240E3800080219202408262 +:10BF900080000020920240828000002092024082B5 +:10BFA000800000208202000000000000000000006D +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000001400050C0C080800 +:10C000000014000C000F000C000F000F000F000FB9 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C07000000014143C00A0A03030001400050000A3 +:10C0800008080014000C0000000C3C3C282D0002A5 +:10C090007D7F0000000000000000000000000000A4 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F000000000000300C300000000000A00AA00C6 +:10C100000808000C08082800000A0808EB41E3436F +:10C1100050505050000000000000000000000000DF +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000003000000A0A030300A0012 +:10C1800000000808000C08082800000A0808AA0097 +:10C19000A00000FF407C0000000000000000000044 +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000001802180018001801B +:10C20000840000000000000000000000000020008A +:10C2100000000000000000000000200000000000FE +:10C220000100010000081080000000000000200054 +:10C2300000000000000400000003000000000000F7 +:10C24000000004004000400020000000000000004A +:10C2500020004000400088040080000000008800AA +:10C26000000021002000200020000000000000004D +:10C27000200000002000200000001004100420080E +:10C280001004000009000000000000000000000091 +:10C29000000000024002000000004000000000001A +:10C2A0000000100010000001000800000000000065 +:10C2B000000000000000000000000000400000003E +:10C2C00000000000800000000000000000000000EE +:10C2D000000000000000000000020010000000004C +:10C2E000000000000200000000000000000000004C +:10C2F000000000000000000000000000000000003E +:10C3000000000000100410001000100000000000E9 +:10C31000000000002000210020002000000000009C +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000020000000200000000000AD +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000008B5 +:10C3800000000000000080018000800080080000A4 +:10C39000000000000000800088008000800000088D +:10C3A0000000000000000000000000000008000085 +:10C3B000000000000000000000000000000000007D +:10C3C000000800000000000080000000800000085D +:10C3D000000000000000000000000000000000005D +:10C3E000000800000000000000000000000000083D +:10C3F000000000000000000000000000000000003D +:10C400000005A00000410000000000000000A000A6 +:10C410000000000000000000000009410500054187 +:10C4200000000000000000000041000000000000CB +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000080000000000B4 +:10C4800000000500000000000000210000A00000E6 +:10C4900000A0030000000000000000A02000A00099 +:10C4A000A0000000000000000000000000000000EC +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C500000000000090000000000000000002000495 +:10C5100040040100000000000000000000800080D6 +:10C5200040A00080000000000000000000000000AB +:10C5300000000100A000000000000000000000005A +:10C54000C0000000000000000800000000000080A3 +:10C5500001040400000400000000C000000000000E +:10C5600000000000000000000000000000000000CB +:10C5700000000000010000000000000000000000BA +:10C5800000000000000000000000000000000000AB +:10C5900000010001200000000000000000840004F1 +:10C5A0000004000500200000000000000000000062 +:10C5B0000200000020000000000000000000000059 +:10C5C0000000000004000000000000000000000067 +:10C5D00000200401800000010000000000000000B5 +:10C5E000000000000000000000000000000000004B +:10C5F0000000000000000400000000000000000037 +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C6200000800180000000800000000000009000F9 +:10C630000000000000000000000000000000A0005A +:10C6400000000000000000000000000000000000EA +:10C650000000000000000020040000008200000034 +:10C6600000000000000000000000000000000000CA +:10C67000000000000000002000000000000000009A +:10C6800000000000000000000000050000000000A5 +:10C690000000008400000000000000000000000016 +:10C6A000210000040810030000400000000000000A +:10C6B0000000000000000300000000000000000077 +:10C6C000000000000000000000000000000000006A +:10C6D00000000000000000000001800000000000D9 +:10C6E000000000000000000000000000000000004A +:10C6F0000000000000000000000100000000000039 +:10C700000000000000000000000000000800000021 +:10C71000080008000009000000009000000200006E +:10C720000000000000000000000000040002000003 +:10C7300000040000080000000000400000000000AD +:10C740000000000000000000000000000000820067 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000002000020000501000061 +:10C7B00000000000000000880000000002000000EF +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000001000001000000010000000000000015 +:10C8200000000000000000004101A101820082A17F +:10C8300000000000000000000100000000000000F7 +:10C8400000000000000000000000000000000000E8 +:10C850000000000000000000000000009000000048 +:10C8600000000000000000000000000000000000C8 +:10C870000000000000000000000000009020000008 +:10C8800000000000000000000000000000000000A8 +:10C890000000004100050405000011000021000017 +:10C8A0000000000000000000000091204040804196 +:10C8B00080030000000000000000110000210000C3 +:10C8C0000000000000000000000000000000000068 +:10C8D00000000000000000000000000011008000C7 +:10C8E0000000000000000000000000000000000048 +:10C8F00000000000000000000000000011008000A7 +:10C900000000000000000000000000000000000027 +:10C91000000000001000050020404110000500004C +:10C920001105000000000000000000004180200010 +:10C930001140A041000000000000000000080000BD +:10C9400011030000000000000000000000000000D3 +:10C9500000000000000000000000000000000008CF +:10C960000000004100000000000000000000800006 +:10C9700000000000000000000000000000000000B7 +:10C9800000800000008000000000000000000000A7 +:10C990000000000000000100000000010101000093 +:10C9A00000000100000000000000000000008840BE +:10C9B000A100C10191010000000000000000000082 +:10C9C0000000010000000000000000000000000066 +:10C9D0000000000000000000000000000000000057 +:10C9E0000001009000000084000000000000000032 +:10C9F0000200000000000000000000000000000035 +:10CA000000000020000000C0000000000000000046 +:10CA10000000000000000000000001000001000113 +:10CA200000004000000100000000000000000000C5 +:10CA3000004001A10890C085000000000000000037 +:10CA400000000800000101000000000000000000DC +:10CA500000000000000000000000000000000000D6 +:10CA600000000000C00040000000000002000000C4 +:10CA700000000000000000000000000000000000B6 +:10CA80000000010000888800010000000000000094 +:10CA90000000000000000000000000401005001031 +:10CAA0000041000000000008050000000000000038 +:10CAB0000000008921A18989001100000000000008 +:10CAC0000000000000000008080000000000000056 +:10CAD0000000000000000000000000000000000056 +:10CAE00000000000080080000000410000008000FD +:10CAF0000000000000000000000000000000000036 +:10CB0000000000004100008000000900000000005B +:10CB100000000000000000000000000041200500AF +:10CB200041000000000211000000000000000000B1 +:10CB300000000000200221912000030900000000F5 +:10CB400000000000000011000000000000000000D4 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000050000000000000000C0 +:10CB700000000000000000000000000000000000B5 +:10CB80000000000000000011000000800000000014 +:10CB90000000000000000000000000000000010094 +:10CBA0000000000000000001010000000000000083 +:10CBB000000000000000010501A101A0010100002A +:10CBC0000000000000000000010000000000000064 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC000000000000000000000001000000400000E3 +:10CC10000000000000000000000000000000000014 +:10CC2000820000E000000000810043E000220000DC +:10CC30000000000000000000818100E00700000A01 +:10CC40000000000000000000000000E00000000004 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000810002E0070456 +:10CC70008200000000000000000000000000000032 +:10CC8000000000000000000000000000000007009D +:10CC900082210000000000000000000000000000F1 +:10CCA0000000000000000000000000000000000084 +:10CCB000000000000000000000000000000007006D +:10CCC000FFF800000000000000000000000000006D +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000F0F000000000000000000000000033 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400007000700000000000000000000000000D5 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD900000000000F0F000000000000000000000B3 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE4000242424240302039B0000000000000000AF +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE8000000000000000C3C3C3C300000000000096 +:10CE9000000000FF0000FFFF000000000000000095 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC00000002424242402029B9B00000000000098 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000C3C3C3C30000000015 +:10CF10000000000000FF0000000000000000000012 +:10CF20000000000000000000000000000000000100 +:10CF30008000000000040006800E200000000000B9 +:10CF4000000000000061402080010000000000009F +:10CF50000000000000000006000C000000000000BF +:10CF600000000000000000000000000000000000C1 +:10CF7000000000000000057D0A06850F24A00000C7 +:10CF800000000000000000000000000000000000A1 +:10CF900000000000000005002A00054000A8000075 +:10CFA0000000000000000000000000000000000F72 +:10CFB00000FF000F0C0C0000FF0000FF000000004D +:10CFC0000000000000000034003480808F8F0000DB +:10CFD0000000000000000000FF0000FF0000000053 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D03000000F0000000F0C0C0000FF0000FF0000BC +:10D040000000000000000000FF3E003480828F825C +:10D0500000000000000000000000FF0000FF0000D2 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000F00550C0C000F0000FF0000FFE7 +:10D0C000000000000000000000000A001E3C0055A7 +:10D0D000001400000000000000000000FF0000FF3E +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000F00550C0C000F0000FF0065 +:10D1400000FF000000000000000000000A0A1E1E90 +:10D15000A0F5E0F400000000000000000000FF0067 +:10D1600000FF0000000000000000000000000000C0 +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B00000000000000000000000000200002080CD +:10D1C000208000800080108010000000000200001D +:10D1D000000000000000880088000000000420001B +:10D1E000200000000000000000000000000200001D +:10D1F000000000000000000100002000000000000E +:10D20000200020000000000000008400000000005A +:10D2100000000000000000000000000000004000CE +:10D220002000200000040000000040000002000078 +:10D2300000000000000000000000000000040004E6 +:10D2400000040004000400048040210021022100A9 +:10D25000000000000000004000000000004000004E +:10D26000000000000000000020002000000000007E +:10D2700000000000000000000000000200020002A8 +:10D28000000200000000000000000000000000029A +:10D29000400040000000000000004000400000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000400000000000000000000000000006A +:10D2C00000002000014020002000000000000000BD +:10D2D000000000000000000000400000000000000E +:10D2E000000020202020202020200000000000003E +:10D2F00000000000000000000040000000000000EE +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000100010CD +:10D340000010001080102000800080C0000000C08D +:10D3500000000000000000000000000000000000CD +:10D3600000000000840180018001800100000000B5 +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000100000000000000000000004C +:10D3E00000000000820000000000000000000000BB +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000004000000000000000000C8 +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A0000000000008000000000000000000000074 +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000008008400018005C1000088400000B1 +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000008000000000000000000E3 +:10D5400000000000000000000000000000000000DB +:10D550000000000000000000202002040000000085 +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C0000000000000000000000000000000040057 +:10D5D000000090009000000000000000100000001B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D64000000000000000000003000800210021008D +:10D650000000000000000084008400000000800042 +:10D66000000000000000000000000000000000209A +:10D670000090000000000084000000000000000096 +:10D680000000000000000000000000C000000000DA +:10D690000000210000000000000000000000000069 +:10D6A000000000000000000000000000000000007A +:10D6B00000000000000000000084000000000000E6 +:10D6C000000000000000000000000000000000005A +:10D6D0000000000000000000000000410141004186 +:10D6E00000020040000000090000020020000200CB +:10D6F0000200000000000000000000000002000026 +:10D70000000200000000000000000000080000000F +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000002000000000000000000000000D7 +:10D750000000000000000000000000840000200025 +:10D7600000000000000011000000000000000000A8 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000010048 +:10D7E0009000000000880000000000000000000021 +:10D7F0000000000000000000000001000000000028 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D860001100A10000000000000000000000000006 +:10D870000000000000000000000000001000000098 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000090000000936 +:10D8E00000000008098000030000000000000000A4 +:10D8F0000000000000000000000000080080004060 +:10D900000080000000000000000000000000000097 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D96000000000000001010200000088000000002B +:10D97000000000000000000000000000000100089E +:10D980000001000400000000000000000000000092 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000800000000000100888808000000000016 +:10D9F0000200000000000000000000000000000025 +:10DA0000040004000100000000000000000000000D +:10DA10000000000000000000000000010000010004 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000008000000004004100008080004100B0 +:10DA70000000800000000000000000000000000026 +:10DA80000500800080004100000000000000000050 +:10DA90000000000000000000000000000003000083 +:10DAA0000200000000000000000000000000000074 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE00000000000000000000000001100000380A2 +:10DAF0000000000000000000000000000000000026 +:10DB000000000040001000000000000000000000C5 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000010000B4 +:10DB70000040000000000000000000000000000065 +:10DB80000000000000000001000000000000000094 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000045 +:10DBE000000000000000000000E000000000000055 +:10DBF00000E00700820000000000000000000000BC +:10DC0000000000000000818100E00700000A000021 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000F0F000000000000000000000C4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF000000000000000F0F0000000000000000044 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD70000000000000003C3C0000FFFF000000002D +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF00000000000000000003C3C000000000000AB +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000610086000D000005402A06054C00A840 +:10DE80000000000000000000000000000000000092 +:10DE900005610A2F850D00A00000000000000000B1 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000F0FFFFF06 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000F0F83 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000F0F000000000000000000000000030 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E0800000000000F0F000000000000000000000B0 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000002000000000007F +:10E180000004000400000000000000000000000087 +:10E19000200000000000000000002000000000003F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000200000003F +:10E1C000000000040000000000000000000000004B +:10E1D000000000000000000000000000200000001F +:10E1E000000000040000000000000000000000002B +:10E1F0000000000000000000000000040000000417 +:10E200001004000200004000000000040004009020 +:10E21000004000000000000000000000004000007E +:10E22000004000000000400000000000000000006E +:10E230004000400400040000000000000000000056 +:10E24000400040000000000000000000000000004E +:10E2500000000000000400040000000000000000B6 +:10E26000000000000000000040000000000000006E +:10E270000000000000040000020002000000000096 +:10E28000000000000000000000000040000000400E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D00000400000000000000000000000000000FE +:10E2E00000000000000000000000000000000040EE +:10E2F000004000000000004000400000000000005E +:10E3000000000000000000000008004000000000C5 +:10E3100000000000000000000000000000000000FD +:10E3200000000000040000000008000000000000E1 +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000800000000C5 +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000800000000A5 +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A0000000000084000000880000000000000061 +:10E3B000000000000000000000000000000000005D +:10E3C0000000000000000000C0000000000000008D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E4000000000000000000001000000000000000FC +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E480000000000000000000001100040004000073 +:10E4900000050000000000000000000000400040F7 +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E5000000000000000000000000200000000000EB +:10E51000000000000000000000001188000000045E +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000004C7 +:10E5500000000004000000000000000000000000B7 +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C00000000000000000000000A00000000000AB +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E600000000000000000000000000000000008486 +:10E61000000000C000C000880000008400840000EA +:10E620000000000000000084000000000000040062 +:10E6300009000000000000000000000000000000D1 +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E690000000000000000000000900000000000071 +:10E6A0000040000000020002000000000000000026 +:10E6B000004000000000000000000000000000001A +:10E6C0000000000008000000000000000000000042 +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000020000000000000000000000E7 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000200000000000AF +:10F1400000030100008000200020000000000000FB +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000040000000000009B +:10F17000000000010000000000000000000000008E +:10F18000000000000000000000000000000000007F +:10F19000000000004000000000000000000000002F +:10F1A000000000000000000000000000000000005F +:10F1B000000400000000000000000000000000004B +:10F1C00000000000040000200001210100000000F8 +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000040000000000001B +:10F1F00000000000000000000000000010001000EF +:10F20000000000000000400040000000400000003E +:10F2100000000000000000004000000000000000AE +:10F2200000000000000000000000000000000000DE +:10F2300000020000000000000000000000000000CC +:10F2400000000040084005000500910083200800F0 +:10F250000800001000108400000000000000000002 +:10F260000000000008400000000000000000000056 +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000084008400040004012D +:10F2D0000200040002000200000000000000000024 +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F34000000000000000000000000000A000A0007D +:10F35000A00000000000000000000000000000000D +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D0000000000000000000000000000400000029 +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F430000000000000000000000000000000A0002C +:10F4400000000000000000000005000000000004B3 +:10F45000010000040108000000000000000000009E +:10F46000000000000000000000000000000000009C +:10F47000000000000000002000000000000000006C +:10F4800000000041000000410000000000000000FA +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C0000000040000000000000000000000000038 +:10F4D0004001108400012001000002000000000033 +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D0000000000000000004000000000000000027 +:10F5E000000000000000000000000000080004000F +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F65000080008000800008000040100008000008D +:10F660000004000000000000000000000000000096 +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000080001100000040D +:10F6E0001100000000000000000000000000000009 +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000010000000000A8 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D00000000000000000000000000011000021F7 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F850000000000000000000000000000000004068 +:10F860000080110500000000000000000000000002 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000000000000000000000000028 +:10F8E000000000080100008400000000000000008B +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F9500000000000000000000000000000000000A7 +:10F96000000000000400040100000000000000008E +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000004008000000805000000000086 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 +:10FA200000000000000000000000000000000000D6 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000002110000000000000083 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000000000000101000000000014 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB600000000000000000000000810043E00722C8 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000000000000000025 +:10FBE0000000000000000000000000000000000015 +:10FBF0000000000000000000000000000000000005 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000000000000000000000000000000D4 +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF0000000000005040A06950E20A00000000087 +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000FF0000FF0000000084 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000000012 +:10FEF00000000000000000000000FF0000FF000004 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF7000000000000000000000000000FF0000FF83 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000FF0002 +:020000040010EA +:1000000000FF0000000000000000000000000000F1 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000100080 +:10007000000000000000000000000004000000007C +:100080000000000400000082009100040020000035 +:100090000000000400040000000000000000000058 +:1000A000000000000000000000000000000000014F +:1000B0000000000000000000000000000004000438 +:1000C000000000000000000000000000000400002C +:1000D0000000000000000000000000000008000414 +:1000E000000000000000000000000000000400000C +:1000F000400000000000000000000000210000009F +:10010000000000000000000040100010400000014E +:1001100020000000000000000000400040400000FF +:10012000000000000000000040004000000000004F +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000002AD +:10015000000010000000000000000000000000008F +:10016000000000000000000000000000000000008F +:1001700000000000000000000010000090210000BE +:10018000000000000000000000000000000000006F +:1001900000200000840000000000000000000000BB +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000010000000002F +:1001C000000000000000000000000000000000002F +:1001D00000000000000000000010001000000000FF +:1001E00000100010000000000000000000000000EF +:1001F000000000000000200000000000008400005B +:100200000000000000000900090000000290020840 +:1002100002000209000000000000000000000000D1 +:1002200000000000000000000000000000080408BA +:1002300000000008000000000000000000000000B6 +:1002400000000000000000000000000000000008A6 +:100250000008000800080000000000000000000086 +:100260000000000000000000000000000000000886 +:1002700000080084000800000010000000000000DA +:100280000000000000000000000000000000000866 +:1002900090000000000000000000000000000000CE +:1002A0000000000000000000000000050000000049 +:1002B0000000000000000000000000090000000035 +:1002C000000000040000000000000000000000002A +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:10030000000000000000000000000000000000826B +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000080008006D +:1003800000000004000400040040001100110000FF +:10039000000000000000000000000000000000213C +:1003A000000000000000000000000000002100002C +:1003B0000000000000210000000000000005000017 +:1003C00000000000000000000040000000000000ED +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000010ED +:1004000000000000020000000000000020001100B9 +:100410000000080000004000000000000000400054 +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:10044000000000000000004000000040000000002C +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:100490000000000000000000040000200000000038 +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:100510000000000000000084000000000000000057 +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A0000002000000000000000000000000000049 +:1005B0000000000000000000000000000000000833 +:1005C00000000000000000000000000000400000EB +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000040AA +:100610000040000000000000000008000002000090 +:1006200020042088000000000000000000000000FE +:1006300000000000000000000000000000000000BA +:1006400005000000000000000000000000000000A5 +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:1006900000000000000000000000000000000888CA +:1006A000002000088890000000000000000000000A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200011000080000000800000000000000000B8 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000800000038080008000000000000046 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:10082000000000008800880184400890000000005B +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A00000000000000008900000000002080000A6 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:100920000000000000000000000000000000800047 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A00000000000000000000000000800008000BF +:1009B00080000000000000000000000000000000B7 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A20000000000000000000000000008800080036 +:100A300040880200000000000000000000000000EC +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB000000007000000000000000000000000002F +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300004000000000000000000000000000000B1 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000181800000000000005 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB000000000000000000000000CFC00F000003C +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000002000F000F0B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000001023 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000080000B8 +:1010300000000003000000000000000000000000AD +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:1010600000000000000000000000000000030080FD +:1010700000800082008400000000000000000000EA +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A000000000000000000000000000000000013F +:1010B0000000008200A0000000000000000000A06E +:1010C000000000040002000000000000000000001A +:1010D000000000000002000000000000000000000E +:1010E00000000000000400000000000000000000FC +:1010F0004004400400044004000000000000000020 +:10110000400040000002000000000000000000005D +:1011100000000000000000000000000000000000CF +:10112000000000000004000040000000000000007B +:10113000000000000000041000000000001000107B +:10114000000000000000000000000000000085001A +:101150000000000000000000044000400440044083 +:10116000000000000000000000000000000000007F +:1011700000002000200020002008000000000000E7 +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B0000800040004000400000002000000020017 +:1011C000020000000000000800080000000000000D +:1011D00040100400040004000400000004000000AB +:1011E0000000000000000082000800000000000075 +:1011F000000000008000800080008000000000846B +:1012000000000000000000000000000800000000D6 +:1012100000000000000000000000000800000000C6 +:10122000000000000008000800080008000000841A +:101230000000C100000000000000000000000000ED +:1012400000000000004000008200A000000000003C +:101250000000000000000000000000000000000886 +:10126000000000000000000001000000000000007D +:101270000000001100000000002100000008001123 +:101280000000000000000008000800080000000046 +:101290000008000000000000000000000000000046 +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000200000000000DE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000001021A000A0020180B9 +:1013400000000004000000000020010000000080F8 +:10135000000000000100008000000000000000000C +:101360000000400000000000A0000000A000A080DD +:101370000004000000000000000000000000000069 +:10138000011000000000000000000000000000004C +:10139000000000000000000000000008000000083D +:1013A000000000000000000000000000000000003D +:1013B00000000000000000000000800000000001AC +:1013C0002004210020830000000000010400200010 +:1013D00020200000000204000020000000020000A5 +:1013E00000000000000000000000000005000000F8 +:1013F000000400000088000000000000000020A0A1 +:1014000000000401000000000000000000000000D7 +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:10143000000000000000000000000000001100118A +:1014400000000000000000000000900000110000FB +:10145000000000000020000020000000000000004C +:101460000000004000110000000000000004000027 +:10147000200000000000001120000000000000001B +:10148000000200000000000000000000000000005A +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D0000000000000000089002000004090000093 +:1014E00000000000000000000000000000000001FB +:1014F00000000000000000000000000000000000EC +:101500000000000000A0000000000000000000003B +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:1015400082000000400000008200010000008200D4 +:101550000082010091800180000001110000000064 +:10156000000000000000000004000000040004006F +:1015700000000100000000000005820000050000DE +:10158000000000A1048001210000000000210000F3 +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C0000000000041004100210000844000009024 +:1015D00009002040028204400440090204901100E6 +:1015E0000090000041820000000000000082000026 +:1015F00000A0008420000082000000A041000082C2 +:10160000000000000020C1100400000400002100C0 +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:101640000000000000000000010000000000000099 +:1016500000000000000000900000000000000100F9 +:101660000400000000000000000000000000000076 +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C00000000000000040000000020000000000D8 +:1016D0000000050000000000008000000000000085 +:1016E000100080000000000000000000000000006A +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000410008000503418087 +:101750000000000000000000000000000000008009 +:1017600000000000004000800000000000000000B9 +:101770000000000000000000000900000009000057 +:101780000000000000000000000000408000004059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000010018 +:1017D00001A0000000000000000000000040000028 +:1017E0000004000000C0000100C000000000000074 +:1017F00000000000000000000000000000000000E9 +:10180000000000000000000000000000100008843C +:10181000080010840000000000000000000000002C +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:1018400000000000200008000200900000000000DE +:101850000000010000000000000000000000000087 +:101860004090000001000000400000010000000066 +:101870000000000000000000000000000000020066 +:101880000000000000000000000000000000000058 +:101890000400040000000000000000000000000040 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000513 +:1018D00000200010031000000000000000000500C0 +:1018E00000000080000002110002800800080000D3 +:1018F00000000000000000000000000000000000E8 +:1019000000000000020000000000000000000000D5 +:101910000400800000004000000000000000000003 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000009002100000005000500000000400013 +:101960000011808000000000002000000000000046 +:101970000000000000000000000000000000000067 +:101980000020000000000000000000000000000037 +:101990000000002000000000000000000000000027 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D00000000041000000000000000000000000C6 +:1019E00000000001200200000000000100000000D3 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000020000000000000A6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A4000000000000000000000000000000000088E +:101A500000200000880000E000000000810002E09B +:101A60000000000000428400078100000011000017 +:101A70000700000A00000000000000000000000055 +:101A800000000000810002E00000000000000000F3 +:101A9000000000000000008100E0070000000000DE +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000FF000000FF00000000F8 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B6000000000000000000000FF000000FF000077 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE000000000000000000000000000FF000000F6 +:101BF000555500000000000000000000000000003B +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200003CFF3CF00000000000000000000000020 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000001400100000000060 +:101C60000000000000000000000000000000FF0075 +:101C700000005555000000000000000000000000BA +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000F000F0000000000000000000016 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD000000000000000000000000004000000619F +:101CE0000007800D000000610005800D0000151840 +:101CF0002A20054005A805790A26050D05A0000043 +:101D0000000000000000000000000000000000656E +:101D10000006800F2000000000000000000000000E +:101D200005790AA6050D05A00000000000000000CE +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D600000000000030FC3FFC3C3C3C30000000093 +:101D70000000000000000000000000000808000C47 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE000000000000000030FC3FFC3C3C3C3000013 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E6000000000000000000000E0F0F000000000B2 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE0000000000000000000000000EB0000000007 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F6000000000000000000000000000000420004D +:101F70004000000000000000000000000000000021 +:101F800000000000100420000000000000042000F9 +:101F90000000000000030000000000000004000436 +:101FA000000000002000000000030000000000000E +:101FB00020000000000040000000000000000000C1 +:101FC00000000000000020040002000000000000EB +:101FD00000000000000020040000000000000000DD +:101FE00000000000000000000004000000000000ED +:101FF00000000940000040C0000000000000000098 +:10200000000000004100410041000000000000000D +:10201000000220001100000000000000000000008D +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000004000000040 +:102060000000000000000000000000000000000070 +:10207000000000000100000000000010000000004F +:102080000000000000000000000000000000000050 +:102090000000000004000400040004000000000030 +:1020A0000000001000000000000000000000000020 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E0000000000000000000000020000000004090 +:1020F0000040000000001000000000080008050873 +:1021000000080008000800000000000800000000AF +:102110000000000000000082000000080008000825 +:1021200000080008000800000000008220000000F5 +:102130000000000000000000000800820008000805 +:102140000008000800100010000000000008001047 +:102150000008000800080008000800000008000847 +:10216000000800080000000000840008008400103F +:10217000000000800000000400000000A00000003B +:102180000000000900000021400004004000880019 +:1021900004000080000000110000000000000000AA +:1021A0000000000000000000000000210000000806 +:1021B00000000004008800210008000300890421B9 +:1021C00000200000000200020000000800000010D3 +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000800000000000000000020B7 +:1022000000200000000000000000000000000000AE +:102210000000000000040000000000002100000099 +:102220000000000000000000000000000390000813 +:1022300004000000000100040000009000000020E5 +:1022400080200001000000000000000000000000ED +:10225000000000000000000000000000000000007E +:102260000000000005000000000003000000000066 +:102270000000000020000000000001000000A0009D +:10228000010001000000A000000000000000830029 +:10229000880000040000000000000000000083002F +:1022A000820001000000A00000800000000000008B +:1022B000008000000000000000000000000000009E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000008000000F6 +:1022E00000000000000000000000000000000000EE +:1022F000000000000000800011001100200000001C +:10230000000020002000000000200000000000006D +:10231000200000000001000000000000210000007B +:102320002000000020000000000000040000000069 +:102330000000000400000000000000000000000099 +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:102370000000000000000000A104010000000002B5 +:1023800020002000001100000000000000000000FC +:10239000100000418808000000009000A00000002C +:1023A00001110000000000000004000020000021D6 +:1023B00000042141820000020000000582000000AC +:1023C00000030100001100030000000000050000F0 +:1023D00000050000000000000000000000000000F8 +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000100020000000AD +:10240000000080008000000000C003000000000009 +:102410000000A002002000010000000000000000F9 +:102420000400200000000000000000010000000087 +:10243000000000012000000000000000000000007B +:102440000000200004000000000000000000000068 +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:102470000000000000000000080000000000A005AF +:10248000090040080008A105020000080000A02083 +:1024900088000000200082028802100200048220CE +:1024A0008802008000088208888000210005012140 +:1024B0000005000400058202000500040000000879 +:1024C000002100080080002100020004000200003A +:1024D00000000005000000000008001000080000D7 +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000400D8 +:1025000000002000000111001000800021030000E5 +:1025100000000000410080840000000080002101D4 +:10252000030000204104000000000040000000A063 +:102530002000000000010000030000000001000076 +:102540000000030000000004000000200000000064 +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:1025800001C002900102048201C000C1008420C089 +:1025900000C008840108821001C088880191A082CF +:1025A00001C000880120102001C0008800088408B4 +:1025B00001C000880102100801C0028401108202DB +:1025C000000001C000A0000810080000000000008A +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000380800409808080038000080000AF +:1026100080004180800009808080038080000988DC +:10262000008003800000090000000380000010808B +:102630008080108000000900908003808000098065 +:102640008000000003800000008080800300000004 +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:102680000000000000090088910280800040008462 +:102690001105808000030082000580000010008882 +:1026A000912080800009809080048080000800894B +:1026B00080028080000900880009808000088082F4 +:1026C00000088080000000038089800880000000EE +:1026D00000800000008000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000000000000000000DA +:10270000000000000000A00020C10500C0C088003B +:1027100088C19100C0C0A000A0C1C000C090040149 +:10272000C0C10900C0C0880040829001C0C0100133 +:10273000C0C09000C0C0040084C10400C0C0A0019B +:1027400084C01001C0C00003880040C09001C0C018 +:102750000000001000000010000000000000000059 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:10278000000000000000000091841004C08900C017 +:1027900085842088C08900C085C00090408401C025 +:1027A00021A020C0C00400C090A00820C09000C09C +:1027B00011881084C00400C011A002C0C00400C071 +:1027C00011900890C02000C00001C1A02090C090CE +:1027D00001C00100000040000000000000000000F7 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:1028000000000000000000000000418000008088FF +:10281000028041800000808820804100000080808C +:102820004080412000008080208041008080800026 +:102830000980C100008080801080C100000080807D +:102840000280C10080008000108000014100000073 +:1028500000004180410000008000000000000000F6 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:1028800000000000000000000000000080021105B0 +:1028900080008080800011058000000080410005DC +:1028A00000808080802091050080000080098005E4 +:1028B00000808000800980058080000080108005F5 +:1028C0008000000080400002000000000001800441 +:1028D00000058080000000020000000000000000F1 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:102900000000000000000000000000000000C00106 +:10291000890040881008C000A10002888400C0011E +:102920000400A0C00810C001850088401000C0004D +:10293000100088840288C000100040848800C00015 +:1029400010004088C000C000C0010288C000000123 +:10295000C001C0004084A000000000000000000092 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:10299000480043E082224842480043E08222484205 +:1029A000000000008200480A480043E082224842BA +:1029B000600002E082000042600002E082004842C3 +:1029C000480002E082004842810002E08200484262 +:1029D0000000600002E0820048820041000007041D +:1029E00042000000000000000000000000000000A5 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B10000000000000004008400000842000400841 +:102B2000400000842000400840000084200040084D +:102B3000400000842000400840000084200040083D +:102B4000400000842000400840000084200040082D +:102B50004000008420000000400840000084200065 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C900000000000000000000000000030040006FA +:102CA000800E300030040006800E3000300000003E +:102CB0000000100030040006800E30003065000671 +:102CC000800F300030650006800F30003065000650 +:102CD000800F300030650006800F30000000006576 +:102CE0000006800F280005180A20050004A0000037 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D2000FF0000FF00000000FF0000FF00000000A7 +:102D30000000000000000000FF003C3C000000001C +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000FF0000FF00000000FF0000FF000027 +:102DB00000000000000000000000FF003C3C00009C +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000FF0000FF00000000FF0000FFA6 +:102E30000000000000000000000000000F0F00FF75 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA000000000000000FF0000FF00000000FF0025 +:102EB00000FF0000000000000000000000000F0FF5 +:102EC00000FF000000000000000000000000000003 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F20000000000000000004000000000004041085 +:102F30000400040204000000000000002000000063 +:102F40000000000020001008000000040000000045 +:102F50000000000000000100010000000505000065 +:102F60000000000020000003010001000080008438 +:102F7000000000000000000000000000000020042D +:102F80000000000000002000000000008800000099 +:102F90000000000000000000000000000000200011 +:102FA0000000000000002000000100000000000000 +:102FB0008001800080008000000000000000000010 +:102FC00000000000000000400000000000000000C1 +:102FD000000200000000000010001000000090003F +:102FE000000000000000000000000200020000409D +:102FF0000040000000000000000000000000000091 +:1030000000000000000000000000000000000000C0 +:103010000000400000000000000000000000000070 +:10302000000000000002000000000000000000009E +:103030000000010001000000010002000200040085 +:1030400000000440021008200820020000000000D8 +:103050000000000000000000044000000080048028 +:10306000000001000000010000000000008000805E +:1030700000808280000000000000000000000000CE +:103080000000000000000000000000002000200000 +:1030900088040004000000000000000000000000A0 +:1030A0000000000000000000000000000000000020 +:1030B00000080000020002000000024004000400BA +:1030C00002040208040800080400000000000000D8 +:1030D0000084000000000000000000000400040460 +:1030E000000404082002040220000900000020203F +:1030F0000020002000200008000040000000000028 +:103100000008000000080008000800080000800017 +:1031100080000005009100080008400800084000F9 +:10312000000800000008000800080008000800006F +:10313000408000800000000000000000000000004F +:1031400000210021002100000000000040000000DC +:1031500000080008000800000000000000000080D7 +:10316000000000210000000000800080000000013D +:103170000080000520080008000000000000000892 +:103180000000000000000000000000000000000837 +:10319000000000000000000000000000000000002F +:1031A000000000210000002100004000400000005D +:1031B000009021080004210000000084000000208D +:1031C000200041002100210000000000110011201A +:1031D00000200000000000840088000000820084BD +:1031E000000400A0118800840008112000200000C5 +:1031F0000000000400900088008400000000000827 +:1032000000000000000800000000000000080008A6 +:10321000000000000000000000004000000000006E +:10322000000000000000000000000000000000009E +:103230000000400000000000010000000000080045 +:103240000000000000000000000008100000000066 +:1032500000000000C000000088800800080008008E +:1032600008000100890001000080000000000080CB +:1032700001000000000000800000000000000000CD +:103280000000000000000000A0000000000000009E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B0000000000000000088000020000000000066 +:1032C00000000000000400000002000000000000F8 +:1032D00000000000000000000000000400000000EA +:1032E0000000000004000400040000040088000046 +:1032F0000040040000000000210400002100000044 +:1033000000000000000000000000000000000000BD +:103310000000000000840000000000000000000029 +:10332000000000000000000000000000000000009D +:10333000000000000000010000800080100000007C +:10334000000020200000000000000100000000003C +:103350000000820000000000008000800000820069 +:10336000000000009000000000080004C000010000 +:103370000100C0000180000001000000008000800A +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B0000000000000000000108400040008918458 +:1033C00000002088C185008411000000080800006A +:1033D0000084088404840884008421040004118883 +:1033E0002184008400C011000084008400C02110EA +:1033F00004840200000802200000200003000004F2 +:10340000000400002100000804000000000000008B +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000002020004C +:1034400090000009004182002002000000080009ED +:1034500000020000880000000000201100020009A6 +:1034600000090008000000008802000900020000B6 +:1034700009022088200820002021000000112000DF +:10348000000000000000000888000021000000008B +:10349000000000000000000000000000000000002C +:1034A0000000000800000000000000000000000014 +:1034B000000000000000000000000000000000000C +:1034C000000000000000000000008000000000007C +:1034D000000000000000000000000000800000006C +:1034E00000000000000000000000000000000000DC +:1034F0000000040080408000800080000000000088 +:10350000800000000000000000000000000000003B +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000001008A +:103540000000000000000000902000008200000049 +:10355000000000000000000000000000000001006A +:10356000000000000000000000000000000000005B +:1035700000000000000001000090000000000000BA +:1035800001000000000000900000000000000000AA +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C0001100002100000000110080800000800038 +:1035D00000000000000000000000000000000000EB +:1035E00020000000000000000000000000000000BB +:1035F000000000000000000020000080000000002B +:10360000000020000000000000800000000000001A +:1036100000000000000000000000000000000000AA +:10362000000000000000400000000000000000005A +:10363000000000000000000000000000000000008A +:1036400000000004000011050000000000200085BB +:1036500000800000000000000000000000000000EA +:10366000000000080000000800000000000000004A +:1036700000000011000011410000000400000010D3 +:103680000000000000058080000500000000000030 +:10369000000000000000000000000000000000002A +:1036A0000000000000040000000400000000000012 +:1036B000000000000000000000000000000000000A +:1036C000000000000001000001010002000000C035 +:1036D000008800040000000000000000000000005E +:1036E00000000000000100000001000000000000D8 +:1036F0000000000000000040010100400001004007 +:1037000000010040000000009002000000080000DE +:1037100000000000000000000000000000000000A9 +:103720000000000000000001000000010000000097 +:103730000000000000000000000000000000000089 +:103740000000000000000000020000010000000076 +:103750000001A001000000000000000000000000C7 +:103760000000000000000000100000000000000049 +:103770000000000000000000900020000000000099 +:10378000C0004090000000000190040040000000D4 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000002000000000017 +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000080200EF +:1037D00000000002000200000000000000000000E5 +:1037E00000000000000000000000000000001000C9 +:1037F000000000000000000020000003000008009E +:1038000040008000008005000000418080008000B2 +:1038100005000000000000000000000000000000A3 +:103820000000000000000000000000000000000098 +:103830000200000000000000000000000000000086 +:103840000000000000000000000000001100000067 +:103850000000801100000080000000000000000057 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000001100000037 +:103880000000001180000000000000000010000097 +:1038900080000000000000000000000000000000A8 +:1038A0000000000000000000000000000010000008 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000100F7 +:1038D00000000000C0018400A04040000000000083 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000100C7 +:10390000000000000001200000880000000000010D +:103910000000900000000000000000000000000017 +:103920000000000000000000000000000000000196 +:103930000000000000000000000000000000000087 +:10394000000000000000000000000000000048002F +:1039500043E000220000000000E00700000000003B +:1039600000000000000000000000000000008800CF +:1039700002E0000000000000000000000000000065 +:1039800002E007000082004186E00781C8000000D5 +:10399000880002E007004100000000000000000075 +:1039A0000000000000000000000000000000000017 +:1039B000810000E0000000000000000000000000A6 +:1039C00000000000000000000000000000000000F7 +:1039D0000000000000000000B2B200FFFFFF000086 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A0000000000000000000000FF000000FF0000B8 +:103A10000000F0F000003C3C00000000000000004E +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A500000000000000000000000B2B2AAAA0000AE +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000FF000000FF38 +:103A900000000000F0F000003C3C000000000000CE +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD0000000000000000000000000000000FF00E7 +:103AE0000000FFFF000000000000000000000000D8 +:103AF00000000000000000000000000000000000C6 +:103B00000000000000000000000000000000FF00B6 +:103B10000000FFFF000000003C3C00000F0F000011 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B6000FF00000000000000000000000000000056 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B9000FF0000000000000000003C3C00000F0F90 +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD000000000000000000000040006800E20002D +:103BE00010792A06054B25A80000000000000000FF +:103BF000000000000000000000650006800F2000AB +:103C00000000000000000000055C0A06050E25A06B +:103C1000157D2A26054F25A80000157D2A06854F0B +:103C200025A80000000000000000000000000000C7 +:103C30000000000000000000000000610007800D8F +:103C40000000000000000000000000000000000074 +:103C5000000000000000000000000000FF0000FF66 +:103C600000000000000000F000F000000000000074 +:103C70000000000000000000000000000000000044 +:103C8000000000000000000000000000FF00F0F055 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD0000000000000000000000000000000FF00E5 +:103CE00000FF00000000000000F000F000000000F5 +:103CF00000000000000000000000000000000000C4 +:103D00000000000000000000000000000000FF00B4 +:103D1000F0F00000000000000000000000000000C3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D6000FF0000FF00000000000000000000000055 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D9000000000FF00000000000000000000000024 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE0000000FF0000FF00000000000000000000D5 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E10000000000000FF00000000000000000000A3 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E600000000000400000000000200020000000D2 +:103E700000000000200000044000000000000000DE +:103E8000000004004000400000000000400000026C +:103E900040000000000000042000840084000000B6 +:103EA0000000000120002000200410040000000099 +:103EB000000004004000000000002000200020005E +:103EC0001000000020004000200000000000000062 +:103ED0000002000000000000000020002000200080 +:103EE00000020000000000000000000000000000D0 +:103EF0000000000000000000000000000090000032 +:103F00000090000000000000000000000000000021 +:103F100000000000000000000000000000000000A1 +:103F2000050000000000000000000000000000008C +:103F30000000000000000000000000000000000081 +:103F4000000000020040100000000000000000001F +:103F50000000000000000000000000000000000061 +:103F60000000400000000000000000000000000011 +:103F7000020000000000000500000000000000003A +:103F8000000000000000000002000000000000002F +:103F900000000000000400002000000000000000FD +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000008000000900069 +:103FC00000000000000000002000000000000000D1 +:103FD00000000000000020000000000000000000C1 +:103FE0000000000000000000040000000082000447 +:103FF0000000000000080004000000000000008431 +:10400000008400080008000200080000000000080A +:104010000000000000080000000000004000000850 +:104020000000000800084000000000080000000038 +:104030000084000005000008050000088000000062 +:1040400000840000000800084000008420000000F8 +:1040500000004100000000080000400800000000CF +:10406000000800000008200800000000A000000078 +:1040700000008203000000000000000300000000B8 +:1040800000004000000040000000000300000000AD +:104090000010000500000000000000040000000403 +:1040A00000040000000000000040000000000000CC +:1040B0000000000000000000000000000000000000 +:1040C00000000008000000000000000000000000E8 +:1040D0000000000500000000004000000003000098 +:1040E00000000000000000000000000000A0080028 +:1040F000000000000000000000000000008400003C +:10410000000000840000000000000000000000002B +:10411000000000000800008403000084000100008B +:10412000000100010000000000000000000000008D +:1041300000000000000000000088000000000000F7 +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:104180000000000000000000000008000000000027 +:104190000000000000000000080000000000000017 +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:104210000000080000000000000000000000000096 +:10422000000000000000000000000000000000008E +:10423000000000000000000000001000000000006E +:10424000080000822100000000000000000000A023 +:10425000000000080000000008000000000000004E +:10426000000000000000410041000000000000A02C +:104270001000000800000000000000000000000026 +:104280000000000000000000000800000000000026 +:1042900000400000000000000000000000000000DE +:1042A00000210000000000000000000000000020CD +:1042B00000000000000000000000000000000000FE +:1042C00000200000000000000000000000000000CE +:1042D000000000400000020000000000C0000000DC +:1042E00000001000000000000000000000000000BE +:1042F00000000020110000000000008400C0000049 +:1043000000C0000000000000000000000084000069 +:10431000008400C000A0000000A000A000000084F5 +:10432000000000C04000000000C00082000003C088 +:104330000000008400000200210000000082000054 +:10434000000000000000000000000000000000006D +:104350000000000000000800000000000000000055 +:10436000000000000000000000000000000000004D +:104370000000000000000000000000000008000035 +:10438000000000000002000000000000000000200B +:1043900000000000000400210000002100000000D7 +:1043A00000000000000000080004000000040002FB +:1043B000880200020000000000000000000000026F +:1043C00000000800000000000000000000000000E5 +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000080000000000000000C5 +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000001000000018A +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:104460000000000000000000000008000000000044 +:104470000000050005000000100000000000000022 +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000A0000448 +:1044D000004000900000000000000000000000000C +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:1045400000000000000000000000000000002080CB +:10455000008000800000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A0000000000000000000000000000000000902 +:1045B00000000009000000000000000000000000F2 +:1045C00000000000000000000000000000000000EB +:1045D00000000021000000000000000000000000BA +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:10465000000000000000001000000000000000004A +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000080000000100000000000000F1 +:1046C00000000000000000000000000000000000EA +:1046D0000000000088000000000010000000000042 +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:1047300000000000000080000000410000000000B8 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000040000000000000000F5 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000010002000000028 +:104860001000000000000000000000000000000038 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000810002E0000095 +:1048C000000A0000000000000000000000000000DE +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:1049500000000000000000000000000000004242D3 +:1049600042420000000000000000000000000000C3 +:104970000000000000000000000000000000000037 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E000FFC33C00000000000000000000000000C9 +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000000000D6 +:104AE000000000002028E3EB0000000000000000B0 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000000000000000000000000055 +:104B60000000000000000008C3CB000000000000AF +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000650006800F20000000CB +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C50000000000000000000000000000000000054 +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000003 +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E20000000200000042000880020002000000076 +:104E3000000000000000000420000000000020002E +:104E400000002000C008200040008400C0001000C6 +:104E5000000000000004A0002000400088001000B6 +:104E6000000210002000400040000400200010005C +:104E70000400080000000000400440004000100052 +:104E800000004000200020002004C000200040005E +:104E90004000400040000003C0004000000000004F +:104EA0000000000000000000000000000000000002 +:104EB00000004000000000000002000000020000AE +:104EC0000000000000000000009000000000000052 +:104ED0000000000000000000000000000000400092 +:104EE00000000000000000000004000000000000BE +:104EF000000000008000000000040000100000001E +:104F00002100000020000000000000000000000060 +:104F10000000000000000000000000000000000091 +:104F20000000000000000000040002000010080063 +:104F3000001000100000000000000000044100000C +:104F40000000040000000000040004000200000053 +:104F5000020002000000000000000002000000004B +:104F60000000200000000000000000000000000021 +:104F700000000400000000001100080040100800BC +:104F8000010000000000000000000000000001001F +:104F900000000800080000000000000000000004FD +:104FA0000000400008000008000000080008200879 +:104FB00004844084088400000008000800004008C1 +:104FC00004000000001004840400008400080408A9 +:104FD0002000048400040000400800020008098446 +:104FE00000000000000800000000400002840208E9 +:104FF0000088000040000000000008840088850848 +:10500000808808000400008400004000200441085B +:1050100002840000A000800040000004008800849A +:1050200020082000850080000003880000000000A8 +:10503000000000090000000000000000000000085F +:1050400000000009000988080000000000000000BE +:10505000000000000000000000050000000804003F +:105060000400000000050000000000000000000037 +:10507000C000000800000000000000000000000860 +:105080000000000000000000000000000003000815 +:105090000000C000004000000005000000000020EB +:1050A00000400003A002C00000210000000000003A +:1050B00000A0000000000008000000000000000048 +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F000000000000300000041000000000000006C +:105100000000000000080082000000020300000010 +:105110000000000000000000000000000200040089 +:10512000000000000000000100000000000000007E +:10513000000000001000000000000000000000005F +:10514000000000000000000000000000000000005F +:10515000000000000800000008000000000000003F +:1051600000000000100000000000000000000040EF +:10517000002008000020000000200800000010109F +:10518000840000000800A000080083000800000060 +:10519000830000008300080008A1C0004000A000B8 +:1051A00000800000088000000000100000400000A7 +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000800000000000000D7 +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000210100000000210008001000080000003B +:1052100000000800210002001000831000000802B6 +:1052200000000002100010020300000000200084B3 +:105230000000000000000000000000000000000866 +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000002000000000000003C +:105270000000000000000000080000000000200006 +:1052800040000000040000000000A0000400100026 +:10529000000400020400402040008208C00000001A +:1052A000880020000009C000C000900000048200B7 +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:105300000004000000000020030000000000000076 +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:10533000000000000000000000000002000000006B +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:105360000000000000000000000000000008000035 +:10537000000000000000000000000008000008001D +:105380001000000008000400000000000000000001 +:105390004000080000800000000000210021C00043 +:1053A0000000000040A100008200100090080100F1 +:1053B00084808200C020000000000800210000005E +:1053C00000000000000000000000000000000300DA +:1053D00000000800020000000000000000000000C3 +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000400020000000000A7 +:10540000000000000000000000000000000021007B +:10541000000000000000001000000000000000007C +:105420000000100003000302080000001000030049 +:105430004000001008000001000000000000000013 +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:105480000000000000000000000001A100040290E4 +:10549000000510A000020020000803C0082000A0A2 +:1054A000821008A00002200240100000000002004C +:1054B0000000A021402100A10283000000000000A4 +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000108821A042 +:10551000800000820380000000000080A1800080E5 +:105520000080800000800080008000800000080073 +:1055300000000000804100210020008200000000E7 +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:105580000000000000000000000000000000080013 +:105590002111030002200000001080000000000024 +:1055A00000080080008000000003008000000080F0 +:1055B00000000000001120004105891088C0000093 +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000000000000000000000BB +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A +:105610000020010000900000080020004000080069 +:105620000000000000840002880000000802000062 +:105630000002000000000000A1900200A0824004CF +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:105690000000C0010100000189000800009000081E +:1056A00010A00002001000008208209000219084C9 +:1056B00091C0000000000000000010880088888869 +:1056C00008100000000000000000000000000000C2 +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:10571000000000008002101041210800000000007D +:105720000080808000800000000080800041001028 +:1057300000882190002000080020000800002000C0 +:10574000C000808000000000000000000000000099 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:105790000000000000000083080090008010000856 +:1057A0000000008080000040801080008000000029 +:1057B00000000000800010000000080005808380C9 +:1057C00088820500100900000000000000000000B1 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000000000000A9 +:105800000000000000000000000000000000000098 +:10581000000000000000000008A00900850002014F +:10582000880010208840A000100004004000020002 +:10583000880020909000A0000100000000000008F7 +:10584000844002A0A02040000000000000000000F2 +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:105890000000000000000000000000000000000008 +:1058A00041000000000000000000000000000000B7 +:1058B00000000000000000000000000000000000E8 +:1058C00000000000000007000000000000000000D1 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000000000000097 +:105910000000000000000000000000002200FFDD89 +:1059200000000000FFFF0000F5FFA0AA000000003B +:105930000505030300005050B4B4FFAA00000000A6 +:105940000000000000E800E8E0C0E0C00000000047 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000770090 +:1059A000FF8800000000C0CFC0CFF5FFA0AA0020F4 +:1059B00080A0F3F30303D080D080B4B4550000007E +:1059C0000000000000000000003CF000F0C00000FB +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000006F9FF00000000C5000000E1F0C3D24D +:105A30001C0C1C1C0000000000005FDF41EB41EB70 +:105A40000000000000000000000000000B0B0F0F22 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA000000000F609FF00000000CA000000F0E15D +:105AB000D2C31C0C1C1C000000000000FFDF41EBE7 +:105AC00041EB0000000000000000F5D7A082000BB1 +:105AD000000F0000000000000000000000000000B7 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000000000000610006000D00000000000001 +:105B300000000000000050000000000000610006AE +:105B4000009D000000610006000D00000061000ED5 +:105B5000000D00A000000000000000000000000098 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA0000000000000005555555500FF00FF0000A3 +:105BB00000000000000000000000000000000000E5 +:105BC0000000555530F3D2D25555DB81DB813F3093 +:105BD000F5F50000000000000000000000000000DB +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000000084 +:105C20000000000000000000F505F50500FD00FD86 +:105C30000000000000000000000000000000000064 +:105C400000000000555530F3D2D2FFFFC3C3FF0060 +:105C50003F300505000000000000000000000000CB +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000C3AA0000ABFFDD +:105CB00029FF0000000000000000000000000000BC +:105CC00000000000000000000000000000000000D4 +:105CD000000000005F5FB0308000000000000000A6 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D2000000000000000000000000000FFFF000075 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D500000000000FF004B4BF030C000041020009A +:105D60000204210004002000040004008800100048 +:105D700040002008408089804000219020002000C1 +:105D800040042000200020002000C004200020004B +:105D9000100020001000200020002004000140001E +:105DA000200020042000080020002000C002400045 +:105DB0000000880400048400040020000400200087 +:105DC0002000A00088004000200084000404840219 +:105DD000C00020008400C00020000211C0000000AC +:105DE000000080004000800000008040800400002F +:105DF000A00020000000000810040000900800002F +:105E00000000100200400000000000002000000020 +:105E100000000000000020000000008200000000E0 +:105E200021000000000000008000000000020400CB +:105E300008004000000000000000000000002004F6 +:105E4000050000000000000080000000400020006D +:105E50000001000041000000000000000000000000 +:105E60000100010001000108000004000100000021 +:105E700000000000000001001110000010000000F0 +:105E80008800000000000000020002000200020280 +:105E900000080000000000000000000000000000FA +:105EA00000000000000000000000000008002000CA +:105EB00000004000400040000000000420000000FE +:105EC000400000000800840000000800900002006C +:105ED00003000880000008004000000008000000E7 +:105EE000410002081000040402840000008204083B +:105EF00000080084000000844084A001000089089C +:105F00000000408440000008090400000000000870 +:105F100040080082000040000084000000000008EB +:105F200000000000000800000908000820008000B0 +:105F30004008400889048000A0004000050040009F +:105F4000200880080084800020080084C000000031 +:105F50008908880880020004C1008088400080020F +:105F600000048884042100000000000000000000FC +:105F700000000000000800000000000320001000E6 +:105F80001000204000200000000500050000000077 +:105F900000400000040300000000000400000000B6 +:105FA00000040008000000000000000000400000A5 +:105FB00000000000002100000000000000000000C0 +:105FC0000000000000020009009000000020000016 +:105FD0000021000000210003000000000008002054 +:105FE0000004000000400000000000080000000065 +:105FF0000000000000000000000000000000800021 +:1060000080009100800000000000080000000000F7 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000900050000000900000005200200000022 +:10604000000000A00000410205820511410000404F +:10605000408400A009901000210040000000038847 +:1060600003000500210800000400A1000000052035 +:106070000800040008000020080000000000820062 +:1060800000000000000008000000000000001000F8 +:1060900000000000000082000000000008008200F4 +:1060A00000000000000000000000080000000400E4 +:1060B000820900000000A0000800000000000000AD +:1060C00082080811A100100082008400A0001000C6 +:1060D0000800840040000089402008800400A0805F +:1060E0000080080000000810080080000200000086 +:1060F000820100009000100003A1002000000000B9 +:10610000000003000000000000004100000000004B +:10611000100000000000000000000000000000006F +:1061200000000000410000000000000000880000A6 +:1061300041000000100000000000100010000000EE +:106140000800008200004008030040A0418400C015 +:106150004100050003001100001005840302400007 +:10616000000211402100000021030000080000008F +:106170000000000000000000000000000400040017 +:1061800000000000000008000121000000080020BD +:1061900000000008000000000000000000000000F7 +:1061A0000400000000000000000082200000000049 +:1061B00000000000000000000000000000000808CF +:1061C0002020000200080000081104200411000033 +:1061D0000000C0008400200082000400840588A024 +:1061E00082218202100382000400002000200200AD +:1061F000000000000000000000000040000000005F +:10620000000000000000000000002040002000000E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:1062400003020908109008884000000400001002B2 +:106250000040000000000000090040204100100044 +:1062600009020000000500000000000400900588FD +:106270000180C080088000000100010000000800CB +:10628000000000000000000000000000000000000E +:10629000000000000000002100000000002100219B +:1062A00000000000000000000000000000000000EE +:1062B00000000000000010000000000000000000CE +:1062C00000000003080000000000000284008400B9 +:1062D00000000003401040008200082100000280FE +:1062E0008400400800004000A041040000000000BD +:1062F00000000440002000400000040004000000F2 +:10630000000000000000000021000000000000006C +:10631000000000000002000000000000000000007B +:106320000000000000000000050000000000000068 +:1063300000A00000110000000000000000000000AC +:106340000082000000000000000000004101000089 +:106350000000410000824101000010C000A00000C8 +:1063600088080500C100000280000088008200004B +:1063700000002100000004008200009000000000E6 +:1063800000000000000000002000000000010000EC +:1063900040010000000000000000000000000000BC +:1063A00000000000000000000000000000000000ED +:1063B000000000000000000000000000000000A03D +:1063C00000880010002000000101A0010000000072 +:1063D00001002000000101A0009000080090C021F1 +:1063E000009000082010C19009A090A088209088FB +:1063F0004088888802820000A00080000000000021 +:106400000000000000000000400000000000084103 +:10641000081010100009000000000000000000003B +:10642000000000000000000000000000000000006C +:10643000000000000000000000000000000000005C +:1064400000800000008000000020102100100002E9 +:106450000020030000000021108000000000000068 +:106460008041002000200085904008200041000865 +:10647000400041000080808000000000000000001B +:10648000000000800000008000000000000000000C +:1064900003000841051141910000000000000000C8 +:1064A00000000000000000000000000000000000EC +:1064B00000000000000000000000000000000000DC +:1064C0000000000000100000000000802000080014 +:1064D000102111800300080010000000002100803E +:1064E000000000000011808000001080202120802A +:1064F0000403800000108010800040000040000075 +:106500000082000000040000000200000000000003 +:10651000000000900100018901020000000000005D +:10652000000000000000000000000000000000006B +:10653000000000000000000000000000000000005B +:106540000000000000000001001000000008000032 +:10655000010000010008010001000110000000001E +:10656000000200000000C000A0108800011001011E +:1065700000A000018800200040011000010000037D +:10658000A000000100000000040000000001000065 +:1065900000000001000100010000000100000000F7 +:1065A00000000000000000000000000000000000EB +:1065B00000000000000000000000000000000000DB +:1065C00000000000000010000000000002000000B9 +:1065D0000000000100010001010100010000900025 +:1065E00000000400200088A000000140A00420005A +:1065F00001A000030091080200A1002140A1022097 +:1066000000A00008004140000000800000000010D1 +:106610000020000800410008082041080041000057 +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:1066400000000000000000008000000000000200C8 +:10665000001010020821000800100308082110088B +:106660000000000080001000000005000580C00050 +:106670000008208341A1001080880010000503025B +:10668000000000000000000000000000000000000A +:106690000000000000000000C10811004100884017 +:1066A00000000000000000000000000000000000EA +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000800000008000CA +:1066D00080001082210011000311402109004100B7 +:1066E000100880008000000000008003800080000F +:1066F000800021030300100004030011808000804B +:1067000080000000400000000000000000000000C9 +:10671000000000000000000000001121A000A00007 +:106720000300000000000000000000000000000066 +:106730000000000000000000000000000000000059 +:1067400000000000000000000000000008009000B1 +:106750008400100001100000000000000191000002 +:10676000000000014000820020000400C000A004DE +:106770000420080009820000890004000200880249 +:10678000C040020000000000070000000000000000 +:10679000070000000000000000000000880000E08A +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F00000000000600000000000000060000000D9 +:106800000000000000000000FF000000F0F00000A9 +:106810000000000000000000000000000000181A46 +:10682000191B000000000000000000000000000034 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000C0CFF0F00000000000000000000000012 +:106860000000000000000000FC0CFFFF0000000022 +:10687000FF0027277E7E1818000000009F069F0655 +:10688000C0C0C0FC1800FF660000FF000000F0F070 +:1068900000000000000000000000000000000000F8 +:1068A0003C3E3D3F000000000000000000000000F2 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000404F40400000000000000000000B8 +:1068E00000000000000000000000FC0C999900006E +:1068F0000000000000007E187E18B1B1FFFF060600 +:106900009F9F0000FFFF9090FFF600000000000036 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000003C3C00008F +:106990003C3C00000000000000000000000000007F +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000087818781000000000000A7 +:1069E00000000000000000000000000000000000A7 +:1069F000028300000000990F0F99666600FFC3FF35 +:106A0000F00000000000C090C0906C663C363C3C3A +:106A100000003C3C000000000000000000000000FE +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A500000000000000000000000FFFF0000000038 +:106A60000000000000000000000000000000000026 +:106A70000000FFFF000000008D8D8D8DF0F000FF05 +:106A8000C3FFF0FF00000000C0C09090666C363C71 +:106A900015612A06154D00A805000A00150000A082 +:106AA00000610006000D000000000001C0000000B1 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE000000000610006000D000000610006000DBE +:106AF00000000000000000000000A0614006000D42 +:106B0000000000614006000D000080610006001DCD +:106B1000000100000000BCBCA0BC000000000000A0 +:106B2000000000000000BCBC3CBE5F503F3F28EBB3 +:106B3000F3F300000000000000000000000000006F +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B6000000000007777FF55099F099FE1A0F5B469 +:106B700000FF00FA0000000000000000000000001C +:106B80000000000000000000E020E32300000000FF +:106B9000383C382800000000A0A0A0BC0000000085 +:106BA0000000000000000000A0A000AA5F503030EC +:106BB00028EB303000000000000000000000000062 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE000000000000000444400550F0F00FFE1A02A +:106BF000F5B400F700F700000000000000000000FE +:106C0000000000000000D7F014F0EC2CEF2F000083 +:106C100000002828282800000000000000000000D4 +:106C200000000000000000000000000000003C3CEC +:106C3000FF00ACAC0FFF00000000000000000000EF +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C600000000000000000007D75FFF70F0F00FF1F +:106C70007D7D2828FE5CFE0C000000000000000066 +:106C80003F3C5F5500000000FDADF8A8C8F8CBFB05 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB0000F0F5555ACAC00F00000000000000000C4 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000F0F86 +:106CF000AAAA7D7D7D7DFEFCFEAC000000000000A8 +:106D000000000F000F00000000005D0D580808385B +:106D10000B3B000000000000000089002000000480 +:106D2000040400002000201120912000200088048D +:106D300004000000200020002000C000100000001F +:106D400000040480880021002000C0002000C00052 +:106D5000400040802100A000200800034000040003 +:106D6000020400024000400040008800880021002A +:106D700020042000080020008900200040000800B6 +:106D8000A0040404840010002100200000008400FE +:106D90008803040310008802040020021000000091 +:106DA00000000000200000000004000400000000BB +:106DB00000008000040000840000000200022000A7 +:106DC0000000000005404000100000000000090025 +:106DD0002000090080200882200000000000100030 +:106DE0000000800009002000200041020000400057 +:106DF00004000000000021000900200041002000E4 +:106E0000C1004100400009000000400000000000F7 +:106E100004002000100000000091000000000000AD +:106E20000000000500000410000000000000000049 +:106E30000000020001200040040010400040020059 +:106E40000000000000040000040000000200000038 +:106E500000000040000040000000000001000000B1 +:106E6000004100100000401009000011080000005F +:106E70000000200000002020000040000010000062 +:106E80004140844040090102000004044100020026 +:106E900000000800000540100500000041104009F6 +:106EA00000084000090800884008000800840084A9 +:106EB0000040004020000409000800400984040448 +:106EC00000840000000800010084000800000008A1 +:106ED0000000040000084108898809000008020039 +:106EE00000000000000140080000C00800C0A00031 +:106EF0000008000004000020C00800088000050908 +:106F0000008282000400850808010010000088004B +:106F100080080000C00020008009080800008811D7 +:106F200080040000000000000021000300000000B9 +:106F3000000000000000000800110000000000092F +:106F400000050000000400000000100800200009F7 +:106F50000100000500000000040000210000000006 +:106F6000000000000000000000000000000300001E +:106F7000000288414009A0400221000410022000C4 +:106F800004042008880020208405402120210008D6 +:106F9000041104110040C0408803822190050000C4 +:106FA000A00082000082000000000000000003003A +:106FB00041000000000020820000000000000000EE +:106FC0000000000000900090000008008000000019 +:106FD000000004000000000000000000002000008D +:106FE0000000000000000000080000200500400034 +:106FF00003000000000009004140110000010802E8 +:1070000009820005400041000800100440042100EE +:10701000030005000582080041014100030009004A +:107020000000040000000000000088000080002034 +:10703000820004000000C000000084050000080079 +:107040008200040000000000100000002000400248 +:10705000080001800080002010001040080000207F +:1070600040000800C00000008410100220048400CA +:1070700040024000822110000004002010000000A7 +:107080008202104108008210841001000810C0C163 +:107090001005900210000800C0000800A0000800C1 +:1070A000000509100800080500000900090009048E +:1070B000210100000000110000000000110040004C +:1070C000002000000000000000820000000080009E +:1070D00080200000202000040000000000000000CC +:1070E00000018000C1000000000008012001A10192 +:1070F0001100800185004000000000000085002094 +:10710000002000000000110000010001400000010B +:10711000404003000001040089000000000210202C +:107120001100000040010020800000000000000469 +:10713000080040001000820000080000000000006D +:1071400000020021000000000000900000009000FC +:10715000900000000000000010401000000000003F +:107160008200000000000000000000000000082174 +:10717000000040110000400040030000C0008402F5 +:10718000040082110400400000030004A005100860 +:107190008200000008080840400010004090C10034 +:1071A00000A01085090003110002C080000000004B +:1071B00008010000000000000000000000000000C6 +:1071C00000000800002005A00004050000000000E9 +:1071D000000000000000000000008001000000002E +:1071E000000000000000000000000000000000009F +:1071F00000000000000009001000418840004184A8 +:10720000400003040000408840000404050008001A +:107210000008050040001100410410004004000275 +:107220004000210221024090400803094108080063 +:10723000000000000000000000000000100000003E +:1072400000000000000000000000000800008200B4 +:107250000000880000102000010000000000000075 +:107260000000000900000008040004000000000005 +:1072700000008200000010210000400000210021D9 +:1072800008000084000000000821002110210021D6 +:1072900008080000840340020008841140084000F0 +:1072A0008202C000820008050000840090008285F0 +:1072B00000000000000011001100000200000002A8 +:1072C0000000080008882100000000000000000005 +:1072D0000800000000000000800020000500000001 +:1072E000080003000000000004000000000000008F +:1072F0000000200021000300204000208004000046 +:1073000008000000030500000000A1840000002028 +:1073100000000000000002000000400000880000A3 +:107320000000000108001000800000840000000040 +:10733000201001000000000000000000000000001C +:10734000000000000000000000000000000000003D +:10735000000001002000410000000001900000003A +:1073600000010000000000000000C0A00082000337 +:107370009008000000A082900108000802A0008888 +:107380000020009001A12108111000034002000418 +:1073900001029002A0C0894010A08200C004012018 +:1073A00008048804824101200008040902A0A00901 +:1073B00082900091110021000000000000000000F8 +:1073C00010000000000000000000000000000000AD +:1073D0000000000002002100030000004041802165 +:1073E0000005000200000000000000000080008096 +:1073F0000008000900000080000003800000808079 +:10740000000900030005028810904141000280003D +:1074100000000280008080A0038280048010880029 +:107420002180000000000808218800108088C085A5 +:107430008503804100020041090000030080000034 +:1074400000000000000080000041000080000000FB +:107450000000000000000000000000000000000824 +:107460000980000300800000000000000000000010 +:107470000003000000100000410002001085098296 +:107480000000000200000008200003200800410363 +:1074900083802008109188402080101008210290DD +:1074A000030083A1C100C0828000A0008500C00845 +:1074B00041801002900500A000010100000000883A +:1074C0000000000000880000A00082012088020067 +:1074D00000000000000000000000000000000000AC +:1074E0000001010200000002000000000000000096 +:1074F00000000001009000910000008800000009D9 +:107500000088000000000010000100100100004091 +:10751000019110A00801418403200108100191018C +:1075200002890440A1C0400002A18800820004003A +:10753000058282100901A1C000080000840000003B +:107540000100000000000000010000000000000039 +:10755000000000000000000000000000000000002B +:1075600000010500888808000000000002000000FB +:107570000000091000A00010101000000000000022 +:1075800000000000881000A0000008C010000000EB +:10759000A000080010040010000808A00811012035 +:1075A0000102A0011000001100850388C040009076 +:1075B0000503A041C00001C00004000500008000D8 +:1075C0000000410000000000000008000000000072 +:1075D000000000000000000000000000000800089B +:1075E00000200010C1004080902141000500800073 +:1075F00000000000108003800080100000000000E8 +:107600000000000040000000008000000000801129 +:1076100020418910800300000000008080808021CC +:10762000400905118803800200840090A185008034 +:10763000050010A18002801103030341050300002F +:10764000001103000000000080000000800080089E +:107650000021000080000000000000000000000089 +:107660000000000000000011400000800000000049 +:10767000000000000000210088100200020000004D +:107680004108A10008001111210088001000040029 +:107690002189100241002000108220804100090849 +:1076A0004102210205A105008389C0000500A0094F +:1076B000412120210300050341219040008803025D +:1076C000000000010000000004008200080090009B +:1076D0000200900282200400000000000000000070 +:1076E0000000000000000000000100000040000059 +:1076F000000000000000000089008200020002007B +:1077000000000110820009000000090004000000D0 +:1077100000008311040088000400900288A008A0E3 +:10772000880089C008890003890010C02084824035 +:1077300010000003004000040001890904910009C1 +:107740000000000000E000008141000000E00700B0 +:1077500000000000000007004200000000000000E0 +:107760000000000000E000000000000000E0070052 +:107770008200000000000000000000000000070080 +:1077800000000000000000E0000000000000000019 +:1077900000000000000000E007000081000000E0A1 +:1077A00000000000000000000000000000000000D9 +:1077B0000000500000000000000000000000000079 +:1077C0000000420000000000000000000010000067 +:1077D0000000000002032A3F00000000000000003B +:1077E0000000000000000000000000000000000099 +:1077F000F0F000000000000000000000000F00009A +:10780000FAFAFA5000000AFA0AFA00000000AAAADE +:10781000FF000F0F0707FF3CFF2C00000000CFC048 +:10782000CFC0AFEBAFFFFFFF3CC38B558B550F0FA6 +:107830000F3C0000FFFF000000000B0B0B0B00557E +:10784000FF55A00AF55F00000000000000000010D6 +:1078500000000000000002002A00000000000000FC +:107860000000000000000000000000000000000018 +:107870000000F0F00000000000000000000000A385 +:1078800000A3D2D2D25000000AFA0AFA0000000087 +:10789000AAAA00FF0F0F07073C3C2C2C0000000099 +:1078A0005F5F5050AFAAAFBE00003CC367196719B5 +:1078B0000F0F0F0F0F050F0500000000030FC3CFC0 +:1078C00000AAFFAAA00AF55F000000000000000067 +:1078D0000000000000000000000000003F3F0F2FEC +:1078E0000000000000000000000000000000000098 +:1078F0000000FFFF0000FFFF00000000000000008C +:107900000000FF5700000000000000FCFFFC00002A +:10791000000082610061000000007D7D41410000A7 +:10792000000010FBD0F8FA0ABE82FF005555005F38 +:107930005AA0C3FFC300FC82C082C31700173C3C9F +:107940003C3CC0330FCC6295629500000000000003 +:107950000000000000000000000000000000FFFF29 +:107960000FAF000000000000000000000000000059 +:107970000000000000000000000000000000000007 +:1079800000000000FFF700000000000000FCFFFC0A +:1079900000000000AAE328E300000000FD7DF141A3 +:1079A0000000000020F7E0F4AFA0BE820000F0F07D +:1079B0000AF5F5FA0F550F55FCBEC0BEFF173C1770 +:1079C0000D7D0C3CF0C0CFF38AE78AE7004000064B +:1079D000000C000000610007000D0000000000081E +:1079E000000000000000000000000000006100072F +:1079F0000009000005402A06054C00A80000000010 +:107A0000000000000561400E000D000000008061D4 +:107A100000070005000000610006000D0000006185 +:107A2000000D000900000061000700050000006172 +:107A30005006001D000000613006000D00000061CE +:107A40000006001D000100610006000D000000009E +:107A50000F0FFFFF0000000000000000000000000A +:107A60000000000000000000000000000000000016 +:107A7000000005FF05C30000FF0000FF000000003C +:107A8000000000000000F0F0000000000000000016 +:107A9000C0F0F5F0000000000F0FFFFF0000000035 +:107AA0000FBE0F145541F5E1145041500000000085 +:107AB0004B4BAAFF00540004F505F505FBF1F1FB63 +:107AC000C3FF3030FF00FFFFC30000EB000A00A03F +:107AD00000000F0F00000000000000000000000088 +:107AE0000000000000000000000000000000000096 +:107AF00000000000050005C30000FF0000FF0000BB +:107B00000000000000000000CFC0CFC00000000057 +:107B10000000F0F0F5F000000000303F303F0000C2 +:107B2000000000BE00141400B4A0D75F7D5F000009 +:107B300000004B4B0055FF54FF04FCFC0C0C10B034 +:107B4000B010C3FFF3F3FF000000C3000028008261 +:107B5000008200000000F0F00000000000000000C3 +:107B60000000000000000000000000000000000015 +:107B700000000000000000000000FF0CFF05F0F016 +:107B80000000000000000000000035353535000021 +:107B900000000000000000002D007D00FC0CFC0C2B +:107BA0000000000080D08ADA00FFF0F00000000042 +:107BB00055FF75FF00AA55FF330CC0C3000000003D +:107BC000410041005500C0C05F0AFFAA0FC30FC3A8 +:107BD0008B558B5500000000F0F000000000000005 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000C0C050563 +:107C0000F0F00000000000000000000035353535C0 +:107C10000000000000000000000028007800FC0CBC +:107C2000FC0C0000000085D58FDF3C3C00FF00000D +:107C3000000000AA20AA4B4B4B4BCF3F33C30000A0 +:107C40000000E1A0E1F500AAC0C05500F5A0FF5575 +:107C5000005567916791200020000000840088058E +:107C600020002004400520002000C00220008800E1 +:107C70008800840288882000880088002000200076 +:107C80002000880420042000040020024005200079 +:107C900088002008C0200003880020000400200085 +:107CA0008800880040002005200000000404200413 +:107CB000200020000180889020088803200504020D +:107CC00000042000880020052040880088008802E9 +:107CD000200040008480208200000000200000007E +:107CE000400000000900000004000400100009002A +:107CF00040000000000040200000000010000000D4 +:107D00000000000000020000400000000900000028 +:107D10002100000040030401000040004000210257 +:107D20000900000040001002210000000000410096 +:107D3000100004000040202011210000000000007D +:107D40004100200000000084000000002100040029 +:107D500020004000000000041009000000000000A6 +:107D60000000001002000000000000000000000001 +:107D70000000000000000000000000000200000001 +:107D800000000000000000000000000000000000F3 +:107D9000000000000000000000880000000000005B +:107DA00000000000000000092000000000000200A8 +:107DB0002000000000200000200800020000200039 +:107DC00084020000040000000400820000000000A3 +:107DD00000002000000000000010000400840000EB +:107DE0000000008400820000000800080908090063 +:107DF0000400040000000000000800000010000063 +:107E00000000000000000000040800020408000058 +:107E10000008090000000000000800210000000226 +:107E200000000000000000080000000800000084BE +:107E300000044008400000000000040904010400A0 +:107E40000084409040000002040041080002000449 +:107E5000410000040000048800040008000800003D +:107E60000000000584000000000000200000000366 +:107E7000000000008205880590004008882000036B +:107E800000030000000000000000000300000000EC +:107E90000008000000008400000000004004000012 +:107EA00004000000000800050000000000000000C1 +:107EB00000080000000090028400000884004008D0 +:107EC0008203000084000000840884089000000001 +:107ED00000008803000584000000400088C020A046 +:107EE0000000000000000000000000001100400041 +:107EF000000004880000100008040500050100418E +:107F00000000000004000000090000000900090052 +:107F1000000000000090000005000000000090013B +:107F200000000000410803000002021005A000004C +:107F300000001182092009020502098209901188B6 +:107F400000000090099041020982058205000902A3 +:107F500000040000040000001000030011021008DB +:107F6000C0110400A00000008400C00010008800C0 +:107F700008004000C000080000000000000082006F +:107F80000000C0000800A0000400000084000800F9 +:107F90000000C000080010000400A0000800C0009D +:107FA0000800000008118200080284004000000060 +:107FB00008008200100010000811080000211021A4 +:107FC000820000C1C000080982030800C000000050 +:107FD000104100008200C0000041C00000110800F4 +:107FE00000048400000000000000100000000500F4 +:107FF0001000050000000000000000000000050067 +:10800000002000000000000000000000040000004C +:10801000410000000000030000000000000000001C +:108020000000000000000000000000000000000050 +:10803000000000000000000000000000020000043A +:10804000050000000004100021880400000010005A +:108050000000080040024082000040C00000000014 +:1080600000900000002000088200000008000000CE +:108070000000C00000000000000000080000000038 +:1080800008000000098800000000C000040010087B +:10809000C0000000001100000040000008000000C7 +:1080A000A000820000110000000000000000A040BD +:1080B000000008008200000010040000000088009A +:1080C0000000A0000800C140A000C0400000A008BF +:1080D00090000441C0200040100000000840000251 +:1080E0008440C000000000400000000000000000CC +:1080F00000A00000008800000000050000900000C3 +:1081000000C00000000020031184400009C000C02E +:1081100000000000008400A000000000000000003B +:10812000008209202000020200000500000000007B +:1081300000A00000008209041102110000024002A8 +:1081400040201090408820021090209011022120A1 +:1081500020000002090002000000098210900000C7 +:10816000110020020488030010200000000090008D +:108170002000000000008221820200000000002098 +:10818000A0020000000508210010000800210000E6 +:10819000000984098400000000008200020000023F +:1081A0009000000500000000900000000021000089 +:1081B000900090000800880090000008000008006F +:1081C0000000820004001000C00008000000000051 +:1081D00040000400040082000400020000000000CF +:1081E00000004000000000000420C000000000006B +:1081F000000000000000000000000500000000007A +:1082000000880000000000000000000000000000E6 +:108210000500000000001000000000000000000049 +:10822000000041000000000000000000000000000D +:10823000000000000000000000000000000000003E +:10824000000000002000000809000082000000403B +:1082500000000000000000000002000421000000F7 +:10826000210005002100000000000089000000003E +:1082700000000000000000000000000001080001F4 +:10828000C0000004C0820000C00000010000000027 +:1082900000000000000000000800000100200000B5 +:1082A000C1000040C0820000C000000100000000CA +:1082B00000000000000000010000000000000104B8 +:1082C0000000C0000082C0820000C0000001000069 +:1082D000000000000000000000000000000001029B +:1082E0000001C0000004C0820000C00000010000C6 +:1082F00000000000000000090000000000052080D0 +:1083000000088200008080800000800000030000E0 +:108310000000000000000020000000000010080025 +:108320000010880000008080000080000003000032 +:108330000000000000000000000400000000000336 +:1083400002800003830000008080000080000003A2 +:1083500000000000000000004011000000000005C7 +:1083600020800308A10000808080000080000003BE +:1083700000000000050000000000000040000000B8 +:1083800010001100830000000300000000000080C6 +:108390008002000004000000000000002000000037 +:1083A00003008900C000000003008000000000807E +:1083B000801000000000200000000000000002000B +:1083C0000000040040000500000003000000000061 +:1083D0000080802000004000000000000000050038 +:1083E0000000400011004080000003000000000079 +:1083F0000080800500000000000000000000010077 +:1084000000000000A000080200000100C000000001 +:1084100000C0820100000000000000000000010018 +:1084200000000100020010880000010004000000AC +:1084300000C08201000000000100000000000000F8 +:10844000010000000000A000824000000100400088 +:10845000000000C0820100000000000000000000D9 +:10846000010000000100A000200200000100400007 +:10847000000000C0820000000000000000000000BA +:1084800000000001040100040000010000000000E1 +:1084900000000000000000000000000000000000DC +:1084A00000000000C00100A000000100000000006A +:1084B00000000000000000000000000000000000BC +:1084C000000000000000200000200000010000006B +:1084D000000000000000000000000000000000009C +:1084E000000000000800040100040000010000007A +:1084F000000000000000000000000000000000007C +:108500000000000000408004000000004100000066 +:10851000000000000041000000000000000000001A +:108520000000000000208008000000004100000062 +:1085300000000000004100000000000000000000FA +:1085400000000000000000050004000000004100E1 +:1085500000000000000000410000000000000000DA +:108560000000000000000040800400800000410086 +:1085700000000000000000410000000080050083B2 +:108580000000000000000900000000410000000998 +:10859000000000410000000009C00004800000C18C +:1085A0000000000080080300000000C180000002FD +:1085B000000000410000000005A000000020800035 +:1085C00000C10000000000000200000000C1000027 +:1085D0000005000000410000000020C000408000B5 +:1085E00000C10000000080002000000000410000E9 +:1085F000000300000041000000000302000004002E +:1086000000830000000082008200000000A1200022 +:108610000000000000010000000000040000200035 +:10862000004000000000020191000000000504006D +:108630000000000000010000000000030000000135 +:1086400020000040000000002000C10000000005E4 +:1086500040000000000000010000000000050000D4 +:10866000200000400000000040000400000000A1C5 +:108670004000000000000001000000000041000078 +:108680000000000000000000000000000000811257 +:1086900000E00700484200000000000048420000DF +:1086A00000000000000000000000000000828112B5 +:1086B00000E00700484200000000000048420000BF +:1086C00000000000000000000000000000000000AA +:1086D000811200E00700484200000000000048420C +:1086E000000000000000000000000000000000008A +:1086F000811200E0070048420000000000004842EC +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:1088000000000000257B00000000000000000000C8 +:108810000000000000000000000000000000000058 +:108820000000DEA4257B0000000000000000000026 +:108830000000000000000000000000000000000038 +:108840000000DEA40000257B000000000000000006 +:108850000000000000000000000000000000000018 +:1088600000000000DEA4257B0000000000000000E6 +:1088700000000000000000000000000000000000F8 +:1088800000000000DEA4612603400000000000009C +:108890000230A0000000000000000C4000000000BA +:1088A000000002C064866126034000000000000052 +:1088B0000230A0000000000000000C40000000009A +:1088C000000002C064860000612603400000000032 +:1088D00000000230A0000000000000000C4000007A +:1088E0000000000002C06486612603400000000012 +:1088F00000000230A0000000000000000C4000005A +:108900000000000002C06486200020002004020451 +:1089100004002000200020002000040004042004A3 +:1089200004008800000420000000210004048800E6 +:10893000200000002080100411004000C00021042D +:108940008900210000800300000300008200210054 +:1089500004000500050020002000C00021000404E0 +:10896000030021808800040040001000041000046F +:1089700020022000200020004000200010000403FE +:108980004003000088058400000000000000000192 +:1089900000000000000000000000000020000000B7 +:1089A000000200004082000000002000840020003F +:1089B000100000000000000400004000A0000502BC +:1089C0000402400040000910089000001000000060 +:1089D00040000900080008A04000000020A04090CE +:1089E00020000840020200402100090080C0200150 +:1089F00020A009010000000000000000048289009E +:108A000040908000000000004000000001000000D5 +:108A10000000080000000440011001100080050063 +:108A2000000004100000000000000020000001040D +:108A3000020002000200000002041000850008008D +:108A4000C0000920830800000105000200000004A6 +:108A50000000010400050100010000000100080001 +:108A600008410010880003902020C02001208308C6 +:108A70000003211000100000030502100210410045 +:108A800010800010058001004080040200020808E8 +:108A900000820284000003108008100020000010F3 +:108AA00084004108808402000000200002090008C0 +:108AB0000401001000000000000800014000401008 +:108AC00000080008100140000500080040050000F3 +:108AD000000804004000001040004008020408089C +:108AE0000904890800080008402140010001100124 +:108AF000080900000801000000008808400009087B +:108B00008808C00800054002080080100201090121 +:108B100000000000000801004002000200004021A7 +:108B20000410900001400000000000000004042137 +:108B30000000C00040000008000000000000000825 +:108B4000000000000000010000008800020020007A +:108B5000000000008800000004A0100084004121F3 +:108B60008905040021009020104108050821008893 +:108B70001008914000C01184404090000004880318 +:108B800040004004100408848840000088059000DC +:108B900000000000210000002000800105014100CC +:108BA00000000009110002C10000000000000300E5 +:108BB00011000800080091001100000000000000F2 +:108BC000000010000000000010081000000000006D +:108BD00008000000000009880300A1210300000034 +:108BE000820008A00900400009000002A10000085E +:108BF0000509C189080041024010090800000591DB +:108C0000048205000802000180102100000000001D +:108C10000000000282008200A0008200080005829D +:108C2000820084000980820003C0040082000000EA +:108C30008400010084001020018009202000C00071 +:108C4000040804400880100520008200088000000D +:108C500085101000000082040805C000098085040A +:108C6000A000C004A0C00805010408008200C000E4 +:108C7000102110800804409040218210040000045C +:108C800082048809C0004000080008004000080075 +:108C90000204C002C011000003000000210008848B +:108CA000C00303000000881003008241800005001B +:108CB000000000000400030040014002200000000A +:108CC00000000000000000020000000000000002A0 +:108CD0000000080100000000000000002000042047 +:108CE0000284000003A00011908240100840081088 +:108CF00000000000830888008309C190000110086B +:108D00000000030040002100211000004108100075 +:108D1000000490000801000400030002840008051C +:108D20000000A0002088A021900900000900040094 +:108D30000800C0021000040000001000C000400045 +:108D40001000080000000000000000801000011169 +:108D500001000000000008000000000008004000C2 +:108D600004050000000040000884400382008421C4 +:108D700000008240084082901008C1050000840075 +:108D80004010A000020088808204100010A1C020C2 +:108D90000809844108002041400000000000000054 +:108DA00000000000000000090020000000082082F0 +:108DB0000000002000040400050000000300000083 +:108DC00000000082040004200820000000020502C8 +:108DD00010004000000021008000000000000000A2 +:108DE000800091000020400000008002C0001000C0 +:108DF00010000020030010000009A10510881020B9 +:108E000021000401210090000040000040004108C2 +:108E10000000100800000990000480000021C0003C +:108E200001008404108040800085100501100000BE +:108E30000103000400008400000082210000000003 +:108E400001000000000000001000000040000000D1 +:108E5000080900000100001000008200000000006E +:108E60008200210040A00800001009210421A00870 +:108E700002000121412120A0C11085088300108833 +:108E80000011C010404110C183000402080082009C +:108E90000400000002038500082100000200000019 +:108EA00021002000000103028302000800000801E5 +:108EB00000002004000108000800410041000000FB +:108EC0000000400000004100000010000000000809 +:108ED0001000000000004000000005A0000000009D +:108EE000000400004004802100000001C0100000C8 +:108EF00000A01000080082000010400010011000C7 +:108F0000C1090090000480C003102000030000008D +:108F1000000000880000800040A021000000884080 +:108F2000000000000000000000A100029009009075 +:108F3000052000040040C090000000000000000078 +:108F40000002020041080090000000000000000044 +:108F500000010001000000000000000140000000CE +:108F600000000000010008000000C0020002020230 +:108F70002000A002020808A01011900100000001CA +:108F8000880000A100900020002040A1400801912D +:108F9000C003408501034010020340A000900888F0 +:108FA0008402000000000900000009C121A0112076 +:108FB0000005A100008010800000000000000000FB +:108FC00000000080C00041000000000000004000E0 +:108FD00000000010001000000002050003088000DF +:108FE0000009000020000800800000008982412064 +:108FF00000C100409041219180C080900041000854 +:1090000000088008009000110903000580900011FD +:109010000208038891C103A005C1808888820002EC +:109020008040090500000002000500001100212118 +:10903000100020100000002080040000000000004C +:109040000000000020000800200003032000210091 +:10905000100020418000000080000000800000001F +:1090600000000002000080000011888091000000D4 +:109070009003039140101180200389059082808025 +:10908000008080008008850008008803C10400007B +:109090008010800500038000800980020008900095 +:1090A0000941C18210210000000000000000009072 +:1090B00001000010000008004000A0411000000066 +:1090C0000000000000080008000000000001000887 +:1090D0000100010000010284400004009000888823 +:1090E0001000080002000000A0000000A040910055 +:1090F000009005009008000090C0040110A082A01C +:1091000008028404A000088240209000A00003010F +:1091100084020200A000000102200200A008824197 +:109120000500200040A091010000000000000000A8 +:1091300088000100400088019002009000904004E7 +:10914000000000000000000040000000A00102003C +:10915000000000000000000000000000000000000F +:109160000008000000080008000000900010A002A5 +:10917000001000200088A00201C1021000080009B0 +:1091800008A0011000880820008482020000A0844A +:109190000040042000000104098220A0882083856B +:1091A0000403200308050185C182000000000000BF +:1091B000200000400810024100050080000000006F +:1091C00009800000000000000000800800088021E5 +:1091D000800500000000000000000000000000000A +:1091E0000000004020400000008200000041000913 +:1091F000801000090041000380052190801111803A +:10920000022111A020801100C10000808080054152 +:109210008290080080004000050090808000A141FD +:1092200010A008C18082119010A121908000000040 +:109230000000000088211011402182408008802118 +:1092400000000000000000100000000020000502E7 +:109250002000204020000300100040204100200892 +:10926000208020001011210010801000000000005C +:10927000000000000008882121802100800011806A +:1092800083009080C008410921040209C0008021A8 +:10929000021041800810211110C0C1009000100878 +:1092A000050009808800000404900000000002000E +:1092B0001000020010004191200088010300C0014D +:1092C00002828220820000000000000000000120D5 +:1092D00000010000010000900000010000000100FA +:1092E00000A000020000010000200040000000007B +:1092F0009000100002081000C001880203008800DE +:109300008410109085C00401910040C00009030042 +:109310000203032000820500830082020420A000D3 +:1093200011018804210289000200212120408800C7 +:10933000000000E000000000000000E00700000066 +:10934000000000E00700000000000000070000002F +:10935000000000E007000081000000E000000012B3 +:1093600000000000070000000000000000000000F6 +:1093700000000000000007000000000000000000E6 +:109380008400000000000000420A004200000700C4 +:109390000000000000E000000000000000E000000D +:1093A0000000000000E000000000000000000000DD +:1093B000000030F030F0000000000000000000006D +:1093C0000000AFFFAFAF7D7D414100000000000015 +:1093D000000000000000000000000000000000008D +:1093E00000000000000000000000000000003C3C05 +:1093F00000FF0000FF3FFF3FC303C3C300075D58EA +:10940000AA3C55C3FFD255D200000000003CFF3CEF +:10941000C3C30A0A00FF3C3C00C33CFFC3C3C3C331 +:109420005500D7D7F0507070D2C3D2F02C2C0C0C52 +:10943000282800AA300030F000000000AA00787848 +:1094400000000000ACFCA0A0CF0CCF0C000000007E +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:109470003C3C00FF0000FF3FAA2AC303C3C3F0F730 +:109480000D080F0F55C3AAD200D2E0EF202F003CE9 +:10949000FF3CC3C3000F00FF3C3C00C33CFF0F0078 +:1094A000FFF0FFAAD7D750505050D2F0D2C32C3C77 +:1094B0000C0CA0A000AA00000000000000000000AA +:1094C000AFAA00000000AAAA0A0AFFFFFBFB0000E7 +:1094D00000000000000000003C3C00000000000014 +:1094E00000000000000000000000575757D70000A0 +:1094F00000005555FF0000000000000000C300C33D +:10950000FF0FF000AF05AF05EAFAEAEA000FC30F5C +:1095100000000000F330FCC0003C003CD0D3DCDF96 +:109520005300FFAC57025702BEFAEBFAEF40E34399 +:109530000000020F3C78F0780000000000000000FE +:109540000000BFBA00000000AA8A0A0A00FF00005B +:1095500000000000000000000000BCBC0000000093 +:10956000000000000000000000000000030303C32F +:10957000000000000F0F3C3C000000000000FFFF57 +:109580000000FF0FF000AF05AF05000000005555CB +:10959000555500000000F5A0F5A0FFF000F01013F5 +:1095A0001C1F5C00FFA37F2A7F2A820A280AE3434C +:1095B000EF4000000F0FF0783C7800610007000DCD +:1095C00000000061000F00090000A061000F000D05 +:1095D000000000000008000000A00061000D00096C +:1095E000000000610007000500000061000E000D92 +:1095F000000000610006001D000000000061000680 +:10960000000D0000A0614006009D000000614006C2 +:10961000000D000005610A2E051D00A00060000776 +:10962000000D000080610005000D00010061400593 +:10963000000D000100614006000D00010000000067 +:10964000000000007D003F0055555555000000000A +:109650000000000000000000000000000F3F2F0F7E +:10966000878287820000000000000000C341C3031E +:10967000000000000F3C0F3C00000C0C000000003C +:109680000000FFFFAFAF00FFFAA000000000F0F005 +:10969000FFFF007D00FFAA55AA55000000007D4194 +:1096A0007D4100F000F0FFFF0000000000000F41CE +:1096B000004150FF55FFFF00FF00E751A9460000A1 +:1096C0000000000000004100030000007F5F000078 +:1096D00000000000000000000000000000003F3F0C +:1096E0002F0FAFAA0500EB28303000000000C34167 +:1096F000C30300000000FF5500552020202000007B +:1097000000000000000082D750A5A5FA141EB4BEC8 +:10971000F0F041EB005500D73C3C0F0F000000007B +:10972000F0F0F0F000F000F0FFFF00070000000094 +:109730000F7D007D50FF00FF00000000E751A946AB +:1097400000000000000000003C0F00AAC1C041C0A2 +:109750000000000000000000000000000000000009 +:109760000000000030F3000000000000F0F0F8F806 +:10977000FF3CC30000000000D714D7140000000015 +:10978000000000000000AAAA00FFC30F3C0FF00079 +:10979000F0FFD7FFD7FFF3C330C3FCC0BE82000089 +:1097A000000083FF83FF0FAF282805870087000094 +:1097B00000004D4DFF3C0000000000F0AAF0F03C1E +:1097C000F0C300000000000000003C0FFFAAC3C36C +:1097D00000C30000000000000000000000000000C6 +:1097E00000000000000030F3BEBE00000000FCF0EE +:1097F000F8F8FF3CC30000000000D714D7140000A5 +:109800000000000000000000AAAA00FFC30F3C0FE8 +:10981000F000F0FFD2FAD250EBC328C3C0FC82BEE6 +:109820000000000083FF83000F0F0000058200820C +:10983000000000004D4DC3000000000000F0C3F028 +:10984000F03CF0C388000400200088042000880059 +:1098500088000405200040000400040040000000CF +:1098600020020400A00004000400A000A0002000CA +:109870000500011020000000400020000000400012 +:10988000C004C004000305000208200004004100D9 +:109890002100850800000000C0000900C00284000B +:1098A0008400848088004000024088030802C000D1 +:1098B00040004000840204002008880088008402E0 +:1098C0000404C0804002000080000000100040003E +:1098D00000000000849000020000800080008500ED +:1098E00009000000800204020002210204000000BE +:1098F0000000C0004002C000409080000020000036 +:10990000C0002000000200004000A000050011007F +:10991000C000400008A000020500000288002000EE +:109920001000000241100000890041010000848203 +:10993000400020C00400100009A000000400040042 +:1099400040821108401009C00000040000000120FE +:10995000008504000002002000000000000000203C +:109960000540010003100020020000000004000078 +:109970000200020302838480200000000000000235 +:109980000002000300000000000001892000200008 +:1099900000090904900002109010028000000808DD +:1099A00001850580022004100020000011A0820023 +:1099B000408000000800821001108800100800009C +:1099C0000004820001000100021000008000000479 +:1099D00004090040020000010901008400000000A9 +:1099E000000184004000200140090008000020011F +:1099F00000080084400000200010800020000000CB +:109A000000012001000000004008000008020000E2 +:109A100041002084400002002011000000040200E8 +:109A200082001004A004400980050209098482090B +:109A30000000A01002089002028208080000400006 +:109A40002008000900040882080041090000000203 +:109A5000000000000108000000001000000001806C +:109A6000000000000040400004910040000340005E +:109A700000000000000090000000882100080004A1 +:109A800000000000900500000000004100000005FB +:109A900000029003004000080000002102020021A3 +:109AA0001005401008080000400001900811010254 +:109AB000014000004002000000400041C00490034B +:109AC00084000005000400028800001008030084E0 +:109AD0004102098408004000218410008808210008 +:109AE000081040900200410121840310050021006C +:109AF00041A0000003000800000008004100080029 +:109B00000300100000001100000000080000000029 +:109B100021A0110000A011820800030411A00990E7 +:109B20000000000008118090410291000811899006 +:109B3000400102000000C100090003080040054088 +:109B40001090038205000889080205000041914039 +:109B5000080000000800840040800800C0000100E8 +:109B600000000800082082008405080000040000AE +:109B70000000080020000000000000000400004079 +:109B8000000000000000A008400090000400080051 +:109B900000000805000008410000A00000090000C6 +:109BA00082008280A000A0021080A00908050100A8 +:109BB000000008800820089140110800A00008005B +:109BC000040010008400C00208C0080002008200E7 +:109BD0000810000808828000408280020984000882 +:109BE00020000000000203010088000000000001C6 +:109BF00000A00000000080000000000000008008BD +:109C00000000000000A0410000A08082008221002E +:109C100000A0000000900000A000009003000008D9 +:109C200040C0409011404182000300044000090000 +:109C3000080000C00902090940408000000011002E +:109C4000008200A002C040000201C0040300020024 +:109C5000212040011000C0000000080041418400A4 +:109C6000C010A00082050800A00008000800100035 +:109C7000A0008800080040000040C0000000020072 +:109C800000000840010000008200000200210008DE +:109C90008200000000004009400000414011100215 +:109CA00000030810C0100005A1000202000088088F +:109CB00000000800001108020880001100000000E8 +:109CC00088008800A000400000210000002140051D +:109CD00008200810C040000000000000000082A022 +:109CE000059008891008030088042100080000007E +:109CF00000000000000400008000030400040300D2 +:109D000003000500000020C000002100080008003A +:109D1000000000881000000040008000008810084B +:109D20000901020088A1020100A00800032110001F +:109D30000208000000880802090200080800030069 +:109D4000008205000900400440024120080400A0F0 +:109D5000409020000905050400009000000040002C +:109D6000C102000009108800000040104000A0005F +:109D7000028240004000C000002100210000820556 +:109D8000000000004000402100210000828200000D +:109D9000400800100000000000001088880040000B +:109DA0000000C0410800822140008483000010416F +:109DB000A000000840034009401000008304022076 +:109DC00010080000000000000085C0000000200016 +:109DD00001410880848004049000110011C00084B7 +:109DE000408240C100008801100200000001000014 +:109DF0000000800200020000008800000000000057 +:109E0000080000000000000000A000880300080314 +:109E10000000800800820000008800000902118212 +:109E2000000003000000A100080040080804000032 +:109E30002004080000C041C0000003050090049009 +:109E4000210211A000000200000002020000000038 +:109E50000000200009101010008440C001082004F8 +:109E60000010908200000100A000000190C0A0023C +:109E70000040A082030003012001A00000000000B8 +:109E800000000000820088008400A0000001A00003 +:109E900010000001000000000000000000001001A0 +:109EA000A0000000C0010004000100024001900574 +:109EB00011090841000908002001000104000010F8 +:109EC00000080489000802A001828800C0A00000E8 +:109ED0008200C1000000881000400084040421803A +:109EE0008000008000800041212082030020038048 +:109EF0000080008000808800A0084111000200005E +:109F000000000300000000001100800000000008B5 +:109F1000880908110003000000030010000400007D +:109F2000804080030000804000000010008000029C +:109F30008088A1A110100088002000210510800257 +:109F400000800020800200008000400000008000AF +:109F50000800210002000000008000000000000056 +:109F60008000000080000000C000000090402090B1 +:109F70000000000000000000408005030500838908 +:109F8000200020000500024009000400900083002A +:109F9000028000000000050000000000000000201A +:109FA0000000808080208000800480808000800508 +:109FB0000010C1809000A040900800800000800444 +:109FC00000830000804080008000000000008000CE +:109FD00000000800020010000300800000100000D4 +:109FE000000008000400A000820088A00400850191 +:109FF000C005820082008200A000A0089001A1900C +:10A00000A1A000900100000001004000200002001B +:10A010000510000200000000000000100000000019 +:10A020000000000008C01000A008820008C0400026 +:10A03000A000000088100200080182014090A08466 +:10A04000A0008809000002008400C0828200040091 +:10A05000A0002000200020000800010088009001DE +:10A0600008A00200C020009000088220000100C06B +:10A07000030101A0044000020402C10200820000AA +:10A08000828201C00000000000000000002000A14A +:10A09000008300A000000001A001000000000000FB +:10A0A0000000000000000010001000080000000088 +:10A0B00000000088A082C00000000002A004018807 +:10A0C0000188020001204000000190008801404109 +:10A0D000002020048808000000010001000004A006 +:10A0E0000008008202C08000000000000000002183 +:10A0F0000911054040058080008080800980002093 +:10A10000002000081083000000000000000000098B +:10A110000008002100800041211082080008000092 +:10A12000000000000000000000000080008000002F +:10A1300000002000000080008009020300C1809020 +:10A1400004001000080008008020100300200541D2 +:10A150008008009000C1008900100002002100204A +:10A1600080000080000080808000001000800000DF +:10A17000412102C104A10508000000880080000000 +:10A18000A111000341809141400005000500050335 +:10A190000080000200000010109040001100080034 +:10A1A0002100000002004000000021000000090022 +:10A1B00084002100108002000200411020081000DD +:10A1C00003020800020905800800000080000080EA +:10A1D0008000000200000000000000000008008075 +:10A1E00000030004800000800000040040042008F8 +:10A1F00000000191012000030101000000A0008483 +:10A2000000004183829104040401008200000000E8 +:10A21000000000C0009100200001000801000000C3 +:10A22000010001000000000001000000850088021C +:10A2300002081000010000C00002000001A101019D +:10A2400001040100000000A0010800001000040843 +:10A250000204080000000010000200000008009046 +:10A2600000100001C001A0C0904088000000000064 +:10A2700007004200000000E00700000000000000AE +:10A2800007000000000000E007000006000000E0FA +:10A29000000000000000000007004200000000E095 +:10A2A00000000000000000000000000000000000AE +:10A2B0000000000041820000000000004200000099 +:10A2C00000E000004200001100E007000000000074 +:10A2D00000000700000000000000000000820000F5 +:10A2E00000E00000000000000000000000000FFF80 +:10A2F00000F000FF0F0F000000000F0F0000000033 +:10A30000000099999999FF6603030000BDBD000004 +:10A3100000000000000000000000C3C3E7E70000E9 +:10A32000000000000000000000000000000000002D +:10A330000078FF781818181800000000FFFFFF00D1 +:10A3400000000000FF00666600000000CFCFFFFFA6 +:10A35000F330F3F300000000000000006F6F0FFF08 +:10A360000000000000000000FF63FFFF9090006607 +:10A370000FFF00F000FF3C3C000000000F0F00004A +:10A3800000000000FB00F3006666030300FFBD0051 +:10A3900000000000000000000000000000036667ED +:10A3A00000000000000000000000000000000000AD +:10A3B00000000090FF9060F960F9000000000000CC +:10A3C000FF0000000000FF00666600000000999991 +:10A3D0009999F33030300000000000000000C3C342 +:10A3E000C3C300000000000000006363636390903B +:10A3F00042420000000000000000000000000000D9 +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC +:10A4700000000000030363F32F203F3000000000C2 +:10A4800040606060F69099998FFFC3C300000000A0 +:10A4900060F07CFC000000000000000000000000F4 +:10A4A0003C3CFF0000000000000000000000000035 +:10A4B0000000000000000000000085049D1CF0F07A +:10A4C0006666FDE5FDE5E700E7FF0000FFFF000031 +:10A4D0000000FD0DFDFDF0F099F000FF00FF667E2D +:10A4E000FF7E0000BF3E000000001034103400006A +:10A4F000B1B1000907070303F3F33F303F30000019 +:10A5000000004F6F6F6FFCC0C3C38F00C3C3000058 +:10A5100000007CFC7CFC000000000000000000004B +:10A5200000007F7FFF00000000000000000000002E +:10A53000000000000000000000000000C746DF5ED1 +:10A54000F0F066667C647C64E7F0E7F00000F0C33E +:10A5500000000000F404F4F4F0F0B1B166FF0FFF66 +:10A560000018991800009F06000000000024002435 +:10A570000000F330060F070700000008000000008D +:10A580000061000F001900000000500800000000EA +:10A590000061000F00950000006100070005000049 +:10A5A0000061000E000D000000610003000D0000BE +:10A5B00000610006000D0000000000610006000DB3 +:10A5C000000100610006000D000000610003001999 +:10A5D000000005610A2B050D00A080610006000D3A +:10A5E000000500610006000D000000610007000981 +:10A5F00000000000000000900000000000000000CB +:10A60000000055550A0FF4FCFCFC0000000000009F +:10A6100000003F3F0303E800E8FF050505050000D3 +:10A62000000000000000F7F7F7F755001010AF0525 +:10A630003C3CE9E9A8A8000000000000D7D7D7D724 +:10A640000000000043026B2A000000008FBF7D4124 +:10A65000FFBC3CBCFF00FF00000000000000000049 +:10A66000BE00FA00000000005D5F555F00000000C2 +:10A6700020E32CEF000000000000000000000000BC +:10A6800000000000C3C30C0F040C0C0C0000000001 +:10A69000000000007D7D4141E8E8E8E80C0F0C0077 +:10A6A000000000000000000000FF00FF5500101037 +:10A6B0007D287D7DC1C180800000000000000A0A65 +:10A6C0005F5F0000000057167F3E000000000D0194 +:10A6D0007D41C38000803D00FD00000000000000BF +:10A6E0000000BE00FA00000000005D5F5F5F000038 +:10A6F000000000C30CCF00000000000000000000BC +:10A70000000000000000000000003C550055000063 +:10A71000000000000000CF0CCF0C00FF00FF000085 +:10A720000000AEAAAEAA00000000417D0303BE3CBB +:10A73000BE3CC3C3FFFF3F033F0300000000000017 +:10A74000FF003C3C00000000D714D71400000000BC +:10A75000FF10EF00000F000FAA00AA0A000000007F +:10A760005F505F500000000000000000000000008B +:10A770000000000000FC282800000000000000008D +:10A780000000000000000000A0F5BCFDFF550055D2 +:10A790000000000000000000CF0CCF0C3C3C38381B +:10A7A00000000000AAAAAFAA00000000417D3F3FC0 +:10A7B000AFAF0F0F00003C3C3F033F030000000021 +:10A7C0000000FF003C3C00000000D714D71400003C +:10A7D0000000FF10EF0000FF00BFBE3CAA0A00000F +:10A7E00000005F505F50000000000000000000000B +:10A7F00000000000000000FF28280000000000000A +:10A80000000040000400400020030400210001007B +:10A810000400000040000200880400000000200046 +:10A8200004001000200000041004000002000402D4 +:10A83000020000002000C0048800890002002100FE +:10A8400004040003C00021004100010400000402D0 +:10A850002100210402080100200889004100200095 +:10A86000100802000205A000840489008208400844 +:10A870008400880004040140008502100200820068 +:10A8800040004000800080008000000000000400C4 +:10A890000800000000000500000000002002000089 +:10A8A0000400900240020400040000004000000286 +:10A8B0000000A0000000000000C0000002028000B4 +:10A8C0000200000200002100A000820440024000BB +:10A8D000100140C0200080000208090002A0820090 +:10A8E00005408400C00004000490410004000021E1 +:10A8F00041842002000020000801201041C02000F7 +:10A90000100200000404008004049000048500008C +:10A9100005000000040800000000000000004000E6 +:10A9200040000210040802000300A00908050840C6 +:10A93000A10941004040A100030003008805004038 +:10A940000200882103000000010002419010040071 +:10A950000241080582102004108002400440029049 +:10A960000282A040111004008240842020900180C7 +:10A9700000082008001040090080000000000000CE +:10A9800085050500020040100002C101000080049E +:10A99000020884000000808400000008000800080D +:10A9A00084008200004080850000820000000300D7 +:10A9B0000009020482008911020082048210411001 +:10A9C0004100800805008288000002008000000825 +:10A9D0000000040820000200A10909400011001134 +:10A9E0000040840309C1C0020804200102000240A3 +:10A9F00002200485020002008008004002080004D2 +:10AA000000044000048403908384000000000000E0 +:10AA1000000000000000A005020008000010001166 +:10AA20000041000000000400900808001000A00091 +:10AA3000C000080000000009000800000003A02179 +:10AA40000040000020058408840000001040004001 +:10AA5000A003880589204083C0800021C0400000F9 +:10AA60009000A021408482089021C008210088081D +:10AA7000100004088883402100218840A0101000A5 +:10AA8000404108088208002008104000000005002E +:10AA9000000003000000000200000000410003006D +:10AAA000090008002000000000000000030003006F +:10AAB0000800050000000000000000000000000881 +:10AAC0000808050100A00202030000840000000144 +:10AAD0000911000000000210104004401000410065 +:10AAE00010102110080889020320088200020208C1 +:10AAF00008000800C1A02108C1A00388024000008E +:10AB000003A04102880010A02109000141000000BB +:10AB10000900C00020100800400884000400040060 +:10AB2000080000004000C00088000008820000000B +:10AB3000A0000000A00002000003C00000040040CC +:10AB40008200000089008440001184400000000061 +:10AB500008008800408002404080C0828489202014 +:10AB6000A00200001000081100050402A08808825D +:10AB7000C00084040011C021C10240000002020094 +:10AB8000C000A0000400000082000800020040098C +:10AB9000008820000000800000000000000080000D +:10ABA00000000000040000C000000000008500005C +:10ABB000000000000000000084900000000004007D +:10ABC000000111000000020000C10000410100006E +:10ABD000000020000800004000C1804021034040E8 +:10ABE000411020010800000000000800020103419C +:10ABF00000411000118400080382100003001109B5 +:10AC000000101000001004000000089003820402ED +:10AC1000104000001041080000000000100000007B +:10AC20000000C000A000820084000800400800006E +:10AC30000000C000000000008200000000000200D0 +:10AC400000000008C0090021081100410005900023 +:10AC500008080000A0002084C0020800A00504032A +:10AC600000800482A0100000C00020054000A00069 +:10AC70002008C000A0830805822005C00100408094 +:10AC800000201040820004008800100882000400A8 +:10AC9000C00000000800030005000000410410008F +:10ACA00021000010000000001000210003008304B8 +:10ACB00040A000000000000000000800000008881C +:10ACC000091000000404000200000520000000003C +:10ACD000000000A000000000800500040008400003 +:10ACE00000002102020441880908022040208290CD +:10ACF0000204100504840002050003008402100809 +:10AD0000840200000240212003000000000008909F +:10AD100083822100008800000021C04100A10000C2 +:10AD2000041100004041000000002003100000005A +:10AD300008000400040000000200000800000000F9 +:10AD40000021100008009010000000A10002024144 +:10AD50008840C00000400000040082044002100847 +:10AD6000C0059080820902C0821004110200404098 +:10AD7000A0C189100005001040080820401100A063 +:10AD8000100040084000040000008200C000820063 +:10AD900000008200A009080000000000000005205B +:10ADA00000008000000080000000000000000000A3 +:10ADB00000000000000000000000A000008800006B +:10ADC00000000000001000400000002000400009CA +:10ADD00000080001000200010000000000018001E5 +:10ADE00011080000004000208005000000008000E5 +:10ADF000030021400204090003A000000800000035 +:10AE000000418090040020000800100000A0000015 +:10AE10000340000040000000000082040140A0C088 +:10AE2000020920A0A004A08200A0000000000000F1 +:10AE300000008801000100019000000000000000F7 +:10AE4000000040C001024088C0900808020482024D +:10AE50001088C004100200C008020000C08801046D +:10AE6000108802A18802200802A18220C0040004E8 +:10AE7000008304824021030590A10205C0C1210581 +:10AE800008A004C10100010090010001000200209F +:10AE900000020000030905C190110482004003086C +:10AEA000024080A000800000008000000000000040 +:10AEB0000000000000410010001000200000000011 +:10AEC0000000000010002100800080008080090048 +:10AED0008000800080000000000000000000910859 +:10AEE0000408800800100382848008208000808984 +:10AEF00000C0000500418041900800108083802040 +:10AF000021A1000800080411032100020010000024 +:10AF1000000000800000C090032100058085030030 +:10AF2000020088008540000000038000000000004F +:10AF3000000000000000800000008002000500000A +:10AF4000800000008000090020418903212080004A +:10AF5000001100000000000000410002808000009D +:10AF600080000321008020008480A12191808380C3 +:10AF700080008020808200800980081191828410E6 +:10AF80001180410403C08403020005000800414110 +:10AF900000000000800080008200A08241800084C8 +:10AFA00004040500A10008C1C0008401A040824043 +:10AFB00000000000000000004090C000A001C000A0 +:10AFC00010000800020004008902904009084102B4 +:10AFD0000800A08490040220200004C0020310C0D6 +:10AFE000000008000210A004A14003C011041010CA +:10AFF00009020400404108088202A0108582080866 +:10B000000441904000830102C00301A00000000041 +:10B01000012120000000A00004000840021020A030 +:10B020000008C00000020321C0919041009000047C +:10B030000402000000000000000000020002000204 +:10B040000002000000000000000088C08802108498 +:10B050001010051000C1880304040504000284C018 +:10B060008820000009080190C0838209092100108E +:10B0700004A08804C1040084404088828202014107 +:10B080004009C00489410004840902C00000000195 +:10B09000A0000000088800000004C090A0880110F3 +:10B0A00000C1A0A0000408891021804000400008D1 +:10B0B0000085008300000000000000000080008088 +:10B0C000088000000000000000000000091080055A +:10B0D0008003800908020009000582098800000039 +:10B0E000000000000000A091110320A18003A040F7 +:10B0F00000902008000384802100A100000040038C +:10B10000100880A18088042000A141219000004106 +:10B11000210885030010000000000080800000006E +:10B1200004111121804004A1204141000908800040 +:10B13000001080008000000000000000000041219D +:10B14000210809800800000000000000000021C064 +:10B1500004118380091080408000000080000000FE +:10B160008000000000000000A100009100808840E5 +:10B1700000800502030080108002800000000000B3 +:10B1800021040380A1808804100210081000080820 +:10B1900021090402410000030000000000800000BB +:10B1A000028003082100C14000C101A000C00001CD +:10B1B0000200C0C004A00200000000000000000067 +:10B1C00001010040000400000000008800020000AF +:10B1D000C01102020940050108002004021002000B +:10B1E0000400088810901000000009008805A08263 +:10B1F00003001002A0A085820400040108A040A062 +:10B20000820009C04008030204011191C000C1007E +:10B21000C0000105010100000001000000820008DB +:10B22000000011C0820489901000000000E00700B7 +:10B23000600A00000000070000000000000000009D +:10B2400000000000000007000000000000000000F7 +:10B2500000000000000000000012000000000000DC +:10B26000000000000000000082120000000000E06A +:10B2700000004200000000E000005000000000005C +:10B280000000420000000000000000120006000064 +:10B29000070084000000000000000006000000001D +:10B2A0000000000A0000000007005000000000003D +:10B2B000FAF00A0000AF00AC3C550F55000000004A +:10B2C0000000000000000000D7D717D700000000E2 +:10B2D0000000000096A5C3F07877BBB4C963F5A061 +:10B2E00044BB44BBCC690FAA7D7241B100008744C6 +:10B2F000BB785F6C0A3966AA66AACCF033F0F30C0F +:10B30000A9A91B27EB28AF636CA05AA500FF63F522 +:10B3100036A05965F3300000000000000000000076 +:10B3200000003C003CFFAF00FFFFAAAAA8AA000053 +:10B330000000FAFF0A0F00A300A03C550F550000C3 +:10B340000000000000000000000014D714D7000027 +:10B35000000000000000965A3CF088874B449C3661 +:10B36000A0F5B4B44B4BCC96F0AA8272BEB10000EB +:10B37000884BB477A06CF539F03C0FC3AA9655966C +:10B3800030CF6A6AD8E428EBA06C63AF9696CCCC39 +:10B39000A036F5639AA630F300000000000000001C +:10B3A000000000003C003CFFC300FFFFA8A8A8A8C5 +:10B3B0007F433C0000FF0F0FFFFF2828AAFF8ADF12 +:10B3C000000000000000000000000000828200FF7A +:10B3D00000000000AF6C5F6355C366F0D7827D2824 +:10B3E0000F69A5C3359F60CAAFA06C639F60A3A31C +:10B3F0000000953FFC563C3C96693FCFA959FCC0E4 +:10B40000566A3FFC6A567E42D4E895955656FF0030 +:10B41000A55A3560F6A3C3C3FFFF0000000000007B +:10B420000000FAFA0AFA00000000FFCF00C053C380 +:10B4300053C3FFC33C0000FF0707FFFF2820005550 +:10B440000055000000000000000000000000A2A263 +:10B45000A0AF00000000A063506C553C660F27723F +:10B4600072270F695A3CF65CA3095F50636C9F60BA +:10B470005C5C0000C06AA903F00F5A5AC030A95999 +:10B4800095A93F03C0036A567E422B1730CFF30CB9 +:10B49000696933339FCA5C09C3C3FFFF0000000022 +:10B4A00000000000FAFAFAFA0000BE14AAAAAAAA3A +:10B4B000535553550061000D000900000061000E56 +:10B4C000000D000000000000000000000061000E00 +:10B4D000000D000000000000000010024061800626 +:10B4E000002D100240618006002D100240008000F7 +:10B4F00000201002000040618004002D1002406115 +:10B5000080070029100240618006002D1002406172 +:10B510008006002D10024061803E002D02A00061D7 +:10B520000006000D00000000000000100001006196 +:10B530000E0E000D0000F3F33030FC0CFC0C00008C +:10B540000000C30F550F0000000000000000F0F0E5 +:10B550008200000000000000000000000000FFFF6B +:10B56000FFFF0000000000000000FFFFFFFF0000E1 +:10B570000000000000000000C3C300003C005A00AF +:10B580005F0A5F0AFF00C3C3000000000000000064 +:10B590000F1F0010000000000303F0F04B414B416F +:10B5A00005F505F545EF45450000000000000000E9 +:10B5B0001F4F0B0E0FFF00F0F3B23030FC0CF808F9 +:10B5C00000000000C30F550F000000000000000045 +:10B5D000D0F0820000000000000000000000000029 +:10B5E000FFFFFF7F0001000000000000FEFFFFFFE3 +:10B5F00000000000000000000000C3C30000FFC303 +:10B60000FFA55F0A5F0AAFAFC3C3000000000000E0 +:10B6100000001F1F101000414041820055FFEBE168 +:10B62000EBE10000FFFFEFEFEFEF00000000000094 +:10B630000000BFEF010455555555C3EBE3EB550032 +:10B6400001000000000000000000000000000000F9 +:10B6500000000000FFFF00000000000000000000EC +:10B66000000000000000F0F070F00000000000009A +:10B670000000000000000000000000004141714196 +:10B68000F0F0AAAAFFFF0F0F4B4B0FC30000000002 +:10B690000000000080808000000D0001000FF0FF1E +:10B6A000010001055400040060606F6000000000AC +:10B6B0000000000020202020F0AAF0AA00000000D6 +:10B6C000FF00030000000000000000000000000078 +:10B6D000000000000C0C00FF000000000000000053 +:10B6E0000000000000000000F0F0F0F0000000009A +:10B6F00000000000000000000000000000004141C8 +:10B700004141F0F0AAAAF0F000004B4BC30F00003B +:10B7100000800000000080808000FF0DFF01030317 +:10B72000F3F3FCFFFCF0FEFFAEFF6F6F6F600000F5 +:10B73000000000000000303C000CC3AAC3AA200097 +:10B7400004008400000000008400A0000400000049 +:10B7500000002003000400001000840004008800A2 +:10B76000C080218240000000C10004000502850065 +:10B77000000004030000402004002000201000030B +:10B78000A0800400888001008400A100200404043B +:10B790000000C00004000405000820000403880025 +:10B7A0002000041082008810C180A000C1020100A6 +:10B7B000840020058800200084009009004040405B +:10B7C00000000900000000000000410000044000EB +:10B7D00000400040000400000000040000040000DD +:10B7E0004000400440040000000004000004040481 +:10B7F0000200000000044000890000020002004036 +:10B80000000000042000410240000000400200024D +:10B810000000000000100088099040000500200092 +:10B8200000002100030000C0008410084100400512 +:10B83000040441040000000004C00082110020A0A4 +:10B840000940000000008400080010050200A0006C +:10B85000411000000000900000008200080000106D +:10B86000000000000200010008020400041088002B +:10B870008200A10001050805400500004000090004 +:10B88000A00000000000000085100009000040102A +:10B8900002020083000002000209000804A0002048 +:10B8A00003200400C000020002008200100000001B +:10B8B0004000022005090403080002000010008077 +:10B8C00004000410000000080000000080000000D8 +:10B8D0000010C00000080000000000000000000090 +:10B8E000000000084084000840000085800000003F +:10B8F0000084040008080800800085000900850015 +:10B900004004050400000908000840080000050084 +:10B910008000000100022008050805004000200901 +:10B9200000014005C0884102000805880088848421 +:10B930000488A000000102084002200000880402E0 +:10B9400000400008200800080000000084000000FB +:10B95000000000080000400000004000000000213E +:10B9600090000008C0002000040090002000041097 +:10B970000000010000000002200041000002200041 +:10B980000080001000080000C04100419041822169 +:10B9900000000008880000040000000002210041AF +:10B9A00002008400010040210208904008080208BB +:10B9B00000080000000090888421A010880008037F +:10B9C0008820002182029041030800020820000024 +:10B9D0000000000000000820000000040000040037 +:10B9E000000000000000210480001100000082908F +:10B9F0008000000004001008418400000800038853 +:10BA000004100002414000000000030200880810FA +:10BA100041840090000000020001218200840000A7 +:10BA200000840000100008080000000008880000E2 +:10BA30000540088803880000112010000300110051 +:10BA400080A00501030005400800880000000000F8 +:10BA500000000010000009008400820000000000C7 +:10BA60000400C000A00020000800900900000000B1 +:10BA70008200040000000000000082410000080075 +:10BA800008000000C002000000000000C00000002C +:10BA900000800800002008008900C000822000000B +:10BAA0000804A002840282008209000040024000D3 +:10BAB00004050400A040820982400800C002A102DF +:10BAC0001000A04141001000000010040000000020 +:10BAD00000000000000000004000008200000000A4 +:10BAE000000000000000080000000000080008003E +:10BAF0000000000009000000000008000090410064 +:10BB0000000083040000000000C0000000004100AD +:10BB1000000010021010000000004000091000009A +:10BB200000A01000210020000400100011001100EE +:10BB30000000000021000000090000084010000182 +:10BB4000400000001000040000200000050000007C +:10BB500000000000000000000000000000000800DD +:10BB6000A00004100000000000000000820000009F +:10BB700000000002840000000900088000000000AE +:10BB8000840004801000820508009000000000007E +:10BB9000084090400000000000000000000000216C +:10BBA0000005000000210000000000000000400827 +:10BBB0000000002002000000000008000000050056 +:10BBC00082000400A000820088000800002088C0D5 +:10BBD000000408000390000008000000000021009D +:10BBE000000005004000000040004104030005047F +:10BBF000000800000009000002000484032000A0E7 +:10BC0000001011A000101110004000884008210011 +:10BC100000000882008405200090000800840000D5 +:10BC2000200040A000A000040000400003C01182DA +:10BC3000880040A000A04000110000002000080281 +:10BC40000420000004020800000040904188200009 +:10BC50004110000000000009040800000800000076 +:10BC600000000000080000040800000000000800B8 +:10BC700000000000000000000000000000000000C4 +:10BC80000000000000080000400000080000000064 +:10BC90000000000000110000840000008800000285 +:10BCA000001008030000001000000000000500085C +:10BCB0000000401082110005820000050000840889 +:10BCC00090080421840000210104900090030800E2 +:10BCD0000000A000000000000000000800000000BC +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000080900000000023 +:10BD1000000000000000000000000000000800001B +:10BD2000200200004100000000A000882100000067 +:10BD30000000091085881188000000020000000042 +:10BD400000000000000000820000408800000000A9 +:10BD50008000400003000000000000000000000020 +:10BD600000000800000000000000000000000000CB +:10BD70000000000000000000010040000000000082 +:10BD80000000000000000004010002A000100000FC +:10BD9000000110010000000001000000840000010B +:10BDA0000000000000000000000000000000000093 +:10BDB00091000000400010000000000000000000A2 +:10BDC000A00020000000820010000500C0018801D2 +:10BDD00000040010008200100000000000000000BD +:10BDE00000000000800000000000000000000000D3 +:10BDF00000000000000000001100080080000000AA +:10BE000000000000000000000000080000800000AA +:10BE100008200840800800040000110803210020C9 +:10BE200000100000000005000000000000000000FD +:10BE30000000100010008000000000000000000062 +:10BE4000000000000000000080000410C104004059 +:10BE5000002103000000000000800000000000003E +:10BE600000004100030008094180000000000000BC +:10BE70000000000000000000000020200400000579 +:10BE80000000000000800000000000000010808022 +:10BE900000001000210020002120000040000000D0 +:10BEA00020000200200040000800200000000000E8 +:10BEB00000000000200008804000418000000000D9 +:10BEC00000000000400082008500410002000400E4 +:10BED000C000840380000008800000000000000013 +:10BEE0000000000000000100000001A000000000B0 +:10BEF0000000000000000000000000000100000041 +:10BF000000000000000000C000000040C00004006D +:10BF1000A0A08400009000000000010000000100CB +:10BF2000000001000000000000000100000000000F +:10BF300000000000000091000108010089080000D5 +:10BF400000000000000020000300A00001008308A2 +:10BF5000C000400004010400200140202000000037 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF80000200000001000000000040000000400529 +:10BF90000020000084880000000000000000000075 +:10BFA000000101000000000000000000000000008F +:10BFB000000000000000000000110091042100A01A +:10BFC00000000200000000000004000200020088DF +:10BFD0000008009189C100A190000000000000004D +:10BFE000000000000000000000000000000200044B +:10BFF0000000000000000000000000000000000041 +:10C00000000280200010400240000000800000007C +:10C010000040001000410802001002101110001032 +:10C0200000000004102108090003001000110000A6 +:10C0300000000000000000000000020400080020D2 +:10C040000080000080000000000000800000000070 +:10C05000000000C10802022100880000000000006A +:10C0600000000000000000000000000000000000D0 +:10C0700000110000000000000000000000000000AF +:10C080000000000000000000001000400000000060 +:10C09000000080028080000080002120210021001B +:10C0A000030800000040000000000000080020001D +:10C0B000210010110000000000000000000000043A +:10C0C000008000410000000000000000000000A00F +:10C0D0000080000021000300200040048000800058 +:10C0E00000800000000000000000000000020000CE +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000200821000C002000188000040 +:10C12000010000010000000100000000000001000B +:10C13000000001000001000000000000000000C03D +:10C1400000910010000000000000000000000082CC +:10C1500000080008000001000040000400019000F9 +:10C16000021008082000000000000000000000008D +:10C1700000000000000000000000000000000000BF +:10C18000000000000000000000E0000000000000CF +:10C190000000070060000000000000000000000038 +:10C1A0000000000000000000000000E000000000AF +:10C1B000000000E00000000000000000000000009F +:10C1C000000A00000700000000000000000000005E +:10C1D0000000000007000000000000000000500008 +:10C1E0000000000007000000000000000000000048 +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000F3F33030D8 +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C24000000000000000FFC300000000000000002C +:10C25000000000000000DBC2FFE6000000007E6F6F +:10C260007E09DBDF00040000000000000000000089 +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C2900000000000000000000000FFC3FF99F3F35E +:10C2A000303000000000000000000000000000002E +:10C2B000000000000000000000000000000000007E +:10C2C0000000000000000000F37200000000000009 +:10C2D0000000000000000000DB42FF6600000000DC +:10C2E0007E6F7E6FFFDF240400000000000000006E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C3900000000000000000000000000000004E4E01 +:10C3A000CFCF0889189900000000000000000000AD +:10C3B000000000000000000000000000000000007D +:10C3C0000000000000000000000000009999DBDB85 +:10C3D000000000000000000000000000FF02FF025B +:10C3E000000000002403243FFF0FFF0FBFBFFF3FEB +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C420004E4E0C0C00811091000000000000000036 +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C450000000000000000000000000000000FD00DF +:10C46000FD0000000000E703E73F3C0FFF0F838360 +:10C47000C303000000000000000000610006000D82 +:10C4800000000000000000000000000000000000AC +:10C49000000000610086000D000005000A00150084 +:10C4A00000A000610006001D000000610006000DF4 +:10C4B0000000000000650002000D000000610007A0 +:10C4C00000090000000000000000000005610A2EC5 +:10C4D000050D00A000000000000000000061000E3B +:10C4E000000D000000610006001D000000000000BB +:10C4F000000000010000000000000000000000003B +:10C5000000FFAAAA000000000000000000000000D8 +:10C510000000000000000000038EEBAA00000000F5 +:10C520000000000000000000000000002A2AAAAA63 +:10C53000000000000000000000001C180C08000FA4 +:10C54000030FFCFCFCFC00000000000000000000E9 +:10C55000000093C293C20000000000000000000031 +:10C56000000000000000FFFF7DFF57435757000009 +:10C5700000000000000000000000000000000000BB +:10C58000000000FFAAAA0000000000000000000058 +:10C59000000000000000000000003F8EEBAA000039 +:10C5A00000000000000000000000010000002AAAB6 +:10C5B000AAAAD78782870000000000001410040098 +:10C5C000000F030FFCFCFCFC00000000000000005A +:10C5D000000000006F196F1900000000000000004B +:10C5E0000000000000000000FCFCFCFC000000005B +:10C5F000000000000000000000000000000000003B +:10C6000000000000F03CFFAA000000000000000055 +:10C610000000000000000000000000003A3A3A3A32 +:10C62000000000000000000000000000000000000A +:10C630001CFF000000CF00FF0000FB0BFF0F003CC1 +:10C64000FF3C000000000F0F0F0D00000000000075 +:10C650000000000000003CFFF0F0000000000000BF +:10C660000000000000000CFF0FFF3C3C1C1CCAFA3D +:10C670000A3A000000000000000000000000000076 +:10C68000000000000000F03C00AA000000000000D4 +:10C6900000000000000000000000000000003A3A26 +:10C6A0003A3A000000000000000000000000000016 +:10C6B00000003CFF0000008F00FF0000FF0FFF0F95 +:10C6C000003CFF3C000000000F0F0F0D00000000B9 +:10C6D00000000000000000003CFFA3A300000000D9 +:10C6E00000000000000000000CFF00FF003C1C1CCC +:10C6F000CAFA0A3A0000000000000000040000002E +:10C7000040000040C00000020408000020000000BB +:10C71000840088002000A0000004000020004000E9 +:10C72000208040032080888020800080200000003E +:10C73000C004880420008410040005800003040065 +:10C740008808040404008403000021000484040019 +:10C75000400085A08804200020008408880440054B +:10C7600084880800C00488108800040020040400A5 +:10C7700020002003200520008800A00420100000D5 +:10C7800040002000100100000000000000024000F6 +:10C79000040000200004109000024102000000008C +:10C7A00080000008800000200020002000204000C1 +:10C7B000000000020482400040008000C020000011 +:10C7C00000004000110000000040000008000504C7 +:10C7D000200080004004000200000400000021004E +:10C7E000040021108002090040000002030005003F +:10C7F000000041000002000004004100000011029E +:10C80000000000000000A000000000000000001078 +:10C810000000020000020010041008000041001097 +:10C820004000000040000210910083000400030952 +:10C8300082080040A0090800002004200420842071 +:10C840000000000000000000820940200888080065 +:10C850000880084000000100000588400000040036 +:10C860000400000001000040200000004000020021 +:10C870000840400002104000010000000440028413 +:10C880008300000000080000008800000000001085 +:10C890000008000000000010004000000000100030 +:10C8A0000008800000088004000004100408808450 +:10C8B0000484050000000200800800110085008942 +:10C8C0000409000000000004000000008401A00230 +:10C8D0008410800880080884101005C000C009007A +:10C8E00000102008020808C0008400080400840822 +:10C8F0000908008482080484800802100408008269 +:10C900000005080800008400820000000008840080 +:10C91000A008000000030000000000080008000854 +:10C9200084008400040000000000000000000000FB +:10C93000200000000000100000100021000800028C +:10C9400000090210000004002000201010100482D2 +:10C9500020048202020400000008000021000021DF +:10C960004008900590210209C005404082412008FE +:10C970000000020000080009C000C02100210000E2 +:10C9800000084000902100A009000082080000007B +:10C990000808000000000000000000000400030080 +:10C9A0000400000208000000090000000000000070 +:10C9B000030000A000C0090010001000050000A046 +:10C9C000008405A000A00000098200A008840308DC +:10C9D0000020030000000001031011000340A00824 +:10C9E00041000000000003008584080040A0000012 +:10C9F000080000000000410010A0030005A04084D2 +:10CA00004000084040000000000500000000100049 +:10CA1000C000004000000000000000000000000016 +:10CA200000000400000000000000400000081002A8 +:10CA300040404020C04000040005100008050800E8 +:10CA40000440040384100000000108000400820078 +:10CA500008208203401010112004A00082404004EE +:10CA600002048220020408400004080208040804AA +:10CA700084094000C0000802000008008241101034 +:10CA800000888200A009080040410000000000006A +:10CA90000040000000040000000000000000000052 +:10CAA0000000000000000000000000000000020183 +:10CAB000000140000000000800000200041000080F +:10CAC000000080088884000000C000000000000012 +:10CAD00000000000110080008000A00141000082E1 +:10CAE000A10908010000C1100300409000400000AF +:10CAF0000000008808000040000100000010100045 +:10CB000004000203000000001110100000000800E3 +:10CB100000050000002100080000000000000000E7 +:10CB20000000000084000000000000110000000070 +:10CB30000000C00000000020000000040000000011 +:10CB40000000008000000000000800000000000855 +:10CB5000080000001000010004008400000800022A +:10CB6000A000080010050010C000C0000000C000B8 +:10CB70000000A00808800000100082004000C000F3 +:10CB800000000021020082030010000300000000EA +:10CB9000000009000000000000000000000000008C +:10CBA0000000000000000000000400000000000081 +:10CBB00000880004000000000000000004000008DD +:10CBC000000800A0001000A0008200C010C00000FB +:10CBD00005000020080800000200040800204000B2 +:10CBE000000100000000800008000310008403889A +:10CBF0000000002000C000040088004000048020E5 +:10CC00000310200000048084400000A0032008409E +:10CC100000110000080800040021002100080000A5 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000021002100000000B2 +:10CC40000000820000004000000400000004000515 +:10CC500000000011821000000004080020002008DD +:10CC60008400000500050021004000080040100974 +:10CC70008210000282002021A00440050021A000B3 +:10CC8000A0030021C000000300051000100384036E +:10CC9000081000000000000000000000000000007C +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000410000200000001003 +:10CCC000000800000000000002000000200000003A +:10CCD0000000000000000000000000000010000044 +:10CCE0000000000000040000000000000000000040 +:10CCF00000000084000000000300000000040000A9 +:10CD000000000020000000000000040000000000FF +:10CD100000200000000000000000000200000000F1 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000100010200000000000000EF +:10CD400000000000000000000000000000000000E3 +:10CD500010000000000000000000000000000003C0 +:10CD600000202082080200010001A001000188C00B +:10CD7000008800884000A00000C0408408C0000077 +:10CD8000020008000000118882C1848204C00000F3 +:10CD90000100900000000000000000000000000002 +:10CDA0000000000000000000000000000000000083 +:10CDB00000000000000000411010000000200000F2 +:10CDC0000000000000000000000000000000000063 +:10CDD0000200000000000000000000000000000051 +:10CDE00000C10410400200090041031008110010A6 +:10CDF000000000000000000080000000080080002B +:10CE000000000000800000008885042180898020C7 +:10CE10002000030008000000000000400080000027 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000900090000002108B7 +:10CE400000000000000000000000000080008000E2 +:10CE50001100108010000880000000000000000099 +:10CE6000000010008805A000084100802103001088 +:10CE70004021800000000000000008000820080099 +:10CE80000000090021000300050305802102418004 +:10CE9000C0821000900083002100000000030010F9 +:10CEA0000000000000000000000000000000000082 +:10CEB000000000000000000000000008000000006A +:10CEC000010100000020000000208400C0000800D4 +:10CED000080000000104010001040000000000003F +:10CEE0000000000001A01100A002110100020101D8 +:10CEF000008901858800A0008400900000000000E7 +:10CF00000182000000000100000000018804A191DE +:10CF100040A00889400009004000899000000000FE +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000010100EF +:10CF40008800000000000000C00000000000000099 +:10CF5000000000000000000140010000000000008F +:10CF600000000000000002010140C18591010000A5 +:10CF7000010100000000000800A00008102000408F +:10CF800000A00021020400000000000100000203D4 +:10CF900000100090A19000000001000000000000BF +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000869 +:10CFC0000810911000022000000080000000000006 +:10CFD000000000000000400900038021040200005E +:10CFE00000000000000000000010039120219108C3 +:10CFF0000002411020200520008000800080800079 +:10D000000020008000212080000000050021000990 +:10D01000001000A04100C000001000020008001035 +:10D020000000800080000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400041801000210008080000000000000000DE +:10D0500000090080000000000040004000000002C5 +:10D0600000000000000000000000C12108C0C10055 +:10D0700084204120A1009000110000000000000069 +:10D0800000000000800000000020020010000500E9 +:10D090000011410808808580911000000000008088 +:10D0A000000988000800100088000000000000004F +:10D0B0000000000000000000000000000000000070 +:10D0C000000000100100010001000000000000004D +:10D0D000000000000020000400000020000000000C +:10D0E000000000000000000000000000099110088E +:10D0F00008848900010004000400C1000000000051 +:10D100000008000090888200900082000100010069 +:10D1100000000000030911088410A00100020004AF +:10D1200000020000000000000000000000000000FD +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500007000005000000000000000000000000C3 +:10D1600007000000000000000000000000000000B8 +:10D1700000E007000006000000E0000042000000A0 +:10D18000000000000000000000E0000000000000BF +:10D19000000000000000000000000000000000008F +:10D1A00000E000000000505050500000000000005F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000FF00FF51FFF0FFF015BF15BF000000005A +:10D20000000000000AFF0AFF003C3028F0C3FF00C6 +:10D210000000000000000000C0C0C0C000BE00FF51 +:10D22000000000000000000050D3FFFF00000000DD +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D270000000FF00FF5000F000F010BA10BA0000EC +:10D28000000000000000FFEB004100003028C3C395 +:10D29000FFAA0000000000000000D0F0D0D0004342 +:10D2A00000FF0000000000000000C3C3C3C3000073 +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000005040FAFEFF00555500000000FD +:10D30000000000000005000030F030F033553355C8 +:10D31000000000000000000000000000282838384D +:10D32000FFFFAAAA000000007F4F7C4CC3C3C3C309 +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D36000000000800000000000000000000000003D +:10D370000000000000000040FFFEFF000F0F000053 +:10D380000000000000000005000000003CFF3355D5 +:10D3900033550000000000000000000000003828A5 +:10D3A0003838CFCF00FF000000007343704000000A +:10D3B000300000000000000000000000000000003D +:10D3C00000000000000000000000000000000061FC +:10D3D0000006000D000005000A00150000A0000076 +:10D3E00000000000000005610A0E050D00A000000D +:10D3F00000000000000000000061400F0019000064 +:10D4000000610007000D0000000000000010000196 +:10D41000006100070019000000610006000D000017 +:10D4200000613006001D00000061000700050000DB +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500055DF00CFFAFA0A0A0000000000000000C1 +:10D46000000000000000000000000000FD5DFD5D08 +:10D470000000000000000000000000F03C00FF0081 +:10D480001010FE000E002404240400000000000020 +:10D4900000000000000028AA28AAF00FFFFF05AF37 +:10D4A00055553C1405AFC6C6C6C6000000000000B6 +:10D4B000B2F00000000000000000000000000000CA +:10D4C000000000000000000000000000000000005C +:10D4D000000055D700C3FC0CFC0C0000000000004D +:10D4E0000000000000000000000000000000FD5DE2 +:10D4F000FDFD0000000000000000000000F05500ED +:10D500000000FFFFFE003E00200020800000000021 +:10D51000000000000000000028AA28AAF00F000068 +:10D5200005AF5555280050FA9C9C9C9C00000000BB +:10D530000000F0F00000000000000000000000000B +:10D5400000000000000000000000000000000000DB +:10D55000000000003C00AA00A2A2A0A00000000061 +:10D5600000000000000000000000000000000000BB +:10D57000FF0F3CFF00000000000000000000AA00B8 +:10D580003CFFED67FDF70000100000000F0F0000EA +:10D59000000000000000000000005050505000004B +:10D5A00000006789CD4CFF30FFF0000028EB000041 +:10D5B0000000A030FFFF000000000000000000009D +:10D5C000000000000000000000000000000000005B +:10D5D0000000000000003C008200F3F3F0F00000C7 +:10D5E000000000000000000000000000000000003B +:10D5F0000000AA0F3C000000000000000000000036 +:10D60000AA003C5FEFE5FFF50A00100000000F0FD5 +:10D610000000000000000000000000002814281492 +:10D62000000000006789CD4CFF30FF000000F0F0E3 +:10D63000000000003030FFFF0000A000A0008400C8 +:10D640000000000000041002000020004000200044 +:10D650000000A00000048800020000002004200454 +:10D6600000000000880420000400200020050008BD +:10D6700000008400000488080000200084002004CA +:10D6800004000405040004040408040540094000E3 +:10D690008400840088000002840804000404100050 +:10D6A0002002040020002004040388001003040466 +:10D6B000200404000000880284080000100010020A +:10D6C00000000000000000000000400240000000D8 +:10D6D00021000000009000020404000200400082CB +:10D6E00040000000000000000090400000004000EA +:10D6F0002100000000000000000400000000000005 +:10D700004000400040000800200020040000000409 +:10D71000000200080000004000000000400010006F +:10D72000050004040000410800024102400020906E +:10D730001100090000040402210000020000004062 +:10D7400000000000000000000000000000000000D9 +:10D7500000000010004000000040000000410010E8 +:10D76000001000100000000002000000004000094E +:10D7700000050010000082100000201000000003CF +:10D78000000502000000001002100010000004005C +:10D7900000000000900000400040004000008208AF +:10D7A00020000041020082100000820000100000F2 +:10D7B0000002001000000210001000100210000013 +:10D7C0000000008400080000028400100008000827 +:10D7D0000000000000000000001000080000000031 +:10D7E000000000880008000000880008000800848D +:10D7F0000000000800000000000800080000000011 +:10D80000040004080000000800000088008800846C +:10D810000240008400040082000002084008000268 +:10D8200000100288000000080000020000000084D0 +:10D8300000000008000000020900008800880004C1 +:10D840000000820000000000000000081008000036 +:10D85000400000004008000090000008C0000000E8 +:10D8600010000000000000000000000000000000A8 +:10D870000008000040000041200590000200000068 +:10D880000000104000000010100000001000000018 +:10D890000000C00000410000880088050000000072 +:10D8A000201088030010020000000000A00000000B +:10D8B0000005C0000000C000000084000009000056 +:10D8C0009041090041000008000000000000000035 +:10D8D00000000800000040000400000000000000FC +:10D8E0000800030003000020410000A0000810C051 +:10D8F00010200000030840000000090000000000A4 +:10D9000000200000000020A00200030021400420AD +:10D9100020004000008800080002030021000200EF +:10D920002090400003000000000000000000030001 +:10D9300009000382080010001100000021041008F3 +:10D9400011401084000000410000080000040000A5 +:10D9500000000800C000C000000000000000080037 +:10D960000200000000000800000900000040004024 +:10D970000002021104020000000908000000080073 +:10D980000000082000000000004000000800000027 +:10D99000821100400040080008110000A0000011A2 +:10D9A0000800A00408410800080908408200080097 +:10D9B000000404408200040482049000000000057A +:10D9C000400540208200030000000000000000002D +:10D9D0000000000000000000000000000000000047 +:10D9E000000008000000004000000000000000905F +:10D9F00003000000020000C00800000000C0008812 +:10DA0000000000100084000003000000000000007F +:10DA100000400090000000004104000002002000CF +:10DA200000000000400000A00300400000200002B1 +:10DA300000000300210003C00200004000000000BD +:10DA4000080010001000200000000000000000008E +:10DA50000000080008000000000000000000820034 +:10DA600008000000000000000000000000000000AE +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000004000000000000000000000082 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000040008200080900000000080289 +:10DAC00000000000C0000000080008040804000076 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000040A0400800040A +:10DAF00040A0000000000000000000000000000046 +:10DB000020000500110000000002000000000000DD +:10DB100000000900092000020000219008000920EF +:10DB20001102000000C00002400400044000000494 +:10DB30002088000000C008A00000000011004190F3 +:10DB400003C0050011000800400003A00000000011 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000004000000820807 +:10DB900000000000A0100000000000008200C00093 +:10DBA0000000080000000000000000000000000865 +:10DBB000820084000000000000000000000040001F +:10DBC00000000000000882000000840088000000BF +:10DBD0000000000000000000000000000000000045 +:10DBE000000000000000000000000000000000A095 +:10DBF000000000000000000009000000000020C03C +:10DC00000000041000C04000000000000000000000 +:10DC100003000000000000000004000000000500F8 +:10DC20004000000004040000040400004002000062 +:10DC300003001108000000000090090000000082AD +:10DC4000001005100000200000000000000000028D +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 :10DC700000000000000000000000000000000000A4 :10DC80000000000000000000000000000000000094 :10DC90000000000000000000000000000000000084 @@ -69230,438 +69230,438 @@ :10E5C000000000000000000000000000000000004B :10E5D000000000000000000000000000000000003B :10E5E000000000000000000000000000000000002B -:10E5F00000000000000040002000880040040400EB -:10E6000005008800880200000000000020000400CF -:10E610000400100000000000402000002040000026 -:10E620000082000000400000000400000004000020 -:10E630008400000000000001000000000000000055 -:10E6400000000000000000000000000000000000CA -:10E6500000000000000000000000000000000000BA -:10E6600000000000000000000000000000000000AA -:10E6700000008400000000004100000020000000B5 -:10E680000000200241000000000000000000000027 -:10E690000000400009000000000000010000000030 -:10E6A00000000010000000010000000000000082D7 -:10E6B000000000000000000000000000000000005A -:10E6C00000004000400000000000000000000000CA -:10E6D000000000000000000000000000000000003A -:10E6E000000000000000000000000000000000002A -:10E6F0000000000000000000000088000040000052 -:10E7000000400100C0000908402140410000404194 -:10E710004000000009000800020441004020008081 -:10E720000002000000004010000000000000C000D7 -:10E730000000000020000000880000000000000031 -:10E7400000000000000000000000000000000000C9 -:10E750000000000000002000000000000000000099 -:10E7600000000000000000000000000000000000A9 -:10E770000000000000000000000000000000000891 -:10E78000400000004000000010118900800004C01B -:10E790008000C1000900C00080000900A0028403BD -:10E7A000002000014100400000010000000000C006 -:10E7B0000400000000000000000000000000000055 -:10E7C0000000000000000000000000000000000049 -:10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000000000000000000000029 -:10E7F0000000000000000000000000000000000019 -:10E8000000002008000040002000110040004000EF -:10E8100084000000200010000000000984000010A7 -:10E820000000042004000000000000000000400080 -:10E830004000A020020010000000000000000000C6 -:10E8400000000000000000000000000000000000C8 -:10E8500000000000000000000000000000000000B8 -:10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 -:10E880000000400000000000000083009000000035 -:10E89000880005000000400000400000000000006B -:10E8A00000000000800000004000000000000500A3 -:10E8B00080000000000000000000000000000000D8 -:10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000200400008200840082008480102126 -:10E910004002C004000408048240A08200040040B9 -:10E9200041000010908208A0110000000802004081 -:10E93000089000020000000000000000000200003B -:10E9400000000000000000000000000000000000C7 -:10E9500000000000000000000000000000000000B7 -:10E9600000000000000000000000000000000000A7 -:10E970000000000000000000000000000000000295 -:10E980000000000008040020201002000884000499 -:10E99000080040002100210803A003000810210006 -:10E9A0000001828200010004032120001000040005 -:10E9B0001001030341010300038203000800030068 -:10E9C000082000000000000000000000000000001F -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 -:10EA0000000000000000C0008200000008000000BC -:10EA100004001000840082000810100210000000A2 -:10EA200090200000090008000840001020000000AD -:10EA300010040009A0040000000000000000000015 -:10EA400000200000000000000000000000000000A6 -:10EA500000000000000000000000000000000000B6 -:10EA600000000000000000000000000000000000A6 -:10EA70000000000000000000000000000000000096 -:10EA80000000000000000000000000000000000086 -:10EA9000400000048000000005000000000010009D -:10EAA0000500000000900840030000000000840002 -:10EAB0000000000000000000000000000004000052 -:10EAC0000000000000000300000000000000000043 -:10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000000000000026 -:10EAF0000000000000000000000000000000000016 -:10EB000000000000000000000000000800100020CD -:10EB10000000C000838084008900102140000800AC -:10EB20000000040000000800100000002020200069 -:10EB3000A00000100000080000000000000000001D -:10EB4000080000000000002000000000000000009D -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000000000085 -:10EB900000C000000000200400004040000282008D -:10EBA00000820504412000022100110003028000C0 -:10EBB00083201100080105004100410041021000BE -:10EBC0000084100005021000080021000000000071 -:10EBD0000820000008000500000000000000000000 -:10EBE0000000000000000000000000000000000025 -:10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000010000000100010000F1 -:10EC200000018400000041C0A0094041082109887A -:10EC300001910088A0A090C000080482000200009A -:10EC400000010000000100000000000000000000C2 -:10EC500000000000000000000000000000000000B4 -:10EC600000000000000000000000000000000000A4 -:10EC70000000000000000000000000000000000094 -:10EC80000000000000000000000000000000000084 -:10EC900000000000000000000041201040100002B1 -:10ECA00000200304800500109083A0838088000862 -:10ECB0009108032040800040008000008000008018 -:10ECC0000000000400200010000000000000000010 -:10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000000000024 -:10ECF0000000000000000000000000000000000014 -:10ED00000000000000000000000000000000000003 -:10ED10000000000000000000000008004100200882 -:10ED200011000000080004001021C10010058382BA -:10ED300010210080A0210205004000000005008095 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000000083 -:10ED900000000000000000000000000000880000EB -:10EDA00000000000000000000100000988102100A0 -:10EDB00040838341820410002108084090009000A5 -:10EDC0000804000000000000000000000000000037 -:10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 -:10EDF0000000000000000000000000000000000013 -:10EE00000000000000000000000000000000000002 -:10EE100000000000000000000000000000000000F2 -:10EE20000101880100000000000100010000200332 -:10EE300001090103A091901003090110A0A0A010E6 -:10EE400000A00089A1820000000000000000000076 -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 -:10EE70000000000000000000000000000000000092 -:10EE80000000000000000000000000000000000082 -:10EE90000000000000000000000000000000000072 -:10EEA00000411110822100110010030841210005CA -:10EEB0000082400805A1830300208320219083A0C5 -:10EEC00000200090004009830000030000000000C3 -:10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000000000000012 -:10EF00000000000000000000000000000000000001 -:10EF100000000000000000000000000000000000F1 -:10EF2000000008800300030008112103000008000E -:10EF3000201088219021A0800811A0008540210088 -:10EF40000311800080880000000000000000000025 -:10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 -:10EF70000000000000000000000000000000000091 -:10EF80000000000000000000000000000000000081 -:10EF90000000000000000000000000000000000071 -:10EFA000000000000140000000000100019000008E -:10EFB00000000001C041A14011404108C1A091885A -:10EFC00001024000C000028220900000000000000A -:10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 -:10F02000000000000000000000E000000000000000 -:10F0300000000000000000000000000000000000D0 -:10F0400000E00700000000000000000000000000D9 +:10E5F000000000000000000040008800C00004008F +:10E6000004004000040020002000880011000000E9 +:10E6100000000000000010000000000010040100D5 +:10E62000000020830000200041000003408088009B +:10E630000500C000088000038800020088048804E8 +:10E64000880010808204880020002020A004C000E0 +:10E65000200020008882200440004000C0202004C8 +:10E66000C0004000880088042000040084031004D7 +:10E67000A00040208800C010400000000000000002 +:10E68000000000000000000000000000000020006A +:10E690000002009000900004409041004002000001 +:10E6A00008004084002040C0000088000000C11025 +:10E6B0000004400000008002000000000000000094 +:10E6C000000200020010210200004000000100844E +:10E6D0000004410004A000110000C0000200090372 +:10E6E0000000050404000002040000040000000013 +:10E6F0000000009004914100400000000200000072 +:10E70000080008000340000809400008000010004D +:10E710002010020002050200081002100204080086 +:10E72000A0000040001003100400024103008240DA +:10E73000002182100341021100400000001000007F +:10E7400000400000004182020203020000000100BC +:10E750001000A041020021000821880008000000EC +:10E760000402400000000809000804000100001035 +:10E77000001010000021040004000200000000004E +:10E7800000084004098410000010400000040084C8 +:10E7900000000084008400080008000809880910AF +:10E7A0000308004000C00000042082080088109088 +:10E7B0000008418404820210008200080000000862 +:10E7C00000080084020200040004000000040900A4 +:10E7D000040080C0200040008882828400108304EE +:10E7E00003848401C0000008020003000040080404 +:10E7F0004100000403000200A0C000082000000047 +:10E8000000000010000200400000000000080000AE +:10E810000000000000040008100004000000880050 +:10E8200000080000100804080008000000001000A4 +:10E8300000000000001000000020000000040000A4 +:10E84000000300410000000500100005040040081E +:10E8500000080000880800210000200000000221BC +:10E8600082004008A0080008000300080005100509 +:10E870000008100800080400900000400800900004 +:10E8800000000000000000A00000000000000000E8 +:10E890000000000000000001000000000000000077 +:10E8A00000000000000000000000000000900000D8 +:10E8B000090000000000000000000000009000843B +:10E8C000000000000000000008A000080000000098 +:10E8D000000000000004000000000000800008822A +:10E8E00000820000A10800040900000010A0000040 +:10E8F0002100100000004000008400000220009071 +:10E900002100000000080800820000080000C0008C +:10E910000800C000C008000000040041020082009E +:10E920008240004000000800000584040800000048 +:10E930000804081190000800088940000021000028 +:10E940008205000008418200000000044000881198 +:10E95000840004004040004002100000A002820831 +:10E960000408C010A00009408400400040080000D6 +:10E970000804000004000902080408041000001044 +:10E98000C00010040004000800000008000000049B +:10E99000000000000000000000000009000000006E +:10E9A00041000000008400000200000000C000845C +:10E9B0000000000080820084000011108000000030 +:10E9C000000404000000000000000000001000002F +:10E9D000004000002000800041880200114000A19A +:10E9E000214020400089000040202040A0201184C8 +:10E9F0000390218441000500040041004000049080 +:10EA0000020010402100000000000000082100006A +:10EA10000800080000000000000000008200000064 +:10EA200000000000000000000000000008000000DE +:10EA30000000002082000000080082001000400555 +:10EA40000008000800050000000000000000C021D0 +:10EA5000000004000800A005A000820010000000D3 +:10EA60008800040010008241C000000400400180C2 +:10EA700008000000000808008200010082008208EF +:10EA800008008400040000000000000000000400F2 +:10EA90000000000000000000002000000000000056 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000010000000000000000000055 +:10EAC000000000A000002000000000000000040082 +:10EAD00000000000000000000900050000A00490F4 +:10EAE00005000000000021000200000000000000FE +:10EAF000400800081000000000000020040000880A +:10EB000000000000000000200040000040008200E3 +:10EB100000210000000000000000000000000000D4 +:10EB200000000000000000000000000000000000E5 +:10EB300000000810820000000010A000402100002A +:10EB4000000000000021000500A1000000210000DD +:10EB5000002090210200000000000004C0004021BD +:10EB600020000221400084008200000008210000F3 +:10EB700008212005A011000000000008002100006D +:10EB80000011C010820000218400C00800080000AD +:10EB9000004002000000080000000000000000002B +:10EBA00000000000000000000000000000080890C5 +:10EBB0002002200000002040040400C000000000EB +:10EBC00000C00290000040000000000200000400AD +:10EBD0000200000000000000000000000000000033 +:10EBE0009100000000002020412000C009400200E8 +:10EBF00000104104A0820300080221100000000060 +:10EC00002000099000000008200000000000000023 +:10EC100000000000000000000000040000000000F0 +:10EC200000000100000000000000000000000000E3 +:10EC3000000000000000A01000880008C00202A12F +:10EC40000902021182040100040088000001000092 +:10EC5000000000000000000000A0008800A00002EA +:10EC600000010084010200C1008800A100054011DC +:10EC70001000910040009001000000000000000022 +:10EC800000A09008008200880888009000A00088FA +:10EC900000000000000000000000400080000000B4 +:10ECA000000000000800000000000000000000005C +:10ECB0000000000000000000008000000000800054 +:10ECC0000090821180888009104091100041000856 +:10ECD00000000000000000000000008000000000B4 +:10ECE00000000041001110080010008300034004E0 +:10ECF000008240092108852000210000000000005A +:10ED00000000008080800080000000000080008003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000800080030002CE +:10ED400000800000000880800000880080008800AB +:10ED5000A0210000000000000000000000000003EF +:10ED60000080008000000000000000040900040092 +:10ED7000890084100000080408000303000000005C +:10ED80000000000000000040000000000000001132 +:10ED900000800000000000000000000000000000F3 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000004000820190 +:10EDC000400010900004040184A0A0820210020000 +:10EDD0008200C101000000000000000000000000EF +:10EDE000000100020008000000000000000104080B +:10EDF0004100A00009A00004010101400001000041 +:10EE00000000000000000000000000A0000008005A +:10EE1000089190A002000000000000000000000027 +:10EE200000000000000100000000000000000000E1 +:10EE30000000000000000000000000000000104082 +:10EE400000A09040108810200011088810A1000038 +:10EE500000000001000000000000000000000000B1 +:10EE60000400000000008400000000000100000019 +:10EE700000000100018404C00003001004C00089E8 +:10EE80000000000000000000A000000000000200E0 +:10EE9000020800020002A190000000000000000033 +:10EEA0000040000500410041000000000000080093 +:10EEB0000000000000000000000000000000000052 +:10EEC000008000808000000000410910904080C157 +:10EED000020503400821004000000000000000007F +:10EEE000000000000000000000000000030005001A +:10EEF0002000000040000280910000A00205904127 +:10EF000008200000000000000000000000000000D9 +:10EF10000000800000800000880000000000000069 +:10EF200000000002000000000000000000000000DF +:10EF300000000000000000000000000000000000D1 +:10EF40000000000000800000000021080500C10052 +:10EF50008800210908024180100300000000000021 +:10EF600000000000000080000000000011212110BE +:10EF700004004000050010002100080341851041F5 +:10EF800021000804000000000000000080000000D4 +:10EF900000008000000380808000800000000000EE +:10EFA0000000000000010000000000000000000060 +:10EFB0000000000000000000000000000000000051 +:10EFC000000000000000000200900000C101C0002D +:10EFD00010202100018401900008000100000000C1 +:10EFE0000000000000001000080010008400000174 +:10EFF000000101000000001001020190010001C0A9 +:10F0000009008300A00000000000000000000400D0 +:10F01000C000C0000800880020028490A00000000A +:10F0200000000000000000000000000000000000E0 +:10F0300000E00000000000000000000000000000F0 +:10F0400000000000000000000000070000060000B3 :10F0500000000000000000000000000000000000B0 :10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F090000000000000000000000000000000000070 +:10F07000410000E007000000000000E00000000088 +:10F08000000000E007008400000000000000000015 +:10F090000000000007000000000000000700000062 :10F0A0000000000000000000000000000000000060 -:10F0B000000000000000000000C3E8E8AAFF1E1ED8 -:10F0C000AAFF828200AA00AAA0AFFAFA505041EB30 -:10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000000FF -:10F1100000000000000000000000000000000000EF -:10F1200000000000000000000000000000000000DF -:10F13000000000000000000000003CFFE8E800556F -:10F140001E1E0055D7D7FCFC0C0CA0AF0A0A50506D -:10F1500041EB000000000000000000000000000083 -:10F16000000000000000000000000000000000009F +:10F0B0000000000000000000000000000000000050 +:10F0C00000000000000000000000000000FC00F054 +:10F0D000F0F0AAAA10F0B0F000000000000000005C +:10F0E00000000000000000000000C0C0C0C0000020 +:10F0F000000000000000000000000000000000FF11 +:10F10000FFFF3FAA3FAA3C0A3CFA000000000000B3 +:10F110000000C300C30100000000FFFF3AAAD88D21 +:10F12000080D0000000000000000000000000000CA +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000FFFFFFFF00FCC7 +:10F1500000F4FFFFC3FFA0A0F0A00000000000002B +:10F16000000000000000000000000000F0C0F0E01F :10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F -:10F19000000000000000000000000000000000006F -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000000000000000AAAA30309B -:10F1C000F53C053CCF0CC30000F000F0AA003C0F5A -:10F1D000C082C082000000000000000000000000AB -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F2000000000000000000000000000000000000FE -:10F2100000000000000000000000000000000000EE -:10F2200000000000000000000000000000000000DE -:10F230000000000000000000000000000000FF00CF -:10F240005555003C003C8E8E828200F000F8AAFFEB -:10F250003C0FFC82FC820000000000000000000067 -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E -:10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000000005E -:10F2B00000610005000D000000610006000D000067 -:10F2C000A0615006001D0000A061000B00090000B5 -:10F2D000A0615006000D000000610006000D000056 -:10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F3000000000000000000000000000000000000FD +:10F1800000FF000030AA30AA3C3C3C3C00000000DC +:10F1900000000000C300C3410000000000003AAAC4 +:10F1A000D88D080D000000000000000000000000E5 +:10F1B000000000000000000000000000000000004F +:10F1C0000000000000000000000000000C0004002F +:10F1D0000B00CB00FDF0FFF000FF00FF000000007F +:10F1E0005D5D7D5500000000000000000000000093 +:10F1F0000F0F00000000C3CFC3CF000000003F7D11 +:10F200000341FFFFFFFF00000000000000000000BE +:10F210000000000000002B2B033F000000005555AC +:10F22000FF008A080808000000000000000000003D +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000C00B2 +:10F2500000000F000F00FCF0FFF000FFF0F00000D6 +:10F2600000000C0C3C00000000000000000000004A +:10F27000020A0F0F00000000C3CFC3CF0000000040 +:10F280003F7D0341FFDFFFFF0000000000000000A2 +:10F2900000000000000000000F0F0F0F0000000032 +:10F2A0001717FF009A59595900000000000000008C +:10F2B00000610006000D000000610007000D000065 +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000610006000D0000BA +:10F2E00000610006000D00050000000000000000A5 +:10F2F000000000000000000000000021000FC00D11 +:10F30000000000610005001D00000061000F000901 :10F3100000000000000000000000000000000000ED -:10F3200000000000000000000000000000000000DD -:10F330000000C3C3C7C300FC00FFF3F3C3C300FF57 -:10F3400000FF008E00B2FFAAD782FF00D78203F32E -:10F3500003F300000000F0305050000000000000F7 -:10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D -:10F38000000000000000000000000000000000007D -:10F39000000000000000000000000000000000006D +:10F32000000000000E0000000000000000000000CF +:10F330000000000000003CFC3CBE0000000000009B +:10F3400000000000000000000000000000000000BD +:10F35000000000000000000000000000FD5DBABADF +:10F3600030BA00FF00F0143C000000000000000074 +:10F3700000000000000000000000000000303030FD +:10F38000000000000000FCC000000000AA00505077 +:10F39000CFC3F7C300000000000000000000000021 :10F3A000000000000000000000000000000000005D -:10F3B00000000000C3C3C7C300C000FF303000001E -:10F3C0001010515171FF4DFFFFAA5F0A5F0A5F0ADB -:10F3D0000000FFFF00000000F0305050000000006F -:10F3E000000000000000000000000000000000001D +:10F3B000000000000000000000F000AA00000000B3 +:10F3C000000000000000000000000000000000003D +:10F3D0000000000000000000000000000000FD5DD3 +:10F3E000303030BA00FF00F1043C000000000000A3 :10F3F000000000000000000000000000000000000D -:10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC +:10F400000000000000005541FDC100000000AA00FE +:10F410001010FFC3F7C30000000000000000000050 :10F4200000000000000000000000000000000000DC -:10F43000000000000000F909F9F9C1E9C1E9171756 -:10F440001717555550FA2B030317B2B2C3FFFFEB42 -:10F45000C3EB5555555500000000000000005D0845 -:10F460005D08000000000000000000000000000037 +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F450000000000000000000000000000000200C80 +:10F46000303C00000000FF00FF00AA008200000006 :10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000000007C -:10F49000000000000000000000000000000000006C +:10F48000C0C004000000000000000000CBC1CBC1E0 +:10F4900080009C3C0F05FFF500000000000000000C :10F4A000000000000000000000000000000000005C -:10F4B0000000000000000000F9090909C1C1E9E9E4 -:10F4C000FF3CC300000050FA28000014B2B2003C18 -:10F4D0003C28002805F505F50000000000000000AC -:10F4E0005D085D0800000000000000000000000052 +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E0000000000000000000AAAA0303AAAA82826A :10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB -:10F5100000000000000000000000000000000000EB +:10F500000000C0C000000000000000000080EB41CF +:10F51000C3C380C09CCC00000000000000000000BD :10F5200000000000000000000000000000000000DB -:10F530000000000084002000000001804080C00422 -:10F540000004000000008403000000002000000010 -:10F55000400000000000000000000000200000004B -:10F560000004000000000000000400000000000093 -:10F57000000000010000000000000000000000008A -:10F580000000000400000000000000000000000077 -:10F59000000000000000000000000000000000006B -:10F5A0000000000400000000000000000000000057 -:10F5B00000000000000000002100000008040020FE -:10F5C00020902100000020002000400040000000AA -:10F5D00000000000410000000000000000000000EA -:10F5E00000400000000000020000000000000000D9 -:10F5F00000002100000000000000000000004000AA -:10F6000000000000000000000000000000000000FA -:10F6100000000000000000020000000000000000E8 -:10F6200000000000000000000000000000000000DA -:10F6300000000000000004002041840285002088B2 -:10F64000200008022188000000000000910088804E -:10F6500004094082040000000000000000000400D3 -:10F660000080000000804000008000000082000058 -:10F670000080000000A000000080408000000080AA -:10F68000000000000000000000000000000000007A -:10F69000000000000000000000000000000000006A -:10F6A000000000000000000000000000000000005A -:10F6B0000000000000000000200080880001200001 -:10F6C000C11180C082418404110002820082088836 -:10F6D000000480080511A0080000000000000000E0 -:10F6E000000000040000000480000520110000213B -:10F6F0000000402000000003000000028002000023 -:10F7000000020000000000000000000000000000F7 -:10F7100000000000000000000000000000000000E9 -:10F7200000000000000000000000000000000000D9 -:10F7300000000000000000000000000000030009BD -:10F740000000001000410000000000200000200028 -:10F75000000000800000008001000008000200009E -:10F76000000800090004000400400100000000003F -:10F770000000000000002000000000000100000068 -:10F780000009000000000000000000000000000070 -:10F790000000000000000000000000000000000069 -:10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000000000000000000410008 -:10F7C000100008000800200400000800058409005B -:10F7D0000000080021400800021040400500100110 -:10F7E000000009000004000003040001022000845E -:10F7F0000000000000000000000000820000400047 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 -:10F8200000000000000000000000000000000000D8 -:10F8300000000000000000000000000000000004C4 -:10F840000000840000408200090040110002841181 -:10F85000A021820584400200000082A040204000D8 -:10F86000821140400002100000001000820082005F -:10F8700082801000900000000000000000000000E6 -:10F880000000000000000000000000000000000078 -:10F890000000000000000000000000000000000068 -:10F8A0000000000000000000000000000000000058 -:10F8B0000000000000000000000000000000000048 -:10F8C000038520C021820900094004408300030011 -:10F8D0001100210821000008400000001010214103 -:10F8E000C000118480011005030005404000214044 -:10F8F00000004102030000204000118821824100E5 -:10F90000000000000000008800001000000000005F -:10F9100000000000000000000000000000000000E7 -:10F9200000000000000000000000000000000000D7 -:10F9300000000000000000000000000000000000C7 -:10F94000000000000800000340000002040800005E -:10F9500000040000840008041040040008808900AE -:10F9600010804000C020820008031020000408021C -:10F970002040A000000000000000000008008800F7 -:10F980000000000000000020000200000000000055 -:10F990000000000000000000000000000000000067 -:10F9A0000000000000000000000000000000000057 -:10F9B0000000000000000000000000000000000047 -:10F9C0000000000000A000000000000003880920E3 -:10F9D0000000000021000000008400000304032058 -:10F9E00008C00520040000880004890020000000F1 -:10F9F000400010210000000008000000000000008E -:10FA000000000000000000000000000100000000F5 -:10FA100000000000000000000000000000000000E6 -:10FA200000000000000000000000000000000000D6 -:10FA300000000000000000000000000000000000C6 -:10FA40000000000000000800000082820000031097 -:10FA50008400884100004021842184098821C00459 -:10FA60008200A040840084000808A0008403C00035 -:10FA700084041000C0040000400584000000000061 -:10FA8000000900030009000000020000000200005D -:10FA9000000000000000000900000000000000005D -:10FAA0000000000000000000000000000000000056 -:10FAB0000000000000000000000000000000000046 -:10FAC0000000000000000000000000000002020032 -:10FAD0000811208409882000000420000000000094 -:10FAE0000801210400000400000000000888000450 -:10FAF0000000218905001001000083000002102091 -:10FB000002880000000008000000050000020090CC -:10FB100003000000080000000000000000000000DA -:10FB200000000000000000000000000000000000D5 -:10FB300000000000000000000000000000000000C5 -:10FB400000000000000000000000000101010800AA -:10FB5000000103A090908204829000000000000049 -:10FB60000000000190030002820205011101400122 -:10FB7000820100040190040000830005419182A1EC -:10FB8000A09010A100918408C09000000000000027 -:10FB90004001000000000000000000000000000024 -:10FBA0000000000000000000000000000000000055 -:10FBB0000000000000000000000000000000000045 -:10FBC0000000000000000000000000000011080814 -:10FBD00088110008828920A0401080890000000060 -:10FBE00000000000001180210088A01190418502D2 -:10FBF000800589020088080900000008089002C0FA -:10FC000000900005088221C080858003000011401B -:10FC10000803800500200000000000000000000034 -:10FC200000000000000000000000000000000000D4 -:10FC300000000000000000000000000000000000C4 -:10FC400000000000000000000000000000000500AF -:10FC5000100000000041A00021000300C1000000CE -:10FC600000000000000005808391C0802105000095 -:10FC70008508900085838000058382001010C100F4 -:10FC80009091A002A18300008041800580000000C7 -:10FC900020001000200008210000000000000000EB +:10F53000000000030300014084400200200000009E +:10F540008804200088000000010010001000211134 +:10F55000400090002000A100200020004000020494 +:10F560000808210020000303018488000200201104 +:10F5700088000003200020002000C000200020415F +:10F58000820420088804200390038800200284005D +:10F590002008841108008411881020002040880071 +:10F5A000848020000000880408008404C1802000BA +:10F5B0008804200040008800409100010000000005 +:10F5C0000000008210000002080204008090000089 +:10F5D0004000900040020000400280000000000057 +:10F5E000800080044000009008004010400020820D +:10F5F0000002000000000000090009900000000067 +:10F600000090200200002000000000000000000028 +:10F61000000000000000C0824182000100000000E4 +:10F6200005000910108221040084900010000420BD +:10F63000100000030000080008020800004002005B +:10F640000004021002000000000002100804028002 +:10F65000404000050000410091402010030400419B +:10F66000004100108800020400080309020820106D +:10F670000010021000000000008540050000200579 +:10F6800008000000080000000400040008008409CD +:10F690002100910084218410898008200920001015 +:10F6A000090008410010084000048420840008007C +:10F6B0000020049001C08404800080A18084001098 +:10F6C0000810400000044088008441000008000841 +:10F6D0000008800800020000A08420108300400180 +:10F6E00002880288000900100000001004840985C7 +:10F6F00080000084008400400000000280880084B4 +:10F70000850000000082000800040088000400005A +:10F7100000A040000208110003080820808340096F +:10F7200041850208000402040008031003080008D1 +:10F73000C00800010002042000080008A003100017 +:10F74000000000210000000000080800001008056B +:10F7500090000005100090000008401040210000BB +:10F760002010000000000009002104090011890098 +:10F7700088080000001100000021000000000008BF +:10F7800000080009000000080003402100080008EC +:10F790000008000800000000044040408400000011 +:10F7A000A00000000002A00000050000000400000E +:10F7B0004010001100004000840000030090009001 +:10F7C0008082000000000000000000A00000000097 +:10F7D0008000000000008900000000004000800060 +:10F7E000000000000500000000000500009000007F +:10F7F0002090002000840008008200C000000082E9 +:10F800000000090200822100000000004000108278 +:10F81000410000C0000000000000100000000808C7 +:10F8200000400088000803002102000200000000E0 +:10F830000800080108000900100000040000000092 +:10F8400010410840084000008240080008000010F5 +:10F8500000080800002100000800000008008400E3 +:10F86000014082050800100408040011101108105E +:10F87000400010000000080500000000080400001F +:10F88000A0000004004090008200C0001040000072 +:10F890009010000010404000821082008240004121 +:10F8A00002202000C01182118400C005040402401F +:10F8B0000802A040C0408200080000002004C041AF +:10F8C000418403041182098411080008000021C04A +:10F8D000050000000000000000C004000008000057 +:10F8E00010084008000800A000C000C0000000C0D0 +:10F8F000900480109188000000000000000040008B +:10F9000000000008000000000800000000C0000027 +:10F91000000000001000410000000900000000008D +:10F9200011408040000002040088410000002108CE +:10F93000809002000000104000400088000040015C +:10F9400041000000000000000009000800088200DB +:10F9500000410000000082001000000000000402CE +:10F96000A00000000000000001400400000890001A +:10F9700008020000A02100084000C0040000900020 +:10F98000A000000000008208A04000080000000065 +:10F990001021824100000041000010000000000022 +:10F9A000000008020000A0000800000000000000A5 +:10F9B0000000A00082000000A010A00082008200D1 +:10F9C0000000000000000000000000000000000037 +:10F9D000000000000000000000000088000000009F +:10F9E00000010000000000000000200000040000F2 +:10F9F000202000000308001000018308008203009B +:10FA00000488100800000000000000000000000052 +:10FA1000000010020000000005002010000000A0FF +:10FA20000800210005000440041041C0000000004F +:10FA300000000000000000A000000000002020885E +:10FA40000490400000020005000800008200000849 +:10FA500000050008004100000808000008800000C0 +:10FA600000001008000000030011A0000000901129 +:10FA70008200004008000111A10000001008880069 +:10FA8000000010000000000010090000000000004D +:10FA90000008004000000000900020000800000066 +:10FAA00001008800820021000091080040000480CD +:10FAB00000000808400040032000001082100000F1 +:10FAC0004000004102040241000000820000008466 +:10FAD0000004000000000000000000000000002002 +:10FAE000000000000000030000100000000000A063 +:10FAF00000000010200402004000200020008000D0 +:10FB000000000000000000000000000000000000F5 +:10FB10000000000020102000200000000200000073 +:10FB20000000084021002090400002400200000038 +:10FB300082200040202008000000110004890000FD +:10FB40000090800008000800000008C1012010108B +:10FB5000880100000000000000000000000000001C +:10FB600090000000410088000001000000009101A9 +:10FB70000000A00000A000904084110100000100DE +:10FB8000040000012000010000000000000000004F +:10FB900085000000000000000000000000000000E0 +:10FBA0000000000000010101A00000010120204030 +:10FBB000000840828820001000C08802C004008431 +:10FBC00000040088830484200120884189C10485C1 +:10FBD0008011000200000000000000000000000092 +:10FBE0000000800000201003000300030000000359 +:10FBF00004110000800000000000000010412005FA +:10FC0000101180000020000003030000000000022B +:10FC1000200290020002000000000000000000002E +:10FC200000000000000000040308000200040900B6 +:10FC300080800000008020000000000000008000A4 +:10FC40000000000000000280000310030002908802 +:10FC50000900888921210000000000000000000048 +:10FC600000000000800010801000100041400920BA +:10FC70002100050221118000000300008000118096 +:10FC8000A18889411121000000000000000000004F +:10FC90004080090040000008000000000000000053 :10FCA0000000000000000000000000000000000054 -:10FCB0000000000000000000000000000000000044 -:10FCC0000000000000000000000000000000000034 -:10FCD00000900100000000018810100090049100C5 -:10FCE00000009000C0008200C002080403028900E6 -:10FCF00000081000A12008A00204910805A011012D -:10FD0000042082210521039140004000A0C09040C2 -:10FD100000000190010000000091000000000000C0 -:10FD200000000000000000000000000000000000D3 -:10FD300000000000000000000000000000000000C3 -:10FD400000000000000000000000000000000000B3 -:10FD50000000000001000001000110A0008808055B -:10FD6000901000000000000000000008010003A047 -:10FD700009A000020040051101110001010000016D -:10FD8000A100A0000002A00882C1A0880009018291 -:10FD90008288000000000000400000010000000018 +:10FCB000C000900004090900000000A100800000BD +:10FCC0000000000080008000200090218380080058 +:10FCD000400910000911110100000000000000009F +:10FCE00000008800000090000110000000000100EA +:10FCF00000080100010101C088008801020008C05D +:10FD0000900490030309012100000000000000009E +:10FD100000000010000000000011000000000000C2 +:10FD200000000000000000000000A0008800C08269 +:10FD300084828900080408A102080000000400A0D1 +:10FD4000000000008200A000080040080900051023 +:10FD50000200021000A100108383000000000000D8 +:10FD6000000000020002000000000000000000018E +:10FD70000001000002000101010000040004000471 +:10FD800000C0009088080288000300000000000006 +:10FD90000000000000000000A100010000000000C1 :10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000000000000043 -:10FDC0000000000000000000000000000000000033 -:10FDD00000000000000411110921001100110003AE -:10FDE00009A100C000000000000000000003100294 -:10FDF0001020880300C0208385A120A000081003E4 -:10FE000041210920051041A090C180828009210272 -:10FE10002011800300000020200840080008000096 -:10FE200000000000000000000000000000000000D2 -:10FE300000000000000000000000000000000000C2 -:10FE400000000000000000000000000000000000B2 -:10FE500000000000000011001100050011020880E0 -:10FE6000098808000803000000000000000008A046 -:10FE7000892140002002402088800980402021857F -:10FE8000910002802121A18288202000904000085A -:10FE9000800880800000000041402100100009100F +:10FDB0000000010103000088900000C0A09000A096 +:10FDC000C02000C0000000020004A004840401C0A0 +:10FDD000001010A08083008211918988000000002B +:10FDE000000000000080000000000000000805097D +:10FDF000402100410004A010082040000000000045 +:10FE0000008000802090000888C0000800000500E5 +:10FE100041000000000000030341850311030000BE +:10FE200000000000000000000000000000000009C9 +:10FE300003212008201010000000000000800000B6 +:10FE40000000000000000000000000808080000032 +:10FE5000020000000080A10282041180091000004D +:10FE600000000000000000000000000000002180F1 +:10FE7000100020002002100004001000001180007B +:10FE8000008000800000412121102100A0400008D6 +:10FE900000000000000000000921210005001008FA :10FEA0000000000000000000000000000000000052 -:10FEB0000000000000000000000000000000000042 -:10FEC0000000000000000000000000000000000032 -:10FED000000000000000000000000100000001011F -:10FEE0000004204021040100000000100010000068 -:10FEF0000341828209820201900110204104A10085 -:10FF000091C0210889841001050304889002090129 -:10FF10009000044102028200000000000000010085 +:10FEB00080408000000000000008802100800005D4 +:10FEC0000000800000000000000000800000000032 +:10FED00090A1A11003009011C10120C00884C001AD +:10FEE00000000000000000000000000200400000D0 +:10FEF000011001000000010000A00000000000014E +:10FF0000080000A0821084001109400901000301CB +:10FF1000000000000000000000000091000001004F :10FF200000010000000000000000000000000000D0 -:10FF300000000000000000000000000000000000C1 -:10FF400000000000000000000000000000000000B1 -:10FF500000000000000000000000000000E00000C1 -:10FF60000012000000E00700000000000000000098 -:10FF70000000000000E0070000000000000000009A -:10FF80000000000000E00000840000000000070006 -:10FF90000000000000000700001200000000000048 +:10FF30000000040182040402040000A10410909057 +:10FF4000C00010004000A0000200000000080040B7 +:10FF500000001009A011108811000000000000002E +:10FF60000000000000000000000000000000070486 +:10FF700000000000000000000000000000E00000A1 +:10FF800000000000000000000000000000E007008A +:10FF90000082000000E0000000000000000000E01F :10FFA0000000000000000000000000000000000051 :10FFB0000000000000000000000000000000000041 -:10FFC0000000000000000000000000000000000031 -:10FFD0000000000000000000000000000000000021 -:10FFE00000000000F606F6065050AFAF000000001B -:10FFF000000000005A6A5A5AC3FFFFC3000400FF02 +:10FFC000070000000000000000000000000000002A +:10FFD00000004200000000E0070000009090404652 +:10FFE00003013F6700000000000000000000000067 +:10FFF000F3F3F3F300000000000000000000000035 :020000040011E9 -:100000003C1E3C3CFFF0FFE700000000BFFF8F0FED -:10001000F000F000107000006666666600000000E8 +:1000000000000000CCCCCCCC000004F481C3000084 +:1000100000000001000000000000000000000000DF :1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000000000000A0 -:10006000000000000000F606F606F0000FFF00009A -:100070000000000000005A5A5A5A003C3C000000A0 -:1000800000FFFF9FFFFFFFF0FF2400000000B0F023 -:1000900080000000F0F0F7F10000C0F000F0000078 +:10003000000000000000FFFFFFFE00000000D2B43F +:10004000D2B400000000FFFFFFFF01810DBD0000E2 +:1000500000009966F0F0000008FF00303C3C9090F2 +:100060004046030103010000000000000000000002 +:100070000000C3C3C3C30000000000000000000074 +:10008000000000000000FFFF00003CFC04F4000042 +:10009000000000C300C300000000000000000000DA :1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 +:1000B0000000000000000000FFFFFFFE0000000045 +:1000C000D2B4D2B40F0FF0F0F8FBF0F003C30FFF7F +:1000D000000000009966F0F0000089FF10103C3C21 :1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF @@ -69670,478 +69670,478 @@ :1001300000000000000000000000000000000000BF :1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F -:1001600000000000000000000000187E187E0898C3 -:100170006EFE0000000000FF00FF17331733D02F82 -:1001800010EF000000000006999F663C003CC3C3CE -:1001900002FB10D31CDF0F0F0F2424E73CFF2420A9 -:1001A000FFFB000000000000000000000000000055 +:100160000000990066660000FF66000000000000C5 +:100170000000000000006F6FFFFF000000000000A3 +:10018000000000000000000000000CFC0CFCC1C1DD +:10019000F900000000000F080F0800000000000038 +:1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E00000000000000000000000000000F609FF11 -:1001F0000808FEFE0000000060606F6F17331733C1 -:10020000DB2418E700000000006699FF663C003C14 -:10021000000000F900C33CFF0F0F0F662CEF3CFFFE -:100220000020DBFB000000000000000000000000D8 +:1001C0003C3C00FFFFC3F0C060004000FFFFFFFFAA +:1001D0000000000000000004F6996690C3C3FF0011 +:1001E00000070003F0000F0F0000FF670000000091 +:1001F00000000000000000000F0F9F9F00000000A3 +:100200000000000000000000000000000CFC0CFCDE +:1002100000000000000000000F080F0800000000B0 +:1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:1002600000000000000000610001000900000061C2 -:1002700000090019000000000000000000000061FB -:100280000E0A001D000080610006000D00000061E4 -:1002900030040009000000610E06009D00000061AE -:1002A0000006000D0000000000610006000D0000C7 +:1002400000000F0F6666FFC3FFC36060404000FC04 +:10025000FFFF0000000000000004F9909669CBC287 +:10026000FF000007000FA0615006000D0001000014 +:10027000000000000000000000000000000000611D +:100280000006000D000000610007000D0000800066 +:1002900000000090000085410A0F050D00A00061DC +:1002A0000003000D000000000061000700090000CD :1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E00000000000000000007D285F0A0000FFFF02 -:1002F000FFEFFFC3BCBCBCBF00000000000000005B -:10030000D0F0D0F0F0F030F30087000000FF0000E4 -:10031000F000F808F0F0FCC00D0F0C0CEF2F0407F4 -:1003200000000000BCFDBCFC000014551455AAAF31 +:1002C00000610006000D000185610A0E059D00A079 +:1002D00000003000001000000000000000000000DE +:1002E0000061000F000500000000000051005000F8 +:1002F00000000000000000000000000000000000FE +:10030000D7070007FFFFFEFE0050005F515051501D +:1003100000000000000000003C00D4F000000000DD +:100320000000000000000000000040000000F8F0A5 :1003300000000000000000000000000000000000BD -:1003400000000000000000000000000000000000AD +:10034000000000000000FFFFFFFF000000000000B1 :10035000000000000000000000000000000000009D -:10036000000000000000000000007D28FF00303A7F -:10037000353FFFEFFFC3A0A0A0AF000000000000CA -:1003800000000000D7FFF0F030F3AA87000000FF64 -:10039000E8E8FF0FFD0DF0F0F4E00F0F0F0FDF1F87 -:1003A000080B0000000000410040000010551455EB -:1003B000ABAF0000000000000000000000000000E3 -:1003C000000000000000000000000000000000002D +:100360000000E0EBF0FF0000000083DF80DC100005 +:10037000500000000000000000000000000000002D +:100380000000D7D7D7D7FF3CFEBE00F000FF51508A +:10039000515000000000000000000000F0F0CFFF0E +:1003A000000000000000000000000000410000000C +:1003B000F0F000000000000000000000000000005D +:1003C0000000000000000000FFF4FFFE000000003D :1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000FF350035A4 -:1003F000ACACACAC0300FF003C55000000000000BA -:1004000000000000FFFB0501A2FFF7FFC3C31E1E93 -:1004100005AF050500BE003C0FAA0FAA0000FFFFB4 -:10042000602040004B4B0FC3000000000000FF0F96 -:10043000FF0F03410000000000000000000000006A -:1004400000000000000000000000000000000000AC -:10045000000000000000000000000000000000009C -:100460000000000000000000000000000000FFF598 -:100470000005ACACACACFFFFFFFF0C553C3C0000F2 -:10048000000000000000FAFB00010200570000FF1E -:100490005F0A05AF0505003C003C0FAA0FFF0000F6 -:1004A000DFD7604020004B4B0F0F00000000000022 -:1004B000FB0BF10103410000000000000000000000 -:1004C000000000000000000000000000000000002C -:1004D000000000000000000000000000000000001C -:1004E000000000000000000000000000000000000C -:1004F000020084000584200420000300A0002000E6 -:100500008200400084000204040000008800000013 -:10051000200001000080048001200000000004048D -:10052000000000400000000000000000000000008B -:100530000001000000020002000888000000000026 -:100540008800000000000000000000000000000023 -:100550000000000000000000000020000000C000BB -:10056000000000000000000000000000000000008B -:10057000000010000000081021000940C000000029 -:100580004100000009040000C08241022000050073 -:10059000000000004000002040200201040000C0D4 -:1005A0000001008400000000000041004100000044 -:1005B0000000000000000001000100010000000038 -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B -:1005F0000000000004000800088001000200400024 -:10060000001085008280020482050200040240007E -:10061000004002000000040040400280048000000E -:10062000000020008540032003000220401000103D -:1006300000000010000000000000040000000000A6 -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A -:10066000000000000000000000000000000000008A -:100670000000000000001100800480104000008491 -:1006800000004009401000400584058405842001D5 -:100690008200034109900004000020010020802016 -:1006A0000000098200001085040108000001C0015B -:1006B0000001000000010000000000000000000038 -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F000000000000000000000109021000500092B -:1007000088050041C00088000000C0100005C0102E -:1007100000408200400082002000010984208840BF -:100720002000C004C00000001000400000A14009EB -:100730000000000000000103000000020011000999 -:100740000010000000000000000000000000000099 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:10077000000000000000000000000808080003005E -:10078000210040000300400040900090002009003C -:1007900041000300408202200800020040000501E1 -:1007A000050090000800080008020000800000100A -:1007B0008088080421000890088800000001008853 -:1007C0000000000100000000000000000000000028 -:1007D0000000000000000000000000000000000019 -:1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000082028402EF -:100800009005C010040202098202A004A010848096 -:100810004041084100004002041090418204004120 -:10082000104008410880C0001000000008000000CF -:100830000800C100840020020000900900000000B0 -:100840000000000000820000000000000000000026 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000C00000000000200000000000200078 -:100880001000210010210509094010000288080904 -:100890000040008480002002800020884100410048 -:1008A0001000000041900004000021001000020030 -:1008B000040080400400000000040000000000006C -:1008C00000000000000000410300030000000000E1 -:1008D00040000000000000000000000000000000D8 -:1008E00000000000000000000800000005001000EB -:1008F00000000000000000000000000400000000F4 -:10090000A01000038200400588A00400C0008203FC -:100910001000000010418200820008800800C080A2 -:100920000003040040004000400082200004042036 -:1009300008000800A0800800820083000000A000DA -:100940000000000000000010008000000000000017 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:10097000080000000000000000000000000000006F -:10098000000003C000000002200803020804110454 -:100990000002030000000000000021881010000089 -:1009A0000040110008000504030021040002089023 -:1009B0000003000021000802030010204020212035 -:1009C0001000000003880000410108400000000002 -:1009D000000008000000000000000000000000000F -:1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A00000000000001400040081088214000000064 -:100A100000401041084021000441840010400800BB -:100A200010200400C000C0008200840004001000F8 -:100A300082090000C000A000400084000420402083 -:100A40000000000900000000000000000009000094 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A8000000000000000080000C00000020011008B -:100A90000802000000C040880890034008040000DD -:100AA0000004109000000000200020000000000062 -:100AB00000000000000004000000000000840000AE -:100AC000000000001100000008000000000000000D -:100AD0000000000000000000000000000500000011 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000041000000B5 -:100B0000000000000000000090880010208800080D -:100B100009900000A00200A02008008200880004C4 -:100B200000A100020041000004A040830888C0101A -:100B3000A040A1210211C0050503080041A08300C7 -:100B4000008482C100A1088200004005A10020C1EC -:100B50008200000000000000000000000000000013 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B800000000000000000000000050021000080BF -:100B900000001020080000A00020008000800080DD -:100BA0000080408400000090000080830390800259 -:100BB000008200A020218508808282108502829018 -:100BC000C00300880008009000890000859083051C -:100BD00000100040000000000000000000000000C5 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C00000000000000000000000000000000804123 -:100C1000802100008080002100900021801080034E -:100C2000808080000000000300800000410003413C -:100C3000088290821080844184039041020021A1A7 -:100C40008580C18800800005800080000000008051 -:100C5000882008C003A00000000000000000000081 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90001000A0010800A040A000848484900801F6 -:100CA0008200A0A004040090000000040000208244 -:100CB000C001900982A1C1C00500A090820104205A -:100CC0009109A1A083A0C0020800A04082000000FA -:100CD0008202408283408388000000000000000000 -:100CE0000000000000000000000000000000000004 +:1003E00000000000E0EBF0FF00000000303F303F75 +:1003F000F0D000000000000000000000000000003D +:100400000000000000F0A3A3F000535300FA00FA2C +:10041000AFAAAFAE000000000000000000F000F046 +:10042000CB8A0A0AFFFFFFFF000000000000040063 +:100430000000D3D3D3D30000000000000000000070 +:10044000000000000000F7F4373400000000000056 +:100450000000287DFAFA0000000000000000000003 +:10046000000000000000535C535C8000F000303F4F +:100470000000F0D0000000000000000000000000BC +:100480000000000000000FFFA3A3FF0F5353FAFA70 +:10049000FAFA0F000F0C000000000000000000F04E +:1004A0000000C3820000AAAAA0A000000000000073 +:1004B0000000000000D300D3000000000000000096 +:1004C0000000000000000000C7C407040000000096 +:1004D00000000000287D50500000000000000000D7 +:1004E0000000000000000000535C535CFFFFFFFFB2 +:1004F00000000400840004008400C000880088001C +:10050000A0008800410001020002898000008200F2 +:10051000C04040004000000040004000200000209B +:100520008800080304004002840020008400880042 +:10053000000382000400100004000403020089008C +:100540001000880020008203C003204088050208B4 +:10055000000984002000C005200440000200822021 +:10056000400304050400880820034002C000840002 +:10057000020200000000000200000000050400006C +:10058000000840000000400240850040084000C0D4 +:100590001002400100000000100000000002008472 +:1005A0000000000080000082000000000000000049 +:1005B00000020000400000A0100000022002000025 +:1005C0000804000041004100000004020001400056 +:1005D00000001000100040C0008200008900409020 +:1005E0000400200220004000000200002100000062 +:1005F000004011090000000004004010004100000C +:100600008400000000000020000484200400022078 +:1006100002100010021008000090080908400204AF +:100620004009024102000000004000000090030069 +:100630000400000000004000000010000003000063 +:1006400000410840040502410000080000090100C3 +:10065000000010090280A0210000880000090000AD +:100660000400020900090300034002081000000012 +:1006700002419020000000100000200880090000C6 +:10068000008400A0051000000041000004830282E5 +:100690000409910500010084850002100008850806 +:1006A000050802000904009020080084028400402C +:1006B0000808021004000000800800088008028476 +:1006C0000240008400828208000000080000000848 +:1006D0000284000820100010090804080088028421 +:1006E000001000400008000808840208050040C00F +:1006F0000900040800080084000000000000004019 +:100700000002000000000021002100000000002184 +:10071000A00800020808040301038841000000A0AB +:10072000000200001000000200050005080000089B +:1007300002410010080804000000840000000021AD +:10074000000800400008840304000000002110217C +:100750000040840300050040000800002020041031 +:100760000400400800400021004000080000820210 +:1007700000214040402090210000000000000000C7 +:1007800000200408080800A0000008000000000085 +:1007900003904100020080008000020400880000F5 +:1007A0000310201021C000101100000040888000BC +:1007B000008280A04100808841000000000000907D +:1007C0000400000000002100000880A000000020BC +:1007D00041A0040108001120009008002100000041 +:1007E0000300009000A000A00000000041A04120F4 +:1007F000418800900000080008000008000008413F +:10080000A002084008008800000084000441404025 +:1008100000001004094108100841080082830011FB +:1008200008000800008808090091080490000020D2 +:100830008280000901000000100008040000080088 +:100840000800080000020000A000020900002000CB +:10085000A00008000000C04008914004C01104112D +:1008600020111009A0020809000008110040100022 +:1008700008000410840308090400400084040008F0 +:10088000800000820010850003000000000080103E +:10089000A108000041200810008200000400004070 +:1008A000050080000004002003881140201000048F +:1008B0000400081000000200030000000284000091 +:1008C000000000000000000000820800000040005E +:1008D00008000300000008000084111003A10000BC +:1008E00000000084000004000000099040020000A5 +:1008F000400000000091030000A010001000001054 +:1009000000000000000000021000001008020000BB +:100910000008C0000008008800000041008300417A +:10092000000500050808100008000000C0210005AF +:10093000080000004000000000000100002100004D +:1009400000000000000000000040A000840008003B +:1009500082000400C040820000400000C00000008F +:10096000000000210000000000204000080282007A +:10097000820000004000001108000800400504103B +:10098000104104A0040000820001000000000000EB +:1009900011000008001000000020040009000040C1 +:1009A00020880000030000000088000041A0002013 +:1009B000000804904004049003880000020000A096 +:1009C0000008000003021000000000020000000008 +:1009D0000000000000000000000000000000001007 +:1009E00008080000000040020810020800400090C3 +:1009F00000000800008200000000000041828840E2 +:100A000000000488000000000000012100214000D7 +:100A10000000000088000000040000804004000086 +:100A2000000800040008080800050000002100106C +:100A30000008001000000000000000040008002171 +:100A4000000000000000080010000000001000007E +:100A500004008400820082088400000000008400FA +:100A600000000004102100090004000300400400FD +:100A70008208000000008200A0000000000040008A +:100A8000080082200000000000000000400020005C +:100A900000000000000040000800808200022000EA +:100AA00000001110000020C00000080002402010CB +:100AB00000000088090104104188001000000000B7 +:100AC0000000000000000000200000000000000006 +:100AD0000008008800900000000020002000002096 +:100AE0000000000000C0000008880310030011008F +:100AF00011100088009000C01100020008000020C2 +:100B0000030000880200000000A0000420A00210E2 +:100B100000000000000000000000010004000000D0 +:100B2000080800080004002091049010008840820A +:100B300000000000000000009088008800000220F3 +:100B40008290008400A0000200000001000000016B +:100B50000001C000000000008800A00200020008A0 +:100B60008804400301054088880800000000000058 +:100B7000000000010000000000001004004000849C +:100B80008410000001008201000000800500008048 +:100B9000000000000000000000000000080000004D +:100BA00000000880008000800000098000000080B4 +:100BB0000080400000000000000000000000000075 +:100BC0008000000000000080008000000041000460 +:100BD0000010000480000000000000002080008061 +:100BE0000080008084A041A180C0000400000000BB +:100BF000000000000008001000200040808000007D +:100C00000000008000110310000800208000004058 +:100C1000800400000000001100000000118010801E +:100C20000902092100000084808900008000002161 +:100C30000000000080008000000080000000000034 +:100C40000000000080008000800000000000000024 +:100C50000000000000008000000080000000000094 +:100C60000021008000000000A002919021040000FB +:100C700000000000000000000000000000008000F4 +:100C8000804100A180000280050002002020400079 +:100C9000C001A00888000000000000C00000004063 +:100CA000000400000183080004400841000088009F +:100CB000C0000204880010000200001008000000BC +:100CC00000000000000088001000A0008400000068 +:100CD000000000000000000008000200A0009000DA +:100CE0000000002000A0000020841001A1A001014C :100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D1000004100000000824040000189820010C0B4 -:100D2000C040000202000000A00000000100080016 -:100D3000884100A020090211C08201A1A1C085C183 -:100D4000C0090004834111C00802000200A08220F3 -:100D50000000828201210883C18900000000000098 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D9000000000020011000580108003108341054F -:100DA0008403800000808000000000000400020036 -:100DB000000000902083002180C080412010850821 -:100DC000088800A00320102041A0008000800300BC -:100DD000800000000000108800080990000000005A -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 -:100E1000000000008004800800800000210990800C -:100E2000C08010000000808000000000A10085202C -:100E300003008800A10005C00380050003808482B0 -:100E4000400040412104A041A0000202A100C020B6 -:100E500000008000000041A141A0038020030000A9 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E9000000000000000100120890208C0000100CD -:100EA00003A009028200840040C004840000C10045 -:100EB000020089000500C1A088A00804C000A0C0ED -:100EC000A0A184208801C185828240041100050010 -:100ED000A02004820400000009A1A0200884890148 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F2000000000000000000000000000000042007F -:100F3000000000000000000000000000070060004A -:100F4000000000E007005006000000E0070000413C +:100D0000100040000809020000040000010000106B +:100D10000402008400820482000000000000000041 +:100D2000000000014000010040020000904040022D +:100D3000081000C0000008C0000000000000000013 +:100D4000202000100040102088900000000284C085 +:100D50000000000000000000000000A00090000261 +:100D6000001040200010000490200489018901082F +:100D700003C00000000000000000000000000000B0 +:100D8000000004C00084028220A0000100001001C5 +:100D9000000000400021004000400800000000006A +:100DA00000000902000300080409800000008080A0 +:100DB000000080800000000082800400000000002D +:100DC0000000000000000080000000000000008023 +:100DD0000080000000000200400000000000000051 +:100DE000000000000000000000800000802140049E +:100DF0000590A08900000000000000000000000035 +:100E0000410000000000000080800000002103037A +:100E1000002100038002000000008000800000111B +:100E200000000000419110044100401180040020A6 +:100E3000000000000004800080800000001180405D +:100E4000000000000008000000000000000000108A +:100E50000080000000000000000000000000000012 +:100E6000000500000000800000008000800090204D +:100E70000980410040000000000000000000000464 +:100E80000000000000008000002100800000100031 +:100E900041200400100308018208C0C01000900027 +:100EA0008800880008000110010100000000C00057 +:100EB000880004881000C000200484400400100151 +:100EC00020021004100000010000000000000000DB +:100ED000008400820000000000000000000000000C +:100EE00000000088000800000200900002000800D6 +:100EF0000401201020880000000000000000000015 +:100F0000000100000000000040009091900888005F +:100F10000188000000000001000000000000000047 +:100F200000000000070000000000000007000000B3 +:100F300000000000070000000000000000000000AA +:100F40000041000007000000000000000000000059 :100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 +:100F6000000000000000070050000000000000002A +:100F70000000000000E00000500000000000000041 :100F80000000000000000000000000000000000061 -:100F900000000000000000000000FF0F0303828239 -:100FA000BEBE30303030F5F5A0A005FF050FB2B25F -:100FB000B2B25050F30300000000FDFD0080C0E815 -:100FC000C0E830F3B2B23A3A0CFCBCBC4343F00088 -:100FD0000C0C687CEAFE00FF000000005100515537 -:100FE000005D0000000000000000000000000000A4 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:10101000000000000000000000000000FF0FF3F3DC -:101020008282BEBE0AFA0AFAF5F5A0A0F5FFF50F16 -:10103000B2B2B2B25F5FF30300000000FDFD00A09A -:10104000C0C0FCFC00C3828200000CFCBCBE43415B -:1010500070700C0C7C7CFEFE0F0F0C0C000010005E -:101060001055A2FFA2A20000000000000000000036 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:1010900000000000000000000000000000000587C4 -:1010A000AF87AF0FA505EBEB5050C5C553530F0FDE -:1010B0000F0FBFB5BAB005F505F500000000000040 -:1010C000FF0D553F3F3FAAAAAAA24D410C00A0A088 -:1010D000AAAAC396C696CF0C3F03FFACFFA300009D -:1010E00055555555000004040000000000000000A4 -:1010F00000000000000000000000000000000000F0 +:100F900000000000000000000000F000FC00F0FF76 +:100FA000F0003020302C00000000000000000000A5 +:100FB00000001010005500005514008755005555CD +:100FC0001717005F00410000000000000000000053 +:100FD00000000000000000280014000000000000D5 +:100FE00000000000000000000414000000000A0AD5 +:100FF0000000C00000005500AFAFCFC000000000EF +:1010000000000000000000000000000000FF008061 +:10101000001410140000000000000000F500F500AE +:10102000F0FFC0000020002C0000000000000000C5 +:10103000000000005050555500005514AA87550077 +:1010400017171717005F00410000000000000000A4 +:1010500000000080000000000028001400000000D4 +:1010600000000000000000000000FFFF0000000082 +:101070000A0EAA00C0000F0F5500A0A0CFC00000AC +:10108000000000000000000000000000000000FF61 +:10109000009F04140014000000000000000055D759 +:1010A000FFD7CFFF0030000000000000000000006C +:1010B00000000000000020613475FFFCFFFC000010 +:1010C000A0001FBF000000000000555515150000CE +:1010D000000000000000D000F0000000BFBE0000D3 +:1010E0000000000000000000000000003C003C0088 +:1010F0003CA03CA000000000FF000FC3C808C808C7 :1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:101120000587AF87AA0AA000EBEBFAFAC355C355AF -:10113000C300C3FF1F151A10F0F0000000000000EC -:101140000000FF0F553C3C3CAAAAAAAA4D41CFC3C0 -:101150005F5F55559696C6965F0A5F0A53005C001E -:10116000000000000F0FFB00FF0400000000000063 -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000080610006000D000000610006000DD7 -:1011B00000018000400000100001A0614006000D09 -:1011C0000000A061000E000D00000061000B0099FE -:1011D000000000600E0F009D000000610006000D81 -:1011E0000000000000613006000D0000000000005B -:1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE -:1012200000000000000000000CFC0CFC15055555EA -:101230003C3CAAAA0000000000000000BD36630983 -:1012400000000000C3AFC3AF82D7F0F00000000081 -:101250003C3C0A0A00C00AC03C3C303C00AAFFAA41 -:10126000000000000000FFAAE1E1F5A5550500001F +:10111000FFFF00000515555500000000000000000D +:10112000000AFF0A2FEF23E3000000000000000088 +:101130000000000000000000A2E3B6F73C3C3C3C8D +:101140002000A000B5B50000000000000000101055 +:101150004100000000000000F000F0000000AFAA15 +:1011600000000000000000000000000000003E023F +:10117000FFC3000000FF0000000000000F55F8381A +:10118000F83800000000000000000000000000002F +:101190000000FFB7000015055555000000000000D5 +:1011A000000000610006000D0000050000080000BE +:1011B000000005610A0E050D00A0A0000A0800004D +:1011C0000001800000000090000085000038000051 +:1011D000000000000000000000000000000000907F +:1011E0000001000000610006000D00000000000882 +:1011F00000000000000030000000000080610006D8 +:1012000000950000000000000000000000610006E2 +:10121000000D000000000000000000010061000659 +:10122000000D000000000000F0F0F0F000000000F1 +:10123000000000005500BEBE7DFD41010000000021 +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E -:1012A00000000000000000000000A0A0AFAF550546 -:1012B0005555F0F000FF0000000000000000BD36B2 -:1012C000630900000000FFFF0F0F00550000F5A0AC -:1012D000D78200FF0A0AF0C0FAC03C3C383800AAA6 -:1012E000FFAA0000000000005500E1E1F0A050005E +:101280000000FF00FF000000000000000000000060 +:101290000000000000000000000000000000C3008B +:1012A000C3FF2D2D7D7D00000000F0FCFAFE000044 +:1012B0000000000000000500BEBE7D7D4141000031 +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD +:1013000000400000FB00FF000000000000000000A3 :1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:1013300080808282000000000000000000000000A9 -:1013400050505F5F00000000F0F028EB0F0CFFFC36 -:1013500014B40000FFAA55005F4B1E0AFFFFC3C371 -:101360003CFCCF33000000000000DF8A5D0800FA7B -:1013700055FA00000000000000000000000000001E -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D -:1013B0000000BCBCBEBE0000000000000000000039 -:1013C00000005F5F505000000000F0F028EB000CC0 -:1013D000F0FC14B414B42D2D2D2D00000000000FCE -:1013E00055533C33030C000000000000DF8A5D0809 -:1013F00000505550000000000000000000000000F8 -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:101420000000000000000000000000004000040375 -:1014300020050000C0002000000000004000000067 -:101440008800000000000000C008008800000400C0 -:1014500082000004200088418800882000000000ED -:101460000000000000000000000000040003000075 -:10147000020088000004000020002000000000009E -:101480000000880000000000000000000082000052 -:10149000020000000000000020002000000000000A -:1014A0000000200000008800000000000082000012 -:1014B00000040000090410020004040002000000FF -:1014C000400000042000050000002001400500004D -:1014D00000004100030000002000000000000000A8 -:1014E00000000000000009000000000000030000F0 -:1014F00000000002000000000000000000000000EA -:1015000000020000000200000000000000000004D3 -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000004B7 -:101530008200000000000000000000100000000019 -:10154000820000038200040000000000020004008A -:101550000000000000000410000000000000000077 -:1015600000000002000000008400000000000000F5 -:101570000000000000000002000000000000000069 -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000009080000000011C00400000003043E -:1015C0000400000000000000000200000000000015 -:1015D00000020088000000000500000000000088F4 -:1015E00000100000000000000000000000000000EB -:1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000004D6 -:1016100000000000000000000000000000000000CA -:10162000000000000090000000000000000000002A -:1016300000000000042100058402C005004188402C -:10164000A010400304410000004184000000840019 -:10165000080090808400820084008420840084003C -:101660008800840002000000A00000008800400004 -:101670000420C0000000002184000800A000000039 -:101680000000000000000008000000000000000052 -:101690000000000000000021000000000000000029 -:1016A0000000000000000004000000000000000036 -:1016B000000000000000030000C04184410210044B -:1016C00041000004050810000002100000A04000C6 -:1016D0001000400011020800050000000288090007 -:1016E000410021A0410009004120202040200000AD -:1016F0004108030003C000000000000000000000DB -:1017000000000000080000000000000000000000D1 -:1017100000000000000000000000000008000000C1 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000403004182090020B6 -:1017400008090041000200400009C00040000002FA -:1017500082200809A0000841000008040805C00014 -:1017600082020000C0000400000000008202820922 -:10177000000000009000000000000000080082004F -:101780008209000000000000000000000000C0000E -:10179000000040000000000000000000080082007F -:1017A0000000820000000000000000000000820035 -:1017B00040000000000000000000000210000000D7 -:1017C00011004000410010C01084400000040000DF -:1017D00000A01000000000200000402010000002C7 -:1017E00000000000100200000000020000000000E5 -:1017F00000000000000000000000000000000000E9 -:101800000020000000000000000000002100000097 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:10183000000000000000000000000000000388001D -:101840001000A00082000000900008088402000040 -:1018500000050000080000000000000084000000F7 -:101860008400A0000000820082008200A00000002E -:101870000800000000000000000000000000000060 -:1018800000000000000000000800820008000000C6 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000080000000000000030 -:1018B000000000000000000000000000000000C068 -:1018C000000400040800410009000804100004009E -:1018D0000800000010000002059000004104020012 -:1018E0000902110440041084050021000420029024 -:1018F000400000001000002010000804000000005C -:101900000590044040040420000000000000000096 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:10194000A00084008421000400008203000800033A -:101950000800000008000209000000400004100018 -:10196000000000008400000008000800A020000023 -:10197000084000000000000000000000000084009B -:10198000000000000000000000000800040000004B -:101990000000000000000000000000000000000047 -:1019A000000000000000000000000000000008002F -:1019B00000000000000000000000820000000000A5 -:1019C000000000000000090200000090000008C0B4 -:1019D00010000400000010000000000000000000E3 -:1019E0000004100000880302210000020000000033 -:1019F0004000000000000000000021004000000046 -:101A00004000000000000400000000000000000092 -:101A10000000000021000000410000000000000064 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000010000000095 -:101A50000000018200010900000482C000000000B3 -:101A60000001000000000000000000000100000074 -:101A7000000000000000000000C0000000000000A6 -:101A80000000000000000000000000000000010055 -:101A90000000000000000000010000C00000000085 -:101AA0000000000000000000000000000000010035 -:101AB0000000000000000000000000C00000000066 -:101AC0000000000000000000000000000002000014 -:101AD0000000002004000040A00000008000000082 -:101AE0000000004100000000000000000000410074 -:101AF000000000000000000304000080000000005F -:101B000000000000000000000000000000000000D5 -:101B100041000000000000000003020000800000FF -:101B200000000000000000000000000000000000B5 -:101B300041000000000000000003040000800000DD -:101B40000000000000000000000040000000000055 -:101B50000000020000002000C000828000404080A1 -:101B600080000000000080400000030000000080B2 -:101B70000000800000000000900040800000000095 -:101B80000000000000000041000000000300000011 -:101B90000080000080000000000082000380000040 -:101BA00000000000000000000041000003000000F1 -:101BB0000080000080000000000002002000000003 -:101BC00000000000000000000041000000000000D4 -:101BD000000000000100000001004000830400013B -:101BE0000102040000000000C0010000010000002C -:101BF00000C000002000000000000500410400407B -:101C00008200400000000000000100000000010010 -:101C1000000000C00000200000000000050040049B -:101C200000402000820000000000000100000100D0 -:101C3000000000C0000020000000000021004188DA -:101C4000008282004000000000000001000000004F +:10132000F0AAF0AAA0AFF0FF00000000000000004B +:10133000000000000000000000000000000000FFAE +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000001414F5A00000C0 +:10137000000000000000000000000000000000006D +:10138000000000000000F0F000FF0000000000007E +:10139000000030003C0C00000000000000000000D5 +:1013A000000038BA79FB00C3550F000000000000B0 +:1013B0000000000000000000000000000000002B02 +:1013C000002B0000000000000000000000000000F2 +:1013D000000000000000000000000000000000000D +:1013E000000000000000000000000000BEBEF5A0EC +:1013F00000000000000000000000000000000000ED +:101400000000000080000000F0F000FF000000007D +:10141000000000003C3C3C3C0000000000000000DC +:101420000000000038BA79FBFFC3550F2000000010 +:1014300020008202880020002004A000200020005C +:1014400000002000880084102008040820000440C8 +:101450002000840888004000200088002000200030 +:1014600000002005200084002008880800032005D3 +:10147000200002002005880088002000880020004D +:101480002000C00820002000840020828408200260 +:1014900020080000200020002000201084102004DC +:1014A00020030000040004002005209002800002B8 +:1014B00000020002200000000000418200041082AF +:1014C000000000900000200004000009400041845A +:1014D0000000000400004000000040004004400004 +:1014E00000000000000000000000210100020000D8 +:1014F0004000050004000500004000040800000052 +:101500004000000200040000000010000008000974 +:101510000040000240004002000040000040000483 +:10152000104000C000002102000010022108090440 +:1015300000032041001000000000820000000000B5 +:1015400000009000080800100000000000100000DB +:1015500000008200000090008210821000108200C3 +:101560008841041004210004004102050000000528 +:10157000000000000000000000210000000000004A +:101580000800020000000010021082000000881015 +:10159000828400008800200000000000001000404D +:1015A00000008800880088219000840000000080EE +:1015B000A0800008000440840384000800880082A2 +:1015C000000000840008008400840010000800046B +:1015D0000004001000080000000200080084000859 +:1015E00000000484000800A0048800000402000831 +:1015F000000400000088000800080010000800082F +:10160000001000001008008800880408000020086E +:101610000008030400840084000200000410040297 +:1016200000840008000800840410008840080008B6 +:1016300040040002000000050000900500210008A1 +:1016400000080000004100210009000300054000DF +:10165000000010A188410041880500050000040831 +:1016600000400005000384002000900800000408EA +:101670000000401100000008000000009040000041 +:1016800000050421104000210000000000050000BA +:10169000000000A1089004100041884102400000B1 +:1016A00000050008000010210420902100084004DB +:1016B000900002A10480090010000000100000004A +:1016C000000000100000000800000882080040C070 +:1016D00003000000800400080010000800A003C000 +:1016E0000000000003820008001000080010040041 +:1016F00000880020808200000000034004000000F9 +:10170000084008000000080809824100210811A0D3 +:10171000000000C0040400200008008211A00000A6 +:1017200000A000400020030000C021400800088401 +:101730000200030000200020000082008200000060 +:1017400008412010A00008009000820082000008DC +:101750001020080082000800820082008209000038 +:101760000041820000400809000010000000000055 +:101770000400820040000804000000002000000077 +:1017800000000000C0002000000090008200200047 +:1017900000004000A000200008118200880082099B +:1017A0000009821182110004C004840000020010AC +:1017B000C00900101009040008000000000000002B +:1017C0000000008400000000000009040000080080 +:1017D000210000000010000011C000020000000005 +:1017E00021000000009020C0000000100000000850 +:1017F00000100000000000A0000000000000000039 +:10180000000040000000000005000000200000086B +:101810000000080000000000000000000000400080 +:10182000408402000040000404C00420040041047D +:1018300020000500210005000082050000210008AD +:10184000C000000800000000A00308000005001010 +:101850000008A00000000021002105000000000099 +:10186000C010A0100000080082000000C0000004AA +:1018700000200000000000050000008400000000BF +:101880000000082000000000000010000000000020 +:1018900000000003000000008210010000021000A0 +:1018A0000010A000000008080000820000000000F6 +:1018B000C000000020000000000000000100000047 +:1018C0000000000000100000000000040002000002 +:1018D00009000090000040200000008440840504BE +:1018E000000000020804000000000000002020208A +:1018F000009004040800000000A00000030900009C +:1019000000000900000000001190000040080000E5 +:101910000090400021000000000800020402008541 +:1019200000000000000000000000040800000200A9 +:10193000009040000500000203A00084000808A0F9 +:1019400000000021900000038200C0040000042079 +:1019500000110021002184210010000000008203FA +:1019600000112000904100100800C000C040000499 +:1019700000000000000084020000000000000000E1 +:1019800000000000000502009000000000408200FE +:101990000000000040100021000000000021820330 +:1019A000881000000000080090210200840002045A +:1019B0000800200000040002A00008001000000041 +:1019C000900800000000200000000000000000005F +:1019D0000000000000040000000000821100000070 +:1019E000090000001190200000100000000000001D +:1019F00000000000000000000000000008000000DF +:101A00000200000000020000200000200000000092 +:101A100000000000000000000000000200000000C4 +:101A2000000000012040028809042000000000009E +:101A300009000008009000880000000040400000FD +:101A4000410420010000000000000001000000002F +:101A5000000000A0010100000002C008000000001A +:101A6000000100000000000000000001010004006F +:101A7000000001A000010000000410C000000000F0 +:101A80000001000000000000000000000000000055 +:101A90000000000001040001C0000010C08200002E +:101AA000C000000100000000000000000000000075 +:101AB0000000000001040001C1000004C082000019 +:101AC000C00000010000000000000000000800004D +:101AD0000000001111004110400000800080000053 +:101AE0000000004100000000000000000020040091 +:101AF00080000041030000104000008080000000D2 +:101B00000000004100000000000000000000001084 +:101B10000000000000094080000882000000808072 +:101B2000000080000003000000000000000000052D +:101B300000000000000940800020820000808080BA +:101B400000008000000300000000410000200000B1 +:101B500000000400000009002000850000000400CF +:101B60008000000000038020000020000000000032 +:101B7000000002000000040040008500000040005A +:101B800000000000000080030000000004000000CE +:101B90000000000010000000400010008400000061 +:101BA000030080000000008480200000400000004E +:101BB0000000000040000000400041004000000420 +:101BC0000300800000000080804000000000000052 +:101BD000000000000100000000000500028200007B +:101BE0000100400000000000C000000000000000F4 +:101BF000000000000100000001000200028200005D +:101C00000100900000000000C00000000000010082 +:101C1000000000000000000000000100A00008C05B +:101C2000000001004000000000C182000000000030 +:101C3000000000000000010000000100400084C01E +:101C4000000101000200000000C08201000000004D :101C500000000000000000000000100000820000F2 -:101C60000100010000000000000100000000000071 -:101C7000C0000000000000000000000000020000A2 -:101C80000000000000000000000000000000000054 -:101C90000000C00000000000000000000000000282 -:101CA0000000000000000000000000000000000034 -:101CB0000000C0000000000000000000000000085C -:101CC0000000040000000000000000000000000010 -:101CD00000000000000000000000004180090080BA -:101CE00000000500040000000000004100000000AA -:101CF0000000800000000000000000000000000064 -:101D000000000000000000000000000000000000D3 -:101D10000000000080000000000000000000000043 -:101D200000000000000000000000000000000000B3 -:101D30000000000080000000000000000000000023 -:101D40000000000080000000000000000000000013 -:101D50000040800000C10000000580030340000037 -:101D600000410000004100000000000000002005CC -:101D70000000800000C10000000000000000000022 -:101D800000C18000004000000000000000000000D2 -:101D900000000000800000C1000000000000000002 -:101DA0000000004180000040000000000000000032 -:101DB00000000000800000C10000000000000000E2 -:101DC000000000C10000000800000000000000004A -:101DD0000000000020000040000000000400C100DE -:101DE00000000005A000000100000000000000004D -:101DF00001C00000400000C1000000000000000021 -:101E000000000003020000000000000000000000CD -:101E1000000000000000400000C1000000000000C1 -:101E20000000000000A1020000000000000000000F -:101E3000000000000000400000C1000000000000A1 -:101E40000000000000414000000100000000000010 -:101E50000000000000000000000000000000000082 -:101E600000000000811200E00700480600000000AA -:101E70000000000000000000000000420000000020 -:101E800000004800810000E0000048000000000061 -:101E900000000042000000000000000000420000BE -:101EA000000000004800810000E000004800000041 -:101EB000000000000042000000000000004200009E -:101EC000000000004800810000E000004800000021 -:101ED00000000000004200000000000000000000C0 +:101C60000000000000000000000100000000000073 +:101C700000000000000000000000C00000A0000004 +:101C80000100000000000000000100000000000052 +:101C90000000000000000000000000011000001023 +:101CA00000008500000000000000000000000000AF +:101CB000000000000000000000000000A00100047F +:101CC0000000010000000000000000000000000013 +:101CD0000000000000000000000000418002000041 +:101CE0000000410000000000000000410000000072 +:101CF00000000000000000000000000500090000D6 +:101D0000000003000000000000000041000000008F +:101D1000000000000000000000000000000480023D +:101D20000000000041000000000000000041000031 +:101D3000000000000000000000000000004100045E +:101D40000080000041000000000000000041000091 +:101D500000000020008300000002801089000000C5 +:101D600000840000002000000000002000000305A7 +:101D70000020800000C1000000000004910000006D +:101D800000C100400020000000000020000003050A +:101D900000000000000400830000000000000500B7 +:101DA0000000004180000009000000410000000028 +:101DB00020030040800000C1000000030000050077 +:101DC0000000004100000020000000410000000071 +:101DD00020050000200000830000000008008200B1 +:101DE00000000004400000010000000000000000AE +:101DF000018200002000004000000000A0018200DD +:101E0000000000054001000100000000000000008B +:101E10000120000000008401008300000000C000D9 +:101E20001000000000A140000000000000010000C0 +:101E3000000000A000002000004000000000C000E2 +:101E40008400000000A1400000010000000100002B +:101E500000000182000000000000000000000000FF +:101E600000000000881200E00700480000000000A9 +:101E70000000000000000000000000000000000062 +:101E800000000000811200E0070048000000000090 +:101E90000000000000000000000000000000000042 +:101EA000000000000000811200E00700484200002E +:101EB0000000000048420000000000000000000098 +:101EC000000000000000811200E00700484200000E +:101ED0000000000048420000000000000000000078 :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 :101F000000000000000000000000000000000000D1 @@ -70157,210 +70157,210 @@ :101FA0000000000000000000000000000000000031 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 -:101FD00000000000000000000000757B0000000011 +:101FD00000000000000000000000257B0000000061 :101FE00000000000000000000000000000000000F1 -:101FF0000000000000000000DEAE747B0000000066 +:101FF0000000000000000000DEA4257B00000000BF :1020000000000000000000000000000000000000D0 -:102010000000000000000000DE2E0000747B0000C5 +:102010000000000000000000DEA40000257B00009E :1020200000000000000000000000000000000000B0 -:1020300000000000000000000000DE2E747B0000A5 +:1020300000000000000000000000DEA4257B00007E :102040000000000000000000000000000000000090 -:1020500000000000000000000000DE2E61260340AA +:1020500000000000000000000000DEA46126034034 :102060000000000000000230A0000000000000009E -:102070000C4000000000000002C06486615603406E -:102080000000000000000231E0000000000000003D -:102090000C4000000000000002C06A86000061568B -:1020A00003400000000000000231E00000000000DA -:1020B00000000C4000000000000002C06A8661566B -:1020C00003400000000000000231E00000000000BA -:1020D00000000C4000000000000002C06A86C00042 -:1020E0008800000004040280880000040800C0008A -:1020F000C0058204210400000200400002000180AB -:1021000000A000002008000400840000002000045B -:10211000000000000004000000000000200000019A -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:102140000000000000000000880000000000000007 -:10215000000000000000000000000000000000007F -:102160002100040005004000C0402102400080081A -:10217000000010000500080021004120C1000200FD -:102180004008000340400001040100050000400039 -:1021900000000000004000000000002000000000DF -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C00020000000000000000000000000000000EF -:1021D00000000000000000000000000000000000FF -:1021E0000000000088000000000008400200C180DC -:1021F000024004008800904088410002000008402E -:10220000050805820500058001808980040001041D -:102210000080000000000000400000020202008078 -:102220008200000004000000000000000000000028 -:10223000000000000000000000000000000000009E -:10224000000020000000000000000000000000006E -:10225000000000000000000000000000000000007E -:10226000000000000008090800040008000104083C -:102270000802000505C00008001005001001000458 -:1022800080001001902104408420042002404182FB -:1022900008010004000000020200800009A1000102 -:1022A000000809000000000000000000000000001D -:1022B000000000000000000000000000000000001E -:1022C000020000000000000000000000000000000C -:1022D00000000000000000000000000000000000FE -:1022E000000000000000A0000003000088418421DD -:1022F0008200400040800000000001000000000556 -:102300008500400501004110011085008510400046 -:102310000810040002100000000000004000C0117E -:1023200082000000C00200000000900000000800D1 -:10233000000000000000000000000000000000009D -:10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D -:102360000000000000000000410000000300030026 -:1023700011000088009011040000210002000000FC -:102380000540408205000800080408001000040011 -:102390000000800400000000000000000000C000F9 -:1023A0000300218400000001000000000000000084 -:1023B000000000000000000003000000000000001A -:1023C000000000000000000000000000000000000D -:1023D00000000300000000000000000000000000FA -:1023E000000000000000000000000404A000041031 -:1023F000C01108200800C04008A0014000000800EB -:102400009010A00000000500090008400080012095 -:102410000111C10008000209A000820000000000B4 -:1024200000000000000000000800000000000000A4 -:102430000020000000000000000000000000000973 -:102440000000000940000000000000000000000043 -:10245000000000000000000000000000000000007C -:1024600000000000000000000000000000842002C6 -:1024700020C02082038411000088100440854000A1 -:10248000410402A1000821040800080440050020BE -:102490004020400008000090008805000000000275 -:1024A00004000000400010000020020000001100A5 -:1024B00000200000000000000000000000000000FC -:1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E0000000000000000000000000000000880064 -:1024F000001010410800A008000084108200820033 -:1025000000218211C00010410900824182800082B6 -:102510000803828004000820110000020010082037 -:1025200010000011C00400000800000000000000BE -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:1025600000000000000000009000000000000000DB -:1025700008000000000000000900000000900000BA -:102580000000000000000000000040000000000209 -:10259000112100000010800000000200000008016E -:1025A000030000000000080000000000000003001D -:1025B0000000030000000000000000000000000018 -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000009000000088000000000000D3 -:1025F00000000240C0000008A000A1908204080072 -:102600008800084008091000100408112000C008C4 -:10261000080001C0080004A004050110008210A0F9 -:102620000121080010000000000000000000000070 -:10263000000000000000002000000000000000007A -:10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:10267000000000000000118400C0000002402000A3 -:102680002088200800A000820084040200002000AE -:10269000200010000402001004100000401000028E -:1026A0001102402041000800080000000000000066 -:1026B00000000000000000000000000020000400F6 -:1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F0000000000000000000000000000000410891 -:10270000412102418209108200200004048220C07D -:1027100005028205100883A1A01100A1A08909016A -:1027200001C1908988110000000004000000C1016F -:102730004000400082000000000000000000000097 +:102070000C4000000000000002C06486612603409E +:102080000000000000000230A0000000000000007E +:102090000C4000000000000002C0648600006126C1 +:1020A00003400000000000000230A000000000001B +:1020B00000000C4000000000000002C064866126A1 +:1020C00003400000000000000230A00000000000FB +:1020D00000000C4000000000000002C064864004C4 +:1020E000200020902108000021030008200021008A +:1020F000C0000000000488808284210084802000C9 +:102100002000C008048088402000C00888004000EB +:1021100020000400000000008808040004200003E0 +:1021200088000400C00088008800C0008800880083 +:102130002000880020000404C0024000200240006B +:102140001100880288001003C00040008408840049 +:1021500040000200000820042020400488002010D5 +:10216000A100000010084000000040000000000036 +:1021700008020900049020001002400340000004FF +:102180000000000000C0200200000000400000002D +:10219000100010000000000000000090000000018E +:1021A0000000000000042100000200904084009024 +:1021B000200000004090050000000090100000008A +:1021C0002000080040010004C00004000900400491 +:1021D00040000082840040044100000090024090D2 +:1021E0000000008000C011850302020400000010FE +:1021F00008400985000400900110824041030090CE +:102200000110024002090802841000088200824086 +:1022100082080200020000400108020002100010C3 +:10222000000400000000000000000010000000405A +:1022300004000000000000000200002000408200B6 +:1022400082000400820800000800412082009008FB +:10225000884100000000000009218210820084886B +:102260008410034000020002C008400500080084FA +:1022700000840008200400080010200800109008C6 +:1022800002024011000803840085090304100404BD +:102290000004408420820408000804040000200494 +:1022A000000800C0000000080000000403000084D3 +:1022B000040403400208001000081082411000844A +:1022C00020C009080304020400002040848500089F +:1022D0000084080020082000000888840084090287 +:1022E00000020004C00000080021110800030003E0 +:1022F0009002000000401008000400852005408581 +:102300000021000800000021880000410000004179 +:10231000000800410005000804210403001000002B +:102320000000000000080000000000030100000899 +:1023300000080041000090000000000000030021A0 +:10234000000800080005C000000020100000000880 +:1023500010400000020000050000200308400003B8 +:102360009008400500800000000000009000001070 +:1023700000C0000100004100000000C108044188C5 +:1023800011084100000000000000000000000000F3 +:1023900000000400002009000000000003000020ED +:1023A00008000020000000000000000000004000C5 +:1023B00000000000000010100000008200000084F7 +:1023C000418241840088000000000000080400A051 +:1023D000000008000000040003000000210080004D +:1023E0000500000000880810040800008410400068 +:1023F0000021C00000000000820000000100004039 +:102400000204C0820840008008089000000908000B +:10241000000000008200A0000002820000004000D6 +:10242000A000C0000400820910100000000090000D +:10243000A008040000008200040004408800080096 +:10244000100882000400C04002000202084100009F +:1024500002092004821140090400A0000020081194 +:1024600000114020C0000805080020050000048479 +:10247000808200000400004000000000000420846E +:10248000090800040009001041100340000000008A +:102490000040214000820000000000400384000052 +:1024A0000000000000A0000011400000000000102B +:1024B00000840882000000000000080000000900FD +:1024C0000000000000000000000000000000108874 +:1024D00000009088004000000040210003004100FF +:1024E000000040040008000000C000400390C0212C +:1024F000C008002040A1A021001000400000010001 +:102500000800A00210C10000000000000021000926 +:10251000000000000021000000000000000000009A +:102520001000000000210000002100400000000019 +:102530000080080000000000C00300080000000048 +:10254000A000A000820000080000004082100410DB +:102550000000080000000000000008100800000350 +:102560008300C004A041100000020805000810000C +:102570000040000000008302000000000000000096 +:102580000800000003000904000000000000000033 +:10259000000010000000100000000000000000001B +:1025A000000040000000092000000000004008007A +:1025B000000008020000000008A002000000000067 +:1025C0000000090000A0000040040000000000001E +:1025D0000000000083000008000000000000000070 +:1025E00000000200000000200000000100040000C4 +:1025F00000000841000400040021000000088200DF +:1026000000000000000000000000408000040009FD +:1026100082080004000010000005004100000020B6 +:102620000841000000000000002000080000080031 +:1026300021000000008000000000000008000821C8 +:1026400000210000000000000000000040008200A7 +:10265000844182000041000002400800C0210800BF +:1026600082030204020000004000004084000205D2 +:1026700040090100000020000000200000000000D0 +:102680000000000000000000000000001104000035 +:1026900000000020000000000000000020000000FA +:1026A00000000000000020000000200111200000B8 +:1026B000020004040000000200000000000000000E +:1026C000000800000002000000000000004020049C +:1026D00000000000000000000000000000C000003A +:1026E000000000000000C10000000800210000847C +:1026F0000000910010000001010000000001000036 +:102700000000000000001000000000008400000134 +:102710000000A101400000000100C0000000000016 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000010101010200000192 :102740000000000000000000000000000000000089 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780008980021000858090A00500000003804031 -:1027900020C09040898580A009C18088000300A1E5 -:1027A00009110310059000100000000080000000D7 -:1027B000A041402100038020000000000000000034 -:1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:102800000000100085A18440038000008005800046 -:10281000800011000400410003A1900010218800F5 -:10282000410541009008909190C100000000000017 -:1028300000009080400040032000000000000000E5 -:102840000000000000000000000000000000000088 -:102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 -:1028800000000000890008C0A0911004840020000E -:10289000A00204002000850020009089042090847C -:1028A00004904184204003004111C1050000000054 -:1028B0000000000041888400400105000000000085 -:1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000000000F8 -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 -:1029000000000000000020020184001182C140028A -:1029100000A0848400820421A1850120010290216D -:10292000890285C010C0C01000890089A1C10001C2 -:102930000000000000000041008505410082000009 -:102940000000000000000000000000000000000087 +:10275000000000000000000000A1854184100082FC +:102760000000000000000000C04000200008001031 +:102770000040A1A184A1C0890041100900110021DD +:1027800000000000000000008000000002000000C7 +:102790000004001102080000000003000000000017 +:1027A0000000000000000000000000000000000029 +:1027B000000000000000000000000840402100412F +:1027C00000210000000000000000000000000000E8 +:1027D00000000000000000000000409003404004A2 +:1027E0000085000000000000000080000000008064 +:1027F00000800085A1888085008411000800000009 +:102800002002000000000000000000040011000988 +:102810000000880003001111C100A000100080001A +:10282000C0000000000000000000000000000000E8 +:102830000000800000000000800000000000200078 +:102840004000100000000000000000000000000038 +:102850000000000000000000000000008200A00056 +:1028600082000990000000000000000080000000CD +:102870008000000010000383030903A00040010052 +:102880000000000100000000000000000001000046 +:102890000000000040840300840009020900880051 +:1028A0000800091000000000000000000000000007 +:1028B00000000004100040002000900000000040D4 +:1028C0000100000000000000000000000000000007 +:1028D00000000000000000000000000000000820D0 +:1028E000110040A0C0110000000000000000040022 +:1028F0009000A0000400418240C191009088000136 +:10290000010188010000000000000000000000023A +:1029100008840040000800050011018301A10000A7 +:1029200000000001000000000000000000000000A6 +:102930000000000000000000000000000000000097 +:102940000000010110010000000000000000000074 :102950000000000000000000000000000000000077 -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:1029800000000000000000000088080808A1009175 -:1029900080804080050002000082880410080985BC -:1029A000038983802003A0838082031020059190F7 -:1029B000001000200008000300882104212100836A -:1029C0000000000000000000000000000000000007 +:102960004001010004018801000000000000000097 +:10297000909000080040404020900503020209A109 +:10298000001020088021001000000000000000005E +:10299000000080000000048000080008102103C12E +:1029A00000050010002100100000000000000000E1 +:1029B0000000000000000000000000000000000017 +:1029C00000000041030391211005000000000000F9 :1029D00000000000000000000000000000000000F7 -:1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 -:102A00000000000000000000000000210000008025 -:102A100000040000800000008000410310A021801D -:102A20000302C120A009C180080890021091108003 -:102A300011080000000000000000210500092180AD -:102A40002120000000000000000000000000000045 +:1029E000000080210304C1214040000000000000DD +:1029F00000000000008000000000802140A0048949 +:102A0000A121410004000400020802040300410067 +:102A1000100000000000000000000209102100006A +:102A200010080040008400000003000000000000C7 +:102A30000000000000100000000000000000000086 +:102A4000000000002000090009000402000000004E :102A50000000000000000000000000000000000076 -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A800000000000000000000000000088852040D9 -:102A900000402000000082008820A0000120008269 -:102AA000014001000921040408909100C121410561 -:102AB000414040000000000000000000012000A094 -:102AC0000182010100000000000000000000000081 +:102A600000000000C10303C00900111000000000B5 +:102A700000000000000000800000000041802009EC +:102A80008580030200080100010000000000000032 +:102A90000000000020009000C0001000008501C070 +:102AA000008800010085002000880001000000006F +:102AB000000000000000000000000000000000080E +:102AC00000100000000001000000000001000000F4 :102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000E0000050000000000000000000000085 -:102B200000E00000000000000000070000000000BE -:102B300000E00000508100000000000000000000E4 -:102B40000000000050000000000000000000000035 +:102AE0000000000000000588900400A0050100001F +:102AF000000000000000000000A0000200000140F3 +:102B000005040802010100000000000000000000B0 +:102B1000000000000000000000E0000000000000D5 +:102B200000E00000000000000000000000000000C5 +:102B3000000000000000000000000700000000008E +:102B4000000007000000000000000000000000007E :102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B90007E426666CCCC333300000000F0F0F0F0EB -:102BA0000000000090B090200000000090907E187F -:102BB000FFC38D8D3C3CB4B4000000000000000059 -:102BC000000000003003300300000000000000009F +:102B60000000000000000000000000E0070000007E +:102B70000000000000000000000000000000420013 +:102B800000000000000084000000000000000000C1 +:102B9000000000000000000000C0F0F0C3C387C3C5 +:102BA000000000003C0030000000000000000000B9 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 :102BD00000000000000000000000000000000000F5 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C1000000066666666666600FF004B004BFFFFBD -:102C2000C3990000000000B000207CFFFFFF0000FF -:102C30007E183C008D8DFF00F69000000000000023 -:102C40000000000000000000999900000000000052 +:102BE00000000000000000000000DBE718240000E7 +:102BF00000000000000000000000000000000A715A +:102C00004DBB0FFF0FFF0000C3C00000000000001D +:102C100000000000000000000000F0C0F0F0C3C39E +:102C2000C3C30000000030003000000000000000BE +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 :102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 +:102C6000000000000000000000000000DBE7182466 :102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 +:102C80000A714DBB0F0F0F0F0003C3C300000000FC :102C90000000000000000000000000000000000034 :102CA0000000000000000000000000000000000024 :102CB0000000000000000000000000000000000014 @@ -70369,492 +70369,492 @@ :102CE00000000000000000000000000000000000E4 :102CF00000000000000000000000000000000000D4 :102D000000000000000000000000000000000000C3 -:102D1000000000000000C9C9C9C970737272FF3C8D -:102D2000C300CFC0FFF0FC0CCFCF0B000B03606FD4 -:102D3000606F1F1F101F00990099B4B466FF000058 -:102D4000000000000000000000008D8181B1000043 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000FFFFFFFF0000000000000000000097 +:102D400000000000000000000000660066000000B7 :102D50000000000000000000000000000000000073 :102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000FF0FF70734242CE -:102DA000FCFCFCFCCFC00F00FC0CC0C008000803FA -:102DB000CFCFC0C01010101F0FC30FC3B4B4009901 -:102DC0000000000000000000000000000C000030C7 +:102D7000FF90C380010101FF00000000000000007F +:102D80003F3F3F3F00FF3434FFFF9F0F000066428C +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000200003 +:102DB00000000000C3038343000000000000000087 +:102DC0000000000000000000000000000400F70008 :102DD00000000000000000000000000000000000F3 :102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E10000000000000000000000000613006009982 -:102E2000000080610006001D000000415007000DF9 -:102E3000000005610A0E059D00A1A061000100913E -:102E4000000500610006000D000000610006001D85 -:102E50000000000000000000000000000000000072 +:102DF0000000FFF6C3C2999999FF0000000000008F +:102E000000008383C303FFFFFFFFFFFFBF3F0000FE +:102E1000626200610006000D000000610006000D06 +:102E2000000000610007000D000000610001000DBE +:102E3000000000610006000D00000000000000001E +:102E4000000000000008000000A0000000000000DA +:102E50000000000000610006000D000000000000FE :102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000A0A5F5F0000000000000000030303FF48 -:102EB000FFFF5F5F0F5500C3C3C3FF0055FCFFFC5E -:102EC000A0FFB4BE0000000098746EAAFAFAC2C255 -:102ED000005AA5FF000000000000000000000000F4 +:102E7000000000008061000F000900000000000059 +:102E8000000000000000000000100001006130069A +:102E9000000D000000FDFFFD00000030F0F0F0C369 +:102EA00000000000000000000000000000BE000064 +:102EB000EB28E8E800000000C3C3000000000000A9 +:102EC0000000000000000000000000000000000002 +:102ED0000000000000007FFF02FF1010F0F3000070 :102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F20000000280A7D5F000000000000000003038D -:102F3000FFFFFFC35F430F55FFC3C3C3FF00550C23 -:102F4000000C005F141E0000000098746EAAFAFACC -:102F5000C2C2003CC3FF00000000000000000000EF +:102EF000000000000000000400003C3C3CBC00005E +:102F0000000000000000000000000000000000C3FE +:102F100068E9FF82FFF20001FF0100000000F0F00D +:102F2000F0C300000000000000000000000000BE30 +:102F30000000EB28E8E8000000000AFF55FF000051 +:102F40000000000000000000000000000000000081 +:102F500000000000000000007FFF02FF3030F0F3AF :102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 +:102F70000000000000000000000000053C3C3C3C5C :102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA00003000300C000D00000001010000000006B -:102FB0002C83AFAF00C0F0C0AAAA4141B4BE0F003D -:102FC000F5FF35303CFCAAFC0000000000000000CA -:102FD000287D2070E3D3EFDF000000000000000038 -:102FE00000000000000000000000000000000000E1 +:102F900000C399E2FF82FFFF0AFA2AEA808020201C +:102FA0000000000000000000000000000000000021 +:102FB000000000003CFC414100000000F0F0000077 +:102FC0000000000000000000000000000000000001 +:102FD000000000000000000000000E0E0C0E550F57 +:102FE00055F000000000000000000000000000009C :102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:103020000000140014000000000000000000000078 -:10303000000038C2FAFA00A0F0A000005F0A141ED7 -:10304000FFF0C5CF05003C0CAA0C000000000000FA -:103050000000287D2F7F4383408000000000000097 -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 +:1030000000200000000000000000000000000000A0 +:10301000000004000000FF03FF410AFA2AEA02024E +:103020000808000000000000000000000000000090 +:1030300000000F000F0F3CFF414100000000B2B242 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000C0E0C0E3C +:10306000550F55F0000000000000000000000000B7 +:10307000000000000000000000000000000400004C :103080000000000000000000000000000000000040 -:1030900000000000000000000000000020002000F0 -:1030A000020083080000C0000800400040008402C5 -:1030B0000000040800008304020484800000000073 -:1030C0000004C000C00000000000002000800000DC -:1030D00000020004000000000000001100030000D6 -:1030E00000000000000000000000000000000000E0 -:1030F00000020000000200000000000000000000CC -:1031000000000000000000000002000000000000BD -:103110001000000000000000000000000000090096 -:10312000410041000800040204208000400004C067 -:103130002001000000030400020100010002000061 -:1031400000A0000008000020200000000082000213 -:10315000000400000000000000000000000000006B -:1031600000000090000000000000000000000000CF -:10317000000000000000000000000000000000004F -:10318000000200000000000000000000000000003D -:10319000000021000000000000000000000000000E -:1031A0000209080009000004094003C003009089D7 -:1031B00088008400010000000000048084040400F2 -:1031C000000085009000208000000000008000C00A -:1031D00001400000010400000000000000000000A9 -:1031E00000000000004000000020840000000000FB -:1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:10322000000000008284C0004002C0000803408803 -:103230000202000000840800030409008504000164 -:103240008000000020042000800402C00000002054 -:103250000021200000842089000200000982000073 -:103260000900000000000000000000010000000054 -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A00000000000010000088200A00400004000AF -:1032B0000000044000000008000000004000000082 -:1032C0004000000040000004000020000400000056 -:1032D00000000003000488020002850000001000C6 -:1032E000000084000000000000044000C000000056 -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000400000000000000A9 -:103320000000000000000200030003000000210074 -:10333000C1000000030009004100090402008800E8 -:103340000400410041000300031102000584004015 -:103350000800000000000001032100050200000039 -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A00000000000000000000280040404048241C8 -:1033B0000404100900020800C01010118409002044 -:1033C0004005080008000000840008000000090013 -:1033D0008800C00000000800A000A00000000080DD -:1033E00000000000000200000000000200000009D0 -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:10342000000000000000000000009040080440027E -:1034300002900088090008880084000121C00082F1 -:103440000308114090C088200040050011880390B7 -:1034500020000902009000000000030008000000A6 -:1034600003400000030000000000000003002100F2 -:1034700000000804000000000000008800000000B8 -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A0000000000000000000000000000220841066 -:1034B00008028300820008824002100040000805D4 -:1034C000C000880000110408202010020000000045 -:1034D00082004000100310110800000200000000EC -:1034E0000004000210000000000082000000000044 -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:103520000000000000000000000000000000808893 -:1035300000000800080041004103040908200000C1 -:103540008000080000100388C00084880000210467 -:10355000210000A021000340100003021190000090 -:10356000000004010801040000C000000800000081 -:10357000000000200000000000000000000000002B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000009040000000000000000000000000004B -:1035B00002C0400000410805001182040000880894 -:1035C0000011A00240080840200410C00000C020E4 -:1035D0000821901110028409200290094002400342 -:1035E00000000002001000000000080000000000C1 -:1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A -:103630000000A0414002080021900808000000C0DE -:103640001102030403008308A110208808040088E5 -:103650000320100020002000409000041188000189 -:103660002100000000010000002010000000080000 -:103670000300000003000302000020000800000017 -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000008388000890880404A0A0A008EF -:1036C0000809C020A008A19040A020A01083854038 -:1036D00008A0200820000100410120014190410480 -:1036E0000282C0A000A100020104009000000000BE -:1036F00000000000000000000000000000000000CA +:1030900000000000000000000000000088000000A8 +:1030A000C0100000C00984002009208400002020F6 +:1030B0002000000020808400408420102080000038 +:1030C000C080400088000000000884044000200008 +:1030D000000402002000200020082004000320003B +:1030E0000000000004050000000088002004020029 +:1030F0008820C000020440020291A000210240008A +:103100004000400520008400C00084000409400005 +:1031100021008588208482004005400400040000CE +:103120000000000000000900000000004020000036 +:1031300000C108C000004010410241401001400899 +:1031400040000002000400000000000400024000F3 +:1031500000000000008200002190400241000000B9 +:10316000210000000000000000000000000200003C +:103170004000400109004000009041400000400232 +:1031800041904100000000004100040009020000DD +:10319000000008400220402040A010000003000171 +:1031A000020400000000080002080009004000407E +:1031B00090030109004002091000020390109000E2 +:1031C0000204008082020005080008008200020854 +:1031D00000400004A00300050009000901C0000030 +:1031E00000000403000808040000020804050203AC +:1031F00000050008000500000000844000030808E6 +:1032000090400000000008408200824002008209D5 +:103210008240004082408200824000040404850015 +:103220000004008440082040400809C00008001045 +:103230000008008404080088008441044104000858 +:103240000004090800020085114000880008000001 +:103250004084000800080240090009400082400242 +:1032600000820000408400400008404040004108C7 +:103270000504000841040208090000401108000884 +:103280000204110809080984030800000008000866 +:1032900000844184000502090284008805820285B9 +:1032A00020080289100800050040001000050000F9 +:1032B000004084210008002100088802840088085A +:1032C000000000020021040300000041044000004F +:1032D0000000001000400000A04190050008000020 +:1032E00088410008000000080000000200100040B3 +:1032F0000000900000050021040001080005000006 +:1033000000400041004000210002000000000003D6 +:10331000000000000008002104020040C00020005E +:103320009008C0400008000000C000A0000000009D +:103330000500000000C000000020000000C00000E8 +:103340000000218805A0000000080800001000828D +:10335000000200A00084000000000300000000A0A4 +:103360000008410000000000000010000084000080 +:103370000000000000A011842100000004000000F3 +:103380000500000000020000030000000000000033 +:1033900000842120000021404000000000000800BF +:1033A0008420090005000300000000000009080057 +:1033B00008000000000082004000000000008200C1 +:1033C000821000100800C000000000004010400003 +:1033D0001000080008000004002100000000002088 +:1033E00000000008A009008900000400880008000F +:1033F0000000000000000000000082000820002003 +:103400000800A000001008000009082000000000CB +:10341000000082001004080010000800900009005D +:10342000410982048200080082040082000000003A +:10343000030000820004000000C000000000000043 +:10344000200020400090400000000000000082406A +:103450008000080405000000038821C0000000006F +:103460000001000000000000204000000082410038 +:1034700040000000090005000910210000000001C3 +:10348000020105000000080008C02000219002840D +:1034900000840000210000A000000882000000C09D +:1034A0000888080008011100110000010000002137 +:1034B0000008004000000000000000040820000098 +:1034C000000010050000080000000000004100405E +:1034D00000000000002100000000080000000000C3 +:1034E000000010100000000082000000000000003A +:1034F000000000210000000000000000001000009B +:103500000000820000000000000000000011000028 +:10351000000000000000100010001000000000007B +:1035200000000041042000090000820082400900E0 +:10353000000400040300000000040000000000205C +:10354000040008000000000840040002008420007D +:103550000010000000080000000003000000000050 +:103560000000080000000000000000000000000053 +:10357000000000080000000000000000000000043F +:103580000000000000000500000000000010000026 +:10359000004003C00500030000000000000011000F +:1035A00003900000000008000000080009A02100AE +:1035B00000000000002100210000002100000000A8 +:1035C000001000000400040000000000008000085B +:1035D00000000000000800081000000020000000AB +:1035E000000000008200000800000000000000034E +:1035F00000000000000000000800080000000008B3 +:103600000000080000000000004008210008000041 +:1036100000210200820000210400000000200008B8 +:103620000000000800000000080000080000004141 +:1036300008210088020000000000000000000000D7 +:103640000000000100000000000000000000004039 +:1036500021000010004000020000000000000000F7 +:1036600000001100000000000000104003000000F6 +:10367000200000000000000005000000080000001D +:1036800000000000090000000002020800C0000065 +:103690000000000000000000000005000000000025 +:1036A000000000000000000000000000040020886E +:1036B00000102100000000000000000000000000D9 +:1036C000000000000040009000100090A088000062 +:1036D0000002A00000000000010000000000000047 +:1036E0000000000008000000000090000188A09089 +:1036F000882000A000000000000000000000000082 :1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:1037300000000000000009800080008000801189E6 -:10374000A103800380058800830080808080802022 -:1037500003098490009000094103210200059000B4 -:103760001000808080000008058804080003000025 -:103770000000000000000000000000000000000049 +:1037100000000800000000000000000000000000A1 +:1037200000000000000010A0001000400220000077 +:103730000000000000000000000000000000000089 +:1037400000000000000000800080000000008000F9 +:1037500000000080000000000000100000000000D9 +:103760000000000000000000000000008000108049 +:1037700021000000008000000000000000000000A8 :103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B000000000000000000005000803A0802100B8 -:1037C00040001004C000041108001103C1008382EE -:1037D000034003008800A183418084000811820512 -:1037E0000000892105882180418008030508000424 -:1037F00000000000000000000000000080008000C9 -:103800008000000000000000000000000000000038 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000090008900A0408F -:103840002100C1A0A001A0C0040009820400A0883A -:10385000A18982044100A00091030888110005009D -:1038600011014000822088A01190000400A10000F6 -:10387000002100000000000000000000080082009D -:1038800002000282000000000000000000000000B2 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B000000000000000000000000000A0400084A4 -:1038C00004C000C1208400048582C111C020001002 -:1038D0000088008808200021042002890020880236 -:1038E000844100C0044100419041A0020001000059 -:1038F00001012000000000000000000000000000A6 +:103790000000080000000000000000000000000021 +:1037A0000000000000000000838000000080800016 +:1037B0000000000009000000000000000000000000 +:1037C0000000800000000000000000080009000068 +:1037D000000000028080000008004100100241004B +:1037E0000000000000000000000000008000000059 +:1037F000020084210300040000000000000000001B +:103800000000000000000000000000000080000038 +:103810000000800080000020000000000000000088 +:103820000000000000000000000080008011008007 +:103830008080001000000040000000000000000038 +:1038400000000000100088000800000000010011C6 +:10385000000020002000A010400000200000010116 +:103860000100000000000000000000000000A000B7 +:10387000000041002008C12090000000000000006E +:103880000000000000000000000000000000001028 +:103890000000000040000200C00090000000000096 +:1038A000000000000000000000000000080002000E +:1038B000A084C09000000000000100000000000093 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000C02000A01004820200000000D0 +:1038E000A0010001000000000000000000020090A4 +:1038F00000A0000800900089000184200000000062 :1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:10393000000000000000000000000000000000097E -:10394000002080104088030503A184082102800024 -:10395000000300112010800305200508821000A03C -:103960008803092100A0800400A080108390000239 -:1039700000210821000500000000000000000000F8 +:103910000000400000000001000000000000000066 +:103920000000000000000000000000000000000295 +:103930000008000808C0000020000000010000008E +:103940000000000000000000000000000000000077 +:1039500000000000000000000080808080800000E7 +:1039600000008021040200000000000000000000B0 +:1039700000000000000000400008001008200000C7 :103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 +:103990000000000080000000000800100009000482 :1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C000008080108080801084A1208583000309FE -:1039D000C100118010800941210802414180050485 -:1039E00021A020914100034080800005008000401C -:1039F000210505002000022000000000000000005A -:103A00000000000200020080000000000000000032 -:103A100000000000000000000000000000000000A6 +:1039B0000080000000800080000080000000030004 +:1039C000000000000000000000090090000000005E +:1039D00080000020000080008000802080800000A7 +:1039E0000000200040001110000000000000000056 +:1039F0000000008000000000000080800000000245 +:103A000000000000000000000000000000000000B6 +:103A100000000009000900000000002000000080F4 :103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A4000000090408220108220014009830803007A -:103A5000840009040882C102C00101050104008438 -:103A6000000101410009000801010402A040C084D6 -:103A7000C0000120200005004100000000000000FF -:103A800000000000000100A1004000000000000054 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD0000000000A0000000000006006000000E096 -:103AE00007000000000000E00000410000000000AE -:103AF00007000012000000E00000000000000000CD -:103B000000000000000000000000070000000000AE -:103B100000000000000000000000000000000000A5 +:103A300000008000800080808000000900090000F4 +:103A40000000000000000000000000000010002046 +:103A50000000C000880020008200C0004000080272 +:103A60001000000000000000010100000000000044 +:103A70000000000000020000000000C0888220203A +:103A800084000000000000000000000000000000B2 +:103A9000000000000000000000000000000000889E +:103AA00000400000000000000000000000000000D6 +:103AB00000000000C0001008900208000000000094 +:103AC0000000000000000000000000000081000075 +:103AD00007000000000000000700000000000000D8 +:103AE00000000000840000E0000000000000000072 +:103AF00000000000000000000700000000000000BF +:103B000000000000000000000000000000000000B5 +:103B1000000000000000000000000700000000009E :103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B4000000000000000BC1CBCBC4BE1F55F545EF3 -:103B5000F4FE2C7C207F82BE0000C3FFCFCF00008C -:103B6000000000000004000000000F00A0A03C3C8A -:103B700000FFF0FFE8E80000000000000000000087 -:103B80000000000000000000000000000000000035 +:103B3000000000000000000000000700000000007E +:103B400000E0000000000000000000000000000095 +:103B500000000000000000308A8A000000001414F9 +:103B60003F030000302000000000000000000000C3 +:103B700000000000000000000000C3C3C3413C007F +:103B80003C000000C0C00000000000000000000079 :103B90000000000000000000000000000000000025 :103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000001C1C1CBC4BE1A00A0F -:103BD000040EA4AE1CBC10BF0AFA000041554545B6 -:103BE0000000000000000000000000000F00BC808A -:103BF000F0F0AAAAF000E8E80CFC0CFC00000000C1 -:103C000000000000000000000000000000000000B4 +:103BB00000000000000000003CAAFFF0EAAAFAAAF8 +:103BC00000000000000000000000000000000000F5 +:103BD000000000000000000000008A8A00000000D1 +:103BE000D7D73F03F0A0F0A00000000000000000C5 +:103BF000000000000000000000000000C0C0C04045 +:103C00003D053D050000C0C00000000000000000B0 :103C100000000000000000000000000000000000A4 :103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000003033F030545E2 -:103C5000B5F52CEF0CCF1717FF00C3C3C0C300048A -:103C600000F43C5F555FF7F7F40400000000050026 -:103C700005283C3C55553F033F03DF8AD5800000B3 -:103C80000000000000000000000000000000000034 -:103C90000F0F000000000000000000000000000006 -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC0000000000000000000000000003F3F3F0334 -:103CD0000D4DBDFD2C2C0C0C1717FF00C3C3C3C327 -:103CE0000404F4F43C50555007F7040400000000AD -:103CF000058205AAFF000F0F5F5F0A0ADF8AD580E1 -:103D000000000000000000000000000000000000B3 -:103D10000000AAAA82AA0000000000000000000023 -:103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000806192 -:103D50000006009D000000610006000D00010061EA -:103D60000006000D00000061000D0005000100616B -:103D70000004009900010061300E000D0000006198 -:103D800030030005000000000000000000000000FB -:103D9000000000080000000000000000000000001B -:103DA0000000000000000000000000000000000013 +:103C3000000000000000000000003CAA00F0E8289E +:103C4000F000000000000000000000000000000084 +:103C50000000000000000000000AF303F000000074 +:103C60000000AAAAA0A0003F003F00000000000042 +:103C700000000000000000000000000000005500EF +:103C800055000F0F0F01AEAF0F0F00000000000036 +:103C90000000000000000000000000000000000024 +:103CA00000000000000000008E8E0C0C00000000E0 +:103CB000000000000000000000000000AAA82A2860 +:103CC000FF41FF4000000000000000000000000075 +:103CD000000000000000000000000005F303F000F9 +:103CE00000000000FFFFF0F000FF003F00000000B8 +:103CF00000000000000000000000000000000000C4 +:103D0000550055000F0F0F01A3A300000000000095 +:103D100000000000000000000000000000000000A3 +:103D200000000000000000000000BE823C00000017 +:103D30000000000000000000000000000000AAA831 +:103D40002A2841414F400000000000000000000010 +:103D50000000000000000000003800000000A0008B +:103D6000000000000000A000000000000000006152 +:103D70000007C00D0000000000000000000000006F +:103D800000000000000000613006001D000100007E +:103D90000000000000000000000000000000000023 +:103DA00000000A080500000000610006000D000187 :103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD0000000000000A03000040204023C1428008F -:103DE000FCFCF505AA0AA0003F3C353C0F0F0F0F65 -:103DF0003F3F3F350000000000000000C3C0F3F06B -:103E0000D7DFD79EFFFF0F0F00000000000000006B +:103DC000A00000000090000500610007000D000049 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF0005030503000FF00000000000000000000C4 +:103E000000000000000000000000000000000400AE :103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 +:103E20000000000000000000000000000000FF0093 +:103E3000000F000000000000000000000000000073 :103E40000000000000000000000000000000000072 -:103E500000000000000000A030000402F4F23F1750 -:103E60002B030C0CF505AF0FA5053F3C303C0F0BA9 -:103E70000F0F353F35355F3F0F0F00000000C1C108 -:103E8000F1F1C3CBC38A0CFC0CFC00000000000065 -:103E90000000000000000000000000000000000022 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E700000005030503000FF000000000000000043 +:103E80000000000000000000000000000000827D33 +:103E9000020D000000000000000000000000000013 :103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 +:103EB000EBEB040400000000000000000000000024 :103EC00000000000000000000000000000000000F2 -:103ED0000000000000000000CF0EFF0E0000FD0DEE -:103EE000003CB2B20000000000000000EFFFAAFF9B -:103EF000001455143CFC7C7C2C3C3C3C0000000035 -:103F0000A0A000A0FF3CF03CEF2FEF2F000000002E -:103F100000000000000000000000000000000000A1 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF000000000000000000000BE000F00000000F5 +:103F000000000000000000000000000000000000B1 +:103F1000FFFFAAAA0000000000000000000000004F :103F20000000000000000000000000000000000091 :103F30000000000000000000000000000000000081 :103F40000000000000000000000000000000000071 -:103F500000000000000000000000C002F0020000AD -:103F6000F8080000000000000000AAB4FFB4000040 -:103F70000000A0B4F5B43C0C2C2C3C3C3C3C0000B4 -:103F80000000A0A0FFA00F3C003CE020E0200000CB -:103F90000000000000000000000000000000000021 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000BE000F000074 +:103F80000000000000000000000000000000000031 +:103F90000000EAFEAAAA00000000000000000000E5 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000200200002000000BD -:103FE000080040000000040020000000010540021D -:103FF000888008000404040200000400002000205F -:104000000008008300000000000000000000000025 -:104010000000000000100000000300080000000085 -:104020000020000000000000000000000000000070 -:104030000000000000000000000000000000000080 -:10404000000000000400000000000000000000006C -:104050000000000000000000000000000000400020 -:10406000410083C00000000005000000002008009F -:104070001001002084008482C10000A0A100000182 -:1040800021010001050200C0000000000000000046 -:104090000000002000A000830000000000010000DC -:1040A000000000010000000000000000000000000F -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000088800002D6 -:1040E00090050110080000000010021000000800F8 -:1040F000C000000004000009C020402000000400AF -:104100002020002002084000000000000000020003 -:104110000000030002000480000000000000010015 -:1041200000800041008021820000008004840000A3 -:10413000820000008200000000000000000000007B -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000003025A -:104160000083400408010308040004C0058800041B -:1041700082880040020080000208200182090400B9 -:10418000820800010201000980000000008804008C -:1041900004000000400004008410000000840000BF -:1041A000100000200200000290090000000200033D -:1041B00000000002000000000000000000000000FD -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000040000000400000000D7 -:1041E000C0000008000000410000408009104000AD -:1041F0000000000000050000402100C188100821D7 -:104200000200408004890000881008008400000833 -:10421000880000210000C0210400000000400011BF -:104220000000000000A100000009000000000000E4 -:104230000004000000050000000000000011000064 -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:104260000000210241000088091041000402880575 -:10427000210040C00300210008C005000002030027 -:1042800009A00800100200020008000041002102FD -:1042900021004000000000884102000000000000F2 -:1042A0000000000000000008000000000000000006 -:1042B00000000001000000000000000000000000FD -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E0000000000090001000821002A002400200B6 -:1042F00010040811104108000240840404408200A8 -:10430000C009400000020000A00041000800400079 -:10431000820000000802000000008220828000006D -:104320008400080000009000000000000000010070 -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:1043600000000000000004C0034011018302C000EF -:1043700000024088000421108000880000008900AD -:10438000400000200000410000880200840000007E -:104390004000000004400200000021000000401026 -:1043A000410021201100000000840000000000886E -:1043B00020200000000000000000000000000000BD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000080010000805A8 -:1043F0000800080084058200000084000000A0007E -:104400000821080084008211000008110405000939 -:10441000902008000002000200000000A00200003E -:1044200008000800000010410000000040004000AB -:104430000000000800020000000000000000000072 -:104440000008000000000000000000000000000064 +:103FD00000000000000000004109881088004080B7 +:103FE000C003200004002004401088000480000565 +:103FF00002104000008904884000C1082080401061 +:104000000000000020002000400010800800040094 +:1040100040002008A1080400000304000100000083 +:1040200084034000890520822183410089C04188A2 +:10403000C0828800201005002180880000008200D6 +:1040400004042000200320002008C0084000880845 +:104050000400C18320A0208420800240000000C012 +:104060002010000040000000000000004000C120BF +:1040700009A0000490004002A020A0000800000851 +:1040800000040000000400821082000080208000F4 +:1040900000080000410020840040000000000440AF +:1040A0002100008400C00800001102400800082020 +:1040B000081040112100412002020210400000823D +:1040C000410409200000000040002002000000021E +:1040D0000484400040204003410221020000000906 +:1040E0002010031008000805001000108800901030 +:1040F00000201010820802040210000005C00041D8 +:10410000001000400204004000058200020501008A +:104110000005084004080210080000000000030029 +:1041200005002008041001020840010508400308AA +:1041300004800000201004000002040404000000B9 +:10414000000984000841840082080800000002057C +:1041500002008200000001880000A0041000000896 +:104160000008020808840084000802840008090886 +:10417000000000110308098400C000044004084046 +:1041800002840508000000880408051004040004E7 +:1041900004840000098500880400C04000840000F9 +:1041A0000408048402C020004011800908408908E6 +:1041B0000204C11002000002808411C0C088C082C5 +:1041C00040824084001083000508028402084010E9 +:1041D0000482000802820310040203000500850027 +:1041E000401091210021001110080040000300211F +:1041F0000041002100201105400500210008002099 +:104200000000000200000021000800400000001033 +:1042100000088820000000030000000091820008D0 +:10422000000000210020C02000C00021104001102B +:10423000A021001000084021A008880809030021DF +:10424000010500000000C005000000210041002120 +:10425000000000000021080000400040049004021B +:104260000400080002000000090000000000030034 +:1042700003000800088408010200084000820300CF +:10428000001100000241004000200000000000007A +:1042900000000000000940000500000000002005AB +:1042A0000088000000000309000100202108000030 +:1042B0001009400010000500414000000500840086 +:1042C000040004000800040800084000000000107A +:1042D00000000200000000000300000008100002BF +:1042E000820180828241C021400082000800820059 +:1042F0000810400082000008000004400000000395 +:1043000000090080C0000100000088000000A0003B +:10431000022000408240A00008004002C0090200C4 +:10432000A02108000000822084002000000002007C +:104330000402C0002009C020000000820402A00086 +:104340008280A01000000004A0000200C00208004B +:104350004020044100200802000400050803A105D4 +:10436000022001400402110000008800000000004B +:104370004100008400A000000000000008000000D0 +:104380000082000000080000408400840400100047 +:1043900000000200050040010400000010C000A061 +:1043A00003820000410000000001008800C000A05E +:1043B0008384410003A000000801080021214084FB +:1043C0001000002003402000214040000040001069 +:1043D00003820000050005000000080008840000BA +:1043E000408400014008119100210000A01001410B +:1043F0000000000000000003A00000088240000050 +:104400001000080008401085004000000000000077 +:104410000800004000000021080008000800844156 +:1044200001000000002184000000081184028211B4 +:104430008240C00040000800848000008400C0006A +:10444000100008000000A100880000080000000023 :10445000000000000000000000000000000000005C -:1044600000000000000000000000080240200000E2 -:1044700091000040000000000400088205000504CF -:104480000590100400200300008800000000800454 -:104490000082050083000085080204000002090074 -:1044A00004900000000000000000000000008000F8 -:1044B000800000000001000100000000000000007A -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000004000000D8 -:1044E0000000000000000000000000004000040088 -:1044F0000804A0828211C0000984401100118400C8 -:104500000002820400000000884190000041820205 -:1045100008020400000000102008820000110008BA -:10452000022008004000820200000000000000009D -:1045300008008800000000200000000000000000CB -:104540000000000000000000000800000000000063 -:10455000000000000000000000000000000000005B -:104560000000000000000000000000000000080043 -:10457000099009100802400000A0041091080040B2 -:1045800000200000000000000000001000000000FB -:1045900000012001000003200000000000000000D6 -:1045A0000000000000000000038808000000000078 -:1045B00000000000002000000000000000000400D7 -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00004A191118288000810A0C040020490829A -:1046000001A000A09002A020C0A0019090A00004F2 -:10461000A0A189409004C002A08301C0A0C0C0092D -:104620000000000008000000400000200020A0045E -:104630000000A1889005A090044100000000400007 -:104640000001000000000000000000000000000069 -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000009C041030041001000800480800058 -:1046800000802080210000800000880003000000DE -:1046900000800088219000A08082001021208002EC -:1046A00080100000110000000000800000000000E9 -:1046B000008000002085C1A100410020000002030D -:1046C0000540001000000000000000000000000095 -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F000000000000000C003858003C088000203A2 -:1047000020022082000000028080000080008021C2 -:104710008000800003008910408240030080024135 -:1047200005024188000000000000000000000010A9 -:10473000000900000000100088098211C1A11000CA -:10474000080010004102000000000000000000000E -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:1047700000000000000000880300A0A089A1112013 -:10478000900141C1A0044000C001A0100400080035 -:10479000080008C010828240100104098401000250 -:1047A000011001C101A10000000000000000000094 -:1047B000000100A1000000004108830188840391EA -:1047C0000182010001000101000000000000000062 -:1047D00000000000000000000000000000000000D9 +:104460008221080000000005080000000000000193 +:1044700040000000000000820000000000084040F2 +:10448000000009000020000080020000020000007F +:104490000000000000000000040040000000800058 +:1044A00000A04000400010200504000000000000B3 +:1044B00000000000000080008020000200000000DA +:1044C000000000000000009004A0000000000000B8 +:1044D00000002000000000000000008440000000F8 +:1044E0000000000003000308000080000002000438 +:1044F000000000000800000500080020000000087F +:104500000420200000008203000020A10008080011 +:1045100000000821000008100008000800000180C9 +:104520001000110000030000C0040010000004008F +:10453000088008A109001000088011801000841173 +:104540008400082000801041042140210440000024 +:104550000000000900210000000000100000200001 +:1045600000000000004082004000C1101000000167 +:104570000000000000000000000003000000000038 +:104580000000000100000000000000000002000028 +:104590000000000000000082000000002100100068 +:1045A00010080000208808004190020020830000CD +:1045B0008000082000200400000084100810000083 +:1045C00003020000000100200000000008000000BD +:1045D00000004100212008C0000403000300000087 +:1045E0000010030000004000000080004020000890 +:1045F0000401010120002001000000000000000073 +:104600000020001000880040000000002000000092 +:1046100082A1001100C0048800000000000000001A +:104620000800009001A082A01001400000011000CD +:104630000000000000000000000000C1008304A191 +:104640000020108290884004C00002C0048400A0B2 +:1046500020400000000000000000000000000000FA +:104660000000000000000000000000008401A00025 +:10467000000100204140000500040000000000008F +:1046800000000000008000000000000008000000A2 +:10469000000040C1002100410003000000000000B4 +:1046A000000080000080418000000002800811208E +:1046B00080200000000000000000000000C1059004 +:1046C00080820008000083000000800080800000DD +:1046D000008000000000000000000000000000005A +:1046E00000000000000000000000000000000021A9 +:1046F000000000048200830003008200000000002C +:1047000000000000000000C10002000010002100B5 +:1047100010000310800000110000001100000000D4 +:104720000000000000000091008003008800A1004C +:104730008811850300000000008000000000800058 +:10474000800088098021C000A0058380910080003E +:104750008040008080000000800000000080000099 +:104760000000000000000000000000000000200029 +:10477000210003004021880082000000088400001E +:10478000000000000000000000410020000001883F +:10479000010001000082880084001082880000006F +:1047A000000000000000000000C100840040898873 +:1047B00011009101C0010000000000C00000008253 +:1047C00008004000A00002038800028208048382DF +:1047D000020002204008820800008200100020042D :1047E00000000000000000000000000000000000C9 -:1047F00000000000000000004085010140C108A049 -:1048000082890088008501C1048400C000A002C024 -:10481000100000A00800080104C000008509A000E5 -:10482000081000A08582C0110000000000000000F8 -:1048300008400082A04091020000A0050182001003 -:10484000C0030000010001010001000000000000A1 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 -:104870000000000000000000000080404003802194 -:1048800009040010008500A10988800300100003BE -:104890008000800000C100100040000402000821D8 -:1048A000000580080985102080890000000900406B -:1048B0000005008000800000028000008089022145 -:1048C00011A080C100000805052140100000000073 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000021402040F7 -:104900008280030980829002088003098000800071 -:10491000008080000000A00408001100A184114163 -:1049200010808808A180080020008202000000009A -:10493000000000008040802100000000000090097D -:1049400003800400040821800200200040110000C0 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:10497000000000000000000000000000000085A012 -:104980009090080885000409210882040200C000F4 -:1049900004409008A0001000048221A0100003C170 -:1049A0008882214003004188A1001000020100001C -:1049B000000000000000C000A0000800100000007F -:1049C00005108204A19040010110010001000001C6 -:1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A0000000000000000500000000000070000004F -:104A1000000000000000000000000000070060002F -:104A2000000000000700600A000000E00000000A2B -:104A3000000000000000000000000000070000006F -:104A400000000000000007000011000000E000006E -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000FF99FF995AFF5A009F9B9F02C3C3E2 -:104A90003C66993C3C000F0F000FC3C3C7C76F6F44 -:104AA0006F6F240C3C0CFFFFFFFF3CFD3CFFF0F060 -:104AB000F0F00000000000000000069FBDBD66662B -:104AC00066660000E3FF001CF0E1F0F0000000006B -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 +:1047F00000A001080100018300100108A00100C011 +:104800000000000000000000040000008400100010 +:104810000000000000010001020200020008820402 +:10482000000000000000000000200090A00840C12F +:1048300000400082400800C00000010000000400A9 +:10484000000002020021A1000441080000A0028330 +:1048500000A0400200C0C002A082000000000000D2 +:104860000100000000000000000000000000000047 +:104870000000010000018201000000A003C18910B6 +:10488000098500000000000000000000000000009A +:104890008200000300200005401000800580208079 +:1048A00080800000000000000000001000008088F0 +:1048B00000C1008008800880108000001000000007 +:1048C0008000000000C10302900080108805009065 +:1048D00080210005058000008000800000000000AD +:1048E00000000400000000000000000000000000C4 +:1048F0000000000008050004004000040000000063 +:1049000000000040000000000000000000008009DE +:10491000000080004100201105000540200080C0FB +:104920000000800000000000000000008000000285 +:104930000000800310C00209080008030000000006 +:1049400000080000000021000080000000088091A5 +:1049500080A00000804080118088000000000000DE +:1049600000800000000000000000000000000000C7 +:104970000000000000004180402009000900009074 +:104980000000009000000000000000000000040093 +:1049900082004000100001880100000000010400B6 +:1049A0008809C04008000000000000000000080066 +:1049B0001001100008010102004101A001010000E6 +:1049C0000000000000000000010000A00020000125 +:1049D00002C12008108408010201042002028400A0 +:1049E0000000008200400000000000000000000005 +:1049F000000000000000000001C0000000000000F6 +:104A00000000000000004100000000000000000065 +:104A10000000000007004100000000000700000047 +:104A20000000000000000000000000000000000086 +:104A3000840000E007004181810000E000000000E8 +:104A400000000000000007006000000000000000FF +:104A50000000000000000700420A000000000700FC +:104A60000006000000000000000000000000000040 +:104A7000000000000000000000000000000007002F +:104A800050000000000089890000000000000000C4 +:104A90000000009CFF9C00000000000000000000DF +:104AA000000000E00080909FC3C3000000000000F1 +:104AB000000000006266000000000000000009998C +:104AC0003C3C00000000000000000000000000006E +:104AD000000030308383009FF009F09F3CFF060602 +:104AE000CB08EF2C000000000000000000000000D8 :104AF00000000000000000000000000000000000B6 -:104B0000000000000003003F5AFF5A00FFFBFF6255 -:104B1000CFCF3066F03C3C00C3C3C3C3C7C3C7C7D5 -:104B20006F6F6F6F240C000CFFBDFFBD3C043C0099 -:104B3000F330F1700000000000000000069F242404 -:104B4000FCC0FCFC0000C3FF003CF0C3F0F0000020 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 +:104B00000000000000000000000040400000000025 +:104B100000000000009FFF9F000000000000000058 +:104B20000000000000E000E0FFFFFFFF00000000C9 +:104B300000000000000020204000300000000000C5 +:104B40000999303C00000000000000000000000057 +:104B500000000000303083839F9F699690F93C00ED +:104B60000606CBCBEFEF00000000000000000000C5 :104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 :104B90000000000000000000000000000000000015 @@ -70864,494 +70864,494 @@ :104BD00000000000000000000000000000000000D5 :104BE00000000000000000000000000000000000C5 :104BF00000000000000000000000000000000000B5 -:104C000000000000000000000B03DBC36F9690FF64 -:104C1000000030FF400040000E0F0607F8E0F4D01F -:104C2000F800F000999999993F3FFFFFFFFFFFFFC0 -:104C3000B9FF0000000000000000000000000000BC -:104C40003C6F3C6F00000000000066036600092D09 -:104C50004B6F00000000000000000000000000009A -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C8000000000000000000000000B0FDBFF060921 -:104C900009F60000FFFF090900000C0D0405FB20C8 -:104CA000F710FC00F000DB9B9999FF7EFFFF0030BE -:104CB0000010B99900000000000000000000000092 -:104CC00000003C603C6000000000000066FF66FCE5 -:104CD00009096F6F000000000000000000000000E4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000614006FC -:104D1000000D00000061400E009D0001A061000632 -:104D2000000D00000061000E000D00000061000E8B -:104D3000000D000000603006000D0000006100065C -:104D4000000D0000A00000080000000000008061CD -:104D50000006001D000000610003000900000000C3 -:104D60000000000000000000000000000000000043 +:104C00000000000000000000000000000000303044 +:104C10000000000000000000FE00C20000000000D4 +:104C20000000000000000000FF08FFFF00003C3013 +:104C300000000000000000000464046400000000A4 +:104C40000000000000C300000000000000000000A1 +:104C500000008080C300FF3C063CF0F00F0F707036 +:104C600000703C3CFF00FFF3FCF000000000006619 +:104C7000FF660000000000000000000000000000CF +:104C80000000000000000000000000000000000024 +:104C900000000000000000000000FEFFC2FF000056 +:104CA00000000000000000000000FF0CFFFF0000FB +:104CB0003C180000000000000000046404640000D0 +:104CC000000000000000C0C3666600000000000095 +:104CD000000000000000C300063C063CFF00FF008F +:104CE000F0F000F099990F0F9F939C900000000046 +:104CF0000F660F66000000000000000000000000CA +:104D0000000000000000000000000000006100063C +:104D1000009D0001000000000000000000003008BD +:104D2000050000000061000E000D00A000610006FB +:104D3000001D0001000000000000000000613E0FA7 +:104D4000C098000000610007C09700050000050042 +:104D50000A08050000A000615006001D0001056161 +:104D60000A0E051D00A085005A08050000A00000DD :104D70000000000000000000000000000000000033 -:104D8000000000000000000000000000000096008D -:104D9000FF698080B0B050045004C0FC82820000E3 -:104DA000000028C028C03C0F3C0F0055FF550E0ED8 -:104DB0000A0A4141000055540504414141410000A7 -:104DC0000000A0F5F5F50000000000000000000064 -:104DD000FFD7EBC3AFAF0CFCA8FDA8FDF0F0AAFF16 -:104DE00000000000000000000000000000000000C3 +:104D800000000000000005610A0E050D00A00000F3 +:104D90000000040C040C00000000000000000000F3 +:104DA000000000000000003C0404008200800000BD +:104DB00000000000000000000000000000000000F3 +:104DC0000000003C3C00FFF7FFFF00000000000077 +:104DD0000000000000000000FFFF00002020000095 +:104DE0000000000015150000000000000000000099 :104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E1000F000FF0FFF00FF0000040004000000008E -:104E200000000000000000003C0F3C0FF055F05562 -:104E30000E0A0E0A4100000051500100414341405A -:104E400000000000A0F5A0A000000000000000008D -:104E50000000F0D0E0C0A0A00CFC00004141F0F048 -:104E600000550000000000000000000000000000ED +:104E000000000000000000000C0C23E3E7B10B469B +:104E100000000000040C0000000000000000000082 +:104E20000000000000000000C3FF040400000000B8 +:104E3000FFFF000000000000000000000000000074 +:104E400000000000003C3C000000000000000000EA +:104E50000000000000000000000000000000000052 +:104E6000000000000000003F000000000000000003 :104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E900000007D285F0A5505500000000000C3F0A7 -:104EA000AAFF000000000000000000000000000059 -:104EB00000000000FCF52828AFFFF0F03CFC0FFFDD -:104EC00005050000000000000000000000000000D8 -:104ED0000000000055555555E3EF5F50C7F7C7F781 -:104EE000BEB2FFF000000000000000000000000063 +:104E8000000000000000000000000C0C20E0E7B172 +:104E90000B46FF7F557FFF0FFFCF00000000000093 +:104EA0000000000000000000000000000000820080 +:104EB0003000AAC300F00000000000000000000065 +:104EC000000000000000AAAA000040004014F20008 +:104ED000F2FF0000000000000000000000000000E1 +:104EE00000AA00AA00000000FF53FF5300000000CA :104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F1000000000007D285F0AFFAFFAAA0000000031 -:104F2000C3F0AA0000000000000000000000000024 -:104F30000000000000000C057D7DAFFFF0F03C7D1F -:104F400000F0050500000000000000000000000067 -:104F50000000000000000054FF57202C5F50043474 -:104F6000043482B200F000000000000000000000E5 +:104F00000000000000000000000000003C003C0029 +:104F1000C3C3C303AA4B004BFFAFFFEF0000000069 +:104F20000000000000000000000000000000000081 +:104F3000BE003000AAC3FFF0000000000000000027 +:104F40000000000000000000AAAA000000000014F9 +:104F5000F2F0F2F000000000000000000000001479 +:104F6000000800AA00AA00000000FF530053000040 :104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F900000000000000000002000400040800000F1 -:104FA00004004000882020000000040004040000E9 -:104FB00004001000000284008400042004030000A8 -:104FC0000000A08000800000002004040080008514 -:104FD000008000800000000100000084000000024A -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 -:10501000000000000000000040000400000000103C -:105020000002400000004091030000000500000263 -:105030004000200000000004000000000000000408 -:10504000090041000010001000000003008400402F -:105050000010000200020004000000020002000232 -:105060000003000000000000000000020000000239 -:10507000000000000000000000040000000000002C -:105080000000000000000000000000000000000020 -:105090000000000000000000000403000000824047 -:1050A0000000840000A00410000000000400900034 -:1050B0000200000020000200041088000000001020 -:1050C000000000000000010000800000050000005A -:1050D00004900200010001000100000090000100A6 -:1050E0000402C140000000000000000000000000B9 -:1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000400000024D -:105120000005000000080021030004040008090035 -:105130000300410805C000000500028400000000D3 -:10514000008202000508040004080040008804846E -:10515000000080200400080020000200000004007D -:105160000800000002050004000000040004000024 -:10517000000000000000000000000000000000002F -:105180000000000000000002000400000000000019 -:10519000000000000000000000020000000000030A -:1051A0000010004100400241840084084011820048 -:1051B00000088400C00000008200C00008008205D2 -:1051C0008400C000C0000020000084000005000032 -:1051D00040008400080000210000008000A00000C2 -:1051E000400000100490009000200000000000002B -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000004000000000000000000000000008A -:1052200021901101030809010004052008040588E4 -:1052300011000000410002000000000221004000B7 -:1052400003100200080204C000A1000000000000DA -:10525000008240880584802000000020414000102A -:1052600000008000000100410011008400000000E7 -:10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A000000082204009080204418204C00400007A -:1052B0000020A040841108400004A0001000C0009D -:1052C0000011000008008200000000200811080002 -:1052D0000800A000C01008000000A10000000000AD -:1052E00082000000004100000000000000000000FB -:1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D -:10531000000000000000000000000000000000008D -:10532000000000000800000080002100000000884C -:10533000000000012100039009000000002000008F -:105340000000000000001100000000080001030040 -:1053500085000800000000000000000020000000A0 -:1053600000000000000000000000410021000000DB -:10537000000000000000000000000000000000002D -:105380000008000000000000000000000000000015 -:10539000000000000000000000000000000000000D -:1053A00000000000000008A01000040000009000B1 -:1053B0000000000082080000000000000840820099 -:1053C0000041004010000000000000000800000044 -:1053D00004008200000000004021840308800100D6 -:1053E0000810100083020000000000000000000010 -:1053F000002000000020000000000000000000006D -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:1054200000000000000000008840400040000088AC -:105430004090409021000500000021000300000181 -:1054400008201000080040044088039021200484B4 -:105450000000200008080882000021000000402011 -:1054600040000001080002010000088408820800D2 -:1054700021000000040808040300000000000000F0 -:105480000000000004000000000000000000000018 -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000840540210441CD -:1054B0000011041140000000900082000004C010A0 -:1054C00000100021000040000000000090000000DB -:1054D00000000410820000004008080082008221C1 -:1054E000002140A100008210820000000020000086 -:1054F0000000004000080020000900200002000019 -:10550000000000000000000000000000000000009B -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B -:10553000000000880000000040880090000000008B -:105540000001000100000000040000000000000055 -:10555000000000000001000000000000000000004A -:105560000000000000040000000100000000000036 -:105570000000000008010000000000000000000022 -:105580000000080000000000000000000000000013 -:10559000000000000000000000000000000000000B -:1055A000000000000000000000000000000003C137 -:1055B0000021009082080288009000089082080470 -:1055C00000400082402000000000000000000000B9 -:1055D00000000000000008A000C000820090000849 -:1055E00000880020008241C005880410401000009F -:1055F00090C0008940080089000000000000000001 -:10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A -:10563000A188008400200004800000800000000099 -:10564000808000000000000000000000000000005A -:1056500000000000000000000080000000000000CA -:105660000080000000000000A0838303C120000927 -:10567000000000C00303000900400000000000001B -:10568000000000000000000000000000000000001A -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA -:1056B00000008000000380000000800080098080DE -:1056C000808000000040800080000000000000009A -:1056D00000000000000000000000000000008080CA -:1056E00000000000000800008000830003200391F8 -:1056F000200000000300200220801089000000002C -:105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 -:105720000000000000000000000000000000000079 -:10573000000000000800C001A008C090A000820086 -:10574000A0C00890C0000802A08210000000000065 -:1057500000000000000000000000000040002000E9 -:10576000A0029000020008900088040008020400D3 -:1057700001A140C000002084040190A001A000000D -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000020A00104010083C0C0041C -:1057C0000020000289202082000200C00510000095 -:1057D0000000000000000000000000000000408801 -:1057E0000008001002A008000000000008000204E9 -:1057F00001A1820111900000080401A00911110407 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 -:1058300000000000000000000000200005008400BF -:10584000808000000080400000000080000089800F +:104F800000000000000000000000000000003C00E5 +:104F90003C00C3C3C3C388040210200088842005DA +:104FA00000108400048020108400C0040408200045 +:104FB0004000A008840440000402000000008810A3 +:104FC0004010210520880084008820804004401083 +:104FD00004008810080800038810C01088028800A8 +:104FE0008800208088004011400084004003880031 +:104FF0000320208002088204048440000500888485 +:10500000890020020003040884112080A1002000F0 +:10501000C000840000000002004000400020400268 +:10502000400000004000000440004000000040003C +:1050300009C00000004009004100000000004004D9 +:10504000200800004000000840200220002020210D +:1050500085C08002000380020000400005C00004FB +:1050600040004000001000000000040009C00500DE +:10507000000088211010A1044102400200402004D9 +:1050800041200802401110040020090200024000E3 +:1050900000841040104000020300000300000410D0 +:1050A00000000004020300100004000000000010D3 +:1050B000000982008205000000000000200888101E +:1050C00000400200030300048200020002000010FE +:1050D00000000200001090000880000000000003A3 +:1050E000000000000804001090100209C000904168 +:1050F0000010020009108204021008400800080095 +:1051000002020000010082100088000002090284EF +:105110000204008002080000000008050408098459 +:1051200009840084058200082000000809000008A6 +:10513000408200000008418800002008000800109C +:105140002108008409084008091040844010000428 +:1051500040840408A0840009001089100000008821 +:1051600005080404058200840008040400100900F6 +:105170000082200804048484040811830509008443 +:105180000484400908081010000804020010000000 +:1051900004104008402000C0208409082004002199 +:1051A00000089005840800080040C021402120200C +:1051B000004100080010000588400441002104005F +:1051C00000210003000000000003000200414041F4 +:1051D0000021008800038408C020104000C10000A6 +:1051E00090080021000800000008000000080008E6 +:1051F0000203000800000008001004000400000082 +:105200000000C008000000000008000300000002C9 +:1052100004100008080000008421000300100003AF +:10522000080000A00000008205000000210000002E +:10523000800803004100000000004100030000005E +:105240000000000000A0100003A0001000004100BA +:1052500000000900000403880084081180A00004F5 +:10526000000000000800000021080400038405007D +:1052700003820400400000001084000100A041C02F +:1052800003000000000008000810084000A000848F +:10529000000109010040030000004140090021A075 +:1052A0004000C00084000000000082000000840074 +:1052B0000800000004000440000004200000C000BA +:1052C000A000C000004000040800C0004002080028 +:1052D0004040A01100059080C000C002824008003C +:1052E00009000000080008008800A00004098400EC +:1052F0001000080000112000C00084090840402070 +:105300004090080408008240840440050002900098 +:1053100082000800100984008221820510008200AA +:1053200040000400100000A00000001000001184E4 +:1053300000000000000021000000008400000800C0 +:1053400000A0000000100000000000081000410054 +:10535000900000000000001000400000000000006D +:105360000088200000001188000005C0090000002E +:1053700000880000000040000982030000000400D3 +:1053800000A02140080008820000000140020484BF +:105390000000030000A000A0410004000000000085 +:1053A000008841C0009000100021C00004200000CF +:1053B00000000008A0000000000008000800000035 +:1053C00088000000000008004000080008000200FB +:1053D0000021C008084082030800A002000000006D +:1053E0000000000800210000000000008400A0214F +:1053F000000000000000A0008400000090400800B1 +:10540000820882000900104100200800000082008C +:105410000000004008210010844010000000080037 +:105420000803001008008200210005040800C09154 +:1054300000000000000002000084000000000004E2 +:10544000000005080800080000A00000000000108F +:1054500080000000000080000820000000000082A2 +:1054600008020000000800100000210000000500F4 +:10547000050008A04100080000000000000000C076 +:105480000000000011000400040000000000000003 +:10549000000000000000000000010000000000000B +:1054A00000000000000800000000C000A000040888 +:1054B00084000000082100058200018000410021D5 +:1054C00008008211000000000010A003820000000C +:1054D0001000080000008200C000A0100000401171 +:1054E000001084030004000084000000002100027A +:1054F000000904000000000000000000020000217C +:10550000840000004000900008000040A00000005F +:1055100040802100A000828000210020008800003F +:1055200082020040841100418400C0080000000095 +:10553000000400000000050000000000200402003C +:10554000000000000000000000000000000000005B +:1055500000000000082000201100000004050000E9 +:105560000200200100000000008411200000000063 +:10557000080000000000000000000800000000001B +:1055800000002004080000000000032000002000AC +:1055900000000304A00041A0110800002109040834 +:1055A000090000C1000800004000000002000000E7 +:1055B000010008000000000002008200000000015D +:1055C00004010000000000000000000000000000D6 +:1055D000000000000000C104A0404140C002C0A083 +:1055E0000102C00802041011209100880010000080 +:1055F000000000000000000000A00040000200C009 +:105600000000000000000000A1C0204000100020A9 +:105610000190400500A100C1C000000804089004EA +:1056200004A00004008204900000000000000000BC +:105630000000080000000000000089008000000059 +:1056400000118021000000080000000000000000A0 +:1056500000000000000000008980858088008080B4 +:10566000808021802100808020C180A141900004A1 +:10567000000000000000000000000080000000802A +:105680000000000000000000000089808080008091 +:105690000000100480882002000280000800000042 +:1056A0008080108000800200008000000000000068 +:1056B000000080008000800000000000000000006A +:1056C00000000000000000000003000000000000D7 +:1056D0000000000000000000000091800300101096 +:1056E000032180802110080900201020401188002B +:1056F000A008000000000000000000000000000002 +:105700000000000000000000000000000000002079 +:1057100000A00000A00021059191900300802102CB +:10572000C080C1C0A000A010C100C14000000000A6 +:105730000000000002000400020000000000000061 +:105740000000000000020000000000010000000056 +:10575000000000000000000000000000040810002D +:10576000100041010808030100098201898210012B +:10577000A104020000000000000000000000000082 +:1057800000000000000000000000000000002000F9 +:105790000400408488100302112005411101A0106B +:1057A000A101A184919008080801A0101120000017 +:1057B00000000000000000000000000000000000E9 +:1057C00000000001010000000000000000000000D7 +:1057D0000000000000000000000000000000104178 +:1057E0000003840291C000A100090000C0A1A088AC +:1057F0000108018484C000000000000000000000D7 +:1058000020000000000090000000000000000000E8 +:1058100004900088C00210C0820000000000030055 +:10582000002100A000040009040200100004820806 +:10583000000000000000000000030020000400043D +:1058400000050005000511100000040041000000E3 :105850000000000000000000000000000000000048 -:105860000000000000808000000000000000080030 -:105870000041209000210904000000411090022105 -:105880008988000000000000000000000000000007 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 -:1058B0000000000000000000000080000008000060 -:1058C0008000800080008000000080028000008056 -:1058D00000000000000000000000000000000000C8 -:1058E0000000000000050080000080000002800031 -:1058F0000000A140C12141800403000021C0A1801B -:105900008480021000000000000000000000000081 -:105910000000000000000000000000000000000087 -:105920000000000000000000000000000000000077 -:10593000000000000000000000000000C000A00007 -:105940004004A0001000044008C088000401208426 -:105950002084200000000000000000000000000083 -:1059600000000000880008C00808900008002021FE -:1059700084048200C10040918484040100008304F7 -:105980000802058441010000000000000000000042 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C000000000000000000000000700842100002B -:1059D00000000000000000000000000000000000C7 -:1059E00000000000000000000000070000000000B0 -:1059F000000007000000000000E0000000000000C0 +:10586000009000C080892189000200030003A0820B +:10587000000002002100088000000000000000007D +:105880000000000000000000000000000000000018 +:10589000000083000080808000800000030008007A +:1058A0008910000800A1000200C180800080000073 +:1058B00000800000000000000000000000820000E6 +:1058C00000000000000000000000101002000800AE +:1058D00005000000000000000000000000000000C3 +:1058E0000000410010210000051182200004830007 +:1058F0000000C02008C1A00020020000000000003D +:105900000000000000000000000000000000000097 +:10591000000000008000808000008000080010A0CF +:105920000980111009099020A0004002400921407F +:1059300008008804000000000000000000000008CB +:105940000010000000000000000000000101000045 +:105950000000000000000000000000000000000047 +:1059600000000000018801A100900000C0000200BA +:1059700040A0400004C1A12104C09001000000002B +:1059800000000000000090000000C00000000000C7 +:10599000000000000000C00002108810880083C0D2 +:1059A000A0828802C10100030290040088008811CF +:1059B000A0881190A101000000000000000000007C +:1059C000000007000000000000E0000000000000F0 +:1059D00000E00000000000000000000000000000E7 +:1059E000000000000000410000E00000810A821178 +:1059F00000E007005006004200E0070082000000BF :105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 -:105A4000FFFF5F0AB2B2B2B255555555C3CFE3EF6F -:105A500055555555083C383C00000000000000003A -:105A60000000000000000000AAF0AA3C20E02FEF98 -:105A7000AAF000F000000000282803C33F3F030302 -:105A8000000028003C14D714171700000000000085 -:105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000000000000F6 -:105AB00000000000000000000000000000000000E6 -:105AC000000055557D28F3F330303C3C5535F3FF4D -:105AD000E3EF4155055508003800000000000000C4 -:105AE00000000000000000000000AAF0AA3C20E036 -:105AF0002FEF3C3C3C3C0000000028283FFF7D7D10 -:105B0000414100000C003C30D71417170000000082 -:105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 -:105B30000000000000000000000000000000000065 -:105B40000000000008F80DFDFF00FF004545FF00C4 -:105B5000BEFF140050D050504B4B4BC30000000010 -:105B60000000000000000000000000002028A0AAA3 -:105B700038380038F5F5F505FEFE0E0E3C3CFF000A -:105B80000A0ACACA00000F0F5555FC5CFC5C0000F5 -:105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000000000000000E5 -:105BC00000000000000000000000C3C3F0F0757585 -:105BD000FF000F0F0F0F50D050F04B4B4B4B0000FE -:105BE0000000000000000000000000000000AAAA61 -:105BF000AAAA000000383C3C3C3CF4F404040F0F1B -:105C00005555FAFACACA0000FF003C3CAC0CAC0C7B -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C40000000000000000000A0615006001D0000E0 -:105C50000000000000000000000030000000000014 +:105A1000000000000000000000000000070000116E +:105A2000000A00E00700000000000000070041003D +:105A3000000000E00700000000000000000000007F +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A6000000000000000000000000000FF3FF00008 +:105A7000000800AA4040F0F0350500003535AA00C6 +:105A8000000000000000000000000000F0F0000036 +:105A90000000000000000000000053F3A0A00FAFC2 +:105AA00003BF3FFF2FFF00000000FA3FFA3F7C7D5D +:105AB00054555F0043003F153F2A000000000000DE +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE0000000000000000000000000000000AF2FD8 +:105AF000F000000000AA00000000F5C5FFFF3535EA +:105B0000AA00000000000000000000000000F0F00B +:105B100000000000000000000000000003A3A0A09F +:105B20000FAF03BFFFFFFFFF000000000A3F0A3F67 +:105B3000AFAA83825F5F4343CF45CF8A0000000056 +:105B40000000000000000000FD7DFD7D0000000061 +:105B50000000000000000000000000000000000045 +:105B6000000000000000000000000000DEDEDEDFBC +:105B70005557F7F7FFFF08000000FCFC5555F330C0 +:105B80000000000000000000000000000000000015 +:105B9000C0C2000000000000000000000000414101 +:105BA000404FFFFFA0F5AFFFAFFFCA000000C000ED +:105BB000C00054FE04AE00400000050001000000DB +:105BC0000000000000000000000001410141000051 +:105BD00000000000000000000000000000000000C5 +:105BE0000000000000000000000000000000CECE19 +:105BF000DEDEFFFFAAAAFFFF080000000000FF0092 +:105C0000F3300000A2FF00000000000000000000D0 +:105C10000000C3C2000000000000000000000000FF +:105C20007D7D707F3C3CA0F5AFFFBFFF0000000012 +:105C3000C000C00054FE04AE00500050010005003A +:105C400000000000000000000061000E000D0000D8 +:105C5000006100060009200000650002000D000040 :105C60000000000000000000000000000000000034 -:105C7000000040080000000000003E080000000096 -:105C8000A061500300050000000080615006000D77 +:105C700000410007C09D0000A061003FC00100007E +:105C80008069003F009D000000000000000000004F :105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 +:105CA0000000A5005000059000010061303F000198 +:105CB00000000061000E000D00000060000F000DEC +:105CC00000A0000000000000000000000000A20092 +:105CD000A2A200000000C1C1FFFFFFFFF0F0000022 :105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 -:105D00000000EB03EB3FC2C200C30000AA20AAA020 -:105D1000AE00FF00000000000000000000000000D6 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 +:105CF0000000C30055550000000005050F0F0F0FF1 +:105D00000000F0C0FACA000000000000000000001F +:105D10000000000000000000000000000000000083 +:105D2000000000000000000000000000EEFE000087 +:105D3000FFFF0000005500000000A0A0008228AA7C :105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 +:105D5000510051510000000000FF00FF7FFF70F074 :105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D800000000000EB03EB3F020200C30000AAA0EA -:105D9000AAA0FF00FF0000000000000000000000BB -:105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 -:105DC00000000000000000000000000000001E1E97 -:105DD000FFAA00000000000000000000000000001A -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000F3C555508CB38FB000097 -:105E10000000A2F343034303000000000000000061 +:105D700000000000C300D7D7C3C1C1C100000000AC +:105D800003070000FFCFFACA000000000000000077 +:105D90000000000000000000000000000000000003 +:105DA0000000000000000000000000000000BBFB3D +:105DB0000000FFFF000000150000DF5FA0A0A8A802 +:105DC000A8A8000000000000000000000000000083 +:105DD0000000000000000000000000000000FFEBD9 +:105DE000554100000000000000000000000000001D +:105DF0000000000000000000000080800080000023 +:105E00000000000F000F0CFCFAFAC3FF05050000AC +:105E10000000000000000000000000000000000082 :105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 -:105E50001E1E5500000000000000000000000000B1 -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 -:105E800000000000000000000F3C555508CB38FB17 -:105E90000000AAFFA2F343034B0B00000000000028 +:105E3000300030000FAF0CAF00000000AAAAF0F055 +:105E400000000000A3AFAFAF0000000000000000A2 +:105E50000000000000000000000000000000000042 +:105E6000FFAA550000000000000000000000000034 +:105E70000000000000000000000000004343C34396 +:105E800000000000000F000F0CFC0A0AC3FFF5F52C +:105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000000000000000000E2 -:105EC00000000000000000000000000000000000D2 -:105ED000000000008400200082040000000088040C -:105EE00088040400880004042000840804000000E2 -:105EF000400082080200000000000200020040048E -:105F00000003000000008400080000000000000002 -:105F10000000000000000000000000000000000081 -:105F2000000300000000000000000000000000006E -:105F30000000000000000000000000000000000061 -:105F40000000000000000000000000000000000051 -:105F50000000000009000000000004002000000212 -:105F60000000000000C02000000000000000000051 -:105F7000000000000000000000000000009000820F -:105F80000000200000C000020000800000000000AF -:105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD0000000000000000000000982000000020034 -:105FE00000000010001000000000001000008210EF -:105FF000000004400000004000000000000000001D -:106000000400000000000441000000100200000035 -:106010002000000008000000000004000000000054 -:106020002000000000000000000000000020200010 -:10603000040000000000000000000000000000005C -:106040000000000000000000000000000000000050 -:1060500000000000000000000000040000000082BA -:10606000049004880900044000004000008204C03D -:106070000500000003040288000000000200000088 -:1060800040000000000004000000040000000400C4 -:1060900000100200000002000000044000000000A8 -:1060A0000400040004002000000000004000040080 -:1060B00000000000000000000000000800000008D0 -:1060C00000040000000800000000000000000000C4 -:1060D000000000000000000000009004C00000006C -:1060E00008008203400088008800080000000000CB -:1060F000C0008400C0000000080002004000000052 -:106100004000820082000000A00088000000C00063 -:10611000000000004000000088000000A000000017 -:10612000000000000000000000000000000000412E -:10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:106150000000000000000000000000000000030438 -:1061600003000300050008000800080021000000EB -:10617000000000000000030000000000000041409B -:106180000800000000000000402000880088030094 -:106190000200020021002100410008000000000070 -:1061A00000A00002000800000008009000000000AD -:1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000011AE -:1061E0008200000000000011A04000200000000418 -:1061F000000000040040C00008020002002000006F -:1062000008000000A00000000000040000000000E2 -:10621000000008000804000000000000000000006A -:1062200000400000000900000000000000004000E5 -:10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:10625000000000000000000000000000000000003E -:10626000000000004000000040000000200040004E -:1062700000C0004000000000000000880000000096 -:1062800000000400000004000000400008000000BE -:1062900000000000000000020000000000000000FC -:1062A000000040000000000000000000000040006E -:1062B0004000040011002100000000000000000068 -:1062C000004000000000000000000000000000008E -:1062D00000000000000000000000000000000000BE -:1062E00000000000820000004000100000000000DC -:1062F00000000000820008000010000000000800FC -:10630000000000000000000000000000000000008D -:1063100004000000000000008200000000000000F7 -:10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:10635000000000000000000000000000000000003D -:1063600000000000090403040300000041041010B1 -:1063700041000000000000000000200000000000BC -:1063800000000000000040040000000000000004C5 -:1063900008000000110000000004110008000800BF -:1063A000032000000000080821000308030000008B -:1063B00000000000100000000000000000000000CD -:1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E0000000000000000000080000000000840021 -:1063F000000000000000000000000000000000009D -:106400000000000010000000000000000800000074 -:106410000000000000000800080000000000080064 -:1064200088000000000000000000000000000000E4 -:106430000000000008000000000000000000000054 -:10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:10646000000000000000000000000200000000002A -:10647000000400880040209002000000020000009C -:106480000400000000000000000000000000000008 -:1064900000000000000000000000080000004000B4 -:1064A00000000000000000000000000008000000E4 -:1064B00000000000080000000000000000000800CC -:1064C00000000000000010000300000000000000B9 -:1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C +:105EB0000000F4C434040FAF0083000000000000B1 +:105EC00000F000000000A0ACA0A000000000000056 +:105ED00000002000018004008504401040040400FC +:105EE0000400C0000400200010800000880520008D +:105EF0002008040084002010040088050010880594 +:105F000004C00482848885042084400808040000BA +:105F100000100003891020008900400020000400C8 +:105F200004002000200040008200C00520802005E1 +:105F3000048004808410890084048500C00020004F +:105F40000210040082000400000204208200840089 +:105F5000201120002100400400C0100005000000B6 +:105F60004000200000908000000089022000000016 +:105F700000000000090000002100020840C00000ED +:105F80002004001105030002100000100900C18563 +:105F9000040041000000200000000400100209007D +:105FA00080000900400009000400000000000020FB +:105FB0000000A120412000000200000004000000B9 +:105FC00010A000004000000010000004000140820A +:105FD00040A005200400000040040020021002043C +:105FE0000000000000400202000400100000020057 +:105FF00002100008100002100200A040000400106F +:106000000200004102410202024000090010022089 +:10601000022005410980000000000000010001107D +:10602000000000000040820000000009000482051A +:106030008820840482A0000420400000880582801B +:1060400002090204004000400800820084000402AB +:1060500010000205020000100408401102090000AF +:106060000408041000100088401100080488030888 +:1060700000080000048400880008008400080984E7 +:10608000000840840008008405850485008400849D +:1060900009050401C082C020000041840484400836 +:1060A00040040008040800100004048409100408D7 +:1060B00040100489020004210209048820082008F5 +:1060C000000400080008040009850508008220106B +:1060D0008805201004040484090811210108012105 +:1060E00000080003000800400021000800204008CC +:1060F0000040100908000010000300000008000024 +:106100000010000000400009000883000002A00504 +:106110008403000390218810820800009004000589 +:10612000C020000500030020C0008208000888216C +:1061300088210000882100108208842001080021A5 +:1061400000C020200002002100000080104000104C +:10615000002100C1002190050000882120002000BE +:106160002000008200A0000003A0000000401011E9 +:10617000000000A0030000000084000000000000F8 +:10618000000000000000030000000300400208833C +:1061900000100300110011000882038400000509AB +:1061A00041C041A10000210000A12100038209009B +:1061B000050008000300000008080340040108006F +:1061C00000002121890908A041A00000084010001A +:1061D00000844008000403080008408440002000B8 +:1061E000000400001004C0000800C0000000080007 +:1061F000081000800800C0004000820484000800ED +:106200000000000008400400900000001000088416 +:106210000000080020000200C00004200820000048 +:10622000A109040041000800C002C009C0004000EC +:1062300000040800C0090400400000094040881123 +:106240000804A000A020830210000000080920001C +:106250000800088000000800042008418209A0000E +:106260004004030121100001410000000008000863 +:10627000008800820002048400000000000000008A +:106280000000030010000000000009C009401100D8 +:10629000000200000008410880100800800004117E +:1062A0000000200000008400030000A020C040A0E7 +:1062B00003002184418800004100832003008040C6 +:1062C00000C010A0040000210400080041004104A7 +:1062D00040000320002000400200000010100000D9 +:1062E0002000000008210080080800020000A00330 +:1062F00000000000C021000000100010000000009D +:106300000000000000000021000008000000001153 +:10631000080040210800C0218203A08920800208D3 +:10632000C00000000000A0082000C008100000000D +:106330000803A000A00008088202840800000000F2 +:1063400000000000000010800521082108008400E2 +:106350001000A1000000000500000400A0000800DB +:1063600000004021000000000020050000000000A7 +:1063700000001000090000000000000010000000F4 +:1063800000000000000000000000000000000808FD +:1063900008C00388A1080000000000000010802051 +:1063A000801040000000000000008000020011008A +:1063B0000000080000000000000000C00000000015 +:1063C0000020000009840000001084840384001071 +:1063D00041A00000082041040008090283080800C9 +:1063E0000000000080000100000008000004000020 +:1063F0000000000004000000000000000000004158 +:1064000000040005002100000000001082000800C8 +:1064100000000800000040A19021042190210421E7 +:106420000410002000000000090000000800040221 +:106430000800009000000021000000008400080017 +:106440000008400083800080080000000000022057 +:1064500082021004820900090400108000048200F6 +:106460000021A00500080005400000000000000118 +:1064700041000000000400000000000000000000D7 +:106480000000000000000000000000000000040008 +:10649000000000000000000090020000000020004A +:1064A0008000800000014100000020000000410049 +:1064B000030000000020000003A0000000000840CE +:1064C000009000008000402000208000000000407C +:1064D000000100000400000000000900002040004E +:1064E00011900200000410000200000101001100E0 +:1064F0000000000000000000000000008500000017 :10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B -:10652000000000000000000000000000000000006B -:10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB -:1065B00000000000000000000000000000000000DB -:1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A -:10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA -:1066A0002000820020000000000000000000000028 -:1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 -:106730000000000000000000000000000000000059 -:106740000000000000000000000000000000000049 -:106750000000000000000000000000000000000039 -:106760000000000000000000000000000000000029 -:106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 -:1067900000000000000000000000000000000000F9 -:1067A00000000000000000000000000000000000E9 -:1067B00000000000000000000000000000000000D9 -:1067C00000000000000000000000000000000000C9 -:1067D00000000000000000000000000000000000B9 -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 +:106510000000C008000800A00208000100010001FE +:10652000000090880000020420020000000001002A +:1065300088000000000000000000000000000000D3 +:1065400000000000000000000400000140A0401016 +:1065500000A090C000A0000000840000400800409F +:106560000888A04000000000840000000002050030 +:106570008200000200000000000000000009030883 +:1065800000080009000000000000000000000000FA +:106590000000000080800080008000800041000832 +:1065A0000010000305804100C10000000000000051 +:1065B00008000300000000000000000000000000D0 +:1065C000000000000000000200038000000891802D +:1065D0000000050080000000000000000000808036 +:1065E0000500C08080000000410000000000054060 +:1065F0000400200302210000000000000000000051 +:106600002180104003A000000000000000000000F6 +:10661000000000000000800000890080800002006F +:10662000090010001041C000204088842180000033 +:1066300010400900400009000000000000000000B8 +:1066400000000000000000000300200003004000E4 +:1066500000008003008980800000008080008000AE +:106660009000081182C00900000000000020000016 +:106670000004010000000101000000000000000013 +:1066800000400140010101890000000000000000FD +:1066900000000000000000001000201002A0040014 +:1066A00041409000A0000001400004C00305110417 +:1066B0000000010100000000000000000040000098 +:1066C000000000000000000000000090000000003A +:1066D0000040200082014041C0900400C0020888B0 +:1066E0001000880001000405040000000000000004 +:1066F0000000000005014001010100000000000051 +:10670000000000000001A0000000000000000000E8 +:1067100000000000000000000000020200100084E1 +:106720001184000000008900000001400020A088C2 +:1067300084A00000000100009001000000000000A3 +:106740000000000000000000000000000100000147 +:1067500082010101404000089040A102C0000000F9 +:1067600000000000A020000000038490000102004F +:106770000000000000059104000810020000000065 +:106780000000000000004104880900200000000013 +:106790000000000000000000000000000000008079 +:1067A0000000890000004100A10003000404002152 +:1067B0000010A08300000004000900210010000068 +:1067C00000000000000000000000000000000200C7 +:1067D00040030321110380800080800041808000FD +:1067E0000000000000000003002100A100C1002003 +:1067F0008004000400104100080421004020000033 +:106800000000000000004180020920000510000087 :106810000000000000000000000000000000000078 -:106820000000000000000004008000800000000064 -:106830000000000000000000000000000000000058 -:106840000000000000000000000000000000000048 -:106850000000000000000000000000000000000038 -:106860000000000000000000000000000000000028 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 +:1068200080808000000021A1400005802010809120 +:10683000208500A18041000000000003000000113D +:106840000000000300000000000000000000000045 +:1068500011A1214021000005800980A00000000056 +:106860008000001000808000800200C00000001046 +:10687000000000000000000001880100010001018B +:10688000000000000000000001C001000000000145 :1068900000000000000000000000000000000000F8 -:1068A00000000000000000000001000200400000A5 -:1068B00000000000000000000000000000000000D8 +:1068A0000200108208880000010901C001400000B8 +:1068B000C0C1909090418801000000880000000055 :1068C00000000000000000000000000000000000C8 -:1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000000000000000000000000000057 -:106940000000000000000000000000000000000047 -:106950000000000000000000000000000000000037 -:106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 +:1068D00000000041000001000000C00020089020DE +:1068E00082000400A0C1C082A00004100402202085 +:1068F00004010000000000000000000000E00700AC +:106900000000000000000000000000000000070080 +:106910004200000000000000000000000000000035 +:1069200000000000000000004200000000E0000045 +:10693000000A000000E0070084820000000000E080 +:106940000700000000000000070000000000000039 +:1069500000000000000000E007000000000A00E066 +:10696000070000110000000000005000000000E0DF +:106970000700000000000000000000000000000010 :106980000000000000000000000000000000000007 :1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 -:1069B00000000000000000000000000000000000D7 +:1069A000000000006F6FFF66000042F3000000006F +:1069B0000000000000F0FFFF6F6F6F6F000000002D :1069C00000000000000000000000000000000000C7 :1069D00000000000000000000000000000000000B7 -:1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 +:1069E00000000CFF8DFF8190C3F000000000B0207C +:1069F000BF2FFF7E3C7E0000000000000000000072 :106A00000000000000000000000000000000000086 :106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 +:106A2000000000000000FF6F6F66000042FF0000E2 +:106A300000000000000000F04FFF03000F0C0000FA :106A40000000000000000000000000000000000046 :106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 +:106A60000024FFFCBDFFBDFF8190C3F000000000CB +:106A7000B0B0BFBFC34200420000000000000000F1 :106A80000000000000000000000000000000000006 :106A900000000000000000000000000000000000F6 :106AA00000000000000000000000000000000000E6 @@ -71362,971 +71362,971 @@ :106AF0000000000000000000000000000000000096 :106B00000000000000000000000000000000000085 :106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 -:106B3000000000000000007C007C0000000000005D -:106B40000000000000000000000000000000000045 +:106B200000000000000000000000FFFFFFFF0F0159 +:106B30000F000000000008090809464676763C3D33 +:106B40000001000000000000000000000000000044 :106B50000000000000000000000000000000000035 -:106B60000000000000000000000000000000000025 -:106B70000000000000000000000000000000000015 +:106B6000000000000000000000C300000000F0F082 +:106B700000000000F0F0F2B066FF660000000000C8 :106B80000000000000000000000000000000000005 :106B900000000000000000000000000000000000F5 -:106BA00000000000000000000000000000000000E5 -:106BB0000000000000000000004000400000000055 -:106BC00000000000000000000000000000000000C5 +:106BA000000000000000000000000000FFFFFFEFF9 +:106BB0000F000F000000000000000000464676763F +:106BC0003CFF00C3000000000000000000000000C7 :106BD00000000000000000000000000000000000B5 -:106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 +:106BE000000000000000FF33991100C300F9FFFF0F +:106BF000F0F0FFF3FFDBF170F3303C3C3C3C000075 +:106C00000000000000000061000F050D0000000002 +:106C100000000000000000610A0E000D00000000EE :106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 +:106C300030000000000000210006000D0001A561E9 +:106C40004A0D051D00A000000061000F05050000B1 +:106C500000000A0800000000000000000000000022 +:106C60000561000E050900A0A061003F000D0005B0 +:106C700000003000000000008061000F00190000DB +:106C800000610006000D0000AA0FC3FF7D7D0F000C +:106C9000000000000000000000008200F000000082 :106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000000000000000000D4 -:106CC00000000000000000000000000000000000C4 -:106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 -:106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 +:106CB0000000000000000000F0C0F0F00000000044 +:106CC00000FF00FFFF00FF0000000000000014D7DD +:106CD00034F7000000000000000000000000000089 +:106CE000000005AF00AAF0F0005500000000000011 +:106CF00000000000000000000000000000003CBC9C +:106D00003CBC00000000CF8A3F2AAA0FC3007D7D53 +:106D1000FFF00000000000000000400082000000C2 :106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 -:106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000000023 +:106D300000000000000000000000F0E0F0F00000A3 +:106D4000000000FF00FF7F7F5F5F00000000000089 +:106D500000C320E30000000000000000000000006D +:106D60000000000005AF00AAF0F000550000000090 :106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 +:106D80000000FFFF00000000CF453F15282800004D +:106D90003C3C5F50000000000000000000000000CC +:106DA0000000500000000000000000000000000093 +:106DB0000000000000000000000000000C0C5D5D01 +:106DC00050505454000000000FFF0FFF000000005F +:106DD0000000FFFFFF3A000000000000000000007C +:106DE0000000000000007D417D410000080000001F :106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 +:106E00000000000000000000000000000000282832 +:106E10000000FFFF5F50000000000000000015555B :106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 +:106E300000000000000000000000000000000C0C3A +:106E40005D51A0009414000000000E0E020200002C +:106E5000000000000000003A0000000000000000F8 +:106E60000000000000000000FFC33C000000000024 :106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E9000000082088240840420040380000420044F -:106EA000000082000004000800000000A0000404AC -:106EB0000000000020040004040040000011000451 -:106EC00000020080008000020000000000000000BE -:106ED00000030000000000040000000000000000AB -:106EE0000004000000200000002000040000000456 -:106EF000000400000000000000000000000000008E -:106F0000000400000000000000000000000200007B -:106F10000000000200000000000840A008200090CF -:106F2000400200000000000000020082008200A079 -:106F3000000000000000000000400000000004000D -:106F4000000000000020001000050000000000000C -:106F500000000000000000900000000000000000A1 -:106F6000000000000000000300000003000100001A -:106F7000000100010002000000000000000000020B -:106F800000000000000200000000000000000000FF -:106F90000000000000000000000004410410082070 -:106FA0000880000000004000000088000000880009 -:106FB00000000000000000000000001000000000C1 -:106FC000000004000800010001000580040000002A -:106FD00000000000000000000400000000000000AD -:106FE0000000000004000400000000009000010800 -:106FF00011802080208000000000000000000000C0 -:107000000000000000000000000000000000000080 -:107010000000000000000404414002840090804110 -:107020008441802004100400A0002010000400907F -:10703000419040044008000802040402008400005B -:10704000000040004008800004840210041000008A -:1070500004000008200800000002000000000000FA -:1070600004000000000000020000000040000000DA -:107070002001A00480088008000000020000000039 -:1070800000000000000200000000000000000000FE -:10709000000000000000000000089008C0409000C0 -:1070A0008820044008000888C00084000008000010 -:1070B000000000000000040090000000000000003C -:1070C00090000000100040000000C080000004207C -:1070D000900000000000004000000021880820020D -:1070E00010004000000000088411000300000000B0 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:107110000000000000000000000008000000000067 -:10712000000000019000000080201000000000001E -:107130000000000000000008000000000000000047 -:107140000000080003000300000000000010000021 -:10715000808300000000000000000000000000002C -:1071600000000000000000000040000000000000DF -:107170000088000000000000000000000000000087 -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000800E7 -:1071A0000000840000400441044008000000820008 -:1071B000000000000800080082000000000000201D -:1071C0000040080000040000000000000000000073 -:1071D00000098200000000000420000000000004FC -:1071E0000000080082004040040082000000C1004E -:1071F0000009000200020000000000000000000082 -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000002006C -:10722000210004004100040180408400090408009A -:1072300002080000100000000300032011040000F9 -:1072400000000000040000004004030040C00000F3 -:107250000800008800100000100800001000000066 -:1072600000880000210000000888000000000000E5 -:1072700008000000400000000000100010000000A6 -:1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00000000000000808000000040001000000C9 -:1072B00000001000000000000000000000000000BE -:1072C0000000820000000000C00008001000000064 -:1072D000000000000000000000000040004000002E -:1072E0000000000000000000000000000800000096 -:1072F0000000C0000000A00082000000C0000000EC -:10730000002000000000000000000000000000005D -:10731000000000000000000000000000000000006D -:10732000000000000000000008000000050004004C -:10733000000000000000000000000000000000004D -:1073400000000000000000000000004000000000FD -:1073500000000000000400000220000000000800FF -:10736000000000000000000000000000000000001D -:10737000030000000000000000000000000000000A -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000900000800000000000000CC -:1073B00004800000004000410000000000000000C8 -:1073C000000000000000000000000000820000003B -:1073D00000000400000000000000000000000000A9 -:1073E00084210021000000000000000000000000D7 -:1073F000080004000000C000040083000400000036 -:10740000000000000000000000000000000000007C -:10741000000000000000000000000000000000006C -:1074200000000000000020402004000000002000B8 -:107430000000832002000002200400042088410094 -:107440000200004008400000080000400200000068 -:10745000000000000800008800000000210000007B -:107460000000050000000000000000000000030014 -:1074700000000000000005004100000008000000BE -:1074800000000000000000000000000000000000FC -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00088C0904000020882000000000000000028 -:1074C00000000000000000000000000000000000BC -:1074D00000000000000000002088010202200210CD -:1074E000000000000000000000000000000000009C -:1074F00000000000000000000000010200100088F1 -:107500009082000101000101000000000000000065 -:10751000000000000000000000000000000000006B -:10752000000000000000000000000000000000005B -:1075300000000080000000800080000000000000CB -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000418000006A -:10756000808000000000000000000000000000001B -:10757000000000000000000000000000108000007B -:107580000080800000411005022000030000000080 -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B0000000000000000004000000000080000047 -:1075C00000050010000000000000000000000000A6 -:1075D00000000000000000000000000082008203A4 -:1075E00008002080000000000000000000000000F3 -:1075F000000000000000000000000000000080000B -:1076000080110080000005004000200041050000BE -:10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A -:10763000000000000000840084C0A0C0C0400040E2 -:107640000000000000010000000000000000000039 -:107650000000000000000000000000000000020028 -:1076600002018800009000000000000000000000FF -:10767000000000000000000000000000000000000A -:107680008800040182400000004000000100010069 +:106E800000000000000010000000000000000000F2 +:106E90008403C000400988098800C00284042004DB +:106EA00010050400040010050404201000904008A0 +:106EB000400088004010408088002010840020049A +:106EC00088008800A000210220000400A010000516 +:106ED000000320088402040040000400C00088046D +:106EE00084008980880004020400208520000410AA +:106EF000848420008800200420048200840520046B +:106F0000040482820400208404840002200504100A +:106F10004000400040001000200000004001000040 +:106F20000400092000020000200020002190102011 +:106F300021009082000004002010000000000000EA +:106F40000002400000000000080140000000400274 +:106F500004000000100000012100A100000000005A +:106F6000000204001002410009010000001040006E +:106F7000000000200500410004000400200010A0D3 +:106F800010020000200240000002200200900000D9 +:106F90002102218200000004201000000040A00413 +:106FA00000000409000400000010080202000005AF +:106FB000020000400040820002090000104002046C +:106FC0000204820882200008C02000080008000097 +:106FD00000000003000000009010080500000040C1 +:106FE0000809021000088380058088908480820050 +:106FF0008200020000200800820002090200020054 +:1070000002000200200000000280001002210400A3 +:107010000000000000000040040884840208418849 +:107020000008000840080400000800080000408232 +:10703000004009840084100840084182410800880B +:10704000000800880988000905104040000004106D +:1070500003080084051000000040008440040584FB +:10706000041082104008001140024002050800028E +:107070000088000800080041000400000410000817 +:1070800000084088008405080004051000080082FC +:10709000088240040208200800000000200510219A +:1070A000000500100041822000000040002108403F +:1070B00004000020880800210021080000080002C8 +:1070C0000041002100080003084100210840004160 +:1070D000000000034000C0110000822100050008EC +:1070E0000008000000000009000202030408000577 +:1070F00000100000001008210020002100080000FE +:10710000822100102003A008001008900808400207 +:1071100000100000002000404040000800008000F7 +:1071200000100800000000000300008200000000C2 +:10713000030080000001000000000000410000008A +:107140000001000000000000110008002100030001 +:10715000210041200010000800080000000000008D +:1071600000C00000000008000800108300000300B9 +:107170000000040121000000400403012100080078 +:1071800000000000210200000000030000080001D0 +:107190009001000800820008219000000800000013 +:1071A0000000040000020000080082000000080047 +:1071B00000001000A020000004208220040008002D +:1071C0000804840000000000820010000880001104 +:1071D0008400820204040805040082000000A0006C +:1071E0000809080090200804000040000800000082 +:1071F0000809088240000002000005008404100015 +:107200004000C00482040441040000000440C000A7 +:1072100008000009000208219040080000890000D1 +:107220000000008200C000000000000005000840CF +:1072300000100004004000090000000100010000EF +:1072400000A000A0030000000004080002A000024B +:107250000590000000000000000011004100000047 +:10726000040041000282000003C041000000000051 +:107270000500410041092090000840828400000878 +:10728000000000100400219000000000102000A069 +:107290004100000241040300030800000000000256 +:1072A000000000000000004000080841000000004D +:1072B000002100400000000000000000080008203D +:1072C00000000000000000000000000000000000BE +:1072D000A000080000080000000500008200000077 +:1072E0000000A0030000822082000008C0210810D6 +:1072F000020800004000C04182000000002100039D +:1073000088030008004000210003A000080000419D +:1073100008001008000010000000100082030000A8 +:107320000000000000840808008400000000000045 +:10733000000000000800000003000000000800003A +:107340000901000000000000000000C00000030070 +:107350000084080403000088000000200420048842 +:10736000119000000004088400A0208200000000AA +:1073700080018000050090000000080000840000EB +:1073800008000500000000000300000000002000CD +:1073900000840000000010080000000000000088C9 +:1073A00010000500000000210000900000000021F6 +:1073B00000210009C00800000000000000000000DB +:1073C00082004000080000000000000008050405DD +:1073D0000800040000200008000000210420000430 +:1073E0000000080000000041000990800800000033 +:1073F0000008C08940000808C0000008000882009A +:1074000000050020202104200021200000001000A1 +:107410000000820082000000000084404000410023 +:1074200000009000002100000000000000000000AB +:107430000000000000000002000000000000200426 +:10744000000000000000000000001100000021000A +:107450000002000000000001009000000000000099 +:1074600000000000000000000200410003100000C6 +:10747000000000000020000000C04000000000C02C +:1074800002002100000100000000000000000900CF +:107490001102000000004000000000000400000095 +:1074A000400041C009A040000000000000000000B2 +:1074B00000010101100000010000000000000000B8 +:1074C00000000000000000000001000100000000BA +:1074D00000000000000000000000A0018200000089 +:1074E000000000000000000000000000000110008B +:1074F0000000C0C0A082A1A08402900300118404F7 +:107500008808000800080000208800000000000033 +:10751000000000000000000000000004890541890F +:1075200008400000000008010000000000001100F9 +:1075300000000010081000400021000000000000C2 +:107540000000000000000000000000100010000318 +:107550000002000000000000000004098910002063 +:1075600000400000000000000000000000050403CF +:10757000004000114089A1830282801004C10203EF +:1075800080C08085008000800000000000000000B6 +:107590000000000000000000000000004082A02168 +:1075A00004C08003000904108008004000000000AF +:1075B0000040000010000400000010050000000062 +:1075C000000000000000000000000000800000003B +:1075D0000000800000000000000000008880200003 +:1075E0004100024000000000000000000000118087 +:1075F000100005004141410003000303038983801B +:1076000009008500C110800080408000000000005B +:1076100000000000000000000000000000008200E8 +:107620000221A00041030000000000000000000053 +:1076300000000000000001820000000001000000C6 +:107640000000000000000000000800000008080022 +:1076500040000400040000000000000000000910C9 +:1076600088000000A00000000000000000000000F2 +:10767000000401000100014100200000000100059C +:10768000880220004000118208000201844004208A :1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA -:1076B00000000000000000002110008240108488BB -:1076C00000000000000000000000000000000000BA +:1076A0008982C10003008301000000000000000087 +:1076B00000000000000000000000000000010000C9 +:1076C000000000000000000000000000900000002A :1076D00000000000000000000000000000000000AA -:1076E0000420A0859083001100000000000000002D -:1076F000000000000000000000000000000000008A -:10770000000040900088400400C00001000100001B -:107710000001000000000000000000000000000068 -:107720000000000000000000000000000000000059 -:107730000000000000000000000010000080800039 -:107740008380000000000000000000000000000036 -:107750000000000000000000000000000000000029 -:10776000000080C180100021009000000000000097 -:107770000000000000000000000000000000000009 -:107780000000000080000000008000800002030272 -:107790004003004100000000000000000000000065 -:1077A00000000000000000000000000000000000D9 -:1077B0000000000000000000000000008020808821 -:1077C000009180000420210002000200000000005F +:1076E0000001000100010000000000000000000097 +:1076F000000000000000A0000000C083008884C0DB +:1077000041890240009183051002821000A000848C +:107710009088000000000000000000000000000051 +:107720000000C01101030090A085000000000400CB +:1077300000000000000000000000000910111121ED +:107740000010000000000000000005000000000024 +:1077500000000010100910050020000000000000CB +:1077600000000210110205210020000000000000AE +:107770000000000000051141C140104080210300BD +:10778000890509050041410321A18582008000008F +:107790000000008000000000000000000000000069 +:1077A000000000008002038205118541004109208C +:1077B000030200050000000000000000210002009C +:1077C0002000400200000000000000000002002134 :1077D00000000000000000000000000000000000A9 -:1077E0000000000080800002800080200000000077 -:1077F0000000000000000000000000000000000089 -:1078000000000000000080000008000000004100AF -:107810002000050040030000000000000000000000 -:107820000000000000000000000000000000000058 -:107830000000000000000000000000000000080040 -:1078400008A08205A0000101000001000100000065 -:107850000000000000000000000000000000000028 -:10786000000000000000C0C0022108020800000063 -:107870000000000000000000000000000000000008 -:107880000000000000000000C00000201088400040 -:1078900001A0010000000000000000000000000046 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 -:1078C00000000000070000000000000000000000B1 -:1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000000000000700500041 +:1077E00000000000091120044100104100000000C9 +:1077F00000000000000021090300090008054140C5 +:1078000003204121080941001021098004080000DB +:107810008008800000000000000000000000000060 +:107820000000000000004009004041000302000089 +:1078300000000000000000000000000000000188BF +:107840000100000001000000000000000000000036 +:107850000000000000000000000200000000000026 +:10786000000000000000001100A100400001000025 +:1078700000000000000000000121010000000100E4 +:10788000010400000001000001C00083018200012A +:10789000880002909000C00000000000000000007E +:1078A00000000000000000000041909082A08300D2 +:1078B0000000000000000000000000E000000000E8 +:1078C00000000000000000000000000000000000B8 +:1078D00000000000070000000000000000000000A1 +:1078E0000000000000000000000000000700001180 :1078F0000000000000000000000000000000000088 -:107900000000000000000000000000000000070070 -:107910000000000000E00000000000000000000087 -:107920000000000000000000000000000000000057 -:107930000000000000000000000000000000000047 -:1079400000005C5CFFFFFCFFFCFF0000000000008B +:10790000000A000000E00700500000000000000036 +:107910000000000000000700000000000000000060 +:1079200000000000000000000000000000E0000077 +:1079300060000000000000000000000000000000E7 +:107940000000000000000000000000000000000037 :107950000000000000000000000000000000000027 -:1079600000000000000000000000F3F330F382503C -:1079700082FA00000000000000000000000000008B -:10798000000000000000000000000000B4B4F5F5A5 -:1079900030F3F3F3000000000000000000000000DE -:1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C000000000005C5C00FFAAA0AAAF000000005D +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000080000000000EF +:107990003C3C140C00000000C0FFC0FF00000000D1 +:1079A000000000000000000000000000FC00FC00DF +:1079B000CFF0CF0000000000000000000000000039 +:1079C00000000000000000000000000000000000B7 :1079D00000000000000000000000000000000000A7 -:1079E000000000000000000000000000303030F314 -:1079F000D750D7FA0000000000000000000000008F -:107A00000000000000000000000000000000B4B40E -:107A1000A0A030F3303000000000000000000000A3 -:107A20000000000000000000000000000000000056 -:107A30000000000000000000000000000000000046 -:107A400000000000000000F07D2D0F3CFFAA0000A8 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000FFFFD70F20000000FFFF0000000064 +:107A20000000000000000000000000000000C00096 +:107A3000C000CFFFCF0F00000000000000000000DA +:107A40000000000000000000000000000000000036 :107A50000000000000000000000000000000000026 -:107A600000000000000000000000000000003FFFD8 -:107A700030FF3F3A3F3A00000000000000000000E5 -:107A800000000000000000000000000000000000F6 -:107A9000FFFF033F05350535000000000000000032 +:107A60000000A300FF000000000000000000000074 +:107A70000000B6B6F7F700000000000000000000AC +:107A80000000000000000000FF5530300000000042 +:107A90000AFAC0C045454141C3C3AAAA0000FF8EEF :107AA00000000000000000000000000000000000D6 -:107AB00000000000000000000000000000000000C6 -:107AC00000000000000000000FFF78280F3C00AA13 +:107AB000FFFFD7D750553C3C0000000000000000FD +:107AC00000000000000000000000000000000000B6 :107AD00000000000000000000000000000000000A6 -:107AE0000000000000000000000000000000000096 -:107AF0003F0030003530353000000000000000004D -:107B00000000000000000000000000000000000075 -:107B100000000000033FF535F535000000000000CF -:107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 -:107B40000000000000000000000005005A080510B9 -:107B500000A000610006000D000000000000000011 -:107B60000000000000000000000000000000000015 -:107B70000000A061000E000D0000000000000000E9 -:107B800000000000000000000000000000000000F5 -:107B900000000000A000000800900000006100014B -:107BA00000010000000000000000000000000000D4 -:107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000000000000000B5 -:107BD0000000000000100000000000000000000095 -:107BE0000000000000000000000000000000000095 -:107BF000000000000000000000F0A0A00000000055 -:107C00000000000000000000000000000000000074 -:107C10000000000000000000000000000000CF4D48 -:107C20004D4DFFF03CF0000000000000000000009F -:107C30000000000000000000000000000000000044 -:107C40000000000000000000000000000000000034 -:107C50000000000000000000000000000000000024 -:107C60000000000000000000000000000000000014 -:107C70000000000000000000000000F030300000B4 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA0000C4D4D4D00F03CF00000000000000000C5 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD00000000000000000000000000000000000A4 -:107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000003C3C3C3C94 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 -:107D20000000D7D4D7D7BEBEBEFC000000000000C4 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 -:107D50000000000000000000000000000000000023 -:107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000F57D91 -:107D80005555000000000000000000000000000049 -:107D900000000000000000000000000000000000E3 -:107DA0000000000017141414828282C0000000003A -:107DB00000000000000000000000000000000000C3 -:107DC0000000000000000000000000004000A000D3 -:107DD000020010080400100004804110020004009A -:107DE0000000000421000000C00302022000C000C7 -:107DF00000040400200000002002044000000009EC -:107E00000000C0002000000000042000000320004B -:107E100021200020000000000000000020000000E1 -:107E200000800000040000000000000000000000CE -:107E30000000000000000000000000000000000042 -:107E400000000000000400000000000000008000AE -:107E500040900000000000A00000000240018000EF -:107E6000000000900000020000A0200000050000BB -:107E700000840000000000020000000000A10000DB -:107E800000000004000400000000000041000000A9 -:107E900000000401000100000000000020000000BC -:107EA00000000020000000000000000000000000B2 -:107EB00000000000000000000000000000000002C0 -:107EC00000000000000000000000000000000000B2 -:107ED00000000000400000800208000200100002C4 -:107EE000001040002000840000400400000000005A -:107EF00040104002080000000000A0400000000008 -:107F00000000000500000280400000004000080062 -:107F10000000018200004000000040000000888254 -:107F20000000040004000000020004000000000043 -:107F300000000000000000000080000000000000C1 -:107F40000000000000000000000000000000000031 -:107F5000000000840908C01004020011000905C0D7 -:107F6000048300008040000400000482100409081B -:107F70000400C004894100000082000400080008D9 -:107F8000000009840000040003048004004080080D -:107F90008000000004210000800000008000000438 -:107FA00000110400000080084100410200000000B0 -:107FB000000400000000008200000010000000002B -:107FC00000000000000000080000000000000000A9 -:107FD000000000000008400020A1402100084100EE -:107FE0000000000000050000004100020000000049 -:107FF00000110000000008808402080000008800D2 -:1080000084000000000000080100200000000405BA -:10801000000000050000001100080002010000003F -:108020000000000400110000000500030010000320 -:1080300000000080000000000000000000000000C0 -:108040000000000000000000000000000000000030 -:108050000000000000000300030000028000000098 -:10806000C000000000000020040000040000000028 -:1080700000000000000000820002000080000500F7 -:1080800000000500210008000000200000000000A2 -:1080900000000000000000000000000000000400DC -:1080A000000000200888000000000000000000011F -:1080B0000088000000200000000000000000000018 -:1080C00000000000000000000000000000000000B0 -:1080D000000000000000000002000800C000910045 -:1080E00082000400C002821108098200020408080C -:1080F0008800C00000090800820000000800C000DD -:10810000A000080090098200200001408402400085 -:10811000C040A0008200A0000000820040000009D2 -:108120000400020000008200A00082000000A00005 -:10813000C0800000000000000800000000000000F7 -:10814000000000000000000000000000000000002F -:1081500000000000000000000000000000C000401F -:10816000400040000500210903004000000000001D -:1081700000004088100020840090110000C003001F -:1081800008900220000004880800800020004000C1 -:1081900000000020410000A00000000003000400D7 -:1081A0000310000000000400058800002182034045 -:1081B0000000030208000420002021000800000045 -:1081C000002000000000000000000300000000008C -:1081D0000000000000000000000000000000080097 -:1081E0004000088088000800820084008400840029 -:1081F00008001000040082000000000000040800D5 -:10820000000082000000100000208820A08020894B -:108210008280200082410000A000000000000420B5 -:10822000C0200420820008210004A000C00000003B -:10823000102000800000000000400000000400004A -:108240000800000000020000000000000000000024 -:10825000000000000000000000000000000000001E -:108260000004000000024000008800000800000038 -:1082700000004000000000080000000000000008AE -:1082800000000000000000000000000000000304E7 -:1082900091041104800000000000000000000000B4 -:1082A0008201000100010000000000000000000049 -:1082B0000000000100200502030000010000000092 -:1082C00000000000000000010000000000000000AD -:1082D000000000000000000000000000000000009E -:1082E0009020880004000000000020002000020010 -:1082F00000080800002100410008040208000000F6 -:108300001000040000401000C00000000020080021 -:1083100000004041400084008400820008000421E5 -:1083200000000041C0210400080810000020900354 -:108330008200000010000000080000000020000281 -:10834000000000000020000000000000000000000D -:10835000000000000000000000000000000000001D -:108360000000000000000002000003000000000008 -:108370000000411000000000200000002008044020 -:10838000200000000000210000004100000000C0AB -:1083900000020300089010002108000000004100C6 -:1083A0000000000020004120858200000000000045 -:1083B000000000400000000000001100000000016B -:1083C0000000000003000000000003004100000066 -:1083D000000008000000000000000800000000008D -:1083E000000000000001000100010000202000202A -:1083F00008049020080101014001000102009101E0 -:1084000084000201A19000020089200510020208E8 -:108410000004820401000101840000010001000148 -:1084200088000001000004058283080382054000E3 -:10843000A1012001C000C082900802000400400891 -:10844000900000908200000000004000000000004A -:10845000000000000000000000000000000000001C -:108460000000000000000004080300400020200875 -:10847000084080A0001000040308002000218000B4 -:10848000211080118010A0000021002000028080B7 -:1084900000800000800010031002A00200100010F5 -:1084A0001021001100100000919021218004809083 -:1084B0008040901000038020800090808000800029 -:1084C000800080000000800000000000000000002C -:1084D000000000000000000000000000000000009C -:1084E000000000000000000020000000000020004C -:1084F0000380A00582A1C1214080090004029002EE -:1085000000004100201010030080800200210000C4 -:10851000000000C000800080210003211180400283 -:10852000100084000500909100009000110210805E -:10853000A111888003002005A090000000000080A9 -:10854000800000000005008880000000000000009E -:10855000000000000000000000000000000000001B -:10856000000000000000000000000100000000000A -:1085700000404008410089410901204020002101BC -:108580000309000000000100014140024001889100 -:1085900008000000008200A0001091020300089073 -:1085A000009109900200210003A0000005888301CA -:1085B0008504030003029100A00010A12000200800 -:1085C00000A082009000200800A18200200082000C -:1085D0008200000000000000000000000000000019 -:1085E000000000000000000000000000000100008A -:1085F00001010001009000100103824100900188F8 -:10860000A100000800200020009100A110A000405F -:108610002010000200400002A01000100000010025 -:1086200000010101000100000000000000004040C6 -:108630000108050983030088009000200121001033 -:1086400000080001088800100008004040040000F5 -:108650000000000000010000000000000000000019 -:1086600000000000000000000000000000000010FA -:108670001008052104200003030010218020004180 -:108680000385C005400500400521082100088080C1 -:108690004080000000800080008000000000052075 -:1086A00010204120112100102103080500020000C4 -:1086B00080830882901010100040030520082110CC -:1086C00000A0002000100300000000000000008057 -:1086D0000020002100200010000000000000000029 -:1086E000000000000000000000000000000000008A -:1086F000008000000000000304A110844100084134 -:10870000210321C004004003402103001000100297 -:108710002100A08010800300000080000000800085 -:10872000202003801000A02008090900050008107F -:1087300000000388A1C010800805100320000280FB -:1087400010400003802080800000000280A0000014 -:108750000000000800000000000000000000000011 -:108760000000000000000000000000000000000009 -:10877000000000C0000000000000210583A0880266 -:10878000830101C0000300200101019100000100EC -:108790000101090004A082084000880004000400D0 -:1087A0002000002008820908080000A00082004084 -:1087B0000001000004C00410210411000140002049 -:1087C00001400100A00082900840100088012008AC -:1087D0008220000000010020009000000000000046 -:1087E0000000000000000000000000000000000089 -:1087F00000000000000000000000840000000000F5 -:108800000000000A0000000000000000000000005E +:107AE00000000000A300FF000000000000000000F4 +:107AF00000000000FFFFFFFF00000000000000008A +:107B000000000000000000000000AA00303000006B +:107B100000000AFACFCF55455541C3C300FF00000E +:107B2000FF8E0000000000000000000000000000C8 +:107B30000000FFFCD714FA553C3C00000000000098 +:107B4000000000610007000D000000610006000D4C +:107B50000000000000000000000005000A08050009 +:107B600000A000610006000D000000000000000001 +:107B700000000561000E000D000000000000000084 +:107B80000000000000610006000D00000041500EE2 +:107B9000050D000000610006001D00000000400807 +:107BA00000000000000000000000000000000000D5 +:107BB0000000000080600007001C0000006100065B +:107BC000000D00000000000000000000540054AA56 +:107BD0000B0AEBAA000000000000000000000000FB +:107BE000000000000000000000F030300000000045 +:107BF0000000000055550555E6E224200000000075 +:107C0000000000000000000A000A8E000CC3C3AA96 +:107C1000F5F5AAFFFFFF0A0A0E0C808200020000A1 +:107C20000000000000000000000000000000000054 +:107C3000000000000000E1E1B4B4F8FBF0FF000038 +:107C400000000505F3030000000000000000040030 +:107C5000040A0F0AFFAA0000000000000000000054 +:107C60000000000000000000000000F030300000C4 +:107C700000000000000055550014C6C204000000BA +:107C800000000000000000000808F8F88E000C005A +:107C9000C3AA0505AA7DFF7D0A0A0A0880800000A4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000004B4B1E1E080B000FD0 +:107CC00000000000F5F5F3030000000000000000D4 +:107CD000003C3838AAAA2020000000000000000064 +:107CE00000000000000000003C3C3C3C00000000A4 +:107CF0000000000000000000F0C0DFDFD7D707075A +:107D000000000000000000000000FFFFF3AF0F00C4 +:107D100055C3D200D255F50FFCFC82000A0A82FC42 +:107D20003C00000000000000000000000000000017 +:107D300000000000000000000000F77500000EFECB +:107D40000AFAFCF3A8A200000000000000000000F6 +:107D500000003C3C3C3C28282020000000000000A3 +:107D60000000000000000000000055005F0F000050 +:107D7000000000000000000000003000DFDFD7003E +:107D80000700000000000000000000000F0FF3AF2C +:107D90000FFF55C3D2AAD2FFF5FFFCFC00000A0A70 +:107DA00082C03C0000000000000000000000000055 +:107DB000000000000000000000000000DF5D000087 +:107DC00002F20AFAA8A2FCF3000000000005000479 +:107DD00084008400880004092010040088008800C2 +:107DE0000400840221102090200920000405880549 +:107DF0002000200921002000880020002000000031 +:107E00002000840820000405200420000003040052 +:107E1000880020040420C010840004000200C00078 +:107E2000840020102002200020002100844088804F +:107E300084001005200020000510000508800400C3 +:107E400088000404200088800008400088000900A1 +:107E500040000000000020000000000000000000C2 +:107E600000002000000020C0A041000041000200EE +:107E700000000000000202000000000400000000FA +:107E8000000000000900090000000090030000004D +:107E9000000004000001C00100000000009000008C +:107EA000200004000000000505000508080241014B +:107EB000201010000000000010000400400080208E +:107EC0000000048400000000000200000400040020 +:107ED00008000000001000119000004000080000A1 +:107EE000040000400000000004C002000040000543 +:107EF00000040010001008000840001001000000FD +:107F0000020000048400204000000200020900007A +:107F1000000000090210000088400000040000007A +:107F2000000000000000000002000003040910002F +:107F30000209000000000000000408000200080917 +:107F400000100000020000050000200000000000FA +:107F5000000000040010200802000408000809883E +:107F60000088008800840010000800040404401009 +:107F700000820010000804080408000800080484B7 +:107F800002844084000800844010000400080008B7 +:107F90004084000002000004000802840408000875 +:107FA000118204040284098800040008058400107A +:107FB0000310801020084084040402088008200870 +:107FC0008008048400880082051040880390001017 +:107FD00008402008040800080021000800210010C3 +:107FE00000030008001008030821820000080008B0 +:107FF0000000001000000003842100000021004068 +:1080000000080040000500210040000200050002B9 +:108010000021200800000040000800210008002185 +:1080200000050040001000100000000800210008BA +:1080300000000400000500210000000800410021AC +:1080400000210000000800100809C00800080021F5 +:108050000010880988400400050000000800008422 +:10806000000000000000000000840000001000007C +:108070000000040003000082000000000000000473 +:1080800008A0081003000000000000000000000825 +:1080900009000000008200002100080003000040E9 +:1080A00008000810000800080000000000A00300FD +:1080B00000104184000800000000000000000000E3 +:1080C000000000000800000000820800000011000D +:1080D00000100000000000A00800A000C000100078 +:1080E00000400000000008000040041100000800EB +:1080F000C00000002000C100001000000000820449 +:1081000010200100100002000000A0008800040000 +:1081100000400000000400000000C000C000000299 +:108120000802A0000200A00000008204004000003D +:1081300000008240000082409000C005A000004086 +:10814000A00004000100000408000800A0001000C6 +:1081500082001000000000000200000800820040C1 +:1081600008840584000000001000000009000000E1 +:10817000024000A000C08008200800101188000004 +:108180000020080104000900800000000000090030 +:10819000000021004000211000000000000000004D +:1081A000020011844100054010C008000400400096 +:1081B000050021000000000000002040000408002D +:1081C00000000000040008002188210002A0110026 +:1081D0000000210000002100210800000008000329 +:1081E000000000000040820000000000C000A00865 +:1081F000820000000040000000110000001000009C +:10820000080401210010C000000000080000080060 +:1082100000002000000008008200000000000000B4 +:108220002000101000000000C0000000000000004E +:108230000000A000000000800441010000000400D4 +:1082400000000000001000000000A000C00082003C +:10825000C000A0000000C000000009008220000053 +:10826000000000000000400000A00884080000009A +:1082700000000000000000001000210000001100BC +:1082800000008000400000C0000000000020090045 +:108290000004000008A000000000000000400000F2 +:1082A000080880000000020000100000001000A07C +:1082B0004108000000001000004009080400000010 +:1082C00000000000000000000000000000000000AE +:1082D000000008000000000000000000402000082E +:1082E0000000002100000000000008000000002144 +:1082F0000008000008080000400000110000000015 +:10830000000000000800000000000200050001005D +:1083100084080000A0080000C02100000000000048 +:108320000000202100008200010000000802081067 +:108330008841820000080400040000008200000060 +:10834000080800200008080204210040880040209E +:108350008200000010000800001008000800000063 +:1083600000000000200400000004000000000000E5 +:10837000080000002000100000820000050020001E +:1083800000000000000080000004000080000200E7 +:108390000400000400000000000000000000410094 +:1083A000030000008000118800002010400420001D +:1083B00040010000009000000004000000000004E4 +:1083C0000000110000000400000420000300000071 +:1083D00000404088000808000040000000002084A1 +:1083E0000402000200000000000000000000000085 +:1083F000000000000000000000000000002000025B +:1084000000880040000000000000000000C0904014 +:108410000004C09000000000000000000000000008 +:1084200000000000000001C190410109C0C000002F +:108430000000000000000000A10082000000C10850 +:10844000001000820204000000000000000008A0EC +:10845000000400A000A000000000000000000000D8 +:108460000001C00100010000000000000000000049 +:1084700000000000000000000000000000000000FC +:10848000008011800000000000000000000040801B +:10849000008000808000000000000000000000005C +:1084A0000000000000000000088409910283804061 +:1084B00000000000000000000000C000800000007C +:1084C00089800080000000800000000000000000A3 +:1084D000008000000000000000000000000000001C +:1084E0000000092000100010000000000000000043 +:1084F000000000000000000000000000000000007C +:1085000000108000001000000000000000000000CB +:10851000800080C1004180000000000000000000D9 +:108520000000000000000000000084008941C141FB +:10853000C040000000000000000002000200100027 +:108540001110000000A10080000000000005008064 +:108550000000000080008004800000000000000097 +:108560000000020021000200208200000000000044 +:1085700000000000000000000000000000000000FB +:1085800000002001100008030200000000000000AD +:108590000000400040C08801C02000000000000032 +:1085A00000000000000000000000000041A04001A9 +:1085B0000801C008000000000000000001100100D8 +:1085C00001000000000000020004000000000000A4 +:1085D0000008000020004000A0000400000000008F +:1085E0000000000000A00100000001A00000000049 +:1085F000000000000000000000000000000000007B +:1086000000000000020090000000A1000000000037 +:108610000000000102020088C00400C00000000049 +:108620000000000000000000000000000001C04148 +:108630000021C04000C00000000000000000000158 +:1086400000000001000004A00002008420C000001F +:108650000000000000009000002000A000080000C2 +:108660000000000000000001000000000001000008 +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000010000005D5 +:1086900000040000001089800000008000800000BD +:1086A00000000000000000000000000000000001C9 +:1086B00080840989808800C000000000000000005C +:1086C0000020000500210004800000000000008060 +:1086D000000000000000000000000000000000801A +:1086E000000000000000000000020005031100402F +:1086F000000000000000000000000000000000007A +:1087000000000000000000000000000000008000E9 +:1087100000000000000000008000000400A08000B5 +:108720000000000000000000000000000000000049 +:10873000000184C18040918810800000000000008A +:108740000000400402004100090880098040000048 +:1087500000008000002000008000001000408080A9 +:108760000000000000000000000003802000040062 +:1087700009040000000000000000000000000000EC +:10878000000000000000000000000000C020404089 +:1087900010000000000000000000C000880090C130 +:1087A0000282000000000000000000000000000045 +:1087B00000000001C191200041C1C108000000007B +:1087C0000000000001C001000000000010002000B7 +:1087D0002000400008000801040082002001A000E1 +:1087E00040C01000000000000000000000C00100B8 +:1087F0000100000000000000000000000000000078 +:10880000000000000000000000000000000000E088 :108810000000000000000000000000000000000058 -:1088200000000000000000E0000000000000000068 -:1088300000000000000000000000070084000000AD -:10884000000000000021000000000700820000007E -:108850000000070000000000000000000000000011 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000000606EC -:1088800081E72400F699000000009898999900006B -:108890000000F690F6906C006C00F090F300C3427C -:1088A000C3C22F2FFF0F00000000000000000000D7 -:1088B0000000000000000000FFFFFE7EFFFFFEFC46 -:1088C000000000003C36FFFF66CF66C0F3F3F0F017 -:1088D000666666667242FFFF00000000000000004E -:1088E0000000000000000000000000000000000088 +:1088200007004242000000000000000000000000BD +:10883000000000000000000000E0070048420000C7 +:108840000000000000000000000000000000000028 +:1088500000000700420000000000000000000000CF +:1088600000000700000A00000000000000000000F7 +:108870000000000088000000000000000000000070 +:108880000000000000000000000000000000CF8990 +:10889000CF89000000000000000000000000000080 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 +:1088C00000000000000000000000000000000000A8 +:1088D000A3CCACACF0F07242020B42DB0000000013 +:1088E000FF0FFFC3FF9FFF9000000000000000008B :1088F0000000000000000000000000000000000078 -:1089000000000000240090990000000098989999B8 -:1089100000000000BDBD2424F0000000FF9FF30F05 -:10892000C300C3C02020F000003600360000000065 -:1089300000000000000000000000FE7EFE7EFFFF41 -:108940007E3C000000003C36000066CF66C06666D4 -:1089500066660F00FFF07242000000000000000099 -:108960000000000000000000000000000000000007 +:108900000000000000000000000000000000000067 +:10891000CF89CF89000000000000000000000000A7 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:10895000000053CC5C5C000072420B0BDBDB0000C0 +:108960000000FF0FFFC3FF9FFF900000000000000A :1089700000000000000000000000000000000000F7 :1089800000000000000000000000000000000000E7 :1089900000000000000000000000000000000000D7 -:1089A00000000000000000000000000000000000C7 -:1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000000000000000000A7 +:1089A0000000430840000084218600000000000011 +:1089B000000000000000000000000000410840002E +:1089C00000842106000000000000000000000000FC :1089D0000000000000000000000000000000000097 :1089E0000000000000000000000000000000000087 :1089F0000000000000000000000000000000000077 -:108A000000000000090F0F0389008900000000002A -:108A1000BC8CB08000000000000000000C3CCFFFC8 -:108A2000FCF4F0F40CFC000000000000000000006A -:108A300003000300000000000F3C00000000FFFFE7 -:108A4000FFFFFFFFFFFF0000000020BF60FF006688 -:108A500099FF8080818166660F0F00000000000092 -:108A60000000008100810000000000000000000004 +:108A00000000000000000000000000000000000066 +:108A1000000000000705E7E7BDBD81810000000000 +:108A20000000000000000000000000000000000046 +:108A30000000000000000000000000000000000036 +:108A40000000000000000000000000000000000026 +:108A5000000000000000D242D2D20000000000005E +:108A6000000000000000FFFF0F0CFFC0FFCF000060 :108A700000000000000000000000000000000000F6 -:108A8000000000000000090F0F03810089000000B2 -:108A90000000BF8FB3830000000000000000003022 -:108AA000C3F3000000000CFC000000000000000008 -:108AB00000004200420000000000663C0000000090 -:108AC0000F3F6F7F666F7E7F00000000009F40DFDA -:108AD000006699FF0000010166660F0F404070704C -:108AE0000000000001010101000000000000000082 +:108A800000000000000000000000000000000000E6 +:108A90000000000000000705FFFFF330F330000086 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD00000000000000000002DBD2D2D0000000052 +:108AE0000000000000000000FFFF000CFF00FF007E :108AF0000000000000000000000000000000000076 -:108B000000610006000D000080610006000D0000FD -:108B100000610006001D000100610006001D00004C -:108B200000610006000D00000000300000000000A1 -:108B3000006100010001000000610006000D00005E -:108B400000000061000E000D000000610006000D35 -:108B5000000000610E0E000D000000000E08000075 -:108B6000000100610006000D000000000000000090 -:108B700000000000000000000000000000000000F5 -:108B80000000000000000CF303FFF7F00000827DFE -:108B900041FF0000000000000000F0FFF0FF3E7FFA -:108BA00016573D7643190000000000000000000049 -:108BB0000000FFFF7F5FBEFEFFFFFFFEBFBEF0F0C5 -:108BC000F0F0000057575754FFFFE8FF0F0FBE0F9C -:108BD0003C3C3C3C00000000C200C2000000000021 -:108BE00000000000000000008200C0000000000043 -:108BF0000000000000000000000000000000000075 -:108C00000000000000000000300CFC33F4F0000015 -:108C10002882BE6900800000080000000303F3F30F -:108C20002A6B02433D76431900000000000000005B -:108C3000000000007F5F7F5FAAFAFFFF4140010054 -:108C4000C0E8FCE80000545457540000E8000F0F3F -:108C5000140F141EB4BE0000000002000200000049 -:108C6000000000000000000000008200C0000000C2 -:108C700000000000000000000000000000000000F4 -:108C8000000000000000FDADF8A8EBEBD7D75500C1 -:108C90005500C33C3CC300000000000000007D3FC5 -:108CA0007D3F5555FF00690F690F0000000000006F -:108CB000000000000000FF7FFF3FFCFFFEFF555556 -:108CC0001717A2F7A0F500000F0FFF002828EBEB05 -:108CD00017171717F0F0BEFF00000000000000009B +:108B00000000000000000000000000000000000065 +:108B1000000000000000000080610007000D00015F +:108B200000610006000D0000100020080040000851 +:108B30000000000000000000000000000000000035 +:108B400000000061000900010008000000000000B2 +:108B5000000000610006000D0000000030080290D7 +:108B600000000000000000000000000000080000FD +:108B70000000000000000000000000610006000D81 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA000000000000000CFCFC0C0000000000000A7 +:108BB00000000000000000000000000000000000B5 +:108BC000000000000F0F0F0FF0F0F0F000000000A9 +:108BD00000000000C3AAF000143C343C0000000078 +:108BE0000000000000000000000000000000000085 +:108BF000000000000000000000000000F5FAC1C203 +:108C0000C33C8124000000000000000000000000C0 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000CFCFC0C00000000026 +:108C30000000000000000000000000000000000034 +:108C40000000000000002D2D0F0FC0FCF0F0000010 +:108C5000000000000000C3AAF0FF003C303C000010 +:108C60000000000000000000000000000000000004 +:108C70000000000000000000000000000000C1C271 +:108C8000F5FAFFFFA5A500000000000000000000AD +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000007F02FF00F3FFFFFF34 +:108CD000000000000000000000000000000800C8C4 :108CE0000000000000000000000000000000000084 :108CF0000000000000000000000000000000000074 -:108D000000000000000000005D0D58082828141421 -:108D1000400045005555F0F0000000200100000023 -:108D2000413F413F0F0FFFFF690F690F0000000037 -:108D300000000000000000007F7F3F3FFCFCFEFEC3 -:108D4000FF00FF002075A0F500004D4DFF0030280A -:108D5000F3EB173F1703F0F0820000000000000063 -:108D60000000000000000000000000000000000003 +:108D0000303F303F00000020000000000000000065 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D4000000000000000000000007F02FF00000C97 +:108D50000000000000000000000000000000000F04 +:108D6000000F0000000000000000000000000000F4 :108D700000000000000000000000000000000000F3 -:108D80000000000000000000000000804180022080 -:108D900000058884888002202008044000004020CC -:108DA000400221020485880840840400000020104D -:108DB00000084080000000022002200000902010E7 -:108DC00021832003200084002004000320800080F1 -:108DD000048500A0000000100010000400800000C6 -:108DE000002020002080000000030004000000009C -:108DF0000000000000000000000000000000000073 -:108E000000000000000000000000000240042020DC -:108E10000001090000210004030109000001000015 -:108E20000000000940A10202410102100000000000 -:108E30000085000000022100000105010000000380 -:108E400000010210000000840000008400000010F7 -:108E500000102020001100880901080500000020F2 -:108E600000000005000000200000000000000000DD -:108E700000000000000000020000000000000002EE -:108E800000000000000000000002000000000200DE -:108E90000000008001040000C00000A084049000D5 -:108EA00002000080880000000480008001800080B3 -:108EB0000090A010028400000000000001000000EB -:108EC0000000000000000010000000020000000090 -:108ED0000080000000000000000090000000008002 -:108EE000010004C0048004A0008000000000000015 -:108EF000000000000040000004000400000000002A -:108F00000000000000000000000000000000000061 -:108F1000000000080004400541002082000504858F -:108F200005040004001002000084801002101002EA -:108F3000001000410085C04100000008000010083A -:108F400000000908040805040001000000050008ED -:108F500000000002000000000004201000080000D3 -:108F60000010020089218040804104200008000890 -:108F700000840004000000010500000000840000DF -:108F800000000000000000000004000000080004D1 -:108F9000000400200003000801080421002008212B -:108FA000410000210000000800C000030200401141 -:108FB0000008000800000000000000080002000097 -:108FC00010210000004040210021000000080000A6 -:108FD00000200000000800000840000240000021BE -:108FE00000800021000000031005000000000020A8 -:108FF0000040002000080000000000000000000009 -:1090000000000040000000000000000000000040E0 -:10901000000000000889410004002000C100410355 -:109020004100200041000308108400200000880057 -:1090300082000309410400A04140000005004001F6 -:109040000404A18420000000418421A0000000004D -:1090500008884100000000900000C1000500850064 -:109060004100034040C00000410021004100410494 -:109070000001410000090090000000000000000015 -:1090800000080000000000000000000000000000D8 -:1090900000000000000008A10480A0418820008496 -:1090A00004000804A08008000405A00208020000D3 -:1090B000A1020000082082000809C04100800802C7 -:1090C0000402002000000000002082020000C00016 -:1090D00040000804000000000800040003400540B0 -:1090E0008400402040000400002000000041840073 -:1090F000C18000000000000000000002000000002D -:10910000000000000000000000000000000000005F -:1091100000000000000000000404880400000000BB -:109120004104C10008840020000009000000A110D3 -:109130000000040100000401000000000002002003 -:1091400000000001000011000000040008010208F6 -:10915000000000000000000000008000000084000B -:109160008400090000000000000008010000110058 -:1091700000000402000000000300080000000800D6 -:1091800000000002000005000000000000000000D8 -:1091900000000000000000000000000382058220A3 -:1091A000042000032000820401C0400000000000F1 -:1091B00000401000A0008440880000000000000073 -:1091C00000080000080008004000202108000000FE -:1091D000400000028200A010840000000000C000D7 -:1091E000C000840584000821C011A0854021C00072 -:1091F0008405C0200020C0000804402000000000BA -:10920000000400000000000000000000000000005A -:10921000000000000000000000000000000000004E -:109220000001A101000288004121040400000000A7 -:1092300008C00300219003000800000000000300A4 -:1092400000A020A0020000A005000000200080086F -:1092500008A04000000800000501059000000990EA -:10926000090041C0050005008084020000408082A2 -:10927000410000001101000140080008400000000A -:109280000004410000000000000000000000000099 -:1092900000000000000000000000000000000008C6 -:1092A000000010084100840020080820900082007F -:1092B00008000008000000009040000888004040BE -:1092C000A020402010210000000000000480840045 -:1092D000000020000040000090000408040000008E -:1092E000020040000000040088000803820002031E -:1092F0000200000208044008820000200020400014 -:10930000000000000020000000000000000000003D -:109310000000000000000800000000000000000045 -:10932000000000000000040002200000080100000E -:109330000000000004400088000000000800000059 -:1093400000000000080000002000000000000008ED -:1093500000000040000000010200000000000000CA -:10936000000000000000000000000000800003007A -:109370008800800000000000800021000801080132 -:10938000080000020000008800000000000011003A -:1093900000880000000000880002080000000000B3 -:1093A000210000000100910000000000000000000A -:1093B00000004000010040000400A08991088221C3 -:1093C000208900C000100088200801010100400130 -:1093D000000141C02001040382A1104000082020A8 -:1093E00008020000A084A0830088000002C00010D2 -:1093F0000002401040C0000490A0900483820082CC -:109400000004032100020002000200A0000000008E -:10941000000000000000000000000000000000004C -:10942000000000000000410090000000000000006B -:1094300005000000050021000000000000418384B9 -:10944000801000A1008000004000000004400340A4 -:1094500080020021C0C040030002002100801100F2 -:10946000000000000000804180900083002085C043 -:1094700000110011800980A0090300090083020384 -:109480000003008391110080008000800000000034 -:1094900000000000000000000000000000000000CC -:1094A0000000000000000008008000080000000824 -:1094B0000000000900004000830088008211820043 -:1094C0002100080040890000800400000000100016 -:1094D000210005000090908090109104A0031000DE -:1094E0000311200220800000800000118003809181 -:1094F00000008003808080008000800500048000E0 -:109500000000004080800000000000050080008016 -:10951000000000000000000000000000000000004B -:1095200000000000000000000001000400010088AD -:10953000000100080000008820880800A1009101B7 -:1095400011900100030091889000020100849000B6 -:109550000102010000000088A102020140A104A153 -:1095600001000100002100A0000002A00000888985 -:10957000049084002000080204000400404040A140 -:10958000C00088009000404082000000000100847C -:1095900000040000000000000000000000000000C7 -:1095A00000000000000000000000000104000200B4 -:1095B000000001002000080001000082000504A155 -:1095C00000C0000800A100039005882000A10083CE -:1095D0000304000000010100000100A00189201126 -:1095E000008904110021040510000000024000045D -:1095F000410410A00404000400008902C04000845B -:1096000005A084C0C0900082000404900400000003 -:10961000000040000000000000000000000000000A -:109620000000000000000000000000001005804065 -:1096300000401011050080008000410000400082C1 -:10964000802105850080058841A00040000000823F -:10965000001009C00000050310054040000403206D -:109660000221118280080083008210200000808087 -:1096700002804080800000802180090009808003F2 -:1096800000000203009180000000080080008000BC -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA -:1096B0000020000000000008000800000000040076 -:1096C00003412000020041201040088002400000B9 -:1096D00000C0808080004190111041000340218231 -:1096E00021800000C0028041800200008003000051 -:1096F00090208321108040000004000000800000C2 -:109700008040804100000000000000408080800018 -:1097100080008021800000000000000000000000A8 -:109720000000000000000000000000000000000039 -:1097300000000000000000880000000000000000A1 -:10974000002001C00100010001010020010800010A -:10975000040020020284A0000104000000000101B6 -:10976000414190A088C0880040210200200088016B -:109770000000C101084089041100820088000084B3 -:109780000800C00020A08440200020008282040441 -:1097900010000400020182004000000000000000F0 -:1097A00000000000000000000000000000000000B9 -:1097B0000000000000E007004200000000E0070099 -:1097C00000820041000007000000000000000700C8 -:1097D0000000000000E007000000000000000000A2 -:1097E0000000000000000000000000000000000079 -:1097F0004100000000000000070000000000000021 -:1098000000000000000000000700600000000000F1 -:1098100007004200000000000000000000000000FF -:109820000000000000000000000000000000000038 +:108D80000000F0FFF0FF000000000403A00240100C +:108D9000C0040400A0002002880040804005880034 +:108DA0004009040020042004080220048810200048 +:108DB0008410041040002000A000208084000000E7 +:108DC0000000400020108520200400038800C0001F +:108DD000C01040000800200088000400200084002B +:108DE000820300002000200088842004200004006A +:108DF000C0002000408000802100208440048410B6 +:108E000000088202840004002082848200000001A5 +:108E100000002000200000000001100000022000DF +:108E200004000500000000C0000084A0400000C055 +:108E300009000000400000004000000000020000A7 +:108E40002000000080000002100304020000000067 +:108E500040000005804080000900000000A04000A4 +:108E6000000000000000092004A04002000241C0F0 +:108E7000A0002000000041200520040041202084A3 +:108E80004100410000410040000000024010000984 +:108E900000000000000000000000000000100009B9 +:108EA00000090810004008090040001000020000FE +:108EB000030402004000000410040000400004000D +:108EC0000000900200000302012000104109000090 +:108ED0000820010002028900C141000002000202D4 +:108EE000110000000300000090004000020010028A +:108EF0000200020002000108102011204020412041 +:108F0000A0400200840008000200100000004000A1 +:108F10000008200820040008000820100084110820 +:108F200000080008418900090008000808014009FC +:108F30000408100802088008000880080008801053 +:108F40000008030805854008040910094000841042 +:108F5000000080094008C01110084008040880087B +:108F6000411188080084C0C000040008C008040043 +:108F700080090008410800100284A0858209C1050B +:108F800090850008800400048510410880040004D6 +:108F9000804000210021000300050021000800009E +:108FA0000021001000400008012100408421C02160 +:108FB0004010001000210021000300000003000900 +:108FC000002100038210C01000030020000084A1D3 +:108FD0000008000000000400C08804000000000039 +:108FE00000020021202100000008002100000000F4 +:108FF0000805080500050021004000400000002190 +:1090000000210008000200080000004000100408D1 +:10901000A003840810100082000800100000000067 +:10902000000000000300030010002000000000000A +:1090300009000000000000000000094010000000CE +:10904000000000000000000000000000000100001F +:109050000004008200004100C1C000208000080020 +:109060000000210000000000000000400308000094 +:1090700000000002800010A00500000000000000B9 +:10908000000000000000000000000000008200005E +:109090001188030000008200C0000240C085A000CB +:1090A00000408200A00008050400080000850004BC +:1090B0000000820408048200100010040800084028 +:1090C0009040000008408240A0028200050020007D +:1090D000C120C1020185000004110800042008001D +:1090E0000420C011080208210200004004000041D1 +:1090F000824082400805820504000400002000111F +:109100008205094082000104C0000840204000049C +:1091100008030821A0000420002000000000040231 +:10912000000000000000000000A0000000A00002FD +:1091300003824010411000C00090000000000000B9 +:109140004100050000820000000041411000400085 +:10915000081020010440202000008090008441007D +:1091600000A000001000020000002100000803A081 +:1091700004840200000000081040110000000008F4 +:1091800040002008400003080800410000A0000043 +:1091900009010000200003000000000300408211CC +:1091A000000500401040100884030800C000004083 +:1091B000820000410002841000000021080000002D +:1091C00000210000080083A1820000082003840021 +:1091D000080008040400080882210000080000209C +:1091E000A021000000400000004000030003080030 +:1091F00000100000C10004001000A0210000C00207 +:109200008200C0108200820004008200C0110000B1 +:10921000000200000000000308210003000000001D +:10922000000000000000000000000000000000003E +:109230000000000021902100210003000000000038 +:1092400003000000090000000810000000010000F9 +:109250000000110021018000000100000000210039 +:1092600000830000008200000000000002000000F7 +:109270000300000000000800800000000000000063 +:10928000000000000000400000008000100000000E +:1092900000000021000800000800080000409011B4 +:1092A0000000882110008200002190090041200068 +:1092B000200020000404014000000000000500110F +:1092C000C00000100805002140000009A00810009F +:1092D000080004088400820082008400014000002D +:1092E00000200420082000202020C00900000008E1 +:1092F000000088004000400004000000000000045E +:1093000000000080004100110441040082000400BC +:109310009004010008A02000000090008241080095 +:10932000000010000000000000000000000000002D +:10933000800080008000080140C000000000210083 +:109340000084000000000000000000000400000095 +:10935000C000002000000000000000000000040029 +:109360000000030100010001000111402100000084 +:109370000000000000000000004040000000080065 +:10938000000000000020202020008000800003005A +:109390008000000120000004000000000000000028 +:1093A000200200000001000000000000000000009A +:1093B00000008589A0200089000908010101100032 +:1093C0008200000000000800000000000000900083 +:1093D00000000000A0004100000001012101A100E7 +:1093E000000100000200000890C0C0400001000021 +:1093F00084000000000000000000000090842000B5 +:1094000008A0000800A00020000400C00000010027 +:10941000100000000001030040000001C0044004EF +:1094200084C003040040000800080002000000009F +:109430000000090091A0808811030090802003089B +:109440008003000300000000800000000000000016 +:109450000000000040009000830340091141852175 +:10946000020500100000090040800000800020205C +:10947000080580410003000000000000000000001B +:10948000400080000080008000000000000000001C +:109490001000800000001110A1008502000440802F +:1094A00000008000028000000000000000400480F6 +:1094B000210005000210000300A1008300118000BC +:1094C000000000000000000000000000000000009C +:1094D00000000000000003001100200041042009EA +:1094E00020000809050500000200401185002190B8 +:1094F0000000000300000000050005040800410012 +:109500002000021182008240000000000080000064 +:10951000880040000300C100A00511000803840872 +:10952000820088218880A0000088000000000001DF +:109530000110010000000101004000C00090000087 +:109540001000A00004008282000000000000000063 +:1095500000000000000000000020000000000101E9 +:1095600000200088010000880000A0208920400021 +:109570000503000000000000008200000001002040 +:10958000010040008301A1008201000000000002F0 +:109590000000028441100000C12003400000C1010E +:1095A000C101A0002100A182088400000000000089 +:1095B00000010000000000000000C003A0048902B8 +:1095C00090C000100111912000A0000000000000D8 +:1095D0000001000000000000000100000000020186 +:1095E00000000100080041000001000001080082A5 +:1095F00020051188000001000100000000000000AB +:10960000000000001010008290108202A0000000F4 +:1096100000009000000000000800000100010400AC +:1096200004000001844000A0000404C100032009DC +:109630000903001000000000000000000088214025 +:10964000101083C000C1038208200582000300219E +:1096500000200041002000050009004100030041F6 +:109660000021004041038500A1200941000002C003 +:1096700000030002218900034011020200020000E1 +:1096800000000000000000C1000200A000890000EE +:1096900000000000000020030040800000410002A4 +:1096A000834003030503000800820083104121006A +:1096B0000200100005000300200010004010820589 +:1096C00010110500A000000000000080000000094B +:1096D0000000000000000000000000000000211158 +:1096E00040004100030508A01004110003410000E0 +:1096F000C10005048500004080000000000000005B +:10970000800080000000000041C0218820804010BF +:109710008000000000000000414021401000400097 +:1097200020A120211180002080118000008080086D +:1097300001000100000000000040010000000000E6 +:1097400041000401020090000000004000080000F9 +:109750000000000000000000000000000000000009 +:1097600001100100000000000141010100000001A2 +:109770000000C110A04104408400C0009000A0007F +:109780000800C08204000000C0008510000500042D +:1097900082010400A00020008200014000A001A07E +:1097A0000100004100900008000104902082908494 +:1097B00004010000000000000000000000000000A4 +:1097C0000000000000E00000810000000000000038 +:1097D0000000000000000000000000000000000089 +:1097E0000000000000E000000000000000E00700B2 +:1097F00082120000000000000700002100000000AD +:109800000000000000000000000000000000000058 +:10981000070000000000000007000000000000003A +:1098200007000000000000E0000000000000000051 :109830000000000000000000000000000000000028 -:109840000000000000000000001400000000000004 -:109850004B0A000014141414FF3C0F3C00000000DD -:10986000000000003C3C3C3C3C3C38383C053CFFA4 -:1098700055C355C30000C3FFB2B200B2FFB20041EE -:1098800000418E8E0C0C287D787DFFF07DF0FCFF72 -:10989000FEFFFFFFFFFFFCE8E8E80000000000001B -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000010000088 -:1098D00000005F1E000000555050003C0F3C00008F -:1098E0000000000000001010103C3C3C00383C0020 -:1098F0003CFA550F550F0000003CB2B200B2FFB267 -:1099000000004141CFCF4D4D287D282D00F028F09B -:10991000FCFCFEFE28F8FFFFC0E8E8E800000000BD +:10984000000000005FF5496150FAC0FC0000000014 +:10985000ACAAFFAA00000000000000000000000009 +:1098600000000000000000000000000000000000F8 +:10987000000000000000FCFCF0FF0000000000FF02 +:1098800000FF00000000FF3CAA3C000000000000B8 +:10989000C3C3DFDCD3D0CFCFCF4500000000000032 +:1098A00000000000000000000000000000004D4D1E +:1098B000FFFF008280800000000000000000000028 +:1098C000000000000000A00AB69E50FAC0FC000094 +:1098D000000000AAFFAA0000000000000000000035 +:1098E0000000000000000000000000000000000078 +:1098F00000000000000000000C0C000F5F1C5F5F08 +:10990000F0F03C3C00000000003CAA3C00000000DD +:10991000FFFFC3C3DFDCD3D0CFCFCF4500000000B3 :109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 -:10994000000000000000000000000000C1C3C1C012 -:10995000FD0DF808BEBEFFAA41EBAFAFFEFE0E0E36 -:1099600000000000000000000C0C303080C000003F -:10997000FC0C5C5C00000000000055550F0FBE148D -:10998000BE143C3C0F0F030303F3BFB0FFF0BEB4A3 -:10999000BEBEFF7FFF5FFFFFFFFF3C3C3C3C000083 -:1099A00000000000000000000000000000000000B7 -:1099B00000000000000000000000000000000000A7 -:1099C0000000000000000000000000000000C1C313 -:1099D000C1C0FD0DF8081414550041EB0505F4F461 -:1099E000040400000000000000000C0C30300000F7 -:1099F00000003C3C3C3C0000000000005555FF00CE -:109A0000FFFF0000FF005555F303F3F31F100F0095 -:109A10001E1414147F7F5F5F7F7D3F3C353F3530E0 -:109A20000000000000000000000000000000000036 -:109A300000000000000000000000000005610A0FA7 -:109A4000050D00A005610A0F050D00A00061003E94 -:109A5000009D01000061000E000D00010061500F2B -:109A60000009000100610006000D000000615006C1 -:109A7000000D000000614006000D00000000A06124 -:109A8000000E000D000080615006000D0000A06176 -:109A9000500E009D00050061000E000D00008000CA -:109AA00000000000000000000000000000000000B6 -:109AB00000000000000000000000000000000000A6 -:109AC00000003AF03AFF0000000000000000CF7DE7 -:109AD0000C7D2B2B03F30F0F3C3C0AFA0FFF000009 -:109AE000000000F00FFF2D2DFFAAAAF0FFF00000EC -:109AF000C3FF4500454500000000FFFFBEFA00001F -:109B0000FFFF2DFF0000000000000000000000002B -:109B100000000000C3008200000000000000000000 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B4000000000003A003A0F000000000000000092 -:109B5000CF410C41282800F05555FF000AFA00F0CB -:109B60000000000000F00FFF2D2D5500AAF000F0BE -:109B7000000082BECF00CFCF0000000000001450D4 -:109B8000000000002D0000000000000000000000A8 -:109B90000000000000000000820000000000000043 -:109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000000000000000A5 -:109BC0000000000000000000000000000000000095 -:109BD00000000000000030F33C3C00FF0514A03CF6 -:109BE000F53C000000000000000014FF14F54B00DD -:109BF0004B000F0F0A002D7D282800000000E8FC14 -:109C0000FCFC0000FFDF3C1C000000002D2D0000CC -:109C10000000000000C30000000000000000F00091 -:109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 -:109C40000000000000000000000000000000000014 -:109C5000000000000000000030F3000000000500DC -:109C6000A03CF53C0000000000000000145F14550B -:109C70004BFF4BFF0F0F030028782828000000003F -:109C8000E8C0C0C00000C3D3001000000000FF0007 -:109C900000000000000000030003000000000000BE -:109CA0003030000000000000000000000000000054 -:109CB00000000000000000000000000000000000A4 -:109CC000000000000000200004052000100020001B -:109CD000000020002000200040008800400002001A -:109CE00084000400400020000000000384020400FF -:109CF000004120002003200220002003A00088044F -:109D00000000840020000002000088008804200475 -:109D100020040000200420050000000000000000D6 -:109D20000000000200000000000000000000000031 -:109D3000000000000004000000000000000000001F -:109D400000000000000000000000000000002000F3 -:109D5000000020040000000040000000000011008E -:109D60000000400000000000000000004100000072 -:109D7000000000000090000000000004000000004F -:109D8000210000000002000000000000410000006F -:109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000000B3 -:109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000000000000000093 -:109DD0000009000000000000000000410000000039 -:109DE000000000040000000000030000001000005C -:109DF0000003000000000000000000000000000060 -:109E00000000000000000010000000000011000031 -:109E1000000000000000000300000000000000003F -:109E20000000000000000011000000000000000021 -:109E30000000000010001102020800002040004055 -:109E400010000100010001002010050000000000CA -:109E5000008400000510000800C003880000001006 -:109E60000082040840000010020000880000008208 -:109E70000004000000040002008240880000000886 -:109E800000840904008200000000090000000000B6 -:109E900000080400000000080000000000000000AE -:109EA0000008000000000000000000000408000896 -:109EB0000008000800008002C001800100008091BD -:109EC00000058000100010001000800190040000C8 -:109ED0000800840800210200A02000000000880083 -:109EE0000008842040118808000000008400000061 -:109EF00008000000840000000000000000000000D6 -:109F00000000880084000800900000008400000029 -:109F1000402040000003820000000000200040407C -:109F200000081000400000008400A00010000002A3 -:109F300020400000000000000000000000000008B9 -:109F40000000000000000000000000000000000011 -:109F5000031008840000000003084100000000080E -:109F600000900040080003004100000003002100B1 -:109F70001000000810000000090841000540090019 -:109F800000A003200982050400900000008805A0BD -:109F9000000040A000000000009009000000040044 -:109FA00040A021A008000090080000000000000070 -:109FB0000000000000000888000000000000000011 -:109FC0000001000000000000000000000000000090 -:109FD0000000000000004040C000004088008408ED -:109FE0000409A011A00904020011100008090000D2 -:109FF0008200000090000000A0008200000000200D -:10A0000004000020C000C004080020000000080276 -:10A01000000900000000000000000000000000092E -:10A020009000C00008000000000002054040000051 -:10A0300000020021A000080000000800000001103C -:10A0400000200000000800840140001001020020F0 -:10A050000110000203001000008800000000210031 -:10A06000410000004010402040000090000000002F -:10A070000500000000000000000000000590022024 -:10A080001000000000100000000010000004084054 -:10A0900000000200000004000000000000000500B5 -:10A0A00041000000000004001000410000002100F9 -:10A0B00021000000008800000000000004000000F3 -:10A0C0002001210300000001000904010001020138 -:10A0D00000010201000100410000A0000800000092 -:10A0E0000000000000000000080000000000000068 -:10A0F0000000000008000000000008000000000050 -:10A100000000A0008200000000000000000000002D -:10A1100000030000000000000808000084000000A8 -:10A120000000004000001000A00000000800000037 -:10A130000000C000820082000000000000008400D7 -:10A1400008000000C00000008200000000000000C5 -:10A1500000000000000000000084030800C000842C -:10A1600000A000000000000800000000000800003F -:10A170000800030204C00990000003100300080255 -:10A1800000000300000005002100200000880902F3 -:10A190000000000200000508000040000000200848 -:10A1A0002088000200000304000000C00500210018 -:10A1B00000900800000008000800200000000000D7 -:10A1C000000000000000000000000000000000008F -:10A1D0000000000000000000000000050800000072 -:10A1E0000041400840090000000800000000000095 -:10A1F0000800000000000000040000000000C00093 -:10A200000000080000000000000000000000000046 -:10A21000000000000000000000000000000000003E -:10A22000000000000200000040000000400010009C -:10A2300000000000900000009000102000000000CE -:10A2400004008200820000000800080000000000F6 -:10A25000A000C1000000008000000000000000001D -:10A260000000000000000088200020000000110015 -:10A27000000400040040000000044000030000024D -:10A28000000000000000000020001188020004040B -:10A290000900020200004000000040000000000031 -:10A2A000020020200400030000000500050200A0B9 -:10A2B0000000080000000500008800004100400088 -:10A2C0000000040004000000000000000000000086 -:10A2D000000010002000000000100000000000003E +:10993000FFFFFFC300008080000000000000000067 +:10994000000000000000000000FFFF000000000019 +:109950000000000000001EBE00000000000000002B +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000838F838F0303BD +:1099800000000000000000000000000000000000D7 +:1099900000004D4DCFCFCF0CEF2C55015555000099 +:1099A000000000000000F5F5353500000000FFC3A1 +:1099B0007D41CF0CD7D700AE00BE000000000000F4 +:1099C00000000000000000000000C13EC13E000099 +:1099D00000000000000000001E1400000000000055 +:1099E0000000000000000000000000000000000077 +:1099F000000000000000000000000000838F838F43 +:109A00004100000000000000000000000000000015 +:109A1000000000004D4D0C0CDF1CFF3C00005555B4 +:109A200000000000000000000505353500000000C2 +:109A30003C007D41CF0C141400BE00BE0061000646 +:109A4000000D000000610006000D000000613007FD +:109A5000009D000000610006000D0000006100068E +:109A6000000D000000610006000D0000006000070E +:109A7000000D000005610A0F050D00A00000A561A2 +:109A80004A0E050D00A0A0610006000D0000A061B7 +:109A90000006000D00000061000E000D0000000037 +:109AA00040000000000005610A0E050D00A50061E0 +:109AB0000007000D000500610006000D00000041D8 +:109AC0000000FF0FC303302830EB00000000FDF85A +:109AD0005D58FF0FC30300000000E1F0E1F000005B +:109AE0000000C0FC82BE000000004343C303050128 +:109AF00005015500FF00A0F5A0F5FF3CAA3C0000C1 +:109B0000F505F5F5D707D707000000002B282BAA8D +:109B100000000000000000003C0F3CFF00FF00FFC1 +:109B20000000000000000000553C550F3A3A3F3F4E +:109B3000A0AAAAAAEBEB0B0B000000003CAAF0AA1B +:109B400004450404FF0FC303F328F3EB00000000F7 +:109B5000ADA80D08FF0FC30300000000FFF000F0E8 +:109B600000000000C0FC82BE000000004343C303AD +:109B7000454105015454FCFC8282D7D7003CAA3CE5 +:109B80000000F50505050707D7D7000000002BEBFF +:109B90002BAA00000000000000003C0F3C002D2D0F +:109BA00005AF0000000000000000553C550F3A3A98 +:109BB0003030F0FFFFFF00EB000B000000003CAA7C +:109BC000F0AAFF0055550000000000000000EBFF68 +:109BD0000000FF3DFF05000000008082C0C30000C0 +:109BE0000000000000000000000000000000000075 +:109BF0000000C0C0C0C00AFAFC0CFA0AFCFC3CFF22 +:109C0000B2B2000000000000FFAA20AA000010006D +:109C10000000000000000000303F3F3F0000000057 +:109C200053535353000000000000000000000000E8 +:109C3000F0F0F0F0D7D714143F03414100000000CA +:109C4000F0F0F0F03C3C0F0F0000000000000000BE +:109C5000E8FC00003D3D050500000000A0AAF0FF63 +:109C600000000000000000000000000000000000F4 +:109C700000000000C0C0C0C0CACAFC0CFA0A0C0C2C +:109C800000C3B2B2000000000000FFAAE0AA00007A +:109C900000000000000000000000303F30300000F5 +:109CA0000000FFF00F0000000000000000000000B6 +:109CB00000003C3C00FF030303033F037D7D0000E5 +:109CC00000003A3A303F00002000880300002003E3 +:109CD00040034010200040104010880000000404A1 +:109CE00000000400400084008400C0000000200543 +:109CF00088098800000088058800880088004000E6 +:109D000084082004400800000400C00582051000FB +:109D1000200520002005040504028408000420100A +:109D2000040002008408401004004000C0108404B5 +:109D3000200000002000200004002000040804048B +:109D40002000400020000000000000002000000073 +:109D500000004100090000000000000000000000B9 +:109D60000400000040000000110000000000090095 +:109D700000000000000020000000000010000400AF +:109D8000000000004000000000000000000000C0D3 +:109D9000040400000000000000000000210000009A +:109DA000000000000090099000000000040009007D +:109DB00040004040000004000004000200001004C5 +:109DC000100010000000210020000004000000002E +:109DD0000200021000000000000902000000000460 +:109DE00000080408004000000000000000400004DB +:109DF0000000000000000000000002090210001135 +:109E0000000000000200020000000000000000004E +:109E10000004820300000010000300090004000099 +:109E20000021000902000000020000000000000004 +:109E3000020000000000000000000000000084009C +:109E40000000000000000000004000000008008446 +:109E5000000804080984000800080084000800883D +:109E6000401009880040008200080008000800082F +:109E70000084408200080408000840840008208410 +:109E80004008000800400088000802880000000820 +:109E900000080008000800100088008800100082F8 +:109EA00000840988400805080008008800840088AC +:109EB000000809880008000041880084008405002B +:109EC000090405820540000800080004000400039E +:109ED000000800210009884100000021000800035B +:109EE00000080008000200100008A0210040002126 +:109EF00000100008040800004021002100050010A7 +:109F000000089002000000080021002188210000C4 +:109F100000210003000090000000000800089003EA +:109F20000021002000210000A021000000400008C6 +:109F300000080003400800008221000000400005E6 +:109F40000000000000000000004090000009000830 +:109F500000840040000003000008000008820000A8 +:109F60000300080003A000A0000000A0038400007C +:109F7000030008A0000000002100000021004000B4 +:109F8000400041000800000008C00300030000007A +:109F90000000080000000000100000900000030016 +:109FA000000803000800210803200800080008A09A +:109FB000050021820000048421000000080803003D +:109FC0000000089000000000100003820000030061 +:109FD0000000900000004000100000000000A00001 +:109FE000C000C0000000040008200000080082003B +:109FF000084084400800C040C0000000084108003C +:10A000000040400008020041000900000000400438 +:10A0100000200000820000000800C00900090011B3 +:10A02000C000000908040004080200008400A00029 +:10A0300004000402824008000011080004400040AF +:10A04000840000028209040000020000A011084000 +:10A05000A009040203000084000008A0008403009B +:10A0600021C04000000000000000000000C00010FF +:10A07000110000880000109040C003100000034051 +:10A080000410210008001000080005C008C00000EE +:10A09000000000000000000200000000210200009B +:10A0A000000040001000000000000000000010044C +:10A0B00000000804110041041100200010400300BA +:10A0C0000000200400000040000002002100020007 +:10A0D0000000000000000800000000000000000078 +:10A0E0000800000000100800004000000000080008 +:10A0F00000000000821100000000000000000000CD +:10A100000000080000000000A00000000000C000E7 +:10A110000000000000000000000000000000A0009F +:10A1200000020000000000000000000082020000A9 +:10A1300000004000000000000000000000000000DF +:10A140000040000000000008000000000000820045 +:10A1500000000000000000000000000003400000BC +:10A160000000000005000000000002A00800000838 +:10A1700010000900004000A00000000003000000E3 +:10A1800000000300000003080000000000000020A1 +:10A1900000000384218400840000000003A0040068 +:10A1A000000000002100000000000000000000008E +:10A1B0000000000041000010210000000000080025 +:10A1C0000900210000001100000003002100001020 +:10A1D00008A00888000241040000002100100400CB +:10A1E0000000000400210000000000210000900099 +:10A1F00000000000000000000000200000000840F7 +:10A20000C000000084000000000000000000880082 +:10A21000001000000000000008000000000008021C +:10A220000002000200000000080000001000100002 +:10A230000000040008000000000008000800000002 +:10A2400000000000400082000008820010000000B2 +:10A250008400000800000000000000000000004032 +:10A2600000000000030003200000000020C02000C8 +:10A2700000C0000000000090080041000004000041 +:10A280000000200000041100000000000000000099 +:10A2900000200020200010001120400000000000DD +:10A2A00000000000000000000000000002000900A3 +:10A2B000000000000200000011000000000040004B +:10A2C00000000088009000000088100000002100BD +:10A2D000020000000090400000200000000000008C :10A2E000000000000000000000000000000000006E :10A2F000000000000000000000000000000000005E :10A30000000000000000000000000000000000004D :10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D :10A33000000000000000000000000000000000001D -:10A34000C000C001000000820100C00001820105C0 -:10A350000100C000004000822100C1000100038212 +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED :10A3700000000000000000000000000000000000DD :10A3800000000000000000000000000000000000CD :10A3900000000000000000000000000000000000BD :10A3A00000000000000000000000000000000000AD :10A3B000000000000000000000000000000000009D -:10A3C0000000C04183400000008002418041418084 -:10A3D000418341058321008000804100C12141412A -:10A3E000C18000000000000000000000000000002C +:10A3C000000000000000000000000000000000008D +:10A3D000000000000000000000000000000000007D +:10A3E000000000000000000000000000000000006D :10A3F000000000000000000000000000000000005D :10A40000000000000000000000000000000000004C :10A41000000000000000000000000000000000003C :10A42000000000000000000000000000000000002C :10A43000000000000000000000000000000000001C -:10A44000000000000080C1C100410005808041C1C2 -:10A4500000418341C1C1A103004100C100C180414D -:10A46000000080410000000000000000000000002B +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC :10A4700000000000000000000000000000000000DC :10A4800000000000000000000000000000000000CC :10A4900000000000000000000000000000000000BC :10A4A00000000000000000000000000000000000AC :10A4B000000000000000000000000000000000009C -:10A4C000000000000000000240210001000040C028 -:10A4D000002100018301C0C1204100014005C0C12D -:10A4E0002001000004010000000000000000000046 +:10A4C000000000000000000000000000000000008C +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000000000000000000000006C :10A4F000000000000000000000000000000000005C :10A50000000000000000000000000000000000004B :10A51000000000000000000000000000000000003B :10A52000000000000000000000000000000000002B :10A53000000000000000000000000000000000001B -:10A54000000000000000000000400000C00000000B -:10A55000009000010583018200C00000C183C0019A -:10A5600000400000C14000A000000000000000000A +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB +:10A5600000000000000000000000000000000000EB :10A5700000000000000000000000000000000000DB :10A5800000000000000000000000000000000000CB :10A5900000000000000000000000000000000000BB :10A5A00000000000000000000000000000000000AB :10A5B000000000000000000000000000000000009B -:10A5C0000000000000000000000000800041854104 -:10A5D000000000000003C183418000410000C183EE -:10A5E000800300800021C1C10000000000000000C5 +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000000000000000000007B +:10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B :10A60000000000000000000000000000000000004A :10A61000000000000000000000000000000000003A :10A62000000000000000000000000000000000002A :10A63000000000000000000000000000000000001A -:10A640000000000000000000000000000441008045 -:10A65000C1084082C02080C1838503C14180804100 -:10A660000341038080C10000C1A000410000000040 +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000000000000FA +:10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA :10A6800000000000000000000000000000000000CA :10A6900000000000000000000000000000000000BA :10A6A00000000000000000000000000000000000AA :10A6B000000000000000000000000000000000009A -:10A6C0000000000000000000000000000000002169 -:10A6D0000002409001C18521402183C0010500C0D6 -:10A6E0004001830101C040C1A020400400010000DE +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A :10A700000000000000000000000000000000000049 :10A710000000000000000000000000000000000039 :10A720000000000000000000000000000000000029 :10A730000000000000000000000000000000000019 :10A740000000000000000000000000000000000009 -:10A750008112000000004842821200E000004842DE -:10A7600088120000000048428112000000004842A8 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 :10A7700000000000000000000000000000000000D9 :10A7800000000000000000000000000000000000C9 :10A7900000000000000000000000000000000000B9 @@ -72341,7 +72341,7 @@ :10A820000000000000000000000000000000000028 :10A830000000000000000000000000000000000018 :10A840000000000000000000000000000000000008 -:10A8500000000000000000000000003000000000C8 +:10A8500000000000000000000000000000000000F8 :10A8600000000000000000000000000000000000E8 :10A8700000000000000000000000000000000000D8 :10A8800000000000000000000000000000000000C8 @@ -72349,675 +72349,675 @@ :10A8A00000000000000000000000000000000000A8 :10A8B0000000000000000000000000000000000098 :10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000400038 +:10A8D0000000000000000000000000000000000078 :10A8E0000000000000000000000000000000000068 -:10A8F000000000000000C000000089008800C005C2 -:10A9000010008800208488008400000004828400F5 -:10A91000840040800420880800200080002000007F -:10A9200004200403880400000000C00502020000A7 -:10A930000400400020000003000088048800820416 -:10A940000200000020102084880000800002208483 -:10A950000000C00400042085008000800004000086 -:10A9600000000080008300040002000000000000DE -:10A970000000000000000004000800004000030088 -:10A980000482800000000920000000000000400355 -:10A990000400000000100001000000010020000180 -:10A9A000000080000000000000C0000000000083E4 -:10A9B0000000800000000000000000820001210073 -:10A9C00000018000000000010040000000020001C2 -:10A9D00000210000000100008004000400040001C8 -:10A9E00000000000000200200000009000000000B5 -:10A9F000000000000002000000000000000001084C -:10AA00000000000090000000410000000000000075 -:10AA1000010000000200000500000080010904A000 -:10AA2000040000000180000020000000820200807D -:10AA30000104000000000100400000000080000050 -:10AA400000000010000500040100008582000000E5 -:10AA500001000080000000000040028000040004AB -:10AA6000000400040000000000004000000084001A -:10AA7000000000000000000000000000050000844D -:10AA800040000000118402402084C00000840008BF -:10AA90000000400800000000200000820040040088 -:10AAA000A0418000208802204084800000000585AD -:10AAB000000240080000000040088900000000205B -:10AAC00005100404008400000001080000040000D8 -:10AAD00000004010092000000000020300100001E7 -:10AAE00000010001000100080000000080000002D9 -:10AAF0000584050000000000000040020000000086 -:10AB0000000000210004000008080800204108009F -:10AB100000100010002100030000000301000120CC -:10AB2000020000004004001008210010080000008E -:10AB300000028400C00000039004002120000000F7 -:10AB40000080002000200120000001840003040494 -:10AB500084000000000000020003080000118405CA -:10AB600000000020880808000010001000100010ED -:10AB700000000000000000000000002000000000B5 -:10AB80000000000021000001000000004100000062 -:10AB900000000000210008000000000011900800E3 -:10ABA000020180A0040021090000000200880520A5 -:10ABB00000000000000841A000884100418400908E -:10ABC00000000804008541012001000020050082EA -:10ABD0008001038800A000000000000021000000A8 -:10ABE0000800000041010000808200010001000116 -:10ABF000000121000000210008000000000000000A -:10AC000000008200000008020900410000880800DE -:10AC10001000100020000000101000000400400090 -:10AC20000900082082000000082020008200820025 -:10AC3000A00041C082004000000009000800820816 -:10AC4000000000000804040400040404820008005A -:10AC5000820090848200C00008800540822020008D -:10AC60008200C0000000000900800800000000C150 -:10AC70000080008008000000400982000000000001 -:10AC800000020000000021200001200040004003DD -:10AC90001188050000840840030020000000049093 -:10ACA00040080200002141001008000005A0080033 -:10ACB000030000400210000011001000100003000B -:10ACC00011012102000011014101000121010000D8 -:10ACD000410000000221020800002002A000000044 -:10ACE00080400008000000201184002000000000C7 -:10ACF0004140034000400000000000000000000050 -:10AD00000000090000000008A00000008400000806 -:10AD100040048221080000000000820808000000B2 -:10AD20000800840000001000A008000020408400FB -:10AD30000400080084080800C00010000880C0005B -:10AD400002A0A00020000000202020008402400576 -:10AD500000008240840303200400A00800021005C4 -:10AD6000C000080408008500201108008200820449 -:10AD700000000000000400050000002100000000A9 -:10AD8000000008001000A00000000000000000000B -:10AD90000000800000000000100000000000030020 -:10ADA0000000800040000900000000000000890150 -:10ADB0000000800085000500000009004000001030 -:10ADC000400080210000808200008084800000001C -:10ADD000000000000001000020010000000041010F -:10ADE00000000000000100002000800000001000B2 -:10ADF00000910000000000000800000000000000BA -:10AE00000000000000000000000000000000000042 -:10AE10000000000200804009000000000000400027 -:10AE2000824000212000400020808203C0004000BA -:10AE300082008411200408000820C00000002021A6 -:10AE4000040040801080080004020000A00002807E -:10AE5000000420004008C004100000A084029021DB -:10AE600000210000A02084009021008584000400BF -:10AE7000080000080400002108100000000000097C -:10AE800000000420000008001000080020000082DC -:10AE900020044140004000028208088241900000E6 -:10AEA000000400004020400011002120030841A0C0 -:10AEB00020040400000091000000000000000800D1 -:10AEC00000900000820483040000000800000800D5 -:10AED0000320000140840000000100000011030075 -:10AEE000000000000000410000000000000400001D -:10AEF0000800000000000800000000010000000041 -:10AF000000880000000000000000000200000000B7 -:10AF1000000000000000020111010101900000008A -:10AF200000000200000088C040880020908288C095 -:10AF3000014004C00408C10491004010040840020C -:10AF400001910402C091C005900108880002000030 -:10AF500040410110A0200008C010018490419005DC -:10AF600000000100020000000004014002C00020B7 -:10AF7000C04090018890900810C0004000A00808D0 +:10A8F0000000000000002000200002042004884026 +:10A900002000200488840100209088040084201006 +:10A910002085210000802000C0042110C00088088C +:10A92000200520040400882021088400C020888598 +:10A9300021822000088000030000020004000800BB +:10A9400020002000C1000404910004002003200026 +:10A950000820040088200400050000000404880486 +:10A9600041800180008401048800400088040404C0 +:10A970000000880088042004090004A040010901A7 +:10A9800000000000000004202000092004A1002194 +:10A9900041004004200000040000000004002000EA +:10A9A000000000000200000400010400200000017B +:10A9B0004120042100908020000041008000009090 +:10A9C0008000800040002004090008A0000000A0D2 +:10A9D0000000830100000001200040000000000092 +:10A9E000000010042008000810000004040000000B +:10A9F000000000040404049000000009000000208E +:10AA0000000800100004001002100041008800043B +:10AA10009040004000200204000900000309820960 +:10AA200001008241824100108208000000800090F5 +:10AA300000030088008000000010000001040004F2 +:10AA40000108000000000240020501900010020011 +:10AA500001200000014108000382001000000104F1 +:10AA60000121010400412040840001000000000099 +:10AA70000000000082000000000000004082001082 +:10AA800000880010000800100082050800840020E3 +:10AA9000000820C00008000909090008000810008B +:10AAA00000084004008400400082021000080020DA +:10AAB0000420000805020510090805080000020826 +:10AAC000000808404008008404080008200200092B +:10AAD0000008020904100210000808411182410810 +:10AAE0004085400840090988410400082008000802 +:10AAF00020040082008420084082408209840010E3 +:10AB00001021C00800210010A008000800020084E5 +:10AB100010C1000500080100000501218221000389 +:10AB200001030003008000000008000890410010AD +:10AB300000000000000300200108000000200000C9 +:10AB40000005000000000000004010040002008822 +:10AB500008410000C0C100050008002101100000EC +:10AB6000004000000000000008080008010000216B +:10AB70000000000800080000000084000000000839 +:10AB8000000041842100000000000000008400005B +:10AB900000210004000000002000000010000084DC +:10ABA00000000408000000200000000000001082E7 +:10ABB000000000000000000000014000004009010A +:10ABC0000000000000000000000000000001000084 +:10ABD000000441A000000040050000A0000004089F +:10ABE0000000000008000900000000000000200034 +:10ABF000000000000000000000000000080000A0AD +:10AC000000000100200409111004900002048800D3 +:10AC10000840A00000000000C0008200900090806A +:10AC200008200400084140408200A0044004A00025 +:10AC300082402020820400000011080084002000CF +:10AC40001009000008000800000508202000C000CE +:10AC5000A0200800A0000000400002090800080031 +:10AC6000A100A00882100040080008400000040471 +:10AC70000400020400000440C00408000400C000F6 +:10AC80008400820220008083201080040010004095 +:10AC9000040021000084400000820000000400C085 +:10ACA00010080001C10000904000000011840382E0 +:10ACB0004000080200C04004020000000000030041 +:10ACC00011A0838200001082000000000000030039 +:10ACD000030003000004000008001040020003000D +:10ACE0009040020400A02100000003042002200282 +:10ACF0000000210240400800212000001104210032 +:10AD000000000900000000210000000010000810F1 +:10AD10000200A011850500080000000000050102E6 +:10AD20008404102000040000A000000000000010B7 +:10AD300000100000082100400200C08882000003CB +:10AD4000842101201002000082050005080500038F +:10AD5000080820000004200382200400A040000016 +:10AD600004000800082082000000C000000000006D +:10AD70000000080000000800000000000800820039 +:10AD800000000200080008000008000000000000A9 +:10AD90000000800000002000000000000000000013 +:10ADA000400100010001000100000000000002005D +:10ADB0000000000000000000000000000020000073 +:10ADC000000000000401000000000000000000007E +:10ADD00000A011008000000180200001800000011F +:10ADE00000008000000000010000000000000200E0 +:10ADF000000000000000000800002100000000002A +:10AE000000000000800800008004000040002004D2 +:10AE1000A104400001038200410000000000002066 +:10AE20000003008404100004082010210011040015 +:10AE3000000808000011002000000241000000008E +:10AE400000004010204040210008000020040020A5 +:10AE5000A02100050404820308094004002000200A +:10AE60000420102004408204000004A000000080A0 +:10AE700002A101001000400200000000400000009C +:10AE800000000000840020000800200003008082F1 +:10AE900003002082000002A041000488000004207A +:10AEA000000100000021000000A08000000002005E +:10AEB0000004000041400000034020002104040081 +:10AEC000030040000010410140A00001000000020A +:10AED0000340200000000005000403044100028537 +:10AEE00021851101210900C041000800A141020093 +:10AEF000000440042000020000000840404011907F +:10AF0000040400022040028400C0412020200100EF +:10AF1000000010000000000000000200000000100F +:10AF2000000210010804000190010100000100C0AE +:10AF3000908208840090000000000000000000C023 +:10AF4000001000080810A004001108831008000079 +:10AF500040000000000000000000010004000000AC +:10AF6000909084400040908211C020900020900278 +:10AF70000001010104010000000101009101000035 :10AF800000000000000000000000000000000000C1 -:10AF900000000000400000008004032140038010F6 -:10AFA000000003008000000040808000000000805E -:10AFB0000080100080008080898090200003800342 -:10AFC000808003028080802180C1C108C008008287 -:10AFD0000000800803110820098200851003400545 -:10AFE0008091091108408500002020830220C002C2 -:10AFF0000000800080080809000300800000008035 -:10B0000000800000000000000000000000000000C0 -:10B01000000000000300080011000200100083007F -:10B020004110000000000000000080008002008944 -:10B0300000808000004000008000200010218480FB -:10B04000C12020002090049080C00800830005915A -:10B05000C10000008000051008051088830005036A -:10B060000880A00803802000200008A18300202180 -:10B0700010000040880010002080830380800011B1 -:10B08000008000110000000000000000000000002F -:10B0900000000000000001000100002088888300FB -:10B0A000A0001110000000000000000008000201D4 -:10B0B00020058810080004000890C000002003400C -:10B0C00009A0C00091402105820210040300114034 -:10B0D00084A1C140000002A0A001019011108400D1 -:10B0E000A191A0A0C02000040000000000C1040045 -:10B0F0004000828200000502908201A082001004BC -:10B1000090019084408200000000000000000000D8 -:10B1100000000000000000000000000000000040EF -:10B120000104A189002100010001000000012002AA -:10B13000001000200402020300080040A0C10088A3 -:10B140000008848901C088010090000310090010E4 -:10B150004010891101410000400801404002109058 -:10B1600008020001020990C000010101080100006D -:10B170008200000100010201001101000220001004 -:10B18000208800088491A1900000000000000000C9 -:10B19000000000000000000000000000000011009E -:10B1A0000090200808210941002000020000004012 -:10B1B0000080000000008080809000A000A000912E -:10B1C00000200021852111A00040000000A100A066 -:10B1D00000118280C1200841000080030240C1A00C -:10B1E00000008009411182A10080000402409121E9 -:10B1F00004030000021141218020008203418510D8 -:10B2000003830040008380088920000000000000C4 -:10B2100000000000000000000000008900000000A5 -:10B22000000009C02021048010110000000000006F -:10B23000000000008040000000008040000400800A -:10B24000800010A19140048083038421A008410064 -:10B25000A04080000040008080100000C040200816 -:10B2600084800940A19009C04100C04141212108CA -:10B2700040001040A102828008004010002084A1FC -:10B28000840003038300884085000800000000005C -:10B2900000000000000000000000000000C00000EE -:10B2A0000000000001C0011001A001010000000029 -:10B2B00000000000820002024090C000C000049123 -:10B2C00020400200094105A00190A1010401A12133 -:10B2D000C0088300028810009090A0010000104078 -:10B2E0002020414088011103840490008201000164 -:10B2F0000000000001000590A1102020900040896E -:10B30000050202A08800C000042002100100000015 -:10B3100000000000000000000000000000008100AC -:10B3200000E000004200000000E007008400000090 -:10B3300000000000000000410000070000000000C5 -:10B3400000E007000000000000E0070082000000AD -:10B35000000000000006000000E00700824100003D -:10B36000000000E007000000000000E00700000609 -:10B37000884100E007000021000000E0000000001C -:10B38000000000E00700820000000000070000004D +:10AF9000100003001100000000000000100000007D +:10AFA0000009110390088089114180214020001080 +:10AFB0004080008080800000000000000000000051 +:10AFC0000000008000808080008911218002808242 +:10AFD0000000800000000000000000000800C00029 +:10AFE0000000030000000080808089808000000055 +:10AFF00080800002410300110010404103214010F5 +:10B000000000000000000000000000000000000040 +:10B0100000002040210010404021000010001000DE +:10B020001080100083002000A002200820000441AE +:10B030000404800080008041808000000000000047 +:10B0400000008000800200800000200504009000C5 +:10B0500004210000000000008004800000090000BE +:10B06000000900000000000500800000100004201E +:10B070000980048005800500400020820300200034 +:10B08000100041000000000000000000000000006F +:10B090000000800000080000000000010000000027 +:10B0A000010001C002100900008209410091004026 +:10B0B00000000085400082008401C0C00000000044 +:10B0C000000000000800100000208800019090821D +:10B0D000A10001830000C00000000201C0000000C8 +:10B0E0000000000000000000008400A000840100B7 +:10B0F0000000000401820002000000000105008839 +:10B1000001000100014000000000000000002000DC +:10B1100000008200C00000004001C00000000000EC +:10B12000000000010000400500C0028908C00100C5 +:10B13000C1008500000000400082C08501C1000000 +:10B14000000000000000001000100008021008219C +:10B1500000114191A021000100040010000400C072 +:10B160000000080000010001202000020484028485 +:10B1700020A000A0848401C00000000103000001A1 +:10B1800000010001000000010000000000000000BC +:10B1900000000000000000000011800800024010C4 +:10B1A0000000000000210310802000000508800935 +:10B1B00004009000210020000083008980A041C18C +:10B1C000000000000000000000800080008080007F +:10B1D0008820038805109090000102800080008084 +:10B1E0000080000580020020090404000080008027 +:10B1F000C0000000008000800980000541038840F5 +:10B2000040200010202041400041000000000000CC +:10B210000000000000000000000041800500210047 +:10B2200011110080008200000008000003901180CE +:10B23000890920800309400011108011804080415D +:10B240008000000000000000000080048084800076 +:10B25000000041202009218003040001000000803B +:10B26000008000000000000000000000800080104E +:10B2700080000000809180400000800305004009AC +:10B2800020004003412010004100030000000000A6 +:10B2900000000000000000000000000001C00000ED +:10B2A000010000010010000200000001880088C0B9 +:10B2B000880208000008010000000101C0008201AE +:10B2C00084000402000000000000000010000821BB +:10B2D0000810000001A00000014000000001000073 +:10B2E0000004000400000000000000000000C00096 +:10B2F000A00102008200C04120009000040100C0B3 +:10B3000000000100010101410100000000000000F7 +:10B310000000000000000000000400A00000000089 +:10B3200000E000004100000000E0070000210000F4 +:10B3300000E007004100000000E00700820000007C +:10B3400000000700004200000000000000000000B4 +:10B3500000000700000000000000070000000000DF +:10B360000000000000000000000000E000000000FD +:10B3700000000000070000000000000007000000BF +:10B38000000000E000006000000000E0000000009D :10B3900000000000000000000000000000000000AD -:10B3A0000000000000000000000000009F9FDB0084 -:10B3B00000000000000000000F0F00FFF0FF000081 -:10B3C000F0F0F0F066F366FFFFFF993C0C0FF3F02E -:10B3D000F0F0FF00000F0000666603F3F0FC666605 -:10B3E0000000F3F3F3F7606F6C6C00003000FF00B7 -:10B3F000FF0000000000000000003C3C363600006A -:10B40000000066CF66C07E7E7E7EF6F6FF66FFFF9A +:10B3A000000000000000000000000000000000009D +:10B3B000EF2FE0203CFF3C000000000000000000F8 +:10B3C000000000000000000000000000000000007D +:10B3D0006F60FFFFFCFCC0FC00000000BDF624F61F +:10B3E00000000000000066F0663C00000000000065 +:10B3F00000000F0F3C3CFEDABC98181890907E427B +:10B40000F3F3000000000000000000000000000056 :10B41000000000000000000000000000000000002C -:10B4200000000000000000000000000000009F9FDE -:10B43000DBFF00000000000000009999C3C3F0B1D9 -:10B440000000BD24FF00663066000000993C0C0F30 -:10B4500066667878FF0000060006666603F3F0FC77 -:10B460006666000003030307606F6C6C1000100039 -:10B470003C3C66660000000000000000FF00FF008A -:10B480000000000066CF66C042427E429090990064 -:10B49000060C060C00000000000000000000000088 +:10B42000000000000000000000000000000000001C +:10B430000000EF2FE020F0FFF0000000000000000F +:10B4400000000000000000000000000000000000FC +:10B4500000006F600000FCC0C0C000000000BD9094 +:10B46000249000000000000066F0663C0000000030 +:10B4700000000000FF006666E6C2A480FF00909016 +:10B480007E4230300000000000000000000000009C +:10B4900000000000000000000000000000000000AC :10B4A000000000000000000000000000000000009C :10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C +:10B4C000000000004108400000842102000000004C :10B4D000000000000000000000000000000000006C :10B4E000000000000000000000000000000000005C :10B4F000000000000000000000000000000000004C :10B50000000000000000000000000000000000003B :10B51000000000000000000000000000000000002B :10B52000000000000000000000000000000000001B -:10B530000000CF0C0F0F00000000000000009F1C57 -:10B540009F000000FF990F663C6600FF00FF3C3C37 -:10B550000F0F6F6F0FFF63666F66FFFF6F6F303007 -:10B560003F3FF000C0C000000000FFFF0F0F0F0FB3 -:10B57000000600004E4E0CCF00000000000000004E -:10B58000C7F7FFFF010101013C3C0F0F8080C0C0E5 -:10B59000E7E70CCF01813DBD000000000000000086 -:10B5A000000000000000000000000000000000009B -:10B5B00000000000CF0C999900000000000000007E -:10B5C0009F1C9F9F0000C9990F660F663C3C1E1E82 -:10B5D0003C3C0F0F606000F060666C66FFC36F4319 -:10B5E00030303F3FFF0FCFCF00002F20EFE0E7E7E5 -:10B5F0008181000200024E4E0CCF000000000000CE -:10B60000000004340000008100813C3C0F0F00006A -:10B61000404024240CCF01003D3C0000000000000D -:10B620000000000000000000000000610007C00DE5 -:10B6300000000061000F000D000000610006000D19 -:10B64000000080005038000000A0A061500E00995A -:10B65000000500610E0C0299000500610006001D46 -:10B66000000000610E0B00050005000000610009EC -:10B67000000100000061300D009900A50061003F4D -:10B68000C00D00A0806100050009000000610E09E6 -:10B6900000010000A061500E050D00010000000037 -:10B6A000000000000000000000000000000000009A -:10B6B0000000000002027F7F0F00000F000000006A -:10B6C000CDCDC4C400000000000000000000000058 -:10B6D000000AFDFFFF00FF0082F700F700000000F6 -:10B6E0009669C3BE000000003CFFBEBE0000555579 -:10B6F000FFFFAFACAFACFFF30F03B2B2B2B20000CA -:10B70000000000C30055CF00CFFF5555F0F07D413C -:10B710007D410AFA3C3C3C753CF5C000FC00000051 -:10B720000000000000000000000000000000000019 -:10B730000000000000000F2F0F2F00003C3C000015 -:10B740000000676789890000000000000000000019 -:10B7500000000000FFFFDF08FF0000FF00F700000F -:10B760000002003C967D0000000000C382820000C1 -:10B7700055550003A0ACA0ACFCF00C0000FF00FF8E -:10B78000707D007D00C3000F0C000CFFFF00FF0068 -:10B790003F033F030AFA3C3C3C753C55C000FC00AB +:10B53000000066660000FFFFBD241E1E7E7E000028 +:10B5400000000000000000000000000000000000FB +:10B550000000000000003C903C9F0D0DFDFDF04000 +:10B56000FF7F0F0F0F0F00000000000000FF00FF23 +:10B5700000000000000000009999FF00000000009A +:10B58000030300C3000000000000000000000000F2 +:10B5900000000000000000000000000000000000AB +:10B5A0000000000000FF00FF00000000000000009D +:10B5B00000000000666600000000BD241E1E181872 +:10B5C000000000000000000000000000000000007B +:10B5D00000000000000000003C903C9F0404F4F4D4 +:10B5E000F000FF0F00FF00FF000000000000666693 +:10B5F0003C3C0000000000000000F0F0C3C300006D +:10B6000000000F0F00FF000000000000000000001D +:10B61000000000000000000000000000000000002A +:10B620000000000000003C3C666600610007000D61 +:10B6300000000061000F000900A80061000900017E +:10B64000000005610A0F050D00A00061000E000D4D +:10B6500000000000000000000000000000080000E2 +:10B66000000005610A0E050D00A1000000000000A9 +:10B670000090000500610007000D0000A5000A0809 +:10B68000050000A0A0615006009D00A0006100041C +:10B6900000010000000000010000000000000000A8 +:10B6A0000000000000000000000000052B2BC3FF7D +:10B6B0008787550000000000AAAA00FF5F1E5F1EDA +:10B6C000FF55FF3C50FA828200000000000000009D +:10B6D00082BEC0FC0000000000000000000000006E +:10B6E000000000001717FFC3F382F3BE0000000044 +:10B6F0000000000000000000000001AB01BF0000DE +:10B7000000000000000000000000000000005F3F9B +:10B710005530AAFF30FF55053C0CFA0038000000F8 +:10B7200000000000000000000000000000002B2BC3 +:10B73000003C8787FFAA00000000AAAA00FF4B0A6E +:10B740004B0A0055003C50FAD7D70000000000001B +:10B75000000082BEC0FC00000000000000000000ED +:10B7600000000000000017173C00308230BE0000CF +:10B7700000000000000000000000000015BF01BF35 +:10B7800000000000000000000000000000000000B9 +:10B7900055305530AA00303055053C0C00003800BB :10B7A0000000000000000000000000000000000099 -:10B7B000000000000000000F7D82827D04FB5555D3 -:10B7C0000000000000000000000000000000000079 -:10B7D000000000000000000000FC00FC7FFFFF7F75 -:10B7E00000C300C378D278D2FF000F0F0CFCAFAFBC -:10B7F000000014341434AAAAAAAA0F4F0040AAAA1F -:10B8000000FF000000EB80000000AAF0AA005C50DE -:10B810005C50DF5DDF5D3C7D78780000000000005B -:10B820000000000000000000000000000000000018 -:10B83000000000000000000000FF5DA2A25D00FF0C -:10B840005050000000000000000000000000000058 -:10B8500000000000000000000000000000000000E8 -:10B86000000000C300C378D278D255553C3C0CFC94 -:10B87000A0A000000030FFFFF0F000FFFFFFF0F09D -:10B88000AEAE00FF0000EBEB80000000AAF0AAFFC4 -:10B890005F535F538A088A083C28787800000000CC -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000001008900028001002100010059 -:10B8C0008800210021000000850020830400000280 -:10B8D0008800A00088000203080005008885000099 -:10B8E000820040002000000000080200888800005C -:10B8F000840803000003880004842000040400106E -:10B900004000400000002000000000050285000407 -:10B91000200400040404000088000000000040002F -:10B92000200020000400200400008200200000000D -:10B93000040000050000020002008040020002A096 -:10B94000020000000200029000000200004000001F -:10B9500000012100400000000000800020000010D5 -:10B9600000000082008200000000000000000004CF -:10B970000000000020000000000085210000000100 -:10B9800000010082410004000000000000000002ED -:10B990000001800100018001000000002000000083 -:10B9A0000000000000000020000000000000000077 -:10B9B0000000000000000000000000000000000285 -:10B9C0000000000000040002000000000008004029 -:10B9D00000000000010000000289040001100420A2 -:10B9E0000040000000000400000000000080001083 -:10B9F0000000000000000000000000000000000047 -:10BA00000000000004000009048000000080000025 -:10BA1000004101801000108941000000000000007A -:10BA20000000000000850041000004410400050002 -:10BA30000400010000008800000000000000210058 -:10BA400000090040110400080911000800100088D6 -:10BA50000909000000820888000880028008084167 -:10BA600080850089000800088000001000000002A6 -:10BA70000009004000100040000800000008008499 -:10BA8000004000040040C108008280400000002007 -:10BA900000880008200880008008A0080008000036 -:10BAA000000000000000002000000000800085046D -:10BAB0008400800440004000000400080021004190 -:10BAC0000021002100080008000300050088000094 -:10BAD0000084201000050000002100030005000084 -:10BAE0000100004100000000001090110021002121 -:10BAF0000000882188040080000000800000080405 -:10BB000004030103000200800000008040020000E6 -:10BB100000418402001100000000100000800000BD -:10BB200000000008082100090000001000000000CB -:10BB3000900000000009000000410000000010100B -:10BB4000000000080500000000000000000041099E -:10BB50000004210580000000410008002100410090 -:10BB600010A008000308000003000300000000000C -:10BB70000008008400000001000408000004000028 -:10BB80000082808840A00900214005001010038336 -:10BB9000030005000000030008000000400000084A -:10BBA000210000C0080021C00008000000080002B9 -:10BBB0000000000000020000000021000000000062 -:10BBC000888008000041C000821100850900400003 -:10BBD00010088402200420848209400240020800E8 -:10BBE0008200080008008340100002400800820024 -:10BBF0004009C000400082009000001120110800A0 -:10BC000000008202400240008241021100020080D6 -:10BC1000A00000008200844108A000000010201055 -:10BC200000840010C010080000000000040482001E -:10BC30000000008000844002008400040004000032 -:10BC4000000400020000000005000300094002009B -:10BC5000000080010000414080050000000000005D -:10BC600000000008410000002001030080000400E3 -:10BC70000000000000000000000000000000800044 -:10BC800004000000000000002100110088001000E6 -:10BC90000010000000000040000000110040000003 -:10BCA0008008002000000000000000001000880054 -:10BCB00000000400202000200304002000000300F6 -:10BCC00000000900000802088221020200000803A7 -:10BCD0000000A02182080003200401000008C00029 -:10BCE000820000000000000082080000082100110E -:10BCF0000800080000208200A00010000000820060 -:10BD00000800004000008200C000002082000040C7 -:10BD1000880500000810A005040082200011000022 -:10BD2000000008000000000000000000000000000B -:10BD300040000000000000000000000000000000C3 -:10BD400000000000000000A0800000A0C000020071 -:10BD500000000000008400010000800120000000BD -:10BD60000008400400840300410411000300210086 -:10BD70000004800000080382000808840800008492 -:10BD800000400804008400002104058421054000CF -:10BD900003002100080000010000800800030000EB -:10BDA00005C00000100008000890088403C0038448 -:10BDB0000908400405001190000000000000000088 -:10BDC00000000000000000000021004100400805C4 -:10BDD000001090000800000500400040014084046D -:10BDE0000000C01100080400824082000000000230 -:10BDF00004080003040001000010400008000200D5 -:10BE00000804C004080490040000080208000000B0 -:10BE1000090940002010004000030200A020040097 -:10BE200040008821000000044000000000000000E5 -:10BE30000000000040210000000900008300000015 -:10BE400000000000080020000000000000000000CA -:10BE500000000000400008880000080502012003DF -:10BE6000004100000200000000000000000003008C -:10BE7000000000000000000004000800000080082E -:10BE800000000001000100010000000000000000AF -:10BE9000000008C0000000000000000008000001D1 -:10BEA000000002040000000000110000000000007B -:10BEB0000000000000000000000000000800040472 -:10BEC00000020800200020000000080010100005FB -:10BED000022010088402884002C0080840410885FA -:10BEE000910984A011000101840002010040900921 -:10BEF0009110880240A00082000888108200010092 -:10BF000002000000010004008401000100000200A2 -:10BF10009000041082A09110901040108200030045 -:10BF20000100020210A00001000003010000000057 -:10BF300000000000000000100090008400080202D1 -:10BF4000009000C000880000000100010001808214 -:10BF500040218002808900004080910080808083A1 -:10BF6000402184910002100420108020002100C094 -:10BF700080A10211004080000000000000000500C8 -:10BF80004100000000001003852120040002000091 -:10BF900080008500880080001000098000808000FB -:10BFA000900041000080000005414121020400038F -:10BFB0000000000000000000000000800000000001 -:10BFC000838000000000000000410003001000100A -:10BFD0000080001100000010030089418911200039 -:10BFE000410040820391C103100010009000000046 -:10BFF0002000020940A11105000000050082000098 -:10C000004000890005002100400005004100400378 -:10C01000000090004003A080C1C10000002180000A -:10C0200000000000000080800000080003000511EF -:10C03000418500000000000000000000000000003A -:10C04000000080000021000000000000000000044B -:10C050000000020802A0A084A0A1100082041088A1 -:10C06000840282C000C00091C1A1A1C0C1004100F2 -:10C07000A0409140000801A100000000100010A1A4 -:10C0800088008400200041009140019000000000E1 -:10C090000001000011A0C18285A0C10902001000AA -:10C0A000102000002000004040A0200091820200EB -:10C0B0000401859000000000000000000000000066 -:10C0C000000000000200000000401000000000001E -:10C0D0000001000202030004C0C0C00805400011B6 -:10C0E00084C1101188890120418591A10041010975 -:10C0F000A08300A1C00000119101C0C120A0008850 -:10C100000010A0C0004000210041004000010000DC -:10C1100084000000000000890040080204820482BC -:10C1200000880020C0C00090000100202002000014 -:10C130000001000000010000000000000000880075 -:10C14000000000000800008800404090000000004F -:10C1500000004000000011881005080300C0418362 -:10C16000009000219183828940838585910200C0DF -:10C1700004100321008280200502202140A000003D -:10C180000080000080800040000300840440001014 -:10C190000503054100050000002000918041840056 -:10C1A00000850083000380800000000200100082F0 -:10C1B00000022108200840410000000000000000AB -:10C1C00000000000000000000000008000000000EF -:10C1D000000041001000000002001000040089006F -:10C1E000008080C00000800989A1038002009011B6 -:10C1F000102104004100081041410340C00011100B -:10C20000800380A100000000000900800080000978 -:10C2100002C04000040004020000400982C011096D -:10C2200003118000800400000000000000050000F1 -:10C2300000004104108520002020000000000000C4 -:10C2400000000000000200000000000000050000E7 -:10C2500000000000000000000000020005040202CF -:10C260000800C0088282C0C0080189890504A100B5 -:10C27000900101A1019000400100A0051100419032 -:10C2800003000800A0102090A0000082000200021D -:10C290000000014100000100010000004001889001 -:10C2A00091C000018200A011048882002000822039 -:10C2B00090104000010101C00108010100000000D0 -:10C2C000000000000000000100000000000020400D -:10C2D00088200000000000000000000000000000B6 -:10C2E000000000000000000000008200480000E0A4 -:10C2F000000042000000000000000000000000E01C -:10C30000070082000000000007000000000000009D -:10C3100000004200000000E00000000000000000FB -:10C3200000E007000021000000000700008200007C -:10C33000000007004200000000E007008800000045 -:10C3400000000000000000000000070000000000E6 -:10C350000000070000000000000000000000758AD7 -:10C36000F50AE41BE41B5A5AA55A96693CC30FD838 -:10C370000F5A27A5D85A00000000C1C3C1C35050AE -:10C38000005000000F0F40C343C35541FFC30000DE -:10C3900000000041404000000000000000000000DC -:10C3A000AFAFA0A0FFFFAA3030303A3AAA82AF87E1 -:10C3B000F0C3AAAA003CC3FF000000000000000078 -:10C3C000000000000000000000000000000000006D -:10C3D00050505050080D080D0000000000000000F3 -:10C3E0008A750AF5CC33E41B5A5AA599966936C961 -:10C3F000F027F0A5F0F00F0F00000000C1C301030B -:10C4000014501450F0F0F0F000C300C355550F0F56 -:10C41000000000000041404000000000000000005B -:10C420000000AFA0AFA00000AA30303F303FFFD7E0 -:10C43000AF87F0C3AAAA283CEBFF00000000000071 -:10C4400000000000000000000000000000000000EC -:10C45000000000550055080D080D00000000000008 -:10C460000000AA55A55A6AAA95555A1BF0F05A1B06 -:10C47000F0F03333CC333C3C555500000000CF0C7A -:10C480007D7D0000FF3FFFFFFFFF5CFF50FFFF00CF -:10C49000000000000000FFFFFFFF000000000000A0 -:10C4A000000000008E8E8E8EFFF0A3A3A5A500A035 -:10C4B0000F000F001717171755FF55000000000059 -:10C4C0000F000F0000000000000000003F3F0303CA -:10C4D000000000003030F000AAAA828200000000B4 -:10C4E00000000000A956A55A55AAAA55A5E40F0FA9 -:10C4F000A5E40F0F9933CC333C3C555500000000A8 -:10C50000CF0C414100005030C3C3C3C35C00500096 -:10C5100000005F0A00000000FFFFFF7F0000000036 -:10C520000000000000008E8E8E8E0F00A3A3A505D4 -:10C530000000004D004D171717177DFF7D0000000C -:10C5400000007F4F70400000000000000000C34169 -:10C550008200000000003030F000282800000000B9 -:10C5600000000000000040618006002D10024061C4 -:10C570008006002D100240608007C0214202006149 -:10C580000006000D000000613E0F00990000000051 -:10C5900000080090000100610006000D000000612D -:10C5A000000100010000000000610E0D00090005FF -:10C5B0000061400E009D000100610E0E000D0000A4 -:10C5C000002100090005000000000000000000003C -:10C5D000000000080000000000000008000000004B -:10C5E00000610006000D000055557D71000000003F -:10C5F0000000000000000000FFFF5CFF8000D00092 -:10C60000F0F0F0E000FFCFCF2D0F2D0F3F30AFA0A7 -:10C61000000000000000000000000000FFFFFCBE62 -:10C62000FFFF7F3FBAFFFFFF000057027F2A3E7FD8 -:10C630003E7F00000000C200C20000000000AF0FFB -:10C64000AFFF7F437D4182AA8DA50000000000005E -:10C6500000000000000000000000000000000000DA -:10C660000000000000000000000055554D41010091 -:10C670000000000000000100000000005C009010BD -:10C68000D010F0F0F0E000FF5050AF0F050F3F303A -:10C69000AFA000000000000000000000000000004B -:10C6A000C082FFFF5F0FBAFFBAFF0000D700FF286C -:10C6B00002430243000000000200020000000000EC -:10C6C000A000A0F07C407D4182AA7D5500000000C2 -:10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000F505F70752 -:10C6F0000000000000000000FFFFFFFFFC0CFC0C2E -:10C70000000300C0EB4F4141C5C5C5C5FF55BF156E -:10C71000F0F055550000000000000000000000008F -:10C72000E8AAE8AAFFFFFFFFFFFFFFFF00000000ED -:10C730000000303F3A3A0000000000000000000016 -:10C740000000000000005F5FFC0C50FA14BE000007 -:10C7500000000000000000000000000000000000D9 -:10C76000000000000000D71428EB00000000F505D1 -:10C77000F4040000000000000000FEFFFFFFFC0CBE -:10C78000F50500820014414F4141FF0FFF0FAA0041 -:10C79000AB01F03055550000000000000000000023 -:10C7A00000000000FFFFFF1F1F1FBABABAFF000002 -:10C7B00000000000303F3A3A000000000000000096 -:10C7C00000000000000000005050FC0C50FA14BEA5 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000D81B28EB0000000043 -:10C7F0000000C000C000200088000000C005020446 -:10C80000880020008400020040000200840004042C -:10C810000000C00000000400200000008800840028 -:10C8200082000000840020000400000020000004BA -:10C83000000300000000C0008441200002008400CA -:10C84000000088000000000920002000000004040F -:10C85000000400000000000000002000200004048C -:10C860000000200000008200000084004000000062 -:10C870000088410000C00000410000000000048268 -:10C880000000110000002000000000000000040073 -:10C890000001000000002000030000000020040050 -:10C8A0000000000000000000000000000000040084 -:10C8B00000830000000000000000200000000000D5 -:10C8C0000000000000000000040000000000000064 -:10C8D000000000090000000000000000000400004B -:10C8E0002000000000A00000000000000000008206 -:10C8F0000000000400000020000000000000000014 -:10C900000004000000000010000000000000000013 -:10C910000004000000000000000000000000000013 -:10C920000000000000000000000000000000000007 +:10B7B0000000000055FF550000000000F0F0F0F020 +:10B7C000FCF00C0004C72CEFF330D7D72A2F7A7F78 +:10B7D0000000000000000000000000000000000069 +:10B7E00000000000000000005555C5C5EB30EBF32C +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000E1E176 +:10B81000F0F006009000AAF03CFCFF005555F0FF48 +:10B82000303C0000000000000000000000000000AC +:10B830000000000000000FC30FC3000000005555BA +:10B8400000FFFFF30F0304C72CEFF330141420257F +:10B850007075000000000000000000000000000003 +:10B8600000000000000000000000F505C5C52830FC +:10B8700028F30000000000000000000000000000AD +:10B8800000000000000000000000000000000000B8 +:10B89000F5A0F5A000060090AAF000F00F00050545 +:10B8A0000000303C0000000000000000000000002C +:10B8B000000000000500050020104040201002009C +:10B8C0002104210020092005200800000400200098 +:10B8D0000400400020082010880488002020400038 +:10B8E00021202004200088002020010040002000AA +:10B8F000840020000003000084004000020040009B +:10B900002000400220002000890020040103418023 +:10B9100003800080828089C040800410098040003C +:10B9200089008405C000C10020000100C00300039D +:10B930000400098389900400040009000001050047 +:10B9400080002001200000000900000004820000A7 +:10B9500000A0800021000000410004000008410117 +:10B96000A0000401412100000000000102000000CD +:10B970000000000004000000210004000000090095 +:10B980002000000000010400800040008001200031 +:10B9900084400440054000400221802000018820AE +:10B9A0008000200000000000200000002000400077 +:10B9B00000000000A010204100040100000200006F +:10B9C0000000000500040000000000080000000066 +:10B9D0000000000800000000001000000088004087 +:10B9E000008889800004002000C00080000202203E +:10B9F0000080004000080188000000020000009064 +:10BA0000000000000000000501800000018000002F +:10BA10000004000000000005000801000000010013 +:10BA2000011000000100010000210041000400009D +:10BA30000100000000800000008009410884000926 +:10BA400020044008401040840004020800100984CB +:10BA500009C0020800400008000803844088200252 +:10BA6000000809022004000909090010002000094B +:10BA700004850002091000400802000000110008BF +:10BA800005100004008400000008400800080804B5 +:10BA90000082000800820584054000404084400880 +:10BAA0004008400100404084404000880008408336 +:10BAB0000484020820000010090800080021000387 +:10BAC00000000108004000C00008008800030003D7 +:10BAD00000000000002101200020010300050008F3 +:10BAE000001000400004044100008305C020000055 +:10BAF0000021400800050003000000400000002174 +:10BB000000050008004100000021000001000004C1 +:10BB10001008002100C001212008040804210004AD +:10BB20000000042100000004000500880004000457 +:10BB30000100000400400021000204042000000075 +:10BB400000000082021000A000411100002003A0AC +:10BB5000218441101108000004A10001040000002C +:10BB60000000000000000001800000001000030140 +:10BB700021000310800011000000001000100000E0 +:10BB800000840000080000C0210000000000100038 +:10BB90000801210003C0004120008000808880004F +:10BBA00000010800800000A0000100000004000166 +:10BBB000080120001001000100000001C18980007F +:10BBC000A000090910048285880004000400048094 +:10BBD000A00000004000400810008200080082041D +:10BBE000A000A000A000100010411002C000A000A2 +:10BBF000C003091010008241A00540008200A0008F +:10BC00000000A009080904000800400440050800DD +:10BC100010058211200208021100080541000941A7 +:10BC200083004020C0A0002082A00800A0000800DF +:10BC3000400082008200C0000080820090009109D4 +:10BC400009000008200000010004004000008002FC +:10BC5000C10441000000000020A00084009000000A +:10BC6000000000000000000009900000000100003A +:10BC7000209011080801404000A0000004000000CE +:10BC8000000000000800050000001010C0828208BB +:10BC90000000808221048000000884400000409061 +:10BCA00040004000000100210001080500002000C4 +:10BCB000000088000000210000020004090041008B +:10BCC00040004000080000002010010500C10808E5 +:10BCD000830010000021000000000005002000008B +:10BCE00082000020880000000121080000000840B8 +:10BCF0008200828000050003C005004000030008A8 +:10BD0000A000000300000003A02100210021C000CA +:10BD100000008200820810200800002082048200B7 +:10BD2000820008000000000300000800000000007E +:10BD3000000000041008A000000808052000100002 +:10BD40008200000000000000000080020484001057 +:10BD5000830004000000008800C000C00008080143 +:10BD600000000300030103000000080021000000A0 +:10BD7000000000000020000000000000001108008A +:10BD80004100080203000000000400000000000061 +:10BD900000000000009000000001210000012101CE +:10BDA0002100000003004000004003000000008468 +:10BDB00000000300000121000000000000008000DE +:10BDC0000084000000000000000001080080100056 +:10BDD0000402034000C10020000000000000000831 +:10BDE00004001021840082119004C000400004006F +:10BDF000A040A000A0048200A0210408401004215B +:10BE00008208A000000400000000820882400000B8 +:10BE10004041A0089003000010004021A1028200D0 +:10BE2000000800000803200020000020820001021A +:10BE300004A0042108049003400490002011080588 +:10BE4000A00002410800A0098800000004000020B2 +:10BE500000004000820140200001110041000090DC +:10BE6000000480000000000000002010000000849A +:10BE7000000021000090008920900000890000044B +:10BE800080020000008400002000000010000490E8 +:10BE9000030000000300000000880000210008915A +:10BEA00000900001000000008000880020010000D8 +:10BEB00004001120200000410010098909008200BF +:10BEC00009000088030020000010000490C0000456 +:10BED00001A00888A0A040400110C0080000000098 +:10BEE0000000000000000000000000000000000052 +:10BEF000000000000008A0108801100802C0000423 +:10BF000090A010200001C101820000010000080182 +:10BF10000000000100010000A0008200000004C039 +:10BF2000918289A00402C0C182409040C082084032 +:10BF3000000040A18804000001002001000001A0D1 +:10BF400000820108000400C0010400A002208080DB +:10BF500000804080800000800000408080800000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000908290400380908280CA +:10BF80000080008080000020202080100040000001 +:10BF90000010000300400004000285109100000220 +:10BFA000918083000280008000884085000380A08B +:10BFB00083830520801000840040030000020040BD +:10BFC00020000080048000800080030000008000CA +:10BFD00080098000020885800000000300838080C3 +:10BFE0000000000000000000000000000000000051 +:10BFF0000200040002001100208402031088C0A186 +:10C000008200414185910400000000000000800092 +:10C0100000000000000000000000000004004000DC +:10C02000048485030800084185218800052080825A +:10C030008410838003090091A01041002000044077 +:10C0400002400002002100C0000010802100040016 +:10C0500005840200088805010802A0002001009163 +:10C06000C0900000000000000000000000820000FE +:10C070000008000000000100000040904001001195 +:10C08000088902001085400484A0900010008200FE +:10C090001000000000000000000000000088010007 +:10C0A0000100008904A18584050082A104A0080183 +:10C0B0000805C001A00210A0840502A10000010033 +:10C0C000000001820001000200090082C104830017 +:10C0D000C100A088C09020082088A1A040000020B6 +:10C0E0009040000000000000000000000000000080 +:10C0F0002000000000000000840000000405A008EB +:10C100000082110891100082A011A104000001001A +:10C1100001010001000000A001200040000000001B +:10C1200000010100010003C0C00984A0A105902006 +:10C130000082008208C101890089050811C100013F +:10C14000010000000100080020000400410004413B +:10C1500000A020A18304208000808000C100830013 +:10C16000000080800500000000000000000040008A +:10C1700000000000000000000000000000000002BD +:10C1800021910503A0C08280001000028984000470 +:10C190000802050509400000000040804000000042 +:10C1A0000000212005001105840580A00008C19130 +:10C1B0000000400500038082041000900380898302 +:10C1C0000002030441090420800080008000410037 +:10C1D000808400A100200985000400210080001057 +:10C1E000802080100080000000000000000000009F +:10C1F00000000004000000000080000000000002B9 +:10C200004104058421809108000380210080000200 +:10C21000000000000000000000000003000000001B +:10C220000000410900004000404141000385210019 +:10C230000308C0000505000004080200820803800E +:10C24000000303400300020040118004800000004E +:10C250008000418205800200030000820010000877 +:10C260000000100188A01040020000000000000043 +:10C27000000000000000000000000040000000007E +:10C280000000058284200108090190A0820204C0F8 +:10C2900010000000002000880000000000000000E6 +:10C2A00000000000014000000100010101100090A9 +:10C2B00001080001C040828282821001050891407D +:10C2C000C184C0010083010001000000080140009A +:10C2D0004000040001C1008200C00000000000E036 +:10C2E0000700000A000000E00700000A000000004C +:10C2F0000000000000000000070000000000000037 +:10C3000000000000000000E0070000000000000046 +:10C3100007004206000000000000000000000000CE +:10C32000000000000000000000E0000000410000EC +:10C3300000E007008282000000E00700000A000021 +:10C3400000E007000000000000E000000000000026 +:10C3500000E00000000A000000E0070050000000BC +:10C360000000FFF00F00C355C3550000000000009F +:10C3700000000000000000000000000000000000BD +:10C38000000000000000828282BEF0F0C3FFFBAB21 +:10C39000FBFB41415F0A00000000000000000000BC +:10C3A000000000005F435F43000000000000000049 +:10C3B000000000004B4BAA003A3C3F3CA0AA3F3C87 +:10C3C00000090060ACAC0FFF00000000000000009E +:10C3D000FDA8D58000000000000000000F3F0FFF07 +:10C3E0000000000053535353FF0F000F05000500DA +:10C3F000000000000000000000000000000000003D +:10C400000000000000000000BEBE82BEF0F0003C54 +:10C4100051010101EBEB5F0A000000000000000089 +:10C420000000000000005F435F43000000000000C8 +:10C430000000000000004B4BFF553A3C303CA0AAE6 +:10C44000303C09006000ACAC00F0000000000000CF +:10C450000000A8A8808000000000000000000F3F3E +:10C460000F0FC3C3FF00FC0CF5F530F330F38282ED +:10C47000282800000000000000000000000000006C +:10C4800000000000000000000000D7D714141E1E9A +:10C49000FFFFC30F0055C0C0FCFC00000000F0C34C +:10C4A000F0C30000000000000000000000000000D9 +:10C4B00000000000000F3C553F033F03FF3FFF7D9E +:10C4C0000F0FFF0044448888240000000000000093 +:10C4D0000000000001F1F1F100000000CFCF0505E0 +:10C4E000B33FBFBF0F0F5555FC0C0505F3F33030BC +:10C4F00002022A2A000000000000000000000000E4 +:10C50000000000000000000000000000C3FF003C2D +:10C510001E1E0000C30FFF5528EB28EB0000000093 +:10C5200000AAFFAA000000000000000000000000B8 +:10C53000000000000000FF0F3C557D7D41410003DD +:10C5400000412D2D55004444888800000000000063 +:10C550000000000000000DFDFDFD000000000FFFC9 +:10C560000505B3BFBFBF05615A0F050D00A00061EF +:10C57000000F000D00080000000000000000050092 +:10C580000A08050000A000610006000D000000611F +:10C59000000F000D000005615A0E050D00A000619E +:10C5A0000006000D0000000000610006000D000004 +:10C5B000006100060009000005615A0F050D00A08A +:10C5C000106120080041000805614A08059100A19A +:10C5D000006100000001000000613007000D000054 +:10C5E0000061500600010000000000000000000093 +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000AA0FC3FF03037D4100000000FF550F0573 +:10C6200000000000AAAAAAAA000000000000000062 +:10C63000000001010000FAFAFFFF4B4BAAFFD70CE4 +:10C64000140C3C3C55FF0000FFFFFFF5AAA07878D2 +:10C650007D7D3F0F3C00FA00FA3C00000000000026 +:10C660000000A0F5EBEB00F0003C00000000000033 +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C690000000AA0FC3003F3F7D4100000000FF558E +:10C6A0000F05000000000F0F3FAF0000000000006A +:10C6B0000000000001010404AAAAAFAF4B4B0055D3 +:10C6C000D7CF14CF3C3C55000AFA0AFA5F550A004E +:10C6D000787828280F0F0000FA00FA000000000008 +:10C6E00000000000A0F54141FFF0FF3C0000000009 +:10C6F000FF550000000000000000000000000000E6 +:10C700000000000000000000000000000000000029 +:10C71000FAFF3AFFFF00FF00FF00C3C30000000064 +:10C72000C3FFFAFFFFFC00C000000000000000A2F1 +:10C73000A2A200000000144128820000A000000016 +:10C74000000041413F031EBE1E140000FFFF3C3CA1 +:10C75000FF007171F3F31F1F1414FAAA7828000068 +:10C76000000000000000000000003C3C00FF000052 +:10C770000000FF55FF550000000000000000000011 +:10C7800000000000000000000000000000000000A9 +:10C790000000CA000A00D7C3D3D30F0F55550000BD +:10C7A0000000C3005000FFD400D4000000000000CF +:10C7B00000F3F3F3000000000000000000000000A0 +:10C7C000000000007D7D3F031EBE1E14ACACACAC6F +:10C7D0003C3C0F0F3030B2B20F0F0000FAAA5000ED +:10C7E0000000000000000000000000000F0F0F0F0D +:10C7F0008400880004058409881000008800200057 +:10C8000020000000200020008400880520082082ED +:10C81000000002002010000020000200880002003A +:10C8200082000410201082052000C00000880282CF +:10C830000003021084000200020084002000880827 +:10C8400020000208840802000000200800004008C0 +:10C850000282200000008400040002000200200088 +:10C8600088000005200804080408880000052088C6 +:10C87000828800000400000000000000410004C0A5 +:10C8800000000400000000000000000000000001A3 +:10C89000210900000000000000000000000000006E +:10C8A0000900410000000000050000000504000828 +:10C8B0000005000000000000200003000000400010 +:10C8C0000000000000000000000000004100000027 +:10C8D0000001000900000500000000000000090040 +:10C8E0000200000000000000008400000084050039 +:10C8F000000504050010001000000000000000000A +:10C900000000001000090010004000050040000079 +:10C9100000000010000000000000000900000000FE +:10C920000000004100000000004000210000000065 :10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000004D3 -:10C9600000000000000000000000000000040000C3 -:10C970000000000000000008000000C040080000A7 -:10C9800000840082000800000004001000080088F5 -:10C9900000000000000400080010200000100084C7 -:10C9A0000000000800A000840484040000080010B7 -:10C9B0000000000000100000000400000000000063 -:10C9C0000000000020100088000002000200028821 -:10C9D0000084000000000000000000004100000092 -:10C9E0000000000000000000000400000000000043 -:10C9F000000000000000000400050000000000002E -:10CA000000000003200300050000000000000000FB -:10CA1000000000112040000000050000A000900070 -:10CA20000000C00388000800000000000200081099 -:10CA3000202100009000000000000003A0038400FB -:10CA40008400000500008200A00500000000100026 -:10CA50000800000000000000A000000000400800E6 -:10CA6000080000400000080020000000C000000096 -:10CA70000000000000000000000000000000008432 -:10CA8000110000004184000008C0000000004100C7 -:10CA9000000021000000000000084100000200002A -:10CAA00040A00000210200000008008400A0210234 -:10CAB00000900000080000000000000000000800D6 -:10CAC00040000000050041C005000804080400A063 -:10CAD00008880000000000000002000000000000C4 -:10CAE0002100000000000000410040400000000064 -:10CAF000000000820800050005A00000A000000062 -:10CB00004000000000000800040000008240001106 -:10CB10008200000410000000C00000008200C0007D -:10CB20008200000082000000000000050800820072 -:10CB30000000000008000000200000000000820447 -:10CB4000820400040004820000050000000082103E -:10CB500082000010201082000000080000118200F6 -:10CB60008200000082008200000010050041820067 -:10CB70008200000082008200840082030003100013 -:10CB800000000000000011002004050040004100EA -:10CB900040400000100000200000000021080000BC -:10CBA00000880540104000000002000000840000E2 -:10CBB00008A000000090000000100000000000002D -:10CBC000009004000000000010000000400200007F -:10CBD00040080000000000002000000000000000ED -:10CBE000000020000020002002C000C00300000060 -:10CBF000110000002084000000000000110200006D -:10CC000000000000080000000800A0008200820070 -:10CC1000000800081000C0000000C021080000004B -:10CC20000000000008000000000000008200000278 -:10CC300000210000000000000000000000000000D3 -:10CC4000000000000000100000000040000008008C -:10CC500000050000000000000000000000000000CF -:10CC60000000000000000000400000000000100074 -:10CC70000000000000000000000000000000004074 -:10CC80000000000005C009000000050000000010C1 -:10CC90000000000000000000000008080300000081 -:10CCA000080000820800059008000088410020006C -:10CCB0000002000000000800080000000000000062 -:10CCC000080000000000000410C020001100000057 -:10CCD0000000020200C0000021002100000021002D -:10CCE000000211001100000000000000000000021E -:10CCF00000004040104010400000084000000500C7 -:10CD0000050000000000400800000000820800004C -:10CD100000080000040000400000100400000000B3 -:10CD20008200000000000800000000000821000050 -:10CD300008000000000000000000001100080400CE -:10CD40000000002100000000000090000400080026 -:10CD50000200A00004000011041000008404000080 -:10CD600000001000000000000000000000000800AB -:10CD7000080000000000000000000011000090000A -:10CD80000000080400000040000020040000000033 -:10CD9000028800C009001190110004000290008870 -:10CDA0000400000000002000080002000000000055 -:10CDB0000002110000000000000000000000000060 -:10CDC0000000000000000000000000000000000063 -:10CDD00000000000402020020000000000000000D1 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000020400C00000000000000004090060 -:10CE000000000000200011000000000000000000F1 -:10CE100001000000000000000000000000C0000051 -:10CE20000000000000000000000000000000000002 -:10CE300001000000000000000000000000C0000031 -:10CE400000000000000000000000000000000000E2 -:10CE5000000001000000000000000000010000C010 -:10CE600000000000000000000000000000000000C2 -:10CE7000000001000000000000000000010000C0F0 -:10CE800000000000000000000000000000000000A2 -:10CE90000000410000000000000040050800008084 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000410000000000000040050800008064 -:10CEC0000000000000000000000000000000000062 -:10CED00000000000410000000000000040050200CA -:10CEE00000800000000000000000000000000000C2 -:10CEF00000000000410000000000000040050200AA -:10CF0000008000000000000000000000000003009E -:10CF1000000000800000800000000000900082807F -:10CF2000000080000000000000000041000003003D -:10CF30000000008000008000000000001000900051 -:10CF40000000800000000000000000410000000020 -:10CF5000030000000080000080000000000090003E -:10CF6000C0000020000000000000000000410000A0 -:10CF7000030000000080000080000000000090001E -:10CF800083000020000000000000000000410000BD -:10CF90000100000000C000002000000000000300AD -:10CFA00020020090100008000000000000010000B6 -:10CFB0000100000000C0000020000000000021006F -:10CFC0002040009008004000000000000001000028 -:10CFD00000000100000000C0000020000000000070 -:10CFE0004100214000918400400000000000000149 -:10CFF00000000100000000C0000020000000000050 -:10D0000041002140009140824000000000000001EA -:10D0100000000000C0000000000000000000000050 -:10D0200000400000020000000000000000000000BE -:10D0300000000000C0000000000000000000000030 -:10D0400000020000000000000000000000000000DE -:10D05000000000000000C000000000000000000010 -:10D0600000000002000000000000000000000000BE -:10D07000000000000000C0000000000000000000F0 -:10D08000000000020000000000000000000000009E -:10D090000000000000008000000000000000000010 -:10D0A0000000008000008000000000000000000080 -:10D0B00000000000000080000000000000000000F0 -:10D0C00000000080000000000000000000000000E0 +:10C9400000030000000000000000000000000000E4 +:10C9500000000000000000000000000000000000D7 +:10C960000000000000000040000000100000000077 +:10C97000000000800080048800840082000000081D +:10C9800020C00008000800844008090800080008CA +:10C9900000000010090000080308030802080088CE +:10C9A000400800080010000840080008040805407E +:10C9B00000000084001000000008000803840088C4 +:10C9C000000804080210411004840010040800103C +:10C9D00000100000000809C0004000402008058445 +:10C9E000000800080484008420040084000400007F +:10C9F0000208000800200002880000080008000863 +:10CA000000000003002100400008000500100002A3 +:10CA10000000000000050080002100030005001058 +:10CA200000000021000000000010000000000000D5 +:10CA30000000881000001000000000000000000846 +:10CA40009008004100210041000800400000000360 +:10CA5000000000000010000000A10008000000001D +:10CA600000000000000000080008000800000000AE +:10CA700000030000000000080888000021000000FA +:10CA8000000000000010001000C0000000A005849D +:10CA90000000000041000000000408000000000049 +:10CAA000080000000000000021C00082008241A0B8 +:10CAB000000000A00884001080A00000008200C0D8 +:10CAC00000100000000000000000000005820000CF +:10CAD000000005000088100000A00904008200008A +:10CAE000210008020884000000001000000000007F +:10CAF0000300030000000082000083200000820089 +:10CB000008000000000020000800040000000000F1 +:10CB1000000088000000820082000400000008007D +:10CB200002008200000000000800880000000000F1 +:10CB3000000082000000A000080082000000000049 +:10CB4000080004008200C0408400080004000800BF +:10CB500000000000000002000200020008002000A7 +:10CB600084000400A00004000000000040008400D5 +:10CB7000040008000200C0000200100008090000C4 +:10CB800000040000001000880002002000900082D5 +:10CB900000C00000000000000800000000C000000D +:10CBA00000000000008800000000040040000000B9 +:10CBB0000000000008004100000011000008000013 +:10CBC00000A00000000000000020000000000000A5 +:10CBD00000000800000000000002000000840000C7 +:10CBE000009000880000008800000800000002009B +:10CBF0000010000000000000002000000000000005 +:10CC0000020800000003000000008208000082000B +:10CC10000005000510210000A0000005000010081C +:10CC200000000000C011A00000080000C0000800C3 +:10CC30000000A00000000000A008102184000008EF +:10CC40000000C000C0000000000000000000000064 +:10CC50000021000010000800000000000008000093 +:10CC6000004100000000000000000000A0000000E3 +:10CC70000841C0008200C00000000000A0000010B9 +:10CC800000000090008400C000840000000000103C +:10CC90000000000000C00000008400000000000050 +:10CCA000000000000000000008000010000000C0AC +:10CCB000000820900900000000000000000000882B +:10CCC0000884000000840000000011000000000043 +:10CCD00020000000008800840010008400900304FD +:10CCE0000500030821A02108090008000000000039 +:10CCF0000000000000000000000000000000000034 +:10CD0000000005A0002100000010000082000002C9 +:10CD10000000200908000010000040000010001072 +:10CD20000008400400002011200488200800C000F2 +:10CD3000880900000800C000000084020000000014 +:10CD4000000904410000000010091000A040081074 +:10CD50008200000002000000000000000820C00067 +:10CD6000084190000402000008000209200082002F +:10CD70000000100000200020020000004000081108 +:10CD8000C00008000200008800040004090400003C +:10CD90001100000000000000000000000000000082 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000940000400000000000026 +:10CDC000000000020000000011C000880090000078 +:10CDD0000000000000200000008800C000001100DA +:10CDE00040000400000000000000000000000000FF +:10CDF0000000000000000000000000000200000031 +:10CE0000000004000000000000000000000000001E +:10CE100000000000000001020000000000021010ED +:10CE20000000000000010000000000000000000100 +:10CE300001000000000001C000000000000810C058 +:10CE400000000000000100000000000000000000E1 +:10CE5000000100000000000101400000000000206F +:10CE6000C08400000200000100000000000000007B +:10CE7000000000000000000001040001C1000004E7 +:10CE8000C0820000C000000100004000000000005F +:10CE9000000200000000001110800003400000802C +:10CEA0008080000000000041000000000000000041 +:10CEB00000200400000000412000004140000080EC +:10CEC00080000000000000410000000000000000A1 +:10CED0000000002000000000001020000041400081 +:10CEE0000000000000008000004100000000000081 +:10CEF00000000009000000000004108000208400F1 +:10CF000000808080000080000003000000002100FD +:10CF100000000000000004000000080020000300E2 +:10CF20000000118080000000002080090000030044 +:10CF30000000008000004000000004002000850088 +:10CF40000040090080000000002080400000000038 +:10CF50000300000000800000020000000500400007 +:10CF60009000004005000000000000008003000069 +:10CF700004000000000000004000000040004000ED +:10CF8000200000000300000000000080800300007B +:10CF900000000000000000000100000001009100FE +:10CFA000C12000000004400000000000C00000009C +:10CFB00001000000000200000000000001009100DC +:10CFC000022000000000400000000000C00100003E +:10CFD000000001000000000200000100000000004D +:10CFE0000500052000000000400000000000C00116 +:10CFF000000001000000000000000100000001002E +:10D00000410083C000000100A000000000C08200B9 +:10D0100000000000020000000000000000001000FE +:10D0200000100000000000000000000000010000EF +:10D03000000000000200000000000000000082006C +:10D0400000200000000000000000000000010000BF +:10D0500000000000000002000000000000000000CE +:10D0600082000082000001000000000000000001BA +:10D0700000000000000000000000000000000000B0 +:10D08000A001000400008500000000000000000076 +:10D09000000000000000800000000000000000020E +:10D0A000001100000000110000000000000000411D +:10D0B00000000000000080000000000000000005EB +:10D0C0000009000000000500000000000000004111 :10D0D00000000000000000008000000000000000D0 -:10D0E00000000000008000000000000000000000C0 -:10D0F00000000000000000008000000000000000B0 -:10D10000000000000080000000000000000000009F -:10D11000000000000000800000C1000000000000CE -:10D12000000000000041000000200000000000009E -:10D13000000000000000800000C1000000000000AE -:10D14000000000000041000000200000000000007E -:10D150000000000000000000800000C1000000008E -:10D1600000000000000000418000002000000000DE -:10D170000000000000000000800000C1000000006E -:10D1800000000000000000418000002000000000BE -:10D190000000000000000000400000C1000000008E -:10D1A00000000000000000834000000100000000BB -:10D1B0000000000000000000400000C1000000006E -:10D1C000000000000000008340000001000000009B -:10D1D00000000000000000000000400000C100004E -:10D1E00000000000000000000083040000010000B7 -:10D1F00000000000000000000000400000C100002E -:10D200000000000000000000008304000001000096 -:10D2100000000000000000000000000000000042CC -:10D220000000000000004800810000E0000048000D -:10D23000000000000000004200000000000000426A -:10D240000000000000004800810000E000004800ED -:10D25000000000000000004200000000000000008C -:10D2600000420000000000004800810000E00000D3 -:10D270004800000000000000004200000000000024 -:10D2800000420000000000004800810000E00000B3 -:10D290004800000000000000004200000000000004 +:10D0E00000050009000000004000000000000000F2 +:10D0F00000410000000000000000000000000000EF +:10D10000004000040080000041000000000000001A +:10D11000004100000000800000830000000080004B +:10D120009000000000C1000000200000000000008E +:10D13000000011880000800000830000004080048F +:10D14000C100000000C100000040000000000040DD +:10D150000000038400000000800000830000000045 +:10D1600080008400000000C10000004000000000BA +:10D170000040000003C00000000400830000000025 +:10D1800000208500000000C1800000200000004158 +:10D190000000000040A0000040000002000000006D +:10D1A0000800100000000005400000010000000021 +:10D1B0000000000000050000400000020000000127 +:10D1C00004018200000000050800000000000000CB +:10D1D0000000000001050000000040000002000007 +:10D1E000000004000300000000050800000000002B +:10D1F0000000000000000104000084010083000022 +:10D2000000008401820000000009400000010000CD +:10D210000001000000000005000000000000000008 +:10D220000000000000000000811200E0070048003C +:10D2300000000000000000000000000000000000EE +:10D240000000000000000000811200E0070048001C +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000811200E0070044 +:10D270004800000000000000000000000000000066 +:10D2800000000000000000000000811200E0070024 +:10D29000484200000000000048420000000000007A :10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E :10D2C000000000000000000000000000000000005E @@ -73033,210 +73033,210 @@ :10D3600000000000000000000000000000000000BD :10D3700000000000000000000000000000000000AD :10D38000000000000000000000000000000000009D -:10D390000000000000000000000000000000747B9E +:10D390000000000000000000000000000000257BED :10D3A000000000000000000000000000000000007D -:10D3B000000000000000000000000000DE2E747B72 +:10D3B000000000000000000000000000DEA4257B4B :10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000DE2E000041 -:10D3E000747B00000000000000000000000000004E -:10D3F0000000000000000000000000000000DE2E21 -:10D40000747B00000000000000000000000000002D -:10D410000000000000000000000000000000DE2E00 -:10D42000615603400000000000000231E0000000EF -:10D43000000000000C4000000000000002C06A86EE -:10D44000615603400000000000000231E0000000CF -:10D45000000000000C4000000000000002C06A86CE -:10D460000000615603400000000000000231E000AF +:10D3D000000000000000000000000000DEA40000CB +:10D3E000257B00000000000000000000000000009D +:10D3F0000000000000000000000000000000DEA4AB +:10D40000257B00000000000000000000000000007C +:10D410000000000000000000000000000000DEA48A +:10D42000612603400000000000000230A000000060 +:10D43000000000000C4000000000000002C06486F4 +:10D44000612603400000000000000230A000000040 +:10D45000000000000C4000000000000002C06486D4 +:10D460000000612603400000000000000230A00020 :10D470000000000000000C4000000000000002C09E -:10D480006A86615603400000000000000231E0009F +:10D480006486612603400000000000000230A00016 :10D490000000000000000C4000000000000002C07E -:10D4A0006A862000000404880000000000808800D4 -:10D4B0000000000021000000202001000482C003C1 -:10D4C0002000000000000000C080000088800400F0 -:10D4D000000082002080C0002000C000200000006A -:10D4E000400000030000400008000000000000842D -:10D4F00020000004200020000000204000102080B8 -:10D5000000000000820082000000C0000000400017 -:10D510002000000020002000820020008200820005 -:10D52000C000000000000001000400000000000234 -:10D5300000000400000004000082000110008021AF -:10D540000000040000000000000004400000000291 -:10D55000000000000084000400000000000005003E -:10D560002084000000000082000080000000000015 -:10D570000005090000010000000000000001050195 -:10D580000010000000000000000000000000008209 -:10D590008200000000000000000000000000000009 -:10D5A0000000000000000000000900000000000072 -:10D5B0000000000000000000002000100010000229 -:10D5C00001800005008000800000001000000000C5 -:10D5D0000000008500000000008000000000000046 -:10D5E0000000000000800000010500000000018331 -:10D5F0000000000000000003000000000000000820 -:10D60000000000000080008000000000000000001A -:10D6100000200140000000000000000000800141E7 -:10D6200000000000000000000008000000C000082A -:10D6300000080084000800000084000900840084C1 -:10D64000008508200908001000400000008300C089 -:10D65000000800C00902008800000004000000006B -:10D66000000000080008000200000400008400849C -:10D670000420000800080000000000000000100066 -:10D68000090000840008410441200000000000005F -:10D69000008400851008020000000200030000085A -:10D6A00020840900008409000000028500050004B0 -:10D6B000200200210003004000050010208020808F -:10D6C0000085001000084041400800039021080830 -:10D6D00000100008008990020021000000410000B5 -:10D6E00000000000000000024108000001050821C0 -:10D6F000A0000821000000210021210200030005F4 -:10D70000000300020002000909029000000000006E -:10D71000000500000002C005840390022000018083 -:10D7200001A00008000500000008000083040000BC -:10D73000091180A00000000000000000000080200F -:10D74000800400200000410091008000000000845F -:10D75000000000000301004000000000000000A0E5 -:10D76000000000A000820000030288820000080080 -:10D77000800009008082000000000010A00000006E -:10D780000000000000020000000084000000000013 -:10D79000000000A0000000000000000000000000E9 -:10D7A000100804210000000000000000000000003C -:10D7B0000800080082000000080008008800080037 -:10D7C00000002000830040808200088200000000EA -:10D7D00000008200000801000000080000000000B6 -:10D7E000000082000000000000004000080000006F -:10D7F0002000C0000800080000000800A00082000F -:10D800000000000008000200C000820000000800C4 -:10D8100040000100820000009000A0008800048009 -:10D82000400001802182C010C000080082008200F8 -:10D8300000A00390000000000082000000A000088B -:10D84000000000002000200000400090001100C0F7 -:10D8500011000008038411004000000000A0000037 -:10D8600000A0000000000000000000008000008414 -:10D870000000000000009000000000000000000018 -:10D88000000000820000000080000000040400820C -:10D8900000000000020021A00000020000000000C3 -:10D8A00041040340100804200001408200080200E7 -:10D8B0000208002120000040820000000041080012 -:10D8C00008100003C000C000000400000941A020AF -:10D8D0004020824000000011840000000008000485 -:10D8E0000004000000000000000000080000A090FC -:10D8F000000000000080000000100810004100003F -:10D9000000020000000082008200000000808210FF -:10D9100020008221C0000805084082030420004046 -:10D92000102182020000100204200002C000C0008A -:10D930000000000200008500000000100000000050 -:10D9400000000001000008000000080100001000B5 -:10D95000000180010000000009000090000005881F -:10D9600000010001000008000000080000000000A5 -:10D9700000101100000000400000000180000000C5 -:10D9800000000000000000000800000008900010E7 -:10D990000000800000A000000000000000008001E6 -:10D9A0000001000000000000880080010800000065 -:10D9B0000000000000010021840400082000000590 -:10D9C00020080005000500048221822000040009CF -:10D9D0000020000083020800004182004041000056 -:10D9E0000008002100000000000304000003000004 -:10D9F00000008200000000000000200082410008BA -:10DA00000021000900000005080000004000820419 -:10DA100008000021210000800003C0000121010056 -:10DA20000580000400840103A100110803A0848084 -:10DA3000A180C100A18220A1000000010008800097 -:10DA400000000000000000000090000000880000BE -:10DA5000000000000000400100000008000000007D -:10DA600000000000000000C00000000000000000F6 -:10DA700000000000000000000000000000000000A6 -:10DA8000080000000000000000000000000000A0EE -:10DA900000000000000084102020201000044082BC -:10DAA00040004040030000110890408290010411A2 -:10DAB0002040080240000802200840094000890870 -:10DAC000080900010000200100008389A12141888C -:10DAD000821141112003040382031090000400907E -:10DAE000841000010001820100000000000000001D -:10DAF0000000C000010002000200000089A0200810 -:10DB00000090020800018201900000010040002006 -:10DB100000100040892001200488C0A000000000FF -:10DB200002000000400088000901C0014011008986 -:10DB3000830202C1020020008801040180901105C7 -:10DB4000108880C0002009208008002020841091C7 -:10DB500082C1008489C1890900040010800000008E -:10DB600000000080110821080511001000000000CD -:10DB70004000000080000800000000000000098054 -:10DB8000808000000080001000200503004000801D -:10DB900000000000000009004100C08080800000FB -:10DBA0000400000000009041830941080003C0C147 -:10DBB000008904098008C0038503000880039000E1 -:10DBC0000200C0118208820089000300C0210440C5 -:10DBD000C111C111048390800300A002C184000020 -:10DBE000804100800000058003000805C1A10000FD -:10DBF00000000000000880000400890021000000EF -:10DC000080000000800000800480040020000003E9 -:10DC1000000000C1000400008900C12102110800B9 -:10DC200085001000A000100000008004838980039C -:10DC30008000000080200080108003040880200302 -:10DC40000810210083010900089004000000090168 -:10DC5000A1A18201A0018591100290821000098289 -:10DC6000A00002A104A0000090C04100890109A108 -:10DC7000000000000000000188000500080001000D -:10DC8000000008009000A088108201C00100000080 -:10DC900000010000001000010000020002000091DD -:10DCA0000100100010001000020090200801084040 -:10DCB000C0011000100084002008010200010108CA -:10DCC0000001400800C0210803A10001000001017B -:10DCD000000084C10185019184C11009012085855E -:10DCE00003C1404000881008A1C0000001000201EB -:10DCF00001000000000000000000004000880488CF -:10DD00000010000040020002108884C000010000E2 -:10DD100000010001400000000200100004000002A9 -:10DD2000840204020000000000000100001000084E -:10DD3000018400C18282008241900303000200A09E -:10DD40000188000380C00404089191C00020214094 -:10DD50002021050200041140050804840010040578 -:10DD600090A1A1C1808000000080218000202004BB -:10DD7000A0100304000000000000000000C1000229 -:10DD8000801011110000800000000000028000409F -:10DD90000005202100038000000000000000801129 -:10DDA000002100040040001000030010100300C018 -:10DDB00040A040A020C100832183118404C10083BE -:10DDC00002202005000320004084030009032104F1 -:10DDD000208002801002218485824100031100000E -:10DDE000090409000400000000808000800041094F -:10DDF00008A1020002050000021103000200000059 -:10DE00000000000000000000000300C0808000004F -:10DE1000214005114100004000008000000000008A -:10DE20008090004080008008000000800000000911 -:10DE3000900088820908080000020020000000000D -:10DE4000C100A0110800830801A000820184010123 -:10DE5000018300820008000005090821A084A101B7 -:10DE600000840088011000002000040284400400A7 -:10DE70000021010800C001000000000101000000B5 -:10DE80000004000000840000000002000210844032 -:10DE9000100001A10001000000008200400000000D -:10DEA0009000C04020880810040100040082001087 -:10DEB0000000900009C18805110000010009001050 -:10DEC00000000540050089000201000000E000009C -:10DED00000000000000000000000000000E007005B -:10DEE000000000000000070000000000000000002B -:10DEF0004100000000E000006000000000E00000C1 -:10DF0000000000000000000084000000000000008D -:10DF100007000000000000E00000500000000000CA -:10DF200000000000000000E0070042820000000046 -:10DF300000000000000000E007004181880000E0D0 -:10DF400007000000000000000000000000000000CA -:10DF5000F0FFF0000000000000000000FFFFCFFF16 -:10DF6000690F2B0F00000000060FF9F07F3F000043 -:10DF7000E4C0183C000000000000000000000000A9 -:10DF80000000000000000000F3F103010000300C6D -:10DF900030060303F000000000000000000000C392 -:10DFA00000FF00000000C0F0C9F960606060000080 -:10DFB0000000000000006F076F04A6C03F3F000094 -:10DFC0000000A93069F0717E4D42F090335300009B -:10DFD000000072FF7200000000000000000000005E -:10DFE00000002B2B2B2B00000000060F3C3C6F0F7A -:10DFF0000000E4C0DBFF00000000000000000000A3 -:10E0000000000000000000000000F2F0020000002C -:10E01000300C300603030E02000000000000000078 -:10E02000C3C3FFFF00000000CFFFC9F906060F00C1 -:10E0300000000000000000006007600499FF00007D -:10E0400000000000A9CF690F8181BDBDCCAC0F6F6E +:10D4A00064862000081020050209040020092000DD +:10D4B0002000200020002000201020102000400527 +:10D4C00088100400840088000400200020008800E8 +:10D4D0002000200004800404008820008808200028 +:10D4E00000000003200020002080200088000400AD +:10D4F00020002010208089800400029020008400F9 +:10D50000820005002000208021002108880088007A +:10D510002000200005C18480048084802000040055 +:10D5200004002000000080000000800009000400CA +:10D5300000000400000009000000040004000900CD +:10D540000000000100000000418400000400000011 +:10D5500000000000040000040501050404000000B0 +:10D56000090004000000090089C000040000000058 +:10D570000000000000000004080400008004000017 +:10D5800000000000020080000404200020002000B1 +:10D59000000000000000100404040008040800005B +:10D5A00000000000000000000000000200C0004079 +:10D5B0000002000000000000000000100000000059 +:10D5C000000000000000000000000000000000005B +:10D5D0000000000000000040004000000089000042 +:10D5E000004000000000000000000000008000007B +:10D5F000000000000000000000000000008000802B +:10D6000000000080000000000020000000000080FA +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000008000800090002DF +:10D630000008000900080008000804080000008431 +:10D640000008008400100000001000080010001006 +:10D65000000800100008001000080008091000046D +:10D6600000880000001005000000110003084104BC +:10D670000010000800000010090000080008000465 +:10D680000004000800100000000000010008020073 +:10D6900000040088000004000000000800080000EA +:10D6A00000000010200000C000000020002000004A +:10D6B00000080041000300000000000300210008F2 +:10D6C0000000000000000008080000000021000821 +:10D6D0000008000000050010000000000004000821 +:10D6E0000000000000000000002100002000820077 +:10D6F0000000002100000000000000050000008084 +:10D7000000008205880083000000021000108404DD +:10D710008200000400000000000000000000000083 +:10D7200000000000000000000000000000010901EE +:10D73000000041000000080003A0000000000000FD +:10D74000088800C000820000000000C00000000047 +:10D75000000000000900080000004100000008016E +:10D76000080000A000000000000000000000800091 +:10D770000900000003000900080021002100410009 +:10D7800000101000000000000800000080000000F1 +:10D7900000010000000121000000000000900000D6 +:10D7A0000000000008000000210000000000000050 +:10D7B0008200040000800000A000C000820004007D +:10D7C000000082000000000004000400000082004D +:10D7D0000800040008000000820008000000821019 +:10D7E000820000008200840008000200080000009F +:10D7F00040000800A000A08008000400000088008D +:10D8000000000800200000009000080002008200D4 +:10D81000000000008280010000000000C000000045 +:10D820000000010009000000000000000800A00046 +:10D830000000008411000820000000000000050026 +:10D840000040000000000008000000000000200070 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000008000000000000B0 +:10D870000000000000000000101000000000000088 +:10D8800000000000000000000010000000000882FE +:10D890000000000000000004040000000800000078 +:10D8A0000000080010002000000000000000200020 +:10D8B0000000010000000020A100000500000000A1 +:10D8C0000005001000000000000000000000000043 +:10D8D000001008000000000000110000000000001F +:10D8E0000000010000000000000000000000000037 +:10D8F0000005000000000000000000800000820021 +:10D9000082000000000000000000820300410003CC +:10D91000000800400004001000202000000000006B +:10D92000000000000000080000000000C00000002F +:10D93000820000000400000000010400000000005C +:10D94000020000020000000000000800009000003B +:10D9500000000000000000000800000000000000BF +:10D96000000000002000000000000800050000008A +:10D97000000000A000000000000000000004000003 +:10D98000090000000000030000A0000000000300E8 +:10D99000008421000001000103000001800000005C +:10D9A0000000030000000000000000000000000074 +:10D9B0000000000000000000080000400000000916 +:10D9C00000100000000000050000002100040040DD +:10D9D0000000000000000000000000210000200006 +:10D9E000200000000000000000118800000000047A +:10D9F0000000A00004000000000000004000040837 +:10DA00000003200000000004000020000800004087 +:10DA100000400010000300100820002000840000D7 +:10DA2000000004000400820000000200000020004A +:10DA300000000000000000410000000000010000A4 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000400000000000000000000000000A2 +:10DA80000200200400000000002000000000000050 +:10DA90000001000000010000000000010001002161 +:10DAA0000000000000000000000000000000000076 +:10DAB0008000000000000000000040C0019000A0B5 +:10DAC000C004000000000000000000000000000092 +:10DAD0000000000000000000000000000000000046 +:10DAE000000000000000000000000000050001012F +:10DAF0000000000000000000000000000100010123 +:10DB000020000000000000000000000005C084416B +:10DB1000C088028284C0000400A00490000090002D +:10DB200000000000000000000000000001010000F3 +:10DB300090000000000000000000000080800880CD +:10DB40000080000000000000000000000000000055 +:10DB500000000000000000000000000000000000C5 +:10DB60000000000000000000000000000005C011DF +:10DB70004005000200000000000000000000040951 +:10DB80000340054100090000000000000000048976 +:10DB900000C040410089008000800080000011002A +:10DBA0008000400000000000000000000000104164 +:10DBB0002005404100090000000000000000800036 +:10DBC00002400084050000800000000000200000EA +:10DBD00000000000000000000000800000000000C5 +:10DBE00000000000000000000000000000000280B3 +:10DBF00000000800200300000000000000000000FA +:10DC00001080400000002000000000000000000024 +:10DC100090000500822109110000800080090000A9 +:10DC20000020000000410000000000000000000093 +:10DC30001000050005004120000000000000000069 +:10DC4000080084918410844000C00000000000009F +:10DC50000000000000000000000000000800840038 +:10DC600000000000000000000000000000000000B4 +:10DC70000004000001000185000000000000000019 +:10DC80000000C10884000000C14000000000000046 +:10DC9000000003028800080140001000400002005C +:10DCA000100000000084000000840000000000005C +:10DCB00000000190000000000100000000000000D2 +:10DCC0000000840400C002C1A18400000000000024 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000010000000000000000000023 +:10DD00000000000000000101000000010000000010 +:10DD100000000000201000110104A04020080002B3 +:10DD20000082A0A00100C0008400010000000000EB +:10DD300000000000000101000000000100000000E0 +:10DD40000000000083000002800590050000000034 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD70000000000000051004004102020000000045 +:10DD80000000000000000009030300000240000042 +:10DD900000000000000000110083051091090080C0 +:10DDA000008000808000040080000000410000002E +:10DDB00000000000000000102005050500410000E3 +:10DDC00000000000000080840040008080400000CF +:10DDD000200009000000000000000000000000001A +:10DDE0000000000000000000000000000000000033 +:10DDF000000000000000098400000500040200008B +:10DE000000000000000000000488048041000202BD +:10DE10000000000000000000030209000080111152 +:10DE200000000011000000000000004000000000A1 +:10DE30000000000000000000410005000500052072 +:10DE4000000000000000000010C010A00440880086 +:10DE500000000000000000000000000000000000C2 +:10DE600000000040009000000000000000000000E2 +:10DE7000000000000000000000050000010000009C +:10DE800000000000000000000000000801900000F9 +:10DE900000000000000000000000000000A00040A2 +:10DEA00000000000000400A00000000000000000CE +:10DEB000000000000000000000000104000000005D +:10DEC000000100000000000000000000000007004A +:10DED000840000000000000060000000000000005E +:10DEE0000000000000000000000000000000000032 +:10DEF00000000000000000000000000000E0000042 +:10DF0000000000000000000000000000000000E031 +:10DF1000000000000000000000000000000000E021 +:10DF2000000000000000000000000000000000E011 +:10DF3000070082820000000000000000000000E0F6 +:10DF400000000000000000000000000066666C6C2D +:10DF500000C31B1B000000000000000000000000C8 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000096F4242000000000303909F000040 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000606F82 +:10DFD000606F3CFF1B1B0000000000000000000001 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000096FDBDB00000000F3F3909FAD +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 :10E0600000000000000000000000000000000000B0 :10E0700000000000000000000000000000000000A0 @@ -73245,323 +73245,323 @@ :10E0A0000000000000000000000000000000000070 :10E0B0000000000000000000000000000000000060 :10E0C0000000000000000000000000000000000050 -:10E0D0000000707000006666272700000000000046 -:10E0E00000000F0F0F0F0F0F4F0D3C663F6F6F6655 -:10E0F0007F7E0000660F839F839F0000000000006A -:10E1000099C30000000000000000000000000F3C68 -:10E110000F3C0000DBF0DBF000000F0F0000000000 -:10E1200000000000FFEF0000000000000000000001 -:10E1300043434343000000003C3F7E7E000000005C -:10E14000F6F60935A5953C0C66677E7F0000000059 -:10E150000000000040400000666624E70000000068 -:10E16000424203030B0F2F0F0F0F0F0F00660F6FAD -:10E1700066667E7E0000663C9F9F9F9F00000000B9 -:10E180000000F0F0000000000000000000000000AF -:10E19000003C003C0000DBF0DB003C660F0F0000A1 -:10E1A000000000000000FFEFFFEF0000000000C3D0 -:10E1B00000804040404000000000000F6666000004 -:10E1C00000000000FFC3A595C3F300033C3F00001F -:10E1D000000000000000006140010011000000612B -:10E1E0000006000D00008061000500910000006144 -:10E1F0000A0E059D00A000003000009000000061A4 -:10E200000007000D000100610005000D0000006125 -:10E210000006001D0000000000000008009000A0A3 -:10E22000006100050009000000003000000000004F -:10E23000A061000F0015000000610006000D000144 -:10E240000061000F009000050061400FC50800004C -:10E2500000610006000D0000FFFF7F3FFFFFFFFF92 -:10E26000FF005400C302C382FFFFFFFF14FF54FEF0 -:10E27000C3AFC3AF55550000000000000000000010 -:10E28000FE3C0000BAAAFFFFCF03CF03000000004E -:10E290000000000000FF00FF000000000000000080 -:10E2A0000000F500F5FF8F80BFB000000000000007 -:10E2B000000000000000005F000A00000000B4B48D -:10E2C000B4FFFF35FF05828203030000000000AAAF -:10E2D00008086CC3AF00CF650CA6FFFF7D3C28F893 -:10E2E000FFFFFF000400C300C380FFBC3C3C00EB09 -:10E2F00040EA000F000F555400C30000000000006A -:10E300000000FEFF0000BAAABAAA0C030C0300002A -:10E31000000000000000C0C0828200000000000079 -:10E3200000000000050005FF8F80BFB00000000066 -:10E33000000000000000000000D700820000000084 -:10E34000A0A0A0FF3535050500C3030300000000B1 -:10E3500000AA080850FFAF00CF300CF3FFFFFF3DCD -:10E36000FFFFFFFF00C34141C3034141F0FF707F46 -:10E37000E8F028F02A2A5500F03000F000000000F4 -:10E3800000000000FF5DFF0CBEBE000000000000AA -:10E3900000000000000000000FFF0F000000000060 -:10E3A000000000000000C3C3C3C30F550F55000099 -:10E3B00000000000000000000000E8FF00AA0000CC -:10E3C000000050FA7CFEA555CC3CFF00FF00A6A53E -:10E3D0000C0F00000000CCA53C553A3A3AFFFFFF75 -:10E3E0003D3DF0FAFCFE0CCF3CFFFF0F5555F0FF12 -:10E3F000404FE8F0EBF02A2AF500000000F00000A2 -:10E400000000000000000C5D0C0CB4140FFF0000B5 -:10E4100000000000000000000000FFFFFF000000FF -:10E420000000000000000000F000F0FFC355C355DD -:10E43000000000000000000000000000E80000AA4A -:10E440000000000000AA3CBEAAAAC3C3FF00FF0050 -:10E45000F3F00C0F00000000C3AAC3AA303030FF55 -:10E46000200008000000882020002000200000007C -:10E470000000880020002000080020004009001053 -:10E4800020008805020002002000200020028404F1 -:10E490008400000020002000880088002000880000 -:10E4A0000001000004402000000002000200010002 -:10E4B00020800005000000000000004000000089EE -:10E4C00002000100850004000400200021008408EF -:10E4D000000000800040000084000040008084C0F4 -:10E4E000024000008000040005010400000000005C -:10E4F0000000000000000000040080000000800018 -:10E500000001000000080000000000000000800181 -:10E510000085000000000400000020000000000052 -:10E5200000000000002000010400000080008000C6 -:10E530000200004000000000000000000001000098 -:10E540000440000002000200000000000000020081 -:10E550000000000000400001000000000001004039 -:10E560000003A00100000000000000800000000087 -:10E57000000000000000000000000000000000801B -:10E58000000000800080008000800000000000800B +:10E0D00000007E7E3F0300FF0F0F000000000000E5 +:10E0E0000000000000000000000000000000FF9998 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E110000000000000000000DBDBD0D000000000A9 +:10E12000000000007E7E30F366FF2D2D66C30F00D9 +:10E13000C3FFC3000000000000000000000000005A +:10E1400000000000000000000000000000000000CF +:10E150000000000042423F0366663C3C00000000B5 +:10E1600000000000000000000000000000000000AF +:10E17000FF99FF990000000000000000000000006F +:10E18000000000000000000000000000000000008F +:10E1900000000000000000000000DBDBD0D0000029 +:10E1A000000000000000424230F300992D2D66C3AC +:10E1B0000FFFF099F099000000000000000000003F +:10E1C000000000000000000000000000000000004F +:10E1D00000000000000085615A0E050D00A00061DE +:10E1E0000006000D0000000000000000000000001C +:10E1F000000000000000000000000000000000001F +:10E2000000000000000000610001000100000000AB +:10E21000000000000000000000610001000100009B +:10E22000000000000000000000615001000100003B +:10E23000000050000000000005610A0F050D00A05D +:10E2400000000000000000000000000100000000CD +:10E25000000000000000000000000000FF000F00B0 +:10E2600000FA00FA000000000000000000000000BA +:10E27000000000000000000000000000000000009E +:10E280000000000000000000F4F4040400FF3F3F21 +:10E2900000000000000000000000F7E33420CACABC +:10E2A000FAFA0000000000000000BEFFAAEB00FF29 +:10E2B000A3A3000000000000000000000000000018 +:10E2C00000000000000000000000553555F53A3C04 +:10E2D0003F3C000000000000000000000000FFFFC5 +:10E2E0000F0FFAFAFAFA0000000000000000000028 +:10E2F000000000000000000000000000000000001E +:10E3000000000000000000000000FEFE0E0E00FFF6 +:10E31000030300000000000000000000F7E33420C9 +:10E320000A0A3A3A000000000000000014550041BB +:10E3300000FFA3A300000000000000000000000098 +:10E3400000000000000000000000000055355505E9 +:10E350003A3C303C000000000000000000000000DB +:10E3600055550505000000000000000000000000F9 +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000CF0CEB289F +:10E390000055AAFF00000000000000000000AF05CB +:10E3A000EB4128287D7D00000000000000003F3F79 +:10E3B000030300FF2D2D00000000000000000000FE +:10E3C00000000000000000000000000000000F0F2F +:10E3D0000F0F3A3C3F3C000000000000000000002E +:10E3E0000000FFFF0F0F0000000000000000000011 +:10E3F000000000000000000000000000000000001D +:10E400000000000000000000000000000000CF0C31 +:10E41000EB28287D287D000000000000000000009F +:10E42000AF05EB410A0A5F5F00000000000000003A +:10E43000033F033F00FF2D2D0000000000000000FF +:10E4400000000000000000000000000000000000CC +:10E450000F550F3C3A3C303C00000000000000002B +:10E46000201020000400000800000400840084083C +:10E47000040020002000840088002000880020087C +:10E480008800040020008400020020000000040036 +:10E4900020002000200004000000200020002000B8 +:10E4A000000000002000200004000400021008000A +:10E4B000208020000200040020000000040004006E +:10E4C0000000000820008400200000002000000060 +:10E4D00004002000200004002000840084000400C8 +:10E4E0000000000004002000000000000000000008 +:10E4F0000200000000000000000000000400000016 +:10E5000000000000200000000000000002000000E9 +:10E5100000000000040004000000000004000000EF +:10E5200000000000000004000000000000002001C6 +:10E53000C10000100000000000000000000000000A +:10E5400002000400000000000000000000000000C5 +:10E550002000000009000500090000000000200064 +:10E5600005000000000000000000000000000000A6 +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B :10E59000000000000000000000000000000000007B :10E5A000000000000000000000000000000000006B -:10E5B000008000000000000000800000000000005B -:10E5C000008000000000000000800080000000804B -:10E5D000008000000000000000000080008000803B -:10E5E000000000800000008800000084001000840B -:10E5F00000080084000800880008008800880008DF -:10E600000010000800020002000200080000008262 -:10E610000002000000400000000800080088000818 -:10E6200000000008008400000000000800080084CA -:10E6300000080040000800840000004000C0000006 -:10E640000008004000080084000000400040001066 -:10E65000004000400088004000A000000040004052 -:10E660000002000000080084002100030041002196 -:10E670000000000000100021002182000021002184 -:10E6800082100000004000210021000000418808A5 -:10E690000002002100080008002108050000000019 -:10E6A000000000210000000800000021000002A17D -:10E6B000008000000140000800080205024100053A -:10E6C0000040000000210041010800880002000015 -:10E6D000024000210041002102400003000001002F -:10E6E0000000018201800188000500004110030044 -:10E6F0000384000000000000008200000800030006 -:10E700000008000141000089080821A00300030857 -:10E71000000000000000080800000300000000A046 -:10E7200000000000000000000000000000000000E9 -:10E730008340004000820201000800828300C10083 -:10E74000030803A1000000A02100020803404100CB -:10E750001108830100A0000021A0888500A003000B -:10E76000020003A040031040100921A00000040093 -:10E770000800000004004000820082000000080041 -:10E78000A00000000880000003800000C000080016 -:10E7900000800800C000410000002000000082004E -:10E7A000040000000000A000C000020000000800FB -:10E7B00082000200080000000000080000000200C3 -:10E7C0000000400008000800000083000000000076 -:10E7D0000800820084008300A0000088000001007F -:10E7E00083000400010040004080010000000000A0 -:10E7F0000000000000000000000000000000000019 -:10E80000000000000000804000C084020000000002 -:10E810000082000200000000A00021008000000033 -:10E8200000000000000000000800000000000000E0 -:10E830000000000080000000000000080000000050 -:10E8400000000000800800000982000002000000B3 -:10E85000030000000000000002000000004000046F -:10E8600002000240000040008000000202A0000000 -:10E870000008000000080805000800000000A000D3 -:10E8800000000000C008000001000400048008002F -:10E890000000200800800080000800080008000830 -:10E8A00000210000000082000000000000000000C5 -:10E8B00000000100000000000000080300008208C2 -:10E8C000A00008080000C0400008000000A10841A6 -:10E8D0000900000000050000824100410041C041E4 -:10E8E0000000840000050002820040808221108820 -:10E8F000102100000800000021840000000000003A -:10E900002184080021000000008408008300834067 -:10E9100021000000918441020802000020820009C9 -:10E92000200000000000000000020000000000A025 -:10E930000084000002000882000200A00000030022 -:10E94000000003000000000000010000001008406B -:10E9500000840208000000000800000000A0000081 -:10E9600000A00808008200000000000080020000F3 -:10E97000800908A000080008002082110021020080 -:10E98000C021004000000000000088020800004094 -:10E9900040020802000301212003A0100002002110 -:10E9A000000800080000020000000000000000084D -:10E9B000000000000000000000009000400800007F -:10E9C000080000080000000400410804000484213D -:10E9D0000000002108080021040008C0A041002117 -:10E9E0004041A02100000003902104028440400225 -:10E9F0004009400840410000000000010000000004 -:10EA00000000000000000000000000000001800085 -:10EA10000000000000000000020080000001000073 +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E0000000000000000008001000080084001077 +:10E5F00000000008008800080000008400100008E7 +:10E600000000004000100008004000400010000022 +:10E61000008400080040008800000000000000089E +:10E620000000000000880000000800000008000052 +:10E630000000000000400000000000000088000012 +:10E64000000800080000000000100000001000009A +:10E6500000000000000000000000000000000000BA +:10E660000040000800000008000000080010001032 +:10E670000041000000000000000000000000000356 +:10E68000000000000000A0000000000000100000DA +:10E6900000000000000000000000000082000000F8 +:10E6A0000000000800000000000000000000000062 +:10E6B00000000000000000000000000000008200D8 +:10E6C0000000000000000800000000000000000042 +:10E6D0000008000000000000000000000000000032 +:10E6E0000000000000000000000000000000210009 +:10E6F000080000000008000000000000000000000A +:10E70000008400000000080000000000000000007D +:10E7100000000000000000000000030000000000F6 +:10E7200000000000001003000000000000000000D6 +:10E7300000000000030000000000000003000000D3 +:10E74000000000001182210000C0008400000000D1 +:10E75000008400000000030000000800000000002A +:10E760000000000000004100030000000000000065 +:10E770000000000008000000080000000800000081 +:10E780000000000000000000000000000800000081 +:10E79000040000000000000008000000000000006D +:10E7A0008200080090000000000000000000080047 +:10E7B00000008200080000000000000000000000CF +:10E7C000000000000000000008000000000004003D +:10E7D00000000800000000000000A0000000A000F1 +:10E7E00000000000040000000000A0000000000085 +:10E7F00000000000000000000000000000400000D9 +:10E8000000000000004000000000000000000000C8 +:10E8100000400000000000000000000000000000B8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000003000000000000000000000000001085 +:10E880000000000000000000000000000005000083 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B00000000000000084000000000000000000D4 +:10E8C0000000000000000000002100000000000027 +:10E8D000000800000000000000050000000000002B +:10E8E0000000000000000800000000008800000098 +:10E8F000000003000000218841000000000000002B +:10E9000000000000000000000010080000000800E7 +:10E9100000000000000000000000000000000000F7 +:10E9200008000000000000080000000000000000D7 +:10E9300000000000210000000000030008000000AB +:10E9400000000800000000840000039000000000A8 +:10E95000210008000000000000000084000000000A +:10E960000000000000002100000021000000000065 +:10E970000000000000000000000000000000000097 +:10E98000000000000000000000000800000000007F +:10E99000000000100000000000080000000000005F +:10E9A000000000000000000000000000080000005F +:10E9B00000000000000000000000900000000000C7 +:10E9C0000000000000000003080008000000000034 +:10E9D00000400000000000000000040000110800DA +:10E9E000020000400402000000008200000000005D +:10E9F00000000800200000000000000000000000EF +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 :10EA200000000000000000000000000000000000E6 -:10EA30000000000000000000000000000000800056 +:10EA300000000000000000000000000000000000D6 :10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000030000B3 -:10EA600000000000000000000000000000010001A4 -:10EA7000000300000001800008020040008802102E -:10EA800000000000000000000000090082000000FB -:10EA9000A0A00002028888400001010108010000D6 -:10EAA00000011000910100010000000000000000C2 -:10EAB00000000000000000000000C00085020808FF -:10EAC00000821010A00800040000000004400004B0 -:10EAD000021000000102040010C0000200A00800A3 -:10EAE00011104002A0888402C0A1C00800880488D8 -:10EAF00010C089118288A08508888000000000006D -:10EB0000000000000000000000000000C0008900BC -:10EB100000008080040000000000004103218540C7 -:10EB20000009404100000211000400000000000044 -:10EB3000000000000000000000000000800008004D -:10EB40008080008080808080008000000000800045 -:10EB500000008080110020000000800000004100C3 -:10EB60008000A180000984840004008480801180DA -:10EB70008000800020C1401100030002000000005E -:10EB80008000000000000000000000000000000005 -:10EB90000000000008008902848040008280090093 -:10EBA0008000C0401100210002001003000000009E +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC00000000990004000880420000000000000C1 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000890000800000000000000000BC +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 :10EBB0000000000000000000000000000000000055 -:10EBC0008000000000000080800080800089090033 -:10EBD00082001000C080C0000283410082800900D2 -:10EBE000100209A01000090041890403840489006F -:10EBF000209009001080800002C080802083C00027 -:10EC00002000A000820000000000000000000000C2 -:10EC100000000000000021008200A084044002C027 -:10EC200002000200C10500400000000000010000D9 +:10EBC000000000000000000000218089000000001B +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 :10EC300000000000000000000000000000000000D4 -:10EC40000000828402020084201008848204028270 -:10EC50000200044003001082090000C0A088A0A0A8 -:10EC6000000003A00010C008C0A00284204010884B -:10EC70000800C10520C0200810200509044004C078 -:10EC8000404000109008C004000000000000000098 -:10EC9000000100000001010102020003821108408E -:10ECA0000000400089010101000101010000010094 +:10EC4000000000000000000000000000A00582009D +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 :10ECB0000000000000000000000000000000000054 -:10ECC0000000C04000028408000000400008080462 -:10ECD000820001000010021008080808000102026A -:10ECE0008584000200C0A0A1A000A10200C009020A -:10ECF00005859009002140031111A0A0000385891A -:10ED000011858080008080800000000000000000ED -:10ED1000000000040004000304110009000800A121 -:10ED20008040000991038521081000401103004034 -:10ED300011020000000000000000000000000000C0 -:10ED400000000000808200200082002009800080F6 -:10ED50008080800008000000808080808382001016 -:10ED6000808285090509000300080011C1092020DF -:10ED70008404A0C104A000200020A041908900824A -:10ED80008282404100000085000000000000000079 -:10ED900000000000000000040000000080000041AE -:10EDA00080000041110309800500030804210200CE -:10EDB0004100050500000000000000000000000008 -:10EDC00000000000000000000000808000008400BF -:10EDD0008284028002000080000080008011800098 -:10EDE00000000021001080008080008000110200DF -:10EDF0009040022103118080008080800040A1A10A -:10EE0000058089029000000000020002000000005E -:10EE10000000000000000000000100000000C0022F -:10EE200004A0080202010088002001C000010011B6 +:10ECC00000000000000000000000028400820040FC +:10ECD000A1C00000000000000000000000000000D3 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000080000080C3 +:10ED500000800280000000000000000000000000B1 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000001132 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 :10EE300000000000000000000000000000000000D2 -:10EE400000000000000000008400A0A008080000EE -:10EE5000080008110304000088C004001000080026 -:10EE600008200202000100000420080800A00000A1 -:10EE700002C082A002030300080204820808040002 -:10EE8000A1A1C02089A085000000000007000000AB -:10EE90000000000000000000000000E00000000092 -:10EEA0000000000007000012000000E00000600009 -:10EEB000000000E000000000000000000000000072 +:10EE400000000000000000000000000000000000C2 +:10EE5000C000C020200010000000000000000000E2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 :10EEC0000000000000000000000000000000000042 -:10EED00050000000000000000000000000000000E2 -:10EEE000420000000000000084000000000000005C -:10EEF0000000000000000000820000000000000090 -:10EF000042000000000000000012000000000AFFA4 -:10EF10003EFF0000000000000000000000000000B4 -:10EF200000008000C300FFFFFFFF000000000000A2 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 :10EF300000000000000000000000000000000000D1 -:10EF400000000000000000000000000000A0FF5FC3 -:10EF50003C9C3C9C00A0FF5F3C9C3C9C003FFFC055 -:10EF60000FFF0F0F55FF555500FF3CC3AAAA55557B -:10EF700030CF30CF43435F003C1E000AF303F5055A -:10EF80005F1C43004545CF003C5C00500000000082 -:10EF900000FF3CFF00000000000000000000000037 -:10EFA000000000000000C300008220A2000000005A +:10EF400000000000000000000000000000000000C1 +:10EF500000000000FAC0FFC000C30F000000000066 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 :10EFB0000000000000000000000000000000000051 -:10EFC000000000000000000000000000000000A0A1 -:10EFD000FF5F3C9C3C9C00A0FF5F3C9C3C9C003F36 -:10EFE000FFC0F000F0F0AA00AAAA00FFFF00AA00EC -:10EFF00055FFF00FF00FE3E3FFA0FF5FC34BC3C368 -:10F000005555FFBCE3A07575FF30FF5FC3537F3ECE -:10F010007D3CD7140F0F000000000000000000002E -:10F020000000000000007D555555E0E0EBEB0000CE -:10F0300000000C0C050500000000000000000000AE +:10EFC0000000000000000000000000000000000041 +:10EFD000000000000000FACFFFCF8282050500008C +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 :10F0400000000000000000000000000000000000C0 -:10F05000333C333C5A0F5A0F5A555555F00FBE41A9 -:10F06000F807F807330FF00F6969696941FFBE00BF -:10F07000AA55BE415050FFFF0005C2C7C3A0C3AF91 -:10F0800082D7A0F500FFB2B2A0F5F0F080A0BCA03E -:10F090005F0A5500C3000F0F0000000000000000D1 -:10F0A00000000000000000005F5F555500EB00EB22 -:10F0B00000000000000C000500000000000000003F +:10F05000000000000000000000FF00FFAAAAAA00B4 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 :10F0C0000000000000000000000000000000000040 -:10F0D00000003C3C3C3C0F0F0F0F5A555555FF00AC -:10F0E000BE41F807F807330FF00F5569556941FF26 -:10F0F000BE00AA55BE41AFAF0000FAFFC2C7A0A034 -:10F10000AFAFC3C3F0F0B2B2B2B282D7C3C3C1F5DE -:10F11000FDF50000000800000000000000000000F5 -:10F12000000000610007000D0000A061000E001D3E -:10F1300000000061000700050005006100050001F6 +:10F0D000000000000000000000002020E3E3AAAAD6 +:10F0E000AA00000000000000000000000000000076 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF :10F1400000000000000000000000000000000000BF -:10F150000000000040618006002D10024061800622 -:10F16000002D100240618006002D100240618006D3 -:10F17000002D100240618006002D100240618006C3 -:10F18000002D100240618006002D100240618006B3 -:10F19000002D100200000000000000000000000030 -:10F1A000000000000000000000A050F0000000007F -:10F1B000EBFF4B5F3C3C00003C3CA0F51F0F1F0FDA -:10F1C00030FFBAFF00000000000000000000000057 -:10F1D00000000000000000000000B4B4B4FF5D5760 -:10F1E0005D5500000000000000000000000000006D -:10F1F0000000B4B4B4FF00000000A0BCFFFF5D5DE0 -:10F200005D5D2828D7270000000000FF5FA0FF5D9C -:10F21000FF0C2A2AD52A0000000000000000000090 -:10F22000000000000000000000002020202000005E -:10F230000000BEFF1E5F00000D083C3C00555F5FF4 -:10F240000F0F30FFBAFF00000000000000000000B8 -:10F25000000000000000000000000000A0A0A0FFCF -:10F26000080208000000000000000000000000008C -:10F2700000000000A0A0A0FF00000000A0BCA0A013 -:10F28000FF0C0C0CAAAA55A50000000000C35F9C4F -:10F290000C5D0C0C2A2AD5D50000000000000000EF +:10F15000000000000000000000000000800000002F +:10F16000009000000000000000000000000000000F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E :10F2A000000000000000000000000000000000005E -:10F2B00000000000C3C355C30000FF00C1C13030CF -:10F2C00014140C0C3CBC3CBC00000000000000000E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E -:10F2E000000000000000000000000000000010FF0F -:10F2F000BAFF00000000A0FFBCFF00000000A0FF5C -:10F30000B4FF3535CA35AA69F03300000000F0FAC1 -:10F31000FCFECC0C0000FFFFF0F00000000000003D +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED :10F3200000000000000000000000000000000000DD -:10F330000000000000000FC30FC34040FF4080806A -:10F34000303014140C0C3C3CFCFC000000000000AD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD :10F3500000000000000000000000000000000000AD :10F36000000000000000000000000000000000009D -:10F370001010BABA00000000A000BC3C0000000061 -:10F38000A0A0B4B4CACACACA55550F0F00000000E5 -:10F3900000AA0CAECC0C30F0000000000000000011 -:10F3A000040000058800200000002000000020006C -:10F3B00000100000200000000009200002000000F2 -:10F3C000840002002000040004000200001020005D -:10F3D0008400000020000000040000000000000085 -:10F3E0008400000020000000020000000200040071 -:10F3F000000000000400000002000200020084007F -:10F400000000840020008400000004000400840048 -:10F41000020000208800840084000000000000003A -:10F4200000000000000000000000000000000000DC +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000020004D +:10F3A0002000000900000000000020000000000014 +:10F3B0000000880000000009200020000000040078 +:10F3C00020000000000002000000200000000000FB +:10F3D0000000000088000000000020000000000085 +:10F3E00020000000000000002000000004000400D5 +:10F3F00004000400000020000000000004000000E1 +:10F40000200000000000000000000000200020009C +:10F4100000002000000000000000000020000000AC +:10F4200000000000000000000000040000000000D8 :10F4300000000000000000000000000000000000CC -:10F44000000000000000000000000000200000108C -:10F4500005000500000000000000000000000000A2 -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000200000006C +:10F4400000000000000000000000000000000000BC +:10F45000000000002000000000000000000000008C +:10F460000000000004000000000000000000000098 +:10F47000000000000000000000000000000000008C :10F48000000000000000000000000000000000007C -:10F49000200000000000000000000000000000004C +:10F490000000000004000000000000000400000064 :10F4A000000000000000000000000000000000005C :10F4B000000000000000000000000000000000004C :10F4C000000000000000000000000000000000003C @@ -73570,39 +73570,39 @@ :10F4F000000000000000000000000000000000000C :10F5000000000000000000000000000000000000FB :10F5100000000000000000000000000000000000EB -:10F52000000000000010001000100000000000109B -:10F53000000800880088008800080008008800C0D3 -:10F54000000000000040000000C0000000080000B3 -:10F550000008000800000000001000080000000083 -:10F5600000100000000000880000001000000040B3 -:10F5700000000040008800000000000000100000B3 -:10F5800000000000000000000088001000000000E3 -:10F590000000040000000088008800000000000057 -:10F5A0000020000000000008080382000010000096 -:10F5B00000000000000000000000002100008200A8 -:10F5C0000000000000000000000000080000000033 -:10F5D000000000000010000000000000000000001B -:10F5E0000000000000000000000000080000000013 -:10F5F0000000000000000000000000080000000003 -:10F6000000000000000000000000000000000000FA -:10F610000000400000000000000082000000000028 +:10F5200000000008000800100000000000080000B3 +:10F53000008800080000000000000000000000003B +:10F54000000000100010000000100000001000007B +:10F55000000000C0000000000000000000000000EB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000100000000000000000000000004B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E0000000000000000000080000000000000013 +:10F5F000000000000000000000000000000000000B +:10F6000000000000000800000000000000000000F2 +:10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA -:10F630000000001000002100000000000000000099 +:10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA -:10F650000000000000000010000000A000000000FA -:10F660000300000008840000080000000000000003 -:10F670000000000000C00000410008000000000081 -:10F680000000031003000300000041000300000815 -:10F69000410008C021840800080000840000030025 -:10F6A0002100080008A008C00000000000000000C1 -:10F6B0000000040000000000000000000000000046 -:10F6C0000000080000000000000000000000000032 -:10F6D0000000080000000000000000000000000022 +:10F6500000000000000000000000000000000000AA +:10F660000000080000000000000000000800030087 +:10F670000000000000000000000000000000008208 +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000410003000000000000000000000008000E +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D000C000000000000000000000000000020068 :10F6E000000000000000000000000000000000001A -:10F6F00000000800C000080008000000000008002A -:10F700000000000000000000000000000000820077 -:10F7100004110000000000000000000000002000B4 -:10F72000020000008800020000100000000000003D +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000080000000000000000000000E1 +:10F7200000000000000000000000000000000000D9 :10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 :10F7500000000000000000000000000000000000A9 @@ -73611,31 +73611,31 @@ :10F780000000000000000000000000000000000079 :10F790000000000000000000000000000000000069 :10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000008000000000000000041 -:10F7C0000000000000000000000000000000000039 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000080031 :10F7D0000000000000000000000000000000000029 :10F7E0000000000000000000000000000000000019 -:10F7F00000000800000000000800000000000000F9 -:10F800000000000000000000000082000000000076 -:10F8100008000000000000000000000000000000E0 -:10F8200000000000000000000000000000000000D8 -:10F8300000000000000800000000000000000008B8 -:10F84000000000000000008400000010000800A07C -:10F850000008080000000000030000000000000095 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000300000000F5 +:10F8100000080000000000000000000000000000E0 +:10F8200008000000000000000000000000000000D0 +:10F8300000000000000800000000000000000000C0 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 -:10F870000000000000A000000000000000000000E8 -:10F880000000210800000000030000000008000044 -:10F890002100000000C000C0000000000000008443 -:10F8A00008000000000008840084001000840000AC -:10F8B0000000000000000000080000000000000040 +:10F87000000000000000000000000000000008A0E0 +:10F880000010000000000000000000000000080060 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000080000000000000050 +:10F8B0000000000000000000000000000000000048 :10F8C0000000000000000000000000000000000038 -:10F8D000000900000000000000000000000000001F +:10F8D0000000000000000000000000000000000028 :10F8E0000000000000000000000000000000000018 -:10F8F00000000000000000000008000002000000FE -:10F9000000000000000000000000080000000000EF -:10F9100000000000000004000000000000000000E3 -:10F920000000020000000040000400000420040069 -:10F9300000020000000000000000000000000000C5 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 @@ -73810,8 +73810,8 @@ :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000001DB -:10042000000000010040000000000000000000008B +:10041000000000000000000000000000000080015B +:10042000000080010000000000000000000000004B :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C @@ -73819,7 +73819,7 @@ :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C -:1004A00020800000000000000000000000000000AC +:1004A00000900000000000000000000000000000BC :1004B000000000000000000000000000000000003C :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C @@ -73827,7 +73827,7 @@ :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB -:1005200000000000000000000020000000000000AB +:1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B @@ -73836,18 +73836,18 @@ :10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B :1005A000000000000000000000000000000000004B -:1005B0002800000000000000000000000000000013 +:1005B000000000000000000000000000000000003B :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B -:1005E0000000000000000000C000880000000000C3 -:1005F0000000000000000000C0002000000000001B -:10060000000020000000000020002000000000008A -:1006100000000000000000000000200000000000BA -:10062000000020000000000000008800880000009A -:1006300000000000000000000000C0002000C0001A -:10064000880088002000000000000000200000005A -:100650000000000000000000000020002000C0009A -:1006600020008800200000000000000000000000C2 +:1005E00000000000000000000000000000002000EB +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000002000CA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:10063000000000000000000000000000C0000000FA +:1006400000000000000000000000000000000000AA +:1006500088000000400000000000000020000000B2 +:10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A @@ -73856,30 +73856,30 @@ :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A -:1006F00000000000000041000000000000000000B9 -:1007000000000000000000000000000000000100E8 +:1006F00000000000000011000000000000000000E9 +:1007000000000000000000000000000000004100A8 :1007100000000000000000000000000000000000D9 -:100720000000000000004008000000000000000081 +:100720000000000000004000000000000000000089 :1007300000000000000000000000000000000000B9 :100740004008000000000000000000000000000061 -:100750001002000000000000000000000000000087 -:100760000000000000000000110000080008000860 -:100770000008008400000000900800840008008445 -:10078000000800000040000000080004000800828B -:1007900040820000000000000040000000080084CB -:1007A00000080000000000008009000000000008B0 -:1007B0000008000800000000000000080000000819 -:1007C0000000800900000000000000400000004020 -:1007D00000088083000000000000000800000008FE -:1007E00000000082000000000008C00000000000BF -:1007F00000000000000300000005000000000000F1 -:1008000000000000000300000000000000030000E2 -:1008100000080000000000000000000000000000D0 -:1008200000000000000000000000000000000000C8 -:1008300000000002000000000000000000000000B6 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000050000000000000000000083 +:100750001000000000000000000000000000000089 +:100760000000000000000000400000080000000041 +:100770000000000000000008C008000800000000A1 +:1007800000000000000000840008000800000000D5 +:1007900090080000000000020008000800000000AF +:1007A000000000000000000080080000008400003D +:1007B0000000008400000000000800080082000023 +:1007C0000000800100000000000000840000000024 +:1007D000000080000000000000020008000000008F +:1007E0000000000000000000000080080000000081 +:1007F00000000008000000000000000000000000F1 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000008000000000000D0 +:1008200000000000000000000000000000020000C6 +:1008300000000000000000000000000000000003B5 +:1008400000000000000500000000000000000000A3 +:100850000000000000000000000000000020000078 +:100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 @@ -73891,27 +73891,27 @@ :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 -:10092000000000000800840000000000000000003B -:10093000000000000000000000000000C000C00037 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000A000F7 -:100960000000000000000000000008000000080077 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000008000000AF +:100940000000000000000000000000008200000025 +:100950000000000000000000008000000000000017 +:100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000200000000000000000000000035 :1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000000000000000017 +:1009D0000000000000000000000000020000000015 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000002000000000C6 -:100A100000000000000000000000000800000000CE -:100A200000000008000000000000000000000000BE -:100A300000000000000000000000080008000000A6 -:100A400000000000000000000000000000000000A6 -:100A5000000000080000000000000000000000008E -:100A60000000000000000000000000040000000082 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000002000000000000000000A4 +:100A50000400002000200000000000000000000052 +:100A60000000000000000000000000000004000082 :100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 @@ -73921,22 +73921,22 @@ :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000080000DD -:100B100000000000000000000000000000000100D4 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 +:100B30000000000000000080000000000000000035 :100B400000000000000000000000000000000000A5 -:100B5000000000000000000000000000024008004B -:100B6000000800000000000000000000000000007D -:100B7000002100000000000000080000000000004C +:100B5000000000000000000000080000000000008D +:100B60000000000000000000000000000000000085 +:100B70000000000000000000010000000000000074 :100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 -:100BA0001000000000000000000000000000000035 -:100BB0000000000000000000000000000000000035 +:100BA0000000000000000000000000000000000045 +:100BB000000000000000000000080000000000002D :100BC0000000000000000000000000000000000025 :100BD0000000000000000000000000000000000015 :100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 +:100BF00000000000000000000000100000000000E5 :100C000000000000000000000000000000000000E4 :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 @@ -73948,7 +73948,7 @@ :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000232 +:100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 :100CD000000000000000000008000000000000000C :100CE0000000000000000000000000000000000004 @@ -73959,16 +73959,16 @@ :100D300000000000000000000000000000000000B3 :100D400000000000000000000000000000000000A3 :100D50000000000000000000000080008000000093 -:100D600000090000000000000000000080000000FA -:100D7000000900000000000000000000000000006A +:100D60000003000000000000000000008000000000 +:100D7000000800000000000000000000000000006B :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 :100DA0000000000000000000000000000000000043 :100DB0000000000000000000000000000000000033 :100DC0000000000000000000000000000000000023 :100DD00000000000000000000000000010002000E3 -:100DE000000000000000000000000000020082007F -:100DF00000000008000000000000000000000000EB +:100DE00000000000000000000000000010001000E3 +:100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 @@ -73976,7 +73976,7 @@ :100E400000000000000000000000000000000000A2 :100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 -:100E700000008200000000000000000000000000F0 +:100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 @@ -73984,22 +73984,22 @@ :100EC0000000000000000000000000000000000022 :100ED0000000000000000000000000000000000012 :100EE0000000000000000000000000000000000002 -:100EF0000000000080000000000000000000000072 +:100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 :100F4000000000000000000000020000000000009F :100F50000000000000000000000000000000000091 -:100F60000000000000000000080000000000000079 -:100F7000000000000005000011000000000000005B +:100F6000000000400000000003000000000000003E +:100F70000000004000000000080000000000000029 :100F80000000000000000000000000000000000061 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000001000000000000 +:100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 :1010100000000000000000000000000000000000D0 @@ -74007,8 +74007,8 @@ :1010300000000000000000000000000000000000B0 :1010400000000000000000000000000000000000A0 :101050000000000000000000000000000000000090 -:10106000000000000000484200500A009009000003 -:10107000000000000000842100500A0090090000D8 +:10106000000000000000818100900900C8430000DA +:10107000000000000000818100900900C8430000CA :101080000000000000000000000000000000000060 :101090000000000000000000000000000000000050 :1010A0000000000000000000000000000000000040 @@ -74031,17 +74031,17 @@ :1011B00000000200000000000040000000000000ED :1011C000000000000000000000000200000000001D :1011D00000400000000000000000000000000000CF -:1011E000000000000200000000000040004003205A -:1011F00004C0020002000000000000400040032084 -:1012000004C0020000000000000000000200000016 +:1011E0000000000002000000000000400040030872 +:1011F00010C0020002000000000000400040030890 +:1012000010C002000000000000000000020000000A :10121000000000400000000000000000000000008E :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E :101260000000000000000000000000000000080274 -:1012700000200400401000000000000000000802F0 -:1012800000200400401000000000000000000000EA +:1012700000081000401000000000000000000802FC +:1012800000081000401000000000000000000000F6 :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E @@ -74083,216 +74083,216 @@ :1014F0000000000900000000000000909A000000B9 :101500000000000900000000000000909A000000A8 :1015100000000000000000000000000900000000C2 -:10152000040004000400040000000000000040006B +:1015200000000000000000000000000000000000BB :1015300000000000000000000000000000000000AB -:10154000400000000000000000000000000020003B +:10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B -:10156000000304000400040000000000000000006C -:10157000200000000000000000000000000000004B -:10158000000000000000000000000000000040001B -:10159000200000000000000000000000000000002B -:1015A000000080008000800080000000000000003B +:101560000003000000000000000000000000000078 +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B :1015B000000000000000000000000000000000002B :1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B -:1015E000000000008000800080000000000000007B +:1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:101640000000000000000000000000000400040092 -:101650000400040000000000000000000000000082 +:1016300000080000000000000000000000000000A2 +:10164000000000000000000000000000000000009A +:1016500000800040000000000000000000000000CA :10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A +:1016700000000000000000000000000000000080EA +:1016800000000000900000000000000000000000CA :10169000000000000000000000000000000000004A -:1016A000000000001000000000000000000000002A -:1016B000000400080084000000000000000000009A -:1016C0000000000000040000000000000000800096 -:1016D0008000800480000000000000000000000086 -:1016E00000000000000800002000000000000000D2 -:1016F00000000000000400040000000000004000A2 -:1017000000000000000000080000000000000000D1 -:1017100000000000000800000000000000000000C1 -:101720000000000000000084000000000000000035 +:1016A0000000000000000000000000000008000032 +:1016B00000000000000000840000000000000000A6 +:1016C0000000000000000000000000000004000016 +:1016D00000000040000100000000000000000000C9 +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:101700000040000000000000000800000000000091 +:1017100000000000000000000008000000040000BD +:1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 -:101740000000000000000008000000000000000091 +:101740000000000000000000004000000000000059 :101750000000000000000000000000000000000089 -:101760000000000000000000000000000004000075 -:101770000000000000000000000000000000000069 +:101760000008000000000000000000210000000050 +:101770000000000000000000000000080000000859 :101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 +:101790000000000000000000000000000008000041 :1017A0000000000000000000000000000000000039 -:1017B0000000000000001000000000000000000019 +:1017B0000000000000000000000000000000000029 :1017C0000000000000000000000000000000000019 -:1017D00000000000000000081008000000000000E9 +:1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 -:1017F00000000000000000001008000010000000C1 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000810000000B0 -:101820000000000000000000000000400000000078 -:101830000000000008000800080008000000000088 -:101840000000000082008200820082000800000088 -:10185000080908000000A000000000008200A000AD -:101860008200820000000000000000000000000074 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 +:1017F00000000000000000000000040000000000E5 +:101800000000000000400000000000000000000098 +:101810000000000000000000000000840000000044 +:1018200000000000000000000000000000000000B8 +:101830000000000000000000000000000021000087 +:101840000000000000000000000000000000000098 +:101850000000000000000000000001000000000087 +:101860000000010000110000000000000000000066 +:101870000000000001000000000000000000000067 +:101880000000000000000000000000000100000057 :101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 +:1018A000000000000000000000000009000000002F :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00010001000000000000000000000000000C8 -:1019000000000000000000000000000000000000D7 -:1019100000000000080000000000000000000000BF +:1018D0000000000000000000000000000400000004 +:1018E00000000000040000000000000000000000F4 +:1018F00000000000000004000000000000000000E4 +:1019000000000000000000000000000000000400D3 +:1019100000000000000000000000000000000000C7 :1019200000000000000000000000000000000000B7 :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 -:101950000000000010000000000000000000000077 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000080008000000000000000000000037 +:101950000000000000000000000000000000000087 +:10196000000000030020000000050003000000004C +:101970000000004000000020000000000000000007 +:101980000000000000000000000000000000002037 +:101990000000000000000000000000000000000047 :1019A0000000000000000000000000000000000037 :1019B0000000000000000000000000000000000027 :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000020000D4 -:101A100000000000000000000000000000000000C6 +:1019E00000000000000000010000000000000000F6 +:1019F00000000000000100000001000000000000E5 +:101A000000000000000000000000000000000000D6 +:101A100000010000000000000000000000000000C5 :101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 :101A40000000000000000000000000000000000096 -:101A50000000000000000800000000000000C000BE -:101A600000000000000000210000000000008200D3 -:101A700000000000000000000000000000800000E6 +:101A50000000000000000000000000000080010005 +:101A60000000000000400000000300000000000033 +:101A7000000000000000000800000000000000005E :101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 +:101A90000000000000000000002100000000000025 +:101AA000000000000000000000000000000800002E :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000020C6 +:101AD00000000000000000000000000000000040C6 +:101AE00002000000000000010000000000000000F3 +:101AF00000000000000000000000000000000000E6 :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 -:101B20004100000000004100000000000000000033 +:101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 +:101B60000000009000000000000090000000000055 +:101B700000000000000000000000000090000002D3 :101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 +:101B900000000000900800000000000000000000AD :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 +:101BE00000000000008000000000110080000000E4 +:101BF0000000000000000000000000001100800054 :101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 +:101C100000000000110080800000000000000000B3 :101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 :101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C800000800000000000000000000000000000D4 -:101C90000000000000000000000000000000000044 +:101C60000000000000000000000000800000008074 +:101C700000000080000000000000000000000000E4 +:101C80000080000000800000000000000000000054 +:101C90000000000000000000008000000080000044 :101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 -:101CC0000008000000080000000000000000000004 +:101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 -:101CE0000000000000000000004000000040000074 -:101CF00000000000000000000000000000000000E4 -:101D0000000000040000004000000000000000008F -:101D100000000000000000000000000000000000C3 +:101CE00000000000000000000002000000100000E2 +:101CF0000020000000C00000000000000000000004 +:101D000000000020000000C00000000000000000F3 +:101D1000000000000000000000000020000000C0E3 :101D200000000000000000000000000000000000B3 :101D300000000000000000000000000000000000A3 -:101D40000000000020000000000000000000000073 +:101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 -:101D60000000000000000000000000004000000033 -:101D70000000000000000000000000000000000063 -:101D80000000000000004000000000000000000013 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 +:101D600000000000000000000000000008900000DB +:101D7000030000888800010000000000000000004F +:101D80000000010000888800010000000000000041 +:101D90000000000000000000000001000088880032 +:101DA0000100000000000000000000000000000032 :101DB0000000000000000000000000000000000023 -:101DC00000002000000000000000000000000000F3 +:101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000400000000000B3 -:101DF00000000000000000000000000000000000E3 -:101E00000000000040000000000000000000000092 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 +:101DE00000000000000000000000090000008080EA +:101DF0000000410000800000090000000000000019 +:101E00000000000041000080000009000000000008 +:101E10000000000000000000000000004100008001 +:101E200000000900000000000000000000000000A9 :101E300000000000000000000000000000000000A2 -:101E4000000000000000000800000000000000008A +:101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000969 -:101E70000000000000000000000000000000000062 -:101E8000000000000000004000080000000000000A -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 +:101E600000000000000000000000000000118000E1 +:101E700000000000001100000080000000000000D1 +:101E800000000000000000110000008000000000C1 +:101E90000000000000000000000000000000001131 +:101EA00000000080000000000000000000000000B2 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 :101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 +:101EE00000000000000000000000000000000001F1 +:101EF00020000088000000010000004000000000F9 +:101F00000000000000000000000100000040000090 :101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 +:101F20000001000000400000000000000000000070 :101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000004000000051 +:101F40000000000000000000000000000000000091 :101F50000000000000000000000000000000000081 :101F60000000000000000000000000000000000071 -:101F70000006000007000000000000000000000054 -:101F800000000000000000000000008100000700C9 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 +:101F700000000000070000000000000007008221B0 +:101F8000000000000000000000000000000007004A +:101F9000822100000000000000000000000000009E +:101FA0000000000000000700822100000000000087 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 :101FD0000000000000000000000000000000000001 :101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 +:101FF000000000FF000000FF000000000000F0F003 :1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 +:10201000F0F00000000000000000000000000000E0 +:102020000000000000000000F0F0000000000000D0 :1020300000000000000000000000000000000000A0 :102040000000000000000000000000000000000090 :102050000000000000000000000000000000000080 :102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 +:102070000000000000FF000000FF00000000000062 +:10208000F0F0000000000000000000000000000070 +:102090000000F0F000000000000000000000000060 +:1020A00000000000000000000000F0F00000000050 :1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000000000000010 :1020D0000000000000000000000000000000000000 :1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF +:1020F0000000000000000000FF000000FFFF0000E3 +:10210000FFFF0000FFFF00000000000000000000D3 +:1021100000000F0F0000FFFF0000000000000000A3 +:1021200000000000000000000000FF000000FFFFB2 :10213000000000000000000000000000000000009F :10214000000000000000000000000000000000008F :10215000000000000000000000000000000000007F :10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F +:1021700000000000000000000000FF000000000060 :10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F +:10219000000000000F0F0000000000000000000021 +:1021A000000000000000000000000000FF00000030 :1021B000000000000000000000000000000000001F :1021C000000000000000000000000000000000000F -:1021D000000005000A08050000A000000000000043 +:1021D00000000000000000000000000000000000FF :1021E00000000000000000000000000000000000EF -:1021F0000000000000000000000005000A280500A3 -:1022000000A000000000000000000000000000002E -:102210000000000005000A28050000A000000000E2 -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E +:1021F0000000000000000000000015002A0005405B +:1022000000A805002A00054000A80000000000000A +:102210000000000005002A00054000A800000000A2 +:1022200000000000000000000000000005002A007F +:10223000054000A8000000000000000000000000B1 :10224000000000000000000000000000000000008E :10225000000000000000000000000000000000007E :10226000000000000000000000000000000000006E @@ -74328,102 +74328,102 @@ :10244000000000000000000000000000000000008C :10245000000000000000000000000000000000007C :10246000000000000000000000000000000000006C -:1024700000002000000000000000400000000000FC -:102480000000000000000000000000000002C0008A -:1024900000002000000000000000200000000000FC +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C :1024A000000000000000000000000000000000002C -:1024B00000000000200000000000000020000000DC -:1024C00000000000000000000000A000000000006C -:1024D00000000000200000000000000000000000DC +:1024B000000000000000000000000000001100000B +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC :1024E00000000000000000000000000000000000EC :1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B +:10253000000000000000000000000000000010008B :10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:102560000000000000000003000000000000000068 -:10257000000000000000000000000000000000005B -:102580000000000000000000000000080000000043 -:10259000000000000000000000000000000000003B -:1025A000000000000000000000100000000000001B -:1025B000000000000000000000100000000000000B +:10255000000000000000000000000000000010006B +:102560000000000000000400000300000000000064 +:102570000000000000000000000000000000040057 +:102580000000000000000000000000030000000048 +:102590000000000000000400000000000000000037 +:1025A000000000000000000008030003000300001A +:1025B000000000000000000000000000000000001B :1025C000000000000000000000000000000000000B :1025D00000000000000000000000000000000000FB -:1025E00000000000000000000408000000000000DF -:1025F0000000000000080000008200000000000051 -:10260000040000000000000800840000000000003A -:102610000000000000040000008200000000000034 -:10262000000000000000000000040000400000085E -:102630000000000000000000000000080000000092 -:1026400000000000000000000000000000000090FA -:102650000000000000000000000000080000000072 +:1025E00000000000000000080000000000080008D3 +:1025F0000000000000000000000000840000000057 +:1026000000000000000000040000000000820082C2 +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A -:10267000000000000000000000000000000000005A -:10268000000000000000000000000000000000004A -:102690000000000000000000000000080000000032 -:1026A000000000000000000000000000000000002A +:102670000008000000000000000000000000000052 +:102680000000000000000000000000000002000048 +:10269000000000000000000000000000000000003A +:1026A0000000000000000000000000020000000028 :1026B0000000000000000000000000000000880092 :1026C000000000000000000000000000000000000A -:1026D00000000000900000000000000084000000E6 +:1026D000000000000400880000000000000004006A :1026E00000000000000000000000000000000000EA :1026F00000000000000000000000000000000000DA :1027000000000000000000000000000000000000C9 :1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 :102730000000000000000000000000000000000099 -:1027400000000000000000000090000000000000F9 +:102740000000000000000000000000000000000089 :102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 :102770000000000000000000000000000000000059 :102780000000000000000000000000000000000049 -:102790000000000000000010000000000000000029 +:102790000000000000000000000000000000000039 :1027A0000000000000000000000000000000000029 :1027B0000000000000000000000000000000000019 :1027C0000000000000000000000000000000000009 :1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000800000000000000E1 -:1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000000000000B8 -:10282000000000000000000000000000090000009F -:102830000000000040004000000000000000000018 -:102840000000000000000000000000000000050083 -:102850000000000000000000110011000000000056 -:102860000000210000000000000000000000000047 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000800000000000000000000D1 +:10280000000000A000000000000000000000000028 +:10281000000000000090000000000000000000A088 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 :102870000000000000000000000000000000000058 :102880000000000000000000000000000000000048 :102890000000000000000000000000000000000038 :1028A0000000000000000000000000000000000028 :1028B0000000000000000000000000000000000018 :1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000400000000000B8 -:1028E0000000000000008400000000000000000064 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 :1028F00000000000000000000000000000000000D8 :1029000000000000000000000000000000000000C7 -:1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:102940000000000000000000000000000000000087 +:102910000000000000000000000000000084000033 +:102920000000000000840000000000000000000023 +:102930000000000000000084000000000000000013 +:102940000000000000000000000000000000008403 :102950000000000000000000000000000000000077 :102960000000000000000000000000000000000067 :102970000000000000000000000000000000000057 :102980000000000000000000000000000000000047 :102990000000000000000000000000000000000037 -:1029A0000000000000000000000000000000000027 +:1029A0000000000000000002000000000000000223 :1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 -:1029E00010000000000000000000000000000000D7 +:1029C0000002000000000000000000000000000005 +:1029D00000000000000000000002000000000000F5 +:1029E00000000000000000000000000000000000E7 :1029F00000000000000000080000000000000000CF -:102A000000000000000000000008000000000000BE -:102A100000000000000000000000000000000000B6 -:102A20000000000000000000052000000000000081 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000110000000000A5 +:102A200000000000000000000000000000000000A6 :102A30000000000000000000000000000000000096 -:102A4000000000000000080000000000000000007E +:102A40000000000000000000000000000000000086 :102A50000000000000000000000000000000000076 -:102A60000002000000004100000000000000000023 +:102A60000000000000000000000000000000000066 :102A70000000000000000000000000000000000056 :102A80000000000000000000000000000000000046 :102A90000000000000000000000000000000000036 @@ -74578,178 +74578,178 @@ :1033E00000000000000000000000000000000000DD :1033F00000000000000000000000000000000000CD :1034000000000000000000000000000000000000BC -:10341000000000000000000000000000A00000000C -:103420000000000090000000880090000000A00054 -:10343000A0000800000200001000C000200088006A -:103440008800000020000000200220000000200072 -:10345000C000000000000008200000032000000061 -:103460000000880084000000000000000000000050 -:1034700088002000000088001004C0A000000000A8 -:1034800000000400880088000000C0000000000068 -:1034900020002000000000002000C000000000000C -:1034A00000000000000000000000000021000000FB -:1034B00041000000000000040000200000000000A7 -:1034C00000000000000000000000000421002100B6 -:1034D000000000000000000010000000000040009C -:1034E00000000000100000000000000000000000CC -:1034F000000000000000000000004001001140003A -:1035000000020000000000000000000000000000B9 -:1035100000000000000000000000000000000000AB +:1034100000000000000000000000000000000000AC +:103420000002000000000000000200000000000098 +:10343000000000000000000020000000000000006C +:10344000000000000000000000000011000000006B +:103450000004000000000000000000030000000065 +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000002000000000000000000003A +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:10351000000000000000000000000000400000006B :10352000000000000000000000000000000000009B -:103530000000000000000000000010004104000036 -:103540000000000000000000000000000003000078 -:10355000000000000000000000001000210000003A +:10353000000000000000000000000000010000008A +:10354000000000000000000000000000000000007B +:1035500000000000000882000000000000000000E1 :10356000000000000000000000000000000000005B -:10357000000000000000000000000000108020009B +:103570000000000000000000000000000000000843 :10358000000000000000000000000000000000003B -:10359000000000000000000000000000100010000B -:1035A000000000000000000000080084000000008F -:1035B0000000000000000004000000848000900172 -:1035C0000000000000000084000200900000009055 -:1035D0000084008400900000000000008000900043 -:1035E00000000008000000000008000000000000CB -:1035F000000800080000000000000000000080201B -:1036000080840084000000000084000000000000AE -:103610000082009000000000000000000000800018 -:103620008000002108218821840800200008002053 -:103630000008000800080008000000000003002047 -:10364000002100210000000000080000000300002D -:103650000008000800000000000300000000000057 -:103660000000000000030021040000000000000032 -:103670000000000000000011000000000000000039 -:10368000000000000000000000000000000000003A -:1036900000000011000900000000001100000000FF +:10359000000000000000000000000000000000002B +:1035A0000000008400080008000000080008000077 +:1035B00000080008000800080000000800081000CB +:1035C00000840000000800840000000800840090CF +:1035D0000090008400080084000000820084000045 +:1035E00000000000000000080000000000080000CB +:1035F00000000000000000840008000000080084B3 +:1036000000010000000000080000000000080000A9 +:10361000000000080000000800080008000803007F +:1036200000000021002100210008002100210008E5 +:1036300000080021002100050000002100210021D8 +:10364000002100110005002100210021002100219E +:10365000000400050003000400020021002100080E +:103660000000000000000021000000030021000312 +:103670000004000000000003000900040021000015 +:1036800000210004000000110021000000080000DB +:103690000008000000000000002100000000000001 :1036A000000000000000000000000000000000001A -:1036B00000000020000000000000000000000000EA -:1036C00000000020000000000000000000000400D6 -:1036D00000000800000000000000000000000000E2 -:1036E00000000008000000000000000000000000D2 -:1036F00000000000000000000000000000000000CA -:1037000003000000000000000000000000000000B6 -:103710000000000004004100000000000000000064 +:1036B0000000000000020000000000000000000008 +:1036C00000000000000000000000000000000000FA +:1036D000000000000088000400040000000000005A +:1036E00000000000000000000000000000000000DA +:1036F00000000004000400040004000000000000BA +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 -:103730000000000000000000000008001000000071 -:1037400000000000C00000000000000000000000B9 -:10375000A000000082000011C000C00008000000AE -:10376000820000008320000084000800C0000000E8 -:1037700000000800000000000800820000000000B7 -:10378000A000C000000000088200820000000800C5 -:1037900000000000C000000082008200C000820023 -:1037A000000008008400C084000000000000000049 +:103730000000000000000000000000000000000089 +:103740000000000001000000000000000000000078 +:103750000000000000000000000000000000C000A9 +:10376000C0000000C08000008400000000000000D5 +:103770000000000000050000000000000000000044 +:1037800000000000000000800000000000000000B9 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 +:1037C00000000000000020000000000000000000D9 :1037D00000000000000000000000000000000000E9 -:1037E0000000000000004001000000000000000098 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000000000001000000000000B7 -:1038100000000000000005000000000000000000A3 -:103820000000000000000000000300000003000092 -:10383000000020080000000000000400000000005C -:103840000000021104000400000004090000000050 -:103850000000000004004000C00000040000000060 -:10386000000008009000000410030000A000000009 -:10387000081100000000000084000811000000048E -:1038800008000000000040000004000008000000E4 -:103890000000A000080090000000C00090000000A0 -:1038A000000088000000000082000000000000000E +:1037E00000000008000000040000000000000000CD +:1037F00000A0000000000000000000000000000029 +:1038000000000000000800000004000000000000AC +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000080000000000000008000078 +:103840000008000000050008000000000021000042 +:10385000000000000008000000004003402140007C +:10386000002100050000000000030000000000002F +:103870000021000500000008000500030008000307 +:103880000020000000080000000000000000000010 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 :1038B0000000000000000000000000000000000008 :1038C00000000000000000000000000000000000F8 :1038D00000000000000000000000000000000000E8 :1038E00000000000000000000000000000000000D8 :1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000004000400AF -:103910000000000000000000000000000020000087 -:103920000000000000000000000000000000000097 -:103930000000840000000000000000000000000003 -:10394000000000000000000500000000000000086A -:10395000C0008200820000000000000000000000A3 -:103960000000000000001000000000000000000047 -:10397000000082008200080000000000000000003B -:10398000040000000000000000000000000009002A -:103990000000000000000400820082000000880097 -:1039A000000000000000840000000000000008008B -:1039B0000000000000000300000000000000000004 +:1039000000000000000000000000000004000000B3 +:1039100000000000000000000000000000000000A7 +:10392000000000000400000000000000000000088B +:10393000004100080011000000000000000000002D +:103940000000000800030005000000030010002133 +:10395000004100080000000000030000900000008B +:1039600000000008000800030000000000800000C4 +:103970000003000000080000820082000000002117 +:103980000000000000080008000000000000000027 +:10399000000000000008000000000000000000001F +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 :1039C00000000000000000000000000000000000F7 -:1039D00000000000200000000000000000000000C7 -:1039E00000000000000000000000000000000000D7 +:1039D00000000000000000000000000000000000E7 +:1039E00000000000000000000000000000000808C7 :1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A10004000000000000000000000000000000066 +:103A000000000000000000A0000000000000000016 +:103A100000000000000000000000000000000000A6 :103A20000000000000000000000000000000000096 -:103A3000000000000000000000010000080000007D -:103A40000082000100000010C09000000000000192 -:103A50000000000000000000000000000000000066 -:103A600000880000C1000040C0820000C0000001CA -:103A70000000000000000000000000000000000046 -:103A8000000101020101C1000040C0820000C0002D -:103A90000001000000000000000000000000900095 -:103AA00000000088000100000020820400000000E7 -:103AB00000010000000000000000004000000000C5 -:103AC00000200880104021000080800000000000DD -:103AD000004100000000000000000003080000009A -:103AE0000041080003028800008080800000800000 -:103AF00000030000000000000000000000030000C0 -:103B000000000010108020108800008080800000DD -:103B10008000000300000000000000000020000002 -:103B2000000000200500401021000000008000007F -:103B3000000000410000000008000000000000003C -:103B40001000000010000200410000080300000007 -:103B500000000000802000000800000000000000BD -:103B600005000000100008000800000003008000AD -:103B7000000000808010000000000800000000002D -:103B800000004000000011000200020000000300DD -:103B90008000000000808010000040000000000055 -:103BA0000000020000000300900005000000030078 -:103BB0000000000000008002000000000000000083 -:103BC00000000000000001000800100200000000DA -:103BD000020000000000C000000001000000000022 -:103BE000000000000000010010001088000001002B -:103BF0001000000000C08200000000000100000072 -:103C000000000000000000000000410021880000CA -:103C100001001000000000C0820100000000000050 -:103C200000000000010000000100040090080000F6 -:103C30000000900000000000C00100000000000033 -:103C400000000000000002018800008800008900D8 -:103C50000100000000000001000000000000000062 -:103C6000000000000000000004000010000001003F -:103C70000000000000000000000000000000000044 -:103C8000000000000000000000000400000200002E -:103C90000100000000000000000000000000000023 -:103CA00000000000000000000001020100A0000070 -:103CB0000100000000000000000100000000000002 -:103CC00000000000000000000010002000000000C4 -:103CD0000500080000000000004100000000000096 -:103CE0000000000000000000000380400080000091 -:103CF0004100000000000000004100000000000042 -:103D0000000000000000000000000005804000806E -:103D10000000410000000000000000410000000021 -:103D200000000000000000000000000880100000FB -:103D30000000020000000000000000410000000838 -:103D4000800000C10000000880008500000000C164 -:103D500080100008000000000000000008030008B8 -:103D6000800000C1000000000000A0000000004131 -:103D70000000000800000041000800000388000067 -:103D80000008800000C1000000038000A0000000C7 -:103D9000004100000008000000410008000003038B -:103DA0000040800000C10000000880008800000082 -:103DB000004180000040000000000000000020C121 -:103DC0000000200000400000000140004000000012 -:103DD0000009400100000000000000000000008811 -:103DE0000001200000400000000008000400000066 -:103DF000009102000000000000010001000001032A -:103E0000000000012000004000000000040040000D -:103E10000000009190000000000000010000000080 -:103E200001080000200000400000000002004000E7 -:103E300000000089020000000000000000000000F7 -:103E4000000500000000000000000000000000006D -:103E50000000811200E0070048810000000000001F -:103E60000000000000000000000000000000000052 -:103E70000000811200E080004842000000000000C5 -:103E800048420000000000000000000000000000A8 -:103E900000000000811200E04000484200000000E5 -:103EA0000000484200000000000000000000000088 -:103EB00000000000811200E0070048000000000040 -:103EC00000000006000000000000000000000000EC +:103A3000000000010001000100C00001000100C001 +:103A4000001100000001000800080001C00100C0D2 +:103A5000000000010001000100C00001000100C0E1 +:103A6000001100010001001000040001C00100C0AD +:103A70000000000000010001000100C00001000181 +:103A800000C0001100010301004000900001C001CE +:103A900000C0000000000000000000000000000066 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000410041004100910041004130 +:103AC000009010C10004024100800080004180414C +:103AD0000089000000410041004100910041004187 +:103AE000009010C100081141008000800041804119 +:103AF00000890000000000410041004100910041A8 +:103B00000041009010C111080341008000000041F5 +:103B1000804100890000000000000000000000005B +:103B20000000000000000000000000000000000095 +:103B30000000000000004100030000000080410080 +:103B40009100000009008800100000009100410071 +:103B5000C10000808000410003000000008041009F +:103B600091000000040088009000000890004100CF +:103B7000C1000080800000004100030000000080C0 +:103B80004100C100000908004000880000008300D7 +:103B90004100C10000808000000000000000000023 +:103BA0000000000000000000000000000000000015 +:103BB000000000000000000001000100000000C043 +:103BC0000100C00000000000090088020088C00059 +:103BD0000300C1000008820001000100000000C0D5 +:103BE0000100C00000000000090040900088C000F3 +:103BF0001100C10000088200000301000100000064 +:103C000000C00100C0000000000002000490008815 +:103C1000C1880900C1000008820000000000000007 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000C00001C0C142 +:103C400000000000000100C020100091000100C130 +:103C50000000000000010000000000C00001C0C121 +:103C600000000000000100C008100091000100C128 +:103C700000000000000100000000000000C0000182 +:103C8000C0C100000000000100C008080091000150 +:103C900000C1000000000001000000000000000062 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000080004143 +:103CC00080C100000000004100C10002004100412D +:103CD00000C1000000000041000900000080004118 +:103CE00080C100000000004100C180080041004187 +:103CF00000C1000000000041000900000000008039 +:103D0000004180C100000000004100C1804000412E +:103D1000004100C100000000004100090000000057 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000C100C2 +:103D4000800080C100004102000082004100C141AA +:103D50000000800200004100000080004100C1001E +:103D6000800080C100004102000082004100C1418A +:103D700000008008000041000000800041000000B9 +:103D8000C100800080C100004102800002004100AB +:103D9000C1C1000080080000410000008000410017 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC000C1004000C0C10000010002000800010065 +:103DD000C1851000C000000001000000C00001000B +:103DE000C1004000C0C10000010002000800010045 +:103DF000C1091000C000000001000000C000010067 +:103E00000000C1004000C0C1000001001000880097 +:103E10000100C1050800C000000001000000C00052 +:103E20000100000000000000000000000000000091 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000004200000000000030 +:103E5000000081120041070048000000000000003F +:103E600042000000000000000042000000000000CE +:103E7000000081120041070048000000000000001F +:103E800042000000000000000000004200000000AE +:103E900000000000811200410700480000000000FF +:103EA00000004200000000000000000000000000D0 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 :103ED00000000000000000000000000000000000E2 :103EE00000000000000000000000000000000000D2 :103EF00000000000000000000000000000000000C2 @@ -74771,436 +74771,436 @@ :103FF00000000000000000000000000000000000C1 :10400000000000000000DEAE0000757B0000000034 :1040100000000000000000000000000000000000A0 -:104020000000000000000000DEAE757B0000000014 +:104020000000000000000000DEAE00000000000004 :104030000000000000000000000000000000000080 -:104040000000000000000000DEAE6126034000001A -:10405000000000000230A0000000000000000C4042 -:1040600000000000000002C06486612603400000DA -:10407000000000000230A0000000000000000C4022 -:1040800000000000000002C06486000061260340BA -:104090000000000000000230A0000000000000004E -:1040A0000C4000000000000002C06486612603404E -:1040B0000000000000000230A0000000000000002E -:1040C0000C4000000000000002C0648600000000F8 -:1040D00000000000040004000400110000000000C3 -:1040E00000004000A00000000000000000000000F0 -:1040F0000000000020002000A000000000000000E0 -:1041000000002000210000008800400000010000A5 -:10411000004000000000200020000000000000001F -:10412000000000402000040000002000A10000006A -:1041300000000000000000002000C000000090000F -:1041400000000000A000A00000000000200000000F -:1041500000000000000080008000800004000000DB -:10416000000000000004000000000000000000004B -:10417000000000000000000000000000000000003F -:10418000000000000000400000000000800000006F +:104040000000000000000000000060C60300000047 +:10405000000000000031E0000000000000000C0043 +:1040600000000000000000C0630660C603000000FE +:10407000000000000031E0000000000000000C0023 +:1040800000000000000000C06306000060C60300DE +:104090000000000000000031E0000000000000000F +:1040A0000C0000000000000000C0630600000000DB +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 +:1040D00000002008880000008800000800000000A0 +:1040E0000000400000000000000000000000000090 +:1040F000000000000000000000000000A000000020 +:104100000003200000000000000000000003000089 +:10411000000000000000000000000000000000009F +:10412000000000002000000000000000000000006F +:10413000000000000000000000000000000000007F +:10414000000000002000000000000000000000004F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000004000000003B +:10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F -:1041A00000000000000000000000000000004000CF -:1041B00000000000000000000000000000000000FF -:1041C00000000000050000000000000000000000EA -:1041D0000000000000008400040000000000000057 +:1041A00000000000000000000090000000900004EB +:1041B00000000000000000000000000000040004F7 +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000200DD :1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000084000000000000001A -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000800000000090000000000000005E -:1042500000000000000000002000800000000000BE -:10426000000000080008000800000008000000002E -:10427000000000000000000000000000000000003E -:104280000082000800080084000000840000000094 -:10429000000000000000009000000000000000008E -:1042A00000004008009000820000000000000000B4 -:1042B00000000000000000000000004000000000BE -:1042C0000000008200080000000000000000000064 -:1042D00000000000000000000011000000000000CD -:1042E00000000000000000000000000000000004CA -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:10431000000000000000000000000021000000205C -:10432000000000000000000800000009000000007C -:104330000008000000000000000000000000000075 -:104340000000040000000000000000000000000069 -:10435000000000000000008200004100200000007A -:1043600000001100008400040000000040202084B0 -:104370000000000000000000000000000900000034 -:10438000000000000800000000000000000440A041 -:104390000000000000000000000000001082090082 -:1043A00000000400000000000000000000001000F9 -:1043B0000000000100002100000000002100410079 -:1043C0000000000041000300000000001100089000 -:1043D00008000000000000000000000000090002CA +:1041F000000000000000020000800000000000003D +:1042000000000000000000000200000000000000AC +:10421000000000000000000000000000000000009E +:10422000000000000000000002000000000000008C +:10423000000000000000000002000000000000007C +:10424000000000000000000000000000000000006E +:10425000000000000000000800000008000000004E +:10426000000000000008000800080000000800002E +:1042700000000000000000840084004000000000F6 +:1042800000900000008800840010801000100000E2 +:10429000020000000000000000000000000000001C +:1042A00000000000000000900082000000000000FC +:1042B00000000000000000080008000000000000EE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000008000000000000D6 +:1042E00000000000000000000000000000210000AD +:1042F000000000000000000000210000000200009B +:10430000000000000000000000080009000000207C +:10431000000000000000000000000021000000007C +:104320000000000000000000000000090041000043 +:104330000000000000090400000000000000000070 +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000110000004C +:10436000000000000000000000080008000800082D +:104370000008000000000000000000000000000035 +:10438000000000000000000000C000A0001011109C +:104390000010008400C000000000000800000000C1 +:1043A0000000000000000000000000C000880000C5 +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD :1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000090000000000000000000000A3 -:10441000000000000000000000008400C000000058 -:10442000000000000000C00000000000820000004A -:1044300000000000000000090800C0008200000029 -:104440000000080000000000000000000000000064 -:10445000C000000000000000840000000000000018 -:10446000000000000000000002000000000000004A -:104470000400000000000000000000001100000027 -:10448000000000000000080005000000000000001F -:10449000000000820000000000000000000000009A -:1044A00000000010000000000000000000000000FC -:1044B00000000040000000000000000000000000BC +:1043F000000000000000000000000000000040007D +:1044000008000000C00001000000000000000000E3 +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000001000000000000005B +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:104480000000000000000000040000000000000028 +:104490000000000000000000008400000000000098 +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000009000000800800100B3 -:1044F00001000000000000000000000000000000BB -:1045000000000000000000000000000800000000A3 -:1045100000009010000000804080000000000000BB -:10452000000000000408000000210000040000005A -:104530000000C00000000800900000000000000023 -:1045400000000000C000900000000000100090007B -:10455000000001000000820000000000C000000018 -:104560000900000010000090200240000000002020 -:1045700004840400000240880000000000000000E5 -:10458000000800000000009000000500000020006E -:10459000000800A0000000840008000800000000DF -:1045A00000000004100000000000090008000000E6 -:1045B00003004002008820000000000040000000CE -:1045C0000000000000000000110400040500008845 -:1045D00020000088400040000000000000000500AE -:1045E0000403040004000400080008000800080098 -:1045F000000000000000002000000010000000008B -:1046000000030000000000000000000000000000A7 -:10461000000000000080000000000000000000001A -:104620000000002100000000000000000000000069 -:104630000000000082000000100000000000820066 +:1044D00000000000000000000000040000000000D8 +:1044E00000000008000000000000000000000000C4 +:1044F00000000000000000000000000000000000BC +:104500000000080000000000082000000000C000BB +:104510000000820000000000000000000000001108 +:10452000000000000021000000000000000000006A +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000200000003B +:1045600000000000110000A000000000000000009A +:10457000008400A0200000000000000000000200F5 +:1045800000000000000000020000000100004000E8 +:1045900000080008200000000000000000000000EB +:1045A0000000000000000000000000000000008487 +:1045B00008000004110209040000000000000000CF +:1045C00000000200000000000000000000000000E9 +:1045D000000000000000000000000000000080005B +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000001000000000AB +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000800050000000000007D +:104630000021000000000000001100000000000048 :10464000000000000000000000000000000000006A -:104650000000000000000000000000000000080052 -:104660000000800080008000C0000000000000000A -:104670000000000000000000000100000000000039 -:1046800000000000000000000000008200000000A8 -:1046900004040000000000100000000000004100C1 -:1046A0000200000000000000000000000000000008 +:10465000000000000000000000000000000000005A +:104660000200000000000000000000000000000048 +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A :1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA -:1046E00000000200000000000000000000000000C8 +:1046E00000000000000000000000000000000000CA :1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000001000197 -:104720000800000000000000000000000000000081 +:104700000000000000000000000000000000900217 +:104710000000000000000000000000000240004017 +:104720000040081000000000000000000000000031 :104730000000000000000000000000000000000079 -:1047400000008800000000000000000000000000E1 +:104740000000000000000000000000000000000069 :104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 +:1047600000008800000000000000000000000000C1 :104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:1047900000000000000000000000000000000041D8 -:1047A00010100008000800000000000000000000D9 +:104780000000000000000000000000000000110018 +:104790008000000000000000000000000000800019 +:1047A0000080000000000000000000000000000089 :1047B00000000000000000000000000000000000F9 -:1047C00000000300000000000000000000000000E6 +:1047C00000000000000000000000000000000000E9 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 -:1047F00000000080000000800000008000000080B9 +:1047F00000000000000000000000000000000000B9 :1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 +:104810000000008000000080000000000000000098 +:104820000000009080A00080000000000000000058 :104830000000000000000000000000000000000078 :104840000000000000000000000000000000000068 -:1048500000000000000000000000400041000308CC -:1048600041000000000000000000000000200000E7 -:10487000002000000004000000040000000400000C -:104880000004000000000000000000000000000024 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 +:104850000000000000000000000000000000000058 +:104860000000000000000011000000000000000037 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:10489000000000000020000000C000000000000038 +:1048A00000000400C0820210100800000000000098 :1048B00000000000000000000000000000000000F8 :1048C00000000000000000000000000000000000E8 :1048D00000000000000000000000000000000000D8 -:1048E00000000100000000000000000000000000C7 -:1048F0002000000000000000040000000000000094 -:1049000004000000000000000000000000000000A3 -:104910000000000000000000000000000000000097 -:104920000000000000000001010000010000000084 +:1048E0000000000000000000000000900000000038 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:104910000000000001000088880001000000000085 +:1049200000000000C090001088101010000000006F :104930000000000000000000000000000000000077 -:104940000000000000000001000000000001000065 +:104940000000000000000000000000000000000067 :104950000000000000000000000000000000000057 -:104960000000000000000000000000000000200027 -:1049700000000000000005000000800000000500AD -:1049800000008000000000000000000000000000A7 -:104990000000000000000000000000000000000017 -:1049A000000000000000000821101041004100003C +:1049600000000000000000000000880100000000BE +:104970000000000000000000000000000000000037 +:104980000000000000000000000000000000000027 +:10499000000000000000410000800000090000004D +:1049A0000000000000008000000000001000000077 :1049B00000000000000000000000000000000000F7 -:1049C0000000000000000000000800050008004191 +:1049C00000000000000000000000000000000000E7 :1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F0000010002100000000000000020000000084 -:104A0000000000080000000000000000000000009E -:104A10000000000000000000000000000000000096 -:104A2000000000000000000000080000000000007E +:1049E00000000000000000000000000000110000B6 +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000001100000080000005 +:104A20000000000000000000800000800000000086 :104A30000000000000000000000000000000000076 :104A40000000000000000000000000000000000066 :104A50000000000000000000000000000000000056 -:104A6000000000000000000000080000000000003E -:104A70000000000100000000000000000000000035 +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000010000000005 -:104AB00000000000000000000000000000000000F6 +:104A900000000000000000000000000100000040D5 +:104AA00000000000000000000000100090821020B4 +:104AB00010000000000000000000000000000000E6 :104AC00000000000000000000000000000000000E6 :104AD00000000000000000000000000000000000D6 -:104AE0000000000000400000000000000000000086 -:104AF00000000000000000008000000000820000B4 -:104B00000700000000060000070000000000000091 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 :104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 +:104B200007008221000000000000000000000000DB +:104B30000000500000000000000000000000000025 :104B40000000000000000000000000000000000065 :104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 +:104B60000000000000000000000000000000001134 +:104B700000E007000000000000000000000000004E :104B80000000000000000000000000000000000025 :104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 +:104BA0000000F0F000000000000000000000CDC197 +:104BB0000D01550FC30000000000000000000000C0 :104BC00000000000000000000000000000000000E5 :104BD00000000000000000000000000000000000D5 :104BE00000000000000000000000000000000000C5 :104BF00000000000000000000000000000000000B5 :104C000000000000000000000000000000000000A4 :104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 +:104C200000000000F0F000000000000000000000A4 +:104C3000FDF13D31550FC3FF0000000000000000F2 :104C40000000000000000000000000000000000064 :104C50000000000000000000000000000000000054 :104C60000000000000000000000000000000000044 :104C70000000000000000000000000000000000034 :104C80000000000000000000000000000000000024 :104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 +:104CA00000000000FF000000FFFF00000000000007 +:104CB00000002034617500AAD2D20000000000007C :104CC00000000000000000000000000000000000E4 :104CD00000000000000000000000000000000000D4 :104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 :104D000000000000000000000000000000000000A3 :104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 +:104D2000000000000000FF00000000000000000084 +:104D300000000000A2B6E3F755FFD2D20000000049 :104D40000000000000000000000000000000000063 :104D50000000000000000000000000000000000053 :104D60000000000000000000000000000000000043 -:104D7000000000000000000000000000000005002E -:104D80000A08050000A005000A28050000A005008B -:104D90000A28050000A0000000000000000000003C -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000610006000D000000007F +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA00000000000000005002A00054000A80000E7 +:104DB0000000000000000000000000C00000000033 :104DC00000000000000000000000000000000000E3 -:104DD000000000000000000000610006000D00005F +:104DD00000000000000000000000000000000000D3 :104DE00000000000000000000000000000000000C3 -:104DF00000610006000D000000000000000000003F +:104DF000000000000000000000610026050900A07E :104E000000000000000000000000000000000000A2 :104E10000000000000000000000000000000000092 :104E20000000000000000000000000000000000082 -:104E3000000000000000000000000000A0BC0A3ECE +:104E30000000000000000000000000000000000072 :104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000A0BCF6 -:104E6000507C000000000000000000000000000076 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000AA0088 +:104E8000AA00000000000000000000000000000078 :104E90000000000000000000000000000000000012 :104EA0000000000000000000000000000000000002 -:104EB0000000000000000000000000000000003CB6 -:104EC000003C0000000000000000000000000000A6 +:104EB00000000000000000000000000000000000F2 +:104EC00000000000000000000000000000000000E2 :104ED00000000000000000000000000000000000D2 -:104EE000003C003C0000000000000000000000004A +:104EE00000000000000000000000000000000000C2 :104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 +:104F0000AA00AA000000000000000000000000004D :104F10000000000000000000000000000000000091 :104F20000000000000000000000000000000000081 -:104F3000000000000000000000000000141F1F140B +:104F30000000000000000000000000000000000071 :104F40000000000000000000000000000000000061 :104F50000000000000000000000000000000000051 :104F60000000000000000000000000000000000041 -:104F70000000000000000000000028F8F8280000F1 +:104F70000000000000000000000000000000000031 :104F80000000000000000000000000000000000021 :104F90000000000000000000000000000000000011 :104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000001414C9 -:104FC00014140000000000000000000000000000B9 +:104FB00000000000000000000000000000000000F1 +:104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 -:104FF0000000000000000000000000002828282811 -:105000000000000000000000200400042000210037 -:105010000000000000000000000000000000000090 -:105020000000000000000000200000002000004000 -:1050300000000004000000000000000088001000D4 -:10504000000010000000C00200020000000000008C -:1050500088000000000000000000000000000000C8 +:104FF00000000000000000000000000000000000B1 +:1050000000000000000000000000000000000000A0 +:105010000000000000002000000000002000000050 +:105020000000000000002000000000000000000060 +:105030000000000000000000000000002000000050 +:10504000000000000000000000030000000000005D +:10505000000400000000000000000000000020002C :105060000000000000000000000000000000000040 -:1050700000004000880000008800000010000000D0 -:10508000000000000000000004008001000180001A -:1050900020000000000000000000000000000000F0 +:105070000000000000000000000000000000000030 +:1050800000000000000000004000000000000000E0 +:105090000000000000000000000000000000000010 :1050A0000000000000000000000000000000000000 -:1050B0000000090000000000100040000000000097 +:1050B00000000000000000000000000000000000F0 :1050C00000000000000000000000000000000000E0 -:1050D0000000000000000000400000004000000050 +:1050D00000000000000000000002000000000000CE :1050E00000000000000000000000000000000000C0 -:1050F0000000000000000000000000004000000070 -:1051000000000000400000000000800000002000BF -:1051100000002080000000000000080000000000E7 +:1050F00000000000000000000000100000000000A0 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F :10512000000000000000000000000000000000007F -:105130002000C00000000200020002000400040081 -:1051400004000000000000000000820000002000B9 -:10515000000000000000000000000000040000004B -:1051600000000000000000000000000082000000BD +:10513000000000000000000000000000000000006F +:105140000000000900000000000000020000000054 +:1051500000000000000000000000820000000000CD +:105160000000000204000000000000000200000037 :10517000000000000000000000000000000000002F -:1051800000000000000000800080000000410000DE -:105190008000000080040008000000000000000003 -:1051A00000000000000000000000000000100000EF -:1051B00000000000000002840000000000008000E9 -:1051C00080008000000000020000000000000000DD +:10518000000000000000000000000000000000001F +:105190000000000000080000000000000004000003 +:1051A00000000000000000000000000000000000FF +:1051B00000000000001000000000000000000000DF +:1051C000000000000000000000000084000000005B :1051D00000000000000000000000000000000000CF -:1051E0000000000000000000000800900000000027 +:1051E000000000000000800000000000000000003F :1051F00000000000000000000000000000000000AF -:10520000000000000000000000200020000000005E -:1052100000000404000000000000400000009000B6 -:1052200004000003400040000000000000000000F7 -:10523000C020000000000000A00000001000880056 -:10524000040040000000040000080000000084008A -:10525000000000000000000000000000002100002D -:10526000004100000000080008000000C008900095 -:105270000800900000000000000000008200000014 -:105280008200000004000000000000000000000098 -:105290000000000000050000000000000000000405 -:1052A000000000A0008200000000000000000000DC -:1052B00000200000000021000800000000000000A5 -:1052C0000000000000000000008811000000000045 -:1052D00000000000002000000000000000000000AE -:1052E000000000000000000000000000000000209E -:1052F000002000000000000010000000000000007E -:105300000000000000000000000004200000000079 +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000117D +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:105240009000040040000200000000000000000088 +:10525000000000000000000000000000000000034B +:1052600040000400040004000400400000000000AE +:10527000000004000000000000000000000000002A +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000008F6 +:1052B00000000000000000000000000000000000EE +:1052C000000000040000410021000000000000A0D8 +:1052D000000000000082008200200020000000008A +:1052E00000000000000000000000000000000000BE +:1052F000002000000000000000000000000000008E +:10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D -:10532000000000200000000000004000100000000D -:105330000000400000000000A0000000004000202D -:10534000004000200000004000004000000000007D -:10535000000000000000000000000000000000004D -:10536000000000000000000000000000000000003D -:10537000080000001000000000000000080000000D +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000200300003A +:10535000000001000000000000000000000000004C +:10536000000000000100000000000000000000003C +:10537000000000000000000000000000000000002D :10538000000000000000000000000000000000001D -:10539000000090000200000000000000000000007B +:10539000000000000000000000000000000000000D :1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000001EC -:1053C00000010001000100000001000000000000D9 -:1053D00000000000000000000000000000000000CD -:1053E00000000000000000000000000000000000BD +:1053B00000000000000000000000000000000000ED +:1053C000000000000000000000000000000080005D +:1053D00000000000040000000000000000000000C9 +:1053E00000000000000004000000000000000000B9 :1053F00000000000000000000000000000000000AD :10540000000000000000000000000000000000009C -:10541000000000000000000000000000010000008B +:10541000000000000000000000000000000000008C :10542000000000000000000000000000000000007C -:1054300000080400000000000000000008008400D4 -:105440000000000040008400000000050000008013 -:10545000000000210000002100000000000000000A -:105460000000000000000000000000000000040038 -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000002001A -:105490008200000000000000000008000000200062 -:1054A000000040000000009000000000000000002C -:1054B0000000000000200000000000000000880044 -:1054C00000000300000000000000000000000000D9 -:1054D0000020090009080000000000000000000092 -:1054E0000800000021000000000000000000000093 -:1054F000000000880000000400000090000400008C -:10550000000000000090000000000000000000000B -:1055100000880000000000000000090000000000FA +:10543000000000000000000000000000000000006C +:105440000000000000000800000000000000000054 +:105450000000000000000000000004000000000048 +:105460000002001100000400001000000011000004 +:10547000002000000000000000000000000000000C +:10548000000000000000000000000000000000001C +:10549000000000000000A0008400000000000000E8 +:1054A00000080000000000000000000000000000F4 +:1054B00000000000000000000000000000000000EC +:1054C0000000000000000000008400040000000054 +:1054D0000000000009000000082000008200000019 +:1054E000000000010000000080000000000000003B +:1054F00009880021002000000000000000000000DA +:10550000000000000000000000000000000000009B +:105510000000000000000000020000840000000005 :10552000000000000000000000000000000000007B -:105530000000000000000000100000000800000053 -:1055400008008200010001000100010000040000C9 -:105550000003001100400021000900410000080084 -:10556000000000000000000000000000000000003B +:10553000000000000000000000000000000000006B +:105540000000000000000000000004000000000057 +:105550000000000200000000000000000000000049 +:10556000000000000000000000200000000000001B :10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B -:1055900000000000000000000000040000000800FF +:1055900000000800000000000000080000000000FB :1055A00000000000000000000000000000000000FB :1055B00000000000000000000000000000000000EB -:1055C000000080000000040002000400022000002F -:1055D00000000000000000011100000000000000B9 -:1055E00000000000000000000000000000000000BB +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000000000000100000000BA :1055F00000000000000000000000000000000000AB :10560000000000000000000000000000000000009A :10561000000000000000000000000000800000000A :10562000000000000000000000000000000000007A :10563000000000000000000000000000000000006A -:10564000000000000000000001C0C040000410087D -:1056500000C01040008210C00000000000000000E8 +:10564000000000000000000000000000000000005A +:105650000000000000000000000000000001000049 :10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A +:105670000000000002000000000000000000000028 :10568000000000000000000000000000000000001A :10569000000000000000000000000000000000000A :1056A00000000000000000000000000000000000FA :1056B00000000000000000000000000000000000EA -:1056C000000000000000000000001080008000804A -:1056D00080800480808000008000000000000000C6 +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000008C2 :1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA +:1056F000000000000000800000000000000000002A :105700000000000000000000000000000000000099 :105710000000000000000000000000000000000089 -:105720000000000000080000000800000000000069 +:105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 -:105740000000000000000000000000008000804118 -:1057500080418000800080090041808000000000BE -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:1057600000000000000000000000000500800000B4 +:1057700000800000008000000000000000800000A9 :105780000000000000000000000000000000000019 :105790000000000000000000000000000000000009 -:1057A00000800000008000000000000000000000F9 +:1057A00000000000000000000000000000000000F9 :1057B00000000000000000000000000000000000E9 -:1057C0000000000000000000000000000000400099 -:1057D00040830401C040400040008201C008000036 -:1057E00000000000000000000000000000000000B9 -:1057F00000000000000000000000000000000000A9 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E000000000000020000000000000000100A0F8 +:1057F0000000001000000002000000000000008215 :105800000000000000000000000000000000000098 :105810000000000000000000000000000000000088 -:10582000000000C0000000080000020000000000AE +:105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 :105840000000000000000000000000000000000058 -:10585000C0020082A08401C040080082108401C000 -:105860000000000000000000000100000000000037 -:105870000000000000000000000000000000000028 +:105850000000000000000000000000000000000048 +:1058600000000000890000000000000000000000AF +:1058700000000000000088000000000000000000A0 :105880000000000000000000000000000000000018 :105890000000000000000000000000000000000008 -:1058A00000000100000002000000000000000000F5 -:1058B00008000000000000000000000000000000E0 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000000000E8 :1058C00000000000000000000000000000000000D8 -:1058D000000089800080008041808080008080807E -:1058E00041800000000000000000000100000000F6 +:1058D00000000000000000000000000000000000C8 +:1058E000000000000000110000000000002000097E :1058F00000000000000000000000000000000000A8 :105900000000000000000000000000000000000097 :105910000000000000000000000000000000000087 -:105920000000000010000000000000000000000067 +:105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 :105940000000000000000000000000000000000057 -:10595000000000008040800880C18080800380219A -:10596000808900000000000000000000000100002D +:105950000000000000000000000000000000000047 +:1059600000000000001100000000000000008000A6 :105970000000000000000000000000000000000027 :105980000000000000000000000000000000000017 :105990000000000000000000000000000000000007 -:1059A00000000000000000000008000000000000EF +:1059A00000000000000000000000000000000000F7 :1059B00000000000000000000000000000000000E7 :1059C00000000000000000000000000000000000D7 -:1059D000000000000000C001820084100804C00024 -:1059E00082008410C082000000000000000000015E -:1059F00000000000000000000000000000000000A7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00090000000000040000000000000000000D7 :105A00000000000000000000000000000000000096 :105A10000000000000000000000000000000000086 :105A20000000000000000000000000000000000076 -:105A30000000000100000000000000000000000065 +:105A30000000000000000000000000000000000066 :105A40000000000000000000000000000000000056 -:105A50000000000000000000000000004000424282 -:105A600000000000400000420000000000000000B4 -:105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000008100E007000000CE +:105A70000000001100000700000000000000070007 +:105A8000000000000000070000000000000000000F :105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000600000700E9 -:105AB0006000000000000000000000000000000086 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 :105AC00000000000000000000000000000000000D6 :105AD00000000000000000000000000000000000C6 :105AE00000000000000000000000000000000000B6 -:105AF00000000000000000000000000000000000A6 +:105AF00000000000FFFF3C3C000000000000000030 :105B00000000000000000000000000000000000095 :105B10000000000000000000000000000000000085 :105B20000000000000000000000000000000000075 @@ -75208,14 +75208,14 @@ :105B40000000000000000000000000000000000055 :105B50000000000000000000000000000000000045 :105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 +:105B7000000000000000FFFF3C3C000000000000AF :105B80000000000000000000000000000000000015 :105B90000000000000000000000000000000000005 :105BA00000000000000000000000000000000000F5 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 -:105BD000000000000000000000000000000043087A -:105BE0004000008421864108400000842106000016 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 :105C10000000000000000000000000000000000084 @@ -75236,20 +75236,20 @@ :105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 :105D20000000000000000000000000000000000073 -:105D3000000000000000000000000000006100867C -:105D4000000D000000000000000000000000000046 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 :105D50000000000000000000000000000000000043 -:105D600000000000100020080040000800000008AB -:105D7000000000080000000000100000000000000B -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 +:105D60000000000000000000000000000000000033 +:105D70000000000000610022050D00A0000000618D +:105D80000026000D000000000A00050000A0000031 +:105D90000000000000A00000000000000000000063 :105DA00000000000000000000000000000000000F3 -:105DB00000000000000005000A28050000A0000007 +:105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 :105DD00000000000000000000000000000000000C3 :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 +:105E000000000000C0C0C0C0000000000000000092 :105E10000000000000000000000000000000000082 :105E20000000000000000000000000000000000072 :105E30000000000000000000000000000000000062 @@ -75257,7 +75257,7 @@ :105E50000000000000000000000000000000000042 :105E60000000000000000000000000000000000032 :105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 +:105E8000000000000000C0C0C0C000000000000012 :105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 @@ -75272,68 +75272,68 @@ :105F40000000000000000000000000000000000051 :105F50000000000000000000000000000000000041 :105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 +:105F70000000000000000000000000000F0F0F0FE5 :105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 :105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000004000004000000C9 -:105FD000000000002000000000000000040000009D -:105FE000000000002000000000000000000200008F -:105FF0000000000020000000000000002000000061 -:1060000000000000A00000000000000000000000F0 -:106010000000400000002000000000000000200000 -:10602000000000000000040000000000000000006C -:106030000000000000000000000000000000000060 -:1060400000001000100020000000000000004000D0 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000020000000A1 +:105FE00000000000000000000000000000000000B1 +:105FF000000000000002000000000000200000007F +:10600000000000040000000000000000000000008C +:106010000000000000000000000040000000200020 +:106020000000000000000000000000000000000070 +:10603000000000000000000200022000000000003C +:10604000000000000004000200000000000040000A :106050000000000000000000000000000000000040 :106060000000000000000000000000000000000030 -:10607000000000000000000000020000100000000E -:1060800000000000000020000000000000000000F0 -:1060900010000000000000000000000000000000F0 -:1060A00000000000000000002000000000000000D0 -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000020000000000000000EE +:1060B00000000000000000020000000000000000DE +:1060C000000200000000104000000000000000007E :1060D00000000000000000000000000000000000C0 :1060E00000000000000000000000000000000000B0 :1060F00000000000000000000000000000000000A0 :10610000000000000000000000000000000000008F :10611000000000000000000000000000000000007F -:1061200000000000000000008200000000000000ED +:10612000000020000000000000000000000000004F :10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:106160000000000800000000000000000000000027 -:10617000000000000000000000000000000000001F -:106180000000000800000000000000000000000007 -:1061900000000002000000000000000000000000FD -:1061A00000000000000800000000000000000000E7 +:1061400000000000900000000000000000000000BF +:106150000000020000000000000000080000000035 +:10616000000000000000000000000200000000002D +:10617000000000000000000000000004000000001B +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF -:1061C00000000000000800000000000000000000C7 -:1061D000000000000000000000009000000000002F -:1061E00020002000040090000000200000000000BB -:1061F0000000000000000000000088000000000017 -:106200000000000000008400200004009000000056 -:10621000000000000400000000000000000000007A -:10622000000088000000000000000000040084005E -:106230000000000000000000000008001000000046 -:106240000000000004009000880000000000000032 +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000004009B +:10620000000000000000000000000000040000008A +:10621000000000000000000000000000000000007E +:1062200000000000C0000000040088000000020020 +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E :10625000000000000000000000000000000000003E -:10626000000000000000000000000000000021000D -:10627000000000000000030000000000000000001B -:10628000000000000000040000000000000000000A +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:1062800000000000000004001000000000000000FA :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE -:1062D000210000000000000000000000000000009D -:1062E00000000000000000000800000000000000A6 -:1062F0000000000000000000000000090009000983 -:10630000000900000000000000000009000000007B -:10631000000000000000000000000000000000007D +:1062C00000000000000000000800000000000000C6 +:1062D00004000000000000000000000000000000BA +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000400000000000004D +:10631000000000000000000000000040000000003D :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D -:106340000000080000000000000000000000000045 +:10634000000000000000000000000000000000004D :10635000000000000000000000000000000000003D :10636000000000000000000000000000000000002D :10637000000000000000000000000000000000001D @@ -75344,34 +75344,34 @@ :1063C00000000000000000000000000000000000CD :1063D00000000000000000000000000000000000BD :1063E00000000000000000000000000000000000AD -:1063F0000000000000000000000000080000000095 +:1063F000000000000000000000000000000000009D :10640000000000000000000000000000000000008C :10641000000000000000000000000000000000007C -:10642000000000000000000000000000000000006C +:106420000000000000000400000000000000000068 :10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C -:10645000000000001000000000000000000000002C -:106460000000000005000002000000000000000025 +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000002002A :10647000000000000000000000000000000000001C -:10648000000000000900210000880000000000005A -:1064900004000000000040000000000000000000B8 -:1064A00000000000000000000000002000000000CC -:1064B0000000008800000020000000000000000034 -:1064C000210010000000000000000000000000009B -:1064D0000020000000001000030000000000000089 -:1064E000200000000000000000000000000000008C -:1064F0000800000000000000000000000000000094 -:106500000800000000000000000000000000000083 +:1064800000200000000000000000000000000000EC +:106490004000000000000084000000000000000038 +:1064A0000000040000000000008400000400000060 +:1064B00000040000000000000000000000000000D8 +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B -:10652000000000000000000000000000000000006B -:106530000000000000000000000008000000000053 +:106520000000000200000000000000000000000069 +:106530000000000200000000000000000000000059 :10654000000000000000000000000000000000004B -:106550000000080000000000000000000000000033 -:1065600020001100000000000000210000000000D9 -:106570000000000000000000000000820000000099 -:106580000000000009000000000000000000000002 +:10655000000000000000000000000000000000003B +:10656000000000000000000000000000000000002B +:10657000000000000000000000000000000000001B +:10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB +:1065A00000000000000000000000000000200000CB :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB @@ -75472,96 +75472,96 @@ :106BC00000000000000000000000000000000000C5 :106BD00000000000000000000000000000000000B5 :106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000018014 -:106C0000042001800080000000000000000001005E -:106C10000080410000800000000000000000000033 +:106BF0000000000000000000000000000000000095 +:106C00000000000000000000000000000000000084 +:106C10000000000000040000000000000000000070 :106C20000000000000000000000000000000000064 -:106C30000002000000000000000000000000000052 -:106C40000000000000000000000000000000000044 +:106C30000000000000000000000000000010000044 +:106C4000000000000000000400000000000000043C :106C50000000000000000000000000000000000034 :106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C8000042080010420002000000000000000001B -:106C900004020020049000204000000000000000DA -:106CA00000020000000000040000000000000000DE -:106CB0000000004020000000000040000002000230 -:106CC0000000000000000000400000000000400044 -:106CD00000004000004000020002400000400000B0 -:106CE0000000400000000002000200000000000060 -:106CF0000000000000000000004000000000000054 -:106D000000000100000001008300000000000000FE -:106D1000000004000100040000000000000000006A -:106D200000008200200000008200000082000000BD -:106D3000000000000000000000000000C000C000D3 +:106C70000000000000000000000000000000000410 +:106C80000000000000000004000000000000000000 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000002C2 +:106CD00000000000000000020000000000000000B2 +:106CE0000000000200000000100000000000000290 +:106CF0000000400000000000000000000000000054 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D300000008200000000000000000000000000D1 :106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 -:106D60000000000000000000000000100000000013 -:106D700000000000000000000800004000000008C3 -:106D800000000000040000000400040000000000F7 -:106D900000000000800004008200020000040008DF -:106DA00000000000000000000000000000000000E3 -:106DB00000000000040000000200020000000000CB -:106DC00000020000000000000000000000000000C1 -:106DD00000000000000000000000020002000000AF +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D800000000008000000000000000800000000F3 +:106D900000000000000000000000000000000000F3 +:106DA00000000010000000000000001000000000C3 +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000000000C3 +:106DD00000000000000000000000000000000000B3 :106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000880803 -:106E000000009000000088002000000090000000BA -:106E1000000004000400000000000000000000006A -:106E200000000000000000000000880000000000DA -:106E3000040000000000000000000000000000004E -:106E40000000000000000000000000000000000042 -:106E5000000000000000000000000000040000002E -:106E60000000100000000000000000000000000012 -:106E7000000000000000000000000000880000008A -:106E800000000000050000000000000000000000FD -:106E900000000000000000020082008400000000EA -:106EA00000000008000000000000000000000000DA -:106EB00004000000000000000000000000000000CE -:106EC00000000020000000000000000000000000A2 -:106ED00000000000000000001000000000000000A2 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E3000040004000000000000000000000000004A +:106E4000000000000000000000000000000004003E +:106E500000000000000000004000000000000000F2 +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 :106EE00000000000000000000000000000000000A2 :106EF0000000000000000000000000000000000092 :106F00000000000000000000000000000000000081 :106F10000000000000000000000000000000000071 -:106F20000100000000000000000000000004000458 -:106F30000009000000000000000000000000000048 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000400000000011 :106F40000000000000000000000000000000000041 :106F50000000000000000000000000000000000031 :106F60000000000000000000000000000000000021 :106F70000000000000000000000000000000000011 :106F80000000000000000000000000000000000001 :106F900000000000000000000000000000000000F1 -:106FA00000000400000000000000000000000000DD +:106FA00000000000000000000000000000000000E1 :106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 +:106FC00000000000000000000000000000000900B8 :106FD00000000000000000000000000000000000B1 :106FE00000000000000000000000000000000000A1 :106FF0000000000000000000000000000000000091 -:107000000000004000000000000000000000000040 -:1070100000000000000000000000000084020000EA -:107020000000000000000000000000000020000040 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 :107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 :107050000000000000000000000000000000000030 :107060000000000000000000000000000000000020 :107070000000000000000000000000000000000010 :107080000000000000000000000000000000000000 -:1070900000000000000400000020000000000000CC +:1070900000000000000000000000000000000000F0 :1070A00000000000000000000000000000000000E0 -:1070B00000000800000000000000002000000000A8 -:1070C00000000000000000200000000000000000A0 -:1070D00000000000000000000000040000000000AC -:1070E0000000000000880000000000000000000018 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E000000004000000000000000000000000009C :1070F0000000000000000000000000000000000090 -:10710000002000000000000002000000000900094B +:10710000000000000000000000000000000000007F :10711000000000000000000000000000000000006F -:107120000000000000000000000000000008000057 +:10712000000000000000000000000000000000005F :10713000000000000000000000000000000000004F :10714000000000000000000000000000000000003F :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F :10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000008F7 +:1071800000000000000000000000000000000000FF :1071900000000000000000000000000000000000EF :1071A00000000000000000000000000000000000DF :1071B00000000000000000000000000000000000CF @@ -75586,33 +75586,33 @@ :1072E000000000000000000000000000000000009E :1072F000000000000000000000000000000000008E :10730000000000000000000000000000000000007D -:1073100000000000000000000000000000800000ED -:1073200000000000000000000000000000800000DD -:1073300000800000000000000000000000000000CD +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D :10734000000000000000000000000000000000003D :10735000000000000000000000000000000000002D :10736000000000000000000000000000000000001D :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000010DD -:1073A0000000008800000000000000000000001045 -:1073B0000000004000000008000000000000000085 +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD :1073C00000000000000000000000000000000000BD :1073D00000000000000000000000000000000000AD :1073E000000000000000000000000000000000009D :1073F000000000000000000000000000000000008D :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C -:107420000000080000000000000000000000010053 -:107430000000080000000000000000000000000044 +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C :10744000000000000000000000000000000000003C :10745000000000000000000000000000000000002C :10746000000000000000000000000000000000001C :10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC :1074900000000000000000000000000000000000EC -:1074A00010000000000000000000000000000000CC -:1074B000400000000000000000000000000000008C +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC :1074C00000000000000000000000000000000000BC :1074D00000000000000000000000000000000000AC :1074E000000000000000000000000000000000009C @@ -75635,8 +75635,8 @@ :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A -:1076200000000000000000000000800000000000DA -:10763000000000000000000000004000000000000A +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A @@ -75676,8 +75676,8 @@ :1078800000000000000000000000000000000000F8 :1078900000000000000000000000000000000000E8 :1078A00000000000000000000000000000000000D8 -:1078B00005000A00150000A0000000000000000004 -:1078C00005000A00150000A00000000000000000F4 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 :1078D00000000000000000000000000000000000A8 :1078E0000000000000000000000000000000000098 :1078F0000000000000000000000000000000000088 @@ -75716,71 +75716,71 @@ :107B00000000000000000000000000000000000075 :107B10000000000000000000000000000000000065 :107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 -:107B400000000000000200004000000000000000F3 -:107B50000000000000000000000000000000000025 -:107B600000000000000000002000000000000000F5 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000200000000000D5 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000200000000000B5 +:107B30000000000000000000000000002000000025 +:107B4000020000000000000004000000000000002F +:107B500000001000100000041000000020000000D1 +:107B60000000000000000000000000000000000015 +:107B70000020000120002000400020000000200024 +:107B800000040000000000000000000000000000F1 +:107B900000000000C00020002000200000002000A5 +:107BA0000004000088000000000000000000000049 :107BB00000000000000000000000000000000000C5 -:107BC00000020000000000000000000200000000B1 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000100085 -:107BF0000000000000000000000000400000000243 -:107C00000000000200000000000000000000400032 -:107C10000000400000000000000000000000000024 -:107C2000000208000000400000000000000000000A -:107C30000000000000000000000000000000020042 +:107BC00000000000000000000000000000000000B5 +:107BD0000000000000000000000000001000000095 +:107BE0000000000000000000000000000000000293 +:107BF0000000000100000000400000000000000044 +:107C00000000000000000000000000000000000074 +:107C10000000000000020000000000000000000062 +:107C20000000000010000000000000000000000044 +:107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 -:107C500000000000000000000000000084000000A0 +:107C50000000000000000000000000000000000024 :107C60000000000000000000000000000000000014 :107C70000000000000000000000000000000000004 :107C800000000000000000000000000000000000F4 :107C900000000000000000000000000000000000E4 -:107CA0000000000000000000000000009000004004 +:107CA00000000000000000000000000000000000D4 :107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000004000000000000B0 +:107CC0000000000000002000000000000000000094 :107CD00000000000000000000000000000000000A4 -:107CE0000000000000000000000000000000000094 -:107CF0000002000000000000000000000000000082 -:107D00000200000000000000000000000000000071 +:107CE0000000000000000000000000000000200074 +:107CF0000200000000000000000000000000000082 +:107D00000000000000000000000000000000000073 :107D10000000000000000000000000000000000063 :107D20000000000000000000000000000000000053 :107D30000000000000000000000000000000000043 :107D40000000000000000000000000000000000033 :107D50000000000000000000000000000000000023 :107D60000000000000000000000000000000000013 -:107D700000000000000000004000000000000000C3 +:107D700000002000000000000000000000000000E3 :107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000000000E3 +:107D900000000000040000000000000000000000DF :107DA00000000000000000000000000000000000D3 :107DB00000000000000000000000000000000000C3 -:107DC000000000000000000000002100008400000E -:107DD0000000000000000000000000400000000063 +:107DC00000000000000000000000000000000000B3 +:107DD00000000000000000000000000000000000A3 :107DE0000000000000000000000000000000000093 -:107DF0000000000040004000000000000000000003 +:107DF0000000000000000000000000000000000083 :107E00000000000000000000000000000000000072 :107E10000000000000000000000000000000000062 :107E20000000000000000000000000000000000052 :107E30000000000000000000000000000000000042 :107E40000000000000000000000000000000000032 :107E50000000000000000000000000000000000022 -:107E60000000000000000004000400040004000002 +:107E6000000000000200000000000000040000000C :107E70000000000000000000000000000000000002 :107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 -:107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 +:107E900000020000000000000000000000000000E0 +:107EA00008000000000000000000000000000000CA +:107EB00000000000000000000000000000000008BA :107EC00000000000000000000000000000000000B2 -:107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000000000000000092 -:107EF00000840000000000000000000000000000FE -:107F00000000000000000000000000000000000071 +:107ED000000000000000080000000000000000009A +:107EE000000000000000000000000000000008008A +:107EF000000000000000030000000000000000007F +:107F00000000080008001000000000000000000051 :107F10000000000000000000000000000000000061 :107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 +:107F300000000000008200000000000000000000BF :107F40000000000000000000000000000000000031 :107F50000000000000000000000000000000000021 :107F60000000000000000000000000000000000011 @@ -75788,19 +75788,19 @@ :107F800000000000000000000000000000000000F1 :107F900000000000000000000000000000000000E1 :107FA00000000000000000000000000000000000D1 -:107FB00000000000000000000000000000000000C1 -:107FC0000000000000000000008802000000000027 -:107FD000000002900000000000000000000000000F -:107FE000000000000000000000000000000004008D +:107FB00000000000000000000000000000030000BE +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 :107FF0000000000000000000000000000000000081 :108000000000000000000000000000000000000070 :108010000000000000000000000000000000000060 -:10802000000000040000000000000000000000004C +:108020000000000000000000000000000000000050 :108030000000000000000000000000000000000040 -:108040000200000000000002000200110200000017 -:108050000000000000000000000000000000000818 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 :108060000000000000000000000000000000000010 -:1080700000000000000000000000000000000004FC +:108070000000000000000000000000000000000000 :1080800000000000000000000000000000000000F0 :1080900000000000000000000000000000000000E0 :1080A00000000000000000000000000000000000D0 @@ -75808,11 +75808,11 @@ :1080C00000000000000000000000000000000000B0 :1080D00000000000000000000000000000000000A0 :1080E0000000000000000000000000000000000090 -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F +:1080F0000000000000000000000000000000200060 +:10810000000000000000030000000000000000006C +:10811000200000000000000000000000000000003F +:10812000020000000000000000000000000000004D +:10813000020000000000000000000000000000003D :10814000000000000000000000000000000000002F :10815000000000000000000000000000000000001F :10816000000000000000000000000000000000000F @@ -75841,7 +75841,7 @@ :1082D000000000000000000000000000000000009E :1082E000000000000000000000000000000000008E :1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D +:108300000000000000000000000000000000000865 :10831000000000000000000000000000000000005D :10832000000000000000000000000000000000004D :10833000000000000000000000000000000000003D @@ -75882,7 +75882,7 @@ :10856000000000000000000000000000000000000B :1085700000000000000000000000000000000000FB :1085800000000000000000000000000000000000EB -:1085900000000000000000000000000000000000DB +:1085900000000000000007000000000000000000D4 :1085A00000000000000000000000000000000000CB :1085B00000000000000000000000000000000000BB :1085C00000000000000000000000000000000000AB @@ -75931,7 +75931,7 @@ :1088700000000000000000000000000000000000F8 :1088800000000000000000000000000000000000E8 :1088900000000000000000000000000000000000D8 -:1088A00000000000000000000000000000000000C8 +:1088A0000000000000A00000000000000000000028 :1088B00000000000000000000000000000000000B8 :1088C00000000000000000000000000000000000A8 :1088D0000000000000000000000000000000000098 @@ -75968,114 +75968,114 @@ :108AC00000000000000000000000000000000000A6 :108AD0000000000000000000000000000000000096 :108AE0000000000000000000000000000000000086 -:108AF0000000000000000000000000000004000072 -:108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B20000002000000000000000000000000000241 -:108B30000000000000000000000000000000000035 -:108B40000000000000000000000000000000000025 -:108B50000000000000000000000000000000000015 +:108AF0000000000000000000000000000000000076 +:108B0000000000000000200400000000000020041D +:108B100000000000000000000000000000008820AD +:108B20000000000000002000000000000000000025 +:108B30000001000000000000000000000000000034 +:108B40002000000000000000000000000000000005 +:108B5000000400000000000000040000000000000D :108B60000000000000000000000000000000000005 -:108B700000000002000000000000000000001000E3 -:108B80000002400000000000000000900002000011 -:108B9000000400040000000000000000000040028B -:108BA00000024000000000020000009000000000F1 -:108BB000210400000002000021001000400000001D -:108BC0004000000040004002400000001000000291 -:108BD0000002000000000000000000000000000093 -:108BE00000000000400200000002000240000000FF +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000010002000000000000000000000000C2 +:108BB00000020000000000000002000200000000AF +:108BC0000002000200900002000200020002000009 +:108BD0000002000200000000000000004000000051 +:108BE0000002000000000000000000000000000083 :108BF0000000000000000000000000000000000075 -:108C00000000020000000000000000000000000062 -:108C10000400040000000000020000000000040046 -:108C2000040004000200000000000000000000003A -:108C30000000000000000200000000000000000032 -:108C40000000000002000000000000000000000022 -:108C5000000000000800000000000000000000000C -:108C6000000004000400000000000000A00000005C -:108C700000000000080000000200000002000000E8 -:108C800000000400000000040000000000000400D8 +:108C00000000000000000000000000002000000044 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C400000000200000000800000000000000000A2 +:108C50000000000000000000000000000000000014 +:108C60000000000000000004000000000000000000 +:108C700000000000000000000000000000000000F4 +:108C80000000000000000000000000000000800064 :108C900000000000000000000000000000000000D4 -:108CA00002000200020041004100410041000000BA -:108CB00000000000020000000000000000000000B2 -:108CC0000400000004000400000000000000000098 -:108CD0000000000000000200000000000000000092 -:108CE0000000000000000000000000000000000084 +:108CA00000000000000000000000000000000000C4 +:108CB0000000000020000000000000000000000094 +:108CC000000005000000000000100000000002008D +:108CD0000000000000000000000000000000000094 +:108CE00000000088000020000000000000000000DC :108CF0000000000000000000000000000000000074 -:108D000000000000000088000000000000000000DB -:108D100000000000000090000000020000000000C1 -:108D20000000000000000000000000000000000043 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D2000000000000000000000080000000000003B :108D30000000000000000000000000000000000033 :108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 +:108D500000004000000000000000000000000000D3 :108D60000000000000000000000000000000000003 :108D700000000000000000000000000000000000F3 :108D800000000000000000000000000000000000E3 :108D900000000000000000000000000000000000D3 :108DA00000000000000000000000000000000000C3 -:108DB00000000000000000000000000000000000B3 +:108DB0000000000000000000004000000000000073 :108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 +:108DD0000000000011000000000000000000000082 :108DE0000000000000000000000000000000000083 :108DF0000000000000000000000000000000000073 -:108E00000000000000000000000000000000000062 -:108E10000000000000000000000000000000000052 -:108E200000000000004100040004000400000040B5 -:108E300000400000000000000000000000000000F2 +:108E000000000000000000000000A00000000000C2 +:108E100000000000000000000000820000000000D0 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 :108E40000000000000000000000000000000000022 -:108E50000000000000000000000000000000000012 -:108E600000000000000000000000000000100000F2 +:108E5000000000000000000000000000A000000072 +:108E60000000000000000000000000000000000002 :108E700000000000000000000000000000000000F2 :108E800000000000000000000000000000000000E2 :108E900000000000000000000000000000000000D2 -:108EA00000000000020000000000000000000000C0 -:108EB00000000000000000000000000000000000B2 +:108EA00000000000000000000000000000000000C2 +:108EB00000001100000000000000000000000000A1 :108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 +:108ED000000000001100000000000000000002007F +:108EE000000000000000000000000000000003007F :108EF0000000000000000000000000000000000072 :108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000000051 +:108F1000000000000000040000000000002000002D :108F20000000000000000000000000000000000041 :108F30000000000000000000000000000000000031 :108F40000000000000000000000000000000000021 :108F50000000000000000000000000000000000011 :108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000002000000000000DF -:108F900000000000000000002000000000000000B1 +:108F700000000000000000001000000000000000E1 +:108F800000000000000000000000000000000000E1 +:108F90000000000000000000800000000000000150 :108FA00000000000000000000000000000000000C1 :108FB00000000000000000000000000000000000B1 :108FC00000000000000000000000000000000000A1 :108FD0000000000000000000000000000000000091 :108FE0000000000000000000000000000000000081 :108FF0000000000000000000000000000000000071 -:109000000000000000000000000000000000000060 -:109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 +:109000000000000000000000000008000000000058 +:109010000000000000000000040000000005000047 +:10902000000000000021000000000000000000001F :109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 +:1090400000000000000000000000000000004000E0 +:109050004000400000000000000000000800000088 :109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 +:1090700000000000080000000000000000000000E8 :1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F +:109090000000000000000000000080000000000050 +:1090A00000000000000200000000000000000000BE +:1090B000000000000000000000000000000220008E +:1090C0000000008800020000000000001100000005 +:1090D000000000080000080021000000000000005F +:1090E000000000000000000000000000110000006F +:1090F000000000000000000000000000000021004F +:10910000000000004100000000000000000000001E :10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:10913000000000000000000000000000000000002F +:1091200000C00091000000010000000000000000ED +:1091300000008800000000000000000000000000A7 :10914000000000000000000000000000000000001F :10915000000000000000000000000000000000000F :1091600000000000000000000000000000000000FF :1091700000000000000000000000000000000000EF :1091800000000000000000000000000000000000DF :1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF +:1091A000000009910091000500110000000000007E :1091B00000000000000000000000000000000000AF :1091C000000000000000000000000000000000009F :1091D000000000000000000000000000000000008F @@ -76083,23 +76083,23 @@ :1091F000000000000000000000000000000000006F :10920000000000000000000000000000000000005E :10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E +:10922000800080800000000080008080000000003E +:1092300000000000000000000000008000000000AE :10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE +:109260000005008000000000000000000000000079 :1092700000000000000000000000000000000000EE :1092800000000000000000000000000000000000DE :1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E +:1092A00000008400C090000000008400C090000016 +:1092B000000000000000000000000000008200002C +:1092C000000000000000000000000000000000019D :1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E +:1092E000000000000004000000000000000000007A :1092F000000000000000000000000000000000006E :10930000000000000000000000000000000000005D :10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D +:10932000000000000090000000000000009000C05D :10933000000000000000000000000000000000002D :10934000000000000000000000000000000000001D :10935000000000000000000000000000000000000D @@ -76107,56 +76107,56 @@ :1093700000000000000000000000000000000000ED :1093800000000000000000000000000000000000DD :1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD +:1093A0000000000000000080000000000300418079 +:1093B000008000000000000000000000000000002D :1093C000000000000000000000000000000000009D :1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D :1093F000000000000000000000000000000000006D :10940000000000000000000000000000000000005C :10941000000000000000000000000000000000004C -:10942000000000000000000000000000000000003C +:109420000000000000090000000000008011800022 :10943000000000000000000000000000000000002C :10944000000000000000000000000000000000001C :10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC +:10946000000000000000800000000000000000007C :1094700000000000000000000000000000000000EC :1094800000000000000000000000000000000000DC :1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC +:1094A0000000000000000000000000000000C001FB +:1094B000200000000000000000000000000000008C :1094C000000000000000000000000000000000009C :1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C +:1094E0000000000000000000040088000000880068 :1094F000000000000000000000000000000000006C :10950000000000000000000000000000000000005B :10951000000000000000000000000000000000004B -:10952000000000000000000000000000000000003B -:10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B +:109520000000000000000000008100008200000038 +:109530000041004182000000000000000000000027 +:109540000000000007000000000000000000000014 :10955000000000000000000000000000000000000B :1095600000000000000000000000000000000000FB :1095700000000000000000000000000000000000EB :1095800000000000000000000000000000000000DB :1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB +:1095A000000000000000000000000000000000FFBC +:1095B00000FF000000FF000000FF000000000000AE :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B +:1095E000000000000000000000000000FFFFFFFF7F :1095F000000000000000000000000000000000006B :10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A -:10963000000000000000000000000000000000002A +:1096300000FF00FF000000FF000000FF000000002E :10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000000EA +:109660000000000000000000000000000000FFBE3D +:10967000FFFF0000000000000000000000000000EC :1096800000000000000000000000000000000000DA :1096900000000000000000000000000000000000CA :1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA +:1096B0000000FF000000FF000000FF0000000000AD :1096C000000000000000000000000000000000009A :1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A @@ -76164,7 +76164,7 @@ :109700000000000000000000000000000000000059 :109710000000000000000000000000000000000049 :109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 +:1097300000000000FF000000FF000000FF0000002C :109740000000000000000000000000000000000019 :109750000000000000000000000000000000000009 :1097600000000000000000000000000000000000F9 @@ -76172,9 +76172,9 @@ :1097800000000000000000000000000000000000D9 :1097900000000000000000000000000000000000C9 :1097A00000000000000000000000000000000000B9 -:1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 +:1097B0000000000000300C0012C003E303320C0D67 +:1097C0008AC000000000000000000000000000004F +:1097D00000A00000000000000000000000000000E9 :1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 @@ -76197,7 +76197,7 @@ :109910000000000000000000000000000000000047 :109920000000000000000000000000000000000037 :109930000000000000000000000000000000000027 -:109940000000000000000000000000000000000017 +:10994000500149D6000000000000000000000000A7 :109950000000000000000000000000000000000007 :1099600000000000000000000000000000000000F7 :1099700000000000000000000000000000000000E7 @@ -76205,188 +76205,188 @@ :1099900000000000000000000000000000000000C7 :1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 -:1099C0000000000000000000000000000000000097 +:1099C0000000000001C000000000000000000000D6 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 :1099F0000000000000000000000000000000000067 :109A00000000000000000000000000000000000056 :109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000234 -:109A30000000000000000000000000000000000026 -:109A40000008000000000000000500000002000007 -:109A50000000000000000000000000040000000002 -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 +:109A20000000000000000000000000000000000036 +:109A3000000000000000000000008800000000009E +:109A4000200020000000000088000000000000004E +:109A5000C000880000000000000088000000000036 +:109A60002004000000000000000040000002000090 +:109A700000002000000000000000000000000000C6 +:109A80000000200000000000000000042000000092 :109A900000000000000000000000000000000000C6 -:109AA00000000000000000000002000000000000B4 -:109AB0000000000010000000000000000000000096 -:109AC0000000009000000000000000000000000006 -:109AD0000000000000040000000000000000000280 -:109AE00000020002110200000090000000000000CF -:109AF00000000002004000004000000040000000A4 -:109B0000000200000000000000000002000400004D -:109B10001000000000000000000000000000000035 -:109B2000000000024000000240020040000000006F -:109B30000000000000000000040004000400040015 +:109AA00000004000000000000000008420000000D2 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000002000000000002000082 +:109AE00040004040000000000000000200000000B4 +:109AF0000000000000000002000000000002000062 +:109B0000000200000000000200000000000200004F +:109B1000000000000000000000000000000200043F +:109B200000020000000000020000004000200004CD +:109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 -:109B600000000000000000000200000001000000F2 -:109B700000000000000000000000000000000000E5 -:109B800000000000000000000400000000000200CF -:109B900000000000000000000800000000000000BD -:109BA00000000000000000000000000000000000B5 +:109B600000000000000000000000000000000000F5 +:109B700000000000000000000000002005000000C0 +:109B800000000000000000000200000000A004002F +:109B90000000000000000000000040000000000085 +:109BA0000000020001000000010000200000000091 :109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 -:109BD0000000000000000000000000000000000085 -:109BE000000000000000008200008000000008006B -:109BF0000000000000000000000000000000000065 -:109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 -:109C20000000000000000000000000000000000034 +:109BD0002000000000000000000000000000000065 +:109BE0000000400000000000000000000000000035 +:109BF00000000000000000000000000004018200DE +:109C00000000000000000000000000000000004113 +:109C10008000000000000000000000000000008440 +:109C200000000000800002000000020000010000AF :109C30000000000000000000000000000000000024 :109C40000000000000000000000000000000000014 :109C50000000000000000000000000000000000004 -:109C6000004000110000000000000000A000C00043 -:109C7000000088000000000000000000000000005C -:109C800000000000000000000000000000000000D4 -:109C900000000000040000000000000000000000C0 -:109CA00000000000000000000000000000000000B4 -:109CB00000000000000000000000000000000000A4 -:109CC0000000000000400000000000000000000054 -:109CD00000000082000000000000000000004000C2 -:109CE00040004000400000000000000000000000B4 +:109C600000000000000000000000000000000000F4 +:109C70000000C00000000000000000000000000024 +:109C80000021000000210000000000000000000092 +:109C900000090011000300000000000000000000A7 +:109CA000000500100000000000000000000000009F +:109CB0000020000000000000000000000000000084 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 :109D00000000000000000000000000000000000053 :109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 -:109D30000000000000000000000000000000000023 -:109D40000000000000000000000000000000000013 -:109D50000000000000000000000000000000000003 -:109D600000000004000000000000000000000000EF -:109D700000000000000000000000000000000000E3 -:109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 -:109DA00000000008000000000000000000000000AB -:109DB00000000000000000000000000000000000A3 +:109D20000000000000010000000000000000000032 +:109D30000000000100000000000000000000000022 +:109D400000000000C000000000000000000008004B +:109D50008800000000000400000000000000000077 +:109D60008200000000000000000000000800A000C9 +:109D700000400040004000400000000000000000E3 +:109D80000800000000000000010000000000C0000A +:109D90000009040000000000A08000008400820090 +:109DA0000000000000000000820001000000002010 +:109DB00000200080000000000400000000000000FF :109DC0000000000000000000000000000000000093 -:109DD0000000000000000000000000000000000083 +:109DD0000000000021000000000000000000000062 :109DE0000000000000000000000000000000000073 -:109DF0000000000000000000000000000000000063 -:109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 -:109E40000000000000000000000000000000000012 -:109E500000000000000000000000000000000040C2 -:109E60000000000000009000900090000000100032 -:109E7000C00000000000A000000000000000000082 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 -:109EC0000000000000000000000002000000000090 -:109ED00000000000000000000000000000A00000E2 -:109EE0000000000000000000000000000000000072 +:109DF00000000001000100010001000000000084DB +:109E000000000000000000840000040000000000CA +:109E1000000000008000000000000020000000841E +:109E2000000000000300000000000000040000002B +:109E300000A10001002000000000800000000000E0 +:109E4000000008000000000000000000000000000A +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000002000000F0 +:109E700000000800000000000000000000000000DA +:109E80000005820082000000C000040008000000FD +:109E9000C000000082000000000000000000000080 +:109EA0000005081000000000C000080000000000CD +:109EB000C000080000000000000000048200000054 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000000000000000000082 +:109EE0000000000000000000000000200000000052 :109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 -:109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 +:109F000000000000000000000000000080000000D1 +:109F10000004000000040000000000000000000039 +:109F200000000000000100000000000080000000B0 :109F30000000000000000000000000000000000021 :109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000000001 -:109F600000000000000000000000000000000000F1 -:109F7000C000C00000000000000000000000000061 -:109F800000000000000000000000000000000000D1 -:109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000000081 -:109FE0000000000000000000000020000000200031 -:109FF000400400000000000000000000000000001D -:10A00000000000004100000000000000000000000F -:10A010000000000000000000000000000000000040 +:109F500000000800000000000000000000000000F9 +:109F600000000000000000000000000000000800E9 +:109F700088000000000000000100010008800100CE +:109F8000000000000009A000002000000008000000 +:109F90000000200000050000020000000021000079 +:109FA000000000000009000000020000002108007D +:109FB000000000000105010000000220002104084B +:109FC000820000000000000000000000000000000F +:109FD0000000000000000000080000000000000079 +:109FE000000000000000000003000000000000006E +:109FF00000000000000000000000040004084120F0 +:10A00000040000000000000000000000000000004C +:10A0100000000000000000000000000041000000FF :10A020000000000000000000000000000000000030 -:10A030000000000000000000000000000000000020 -:10A040000000000000000000000000000000000010 +:10A03000800003000000040002880000000100000E +:10A040008000000000000000000000000000000090 :10A050000000000000000000000000000000000000 :10A0600000000000000000000000000000000000F0 -:10A0700000000000000000000000000002000000DE -:10A080000000900000000000000000000000000040 -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 +:10A0700000000000000000000000000000C00840D8 +:10A08000008810020000000000000000000001C075 +:10A09000904000028802000000000000000000C0A4 +:10A0A00008400002109000000000000000000000C6 +:10A0B00000000000000000C0204000048890000064 :10A0C0000000000000000000000000000000000090 :10A0D0000000000000000000000000000000000080 :10A0E0000000000000000000000000000000000070 -:10A0F00000000000000000000000000000008000E0 -:10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F +:10A0F00000000000000000000000000000000580DB +:10A1000080800000800000000000000000000000CF +:10A1100041800080000000000000000000000000FE +:10A12000058080800000800000000000000000002A +:10A13000000000000000000003800080008000009C +:10A140000800000000000000000000000000000007 :10A1500000000000000000000000000000000000FF :10A1600000000000000000000000000000000000EF :10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F +:10A180008000800800418080000000000000000086 +:10A1900000008000801000418000000000000000EE +:10A1A0000000800080080041808000000000000066 +:10A1B000000000000000000000008000801000414E +:10A1C000800000000000000000000000000000000F :10A1D000000000000000000000000000000000007F :10A1E000000000000000000000000000000000006F :10A1F000000000000000000000000000000000005F -:10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E +:10A200000000400040C10201C00800000000000042 +:10A2100000000000400040000201C0C0000000003B +:10A2200000000000400040018801C008000000005C +:10A23000000000000000000000000000400040415D +:10A240008801C082000000A000000084000000001F :10A2500000000000000000000000000000000000FE :10A2600000000000000000000000000000000000EE :10A2700000000000000000000000000000000000DE -:10A280000000000000880008009000C000000000EE -:10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E +:10A280000000000088900082828401C0000100006C +:10A2900000000000000010400082C08401C00000E7 +:10A2A00000000000000088400082C08401C000005F +:10A2B0000000000000000000000000000000090293 +:10A2C0000082408401C00000000084000000000003 :10A2D000000000000000000000000000000000007E :10A2E000000000000000000000000000000000006E :10A2F000000000000000000000000000000000005E -:10A3000000000000000000000000000000800000CD -:10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D +:10A30000000000000000400000800080418000014B +:10A31000000000000000000000800080808041807C +:10A32000000000000000000000800080808041806C :10A33000000000000000000000000000000000001D -:10A34000000000000000000000000000000000000D +:10A3400090800080008041800300000080000200B7 :10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED :10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000000CD -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D +:10A3800000000000000000008000801080A000009D +:10A39000000100000000000000008010800980859E +:10A3A0000080000000000000000080008002808229 +:10A3B000800000000000000000000000000000001D +:10A3C000000080098009808980800000000800006A :10A3D000000000000000000000000000000000007D :10A3E000000000000000000000000000000000006D :10A3F000000000000000000000000000000000005D -:10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC +:10A4000000000000000000000000C0008200841175 +:10A4100002C000010000000000000000C000400079 +:10A42000844002020000000000000000C000400064 +:10A4300084111090000000000000000000000000E7 +:10A4400000000000C00082008440021000000000F4 +:10A45000000000900000000000000000000000006C :10A4600000000000000000000000000000000000EC :10A4700000000000000000000000000000000000DC :10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C +:10A49000400000420000000000000000000000003A +:10A4A000000080006042000000000000000000008A +:10A4B000000040000042000000000000000000001A +:10A4C0000000000000000000000080000042004189 +:10A4D0000000070000000000000000000000000075 :10A4E000000000000000000000000000000000006C :10A4F000000000000000000000000000000000005C :10A50000000000000000000000000000000000004B -:10A5100000003C007C600000000000000000000023 +:10A51000000000000000000000000000000000003B :10A52000000000000000000000000000000000002B :10A53000000000000000000000000000000000001B :10A54000000000000000000000000000000000000B @@ -76394,7 +76394,7 @@ :10A5600000000000000000000000000000000000EB :10A5700000000000000000000000000000000000DB :10A5800000000000000000000000000000000000CB -:10A59000000000007C603C000000000000000000A3 +:10A5900000000000000000000000000000000000BB :10A5A00000000000000000000000000000000000AB :10A5B000000000000000000000000000000000009B :10A5C000000000000000000000000000000000008B @@ -76402,11 +76402,11 @@ :10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B :10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000000FA +:10A610000000430840000084218600000000000084 +:10A6200000000000410840000084210600000000F6 +:10A6300000000000410840000084210600000000E6 +:10A64000000000000000000000000000430840007F +:10A6500000842186000000000000000000000000CF :10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA :10A6800000000000000000000000000000000000CA @@ -76426,12 +76426,12 @@ :10A7600000000000000000000000000000000000E9 :10A7700000000000000000000000000000000000D9 :10A7800000000000000000000000000000000000C9 -:10A790000000000000000000000000000090000029 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 +:10A790000000000000000000100020080040000839 +:10A7A00000000000000000000000000000080000A1 +:10A7B0000008000000000000000000000008000089 +:10A7C0000008000000000000000000000000000081 +:10A7D0000000100020080040000805000A280500BD +:10A7E00000A00000000000000000000000000000C9 :10A7F0000000000000000000000000000000000059 :10A800000000000000000000000000000000000048 :10A810000000000000000000000000000000000038 @@ -76464,437 +76464,437 @@ :10A9C0000000000000000000000000000000000087 :10A9D0000000000000000000000000000000000077 :10A9E0000000000000000000000000000000000067 -:10A9F000000000000000000400040000000000004F -:10AA0000000000800000A00800000004000000001A -:10AA1000000000000000000000040003000000002F -:10AA20000000000000000000000000021000100004 -:10AA30000000000000000000000000040000000012 -:10AA40000000000000000000000000000000000006 -:10AA500000000000000000001000000000000000E6 -:10AA600000000000000000000000000040000000A6 -:10AA700000000000000000000000000000020002D2 -:10AA80000002000000020000400100004000000041 -:10AA9000000000840002000000000002000200022A -:10AAA00000000000400000024000000200004002E0 -:10AAB000419040C0000000000000000000020000C3 -:10AAC0000000000000000000009000900002400024 -:10AAD00000000000000040000000800200040000B0 -:10AAE0000000000000020000000000000000000064 -:10AAF0000000000000000000000000000400000052 -:10AB0000000000000000020000000400000000003F -:10AB100000000000000004000200000082000100AC -:10AB20000000000000000000000000000400000021 -:10AB3000020002000000000000000000000004000D -:10AB40000000000000008800000000000000040079 -:10AB5000000000000000000002000200004004406D -:10AB6000020002000040004002000200024000001B -:10AB700000000000000000000000000000080000CD -:10AB8000000004000000040000000000410000007C -:10AB900000000000000000000000000000040000B1 -:10ABA000400000000000000000000400040000005D -:10ABB0000000000000000000000000000000000095 -:10ABC00000000000000000000000040000900400ED -:10ABD0000000200020000000000080008000000134 -:10ABE0000001800080000001000180008000000161 +:10A9F000200000000000000420040000000000000F +:10AA00000000000000000000200000000000000026 +:10AA100020040000000000002004000000000000EE +:10AA20000000000000000000020000010000000023 +:10AA300000002000000000000000040400000000EE +:10AA400000000000000000000000000000004000C6 +:10AA500000000400000000000000000400000000EE +:10AA600000000004000000000000000000000000E2 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA90000000000000000000000000000002004074 +:10AAA0000000000000000000000080000000000026 +:10AAB0000000000000000000000000020000000094 +:10AAC00000000090000240000000000200000000B2 +:10AAD0000000000020000002000000020000000052 +:10AAE0000000000200000000000040000000000024 +:10AAF00000000000000000000000000000800000D6 +:10AB00000000000000000000000000000000200025 +:10AB1000200000040004000000000000000000000D +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000080000000000000000000000000000085 +:10AB500000000000000000000400040000200020AD +:10AB600000000000000000000000000000090000DC +:10AB700000080000000000000000000000000004C9 +:10AB800000000000000000000000000000000000C5 +:10AB900080088000000100010000000000000000AB +:10ABA00000000000000000000000000000000000A5 +:10ABB000000000080000000000000000000000008D +:10ABC0000000000200000000000000000000000083 +:10ABD000000000100000000000088000800000015C +:10ABE0000001008800000000008400000000000058 :10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000001000000034 +:10AC00000000000000000000000000000000000044 :10AC10000000000000000000000000000000000034 -:10AC2000000000000000000000090000900000008B -:10AC300090000000000000008800000000000000FC -:10AC40000000000000000000000000000000000004 +:10AC200000000000000000000000002000200020C4 +:10AC300000200000000000000000000000000000F4 +:10AC40000003000000004000000800004000000079 :10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000210021A2 -:10AC700000210000000000000000000000000000B3 +:10AC600000000000000000000000000000410000A3 +:10AC700000000000000000000000000000000000D4 :10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000090000000000000000000000000000004 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 +:10AC90004100000000000000000000000000000073 +:10ACA00000000000000000000000000000010001A2 +:10ACB000000100010000000000C0000000000000D2 +:10ACC000000000000000000800000001000000007B +:10ACD0000300000000000000000000000000000071 +:10ACE0000300000000000000000000000000000061 :10ACF0000000000000000000000000000000000054 :10AD00000000000000000000000000000000000043 -:10AD100000000000000000000000000000002140D2 -:10AD20000085012000200000000400880000008051 -:10AD3000008000800080000000A000A000A0902003 -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD6000100000050000000800000021A0000021E4 -:10AD700010000000A00000800000000000000000A3 -:10AD800000000000000002000000000000000000C1 -:10AD9000000000000200000000840000000000002D -:10ADA0001000002002010001000000400009000026 -:10ADB00000400040004000400000004000400040D3 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE00000008000000000000000000000000000E3 -:10ADF0000000800000000000004000000000000093 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE2000000000040080008000800000000000405E -:10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE6000000000000000100000044000004000004E -:10AE7000A040004000001000000020000000000082 +:10AD10000000000000000000000000000000000033 +:10AD2000000000000000000000000000000001041E +:10AD3000000400040080000000000000002100006A +:10AD40000000C00000000000000000000000000043 +:10AD50000000C00000000000000000000000000033 +:10AD600000000000000900000000000900000000D1 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000008000000000000AB +:10ADA00000000000000000000000000000000000A3 +:10ADB0000241110100010004000000000000000039 +:10ADC0000000000000000082000000000000000001 +:10ADD00040080000002000000000000800080008F3 +:10ADE0000000000000000000000040000000000023 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000009000039 +:10AE10000800000000000000000000090000000021 +:10AE2000000000050000000000000000000000001D +:10AE30000000000000000008098000000000000081 +:10AE4000C000000000000000000008000000000238 +:10AE5000C0000000000000000180000000000000B1 +:10AE60000000A00000000000000000000000000042 +:10AE700001800000000000000000900000000000C1 :10AE800000000000000000000000000000000000C2 :10AE900000000000000000000000000000000000B2 -:10AEA0000000000000010004000400040000000095 -:10AEB000000111000000040808000000000000006C -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE00000000000000000008000000000000001E1 -:10AEF0000000000100010000800000008000000050 +:10AEA00000000000000000000000000000000000A2 +:10AEB00000000000000000C00001081000000000B9 +:10AEC00000000000000009840000000000000000F5 +:10AED000000100000000000000C008100000000099 +:10AEE000000000000800000000000000000011C089 +:10AEF0000000081021000000000000000000000019 :10AF00000000000000000000000000000000000041 :10AF10000000000000000000000000000000000031 -:10AF20000000000000000020000000000000018080 -:10AF30000102008801000100010000800080000083 -:10AF40000000000000000100000000000000000000 -:10AF500000000000000000000000000000000000F1 -:10AF6000000000000000000000000000840020003D -:10AF700000000208C0000000000401000000000002 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA0000000008200000000000120001100028269 -:10AFB0000240020120410200020002000040004065 -:10AFC000000000000000000002000000000000007F +:10AF20000000000000000021002100210021000895 +:10AF3000000000000000010000000000010000000F +:10AF400000000000002100080000000000000000D8 +:10AF500000080000000000000000000000000800E1 +:10AF600000000000000000000000000000000800D9 +:10AF70000000000500000005000000410000004145 +:10AF8000000000000000000000000000008200003F +:10AF900000000000008800000000008200000000A7 +:10AFA000000000020088050000840000000000008E +:10AFB000000000000000000040000000000002004F +:10AFC000000000000000050000000000000000007C :10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF000A0000000800000A000000001020000008E -:10B000000000000000000000000000000000000040 -:10B01000000000000000000000000101000000002E -:10B02000000100000000000000000000000000001F -:10B03000000000C100000000008800C00000000007 -:10B040000000000000C00000000000200000000020 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000001C100001E -:10B070001001880002C000000000000400C10000B0 -:10B080001001880000000000000000000000000027 -:10B09000000000000000000000000000104100213E -:10B0A0000020001000000000000000000000000070 -:10B0B0000900000000C10020002100000080000005 -:10B0C0000000000000000080000000000000000000 -:10B0D0000000000000000000000000000000000070 -:10B0E000000000000000000000000000000011C18E -:10B0F000110282098008808000000000008000C1E9 -:10B100001102820980110000000000000000000010 +:10AFE000110000000000000000000000000041000F +:10AFF00000001100000000000900400000000000F7 +:10B00000042000000000000000000000000000001C +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000C1A089000125 +:10B04000A008000000000000000000000000000058 +:10B0500000000000000100000001000000000000EE +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A000000000000000000011000000000000008F +:10B0B00000000000000000000000000000C10008C7 +:10B0C00002400080000000000000000000000000BE +:10B0D000000000000000004100000010000400001B +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F :10B11000000000000000000000000000000000002F -:10B1200000000000000000000000000000000021FE -:10B1300000C00408418000000000000080000040C2 -:10B1400000000000800000000000001000008000EF +:10B12000000000000000000900000009000000000D +:10B1300000000000000000000000000000000011FE +:10B14000000000210080000000000000000000005E :10B1500000000000000000000000000000000000EF :10B1600000000000000000000000000000000000DF -:10B17000118002218200C1088000000000008000D0 -:10B18000088008008200C1110000000000000000DB +:10B1700000000080000000800000000000000000CF +:10B1800000000000000000000000000000000000BF :10B1900000000000000000000000000000000000AF :10B1A000000000000000000000000000000000009F -:10B1B00000010041010101C0000010000000C000BA -:10B1C000000000000000C0000000000000010000BE -:10B1D000C0000000000000000000000000000000AF +:10B1B000000000000000000000000000000000008F +:10B1C00000000000000100C00000000000000000BE +:10B1D000000000000000000000000000000000006F :10B1E000000000000000000000000000000000005F -:10B1F0000000008800009000C1000800000000006E -:10B20000C000018801009000C100000000000000A3 +:10B1F000000000000008000000080000000000003F +:10B20000000000000000000000000000000000003E :10B21000000000000000000000000000000000002E -:10B22000000000000000010000000000000000001D -:10B23000000000008800A00001000000000000885D -:10B2400000C088000000008800C00000000000204E -:10B25000000000C00000000000000000000000002E +:10B220000000000000000000000000000800000016 +:10B23000000000000000000000000000000000000E +:10B24000000000A0A0888900C1C00000000000002C +:10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE -:10B270000000000020009000200000C1000000003D -:10B28000000000C020009000000000C1000000008D -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000080008000000000000008E -:10B2B0000000000000000000800008000000000006 -:10B2C000000000800000000000000080000000007E -:10B2D00000000000008000000000000000000000EE +:10B2700000000000000000000400000000000000CA +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000080000000000A6 +:10B2A000000000000000000000000000000080001E +:10B2B0000000090000000000000000000000000085 +:10B2C0000000000041008000A00008800000000095 +:10B2D000000000000000000000000000000000006E :10B2E000000000000000000000000000000000005E -:10B2F00000000000000080028902410800C1000037 -:10B3000000000000008080028502050500C10000E9 +:10B2F000000000000000020000000000000000004C +:10B30000000000000000000000000000000000003D :10B31000000000000000000000000000000000002D :10B32000000000000000000000000000000000001D -:10B33000000000000000800000090000000821005B -:10B34000000000000000800000000000000000007D -:10B35000800000000000000000000000000000006D -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000004182020941000911A4 -:10B380008000000000000000C100020085000911DB +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000041000000000000BC +:10B3500000000000000000000000000000000000ED +:10B3600021000000000000000000000000000000BC +:10B3700000000000000000000000000300000000CA +:10B3800000000000000000000000000000000000BD :10B3900000000000000000000000000000000000AD :10B3A000000000000000000000000000000000009D -:10B3B0000000000000000000C0A00000A000080085 -:10B3C0000100000000009000C00000889000000014 -:10B3D0000000C0000090000000000000000000001D -:10B3E000000000000000000000000000000000005D -:10B3F0000000000000000000000001C0000100008B -:10B400000100C000000000004000C10200008800F0 -:10B41000010000000000000000000000000000002B +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000001000000007C +:10B3D000000000000000000000000000000000006D +:10B3E000000001000000000000000000000000005C +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B4100000000000000000000000000000E000004C :10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000180008B -:10B4400000210000000000000000000000000000DB -:10B4500000000000000000000000000000000000EC +:10B43000000000000001000000000000000000000B +:10B4400000000000000000000000000000421200A8 +:10B450004221000000000000000000000000000089 :10B4600000000000000000000000000000000000DC -:10B47000000000000000000000000000840000E068 -:10B48000000081000000000000000000600000E0FB +:10B4700000000000000000000000000000000000CC +:10B48000800000000000000000000000000000003C :10B4900000000000000000000000000000000000AC :10B4A000000000000000000000000000000000009C -:10B4B00000000000000000000000000030303C3CB4 -:10B4C000000000003C3C3C3C000000FF0000F0F0AD -:10B4D000000000FF00000000FFFF0000F0F000008F +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D0000F0F0C0C00000000000000000000000036 :10B4E000000000000000000000000000000000005C -:10B4F0000000000000000000000000000000FFFF4E -:10B50000FFFF0000FFFF00003C3C0000AAAA000073 -:10B51000F0F00000FFFF000000000000000000004D +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B :10B52000000000000000000000000000000000001B -:10B5300000000000000000000000000000003030AB -:10B540000000000000003C3C3C3C000000FF00000C -:10B55000F0F0000000FF0000000000000000F0F02C +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B55000000000000C0C00000000000000000000D3 :10B5600000000000000000000000000000000000DB :10B5700000000000000000000000000000000000CB -:10B58000000000000000000000003C3C0000AAAAEF -:10B590000000F0F0000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB :10B5A000000000000000000000000000000000009B :10B5B000000000000000000000000000000000008B -:10B5C00000000000000000003C3C00000F0F0000E5 -:10B5D000FFFF00005555000000003C3C0000AAAAF7 -:10B5E000FFFF00000000000000000000000000005D +:10B5C000000000000000000000000000000000007B +:10B5D0000055003C000000000000000000000000DA +:10B5E000000000000000000000000000000000005B :10B5F000000000000000000000000000000000004B -:10B600000000FFFF0000FF0000003C3C00003C3C4D -:10B610000000FFFF0000FF0000000000000000002D +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A :10B62000000000000000000000000000000000001A :10B63000000000000000000000000000000000000A -:10B64000000000000000000000003C3C00000F0F64 -:10B650000000000000005555000000003C3C0000C8 -:10B66000AAAAFFFF00000000000000000000000088 +:10B6400000000000000000000000000000000000FA +:10B6500000000055003C0000000000000000000059 +:10B6600000000000000000000000000000000000DA :10B6700000000000000000000000000000000000CA -:10B680000000000000000000FF0000003C3C000043 -:10B690003C3C000000000000FF0000000000000033 -:10B6A000000000000000000000000000000000009A -:10B6B0000000000000610006000D00000000000016 -:10B6C00000000000A0610A0F050500A0406380068D -:10B6D000002D9202408280000020920200004082F1 -:10B6E0008000002082020000000000000000000036 -:10B6F000000000000000000000000000000000004A -:10B700000000000000004002800180209202408280 -:10B71000800000209202408280018020920200007E +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A0000000000000610006000D00000000000026 +:10B6B0000000000000000000000000000061000722 +:10B6C000000D00000000000000000000000000006D +:10B6D000000000000561500F009D00A00000000068 +:10B6E00000000000000000000000000000000061F9 +:10B6F0000006000D00000000000000000000000037 +:10B7000000000000000005000A08050000A000007D +:10B710000000000000000000000000000000000029 :10B720000000000000000000000000000000000019 :10B730000000000000000000000000000000000009 :10B7400000000000000000000000000000000000F9 -:10B75000FFFF0000000000000000000000000000EB +:10B7500000000000000000000000000000000000E9 :10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B78000000000000000000030005000A080F0C069 -:10B79000000000000000000030005000A080F0C059 +:10B770000000FFFF000000000000000000000000CB +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 :10B7A0000000000000000000000000000000000099 :10B7B0000000000000000000000000000000000089 :10B7C0000000000000000000000000000000000079 -:10B7D0000000FFFF0000000000000000000000006B +:10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000049 -:10B80000000000000000000000003C005500A08087 -:10B81000000000000000000000003C005500A08077 +:10B7F00000000000FFFF000000000000000000004B +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 :10B820000000000000000000000000000000000018 -:10B83000000000000000000000002F0F1F0F00009C -:10B84000000000000000000000000000000000AA4E -:10B85000AAAA0F000FFF0000000000000000000077 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000F00FF0000DA :10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 -:10B880000000000000000000000000000300410074 -:10B89000008A00CF0000000000000000410003000B -:10B8A000000A000C00000000000000000000000082 -:10B8B000000000000000000000000000280014004C +:10B870000000000030303F3F0000000000000000EA +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 :10B8C0000000000000000000000000000000000078 -:10B8D00000AA00000F000FFF0000000000000000A1 +:10B8D000000000000000000000000000000F000059 :10B8E0000000000000000000000000000000000058 -:10B8F0000000000000000000000000000000000048 -:10B9000000000000000000000000000000000F0028 -:10B910005500008A000000000000000000005500F3 -:10B920000F0000AA003C0000000000000000000022 -:10B9300000000000000000008880000000000000FF -:10B940000008A000000800008800000000000000BF -:10B9500000004000000000002040000001020180C3 -:10B960000000012000200003000020000000000073 -:10B9700010000000000000000000000000000000B7 -:10B980000000000000000000000020000000000097 -:10B9900020000000000400000000000088000000FB -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000020000000000080000000479 -:10B9C0000000000000000000000010000000000067 -:10B9D00000820000000000000000000100002000C4 -:10B9E000044000000401000100000000000000000D -:10B9F0000000000200000040000000000000000005 -:10BA000000000000000000000000000000004000F6 -:10BA10000000400000024000000040000000000064 +:10B8F00000000000000030303F3F0000000000006A +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B9200000000000000000000000000020000000F7 +:10B9300000000000200000000000000000000000E7 +:10B940000000000020800280210021800380000090 +:10B9500000000000200000000000000000000000C7 +:10B9600000000000200200000400000000040000AD +:10B9700000000000000000000000000000000000C7 +:10B980000100000000002000200000000000000076 +:10B9900000000000000400000000000000000000A3 +:10B9A0000000000000000004000000000000000093 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000020C0048200A04084109D +:10B9D0000000000000000400000000000000000063 +:10B9E0000000000200000000000000000000000055 +:10B9F0000000000000000000000000000000000047 +:10BA00000090100000000000000200000000400054 +:10BA100000000000000040020000000000000000E4 :10BA20000000000000000000000000000000000016 -:10BA30000000020000000000000000000000000004 -:10BA400084000000100000000000000000008400DE -:10BA500002000000000000000000040002000000DE -:10BA6000212003200580032003A000000000000027 -:10BA7000000000000000880000000000000000003E -:10BA800000000000004000400040004002000200B2 -:10BA90000040A04000400040004000400040004006 -:10BAA00002400005020002000040004000000000CB -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000008000800066 -:10BAE0000000840184018240840184410000000040 -:10BAF0000000000000000000000004000000000042 -:10BB000000000000000000010001000100018000B1 -:10BB1000800000010001000500010001000100019A -:10BB20000801000100008000800000010001000009 +:10BA30000000000000000000000000800080008086 +:10BA40000080000000000000010000000000001065 +:10BA500000000100000000000000000000000000E5 +:10BA6000000008200020002000200000000000004E +:10BA700000000000000000000000000001000100C4 +:10BA800010000000000000000100010000000000A4 +:10BA9000000000000000000000000000080000009E +:10BAA000000000100100010001090000000000007A +:10BAB000000000000000000000000000000400047E +:10BAC000000400040000000000000400000000006A +:10BAD000000100000800000000000000000000005D +:10BAE0000000000000010001000100010000000052 +:10BAF0000000000000000000000000000000400006 +:10BB000040008000000004000000400040000008E9 +:10BB10000000000000000000000000000000801095 +:10BB200000000010000004000400040000000000F9 :10BB30000000000000000000000000000000000005 -:10BB400000000000400000000000000000000000B5 -:10BB50000000000000002000200020002000000065 -:10BB6000000000000000008001000800010000004B -:10BB700000000000000000000008000000000000BD -:10BB800000000000000000000000000000000000B5 -:10BB90000000000000000040000000000021000044 -:10BBA0000000000000000040000000000004000051 +:10BB400000000000000000000000000001000000F4 +:10BB500000000000000000000000000000000041A4 +:10BB600000000000000000000003010000000000D1 +:10BB700000000000000000000000000000000000C5 +:10BB800000008200000082000041004100410000EE +:10BB900000000000000000000000000000000000A5 +:10BBA00000000000000000008200000040000900CA :10BBB0000000000000000000000000000000000085 -:10BBC00000000000030080000000000000000000F2 -:10BBD00000000000000000008000A0008000800045 -:10BBE000000000000000000000200200000004002F +:10BBC0000000000000000000000000000000040071 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000200000053 :10BBF0000000000000000000000000000000000045 :10BC00000000000000000000000000000000000034 -:10BC10000000000000000300000100000000000020 -:10BC20000000000000000000000100000000000013 -:10BC300000000800080008000000000000000000EC -:10BC400000000000100000000000000000000000E4 -:10BC5000000000000041000000000000008900001A -:10BC600000009000020000000000000084000000BE -:10BC700000000000000000000000000000000000C4 -:10BC80000000000000000000A00000000000000014 -:10BC90000000000000000000820000000000000022 -:10BCA00000090000000000210000880000210000C1 -:10BCB0000021000000000000000000000000000063 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000110251 -:10BCE00000000000000080000000000000C000C054 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 -:10BD100000000000000000000000000041000000E2 -:10BD200000000000000021000000000000C0000032 -:10BD300000000010000000000000000000000000F3 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000200000000000000000000E1 -:10BD600000001008000000804000A00200800021B8 -:10BD7000008001C100800000000000000000000001 -:10BD8000000000000000000000000800A00000000B -:10BD9000C000100020002000000000008200000011 -:10BDA00010001000200020000000000082000000B1 -:10BDB0001000100020002000000000000000000023 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000040000802000000000000000019 -:10BDE0000084000000850000002080000001002089 -:10BDF000000000200220214000002100030000007C -:10BE00000000000000000000000000000000000032 -:10BE100000000000800080008000000000000000A2 -:10BE2000000080008000800080000084000000008E -:10BE300000008000804080008000000000000000C2 -:10BE400000000000000000000000000000000000F2 -:10BE5000000000000000000000000000000088005A -:10BE60000000890000001000010000020000020232 -:10BE70002000020000410005001100000000000049 -:10BE800000090000000000000800000000000000A1 -:10BE90000000000010000000000000000040004012 -:10BEA00000400000200000000000000000400040B2 -:10BEB0000040000000090000000000000000000039 +:10BC10000000000000000000000000000000000024 +:10BC2000000000000000000000000900000000000B +:10BC3000040000000000C000000000000000000040 +:10BC40000000200020008200A00000000000000092 +:10BC500000000000000000008880000000110000CB +:10BC6000000500000000000000000180008000804E +:10BC700000800000080008000800080000210021E2 +:10BC8000002100410000000000000000100004003E +:10BC90000000000000000000000000001000000094 +:10BCA000C0000000000000000000000000000000D4 +:10BCB000000000000000000000000800000000007C +:10BCC0000000000080008000000000000000000074 +:10BCD00000000000000000000000000400000090D0 +:10BCE000000000000000000000000000100400043C +:10BCF0000004110400000000400200C00000000029 +:10BD000000000000000000080000000800008000A3 +:10BD10000000000000000000000000000000000023 +:10BD2000000000000000000000000082000000C0D1 +:10BD30000000000000000000000000000000000003 +:10BD40000000000000000000880082800000C000A9 +:10BD500000000400A0002000008020000800000077 +:10BD60000021000000000000000000008200000030 +:10BD700000000004000000000008000000000000B7 +:10BD800000000000000000000000000000000000B3 +:10BD90000000000000000000000000000000A00003 +:10BDA0000000000000000000A000001002000200DF +:10BDB0000000004000000000000000000000000043 +:10BDC000000000000000000000000000000400006F +:10BDD00000000000800000008000000480000000DF +:10BDE0000000000000000000000000000000000053 +:10BDF00000840000000400000000000000000000BB +:10BE00000000000000000000080000000900000021 +:10BE10000000000000000000000000000000000022 +:10BE20000000001000000000000000000000800082 +:10BE3000800000000001000000C0000000000000C1 +:10BE4000000000000000000088000000000000006A +:10BE500020000041000088000000000000000000F9 +:10BE600000100000000000000000000000000000C2 +:10BE70000041000000000000000000000002000976 +:10BE80000041000000000000000000000000000071 +:10BE90000000000000000000000040000000000062 +:10BEA0000000000082008200000000000100090084 +:10BEB0000100010000000000000000100000000070 :10BEC0000000000000000000000000000000000072 -:10BED0000000000000C000000000000000000000A2 -:10BEE000000000824000008821001000000000884F -:10BEF00080008000800000000000000000000000C2 -:10BF00000000000000000000000000000000000031 -:10BF100000000000000080000000000000000001A0 -:10BF2000000100010000000000000000000000010E -:10BF300000010001090000000000000000000000F6 -:10BF400000000000000000000000000000000000F1 -:10BF500000000800000000000000000000000000D9 -:10BF60000000000000000001A000000100000040EF -:10BF70001090A008C01010C00090000400A00000A5 +:10BED00000008900000000000000000000000000D9 +:10BEE0000000090100000090000041000000000077 +:10BEF0000000000000000000110011000000000020 +:10BF0000000000000000000000100000000003001E +:10BF100003C00300000000000000110080000000CA +:10BF20000000000000000000008800820000040003 +:10BF300084000400040000900000030041010000A0 +:10BF400000000000000000000000000000000100F0 +:10BF50002000000000000000000000000000A1C060 +:10BF600000400040204000000000000000000000F1 +:10BF700000000000000000000000000000000000C1 :10BF800000000000000000000000000000000000B1 -:10BF9000000000000000000001C1000001010000DD -:10BFA00000C000000000000001C10000010100000D -:10BFB00000C000000000000201C1000001010000FB +:10BF9000000100000000000100000000000000009F +:10BFA0000000000000000000000000000000000091 +:10BFB00000C04090008400A00000000000000000CD :10BFC0000000000000000000000000000000000071 -:10BFD0000000110000000000000000000000000050 -:10BFE00000000000000000000041000404200000E8 -:10BFF0001184210411A00004808000000080000052 +:10BFD000110080004000000003000000000000008D +:10BFE000A180000040800000000000000000000070 +:10BFF0000000000000000000000000000900000038 :10C000000000000000000000000000000000000030 -:10C010000000000000000000000011C1000008093D -:10C020000000008000000000000011C100000809AD -:10C030000000008000000000008011C1000008091D -:10C0400000080000000000000000000000000000E8 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000001100000005BA -:10C0700000800500A141839089000000001080002D -:10C080008000000000000000000000000000000030 -:10C09000000000000000000000000000028080217D -:10C0A0000900C18080000003000080000280802120 -:10C0B0000900C18080000003000080000280802110 -:10C0C0000900C18000000000000000000000000026 -:10C0D0000000000000000000000000000000000060 -:10C0E00000000000000000000000000000A00000B0 -:10C0F0000001008800A0090189A0C000880090010B -:10C100000800C00000000000000000000000000067 -:10C110000000000000000000000000000000008897 -:10C1200082000000C188020000000000C0000088FA -:10C1300082000000C188020000000000C0000088EA -:10C1400082000000C1880000000000000000000024 -:10C1500000000000000000000000000000010000DE -:10C1600000000000000000000000000000000000CF -:10C170000000000001008810012009051003C0A084 -:10C180000090000401C0000000000000000000005A +:10C01000000040410040004100040000000000001A +:10C020000000000000000000000000000000000010 +:10C030000000008080000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C050000000000900000041000000000000000096 +:10C060000080804180830005800000000000000007 +:10C07000000000000000000000001121008000000E +:10C0800041800000000000000000000000000000EF +:10C090000000000000000000000000002000000080 +:10C0A000000041000000000000000000000000004F +:10C0B0000000000000000010000900800000008067 +:10C0C00000008000000000000000000000000000F0 +:10C0D000000000000000000000010000000000005F +:10C0E0000000004088014002A090C0000000000055 +:10C0F0000000000000000000000000000001000837 +:10C10000008401C0000100000000000000000000E9 +:10C11000000000000000000000000000000000001F +:10C12000000000000100000000000000000000000E +:10C130000000000000000000000100010008900065 +:10C1400000040000C000000000000000000000002B +:10C150000000000000000000C0000000000000001F +:10C16000000088000000400088A00210C0C000004D +:10C1700000000000000000000000000000000000BF +:10C180000800A00001000000000000000000000006 :10C19000000000000000000000000000000000009F -:10C1A00000000090030085C104000002000000C0F0 -:10C1B00000000090030085C100000002000000C0E4 -:10C1C00000000090090085C1000000000000000090 -:10C1D0000000000000000000004000400008004196 -:10C1E000000000000000000000000000000000004F -:10C1F0000000000041000800000003411008A0C03A -:10C2000000000000008040800000000000000000EE -:10C21000000000000000000000000000000000001E -:10C22000000000094189050289C1800000800000EA -:10C23000008000094189050289C1000000800000DA -:10C24000008000090089050889C100000000000085 -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000004110040041000000A10088112000CE -:10C28000A0098002802180800000000000000000E2 -:10C29000000000000000000000000000000000009E -:10C2A00000000000418041090309000080000000F7 -:10C2B00000000000C1804109030900008000000067 -:10C2C00000000000C1800900080900000000000013 -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000100010000000000C12040C05B -:10C3000089888801C0008200040440000000000009 +:10C1A000000000000001000000000000000000008E +:10C1B00000000000000000000100000084000100F9 +:10C1C00000000000C00000000000000000000000AF +:10C1D00000000000000000000000800000000500DA +:10C1E0000000000000000000000000808080A180AE +:10C1F000030000000000000000000000000000003C +:10C200000000800080000800000000000000000026 +:10C2100000000000000000000000000004004000DA +:10C2200000000000000000210000000000000000ED +:10C23000000000000000000000004100000080003D +:10C240000900030000008000000000000000000062 +:10C2500000000000000000000000001000110000BD +:10C2600000000003002100000080800280050080A3 +:10C2700080000000800000000000000000000000BE +:10C280000000800000080000000400000000000022 +:10C290000000000000000000000000000000080096 +:10C2A0000900000000000000000000020000000083 +:10C2B0000000000000000000000000008005802158 +:10C2C00000000000000200C00000000000000000AC +:10C2D000000000000000000000000000000100015C +:10C2E000000000000000000000000008C000A0895D +:10C2F000C084900000000200000000000000000068 +:10C3000000000000C084840108000001000000005B :10C31000000000000000000000000000000000001D -:10C320000000000000000140000101010000C00009 -:10C33000000000000000C140000101010000C00039 -:10C34000000000000000C1400100000100000000EA -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C370000000000000000000004200000000600615 -:10C3800000E0070050000006000007000000000069 +:10C32000000001000000000000000000000100000B +:10C330000000000000000000000000000000C0003D +:10C340000400000084000001002000A000000000A4 +:10C35000000000000000000000000000000081005C +:10C3600000410000828100410000820000008481C1 +:10C370000041820060060000000000000000000094 +:10C380000000000000000000000840000021000044 :10C39000000000000000000000000000000000009D -:10C3A0000000000000000000600000E0000000004D -:10C3B0000000000000000000600000E0000000003D -:10C3C0000000000000000000600000E0000000002D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C00000000000800082000000000080000006E5 :10C3D000000000000000000000000000000000005D :10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000D0F0240030C000000C0C0F0000300060A1 +:10C3F00000000000FF00606000FF00FF0000000080 +:10C4000000000000000000000F0006060000000011 :10C41000000000000000000000000000000000001C -:10C4200000000000000000000000FFFFFFFFF0F030 -:10C430000000FFFF0000F0F00000FFFF0000F0F040 -:10C440000000FFFF0000F0F00000FFFF0000F0F030 +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC :10C4500000000000000000000000000000000000DC :10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C480000000000000240C03000000000000003049 -:10C49000006000000000000000000000000000003C +:10C470000000404020000000606000FF00FF00005E +:10C48000000000000000000000000F000606000091 +:10C49000000000000000000000000000000000009C :10C4A000000000000000000000000000000000008C -:10C4B000F0F0000000000000F0F0000000000000BC -:10C4C000F0F0000000000000F0F0000000000000AC -:10C4D000F0F000000000000000000000000000007C +:10C4B000000000000000000000000000000000007C +:10C4C00000000000FF003C3C0000000000000000F5 +:10C4D000000000000000000000000000000000005C :10C4E000000000000000000000000000000000004C :10C4F000000000000000000000000000000000003C :10C50000000000000000000000000000000000002B @@ -76904,492 +76904,492 @@ :10C5400000000000000000000000000000000000EB :10C5500000000000000000000000000000000000DB :10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C58000000000000000000000000F006600003006 -:10C5900000F00000000000000000000000000000AB +:10C5700000000000000000040000000000000000B7 +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B :10C5A000000000000000000000000000000000008B -:10C5B0000000666600000F0F0000FFFF00003C3C1B -:10C5C0000000666600000F0F00003C3C00003C3C91 -:10C5D0000000666600000F0F000000000000000071 +:10C5B000000000000000000000000000000000007B +:10C5C00000000000000000003C000F000000000020 +:10C5D000000000004242C3C3000000000000000051 :10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000A000050000000085 -:10C61000003000000C0C000F0000000000000000C3 +:10C5F000000000000000000000008100100020008A +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A :10C62000000000000000000000000000000000000A -:10C6300000000000666600000F0F00000000000010 -:10C640003C3C0000666600000F0F00003C3C000010 -:10C650003C3C0000666600000F0F00000000000078 -:10C660000000000000000000000000610006000D56 -:10C6700000000000000000000000000000000000BA -:10C68000000000610005000D0000A061402F80093E -:10C6900000081000202800400008000000000000F2 -:10C6A000000000000000000000000000000000008A -:10C6B0000000000040028001802092024082800041 -:10C6C00000209202408280018020920240828000FD -:10C6D000002092024082800180209202000000002F +:10C6300000000000000000000000000000000000FA +:10C64000000000000000000000003C000F0000009F +:10C650000000000000004242000000000000000056 +:10C660000000000000000000000000610007800DD5 +:10C67000000000000028050000A0A061502F809D50 +:10C6800000050000000000000000000000000000A5 +:10C690000000A0610A0F050500A0000000000000D6 +:10C6A0000000000000000000000000000061000623 +:10C6B000000D000000610006000D000000000000F9 +:10C6C000000000000000000000000000A50050086D +:10C6D000050000A005000A08050000050000000094 :10C6E000000000000000000000000000000000004A -:10C6F000F0F8F8F00000000000000000000000006A -:10C70000000000000F00050500000000069000007A -:10C710000000005A000000000000000000000000BF -:10C720000000000000000000000000000000000009 -:10C7300000000000000055000F0000F0003C000069 -:10C7400000000000000055000F0000F0003C000059 -:10C7500000000000000005050F0000F0003C000094 +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000FF0FFB +:10C73000FF0F0000000000000000FF00FF000000ED +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 :10C7600000000000000000000000000000000000C9 -:10C770000000002828000000000000000000000069 -:10C780000000000000000F000505000000000690FA -:10C790000000000000FF000000000000000000009A +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 :10C7A0000000000000000000000000000000000089 -:10C7B000000000000000000055000F0000F0003CE9 -:10C7C000000000000000000055000F0000F0003CD9 -:10C7D000000000000000000005050F0000F0003C14 +:10C7B000FF0FFF0F0000000000000000FF00FF005F +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 :10C7E0000000000000000000000000000000000049 :10C7F0000000000000000000000000000000000039 -:10C800000000000000000000FF000F0F000000000B -:10C8100004100820A00000A000000000000000009C +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000008282C3C38E :10C820000000000000000000000000000000000008 -:10C8300000000000000000000000050555553C3CCC -:10C8400000FF0000000000000000050555553C3CBD -:10C8500000FF00000000000000000C0C3C3C3C3CD1 -:10C8600000FF0000000000000000000000000000C9 +:10C830000000000000010000000000000000BEBE7B +:10C8400082820000000000000000000000000000E4 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 :10C8700000000000000000000000000000000000B8 :10C8800000000000000000000000000000000000A8 -:10C8900000000140028080000080000000000000D5 +:10C890000000000000000000000000000000828294 :10C8A0000000000000000000000000000000000088 -:10C8B000000000000000000000000000050500006E -:10C8C000000000000000000000000000050500005E -:10C8D0000000000000000000000000000C0C000040 -:10C8E0000000000000000000000000000000000048 -:10C8F0000004000000000000000000000000000034 -:10C900000004000440000000400088000000000017 -:10C910000400000000021000010000000000000000 -:10C9200000040010000020000000000010000000C3 -:10C9300000002000000000002080000000800100B6 -:10C9400000800080000420000000000020000000A3 -:10C95000000020008400040004000000000000002B -:10C960004000000000020002000000000000000083 -:10C9700040024000000240000000000000000000F3 -:10C980000002000000000000000000000000400065 -:10C990000000400200024082000008020000000087 -:10C9A0000000000000030000004000000002000042 -:10C9B000000000000000000040000008000000022D -:10C9C0004000000800080000000000000000000017 -:10C9D0000000000000000000000200000002000251 +:10C8B0000000000000080000000000000000000070 +:10C8C000BEBE8282000000000000000000000000E8 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000040000000044 +:10C8F0000004000400000000000000000000000030 +:10C90000000400040000000000000000000000001F +:10C910000000000000000000000000040000000013 +:10C920000000000200000000000000000000000005 +:10C93000000000000000C000010000000000000036 +:10C9400000000000000400000000000000000000E3 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000200000000000000000000C5 +:10C9700000000000000000000000000000000000B7 +:10C980000000000000000000000010000000000097 +:10C990000000000000000002000000000000000095 +:10C9A000000000000004000000000000000400047B +:10C9B0004000000000020002000008020002000225 +:10C9C0000002000000020002000000000000000061 +:10C9D0000000000040020000000000000000000015 :10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA0000000000000000020001000000030004001C -:10CA1000040000000200020000000000000000000E -:10CA200000000000000001100000024000000000B3 -:10CA300000000000000000000000000000000000F6 -:10CA4000000040001000000803000000000000008B -:10CA5000000000000000021002090400040004109D -:10CA60000410000000000010021000000000000090 -:10CA700000000000000000000400000000000000B2 -:10CA80000000000000000200000808000000020092 -:10CA9000000080000900000000000000000000000D -:10CAA00000000000000000000805000080010000F8 -:10CAB0000000000000000400040002000000000864 -:10CAC0000000000080008000000140000000000025 -:10CAD000000000000408000004000000800080083E -:10CAE0008000800000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000C00000000000000065 -:10CB10000000000000000000000000000280000093 -:10CB20000000000000000000000000000000000401 -:10CB300000000800000000000000000000000000ED -:10CB40000000000000000000000088000400000059 -:10CB5000000000000000000000000000882100002C -:10CB600000100000000000000000000000090000AC +:10C9F00000000000000000000020002008200820A7 +:10CA000000000000000000000080002000800020E6 +:10CA100020002000000400040000000000000000CE +:10CA20000000000000000000000000000000000006 +:10CA300000000080008000800080000000000000F6 +:10CA40000080000000000010000000000000000056 +:10CA500000002000000400040004000000000000AA +:10CA600000000500050005000500000000000000B2 +:10CA7000000000000000000000000001000100852F +:10CA80000001004000000002000200200001002020 +:10CA90000001800080000001000100000000000093 +:10CAA0000008000000000000000800000000000076 +:10CAB000000800000004000400040004000000005E +:10CAC0000000004000000000000000100000000016 +:10CAD0000004000080000001008900010000000047 +:10CAE00000100010A000A000A000A00000000000A6 +:10CAF00000000000000000000000000090000000A6 +:10CB000000000008000000000000000000000041DC +:10CB100000080000000800080008000800410000AC +:10CB200000410000000000040004000400000000B8 +:10CB300000000000000300000002000000000000F0 +:10CB40000400000002004000000000000000000897 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000005000000000000C0 :10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000880000110040004000C0407C -:10CBA0002100000000000020002000200000000004 -:10CBB00000000000800000000000000000000000F5 -:10CBC0000000000000000000000000000000000065 +:10CB800000000000000000000000000003000000A2 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000100010001000082 +:10CBB0000000000000000000000000010000000074 +:10CBC00005000000000080000000000000000000E0 :10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000020043 -:10CBF00000000000000000000000000000000040F5 -:10CC00000000000000008400000088000000000018 -:10CC100000200020002000200000004000110080C3 -:10CC200000000004000400040000000000000000F8 -:10CC300000000040000008000800000000000000A4 -:10CC400000000000000000000000000000000010D4 -:10CC50000002000000210010001000000000000091 -:10CC600000000000080000000000000000000000BC -:10CC700000000000000000000000000000000000B4 +:10CBE0000000000000000000000000000000000045 +:10CBF00000000000000000000000000000004000F5 +:10CC0000000000000000000000000000000000081C +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC30000000000000000000000000410000004172 +:10CC400000000000000000000040000000000000A4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000010000000000C3 +:10CC700000000008000000080000000000000000A4 :10CC800000000000000000000000000000000000A4 -:10CC90000000000100000001000100000000009001 -:10CCA0000020000000010001000100000000000061 -:10CCB0000000000020002000200000000000000014 -:10CCC0000000000000000000000003000000000061 -:10CCD000000000010000000000000000000000044F -:10CCE0000000200000000000000000000000000024 +:10CC90000000000000000000000000000000000094 +:10CCA00000000000000000840000000411040000E7 +:10CCB00000000000000000000000000000840000F0 +:10CCC0000000000000000000000800090000000053 +:10CCD0000000000000000000000000000000000054 +:10CCE0000900000000000000000000000200090030 :10CCF0000000000000000000000000000000000034 -:10CD0000000000000000000000008400000000009F -:10CD1000000084000000000000000000008000000F -:10CD200000000000014000000000001000000000B2 -:10CD300000000000000000000000000000000000F3 -:10CD400000050000000000000000000000000000DE +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000030000000000000000F0 +:10CD400000000008000800000000000000000000D3 :10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000004053 -:10CDA00000000000000040C1050800000003200052 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD00000000000000000A00000000000000000B3 -:10CDE00000000000000000A00000000000000000A3 -:10CDF00000000000000000880000000000000000AB +:10CD6000000000100000084100100000000000005A +:10CD700000000008C00000000000000000000000EB +:10CD8000000000000000050000000000000000009E +:10CD90000000000000C00000090000840000000046 +:10CDA00000000000000000000000000000000084FF +:10CDB00000000084000000000000000000000000EF +:10CDC000000000000000000105000000000000005D +:10CDD0000000000000000000000000000000000053 +:10CDE000000000000000000008000000000000003B +:10CDF00000000000000141000000000000000021D0 :10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000800000000092 -:10CE2000000091040909900000400040000001004A -:10CE300000000000000000000000000000000000F2 -:10CE400000000008000000000000000000080000D2 +:10CE100000210021002100210000000090000000FE +:10CE20000000000500090005000500410000004168 +:10CE300000040000000400000000000200002004C4 +:10CE40004000000000000000000000210000000081 :10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000002000000000000000000000000B0 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000020000072 -:10CEA00000000000040084042000000000010000D5 -:10CEB000040000000000000000000000002000004E -:10CEC0000000200000000000000000000000000042 -:10CED0000000000000000000000000100000000042 -:10CEE0000000000000000000000000000000000042 -:10CEF00011000040000000000000000000000000E1 +:10CE60000000000000000000000000102000000092 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000A011A051 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000002100000000000000000061 +:10CEB0000000000100000000000000000000000071 +:10CEC0000000000000000000004000000000000022 +:10CED0000000000000001100000000000000000041 +:10CEE000000000000084000000820000110011001A +:10CEF0001100110000000000000000000000000010 :10CF00000000000000000000000000000000000021 :10CF10000000000000000000000000000000000011 -:10CF20000000000008000000000000000200820174 -:10CF300001000000000000000000000000000800E8 -:10CF400000000000000000000000000000000000E1 -:10CF5000010020000000000100019000000000001E -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 +:10CF20000000000000000000010000000000000000 +:10CF300000000000000004000000000000000000ED +:10CF4000000000000000000082000000000000C09F +:10CF500000A000C000A000000000000000000000D1 +:10CF600000000000000000000000010000000000C0 +:10CF70000000000000000001C001010004000000EA :10CF800000000000000000000000000000000000A1 :10CF90000000000000000000000000000000000091 -:10CFA00000000000000080000000000000000004FD -:10CFB000001004000020000000000000000000003D -:10CFC00080000000000000000000000000000000E1 -:10CFD00000000300000000000041000800080008F5 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 +:10CFA0000000000000000000000040000000000041 +:10CFB000000000000000000000000400000000006D +:10CFC000000000000000000000000000050000005C +:10CFD00000800000000000000000000000000000D1 +:10CFE0000000000000000000000000004000000001 +:10CFF00000000000000000001141001020000003AC :10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D02000000000C100040080000900800000000032 -:10D0300080000000000580000000000000000000EB -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000000000000090 -:10D0A00000000000004100200020000100080000F6 -:10D0B00000A0880000000000C000880008000800F0 -:10D0C0002000000000000000000000000000000040 -:10D0D0000000000000000000000000400000000010 +:10D010000000008000000080000000000000000010 +:10D0200000000080000000800009000000050000F2 +:10D0300000000000000000000002000000110000DD +:10D0400000000000000000000000001100000005CA +:10D050000090000000000000000000000000000040 +:10D0600000000000000000000000001100000002AD +:10D07000000000000000000000000000008000210F +:10D080000080000000000000000000000000000020 +:10D090000000000000080000000800000000000080 +:10D0A000000000000008000000080000000000016F +:10D0B000000200000000000000000000000000006E +:10D0C0000000000000000000000000000000000060 +:10D0D00000010088000000000000000000000000C7 :10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000084000000840000000028 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D120000000000001000000080000000084001062 -:10D13000C00000C000108888840000C0000000000B -:10D1400000000000000000100000001000C00000FF -:10D1500000000000000000010001000000010000CC -:10D1600000010100010100000000000000000000BB -:10D1700000000000000000000000040000000000AB -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A00000000000000040000000800000001100AE -:10D1B0000080000000800000840000000580000066 -:10D1C000000000000000000000000000008000805F -:10D1D00000000000000000000010001000400041AE -:10D1E00000200003101008410000000000000000B3 -:10D1F0000000000000000000090000000000000026 -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D220000000000000000000800000090000000075 -:10D2300000000004000000000000004100000000A9 -:10D24000001000000080000000000000000000004E -:10D2500000000000000000000000000000000000CE +:10D0F0000000000000000000000000000000002010 +:10D10000000100C00000000000000000000000005E +:10D110000000000000000000080000000000000007 +:10D1200000000000000000000200000000000200FB +:10D1300004000000000000000000000000000200E9 +:10D1400000000100000000000000000000000000DE +:10D15000000000000000A00000000000200000000F +:10D1600000000000000000000000000000000000BF +:10D170001000840001000000000000000000010019 +:10D180004004880201C00000000000000000000010 +:10D190000000000000000900000080000000000006 +:10D1A000000000000000020000000000000000007D +:10D1B00000008000020000000000000000000000ED +:10D1C000000000004100000000000000000000001E +:10D1D000000000000000050000000000000000004A +:10D1E000000000000000000000000000000000003F +:10D1F000000080000000400000000000000000006F +:10D200002100848080800880000000000000000071 +:10D21000000000000000000000000002000000000C +:10D2200000000000000000000000000400000000FA +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D25000000041000000400020000000000000002D :10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000020000AC -:10D28000000000000000000000000000000000009E +:10D2700000000000000000000000000000000000AE +:10D28000000000200021000000000000000000005D :10D29000000000000000000000000000000000008E -:10D2A00000000000000000000000C0000800400076 -:10D2B000880000000001000000000000008400C0A1 -:10D2C0000000000000880040000000000000000096 -:10D2D000000000000000000000000000000000004E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000100000001000000000000004C :10D2E000000000000000000000000000000000003E :10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D +:10D30000000000000001000000000000000000001C :10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000000000000FD -:10D330000800600000000000220000000000004221 -:10D3400012000000000000000000000000000000CB -:10D3500000000000000000000000000000000000CD +:10D32000800000000000000000000000000000007D +:10D330008000000000000044000000000000000029 +:10D3400000000000000000420000000A0000000091 +:10D35000000000000000000000420000000000008B :10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000080000000000000000000000000001D +:10D370000000000000000000004400000000000069 +:10D380000000000000000000004212000021000028 :10D39000000000000000000000000000000000008D -:10D3A0000000000000000000000000000000A0BC21 -:10D3B0000A3E00000000000000003030A0A0000085 -:10D3C0000000E1E1B4B40000000000000000000033 -:10D3D0000000000028283C000000000000000000C1 +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D :10D3E000000000000000000000000000000000003D :10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C +:10D40000000000000000000000000000F000FF002D :10D41000000000000000000000000000000000000C :10D4200000000000000000000000000000000000FC -:10D43000003C003C00000000000000003030A0A0D4 -:10D4400000000000E1E1B4B40000000000000000B2 -:10D4500000000000000028283C0000000000000040 +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC :10D4600000000000000000000000000000000000BC :10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C +:10D480000000000000000000000000000000F000AC :10D49000000000000000000000000000000000008C :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C -:10D4C0000000000000003C3C141400000000555512 -:10D4D00055550000000000000000000000000000A2 -:10D4E000000000000000000000000000000000003C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000020000000000000000000001C :10D4F000000000000000000000000000000000002C :10D50000000000000000000000000000000000001B :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000141400000000B3 -:10D550007F5F7D550000000000000000000000001B -:10D5600000000000000000000000000000000000BB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D56000000000000000000020000000000000009B :10D5700000000000000000000000000000000000AB :10D58000000000000000000000000000000000009B :10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000A5000A08050000A005000A -:10D5C0000A08009000A00061000F009D0005000007 -:10D5D00000000000000000000000000000900000BB -:10D5E000000000000000000000610006000D0000C7 -:10D5F00000610006000D00000000000000000000B7 -:10D60000000000000000000005000A08050000A05E -:10D61000000000000000000000000000000000000A +:10D5A00000000000000005000A08050000A00000BF +:10D5B00000000000000005000A08050000A000614E +:10D5C0000007000D000000000000000000000061E6 +:10D5D0000007000D00000000000000000000000037 +:10D5E00000610005000D0000000050000000000078 +:10D5F000000000000000000000000000000000002B +:10D6000000610007000D00000000000000000000A5 +:10D6100005610A0B009D00A0000000000000000052 :10D6200000000000000000000000000000000000FA :10D6300000000000000000000000000000000000EA :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA -:10D66000000000000000000000000000000028F89A -:10D6700000F00000000014FF50FF00000000000058 +:10D660000000C3C30303000000000000000000002E +:10D6700000000000000000000000000000000000AA :10D68000000000000000000000000000000000009A :10D69000000000000000000000000000000000008A :10D6A000000000000000000000000000000000007A :10D6B000000000000000000000000000000000006A :10D6C000000000000000000000000000000000005A :10D6D000000000000000000000000000000000004A -:10D6E000000000000000000000000000000000003A -:10D6F00000F028F80000000014FF50FF00000000B8 +:10D6E0000000000000000303000000000000000034 +:10D6F000000000000000000000000000000000002A :10D700000000000000000000000000000000000019 :10D710000000000000000000000000000000000009 :10D7200000000000000000000000000000000000F9 :10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000096000096AD +:10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 :10D7600000000000000000000000000000000000B9 -:10D770000000000000000F0F0F0F0000000000006D +:10D7700000000000000000000000000000000000A9 :10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 +:10D790000000000000004141C30000000000000044 :10D7A0000000000000000000000000000000000079 :10D7B0000000000000000000000000000000000069 -:10D7C00000000000000000000000000000009600C3 -:10D7D00000960000000000000000000000000000B3 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 :10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000FF0F3F3F000000009D +:10D7F0000000000000000000000000000000000029 :10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D8200010000180008000020000000000000000E5 -:10D830000000000000000000000000008800000060 -:10D8400020000000000000040000000000000000B4 -:10D8500000000000000000000000000000000000C8 -:10D860000001200000000000040000000000000093 -:10D8700000000000000000000000010000800080A7 -:10D880000080200000000000200000000000400098 -:10D8900000000000000000000000008310000040B5 -:10D8A00000008000100800020001000000000000DD -:10D8B0000000000000000000000000000000410027 -:10D8C0000000000200000000000000000000000056 -:10D8D0000000000200900090000200000000000024 -:10D8E0001000000000000002000000000000000026 -:10D8F0000000000000400000400000004000000860 -:10D90000400800024000000000000000000000008D -:10D910000000000000000040000000044010000271 -:10D920000001000000800100000040000000000035 -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000001000100000B7 -:10D9500000100010000000000000000000000000A7 -:10D9600000000000000004000400040001000000AA -:10D9700000000000000000000000000002000000A5 -:10D980000000020000000000000000000200000093 -:10D9900000008210001000000400041004002000A9 -:10D9A000200020002000000810000000800000007F -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000808280008000040031 -:10D9F0000400040004000400000000000000000017 -:10DA00000000000004000000000000000000000012 -:10DA10000000000000000000000080008000800086 -:10DA20008000C000800080000000000000000000B6 -:10DA3000000000000000000000000000A000A000A6 -:10DA40000000000082000000000000000000000054 -:10DA5000000000000000000000000000880004003A -:10DA600000000000000000000000000000000000B6 -:10DA700000000000000000000000000000000000A6 -:10DA80000000000000000000001000000000000086 -:10DA90000010000000000000000000000000000076 -:10DAA0000000000000000000040000000000000072 -:10DAB0000000000000000000100000000000000056 -:10DAC000040000000000030000000000000000004F -:10DAD00000000000090000004000000000000000FD -:10DAE0004100002000000000004000000002000093 -:10DAF00000000000000400000300000040000000DF -:10DB00000000000000000000000000000000000015 -:10DB100000200000000000000000000000000000E5 +:10D8100000000000000000004141C30000000000C3 +:10D8200040000000000400000000000000000000B4 +:10D830000100200000004000000000000000000087 +:10D8400000000000000000000000000000000400D4 +:10D8500000002000000000000000000000000000A8 +:10D8600000030000000000001000000000000000A5 +:10D8700000000000200000040000000000008800FC +:10D880000000000000000000200000000000000078 +:10D890000000000020000000000000000000000464 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000080000000000000000000000000060 +:10D8C0000000000000000000000000400000000216 +:10D8D00000020000000000000000000000000090B6 +:10D8E0000000000000000000000000040000000034 +:10D8F000009000000090000040000090090000002F +:10D9000040020000000000000000000000000000D5 +:10D910000002000000020000000000020000000001 +:10D9200000000000000000000000000000000000F7 +:10D93000000000000004000408840004000000004F +:10D940000000000000000000000000000220022093 +:10D950000220022002000200020002000200020077 +:10D960000200020000000220022004400400022005 +:10D9700002200440044002000200020002400000B5 +:10D980000000000000000000000000000000000493 +:10D99000200020000404000000000000000000003F +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000001000100410001000023 +:10D9C00000000000000000080000000000008005CA +:10D9D0008001800180098000800080008000840038 +:10D9E00080008000800000008009800180018000AC +:10D9F0008001820180018009800080008000800019 +:10DA00000900000000000000040204000000000003 +:10DA100002018000840000090004000000000000F2 +:10DA200000000000200000000008000000000000CE +:10DA300000000000000000080000000000000000DE +:10DA400000000000000000000000000000000000D6 +:10DA50000010001000100010000000000000000086 +:10DA6000002100210000A0000000000000000000D4 +:10DA70000000002100210003000000050005040053 +:10DA80000000022100210020002000000000000012 +:10DA90000000002100210000000000000000000044 +:10DAA0000000000800200800000000000000000046 +:10DAB0000000210000000000000000000000000045 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000009000000000008000000000015 +:10DB0000008400000000000000010001000000008F +:10DB10000000000000000000000000000000000005 :10DB200000000000000000000000000000000000F5 -:10DB30000000000000000000100000400000000095 -:10DB400000000000080000000000000000000000CD -:10DB50000000004100090004000000000000000077 -:10DB600000000000000000000800000000000000AD -:10DB700000110000100000101010821000210000A1 -:10DB80000000001000210011000082004000C000D1 -:10DB9000004100000000000000008200820082803E +:10DB300000000000000000000800000000000000DD +:10DB40000000000000000000820000000000000053 +:10DB5000000000000000000082000080A000000023 +:10DB600000000800A000A0008200A0000000020049 +:10DB7000010000008280820082008200021182087F +:10DB80000000000002800000000000000000000013 +:10DB90000000000000000020000000000000000065 :10DBA0000000000000000000000000000000000075 :10DBB0000000000000000000000000000000000065 :10DBC0000000000000000000000000000000000055 -:10DBD000000000000000000000000088009000002D -:10DBE0000000000000000000000000000000000035 -:10DBF0000000000000000000000000000000000025 -:10DC000000000000000000100010001000100000D4 -:10DC100000100010001000000000100000000000C4 -:10DC200000200000000000000000000000000000D4 -:10DC300000000000000000000002000000000000E2 -:10DC400000000000000000000000000000000000D4 -:10DC50000000000000000000820000000000000042 -:10DC6000000000000000000000000000000088002C -:10DC700000000000000000000000000000000000A4 -:10DC800000000000000000000000000088000020EC -:10DC90000000000000000000000000000000000084 -:10DCA0000000000000000000000000000000000074 -:10DCB0000000000000000000000000000000000064 +:10DBD0004100000000000000000000000040008440 +:10DBE00000840000000000000000000000000000B1 +:10DBF00080000200000000400000000000008000E3 +:10DC000000000000000000400000000000000000D4 +:10DC100000000008000000100000000000000000EC +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC40000000000000000000000000008200000052 +:10DC50000000000000000000400002002000200042 +:10DC6000000084008440204000000021004020404B +:10DC700000000000000090400000000002002000B2 +:10DC8000200000000003004000000021820000008E +:10DC900000000000000000008200000000000010F2 +:10DCA0000000000300000000000000000000000071 +:10DCB000004100000000000000000008000000001B :10DCC0000000000000000000000000000000000054 -:10DCD00000000008000000C0000000000004000078 -:10DCE0000000200400000088000000000000000286 -:10DCF0000000000000000000000000000000000024 -:10DD000000000000110000000000030000200900D6 -:10DD100000040000000000000000000000000000FF -:10DD200010000000000000000000000000020000E1 -:10DD300000000000000000000000010000000000E2 -:10DD400010001000000000000000000000000000B3 -:10DD500000000000000000000000000000000000C3 -:10DD600000000000000000000000000000000000B3 -:10DD700000000000000000000000000000000002A1 -:10DD8000000200020000000000000000000000008F -:10DD90000000000000000000000000000000000083 -:10DDA0000000000000000000000000000000000073 -:10DDB0000000002100000000000000004000020000 -:10DDC00000400040000000000000000000000800CB -:10DDD0000000000000000000200009000000030017 -:10DDE0001100000000000000000000880000020098 -:10DDF0000000000000000000000000900000000093 -:10DE00000000000000000010000000000000000002 -:10DE10000000000000000000000000000000000002 -:10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000010010000000D1 -:10DE400000000000000000000000000000000000D2 +:10DCD000000008000000000000000000800080003C +:10DCE0008000000000000001800100000000000131 +:10DCF0008001000000000000000100000000800022 +:10DD00008000800000000000000100000000000012 +:10DD10000000000000000000000000000000000003 +:10DD2000000000000000000000000000218400004E +:10DD300000000000080000000000000000000000DB +:10DD40000000000000000000000000000021002191 +:10DD50000021002100000000000000001000000071 +:10DD600082800000A0418441200084000021002125 +:10DD700020000000000082004000000000000000C1 +:10DD800000000241004100000000A000000000204F +:10DD90000020004000000000000000000000000023 +:10DDA000000000000000020000000002000000006F +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000004000000000000080000000000073 +:10DDF00000008000000000000000000200000000A1 +:10DE00000000000080000000000000000000000092 +:10DE100011010001000000000000000000000000EF +:10DE200000000000000000001100110011001100AE +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000A0000100000031 :10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000000000000B2 -:10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000000000092 -:10DE900000000001410040010001000000000000FE -:10DEA000000000000000000000000000A0000000D2 -:10DEB00000000000000000000000000009008000D9 -:10DEC0000000000000000000000000000000000052 +:10DE600091C0A0000888000191C0000020020000BD +:10DE700090C1040082030000000000C00000000206 +:10DE8000000091C002008800000300C000000002F2 +:10DE900040009002000200909090000000000000FE +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000400012 :10DED0000000000000000000000000000000000042 -:10DEE0000000000000000000000000000000000032 -:10DEF0000000000000000000000000000000000022 -:10DF00000000000000000000000000000000000011 -:10DF10000000000011410320800500030000000004 -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000200000010000900C6 -:10DF40000800410000000000000000000000000088 -:10DF500000000000000000000000000000000000C1 -:10DF600000000000000000000000000000000000B1 -:10DF700000000000000000000000000000000000A1 -:10DF80000080000000800000000000000000000091 -:10DF90000000000000000000000000000000000081 -:10DFA0000000000000000000000000000000000071 -:10DFB0000000000000000004001000040000010048 -:10DFC000010001000100000000000000000000004E -:10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000000000000031 -:10DFF0000000000000000000000000000000000021 -:10E0000000000008000000C0000000000000000048 -:10E01000000000000000000000000000000000827E -:10E0200000000000000000000000000000000000F0 -:10E030000000008400000082000100010091000047 -:10E0400000010000000100010000000000000000CD -:10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 -:10E0700000000000000000000000000000000000A0 -:10E080000000000000000800000000000000000088 -:10E09000000000000000000000000001010100007D -:10E0A000000100000000000000000000000000006F -:10E0B0000000010000000200000000000400000059 -:10E0C00000000009001000080041000000000000EE -:10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 -:10E0F0000000000000000000000000000000000020 -:10E100000000000009000000800000000000000086 -:10E1100000000000000000000000000000101010CF -:10E12000404000410000000000000000000000002E -:10E13000000000004000000000000000000000009F -:10E1400000000400000000000000001000000000BB -:10E1500000000000000000000000000000000000BF -:10E1600000000000000000000000000000000000AF -:10E17000000000000000000000000000000000009F -:10E18000000000000000000000400000000000004F -:10E19000000000000000000000000000000000007F -:10E1A000000000000000000000000000000000006F -:10E1B000000000000000000000410000000080009E -:10E1C000000000000000000000000000000100004E -:10E1D000000000000000000000000000000000003F -:10E1E000000000000000000000000000000000002F -:10E1F000000000000000000000000000000000001F -:10E20000000000000000000000000001000000000D -:10E2100000000000000000000000000000000000FE -:10E2200000000000000000000000000000000000EE -:10E2300000000000000000000000000100000000DD -:10E24000C000400040004000600000E0000000000E -:10E2500000000000000000000000000000000000BE +:10DEE000000089821102404100108989112105A09A +:10DEF000002080898303C0830005000000800000AB +:10DF0000008000008982C0024041001000800000B3 +:10DF10000080000040000000000000000000000041 +:10DF200000000000000000000900000000000000E8 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000090000C8 +:10DF500000090000000000000000000000000000B8 +:10DF600000000000080002800800900809800903F2 +:10DF70002020A003038002000200850200000000B0 +:10DF800000000000808010000200020090110000DC +:10DF900000030000800000000040000000000000BE +:10DFA0000000000000000011000000400000000020 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD00000000088000000000000000000000000B9 +:10DFE000000000000000000800080000C18400409C +:10DFF00000000000C000000200000000C00000009F +:10E00000000000880000C008019000840000C18466 +:10E01000900000000000C0009000020002204000BC +:10E0200000000000000000000000000000010000EF +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000800000000000000000000000000B8 +:10E06000000000000000000000000000050100C1E9 +:10E0700000000000000000C000000000000100C01F +:10E08000000000020000080000C00100000085013F +:10E0900000C100000000000000C090020002000467 +:10E0A000020200000000000000000000100000005C +:10E0B000010000000000000000000000000000005F +:10E0C0000000000000000000000000000000000050 +:10E0D00000000000800000000900000000000000B7 +:10E0E00000000000000000000000090208021010FB +:10E0F000009000090920031100A00002020202089A +:10E10000008500000400000080000080040240023E +:10E1100005054090000000000000008000000000A5 +:10E1200000808080000000000000000000008000EF +:10E13000000040000000000000000000000000009F +:10E1400000000000000000000000000000000000CF +:10E15000000000008000000000000000000000003F +:10E160000000000000000000000000000210028417 +:10E170001000031189050989200003118385028994 +:10E180008300051100008000000280000000C0052F +:10E190000285100003118000000000000000004014 +:10E1A00000C00000000000000000000000000000AF +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000C00020000000C00000009F +:10E1E00000000000000000000000000000000089A6 +:10E1F000889101000000C020009100000100C002D1 +:10E200000091050000000000C000000304000000B1 +:10E21000C040009003000000C000000000000000AB +:10E22000020002209090400000000000000000006A +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E25000000000000000000000000042000000007C :10E2600000000000000000000000000000000000AE -:10E27000000000000000000000000000000000009E -:10E28000000000000000000000000000000040004E -:10E29000000A000000000000000000000000000074 -:10E2A000000000000000000000000000000000006E -:10E2B000000000000000000000000000000012004C -:10E2C00042000000002000000000000000000000EC -:10E2D000000000000000000000000000000000003E +:10E27000810000E012000000810000E000000000CA +:10E28000810000E000000000000000000000080025 +:10E290000000810000E0120000000000000000000B +:10E2A0000000004100000700000000000000000026 +:10E2B0000000000000080000000000000000000056 +:10E2C000000000000000000000000000000000004E +:10E2D00000000000000000000000DBDBC3FF0000C6 :10E2E000000000000000000000000000000000002E -:10E2F000000000000000000000000000000000001E -:10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD -:10E3200000000000000000000000000000000000ED +:10E2F0000000FF00FF0066660000FFFF000066668A +:10E300000000F0F00000666600000000F0F0000081 +:10E310003C3C0000F0F0000066660000FFFF0000DB +:10E32000FFFF0000080808080000000000000000CF :10E3300000000000000000000000000000000000DD -:10E34000000000003E3C7C3C00000000000000009B -:10E3500000000000000000000000000000000000BD +:10E3400000000000000000000000000000000000CD +:10E35000000000000000000000000000DBDBC3FF45 :10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D -:10E3A000000000000000000000000000000000006D +:10E3700000000000FF00FF006666000000000000D3 +:10E3800066660000F0F00000666600000000F0F035 +:10E3900000003C3C0000F0F0000066660000000059 +:10E3A0000000000000000008080899008900000033 :10E3B000000000000000000000000000000000005D -:10E3C00000000000000006006000000000000000E7 +:10E3C000000000000000000000000000000000004D :10E3D000000000000000000000000000000000003D :10E3E000000000000000000000000000000000002D :10E3F000000000000000000000000000000000001D @@ -77400,275 +77400,275 @@ :10E4400000000000000000000000000000000000CC :10E4500000000000000000000000000000000000BC :10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C -:10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C +:10E47000000000000000000000000F0F00006666B2 +:10E4800000000F0F0000666600000F0F00006666B8 +:10E49000000000000F0F0000666600003C3C00001A +:10E4A000666600000F0FFFFFC3C3000000000000FE :10E4B000000000000000000000000000000000005C :10E4C000000000000000000000000000000000004C :10E4D000000000000000000000000000000000003C :10E4E000000000000000000000000000000000002C -:10E4F000000000000000000000000000000000001C -:10E50000000000000000000000000000000000000B -:10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB +:10E4F0000000000000000000000000000F0F0000FE +:10E50000666600000F0F0000666600000F0F000037 +:10E510006666000000000F0F0000666600003C3CCD +:10E520000000666600000F0FFFFFC3C30303030272 +:10E530000000C3C200000000000000000000000056 :10E5400000000000000000000000000000000000CB -:10E550000000000000610006800C000000000000C8 -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E5900000000000000005000A08050000A00000BF -:10E5A000000000000000000000000000000000610A -:10E5B0000006000D00000000000000000000000048 -:10E5C00000000000000005000A08050000A0A0618E -:10E5D0000007000D000000000000FFF5BEBE0000B7 +:10E5500000000000000000000000000000000000BB +:10E5600000000000A0610007000D00000000000096 +:10E5700000000000000000000000000045638A0960 +:10E58000852192A240E380018021920240E3800134 +:10E5900080219202000045828A08052092A245E36C +:10E5A0008A09852192A24082800000208202000018 +:10E5B00000280000000000000000000000000061D2 +:10E5C0000007000D00000000000000000000000037 +:10E5D000000000000000000000000000000000003B :10E5E000000000000000000000000000000000002B :10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A -:10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000000000EA -:10E630000000000030BA3030000000000000000090 +:10E60000000045550000202020205551000000004A +:10E6100001030000000000000000000000000000F6 +:10E6200020200020AA0000000000000000000000E0 +:10E6300000000000000000000000000000000000DA :10E6400000000000000000000000000000000000CA -:10E650000000000000000000000000003C34BEBECE +:10E6500000000000000000000000000000000000BA :10E6600000000000000000000000000000000000AA :10E67000000000000000000000000000000000009A -:10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A -:10E6A000000000000000000000000000000000006A -:10E6B000000000000000303030BA00000000000010 +:10E68000103030300000000000202020000000008A +:10E690000000030300EF0000000000000000000085 +:10E6A0000000202020208A00000000000000000060 +:10E6B000000000000000000000000000000000005A :10E6C000000000000000000000000000000000004A -:10E6D0000000000000000000000000000000000A30 -:10E6E00030300000000000000000000000000000CA +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A :10E6F000000000000000000000000000000000001A -:10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000000F9 -:10E7200000000000000000000000000000000000E9 -:10E730000000000075305D0C0000000000000000CB +:10E700000000020202022A000000C000C000AA00AD +:10E710000000008300000000000000000000000076 +:10E7200000000000000000008282000000000000E5 +:10E7300000000000000000000000000000000000D9 :10E7400000000000000000000000000000000000C9 :10E7500000000000000000000000000000000000B9 -:10E76000000A30300000000000000000000000003F +:10E7600000000000000000000000000000000000A9 :10E770000000000000000000000000000000000099 -:10E780000000000000000000000000000000000089 -:10E790000000000000000000000000000000000079 -:10E7A0000000000000000000000000000000000069 -:10E7B00000000000000055005500000000000000AF +:10E780000000000000020202AA0000008000C00099 +:10E790008A00000000C30000AA2A00000000000058 +:10E7A00000000000000001030303820200000000DB +:10E7B0000000000000000000000000000000000059 :10E7C0000000000000000000000000000000000049 :10E7D0000000000000000000000000000000000039 -:10E7E0002000000000000000000000000004910074 -:10E7F000C000000000000000200000041000000025 -:10E800008800C00000000000000000040004200098 -:10E810002000000000000000200000002000000197 -:10E820000000200020000000000000000004880418 -:10E830002000000000000000400020000400000054 -:10E840000000200020000000000000004000200424 -:10E850000000000000000000C000200000000000D8 -:10E860004000000000000000000000000000000068 -:10E870000490009011900000100000004000000083 -:10E8800040000000000000000002000000000090B6 -:10E890000090409000000000000200900000000284 -:10E8A0000000400200000000000000000000000026 -:10E8B0000040000000000000000000000000000018 -:10E8C00000400000000000000000000040000004C4 -:10E8D0000000000000000000000400000000000034 -:10E8E0000000000000080000000400000000000814 -:10E8F00002000200000000002000000000000200F2 -:10E9000000000004200000000000000000400000A3 -:10E9100002100000000000000000000000200000C5 -:10E9200000000000004100000000000001020000A3 -:10E9300000100200000000000000000200000000C3 -:10E9400000000200000000000000000090400040B5 -:10E950000000000000400040001000100000000017 -:10E96000080000000000000000000000000800088F -:10E970000000008280000000000080000000000015 -:10E9800000000408000100C000000000004000C0BA -:10E99000002000000400000800000008000800003B -:10E9A0000900028200000000000000000000400199 -:10E9B000000000000400000000080000000800083B -:10E9C0000000000004000000000000000000000043 -:10E9D00000000000020000000008000000084008DD -:10E9E00000400000000000000000000000000000E7 -:10E9F00000000000002100000000000000080000EE -:10EA000000000000004000400000840300000000FF -:10EA100000400400040004000000000000000000AA -:10EA20008400C0050000000000001000000000008D +:10E7E00020000000000040000000000400040000C1 +:10E7F000000000000004000000000004000400000D +:10E8000020000000000020000000C004C004000040 +:10E8100000000000400000000000000000000001B7 +:10E8200000002000000000042000000000000004A0 +:10E8300000000000000400040000000000000000D0 +:10E840000000200000000000200040000000000444 +:10E850000000000000404000000000000000000038 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000004000000000000400000000000000034 +:10E8A00000000000000000000000000000000090D8 +:10E8B0000000000000000000000200000000409086 +:10E8C0000000000000000000000000400000000206 +:10E8D0000000000000000002000000000000000036 +:10E8E0000000000000000010000000000000000018 +:10E8F00000000000000000000000040004000410FC +:10E9000004100040004000000000900000000000E3 +:10E9100000000000000000000000000000000000F7 +:10E920009000000000000000000000002000200017 +:10E93000200020000000000000040004000000008F +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E960000000000000100010000000100000000077 +:10E970000000000000000000000000008000800097 +:10E980008000800000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A00000000000000000000000000000008008DF +:10E9B00080088010800000000000000000000000BF +:10E9C00000100910091000000008000000000040BD +:10E9D00000400000000000000000000000000000F7 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA000000000000000000000000000000000008FE +:10EA100000000008000000000000000000000000EE +:10EA200000000000000000000000000000000000E6 :10EA300000000000000000000000000000000000D6 -:10EA400000000000040010000000000000000000B2 +:10EA40004000004100000041000000000000000004 :10EA500000000000000000000000000000000000B6 :10EA600000000000000000000000000000000000A6 -:10EA7000000000840000000000840000210000006D +:10EA70000000000041000000000000000000000055 :10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000002056 -:10EAA0000000000000000000000000000000004026 -:10EAB00000000082000000000000000008000000CC +:10EA90000000090005000500000000000000000063 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000410015 :10EAC0000000000000000000000000000000000046 :10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000000000900096 -:10EAF000000000000000C00000110000080000003D -:10EB00000000000000000003000000000080008002 -:10EB10000080000000042000000000000000000051 -:10EB200000000000000401001009000000000000C7 -:10EB300000000000000000000000000000000000D5 -:10EB400000000000000000000000000000000000C5 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB30000000000000004000080008000000000085 +:10EB400000000004000000000000000000000000C1 :10EB500000000000000000000000000000000000B5 -:10EB60000000000004000000084000000000000059 -:10EB70000000000000000000090000880000000004 -:10EB80000000000000080000000000000000080471 -:10EB90004104000400000000000400000010000018 -:10EBA000000000000000000120840000000021009F -:10EBB000000008002100050000000000000041C026 -:10EBC00000C041C0020000C004C000C0001000002E -:10EBD00000000004000400080000001004100008F9 -:10EBE00000000000000008400000002000000000BD -:10EBF00000000000A00000000000820000000800EB -:10EC00000000A020000000200020022008000000DA -:10EC100000080000000000000040000000000000AC -:10EC200000000000900000008400000000000000D0 -:10EC300000000000000000000000040000000400CC -:10EC400000000000000000200000000000000000A4 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000001085 +:10EB80000000001000000000000000001000000065 +:10EB90000000000000000000000000000000000075 +:10EBA000000000000000000800080008000000004D +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF000000000000800000000000000000000000D +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000008000800000F4 +:10EC200000000000000000000000000000000000E4 +:10EC3000000000000000900000000000000008003C +:10EC400000000000000000000000000000000000C4 :10EC500000000000000000000000000000000000B4 :10EC600000000000000000000000000000000000A4 -:10EC700000000000000408A00000000000000800E0 -:10EC80000000000000010000000100010000000081 -:10EC9000000000010000000004000000000000006F -:10ECA0000000090000000004000000000300000054 -:10ECB00000000000000000000000008200000000D2 -:10ECC0000000000000000000000004000000000040 -:10ECD000080000000000000000000000000000002C -:10ECE00000000000000000000000210009000000FA -:10ECF0000000000000000000000000000000820092 -:10ED000000000000010800000000000800000020D2 -:10ED10000020008000000008010000000000002129 -:10ED20000000000020002000200020000000000063 -:10ED300020000000C00000000011000000000000E2 +:10EC70000000000000000000000000000000000094 +:10EC800000000000008800000000000000000000FC +:10EC90000000000000000000050009C00520002061 +:10ECA000000000000000000000000000000000C0A4 +:10ECB00000000000000800880000000000000800BC +:10ECC00008C000000000000008000000030003006E +:10ECD0000300000000000000000000000000000031 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000500000000000000080000E6 +:10ED200000000000000000000000000000000000E3 +:10ED3000000000000000000088000000000000004B :10ED400000000000000000000000000000000000C3 :10ED500000000000000000000000000000000000B3 -:10ED6000000000000800000000000000000000009B +:10ED600000000000000000000000000000000000A3 :10ED70000000000000000000000000000000000093 -:10ED8000000011040000200000000000020000004C -:10ED90000085110100080004000110000288020033 -:10EDA00004001100000000000020000080000000AE -:10EDB00000008000000000400040000000000090C3 -:10EDC0000000000000C00500000005000000000079 -:10EDD00000082010000400082000001000100000AF -:10EDE0000008000000000000000200000000000811 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000011000000000000000000000022 +:10EDE00000000000000011001100110011000000DF :10EDF0000000000000000000000000000000000013 -:10EE000000000000000090C00020000890080000F2 -:10EE100000000000000000000000000000000000F2 -:10EE200000000000000000000000000000000000E2 +:10EE00000000000000000000000000000000000002 +:10EE10000000000000000000000000000000900062 +:10EE200090000000820000000000000000000000D0 :10EE300000000000000000000000000000000000D2 -:10EE400000000001000100010000000000000000BF +:10EE400000000000000000000000000000000000C2 :10EE500000000000000000000000000000000000B2 :10EE600000000000000000000000000000000000A2 :10EE70000000000000000000000000000000000092 -:10EE8000000000000000000091800080028080806F -:10EE90000000000000000000000000030900000066 -:10EEA0000000000000000000000000000000000062 -:10EEB0000000000009000000000000000000000049 -:10EEC000000000050008001000080000000000001D +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA00020000000000080000000000000000000C2 +:10EEB0000000000000000000000000000000000052 +:10EEC000000000000000050000000000000000003D :10EED0000000000000000000000000000000000032 :10EEE0000000000000000000000000000000000022 :10EEF0000000000000000000000000000000000012 -:10EF000000000000000000000000001000118090D0 -:10EF100080000000000000000080000400000004E9 -:10EF200000000000000000000000000000000000E1 -:10EF3000000000400000000500000000000000008C -:10EF400000000000000000000000000000000000C1 +:10EF00000000000000000000000000000000000001 +:10EF10000000000000800000000000000000000071 +:10EF20000000000000000000800000000000000061 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000400000004000000000000B9 :10EF500000000000000000000000000000000000B1 :10EF600000000000000000000000000000000000A1 :10EF70000000000000000000000000000000000091 -:10EF800000000000000000000000000088000201F6 -:10EF90009088C000000000080000000200A10000EE -:10EFA0000001000000000000000000000000000060 -:10EFB0000000000000010000000000000000000050 -:10EFC0000000000000000000000000000000000041 +:10EF80000000000000000000000000000000000081 +:10EF900000000000000000080000008400000000E5 +:10EFA00000000000040004002000820000000000B7 +:10EFB0000000000000000000000000000000000051 +:10EFC000000000000000000100000001000000003F :10EFD0000000000000000000000000000000000031 :10EFE0000000000000000000000000000000000021 :10EFF0000000000000000000000000000000000011 -:10F0000000000000000000000000000000000808F0 -:10F010002088002088C000000000400000000000A0 -:10F02000A00000000100000000000000000000003F -:10F03000000000000000000004004000000000008C -:10F0400000000000000000000000000000000000C0 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000020000000000EE +:10F0200000000000000000040004002000C00000F8 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000020000000000BE :10F0500000000000000000000000000000000000B0 :10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 :10F080000000000000000000000000000000000080 -:10F09000808000000000918020000000000000003F -:10F0A0000000000000040400000000000000000058 -:10F0B00000000000000000000000800000000500CB -:10F0C00000000000000000000000000020004100DF -:10F0D0000000000000000000000000000000000030 +:10F09000000000000000000002000000000000006E +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D000020000000000000000000000000000002E :10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 :10F1000000000000000000000000000000000000FF -:10F110000000800980C08080000000000002000024 -:10F1200000000000000000000004000000000000DB +:10F1100000000000000000000000001000080000D7 +:10F1200000000000000000000000000000020000DD :10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000000000110000AE +:10F1400000000000000000000000000000000000BF :10F1500000000000000000000000000000000000AF :10F16000000000000000000000000000000000009F :10F17000000000000000000000000000000000008F :10F18000000000000000000000000000000000007F -:10F1900000000000C000108810408800000000003F -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000000000000000000000004F +:10F19000000000000000000000000000000100016D +:10F1A000000000000000000000000000000000055A +:10F1B000002000000000000000000000000000002F :10F1C000000000000000000000000000000000003F :10F1D000000000000000000000000000000000002F :10F1E000000000000000000000000000000000001F :10F1F000000000000000000000000000000000000F :10F2000000000000000000000000000000000000FE -:10F21000000000000000600600E00700000000069B -:10F2200000000700000000000010000000000000C7 -:10F2300000000000000000000000000000000000CE -:10F24000004400000000000000000000000000007A -:10F2500000000000000000000000000000000000AE +:10F21000000000000000000000000000000000816D +:10F220000000070000000000000000000000004196 +:10F2300000000700000000000000000000000000C7 +:10F2400000000000000000000000000000000000BE +:10F2500000000008000000000000000000000000A6 :10F26000000000000000000000000000000000009E :10F27000000000000000000000000000000000008E :10F28000000000000000000000000000000000007E -:10F290000000000000000000FCFC28EBC0FCBEBE2B +:10F29000000000000000000000000000000000006E :10F2A000000000000000000000000000000000005E -:10F2B000000000000000000000000000000000004E +:10F2B00000000000000055000000000000000000F9 :10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E :10F2E000000000000000000000000000000000001E :10F2F000000000000000000000000000000000000E :10F3000000000000000000000000000000000000FD -:10F3100000000000000000000000C0C028EBC0FC9E -:10F3200082820000000000000000000000000000D9 -:10F3300000000000000000000000000000000000CD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F330000000000000000000450000000000000088 :10F3400000000000000000000000000000000000BD :10F3500000000000000000000000000000000000AD :10F36000000000000000000000000000000000009D :10F37000000000000000000000000000000000008D :10F38000000000000000000000000000000000007D -:10F390000000000000000000000000005555FF00C4 -:10F3A00055550F0F00000000000000000000000095 +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D :10F3B000000000000000000000000000000000004D :10F3C000000000000000000000000000000000003D :10F3D000000000000000000000000000000000002D :10F3E000000000000000000000000000000000001D :10F3F000000000000000000000000000000000000D :10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000F0FCE -:10F420003C3C3C3CFF0000000000000000000000ED -:10F4300000000000000000000000000000000000CC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000003C0038000058 :10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C :10F47000000000000000000000000000000000008C :10F48000000000000000000000000000000000007C :10F49000000000000000000000000000000000006C -:10F4A0001061202F804D000805000A28050000A0EB -:10F4B00000000007000C0000000000000000000039 -:10F4C000000000000000000000610007000D0000C7 -:10F4D0000000000000000000000000610006000DB8 +:10F4A000000000000000000005000A28050000A080 +:10F4B0000000000000000000000000280000000024 +:10F4C000000000000000000000000000000000003C +:10F4D0000000000000000000000000610007000DB7 :10F4E000000000000000000000000000000000001C :10F4F000000000000000000000000000000000000C :10F5000000000000000000000000000000000000FB :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB -:10F5300000000000555500FF000000000000000022 +:10F5300000000000000000000000000000000000CB :10F5400000000000000000000000000000000000BB :10F5500000000000000000000000000000000000AB :10F56000000000000000000000000000000000009B @@ -77676,7 +77676,7 @@ :10F58000000000000000000000000000000000007B :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B -:10F5B000000000000000555500FF000000000000A2 +:10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B :10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B @@ -77684,207 +77684,207 @@ :10F6000000000000000000000000000000000000FA :10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA -:10F630000000000000000000FF00AAAA0000000077 +:10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA :10F6500000000000000000000000000000000000AA -:10F66000FF00FF000000000000000000000000009C +:10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A :10F68000000000000000000000000000000000007A :10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A -:10F6B00000000000000000000000FF00AAAA0000F7 +:10F6B000000000000000000000000000000000004A :10F6C000000000000000000000000000000000003A :10F6D000000000000000000000000000000000002A -:10F6E0000000FF1FFF1400000000000000000000E9 +:10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A :10F7000000000000000000000000000000000000F9 -:10F7100000000000000000000000000000000000E9 -:10F720000000000000004000200400000000000075 -:10F730002000000020000000000000000000000089 -:10F7400040000000840020002000020002000000B1 -:10F7500040020200200002004000000300000100FF -:10F76000400020804000880000002004200020008D -:10F770000000400020000400210020000000840060 -:10F78000880040001000C0000000000001000000E0 -:10F790000000840000000100400041000000000063 -:10F7A0000000000000000000000200000000000057 -:10F7B0000000000000000000000000000040000009 +:10F7100000000000000000000000000040000004A5 +:10F720000000400000000004000020000000000471 +:10F730001000000000000000A000000020000000F9 +:10F740000000200000000000000020000000000079 +:10F750002000000200000000200000010000200046 +:10F760000000000020000000000082004000400077 +:10F77000000020030000000000002000880020009E +:10F780000004000420000000000000002000200011 +:10F79000000020008800000004002000000000009D +:10F7A0000000100000000000000000000000000049 +:10F7B0000000000020000800000000000000000021 :10F7C0000000000000000000000000000000000039 -:10F7D00000009083000040000000000000000000D6 -:10F7E00010004000000200C00000100000004000B7 -:10F7F00000000000000000002000020000000000E7 -:10F800000000400000004000200200000000040052 -:10F810000000000020000000200021000400000083 -:10F8200000000003100300000000000000000008BA -:10F83000040000000210200820002000200020000A -:10F8400005030500054000000000840000000400DE -:10F850000400002004000000000000000000000080 -:10F860000000000001000080000000000200000015 -:10F870000000000000000000000000000040000048 -:10F880000000000000000003000000000000000075 -:10F890000000000000000000000000000000000068 -:10F8A00000040004000800840040008200820082FE -:10F8B00000040082000000048008800080048000B2 -:10F8C0008000A008A040A0080000050009000982EF -:10F8D00080408040000180400040004000400040E7 -:10F8E000000000000004040000020000000080008E -:10F8F00000000000000000000900040000000401F6 -:10F9000000000000000000000000000000000000F7 -:10F91000000000000000000009000040004000005E -:10F92000000000000000000000410000000500038E -:10F9300000080000000000000005000000000000BA -:10F94000000000000000000400210041000410112C -:10F9500090040000C0008800900900000020000012 -:10F9600000000000000900000009000001009000F4 -:10F9700001000000840000000000000000050005F8 -:10F980000000040000080008000200000000000061 -:10F990000000000000410004000000000000000022 -:10F9A0000000000000000000000000000000020055 -:10F9B00041000000210000000000002000000020A5 -:10F9C00041000000000000000000000000000001F5 -:10F9D0000000000100002100000000000000000005 -:10F9E00000000000000004000300000000402000B0 -:10F9F00000001000000000000000000000000000F7 +:10F7D0000000000000000002000000020000000025 +:10F7E0000000400000000000000040000000000099 +:10F7F0000000000000000000000000000002000007 +:10F8000000000000000000000000000200004000B6 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000040000000400040400B8 +:10F84000040000200020000000000000000008006C +:10F850000800001000000210080000100010000056 +:10F860000000000000000000040000000000000094 +:10F870000000000000000000001004000000001064 +:10F880000000000000000000000000000000000078 +:10F890000200000000000000000000000020000046 +:10F8A0000010001000100010000000000000000018 +:10F8B0000000000000000000001000100010001008 +:10F8C0008000800000050001000000000000000032 +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000080000EF +:10F9100000000400000000000000000000000000E3 +:10F92000000000000000000800000000004100008E +:10F930000041000000000000000000000000000086 +:10F940000000000000000002000010000000C000E5 +:10F95000A0000000000000410000000000000000C6 +:10F960009000000000000000000000000000000007 +:10F9700000009000000088000000000090000000DF +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000021000000030003000000000010 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 -:10FA100000000000000004000000000000000000E2 -:10FA20000000000000000000000000008200001143 -:10FA300000000800A00000000000000000000021FD -:10FA40000021820082210400C0000000000000802C -:10FA50000000008000008200C0000000088000005C -:10FA6000020000000200000000200020C0028220EE -:10FA700000020000000000020000C000C0000020E2 -:10FA800000000000000004000000820000000800E8 -:10FA9000080000000000820008000800004100107B -:10FAA00010800011000000000000000000000008AD -:10FAB000000000001100208400820000008200820B -:10FAC0000000004000081110800000000900020042 -:10FAD00000040000110411000000000000000902F1 -:10FAE0000000008400000000000000010001000090 -:10FAF000000100000000000000000000000000A065 -:10FB0000000000900000410000000000000008001C -:10FB100000400000000000000000000000000000A5 -:10FB200000000020050008000300000000000000A5 -:10FB3000A0000000000000000000000000084000DD -:10FB400010100010C008821000089020040004006B -:10FB5000002100410400042000000000000000001B -:10FB60000000000000000000040000000000200071 -:10FB7000400000004000200008008200002010002B -:10FB8000042008000008000800050000002104000F -:10FB90000000000000110000400000000000900084 -:10FBA000000008000800A0000000000000000000A5 -:10FBB00000000000008400000000000000C0000001 -:10FBC00000A0000000000000000000000000000095 -:10FBD00000C00000000080000000000004000000E1 -:10FBE00000000020000000000000000000000000F5 -:10FBF000000000000000002088000020000000003D +:10FA100000000000000000000000000000000000E6 +:10FA200000000000000000000000000000000000D6 +:10FA300000000000000000000000080008000000B6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA7000000000000000000008000000004000003E +:10FA80000000000000000000000000000000000076 +:10FA90000400000000000000000000200000000042 +:10FAA0000000000000000000000000000000000056 +:10FAB00000000000000000000000000000A00000A6 +:10FAC0000000000000000000000000001000100016 +:10FAD00040000000000000000000000000000000E6 +:10FAE0000000000000000000000000000000000016 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000080000000000000000000000000000DD +:10FB200000000020000000000000000000000000B5 +:10FB300000000000000000000000000000000000C5 +:10FB40000000000000000000400000000000000075 +:10FB50008200000000000000000000000000000023 +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000002008000000000400000000000009 +:10FBD00000000000100000000000210000000000F4 +:10FBE0000000000000000000000000000000000015 +:10FBF00000000000001000000000000000000000F5 :10FC000000000000000000000000000000000000F4 :10FC100000000000000000000000000000000000E4 -:10FC200000000000000003000000000000000000D1 -:10FC300000080000080008000000000000000009A3 -:10FC4000000300008208040004000400040900000E -:10FC50000000000020000400C000040004000000B8 -:10FC60000000004100000000000000000000000053 -:10FC7000000000080000010000000040000000003B -:10FC800000000009100484090000000000100010AA -:10FC9000004000400010000000410000001108007A -:10FCA000000004000400000000000000000000004C -:10FCB00000000000000000000082008400820000BC -:10FCC000000800000002000080008000800080002A -:10FCD0000000000002000000910000888000800009 -:10FCE00000000000000000400000000000000000D4 -:10FCF00000000000000100004000000000000002C1 -:10FD000000000000000000000000000000000500EE -:10FD100000000000000000000000000000000400DF -:10FD200000000000C1008040000200000800000048 -:10FD300008000000000000000000000000000000BB -:10FD4000000000000000000000000000001000A003 -:10FD5000909000000000000000001010840200A03D -:10FD60000040000000000200000000000000000051 -:10FD7000000000000000C000000000000341888572 -:10FD80002009828810820004000802088288008806 -:10FD900000042004908800900004900400000000FB -:10FDA00000000000000000000000010000009100C1 -:10FDB00082000000000000000000000000000000C1 -:10FDC00000000000000000000000000002000080B1 -:10FDD00041000000030000001100000091800000BD -:10FDE0000900000003000300000000000000000004 -:10FDF000000000000000400021000000000008C1D9 -:10FE00008010419080808000000000808080000091 -:10FE100000000000000020000000000000000000C2 -:10FE200000000000000000000000000011000300BE -:10FE300089008300000000000000000000000000B6 -:10FE400000000000000000000000000000000008AA -:10FE50000011000500000040008000400080800884 -:10FE600000218040000000000080000000800000B1 -:10FE70000000000000000000000000800000000002 -:10FE8000108000891091418080000090000800805F -:10FE9000000000A000008080800000A180000080A1 -:10FEA00000000000000000000000000000000080D2 -:10FEB000088005004011410900000000000000001A +:10FC200000000000000000000000000000000000D4 +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000008000000000000000000AC +:10FC50000000000082000000000500000005000018 +:10FC60000041000000410000000000000000000012 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF00000000000000000000000000000080000FC +:10FD000000042000000000000000000005001100B9 +:10FD100000000000000000000000000400080000D7 +:10FD20000800110011201100110000000000000067 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000080000000800000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 :10FEC0000000000000000000000000000000000032 -:10FED00002011000004120040001000400010004A0 -:10FEE0000201100040030000000000200000000498 -:10FEF00000000000000000000000000000C0000042 -:10FF000000C0890204C0051185C0400002C19040B4 -:10FF100084C0040090C1908204C0080084C01020F6 -:10FF200008C00000000000000000000000400000C9 -:10FF300000040140018801010109000000000000E7 +:10FED0000000000000000000000000080000000812 +:10FEE0000000000000000000000000000000000012 +:10FEF0000000000000000000000000000000000002 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 :10FF400000000000000000000000000000000000B1 -:10FF5000000010100420000240880000C0000400CF -:10FF600001001010200200020090000000000400B8 -:10FF70000000000000000000000000000001080177 -:10FF8000C0010001C1888202C105029111088210DE -:10FF9000C010021021108210C00491C0A10400887A -:10FFA000C00802080000000000000000010000007E -:10FFB000C00000000100000120010001000000005D +:10FF5000000000000000000000000000000002009F +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 :10FFC0000000000000000000000000000000000031 -:10FFD0000000000000800080000004000500800098 -:10FFE0008000100000008000008005000502000570 -:10FFF00080410020000000000000000000002108F7 +:10FFD0000000000000000000000000001000000011 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000000001 :020000040013E7 -:10000000801080084141418380008810C1C14100B7 -:1000100080808080C180410080008080020041009B -:100020000000808080000000000000000000100040 -:100030000000000000001009004000110041000015 +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 :1000400000000000000000000000000000000000B0 -:100050000000000000000010808800008000000008 -:10006000000800000000000400080000000000403C -:100070000008000000000000000000000000000078 -:1000800000000004000000004108108000008810FB -:10009000000000000000000000038080000000005D +:10005000000000000000000000000000000000059B +:10006000000300000000000000000000000000008D +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 :1000A0000000000000000000000000000000000050 -:1000B000000800080000000041804008050003110E +:1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 -:1000D00000000000000000000000201090900400CC -:1000E000000000000000000010014002822000001B +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 -:10010000000000000001000000008500C1208420E4 -:10011000090104002002049010008400201008C08F -:100120008800C000C0022088C0000000000000005D -:100130000000000100010000000001880100000033 -:1001400000010000000000000000000000000000AE -:1001500000000000000000000000600000E0070058 -:100160000000880000E00700500000000042070087 -:100170000000000000000700000000000000000078 -:10018000000000000000000008008221410000E0A3 -:10019000000048420000000000004842000000004B -:1001A000000048420000000000004842000000003B -:1001B000000000000081000007000000884100E00E -:1001C0000700000000000000000000000000000028 -:1001D000000000000000000000000000303030305F -:1001E000FFC0FF000000000000000000F0F0F6F08B -:1001F000E666C000000000000000000000000000F3 -:100200000000000000000000000000000000284185 -:100210000000A0000500A005000028410000A0008B -:100220000500A00000A0220011002010040800001A +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:100160000000008100000700000000000000000007 +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE -:1002500000000000000000000000000000007630F8 -:100260007630C0C000000000000000000000000068 -:100270006600E666C000000000000000000000000C +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E -:100290000000284100A000050000A0050000284142 -:1002A00000A00005050000050022001140800201A9 +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E @@ -77896,233 +77896,233 @@ :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D -:1003600000002F242F24666667670000000000004D -:10037000000000003C3C607C607C0000000000004D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D -:100390000000000000008844010802040500000578 -:1003A000400220040000A0050088004400A00005D1 -:1003B00040200204000000000000000000000000D7 +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D -:1003E0000000000024242424000003030000000077 -:1003F00000000000000F3C3F003C003C00000000FB +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC -:100410000000000000008844000080104020A00080 -:1004200000A080011008A005000088004400A00082 -:10043000050080100108000000000000000000001E +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C -:100460000000000000000061000F800D0000056129 -:100470000A0F850D00A00061000F000D000005614E -:100480000A0E050D00A000000000000000000000A2 -:1004900005610A0E050D00A060000001800010003B -:1004A00000000000000008006000000000001000D4 -:1004B0000000000000000800000000000000000034 -:1004C00005000A28050000A005400A2D850000A0AF +:100460000000000000000000000000000000050087 +:100470000A28050000A000000000000000000000A5 +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC -:10050000000000003C7C7D7D000000000000000039 -:10051000000000000000FC3CFF3C003C00553C009B -:10052000AA00000000000000000000000000000021 +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB -:1005400000000000000000000000FF3C550F303F9D -:10055000FAFA0000000000000000000000000000A7 +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B -:100580000000000000003C7C3C7C000000000000FB -:100590000000000000000000FC3C3C3C003C00551A -:1005A0003C00AA0000000000000000000000000065 +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000003C550F8B -:1005D000303F0A0A00000000000000000000000098 +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA -:100610000000000000000000000000000000F000EA -:10062000F0F0AA003C000000000000000000000004 +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA -:1006500000003CAAF0FF00000000000000000000C5 +:10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A -:1006A000F0000000AA003C00000000000000000074 +:1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A -:1006D000000000003CAAF0000000C000C0000000C4 -:1006E00000000000880020000000C000000000089A -:1006F000200000000000A0020000200020001000E8 -:100700004000001000052008000420008800C00000 -:1007100020000004000420A000030400400020008A -:100720002000A000C000C000200088008800200237 -:10073000200004001000000420202000200084007D -:100740002000400020008400A000A0000000C000A5 -:100750002000C0008800C00488A000C00000000085 -:100760000000000000401000008240000000000077 -:100770000000000000020000000000001000000067 -:1007800000000000000000021082400210000090F3 -:1007900000000002000200410011000010000000F3 -:1007A0000090000020000000000040004000000019 -:1007B00000000000000040004009000100000000AF -:1007C0000000000009000000000000000008000018 -:1007D00000200020000000000001001100000000C7 -:1007E00000000000100900000009040010000000D3 -:1007F0000000000000000008100011400000000090 -:100800000040000000080000020002030000000099 -:1008100000000000000000001000210200000000A5 -:1008200000000000000000050000000000000000C3 -:1008300000000000000000000000008800820000AE -:1008400000000000000000000000020002000000A4 -:100850000000000000000000000082881004000872 -:10086000000800840084008400080082098200845B -:10087000000800820084000800848000C084008496 -:1008800000840084000800840008000800000008BC -:10089000008800900008001000848084908500008B -:1008A000008400840000009000040008008400849C -:1008B00000882082000000842040004000210411B4 -:1008C000000000020000000000000082000009009B -:1008D000000800002000000000000000002180014E -:1008E00000210021000802080008000300080000A1 -:1008F00000088421880990050021C0000000000044 -:100900000008000800000011000800050000004178 -:10091000880388058805000004080000040800001A -:100920000000001100000000000000000021004154 -:100930000002000800210000000000210021002129 -:10094000002100080021000800030003000900093D -:100950000004000000110000000000000000000082 -:10096000000000000000000000C000000000008443 -:1009700000C0000000C0000808C000000010000017 -:100980000000009000000000030000000082000052 -:10099000020000040000000000820000000080004F -:1009A00000080000000009000900090010200000F4 -:1009B000110040004000000008000500048800000D -:1009C000040004C0001040100000000000000000FF -:1009D0000004000200000800030000000000000006 +:1006D000000000000000000000000000000000001A +:1006E00000000000000800080000000020000000DA +:1006F00000000000008800900000000000000002E0 +:1007000000000000000200020000000020000000C5 +:1007100000000000000400A000030005000000002D +:1007200000000000000000000000000000002000A9 +:10073000000200000000000000030000C0000004F0 +:10074000000400000000040004008800C000200035 +:100750000000C000C0000000008800000000000091 +:100760000000000000000000000021000000000068 +:10077000000000000000000400210000000800004C +:100780001000400000000000000000080000000011 +:100790000000000000000001001100000000000047 +:1007A00000000000000000001002008400840084AB +:1007B0000084000800821000008400A000000000F7 +:1007C0000000100000000000004000004000000099 +:1007D0000000000000000000000000050000000014 +:1007E00000000000000000000010001000000000E9 +:1007F0000000000000000000108041040000000024 +:100800000000000000400040000800080000000058 +:100810000000000000000000108040040000000004 +:1008200000000000000000000000000000000000C8 +:100830000000000000000000000000000080000038 +:1008400000000000000000000000000000000000A8 +:10085000000000000000020002000200020000028E +:1008600000840008000800000000000200040010DE +:1008700000100040004000000000802090090008A7 +:100880000008000800080000000000040004000840 +:10089000000800080084000000008020808500001F +:1008A0000084008400100010000800000084008212 +:1008B0000082008400840000000000000084000822 +:1008C00000000000000000000040000000000000E8 +:1008D00000000000000800080000000000080008F8 +:1008E00000000000000000210005000000050000DD +:1008F000000000080003000800210021002100037F +:100900000021002100210021000900040004001141 +:100910000004000900040011000000000000002095 +:100920000000000000000000004000000000000087 +:1009300090110040004000000021882100210008A3 +:10094000048800020021002100210021000300048E +:10095000000800000011001100210021000000210A +:10096000000800000000000000000000000000007F +:100970000000000000000000000000000000000077 +:1009800000000000000000000000000800000088D7 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000200000000000000000035 +:1009C0000000000400000000000000000000000023 +:1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000080000000000EF -:100A00000000020400000000C00000000000000020 -:100A1000000000208800000000020000000000002C -:100A2000000000000000820008000000000000003C -:100A30000000000004110021C0000021000002009D -:100A4000C000000082840000820008000000000056 -:100A5000900000000820C00084000000C04010008A -:100A60000000000010C000000000000000000000B6 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000008000000000000000000000000BE +:100A3000000000000000C0000000000020000000D6 +:100A400000000000000082008400000000000000A0 +:100A5000000000000000C041C000A0000000C00075 +:100A6000C0000000000000000000000000000000C6 :100A70000000000000000000000000000000000076 -:100A800000000008000900C0000000C00340000092 -:100A9000000008000000000000000000000000004E -:100AA0000000000000000000020021000000000023 -:100AB0000000000000000000000000000000000036 -:100AC000000000000000000900000000000000001D -:100AD0000000000008000000004000000840008402 -:100AE0000000000000000002000000000000000004 -:100AF0000000020040000000000200410802000067 -:100B000000000000000008210000000000000000BC -:100B100000000000000010000010000000050000B0 -:100B20000000000000200020000000000000840001 -:100B300000000000C008A0000000000000218400A8 -:100B400000000000000000000000000000000000A5 -:100B500000000800820000020000080000110000F0 -:100B60000011080008000000000000000000000064 -:100B70000000000000000000000000100000000065 -:100B8000000000020000400000000084000021007E -:100B90000000000000000800002000041100000018 -:100BA00000820000000000000000000010020008A9 -:100BB0000084001004024004000205200500090022 -:100BC00011001100051040100204000010000090F8 -:100BD00040100910040000000000000000C00004E4 -:100BE0000088210000000004000008000000000050 -:100BF00000000000000000000000200000000011C4 -:100C00000041844100080000200000100000900016 -:100C10000200020000400000000000000000000888 -:100C2000000000020000200800100000000000008A -:100C300000009000000000008400842000000000FC -:100C4000000000000021004000090000000000003A -:100C500000000000000082000800080010000000F2 -:100C6000100000000000900000000000C010000014 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA000000000080001000000000000000000003D +:100AB000000000000000000000000000000800002E +:100AC00000001100000000A0000000000000000075 +:100AD0000000009000A000000000000000000000E6 +:100AE00000000000000000A002000004000400005C +:100AF00000000000000000030000000000030400EC +:100B0000000040200402002140000000000400001A +:100B100000000000000000210000000000000000B4 +:100B200000000000000000000000000000000000C5 +:100B30000000000002000000000000000000004073 +:100B40000008000000000008001100000000000084 +:100B50008200000040004000400000081000C0007B +:100B600000088800001100080000000000000000DC +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA000000000000000000000080000000000003D +:100BB0000000000000000000000000820982000028 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE00000000000000000000000000000080008F5 +:100BF00000000000000000000000002100080000CC +:100C000000080003000500000000000000030000D1 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C4000000000080003000900000021004100002E +:100C500000000008000000000000C00000000000CC +:100C60000000000800030000000000000000000079 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 -:100CC00000000000000000000000000000000040E4 -:100CD0000000000000000000000000000000000014 -:100CE00000000200000009000000000000000020D9 -:100CF000000000000000000000000000000000886C -:100D0000000020000082C00400000000000100007C -:100D100000000000000000010000000000000108C9 -:100D20000100C0000020C0820000C00000010000DF -:100D300000000000000000000000000000000000B3 -:100D400001100000C0000004C0820000C0000001CB -:100D50000000000000000000000000000000000192 -:100D600001100000C0000004C0820000C0000001AB -:100D70000000000000000000000400000000000966 -:100D800009000903110000800080000000000041FC -:100D90000000000000000000000200000000001140 -:100DA000208041118400000080800000800000034A -:100DB0000000000000000000000000110000000022 -:100DC000000208800009830000808080000080000D -:100DD0000003000000000000000000100000000000 -:100DE000000808800005C0000080808000008000AE -:100DF00000030000000020000000000000000900C7 -:100E0000000011001100C1000010020000000000ED -:100E1000000080080000080000000000000004003E -:100E2000000040001000108000000300800000005F -:100E300000808002000000000800000000000000A8 -:100E40000800000009000300850000100300800076 -:100E5000000000A080410000080000000000000029 -:100E600008000000100003000500000003008000DF -:100E7000000000A080410000000000000000000011 -:100E8000000000000000100020020001010002002C -:100E900000000000C0010000010000000000000090 -:100EA0000100000001009000030800000100100094 -:100EB000000000C0820100000000000000000000EF -:100EC000000001000000000090004004000001004C -:100ED00040000000008282010000000000000000CD -:100EE0000000010000000000900020C00000010090 -:100EF00040000000008282010000000000000000AD -:100F000000000000000104010002000001000000D8 -:100F100000000000000100000000000000000000D0 -:100F200000000000000105000088000091000000A2 -:100F300000000000000000000000000000000000B1 -:100F4000000000000000000102000082000001001B -:100F50000100000000000000000000000000000090 -:100F60000000000000000001080000A000000100D7 -:100F70000000000000000000000000000000000071 -:100F8000000000000000004000400080000002005F -:100F90000900000000000041000000000000000007 -:100FA0000000000000000005824000000000410039 -:100FB00000000000000000410000000000000000F0 -:100FC0000000000000000000000800100080000089 -:100FD000410010000000000000410000000000007F -:100FE00000000000000000000010001000000000E1 -:100FF00041000000000000000041000000208000CF -:1010000000C1000000040000410000000041800019 -:101010000008000000000000000010A00008800090 -:1010200000C1000000008000050000000091800069 -:10103000000800000041000000000420000000083B -:10104000800000C100000002000084100000004188 -:10105000800000080000004100080000081000089F -:10106000800000C100000011000088000000004165 -:10107000000000030000004100050000038800009C -:101080002000004000000000C0000400000000112B -:1010900082000001000000000000000001040001C7 -:1010A000200000400000000004008200000000401A -:1010B0002000000000000001000000000188000086 -:1010C000000020000040000000000200400100007D -:1010D000000982000000000000010000000001097A -:1010E00000002000004000000000880040000000D8 -:1010F0000009200000000000000100000000008343 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000300000000000000000011 +:100CE0001100110009881100000000000000000040 +:100CF00000000000000000000000000000010008EB +:100D00000001C0000088C0820000C0000001000097 +:100D10000000000000000000000000000000009043 +:100D20000001C1000020C0820000C00000010000DE +:100D3000000000010001000100C00001100100C11D +:100D4000010900000001008400080001C00100C08A +:100D5000000000010001000100C00001100100C1FD +:100D6000010900000001000400100001C00100C0E2 +:100D70000000000000000000000900000000000862 +:100D800003800008820000008080000080000003D3 +:100D900000000000000000000008100000000041FA +:100DA000030000088800000080800000800000032D +:100DB00000000000004100410041008200418041EC +:100DC00000C003C10011114100800080004180413A +:100DD0000089000000410041004100820041804143 +:100DE00000C003C100030341008000800041804136 +:100DF0000089000000001100000000000000020057 +:100E000000000400880090000000030000000000C3 +:100E100000808010000003000000000000000800B7 +:100E2000000008000200A000000003000000000015 +:100E3000008080410000410003000000008041006C +:100E4000C00000000800890082000090A00041005E +:100E5000C1000080800041000300000000804100CC +:100E6000C10000200800200020000080A0004100F8 +:100E7000C1000080800000000000000000000000B1 +:100E80000000000000000800820200000190020043 +:100E9000000000C08201000000000000000000000F +:100EA0000100000001000300820800000190900092 +:100EB000000000828201000201000100000000C069 +:100EC0000100C10000000100020040900008C18440 +:100ED0009100C1000008820001000100000000C074 +:100EE0000100C00000010100400008900002C000A5 +:100EF0009100C10000088200000000000000000016 +:100F000000000000000020010110000001000000AE +:100F100000000000000000000000000000000000D1 +:100F200000000000000082010090000001000000AD +:100F30000000000000000000000000C00001C0C16F +:100F400000000000000100C010030091000100C17A +:100F50000000000000010000000000C00001C0C14E +:100F600000000000000100C010030091000100C15A +:100F70000000000000010000000000000000000070 +:100F80000000000000000002800810800000410006 +:100F90000000000000000041000000000000000010 +:100FA00000000000000000080008000000004100F0 +:100FB000000000000000004100000000008000412F +:100FC00080C100000000004100C100080041004154 +:100FD00000C1000000000041000900000080004145 +:100FE00080C100000000004100C100080041004134 +:100FF00000C1000000000041000900000011800055 +:10100000000200000000001003000000004100008A +:101010000002000000410003000003030003800001 +:1010200000C1000000000008820000000041000034 +:101030000008000000410008000020080000C10076 +:10104000800080C100004102000090004100C141C9 +:101050000000800200004100000080004100C1004B +:10106000800080C100004102800082004100C14137 +:1010700000008010000041000000800041000000DE +:10108000200000020000000002001100000000919A +:1010900010000000000000010000000001900000AE +:1010A00020000040000000000801830000000091C3 +:1010B0009000000000000001000000000009000096 +:1010C000C1004000C0C10000010002000800010092 +:1010D000C1110200C000000001000000C0000100BA +:1010E000C1004000C0C10000010010000800010064 +:1010F000C1419000C001000001000000C0000100DB :1011000000000000000000000000000000000000DF -:10111000811200E00700480000000000000000000D +:10111000811200E007004842000000000000484241 :1011200000000000000000000000000000000000BF -:10113000881200E0400048420000000000004842E1 -:10114000000000000000000000000000000000009F -:101150000000811200E0040048420000000000008E -:1011600048810000000000000000000000000000B6 -:101170000000811200E0080048420000000000006A -:10118000480A00000000000000000000000000000D +:10113000811200E0070048420000000000004881E2 +:10114000000000000000000000420000000000005D +:10115000000081120041070048000000000000006C +:1011600042000000000000000042000000000000FB +:10117000000081120041070048000000000000004C +:10118000420000000000000000000000000000001D :10119000000000000000000000000000000000004F :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F @@ -78138,11 +78138,11 @@ :10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E -:10128000000000000000757B00000000000000006E +:10128000000000000000257B0000000000000000BE :10129000000000000000000000000000000000004E -:1012A00000000000DEAE757B0000000000000000C2 +:1012A00000000000DEA4257B00000000000000001C :1012B000000000000000000000000000000000002E -:1012C00000000000DEAE0000757B000000000000A2 +:1012C00000000000DEA40000757B000000000000AC :1012D000000000000000000000000000000000000E :1012E000000000000000DEAE757B00000000000082 :1012F00000000000000000000000000000000000EE @@ -78150,238 +78150,238 @@ :1013100000000230A0000000000000000C400000AF :101320000000000002C06486612603400000000047 :1013300000000230A0000000000000000C4000008F -:101340000000000002C06486000061260340000027 -:10135000000000000230A0000000000000000C406F -:1013600000000000000002C0648661260340000007 -:10137000000000000230A0000000000000000C404F -:1013800000000000000002C06486001000000000A1 -:101390000210000200021000100000020005000010 -:1013A00040004002C00000001004000500000000E2 -:1013B0002004A000A0001005200040004000100004 -:1013C000200000004000400020000003000000005A -:1013D00000000000200088002000200020002041A4 -:1013E0002000880400002000200020024000880027 -:1013F00000000400040020000400A00040001000D1 -:1014000084001000400010001000200000000000C8 -:10141000000010000000000000000000000040007C -:10142000000209000000000040000000000200006F -:101430000000000000004000000040000004000028 -:1014400040020002400200000002000000004000D4 -:10145000080811002000000000000000000000004B -:10146000000040002000400200000090000000004A -:1014700000000002000020000000400020002100C9 -:10148000200000000000104020204002000000006A -:1014900000000000000082000000000000000000CA -:1014A000000000000000040004000400040000002C -:1014B0000000080000000000000000000000000024 -:1014C0000000040004000000000000000000000014 -:1014D00000000000000000002100210005100500B0 -:1014E00001000100200020000000000002000000B8 -:1014F0000000000000000200000000000200900058 -:1015000008000080000040090200024100000200C3 -:101510000084000800080084000800080004000897 -:101520000008001000880088800080848000808887 -:10153000000800840084000000080008000400087F -:10154000000204020000000000000000000000048F -:101550000000009000080000000084088408A0003B -:10156000A008200020008000820000000000000091 -:101570000000000000020000000000900084000055 -:10158000009080000040000080000000000000404B -:10159000000000000000000000000000000800083B -:1015A0000100004000088800001000000000040254 -:1015B0000000000000080200900000000020400031 -:1015C00000000011000940110000000000000003AD -:1015D00000000000000000000400000002001000F5 -:1015E000000000000000400040000000000000007B -:1015F0000000C000000000000000400004000000E7 -:1016000008000000000000001000000000000020A2 -:10161000C0008400000000A00000000000000401E1 -:1016200000004000000000000082008808820000E6 -:101630000040000000040000000000000000000066 -:101640000900110000000000000000040800000074 -:10165000400000000000000040000900400004209D -:10166000000010001100042000000890001000008D -:10167000002000000000000000000000000000004A -:1016800021002182000011000082082000200000BB -:101690000000000000000000000000000800000042 +:101340000000000002C06486000060C603000000C8 +:10135000000000000031E0000000000000000C0070 +:1013600000000000000000C0630660C6030000002B +:10137000000000000031E0000000000000000C0050 +:1013800000000000000000C06306200000002000F4 +:101390000004200004002000200020000000A00421 +:1013A00000000000000000042000200000002004D5 +:1013B000000020082000400820082000000000084D +:1013C0000000000000008800200000020000000073 +:1013D00020000000000020002000200090000000FD +:1013E00082009000000000000000C00000800000AB +:1013F00020000000C00020002000200040800000ED +:10140000C0082008000000000000400000000000AC +:1014100000000000000000000000000000000000CC +:101420000800100010000000000000000000000094 +:1014300000000000000000000002000800000000A2 +:1014400040000000000000004000000000004000DC +:10145000400000400000000000000000000000000C +:101460000082000000000000000000020000404078 +:101470000000000000000000000000020000000862 +:101480000000000100030000000200000000000056 +:10149000000000000000000000000000000000004C +:1014A00000000840201000040000000000000000C0 +:1014B0000000000000000840000000100010004084 +:1014C000004000400040000000400040004000009C +:1014D00000000040020000400840004002000840B8 +:1014E00000400040004000400000000000000000FC +:1014F00000000000000000000000020008400200A0 +:1015000000000000000000000000000200000000D9 +:10151000000000000000000000100000001000109B +:1015200000000000000800000008000800000000A3 +:101530000000000000100000008400400040004057 +:101540000000000000880000000800080000000003 +:1015500000000000000000000000000800080088F3 +:101560000082200000000084000000080008000045 +:1015700020000000000000000000000800840000BF +:10158000000800000000000000000002000400004D +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000A021000000000000000000020020001137 +:1015C0000009000000000000000000110000000001 +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000041000000000000AA +:1016000000000000000200030000000000080008C5 +:10161000000000000000000000000090000000003A +:1016200000000000000000400084000000A000A0B6 +:101630000000000000000000000400000000200086 +:101640004100008800000000000000004000000091 +:10165000000000000000000000000000000000008A +:101660000000000000000000000000A000C0008892 +:1016700011020000000000880000000000880588BA +:1016800011000000020008000900000000C0000076 +:101690000000000000000000000000080000000042 :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A -:1016C000000000000000000000000000000000001A -:1016D00008000000000000000200020002001000EC -:1016E00000000000000000000000A0008400004195 -:1016F000001100000008000000000000000084004D -:101700000041000008410000080000000005080436 -:1017100000110000000000000000000000000000B8 -:1017200000000000000000000800000000000000B1 -:1017300000000000000000080000000000000000A1 -:10174000000000000800400000000000000200004F -:101750000000000000000020000000000000000069 -:101760000000000000000000000000000008000071 -:101770000000000000000000000000000000000069 -:101780000000000000000000000000000200000057 -:101790000000000000000000000000000000C00089 -:1017A00000000000000000000000000000008800B1 -:1017B00000000000004000000000000000000000E9 -:1017C0000004000000000000000000000000000015 -:1017D00000000000000000000000000000000011F8 -:1017E0000000000000000000400000009000000029 -:1017F00000000000000000000400000000000000E5 -:1018000000000000000008000000000000000003CD -:101810000000088000200000080088000000000090 -:1018200000000000001000000000000000000200A6 -:101830000000009000000001000000880400000883 -:1018400000002100000000000000110011000988C4 -:1018500000000900009000000000000000000200ED -:1018600004000200000000080008082000084000F2 -:1018700000000504032000900004000000000000A8 -:10188000400040001000000409A00004008800008F -:101890000400008488100004000000000900000813 +:1016C0000000080000000000000000000000000012 +:1016D0000000000000000000080000000000000002 +:1016E0000800000000000000820000000000000070 +:1016F000000000000000000000000000900000005A +:10170000000001000000000001000100010991112A +:1017100000000000000000000000000000000000C9 +:1017200000000008000800080000000000000000A1 +:1017300000000000000000000000000000000000A9 +:101740000000000800000000000000000000000091 +:101750000040000000000000000000400000000009 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000002000067 +:101780000000000040000000000004880400040085 +:101790002000000000000000000000000000000029 +:1017A0000000000000000000000000000000000039 +:1017B00000004000000000000000000000000000E9 +:1017C000C000000000000400000000000000000055 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F000000000008200000008000000000000005F +:10180000A0000000000400040020000000200020D0 +:101810000000000000400000000000000000000088 +:101820000000050000080000000000A00900009072 +:10183000400004040000000005000000000000005B +:101840000000050000A00004059000200900419060 +:10185000089040000002000000004000000000006E +:101860000000000000000008000000000008200048 +:101870000000000020000000000000000500000043 +:10188000000000001100000900010001000808012B +:101890000901050008000000210000000800000008 :1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000800000020 +:1018B00000000000080000000000002100000000FF :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 -:1018E0002000200020002000400008000000000030 -:1018F00000000000002000000000000000000000C8 -:101900000000C00082000000000000000000000095 -:101910000000000000000000000000008202000043 +:1018E00000000000000000000000000000000000F8 +:1018F000000000002000000000000000A000000028 +:10190000000000009000000004210000000400041A +:101910000000100400200120000000000000000072 :1019200000000000000000000000000000000000B7 -:101930000000000000000000000000000000800027 -:101940000000000000000000000000000000000295 -:101950000000000000020000000000200020000045 -:10196000000000000000000008000000000000006F -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000110000000200020000000000000032 -:1019A0000000000000000000000000000000200017 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000002000000000000000210026 +:101980000000000000002100000080004100210153 +:101990000001210080000801040100000000000097 +:1019A0000000000000000000000000000000000037 :1019B0000000000000000000000000000000000027 :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000001000000F6 +:1019E00000000000000000000000000000000000F7 :1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A10000000000001000100840000000000000040 -:101A20000000000000000000000000000000200096 +:101A000000000000884000040008080200C0909117 +:101A10000000000001C0089000000000000000006D +:101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 :101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000020074 -:101A700000004100000005000000410000000000DF -:101A80000000000000000000000000000000000056 -:101A90000000000000001000030000000000000033 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A8000000000000000000000000080808011C104 +:101A9000808305090009118000A1000000000000FA :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 -:101AC0000000000080000000000000000000000096 +:101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 :101AE00000000000000000000000000000000000F6 -:101AF000000400800005008000400000004000005D -:101B000000000000000000000000000000000000D5 -:101B10000000000000000000800000210000000024 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000009000000080C5 +:101B100000100000004180830008000091038080D5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 -:101B4000080008840800C0840000000000000000B5 +:101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B7000000000010004000000040000000000005C -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000002000200888435 -:101BA000081000000000000000000000000000001D -:101BB0000000000000010000000100000000000023 -:101BC0000000000000000400000000000000000011 +:101B60000000000000000000000200000000000073 +:101B70000000000000000000000000000000000065 +:101B800000000000000000000000000000820002D1 +:101B90000010000000000000C0910000000085015E +:101BA000C0900000000000000000000000000000E5 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 -:101BF000000000000000820008000100000040001A -:101C000000000100000000000000000000000000D3 -:101C100000000000000000000000000000000000C4 -:101C2000A000000000000000000000000000000014 -:101C30000000000000030008000200410000000056 -:101C40000000000004000000000000000000000090 +:101BF00000000000000000000000000000000000E5 +:101C00000000000000000000000000000290002022 +:101C1000820808880000C000049001C0000088000D +:101C2000009101C000000000000000000000000062 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 -:101C700000000000000005000000800004000000DB -:101C80000000000004000000000000000000000050 -:101C9000000000000000000000000000000000083C -:101CA0000041002000400000000000000000000093 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C900000808080800000009100918041800000E1 +:101CA0000000008808800000000000000000000024 :101CB0000000000000000000000000000000000024 -:101CC00000000000000000040021000000000000EF +:101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000002002100000000C1 +:101CF00000000000000000000000000000000000E4 :101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D20008000000000000000000000000000000033 +:101D10008003001180008000A1112141008000009B +:101D20008011914000000000000000000000000051 :101D300000000000000000000000000000000000A3 -:101D400000000000000000000001008800100000FA +:101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 :101D60000000000000000000000000000000000073 -:101D70000000000000000000000000010000000062 +:101D70000000000000000000000000000000000063 :101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000400008901088900000000000000033 +:101D90000000080010000800080091010000008405 +:101DA0000000C00121000000000000000000000051 :101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000060000070006 +:101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 :101DE00000000000000000000000000000000000F3 -:101DF000000000000000000000000000418200E040 -:101E000007000000600000E000000000000000008B -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000060420041DF +:101E200082008241000A00E0820000000000000001 :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 :101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA000000000000000F0AAF0AA000000000000FE +:101E900000000000000023E32FEFEBFFFFFF000036 +:101EA000FFFF000000FF000000FF000000FF000037 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 :101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000003C003CFF000000003A +:101F1000000000000000000020E02CECF0FFF0FFCB +:101F20000000FFFF000000FF000000FF000000FFB6 :101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 -:101F50000000000075555D55000000000000000005 +:101F50000000000000000000000000000000000081 :101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 :101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 +:101F900000000000000000000000FDADF8A8FFFFF9 +:101FA000FFFFFF000000FFFF0000FF000000FF0038 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 -:101FD00000000000000030000C00000000000000C5 +:101FD0000000000000000000000000000000000001 :101FE00000000000000000000000000000000000F1 :101FF00000000000000000000000000000000000E1 :1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:102030000040000000000000000000000000000060 -:102040000000000000610006000D0000000000001C -:102050000000000005000A28050000A5000000009F +:102010000000000000000000000000005D0D5808F6 +:10202000FFFFFFFFFF00000000000000FF000000B6 +:10203000FF000000000000000000000000000000A1 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 :102060000000000000000000000000000000000070 :102070000000000000000000000000000000000060 -:1020800000000000000005610A2F850D00A000611E -:102090000007800D000000000000000000000000AC -:1020A00000000000000000000000000000000061CF -:1020B0000006000D0001000000000000000000000C -:1020C0000000000000000000000028F882F200007C +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A000000000C000000363033FCC0D92C0038218 +:1020B000033E0C0C8AC0000000000000000000007D +:1020C0000000000000000000000000000000000010 :1020D0000000000000000000000000000000000000 :1020E00000000000000000000000000000000000F0 :1020F00000000000000000000000000000000000E0 :1021000000000000000000000000000000000000CF :1021100000000000000000000000000000000000BF :1021200000000000000000000000000000000000AF -:10213000000000003CE8FFE8000000000000000094 -:1021400000000000000000000000000000F000F0AF +:102130000000FF0000FF00000000000000000000A1 +:10214000000000000000000000000000000000008F :10215000000000000000000000000000000000007F :10216000000000000000000000000000000000006F :10217000000000000000000000000000000000005F :10218000000000000000000000000000000000004F :10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B00000000000000000E8C3E80000000000008C +:1021A00000000000000000000000FF000000000030 +:1021B00000000000FF0000FF000000000000000021 :1021C000000000000000000000000000000000000F :1021D00000000000000000000000000000000000FF :1021E00000000000000000000000000000000000EF @@ -78389,7 +78389,7 @@ :1022000000000000000000000000000000000000CE :1022100000000000000000000000000000000000BE :1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E +:10223000000000000000FF0000FF000000000000A0 :10224000000000000000000000000000000000008E :10225000000000000000000000000000000000007E :10226000000000000000000000000000000000006E @@ -78397,194 +78397,194 @@ :10228000000000000000000000000000000000004E :10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C00000000000000020000000200020000005A9 -:1022D00000100000A00002004000000202808410F4 -:1022E0000000000000004000000000002000C000CE -:1022F000000000002000010020000000000041005C -:102300000000001101000003000440000000200054 -:10231000208040092080200040002000C0000000F4 -:102320004102000000001000000004000000200036 -:102330008800002000000000400020000000000095 -:10234000200000000000000040000000000000002D -:1023500000000000000000000000800000010002FA -:102360004000000000C00400200000000000000247 -:10237000000400020002089020001000000000028B -:1023800020020000000020C0000020C1000000006A -:10239000000000081000C10800001000000000004C -:1023A000009040010090000040000000400000004C -:1023B00000000400000000000400200000000000F5 -:1023C00000004000000000000400000000000000C9 -:1023D00000000000000000000000020000000000FB -:1023E00001000000000002000000000000400000AA -:1023F00000000000000090000800C0000100200064 -:102400002000000000000100000000001000100487 -:1024100011002088000000000800080020002000B3 -:10242000200008040000000000000200000000007E -:1024300000000000000000000800821004000400FA -:102440000400040000000000020000000000000082 -:102450000000000000080000000004100000000060 -:102460000010108800840000000000100000000030 -:1024700000820000000400000000040000022000B0 -:102480008000850000100000200000000000800097 -:102490008001A000802100000000000000008000FA -:1024A00080008000800100000000000003000000A8 -:1024B000000000000000000000000000000080009C -:1024C0008000800080000000000000000000880004 -:1024D000000000000000000000009000000000006C -:1024E0000000000000000008000040009000000014 -:1024F00000000000000000110000000000000000CB -:1025000040000000900000000000000000000000FB -:10251000000010000000C000900040802000040077 -:10252000C000A0000000C0000000100004008200F5 -:10253000900008210400002100000000000040007D -:102540004000A0100800001000200000C0000000A3 -:10255000000040900508000000000000000000009E -:10256000000040000000000000000000000000002B -:102570000000000000020000000000000000000059 -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000804002F -:1025A000000000000000000000000000000000002B -:1025B00004000000000000000000000000004000D7 -:1025C00000000000000000004100000000000008C2 -:1025D00000000000000000000000000000000000FB -:1025E00000400000000000000002000000000000A9 -:1025F00000040000100008000000000010000000AF -:10260000000408800000400508410000820000111D -:10261000000000000080000000000000100000002A -:102620000000102000000000000000000800000072 -:10263000000000000000000000000000000000009A -:10264000000000000000A0000800000000000000E2 -:102650000000000000000000080000000000000072 -:102660000000000000000000000000010000000069 -:1026700000000000000000000000000000900000CA -:1026800000C000000020000020000000000000004A -:1026900021000900000000200000000000000000F0 -:1026A00000000000800000000000000000000000AA -:1026B000000000000000000000000000000000001A -:1026C0000000000000080000000000000000000002 -:1026D00000000000000800000000000000000000F2 -:1026E00000000000000000000000000300000000E7 -:1026F000002000200000000000000000000090000A -:102700000000000000000000100000200000080091 -:10271000040000110000000000000000900088008C -:1027200090802020002000A0000000110000040084 -:102730000004000000000000000000000000000095 -:102740000800000000000000000000000000A000E1 -:1027500040000000A0000000000000000000000099 -:102760000000000000040000000809000000000054 -:102770000090000000882000000000000000000819 -:1027800000900200000000020400000009050000A3 -:1027900041000000000000000000000009000000EF -:1027A0000000000480010083000500000000050017 -:1027B0000000030000000000000000000000000016 -:1027C000000020A00000000000000000080000043D -:1027D00004040000000004000800000000000000E5 +:1022B0000800000000000000FF0000FF0000000018 +:1022C00000000000000000000000000020000000EE +:1022D0000000000000050000A0000000A0000000B9 +:1022E00000000000001000000000000020000000BE +:1022F00000000000000000000000000000000000DE +:1023000000000004000400000000000000002000A5 +:10231000000000000000000000000000000000209D +:10232000002000000000000000200120002000002C +:10233000000000000000000004000400042004204D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000400000000000000000000000000000002D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A00000030001000000004000400104010001A2 +:1023B0000000000000000002000080008000800398 +:1023C000800140000000000000000000000000004C +:1023D00000000000000000000800000000000000F5 +:1023E00000000210021002000200000000000000C5 +:1023F00000000000000000000800000000000000D5 +:10240000000000000000000082400000000000000A +:1024100000000000020002000200020000000000B4 +:10242000000000000000900000000000000000001C +:10243000000000000000000000000000004100005B +:10244000000000000000000000000000000800087C +:102450000000000000000000000800000000000074 +:1024600000000000000000000010000000080088CC +:1024700000000000000000000008040000880000C8 +:1024800000000000008800000000000000000008BC +:102490000000000000000000000000080000000034 +:1024A0000000000000000000000000000000000824 +:1024B0000000000000001100000000080000000003 +:1024C0000000000000000000000000000000C0004C +:1024D00000000400C000000000000000000004082C +:1024E0000000000000000008900000000020040030 +:1024F0000000000004000000000040004000000058 +:1025000004000000040000000000040000000000BF +:10251000900000000000000000000000000000002B +:10252000000000000000010000000000008000002A +:1025300001000080000000000000C000C100040095 +:1025400000208220000000000000000000000000C9 +:10255000000000000000000000000000000000007B +:102560000000000004000000000000000000040063 +:10257000000000001100000000000000000000004A +:102580000004000000000000000000000000000047 +:10259000000000200000000000000000000000001B +:1025A00000000000000000000484000000840020FF +:1025B0000000040000200000000000080082040069 +:1025C0008084000100010000000000840000000081 +:1025D000000000000000000000000000000000807B +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:102630000000000000000400000000000000000096 +:10264000000000000000000000000000000000008A +:102650000000000000A000C000C000C000A00000FA +:10266000001000000000000000000000000000005A +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B000000000000000000080000000000000009A +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000008000000000000000000400048091 +:102740000000008000000000000800000000000001 +:102750000000000000000000000000000000000079 +:1027600000000000000010000000400000004000D9 +:102770000000000000000000000000000000000059 +:1027800000200000040000000000080040000800D5 +:102790000400000000000000000000000000000035 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000200000000000A000A0800039 +:1027C0008820000000200000000021900000008808 +:1027D0000084000000000000000000000000000075 :1027E00000000000000000000000000000000000E9 :1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000082008200C4 -:10281000000004000100002000110000C0000000C2 -:102820000000000000201041000000000000000037 -:102830000000000000000000000000000000000098 -:102840000000000002000800000008000000000076 -:10285000080000000000000200000000000000006E +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:10283000000000000000000500000020000000056E +:1028400000000000040090050000000000000002ED +:102850000000000900020002000200022100000046 :102860000000000000000000000000000000000068 :102870000000000000000000000000000000000058 -:102880000000000000000000000002000000000046 -:102890000000100080002000000100000000210066 -:1028A00000000000000000010000000000400000E7 -:1028B0000000000000000000000000000000000018 -:1028C0000000000000000000000000000000000008 -:1028D0000800080020880000000000002000000020 +:102880000000000002000000000000000000000046 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000001000017 +:1028C0000000000000008000000000000000000088 +:1028D00000000000000000000000000000000000F8 :1028E00000000000000000000000000000000000E8 -:1028F0000100900000000000000000000000000047 +:1028F00000000000000000000000000000000000D8 :1029000000000000000000000000000000000000C7 -:1029100090900084C0049008909000900090000077 -:102920000001910083000000000100000000000091 -:102930000000000000000000000000000000000097 -:102940000000000000000000000000000000000087 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:10293000000000000000000000C000900000000047 +:1029400000C000900000000001C0009000000000E6 :102950000000000000000000000000000000000077 :102960000000000000000000000000000000000067 -:102970000000030000000000000000000000000054 +:102970000000000000000000000000000000000057 :102980000000000000000000000000000000000047 -:1029900011008000200000002000800020000000C6 -:1029A000000009418921A0100040004120081003C7 -:1029B00000000000000010000000002000080008D7 -:1029C00000200000000000000000000000000000E7 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000800080000017 +:1029C00000000080008000000000208000800000E7 :1029D00000000000000000000000000000000000F7 :1029E00000000000000000000000000000000000E7 -:1029F000000011002100080010800000000000000D +:1029F00000000000000000000000000000000000D7 :102A000000000000000000000000000000000000C6 -:102A10000000000800100041008000100021008824 -:102A2000008000000880110010114189100008008A -:102A30000800410000040000000400000000000045 -:102A40000000000000000000000000000000000086 -:102A50000000000000000080000000800000000076 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000080000000800096 +:102A40000000808000008000000080800000800086 +:102A50000000808000000080000000800000000076 :102A60000000000000000000000000000000000066 -:102A700000000000000801000000018800000000C4 +:102A70000000000000000000000000000000000056 :102A80000000000000000000000000000000000046 -:102A9000000000002001900100008290880090005A -:102AA000000420900000014000200001010300000C -:102AB000004001000184200190000001000000009E -:102AC0000000000000000000000000000000000006 -:102AD00000000000000000000008000000C000002E +:102A90000000000000000000000000000000000036 +:102AA0000000000000020000000000000000000024 +:102AB0000000000000000000000000009000000086 +:102AC00082000000C090000082000000C090000062 +:102AD00082000000C09000000008000000C000005C :102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000010000D5 +:102AF00000000000000000000000000000000000D6 :102B000000000000000000000000000000000000C5 -:102B10000000000000000808C090000211102020F2 -:102B2000C09000C0019000000000010041010001C0 -:102B30000000000021000001000002002000000051 -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000004000000035 +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B400000000000009000C000000000009000C0E5 +:102B500000000000009000C000000000080000001D :102B60000000000000000000000000000000000065 -:102B70000000000000000000000800080011001024 +:102B70000000000000000000000000000000000055 :102B80000000000000000000000000000000000045 -:102B90000000000000000000000080000080C180F4 -:102BA00000008000000041000000204011100911C9 -:102BB000004105080000100800410000000000006E -:102BC00002000000030020000000000000000000E0 -:102BD0000000000000000000000005000000800070 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000080008000000000008085 +:102BD00000800000000000800080090000008000EC :102BE00000000000000000000000000000000000E5 -:102BF000000000000000000000004100080000008C -:102C000011080000000000000000000000000000AB -:102C1000000000000000000000000008002000800C -:102C200080000000802000000000000041801009AA -:102C30001100111141082104080008000000008063 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000020000252 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C3000000000000000000000000000000000098B +:102C40000000000080118009000000008011800950 +:102C50000000000080118009000000000000000555 :102C60000000000000000000000000000000000064 -:102C7000000000000000000000000000010801004A -:102C80000000000100000000000000000000000043 -:102C9000000000000000000000000000080088881C -:102CA00090400800900004109090000000000188FF -:102CB0000000000000010100000001000100000010 -:102CC00000100020000000000000000000000000D4 -:102CD00000000000000000000000000000000001F3 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC000000000000000C001200000000000C00162 +:102CD000200000000000C0012000000000000000F3 :102CE00000000000000000000000000000000000E4 :102CF00000000000000000000000000000000000D4 :102D000000000000000000000000000000000000C3 :102D100000000000000000000000000000000000B3 -:102D200000E007008241000000E00700824100004F -:102D3000418200E007000000600600E0070000009C -:102D4000840000E00000000000000000000000001F -:102D50000000000000000000000000000000000073 -:102D6000008200000700000A0000000000000000D0 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D4000000A000082000000000A0000820000006B +:102D5000000A000082000000004100008200000024 +:102D6000000A00008200000A0000000000000000CD :102D70000000000000000000000000000000000053 :102D80000000000000000000000000000000000043 :102D90000000000000000000000000000000000033 -:102DA000F000FC3CFFFFC000F000F6666E660C0011 +:102DA0000000000000000000000000000000000023 :102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 +:102DC00000000000000000000000FF000000FF0005 +:102DD0000000FF000000FF000000FF000000FF00F7 :102DE00000000000000000000000000000000000E3 :102DF00000000000000000000000000000000000D3 :102E000000000000000000000000000000000000C2 :102E100000000000000000000000000000000000B2 -:102E20000000F000F000C000C000F000F0006E668E -:102E30000C00000000000000000000000000000086 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000000062 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E4000000000000000000000000000FF00000083 +:102E5000FF000000FF000000FF000000FF00000076 +:102E6000FF00000000000000000000000000000063 :102E70000000000000000000000000000000000052 :102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 @@ -78596,275 +78596,275 @@ :102EF00000000000000000000000000000000000D2 :102F000000000000000000000000000000000000C1 :102F100000000000000000000000000000000000B1 -:102F200000000000000024242424242424240F0072 -:102F30003F3C66667676000000000000000000005E -:102F40000000000000000000000000006E6E6E6EC9 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000FFFF83 +:102F5000000000FF00000F0F000000FF00000F0F37 +:102F6000000000FF00000F0F000000000000000044 :102F70000000000000000000000000000000000051 :102F80000000000000000000000000000000000041 :102F90000000000000000000000000000000000031 -:102FA0000000000000000000242F242F24242F2FD5 -:102FB00000003C3C00003030000000000000000039 -:102FC00000000000000000000000000000000C0CE9 -:102FD0000C0C0000000000000000000000000000D9 -:102FE00000000000000000000000000000000000E1 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD000FFFF000000FF00000F0F000000FF0000D7 +:102FE0000F0F000000FF00000F0F000000000000A6 :102FF00000000000000000000000000000000000D1 -:103000000000000000000000000000610006000D4C +:1030000000000000000000000000000000000000C0 :1030100000000000000000000000000000000000B0 -:10302000000000000000000000000061000F000D23 -:1030300000000061000F000D0000000005000A29DB -:10304000850000A005000A29850000A00061000796 -:10305000800D000000610006000D0000000000006F -:1030600000000000000000000000000005000A2829 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000003848 +:10305000000010C0038203380C0092C003820338C2 +:103060000C0092C0038203380C008AC005000A38A5 :10307000050000A0000000000000000000000000AB -:1030800000000000000000000000000000282800F0 -:10309000000002000000000000000000000000002E +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000FF0F02 -:1030C000553C303FFAFA003C000F00C3C3C3000078 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 :1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 -:103100000000000000000000000000000000002897 -:103110002800000000000000000000000000000087 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F -:10314000000F553C303F0A0A003C000F00C300004E +:10314000000000000000000000000000000000007F :10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F :10318000000000000000000000000000000000003F -:1031900000000000000080000000000000000000AF +:10319000000000000000000000000000000000002F :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F -:1031C00000003F3FF5053CAAF0FF000F00FF0C0C8C -:1031D000000F0000000000000000AF2F2F2F0000A4 +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE :1032100000000000000000000000000000000000AE :10322000000000000000000000000000000000009E :10323000000000000000000000000000000000008E -:10324000000000003030F5053CAAF000000F00003F -:103250000C0C000F0000000000000000AF0F0F0F6B +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E :10327000000000000000000000000000000000004E -:10328000000000000000000000002004000000001A -:1032900000080004000000000000000000004000E2 -:1032A000A0084000410200000000000088004080AB -:1032B00009020004000000210000011000000000CD -:1032C0001110000000032002000000000000400078 -:1032D0000000200000041020C0C00080004040001A -:1032E00010000000000000000000000000042000AA -:1032F000880020001000000020000000A000200036 -:10330000200000000000000040000000100040000D -:103310000000100200000000000000000002000099 -:1033200010020001100088A140841000000040003D -:10333000C002C0410090400000000040088300002F -:103340001020080300020000000000004000000000 -:103350001002004000040000400300400040210132 -:103360000000000009900000200200002100004041 -:10337000100040204000002010000000000000006D -:1033800040000000000000000000000000000200FB -:103390000000000000000000000002000000020029 -:1033A000020002000200020002000100000008000A -:1033B000000000000080400002000000000000103B -:1033C0000000000008108800000000000400000059 -:1033D00000000000000002000000000000000000EB -:1033E0008200040004000400040004000400000043 -:1033F0009010000000000000000004000400002005 -:10340000002000410000000000000000000000005B -:1034100000000000000000000000000000000000AC -:103420000000000000000000000082000800000012 -:103430008200000000000010800000000200000078 -:103440000201000000000501200000000000000053 -:103450004000050000000000000000000000000027 -:10346000000000000000000000000000000000005C -:10347000000000000000001000000000800080003C -:1034800000010301000000880000000000000000AF -:10349000000000000000000000000000000000002C -:1034A00000000000880040008800000000002000AC -:1034B0000080000002000400A021000001000020A4 -:1034C0008200000002000000080900000000000067 -:1034D0001000000004000000004040000000020056 -:1034E00004000400040000000000080004000000C4 -:1034F0001000040004000000900000000200020020 -:103500000400040040000000100000000000000063 +:10328000000000000000000000000000000000003E +:1032900000002000000000000000000400004000CA +:1032A0000000000000000002000400000008000010 +:1032B000000420008800000000040000000020003E +:1032C00040000000000000000000000000000000BE +:1032D00000000000200020000000000000000000AE +:1032E000200020000000000000000000000000009E +:1032F00000000000000020000000000000000000AE +:103300002000200200000000000000020000000079 +:1033100000000000000000000000000200020000A9 +:10332000000040000000000000004000000000001D +:10333000000040000000400040000000400000028B +:103340000002000000020000000000000000000079 +:10335000000000000000000040000000000000002D +:103360000000000000000002040000000000000057 +:103370000000000000020400000000000000000047 +:10338000000000000000000000000000001000002D +:10339000000000000000000000000000000000002D +:1033A0000000000000000000020002000000000019 +:1033B00000000000000000000200020000000010F9 +:1033C00002000200000000100000000000000000E9 +:1033D00000000200000000000000000000000000EB +:1033E00000000000020000100000000000000000CB +:1033F0000000000000000000200002000000820029 +:1034000082000000000000000000000000900000AA +:103410000000001000000000000000000000000894 +:103420000000000800000000000000100010001064 +:10343000001000840008001000100000001000843C +:103440000000000800000000000000000010001054 +:10345000001000100008000800000000000800082C +:103460000000000000080000000000000000000054 +:10347000000800000008001000000000000800081C +:103480000000000000080000000000001000000024 +:1034900000000000000000080008000000210021DA +:1034A0000400000390000000000000100008000865 +:1034B00000080408000000000400000000000008EC +:1034C0000000040084100000000004000000000060 +:1034D00000000008000000000000000000000000E4 +:1034E00000000000000000000000000000000000DC +:1034F0000000000000000000000000000000880044 +:10350000400000000000000000000000000000007B :1035100000000000000000000000000000000000AB -:103520000000000004000000000000000000110086 -:103530000000004000004100000021A00000400009 -:103540000000030041409000100080000084000053 -:103550000000209002000000050000084000030465 -:10356000C10080048400C1000000000800000000C9 -:10357000000000000000000000000000000000400B +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B :10358000000000000000000000000000000000003B -:103590000000000000000000000000000002000029 -:1035A0000000080000000000100000000000000003 -:1035B000C00084401000000000020002100910004A -:1035C00000020004000000000000000082008200F1 -:1035D0000000000000000002000000110000820056 -:1035E00000000000000000000000000410000000C7 -:1035F00000000000000000000020000000000000AB -:103600000000000900000000004100000000000967 +:10359000000000000000001000000000000000001B +:1035A000000000000000000000000000000000001B +:1035B00010000000000000000000000000000000FB +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA :1036100000000000000000000000000000000000AA -:103620000000000000000800000000000000000092 -:103630000000000000000000000000010001000088 -:1036400080000001000121000000000000000000D7 +:10362000000000000000000000000010000000008A +:103630000000000000A000000000000000100000DA +:103640000088000800000082000000000000000068 :10365000000000000000000000000000000000006A -:103660000000000021000000000000000000000039 +:10366000000000000000000000000000000000005A :10367000000000000000000000000000000000004A :10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A0000000000000000000000000000100100009 -:1036B000000000000000820002200800824040025A -:1036C0008420040001800120C000000000000000F0 -:1036D00000000000000000000000000000000800E2 -:1036E000080440000000000000000020000000006E +:103690000000000000080008000800080008000002 +:1036A00000050021000000080000002100000000CB +:1036B00000100000000000000000000000000000FA +:1036C00000000000000000000000000000000010EA +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 -:10371000000000000000000041000000090000005F -:1037200000000008000004900900020400004000AE -:10373000000000000020000200000000000004C0A3 -:10374000800100000000400202002190002011C012 -:1037500008000500080000001004000004820000BA -:103760000004110000040088210041000000000056 -:1037700000880000000000000000000000000000C1 -:1037800000000000000000000000000000880000B1 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000001080000079 -:1037C0000000840202210008000000001100000037 -:1037D00000000000000001000000000000000000E8 -:1037E00000090800000000000000000000000000C8 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 +:103730000020000000000000000000200000000049 +:1037400000000000000000000000000000000088F1 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000000000000049 +:103780000000000000000000040000000000002015 +:103790000000000000000000000000000000000524 +:1037A00000030000000300080000000000210000EA +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 :1037F00000000000000000000000000000000000C9 -:103800000000200000002000000000000000000078 -:103810000000000000410000000000000000000067 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 :103820000000000000000000000000000000000098 -:103830000000000000000000000000000000021076 -:10384000080000000001000000010000000010005E -:103850000000000000000000080000000000000060 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000000068 :103860000000000000000000000000000000000058 -:103870000000000000000008200000000000000020 +:103870000000000000000000000000000000000048 :103880000000000000000000000000000000000038 -:103890000004000000000000000000000000000024 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000010000000000010140401075 -:1038C00000098208100001009000080100010000BA -:1038D00000010001A0000000000000000000000046 -:1038E000000000000000000000000000000010C008 -:1038F0000020009000000000000000000000000018 +:103890000000000000000000000000001004001004 +:1038A00000082002000000000000000000000000EE +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 :1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:10393000000000000000004100080002000809919A -:103940000002002180911020032000200009004186 -:1039500000034020001000000000000000000000F4 +:10391000000000000000000000000000000008801F +:103920000080008000000000000000000000000097 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 :103960000000000000000000000000000000000057 -:103970008080000000000000000000000000000047 +:103970000000000000000000000000000000000047 :103980000000000000000000000000000000000037 :103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 +:1039A000800000A000800000000000000000000077 :1039B0000000000000000000000000000000000007 -:1039C0008000802180A100001100210041001180B1 -:1039D0000000000000008010000000000000000057 +:1039C00000000000000000000000000000000000F7 +:1039D00000000000000000000000000000000000E7 :1039E00000000000000000000000000000000000D7 -:1039F0000000000000200000800000000000000027 +:1039F00000000000000000000000000000000000C7 :103A000000000000000000000000000000000000B6 -:103A10000000000000000000008000000000000026 -:103A20000000000000000000000000000000000096 +:103A100000000000000000000000000000000000A6 +:103A20000000080002C09040A00400000000000058 :103A30000000000000000000000000000000000086 -:103A40000000100040000809880000880100000004 -:103A50000088009040000800C001100000008200B3 -:103A60004000000000000000000000000000000016 -:103A700000000000100020000000C0000000000056 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 :103A80000000000000000000000000000000000036 -:103A900000000000000000C0000000C000000000A6 -:103AA0000000000000000000000000000000000016 +:103A90000000000000000000000000000000000026 +:103AA000000000000390001004024010000000001D :103AB0000000000000000000000000000000000006 -:103AC0000100000000000090000400C00002010896 -:103AD00001100002000000000000000000020002CF -:103AE000008800C00000000000000000000000008E -:103AF00000000000000000900020000008C000004E +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 :103B000000000000000000000000000000000000B5 -:103B100000000000000000000000040000000000A1 -:103B20000000000000000000000000000000000095 +:103B100000000000000000000000000000000000A5 +:103B2000000000000000C100008000800080000054 :103B30000000000000000000000000000000000085 -:103B4000200010000000000021000900008000A0FB -:103B5000032010A020A0000005004100000000800C -:103B600000000000008000000000000000000000D5 -:103B700000000000000000000000000000000080C5 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 :103B80000000000000000000000000000000000035 -:103B900000000000000000000500000080000000A0 -:103BA0000000000000000000000000000000000015 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000080000095 :103BB0000000000000000000000000000000000005 -:103BC000000000000000000000100089008080005C -:103BD00041000300100008402120200000000800E0 -:103BE0000000000000800000000000000000000055 -:103BF000000000000000000000008000000800003D +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 :103C000000000000000000000000000000000000B4 -:103C1000000000000000000000000000000900009B -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000004000210084016 -:103C500082000108000001000100010000900088BE -:103C6000010000000000000400000000000000004F -:103C7000000000000000000000000000C000000084 -:103C8000908890000000000000000000000000008C +:103C100000000000000000000000000000000000A4 +:103C200000000000000000000000040008028404FE +:103C30001000000000000000000000000000000074 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 :103C90000000000000000000000000000000000024 :103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 +:103CB00000004800000000000000000000000000BC :103CC00000000000000000000000000000000000F4 -:103CD000000000000000000000000000000000E004 +:103CD00000000000000000000000000000000000E4 :103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000006BE -:103D000000000700000000000000000000000000AC -:103D10000000000000000000000000000000000A99 -:103D200000000700000A0000000000000000000082 -:103D30000000000000000000000000000000000083 -:103D400000000000000000000000000000000E0E57 -:103D50000E0F0F0F000F00000000F0F4F5F500004B -:103D600000000000000000000000BE3CFC3C000021 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000401043 +:103D30008020600000600000000000000000000023 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 :103D70000000000000000000000000000000000043 -:103D8000000000000C0C0A0A000000000000000007 +:103D80000000000000000000000000000000000033 :103D90000000000000000000000000000000000023 :103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000000000003 +:103DB00001040208090000090000000000000000E2 :103DC00000000000000000000000000000000000F3 -:103DD0000A0A0A0F0000000F00000000F0F4F0F4DF -:103DE000000000000000000000000000BE3CFC3CA1 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 :103DF00000000000000000000000000000000000C3 -:103E00000000F0F03C3C0C0C0A0A0000000000002E +:103E000000000000000000000000000000000000B2 :103E100000000000000000000000000000000000A2 :103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 +:103E30000000240081000401104000000000000088 :103E40000000000000000000000000000000000072 -:103E500000003F3C0F003C7F3C7D00000000000064 -:103E6000000000000000555F55FF00000000FF3C0F -:103E7000FF00000000000000000000000000000043 -:103E800000000000000F0055F0F03030000000008E +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 :103E90000000000000000000000000000000000022 :103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 +:103EB00000000000002400810802208000000000B3 :103EC00000000000000000000000000000000000F2 -:103ED000000000003F3C0F003C3F3C3C0000000065 -:103EE0000000000000000000555F55550000000074 -:103EF0003C3C00000000000000000000000000004A -:103F0000000000000000000F0055000030300000ED +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 :103F100000000000000000000000000000000000A1 :103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000006110 -:103F50000006000D000080610006009D0000006169 -:103F60000006000D000000610005000D00050000C6 -:103F700000000090000000000000000000000000B1 -:103F80000000000000000000100020280040000891 +:103F30000000000000000000000000000800000079 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 :103F90000000000000000000000000000000000021 -:103FA000000000000000000005000A28050000A035 +:103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 :103FD00000000000000000000000000000000000E1 -:103FE0002000400000200000D7555555000000007B +:103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 @@ -78872,94 +78872,94 @@ :104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 :104050000000000000000000000000000000000060 -:1040600000002000400000A00000C300000000008D +:104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 :104080000000000000000000000000000000000030 :104090000000000000000000000000000000000020 :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 :1040C00000000000000000000000000000000000F0 -:1040D000000000000C5D5D0C00000000FFFF000010 -:1040E000000000000A003E3CFC3CFE3C01003D3C60 +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 :1041000000000000000000000000000000000000AF :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F :10413000000000000000000000000000000000007F :10414000000000000000000000000000000000006F -:104150000000000000000C0C0C0C00000000FFFF31 -:104160005D0C0000000000003C3C3C3CBE3C0000FC -:104170003C3C0000000000000000000000000000C7 +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F :10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F :1041A000000000000000000000000000000000000F :1041B00000000000000000000000000000000000FF -:1041C00000000000000020000000000000002000AF +:1041C00000000000000000000000000000000004EB :1041D00000000000000000000000000000000000DF :1041E00000000000000000000000000000000000CF -:1041F00000000000000000000002000082400000FB -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:1042200000000000000000000000000000009000FE +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000004AA +:10421000000400000000000000000000000000009A +:10422000000000000000000000000000000000008E :10423000000000000000000000000000000000007E -:10424000000000000000000000001000000200005C -:10425000000040004100000000000000400200009B -:1042600000020004100000024100400000000002B3 -:104270000090000240000000000240C0404000C02A -:104280000004000040000000000000024082210005 -:10429000000010020000400000020040004000400A -:1042A000004000004000000200000002400000004A +:10424000000000020000000000001000000000025A +:1042500000000000000000900000000000020000CC +:104260000000000000000002000200000000000446 +:10427000000400000000000000000000000000003A +:10428000000200000000000000000000000000022A +:104290000002400040000000000000020002000098 +:1042A00000020000000000000002000010000000FA :1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000002000000EC -:1042D00000000200020000000000000000000000DA -:1042E00000000200000000000000040000000000C8 -:1042F00002000200000008000000080000000000AA -:104300000200020000000000000000000010000099 -:104310000000000000000000000004000000000099 -:104320000000000008000000000000000000000085 -:104330000000020004000000000000000000000077 -:10434000000002100000000000000000000000005B -:10435000000000000300000000000000000000005A -:104360000000000004000000000000000000000049 -:1043700000000000200000000000000003004100D9 -:1043800000000500000000000000000041000000E7 -:10439000000040000000400000000000000000009D -:1043A000000000000000000200000000000000000B +:1042C00000000000000000000000000008000800DE +:1042D00000000000000000000000000000000000DE +:1042E00002000200000000000000000000000000CA +:1042F00000000000000000000000000000000000BE +:1043000002000200000000000000000000000000A9 +:10431000000000000000000000000000000000009D +:104320000000000000000800000000000000000085 +:10433000000000000000000000000000000002007B +:10434000020002000200000000000000000200085D +:10435000000000000000000000000000000000005D +:10436000008800000000000000880000008800882D +:1043700000020088001000000000000000000000A3 +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D :1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000040000000000E9 -:1043D000000000000000040088000400400000000D -:1043E0000000000088000000000000000000000045 -:1043F0000000000000000000880040000000840071 -:1044000084000000A0000211000000000000000075 -:104410000000000084000000900000000000000088 -:104420000000880004009000000000000000000070 -:104430000000000000004000020002000000000038 -:104440008800900000000000000000000000000054 -:104450000000000000000000000000000900000053 -:10446000000000001100000000000500050004002D -:10447000050000201000030000A000000000400024 -:1044800000000000000000000008000040000000E4 -:1044900000000000002005000000000000000000F7 -:1044A000000000020000000000000000000000000A +:1043C00000000000000000000000000000000000ED +:1043D0000000000800000000004104000009040083 +:1043E00000000000000000000000000000000000CD +:1043F00000000000100004000000040004000000A1 +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:104440000000000000000000000000A0000800A024 +:1044500000820000000000000008000000000000D2 +:10446000000000000000000000000000000000004C +:104470000000000000000000000004000000000038 +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C :1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000002000000000BC -:1044E000000000000000000040020004000000097D -:1044F000000908110000000000000000000000009A -:104500000000000000000000000900200000000082 -:104510000000000000200000000000000004000077 -:104520000000000000000002000000000000000089 +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:10450000000000000000000000000020000000008B +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:104550000000000008000000000000000000000053 -:104560000010000000000000000002000500000034 -:1045700000002100000000000000100020000500E5 -:104580000000000003000000000020000000000008 -:104590000000040000000000000000000400000013 -:1045A00000000000000000000000008800900000F3 -:1045B00000000000000000000000000000000200F9 -:1045C00000000000000000000000000000000040AB -:1045D00000000000000000000000000000000000DB +:10454000000000000000002000000000000000004B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:104570000000000000C0000000000000000000007B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000080000D3 :1045E00000000000000000000000000000000000CB :1045F00000000000000000000000000000000000BB :1046000000000000000000000000000000000000AA @@ -78967,31 +78967,31 @@ :10462000000000000000000000000000000000008A :10463000000000000000000000000000000000007A :10464000000000000000000000000000000000006A -:10465000000000000000100000000000000000004A -:10466000000004000000000000000020080000001E -:1046700004000590000000000040008810001100B8 -:104680000000000402004000038800000000000059 -:1046900000900000000004000000000000880020DE -:1046A000000000000000090020004004000000207D -:1046B00000000900000000000000000000000002EF -:1046C00000000000000000000000000400000000E6 -:1046D00000000000000000000000000000000000DA +:10465000000000000800000003000000000000004F +:104660000000000400000000000000000000000046 +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000002000000A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000000000040000000000E6 +:1046D00000000000000000000000000800000000D2 :1046E00000000000000000000000000000000000CA -:1046F000840000000000000000090000000000002D -:104700000000000000000000200000000000000089 +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 :104730000000000000000000000000000000000079 -:1047400000000000000000000000000088000000E1 +:104740000000000000000000000000000000000069 :104750000000000000000000000000000000000059 -:104760000000000000000000000000002000000029 -:104770000000408400000000000000000000000075 -:104780000000030000000000110000001000000005 -:104790000000000000000000000010000000000009 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 :1047A0000000000000000000000000000000000009 -:1047B00000000000080000000000000000000000F1 -:1047C00000000000000000000000000000000900E0 -:1047D00000000000000021000000000000000000B8 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 :1047F00000000000000000000000000000000000B9 :1048000000000000000000000000000000000000A8 @@ -79089,1412 +79089,1412 @@ :104DC00000000000000000000000000000000000E3 :104DD00000000000000000000000000000000000D3 :104DE00000000000000000000000000000000000C3 -:104DF000000000000000200004000000200020004F -:104E000088000000A0002004000090009000010431 -:104E100088008202840000009000048020002000AE -:104E2000C000C0A0C0802004040320002000400473 -:104E300000030100200020004004210001002000A8 -:104E40002000880020022000A00000802084201183 -:104E5000884088000000000020002000880020001A -:104E60002000008000000080019004800480010484 -:104E700001040000000000900000C1401104000285 -:104E800009000002400041400000219040A0400283 -:104E900002C010900000080041004000C002000065 -:104EA0000000400440024004009090C000004040D8 -:104EB000000000004002800221000040204020004D -:104EC000004000C000024100000000024004401108 -:104ED0004000000500000002000200024000400007 -:104EE000000000000020410000200821C004C00490 -:104EF00002030401000000000000000002000400A2 -:104F00008300010000000000000000000200030018 -:104F100002000200000000000000001040004000FD -:104F20008310010000000002C00084000220030082 -:104F30000300030000004108010410000000000409 -:104F400020400204020020002000000402040000AF -:104F50000800020000000000000000100210000025 -:104F600000000000020002200440202090202000C9 -:104F7000200082040004000000002008000800084F -:104F8000890004080408090800000008400800001F -:104F90000800000800084100000040080008A008C0 -:104FA000800010084008040800010208020880017F -:104FB0008400C008C0080000C00110018308040874 -:104FC00002098201090900088008C000020940099D -:104FD00000008000000800080000000020082008F1 -:104FE00040080000000800080309C0010009090981 -:104FF000804080400009000900000000000000001F -:10500000000000000000000000000000010041005E -:1050100000009000081000400000000002000200A4 -:105020000100040440000500100001009000010090 -:10503000001100090000000900000000100000003D -:10504000000500000440104004400421000240001C -:105050000440400000000000200000080000400064 -:10506000002100000000000000000000008000009F -:1050700084050100010001000100000000000000A3 -:105080000000000009000000000000000000040013 -:10509000040009001100800105010000000000006B -:1050A00000000400000080001000880010000000D4 -:1050B00010000000000004000000000000002100BB -:1050C00000000000000000010001000100040000D9 -:1050D00000000001000000900000800400000000BB -:1050E00000000000000000000000000000000020A0 -:1050F000000000000200020004000200080000009E -:10510000000000000000010084004000A000040036 -:105110000000C0000200000000102080A00000007D -:1051200000000000A0809084C08200800080008089 -:105130000080C0A0020002000500030200001080F1 -:10514000002000401100820400002000832008009D -:105150000000000082100004900982000000A000FE -:10516000C000C0008204C010A0008240A000000067 -:105170000000840000020000080008000000000099 -:1051800000000000000000002000100010000000DF -:10519000800000004100800000000001804003000A -:1051A0000000000003000340204121410040114065 -:1051B0000440404000408082808482A0840000003F -:1051C000C14008844001A0A0000008008000200029 -:1051D0000000210004000420000000000000000086 +:104DF00000000000000000000000000000040004AB +:104E00000000000000000080000000000000000022 +:104E1000000000000000000400000000000000008E +:104E2000000000000004000000000000000400007A +:104E3000000100000000000200000000000000006F +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E700000000000000000000000000040004000B2 +:104E8000000040000000410200040000000040005B +:104E9000000040004000000040000000000440020C +:104EA0000002000000000000000000000000000000 +:104EB00000000000400000000000000000000000B2 +:104EC00000000000000000000000000000000000E2 +:104ED00000020000000000000000000000000000D0 +:104EE00000040000000000000000000200020002B8 +:104EF0000000000000000000000082080000000028 +:104F0000000000000000000000400104000000005C +:104F10000000000020002000000400040040000009 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F40000000004000000000000000000000000021 +:104F50000000000000000000000000000000000051 +:104F60000000004000000000000000000000000001 +:104F70000000000000000008000000080000000021 +:104F800000000008000800000000000820090000E0 +:104F900000000008000880088000000900110000DF +:104FA00000000008001000000000000800080000D9 +:104FB0000000000800080000000800000040000099 +:104FC0000040000800080040000000000008000841 +:104FD00000000000000800080008000000000000B9 +:104FE0000000004000080000000000000008000869 +:104FF000000000000008000840000000040000005D +:1050000000000000000000000000000000000000A0 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:10503000000000000021000000000000000000004F +:105040000000000000000010000000000000000050 +:105050000000000000000000000000000000000050 +:10506000000000000000000000000000040000003C +:105070000000000000000000000000000000000030 +:105080000000000000000000000000000000000020 +:105090000000000000000000000000000000000010 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000000000000000000005F +:10515000000000000000000000000000000000004F +:1051600000000000000000000000000000400000FF +:10517000000000000000000000000000000000002F +:10518000000000000000000000000000000000001F +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF :1051E00000000000000000000000000000000000BF -:1051F0000000000000000040000800000000000067 -:10520000080000000000000008004000202100000D -:10521000C0009000100090000000A1800000A0409D -:10522000C0002000C00008002000000000000400B2 -:1052300000000000000001000400100040002000F9 -:1052400000000005A005A002042100118205100045 -:105250000000C04020000040840008000000C000A2 -:10526000C00000001000000000000000000000006E -:1052700000000800080008000800C000C00000008E -:10528000000000000000000000000000000080009E -:1052900000000900000000000400000008040000F5 -:1052A0000001400000000000000080000004000435 -:1052B00080000088000000002000800000008000C6 -:1052C000000000000000000000012000000000209D -:1052D0000000008840010000000100000000000004 -:1052E0000420050000000000000000000000000095 -:1052F000000000000002000020000000000000008C -:10530000000000000000000000000000820000001B -:105310000000000000000800840008002000098050 -:10532000011004801100830485044104A100008061 -:105330000180010400000000000000008200848061 -:1053400002020000000000210040000200050040B1 -:1053500084030000000300000040400000008208B9 -:10536000000800000000000008000000C00000006D +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:105210000000000000000080000000008400A000EA +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:10529000000000000000000000040000000000000A +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:10531000000000000000000000000200000000008B +:10532000000000410000000000000000000800082C +:105330000021000800000000000000000000000044 +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D :10537000000000000000000000000000000000002D -:1053800000000000004000000000000000000000DD -:10539000000000000000000000001100000080007C -:1053A0008810200183400200020102410201020430 -:1053B00000400404020120002000000010A00000B2 -:1053C0000320800100A000000884008341830000C6 -:1053D000000140000400000000000001000008007F -:1053E000000000880000080000000000000000002D -:1053F000000000000000000000000000000020008D -:105400000000000011000800000000000000000083 -:1054100001002000000100000202002000080288B4 -:1054200088C00002009020C000C0009090000000E2 -:1054300000C100001001009000C00000A00020008A -:1054400040C0212084100802000000C1040088012F -:10545000000000C000000000409002C000000000FA -:10546000002000C0008800040008000000000000C8 +:10538000000000000000000000000000000000001D +:105390000000000000000000050000000000000008 +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C :10547000000000000000000000000000000000002C -:10548000000000C040200000880000000000000074 -:1054900000001100880820040002808000000080C5 -:1054A0008000008000000500000000800500200052 -:1054B000050003C120100508000000800000100056 -:1054C0000000C080080080808000000005C18203C9 -:1054D0009008001000800000100000008080000094 -:1054E0000400000000800000208000000000000098 +:10548000000000000000000000000000000000001C +:1054900000000000000000000000000000002000EC +:1054A00000000000000000000000000000000300F9 +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC -:10550000000000000080000000000000000000001B -:10551000000000001100080004004083800000002B -:10552000000000000003000080098000200005004A -:1055300005009000080510A1050280C010000000C1 -:105540000800C10082001009C08280000000208095 -:1055500002000300C11100080003002080000009C0 -:1055600000000004800000030000000000000000B4 +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:105520000000000000000000000000000009000072 +:105530000009000000000000000000000000000062 +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000000000000000000000000000003B :10557000000000000000000000000000000000002B -:105580000000000000000010002000038000000068 -:1055900000000000000000000088000000C00200C1 -:1055A0000000080088008800A000A0000200004061 -:1055B00000000100C140900901020101C002014048 -:1055C00020000000C100090021000882C082000004 -:1055D000018800000100C100000000000000C000C0 -:1055E000000000000000C0000000000000000000FB +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A00000000000000000000000000000000000FB +:1055B00000000000000000000000000000000000EB +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000000000000000000000BB :1055F00000000000000000000000000000000000AB -:105600008400204002002040000120000001C00072 -:105610000000000000000000010001002000010067 -:10562000041000000008009090020802002010C042 -:1056300000880001100000C001880500910100C031 -:1056400020000201000100C1080800200009C0C1BB -:10565000000088000090010100C100000800000067 -:1056600001C000000800000000C000002000000091 -:105670002100000000000000000000000000000009 -:105680000000000000004000000040004020022018 -:1056900008C000000000000000004120104082020D -:1056A00011108380000000800000008080800000D6 -:1056B000098000200008001000804102850221219D -:1056C000058200008010001000C180A0004000A1F1 -:1056D0008088000080020085052140C10000000094 -:1056E0000000418000008000000002800000800077 -:1056F0000000410000000000000000000000000069 -:1057000000000000400000000000000000008000D9 -:1057100080004080000000000000000008102120F0 -:105720000200101000000020008000000000004077 -:10573000000000002080050010002080C10500004E -:1057400021001041C105081009000803800980905C -:105750000080800800004102210021808309800828 -:1057600000000000000080000000000000000008B1 +:10560000000000000000000000000000000000009A +:10561000000000000000000000000000000000008A +:10562000000000000000000000000000000000007A +:105630000000080000000000000000000000000062 +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:10569000000000000000000000000000000000000A +:1056A00000000000000000000900000000000000F1 +:1056B0000000000080000000090000000000000061 +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:105730000000000000000000000000000000000069 +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 :105770000000000000000000000000000000000029 -:1057800000000000000000100000008000008010F9 -:105790000089000000000000000000000000000080 -:1057A0000000000000000000008800080000000069 -:1057B0000000004000000040000000888808C10090 -:1057C000000001000000C100210100000101C00033 -:1057D00020C0021010000000012000000102900112 -:1057E000C001004000000000C00000000040400078 -:1057F00000010000000000000000000000000000A8 -:105800000000000000000000000000100040000048 -:10581000C00140022008000000000000000000005D -:10582000000000E0070082210000000007000000E7 -:10583000000000E007000000000000E000000000A1 -:10584000008100E007006000810000E0000000002F -:1058500000410000070041120000880000E0000045 -:105860000000810000E000000006600000E0000091 -:105870000000000000E000000082000000000000C6 -:105880000000000000000000000000000000800098 -:10589000000000810001070000000000000000007F -:1058A00000000000000000000000000000000055A3 -:1058B0003C7D00000000F0F000003C3C3C3C00005F -:1058C0003C3C0000FFFF00003C3C000000FF0000EB -:1058D000FFFF004000410C00080000003C3C3C3C45 -:1058E0000000F0F00000FFFF0000FFFF00003C3C64 -:1058F0000000AAAA00000000000000000000000054 +:105780000000000000000000000000000000000019 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000000000000000000000000000E9 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000000000000A9 +:105800000000000000000000000000000000000098 +:105810000000000000000000000000000000000088 +:105820000000000000000000000000E00000000098 +:105830000000000000000000600000E00000000028 +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000000000E8 +:1058C00000000000000000000000000000000000D8 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 :105900000000000000000000000000000000000097 -:105910000000000000000000000FFFFF000000007A +:105910000000000000000000000000000000000087 :105920000000000000000000000000000000000077 -:1059300000003C3C00000000F0F200023C3C3C3C1B -:1059400000003C3C0000000000003C3C000000FF68 -:1059500000000000004000000000080000003C3C87 -:105960003C3C0000F0F000000000000000000000DF -:105970003C3C0000AAAA000000000000000000005B +:105930000000000000000000000000000000000067 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 :105980000000000000000000000000000000000017 -:10599000000000000000F0F000FF000FF0F0000039 -:1059A00000000000000000000000000000003C00BB -:1059B0003F0FD755C300000000003C3C3F3CFF00B8 -:1059C0000000FFFF00003C3C00003C3C0000FFFFEB -:1059D0000000F0F0FFFF0028000A00100030000077 -:1059E000FFFF0000FFFF00003C3C00005555000099 -:1059F0003C3C00000000FFFFBE3C3E3E00000000BB +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 :105A00000000000000000000000000000000000096 -:105A10000000000000000000005500FF5050F0F0B2 +:105A10000000000000000000000000000000000086 :105A20000000000000000000000000000000000076 -:105A30003C003C00555500000200000200000F0031 -:105A4000FF000000000000003C3C00003C3C000067 -:105A500000000000F0F0FFFF000000000010000058 -:105A6000000000000000000000003C3C0000555514 -:105A700000003C3C0000FFFFFFFFBE3C3E3E00003C +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 :105A80000000000000000000000000000000000016 -:105A90000000000000000010000000550000505001 -:105AA0000000000000000000000005610A09050177 -:105AB00000A000000008000000000061500F009DE1 -:105AC0000000406380050021920245E38A27052DEE -:105AD00092A240E28007802082021061202E004DB9 -:105AE00000080000404280058029920240E38007C0 -:105AF000802D920240E38007802D820200615007D2 -:105B0000000D000000000000000000000000000088 -:105B10000000000005000A00150000A1106120AE81 -:105B2000004D040800000000000000003C3C3F3C29 -:105B30000000F0F000000000000000000000000085 -:105B400000000000FF101010F8F0F8F0AFAF2F2F9A -:105B500080FFC3FF0F5F0F3FF000AA0000000000AE -:105B600082FFC2FF00004000C0000C0C08000000D3 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB000000000610007000D000000000000000071 +:105AC000000000610007800D0000000000000000E1 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 :105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 :105B90000000000000000000000000000000000005 :105BA00000000000000000000000000000000000F5 -:105BB0000F00003CF0FC00000000000000000000AE -:105BC000000000000000FF101010280028000F0F38 -:105BD0002F2F80FF80FF0F5F0F3FF000AA00000013 -:105BE000000000FFC0FF00004000000000000800AF +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 :105C10000000000000000000000000000000000084 :105C20000000000000000000000000000000000074 -:105C3000141F141F000CAAAE00000000000000009A -:105C40000000000000000000000000000000F0F074 -:105C5000FFFFFFFF202C202C000000001414005533 -:105C600000000000207020700000FFC3FF038000D0 -:105C700028280000000000000000000000000000D4 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 :105C90000000000000000000000000000000000004 :105CA00000000000000000000000000000000000F4 -:105CB000000014141414000CAAAE00000000000030 -:105CC0000000000000000000000000000000003C98 -:105CD000F0FC5050F000202C202C00000000141488 -:105CE000005500000000207020700000FF00FF033E -:105CF000A0001414000000000000000000000000DC +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 :105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 -:105D2000000000000000000000000000C000C000F3 -:105D30000000C00000000000C000200000001000B3 -:105D40008400840000008800010020000000200082 -:105D500000000000040005000200208000C02100B7 -:105D600010004002100001000400210000030205A1 -:105D700020008400000021002080058385884100E8 -:105D80004000040084008200C00084008400C00041 -:105D900088000000C000000020002000000020005B -:105DA0004000000000002080008020202020100003 -:105DB00000000000000000004100000000000000A2 -:105DC000000000000000400041020202000000004C -:105DD000400000001002C000C040904010081010A9 -:105DE000400000000090400202008000040000001B -:105DF000800040000000000002C040020440022178 -:105E000008000000009000004000000400020000B4 -:105E100000000090000000000000000000000000F2 -:105E200000000000009000000020002000010001A0 -:105E30000000000000000000000010000000000052 -:105E4000020000000000000001000000020000004D -:105E50000300040000000200410000821100054020 -:105E600000000021004008004140000001008200C5 -:105E7000000003020200020003408800000200400C -:105E80000040020003000040002100000000000567 -:105E900000080000000000000000000000000840B2 -:105EA0004009020002000200020004000020044039 -:105EB0000080000000000008200000080000000032 -:105EC00003000008000000000000080000040908AA -:105ED0000000820080000308800082080021820008 -:105EE00040000008400000000000C0010000100851 -:105EF00040000000400100004108400140840001D2 -:105F0000000000000008400020000900008440005C -:105F1000400841002000000040080000090840003F -:105F200000088000008820084100000080844109AA -:105F300080080020000000000000000000000000B9 -:105F4000000000000000000004000000010000004C -:105F500000000000008000800000000001800100BF -:105F6000010001C110008840880000800008002066 -:105F700000210000000084210120008000000100B9 -:105F80000502000800020002000800000400048866 -:105F900000000000000000000000000000000002FF -:105FA0000020880200000000000000000000020045 -:105FB00000000000000008000000210000000000B8 -:105FC00021000300000000200000020003C00800C0 -:105FD000210003000900214005200000009002205C -:105FE0000200048804202002408800000004000011 -:105FF00041A1000000000000008802A11102000081 -:106000000400828400882101000100840300400014 -:106010000020000800000000000000000000000058 -:106020000000040004000400000003000800080051 -:10603000022000A00000410000000800080010003D -:10604000000010008200002000008200820000009A -:10605000000090000000202008208200A00009001D -:106060004020884040400120A00040008200A0095C -:10607000910008008840010000008280A000830099 -:10608000040204000000A00000040002C000C000E0 -:106090000800C0000000410908400000840008001A -:1060A0008200C000000000000840A00200000009BB -:1060B000000082000000000000000000000003005B -:1060C00000000000000000000000000011000000BF -:1060D00008000000000000000000000100000000B7 -:1060E0000800000110A18001020100000000000072 -:1060F00000000488000003010220000000200300CB -:10610000020003040300210004000000000121003C -:106110000000000020A00000040004000000210096 -:106120000300410000000000030000000001000027 -:1061300000000384000008000000030000000000CD -:1061400000000000000000000000000090000000BF -:1061500002008200400084000000C00001808480B2 -:106160009000A080C000A080A14101009080C0806C -:1061700008200003040200410040040200008421C2 -:106180004011C00400821100000008200805000032 -:1061900008040000C0008200008000800080000031 -:1061A0000800000000008400000000000000100350 -:1061B0000000820000000000000000000008000055 -:1061C00000000000000011000084000000000084B6 -:1061D0000084034004C0000040040000400002208E -:1061E00005200304004005004020020002020504CF -:1061F00040040089080002080000004000C10000BF -:10620000000080000000002140040088030000001E -:106210000000000000000000000004200004002036 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000100020000000000033 +:105D4000000000000000000000000004000000004F +:105D50000000000000000000000020000000000023 +:105D6000000000000000000000040004000100002A +:105D70000000000000000000000000002000000003 +:105D8000000000000000000000000002000200000F +:105D900000000000000000000000000020000000E3 +:105DA00000000000000000000000000000000000F3 +:105DB000000200000000000000008000000200005F +:105DC00000020000000000000000100200020000BD +:105DD00000000002000000020002000000000002BB +:105DE000000000020002000000020000100000009D +:105DF0001040000000000000000000000000000053 +:105E0000000000000000000400000000000000008E +:105E10000000000000000000000000000002000080 +:105E20000000000000020000000000000000000070 +:105E3000000000000000000004400200004002409A +:105E400002000200004000400240024002400240C6 +:105E50000200020000400040020002000040024038 +:105E6000020000800040004000000000000002002E +:105E70000000000000000000000000400040004062 +:105E800000400000000000000000000000000000D2 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000800180000009D8 +:105EC00000098000800000090001800080000009B6 +:105ED00000098000800000010001800080000009AE +:105EE00000098000004000090001000000000008D7 +:105EF000000800000000000000000000000000009A +:105F00000008000800000000000800000000000079 +:105F10000008000800000000000000000000000071 +:105F20000008000800000000000800000000000059 +:105F30000008000810000000000000000000010040 +:105F40000000000000000400000004000000000049 +:105F5000000000000000000000000002000000003F +:105F60000009000000000000000000000000000028 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC00002002100000000000000090000000000A5 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000000000000000A1 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:1060400010000005C00000000000000000000080FB +:10605000100000008200000000000000000000802E +:106060001000000000000000000000000000000020 +:10607000000000000000000400000000000000001C +:106080000000000000000000000000000000000010 +:1060900000000000004000000000000000000000C0 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000080000000000D8 +:1060C0000000800000000000000000000000000050 +:1060D0000040800000000000000000000000000000 +:1060E00000408000000000000000000000000000F0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000004000000000000000000005B +:10614000880008000000200000002000004000003F +:106150008800002100001000000020000040000026 +:1061600040000002000010000800200000000000B5 +:1061700000000040000000000000000000000000DF +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000008000000080000001CE +:1061D00000000000000000008000000080000001BE +:1061E00000000000000000008000000080000000AF +:1061F000000000000001000000000000000000009E +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E -:106230000000000000000000020400000000030055 -:106240000000080000000000000000000000000046 -:1062500000008202000000000811002082004000BF -:106260000000820083000000404184C1082140807A -:106270004000822110040000C041A0008200000004 -:1062800000000000109182204011000090000000EA -:106290000000000084080000C0400021042100210B -:1062A0000000000000008200000008000000000064 +:10623000000000000000000000000000000000005E +:1062400008000000820000000000100000000000B4 +:1062500000000208004000210004000000000000CF +:1062600000000200004000000004000000000000E8 +:10627000004000000040000000000000000000009E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE -:1062C00000210000000000000000000000000000AD -:1062D000000000000000000000008000000100003D -:1062E00000040000200008C0090400A000200200F3 -:1062F0000340020000002101004000820000000075 -:1063000000000000000083080001200008080800C9 -:10631000000000000300000008000000080040002A -:1063200008900002000000001000000008001000AB -:106330000000030000000000000000A000000000BA -:10634000000000100000000000000000000000003D -:1063500000000000000000000000000001A000207C -:106360000084000010C0A040051000A082C10040C1 -:1063700004C004A100039090059004A101C18340D2 -:106380000410C010000000C1A0410090C00810C15E -:106390000040009190010000400100010000200237 -:1063A00000040040C00400000000000000000000E5 -:1063B00000000400000000010000000000000000D8 -:1063C000A00000000000000000000000000000002D -:1063D000000000000000000000000000000021009C -:1063E000008000000000008408892108000484C1A6 -:1063F00011898000004011C0A0110210802102C14B -:10640000109080118080000008880089000580407D -:10641000809000000002000800000010002000082A -:10642000208000804080808000000000000000008C -:1064300000000800800000000008001100080009AA +:1062C000000000000000000000002100800000002D +:1062D000000000008000000100000001000000003C +:1062E000000000008000000100000001000000002C +:1062F000000000010000000100000000000000009C +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:1063400000000000000000000000000001C100008B +:106350000001880000C000000002000001C1200010 +:106360001001880002C000000002000000C14000CF +:106370000001880102C000000002000000000000CF +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C000000000000000000000000000000011C1FB +:1063D000110803098009008000000080000009C145 +:1063E0008020C0098000808000000080000000C183 +:1063F00091204008800380800000008000000000A1 +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:10642000000000000000000000000000000000006C +:10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:1064600000000003008000000200800090A10021D5 -:10647000A0800808801080000020040820C19190AE -:1064800080008041004180800000A00089410041DF -:10649000C02100008000000080080000000500808E -:1064A00000030000002180088000000000000000C0 +:10645000008008218900C109800000000000800040 +:10646000000020008900C1038000000000008000BF +:10647000108020008909C100000080000000800019 +:10648000000000000000000000000000000000000C +:1064900000000000000000000000000000000000FC +:1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC -:1064D00000000000000000000000000000000000BC -:1064E000000000000000000200002088A00083A13E -:1064F000880182C088014091C0000041900188104D -:106500000290400040411001C002000040204121A3 -:106510009001C0C108A002000008C00100400000B6 -:106520000008000184000800402104000000000071 +:1064D0000000008800009000C100080000000000DB +:1064E000C000000200009000C10108000000000090 +:1064F000C000008800009001C10000000200000000 +:10650000C0000000000000000000000000000000CB +:10651000000000000000000000000000000000007B +:10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B -:10654000000000000000002000000090000000009B -:10655000000000000000000000000000000000003B -:1065600000000000200000000000C000A041001159 -:1065700021A100C088880100030500C00402C0906A -:10658000019101A0C0890020824000C00001C0909C -:106590000120884000C182890090109000C0000056 -:1065A0000100000000004000000400C000200000C6 -:1065B00000000000000000000000000100000000DA -:1065C00001000000000000000000A000000000002A -:1065D00000000000000000000000000000000000BB -:1065E000000000000000000000000000800000A08B -:1065F00003100521208000020303212110908080D8 -:106600008504202141408540208909A0008900019E -:106610009105108503A003C100100041030300840D -:1066200000000200000000000000008000000000E8 -:1066300000000000000000000020001100100040D9 -:10664000000003000300020003000000000000003F -:10665000000000000000000000000000000000003A -:1066600000000000000000008000004000008000EA -:106670002180044103001108C14021412100101074 -:106680000921084041000820804180088084800062 -:10669000000180418040A0851010C100021011004F -:1066A0000000A109210009001000000080C00000C6 -:1066B000800000000000000000000000000000005A +:10654000000000000000000000000000000000004B +:106550000000000000000000000102C10000000473 +:10656000000000C020009000000100C100000000F9 +:10657000000000C020009000000100C100000000E9 +:10658000000000C00000000000000000000000004B +:1065900000000000000000000000000000000000FB +:1065A00000000000000000000000000000000000EB +:1065B00000000000000000000000000000000000DB +:1065C00000000000000000000000000000000000CB +:1065D00000000000000040080911000880C1000010 +:1065E00000800000008080118520020800C10000AA +:1065F00000000000008080098520000800C1000024 +:10660000000000000080000000000000000000000A +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:106650000000000000000000418821200000092007 +:106660008000000000000000C1A021098000090393 +:106670008000000000000000C120210988000903FB +:10668000800000000000000000000000000000008A +:1066900000000000000000000000000000000000FA +:1066A00000000000000000000000000000000000EA +:1066B00000000000000000000000000000000000DA :1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E00000000000000000000000C0000800C00022 -:1066F0000200A108100300A00001C1A0A004010035 -:1067000090000201829090A04100C001200040C191 -:1067100010020001C001200041C11121C10091906F -:1067200000009000090008004000910000000404EF -:1067300090000400000000000000000000000000C5 +:1066D00000000000000000000000011000000000A9 +:1066E0000101C000000000004000C110000188004E +:1066F0000101C000000000004000C100000189004D +:106700000101C00000000000400000000000000087 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000000069 +:106730000000000000000000000000000000000059 :106740000000000000000000000000000000000049 -:106750000000000000000000000000000000000039 -:106760000000000000000000000000000000000029 -:106770000700000A00820000070042000006000037 -:1067800007004200000000E0070082410000000016 -:106790000700484200000000000007004842008255 -:1067A00000000700000000000000000000000000E2 -:1067B00000E00700000600000000000000000000EC +:10675000000000000000000000000000600600E0F3 +:10676000070000000000000000000000600000E0E2 +:10677000000000000000000000000000600000E0D9 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000000D9 :1067C00000000000000000000000000000000000C9 -:1067D00000001200000000000000000000000000A7 -:1067E00000000000000000000000000000000200A7 -:1067F000F2F000000000990000002442D0001818B8 -:10680000990018001818FFFF99103F0F3C00000076 +:1067D0000000000000000000000000000000FFFFBB +:1067E000FFFFFFFF00003C3C0000F0F00000F0F075 +:1067F0000000FFFF00003C3C000066660000F0F077 +:106800000000FFFF00003C3C000066660000000046 :106810000000000000000000000000000000000078 -:106820000066003CFFF0003CFFC3FF40000000009A -:10683000E6C0E6C0F0F0000000000000000000002C +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 :106840000000000000000000000000000000000048 :106850000000000000000000000000000000000038 -:106860000000000000000000000000000000000028 -:106870000000F0F000000000990000002442D00069 -:106880000000000018000000FFFF10103C003C005A +:1068600000000000000000003C3C0000F0F00000D0 +:10687000F0F00000000000003C3C000066660000F4 +:10688000F0F00000000000003C3C000066660000E4 :1068900000000000000000000000000000000000F8 -:1068A00000000066003CFF66003CFF40FF40000027 -:1068B000000066006600F6F06600000000000000C0 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000000D8 :1068C00000000000000000000000000000000000C8 :1068D00000000000000000000000000000000000B8 :1068E00000000000000000000000000000000000A8 :1068F0000000000000000000000000000000000098 :106900000000000000000000000000000000000087 -:106910000000430840000084218600004308400036 -:10692000008421860000000000000000000000003C +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 :106930000000000000000000000000000000000057 :106940000000000000000000000000000000000047 :106950000000000000000000000000000000000037 -:106960000000000000000000000000000000000027 -:106970000000000000006666000000000F000C0030 -:10698000000001080F003C00020200033C003F0F22 -:106990000066F0F6000000000000000000000000AB -:1069A000000000000000F0F000F0181809090000D5 -:1069B00000000000000000FF03FF063E0606000086 +:106960000000000000006666000000FF00000F0F3E +:1069700000003C3C0000FFFF000000FF00000F0F84 +:1069800000003C3C0000FFFF000000FF00000F0F74 +:10699000FFFFF0F000000000000000000000000019 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 :1069C00000000000000000000000000000000000C7 :1069D00000000000000000000000000000000000B7 -:1069E00000000000000000000000000000000000A7 -:1069F000000000000000000F666F000000000000B3 -:106A00000C0001080000000000000202000300006A -:106A10000F0F00660066000000000000000000008C -:106A20000000000000000000000000F01818090934 -:106A3000000000000000000000000303063E060600 +:1069E00000000000000000006666000000FF0000DC +:1069F0000F0F00003C3C00000000000000FF000002 +:106A00000F0F00003C3C00000000000000FF0000F1 +:106A10000F0FFFFFF0F0000000000000000000007A +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 :106A40000000000000000000000000000000000046 :106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A70000000000000000000A0000008000000006E -:106A80000061202E004D00001061202E004D0008F6 -:106A90000061000F000D00001061200E004D000885 -:106AA00000001061200E004D00081061202E004DE6 -:106AB000040800610006000D00000061000F000DD9 -:106AC0000000000000000000000000610006000D52 -:106AD000000000610006000D000005000A0015001E -:106AE00000A0000000000000000000000000000006 -:106AF0000000000000000000000000000000000096 -:106B000000004488000000220022CF0F4F4FBAFF40 -:106B100000FF04000800000A00A0000000000410AC -:106B2000082000003D3D3D3D3C00F0000F0F0F0FE1 -:106B3000303030FFFFFF4303000000000000000082 +:106A600000000000000000004512802980209202F2 +:106A700040828000002092024082800180209202A9 +:106A80004082800000209202408280018020920299 +:106A90004082800000208202000000000000000010 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF000000000000000000000002800AA008080C4 +:106B000000C0000000000000000030005000300015 +:106B1000F000000000000000000000000000000085 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 :106B40000000000000000000000000000000000045 -:106B5000F0AAF0AA00000000000000000000000001 -:106B60000000000000000000000000000000000025 -:106B70000000000000000000000000000000000015 -:106B8000000000000000000000110011CF0F4F4F67 -:106B900030FF00FF00040008000500500000000066 -:106BA000014002800000050505053C00F000FF0FD4 -:106BB0005F5F303030FFFFFF410000000000000049 +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000000003C00550094 +:106B70003030003C00000000000000002800000051 +:106B8000808000C0000000000000000030005000C5 +:106B900030000000000000000000000000000000C5 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000000D5 :106BC00000000000000000000000000000000000C5 -:106BD00000003C003CFF000000000000000000003E -:106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000000095 -:106C00000000000000000600900000690069FFFF1E -:106C1000FFFFA8A8A8A82400000005500AA00F5F45 -:106C20000FFF000000000000AF2FAF0FA0A0BCBC02 -:106C30003F3F0F0F00000000140C140C0000000078 +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000000000000000300A2 +:106BF0004100000000000000000000000000000054 +:106C00000000000000000000000000000000500034 +:106C1000300000C080800000000000000000000084 +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 :106C40000000000000000000000000000000000044 -:106C50000000000000000000C0CFA0A00000000065 +:106C50000000000000000000000000000000000034 :106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C8000000000000000000000060090690069009C -:106C90002828AA00808080800000240005500AA0D7 -:106CA0000F5F0F0F0000000000002F2F0F0FA0A09C -:106CB000BCBC3C3C000000000000140C140C0000A4 +:106C70000300410000F0A0A00000000000000000A0 +:106C800055000F0000F0A0A0000000000000000070 +:106C90005000300000C080800000000000000000B4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 :106CC00000000000000000000000000000000000C4 -:106CD00000000000000000000000C0CFAFAF0000C7 -:106CE0000000000000000000000020002000200440 -:106CF0002000C000880020002000100000002000BC -:106D000020002000201104000000210011802080BC -:106D1000209000000400200020020400110204055D -:106D20002080218021808880018000032091200024 -:106D30002000A0828900050021002090C0004000B2 -:106D400020002010208020002000000020002000D3 -:106D5000200004804100C000208020848800410081 -:106D600020002000880020002000000000004000DB -:106D70004102400000004002400200A089000000E3 -:106D800004C000C0214021C0000200821000C008E1 -:106D90002102090900C04000409040010000082184 -:106DA0000000054010042008410410040000000207 -:106DB00009020004200910842000200000090002BC -:106DC00020A00090000141404000004000000090E1 -:106DD000049000020002080040000040000240C091 -:106DE00010C0000000000000400000000000200073 -:106DF000200020002004000000000000000400002B -:106E00000200010002000400040020100202400001 -:106E10000102000040020800000000000800080015 -:106E20000910000300080800000040409000000026 -:106E30000000410008050410004100000200880025 -:106E400008000000001002104100040003100200BE -:106E5000001010100400C01089101002411008101A -:106E6000404000400800401008000000000084007E -:106E700080088002800882080008000000084000A6 -:106E800020080008100800008000820082004001F5 -:106E9000800810090008820909080000000889001C -:106EA000090840090008050140000084048404002A -:106EB0000000040882088408400800084000000818 -:106EC00004008408040800840000C0080208880147 -:106ED000000002088208000840080809800802082B -:106EE0008900800800080000C104808400080900AF -:106EF00040000000000000008800000002000000C8 -:106F0000000000000000880504001000880000094F -:106F10000000900090000000000020200000840984 -:106F2000C000000000218840004140080008002007 -:106F30000000000082000084A0100000C00000409B -:106F40008803008004414002024004004009000020 -:106F50000000090090000000042100000000000073 -:106F60000000000000000000000800000000000019 -:106F70000000C00000000908100000000000000030 -:106F80000000000041000500000000004100050075 -:106F9000040041004000030000000084040008A039 -:106FA00021000000080021001000000241C0101064 -:106FB0001084000000004182091000010000000060 -:106FC00008000000004008000540090221001000F0 -:106FD00003000000880040000000000000000000E6 -:106FE00000001000000000402100004000000000F0 -:106FF000000000000000A000200020002000080089 -:107000000000000000002005200020031000020006 -:1070100004040880050203200810A1008800A011C4 -:10702000000082110000100082020800900004009D -:107030008400A010020400008280C00083000000D1 -:1070400000098202A02040091010900000000409ED -:1070500004040002040010008200100084000040BC -:1070600008008400820000090003000010000000F6 -:107070000800000000410000000080008000800047 -:1070800000000000000000009000880080008000E8 -:10709000050084034120040010002100400000008E -:1070A00000000000200000000200000100000000BD -:1070B000000000A000A00000000010400200081026 -:1070C00000004100210840000000030100004020B2 -:1070D00021000200038802004188400000000010E7 -:1070E0000000A000000041004000210041000320FA -:1070F00004001090030010000008000400000000CD -:107100000000900002008800000004001000000051 -:10711000200004000008000400040400040004002F -:107120000021084000020000000000004000400074 -:10713000A0000000C0000800004100000000910015 -:107140004000010000110000000004118200824094 -:107150000000000000080000000000000000000027 -:1071600000000800080000001000000004000000FB -:1071700000008408A0008200840000410005000097 -:10718000000000000020000000000000000080005F -:107190000000800080A00000100100010904090027 -:1071A00000040004008421A0000041044004828403 -:1071B0008804030203000084000000000000200097 -:1071C00008A00004029011A0032002040390030011 -:1071D0000000000005000000000021840500000000 -:1071E000000000000000000040000000000000005F -:1071F0000088000000000000000003000000000004 -:1072000000000021000000000000002100008200BA -:1072100000000000840000048404040801008200CF -:107220009000820000000000200000000202000226 -:10723000002182000000000000111000004000004A -:107240000000211040044000000040000400200223 -:1072500000004003040000080000000000000109D5 -:107260000000820000028200200008800000000070 -:10727000091108000000C008041100000000A0006F -:1072800000000000000000000000000000020000FC -:10729000000000000000001003010001A000200019 -:1072A00000000000000004004100098800041000F4 -:1072B000000100000000008400000000C100000088 -:1072C00000000000080100000000000000000000B5 -:1072D000210003000000100000040900000200006B -:1072E000089010000000000040040000001020047E -:1072F000100008A000000000200000002100000095 -:107300000008000000000000000000000000000075 -:1073100000000001000088000000000000000300E1 -:10732000000000010000A0000001000000001000AB -:10733000000000C00101840200840001010000017E -:1073400000000000820100018200C001000008006E -:1073500001000000010000000000000002018400A4 -:107360000001200000000000200000000140008813 -:1073700040A0001000000000820100010000000099 -:1073800000000000000000000900000000000000F4 -:1073900000000000404111400940000305001100B9 -:1073A0000800000000400420000200080000400027 -:1073B0000000000000C010218000000900410820EA -:1073C00002080010000000101110000880100000DA -:1073D0008003410000001000000000000000800851 -:1073E000002000030020000040000000000020807A -:1073F00005008000000000094008000800040000AB -:10740000000000000000000800000008000000006C -:10741000000000000000008009000000414000085A -:10742000000000080080080010008500C100000076 -:1074300080000000000000002100000008A14100C1 -:107440000800080241000000000000008000000861 -:10745000880090002040C10300008021808000004F -:107460000000000300000000000000000000000019 -:1074700080000020000280000000001100000000D9 -:1074800000000041000000000000000000000000BB -:1074900000000000000000000008000000000100E3 -:1074A000000000900000000400A0880011000310FC -:1074B00002000200A000880000080100000001890D -:1074C0000090010000000100000010200200A00058 -:1074D000100140840300C000090182000400020280 -:1074E0008800000000012040204000000000000053 -:1074F0000000080008008801080000000000008863 -:10750000000000000001009000000000900000005A -:107510000100000000000000000000000000020068 -:107520000001000120002000010100000101010113 -:1075300000010000000002000000C0000001000087 -:107540001000000000002000000100000041008841 -:10755000C09000C00000000000000000000000001B -:107560000000000000A00188000000C00001000130 -:1075700000000001100000000000100100000000E9 -:1075800000000001000000000000000000000000FA -:107590000000100000000000000000000003004197 -:1075A00080110041204080100008100800000303F3 -:1075B00021211041000200090000001000200002FB -:1075C00041030020000800200000004100000020CE -:1075D0001141004000890000000000000000000090 -:1075E000000000000000000009801000008000087A -:1075F00000200008004180200003004104410020D9 -:1076000020081040004100000000000000000005BC -:1076100000000000000000000000000000004180A9 -:10762000000003000011000800020000000041807B -:1076300008002180100300000080000000004111BC -:10764000000000000509412021000000080800009A -:1076500041202100080020004121202110000809BC -:10766000000000008080800000008000008000009A -:10767000000000000000000080200000008080006A +:106CD00000000000000000000000000000000000B4 +:106CE0000000000000000000000000000000200084 +:106CF000200020002000200020040100010020804E +:106D0000208020002000200420040000000020003B +:106D100020002000200020002000000000002000B3 +:106D200020042000200420002000000100000000BA +:106D3000200220002000200020042000000000008D +:106D40002000200020002000200020000000000083 +:106D50002000200020002000200002000000000091 +:106D6000200020002000200020042000400000001F +:106D700000400000000000004000000020002090C3 +:106D800000041004000000024000000000000002A7 +:106D900000020000000000020000000040000000AF +:106DA00000020000000200020002000200000000D9 +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000040000BF +:106DD00000000000000000000000000200020000AF +:106DE000000000000002000000000002000000009F +:106DF0000000080000002000000000000400000067 +:106E00000000080008000000000000000000020070 +:106E1000020000000400000000000000000000006C +:106E20000000000000000200004000100000000010 +:106E30000000000000000000000000000000000052 +:106E4000000000000000000000000000080000003A +:106E50000000000000000000A00000000000000092 +:106E60009000000008000800000000000000000082 +:106E7000200040840008000880000000000880080E +:106E800000080002000800000010000000080008D0 +:106E900000000000000804080000000000080008CE +:106EA000004000400008000000000000000800084A +:106EB000000000000000000840080000000000087A +:106EC00000080000000000080000000000000008AA +:106ED0000008000000000008000800000000000892 +:106EE000200800000000000800000000000000086A +:106EF0000008040000000000001000000000000076 +:106F00000000000000080000000000000000000079 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F6000000000000000000000000000000400001D +:106F70000000000000000000100000000000000001 +:106F800000000000000005000000000000000000FC +:106F900000000000000003000000000000000000EE +:106FA0000000009000000000000000000000000051 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF00000000000000000001000C00000000000C1 +:1070000000000000000008008400C0000000000034 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:1070500000000040000000000000000000000000F0 +:107060000000000000000000000000100000000010 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000300000003000000EA +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000200000000000000000000000000BE +:1070D00000000000000000000000000000000000B0 +:1070E0000000000000000000000000000000004060 +:1070F0000040000000000000000000001000000040 +:1071000000000000000000008200080010000000E5 +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:1071700000000000000000000000000000001000FF +:107180000000000000000000000000C0000003003C +:107190000000000000000000000000C0000000002F +:1071A000000000000000000000000090000000004F +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000010000000000000000000000000006E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000004100AD +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000001000000000008E +:1072F000000400400000000000000000000000004A +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000003000000FA +:1073900005000000000000000300000000000000E5 +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000027A +:107410000000000000000008000000400000000024 +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000010000000000A000010000000000004A +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:1075100000000000000004000000000088000000DF +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:10759000000000000000000080000000000000006B +:1075A00000000300000000000000000000000000D8 +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000000000000000BB +:1075D00000000000000000000000000000000000AB +:1075E000000000000000000000000000000000009B +:1075F000000000000000000000000000000000008B +:10760000000000000000000000000000000000007A +:1076100000000000000000000041000000000040E9 +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA -:1076A0000140000000000000000000010000000098 -:1076B00001C0010201100000000000400020000095 -:1076C0000104000000000000012000000000010093 -:1076D0000000010000A0004000000189002001001E -:1076E0000100820010400404080020000408200269 -:1076F00090000000000000000000C0008290908414 -:10770000040002002000080008001000080090009B -:107710008200810000E00000000000000000000086 -:107720000000880000E000020000884100E007003F -:1077300000000000000000008400000000000000C5 -:107740000000500000E000000000840000E00000A5 -:10775000000000000000000000000082000000E0C7 -:107760000000008100000000000000000000000098 +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00000000000000000000000000000000000BA +:1076D00000000000000000000000000000000000AA +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:1077100000000000000000000000880000E00700FA +:107720000000810000E000000000000000000000F8 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000000039 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 :107770000000000000000000000000000000000009 :1077800000000000000000000000000000000000F9 -:107790000000600000000000000000000000000089 +:1077900000000000000000000000000000000000E9 :1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 -:1077D000000000000000000000000000CF0C0000CE -:1077E000000000000000F0F0F0F000000000AEAE7D -:1077F000AEAFF0F0F0F000000000000000000F0F4E -:107800000F0F0000000028FA7DFA00000000FA289F -:10781000FA7D0000000000000000000000000000F1 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 :107830000000000000000000000000000000000048 :107840000000000000000000000000000000000038 -:10785000000000000000000000000000555500007E -:107860000000000000000000F8F8F8FF0000000031 -:10787000AAAAAAAFFCFCFAFA00000000000000006F -:10788000000F0C0C0000000028507D50000000008C -:107890005028507D000000000000000000000000A3 +:107850000000000000000000000000000000000028 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 :1078A00000000000000000000000000000000000D8 -:1078B000000000000000000000000000AF05AF0560 -:1078C00000000000FEF4AEA47070F0F000000000B4 -:1078D000000000000000000000000000000000FFA9 -:1078E000003D000000007F702F2000000000FFFF1F -:1078F000FFFF0000000055550000000000000000E0 -:10790000000040C254D67F757A700000000000006D +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 :107910000000000000000000000000000000000067 :107920000000000000000000000000000000000057 -:107930000000000000000000000000000000AFAFE9 -:107940000505000000005E540E04707050500000E9 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 :107950000000000000000000000000000000000027 -:10796000003D003D000000007F702F20000000005F -:1079700000001F140000000000FF000000000000D5 -:107980000000000068EA7CFE2F252A20000000008D -:10799000000000000000000000000000006100077F -:1079A000800D000000000000000000000000000149 -:1079B0008000000005610A2F850D00A0006100060F -:1079C000000D000000610006000D0000004150069F -:1079D000800D000000000001800200000000006136 -:1079E0004006009D00010040400500050000000029 -:1079F00000000000000080610006009D00010061A1 -:107A00000006000D0000A0610006000D00000061EE -:107A10000006000D00000000000000000000000053 -:107A20000000000000000000000000000000F0F076 -:107A30005050FAFC0F0F00000000303FFAFA4F4F91 -:107A4000CF0F0FFF0AFF000000000D0DFDFD2828DD -:107A5000AAAABAFB92D3003C00550C0C0F0F0000F1 -:107A60004F0F1F0FAAAAAAAA553CFF0F0000000043 +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A000000000000065000F800D00A000610007CE +:1079B000800D00000000000000000000000000003A +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000000000000000000A7 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 :107A70000000000000000000000000000000000006 -:107A80000000000028F8F8F80000000028F8AAFA22 -:107A90000000000028F800F00000000000000000D6 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 :107AA00000000000000000000000000000000000D6 -:107AB00000005050FAFC000000000000303F0A0AAD -:107AC0004F4FCF0F00FF0AFF000000000808F8F832 -:107AD0002828000038381010003C00550C0C00001D -:107AE000000041001400BABABAFF553C000F000074 +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000000000000000096 :107AF0000000000000000000000000000000000086 -:107B000000000000000028F828280000000028F8E5 -:107B100000F00000000000F028F800000000000065 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000065 :107B20000000000000000000000000000000000055 -:107B30000000C3000303000000000000000000007C -:107B40000000FFFFFFFF000082BE000000000000F9 -:107B50000000FF3CFF00F0F0FAFA003C000F0000CC -:107B6000FFFF0000DFD01F100000000000FF00FF3B -:107B70003CF0FFAA0000000000000000D757575754 +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 :107B800000000000000000000000000000000000F5 -:107B900000000000BEAF14AF0000000000000000B5 +:107B900000000000000000000000000000000000E5 :107BA00000000000000000000000000000000000D5 -:107BB00000000000C3000303AAAAF0F000000000C8 -:107BC000000000002A280A000F0F0000000000003B -:107BD000000000003C3C00000000AAAA003C000F8E -:107BE000F0F028EB0000DFD01F100000000000FFC5 -:107BF00000FF3CF000AA0000000000000000D75584 -:107C000055550000000000000000000000000000CA -:107C1000000000000000BE05140500000000000088 -:107C200000000000000020001000400020002000A4 -:107C300020802000200020002000200020004100A3 -:107C400040802000208088008441A0C08400200063 -:107C5000820820008800C0804100200020008400AD -:107C600088002000200000034000C0094000880573 -:107C70000480C00084100400040088008880200074 -:107C80004080880020002080000021800400C00087 -:107C90001000204040000000400020008400200030 -:107CA000400020002000208000A000000000000212 -:107CB0004000004000900002000240000000000070 -:107CC0001002050210901008104041C00508200065 -:107CD00040A00000004020000004020000000084DA -:107CE000418840000000000000000920040000005E -:107CF0000090402020900920000200000000201089 -:107D000000000002200200000040410008100000B6 -:107D10000090000000010000000000000000410091 -:107D200040000900000040000902010010040102A7 -:107D30000100100001000402008200009000900089 -:107D4000000000000000400082100402C01000008B -:107D500002212121000502000300000002000000B2 -:107D600008104080000809A00210000004009000E4 -:107D70000800080504000400040000100880010049 -:107D80000200011000400182091003008510080064 -:107D9000850000000821000008804008080000005D -:107DA00008000800400011100900010010008000C8 -:107DB00040854000800010000009021141000000D1 -:107DC000000000000008001080080284A0090000E4 -:107DD000200800008800410000084004000800005E -:107DE0000000800080020084100904080000800464 -:107DF0000008098403008500850884080009A04064 -:107E000002000000080100010209888840100801F2 -:107E1000840802004004C0000082001082848000B8 -:107E20000000C000800089008200020802040000F7 -:107E30000000000800000005000000000021000014 -:107E40000000000900008800400040008808000091 -:107E5000400010001000000004000000002100009D -:107E600082001000000004210010822100050000A3 -:107E70008400000900050808902104210403010082 -:107E800000000000080505200009A0210080010075 -:107E900000080000900500000000841000000011A0 -:107EA000000000008800880000008200000000211F -:107EB000212000000000000000004100000004003C -:107EC0004000020004000000000003000000000069 -:107ED000000009044000059005100000004021A0AA -:107EE000000003A0850000A04100030000080084FA -:107EF000000008000000119080A008009000801091 -:107F0000040021004000900084010000009041081E -:107F100002000900410000020000030005001100FA -:107F20000800000000000490008808000900000418 -:107F30000000858000000900000010C0820083005E -:107F400084048211C00000030400820082008209C0 -:107F500010208200080090000000C0040800040403 -:107F600020040810080082001000C0200400104007 -:107F70000000000000000800C00010008200A00304 -:107F8000014100041020C0030010820583008540D9 -:107F9000C00810000811A00004000000080010092B -:107FA000002005000410820004000010A00004035B -:107FB000000200001008000040000000C10821007D -:107FC0004000000800404100030000840000000061 -:107FD0000000000000000000008410840300000086 -:107FE000100011000390000004A0000000008800B1 -:107FF00004C00384000000001000000000A0030083 -:1080000000001000001041902100040111C0400048 -:10801000400141011100210005000420000003007F -:10802000000002000800080000000000000004003A -:108030004100214021020000C000A0008200820017 -:10804000000040020000000008000000000582005F -:108050000008000082000400A0009000000520003D -:1080600010008200C021A000C0000021000000001C -:108070000000A00010000000888000000800400000 -:10808000000010000800080000210004080005801E -:1080900008400084C000002100000000000008002B -:1080A00000000000C000000010212000841100002A -:1080B000C00000000000C0054020000011000000CA -:1080C00000000400800100000000020000000088A1 -:1080D0001004000011000004858800080010400012 -:1080E0008000000000000008410005000000009032 -:1080F0000020000400040902000002202020118852 -:1081000008A02004052009000400000008008000E9 -:108110008420002100100000000000000004000086 -:108120002000000005000820000000000000009072 -:1081300000C00000050004000000000082000000F4 -:108140000000018500000080000000080000000021 -:10815000C0000000900000000021000000000000AE -:1081600082000400000000090021000000008400DB -:108170002000080000000000010000000000820054 -:10818000840000214000C000001000800002820036 -:108190000400048505021000000800080000821099 -:1081A00010000020000000000041200082040000B8 -:1081B00082004000011101000100010000080000E0 -:1081C0000000000010080000000200900200000003 -:1081D000000041000300001003000588200000009B -:1081E0000000000000A000040000000000200000CB -:1081F00000020040412000000000040000000000D8 -:108200000000000000A08000080000C00020200442 -:10821000008800028420402005002000200000008B -:1082200000030800030040000020210000000000BF -:1082300009000804000002000200024002000000E1 -:108240000100000000000000040002000000000027 -:10825000000000000000000000000000000000011D -:1082600000000000000000000000C000000000014D -:1082700000000000000000C1A0820084C0200000B7 -:1082800000000000000000000001000000000001EC -:108290000800000000009000C0C1000002040808AF -:1082A00000400000000000828800010020008400DF -:1082B0008804002000A0889000C100018200000016 -:1082C00000000300000000000300800080000000A8 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C20000000000000002000000000002000000014 +:107C30002000200020048800000088002000880028 +:107C40002000200020002000000000002000000094 +:107C50002000200020042000000020002000200040 +:107C60002000200020000003200000000000200071 +:107C700000002000200420048400000020002000D8 +:107C80002080200020002000200000000000208232 +:107C90000000200020002000200000002000200024 +:107CA0002000200020002000000400000000004010 +:107CB00000000000000400000090000000900000A0 +:107CC000000000900000000000000000000200041E +:107CD0000000008400040002000410040000000002 +:107CE0000000004000000004000000000000000050 +:107CF0000000000000400040000000000000000004 +:107D0000000400020000000200000000000000C0AB +:107D100000100000000000000000000000000090C3 +:107D2000000000000000000000000000000008004B +:107D30000800080082100800080000000000080089 +:107D400008000000000002100210000000000802FD +:107D50000800840000000000000000000000000097 +:107D6000000000000000020082000000000000008F +:107D70000000000000000000000000000000000003 +:107D80000000000020000080000000000000000053 +:107D90000000C10000000000900090000000000002 +:107DA00000000000020002000200020000000000CB +:107DB00000000000000000000000000000000000C3 +:107DC000000000000008000800080000000000009B +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000100010001002100000000051 +:107DF0000000000000000000000000000000000083 +:107E000000000000000080000002000000000000F0 +:107E1000000000000400000000000000000000005E +:107E20000000000000008000800080008000000052 +:107E30000000000000000000100000000000000032 +:107E40000000000000000000000000000000000032 +:107E5000000088000000000000000000000000009A +:107E6000000000000000000000080000000000000A +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000100000000000B2 +:107EC00000000000000000000000000000000000B2 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 +:107F30000000A0000000A0000000080000400000B9 +:107F400000000000000000000000000000009000A1 +:107F5000000000000000000000000000010082009E +:107F6000000000000000000000000000000082008F +:107F70000000000000000000000000000000000001 +:107F8000820000000000000000000000010000006E +:107F900000000000000000000000000000000000E1 +:107FA0000000000000050000000000000000840048 +:107FB00000008440000000000000000000400000BD +:107FC00000000000000000000000000000000000B1 +:107FD0000000000800000000000000000000040095 +:107FE000000200000000000000000000000000008F +:107FF0000000000000000000000000000000000081 +:108000000000000000000800000000000000020066 +:108010000000000000000040000000000000000020 +:1080200000840000000000000000000000000000CC +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000088000000000098 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:108090000000840004000000000000040000000054 +:1080A00000000000000000000000000000000000D0 +:1080B0000000840020008400000000000000000098 +:1080C0000088000000000000000000000090000098 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000400050 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:1081100000000000000080000000000000010000DE +:10812000000000000000000000000000000000004F +:1081300000000000000080000000000000000000BF +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000001000100000001800000000000008C +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:10819000000000000000000000000000000000409F +:1081A00000000000000000000000000000000011BE +:1081B000000000000040000001002100000000005D +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E00000000000080204A040000240000000005F +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000040000000000005A +:1082200000010000000000900084000000880000B1 +:108230000000000000000000020002408200000078 +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:1082600000000000000000C090020020008200001A +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000008801100100019000B3 +:1082A00000000000000000000000000000000000CE +:1082B000000000000000000091C120009088000034 +:1082C00000000000000000000000000000000000AE :1082D000000000000000000000000000000000009E -:1082E00000410011000300030000400002000000F4 -:1082F000404100040403000340C1008000A0800945 -:1083000000000000000000000000004100400005E7 -:108310000008800000000000800000C10805808582 -:1083200000800000000000000000000010000000BD -:10833000000010000080000000000082030200091D -:1083400000092000100005004100A0008300C100CA -:10835000C10000000000000000002080110040006B -:1083600041050000000000000000001000020000B5 -:10837000000000008000800080008000804180417B -:1083800080800000000000000000000000000000ED -:10839000800080000000000380008000000080005A -:1083A0000000002000000003000000000900030599 -:1083B0008800C00000008010800000000000000065 -:1083C00000008000000001000000014010001000CB -:1083D0008200C10000000000000000000002000058 -:1083E000000001000000000000000000000100018A -:1083F00000880000900002004000C00040008201A0 -:108400008401C0C0000000000000000000009000D7 -:1084100090201000082088008200A010C08804046A -:1084200002009000C0010000000000A00000400019 -:1084300041000588C1208200100184849010000052 -:1084400000000000C000000000000001000100006A -:10845000000000010001000000000000000000001A -:108460000000000000000100000001000000000109 -:108470000001000100000000000020000000C040DA -:108480000040C18401C0000100000000080000009D -:10849000000000000300010000400002901000C036 -:1084A000008800A001A08305020000000000A000D9 -:1084B00000900010104100C0080200A0000020A0A1 -:1084C00088910001000000C1000900210021004145 -:1084D0000009002100210041000000000000000010 -:1084E000000000000000000002004000200000002A -:1084F00000200003000202110000400041000000C3 -:1085000080802180848041800001050000000000FF -:10851000000009000000A00004000080008000802E -:108520000080004000C0024109C18000000000003E -:1085300000000008008800A100408080008000004A -:10854000050000202010410500C100890000000046 -:108550000000000900800000004000000000000052 -:108560000000410008000800024000000010000068 -:108570000000000000008000000000080000000073 -:108580000000801180400083008000010000004155 -:1085900000000000000300830080000080008008CD -:1085A000000000000820098009800500800080008C -:1085B0008000000080200000000080080000800093 -:1085C0000000000000110000000000000003000097 -:1085D0000000000000010020000800000000000072 -:1085E0000000000001820000010000000000000106 -:1085F00000000000020090008400C0000000009015 -:1086000000880000C001400020C0A004000100005C -:1086100000000000000000000020008400001000A6 -:108620000404020090000100000201840000C00068 -:10863000A000020000004000A040049010000200D2 -:108640008288202088000000008800008800000048 +:1082E000000000000000000000808000000000800E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:108310000000000000000000000080410021400338 +:1083200080200300000000000000000000000000AA +:108330000000000000000000000088898808024159 +:10834000002000000000000000000000000000000D +:10835000000000000000000000000000000000001D +:1083600000000000000000000000000000410000CC +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:10839000000000000000000000000000000080005D +:1083A00000008091000080000000800000000000BC +:1083B000000000000000000000000000098008002C +:1083C0001000A003000000000000000000000000FA +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000018C +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:1084100000000000000000000000000000000090CC +:1084200082000000C091000002000000C0000000B7 +:108430000000000000000000000000000000000834 +:1084400000000100C001000000000000000000006A +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:108470000000000088000000000000000000000074 +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000400188911000C0000082000000000020 +:1084B00000000000000000000000000000000000BC +:1084C00000010000010100C00000000000000000E9 +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F00000000000000080000000000000000000FC +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:108520000000008010808980008000008000000032 +:10853000200000000000000000000000000000001B +:108540000000000811111005208900000000000043 +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000004000000000000000000000BB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A0000000000000200989118008000000008000 +:1085B00000000000000000000000000000000000BB +:1085C00000000000082010892000031100000000B6 +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F00000000000000000008200000000000000F9 +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:1086200000000000000000000188011001000000AF +:10863000009000200000000000000000000000008A +:108640000000000000000088899100000100000087 :10865000000000000000000000000000000000001A -:108660000000000000000000000000000000008288 -:10867000000007000000600000E00000000084002F -:1086800040E0000000000000000007004842000039 -:108690000006000007000000008200000700000044 -:1086A0000082000007000000000000000000000041 -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA +:10866000000000000000000000000000000000000A +:1086700000000000000000060000070041000000AC +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A0000000000000000000818100E007000000E1 +:1086B000884100E00700000000000000000000000A +:1086C0000000000000000000810000E00000000049 :1086D000000000000000000000000000000000009A :1086E000000000000000000000000000000000008A -:1086F00000000000000000003F3F3E3C0000000082 +:1086F0000000000000000000F0F0F0F000000000BA :108700000000000000000000000000000000000069 :108710000000000000000000000000000000000059 -:108720000000098109E724BDF0F000000000FF000F -:10873000FFF4FF00FF000000000002831A9BF67E9A -:10874000F6187F4F7343878787873C3C3C3C3C3C13 +:1087200000000000000000000000000000005C00ED +:1087300096000000000000000000000000000000A3 +:1087400000000000000000000000FF00FF0066665F :108750000000000000000000000000000000000019 :108760000000000000000000000000000000000009 -:10877000000000000000000000003E3C3E3C000005 +:1087700000000000000000000000FFFFFFFF0000FD :1087800000000000000000000000000000000000E9 :1087900000000000000000000000000000000000D9 -:1087A000000000006F816FE7000000000000000083 -:1087B000FF00FF24FFF0FF660000000026A73EBF79 -:1087C000907E90187C4C70408181E7E73C3C3C3CBB -:1087D0003C3C000000000000000000000000000021 +:1087A00000000000000000000000000000000000C9 +:1087B0003C00660000000000000000000000000017 +:1087C000000000000000000000000000FF00FF00AB +:1087D00066660000000000000000000000000000CD :1087E0000000000000000000000000000000000089 :1087F0000000000000000000000000000000000079 -:1088000000000000000000000000000041084000DF -:1088100000842102000000000000000000000000B1 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 :108820000000000000000000000000000000000048 :108830000000000000000000000000000000000038 :108840000000000000000000000000000000000028 :108850000000000000000000000000000000000018 -:1088600000000F6F0F3F000000000000000000003C -:1088700000000000000000000000000000000000F8 -:10888000000000000000000000003C3E3E3C0000F4 +:108860000000000000000000000000000000000008 +:10887000000000000000000000000000000000698F +:10888000003A0000000000000000000000000000AE :1088900000000000000000000000000000000000D8 -:1088A0000000000016761F7F0000000042FF03FF5B -:1088B000303060601F1F1F9F2424E7E70000000086 -:1088C00000000000666E66761C9D5EDF9999C3C34A -:1088D0000000FFFF000066660000000000000000CE -:1088E000000000000066003C0000000000000000E6 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000999969690000000066660606DC +:1088C00000000000000000000000000000000000A8 +:1088D00000000F0F000066660000000000000000AE +:1088E0000000000000000000000000000000000088 :1088F0000000000000000000000000000000000078 -:10890000000000000000000000000000000606005B +:108900000069003A000000000000000000000000C4 :108910000000000000000000000000000000000057 -:10892000000000000000107019790000000042FFF4 -:1089300003FF303060600F0F0F9F00000000000049 -:10894000000000000000000C0030048546C7FF0056 -:10895000F0F0000000000000666600610006000DF7 -:10896000000000610006000D00050000000000008E -:10897000000000610006000D00000571002E000DD2 -:10898000000000610007800D000000210003800D41 -:1089900000050061000E000D000000000510002819 -:1089A0000000000005610A2E050D00A0000000284F -:1089B000009000A500615006001D0001A00000000D -:1089C0000000000000610006000D0005000000002E -:1089D0000000000040638006002D920200000000AD -:1089E000FCFC3CFF00000000BCBC3CBE00000000E2 -:1089F000000000000C5D5D0C0000000000000000A5 -:108A000000000000000000000CFF0EFF000000004E +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000FFFF39 +:10894000060600000000000000000000000000001B +:10895000000000000F0F000066660000000000002D +:108960000000000000000000000000000000000007 +:1089700000000000000000000000000000000000F7 +:10898000000000002028000000000000000000009F +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B000000000000021002B804D0008006100260F +:1089C000800D000500000000000000000000000015 +:1089D000000000004063800180219202000000003E +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 :108A10000000000000000000000000000000000056 :108A20000000000000000000000000000000000046 -:108A3000000000000000FFC3FF01AABABAAA0000AC -:108A4000000000000000000000008F83BFB30000A2 -:108A500000000000000000000000BCBCA0BC000042 -:108A600000003C3C3C3C00000000BCBC3CBE0000A4 -:108A70000000000000000C0C0C0C000000000000C6 -:108A80000000000000000000000000FF0AFF0000DE +:108A3000000000000000040004000000000000002E +:108A40000000000000000000000000000000000026 +:108A50000000000000000000002C000000000000EA +:108A60000000000000000000000000000000000006 +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 :108A900000000000000000000000000000000000D6 :108AA00000000000000000000000000000000000C6 -:108AB0000000000000000000FF01FF010030300056 -:108AC0000000000000000000000000008C80BCB02E -:108AD000000000000000000000000000A0A0A0BCFA -:108AE000000000000000000000000000200008005E -:108AF000000000000000000000000000F0F8F0F4AA -:108B00005F553F3C00000000000000000000000036 -:108B100028285FFF0000000000004D4D000000000D -:108B2000000000000000000000000000CF0C00006A -:108B300000000000000000000000F000F0F0000065 -:108B400000000000000000000000000000003505EB -:108B500035F500000000000000007DAF28AF0000E8 -:108B600000000000000000C0C00000000000200065 -:108B700008000000000000000000000000000028C5 -:108B800000140F000F0000000000000000000000B3 -:108B9000000028285F5500000000C3C34D4D0000B1 -:108BA000000000000000000000000000C3C3CF0C64 -:108BB000000000000000000000000000F0000000C5 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD00000000000000000000000003C00004555C0 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B300000000000000000000000FF3C550F000096 +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000020013 +:108B60000A000000000000000000000000000000FB +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB000000000000000000000000000003C550F15 :108BC00000000000000000000000000000000000A5 -:108BD000350535F500000000000000007D05280582 -:108BE00000000000000020002000200021002100E3 -:108BF000219021002080840020402010044020008B -:108C000020800588040020002000200000808900CA -:108C10002080200040000400100020802010200050 -:108C200084002000000300882080000520000480CC -:108C30008480208020802080200040842080A1002B -:108C4000411000801000890021850188200020004B -:108C50002000040020004000200020002000A1008F -:108C600088000400208410000000000000000400C0 -:108C70000400044004000010000000030000800015 -:108C800009004040044041000002040000002008A8 -:108C9000400009020000200000000000040800005D -:108CA000094000000000000020200520099000007D -:108CB0004120402000204020090441C0004104041C -:108CC000400082402002A000100002084002000282 -:108CD00005004000090040002000000000000000E6 -:108CE0001000400000040008000088030000840019 -:108CF00002000305041009108200010000050005B0 -:108D00000140080200100090000000000000000078 -:108D10000000044008004000000000020009084074 -:108D200002004040004001400000044004081010D0 -:108D30000002C08003000310090509400810040464 -:108D400009100000040240100010001004004080D0 -:108D500002050400040000100900020004000010D5 -:108D60008410000040004000000200880900000854 -:108D700000088008840880090209000002044000FD -:108D800000000801830900090009000800C00084F0 -:108D9000400802400008000884080000090920007B -:108DA000000900088008000808080000808484008A -:108DB000020005090320088404088208A010C008E6 -:108DC000050188082010C0410208040804080008B2 -:108DD00080020008000000000009C00804000040F4 -:108DE0004000091100408040800800090408C000CC -:108DF000A0020041014100000003004100000010FA -:108E000000000010040005400500080084008200F6 -:108E1000A010881084030000004188008200040034 -:108E20000010A1000800040004000000000004007D -:108E300088000400C0C1040000000000900000038E -:108E40002000000588000408000804400010040009 -:108E50000400042182000000820000900000000055 -:108E6000A0A1044090022080010040000100050004 -:108E70000000000004A00800000000000000030043 -:108E80000000000011011000040140000800210052 -:108E9000210000000000030010004100000003005A -:108EA000000010000800030021000800000000007E -:108EB0000000400000004020009000000000002062 -:108EC000000085000000000041000804800004014B -:108ED000000041004000100000000000411140006F -:108EE00000002102000200910840020000880400F6 -:108EF0008200C0008280100004401140840210C132 -:108F00004000C0000004840082024009844083C005 -:108F1000C0001000000082094008C0000040820527 -:108F20004011C000400088408420004090048284AA -:108F300000002020200000A00020A0410800C00464 -:108F40008200C011C0400800C082028040104189E8 -:108F500082008400C000A000050208004000A0823A -:108F60008200000010218280004010410800024071 -:108F70000400000000A02110000080000800000094 -:108F800000200000008203A0002000412108009082 -:108F900010200000001000001100800108000400F3 -:108FA000000000080990000010A00000009100825D -:108FB00000080000800080004005041100900800B7 -:108FC00004A004002000040000000211834000857A -:108FD00090101000100000101000C0048300210049 -:108FE0004140000000000008000200C00302000031 -:108FF00080001100A0000008000000000000040034 -:109000004020100020001008A00000000008100000 -:109010000020400000000000C000880000000000A8 -:109020004080100000000800C000884104000000DB -:109030008400A0000000A00000039100A080822115 -:1090400008008200400000000400C000C0000003CF -:10905000C1894000000200000000A0008210000052 -:109060000000080088008200C000C00000004080AE -:10907000A084408083000500000000200000000064 -:109080008000000100000004000000000008000053 -:109090000000050590020400090400900000000093 -:1090A00009008002040000000800000003C0000066 -:1090B00000004000020000000020000004204104E5 -:1090C000408411000088A100000003000082000419 -:1090D000000008100000080100000000002003004C -:1090E00009000004050421002088110405842000E3 -:1090F00008200020002002000041001100000000B4 -:10910000000088000203000000008200C00082000E -:10911000C08040000400000020000000000000109B -:1091200000008200000040808400080400004041EC -:10913000A0000000000004000000820040000800C1 -:1091400084008400000084000400881110040021C1 -:10915000880004000410402140004000400240000C -:10916000840000008200000000004000A0004000D9 -:109170000000C008C00082401000410000000084D0 -:1091800000000000000800100000000000100000B7 -:109190000488002082008000000000002000000001 -:1091A0000000200803002090000200008000004022 -:1091B000002000000000000000000000000000008F -:1091C00000000500208800000500A0400400000108 -:1091D00000000020800420010000000000000000CA -:1091E0004000000010000000219020400084008812 -:1091F00000400020040008000004000000000000FF -:109200000000000010C09090008290040000000058 -:109210000000000000C091820204820900000000EA -:1092200000000000000090008200000000C00490D8 -:109230000088004000000000000000000000000066 -:1092400000000200000000C09004009000400108EF -:1092500011C088080084049101C140828800000088 -:109260004100820000008200010000004000010077 -:1092700000001000000008C0401004A000A0000082 -:1092800000000000000080808000000080000000DE -:109290000000000000000082A120002080090000E2 -:1092A00000000000000000041109800000000080A0 -:1092B000800000000000000000000000000000002E -:1092C000000040000000000020808080000000803E -:1092D000020003000580000090410220800400107D -:1092E00000002000800000000000030000000000DB -:1092F00004000500000000008480858080000000DC -:1093000000000000000000000000801000808000CD -:109310000000002000008000830000081000891079 -:1093200000000000000000000500000040004100B7 -:10933000000000000000000300008000800080208A -:1093400000000020000000030000000000808000FA -:109350000000000800400083008005800800000035 -:109360009100030041004002C10080000020800005 -:109370000000A0000500410208118880C111914041 -:10938000C1030000000000000000000090410082C6 -:10939000C008000020009090C000100000C101A093 -:1093A000C0850000000000000000008800000000F0 -:1093B0000100008200000000000120820200020083 -:1093C000C001000000000008000000088800902094 -:1093D000820010080401C0C1A04184044004401070 -:1093E0002000C19008000000A001C100040020017D -:1093F000A082A04041108800200103000804100052 -:109400004010C101000000000000000083000000C7 -:10941000022002C0000000000000000002900000D6 -:109420008241A0C000000000000000000001000117 -:1094300001010001C00000000000900000000000D9 -:109440000000000000000001900002010100050082 -:10945000000102000201C00020001000C001839141 -:1094600000A008A140A1000000008201000100024C -:10947000002000000020000100010000000008A101 -:109480000020900400C10000000000000000400027 -:1094900000008000848000000000000000000883BD -:1094A0001005050503C000000000000000000009D1 -:1094B0002040211000108000000000000300000088 -:1094C000000000000400000003400008801041403C -:1094D000900800048005A0400020801180088311BE -:1094E0000804038841880003004100050021004171 -:1094F0000083002000050020001000200011000063 -:1095000080080008001000C00000000000000000FB -:1095100080118000008000008000008000000000BA -:10952000C1208000218040050000000000000000F4 -:10953000090409004100000241002000020004006B -:1095400041082100208004000000000800210000E4 -:109550000000000000830080000080050080000003 -:109560000000410540A021800502008000020000AB -:1095700000058000000380808000090005000800CD -:109580004010C1A0110983802041000000000000AC -:109590000000C0018220A040C000C000A0040082E2 -:1095A0008800C10120400902040000000000000002 -:1095B00000000100000000000001010000000100A7 -:1095C00000000100002000840000000000010000F5 -:1095D000000000000000000900080000C000200892 -:1095E000C0A0A0000100000501400001000400002F -:1095F00000C00000C0002040040482000040008839 -:1096000000040100C1050000400805000000000042 -:109610000000000000000000070000000000000043 -:109620000000000000000000070000000000000033 -:10963000000000000000000000000000000000002A -:1096400000008400000000000000000000004182D3 -:1096500000E0070000820006000007000000840010 -:1096600000E00000000A0082000007000000008205 -:1096700000000700000000000000000000000000E3 -:1096800000000000000000210000070000000000B2 -:10969000000000000000A0FF28FF00FF00AAAABEF3 -:1096A000AAEB0000000030BA303000FF003C0000A0 -:1096B00000000000000000000000000000000000AA +:108BD00000000000000000000000000000FE000097 +:108BE0000A000A0040000000880020002000000861 +:108BF0000000000004000000200040000000000011 +:108C00000000000420008800000020002000000078 +:108C10000004200420000000200020000000C0000C +:108C200000000000000320000000000020042000DD +:108C300000030000000020008800200004008500E0 +:108C4000C000000400000000000000000000200040 +:108C50000000000000042000C0000000000021000F +:108C600040800000040000004040000000000000C0 +:108C700000004000000000000000000800000000AC +:108C800000000000000040000000000000000000A4 +:108C900000000002808300000000000004000000CB +:108CA00000000000000000000000000000040000C0 +:108CB00000000000000000000000000000000000B4 +:108CC000080000000002000000000000000000009A +:108CD0000000000000000000000200000000000290 +:108CE000400280020000000000000000000004407C +:108CF0000400000000000000000000000000000070 +:108D0000000000000000000002000200000000005F +:108D1000200000000000000400000000000000002F +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000040001080000000000000000033 +:108D700000000008000000080008000800000000D3 +:108D80002088000800000008000000000900000022 +:108D90000000000800100010000900080000000496 +:108DA00000000008000000080000000000000000B3 +:108DB000000040000008000000000008000800005B +:108DC0000000000000080000000800000000000093 +:108DD0000000000000080000000000080008030078 +:108DE0000000000000088000800800004020000013 +:108DF0000000000000210000000000000000000052 +:108E0000880000000040000000000000000000009A +:108E10000000000200000000000000000000000050 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000A10000000000000061 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000800000000000000000000000000CA +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC0000000030000000800000000000000030094 +:108ED0000020000000000000000000000000000072 +:108EE0000000080000000800000040000900000029 +:108EF0000000000000000000000000000000000072 +:108F0000000004000000000000000000000000005D +:108F10000000000000000000000000090011000037 +:108F20000000000000000000000000000000000041 +:108F30000000000008000000000000000000000029 +:108F40000800000000000000000000200020C020F9 +:108F500000200800000000000800000000000000E1 +:108F600000000000000000000000000940000000B8 +:108F700000000000002000000000000000000000D1 +:108F8000000000000000000000A000000000000041 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC0000000000000000000000000000001080197 +:108FD000000100010000000000000000000005008A +:108FE0000000000000000000000000000000800001 +:108FF0004100000000000000000000000000000030 +:109000000000000000000000000000000000000060 +:109010000000000000008200080040000000000086 +:1090200000040080000000000000000000000000BC +:109030000000000000000000000000000000100020 +:10904000000000000000000040000000C000000020 +:1090500000000000000000000041A000000004002B +:1090600000000000040000000800000008000000EC +:109070000880008000800000000000000000000068 +:1090800000040000000000000000210000000000BB +:10909000000000000000000003000000800000004D +:1090A00000000000000200000000000000000000BE +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 +:1090D00041840000000003000000000000000000C8 +:1090E0008000000000008000000000000000000080 +:1090F000000008020004000400410000000000001D +:10910000000000000800000000000000000800004F +:10911000000000000000000000000000000020002F +:10912000010000000000002000000002000000001C +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:109150000000000000000200000000020005000006 +:10916000000000000405002000008200A0040800A8 +:10917000820000000800C0000000000000000000A5 +:10918000000000000000008400000000000000005B +:1091900000000000000000000000000000000000CF +:1091A000800002000000000000010000000000003C +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000003009C +:1091D000000000000000000080000000000000000F +:1091E000008400000000C100000100000000050034 +:1091F000410041000000000000000090000000005D +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000004E +:109220009000000088A10102A188C0000000000099 +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E +:10925000000000000000000000000000000000000E +:1092600000000000000000000000000000000000FE +:109270000000000000000001A100900000000000BC +:1092800000000000000000000000000000000000DE +:1092900000000000000000000000000000000000CE +:1092A0000000840009008320218385888008000055 +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000000000000000000000000000008E +:1092E000000000000000000000000000000000007E +:1092F00000000000000000000341A1110805000566 +:10930000000000000000000000000000000000005D +:10931000000000000000000000000000000000004D +:109320000000000000100000910040208800C000F4 +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:1093500000000000000000000000000000A000105D +:1093600000800000000000000000000000800000FD +:109370000000000000000000000041000400100395 +:1093800003000000000000000000000000000000DA +:1093900000000000000000000000000000000000CD +:1093A0000000000000000001000084080100A00887 +:1093B000C1A000000000000000000000000000004C +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000404D +:1093E000000100100000000000000000000000026A +:1093F000000000C0000000000000000000000000AD +:10940000010001000000000000000000000000005A +:10941000000000000000000000000000000000004C +:109420000000000000000000000001000802020926 +:1094300009C1C0C0000000000000000000000000E2 +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:109460000000C0000000000000000000000001003B +:1094700000004000000000000000000000000000AC +:1094800000000101000000000000000000000000DA +:1094900000000000000000000000000000000000CC +:1094A000000000000000000000000000080900A10A +:1094B000A18920218085000000000000000000003C +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000000000008C +:1094E00000000000800000000000000000000000FC +:1094F000400000000000000000000000000000002C +:109500000004210305200303000000000000000008 +:10951000000000000000000000000000000000004B +:1095200000000000000000000040000000000000FB +:10953000A18880C0000010090000000000000000A9 +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B +:109560000000800400210000000000000000000056 +:1095700000000000004000000000000000000000AB +:1095800000001005000009000003000000000000BA +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000004102088900C0910100000000000085 +:1095C000000000000000000000000000000000009B +:1095D000000000000000000000000000000000008B +:1095E00000000000C0008400C00000000000000077 +:1095F000000000000000000100000000000000006A +:109600000000000000A000000100000000000000B9 +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000810000E0D9 +:1096300000000000884100E00700000A0000000070 +:10964000000000000000000000000000000000001A +:10965000000000000000000000000000000000000A +:1096600000000000000000000000040000060000F0 +:1096700000000000000000000000040000000000E6 +:10968000000000000000880000E000000000000072 +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B000000000000000C382C3C3009A2020000005 :1096C000000000000000000000000000000000009A :1096D000000000000000000000000000000000008A -:1096E00020FF80FF000000000000000050FF54FF3A -:1096F00000000000000000003CFCAAFA000000008E -:10970000000000000000000000000000000504044C -:109710000000000000000000A0A02828000000AA0F -:10972000AAAAAAAA00000000303030BA0000003C0B -:109730000000000000000000000000000000000029 +:1096E000000000000000000000000000000000007A +:1096F000000000000000000000000000000000006A +:109700000000000000000000000000000000000059 +:109710000000000000000000000000000000000049 +:109720000000000000000000000000000000000039 +:1097300000000000000000003C283C3C00AA0000A3 :109740000000000000000000000000000000000019 :109750000000000000000000000000000000000009 -:10976000000020208080000000000000000000FFBA -:1097700014FF000000000000000000F000F00000F6 -:10978000151500000000000000008282C0C0000526 -:10979000040400000000000000003D057D550505A3 -:1097A000555500000000FF0FFF053F3C3D3D55555E -:1097B0001414000000000000000000000000000081 -:1097C00000005D5DFF0C00000000000000005F5520 -:1097D0005D5D000000000000000000005D0CFF0C5B -:1097E00002C232F2FF00FF00FFFFFFFF000500553D -:1097F000FF05FF1400000000000000000000000052 -:109800005555555500000000FC5F0C5F000000003E -:10981000C0C0C00000000000000000003D053C008A -:109820000505000000000000FF00FF050F00050512 -:109830000000141400000000000000000000000000 -:10984000000000000C0C0C0C0000000000000000E8 -:109850000F000C0C000000000000000000005D0C78 -:109860000C0C0ECE3EFEFF5DFF0C70503000000071 -:10987000000005051414000000003C3CFF0000003F -:109880000000FF5D5D5D00000000FC500C50000F0B -:10989000003C0000C0000000000000000000A50027 -:1098A0005A00059000A5A000000000000005A56179 -:1098B0005A06059D00A500000000000000000061A0 -:1098C0000006000D000000615006000D0000006160 -:1098D0000006000D0005000005610A2E850D00A0A0 -:1098E00005615A2E050D00A0A0610007800D000043 -:1098F00005610A26051D00A50061002E000D000867 -:10990000A0610006000D000000610006000D0000CF -:109910001061202E004D0008000000000000000033 +:109760000000000000000000000000FFF0F000001A +:1097700000000000000000000000000000000000E9 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000A0F05000693C24 +:1097C000AA5500000000000000000000000000009A +:1097D0000000000000000000000000000000000089 +:1097E0000000000000000000000000000000000079 +:1097F0000000000000000000000000000000000069 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 +:10983000000000000000000000000000F0F0F0F068 +:109840000000000000000000000000000000000018 +:109850000000000000000000000000000000000008 +:1098600000000000000000000000000000000000F8 +:1098700000000000000000000000000000000000E8 +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000610007800D00008061D2 +:1098C000402F804900080000000000000000000058 +:1098D0000000000000000000000000000000000088 +:1098E0000000000000000000000000000000000078 +:1098F000A0000A08050000A0000000000000000011 +:1099000005000A08050000A000000000000000009B +:10991000002100078001000000000000000000009E :109920000000000000000000000000000000000037 -:1099300000000000B4A0A0A0000000000000000093 -:109940005F0F55000000FFFF3F0F3D0500000000C6 -:109950003E0A3D0500000000000000000000C0C2FB -:10996000FFFF00000000CFCFCF00000000004D3C03 -:109970004D00AF0F2F2F0C0CFCFC00000000BEBEF2 -:10998000C0FF000000003F003F003C553C550FC3A6 -:109990000FC30F1F1F0FA0A0AFAF000000000000FB +:10993000000000000000000000000000AAAA555529 +:1099400000009696FFFFFFFF0000000000000000EF +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:109990000000F0F000000051000000000000000096 :1099A00000000000000000000000000000000000B7 -:1099B000000003030C0CA0A0A0A000000000000009 -:1099C00000005F0F550028F8FFFF3C003D05000038 -:1099D00000003C003C00000000000000000000000F -:1099E0000082FFFF00000000CFCFCF00000000008A -:1099F0004DFF4DC3AF0F2F2F0AFA0AFA00000000E7 -:109A00008282C0FF000000003F0000000FFF0F0037 -:109A100000550055001414000CFC0CFC0000000064 +:1099B0000000000000000000000000000000AAAA53 +:1099C000555500009696FFDEFFBD00000000000028 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000000000000056 +:109A100000000000F0F00000005500000000000011 :109A20000000000000000000000000000000000036 -:109A300000000000FF0000001414410000000000BE -:109A400000000000FFFF55003C00AA0000000000DD +:109A30000000000000000000000000000000000026 +:109A400000000000415541FF0000882A000000008E :109A50000000000000000000000000000000000006 :109A600000000000000000000000000000000000F6 -:109A70000000000000003F3C7D3C10103838000022 -:109A80000000A3F3A0F000000000000000000000B0 -:109A900000000AFA0AFA0000000030BABA300000EA +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000057540000550015000000B1 :109AA00000000000000000000000000000000000B6 -:109AB000000000000000FF002C2C141441000000E6 -:109AC000000000000000550055003C00AA00000006 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000004151C3F30000082800001E :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 -:109AF00000000000000000000F0055001010383872 -:109B000000000000035300500000000000000000AF -:109B1000000000000C0CFCFC000000003030303075 -:109B200020008400200000001000000084000000DD -:109B30000400840804000400C00004002000200089 -:109B400020202000200084008800C000020088003F -:109B500088002000880020008800200020090404DC -:109B60000003000000002000200020002000200052 -:109B7000200220082000840084002000840004804B -:109B80002000C00004002000040020008800200005 -:109B900084000000040004002002000020002000D7 -:109BA00020000000210000000000410040000000F3 -:109BB00010000040109041C0090040002002050242 -:109BC00041000000050000C010400000404041403E -:109BD000044004000520040040C040C0040000020E -:109BE00000000000100000004000000040004000A5 -:109BF0000040090000000000040220024002400072 -:109C000020080000050000004100050005020002D8 -:109C100005020000410000000000000004020000F6 -:109C200040000000000000000000000900000040AB -:109C30000000820002000005000008000000000093 -:109C400003008304004000000000001000410000F9 -:109C500008410210000000008400020504410000D9 -:109C600000000900000000000200020002000000E5 -:109C700008000004000082400040900004008400BE -:109C800000090000840082000000000000000000C5 -:109C900000004009044002410200020002000000EE -:109CA0000000000000020084008200020908000891 -:109CB00000880008000000082010000200082008AA -:109CC00000081000400900040508090800080240C7 -:109CD0000008000800000008000800880008204074 -:109CE0000084000020080000020000080088001026 -:109CF0000900000804080400001000080088090892 -:109D0000000804C04000411004000008408800849E -:109D100000004008000800002084200800004008DF -:109D20000040098400400011C00500210021000509 -:109D300000210000002190414010000500030000B8 -:109D40000010200088214021400010030400100270 -:109D5000002100000021004100001000000000412F -:109D6000000800009021912100000005000500007E -:109D70001008880004219021004100208400020086 -:109D80000000000088080408C180000000050200EF -:109D90000040400040008200000010000000000071 -:109DA0000021000000000000200000000008410029 -:109DB0000000000021820084110000002100080042 -:109DC00000C004000000000000001000088800002F -:109DD000002004000000080000000800000002004D -:109DE000090004000000000010000000080000004E -:109DF0000900100004000200030000000000000041 -:109E000008880000419000000000100400200500B8 -:109E100011200800000000001100000000000500F3 -:109E2000000000040000008203108008C000000051 -:109E3000A00008008200000008008200004100002D -:109E4000820008008209A01100048220040084001E -:109E5000C00082000809001108000004A01182005F -:109E600000008200040040008204080000008241DB -:109E70008400000982000000A0094010C004820094 -:109E800082058400C009400008008404008282002A -:109E90008200820082008211080020001000000071 -:109EA000C00008110400900000030008832000088F -:109EB0000800000000000000210800000400000469 -:109EC0000000000000000000000000000000000092 -:109ED00002000000020000000000000000900000EE -:109EE0000000050009000000000000000200000062 -:109EF0000000000000002100090003000500000030 -:109F00000000210020000000040000900000000577 -:109F10000008008841001008000011000040000007 -:109F20000400009000000000080000000001100084 -:109F3000000300000008000000000000000088216D -:109F40008205002100080021001000410000C0002F -:109F500000000002000300000041001000000000AB -:109F60000000004100080000000000400000000068 -:109F70000000A000000000000000900000000000B1 -:109F80000000100010000800000000008405000020 -:109F90001000040000000003000000080041100051 -:109FA0000000000010000000000000008805000014 -:109FB000018000000000000000000500000000001B -:109FC000000000040500000000C000000890090027 -:109FD0000000408800001000000011000300050090 -:109FE0000000080000000800001000000000000051 -:109FF0000000000010A008900090002004880920B4 -:10A000000000090400000000040000A0001000048B -:10A010000904C108000000000088000000000000E2 -:10A020000400410000000004000221020000094079 -:10A03000000020080000840000008809200482003D -:10A0400000000003000010000004000000210010C8 -:10A050000000010000090200000002218800000049 -:10A0600000004002000000000000A01120200008B5 -:10A070000100A141000000008200000800008210E1 -:10A0800084100000000000000000000084000000B8 -:10A0900082048200824100000003A002A0001000A0 -:10A0A0000410040008000000000000008411C0003B -:10A0B000840020009011000000000000000000005B -:10A0C0000000000000100020000000000000000060 -:10A0D0000000000010000000000000000000000070 -:10A0E000000000001100000000000000000000005F -:10A0F0000000100040000000000000000000000010 -:10A100000200208820000000000000020000200063 -:10A1100011004100000000080000000000000000E5 -:10A1200000000004000000000000000040002100CA -:10A1300000002000000000200000000000000000DF -:10A140000000000000000010000001000010C0909E -:10A150000000C0000001000000000000000000003E -:10A1600001000000000000080000880000201082AC -:10A1700000000000000100000000000000000000DE -:10A18000000000000000000100200000020000208C -:10A19000821000000000000100000000000000002C -:10A1A0000001000000000001000800010100004063 -:10A1B0001008000000000001000000000000000086 -:10A1C000000900000000001105800005410000802A -:10A1D000800000008000000300000000000000007C -:10A1E000000904000000004111800011020000007D -:10A1F000808000000000004100000000000000001E -:10A20000000000050000000000200300000404001E -:10A21000000080000000000000410000000000007D -:10A220000000000200000000002005800002020083 -:10A2300000008080000000000041000000000800D5 -:10A240000000000000000300000004004000830044 -:10A250000004100080000000008080110000200039 -:10A260000000000000004100000404000500400060 -:10A270000000090000000000000080410000000014 -:10A280004000000000000000400000000800400006 -:10A2900040000000090000000000000080410000B4 -:10A2A0000500000000000000200000002000400029 -:10A2B000C000000504000000000000008010000045 -:10A2C00000000000000000000100000000C0850048 -:10A2D00041C0000001C00800000000C08200000072 -:10A2E000000000000000000000000000010002006B -:10A2F000031000000000880000000000C001000002 -:10A30000000000000000000000000000000001004C -:10A310000400854000000000820000000000C00131 +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B1000000000000000000057543C3C0000000022 +:109B20000000000000040000000000000000000031 +:109B3000A002A0000000000000002000200400207F +:109B4000A000880000008800400010000000C00055 +:109B50004000A000A000A0020000200001850182BA +:109B600000034005C0058800100000002000000030 +:109B700010114000000000000000000020000084E0 +:109B800000A000002000000000028800880088007B +:109B900020008800000000000000880088001000FD +:109BA00000000000000200000000000000000000B3 +:109BB000009000C000020002000000000008000346 +:109BC00000850000000000080000000800084000B8 +:109BD0000000002000000008008400000002202097 +:109BE000082000000000000000000000000000004D +:109BF0000000000000000000000000000000000065 +:109C00000021001100000000000000000000000022 +:109C1000000200000000000021020000000000001F +:109C200000000000000000000000000002000040F2 +:109C3000080002000040004000000000004000401A +:109C400002884184004000400000000000400040C5 +:109C500000000200004000000000000000000000C2 +:109C600000080204000000000000000000000000E6 +:109C700000000000041100000000000000000000CF +:109C80000000000840080000000000000000000084 +:109C900000000000000000000000000004000000C0 +:109CA00000000008040200000000000000000000A6 +:109CB0000000000000000000000000100000000094 +:109CC00000000021901100000000000000000000D2 +:109CD0000000000000000000000000000084000000 +:109CE00000840085000100000084008400820000E0 +:109CF0000082009000000000000000820090000838 +:109D0000000000080085800100840000000000843D +:109D10000084200000000084000000000000000417 +:109D2000000000840001800100000000000000002D +:109D30000000000000000000000090000000C000D3 +:109D400000000008080800030008000800210000C7 +:109D500000080008000000400000000000080405A2 +:109D600000210000000800210000000800000000A1 +:109D700000030008000900090008000900090000AC +:109D800000000000000000000000000000000000D3 +:109D9000000000000000002100000003000000009F +:109DA000902100212000002100210000000000007F +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000002000000073 +:109DD000000000000000000000400000090000003A +:109DE000000400000000000000000000000000006F +:109DF0000000000000000000000000000000409093 +:109E0000000000000000000000000000000008004A +:109E1000000000000000080000000000000000003A +:109E20000000000000000000000000000000000032 +:109E3000000000000000000000000000840084001A +:109E40000000C00000000000000000000000000052 +:109E500000000000000000000000000000000800FA +:109E60008400000000000000000000020000A000CC +:109E70008200000000000000000000000800080947 +:109E8000000000000000C000C000C000008008000A +:109E9000400008000000A000A0000000A00000009A +:109EA000820082000000A000000000000088000086 +:109EB000008400000000000000000000001000000E +:109EC0000000000000000000000000000040000052 +:109ED0000000000000000000000000000000000082 +:109EE0000000000000000000000000000001000071 +:109EF0000000000000000000000000000000000062 +:109F0000000000000000000000000000000000044D +:109F100000000000000000000088000000000000B9 +:109F200020000000410000000000080000000005C3 +:109F3000000000000000000004000000000000001D +:109F40000005000500000000000004020000000001 +:109F500000000000000800000000040000000000F5 +:109F60000021000800000000400000080800000078 +:109F700000000800080090000800C000C000C011E8 +:109F8000C000000008000800080000000000A00059 +:109F900000000000000000000000000090008200AF +:109FA00040000003000500110040000020000000F8 +:109FB000000300000000000000000000000000009E +:109FC0000000000009000000000000000000000088 +:109FD0000000000409000000000000000000000074 +:109FE0000000000000000000210000000000000050 +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000200030 +:10A010000000000000000000000000000000000040 +:10A020000000000000000000000000000000200010 +:10A03000000000000000000000000000000000041C +:10A0400000000021000000000003000800210021A2 +:10A050000000000000000000000000000000000000 +:10A06000000090000800000000038408A000000029 +:10A07000000001050000000000000000C00808000A +:10A0800000000000000000000000C0000000000010 +:10A090000000000000008200C000000008008200F4 +:10A0A000820000001000080000000009A00000006D +:10A0B00082210000000000000000000000000000FD +:10A0C0000000000000000000000000000000000090 +:10A0D0000000000000000000000000000000000080 +:10A0E0000000000000000000000000000000000070 +:10A0F0000000000010000000000000000000000050 +:10A10000000000000000000000000000000000004F +:10A110000000000000000000000000000000090036 +:10A12000000000000084000000001100000000009A +:10A13000009000000000200000000000000000006F +:10A140000000000000000020000120000082C090FC +:10A150000000C0000001000000002000000000001E +:10A1600000000000000100880001C1000010C08252 +:10A170000000C0000001000000000000000000001E +:10A18000000000001000000100200000C100008459 +:10A19000C0820000C00000010000000000000000BC +:10A1A000000000000000000100880000C000000264 +:10A1B000C0820000C000000100000000000000009C +:10A1C00000090000000000110400000802000080E7 +:10A1D00080000000800000030000080080000000F4 +:10A1E00000020000000000081100000883000000C9 +:10A1F00080800000800000030000000000000000DC +:10A200000000001000000000000308000520880086 +:10A21000008080800000800000030000000000003B +:10A220000000000200000000000810000011830080 +:10A230000080808000008000000300000000030018 +:10A2400000000000000008000000080008000200F4 +:10A2500000001000000000000080802000002100AD +:10A260000000000000000200000002000300900057 +:10A2700000080300000000000080802000000000B3 +:10A28000030000000000000008000000050040007E +:10A290008800000003800000000000808040000073 +:10A2A0000300000000000000020000000200A00007 +:10A2B0008200000003008000000000808040000059 +:10A2C000000000000000000001000000010010007C +:10A2D0009008000001009000000000C08200000013 +:10A2E0000000000000000000000000000000080066 +:10A2F0004090000001089000000000C082000000B3 +:10A30000000000000000000000000100000000004C +:10A3100008002140000001029000000000C08200FF :10A32000000000000000000000000000000000002D -:10A330009000414000000100400000000000C0010A -:10A34000000000000000000000000000000002000B -:10A350000088000005000000000000000000000070 -:10A360000000000000000000000000000001A0014B -:10A3700000080000010000000000000000010000D3 -:10A3800000000000000000000000000000000000CD -:10A390008201000400000000000000000000000135 -:10A3A00000000000000000000000000000000001AC -:10A3B0000401000400000000000000000000000193 -:10A3C000000000000000000000000000000000414C -:10A3D00000100000000041000000000000000041EB -:10A3E0000000000000000000000000000000000568 -:10A3F0000540008000001000000000000000004147 +:10A3300003000540000001000400000000C082008E +:10A340000000000000000000000000000000C0004D +:10A35000009000000300000000000000000000006A +:10A3600000000000C000000000000000000110001C +:10A37000009000000100000000000000000000004C +:10A3800000000000000000000000000000002001AC +:10A390000201009000000100000000000000000029 +:10A3A00000000000000000000000000000000000AD +:10A3B00010000090000001000000000000000000FC +:10A3C000000000000000000000000000000000028B +:10A3D000000900000000C100000000000000004172 +:10A3E00000000000000080000000000000000005E8 +:10A3F00009020000000041000000000000000041D0 :10A40000000000000000000000000000000000004C -:10A410000020000300800000110000000000000088 +:10A410000008801000000000410000000000000063 :10A4200000410000000000000000000000000000EB -:10A430000002004000800000410000000000000019 -:10A44000004100000008800000C100000011000071 -:10A4500082000000008080000011000000410040E8 -:10A46000000003890020800000C10000002080005F -:10A4700041000000004180000010000000000020AA -:10A480000000200300000040800000C10000000028 -:10A490000040200000000041800000030000000098 -:10A4A0000000000003910000800500830000000010 -:10A4B0000000A00000000004800000400000000038 -:10A4C0000000000004A00000200000400000000088 -:10A4D00088000800000000400800000000000001A3 -:10A4E00000000000011000002000004000000001FA -:10A4F0000400840000000085080000000000000047 -:10A500000000000000830000000020000040000068 -:10A51000000090018300000000850800000000009A -:10A5200000000000000000040000040000830000A0 -:10A53000000090000500000000050400000000007D -:10A540000000000000000004000000000000000007 -:10A550000000000000000000411200E040005042F6 -:10A560000000000000004842000000000000000061 -:10A570000000000000000000811200E00700480019 -:10A5800000000000000000120000000000000000B9 +:10A430000041000200000000410000000000000098 +:10A44000004100000003800000C100000000000087 +:10A450008900000000C1000000020000004100006F +:10A46000000003400000800000C1000000008000E8 +:10A4700090000000004100000008000000410000C2 +:10A480000000052000000003800000C10000004122 +:10A490000008C100000000C10000000800000041E9 +:10A4A0000008000003100003800000C1000000113C +:10A4B00080009000000000C1000000080000004182 +:10A4C0000000000020050000200000400000000007 +:10A4D0000200100000000041100000000000000118 +:10A4E0000000000000200000400000C1000000004B +:10A4F0001000080000000009200000010000000119 +:10A5000000000000000800000000200000400000E3 +:10A51000000088008200000000039000000000009E +:10A520000001000000000189000020000040000040 +:10A5300000001000110000000005400000000000B5 +:10A54000000100000000009000000000000000007A +:10A550000000000000000000811200E007004842F7 +:10A560000000000000004842000000000000001150 +:10A570000000000000000000811200E007004842D7 +:10A580000000000000004842000000000000000041 :10A5900000000000000000000000811200E0070041 -:10A5A0004800000000000000001200000000000051 -:10A5B00000000000000000000000411200E0070061 -:10A5C000000000000000000000000000000000008B +:10A5A0004842000000000000484200000000000097 +:10A5B00000000000000000000000811200E0070021 +:10A5C0004842000000000000484200000000000077 :10A5D000000000000000000000000000000000007B :10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B @@ -80510,15 +80510,15 @@ :10A6900000000000000000000000000000000000BA :10A6A00000000000000000000000000000000000AA :10A6B000000000000000000000000000000000009A -:10A6C0000000000000000000000000000000757B9A +:10A6C0000000000000000000000000000000257BEA :10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000DEAE757BEE +:10A6E000000000000000000000000000DEA4257B48 :10A6F000000000000000000000000000000000005A -:10A70000000000000000000000000000DEAE0000BD -:10A71000757B000000000000000000000000000049 -:10A720000000000000000000000000000000DEAE9D -:10A73000757B000000000000000000000000000029 -:10A740000000000000000000000000000000DEAE7D +:10A70000000000000000000000000000DEA40000C7 +:10A71000257B000000000000000000000000000099 +:10A720000000000000000000000000000000DEA4A7 +:10A73000257B000000000000000000000000000079 +:10A740000000000000000000000000000000DEA487 :10A75000612603400000000000000230A00000005D :10A76000000000000C4000000000000002C06486F1 :10A77000612603400000000000000230A00000003D @@ -80527,4200 +80527,103 @@ :10A7A0000000000000000C4000000000000002C09B :10A7B0006486612603400000000000000230A00013 :10A7C0000000000000000C4000000000000002C07B -:10A7D000648600004000020084004180048020055F -:10A7E00021802000400020004000880088008880F0 -:10A7F00004004000041010000200200084008800C3 -:10A800008800400020002000200004002000880074 -:10A8100020000003A00020000200200020002000F3 -:10A820000211040088002000040020000000040041 -:10A83000200004000000200004002000200004008C -:10A84000C0100400040000002000200000002000D0 -:10A850002000200000000908890200000220A0401A -:10A86000400202200000040000040500000040C077 -:10A87000004020A0090200408400090200200000DE -:10A880004000000000400000000000000000400008 -:10A8900000400400000000000402840000000000EA -:10A8A00009C010900502404000000540110004005E -:10A8B00010000000410005004090099000000400D5 -:10A8C0004082000140400000000000000000400005 -:10A8D0000000000000000210020000081140080003 -:10A8E0008200001008410000020000080004084136 -:10A8F00002000000820003004000001090100200DF -:10A90000082108000210024102000000001082002D -:10A910008200000000210000411000000000000043 -:10A920000000000000000802001082000000820207 -:10A930000209000002400889000002000200001025 -:10A940000300028000000210000000000008020066 -:10A950000210000000000000000100880000080054 -:10A96000038800080008000800080008400141842E -:10A97000828204020008020840848008000800C0A7 -:10A9800004080008008420080010001000000008DF -:10A99000000800000010001000008284021000086F -:10A9A000021009080010201080110540000420004A -:10A9B000091100080200080982024000000040104E -:10A9C00040000408000240002011004000C00001C7 -:10A9D000000405090000001004000005002100101B -:10A9E00000100020002105008421012188050000BD -:10A9F00000000000080300214021000200001000B8 -:10AA000000080000000000080021002100000000F4 -:10AA10000021000002000408000800000003C1003B -:10AA2000080088034000040000009000C0080008EF -:10AA300000008400824088008410C021C003000010 -:10AA4000C000002100020000400088040000000057 -:10AA50008400402120030000880000004000000026 -:10AA6000000000000000038282000300400000009C -:10AA7000000010A00000210000000400009103006D -:10AA8000C000000000000084210000080300040052 -:10AA9000030000000320040000020000000000008A -:10AAA00002004100210000004100030003000000FB -:10AAB000400009004100080003002184000000005C -:10AAC000030000000300100120000000030000004C -:10AAD00010000000000040000000002004200800DA -:10AAE0000200044000000800400084008200820050 -:10AAF0000800820008400800000408000800400028 -:10AB000008008200000082000000080940000800E0 -:10AB10000000C00004040840A00040408400000081 -:10AB200009000400041004041009C009A000080072 -:10AB300000004008C0000400888340002000080096 -:10AB400008200000080004000800820008004000FF -:10AB5000090008048209100020028200820082009D -:10AB600000008000000000000390000000000000D2 -:10AB70000000000020000008000000001104000098 -:10AB800080000000410008000000040000000002F6 -:10AB900000000000000000002100110008880200F1 -:10ABA0000000040080A09004800000044108090017 -:10ABB0002100200003820390000000020004000036 -:10ABC00003000000000000840040800000000084BA -:10ABD00000004000110021000000101021000000C2 -:10ABE0000000000800000000000900000000000054 -:10ABF00000000005000001800000000000000000CF -:10AC000082000088000000880000000000000000B2 -:10AC10001000000000000000000040000000900054 -:10AC2000820000008800040008000000A000C004AA -:10AC300010211008080004000000000000040800B3 -:10AC400082101000000002000005900800000000C3 -:10AC50000000000800090000008000002000000043 -:10AC600000000000000000000000000000000000E4 -:10AC700003A0002000000084081000000000050070 -:10AC80000000000000020090000900000000000029 -:10AC90000000000000080200211000000000000079 -:10ACA00000200020000000901000110000001000A3 -:10ACB00008022020098400000000000000081000A5 -:10ACC0000900000000000000000000200004000057 -:10ACD00008000004000000000000001003009000C5 -:10ACE000000021000000000000000000000000083B -:10ACF0008210200000040000820000040000000810 -:10AD00000010000000000000000008000005000422 -:10AD1000000008000004820082080000000000001B -:10AD200000000000400000008200000082000200DD -:10AD3000000000000000000000048400100000205B -:10AD400000210000000000000000C00000410000E1 -:10AD50000000000020200000000040041040840893 -:10AD60001000008000000000000000080000080043 -:10AD700000000000000000000000000000000000D3 -:10AD80000000000402000084000000000000000039 -:10AD90000000000020002000000000000000000073 -:10ADA0000000008820000004000020000000004097 -:10ADB0008302108410880000004000000408110085 -:10ADC0000040008800000410000000000020000087 -:10ADD0002000000000000200000000000000000051 -:10ADE000050411C021020004020000000000000060 -:10ADF000000000C0002000000000000182000000F0 -:10AE000000010000840000000000000100000000BC -:10AE10000001000000000000000000000000000031 -:10AE200000000000000000000000000020C0000042 -:10AE30000001008800000000020000000000040083 -:10AE40009000000000000001200000000000000051 -:10AE500000000000020000010000080100010001E4 -:10AE600000000001000000000000000000000000E1 -:10AE7000000000000080000000000000004100050C -:10AE80000005000300000000000000004041002118 -:10AE900000000010000000000000000000000000A2 -:10AEA00000000000000000000000000000002088FA -:10AEB000000800080040000003000000000000003F -:10AEC000030000000000000410080020000400003F -:10AED0000000000000008840001000408010004189 -:10AEE00000100005001000000000020000008000BB -:10AEF000800380058080000000208000800000002A -:10AF00000000000000000000002000800000008021 -:10AF10000000000000090000000000000000000028 -:10AF20000000000000000000000000000000000021 -:10AF300000000021000080000000000000008000F0 -:10AF40000900210008001003800000080000000034 -:10AF50000000000000000000000000100080000859 -:10AF6000000000000000000000400003000000108E -:10AF70004000080104010804900020000800C000FF -:10AF8000000000000000000000000000008200003F -:10AF900000100000000000000000000000000000A1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000200000000000C0000800020008009F -:10AFC0000200000201000000000110004000821099 -:10AFD000880000000000000000009090880004023B -:10AFE000C000000000000000000000900001000808 -:10AFF0000021000000000000000020880020908850 -:10B0000008C0000001000000000000000000000077 -:10B01000000000000100000000000000000000002F -:10B020000000000000000000000000000000000020 -:10B030000000000020880100000211C00000000094 -:10B0400008010001000000010001000000000001F3 -:10B0500001000000000000000000000000020108E4 -:10B060000140000800000100000000000000000096 -:10B0700000000000000000000000000000000000D0 -:10B080000000008000004000000000000000000000 -:10B090000000000000001000080000000000000098 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000030011800280000971 -:10B0C00000410004002000020008002104080011D3 -:10B0D000100805100811000000000000000000002A -:10B0E0000800058009000000020041000000000087 -:10B0F00000000000090000028000808080008008BD -:10B10000801000000000000000000000000080002F -:10B110000000000080000900081003000200000089 -:10B12000000000000000000000000000000000001F -:10B13000000000000000000080000002000080000D -:10B1400000040080008000002000110005000203C0 -:10B15000000080000000000000000000000000006F -:10B1600020100589080040000020000000000000B9 -:10B1700040002000A00089000200082004400800D0 -:10B18000C0002088901000000000000000000000B7 -:10B19000C000900040000800000000010100000015 -:10B1A000000000000000000000000000000000009F -:10B1B00000000000000000000000C000082000089F -:10B1C0000200000100200004000000000000010057 -:10B1D00000001000040410A008000000000000009F -:10B1E0000000000110100182880000010000000032 -:10B1F0000000030090008400040000000000000034 -:10B200000000002100000701000000000000000015 -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000008200008C -:10B2400007000000000000000000000000000000F7 -:10B2500000000000000000000000000000000000EE -:10B260000000000000410000070000000000000096 -:10B2700000000000000000E00000000000C000C36B -:10B2800000000000000000000F000C0C0000000097 -:10B29000000000003C007C60000000000000000096 -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C00000009900181800000000000000000000B5 -:10B2D000000000000000F03CF03C00000000000016 -:10B2E000000000000000FFFFFFFF01079197000032 -:10B2F000000000000000FF78667800000000C0C079 -:10B30000C3C300000000FF00F0F00F000C0C0000B1 -:10B310000000000000007C603C0000000000000015 -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B340003C3CFF00990018180000000000000000BD -:10B350000000000000000000FF6600660000000022 -:10B3600000000000000000003C663C666167F1F7E9 -:10B370000000000000000000997800780000000044 -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B40000000000000000000C66666600FF00FF3FC1 -:10B41000606000000000000000000000000000006C -:10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B440000000000000000000C3C3424200000000F2 -:10B45000C0DBC01800000000000000000000000079 -:10B4600018FF19FF000000000000000000000000AD -:10B4700032F23EFE0000000000000000000000006C -:10B4800000000000000000000C0C66666600000072 -:10B490000F3F60600000000000000000000000009E -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C00000000000000066663C3C000042420000B4 -:10B4D0000000FCDBFC180000000000000000000081 -:10B4E000000000FF09FF0000000000000000000055 -:10B4F000000002C20ECE00000000000000000000AC -:10B5000000000000000080000000000000011000AA -:10B5100020280040000800610006000D0000A00087 -:10B5200000000000000000610006000D00000000A7 -:10B53000000000000000000000000000000000000B -:10B5400000000000000000001061202E004D0008E7 -:10B5500000610006000D000000610006000D000003 -:10B5600080610006000D00000000000000000000E7 -:10B570000071002E000D000000610006000D0000AB -:10B5800000610007000D0000000000000000000046 -:10B5900000000000000000000000000000000000AB -:10B5A0000000000000000000FF00FF00000000009D -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000C0FFC2FFFF0F553C87873E -:10B5E0005500000000000D5DADFD000000000000F2 -:10B5F000000050FA50FA00000000000000000000B7 -:10B600000000F000F0FF000000000000000000005B -:10B61000000000000000000000000000000000002A -:10B6200000000000000000000000FF5DFF0C0000B3 -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B65000000000000000000000FF82FF000F553CCA -:10B660008787FFAA000000000858A8F80000000023 -:10B67000000000004141EBEB000000000000000072 -:10B6800000000000C3AAC3AA0000000000000000E0 -:10B69000000000000000000000000000FF0CFF148C -:10B6A0000000000000000000000000000000008218 -:10B6B000000000000000000000000000000000008A -:10B6C0000000000000000000000000000000C3AA0D -:10B6D000C3AA0000000000000000000000000000FD -:10B6E0000000AAAAF03CFF5CF05C00000000000033 -:10B6F000000000000000EF6DAE2C000000005D0CAB -:10B700007D3C000000000000000000000000000080 -:10B710000000000000000000000000000000FF0C1E -:10B72000FF140000000000000000000000000028DE -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B75000F000F0FF0000000000000000000000000A -:10B7600000000000AAAAF03C0F5C005C0000000092 -:10B770000000000000000000C74586040000000033 -:10B780005D0C5500000000000000000000000000FB -:10B79000C0008810200020848880C0004000000085 -:10B7A000410041004000050003000380A180898022 -:10B7B000200005002000C000050088008400000073 -:10B7C0000008840004000100880000002000200020 -:10B7D000000320002003840088000400401004803F -:10B7E000888420002000400010008821848084107C -:10B7F0000400880088088800880020002000880055 -:10B800000400400088208800880484004000000074 -:10B81000208000C0090000000004402000000082D9 -:10B820000004108210022100200084A09020044017 -:10B830000220210002000000200010400000000053 -:10B84000000040000000400008202190200000007F -:10B850002100000005004082000000004000C09070 -:10B86000C002002080008000200085000490400875 -:10B87000040009001000200000002040000000002B -:10B88000040200000400002004002100400004C065 -:10B89000000000020080020000000000010004001F -:10B8A0000220000082100010900000108210820818 -:10B8B0000010400500000040011002090210008045 -:10B8C0000280884182000200000000C002000009DE -:10B8D0008200881000000900A0100040A002004073 -:10B8E00001000010009004408200020000000000EF -:10B8F000000002090900080000000209000002001F -:10B9000000000840404002000000004000400000ED -:10B9100010800005001000020000000800820400F2 -:10B9200080080001008800020201000000084008B1 -:10B93000090002008204000800000809001000004D -:10B940000040040202000000040000880002040815 -:10B950000008001000090000088440402008050984 -:10B960000000040000010403008800000000030040 -:10B9700000080008030840080284000000040008D2 -:10B98000008204008084800800880000000000829B -:10B99000004080100008001100008800000000082E -:10B9A0000000000000080100C000084021880021BC -:10B9B000000000000008C00802800000000000082D -:10B9C000000000210000000800000000000000004E -:10B9D000000000410021000000000008000300807A -:10B9E00000040000000000210000400800410000A9 -:10B9F0000008000000000821C00000000000000056 -:10BA0000000090008800000800000008000084008A -:10BA100000080402000000020008099005A021842B -:10BA20000300000000000000200000000884202027 -:10BA30000000000000000000000080400000000046 -:10BA400000000000000000000000000000000000F6 -:10BA500003000500000011000000000000000000CD -:10BA600010400000000041000000402000000020C5 -:10BA700009004100000000000090000000822082C8 -:10BA800008080000000000000500100000900008F9 -:10BA90000500210000014000080141200000840051 -:10BAA000000000000040080000008200C00200000A -:10BAB000014008000011A000080008000040844078 -:10BAC0000010820008000000080004000800084080 -:10BAD0000805090310110000000002000000A0404A -:10BAE000000300008800400008C00800112010007A -:10BAF00010001002200000000000A0000840080014 -:10BB0000C040A0090421840490008400A000081112 -:10BB1000080808040800080008402000820000000F -:10BB20000000400021A000820000000004A00000EE -:10BB30000000040800004100000000002010100078 -:10BB4000000140010000000008880000000000A083 -:10BB500000010000080000000000030000000000D9 -:10BB600010000500410011A000000520050810018B -:10BB70008000C0888090838240000388000000001D -:10BB8000000000000000400000011100080000005B -:10BB90000300000000000000210010000040000031 -:10BBA0000000000084000000000004000400050004 -:10BBB00085008220400000400000000000000000DE -:10BBC00000000000000000200000000000008200D3 -:10BBD0000000000084000021000090000008100018 -:10BBE000000009000000C000000008080000052057 -:10BBF00000004000000900000000080000001011D3 -:10BC00000000000004008400C00000880000C000A4 -:10BC10008210822140000000840004000000001116 -:10BC200010410008000000000000000040048504EE -:10BC3000A0880200000000000001000003000000D6 -:10BC400000001000080010000001000000000000CB -:10BC500000000000000000000000000000000020C4 -:10BC6000000000000840009005040584000000006A -:10BC700004000088000005000040000004000000EF -:10BC8000000400C000000000000000844004009098 -:10BC90000990090805008088030000008000050065 -:10BCA000410004000000000000000000000004004B -:10BCB00000210000020008900880008000000021A0 -:10BCC0000000000010000000000001000000000063 -:10BCD00000000000000000000005000082000000DD -:10BCE00000400000000000004000C000080000000C -:10BCF00000110000000800110000200000000000FA -:10BD00000000820000000000000010111000000080 -:10BD10000000000009208421C000C00000000100D4 -:10BD200000000000002100C000001102000000001F -:10BD300080000800081080000011414000402100F0 -:10BD4000008820000000000000080000040000003F -:10BD500011040300000200000300000000000000C6 -:10BD6000008800C003000000030403000304020075 -:10BD70000084000402002000000008008000100081 -:10BD8000000200000000090400080000000040005C -:10BD9000000000000000040100000000000000009E -:10BDA000040020000000000000000001010100006C -:10BDB000000008000100000089C00910034088004D -:10BDC00002C00020C0200088010000000000000028 -:10BDD0000000000000000000000000002000000043 -:10BDE0000000000000000000000000000000400013 -:10BDF0000000400000008200100000010000090067 -:10BE0000000000000000080000000000000000002A -:10BE1000000088008800040082000000000000008C -:10BE2000000002100141820900C108100008401002 -:10BE300000020000800003000000A18090008380C9 -:10BE40000000838005800000000009000000000061 -:10BE500000000000000000000000000002000000E0 -:10BE600000000000000000000000000003002000AF -:10BE700080000000800004000000800008410003F2 -:10BE800040000000000040008000000000000000B2 -:10BE9000000000000000200088008000000000007A -:10BEA0000000000080A0024000A000200000000070 -:10BEB000000000000000000000000000000003007F -:10BEC0000008410080008021008080000000800088 -:10BED0008000808090009000A000410000000000E1 -:10BEE0000000800080008000000000000000410091 -:10BEF0004003032020002000C00080044004100004 -:10BF000010000000410000000000000000000000E0 -:10BF10000000000000000341210020001083008089 -:10BF20000000000000411100A00085000400000096 -:10BF30000000000000000000009000000010000061 -:10BF4000000000000100020010008204C000400058 -:10BF50002000A000C0900500110009009100000021 -:10BF600040000000C000100002008400C00000007B -:10BF7000000001010003008209400508040111A02E -:10BF8000009001000000010000000000000000001F -:10BF90000000000000000000009101000000010509 -:10BFA00000C000000000000140001000A0002100BF -:10BFB000000000000000010001000000100000006F -:10BFC000004000A0908401C100890088000000C1E9 -:10BFD00000900020000000C00000000000000000F1 -:10BFE000000100000000000100000000000000004F -:10BFF0000000000000000001000000210091028309 -:10C000000004000001010100000100010001000125 -:10C0100000010000000000000000000800110041C5 -:10C02000000300000000000000009021004040C01C -:10C030008809000021000200080041000000800083 -:10C040000300008000C0808009C1001000210003AF -:10C0500000C100000000000000800000000000009F -:10C0600000000010000300000008000000000000B5 -:10C070000000000000000004002100110010000872 -:10C0800080040085000010100508084100020040EF -:10C09000001000410000000000000000002000909F -:10C0A00000A1000800000000000000000820038537 -:10C0B00020030041000400000000000000110021E6 -:10C0C0000000000080000005000000038040000226 -:10C0D0000000000000000080008000000000000060 -:10C0E00000000008000000000000000000100080B8 -:10C0F000000000000000000080000000001041105F -:10C100004004030040204100000010002000000017 -:10C110000000000000000000000000000000090412 -:10C120001008410002001100200020000900000951 -:10C1300000080000000200000000000000000000F5 -:10C14000000000000000C040100010000001C0010D -:10C150000090908800000000008800C0000000846B -:10C160000040000200010000008800000000000004 -:10C17000002000100000000082040800A000C001A0 -:10C18000010001050002000101080000010000009B -:10C19000000000000000000000000000000000009F -:10C1A000000301000000000000000000000000008B -:10C1B0000088009000080000880000E000000000F7 -:10C1C000600600E007008400820000E00700000035 -:10C1D0000006000007010000000000000700004109 -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C2000000000081000007000000880000E000003E -:10C21000000000000000000000000000000000001E -:10C220000000600000E0070088000000000000003F -:10C230005006008100000700000000000000000020 -:10C2400000000000000000000000F00000F0AAFF65 -:10C25000FCFC0000000050501414000000003030BE -:10C260000C0C0000000000000000000000000000B6 -:10C2700000000000000000000000000082C3C2C3F4 -:10C280000000000000000000DC1CD01000000000D6 -:10C29000000000000000000000000000000000009E -:10C2A0000000000000000000C2EAD6FE000000000E -:10C2B00000000000000000008FBF80B00000000000 -:10C2C000000000000000000000000000F00000F08E -:10C2D000AA000C0CF0F0AAAA5050141400000000A0 -:10C2E00030300C0C000000000000000000000000D6 -:10C2F000000000000000000000000000000000C37B -:10C30000C0C30000000000000000DF1FD3130000C6 -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000004068547C000095 -:10C33000000000000000000000008FBF80B000007F -:10C3400000000000000000000000000000000F00DE -:10C35000000F00000000000F003CC3C37D3F000041 -:10C3600000003CFF5C5C000000003F03D7D70000EA -:10C3700000000505505000000000BFBA1F1A000061 -:10C380000000000000000000000000005FBE0ABEC8 -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B00000000000000000003CFF0F553CFF4D4D09 -:10C3C000000000000000000000000000000000006D -:10C3D0000F00000F00000000000F003C00007D3F38 -:10C3E000000000003C005C5C000000003F031414EF -:10C3F000000000000505505000000000B5B0151009 -:10C4000000000000000000000000000000005F14B9 -:10C410000A140000000000000000000000000000FE -:10C42000000000000000000000000000000000000C -:10C43000000000000000000000003C000F5500C399 -:10C440004D4D00610007800D000005710A2F850D1C -:10C4500020A0A0605007804000001061202E004DF9 -:10C460000008000000000090000800610006000DB8 -:10C47000000100610006000D000500000000000042 -:10C480000000000080610006000D000000610A2E1F -:10C49000050D00A000000001800000000061000602 -:10C4A000000D000000000000000000000065000F0B -:10C4B000800D00A000610006000D00000561002E47 -:10C4C000000D00000000000000000000000000005F -:10C4D00000000000000000000F0F0A0A000000002A -:10C4E00030BA303000000000000000000000000002 -:10C4F0000000000000000000F5F57D7D0000000058 -:10C500000000000000000000000055FF00AA3F3CB2 -:10C510001F14FFC33C0041410303000F0A0A00003F -:10C52000000030BA30300000000000000000AFBE54 -:10C53000AF14DC1CD010A0C0AFC000000000000091 -:10C540000000F0FCA0BC00000000000000000000A3 -:10C550000000000000000000000000000A0A0000C7 -:10C560000000303030BA0000000000000000000081 -:10C5700000000000000000000000F5F52828000081 -:10C58000000000000000000000000000F5F5A0A081 -:10C590000F001F141717171741410303000F0A0A52 -:10C5A00000000000303030BA000000000000000041 -:10C5B00005BE0514DF1FD313A0CFAFCF00000000CE -:10C5C00000000000003CA0BCF5FC05FC00000000E1 -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F00000000000A0BCF0FC0000000000000000F3 -:10C60000000000000000000000000000000055874E -:10C610000087000000003030BABAAAAAAA000F0FA3 -:10C620000C0C0000000000000000000000000000F2 -:10C630000000000000003CF03CFF00000000000093 -:10C640000000AF05BEBE0ECE3EFEF50C050C000090 -:10C650000000000000000000000000000000F0F0FA -:10C66000AAAA000000000000000000000000000076 -:10C67000000000000000A0BC003C00000000000022 -:10C6800000000000000000000000000000000000AA -:10C69000FF87AA87000000003030BABA0000AA0065 -:10C6A00000000C0C00000000000000000000000072 -:10C6B00000000000000000003CF03C000000000012 -:10C6C00000000000AF05141402C232F22000400244 -:10C6D000840088002000C0000000C00000000000AE -:10C6E000200084002000820040008800000020001C -:10C6F000204100048800C0004000A0000000850028 -:10C700000000000000002000100084000003111051 -:10C71000218021800000C011200084002000100032 -:10C72000400010008500050021004080A10000802D -:10C7300085C0888088800005200088008400402013 -:10C740000000C00004000400880004004000000055 -:10C75000100020C010000000400000000000400059 -:10C760000000418200A000C000C021002002410062 -:10C7700040C0000000010000400000A021000008AF -:10C7800008022000009020042140200004820000C4 -:10C79000A00410209020108209008000000090C0AA -:10C7A00084900900890020C00200020004200402D5 -:10C7B00040041005040804084100000000000000C7 -:10C7C000040009C0040020000300400041000400F0 -:10C7D000010002800010880208000040000000C034 -:10C7E0000040000000100090040000100100400014 -:10C7F0000800008300000810040202008200080202 -:10C80000041008C0880021400200020020088510A2 -:10C81000000000000400020009100800820002105D -:10C820000382000304000000021082002040000088 -:10C830004110040000000210010000080400000084 -:10C8400002000200000000000000008400200282BC -:10C850000002040200104108000900040002410027 -:10C8600005020000000800000410000802004084D7 -:10C87000C00000000008000880040009040841000E -:10C880008209000089030000400104088202800040 -:10C8900040000000000880000088A0840208000812 -:10C8A00009080411020802080200048400080500B7 -:10C8B0000008C0082008020020000800021002083A -:10C8C0000008020800080284208802080020028371 -:10C8D0000021200510000008010000000008A00849 -:10C8E000000000409002000000000041000900002C -:10C8F0000000820000080000040088000000000022 -:10C9000000030000000400000000000820210020B7 -:10C91000000000210000040040054000A000C0020B -:10C9200000041002100800000803C008000882007C -:10C93000400800000000400000002008200884009B -:10C94000000040001000040000000008040008106F -:10C9500000001000002000000800040000C00800D3 -:10C96000000000000009000000000320000000207B -:10C9700004200090040000000000000000000000FF -:10C98000000005000000030000000000000080001F -:10C9900004004000040000004104110009A0000050 -:10C9A00000010891000000000390000000080088CA -:10C9B000000000001100000003000800A10080003A -:10C9C00010A000000800100041A008004100410034 -:10C9D00000000800000010A104000000C0000800D2 -:10C9E0008411820908091000082108098400888040 -:10C9F000200020040802A0054000C0000400000040 -:10CA000000118209C01108008200C000C0000004AB -:10CA1000A0008321C004A080000082102000842098 -:10CA200010008400A04001044004C1A01020200098 -:10CA30001000C0000000C000000020021002A00092 -:10CA400010008400A0000020082004000000400026 -:10CA500082008200000008008200800000000004C4 -:10CA6000090041400000034008000000008441002C -:10CA70000002800080000000111000000000110082 -:10CA80000400000000004140041003080000000002 -:10CA90000040410020000300082000001001800039 -:10CAA000088580000000038804910011202190C1B6 -:10CAB0008002800009000000004008000082009011 -:10CAC0000000210003001000080010A00800080466 -:10CAD0000000000003880000000000080000400083 -:10CAE00000002110C00000400000A0000020000055 -:10CAF0008800004100800080048000800800000061 -:10CB000082000800000000008400C0000000C0088F -:10CB100000910205C005A0004080820400000220B0 -:10CB2000040090004000200008000011080082402E -:10CB3000200000008200000308409000C000008038 -:10CB400000000000000808001000000040408200C3 -:10CB500000000000840000008400C0000000118874 -:10CB600040000002040021880000000000000304CF -:10CB70000000000000000004200403042104000061 -:10CB800000000000030008900000050003000004FE -:10CB900000000040880000000020000400000000A9 -:10CBA0000000210000000000C10400000084080013 -:10CBB0000300900040A010000000080008000000E2 -:10CBC0000008000000000000089010040820100079 -:10CBD00011000000002000000008090410000400FB -:10CBE000100004200080020000030000004100004B -:10CBF000000000008800820400000008000000051A -:10CC000000008200820040088841000040080000C7 -:10CC10008403C0A10000840000042000820020885A -:10CC200000000040820082000000828400A1844154 -:10CC300001000000200000A1010000000000080029 -:10CC400084000000820000000000000000000000DE -:10CC50000000000000000000000040000000000094 -:10CC600000004100802100200000000000000302BD -:10CC70000584009000001000410000000008000042 -:10CC80000000000000000500050000000800000092 -:10CC900000000000001000000000000080004100C3 -:10CCA000C0040000008402002000000008210020D1 -:10CCB0000800040011000000102004000090030090 -:10CCC000000008000000000000000200000000005A -:10CCD0001100000000000002030400000008000032 -:10CCE000000000000002A0A1408900100002A088FE -:10CCF0000282009000000100880000000000000097 -:10CD00009000000000000000C00000000411A0021C -:10CD10009082080901C001201000000003000000FB -:10CD2000C00020000000000100000201010001011C -:10CD3000A1010401000000018401A1000000000025 -:10CD4000010084009000000100009000000000003D -:10CD500000000000000000000000000000000000D3 -:10CD60000000080000000809100880080004038083 -:10CD7000210080800000000003000000000000008F -:10CD8000080005000000000010001000000008026C -:10CD9000858900200008218010808000000091001B -:10CDA000210002000000000040410021890208002B -:10CDB0000208880590020020404100110341000054 -:10CDC0000000400080000000004100080203000055 -:10CDD0000000000000000000000000000000000053 -:10CDE000400004008000000010002100100011032A -:10CDF0000000000000000000000080000000800033 -:10CE000020400800112040008000000000000000C9 -:10CE10000000820082000320008000408000800823 -:10CE200080088000004000000000200020904100A9 -:10CE3000C120A1110210410303404000020005007F -:10CE40004111000000000000800080000800030085 -:10CE5000C100000000000000000000000000000011 -:10CE600000001000200010002080010401200100BB -:10CE700000210000000000000000900082008800F7 -:10CE800008900000000001000100080002000400FA -:10CE9000820090022000A0000100080408000400A5 -:10CEA00008008800040088002008000009400902EA -:10CEB00002C0030103C01109C0A0410800400108DD -:10CEC00000000109000090000000C0400200910035 -:10CED000A000C100000000000000000000000000F1 -:10CEE000000000000100001001000108080001001E -:10CEF00020010201C000000000010000000000004D -:10CF000002000000000020010000000100010001FB -:10CF10001000000110A0018800050804A000000016 -:10CF200000000001009008110088010500000000C9 -:10CF30000000040001010000080090010100000051 -:10CF400000001100000100010021000300C10000E9 -:10CF500000000001000100000000000000000000CF -:10CF6000000000000000010100004000000020401F -:10CF70004005082100088002001100200040000246 -:10CF80000003800300100020001000414011000247 -:10CF90000008000900418020032040A120820009F0 -:10CFA00000200041030800200090002008400000FD -:10CFB0000040200480000841402002200321080393 -:10CFC00005400000910300410010000200A0008213 -:10CFD00000000803000800410000000000000000FD -:10CFE0000000000000000000081000208003001175 -:10CFF0000284082109001000000000000000000069 -:10D000000000008000000000002000000000004040 -:10D01000002000800000000009804082088010117C -:10D02000881040880300040000080083008000008E -:10D0300000004100001020800000101004910280C8 -:10D0400010044110001020000000000000050080C6 -:10D0500000004102030808800803000000000000EF -:10D0600000000000000000000000000200000000BE -:10D07000000400A00100000001000000000000000A -:10D0800000000000004000200000004100000000FF -:10D0900000000000004000900000000200A000829C -:10D0A0000100C0002083018801000001001000C0C1 -:10D0B000000000009100A011888484008401C00455 -:10D0C00083409100010100000000000000000020EA -:10D0D0000002000001010083004001010000000087 -:10D0E000000000000000000000000000000400003C -:10D0F0000000000000060000070000000000000023 -:10D10000000060000000000000000000600000E07F -:10D1100000000000810000E00000000000000000AE -:10D12000000000000000000000000000818100E01D -:10D130000704000A0000418200E0070000006006CA -:10D1400000E007000000818100E00700000000828D -:10D15000000007000000600000E000000000000088 -:10D16000000000000000000000000000000000417E -:10D1700000000700000000000000000000000000A8 -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A0000000FF660066FF000000000000000000B5 -:10D1B0000000FF66FF6600003636FF0F000000002B -:10D1C000EFE32F230000000000000000000000003B -:10D1D0000000000000F000FF000000000000000060 -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D22000000000003CF03CF00000FF0000000000A7 -:10D23000000000000D0D040400003636F000000070 -:10D240000000ECE02C2000000000000000000000C6 -:10D2500000000000000000F00000000000000000DE -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E -:10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F00000000000000000000000000024E724E718 -:10D30000000000003C3C0F0F000000000000000087 -:10D310000E9E6EFE000000000000000000000000F5 -:10D3200000F00FFF24CFE7CFBD81BD81000000FFDB -:10D33000989EF8FE00000000C1818181000000007D -:10D3400000006F6F303F0000000043675B7F00000C -:10D3500000000000000000000000000000000000CD -:10D3600000000F2F0F1F0000000000000000000051 -:10D3700000000000000000000000000000000C0C95 -:10D38000CFCF00000000FFFF00FF00000000000002 -:10D390000000089868F8000000000000000000008D -:10D3A00000006C6C6C6C240CE70CF0F0F0F000FFEB -:10D3B0000000080E686E00000000C3838181000039 -:10D3C000000000006060303F000000000125193DB2 -:10D3D0000000000000000000000000000F0F666663 -:10D3E0000000000000240018000000000000000001 -:10D3F000000000000000000000000000000000002D -:10D4000005610A2E050D00A000614006000D000018 -:10D4100000610006000D000000610007800D0000A3 -:10D42000006100078008000000610006000D000098 -:10D43000A0615006000D00010061002F801D00A1B9 -:10D44000000000000A298500000005610A2F850DF3 -:10D4500000A005000A29850000A00061002E004DF3 -:10D46000000800000001800000050000000000002E -:10D470000000000000000000000005610A26050D04 -:10D4800000A0D7CFD70CFF00C3C30000000014BE1C -:10D4900014BE00000000AAF0AAF000000000CFCFE8 -:10D4A0000C0C000000000041C0C0020EC2CECDC175 -:10D4B0000D01C3C300FFA0AFA0AF00000000B23C4D -:10D4C000B2FF00000A0AAAAAC0C08282FDF13D3163 -:10D4D000FCC0EBEBAAAA0A0A00C38282000000008B -:10D4E000FFFF0000000F003C0A0A000F00000000D0 -:10D4F000000000000000000000000000000000002C -:10D50000DCD01C1014CF140C55550F0F0000000078 -:10D510005050FAFA000000003C003CFF0000000000 -:10D52000D714D7140000000000410000323EF2FE84 -:10D53000FDF13D31AAAAF0F030303F3F000000007D -:10D54000B200B2C300000A0A0000C0C08282CDC18E -:10D550000D01FCC0282800000A0A00C382820000D6 -:10D560000000A0BC0000000F003C0A0A000F0000F1 -:10D5700000000000000000000000000000000000AB -:10D580000000DFD31F13553C553C3C3CF0FF00002E -:10D59000000000000000000000000000000000008B -:10D5A0000000C707C4040000000000000000FF0FD7 -:10D5B0003535AAFFAA0000000000000000000000AE -:10D5C00000000000000000000055000FF0003C00CB -:10D5D0000838C8F8DF8AD580F000F0F000C3C0C07A -:10D5E0000000000000000000F0005050AA00F00011 -:10D5F000000000000000000000000000000000002B -:10D6000000000000838FB3BFFF0F000F3C3CF00011 -:10D61000000000000000000000000000000000000A -:10D6200000000000F737F4340000000000000000A4 -:10D63000F0003535AA0FAA0F00000000000000001E -:10D64000000000000000000000000055000FF00086 -:10D650003C000B3BCBFBDF8AD580F000000000C311 -:10D66000C0C00000000000000000F0005050AA0000 -:10D67000F0000000000000000000000000000000BA -:10D68000000000000000808CB0BC210001044100BB -:10D690004004820000108800044120008800888037 -:10D6A00000040000208020800420C000040220002C -:10D6B0000000040004008800001000008200000048 -:10D6C000C00021002100010089000003400000008B -:10D6D00020001100048008802000880000112080B4 -:10D6E000008000804000200000002010880004001E -:10D6F0000420A000400003002000210084008800D6 -:10D7000084028400840088000000000020002000C3 -:10D71000200480400900000000C000000540000017 -:10D72000210400C10000A10400028001210000A02A -:10D730004002000220000000000040002100200004 -:10D74000110000A090004000100420020000000022 -:10D75000000005000490000409040500000200C058 -:10D7600000040404090420C0000200000403414036 -:10D77000800080A00000C0C088C000202000000001 -:10D780004100000100040020200000000000901073 -:10D790000100000008000900000000100102020062 -:10D7A000080082809010080010008400A010000083 -:10D7B000000000000800200010050400000900001F -:10D7C000080008008410020000008800001000001B -:10D7D0000000020284000509000002A02020400091 -:10D7E00004001100020003000200000000100210FB -:10D7F000000400200010411000000000000840104C -:10D8000002000200021008100000820000109002C6 -:10D81000000040000000000804C00000000008896B -:10D820000008000400402008000020000208400812 -:10D83000200004000000110800080000008402001D -:10D8400000840000008400840008000800100040EC -:10D850000000000000010000880804080005801195 -:10D86000800000840400000040080088048800084C -:10D87000008405090001000084880082410002093B -:10D880008200040800C00084008900082084000889 -:10D890000001C083000001000100000882000400B4 -:10D8A0000400000000008810000000000000890053 -:10D8B0000100100200000000000200000000000053 -:10D8C0000021000000000000000010038821010872 -:10D8D0000408000000100000014088A18821020512 -:10D8E00020008880411104050400054084080411CB -:10D8F00000008800002000040000002020048210A6 -:10D9000010080008000000000000C00800008200AD -:10D910008200084040040800400020000090000001 -:10D920008920880003000300030000002108410053 -:10D93000209020A0058205000300030004C0091008 -:10D9400041040884030000000200400000101000A1 -:10D95000200090000000080004000401030402827B -:10D960000082800041042084A184C184A00000843E -:10D9700000A00000000040010001000000010001C3 -:10D980000001A1014100000003002100000003008C -:10D9900000000400030082008400C0000000880032 -:10D9A00000000008004082040000C0004040040461 -:10D9B000C0002000088082000000000008008400F1 -:10D9C000C000080882A00800080008008404820043 -:10D9D0001002A00008A0000082008204828541405D -:10D9E0000821001004110084C040840082028211CA -:10D9F000400040000000008008808200008000207D -:10DA0000848009C110008420A00008000000A0400C -:10DA100008004000820082000000040008000000AE -:10DA200000000000080000000000000008001000D6 -:10DA3000000400008000022003001000000000C06D -:10DA40000000000000400002000020000940030028 -:10DA50000000800100200020000011004020002074 -:10DA600020000300090180001121000000000000D7 -:10DA7000080000A0000041844102000200000020D4 -:10DA800000000302201080200000000000040000BD -:10DA90000000000004000000000082008800000078 -:10DAA000400000800480902004042000400088088A -:10DAB0000000000020000500100000000000100021 -:10DAC000A0000000000000000004000000000000B2 -:10DAD00090004000820082000000000004000285E7 -:10DAE00090008402822090001010040004888204B8 -:10DAF0000010082100110008A000100040800080E4 -:10DB000008842088080082000004002000004000F3 -:10DB1000000000000800000082000000004020908B -:10DB20000004200200200020080940010000A1009C -:10DB3000410408200800A1088800800000000000BF -:10DB400003C0000008A04000000410010508000008 -:10DB500004202108110400880088040400008508BE -:10DB60000820009000040404118241898000C02034 -:10DB700000010000880003000000030421000304EA -:10DB80004004000580040490000000010000000033 -:10DB9000800000000000400010C0000003000003EF -:10DBA0008400C021081100008220000000008421B0 -:10DBB0000811000000000000010000000800200023 -:10DBC00020092009400000000000000010000000B3 -:10DBD000000004000008000000000800050000002C -:10DBE0000000910002001000400004050008004001 -:10DBF00000800808208804000003A0219021000074 -:10DC000084C08200820982212108820820100880B5 -:10DC1000001040040000402100000000000000004F -:10DC20000000001000C008002000000100000810E3 -:10DC300000000000000000A00004020000008000BE -:10DC400000000000000000000000000000000000D4 -:10DC50000000000020020200090400000000900003 -:10DC60000000000004002100050040008804008836 -:10DC70000005100400209120000041000000000079 -:10DC800020000020000420004000C00000008000B0 -:10DC900080400000000000000000000000000000C4 -:10DCA000000000000000C0000000000100010800AA -:10DCB000000000000200A001000190009100C000DF -:10DCC000A00000000000000000000000A1014000D2 -:10DCD0000001000000000000000000010000000141 -:10DCE00000000000000000000000000003C090A041 -:10DCF0000488C088000041002100000100000100EC -:10DD0000100000000000A1012000000101C101205D -:10DD100000010001904082080082C08200000100E2 -:10DD2000080000000300090002000000004010206D -:10DD3000100300410002882000020003000091004F -:10DD4000200080000000000000000000200590106E -:10DD500085200002000000000000000000410000DB -:10DD600004100000000002202120042000099180FE -:10DD7000A1008480800008402120041100200000C0 -:10DD8000080000000000080988080510000421C1EF -:10DD90002180200900080000000000800000000031 -:10DDA00040000000000040081000110302208080A5 -:10DDB0002180041088021100101008802041A085E5 -:10DDC00021008841C1030000008000000000200005 -:10DDD0002000000003050000000000000000020019 -:10DDE00008008500C191000010800903088005A18A -:10DDF00000200085000280008810A00002401188E9 -:10DE0000800000008000800008A0408003400041A6 -:10DE1000200503200305A00940800500A000404024 -:10DE200000000000000000000040010001000101AE -:10DE300002402104A001909100C00188000200016D -:10DE4000889001200901C0090000000200000000C4 -:10DE50000140000000000100000000000000000080 -:10DE60002104A1000300C1880000200208900404DE -:10DE70001003820020C008C08220051102A090007B -:10DE800005820800820008000800011000C001009F -:10DE90000021882091008800C0820002A000A0001C -:10DEA0000901000000000000000000002001400007 -:10DEB0000001010001010501000100010001010054 -:10DEC000000000100808900900C0000002000000D7 -:10DED000000000000000A10101000000000000009F -:10DEE000000000000000000000010000010000012F -:10DEF00082010000840410042091A09001014100DF -:10DF00008800000100010001000100010000200064 -:10DF100009010000000010000201100084040082CA -:10DF2000008410820000000000000000004000108B -:10DF30000003200310200810902120080010081072 -:10DF40004141000308200080009108C100008000CA -:10DF500000000000000305418308101000000000CD -:10DF600000000000000210214108004100001008DC -:10DF70001140002120088040000000108500082189 -:10DF8000020808034005002000020005200440119B -:10DF90000908082140000003000580210520000039 -:10DFA00000000000000000090005004100054100DC -:10DFB00020111000081109C0030908800503082179 -:10DFC000080010004010411121200341030500000A -:10DFD00000000000000010C002020200114000001A -:10DFE0000000000000004102090920800800000034 -:10DFF000211110828800408800000040001180003C -:10E00000209110C11121101000000000000000003C -:10E010001003080541001120A084090441000211E9 -:10E020000800208020001003000400000000000011 -:10E03000008200010100010000A000200102000098 -:10E040008509A000890002000189000000900001FC -:10E05000000000000000000001A00000010001001D -:10E060000000000000000000010101A10082010089 -:10E0700000008385112008888810900090889008FF -:10E0800010000083002100210100000000C000906A -:10E0900000000110010000000000C1090008008814 -:10E0A0002001008400A000820000000000000000A9 -:10E0B0000000880000E000000000818100E007000F -:10E0C0000000500000E000000006600600E00700CD -:10E0D00000820000000000000000810000E000005D -:10E0E00000000000000000000000410000E0070008 -:10E0F00000000000418200E007000000600600E030 -:10E1000007006012884100E00700420000000000A4 -:10E1100000000000884100E007006012842100E058 -:10E1200007000000000000000000000000000000E8 -:10E1300000000000000000000000000000000000DF -:10E1400000000000FA14FABE000000000000000009 -:10E150000505004000000000000000000000000075 -:10E1600000000000000000000000000000000000AF -:10E17000000000000000E8E83CFF00000000FC0A8E -:10E18000FCFAFFAAF03C00000000000000000000C4 -:10E1900000000000000000000000000000003C3C07 -:10E1A00000000000000000000000F505030300006F -:10E1B000000000000000000000000000000000005F -:10E1C000000000000000501450BE000000000000DD -:10E1D000000000000000000000000000000000003F -:10E1E000000000000000000000000000000000002F -:10E1F0000000000000000000E8E800C3000000008C -:10E200000C0A0CFA00AAF03C00000000000000001C -:10E2100000000000000000000000000000000000FE -:10E2200000003C3C0000000000000000F505F3F396 -:10E2300000000000000000000000000000000000DE -:10E2400000000000E8E8E8E800000000000000002E -:10E2500000000000000000000000000000000000BE -:10E2600000000000000000000000000000000000AE -:10E2700000000000BE14FCFC000000000000F7C716 -:10E2800037073030BE82FFFF8CBC00000000282022 -:10E29000EBEF00000000FC0CFC0C00000000000094 -:10E2A00000005500AA003C7DF0008083B0B30F0051 -:10E2B000FFF000000000000000000000000000006F -:10E2C00000000000000000C33CFF00000000000050 -:10E2D0000000000000003C00003C000000000000C6 -:10E2E000000000000000000000000000000000002E -:10E2F000000000000000BE140C0C00000000000034 -:10E30000F4C43404F3F3BE82734300000000000041 -:10E3100028A2EBAE000000005F5F5050000000003C -:10E32000000000005500AA003C28F0008C8FBCBF04 -:10E330000505F5F500000000000000000061000781 -:10E34000800D000005610A2F850D20A08061000668 -:10E350008001000005610A2F859D00A500000000D6 -:10E360000000000000610007800D20000000000098 -:10E37000000000000020000380020008000085610A -:10E380000A2F850D20A080615A2F850D00A0056100 -:10E390000A2F850D00A000610006000D0000056138 -:10E3A0000A2F850D00A0A061502F800D000800618C -:10E3B0000006000D000000610006000D0000825004 -:10E3C000D750370734047DAF7D05FA0A0C0CC3AA79 -:10E3D000C3AAFCBC7C3C0000004000000000000020 -:10E3E000000000000000AA00C3F0BCBCFDFD00005E -:10E3F0000000000000005555C3C30C0C000F0000C6 -:10E400007D7F55570CCF00C300000000BE82BE8246 -:10E410005555FF00F03A003A000000000ECE3EFED7 -:10E42000F0C3AA00D714D714AF7DAF28303FF0FF58 -:10E43000FF0FFF0F00000000000000005050CFC091 -:10E4400082FAD7FAF7C7F4C428AF28050000000005 -:10E4500000F0FFF0F0A05000AAAA00400000140055 -:10E460000000000000000000AAFFC3F0BCFDBCFDDE -:10E470000000000000000000FF00F0F00C0C000F96 -:10E480000000FF7FD7570CCF3CFF000000008282C6 -:10E4900082823C3C0F0FFF3A0F3A0000000002C29C -:10E4A00032F2F0C3AAFFCF0CCF0C057D0528303F18 -:10E4B000000FAA28002800000000000000005F5F95 -:10E4C000CFC00000000073704340FF0FF000550FF5 -:10E4D000550050FA50FAFFFF30A000000000000085 -:10E4E00000000000000000000000C300C3FF7878B7 -:10E4F0007D7D000000000000000000000000C0C0A2 -:10E50000FF3C00000F0FD7828F858A80000000003B -:10E5100000000000F0AAF0AA8C8FBCBF0000000031 -:10E5200000000000F53FF530808F808F03030C0C56 -:10E53000EBEB30F30000000045050505000000008E -:10E5400000000000000000007F7C4F4C5C5C5C5CC5 -:10E55000550F55FF4141EBEB30A030A0000000000B -:10E56000100000000000000000000000F0AAF0AA67 -:10E5700028282D2D00000000000000000F0F555529 -:10E58000C0C0FF3C00000F0FD782DFD5DAD00000FB -:10E5900000000000000000C3FFC38083B0B3000090 -:10E5A000000000000000053F0530D0DFD0DF03038E -:10E5B0000C0C282830F3000000004555050500002C -:10E5C0000000000000000102C00020802000408008 -:10E5D000000040802000000001000400000020082E -:10E5E0002185840088000000880020002000880029 -:10E5F00000000400040000000000000000102000E3 -:10E60000008004802180000300000400200000003E -:10E610002004008010002082830585002000C000B7 -:10E6200004000400040020000009000088008800A5 -:10E63000100001200000000084008800200040003D -:10E640008800200020000008400000002108000091 -:10E6500000100000054040400000200000000000C5 -:10E6600000000202202000000040000000000040E6 -:10E67000000000002000000041A000000000000198 -:10E6800000020004040408040000008221020900C2 -:10E69000110000A1000403400004200220008000BB -:10E6A00004000940A100800005000900000000A04E -:10E6B000000000001000090009000400050004002B -:10E6C00009000000000000020002000020400010CD -:10E6D00002108240821000000040002002008400EE -:10E6E0000800020040000000081002100210900014 -:10E6F000904000C040409040029002000200900014 -:10E7000000100200022190040490000082400000EA -:10E710008200041004008410400005100000034033 -:10E720000110020202000000000002020441020087 -:10E730000200050202000200000082020000000048 -:10E7400000100410004000000000000000000082E3 -:10E7500009000508000800002000008440000010A7 -:10E76000200000000000800000088400000000007D -:10E770000000008403108408001000080000000856 -:10E780000000000800080000000900020000000866 -:10E790000008000000004008040880000284000017 -:10E7A0008408048800090410000002080485840815 -:10E7B0000484040008010008001000000411000097 -:10E7C000040800000208040004000010048804008B -:10E7D00004000000200000000008000800210003E1 -:10E7E00084000000000000004000840000200000C1 -:10E7F000000800000000882100400000C000020363 -:10E80000900000088421880502048800C0210000CF -:10E81000040440002021842100042000100084080A -:10E8200000028400C04084C1000040000041048810 -:10E8300004042000202120000010000582000408AC -:10E840000000002100080000000800009000000007 -:10E85000200403000900410040200900009003400B -:10E86000048803A0400000C00502050000000088E5 -:10E8700004041000210000004008000000004108CE -:10E8800010000000000041820500880408004100DB -:10E89000000021000890210005840000050441A02B -:10E8A00040201101412000000320090002A00300C4 -:10E8B000832009018882A100C00008A041C0030094 -:10E8C000082000820090000000040000000000000A -:10E8D00041A0080008009000100000114040820490 -:10E8E0008400A0110804000000089000A0040000AB -:10E8F00082040000080000004020000082000000A8 -:10E9000008000000000008090004C004024040099B -:10E910008300000084000809820008009011200094 -:10E920000800C102A08040048200A1200000000075 -:10E9300008808200000088410005C0008800002097 -:10E94000000000000800C021C00008000000000016 -:10E95000000008000040000000000000000040002F -:10E960001100000000000000000000000010020084 -:10E97000040041C000000000000000100000210061 -:10E98000080008000000038800000300000184055F -:10E9900000102000000011000800000000C000006E -:10E9A00080000000204100048305000020010000D9 -:10E9B0000000002000000000000000002100009086 -:10E9C00000000010114000000800000000000000DE -:10E9D000000000000000000300008200A000000012 -:10E9E00004000000000882419000000008000000C0 -:10E9F000000000000008882100000021A00008009D -:10EA0000000000000000100082000021004089800A -:10EA1000200000024008000090112000C003A00068 -:10EA20008400841120009000040520008200400032 -:10EA3000040200200003081100C1000408040009BA -:10EA4000001000008200A000900000000000000400 -:10EA5000080000000000001005100500050000007F -:10EA6000200204004120400408004008030003087D -:10EA7000000009A040044020000000000000000049 -:10EA8000050000000900002000020000000000C096 -:10EA900020208988000500400000110411004190E9 -:10EAA000412041900520850404049100832000004A -:10EAB000409088C0410108409100092000010005F4 -:10EAC000004004820000000400020000000000007A -:10EAD0002100009000000000000000210000001153 -:10EAE00000000800000300000009C0002000000032 -:10EAF0000000000000002000040000088200000068 -:10EB000000000000000000001000102100000000C4 -:10EB10000000C00000008400400000000010080059 -:10EB20008200000082008400000082020821820925 -:10EB300084008200820382030420C003200020415D -:10EB40000000200000000020000408000000000277 -:10EB500000000000080000000000000000000000AD -:10EB60000000090000000000000000000804800010 -:10EB70001000000000000000000000400000000045 -:10EB80000000001000000004000000000000000071 -:10EB9000000000900000000204000000000000A03F -:10EBA000000000880000058400002004110480009B -:10EBB000000003900000000000820000050000003B -:10EBC00000000000800000000000000000000000C5 -:10EBD0000000000000000000000000000000000134 -:10EBE0000000000000000000000000000000000025 -:10EBF0000000010000000000000010000001000003 -:10EC000000000000000000000000100000000000F4 -:10EC10000000000000000000010091000000000062 -:10EC2000000000000000000001900084882000C067 -:10EC3000020340889088C09000000000A0000000FF -:10EC40000001A0008301000100000100400000005D -:10EC500000000000000000000000000000000000B4 -:10EC60000041000300400009000000000000000017 -:10EC70000000000008000000002000200003002128 -:10EC8000000000000000000008000200000000007A -:10EC900000000000000000000000040082000000EE -:10ECA00000000000000000000000110021004000F2 -:10ECB0000000C090000309100009080008000000CF -:10ECC00000000810A005A008000205000300800055 -:10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000003000021 -:10ECF00000000000000000000000908002000840BA -:10ED000082100000000000000000020021110480B9 -:10ED10004021000000000000800020400800112079 -:10ED2000A0000000000000000000000009400809E9 -:10ED300041050400100591A1914082038005808067 -:10ED400080000000104040008240080500000000E4 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED700000400000000000000000000041024000D0 -:10ED8000C100C101000000000000000001200000DF -:10ED900001020001100088001000040000010100C1 -:10EDA000C000C100000000000000000000000000E2 -:10EDB00000900010010083201140A10820C1100024 -:10EDC0000402040020A08590A000090004000000B7 -:10EDD00000000000004000000000000000000000F3 -:10EDE0000000000000000000000001000100000021 -:10EDF00000000000000000002000000000000000F3 -:10EE00000000010100000000000000000000000000 -:10EE100000000000000000000000000000000000F2 -:10EE200020000801010000000000000000000000B8 -:10EE30008200100000000201100510C008918891A6 -:10EE400000000001C000000100010900A000000056 -:10EE500000000000000000010000000000000000B1 -:10EE60000000000000000000000009000500400054 -:10EE70000000000000000000000000000000000092 -:10EE8000000511020521081000000000000000002C -:10EE90000008000500410020000000000000000004 -:10EEA000050200080008101100000000000000002A -:10EEB0000000002080050008C0100902850011A193 -:10EEC000051010020003801005020521114183087E -:10EED0004010000800050041004100000000000053 -:10EEE0000000000000000000000000000000000022 -:10EEF000000080008000000000000008000000000A -:10EF0000000021801000208040110000000000005F -:10EF10000000C1100200210002110000008000006A -:10EF200000000000000200000003000000000000DC -:10EF30000000000000000000000000411110A08946 -:10EF400003000310001100890000000008801082F7 -:10EF50000800201000030000000000000000000076 -:10EF600000000000000000000000000000000000A1 -:10EF700000000000C0001000A000400000000000E1 -:10EF800000000000010801840002000000000000F1 -:10EF9000000000000911090011009000000000C0ED -:10EFA0000020000000400005008400000000000078 -:10EFB00000000000000020902000C000100109891E -:10EFC00004A090A08200000100200008000000C002 -:10EFD000000801C000010000000000000000000067 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000810090 -:10F0000000E0000000000000000000000000000020 -:10F0100000000000000000000000000000000000F0 -:10F02000000000004100842100E007000000000013 -:10F030000000000000000000600000E0000000820E -:10F04000818100E007000000004100000700000689 -:10F05000884100E0070060000000000000000000A0 -:10F0600000000000000000000000000000000000A0 -:10F0700000000000000000007E667C6000000000D0 -:10F080000000000000000000000000000000000080 -:10F09000000000000000000099C30F000000000005 -:10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000C30F990000E5 -:10F0C000000009C0F9C0090981E700000000000044 -:10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F000000000000000000000003C007C600000F8 -:10F1000000000000000000000000000000000000FF -:10F110000000000000000000000099C30FFF000085 -:10F1200000000000000000000000000000000000DF -:10F13000000000000000000000000000FFC30F9965 -:10F140000000000009CFF9CF6F6F81E700000000D9 -:10F1500000000000000000000000000000000000AF -:10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F -:10F19000000000000000000000000000000000006F -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F2000000000000000000000000000000000000FE -:10F21000000004FF20FF00000000000000000000CC -:10F2200000000000000000000000C9C9C9C90000BA -:10F2300000000000000000000000000000000000CE -:10F24000D646D040000000001818FCC070737C7FC8 -:10F2500000000000C3C399C900000000FFFFFFFFCA -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E -:10F290000000000004042020000000000000000026 -:10F2A000000000000000000000000000FF0FF00060 -:10F2B00000000000666600FF000000000000000083 -:10F2C0000000DF4FD94900000000DBDBFCC04043F9 -:10F2D0004C4F00000000939399C900000000000308 -:10F2E0004243000000000000000000000000000099 -:10F2F0000000000000000000000000610006000D9A -:10F300000000A00000000000000000610007800D68 -:10F31000000000610006000D000500000000000074 -:10F32000000000610006000D000000000000000069 -:10F3300000000571002F800D000500000000000096 -:10F340000000000000613007800D000005610A2FF9 -:10F35000850D00A105610A2E050D00A00561002F95 -:10F36000800D000000610006000D0000000000009C -:10F37000000000000000000000000000000000008D -:10F38000000000000000000000000000000000007D -:10F39000000000007F702F200535C5F5000000003B -:10F3A00000000000E1E1AAFF05510051000000004B -:10F3B0000000000000000000F328F3EB0000000054 -:10F3C00000000000000000000000151411103F3F75 -:10F3D000303000C382820000000000FFAAAA808AA9 -:10F3E000858FAA3C000000000000AABAAAAE000067 -:10F3F000000000000000000000000000000000000D -:10F4000000000000000000000000000000000000FC -:10F41000000000000000707020200535C5F50000D8 -:10F42000000000000000E1E10055F55DFF5D000017 -:10F4300000000000000000000000302830EB000059 -:10F44000000000000000000000000000D5D7DDDF54 -:10F45000BCBF1C1000C38282000000003C3CF0F0E6 -:10F46000D0DAD5DFF0F00000000000000030000C22 -:10F47000000000000000000000000000000000008C -:10F480005F0F7D3C00000000000000000000000055 -:10F4900000000000000000000FC355FFD7140C0C43 -:10F4A000000000000000000000000000D313D01096 -:10F4B000000000000000000000000000F434C4045C -:10F4C00000000000000000000000000000000AFA38 -:10F4D0000AFAAF057D7DA2B6E3F700000000000048 -:10F4E0000000C0CF0A0A8E8EC3FF0000000000009B -:10F4F000000000000000000000000000000000000C -:10F500000000550055000000000000000000000051 -:10F51000000000000000000000000FC35500D714D9 -:10F52000CFCF000000000000000000000000DF1F3F -:10F53000DC1C000000000000000000000000F737A5 -:10F54000C7070000000000000000000000000000ED -:10F5500030303F3FAF05282820346175000000009F -:10F5600000000000C0CFFAFA8E8E003C00000000C0 -:10F57000000000000000000000000000000000008B -:10F580000000000020000000000010000002080041 -:10F590002000100020910020C02020200400000046 -:10F5A0000000880020000004840002000000000029 -:10F5B00000004000200000000000000002000000E9 -:10F5C00000001000000300000011200020000000D7 -:10F5D000008082410080202000000000840420027E -:10F5E000000000008400A0000400000020050000CE -:10F5F0000000000084002000000000000400000063 -:10F600000400000020000000400000001000000482 -:10F61000000000000400402020C110010001000093 -:10F620000000000021000000000000000000400079 -:10F6300004000000040004000000000005000000B9 -:10F640000000412000000000090000000000000050 -:10F65000090000040040092000011002000000021F -:10F660004000000000000002004080000000000098 -:10F6700000000400000200000400000000000090F0 -:10F680002000400000020004000002000000001002 -:10F69000000000000200001002000000020000094B -:10F6A00002000000000002100000840000000010B2 -:10F6B000008000000010021002000800000000009E -:10F6C00020000804C0100480000002000241000075 -:10F6D0000000840020000000881083000340041014 -:10F6E000011005000100030001100200000090005D -:10F6F000041002000000001008400200000000009A -:10F700008210000002000010000000000000000055 -:10F710000000000800400000090000000000000098 -:10F7200000080000001000000008000000000000B9 -:10F73000050000100084000100000000000000002F -:10F740000484C0008001008200020000000000006C -:10F75000000003084100C184000800000400040107 -:10F7600083000408208420002008200800000000F6 -:10F77000020003880000000000840300000800006D -:10F7800000000008200804040408040888000000A1 -:10F790000000040000000000400002000000A02063 -:10F7A000C100C0000000A0009000200084020021E1 -:10F7B0000000000800008800000804000400004069 -:10F7C0000000A008C0008210000020000000880097 -:10F7D0000400820084418480828382800800840047 -:10F7E000C0008400C080000000080010C00040007D -:10F7F00088000800A000000300089000000000003E -:10F8000040000000C021040000009021000000889A -:10F8100000A00000080400000208004000044004AA -:10F8200040002000020000000000000000001190D5 -:10F830000084000005A0030000000000080005840B -:10F8400021C108200004082000A000008900000059 -:10F85000210004004000210009204020030403008F -:10F8600000900010000003200008108400000088B1 -:10F8700021200000009000000000000800000004AB -:10F8800000000000000000A00000000000000000D8 -:10F89000000000000000000000000000000408005C -:10F8A00000040411200200000811000008000820D4 -:10F8B00000000000820000008240080004400000B8 -:10F8C000A000002040050005100040008400084111 -:10F8D0000000000088000004C0000000A0840000B8 -:10F8E000C008000000050040C0200000000000002B -:10F8F00040000000000000100000000000000000B8 -:10F9000000000000000000000800000000020000ED -:10F910000000000000000888000000000000000057 -:10F9200000000000400090000000000008000000FF -:10F93000000000900000000000200300000003040D -:10F9400000000000404008C04110000040A00340FB -:10F950000004000000004000000000000000000261 -:10F9600000102001004000840000000000000000A2 -:10F970000090804000000000000000000000000037 -:10F98000084000000000000000000000000000002F -:10F990000000000000040000000000000200080059 -:10F9A000040004000000000000000000000000004F -:10F9B00000000002000082000000000082009000B1 -:10F9C000820000000000A00088000000830000000A -:10F9D0000080200000000820000088004000848093 -:10F9E0008300040041808408002000200000000003 -:10F9F00082000004828000410000000000009000AE -:10FA000000000000000000001000000000030000E3 -:10FA10000000004000000000210000000000200065 -:10FA20000000020000000000000400000084040246 -:10FA3000080005A0400000000000000008000300CE -:10FA4000080000000200000000900000088420046C -:10FA50004082200484880000040021040900000082 -:10FA600005042000830004040510038905C14182B8 -:10FA70000000000000010504002000000000030455 -:10FA8000000400000000030000000500000000006A -:10FA90004100000000200000000000000000000005 -:10FAA00010000800000000000000C000000000007E -:10FAB00000000000000800410000000000000000FD -:10FAC000C000080808000800880000008200000448 -:10FAD00082082000000808080000A00010000000B4 -:10FAE000400082410000008083000000900000057B -:10FAF00088002000008300100800000000200000A3 -:10FB000000000000000400000000000000000000F1 -:10FB100000000000000000000000000000000000E5 -:10FB200000000000000000002000000000000000B5 -:10FB3000000420000200000000000000000000009F -:10FB4000000000000000000003040000000021008D -:10FB500008000000A00200004040000005840000F2 -:10FB6000410002020004110000040800000000002F -:10FB70000000000080000004000000000000000001 -:10FB80000000000000000000000000000000000075 -:10FB90000000400000000000000000000000000025 -:10FBA00000000000000000000000000002020090C1 -:10FBB0000102C00200000000000000000000000080 -:10FBC000000000000800000000001000000000001D -:10FBD00000000000000001A09188008200000000E9 -:10FBE00000000000000001010500400000010000CD -:10FBF00000000000000001000000400000000000C4 -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 -:10FC20000000000000000000000000000000008054 -:10FC300000000580800000000000000000000000BF -:10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000800C00000000000DC -:10FC600000000000000000004010C00582030040BA -:10FC700020000000000000001100020091000000C0 -:10FC8000080000000000000000000000000000006C -:10FC90000000000000000000000000000000000064 -:10FCA0000000000000000000000000000000000054 -:10FCB000800080058020008000000000000000001F -:10FCC0000000000000000000000000200080000094 -:10FCD000800080008000000000050000001000008F -:10FCE0000000000000000000000010408200112011 -:10FCF00083218000800000000080000800000005D3 -:10FD00000000000000800000000000000000000073 -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000000000D3 -:10FD30000000040004000202A0080000000000000F -:10FD4000000000000000000000000000000000842F -:10FD500000840200020004002000000000000001F6 -:10FD600000000000000000000000000021219108B8 -:10FD7000090011411000029084008404000000007A -:10FD800000010020000000C0000000000000000092 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000000000000000053 -:10FDB00000000000102000049008A0A00000000037 -:10FDC0000000000000000000000000000008000427 -:10FDD00000C0000800000000000000000201400018 -:10FDE000000085010000000000000000000000018C -:10FDF00021010900000100000000C0000000000116 -:10FE000004010201000000000000000000000000EA -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000000000000D2 -:10FE30000000000000008000008000800000000042 -:10FE400000000000000000000000000000000000B2 -:10FE5000000000000080000000000000000080089A -:10FE60000011000510080000000000000000000064 -:10FE70004010020220400320050000008000000026 -:10FE80000010800280200503000000000000000038 -:10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000000000000000052 -:10FEB000000000000000000000048080000000003E -:10FEC0000000000000000000000000000000000032 -:10FED00000000000000000000000000000800000A2 -:10FEE0000010000000000000000000000000000002 -:10FEF000000041A1214121001005000000090080FF -:10FF000000000000000000000000000000090000E8 -:10FF100000000000000000000000000000000000E1 -:10FF200000000000000000000000000000000000D1 -:10FF30000000000000000000000088000220A088EF -:10FF40008800000000000000000000000000000029 -:10FF50000000880020004000100000000090000811 -:10FF60000000000000000000000000000000000091 -:10FF700000000000010500050184010000000020D0 -:10FF8000000200000000000000000000000000006F -:10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000000000000000000051 -:10FFB000000000000000000000000000840A00E0D3 -:10FFC0000700000600000000000000000000000024 -:10FFD0000000000000000000000000000000000021 -:10FFE00000000000810000E00000000000000000B0 -:10FFF000000000000000600600E007004200004131 -:020000040014E6 -:10000000000007000006840000E00000000000413E -:100010000000070060000000000000000000000079 -:1000200000000000000000000000000000000000D0 -:100030000000000000000000000000000000F3D3FA -:10004000C3D33030BABA0000000000000000000046 -:10005000000000000000C3C35555A8E9BCFD000026 -:100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C000F0500050303030FF000000000000000011 -:1000D0000000000000000000FF000F0F80C194D559 -:1000E0000000000000000000000000000000000010 -:1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:100140000000FF1515155DFF0C0C000000000000FD -:10015000000000000000000000000000000000009F -:100160000000000000002034A2B63C0F3C0F00004D -:10017000000000000000000000000000000000007F -:10018000B200B2C300000000AF05AF0500000000E0 -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C00000000000FF1010105D0C0C0C000000007F -:1001D000000000000000000000000000000000001F -:1001E00000000000000000006175E3F755FF55FFB7 -:1001F00000000000000000000000000000000000FF -:100200000000B23CB2FF000000007D7D2828000005 -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000610027800D0000000099 -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000100612C -:100270000007800D000000000000000000000000EA -:1002800005610A2F850D00A005000A28050000A1C0 -:1002900000610007800D000000080A28000000002F -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E -:1002F000000000003A3AF0FF00000000000000009B -:100300000000AF05EBEBFEFEAAAF0000000000000E -:100310000000000000000155015000000000000036 -:1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD -:1003400000000000000000000000000000000000AD -:10035000000000000000000000000000000000009D -:10036000000000000000000000000000000000008D -:100370000000000000003A3A000F000000000000FA -:1003800000000000AF0541410202AAA000000000E9 -:100390000000000000000000FD55FD5F00000000AF -:1003A000000000000000000000000000000000004D -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D -:1003F00000000000000000000000000000000000FD -:100400000000000000001E3C1E3C00FF0AFA000035 -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC -:1004400000000000000000000000000000000000AC -:10045000000000000000000000000000000000009C -:10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C -:1004800000000000000000000F0F2D2DA8ABA8AB4E -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B000000000000000000000000000000000003C -:1004C00004000000000040000000880084000000DC -:1004D0002000000000008800048084800400008464 -:1004E0000400000004000000000000000000000004 -:1004F00020000000000020000400C084000040082C -:1005000000032000200020002005880001000000DA -:1005100000058800000000008200040000000000C8 -:100520000000000020002008200020020000002120 -:10053000000020008800880020100000000000005B -:100540000000200200202002000000000002000045 -:1005500000000082410000C00000A0200020000236 -:1005600020402000004000000000000000000000CB -:1005700000000000000200000000A0C0000505020D -:1005800021400000004080008090800000001000AA -:100590000002000000000000000000000000000059 -:1005A00000000002000000000000900000000000B9 -:1005B0000002000200000000009000002000000087 -:1005C00000020000000000000000000002000041E6 -:1005D0000000001008000010000089100909090837 -:1005E000001008000000000000008210020020003F -:1005F00002100210020000C082000210020020104F -:10060000010009020000018000100210401090401B -:1006100002000000031000000200000902100000A8 -:1006200000000000020000000000021000100400A2 -:1006300082000000004000400000040004000000B0 -:10064000000002100400000004000008050800007B -:100650000408000000000008000000002000040062 -:1006600008000000400000000000000800400000FA -:1006700002100000000005100040000020000000F3 -:100680008440040004010000401000000084804009 -:100690000008000002004000000000000008008880 -:1006A00020400400000000840200000000880008D0 -:1006B000001002000400008404000400000809087F -:1006C000000000000000000800001000080000000A -:1006D000040000000000A00004004000A000000092 -:1006E00000008800040004008400C000000000082E -:1006F00082008400400000000000000000000008AC -:10070000000800008200910000000000100000417D -:10071000000000008841400082210400C0008241A6 -:1007200008088200080000008208A0008200400043 -:1007300088000000820000009040000000000000DF -:100740000000080000000000001000100020000061 -:100750000000050000000300002000000000080069 -:10076000000011000000800090000008020003203B -:1007700000A003080000000004000000000009C001 -:1007800000024000000000000800000005902190D9 -:100790000908050005000000050000000000000039 -:1007A0000000080000000000000000000000000041 -:1007B0000000000000000400000000000000000035 -:1007C00000000000000000000000000082000000A7 -:1007D0000000084000040000C0090000821100046D -:1007E000C0200020840000000000104082000000B3 -:1007F00000000800A00008410800820082000000FC -:1008000000000000820409840840824000002000AB -:1008100000040802010084050000000982080800A5 -:10082000200000000002000002000000082000007C -:100830000400040409020400000000000400000099 -:100840000000900000000000000000000000000018 -:100850000040000000000000000020000000000038 -:1008600000000000000000880000000008040000F4 -:1008700000000300000000A0000000C010C0000045 -:10088000000000880000002020040000000000009C -:1008900080000000000020A0000400000000000014 -:1008A0000000000000000000000000400000000008 -:1008B00000000000000020010000000000004100D6 -:1008C00000000004400000000300000000000000E1 -:1008D000000000000000C000000000000000080050 -:1008E0000000400000008200004100000400000001 -:1008F00000000000000000000000000000000000F8 -:1009000000000000880800000000C080040004000F -:100910000000A00010040020000800110000820068 -:1009200000000000000000000000000000000000C7 -:1009300008000800000000000000000000000000A7 -:100940000000000000000000000082000000000025 -:10095000000000000020000008000000000000006F -:10096000000005904008000000A0009000008002F8 -:100970000000400000000000000010000004000023 -:100980000000000040000000000000900320898269 -:100990008084000000000901000004000000000045 -:1009A0000000030011000000008421000088000006 -:1009B00000000300032000004100000000000000D0 -:1009C0000090000000000000000000000000000097 -:1009D00000200000000000000000080000000000EF -:1009E000C0000000000000000000080000400000FF -:1009F00000000041080000000000000000000000AE -:100A000000000000400000000040820082008300DF -:100A100010000000000000040000000900080000B1 -:100A200000110000201100100000000000008200F2 -:100A300000000011000000000000000000000000A5 -:100A40000000000000000000000000000000840022 -:100A50000000000000000000000000000000000096 -:100A6000000000000300208400000000208400003B -:100A70000000000000000200000200C000000900A9 -:100A8000000011840482000011C040A0200000007A -:100A9000040000000000000000010200000000004F -:100AA0000000000000000000000000000000000046 -:100AB0000000000000000010000000000000000026 -:100AC0000000000000000000000000040000000022 -:100AD0000000000000000300000000000000000013 -:100AE0000000000000000000000000000000000006 -:100AF00000C08284000200820000000000000000AC -:100B000000000000000000000000000000000000E5 -:100B100009052083018482400000000001000000DC -:100B200000010000010010000000000000000000B3 -:100B300000000000000000000000000084008900A8 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000000000000000000000000000000110074 -:100B700000000380000000800080000000000000F2 -:100B80000000000000000000000000000000000065 -:100B90000000A0C090080909802000000020210961 -:100BA0000203000800000200000000000000000036 -:100BB0000000000000000000000000000000100025 -:100BC0000300000000000000000000000000000022 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF0000000000000000000000000800000000075 -:100C00000000000000000000000000008000000064 -:100C10000000000004001103A0C1A0050000200591 -:100C2000031011100809000000000000000000007F -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C700000000000000000000090000000040000E0 -:100C80000000000000000000000000000000100054 -:100C900008000800020008909040A14184C00000B4 -:100CA00000200000018300000000000000000000A0 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF0000000000000000000A00000008200A00032 -:100D000000000000000000000000000000000000E3 -:100D1000000000000000000090900091918402917A -:100D200000000001050001010101000000000000B9 -:100D300000010000000000000000000000000000B2 -:100D4000000000000001000101010000000000009F -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000200020000000000033 -:100D80000000000000000000000000000000000063 -:100D900000000000000000000000C0A0201105417C -:100DA000820500000008C00408210320000900405B -:100DB00000030041000000000000000000000000EF -:100DC00000000000004000100010081000000000AB -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000800000000000000000040AB -:100E000000000000000000000000000000000000E2 -:100E1000000000000000008000000000802111821E -:100E200000214011000040101102A000A0080000A5 -:100E300000000000000000000000000000000000B2 -:100E4000000000000000000500000000000000009D -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E9000000000000000000000C000100000082159 -:100EA00083A040018200000009A120010400030189 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF0000000000000000000810000E00000000091 -:100F00000041000007000000000000000000000099 -:100F10000000000000000000000000000000410090 -:100F2000821100E0070000820000810000E0000064 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000810000E0000040 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA00000007E674264F0FF6C6C0000EF2FEC2CB9 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:10102000000000007E7F4240000F6C6C0000E32354 -:10103000E0200000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:101100000000000000000000063E06C700000000CE -:1011100000000000000000000000000000000000CF -:1011200000000000C09FC0900C0F060080BC83BF71 -:1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:101180000000000000000000000006060606000047 -:10119000000000000000000000000000000000004F -:1011A000000000000000CF9FCF90CF0F9FFF80BCBA -:1011B00083BF0000000000000000000000000000ED -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:101200000000000000610007800D000005005A2862 -:10121000050000A000000000000000000000000029 -:1012200000000000000000000000000185610A2CA1 -:10123000850D00A0000000610007800D0000006126 -:101240000006000D0000000000000000000000008B -:1012500000000000000000610007800D0000000099 -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E -:1012A0000000000000000000000000000000C3007B -:1012B000C3000FCF3FFF00005F7D0A7DCF0CC3004E -:1012C00000000000A0BC0A3E00000000000000007A -:1012D000000000000000000000000000FCFCA0AFC7 -:1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:10133000FF14FF1400C030F000005F280A28CF0C13 -:10134000FF3C00000000003C003C000000000000EA -:1013500000000000000000000000000000000C0C75 -:10136000A0AF00000000000000000000000000002E -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D -:1013B00000007F3E6B2A3C3C00FF0000828230F33D -:1013C000C1E9D5FD000000000000000000000000A1 -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:101430000000000057164302AAAAF0F00000BEBE4A -:1014400030F380A894BC0000000000000000000001 -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:1014800020002000000040000000200000000000BC -:101490000000000020112002200400402000000075 -:1014A000008020410000400000000000000000001B -:1014B0000002000000000000000000040000000224 -:1014C000A0000000A000000040001000400040000C -:1014D000400088000000000004000400000000003C -:1014E000C00000000000000404000000040004002C -:1014F0002000200000002000040020000200040062 -:1015000040000000090000000084000000200000EE -:1015100000000000000000C04000000000000400C7 -:10152000000000100040002020000000000000002B -:10153000000009040082000000000000009040024A -:101540000000000200000002000220C04100000074 -:101550000002000040000000000000A000020000A7 -:101560000002000040000000000200004000800077 -:1015700000400000000021008000900000908000EA -:1015800080200000000000000010020000000000A9 -:101590000010020002000000401082400000001015 -:1015A00082000000001000000200000000000000A7 -:1015B00000020000020002004010020000000000D3 -:1015C00000100000000000000010041000000200E5 -:1015D00000000010020002410200021002000000A0 -:1015E00000100010C000000000000010000090007B -:1015F000002000C002000200020004C0000003003E -:1016000000000408000000000000040004000000C6 -:101610000000000000888000000080000000000042 -:1016200000000010000000010000000000000800A1 -:10163000021000010000000000008401000800000A -:10164000000000C0000000000000000000040400D2 -:1016500000000040000800000000000004080082B4 -:1016600000000000028404000400000004400000A8 -:1016700004000409002000000000000000044100F4 -:101680000200000800400000080000000000040004 -:1016900000001008000084008800080000000040DE -:1016A0000000000010000000002100000040C00009 -:1016B000C000000000000002004100000000100017 -:1016C0004000000000080000000000004000A000F2 -:1016D0000000040040088800000000000000000036 -:1016E000C000000000000000080000000000000032 -:1016F0000800080000000008100088000000000832 -:1017000002000000000000000800002000000000AF -:1017100008004100000041004100000000000000FE -:10172000048200000000000000000800002000000B -:1017300000000000000000004100400000004000E8 -:101740000800000003A0080800004002000040005C -:1017500000000082000000000000000000C0000047 -:101760000000000000000000000000000000000079 -:101770000000000800000000000021000000000040 -:101780000000080000004000000000000000000011 -:101790000840000000000000000008008411004024 -:1017A0008400A000C0000000000000000800C0008D -:1017B00040090004000008080008000000100000B4 -:1017C0000040000000000005000000000009A040EB -:1017D0000040000800001004A000004000000000CD -:1017E0000004000000110000820000000000000062 -:1017F000040400000000080008000800A000000029 -:1018000000200000020083000400020000400000ED -:101810000000100000000000000000000000009028 -:101820000000004000000000000000000000000078 -:10183000000000080040000020000000000021001F -:101840000000000011000000030000000000000084 -:1018500000100000004000820000000000000000B6 -:101860000000000020000000000000000008000050 -:101870000000000000A000000000001000000000B8 -:101880000000000000008000040080108000C00004 -:101890000000040000000000C000000090000000F4 -:1018A0000000080000000008000090001000000088 -:1018B0008200C00040200000C000000000000000C6 -:1018C0000041000000000000000000000041000096 -:1018D0000000000000000000000000000000000008 -:1018E00000000200000000030000000000080000EB -:1018F0000000000000000000000000000100008067 -:101900000000000082000000000000000000000055 -:1019100000000000000000000000000000000000C7 -:1019200040880000000000000800000000000000E7 -:1019300000000000000000000000000000000000A7 -:1019400000000300000000900800080009042104C2 -:10195000000040042104000000841020000000006A -:101960000000000000000000000000000020000057 -:101970000000400421000800008400000000040072 -:101980000020000000000000000000000000000037 -:101990000000004000000000000000000000900077 -:1019A000000084000000000000000003C040004070 -:1019B0000040820082000000840088008200C00095 -:1019C00000000003000000000800000008000021E3 -:1019D00008000000000000000840000000000000B7 -:1019E0000000000200000000000000000000820073 -:1019F000000000000800000000000000A00000003F -:101A000000000002A0000000000000000000000034 -:101A100000000000000000000000000000000000C6 -:101A200000040800000002A0080000000000000000 -:101A3000000000080000000000000000000000405E -:101A4000000000000000000400000008000000008A -:101A500000400000000000C0400020000000000026 -:101A60000000000000040000000000000000000072 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA000000000000000A1C003208885820400001F -:101AB00000000000000002A0000400C0C0200000E0 -:101AC000000190000000A0A005A00485820900008C -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000001000000D4 -:101B100008C0000200A0000000000000000000005B -:101B20000000000000000000840908090002802075 -:101B300000000000000000000080008000000000A5 -:101B4000000940080004000280041008802080047E -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000400015 -:101B90000000208000800000000000000000000025 -:101BA000000000000000000000001080210382837C -:101BB0008020000000000000000000000003800002 -:101BC0000000400021002000110808002108888042 -:101BD00008100010000000000000000000000000DD -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C10000000000000000021000080000000000023 -:101C200000000000000000000000000021409101C1 -:101C3000A0404020000000080000000090000000CC -:101C4000A0880400009001000000000111C089007C -:101C5000A0202000000100000000000000000000A3 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C800000000000000000000000000000900000C4 -:101C9000000000000000200000000000C000000064 -:101CA0000000000000000000000000000000C090E4 -:101CB00000A1000108020000000000000000200454 -:101CC00000020040880400000000010100000890AC -:101CD00001A0084182900000000000000000000008 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D00000000000000000000000000004000000093 -:101D1000000000000000010020200000009000C032 -:101D200000000000000000000000000000000000B3 -:101D300080202090052100400000000000000000ED -:101D40000000008000800000000521030221000542 -:101D50000020038840214010000000000000000027 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000020000000000000041 -:101DA00000800000000000000000000000000000B3 -:101DB00000002080048009000908000000000000E5 -:101DC000000000400000000080002083200520006B -:101DD00003038880C080C080204100000000000014 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000050004C9 -:101E10000000000000050000000000008005000236 -:101E200000000000000000000000000000000000B2 -:101E30000000000020A0A110A090100100000000F0 -:101E400000000000900010020840A00001A0010066 -:101E50000100000104A040040904C00100000000CA -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000C00082 -:101EA00084408240000000000000000000000000AC -:101EB000000000000000000000000000880000009A -:101EC0000000000000000000000000000000000012 -:101ED00000000000000000000000000000110000F1 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F10000081000007000000810000E000000000D8 -:101F20000081000007000000000000000000000029 -:101F300000000000000000000F0F55554D4D4D4DA5 -:101F40000000000000000000AF0CAFFC30FA3FFAC8 -:101F5000000000000000000055C355C328302830A1 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA00000000000000000C382820000000000006A -:101FB00000000000000000000000FF00C3C300009C -:101FC000FFFF0000000000000000A00CA0FC300A91 -:101FD0003F0A0000000000000000FF0F000F3C3C23 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000F0F000FF00C38282000000000A -:10203000000000000000000000000000F0C3F0C33A -:10204000FDCD3D0D0000000000000000C7040404A9 -:102050007D287D28000000000000000000C33CFF38 -:102060004141EBEB00000000000000000000000018 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A000000000000000000000004141C3C3000028 -:1020B000000000000000000000000000000000AA76 -:1020C000FFAAF1C131010000000000000000C7C7F5 -:1020D00004C77D7D28280000000000000000B2B287 -:1020E000B2B25505FFAF0000000000000000000084 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:102120000000000000000000FF000F0F4141000010 -:10213000000000000000000000000000000000009F -:1021400000610006000D000100000000000000001A -:10215000000000000000000000610006000D00000B -:1021600000610006000D00000000000000000000FB -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:102190000000000000000000000000000028050012 -:1021A00000A000610007800D000010002028004002 -:1021B0000008000000000000000000000000000017 -:1021C00000000F0F3C3C707C404C00000000000001 -:1021D00000000000000000000000EFAEC786A0AFC6 -:1021E0000000AA00C3F0A4F5AEFF0000000000004C -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE -:1022100000000000000000000000000000000000BE -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:10224000000000005555FF00737F434F0000000061 -:102250000000000000000000000000006D2C45049C -:10226000C3C30000AAFFC3F004550E5F00000000C6 -:10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E -:10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000EFC76D45550355030000F6 -:1022D00000000000000000000000000000001EFFE1 -:1022E0001E55FF3CCB08F0C3F0C3001E00140000D5 -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD -:10233000000000000000000000000000000000009D -:102340000000000000000000AE862C04553F553F01 -:10235000000000000000000000000000000000007D -:102360001EAA1E00FF3CDF1C00AAFFAA001E00BE22 -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D -:1023B0000000000000000000000020002000840059 -:1023C0000000C0020000000000000000000000004B -:1023D0001000880000000000400000000000200005 -:1023E00004000000000000000002002100000000C6 -:1023F0000000C00000000000000000028400000097 -:102400002000000088000000000004000000000020 -:10241000000000000000880088000000200000008C -:10242000400000000000000000002000000000004C -:102430000000000000000000200000040020000058 -:102440000000000000C10000000204400000000085 -:102450004000000040000000000008C00000000034 -:102460000000000000000000090010044000090006 -:1024700000000000009000000000000200000000CA -:1024800000C000000040000000A0000200900040DA -:1024900000900000000000000000000000020000AA -:1024A0000000000000200000000000020002000008 -:1024B0000000000000000000100000020002000008 -:1024C000000000000840820000000800908000002A -:1024D0000200000002100200000008000841020093 -:1024E00002100200001000000210020002100200A0 -:1024F000021008800000C000020000400800000038 -:1025000000000000000000020000000000000000C9 -:102510000000000008000800020000000400021093 -:10252000000002000200020002000200001002008F -:102530000000000800080210000004100400000061 -:1025400000000010008400000000001000000040A7 -:102550000000000000000400000000400000000037 -:10256000000000004000000004000400000800001B -:1025700000000000000200820000000000000008CF -:10258000000000080000000800010200040000082C -:102590000000000000000008000000000000000033 -:1025A00004880010000021880000040004000008D6 -:1025B0000008041000000088000000000000000077 -:1025C000000000000000000000000000000000000B -:1025D0000002000088000008000000000021000543 -:1025E00000410408000000000000000000208200FC -:1025F000000000008200A000000040000000000079 -:1026000090000000000040000000080000000000F2 -:102610001000000800080000001100000000000089 -:102620000000000000000000880000000000000022 -:1026300000000000000000000020900000000000EA -:102640000000000000000000000000004000050045 -:102650000000090104000000000000000500000067 -:102660000000032000000000040000000800000239 -:102670000000030005000000000000200010000022 -:10268000000400A000000000100000000000009006 -:102690000000000000000000000000000000080032 -:1026A0000000000000000008000000000000000022 -:1026B00000000000000021000000000000000000F9 -:1026C00000000000000000000040000000001000BA -:1026D0000040900084110000000000000000000095 -:1026E00000008200084008000800000000400000D0 -:1026F000000000000000000000008800000008400A -:102700000004100000410000002000000000000054 -:102710000000840004000000000000000000000031 -:102720000000000000000000004000000004000461 -:102730000000000000000000000000000000000099 -:102740000000000000000000000000000000000089 -:10275000000008001100000011000000200020000F -:10276000009000200000000005C0000000000000F4 -:1027700000000000030004000000050000900010AD -:102780000000002000000040000000A000900310A6 -:102790000010000400400200028400200000000835 -:1027A00000400000000000000000000000000000E9 -:1027B0000000000000000000000000000000000019 -:1027C0000000000000000000000000008400000085 -:1027D00000000000000000080000002100000000D0 -:1027E00000000000000000000000000000000000E9 -:1027F000000000000000820000000000200000082F -:10280000080000000000C0000800000000001000E8 -:1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:102840000000000000000000000000000000000088 -:102850000000000000000000000000204088002070 -:102860000904058400000000002000002190000001 -:10287000008840000088040000044090030000200D -:102880002000090000000900000004000000000012 -:102890000000000000000000000003000000000035 -:1028A0000000000000000000000000000000000028 -:1028B00000000000000000000000210000001000E7 -:1028C0000000000000000000080000000000A00060 -:1028D00008000000000000000000000000000000F0 -:1028E00000090011000808000000000000080000B6 -:1028F000000000080000000000008200000000004E -:10290000000000000000000040008400880000007B -:102910000000000000000140000000000000000076 -:102920000000000000000041000000000000000066 -:102930000000000008000000080000000000000087 -:102940000000000000000000000000000000000087 -:102950000000000005000004021021002000008497 -:102960000004040402000000000000000000000059 -:1029700000000000000000000000000400900000C3 -:102980000090030040400000410400C0200020846B -:1029900000000200000000400420419000002000E0 -:1029A00020000000004000002000000000000000A7 -:1029B00020020000000000000000000000000000F5 -:1029C0000000000000000000000000000000000007 -:1029D0000000000000000000000000020009A0A1AB -:1029E0000282000000000000000000000000000063 -:1029F00000000000000000000000000000000000D7 -:102A0000000000008800000000000000000000003E -:102A1000000000000000000088010000000000002D -:102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000891058850 -:102A600000A00008000000000000000000000000BE -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000020030800020008000001 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 -:102AD0000000000000000000000000000000800076 -:102AE00000898000000000000000000000000000DD -:102AF00000000000000000000000000000000000D6 -:102B000000000000000011000300020003000000AC -:102B10000000000000000000200021000300200849 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 -:102B60001000202084020208000000000000000085 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000100010043 -:102B90000000000000000000000001200100000013 -:102BA0000002000000000000000000000000000023 -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD00000000000000000000000000000000000F5 -:102BE000000088900010000908A00000000000000C -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000010100B2 -:102C200000010001000000000000000000000000A2 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C600000000000000805840284088900000000BC -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000001024 -:102CA00020050521001000000000000000000000C9 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000000000000080008000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D10000020000000030000000000000000000090 -:102D200004900440040005000000000000000000C2 -:102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D6000000000000000000004008288209088001D -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D900000400000000000010000000000000000F2 -:102DA000000000A101000100000000000000000080 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E2000000000000081000007000000000000001A -:102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000C060C063E -:102E7000F3FF30FF00000000000000000000000031 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000F00D3 -:102EF0000000F300300000000000000000000000AF -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000030303F3F000000000000F3 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 -:103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 -:1030700000000000002D992D606F606F00000000BF -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000613006000D000000002C -:1031000000000000000000000000000000000000BF -:10311000000000000000000000000000000000614E -:103120000006000D0000000000000000000000008C -:103130000061002E000D00A0000000000000000053 -:10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F -:10317000000000000000000000000000FF55AA0051 -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B0000000AFAF0505E0E000C000000000000027 -:1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000004B4B39 -:103200004B4B000000000000000000000000000028 -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:1032300000000000BE14BE14202000C000000000EA -:10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000FD5DAD0D3A -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A0000000000000000000ACACACAC000000006E -:1032B000000000000000CFCF7D413CFF30F3000054 -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F0000000000000000000000000000000F8587E -:10330000A80800000000000000000000000000000D -:1033100000000000000000000000000000000000AD -:103320000000000000000000000000F00FFF00009F -:1033300000000000000000000C0C7D4100C330F3D1 -:10334000000000000000000000000000000000007D -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D -:1033700000000000000000000000880000000000C5 -:1033800089000000020088000000200020002100C9 -:103390000500000000000000880088008800A000F0 -:1033A000882000040000418000000000200020026E -:1033B000208089000100018000030000210400003A -:1033C0000000200000000004000088000100200030 -:1033D0000020200020000000C08000402000880065 -:1033E0000200200000000000000020000400000097 -:1033F000040400000400040020000000000000A0FD -:103400000000040400C000A02100000000900000A3 -:1034100020901000000000000000000000000000EC -:103420000000410100010090040400000000004081 -:103430000000A0040400209020040000219004015A -:1034400000000000000000000001000000A00420B7 -:1034500000000091002040000000002021400000FA -:1034600000000000000000000090000000000000CC -:10347000000000400000000000900000000002007A -:1034800000000800080000000000008002000004A6 -:1034900002000400020000004000021000000000D2 -:1034A000000008000000C0000409001002009000A5 -:1034B0000880901002404100040008000000020053 -:1034C00000000080080000000280001000100200D0 -:1034D000020000000010020000800200080002004C -:1034E000000000000800020000000000044000008E -:1034F00000002000000000000200000000000000AA -:103500000500008400000000000000002002000808 -:1035100000110004000000A0000880000500000069 -:1035200000000008000000080008800041000008BA -:103530000000001000048000C040000000000000F7 -:10354000000000000004040400080020000002083D -:1035500000080000008200080000002000000008B1 -:103560000000000000000008000800000908000832 -:103570000040000000080008000800000008008467 -:1035800000200000000800000000000800100000FB -:1035900004000000000800000200040000000021F8 -:1035A00000000000000040080000000000000008CB -:1035B0000000400040008408008088000100904125 -:1035C0000000080040008405000000210000A00861 -:1035D0000040000300400000000000080004000854 -:1035E00000408203A0000000004000000000000036 -:1035F000001000000000C000000208000000A01041 -:103600000000100005000000400000000000000065 -:103610004000080000000000000011000000000051 -:10362000000000000000000000000500210008006C -:1036300000002100000420000000410200080400F6 -:103640002108000000002100000000000000000030 -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A -:103670000000000000000000000000010000000049 -:1036800000000000080040000000040020100002BC -:103690000000040082000400A0000000820000007E -:1036A000C00082000000100000000000A0008400A4 -:1036B000820000401002080200020004880084001A -:1036C0004000008000008811C010080000000000C9 -:1036D0000000C0001080850000000200000000040F -:1036E0000000C000000000000000000000200000FA -:1036F0000000002100000400000000040040000061 -:103700000010A0030010000000000800030080016A -:10371000000100000000030080880000000000009D -:103720000000000000000000000000000000210078 -:103730000000000000000001004100004000000007 -:10374000000080880010000008C00310080400007A -:1037500000000000000000042000000021840000A0 -:103760002100210000000000000000000000000017 -:103770000000000000000000000000000800000041 -:1037800000000000210000080800A00000008200E6 -:103790000400000000008400000008000000C008D1 -:1037A000000000000000084000000000C00004000D -:1037B0000000008008000000A00040000008A004F5 -:1037C00084008400C0040080000000004004000069 -:1037D000C041010500000003000000000004400893 -:1037E0000804000000000000000440000000000089 -:1037F0000000000000008200C04000000000000047 -:1038000000000000080000000000000000000000B0 -:10381000000080080004410240000300094000004D -:103820000000000000000000000021000000000077 -:103830000020000000200000000000000000400404 -:103840001000080000000000002000000800000038 -:103850001000080820000000000000000000000028 -:103860000300000000000000000000000000100045 -:103870000000000000000000000000000000000048 -:1038800000000004000000000000000088000009A3 -:103890000000000000000000080084000000000498 -:1038A0000002000008000000000000008200080084 -:1038B00010002000080000000000840000008211B9 -:1038C00084008400820020808421400800000800D9 -:1038D000C00084001000A040000040410800A00388 -:1038E00084000002400000000800001000210000D9 -:1038F000000000040021000000000000C0000000E3 -:1039000000000800000000000800000000000000A7 -:103910000000000020000088000000840300000078 -:103920000000000000000000000000000000000097 -:1039300002000000000000000000000008000088F5 -:103940000004000000000800840202008201000060 -:103950000000020000040000000000000000004021 -:103960000000000000000000042000000000000033 -:103970000000000002000000000000000000000045 -:103980000000000000002100000000000000000016 -:10399000000000000000000000000000080000001F -:1039A0000000000003010000000000000000000013 -:1039B0000000000000000000859100900985209023 -:1039C00010010000000010000401A001200190017E -:1039D000000002852008010090018802040421A053 -:1039E0009084000210400088820408A0000000A01B -:1039F000400800000000000000000000000000007F -:103A00000000000000009000000000000000000026 -:103A10000000000000000000000000001100900005 -:103A20000000400411089040002000000000000049 -:103A3000000000000000000000001010410310888A -:103A4000000280080003000200204008A04004118A -:103A5000000800008541000810110040008985859C -:103A6000109000080500800005808080088000001C -:103A70000000000000000000000000000000000046 -:103A80000000000000001000000000000000000026 -:103A90000000000000000000000000000083002083 -:103AA000008000082000100008001005030004003A -:103AB000020041000000000000000000020021217F -:103AC00005844020008000000000001008118500DF -:103AD0008304C0A00000830083C100218405C100CD -:103AE0002105822003418040001100000000800079 -:103AF0000021000080000000000000000000000025 -:103B0000000000000000200010001000080000006D -:103B1000000000000000000000000000000000C0E5 -:103B20000001000200010108004000000100000047 -:103B30000000010001000000000000000000908271 -:103B400090000005208400100000000000002120EB -:103B500010400501910300000802040204038300E1 -:103B6000080805400400A1018800400088A0C000AA -:103B70008800C000201004000000000000000000C9 -:103B80000000000000000000000001000100000033 -:103B90000000000000000000000000000000000025 -:103BA000000100010201010000000101010100010A -:103BB0000000000000000000000000000000000005 -:103BC000009100910001209000A00140820800C0F7 -:103BD0000002918390900089000002020188890010 -:103BE00000A01008010300020510902000900000C2 -:103BF0000888020200080008081000000000000009 -:103C000000000000000000000000000000000001B3 -:103C1000000000000000000000000500000000009F -:103C20000000052000038008200200080240052152 -:103C3000400800000000000000000000000000003C -:103C400000000002030305212005000020800880F9 -:103C500020000010200540910808000000000480AA -:103C6000A000000080C00490114084820000000089 -:103C70000000820080800000008000000000000042 -:103C80000000000000000000000000000008000329 -:103C900000210010000000000000000000000000F3 -:103CA00000000000C00090400800020008880421C5 -:103CB00004000208000000000000000800000000EE -:103CC0000000000021850890400040040800030027 -:103CD000090040804120212020004008000003A16D -:103CE000211085801108C0058210088090040020F2 -:103CF0000021008000000005000500008000000099 -:103D00000000000000000000000000000000008033 -:103D10000000000000200000000000000000000083 -:103D200000000000000011000901A000900000A1A7 -:103D300000000100000100820000000000010000FE -:103D4000000000000000911088092190010000008F -:103D500001000000010801080005009000010000BA -:103D6000024188210402900108A082C12108A0001C -:103D70000800000884840000080008408808080043 -:103D80000000000000000000000000000000000033 -:103D90000002000000000000000000000000000021 -:103DA0000000000000000000002100E007006000AB -:103DB000880000E007000000000000000000000094 -:103DC0000000000000000000818100E0070000000A -:103DD0000000000000000000884100E00700000033 -:103DE0000000884100E007000000818100E007003A -:103DF000000A884100E00700000000810000070081 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E200000000000000000000000A8BCE9FD000048 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000008C8FBCBF0000000000FFCD -:103E6000AAAA0000FFFFFFFF4040404000FF00FF04 -:103E70003707F7C75555FFFFFFFF3C3C030303031C -:103E800004142C3C000000000000000000000000B2 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000008094C1D568 -:103EB0000000000000000000000000000000000002 -:103EC0000000000000000000000000000000000AE8 -:103ED00000008080000000008083B0B3000000007C -:103EE000F0F03C3C00003C0C2C2C00004141C3C3D2 -:103EF000C0C03404F4C40F0F0F0F0F0F0F0FFFAA31 -:103F000000AA001028380000000000000000000097 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000800000001010000000000000000000057 -:103F60000000D7D71414000000FF00005F0A5F0AAA -:103F70003C0F3C0F00038203F0FFF0005353F3F3B8 -:103F8000C3C30000000000000000000000000000AB -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 -:103FD00000000800000000000000000000000000D9 -:103FE00000000000CF0CCF0C000000000000BEBE9F -:103FF00014143C003CAAC3038203F07DF07D5303FC -:10400000F3A3808080807F3C3E3C000000000000E5 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:1040300000000561002F000D000000610A0D8009DD -:10404000000000610006000D0000000000000000FC -:1040500000000061002D8009000000610006000DD5 -:10406000000000610A2F851D00A0000000610E2DD8 -:104070008005000100610E2B800100008061002F8F -:10408000801D00000000002800100000000000005B -:1040900000000000000000000000000000610006B9 -:1040A000000D000000000000000000000000000003 -:1040B000000000007F757A705D491C08000005054E -:1040C00000008080000000000000000000000000F0 -:1040D000000000000A1E0A1E101FD0DF3C55FF0F13 -:1040E0000000000000F000700E0E0F0A0000FF003C -:1040F000080800000000FCAC000000000000000008 -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000080B0C0F000000000000000000000AF -:104130000000000000002F252A20DFCB9E8AC3FF4D -:10414000C3FF5500D5800000000000000000000003 -:104150000000000000000000FFFF000FC0CF3C5532 -:10416000000F0000000000F000200F0F0F0F0000F4 -:10417000FF00FFFF000000000CAC000008FFFFFF85 -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000030407000000000000000002F -:1041B00000000000000000000000000000000000FF -:1041C0007DCF7D0C5000D20000000000F8F828FFE1 -:1041D0000000000000000000F0F0AAAAAA3FFF3F84 -:1041E0007D41CFCF00000000D714CFCF707070FAA0 -:1041F0000000000C505FF8F8FBFB003F003FF4F0BC -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000FC35500000000000067 -:10423000000000000000000000000000000000007E -:10424000000041CF410CFA00D200000000002828F5 -:1042500028280000000000000000FF3CFF3CAA30BE -:10426000FF307D410C0C00000000D7140C0C202006 -:1042700020AA0000000C505008080B0B000000AAF8 -:10428000F4FC00000000000000000000000000003E -:10429000000000000000000000000000000000001E -:1042A0000000000000000000FF0FC35500000000E8 -:1042B0000000000040800480018040000000208059 -:1042C0008800840088008800110020002000000081 -:1042D000400040000000000000002000000000003E -:1042E000000200000000000004002000050004009F -:1042F0000400041000030000000000002000000083 -:1043000084008400000088000000C00088000000D5 -:10431000200020002000848000000000C0008800F1 -:104320002000200000002000200020008800040061 -:1043300000002000210041020002400880024000ED -:10434000001000002190000000002000800000000C -:1043500000000002000040000000002000000000FB -:10436000000009020000000020200000000084007E -:1043700080009002800100000000400000C00000AA -:104380000000000000020004000000002000000007 -:1043900000000000000000024020000000020000B9 -:1043A0000020000000020002800080008000000069 -:1043B0000000000000022000400420000004200251 -:1043C00002000000000040000200000000000000A9 -:1043D00002000200000002100000080000000200BD -:1043E0000000020002000040000000000200001077 -:1043F0008840400000800000000000000000000035 -:1044000000090000000000000000000002000000A1 -:1044100002000400040084100200000004000200F6 -:104420000020000002000000040000000000020064 -:104430000200000004000220020080018000000948 -:104440008011000000000508808400000000400882 -:1044500000000000000000080008000000000084C8 -:1044600000000000000009100084000000000008A7 -:104470000084048883000020004000000000000049 -:1044800000080040000000000088000800840000D0 -:104490000004000800000000000800080000800080 -:1044A0000010001140004108410000080008000011 -:1044B0004008208840000010410941080000000029 -:1044C0000000010088008802000004009000001035 -:1044D00000009008000800100040002100000000CB -:1044E0000008900000000000000008080000000024 -:1044F00000410000C000410000000808000000006A -:10450000C000000088400000000000000000040817 -:10451000000088000000000000000000000000080B -:10452000000000000040000000000000000000004B -:104530000000000000000100000001000000000079 -:1045400000004100400000000000000010000000DA -:10455000009000A0000000820000000000000800A1 -:104560000800000008000000000008000800050026 -:1045700041004100050000008420400800000000C8 -:104580000090000021000300110005000000000061 -:1045900000000088030008A00000000000400000A8 -:1045A00000000010000000021000000000000000E9 -:1045B000200000000000000020080000040000A00F -:1045C000080040000000400200000400000000104D -:1045D000000000000000000008000000A00000042F -:1045E000000000000000040082000800000000003D -:1045F0000000A000000082410041002000000000F7 -:104600000000A0000005A0008811001100020002B7 -:104610000000000000008200000008000000000010 -:1046200090000000000000040800024000000000AC -:1046300000000000000000A0008404A0218020826F -:104640000400000080A000008001000000000000C5 -:1046500010000000000000000210400003004100B4 -:1046600000000000000000000000000000C010007A -:104670000800020000000000000000040040008864 -:10468000008400000000000000000008400000005E -:104690000000021000000000000000000000009078 -:1046A0000000000000000000410000000240410046 -:1046B00010000300088241002104080583058404DA -:1046C000C00480000000080000001011000000007D -:1046D00000000000000000000000A000000000003A -:1046E00000000000000000000000000800000000C2 -:1046F0008400840008000800900000000000000012 -:10470000080000000000000000050000000000009C -:104710000000000000000000000000000000000099 -:1047200000000000400000000000C00090000000F9 -:10473000001002008200080000000800A000000035 -:1047400008000000000400000000000080000000DD -:1047500009000000000810901190210005000008D9 -:104760000000000000000000000000000000110038 -:1047700005000508058400080090000000000802FC -:10478000410440000020000000A003000588000054 -:104790001100050811001002218400000008090022 -:1047A00000000000000000400000000000000000C9 -:1047B00000000000000000000200050000000000F2 -:1047C00000000000000000010000000040000000A8 -:1047D0000021042110000800000000000800000073 -:1047E00000000000000000000000000000000000C9 -:1047F00000008400000000004000000010000008DD -:1048000008000000880000000000000400000040D4 -:10481000000802000040000000000000000000004E -:104820000000000200000000000000000000000086 -:10483000000002000000C000820000800080000034 -:104840000800000000800000008000000000000060 -:104850000000000003000002000000000000000053 -:104860000300000000000000000011000000000034 -:104870000804020000001100000000000900090007 -:104880000200000000000000000000002100000005 -:104890000000000000000000000000000000000018 -:1048A0000000000000000008000000880000000078 -:1048B00000000000000000000000000000040004F0 -:1048C00041880000050000200002002000010100D6 -:1048D0009001000000A100C1820500C0000004009A -:1048E00001000000000000000000000000000000C7 -:1048F00000000000000000000000000000000000B8 -:1049000000000000020840A0000490900000000099 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000080877 -:1049300000000002109000000000000000000000D5 -:104940000000000000000000000000000000004126 -:10495000030540200000008820080090002000008F -:1049600080001000000000000000000000000000B7 -:104970000000000000000000000000000000000037 -:10498000000000000000C080000000808080000067 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00008000000008080000000000000000000EF -:1049C00000000000020000000000000011000000D4 -:1049D0002041090000082140028021411005020405 -:1049E00000000000000300000000000000000000C4 -:1049F00000000000000000000000000000000000B7 -:104A00000000000000000000800000808000001115 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000218080000000000000000055 -:104A40000000000500000010000000400080001081 -:104A500000800091000000000182004001010088F8 -:104A60000101000000000001000000000000000043 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000088881020820064 -:104A90008420000000000000000000000000000072 -:104AA0000000000000000000000000000000000006 -:104AB000000000001000A000A0848490000000000E -:104AC00000000000000000000001000000000002E3 -:104AD000000100040000840101000000C001020088 -:104AE00000011001000000000000000000000000B4 -:104AF00000000000000000000000000000000000B6 -:104B0000000000000000000000000000A1A000A0C4 -:104B1000040282A00000000000000000000000006D -:104B20000000000000000000000000000000000085 -:104B30000000000000008420000200082090000017 -:104B40000000000000000000020000000100010061 -:104B50000200020001000010211021050041801018 -:104B60008408022100080000000000000500000089 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000100015 -:104B90000080008000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB0000000000000000000000000800000000075 -:104BC0000000000000000000000080000000100055 -:104BD00010008000800010004189080010000300D0 -:104BE00040800400200010000000000000000000D1 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C1000040504040900200000000000000000005A -:104C20000000000000000000000000000000000084 -:104C300000000000000000000000000280020000F0 -:104C40000000000000000000000000000000000064 -:104C50000000000000110000000001080100010038 -:104C6000000088A0C1000200C00000000000000099 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C9000000000000108000001000000000000000A -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000010010241A0 -:104CC00020200000000000000000000000000000A4 -:104CD000000000000000000000000000000000E0F4 -:104CE000000060000000000000005000000000E034 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D1000000000000081000007000000000000000B -:104D20000000000000000000000000000000000083 -:104D300000000000000000000000000000000081F2 -:104D4000000007000000000000000000000000005C -:104D500000E000000000000000E00700000000008C -:104D6000000000000000FCFCFCFC00000000000053 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D900000000000000000000000070F01090000F3 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000060000FE0E00000000000000000000D1 -:104DD00000000000000000000000000000000000D3 -:104DE0000000000000000000007E00420000000003 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E1000000000000000000000000000070F070F66 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E4000000000000000F808000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE000000000000000000000000000FF000000C3 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F100000000000000000000000000070703CFC79 -:104F20007E1E781800000000000000000000000055 -:104F30000000000000000000000000000000000071 -:104F40000000000000000000101000000000000041 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000FFB191 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F900000000000000000000000000000001010F1 -:104FA0003C0C7E1E7818000000000000000000008D -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000004FF46FF99 -:104FD00000000000000000000000000000000000D1 -:104FE0000000000000000000006100070009000050 -:104FF00000610006000D000000610007000D0000C8 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:1050200005610A2E051D00A0000000000000000020 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000028000038 -:105050000000000000000000000000610007000DDB -:10506000000005610A0F050D00A0A6A60400AF050B -:105070008705A0AFC0C000000000000000000000D5 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 -:1050A00000000F0F7F3F0000000000000000000024 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E000000000000000000000000000A5A5050071 -:1050F00005052D05A0AFCFCF022AAAAA0000000007 -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000000000008F -:10512000000000000F0F5F0F0000000000000000F3 -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:105160000000000000000000000000000000FFFF41 -:10517000FFFF3030F3F308C80BCBC3FFC3F00000D0 -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F000AA000A0A0000000038F83BFBC300C3F015 -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:10526000000000000000000000000000000000003E -:105270000000000084000000000020000402200064 -:1052800020000000040000002000000420000000B6 -:1052900088004000880488054004000020000000C9 -:1052A000000488002080880020000000880088001A -:1052B0002000000320000000000000084000A000C3 -:1052C000000010002000200000000408040020005E -:1052D0000000040400008804880082002000000010 -:1052E000000020402000210004002008840000006D -:1052F00000000008000000C0000000900000000155 -:1053000000000000000041004100000200200000F9 -:10531000000004000900000000A0100200000000CE -:10532000000000000000000221001000000000004A -:1053300000001020000000020000002000040020F7 -:1053400010000000000200002000000000008000AB -:10535000002000000040000000000000009040001D -:105360000000000000018000200080000590000087 -:1053700000000000000000000000000000000040ED -:10538000000200000410020004400000004002007F -:1053900000000800020000008400840003000000F8 -:1053A00020000000040090000200020008400200FB -:1053B00000000000200000000000000000000200CB -:1053C00000000200000000000200020002000200D3 -:1053D00002000000000000000000000000000000CB -:1053E00000000000000000000300030003000310A1 -:1053F000050002000500032000000000000000007E -:10540000000800030000008500000000000000000C -:10541000000000000000001000000000000020104C -:1054200000100008000800840000008800008000D0 -:105430000000000000100010000000000300000049 -:10544000001000000008000800000000000000003C -:10545000000000000000000000100000000000003C -:105460000902000000840008000804000400200075 -:105470002005A0000000A00820010000000000009E -:10548000820800000000C000080840008800840076 -:10549000002190000005000000080000000000004E -:1054A000C0080000000008009000000082004021B9 -:1054B000840010000400000008080000C0008800FC -:1054C00090020021400000000000C0080000880099 -:1054D000820000048800A000080882000800000084 -:1054E0000000002100000000000090000100880082 -:1054F00000008902100300030000900200000884ED -:1055000000002100009000000000080000000008DA -:105510000000008200000000000000000000030006 -:10552000030003000900000000004100000000002B -:105530000000410000000000030040000000009057 -:105540000800000000000000000021000000000032 -:1055500000000000009104000000000003000000B3 -:1055600020001000009000A00500000000A0200016 -:105570000000100004210800080021004101000083 -:10558000000084000000000000000000A0000800EF -:1055900040028400840000000000000000002000A1 -:1055A00008002000C0000000A0000800000000006B -:1055B0000000C000008000000000000004000000A7 -:1055C000000008040800000000000800000082003D -:1055D0004000824182000803040504000500040025 -:1055E0008200A000C000A000A00008000000100081 -:1055F000C00008028484820484000100000082024A -:10560000400000000000000000000000000000104A -:105610000000800100000000000000000000000009 -:10562000C000030080000000000000000000000037 -:10563000000000C0000000020000080000000000A0 -:105640000000200000000000000000000800000032 -:1056500000000000000008000000890080008400B5 -:10566000842041C021000500000000000200050068 -:10567000030000002100402003000000040400009B -:105680000900A0008210000082000000000000035A -:10569000000000000888000000044000A00000088E -:1056A00000001000A0000000C080C02040400000AA -:1056B00008000000002000000000000008000000BA -:1056C0000841000010000000000000000000080079 -:1056D00040008200C0000000000000000000200028 -:1056E0000811C000820000008200000082008400D7 -:1056F0000000C00008008400C00082208404000074 -:105700002000000003001100410205000482210472 -:10571000000840004000110200000090000000005E -:1057200000000000009000000000002000000000C9 -:1057300000000000008403000040000000000000A2 -:1057400000000800000004900000030000020000B8 -:10575000000000A000000000080003880000000016 -:1057600000000000000000000000030000880000AE -:10577000000000000000000003000500000100011F -:105780002100A100080008004000000008030000FC -:10579000000800000000000004800000000000007D -:1057A0000800000040000000202000000000080069 -:1057B0009000C0032009000000000000000000026B -:1057C000000000000021000000000000C0000000F8 -:1057D00000000400000000000000C0000000000005 -:1057E00000008200001108008241C0000000820019 -:1057F000000082001000A00040008280840482210A -:105800008205A10004000009000000000000000063 -:10581000000000000000080000000002000000007E -:1058200000000000000000000000800100000000F7 -:105830000000000000000000000000000000200048 -:105840000000000003000000000000000000410014 -:105850001100000000000000000000000000000037 -:10586000000000040000080000200200000000000A -:1058700000000000000003C000000500000410C18B -:10588000100209022084410008820000000000008C -:105890000000A000080082000000000000010001DC -:1058A00000010000000000000000A1080090008836 -:1058B00040080000000000000000A0910440040522 -:1058C00082820000000000000000000000000000D4 -:1058D0000000000000000000000000000000400088 -:1058E00009000000000000000000000000000000AF -:1058F0000000000004000002008240080000410196 -:10590000040100010000010182000001000000000C -:1059100000000000000511118000000800080010C0 -:1059200000200002000000000000000082000000D3 -:105930000200008000000000000000008020080538 -:10594000800480090000000000000000000000004A -:105950000000000000000000000000000000000047 -:10596000050003000000000000000000000000002F -:1059700000000000000000000080000000804004E3 -:10598000A1408208001003202110104100040000F3 -:10599000000000000000028085008200112100004C -:1059A00000000000002000000000000000000003D4 -:1059B0000041808200000000000000000000840020 -:1059C00084408390030400000000000000000000F9 -:1059D00000000000000000000000000000000000C7 -:1059E000200010004000080000000000000000003F -:1059F0000000000000000000000000030080000024 -:105A0000838282001120108520050880020509404C -:105A1000000000000000000020021000A00088012B -:105A20000000000000000000000000000000000076 -:105A300008009001A011A00000000000000000007C -:105A400003A04100A085418200000000000000008A -:105A50000000000000000000000000000000000046 -:105A600000000000010000000000000000C0000075 -:105A7000009000000000000000002000209084A0A2 -:105A80000800020390A00400C182002001C00000B1 -:105A90000091000000000000000000840084081154 -:105AA000008800000000000001000000000000006D -:105AB0000000C00082900040C01000000000000004 -:105AC0000000100001A00083089000000001000009 -:105AD0000000000000008200000000000000000044 -:105AE00000000000000100000001000100000000B3 -:105AF0004000000000000000000000009090002026 -:105B00000040A00401014001400100010101050025 -:105B1000840100010000000000000000004000417E -:105B200003A1001000002000400008000000000059 -:105B300000000000000000000000850000000000E0 -:105B4000000000008005088810A1801000000003FC -:105B50000000410000000000800000000400000080 -:105B600000000000000000080003002100020900FE -:105B700000008000000000000000000000000000A5 -:105B800000000080800002212110032140401021EC -:105B900085204110050500000000000000002140A4 -:105BA0000300410040042100200005000300000024 -:105BB0000000000000000040002180800000000084 -:105BC0000000000000002100050304008402000022 -:105BD0008000000000000000000000000000000045 -:105BE0000000000000000000008200000000000231 -:105BF0000040001000000000000000000000000055 -:105C000000118080000000000891108810000889B1 -:105C100008400211112140110000000000000000A6 -:105C200001000090000801000100000001000000D8 -:105C300000000000000000008800200410C0900058 -:105C40000000000000000000A100A020118204005C -:105C500000008200000000000000000000000000C2 -:105C60000000000000000000000000C10000000073 -:105C70000000000000000000000000000000000024 -:105C80000000080004C08290000000090105019096 -:105C900001900090010000010001000000000000E0 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000004100E00700BC -:105CC000420A000000000000000000000000000088 -:105CD00000000000000000000000000000000000C4 -:105CE000000000000000000000000000810000E053 -:105CF000000042000000000007000000000000005B -:105D0000000000000000000000004200880000E0E9 -:105D100007000000600000E00700420000000000F3 -:105D200000000000000000000078FF780000000084 -:105D3000000000000000000000000000143F1403F9 -:105D400000FF00000000000000000000EB41EB41FC -:105D50000F550F550000000000000000000000007B -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D8000000000000000A000A0F0C8CBF8FB00005D -:105D90000000000000000000000000000000000003 -:105DA000000000000000000000000078FF78000004 -:105DB0000000000000000000000000000000D73FCD -:105DC000D70300FA00FA0000000000000000AFAFA7 -:105DD00005050000FFFF00000000000000000000BB -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E0000000000000000000000000000080B383B0C -:105E10000000000000000000000000000000000082 -:105E200000000000000000000000000003F303F386 -:105E30000000000000000000000000000000000062 -:105E40000A1E0A0A303000000000000000000000B6 -:105E50003082F38255553F0300000000000000002F -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 -:105E8000000000000000000000000A000A008083FB -:105E90008C8F0000000000C33CFF000000000000E9 -:105EA00000000000000000000000000000000A0ADE -:105EB000FAFA0000000000000000000000000000EE -:105EC0000000AABEAAAA005500550000000000006C -:105ED000000030BEF3BE0000000000000000000023 -:105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 -:105F0000000000000000000000000000030003008B -:105F1000B0B3BCBF00000000E8E8E8E80000000003 -:105F2000000000000000000000000000006100060A -:105F3000000D000000610006000D000000000000E0 -:105F4000000000000061002F000D000000000000B4 -:105F50000000000000610006000D000000000000CD -:105F60000000000000000000000000000000000031 -:105F7000000000000000006100078009000005002B -:105F80000A08050000A0000000000000000000005A -:105F900030000000000005610A0F850D00A00561BA -:105FA0000A0F850D00A0000000000000000005C3DE -:105FB0000500CFCFC0C0300000000000000000008E -:105FC00000000000000000000000000000000000D1 -:105FD0000000000000000000AAEA25752F7F0000E5 -:105FE00000000000000000000000000000000000B1 -:105FF0000000000000000000000000000B0F010F77 -:106000000000000000000000000000000000000090 -:1060100000000000000000000252075703035F5019 -:1060200010385179F5C005C00000000000000000E4 -:1060300005FF053C05F505F53030000000000000C7 -:106040000000000000000000000000000000000050 -:1060500000000000000000000000AAEF20702A7A73 -:106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000F11 -:10608000000F000000000000000000000000000001 -:1060900000000000000000000000A2F2A7F7F3F3E8 -:1060A0005F5092BAD3FBF5CF05CF0000000000008F -:1060B0000000C33CC300FF005353A1F0A0A00000A8 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000FF00FF35AAAA39 -:1060E000F03C000000000000000000000000000084 -:1060F00000000000000000000000000000000000A0 -:1061000000FC00AA000000000000000000000000E9 -:10611000000000000000000000000000808CB0BC07 -:10612000C3004D4D00F0C3AAFFC33C0000000000B7 -:1061300000000000003C0000FF005353E0F1A1A06C -:10614000000000000000000000000000000000004F -:106150000000000000000000000000000F000F35EC -:10616000AAAAF03C000000000000000000000000AF -:10617000000000000000000000000000000000001F -:106180000000000C00AA0000000000000000000059 -:106190000000000000000000000000000000838FED -:1061A000B3BFFF3C4D4DFFF0C3AA4D4D4D4D000018 -:1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E -:1062300000002000200000002000000000112000CD -:106240008800000020000000200000000000000086 -:1062500000002000200000000000000000042000DA -:1062600000000000200000002000400004000000AA -:10627000000300008400200004000000040000006F -:106280002000000004002000001001002000840015 -:1062900000040400040040020000000004000404A4 -:1062A0000402C000410020808210880020042000E9 -:1062B00005204000000021000000000000004040D8 -:1062C00010904000000200400000000000000402A6 -:1062D00000020000000204000000000200020002B0 -:1062E00000040000400200000002000080000002E4 -:1062F00021900000000000000000800000008000ED -:1063000000040000400080000000000020000000A9 -:106310000900000280008000850100000900800063 -:106320008002800500000400002000010040000100 -:106330000002C002000000000000904000000000C9 -:1063400040000210000000000000020002000000F7 -:10635000004008400200020002000010001000404F -:106360000200880902000200004000000200020052 -:106370000400004000000100840000000000000054 -:1063800004000010000000000000010000400200B6 -:106390000000020002008800020802001000030052 -:1063A00002000000200021002100110510400180A2 -:1063B00003000289011000080000000003000482AD -:1063C00000008090000000000002000000000000BB -:1063D00000000000000000080000000000000008AD -:1063E000000000000000000000000000001009088C -:1063F0000300000000080000040820080000000856 -:10640000050803000300000800000000040000006D -:1064100009040900000041080084008420040204EB -:10642000040820004184800890009010A008820198 -:106430000402040000044005000000000200000007 -:1064400000000100850010000400000000000000B2 -:10645000000800000000000000000008000000002C -:10646000000000000000000000000000000000002C -:10647000000000008200000000000000000000009A -:106480000000000000000002000000000000000802 -:106490000000000000000100844082800000000035 -:1064A00090000180000000030005000300080021A7 -:1064B0000003010401050040000008040000000082 -:1064C0000000000040004088C00000000000000004 -:1064D0000084000000000800000000000000000030 -:1064E0000000000000000200400800000000000062 -:1064F000000000000000004000200000000000003C -:106500000000000005000000000800A000000000DE -:10651000000000000000000020000001030441888A -:1065200041000000400403000300000003000900D4 -:10653000000000002001200041000500C000000014 -:106540000000000000400000010200048200004042 -:106550000000000000000000080008040000000027 -:106560000000000008000000820000000800000099 -:106570000009000000000009000000000000820087 -:106580009009900020000400A000A100C00082003B -:10659000830082008220A011201108008200820066 -:1065A000100084040900C0042005C0040840828053 -:1065B000A002000041834002402020202100000072 -:1065C0000000000020004000000040010300000027 -:1065D00000000000000000000000040000000000B7 -:1065E000000000000000400040C003000300000065 -:1065F0000000000000000004000000000000000097 -:106600000000118811882004200000000400000010 -:10661000000004000040410108C0800008000000A4 -:10662000030000A0410004004100C10040011084AB -:10663000032008001100202091050000A101A00006 -:10664000000500000000000000080000000000003D -:106650000000000000000008000000000000000032 -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:106680000000040000000000000004000000000002 -:1066900000008200000004000000000300008408E5 -:1066A00020008280C00004002008C0008200821008 -:1066B000900084820003002010009002000000413E -:1066C00082080000000400000000058204000000B1 -:1066D0000002030400A00000000000000000000011 -:1066E000100003000004000000080000000000008B -:1066F0000320000004000920040000000000000046 -:10670000000000008300000000080000800000007E -:10671000000000000300000880000084000000006A -:1067200008008500000200008000800005000000D5 -:10673000050005200320050005A100900301054088 -:1067400008004104C00040030000200000210000B8 -:106750000000000000000000001100000000000028 -:106760000000000800000000000000000000000021 -:106770000000000000000000000000000000000019 -:1067800000000000000000000400042100002004BC -:1067900000000000000004008200820082008800E7 -:1067A000820000000002400020002004400321007D -:1067B000840040008804101110201000820800207E -:1067C00000418420010300000000000000000000E0 -:1067D000000002880000030000000000000000002C -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000400800000000002000000031 -:1068000000000300000000000000C0048000000041 -:1068100000000000000000008000000200000000F6 -:106820000008000005000001000088008001110040 -:1068300020840000000000010300008900000084A3 -:1068400000A00390000440020000000000000000CF -:106850000000000000000000000000000000000038 -:106860000000000000000000000000000000000028 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000010008884200002000004000001A5 -:1068B000000100000901000000001040020400C0B7 -:1068C00004020101000004010001000000000000BA -:1068D00000000000000009000000000000000000AF -:1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000801000820000800040800312 -:10693000021009034003212002080003C000800068 -:106940001000808040402105094000080000000040 -:10695000000000004080030008000808000000005C -:106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 -:106980000000000000000000000000020000000005 -:1069900000000000000000000000000000000000F7 -:1069A0000000000000001004004120050300020563 -:1069B000100010401000038505804140408380880E -:1069C000002185840080004100008040008000009C -:1069D0000000000000000004010000000140000071 -:1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 -:106A000000000000000000900000000000000000F6 -:106A1000000000A0000000840000008400000000CE -:106A200000000040000000400100009100400020F4 -:106A3000000000400000014000020104000000C10D -:106A4000A00390C0A00908824001200884018804A6 -:106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 -:106A80000000000000000000000000000000000006 -:106A9000000000000000A0000000010000008400D1 -:106AA0000000000000004000000088000401100108 -:106AB00008000000410040000000010083000401C4 -:106AC000000082400208400321C00000A0008201B3 -:106AD00000000000000000000000000000000000B6 -:106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 -:106B00000000000000000000000000000000000085 -:106B1000000000000900000000000000020000006A -:106B200000000000050000000000000000208020A0 -:106B30000021851005001100100040000220110006 -:106B400084210520850000004182410005042103C5 -:106B5000044009040000000000000000410205009C -:106B600021000520000000000000000000000000DF -:106B70000000000000000000000000000000000015 -:106B800000000000000000000000000008004000BD -:106B900009004000000000000008000000000000A4 -:106BA00000080000000000000011000000008080CC -:106BB0000000800000080000000200000002100237 -:106BC00011024110404000098020800000000004B4 -:106BD000000900000000000000000000000001218A -:106BE00000000100000000000000000000000000A4 -:106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000010083 -:106C10000000000000000000000000010000000073 -:106C20000000000100000000000000000000000063 -:106C30000240200002009001000800000000000057 -:106C400000820000000100004000082102A0A00016 -:106C50000000004000A00000000000000000000054 -:106C6000810000E0000000000000000000000000C3 -:106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000700ED -:106CA00000000000000007000000000000000700D6 -:106CB0000000000000E000004200000000E00700CB -:106CC0000000000000E007000006000000E00700F0 -:106CD0000006000000E00700500000000000000077 -:106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 -:106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 -:106D30000000000009C0F9C00000000000000000D1 -:106D40000000000000000000000000006F6F6060A5 -:106D50000C180CDB00000000000000000000000028 -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000009CFF9CF00000000000033 -:106DC0000000000000000000000000000000FC0CBB -:106DD000FC0CCF18CFDB000000000000000000001A -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000B383B08000006C -:106EC00000000000000000000000000000000000C2 -:106ED0000000033F7E7E68086E0E000000004373D2 -:106EE0004F7F0000000000000000000000000000D4 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F3000000000000000000000000000BF8FBC8CBB -:106F40000000000000000000000000000000000041 -:106F500000000000033F4242F898FE9E000000003F -:106F600040704C7C00000000000000000041000761 -:106F7000800D000000000000000000000000000084 -:106F80000000000000000000000000000000000001 -:106F9000000000000000000000000000006100068A -:106FA000000D0000000005000A08050000A0050013 -:106FB0000A080500000005000A08050000A000619D -:106FC0003007000D000005610A0F050D00A00561E6 -:106FD0000A0F050D00A005004A0F050C00A0056171 -:106FE0000A0F050D00A000000000000000000000D6 -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:1070100000000000000000000000000000003F7DB4 -:10702000037D0000000000000000000000000000E0 -:107030000000000000000000000000000000000050 -:1070400000000000022A00280000000000000000EC -:107050004068C2EA00C3C3C30000555500FF0000EA -:107060000000000000000000000000000000000020 -:107070000F0F0100000000000000000000000000F1 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A0003F4103410000000000000000000000001C -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000082AA80A80000000000006C -:1070D0000000547CD6FE00C300000000555500FFA0 -:1070E0000000000000000000100000000000000090 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000055003C3CF000C3AA15 -:107150000080000030F328283E162A020000FFFFBE -:1071600000FF00000000040000000000000000001C -:107170000000000000000000D7D7D7E700000000A3 -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C0000000000000000000000055FF3C3CF0FF04 -:1071D000C3AA0000000030F3EBEB7F576B430000C5 -:1071E000000000FF000000000000000000000000A0 -:1071F000201100002000000000000000000021001D -:1072000004002000000000000000000000008800D2 -:10721000200000002000000202000000000000002A -:1072200000208400C084100000020000000400035D -:10723000000020008820000010002000C000900006 -:107240008400000085000404200020002100840048 -:10725000840004000100C10000000000000084025E -:10726000400084022100880000002000000020006F -:1072700000020000000000000000000000000040CC -:107280000800800000001000000200000000000064 -:10729000000000000002009010000000000000004C -:1072A000100000010000002040000000000000006D -:1072B00000000000000000000000000000000000CE -:1072C00000004000000004008000A0008000880052 -:1072D00010000000800020004000080000000000B6 -:1072E000000100000001400000000000000000005C -:1072F0000000000008400000004002000000000004 -:107300000000028000000280020000000000020075 -:1073100002000000000900100840000000000040CA -:107320000000020002000040020000000000000017 -:107330000040000000400000000021C0010021408A -:107340000000008002210200000000000200010095 -:10735000020501408840000021000000014020009B -:1073600020002000000000000000009088000200C3 -:1073700000880180000009000008051000000000DE -:107380000000040800100000004000840000000419 -:1073900000000000000000000009000000080000DC -:1073A00000000008110000000000040000000000C0 -:1073B0000200000800000900000000082004200866 -:1073C0002000050005200000000020000000410012 -:1073D0000400000020080000000004840040208415 -:1073E00080008000820800000000400400402084EB -:1073F0000000002004020000000000000000400027 -:107400009040900040000880000000000000100044 -:1074100000000000000082000000000000080000E2 -:10742000C000000000000000840082000000000096 -:10743000000000009000000000000000000000219B -:10744000100020001041000800000000080008089B -:10745000000000000021000000000100000000000A -:107460004004900400212000001088000005000066 -:107470004088040000400020038421000400000034 -:10748000210000000000000080100000000000202B -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000100000000000BC -:1074C0000000000080000000000003000000080829 -:1074D0000800000000002100000003022000410815 -:1074E0000510040909834190880000C04100030091 -:1074F00008000020A1C0000003010000000084007B -:1075000000100000000900008811081000000000B1 -:10751000000900400000000000000000000084009E -:107520000000000000000000000040000000080013 -:107530000000000000410041C041000008000000C0 -:107540000000000000000000010001008200C000F7 -:10755000000000002020C000A080A000830982005D -:1075600090000400C00008000800A0108200820003 -:107570008504C1044120C0200020A10200001000A9 -:107580000000000121000000000000008001000058 -:1075900000000002000000000000000000000000E9 -:1075A00000000000000000000000000000000000DB -:1075B0000500400000000000000000000000110075 -:1075C0000000090021000000000020002000000051 -:1075D000000000000000200121002120000004A084 -:1075E000030021A085C04000030041000500000009 -:1075F00000002000200020012101080120080000D7 -:10760000000000000000000000200000000000005A -:10761000000000000000000000000000000000006A -:1076200000008400000000000000000000000800CE -:10763000000000000000000000000000000000004A -:10764000000000000000080000000000C000000072 -:107650000400040008000000000000000000050015 -:10766000820008001000840008008200C1050200AA -:10767000C090C00582004011C00282058200844192 -:1076800000000000000000000000000000000004F6 -:1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA -:1076B0000000080000000000000000880000020038 -:1076C000000000000000000800000000000000A012 -:1076D0000000800080000000000009080040000851 -:1076E00088000000210020A0090800C00000200040 -:1076F00080C00304000000008000001000000000B3 -:107700004184820000000000000000080800000022 -:107710004000000000000000000010000000000019 -:1077200082080000000000000000001100000000BE -:1077300000000000000000000000004000400021A8 -:10774000C0210000820000000000000000000000D6 -:1077500000800080040220208900210000004041B8 -:107760000400100010002000080021000008C000E4 -:10777000A000A000080082848240820440414104AD -:10778000A109C011000000000082000003000800F1 -:107790000000000000002000000040000000000089 -:1077A00000000000000000000000000000000000D9 -:1077B0000000000000000000000000000000008841 -:1077C00000000000000000000000000000080000B1 -:1077D00000000004002080000000040004000000FD -:1077E00000008000000011A080000002C0C000085E -:1077F0000300000011C003100005004005210088AF -:1078000020C1200020000000000000000000000057 -:1078100000000000000000A00000001000040000B4 -:1078200000000000000040080004001008040000F0 -:10783000000000000000A0900008000820020000E6 -:1078400000000000000000000000840001000000B3 -:107850000000000000000000000000000000000028 -:1078600002009000000002000000000090000000F4 -:107870000082014088080010914002208521828901 -:1078800000014100010000000000000000000000B5 -:1078900000000000000000000080000000000080E8 -:1078A0000000000000000000808000000000008058 -:1078B0000000000000000000800000800080000048 -:1078C00000000000000000000000000000000300B5 -:1078D00000000000000002000000000000000000A6 -:1078E0000000030080001000800002002100020060 -:1078F00000000000030002000080090311838802D9 -:10790000800200024011021000030000000080000D -:1079100080000000000000000000000000050000E2 -:107920000000000000000000000000000000000255 -:107930000000000000000000000000008010800037 -:107940000000000000000000000000000000000037 -:10795000000000000009000000020000000000001C -:107960000000000000058080801080800000000082 -:1079700000200080104040C0034008808389C00080 -:1079800011C0208203412100030502100000000005 -:1079900004001000000000000000000000000000D3 -:1079A0000040000000000000000000000000000097 -:1079B000000100000000000000000000900008012D -:1079C000A088880000000000000000000000000007 -:1079D0000000000000000000000000010040000066 -:1079E0000084000000849000020440018204000032 -:1079F000009000010004110040C0821082020202C7 -:107A0000038491101104000301C0000000840000F1 -:107A10000000000000000000000000000000400026 -:107A200000008200080000000000000000000004C8 -:107A300000900020108800000000000000000804F2 -:107A40000082002083080000000000000000000009 -:107A500000000000000000000000820000000100A3 -:107A600000000000C0000000019084A0044001104C -:107A700001004000400000001001C001000188002A -:107A800082034111C010C0A100010501C101010024 -:107A900000000000000000000000000000000000E6 -:107AA00080000000000080000000000000000000D6 -:107AB00000800000000000800000000000000000C6 -:107AC0008000008000002080000000000000000016 -:107AD00000000000000000000500000000000000A1 -:107AE000020004000000000000000400800080800C -:107AF000100020090010801011040002000900216C -:107B0000401000820205088589200502881008219E -:107B10004020004000000080000000000000000045 -:107B2000000000020004000000000000000000004F -:107B30000000000000000000000000000000000045 -:107B40000000000200020000000000000000000031 -:107B50000000000000000000000000000005000917 -:107B6000000000000000000900000080001100403B -:107B7000000000000008000800000000008580856B -:107B80008000808210A121802000804002801008A7 -:107B90000300024000000008004000000000000058 -:107BA00000000000200120012000820000000000F1 -:107BB00000000000000000000000000000000000C5 -:107BC00000000000880190A182A082000000000057 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000002000192 -:107BF00000030020000000000001000000008210CF -:107C000008024020820800412004A190A00001A0A9 -:107C10000100000000400000000000000000000023 -:107C200000000000000000810000070000000000CC -:107C30000000000000000000000000000000000044 -:107C400000000000000000810000070000000000AC -:107C50000000000000000000000000E00000000044 -:107C6000008100E0070000000000000007000000A5 -:107C7000000000E007000000000000E00700000036 -:107C8000000000E000006000000000E000000006CE -:107C9000000000E00700820000000000000000007B -:107CA0000000000000000000F0F0000000000000F4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000ECE3EFE000000FF9D -:107CD00000000000000000000000000000000000A4 -:107CE0000000000000000000000000000000000094 -:107CF0000000000000001F131C1000000000000026 -:107D000000003C3C00FF0000000000A300A3F3F3D0 -:107D100028EB000000000000000000000000000050 -:107D200000000000000000000000F0F0AA96000033 -:107D30000000000000000000000000000000A8AAF1 -:107D4000A828000000000000000002C232F2003A41 -:107D5000003A0000000000000000000000000000E9 -:107D60000000000000000000000000000000000013 -:107D70000000000000000000DFD3DCD000000000A5 -:107D800000000000AAAAF0F00000000000A300A379 -:107D9000303028EB00000000000000000000000070 -:107DA0000000FFAA00000000000000004141414126 -:107DB00000000000000000000000000082F0BEF0A3 -:107DC0000000000000000000000000000000BF3CB8 -:107DD000C303C3000000000000000000000000001A -:107DE0000000000000000000000000000000000093 -:107DF00000000000000000000000F7F4C7C400000D -:107E00000000000000000F3C55FF80D08ADA0F0010 -:107E1000050502320E3E00000000000000000000D8 -:107E200000000000550000000000000000000000FD -:107E3000030300000000000000000000000082F0CA -:107E4000BEF0000000000000000000000000000084 -:107E50003D3CC301C3010000000000000000000021 -:107E60000000000000000000000000000000000012 -:107E7000000000000000000000000000373407048C -:107E800000000000000000000F3C550085D58FDF8A -:107E90000C0C0505C2F2CEFE000000000000000040 -:107EA00000000000000000000000000000000000D2 -:107EB000800000280000000000000000000000001A -:107EC0000000400000000000000000000000000072 -:107ED000000000280000000000000000000000007A -:107EE000000000610007000D00000061002F000D80 -:107EF00001A005000A08050000A005610A0F050D94 -:107F000000A005610A0F050D00A000613007000DFB -:107F1000000100613007001D000005610A0F050D1A -:107F200000A00000000000000000000000000000B1 -:107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000000000000000000021 -:107F60000000000000000000000000000000000011 -:107F70000000000000000000000000000000000001 -:107F800000000000000000002000000000000000D1 -:107F90003030F3F3FFF0AFA0EBEB30F300F0CACAE0 -:107FA0003F3FFF0000000000000000000000000054 -:107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 -:107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000000091 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:1080100000007D417D415F500F00282830F30FFFA5 -:10802000CACA0303FF0000000000000000000000B7 -:108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:108050000000000000000000000000000000000020 -:108060000000000000000000000000000000000010 -:108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:1080900000000000F03AFF3A3C550FFF03037D411A -:1080A000D7D73F036120E3A20000000000000000DA -:1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000000000000000000090 -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000003A0F3A3C550F003F3FBE -:108120007D4114143F037534F7B6200002040000AB -:10813000098000000000820002020000408200006E -:108140000400000000000000880020002000000063 -:1081500020000000000000000000000020000000DF -:1081600000000800000284048404000300002000D2 -:108170000000200004000000000484000000200033 -:10818000840082004000C0000204000000002100C2 -:10819000000021002004000020000408C00020008E -:1081A00040204010000004008204C0044000800011 -:1081B0000000A010000000000004A10000008003E7 -:1081C000000000000000000000020000000040006D -:1081D000000000000000000000900000000000000F -:1081E0000000000080000040000200080000400085 -:1081F000000000000000000000000002000200007B -:108200000400000000000000000000000902090056 -:108210001000049040008000400080020002000036 -:1082200040008401800104000000110200000000F1 -:108230000200000000400200000000900340020025 -:1082400041800000201008400200000002100000E1 -:108250000200001002000000020002000000000006 -:10826000000002000000000002000000000000000A -:1082700000000000000000000000000084008500F5 -:108280000000200000000200040004C004000200FE -:108290004090010502000000000003000000820081 -:1082A00001000000030002000100000003000204BE -:1082B0000208000000000400000800080410021179 -:1082C0000000C002000020000408000000000000C0 -:1082D000000200000000000000080204000000008E -:1082E0000000200000000000000800000000000066 -:1082F00000000000030000000000008404000000F3 -:10830000040000000200000000000208024100001A -:10831000000480031040000800000000200000005E -:108320000200200020002008040020040200200099 -:10833000000100008800C0050010000000000900D6 -:1083400002004000400000000000000000000000AB -:10835000000000000000020000000000000000001B -:108360000400000000000000000000000000000009 -:10837000080000004000000800000010000000009D -:1083800000020000000000000008000000200000C3 -:1083900000000000000010000000000000808821A4 -:1083A000040001000000000382021000000082416E -:1083B000000000000000000000000001000041007B -:1083C0008800830000008000000000000000001012 -:1083D00010000000000000000000000000001084F9 -:1083E000080008100000000000000000000000006D -:1083F00000008000000000000000410000000000BC -:108400000000000000000300000000C04100000068 -:10841000000000000800000080A0000003080040E9 -:1084200000A08310040200080010000121A000A099 -:1084300000104190000082000000820000009000C7 -:108440000000000005000009010400000000000019 -:108450000000000000040000000000000000000018 -:108460000000000008000000000000040000000000 -:1084700000000000000000000808000000000000EC -:1084800040000000000088000400000000004000E0 -:108490002004050408000182200020002004901020 -:1084A0000880040200002020A00000800902401182 -:1084B0008200080408208420000000000000000062 -:1084C000000000200000020000004000000000004A -:1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C -:1084F0000000000000100000000000000004000068 -:10850000000000000000000000000000001000005B -:1085100000008800200000002003800080009100FF -:10852000000000200300400088000000000440011B -:108530000900000000C100210301C0000000C020AC -:1085400008000020C0000000000000000000000043 -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:1085700020000000000000000800000000000000D3 -:1085800000080011A0000000000000000000000032 -:10859000000000000000200000000000C0002100DA -:1085A00000002000830000808220C0000005000041 -:1085B000A000C0100010C021A000A0080000000012 -:1085C000000000000000002000200000000000006B -:1085D0000000000000000000000000000900000092 -:1085E0000000000000000000000000000900202042 -:1085F000002008A00000000000A0002000000000F3 -:10860000000000000000000000000000000000006A -:108610000000000000000000A10021000800090087 -:10862000900020108000048800400901401003A041 -:108630000500100020100884090000882184000033 -:1086400008004000C0000200000008041000000004 -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A -:1086700000210000000000000000000000000000D9 -:1086800008110000002100000000000000000000B0 -:10869000000090009000000000000000008000003A -:1086A00000114008400589804020882120100400E6 -:1086B000880000008889088000909183410941006A -:1086C0000000000000000000A000000000002000EA -:1086D000080000000000040000000000000000008E -:1086E000000000000000000000000000000000008A -:1086F0000000000000000000004000080990400059 -:108700000000000000000000000009000000000060 -:10871000000000000020000000000000000008042D -:1087200000000000000100A0200200000000000086 -:1087300000000084000000020004202004200482C5 -:108740000400000000001000000141A0009000A003 -:10875000A004000000010001000000000000000073 -:108760000000000000000000000000000000000009 -:1087700000000000000000000000C0000000000039 -:108780009000000000000000000000000000000059 -:1087900000000000000000000000000000000800D1 -:1087A000080000000001000100010001020090002B -:1087B00000008200A08200820220A00201000000CE -:1087C000010000000005080388050040A00000002B -:1087D00000800000000500100020000500000000DF -:1087E0000000000000000000000000000000000089 -:1087F00000000000000000000000000080000000F9 -:108800000000000000000000000000000000000068 -:108810000000000000000000000000000000000058 -:10882000090084000000004000400208002191007F -:108830008000110080008000100091000080200066 -:108840000000400000001100210008001008000096 -:1088500000A1008500000080000000000010000062 -:108860000000000000000000000000000000000008 -:108870000000000000000000000000000000800078 -:1088800000048080000000000000000000000000E4 -:1088900000000000000000000000000000000000D8 -:1088A00080400000000300000002000300820080FE -:1088B000000800800041008020408509C0409100F0 -:1088C0000005008000400080000801000100010157 -:1088D0000000000200020000000200000000000191 -:1088E0000000000000000000000000000000000088 -:1088F0000000000000000000000000000000000078 -:1089000008008401A00840000000000000000000F2 -:1089100000000000000000000082000000000000D5 -:1089200000000800040002018800000100010009A5 -:1089300000A0A001C0048400820482000200A110F3 -:10894000904000000020000100080001000100012B -:1089500000000090000400028204000000000000FB -:108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000000F7 -:1089800000000088000800C0008200000000000015 -:1089900000000000000000000000000000000000D7 -:1089A0000000000000002000000100000000820024 -:1089B0000000010101A0C08404A00182041140A1B3 -:1089C0000883090400008400400000000021051015 -:1089D0002021002000000080008080800000000036 -:1089E0004100000000000000000000000000000046 -:1089F0000000000000000000000000000000000077 -:108A00000000000000000000000011000000000055 -:108A10000000000000000000000000000000000056 -:108A2000000000000000000400020008200400090B -:108A30000900090840410400800080004100808254 -:108A40000082801010200900000080000300030055 -:108A500010000880400000000040000000002102DB -:108A60004000050040000000000000000000000081 -:108A700000000000000000000000000000000000F6 -:108A800000000000000080008000000000000000E6 -:108A900000000000000000000000000800000000CE -:108AA00000000000000000000000008000800000C6 -:108AB0000000000900008000001100A100800000FB -:108AC0000010000400000004002000090000000065 -:108AD0000088010000080100200082002000400002 -:108AE0000101000000000000000000000000000084 -:108AF0000000000000000000000000000000000076 -:108B0000000000000000000010008200C082900001 -:108B10000000000000000000000000000001000054 -:108B20000000000000000000000000000008000835 -:108B30000000C000C0008800820000000002008425 -:108B4000000082898289880820010001000000005D -:108B50000000000000E00000000000000000000035 -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B800000000000000000000000000000000000E5 -:108B90006000000000000000000000000000000075 -:108BA000070000000000000000000000000000E0DE -:108BB00000000000000000E000000000000000E0F5 -:108BC00007008212008100E007000000000000E0C2 -:108BD000070000000000000000000000FF00FF0090 -:108BE00030720000000000000000000000000000E3 -:108BF0000000000000000000000000000000000075 -:108C0000000000000000000000000000FF0FF00066 -:108C10003C66F0FF000000000000000000000000C3 -:108C20000000000000000000000000000000000044 -:108C300000000000000000000040000000000000F4 -:108C400000001B1B00C30FC30099C300C3FF00003B -:108C500000000000000000000000000000009191F2 -:108C600010100000000000000000000000000000E4 -:108C700000000000000000000000000000000000F4 -:108C80000000000000000000000000000000363678 -:108C900036363C66F00000000000000000000000D6 -:108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 -:108CC000000000001B1B3CFF0FC3FF99990F990F79 -:108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 -:108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000000000053 -:108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 -:108D6000000004FB00000000000000000000000004 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000000E3 -:108D90000000000000000CFCFFFF000000000000CD -:108DA00000000000000000000000000000000000C3 -:108DB0000000000000000000000040000000000073 -:108DC00000000000000000003CFF272700C3F099CE -:108DD000000F000F00000000000000000000000075 -:108DE000FFFFFFFF04FB0000000000000000000088 -:108DF0000000000000000000000000000000000073 -:108E00000000000000000000000000000000000062 -:108E10000000000000000000000000000000000052 -:108E20000000000000000000000000000000000042 -:108E30000000000000000000000000000000000032 -:108E40000000000000000000000000C32727FFC34F -:108E5000F09902020E0E0000000000000000006108 -:108E60000007000900010000300000100000006150 -:108E70000006000D000000000000000000000000DF -:108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000000000D2 -:108EA000000000000000000000000008000000A01A -:108EB000000000000000000000610007000D00013C -:108EC00000610007000D000005610A0F051D00A1EB -:108ED0000061002F050D00A005610A0F050D00A01F -:108EE00082BEC0C0FFFF20FF0000000000000000A5 -:108EF0002A6B6B2A00000000000000000000000048 -:108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 -:108F300000000000000000000000000000000080B1 -:108F400000000000000000C3003C00000000000022 -:108F500000000000000083B38FBF0000000000008D -:108F6000000082BEFCFCFFFF20200000000000008B -:108F70000000024343020000000000000000000067 -:108F800000000000000000000000000000000000E1 -:108F900000000000000000000000000000000000D1 -:108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC000000000000000000000C3003C00000000A2 -:108FD000000000000000000080B08CBC0000000019 -:108FE0000000000017FF173C030000FF0000000016 -:108FF000000000000C000000000000000000000065 -:109000000000000000000000000000000000000060 -:109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 -:109030000000000000000000000000000000000030 -:10904000000000000000000000040000000000001C -:109050000000000000000000000000100000000000 -:1090600000000000000017C317000300000000000C -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E00000000000000000000000000088000000F8 -:1090F0000000000000000040200000000000000010 -:1091000000008402000000000000000000000000D9 -:10911000000000020000000020000000000000002D -:10912000000020000180008000030000000000001B -:10913000400400800000008840840400000000001B -:1091400000000400200000000000000084008800EF -:1091500084020400004100000400200020004000C0 -:10916000880200002000000089004000000000008C -:1091700000024100000200000001000000000000A9 -:1091800000900000000000000000000000000090BF -:1091900000041090000000000000100000040040D7 -:1091A00000004040000002100002000040400000AB -:1091B00000000000002000000040402020000000CF -:1091C000400000400000000000000000050000001A -:1091D0000400000400000000000000000000800007 -:1091E000040000200000000000004000000000001B -:1091F0000400820040004000000002000000040063 -:1092000000000010820000000000000000000000CC -:109210000000020000000000000000000800020042 -:1092200002000010020500100000004100000000D4 -:109230000000000002000000020004000010020014 -:109240000000020000000200000000000400000016 -:109250000000000800000000000000008200030081 -:1092600003000300830000000200000002800000F1 -:109270000008000800088000840000008208000048 -:109280000000000004080002200000000484000028 -:1092900000020010000800000000000002100000A2 -:1092A0000000000000400008000000000000000076 -:1092B0000400000000000408000000000000000896 -:1092C000200000000000020000100000000000006C -:1092D00000000000000000080000110000102084C1 -:1092E0000400040804080400040000040000054011 -:1092F00000000000080000000200000000008800DC -:1093000082000000000000000008000000100000C3 -:10931000000000000000C000400000000000000845 -:1093200000000000000000000000000000800000BD -:10933000000000000000000000000003000000002A -:109340000000000000000000000000000008000015 -:109350000008000084000000000020000000200041 -:109360000400010000000000200020000000820036 -:109370000008000041000000210000000000000083 -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A000000000000000000000000020000000207D -:1093B00000000000000000000000000000000000AD -:1093C0000000000000004100000821000000000033 -:1093D000000000000000000000000000210010203C -:1093E00011004000200000000000214008C003825E -:1093F000008200000800004100000000000000049E -:10940000000000000000004000001000000000000C -:1094100000400000000000400000000000000000CC -:1094200000000000000500000041000000040004EE -:109430000084008400000000000000000000000024 -:109440000000000000000010000088000000200064 -:109450000409000088002000840090001000000330 -:1094600082004005820382004011A0044040014078 -:10947000A100414041A000000000030000000800DE -:10948000000011000000000000000000200000406B -:109490000000000000000000004008002100000063 -:1094A00000000000000000000000000000000001BB -:1094B0000001002100210000001000000000000059 -:1094C000000000000000000000200000000000007C -:1094D0000000000004000400200000000000000064 -:1094E00000000000000008000800009000000000DC -:1094F00020002000A0002008820008000000820058 -:10950000000000000000000000000000002000003B -:109510000400000000000000000000000000000047 -:109520000000040000000000C000000000009000E7 -:109530000000040001000000000004000000000022 -:10954000100000000000C000000000030008002020 -:1095500000410000000000000011000000000000B9 -:109560000000000000000000A00000002000000932 -:10957000200900000000000010004000090403045E -:1095800000884100000000002100030000000500E9 -:1095900000000000000000000000000000000000CB -:1095A00003000000000000000000000000000000B8 -:1095B00004000000802020000000000000000000E7 -:1095C0000000020000000000001002000000000087 -:1095D00000000000000000000000008400C0000047 -:1095E0000000081011000408000000000800C0C0BE -:1095F00003048088090000000900009000000400B6 -:109600000000040000000000000000000000001046 -:10961000001000090000000000000400000000002D -:10962000000000000000000000000000100000002A -:1096300000000000002000000000000000000010FA -:1096400000000000000000000000000010000020EA -:109650000040000000200000000000000000880022 -:1096600000000000081082000400400008002000F4 -:109670008200200400800100010041002000000061 -:10968000000000000000000000000000000020407A -:109690000000110000020000000000000040000077 -:1096A0000000020000000000020000000000004076 -:1096B00000000000000000010090000020400000B9 -:1096C0004100000000001000000000000000000049 -:1096D000000000000000000000000000000000008A -:1096E0000000000000000900000000000000080465 -:1096F00089000000C101090410001090109091042D -:109700000000000000000000004004040088A020C9 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 -:109730000000000000000000890091008900820004 -:1097400000000000000000000000088808020084FB -:1097500002100000000000000000000000000000F7 -:1097600000000000000000000000000000000000F9 -:109770000000000040000000000000900088908879 -:1097800000880000000000000000002080A0000908 -:109790000040000000000000000000000000000089 -:1097A00000000000000000000000000000000000B9 -:1097B000000000000000000000001100A0004000B8 -:1097C0008000000000000000000000000000800099 -:1097D0000080800000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F00000000000000000000500000000800000E4 -:1098000089800080000000000000000000000005CA -:1098100000800003000000000000000000000000C5 -:109820000000000000000000000000000000000038 -:10983000000000000000000000000000000900100F -:1098400000C0000000000000000000000000000058 -:1098500000108080808000000000000000000000F8 -:1098600000000000000000000000000000000000F8 -:109870000000000000000040008000030000090517 -:10988000204104054100000000000000000000909D -:10989000009000A000010000000000000000000097 -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C000008500410084000000000000000000004E -:1098D00090009001A08290100000000000000000A5 -:1098E0000000000000000000000000000000000078 -:1098F000000000000000000000000004000100045F -:109900000000010101A001000000000000000000B3 -:1099100040020008850241840000000000000000B1 -:109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 -:109940000008049084A101C1000000000000000094 -:1099500000009008008800200210000000000000B5 -:1099600000000000000000000000000000000000F7 -:109970000000000000000000000000000200820063 -:109980000000A00084010001C101000000000000EF -:10999000000080000380850010000000000000002F -:1099A00000000000000000000000000000000000B7 -:1099B00000000000000000000000000000000000A7 -:1099C00000000905008300200411000000000000D1 -:1099D0000000000080000000000000800000000087 -:1099E0000000000000000000000000000000000077 -:1099F00000000000000000000000000005008000E2 -:109A000000000500001180114109414100000000E3 -:109A100000000000A10040000300890000000000D9 -:109A20000000000000000000000000000000000036 -:109A30000000000000000000000000000000000026 -:109A400000000000800200218000000000000000F3 -:109A500000000000000080098011008080000000EC -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A8000004000000080008404400000000300004B -:109A900000000000000041009000400010000000A5 -:109AA00000000000000000000000000000000000B6 -:109AB00000000000000000000000000000000000A6 -:109AC0000000000000009000A0000200C0000000A4 -:109AD0000000000000000000C000A004A01008006A -:109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000000066 -:109B0000000000010000000200890301040084013C -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B40000000000000000000000000E0070000002E -:109B5000000000000000000000000081000007007D -:109B600000000000000000000000000000000000F5 -:109B700000000000000000000000000000000000E5 -:109B80000000000000E007000000000000E000000E -:109B90004106000000000000000000000000FFF08F -:109BA0003F30000000000000000000000000000046 -:109BB00000000000000000000000000000000000A5 -:109BC0000000000000000000000041CF410CF0FF49 -:109BD000AA3C00000000000000000000FFFF0000A1 -:109BE000F000F00000000000000000000000000095 -:109BF0000000000000000000000000000000000065 -:109C00000000000000000000000000000000000054 -:109C10000000000000000000000000003030505F35 -:109C20000F003F30000000000000000000000000B6 -:109C30000000000000000000000000000000000024 -:109C40000000000000000000000000007DCF7D0C3F -:109C5000F000AA3C00000000000000000000B4B4C6 -:109C600000FFF010F0000000000000000000000005 -:109C700000000000000000000000000000000000E4 -:109C800000000000000000000000000000000001D3 -:109C900000010000000000000000000000000014AF -:109CA00000140000000000000000000000000000A0 -:109CB00000000000000000000000000000000000A4 -:109CC0000000000000000000000000000000000094 -:109CD0000000000000000000000000000000000084 -:109CE000000800283000D0F0000000000000000054 -:109CF0000000000000000000000000000000000064 -:109D00000000000000000000000000000000000053 -:109D1000FF00FF0000000000000000000000000045 -:109D200000AF00050000000000000000000000007F -:109D30000000000000000000000000000000000023 -:109D40000000000000000000000000000000000013 -:109D50000000000000000000000000000000000003 -:109D60000000FFDFFFD72000C0F00000000000006F -:109D700000000000000000000000000000000000E3 -:109D800000000000000000000000000000000000D3 -:109D90000000FF00FD0000000000000000000000C7 -:109DA000000000613006000D00000000000000000F -:109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000000000000000093 -:109DD000000085610A0F050D00A0000000000000D2 -:109DE00000000000A00000280000000000000000AB -:109DF0000000000000000000000000000000000063 -:109E000000000000000000000000000005610A0FD3 -:109E1000050D00A080004007000C000000000000BD -:109E2000000000003CAF3CAF00000000000000005C -:109E30000000000000000000000000000000000022 -:109E40000000000000000000000000000000000012 -:109E5000000000000000000055C355C300000000D2 -:109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E90000000000000000000FF003C3C0500000046 -:109EA000000000000000FFAF00AF00000000000055 -:109EB00000000000000000000000000000000000A2 -:109EC0000000000000000000000000000000000092 -:109ED00000000000000000000000FF0F000F000065 -:109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 -:109F100000000000000000000000FF003C3C0500C5 -:109F20000000000000000000F0F030F00000000031 -:109F30000000000000000000000000000000000021 -:109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000000001 -:109F600000000000000000000000000000000000F1 -:109F700000000000000000000000000000000000E1 -:109F800000000000000000000000000000000000D1 -:109F9000000000000000000000000000FFFF00FFC4 -:109FA00000000000000000000000B0B0F0F0000071 -:109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000000081 -:109FE0000000000000000000000000000000000071 -:109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 -:10A010000000000000000000000000000000000040 -:10A0200000FF01010000000000000000000000002F -:10A030000000000000000182000008000000000095 -:10A040000004000000000400000004000400000000 -:10A0500000000000000000040000200002000402D4 -:10A0600000000000000300000400100020000000B9 -:10A0700000000004000400000000000020000000B8 -:10A0800000000004040000002100000000000400A3 -:10A09000040000040004000000000200200000048E -:10A0A000010000002000000000000000000000028D -:10A0B0000000090200400000044000008000000091 -:10A0C000400000400002000000020000000000020A -:10A0D0000002400200024090000200020002000064 -:10A0E000000000020004000000000000000000006A -:10A0F0001000000000000000000000000000000050 -:10A100000000400000000082000004002000030066 -:10A1100080008000000200900000040000000200A7 -:10A1200000012000000240020000000000000010BA -:10A130000800000000000840900002020010020029 -:10A140000200000000008200020002000200000085 -:10A150000000000002000000020002008200000077 -:10A1600001000200000020000000000000000000CC -:10A170000000900000000000000008000000000047 -:10A1800000000200820000008200000002000204C1 -:10A1900000000200000001000800000000000000B4 -:10A1A0000100000002000200040040004000000026 -:10A1B0000000000000000000040004008000000017 -:10A1C0000400000000000000204000000400000027 -:10A1D000000000000000000005000000000000007A -:10A1E00000002000000000008008000000002000A7 -:10A1F0000000000000000210000000000000040049 -:10A200000000000800000400020002080000000036 -:10A2100000000000040004840400000000000000AE -:10A2200000000408000000000000000840000400D6 -:10A230009000040000000000000002000400000084 -:10A240000000000000000000000000080000000006 -:10A2500000000021000000000000020000000000DB -:10A2600000000008000000000400000000000400DE -:10A2700000000000000000000003000300000000D8 -:10A2800000000000000000000800000000000000C6 -:10A29000000001030800000000000000A000000012 -:10A2A00000800000A00091000008010000100800DC -:10A2B0004100000003000000000021000000000039 -:10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E00000000000000000000000800000000000EE -:10A2F000000000004000000000000000000000001E -:10A300000000000000A000000000080000000000A5 -:10A310000000000004000000000000000000002019 -:10A32000000000200000000020000000204041400C -:10A3300000000000000000400000000000020000DB -:10A340000000000000000800000000000000040001 -:10A350000000000900008205000900000000000262 -:10A36000000500110041004100C10004011100007E -:10A3700000000004000000000000000000000000D9 -:10A3800000000000041000000000080000000000B1 -:10A3900000000000002000000000880220000400EF -:10A3A000054004000500048008200002040090001D -:10A3B000000000000800042002200000000000004F -:10A3C00000000002000000000088000000000400FF -:10A3D00040000000000000000000000000004000FD -:10A3E00010020000000000000000002000012040DA -:10A3F00000000000000000000000000000000082DB -:10A400000000000000000000000000000000080044 -:10A41000000000000040000000000008400005406F -:10A42000808884A08000A00080041101000000004A -:10A4300041000500000000000000080000000000CE -:10A440008800000000000000000000000000000084 -:10A4500000000000000000000000000000000000FC -:10A46000000000000000000000000000010000806B -:10A470000020048000000000000000000000000038 -:10A4800000000000000000100010000000000000AC -:10A4900000000000000000800000000000008200BA -:10A4A0000008880000000480C0000000C080A000F8 -:10A4B000A000828083002004000000000000210032 -:10A4C0000300030003A000000000000000000000E3 -:10A4D000000000000000000000000000000000007C -:10A4E00000000000000000000000000000C00400A8 -:10A4F000002000018020000000000000000000009B -:10A500000800000800040500000000000000000032 -:10A510000000000000000000002000000000020019 -:10A52000000000000004000080040000000000049F -:10A5300000C0100000402084080000000800000057 -:10A540000000000002000000000000000000000009 -:10A5500000110000002008000000000000000000C2 -:10A5600000000000000000400000000000000000AB -:10A5700000110100000000000000000000000000C9 -:10A5800000000000000000000000000000000000CB -:10A59000000020000000000000000400040004008F -:10A5A0000400400020000000200002000200010022 -:10A5B000200090000000C0002000410000000000CA -:10A5C0000000080000004100000000000000000042 -:10A5D0001000000000C00020000000000088000003 -:10A5E00021840088000800000340000000000000F3 -:10A5F0000300020020200000000000000000020014 -:10A600001100008800000010000000000000001091 -:10A61000000000000000000000000000800080003A -:10A620008004820000000000000000000090000094 -:10A630002000000003022000000080000000000055 -:10A64000000000000000000000000000C000C08406 -:10A650000082A0A000000000000000000000000038 -:10A6600000000000000000000000000000000000EA -:10A67000000000000000900000000000000000004A -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B00000000100000009040420018204080000D9 -:10A6C000000000000000000000000000000080000A -:10A6D00000000080000000000000000000000000FA -:10A6E000000000000000000000000000000000006A -:10A6F00000000000000011008000020000000000C7 -:10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 -:10A730000000000004000000208080002080000055 -:10A740000000000000000000000000000000000009 -:10A750000000004100210000000000000000000097 -:10A7600000000000000000000000000000000000E9 -:10A770000000000000000000000800000041008010 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A0000000000000000000000000000080000029 -:10A7B00000800005008000100000000380888003F6 -:10A7C0000080000000000000000000000000000009 -:10A7D0000000000000A000210000000000000000B8 -:10A7E0000000000000000000000000000000000069 -:10A7F00000000000000000000000000100C0000098 -:10A8000000C0000000000000000000000000000088 -:10A810000000000000000000000000000000000038 -:10A820000000000000000040000000820000000462 -:10A83000000000040000000400010084040010C0B7 -:10A840004084A0C0000000000000000000000000E4 -:10A8500000000000080800000082A01000000000B6 -:10A8600000000000000000000000000000000000E8 -:10A870000000000000000000000000000000C00018 -:10A88000C000000000000000020000000000000006 -:10A8900000000000000000000000000000000000B8 -:10A8A0000000000000000000000082000000000026 -:10A8B0000000040000000000A0000200010091C0A0 -:10A8C00040A0C010848800000000000000000000CC -:10A8D0000000000000000080000000008000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F0000000000000000000000000000000040054 -:10A900008000000041000000000080000000000006 +:10A7D000648600000000100020000000000000005F +:10A7E0000000000000000000A00040001000000079 +:10A7F000A00000000000000004008802000000002B +:10A8000000044000C000A000200020000000000460 +:10A810002000000140000000000220002000000095 +:10A82000000000002000200020040404200000009C +:10A8300000000000200000000000200000000000D8 +:10A84000A0040000000020002000200020000000E4 +:10A850008400000400000000000010000000000060 +:10A8600000000000400000020002000000000002A2 +:10A8700000000000000000080008000000000008C0 +:10A880000000000000000000002041004002000223 +:10A890000020000200000000000000040000000092 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000000098 +:10A8C00000000002000200000000000000900000F4 +:10A8D0000000410200000000000000408400200051 +:10A8E0000000000000000000000000409040000058 +:10A8F000000000000010020002000008020000003A +:10A900000000820000000000000000000000004085 :10A910000000000000000000000000000000000037 -:10A920000000000000000000050000000000000022 -:10A93000050000008000000003000000800002000D -:10A940004100000080000500000000000000000041 -:10A950000000000000000000000400218000000052 -:10A9600000000000000000000000000000000000E7 +:10A920000000000000000000000000000000900097 +:10A930000000000000000000000000000000000017 +:10A9400002000000000000000000000002000209F8 +:10A9500020002000000400040000000000000000AF +:10A9600000000400000000000000000000000000E3 :10A9700000000000000000000000000000000000D7 -:10A9800000000002000000000000000000000000C5 -:10A9900000000000000000000000000000000000B7 -:10A9A0000000000000000000000000000020000087 -:10A9B0000000000000040000000000000020000073 -:10A9C0000000000000000000000000000000000087 -:10A9D00000000000000000000000C0011020040082 -:10A9E0000200000000000000000000000000000065 +:10A98000000000080000008200000000000000003D +:10A990000000000000000000000000000002009025 +:10A9A000000000080084000000000090000000008B +:10A9B0000008000000840000008400000000000087 +:10A9C000000000080000000000000000000000007F +:10A9D0000010800080080001000104000000000059 +:10A9E000000000000000080000000000000000005F :10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000125 -:10AA30000000000000000000000000000000000115 -:10AA40000000000090000890C090C00000000000CE -:10AA500000000000000000000000000000060000F0 -:10AA6000070042000000000000000000000000009D -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000E00700820A0000000053 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000070000000000000007000000000088 -:10AAC00000E007000000000000E000004842000035 -:10AAD00000000000000000000000000000003F3FF8 -:10AAE0009F0F81E781E700000000000000000000E8 -:10AAF0000000000000000000000000000000000056 +:10AA000000000480040004000400000800000000AE +:10AA1000000000000000000000080000000000002E +:10AA20000000000000000000000000000000100016 +:10AA300000000000000000200000000000000000F6 +:10AA400000000000000000090000000900000000F4 +:10AA50000000000000000000840000000000000072 +:10AA6000000002004100040000000000000000009F +:10AA700000001002410000820000000000000008F9 +:10AA80000000080080208000890091000000000084 +:10AA900000821108049009880000000000000000F6 +:10AAA000000004004000410000000082000000207F +:10AAB000000000000000000000080000000000C0CE +:10AAC0000000000000000000000000000000000086 +:10AAD00000000082001003000000050000000000DC +:10AAE00000000000004100400000000000400000A5 +:10AAF000000000000000080000000000000000004E :10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 +:10AB1000000000000000000000000009000000002C :10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB400000000000000000002040108020044002AF -:10AB500000000000000000000000000000000000F5 -:10AB600030309000FFFF00000000000000000000F7 +:10AB30000000000000000000000400040204000403 +:10AB4000000000000000000008000000820000116A +:10AB50000000000000000000A00000054000000010 +:10AB600000000000000000000000000000000000E5 :10AB700000000000000000000000000000000000D5 :10AB800000000000000000000000000000000000C5 :10AB900000000000000000000000000000000000B5 :10ABA00000000000000000000000000000000000A5 :10ABB0000000000000000000000000000000000095 -:10ABC000000000000000000000000402080110085E -:10ABD00080010000000000000000000000000000F4 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC30000000000000000000000000000000000014 +:10ABC0000000000000001100000000000000000074 +:10ABD0000000110000000000000000000000000064 +:10ABE0000000000004000000000000000000000061 +:10ABF0000000000004000100000000200000000030 +:10AC0000000000210000080000000000000000001B +:10AC1000000000000000000000000000000800002C +:10AC2000000000000000A000000000000000000084 +:10AC300000000000000000030000000000200000F1 :10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000273F273F9999999900000000B4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 -:10ACC0000000000000000000000000000000000084 -:10ACD00088440088004400000000000000000000DC -:10ACE000000000000000031B031B999999990000C4 +:10AC500000000000000000000000000000000008EC +:10AC600000000000000000000000000000000008DC +:10AC700000000008200000820800400000000000E2 +:10AC8000000040001000000000000000000800006C +:10AC9000000000A0110000040000050200000000F8 +:10ACA0000000110000000000000000200000000073 +:10ACB00000A0090400040000400400880800008887 +:10ACC0000000000008000000000000004000000834 +:10ACD00000041100008800000000080008200000A7 +:10ACE0000000000000000000002000020000000042 :10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 +:10AD00000000000000000000000010001000000023 +:10AD10000000000000000000002000000000000013 +:10AD2000080000000000000000000000000000001B :10AD30000000000000000000000000000000000013 :10AD40000000000000000000000000000000000003 -:10AD5000884400008800440000000000000000005B -:10AD6000000000000000000000000E2800000001AC +:10AD500000000000000000000800000000000000EB +:10AD600000000000000000000000000000000000E3 :10AD700000000000000000000000000000000000D3 :10AD800000000000000000000000000000000000C3 -:10AD900005610A0F050D00A0000000000000000082 +:10AD900000000000000000000000040000000000AF :10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000005000A08050077 -:10ADC00000A005000A08050000A005610A0F050D96 -:10ADD00000A060610007000D1000000000000000EE +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000040000000000000000043 +:10ADD0000000000000000000000002000000000071 :10ADE0000000000000000000000000000000000063 :10ADF0000000000000000000000000000000000053 :10AE00000000000000000000000000000000000042 @@ -84737,946 +80640,5043 @@ :10AEB0000000000000000000000000000000000092 :10AEC0000000000000000000000000000000000082 :10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 +:10AEE0000000000000000000000040000000000022 :10AEF0000000000000000000000000000000000052 :10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 +:10AF10000000000000000000008000000080000031 :10AF20000000000000000000000000000000000021 :10AF30000000000000000000000000000000000011 :10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 +:10AF6000000000000000000000020000004000009F :10AF700000000000000000000000000000000000D1 :10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 +:10AF900000000000000000000000000200000004AB :10AFA00000000000000000000000000000000000A1 :10AFB0000000000000000000000000000000000091 :10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 -:10AFE0000000000000021010200402008800000091 -:10AFF0000000000000000000000800000000000049 -:10B0000000000000000000000580010001000000B9 -:10B010004080000001000000A084000000800000CB -:10B020000000000300000004000040800000020057 -:10B0300000000000000000000010000400000000FC -:10B040000008004010000000000000800000200008 -:10B050000000010000008800000000040000000063 -:10B06000000004000002004180014000000000C018 -:10B0700000000000000000000002000200020000CA -:10B080000000000008000000009040404002400026 -:10B090000000000210000400000021200000002039 -:10B0A00000000900000000000001100080101000E6 -:10B0B000000000000000000000000000040000008C -:10B0C00040000002000100000000400000200000DD -:10B0D0000000000040000000000000000000000030 -:10B0E00005000000000085800000010010100040F5 -:10B0F00008000000030902000800020002004000EE -:10B1000004001000020004000000040000102000F1 -:10B110000000000000000200020000000200000029 -:10B120000000010005000000000000000000000019 -:10B1300000000040000000000000020000000000CD -:10B140000200000002000000000090000000C000AB -:10B15000000001000100000000000000820000006B -:10B160000000020000000000020241000800800010 -:10B1700000008408050088A0000080000000820014 -:10B18000800000008200040080000000A000204039 -:10B190000082041000000000000000000000000811 -:10B1A0000000000820000410000000000000000063 -:10B1B0002000000000000000000000000900000066 -:10B1C000000211000002000000000000000000006A -:10B1D0000400000004000400000000000000000063 -:10B1E000030000000000000403004082000004008F -:10B1F00084000000000000000000000000000000CB -:10B2000000000240000000000000002100000000DB -:10B2100004004000100000000000000900000000D1 -:10B22000000000001000000000000000000000000E -:10B230000000000088004000000500000000000041 +:10AFE000000000000000000000000001000000015F +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B01000000000000000000000000000000004002C +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000002000C0 +:10B0700000000100000000000000000000000000CF +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000008000000A8 +:10B0A0008000000000000000000000000000000020 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F000800000004100000000000000000000008F +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000400000000000000000000000000001B +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000040000000000000000000000000000CB +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000010000000000000000000000009E +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000010000000000000000000000004E +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B2200000000042000007000000000000000000D5 +:10B23000000000000000000000000000000000000E :10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000C000000020000E -:10B2600000008302000000000000000080020000D7 -:10B2700000000020000000000300000000000000AB -:10B2800000000000000000080000000800000000AE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000200000000A00000000A4 +:10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE :10B2A000000000000000000000000000000000009E -:10B2B000000000001100000000000000000000007D +:10B2B000000000000000000000000000000000008E :10B2C000000000000000000000000000000000007E -:10B2D000410000000020000000000000000000000D -:10B2E000910000002001000000000000110001009A -:10B2F0000140418000000020000400000800000020 -:10B300002004000000000000000000038805008009 -:10B3100001800802000200840000A004C1100000A7 -:10B320000000000000000004000400840009000088 -:10B330000009C000000200000004004000110804E1 -:10B340000020000000000000C0000000000000001D -:10B3500002004000900008110400020502200220B3 -:10B360000400200020004020C0090441A000400249 -:10B370004000080010080508030005000000000058 -:10B380000000210000880000000000000004000010 -:10B390000004202021000000000508001101200009 -:10B3A0002000000000C0000011010001092103007D -:10B3B0000000119000C0000010000001000000001B -:10B3C000000102000000000000000000000000007A -:10B3D00000000000000000000000800000000001EC -:10B3E0000001800080008000000120000900200092 -:10B3F00005010800904008800000001100000000D6 -:10B400000000000000000000000000000800000034 -:10B410000000C000000300000800001020008804A5 -:10B4200000000000040000414000040000408200D1 +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C :10B43000000000000000000000000000000000000C -:10B440000000A00000008200C00008000000000012 -:10B45000C00000000400000300000041820300005F -:10B460000000000000800400000000040000000054 -:10B47000000000210000000180080000000008001A +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC :10B4800000000000000000000000000000000000BC -:10B49000000000000000000000000000000080002C -:10B4A0000001000000C0000000000000800000005B +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C :10B4B000000000000000000000000000000000008C :10B4C000000000000000000000000000000000007C -:10B4D00000000000000080000000000000000000EC -:10B4E0000800000000000004830000000001118833 -:10B4F000200020000900A00000000000010000085A -:10B5000008000000C000002108000000000000004A -:10B510000000880000008800008041004104000015 -:10B5200009000011000000000000000400000100FC -:10B530000080880082800000200920412000200037 -:10B5400000000080011100000000820000110000D6 -:10B55000000000000000000004400400042000215E -:10B56000200000000000200020000004040400006F -:10B57000A04082028200822040200420410010006E -:10B580000800408800004100100000000500000095 -:10B59000000008000000000000002020200004013E -:10B5A0000810209041000020000000000000000072 -:10B5B0000400002041000004000080008000900092 -:10B5C00082000000000420000000000400000000D1 -:10B5D000002000000000000000008020800080416A -:10B5E00000000000080000000000808400048001CA -:10B5F0000000038400000000000008A10008008390 -:10B60000901002C020900088904000C000100040C0 -:10B610000088000100010001000101C00040888293 -:10B620000082000100000900000110A0002000823B -:10B6300020100000000000000000000001000000D9 -:10B6400040000000000000000000000000000000BA -:10B6500000000000020000840020402000000000E4 -:10B660000000000000000500040000000000400091 -:10B6700084000000000000000800000000C100403D -:10B680000010002080800000008000000880000082 -:10B69000008000000041000300100008118021001C -:10B6A0000900000011400021C00500100880008042 -:10B6B00000000080000000000200000000001100F7 -:10B6C00003008900000000000000090000000000E5 -:10B6D00000000000000080000000000000000000EA -:10B6E0000000000000000500C1000500000000008F -:10B6F0001100C00000004000210000000000000018 -:10B70000004180A100208000000480008000000033 -:10B7100000000000000000000000000000000041E8 -:10B7200000000085000005040800204040080000DB -:10B730008021800000000004008000040000000060 -:10B7400000208000800500000005000000050000CA -:10B750000000000000000000800080418021800087 -:10B7600000000000000000000000008000000080D9 -:10B77000000200800003008004001000040020008C -:10B7800088408400A011000108000200A02082006F -:10B790000000000000000000000000000000004069 -:10B7A000000100C0009000C00090000000010000F7 -:10B7B00090002000A0A08200000100C00001004015 -:10B7C00000009001020090009000000000000000C6 -:10B7D0000000000000000000000008001004082124 -:10B7E0001000000000820000002000000020000087 -:10B7F00000840001000800010004010001000100B4 -:10B80000000010080010002008C002200090001066 -:10B810002082400000004000040000000000010001 -:10B820000000910140000401850100000200A00118 -:10B830000000020800048282200200008400C00090 -:10B84000010000000001A001000000010000040050 -:10B85000000000000000000000000000C002002006 -:10B8600000080920000000000400000001000000A2 -:10B87000C001000000008201400000000001000043 -:10B88000A0000001008020800000108080000000E7 -:10B890000000008080000000000080000000050023 -:10B8A00008000000414000218002C10800008841DA -:10B8B0009020110580000080000000800900000039 -:10B8C0000000040000000010001000030508000044 -:10B8D00080000000050000000000000000008080E3 -:10B8E00000000000A1000300000000000000104064 -:10B8F0000041800400200540004080030902002030 -:10B90000004180080020C1102100108000000005C7 -:10B9100080A0008000000000000000000000000087 -:10B9200000000000000000110011001100004000A4 -:10B93000080005001103000000C000000000000026 -:10B94000000900110000000000030000008000005A -:10B9500000000000000000000000000000000000E7 -:10B96000800800808000000000000010000000003F -:10B97000000000090000000000200004000000009A -:10B980000080000000000008030088884084200038 -:10B99000200020A0A0822000000000000000000085 -:10B9A0000000000000000000880100008201820009 -:10B9B00001880100000001009000204000200800E4 -:10B9C00000000000000100000000000100880040AD -:10B9D0000000000000000000000000000000000067 -:10B9E00000000801840440880400000000000000FA -:10B9F0000000000000000000000000010001000045 -:10BA0000000000080000000000000000000000002E -:10BA10000000000000000000000000000000000026 -:10BA200000000000000000000000000000E007002F -:10BA30005041000000E0000000000000000007008E -:10BA40000000000000E0070060000000000000E0CF -:10BA500000000000000000E0000000000000000006 -:10BA60000000000000000000000084000000000052 -:10BA7000070000000000000007004211000000E085 -:10BA8000070000000000000000000000004000C2AD -:10BA90000000FF007878AAFF7373FF3F00000000EA -:10BAA0000000000000000000000000000202C2C20E -:10BAB000000000000000000000000000C3FFC30001 -:10BAC0000A000AFF00000000000000000000000063 -:10BAD0000000000000000000000000000000000066 -:10BAE000000000000000000A008214BEF5F500000E +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B520000000000000000000000000000000050016 +:10B530000A28050000A00000000000000000000034 +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000610007000D0000000000000000000046 +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B790004000000240000004000000000000000023 +:10B7A0000000000000040000000000000000000095 +:10B7B0002000000000000000000000000000000069 +:10B7C0000000000000000000000000000000000376 +:10B7D0000003100000000000000000000000000056 +:10B7E00000000000000088000000000000000000D1 +:10B7F00000008800000000000000000000000000C1 +:10B8000040000000000000000000000000000000F8 +:10B810000000000000000000000000000000000028 +:10B8200000000000000000000000210000004000B7 +:10B8300000004000000000020000000000000000C6 +:10B840000002404000000000000000000000000076 +:10B8500000000000210000000000000000000000C7 +:10B8600000000000000000000000000000000000D8 +:10B8700000022100000000000000000200000000A3 +:10B8800000000000000000000000000000000400B4 +:10B8900000000000000000000000000002000000A6 +:10B8A0000840000000000000000000000010001030 +:10B8B00000000200001000000040004002000000F4 +:10B8C000080004100000008000800000004000809C +:10B8D0000240024000000040004000400040008064 +:10B8E00000800090001000400040004000400040F8 +:10B8F0000040004000400000000000000000000088 +:10B9000000008410001000000000200000008400EF +:10B9100000000000004100000000400000000000A6 +:10B92000000000040400000000000000000000000F +:10B9300000000200200000000000000000000000E5 +:10B940000000000000000000004000400000000176 +:10B950000040000100110000000100010001000191 +:10B9600000400040404000000001000100010001D3 +:10B97000020100010085000100000000000002003B +:10B9800000000000000000000000000000000000B7 +:10B990000000000000000000400000000000000067 +:10B9A00000000000000000004000880000000000CF +:10B9B0000000000000000000040010000000000073 +:10B9C0000000000000080000880004004000900013 +:10B9D0002000000000000040000090000000000077 +:10B9E0000000000000008400C0400400820000004D +:10B9F000880000000000100000400000000000006F +:10BA00000000000000000009900000000000080095 +:10BA1000A000000000000000000000000000000086 +:10BA20000000000000000000000000000000000016 +:10BA300000040000000000000008000000000000FA +:10BA400000000000110000001100000000000000D4 +:10BA500000020000000000000021000000000000C3 +:10BA600000000000000000000000000100000000D5 +:10BA700000000000000000000000000100000000C5 +:10BA800000000000000000000000000000000000B6 +:10BA9000080000000000000000000000001000107E +:10BAA0000000004000000040000000100000000006 +:10BAB000000800000000000000210000000000005D +:10BAC0000800000000080008000800009080848042 +:10BAD00082800080000000000000000400000800D8 +:10BAE00082008200000000000000000000008200D0 :10BAF0000000000000000000000000000000000046 :10BB00000000000000000000000000000000000035 -:10BB10000082AC0F0000787800557F7FFF3F000067 -:10BB20000000000000000000000000000000020211 -:10BB3000C2C2000000000000000000000000AAAA2D -:10BB4000AAAA3C003C000000000000000000000029 -:10BB500000000000000000000000000000000000E5 -:10BB60000000000000000000005F00D714BEA0A08D +:10BB100000000000A0000040004000400040000085 +:10BB200000000000000000100010000000000010E5 +:10BB300000100200004000000000000000000000B3 +:10BB400000000000000000080008000000000040A5 +:10BB500000400040004000000000000000A0000085 +:10BB600000000000000000000000000000000000D5 :10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 -:10BB90000000A2F30000000000AA0A28000005FF30 -:10BBA0000F553CFF000000000000000000000000F6 -:10BBB0004343FF0000000000000000000000000000 -:10BBC000C3D3E3F32F200F000000000000000000AB -:10BBD000000000000000F737C70700000000000069 -:10BBE00000000000000000000000F700F7001092C5 -:10BBF00051D3000000000000000000000000000021 -:10BC00000000000000000000000000000000000034 -:10BC100000000000F3F30100010000AA0A00000088 -:10BC200014FF0F553C000000000000000000000061 -:10BC300000004040FF000000000000000000000085 -:10BC40000000C3C3E3E3FFF00F00000000000000AA -:10BC50000000000000000000F434C40400000000F4 -:10BC6000000000000000000000000000F400F400EC -:10BC700038BA79FB0000000000000000000000005E -:10BC800000000000000000000000000000000000B4 -:10BC90000000000000610006009D000180005000CF -:10BCA00000000000000050000000000000610006DD -:10BCB000000D00000561340F050D00A000610007B4 -:10BCC000000D0000000000080000000005610A0FE0 -:10BCD000050D00A0000000610007000D00000061DC -:10BCE0000007000D00000000000000000000000040 -:10BCF00030000000000005000A08050000A00561F2 -:10BD00000A0E050D00A005610A0F050D00A00061D7 -:10BD10000006000D000005055500000000000000B1 -:10BD20000000000000000000000000000000000013 -:10BD3000000000000000000000000C7D0C41FFF03E -:10BD400035350F00AA0000000000000000000000D0 -:10BD500000000000000000000000000000C33CFFE5 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD8000000000000303D714000000003F410341FE -:10BD900000000000000000000000000000000000A3 +:10BB800000000000000000000000000000000200B3 +:10BB90000000000000000000000041000000000064 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD00010001000200020000000000000400000C5 +:10BBE00000002000100020002000000000000040A5 +:10BBF00000001000100020002000000000000040A5 +:10BC0000000008000000000000000000000000002C +:10BC1000000000000000080000000000000000001C +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC40000000000000000000000000880900000063 +:10BC500000048000800080008020110000000009A6 +:10BC6000000400000000800080008000000005004B +:10BC7000000100008000800080008088000000201B +:10BC800000010000000000000000000000080000AB +:10BC9000000800000000000000000000000000009C +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD00000000000010000000000000000400040E3 +:10BCE0000000000000001100000000000000004003 +:10BCF00000400000000000000000000000000040C4 +:10BD000000400000000000000000000000000000F3 +:10BD100000000000C0000000000000000000000063 +:10BD200000000000000000000000004000000000D3 +:10BD300000000000020000000008000000000000F9 +:10BD400000080000000000000000000000000000EB +:10BD500000000000000020000000000000000001C2 +:10BD60000001000000000000A00000000000000032 +:10BD700000010001000000000000000000000000C1 +:10BD800000010001000009000000000000000000A8 +:10BD90000000000000400000000000000000110052 :10BDA0000000000000000000000000000000000093 -:10BDB000000000000000000000000000CF7DCF4127 -:10BDC0000F0035350F00AA00000000000000000041 -:10BDD0000000000000000000000000000000B2B2FF -:10BDE000B2B20000000000000000000000000000EF -:10BDF0000000000000000000000000000000000043 -:10BE00000000000000003F3FD714000000003F7D0D -:10BE1000037D000000000040000000C04455000009 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD000000000000000000001C1000000010000A0 +:10BDE00000C0000000000002000000C100000000D0 +:10BDF000000000C000000000000001C14000000180 +:10BE0000000000C000000000000200000000000070 +:10BE10000000000000000000000000000000000022 :10BE20000000000000000000000000000000000012 -:10BE300000004D4DFF3C000000000000000000002D -:10BE40000000A0A003F34D4D3C00000000000000E6 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000C0445549 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE50000000000000000000000020C1092040098F +:10BE600000000080000000000080000040C1094187 +:10BE700040200000008000000000000011C10941C6 +:10BE8000400300000080000000000080000000006F +:10BE900000000000000000000000000000000000A2 :10BEA0000000000000000000000000000000000092 -:10BEB000000000004D4DC300000000000000000025 -:10BEC00000000000AFAF03F34D4DFFC300000000C2 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000001000000000020 -:10BF200000000000C00000002080000085800000AC -:10BF300000000000200000000000004000000000A1 -:10BF40000000000082000000000000040400000067 -:10BF500000008400000000000000820400000003D4 -:10BF600000000020000000000000000000000004AD -:10BF70000000040000000000000002002004000493 -:10BF80000000040000000000820000000004000027 -:10BF90000100210000080200020000000004000867 -:10BFA0001000000000C020000090402000020404A7 -:10BFB000000000000000000000000000400220001F -:10BFC00010020000000000000000000000900000CF -:10BFD0000000008200040000000000400002000297 -:10BFE000000000000001000000000000400000020E -:10BFF00000900000000000000000000200000000AF -:10C0000000020000000000000000000040000002EC -:10C0100040040400020000008300800000000002D1 -:10C0200000000002840000904000410000801000E9 -:10C0300000000040884040000140000090400000A7 -:10C0400004000000004000000000000000000000AC -:10C050000000000482000004C0040400030904007E -:10C0600004000000000000000000000000000000CC -:10C070000000000000000200080000008400000032 -:10C08000000002000000820000000000000000002C -:10C09000000004000000200000000200000000007A -:10C0A000020002000001001000088008C002000425 -:10C0B00080000000000000008084080000000000F4 -:10C0C000000000080400000000000402000000005E -:10C0D000000000080001040002010005C100040086 -:10C0E000C100898200000000000000000000000084 -:10C0F0000000020000080000040800000900000021 -:10C100000000000000000008000000000000000027 -:10C110000400040000080000000802000000040001 -:10C120000408000000840200041000110000000058 -:10C1300000000000000800002000000000000000D7 -:10C1400000000004000000000021002000000000AA -:10C15000000000000000000088080000000000004F -:10C1600000410000000000000008000090000000F6 -:10C170000000000500008400000000000000000036 -:10C1800000000000000000000000000000000000AF -:10C1900000000000000090004000000000000100CE -:10C1A0000200C100C1000200100041014100412015 -:10C1B00003820000088400040000800000200000CA -:10C1C0000004000000000000000000000200000069 -:10C1D000000000004100080000A0000100900002E3 -:10C1E000000000000000000000000000000000004F -:10C1F00000000000000000000000000041000800F6 -:10C200000300000000000000030000000000000028 -:10C210000300000000840000000000000000000097 -:10C2200020008000020002008000080008000811C1 -:10C230000120018284000082000000000000000054 -:10C240000000004100000000004000410200000921 -:10C250000040001100028540900000000082004173 -:10C2600000020000000400110109000000020000AB -:10C270000000080000000009001108400000001143 -:10C280000000824000400040004000000040880064 -:10C290000000880000000000000000400380010052 -:10C2A000010000000000C000090002000300084077 -:10C2B000030004004002000003084088000000A0C2 -:10C2C0004100210000400300000000000082808443 -:10C2D0000000200000001102040205040004000414 -:10C2E00000000000090400004104080000004100B3 -:10C2F00011002100000000200000000000020900E1 -:10C3000020040000000000000000004000000000C9 -:10C31000000000000000000000000000000082207B -:10C320000200020005000000000010009100000063 -:10C33000400000028400400400001008A00000003B -:10C3400000000000002000000000000000000000CD -:10C35000000000000800000000851100010301003A -:10C3600000000004020000009000840000000000B3 -:10C37000008000000080040000000000C0040100F4 -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A00020800280020002000010028001000000D4 -:10C3B0000000402041040000A100000084010000B2 -:10C3C00000040000000000000004020000000090D3 -:10C3D0000090008800000988000008200402040082 -:10C3E000200000080001080000000000000000001C -:10C3F0000000052000000520880400000000000067 -:10C400000400000000000000000000000008000020 -:10C410000008000000000000000000000000000014 -:10C420001100804080408000800021008040020098 -:10C430000084C000900000008200400000208200C4 -:10C4400082000020002000210008000000020000FF -:10C450000000000000000000010004000140000096 -:10C460000405000000042000200400009000820069 -:10C4700000000000040004000400040000820080AA -:10C4800001000100000000040000000000000000A6 -:10C4900000000000000004000000000090000040C8 -:10C4A0000000000020000103010000002104090435 -:10C4B00004840088040000000000000088400000A0 -:10C4C0000020022000000000000000001100000019 -:10C4D00000000000008811041190080491040490E9 -:10C4E00000C085842100000100002101000000A09F -:10C4F000000000200000C100C100910088820520DA -:10C5000000200400040000000004000000000200FD -:10C510000400080000000000008402000000200069 -:10C52000218400000004800020002000000002019F -:10C53000029141414141A1A101084010902010A168 -:10C540002008898482098211A0830009A0210000AB +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED00000000000000000000000000002802000C0 +:10BEE000A000C180800000030000800000000280EC +:10BEF0004000A009C1808000000300008000028093 +:10BF00004021A009C18380000003000080000000E0 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF50000000000000000000000000000000008859 +:10BF600000008400C188020000000000C000000042 +:10BF7000008800008401C188020000000000C000A9 +:10BF8000008800008401C189020000000000C00098 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE00040000190880001C100000002000000C074 +:10BFF000000040000190880001C104000002000020 +:10C0000000C040000190880001C100000002000053 +:10C0100000C0000000000000000000000000000060 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C060000000800903A0A02009C10000008000009A +:10C0700000800000800903C0C12009C18000008049 +:10C0800000000080800903C0A02009C100000080DA +:10C090000000008000000000000000000000000020 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E00000000000412020094100031180000000F1 +:10C0F000000000000000C140200941000311800041 +:10C10000000000000000C1042009030000118000AD +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C160000000000000000100000100009100C0007C +:10C170000000000000000000C1000001000091006C +:10C18000C000000000000000C1010001010000002B +:10C19000C0000000000000000000000000000000DF +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E0000000000000000000880000E000000000E7 +:10C1F00000000000000000000000880000E00000D7 +:10C2000000000000000000000000810000E00000CD +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C26000000000000000000000003C3C3C3C0000DE +:10C27000F0F00000FFFF0000F0F0000000003C3C88 +:10C280000000F0F00000FFFF0000F0F00000FFFFF2 +:10C290000000F0F00000FFFF0000F0F000000000E0 +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E0000000000000000000000000003C3C3C3C5E +:10C2F0000000F0F0000000000000F0F0000000007E +:10C300003C3C0000F0F0000000000000F0F00000F5 +:10C3100000000000F0F0000000000000F0F000005D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C360000000000000000000000000000000FFFFCF +:10C370000000FF0000003C3C00003C3C00000000CE +:10C38000FFFF0000FF000000FFFF00003C3C00003A +:10C39000FFFF0000FF0000003C3C0000C3C3FFFFA4 +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F00000000000FF0000003C3C00003C3C00004E +:10C40000000000000000FF000000000000003C3CB5 +:10C41000000000000000FF0000003C3C0000C3C31F +:10C42000FFFF00000000000000000000000000000E +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C470000000400280018020920240828000002063 +:10C48000920200004082800180209202408280005F +:10C49000002092024082800180209202408280002F +:10C4A00000208202000000000000000000000000E8 +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F00000000000005000300F000C0000000000A1 +:10C50000000000000000005000300F000C00000090 +:10C51000000000000000000000000F000C00000000 +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB :10C5500000000000000000000000000000000000DB -:10C5600000000000000000018800830000000000BF -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000C0000801000800BA -:10C5B00001C188000000820002C110210005800531 -:10C5C00003C1A0A1020380820010800204100008B1 +:10C5600000000000000000000000000000000000CB +:10C570000000000000000050003000000C0000002F +:10C5800000000000000000000050003000000C001F +:10C5900000000000000000000055000F00000C002B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B :10C5D000000000000000000000000000000000005B -:10C5E00000000000000000000011832090200008DF -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C6200000000000000000000000008000804000CA -:10C63000800009C1A10304098000A080A14182807B -:10C6400008042080211184000240A100830083009F -:10C650000310000000000000000000008000000047 -:10C6600080000000000000000000008009001100B0 -:10C6700008030000000000000080000000000080AF -:10C6800000000000000000800000008000000000AA -:10C69000000000000000000000000000000000009A -:10C6A0000000000000000000000000000008000082 -:10C6B00000408000830041000909C100021003010D -:10C6C000A110094189108800A1A020010420024086 -:10C6D000A1000801000000000000000000001000A0 -:10C6E00000000800000000A000000004001001008D -:10C6F0000100000100000004000000040000000030 -:10C70000000400000082000000040000000400009B -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000108 -:10C7300000000001C000080000000001C10010025C -:10C74000008202030101C0080083838582821040B9 -:10C75000029000041004000000000000000000002F -:10C7600000000000000001000000C0000000000107 -:10C7700000010000010101000000040000000000B1 -:10C780000000000082000000000000000400000023 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B00000004000000000C000000001000091C126 -:10C7C0000085050880A1211080850010042100202B -:10C7D00000008800208000800000000000000000B1 -:10C7E0000000000000000000400000000000000009 -:10C7F000001040030008114102000000800000000A -:10C80000000009000000000000000500000080009A +:10C5E000000000000000000000000000000000004B +:10C5F0000000000000000000000000000C000A0025 +:10C6000000000000000000000000000000000C001E +:10C610000A000000000000000000000000000C0004 +:10C620000A00000000000000000000000000000000 +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000F00550C004A +:10C680000A0000000000000000000000F000505010 +:10C690000C000A000000000000000000F0005050F4 +:10C6A0000C000A0000000000000000000000000074 +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D0000004000000000000000400000000000052 +:10C6E000001000000000000000000000000000003A +:10C6F0000000000000008800C00000000000C00032 +:10C70000C000000000000000000000040002000063 +:10C7100000000000C0000000200000040000000035 +:10C720000000200440000000000000000000C000E5 +:10C730000000C00420048800200000000000000069 +:10C74000C0002000000000000000000400004002C3 +:10C750000000000010004000000000000000400049 +:10C760000000400040000000000000000000400009 +:10C770000000000000004100000000040000400034 +:10C7800000000000000000000000000000000000A9 +:10C790000000400000000000000000000000000059 +:10C7A0000000000000000000000000000002000087 +:10C7B0000002000000000000000000000000000077 +:10C7C0000002000000001002000200000000000053 +:10C7D00000000000001084100000000000000010A5 +:10C7E0000000000000000000000000000021000028 +:10C7F000020002000000000000090000000000002C +:10C8000000000000000000000000000082000000A6 :10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 -:10C830000000050000000000408000001003000917 -:10C8400089C1A00010A0890020000221A0C1900091 -:10C85000080220C04080058005080000000000009C -:10C860000000000000000080000000000002000046 -:10C8700000000880110008001108000000020000FC -:10C88000000000000004002100000000000000097A +:10C8200000000000000000000000040004000400FC +:10C8300004000000000000000800000000000800E4 +:10C8400008000400040004000400000002000000CE +:10C85000000000000400000002000200040040008C +:10C860004000000000000000000020000400000064 +:10C8700000000000000000000000000000000000B8 +:10C880000000000000000000410000000000000067 :10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B000000000008000001100800000C10983001A -:10C8C000090040000200C14185A0900009410420F8 -:10C8D0000804880101A000A0004000000000000042 -:10C8E0000000000000000002001000000000000036 -:10C8F0000000000000C00100000001010000000075 -:10C900000000000000000001000000000000000026 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 -:10C930000000000000000800000000080000C10125 -:10C94000200000000000004200000700600000001E -:10C9500000E007008200480000E000000000000046 +:10C8A0000000000000000000000000008000800088 +:10C8B0008000800000000000000000000000000078 +:10C8C0000000000080008000800080000000000068 +:10C8D0000200000000000000000000000000000056 +:10C8E0000000000000000000000004000000000044 +:10C8F00000000400000000000000000000008800AC +:10C900000000000000000000C00000410000000026 +:10C910000000000000000000000000000400000013 +:10C9200000000000040004004000040000000000BB +:10C9300000000000000000000000000004000000F3 +:10C9400000001000000000000005000000000200D0 +:10C9500000000000010000000000000000000000D6 :10C9600000000000000000000000000000000000C7 -:10C97000000007000000000000E00000840000004C -:10C980000000070000000000000000000700000099 -:10C990000000000007000000000000000000000090 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000E00700000090 -:10C9C000480000E00000000024003C3CC0E7C0E755 -:10C9D0000083838399FFFFFF000000003CF0FF66A7 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 +:10C9700000000000000000000000000000000000B7 +:10C98000050005000000000000000000000000009D +:10C99000000003000020000000000400040000204C +:10C9A000000000000800000000000000000000007F +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D00080000000000004000000000000000000D3 +:10C9E000000400000000000400000000000000003F +:10C9F000000008000000000000000000000000002F +:10CA000000000000840000000000000000000000A2 :10CA10000000000000000000000000000000000016 :10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000FFFF0000FFFFFA -:10CA40000000FF000000FFFF0000F0F0F0F0C02445 -:10CA5000C024009F9F9FFFC3FFF0000000003CF038 -:10CA60000066000000000000000000000000000060 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 +:10CA30000000C00000000000000000000000A00096 +:10CA400000000000000000000004000000000000E2 +:10CA50000000000000040000000000C000C0100042 +:10CA6000009000C000C0008800C00000000000006E +:10CA70000000000000000990080000C000C0000095 +:10CA800000A000C000C000C000C000000000000006 +:10CA900000C00000000000000000000000000000D6 :10CAA0000000000000000000000000000000000086 -:10CAB000000000000000000000000000FFFF000078 -:10CAC00000000000FF000000000000000000000067 -:10CAD0000000000000000000000000000000000056 +:10CAB0000000000000000000000000000000000076 +:10CAC0002100000000000000000000000000100035 +:10CAD0000000000000000000410000000000000015 :10CAE0000000000000000000000000000000000046 :10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 +:10CB00000000000000000000000010000000000015 :10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB4000000000000000000000000000000000CF16 -:10CB5000FFCF00C380803C3C3C3CFF2FFF2F0F36B3 -:10CB6000FF36DB00D00000000000000000000000E5 -:10CB700000000000060600000000000000000000A9 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC000000000FF0000FFFF0000666600003C3C24 -:10CBD000000CFF0C00C30000FCBC7C3CFF2FFFFFDF -:10CBE0000036F036DBDBD0D0000000000000000093 +:10CB300008000000000000000000000000000000ED +:10CB400000000000000000000000000000000000E5 +:10CB500000000000080000000000002000050000A8 +:10CB600000000000000000000000000000000200C3 +:10CB700000000000000000000000000000000000B5 +:10CB80000000000000004000002000000020002005 +:10CB900000000000092000900000000021000000BB +:10CBA0000000000000000000000000000000210064 +:10CBB0000020000005000000000000000000000050 +:10CBC0000000000000000000000000000000002045 +:10CBD0000000000000000000000000000001000054 +:10CBE0000000000000000000000000000000000045 :10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC40000000000000FF0000000000006666000019 -:10CC50003C3C0061003E000D00A00061000D000999 -:10CC6000000000610007800D0000000000000000CF -:10CC70000000000000000000000105000A08050097 -:10CC800000A0006100010000000005000A08050086 -:10CC900000A0000005000A08050000A005000A0821 -:10CCA000050000A0000000000000000000000000DF +:10CC00000000000000000000001000000000000014 +:10CC10000000000000009000000000000000000084 +:10CC20000000000000000000900000000000000074 +:10CC30000000000000000000000000000000900064 +:10CC400000000000002100000000000000000000C3 +:10CC500000000000000000000000000000040000D0 +:10CC600000000000000000002000000000000000A4 +:10CC70000000000000000090000000000000000024 +:10CC800000000084000010000000004000000000D0 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 :10CCB0000000000000000000000000000000000074 -:10CCC000000000004563800F002D92024082800129 -:10CCD0008020920200D7005587878787F7F3F5F009 -:10CCE000FF00FFF1F7F437340000000000000000FF +:10CCC0000000000000000000000000000000000064 +:10CCD00000000000000000000000000000820000D2 +:10CCE0000000000000000000000000000000000044 :10CCF0000000000000000000000000000000000034 -:10CD000000000000FBF40B043C55FF5A000000003B +:10CD00000000000000000000000000000000000023 :10CD10000000000000000000000000000000000013 :10CD20000000000000000000000000000000000003 :10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000F00D4 -:10CD50000C0C00FF00F000C70005D782D7D7F5F014 -:10CD6000F5F0FF00FF41C7C4070400000000000009 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD60009020000000000000000000000000000013 :10CD700000000000000000000000000000000000B3 -:10CD8000000000000000FFF00F003C55005A0000BA +:10CD800000000000000000000000000000000000A3 :10CD90000000000000000000000000000000000093 :10CDA0000000000000000000000000000000000083 :10CDB0000000000000000000000000000000000073 :10CDC0000000000000000000000000000000000063 -:10CDD0000F000C0C000000F0140038380C0C0F0C85 -:10CDE00000003C000455F4FF5FBE5F145F43000089 +:10CDD0000000000000000000000000000000000053 +:10CDE00011008000000000000000000000000000B2 :10CDF0000000000000000000000000000000000033 -:10CE000000000000000000002B3F1703AAAAF00F4B +:10CE00000000000000000000000000000000000022 :10CE10000000000000000000000000000000000012 :10CE20000000000000000000000000000000000002 :10CE300000000000000000000000000000000000F2 :10CE400000000000000000000000000000000000E2 -:10CE500000000F00050500F0003C140038380C0CF1 -:10CE60000F0CC00000000455FEFF0ABE0A145F4309 -:10CE70005F43000000000000000000000000000010 -:10CE8000000000000000000000002B3F1703AAAACA -:10CE900000FF000000000000000000000000000093 +:10CE50000000000000000000000000000080000052 +:10CE600000000000008000000080000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 :10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED000000000000F00050500F0003C000000000D -:10CEE00000000000000000020003400000000800F5 -:10CEF00000002004200005002000010004000400C0 -:10CF00000000008300820100000000A00000040077 -:10CF100001002100000000000000000000030000EC -:10CF200000000000000800000004000000000000F5 -:10CF3000000000000000840000000000020000006B -:10CF4000000000000004008000800080000000005D -:10CF5000000000008200000001000000000020002E -:10CF60000000000000080000000200008000000037 -:10CF700000000040004080882002800020008000E7 -:10CF800080020000000200200402000000030000F4 -:10CF900080002004A000009000A0000000A000007D -:10CFA0000000000000000000000040000000000041 -:10CFB0000000000040200000000000000000000011 -:10CFC000000000000000000800040004000400004D -:10CFD000000000000000000200004000000000000F -:10CFE00000000000000004000002028210020200A3 -:10CFF0000000020000000000000090008400040017 -:10D000000000000000000400000000000000050017 -:10D0100001000000004001000000200500000000A9 -:10D02000000000000004000000000000000082007A -:10D03000000082000000000000000000000000006E -:10D0400000000000011000000000000000000000CF -:10D0500000000000000000000400000000000000CC -:10D060000000008804000088000000410003808365 -:10D070000500040000000000001000002000000077 -:10D080000004000000000000000400000000040094 -:10D0900020000490020000000408000004000000CA -:10D0A0000000000000C0000000000240000002007C -:10D0B0000200000000400000000004080000000022 -:10D0C00000000004000008010000008200000000D1 -:10D0D0000000000000000200000000080000000046 -:10D0E00000000200C0210200000000210420000016 -:10D0F00000200000042000000000000800000000E4 -:10D1000000000000000000000100030040002000BB -:10D11000200020008500A00201000800400000005F -:10D1200000000000000000000000000001000000FE -:10D13000404100000000000000000010000000045A -:10D14000000000008200000000000000000000005D -:10D1500000000000010000000000000000000000CE -:10D160000000820040001100210002000200418204 -:10D1700000C002901190000000000088000400042C -:10D18000000000000088000000000400840000008F -:10D190008900C10088000400000004880000080025 -:10D1A0000088080000080000200000000000404047 -:10D1B00000008000000000000000000000010000EE +:10CEC000000000000000008400000084000000005A +:10CED0000000000000000000000000000000001042 +:10CEE0000000008200000020000000C000000000E0 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF4000000000000000010000008400000000005C +:10CF500082000000000000008200000000000100CC +:10CF60008200A0000100010000880800010000000C +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC000000000000000000004000000000041001C +:10CFD00000008000000041000000800000004100CF +:10CFE0000500800000004100410000808000090031 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000030000DD +:10D0500000000000000000000000000000000000D0 +:10D0600000000000004000000000001100000080EF +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C000000000000000000000000000000000015F +:10D0D0000000000000000000000000000000000050 +:10D0E000000000C00000000000000000000100007F +:10D0F00000400000000000000000000000000000F0 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000400000000000000000000000000CB +:10D16000000000000000000000000400008100003A +:10D170000000070082210000000000000000000005 +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F :10D1C000000000000000000000000000000000005F -:10D1D000000000000000040000000000000000004B -:10D1E000000000000000800000000000000090002F -:10D1F0000000000400000004A04120000000000026 -:10D20000000000000004000420002000200920404D -:10D210000404040004040400210820400040050028 -:10D22000004020210411A00000000041000900047A -:10D230000100000000000005040020400000004143 -:10D24000000000409002000000000000000000000C -:10D250000000040005000400200090400000004091 -:10D26000A00082000000000000000000008200001A -:10D2700000002084409021004021000004001000A4 -:10D28000400000000000000120018008C0008590DF -:10D290009000809180C0A0018900820080850021DB -:10D2A00082882090A100A0000000000040001188AA -:10D2B000000020000000000000040020000000002A -:10D2C00009000000000000000000008800000020AD -:10D2D000000000000000A00080000000000000002E -:10D2E0000000000000000400000000008200820036 -:10D2F00000000041000208000404000000200000BB -:10D300000000082000000000000000000180000074 -:10D310000180040000002000A000000000000000C8 -:10D320000000000004000090040004000000A000C1 -:10D330008200C080A0000000200000040000002047 +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000F0F000000000000000004F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D270000000000000000000F0F0000000000000CE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD -:10D3500000000000A0000400000020000480000085 -:10D360000000A000C00000000000000082000302D6 -:10D370000800080000902105008800010804080446 -:10D380001100080004000000000000000000040478 -:10D3900000000404040000008000000000001004ED -:10D3A00008001100050080000020800080000000BF -:10D3B00000000000004000000000800000010000AC +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000FF0000FFFF00000000B0 +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D -:10D3D000000000000000000080C000008000800409 +:10D3D000000000000000000000000000000000004D :10D3E000000000000000000000000000000000003D -:10D3F000840000040200000088000000000000001B -:10D400000008000000000000008000800000000014 -:10D41000000800002000000090001000000900003B -:10D420000041C002004140002000202120112000C6 -:10D43000000008800900A100C000000000020005F3 -:10D440000009000000000011000090000000000032 -:10D4500002000000000000000000000000002000AA -:10D46000020000009000C000C0000800040004009A -:10D4700008000000000000002140000000C0000083 -:10D4800000004000410004020300020400040020E8 -:10D49000080200880000000000080000009005005D -:10D4A00000884140000004820020A000A0108000FD -:10D4B000A00000004004200020880084200020827A -:10D4C000040020040000080002000000000000002A +:10D3F000000000000000000000FF0000000000002E +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D450000000000000000000000005000A080500B0 +:10D4600000A000000000000000000000000000001C +:10D47000000005000A08050000A005002A0005407C +:10D4800000A80000000000000000000000000000F4 +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C :10D4D000000000000000000000000000000000004C -:10D4E0000000000000000000000002000000020038 -:10D4F000000000000000000000000000000101002A -:10D500008200000100000000000000000000000098 -:10D510000100010000C001900884008401000000A7 -:10D520008900000000000000000000000000000072 -:10D530000100000000009140884090820488109013 -:10D54000019190A088090000000000000000000088 -:10D55000000000000000004000A000C000840100A6 -:10D56000000001000000000000000000000090C169 -:10D57000008202C00405000000000000000011410C -:10D580000321080500210000000000000000000049 -:10D5900000000400040000800580900000001100DD -:10D5A0002100400000000000000009000000000011 -:10D5B00000004000000000001100210089800000F0 -:10D5C00083912002090300210000000000000000F8 +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B -:10D5E00011000000400000000000000000000000EA -:10D5F00000104003800580040000000000000000CF -:10D600000800210000112090000000000000000030 -:10D61000000900000004000000400000004000007D -:10D6200000040000004000000008000000080000A6 -:10D630000008000000080000000020088890888290 -:10D640004000108521A0200205C00000000000005D +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA -:10D660000000002000800003008000000080000017 -:10D670000000808000A00009008000000000000081 -:10D68000000000040100000001890000000000000B -:10D6900000000000000000000000000000C00005C5 -:10D6A00000C00000000400010084000100400001EF -:10D6B000004000010040000100400000210102C1C3 -:10D6C00002052082109008C020C120C10000000087 -:10D6D000000000000000000000000000000000004A -:10D6E00000000000000100200000004000000002D7 -:10D6F00000000000084004C104A182C00000000036 -:10D700000000000000010000900000010000000087 -:10D7100000000000000002000000010020014001A4 -:10D720000401C101000008000800010104002000FC -:10D73000408201000000200040000100000089112B -:10D7400020090203040911020589C0890290000022 -:10D7500000000000000000000000000000000400C5 -:10D7600000000000900001004000400001000000A7 -:10D7700000000000000085A10189C004C0A00000D5 -:10D7800000000000000000021141080320400000DA -:10D790000000000000000000800000002000C040E9 -:10D7A0000020000405110910802180054002C000FE -:10D7B00080000000410040008000000041000000A7 -:10D7C0004140009100A18910410391408321C0A0F4 +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000002000200020003A +:10D690004000C000000010001000880000002000C2 +:10D6A00088040000000020040000880000004004FE +:10D6B000C00040000000C00040008800400088001A +:10D6C0008800000088002000880000012000000081 +:10D6D00040002000200088002000200020002000C2 +:10D6E000880088000000400004008800200000003E +:10D6F00000000000200000008800200088000000DA +:10D7000000000000000020000000000000000002F7 +:10D710000000000200000000400000004002400243 +:10D720000002000000020000000200004000400073 +:10D7300000000000000200000000000000000000E7 +:10D7400000040004000000020900000400000000C2 +:10D750000000000200000000000040020000000085 +:10D760000000000000000000000000002000000099 +:10D7700000000000000400000000000200000000A3 +:10D780000000400200004000009020000000000067 +:10D790000000000000000000000000000220000067 +:10D7A000000000000000000000000040021088009F +:10D7B0000000004000000000000004000200000023 +:10D7C0000000000000000000000000100210000037 :10D7D0000000000000000000000000000000000049 -:10D7E00080000000000000004000000080002000D9 -:10D7F0000000000000000000410808049109000931 -:10D800000000000000000000414020004100200313 -:10D810000000000000000000000000000000000008 -:10D820000000800200400000000400100000000022 -:10D8300000080009000000000008000200000000CD -:10D8400000008000800000000020402121C0050071 -:10D8500003110000000000000000000000000000B4 -:10D8600000000000000000000000000800040000AC -:10D870000000000000000000000021408500408002 -:10D880004000000000000000000001200100000036 -:10D890000000000000000000000000000000000088 -:10D8A00000000000900084018400000100000000DE -:10D8B0000000000100A0A000000000010000000026 -:10D8C000000000000404049008A09000A083081049 -:10D8D000C0900901000000000000000000000000EE -:10D8E0000000000000000000000000000001000136 -:10D8F0000000000000000000000000008300044061 -:10D90000824040000000000000000000000000E035 -:10D91000000000000000000000000000000000E027 -:10D9200000000000000000E007000000000000E030 -:10D9300007000000000000E007000082000000E097 -:10D94000070000820000000000E000004800000026 -:10D9500000E000004842000000000000000000005D -:10D9600000000000000000000000000000000000B7 -:10D9700000E00700000000000000000000000000C0 -:10D98000000000004842000000000000000000000D -:10D990000000000000000000000000000000000087 -:10D9A00000000000000002C202C2000000000000EF -:10D9B000000000000000F0F0000000FF0000000088 -:10D9C0000000000000000000020880200408102071 -:10D9D00000000960408010200000000000000000EE -:10D9E0000000000000000000000000000000000037 -:10D9F0000000000000000000000000000000000027 -:10DA00002400002400090060000000000000000065 -:10DA10000000000000000000000000000000000006 -:10DA2000000000000000000002C202C2000000006E -:10DA30000000000000000000F0F0000000FF000007 -:10DA4000000000000000000000000104401001027E -:10DA5000408009600000010204080000000000008E +:10D7E00000000000000000000000000000100840E1 +:10D7F0000000000000000000000000000000001019 +:10D8000000000000000002000000000000100210F4 +:10D8100000000400090000000000000000002000DB +:10D8200000000000000000000000000000000000F8 +:10D830000000000041010900000000000000040099 +:10D8400000000000001000000000000000000000C8 +:10D8500000000000001000000000000000000010A8 +:10D86000021009000000200000000000000000007D +:10D8700000000000000000000000040000000000A4 +:10D880000000000000000000040000000000000094 +:10D890000000100000000000000000000000000078 +:10D8A0000000041000000010000004000000000050 +:10D8B00000000103002101050041002100030005D3 +:10D8C00000050410001004000000002100210000E9 +:10D8D0000000000084100010001000100010001064 +:10D8E0000010001000000000000000000000000018 +:10D8F0000000040000000000000000000000000024 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D930000000000040004000020000000000100055 +:10D940001000410000000000000000000000000086 +:10D9500000001000000000000000000000000000B7 +:10D9600000000400000000000000000000001000A3 +:10D970000000100000000000000000000000000097 +:10D98000080000000000000004000000000000008B +:10D990000000000000008200000000008200820001 +:10D9A0008200820008040800080004000800A000AB +:10D9B0000000C0000000840000000900C00000005A +:10D9C000A00008000800080000000000000000009F +:10D9D00010000000A00400008200000008001000F9 +:10D9E00010000000000082000000000000000000A5 +:10D9F000820000000800A0001000000008000000E5 +:10DA000082000000080282001000080008000000E8 +:10DA100082008400010000000000030000000800F4 +:10DA200000000800400000000000000000000000AE +:10DA300000000000000000200000000010000000B6 +:10DA400041000090410000000000000000100000B4 +:10DA500000000000210000000000000000000000A5 :10DA600000000000000000000000000000000000B6 -:10DA700000000000000000000000000000000000A6 -:10DA8000000081000081090060000000000000002B -:10DA90000000000000000000000000000000000086 -:10DAA000000000000000000000004340FFFF0000F5 -:10DAB000000000000000000000000000FFFF000068 -:10DAC0005555000000000000000000000690000016 -:10DAD00024000024060000060410082000000000B6 -:10DAE000000000000000000000000000FF00FF1F19 +:10DA7000000000000800000000000000000000009E +:10DA8000080000000000000000000000000000008E +:10DA9000000000002100020000000000040000055A +:10DAA00000000810001000000000000090000008B6 +:10DAB0008200080000050000080008218208080014 +:10DAC00008030010002100080010002100210005BB +:10DAD0000010000000000000002100000000000015 +:10DAE0000000000000000000000000000000000036 :10DAF0000000000000000000000000000000000026 -:10DB00000000000024810000240000240000000028 -:10DB10000000000000000000000000000000000005 -:10DB20000000000000000000000000004340000072 +:10DB00000000000000000000000000000000840091 +:10DB10008200000000000000820000000000000001 +:10DB200000000000000000000000000000000000F5 :10DB300000000000000000000000000000000000E5 -:10DB4000000055550000000000000000000000002B -:10DB5000069081000081900000900140028000004A -:10DB60000000000000000000000000000000FF00B6 -:10DB7000FF14000000000000000000000000000092 -:10DB800000000000000000002481810000810000EE -:10DB900000000000000000610007000D0000000010 -:10DBA00000000000000000610007000D000005619A -:10DBB000340F050D00A005610A0F050D00A01561C9 -:10DBC0002A0F054D00A805610A0F050D00A00000F1 -:10DBD00060610007000D100000610007000D0800E3 +:10DB400000000000080000000000000000000000CD +:10DB500020000000040000000000000000000000A1 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000481 +:10DBA0000004004100040800000400400005820059 +:10DBB0000000004000100005000382000000000586 +:10DBC0000803100300050003000000100008000314 +:10DBD00000000821082100000000002100000000D2 :10DBE0000000000000000000000000000000000035 -:10DBF000000000000000000005610A0F050D00A0F4 -:10DC0000000000000000000060610006000D100030 -:10DC10000000000000000000003C0014F5A0F5F535 -:10DC200000000000000000000000000000000000F4 -:10DC3000000000000CD70C1400000000F0AAFF3C0C -:10DC400000000000000000000000000000000000D4 -:10DC5000000000000000FF000000000000000000C5 +:10DBF000000000000000080000000000000000001D +:10DC00000000000000000000000000000000000014 +:10DC100008000800000008000000000000000800E4 +:10DC20000000000000000000004000000084000030 +:10DC3000000000000001410000000000000008009A +:10DC400003000000000000000000000000000000D1 +:10DC500000000000080000000000000000000000BC :10DC600000000000000000000000000000000000B4 :10DC700000000000000000000000000000000000A4 -:10DC80000000000000000000000055155555000080 -:10DC900000000000000000000000003C0505B4A0EA -:10DCA000B4F50000000000000000000000000000CB -:10DCB000000000000000CFD7CF1400000000F0AA41 -:10DCC000003C000000000000000000000000000018 -:10DCD0000000000000000000FF00040000008000C1 -:10DCE0000001000000000000000000000000000033 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA00000004010000400A0100800000000000068 +:10DCB000000011020020000210C0209000040002A9 +:10DCC00090404011000400081021028800840008E0 +:10DCD0001002000000000000000000000000000032 +:10DCE0000000000000000000000000000000000034 :10DCF0000000000000000000000000000000000024 -:10DD000000000000000000000000000055155555FF -:10DD1000010000000000000000000000AAAA2D2D54 -:10DD2000F0F0F0F000000000000000000000000033 -:10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 -:10DD50000000000000000000000000FF00FF0000C5 +:10DD00000000000000000000000000000000000013 +:10DD1000000000000000000000000000022000845D +:10DD2000000804088080000000008000000000005F +:10DD30000000000090000080000080000000000053 +:10DD400000000000C0410008408300028000000085 +:10DD50000080808000000000000000000000000043 :10DD600000000000000000000000000000000000B3 :10DD700000000000000000000000000000000000A3 :10DD80000000000000000000000000000000000093 -:10DD9000000000000000000000000000000000FF84 -:10DDA0000F3CFFFF282800000000000000000000DA -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000000000000053 -:10DDD00000000000000000000000000000BF00FF85 -:10DDE0000000002001000000000000000000000012 +:10DD90000000000000000000000000000000800003 +:10DDA00000000080808000000090802080800000C3 +:10DDB0000000000000008000809000000080000053 +:10DDC00000900000808080000090001100808000A2 +:10DDD00000830080008000000000000000000000C0 +:10DDE0000000000000000000000000000000000033 :10DDF0000000000000000000000000000000000023 :10DE00000000000000000000000000000000000012 -:10DE1000000000200000000000000000C000200002 -:10DE200082000000000020400000000000004000D0 -:10DE30000000000000000000200020002000200062 -:10DE40000082008001000000000000A000000080AF -:10DE50000000200000040000000300000480000413 -:10DE60000084000000000004040000000000000026 -:10DE70000000000000000000010400000400020097 -:10DE80000400000000000004000400000000000086 -:10DE90000000000000000011000400C0000000901D -:10DEA00000000090000040402190000000C00000F1 -:10DEB00080000000000021000002800080408000FF -:10DEC0008000001000040240000400000041000235 -:10DED00000100000C0040002000200000000000466 -:10DEE000000100020000000000000000000000002F -:10DEF00000000000000020000000080000000000FA -:10DF000000000000000000000040000200000000CF -:10DF100000000000000000000002000200000509EF -:10DF2000000091000440000082000000400040100A -:10DF3000850010000809000003090000000010001F -:10DF40000200400082008400000000000040004009 -:10DF5000020084000100000000000000000000003A -:10DF6000000000000000020000000000000000406F -:10DF7000000000000000020002000000000000009D -:10DF8000000000000000020000000000820000000D -:10DF90000000000000000000020004000200001069 -:10DFA000021000000808000000040000004080008B -:10DFB00080401082800480000000C004030800003C -:10DFC000800400008308000000000200000004003C -:10DFD0000000000000002000008200000008000097 -:10DFE0000000000000000008000000000000000029 -:10DFF000000000000000030000000000000000829C -:10E0000000C020000000000400000000000000002C -:10E0100000000000000000000000040002000000FA -:10E02000000084088221840000009040000000006D -:10E030000800C000C02020000403840800009000F5 -:10E040000000001100040000000000000000028039 -:10E0500000844000000008000011000000000040A3 -:10E06000000000000000000000800400000000002C -:10E07000400002000000000000050004000400044D +:10DE10000000000000000000000000000000000002 +:10DE20000000008300000080200002C1049008C0B0 +:10DE30000000000000000000080008C0908420C01E +:10DE4000400002C0888408C0080002C1889008C051 +:10DE5000080002C0020220C0000000000000000014 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000080004C0C02040C083080010C00269 +:10DEB0000220000000000000000021040008C0044F +:10DEC000029009100002C0100220112001A0C0829F +:10DED000904041900010C020081000000000000099 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF20000000000089040008C0042088410000802F +:10DF30008000800000000000000000004180000020 +:10DF4000800080004180000080800000C10040000F +:10DF500085000000410000808000808000000000FB +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA00000000000000041800080800000000000B0 +:10DFB00000800000000000000000000000000000E1 +:10DFC0000000000000000040008000800000000011 +:10DFD00000000080000000008000008000000000C1 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E030000400080810820400000000000000000036 +:10E0400090008802880802000400202008080400CC +:10E05000040020020402040084000440840404003C +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 :10E080000000000000000000000000000000000090 -:10E090000000400000000000000000000000000040 -:10E0A000000000000300000009000820000000003C -:10E0B00000000000000000400000000000002100FF -:10E0C00000000000000041000000050000100000FA -:10E0D00004040020008400000000090011820000F8 -:10E0E0000900000020002000200020040020000083 -:10E0F000000080900090000000000000000100017E -:10E10000000100000000000000000000000000000E -:10E1100000000002000000000000000000000000FD -:10E12000000000000000C0410000C010824000104C -:10E13000C01100000800000000000000A00008114D -:10E140004011004020002041200020000100040078 -:10E1500004910400A0110011000000200000004004 -:10E1600000000800000000004080000000000040A7 -:10E1700000200000202000000004000000000080BB -:10E18000000000800000000000000000000000000F -:10E19000000000000200000000000000000000007D -:10E1A000000000000000000000000000200000004F -:10E1B0000000000000000000110041004140040088 -:10E1C00040004100400080408040800084004000CA -:10E1D0008000A00280000000008820000020400095 -:10E1E00000001100C004000000840504002000C0ED -:10E1F000000000000000200000880300000000C0B4 -:10E200002020200400200000000400000000002066 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000084008204849052 +:10E0B0008400000000000000484200000000000052 +:10E0C00000000000000000004842000000000000C6 +:10E0D0004842880040E00000484200000000000084 +:10E0E00048420000000000000000000000000000A6 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E13000000048424010802024000024000000001D +:10E140000000000000008124600000602200002226 +:10E150008100240000008124000081246000006010 +:10E160000280082000000000000000000000000005 +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000004105B +:10E1B00008200011002201040208810000810000F3 +:10E1C0000000000000008124000009000009110087 +:10E1D0000011008100248124000081240000090036 +:10E1E00000090140041000000000000000000000D1 +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E :10E2100000000000000000000000000000000000FE -:10E2200000000000000000000000080000201100B5 -:10E23000C0008200040082000000820000004080D4 -:10E2400000200000080008110021000090001003C9 -:10E25000000000000020080082008280828082800E -:10E260008800828082808280000008080000090007 -:10E2700008000000000900000000000000209004D9 -:10E280002003000000000004000000000000000067 +:10E2200000000000000000000000000000000000EE +:10E23000014002801100220004010802448800000D +:10E2400000000000000000002481000004100140D4 +:10E250004400880000110022040810200408010274 +:10E2600006009000040810200000000000000000DC +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E :10E29000000000000000000000000000000000007E :10E2A000000000000000000000000000000000006E -:10E2B00020000000100008200920000000200000BD -:10E2C00084100004000000000000000000000000B6 -:10E2D000000011840000000000C000840020002025 -:10E2E000002000840004000400040000409040046A -:10E2F0000204040009900900400421040000000009 -:10E30000000000000000000000010000000000000C -:10E310002100000000000084000000000000000058 -:10E320000000000000000084001003000000000056 -:10E33000000500001021002104040000C00082003C -:10E34000C000880020110000C00000002000000074 -:10E35000081008100400000488000000A02000003D -:10E360000002000490040003900084000000008478 -:10E3700008000000842100090002000000020200E1 -:10E3800000050000000001000104040000840000FA -:10E39000000000000020000000000000000000005D -:10E3A0000002000000000000000000000000080063 -:10E3B00000002100040000040000000000000040F4 -:10E3C00000000000004041400800218440880910FE -:10E3D000000021042000880003000000000000016C -:10E3E0000004000000880001200020900040000090 -:10E3F000200540000000090000200000002000006F -:10E4000000001100000000000400040100000221CF -:10E4100000000040000005000000000000000800AF -:10E4200000000000110000001100000000000000CA -:10E43000000021002000000100000000000000009A -:10E440000305022190A082410001000000000000AD -:10E450000000000088000000000000000001000033 -:10E46000000000000000000002000000000040006A -:10E470000000830201908808900802C0010484888B -:10E480000802000000000000000000000000010081 +:10E2B0000000060090000401104010402080000083 +:10E2C00044880000000000000000000024810820B5 +:10E2D00002800044008811002200010240801020CA +:10E2E0004080000600900102408000000000000015 +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E33000000000000006009008022080000000009D +:10E340000000080000000000000000006000000065 +:10E35000000010000000000000000800602100071D +:10E36000800D100000000000000008000000000008 +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B00000000000000060000000000010000000ED +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C :10E49000000000000000000000000000000000007C :10E4A000000000000000000000000000000000006C -:10E4B00000000011210909200002000000000000F6 -:10E4C000000082C1118300208008000800050005BB -:10E4D00000080000030010000000002003400408B2 -:10E4E0000005000000000000000080000000110096 -:10E4F00000000000208002000400000000002080D6 -:10E50000000000800000000000000000000000008B -:10E5100002000000000000000000000000000000F9 +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E00000000055FFFC00000000000000000000DC +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB :10E5200000000000000000000000000000000000EB -:10E5300000000000C08003000320A00300000000D2 -:10E540000000000080000010888002A1400021200F -:10E5500010000241000500000040000040000220C1 -:10E560000200109000000000000080000040000049 -:10E57000802080000000800900A10005008041008B -:10E580008484200240800000000000000000801011 -:10E590008000000880000000000000000000000073 +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E56000000000000055FF0C00000000000000004B +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B :10E5A000000000000000000000000000000000006B -:10E5B00000000000000008400400A000C0010000AE -:10E5C000000000000000A0A08201A01000A10090A7 -:10E5D000010001080101000000000001000000909E -:10E5E00001C101900009020020C09000C082A0017A -:10E5F0004000A00108000000040008C082C0A0C0C4 -:10E60000020009C19184C0C00000000000000000A9 -:10E6100040010284040008400000000000000000E7 -:10E6200000000000000000000000000000000000EA -:10E6300000000000000000000000000100010000D8 -:10E640000000000000000000089001100005C0114B -:10E6500000000100000000000000080000000101AF -:10E66000000000000800000100000000040000009D -:10E6700000020402004000A0000041030803C09013 -:10E68000080991030002C0111009000000000000F9 -:10E69000000001008800840001000000000000006C -:10E6A000000000000000000000000000000000006A -:10E6B000000000000000000000000008000205212A -:10E6C000004000000000000000008020202000A189 -:10E6D000000200000800100000000040800400411B -:10E6E000024105080320852000020400000080008C -:10E6F00000000080008000002000000041C08085F4 -:10E7000080118540418200A180A18020000000008E -:10E7100000000000040000000000410000000000B4 -:10E7200000000000000000000000000000000000E9 -:10E7300000000000000000000000000010210205A1 -:10E740004100100300000000000000004100808034 -:10E7500003000800C080C00020000509000400007C -:10E760000000000088004004050008100000008937 -:10E77000000000000005008000800080000000080C -:10E780000080008000000082000000000002000005 -:10E790000000000000000005002100000000000053 -:10E7A0000000000000000000000000000000000069 -:10E7B000000000000000000000000000000001C197 -:10E7C00001900084000100000000000000004100F2 -:10E7D00002A088A00900C1A010008200C0000000B3 -:10E7E000000000000000C102080020000901000034 -:10E7F0000002000000000000002000020090000065 -:10E80000A00120202002880088101008A0028801A2 -:10E810000000000000000000000000200090000048 -:10E8200000000000000000000000000000000000E8 +:10E5B000000000000000000000000000000000005B +:10E5C0000000000000000100008021008904C0005C +:10E5D00084000000040000000480400520000400C6 +:10E5E000200004040402A0008800000020000000B5 +:10E5F000000088002000840020008400200020000B +:10E600002000880220000001200020008400040077 +:10E61000400088000000200420002000200020008E +:10E620002000200020042000880084002004200016 +:10E6300000000000000000000000000000042004B2 +:10E640000000000000000000204000200440040002 +:10E650000002000000000000404000024040800036 +:10E660000002004000001000400000000000000018 +:10E670000084000000000000000040000000009046 +:10E680000002000200000002000000000090009064 +:10E69000200000000000000000000040000000001A +:10E6A0000000000200024000000000002000000006 +:10E6B00000000000000000020090000000000000C8 +:10E6C0000090000000000002000000008800000030 +:10E6D00084000200400004008500000000000000EB +:10E6E0009040000000000000000002000200000056 +:10E6F000000000000000000000000000000000001A +:10E7000000000500030003000100000000000000FD +:10E7100000000000000000000000000000000000F9 +:10E7200000000200000000000000000000000000E7 +:10E7300000000000000000000000000000000000D9 +:10E7400002000210020002000000000000000000B1 +:10E75000000000000400A000000010000000000005 +:10E760000000040000200400000040000000000041 +:10E770000000000000000400000000000000000095 +:10E78000000000008200840084820200000000007B +:10E790000000000800000008000020000000000049 +:10E7A0000000000000000000000000000000000861 +:10E7B0000000000800000008000000000000000049 +:10E7C0000000000000000000000000000000010048 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000800000408000000000000000005 +:10E800000000000000000005000000000000000003 +:10E8100000000000000000000000000000000000F8 +:10E8200000000400000000000000000000000000E4 :10E8300000000000000000000000000000000000D8 -:10E84000000000E0000000000000000000000000E8 -:10E850000000000000000000000000000000000AAE -:10E86000000000E000000000000000E007000000E1 -:10E870000000000007000000000000E000000000B1 -:10E880000000000000E0000048420000000000001E -:10E8900048420000000000000000000000E0070007 -:10E8A0000006000000000000000000000000000062 +:10E8400000000000000000000000000000000000C8 +:10E850000400000000000000100000000010030091 +:10E860002100000005000500051000000300030062 +:10E8700000040000080008400000000000C0000084 +:10E880000000000000000000040000400000000044 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000800000050 +:10E8C000000021000800410021002100410000005B +:10E8D0000300A000000082000040000004111000AE +:10E8E00010000000090000000800000000000809F6 +:10E8F0000800A0000000000082000800080040405E +:10E90000820082000000000000000000C000000043 +:10E91000010000008208000000000000000000006C +:10E920000000000082000000000000000000000065 +:10E9300000000000000000000000000000000000D7 +:10E9400000000800000000000000000008000000B7 +:10E9500000000000000000000000080000000000AF +:10E96000080000000000400000000000000003005C +:10E970000000000000000000000000400400000053 +:10E980000000000000000000100003000000000074 +:10E990000000040000000000000000000000000073 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000041000000021000000000012 +:10E9D0000004000000000000000000000000100023 +:10E9E00000004000000001000080008001000021C4 +:10E9F0000000000000000000000000000000000017 +:10EA000000000000000000000000080000000000FE +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000800000000000000CE +:10EA4000000000000000C0000000000008000000FE +:10EA50000000000090000800050005000000000014 +:10EA6000000000000000000002002140082004888F +:10EA700000000000408809004000030021840000DD +:10EA800000000084000008000000000000000000FA +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD000000000C00004080000000000000000006A +:10EAE00040000800820082000000000000000000DA +:10EAF00000000800000508080000000000410000B8 +:10EB000000000000000000020000000000090000FA +:10EB100000000000000000000000000000080000ED +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB40000000000008000000100040000800000065 +:10EB500000000000000008000000000000000300AA +:10EB600000000000000000000000000000000000A5 +:10EB7000000000000000000000000000000000C0D5 +:10EB80000000028800A00000000005000000000056 +:10EB9000000003000000000008000000000000006A +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000040000000000000000005 +:10EBD0000000000000000000000000000000000035 +:10EBE000000000000000000000000000000009A17B +:10EBF00004031041000300000000000000000000BA +:10EC00000000000000000000000000000000000004 +:10EC10000000000000000000009000000000000064 +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC60000000000010000000000000000000000094 +:10EC70000990808280820083000000000000000074 +:10EC80000000000000000000000000000000000084 +:10EC900000000000000000000900008000000000EB +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE00000000040000000000000000000000000E4 +:10ECF00000040000210310008290000000000000CA +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED60000000000000000008000000900084000087 +:10ED70000000000140C001010108C0910000000036 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000004033 +:10EDA0000000004000000000000000000000000023 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000002000000000021 +:10EDF00000000000000020088901019121C10000ED +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE20000000209000000000000000000000000032 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE6000000000000000000003000000800000001F +:10EE70000000000000000500801090032021118395 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA00040000000008000000000000000000000A2 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE00000000000000000000000004000100000D2 +:10EEF0000000410040000500020008A10840C18058 +:10EF000009100000000000000000000000000000E8 +:10EF100000000000000000000000000000000000F1 +:10EF20000000001180000000000000000000000050 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF700000000000010001000100010021C12190FA +:10EF80009004890000000000000000000000000064 +:10EF90000000000000000000000000000000000071 +:10EFA00000000000000120000088000000000000B8 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE000000000000000000000000000000081811F +:10EFF00000E00700000000000000000000004842A0 +:10F0000000E00700420000000000000000000000D7 +:10F0100000000000000000000000000000000000F0 +:10F02000000000000000004184000785000000008F +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F0800000000000003C00660000000000000000DE +:10F090000000000000000000000000000000000070 +:10F0A00000000000000000000000FF000000FF0062 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F10000000000000001003C00660000000000005C +:10F1100000000000000000000000000000000000EF +:10F12000000000000000000000000000FF000000E0 +:10F13000FF000000000000000000000000000000D0 +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F20000000000000000000000001818999900009C +:10F2100000000000000000000000000000000000EE +:10F22000000000000000000000000000000000FFDF +:10F230000000FFFF000000000000000000000000D0 +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F2800000000000000000000000800018180000CE +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B00000FF00000000000000000000000000004F +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F0000000000000000000000005610A2F850DDD +:10F3000000A000610006000D00000061402E804951 +:10F3100000080000000000000000000000000000E5 +:10F3200000000000000000000000000000000000DD +:10F33000000015182A20054004A800000000000065 +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000A0A3F30000000000000755530 +:10F3900050FA10FB00000000000000000000000018 +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F40000000000000000FAFA3F3000000000000099 +:10F41000555550FA10FB00000000000000000000ED +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000FFFFFFFF0500000000000000000000006B +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F510000000FFFF7FFF000000000000000000006F +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F5800000000000C00021002000040020008800CE +:10F5900020008800400000008400880000008400F3 +:10F5A00000000000400020004080040488000000AB +:10F5B00000040000100000004004000000002000D3 +:10F5C000000004000003200040002004200400008C +:10F5D00000000000400440008800200088008800EF +:10F5E00020000000000000002000040000000000D7 +:10F5F00000000000200000000000000000040100E6 +:10F600000000400040004000100200000000000028 +:10F610000000000000001000400004000000400056 +:10F6200040001000100200000500002080000000D3 +:10F63000100000001020000200000400040240003E +:10F640000000400000020000000000000000000078 +:10F6500040004000400000022000000000000000C8 +:10F66000000000020002000004000000400000044E +:10F67000400000000000000000000000000000004A +:10F68000100040008000800000000000000000002A +:10F6900002000000021008000000A00000000000AE +:10F6A00000000000000002092100212011002000BC +:10F6B0000000000002000200000001000000010044 +:10F6C0000000010002000300000000000000000034 +:10F6D000000000000000001000100000000000000A +:10F6E0000000000000000000041000000000000006 +:10F6F000000020002000201000100000000000008A +:10F700000000000000000000009020000000410008 +:10F710000000000000000400040800000400400095 +:10F720004004000000000000000090009001A000D4 +:10F73000800000000000000000080000040000003D +:10F740002000000804000000040800000000000081 +:10F75000000005000000000000000008000000009C +:10F760000000000000080000000020080000000069 +:10F7700000084000800080008000000800000000B9 +:10F78000000000000482000000000002000082006F +:10F7900040008200000000000000000000000000A7 +:10F7A00084000800000082000000C0000000C002C9 +:10F7B0000000C10000000000000000000000000088 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000008000000C000010003002C +:10F810000000000000000000088803000800080045 +:10F8200000000000000000080000000000080000C8 +:10F8300000000000200000000000000000000000A8 +:10F8400000000800000000000000000000000000B0 +:10F8500000000000000800000000000000000000A0 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000008000000400030 +:10F890000000A00000000880000008001000000028 +:10F8A000000082000800A000C00008000800080056 +:10F8B0000900002008000808080082008210820069 +:10F8C000840000000000820000000000000000042E +:10F8D0000000000008000000820008000000000096 +:10F8E0000000000000000000000000000000000018 +:10F8F00000000800100008000800000000000000E0 +:10F9000000048200080082000800000000000000DF +:10F9100000000000000000000002000000000000E5 +:10F9200020000000000000000000000000001000A7 +:10F930001020040000011100000100000000000080 +:10F9400000100000000000000000000000000000A7 +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F98000000000010000000000000000000008006E +:10F990002100000000000000000000000000000046 +:10F9A00010000000A000080000000000C0000000DF +:10F9B000820000000000000000200000000008009D +:10F9C0000800080082008400A000840000000000FD +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000200000008400080082000000C8 +:10FA100000000080A00000000000100000000000B6 +:10FA2000000000000000210241A02010080000009A +:10FA30000000050000880000000000010000000038 +:10FA400000000000000000000000000000000000B6 +:10FA50000000000000840000000000000000000022 +:10FA60000000000000000000000000000000000096 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000020000000000000000000064 +:10FAA0001000000000004000000000000000000006 +:10FAB000080040008200000000000000000000007C +:10FAC0000040081108091000400000000000080074 +:10FAD0000000000000000002000000000000000024 +:10FAE0000002000000000000000000000000000014 +:10FAF0000000000000000000000000000000000006 +:10FB00000000000000000200000008008241020026 +:10FB10001000A04000000080000000000000000075 +:10FB200000000000000000000000000000000000D5 +:10FB30000000000000000000000000840000090038 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB9000410000000000000000020500010000001C +:10FBA0000100000000000000000000000000000054 +:10FBB000000000000000000000000000110800909C +:10FBC0000000C000000000000000000000900004E1 +:10FBD00000400020400200A0008802200000000039 +:10FBE0000000000000000000000000000000000015 +:10FBF0000000000000000000000000000000000005 +:10FC000000000000000000000000010000000000F3 +:10FC10000000000000000210002088821008200070 +:10FC200000000800000000000000000000000000CC +:10FC30000000000000000000000000000000910033 +:10FC400000A1000080000000000000000000000093 +:10FC5000208000000000C0800000008080000000C4 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000000000400000070 +:10FC900000000000000000008000000085008000DF +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC000000580009140800000000000000000005E +:10FCD00003000000400005008000802180C00080FB +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000000400000021CE +:10FD100000000041000000050000900010900380EA +:10FD20004180000000000000000000000000000012 +:10FD300000000000000000000000000000000000C3 +:10FD40000000040004000500900000000000000016 +:10FD50000000000000000000000002008200A0027D +:10FD6000200400000000000000000000000000006F +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000000000000000073 +:10FD9000000000000000000000000000090008C191 +:10FDA000081089C0000100000001000100000000EF +:10FDB0000000000000000000000000000000000043 +:10FDC00000000000000240820088001000000000D7 +:10FDD00000000000C001000000010200C00400207B +:10FDE00000208382000000000000000000000000EE +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000000000000000F2 +:10FE1000C000000000000000000000000000898217 +:10FE20000088C09110880010000000100041000000 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000800000000940000000E9 +:10FE5000000000000000801000030021802080804E +:10FE60000000000002800000000000000000000010 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000002100090000000000000038 +:10FEA0004100000080210000000000000000000070 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000804011200000000041 +:10FED0000000000000000000000000000000000919 +:10FEE000000000880000000000000000000000008A +:10FEF0000000000000000000000000000000000002 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF2000000080848080800080400000000000008D +:10FF300000000000000000000000000000000000C1 +:10FF40000000000000000000000090010110008887 +:10FF50009000000000000000000000000000000011 +:10FF6000000040009082408240000000000000003D +:10FF70000000000000000000000000000000000081 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA000000000000288040808900800880000E0B3 +:10FFB0000000000000000000000000000000000041 +:10FFC000000000000000000000000000488143E045 +:10FFD0000722000A0000000000000000600600E0A8 +:10FFE0000700500000060000070088000000000025 +:10FFF0000000000000000000000000000000000001 +:020000040014E6 +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000020000000000000C0 +:10002000000000000000810000E0000048420000E5 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000003C3C38 +:10005000000001010101000000000000000000009C +:1000600000000000000083838282F0F000000000A6 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A00000000000000000000410082024000024CC +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0003C3C0000010101000000000000000000A5 +:1000E000000000000000000083838382F8FC000011 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:10012000000000000000000000000140028081008B +:10013000008100000000000000000000000000003E +:1001400000000000000000000000000000000000AF +:10015000000000FF0000000000B0000000000000F0 +:100160000000C3C3E3EB000000000F0FAAEBFFFF8A +:1001700041410000000000000000000000000000FD +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A00000000000000000000000000024008100AA +:1001B0000408102000000000000000000000000003 +:1001C000000000000000000000000000000000002F +:1001D0000000000000FF0000000000F00000000030 +:1001E00000000000C3C3C3C3000000000F0FEBEB0F +:1001F000FFFF000100000000000000000000000000 +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000024AA +:1002300000810102408000610007800C0000000086 +:1002400000000000000000000000000000000000AE +:100250000000000000000004002E800E20000000BE +:1002600000000000000000610036C00900008000AE +:10027000003000000000000000000000000000004E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A00000610007000D00000000000000000000D9 +:1002B00060600007800D100000000000C3FF003CDC +:1002C000000000000000000000000000000000002E +:1002D00000000000000000000000FF0000FF000020 +:1002E0000000000000000000000000000F0FFFFFF2 +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000AA00AA00000000C3FFA7 +:10034000003C000000000000000000000000000071 +:10035000000000000000000000000000FF0000FF9F +:10036000000000000000000000000000000000C3CA +:1003700000C30000000000000000000000000000BA +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000AA00AA00000000E9 +:1003C000000000000000000000000000000000002D +:1003D0000000000000000000000000000000FF001E +:1003E00000FF00000000000000000000000000000E +:1003F000AA2800000000000000000000000000002B +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000F00041D70000B4 +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000FF0000FF0000000000000000000000008E +:100470000000AA28000000000000000000000000AA +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B00000000000000000000000000000F041C348 +:1004C00021002000848088002000200004002000FB +:1004D000C00088002000200420000400C00040006C +:1004E0002000210000002000880088002004040073 +:1004F0002000200000004040200088002000000074 +:100500000003400020008800200020002040200040 +:1005100020008800200000002000200020000400AF +:1005200088048800000000000000000000000004B3 +:1005300000000080200000042000000000000000F7 +:100540000000080240004040100000000000400091 +:10055000090040000000000200000000000000024E +:1005600000000000840020000000000000020000E5 +:100570000002000200000000000240000000000035 +:100580000002000000024040004000400000000067 +:10059000400400040002000200000000000000000F +:1005A00020020000202000000002000000000000E7 +:1005B00000000002204000000002000200020000D3 +:1005C0000000000000000000000082100000820017 +:1005D0000000000001000000000084000000000096 +:1005E00000000400028002000000900000000000F3 +:1005F00000000000000000000000000000000000FB +:1006000002000000000000000000000000080200DE +:1006100004000400040000000000000000000200CC +:1006200002000200020000000000000002100000B2 +:1006300000000200020002000200020002000000AE +:1006400000000000000000000000000005000000A5 +:1006500009000000000840000000008409000400B8 +:100660000000000000000002000000000400000084 +:100670000400000000040000000000000000000072 +:10068000040000000000000000000000000000085E +:1006900084000000000000000000000000000000D6 +:1006A000000000080000000000000000000000083A +:1006B000000000000000000000000000000000003A +:1006C0000000004000000000100882000000000050 +:1006D0000000000008000000080088008200000000 +:1006E00000000080100000001000A00000050000C5 +:1006F00000000000000000000000000000000000FA +:10070000400000080000000000000000000004009D +:1007100004000000000000000000000000000000D5 +:1007200000000000000000000000000000000000C9 +:100730000000000000000000000010000000008029 +:100740000100100000000800000000000000000090 +:10075000000000000000080000000000000003008E +:1007600000000020000288000000000000000000DF +:100770000000080008A00000088200000300080034 +:100780000800000000000000000000000000000061 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000800000000008000410070 +:1007C0000004040083004100000003820000C00018 +:1007D0000800A04082001000C000100000000000CF +:1007E000A0000000100008000000820000000800C7 +:1007F00000000000000010000000000000000000E9 +:10080000C000000000000000100008000000080008 +:100810000000000000000020004000A0834008000D +:1008200000000000000000000000000000000000C8 +:100830000000080008000800000000000800000098 +:10084000000000000100000000000100080000009E +:100850000000000000000000000000000000000098 +:100860000000000000000300000000000000000085 +:1008700000000000000040000000400000000000F8 +:100880000000000000000000000000000000000068 +:1008900000000000000000002101000100410401EF +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000200000000002000000006 +:1008D00000000000000008000000000082900000FE +:1008E00000000000000000000080000082000800FE +:1008F0000000000000000000000000000000820076 +:1009000000000000000300000000000800000000DC +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000800AF +:1009400000000000000082200004000000000011F0 +:1009500000040000400000000882000000000011B8 +:100960000000000000000000000000020000000085 +:10097000000000000000000000080000000000006F +:100980002000000000000000080000000800000037 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000100010884080889 +:1009D000050821A100080000000000000000000040 +:1009E0008400000000000000000000000000820001 +:1009F00000000000400000000000000000000000B7 +:100A000000040000000000000000000000000000E2 +:100A100000000000000020000000000000000000B6 +:100A200001000000000000000000000000000000C5 +:100A300000000000000000000000000000000000B6 +:100A40000000000000000000010000008300000022 +:100A50000000000988000000000000000000000005 +:100A60000000000000000000000000000000000086 +:100A700000000000000080000000000000000000F6 +:100A80000000000200000000000000000000000064 +:100A90000000000000000000000000000000000056 +:100AA0000000040000000000000000000000000042 +:100AB0000000000000000000000000000000000036 +:100AC0000082000000000082008220000000100070 +:100AD0000000000000000000000000000000000016 +:100AE0009000000000002000000000000000000056 +:100AF000000100010001000188C10040080990893F +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B20000000000000900000000000000000000035 +:100B300000000000000000000000000000000000B5 +:100B40000000000000000000000001009000000014 +:100B50000000010000000000000000000000000094 +:100B60000000000000000000000000000003000082 +:100B700000000041000800080010809000832182DE +:100B80008082000000000000000000000000000063 +:100B90000000000000000000000000000000000055 +:100BA00000000000050000800000000000000000C0 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000001100A10073 +:100BD00000000000110021000000000000000010D3 +:100BE0000080000000000000000000000000000085 +:100BF0000000000000000000000000000000830072 +:100C00008811C10000050000000000000000000085 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C4000000000000000000000000000000000089C +:100C500009000010000000410900001000800000A1 +:100C60000001000200000000000000000000000081 +:100C70000000000000000004000000000000201040 +:100C800088000901C1000000000000000000000011 +:100C90000000000000000000000000000000000054 +:100CA000000000000000000000000008000000201C +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD000000101900001008800210100000100884E +:100CE0000000000000000000002000020020009032 +:100CF00000000000000000000000010001000000F2 +:100D000040880182900889C10000000000000000B6 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000004090F3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D500000008900A0880800000000008800000052 +:100D60000100000000000000000000000080000002 +:100D7000000000000000000000000000100004005F +:100D8000000080831083C08091C10000000000003B +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000002000000023 +:100DB00000800000000000000000000000000000B3 +:100DC0000000000000000000000000000000000023 +:100DD00000000000410000808000110000000000C1 +:100DE0000000410080000000000000000000000042 +:100DF0000000000000000000000000002140210071 +:100E000009000000410310C0410000000000000084 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000011B1 +:100E30008000000000000000000000000000000032 +:100E400000000000000000000000000000000000A2 +:100E500000000000000000110800008000000000F9 +:100E6000001100000000C000200008008800000001 +:100E70000000000000000000000000000000010071 +:100E800000000100000001880189008800000000C6 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000001200000880000000000000000000089 +:100EC0000000000000000000000000000000000022 +:100ED00000000000000000000001010000400000D0 +:100EE0000000000100000000000000000000000001 +:100EF00000000000000000000000000000000000F2 +:100F00000000000000000000500A00E007000000A0 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F30000000004184000785000000000000000060 +:100F400000000000000000000000000000000000A1 +:100F500000000000000000000000000000E00700AA +:100F60008200000000E0000081413C3C7E3C00002B +:100F700000000000000076666666000000000000C9 +:100F80000000000000000000000000000000663CBF +:100F9000FFF0000000000000000000000000000062 +:100FA0000000000000000000000000000000000041 +:100FB000000000000000FF000000FF000000000033 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000F0F00000000000000000F0F06600DB +:100FF0000000000000000000666666660000000059 +:1010000000000000000000000000000000000000E0 +:10101000663C00F00000000000000000000000003E +:1010200000000000000000000000000000000000C0 +:101030000000000000000000FF000000FF000000B2 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:1010600000000000F0F000000000000000000000A0 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:101110000FFF36363CFF0F660000000000000000A5 +:1011200000000000000000000000000000000000BF +:101130000000000000000000000000FF0000FFFFB2 +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:101160000000FFFF0000FFFF000000000000000083 +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000F036363C000F6600000000000042 +:1011A000000000000000000000000000000000003F +:1011B00000000000000000000000000000FF000030 +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000A000000000000000000000004F +:101200000000000000610006000D00000061000603 +:10121000000D00000040202D80400008000000006C +:1012200000000000000000000000000000000000BE +:101230000000000000000000000000000000151881 +:101240002A20054004A80000000000000000000063 +:10125000000000000000000000000000000000008E +:1012600000000000000005402A06054C00A80040D0 +:101270000006000C0000000000000000000000005C +:101280000000000000000000000000000000000A54 +:101290000000000000000F000505F3F328280000FF +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000FF00FFFF000001 +:1012F00000005555FFFF0000000000000000000046 +:1013000000000000000000000000000000000000DD +:10131000000A0000000000000F000505F3F3282874 +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000FF0000007E +:1013700000000000555500000000000000000000C3 +:101380000000000000000000000000FF00FF00005F +:10139000000000FFF0F0000000003C3C3C3CFFFF80 +:1013A00000F000000000000000000000000000004D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F000F0F0000000000000F0F00000000000002D +:1014000000000000000000000000000000FF00FFDE +:1014100000000000C3C3AAAA000000003C3C7C3CC2 +:101420000F0F00F0000000000000000000000000AE +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:101470000000F0F0000000000000F0F0000020008C +:101480008400200010000000000000000000C000E8 +:101490002000040020000000200020000000840044 +:1014A00020004000200400000000000000000000B8 +:1014B000200020008804000020000004000000013B +:1014C0002000200020042000000000000000000098 +:1014D0000000200020042004100020000000000470 +:1014E00020002000000000000000000000000000BC +:1014F0004000400020000404000020000000000024 +:101500004020400221004002400040402040210293 +:10151000040200024002000200400000000220001D +:101520000000000004000000400200004000000233 +:101530000000410200000002400040024000400064 +:101540000000400000000040000000000002000217 +:1015500000000000400040001000400000000002B9 +:101560000000000000000000200000004000000219 +:101570000000000200000002000040000000000027 +:10158000000000400040004000400040008000009B +:101590000280008000400080008000800080048085 +:1015A00002400080000000400040000000000200F7 +:1015B000000004000500000001020000000000100F +:1015C00082100000000000009000040000000400F1 +:1015D00000000410000000000000042100000000D2 +:1015E00000100210000000000000000000000000D9 +:1015F00000000041000000000000000000000000AA +:101600000010020000010001040905010001004072 +:101610000404004000400001004000400040004041 +:101620000940040900400400000903010000000013 +:10163000000002000500400004001001000000004E +:101640000000000800000000040000080000000086 +:101650000000000000000500000000000000000085 +:10166000000000000008000000000004000000006E +:101670000000000004000000000000000200000064 +:10168000000000000040000000001000000000000A +:1016900000000040001000000010000000000000EA +:1016A00000000000000084000000000000000000B6 +:1016B00000000000000000000000008000000000AA +:1016C0000000080000000000000000000000000012 +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:101700000000880088008400080000000300080032 +:10171000410000000001000000000000080000007F +:101720000300000000000000000000000000002096 +:1017300000000000000000000000000000020000A7 +:101740000000000000000000000003000000000096 +:101750000300000000000000000000000000000086 +:101760000000000000000000000000000000000079 +:101770000000000000000000000004000000030062 +:101780000000000000000000000000000000000059 +:101790000800088000008200000000000000000037 +:1017A0008200000500008200000002400080080066 +:1017B0000400000000000004000008000000000217 +:1017C00008000000000000000040000000000000D1 +:1017D0000000000000090000000000000000000000 +:1017E00000000000000000000000000000000000F9 +:1017F00008000000000000000000000000000800D9 +:10180000000000000800000000000000000800A028 +:1018100000000000000800000300001000000000AD +:101820000000000000000000000000000000004078 +:1018300000000000000000000000000003000000A5 +:101840002101000000000000000000000000000076 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000010000058 +:101880000000000000000000000000000000020056 +:1018900004000000004000040000000420000200DA +:1018A00000000000004000040000000420000000D0 +:1018B00000000000004000000000400000000000A8 +:1018C00040000000000000000000000000000000D8 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:101900000000000000000000000000000000A00037 +:101910008590000000000001000100000801C000E7 +:10192000880000000000000140010000090580045B +:1019300008001020009003050000000000000000D7 +:101940000000800000000000000000000000000017 +:101950000000000000000000000000000000000087 +:1019600000840000000000000000000000000000F3 +:1019700000000000000000000000008400000000E3 +:1019800000002100212000040084000021002184A7 +:1019900000000000020000400000000010000008ED +:1019A00000000000020000400000000010000008DD +:1019B0000000004000000040000000000000820025 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000200000000F5 +:1019F00000000000000000000000000088008800D7 +:101A000000000000000988009000080000000000AD +:101A100000000002000080000001000000008000C3 +:101A200000010000000080000001000000008000B4 +:101A300000010000000000000001000000000000A4 +:101A40000000000000000000210000000000000075 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A900000000000000000C000040000000010C1B1 +:101AA00000000000008800C000040000000010C119 +:101AB00000010000008800C00004000020000000B9 +:101AC0000000000000000000010082000000000093 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000080008000000000C5 +:101B2000C0C1002040000083008000800000000051 +:101B300089C1001040000083008000800000000088 +:101B40000000000000000000400008000500000048 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0008000098020000009C10000000000000042 +:101BB0008000098010000009C10000000000000042 +:101BC00080000000000000000000400020004000F5 +:101BD00008090000000000000000000000000000F4 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C20000000C000894000000001C1000000000069 +:101C30000000C000014001000001C10000000000E0 +:101C40000000C00000000000000000000182000051 +:101C50000000010100000000000000000000000082 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000010000000C000000000000000C10000A3 +:101CB0000010000000C000000001000001C1000091 +:101CC0000000000000C00000000000000000000153 +:101CD0000000000100000000000000000000000003 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D2000000000800000008000110520000900C1B3 +:101D3000000000800000008000110510000909C1AA +:101D40000000000000000080000000000000000013 +:101D50000010002000080003000000000000000048 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA00000008000800000800000C120A109000028 +:101DB00009038000800000800000C10983090080C1 +:101DC00020038000800000000000000000000000F0 +:101DD0000000418008082100080300000000000006 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000C000020000080000C100900196 +:101E300000000101C000020000080000C101910182 +:101E400000400001C000028400000000000000000B +:101E5000000000000102000101000001000000007C +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA00000000000000000000000000000008800AA +:101EB00000E00000000000000000000000008800BA +:101EC00000E0000000000000000000000000000032 +:101ED000000000000000880000E00000000000009A +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F20000000000000000000000000FF0000F0F0D2 +:101F3000000000FF0000AAAA000000FF0000F0F06F +:101F4000000000FF0000AAAA000000FF0000FFFF41 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA00000000000000000000000000000FF000032 +:101FB000F0F0000000FF0000AAAA000000FF0000EF +:101FC000F0F0000000FF0000AAAA000000FF0000DF +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:10202000000000000000000000000000FF000000B1 +:10203000FFFF00003C3C00003C3C0000FF000000B3 +:10204000FFFF00003C3C0000FFFF0000FF0000001D +:10205000AAAAFFFF0000000000000000000000002E +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000FF0031 +:1020B0000000000000003C3C00003C3C0000FF0031 +:1020C0000000000000003C3C000000000000FF0099 +:1020D0000000AAAAFFFF00000000000000000000AE +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:102130004082800000209202408280018020920232 +:102140004082800000209202408280018020920222 +:102150004082800000208202000000000000000099 +:1021600000410007800D000000000000000000009A +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B0000000000000000000000055003C0030302E +:1021C00000F0000000000000000014143C0030305B +:1021D00000F000000000000000000000000000000F +:1021E0000000BE280A0AC3C3FFFF00000000000071 +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:1022300000000000000000000000000055003C000D +:10224000303000F0000000000000000014143C00DA +:10225000303000F00000000000000000000000002E +:1022600000000000FF280505F3A3FFAF00000000F9 +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A000000000000000000000000000000000002E +:1022B00000000000000000000000000000003C00E2 +:1022C0005500A0A0303000000000000000003C00DD +:1022D0005500A0A030300000000000000000000009 +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:102340003C005500A0A0303000000000000000005C +:102350003C005500A0A0303000000000000000004C +:10236000000000000000000000000000FF00BF00AF +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B00000000000000000000000000020002000DD +:1023C0000000040020002000400020000000400029 +:1023D00010004000400020008800000000000000C5 +:1023E000001120002000000000000000000000009C +:1023F000040084800280208420840001000000000A +:102400000000000020008800000000000000000024 +:102410000000000088000000200200020000000010 +:102420000000100020000000000000040000000078 +:10243000000000000000000020020000400000003A +:10244000000000000902000000000400400000003D +:102450000000000000020400000200040000000070 +:1024600000000402400000002000000040001000B6 +:1024700010001090102000204020002000000000DC +:10248000000000000000000000000000000000024A +:102490000000000000000002000200000000000038 +:1024A00000000000000000000000000200004000EA +:1024B0000000000000000000000000080000000014 +:1024C000000004008200000002000400020020005E +:1024D0000000840002000000000000000000020074 +:1024E00002000000000000000000000000000000EA +:1024F00000000000000004000400030004000000CD +:1025000000000000000000008200820082008200C3 +:10251000000000000000084004002000000000004F +:10252000000000000000900000000000000000001B +:102530000000000002000210020000400000000045 +:10254000040000000000000002000400020000007F +:1025500000000000000000000000008800000000F3 +:102560000400000000004000040000000000000023 +:102570002000000000080010820084000400800099 +:102580000000000000000000000000000400000047 +:102590000000000000000008000000000000000033 +:1025A0000000000000000000090000000000000022 +:1025B000000000000000001000000000000000000B +:1025C0000000000410000000404100000000000076 +:1025D00000000000000000080008000000000000EB +:1025E00000000000000004000000000000000000E7 +:1025F00000000000000000000000100000000000CB +:1026000000000000000000000000000000000800C2 +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:102640000000000000004100000000000800000041 +:102650000000000000000000000000000800000072 +:10266000000008000000000000000000000003005F +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B00000000000000000000000000021000000F9 +:1026C000000000000000000000000000000000000A +:1026D00000000000080000000000000004000000EE +:1026E0000800000000000000000000008200000060 +:1026F00000000000080000000000080000000800C2 +:1027000008000000000000000000000000000000C1 +:10271000820000000000000000000000000008002F +:1027200000000000000008000000000000000000A1 +:102730000000080000000000000000000000000091 +:102740000000000000000000000000000000004049 +:102750000000030000000000000000004000000036 +:102760000000000000000000000010000000000059 +:1027700000000000000000000000008800000000D1 +:1027800040000000400003000000000000000000C6 +:102790000000000000000000000000000000000039 +:1027A0000000080010000000000000000000000011 +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000A00000000000C0000000000079 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:1028400000000000000000000000000003C00000C5 +:102850000000000000000000000000000000000078 +:102860000000000008000900000000000000000057 +:102870000800000000000000000000000000000050 +:102880000008081000000000000000000000000028 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C00000000000000008000300000000000000FD +:1028D0000040002100210000000000000000000076 +:1028E00000000000000000000000000000000000E8 +:1028F00008000000000000000000000000000000D0 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000820015 +:102940000000000000000000000000000000000087 +:10295000080000000000000000000000000000006F +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000300000000000000000044 +:102990000000000000000300000000000000000034 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B10000000000000800000000000000000000035 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000002000000002000000000000000013 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C1000000001000000C0000000000000000000F3 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C900000000000100000008000000000000000A4 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000704A7 +:102E20000042000000000000000000000000000060 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:1031200000000000000005180A00050004A00000CF +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000088008400C00020045D +:1033800088004103040000800000200000002000AD +:103390000000200084020000000000000000000087 +:1033A00001800300218001800000880040000104AA +:1033B00000000000000000000003100005002000D5 +:1033C00010040000000000040000000000002004C1 +:1033D00000000000000000000000000000000010DD +:1033E00000040000000000000004000000000004D1 +:1033F00000000000000000000000000000022000AB +:10340000000000000200000000100000400040002A +:10341000000020000020402000900000000000007C +:1034200000000440840004400440404000000000CC +:1034300010400000000000000004000080001000A8 +:10344000C0008000400000000000004000000000BC +:10345000000000000000400200900000400040001A +:1034600000010000400000000000000000004000DB +:103470000000000000004000000000000000080004 +:1034800000002000044000000200020000000200D2 +:10349000040004000000000004000200020002001A +:1034A00002000800000000000800080000004000C2 +:1034B000000008000000000002008202000001007D +:1034C000000004000800820000000800080000005E +:1034D00004000000000000000000000008000400DC +:1034E000000002000000020002000840000000008E +:1034F00000000000000000000000000004050000C3 +:10350000800000004084000000004100000000082E +:103510000500001041104000000000000082000083 +:103520000000000002000000000000000000008415 +:1035300004000000840200000000000000110000F0 +:103540002000090000000000000000000000000052 +:103550000000000000000000000000000000020069 +:10356000800000008000000800000000000000084B +:10357000000000000000000000000000000000004B +:1035800040000000100000000000000200000410D5 +:103590000000000000000008040000000000040813 +:1035A000040000000000000008000000840000008B +:1035B00000000000400000000400000000000000C7 +:1035C00000000009004000000000000000000000B2 +:1035D00000080000000000000000000000000000E3 +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000400000000000000C7 +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000800000000000000000000000000000001A +:103630000000000008000000000000000000000082 +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:103680000000000000001000000000090800000019 +:103690000000000000008200000000008200100016 +:1036A000000000000000820000000800000082000E +:1036B000840400200000A1000009840084000000B0 +:1036C000080000400000040020000000040000008A +:1036D00008000800A08000000000A000000000001A +:1036E0000000000082000020080000000000000030 +:1036F0000000000000000000820000000000000048 +:10370000000000000000080000000000030041006D +:1037100000000000080000000000000000000000A1 +:103720000000000000000000000000000000210078 +:103730000000040000000000400000002100000024 +:1037400000000800002000004000C1000000000050 +:103750000000410003000002030008000000030015 +:103760004100030000000000400080000800080045 +:10377000000800080008000000080008080000A079 +:103780000000000000000082080008100000002077 +:103790000000000000000021000000000000000008 +:1037A0000100000000000000080000000800000008 +:1037B0000000A000000000000000000000008800E1 +:1037C000000008008200000000000000000010005F +:1037D00082080000000000000000000082000000DD +:1037E000000000000000820000000000080000004F +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000200000000000000000000000000078 +:103830000000000000000000000000000000000088 +:103840000000000000000000210000000000000057 +:1038500080000000000000000000000000000000E8 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A00000000000000000000000000020000800F0 +:1038B00010000000100008000000020000000000DE +:1038C00000000800000082008200000000000000EC +:1038D0000000000020000000000082000000000046 +:1038E00000000000000000000000000000000800D0 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000000000000000000000B7 +:1039100000004002002000000000000000A00000A5 +:10392000000008000000000000000000000000008F +:103930000000000000001000000000400000000037 +:1039400000002004030000000000000000A00000B0 +:1039500000000000000080000000000000000000E7 +:103960000000000000000000000000000000000057 +:10397000000008000000000021000000000003001B +:10398000000000000000000800000000000000002F +:1039900001A00010004000400000000000000000F6 +:1039A00000000000000000000100200001000000F5 +:1039B000000000000000000000C000000020000225 +:1039C000000000000000000000000000880000006F +:1039D0000000000100000100000100000100900053 +:1039E00000000000000000000000000000000000D7 +:1039F000000000000088000000000000000000003F +:103A000000000000000000000000000000000000B6 +:103A1000000010800080008000000800000000000E +:103A20000000000000000000000010008000020004 +:103A30000000000000000000000000800000000006 +:103A400000800000000000000000000011000000E5 +:103A50000000000000410503020000020000080011 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A900000000000000000000000000000008000A6 +:103AA0000000800000000000000000000010000086 +:103AB0000000008000000000000000000000000383 +:103AC00080008000000080000000008800000000EE +:103AD0000000000000000080030000004100000022 +:103AE00000000000000000000000000000000000D6 +:103AF0000000000000000000002000800000000026 +:103B000000000000000000000000000000000000B5 +:103B10000000000000000000000000000000200085 +:103B200020001000C00000000000000000000001A4 +:103B30000000000000820000000000000000000003 +:103B400000000400C00020108200A000200400003B +:103B50000000000000000000000200000000010062 +:103B60000000000000000000000000000000000055 +:103B700000000000000000000000000000A00000A5 +:103B80000000000000000000000000000000000035 +:103B9000000000000000000088000000000002009B +:103BA0000000000000000000000000000000000015 +:103BB0000000000082000000000000000000000083 +:103BC00040900082002000C00000000000000000C3 +:103BD00000000000000100010000000001010000E1 +:103BE00000010000000000000001000000000000D3 +:103BF0000000000000000000000000020082000041 +:103C000002000000000000000000000000000000B2 +:103C100000000000000000000000000000000000A4 +:103C20008000000000000000000000000000000014 +:103C30000000000000000000000000000000000084 +:103C400000000000000000000080000000000000F4 +:103C5000000000200003000502040000000320080B +:103C6000000000410040000300410010000000007F +:103C700000000000000000000000000000800000C4 +:103C800000008000000000000000000000000000B4 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000008000000000000094 +:103CB00000000000000400410000000000000000BF +:103CC0000000000080050004000080004105210084 +:103CD0004000100000000000000000000000410251 +:103CE000000005002008000800000000000000009F +:103CF0000000000000000000000000000000800242 +:103D000080400000000000000000000000000000F3 +:103D1000000000000000000000000000000088001B +:103D20008800A000000000000090000200000000D9 +:103D30000000000000000001000000000000000082 +:103D4000000000000000C000202000200200010050 +:103D500000020090010000000000000000000000D0 +:103D600001890000000000010001000000000000C7 +:103D70000000000000000000000000000000000043 +:103D8000C001A000000000000000000000000000D2 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000008100E0070000009B +:103DC000000000000000000000810000070000006B +:103DD00000000000000000000000000000000000E3 +:103DE0000000810000E00000000000000000000072 +:103DF00000000000000000000000000000000000C3 +:103E0000000000810000070000000000000000002A +:103E100000000000000000000000000000000000A2 +:103E2000000000FFF0F000000000000000000000B3 +:103E30000000000000000000000000000000000082 +:103E400000000000000000000000FF003C003C00FB +:103E5000F000000000000000000000000000000072 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000303030300000000072 +:103E90000000000000000000000000000000000022 +:103EA0000000000000FFF0F0000000000000000033 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000003C00B6 +:103ED0003C00F000000000000000000000000000B6 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F0000000000000000AAAA00FF3030303000009E +:103F100000000000000000000000000000000000A1 +:103F2000000000000000000082820000000000008D +:103F300000003535FF050000000000000000000013 +:103F40000000000000000000000000000000F0F091 +:103F50003030AAAAAA00000000000F0F3C3C00006D +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000AA00AA0000000000DD +:103F90000000000000000000000000000000000021 +:103FA00000000000000000004068C2EA00000000BD +:103FB000000000003535050500000000000000008D +:103FC00000000000000000000000000000000000F1 +:103FD000000030300000AA00000000005555FF002E +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000AA00AA0000005C +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:10403000000000000000000000050000000000007B +:1040400000000061002F000D01A000000000000032 +:104050000000100020280040000800610006000D4C +:10406000000000610006000D0000000000000001DB +:104070008000000000610006000D0000000000004C +:1040800000000000000000000000000010000028F8 +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 +:1040D0000000000000000000000000003F3C0F5501 +:1040E0000000000000000000C8CBF8FB00005050AA +:1040F0003030C3C3C0C000000000C8F8CBFB0000D4 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:1041500000000000000000000000000000000F0050 +:104160000F550000000000000000080B383B000065 +:10417000505030300000C0C00000000008380B3B39 +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000055003C0F0F0A0A000000000000FC +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000055003C00000A0A0000000099 +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B0000000000020002000C08204000000040074 +:1042C0002000840384008800200088002000200053 +:1042D00040008800880020000000200000002080AE +:1042E0002000400840002000200020002000200086 +:1042F000200000000003200020000000200000003B +:10430000040000040004C0002000000020000000A1 +:1043100088000000000020002000C00020000000F5 +:10432000000000000000000000000000200000006D +:1043300020000000000440400000202080004000D9 +:1043400040000000000000002000000220004002A9 +:1043500000000002000020000000000000004000FB +:104360000002400000030002000000000004000002 +:10437000000000000040000000400040004000003D +:1043800000002000000000000040000200000000CB +:1043900000000000000200004000000000020000D9 +:1043A000000000000000004000000000004000028B +:1043B00000020000000000000000000000102000CB +:1043C00004000200A00000000400200000042040BF +:1043D00000000400040002000200020000000200CD +:1043E00000004000000000080040004000409040F5 +:1043F00004008400024084000000004000400040AF +:10440000084000400240024002400040004000409E +:104410000040004004400040004000000000000058 +:104420000210000000000000000002000200020074 +:10443000020000000000000000000008000005016C +:1044400040000000000000000482400080080009D5 +:1044500080000000000000000008000800000000CC +:1044600000000000800009000001040100050005B3 +:104470000401000000000009009000000009000194 +:104480000001008904010001000100010001000198 +:104490000001000100010001000900010008000006 +:1044A0000000000000000000000000080000000004 +:1044B00000000000000000000004000001000809E6 +:1044C00001000800000000000000000000000000E3 +:1044D00000000000000000000008000000000020B4 +:1044E00000000000C000000000000000000000000C +:1044F0000000000004000000000000400000000078 +:1045000000000000000000000000000000080000A3 +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000216A +:10453000000000210000004100410000004108008F +:104540008000040080000000000000001000000057 +:1045500000A00000000000000000000000000000BB +:104560000000080003080300000000000800080025 +:104570000000000000020000000000000001000038 +:1045800040000000000000000000000000000000EB +:104590000000000000000000000003000000000018 +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C0000400040082000411C01100000000080073 +:1045D0008280000000004000840010000800C0003D +:1045E0000000000000000000000082000000001138 +:1045F0004000900000090000004000400000002141 +:10460000000082A08200000000000040400008205E +:104610000000A08040000000A0000040404000409A +:1046200000400009000000000000000200100040EF +:10463000004008000000000000000000A000000092 +:104640000000800083000000020000000000000065 +:104650000000412011000300410003004100000060 +:10466000000000000000000000000000000000004A +:1046700000A0000000000000000000010301000095 +:104680000000000000080000400000004000400062 +:1046900000000000000803000800000000000800FF +:1046A0000000000000000000000000000000080002 +:1046B00000000000000000000000000000000000FA +:1046C000000000000000A0000000000008008200C0 +:1046D0000000000020000000822000000000000018 +:1046E00000000000000004000000000000000000C6 +:1046F0000000040010000000200000000200000084 +:104700000000000000000000000000042000020083 +:104710000000000000400804000000042000080021 +:1047200000000800C040000082000080100000006F +:104730000000000000000000000000000041000038 +:104740000000000000000000008800840800000055 +:1047500008000000000080000000000100000000D0 +:104760000000000008000000000000000000000041 +:1047700000000000090080000000C100000080006F +:104780000000000008A000000004000400058000F4 +:1047900080000920400400010001000000018000A9 +:1047A00000000000000000010000000000400000C8 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D00000020000002100000000000000000000B6 +:1047E00004200000000000000000000000000000A5 +:1047F00000000000000000000000000000000000B9 +:10480000000002000040000000000004100000084A +:104810000000100002000040080000001000000826 +:104820000000000000008240000040000000000086 +:10483000000000210000000000210011080000001D +:104840000000000008004000000000000000000020 +:104850000000000000000000000000000000000058 +:104860000000000000000000000021000000000027 +:1048700000000000000000000000400000000000F8 +:104880000000090080000001080000000001800015 +:104890000001000000008000000100000000800016 +:1048A0000001000000000000000100000000000006 +:1048B00000000000000000000000000000000000F8 +:1048C000000000200000000000000000404000A0A8 +:1048D000001082820000000000000000200290A072 +:1048E0000088000000000000000000000000000040 +:1048F00000000000000000000000000001C10001F5 +:104900000101000000C0000000000002000010C112 +:1049100000000100008800C000040000000010C179 +:1049200000000100008800C0000400008200200890 +:10493000008800882090022040020082821000003F +:104940000000000000000000000000000000808067 +:1049500000000000000000000000000000001180C6 +:104960008000400000000000000000000000000087 +:10497000000000000000000000000000000011C165 +:1049800000200209000000800000000000800000FC +:10499000C0C100050200008300800080000000000C +:1049A000C0C10005020000830080008000000000FC +:1049B00040000000000000008000000000800000B7 +:1049C00000000000000000000000000000000000E7 +:1049D0008000004100050000000000000000000011 +:1049E00000080010004100800000000000000000EE +:1049F0000000000000000000008000000000002017 +:104A00000280A0210900C180000000030000800096 +:104A10000000098040000009C10000000000000003 +:104A20008000098040000009C10000000000000073 +:104A30008000800000838080808080000091008062 +:104A400000800000000000000000000000000000E6 +:104A500000004000C00082828200000000000000D0 +:104A600000002001100090200090000000000000D5 +:104A70000000000000000000000000020000000034 +:104A80000001008883000000C188000000000000D1 +:104A9000C0000000894000000001C10000000000CB +:104AA0000000C000894000000001C1008200000039 +:104AB0000000C000080020C0044008C0080004C076 +:104AC000A002A0C0000000000000000000000000E4 +:104AD0000000000040020010828240400000000000 +:104AE000000000002090C088008811200000000015 +:104AF00000000000000000000000000000000000B6 +:104B00000000000040000190880001C00008000083 +:104B1000000000C0000000000000000000C1000014 +:104B20000010000000C000000000000000C10000F4 +:104B30000000000000C003880002C0044088910407 +:104B40000010C08810880000000000000000000075 +:104B50000000000000008080000000000000000055 +:104B60000000000000000000800000004100000084 +:104B70000000000000000000000000000000000035 +:104B80000000000000008000038080000980008099 +:104B9000000000000080000000110040410900C139 +:104BA000000000800000008000110040410900C1A9 +:104BB0000000000000000080410000808000000034 +:104BC00041800000800000000000000000000000A4 +:104BD0000000000000000000800000000000000055 +:104BE0000000000000000000800000400080000085 +:104BF00000000000000000000000000000000000B5 +:104C00004100000040002000410200090300400074 +:104C100080000000008000000000C140A1090000E9 +:104C200009038000800000800000C140A10900004D +:104C300009038000800000000000000000000080E8 +:104C40000000000000000000000000000000000064 +:104C500000000000000000000000080010104040AC +:104C600082000000000000000000080088880002A8 +:104C700040000000000000000000000000000000F4 +:104C8000000001000000000000000101000101001F +:104C90000100C0000000000800000000C1009001F9 +:104CA00000000101C000020000080000C1009001E6 +:104CB00000000101C00002000000000004008204A6 +:104CC00002021000100020042082040000000000F6 +:104CD00000000000000000000000000000000000D4 +:104CE000070400000000000000000000000000E0D9 +:104CF00007008241000000000000000000000000EA +:104D0000000000000000000000000000810000E042 +:104D1000000000000000000000000000000088000B +:104D200000E000000000000000000000000088001B +:104D300000E0000000000000000000000000000093 +:104D4000000000004842000000000000484200004F +:104D50000000000000000000000000000000000053 +:104D60000000100010100000000000000000667E2F +:104D7000003C2F242424000000000000000000005C +:104D80000000000000000000000000000000FFFF25 +:104D9000FFFFF0F00000FFFF00003C3C00000000BF +:104DA000FF00000066660000FF000000F0F0000059 +:104DB000FF00000066660000FF000000FFFF00002B +:104DC000A0050000A0050000204010802200110076 +:104DD00000000000000000000000000000000000D3 +:104DE0006E00000010001000000000000000000035 +:104DF000666600002F24242400000000000000004C +:104E000000000000000000000000000000000000A2 +:104E100000000000F0F00000000000003C3C00003A +:104E20000000FF00000066660000FF000000F0F0D8 +:104E30000000FF00000066660000FF0000000000A8 +:104E400000000000A0050000A005040208010022E7 +:104E50000011000000000000000000000000000041 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000000032 +:104E80000000000000000000000000000000000022 +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000000000000000000F2 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000F00000002000200000000AF +:104EF0000000000000FF09FF3C3D3C3D00000000B9 +:104F000000000000000000000000000000000000A1 +:104F1000000000000000FFFF00000F0F00003C3CFD +:104F20000000FFFF000000003C3C00003C3C000093 +:104F300000FF0000FFFF00003C3C00003C3C000084 +:104F400000FFFFFFC3C300008844000082140088F4 +:104F500000441020080400000000000000000000D1 +:104F60000000000000000008000000020202000033 +:104F7000000000000000000009090009000900000D +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000F0F0000F3 +:104FA0003C3C00000000000000003C3C00003C3C99 +:104FB000000000FF0000000000003C3C00003C3C02 +:104FC000000000FFFFFFC3C38844000082140000FC +:104FD0008800440080400102000000000000000042 +:104FE00000000000000000000018000000000400A5 +:104FF00000000000000000000061000F000D000034 +:1050000000000000000000000000000000000000A0 +:1050100000610006000D0000400280018025920220 +:1050200040828000002092020000408280018020A7 +:105030009202408280000020920240828001802003 +:105040009202408280000020820260000000000086 +:105050001000000000000000080000000000000038 +:105060000000000000000000000000000000000040 +:105070000000000000000000000000000000000030 +:105080000000000000000000000000000000000020 +:105090000000AAAAAAAA0000000014140C0C000028 +:1050A00000000000000000000000000055003C006F +:1050B000303000F0000000000000000055003C000F +:1050C000303000F000000000000000000000000090 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:105110000000000028280A0A0000000014140C0CEB +:10512000000000000000000000000000000055002A +:105130003C00303000F0000000000000000055008E +:105140003C00303000F000000000000000000000D3 +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F +:10517000000000000000000000000000000000002F +:10518000000000000000000000000000000000001F +:1051900000000000000000000000000000000F0000 +:1051A0005500303000F0000000000000000000005A +:1051B0003C3CFF00A0A030300000000000000000D8 +:1051C0003C3CFF00A0A030300000000000000000C8 +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:105220000F005500303000F00000000000000000CA +:10523000000000000000A0A03030000000000000CE +:10524000000000000000A0A03030000000000000BE +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:1052700000004020084120008882C00084002000F7 +:105280008800880020002000040220002000040084 +:105290002000400040008800040020002000200082 +:1052A000200020002000200020000000200020001E +:1052B00020000003000084002000200820002000BF +:1052C000200088020100010400800082000020000C +:1052D000840420000000200000020000C000200024 +:1052E000000000004000000000000002000000007C +:1052F00000000004004090024040004020004000B8 +:10530000400000040002009040040040090000003A +:105310000002000020002090400000024002000037 +:1053200000000040000000024000004041000090EA +:10533000000000000000410000000000000000002C +:105340004002000200002000200000080008400089 +:10535000000000020000000010000000000000003B +:1053600010000040000209020002000200000000DC +:10537000000000000000000000000000020000002B +:10538000000000000200000000000000000000001B +:1053900084000221020000000400002004008800B4 +:1053A00000000200821000000200820000000000E5 +:1053B00000000000020000000000040002000400E1 +:1053C00000000000000000000000000000000200DB +:1053D000000000000800004002410200020000003E +:1053E0000000000000000400004005000000020072 +:1053F000000000000000020000840900000080009E +:10540000000004000000000000080000000000840C +:105410000008000800000908050089000001890053 +:10542000040000000000000002080000000004006A +:10543000000800080000008200000000000040009A +:105440000000000000000000000000040000000058 +:1054500000000002000400000002800080008000C4 +:1054600000040000000000000000000182000000B5 +:10547000800000000000000000004000000000006C +:105480000004C00000000000000000400000000018 +:1054900000000000000000000000040000000009FF +:1054A00000110000000000000000000000004000AB +:1054B0008400000000000000000000000000000068 +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000200000000000AC +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:1055000000000000030000404100210021000000D5 +:105510000000004000820000000000820000000047 +:10552000000000002100000000000000000000005A +:105530000000000000000000000000080000000063 +:105540000000000000000300000000000000000058 +:1055500000000000000041002100080003002100BD +:10556000000008000800000000000000001000100B +:105570000008001000101100080003000000820065 +:10558000000082000000C00008000000A000000031 +:10559000A000820008004000000008000000000099 +:1055A00000000800080900000000000400000000DE +:1055B000000082000000080000000000A0000000C1 +:1055C0000000080082000000100000000000C00081 +:1055D00008000000080008000000000000000000B3 +:1055E00020200020002000800000000008000000B3 +:1055F000A02000000080010000000000000000006A +:10560000000000000000200003000000000008006F +:10561000000000000000000000000000000000008A +:1056200000002100210021C0000000000000000057 +:10563000000000000000000000000000100000005A +:105640000000000000000000020000000000000058 +:1056500008000000000021000000000040000000E1 +:105660001000000100010001002000000000000007 +:105670000000000100000020040000000000000005 +:105680000000000008000000C00000000000000052 +:105690000000000000000000080000000000C00042 +:1056A000820000000004200900110000000000003A +:1056B00000040000000000000000000000000000E6 +:1056C00000000000080000000000000000000000D2 +:1056D00000000000000008000000000000000000C2 +:1056E000000090000000000000000000000000002A +:1056F00000000000000000000000000000000000AA +:1057000000000000000000000020000000C00000B9 +:10571000000000000000210000A008A00000000020 +:1057200000000000000000018000000000000000F8 +:1057300003000000000000000000000000C00000A6 +:10574000000000000000000000000000000040C059 +:105750000000000000000000000000000000000049 +:10576000000000000000000800080508000800080C +:105770000000000008080000000000000000000019 +:105780000000000000000000000000000800100001 +:105790008200000000000000000000000000000087 +:1057A0004000400040000400000000000000000035 +:1057B0000000000000000000000000008200000067 +:1057C00000000000000000000000000000000000D9 +:1057D0000000000040000000040004000000000081 +:1057E000A000000000000000000000000000018098 +:1057F00008000000000000000000000001000000A0 +:105800000000000008000800000000000000000088 +:105810000000000000004000000000000000000048 +:1058200000000300000000008000002000000000D5 +:105830000000000000000000000000000000110057 +:10584000000000001100208800000000000000009F +:105850000000000000400000020000020000000004 +:105860000000000000000000000000040000000034 +:1058700004400000000000000000000000000200E2 +:105880000000000000000000000000C00002000056 +:1058900000100000000000000000000000000000F8 +:1058A00000000000000000000000010020000001D6 +:1058B00000010000000000000000000000000000E7 +:1058C00000000000000000000000000000000000D8 +:1058D00000000000000000000000000000010001C6 +:1058E0000000000000000000000000000100009027 +:1058F0000000000000000000000000000000009018 +:105900000000000000000000000000000080008097 +:105910000000000000000000000000000000000087 +:105920000000000000000000000011001120911193 +:10593000050800200000000000000000000000003A +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000004106 +:1059600000020540000000000000000000000400EC +:105970000080000000000000000000000000400067 +:105980000080000000000000000000000000000097 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000002000D7 +:1059B00011800300088000000000000000000000CB +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A300000200084000001C0000000000000000001 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000002000000000000000000000000016 +:105A70000000000000820000004000000000000064 +:105A80000000000000820000002000000000000074 +:105A90000000C0000000000008000000000000003E +:105AA00000000000000000000000000000000000F6 +:105AB00000000100000020010100000000000000C3 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000004090000000000000D6 +:105B000000000000010000002090000000000000E4 +:105B10000000000080000000000003000000000002 +:105B20000000000000000000000000000000000075 +:105B30000000000041200040C108110503000000E2 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B600000000000000000004000000000000000F5 +:105B70000000000000004000000000800000000065 +:105B80000000000000004000000000800000000055 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB0000000000000001182050208004000000003 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE0000000000000000000410202000000400030 +:105BF0000000000000000000001180800000000094 +:105C00000000000000000000001180000000000003 +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C3000000000000000000000030001010000005F +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000001010100000031 +:105C70000000000000000000000000012002000001 +:105C8000000000000000000000000001200000886B +:105C90000000000000000000000000000000000004 +:105CA0008400000000000000000000000000000070 +:105CB00000000000000000000000000000E00700FD +:105CC0008221000000000000000000000000000031 +:105CD00000000000000000000000000000000000C4 +:105CE000000000000000000000000000810000E053 +:105CF00000000000000000000000000000418400DF +:105D00000781000000000000000000000041840046 +:105D100007810000000000000000000000000000FB +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D7000000000000000000000000000000000FF24 +:105D8000000000FF0000000000000000000000FF15 +:105D9000000000FF00000000000000000000000004 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E000000FF000000FF0000000000000000000094 +:105E100000FF000000FF0000000000000000000084 +:105E2000555555550000000000000000000000001E +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E800000000000FF000000555500000000000069 +:105E900000000000FF000000FFFF00000000000005 +:105EA00000007D7DFF5500000000000000000000A4 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F0000000000000000FF000000555500000000E8 +:105F1000000000000000FF00000000000000000082 +:105F20000000000000005000000000000000000021 +:105F30000000000000000000000000000000000061 +:105F40000000000005610A09050100A00000000032 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F700000000000000000010001800D0000000092 +:105F800000000000000015182A20054005A80000A8 +:105F900000000000000015182A20054005A8000098 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC000000000000000FF1010103000FFFF000074 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF0000000000000000000003C00550000000010 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:106040000000000000000000FF10101030003000C1 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:1060700000000000000000000000003C005500008F +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000000000FCF03C00F0FCBC +:1060D000F0F00000000000000000000000000000E0 +:1060E00000000000000000000000000000000000B0 +:1060F0000000000000000000000000000055000F3C +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:106140000000000000000000000000003C003C00D7 +:10615000003C000000000000000000000000000003 +:10616000000000000000000000000000000000002F +:1061700000000000000000000000000000000055CA +:10618000000F000000000000000000000000000000 +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:1062300020004000000088000400000000008800EA +:1062400000004000408000001000400001000000FD +:1062500020002000C0002000200000000000880076 +:10626000018021802180018000002000040088003E +:106270000003040001040004040200000000000008 +:10628000200000000000000000000080008000846A +:1062900000840000000000802000000000000000DA +:1062A00000000000000000000000000000004000AE +:1062B0000000100000000000000040040400400046 +:1062C00000000000000000400000C002000040028A +:1062D00040000400009000000002000000000000E8 +:1062E00000000220022004400440400000000000A2 +:1062F000000000000000100100000001000000008C +:106300000000000040020000000005000020002006 +:1063100000200020400000000040100000000000AD +:10632000000200000000000000000000000000006B +:106330000004000000000000020082408200000013 +:106340000000840000000000000002001100200096 +:106350000100080002000200880088000000000020 +:106360008400840002200220044005400000000058 +:10637000020002000000A000A100A000A100000097 +:10638000020000008500000000000000084004201A +:1063900001000400010000000400000004400000AF +:1063A000000090000004008000800280008008004F +:1063B00000000000000000000000000008000002D3 +:1063C00000000200008405000000000000009000B2 +:1063D0000000400000080000000000000000000075 +:1063E000050000000500800180018911A00102C0A4 +:1063F00002C00000008400000310101000104010C4 +:106400000010001003100810000000000000000041 +:106410008000040080000400000080000000800173 +:106420000000000000000009000400040004000453 +:10643000000000000000000000000000000000005C +:10644000000000200000000000000000000000002C +:1064500000000000000000110021002100100003D6 +:106460000021000000210021001000100000001099 +:106470000010001000100010000020212021202119 +:106480002080000000000400040800080008000844 +:1064900000080000000000000000C0000000000034 +:1064A0000000000000090000004000050005000594 +:1064B000004000000000000000401000000000004C +:1064C00000000000000000020000000000000000CA +:1064D00000000200000000000000000000000000BA +:1064E00000000000000000000400040000000000A4 +:1064F0000000080000000000000000008000800094 +:10650000800080040800000000000000000000007F +:106510000000000000000000210000000800000052 +:10652000004000000000000003000801000000001F +:1065300000000001000000000000000182000800CF +:1065400000000802C000C0400009004040400000B8 +:106550000400040000000800000004000000000027 +:106560008800000000000000000008042000000473 +:1065700020040000001100000009000400000800D1 +:106580000000080008000004A000000900008200CC +:106590008800820082000004000408040004011145 +:1065A000001103090040000400040004010420005D +:1065B0000009000000400000000000000002000090 +:1065C00000000010000000000000000000000000BB +:1065D00000000200000000000000000000000010A9 +:1065E00000100300001000080008400800008000B0 +:1065F0000001000100000000118800000000000000 +:106600000000100000000000000000000900004031 +:1066100000000000000000000040004000000000FA +:10662000080000008200000020044100050002A0D4 +:106630008008000000000000004000000000000092 +:10664000000082000800000082000000080008002E +:1066500008000000080808000008000800000041C9 +:1066600082080005000082210000000020100008C0 +:10667000000000000000000000000000A000000575 +:10668000000000000000000000000000000000000A +:1066900000000000080000000040000008000000AA +:1066A000000000004000080004400005C040001148 +:1066B0000204000000002000200000000040000054 +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E000000000000000000000900000000080009A +:1066F0000500000000000000000000000000000095 +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 +:10672000000000C000008000800080010000000127 +:1067300000008001009000008000808400000001C3 +:106740000000000000000000000000000000080041 +:10675000820010001000080000008200000300000A +:10676000000000008203000800080008200020212B +:106770004000200000000000900000000000000029 +:1067800000000000000000000800000000210000E0 +:106790000000000000000000000008000000C00031 +:1067A0008200400008000003042002000220204074 +:1067B000C0050040024000C020C0010001000040B0 +:1067C0000040004000020000000000000000000047 +:1067D00000000000000000000000000000000000B9 +:1067E0000000000000000000000000000000800029 +:1067F0008000000080000000000011040000000084 +:106800000000000000000000000000000000000088 +:106810000040000002000000000000000000000036 +:10682000000000A000000000000080018000800146 +:1068300000050000000180010041804102000200CB +:106840000001000100010000000000000000000045 +:1068500000000000000000001040000200100204D0 +:1068600040A0084000088210000000000000000066 +:106870000001010101000000000002020000000010 +:106880000000000000000000000000000000010007 +:1068900000000000000000000000000000000000F8 +:1068A0000000000000000000000009C0009040A0AF +:1068B000200800C000048800040000C0000120007F +:1068C000000000C000040000000000000000000004 +:1068D00000000000000000000000800000800000B8 +:1068E00080800000800000808080000000000000A8 +:1068F00000000010031002200020000080000500AE +:10690000000000000000000000000000000008007F +:106910000200000000000000000000000000000075 +:10692000000000000000000000000000849000054E +:1069300000A0008500800380850080000080051095 +:1069400040090005008000800000000000000000F9 +:10695000000000000000000000000000800000C0F7 +:1069600000800080A00041A00888C18000000000D5 +:106970000000000010002000030020080005800235 +:106980000003000000000000000000000000000400 +:106990000000002000000000800000000000000057 +:1069A0000000000000000000008000000080408027 +:1069B000022182004021000000000000800003004E +:1069C0001000200080410000000000008000000056 +:1069D00000000000000000000000000000000800AF +:1069E00002C0900220C0080010C0210203C00000B5 +:1069F0000000000000000190000000000091000075 +:106A00001088000100880000000000000000000065 +:106A10000001000000000000100010009000820043 +:106A20000000000000000000000000080000000856 +:106A300002049000A0000001000000000000C0005F +:106A4000000201000000C001000000000000C000C2 +:106A50000000000000000000000000000000000036 +:106A600011200010C010028205020010C01008049E +:106A70000000000000000000000100000000000015 +:106A800000000400100200000000000000000000F0 +:106A900000000000080100010101000000000000EA +:106AA00000000000000000000000000000004000A6 +:106AB000000008840020000910020000000000010E +:106AC00001C188000089000000C000020000000031 +:106AD00000C00000000000000000000000000000F6 +:106AE0000000C100008080800000C1800080800024 +:106AF0008080000000000000000000100040030340 +:106B000000201000800000000500000000000000D0 +:106B100000000000004000100010034100000000D1 +:106B2000000000000000000000000000090000005C +:106B3000800000008020091102A180820020000056 +:106B4000000509900000051020110085008000005C +:106B500000000080000000000000000000000000B5 +:106B600000000000000080000080000000008000A5 +:106B70000000001000000000000000000580000080 +:106B800020000800000000000000000000000000DD +:106B900000000000000000000040000000000000B5 +:106BA00000000000000000000000000000000011D4 +:106BB000000000000000A1401008918002000004C5 +:106BC00000800000800090852005030000418000C7 +:106BD0000080000000000000000000000000000035 +:106BE0000000000000001000040202041000020077 +:106BF00004100290020100000000000000000004E8 +:106C00000000000001000000000000000000000083 +:106C10000000000000000000000000000000000074 +:106C2000000000A000C00000000000000000000004 +:106C30000000000000000000C100820904100100F3 +:106C40000001000200009000C108000001888801D6 +:106C5000C000000200004000000000000000000032 +:106C6000000000000000000000000000000048429A +:106C7000000000000000484200000000000000008A +:106C8000000000E000000000000000E0070000003D +:106C900000000000000000000000600000E00000B4 +:106CA00000000000000000000000000000000000E4 +:106CB0000000000000000700000000810000070045 +:106CC0000000810000E000000000810000E0000002 +:106CD00000060000000000000000000000000000AE +:106CE0000000000000000000000020401080220092 +:106CF0001100A00000A022000022000000000000FF +:106D0000000000000000000000000000FFFF000085 +:106D1000FF00000000000000000000000000000074 +:106D20000000000000000000000000000000000063 +:106D3000000000000000000000000000000000F063 +:106D4000400200003C3C3C3CFFFF00003C3C00009B +:106D5000F0F000003C3C00003C3C00000000000063 +:106D60000000000000000000000000000402080114 +:106D700000220011050000051100001100000000B4 +:106D80000000000000000000000000000000000003 +:106D90000000FF00000000000000000000000000F4 +:106DA00000000000000000000000000000000000E3 +:106DB0000000000000000000000000000000F0F0F3 +:106DC000F0F0800100003C3C3C3C000000003C3CFA +:106DD0000000F0F000003C3C00003C3C00000000E3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E70001008200410200804100820041020080422 +:106E80000000000000000000000000000000000002 +:106E900000FF00000F0F00000000000000000000D5 +:106EA00000000000000000000000000000003CBFE7 +:106EB000001C0000000000000000000000000000B6 +:106EC000000000FA00380F0A0F0A000000FF00005F +:106ED00066660000FFFF0000FFFF000000FFFFFFED +:106EE0009999000000000000000000000000000070 +:106EF0000000800140028040010280014002804089 +:106F0000010200000000000000000000000000007E +:106F1000000000FF00000F0F000000000000000054 +:106F20000000000000000000000000000000000061 +:106F3000BFFF1C3C0000000000000000000000003B +:106F4000000000000000003800000000000000FF0A +:106F5000000066660000000000000000000000FF66 +:106F6000FFFF9999000000000000000000000000F1 +:106F7000000000006000000000001000006100063A +:106F8000000D08000000000000000000006100018A +:106F90000001000015612A07154D00A8000000003F +:106FA00000000000000000610007800D00000000EC +:106FB00000000000000000000000000000000500CC +:106FC0000A00150000A0A061202E000D0000406303 +:106FD00080078029920240E3800180219202408252 +:106FE000800000208202000000000000000000007D +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000FFFF82 +:10701000080800FFC0FF00000000000000000000A2 +:1070200000000000000000000000000000FF00FF62 +:107030000000000000000000000000000000000050 +:1070400000000000000000004488000000810024CF +:1070500000000000002828005055000000A000504B +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:10709000080808080000C0C0000000000000000050 +:1070A00000000000000000000000000000003CFFA5 +:1070B000F0FF0000000000000000000000000000E1 +:1070C000000000000000000000000000000000813F +:1070D000002400000000282828285550000000F057 +:1070E00000F00000000000000000000000000000B0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000BEAAFAAA00000000000073 +:1071100000000F0F3F0FF0F0F0F300000000000040 +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:107140000000000000000000000000000408102003 +:107150003300003300000000000000000B000B00B3 +:10716000E0D0E0D0000000000000000000000000BF +:10717000000000000000000000000000000000000F +:107180000000000000000000BEAAFAAA00000000F3 +:107190000000000000003C00000000C300000000F0 +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000102BC +:1071D00040803300003300000000000000000E007B +:1071E0000E00000000000000000000000000000091 +:1071F000880204008800024020040480201020003F +:10720000200000002080400004020000008289026B +:10721000200002088204200000001000200020004E +:10722000200084000480400020000000880000034B +:10723000000000000000000005000400040004003D +:1072400000000000000000000000008000000000BE +:10725000010500020000000084002010200420002E +:10726000000000000000000400000000000000001A +:1072700000000004210000049001800000100001C3 +:107280004000040040000004100000000002000460 +:10729000400000004001000010000000200000003D +:1072A000000000000900000404004000000000008D +:1072B000000000000000000000008400800080004A +:1072C000A000000000000000000000000008000016 +:1072D000210010000000000000000000000100007C +:1072E000000000000000009000000000000000000E +:1072F0000000000002000000020000000100080081 +:107300000200000000400210000000000000020027 +:1073100000100000000000002040000000000200FB +:10732000000801000220020402200000000000000A +:1073300000000000A0000000A0009000001000006D +:10734000014008C000001000840010000000000090 +:10735000000003000800000000000000020002809E +:107360000040018001800180018001800000000058 +:107370000000020000000000000004000284100071 +:1073800020840400000000840000020000000000CF +:10739000050009000200000000000000410020007C +:1073A0000000000008000000C10141844104000009 +:1073B00009040004000000000504000002000001B0 +:1073C000000808000010000002080000000800008B +:1073D000090000004000030003000000000000005E +:1073E0000010000004200404040404040404000049 +:1073F0000000000000000400000000000000400346 +:107400000000000000000000000004000008000868 +:1074100000210008000000000008840000000000B7 +:107420000008000000000400000020000000000030 +:107430000000040000000000000000000000000543 +:107440000400000000000000000800000008000028 +:10745000000000000000000000000000010000002B +:1074600000000000000000000040000000000000DC +:1074700000200000000000000000000000000000EC +:10748000080000000000410041002100032000002E +:1074900000C000C0100000C000C003C003C0040052 +:1074A000000000000000000000000000800000005C +:1074B00000840000218400000000000000000000A3 +:1074C000000000000000000000900000000000002C +:1074D0000000050008000500030003000000040090 +:1074E00000C0000000840500000000000000000053 +:1074F00000000000000000000000A0000800C00024 +:107500000000A1040000010811008200C000080072 +:1075100000008400000000000000000000000800DF +:1075200000000000000040040440100000000000C3 +:107530000800000000008240004000000020080019 +:1075400000000820080041000800C0000841084170 +:10755000082008008200000088000000820004006B +:1075600083040400094100000100008000040000C1 +:10757000000000000000000000000000000000000B +:1075800008000000100100002041A00000000000E1 +:107590000000008400000000000002000000020063 +:1075A00000000000000000000000002000000000BB +:1075B0000000000021002100000000000000210068 +:1075C00040000040000000000800410005000000ED +:1075D000080000000000000000004100000002C0A0 +:1075E000830020008000200000000800004000C050 +:1075F0000000000000000000001000000000080073 +:107600000000000000000000400008000000000032 +:107610001000000000080000A00000004000000072 +:107620000000C00008008200000000000000000010 +:10763000000000000000000000000000000000004A +:1076400008000000000082000000000000000000B0 +:107650000000000000008200080000008200080016 +:1076600010000000200000000000020084800000E4 +:1076700000C00080008000800000000000000000CA +:1076800000000000000000000000000000000000FA +:1076900000000300000000000000000008040000DB +:1076A00000000000000010000590000041001004E0 +:1076B00000000008000000080000000000000000BA +:1076C0000000030004000000000000002000000093 +:1076D00000000000000000000000000000000000AA +:1076E000000083000000808400000000000005020C +:1076F0000000030400040004000400000000000077 +:1077000000008200000000000000000008000000EF +:107710000000000010210000000500000000000231 +:10772000000800000000000000000000C000000091 +:107730000000040004001000000008000000000029 +:1077400000000000A02100000021820000000000D5 +:107750000000000800008200000000000000A000FF +:10776000C00000000400A00084000000A000000091 +:10777000408200800000000900000000820000003C +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000800000000000000E1 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000080000000200AF +:1077D0000988000000000010000000000000000008 +:1077E00000000000000080C0000002000000000255 +:1077F00000000040412000000000000000000000E8 +:1078000000000000000000000000000000008900EF +:107810000000000000000000000000000000000068 +:107820000000010000000001000100000001000054 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:10785000C040008200202020000000000000000046 +:1078600000000000880000009190002001009002BC +:10787000A1C1A02000909090000002010001000131 +:1078800000000000000000000000000000000000F8 +:10789000910000210000000000000000090000002D +:1078A0004000000002000000004100100020001015 +:1078B0000000000000000000000000004000000088 +:1078C00000000000000000000000000000000000B8 +:1078D00000008080000000000000000000000000A8 +:1078E0000000000040000000000010000000080040 +:1078F0000080A191808040008080004083200503AB +:107900000002000000000000000000000000000075 +:1079100000000020000091408000000000000000F6 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000005002022 +:107940000000000000000000000000000000000037 +:107950000000000000000010004080000000000057 +:107960000000000000000000000000000000C1084E +:10797000059141804080210510C091204000020007 +:107980004000024100000000000000000000000074 +:107990000000000002000200A1000800000000003A +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000000C7 +:1079C00000040000000000000000000000000000B3 +:1079D0000000000000009000900140400400000002 +:1079E0000000000000000000000000000000900007 +:1079F0000201014191A000A000000105910000409A +:107A000001400100014100000000000000000000F2 +:107A100000000000000000004002100100C0000053 +:107A20000000000000000000000000000000000056 +:107A30000000010000000000000000000000000045 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000C04000204020080896 +:107A60000000000000000000000000000001000114 +:107A7000020200020000904000400040C0908800D8 +:107A80000000010182010001000000000000000070 +:107A9000000000000000000000000000000840801E +:107AA00000000000000003000000000000000300D0 +:107AB00000000300080000000000000000000000BB +:107AC0000000000000002000000000000000000096 +:107AD00000000000000000000000808000000000A6 +:107AE0000000000000000000000000100020000561 +:107AF000204180820085002000000000008080007E +:107B000000000540020200400002000000000000EA +:107B100000000000000000000000000511800000CF +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B40000000800000008000000000000000000035 +:107B500000000000000000000000000080000000A5 +:107B60000000800000000000000000000000000095 +:107B700000000000808400408000000083828008B4 +:107B80008300880803820240000002000000000019 +:107B900000000000000000000000000000000108DC +:107BA00000020000000000000000000000000000D3 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000C00008000200C000000000002B +:107BD00000000000000000000000000000000400A1 +:107BE0002020202004000000000000000000000011 +:107BF0000000000000000288009004202000C0C0A7 +:107C0000100140000301000301000000010000001A +:107C1000000000000000000000000000000084815F +:107C200043E007220000000000E0000000008800A0 +:107C300000E0000000000000000000000000000064 +:107C4000000000000000500000E000000000000004 +:107C50000000000000000000000000000000000024 +:107C600000000000070060000000000000000000AD +:107C70000000000000000000810000E0070000009C +:107C8000821100E007008211810000E00700000A75 +:107C900000000000000000000000000000000000E4 +:107CA000000000005A5A5050000000000000000080 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000003CBEBCBC0000000042 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000030000000000000000064 +:107CF000000000000000000000001414F4F45050D4 +:107D00007C7C5028F03C00F000F0000000000000F7 +:107D10000000000000000000000000000000000063 +:107D20000000000000005A5A5050000000000000FF +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000AAA0A0000049 +:107D50000000000000000000000000000000000023 +:107D600000000000000000AE00B0000000000000B5 +:107D70000000000000000000000000000000F0F023 +:107D800000003C3C0000F03C0028002800000000FF +:107D900000000000000000000000000000000000E3 +:107DA0000000000000000000FF00FF0000000000D5 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000000000000000000B3 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000A00020010001000000067 +:107DF0000000000000000000000000000000FF0084 +:107E0000FF144F4F0F0F0B0004000000FFFF000096 +:107E10000000000000000000000000000000000062 +:107E200000000000000000000000FF00DF00000074 +:107E30000000000000000000000000000000000042 +:107E40000000000000000000000000000000000032 +:107E50000000000000000000000000000000000022 +:107E600000000000000000000A00000010101000D8 +:107E70000000000000000000000000000000000002 +:107E800000001414414100000B0004000000FFFF3B +:107E900000000000000000000000000000000000E2 +:107EA000000000000000000000040026804E2000BA +:107EB00000610007000D000000610007800D200038 +:107EC00000610006000D000000000000000000003E +:107ED000A0610007800D000000000000000000000D +:107EE000000000000000000000000018000000007A +:107EF0000500000000000000000000610006000D09 +:107F000000000060000F80050000A061502B800D74 +:107F1000000005610A09850100A0000000000000C2 +:107F2000000000000000000000000000FF0000FF53 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F8000AABEF0FC00000000C030C0303C3C3C3CCD +:107F90000000000041551455003C000C000000009A +:107FA0000000000000000000000000000000FF00D2 +:107FB00000FF0000000000000000000000000000C2 +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:108000000000003C003C00000000C030C030040410 +:1080100000000000000000000000000C003C000018 +:108020000000000000000000000000000000000050 +:10803000FF0000FF00000000000000000000000042 +:10804000000000000000FF053D05000000000000EA +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000F00E1 +:108090000000FFFF000000FFBB000000003C000CE0 +:1080A00000000000000000000000000000000000D0 +:1080B0000000FF0000FF00000000000000000000C2 +:1080C000000000000000000005053D050000000064 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:108100000000000000000000000000000000FF0070 +:10811000F0000000FFFF00000010BB000000000C9A +:10812000003C0000000000000000040020002004CB +:1081300088000000200000002000840020002000B3 +:10814000880000112000000040008800200020006E +:108150002002000000000000880000000000200055 +:1081600000000000040000000400000284008400FD +:1081700004000000000000000000000000000000FB +:108180000004000000000000000000000000820069 +:108190002080000500000000000200040000000034 +:1081A00000042000000000000000000005000400A2 +:1081B000214000004000400000004000000000009E +:1081C000000200000040000000020000000200C0A9 +:1081D000000000004000000000C00002000220007B +:1081E000000000020000000000000000000040004D +:1081F00000000000000000000090000000004000AF +:10820000004000000000000000000002000000002C +:108210000000000800000000000005000000000051 +:1082200000000000800200081000000000000000B4 +:1082300000009000020000000000020000000000AA +:1082400002000000040000000000040010000840CC +:10825000084000109010000002000400821000008E +:108260008200000002008200000002008200000084 +:10827000000000000000001084000000000000006A +:108280000500000000000510040004000020041098 +:108290000500002084200220050004200020042086 +:1082A00002000200020002000000000000000000C6 +:1082B0000400000000000500020000000500008826 +:1082C000020000000500050000000200020041005D +:1082D000000000000000050004000500400000014F +:1082E0000000000040000000020002001100020433 +:1082F0000000000041000000000004000000030036 +:10830000000004000400000004008000820000015E +:108310008408C00003010001000188000001000181 +:108320000001050000000000000000000000000047 +:1083300000084000000000000000000000000000F5 +:10834000000000000000000000000000000020000D +:108350000000000000000400000000000000000019 +:10836000000000000000000000000000000000000D +:108370000000000000004000C000000000000000FD +:10838000000000000080000000000000000000006D +:108390000000000000000021820000000008000032 +:1083A00000000000000000040000000400000000C5 +:1083B00000000000080000000000000000000000B5 +:1083C0000000000004000000004000000000000069 +:1083D0000300000008000000000000000000000092 +:1083E000030008000800000000000000000000007A +:1083F0000000000000000000080010000300000062 +:108400000000000000000320110003000300000032 +:10841000080003000800089000000300110000009D +:10842000000000000000000000000000000100004B +:108430000000000000000000000000000804000030 +:1084400000041004000008000009000000001000F3 +:10845000000008000840002000000000004000006C +:108460000000000000000000000000040800000000 +:10847000000000040000000008000809080008408F +:1084800000094020A00000090000821108008200BD +:108490000000400000200000000400040004000070 +:1084A00000000005020000050000000400000000BC +:1084B0000000000000000000410000000000032058 +:1084C00008000000000000000000000000000200A2 +:1084D0000000000000002108000000000000000073 +:1084E000000000000000000000002100000000006B +:1084F000000000000000000000004100000000003B +:108500000000000000000200020000000300400024 +:1085100040000000210000001000000000000000EA +:10852000000020000090800000900000000000008B +:108530000004000000000300000000000000000034 +:10854000000000000000000000000000000000002B +:108550000000000000000000000004000000000017 +:10856000000000000000000000000000000000000B +:1085700000050000080000000800000000000000E6 +:1085800000000000000000000000000000000000EB +:1085900000000100000000000000000000000000DA +:1085A0000000000000000000000000000011004179 +:1085B00000000000000000000004000000000000B7 +:1085C0000000000000000000000000840000000027 +:1085D000000000000000000000000000210000007A +:1085E000050000040300000000000000000000007F +:1085F000000000000000000000000000000000007B +:108600000000000000002000000000000800000042 +:1086100000000000040000000000000000880000CE +:108620000804400005C0008403000084000000002E +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:108650000000000008020800000000000000000008 +:108660000000000000000000080000000000000002 +:1086700000000000000000000000000000080000F2 +:1086800000000000040004000000020000000000E0 +:1086900000004000000000000021000084000000F5 +:1086A00000000005000000000002001100030000AF +:1086B0000002002100020004000000080000000089 +:1086C0000000000000000000050000400000200045 +:1086D000200000000000000000000000000000007A +:1086E000000000000000000000000000000010007A +:1086F00000000000000000840000000000001000E6 +:1087000000000000000000000500201000000090A4 +:108710002100000021000000000000000300000014 +:1087200010000800000000000300000000820000AC +:1087300000000000000000000082000000000000B7 +:108740000504000000000000000000000000000020 +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A0000000000000019000000000010000000037 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:1088200000000000000000410008000500030000F7 +:108830000000000000000000000008000000000030 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:108870008000000000000000000000000000000078 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A0000000000000000000000000000040000088 +:1088B0000000004000000000000000000000000078 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F0009000100008009000000000000000000040 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:1089200000880000008400000084000000A0000116 +:1089300000840000008500A000840000000000000A +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 +:108960000000000000000000000000000000000007 +:1089700000000000000002000000000000000000F5 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A0000000000001000000840000000000000042 +:1089B000080000000000000084000000000000002B +:1089C00000000100000000000000000000000000A6 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F00000000000000000008000000000000000F7 +:108A00000000000000000000000000000000000066 +:108A1000000000000000000000000000000009004D +:108A20000000000000000400000000000000090039 +:108A30002000C10000000400000000000000000051 +:108A40000000000003000000000000000000000023 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A70000000000000000000008000000000000076 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000002000000000004000900000000B7 +:108AB00000400000000000008004004000000000B2 +:108AC000000000090000000000000000000000009D +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000400020000016 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000008018201820027 +:108B4000C000000000000000000000000000000065 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA000000000000000000007000000008100003D +:108BB0000700000000110000070000000081000015 +:108BC00007000000000000E00000000000000000BE +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C300000000000000000000000000000001C0018 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000FF666600000000000018 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E000000000000000000003C3C0F0F00000000CC +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00005000008000000A005000A28050000A029 +:108EC00005610A26050D00A085000A28050000A0FE +:108ED00000610007000D000000000000000000001D +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000000000003F0F7D5500000000000000 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000003C003C000000000028 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000200420002000880094 +:1090F000820040008200880020800004200040821E +:109100000000044040000080000002000200400017 +:1091100020000000040000002000C0000000000447 +:1091200040000000020002000003000000000000F8 +:10913000000020040080200420840000200400009F +:10914000000004800400048004800080000000000F +:10915000000000000000000000000000000000000F +:10916000000000040000000400004141410240A052 +:109170000020040000002000000000040001400066 +:10918000100400000001000221104000800088004F +:1091900000900202400000000000000000020000F9 +:1091A00000000000000080008000000000000000BF +:1091B0000000000080010008804180030000800161 +:1091C0000000000480108000800880100040000033 +:1091D0000004000000400000000000A000A000A06B +:1091E00000020004000000000000000000800000F9 +:1091F00008000000000000000000029000000000D5 +:1092000000000000000003400000111000000800F2 +:1092100004100900020000020000400500000000E8 +:10922000000000000110000001108200000000009A +:109230000000000400000000010000004000C00029 +:1092400000000000000001000010001000000000FD +:1092500090000800000088000400000004000000E6 +:1092600000000000000000000009000000000020D5 +:109270000910000002080000008400000020000027 +:1092800000000000041004000283028208820082B1 +:109290000000C00002900000400004008384000031 +:1092A00000000000400002000082040000080000EE +:1092B00004000200040004000000100020008008E8 +:1092C0000000040000080000400000010008000841 +:1092D0000000000080000000000041000000008449 +:1092E000000020000008000800000000001000102E +:1092F0000100004084400000040408000040000217 +:109300000000000000000040000000080000880885 +:10931000000400050003000200000000000000003F +:1093200010000000C0000000000001000008014023 +:10933000000000000000000000000000000000002D +:109340000000040000000000000000000000000019 +:109350008800000000000000000000000000000085 +:10936000000000000000000083000000000000007A +:1093700000080800000000000000000000000000DD +:109380000000000000000000410000000000040098 +:1093900000000000002000000801000000000000A4 +:1093A00000000000000000000000000004000000B9 +:1093B00004000000000000000000000000000000A9 +:1093C0000000002000000000040000000000400039 +:1093D000000041000000000000000000000000004C +:1093E0000000000000000000000004000000000079 +:1093F00000000000000000000000820000000000EB +:1094000000200800000000000000840000000000B0 +:10941000082082400020004008000120A000000039 +:1094200008400488041100000040A100040000006E +:1094300008040010000000000000900000008200FE +:109440008400040000000000C00000000000C00014 +:1094500000000040000004000400040904090800A2 +:109460000000002008804000080000000000080004 +:109470000000000008004000030003000800000096 +:10948000210041000000050041002100050000000E +:10949000000000200300000108004100044000001B +:1094A0000000000008080000020000000400840022 +:1094B000040011040300000010004100020002003B +:1094C000000009000000410008000000000000202A +:1094D000000040000400080080008400820080003A +:1094E00020000520090108200920022000000200B8 +:1094F0004190000000880400000800000000842162 +:1095000008000000900004080000080000000800A7 +:10951000C000000200000800020004008400820075 +:109520000000201000000408000090000008000067 +:1095300000000200820000000000C00000000000E7 +:109540000800000000000400000004000800820081 +:1095500088000011820000000000000000000000F0 +:1095600000000020840000000000010002029000C2 +:109570000000000000002000820000000000000049 +:10958000000000000000000080000000000000005B +:1095900000000000000000000000800080000000CB +:1095A0000000000000014100080000000000000071 +:1095B000000000008000000000000000000000002B +:1095C000000000000000000000000000000000207B +:1095D000000000080004000000000000410000003E +:1095E000000000C0000100000000000002000000B8 +:1095F0000000000000000000000000000403400024 +:1096000000000000000000001000008010000000BA +:109610000000000008000800000000000800000032 +:1096200000000800000008400000C0000080018029 +:109630000900008000000000000000000000100091 +:10964000000000090000A0001000000000008400DD +:1096500000000004000008000000000000000000FE +:109660000000000000000000010000000000008079 +:10967000018001800080820008000809020080004B +:10968000000203000000000205004100400240000B +:1096900005000082110000000000410004020000EB +:1096A00000000000080041000001040003404140A8 +:1096B00002200400084041000800050000400000AE +:1096C00003040800080003040820000003001190B0 +:1096D0001104208240000202030041000800000043 +:1096E000414002822000050020000400088202C0E0 +:1096F00020200220044000400300418200820040FC +:10970000010000000100000001000000C000000096 +:1097100000000000900000000000000000000000B9 +:10972000000001900000000000A0018888020004F1 +:109730000000009000000000000000900000000009 +:109740000000000000000000000000000000020017 +:1097500000000000000001000000C00300820021A2 +:1097600002830200000000008200000000000000F0 +:109770000000000000900000000000000000000059 +:109780000000110000001000000010002100000087 +:109790000000004110020002000300000000000071 +:1097A0000000000010800000000000802100008008 +:1097B0000080000000800000000000000080000029 +:1097C0000000000000000000000000000000200079 +:1097D00089000000000000000400000080C100C1FA +:1097E0000020801080000000000000000000000049 +:1097F00000000000030000800000000000000000E6 +:109800000000000000100021000000000000000027 +:109810000000000002000300201040408000000013 +:1098200000008000000000800000000010809041D7 +:10983000080002100000008000000000000000008E +:109840000000000000000000000000000000000216 +:1098500000000020000000000000000000000000E8 +:1098600080030021008000000000000000000000D4 +:109870000080001000000000000000000000000058 +:1098800000000000000000010000000000000000D7 +:109890000000000000A000080100000100200400FA +:1098A00090009000C000000000040000008200C092 +:1098B000030141200200000000040000002000001D +:1098C00000820000002000000000000000000000F6 +:1098D0000001000000000000000000000000000087 +:1098E000A000820140218202000000200000000848 +:1098F0000000004000000088000000400000004020 +:109900000000000000000000000000000000000057 +:10991000000000000001000000000301A1000000A1 +:1099200000000000000000000000000002900000A5 +:1099300002010000840110000000000040900000BF +:109940000000000004900000000000000000000083 +:109950000000000000000001010100000400000000 +:10996000000040400020824082820088008240A0A7 +:1099700000C0000000001000000000000000409047 +:1099800000000000000000000000000000000000D7 +:1099900000000005000500200041004190088503FB +:1099A000402000000000000000000511000380A01E +:1099B000004080080020002180400000000000805E +:1099C0000000400000008080000000000000000057 +:1099D000000000000000000800200341000080009B +:1099E0000000000080804000410080000500000071 +:1099F0008000008010000000000000004000000017 +:109A00000080000000000000000000000002004094 +:109A100000000000000000400000000008081000E6 +:109A20000300020400080080000000000011800014 +:109A300000000000C180A0C00300A01100000000D1 +:109A40000000000000118000008000000000000005 +:109A500000000000000000050040000000000005BC +:109A600000000000000080200040000000000040D6 +:109A700000000000000000200000000000000011B5 +:109A80008000008000000000000000000000400195 +:109A900082008800000000000000000000000102B9 +:109AA0000100000000000001002000900000000103 +:109AB000200000880000034002028510040000001E +:109AC00000000088000000012000000800000000E5 +:109AD0000000000000000000000000000000000086 +:109AE000000000000000000004004020828282008C +:109AF0000000000000000000000000000000000066 +:109B0000000120000008000000000000000000002C +:109B1000818100E007000000000000000700000055 +:109B2000810000E0000000000000000000000000D4 +:109B30000082840007810000000000000000500047 +:109B40000082040007810000008284000781000079 +:109B500000000000000000000000810000E00000A4 +:109B60000000810000E0000000000000000007008D +:109B700060000000000007000000008100000700F6 +:109B80000000004184000781000000000000000088 +:109B90000000F0FFFFFF00000000000000000000D8 +:109BA00000000000000000000000000000000000B5 +:109BB000000000FF000000FF0000EBFFFF3000008E +:109BC00000000000000000FF000000FF000000FF98 +:109BD0000000000000000000000000000000000085 +:109BE0000000000000000000000000000000000075 +:109BF000000000000000000050FA3CBE0000000021 +:109C00000000000000FF000000FF00000000000056 +:109C100000000000F000FFFF000000000000000056 +:109C20000000000000000000000000000000000034 +:109C30000000000000FF000000FF0000EBFF00300C +:109C4000000000000000000000FF000000FF000016 +:109C500000FF000000000000000000000000000005 +:109C600000000000000000000000000000000000F4 +:109C700080AA20A000A00000000050FA00AA000066 +:109C800000000000000000FF000000FF00000000D6 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB0000000C3C300FF0000FF000000FFFF000022 +:109CC0003C3FFFF5AFA50000FF000000FFFF0000D4 +:109CD000FF000000FFFF0000000000000000000087 +:109CE0000000000000000000000000000000000074 +:109CF000000700001000101000000000000000002D +:109D000000000000000000000000FF000000FFFF56 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D300000000000F0F0AAAA0000FF0000000000F0 +:109D400008083C3F5F550F050000FF0000000000C1 +:109D50000000FF0000000000000000000000000004 +:109D600000000000000000000000000000000000F3 +:109D700000000005000010001000000000000000BE +:109D8000000000000000000000000000FF000000D4 +:109D9000000000000000000000000075002F800D92 +:109DA00000000061000E000D00A0006100008009AD +:109DB0000000000000000000000515792A26054D6E +:109DC00005A800610006000D000100082A200540DA +:109DD00005A815182A20054005A80000000000006D +:109DE0000000000000610007800D00000061000716 +:109DF000800D000000790006000D050005180A001E +:109E0000059005A005180A20050005A015182A20B0 +:109E1000054005A800000000000000000000000050 +:109E2000000000000000000000000000AA0FAA00CF +:109E30000A4B0A4B00000000000000000000000078 +:109E4000FFF03CFFD7143030F0F0C2FE00000000FD +:109E50000000000000000000000000000000000002 +:109E6000000000000000000000000F0F0F0F0000B6 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA000000000000000000000004F404040AA0CED +:109EB000AA000A0A0A4B000000000000000000008F +:109EC000000000F03CFFD714F3F3F0F0407C0000FA +:109ED0000000000000000000000000000000000082 +:109EE000000000000000000000000000000F0A0A4F +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F20000000000000000000000000000000000031 +:109F3000AAAA3030C050000000000000000000005D +:109F400000000000000000000000000038F83BFBAB +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F7000000000000000000000001F1FBE140000D1 +:109F800000000000000000000000000000000000D1 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000000000000000000000B1 +:109FB0000000AAAA3000C050FFFF0000000000000F +:109FC000000000000000000000000000000008C8C1 +:109FD0000BCB0000000000000000000000000000AB +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000001414BE1467 +:10A000000000000000000000000000000000000050 +:10A010000000000000000000000000000000000040 +:10A020000000000020000400200020040480C1A0E3 +:10A03000A020842000002000004004000080C00018 +:10A040002080400000002000C00504002000200007 +:10A050000400888000000000A00000000000200034 +:10A06000200020000003000000002000000000008D +:10A07000000000000208C000000000000000000016 +:10A080000000000020000000000020840400000008 +:10A0900000000000000000000000000000000000C0 +:10A0A0000000000020020000000000000001092064 +:10A0B0001011000141010000000000010000200813 +:10A0C00000000402900000000000200000020000D8 +:10A0D000000000A005200900000021000000000091 +:10A0E00000000000000000004000000040000000F0 +:10A0F000000000020002200000020000000000003A +:10A100000000000000000000000000000008000047 +:10A1100000000000000200004000000000000000FD +:10A1200000000000000000000000000002008200AB +:10A1300000000000000002000800080008000800FD +:10A14000104000000100409002000200000090401A +:10A1500000000000000000C0020002000040844037 +:10A1600000000000000000040000020002000200E5 +:10A1700002000000000000100800000000000010B5 +:10A180000010020008000210001040000200000051 +:10A19000004000000000000000000500400000003A +:10A1A0000000000000000000000004840084090496 +:10A1B0000200000020020000000800840584000066 +:10A1C0000000840400844008A0020408000800087D +:10A1D00040080000040000000002008400080000A5 +:10A1E0004008040000000004009000000504000482 +:10A1F0000004000404000400000800000000001037 +:10A20000000000400000000000080000840804086E +:10A210000000000000000500000800084000800069 +:10A220000000000000000000000800000400000022 +:10A23000A00000000100011100000011000800084A +:10A2400000000000000004000000000000400021A9 +:10A2500000400040104000029021000000800040BB +:10A260000121000000000000004000000000000884 +:10A270008400000300000000000010000000000047 +:10A2800000000000000000000000000001000000CD +:10A29000A00010000000000000000000000000000E +:10A2A00000002000000000040080000010000008F2 +:10A2B00041080008000820002000030003000000FF +:10A2C0000000000000840004000003000000000003 +:10A2D00021400340004005401000000008900004A9 +:10A2E00000001084080000000000000000000000D2 +:10A2F000000005080500000041000000000000000B +:10A30000000003000800000000000800000020001A +:10A31000000003000000000000000000000000003A +:10A32000000800080008000000010304000080008D +:10A33000A000A0001000A00010C020008204208017 +:10A340000800A000C0009040000000098209100031 +:10A350008200000004408240A01140030202A0409D +:10A36000000000008204A08000110100040400002D +:10A3700000000002C000A000A01000000809820038 +:10A380000000A0082100A0800080000001000480DF +:10A390000000000000000080000400009000008920 +:10A3A00088800000000000000010A0000000008075 +:10A3B0000080000003000800000083200000080067 +:10A3C0008020058800000000100800000540030000 +:10A3D000004000000300118821000000110011005E +:10A3E00000830000000000000004000020000300C3 +:10A3F00000020000000000000000200040001000EB +:10A4000000000400000120000008000400002000FB +:10A410000004000000000000000400010000000033 +:10A42000110400040000410041004000040000004D +:10A4300000040004200090000000A0800000000044 +:10A4400084A00900000000110800000000000200C4 +:10A45000000900000008000800000000A000000043 +:10A460000000900020110080C041C01000000000DA +:10A47000080000000000A000080000000800000024 +:10A480000005900090000000000090009000A100E6 +:10A4900000119000000020002000900000002041EA +:10A4A0002041820008002008000890910008000365 +:10A4B00090102000200000000800000003040000AD +:10A4C000000000091000400009400020000040008A +:10A4D0000804050000000200000000A00084050040 +:10A4E0000004000800908000000800A00084000024 +:10A4F00000000084000000000000000000000000D8 +:10A500000000000000000000000000000800000043 +:10A510001000000004000000000080C000000000E7 +:10A520008000800000000084000000000040000067 +:10A530000000000000000000100008091011C00019 +:10A54000840004000080A080900000004009080002 +:10A550000021C000000010880800000090080808D2 +:10A560000000000008009002000809002080100090 +:10A5700090040405020802820000000040058203E6 +:10A5800040000800200508200802A080040488007C +:10A590004008012083050004100800048204880993 +:10A5A0000002000040200202040008024020004097 +:10A5B00000080208A10288008802000000000402CE +:10A5C000040000000800000400080020000400C08F +:10A5D0000000000000000300400220000300110002 +:10A5E0002002008400020340040000852000914006 +:10A5F00080200001000200000004000000000000B4 +:10A6000004000000000002000000008400040000BC +:10A610000000210120841000080000010001000456 +:10A620000000000000A011000000000000840000F5 +:10A630000008410000911000000011C0000040001F +:10A640000100000003A19041010308880890004028 +:10A65000008804C0100411822008100800000000C7 +:10A6600000000000000000004000000000C000C02A +:10A6700001C084C101C00420010482A0000001C007 +:10A6800000C00108409001C000C00104840201C064 +:10A6900088900190A08201C000900120880401C12F +:10A6A00000020140102101C000020108100201C097 +:10A6B00000900104841001C0008401884020000043 +:10A6C00000000300000091C18002029000008000A1 +:10A6D0000080000080000080080000808080000072 +:10A6E000000000000000000010000000000040809A +:10A6F0000080408080A010808000098080000000E1 +:10A7000003800000098000000380000009800080B1 +:10A71000038080000980009103800000090300800D +:10A7200003C100850920802003800080098080808B +:10A730000391000340839085208000A00900000061 +:10A740000000000000000000910082408311C10859 +:10A75000000000820040808088004088A080418006 +:10A7600000000000000000000000000000000000E9 +:10A7700000200080110580800040009080208080B3 +:10A7800000000000008500008080000000850000BF +:10A7900080800009008811098000000280859140B6 +:10A7A0008080004000890040808000090088000906 +:10A7B000808000000089000080A0000280901108C5 +:10A7C0008080000000000000000040882121A1C11D +:10A7D0000521400020C0880808C0110041C1820442 +:10A7E00085C0000000000000000000000000000024 +:10A7F0000000A000A0C0C100C0C0880040C19000FF +:10A80000C0C00003A00088C0A000C0C08800C082F3 +:10A81000A000C0C0A000A083C100C0908801028237 +:10A820000500C0C0A000A082C000C0C0040090838A +:10A830002000C0C0A008A0C08200C0C0880002C024 +:10A840009100C0C00000000000000000A12001A194 +:10A850000810A19105880040C010209021400010F0 +:10A86000C0828820000000000000000000010001FC +:10A870000000000001C020C0C0C000C00388040266 +:10A88000C09000C00001C1900090C04000C0C090C6 +:10A890000020C08200C0C0C00482204000C0A0844C +:10A8A0002002C08800C090840910C10800C0C0A068 +:10A8B0008410C00401C005C000C0C08401C09182E2 +:10A8C0001020C08801C000000000000040004105C9 +:10A8D000080280839141C100000080000000410017 +:10A8E0000080800803050000000000000000001048 +:10A8F0000010000500204100008380804080C100DE +:10A900008080800040800001410000008080008045 +:10A91000C100008080000480C100800300004080EE +:10A920004180008080892080410082808280058073 +:10A93000410000808080048041000500C18040808B +:10A9400041008000808310800000000000000000B3 +:10A95000C10202858080000080000000000000002D +:10A960000000800000000004000000000000000063 +:10A9700000110000000000008000910980008000AC +:10A9800080208009800080000001802000090000F4 +:10A990008000800400090080800080039104808092 +:10A9A00000808020910900808000804000048000A9 +:10A9B00080008011000500808000A11011020800B5 +:10A9C000A000801091050080808000000000000041 +:10A9D0000000890185828804400002009002024044 +:10A9E000020082008202024010000000000000000D +:10A9F00000000000000000000000C000C100C0888E +:10AA0000C000C0012000024004000001C001840019 +:10AA1000A0820800C0018200A0840400C0002101BF +:10AA200010C02008C0012100A0080800C00090014B +:10AA300002840200C0008800A0400200C10084011E +:10AA4000A1040800C001210008020208000000E083 +:10AA500000000000818100E00700500000000000BD +:10AA600000004842000000000000484200000000D2 +:10AA7000000000000081000007040000480043E0DF +:10AA800082224842480002E0820048420000000062 +:10AA9000000082004842000000008200604248003E +:10AAA00043E08222600A480043E0822200428100A3 +:10AAB00002E082000042480002E082000042000002 +:10AAC000000082004842480043E0822248420000E1 +:10AAD0000000000000000000010000000000A005D0 +:10AAE00000002004400228000028A000050000000B +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000001F4 +:10AB60000000A005100880014100004100A0000580 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC0000000040084000008420004008400000840C +:10AC10002000000040084000008420004008400060 +:10AC200000842000400840000084200040084000CC +:10AC300000842000400840000084200040084000BC +:10AC400000842000400840000084200040084000AC +:10AC50000084200000000000000000000000000050 +:10AC6000000000001008200400A0000510200804C7 +:10AC70002800002800000000000000000000000084 +:10AC8000FFFFFFFF000000000000000000000000C8 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE00040000080000080014002A000050080407C +:10ACF00001024100004100000000000000000000CF +:10AD00000000FFFFFFFF0000000000000000000047 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD5000000000000000000000610007000D00007E +:10AD600005000A29850000A0600000000000100016 +:10AD700000610006000D0800000000000000000057 +:10AD800000614036000D10D030040006800E300007 +:10AD900030650006800F3000000030000000000029 +:10ADA0001000300000000000100030040006800E8B +:10ADB000300030040006800E300030650006800F41 +:10ADC000300030650006800F300030610006000D55 +:10ADD000100030040006800E30000000000000006B +:10ADE000000000FF00550C0C000F000000000000E8 +:10ADF00000000000000000AAAAAA00000000000055 +:10AE000000000000000082AF82050000FF00F0F0AB +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000FF0023 +:10AE3000F0F000000000FF0000FF00000000000034 +:10AE40000000000000000000000000000000010001 +:10AE5000000000000000FF0000FF000000000000F4 +:10AE600000000000000000550C0C000F0000000066 +:10AE700000000000000000000000AA000000000028 +:10AE80000000000000000000D7AFD7050000FF0061 +:10AE9000F0F00000000000000000000000000000D2 +:10AEA00000000000000000000000000000000000A2 +:10AEB000FF00F0F000000000FF0000FF00000000B5 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000FF0000FF0000000074 +:10AEE000000000000000000F00550C0C000F0000D7 +:10AEF00000000000000000000000FC3CBE3C000020 +:10AF00000000000000000000000000000000000041 +:10AF10003C3C00FF000000000000000000000000BA +:10AF20000000000000000000000000000000000021 +:10AF300000003C3C00FF000000000F0F00FF00007D +:10AF40003D05FFC3000000000000000000000000FD +:10AF5000BABEBEBE000000000000FF0000FF0000FF +:10AF60000000000000000000000F00550C0C000F56 +:10AF7000000000000000000000000000FC3CBE3C9F +:10AF800000000000000000000000000000000000C1 +:10AF900000003C3C00FF000000000000000000003A +:10AFA00000000000000000000000000000000000A1 +:10AFB000000000003C3C00FF000000000F0F00FFFD +:10AFC00000003D053C000000000000000000000003 +:10AFD000000028282828000000000000FF0000FFD3 +:10AFE0000000C000048405040004C0002000000428 +:10AFF000880485000088C1088980000089008203D8 +:10B000000400820020008880040388000880040077 +:10B0100020800000000240002000C0000480880062 +:10B0200041000003000000000000040200000000D6 +:10B03000C0002003000000000208200020002100C2 +:10B040000000880000000000000000040000000074 +:10B050002000000000000000000420002080040008 +:10B060000000040020000011020120410000000047 +:10B0700009000001200000082004200200000482D2 +:10B08000000280020982000000020340410080109B +:10B09000000000400900000000000000000020083F +:10B0A00000001000000000020000000000900000FE +:10B0B0000000000000000000000000000000000090 +:10B0C00010000000000000000082000000000000EE +:10B0D0000000000000000000000000000000004030 +:10B0E000000000008000C1000800000002210000F4 +:10B0F0000800008000100000900002009000008016 +:10B100000085C00000000000820000000040000038 +:10B110000000401005088200400000000000008090 +:10B1200001000000012000000200000002000000F9 +:10B130000000000000000000040002000000000405 +:10B140000000040000004000008000000000828039 +:10B1500000000000000000000000000000000010DF +:10B16000000000008410001008008008000009049E +:10B170000008048400044004090000000510008257 +:10B18000001000100200008400840908400800013B +:10B190000410040800004000200080820284004067 +:10B1A00040024084200040000000000800044004E9 +:10B1B000000400000010200000A00082048204842B +:10B1C00004820000090000008000000204000082E8 +:10B1D000001004000004000000000000000020082F +:10B1E0000000000005000000000000050040000015 +:10B1F0000100000090000000002104210800000070 +:10B200000008000800080100C00200080200000059 +:10B2100000000402002100000005000800080008EA +:10B2200000020000004000020009000000000000D1 +:10B2300000090008000000084110000000000000A4 +:10B2400000210000000010000000000000000000CD +:10B250000008A00000000000000000000000000046 +:10B260000000000000000000008000004008038291 +:10B27000400002C00800030000002100210021005E +:10B2800005002100000000000402001141A0800020 +:10B2900000004102080103000000000000822109B3 +:10B2A0002100000100004100050000000000000036 +:10B2B000000000000000080000000800000021005D +:10B2C0000300210003000000000021001100000025 +:10B2D0000000110000C00000000000000200020099 +:10B2E0002100000011C000081108000400008200C5 +:10B2F0000140080204028200A0200004084082806D +:10B30000C004890000200421080011000005080085 +:10B31000A0030889A140008001A1410440800800E9 +:10B320000140830205020000080000000800000040 +:10B330000000080082020800040082000000820071 +:10B340000100010001004100000000090000004070 +:10B3500002000000880410009000000000000000BF +:10B36000000000000000000000000020040000C0F9 +:10B3700000000800400040002100080021000000FB +:10B3800040200401040000008800418208002000E1 +:10B39000090021824102400000100210088800408C +:10B3A00003000200041004010000000004840004F3 +:10B3B0000000100011000800040005000800000053 +:10B3C000004010001000200020400000410020003C +:10B3D0000000000041020000000000400040410465 +:10B3E0000800000000000000009000000000800045 +:10B3F0000004000008000000100000040121088083 +:10B400000083840020008220000008001000080053 +:10B4100008020002820090400000004008008411F1 +:10B42000000402000000080082200000C00000218B +:10B4300000030000000000400008000000000000C1 +:10B4400000000000000000000900000000000000F3 +:10B45000080008000000000000202000000000009C +:10B4600000000008000000008200000001000080D1 +:10B470000000000000C000040000000000C1200027 +:10B48000410400040884100810082002008800907D +:10B49000000400A0000100000000000009010000FD +:10B4A000000408C084840000000040C02100218402 +:10B4B00000002100000008840004210003000000B7 +:10B4C000000000C021C01184008408C000840388EB +:10B4D000210000C000000000210000C00800200082 +:10B4E0000010008400000384000008C00004200055 +:10B4F0002104110009888400900090001000882128 +:10B5000008080200880084000000400008000011C4 +:10B5100010100000080510008200C0211040000338 +:10B52000880088210000910088800080890800112F +:10B53000000088000000000000000002002102005E +:10B54000880900000400000001008880908001004C +:10B55000000988020020100900000000000000001F +:10B5600000008800000000050000880000090008B5 +:10B5700000090800000008000000000000080000AA +:10B5800000000000404000C000000000210000005A +:10B590000000000000C080001100038800020008C5 +:10B5A0002100410002000904049000200440020030 +:10B5B0000000000000004100000003000000030044 +:10B5C000000000000000000040002000000400080F +:10B5D000100000000000000000000000000000005B +:10B5E00000000000000041000000000000004000DA +:10B5F00003000000000000000000010200100491A0 +:10B600000021000082000100000010409010204046 +:10B61000C00005400188041082401002820300012E +:10B62000040902C000A004A0200410C041218241EE +:10B6300010880000000184000001000000000000EC +:10B640000000000000000000000000000001820176 +:10B6500010010001000000002000000000000000B8 +:10B6600000000000000000000000000000000000DA +:10B6700000000000400000000000820008902180CF +:10B68000800200020000000003000000200089800A +:10B6900005800000900041000000000080C110A063 +:10B6A00000020010A08300008010008040A0200352 +:10B6B000000200020041200880020010000000008B +:10B6C0000000000000000000000000000000004139 +:10B6D000000209080010000020000000000000081F +:10B6E0000003000300200000000000000000000034 +:10B6F000000000000000000000000000000010003A +:10B70000020902000540004000000005000000089A +:10B710000011808880800200A02109008400900030 +:10B72000408503A0200000000021800000001000E0 +:10B7300010200880C10300800000000400C0000049 +:10B7400000000000000000000000000000000000F9 +:10B7500010800200401041030000000000000000C3 +:10B760008000800000008000000000000000000059 +:10B7700000000000000000000010000080088000B1 +:10B780000102000001400000000100000000000074 +:10B7900000011000404108909100030088880200D9 +:10B7A0000900201001A0210000008200A04000003C +:10B7B0000308210011C0C10900C0000000010010F1 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000004001000001010100000000000025 +:10B7E0000000100010002000080000000000000011 +:10B7F000000000000000000000001001C0008400F4 +:10B80000C0880200000002000200000004000000E6 +:10B8100001008221C0000441030390900011000543 +:10B82000084000C1000420090011402000A183400D +:10B83000010288010020014000C10000000040001A +:10B8400000010000000000000000000000000000F7 +:10B8500000000000000000010000010100000000E5 +:10B8600000000001000000000100000000000000D6 +:10B87000000000000000000000000000001020C0D8 +:10B88000008201C080050310911080050000800037 +:10B8900000000300001080208088C1C1001000203B +:10B8A00000A100050020218008A100A080080090D0 +:10B8B0000520098800090808210800C1000341107B +:10B8C0001020004100000000000000000000000007 +:10B8D000000000000000001000024040084100038A +:10B8E00000400005004100002100050009000000A3 +:10B8F0000000000000000000000000000000000048 +:10B9000000000080108085A1A1000500050200054F +:10B910000040000000000011004100800000808015 +:10B9200000200000800480030000000000200000D0 +:10B930008021008080008321210204001011412019 +:10B940002000410003000000000000000000000093 +:10B95000000000000000000041024000050000104F +:10B9600000000000000000000011000000000000C6 +:10B9700000000000000000000000000000000000C7 +:10B980000000008900800000C005A0009000A00019 +:10B9900000000000000000001000C004C0400000D3 +:10B9A00004C0101040408201408802A09082020032 +:10B9B0002000049120828200C0414041910000009B +:10B9C0000100000000000000000000000000000076 +:10B9D0000000000000000000000001010000010064 +:10B9E0000000000000000000000000000010004007 +:10B9F0000000000000000000000000000000000047 +:10BA000000000000000900C00000840000E0000009 +:10BA10000000810000E000000000000000E00700DE +:10BA200082410000000007005000000000000000FC +:10BA300000000000000000000000004100000700BE +:10BA40000082000000000000600000000000000014 +:10BA5000000000000000000000000000810000E085 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000600002E00700000A0FFF28F835 +:10BA90000000000000000000000000000055F0F56C +:10BAA0000082FFFF002C000000500050F3B2F3B200 +:10BAB000000020283C3C3C3C00000200000000004C +:10BAC0000A000F000000000000000000000000005D +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB0000000000000000000000000007282800F0EE +:10BB100028F8000000000000000000000000000005 +:10BB2000F0F0008200820028000000100000C382B4 +:10BB3000FFBE000000083C3C3C7C00000000AA0066 +:10BB4000F0000A00000000000000000000000000FB +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000D728288E +:10BB90000303030300000000000000000000000099 +:10BBA000F555F0000F5F00550A0200000000050087 +:10BBB000FF003C3C55550F0F000C00005F0F5F0F5E +:10BBC000003000F02020A000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF00000000000000082C082FC00000000000085 +:10BC00000000000000000000000000000000FF0035 +:10BC1000000BBE3C8200000000000000000000009D +:10BC20000000555500000F0F00000A000000000042 +:10BC30000504FF003C3C3C3CFFFF0000000C5500AD +:10BC40005500003000002020A0000000000000008F +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC70000000000000000000BEC0BEFC000000008C +:10BC800000000000000000000000000000000000B4 +:10BC900000000B0BA0614004800100000061000760 +:10BCA000800D00000061000F000D0000007900060B +:10BCB000000D050000613006000D00010061500616 +:10BCC000001D00011061202E004D000800610006DB +:10BCD000000D000000000000000000000000000057 +:10BCE0000000000000000000000180000000006172 +:10BCF0000006000D000000610006000D00000000BD +:10BD000000000000000000000000000000000065CE +:10BD10000006809F25057D3D3C3C383800FF000033 +:10BD200000000000000000000000BCBCA0BC00003F +:10BD3000000015FF15FF0000000000FF3CFF0000A1 +:10BD4000000000FF0053AF05000080A0000A3F0F75 +:10BD50007D41F0FCAABE00000000000000000000D1 +:10BD60000000000000000000000000000A000C00BD +:10BD700000000000F0F0F0FC0000000000000000F7 +:10BD800000000000000000000000000000000000B3 +:10BD9000000000000000000041010000101000FF42 +:10BDA000000000000000000000000000A0A0A0BCF7 +:10BDB0000000000055F555FF0000000000003C3C6D +:10BDC0000000000000FF0053BE140000DFFF000A67 +:10BDD0003C007D41003C003C0000000000000000F1 +:10BDE00000000000000000000000000F00550A00E5 +:10BDF0000C0000000000AAAA003C000000000000A7 +:10BE00000000000000000000000000000000000032 +:10BE100000000000000000000000FDFDCDCDF0AAF4 +:10BE20003C3C00000000000000000000000000009A +:10BE3000000000000000000FA0AFFCF50CF50010A2 +:10BE40000000FFFFFFFF00000000FBFB0B0100FFF5 +:10BE5000F0F07F576B43000000000000000000007E +:10BE600000000000000000000000000000000000D2 +:10BE70000A000C0000000000000000003FF53F0534 +:10BE800000000000000000000000000000000000B2 +:10BE90000000000000000000000000003D3D0D0D0E +:10BEA00000003C3C0000000000000000000000001A +:10BEB00000000000000000003F3F3F3FFC050C0574 +:10BEC000000000000F0F000000000000F1FB010166 +:10BED000AAAA3C3C3E162A02000000000000000016 +:10BEE0000000000000000000000000000000003C16 +:10BEF000000F0A000C00000000000000000030F5F8 +:10BF000030050000000000000000000000000000FC +:10BF10000000000000000000000000000000200001 +:10BF20000000400004050000C00204008800040076 +:10BF300010008404400020008400880020000200DB +:10BF4000040284008280040840002000C01140C028 +:10BF500020408540204000400000000020000003F9 +:10BF6000000020400000000020004000C0402005EC +:10BF70000040204000400040040000008800000015 +:10BF80000000200000000000200020000000000051 +:10BF9000000020000004000001800100200000805B +:10BFA000000000000000090000000000000004C0C4 +:10BFB00000008000000220001100040000040002C4 +:10BFC000804000C10000200200008000000000024C +:10BFD000400300011001004100012000400000006A +:10BFE000000000000001000000000000000000014F +:10BFF0000500000100012001000100000000000216 +:10C00000000010000000000000000000000000041C +:10C0100000000000000000000002100410004000BA +:10C020000008000084001000000008000800000064 +:10C03000000400000000840001200008000000004F +:10C040000804004084400004080002050240040087 +:10C050000202000000000108C085020000000090FC +:10C060000284000000000000009082000080008038 +:10C070000010908200000000000008020040020052 +:10C08000000000400040000002000000020000002C +:10C090000000000000000000001000100000000080 +:10C0A00000000811000400820000058420008404C0 +:10C0B0000002000800040288040040080000400854 +:10C0C00002840000000009000810038480000009B9 +:10C0D0000084C0110400000010854002058204089D +:10C0E0000040404000000008000000400400044000 +:10C0F00000400000004100080000000000050000B2 +:10C1000004080008000800040500000800080000FA +:10C1100000000008000804040000000100090000FD +:10C120000408000800820000000000000000001168 +:10C1300000800808101002000000C0000011040573 +:10C14000400004008800000000000000008000059E +:10C150000008204000000002001188000041000398 +:10C16000008000C000000000020000000008001075 +:10C1700000000000000000080003000000000002B2 +:10C1800000800080000000A100000000000000000E +:10C190000000000000000002C000000000000000DD +:10C1A00000000003200088000300000000000008D9 +:10C1B0000300034021880000000000000800001078 +:10C1C000808285008808210805A003A04008050298 +:10C1D00003040300000000084000039008000084EE +:10C1E0000000004000400084000084000002418400 +:10C1F0000000000000000000000000000500030037 +:10C2000000820040004041000840000000000000A3 +:10C210000000000000A0002000C10000200000007D +:10C220000000000000008000000800000800C000BE +:10C230000840002108004004080008004009A00050 +:10C24000A005C003402000040800820040000880D0 +:10C2500040820020082000C00400000200110000FD +:10C2600000200804820000400000000000000000E0 +:10C27000080000004003000008000000000000006B +:10C28000000000408200000000000000004100416A +:10C290000002A0400000900200000040004000208A +:10C2A00000400040200000000000010000000000ED +:10C2B00008000000030400884040400240000300E2 +:10C2C00003000000000021012100020000084100DD +:10C2D00009100303008540010040080000010940E7 +:10C2E000000010080002000002000000000008A08A +:10C2F00000000000000800000800400021100200BB +:10C300000000000008000000000000000000000025 +:10C310000000000000000000000000000800008491 +:10C32000000000000000800000000000200000006D +:10C330000000000000000000000000001000880065 +:10C3400008000000000000008200820904000800CC +:10C35000080000900241000400000000000000837B +:10C3600000800100008000800800000082210000A1 +:10C3700000001000200020880040004000401040D5 +:10C3800000800100010040880000000000400040E3 +:10C390000000000000000000820002000800000011 +:10C3A000000300000000000000080000000000057D +:10C3B000000003844100100000C0000800000000DD +:10C3C0000000000000840302000008A000840300B5 +:10C3D0000000808803038500100040002000410019 +:10C3E000084000400284214000400000080800008E +:10C3F00000000000800080008040008500010001F6 +:10C4000000010040020002000040000000C00001E6 +:10C4100000840000000000C00000000000000000D8 +:10C42000000000000000000000C0008800C011886B +:10C43000092000000000C000880000004002100039 +:10C440004000000090000400A04000000020000216 +:10C45000002040110800C004084000000003014112 +:10C4600083000008000200000000400008000008EF +:10C470000040000010000000000008210000000043 +:10C4800000080000000400000000000000000000A0 +:10C4900000001008000000000000000482000000FE +:10C4A00000008400000000030000000400212000C0 +:10C4B0000000000000000000024000000000000139 +:10C4C00040000900000000000008202000020304D2 +:10C4D0000300098300C080C00000914120021100C8 +:10C4E00004020440000000000300020000000000FD +:10C4F00008040009000088040000000011C0034087 +:10C500000004400000000820400208000000000075 +:10C51000000000000000000000000000000000001B +:10C5200000400000000000000200000000000800C1 +:10C53000800000000000000000000000000001A0DA +:10C54000009000400088000000004000000000C093 +:10C5500004820084C00820002000C000820001C1C5 +:10C5600008058402C08401C10001840100C100C02B +:10C57000000000A08200000001C1A0001101000124 +:10C5800000C000002000000000C00100840000C0C6 +:10C5900000C0000000008200000000000000000059 +:10C5A000000001001000000004A000020090829032 +:10C5B000000000000000000000000000000000007B +:10C5C00040800000000000000000090000000000A2 +:10C5D0001180008000808080031083030009804068 +:10C5E00020C090820084801010C1210880040010B7 +:10C5F0000080000000000000000011C10505820954 +:10C60000000300804000000000000080080080005F +:10C61000000000800000000000000000000000009A +:10C620000000000002008000000080800080000008 +:10C6300000000000000000000000000000000000FA +:10C640000000000000100080000900000000000051 +:10C6500000008000804180418083000083009100C1 +:10C6600020C08280A04190008903000000000000EB +:10C670008000000000000000800000000380912185 +:10C680000000C18388001103200088000000000022 +:10C69000000080000000000000008000000000009A +:10C6A00000000000000000000000000080000011F9 +:10C6B0000080800000100000110500000000000054 +:10C6C00000000000C090C001844082000000000013 +:10C6D00000000000400082018401C0C00040210031 +:10C6E000A00001A1030404850200C1A00000000015 +:10C6F0000000C040000082000000C0000000008870 +:10C7000082000000C189030000000100C100000098 +:10C7100000000000C008000082000000C00000000F +:10C720000000000000000000000000000000080001 +:10C730008800A0100400000100000101002000009A +:10C740000000000000009000000000001000000049 +:10C75000000000000001C0400020C04000C000A157 +:10C76000004001820020C0200221914100C0000051 +:10C77000010100C000C000000000000000C0000176 +:10C7800040000191880001C104010003000100C0C4 +:10C790000001000000C100C082000000000000C0D5 +:10C7A0000000000000000000000000000001000088 +:10C7B0002040009082200588000040000001000019 +:10C7C0000000000000000000000000000000090060 +:10C7D00000200005001000418080008080800080E3 +:10C7E0000020090240840040A080918208A10588B1 +:10C7F00000102010000400840000000000000080F1 +:10C800000001800003A0801109C180020082002184 +:10C8100000A00002000300080089000000000000E2 +:10C82000008000000000000000000020000900045B +:10C830000009008000000000848000000000000863 +:10C84000080000000000000000001002408082008C +:10C85000820000000000000000008241C005A084AA +:10C86000C0802100038840004004C1C1822085852A +:10C8700040100000000000000000800000000000E8 +:10C8800000000001C105050903000011800000003F +:10C890000000001080000000000000008000000088 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000058080800080000000110062 +:10C8C00000000000000000000000000010009020A8 +:10C8D000858205000000000000000000C00120006B +:10C8E00040C009100100001100A00100C1A12101F8 +:10C8F00040C18483000000A0A0000000C000000030 +:10C90000820000000001C1A0000101000000C082FF +:10C91000000000000001C00000A0A0000000C00056 +:10C920000000820000000000000000000000000085 +:10C93000000000000000A00082200240040000006F +:10C9400001000000000000000000000000000000E6 +:10C9500000000000000000000000000000000000D7 +:10C960000000070048420000000000000000000036 +:10C970000000070048420000000000000000000026 +:10C980000000000000000000810000E00000000046 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C000000002E000000000000000000000000085 +:10C9D0000F000FFF0000000000000000000000003A +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000F0F0F0F0FF00000078 +:10CA0000F0F00000FFFF00000000FFFF0000F0F06A +:10CA10000000FFFF0000F0F00000F0F00000FF0059 +:10CA20000000F0F00000FFFF000000000000000028 +:10CA300000000000000000000000F7F4C7C4800000 +:10CA40008F00000000000000000000000000000057 +:10CA50000000C399C399000000000000000000001E +:10CA600000000000000000000000000000000000C6 +:10CA700010000000000000000000F0F0F0F0FF00E7 +:10CA80000000F0F0000000000000000000000000C6 +:10CA9000F0F0000000000000F0F00000F0F00000F6 +:10CAA000FF000000F0F000000000000000000000A7 +:10CAB0000000000000000000000000003734070400 +:10CAC000E000EF0000000000000000000000000097 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000041084000008421020000000016 +:10CAF0000000000043084000008421860000000080 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB5000000000000000667F001900FF3C3C000060 +:10CB600000000000000000000000000000000000C5 +:10CB700000000F6F0F6F00000000000000000000B9 +:10CB80003C3C0000666600000F0F00000F0F000025 +:10CB90000000FFFF00000F0F0000FFFF00003C3C03 +:10CBA00000003C3C000066660000FFFFFFFFF0F065 +:10CBB0000000000000000000000000000000000075 +:10CBC000FBC3FBFF9F9F187E0000000000000000D9 +:10CBD00000000000000000006667000166660F0F9D +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000660066000000000000000069 +:10CC000000003C3C0000666600000F0F00000F0FA4 +:10CC100000000000000000000F0F000000000000F6 +:10CC20003C3C00003C3C0000666600000000FFFF4A +:10CC3000F0F0000000000000000000000000000014 +:10CC400000002000203C0606187E000000000000C6 +:10CC50000000000000000000000000610006000D60 +:10CC6000000100610006000D00000061000E000DD3 +:10CC7000000000614006001D00001061200E004D04 +:10CC8000000840638006002D920240828000002050 +:10CC900092020000408280018020920240E38006E0 +:10CCA000002D920240E38006002D92024082800017 +:10CCB0000020820200000000000000000061000669 +:10CCC000000D0000000040000000000000440006CD +:10CCD000000E20000000000000000000FD3DCD0D12 +:10CCE0000000000000000000A0FFBCBCFFCFFF0C54 +:10CCF000000000007F7F700030303030AA000F3C11 +:10CD0000A0A0AFAF00000000A0AFA0AF00000000E7 +:10CD10000000000000000000000000000000000013 +:10CD20000000FF55FE54000000005F5F0A0A00008B +:10CD300000000000000000000000000000000000F3 +:10CD400000003F033F03000000000000000000005F +:10CD5000FF0000FF00000000000000000000F131B3 +:10CD6000C1010000000000000000A0A0A0A03CCF76 +:10CD70003C0C00000000FFFFF0F030303020AAFF34 +:10CD80000F3C00FF00FF0000000030303F3F00007C +:10CD900000000000000000000055000F000F0A0A0C +:10CDA00000000000FF55EA4000000000EB41EB41AD +:10CDB0000000000000000000000000000000000073 +:10CDC00000000000D7D7141400000000000000008D +:10CDD0000000FF0000FF0000000000000000000055 +:10CDE0000000000000000000000000000000000043 +:10CDF00000000000000000003CD700D700F0AAFAB5 +:10CE0000C028C0EBD0C0F8C0007D003F000000008B +:10CE100000000000000000000000000300410000CE +:10CE2000000000000000FF55AA0000000000000004 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000FF0000000000000000D3 +:10CE600000000000000000000000000000000000C2 +:10CE7000000000000000000000000FFF0FFF00F0A6 +:10CE8000AAFAFC28FCEBD0FCF8FC007D003F000077 +:10CE9000000000000000000000000000000300414E +:10CEA000C0C08282000000008787878700000000E2 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED000000000000000000000FF000020002020F3 +:10CEE000C0042020400220100002880300008808AF +:10CEF0008800408289004000019020082000400006 +:10CF00000202400010002000040020004000000049 +:10CF10000411C0000400200088002000000320004D +:10CF20002000040020002000010820000000200054 +:10CF30008403040500048800200020002000000075 +:10CF40002000040010042000400040000000000009 +:10CF50000000000000042000200220042004000043 +:10CF60004003050000030001210021010000200012 +:10CF7000000041020510400000842009000000006C +:10CF80008002040000002040000800080500C100E5 +:10CF900000900300000000000000000000000000FE +:10CFA0000000000000000000000002C0000009A016 +:10CFB00000000082000020000000000000000000CF +:10CFC0000000000000000000000000000000000061 +:10CFD000000000000004000000000000000000004D +:10CFE00000800000000000000000000000000000C1 +:10CFF00000040000000804080404200000000100F0 +:10D000000000010000000104020200904000020242 +:10D0100000004084000000800000008000000090BC +:10D020000000010000080000010903020580014022 +:10D0300000C0202000800000200300000000000845 +:10D040008803000000000200001000000000001033 +:10D0500000000000000000000000000000000000D0 +:10D060002000000200C009000000200200844004EB +:10D07000208404084002400000108008808400845E +:10D08000208400004004000410000001004100C0A2 +:10D090000989000880104084001000880002000008 +:10D0A00000030000208440014000200488850840DF +:10D0B0000891041189850004090880000084410852 +:10D0C000099000080008000020044000408804087F +:10D0D0000008020800840008000809000408008411 +:10D0E0004082000810000000100000000000004016 +:10D0F000000800000003000000000003000000081A +:10D100000010044082400000000040000008200899 +:10D110000008900840800000900040400004000893 +:10D120000008000800000000000408080002880849 +:10D130000080100800000003000800000021000823 +:10D14000000000000000880300000008000800083C +:10D15000000000000040000000000000000004008B +:10D160000000400000000000090000000000030073 +:10D170000009000000000084400000004002400060 +:10D18000000009A082A021000800000040840000E7 +:10D190000000000021008002008800040000000858 +:10D1A0000000000000000000000800011000400026 +:10D1B00000004140000000000000000000000000EE +:10D1C000000000000000009041000000000040004E +:10D1D00021000000030000000000000000004000EB +:10D1E00000040000000000000041040004410000B1 +:10D1F0008200200490000000401120050809080466 +:10D20000004108400802040482111040A0090040B7 +:10D21000A009C0021000000083C182208200C00467 +:10D2200082419000000010400000828882002000AF +:10D23000C0080400824010009040004000000180BF +:10D2400082090002000084000000000004000000C9 +:10D2500008000000000000110000000000000000B5 +:10D260000000100000000000000000000500200485 +:10D2700020000300050040001000400000000800EE +:10D28000200011000900400202A0000800840802EA +:10D290002000059005C140840000400220840384E2 +:10D2A000210210001188000000C0000000212100B0 +:10D2B00010841111410041018000008441000000F0 +:10D2C00004041100080003004120200000000200B7 +:10D2D00000000400000000000000000000880400BE +:10D2E0000000000041000000000011000000880064 +:10D2F00008088421004000000008000088020000A7 +:10D30000080000000841A000002000100000A0005C +:10D31000040082084000820500030000820000082B +:10D32000A004080008218205A021C04000000000E0 +:10D33000C0008220C003820002000008000000003C +:10D3400000000000A000000082000000002100009A +:10D3500000000000000000000000000000100000BD +:10D36000820000000000000000000000000000003B +:10D370000000000000001104400000012120000016 +:10D3800000000000210000000000050104C00000B2 +:10D390000000809000000000210000000010050047 +:10D3A0000400030240000000000000000000000034 +:10D3B00000080000000100000000800000000008DC +:10D3C00000000000000440A0000000000000000079 +:10D3D000000000000000000000000000000000004D +:10D3E0000800080808000000000400040904218463 +:10D3F00000000008084010000000000000000808BD +:10D40000400008004000401120210420400000009E +:10D410000408888000020880020000084040401094 +:10D42000008000210808A000820004080008C02035 +:10D4300000000411002100828221A00200090420C2 +:10D4400009050000000000000002000000000000CC +:10D4500000000800000000000000000000000800BC +:10D46000000000000000000040000000000000007C +:10D4700020000000000041042020000000002100E6 +:10D48000020400000000400040000882212140000A +:10D4900000A004C0032020C04020800011080089A3 +:10D4A00011000002080000042100008200021000A8 +:10D4B000009000000090000003040000000008003D +:10D4C0000000080800080000082000000000000418 +:10D4D00000000002000000402000030002000200E3 +:10D4E0000000000000000000210000000000000417 +:10D4F00000000000102120030089088200010000C4 +:10D5000000000001000000000000000008210000F1 +:10D5100040050404404000840082000210A1018301 +:10D520004082C08309040121200504024100A000BB +:10D530008400C00100000040909001A008A002C13A +:10D540000003009104A0400490A000C0000200006D +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000080080083008480901141BA +:10D5800000030003000800000000000000008541C7 +:10D590000302C0908082400000000000008000A0D4 +:10D5A00003020009000221800288008480089000A4 +:10D5B00003038020000200001100800004008000AE +:10D5C00080C100C000408008408080004000008092 +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000008010800080009B +:10D600000800210041008810000000000000000018 +:10D610002000400000001004800000008000001185 +:10D62000080004100880208882820220A00088213F +:10D6300088808300C10885830000830800100041B2 +:10D640000080000000100080800000200021800881 +:10D65000008000000000000000000000000000004A +:10D6600000000000000000000000000000000000BA +:10D670000000000000000000000040000200A08444 +:10D68000822005C0A1008400080000000200A00064 +:10D69000820001A00020000001C0020084004000C0 +:10D6A000000003208300092040898802890005A02A +:10D6B000040110080200A001040500000801900107 +:10D6C00000C020902000000100C0C0000000400009 +:10D6D0004083C09000000000000000000000000037 +:10D6E000000000000000000000000000000000003A +:10D6F0000000000000000000000000004040011099 +:10D7000085401184000001000100000000000000BD +:10D7100000000000901101A003A088884040008410 +:10D72000C0200002908200838583A082008800A030 +:10D7300008050421000101A1018900040000044042 +:10D74000C090840801A0C0020088008403C040A0EB +:10D75000C0A00004018200000000000000000000E2 +:10D7600000000000000000000000000000000000B9 +:10D770000000000000000000000000000000008029 +:10D78000200005000400000041000400000000002B +:10D7900000000000000008A00205820400808080D4 +:10D7A000000000000080008221401021051100418E +:10D7B000002000A1800200402020052108890000EF +:10D7C0008020800000804100808003804180A18013 +:10D7D0000000800000804100000000000000000008 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D8000000400080800080000800118002000910A4 +:10D810000000008000000000050200000900104028 +:10D820004100080205091100C18803800800201189 +:10D83000A1882180848089020321218008800541FC +:10D840000000804080C11080800080038000800044 +:10D8500000000020004000800000000000000000E8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D8800000000200041084400200004000C00002BA +:10D890000000000000100082000000C10000000035 +:10D8A00001000100014100C00000C141028202826A +:10D8B0008200111010100510040000A100C0000823 +:10D8C000000100000800080201400400C000882098 +:10D8D00040408800A001C020C040000000000000BF +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 +:10D90000000000000081000007000000000000008F +:10D91000000041000000000000000000008100E065 +:10D9200007000000000000000700000000000000E9 +:10D9300000000000000000000000000000000000E7 +:10D94000000082060000000000E0070082410000A5 +:10D95000000000008421000000E007008241000078 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D98000000000000000A7A2070228EBF3F300004C +:10D990000000000000000000000000000000000087 +:10D9A000000053FF53000000000000503C7CEBEBF4 +:10D9B00030F3FCFAFCFF301C001C3C3C3C00000037 +:10D9C000000050500F00000000FF82FF00F0C3F382 +:10D9D00030FFBABABCBC3CBEA0A0A0A0003C507CAA +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000F7F2575228EB303011 +:10DA10000000000000000000000000000000000006 +:10DA20000000000000FF00000000000000503C7CEF +:10DA3000282830F30CFAFCFF30DF00DF141714172E +:10DA4000000000005050FFF000000000828200F053 +:10DA500000F030303030A0A000AAA0A0A0FF003C11 +:10DA6000507C0000000000000000000000000000EA +:10DA700000000000000000000000000000000000A6 +:10DA8000000000000000000000000000FFFF3F3C1D +:10DA90003D3D000000007F7C737000000000FFFF30 +:10DAA000FF00DFDFDCDC000000003C3C3F3C555D5C +:10DAB000555D800080F05F505F50B0FF000043FF75 +:10DAC000C3FF00000000B0BFF0FF0000FF00FF0C2C +:10DAD0002F2F28283F3C1F14000014140C0C0C0C92 +:10DAE000555F000F00000000000000000000000073 +:10DAF0000000000000000000000000000000000026 +:10DB0000000000000000000000000000B200B200B1 +:10DB100003000101000000004F4C434000000000E2 +:10DB20000F0F5555D3D3D0D00000000000000F00D8 +:10DB3000000C000C800380F33F3F3030B0FF00004A +:10DB400043C3C3FF00000000101FF0FF00000000EF +:10DB50000C0C0F0F00000F001F1428280000FF0CF2 +:10DB60000C0C5555000000000000000000000000F3 +:10DB700000000000000000000000000000000000A5 +:10DB800000000000000000000000000000008061B4 +:10DB90000026000D000000610006000D00010000DD +:10DBA00000000000000005614A25050100A0006199 +:10DBB000000E000D0000A0610006001D00010061C4 +:10DBC0000006001D000000610006000D00000000BE +:10DBD0000040000F000C0000A0615006009D0005F1 +:10DBE0000061000F000D00000000000000000000B8 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000553CFF0F0000000065 +:10DC2000000000000000000014141F1F3C7C3C7C1E +:10DC3000003F00FF0000000082823F038ABACAFA58 +:10DC40003C3C3C2845EF45EF00C330F3FF02FF02A8 +:10DC5000000000000F0F3C3C00000000000000002E +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC900000000000000000000000553C000F0000E4 +:10DCA00000000000000000000000141414140050D4 +:10DCB0000050003F000F00000000BEBE3F038ABAC4 +:10DCC0000A3A3C3C302055FF41EB00C328EBAA0048 +:10DCD0000000000000000F0F3C3C000000000000AE +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000035353535000000007D7DCF0C5A +:10DD2000FFFFE1F500000000000000001F1F5F0F73 +:10DD3000303075750000000000000000D73FD703A9 +:10DD400014BEFAFA000300035353F0005FBE5FBE37 +:10DD50003C3C00F00000000000003C3C00005F0F75 +:10DD60003F0F000000000000000000000000000065 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD9000000000000000FFF00F0000000000414103 +:10DDA000CF0C0000A0B4000000000000000014141C +:10DDB0005500303030300000000000000000143FFB +:10DDC000140314BE5050000300035353FF0F5F149D +:10DDD0005F14AFAFFFFF0000000000003C3C0000FC +:10DDE00055003C00000000000000000000000000A2 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000880040000210841094 +:10DE20008802040088000402200288008800840020 +:10DE3000200004082000850285090200401040806F +:10DE4000210004002040021082004000040840002D +:10DE500002002000880820000003040008004000A1 +:10DE6000200000000400000420108800840010003E +:10DE70000000200040002000880084002000840072 +:10DE800020084000880088002004200804002000AA +:10DE900040000004200000044000000000000001D9 +:10DEA00040000000090200000000000140000002E4 +:10DEB0000000419000000002080002008000000104 +:10DEC0000910080000004001A00000000000000050 +:10DED00000008000090000004000000000008000F9 +:10DEE00000000000000000A00084400100A000002D +:10DEF00000000000000000C0000000000000000062 +:10DF00000000000000000000404000000000090088 +:10DF100000000000000000000000000440000000BD +:10DF200084080000000400800002000403000200D6 +:10DF3000210000000500040004000802084002005F +:10DF400040090200008801000140410500C004C0F2 +:10DF50000002000000080083081001100000020405 +:10DF600003400204031020000002000402008404A5 +:10DF7000000000000082000802000103000002040B +:10DF80000084201008020400C020040005410000A5 +:10DF9000020000000000000000000000C00080043B +:10DFA0000084000100082008004000040908080857 +:10DFB0000808020800080400800485040205808225 +:10DFC0000084A08404844040088402018804024044 +:10DFD0000210001100082000001000850808000051 +:10DFE00020000808048402840010050100000500D8 +:10DFF00000844082008400110440000810080504D9 +:10E000000001404180080001800004098008880860 +:10E010000284000000080008008200900008000050 +:10E020000009000000090040000300000002000099 +:10E03000000000030021000000210000000800088B +:10E0400000000008880800080041200000020005C8 +:10E0500004000008000900210000000800880002F8 +:10E060000000002100000000000200000000000885 +:10E0700000000008000000088403002000000021C8 +:10E080000000000300000009000000000000004044 +:10E090000011000000000009000000000000000066 +:10E0A00000000000030000A000000010000808A00D +:10E0B00000104100080008840084000200000300F2 +:10E0C0000082080020000000410003001000110041 +:10E0D00010C0000800004100000021000084001072 +:10E0E00003010000210000000800000111000000F1 +:10E0F0002100000800000800090000000000009056 +:10E10000000000A000000000000000080000000067 +:10E1100000000000000000000000000000000000FF +:10E12000000000000400040008000840000008800F +:10E1300004020802C005A000080004408402401048 +:10E140000041820988401080880008108500C000C6 +:10E150000410400008000000820000004000A008F9 +:10E160000841A02000008200080084000000040094 +:10E1700000000000040010008200A0000004410024 +:10E180000800C04000000800104008000080820025 +:10E190000000000000048200900482000000C00023 +:10E1A000000000000800100021000000210041A034 +:10E1B000001000014182400041000800000011A051 +:10E1C000A1C000A0028200014140410041010800BD +:10E1D00021004011000011000082000041400000B9 +:10E1E0000082008400C000000000119000080020A0 +:10E1F00011000000100000000810000008000008D6 +:10E200004000000000002100000883000088000496 +:10E2100000000000000040000000000000000000BE +:10E220000000000000008000A00908084004004031 +:10E230000000C00010000000104000001011A010ED +:10E240008403080084004000A00200008282C01005 +:10E250008200000010004000000008000800C0110B +:10E2600000404009082082410000880300000003AC +:10E27000A0418200000808418410000084000000D2 +:10E280000800000000020040080000000000C0007C +:10E29000000000000200000000100000A0000000CC +:10E2A00000000000000008000800040800840000CE +:10E2B000000000880000000000A000000000000036 +:10E2C0000801001003000300210000C0000010102E +:10E2D00021000000080200A00304000000C000901C +:10E2E000000000C0800080201088000008000000AE +:10E2F0000300000008A0080000004000000000002B +:10E300000084000000000000000000000000000089 +:10E310000000040000008000000000000000000079 +:10E32000000000000000090000000000C000000024 +:10E3300090000400A00010090800100082002021B5 +:10E34000001082028840008400089003000008004A +:10E350004020000483410000008000008200C020B3 +:10E360004000084108040000A00040030000000035 +:10E370004002C00300000000A000C00084000000B4 +:10E380000000000004008211840002020000A000CE +:10E39000A0000000000000090804000000000004C4 +:10E3A0000800000400040000A1000000000000902C +:10E3B00000002108200000900000112021400010E2 +:10E3C0000010004010C100001140000000020002D7 +:10E3D00004004010000040C000842008000020001D +:10E3E0004090000041204000400005000000000077 +:10E3F0000000050000A00000000000001100020065 +:10E400000000000000000000020000000900000001 +:10E410000300000021000004000041000000000093 +:10E420004100000000000000080002000900000098 +:10E430000203008200A190C000A00140821040A011 +:10E440000001000090010000A082008284400000D2 +:10E45000020000010001C00141C18440A0A100826E +:10E4600020A000050082100802A1400990058283C7 +:10E47000000000C0A102888200C00001000000006E +:10E480000000A0C0010204040420000140000000BC +:10E49000000100000000A1000000000000000000DA +:10E4A000000000000000000000000000000000006C +:10E4B000000080C100850002000300804180408090 +:10E4C00000800003000300200002200403A10011CB +:10E4D0000002801000200020000284C104C10090CE +:10E4E0000083028900020041008380902083008421 +:10E4F00080080000008002800080000000100040C2 +:10E500000002001080804080800080000041802058 +:10E510000020000300000500400000000000000093 +:10E5200000000000000000000000000000000000EB +:10E530000000000000000000000000008400020055 +:10E5400084A1008080000009000080000500100008 +:10E550002080890310002102908083101000212167 +:10E560008885200405002141402040104080C000E3 +:10E57000C00010410000200002000500050000005E +:10E580000000800000208000000300808000000068 +:10E5900000000010000000048000000400000000E3 +:10E5A000000000008080000000000000000000006B +:10E5B000000000008000000000000000000889004A +:10E5C0008200850582080400A0000882040004205F +:10E5D000A0000408C1C0A1200101A1A0C0002140E9 +:10E5E0001100A1A09000008801000100000141106D +:10E5F0001100A1880591000000000100000000004A +:10E600008490C00002008800880008019002022067 +:10E6100000000000000100000801080040010200A5 +:10E62000400020049000C00800000000000000002E +:10E63000400082009000C000C01001A000A010C0E7 +:10E6400004000091008282C100010101000100006C +:10E65000848401210183080800400140824001C0F8 +:10E66000A002002001890000A082011000828282A5 +:10E6700084410008820920C000000001000004015C +:10E6800010000000000008000000900900A00040F9 +:10E6900003C1000000000100000000008401000030 +:10E6A0000101000000000800000000000000000060 +:10E6B0000000000000000000000000002080410079 +:10E6C00000008010000200081082001020200520A9 +:10E6D000001000024088052185A00080030003008F +:10E6E0000880008405034021000000000480110020 +:10E6F00080800082032120218083000002020041EB +:10E7000080218005000008000300000000900085C3 +:10E7100000048910000021004000000000090020D2 +:10E7200000200241090000008000000000000000FD +:10E7300000000000000000000000000000020000D7 +:10E740000000000000008080008080008000000049 +:10E7500000000000418283054000C01190A12140CB +:10E76000100010039100200090801008A14021208B +:10E770002000040003A1A080100010100000000081 +:10E78000000000000020210041C002000300000042 +:10E7900000800080800000020000000000000005F2 +:10E7A00000000000000000050082000000000000E2 +:10E7B00000000000000000000080000000000001D8 +:10E7C000000000000000C088820882080400C00029 +:10E7D00082A00488840085A12008A0900800400938 +:10E7E0008805A1822101C04000080404C0011188ED +:10E7F000A00182002100A0C10840C12083010000C7 +:10E800000088000000000000010000040140010039 +:10E81000A000C082101010000001000000000000E5 +:10E8200000000082001000000000000500A00000B1 +:10E8300000000000000000000000000400200000B4 +:10E840000000000000000000000000000000500078 +:10E8500000000000000000000000000007000000B1 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000600632 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000810000E0000000000081000007007F :10E8B0000000000000000000000000000000000058 -:10E8C0000000000000000000000000000000000048 -:10E8D0000000663CFFF0C0E0C0F0FF00666600008C -:10E8E000000000000000000000000099787800009F -:10E8F0000000000000000000000000000000000018 -:10E9000000000000201040802010408020041008EB -:10E910002004400200000000000000000000000091 +:10E8C000000000000000F8F9F9F98089868F000F38 +:10E8D0000000909003F300000000F0F400243E06D6 +:10E8E0003C00999999100C1800006F6F6E6E6220B1 +:10E8F0006220FF3FF03FF0FF3C66F3E730E7181877 +:10E9000000C3000000000000000000000000000044 +:10E9100000000000009966FF66F0C3C3000000001D :10E9200000000000000000000000000000000000E7 :10E9300000000000000000000000000000000000D7 -:10E9400000000000000000000000000000000000C7 -:10E9500000000000663C00F0C3E7C3FFF0F03C3C61 -:10E9600000000000000000000000000066FF787852 -:10E970000000000000000000000000000000000097 -:10E980000000000100000408020104080201400226 -:10E99000800110088001000000000000000000005D +:10E940000000000000000000F8F9F9998089868F26 +:10E95000000F00FF9F9F03F300000000F0F400246D +:10E960003E063C00999910100C18C3C366666E6E83 +:10E97000622062200F3F003FF0003C66F3E730E783 +:10E98000303000C300000000000000000000000064 +:10E990000000000000004B4B4B4B66C3C3C300009C :10E9A0000000000000000000000000000000000067 :10E9B0000000000000000000000000000000000057 :10E9C0000000000000000000000000000000000047 @@ -85687,479 +85687,479 @@ :10EA100000000000000000000000000000000000F6 :10EA200000000000000000000000000000000000E6 :10EA300000000000000000000000000000000000D6 -:10EA4000000000000000000000000000BDBD069FA7 -:10EA50000000000000000000009966FF00C100C136 -:10EA600000000000000000000000000000000000A6 -:10EA7000000000000000000000000000F00036363A -:10EA8000000000000000000000000102080410085F -:10EA90002004102008040000A00500000000000071 -:10EAA000000000000000C3F000990000000000001A -:10EAB0000000000000000000000000000000000056 -:10EAC00000000000000000000000000000002424FE -:10EAD000069F00000000000000002D2D2D2D00F9E4 -:10EAE00000F900000000000000000000000000002D -:10EAF0000000000000000000000000000000F00026 -:10EB00003636000000000080000000008040102029 -:10EB10008001400280400102A005000000000000CA -:10EB20000000000000000000C3F0FF99000000009A -:10EB300000000000000000000000000000000000D5 -:10EB4000000000000000000000000000006100075D -:10EB50000009000500000000000000000061000640 -:10EB6000000D0000A0610006000D0000006100071C -:10EB7000000D0000A5610A0D050900A005000A08A6 -:10EB8000050000A500610007000D000000006061A5 -:10EB90000007000D100000610006000D08000000D5 -:10EBA00000000000000005610A0F050D00A0000034 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000EBF06A -:10EBD000EBF0000102030000000000000000000054 -:10EBE0000000000001017D41CFCF000000000000C7 -:10EBF0000000287DFAFAFFFF1C0CFFC0FFC00000D8 -:10EC00000000000000000000000000000000000004 -:10EC100000000000FF000F0F0000000000000000D7 -:10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000000000000000D4 +:10EA40000000000000000000C2F2CEFE0000000046 +:10EA50003CBD3CBDF101F909000000000F0B0602AE +:10EA600006FF00FF0F6F2F2F00000000FF00FF00C8 +:10EA7000FF0F3F0F00FF00FFFD00FDFF0000000043 +:10EA8000F0E0FFEF6F007F0000003F006F0000002C +:10EA900000000000000099E100E13030DB18F0C018 +:10EAA000F09000000000000000000000000042663E +:10EAB0004260000000003E3E06FF00000000000033 +:10EAC0000000000000006E6E666FC2F2C2F200002D +:10EAD00000002020FFFFF1019909000000002F2B0A +:10EAE00026220606000000662424000000006600BE +:10EAF0003C000F0F3F0F06FF3EFFF400F4FF000045 +:10EB00000000C0E0CFEF66007E0000003F006F0015 +:10EB10000000000000000000FFE166E1F3F3DB18F5 +:10EB200000C0009000000000000000000000000095 +:10EB3000426F426900000000060606060000000061 +:10EB400000000000000000000C0C000F0061000637 +:10EB5000000D000000610006009D0001A06100069C +:10EB6000000D00000061000E000D000500610006B0 +:10EB7000009D0005A0615006001D00000061000618 +:10EB8000001D000000610006009D00000000006103 +:10EB90005006000D000000610006000D000000613D +:10EBA0005006001D000000610006000D000000611D +:10EBB0000007800D000105000A28050000A50000DF +:10EBC0000000000000000000000000000005000040 +:10EBD00000000000000000000000AA004A4A0000F7 +:10EBE0000000CF05C0055F0A4141F330EB287D41AD +:10EBF0007D41000000007D28AFAFD310D3103F3F10 +:10EC000030300000000010001000C0C30000000001 +:10EC1000000000000FFF0AFF7F2F7020000000009F +:10EC200000000000A4F4AEFE0000000000000000A0 +:10EC300000000000F0FCF8F80000000000000000F8 :10EC400000000000000000000000000000000000C4 -:10EC5000FFFF55FFFFFFFFFF000000000000000066 -:10EC6000EBEBF3F3000000017D410C0C0000000011 -:10EC700000000000287D5050FFFF3C3CFFC0FFFF1C -:10EC80000000000000000000000000000000000084 -:10EC9000000000000000C3C3555500000000000143 -:10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 +:10EC5000000000000000000000000000AA00EAEA36 +:10EC600000000000CF05C0055F0AEBEB00000000CC +:10EC70004D4D5555000000007D280505DF1CDF1CAB +:10EC80003D383D38000000003000000040410000E9 +:10EC90000000000000000F3F0AFFFFFFF0F000003F +:10ECA00000000000000004540E5E000000000000A0 +:10ECB000000000000000003C2828000000000000C8 :10ECC0000000000000000000000000000000000044 -:10ECD0000000C0C0000040400183000000000000B0 -:10ECE000000000F300EB000000FFF5FC05FCFF1442 -:10ECF0000F00000000000000000055F000FC5F0F56 -:10ED00001C0C0000000000000000000000000000DB -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 +:10ECD00000005D5D7D55000000000000000000F0B8 +:10ECE00000F0FDAD5D0D0000000000A3F0A3C3AB7C +:10ECF000C3FB5F0A5F0A005500C31F145F5528302D +:10ED0000FFF3D7CFD70CF0C3F0FF82AAA0AAFFFF72 +:10ED1000DFCB0000000000003F3F0FAFFF000F0FF0 +:10ED20000000000000000000000000003F3C5F55B4 :10ED300000000000000000000000000000000000D3 :10ED400000000000000000000000000000000000C3 -:10ED500000000000C0CF000F000000820000000093 -:10ED60000000000000F300EB000000FFF50C050CB4 -:10ED7000FFD70F00000000000000000000F000F0CE -:10ED80005FFF1C3C000000000000000000000000CD -:10ED90000000000000000000000000000000000073 -:10EDA0000000000001000000000000000000000062 -:10EDB0000000000000000000000000000000000053 +:10ED5000000000000C0C3C0000000000000000005F +:10ED600030303030F8A85808000000000FA3FFA38F +:10ED7000C301C3517D7D2828000F000F1F140F0011 +:10ED80000030D7F314CF140CF000F03CAAAAAAAAC2 +:10ED9000000000000000000000003F3F0FA03C3CCE +:10EDA00055550000000000000000000000000F00AA +:10EDB0000F00000000000000000000000000000044 :10EDC0000000000000000000000000000000000043 -:10EDD00000000000000000000000000020002000F3 -:10EDE00004000000840020400008001140000000E2 -:10EDF0000141000000000002C000400000020000CD -:10EE0000000000002084000000000000000340001B -:10EE100000000400000000030000208020040080A7 -:10EE20000000000000000000820000080000000256 -:10EE30002000008204800080000000000000040028 -:10EE400000000000000000040000000000000003BB -:10EE500040000000000000000002000220001090AE -:10EE6000400000000000000000000000000221023D -:10EE700000020800000000004001000000C0000186 -:10EE800000020000000000200082000000000000DE -:10EE9000000021000000000000000000000440010C -:10EEA0000002000000000000000000000000000060 -:10EEB00000820000000200020002000000000000CA -:10EEC0000002000000000000000000000000000040 -:10EED00000000000000020000000000300800090FF -:10EEE0000200040002000000020000008800000090 -:10EEF000020090009000020084000408010000025B -:10EF00000002000000000000000000400200042198 -:10EF100000000000000000000200000000000000EF -:10EF2000000000000000040000000000000000409D -:10EF3000000400000020002000200020000000004D -:10EF400000000200000000000000000000000000BF -:10EF5000020010000000000000000000004000104F -:10EF600000410008000009C00008030803080484E9 -:10EF700000000008118811880000000000832000B4 -:10EF800000010009008200900082008220C000027F -:10EF900085000208000000000000000000000008DA -:10EFA00000000000000800004108000020000008E8 -:10EFB00000100001000802C10005000100010082EC -:10EFC00000080000008400000008000000000004A9 -:10EFD0000084000000080000000000000000A021E4 -:10EFE000000200000002A0000400900002110421B1 -:10EFF0000404000900404000100000000000000868 -:10F0000000210000000004000008000000000000D3 -:10F01000041000000000040091080000000000003F -:10F020000000400002008400C00040809084200066 -:10F0300088000000010500200004400000000100DD -:10F0400000000000000000000000000000000000C0 -:10F050000000000000000040000000000000000070 -:10F0600000000000000000000400210041000040FA -:10F070000000400000000300000000A0002000028B -:10F0800041001000410408000000081000000000CA -:10F090000000000000882100000020001100400056 -:10F0A000000000008040800000A0009000040004E8 -:10F0B00000000000008820000001000000000004A3 -:10F0C0002000000000000000000800000000000018 -:10F0D00000000000000000000090000000000000A0 -:10F0E000000000000809100982000000081100005B -:10F0F0000800080010408200080000408202080456 -:10F10000080400400005004000110000002000003D -:10F110000000002020200011A02004410005200054 -:10F120002000000000040004900200040000000021 -:10F130000000000000000080008404022005050596 -:10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF -:10F160000000000000080020000000000300000074 -:10F1700008000408090000A00000000000C002C050 -:10F180000000000003000590108811040800000032 -:10F19000000003C00009000900000041A0040000B5 -:10F1A00080C090000000000108210800000100005C -:10F1B00005000000080011000020002000200000D1 -:10F1C0002020080000002100080008900300030030 -:10F1D0000300000000000000040000000000000028 -:10F1E0000000000000000000000300004040000597 -:10F1F0000005000000000000020000000000080000 -:10F20000080000000800C080202000208284000048 -:10F2100000000000000000000000000000002000CE -:10F220000800A00040000000000010080000C0809E -:10F230000141000000020000202000208200200088 -:10F24000004100002100000000000000000000005C -:10F2500000000000000000000000000000000000AE -:10F260000000000000000000040002004100000057 -:10F27000000000081000000005041000000040908D -:10F2800000000820008883200008900000C01002C1 -:10F29000008408A0030005200000210000000800F1 -:10F2A000820080C04000200000000590110405008D -:10F2B000000420904088000405889101000100C0EE -:10F2C000A10000000000A09011000000000000005C -:10F2D000000000000000000000000000000000002E -:10F2E000000000000000000000000800080000000E -:10F2F00000000008000000000000004000081000AE -:10F3000000000000000000000400000810000000E1 -:10F3100040002000041020008200000200002011A4 -:10F320000000880004040400042000004020A00421 -:10F3300000800402000000020000200200042004FB -:10F3400020204004200900040009000000020002FF -:10F3500000090000000000000000000000000000A4 -:10F36000000000000000020000000000000000009B -:10F370000000040000000004000000C020400090D5 -:10F380000040000809000090000002000001008415 -:10F390001110000002008000000008002040000062 -:10F3A000000200000008800480828000000000004D -:10F3B000000000040000000000000000800120891F -:10F3C00080410001000189040000020000000000EB -:10F3D0000200000000000000000000880000080497 -:10F3E000008800040000080000000000110001A0D7 -:10F3F0000088008200A00000000000000000000063 -:10F4000000000000000002C0409000881082000050 -:10F4100002014101000100A0009000020002000072 -:10F4200000000000000000A0002001040090000087 -:10F430008320000240909004021000C01110C040D0 -:10F44000000000000000000001000400890000002E -:10F4500000000000000000000000000000000000AC +:10EDD0000000000000002000C0000004401084007B +:10EDE000200004048800820020002004020020107B +:10EDF000850002821080880804000000400040085E +:10EE0000400088418490840388082103204020002A +:10EE100000002000200000038800200504002010CE +:10EE2000C000200020008209840040004000000350 +:10EE300020000100040004008400880020008440B9 +:10EE400020002000200020008800200040048404CE +:10EE500020000400200020080000020004004100FF +:10EE6000000004000000000200000200008209000F +:10EE700000004000040380080000000004000002BD +:10EE80002000000040004102000020202000000976 +:10EE900000000000400000000000004000000000F2 +:10EEA000000400000000000000000000000000005E +:10EEB000200004001000200000000000000000A05E +:10EEC0000000090000000400000000000000000035 +:10EED00000004000000021000000040002100008B3 +:10EEE00002021000010300000004000040002000A6 +:10EEF0008310000000000000109004800000080053 +:10EF000001800000000000020004000882090004E3 +:10EF100008020800000000100010000002000000BD +:10EF200002000003000000080005010002080000C4 +:10EF30000000001082080000400002000000008075 +:10EF400000000000000500000000000000000000BC +:10EF50000002000000080000020000000004008918 +:10EF6000008402010010020840000000408882086E +:10EF7000008840C0400040100382C00803400310D6 +:10EF800083084002208400844183000040840440C0 +:10EF9000400984850000000800880908000000403E +:10EFA00009080040000000880009000840000484AF +:10EFB0000082058404084088004080842084000486 +:10EFC0004002000000080008000800C040000008DF +:10EFD0000008000000080484000800100010001061 +:10EFE00000000010002100200240080382020000FF +:10EFF0008803002184218202820000000002002197 +:10F0000000080041402004030011C000A000880255 +:10F010000910A02020082040C12000092000000085 +:10F0200020080003000082080000000000104010CB +:10F0300000000003000082000000000000109000AB +:10F04000000800000008820000000000000900081D +:10F050000000000000000421001020002008200013 +:10F06000000000080000008200028001000000A1F2 +:10F070004140000041080940210000000000000854 +:10F0800008841000050041A00282000011840800DD +:10F0900003218889418484A005000800218800009C +:10F0A00000000900008200000300000003000000CF +:10F0B00008000000210008A00000000000082190C6 +:10F0C000000000000840004000000000000000A018 +:10F0D0000000000000000000030003008300800027 +:10F0E000800082008221400004000805C102C000A7 +:10F0F0000411400010100840C000820208044002C1 +:10F100000804A0020802A005000400000011C000CD +:10F1100082200811A002A111201090000800001008 +:10F1200000040000000400008200820408000000C7 +:10F13000000008002000044004008200400010008D +:10F1400000050002A020000000000840A00082008E +:10F150000000000008000000040000000000820021 +:10F16000A0000000000009008000080000004040EE +:10F17000080000000008890184900090009000C001 +:10F1800080010000000000A00000009003000000CB +:10F1900000081190400000102000900441881000E9 +:10F1A0000001100000000000000003000000030048 +:10F1B0000000008800000800000800002184000210 +:10F1C0004100000811010090110021001100110000 +:10F1D0004000410800000000000000001100000095 +:10F1E0000000000004000000080490118208C0081C +:10F1F00002C0840882050040822000000040C02137 +:10F200000004000082080000000000000800400028 +:10F21000820090000800000082002100100400001D +:10F2200000000000002100000000000000000000BD +:10F23000000800000000400000000000080000007E +:10F240008203000000008200000000000000C040B7 +:10F25000000300000000000000000000000000119A +:10F2600041008800000090000000004008000040BD +:10F270001000804100000000000020000200210872 +:10F2800000000000080800000084080003A021001E +:10F29000008208002184080400000084A00080038C +:10F2A0000008090021A02100000000100002000059 +:10F2B0000302000000000000089000000800110098 +:10F2C000200000001000000000000000000000000E +:10F2D00000A000000300000000000000000000008B +:10F2E00004902000030000000000020884001010B9 +:10F2F00000000000A0C0A000081008412003000387 +:10F3000000410404012182040480000088402000A0 +:10F310008200200390000840404008400004200480 +:10F32000210000020005000800000000080900217B +:10F330000000001100004000000010000000A000CC +:10F34000C000000010000400400000080800000099 +:10F35000002000000000000000210000000000006C +:10F36000080000000000000000000000080011007C +:10F370000000000000202041000003010000009078 +:10F380000000004000004008009000080800030052 +:10F390000000058400000008000002008000210039 +:10F3A000A101A088000000880300002000000000E8 +:10F3B0000000000000002100000800002000000004 +:10F3C00000000300200080000200000000C00000D8 +:10F3D00021000400000010000320200000000000B5 +:10F3E000000000000020110000002100110084A096 +:10F3F00000208802880400000801A000000102A08B +:10F40000200408042008000000000000000008009C +:10F4100001008400200000001000C001010141C172 +:10F420000120900384210284000400900404000061 +:10F4300000000000000000000000830082000000C7 +:10F4400000000000000000000000010004000000B7 +:10F4500000010001000000000000000000000000AA :10F46000000000000000000000000000000000009C -:10F4700010800000000000000000000000000000FC -:10F48000000000000000000080808000008080807C -:10F490000008400841020002008000000080008057 -:10F4A000000000000000000009800080048000804F -:10F4B000000011032089821100890080000084006F -:10F4C000000009000000110000001100A100200050 -:10F4D000000000000000000000000000000000002C +:10F4700000800200008000000002912000110003C3 +:10F48000A0822188808300040000000000000000AA +:10F49000000004008000000000098911000203023E +:10F4A00009A02190C0880088800000000000008032 +:10F4B00000000000000000000000000020008000AC +:10F4C000000000000000000000000000200000001C +:10F4D00000000040000300030002000000000000E4 :10F4E000000000000000000000000000000000001C -:10F4F000000000000021800000000000000000006B -:10F50000000000000000000000000000002080213A -:10F510000000418020000504418380008008809025 -:10F520000000000000000000008000040000000255 -:10F530000000000080C00085008200900009008269 -:10F5400080208080000400800004000020890200E8 -:10F55000030510880000000000000000000000000B -:10F56000000000000000000000000000000000009B -:10F570000000000090009000A002020000000000C7 -:10F58000000000000000000000000000A0002001BA -:10F590000491200000400100010101A1400004018C -:10F5A000A0098200000000C0000000080000000860 -:10F5B000000100020000040508C08805A0C0020088 -:10F5C00008C1084010C0000000200001008801C0F0 -:10F5D0000188010001C000000000000000000000E0 +:10F4F0000000050089098500C10020000900050001 +:10F50000C0828080000900008010200005002000DB +:10F51000000000000000000000001000210040007A +:10F52000020385008805080805908005000000009A +:10F53000800000000000000000000000000000004B +:10F5400000000000000000000000000004000500B2 +:10F5500005004100008000000000004000000000A5 +:10F560000000000000000000000000000008000093 +:10F570000008000090001000A10009201040C00009 +:10F580004100C0898808040010A0820101A0000089 +:10F59000000000000000000000000020002001002A +:10F5A0000100010102108301110200C00800A00047 +:10F5B0002000040000000000000000000000000027 +:10F5C000000000000000000000000000000001003A +:10F5D00000000000010000C000000000004000002A :10F5E000000000000000000000000000000000001B -:10F5F00000000000000000100010001020000000BB -:10F60000000000000000000000000000000008886A -:10F6100000080082C1A00001010101000000A090CB -:10F620000008022004200000000004000000A100E7 -:10F63000A00040000800000091858441C0218203A1 -:10F6400005900810C0888804000004000400010030 -:10F650000000080120000001000000000000000080 +:10F5F0000000000000008210001100109082000046 +:10F6000001000101000140110090008482C100004E +:10F61000000082000000008500030040008500001B +:10F62000000000000000820800A0A1829105409027 +:10F630000088108409A00000000000000000000005 +:10F6400000000001000100010000000000000000B7 +:10F6500000000000040000010000000000000000A5 :10F66000000000000000000000000000000000009A -:10F670000000000000000000000000000080020008 -:10F68000000000000000000000000000000000007A -:10F6900080000000000009000002100210030005B5 -:10F6A00000000000800080000500000080000000D5 -:10F6B0004100000080008400000041204040832081 -:10F6C00040884105808580400980040000000000DA -:10F6D00002001003800280030520030000000000E8 +:10F6700000002000000000000011009000C1008583 +:10F68000000940050321000300C0110440A005C18A +:10F6900000000000000000000010009000C1000207 +:10F6A000004004050220002080C12083A003839134 +:10F6B0008000008000808200000000000000000048 +:10F6C00000000005000400100041000000000000E0 +:10F6D00000000003000500050041000011000900C2 :10F6E000000000000000000000000000000000001A -:10F6F000000000000000000000008000800000808A -:10F700008000000000000000000000000000000079 -:10F710000000800000000080800009A1402102005C -:10F7200003100000800400008000000000090000B9 -:10F73000000080080004800080000000210090008C -:10F740000400000000000003800000000000000929 -:10F750000000000040000204090004040000000052 -:10F760000000000000000000000000000000000099 -:10F7700000000000000000000000000008008210EF -:10F780008804A0000000000000000000000000004D -:10F7900000000000100088A0A08410000189010072 -:10F7A000010000004000408808A0040000000000A4 -:10F7B0000000000090010001900090000000910006 -:10F7C0000208218440009000889082909000000000 -:10F7D000000000000000018801010000000000009E +:10F6F000000000008000000003000089000200807C +:10F70000804041850889098003098421A100840083 +:10F71000800041800900210020000020000000003E +:10F7200000002100020409090304C1842090200084 +:10F7300005110000008000800000000000000000B3 +:10F7400000000000000000000000000000000000B9 +:10F750000000000000800000000000402100400088 +:10F760002000200000000000000000000000000059 +:10F770000000000000080000000000800403A0401A +:10F780008482A00101A001030082010002010402A1 +:10F790000500A00001400000010001000001000080 +:10F7A0000000000001200101000001000311A0A1E0 +:10F7B00004C004010000000200040000000000007A +:10F7C0000000000000000000000000000000000039 +:10F7D00000000000000000400000000000000100E8 :10F7E0000000000000000000000000000000000019 -:10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 +:10F7F00000000000000000000000000000100000F9 +:10F800000000000000000081000007000000000070 :10F8100000000000000000000000000000000000E8 -:10F8200000E0000000810000000007000000000070 -:10F83000000007000000000000E007004100000099 -:10F84000000000E000004842000000E000004842E4 -:10F85000000000E007000000000000E00700601268 -:10F860000000000000000000000000000000000098 -:10F870000000000000000000000000000000000088 -:10F88000F404F404F303F30300000000000000009C -:10F8900000000000000000000CFC0CFCFFAAF03C83 -:10F8A0000000000000000000FF2C002CCFCFCF0094 -:10F8B0000000000000000000030300000000000042 -:10F8C0000000001100220410082000110022001185 -:10F8D0000022000000000000000000000000000006 +:10F820000000000000000000000000000000810057 +:10F8300000E00000000600000000000000000000E2 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000006000000000000000000038 +:10F870000000000000000000500002E00000000056 +:10F880003C3C00FFAAFFF03C00000000000000002C +:10F8900050F3500314BEF5F5000000000000000016 +:10F8A00000000000F8F0FFF0000000000000000081 +:10F8B0000FFF0F00C3C0555000000000A0A0820041 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000000000000000000000000028 :10F8E0000000000000000000000000000000000018 :10F8F0000000000000000000000000000000000008 -:10F900000000F404FF0FF303F30300000000000005 -:10F9100000000000000000000000A0A0AFAF00AA9F -:10F92000F03C0000000000000000FFEF00EFCFCF30 -:10F93000CF000000000000000000030300000000F2 -:10F94000000000001100220001400280110022008E -:10F950001100220000000000000000000000000074 +:10F9000000003C3CF0F0AA00F03C000000000000C9 +:10F9100000005FF35F0314BEA0A000000000000021 +:10F92000000000000000F8F0F8F000000000000007 +:10F93000000055C355C3FFF0FFF000000000A0A079 +:10F9400082AA00000000000000000000000000008B +:10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 -:10F9800000000000F4F0FCF8F202F70700000000AD -:10F99000000000000000000000000000FF3CAAF092 -:10F9A0003B3FFBFF000000000000000094809480BB -:10F9B00057FFFFFF000000000000000000000000F3 -:10F9C0000000000000000410014006000006069040 -:10F9D00000000408102000000000000000000000EB +:10F980000000000000D2AAD27D714D4100000000AD +:10F990003C3CFFAA40037C3F5CFC5C0C0000000088 +:10F9A0000000000000000000000000000000000057 +:10F9B000000000000F0F03FF0000000020E02CEC0F +:10F9C0000CFC0CFC00000000000000000000000027 +:10F9D0000000000000000000000000000000000027 :10F9E0000000000000000000000000000000000017 :10F9F0000000000000000000000000000000000007 -:10FA0000000000000000F4F0FCF88080D0D000007E -:10FA10000000000000000000000000000000003CAA -:10FA2000AAF0393DF9FD00000000000000000000D0 -:10FA3000FFFF5757FFFF000000000000000000809C -:10FA400000000000000000000820028090000090EC -:10FA5000000006900102408000000000000000004D +:10FA000000000000000055D2FFD25D515D510000A2 +:10FA100000000F0F550040007C3C5CFC5C0C0000BB +:10FA200000000000000000000000000000000000D6 +:10FA3000000000000000050500F57D707D7023E3E7 +:10FA40002FEF0AFA00FF0000000000000000000095 +:10FA500000000000000000000000000000000000A6 :10FA60000000000000000000000000000000000096 :10FA70000000000000000000000000000000000086 -:10FA800000000000000000008000000000000000F6 -:10FA90000000000000000000000000000000000066 -:10FAA000800050000000000000600005000D000014 -:10FAB000000000080000000005000A08050000A082 -:10FAC00005610A0F050D00A0000060610007000D30 -:10FAD000100000610007000D080005610A0F050D08 -:10FAE00000A005610A0F050D00A000000000000045 +:10FA8000000000000000000000610006000D000002 +:10FA900000610026000D000800610006009D0000C6 +:10FAA00000610006000D000000610006001D00005E +:10FAB00000610006000D000000615007801D00007D +:10FAC0000000000000000001000000000000000035 +:10FAD000000000610006000D0000000000000000B2 +:10FAE000000000610006000D000000610006000D2E :10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB200000000000000000000000F9FCFCFC1000D8 -:10FB300010000000000000000000000000000000B5 -:10FB400000000000000000000000000000000000B5 -:10FB5000FC82FCBE0000000001000100000000006B -:10FB600000000000D7CF14CF0E3ECEFE00000000F4 +:10FB0000000000650006800F2000000000000F0FBD +:10FB100028EBCFCF82BE30F020E00F0FFF00F0FACD +:10FB20003CBEAF0F2F2F0000000000000000F800C7 +:10FB3000FFFF3FAA30AAF0F2F0F0FF3C1717207F3A +:10FB4000707F0000000000000000000000000000C6 +:10FB5000000000000000000030BA3CBE00000000C1 +:10FB6000000000000000000030FFBABAFF1E001EB7 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 -:10FB90000000000000000000000000000000000065 -:10FBA000000000000000000000000000090C0C0C28 -:10FBB0001000000000000000000000000000000035 -:10FBC000000000000000000000000000000000A095 -:10FBD0000000C082C0BE0000000001000100000063 -:10FBE000000000000000D70C140C0232C2F200002A +:10FB90000F0F2B2B0C0C82BE00C020E05555FF0030 +:10FBA00000AA00AAAF0F2F2F0000000000000000E5 +:10FBB0002800FFFFAFAAA0AAF0F0F0F0C3001717CB +:10FBC000207F202F00000000000000000000000047 +:10FBD0000000000000000000000030BA00AA000091 +:10FBE0000000000000000000000030303030FF0056 :10FBF0000000000000000000000000000000000005 :10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 -:10FC200000000000000000000000000000004F4144 -:10FC30000F00CACA0F000000000000000000000012 -:10FC400000000000000000000000000000000000B4 +:10FC100000005F503F3F003CC3FF3C3C5404FF0DDD +:10FC2000F301000000000000000030303030000020 +:10FC3000000000000000B200B23CF0C3F055555582 +:10FC40003C3CBEBEA0F5000000000000000000002B :10FC500000000000000000000000000000000000A4 -:10FC60000000000000000000000000001ABA1FBFE2 -:10FC70000000000000000000000000000000000084 +:10FC600000000000000000000000000030BABABA36 +:10FC7000F5FCF50C00000000000000000000000092 :10FC80000000000000000000000000000000000074 -:10FC90000000000000000000000000000000000064 -:10FCA0000000000000000000000000000000000054 -:10FCB0000F000F003A3A0F000000000000000000A3 -:10FCC0000000000000000000000000000000000034 -:10FCD0000000002000000000000000000000000004 -:10FCE000000000000000000000000000000010B054 -:10FCF00015B500000000000000000000000000003A +:10FC9000000000005F503030B2B2B2B23C3CFEAE69 +:10FCA000FE0CF2000000000000000000003C003CE0 +:10FCB0000000000000000000B2C3B2FF000000001E +:10FCC0000F0FFF001414A0F500000000000000005A +:10FCD0000000000000000000000000000000000024 +:10FCE000000000000000000000000000000030BA2A +:10FCF000303005FC050C0000000000000000000092 :10FD000000000000000000000000000000000000F3 -:10FD100000002002882000000000042004000000F1 -:10FD200088048400200020000000840088112080C6 -:10FD300041802000400000040004200020008802D0 -:10FD40000400000020022000820020002000200883 -:10FD500088880003040000008800000020002002C2 -:10FD600000042002000000000000000220008800C3 -:10FD700000082184200040008400000020002000B2 -:10FD80000000020400000400000000040000200045 -:10FD9000000820081090000200000002000200C0CD -:10FDA00000020000000000004002400200000000CD -:10FDB0000008A0080002000000C0000200001000BF -:10FDC0000000000000000000000000000000000033 -:10FDD00000210003000000000000000000000000FF -:10FDE00000000040000000000000000000000002D1 -:10FDF00000000001100300000000000000000000EF -:10FE000000000002000000000000000000000000F0 -:10FE1000000000030000000002000000820000005B -:10FE20000000821088000000004002000400000072 -:10FE30000000000002000000820004040004000032 -:10FE4000000082000000820002000000A00000000C -:10FE50000000002000000000000000000000000082 -:10FE60001000000010001000000002000000000060 -:10FE70002000200000000008000002000000000038 -:10FE80000000000000002000000002000000000050 -:10FE900000008400020000000008030800000000C9 -:10FEA00003000000028400080008000800080000A9 -:10FEB0000008008400840084088408840000008412 -:10FEC0000088000004000088008800820084000090 -:10FED000008400400008000800000000000000004E -:10FEE00000040008000000080008000000000000F6 -:10FEF000000800A020000004020800000008000024 -:10FF00000008000800000008004000000000000099 -:10FF10000040008400000088004040218221002130 -:10FF20009021000040050000080540210003042145 -:10FF30000021400010418441040200050010000926 -:10FF400004050000904184080021400904210000BC -:10FF5000000800080000000000A1000040218421EA -:10FF6000840584081021000084008421400500419C -:10FF7000000040000008000090080005000000009C -:10FF8000000000000000000000000000040000006D -:10FF900000000000000800000000208000000010A9 -:10FFA00000900000110800020000000200000300A1 -:10FFB00040000300000008000000080000000000EE -:10FFC0000300050800A0000000000002000400007B -:10FFD000009000A040200900090009040000000072 -:10FFE000030011040200000000C000C00000000077 -:10FFF0000004000400000000000000000020008455 +:10FD1000000088002000200004030005840800087B +:10FD20008400820520004000820520108400210408 +:10FD300005880408880020008200880088040010DC +:10FD4000400420002000880020000400040004007B +:10FD5000218800034000200020008400001088005B +:10FD60008400C000840588002009820084002000EF +:10FD70008982C18088088800200088000000200057 +:10FD800020082003C0002000880020002000200060 +:10FD9000200821820400100005002000000000025D +:10FDA000000400000000050005841000090009009F +:10FDB0001002100400000400000009000000000010 +:10FDC000000009C000000000040000000000000066 +:10FDD00009001003000004000400000000000000FF +:10FDE00010000000000000002000000000002000C3 +:10FDF00000000404041000000000000010000000D7 +:10FE000000000002040000000000000000040000E8 +:10FE10001000100004211000000000400400004009 +:10FE2000A000A00000108210A00800100000000038 +:10FE3000840800049010000000000000884000408A +:10FE40000000000004108400000000000400000016 +:10FE5000000000410480000000001000000002408B +:10FE60000000000800000240001000100000021016 +:10FE70000000001000000010000000000000000062 +:10FE80000040000000000000000000000000000032 +:10FE9000000000000000004000000084008400001A +:10FEA000100400840084118209C040842084410031 +:10FEB000040800A0001040880984000840100004D5 +:10FEC000008400100004008840084010200000104A +:10FED0000082200800084102000000080008008895 +:10FEE00000104084200000100400000800080008F2 +:10FEF00000080084004000C00400008405C00088A1 +:10FF000000080000008400820002000800C0008495 +:10FF10000010000004000084400040020008C000FF +:10FF2000A040000000020009400500000041C0059B +:10FF3000000800038803820820000005002100114A +:10FF40000003000800002000080004210008000051 +:10FF50000008000800210821824000000010000570 +:10FF60000005000500000009820804050003840064 +:10FF70000000000000410000002100800402000396 +:10FF80000000000000030000000200000003000069 +:10FF90000000000000000003100000004184008207 +:10FFA0000308000221080800400008200008008221 +:10FFB0000400000000A000C02104830041082100CB +:10FFC000030808A000000800030008024100000028 +:10FFD0001084008200840010000400040000080067 +:10FFE00000000008000800000008000000080000F1 +:10FFF00000000000000000000020000808080400C5 :020000040015E5 -:1000000000000000000000A0000000000000000050 -:100010000000000000000000000000008008000058 -:1000200082000000084000102041882000200000CD -:10003000002040008400000000008200A0000000BA -:100040000000C00088000000000000000800400020 -:10005000880084000440A0000000000000000000B0 -:100060004000A000000000008221A000C000A0000D -:100070008200820088400800400090000800820052 -:100080008200820082000000000000008200000068 -:100090000000000000000200000000000000080056 -:1000A0000084000000000000004000000840002024 -:1000B000000000404000000000000208000041086D -:1000C000211000000090000000000000000000006F -:1000D00000A00000000040000200009009000000A5 -:1000E0000000000000000000000000000004080004 -:1000F0000000000000000000000002000088000076 -:1001000000000000000000000000000000000000EF -:1001100008000000000000000000000000000000D7 -:1001200000000000000500000000000000000000CA -:1001300000000800000000000000A005A000000072 -:10014000C005C00000000000C0000000000000006A -:10015000000800000000000000000000A041400076 -:1001600000000000C010000000008200A004000099 -:100170000000000000000800080000008200C0002D -:1001800082000000A00000000000C000000000008D -:100190000000A00000000000000000000000084176 -:1001A0000000010011000000009020040000000089 -:1001B0000088000000000000000020400800092026 -:1001C0000004092021000800000400000900400488 -:1001D0000002030000000000000000200000008872 -:1001E0000090008800004084410440040500110490 -:1001F00020000504050400000000009009840000B0 -:1002000000840900008800000000000000000000D9 -:1002100000000000000000000000000000000000DE -:1002200000000000400000000000000000088811ED -:100230000004002000004000082100080809080808 -:1002400000210021000900030000000082210008B5 -:100250000000000000200800080000002011000835 -:1002600002400000A00000000800080882004000D2 -:100270000020000000210000000000000000C0027B -:10028000C04000090000000900000002080004202E -:100290008202820000000000400000000000000018 -:1002A000080040000000020000000302118410005A -:1002B000080000A0009000000000000000004000C6 -:1002C00000002000200800000000400000000000A6 -:1002D000000000000000000000000000000000001E -:1002E0000200008202000200000000000082000004 -:1002F00009000004000000000000000000000000F1 -:1003000000000000000000000000000000000000ED -:1003100000000000000000000000000000000000DD -:1003200000000000000000000000000000000000CD -:10033000000000008400000100080001000000022D -:1003400008C00000000000010000000000000000E4 -:1003500000000100000000000182000000000040D9 -:1003600010400000840000010000000000000000B8 -:1003700000000000000000000000010400008400F4 -:100380000020828200000000000100000000000048 -:1003900000000000000000000000018200000100D9 -:1003A000002010C00000000000010000000000005C -:1003B0000000000400000000004002800040110026 -:1003C000000080000000000000410000000000006C -:1003D00000000004020000000003200000090200E9 -:1003E000000080000000000000410000000000004C -:1003F0000000000000054000000000410400004132 -:1004000004000000808000000000004100000000A7 -:100410000000000000400000000000034000000554 -:100420000200000080000000000000410000000009 -:100430000400000000000000100000000300C100E4 -:100440000480000440000000000000008040000024 -:100450002000000000000000210000000500040052 -:100460004180004004008000000000408003000044 -:100470000000030000000000000010000000050064 -:100480001000820000400300800000000040800453 -:100490000000030000000000000010000000400009 -:1004A0009000A000000340008000000000008020B9 -:1004B000000001000000000000000000000001003A -:1004C0000800020800000100020000000000C00156 +:1000000000000000000000000000000000000000F0 +:100010000000000000000000000080000000100050 +:1000200010004005000982038211820004050811B6 +:10003000A041400508039000A000400040000800D7 +:10004000080004000000000000009004020090007E +:10005000A000000000000000C00010000000000030 +:10006000820082000000C00000000000A00008091B +:10007000A0200400C000040090111000A000820025 +:10008000A000080982401000C00000000400000029 +:100090000000040000000000A0000009900004001F +:1000A000050000C04084108410821082080010C037 +:1000B0000090000002820000000000C010008000DC +:1000C0000000004011000200002041C0410000007B +:1000D000000000000000020000000000C00200005C +:1000E0000000400000000000100800000000008236 +:1000F00000000000000000000840000000000000B8 +:1001000000000000000000000500210000000000C9 +:1001100011000000000000000000000000000000CE +:10012000000002000002000200080020000300009E +:10013000820000210005820300050011080500105F +:10014000084100100000C041A008A000C000000845 +:10015000A00082100000A000000008000000821033 +:1001600000A100002000000000000000000082004C +:100170000000A0000021002100000000000000009D +:10018000090000840000C000000008008208A000F0 +:1001900082000000000000000800000500000000D0 +:1001A0000000014008080000212005A00000000018 +:1001B0000004000002000000210000000000000018 +:1001C00000000000110000000000210000000900F4 +:1001D000002000000008038400081108100005003A +:1001E00000001104000000000000000021000000D9 +:1001F0000900000000000000000000841100000061 +:1002000000001000000300000000000000000000DB +:1002100000000000000800000000000000000900CD +:100220000000000020C01000004002000002024157 +:1002300088008841000800008200C01100040011FD +:10024000C0030011020320000010000020418210B2 +:100250000200020000000000002100104021000008 +:100260000004000810000000002100001000080039 +:100270000800004190090041080000000441820488 +:10028000A0000400000800000800040000000000B6 +:1002900004000000000000000800000000008200D0 +:1002A0000000C00000000008000000000000200066 +:1002B000008800402088202000000000000200008C +:1002C0000004200020002000000000001100088829 +:1002D0000000000004100000000000000088000082 +:1002E00009401100009100400000000000020000E1 +:1002F00000000020000000000000000000000010CE +:1003000000000000000000010000000000000000EC +:100310000000008800000000000000000000000055 +:1003200010000000000000000001000000000000BC +:10033000000000000000000000040001C0000010E8 +:10034000C0820000C00000010000000000000000AA +:10035000000100000000000001100000C000008447 +:10036000C0820000C000000100000000000000008A +:100370000000000100000000000001100000C100AA +:1003800000A0C0820000C0000001000000000000CA +:100390000000000100004000000100400000C1001A +:1003A0000082C0820000C0000001000000000000C8 +:1003B0000000001100000000000909000004820094 +:1003C000008080800000800000030000000000002A +:1003D000000000080000000000110800004191002A +:1003E000008080800000800000030000000000000A +:1003F0000000000000080000000000110880000359 +:1004000083000000808000008000000300000000E6 +:100410000000000000020000000000032000004077 +:1004200084000000808000008000000300000000C5 +:1004300041000004000000001100000011008900CC +:100440009100000003008000000000808010000088 +:10045000400000000000000009000000020005004C +:100460004080000503800000000000808003000041 +:100470000000030000000000000041000004020032 +:10048000050004000000030000000000008080055B +:100490000000050000000000000020000000020035 +:1004A0009000030000000300000000000080802096 +:1004B000000000000000000000000000000000003C +:1004C000040004C0000001001000000000C0820110 :1004D000000001000000000000000000000000001B -:1004E0000200880800010000400000000001C00177 -:1004F00000000000010000000040000001000000BA -:10050000000003000940000101004000000000015C -:10051000C00000000000000000000000010000001A -:100520000000410004400000010004000000000041 -:10053000C0010000000000000000000000000000FA -:10054000100100040000090000000000000000018C +:1004E000A000A104000001028200000000C0820000 +:1004F00000000000000000000000000000000000FC +:1005000000004000A040000001848200000000C004 +:100510008200000000000000000000000100000058 +:100520000100050040C0000001004000000000C0C4 +:100530008201000000000000000000000000020036 +:10054000C0000040000003000000000000000000A8 :10055000000000000000000000000000000000019A -:10056000080100040000010000000000000000017C +:100560000800002000000100000000000000000062 :10057000000000000000000000000000000000007B -:100580000000900000400000C100000000000000DA -:10059000000100000000000000000000000000005A -:1005A000000090000040000001000000000000007A -:1005B000000100000000000000000000000000003A -:1005C00000410008008000008300000000000000DF +:100580000000040000200000010000000000000046 +:10059000000000000000000000000000000000005B +:1005A0000001C10000080000010000000000000080 +:1005B000000000000000000000000000000000003B +:1005C00000038011008000004100000000000000D6 :1005D00000410000000000000000000000000000DA -:1005E0000005A00300000000030000000000000060 -:1005F000004100000000000000000000400000007A -:10060000000000050009000000004100000000009B +:1005E0000008800200000000410000000000000040 +:1005F00000410000000000000000000000000000BA +:100600000000000300100000000041000000000096 :100610000000004100000000000000000000000099 -:1006200000000005002000000000030000000000A2 -:1006300000000041000000000004008300000004EE -:100640008000C000000000C18040000800000000E1 -:100650000020000003040020800000C10000000012 -:100660000020030000000041000400200000000002 -:10067000000900004003000000008000004000006E -:10068000000000000300000000C180000020000006 -:1006900000000000000005030003800000C100000E -:1006A00000000000030000000041004000200000A6 -:1006B00000000040000003410000840100830000AE -:1006C00000010800080000000041100100010000C6 -:1006D00000000001000001050001200000400000B2 -:1006E00000008201820000000003100100010000F0 -:1006F00000000000000000C1000000008200004077 -:10070000000000008200820000000009400000019B -:10071000000000000000000000A0000020000040D9 -:1007200000000000820082000000009140010001F2 -:10073000000000000000000001A100000000000017 -:1007400000000000000000000000811200E007002F -:100750004800000000000000000000000000000051 +:1006200000000005840300000000410000000000FD +:1006300000000041000000000004008300000000F2 +:10064000800005000000004100000009000000419A +:100650000000000020C00040800000C10000000039 +:10066000000009000000004180000002000000417D +:1006700000000000028400000003800000C10000B0 +:10068000000000000900000000418000000500009B +:1006900000410000000020100000800500830000E1 +:1006A0000000000002000000004100000003000004 +:1006B000004100400000050300000400008300002A +:1006C00000004000040000000005040000000000DD +:1006D00000010000000001090001200000400000AE +:1006E00000000200C0000000000502000000000041 +:1006F0000001000000000105000000002000004093 +:10070000000000008800C00000000083020000001C +:1007100000000001000000000183000004000083CD +:10072000000000008200C100000000838200000081 +:100730000000000100000000008300000000000035 +:1007400000000000000000000082811200E00700AD +:100750004842000000000000484200000000000085 :1007600000000000000000000000811200E007000F -:100770004800000000000000000000000000000031 +:100770004842000000000000484200000000000065 :10078000000000000000000000000000811200E0F6 -:1007900007004811000000000000000000000000F9 -:1007A000000000000000000000000000811200E0D6 -:1007B00007004800000000000000000A00000000E0 +:10079000070048420000000000004842000000003E +:1007A000000000000000000000000006811200E0D0 +:1007B000070048420000000000004842000000001E :1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 @@ -86176,15 +86176,15 @@ :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 -:1008C000757B000000000000000000000000000038 -:1008D0000000000000000000000000000000DEAE8C -:1008E000757B000000000000000000000000000018 -:1008F0000000000000000000000000000000DEAE6C -:100900000000757B000000000000000000000000F7 +:1008C000257B000000000000000000000000000088 +:1008D0000000000000000000000000000000DEA496 +:1008E000257B000000000000000000000000000068 +:1008F0000000000000000000000000000000DEA476 +:100900000000257B00000000000000000000000047 :1009100000000000000000000000000000000000D7 -:10092000DEAE757B0000000000000000000000004B +:10092000DEA4257B000000000000000000000000A5 :1009300000000000000000000000000000000000B7 -:10094000DEAE612603400000000000000230A0007F +:10094000DEA4612603400000000000000230A00089 :100950000000000000000C4000000000000002C089 :100960006486612603400000000000000230A00001 :100970000000000000000C4000000000000002C069 @@ -86192,436 +86192,436 @@ :10099000A0000000000000000C400000000000006B :1009A00002C064866126034000000000000002309F :1009B000A0000000000000000C400000000000004B -:1009C00002C0648688020000830820002000000026 -:1009D0000000200400410000000000022000200070 -:1009E000202020040402000000008404040004000D -:1009F00000000000000000000000000000000000F7 -:100A00000000000400032000000004002004200077 -:100A100020000000000000000002840088000000A8 -:100A200000000000000000000000000000002000A6 -:100A300000020000000000000000000084008800A8 -:100A400000000000000400014000200140020004FA -:100A50001002000400C01002400005901005800044 -:100A600080028000800000000002000200002002DE -:100A70000082000020000000110040000000000083 -:100A80000000000000000000000000000000000066 -:100A900000000000000000000082000000000000D4 -:100AA0000000000000000000000000000000000046 -:100AB000040000000000000000000000000002022E -:100AC0000000000000000000010900000104020015 -:100AD00000041000000040004000820010000000F0 -:100AE00082008200020002000000020000000800F4 -:100AF00000000000000002000000040000000000F0 -:100B000000000200000000000000200400000000BF -:100B10000000000000000000000000400000000095 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000400800842009B0 -:100B500000820008830800088040800240888000EE -:100B600000880008000000040982001080080010BE -:100B700082840088009000080000000000880300C4 -:100B80000000000800000004000800000001001040 -:100B900000000008000000000008000000040088B9 -:100BA0000008000800080000000000080000000025 -:100BB00000000084000000000004000000000000AD -:100BC00000080240000400000000000800000000CF -:100BD000000004001005000000000000000584086B -:100BE00020001000400200009008001104000000E6 -:100BF00000211000880300004000400000000000B9 -:100C00000008000800002000200084000000000010 -:100C10008800880000000000200000008210000210 -:100C2000001100000000000084000000040000002B -:100C300000000000000000000000000000000000B4 -:100C4000000000000008000000000000000000A0FC -:100C50000008040000080000000000A00800008454 -:100C60000088400000840000000000040400000030 -:100C70000000400008A0000000004100000000004B -:100C80000000008800400000A08411001100000056 -:100C900000000000200020000000000041000000D3 -:100CA00000020000000000000000000000008000C2 -:100CB00000000000000021000000030041000000CF -:100CC0000000000000000000000000000000000024 -:100CD00000C1000000C100100003004102008211A9 -:100CE000000000400010000000000008000000901C -:100CF00004000420000004000002C00400080000FA -:100D0000820082000000820000000000010020003C -:100D100000000000008000000400A00000000200AD -:100D2000000000000000000000008200040000003D -:100D300000004000000000000000A00000000000D3 -:100D400000000000A00008000000000000000000FB -:100D5000000011021100080803C100000304030091 -:100D600000000000008411000000000000210300CA -:100D700000038000A10000008000000000000000CF -:100D80000000030000000000000008000000020056 -:100D9000A100000000000004000000000000099015 -:100DA0000000001000000000000000000000000033 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000008410000000000000021004168 -:100DE000002000000010844000000010C00000003F -:100DF00000000008000000000400080000000000DF -:100E00000000000000002000200000400980820057 -:100E10000880400000000004A04100040800000217 -:100E20000010000000110000000000000000008021 -:100E30000100008000000000000000000800000029 -:100E40000000000000000000000000000000820020 -:100E500000000000000000040000400000040084C6 -:100E600000000000000400000000000000C00400BA -:100E700000000900000000000000800000080000E1 -:100E8000009000000500000000080400000020049D -:100E900011000504800000000003000000110000A4 -:100EA00021000000210000000000000009000300F4 -:100EB00000200400002000000000000000000000EE -:100EC00003000000210000000300000000000800F3 -:100ED0000000000000000000010008800000000089 -:100EE00000000000000300210003840090000000C7 -:100EF00008410940400000110000002000000000EF -:100F00000000000000000000200020000000200081 -:100F10000000080090000000000004050090050497 -:100F200000840010001000100000000000002000ED -:100F3000200000000000000004000800000008007D -:100F40000000000008000000000000000000000099 -:100F5000000000000000000000004000200200909F -:100F60000300002004400882114000000800000037 -:100F7000080000000200030008200800000008002C -:100F80000000000000000000000000080000000059 -:100F90000000000000000000080000000000410404 -:100FA000200000030000000000000000000000001E -:100FB000000000000000050000000000000000002C -:100FC0000000000000000000000000000000000021 -:100FD000000000000000000000000000408300212D -:100FE0000004049000000000C000000000010100A7 -:100FF00010010000000001000800000000000000D7 -:1010000000000000000000000000000000000000E0 -:10101000000000000204A1880990A008000002401E -:10102000004005C0409000000000000000000000EB +:1009C00002C0648621030408880020020400050098 +:1009D00084000082102088C182204084410082006F +:1009E00004822010401040842082208520002000B6 +:1009F0004000040000000400C00088114000C00056 +:100A000020002005000340000500100004008910AC +:100A10000900000004004000880020000204880053 +:100A2000C000200020002000200004002000200042 +:100A30002000400020008402880288022004400038 +:100A400041002000040040000002000000902084CB +:100A50000800000005110001100200A1842002001E +:100A6000200041110000C00080044005040800007F +:100A70000400090005000002410000000000000021 +:100A80000000000041000000800010008400000011 +:100A900008009000000000000000040000000000BA +:100AA0001000000000000400000000002002000010 +:100AB0004000000080000000000004000000000270 +:100AC000A000A090000021000000904100009004D0 +:100AD000A102000090008210A0004000000200036C +:100AE00003C0010082104080018000000108400026 +:100AF00000804002020000000080020000000400AC +:100B00000000080000410008000000000000011083 +:100B10000100020000800000009000008200000040 +:100B20000000000000000000820000000000000043 +:100B300000000000010000000000000000000008AC +:100B400000004010000000800505008800C0008201 +:100B50000089088900082088000800088008200112 +:100B60000908C0020284200080020810001004114D +:100B700083104010800989080010040203080582D0 +:100B800000100908200800100000000000082000E4 +:100B9000080102820008020800080003020000C0E9 +:100BA0000000000020100084000802080408000073 +:100BB00002000000041004080004400000080000C7 +:100BC00000840008898400000008840840080004AC +:100BD0000808000800880005000500050000080955 +:100BE000000002000008000084080000A0080021A6 +:100BF00000400408C0000021000000001021002176 +:100C0000400000400000002100000005000000102E +:100C100000100041000000000008002140410000D9 +:100C2000002100210000002100000005000000005C +:100C30000008000800000110004000000000000053 +:100C40000000000000002002202120000000000021 +:100C500000A1000000000002004000A02188000068 +:100C60000082000000900001000000000000000071 +:100C70000000000000002100000000000000000053 +:100C8000212000A008040000000000000000000077 +:100C900000840001000008102100410000008000D5 +:100CA0000000000000000308000000000000030036 +:100CB00000000000000021001009000000000000FA +:100CC0000000000000100090800080008000030001 +:100CD000C0000800000010008811081104098410E9 +:100CE00000000000840008401000040008002000FC +:100CF00008000400900010000200100008400000EE +:100D0000000082218200C004840010000400100052 +:100D100000000000080000004000A00000080800DB +:100D20004002A0001000C000A000C0000800820027 +:100D3000820082001000820000000800880000008D +:100D40008200A00008000000C0004000C0001008A1 +:100D5000080400000000410821100000000000000D +:100D6000100103020002000440908800090880007E +:100D70000300040080000300030000404100001055 +:100D8000000800000800080000000000000000004B +:100D900000000000000080A000A08000008400018E +:100DA0001000880100000000000000080000210081 +:100DB000200021000000000000000400800000006E +:100DC000000000000000000008000000800000009B +:100DD0008001050182000003A00082001040020093 +:100DE000900308400011002010008200838800203A +:100DF00000408420000008041102C0001000000020 +:100E0000000000000000000010004000080000008A +:100E1000000000000000000008000800840000003E +:100E200000000000A0110000A00300000000100856 +:100E3000000000000000000082008400C00082006A +:100E40000000820000000800A0000800040000006C +:100E5000000008080100000000000000040000007D +:100E60000000000000020000000000000000020876 +:100E700000000300000000A0000090010000020834 +:100E80000000000000A000000000000000200000A2 +:100E90000000000000C00000001080000000000002 +:100EA0004008000000840000000000000000000472 +:100EB000000000000000000000000000000003002F +:100EC0000000000000000000000000000000210001 +:100ED000000000008001200010088204000840008B +:100EE000000000000008100040800141000888A1B7 +:100EF0001000020000038200401104200009A00439 +:100F000000008209002000048204A00020208880C4 +:100F100000208200C008008000000800000082025B +:100F2000081008050800000010000008082100084B +:100F30000811000000000000400000000000001048 +:100F4000000008008200000004000008C0009000BB +:100F5000400000000800C00008004100000011002F +:100F600000000000200000000500402040000000BC +:100F70000020A10400C00002030080000000000067 +:100F8000000103202000418421400800000000846B +:100F9000000200000000000000020000002000002D +:100FA00000008000000000000000000000000000C1 +:100FB0000000000000000000000000002000000011 +:100FC000000000040000000000000000000000001D +:100FD00000000000000003000000034000010100C9 +:100FE0000900000004A0001108010005C0900110D4 +:100FF00002088802A00000014000900000010000EB +:10100000410100000000000000000000000000019D +:10101000000000000001010104000001000008C1FF +:101020000102008890409002000804880810000027 :1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:1010500000000000000000000000000000008041CF -:10106000000311900009000005000000000000418D -:101070001020001000200000030004000000000009 -:101080000000000000000000000000000000000060 -:101090000000000000008080200040000080000070 -:1010A00080004000820000000000000000000000FE +:1010400000000000000000020002008800200000F4 +:10105000000000000000020100000000020100107A +:101060000803904000209188034080050084800898 +:101070000382800200914040102080030040114113 +:101080000900C10200054000000000000000000946 +:1010900000020010002000402140801000040000E9 +:1010A00000C10311000800032000008080808080C0 :1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E00088000500024040000000000000000000F1 -:1010F00000000000000000008020000000048000CC -:10110000000080008000800000000000000000005F -:1011100000000000000000000004008300898080BF -:101120000000030409838920C08000000000000043 +:1010C00000000000000000000000000000800000A0 +:1010D000000000000000000080410011001180109D +:1010E0002000080020000808000003089180890003 +:1010F00040002102000008859000A100C0004100CE +:10110000000010A02090209100000021000000406D +:10111000000000000000000040000300090009205A +:10112000000080008010802100000000804080804E :1011300000000000000000000000000000000000AF -:10114000008000000000000000000000000000001F -:10115000000000000000000000000000000000008F -:1011600000008900040089000482000000000000E3 -:101170000000000000000000000002010200200149 -:10118000C040A00004820400C084000000000000F1 -:1011900000000000000000000000100110C0A010BE -:1011A00082C00000020102C0100310C00000000055 -:1011B00000000000000000000000000000000084AB -:1011C000000000040000000000000000000000001B -:1011D000000000000000000000000000000000000F -:1011E0000000000010020040000210C000000000DB -:1011F0000000000100010001000000010000A0004B -:101200000000010101000000840000000000000057 -:101210000000000000000000000000009188840829 -:10122000C0108305000011888420C01111890000BE -:1012300000000000000000000000000000000100AD -:10124000000004000000000000000000000000009A -:10125000000000000000000000000000000000008E -:1012600000000000000000800300098080000011E1 -:1012700000110003004100080808000200080020D7 -:10128000000500050441040000000000000000000B -:101290000000000000000000000000000000410904 -:1012A0000021801182830000C1200083802104116D -:1012B000000000000000000000000000000000002E -:1012C000040000008000000000000000000000009A -:1012D000000000000000000000000000000000000E -:1012E000000000000000000000801080098005411F -:1012F00000000000000000000000000000000000EE -:101300000000008000000000000500840080000054 -:1013100000000000000000000000000000000000CD -:10132000000500050080800000000009800080802A -:1013300000030000000000000000000000000000AA -:10134000000000000040000000000000000000005D -:10135000000000000000000000000000000000008D -:101360000000000000000000000000A001A001102B -:10137000000100000000000000000000000000006C -:101380000000000000080020000000000021000212 -:10139000000000000000000000000000000000004D -:1013A0000000900020102010100000001082041097 -:1013B0000208900000000000000000000000000093 +:10114000000000000000000000000300200040003C +:1011500041000000000000000000809000008005B9 +:10116000008800100100000001002000A000A04045 +:101170000220208803019090838809000800A100C4 +:1011800085000000010500090009004000000088FA +:101190000000000000000000000001A000000000AE +:1011A00001010000080040018821C0849000200057 +:1011B000A00282000000000000000000000000000B +:1011C000000000000000000000000000000000001F +:1011D00001200100000000000000000008111000C4 +:1011E000A00010080000010000010101888400082F +:1011F000A0C100C0088301A00090012100030041AC +:10120000018500C0000121008500010000000000F0 +:101210008200000000010001000000010001000048 +:1012200001010001000008900088009000830882FE +:101230000021002000090000000000000000000064 +:101240000000000000000000000000000000080096 +:1012500000000000880000000000000000000020E6 +:1012600009040108000000081105032108100041CD +:101270002185C02000030021088220C102030089CB +:101280002104208440C000048503211010050000C3 +:101290000000800005000010050804080008001088 +:1012A000052105210503000080110040410800C10F +:1012B000800000C00040004100000000000000006D +:1012C000000000000000000000000000000000001E +:1012D000800000000000000000000000000000008E +:1012E0000000108041000500110008000500000802 +:1012F0000002008000008041C1080408028011083B +:10130000008900000000008541048404A100050557 +:10131000C100C005820005000000000000000000C0 +:1013200041850540020002400000000400050080E5 +:1013300080000003000000008000000000000000AA +:10134000000000000000000000000000000000009D +:10135000000000808010000000020000000000007B +:101360000000090020101100200000900000010082 +:101370000001208208020882A001032111830908CC +:10138000820000C100880040000885000801A1001B +:101390004000080002008500C000000000000000BE +:1013A000000001A0000000000101000088010220EF +:1013B00002040200900090081040A000000000000D :1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E000000000000000000000000000000000E01D -:1013F0000000000A000000000000000000000000E3 -:1014000000000000000000E00000000000000000FC -:1014100007000000000000000000000000000000C5 -:1014200000000000000000E0000048420000000052 -:1014300000E0000048420000000000000000000042 -:101440000000000000000000000007000000000095 -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:101470000000AAAAF0F00000000000000000000038 -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A00000000000000040801020008100240000A7 -:1014B000000081240410082000000000000000004B +:1013D00000000000080202001000400100000000B0 +:1013E000000000000000000200200000000000E0FB +:1013F00000000000000000000000000A00000000E3 +:10140000070084000000000000004200000000E02F +:101410000700008100000000000000000000000044 +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:101450000000000000000000000007000000000085 +:10146000000000000000000002E007000041000052 +:101470000000000000000A000000020202C3A0FFFA +:10148000E3FF14551F5F00000000550000C3F0F596 +:10149000F4F500000000C0C2C3C30000000000005B +:1014A000000000000000000000000000000000003C +:1014B0000000000003434343F5F7F0F3AA0AAA0A29 :1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F0000000000000FF3C3C000000000000000075 -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:101520000000000000000000010204088100240007 -:101530000000812400000140028000000000000043 -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:101570000000FC0CF5F500C2C2C200000000000033 -:1015800000000000000000000000000000007D419D -:10159000CFCF0000000055550F0F000000000000E5 -:1015A00000000000000000000000440000440408A7 -:1015B0001020000044008800060000060000000023 -:1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B +:1014D0000000000000000000FC0CF505000000000A +:1014E000000000000000000000000000CF55CF55B4 +:1014F00000000000000000000C000C00020202C30B +:10150000A0A0E3E300410F4F000000005500000FD2 +:10151000F0F0F4F400000000C0C2C0C200000000FF +:1015200000000000000000000000000000000000BB +:101530000000301030300F5F5F5F05070003A2022C +:10154000A0000000000000000000000000000000FB +:1015500000000000000000000000FC0CF505000089 +:1015600000000000000000000000000000000C551A +:101570000C550000000000000000C3C3C3C32808CE +:10158000AAAA00FFF0F00505C7C70000000000FF91 +:1015900000FF00000000000000000000000000004C +:1015A000000000000000000000000000000000003B +:1015B0000000000000003C3C08280000FFF0FFF0A5 +:1015C000F0F0FFFF0000000000000000000000003D +:1015D000000000000000000000000000F0F0F0F04B :1015E00000000000000000000000000000000000FB -:1015F00000000000FC0C050500FAFAFA00000000EB -:1016000000000000000000000000000000000000DA -:101610007D410C0C000000003C3CFF00000000007D -:1016200000000000000000000000000088000088AA -:1016300001024080000000440088900000900000FB -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A +:1015F000033F033F0000000000000000000000FF68 +:101600002828AAAAC3FFF0F0FF05FFC700000000CA +:10161000003D000500000000000000000000000088 +:1016200000000000000000000000000000000000BA +:10163000000000000000FF000F3C1C3C14143C3074 +:101640000030FF41FF4100000000000000000000EA +:101650000000000000000000000000000000FFBECD :10166000000000000000000000000000000000007A -:10167000000000000000006100070015000000618C +:101670000000013D033F006100050009000000611A :101680000006000D000000610006000D0000006172 -:101690000007000D000505000A08050000A5000070 -:1016A0000000000000000000000000000000606179 -:1016B0000007000D1000000000610007000D080089 -:1016C000000000000000000000000000000000001A -:1016D00005000A08050000A000000000000000004E -:1016E00000000000000000000000000000000000FA -:1016F0000000000000000000C0CFC0CF00000000CC -:1017000000000000FCFC82BE0000000000EB00EBCB -:1017100000000000F0FFACAC000000000000000082 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 -:101740000000000000000000000000000000000099 +:101690000006009D000100610A0F050D00A0806199 +:1016A0000006000D000000610006000D0000006152 +:1016B0000006000D0000000080615006000D0000D3 +:1016C00080610006000D0000000000000000000026 +:1016D000000000000000000000000000000000000A +:1016E0008061000E000D00000000000000000000FE +:1016F0000065000E000F200005005550F330EB2868 +:1017000000000000CFCACFCA30F345043C3C303C57 +:1017100000000000BCFF00FFCF0FCFCFFAFEAAAA47 +:10172000007F003F00000000000000000FFF0CFCE5 +:1017300000F0AAC330302030000000000000C0FFDD +:10174000C3FF000000000050A000000000000000E7 :101750000000000000000000000000000000000089 :101760000000000000000000000000000000000079 -:1017700000000000000000000000C0CFC0CF00004B -:10178000000000000000C0C082BE0000000082AB6C -:10179000C2EB00000000000FACAC00000000000035 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000100000000000000000028 -:1017C00000400000000000000000000000000000D9 +:10177000000000000F0500000000FFFFFFFFF33036 +:10178000C30000000000CFC0CFCF3CFF4100343485 +:10179000303C00000000A0FF00FFCF0F0F0FAABEDB +:1017A000AAAA007D003C00000000000000000FFF1E +:1017B0000CFCFFF0AAC33030001000000000000055 +:1017C000C0FF00FF000000000050A000000000006B :1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 -:1017F000000000000000000000000000F0F080D0B9 -:101800000F0F0F0F0000000000000000553C55F0C6 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 +:1017F000000000000000070700000000FCFFFCFFE5 +:10180000F0F0F0F0FFFFF010AA0AA000B050105066 +:101810002B2B0303CFCF4F0F08000000FFFFFFFF6C +:1018200000A0AAA00000000000000000E1E1E1E14A +:10183000000000001E1E1E1E07052F0500003CFFB5 +:101840003C3F00000000000000000000000000001D :101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:1018800080D00E0E0C0F0000000000000000553C40 -:1018900055F0000000000000000000000000000003 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000001000000000000000000000017 +:1018600000000000000000000000F0FCF8F800009C +:10187000000000000000CF0C2020000000005FFFEF +:1018800050FFF0F030B0FFFF1010FA5AF050B0F0F7 +:10189000B0F02B2B3F3F4F0F4F0F00002828414146 +:1018A000030300A0AAA000000000000000000055F3 +:1018B000AAFF00000000FF55AA0007AF2FAF0000ED +:1018C0003C3C3C3F00000000000000000000000025 :1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000202000001000800888000020000C0 -:10191000000020000080008004000000040000049B -:101920000000000000000020000000000000000097 -:10193000040004000002000221000000200000005A -:101940000003000000000080008000000000000094 -:10195000000020000080004000042000000000047F -:10196000000000000000000000000000040000086B -:101970000000000000000000000000000000000067 -:1019800000080000000040020400808210040003F0 -:101990000002000004020004000400020000000035 -:1019A000000200000000000000010004000000022E -:1019B000000000000000009100010200000000048F -:1019C00040020000000000000040000200A00000F3 -:1019D00000000000000020400001000000000000A6 -:1019E00000000000000000000000000000000000F7 -:1019F0000000009000000000000000000000000057 -:101A00000002000200000400000000000300840245 -:101A100001410100204005400004030002000000D5 -:101A2000020001000400044000040320020084407E -:101A300000000000010000000200020000000000A1 -:101A40000000000000000000000000000000820014 -:101A5000000000000800200020000000000002003C -:101A60000200000000000000000000000000020072 -:101A70000000000004000000000000000000000062 -:101A800002000000020000000000008400001008B6 -:101A900011032008200080082000020920100408FB -:101AA00000840504400880828004000104010008CD -:101AB00002000008000440020090008200000008BC -:101AC0000000040800040000000400000000000200 -:101AD00000080000000800000000000000000000F6 -:101AE00000080000000800000000000000000000E6 -:101AF00000040000000202000000000000000000DE -:101B000000040000020400008400400800050020DA -:101B10004110840900210000400000034010000033 -:101B20000409000890080402000800210000850054 -:101B300000000440C00000004000900401000100CB -:101B4000C08000000200000000008280008002804F -:101B50000200008402210005020002400140020050 -:101B60000200008000400040000000000000000073 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000200000000035 -:101B9000000120A109A00000090841000000210067 -:101BA00021000000004100000000000200000000D1 -:101BB000040800000000000000000000008802008F -:101BC0000200114000C0800000840000004000407E -:101BD00080408000004180A000A0808280830201BC -:101BE00080008000004000010001000000000000B3 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C10000000210001000004000008000000000492 -:101C2000000000410009000000000000000000006A -:101C30000100000000000000001000000200000091 -:101C4000000000000100020510000000000002007A -:101C500000000000000000000000820000001000F2 -:101C60000000000000000000000000000000000074 -:101C7000000000000000000000000000000008005C -:101C80000000000000000800000000000000030049 -:101C900000100000048820021101024000A0210071 -:101CA00020010084000000001100118808000000DD -:101CB0000000200241000800000000000000800039 -:101CC00008000000000010008000800000000000FC -:101CD0008000000000000000000000000000000084 -:101CE0009000000000000000000000000000000064 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D10008208C04140000800820008000000000066 -:101D200000A10000000400000802104000000800AC -:101D3000000900000004050400000000000000008D -:101D40000000020000000000000000800080018010 -:101D50000000010003000200000000000000020873 -:101D600001000002100000402100004000000000BF -:101D70000040000000000000000000000000000023 -:101D80000000000000000000000000000000000053 -:101D9000000000000500110200000000000000002B -:101DA0000000110420080002000000009000000460 -:101DB00000000000000000012001000040000000C1 -:101DC0004000000080000000004021002140004051 -:101DD0000240000002A082A0A1000000000000005C -:101DE000800102000000C10000018200000100002B -:101DF00000000001000000000000000000000000E2 -:101E000000000000000000000000000000000000D2 -:101E1000000000000800080000008804080000001E -:101E20002004830000000000000000100000008378 -:101E3000902082000000000002800080000000006E -:101E40000000000002000200020002004004000442 -:101E50009004000800000000004100000240020061 -:101E60000204000400080004000200040000000056 -:101E70000000004000000000000000000000000022 -:101E80000000000000000000000000000000000052 -:101E9000000000000000110041C0000004408088E4 -:101EA00000048005200411000000008803010800E0 -:101EB00008081188038200000800000411041000C3 -:101EC000080021000500800080008000A0000001C3 -:101ED000000100010001000000000000000080017E -:101EE000000080010001000100010000000000006E -:101EF00000000000080100000000000000000000D9 -:101F000000000000000000000000000000000000D1 -:101F10000000000000000000C0000000000082007F -:101F200001000101410000000000000182010000E9 -:101F30000000010084000000201020200188029091 -:101F4000000000000000000000C0A108900008018F -:101F500001C1880000008200000000C0000882006B -:101F6000080001C188000000820000C100000101DA -:101F7000880002C000000002000000000000000015 -:101F80000000000000000000000000000000000051 -:101F900000000000000000000000800000000000C1 -:101FA000000011032008A008000800000902110524 -:101FB0000003000008008000000000800000050011 -:101FC00080000000000000000000009083880008EE -:101FD000800309C1A110020580000000008000807C -:101FE0000000800009C1A1030911800005C1111082 -:101FF00004098000808000000080000000000000D4 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:102020008000000008040308110441A020000900FA -:1020300004000303000000000000000080000020F6 -:10204000808300000000000000000000000010007D -:10205000080083A0030010000900C105000005006E -:1020600020000500C000830041001109C105008067 -:1020700010008900C1000000000000008000000086 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0004000A000C00000910101002001A010C06C -:1020B000200002001040000000000000004002006C -:1020C0008800A00508200000000000000000008833 -:1020D00000000100C188000002000100C1000000F2 -:1020E000000001000000C100080000000001C10064 -:1020F000008800009000C100000000000000C00047 -:1021000000000000000000000000000000000000CF +:1018E000000000000000000000000000003C28286C +:1018F0000000000000000000CF0C20E3000000000A +:10190000200002100808C0002000201084208888D1 +:101910004000200020008405C01020002020880204 +:10192000840020002000840020002000880804009B +:1019300020002000000000104000840988040010EE +:101940000003200020002000080020002000880064 +:10195000040920002000840088008800040088001A +:101960000000200040002000200040002000200057 +:1019700020002000200020008800880089008800C6 +:10198000010000008900A00000000084000204059E +:10199000052000000000408200000001000000035C +:1019A000048404000400040000000400000000009F +:1019B00010020400000004002000A000000000400D +:1019C0000000000000000000000080000000040093 +:1019D00000000000000000C0000005000002000040 +:1019E0000000000000000000009021000000000046 +:1019F0000000100000000000000021004000100066 +:101A0000210040024010000082800800820082080D +:101A100000094003834083408300831000100000CE +:101A200001020040000002009040000000800180A0 +:101A300002000040008002000100000000000000E1 +:101A40000209000000000210021002000210000053 +:101A50000800000002000000000000000000084133 +:101A600002000000040500002100014000400200C7 +:101A70000000004002100000020000000000000012 +:101A800000000000000082840484001084840008A8 +:101A90000001201090081084208820001084020883 +:101AA000000802090084020805080008090009105E +:101AB0000810808400080010050040900084000891 +:101AC00000840008000000000040040800400040BE +:101AD00002000084200800100208400000000000FE +:101AE000400800040002400002002002200805080F +:101AF0000084020200044100000804000000090004 +:101B000000100000009002084008000000100000D3 +:101B100001800000C0031020000300210000000825 +:101B20000008000000400483004000050000000899 +:101B30000000002100020002000800000000000078 +:101B40000000000800210400000004410000000023 +:101B50000008000000030021000000000000000059 +:101B60000000000000200008000800000000000045 +:101B70000000000000000000004000001000000015 +:101B80000000002100000000000041000902008266 +:101B900021404020090040080900000800004100E1 +:101BA0000310000100882100850200C00000000031 +:101BB0000000000041001002040141000300000089 +:101BC00041000000001005840800000003000082AE +:101BD0000300000000000000000000A00000410021 +:101BE000000400000000000041000000000021008F +:101BF000410041000000000000000000110000A0B2 +:101C00000304030041000000080041000005C00972 +:101C1000820520040000C000C100C0410100820014 +:101C2000000020000800C000100900001000100093 +:101C3000100004414000820008008400820000007F +:101C40000900A000100084000800820000000000CD +:101C500084000000080010008200C000080000009E +:101C600082000000000004008200000000002080CC +:101C70008202A100C00082008200C00040008200F9 +:101C800000008200C00008110804C0008200008229 +:101C9000100000001100410000000400001020901E +:101CA000000000009000002010000300001000A0C1 +:101CB0000000000000008000100000000000000094 +:101CC0000000080011002190080000004100000001 +:101CD000000000840020000003000000000000005D +:101CE00000000000000000000000000000000000F4 +:101CF000802000000400000000002100000000001F +:101D000000000000000000000500210000000000AD +:101D1000100008000400081100000008822104409F +:101D20000082008810040408000400000000004045 +:101D30000000840008030841A000402100000000CA +:101D40009000400000000000C00010001000C00023 +:101D50000000000000000000100000080000A000CB +:101D600000000003000000008200080000000000E6 +:101D70008220000000000000200008000000100089 +:101D800000004000C000000008000000000040000B +:101D90000000200221081102038200040004000256 +:101DA000000004044109800904210000000021A072 +:101DB0001000090021002100000000008000001038 +:101DC0000000000400000004030000000000000008 +:101DD0000300000021000504218803900300050092 +:101DE00000000300000000000000030000000000ED +:101DF000000000000000000000008000000800005B +:101E000000000000000000000000000011000000C1 +:101E100040000400000000000200000584210000D2 +:101E2000000508051000200002C0000400000200A8 +:101E300002000021080082000000020000000008EB +:101E4000000008001000000000000000C000004179 +:101E500040410000000000000000040800000000F5 +:101E60000008000000002000000000000000A000AA +:101E700008000800000000008200000000000000D0 +:101E80000000000000200000820000000000C000F0 +:101E90000000000000000000000000000000000042 +:101EA0000000000000048000809000080889000005 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000010000000000002 +:101ED00000000000000000000020000000000800DA +:101EE00000000000000020000000000000000000D2 +:101EF00000000000000000000000000000000000E2 +:101F00000000000000000000000000A00000080029 +:101F1000000020000002000000000000000104009A +:101F200090C11088048320910001910140010000BC +:101F3000C0C000049040829000000000000000003B +:101F4000000291A0208400A1C0888808880882A18E +:101F500000000000000000000000002000080090C9 +:101F60000040000000000000000000000000000031 +:101F70000000000000000000000000209020010090 +:101F800008A00000000000000000000000000000A9 +:101F9000000000000000A000000000090008001080 +:101FA000800804C1A021808800882041100388088F +:101FB0000009858040800080008000000000000053 +:101FC00000000088030800030021000008898080C9 +:101FD000802040030021002000200000000000803D +:101FE00000000000000000000000000000000000F1 +:101FF0000000000000000000000000000000800061 +:10200000020080000000000000000000000000004E +:1020100000000000000020000000000080008000A0 +:102020008000000000000041000400000280100059 +:102030002000410308001011820041000000000050 +:1020400000000000200040200000020321008880E2 +:102050008800211000000000000000000000800047 +:1020600000030000800000000000000000000000ED +:1020700000000000000000000000000000008008D8 +:102080000040000880800000000000000000000008 +:10209000000000000000000000000000000004003C +:1020A0000200A0008400900088000090200000043E +:1020B0000100000001910000110002C08300000037 +:1020C0000000000000000110010100A0019120901B +:1020D00008A08920010100000000000000000000AD +:1020E00002001021C090022000000000000000004B +:1020F00000000000000000000000000000000000E0 +:10210000040182010085089000000000000000002A :1021100000000000000000000000000000000000BF -:1021200000900082004000A000008200A00100009A -:10213000000100000100000000000000000100019B -:1021400040900002042000A00000000000000000F9 -:1021500000010001010101C000000000000191C167 -:10216000000000010000000100C0000000000001AC -:1021700091C100000000000082C1000000000000CA -:1021800000C000000000000000000000000000008F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000003410583085B -:1021B0000511002009100503100000110021002066 -:1021C0000041800000808000050000000000000049 -:1021D00000000008104008051090001002000005E3 -:1021E00089C100000020002100210084000040116E -:1021F000000589C100100511000080C10000000029 -:10220000000000800000000000000000000000004E -:1022100000000000000000000000000000000000BE -:10222000000000000000000200800000C021032127 -:1022300002000309000020901080031000400000FD -:10224000000000000010002100000000000000005D -:1022500000000000C108211010800003C1102100FF -:102260000000400000008002000000808002C109E0 -:10227000910000004000C110211180000920800061 -:10228000000000000000000000000000000000004E +:102120000040010000080002042100A088011111F4 +:102130000001010000000001400900A09001A189F8 +:102140000000000000000000C00101000101C0000B +:1021500008020008008491880000000000000000D0 +:10216000000002000000000021000000000000004C +:10217000000000000000000000000000000000005F +:1021800000000490C090004009A000000000000082 +:10219000000000000000000000000001000000003E +:1021A0000001000020000380058000204083C12042 +:1021B00089410020102008400041800900A18008CA +:1021C0000910000000000000000080100820082115 +:1021D000002000200089418821C000000400410047 +:1021E0000000000080000000000009000000000066 +:1021F00000000000000000000000000000000000DF +:1022000000000000800080000080C100000000008D +:10221000000000000000000000000000002000039B +:1022200000200041000000000080000080110080BC +:102230000080000041001100100010058002000025 +:10224000008000000000000000000000A140A1404C +:1022500002008805008809000800004000400000D6 +:10226000000000000000000000800080000000006E +:10227000000000000000000000000000000000005E +:102280000000000000000005800400008000000045 :10229000000000000000000000000000000000003E -:1022A000000000000000000000A00002000005097E -:1022B000C000C10083000000019001100100000176 -:1022C000000000000000A000009088829000000044 -:1022D0000000000000000988000100080001C100A2 -:1022E0000000000088000000C0C1000000081001CC -:1022F000C101200000000000C100000188000101B0 -:10230000C00000400000400000000000000000008D +:1022A0000000000000000000000800840000400161 +:1022B0004010208490000110000000000100C011B7 +:1022C000A002C084C00000000000000000000382E3 +:1022D0000401A100830020A040002010880100001C +:1022E0000000000000000000900020024084200058 +:1022F00000000000000000000000000000000000DE +:10230000000000000000000000002021A0A0080044 :1023100000000000000000000000000000000000BD -:102320000000000000000000000000000700500056 -:10233000000000E000000000000000E000000000DD -:102340000000000000000000000000E007000000A6 -:10235000000000000000000000000000000000007D -:10236000480000E000000000000000000000000045 -:102370000000480000E000000000880000E00000CD -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000087871F -:1023B00000993C3E00020000000000000000000008 -:1023C00000000000000000000000FEFE8080F3F02E -:1023D00003000000000000000000FFFF0000FFFFFE -:1023E00000003C3C0000FFFF000000003C3C0000FF -:1023F000FFFF0000FF000000FFFF0000F0F0000002 -:10240000FFFF00003C3C000066660000000000008A -:1024100000000000000000000000000000000000BC +:1023200000000000000000000000000000000000AD +:102330000000000007000000000000E000000000B6 +:102340000000000007006000000000000000000026 +:10235000000000000000500000000000000000002D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:1023800000000000000000000000000000E0070066 +:10239000824100000000000000000000000000007A +:1023A00000000000000000000000000000003C00F1 +:1023B0003CFFBD3CBF3F7E7E1818000000000000BF +:1023C00000007C60FCF07E7E181800000000000019 +:1023D0000000FFFF991000000000DA00800034F6D2 +:1023E000343400000000000000000000B930B930B3 +:1023F00000000000000000000000000000000000DD +:102400000000000000000000000000006E0C6E0CD8 +:102410003C00FCF000000000000000000000000094 :1024200000000000000000000000000000000000AC -:10243000878766FF3CFF00C300000000000000002B -:10244000000000000000000000000000F8F8E0E0DC -:10245000636363630000000000000000FFFF0000F2 -:10246000000000003C3C00000000000000003C3C7C -:10247000000000000000FF00000000000000F0F07D -:102480000000000000003C3C000066660000000008 -:10249000000000000000000000000000000000003C +:102430000000000099009F0F0F0F0F0F0000000019 +:10244000000000007C603C000F0F0F0F0000000038 +:1024500000000000FFFF101000000000DA00800004 +:10246000F4F6343400000000000000000000FFFF1C +:1024700030300000000000000000000000000000FC +:1024800000000000000000000000000000006600E6 +:1024900066003C003C00000000000000000000005E :1024A000000000000000000000000000000000002C :1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C @@ -86631,494 +86631,494 @@ :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB -:10253000000000006F6F09090000000000000000AB -:102540000000000003C303C30000000000000000FF -:102550000F3C0F3C00F00EFE0000000000000000E9 -:10256000000000FF0000FFFF0000666600000F0F84 -:102570000000000000FF0000FFFF00006666000092 -:102580003C3C00006666000000FF00000F0FFFFFEC -:102590009999000000000000000000000000000009 +:102530000000000000FF00FF6666F0F0FFFF4E4E57 +:102540000000000000000000E1E166000000660FEE +:1025500000000000000000000F0F0F0F000000003F +:102560000F0C0F06CF0FCF0F00000000000000007F +:1025700000009000BC3C0600C7C100000000000045 +:10258000000000000000000000000000000000004B +:10259000000000FF42FF242424240000000000006B :1025A000000000000000000000000000000000002B -:1025B000000000000000FF00FF000000000000001D -:1025C000000000000000C3FF93FF000000000000B7 -:1025D00000000F0F3C3C00F002F200000000000081 -:1025E0000000000000FF0000000000006666000020 -:1025F0000F0F0000000000FF0000000000006666F2 -:1026000000003C3C00006666000000FF00000F0F69 -:10261000FFFF99990000000000000000000000008A +:1025B00000000000000024FF2FFF3C3CFF00000053 +:1025C0004E4E0000000000000000E1E1FF99FFFF17 +:1025D000660F00000000000000000F6F3F7F00004A +:1025E00000000F0F0F0600000000000000000000B8 +:1025F0000000000000003C3CFFF9C7C100000000E3 +:1026000000000000000000000000000000000000CA +:10261000000000000000424224242F2F0000000090 :1026200000000000000000000000000000000000AA -:10263000000000000000000800000000006100072A -:10264000000D0000006100010001000000610006B3 -:10265000000D00000061000F000D000000000000F0 -:102660000000000040638006002D9202408280013D -:1026700080209202000040E38006002D92024082FA -:10268000800180209202408280018020920240825C -:102690008000002082020000000000000000000016 -:1026A000000000000000000000000000000000002A -:1026B0000000000000000000000000000000FFEF2C -:1026C000F0E0CFCFC0CF14BE14BEF0F0F0F00000A9 -:1026D0000000F0FFC05500000000000000000000F6 -:1026E000000000000000000A0000A0A0A0A0FF0061 -:1026F0003C003C3C003C0000000000005557555594 -:10270000FF003C00F0F000F03C00550030303C3C55 +:102630000000000000610006000D0001006150066E +:10264000000D00000000000100000000A061500625 +:10265000000D000000000000000000008061000686 +:10266000000D000080614006000D000000610006C2 +:10267000000D00000000000030000000000000001D +:10268000000000000000000000000000000000004A +:102690000000000000000061000F000D00000000BD +:1026A00000000000000000000000000000000061C9 +:1026B0000006000D00000000000000000000000007 +:1026C00000003CFCAAFAF0F0C3C3C3C3FF00000043 +:1026D000000050551014000000000000000083BFEF +:1026E000033F8ECF0CCF000A000AFF00F00000006D +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 :1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 -:10274000EFEFE0E05F5F505FB4B4B4B4AA3CAA3CE2 -:1027500000000000F000C0000000000000000000C9 -:102760000000000000000000000A00AAF1F1E1F5FD -:1027700000003C000000003C000000000000555735 -:10278000555500003C00000000F03C005500303082 +:10273000000000003CFCAAFA0000000000000000BD +:102740000000000000F000F0FF005555F0F0AAAACC +:1027500000000000F0FF303C00000000000000001E +:10276000AFAF0F0FBEFF3CFF0F0A0F0AF100F100E1 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 :102790000000000000000000000000000000000039 :1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C0000000023E82BE033FC3FFFFFFFFFFAAAF30 -:1027D000ABAB0000000000000000000000000000A3 -:1027E000000000000000000000000043C3C35F0AB7 -:1027F0005F5F0F00550000F0303000000000000067 -:102800000100000005050F0000F0003C55000F001E -:1028100000F0A0A000000000000000000000000088 +:1027B00000000000000000F000F0A8A800A8000041 +:1027C0000000F0C3AA0000000000AA00E1E15C5C88 +:1027D0000FFF00000000C300F0FF00000000000039 +:1027E0000000F0F0F07000002B2B3C003C0028288B +:1027F000282A0A0A2AAA000000000000000000009F +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 :1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:10284000000000003F3FFFFF033F417DA220A22088 -:10285000AAAFABAB000000000000000000000000C9 -:102860000000000000000000000000000043C0C3A2 -:102870000A0A5F5F0F00550000F0303000000000D2 -:1028800000000000000005050F0000F0003C5500AE -:102890000F0000F0A0A000000000000000000000F9 +:10283000000000000000000000000000FCFC00FCA4 +:1028400000000000F0C3AAFF00000000FF55E1E116 +:102850005C5C00F000000000FF3C000F0000000086 +:1028600000000000F050F070D4D4FFFFFF00FF0024 +:102870002828AAAA000020A00000000000000000F4 +:102880000000000000000000000000000000000048 +:102890000000000000000000000000000000000038 :1028A0000000000000000000000000000000000028 -:1028B0000000000000000000000000000000008593 -:1028C000010388800304880388008800000000005A -:1028D0000400040000000420000000820220000028 -:1028E000400820002002208020002020002000003E -:1028F0000080000000040000000000000000000153 -:10290000000000002000000400000000000200049D -:102910000000000000000002000000800000000035 -:10292000000800000000000000000000000000009F -:102930000000000000000000000000000004000093 -:10294000002008080020820200900000000000081B -:102950000090800000A010028041009000040091CF -:10296000000000412140008200020000000100C17F -:1029700000020020000000400000000000000000F5 -:102980000000000000000000000000000000000047 -:102990000000000000000000000400000002000031 -:1029A0000000000000000000000200000000000025 -:1029B0000000000000000000000000000000000017 -:1029C00000000008010800000000820088000000EC -:1029D000400004008420040001208820842020205E -:1029E000218008000182852000800400010004008D -:1029F0000420050021400000040000000000080041 -:102A00000200000000000000002020002000020062 -:102A100000000000000000000000000000000000B6 -:102A200000000000C00000000000020000000000E4 -:102A30000000400000001000400002020000000002 -:102A400000000000008208001108058400C0020890 -:102A50001184830480080201800804090201020134 -:102A6000899184048208042004830002808204087F -:102A70008000840584080400000800080002008427 -:102A80008000200800000004000004840000000012 -:102A9000000200000008008440000008090800004F -:102AA000000000000084008400000008000009000D -:102AB000000800008004000280008004000900007B -:102AC00000000000000000020410040000004000AC -:102AD0000000004000110820000020039040400842 -:102AE00000A1820502A10000000002000100000018 -:102AF00000200405020800000000000000000000A3 -:102B00000000A0800000000000100000000800008D -:102B10000000000800000000000800000040000065 -:102B20000000000000000000002000000000004045 -:102B3000000000000000000300080000000000008A -:102B40000000000000000000000002894100210890 -:102B500008002000008400000021000000000002A6 -:102B600021204102080241080084000000002040AA -:102B7000008200010000400000000000000000880A -:102B800000020082001000020000000800000000A7 -:102B90000000000000000000000000000000000035 -:102BA00000000084000000000000000000000000A1 -:102BB0000000000000000000000000000000000015 -:102BC00000000000000000000000080004100809D8 -:102BD0000440A04001000400001004020804A08486 -:102BE0000840000001200040100482008204000020 -:102BF0000080000484000008000000800000000045 -:102C000000000000000000000000000000000800BC -:102C10000000080008000800080000000000000094 -:102C200000000000820000008200000000000000A0 -:102C30000800000000000000000000000008000084 -:102C4000004000000000000000000000110003012F -:102C50000000800100A01000000040010000000002 -:102C600000202100000004000000C1080000040052 -:102C700000000004100041000003000000200000DC -:102C8000000000000800000000000000000000003C +:1028B00000000000000000000000000000004000D8 +:1028C000840040002002880002002010C005210082 +:1028D00020802100C1002009881004008405C00068 +:1028E0008400842004042000200004200000000054 +:1028F00020042003020420002000040084000003C0 +:102900002000840020008804400020000000000017 +:10291000840020002000200020002000C0002000B3 +:1029200088002000880088022000200000000000AD +:10293000C00084000000200004000404880400009B +:10294000000000000900000021088000000100C014 +:1029500020000004100008000500200040000000D6 +:1029600040000000040000022100090000002000D7 +:1029700000020000000280000000000205000900C3 +:102980000000050004000000000009000000000035 +:1029900000000000040000000000400000000000F3 +:1029A000090000000000000000000000000000001E +:1029B0000000000000000090000040000000000146 +:1029C000040000000200101002090080040008103A +:1029D0000005008402040204030800000000000057 +:1029E00020000000000002000000000000002000A5 +:1029F0000000040002000008820002000000000045 +:102A000000000000020000000200000004000400BA +:102A100000000000020000000004000000000400AC +:102A2000020002004000000000001000080000004A +:102A3000000004000000000004000000900004906A +:102A400000100800020000842000000800100000B0 +:102A5000800800C0051100090084108900004010A2 +:102A6000000800000200000020080984000204841D +:102A70000010000800880008000000080408000892 +:102A80004008001000000400200000080584200019 +:102A900000C000080008008400040008000400844E +:102AA000000800080008040800000010208400202E +:102AB0000000008400100400000000080004000072 +:102AC000004002080008022104048821A0214003DC +:102AD000841088008808C111822010844002880870 +:102AE00000200000000800210020844000080000B1 +:102AF0000000000000100008000004001021040085 +:102B000000410000000800000808000082000808DA +:102B100040000000820000004000000000000008AB +:102B2000040000000000000000030000000000009E +:102B30000008020000000000000000000000000883 +:102B4000000000008410840004000900000003401D +:102B50000520100908200000100000000041C009F5 +:102B60000082100000200000008209001000080010 +:102B7000030021001100108200000300112040001A +:102B80001000100041C008000000210008000000F3 +:102B90000000000800000800000000000000000025 +:102BA00000000300030021000000000000000000FE +:102BB00010000000000000000000050003000300FA +:102BC000000003000000000105000800C000000034 +:102BD000000004110808A000000000000000001020 +:102BE00010000400C0008200C00084000800A000A3 +:102BF0000000100000000004C00008008400040071 +:102C0000040082000000080000000000100088009E +:102C10000409000004000404000984048200820006 +:102C2000040004000000000008000000080082000A +:102C300008000000100000008200840082000800EC +:102C40000809C00008000005090008000000030092 +:102C500004000000021000000300400000C021003A +:102C60000000000000820000410000400000000061 +:102C70000000000004000008100000A00000008414 +:102C800000000040000000C0000000000000000044 :102C90000000000000000000000000000000000034 -:102CA00000000000000041000300030000000000DD -:102CB0000000000000000000000000000000000113 -:102CC0000000000000000000000000000000C00044 -:102CD00040000020004000080800002008210800F3 -:102CE0000800840000000000C0080800C000C00503 -:102CF000108020000882C003000000008200002134 -:102D000000000000002000000000000000000000A3 -:102D10000021000000000000000000000000000092 -:102D20000000820000000000000000000000000021 -:102D30000000000004000004000000008200000009 -:102D40000021000000200000000000000000000042 -:102D500000000000000408010302000404040390C2 -:102D6000000000000300000000000020000400003C -:102D70000000830803008311008800000000210088 -:102D80000010059008A000900084000000000000E2 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000002000A0030004040008000000080018 -:102DE000020082008200C02090000111C003900008 -:102DF0000005C0000008400888100003000000091A -:102E00004000000000000209000000000002000075 -:102E100000000000000200000000000000000000B0 -:102E2000000000000000820000008200000000009E -:102E30000000000000210000000000000000000071 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000002004000000030 -:102E600000000000000000004001000040000004DD -:102E70000000000000000001000000010000000050 -:102E8000200000000000000008000000000000001A -:102E90000000000000000000000000000000000032 +:102CA0000000000000000200000021000000000001 +:102CB0000000000000000400000000000000080008 +:102CC00000080000000000000000200000000005D7 +:102CD000400000000000000082008200000082002E +:102CE000000020000821000000200011000808005A +:102CF00000000000000320000000080882210000FE +:102D000000000004080000000000000000000000B7 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000100000000000C000000000000008BB +:102D40000000100000002003C000080000408400C4 +:102D5000080010000004000010C00908108402845C +:102D60000400000090000282100209000884080894 +:102D7000000000000000100040200000038808044C +:102D80000090008803101000000000000000000008 +:102D9000000003000300000000200000000000000D +:102DA0000500000000000000000000C0000000005E +:102DB0000000100000000084080000400000000037 +:102DC0000000009000000000000000000000000073 +:102DD000000082000000C0080810002182000800E6 +:102DE0002000000800000002001100000008C000E0 +:102DF00000000000100000080000000000000000BB +:102E000084000000000000000000100000410000ED +:102E100000000000000000000000000000000000B2 +:102E20000000000000000000820000000000000020 +:102E30000000000000000000000000000000000092 +:102E40000002000000000000880084000000000074 +:102E500000008200000008000000000020082000A0 +:102E6000800408000000000000882000000000002E +:102E7000080000000000000000000000000000004A +:102E80000000000000000000000000000000000042 +:102E900000000000000000000000008800000000AA :102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC00000000000000000000000030000000000FF -:102ED00000000000000010C0008200408482C00298 -:102EE0000140A040C0900008008200A0C008C0C0FF -:102EF00009028201C0090200018204A0C0A000A151 -:102F00000040000202030140004000A0000408004D +:102EB0000000000000000000000000000000008290 +:102EC0000000000000000000000000000000000002 +:102ED000000041002000000000000000000002048B +:102EE000000000A00488000100018800000000002C +:102EF00000000000000000000000000000000000D2 +:102F000000000000000088882084009082100000EB :102F100000000000000000000000000000000000B1 :102F200000000000000000000000000000000000A1 -:102F30000000000108000001000000000000000087 -:102F40000000000020000000000000004000000021 -:102F50000000000000000000808000000000000071 -:102F6000008003000000000000800080000000805E -:102F700000008380910800C08000088083000080EA -:102F8000004100A0009180A002000000000000802D +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50004010000800888808000000000000000001 +:102F6000808000000080800008411010084100208F +:102F70000000000000000000000000000000000051 +:102F80000000000000000000008000000000800041 :102F90000000000000000000000000000000000031 :102FA0000000000000000000000000000000000021 -:102FB000000000201110004000210000000000006F -:102FC00000000000030000000000000008000000F6 -:102FD00000000000000000000000000080408000B1 -:102FE00000008000000080000080800000000000E1 -:102FF00080000080A1030500A0C000000011800037 -:103000000000000000048005800000000021008016 -:1030100000000000000000000000000000000000B0 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD000000080800080050000000000000000006C +:102FE0000000800000418000000008008340058050 +:102FF000C18500000000000000000000000000008B +:10300000000000000000000000000000804180215E +:103010008000000000000000000000000000000030 :1030200000000000000000000000000000000000A0 -:103030000000000002001000400000050000000039 -:10304000000000000000000000000000200003005D -:103050000800410000000000000000009000100186 -:103060000484020004008400A000040404000000A2 -:10307000888808049002110000000989C0004001FE -:1030800008008882C00000010282020000000000E7 -:1030900000020000200040000800080000000000BE +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:1030500000000000A00021008410111100000000F9 +:1030600000000000A0002001A00200008808030169 +:1030700002C011A0000000000000000000000000DD +:1030800000000000000000000000000040000202FC +:1030900002890400000000000000000000000000A1 :1030A0000000000000000000000000000000000020 -:1030B000000000000000010200000000000000000D +:1030B0000000000000000000000000000000000010 :1030C0000000000000000000000000000000000000 -:1030D00000000100010000000000000000000400EA -:1030E00000A00488A110902000C00003080340083D -:1030F000004020040008820300000002C00902A171 -:1031000000000083A1A140400102830401200000CF -:1031100000000000900000100088009000100000E7 +:1030D00000000000000010A00500080088000000AB +:1030E00000000000000000080082080482200000A8 +:1030F0000000890001010000000000000000000045 +:10310000000000000000000000000000000090200F +:103110000090002082A000000000000000000000DD :10312000000000000000000000000000000000009F -:10313000000000000000000000010000A1000001EC -:10314000000000000000000000000000000100017D -:10315000000000010001000100000000000000006C -:1031600000000080000009800040000500C000C190 -:10317000808000800000008000A00005200005A0E5 -:1031800080400005000290C18080208005801000F2 -:1031900000000000000000000000008000000000AF +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:103150000000000000000000100000A08402080829 +:10316000000000000000000000800000008000005F +:103170000002200985100408000000000000000083 +:10318000000000000000000000000000000000003F +:10319000000000000000808000000000000000002F :1031A000000000000000000000000000000000001F -:1031B0000000000000000000000000021040900825 -:1031C000000300000000000000000040001100109B -:1031D0000008002000100021004100000000000055 -:1031E00000008000004100800000000000210080FD -:1031F0000000000000090000800041C08911840027 -:1032000090200000001100000000801180218080CB -:103210000000000080088000800000000000000026 +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D000000000000000000000000000008000006F +:1031E000808000000000000000008000000000005F +:1031F0000000C189A02110001002000000000000A2 +:1032000000000000000000000000000000000000BE +:1032100000000020002100800000000000000000ED :10322000000000000000000000000000000000009E -:103230000000000000000000000000002120054107 -:103240004100200800000000000000000000000015 -:103250000000000000000000000000080000000066 -:10326000000000000400A088C084040000000003E7 -:10327000008200004000202004040800A1C1820058 -:103280004000090188001082109000000400022014 -:1032900004040000000008000200040000000020F8 -:1032A000009000000000000000000000000000008E -:1032B0000000000000000000000000000000018984 -:1032C00000000000000100000000000000000000FD -:1032D00000000000000000200000000000010000CD -:1032E00000000000000000000000070000000000D7 -:1032F00000000000000000000000070000000000C7 -:1033000000E007008200000000E00700000000006D -:10331000000007000000000000000700000000009F +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000089008804E +:1032600020004005000000000000000040004090E9 +:1032700090004000C1114120C1004000000000004A +:10328000000000000000000000000000000000003E +:1032900000000000A0019082100200000000000069 +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000140AD +:1032E00001200010010000000000000000000000AC +:1032F000000000004100000000E00000008100002C +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D :10333000000000000000000000000000000000008D :10334000000000000000000000000000000000007D :10335000000000000000000000000000000000006D -:103360000000000000000000F3FBC3EBFFFFA0FF24 -:103370000000000014BE14BE34043EFE0000C30F63 -:103380000CFC00FF003CC3FF0F000000C382C3D74A -:103390000AFFFAFFFCFFC000AEAFAEAF00000000B6 -:1033A00000000000E343FF000000000000000000F8 +:10336000000000E00000000000000000000000007D +:10337000C3FAFFFA3C3CFF55AAAA00FF0000000078 +:10338000000000000000000000000000000000003D +:10339000000000000000000000000A0A3C3C3C3C29 +:1033A000000000000000000000000000000000001D :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000C3EBC3EBFFFF83 -:1033F000FFFF00000000A0A0F5F534043EFE3CF005 -:10340000FFFF0CFC3C3C00AA55FFFFFFF0FF0082D1 -:10341000FFD700F50005FCF0C0F0AAABAAAB000096 -:10342000000000000000E343FF0000000000000077 +:1033E00000000000000000FF00FF000000000000DF +:1033F000000000FA3CFAFCFCFF55F0F03C3C0000F9 +:1034000000000000000000000000000000000000BC +:103410000000000000000000000005000F0AF0A0FE +:10342000FFFF00000000000000000000000000009E :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C -:103460000000000000000000000000000028000034 -:10347000C7C7C7FFFF350F358082C0C3F0F0F03CEF -:10348000EBEB4141FFBE7D3CCFCFC0C017D717D774 -:1034900055140F0C3FFF03005555FF00FF004D4D25 -:1034A00000000000000000002400000000000000F8 +:103460000000000000000000050F0F0F000000002A +:103470000000000043435F5FF353F353000000007C +:10348000080C08040000000000000000000000001C +:1034900000000000000000000000000000410041AA +:1034A000C3C3C3C300000000000000000000000010 :1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC :1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC -:1034F000C000C3C3C3C3F0350035A0AAF0FF3CF041 -:103500003C3CC3FFC3000014283CCFCFC0C01714FD -:103510001714410003003F0F030FD714D714FF0007 -:103520004D4D000000000000000000000000000001 +:1034E000000000000000C0C5C0C5707075F7000086 +:1034F00000000000000043435F5FF353F3530000FC +:103500000000080C0804000000000000000000009B +:1035100000000000000000000000000000000000AB +:1035200000C0C0E8FCE8000000000000000000004F :10353000000000000000000000000000000000008B :10354000000000000000000000000000000000007B :10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:10357000000050080000000000610006000D00007F -:1035800000000008000000000061000F00010000C2 -:103590000061000F000D00000061000E000D000032 -:1035A0000000000800000000000000000000000112 +:1035600000000000000000000055C0C07070F5F5BC +:10357000000000000000000000000000000000014A +:10358000A000000100050000000000000000000095 +:10359000000000000000000000000000000000002B +:1035A00000003000001000000000000000000000DB :1035B000000000000000000000000000000000000B -:1035C0000000000000000000000000610006000D87 -:1035D0000000000000000000000000610006000D77 -:1035E000000000610006000D000000000000000067 -:1035F0000000000000000000000000000000C3FF09 -:10360000E8E800000000000000000C0C0C00FFFFC8 -:10361000FFFF000000000005000F00000000000098 +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E000000000000000000000000061000700056E +:1035F00000010000000000000000000000000000CA +:103600000000F5A0D7D75F0F3C3C00000000000091 +:1036100000000000000000000000000000000000AA :10362000000000000000000000000000000000009A :10363000000000000000000000000000000000008A -:10364000000000000000000000000000D0D70000D3 -:10365000ACED0C4D00000000000000000000000078 -:10366000E8E8AAAA0000000005050000000000002C +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000F303F3036E :10367000000000000000000000000000000000004A -:10368000003CE8E8000000000000000014141400F2 -:103690001414505000000000C305FF0F000000008C +:1036800000000000F5A082820F0F3C3C000000000B +:10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A -:1036C0000000000000000000000000000000D0D753 -:1036D000D0D7A0E100410000000000000000000081 -:1036E0000000E82828280000000000000003000077 -:1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000003F3F3B -:103710003F3FF0F0F0F000000000000000005C5CB3 -:1037200000FF00000000000000000000000000009A +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E0000000000000000000000000000000FAFAE6 +:1036F0000A0A0000000000000000000000000000B6 +:103700000000000000000CFCAFAFFCC04141000015 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 :103730000000000000000000000000000000000089 :103740000000000000000000000000000000000079 -:103750000AFA02C20CD70CD70000000000000000DB -:103760000000000000000000000000002023000016 -:103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 -:1037900003030303FF005555000000000000000074 -:1037A0005C5CFF0000000000000000000000000062 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:1037700000000000AFAAAFAA000000000000000097 +:1037800000000000000000000CFCA0A0FCC07D7D3B +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 :1037C00000000000000000000000000000000000F9 -:1037D0000000FFFFC3C3CFD7CFD700000000000019 +:1037D00000000000000000000000000000000000E9 :1037E00000000000000000000000000000000000D9 -:1037F0000F0F00000000000000008400400588005A -:10380000040500800400C00000100000000000005B -:103810000000000000008800000020000000000000 -:10382000900000008403C0820002840000080000B1 -:103830000000C0020404000000040000200000009A -:10384000400000040000A000400400052002020027 -:103850000000000000004000000000000000000028 -:103860002000000408000000200400000000020006 -:103870000000000000020000000040000002000202 -:103880000000008200101000000400010000004051 -:10389000004000822000000200020002000200003E -:1038A0000002000400C0000000034001009000037B -:1038B0000000000400A00000000000000000200044 -:1038C00000000000000000000082800000020000F4 -:1038D00000000000000400020000000000040000DE -:1038E0000000000000008000000000020040000016 -:1038F00000000000000000000000000200000800BE -:1039000008000410000000C0080000000280000051 -:103910000000000502100400040004000000000084 -:1039200004000200040040008400C1000080020086 -:103930004000400004820000884120000000000098 -:10394000040040000000000002024000028003006A -:10395000880000000000000002000040000200009B -:103960000000020000000000080008000000020043 -:1039700020002000000000000000020002000400FF -:10398000048800080000000800418300000882400D -:10399000000805840008050800000000000002007F -:1039A000000000900000058284880090100800024A -:1039B0000004800880080202008409020000000060 -:1039C00000000000800000000000000180000402F0 -:1039D0004004000000020004000000840000000415 -:1039E0000000050040000000000080008000000092 -:1039F00000080000000000000000000400000000BB -:103A00000008002140000800000590080808080090 -:103A10008200040500400400404100000005002130 -:103A20004000002100200002A01100000400000856 -:103A3000040804919000880090000000000000211C -:103A40000000000000000002001100000011000052 -:103A50000004000000000000000000000000000062 -:103A60000000000800000000000000000009000045 -:103A70000000000004000000000000000000000042 -:103A80000000000041000000000000200088808449 -:103A90008300000000A000000300000000000008F8 -:103AA000000000A0000008000302080004002088B5 -:103AB00000A10040050200002100000000000000FD -:103AC00000000000000000820001000000820000F1 -:103AD000000000000000080000000000000041009D -:103AE00000000000000000200090400000002100C5 -:103AF00021000000000000000000000000000000A5 -:103B000000000000000000000040820900400000AA -:103B1000000004400400000000000800000400044D -:103B20000000001182200000C040040000020000DC -:103B300008000004820000000040C00000000000F7 -:103B4000000008000000000040000000000000002D -:103B5000000000000802000000000000000000005B -:103B600000000000820000000000000000000000D3 -:103B7000000000000000000000000009000000003C -:103B800000000000000000004000000000000000F5 -:103B9000000000000000000000A011100200000062 -:103BA00000000000000000000000400000000000D5 -:103BB000000000000040000000001188000000002C -:103BC00000000000000000000000000000004100B4 -:103BD00000000000000000010000000000000000E4 -:103BE0000000000000000000000000004000400055 -:103BF0000000210000000000050008000000100087 -:103C00000000000000001000000000000000200084 -:103C10000000000000000020000000000000004044 -:103C200000210000000082000000000000000000F1 -:103C30000000000202008400A000000389080000C8 -:103C400010000000000000218203000000000000BE -:103C50008202000000000000000400080000A00034 +:1037F000000000000000AAAAEBAA21820400210018 +:10380000C00040000510410040104000040000804E +:1038100004042000400020042008040088008400E4 +:10382000C000200020004005200820102000840057 +:10383000A000200020002000200000024000200006 +:103840000400200020002000200420002000200090 +:103850002000200000002000200020008400200024 +:10386000200000000400200220000400840020004A +:1038700004000400018004802004200440030000B0 +:1038800010A0040080024021400091832000092004 +:1038900005100000000009000402000009000000FB +:1038A0000400000041000900A002400200000000E6 +:1038B00000000400400000000000000000000000C4 +:1038C00004000000000009C00000004009000000E2 +:1038D0000400000000000900000204020090000043 +:1038E00004000004000008000001000200042000A1 +:1038F00000000000000010100010100004008210F2 +:1039000040100441884100000202021082020210AD +:1039100002800840901000000200000002204000D9 +:10392000000010000200040000000000A0000410CD +:103930000410000008000000040000000200000065 +:10394000000002000000020008000000000000006B +:103950000000000008000210000000000800080835 +:103960000000820084000000000000000000000051 +:10397000040000000000080082000000C0000800F1 +:10398000000080A0000000040482800100000010FC +:1039900004890010000100050000000000820004FE +:1039A00080000408800004880000000004000088F3 +:1039B00005000000000002080008000000080004E4 +:1039C00000000008000800080000000809000000CE +:1039D00000100008000000004084000800000008FB +:1039E0000004040400080004000000840000000833 +:1039F000000000080000000000000010000000842B +:103A00000008040084082011100500004000880010 +:103A1000000800000000840008008408A0000000E6 +:103A2000000000210000000800008208880000005B +:103A30000021000884000000400000000000004059 +:103A40000008000000000000080000000000000066 +:103A50000008000000000000000008000000000056 +:103A60000000000000000000000004400000000012 +:103A7000000000001000000000000800000200002C +:103A8000848205054000080000000800090091003C +:103A90000300080000000000000000000384000094 +:103AA0004184004000A00000000008000900090057 +:103AB000210000880000000000000000000000005D +:103AC00000A0000000000000000000000300000053 +:103AD00000000000000000000000030000000000E3 +:103AE00000000000000000000000000008000800C6 +:103AF00000000000080008000000090008000000A5 +:103B00000800090420008400100400000010C00018 +:103B100008400800100083210800002100008205F1 +:103B20000800A00082000800000000000000000063 +:103B30000000001000400002000000000800040027 +:103B400010000000840000000000000008000000D9 +:103B5000A000000000000040000000000000000085 +:103B60000800000000000000080000000000000045 +:103B70008200000000000000840004000800000033 +:103B800000000000000000000000000020002000F5 +:103B90000000000000000088020000000088000013 +:103BA00000004000000000100000000000000000C5 +:103BB00000000000000000000300050000000000FD +:103BC00000000000000000000000000000000000F5 +:103BD00009000000000000000000000000000000DC +:103BE00000000400000000000000000000000000D1 +:103BF00000000000000000A0000000000000000025 +:103C000000000000000000000000000008080000A4 +:103C1000A002901000000000000000000000000260 +:103C200004201000000982000021000008000000AC +:103C30000000000010000000000000000000000074 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 :103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C9000000203820000000010004000000000004D -:103CA0000010040400000000000008C00000000430 -:103CB00008C02184000100040800000000901001E9 -:103CC00003000000000003004100040000000000A9 +:103C700000000000000000000000000082000000C2 +:103C800000000000000000800000000003000200AF +:103C900000000000040403000300009004840000FE +:103CA0002100000821000000410010001000000069 +:103CB000000000000000000000900088110005C016 +:103CC00000044000000000000000000000000000B0 :103CD00000000000000000000000000000000000E4 -:103CE0000000000000000808088800000000000034 -:103CF0000000000000000020080000000000089004 -:103D0000000000A000000000000000000000000013 -:103D1000000000000000000000000000000800217A -:103D200000080021001000080000000090210000A1 -:103D3000000300000400010000000800A0200005AE -:103D4000002100020003000800000008000000003D -:103D50004000000000000800000008000000000013 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000001000B4 +:103D0000000000000000000200100010008403808A +:103D10000800100000080800000084000011A00244 +:103D200002004000000000210009200800210008D6 +:103D30001000080800000000000000000000000063 +:103D40000000000000000000000000000000000073 +:103D5000080000000000000000000000000000005B :103D60000000000000000000000000000000000053 -:103D700008004000000000000000000000000000FB -:103D80000000000000000000000000000000000033 -:103D9000000000000000000000000000080000001B -:103DA00000000000000000010000081000004000BA -:103DB0000800000000004000400000000400000077 -:103DC00000000000000100000000000000000000F2 +:103D70000000000000000000000000000000000043 +:103D8000002100000000080000000000000000000A +:103D90004010000040004140110000000000000001 +:103DA000000080000000000800000000000000008B +:103DB0000000000000000000000000000000000003 +:103DC00000400000000000000000000000000000B3 :103DD00000000000000000000000000000000000E3 :103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000210000000000A2 -:103E00000000080000000000000010000800000092 -:103E10000000000000000000000090C00002080246 -:103E2000A0080000000000000000000000000000EA -:103E3000000000000000000000000001A1000201DD -:103E400000000001410182000000000000000000AD +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E10000000000100010001000000A041830482B5 +:103E200000C010040008008810C00000000000005E +:103E3000000000010000000000010000000000017F +:103E40000000000000000000000000000000000072 :103E50000000000000000000000000000000000062 :103E60000000000000000000000000000000000052 -:103E700000000000000000000000000000A0004062 -:103E80000010000000000000000000000000000022 -:103E9000000000000000000000000000008003009F -:103EA0008000808000000000000000000000000092 -:103EB00000000000000000000000000000410309B5 -:103EC00000030040000810108009000000000000FE -:103ED00000000000000000000000000000000005DD -:103EE000030000400005000000000000000000008A -:103EF0000000000000000000000000000000008042 -:103F00000080000000000000000000000000000031 -:103F100000000000000000000000000000000000A1 -:103F2000800200800000000000008000800000008F -:103F300000000000000000000000000000000980F8 -:103F400021002008118003800200091041100000A8 +:103E70000000000000000000000000000000000141 +:103E800000010000000000000000000001400020D0 +:103E90000090000200410003000400404080032124 +:103EA00080410020A0800080008080000000000091 +:103EB0000000000000410003000500042020000471 +:103EC00000100008000000000000000000000000DA +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000009B9 +:103F0000000800080002000000000000000011008E +:103F10002100000000800000000200000085080071 +:103F2000210490000883800000028080800000004F +:103F3000000000000000000000000000000003007E +:103F400021004100104000000000000000000000BF :103F50000000000000000000000000000000000061 -:103F60000000100000000810000000000000000029 +:103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 -:103F80000000000000080000000000000000000029 -:103F90000000000000000000000000000000000021 -:103FA000880010010084004088001000840008820E +:103F800000800000000400020000000000000000AB +:103F9000004109040009008000A000010020000485 +:103FA000009091000382A08908001000A040080042 :103FB0000000000000000000000000000000000001 -:103FC00000400100000000880040010000010100E5 +:103FC00000080100000001000000000000000000E7 :103FD00000000000000000000000000000000000E1 -:103FE000000000900100000000010000000000003F +:103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 -:104000000000000000000090000000000000000020 -:1040100000000000000000000000000000000000A0 -:104020000000881000A000008900000000000000CF -:104030000000000000000000000000000000000080 -:104040000000000001008800000000000000A10046 -:10405000000100000000000000000000000000005F -:104060000000000000000000A000000000000000B0 +:104000000000004000000000000000000000000070 +:1040100000000001010100200088000000000000F5 +:1040200000000400000100011100881000100008C9 +:1040300082C000000000000000000000000000003E +:104040000000000000000000000000000000000070 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 -:104080000000000088000000000082000000000026 -:104090000000000000000000000000000000000020 -:1040A0000000000000090090000409110000000059 -:1040B0000000000000000000000000000000000000 -:1040C0000000000000100811C11100400041212132 -:1040D00090200041000000000000000000000000EF -:1040E00000000000000000414110A0080002000094 +:10408000000000000000010001000000000000002E +:10409000000000008200A00000009100000011005C +:1040A000410000008002054041100408008000002B +:1040B00000800080000000000000000000000400FC +:1040C00003000000000000004000000000000000AD +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 -:10410000000000000000000000000000800000002F -:10411000000000000000000000000000000000009F -:10412000000000000000000080000080800000000F -:10413000000000000000000000000000000000007F -:104140000000000000004104104109000309098932 -:104150004100020003050000000000000000000014 -:10416000000003001000110041000800000008409A +:10410000000000000000000040000500100000005A +:104110000000000000000000000000004100210439 +:10412000100083000400C111408508000341800095 +:10413000000080008000000000000000000000007F +:1041400000000000000010800500200003080000AF +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F -:1041800000000000000000000000004000000000EF -:10419000000000000000000000000000000000001F -:1041A000000000000000000082000808A084A000B9 -:1041B0000000008400020000000000000000000079 -:1041C00000000000000000000110000000000100DD -:1041D00001030000000000000000000000000000DB -:1041E00000000000000000000000000001000000CE -:1041F00001000000000000000000000000000000BE -:104200000000000000000000000090000800000016 -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E +:1041800000000000000000000221080041001000B3 +:1041900000000000000000000000A01100008000EE +:1041A0008900900004001100092082820110C101E1 +:1041B000C00000880288A00000000000000000008D +:1041C000000000000000000001A00000000000014D +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000101000000AC +:10421000000000000000000000000400A1012000D8 +:10422000040000000000000000000000000000008A +:10423000000A000000000000000000000000000074 :10424000000000000000000000000000000000006E :10425000000000000000000000000000000000005E :10426000000000000000000000000000000000004E :10427000000000000000000000000000000000003E :10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A0000000000000000000000000001E7E9FFFD4 -:1042B000181818180000000000000000000000009E +:10429000000000000000000000000000000000E03E +:1042A000000081410109030F00000000BD9924991D +:1042B000000000007E7E0303C0CFBFB900000000F5 :1042C00000000000000000000000000000000000EE :1042D00000000000000000000000000000000000DE :1042E00000000000000000000000000000000000CE :1042F00000000000000000000000000000000000BE -:104300000000000000000000000000000000FF6648 -:104310000066000000000000000000000000000037 -:1043200000000000000000000000000000000E6E11 -:104330000F6F1B1B1B1B0000000000000000000093 +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000038F96C +:104320002060000000008199C3FF000000009999FF +:104330000099000000001818F3F30000BFB9000056 :10434000000000000000000000000000000000006D :10435000000000000000000000000000000000005D :10436000000000000000000000000000000000004D :10437000000000000000000000000000000000003D :10438000000000000000000000000000000000002D -:10439000FF66006600000000000000000000000052 -:1043A000000000000000000000000000000000000D +:10439000000000000000000000000000000000001D +:1043A00000C100400000000000000000000000000C :1043B00000000000000000000000000000000000FD :1043C00000000000000000000000000000000000ED :1043D00000000000000000000000000000000000DD @@ -87127,404 +87127,404 @@ :1044000000000000000000000000000000000000AC :10441000000000000000000000000000000000009C :10442000000000000000000000000000000000008C -:104430000000F690C3C3DBDBDBDB00000000DB1811 -:10444000DB18000000000000000000000000000079 +:104430000000003D0000F9000000E70700008D0CBF +:10444000CF0C000000000000000000000000000091 :10445000000000000000000000000000000000005C :10446000000000000000000000000000000000004C :10447000000000000000000000000000000000003C :10448000000000000000000000000000000000002C -:1044900000000000F060FF6F00000000000000005E -:1044A000000000000000000000000000000000000C -:1044B00000000000000000001B1B1B1B0000000090 -:1044C000FCFCC0C000000000000000000000000074 +:10449000000000000000000000000000000000001C +:1044A000000000000F00FFF000000000000000000E +:1044B000000000003C3D0000FF000000E707E707A8 +:1044C0008F0C8F0C000000000000000000000000B6 :1044D00000000000000000000000000000000000DC :1044E00000000000000000000000000000000000CC :1044F00000000000000000000000000000000000BC :1045000000000000000000000000000000000000AB -:1045100000000000000000600F6F000000000000BD -:10452000000000000000000000000000000000008B -:1045300000000000000000615006001D00000000A7 -:10454000000000000000000000000000000000006B -:1045500000000000000000610006000D0000006186 -:104560000006000D00000000000000000000000038 -:1045700000610006000D000000610006000D000053 +:10451000000000000000000000000000000000009B +:104520000000000000000F007F700000000000612C +:104530000006000D000000610006000D0001A00053 +:104540000000009000010000000000000000006179 +:104550000006000D000000610006000D00000000D4 +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B :10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B0000000000000000000000000000000F0F01B +:10459000000000000000000000610006000D0000A7 +:1045A000000000000000000000400006000C0000B9 +:1045B0000000FFFF0000000000000F0F000020209F :1045C00000000000000000000000000000000000EB -:1045D000000000000000000000A0008230303030F9 -:1045E0000D4D9DDD550000F00000000000000000B2 -:1045F00000003F033F030000000082BE82BE303F48 -:104600003F3F00000000000000000000000000002C -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:104630000000000000000000000000000000C0C2F8 -:10464000FDFF00000000000000000000000000006E -:104650000000000000000000000000A00082F370D5 -:10466000F3F22D6DBDFD5500003C00000000000080 -:10467000000000003F033F03000000003C3CFFFF40 -:1046800030303F300000000000000000000000005B -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D0000000000000000000000000005F5FBE144A -:1046E0003C3C3C3CF0F0FFFFA0AFFCFC00000000B5 -:1046F00000000000000000000000000000000F0F9C -:104700000F0FF0F0AAAA0000000000000000000057 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:1047500000000000000000000000000000000A0A45 -:10476000BE140F0F040EF000F0AAA0AF0C0C000056 +:1045D00000000000000000005555FF000000000032 +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:104610000000000000000000000055557050000030 +:10462000000000000000000000000000FF00FFFF8D +:10463000000000005D0C0000000000C30F0D3C00F6 +:104640002C2000000000000000000000000000001E +:10465000000000000000000000005555FC0C0000A8 +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:104690000000000000000000000000005555F0F090 +:1046A0000000000000000000000000000000FF000B +:1046B00000000000C00000AA0000000020A020A010 +:1046C00043000000000000000000000000000000A7 +:1046D000000000003F3C5F5500000000003C0F0F51 +:1046E00005BEBEBE0000000000000000000000008B +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000033F57 +:104720000257000000000000000000000000000030 +:104730000000F0F00000CF0000AA0000000030F000 +:1047400030F043FF00FF0000000000000000000008 +:104750000000000000000F000F0000000000003CFF +:10476000003CAFBEBEBE0000000000000000000024 :104770000000000000000000000000000000000039 -:104780000D0D0101F0F0AAAA0000000000000000D9 +:104780000000000000000000000000000000000029 :104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000400482110040E2 -:1047C00000000102A0100085004000000000040469 -:1047D00020002080C0040202000040000000040409 -:1047E00000000000000204000400884000002008CF -:1047F000200084004004C004000304000400000002 -:1048000040040000880088002000880400000000A8 -:10481000C00200002000200000042000200000044E -:104820000004C00000800000200000000000000024 -:104830000004000020000400400400000002000802 -:104840000004000220C0004000040002200010C04C -:10485000100209000020009000C000C00002000209 -:104860000000400200000000000000000002000004 -:104870000000000000000000000000000000200018 -:104880000000000000000000000000000000000226 -:104890000000000000000000000000000000000018 -:1048A0000000000000000002000000000000000006 -:1048B00000000082000000008000000004000041B1 -:1048C000000000000800901000021000020002002A -:1048D00002008200020000400200004100000800C7 -:1048E00090000300040004020000048000000400A3 -:1048F00004000000000002000000040000000200AC -:1049000000040000200000000000840004000000FB -:104910000000000000000000000000000000000097 -:104920000000000000000000000000002000000067 -:104930000000820000800500050000000440000027 -:1049400000840004001000000000000000080008BF -:104950000010001000000008400000000410008457 -:104960000000000408000000050304080008000817 -:10497000008400000000000800000000200000008B -:10498000000800000000000800000000008400048F -:1049900000084000000800080008000000000000B7 -:1049A000008400000000001009000000000000006A -:1049B0000002098409080040820882000008800182 -:1049C000000804100000040004409008820804401D -:1049D00090004040000000001000000004049020FF -:1049E0000221000090000000000000000080100381 -:1049F000002000009009000082000000C000C000FC -:104A00000000000000200000000000000000002066 -:104A1000000000000000000000000000000082080C -:104A2000100000200000000800000400000000004A -:104A300000000008C00000000000000000080000A6 -:104A4000000000000000100800000000000800A0A6 -:104A5000002000A00008000000000084000000000A -:104A6000008500000900080000000900000008029D -:104A70008008102000A0000000000000000000A03E -:104A80000000000000000000040000000000000022 -:104A9000008400000000000800000000000000008A -:104AA00000000000000000000000080000000000FE -:104AB00000000000000000A0000000000000000056 -:104AC0000000000000000020000000008200A04064 -:104AD0000810A04010040020000400200000002066 -:104AE000002010058200A0200000000084000009C2 -:104AF00000020040840000000000000000000820C8 -:104B000008000020000082000000000000000000FB -:104B100000008200000008000800040000000800F7 -:104B20000000820008008200040082004000820031 -:104B300008020002820008020000000000091020A4 -:104B40000805004000000000000000000200000016 -:104B50000000000000000000000400000000000051 -:104B60000004030000A0000000400000000041001D -:104B700000000021000000000040001000000000C4 -:104B80001000000000000000000000000000000015 -:104B9000000000000000080000A000000000080065 -:104BA0000000000000000000000000000000800085 -:104BB00041000000000003000000000000000000B1 -:104BC0000000000000010000000000000000820062 -:104BD00000000800000000000000000000001000BD -:104BE000000000000000820000000800000000201B -:104BF0000000400004800100820000000008A000C6 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C2000000000000000820004000000820000007C -:104C30000000000000000800000000050000000067 -:104C40000800000000000803000000080000000049 -:104C5000000000C000040000200000000000000070 -:104C60000000000000000000000000000000000044 -:104C700000010000800000024000040041A000008C -:104C80000020000000000000000000000000000004 -:104C9000040000000404000011A00900000000004E -:104CA00000000000000000000040000000001000B4 -:104CB0000000000005001084000000000400000057 -:104CC00000000000000000000000000000002000C4 -:104CD000000020000000000000000000C0000000F4 -:104CE0000020000000000200840000008208000490 -:104CF00000210008000000000000820000000021E8 -:104D000000000000000000000000000000000000A3 +:1047A00003030202000000000000000000000000FF +:1047B00000000000F0F0000084008480858220105A +:1047C000C000200204000240108020002000C141EF +:1047D000C0000000C0412000000084002010200024 +:1047E000000088002000200088002000040204044B +:1047F000840084000000200000030000202020002E +:1048000020200400200020002000200004002000C0 +:1048100004044000200088002000000088022004DA +:104820002004000020000000000004000000000040 +:104830002000202000000000200000000002404076 +:1048400004C0090004002000802141200902040066 +:1048500004002000002020001008000000000002DA +:10486000040040002100210000004102000200007D +:1048700000024000000000000000000000000001F5 +:1048800000000001090000000000000004004000DA +:104890000000200284000000000000000000200052 +:1048A00000020000200000000000000000022002C2 +:1048B00000C0000200002000000000000110020003 +:1048C0000000A00082004000A000844004400220BC +:1048D00000000000020000000205030004000000C8 +:1048E00000000200000002000200000004000000BE +:1048F0000000100000000440000000000000000064 +:104900000000000000000040400000001000000017 +:10491000020000000000008000800000020500008E +:104920000000000000000000001000100000100057 +:10493000C000400004000105830000004108080990 +:10494000001000100008000080C000880001000076 +:1049500000090084008805000000000040040008F1 +:1049600000080084008400000484000000000008A7 +:10497000004000840008000800080004000800004F +:1049800000080008001000080000808400848008EF +:1049900000840000000800840002000200000008FB +:1049A0000002000800880008000000000000000865 +:1049B00080000000800800004000400000009009D6 +:1049C000A010A008A0084000400000210000100036 +:1049D00040000005A008880800080008000800083A +:1049E0000000000000100008080000080008000097 +:1049F000080000000008082000000040000000003F +:104A00000000000000000008000088000000000016 +:104A10000000040000000000000000000009000287 +:104A20000000001100000000002100000000000054 +:104A3000000500000000000004100000000000005D +:104A400040000004100041000500830000880300BE +:104A500000A00308000000400002008400A000083D +:104A6000100008000000000803000000080000001B +:104A7000000000000000000008000000000000002E +:104A800000000000000041000000000000000000E5 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000300000003 +:104AB000000000000000410041000510000000005F +:104AC0000000C100A000840300211040080000087D +:104AD0000040C02110110000000008000000080084 +:104AE0000000000082000000000000000000000044 +:104AF0000004000000000011000000400800000059 +:104B000000000000000000000000000400000000A1 +:104B10002000040000000000080000000000080061 +:104B20008200000000000000000000000000000003 +:104B30000000000800000000001008000000004015 +:104B40000000000001050800110000000000210025 +:104B500000000000000000000000000400A00300AE +:104B60000000000000000000000000000000000045 +:104B7000000000000000000000000800000000002D +:104B80000000000000000000000000000000000025 +:104B900000000000000020000000000000001000E5 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000210000000000D4 +:104BC0000000000000004010040000000108000088 +:104BD0000021000800218205000000000000820082 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000080000000000000000AD +:104C00000000000008000400000000000000002078 +:104C10000000002000200000000000000000000054 +:104C20000000000000000000000000000000000084 +:104C3000000000000000080008000800A0000000BC +:104C4000000000000400000900000090082040005F +:104C5000000021000820000008880000000400086F +:104C600004080000000000A0000000000000000098 +:104C7000000040042100400005000000000000008A +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000008004000000900A3 +:104CC00000000000000008000800000088009000BC +:104CD0000021402100401000820000000000000080 +:104CE0000020002100000021000000000003080057 +:104CF00000000000000000000000000000000000B4 +:104D0000000000000000840000000000000000001F :104D10000000000000000000000000000000000093 -:104D20000000002100000000000000000000000062 -:104D3000C00000000400000040004000A009000581 -:104D40000008000040000002000000000000000019 -:104D50000000000000000300000000000000200030 -:104D60000000002005000000000004040000000016 -:104D70000000000000002000000000000000000013 -:104D80000000000008000000000008000000000013 +:104D20000000000000000000000000000000400043 +:104D3000000000410000A000820000000000000010 +:104D4000000000000008000000000000000000005B +:104D5000000000000000040000000000004000000F +:104D6000000000010000000000000000000008003A +:104D7000000000000000080000000000000000002B +:104D80000000000000000000000000000000000023 :104D90000000000000000000000000000000000013 :104DA0000000000000000000000000000000000003 -:104DB00000000000000000000300000000000000F0 -:104DC000000041000000050000880300080000000A -:104DD00000000000000000000000000100000000D2 -:104DE000000000000000000040A04084001040824D -:104DF0000000880000000000000083009000000018 +:104DB00000000000000000000000030000000000F0 +:104DC0000000000020000000000000000000004083 +:104DD00000010001100000000090000500210010FB +:104DE000000000000000000000000000880000003B +:104DF00000000000000000000000000000000000B3 :104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E3000000000000000020000000001010140012C -:104E4000000082A0004000201004A0C000400040EC -:104E500020A00000000000000000004020100920F9 -:104E600000200000000000000000008000000000A2 -:104E7000008000000000000000002000080000008A +:104E1000000010A000200010009000000000000022 +:104E20000000000000000000000000000001000180 +:104E30000000000000000000000000000000000072 +:104E4000000000000000000000000000910182004E +:104E500000000010114080200003200000830002A9 +:104E600000400000000000000000200021000000C1 +:104E70000000000000000000000000000000000032 :104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB0000000000000001000800000000810020246 -:104EC0000002002000800000000000804080000000 -:104ED0000080000000000000000000001000200022 -:104EE0001000020500000000000000008000000922 -:104EF0008000000000008000800000801080210001 -:104F00000408400300000000000000000000000052 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F300000000000000000000000000000000380EE -:104F400021001100202100008000800000000000EE -:104F50008040008080000000000000000000019000 -:104F6000010000000000000000000000000004003C -:104F70000800A0A0C000200004000400208201401E -:104F8000000001010001000000000000000000001E -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 -:104FC000000800000000010184000200A090000021 -:104FD000400008009040C0000000000000000000F9 -:104FE00000000000080100000000000000000000B8 -:104FF00040A000408208881000000000000000006F -:10500000000000000001000100000000000000009E -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 +:104E90000000000091800080000000000000000081 +:104EA00000000000000000000000000000000008FA +:104EB00000080002000000000000000000000000E8 +:104EC00000000000000000000000000000090403D2 +:104ED00080090010200010031000210800000020AD +:104EE000008000850000008000000000000000003D +:104EF00000000000000000000000000000000000B2 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000001080000000000001 +:104F2000000000000002000000000000000000007F +:104F30000000000000100000000000000000000061 +:104F4000000000000000100020000400410011805B +:104F50000200080009210000000100900183008880 +:104F60000008004000040000000400000090000061 +:104F70000000000000000000000000000000000031 +:104F80000000000000000000000000000000000021 +:104F9000000000000000000020001001A0881000A8 +:104FA0000090000000000001000000000000000070 +:104FB00000020000000000000000000000000000EF +:104FC00000000000000000000100000001000100DE +:104FD00000080000000000090000010003000000BC +:104FE000400000001000000000000000C0000000B1 +:104FF00000010000000000000000000000000000B0 +:1050000000000000000000000000000000000000A0 +:1050100000000000000000000000C00000000010C0 +:105020000010000000000000000000000000000070 :105030000000000000000000000000000000000070 -:1050400000000000000000010000088800040004C7 -:10505000A00008400040000000C000000000000068 -:105060000000004100054121000500000000000093 -:105070000000800000000080000000000000000030 -:1050800000000008000900050320000000000000E7 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000030040AD -:1050C0000008000900100802102100008000008084 -:1050D0000080800000000000000000800000000050 -:1050E000000000002102030041000804000000004D -:1050F000000000008000008200008000001000A07E -:105100000000000041800400210011100000000098 -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:1051400000000000000021000500200005400000D4 -:10515000000000008000804080830000800000008C -:1051600000000000000001850000000000010000B8 -:1051700000000000000010002003084008000001AB -:10518000000300A000000104000001000001000075 +:105040000000000000000000000000000000000060 +:10505000000000010000A00100000010100221115A +:105060000011000000000900000020000000800086 +:1050700000000010000300200040000000000000BD +:105080000000000000000000000000000000000020 +:105090000000000000000000000000008000000090 +:1050A0000080000000000000000000000000000080 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000000000E0 +:1050D000000000000008410882080003A1C0080881 +:1050E00041000503A100880020000200002000000C +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000038C +:10512000008500800000410004000400040000002D +:105130000000000000002100000009000200000043 +:1051400000000000000000000000000000000080DF +:105150000000000000034100410008001103094065 +:10516000A001A00004014100050021009100000001 +:10517000000000000000000000000000000000002F +:10518000000000000000000000000000000000001F :10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000120000001000000BD -:1051D0000000400020401000C00008204082040071 -:1051E0000000000000000000000000E000000000DF -:1051F00000000000000000000000000007000000A8 -:105200000081000007000000000000000000000016 +:1051A00088009010884040000100010001000100CB +:1051B00000000000000000000100000000000000EE +:1051C00000000000000000000000000000000000DF +:1051D000000400000000000001900000000000003A +:1051E00000000000000000000000000000000000BF +:1051F0000081000007000006000000000000000021 +:10520000000000000000000000000000000000009E :10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E +:105220000000000000000700600000000000000017 :10523000000000000000000000000000000000006E :10524000000000000000000000000000000000005E -:105250000000000000000000000000000000070047 -:10526000000000000000000000000000000000003E -:10527000000000000000000000000F0503013C0CCE -:1052800028080000000000000000000000000000EE +:10525000000000000000000000000000000000004E +:1052600000000F0F0F0F00000000FFFFFFFF000006 +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E :10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE +:1052A000000000005F1EFFFF00FF0055000000002F :1052B00000000000000000000000000000000000EE :1052C00000000000000000000000000000000000DE -:1052D0000000000080A080A015001500F0003C3CFC -:1052E000FCFCA8A800000000000000000000000076 -:1052F000000000000000000000000000FF55C34156 -:105300003C0C3C0C0000000000000000000000000D +:1052D00000000000000000000000000000000000CE +:1052E00000000000000C0A0E00000000FFFFBFFFDE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D -:10532000000000000000000000000000000000007D +:105320000000000000005F1EAAAA00FF0055000058 :10533000000000000000000000000000000000006D :10534000000000000000000000000000000000005D -:1053500000000000000080A080A010001000A0004D -:1053600028280000A8A8000000000000000000009D -:1053700000000000000000000000000000005D5D73 -:10538000FF5D2DFF00FF0000000000000004000092 +:10535000000000000000000000000000000000004D +:105360000000000000000000000000000000FFFF3F +:10537000FFFF00000000000000000000000000002F +:10538000000000000000000000000000000000001D :10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD +:1053A0000000000000000000FC3CFC3C28FF00FF67 :1053B00000000000000000000000000000000000ED :1053C00000000000000000000000000000000000DD -:1053D0000000000000000000FFFFFF0F00000000C1 -:1053E0003C0CFF0F70707000000000000000000017 -:1053F00000000000000000000000000000000000AD -:10540000FFFFFFFF00FF00FF0000000000000000A2 +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F000FCFFFFFF000000000000000000000000B4 +:10540000000000000000000000000000000000009C :10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000006C +:1054200000000000000000000000F000FFFF28FF67 +:1054300008FF000000000000000000000000000065 :10544000000000000000000000000000000000005C -:1054500000000000000000000000D7D7D70703F3CA -:1054600003F33C0C0000000070000000000000008E -:1054700000000061000500090000000000000000BD -:1054800000000000000800000000000000380000DC -:1054900000A000610006000D0000000000000000F8 -:1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC -:1054C0000000000000000000000000000061000675 -:1054D000000D000000610006000D0000000040000B -:1054E000000000001000200800400008000000003C -:1054F00000000000D7F7C3E3FFC0FFC000000000BA -:10550000000000000000000000000000000000009B -:10551000000000005F5F3F3001000100000000005C +:10545000000000000000000000000000000000004C +:105460000000000000000000000080610006000D48 +:10547000000000613006000D000005000A20050054 +:1054800000A000610006000D000000000000000008 +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000008F4 +:1054B0000000000000610006000D00000000000078 +:1054C0000000000000610006000D00000000000068 +:1054D0000000000000000000000000000061000665 +:1054E000000D000000610006000D00000F00FFFF2E +:1054F000FCFFAAFCFFFF000000000000000000000D +:10550000000000000000000055FFC3FF0000000085 +:10551000000000000000000000000000000000008B :10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B -:105550000000B0B030F03C3C3C3C007800780000EB -:10556000000000000000000000000000000000003B -:10557000000000000000C3C3C3C3FFC0FFFF000062 -:10558000000000000000000000000000000000001B -:1055900000000000000050503F30BDBCB5B400001A +:105530000000000000005D5D5F55000000000000FD +:10554000000000000000FEFE00000000000000005F +:10555000000000000000000000000000000000004B +:10556000000000000000FF5F0A023C3C3CBC3C3CE9 +:105570003C3C0CFFAA0CFFFF5D0C0000000000008B +:1055800000000000000000000000FF0FFFFF00000F +:10559000000000000000000000000000000000000B :1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000B0B000C00800000000550055F9 -:1055E00000000000000000000000000000000000BB -:1055F000000000000000000000003C3CAA8AAA0055 +:1055B00000000000000000000C0C0F0000000000C4 +:1055C0000000000000000000FEFEFEFE00000000E3 +:1055D00000000000000000000000000000000000CB +:1055E0000000000000000000F55508003C3C3C1C99 +:1055F0005400FC0080BCC0FC3F003F0000000000E5 :10560000000000000000000000000000000000009A -:10561000000000000000000000000000000020006A +:10561000000000000000000000000000000000008A :10562000000000000000000000000000000000007A :10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:1056500000000000000000000000FF35F035AABE89 -:10566000300000000000000000000000000000000A -:105670000000000000000000000000000F00AA8AE7 -:10568000AA8A0000000000000000000000000000E6 +:10564000000000000000000000003C0F3C0F0000C4 +:10565000000000000000000000000000000000004A +:10566000000000000000AAFA3CFC0F0F0F03F0D06E +:10567000F0F8FC00FC0082BEC3FF300030000000E8 +:10568000000000000000000000000000000000001A :10569000000000000000000000000000000000000A :1056A00000000000000000000000000000000000FA :1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D0000000000000000000000000000F35003551 -:1056E000AAAA300000000000000000000000000036 -:1056F00000000000000000030000C00088002040FF -:1057000000004000C00000002000880000002000D1 -:1057100010040000020000028408040020002000A1 -:105720000000040084004000400000080004200045 -:105730000000100400002004840020002004200049 -:1057400004048800880420000000200000020000FB -:10575000200040022003400000004002200400001E -:1057600020002008100404000000000000020000D7 -:1057700040002004200000400004108208000004C3 -:1057800000020084000200000090000000020002FD -:1057900000000090400200000000004020000002D5 -:1057A00000000004000000040000200000000000D1 -:1057B0000000000000020000000000000000009057 -:1057C0000000200000000000000020000000000099 -:1057D0000000000000000000100000002000000099 -:1057E0002000000021024000000000000000000036 -:1057F000000000000002000200000200000004108F -:105800000000000000000000000090000000020006 -:10581000000000090000100000000200000000006D -:105820000200020900000000000000000000020069 -:105830000010000004000000000000000000400014 -:105840000000020000000000000000400200000014 -:105850000000020000000000040020000000000022 -:1058600000004000000000000200000000000000F6 -:1058700000000000000000000000000000840000A4 -:1058800003C00008000400080084000002000000BB -:10589000038800000000000000000000000000007D -:1058A00000040008200000080008000000000000BC -:1058B000000004004000000800080000000000088C -:1058C00000040000008840000010000800000000F4 -:1058D0000000000400004000000400040000000874 -:1058E00000000008000000000000000805000000A3 -:1058F0000000000000000000000000004000040064 -:1059000000100008002000008800900800000040FF -:105910000000020088000000000888050000000068 -:105920000200000000000000200000000000400015 -:105930000000000000000000004000000000000027 -:1059400000000000000800001000000090000000AF -:105950000000000000000000000000000000000047 -:1059600000004000000000000000400000000000B7 -:105970000000000000000003000000000000000024 -:1059800009001100110000000000000004000000E8 -:1059900000C041200000050040000000030021007D -:1059A00000080000000204000000000000000000E9 -:1059B00000000000080000000000000000000000DF -:1059C00000000000000000000000000000002100B6 +:1056C0000000000000000000000000003C0F3C0F44 +:1056D00000000000000000000000000000000000CA +:1056E000000000000000000000F000F00F0F0F0AA3 +:1056F000F0F0F0F084002000000000028821040097 +:105700002000200200024000000040020400880047 +:105710000000000084002000000000048800200039 +:105720002002200488002000000004002000200047 +:1057300084000000000000002000000000000000C5 +:1057400020002004880220002000000084002000A7 +:10575000040020028400880020000000880000006F +:1057600020002000200520040200000488042000FE +:105770008400C0002004400000A0000000000500DC +:1057800040040002219020002000009000A00000B2 +:105790001000000240020000000000000000400075 +:1057A0001000004000024000000000000000000067 +:1057B00000000004100200000000000000001000C3 +:1057C00000000000000000000000000000000000D9 +:1057D000002000020004000440000002000000005D +:1057E0000000008200020000000000000000000035 +:1057F0000000000000024040001082001000021073 +:10580000A000020090000200000000002041000003 +:1058100082000000000000000000084000000000BE +:105820000000000002000000000000000000000076 +:105830000000000004000000000000000200000062 +:1058400002000000004000042040000000000000B2 +:1058500000000040004000050200000002000000BF +:1058600000000040000000000040000000000000B8 +:1058700000090000000000000800004000000010C7 +:105880000008000005000000000005C00000000046 +:1058900000000000000000080000040000000008F4 +:1058A00000080000000000000308000000000004E1 +:1058B00000000008000800080004000004000000C8 +:1058C000008204100000000000000008000000003A +:1058D00000000000000800080008000000000000B0 +:1058E0000000000800000008008400080008000014 +:1058F00000000000001000080008000090000000F8 +:10590000000000001000C0000000820882000000BB +:10591000000800000008000800000000000000006F +:1059200000000000040000000000C00000000000B3 +:1059300000008400000000000000000000000000E3 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000040043 +:1059600000000000000000000000004000000000F7 +:1059700000000000000000000000002100100820CE +:1059800011000800088841A009A0000003000500DC +:1059900000000504400000000000000000080000B6 +:1059A00000000000030008000000000000000000EC +:1059B0004100000000004000000000000000000066 +:1059C0000000000000000000008400080008001033 :1059D00000000000000000000000000000000000C7 -:1059E000080011000000400000A0000003000300B8 -:1059F00000080000000421000000000000840040B6 -:105A000000000004000408000040000000049009A9 -:105A1000080000000000000000400000004082116B -:105A20000000000400410820000000000000000009 -:105A30000000000400400400002000000800C00333 -:105A40000000000000000000002000000010000422 -:105A50000040000000000000000000000000040002 -:105A600040000000080000000000004000000008A6 -:105A70000000080900050000000000000000000010 -:105A800000400300000010000000000005000000BE -:105A9000000004000000008800880000008800006A -:105AA0000400004021000000004000000010200021 -:105AB0000300210000000088040000000000050031 +:1059E00000000000000800000000030000000300A9 +:1059F000000000000000000000000800000000009F +:105A00000800000000400004A0400804000000104E +:105A10000040004000400840080000000000000076 +:105A2000080000000040000000000000000000002E +:105A30000004004000000000000000000040A00042 +:105A400000000040000000400000000000000000D6 +:105A50000004A00000000000080000000800000092 +:105A60001000000000000000040000000000000022 +:105A70000000040008000000000000110000000009 +:105A800000410000000000A00000410000000000F4 +:105A90000000000000000000000000000000000006 +:105AA00000000010000000001100000000000000D5 +:105AB00000000000002000000000000000000000C6 :105AC00000000000000000000000000000000000D6 -:105AD00000000800080000000000000000000800AE -:105AE000000000000000000000001000000008009E -:105AF000000011001000030000000000008800906A -:105B00000000000000000000000000000000000095 -:105B1000000008000000002000000000020000005B -:105B20000000000000000000000000000000000075 -:105B3000000000000800000000000000000000005D -:105B40000000000000000000000000040000000051 +:105AD00000000000000000000000000000000000C6 +:105AE0000000008200000000000000000000000034 +:105AF00000000000000011880000000000004000CD +:105B0000000000000000C0001000000000000000C5 +:105B10000000000000000000000000000000000085 +:105B20000000000010000000000000000000000065 +:105B30001000000000000000000000000000000055 +:105B40000000000000000000000000000000000055 :105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 +:105B60000000000000000000000000050000000030 :105B70000000000000000000000000000000000025 -:105B8000000000000000000000000000000004040D -:105B90000040000008000000000000000000008835 -:105BA00000000000000803000000002000000000CA -:105BB000400000A0080000000000008803A00000D2 -:105BC00000000000000000000000000000000000D5 -:105BD0000000000040400000000000000000000045 -:105BE00000000000000000000000000000000000B5 -:105BF0000000000000000900000003040000000095 -:105C0000000008000000000000000000000000008C -:105C10000000000000000000000000000000000084 -:105C20000800040000000000000000000000001058 -:105C3000080000000000000000000000000000005C +:105B800000000800000005842100000810880020A3 +:105B900000000002050000000000080021000000D5 +:105BA00000000000080400000000000000000000E9 +:105BB00000000000000000000000000000000000E5 +:105BC000000000000000000008000904028800082E +:105BD00000000000000008000000000000000000BD +:105BE0000000000000A00082100000000000000083 +:105BF000000000000000000010000000000008008D +:105C0000400000A000000002A00000000000000012 +:105C100000110000000090000000000000000000E3 +:105C20000000000000000000000000000000000074 +:105C3000000000000000000000000000000008005C :105C40000000000000000000000000000000000054 -:105C500082000000000000000000000000000000C2 +:105C50000000080000000000000000080000000034 :105C60000000000000000000000000000000000034 -:105C7000000000000000000008000000000000001C -:105C800000000000004000000000000000002000B4 -:105C90002000000002C0008200020200000000009C -:105CA0000900000404002000200000000020000083 -:105CB0004104000000C000C01100000000001000FE -:105CC00004000000110000000000000000000000BF -:105CD00010000300000000000000000000000000B1 -:105CE0000000400000000200000000000000000072 -:105CF000080000000000100000000000000020204C -:105D000008884000000011000000000000000000B2 +:105C7000000000000000000800000000000000001C +:105C80000000000000000000000000000000000014 +:105C9000000000000000000000C000000000000044 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000020001100000000000000B3 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000008800000000000000000040DC +:105D0000000008000000000000000000000000008B :105D10000000000000000000000000000000000083 :105D20000000000000000000000000000000000073 :105D30000000000000000000000000000000000063 @@ -87679,915 +87679,915 @@ :10668000000000000000000000000000000000000A :1066900000000000000000000000000000000000FA :1066A00000000000000000000000000000000000EA -:1066B0000000410040080010001020004000880445 -:1066C0000104828040200205C0848504000000008F -:1066D0002004400020039000848400000000021188 -:1066E0000010C0002000400804914000A0004000BD -:1066F0008400000390000800200004000000C00097 -:10670000401140048800200420008811000020006F -:106710000000C002C00420002000C00010000000E3 -:10672000C004000220008400880402040400000069 -:106730001000100008041003008305910800204099 -:10674000004008000002410100040020404000C059 -:10675000000400002000000421000010000041900F -:106760004100000100900000000010100002000035 -:106770000000000000000000A000000080000000F9 -:106780000082000410000000080000000004000067 -:106790002100000000000090004000000082400046 -:1067A000000000000500000240000084800083001B -:1067B0000000400000000000104100000000000048 -:1067C00011080008400000009080020000800010C6 -:1067D00008000000004100408800000000000000A8 -:1067E000000000080000020000000000000000009F -:1067F00001000000200000000004000000800404EC -:106800000000000000100000000000000000000078 -:106810000000400010000000000400000000020022 -:106820000000000000000840912002000300040066 -:10683000040004000882000009088008000009081C -:1068400000009009410088080000000200000002DA -:1068500020090300090802084184000800004008DC -:1068600041002008209004820002001000000084F3 -:1068700000040200000440040000408509044104B3 -:10688000C009000000040005040000080984000895 -:10689000410405000000000000000900000800009D -:1068A0000904000000844000000002910008044038 -:1068B000A0004100800080210000000000000000D6 -:1068C0004000000000100280040040009000000022 -:1068D00000000000900000004020000400110008AB -:1068E00000200000880000000000000800000000F8 -:1068F0000000000000000000000000000000000890 -:106900000000002000002000000000000021000026 -:106910000000000000000000000000000020004017 -:10692000000088409000000090000000000000007F -:106930000000000000000805010000000000080041 -:10694000000080000800008800020000080000002D -:106950000000000000000000000000000000000037 -:1069600000000000000000000000002000000040C7 -:106970000400000000000000000000000000000013 -:106980000000000000010000000000000000000006 +:1066B0000000000020008820000288000000000088 +:1066C00088000400200000002000000000000000FE +:1066D0002000000000002004000041800000820033 +:1066E00020048800200040002000880000000000F6 +:1066F00020000000000000002000000420004003F3 +:1067000020052000200020002000200000000000C4 +:106710000000000000000000200010040000200025 +:1067200020000200200020000103200300000000E0 +:106730000000000209840000000000050040000085 +:10674000000810A00000000200000000400000024D +:1067500000A00000000000A0000000404008000071 +:10676000000000000004009000040002000000048B +:106770000000000000000000400000001040000089 +:106780000000000000000000000000000008000001 +:1067900000000000000000000000000000020000F7 +:1067A0000000000000000000400040002100000048 +:1067B0000000000000010010820002000000000044 +:1067C00082000210000082000000024000008800E9 +:1067D00000000000020000000000000000000508AA +:1067E000000002000402000000000000000002108F +:1067F0000000000000000000000000000000000099 +:1068000000000000000008000000000000009000F0 +:106810000000020000100200000000000000004024 +:1068200000400100820801004000830010000100C8 +:106830000000000040000800000000820904000081 +:1068400020080084204040C005820040000000086D +:10685000008800840000000000820000028400081C +:1068600010090000000400092008090800040008BD +:10687000008200000000000000000000000000088E +:1068800000080008000000000008000800080000E0 +:1068900000080008000000000000020000000008DE +:1068A00000080984100020004010800840088284FD +:1068B000400800C00000808200C000008410020078 +:1068C000C0000021A000001000088220000808403D +:1068D0000000000800200000000000000000000090 +:1068E000004084008240A000010000000000002160 +:1068F0000000000800000000000000000000000090 +:106900000021000000000000000000100000000056 +:106910000008000000210000000800000000000046 +:106920000000000000100000000000000000000057 +:1069300000000000000800004000200000000000EF +:10694000000008001000000010000000000000001F +:10695000000800000000000000000000000000002F +:1069600000000000000000000000400000000000E7 +:106970000000000000000000000000000000000017 +:10698000000000000000000000000088000100007E :1069900000000000000000000000000000000000F7 -:1069A0000000000000820000000000000000000065 -:1069B00000000000000000000000040000000000D3 -:1069C0002000080509009002020408100004A040FD -:1069D000020008040000C00900409040004110007F -:1069E0000004021100020000C004820484408200FE -:1069F00002000002094000020004004008400000BC -:106A0000A00010850000020000000040000082008D -:106A1000080000030009402108021000080082005D -:106A200000009000C000080300098200A000C0021E -:106A30002010020210210040C00909008200040257 -:106A4000000020002100408200010204000121A07A -:106A50000008030800A01100418405000088000020 -:106A6000100000C01000008403404084118820847E -:106A7000210082000888020000880400042021040C -:106A8000000000A00004000088400040100808003A -:106A900000000000000800080500050021000000BB -:106AA0000800020000004100008211880804000470 -:106AB000400041008000030000040004840221849F -:106AC000880108008200A0004000000404000008C3 -:106AD000A0000020A000C0200000C00200000000B4 -:106AE0000000A01184208220880082000000004164 -:106AF0000000000002211000C080C000C000900013 -:106B0000200000000000080000200000000000003D -:106B10000000000004000000000000000011000060 -:106B200000000800080000000000000082000800CB -:106B300008080800100004004000820000008200E5 -:106B400000000000200000000040002000001000B5 -:106B500000000020000000000000000000000020F5 -:106B600040001000000000000000000000000000D5 -:106B70000000000000008000000000100000000085 -:106B80000000000000000000800000000000000085 -:106B900000000000000200000000000000000000F3 -:106BA00000000000000000000004000000000000E1 -:106BB0000000040000000000800000000000000051 -:106BC00000000000000000008200000040004100C2 -:106BD00002C0C0088800000082000000080884404D -:106BE0000000001000000008840000000000080001 -:106BF00000000000001100000008000084080800E8 -:106C000083808200400000000000000000000000BF -:106C100000000008000000000000820000000000EA -:106C2000000000000000000000004000C000000064 -:106C30000000A00082008200000008000880080018 -:106C400000A000040000000000000084000000021A -:106C500002400008200502C00084008200000004F9 -:106C600003C0119002012100039003C0008800823C -:106C700000000020410000200800058800084000B6 -:106C8000000008100000400200000800008800001A -:106C900021000000000000000000000800000000CB -:106CA000080011000000000041000000002000006A -:106CB00000001100000010000000208811080840AA -:106CC00003900010400000000000080001000100D7 -:106CD0008200020101000100C00010A0048402092A -:106CE0008209010000000000000100000000000017 -:106CF00000000240000800901002000000000000A8 -:106D0000000000000000000000000000C0C0A0045F -:106D100000A0824100000000000000000000000010 +:1069A00000000000000000000000000000000000E7 +:1069B00000840800000000000000800000001000BB +:1069C00000400800000488000000000408000820BF +:1069D000A0008200000008000800080082001000EB +:1069E0008205000000000800000041040000004093 +:1069F000000400000004000000000000000000008F +:106A00000040000000400000000000000000000501 +:106A1000000000000000000008000000004000002E +:106A2000000000000000000008000000200000003E +:106A3000000000009005A00082004002000001025A +:106A40000000000000040200000000400000000000 +:106A500000080000000000400000000000000000EE +:106A6000000000000008000000000000C00000005E +:106A7000000000000000004000000000000000A036 +:106A800000000000000000A0000000000000000066 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000500000800000000D9 +:106AB000000000000000000000840200020000004E +:106AC0004009000000000008002000000000000055 +:106AD00000050000000000000000000000000000B1 +:106AE000000082000800000000000000000000001C +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B2000000008000000000000000000000000005D +:106B30000000000000000400002000000000000031 +:106B4000000000000090002000000000080000008D +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000000000000000015 +:106B800000000000000005000000000000040000FC +:106B900000000000000000000000000000000000F5 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000000D5 +:106BC0000000000000000008080000040008001198 +:106BD0000400000800000000000000000021000088 +:106BE0000000000000000000000082000000000023 +:106BF0000010000000000000000000000000000085 +:106C00000000000000000000000000000000000084 +:106C1000000000000000000000000000000000056F +:106C2000000000000000000800000000C00000009C +:106C30000000000000000800000000000009000043 +:106C4000002100080088004000000400000002004D +:106C50000000000000000000000000000000000034 +:106C60000000000000000300000000000000000021 +:106C700000000000000000000000004000000000D4 +:106C800000000020030000000000000000002000C1 +:106C900000000200004000000000020000000000B0 +:106CA00000000000001000000000000000000000D4 +:106CB00000000000080000000000000000000000CC +:106CC000000000000000000200840000000102013A +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF00000000000A001A001000000000000000052 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 -:106D300000000000000000000000000004C002404D -:106D400000A00482852004082084020000000300C3 -:106D500008000000804109050208804080C18205CA -:106D6000808880101020000800100008000000003B -:106D70000000000080000000000080800000000093 -:106D800000000000000000000000000000009083F0 -:106D9000218808A08008000000000000000000001A +:106D300000000000000000000800000000018801C1 +:106D40008801000100000000400000000000110860 +:106D5000000800100000000000000000000000001B +:106D60000000000000000000000000000000000023 +:106D70000000000000208409000300030000000060 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 :106DA00000000000000000000000000000000000E3 -:106DB0000000000000000000000000000000008053 -:106DC0008000000080802000A10000008000000002 -:106DD000800380000000100008000500850090007E -:106DE00008038310052080008000800000008000E0 -:106DF0000000800000008000800000000000000013 -:106E00000000000080000000000080000000000082 -:106E1000C180020088208080000000000000000087 +:106DB000000000000000000004008000000000410E +:106DC0000021004000080000100000000000090041 +:106DD0002100090003050000000000000000000081 +:106DE00000000000000000000000000000000000A3 +:106DF000000000000000030010001000410200002D +:106E00000000000000000000000000000000000082 +:106E100000000000000000000000000000008000F2 :106E20000000000000000000000000000000000062 :106E30000000000000000000000000000000000052 -:106E400080000004808080000400099020002180E0 -:106E500020000800104082400900010091000890C5 -:106E600008008201A04000850200020040A020002E -:106E7000040088008400081088000400A0000400BA -:106E800088009000A000C000200010000200400018 -:106E9000000010409000410082020000000000004D -:106EA00000000000000000000000000000000000E2 +:106E400011800800080003214100200010100800F4 +:106E50000020010000000000000000000000000011 +:106E60000000000000000000000000000000000022 +:106E700000000000000000000040010001000101CE +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000100002001000D0 +:106EA00008000000000000000000000000000000DA :106EB00000000000000000000000000000000000D2 -:106EC0000000080004000282C0009100000390004E -:106ED0000182009000090021008900C0001100C05B -:106EE00000C1201100020040880800040040849086 -:106EF00000A00000000000000000884000202004E6 -:106F000008C00000000000000000000000000000B9 -:106F100000000000400200900882A09100000000E4 +:106EC00000000010010000000101000000000001AE +:106ED00000000001000000010001000000000000AF +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000101000090 +:106F00000001000000000000000000000000000080 +:106F10000000000000000000000000000000000071 :106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000004080004000282C0908200904B -:106F5000082100A0000000A000200041002020889F -:106F6000040300C100100388108510030000408056 -:106F700011001180000000000000000000800000EF -:106F80000000000000000000000000000000000001 -:106F90000000000000000088000941208009000076 +:106F30000000000000000000000000000000000150 +:106F40000000000100000000080100000000000037 +:106F500088010000002102214121000800000000FA +:106F60000000000000000000000000000000000021 +:106F700000000000000000000000000000020320EC +:106F800040414041000000000000000000000000FF +:106F900000000000000000000000000000000000F1 :106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC0000000000000000080008000800080800938 -:106FD0000003001000C080080000008000000000D6 -:106FE00000000000000309100420218000030000BD -:106FF0008080008000000000000000800000000091 -:107000000080000000000000000900800000002057 -:107010000000008000000000080810A00500100318 +:106FB0000000000000000000000000000000004091 +:106FC00000400005004100100009002100100011E0 +:106FD00000410021000203021021400002030000D2 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000400948 +:10700000200005002010000000000000000000002B +:107010000000000000000000000000000000000070 :107020000000000000000000000000000000000060 :107030000000000000000000000000000000000050 -:107040000000000000000000800000C00080000080 -:1070500000000040800080050400089020404000AF -:107060000090002000000000200390914184020065 -:1070700088000410888400000000008800020000DE -:10708000000000A000C000000000004100820000DD -:1070900000000020004000000000000901410088BD -:1070A00001000000000000000000000000000000DF +:107040000000000000000000418008000900020369 +:107050000000000000000020008801000000010185 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:1070800000010000000000010000000000000000FE +:1070900000000000000000000000000000000000F0 +:1070A0000000000000880002000000000000000056 :1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000C0000408C00430 -:1070D0008200829020200290A000000000E00000CA -:1070E0000000600000E000000082000000000700D7 +:1070C00000000000000000000000000801000000B7 +:1070D0000000009000000000000000000000000020 +:1070E00000000000000000000000000000000000A0 :1070F0000000000000000000000000000000000090 -:107100000000000000000000000000000000070078 -:10711000000000000000000000000000000000E08F -:1071200007006000000000000000000000000000F8 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F :10713000000000000000000000000000000000004F :10714000000000000000000000000000000000003F -:107150000700000000000000070000000280082077 -:10716000A0AFA0AF00000000BEBEA0F5F000000080 -:107170003A3A3A3AFF550F05CFCFCF000000000052 -:10718000000000000000000020702020000000002F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF :1071900000000000000000000000000000000000EF -:1071A0000000F505F50500000000000000000000EB +:1071A00000000000000000000000000000000000DF :1071B00000000000000000000000000000000000CF -:1071C0000000000000000000000000000000AAAA6B -:1071D000AAAABEBE40FE00F0FFF0BFFFBAFA01400F -:1071E00004100C0CFCFC000000001414A0F5AA0014 -:1071F000C300000FF0FFFF550F05CFCFCF000000F9 -:1072000000000000000000000000202020200000FE +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E :10721000000000000000000000000000000000006E -:1072200000000000F3F30303000000000000000072 +:10722000000000000000000000000000000000005E :10723000000000000000000000000000000000004E :10724000000000000000000000000000000000003E -:10725000E8E828EB000040FEC3C3C3C315051000D7 -:1072600000000000F5F5FC0C0000000041000000EB -:10727000FFFFF5F03E0A3E0A00000000DF1FDC1CA5 -:1072800000000000FFC33C001717FF3CC3C303838B -:1072900000000000FFAA3FFF00000000CF7D0C7D32 -:1072A000000000FFC3C303030AFA0000000000004F -:1072B00000000000000000000000000000000000CE +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000C0CC6 +:1072B0000C0C0000000000000000000000000000B6 :1072C00000000000000000000000000000000000BE -:1072D00000003C3C3C3CFF3F2A0000FF00F0143C17 -:1072E000143C000000000505FC0C000000004100FB -:1072F0000000FFFFFCF0FFFFFFFF00000000D313C2 -:10730000D010000000004D4D4D4D1717C300C3C3F2 -:10731000C38300000000AAAA3F0000000000CF4184 -:107320000C4100000F0F5555F3F30AFA000000005E -:10733000000000000000000000000000000000004D +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:107330000F7F0F3E00000000000000000000000072 :10734000000000000000000000000000000000003D -:10735000000000001E1EBE14C0002A00FFFFFFF048 -:10736000BE3CBE3C00610007000C0000006100074D -:10737000C09C00000061000E000D000000610006CE -:10738000000D0000000000000000000000000000F0 -:107390000010000000004000000000080000000095 -:1073A00000000001000000615009000100A0000081 +:10735000000000000000000000000000000000002D +:107360000000000000610006000D000000000000A9 +:10737000000000000000000000000000000000000D +:107380000000000000000000000000000061000696 +:10739000000D0000000000000000000000000000E0 +:1073A00000000000000000000000000000000000DD :1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000010002008004000080061CC -:1073E0000A0E050D00A00000000000FFFFF00000E5 -:1073F00000000003000000F000FFAAFF7878000002 -:10740000000000000000000000000000000000007C -:10741000000000000000000000000000000000006C -:107420000000000000000000AF05EB41FFF3FF305B +:1073C000000000000000000000000000000000615C +:1073D0000006000D000000610006000D00000061C5 +:1073E0000006000D000000E155E1FF003C00000038 +:1073F000000000000000000000000000000000008D +:107400000000000000000000000000000000FF007D +:10741000FF00FC5400AA0000000000000000000073 +:10742000000000000000000000000000000000005C :10743000000000000000000000000000000000004C :10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:1074600000000000FCA8FCFD000000000000FFF090 -:107470000000000000C300FFF0F0FFFF0055787827 +:10745000000000003CFC3CBE08000000410141006F +:1074600000000000FFDF0010AAE1FFE1FF003D0087 +:10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000AF05EB4100F309 -:1074B000003000000000000000000000000000009C +:107490003F005F00FCFC00AA0000000000000000AC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC :1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E0000000000000000C080C5D0000000000001F -:1074F000000055000F3CFCFCA0AF5F7D0A7DB4AAE4 -:10750000B4FFFF551E1E0000000000000000000038 -:10751000000000000000000000000000000000006B -:107520000000000000000000000000003F3030308C -:1075300030F330F300000000000000000000000005 +:1074D00000000000000000F000AA0F0F0F0F410194 +:1074E000410000000000FFFF000050305030A000BD +:1074F000FFD70000000000000000000000000000B6 +:10750000000000000000000000000000000000007B +:107510000000F000F1000100060000000000000083 +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B :10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:10756000000000000000000071F071F00000000059 -:107570000000000055FF0F3C0C0CA0AF5F280A284C -:10758000B400B455AA001E1E000000000000000058 -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000003F3F5D -:1075B000303F14D714D70000000000000000000086 +:10755000000000000000000000000000000F0030EC +:107560000000400000000000020880200000000031 +:10757000F500FFD700000000000000000000000040 +:1075800000000000000000000000000000000000FB +:1075900000000000F300F3000100060000000000FE +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000003030F3F3401005 -:1075F0008804020000032000400040000002100048 -:1076000008052008210040400003000084004000DD -:107610000283002002A08800210020041000200026 -:1076200020838400020320008400C0404000000347 -:107630002011020000008400000508008810840466 -:1076400041108800C1100204088008030888200344 -:1076500040008800C0001010C00020008810C00842 -:1076600000000200C0002040040040000000401163 -:107670000005004000000004000400000002400972 -:107680000000800200844000000000020090009092 -:1076900000022010100500030002200000408002BC -:1076A0000000001020000004008810C00008000046 -:1076B000000080000000000000000000A000200189 -:1076C00000020883000208018900A11084008010D4 -:1076D0000900210200000000000100C00400004178 -:1076E0000002000080000000000180020000009005 -:1076F0000000400002000000000008000800080030 -:10770000028004008420900004200200020088000F -:1077100040090800400000000900080403040100BB -:10772000A000020002040380020402080202414099 -:10773000900200000200020000080200A040024186 -:1077400009008840080508000800080008800800B3 -:107750000090080000802080888020804080020205 -:10776000820040000000000800024108088008086C -:1077700091100908800000000008200080008208A5 -:1077800085000010800800010000808500000000D6 -:107790000000800091088000030882040201400379 -:1077A00020840004000800850804418580090988B8 -:1077B00084010001000041080500058283000408DF -:1077C00040888804030080048000C004C100801049 -:1077D00084820003C0040004910411048004C010DA -:1077E000400100C0A0004000020000050800C020C9 -:1077F0008000040984000400002100400000000013 -:10780000400000080005000000089000002100086A -:10781000404100050402008500200011000201081B -:1078200091040000010000408800004000000000BA -:1078300000080009004000000000010800890488D9 -:1078400088000000C04100000000000000000000AF -:10785000002100090000000000050021A0054000F3 -:10786000000800008405000000410009020004082F -:1078700000410000004100114000210011000020E3 -:10788000030008000040080003004000100040040E -:1078900005900304009000400820039108000400B4 -:1078A0002000208900202000030003000300008244 -:1078B000000000000400000100000020080000207B -:1078C0008004000000000000080008820090000012 -:1078D00008900800000000000400000000002100E3 -:1078E000000000000000000000400800000005004B -:1078F000000041000000000041008800C041A000DD -:10790000A00083000810100900098205080000206B -:10791000054082099011A01108048209102010402E -:107920000005080082008808000000040004000030 -:107930009002000000C0400008000000008408041D -:107940002000080408200404000082100200100037 -:10795000908800008240C000A080400900100840CC -:10796000C0000002A0050008400002409041001144 -:1079700008090011082000404000080400004100F0 -:107980002000000040820000C10009A000000000AB -:1079900000018200000040000200110041C0090007 -:1079A00008C00004000000080200038200830000F9 -:1079B0000004089005044009114021080000082136 -:1079C0000001A188030000000000024002011040F5 -:1079D0000390411008000008108441400300038513 -:1079E00088082184410000000500800891000004FF -:1079F000000021A000004109089000C000820002A0 -:107A000000008800820800210800080000000041F2 -:107A1000040500000002040590211005000000206C -:107A200082048520C041820940002005000000003A -:107A3000080004080020000004204011001100008C -:107A400008C141C100A00484000000008208C000F9 -:107A5000080008000821A000C00008110208A020AA -:107A60000882840201408803820084000021C00053 -:107A7000C0410800820540000002044108000000E7 -:107A800000204000000011841100098440024040A1 -:107A900005400804020004900002210800001002C2 -:107AA00004014189200500002082C00480000000FC -:107AB00005000000000000000000800000840000BD -:107AC000000005042010090500210000000000004E -:107AD0002100000000000000000020000000000065 -:107AE000000000040000200000000000000000046E -:107AF0000000000000000000800021009000210034 -:107B00001100000820211000004100000000A0002A -:107B100000020111880204080008C0218810000337 -:107B20008400200420000041830801040221104148 -:107B300010040000000000401000820000009021AE -:107B400020C100000041400000040280000000004D -:107B500000804000850340218200100384008200E1 -:107B600008210841840008088400082100408200A0 -:107B700008020041C040822110081000842000202B -:107B8000822000000200000004000000200021A06C -:107B90000900400004C00000800005202000000013 -:107BA00003040000800180000900042120910308E3 -:107BB0000000830100000000000011004090002040 -:107BC0000002002000000010000000019040004072 -:107BD0002100201020020800000040820000000068 -:107BE000000011820000000041020000000020A0FF -:107BF00000822001004000C020080900000000A110 -:107C000000A1004102000001000100010001400547 -:107C100004830221028302C0909000A090820000A1 -:107C2000010020000000A0C0910804A011880000FD -:107C3000A1000200000011A1010491C0C00200C017 -:107C4000408810C0C082000090C0909000A020A08A -:107C500000A000020002000800A0008800A0088820 -:107C60000110882000A00082000400040000080029 -:107C700082000001821000051000000402042010A0 -:107C800000000090000820000040000300400010A9 -:107C9000804100400004008400808000008000805B -:107CA00000004100110009009180858009801100C9 -:107CB0000000050084000000099002800804809103 -:107CC000118091008000800000009180800005807C -:107CD0000000008000000080008000800000008024 -:107CE00000002180008000800080000000804000B3 -:107CF0008000000009080009009009004100800090 -:107D000000800000000000000000000000410000B2 -:107D1000000008008941108920000800020090003E -:107D20008200000000000000000040031000084135 -:107D300020852005030002030321030003039000B4 -:107D400011A0090000C10910C100000000088080D6 -:107D5000004180008000800980A1800000000000B8 -:107D600080000000000005009100030000050041B4 -:107D700080058000038008410080000003000405A6 -:107D8000A0A0A1000000000380008000000000010E -:107D900000100020900010011110C0009000094058 -:107DA000090011400000000000000000A005208232 -:107DB0008410A002008200000101010140A0100116 -:107DC00041A00208A00088038801C18800002001AA -:107DD0000202080082901000400002A1080000008A -:107DE0004000A000880090000000A0004000820039 -:107DF0008801A09008000002010100100000A0000E -:107E000008C040A1C1008200000808000200000074 -:107E1000000001000000C0C000830041A0A09090BD -:107E2000001004C1A0020000000100010001900345 -:107E3000C0112089A11000000401000101010441CA -:107E40000020910488C0C1890082408401C10001E2 -:107E50000420C02090C0A002080000040090101070 -:107E6000C0020000008808001090000000200802F6 -:107E70004010820410C09010C04000002105A010E6 -:107E8000C08500840088A0A10040002000020240BC -:107E900000000800020000008009032011A1828375 -:107EA00083000080802180910011000200201008D2 -:107EB000054080840021C08300208005000203115A -:107EC000030541000591038590110080009141C197 -:107ED0000001880080800000858080000080000014 -:107EE0008000808000000000910080000000000001 -:107EF000908080000000000005008002410521A163 -:107F000000828002009100208302000000000080B7 -:107F10008000000080000000000000A000000000C1 -:107F20008040000000400000000800000000000049 -:107F30000000411184C000114088418040052100AB -:107F400005A10002101191A084058010802080C13D -:107F500000030001001100A0000000000009000063 -:107F60008080800000100080008000008000008081 -:107F7000000000110000800000000000A000802030 -:107F800021008803000000828080000300208080A0 -:107F90008080800088001000100002008802828823 -:107FA0000488A0000088000200900001000000008A -:107FB0000000000001830421029110900182000161 -:107FC00001000090080109A10841A001C00582013B -:107FD00084C0820800010001009100C0000002007E -:107FE000020240400800000090208208900004082F -:107FF0009082880200000200A00490049000050016 -:10800000A0004100030520A0C0091002A00120002B -:1080100004020240040000000000000060000000B4 -:1080200000000000840000000000070000000000C5 -:10803000000000008400000000E007008200000053 -:1080400000E000000000000000E0000000810000EF -:108050000000070048420000000000E00700820026 -:10806000000000000000000000000000000084008C -:108070000000000000000000000000E000006000C0 -:10808000000000000000600000000000000084000C -:108090000000000007000000007E007E00000000DD -:1080A0000103090F0089898900000000FCFCC0C0A1 -:1080B0000000000000000000C140C140C1C0C1C0BC -:1080C00000000000000000009000C3C3E724030389 -:1080D000000000000000000000000000000003811C -:1080E00003BD30070007F0F0FF00F330F3303CFF32 -:1080F0003CFFFF0FF000FF3CC3003C3CBF260F00DD -:108100000F00FF7E81006624420000400040CFC384 -:10811000C7C73F30FFF030FF3000667FE6FF00004A -:10812000000081C399FF00CFCFCF000000007E4246 -:108130007E420000000000000000C140C140010973 -:10814000F1F9000000000000000000000000E7243A -:108150003F3F0000000000000000000000000000A1 -:108160003F813FBD30040004F0F0FF00F330F330F6 -:108170003C003C00FF0FF000FF3CC3003C3CB9203A -:108180003F3F3030EF6E8908662442000C4C0040BF -:108190000C0006063F300F003FFF3F0000000000CC +:1075D0000000000000000000000000000000000F9C +:1075E00000300000000000000000000000008804DF +:1075F000C0002040880020000200A0040200880093 +:107600004000400088001000201120008800000089 +:10761000200088004000000000000000000004007E +:107620002000880040040000200020000202000228 +:107630000000200088082000000000000004000472 +:107640000000200420004000000040002002200034 +:1076500000000000200088000000880088048404E6 +:10766000400088004000C0000000400021100800D9 +:107670000000200000001090009000000000400278 +:1076800040000000002000204000000040022100D7 +:107690004000000000000000000000000040000466 +:1076A00000000000000000000000000000000001D9 +:1076B00000000000000000000000000000000000CA +:1076C0001000100000000000000000000002009008 +:1076D00000002100000000900000000000000002F7 +:1076E00040001000000000000000000000C00891F1 +:1076F0008000040088001004020890000040000090 +:1077000000000000001000000000A00800000000C1 +:107710000000000000000000020000000000000067 +:10772000000000000000840002000000080040107B +:107730000200000000000000000000000000001037 +:1077400000000000000020080040000008000000C9 +:107750000200021000000000000000000000000015 +:107760000000000902000800000000400041000085 +:1077700000008209000402080800038400040000DD +:1077800000080008000020080040000800840000F5 +:107790000004008402080008020802040208000431 +:1077A0000008008402080082008200880084000033 +:1077B000800804080000000402080084020400405D +:1077C00000000008008420080000000004080000F9 +:1077D00000000008000200880008000800080008F7 +:1077E0000004000800080008008400080088000069 +:1077F000000800082000002100090000000000200F +:1078000000000002080002080000000882020000D8 +:107810000000004100000400000000000000000221 +:10782000000000000008000000000000000002004E +:1078300000000000004000000000000020000000E8 +:107840000008000800000000000000000008000020 +:107850000000000000000021000000000000000007 +:107860000000000000000002000000000000000016 +:1078700020000000000001000000000000080000DF +:107880000000000800A00000000000000000000050 +:10789000008200000000000008000000410000001D +:1078A0000382000000000000000000000000000053 +:1078B00008000000000000000000000800000000B8 +:1078C00000000000000000000008000000080000A8 +:1078D00000000000000000000400000000000000A4 +:1078E000000000000000000000000000090000008F +:1078F000000004A00000004020A00800004100405B +:107900000800000000040040820400400040080419 +:1079100000008400040000090000000000000800CE +:1079200008000000000008000041000400000800FA +:10793000000000000000000008100000000000002F +:10794000080000000000000000000004002000000B +:107950000000080900000800A00000000000084026 +:1079600000400800000000000000000000000800C7 +:10797000000008000000C105030010001000000016 +:107980000088000000C00800000040000000200047 +:1079900000000000000000001008000804000000C3 +:1079A00000000000000008000000020000001000BD +:1079B0000000030000002100090000000000000496 +:1079C0000088000410000000000000900088000003 +:1079D000000000000000000000080090000000000F +:1079E0000000000000101100000000000000000076 +:1079F0001000000000000208020008002000000043 +:107A0000000000000000000800000000000000006E +:107A1000000000000000000000000000080000005E +:107A2000000000000008000000000000000000004E +:107A3000000000000008000000000000000000003E +:107A40000000000000210000000000000000000015 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 +:107A70000000000008008800000008000800000066 +:107A80004008032000A000A000000000000000004B +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000800030000000000CB +:107AB00000000000000008000000000000000000BE +:107AC00000000000000000000000000000000010A6 +:107AD000000800000000000000000000000000009E +:107AE0000000000000000000000000000000000096 +:107AF000000000A000040004000802000400800050 +:107B0000008800400003200000000000000000008A +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000000055 +:107B3000000008000200000000000000000000003B +:107B4000000000000000000020000008000000000D +:107B500000000000000000008200000000000000A3 +:107B60000000000000000000000000000000000015 +:107B700000000000000000000000000000004000C5 +:107B80000000004005000000000008002000000088 +:107B9000210000C020000000000020400000004044 +:107BA0000000004000000000000400000000000091 +:107BB000000008000000200000900000000002A06B +:107BC00000040000000020001188000000000010E8 +:107BD000000021000300000000000000020000007F +:107BE0000000000000000000000000000000000095 +:107BF00000000000000000000000000003840000FE +:107C000080000000000000000000000000000000F4 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 +:107C40000000040000000000000000000000000030 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C8000100001002000880000000000000000003B +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000001000000000000000000000000000A4 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000010000000000000000000000063 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D400000001000200040002100000000000000A2 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D80000000000080008000800000210000000052 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000001000000010000000000B1 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000083 +:107E000000000000000008101000A0008400000026 +:107E10000000000000000000000000000000000062 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000000000000042 +:107E40000000000000000001000000010000000030 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E70000000000000000000000000000000000002 +:107E8000000000000000000000C10000000100C070 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC0000000000000000000000800000008000999 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000082 +:107F0000000000000000000000000010000300104E +:107F1000040300000000000000000000000000005A +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F400000000000000000000000008000000000B1 +:107F50000011000000000000000000000000000010 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F8000000000000000000000000000044021008C +:107F9000050040000000000000000000000000009C +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000040000AD +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:10800000000000000000000000000000000000016F +:1080100000040188010000000000000000000000D2 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:10809000000000E000000000000000000000000000 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:108110000000000000002424000000000000000017 +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF :1081A00000000000000000000000000000000000CF :1081B00000000000000000000000000000000000BF :1081C00000000000000000000000000000000000AF -:1081D00000000000430840000084218600000000E9 +:1081D000000000000000000000000000000000009F :1081E000000000000000000000000000000000008F :1081F000000000000000000000000000000000007F :10820000000000000000000000000000000000006E :10821000000000000000000000000000000000005E -:10822000000000000000C1C1C10000000000663C69 -:108230000FFF0CCF0CCF00000000000000007E42BA -:108240000303FFFCF3F00000000000000000FFD873 -:10825000FFD8F7F7F7F7000000000000000000006B -:1082600042423F03FFC33C00FFFF00009999818118 -:10827000000FFF0F00FF00FFE7E70CCF00FF00FF3C -:108280000000009924240909F0F0F0F0000000003B -:10829000007C007CFF006666F909F909999900FFE6 -:1082A0000000000000000000F9F9F90010000000D3 -:1082B000663C0F002424E7E70000000000000000F7 -:1082C0007E423F3F9F9C9390000000000000000012 -:1082D000FFD8000099FF187E000000000000000099 -:1082E00000007E7E3F03B1B1B1B1FFB100009090BC -:1082F00099003C663C6666660F0F24240CCF424210 -:108300007E7EFFFF66FF00FF00FFB4B4B4B4000040 -:10831000000000400040C3C30F0FF909F909999903 -:10832000C3C300610006000D000000610006000DDF -:10833000000005615A0E050D00A000610006000D49 -:10834000000005615A0F050D00A000610007000D37 -:10835000000000610001009100001061200E004D3E -:108360000008000005615A0F050D00A00000000084 -:1083700000000000000040000000000080610006D6 -:10838000000D000000610007000D000000614006C4 -:10839000000D000000613006000D000500000A001D -:1083A00000000000000000000000000000000000CD -:1083B000410030300000000000FF0000000000001D -:1083C00043434300FFC3AA823C3C43025F0AEBEBFA -:1083D000C31700175C5F5C5F3CFF3CAA0000000015 -:1083E00055FF14BE00000000000000000000000067 +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:10829000000000000000000000000000243C24005A +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:108310000000000000000000000000000000243CFD +:10832000200000000000000000000000000000002D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:108350000000000000000000000000610006000DA9 +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:108390000000000000000000000000000061000676 +:1083A00000090001000000000000000000000000C3 +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D +:1083E000D7FF0000000000000000000000000000B7 :1083F000000000000000000000000000000000007D -:108400000000000000000000000000000000828268 -:10841000C0C00200000000000000D7FF14000000F0 -:10842000000000000000000000000000000000004C -:108430000000410030300000000000FF000000009C -:1084400000005F5F5F003C0028003C3C7F3E5F0A0D -:108450004141FF173C175C505C503C553C0000000C -:10846000000000AA14BE0000000000000000000090 +:10840000000000000000000000000000000000006C +:108410000000000000000000000000000000EFFF6E +:108420000400001000000000000000000000000038 +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:108460000000FFFF280000000000000000000000E6 :1084700000000000000000000000000000000000FC :1084800000000000000000000000000000000000EC -:108490008282C0C00000000000000000170F170F0C -:1084A0000000000000000000FF0F5C5C0000000006 -:1084B00055FF3C0FF2A2520200000000FCFCA0AFEE -:1084C000000000000000000000000000C0C0FCFC34 -:1084D00000000000BE30BEF3EFEF2C2CF0F03CAA01 -:1084E000000000003CFFBEBE0000000000000000D5 +:1084900000000000000000000000000000000000DC +:1084A000FFFF0000000000000000000000000000CE +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C +:1084E00000000000FE00C2000000000000000000CC :1084F000000000000000000000000000000000007C -:108500000000000000000000A0A00000000000002B -:108510000000BF1FBF1F7878787800000000F7FFC9 -:10852000F4FC0000000000000000F0005C5C0000B3 -:10853000000055003C0FF7A75707000000000C0C87 -:10854000A0AF00000000000000000000000028EBC9 -:1085500028EB00000000823082F3C7C70404F0F06B -:108560003CAA0000000000C382820000000000005E +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:108560000000000000003E000200000000000000CB :1085700000000000000000000000000000000000FB -:10858000000000000000000000A000A000000000AB -:1085900000000000B010B01078787878000000007B -:1085A000070304000000000000000000100000832A -:1085B0004004200040008540880520888203400058 -:1085C0008802204182000002000220842000000076 -:1085D00000412004884040002004200440804002E4 -:1085E0008400202120008200880000000003880011 -:1085F0008802000020002005040002052005040078 -:108600000005200084004000C005C003C004200411 -:10861000880410002004880084000000200021400D -:10862000000401002140200020002004020000047A -:108630004004009000C0808240030002112021020B -:10864000008220820502000000910001000200006B -:108650000002058400010403008404C004840402B1 -:10866000C0840000408200004000040005000000BB -:1086700000000091000000C0000020000004000085 -:1086800000000002040000828900000020020000B7 -:108690000985210140000003000000004100009016 -:1086A00020030001200002010000000009008000FA -:1086B00004000100028220000280401008000384B0 -:1086C00020411000020000000009200000411000BD -:1086D000000209004021000088100280080305C044 -:1086E0004005400400834008408083C08200880029 -:1086F0000000020885400200104000000040020314 -:1087000002408804020002800040028202042083AA -:108710000010008001080084024002804100000037 -:10872000030511410109218201020280A00010000D -:108730004011020040088005808800028085800882 -:1087400040050010000005080008008440080010E3 -:1087500080840001C008850000080091840280C068 -:108760002041800080884108851180044005000078 -:1087700004080000850040C1890089050008000147 -:108780008008850104898000C14000018541C10144 -:1087900009400982090402844041C001A00282000C -:1087A0004110C0000284020002412001834002887F -:1087B0000010A00090009100C000200882088409E9 -:1087C00010400102040090009003102188089021BD -:1087D000040920000000880284020482001184A1A0 -:1087E0004021400884021000004000030220C00322 -:1087F00000030003000000218208104040210040D7 -:1088000000210040040200400041000000028821D5 -:10881000900800210021004090402003000000400B -:108820000040004000400008022140000000000518 -:1088300008050002A005008440000200110009A004 -:1088400000A000080240080000A002A005000000EF -:108850000800050040080504008800010009088898 -:10886000081000A003A1080100001000002021044E -:108870000090000041900000000000000001000096 -:1088800003010000038503010801000003000085C7 -:10889000088203001000009009010889C1000388C4 -:1088A00000090821210903030400C10880002140B8 -:1088B0000000000005000000841000020805000808 -:1088C000000200001008000800400011A000C002D3 -:1088D000C0000802084140418421A00200090008AC -:1088E0001020C00420110203C005820302050421E8 -:1088F00082000411C02008200000C0400200840251 -:108900000280A005100008400400080308000400CD -:1089100004111141008441080484C0100400824005 -:1089200084000041401109000205C0800005088450 -:108930001000A021080504800804000103000300C2 -:1089400021012111210888000311400002002104A7 -:10895000028420820089000011000090410002047E -:1089600000A100080000040820C000C008000000AA -:1089700020C0000021000085020900000982890052 -:108980001108800200000900118802000000110097 -:10899000000008001000000510C0000510001000C5 -:1089A00040091000090010000200200021021110EF -:1089B0000004041002000090044010400000400039 -:1089C00090001000044002000000018090000800A8 -:1089D00000008800000000828200C0000003024105 -:1089E0000805001100008200408020214000200086 -:1089F00008080400010803A00121008000000020F5 -:108A000004040020830082000221200302110010D0 -:108A10000241A00804052000204000002183C0007E -:108A20000880C04100050800C003A0111000C00369 -:108A300020050808C003C00000030008004000042F -:108A4000A004042080880400840400040208400478 -:108A5000099008041100400400024100100000A029 -:108A6000050040902084000000A0800280001008D3 -:108A700003000000218820C0A0102010090400007D -:108A80002100110011001090000083000000A000E0 -:108A90000008910000840084000088010008A00400 -:108AA00000000804030000000020002008A00500CA -:108AB0000000800000A0002011000000000000095C -:108AC00010000820400000000002030041080000E0 -:108AD000201100210009000020000400040000040F -:108AE00000030000A105824100050000900490A150 -:108AF000821002214041000004A1830000080421EB -:108B0000000008A1100000C10205A00000004041C3 -:108B100000050021040000088405000840210088A9 -:108B20008384C021000082000400C000C000400314 -:108B3000A0088220000500214008A1040041400057 -:108B4000C01090C011080004008803054004080507 -:108B5000110400202100200004880040000400408F -:108B6000092000840200400020400040029000C024 -:108B70000008000003001104000009200440000068 -:108B80002000000002400000000221000900000453 -:108B9000000021000000000040004000080000002C -:108BA00000400241000000000000000041200000E1 -:108BB0000000110211C0008800408804400000003D -:108BC00000880910000000000000000000C100A1A2 -:108BD00091A090890000000000000000000001004A -:108BE0000000000100A005830003008982C0010885 -:108BF0008484020000014101020000000000910194 -:108C000084000001000040820190001008084082AA -:108C10000402024082081040059002100882408938 -:108C200004100882828802020088C00388040304BA -:108C3000C0094004100902024009008402034005F3 -:108C4000000304C01002100000001100000000C169 -:108C500003A00289808900000000000000000005D8 -:108C60000302000900080089830240020089008095 -:108C70002180800000001141C10300200002000992 -:108C8000882104080021000080002100000080806D -:108C9000840084000080808000892100850280801B -:108CA0008041082000C08000838000200890009050 -:108CB000028321A100058002C08503A1004000833A -:108CC00085842190004100C010002121092141909C -:108CD000838508008820A00000000000000000003C -:108CE000908021008000A082100004000800008312 -:108CF0000800100420801010098021000911108044 -:108D0000C02084804003891000000080008540025C -:108D100011888000004180028000030020030820A9 -:108D200091020400052020104108C00090214080DD -:108D30009003000080030000808885822121830049 -:108D4000C0820000000200408000012001000020DD -:108D50000189084001000500C0000000000000007B -:108D60000000080205000800088801000100010059 -:108D700000890100010089A08409000200000000B0 -:108D800000A002900502020108A00000C01010100F -:108D9000024082C1400090A002100810880288841E -:108DA000090482A091829005048883110208058835 -:108DB00010020984908402A00210108302C005A052 -:108DC00041020811000000040004C000000000007F -:108DD0000000010040010010C001900300000000ED -:108DE000000000000000000100000101020000017D -:108DF0000001030040A000838284112100000000D4 -:108E00000001000001012000C1010100000011105B -:108E100002821021108821A0004084828908020269 -:108E20000004040309C020209041048591C1C0A022 -:108E300001038808108202020020091084094140C1 -:108E4000058505820411110400024002828300009E -:108E500000000000410000200908082140910000A6 -:108E60000000000000000000110302211021820513 -:108E700000020008820080080082004009110003FF -:108E80000310052111090408A01108210511000093 -:108E900010000008002189000809001180C14091DC -:108EA00091C0004000A189408983800300A19110F6 -:108EB0008820038340C00320918820A1C00800843B -:108EC0000410400205854002C1A0200391918090CA -:108ED000C1000800400000024188212021004020FC -:108EE000000000000000000041800200110011217C -:108EF00041009000210000114100408005800500E4 -:108F00004121102111000341101110C00511410031 -:108F1000000041008805A1800303800200100000CA -:108F2000800089A00982030084038380118503895E -:108F300085050000408088808303890500008580C6 -:108F400080008080C089000088008040000480008C -:108F50000000C10483000200000001C0000101A064 -:108F60000000000000000000000001A0000200025C -:108F700000001100020001000001030090A0880819 -:108F80009000010301000000010100010003001135 -:108F900000000000111082A0118408011000901040 -:108FA0000840040004C190208588090020C0059075 -:108FB000218591001000820208081000040020881A -:108FC000100210000802040888C08200040010008B -:108FD00002201000000000E000000041840000E0DA -:108FE000070060000000000000000000000000001A -:108FF00000000000500000E000000000000000E061 -:10900000000000000000000000008411000000E0EB -:109010000700000000000000000000000012000037 -:10902000000000000000000000E0000084000000DC -:1090300000E000006000000000E0000042000000CE -:10904000000000000000000000E0000060000000E0 -:10905000000000004200AAFFF0FF00000000000036 -:109060000000F0F000000000000000000000000020 -:1090700000000000000000FF000000000000FFFFF3 -:1090800004000028AA2800000000000000000000E2 -:109090000000000000000000C35566F0E8E82B2B3C -:1090A000D22DEEEE0F66C3AA6A6AA9A9B2B2717197 -:1090B000595903FC8E7E717EF0A5A5F01BB141EBE2 -:1090C000AA55F0F078BB77B4963C693CC5F9063AEE -:1090D00033C3A5AA17422B7EAA00F00000000000AF -:1090E00000000000FFFF0000000000000000000082 -:1090F000000000000000000000FF00000000000071 -:10910000FFFFC7C3A0A0A0A0000000000000000057 -:10911000000000000000000000003CAA66F018E714 -:10912000DB2478874444F0663CAA30CFF30CB24D80 -:109130008E719A9AC03FB2424D423C9669C314BEAA -:109140004EE49696CC33884B87445AF05A0F90AC35 -:10915000536F3CCCAAA5E842D47E0000000000007A -:109160000000020200003C3C3C0000000000000047 -:10917000000000000000FFFF82820000E0EB000022 -:109180000000A0A0FF5FFFAA550000000000000043 -:10919000000000000000FF00CC33000095955656FB -:1091A0006F606F6035609FCAB41EB4E13C96963C18 -:1091B000BE7D82418D8D2727F5A05F0A3FCFA9593B -:1091C0005C9FF635FF0069695FAFA050FF00CC33AC -:1091D00055F096CC9556C0FC0000FFFF0000000043 -:1091E000000000000202000F00003C000000000030 -:1091F00000000000000000002AAA0200E0EBE0EB03 -:1092000000000000A0A0A00000000000000000007E -:1092100000000000000000005A5A69690000C03FC9 -:10922000FC03ACA3535CF6A35C09B41E4B1EF0A573 -:109230005A0FE427D81B41BEEB1436636336C030A7 -:10924000A95960A3CA09A55A3333636C636C696971 -:109250005A5A9633550F95563F03FFFFFFFFA06103 -:109260000005000D00000061500FC00D0008000057 -:1092700000000000000000610006000D0000006119 -:109280000007C00D000000615006001900010061D8 -:109290000006000D000005610A0F050D10A2000078 -:1092A00040618006002D100240618006002D1002F2 -:1092B00040618003002D10024061800400291002EB -:1092C000406180010021100240618006002D1002E3 -:1092D000406180060021100240618006002D0200DE -:1092E000AA000A0A000000008282030000000005B4 -:1092F000000000000000000000000000000F000F50 -:109300000FFF0F00CF00CF000C0C000020002F0F2C -:109310000082000200000000FF33CC00B0B3BFBFEA -:1093200000004141CD6E000F000F00000000000062 -:109330000000000000000100000000000000C0FC70 -:10934000C0FCFC55FC553CAF3CA0FFFFAFAF383B29 -:10935000F8FBC355C3550CFC0CFC00000000F03CAE -:10936000F03CAA00000A00000000828203000020F6 -:1093700000200000000000000000FF001700FF0FA9 -:10938000000F0000FF00CFCFCFCF0C0C000C00006F -:109390000F0F0082000200000400FF55AA00000029 -:1093A0000000000041414C190000000000000000D6 -:1093B0000100000000000080000000000808FF001D -:1093C000C0FCE8FCC055C0553CAF3CA0505000006C -:1093D000080BC8CBC3C3C3C30C0C000000000000C3 -:1093E000AA00AAFF000000003030AAAA5500000021 -:1093F0000000000000000000000000003CBE3CBE79 -:109400005555FFFFC0C3F0FF010001000000000040 -:10941000FFF3000000000000FFFFFFFFBEBEBEBE66 -:10942000C30F0F0F00000000000000FFFF0000004E -:10943000000000000000FFFF0F0FFFFFFFFF00F024 -:10944000F0003C140000B4B4B4B40078FF78555573 -:109450005555000000001C1CBE14C0FCC0FC5C5C28 -:109460005C5C00000000000000003030AA8A55005B -:109470000002500040000000000000000000003E1C -:1094800000341010BABAC0C3F0FF010001000000A0 -:109490000000FFF3000005050105FEFFFFFF55502A -:1094A000FFFAC30F0F0F000000000000AAAAAAAA2B -:1094B0000000000000000000FFFF0F0FFEFFFFFF95 -:1094C00000F0F0003C1400C0FF00FF000078FF78BF -:1094D0003535FF0000000000BCBCBE14FCFCC0C061 -:1094E000FF0FF0000000000000C08809890220087A -:1094F000880200020500010040088582210804104E -:109500002040200000042104884020212000880001 -:1095100020000000880000020400200020048404D1 -:109520002000200000082002000300102000200579 -:10953000840420000000840000002000A000C0007F -:109540000000020020001085858800020000200431 -:1095500004032000C01088000209840084008805EC -:10956000100088002000C08020820003000808004E -:109570000003210411040490040410012041402040 -:109580000091000300022000400800000008009045 -:1095900009C00002000000004100000000000000BF -:1095A000090000000500004100090000200005003E -:1095B0000200040000000400000009004000000058 -:1095C000000000020400040000081002090000006E -:1095D00041022000210004000008040000000000F7 -:1095E0002100000200000400000800050000001037 -:1095F00000800089000000809000900000008840FA -:109600000041020084000000000000000000001083 -:10961000000000000210000084100010000088000C -:109620000000022100000000000000800000000097 -:10963000000004000000004000000820000320009B -:109640000400200000002000001000002080000026 -:109650002000000000000000080008094000000091 -:1096600082000400840000100000001020000000B0 -:10967000000000080010000800400000000000008A -:109680000008000000000000040004000088000042 -:1096900000840000000000080000000800900300A3 -:1096A0000002001004000488040004080008000000 -:1096B00000080508000800A00084040000820008DB -:1096C000000040400008098800004108000802042A -:1096D00000C041104010000805884000080000103C -:1096E0000000040005880084400204C000840008D3 -:1096F00085800500048400000280108420804000E2 -:10970000218040001080A080C0801180108009005E -:1097100004410000A008A002C0004002C0000008F0 -:10972000000084408800000200210010200500C1D4 -:109730000000202188058841002100080000000564 -:109740000005000500000003822108082000002118 -:10975000002190000000000540050000000000030B -:10976000044100001004001000000000880388007D -:10977000102120100804A1411104910880038008E1 -:10978000840082100040C0040902041088042104EF -:109790009002000021A0008802000482001008A0AE -:1097A000000009000900000800080020008441C0F2 -:1097B0000004000204820040008400000088204071 -:1097C00008100900000008C0038408880900092067 -:1097D000000009020004412003A00890000400A03A -:1097E00000020040080008A00882050800A005004B -:1097F0000300801004002010000000100011202041 -:109800000008020908110200040408000000000416 -:109810008400104000000200000008100000A0407A -:1098200000008200A009A00900000000A000820042 -:1098300000408200000182008204A00008110000A4 -:10984000820088090004820040410841040020058C -:1098500082000409841182028200C002A000021169 -:10986000001108000000C000A000C011C0410804A1 -:1098700020020000C0091100000021000000008843 -:1098800021891100800000880000800000002182F2 -:1098900000104000090000080388050000C0000017 -:1098A00040000000000008040300002000000088C1 -:1098B0000090410000A0000010040000000000041F -:1098C00040004000000021002100020010000002C2 -:1098D00021904000000010880000410000000300BB -:1098E00000004000000011000000002010200002D5 -:1098F0000090050010000010008000800802A00009 -:10990000000000000000010401050441A100000066 -:1099100010000085040004030000C0000041C008DE -:10992000A021020000000000000000080002084121 -:109930000000000000000005000000000000000022 -:109940000000000010000000004000000041000086 -:10995000100000000011A0000805840000050005AB -:1099600010001000A00000008200A0000010000005 -:109970000000100000210000840500080020029172 -:10998000110200900904098820004000842002048C -:1099900000208008004085008302058400004120EB -:1099A000401040000920088802A000882000000024 -:1099B000400000000488090420880000400200885C -:1099C0000088029003884004000011000800402035 -:1099D000008802C00284009041041104110811A003 -:1099E0000502021000000000040809200020000009 -:1099F0000000004002000000080000000800020211 -:109A0000100002008800A08020000808400000111B -:109A10001002200000024021100820219011200394 -:109A200090040002901188000000880008000021C6 -:109A3000000020000010820810210010000000002B -:109A400000119021900802000002000300000400B1 -:109A50000040040400080404820800410403A040FC -:109A6000100000200008820082419009C0044000DC -:109A7000000000000000040000040005041100C004 -:109A8000009109000000000000100000911000008B -:109A90000000110000020010800080008000200201 -:109AA0000908000400040000000000000000008815 -:109AB0000000400000000000000400001100000051 -:109AC0000000000000000000000000000082000014 -:109AD0004120000000004000000000000084110050 -:109AE0000500000004002000200000000000050028 -:109AF000200004902020210440020000000000C04B -:109B0000010008000000082100000000000304100C -:109B10008801A000008210020000C00001828400C1 -:109B200000000000000000000000020000010088AA -:109B300000000000000802C000000000000100005A -:109B40000000000000000000000100008400000090 -:109B5000000400000000008408080000000000016C -:109B60000000000000000000000000008400000071 -:109B70000082000100000008A0C0000000000001F9 -:109B8000000041080521000009410041000940C0D2 -:109B90008080002004090080800000040003048904 -:109BA0000000000000000000000200000000004073 -:109BB0000400094111000080800000000000004105 -:109BC0000000000000000000000000040000000091 -:109BD00000050280004111000000808000000000AC -:109BE00000410000000000000000004000000000F4 -:109BF000000304000040110000800000000000008D -:109C0000004100001000402000800000054041415C -:109C100000C0000484048011004109008900034150 -:109C200000C1004000000400000000000000090026 -:109C30000000030085008580004105000000000051 -:109C4000000080400000000005000000000000004F -:109C5000020000000300C00040800041020000003C -:109C6000000000008011000005000000000000005E -:109C70000200000003004000418000040900800051 -:109C800000000000801001000100008200000001BF -:109C900001010085000540910440000100004000E2 -:109CA000410100098883000001000000000000005D -:109CB0000000000001000200200800010000020076 -:109CC00000000000C00100000000000000000000D3 -:109CD00000000100000001000400820800010000F3 -:109CE000020000000000C0000000000000000000B2 -:109CF00000000100000001002000400800000000FA -:109D0000040000000000C0010010000101820000FA -:109D1000000000010004880000040000028501002A -:109D20000000000100000100000000000000000031 -:109D300000000000100010000002000005000000FC +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000004002002A5 +:1085B000C02104048800020420000200020084029A +:1085C000880588038800880002000400400020001D +:1085D0008404200088002000200040000080848067 +:1085E0002002200200002003400300200003880234 +:1085F00040001008400088002020200088801000E3 +:10860000000000008808880020002000880000008A +:108610000000880088000000C00020000000C0802A +:108620008880000000082080C0008800040000004E +:10863000009000C000004100000200000040100057 +:1086400000400002000020000000000200000000C6 +:108650000000208200000000000000000000000870 +:1086600040080085008240000200008200010000F6 +:10867000000180008091000000C000030000002085 +:1086800000000000000000040000000000000000E6 +:108690000002400200020000000000000000000094 +:1086A00040202120000220020002000020000000E3 +:1086B0008800000004000000000004001005000015 +:1086C0008200020004001009000000000000000009 +:1086D000020400000004000000100000000500007B +:1086E000020010000003020400090203000000025F +:1086F00000000000000000412000000020000000F9 +:108700000200000000000000000000002000080837 +:108710000008000020000000000000000000000031 +:1087200000000204000082048804000004402004C9 +:1087300008C0000803C009040008058420844084A0 +:1087400000840300000800880008001041080908A0 +:1087500000400408090009080208000000840040E5 +:10876000000803008008042000C0090800020088F7 +:1087700009050000000800000908000400000008C6 +:1087800000080004000000080084008200080008BF +:10879000000000040084000040080008000000847D +:1087A0000008000800000208000000820408000819 +:1087B0000008000210000000000000400000000857 +:1087C0000000000800000000000000000008002178 +:1087D000002100100000000000210000000000083F +:1087E00000080000000000000408000000000088ED +:1087F000000200000000000000000040002088038C +:108800000011000200000000004100000000000014 +:1088100000210000004100080000002100000000CD +:108820000008000000000009000040031080000064 +:108830000010000004000000000000000001000023 +:10884000000000000000080000000002000000001E +:108850000000000000080000000000000000000010 +:108860000000000000000082000000000000000086 +:1088700000200089002000000082000000000000AD +:108880000000009000000000000000000000000058 +:1088900000000000000000000000000000000000D8 +:1088A000000000000000080000000000110000208F +:1088B00000000000000000200000008010100840B0 +:1088C0000800820882400000000008000800000242 +:1088D000040000000800080008000000A0000000DC +:1088E00008000200A0048200C0001000C0000100C7 +:1088F00082200000000208000000A009000008110A +:1089000008000803C0000000080000000000080084 +:10891000080000008200C0000000080008000800F5 +:108920000800000000008200000004110000820026 +:10893000020000028441C041084141000240211070 +:1089400020000900000000000000000000000008F6 +:1089500040000290000200900000000000000000B3 +:108960000090050002000300000020048000008445 +:10897000400800881000000100900000200408005A +:1089800020001100050002900000000003A000007C +:10899000038800000010000000000000000021001B +:1089A00000000000000000000000000000000000C7 +:1089B000020041A000830000001000000040000001 +:1089C000004000030000000000080000000000005C +:1089D0000000000000000000000000000000000097 +:1089E000000000000000100000000800000000006F +:1089F0000000400010008200080000080000000095 +:108A00000202080400081000000000030008000033 +:108A100000020000C0100000000000000000000084 +:108A2000000000000000080000000000000004003A +:108A300040000000840000A1004000090000000187 +:108A4000000000090000000000000000000000001D +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A7000000000000000800000020000000800006C +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00008000000040000001002080000002184EB +:108AC0000041000400100009000000000000000048 +:108AD0000000000000000100002000000400000071 +:108AE0000000000040000000400000009000000076 +:108AF000000008008200400090000041004100009A +:108B00000000080000210000C00300000000000079 +:108B100000000000000000000000000082000000D3 +:108B200000000000000000000000000082000000C3 +:108B3000100000000000000082000000200004007F +:108B400000210000000000880000020000880004EE +:108B500000880090000000880488000000000000E9 +:108B6000084000002000000000000000000002009B +:108B70000000080000020400000408880000000053 +:108B800000000000412004000000000000000088F8 +:108B9000001000000000084010C0000000000000AD +:108BA00000040200000000000800000000000800AF +:108BB000000000004000030000000800000000006A +:108BC0000010000000C000000000000200000000D3 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF00000000000000000000400000090A001053B +:108C000002C008100000000100000001000004A0E4 +:108C10000090001008840000000000000000000028 +:108C20000000000000000000000000000000000044 +:108C300000000000000090400090001010080001AB +:108C40000100000100010080000000000080000021 +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000900800000000080EB +:108C80000388800000050000004100400002000051 +:108C9000C080000000000000000000000000000094 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000800000000800080AC +:108CC0000010030800100010800000030000800066 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000000084 +:108CF000000000000000000020000400050041000A +:108D0000020090218200C11000000000000000005D +:108D100000048000802100A180000000000000000D +:108D20000000000000000000000000000000000043 +:108D3000000000000000000000000000000480802F +:108D400080000000000000000000020000000000A1 +:108D5000C000000000000000000000000000000053 +:108D60000082000000000000000000000000000081 +:108D700000000000000000000000010001000000F1 +:108D8000010040081001A0000911000000A000002F +:108D9000000000000200400090C10400000000003C +:108DA00000000000000000000000000000000000C3 +:108DB0000000000000000000000000000800C000EB +:108DC000A040040000000000000000840000000239 +:108DD000000000C0000000000000000000000000D3 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E000000010001400801828503004100000000CC +:108E100001000000000090400020001000820000CF +:108E20000000000000000000000000000000000042 +:108E3000000000000000000000000000000010889A +:108E400000100002021000000101000000000000FC +:108E50000080000000800000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000040B2 +:108E800000210021004100021002A1211002000077 +:108E900000000200000000000000000000000000D0 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC0000000000000808080000402080304000409 +:108ED0008000000000000000000000000000000012 +:108EE0000009001000000000000000000000000069 +:108EF0000000000000000000000000000000000072 +:108F000000850000000000402188A14011809009E8 +:108F1000000003004000090004000003002100805D +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F4000000000000005000000000000000000001C +:108F50000000C00000000000000000000000000051 +:108F60000000000000010000000000000000000000 +:108F700000000000000000000000000000000000F1 +:108F8000000000040000000000018940080288047D +:108F9000100000000000000001000000200002A0FE +:108FA000101002000000000000000000000000009F +:108FB00000000000000000000000000000000000B1 +:108FC000000000000800A0900020880000000000C1 +:108FD0000000000000000000000000000000000091 +:108FE00000000000008100000700000000000000F9 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000700000000000000000000000000000049 +:1090200000000700008200000000000000000000B7 +:109030000000000000000000000000000000000030 +:109040000000000000000000000007000000000019 +:109050000000000000000000FFFF0000F0F0000032 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:109080000000000000000000000000000000FFF3EE +:10909000CFC33CEBFF2B00000000000000000000ED +:1090A00005F5F5F5FFBFFFBC000000000000000063 +:1090B00000000000000000000000000000000000B0 +:1090C000000000000000000041FF41FF7F7F7F7F24 +:1090D0000000000000000000000000000000F0F0B0 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:1091100000000000FFEBFFEB00000000000000007B +:109120000000C1C1F5F5FCBFFCBC00000000000060 +:10913000000000000000000000000000000000002F +:109140000000000000000000000041FFFFFF3E7F24 +:109150007F7F00000000000000003C3C0000C3C313 +:10916000FFFF000000000000000000000000000001 +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000003030FFFF0F8F0F0F000000000000B5 +:1091A000000000000C0CFF0C8200AAF00000000080 +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000FFFFFFFFA3 +:1091D0000486FFFF00000000000000003C3C00008F +:1091E000C3C3FFFF000000000000000000000000FB +:1091F000000000000000000000000000000000006F +:10920000000000000000000000000000000000005E +:1092100000000000F030FFFF5FDF0F0F00000000D4 +:109220000000000000000F0FFF0FC300FFFF000051 +:10923000000000000000000000000000000000002E +:109240000000000000000000000000000000FFFF20 +:1092500014050000FFFF0000000000000000408235 +:1092600080000020820200000000000000000000DA +:109270000038000000A00000000000000000000016 +:10928000000000000000000000000000000000617D +:109290000006000D00000061000E000D000000003F +:1092A00000610006000D0000000000080000000042 +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000080000000000610006000D000012 +:1092E000000000000000000000000000000000007E +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:109310000000000000010000D7CF000020FF202047 +:109320000000FFFFAA08000000000000000000008D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:109350000000000000000000000000000000CFFF3F +:109360000C0F0000000000000000000000000000E2 +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:109390000000000000000001C3C2FFCF000000FF7A +:1093A00000000000FFFF08080000000000000000AF +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D +:1093E000CF000C0F00000000000000000000000093 +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000202415541551C +:10942000404000AA00000A0AAA0000000000000054 +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC +:10949000000000000000000000000C000202C3FFFA +:1094A000C3FF414100AA00000A0AAA000000000010 +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000000000008C +:1094E000069600000000000088004000880202008C +:1094F0002000200220022000201104002005880006 +:10950000200820000008210220000000C0002000E8 +:1095100020002000201020002000200084002008CF +:1095200004002004008084840003040088002000DC +:10953000201120008400880088022004840020007C +:10954000200800002000000888888800020220000F +:109550001000200020002000880020002000400093 +:1095600040004000200284088402400204000400FD +:1095700000824040000009A000844002000000007A +:10958000200200400000000310030000040000005F +:10959000104000020000000400080000000000006D +:1095A00009000000000000080003000000000000A7 +:1095B000000209000000410000000004000000005B +:1095C0000000000000000004000521054000100418 +:1095D00040000000000010000040100010001000CB +:1095E00000000000000009000003200100002040EE +:1095F000000010001010000090030200100410057D +:109600000200A00000000000820000002000000016 +:1096100020000004000000000000000000042004FE +:10962000000000040004000000000008000000200A +:10963000000000002000100400000004021000419F +:1096400000040000000000050000002120000000D0 +:1096500000000000000400040000000000090000F9 +:1096600000100009000000040041000990030400FC +:109670000010000000840582000805000008008436 +:109680000084400800840084000800840004000472 +:1096900000400008008400880008024040880488D8 +:1096A00000A0000400820008000800820000000002 +:1096B0000084000000100008008820902008048426 +:1096C0000000002000000020009000080008028434 +:1096D000000800080008001000080008000800004A +:1096E0000008000800900010008800080004000432 +:1096F00090050020000500088410040040030000CD +:10970000000800000000000800000000048820A0FD +:1097100000050021002100050005000000020005F1 +:109720000000000500210005004100000002008546 +:1097300000000000000000050005000000000040DF +:109740000000000800000000000000080000000009 +:109750004008200000000000900000100000000001 +:109760000040000000008800900000210005000873 +:10977000208508000000000000000000000000003C +:10978000000000000800000000000000000080044D +:109790008011080000000000000000000000002010 +:1097A00000000000000000000000000000000008B1 +:1097B000000800000884400800820004000000083F +:1097C0000000000000000008000800000000000485 +:1097D00000008040000008000000000004000000BD +:1097E000000008000000030000000000008200A04C +:1097F0000582800884020802080208200040000058 +:1098000000080000002182000020100088110000E4 +:1098100000000000000008000800820082009000A4 +:10982000000500008800820082000400820082009F +:109830000200840000008200881082009003000073 +:1098400000050005080510000800000000000800E1 +:1098500000000002080004008204000400089000D8 +:109860001002000000008200C000C0000000820062 +:109870000000001000404008000002080000400006 +:10988000000803A000000000000003880000004062 +:109890000082000000A00000030000000008000893 +:1098A00000000008000000000008000000000000A8 +:1098B000410000000000000000004100000800001E +:1098C0000000000000840004000000000000000010 +:1098D0000000000000000000000000000000000088 +:1098E0000000000200A000000000000000000800CE +:1098F0000000000000000908000000000000000057 +:10990000000000000041000082000008000000008C +:10991000000500000000000000080000000000003A +:109920000000000000000000000000050800000822 +:1099300000000010A000000000000008004100002E +:109940000000000000401003000000000040000084 +:1099500000000000000000000000080000000000FF +:10996000080082000000C000C0000005000508409B +:1099700000000000C0030000101100000000000003 +:1099800000000000000000000000000009000000CE +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B00000000800008204A0080800000000000069 +:1099C000000000004000020000000304000000004E +:1099D0000000000000000000000000000000000087 +:1099E00000000000000000000000000002884004A9 +:1099F000000440000000090040A0110400210008FC +:109A00002000000304080202020800000000000019 +:109A100000410020000000000000000000020000E3 +:109A200000000000822190000200202100040008B4 +:109A30000421902100020005000320040000000022 +:109A400002400000024082218200004188040000A0 +:109A50000020001120200000000000000010000085 +:109A600000000000002090000000000082000000C4 +:109A700000210008C00800080010000000000000DD +:109A800004000000009003000000400000000000FF +:109A9000000000000000000800001100400000006D +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000004046 +:109AE00000000088000000000000000000000010DE +:109AF0000000000000000000000000000000000066 +:109B00000000080000000001000084000000018245 +:109B10000001C1000010C0820000C0000001000070 +:109B200000000000000000000000000000000088AD +:109B30000101000000C0100400000000000100004E +:109B40000000000000000000000001000400000010 +:109B50000182010000000040C0040000000000017C +:109B600000000100200000000001000000000000D3 +:109B700000880001000000841010000000000001B7 +:109B80000000000080000000000300000000000949 +:109B9000200000048400008080800000800000031A +:109BA0000000000000000000000202000000004170 +:109BB0001100414041000000800000000000004111 +:109BC000000000000000000000000005020080000E +:109BD00000410300204003000080008000000000DE +:109BE000004100001000800000000008000000009C +:109BF00000110200001003000080808000000000BF +:109C000000410000000004000000000000004000CF +:109C100000000300C10084000040030000000000B9 +:109C200000808003000040000000000000000900E8 +:109C3000000004000500050000050500800000008C +:109C40000040802000000000020000000000000032 +:109C500009000000400005000500000009000000A8 +:109C6000000000008005000021000000000000004E +:109C7000090000000900A000100000201180000071 +:109C80000000000080200000010000000000000033 +:109C9000010000000100040004C000010100C00038 +:109CA000000000C082000000000000000000000072 +:109CB0000000000000008400A090000000004000B0 +:109CC00000000001C00100000000010000000000D1 +:109CD00000000000000001008400A040000000001F +:109CE000820000000000C000000000000000000032 +:109CF00000000000000000004100054000010004D9 +:109D0000020000000000C000000000000000000091 +:109D1000000000008401090100400000050000006F +:109D20000000000000000000000000000000000033 +:109D30000000000000000800000800000000000013 :109D40000000000000010000000000000000000012 -:109D500000000000000000000800000800000000F3 -:109D6000000000000000000100000000840000006E -:109D700000000000000000000200000400000000DD -:109D80000000000000000001000000800008418386 -:109D900000000000000209C10400008200211088B8 -:109DA0004100000000020409410000000000000022 -:109DB00000000000000080410011000000000300CE -:109DC0000900000000000041000000000000000049 -:109DD0000000000000000000004180100080000032 -:109DE0000200000000000000004100000000000030 -:109DF0000000000000000000004100100080000092 -:109E000005000000000000000041000002C0804189 -:109E100000C10000034080058341400241840000EE -:109E2000808000000440002080800983000000043E -:109E300000830000000480000500000000C18004D1 -:109E400000020000000000000000054100000000CA -:109E50008005008300000004800020000000004115 -:109E60000000000200000000004000000384000029 -:109E70008005008300000005000082000000004112 -:109E800000000040000000000020000003029105D7 -:109E90002001A040000000011000858300C11008CF -:109EA000008808C000000101000184400005000096 -:109EB0008401008300000000400084000000004195 -:109EC000820100000000000000000000008300008C -:109ED00000000400008300000001080003000000EF -:109EE00000A1A000000100000000000000000141EE -:109EF000000004000083000000009000110000003A -:109F00000003A00000000000000000010000018527 -:109F10000000000000004806000000000000484269 -:109F2000821200E0070000420000000000004842EA +:109D5000000000000000000084000020000000005F +:109D60000000000000000001000000000000C00032 +:109D700000000000000000001000001000000000C3 +:109D800000000000000000010000000000000000D2 +:109D90000000000000000005844000800000C100B9 +:109DA0000000000000000041000000000000000072 +:109DB000000000000000000980020080000009008F +:109DC0000000000000000041000000000000000052 +:109DD0000000000000000000000409050000000071 +:109DE00041000000000000000041000000000000F1 +:109DF0008000000000000000004180100080000092 +:109E000011000000000000000041000000000004FC +:109E100000830000000080000500000000410000F9 +:109E20000004000000410000000004080040800021 +:109E300000C10000001180001000000000000002BE +:109E400000030000000000000000200500000000EA +:109E50000002008300000000800082000000000477 +:109E600000000040000000000000000040C10000B1 +:109E7000800000C10000000200008900000000C155 +:109E8000800000200000000000000000408300006F +:109E900084010083000000004000C0000000008337 +:109EA00004000001000000010000000000A100000B +:109EB000200000400000000020000200000000829E +:109EC00040010001000000000000000000A00000B0 +:109ED00000008201008300000000820009000000F1 +:109EE00000824000000000000000000000000109A6 +:109EF0000000400000C1000000000200100000004F +:109F00000005020000010000000000000000000445 +:109F10000000000000000000000000000000000041 +:109F2000811200E0070048420000000000004842A3 :109F30000000000000000000000000000000000021 -:109F4000811200E007004805000000000000000A40 +:109F4000881200E007004800000000000000000048 :109F50000000000000000000000000000000000001 -:109F60000000811200E0070048230000000000000C -:109F700000000000000000000000000000000000E1 +:109F60000000411200E007000000000000000000B7 +:109F7000000A0000000000000011000000000000C6 :109F80000000811200E0070048000000000000000F :109F900000000000000000000000000000000000C1 :109FA00000000000000000000000000000000000B1 @@ -88605,1697 +88605,1697 @@ :10A0600000000000000000000000000000000000F0 :10A0700000000000000000000000000000000000E0 :10A0800000000000000000000000000000000000D0 -:10A09000000000000000252B000000000000000070 +:10A09000000000000000257B000000000000000020 :10A0A00000000000000000000000000000000000B0 -:10A0B00000000000D4A4757B000000000000000038 +:10A0B00000000000DEA4257B00000000000000007E :10A0C0000000000000000000000000000000000090 -:10A0D00000000000DEAE0000757B00000000000004 +:10A0D00000000000DEA40000257B0000000000005E :10A0E0000000000000000000000000000000000070 -:10A0F000000000000000DEAE757B000000000000E4 +:10A0F000000000000000DEA4257B0000000000003E :10A10000000000000000000000000000000000004F -:10A11000000000000000DEAE60DE03400000000032 -:10A120000000023000000000000000000C400000B1 -:10A130000000000002C07B06612603400000000012 +:10A11000000000000000DEA46126034000000000F3 +:10A1200000000230A0000000000000000C40000011 +:10A130000000000002C064866126034000000000A9 :10A1400000000230A0000000000000000C400000F1 :10A150000000000002C06486000061260340000089 :10A16000000000000230A0000000000000000C40D1 :10A1700000000000000002C0648661260340000069 :10A18000000000000230A0000000000000000C40B1 -:10A1900000000000000002C06486880020008800E3 -:10A1A0004004400004000400400440110441200425 -:10A1B000200088030080200288058500012005001A -:10A1C000C10020000400C0002002A0100000A00078 -:10A1D0002000840088008804400400031000002050 -:10A1E00084054008000040002000040084000400B2 -:10A1F0000800200488002100200421004000000005 -:10A2000000000280A000A00020008884048040009C -:10A21000200020008800058089800400004009405B -:10A220000000410200902000009010900082000089 -:10A2300000020000100010100000000404000403DD -:10A24000840208040000400000000005008409C0EA -:10A2500021A0000000020500000000000000000036 -:10A26000000100C0800005000000404000202000E8 -:10A270000500C00005000000040000000402000802 -:10A280000000000009080000009000000510000216 -:10A29000850000000400000004400410A1008204B6 -:10A2A00000880000001090410000851004000200AA -:10A2B000844008000004080082C020004000100014 -:10A2C000048008020180008000108200000000412C -:10A2D0000441000208410000088800000802000054 -:10A2E0000800C000200400800841040200040000AF -:10A2F0008200104040102120000000200220009029 -:10A30000041008000010001001000041000002418C -:10A310000100884102884021A01020000010041094 -:10A32000000800100008418520080000048480080F -:10A330008004020880080008008400020004809065 -:10A340008010A0108411042000104000000400C000 -:10A350002004001000C100044000004120088021BA -:10A36000000040000004030800200000000900086D -:10A37000001004000085890802014090058541090C -:10A3800004200300000403080002400020084104E8 -:10A390004108400804400010828400010308054180 -:10A3A00040014010400204000408000010000808AA -:10A3B0000200101004000000884010024021041028 -:10A3C00040000005040884000103004004088808D8 -:10A3D0001004100000110040000000050208902148 -:10A3E00000200000002100884000201140210000D2 -:10A3F0000021080000020100C0A1000001209040DF -:10A4000005050000C000840882211121004090054C -:10A4100000008800040000000005004190050000D5 -:10A4200000000000002100000040000000000000CB -:10A4300080008020009000000400000011C0800017 -:10A4400009080000100000000000042000000300C4 -:10A450000000000800000008000000C00008000024 -:10A46000008800C000000000000400828008002076 -:10A4700000000900000000C00200004004080401C0 -:10A48000030004000000008841000000A008030051 -:10A4900000000002100400000800408403A0000037 -:10A4A000100009000000000220050905000020102E -:10A4B0000010081108048804900040000000840087 -:10A4C000848800040441A0A0108400040810A000A7 -:10A4D000C0000800C000102108118500000208001B -:10A4E0000404000500000000088082008284082027 -:10A4F00084004021A010A000C00004000800040057 -:10A5000040042002A0098200820840000021208827 -:10A51000A00482000420904100119005C0001002A8 -:10A52000040482001020820300101104080020009F -:10A53000000000A12000020000A0000400100000A4 -:10A540002100080800000010081100201000200061 -:10A550001000000000C00000028240000400000162 -:10A56000008200000010040800000020000000210C -:10A57000004000008000208204000400C1000000B0 -:10A58000000000A000002004200008000300048850 -:10A5900080040420040021000420050000001000B5 -:10A5A0001100C140034003100082108000028400AB -:10A5B00000000021011000000080A00808009000A9 -:10A5C0000000C000A00582008800C000000508004F -:10A5D00000089000080002058200820005000020AB -:10A5E0000100A00008008400C01000000100200449 -:10A5F0000080A09008000805C01084001000102002 -:10A6000002008200098004081120C100000020849B -:10A61000202082000000A000820008100800A00591 -:10A620000009000008050804A00000001140000017 -:10A630000504030210C0080100000010000000A083 -:10A64000408420A000000000000000840000000002 -:10A650000000009005A00000000000040900900424 -:10A6600000010400000490000082000000002000AF -:10A67000850000040004000000100501200800907F -:10A6800000010000001004028200100104400000DC -:10A690008003800100000000100020004000000046 -:10A6A0000000000000004000090008000000400019 -:10A6B00000050884200020000040010900840400F7 -:10A6C00082208200840008004000A0210000A00039 -:10A6D0002010000820912005002100210000042105 -:10A6E000002104080021C0002004000408400000EC -:10A6F000000400002021200082008200A000000051 -:10A7000084008810C00000000000840082008420C3 -:10A71000202040209004C02000008200000990000A -:10A72000C00900080402080083208904000508000D -:10A730000000004080200000009000000800001091 -:10A7400000000800004020000000800000002008F9 -:10A750000000024000024120000000000000000054 -:10A7600080000084080000000000000400000304D2 -:10A770000000000000000400801000000010000035 -:10A780000800200800000020000020000204000053 -:10A79000000480118001080108094100030200083B -:10A7A0000000028420002001820008200800000030 -:10A7B0000000000408040008101004A002080104AE -:10A7C00000840000040000008200C00283020088B0 -:10A7D000888208A090020004A0820000850020006A -:10A7E00000000000A1000200000000000100C00005 -:10A7F0000000000000C0C082218400100000200082 -:10A800000000000101C0204000A01008000100016C -:10A8100000010000000001004000000008090004E1 -:10A82000000408880200A0002000A000000400909E -:10A830000040A0000000800000800080A080808098 -:10A84000218000800000000000008000A080C08007 -:10A850000080008080800080008000800000210057 -:10A8600000000000000089008000000000000300DC -:10A87000000000000000058083800480000040107C -:10A880008020000800082180800000808080004136 -:10A890000021000211030300110085000000800860 -:10A8A00000400003000580000320000000040000B9 -:10A8B00000000000000080000041801000008000C7 -:10A8C0008008808000000000000000000000008080 -:10A8D00000218000800383001005C080410010002B -:10A8E00002001000030802800800080003110000A5 -:10A8F0000000800080000000804080008040808058 -:10A9000000000000000000034000A005208084003B -:10A9100010800580050011C102082080210820A1B7 -:10A920000005800080090000A00041001011851082 -:10A93000800000038000800040000200A0C00000F2 -:10A94000040002014082000000000000000000003E -:10A9500090022000A0200488880008400902C182DB -:10A960000140010001000101001001A001000141AE -:10A97000000004000400C0400000020082008400C7 -:10A98000C0C00020000000000001410082009004CF -:10A99000C10200100008010001090120018400002B -:10A9A00001C190004000A001A000092008000200A1 -:10A9B000820104000003082004A0C082004020900F -:10A9C000080082020002022004000004004000107F -:10A9D00000C0208800200090A001209000204002AC -:10A9E000C0C0000000004001000000000001840021 -:10A9F00000010000000000000001000100402041B3 -:10AA0000C01100C000000100000000001088000814 -:10AA10000088029000000000850000000001040191 -:10AA200020010000080200A0000410100040018274 -:10AA3000091101A108C000088210828480000080F2 -:10AA40000000800000800000800080000000000006 -:10AA5000008000800011000500108041408000004F -:10AA6000008080800041002080210010050300400C -:10AA7000800309410002000000090041000100A01C -:10AA800000908010208300000800050000000000F6 -:10AA900000000000840009000300A1001100110261 -:10AAA00080208010050303001080110000800084C6 -:10AAB00004C083C00283000000000080800000000A -:10AAC000809100000000000280A1000080000000D2 -:10AAD0000000000000000520040041800400800404 -:10AAE0000002008000000840890002008903048001 -:10AAF00004090900034000000000000000000001FC -:10AB00008000800500038000214021000500040032 -:10AB1000800800C10080000203800540050040401D -:10AB200041800320210002200004008000800000FA -:10AB300010210805418000408011002180000000A4 -:10AB40000000A0A0C0C08400100040104000A00081 -:10AB50000000000000000000200090902010A000E5 -:10AB600090C1842002408400050004000500040018 -:10AB70000090000000000000000000A00040000065 -:10AB80000001C0004000100010880100000000001B -:10AB900000000490A083A002400000040000010017 -:10ABA000010101900001010001009001042004084E -:10ABB0004000018901A0001000014001080802A026 -:10ABC00000000000000007008200000000000700F5 -:10ABD0000000000000000000000000000000000075 -:10ABE0004200000000000700000600000000000016 -:10ABF0000000000000E0070000000000000000006E -:10AC000000000000000000E00700604200000000BB -:10AC1000000000000081000007008200000000002A -:10AC200007000012000000E0070000120000000012 +:10A1900000000000000002C06486200020002004AF +:10A1A0002080200020000000200000008880400364 +:10A1B0000404040020028400040020002000200089 +:10A1C0002000880004000000400000400400040457 +:10A1D00004002000200020002000000320002000B8 +:10A1E0002000200320008400000040110003200014 +:10A1F0000404200420008800200020042000200007 +:10A2000020002084000020000000100440002000F6 +:10A210000400200000004000C00084004000000254 +:10A220004000000200000000004000002008000480 +:10A2300000008001000004400000C0000000400059 +:10A2400000000000400005000400000000010000C4 +:10A250000000419009000000000000000000000024 +:10A26000000004A00000000000000000000000004A +:10A27000100020000000000000000000400040002E +:10A28000000000C01020410000000000000000029B +:10A290000000000200002000000000000000000597 +:10A2A0000000000200100000010502090004000087 +:10A2B000100000030004A000000400000200A0033E +:10A2C0000400000000050000A000A04000100004F1 +:10A2D0000000000004050200000400080000000067 +:10A2E0000000000000000009000000000000030062 +:10A2F0000004000000050005000502000000020047 +:10A300000004000000040420000000050205001005 +:10A31000000400000040001010040008010800853F +:10A32000008200040083051004004008040000843B +:10A33000000800002084008840840082000409088E +:10A3400000088008000800100008008800080204C7 +:10A3500004820908000009820004008400840008C7 +:10A36000000000080008000800040008000800843D +:10A37000048400840008400840080008008400822B +:10A3800000080008000800088011000800100008FC +:10A3900000000040000800840084008400C0408267 +:10A3A0000302000000000241000000020000000261 +:10A3B0000008000300080000000000000008000082 +:10A3C000000500030000002100000010000800004C +:10A3D00000080008000000218210022184080041CA +:10A3E00008210000000000000040020800030021D6 +:10A3F0000008A005000000000000000000000008A8 +:10A400000008002100210040002100080040000554 +:10A410000000002140089040040800410010400363 +:10A4200000030040210000000000000000010000C7 +:10A430000000008800100000001000000000000074 +:10A440000800000000000000000000000000000004 +:10A4500000000000000000000010030141000000A7 +:10A460000000804000000000410000C0000021000A +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000200000AC +:10A4900000000000000000000000080041840000EF +:10A4A000000003000000C008C0408200820082005B +:10A4B00082048204820000000800040008000800F2 +:10A4C00000110400000004008200824182000800A4 +:10A4D00000000000000000000000820008000004EE +:10A4E0000000C004000000000000000200000000A6 +:10A4F00004000800820004000000000000000000CA +:10A500008200000000000000A000004100410000A7 +:10A5100000000000C0000000200000400000080013 +:10A520000004000082400800009100C02040008428 +:10A53000400003400302048240C0000000002000ED +:10A5400000000082000008A000840000000000005D +:10A5500002001010030000A00000000000008000B6 +:10A5600003000000050000000000200000000004BF +:10A5700000000004410000100810000000A00000CE +:10A5800000000300080003000300008400A0001086 +:10A590000000030000080010008400A0000000007C +:10A5A000000000A0000000840040820800080000B5 +:10A5B0000003000082000808C005000000410005FB +:10A5C000000800080040400800410041040000105D +:10A5D0000000000008000000080300000800000858 +:10A5E00008000000000084000000000000000000DF +:10A5F0008200000000020000000000000020002196 +:10A60000008000030000000000400800000000007F +:10A610000000102108000000000000000000000001 +:10A62000000000000000080008000000000000001A +:10A6300000000000000000000000000040000000DA +:10A6400000000000001000018000000000008000F9 +:10A6500000000000001000000000000003000000E7 +:10A6600000000000000000000000000000000000EA +:10A6700000000000000000000000000000000000DA +:10A6800000000010000000000000000000000010AA +:10A6900000000000100200A0000000000000030005 +:10A6A0004088000009204000000000000020000059 +:10A6B00082210008000000080000000084038400DC +:10A6C000000082000004000000210010018300004F +:10A6D000000000000008002100210021000000000F +:10A6E0000000000000000000000000040000000066 +:10A6F000040000000000080000200000000000200E +:10A700000000000000000040880000000000080079 +:10A710000000000000000000001100000000000028 +:10A7200000000021000000080000000000000008F8 +:10A7300000820000000021080882004020020088FA +:10A740000200002000400000034000000500040259 +:10A750000000410000000000000000002000000098 +:10A7600000000000080000080008000000000000D1 +:10A770000000008405020000830000000000008249 +:10A780000520000800000400000003820000000013 +:10A790000300000000000090210000000000000005 +:10A7A0000808000000000000000000000000000099 +:10A7B0000000000001000000000000010001000096 +:10A7C00000000000000091000000000001004000B7 +:10A7D0000000C0880082048800A000000000000083 +:10A7E0000000C00000000000200000000000000089 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A810000000000010000000000000000000000028 +:10A820000000000000000000000000000000010027 +:10A830008400000000001000000000000041002023 +:10A840000040001100401009020900082000030028 +:10A850008000000080001080008000800000000068 +:10A860000000000080000000000000000000000068 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000000000000A8 +:10A8B00008000000000005000200050041800000C3 +:10A8C00000000000009110000300200040894000BB +:10A8D0004000C000C08000000010800080800000A8 +:10A8E0000000000000008000000080000000000068 +:10A8F0000000800000000000000080008000800058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000008000800037 +:10A920000000000000000000000000000000000027 +:10A93000090009000200040000000100010001A05C +:10A94000004000000000000901100000000000109D +:10A95000880090000400C09000000200A0009090C9 +:10A96000000000000000000002001000A00008002D +:10A9700020000000020000000000000002001000A3 +:10A98000080090000000000000000000000000002F +:10A990000000000000000000000000009000A00087 +:10A9A0009000000000000000000000000000000017 +:10A9B0000000000000000000010000000001000194 +:10A9C0000001000000000000000000000000000185 +:10A9D00000000000000000010000901000080004CA +:10A9E00002020000000000000000002000400040C3 +:10A9F00000C0000000000000000000000000000097 +:10AA00000000000000000000000000000000000046 +:10AA100000000000000000000000000000880002AC +:10AA20000090002000000000000000000000000076 +:10AA30000000000000000000A00000000009000865 +:10AA400000020004000020000400000000020308CF +:10AA50001021001100050000000800090002008913 +:10AA600000090000000000000000000000000000DD +:10AA700000800080000000000000100000000000C6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA0000080000000000000000000000000000026 +:10AAB00000000000000000410010800900090000B3 +:10AAC00000000000000510024005090003002100FD +:10AAD00011080200100500000000008000100000B6 +:10AAE00000000000800000000000000000000020C6 +:10AAF0000080000000000000000000800000000056 +:10AB000000000000000000000000009000000000B5 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000008000000000000095 +:10AB40000082000000000000000100000100000081 +:10AB5000012000010000000000A000A000A00000F3 +:10AB60000200908804900200000000000000000035 +:10AB700000000002004000000000002000840000EF +:10AB800000000000004000880000000000100000ED +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000100000000085 +:10ABC00000000000000000000000008100000700FD +:10ABD0000000000000E00700000000000000070087 +:10ABE000000000000000070042000000000000001C +:10ABF0000000000000000000420000000000000013 +:10AC00000000000000000000000000000000000044 +:10AC1000070000000000000000000000000000002D +:10AC2000000000000000000007000000000000001D :10AC30000000000000000000000000000000000014 -:10AC40000700000066666666C300C30033C353C3D3 -:10AC5000F766F766000000003F303F3F0000000C41 -:10AC6000C90FC90F0089898900FF0F0FFC3CF00054 -:10AC700000000000000000000000000000000000D4 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000D3000000000011 +:10AC700000000000000000000F0F24BD00000000D5 :10AC800000000000000000000000000000000000C4 -:10AC90000000000000006460606000F0C3C30000BA -:10ACA000000000000000000000000000000000FCA8 -:10ACB000000C4E8D4ECF000000003C3C3C3CFF0F92 -:10ACC000000FF303F303626662660300030053C3DD -:10ACD00053C3F766F766000000003F3030300000D5 -:10ACE0000006C9FFC9FF00CFCFCF9999C3C3FC3C71 -:10ACF000F000000000000000000000000000000064 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000C3830F0F000040 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE000000000000000030000000000D30000008E +:10ACF00000000000000000000000000000FF000055 :10AD00000000000000000000000000000000000043 -:10AD10000000000000000000606060600FFFC3C31F -:10AD20000000000000000000000000000000000023 -:10AD300000FC000CCF8DCFCF0000000030903F9F73 -:10AD400099999999FFFF00000000000000000000A1 +:10AD10000000000000000000000000000000000033 +:10AD2000000000000000000000000000C3830F0FBF +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 :10AD500000000000000000000000000000000000F3 :10AD600000000000000000000000000000000000E3 :10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000410840000084B6 -:10AD90002102000000000000000000000000000090 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 :10ADA00000000000000000000000000000000000A3 :10ADB0000000000000000000000000000000000093 -:10ADC00000000000000000000000000000000F0F65 -:10ADD0000F0F1F009F0000C200C200000000000013 -:10ADE00000003C000C0CBC80BD813808FBCBFFFF91 -:10ADF0000000000000000000000000000000000053 -:10AE000000000000000000FF00FF00000000000044 -:10AE1000000000000000000000000000F6F624BD65 -:10AE2000FF0F3C6600000000000000000000000072 -:10AE30000000000036F036FF3C1808080000000053 -:10AE4000FF00C3C30F9F009081E781E700800000EF -:10AE50000F0D0F0D0000000000C200C20000000036 -:10AE60000000000024240C0C3C003D01B989B98984 -:10AE7000FC6CFC6C00000000000000000000000002 -:10AE800000000000000000000F0F666600000000D8 -:10AE90000000000000000000000000000000909092 -:10AEA00024BD000F3C660000000000000000000010 -:10AEB0000000000000003600360F240000000000F3 -:10AEC0000000F909C9C9FF9FF090FFFF00000000D2 -:10AED0000008001000000000400800000000000012 -:10AEE00000000090000080610006000D0000056178 -:10AEF0000A0E059D00A000610006000D000005611E -:10AF00000A0E050C00A000610006000D00050000FF -:10AF10000061000F000D000000610006000D000040 -:10AF20008061503E000D000805610A0E050D00A06D -:10AF300005610A0F050D00A080610006000D0000EC -:10AF400000610006000D000000000A000000000182 -:10AF500000000000000000000000000000000000F1 -:10AF6000000000000000000000EF00FF0FFF0CFCDD -:10AF700000000000000000000252A2F2FF007F006B -:10AF800000800000FF4130300000000000FF00FFA3 -:10AF9000000000000000FFC0AAC0FFFF0400000086 -:10AFA00000000000000000000000FF4DC34D000045 -:10AFB0000000AA0FC3FF3D0D31010000000000009A -:10AFC0000000AFA5A55AAAFFB4B40000000000001D -:10AFD0000000000000000000000000000000000071 -:10AFE000000000000000000000000000000000F071 -:10AFF0000CFC00000000000000000757A7F7CF007E -:10B000004F000000000000413030000000003C3CD8 -:10B01000AAAA000000000000FFCFAACFFFFF000097 -:10B020000000000000000000000000003C4D004D4A -:10B0300000000000AA0FC300FDCDF1C10000000018 -:10B0400000000000A5055F050055B4B40000000035 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B070000000000000000000C3FFC0FC0000000052 -:10B0800000A030B0000000003CC03CC00000000048 -:10B0900000000000000000000000000000000004AC -:10B0A00000000000000000000000B2C3B2FFCF0C9F -:10B0B000EBEB4F454A40000000001F131C100F3CF3 -:10B0C000FF5500000000AA55AA5508090B0B000007 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 -:10B0F00000000000000000000000003CC0FC000058 -:10B10000000000A030B0000000003CC03C80000007 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE000000000000000000F06060FFF4FFF0006E6 +:10ADF000000000000000000000000000000000F063 +:10AE000000040000000099999999000000000000DA +:10AE1000F909FFFF000000001818181800000000D2 +:10AE20000000000000000000000000000000000022 +:10AE30000F00FFF000000000000000000000000014 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE60000000000000000000000F030300FF00FFCF +:10AE700000000000000000000000000000000000D2 +:10AE8000000000FF0000000024BD24BD0000000001 +:10AE90000000F9F9FFFF0000000018181818000062 +:10AEA00000000000000000000000000000000000A2 +:10AEB00000000F00FFF00000000000000000000094 +:10AEC0000000000000000000000000000000006121 +:10AED0000006000D00000061003E000D00A00061B2 +:10AEE000000D000900A000610006000D0005806152 +:10AEF0000006000D0000000000000000000000003F +:10AF000000000090000000000000000000000000B1 +:10AF10000000000000000000000000080000000029 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF4000000000000000000000610006000D00008D +:10AF5000000000003C3C3C3CF7F7FFBE0000000056 +:10AF60005F57FFFFFEFCFFFF000000000000000035 +:10AF70000000000020002000000000000000000091 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC00000000000000000000000000000003C380D +:10AFD0003C3C000000000F0C0F0FF7F7FFFF0000D4 +:10AFE00000005D55FFFFFFFFFFFF000000007DFF39 +:10AFF0000000000000003C3C3C3C00000000000061 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B050002838282800000000F0F0AAAAC0CF5F5FBF +:10B0600000000000000000C14DC34D0000000000C2 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000FF0F0F0F0000000000FFC3C3C0CF30 +:10B0E0005050000000000000C1C14DFF4D3C000069 +:10B0F000000000000400000000000000000000004C +:10B10000000000000000000000000000000000003F :10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000B200B23C7F -:10B13000CF0C2828EFE5EAE000000000DFD3DCD0E8 -:10B140000F3C0055000000003C3C3C3C0001030368 -:10B1500000000000000000000000200010000002BD -:10B160002008C000200020840080A008000000808B -:10B1700040022002C0000002840084038800000016 -:10B180000080400000108902840020000208108026 -:10B190002010C080A0024000000304002003200310 -:10B1A00004044000880000008800400002020910EA -:10B1B000000401008441C000208588000800088246 -:10B1C0000404840020008800C000000089000510ED -:10B1D00000008880400088000004109000004000BB -:10B1E000008280000000218210040004210200C0BF -:10B1F000000400000090000200C0000200200002D5 -:10B2000000000040000205030804400000C00000E8 -:10B2100000040090050400018000000009024000C5 -:10B22000410805000000000000002002000041036A -:10B23000C00105001000090000C08904000284005C -:10B24000A003000041000000400000022000400078 -:10B2500040030000040200004000200000400221E2 -:10B26000000500008340000021C0038020059104F8 -:10B270008400200008000009020000080000840487 -:10B2800000000800020800000808200588000004EB -:10B2900000090200000200C0004090100000880079 -:10B2A0000204000000000180020083C000000000D2 -:10B2B000034108A103000221400090102000A109D1 -:10B2C0008905018284020800C000001020000100EE -:10B2D0000010219008000000881001000003058480 -:10B2E00000842108000810040040900410048040ED -:10B2F000208500A091400288008200820040020464 -:10B300000282000802082088040885840000008862 -:10B310000208028400820285410505820041000086 -:10B320000282000800880308400200044002030073 -:10B330000000400885024084030084040011820854 -:10B34000400040084011028502000200008404848D -:10B3500008004085A0038508400002004000030269 -:10B3600082000408401040001021000484084000BE -:10B370001004201020040408400800000009000008 -:10B380000008000800002000040004030000000082 -:10B3900040000000000040000041000800219041F2 -:10B3A00000000400000000210000000308004088A5 -:10B3B00000080000040000880000000300020005EF -:10B3C000040002409040002140021009C00000002B -:10B3D000000800100004020200020002000800033E -:10B3E000000505840000054000000000000305A1E1 -:10B3F000219005A188008901210021402100050834 -:10B4000008001040080011C0800000A000000800E3 -:10B41000000000000000030000080300080008000E -:10B4200003000000080021000400100003000300D6 -:10B43000C01000400000400008104100108441008E -:10B44000000000C00401000003000800090008001B -:10B450000200000000010009830400891000008838 -:10B4600000000000C000200000002000A0850908A6 -:10B4700000000400901008050209C011001100002E -:10B480000010C010901040008209000440000040ED -:10B49000040008008204A0000008000010000380DF -:10B4A000900002000000C000A00010210002044033 -:10B4B00004000020114082C00410024101098202F0 -:10B4C0000940C01141A102410885C0104083090410 -:10B4D000A000A011A0001002084108418240C00550 -:10B4E000080002418402008203C00390008200042D -:10B4F00020090000000000892140080000000084AD -:10B500002108000041042101000000900301000017 -:10B5100008004100104000840000000010C04000FE -:10B52000200420C000A0000005000500000040002D -:10B5300000A0100003204000000208010040088223 -:10B5400021010800210488048000090202850810F6 -:10B550004000400400000200C0884002000221A018 -:10B5600011040082020011A1000800100000000078 -:10B57000080000000008000382000000000800002E -:10B58000820882000000000000000000400010005F -:10B5900000000040000000000040000082000000A9 -:10B5A0000000A000001000000000000000000000EB -:10B5B000000082000810000240002021000040002E -:10B5C000080208001002840208049009000002101A -:10B5D000000800050000820582038200A0008404A8 -:10B5E00010000000C000080400200000050000005A -:10B5F000000000000008000000004020000040881B -:10B600000000000221A008000308414000000000E3 -:10B610000000000005A00000050200000302002059 -:10B62000400000000000002000100000030405009E -:10B6300000000000009004000021890011000308B0 -:10B6400083000008000000210001000100001088B4 -:10B650000001000021040040200008001182008841 -:10B660000584002010000400000100000800000014 -:10B670000000880000041000100004000808020800 -:10B6800000400000080002040000820000110000D9 -:10B6900000000000000020000000000020009000DA -:10B6A00000051005001121009008000800000000AE -:10B6B0009004000000400000028000004000088567 -:10B6C00020004080000240110120000520210811C7 -:10B6D0000205908508034021400840089080024000 -:10B6E0000800400200004000000040400841000007 -:10B6F00000000000000000010904000004040088AC -:10B70000088240084000000000000088000003009C -:10B7100003000082210400000004000040000040FB -:10B720002000000000002100A00000000000000038 -:10B730000900030021820000000021020090A00007 -:10B7400000100020A0082101000008000800A0004F -:10B7500020000000201080081100A020020010022C -:10B76000C003C02005890300020004000400020297 -:10B7700000000000000000000001040101000001C1 -:10B7800000000000000000000000000000000000B9 -:10B7900000000104900000C090000000000088003C -:10B7A00000000000010000000100900141000001C4 -:10B7B0000000000000000000000000000000100178 -:10B7C000000020A103C108030090008500040210BE -:10B7D000A00000A08840200882040000000084002F -:10B7E000000108A10410418400040000A101080028 -:10B7F00000000000000000000000004109200404D7 -:10B800000003000000000500000000000000000030 -:10B810000000000011800000000000000000000097 -:10B820000000000000004000000002051002C020DF -:10B8300000030000000000000000000000410000C4 -:10B840008004090000C103218082000911020089DF -:10B850008420000311800091008280840020400237 -:10B86000800500210582031182000002002083046C -:10B870008520000000000000000000000000020021 -:10B88000100041000004000500040000000000005A -:10B890000000000000000011000000008000000017 -:10B8A0000000800000000000000000008580830090 -:10B8B0002010A1900000000000000000000009809E -:10B8C0000000042000008980894182A180110000CD -:10B8D0000000850041C18580032180820220400054 -:10B8E0000800200003004000210091054103208052 -:10B8F0000400030310090000000000000000000223 -:10B900000100000001000001000000A10000000093 -:10B91000000000000000000000010000000088009E -:10B92000000082000800000000000000000010403D -:10B930000900A101C1090000000000000000000092 -:10B94000001000000101000008840800A009820422 -:10B9500000008800A10009A10240A000A0118300FE -:10B9600000000100000000080182A100A10141A126 -:10B970000010000001000040000000000000000076 -:10B980000000000001000001000040000000000075 -:10B9900000000000000000000001000000000001A5 -:10B9A00000020008000800C00000000000000100C4 -:10B9B0000000000041010000000000000000000045 -:10B9C000000000000001A1000000040800000401C4 -:10B9D000C0C1000301210490828802080140A10334 -:10B9E000838300000001000100000000210109051F -:10B9F00020410000010001000000000000000000E4 -:10BA000000000004101002200041000000000000AF -:10BA100040000000000000000000000800100008C6 -:10BA20000011008000000080008000000000000085 -:10BA300041000008080903030004000000000000A2 -:10BA40000000000000410208C00200100091100038 -:10BA50004121800800200308410091A00085034196 -:10BA6000A190821000020008002100200020821016 -:10BA700005A189100509400503030010000000001E -:10BA8000000000004120100009000210000000002A -:10BA900000000000000000000000000000000000A6 -:10BAA0008000000000000000000000000000000016 -:10BAB0000000000005832011038005030000000042 -:10BAC000000000000000102120211000030384105A -:10BAD00085080400030010C0031110001109410083 -:10BAE00011C1890085002100000002000008A18426 -:10BAF000021108000403108010041000110300005C -:10BB000000000000000001C0000000000101000072 -:10BB100020008200900000000000000000000000F3 -:10BB2000000002000000000000200088000000006B -:10BB300000000000000000020001014000010000C0 -:10BB400000000000000000000001000000000100F3 -:10BB500010004001A002910000410100008401009A -:10BB60000000C0080800040001900000000000016F -:10BB700041C001C14110830100A00100010000008B -:10BB80000000000000000000810000E00000000054 -:10BB9000000000E0000000000000000000000000C5 -:10BBA000000000E0070000000000000000000000AE -:10BBB000000000E000000082840000E000000000BF -:10BBC0000000000000000000000000000000000075 -:10BBD00000000000000000000041880000E00000BC -:10BBE0000012000000000000000000000000000043 -:10BBF0000000000000E000006000000000E0000025 -:10BC00000000000000000000000000000000000034 -:10BC10000000FFACFFAC00000000000000000000CE -:10BC20000000000000000000000000000000AA006A -:10BC3000B4B400000000000000000000000000009C -:10BC400000000000000000000000000000000000F4 -:10BC500000000000787D00008282BEBE000000006F -:10BC6000CC0FF3FC3D0D3D0D00FF30300000000017 -:10BC70000000000030303F3F00FFAAAA0000000093 -:10BC800000000000000000000000000000000000B4 -:10BC900000000000FF00FF000000000000000000A6 -:10BCA000000000000F0F0F0F000000000000000058 -:10BCB000FF55B4B4000000000000000000000000C8 -:10BCC0000000000000000000000000000000000074 -:10BCD000000000000000782800008282BEBE000044 -:10BCE0000000300CCCF0FDCDFDCD00FF00000000C9 -:10BCF00000000000000030303F3F00FFAAAA000013 -:10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000003C003C000000000000009B -:10BD30000000AA82FF820000000000000000000056 -:10BD40000000FF3CFF0F00000000000000000000AA -:10BD5000000000000000000005AF05AFFF00FF007D -:10BD6000F0550F55FFFF000FFF3E003E41EB50FA2C -:10BD7000000000000000000028F3EBF3FF00FF00CC -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA00000000000000000003C003C00000000001B -:10BDB000000000000082558200000000000000002A -:10BDC00000000000003C000F000000000000000028 -:10BDD00000000000000000000000FFFF3C3CCFCF4F -:10BDE0000C0CF0550F55FFFFF0FFFFFE00FE41EB7E -:10BDF00050FA000000000000000028F3EBF3555556 -:10BE00000F0F000000000000000000000000000014 -:10BE1000000000210001C001000000610007000DCA -:10BE200000000000000000000000006100060009A2 -:10BE30000000000000000090000000610007000DFD -:10BE4000000000610005C00D0005000000000000BA -:10BE50000000000000610006000D00000061000607 -:10BE6000000D000000614007C009000000610006ED -:10BE7000001D000000610006000D0000806000074A -:10BE8000001D000000610007000D00000000000020 -:10BE9000000000000F3C0F553F3F303F0000000006 -:10BEA0000000000000000000000000000000000092 -:10BEB000000200D7000000000000000000000000A9 -:10BEC00000000000E3EFCFCF0C004D550000000054 -:10BED0000000000000003C7647193CAA00F07D7D80 -:10BEE000F0003C143C14FF3CC30000001010008024 -:10BEF00040C0005000140F0F00000000A8FFF0F732 -:10BF00000007C341C343CF0014008ACB0849000097 -:10BF10000000000000000F3C0F553030303F0000A3 -:10BF20000000000000000000000000000000000011 -:10BF30000000000200FF0000000000000000000000 -:10BF4000000000000000E3EFFFFFCFFF4D550000B1 -:10BF500000000000000000003C7647193CAA00F0F9 -:10BF60007D7DFF0F3C3C1414CF0CCF0C0000101053 -:10BF7000038343C3005000140F0F0000000080FF34 -:10BF8000FFF70F07C3C3C3C30C0014009EDF1C5D83 -:10BF90000000000000000000AFAFBE14AAF0FFF0E8 -:10BFA0000000000000000000000000000000000091 +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000CFCF0F0F20008280829089086E +:10B160002080200020002082840084008400208031 +:10B17000C000200020002180881020000400200052 +:10B18000000088000000200484080200C0002004A1 +:10B1900020000000200420000003000508104002E9 +:10B1A0000004001000200080108020008800210092 +:10B1B000000040030585048321840002000541004E +:10B1C0008400890000200804C02084000202880056 +:10B1D00000092005880020004005400000102011D3 +:10B1E000080000024000000000080000000000000D +:10B1F00000404000000000020420000000000000A9 +:10B20000000000000000000080010000800000003D +:10B2100000000000000004000000000004008000A6 +:10B22000000100000000000100200020410000009B +:10B2300008000000000008040010021100000000D7 +:10B2400088000500020000018002040300002101C3 +:10B2500010002102000200000000000000840889A4 +:10B260000805820000000900820200038200110428 +:10B27000000001008200010000000100000400093C +:10B2800000000200000001088205010208002104FC +:10B2900000040940A10003009140030400000910CC +:10B2A000001000050002001083000840002000008C +:10B2B00002000010010088050000020801400000A3 +:10B2C00000100802010000100804080000009000AF +:10B2D00002040809000020000004000500400040AE +:10B2E0000204828202880082C090090509000408D5 +:10B2F0000208008404880088400040002004000800 +:10B3000000100908000400841000000840000084B8 +:10B3100010080040C000020802080810088400005D +:10B3200082040009000800090809040400090085D6 +:10B3300040082008000540840008000800040208B6 +:10B34000000420088009040841080008000804825D +:10B35000020800082084000800080088000803088C +:10B3600000080105004100000021004090900021EC +:10B3700000029000010800210008002100400008A0 +:10B380000003000000210008001000210000001050 +:10B39000000000000021000000050021000800005E +:10B3A00000000008822100020100904000210400FA +:10B3B0000091042100210008000800900203080009 +:10B3C00004100003000300400005004000020003D9 +:10B3D0000000001090054008404000400000880038 +:10B3E000002100102008000008001008030021219F +:10B3F000000008020000088200100082000000081F +:10B4000000A0000000820000000208820800000086 +:10B4100008001000080008000000001008000000EC +:10B42000000800000000000000000402000000000E +:10B4300080000020008400400000000000408000E8 +:10B4400080000300410000000010004000000000E8 +:10B450000000004000000000410000000000080063 +:10B4600000004000A00082000000400000400009F1 +:10B470000011001102008202080200800400100086 +:10B480000000C00008000000A00040008200000092 +:10B490000800000408000809020000000000000085 +:10B4A0001000040000000000820008090890A000BD +:10B4B00008A000040800A0009100002108800800F6 +:10B4C000018008008400000000414002000200806A +:10B4D000C000000000000802000000001000C000D2 +:10B4E000000000000800404000C011C040002000E3 +:10B4F0001188090809008000000000004004004095 +:10B5000000900000000000000008000000C00000E3 +:10B510001100000000010000000000080000000011 +:10B5200000000300001000000000038440C0001170 +:10B5300000000021000000040000100000000010C6 +:10B540004140024020A0030040000800800040006D +:10B5500000400082108203A00002000000000000F2 +:10B56000008200000004008200000003102100039C +:10B570000011C00004210000822100410089A020A8 +:10B5800000210008000000800000000008000010FA +:10B590000008000000000008000000020000000891 +:10B5A000004000008200900000000000C000000089 +:10B5B00000800000000000000004002082208221A2 +:10B5C00082000240024002000000010800C00800A2 +:10B5D0008241000300002000080800400820000508 +:10B5E00000210000000000410005200000000008CC +:10B5F00000000082000080000000008408000010AD +:10B6000003000800000000000020000003400204C6 +:10B6100040000000000000000000000000000000EA +:10B62000000000000000000000000000000000001A +:10B6300000000020000000000000030100000000E6 +:10B6400000000000000080008000000002000810E0 +:10B6500000000000000000000000000000000020CA +:10B6600003200000000000000084000020110840BA +:10B6700040210008000000210400900040000083E9 +:10B6800040040089001100090400000400090000C2 +:10B6900000000200000000000000000000000000A8 +:10B6A000820082000000000000000000000008038B +:10B6B0000880008000004011A00800090008000078 +:10B6C0000000100040108221000000800440002192 +:10B6D0000000004100040000000000108210002162 +:10B6E000000000000000000000080003000041000E +:10B6F000000800A0000009C00000090000000000D0 +:10B7000008400900002000000000000000010000C7 +:10B710000000000000000000000000000000000029 +:10B72000008208000000000000000000000000008F +:10B730000000201000400000009000000000000009 +:10B7400000000000000000000000000000100001E8 +:10B7500040004102008400A00000000000890000B9 +:10B760000000411000000000000010000000000474 +:10B7700000A0008400408210A089108800100821D9 +:10B78000410200820082044000010001000000012B +:10B790000000000000000000000001009000000018 +:10B7A000000001008200000088000000000004008A +:10B7B000000000004010400890109002001010108F +:10B7C00010080000C1009000900020C00010030885 +:10B7D0002008C0A000900000881000A00082004057 +:10B7E00040020001000020000001000000000000F5 +:10B7F0000000028000004080000080C000110008AE +:10B800008009098000000800890000020005030586 +:10B810000020000000000000000000000300000005 +:10B820000000000002000000000000000000000016 +:10B830008000000040002000008000000080100018 +:10B8400090800080000002000000000000A0049032 +:10B8500004840091808000000000000000800080CF +:10B860000000000008102100000800210000000076 +:10B8700000000000000000028080000010000509A8 +:10B88000100009000000002100008000800000007E +:10B890000000801000000000000000000000000018 +:10B8A0000000008000000000000080000000000098 +:10B8B0008000800000009000040088808400000068 +:10B8C0000011808000808000000080008000908057 +:10B8D00008038580900040000408840085008000F3 +:10B8E0000008008080800280110002102005000006 +:10B8F00000000000000000002001A0A000000102E4 +:10B90000000000C00100400000102082C0000810AC +:10B910000000000090010000000000000000000096 +:10B920000000000000044000C0001000C000400003 +:10B9300002000400C000000008000000A10283C053 +:10B94000900010011084109008008800A000820070 +:10B9500003C01000A104C09000008901A1829000E2 +:10B960008800020100A0101001400000000100004A +:10B9700000000000000000008210C040848200C06F +:10B98000080400108208211003000000000491C088 +:10B9900000000100010001000000000000000000A4 +:10B9A0000000000100000001000000000000000194 +:10B9B00000900090001000C000000003008200A171 +:10B9C000028800110010101010C000000088001044 +:10B9D000001188840103014110C1002000A0000271 +:10B9E00000C004100010001010C000000000010191 +:10B9F00000000000000000000000000000800000C7 +:10BA00000080000020804080C0808800000000800E +:10BA1000C08000004100080002000000000000009B +:10BA20000000000300200011404100100010002021 +:10BA300000410000000000000080000000A000891C +:10BA400000211020001000C100910011002000050D +:10BA5000002000410080082105A11088000000801E +:10BA600000800080000000000000808000100020A6 +:10BA70000521030300000000000000000004000096 +:10BA800000000000418580411100111000020009F2 +:10BA9000000000002105000005000000000000007B +:10BAA0000000000000000000000000000020000076 +:10BAB0000080000000000000000000000000800284 +:10BAC00080210000800480020010808000000000BF +:10BAD00000800080008021844000000088058000F4 +:10BAE00000000000004080408084008000002108A9 +:10BAF00010004100101100000000000000000201D1 +:10BB0000200000004000A1108201C00010010001CF +:10BB1000820040C082000100002000000000000000 +:10BB20000000000000000000000000000000000114 +:10BB3000000200400000000000C0001000000000F3 +:10BB4000C089A0C000820800C0004004901090008E +:10BB50000000001000100008410821A090A0030080 +:10BB6000044088002002000108011003884088007A +:10BB70000190000000000000000000000000000034 +:10BB8000810000E00000000000810000070082004A +:10BB9000810000E007000000818100E00700500004 +:10BBA0000000000000000000000000E000000000B5 +:10BBB0000000000000000000000000000000000085 +:10BBC00000000041000007000000810000E00700C5 +:10BBD00000000000000000000000000000E0000085 +:10BBE0006000000000000700500000000000070097 +:10BBF0000000000000000000000000000000000045 +:10BC00000000FFFF3C3C0000FF00AEAF00AAAAAA64 +:10BC1000F0F00D000D0000AAFFFF00000000000082 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000F0AA6A +:10BC4000FF3C00003C001400000000007D7D5050CF +:10BC5000FFFFFFFF00000000FFFFFFFFAF00AFAFDF +:10BC6000FF0F000005000500F7F3F0F00D050D0DC6 +:10BC700003000303000000000000000000000000BB +:10BC8000000000000000FF553CF00000A2AF00AA39 +:10BC9000BEAAF0F00800080000AA555500000000F8 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC000F0AA003C00003C0014000000000C555598 +:10BCD0005000FFFF55BA00000000F0F0F0FF8300B5 +:10BCE0008383BEBE0F0F05000000000000007D55DD +:10BCF0007D7D00000000000000000000000000004A +:10BD0000000000000000000000000F000F00007F96 +:10BD10000070000000001CC01C003C003C3C000007 +:10BD20000000D7D71414000000000000000000003D +:10BD3000000000000000000000000F3C55FF000064 +:10BD400000000F0F5555000000800080000000002B +:10BD5000A8A0FDF5001050510000000043434143EE +:10BD6000828250FA000000000000C30000000000C2 +:10BD7000FDF0FFFFBABABABA0000000000000000F0 +:10BD8000000000000000000000003F0F0F000F0047 +:10BD9000004F00400000000010C010003C000000F8 +:10BDA00000000000D7D714140000000000000000BD +:10BDB0000000000000000000000000000F3C5500E3 +:10BDC00000000000FF003C3C00000080008082007A +:10BDD0000000A8A0FDF500000000000000004343A3 +:10BDE0004343D7D750FAF00080000000C300F0FFB3 +:10BDF000F000F1F0FFFFFFFFBABA00000000000002 +:10BE00000000000000000000000000610007C09D6D +:10BE100000000061003E051D00000061300FC04DB4 +:10BE2000000800610037C00D0000000000000000A5 +:10BE3000000000610006000D000000610006000D1A +:10BE4000000500000000009000050000A061003E19 +:10BE5000001D00A0A061000FC009000000610006E5 +:10BE6000000D00008061500500990005006100068A +:10BE7000009D000000000008009000000061000626 +:10BE8000000D0000000000000000000000000000A5 +:10BE9000000000000C0CB2B2000000000000000026 +:10BEA000000000000000FAFA00000000000000009E +:10BEB0000000000000000000AAFF3CF000000000AD +:10BEC0003A3A0FFF000000000000000000000000F0 +:10BED00000000000000000000000080888080000C2 +:10BEE0000000F03CFFAA003C557DFF0AFF0A00005D +:10BEF0000000000000000000000000000000555598 +:10BF0000FFFF0F0F00000000000000000000000015 +:10BF10000000000000000C0CB2B2000000000000A5 +:10BF20000000000000000000AAAA000000000000BD +:10BF300000000000000000000000AA003CF000002B +:10BF400000003A3A00F0000000000000000000008D +:10BF5000000000007878FF000000000000000000F2 +:10BF600000000000F03C00AA003C557DFF0AFFFFE6 +:10BF700000000000000000000000000000000000C1 +:10BF8000FBABFBAB020F0000000000000000000054 +:10BF90000000000000000000AAFFBEBEC1C3C10037 +:10BFA00000000000000000003C3C3C3C00000000A1 :10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000040C143CEFFF2CFFF8 -:10BFD000000000000000000000005A5A5A5A82BEB9 -:10BFE00082BEA5A5A50030F330F30082C38200AA6B -:10BFF0005555BF1FBF1FF0F03C3C00C303035E5EFE -:10C0000010155500EBEBA903AA000000000000008A -:10C01000000000000000000000000505BE14AAF0AA -:10C0200000F0000000000000000000000000000020 +:10BFC0000000000000000000000000000000000071 +:10BFD000000000000000BE82BE0000000000000063 +:10BFE000000000000000000000003C3C303C030268 +:10BFF00000000000000080C3FFFF00000000000000 +:10C000000000F0F030300000303000000000000090 +:10C0100000000000000000000000AAFF0E0E80C318 +:10C02000800000000000000000002CEC2FEF00005A :10C030000000000000000000000000000000000000 -:10C040000000000000000000000055FF55FFC70081 -:10C05000040000000000000000000000FFFF0000DE -:10C0600082BE82BEA5A5242430F330F3C082C082F4 -:10C0700000AA0000B010B010F0F03C3C00C3030375 -:10C080000E0E1015550041410303AA0000000AFAE4 -:10C09000D5D5C3D7020240000082C0854000000011 -:10C0A00010008885880884004008C00388000200CA -:10C0B00084004040200820804040820588004100E4 -:10C0C000040441040000848020008282A00804202F -:10C0D0000210210400038809200084102008400574 -:10C0E0004000080220040000841040098400100071 -:10C0F0002000400320000400100488000284820411 -:10C1000020842010028484800002A000410089095C -:10C11000880083028484410000900004000410021F -:10C12000008200040002218240002085009020004F -:10C1300010900000100141000002000300004002C6 -:10C140000200800004002000002000020020009077 -:10C1500009A14000080000000484050009840000D3 -:10C1600004000000840500010400008300A000001A -:10C1700000000300008210000000000220004003C5 -:10C1800000910405040109050002000002000202FA -:10C19000200000002001410490000400030040033F -:10C1A000880090100020100082830200080020897F -:10C1B00088008210A009830200000000094084105A -:10C1C0000340031002000340004190080008404073 -:10C1D0000000000500050240000002000108820383 -:10C1E00000000100208002892010080800080010CB -:10C1F00000100200000082808410210085000010E1 -:10C2000020100210904008100110880401840040A2 -:10C210000000410000200405081003080008400841 -:10C22000820003080082400082000202000002082F -:10C23000040400080008040040844010034008087B -:10C240000000020984048284020100400089041075 -:10C2500080080010000809088982000000404000A2 -:10C260000240020040848004201080080200008404 -:10C2700004042084098202400310000820842084E2 -:10C280000508044104080501800820880041400594 -:10C2900000900904881020000200820888214010C4 -:10C2A0000003A00400004008000810A10440040599 -:10C2B0001000000800400020000588200840A10070 -:10C2C00000100110000500000103002140000041A2 -:10C2D0008811002100054020000300090000000033 -:10C2E000000002C1001008000021901000030004AB -:10C2F0000804020400100003400200000000900047 -:10C3000000080200000504040400900090080208E0 -:10C310000808100800044004880888008804000009 -:10C32000080041000001030000000400911000001B -:10C330000008412000000900000000000000800308 -:10C34000021021850801000000A00200000000008A -:10C35000080003000088030008210800000800000E -:10C360000084000002100000088241820082000068 -:10C3700000044000080404C100080084410011903A -:10C380000884031008A00800030100004000008892 -:10C39000400000A003000801808308001002030091 -:10C3A00010082021400400048800000082090000D9 -:10C3B000A009829100000811042140000802A14058 -:10C3C00082044080028082040805820008098210ED -:10C3D00002202100108082000840004000009000F0 -:10C3E000000000004000100082808241020008002E -:10C3F0002040C00008401111C0110908400208097E -:10C40000111082080010A000A0008800020089041A -:10C410000809020040040200082108200002080563 -:10C42000080090000000202103010482000000A009 -:10C43000088241000004000041000082020000C0A8 -:10C440004000008400402010088400C0000805005F -:10C4500000C000010490212040200088001000004E -:10C4600000000000400802020000111000008010CF -:10C47000919080C0050003880800030002040010AA -:10C4800021C040C0000021C02120409011A083C0E5 -:10C4900040044000002000002100C00400C0400112 -:10C4A000418820881040840208000009C000402014 -:10C4B0000820040008212000C0210821C00000003D -:10C4C000820800000000002000C008201021002089 -:10C4D000C003000082000008000008000000010006 -:10C4E000820010000000080000100800400003084F -:10C4F00008009000004000400020400840058421D2 -:10C5000000418200A000840002004000C021080019 -:10C51000000082008400000008210084A0000020A8 -:10C52000200010410000000000000000000000009A -:10C5300080000000000000008800000002200000D1 -:10C54000000000002008000003A00010000000040C -:10C5500000000000080800000000000000042100A6 -:10C56000040009000020000000000000000080001E -:10C570008205000002080000001000001182000087 -:10C5800000904190000411000000082021200000CC -:10C590001004000400040500042080000805008247 -:10C5A00000008800034000000004824100020810DF -:10C5B000820000000000000000099000000520003B -:10C5C00000000240C0040000000020000021C00064 -:10C5D000842000008808000204408220000000201F -:10C5E000000000000000000000008283820240087A -:10C5F00020000408A000000000850000C003042003 -:10C6000008080800410002408221000010100100CB -:10C6100090909005102120020403004008809000B3 -:10C6200020000290002004002041000000040001CE -:10C630000500094002040200202005400308088884 -:10C6400088080000000000004100000000200000F9 -:10C6500003C0000102000900080180000200000080 -:10C660000001080000000000008800000002000037 -:10C67000000003000000000000040910000000900A -:10C680000288000080088800030021000000118457 -:10C6900002000010002002C01104000021840004E8 -:10C6A00004000884000408400000840000008900A1 -:10C6B00020000000084002048209108201010000ED -:10C6C000C001000100000088008400880988008201 -:10C6D0000010C09100C02040C090C02040008404E1 -:10C6E0000282820810000090008488100000A000E0 -:10C6F000830100018200400001009000400000889A -:10C700004004008282820809090082080404109013 -:10C71000000290022090000103002000840000C06D -:10C720000020859104020001000188010001000041 -:10C730000800400000008040030400040088084115 -:10C740004003C108001000000000008000002040ED -:10C7500000030011002004800080000080008000A1 -:10C760000000008080000000008000000000000049 -:10C7700000021003000880090005030309000003FC -:10C7800000800080000080800020100380208080D6 -:10C790001000108089800000200883100403000529 -:10C7A00004C00983C005008200202003201000215E -:10C7B0000500080002104100200021008200000353 -:10C7C00041000400080440100800089004000480A0 -:10C7D0000000002180808041800080C100418000F5 -:10C7E00000008004800800000000809180808000AC -:10C7F000000041000200020208C00200840085001F -:10C80000C1020000000000000000000080000000E5 -:10C810008003800400038084000008002000C10021 -:10C82000108308020500831108212000400010A099 -:10C830002184000001000000010041200500A1004A -:10C84000900000200000010001000100010401002F -:10C850000010A0400000A0A0C001400040099001CD -:10C86000C08200000201820482000400900908A036 -:10C870001000000002202000010020A010A01100E4 -:10C88000A000C1210800A00008000800400004002A -:10C8900010000801A0019000A041400000A0A000ED -:10C8A000A0002003A0882000A000A12101C0110049 -:10C8B0008505910400000000020101001003011031 -:10C8C00001A1108800000100A1010100100000007A -:10C8D0000001C00040400082009010C0C1880020CC -:10C8E000404100C0040100040002902100880002C1 -:10C8F000009082100001009000A0034100A0009170 -:10C900000010001000C00400008200402088009049 -:10C9100001410182A0A188C102200008038801050D -:10C920000100001100A020A005C0A00882020000A4 -:10C93000A00008010000004100028021080000045E -:10C9400008854021008500201141851011048002D6 -:10C950000000002100000000210011008080820002 -:10C96000008500A000898020002000840041000094 -:10C9700000000000000000010003030803A1008084 -:10C980000009098341880089800000000000000040 -:10C990000003102041A080900002001000108421AC -:10C9A0000420100520A1081000412008C0409082FA -:10C9B0000000030580100900008000000000001145 -:10C9C00041A01000408008414090104041000311F8 -:10C9D0008080000080000011A14082001000020051 -:10C9E0008041802080C00080000000100080000096 -:10C9F0000000808400800000000121C02011100090 -:10CA00000840218202080880050300080080008099 -:10CA10000000212021081000000080058090008087 -:10CA200000000880050003801010210410A0108071 -:10CA30001011028002800200030500C00000000007 -:10CA4000000001A001820040010100C001000000BF -:10CA500001001002100010008800C101A1A088A0F0 -:10CA60000800C001200040C010040000200582041E -:10CA7000200090000205A002820000010140008217 -:10CA800001000101010501030182000000000020F6 -:10CA9000000800001101000811209000C00020A132 -:10CAA0002082900001C000080084010001090020DC -:10CAB0000104010185C0054010104000000000E0A5 -:10CAC000000082000000000000000012000000E0F2 -:10CAD00000005021000000000000000000000000E5 -:10CAE0000000000A000000000700484200000000AB -:10CAF0000700000000000000070000000000000028 -:10CB0000000000000000000000E000000000000045 -:10CB1000000000000000000000000000000600000F -:10CB200000E000000000000000E0000050000000F5 -:10CB300000E000000000000000E0000060000000D5 -:10CB40000000000000000000000081F6E7F6000091 -:10CB500000000000000003C300C000000000242407 -:10CB600000FFC0C0D0DC00000000000000007E1804 -:10CB70007E18F606F606040C0C0C4000400000007F -:10CB8000000000006660666F00000000000000000A -:10CB9000000000000000FFFF3030CFCF2C2C2C2CE9 -:10CBA000002020206602FFFB00000000C3C3FF003E -:10CBB00000000000F0C0F3C33F3936300000000031 -:10CBC00000000000000000000000000099F6FFF6E1 -:10CBD000000000000000000003C303C300000000C9 -:10CBE00024246060C0C0D3DF00000000000000000B -:10CBF0001E1E1E1E0606F6F604040000400000007D -:10CC00000000000000006C606C6F0000000018184D -:10CC100000100000000000F00FFF3030CFCF252DB6 -:10CC20004343000000006000FFFF000000003C3CA8 -:10CC3000FF0000000000FCCCFFCF3F393630000081 +:10C0400000000000000000000000000000000000F0 +:10C050000000000000000000BE823E020000000060 +:10C060000000000000000000000000003C3C283CF4 +:10C0700003020302000000008080FFFF00000000B8 +:10C080000000000030303030000028EB00000000DD +:10C090000000000020002000040088030500028842 +:10C0A000200085882000208320080800040020004C +:10C0B0008800881088008800200088080400400854 +:10C0C000C0100400100084002000000020002000A8 +:10C0D000820088850003C0080000000302022010CF +:10C0E0004005200021044000000088094010200085 +:10C0F0004000000040008888008040048420100038 +:10C10000A000880202020408044008052004201050 +:10C1100020004000208500000002050000002000F3 +:10C120000002900010020000401000038000400058 +:10C1300009000002200000000000000000000000D4 +:10C14000000000000000000000200000008200004D +:10C150000088000004100000000000002000A0047F +:10C160000000000200000802400000000000100073 +:10C170000000000000000000202000040003000177 +:10C1800000000500000180C18000802180400090F7 +:10C1900000000000804000020403040000100000C2 +:10C1A000A00000000202000008000282000002104D +:10C1B000000400000020000000100000000000004B +:10C1C0000004000000080000000003000005000556 +:10C1D000000000890000000000000003001084003F +:10C1E00090400000020000001000900000000000DD +:10C1F0008804000000400205001000050040001007 +:10C20000000408040900001000880485004109109A +:10C210000210012000050002011002040002028445 +:10C220000408208403000001208880080010090809 +:10C23000040000020488008205840208000809083E +:10C240000010200020840088408402080208008238 +:10C25000200800080240008820080000041004099B +:10C2600009840008000400080084028400084004D7 +:10C27000001000080008050800000404008810846D +:10C28000000800082008C008000800408240001094 +:10C290008208001104090208410920080021002138 +:10C2A00000080040000000050000000240C0000837 +:10C2B00088219040000800020008000500210005C8 +:10C2C000000300050000000000000008002100003D +:10C2D00000082040040000080000010500000021C3 +:10C2E000000000100010000800400000000288401C +:10C2F000000000080000004000210008002100109C +:10C30000004000050000000001100010011104A011 +:10C310008885001000210421884000210004008845 +:10C32000118400C021A00084000003080000A102C5 +:10C3300000840300000800840000000000A000004A +:10C3400000000000000000000000080000080000DD +:10C35000000000000000000203A000000800000030 +:10C36000000000000082001009820000020800A006 +:10C3700009A0000241A00340090000000040090894 +:10C3800011A0000000A010C0000002010311020073 +:10C390008021002000910008804000204100009191 +:10C3A0000004A00008008800000008040800200025 +:10C3B00090008200C0000800000000000010000093 +:10C3C0000810080004040000002084000000A00001 +:10C3D0000000000082000210C000000020000000E9 +:10C3E00000000010000440000411000000004000A4 +:10C3F00010000800A000C000000000000000820043 +:10C400000000004182000400000000000000C000A5 +:10C410000000092010A0084009080400C0002040C6 +:10C42000202100000000000009A040000091000051 +:10C43000C00000100084004000000800000400005C +:10C4400000080000000000000000000800000000DC +:10C45000000800000000000010C0000000000800FC +:10C4600000000000000108000000000000000000C3 +:10C47000000000C00084000800000300000000006D +:10C480000300000000000000040040C02182088476 +:10C490000382000004010011039088088084008456 +:10C4A00080108040000000410000081001004000A2 +:10C4B00000008200000000000040001100000000A9 +:10C4C0000005004000000000000000000000000225 +:10C4D000000000080000080000000000000000004C +:10C4E000004000000000080008C10000000000003B +:10C4F00000400000C00000000041080000100000E3 +:10C500000800000082000000A00000000810C09099 +:10C51000004008200840002003A00420044100003F +:10C520000000200820210000000000000000400062 +:10C53000800000900900000000200000034000007F +:10C540000000080000A00000000000000000000043 +:10C5500009000000000000000000000000000800CA +:10C560000088000008C00000000800100308000058 +:10C570000000000000004000000010A04004110076 +:10C580000084001008100800118800080004000052 +:10C59000000200880000002009018421800085003D +:10C5A0000000100080008000820800080000902138 +:10C5B0001000001000000000001100050000000045 +:10C5C00000000008000000410003000000210821D5 +:10C5D00000000010000008210000820000000000A0 +:10C5E000002100000000000000000000000000002A +:10C5F00000050000080200000008001000000041D3 +:10C6000000000003C00082008800404100000000DC +:10C6100004000802009000210010000000210041E9 +:10C6200000000041000382041003000020C00090BD +:10C630000902000011002000000000400088009066 +:10C6400004000000000000000000000000000000E6 +:10C6500000000000000000000000080000000000D2 +:10C6600000000004000000000000000000080000BE +:10C670000000000000000090000200000000080020 +:10C6800000000000000000000000000040A000C00A +:10C690000000000000000002000000000000000098 +:10C6A000410000000000000000090500000000003B +:10C6B0000000000000008501C10100011189001087 +:10C6C00000A0820000000000000000000000000048 +:10C6D00000000000000000000000000008200090A2 +:10C6E000009004200000000000000000000000C0D6 +:10C6F00000880010004003200020004010020000CD +:10C70000000000000000000000000000000004A184 +:10C7100001080104A00500C00001844088820410C3 +:10C7200000100002820801000000900000000000DC +:10C730000000000000000040102185020020A04100 +:10C740000021008300020000000000000000000043 +:10C750000000000000000000000000000000800059 +:10C760000000000080000000000000000000000049 +:10C770000080000000000000A10000800000808018 +:10C7800000000000000000000000000000000000A9 +:10C790000010088002400010058021218020001038 +:10C7A0000080008000000080100021009000000048 +:10C7B00000000000000000004020090003031021D9 +:10C7C0000000800900008000000000000000000060 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000080000000000000000000800049 +:10C7F0000000000000410040000000000002800036 +:10C800000000000000000000000000000000000028 +:10C8100000000300024083002100028021009100FB +:10C820001185000000418000808004001100042078 +:10C8300021000000000000000000010200000100D3 +:10C8400001418200100004100800000000000000F8 +:10C8500000000000000000000000000000000000D8 +:10C86000000000000000A0000000840020009000F4 +:10C870001000000000000000008200001000100006 +:10C88000A082000000000000000000000000000086 +:10C890000000000002108201A010C1008204030009 +:10C8A0000800008802001041A088C00201000000BA +:10C8B0000100010000000000000000000000400036 +:10C8C0000000000004020082008210A000000000AE +:10C8D0000000000000000000000000000000000058 +:10C8E00000000000401000A000C088100000000000 +:10C8F000000000000000A00000000000C000400890 +:10C9000000A00082100200000000000000000000F3 +:10C9100000000000000040100020851111100010E0 +:10C9200000100001008908A00084824003C00101BA +:10C9300000010001000100000000000000000011E3 +:10C94000100220100502000002000000808000009C +:10C9500000000000000000000000000000000000D7 +:10C960000000000000000000000000000080000047 +:10C970000000000000000000000000000000800037 +:10C980000000008000000000000000000000000027 +:10C990000000000000000000809008040885C00925 +:10C9A00000040280000800C0830000000080A18015 +:10C9B00020110010000820110000000000000000FD +:10C9C0004180001102000803000080200000800068 +:10C9D0000000000000000000000000000000000057 +:10C9E00000000000000000000000008000000000C7 +:10C9F0000000008000000000000000008000000037 +:10CA000080008000000000800000000000000000A6 +:10CA1000000000000000000000002180910404805C +:10CA20000405412010804100091080110040008061 +:10CA30008000000000100000001000000000000056 +:10CA4000000001040001000001002000A0884082D5 +:10CA50008200000000000000000000000000000054 +:10CA600000000000000000000000000000A0001016 +:10CA7000000000000004001000000000100008008A +:10CA8000C00008000800C0109008880000000000E6 +:10CA90000000000000000000000000008308A091DA +:10CAA0001004C000010001A0008801000401020080 +:10CAB0000808100000C00000000000000000000096 +:10CAC00000000000000000E0000000810000000005 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB000000000000008200000000000000000000A3 +:10CB10000000000000000000000000000000000015 +:10CB200000E007000000000000000000000000001E +:10CB3000000007008400000000E007000000000083 +:10CB40000000000000000000000000000000C30022 +:10CB5000C3003C3F3C3F000000000000000000001C +:10CB600000000000000000000000000000000000C5 +:10CB70000000FC0C000000000000000000000000AD +:10CB80000000000000000000F67EF618F0C090F0F3 +:10CB90000000000000000000000000000000000095 +:10CBA0003CFF08FF90F0F0F00000000003030303D7 +:10CBB0000F000FFF3C00308100000000000000006B +:10CBC0000000000000000000000000000000000065 +:10CBD000C2C202020909F9F90000000000000000C9 +:10CBE0000000000000000000000000000000000045 +:10CBF000000000006F6F0000000000000000000057 +:10CC000000000400000000000000907E9018F0F08A +:10CC1000F0F0000000000000000000000000000034 +:10CC2000000000FF08FF90F0B0B00000000000001E +:10CC30000303BDBDBDBD00003C3C00000000000082 :10CC400000000000000000000000000000000000E4 :10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000430840000084B5 -:10CC7000218600000000000000000000000000000D +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 :10CC800000000000000000000000000000000000A4 :10CC90000000000000000000000000000000000094 :10CCA0000000000000000000000000000000000084 :10CCB0000000000000000000000000000000000074 -:10CCC000000000000000000000000000FF3C0F66B4 -:10CCD0000BDB09990000000000000000C1C1C1C1C8 -:10CCE0000000000099F099F04242000000000000AE -:10CCF00000000000FF36FF36096F6F6F04460446E0 -:10CD000009096F6F0000000000003D3D3434000051 -:10CD1000000000020042FFBF0FBFE760F6F07C7C1E -:10CD20007E7E0043000003030000C2C200C3000077 -:10CD3000000090F9FF0000FF6666B1B1F3F3000058 -:10CD400000000000FFFF0000000000000000003CA9 -:10CD50000F660FFF0DBD0000000000000000C101C4 -:10CD6000C10100000000C3FFC300000000810000FB -:10CD70000000000000000036003609096F09044673 -:10CD8000044624BD24BD0000000000003D3D3434B5 -:10CD90000000000000000000F0800080F660F6F067 -:10CDA0007C7C7E7E000000000343000082820082C3 -:10CDB00000000000F99696600F0F3C3C00FF00FF5A -:10CDC00000000000606F606F00610007000D000050 -:10CDD00000614006000D0000006100050009000030 -:10CDE00000613006000D0000A0610006009D0005F6 -:10CDF0001061200E004D00080061000E000D0000C3 -:10CE000000003E0800000000000000610006000D68 -:10CE100000000061000500990005000000000010FE -:10CE2000000000610006001D0000A0610007000D69 -:10CE30000000006100010009000100615007000DC1 -:10CE4000000000610003000D000000000000FFC3AF -:10CE5000FFC33F3F0AFADFD0DFD0FFFFEBAFF0F0B8 -:10CE6000F0F000000000C300C300F5FFF5FF000074 -:10CE7000000000000000A0A0A0FF000000003A3A5F -:10CE8000303F00000000000000000000A8A80808D3 -:10CE90000C000C0000B0FFFFFFFFFFFF00000000D0 -:10CEA00000000000000000000041505100000000A0 -:10CEB0003CAAF0FF3CBF00834B0A5F0A0000F2FE71 -:10CEC00030100010030F030A05550555000000003F -:10CED0005F435F4330300AFAF0F0FFFF0000410586 -:10CEE000F0F4FCF400000000C300C300EB00EBFF13 -:10CEF0000000000000000000A0A0A0FF0000000053 -:10CF00003A3A303F00000000000000000000A8088E -:10CF1000A8083C003C0000F0FFFF3C3F3C7F0000C5 -:10CF20000000000000000F00FFFF555555550000A0 -:10CF300000003CAAF00028AB008343025702000027 -:10CF400000003030303000000000F555F55500008D -:10CF50000000003C550055FF3C0F55C055C05555CD -:10CF6000E4E700000000000000005F5FFF0FD7D77C -:10CF70003F0300000000000000000000000000006F +:10CCC0000000000000000000000000000000000064 +:10CCD000000000000F0F0F0FE781E7810000000048 +:10CCE0000000000000000000000000000000000044 +:10CCF00000000000CFC09090FF00FF000000000087 +:10CD00000004000000000000C30000000000F090DC +:10CD1000FF9900B100B10000000000000000000019 +:10CD200000000000000000009190FF02FF02C0C060 +:10CD30000C0C62626262000000003C30000F0000D8 +:10CD400000000000000000000000000000000000E3 +:10CD50000000000000000F0F096FF9F9606000008B +:10CD600000000000000000000000000000000000C3 +:10CD7000000000000000CFC09F9F6600660000001A +:10CD800000000000000000004E0FC3000000000083 +:10CD9000C080C38100FF00FF000000000000000011 +:10CDA000000000000000000000009998FF00FF0C48 +:10CDB000C0C00C0C66246624604000000000000F18 +:10CDC0000000000000000000000000000000000063 +:10CDD00000610007000D000000610006000D00006A +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000132 +:10CE000000000000000000010000000050000000D1 +:10CE10000000000000000000000000000000000012 +:10CE2000000000000000000000000061000D00058F +:10CE3000000000615006000D000185000A08059001 +:10CE400000A50561000F000D0000000000000000BB +:10CE50000000D2D2050500FFC5C50000000000009B +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000704FFFF79 +:10CEB000C303C3C3AA00F7F700410041000000000C +:10CEC0000000000000000000000000A200000000C0 +:10CED00000000000D2D2AFAFFFFFC5C500000000C8 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF200000000000000000000000000000000704F6 +:10CF3000FFFFC300C300AA00A2A2FF4100410000FE +:10CF4000000000000000000000000000A20000003F +:10CF5000000000000000F3B230305C5F000005000C +:10CF60000C000000000000000000000000000000B5 +:10CF700000000000000000000000000000000000B1 :10CF800000000000000000000000000000000000A1 -:10CF90000000000000C003C3AAAA00C3F0F00F0FF6 -:10CFA0000000000000000000FF50FFFA0000000039 -:10CFB0000000000000000000F555F55540555055A3 -:10CFC00005AF00005F5F1C5FF5C305C3FDFFF8FA06 -:10CFD0000000000000F0550055003C0F00C000C0EC -:10CFE0000000F0F341717D71000000005353F30322 -:10CFF00014143F03000000000000000000000000C7 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB00028282020FFFFA000D0D7D0D7CFFFFF55D3 +:10CFC000000000000000000000000000AAAAAABAA9 +:10CFD0000000000000000000FFBEFFBE5053000034 +:10CFE00005000C0000000000000000000000000030 +:10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 -:10D010000000AAA0A2A005C505C5AAAAC3C3000016 -:10D020003C14000000000000000055FA55FA000012 -:10D0300000000000000000000000F3C300000055E5 -:10D04000005514BE0000435F435FF5C305C30D05E3 -:10D050000800114020004005400008000240A000E8 -:10D0600008108800200000101000881088000400BC -:10D0700084042000000000808400049100008400EB -:10D0800010800002048500002000C0000002400063 -:10D0900004040003010400080000080020008800C8 -:10D0A00088008200020040104000000485008403D4 -:10D0B00004008403880010800000000400000002C7 -:10D0C000C10000048800002020808802880020031E -:10D0D000840010000890800000020090C0028003CD -:10D0E000004080C140020090000109200002404041 -:10D0F0000000200240000000000409901008000217 -:10D1000000008002000140042100090040020900E3 -:10D110000000C0200000020000000000800040006D -:10D120000500000000000000C090000000020200A6 -:10D1300000C040000500000241200004400009003A -:10D140002008200200080340000100100204000231 -:10D1500020000000200401040210840008200202C4 -:10D160000540021002000404030582090280020047 -:10D170001003080040050200020308100808A1116E -:10D180000840001008100003010000000000A0107B -:10D190000420A1900080000000000040901090400A -:10D1A000044190040200090000400009001004102E -:10D1B00002410000081002000100022000032000CC -:10D1C0000584400382C04080400000820489000042 -:10D1D0000404020900000200208880040400808802 -:10D1E00080C002894185051084880882049020044B -:10D1F00084848088890084888082858803038402EF -:10D200001008000100889184000440100384040089 -:10D210000489800808400020000041000089028441 -:10D220000085052004000384C00404C12082000896 -:10D230004008000040048908000020000009009018 -:10D2400080842002800400028410840800210902E6 -:10D2500004104108840020840400400004082003D6 -:10D26000020800080021200805000408040804033F -:10D270000000040000400410000000000005080049 -:10D2800083000010000408080008080800080000D7 -:10D290004088002082008408001100000000401037 -:10D2A000000800000008000820080000000810081E -:10D2B00000210010000000210005402100A1001005 -:10D2C00000820400000005040004840408C100007A -:10D2D00000000408000400030100000041100800E1 -:10D2E000800000000500008400008208008880841F -:10D2F00000840002100800000084000841A041A042 -:10D30000211002000020034040A00300880000001C -:10D3100000000010050103000300030200000000EC -:10D320000000000808084000000000040388030013 -:10D330000000030021010800402000001000040448 -:10D34000020221054102034020A1088508010010C6 -:10D3500041002140908200000084400021A0A000F4 -:10D36000A0210811822090110804820001100009F8 -:10D37000C000C011C003A040A00000004005C000D4 -:10D38000824120001000080908414040400800097F -:10D3900020410000104000000400041008000000BC -:10D3A000C0008820050008002010C00008101000F0 -:10D3B00020048221004109041000820440414010F1 -:10D3C0009009C10504040884080084C00000A0106E -:10D3D000C010002102001021081000009011100858 -:10D3E00000000300009008000000C190032004002A -:10D3F00009841110009021040000210008882010E9 -:10D4000000000400910000000000000091000003F3 -:10D41000000082C00308000021000000C001008855 -:10D420000000000000A008008000000021A0000013 -:10D43000409010A02010000440840400110000005F -:10D44000908300A00420001021040000024021006D -:10D450000884200002044104A00000C0091020003C -:10D46000001100000000824110008400021002053B -:10D47000A0000000828000082080C0000821C008B1 -:10D4800000110041000800000800000009800000B1 -:10D490000041000090000005000000001041000065 -:10D4A0000000000010000000A000000000000000CC -:10D4B0000000C00508000000C0808200900010003D -:10D4C0000821824141A1A00011410100000982C050 -:10D4D00010032000000008208200002000401041BE -:10D4E0000040000200A000840002400000049001FF -:10D4F00088900090009005020308800400040084D6 -:10D5000040A0020000001010040000A0000008105D -:10D51000000000000004080005000000034008406F -:10D5200000000000000009A0000021002190000080 -:10D530002000000408088004000000020000119090 -:10D540008500400011C0200409822000200010083E -:10D55000001000408320000005000200038810C076 -:10D560000800080010090008000000092000004021 -:10D5700000100000080090008288001100000004E4 -:10D580000008824100100000080288080020000501 -:10D5900082890000080004410840000000000000EB -:10D5A0000021042040000000000082000000000074 -:10D5B00000000000000008210000004000000103FE -:10D5C00090004011C00008040041A003400804007E -:10D5D00000002010A0000200000404020040A1C1CD -:10D5E000902100000000400400000084000880003A -:10D5F0004001080003000000000411100088080228 -:10D60000000205000000000000000000000000080B -:10D610000200000200000000000080000000000086 -:10D62000080040C0080100000000000000080000E1 -:10D630000004090021000020030002100010020075 -:10D6400002C00008008220004120000021040002E6 -:10D6500000000000840000020000080000000090AC -:10D6600040200000000000000800010082002000AF -:10D67000000111C0000200880010A0A0A00091C00D -:10D6800040400200010084009000100000000000F3 -:10D690000000000000000400000001030008010178 -:10D6A000001000000000000004000000882000407E -:10D6B000000408400000010090000000A0C0110814 -:10D6C000C0A00408C0000000400002008501409096 -:10D6D00003A0418403A000900090820808880141C3 -:10D6E000908382400000010008000000022010101A -:10D6F00005200003A0800000008000004000A00082 -:10D700000300000080001000000080000000000006 -:10D7100000000000000009008000000004C100A11A -:10D720000202008500000000000000000000200050 -:10D730000080008080000000020000000000808067 -:10D740008380008000808800090080000000114074 -:10D75000808582C10288118321030540000480086E -:10D7600003C00008000900002100800000008000C4 -:10D770001040A08083830000002100808000910081 -:10D780009000A00040100000000080000000040095 -:10D79000C0009100C000080002002000C12000006D -:10D7A000000400000002000000050000000000006E -:10D7B000000000A1002000000000000000000000A8 -:10D7C00040004104040404830000800000000000C5 -:10D7D0004180211105118803208085098400009172 -:10D7E00080000440A089118204808500040040412B -:10D7F000044001004084C103A000A00082C0C020FA -:10D8000002A010004000C1018400040010000000CC -:10D81000010010008500C084052040009100C10077 -:10D8200000100000002000000000000200080002BC -:10D8300000000000008200209020820020001000E4 -:10D8400088009184A000908590890000020000006B -:10D850008200840201410589109121C08400A10049 -:10D8600090A002108800A111A08821080200910058 -:10D87000C0010001010100000000889000880084C0 -:10D88000A0C04041004010C1A0A100100000001045 -:10D8900000C100C00008000200C000000001A0009C -:10D8A0000000400000000000000000C000040082F2 -:10D8B00000820000C01000880004A0C00001000029 -:10D8C00000010001C0020002A0832183000800893A -:10D8D000004100C110A10040C01083114090091008 -:10D8E00082030289820201038541110300010000C5 -:10D8F00000010000031008020041000000000000C9 -:10D900000080838088A00009802189A00000000594 -:10D9100000A000C1000000800080008000410004E1 -:10D920008000000000004000110000000000000026 -:10D93000000000000000808000800080C08000089F -:10D9400000100020000480020041800409C0009003 -:10D9500000A000A000C100022085008891918009EC -:10D96000402180C0894000110320218890100010C0 -:10D970000040002103059008A0900300800880006B -:10D9800080400000000020004000038008400000AC -:10D9900000400000000000800000008000404100C6 -:10D9A000038010000811041091000900830000009A -:10D9B00000000000000000000000800080008000E7 -:10D9C0000000008000800000C10010880480030374 -:10D9D000004000000080000010A003A04100880368 -:10D9E0001104080905000004C108C1082100090349 -:10D9F000418421002100040908110405C10210011D -:10DA0000C00002A0A0C0880000820184008401013F -:10DA1000000000900090000000080040000200009C -:10DA2000019000040100010084010500210088002C -:10DA3000C000040090000000000000008200048488 -:10DA4000A0000000000800C00000110088A10484AC -:10DA5000410100000004000800001105214082047B -:10DA6000A100A084218300889000C1C0042001404F -:10DA7000080001C1001001200000000000E00000CB -:10DA800000000000000007000082000000E0070026 -:10DA900000000000000007000000000000E000009F -:10DAA00000000000000000000000810002E0000013 -:10DAB000000000000000070000000000000000005F -:10DAC00000005000000000000000000A00000000FC -:10DAD000000041000000000000006000000000E0C5 -:10DAE00007000000000000E00000880000000000C7 -:10DAF00007000000000000000000841270FF7FFF9C -:10DB00000000000002000F0F0F1E00550000000073 -:10DB10003038353D00000000287D7D7D000000008C -:10DB2000AAF03CF000000000000000003CAAAAAAF5 -:10DB300000000000FFFFF0AA00300C3C000020E0D5 -:10DB400020E0003FACAC0000000000000000AA0292 -:10DB500000021400170300000000414155050F4F5B -:10DB6000FF7FEFC7FFFFC30000000ACB0000003CAF -:10DB7000828241C1C3C100000000000000004000DB -:10DB80004F0000000000000000000F1E00550000C4 -:10DB900000003A383F3D00000000287D28280000A2 -:10DBA0000000AAF03CF000000000000000003CAAC9 -:10DBB000F0AA000000000000F0AAC3F3CFFF0000AD -:10DBC000000000000030ACAC0000000000000000CD -:10DBD000AAA200A2D7C3170300000000EBEB550573 -:10DBE0000040F07000001038C3FF0000FFFF00008D -:10DBF000003CAAAAC3C3C3C3000000000000000089 -:10DC000000000000FF557D7DA0A0002000C30000A3 -:10DC1000CFCF555555557D41000000000F0F0F0F18 -:10DC2000000000000F0F0F0F000000005F503F309A -:10DC3000FFC3FF0000000000000000000000000023 -:10DC400000000D080505FFFF000000000000553C26 -:10DC5000553CC355000F0017003F00000000AFAF58 -:10DC60000505EF2CEF2C000000005550FFF000F0F0 -:10DC700000FFD310D3101414F0F0000000001E1E9B -:10DC80001E1E00000000AA002828A0A0000000C15D -:10DC90000002C0C05555F0F0FCC0000000002F0786 -:10DCA0002F07000000005555FF00000000005F50E6 -:10DCB0003F303C00FF0000000000000000000000BA -:10DCC000000000000D08000000000000000000003F -:10DCD0000FFF0F00C355FF0F0017000300000000E7 -:10DCE00005050505CF0CCF0C7D3C413C5514FF3C90 -:10DCF00000B200FF3030F3F31414FF000000000006 -:10DD0000FFAA55000061000100010005A0005008B5 -:10DD1000009000A505610007000900000061000EE9 -:10DD2000009D0000006140060095000500610006AE -:10DD3000000D000500614005C00D000080000A00D4 -:10DD4000000000A000000000300000900001006111 -:10DD50000006000D000000615006001D000000617B -:10DD60000006009D000100610E030001000000613B -:10DD7000000300050001A061000E000D000000611D -:10DD80000006000D00010F0F0F0F04FE04FE00003F -:10DD9000000000000000FF00FD0000FF82FF000007 -:10DDA0000000F0FFFAFA000000000000000000FF91 -:10DDB000A020151515153C3CFA0A000000000000D3 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000003C3C3030FFFFA808D0D7D0D7CFFF4E +:10D04000FF55000000000000000000000000AAAA38 +:10D05000AA8A880588002080200004002080200003 +:10D0600004008804040002000400200000102010C6 +:10D0700020008400200488002000400020002008B8 +:10D08000C0108804820320002040000040000000FF +:10D09000200000030000200540042005400540005A +:10D0A0002004024004020000880000040410201044 +:10D0B0000400880004000008400511052082880350 +:10D0C00088842000208801022008A005040520048F +:10D0D0002004C1040082000200020000400204108B +:10D0E00040040000000200000000000400000000F6 +:10D0F00000020002040000000040000000400000A8 +:10D100000404000000000000040000010000008290 +:10D1100000000000000040000000854000002000EA +:10D12000000000000005000000000000000080007A +:10D130000000890000000090000200A040A08003D1 +:10D140002000000204C010050200000004000000DE +:10D150000002000208000000020000050002024177 +:10D160000041021000020200022000000200000044 +:10D17000000000000000020000000040080800005D +:10D1800000000010000900100390010000100800CA +:10D19000008800000000000000000000000300C044 +:10D1A0004040000010410010000000100841000045 +:10D1B000010000000108020000000404000800084B +:10D1C0002084A00401000009000021202102A109FF +:10D1D00020100205000002100008051000080009D8 +:10D1E0000088000000090209050809850420008460 +:10D1F00000820408000000100088048400100484E9 +:10D2000000080400008404840008084008820084A8 +:10D210008010041000080400000000080408000842 +:10D220000402848804088410040800080000200810 +:10D2300000000808000802040004400800880010EC +:10D24000048480030008100005080088C009C00598 +:10D250000404000280080084048200000000000032 +:10D2600000000000A04140210000001000088221C1 +:10D27000000000080002000800020008001000087A +:10D28000824000400008000000080000004000103C +:10D290000003000300000010000500000021004012 +:10D2A0000090000200080000000500000040000897 +:10D2B000000000200021404000000041004000101C +:10D2C00000410040012100000000000040404000FB +:10D2D000200520210008001000031008210000A0F4 +:10D2E0002100000000A04100850000880000000827 +:10D2F0000002000800A000A000000000000041089B +:10D3000008A000000800000000004100000003A089 +:10D31000000000000440000000A000400000089051 +:10D32000000000020000001000C0008200A0008287 +:10D330000082000000A00000038400000000000044 +:10D3400008000900008220840010008411848004F9 +:10D350000000C002C0C009A0000008004000080092 +:10D360000800040000400000820084410000080022 +:10D370000811080408020000822104400400820011 +:10D3800082000000820008008200C00082000000CD +:10D390000880000000008200000000008200000001 +:10D3A0000000100020800000C0000802A005080056 +:10D3B000080908000000C021822010008420A0007D +:10D3C00084008400C0042004000021C1004100103A +:10D3D000C10220100300C180A02100000000A002B3 +:10D3E0000000000000000000000000C00000080471 +:10D3F000000000000000000000000000000000A08D +:10D40000000000000000008400A0000000000004F4 +:10D4100000000010000800000000000000000010E4 +:10D4200000000000000000020000000000000000FA +:10D430000000000000A0000000000001000000014A +:10D44000000000000000000000A00808C00200006A +:10D45000000008108001A0A02002400000824010BF +:10D4600040000000000882000000000000000000F2 +:10D4700000210000010200080000000000008200FE +:10D48000000008000000000008000000000082000A +:10D49000080000000000A010000008210000084063 +:10D4A0000000000000008205000200408200000031 +:10D4B0000000000000020040000084090440000059 +:10D4C0000000080800000000010300000409042116 +:10D4D00008108240C000C0004104C1000011820059 +:10D4E00008000821000000A0000000000208000061 +:10D4F000050000000000021000A000C000000000B5 +:10D500000000110000000000000080002100000069 +:10D510000000000008900800000100000000110059 +:10D5200000020000000000000000000800400004AD +:10D530000000040005000000000000000908802031 +:10D540000000040005000000030808400840000433 +:10D55000020000200084200000002021200008009C +:10D560000000000010900000C000000988000000CA +:10D570000041000000000021000000000000000049 +:10D580000000000000050400000000000041000051 +:10D59000000004000003000000000000000000087C +:10D5A00082000000000800000000A0000800C04148 +:10D5B000000000040000000000218200002108009B +:10D5C0000000A00000004000000000080000000073 +:10D5D0000004000040110000852140200004088460 +:10D5E0000803A021000500000000000011900900C0 +:10D5F00000000000000020A000000000000000006B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D620000000000000000000000000000090000466 +:10D6300020080000000000000000000000000000C2 +:10D6400000000400002000000000000000000800AE +:10D65000008200010000400000002000000000C126 +:10D660008021000000000800009000000000A000E1 +:10D67000000040A0010220108204A000049000C01D +:10D6800082200000000000000000000000000000F8 +:10D690000000000000000000000088C0004000A062 +:10D6A0008890008800C000200008000000000000F2 +:10D6B00020000000088900890009C0020000000065 +:10D6C000000000000000000000000000A0020010A8 +:10D6D0001010048400010001000000010289018291 +:10D6E0000000029000000000000000000000200088 +:10D6F000000000008080100000000080800000809A +:10D700000000800000000000000000000000000099 +:10D710000000000000000000000000000080008009 +:10D7200000800000000000000000008000000000F9 +:10D73000080000000000C041000300880010000045 +:10D740000000000000000000000000000000C00019 +:10D750000880008080000041002102100008800441 +:10D760001004050280C0000000000000000020003E +:10D770002100040000024000210010100804800075 +:10D780008003000080000000000000000000000096 +:10D790000000000000000000000000000000000089 +:10D7A00080008010800000000020000000000000C9 +:10D7B0000000000000001000800000008080800059 +:10D7C00000000000000000000000000800800000D1 +:10D7D000000000218000000000004100084010020D +:10D7E00084C12011894041408000800000008000F9 +:10D7F00001C001000000000001A00100008500013F +:10D8000088009001A00008820000000000000000D5 +:10D810000000900000000000000000000000000078 +:10D82000100002000200080000000000004000009C +:10D83000000000000000000000000200201040A0D6 +:10D840000440000000000000000000000001000291 +:10D850000000880084000820C000000200000100D1 +:10D86000000109114100A000099004000200A0007D +:10D87000C000000000000001000108400004102169 +:10D88000028900820084000000C000000000000047 +:10D890000000000000000000000000000000000088 +:10D8A00000000802001000024110200000000000EB +:10D8B00010000000000000000001000010900002B5 +:10D8C00010C0A08800000000000000000000000060 +:10D8D00008000000400400C08204A0A00000000076 +:10D8E0008800000000202008A12100200000000086 +:10D8F000000000000010000900210010801000044A +:10D900000021028200000000000000000000000072 +:10D910000000000000000000000000000000000007 +:10D9200000000000800000800000090000000000EE +:10D9300000008000000000030009002100088000B2 +:10D940001100A00080000000000000000000200086 +:10D950000000000000008010002100030080000093 +:10D960000000C1000400004002C188020340000022 +:10D970000000000000004080100040002010A08443 +:10D980002100110010110000000000000000000044 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000008000000000800077 +:10D9B0008000800000000000000000000000000463 +:10D9C00080000080800000000000000000000000D7 +:10D9D0008000000900008000000980800000000035 +:10D9E000209009000500021082089010A180881183 +:10D9F0000000008000800000011000000100010014 +:10DA000041C18400880084001000000488848800DC +:10DA1000000000000000000000000000008800007E +:10DA200000000000000000000000008200A00000D4 +:10DA30000200A000100082000000000000000000B2 +:10DA400000004000000408900000000000000000FA +:10DA50000000C000880010001000900004A04010DA +:10DA600040000040000001000001C1831108410294 +:10DA7000A101000000020002000000000000000000 +:10DA8000000000000000000084000000000007000B +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD000000000000000000007000000000000003F +:10DAE00000000000000000E000000000000000E076 +:10DAF00007006000000000000000000000000000BF +:10DB000000000000EB3F4103FC000C0000003C3C27 +:10DB10007F7F000000000000000000000000000007 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB40000000000000005F5FFFFFF0AAF0AA0000E5 +:10DB5000000000000000F0F03C3C00000000DCD0C1 +:10DB60001C10F0CFFFCF00000000000000000000FC +:10DB70000000F3FFF3FF00000000000000000000C1 +:10DB8000000000000000EB3F4103FA000A00000023 +:10DB9000F0F07F7F7F7F00000000000000000000A9 +:10DBA0000000000000000000000000000000000075 +:10DBB00000005F5F5D5500000002000000000000F3 +:10DBC00000000000000000005F5FFFFF3C003CFF22 +:10DBD0000000000000000000AAAA00FF00000000F2 +:10DBE000DFD31F13AFFFAFFF0000000000000000F5 +:10DBF0000300C3C35555FFFF0000000000000000F4 +:10DC0000000000000000000082A2000000000000F0 +:10DC1000CF0CCF0C000055000000000000000000F9 +:10DC200000000000F0F0F0F0000000000000000034 +:10DC30000500000000000404800000000000000057 +:10DC4000000000000000000000005F505F5C00E882 +:10DC5000C3E8000000000000000000000000000019 +:10DC600000002A002A00E0EBE0EB000000000000CA +:10DC700000000000C3000041010100000000000F8F +:10DC8000000E0000000000000000DFFF55550000FE +:10DC90000000CF0CCF0C0505C3C30000000000003E +:10DCA0000000000000000000000000000000000074 +:10DCB000000000003C3C0A000E04000000000000D0 +:10DCC0000000000000000000000000005F535F5FE4 +:10DCD0003CE8FFE800000000000000000000000039 +:10DCE000000000007F006B000000E0EB000000007F +:10DCF000000000000000C300004100000000000020 +:10DD0000000F000A00610006000D000000614006DF +:10DD1000000D0000000000000010000100000000E5 +:10DD200000000000000000000000000000000000F3 +:10DD30000000000000005000000000010000000092 +:10DD400000000000000000610006000D00000061FE +:10DD50003006000D00000000000000000000A500DB +:10DD600000080500000000610006000D00000061D1 +:10DD70000001000D0000A061000F000D00A10000D7 +:10DD8000000000000005F5C075400EFE00000F0FFA +:10DD90000505FEAEFFAF000000000000000000001F +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 :10DDC0000000000000000000000000000000000053 -:10DDD00000000000ACF0ACFFF7C70838C7C704C7A5 -:10DDE00000000000FF000000C3C141C103A3F3A372 -:10DDF000FAFF0A0F00003F000F0F5555383C383C22 -:10DE0000AAC3AAC35F0F1C0C0F550F0F00FF00FF22 -:10DE100000000000000000000000000000FFC0FF44 -:10DE200000000000000F0A0A0000000000000000CF -:10DE30000000A0A03F3F3F3FFF00FA0A00000000A3 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000A080A080F +:10DDF0005055D0D5000000000A0A0A0A3000F00091 +:10DE00000000000000000000F540F54004F40000B0 +:10DE1000BE14AFAFFEAEFAAA000000000000000082 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 :10DE400000000000000000000000000000000000D2 -:10DE5000000000000000AC00AC0F3404CBFBC70492 -:10DE6000040400000000CF002828C1C3C14103A35F -:10DE7000F3A3F0F5000500003FFF3C3C00FF38280D -:10DE8000383CAAC30F0FFFAF3C2CD5551555F0AA4F -:10DE9000AAAA000000000000000000000000050524 -:10DEA00041550000000000000000000000000000DC -:10DEB000007D000000000055C30F0000008200003C +:10DE500000040000000000000000000000000000BE +:10DE600000000000000000000000000000000504A9 +:10DE70000504FFFFFFFF000000000A000808300053 +:10DE80000000000000000000000000000000AAAA3E +:10DE9000AAAA0000000055555555000000000000DA +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 :10DEC0000000000000000000000000000000000052 -:10DED0000000000000000000000000000000000042 -:10DEE0000000202A0000000000000000170017FFBB -:10DEF0002D2D05AFD4D4C0FC1EBE1EBEFFFE0000FB -:10DF0000AFAFA0A000000000D4FCD7FFD555155539 -:10DF1000AAAAAAAA00000000000000000000000059 -:10DF200005050014000000000000000000000000D3 -:10DF3000000050FF00000000FF55C30F000C0082DE +:10DED00055550000CFCFD71400000000000000000F +:10DEE0000000000000000000000000000000000032 +:10DEF00000000000FFFF0000FFFF050014143C3C81 +:10DF0000008041410000000000000000000000000F +:10DF1000F0FCF0FC00000000F0D0C0D000000000D9 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 :10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000000000000C1 -:10DF600000000000202A0000000000000000170050 -:10DF700017FF3D3D15BFD4D4C0FC14B414B4FAFE51 -:10DF800000000FFF00F000000000D4C0D7C38400E1 -:10DF9000C000000484028800000402002000200267 -:10DFA00088808800888040000000880420000008E5 -:10DFB0008800C0100400000240000400200020007F -:10DFC0002000844188004000880204040404000307 -:10DFD0008400C0000200A000880088000400000443 -:10DFE00040002011900090002000C0040411C008DF -:10DFF00000052003200321002000A0004000840031 -:10E000002004214188008400000082008400040470 -:10E010000002418240020004000000000090C002A3 -:10E020004003000404900004094002020090040030 -:10E030000002009040C00004009000004000040076 -:10E04000000000002000000021020401000000A0E8 -:10E050000000000000002100000000C0000041009E -:10E0600004000000040000024100210009400000FB -:10E0700000040000000021004008000000004100F2 -:10E08000008280012000200000000000200010001D -:10E0900000000802400000000010A0000900040079 -:10E0A0009003030802000290820402410811000854 -:10E0B000100402200800041084100004000800006E -:10E0C000820488000000000800000000000900052C -:10E0D000080800000210000408040800000088007E -:10E0E0000000000000401040080802080909848070 -:10E0F00090104090841002850005A08989000020BE -:10E100009080031000090289020002100200020040 -:10E110000010001004098384008200840004200899 -:10E1200000000208100440082002048800100004C7 -:10E1300002820010009020040283008220840010DC -:10E140000984409040840008051040400404404089 -:10E1500000080040000008080084000841840040D6 -:10E16000000840840088004100C0801000820890B0 -:10E1700000020040C002001009100004001002005C -:10E180000488080208000400001082088404038444 -:10E19000040009000208000388414000002000003C -:10E1A00090104008C0409008014000000008042181 -:10E1B000001088020000400000090004000310085D -:10E1C00084040040000890000000080008000802D5 -:10E1D000020000030000000000030000900004089B -:10E1E0000000100000080400C00040104000401073 -:10E1F000A008400088411000000000008800A0A195 -:10E2000010008488840010908404C004A010204171 -:10E21000000000000000000008000000210008834A -:10E2200011C00300211000000000082003080000B6 -:10E23000008200890000008203100040000003C03B -:10E24000008200C01100210005000000400000A075 -:10E250004109000008000800000000001000000054 -:10E2600000020000000000004000000402414100E4 -:10E270000000000008A04100000008A00988030079 -:10E280000802000804020310000941010011000007 -:10E2900021080500000021000000C04008004004E3 -:10E2A00041840840040208040000040409210041DC -:10E2B0004010080240021020002008400002000226 -:10E2C000A0000800A0028800000010040000002048 -:10E2D0000040A0004004001090200000000000005A -:10E2E00000020800904108414041820408004009B2 -:10E2F000084082A0040082098200080482400004D1 -:10E3000084058200000040000400089108411020AC -:10E310000808080908020002900008002002000412 -:10E3200004000420110011C003C00810418820829D -:10E33000400808C08808400820A002A008910008F2 -:10E34000000800040384030040080010008400203B -:10E350000000008400041104000000000000000020 -:10E360000808040000C041A000C01100098200009C -:10E3700041400400001020040000090080A021009A -:10E380004110009000001100000000008502000014 -:10E3900000042188028200200000000440209080B8 -:10E3A000018800830000000008028240820400040B -:10E3B000C000A0002010004000000011000000007C -:10E3C00000400003000800000020004100000000A1 -:10E3D000100000000808000000000000000000001D -:10E3E0000000081000000000000082000800080380 -:10E3F00084000000000308000000000508008200FF -:10E40000848010000021100000000800840000003B -:10E4100000C100040008000000000000080800001F -:10E420000320044000200300000800080488218421 -:10E43000039003840800900103000300080000001B -:10E44000009000000000110005A02100080000005D -:10E450000300001000000000000000004100000068 -:10E460000000000000C00800100000880502000045 -:10E470000410000402002088208405000000000031 -:10E4800000C020100000088400001104118408104E -:10E49000039000101091080003900000030000009A -:10E4A000030000001002880010009000A0418410BA -:10E4B000400000400000041084020000002100051C -:10E4C00010100000020800080804000000000010FE -:10E4D0000000040802000000000000090000000025 -:10E4E0000008000000000000000000802000020082 -:10E4F00000009000840020000000A00040000009FF -:10E500000041C002840484048410400500200102FC -:10E510000810200800040004102000110000000072 -:10E52000000000000000000000080008118808003A -:10E53000000100C02191209009A100A00404020064 -:10E540002182208500000300000000002004030059 -:10E550000204008800A0000000020500000000087E -:10E56000000000000000009002000900000200000E -:10E57000000000C0000009000990090400C0A004C8 -:10E58000201009840800040010C00400002041008D -:10E590000811200000821091000111880000000085 -:10E5A00000000088000000C040400008C0090100D1 -:10E5B000010040000000000500821104C0011002AB -:10E5C000000200A008102000000000000000000071 +:10DF50000000555500000C0CD71400000000000014 +:10DF600000000000000000000000000000000000B1 +:10DF7000000000000000FF00000C000000003C005A +:10DF80000C0C0000414100000000000000002000D7 +:10DF90002000200020002010400088000000041015 +:10DFA0002000200020040400200020008800200918 +:10DFB0002000A010101020052000000004044000E4 +:10DFC00020000000200088050400400088000003B5 +:10DFD000210005000000041000001000001088005F +:10DFE00004004000C000100440052011400020043F +:10DFF0002010040888802010000941000005050851 +:10E000008400200210002008840510048400848805 +:10E010000000402000000000400000000000000060 +:10E020000000000000000000000009900000040053 +:10E03000000000000000A000000000000000000040 +:10E0400000000000000000000000200000000400AC +:10E05000000004000400000084000000090000002B +:10E060004000000200000400090000000000000061 +:10E0700000000000210000101082000004000002D7 +:10E08000040040844009808409854000A10000000C +:10E090000020400040090480080000000000080043 +:10E0A000000010000000040000000200000000005A +:10E0B0000000000000C00000008900009000000087 +:10E0C0000000000000000000024102000000000407 +:10E0D0000000000000000100011009000000040021 +:10E0E00000050040000008000004000500000200D8 +:10E0F000000002000000902008030210000005103C +:10E10000000901100041002004100000020000007E +:10E110008204011080008410001084100484000820 +:10E120000000000020840000000004000010000037 +:10E1300000080088008400040008040400080008A7 +:10E140000000000800040010098400082004008476 +:10E1500000882008000004080808040984840008D6 +:10E160000408000000100008040800000008001067 +:10E1700000080004048400082011000800010008C1 +:10E1800004080008048400080010800800100482BD +:10E1900004100010048400080008000000080000BB +:10E1A00000400021002100000000000300210008C1 +:10E1B0000008002100050088000000020121000085 +:10E1C00000000041002100100008000000020008CB +:10E1D00000400000004000000000000000A101001D +:10E1E0000002844100002003000000000408041025 +:10E1F00000000021000800080041000090004003DA +:10E20000004008C00000000200A1000800008808CB +:10E210002008004100080102000000000908000079 +:10E22000000800A00000088400A000080008000802 +:10E2300000840084001000000004000800000810A2 +:10E24000000000000000000003000300080000C000 +:10E2500000000008030800A0000000000888082053 +:10E2600004000000000000080808401000000482BC +:10E270000300030803004100000000000400001038 +:10E2800000000510212009020300004000A00082C8 +:10E290001008000005C000884000000000000000D9 +:10E2A00000410000080000001000002100000000F4 +:10E2B00000000800002000040840A0002000080022 +:10E2C000000082000000080082000020000004001E +:10E2D00000100020100000001000000000100000DE +:10E2E000012008001000080000000040080008009D +:10E2F00010000800000000000810104182111000FA +:10E3000000008400000000000000010008912002CD +:10E31000C0000009000000001000008000000000A4 +:10E3200000000000000000000200000000000200E9 +:10E3300021A040000000000000000000004080001C +:10E3400000080000000800100000000000000000AD +:10E350000000000000000008000000000000009124 +:10E360000084088900040000000000000400000090 +:10E370000000000000000000000000000010000489 +:10E3800000000000000000841100030004000040B1 +:10E39000008400C020900800008800A00020000039 +:10E3A000000000000000000000000000000000006D +:10E3B0000000000000000000000400000000010058 +:10E3C00000000000008000000021000000000000AC +:10E3D000000000000000A000000008000000000095 +:10E3E0000100000000000000080000100000000014 +:10E3F000000000400010C000000000040000000009 +:10E400000000000000000000900000000010080064 +:10E4100000000040040090000003002100030900F8 +:10E420000000000009000000034002000000000896 +:10E4300000080000000000020000000000000008CA +:10E4400020000000000000040000000000000000A8 +:10E450004008004003000000000000080000000029 +:10E460000000040000000000000000880040098255 +:10E4700009A000A000000200000000200004000429 +:10E480000000210002000000000000A0000200A027 +:10E4900000C00240038888000884210000000000BA +:10E4A0000400000000000000000000110000080946 +:10E4B0000000000000000000004104000000000017 +:10E4C000000000040021000000080000004000409F +:10E4D0000000080000000000000000000000000034 +:10E4E000000000000000000000800000000000218B +:10E4F00000000020000000000000000008000000F4 +:10E5000088000000000082000000000000000005FC +:10E510000003000088020010000000008808084185 +:10E5200008030002000000000000000000000004DA +:10E5300000200000000000000000000000000000BB +:10E54000000000000000000000200000200000206B +:10E5500000000000000000000400000000000000B7 +:10E56000000000000000000000000040000000006B +:10E57000000000000000000000000000000000009B +:10E580000000000000880000000000000000000003 +:10E5900000A00200000020010005000000000000B3 +:10E5A000000000002000101000880009048800000E +:10E5B000000000000000000000000000000000005B +:10E5C0000000000000000000000008000000000043 :10E5D000000000000000000000000000000000003B -:10E5E000000100000000000000000000900000009A -:10E5F0000000000000000000C0A000900090008219 -:10E600000001A1018400000141A0208200A082C07D -:10E6100000A00420840810C00020000201880084AB -:10E62000000000000000000040820084008080089C -:10E63000200220418011001000A0050802A08008DF -:10E64000808000800080800000000000000000004A +:10E5E000000000000000000000A0900000A000005B +:10E5F000000000000000000000000000000000001B +:10E600000000000000000000002000900004004016 +:10E610000000000000000000408920040084820205 +:10E620000000020002000000000500080082000354 +:10E6300000000000000000000000000000000000DA +:10E640000000000000000000000000099000001120 :10E6500000000000000000000000000000000000BA -:10E6600000400010000200200000400021000000D7 -:10E67000000000000000000000008080000000009A -:10E6800000004010082100100010890020000080C8 -:10E690000000038085008080000000000080028070 -:10E6A0000000000000000000000080008041804168 -:10E6B00080000900410009202041880000008300FB -:10E6C00041040000002080008000000000000000E5 -:10E6D000000000000000000000000000000000003A -:10E6E000000000000000000000200000000000000A -:10E6F0000000000000000000000000000000000911 -:10E7000080000000090009100480830280000002DC -:10E71000808300808580212190800591000800037E -:10E7200000000080000000000000000040024001E6 -:10E730000801C04000C000000000010189902000D5 -:10E74000A0002101C0008200A08804000000000099 -:10E7500000000000000000000000000000000000B9 -:10E7600000000000000400000000000100000000A4 -:10E770000000000000000000000000000000000099 -:10E780000800A0A0080084848201A04009010800BC -:10E790004001A04188A002082100A1A0008800013A -:10E7A0000001000000040000000000000000C04064 -:10E7B0000020C04000C00000010000010101020370 -:10E7C0000003011190C0A09000080084118800840B -:10E7D0000082000800C000000000000000000000EF -:10E7E0000000000000000000000001000000000127 -:10E7F0000001000000010001000000000000000016 -:10E80000400000081010A0A000010000010100015C -:10E8100090200008002000C0A0A102110000828406 -:10E820000200900000000000000000000000000056 -:10E830008080098080800080001103020221101175 -:10E84000808905081005058900000080008004000B -:10E8500000000000008000800000000000000000B8 -:10E8600000000000000000000000000002000000A6 -:10E870000001001000080005031000000000000067 -:10E88000000080000080008082000008050821212F -:10E89000002100200090000000C1001080900003C3 -:10E8A00080000000000000000000000000000000E8 -:10E8B0000000A1419040848391002120401141003B -:10E8C0002003218005210580090000008000808050 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000021000540400082 -:10E8F0000300000100000000000000000000000014 -:10E9000000000000800080008080000040C0208067 -:10E91000C0008911004100828000800041C00320B6 -:10E92000908585400000000000000000000000000D -:10E9300000000000C101210040C00490011100014D -:10E940000000000001C0000101080000840002C0B6 -:10E950000408820000000000000000000000000029 -:10E9600000000000000000000000000001000000A6 -:10E970000100010000010000000000000000000094 -:10E98000000000000000040004088408840083C123 -:10E99000C12003C00400020188024010820021C08F -:10E9A00020204108090004008200000082000000CD -:10E9B00000000000000000000000070048420000C6 -:10E9C00000E000000081000000E000005081000035 -:10E9D0000000000000000000000000000000000037 +:10E66000000000000000000000000080800000802A +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000008000808A +:10E690000000000000000000000089C100210011FE +:10E6A00080110000A0008000090080000000804070 +:10E6B000000000000000000000000000000000005A +:10E6C0000000000000000000000002001000080030 +:10E6D000901000000000000000000000000000009A +:10E6E00000000000000000000000000080008040EA +:10E6F000808080800000000000000000000000001A +:10E7000000000000000000000000000080008011F8 +:10E7100000000000000000000000000000000000F9 +:10E720000008000300000000000000804002A0007C +:10E73000A000020000000000000000000000000037 +:10E740000000000000000000000000008890880029 +:10E750000100C000000000000000000000000000F8 +:10E760000000000000000000000000000000A00009 +:10E770000885A082080200000000000000000000E0 +:10E780000000000000000000000000000000880001 +:10E7900008A1000000000000000800000020004068 +:10E7A0000000000000000000000000000082880857 +:10E7B00000A000A0C0020000000000000000000057 +:10E7C0000000000000000000000000000000000049 +:10E7D00088000001000000000000000000000000B0 +:10E7E0000000000000000000000000000000000029 +:10E7F0009084008810C010C00000000000000000DD +:10E800000000000000000000000000000000000008 +:10E81000400200021000A002000000000000000002 +:10E8200040000082020010C0000100010000000151 +:10E8300000800380200000000000000000000000B5 +:10E8400000000000000000000000000000000000C8 +:10E850000002A100102100000000000000000000E4 +:10E8600000000000000000000000000000000000A8 +:10E870000000830000008000000000000000000095 +:10E880000000000000000000000000000000000088 +:10E890000000800000000000800000000000000078 +:10E8A000000080002100020080800010002000088D +:10E8B000004104210410418003000000000000001A +:10E8C0000000000000000000000000000000000048 +:10E8D00000004182219004000410000000000000AC +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000080000040000000000000000058 +:10E900000000000000000000000000000000000007 +:10E9100000000000000800000080800000000002ED +:10E92000000000004102100909001000000000046E +:10E93000000000000101000500820100000000004D +:10E9400000000000000000000000000000000000C7 +:10E9500000000000012000880120000000000000ED +:10E9600000000000000000000000000000000000A7 +:10E97000000000000000C000A0908810840000008B +:10E980000000000000000000000000000000000087 +:10E99000000000000000000000044008A00000008B +:10E9A0000000000000000100010000000000000065 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D000000000000000000000E007000000000050 :10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 -:10EA000000000000000000000000000000006000A6 -:10EA1000000000000000420000000000000088002C -:10EA20000000000000008200000000E00000000084 -:10EA300000000000000000000000000000000000D6 -:10EA40000000000000000000000000000F0F0F0F8A -:10EA5000FF00F4F4000000080000000036363F30EC +:10E9F0000000000000000000000000000700000010 +:10EA00000000000000000000000000000000000006 +:10EA1000000000000000000000810000070000006E +:10EA200000000000070000000000000007000000D8 +:10EA3000000000000700000000000000FF7FC3434B +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 :10EA600000000000000000000000000000000000A6 -:10EA70000000000000000000000000000000000096 -:10EA800000000000000000000000C3C3424206F680 -:10EA9000F606101C0000000000004000000080800E -:10EAA00000FFCFCFCFCFCCCCFFFFC3C33C3C000097 -:10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000FF0047 -:10EAD0003F03FF002424090909090000000036361D -:10EAE0003F300000000000000000000000000000B7 +:10EA700000000000000000000000C3C3E4C030003C +:10EA80000000000000000000000000000000000086 +:10EA9000000000000000000000000F0F0F0F0C0C22 +:10EAA00000000000000000000000000000000F0F48 +:10EAB000F6F60000000000000000000000003F3FEC +:10EAC0000303000000000000000000000000000040 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 :10EAF0000000000000000000000000000000000016 -:10EB0000000000000000000000000000606F606F67 -:10EB100006F6F606D3DF000000000000000000004B -:10EB200000000000CF008900CCCC0000FF00FF00F7 -:10EB3000000000000000000000000000410840004C -:10EB4000008421060000000000000000000000001A +:10EB000030000000000000000000000000000000D5 +:10EB10000000000000000000000000000C0C0C0CC5 +:10EB20000C0C0000000000000000000000000000CD +:10EB30000000F6F6000000000000000000000000E9 +:10EB400000000000000000000000000000000000C5 :10EB500000000000000000000000000000000000B5 :10EB600000000000000000000000000000000000A5 :10EB70000000000000000000000000000000000095 :10EB80000000000000000000000000000000000085 :10EB90000000000000000000000000000000000075 :10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000FF0F37 -:10EBD00099993C3C0CFC003C003C8FBF8CBC000075 -:10EBE0000000000000000000000000000000000025 +:10EBB0000000000000000000000000000000E787E7 +:10EBC00066060000000000000000000000000000D9 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000C3C30000000000000000000000009F :10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000000000000004 -:10EC1000000000F0699FF06F00000000F3F3303057 -:10EC2000000C3C3CF1B170307FFF000053BE53BE7E -:10EC30003FCC0F0F000000000000000000000000AB -:10EC400000000000000000000000000000000000C4 -:10EC500000000000303F00FF009C009983B380B0AB -:10EC600000000000000000000000000000000000A4 +:10EC0000F0F0909091919100000000000000000051 +:10EC100000000000000000000000000000000000F4 +:10EC200042C3C2C30000000000000000000000005A +:10EC300000080000000000000000000000000000CC +:10EC4000FF9F7E1E086E98FE00000000000000007E +:10EC500000000000000000000000000000000000B4 +:10EC60000000000000009090000000000000000084 :10EC70000000000000000000000000000000000094 -:10EC80000000000000000000000000000000000084 -:10EC9000000000360036000F69960000000072F395 -:10ECA00072F3000C0000F1F3707267FF0000225C49 -:10ECB000225C0C3330FC000000000000000000006B -:10ECC00000000061000E000D000800610004000952 -:10ECD0000000006100050099000000000000000035 -:10ECE0000000000000000090000000000000000094 -:10ECF0000000000000000000000000610006000DA0 -:10ED00000000000000610006000D0000000000008F -:10ED1000000000000000000000100000006100067C -:10ED2000000D000000610006009D0000006100066B -:10ED3000001D000080614007000D00000000000081 -:10ED400000000000A0B0AABE00000000F0F0F5F73F -:10ED50002D282D285FD70A8254FE54FE00000000A3 -:10ED600000000000000000000000000000000000A3 -:10ED7000000000000000000000000000000F002F55 -:10ED800000000000000000000000FCF3FEFB00009B -:10ED90000000000000000000000000000000FBFB7D -:10EDA000FBAB0F030C00000000000000000000009F -:10EDB00003000F0D0F0D0000000000000000000018 -:10EDC000000000000000A0B0AABE0000000000008B -:10EDD00005070000FFFF0FC30FC3FEFE54540000E1 -:10EDE0000000000000000000000000000000000023 -:10EDF000000000000000000000000000000000AF64 -:10EE000000AF00000000000000000000FFF0EFFA7B +:10EC80000000FFFF9999F3F3F3000000000000007B +:10EC90000000000000000000000000000000000074 +:10ECA000000042C342C3080808080000000000003A +:10ECB0000000000000000000000000000000000054 +:10ECC000000000610006000D0000000000000000D0 +:10ECD0000000000000000000000000000000000034 +:10ECE00000000061000900090008000000000000A9 +:10ECF0000000000000000000000000000000000014 +:10ED000000000000A5000A08050000A000000000A7 +:10ED100000000000000000000000000000000000F3 +:10ED20000000000000000E300010000000000A0883 +:10ED3000000000A00061000E004D00000061000E08 +:10ED4000000D00A0C3C10080000000000000000012 +:10ED500000000000000000000000000000000000B3 +:10ED6000000000000F55003C28EB28EB00000000DD +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB000000000000000FCFC550000000000000006 +:10EDC000000082AAF030C3C10080000000000000F3 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000FFF003C28EB28EB0000B3 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 :10EE100000000000000000000000000000000000F2 -:10EE2000515151010A0A0A0A000000000000C0C046 -:10EE3000010003000F0F0F0F000000000000000092 -:10EE40000000000000000000287D7D280000000078 -:10EE5000CFEB000007020F007F7F0A3E003C3C3CE6 -:10EE600000000000000000000000000000000000A2 +:10EE200000000000000000000000000000000000E2 +:10EE3000000000000000000000005500000000007D +:10EE40000000000082AAFF3C838300AF00000000A6 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000007D287D28A0AF3C3C91 :10EE70000000000000000000000000000000000092 :10EE80000000000000000000000000000000000082 :10EE90000000000000000000000000000000000072 -:10EEA0000000FFCFAFAF41EBC0CF0000000000007B -:10EEB0000000000000000000000000000000000052 -:10EEC00000000000000000000000287D7D280000F8 -:10EED0000000C041000003030B013E3E0A3E003C1F -:10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000000000000012 -:10EF00000000FCFFFFFF0000000000000000000008 +:10EEA0000000000000000000000000000000000062 +:10EEB000000000000000000000003C0040000000D6 +:10EEC000000000000000000000008383AFAF0000DE +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000055005500AAAA24 +:10EEF0003C3C00000000000000000000000000009A +:10EF00000000000000000000000000000000000001 :10EF100000000000000000000000000000000000F1 -:10EF2000000000003F0FAFAF41EB03F30000000013 -:10EF30000000000000000000004000000000000091 -:10EF400000000000000000000000000010804008E9 -:10EF5000C000840582082000030484000409040919 -:10EF60000410840084800080200020000410200011 -:10EF70002000200020002108204088918200840089 -:10EF80004000A00004004004400020000003C00531 -:10EF90008400200004004020202004800504880212 -:10EFA0002000000084000000A00800001040400085 -:10EFB000040082000203C00000084000200084100A -:10EFC000040004200120820488080004880540020F -:10EFD0000040000000022000400002020000C002C9 -:10EFE000C00280C12100000400040090000200045F -:10EFF0004000004004C04002080211020820200026 -:10F00000000000A000004000000000040490000088 -:10F01000204021A0100040000903020110208402BA -:10F020000040008205004100210000C0048200A1D0 -:10F03000000440000000040020000400800041049F -:10F040004001C100C005040500024000400020044A -:10F050002004024100000108000809880409841006 -:10F060000220A0000820020810042008080009045B -:10F0700090030404A003000008C004100104090563 -:10F08000850540880882080008000000820000040E -:10F090000000000002000000021000000083008554 -:10F0A00004008200001040400090081008C00008D2 -:10F0B0008800844182100800400002000000000027 -:10F0C0000040000004000404040000050000840067 -:10F0D0008441040805880802408220054010058804 -:10F0E00009080305001000C0A0402011800400881A -:10F0F000209105080082000011040410808404405F -:10F100008408400484020409048400080010008478 -:10F1100040040000020804820084800400000020F3 -:10F120000220800800880082890002038084000297 -:10F1300002840408040800000000800005104188D3 -:10F1400041000008110080848010820004C000107B -:10F150000082040840210402000340098841400065 -:10F160008202004000080805400502020010400528 -:10F1700004000040002100080040002104040400B5 -:10F180000421010300084010C010200300210021C9 -:10F19000A008012000000041C00000000021050877 -:10F1A00000400010048000090200101000118200CD -:10F1B0008205101040000403000500000205000352 -:10F1C0000010081104000800840082000002C01131 -:10F1D000102100000003008800050300004010001B -:10F1E0004184100310000084884000840041210005 -:10F1F000008441A0040008004100000800820300D0 -:10F2000080008008044000000000000008000000AA -:10F21000400000000401000000000800050000009C -:10F220000400000000009020100021A00000080051 -:10F23000030003040304004000000590050010C013 -:10F240004100000221840000080000000082000943 -:10F250000000000000080000000282084021A08495 -:10F2600008400021A180004009400040000500093D -:10F2700082040810A0400405400900000002840038 -:10F28000018282110410A0042003001008028305EB -:10F29000080000008200A00000008200A009821087 -:10F2A000820004040421040482411005820000202D -:10F2B00001110008084190400804A0008209A080C4 -:10F2C000080800051009822010800010000000408E -:10F2D0000009000408002010A000009000C140A018 -:10F2E0001010A02020A04010208408A0400004009E -:10F2F0000282029000820000400821824004000047 -:10F300000202042011080300084000040890008352 -:10F3100040080000008403820082000011100900F0 -:10F32000050005C08020C0088384210040004108FA -:10F330000804020400414000089003900084080083 -:10F3400005021004000011880908000200050000F1 -:10F3500000C000000084000003000004080000104A -:10F360008210100400C0C04100080800880240025A -:10F3700040200800001000031108004000020009AE -:10F38000000800000000000000210809002004001F -:10F3900000400420000000410840820800000000F6 -:10F3A0000004004082008200008008000400000089 -:10F3B0000011C01104000200A021000200008440DE -:10F3C0008408080090084000400490118420000048 -:10F3D000090000000003A0080010004040080204DB -:10F3E0000800000000000040000408002020050480 -:10F3F00083008808080000880400400811001000FD -:10F4000000000008000800820000008400000000E6 -:10F4100000000000000021000000000000000000CB -:10F4200000004100059005000000002000000000E1 -:10F430000800200000000084A000030440054000F4 -:10F440000420040000080202A1A088202000080077 -:10F450001100400000000400000400000000400013 -:10F4600000100108082100210021C00540004020B3 -:10F4700004110008020000200821012000210003DF -:10F480000041022100004041000000000080000017 -:10F490008240002090090204000082000011004018 -:10F4A00000001000000500000800A000104140000E -:10F4B000080300000200A0080005080888000205F3 -:10F4C000024088000008100400401008C00400003A -:10F4D0008204040300000008081100000200000874 -:10F4E000001100100282402009C040844182410086 -:10F4F000022011820390000221110000020021204D -:10F5000009880000000204C08800200000000010EC -:10F51000040020820004042008900000000800007D -:10F5200021C000000000201004000300081040402B -:10F530004182098404000088000003C00520040003 -:10F5400021000000084002880982118200900040DA -:10F55000030008C008824100000000000000000015 -:10F5600000000000000009010001000001C0882027 -:10F5700040200204404121200410820009408808F4 -:10F58000A19084020000000040000000904090889C -:10F590000088820400010001080100010000000051 -:10F5A000000000000000008800040002004000008D -:10F5B00000000000000001A08800884000000088D2 -:10F5C0000984108200080000010090010000000181 -:10F5D00001010401000002A001000203A0090000D3 -:10F5E0000000000000000040902100040009090014 -:10F5F000C0000000800082C0211000C18004908300 -:10F600002103020000112000200080000000008083 -:10F6100080000000800000410021800200100000F6 -:10F6200000000000000000000080000000800000DA -:10F6300000000000000000001000100000000900A1 -:10F640000080058000000000000321100002000976 -:10F650000020212100100010A0831040800580218F -:10F660000000000000000000000080000000800397 -:10F67000C1000821400541830200041104841140A7 -:10F6800011000200C01090410000000000000000C6 -:10F6900000000000801100800400100020002141C3 -:10F6A00000000000000000800000000000000000DA -:10F6B0008000000000800008000088002102008017 -:10F6C000892002800511858841A1200000002000CA -:10F6D000080302804000030008201000100420806E -:10F6E000028900000000000000000200020000008B -:10F6F000C00110000500018989A1000800018405EE -:10F70000028588200900A10083000000001000008D -:10F710000000A0000284A000A008019000000000EA -:10F72000010100000000000000C0000090008802FD -:10F73000040408000000004000000088090091C097 -:10F7400020408201C040A000831005A1019000006C -:10F750000000000000020000000000012140200025 -:10F76000C040850400000000000000000000000010 -:10F770000501000100050088009182C18585011105 -:10F780004141A0A010A101900005820800010000E5 -:10F7900000000000010800088420A0900000010083 -:10F7A0000100000000000000000000000000C08810 -:10F7B0000020002000000000000008000000900071 -:10F7C0000000C001040020000889100888A1000082 -:10F7D00000000001000100010101100000000440D0 -:10F7E00001A10241A0050000000000000000000986 -:10F7F00041030202004100200090000511C14110A8 -:10F800000388882182900008030403A190840020CB -:10F8100000080041002040800080000080000004BB -:10F820000221211000110000000000000000000073 -:10F830000000008000000000200000000000000028 -:10F8400000400008002180418000008480C109211F -:10F850000020050010210020002002020303000800 -:10F860008082200883A104900000000000000000B6 -:10F87000200502800400000090800980A000830918 -:10F8800010A0828290008540041020C010800840A3 -:10F890000010000000000000001100058080000042 -:10F8A00000080400080009030000004000000000F8 -:10F8B0000000000300000000800000000040000085 -:10F8C0000000848584009100091180A089C008800F -:10F8D00003030921210004000510418002002000DB -:10F8E000020921409140890003200000000000002F -:10F8F00000000000002000820000C00202A0119061 -:10F90000080183A104090840080100A000A00040EC -:10F910000100000100000000000004000410084085 -:10F92000C000008300000100000000000000000093 -:10F9300000000000880020204020A00000000000FF -:10F940000000000040C021100210A000024102830C -:10F9500085084101002100000100000100A0000015 -:10F9600000000000099004848440080000000000AA -:10F970000000000000000000000000000000000087 -:10F98000000000000000000007006000000000E030 +:10EF200000000000000000000000000000000000E1 +:10EF30000000000000000000000000003C00000095 +:10EF4000000000000000000000000000200084001D +:10EF50002004200088000408000420048800200009 +:10EF6000200001050000210000040000200504002D +:10EF700020002004200010004000200000000405B4 +:10EF80002000040500102000A0051000000320054B +:10EF900004100400C000000540002005A0110480FA +:10EFA000049041108409400020004020202088095E +:10EFB00000050400C004C01010082009210304103B +:10EFC00020840089A1C020052010040482080000CC +:10EFD000000000000000000000000000000200002F +:10EFE0000000000004820900080000020000000088 +:10EFF00000000000000000000400000000044000C9 +:10F000000900000010001000410000000000000096 +:10F0100000000000000000000000200000020004CA +:10F020009020802004000000000000000003000188 +:10F0300000840000000000000000000000022040EA +:10F04000C1004010404002030840000009000000D9 +:10F0500000000000000002000100020003020000A6 +:10F060000200824008040000020000210800041091 +:10F070000010080000000840A10000000840000047 +:10F0800002000000000008000209020990100209B5 +:10F090000000020000000008000000000240000024 +:10F0A0000500000000000005050004000000044009 +:10F0B00004020000009088040010000400400500D5 +:10F0C00000100300080008400400020000000809C6 +:10F0D0000000000000100284048208080000028979 +:10F0E0000084000800080000000000880008008478 +:10F0F00000000008008400000000020800108000EA +:10F1000000080008008800100200008400080008C1 +:10F1100004000000000800040084000400088400CB +:10F1200000100808008404080008040041100410BE +:10F13000200800080008002020100084008900C07A +:10F1400004000008080480400004200041100084EE +:10F1500000840010000000000000000000210021D9 +:10F16000000020000000000000080000000800214E +:10F170000008002100000000000000080008002135 +:10F1800000080021004000080000000000080021E5 +:10F190000000001000000000A02100100021080362 +:10F1A0000402004000000020000300820010002044 +:10F1B00002400040840000400402000300080009EF +:10F1C00040210021000500100420040004C00000BC +:10F1D00000080008C00000000000000000840000DB +:10F1E000000000000000000000000000000000001F +:10F1F000000000000382000000000000000000A0EA +:10F2000000020084008200000000000000000000F6 +:10F2100000000000000800000000080000000000DE +:10F22000000000004182009000400000002000002B +:10F23000030000000000040004008000000008003B +:10F2400000000800000800400001C109000800207B +:10F2500000000000410040A0040000000000000485 +:10F2600008000800002184000000000000040004E1 +:10F27000000000000000000000000808000000007E +:10F28000000008000000000008000040000000002E +:10F29000C00000000040000300000000000000006B +:10F2A0001000820000000202080084000000A00399 +:10F2B0000000004000000004821008000880824026 +:10F2C000200400200000C0000084001001208211F2 +:10F2D0000889C00400400800C0040000004000008D +:10F2E00000001000000009000000100004004000B1 +:10F2F00000100000000400C0000004C000C0102086 +:10F300000900000041000900000000000088000022 +:10F3100000000000040000000000000000000008E1 +:10F3200008000090100000084000000000000800E5 +:10F3300000820800000410000004000000A000206B +:10F3400000002084000811840040000404010441EE +:10F350000800034000000001100008020000000047 +:10F36000000000000000820000000000000000001B +:10F37000000000000000000000000000000000008D +:10F380000420000000000000000000000000080051 +:10F390000008000000000000000000000000000065 +:10F3A0000009000908000000000000000000000043 +:10F3B00000050800002000080005000010200000E3 +:10F3C0000008000010002000001004008200080067 +:10F3D0000400010008000008000000000008000808 +:10F3E0000808008800000000000000000000000085 +:10F3F00000000000000000A000000000000000006D +:10F4000000080008200000000000000000000000CC +:10F4100000000000000000000000000000000000EC +:10F420000000020000080008000005A040000000E5 +:10F4300000000000000000010000000000000000CB +:10F4400000C00000000400008000100080000000E8 +:10F4500000008300040400C0000000000000210838 +:10F460000000000000000000000010000000000884 +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F4900000000000002100000000820000000000C9 +:10F4A00000008200000000000000000000001000CA +:10F4B000000000080000000020000000000800001C +:10F4C000000000000021000800040100000000000E +:10F4D00000410000002000004089000000050000FD +:10F4E0000000000000000000000000000000040018 +:10F4F000000041000040000008000000030240043A +:10F5000008020000000000000000000000000000F1 +:10F510000000000000000000000000000000008269 +:10F520000000000000000000000000000084000057 +:10F530000004000020040240000010000000000051 +:10F5400000000000000000A0200020042000008433 +:10F5500000040084000020830000084000820000B6 +:10F560001100040200000000000000000000000084 +:10F570000000000000000400000000000020002047 +:10F5800000900008000000000000000020000000C3 +:10F590000000A000000000000000000000000000CB +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000004A0A7 +:10F5C000000800020002000000000000000000002F +:10F5D00000000100000008C00090000040A00000F2 +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000080000000000000008B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000800080000000000000000000000000BA +:10F650000000000040000000408004800000000026 +:10F66000000000000000000000000000000000009A +:10F6700010000810050010000000000000000080CD +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000080000000000080000000000000004A +:10F6C0000000000000080000800000000080000032 +:10F6D0000000000800000000000000008091800091 +:10F6E000000000000000000000000000000000001A +:10F6F0000000000001010184010200000000000080 +:10F700000082000000000000000000000000000077 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000040090001000C00000000090D5 +:10F74000000000400200C00190100400000000C052 +:10F7500000000000000100000000000084000821FB +:10F76000A008209000000400000004000000000039 +:10F770000000000000000000000000000000000089 +:10F7800000000000000000000000820000000000F7 +:10F790000000000000900002008800C0000000008F +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C000000002000000020200A0001000880000FB +:10F7D000000000000000000000002000010089106F +:10F7E000001182020802000000000000000000007A +:10F7F0000000000000000000000000000000000009 +:10F800000000000000000000000000008000000078 +:10F810000000000000000000000000000080000068 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F840001100000000000000008000800080000027 +:10F850000000000000000000000000000000410067 +:10F860004183009000030000000000000000000041 +:10F8700000000000000000008000000000000010F8 +:10F880000000001000000000000000200000000048 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000020000000000000040800076 +:10F8D0008000000000100000000000000004000094 +:10F8E0000000800000020000800000000000008096 +:10F8F00000000000000000000000C0100200C00076 +:10F90000C000000000000000000000000000000037 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F930000000000000000000000000000000008443 +:10F9400000100000000000000000000020008802FD +:10F950000810080000000000000000000000000087 +:10F9600000000000C0002089C040A000000000A0EE +:10F970000002000000000000000000000000000085 +:10F980000000000000000000070000000000000070 :10F990000000000000000000000000000000000067 -:10F9A000070000000000000000000006000000004A -:10F9B000070000060000000000000000000000003A -:10F9C00000000700000000000000000042000000EE -:10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000007000000000010 -:10F9F0000000000000000000000000000000AAF06D -:10FA00003C3C003CF0C3E1C3F0F020F0E3F0000028 -:10FA1000000043C34303000000000000000000F0AA -:10FA20003CFC1F101F1F0000000000000000000031 -:10FA300000000000000000007530303000C000C041 -:10FA40000000000000000000BABF0000000000003D -:10FA50006969096000FFF0F000000000000000008C -:10FA600000000000000000005F5F1E0AFFFF00C0F2 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000007000000000030 +:10F9D00000000700000000000000070060000000B9 +:10F9E00000E0070000820000000007006000000047 +:10F9F00000000000000000000000000000003CF0DB +:10FA0000FFAA00000000000000000000000000004D +:10FA100000000000000000000000000000000000E6 +:10FA20000000FAFA0CFC00000000000000000000DA +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA50003CFFB2B2BE3CAE0C000000000000000053 +:10FA60000000000000000000FFFCF000CBCB000015 :10FA70000000000000000000000000000000000086 -:10FA800000000000003CF0FFE1C3C3C334F0F7F016 -:10FA9000000000005FFF5F0F00000000000000009A -:10FAA00000F03CFCDFD0DFDF0000000000000000C1 -:10FAB000000000000000000000007530303000C081 -:10FAC00000C0000000000000000010150000000051 -:10FAD0000000FFFF0FF000FFF0F00000000000004A -:10FAE000000000000000000000005F5F5F4BFFFFB0 -:10FAF00000E000000000000000000000000055557C -:10FB0000555540C27CFE0505C0C00F0F00FF0055D3 -:10FB1000FFFFFAFAFA385500550000000000000017 -:10FB20000000004000410000F7000000000000005D -:10FB3000000000000000000000000000FF003F0087 -:10FB4000FAFA0AFA00000000000000000F0F0F0F81 -:10FB5000243CA5FF173F1703FEF4FFFF0000000041 -:10FB60000000000000000000000000000000FFFF97 -:10FB7000FDF53D0500000000000000000000000051 -:10FB80003C3C0F0F40C27CFE0505CFCF5555555567 -:10FB90000000FFAAFAFA00FA510055000000000028 -:10FBA0000000000000400041F7F7F70000000000EF -:10FBB0000000000000000000000000000000FF0046 -:10FBC0000F00F4FA00FA000000000000000000003E -:10FBD000555581C3A5FF030303030E040000000075 -:10FBE0000000000000000000000000000000E0E055 -:10FBF000FFFFFFF7FFC700000000000000000061EA -:10FC00000006000D0005A0614006009D0001056191 -:10FC1000400E050D00A00061000100090001006117 -:10FC20000006000D000005000A08050000A00061A4 -:10FC30000006000D000000000008000000A0000009 -:10FC4000000030000010000005000A08050000A0B8 -:10FC500000613006000D000000614006001D00013B -:10FC600000610006000D000000610006000D0000AC -:10FC70000061000E000D0000000000000000000008 -:10FC8000FFFF0FFFF03CFF3CF0FCF3FF030328EB0A -:10FC900000000000C3C1C3C3FFFFFF02F0FFFEFF6F -:10FCA000000000000003000300000000000000004E -:10FCB0003F033F033C383C3C0000000000000000D4 +:10FA80003CF000AA000000000000000000000000A0 +:10FA90000000000000000000000000000000000066 +:10FAA000000000000A0A0CFC00000000000000003A +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD000000000C3B2B2BE3CAE0C0000000000004B +:10FAE000000000000000000000005FFCF000FFEBE1 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB1000000030A000F00000000000000000000025 +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB40000000000000000000FF550F3C0000000016 +:10FB500000000000FF3CFFFFBFFFBFBF0000000030 +:10FB60000000000000000000000000000000004154 +:10FB7000FA38FA38000000005555AFAF0000000019 +:10FB80000000000000000000000000000000000075 +:10FB90000000000030A000F00000000000000000A5 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000550F3C000095 +:10FBD000000000000000CF0CCFCFBEFFBEBE000073 +:10FBE00000000000000000000000000000001414ED +:10FBF0000041F330FF3C000000005555FFFF0000BE +:10FC0000000000000000A0610006000D00000000E0 +:10FC10000008000000A0000000000000000000003C +:10FC20000000000000000000000000900000000044 +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000000000000000000000005AF +:10FC500005000A08050000A00000000800000000E0 +:10FC600000000A08000000000061000F050D000000 +:10FC7000A5615A0E050D00A0000000000000000163 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 :10FCC0000000000000000000000000000000000034 -:10FCD0000000FFC30F0F3C3C3C3CD2FAD2FA0F5558 -:10FCE0000F55ABBF8397EB69AA2800000000AAAAB2 -:10FCF000AAAACFCF0C0C7D287D28000000000000B0 -:10FD00000000F0000000F03C003C303C333F3F3F3F -:10FD100028EB80F0B0F0C300C300FF00FF00F0FF4D -:10FD2000FFFF0000000000280000000000000000AD -:10FD300000007D417D413C383C3C0000000000005B +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000000FF00FF000000000000006 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 :10FD400000000000000000000000000000000000B3 -:10FD5000000000003C000F0F1C1C3C145078507831 -:10FD6000FFFF0000293D0115FF7DBE3C15105555D4 -:10FD7000AAAAAAA8417D417D7D287D380000000007 -:10FD8000000000003C3C3C3C000000000000000083 -:10FD90000055FF00F7F2A7A20000BCBFFFFFFFFF66 -:10FDA000AAF0BEF00000000000000000000000000B -:10FDB000000000005500343000000000000000008A +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD7000000000000000000003C003C000000000FD +:10FD80000000000000000000000000000000000073 +:10FD9000003800000000000000000000000000002B +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 :10FDC0000000000000000000000000000000000033 -:10FDD000000000000000000000003030B2B200005F -:10FDE000000000552D2D04540E5E96D71496000089 -:10FDF000020A0003FF3F0E0F0F0FFFFFAAAA000029 -:10FE0000000000000000F404FE0E000000000000EE -:10FE100000003CF00000575207020000B0B3410060 -:10FE2000FF0000F03CF000000000000000000000B7 -:10FE300000000000000055003C3C43005F00000053 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000000000000000F2 +:10FE10000000003C000000000000000000000000A6 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 :10FE400000000000000000000000000000000000B2 -:10FE5000000000000000000000000000F3F3B2B258 -:10FE600000000000AAFF2D2DA4F4AEFE7D961469BB -:10FE700000000000080BDF1F0A0F0A0FC0C38082BA -:10FE800000000000000000000400200440042003E3 -:10FE90008802208240800400000084004083208487 -:10FEA00084A005408883889000024002000020085A -:10FEB0002185888302032008C00088044000219027 -:10FEC0002008840040044085000301000000020077 -:10FED00088008805400041048804100085082085BA -:10FEE0004080100084000500C04000418283010072 -:10FEF000C0000080840400000404C08082802010C0 -:10FF0000A080400000002000880041900400808212 -:10FF1000900440904102A0020590000200000502FA -:10FF20000002414102034020042120000484000219 -:10FF3000048420042004000080000000040100204C -:10FF40002003000041200400000200001000000017 -:10FF500000000000000080002001050100000410E6 -:10FF60000010040290000000404009011090412060 -:10FF7000048800C0000400010000004000040004E8 -:10FF800000010002200809000000000090030303A4 -:10FF90000010080904410002000290080221884074 -:10FFA0000984080501900240004000898209000888 -:10FFB00002100082090400859005008984028809E6 -:10FFC000884100C0000000000041820400000200DF -:10FFD0000800820009000082821008030911040051 -:10FFE000C110400209410108201020000110010049 -:10FFF000020020004008000440040280001020009D +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000200020002005040405 +:10FE900040002000000040052000880000004000D5 +:10FEA0000005000520004000000020000000400583 +:10FEB0000400C10084002080400084000000040091 +:10FEC0000000C000C000201000034008200904000A +:10FED0002080052004A0842020A000002000040031 +:10FEE000880040008810400020002000000588089D +:10FEF0008802C1002000C09084020008A000048095 +:10FF000020008410208420002003000000840000D2 +:10FF10000000000000A0000000000000008200A01F +:10FF200000000082000080C000000400000000000B +:10FF300000008000040009002120000000000000F3 +:10FF4000008240000000000040000000000040006F +:10FF5000100000020401801120018405000010003F +:10FF60000040000000000500000000004000090003 +:10FF7000004010030800000040100089210020000C +:10FF8000802009000900C0108500890000000200DF +:10FF9000000000000405000002000004A041040964 +:10FFA0000003084011051108200021000000000096 +:10FFB000000000100000010000000400000000002C +:10FFC0000000820000020000000041090000004122 +:10FFD0000008004100400000020001000104084048 +:10FFE0000800000240100000000001C000050004ED +:10FFF0000080080900000000000400000410000355 :020000040016E4 -:10000000001000800284000800000020041000841A -:100010000284020880080008410941850209048819 -:1000200000000810030804400083038405100484C2 -:1000300000090404001182030004200408040003E2 -:1000400000840484094000880990000803400000EF -:10005000001000084108C0102010040900084008E2 -:1000600000840400830904084004C082048440041E -:100070004084008205888085048380090004009004 -:1000800080C0040500048041004000000000020020 -:100090000040002088090203000200050202040259 -:1000A00089210840000904210021001104400408AE -:1000B0008402880284058421000882080404002147 -:1000C00020080021200800219002002100400003A8 -:1000D0000000004000218803A0210008000500085E -:1000E0000810001004208400042040092000900023 -:1000F00090020005000041A00010000083000008ED -:100100000008000500100021001000210000000080 -:10011000000000000582410480100400030000017B -:100120002011080880A041080000210821108088C3 -:100130004082118200A04184000800C000104021CC -:1001400000008000008880000000418200000888D4 -:10015000080000004000000000000000000000C097 -:100160004000A10108008003410080018988C1840A -:10017000410200A1410020104021080021C00800D8 -:10018000051000084000008800020001000208007D -:1001900000001000020204052004080402110005FA -:1001A000100010100009A0040040001182800420FB -:1001B00002800840C00082002008A0418241C01097 -:1001C000104082110100C010000040088203C000EE -:1001D00000000400000004000002A120041082209E -:1001E000084008000840C002002000000800C0408D -:1001F0002004820008409000400410000840820063 -:10020000080400112080824108040000098982004E -:1002100082000200C000000500C040C0041011842C -:1002200011000000000120000020218241884108C7 -:10023000A10582108900400003A0092000A003024C -:1002400040C10408000020900840008821000920D7 -:10025000080000A0000200000408058340C0000060 -:1002600003000582400040C003C12185110011A098 -:100270002100910002C0008400400900210010000C -:100280000040030103C0080400C000090502020485 -:100290000004002000200800000800020000820086 -:1002A000081000000008080200401008820000004A -:1002B00000020920A00809A0A008002108090021C7 -:1002C0008280A0202080000582050202080400022E -:1002D00000400200A005C011000000000802010259 -:1002E000000840088240000420009008090585109D -:1002F000044108058200001103001008A00002411B -:1003000008408200201184808200A00400091004AB -:100310000011000000000008100008100084000018 -:1003200000000000210440100284048200000088C4 -:100330000384080202A12190400208000000008806 -:100340000000001000008810080400008002040172 -:100350004008000080000000000000000000009045 -:100360004001080080100000000180041100408856 -:100370000802829000C0000000001010000005007C -:10038000000010C000042100020421000801000048 -:1003900040040500400000000000000000030408C5 -:1003A000002100020211029020800021084108086B -:1003B0000821004002890208002102900000082163 -:1003C000000800110321200000030200001000219A -:1003D00040100021002100080911820800000400DB -:1003E000902140100800A0008541200440040840EE -:1003F0000805401082000000208482214000021085 -:10040000840840211008080800000800000000408F -:10041000821100880000000800080000010011009F -:1004200009820402020200102140000200001110A3 -:10043000210411880940004080C008848320000006 -:100440001120118200400200004011104102009072 -:1004500021900000408200000000400005000000E4 -:10046000000000A0000000A0408240828283098337 -:10047000080008021188408240020804080000C0F9 -:10048000004000002108880000001140090000041D -:1004900020040002200400C00400410400104000B9 -:1004A00000010001000100010000A1018200000024 -:1004B00001A0400484038885C0C0918810A08840B2 -:1004C0000000A10084000000040800080088100853 -:1004D0009089A11085A002A0000003004000000048 -:1004E00000000000890088010000C0A08588908974 -:1004F000C008C0A0098920C0040302A0000502A012 -:10050000A0418440859100C0030989A1098400822B -:10051000020901C08808908240020000000020000B -:1005200000000040000800040004040283408041F1 -:1005300000000985890582C000A08080A10080009C -:100540000080000004008000000000800080048023 -:1005500080800211904040A00003000003000000D2 -:100560000000000000039003004000020385022009 -:10057000851180418084911100208091C00900C0C4 -:1005800085800004038003A10010A0021188A0A0B0 -:100590000520800220802180C08000000000030030 -:1005A0000000000090000800000090000280210080 -:1005B000022091A00500A1100420A0A09180A08499 -:1005C0008220C11080000080800000000010000028 -:1005D000000800008388408383C183200002040058 -:1005E000000003800000208040001000C1402080F7 -:1005F000201182C102038000040511000321900034 -:100600001091058041881100211141048283A010BE -:100610002103918390C10009000080400000000088 -:100620000000000000000800A000A000C100004081 -:1006300085008200C089104021010910838888400C -:1006400011040990C1090800100482000282000010 -:10065000000000050000041182C121A004840200F2 -:10066000C100A0001110000001C0000090000900AE -:1006700085108800A110C10188029182A040090163 -:100680000320082001A0A1A020A009A104851189B0 -:1006900088C0C001080311A01000902002011000C2 -:1006A000000000000000000000000001A1010100A6 -:1006B0000000000091010000C089C08800A082C035 -:1006C00084020090409102C0000000000000000180 -:1006D000101010A0004001A040101102830584A05A -:1006E00000000001A0000000000000000000010167 -:1006F000000102080105A104850500400082820472 -:1007000005C104400120009090A1C04100089083E1 -:1007100004A10803C04141898810020440A0840458 -:100720001185000000000000000100410903C00223 -:100730001109001011414020002000042105050589 -:1007400080840591000900A182900003000400004C -:100750000041008080800000410080A0A00488212A -:1007600004890041001080030040000000020403DF -:100770000321004100C120848310201100202000AB -:100780000089C185800304210009008800900502CA -:10079000C1A0808880A1008808210380000580A076 -:1007A000008388030009000500030010000000809A -:1007B000000000404121218009004100C184051151 -:1007C000090088029100880285001009001000804D -:1007D0000000000000000000800000002040219088 -:1007E000100040400000008000800004000021084C -:1007F0000902418010850500820590008040C021DB -:10080000214184218400C12180910280C0034110D4 -:10081000900440008303110040401080A0030003B7 -:1008200000A00000000000000000000000000040E8 -:10083000000400000001019100020090000009A1E5 -:10084000C0908808A00110C0A09111108400000180 -:1008500000200010000000000200080082008984CF -:100860001008A08210010020000800040000000011 -:10087000010500A00008000811A009C10884A0001B -:100880000503828884C105000589041191020401D1 -:10089000C1100288C01004000290108811C0A1018C -:1008A00000000020004000000000000000000000E8 +:100000000040040400030004000400050410000480 +:1000100000000004008400000008000400880000C4 +:10002000001005080001A088A00280C09000000018 +:1000300000000000000800000484000880080000A0 +:10004000000000084004030000840010A00000002D +:1000500000820000021000102008000808080409AF +:100060008404000009098408000000084002001010 +:100070000985004000842088000802084008000824 +:1000800000840009A008030800820485000400829F +:100090000000A02100020100000000030000000099 +:1000A0000000000500030021000200409000000352 +:1000B00000080000C0000020000800080000000048 +:1000C0008208000000000008000000080000000096 +:1000D000000000000000000000000000000300031A +:1000E0000004A041002000410040000800009009E9 +:1000F000A04100100803002190410040822100210E +:1001000000210003001004100021000088080004F2 +:1001100082040000000000002082000000000000B7 +:1001200000082104080008840008000000080000FE +:100130000088210000000000000000000000001006 +:100140000000000009840000000000000000000022 +:100150000500000000000300000000000400000093 +:1001600000000001410041890082210000000000E0 +:1001700000101000410000082184000010000082DF +:1001800041004100040000008000008200004100A6 +:1001900000010001A000820004008200004000096C +:1001A000C0000800000000009000002010001000B7 +:1001B00009002000080000000000000008020800FC +:1001C0000100000000000800400008000005824116 +:1001D00008000800000020000000C00082000000AD +:1001E00008008200080008000400A00002090000C6 +:1001F0000800000082002004040008000400080039 +:10020000000000000800100000000040000408008A +:10021000A000080000000000000010001000000016 +:100220000000000000A00840000000000000800066 +:10023000800010008000000000000000000040006E +:1002400003000400030008000200001041000384C2 +:100250000000008480840000200000A000A00000B6 +:1002600000000000050000001108840800100020B4 +:10027000008404A000004000850800100088800071 +:100280000040000000A04090090403821190021079 +:1002900000A040880082000000000000002008004C +:1002A0000000840082080000C021000082000800D5 +:1002B00000008408000008000021001182080821C5 +:1002C0008200820000008280080020000000000000 +:1002D000000000000002C000000000000000022139 +:1002E000000300211000844082000008001000007C +:1002F000840200081021000082088200000004002F +:1003000082050005000000408203002100218221B7 +:1003100000000008000000080808000000000000BD +:100320000008210000A00400000000000000000000 +:1003300000000000080000000000000000000000B5 +:10034000000000000000000021200000000000006C +:10035000000000000000000100000000000000009C +:100360000008000808000000000000001100000163 +:100370000000200000C02004002000000004000055 +:100380000000000000000084000000900300001046 +:100390002104000000000000000000000200000036 +:1003A0000000000408000021080000008200020094 +:1003B000A000820004000003000800030000000504 +:1003C000080004000000820800000000C0000000D7 +:1003D0000000080000800021000000000000002153 +:1003E00040218208000810000000040010000021D5 +:1003F0000000000008400000004108080002884199 +:1004000082000021000000110000080500090221FF +:1004100004108240000000080800000000000000F6 +:1004200000000000000000000000000000000000CC +:10043000000000000040000000000000000000007C +:10044000000000000000000000000000000020008C +:10045000000041008082411000A008080908000047 +:1004600000000000000000000000000080000040CC +:1004700000A000000000004000A040002000000597 +:10048000001011100090030000840000008440C0A0 +:1004900002004000000020002100408200004000D7 +:1004A000000000000000000000000000000000004C +:1004B00021C00002004008100421100404418208F9 +:1004C000000000000000000000000000000000002C +:1004D0000000000000000000080401040000020207 +:1004E0000000000000000800000089A020400088F3 +:1004F000828400409190108200900000010008006A +:10050000000000000100A000000000000000C0008A +:10051000040009000000000020000020900889105D +:100520000083000000000200000000000000000046 +:100530000000048000800080800002410503888262 +:100540008005000000000000000000000000000026 +:1005500000000000000000000000C080100000004B +:100560000000000000000000000000000980000002 +:1005700011008000008083008080000000000300E4 +:1005800080000000000003001100000010001000B7 +:10059000000000008400000000000000004020A0D7 +:1005A00041050008000000000000000000000000FD +:1005B0000000000080000000001000804100088959 +:1005C00004404183000000000000000000000080A3 +:1005D00000000000000000000000800021008821D1 +:1005E0008280050000000000000000000000000004 +:1005F0008021008000004000218002A04080020095 +:10060000110003004100082002000400C000820025 +:10061000A100200008000000800080000000110000 +:100620004100200210030000000000000000000054 +:10063000000000000000400020002000A0C090A0AA +:1006400082C0218805C000000000000000000000FA +:1006500000C0000000829000880088000200210095 +:100660000900A00888000000000000000000000051 +:1006700002001008C0040208900205C0410205886B +:100680000000000000000102900011000000C09076 +:100690000400020020001100A0002000A000400083 +:1006A0000004000001010001000100000000000042 +:1006B000000000000000000000820008C0C0209080 +:1006C00011830110C010028900000000000000002A +:1006D0000000000004000000000000000000000016 +:1006E000401000040285001100000001000000001D +:1006F000000109020088900409C040000001840143 +:10070000090100010000400000000000000000019D +:10071000000000010004000900A00008008400900F +:10072000001008010101010191000008000900000A +:1007300000000000000000000000000000808000B9 +:100740000000C1401003C1C1804100000000000052 +:100750000000030000008000000000000000000016 +:1007600000008000000280A109910000001000112B +:1007700000000010908000800000908080400040C9 +:100780008002A108000900030040000200110008D7 +:10079000002100110040000900A1008000000000BD +:1007A00000800000004040032020110200000000F3 +:1007B0000000000000000000000000000000000039 +:1007C00000000000C12021004000400400000000A3 +:1007D0000000000000000004000000000010008085 +:1007E00000800000008000210080802000000000C8 +:1007F00000000000000000008011000000004180A7 +:1008000090820900000800800000000000020080C3 +:100810000091000000000000800000800002000243 +:1008200000A1008000002021202104000408000015 +:1008300000000000000000000000000000000000B8 +:1008400000040004000005A1A084C0209101000064 +:100850000000000000000000000000000000000197 +:10086000000400400000001008890282A00000007F +:100870000000000000000000200004202020C00034 +:100880008310A0080220900100400000000000003A +:10089000000800020000000088900408A010400139 +:1008A0000000000200900000002101000000000193 :1008B000000000E000000000000000000000000058 -:1008C000000000000000000000000000070082009F -:1008D0000000000000000000000000E00000000A2E -:1008E000000000E0000042000000000000000000E6 -:1008F00000000000000000008200000000E0000096 -:10090000000A000000000700600A000000E000008C -:1009100000000000000007000000000000E00000F0 -:10092000000A000000E000000000000000000000DD -:1009300000000000000000000000000000000000B7 -:100940000000FD00000000C0F0C000E600E900006B -:10095000000000000000000000005AF05AF064643B -:100960004064D0F010F03C3FFCFF000000000000AD -:10097000000000000000000000000000BDFC240C8E -:100980000042664280888000C0C00004606C606FD6 -:10099000F7D33410FFBF0F8F7C1C7C7CF76791016D -:1009A0000DBD00000000000003033F3F00000000F9 +:1008C0000000000000000042000000E0000048427C +:1008D00000000000000000000000000007006000B1 +:1008E0000000000000000000000000E00000000028 +:1008F00000000000000000000000000000E0070011 +:100900000000000000000700500000000000000090 +:100910000000000000E007000000000000000000F0 +:1009200000000000000007000000000000E00000E0 +:100930000081000000000000000000000000000036 +:1009400000000000000028410000200410082010D2 +:10095000040800000000000000000000000000008B +:10096000000000000000000000000C080C08FFFF61 +:10097000FFFF000000000000000000004343404370 +:100980007E7E3C0F000000260000000000000000FA +:1009900000000000000000000000000033000033F1 +:1009A000FFFFF00000000000FFFFFFFF000000005D :1009B0000000000000000000000000000000000037 -:1009C000000000009D00000000C0000000EF00E9F2 -:1009D0002400006000000000000000005AF05AF0FF -:1009E00000000000D03010301313D3D300000000FB -:1009F00000000000000000000000000000007EFC7D -:100A0000180C066606663C330000C0C00000606C2F -:100A10006060DBDB1818F0B000801C1C7C7CF66684 -:100A20009000BDBD00000000000000C33CFF0000BE +:1009C00000000000000000000000284140028001FB +:1009D0004080020100000000000000000000000054 +:1009E0000000000000000000000000000000000007 +:1009F000FFFFFFF7000000000000000000007F7F05 +:100A00007C7F18183C0F000000260000000000004A +:100A100000000000000000000000000000003300A3 +:100A20000033F000F00000000000F0F0F0F40000EF :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 :100A50000000000000000000000000000000000096 @@ -90304,405 +90304,405 @@ :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000006C6C0CFC56 -:100AC00000000000660FFF0FF000F000FF307630EE -:100AD000C3810C0C0020002000000000F5F500F59B -:100AE000300FFC0F0000000000303C303C003CFFA9 -:100AF00000000000BD187E7E0000000000006600BF -:100B00000000303030308D0C8D0C00F40FF42D2DA2 -:100B10002D2D060606062424CFCF0FFF0EFE3E3EE7 -:100B2000003E2C00240018001010303F6F6FF0F0D2 -:100B30003C3C0000000000000000000000006C6C65 -:100B40000CFC00000000660F000FF0E0F0F0000069 -:100B50000000FF990C0C0000002000000000F5F5DB -:100B6000F5000C3333CF00000000240024000F6692 -:100B70000F6600000000B8B87E7E00000000000094 -:100B800000000000606F6F6FBD3C810000F40FF447 -:100B90006666FF663E063E9F24240C0C01F100F0C1 -:100BA000FFFFC1FF2C2C242418001818303F606070 -:100BB000F900FF0000000000000000000061400696 -:100BC0000009000500610006000D00050061000637 -:100BD000009D000085615A0E059D00A5006100067C -:100BE000000D000080610007001D0000006130075B -:100BF000000D000100610006000D00010000006111 -:100C00000006000D000000610007000D00000061FB -:100C1000000E009D000000413005000D0000006145 -:100C20000E06000D000000610007001D00000061BD -:100C30005007000D000000610006000D00000000DC -:100C40000000F03CF0FF0C0C3E0EF7FF000000C36C -:100C5000AAF0BECCBEC0FAFAC2FAF7F4FCFC00005F -:100C600000003C3C3C3C0000000000000000EB00A9 -:100C7000EBFCCF004F0000000000FFC30F0300009B -:100C800041550000AF8300FFF0F0F5F0F0F0F040C8 -:100C9000000000001441EBFF28280000886E72F16C -:100CA0001700D4D40000CC0FFF5C0F5C0C0C0C0CB4 -:100CB0000000000028F3EBF300000000F03CFFAA66 -:100CC00000000000F03CF0FF0C0CFECEC3C300009F -:100CD000FFC3AAF0BEFCBEF0FAFAFAFA0000000068 -:100CE00000000000AAAAF0F00000000000000000D0 -:100CF000EBC3EBFCFF007F0000000000FFC3554189 -:100D0000000050550000AF83000000000000F050CC -:100D1000F0400000000228BE146928280A0A886EE4 -:100D200072F11700E8E80000F0CCF05C005C0C3CCD -:100D30000C3C000000002830EB3000000000F03CCC -:100D400000AA00000000000000000050AAFA000005 -:100D50000000000000000A0A28AA000000000CFCA5 -:100D6000FAFA00000000000000000000000000008F -:100D70000000D779FF791C001C0000000000FFFF75 -:100D80005A5A0000FFFF82C01C1400AAC0C03020C5 -:100D9000FFFFF3B3D56E6518FFFFF00F287D7D28A8 -:100DA00000410041FFB0FFB03014303CFFFFFF0FA7 -:100DB00055FF7878000000000000000000000000EF -:100DC0000000000000000200FEFEFFFF0555AFFF1F -:100DD000FFFFFFCF820800AA000000000000000013 -:100DE0000CFC0A0A000000000000000000000000E7 -:100DF00000000000D7FBFFFB1C00140000000000F7 -:100E000000005A5A0000FFFF00001C3C00AA00002E -:100E10000000D7D7FFFFD56E65180000F00F287DC2 -:100E20007D2840405454FF10FF1030003028C3C3C9 -:100E3000C30300AA78780000000000000000000052 -:100E400000000000000082002011C000200240834A -:100E5000000004091002C0030400408020022008A2 -:100E600040008404401004028420042020840000F8 -:100E70000210890004050410001000020411000093 -:100E800020002004841100031005400040022000CF -:100E9000000084058803041104008800A002008477 -:100EA000C1000084200010848485880001000000B7 -:100EB0000080C0800500048504054000020803800E -:100EC0000380020020808904100209000002000053 -:100ED00000080002400000902002C0040040109072 -:100EE000400200020000C00280000083A0410020F8 -:100EF0000484C09108002000900140010001A0007E -:100F00001020100200001000000020008500C00129 -:100F10000000000000000500000040004000090043 -:100F20004010400010100000C010204000000808D1 -:100F30000000002040204008000400000082000063 -:100F400082041008410000024000000402000080FA -:100F5000000510080080031100008404000000094F -:100F600005008210021089100009004000100002E4 -:100F70000002858390400140A0C0000000080000EE -:100F80000190000000040410000300000190000024 -:100F9000104102089021204002001080004100050D -:100FA0000009C0C1840000800140008200000040B0 -:100FB000400002090020002000830009000901838D -:100FC0000005000000000009000000001008008279 -:100FD00000100808834000024084110804880910AA -:100FE00000080484008200044084410820100009A5 -:100FF000008400094040108210C1004040080004F5 -:1010000005844010008405100084000400000203E1 -:1010100000088010001000100009030802020008F8 -:1010200009040000000200000004020000084082E1 -:101030000084800400C000110085022000080040E8 -:10104000400200C000842010008400000000400323 -:1010500004080208400208030408404000109008F9 -:1010600040020402040200402008000305100203AD -:101070000040A01000210009400800210008402184 -:101080000400004005080040100200410008000074 -:101090008802A00008080021000800030210844014 -:1010A00000100000A00300080210090840401008CA -:1010B00000030010000888080000000205880800EE -:1010C000C003080800008810A005021000000810E6 -:1010D0000000908404102111001000A002884182B9 -:1010E0000910800008058040080000881088400131 -:1010F00000080020008200880308002008080388F8 -:1011000080908808008804000084410810020008CC -:10111000000000080800809000002100030805007E -:10112000000809844000000803008301202000A17A -:10113000850103C010850308000009820808841097 -:101140002088008400A003A0008400000000008428 -:1011500003018805A0200020004090200840824024 -:10116000084088090440A004000040409004044066 -:10117000404082040840000500000003A08288115E -:101180000109082000020921040010409003824058 -:10119000082000008220041008000480824000C063 -:1011A0008200080008090400100008004004200420 -:1011B00000040840A180880010090011C01100201F -:1011C000001183000000C01140024000C080A00058 -:1011D000A041080904884084000000840008001031 -:1011E000000800000200200002000000009000A0A3 -:1011F000088400A0210003100908044000401141A8 -:1012000041000490030540830800000400000282AE -:10121000000000840000000000000040410202883D -:10122000000208000004000200000082020080406A -:10123000800110000000101000000810040000845D -:101240000305009004822108000000040000000251 -:101250000008048200900800000000400021900572 -:10126000000040000040830508000041C108000064 -:10127000080001418283830002098220900508034F -:101280000008840088050041040004880040C00371 -:1012900000410000000000000040000082054010F6 -:1012A00000000021000300218321000800410841C3 -:1012B000A000A084828011800000080000000800C7 -:1012C00083858341080210A000418202824100040C -:1012D00000002000080000080000400005840040D5 -:1012E00021001000A00000001004050800904090AC -:1012F0001108200008080040040000000001002040 -:1013000000020000008800000220808280034190DB -:10131000080000000000000800002100080800008C -:10132000898300040010000200A0400000000008B3 -:10133000000000881005080810400090000000041C -:1013400009000402084008020005028400000004AD -:10135000000100000000080021009010900202210E -:1013600000100008821140414004000300210210D7 -:1013700000000421822090000504040504418840F7 -:10138000008088A140210010C0100020000000A1B2 -:101390000004404182210009002100008803400030 -:1013A0000200004040040041402100210405821059 -:1013B0004003402190080004C02183100021C00890 -:1013C00090000000C00902028804021008210809E8 -:1013D000084188210008112090081002080020010F -:1013E00000201121200121040984000020000000B8 -:1013F00004000204000000002000400000048000FF -:101400000000002000402000000110000302000442 -:10141000202000C004000000000000820000000046 -:1014200080000020000000A00000830000A0000059 -:1014300000000000000000C00000040010000000D8 -:101440002000002000840040000041000000000057 -:1014500003000000000000204000000002008402A1 -:1014600001908884C0C00000000121000000C0403D -:1014700091C000A084820088000408A0C00408A0D5 -:10148000919088008220A0C1820300A08284204124 -:1014900083088220909100000000000000000000FE -:1014A00090010801C0008201A08804200804828401 -:1014B00082A001890291880920C1A1208321820391 -:1014C0004188112082041004A141118982C01110A9 -:1014D000000200040820002000000000200000019D -:1014E00080801080000080000008100802090010B1 -:1014F0008080A000008000800080040080800000C8 -:101500008080A0000000800089C100A10009800344 -:1015100000C10403800380030000000000000000FD -:10152000000000418021001080218000890080801F -:101530008000000503020002000280C14005044053 -:101540000083898020008080840090C005020341D0 -:1015500082C00391050980100005001020111005BC -:1015600000100000009180000020000009004000F1 -:1015700041809000A002880441A18000890085007C -:101580000300A000A040830004808080802180A010 -:10159000809090800009A090048300030000000068 -:1015A00000000000800009050400404009000441DB -:1015B000C004C0100000000080008000C000024095 -:1015C000058020218900082105C0C18020000084F9 -:1015D0008011A180040991A1850083000300080007 -:1015E00088004185048404C1A0828400009000002A -:1015F000010001A0A1000201850121910800101045 -:1016000002048800030008C0A020820488408200F1 -:10161000A010C091401010C021080511000000006A -:101620000000000000008882C0008490C00190206B -:101630000100A19109018800C000A000080809006C -:10164000919190A001010200830083C103A00300D7 -:10165000040982200920850010840420020084A04F -:101660000300110021A04003000282C1010000011B -:1016700000000100000140820008C00310042000A7 -:101680000002A08288C0880500108483A008040896 -:101690000040050483C0A0910140C09102100000E9 -:1016A000000000000000000000090104000100002B -:1016B000100200A11089108282A0010941849021AA -:1016C00020A101090090918220400010048405C1EE -:1016D000030300844009A1A0040101010101830169 -:1016E000000000008401000080080011001021406B -:1016F000000811040805004080020085002180894F -:10170000001000418080008404900011002180833B -:1017100080804100820089800908402110219005C5 -:1017200000000000000000000000008803210221EA -:10173000090480C100A00021808200412088400966 -:101740000003000211824105098500830011009009 -:10175000A1844103000584888884802110094021E8 -:101760008910000504054140110310000500050023 -:10177000080002A1210040000210C0008400208067 -:10178000C0400000004080000000000080400000D9 -:101790000010840490840203400003A1848882A185 -:1017A0008502000000000000000000000840000268 -:1017B000C10011838800911020001040000000A09B -:1017C00000000000C10408212180100580808004F1 -:1017D00000C00011000480900080001020040382EB -:1017E000A080110403892180020040C10000401044 -:1017F0008410C10000C1000000000000C188400248 -:101800008504020100884091A0C00400028204887F -:101810009010C000C00182880508C000830505C083 -:101820008491090000000000000000000000090190 -:101830008401109010A184C002A04108040100009E -:1018400000A100A00000C18291032184850010C086 -:1018500002212008C00000011011C0044000C00493 -:101860000421838441010041008201020111000032 -:1018700000000700840A000000E00000880000006B -:101880000000070050000000000000000000000001 -:1018900000000700000000810000070000000000B9 -:1018A00000000700410000000000000000000000F0 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000E00000000038 -:1018D0000000000007005082500000E00700840074 -:1018E000000000E000000000000000E000000041F7 -:1018F000D7F3D7F3CF45CF4500000000000000002C -:10190000FF00033F5050FAFABA10BA1000F0000F6F -:10191000070DD77DFFF06960000400140082F0F825 -:10192000FFF03CAA43831C2C0000000000000000D4 -:1019300000000FFF0969CCCCCCCC000000000000F7 -:101940000000000000009E9EFF3C05050A3A003C96 -:10195000003C4515CF3FFFFF82D7C5CFC5CF8F0CC9 -:10196000DF5D010101010000000000000000000037 -:101970000000143014300045004500000000000055 -:1019800000000000033F4050EAFABA10BA1000000D -:101990000000D77D070DFF0F690900000014F0F269 -:1019A000002800F03CAA5FAF5FAF0000000000001D -:1019B00000000000FF0F6909AAAAAAAA01000000FE -:1019C0008000000000000000DFDFFF3C5555AAAAA0 -:1019D00055500050CF3F4515FDF882D7050F050F34 -:1019E0008300820005000F0A0000000000000000D4 -:1019F00000000000CF0CC300F000F7000000000062 -:101A000000000000783C283CC1C1CBCBC3C301C35C -:101A100054FC51F3140000000C000800000000000A -:101A2000FF0F7D7DCCFF88AA445588AA00000000E6 -:101A3000000000000000000000003C3CCF0300005C -:101A40000000000000005555FF0004040000A0A0A5 -:101A50003F30A300A30054FC51F37171417D3C3C25 -:101A60003C3C54540404000002A2501450140000E2 -:101A700000009600FF00CF0CFF3CF000F0000000DB -:101A80000000000000007D3C2D3CFF00FF0001C372 -:101A900001C3A8FCA2F30000000008000C008000B5 -:101AA0002000000F414188AACCFFCCFFCCFF0000F2 -:101AB000000000000000000000000000FC33330CB8 -:101AC00000000080410000000F0F3C3C0CFC0000B7 -:101AD000AFAF3F30A3F0A3F0A8FCA2F3F3F3C3FF32 -:101AE000343E14BE54045404A0A002A2501450006A -:101AF0000000000006060F0F00610E06000D00003A -:101B000000600007000D0000A0610006000D00004D -:101B100000613006009D000005610A0E050D00A061 -:101B2000A0615036009D000805610A0E050D00A059 -:101B30000000000000000000000000610006001D21 -:101B4000000000610006000D000100610006000DAC -:101B50000000A0415005001D00000061000E004D76 -:101B6000000005610A0FC50D00A0006130060009E4 -:101B7000000100600007000D0000D7D0EBE0A58158 -:101B8000A5240400000035053F0FCFC3000000C3AB -:101B90003CFF00000000F2F2B1B1000000000000C4 -:101BA000002CC3C04340000000000FC35500D2D238 -:101BB000FFFF00000000000000000000C3C3D9D9EF -:101BC0006A90BB56070BD0E005050014000000002A -:101BD0000F09FF69C3CFC3FFAA2AF27200000000F9 -:101BE000FF3CC3000000000070757A7F0FF0C3C394 -:101BF0003D3D7D3C4488CCCCFFCF3F0FD0D7E0EBC0 -:101C0000FFC3FF3C04000000F5C5FFCF00C3000088 -:101C1000C0C0FCFC0000000088886E6E0000000060 -:101C20000000001C0300434000000000FFFF5500BF -:101C3000FFFF00AA000000000000000000001D1DC2 -:101C400046466A90BB56D7EBD7EB050541550000D9 -:101C50000000FF690F09C3CFC3C3A808B07000001C -:101C600000004D4D4D4D0000000020252A2F0FF0A3 -:101C7000C3C33838283C55AAFFFFF5C53505000019 -:101C800000000000000045CF51F3F0FAFF550000BE -:101C90000000E1410FFF00000000F00FF00F000016 -:101CA0000000D7D07D70AA08FF0C0000000050FA99 -:101CB000BF3DC35500000000000000000000000010 -:101CC0008282AA00F50505F500000000870F0F8746 -:101CD00002AA220000000000FFFFFFFF3FEF3FFFCE -:101CE0000000000000000000C0C000F00000828280 -:101CF000AB01BF15280F3C0F458ACFCFFDFF828275 -:101D000000000000000000008ACFA2F3FFFA005597 -:101D100000000000EB4B00F0000000000000FFFF9F -:101D200000000000D7077D0DAA28FF3C000000003E -:101D300050FA8301C355FFFF0000000000000000BF -:101D4000000082825F5FF50505F500000000C34BCF -:101D50004BC30228420000000000FF03FF5F30C0B9 -:101D60003FCF0000000082005050F0F0F0F0000083 -:101D70008282AA00FF550000000051A2F3F3F1FF98 -:101D8000BEBE880000034010200004008400020052 -:101D900000410010200420040040840004040402D8 -:101DA00020002005C010840420112000820020059E -:101DB00084000200C00004080000840084000409BC -:101DC0008800000020002000040004002004880097 -:101DD00020021010201188000400000004000402FA -:101DE000C0008200200004002009C0008409040013 -:101DF0002011840204000202C000C008200020104C -:101E00000000200200900500049000900000009067 -:101E100041000090009009900000009000000082B6 -:101E200009000000009000000400000000020040D3 -:101E3000040010000000000000000000000400008A -:101E400041000000000000000000008220000000AF -:101E50000400000440000500000021C01100000043 -:101E6000000000000000100000000500000020C07D -:101E70000000000010000000100020000000000022 -:101E80000084000009009005000400000000020327 -:101E900000200004080500004020901008400000C9 -:101EA0000241002100030000000400410000000086 -:101EB0009004000400090004000300030004004132 -:101EC00000000000000000000003000000100010EF -:101ED0000004200400000000004100000000001089 -:101EE000004000000200200000090005A0000020C2 -:101EF0000008000000030040004100000002000054 -:101F000000400000000000000440088804844008ED -:101F10000310000400000008098400880082008883 -:101F200000400084008800020008008404C040884B -:101F30001084000800100010000800C00084008811 -:101F40000010001000080008000041040010000408 -:101F50000004401000080084050800820000020808 -:101F60000808000800080082001000002010000887 -:101F70000084000800080008041000880008008899 -:101F800000880010008800020010C003902100416A -:101F90002040000588211021000390030003040560 -:101FA00082030840004140028408004100080021EB -:101FB00000100000000390080008200500210040E8 -:101FC0009040000300082040000200009003000839 -:101FD0000008000800080021200882020400000315 -:101FE0000005C00500008410004108080021880099 -:101FF00082002040000004000041A0088809002061 -:1020000004210405044100080000000000900008BD -:102010002182002010A0400800041000211000A020 -:1020200000884140000803080200091000820000F7 -:1020300005000000210000A005A0008400A000040D -:10204000000000A000A000A0009000A00000090077 -:1020500041C020A005A000040010000021040300DE -:10206000030803022102030021000800050000000C -:1020700008002100000000A003A0038410000082DB -:1020800003C0100820A000000010210000841010E0 -:102090000800000884208409080982050009084115 -:1020A0000010000908210000000208090004004097 -:1020B0000040080082408420881100048440000011 -:1020C00040000008820482008203001008400000E3 -:1020D000A00040002040820482410004A00084044B -:1020E00000410000080000400004204090098202E6 -:1020F0009040C0401000000000000000000282007C -:102100000800A00000400005040000400009000095 -:102110002090028200001190400005040008094050 -:1021200000C041C00220000003820888038804C068 -:10213000009000000210208240084000408404000B -:10214000009040C0030240840490008400A011204D -:1021500000000040008400820040000421000500CF -:102160000400050000040000044008C0080400004A -:1021700002004100000404C004C0040011900340A8 -:102180000300008800040000000040880090000068 -:102190000000000000000008001008030002020018 -:1021A00000020000000000210008001000000021D3 -:1021B00000110000000000000021000000000009E4 -:1021C00000200003000000000000000000020800E2 -:1021D000001000000041A00000000041C0002003EA -:1021E000000040400008000000000021001008002E -:1021F0000800000000000041000000000000000096 -:10220000000000000000080000000000C000000303 -:102210000000000811082090000000A000200084A9 -:10222000001005A000C000081008210000040210E2 -:10223000001002A0028200C02008050800C000A013 -:10224000030000A0040008040800210800000000AA -:1022500000001100000000000902200008000082B8 -:102260000884200003A000A0090041040300080026 -:10227000088403A00000100000A02000211000101E -:102280000800001008840300000003000000008420 -:1022900000A0081000009000000000040000820070 -:1022A000000000000800020800090004000000000F -:1022B0000000000800008200000000000000000094 -:1022C00000000000040000000000000300110808E6 -:1022D0000800000000410000000082210800880082 -:1022E000000000110000080000000840400000004D -:1022F00000009000A0080421000000200000084019 -:10230000000008002000000000000000040300029C -:102310000000000008000008000004041100200074 -:102320002108021000900004209020400000208826 -:10233000210000100500004004100090200400203F -:10234000208808901100200804A0119009001100B5 -:1023500000004000400000000000000000040000F9 -:1023600000002090028800C0000441000000050029 -:10237000000000002090118210840900212000A09C -:102380002090020009040020050000040202210040 -:1023900020400000000000000000000000000000DD +:100AB0000000000000000000000000000000000036 +:100AC00000000000000000000000A0050108020472 +:100AD000102008040000884400000000000000000E +:100AE0000000000000000000000000000000050001 +:100AF0003C3CC3C3200020000000000000000000B8 +:100B000000006BFB6BFBD2D2D2D29981F9C10302F8 +:100B10000C04000000000000000000000000BDBD4B +:100B20006060000000004EC34EFF000000007C002B +:100B30007C008181F3300000000000000000000014 +:100B4000000000000000000000000000A005801070 +:100B500040208040010288440000000000000000A6 +:100B6000000000000000000000000000000005037D +:100B700000033CFFC3FFF0D0FBDB000000000000DF +:100B8000000000006666FFFFFF996600FFC3FFC319 +:100B9000C040302000000000000000000000000005 +:100BA000BDBD6060000000004E004E3C0000000033 +:100BB0007C000000BDBDF3300000000000610007B4 +:100BC000000900000000000000000000000290008A +:100BD00000001000000000010000080000000000FC +:100BE0000000000005000A08050000A00000000049 +:100BF0000000000000610006000900000000006124 +:100C00000006000D000005610A0F059D00A10061AE +:100C10000A0E000D000000610006000D00000061DA +:100C2000000F000D000500610006000D000000002F +:100C30000008000000010061000500010000000044 +:100C400000000C0C0C0C0000000000000000000074 +:100C5000000000000000F0FFC355AA00F0C3000030 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000F0F000056 +:100C8000000000004D4DFFFF0000000000000000CC +:100C9000000F0055D7070000000000002C282C3C56 +:100CA00000000000001400BE00000000B2F3B2F328 +:100CB0000000000000000000AF0F2D0FFF3F0003F9 +:100CC000000000000C0C0C0C0000000000000000F4 +:100CD0000000000000000000F000C355AAFFF0C3B0 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000FF0FFFE7 +:100D00000000000000004D4DFFFF0000000000004B +:100D10000000000F0055D707D707000000003C3C3B +:100D20003C280000000000FA00FA00000000BEFFAE +:100D3000BEFF0000000000000000050F2D0FFFBEE9 +:100D40000082000000000000000000000000000021 +:100D500000000000000000000000F0F000FF00FFB5 +:100D600055550000000000000000000000000000D9 +:100D7000000000000000000000000000000000C0B3 +:100D80000040000000000000000000000000000023 +:100D9000000000000000000043434300000000008A +:100DA0000606AAAA000000000000000000000000E3 +:100DB00005D7058200000000000000000F0D0000B4 +:100DC0000005FFAF00000000000000000000000070 +:100DD0000000000000000000000000003C3C5555F1 +:100DE0003C3CF0F0000000000000000000000000AB +:100DF00000000000000000000000000000000000F3 +:100E000000C000C000000000000000000000000062 +:100E1000000000000000000000005F5F5F000000B5 +:100E20000000C009FF55000000003F000000000066 +:100E30000000AFD7AF8200000000000000000F0FDD +:100E400000000014FFBE0000200000008800000029 +:100E50000400840584000080000082050000040076 +:100E60000400010400040000C00084080000000029 +:100E7000200020042000C000400084008402040000 +:100E800020001100C00200030005200089000100BD +:100E90008400880083000400408520102000008822 +:100EA000888000804002401000028580418004005C +:100EB0000440890288900080880241802008100246 +:100EC00000808880A0002104200000200000000095 +:100ED00000200000000000000010000040000000A2 +:100EE000000080000402000240000000000000003A +:100EF00000000000000000000000000000000841A9 +:100F0000C10040008400000100000000000040001B +:100F10002000090041020400200000100000000031 +:100F200041020008400280008001100040102002B1 +:100F3000004000410400044100024000401004044D +:100F400021010008401000044000040000000000DF +:100F50000000020900000204080002000000000076 +:100F6000020000210000001000000040000000000E +:100F7000020000100040080900100040000091002D +:100F80009003A040081000100108000000000000BD +:100F90000000200010090000402000000000008038 +:100FA00000000000000000040800024100020400EC +:100FB0000008000200000509000900000000020905 +:100FC0000000000002000202008201400000000058 +:100FD000000000040082008400C00008000000003F +:100FE000000804080084000804080008000000C08D +:100FF0000000000200840085000800084085000011 +:1010000008080008040080040085020900000008A8 +:1010100040080010848480080008820900842008A9 +:101020000040001020100508001080000410000986 +:10103000200800890001000804084008000000841E +:10104000890003C000048010008904030408000024 +:10105000000000030000000800100000000000086D +:10106000000000000000000000200020C000000080 +:101070000000002100000008000800030000000834 +:101080000121011001400188000804000000000057 +:10109000000300030040000000210000024188001E +:1010A0004040000000020005001000210000000880 +:1010B00000020021000308080021040300000021B1 +:1010C000C000001008008208A020000800030420CF +:1010D00000A0218800100008080008000808090086 +:1010E0000800080008000800000000A100830000BC +:1010F00000081004000000000000000000000000D4 +:101100000500040004000400082000000000002086 +:1011100000000084030003000300004000004100C1 +:10112000030080000000000000000800008400842C +:1011300000A0418500000800800000C00000000001 +:1011400021204108080080A00000000809000000DC +:101150008010000000400800080400000021000486 +:1011600008000011004000002010000300000820CB +:1011700000051000000000008221000000000005B2 +:10118000A000822020400805820020802141000329 +:101190004103000000028203C0008200C002080078 +:1011A00000040000000082000040000500880820C4 +:1011B0000800000040410840900010040802084068 +:1011C00008200805C0000004C00000044004A0007E +:1011D000090284020000000000000000000000007E +:1011E00000000000000000000400000000000000FB +:1011F00000010000000000000000030000000000EB +:1012000008000000000100040000000080028400CB +:10121000000010000000210000000000000000009D +:101220000000001000C000000000000000004109A4 +:1012300000842000000080000000001000A000409A +:101240000000001000000800000000100000004036 +:1012500000104001000100000000000000410000FB +:10126000000800000000080000000000000000006E +:101270000400000000000000000800200009000039 +:1012800000000000900085000488088083000000B2 +:1012900000A0002090C00000000040020008A00450 +:1012A0000041080000200010C0418200000800003A +:1012B0001040820800400003000000040840008045 +:1012C0000403C0C000000440820340088241A01112 +:1012D000824084008202000200000008000000003A +:1012E00000000000000000000000000003000000FB +:1012F00008A0800000082100000008000000210074 +:101300000000000000000000040080100010040035 +:101310000500000300890041000000008000030078 +:101320000301004040A00801058208A000000384DA +:1013300008008000000000080840000000010800CC +:10134000100811000020000000080000000000004C +:10135000100008820000090100C100000010000018 +:10136000000000000000000000000000000000007D +:101370008200000000000000820000210021000027 +:101380000808000000008200000088000080092199 +:101390000880080200400041031100000000000323 +:1013A000002100004021000020000000000000009B +:1013B0004005000520214000A00840820009820568 +:1013C000000810082002C021000008412000202150 +:1013D0002000034000050021000090800000000074 +:1013E00000000000000000000000000000100000ED +:1013F00000000000000000000000000000000000ED +:1014000000000000000000100000000000000020AC +:101410008400802000900001000084000000000093 +:1014200000000800000002C00000000000000000F2 +:101430000000000000000000000000008003000029 +:101440000000080000010001000000001000210061 +:101450000200034008000300000003000302000034 +:10146000000000000000000000000000000000007C +:1014700000000000000090A000100002009000009A +:10148000000000000000000000000000000090A02C +:10149000001010A0A01008C100A1091002820000D5 +:1014A0000000010020000000208200040084900061 +:1014B00000000000840100000202A1C082041008A4 +:1014C00000A1A1C0C11100C0C090008800A1C088C7 +:1014D00002A001044010828311A00003030402A0B3 +:1014E00000000000000000000000000000000000FC +:1014F000000000000000000000800000000000006C +:1015000000000000000000000000000000000000DB +:10151000008010800080008011C11040C020800534 +:101520000000000021001100000000000000000089 +:1015300000001141211100080002A080210080005C +:10154000000000C18305040300058010050300208E +:101550000020808303900020000284802188C089BD +:10156000002000000000000000000000000000005B +:10157000000000000000000000008000802000004B +:1015800080000000000000000000000000000000DB +:1015900000008000004180210000800000A1008444 +:1015A0000040000011801000030041008000200076 +:1015B0008900C100900003081002C0008000900064 +:1015C0008500C1830000211088800082800080098E +:1015D00000080000830089041100829008000408BC +:1015E0002000410500000000000000000000000095 +:1015F000000000000000000000880000080010004B +:101600001090080000000000000000000000100022 +:101610000000100008000088A0898288108800401F +:101620008804A084000000100100000001001000E8 +:10163000100010000900050003010483100288A0B7 +:101640002000050011A00888890005C0840340001F +:101650000220A0A09084080810019008C18901020E +:10166000010100A001900000000000000000000047 +:10167000000000000000000000008400000000885E +:101680000020900802A00000000000000000000000 +:1016900000000000000008210003080502C19010AE +:1016A0000082A08811C000000000000000000000BF +:1016B00000880000009010A00001010183010000DB +:1016C00004200002000800C0C00100000001040066 +:1016D00002C000A0008511C0849101910103031094 +:1016E000A0110091A082020500000000000000008F +:1016F00000000000000000000000000000000000EA +:1017000000000080800091800000000000000000C8 +:101710000000000000000000840200848085C0906A +:101720000283208300108910000000400010004157 +:10173000001000000000000000800040084005216B +:1017400040110009000400C1008980200921032103 +:101750000000800310C020A021910020080308840D +:10176000A02000824102830480820000000000006B +:1017700000000000000000000000800000000000E9 +:101780000000001080890000000000000000000040 +:101790000000000000000000000000008002800047 +:1017A0008000C10502890400100000000009031038 +:1017B00003001010000400A10000000880808000D9 +:1017C000008000100804108008000884C10585000E +:1017D00080000900800800C0008000004121A100B5 +:1017E000210020202104112121001104000000000B +:1017F0000000000000000000000000004000200089 +:1018000002008400880082401090900000000000D8 +:10181000000000000000001000040000A00008828A +:1018200090100800910089A0210001000000000133 +:1018300000000100000000C000A0001000010840EE +:1018400010024004880001C100A00104010311003E +:1018500011900410840002019021021020000589DB +:1018600004A0A1088300031010000900400100003B +:101870000000000000000000000000000000000068 +:1018800000000000000000820000070000000000CF +:101890000000000000000000000000000000000048 +:1018A000000007000000810000E0070000000000C9 +:1018B000000000E0000000000082000007000000BF +:1018C0000000000000000000000000000000000018 +:1018D000000000E0000050820000000007008800C7 +:1018E0000000000000000000000000E00700000011 +:1018F00000000000000000000000000000000000E8 +:1019000020E0000000000000CF004500FFFF507005 +:1019100000000000000000000000000000000000C7 +:10192000FAFAFAFA00AA30305000F0F0DDBEEEBE4E +:101930000000000000000000000000000000FFFFA9 +:10194000FF28D5D085800000000000000000AA28F4 +:101950003F3F3D310D010000000014BEF5F53C0095 +:101960005151000000000055AAFF3E162A0210BA8D +:1019700000BE0000000000000000000000000000A9 +:10198000000020E0000000000000CFCF4545FFFF31 +:101990005070000000000000000000000000000087 +:1019A0000000FFF9FF6FFFAA30305500FFFFDDDDBB +:1019B000EEEE00000000000000000000000000004B +:1019C000FFFF0000DFDA8F8A000000000000000047 +:1019D000AA283030FDF1CDC10000000014BEA0A047 +:1019E0003C00F3F30B030B0FB4B4B4B47F576B4359 +:1019F00051FB41FF0000000000000000000000005B +:101A0000000000000000000000000000F1F1FFF104 +:101A1000303C3C3C000000000000000000000000E2 +:101A20000000FAFA0000124200FF007DAA145A0CCE +:101A3000BE00BEBE00000000000000000000A0AA22 +:101A4000F0FF505555550000000000C200FAC0C01C +:101A5000000F0080008055005500FF3C0F55A0AFDF +:101A6000A0AF0AC0FAC0C082FFFFFCFCF505FF3E34 +:101A7000FF3E000000000000000000000000000029 +:101A80000000000000000000000000000000F1F174 +:101A9000FFF12028282800000000000000000000BE +:101AA0000000FAFAFAFA0000228200FF00FF551443 +:101AB0000F0CBE00BEBE00000000000000000000D1 +:101AC000A0AAF0FF4041414100000000C2C2FAFA62 +:101AD000C0C0F0FF00A300A0000C00CF003C0F55D9 +:101AE0000303F3F30ACFFACF000000000C0CF50556 +:101AF000FF3FFF3C0000000000000000000000006D +:101B000000000000000000000000000000000000D5 +:101B1000000000380000000000000000000000008D +:101B2000000000000000000105610A0E059D00A0F4 +:101B300005215A09C50D00A1000000610007000938 +:101B400000000061003E000D000000610006000D75 +:101B5000000100610006009D000000610005000515 +:101B6000000080610A0E009D000000610006000D6B +:101B700000050060000F001D00A000000000000034 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA000000000000000000000000000000008C06D +:101BB000C8C0828200F03D310D0100008D1B8D1BDD +:101BC0005440541700000000000000000000000016 +:101BD0000100030200000000000000000055FF2883 +:101BE00000830083000000003FFF3F3C2B2BC3001D +:101BF000FFDFAFDF0000A8FC00000C0000000000C9 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C30000800C80082820FFFFDF1CDC100008D1B9E +:101C40008D1B407C400300000000000000000000ED +:101C5000000000000000FFC30501414000000055E6 +:101C600000000000000000000000000000002B2B1E +:101C7000FF3CFFDAAFDA0000ACFC0000040000001B +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB000000000000000F3F3070F00000000000028 +:101CC00000000000306069960000000055055500D6 +:101CD000C3C3AAAAFF005555000000000000000081 +:101CE0003C3CF70000F000F00A03FA03000000009B +:101CF00028EB30304D4DC30020AA20AA05AF003C90 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D30000000000000000000F3F3070F00000000A7 +:101D400000000000000030606996000000005505AA +:101D50005555F0F000FFC3C30F0F0000000005054C +:101D6000000F0000FF0000F000F00AF3FAF300009B +:101D7000000028EBF3F34D4DFF3C2020202000AA6B +:101D8000003C000020000000100800008820000037 +:101D90001000100490001008880400002000840344 +:101DA00020048800000004002000820020030000BE +:101DB00004000000200088004000100004004000E3 +:101DC000200000001000840020000408C000200053 +:101DD00088002000C00040080400200040004000AF +:101DE000A00504008810880040000408400090000E +:101DF0004000A0000400C000820004008404040825 +:101E0000041020000000000000002100000000007D +:101E10000000210000000000000021000000000080 +:101E20000000000040000000000010004000000022 +:101E30000000400040004100000000004000100091 +:101E400000004000000000000000000005004040CD +:101E500010001000400010020040004041000482C9 +:101E60000000400000004088000000C000000000AA +:101E70004000004000000000400000004000000062 +:101E80000000000041000008004002000040000087 +:101E90000000000000000040000000000000000002 +:101EA0000000000010000004000000040000A0007A +:101EB000020000000004001088000004000400403C +:101EC00000000000000000000010000800100040AA +:101ED0000000004000030004000000000010821118 +:101EE00000000000000000000400004002090000A3 +:101EF000000502000009000400000000000000418D +:101F00000040000000040000054000100008001020 +:101F10000010000040840008000840000004008415 +:101F200000400000000400840008000400040004D5 +:101F30004008000400000010001000100082201073 +:101F400000040004000400080000008400024008AF +:101F500000880504008400000008001000840008C8 +:101F6000000400840084040409842000008204101A +:101F70000010098209100008001040004002001003 +:101F80000010090840100008008800000000000050 +:101F90000040000800000000000000009000002049 +:101FA00000000000C00010088200000000000008CF +:101FB0000002000000080021400800080008000896 +:101FC000000800020000C004002000000000000023 +:101FD000840000000000880000008800004100002C +:101FE0000000000300000005204100218808C021F6 +:101FF0009009001100100021400500088808080819 +:1020000000080220002188050021002100000000B6 +:10201000001000000000000010000000000203009B +:10202000000000000000210000000000000400A0EB +:1020300000A00000410000000000000008104182E4 +:102040004110410000080008040800040000088254 +:102050004184008411A0000000080000041021C089 +:10206000000000900008000000100020008200C066 +:102070000882408240001184000211A003A04100A8 +:1020800004C0080008A00084050200001108000038 +:10209000C000000008020000000800000800100353 +:1020A0000000004008100000000000210000002196 +:1020B0000800100082210421000000000000000040 +:1020C00000091011004000000811900000050000F8 +:1020D000000000090000040200000000002190211F +:1020E000100008000000A0000800C04000000840E8 +:1020F0000041000008200840080000000809000016 +:102100000800000982098200080008000840000059 +:1021100000000000000000000004000000000000BB +:102120000000009000080004000000A00000000073 +:10213000008400820000100800A0040000000000DD +:102140000000000008000084030021000088000057 +:1021500000000000000003C0001000000000051097 +:102160000010000000C0000000A004900800000063 +:102170000008030008000000030000000000000049 +:10218000000000C0000041001100009000000000AD +:10219000000000000000000000000000000000003F +:1021A0000000000000000800000000000000000027 +:1021B0000008000004000000080004400000C00007 +:1021C0000804000000000000C000820800000800B1 +:1021D000000000000000000000008400000000007B +:1021E0004000001100000000080000000000000096 +:1021F000080800000021000000080000000890020C +:1022000000000800000000000000000000000000C6 +:10221000000000000000000000A00000000000001E +:10222000080000000000000000A0000000000504FD +:10223000084004000008000000001000000000003A +:10224000000000A000C0008440840384000000005F +:102250000008112000000500000000000800000830 +:1022600003042040000000A0008400A02084000897 +:102270000008000000100090400800A000A000200E +:10228000400805101100208404A011A0219002C074 +:10229000409003884000001000080000000000008B +:1022A000000000000000000010000000000000001E +:1022B000000000000000000000000000000000100E +:1022C000000000000000000082000000000000008C +:1022D00000040009001000000000000000000005DC +:1022E00008000008000804100000000000000000C2 +:1022F000000000030000004100000010000000008A +:1023000000000000000084000021000000400000E8 +:1023100000110000000000000008000000000000A4 +:102320000000201002000000000000080008000863 +:1023300000080008000000000082050800000000FE +:10234000000410C0009000020590100000020884F4 +:102350000004200000000084000000000088050840 +:1023600041080400029041000800000041400000C4 +:102370000300000000000000000020021100000225 +:1023800008000300080004000000110000001140D4 +:1023900009080000110011401100000000000000B9 :1023A000000000000000000000000000000000002D :1023B000000000000000000000000000000000001D :1023C000000000000000000000000000000000000D @@ -90800,193 +90800,193 @@ :102980000000000000000000000000000000000047 :102990000000000000000000000000000000000037 :1029A0000000000000000000000000000000000027 -:1029B0000000400440052100200020044105401093 -:1029C000040000058440001001044000040240118E -:1029D0008804210920408200000421108282832083 -:1029E00002034010C00503004082000020002000C8 -:1029F00082030003C0000010090441030004050322 -:102A0000C188051082848800C1800400000021056F -:102A100040800490008000022000400200002082DC -:102A200020808484050020000005200000000005AF -:102A3000880002040090C000C0048004400004002C -:102A40000840210200900090000440000090C090D7 -:102A50000040204040004000000000400241202192 -:102A6000044100000008000004A000210000000054 -:102A7000000000000000400040418800024000418A -:102A800004402021A0054005090004048000000046 -:102A900040000040020800020501000000010000A3 -:102AA000204000100540080009002002000000A09E -:102AB0000000000000002080208400C10080000091 -:102AC0000010000000100003080000C100200003F7 -:102AD000000384100803020400040105000400043C -:102AE00000200820000900040008881000100000E1 -:102AF00000800041000900000000084000100110A3 -:102B000000040020018803200800000400040020C5 -:102B100000400000041000800000C08801C040C1D7 -:102B200000400000000000000008008000000000DD -:102B30000000000000030000800480040004000482 -:102B40000408000841020009090803040002000803 -:102B50000040200800848084030802104082041092 -:102B60000084020504C10084008400000088004045 -:102B7000004000404004050000000410A041041182 -:102B80000285008411094004400980840885008280 -:102B90000501000400C00008200200841010084055 -:102BA00080100000000809082082008820100082A0 -:102BB00000400000000004880084400890054008A0 -:102BC0008908A00300204021021040058402000073 -:102BD0008400400800210008010000400008008037 -:102BE0000003000840081003024000000800844071 -:102BF0000020020800050005000800000808202148 -:102C00000008010800802000018040000489058838 -:102C1000202185080090002140A10021001000051E -:102C200000A109000008000400890005000300005D -:102C30000004401000090000000000110800080016 -:102C400010024000098800850090000000C0008448 -:102C5000080009A0000041000840400011000004E5 -:102C600003084108000009100000000000000000F7 -:102C7000410000A1080000080008090000008000D1 -:102C800000820800088408028088200290008020CA -:102C9000A020A100041000100000800221100001FB -:102CA00010000002900000000008410240000000F7 -:102CB00000000082000000000000411000000285BA -:102CC0000040088882048204000482040209020988 -:102CD000404182118241A011091004840010820435 -:102CE0000000082108040009010588029020040062 -:102CF000000000114000000440908200824100006A -:102D000041000910842005404102080000080080AD -:102D10008200091000908280900000002011400580 -:102D20008400840088090100200010204000011167 -:102D3000880000000800400000008200C000080079 -:102D4000040240201102400000C008C002080584AF -:102D50002004004000C040824100040203204104DE -:102D6000409000004104110100000482080021820B -:102D700000820090409000000088000203C0000024 -:102D800000000282820905000810C00141002101F3 -:102D9000080404040884002108040000008408904A -:102DA00010080040004020101088000000110000B2 -:102DB000400000000040004080A0000000000040F3 -:102DC00000080000840882411041000282000000D7 -:102DD0008210A0000821C00808100840040000412B -:102DE000A000904000000008080200000041820896 -:102DF00008000008004082208221000502410000F6 -:102E0000081100000800000308050000202020022F -:102E10000821101000082041080800050021004189 -:102E20000010000001210010000008000003002035 -:102E3000002082400000000000408511A000000337 -:102E40000040001011002088000000004004000035 -:102E50000000000000000000000000900000800062 -:102E6000410000000000000000008200000000009F -:102E700000A0000800000000000100880090000091 -:102E80000500002000000300000000000300800196 -:102E900080010000800009008000000000000000A8 -:102EA000000000000000080000000000000000001A -:102EB0000001000000010000000800010400000003 -:102EC0000000000000002000824100200020C0110E -:102ED00000110011000208410003004102400421DA -:102EE0000240824100404000A02000404005001107 -:102EF00020008400029040400011000800410020A2 -:102F00000800402000030000000420108803400057 -:102F1000040404000410A0030841840302032002F7 -:102F20000021829091210110401004200041402195 -:102F3000822100410020400040000011828401886D -:102F40000000080008000010111020884010030045 -:102F50000010404008C002040410200002840084D5 -:102F60002010080402C0112021200904400008009C -:102F70000340038400044002000000402088000059 -:102F800000100020204008000000000000000000A9 -:102F90000000A0008084889011C00284418241001A -:102FA000800103A002024084100508000000000018 -:102FB000820000C02100030411000800100000027C -:102FC00004020000000000002001010000011000C8 -:102FD000000082A00002000210C000000100A0005A -:102FE0000000000090A08808000800010101100006 -:102FF00000004005892084100889C08805A0401081 -:1030000008A000009001000000000000C0C00020E7 -:1030100000209000C00184018200C0018802049059 -:10302000894082828908A1208404C0101091010483 -:103030008488C04104400088C002A0108810008825 -:1030400020A08208000000000000000010032121E1 -:10305000A0090009008000800080000000004000FE -:10306000000000000400A100008000800041030275 -:10307000002000408904108280848010C0008200FB -:1030800080808000040500040000000000008480AF -:1030900000800000090011410440C000804005800C -:1030A0008280020000800280218080008080404079 -:1030B000089100A000090580040000800000008045 -:1030C000000000000080000000000000000003403D -:1030D00021000410040500008003800000000300AC -:1030E00040002100020000100083008080009080DA -:1030F00021001000888800000041001100038000BA -:1031000080040080800000008000800080020000B9 -:103110000000000580808000A0058500894191A104 -:1031200080118003808980802000830084808083D8 -:103130000000082184801021200089410488A0001B -:1031400020808440802090850000000080000000E6 -:1031500000010100000000C0A0000801A0C0202064 -:1031600000000100000001000001880300A082406F -:10317000090241004000118902900001C0088483C7 -:10318000A00002010208100000200200400082019D -:10319000000000000000A004C00009891040A00049 -:1031A000080590000282409002040900040010A06B -:1031B000088920A02100A104900183002002A1021F -:1031C000C1009140A101A082051040001000040040 -:1031D00000000000C000000001002002008200107A -:1031E0000010000100000001000140000010C009B3 -:1031F0001002000001019000000140100088020050 -:10320000A0C0A00900020440C08900000000000026 -:103210000000000008020088000200C0010840030E -:1032200002910002030882880890021004090040FD -:1032300004100404C008011010028210408200052E -:10324000904003A0C0400041A008A0100000000072 -:1032500000000000000284054103411000000080CE -:1032600000801080002000210004002080400089A0 -:10327000001080840041100803050011809003A114 -:1032800009030090008400048090859000000000F5 -:103290000000000000008000000000000080050029 -:1032A00000080021051085100089801085A0808409 -:1032B000008900850020800902C1C10200808020B1 -:1032C0000084008909A080410003804085A000009F -:1032D000000000000000059110000000040000093B -:1032E0008040808080000082000000000008801084 -:1032F00000C000000000412121804000400821055D -:103300009020900000000003804100000000202178 -:103310002180110003000000800080A10080008057 -:10332000410000A040890580000000208005800049 -:10333000C120840021800000C10204002100881007 -:10334000800500C000000005C1804002020040006E -:1033500000000080000000000010010000000000DC -:10336000000004020840A000000900000000000165 -:10337000100088209010080001A100040104010140 -:10338000A10004A0900090000400821002820400BA -:10339000010100020090000000001000880310826C -:1033A00000080100001000030110A000404090A0A0 -:1033B0008400C1C0A1108540C000C141A010C10857 -:1033C000A1004088888210A00200C0040411C0201F -:1033D00020000000000200840000000000E0000067 -:1033E0005041000000000700000000000000000045 -:1033F00000000000000007000000000000E00000E6 -:10340000000000000000070041000000000007006D -:10341000820A000000000000000000000000000020 -:1034200000006000000000E007000082000000E0F3 -:103430000700000000000000000000820000000003 -:10344000000042000000000007000000000A000029 -:103450000700600000000000000000000000000005 -:103460000000000041414141662666660000000000 -:1034700000000000272727270FFF00F000000000B2 -:1034800000000000F39191F3FFFFFFFF3FFF7FFF7C -:103490000000343C000000000000000000000009B3 -:1034A000000F3030F00000000000E7DBE0D03C66A9 -:1034B0003C660000BD3CF0C0E0E09CFF00630600FD -:1034C000000000FF00F4BDBD242409CB01C30000AF -:1034D000EF004040404000000000000000000000FD -:1034E000000000000000C33CC33C66666664000048 -:1034F0000000000000002727E7270FFF00F0000072 -:10350000000000000000CF8989CF2F2F0F0F00008F -:1035100040000000FFFF000000000000000000006D -:1035200009090F0F3030FF9900000000070B000061 -:10353000F0FFF0000D0CBD3CF0C0E0E09FFF00602C -:103540000600FBFF00FF00249F990600FFFFC3C396 -:103550009999EF0040C340400000000000000000C7 +:1029B00000001000C000200820000400C000200318 +:1029C000000300000000C00000040000000020021E +:1029D00002002000C18010002000210021002004FE +:1029E000200400000800880020800000C00084113E +:1029F000C000000384002000C020200820008905BA +:102A0000400002804000000021104000C105010488 +:102A10000280C08004048400400004000484200874 +:102A200088032004000088800091210088000411A0 +:102A30008400C00900000000410000000000000008 +:102A40000000000410004100000000010000000030 +:102A500000910000C1000804002080004040820076 +:102A6000000080000000830000908004000000004F +:102A700000A00000000004000000000100000008A9 +:102A8000400000C0000400040000200009002004F1 +:102A90002000200409044100400000001000000450 +:102AA000410000408000400040042104200000005C +:102AB0000900040000000004000000000005000000 +:102AC0002040000400800000000300040008000013 +:102AD000000000C00090081000040000004000400A +:102AE00000C000100409018800050885010040406D +:102AF00000400040004100000040000200000003D0 +:102B0000000200100004000800C000000041029014 +:102B10000000001020000000000500000000000080 +:102B2000000483C10408001003000040004000843A +:102B300000000000004100100084000800040204AE +:102B40000884800800001102000400040000000056 +:102B50000084098400100010A00400400008200038 +:102B6000000820050282850808080308800208047E +:102B700080080082408802880000008409010484E3 +:102B80000002048200882008041000050090000064 +:102B900082100908008489100200200800100084B7 +:102BA000090800910840C084000808080208418212 +:102BB00000040004008803082082000200080000CE +:102BC00000000008000500050008000300000000E8 +:102BD0000005000800080009882100000003081013 +:102BE00000210010000800210085000800400002BC +:102BF00000084010004000210011000001090002FF +:102C00000008002100002000000300000010000068 +:102C10000004000800210004000482004080000835 +:102C2000000800000008019020210003022140213B +:102C300088080408000000218402880800000000C1 +:102C40000000000000000000000000000000110073 +:102C500000000000008802000000000000000000EA +:102C60000083000011004000000000040001008803 +:102C70000000000009000000081003000000040824 +:102C80000000030000004100800000000900000077 +:102C90000090000900000000000100414000000217 +:102CA00000040200400000002005000000008088B1 +:102CB0004188000089A00000000000000000000022 +:102CC000000400000000080920090010082100107D +:102CD0000040004020048240000000008204000008 +:102CE00002002000C020000000000008040001C015 +:102CF0000404080483000000A00040040004000055 +:102D000000020002840082002000C0402009080068 +:102D100020000020001108201000080010200800EA +:102D200000000800000008901000C185218502A065 +:102D300084400003081082400800000084028802DA +:102D400000000090050000820084A0A020C00000C8 +:102D50002090000021A080A10084001000082082A3 +:102D600000A080A089A0001011A0051041048008D7 +:102D70001008C000210002000090100000080300AD +:102D800000000890200041C010001182088809004E +:102D900000C080080800090003000204200005A00C +:102DA00010A040080000100000030000202088044C +:102DB00088400885040021A1028302040088114193 +:102DC00000000000000000000400004000000008B7 +:102DD0000000000000080021002004100000101076 +:102DE000000800080020000508004021020200023F +:102DF000A000000590000200000800100040A04064 +:102E0000040000000400040008030480010000081E +:102E1000830400000000000800000011820000058B +:102E20008208000520000040080000000005820024 +:102E3000400001210005A000004000000008000043 +:102E400082211000000000000000000000000000CF +:102E50000000000000000002000000000000000070 +:102E60000000000000000000000000000000000062 +:102E70000001000000000000000000000000000051 +:102E800000000084000080008000000080202000FE +:102E9000000020010000000000000500020000000A +:102EA00000000000000002040001000202400000D7 +:102EB0000040004020040000000000900500400099 +:102EC000400000004090C0004000000000210000D1 +:102ED0000000C002000000080003000820210000DC +:102EE00082000011010400C10900010085000000FA +:102EF0000080040801000108410090020021001038 +:102F00000008000200030000000490000400844157 +:102F1000000410418204A00900000000000000032A +:102F200000040008000000080000000590000021D7 +:102F3000048982210210000089100009014000006C +:102F40000021840010008284000880000008200016 +:102F5000000000C00285008402082000008409A04F +:102F6000001009C0000440000004200020002008D8 +:102F700002000004000020101091088200010200ED +:102F8000111041000801080000000000410888906D +:102F900003080000210000020500000000002000DE +:102FA00020C0000000100082000000040004004067 +:102FB00000880804111008084004080020000201DD +:102FC000209011A000080888000200000000000006 +:102FD0000000000000000100000000000000C00030 +:102FE0000000050000000800840010A00008000890 +:102FF0000220000101018401000109C000208408B1 +:1030000008C0010001019001000000000000000064 +:1030100000010000010000000100000088410011D3 +:103020009004C0100000000000000000000100013A +:103030001000000191C000020040A040891090885B +:1030400000000888000000000800000000000000E8 +:1030500000000000000910114010000200000200F2 +:1030600000000000090008000000000000800000CF +:1030700011008000004041409140004009804080A4 +:103080009100000020201021000500200000000019 +:10309000000000080000111100214005000309A0F4 +:1030A00021A190808020000000001000000040203E +:1030B00000408041000402800080118000008900EF +:1030C00000001000800000000000800000000000F0 +:1030D000000000000000108008000400081100003B +:1030E000000000000000910010008000050000209A +:1030F000000000C00000908091000900C000820024 +:1031000041099008C1000380210041042090000083 +:10311000008000000000000900880000002000027C +:10312000A080034102400088000800000010000059 +:1031300080008000000080000008000000080000FF +:103140008000000480A080004100080008040900FD +:103150000002000000000000010401000100010065 +:1031600000000000000000001000100040000200FD +:103170000201900088A18400091004000200C02010 +:103180000200900008C1094000400100000100A1B8 +:10319000000000080082000000C0000300000001E1 +:1031A000000089902188090290A10001000000011F +:1031B0000000080010000000C000C00104008401ED +:1031C0004000040088004040900000000100010120 +:1031D00000000000000000000000000100000300EB +:1031E0000000000100000000000100850003001045 +:1031F00000C002021004001009A0000001008901B3 +:103200000101A00900020002A090000101010101DA +:103210000101000000000000A000000000004000CC +:1032200001000000C00000009104090000004000FF +:103230000000010000000000000000004084208227 +:103240000240038800C040A0004090C00001000080 +:103250000001000000000000000000000003030562 +:103260000309000900100004000800110010000804 +:103270000011048080000080008010800040112038 +:1032800010041110000900A000910011004040043A +:103290000504100400000300090000000000000005 +:1032A0000300030009008004050910A08910000034 +:1032B00000000000080000030902000300000000F5 +:1032C00080008000C180000000800080038000201A +:1032D00000110020000004001100080902002180F4 +:1032E000401108001109000000000000000000006B +:1032F000008000800010000000000080000020908E +:10330000111110801002004080910080000040A048 +:103310000400410004410000022121040900400092 +:1033200002210211410008008980200011808405DB +:10333000000000000000000000000000008000000D +:103340000008009100800000800800C1000000001B +:1033500000800000000000020000000001000000EA +:10336000014000010100000000000000000000001A +:10337000000000100084000120009008400220009E +:1033800000400110014000018403A0A00440880017 +:10339000010801000000010100000001000100001F +:1033A000010000010001000001000240A040028471 +:1033B000090000000000000000000000008200087A +:1033C0000000000100A000040000C001A0A1A0882E +:1033D0008800000400000000000000000000000061 +:1033E0000000000000E000000000000000E000001D +:1033F00000000000000000000000000000E00000ED +:103400000000410000E007008400000000E0070029 +:10341000000000000000000000410000000000006B +:1034200007000000000000E000000000410000E094 +:103430000000500A000000E0000000000000000052 +:1034400000000000000000E007000082000000E033 +:1034500007008200000000000000000000000000E3 +:10346000000000000000000000000000000000005C +:10347000000000000000000004040F0066002600A9 +:10348000000B00DB00000000000000002211000023 +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000069C3F0 +:1034B00041FF0000000000000000000000000000CC +:1034C0000000000000000000000020044002F0F0B6 +:1034D000FF000000963C000000000000000000001B +:1034E00000000000000000000000000000000000DC +:1034F0000000000000000000000000000F00660057 +:103500002600000B00CB00000000000000000000BF +:103510002211400000000000000000000000000038 +:10352000000000000000000000000000000000009B +:10353000963CBE00009900990000000000000000C9 +:1035400000000000000000000000000010088001E2 +:1035500066663C3C00FF963C000000000000000056 :10356000000000000000000000000000000000005B :10357000000000000000000000000000000000004B :10358000000000000000000000000000000000003B @@ -90995,478 +90995,478 @@ :1035B000000000000000000000000000000000000B :1035C00000000000000000000000000000000000FB :1035D00000000000000000000000000000000000EB -:1035E000000000000000000000003CFF00C3040FCA -:1035F00000000000000000000000660F660F9090C1 -:10360000999900000000C1C23834FFFFFFFF66C374 -:10361000000000C300400000FFFF000000000000A9 -:10362000000000000F000FFF00009999000000004B -:10363000000000046C6C6C6C9791070163C36363BA -:10364000FC98FC64C3C3C2C299991999FCFFF6F6B1 -:103650003F3F6F600F0F000F00007E66000000000C -:1036600000E600E6000000000000000030F330F348 -:10367000010F00000000000000000000663C663CF6 -:103680000000090900000000F9F6F9F66EFF0CFFD2 -:1036900066C3000000C30000363CFFFF00000000CE -:1036A00000000006000000000000990099000000E2 -:1036B000000000000000000FF0FFF7F1676166C630 -:1036C0006666F391F362C3C3C2CB999918990C0F44 -:1036D0000606101C6F600F0F00010F0F0F0F000088 -:1036E000000000FE00FE00610007000D0000000069 -:1036F00000080000000000610006000D00000061ED -:103700000E0E000D000000610006000900000061BF -:10371000000E009D00010061400E000D00000061E0 -:103720000006000D000100000000500000900005A0 -:1037300005610A0F050D00A005610A0F050D00A126 -:10374000A0610006000D0000A0610006000D000051 -:1037500000613E0E000D0005A061003E000D00A0BE -:103760000000000000000000C3FF3CFF07D00D7008 -:10377000000000000000000000000000828200AA9B -:1037800000000000CFF38AA2EAEBFAEB0000FFFB97 -:10379000050000000FF0096000000000E700E7E707 -:1037A00010140000000000000000000000000000F5 -:1037B000000004040F0F0AFF05FA00000000331197 -:1037C000113300F0000F070000002B2BC3FF05870B -:1037D000058700000000E8C3E8FF000000FF986EC6 -:1037E000E23C0000000000000000C3003C00D7D70E -:1037F0007D7D00000000000000000000000003F3D9 -:1038000003F300000000CFF34551D6D7C6D700041C -:10381000FFFF00000000FFFF696900000000E7E70C -:10382000E7000000000000000000000000000000B1 -:103830000000000004040303A00AFAA50000000031 -:10384000FF5555FF00000000070700002B2B003C30 -:10385000AF87AF8700000000E800E83C00B200B28C -:10386000986EE23C0000000000000000F3F351F30A -:10387000CC333FF00000000000000000000000001A -:10388000F5C1F53400000000000000000000C30096 -:10389000B43CE1C30400140000000000000000007C -:1038A0000000000000FFFF0000000000000000001A -:1038B00000000000000000C3003CF0F03CC300002A -:1038C00000000000000000000000F3CFF3CF4545EA -:1038D000404000AF000500000000FF35003500004B -:1038E0000000CCCCCCCC0000000000000000515106 -:1038F000F3F300F0CCF30000000000000000000033 -:1039000000005F435F1C00000000000000005555F0 -:10391000C000E1C3E1C3100014000000000000007B -:1039200000000000000000FFFF0000000000000099 -:10393000000000000000000000C3003CF0F03CC3A9 -:10394000000000000000000000000000300C300CFF -:1039500055055000FFAFFF0500000000000000000B -:10396000000000000000FFFF000000000000000059 -:1039700040080210200020C1888888002000208292 -:103980000000200420008440040000844084008063 -:103990008880888320102009028800840085001018 -:1039A0000080848984100000000000038408010066 -:1039B000000320052000C00840108282820000041D -:1039C000A08082040200890400A0400400080002D4 -:1039D000858400002000000084000200880084002C -:1039E00002002000000000008402000000004000EF -:1039F000020000000485088200201110008200826D -:103A0000004100C0000000C0200180000005080344 -:103A100000200040000200C1000000200021002022 -:103A20000001001000100000000040000000000035 -:103A30002000000000000000000000000011000055 -:103A4000000121100501800040010003000000007A -:103A500000011002000000000200000080000000D1 -:103A600000008000000020000000000100000000B5 -:103A7000000080000180012000840210000000107E -:103A8000000400040000100820000004008000046E -:103A9000002001200088001000000020018000119B -:103AA00001400084032000000141001000020000DA -:103AB0000000004100000000000000040009008038 -:103AC0000089208940000008002000080004004010 -:103AD00002000040004000000040000000400040A4 -:103AE000010000080040000800000000000900007C -:103AF0000000104100000240400800100004008453 -:103B0000000900004140000000104004008404202F -:103B10000010098504090402008800080001080457 -:103B200000040404002104052008048400850089A1 -:103B300000842000008400000208004000C000084B -:103B40002004001080208500008400830084030886 -:103B50000085800400050009008200C100100008F3 -:103B600000110288050400890040000420080008B4 -:103B70000000008400000408000390020021892155 -:103B80009009901088000821900388059021000377 -:103B900088080483081000100010848500050008C0 -:103BA0004040002100030040000800090908000906 -:103BB0000041000800210008000000030008000583 -:103BC0000021008020080021058504109088C00095 -:103BD00020410002000900410009002100210021CC -:103BE00000000008000000414005002100210021E4 -:103BF00000210003002100080021214000841082E0 -:103C00004084008210110008891000080000001094 -:103C1000000800A080202100000000A00004039004 -:103C200000828000088221A0008821A0008288C034 -:103C30000002100000C0038400000000000000002B -:103C4000080000820020830041A0A020800008041A -:103C5000000085101110030008A00000030000C040 -:103C6000000021A000000008410888821100000027 -:103C7000004000100800000800820800080002024E -:103C800040848400C0000400A000C02182008202A1 -:103C90008200040000000920200008800821900212 -:103CA00082090000002121042184A01100000005E8 -:103CB00004080010000082008211C041000084103E -:103CC000000002002000A00040890021830990C06C -:103CD000028410A14089890041001100C1400840C0 -:103CE0000300C040084082000209020200000040B8 -:103CF0000220024003408200020002000200118202 -:103D00009090092011C0040408C010C000900488DD -:103D10000904200200000000208980C00902050477 -:103D20000904419003880800840120040304001062 -:103D30000300214000820010001020880090000045 -:103D400000000082000002840908000411402000E5 -:103D500003020021022000200290029002101001B4 -:103D60000001020011010001030082880000000030 -:103D700003918408800182000000A000A0000000E0 -:103D8000A002080000C14020000340400110914003 -:103D90000803A003A0081005008200050805C04024 -:103DA000A04008100010082010002000828800A108 -:103DB000828882A10800100200080005002100008E -:103DC0000000081000080000084000109120820246 -:103DD000A041100400044004898482054004A0101E -:103DE000840210218200080010000800000000007A -:103DF00000000021002100400000020300038200B7 -:103E0000020400002188090490010000808208005B -:103E100008010008000008000000000403824004BC -:103E200020821140020000A0091140100000080289 -:103E300008200020001002002100080000004000BF -:103E40000000000000100000030802000000200134 -:103E5000000500080001021100010405000080C0F7 -:103E60000000001100100084208403000000088876 -:103E700000A000080000009003C0030080000020A4 -:103E8000000091000800004040100402000084215E -:103E9000C00200082005824004030205201100082A -:103EA00000008204402101080821A11088040008B4 -:103EB000A004200500210040820008080000001135 -:103EC000000202000000100002214003080041002F -:103ED000408000084040042090800800004004001A -:103EE0000040A04004000021002104210020000027 -:103EF00000210121000500210021202100050000F2 -:103F00008200000000050200111000082001094095 -:103F10002002110420000290112002C020C0800065 -:103F200020401190110102000800084008054100DE -:103F300003900302C00000000000080000200820D9 -:103F40001100008220A0000000000000000400001A -:103F500004000220030000002001004000000010C7 -:103F60000000004000000000000000000000000011 -:103F700000000000020000000888002000A00004EB -:103F80000000200020000000404008400988828294 -:103F900010C0A0890220020800A000021084009036 -:103FA0002002A00910859041080102000101820051 -:103FB000910810200084000220A0004000C0008270 -:103FC0000000A000840000000000000000000000CD -:103FD000000011089085408290840001880004014F -:103FE0000000820800088808900202844002000253 -:103FF00002824040C1028284021002024002A002FA -:1040000082080908000800A0020880008000828061 -:10401000800085832110009100090080110000803C -:10402000000000C0A0108411000280418002020341 -:104030000002910800A103040083008000800000BA -:104040000000000080110511004000000000000089 -:10405000000005001182A1210580802000200903B5 -:1040600003110011008041800080000000008000EA -:104070000000808080800880800000804000210057 -:104080000000808090800080000000809080A0412F -:104090008282C1820380840905C04083001100022E -:1040A00000800080C02089118240030400808000CD -:1040B0008000800089201141880441800000008236 -:1040C0008009000020801000030003400000000071 -:1040D00000000000000091108404919010030882F9 -:1040E000218082404085200085C1A084204080003E -:1040F00000820082800080000089800900000000AA -:1041000000880080808080008021800000000210F4 -:10411000020105A105C0A002400005A12105000083 -:104120000000000200A0A1010200A09141010208CC -:1041300010008400088804018805A000A082000007 -:10414000A003A09000000002010000000100000098 -:10415000000000000000000089858410A090A111DB -:10416000210421C0110110C02100080309094141A7 -:1041700004000240200508A00200020210209090D6 -:1041800002000210201010100800100204040202A5 -:1041900082100088008508C18801030808A11088E2 -:1041A000000100000000400002048810001000051B -:1041B00000404188899001C091828800C040C000C1 -:1041C000048800880010C088000000010101000080 -:1041D00000000000000000000000911002A0C08854 -:1041E00003C101008800C100000103080009C008E4 -:1041F0008402024000024002080809090009020581 -:104200000341101100034002080903400008100890 -:10421000101000040084008402C000218541C121E7 -:104220000084000800040010000985092105108998 -:10423000088300808380A0000880A00009004180DE -:1042400003000000000000800000000000040521C1 -:10425000050000000000000000000000908905112A -:104260000341C1C00811210411091105C18500A035 -:1042700080A002040380000000008080C1A00083B1 -:1042800080A0400288100008800300A010800080F9 -:1042900000809180028911A1088009C109842080D1 -:1042A0001180000300008000000000004082A04058 -:1042B0002000A04010212140000000000011000457 -:1042C00000008010000000400080000021830340B7 -:1042D00041000308000000000000000000000491FD -:1042E0001120911183101003050208210810C10448 -:1042F0008490C180C00300000000000080008000A6 -:1043000000C08080800000100000000000008009D4 -:104310008080808080008483400841029008820869 -:1043200040A040C0820010000800A000100089A139 -:1043300002000088090001010088001000000291BD -:1043400010A1021088001000880000028400010201 -:10435000000100000100000000000000000000005B -:10436000840989A0908310010091000301030100DA -:104370000984091184840900200002020202080055 -:104380000800400808080800020002020202C000FB -:104390001000080840841000000000E00700508171 -:1043A000000000000000000A000000000000000003 -:1043B000000000E007000000000000E0070000002F -:1043C000000000E0070041000000000007000000BE -:1043D000000000E0000000000000000000000000FD -:1043E0000000000000E007000041000000E00700BE -:1043F0008221000000000000810600000000000093 -:10440000000000000000000081000000000000002B -:104410000000000000000000000000FF0053AAAAF6 -:104420003000FFFF0F0F55555555D77DD070000058 -:10443000000055C300C30050145000000000FFFFEF -:10444000FFFF0F00030028822882FF14FFBECACAA4 -:104450000AFA000000000000000000000000000058 -:104460000000000000FFF0F003035F5000000000B8 -:1044700000000000BC43BE41A58DA50FAA55A55A5A -:10448000339933CC758AF50AF0A50F5AE31CF30C67 -:10449000339933CCBA45BE41CC33CCCC00000000BC -:1044A000AA283000E020E0200FFF0F00D77D070D85 -:1044B0000000000055C3FFC300001400000000000E -:1044C000832C7CD30F0F030328822882001400BEA4 -:1044D000CACA0AFA00000000000000000000000044 -:1044E000000000000000AAAA3C3CF3F35F5000006B -:1044F00000000000000043BC41BE5A725AF0AA55A9 -:10450000659ACCCCCCCC8A750AF5F0270FD81CE381 -:104510000CF3CCCCCCCC45BA41BECC33CC990028E2 -:10452000002A0400000000FF0F0F103010300400BC -:104530000000000000000CCF0CCFFF0FC3C3000031 -:1045400000003C3C3C3CBFB5BAB00034000000AFBA -:1045500000050F0F0F0F000000000000000000001A -:104560000000000000000000F60000F6EAEA00008B -:104570000000000055D7AAEB50AF51AEF0CC0F337E -:1045800033CCC33C69699969C33C33CCAA9A55655D -:1045900050AF51AE6AAA95550AF50BF46AAA955523 -:1045A0000000000000000000C3C35555003030304B -:1045B000040000000000000000C33CFFF000C3C383 -:1045C000000000003C353C3C1F151A10003800006C -:1045D00000D700D7FF00FF0000000000000000002F -:1045E00000000000000000000000F6F6F6F60050A3 -:1045F000000000000000A5A5A5A5AF50AE51D8CC85 -:10460000273339C6C33C96699669639C33CC96962A -:104610006969AF50AE5155AAAA55F50AF40B55AACF -:10462000AA5580610007009500A100615006000DA9 -:10463000000000614006000D00000561000F000D44 -:1046400000000061000F009D000105614A0F050D8B -:1046500000A0000000080000000000610007000941 -:1046600000000000000000000000000005610A0FCB -:10467000059D00A005610A0F050D10A2406180068E -:10468000002D1002400080000020100240618006D2 -:10469000002D100240618006002D100240008000B5 -:1046A00000201002A0A0F5F500000001FF005F004F -:1046B000CF00CF0000000000E70000E7CF00C300FC -:1046C00000000D00FFAA55000000000000000000DF -:1046D000000000000000000000000000C300C00354 -:1046E000F0A0F0A0000000000000000000007D7DB0 -:1046F000AF05F5F514BEC0C1C0C3000500010CFC38 -:10470000F303C340C34300000000000000000000AA -:104710000000FFF10F0100000000C3C3C3C300008D -:1047200000000000000082D782D700000001550081 -:104730005F00FF005F0000000000E7E7E7E7C3005D -:10474000C3000000FFFFFFAA5500000000000000AA -:104750000000000000000000000000000000C30096 -:10476000C201F0A0F0A00000000000000000000066 -:104770002828AF05A0A014BE0041C0C30505010153 -:104780000000F303C300C3000000000000000000AD -:104790000000000000000000000000000082C000D7 -:1047A000000000000000000000000000FF0A0C0CE8 -:1047B0000F0F3C3C020A020A00000000000000004B -:1047C000FFAA2D2D5F4F0000EBF0140F000000003A -:1047D000BFB5BAB06F006F6F0000000000000000AE -:1047E00030303030FFFFFAFA000000000000000017 -:1047F000000055005500FCFCA0AF55FF0F3C00FF2A -:1048000000D70000000050405040000000000000B1 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000A7E -:104830000C0CFF005555020222220000000000006F -:10484000000055002D2DFFEF0000F0F00F0F0000CD -:1048500000001F151A106F6F6F00000000000000AD -:104860000000003C003C7FFF7AFA000000000000DE -:1048700000000000141400000C0CA0AF55000F3C09 -:1048800000FF00D0000000005040000000000000C9 -:104890000000000000000000000000000000000018 -:1048A00000000000000000000000000040C02000E8 -:1048B00089842090880888820400899089880185ED -:1048C0008585008289A101C0058301802080209018 -:1048D0000082841000090080212020C02184030967 -:1048E00021880490018403100590018800032008AA -:1048F00000100010000488100200000800000400EE -:104900008200820402004008000084008804000045 -:10491000000002084000880320000000040000009E -:10492000200004000000840000008800200400092A -:104930000040080900090420404120400802020507 -:10494000202020020011101040091004041004104F -:10495000000200090383000000082001001110106C -:10496000A00002081102080890042020082000007E -:10497000090000000000000000000000040020000A -:10498000000020000008040000204104000000098D -:104990000000040000000000000000000000000013 -:1049A0000000000000000000000000000000040102 -:1049B00000000003002000000010000400000020A0 -:1049C0000041000400040005004000000000000851 -:1049D0000002000800100004004000000000004039 -:1049E0000009000000050000000000410000000375 -:1049F0000000000400410021004100000000000010 -:104A00000000000400100000000000000000004151 -:104A1000000000040000000000000000000300008F -:104A2000000400000000000000000003000000007F -:104A30000000000800040084008202100010001032 -:104A400000840000000800080010001000840284A8 -:104A500000840011000000080008008502040084A2 -:104A60000010008405081110008800C00088008430 -:104A7000008800000000009000880084000000080A -:104A80000088008400080084058400100010008461 -:104A9000000804C00008000003400084008800846F -:104AA00000A00084008220002010000809820084F9 -:104AB0000084008221100400024100081008112126 -:104AC00020A105880808029010C1000802082108EA -:104AD0000408911140000020C04000210009048515 -:104AE000C0100008000800000000002100080000BD -:104AF000000800210000004100000008000800003C -:104B00009002000500080000820000000008C000BC -:104B100000000000004000214021000220000005AC -:104B200000412008880800210008001020400008EB -:104B3000000500000021888890A0880003108010E4 -:104B4000A0408020A04082008302832003888882C6 -:104B500088108010200200A0008500C10000100015 -:104B600080020084000005C00010008800080810C2 -:104B7000000008000010000000000088210008006C -:104B800020004100000011C0088200C003C00800DE -:104B90000082218803A0000800100000210000000E -:104BA00000A000080300000000000000000000005A -:104BB00000C0000008004100820004000810C0008E -:104BC0000800080910000000080000000000A00014 -:104BD000040084001000A00082000000A004000473 -:104BE000000000000011900040000000044100009F -:104BF00008000000A0400009000008002003020097 -:104C00000200C009000008000400000000000400C9 -:104C100000008200000004000008080000000000FE -:104C2000020008000000A0000404000000000000D2 -:104C30000000A00000028200A000008203C000204B -:104C40000000008491880000008202020010000031 -:104C500009C00000004000000010009011002188F1 -:104C600000C000001140100800A0802011100010AA -:104C70000000210004A0000000000000000000006F -:104C80004000000002000000201002000090000020 -:104C90000900000000400020009000A0400040C03B -:104CA0004000000000000088000000000090052087 -:104CB00000000090000005000020400000A10183DA -:104CC0000190002100C0A1002100004001119000CE -:104CD000009000000021080008001141A00500110B -:104CE00000050810000000000200000000050000A0 -:104CF000001100000000000800000000000000415A -:104D000008008200001000080000A0000000000061 -:104D100010001000820010000008000000030000D6 -:104D200000008221C00800000000C0000000080050 -:104D30000000000000000000002100000000000250 -:104D40000802402020022040048810080210400081 -:104D5000008208400000209021900202C01011043F -:104D600005000502000810400082000200900002C9 -:104D700020400002000021000000000000000000B0 -:104D8000000000000000000000C000C003C020843C -:104D90004004000208082184008841002184008426 -:104DA000000000000000000000C00000051000002E -:104DB00000000900000808000000000000002008B2 -:104DC00000050205880800110021000802000805FE -:104DD00000104000880408404004000582040004DC -:104DE000C000C02008008209084008080004000034 -:104DF0000400C02020030000000300004000000069 -:104E000000000000000020410011C0000000000070 -:104E100090000000040008100002002100000800BB -:104E2000002100000000822100028200C00000007A -:104E300000008205000088008200080900090000C7 -:104E40000000000000002000000000000000000042 -:104E5000000000000004000000000010000000023C -:104E600000002000400000000900000004040008C9 -:104E700000C00000400040C0001000100002000010 -:104E800011000000000000C000000000110411C06B -:104E90000290000208000000000000000040000036 -:104EA0004100000000000000000004000000400479 -:104EB00000002000000040001090090000000000E9 -:104EC0002100030001010100000009850001040127 -:104ED00000828390C1010100000408A000010001CC -:104EE000011110000101C1000000C1830000000099 -:104EF00000844082C001C1000040C0820001C000A7 -:104F0000011104000000000000000000000001008A -:104F10000000000000000000010000C000000000D0 -:104F20000000000000000000000000000000010080 -:104F30000000000000000000010000C000000000B0 -:104F4000000000000000412002210000A0410420D8 -:104F500000020541A00041020404008080000020FE -:104F60000004208280004120C1210000C18340054F -:104F7000004008C1000080028341000084800020BE -:104F800080042083000000000000000000000000FA -:104F9000410000000000000000400400008000000C -:104FA0000000000000000000000000000000000001 -:104FB00041000000000000000040400000800000B0 -:104FC00000000000000000000800040300000000D2 -:104FD00004024141000000040540809000040400E8 -:104FE000830004410041000420004141008500008D -:104FF0002010024100000040C0C180410041030078 -:105000008400854100C180400000000003000000D2 -:10501000008000008000000000008200028000008C -:1050200080000000000000000041000003000000BC -:1050300000800000800000000000900082800000DE -:105040008000000000000000004100000101008815 -:105050000082000101010084000021A1400800013C -:10506000010040008201008320000100000100C017 -:105070000000010101010082008510C104C100018E -:1050800001824100840100C1820000000000010093 -:10509000000000C000002000000000000900900295 -:1050A00000901000820000000000000100000100DC -:1050B000000000C000002000000000000900020401 -:1050C000009010004000000000000001008400007B -:1050D000018501000000000101918800001100011C -:1050E00000830000000000000001000000400000FC -:1050F000C183000000000000009090000004000048 -:10510000C14000000000000100000000000000009D -:105110000000C000000000000000000000000004CB -:10512000000010000000000000000000000000006F -:105130000000C000000000000000000000000004AB -:10514000000000000000000000000000000000005F -:105150000003208241000000004003200000009076 -:1051600000404188000000000004050200000080AB -:105170000041C1830000000000054004000000C1A0 -:105180000041C1C1000000000040094100000000D2 -:10519000000000008000000000000000000000008F -:1051A000008000000000000000000000000000007F -:1051B000000000008000000000000000000000006F -:1051C000008000000000000000000000000000005F -:1051D00002800004008300000400800409410203EF -:1051E00089200041808000002041000080000911DA -:1051F000C18000418085000002040009C1C105038F -:10520000C141008080800000404100008000408457 -:1052100000000000800000C100000000000000004D -:10522000000000418000002000000000000000009D -:1052300000000000800000C100000000000000002D -:10524000000000418000002000000000000000007D -:105250000000050484018883000001001001A0C142 -:105260000184029100A108C000000101000040C0BB -:1052700000C040C08801820400000101A0000205B6 -:1052800000C1402100C040C00000010100004002F8 -:10529000010900000000400000C100000000000003 -:1052A00000000000000540000001000000000000B8 -:1052B000000000000000400000C1000000000000ED -:1052C0000000000000830800000100000000000052 -:1052D0000000000000000000000048420000000044 -:1052E00000004842881200E0070048420000000029 -:1052F000000048420000000000004842000000009A -:1053000000004842811200E007004842000000000F -:1053100000004842000000000000000000420000C1 -:10532000000000004800810000E00000480000008C -:1053300000000000004200000000000000420000E9 -:10534000000000004800810000E00000480000006C -:10535000000000000042000000000000000000000B +:1035E00000000000000000000000000000000000DB +:1035F0000000000000000000000000000000C38187 +:10360000C0800000109000000000000000000901D0 +:103610009981CACAF6F6000400000000000000000C +:10362000000000000000000000000000000000009A +:10363000000000003C3CC3C300FF00FF000000008E +:1036400000000000000000006666666681000CCF86 +:10365000EBEB69EB0000002430363F39000000003E +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:10368000FF99F0900000000000080000000000001A +:10369000090100003ACA06F6000C00000000000014 +:1036A000000000000000000000000000000000001A +:1036B00000000000000060FF9F0000EF000F00000E +:1036C000000000000000000000003C3CF0F0B130C1 +:1036D0000CCF696969EB0000002430303F3F0000E7 +:1036E00000000000000000610006000D0000006105 +:1036F0000005000D000000610006000920000061C7 +:103700000006009D000000610007000D000100613F +:10371000000DC00900080061500F00190000006191 +:103720000006000D0000000005610A0E050D00A056 +:1037300000610007000D000000613003C0150000AB +:1037400000610007000D000000610006000D00058B +:103750000061500F050D0001A061400F004D0000F9 +:1037600000610006000D0000F0D0FFD7000000004F +:103770003C3C0C0C00C000C000000000F0F8F0F869 +:1037800000000000C3C3C3C300000000000000002D +:10379000FBEBF3C3FFFFFF70000000000000EBEB4A +:1037A000A659AA55F00FD827000000E0E0E000007D +:1037B0000000FFFF02FF00000000F3A2FFAA0000CC +:1037C00045CF000000000000000000000000CF45D1 +:1037D000CF450000000000000000000000000000D5 +:1037E000000000000000D707D707F0D0FFD7000087 +:1037F00000003C280C08F0F0F0C0000000000000C1 +:10380000FFFF00000000C383C3830000000000002E +:103810000000FBEBF3C3FF70FF700000000000002E +:10382000E0E8F609FA05F05AD872000000EBEBEB7D +:10383000000000000000FFFF00000000000000008A +:10384000000055FF00000000000000000000000024 +:10385000CF45CF4500000000000000000000000040 +:103860000000000000000000D707D707000000009C +:103870000000000000FDFDFDFD0000000000000054 +:1038800000000000000000005F5F434300000000F4 +:10389000000000000C0CF5F50000AAFE000000007E +:1038A0000F00C0C3EFAEDF9E030C411400000A0AF4 +:1038B0000A0A000000000000004000000000D7FFDE +:1038C000C3FF5F7F5F7F0000000000000000141452 +:1038D0003FFF0000000000000000000000000000AA +:1038E00000000000000000000000FF3CFFBF0000DF +:1038F000000000000000FF00FFFF5D00000000006E +:10390000000000000000000000005F5F4343000073 +:103910000000000000000C0CF5050000FFFF000097 +:1039200000000000C3C3EF6DDF5D00000000000079 +:103930000A0A0A0A0000000000000000000000005F +:1039400000FF00FF0F0F0F0F00000000000000003D +:1039500014143FFF00000000000000000000000001 +:10396000000000000000000000000000C300C301D0 +:1039700021088903200020008802004088004003BD +:103980000000000021001108100020008800010044 +:103990002003400001030102000000002005000395 +:1039A00040100040C00882040104010420000110FE +:1039B000000320008380C1040990852001200111AB +:1039C0000400218000004000400089108500841020 +:1039D0000104210021008480409020000100880221 +:1039E0000280040002002000000084002100890001 +:1039F00000900200200000C080000001008520002F +:103A000080000900000020009000A000A0820000BB +:103A100020000900C00002001085410000004100A4 +:103A2000210080000001200000002009200080000B +:103A30002000000009000220040084402001200131 +:103A40000400800004040000210000004000020087 +:103A50000982040040002082000420048000080045 +:103A600000010004000080000000200000000400AD +:103A7000040000200000000001028200014001005B +:103A80002189014000000089014001C000030000BD +:103A900000009002020900800000010000900085F3 +:103AA0002000008001850008008000020000000066 +:103AB00000840085000000110083008300080003DB +:103AC0000140010301000120880001050000000001 +:103AD0000000080000000000000020402009002035 +:103AE0000120002001200000000400090000002047 +:103AF0000000001000000084008820090000200958 +:103B00002008C0022009000000022009200800044B +:103B1000028400080985898809022084020800407F +:103B2000004000000240204000844040091100880D +:103B3000000805400240000000040940091000048C +:103B4000090004082004200804410040200820083F +:103B5000000800080010000800001108C188800457 +:103B6000051140090401040900840008034000080D +:103B70000411400800890284000501030002C00806 +:103B8000000200000102C0020005000200028808D5 +:103B9000002100218240004000084105000500404E +:103BA0000021000300408805020000058810000283 +:103BB0000040004000882108000002200021000889 +:103BC00000410000000482040020010800100010E1 +:103BD000000002410004A0000000000888039005D6 +:103BE00088080000840488084002000500000040A6 +:103BF000012100219021008090410000020000007E +:103C000000000040410002010001008200A100828A +:103C1000009109000984000040000510C0000082E6 +:103C20000310000021400000000021A005A000C0FA +:103C30000910000000890304C0000000800100405A +:103C400000004100000041A10801218320A00000E4 +:103C50000800030089000084000800100000418271 +:103C6000000000C00800000121028900000041900E +:103C700041910404200000C000200000A041000089 +:103C8000C0000000020010214041100208C01000D6 +:103C9000400440080040C183044085408200050282 +:103CA0001104080008058200C1218200A002211130 +:103CB00040110940088000020800000400000009CB +:103CC000080008000411040421041080110000C140 +:103CD00040100089000000030000101000002000C8 +:103CE000100040042000A141040084820800081054 +:103CF00000100400C0000000048008000011000053 +:103D00004140000008002100110080820885044025 +:103D100000008000800503020204210020820000D0 +:103D200002C14011000000900000020000080009DC +:103D3000C002800040400540001000840088000060 +:103D400000004082800004088001A00100202000C3 +:103D500000041108000400400000000005A100005C +:103D600000000500890021001000800000410020B3 +:103D70000083118300084000080800200090030819 +:103D8000820800091040C005000820000804408097 +:103D900040214088021040020000200883000008F3 +:103DA0000041022100081000A0418408C00840A181 +:103DB00000838280002120218211080000008205FA +:103DC000000000210088840085110808102182006D +:103DD00084040000000010200000000500000840DE +:103DE00083000000C000A00010034041208004C1F7 +:103DF0000280110200A1004000402003A04000000A +:103E0000002000000000000000A0000180880001E8 +:103E10009102000080400000210000008090020418 +:103E2000090241040800110809000000200008A050 +:103E30008840400200021108000021000900030030 +:103E400040000000008800400000088880C000009A +:103E50004100000100900304038500840004100069 +:103E600000000400008400000000000080008020AA +:103E70008020A120088809104004008800000084E8 +:103E800009A0000120101008C000890008080021C6 +:103E90004005824100080011820408400108881191 +:103EA000002100901000080808081000A04000033E +:103EB00082090009A04100104000004000201004C9 +:103EC00084101002000000030000A0104010828047 +:103ED000000208000800A0000000044100210000CA +:103EE0004000A0108841402182030808880000207B +:103EF00000000010840000104003000308000411BB +:103F0000821100089021800000000488400004C154 +:103F10000000029000001110414000C11101020098 +:103F200000A00000004003000000100000002085F9 +:103F3000000000000000008800001100200941007E +:103F40000001008800000000000000000000830560 +:103F50000304020003008000400011A08020080834 +:103F600004000304008420000000000200000000A0 +:103F70000009008804901100000811002000118839 +:103F80008300008800020002100000000200C00050 +:103F900011C184091082100290C003C0208282C027 +:103FA00090C1030302901011C0C00810401002829B +:103FB00010C0010840C0C010C1C085100140A0A1C0 +:103FC00040C0C00291080808000004C000020400BC +:103FD0009082010000000000000000C000210504E4 +:103FE0009004C000000000008200000100010001F8 +:103FF000000003C10010A0A004C0C04001040008DC +:104000002040000000000000A00080000800030025 +:10401000800091C00583859000C10080030040802E +:1040200080000088900891000090808083000080CC +:104030000080A080218080008000828403834091E2 +:10404000001000802000030080800000008020001D +:10405000800080001000000020000000042041A12A +:104060008283000080110003000000020040004035 +:1040700011110002919000A10091000000000800C1 +:1040800000800000000000000000000002030900A2 +:10409000020589000240C0210508C180058009840D +:1040A000032082C1218008842100C1030403880900 +:1040B0000000890909800304A0008808C100A1113B +:1040C0002004839080200020800380000000800076 +:1040D000000280008000002080A100208000C080BD +:1040E0000340801121088000000080008000000053 +:1040F000210003002000A000C1C00302C100000095 +:10410000000380800080000000000000008010009C +:1041100005001000C000900111000302C1A00210B0 +:1041200082A00203C08802C005081004C1009100EB +:104130000900A0C0C100900805000410C19108400A +:1041400011001091C1890801040104100800000049 +:104150000200C001A088C0C0900102C0828508840E +:10416000119004001001890004002000A000C0C0CC +:10417000000001000000000008A00805028911905D +:1041800000004001A0A000A0000000820000000488 +:104190000005040900040001C0024109030203C133 +:1041A000404100C0040804C004050002A105C0C1CC +:1041B000A0C00010004020C004040010908582C000 +:1041C00088100008000402C082824041100221C110 +:1041D000000000910004028489C000000200100069 +:1041E0000100900200410885C120009000900090DD +:1041F00000C00001000003010100908800028488D3 +:10420000A111049100414083000401000082028456 +:104210000110001080C000104041809088909011E3 +:10422000C19000C0000380910883002100418502F5 +:10423000858300090090008404C00005008800A167 +:10424000918500A020030380C08900110084002014 +:10425000419000000090000500A089C0020080008D +:104260000000020080844008C1A0A11000000200EC +:1042700000000080001000000521110083020010E2 +:10428000000888910020008400200089020000803E +:104290008000408000000080000000028082808258 +:1042A00080808040C1040200028009039000082041 +:1042B00020000408C1A08580050082048591A0919A +:1042C00010800305C110C0802000000080028080A3 +:1042D00080008000000000008009800080008000D5 +:1042E0000002808080008403A00285800805001100 +:1042F0000009000000002000050002000402040282 +:10430000802082800311800080090000800000006E +:104310000040000000000088000800880000C0087D +:10432000080840C00401C111C0C09140A000C040B5 +:104330000203C084C001C111101011880301C040E4 +:10434000101083401000C1002082A0A02000C001F6 +:104350002010100408000000A00002A010000400BB +:1043600002009009040402000240A1A002042100FE +:104370000000008800200000000000000100000193 +:104380001005A0C041080201C0000800000088001C +:104390000000000100000000000000E0000000122A +:1043A000000000E000008106000000E000000000C6 +:1043B000000000E000004211000000E00000820068 +:1043C000000000000000000A000000E000004200C1 +:1043D000000000E000000082000000000000070074 +:1043E0000000000000E007004200842100E0070018 +:1043F000000A0081000007008800840000E000003F +:104400000000000000E007000000000000000700BE +:104410000000000000000700000000000000E8EBC2 +:10442000E8EB0000BEF000000AFA0000FA3C0000D1 +:10443000A0AF0000F0F00000C2FE00003CAA0000A7 +:104440000DFD0000AAAA000083BF00000CFC0000C4 +:10445000AAAA0000EBF0000030F30000003C00FDD1 +:10446000D70003004545550500000000FF0FFF3F42 +:10447000FFF0FF300000000000AA0303000000006E +:1044800000000000F1F1A0A023E32FEF00AA00FF3D +:10449000C0C0C04000000000FF000F00000000008E +:1044A000282B282B000014F000000CFC0000503CCE +:1044B0000000ACAC00003CAA0000023E0000F0AAE4 +:1044C000000008F800003CF0000080BC00000AFA80 +:1044D000000030F3000028F00000B2B2000000003D +:1044E0000000D7D70303CFCFFF0F00000000FF006D +:1044F000FF00FFF0FF000000000080AA030300009F +:10450000000000000000E1F5A0A020E02CEC00AAD3 +:10451000003CC0C0C0C000000000FFFF0F0F000043 +:104520000000BF1F00000F5500001EBE00003CF53C +:104530000000BE1E00003C3C0000BF1F0000DF1F4B +:104540000000FDA80000FF000000BF1F00007D3F2D +:104550000000FF0000000F0F0000C3C300FF0000B9 +:104560000055003C20001C3C000000008083A0AFF0 +:104570000B0F0000FA00FF00000000000000080020 +:1045800000000000000000003C0F00550A030AF381 +:1045900000000000F000F00000000000000000003B +:1045A00000000000B01000000F3C00001E140000CE +:1045B0003C050000141E0000550F0000B010000064 +:1045C000D01000005D0800001E1E0000B0100000AA +:1045D00041030000353500007D410000A3A3A0AFDA +:1045E00000000055003C20001C3C00000000C3C33C +:1045F000FFFFEBFF0000C200C300000000000C0042 +:10460000000000000000000000003C0FFF55FA030E +:10461000FAF30000C000F000F0000000000000000D +:10462000000000610007002D120240E38007002D0A +:10463000920240E38007002D920240E38005002DA6 +:10464000920240E380060025920240E38006002D9E +:10465000920240E38001002D920240E38007002D8A +:10466000800200000061200E059D00A805610A0F70 +:10467000050D00A00061003BC00500000061003E88 +:10468000009D000800610005C001000085615A0816 +:10469000050D00A0A061400E000D000105000A08F4 +:1046A000050000A0000000003CAAFFF00000000090 +:1046B000F700FF000070000DFF00F7000000000889 +:1046C000F400140000FFF0F000050045FFE43FE7B0 +:1046D000FAFFF5FF5555AA55000000000000000044 +:1046E000CF00CF450000000000005F5543410000AF +:1046F00000000000000083AFAFAF0000AA8A0000F6 +:1047000000000000000000000030FFC3FFC3A0A0B5 +:104710003C3C028008200000000000000C0000006B +:10472000000000000000000000003CAA00F00000B3 +:104730000000D700D70000F0000FFFFFF7F70000E0 +:1047400000000000000000CFF0C000050055FF1B76 +:104750003FDB9A9F959F0F0FF00F030300000000AF +:104760000000CFCFCF450000000000005FFF43C333 +:104770000000000000000000000000000000FFCF6B +:10478000000000000000000000000030FFC3FFC375 +:10479000A0A03C3C028008200000000000000000B7 +:1047A00000000000000000000000000055555515F5 +:1047B000002C000043414341000000000000F3FBD7 +:1047C000C3C3000000003CFF00000000A0A0BCBC70 +:1047D00000000000CCFF33FFB2304D4D33000033FA +:1047E00000000000000000000000000000000000C9 +:1047F0000000000000000000000055FF50FFFFFF18 +:1048000075759600009600000000000000000F0F74 +:104810000F05FF0FF000000FC300000000000000B4 +:104820000000000000000000000000000000FFFF8A +:10483000FF3F0004000000004341000000000000B2 +:10484000C3CBC3000000A0A00000000000000000D7 +:104850003C3C00000000F5FA5FFA82004D4D330049 +:104860000033000000000000000000000000000015 +:1048700000000000000000000000000050FF50FF9A +:10488000FFFF00009600009600000000F030C0001E +:104890000F0F0F05FF0FF000AAAAC30000000000D1 +:1048A0000000000000000000000000000000840084 +:1048B0000000C01020008405C00084058404880026 +:1048C00088088404C0102000C08900848404840502 +:1048D00084108200200484008800880004042004DE +:1048E0002000000020418800880884820003200006 +:1048F000040520000410200082100403000088003A +:1049000088002000000088008400889003800184D3 +:1049100001008802008000C08484218505C02084B5 +:10492000014021C0C00200C0850404048884000046 +:104930000000000000000000000021000000000056 +:104940000000000000000000400000080009000016 +:104950000000004000840000200040000000000033 +:1049600000000000040000000440040100050000F5 +:1049700005000000000020000900000809002000D8 +:104980000000410004000000410000002008400435 +:104990001003400000010010000900090408C005D0 +:1049A0000403200110050401001110010001002181 +:1049B00000000000000300000000000000000000F4 +:1049C00000000000000000000000000000000000E7 +:1049D00000100000000400000010000000000000B3 +:1049E0000008000000000000000000400008000077 +:1049F000000000050003000000080000000500059D +:104A00000000000000000041000300000000000062 +:104A1000000000000004000400000000008000000E +:104A20000000000000030000001000000040000033 +:104A300000040084001000080008000009080400B9 +:104A4000000800080008008403100008001000049B +:104A50000008008400000008008809880008001091 +:104A60000008008800100088000400100988000475 +:104A700000100000041000080008410402880088AB +:104A800000880088008404080004000800102084C6 +:104A90000084004000080010001000102088000270 +:104AA00004000000000402880382000400880484DB +:104AB00000840084000000090010000300080002C8 +:104AC0000008001000100021004084210000200890 +:104AD0002005404000108810100300409000A010F6 +:104AE000000000008410842184058409884000218E +:104AF000002110000000000200400010000500210D +:104B000000090009000000100003884100000003B4 +:104B10000010000810400821090802881000000059 +:104B20000288204100000210400040800803100865 +:104B3000080004084010008400A000A0004000000D +:104B40000082210200000088001000840508108403 +:104B500000000008A0904108108209A0000809A0E8 +:104B600010C00908090008A04182030221100002B8 +:104B700040840810834000000000008408A010005A +:104B80004100008200820500410221002108090045 +:104B90000000030041008808C100840088208900CB +:104BA000000080208000400080088008802080086D +:104BB00091109100800180C0020090000800080060 +:104BC000000000000000000400000041000000415F +:104BD0000811000008008409000008008400080093 +:104BE0000000040040040800200090004005000080 +:104BF000C000400084000409000088008204820094 +:104C00000000900082090804000000000000C011AC +:104C100020020400A000200090000000020000809C +:104C2000080082000200A0000800088008000010B0 +:104C300000000800080008000880000800002100AB +:104C400000000082050008000000000000000000D5 +:104C50002004002000000010002000001088000048 +:104C6000110200002190000000000000000002007E +:104C700000C000400000000000080000400041A00B +:104C800000C0004000000900000011A00800000062 +:104C90000490000041880008000004100000080093 +:104CA00008100400002000000020801040100200C6 +:104CB000000400000000000000080008A000000040 +:104CC00000000041000000008210820082210000EC +:104CD000000000050000842100000000000000002A +:104CE00000000000000800408400000000001002E6 +:104CF0001021080000080810880000000000820051 +:104D0000080040000000000808030000C000000880 +:104D10008421A040A00000088400000000000900D9 +:104D20000200A1850040000509050000C00801003F +:104D3000010584080000A005018300050083000030 +:104D40000084008802A01000200020021102000050 +:104D50000000080020001102400205880900000040 +:104D60000008028811A000001000080011100000C7 +:104D700003080504000041004100088800C000004D +:104D800000080004000402000000100000000300FE +:104D90002088000003A000400900080000880500EA +:104DA0000200000010040800000208C01010058472 +:104DB000109004900910030000000202000000108F +:104DC0000008000090410002024190210200020010 +:104DD000020000050009824000040041001100109B +:104DE0000021100000050040000000000040080005 +:104DF00000050005000882080021000800100000DE +:104E000000000000000300000000900040110200BC +:104E1000042000000805000088080800C0210400E4 +:104E20000040A000000088008200000890110008E7 +:104E3000040308418211C009A02100401010001095 +:104E40000000000000000000410000000000080019 +:104E50000000008841004100040000020000000042 +:104E6000080400000000000000000500009000049D +:104E700011100000109020840200000000001004B7 +:104E800020C0000000040000008805000000410070 +:104E900020000002050000020000100000000000D9 +:104EA00000400000000000000000000000000000C2 +:104EB00000000000000400000000200000000000CE +:104EC0000004000000000000000000010000840059 +:104ED000000000A00000010000C010C000000000A1 +:104EE00000010000000000000000000000001000B1 +:104EF000000001820100890000881082000000008B +:104F000000010000000000000000000000000000A0 +:104F100000000000010200010000008420100000D9 +:104F200000000001000001000000000084090000F2 +:104F3000A00001400482100102000084041000015E +:104F4000400000058200000000000000004000005A +:104F500000000009030000040200000080000000BF +:104F600000000041000000000000000000100000F0 +:104F70000000001008804111200000008080000027 +:104F800000000041000000000000000000000011CF +:104F90000000000000101000002040000080000011 +:104FA000000000000041000041110921000002C181 +:104FB000000200030209808000100541000000800B +:104FC00000100020409000000000040000000000DD +:104FD000000009000000030009008500000505002D +:104FE00080000000000080030000040000000000BA +:104FF0000000090000000200100010000000100076 +:10500000000000000000804100000000400000009F +:10501000000000000900000008004100100000042A +:10502000088080000000000380404000051100005F +:1050300000000304414100000040200280040009F8 +:105040000300C000C0410041000300000100000057 +:1050500000000000000000000100C00040840000CB +:105060000000040000000000C0000000000000007C +:10507000000000000000000000000500C0840000E7 +:105080000100020000000000C0010000000001005B +:105090000000000000000000000001009000C0843B +:1050A00000010108400000000000C00101000000F4 +:1050B00000880000000001010088000109C008C14B +:1050C0000000010040000301009188010000000081 +:1050D00000000000000000000001040000040000C7 +:1050E000850000000000000000010000000000003A +:1050F00000000000000000000000C00000400000B0 +:10510000A1000000000000000001000000000000FD +:10511000000000000000000000000000100000403F +:105120000000A100000000000000000100000008D5 +:105130000000108200000000000001A09100018822 +:105140000000C084010000000000C0010000000059 +:1051500000000000000000000000000400090080C2 +:1051600000000300000000000000004100000000FB +:105170000000000000000000000000118009008015 +:1051800000001000000000000000004100000000CE +:105190000000000000000000000000000002800984 +:1051A000008000000300000000000000004100003B +:1051B0000080001104C1000000000040052104002F +:1051C0000811001182844100000000050810000051 +:1051D0000000000400830000000400004100000003 +:1051E0000041804000200000000000000000088511 +:1051F0000004800000C10000000900004100000020 +:105200000004800400030000000000000000408350 +:1052100000000040800000C1000000020000C1004A +:10522000000000C18010002000000000000000000D +:1052300008C1089080418002000005000000114173 +:105240000308900000000080000041410000800041 +:10525000054000008401008300000001C00002003E +:105260000000008540010001000000000000000077 +:1052700001080000200000400000000002001000B3 +:105280000000008920000001000000000000000074 +:105290000104000000012000004000000000880020 +:1052A00010000000000502000001000000000000E6 +:1052B00000000105914004011083000000008400FB +:1052C0008441008308A0008888C00000000100001D +:1052D00040A0008500000000000000000000000069 +:1052E00000000000811200E00700480000000000FC +:1052F00000000000000000000000000000000000AE +:1053000000000012881200E00700480000000000C2 +:105310000000000600000000000000000000000087 +:10532000000000000000811200E0070048000000BB +:1053300000000000000A000000000000480000001B +:10534000000000004842841200E007000042000014 +:1053500000000000484200000000000000000000C3 :10536000000000000000000000000000000000003D :10537000000000000000000000000000000000002D :10538000000000000000000000000000000000001D @@ -91482,210 +91482,210 @@ :10542000000000000000000000000000000000007C :10543000000000000000000000000000000000006C :10544000000000000000000000000000000000005C -:1054500000000000000000000000252B00000000FC +:1054500000000000000000000000257B00000000AC :10546000000000000000000000000000000000003C -:105470000000000000000000D4A4757B00000000C4 +:105470000000000000000000DEA4257B000000000A :10548000000000000000000000000000000000001C -:105490000000000000000000DEAE0000747B000091 +:105490000000000000000000DEA40000257B0000EA :1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000DE2E747B0000F1 +:1054B00000000000000000000000DEA4252B00001A :1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000DE2E60DE03403F -:1054E000000000000000023000000000000000008A -:1054F0000C4000000000000002C07B0660DE03409C -:105500000000000000000231E00000000000000088 -:105510000C4000000000000002C07B060000615645 -:1055200003400000000000000231E0000000000025 -:1055300000000C4000000000000002C06A866156B6 -:1055400003400000000000000231E0000000000005 -:1055500000000C4000000000000002C06A868805C0 -:105560000400000588808805200820002010200401 -:10557000040588040005000000100009208588004B -:10558000000304098810040020202080002020054A -:10559000200084000100C002C0102010200200037F -:1055A0004010841004000000010020000080828070 -:1055B00020008800C005001004004080C00020804A -:1055C000201088008800000500082004218420881D -:1055D00021802080008088000000880020902080AA -:1055E000000000000900204000200000040000002E -:1055F000000000080000000005000000002000047A -:1056000000000000000009002082000100100009D5 -:1056100004000000000040000001000080000001C4 -:105620000000090000002000000008000000044005 -:10563000000409000000000003000000004000001A -:105640000010000000000000000000A1800188217F -:10565000000502020002000200A000000000000499 -:1056600000040009000500080009004000100010B7 -:1056700000040000000000400008000000000000DE -:1056800000040005000500000002011000400000B9 -:105690000008000500050000000500000008008566 -:1056A00000050000000500000008000000100008D0 -:1056B00000030180008000000100000900100000CC -:1056C0000000001000000009004100410105000039 -:1056D00000000008000000000100000400000000BD -:1056E0000000000000084104008400080008058450 -:1056F00000840000008400040008001000080084FA -:105700000008000820080088000400830884008244 -:105710004082001000080082000800080004090010 -:1057200000020004000000080008008800080009CA -:1057300000000008042000200010048200080084FB -:10574000000800000208000800840040091020083A -:105750000008000800850008000840000005000857 -:105760002084000800080002000800050000A103D2 -:1057700000028240200800080008002100210005E6 -:10578000412040102010C010000800080008040844 -:105790000041040200A1004000030010002100218C -:1057A0000000208800050000080300050005002116 -:1057B00000210000001004210008008808000040BB -:1057C0000008000010080003002100000005000888 -:1057D00000400008001000210021830200000002A8 -:1057E0000889010500000021008200820000008479 -:1057F00002000082000800A00000218800001100C3 -:1058000000C08801A00080840000000000A0008487 -:10581000C100210080A00010000000000010000066 -:10582000008800008003000000000000000000006D -:105830000084000000000000800800002120008299 -:105840000000000000A000A00000000000002100F7 -:1058500000000000050100820000008402850000B5 -:105860000001410404004184210004000000040000 -:10587000040008000000A000A00082000200000058 -:1058800082000000080082000000200000002000CC -:105890000800C000100004000400020000410000E5 -:1058A00082008200400000800000000082000400AE -:1058B0000000000082108200C040C000C00008004C -:1058C000C000040008000800400020008204080016 -:1058D0009000040082800800200001002000048065 -:1058E000200041000000C000A000000000400004B3 -:1058F000000400000020008400000004008440A098 -:10590000089000400002000000A004900004000481 -:105910000010000000000082000800008000000865 -:10592000000400040400400000040004000004001F -:105930000000050000000000020008A100000000B7 -:105940000000200080A0000000000800042000A04B -:1059500080001000008400040000200020000000EF -:10596000A12000A0A0100000000000842100004140 -:105970008441000000400040004100400040000819 -:105980000000000000410080200000000000C00076 -:105990000811000082210000108004200002002174 -:1059A00000008200000500040002820400210000C3 -:1059B00008000000000008000000100000004088FF -:1059C000A041004104410000000000210000C0008F -:1059D00010000800C0084000000082000000844160 -:1059E0008200842040082008000404030000001006 -:1059F000000000100040090200C021001108000052 -:105A0000111000C0000021840802210000000002E3 -:105A10000000210000842000000003208301080111 -:105A20000000000008000310000100000001000059 -:105A300000000000000000100000000000840000D2 -:105A400080400500030080000000000000A000105E -:105A500000000000000000008000000000002100A5 -:105A600000000900080180008300000180000000A0 -:105A70000000080040210805081000008408000804 -:105A80000241000020100800000000210200000078 -:105A900000419021824110040003200000082002F0 -:105AA0002011001100040010000000080011002067 -:105AB000000800004000C021880008100800840988 -:105AC0002004001000200004200200090000000053 -:105AD0004040842100210005080020001000212101 -:105AE00000080021A003A1000805108400210488FB -:105AF000012000A1000008000000000000000000DC -:105B0000000820000020000000000000000000004D -:105B10000008000000042000000000000000000158 -:105B20000000000000000000000000000000000075 -:105B300003000000000020004100000003000800F6 -:105B40000000000000000000000021A04000000054 -:105B50000000800000000000000002000000800043 -:105B600010002005410000000400000080084100F2 -:105B70000002208421044088000400080210000074 -:105B8000000000000000000000000000000000898C -:105B90009085080800100000000040000000C0C010 -:105BA00090044088402040000000020020000001D6 -:105BB00000010001000000000000000000000000E3 -:105BC0004008C088C1080282C00200900084840896 -:105BD00000000100840000001002000800A004087A -:105BE00041010000C101400010219120000002018C -:105BF000C0028200A0010420830000000080008019 -:105C00000000000000000000000000000000000094 -:105C10000008A004058900A04000090080000000E1 -:105C200003808900808080000500210000000000C2 -:105C3000114103214040004000000000000000002E -:105C4000000000800900418080808000008000000A -:105C500000800000100080000000800000800080B4 -:105C60008080A0410003201000098020A102044090 -:105C7000002185820021051080038000802100849E -:105C80000000000000000000000000000000000014 -:105C9000000000002000400002034000030020003C -:105CA00020008000808400800080410020808509E1 -:105CB00005802000210020041010000000000000DA -:105CC00000000000800000048080008000000011BF -:105CD00080008080080003000500A1000000000093 -:105CE00000000000830084009002C141008009117F -:105CF000A080A0004180210040908308020008A0FD -:105D000020A02000000000000000000000000000B3 -:105D1000000000000040000001000101000001003F -:105D200001000140080010C19082880240000382F7 -:105D3000840040100010000001010100000000007C -:105D40000000000000008800C0000284A0908400D1 -:105D500002018484089041004000C000C12000007E -:105D600000000000000008201000410105010002B1 -:105D7000028582A0080088C001A010A1C1011010F6 -:105D80000088000802100000000000000000000071 -:105D900000000000000002000000000120010000DF -:105DA00000010001000085100010C00403890002FA -:105DB0000004008500A100010000A1010000000016 -:105DC00000000000000000002005001100901005F8 -:105DD000820200409084840800000000000100005E -:105DE000100300100011400800830102854100A14A -:105DF00090410010001001C088900089400301020A -:105E00008000008000808080000000000000000012 -:105E100000000000000000000011100941210008EE -:105E2000001000080021000420040003000584C1C4 -:105E300000090010002100C000082141A108004015 -:105E40000000000000000000000000A00084000529 -:105E500082C00000008080008080000900090005E9 -:105E600011028004000400040080001010A004103F -:105E700000C10008108009804080004141094110A4 -:105E800021918000800000008000000000000000E0 -:105E9000000000000000000000002102051040008A -:105EA00000100080000000000003800080820000DD -:105EB00000000091008200800003080321094000D7 -:105EC000030000000000000000000000802080852A -:105ED0008000800080028005801180000080000426 -:105EE00000000002000000000000000041800404E7 -:105EF00005000810C1000305A100C000A089C085ED -:105F0000908088201000041010020400000000009F -:105F1000000000000000000000000000010000017F -:105F2000000000000010000000000000040082A13A -:105F30008410A000000200090040000101200000C0 -:105F40000000010000000000000000000000C0018F -:105F5000201010820800900020100885080000081A -:105F60000040004000000000000000000000014070 -:105F700000830088000009A088A009029000400862 -:105F800002208590110000000000000000000000C9 -:105F90000000000000000000000000000000000001 -:105FA00000E007000000000000000000000000000A -:105FB0000000070042000000000000000000000098 -:105FC00000E00000000000000000000000000000F1 -:105FD000000000E0070000810000000007008800CA -:105FE000000A0000070000000000000000000000A0 -:105FF000000000E007000012000000E007000000C1 -:10600000000000E007004200D9F900004B6F6F6FFD -:106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 -:106030006FFC60FC4242D2D200000000F1FFF10090 -:106040000000000000000000000000000000000050 -:10605000000037AA060600109900FFF79910F0E734 -:10606000F0E4000000000000000000000000FDC19E -:10607000FF000000000000000000013DFDFDC30F17 -:106080009900663C66F0B920B92099B900004B0927 -:106090006F09000000000000000000000000000088 -:1060A00000000000000000000000000000000000F0 -:1060B00000006F0C600C4242D2DB0000000070FF59 -:1060C0007000000000000000000000000000000060 -:1060D00000000000BA300606F0CC000066F70010A1 -:1060E000F024F0E4000000000000000000000000C8 -:1060F0007C40FF0000000000000100000101FDC124 -:10610000C30F99FF663C66F0FFFF0000000000002F +:1054D00000000000000000000000D4A4612603408A +:1054E0000000000000000230A000000000000000EA +:1054F0000C4000000000000002C0648661260340EA +:105500000000000000000230A000000000000000C9 +:105510000C4000000000000002C06486000061260C +:1055200003400000000000000230A0000000000066 +:1055300000000C4000000000000002C0648660DE35 +:1055400003400000000000000230000000000000E6 +:1055500000000C4000000000000002C07B060200BA +:1055600021002080880000000000048020890300C2 +:105570000580040503008240040082808200408090 +:10558000C00820004080000804008810881000082F +:1055900004000400829000002105001005030003B0 +:1055A00004008800200020400084008404840480DB +:1055B000000204404008200284000400041004009B +:1055C00002002000200004000000840040042008A5 +:1055D0008880048004002005840020000000200052 +:1055E0008000020000020000000000000010001017 +:1055F0008200824020828200000100000002000040 +:105600008008000003A080020000090000000400E0 +:10561000000000000000000200A0029041004020B5 +:105620000000000000840400040100054105090594 +:10563000000400A120010000090100000000008812 +:105640000000050000000000000000880900800143 +:105650000000002000402000098820000400040011 +:10566000040000000000000000080010000000001E +:1056700000800000002001C000C000000002000007 +:105680000002009000000080000000400040004147 +:105690000000010000800108010000000000000877 +:1056A00000800000004000080005000000800000AD +:1056B00000400004004000000090008000C1000095 +:1056C0000041000200000000000000020000000095 +:1056D00000000000000000000000000000000000CA +:1056E0000000000000000010001000100082000800 +:1056F000000000020010000102210041000800111A +:10570000000400C1004000100002000809C10009A7 +:1057100020000004021000022000200820080000E1 +:105720000088000200000009000800100408004082 +:1057300000080009098500090088000200400008EF +:105740000000000800090008001000100009001007 +:10575000000800C000080084008400100000000061 +:1057600000840910008800210303000500110005D2 +:105770000003A0050140A021002101C18800900084 +:1057800000008205880801020802010800100003D9 +:1057900000004102A02140000100090000020000B9 +:1057A00000212010820800000010020000080121E2 +:1057B00000000085A041020800080003A0C00210FC +:1057C0000021C010401000900021000000000041A6 +:1057D000000300000000210000080008040004404D +:1057E000C00800080000000000000200410000881E +:1057F0000000000000824001080821080240410822 +:1058000000000000050800004091009102820000A5 +:1058100041000500C0820300808210084010000093 +:105820000010008800820900000000848000000051 +:10583000400003A041400000A000410041C0000919 +:105840004190008200088002000400000000000077 +:105850000800000800000808C00000842100800043 +:10586000808200A0001000080000000082004000BC +:105870004000A0100000200000000400C180038050 +:10588000048004000200A000084082000800C0005C +:10589000A000C000A10040800800820002000800B3 +:1058A0000000820020000800A180000082000800A3 +:1058B000C000C000A00000000000080000000000C0 +:1058C000040000000000080040008800C000000044 +:1058D0000200100000000000A000400000000800CE +:1058E000A000C000040000000800A0000000008428 +:1058F0000000800000840004C10400048010042023 +:105900008440A02000A0C1000000048441000004E5 +:1059100041200400039020408002418200000300E7 +:1059200005000400000000C000021040000003A0B9 +:10593000210000880900209020A0050041000004FB +:105940000082080402000020000000200800080077 +:105950000000000400000000000000100000000033 +:10596000000000001000000000000000008200099C +:105970000005880508000808840508110841029000 +:10598000A0C0020200050005C0410800C000C00818 +:10599000C00084008240A0000121100841000800DE +:1059A0000810004008400800004100000905000000 +:1059B00008210005820000008200082182000805FD +:1059C00000000100840000000010100200030080AD +:1059D000000000210000A021A00000000000000045 +:1059E000010003000000000888000000820500009C +:1059F00000000000000800400000000000008008D7 +:105A0000802000038001000000100000110000C091 +:105A100009900300000021A1008840008300900845 +:105A200000A0208420A120C100000800000010A0D8 +:105A300000000000000000000000000000002084C2 +:105A4000000200004002050008A000908000000055 +:105A50000304200000020308000000A0000041C071 +:105A600000000410848400C02184000009C00000EC +:105A70000390400804088208000041050890400592 +:105A80000003002000C0054020002004041120096C +:105A90000402080808808402082040114020010008 +:105AA00041092020C08900048200009120100202D8 +:105AB0000011000082000000A000044182080821BB +:105AC0000821C0210000000800030041000000057B +:105AD000002088200421000804004000000002216A +:105AE00040008200000000000000A0000002000250 +:105AF000000020112082002002884000C084110391 +:105B00000000001000010841820100000890040418 +:105B100004000000000100400001030083408000F9 +:105B200002A002000400084000000010004011A084 +:105B30008001000000002000039000842084030204 +:105B40004100030041000300210003004100000068 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000240009008081090C0C023 +:105B800020208420820040C1000802820408000016 +:105B9000000010000000000140054021000001014C +:105BA0000102400100C101A08901A1910000000093 +:105BB00002408882000000000000004088000010C1 +:105BC00000900040000000002041822108C1041123 +:105BD0000000000084000000000000000000000041 +:105BE00000000000000000000010908400829090EF +:105BF00000000000000000008080030080800000A2 +:105C0000A089112111208008A084408880100010F4 +:105C10000000110000000000091004908010002016 +:105C2000404121A1094000081004882004400002DE +:105C3000000005000280000000000000110080004C +:105C400000800500000004000000204140A1001079 +:105C500080210000000000000000000000000000A3 +:105C60000000000000000000000000008000008034 +:105C7000808000000000000000008500C000820855 +:105C800021001180831088912110090002089108D9 +:105C900091211080030020118510400003804020D6 +:105CA000C183030020800500031080000321090048 +:105CB0008983030021204000034000000000800091 +:105CC00000008000000800008020808041008921C1 +:105CD000A083828808000900040041000000000041 +:105CE0000000000004004100041100000000000456 +:105CF0000000808000000000000000000800040098 +:105D0000040189004040030189410320A002900161 +:105D10004082C001004000000000089000200040C8 +:105D20000000054100009002000000090800008208 +:105D300000000405109001410000009000000000E8 +:105D4000824000000884400090404000040440204D +:105D5000820440C0050801000000010001000000AD +:105D600000000000000001000000010100008800A8 +:105D7000840140A0C09000000000000000008804E2 +:105D800000880210881020080002089001839041CA +:105D900000A08284C0C00000000102000088000052 +:105DA000010820200100000201000503000001019C +:105DB0000140410000C1000000012021001100004D +:105DC00001000001820900830102820040400000BE +:105DD00005400141090304830000000000000001A8 +:105DE00000000000000000000001000100000100B0 +:105DF000404000849090020200000000000000007B +:105E00000002009000C100050089208589080988EA +:105E100000850002030480C0000300030020100579 +:105E2000410503212005100903890209A12140042D +:105E3000100404A1030900410805000300210440E7 +:105E4000000004200008809000C0208000008080B6 +:105E50004000C1200485A0A185A000090000001118 +:105E60000341000400090004001000040003004086 +:105E7000110580800000800080800000000000008C +:105E80000000008900800080000980A121A1088015 +:105E90009088A0210240C100020303802000080076 +:105EA00005022109090041001100C1800300210001 +:105EB000054021050305830008004100A0080300F8 +:105EC000044100000000004000000000002000002D +:105ED00000800000A04005C041801011008000003B +:105EE000000000030000000000000000000000406F +:105EF00000000003800400A10080000000000000FA +:105F000000000080004000A00008000040092003BD +:105F100091840211C00541A10482400000400000AC +:105F200001900000012120200000400003C0A000DB +:105F30000108000001000000100001000120110014 +:105F400001900101000084000201000000008201B4 +:105F5000904000020040040283044002410000021D +:105F60000000000000000000000000000000000031 +:105F70000000000000019001C08820C00000000067 +:105F80000000000000100000000000000000000001 +:105F900000E00000420000000000070000120000C6 +:105FA00000000000000000000000000000000000F1 +:105FB00000E000008400000000E00000000000009D +:105FC00000E00000000600000000000000000000EB +:105FD000000000E00000000000000000000082213E +:105FE000000000E0000000000000000000000000D1 +:105FF000000000E000000000000000000700004179 +:106000000000000000000000000000000707070774 +:106010000000FFFBC7CFCFCF99FFD2D2FCFC7E425E +:1060200000000000FFFF0000C33CC33C0FF00FF076 +:1060300000FFFF00C33CC33C0F0F0F0F0F0FF0F02A +:1060400000FF00FF00FFFF00000000FFFF0000FF57 +:10605000FF0000FFFF00C33CC33C0FF02FD00F2B0D +:10606000F0F0000000000000000000000000000050 +:106070000000000000000000000099FF6600CFC093 +:106080003F300000000000000000000000000F0F83 +:106090000F030000BFFB4E4ECFCF0066D2D2C0C070 +:1060A0007E4200000000FFFF0000C33CC33C0FF035 +:1060B0000FF000FFFF00C33CC33CF0F0F0F00F0F07 +:1060C000F0F0FF00FF0000FFFF00000000FFFF00F6 +:1060D00000FFFF0000FFFF00C33CC33C0FF00FF0C8 +:1060E0000F0FF0F0000000000000000000000000B2 +:1060F000000000000000000000000000F0F0F0F0E0 +:106100003F303F30000000000000000000000000B1 :10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F @@ -91693,324 +91693,324 @@ :10615000000000000000000000000000000000003F :10616000000000000000000000000000000000002F :10617000000000000000000000000000000000001F -:106180000000000000000000000000000000663079 -:10619000663F00001F00000000000000000000003B -:1061A00000000000000006FF04FD000000000000E9 -:1061B0000000000000000F0F3C1866666624000017 -:1061C0000000646764670000000000000000000039 -:1061D00000000000000000007EFF66FFFFFF0009D6 -:1061E00030FF606F00FF00FF000000000004242467 -:1061F00024E76666000000000000000010000000B8 -:1062000000FFFFFF909000903C3CFFFF66FF7E7E0A -:10621000000000001F1F1F1F000000000000000002 -:10622000000000000000000000F904FD0000000074 -:1062300000000000000000000000FF996464646436 -:1062400000000000646467670000000000000000B8 -:10625000000000000000000000007FFF6FFF000052 -:106260003C3C00CF606F06F63636000000000000B0 -:1062700024240F0F0F0F000000000000000000009A -:1062800000000000FF00000000903C3C000000996E -:10629000181800003000000000010000000000108D -:1062A000000000000000000000000061000F000975 -:1062B000000000610006000D000085615A0E050D0A -:1062C00000A000610006001D000000610003000D39 -:1062D000000000000000000000000000A061400F6E -:1062E000001D000000000008000000000061003EEA -:1062F000000D000800610006000D000000610009AB -:106300000001000000610E0F009D000100610E0BF6 -:106310000001000500000000000000000000000077 -:106320000000000000000000000000000FAF00A00F -:10633000BF30BF300000000008380000000000003F -:106340000A0500CC0000000045000500550F000FB5 -:1063500000300F3F000000000000000000000000BF -:1063600000007370434000000000000000000000C7 -:106370000000F0F0F3B200000000FCFFFCFF14BED0 -:106380001E1EAAF0C3F0280008080000000000F359 -:1063900055F3C0AAFCAA00000000000000000000A5 -:1063A0000000000000000000000000000000FFAF3F -:1063B000F0A0BF3CBF300000000000300000000033 -:1063C0000000080C00C30000000045450505D70F7C -:1063D000C30F0000FFFF00000000000000000000ED -:1063E000000000007F7C4F4C000000000000000017 -:1063F00000000000F0F030B200000000FCFFFCFFE5 -:106400001E1E1E1EAAF0C3F028000808C3C3C3C383 -:1064100000F3FFF3C0AAFCAA000000000000000087 -:10642000000000000000000000000000000000006C -:1064300008FB00F3AFAFAFA0000000000030000089 -:106440000000000000000000000000003CF0AAFF77 -:106450000A0AFF0000000000000000000000000029 -:10646000000000000000000000000000000000002C -:1064700000000000000000F0FFF00000000000003D -:1064800000003F305F50F03CAA3C000000000000DC -:106490000F002F207F7003032B2B00000000000053 -:1064A00000000000000000000000000000000000EC -:1064B000000008FB0CFFAFAFAFA00000000082B2ED -:1064C00082820000000000000000000000003CF09C -:1064D000AA000F0F3C3C003000000000000000004C -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000B4FFB40000000035 -:10650000000000005F505F50F03CF03C7C503C00CD -:1065100000000000AF00FF50AB03AB2B02030210E2 -:1065200000108400881020058890028000008810E8 -:1065300020000000201088208509001088008803B2 -:106540004005840000002010040020000000C0006E -:1065500020000009880520218200820000038403B6 -:106560002010C000200084032020840002000205C7 -:106570000800840089050000880088004000200889 -:10658000200004102000400020842000000488081F -:106590002000208084000000880000008820000087 -:1065A0000000000000000001000004038010000053 -:1065B000000000000000040000850800000000004A -:1065C000000080000000000000000000000000004B -:1065D0000000000000000000000000000082000039 -:1065E000000004002000000009000001000000007D -:1065F0000000800000000800000000000000800093 -:1066000000000000050100008000000900080001F2 -:10661000200000000002090000000000000000014E -:1066200000000000000000000000000500800000E5 -:10663000000000000000000000000000000000005A +:106180000000000000000000000000000000F730E8 +:10619000F7FFCBDBFFFF000FF0F0F7F60000FFF09A +:1061A00063630F0F666600000000FFFF00000FF042 +:1061B0000FF0666699993CC33CC3F0F0F0F00F0F06 +:1061C000F0F03C3CC3C30FF00FF0C3C3C3C30000E7 +:1061D0003CC33CC30F0FF0F000FFFF006664999BC7 +:1061E000333333336969696900000000000000003F +:1061F000000000000000000000000000000000009F +:10620000002BFF2B393909F90000000000000000C5 +:10621000FFF0FFE0DBDBFFFF00000000F7F6F7F622 +:106220000F00636300FF3C3C000000000000FFFF24 +:106230000FF00FF0666699993CC33CC30F0F0F0F28 +:106240000F0FF0F03C3CC3C30FF00FF03C3C3C3C64 +:1062500000003CC33CC30F0FF0F000FFFF00666678 +:106260009999333333176969694D000000000000C4 +:10627000000000000000000000000000000000001E +:106280000000000FFF0F393906F600000000000083 +:10629000000000610006001D00018061500700053C +:1062A00000001061200E004D000800610006002D66 +:1062B000100240618006002D100240618005002D13 +:1062C0001002406180070021100240418007002D2C +:1062D0001002000040618006002D1002406180071E +:1062E000002D100240618006002D000200610006B2 +:1062F000000D000000610006000D000000610006B6 +:10630000000100000000000800000008000000007C +:106310000000000000000000F0F00F0FEAC0EAC02B +:106320002000A000F0F0000040000000E0EB00EBD7 +:10633000FF0C55041A2A142828550805FF0FC333EB +:1063400050C0A0300300000009000F003C009696EA +:1063500060606009000000000000FF4D00000000C8 +:10636000000000000000005000500000000000008D +:106370000000003C001400000000FF0FC3030000F9 +:106380000000C0C0FCC000000000000000000000D1 +:1063900000000000000000000000F0D00F2F0000FF +:1063A0000000A000A000FFFB000000000000E0EBE8 +:1063B000EBEBFFCF55454080418228AA080AF00048 +:1063C000CC3C55C3AA3C0000000060690F003C00B3 +:1063D000606009096009000000000000FF4DFF4DEA +:1063E000000000000000000000D0005010D00000AD +:1063F00000000000003C001400000000FF0FC30379 +:1064000000000000C0C0FCC0000000000000000050 +:10641000000000000000000000000000000000007C +:106420000000000000000003FF0CFF00FFAF96F625 +:1064300000000000FF03550100000004000C0000F4 +:1064400000FA0500FFFFFFFD3434C1C1F0F0FF008A +:106450000000000071F071F000000000000000007A +:106460000000000000000000000000C3000A00005F +:10647000CFD700000000AA000000000000000000CC +:10648000000000000000E8FCE8FC00000000000044 +:1064900000000000000000000000000000000010EC +:1064A000000000000002000055570000000096A602 +:1064B000FFFF00000000FFF3555100000000000C3A +:1064C000003000F30C00FFFFD7D7003400C1F0F01C +:1064D000FF000000000071FF7100000000000000DC +:1064E000000000000000000000000000C3C30A0A12 +:1064F0000000CFFF00000000F000300000000000AE +:106500000000000000000000E8FCE8FC00000000C3 +:10651000000000000000000000000000100020004B +:106520001088200001000100201008800000880071 +:1065300084038989200002002000880000102000C8 +:10654000C102040284000000000284088410840850 +:1065500000080110040901050080200000038840A4 +:106560000040880084402084000000400004200097 +:1065700020408410044004008800000088002000AF +:10658000040020088410840000000200001020088D +:10659000200520082008040020000400840080005A +:1065A00080008020800002000200000180100000B6 +:1065B0000900090008040000850004000000000034 +:1065C000092002010001000000002001000000007D +:1065D0000000000040000000020000400000000039 +:1065E0000001000100002085804100000001000141 +:1065F0000000000100000001000000000500000094 +:106600000000000000200000000004000000000066 +:10661000000000000000000000000000000000007A +:1066200000000000008000000000000000000000EA +:1066300000000000000000000000000000800000DA :10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A +:1066500000000000000000000000000000000080BA :10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:10668000000000000000000000000080000000008A +:10667000008000000000008000000000000000001A +:10668000000000000000000000000000000000000A :1066900000000000000000000000000000000000FA -:1066A000000000080000000800820084000800408C -:1066B00000080000004000080008000800840008EE -:1066C0000008000800080088000000820088000818 -:1066D0000008000000080088008400080008000886 -:1066E00000080000008400840088008400C000844A -:1066F000000800880000008400000000000800106E -:106700000008000800880000000800840008000855 -:1067100000840008000000080008000000080008CD -:1067200000080008A010000800000010000500107C -:1067300000020040000000210000000200020008EA -:1067400000050000200090A00008002000210008A3 -:106750008241004100000000001000000021000301 -:10676000000000030000000800852021000800024E -:106770000005000000080810080800210040000281 -:10678000000800000010000508210021000300108F -:10679000002100080000000300210041002100004A -:1067A00001410005000000820308000000C000084D -:1067B00000C100A000C10000210800A011000000DD -:1067C0000000000000000010002100004109000846 -:1067D0000082008221A003A0031000A0000000009E -:1067E00000A0210000A000001100082080C00000CF -:1067F000030000000300000080008000080803017F -:10680000000000A000A000004100C1000000110035 -:10681000410041C008C0030000000800000021083A -:106820000300048841000000080008008200040002 -:106830000400080000000000820088000000000042 -:1068400000000000C00000000800080000800000F8 -:10685000080000000200000000000000200000000E -:106860000800040008000000000008000200040006 -:106870000400C00082800800008082004000080000 -:10688000A000C00008000000080082000300820091 -:10689000400090002000008008800000C00004003C -:1068A000840000000080C0008200000000000000A2 -:1068B00000820000800400000000001000000010B2 -:1068C00000A00000410008000090004021000020CE -:1068D00000000000000008040000000008000000A4 -:1068E0000010000000000000000000000000000098 -:1068F00000088000000800200000082000000000C0 -:1069000080000000000000000200000000000800FD -:1069100000000008000080000004000800900082D1 -:106920000000000000C0004000A000000041004145 -:106930000003000000000003000800108241000076 -:1069400082008210820008000000000000000500A4 -:1069500000000002000900020000000000100021F9 -:106960000000000000000000000000000000001017 -:1069700004000002000000100005001000000000EC -:106980000800000000000005820008000003A000CD -:10699000820008080000000000002008000000003D -:1069A0000800004108000003008309008221000064 -:1069B0000002110011000010000000C000000000E3 -:1069C0000000008400C000A02108000000000000BA -:1069D000840000A000000000200000000002000071 -:1069E00000000000000000000008210000A00000DE -:1069F00000008000000100000001210000110000E3 -:106A000000840000000000000300000000000000FF -:106A1000000000000000000008002100800021C0EC -:106A2000008400100084080000C0082004100382C5 -:106A300000100021040400050000200000000010E8 -:106A4000004108000041000800000400004002006E -:106A5000000000000010082000000021004100108C -:106A60000000000002000000000090000000000094 -:106A70000000000040000400200000210008000584 -:106A80000200000000100021001108218205000012 -:106A90000004C021A009000002000008000000213D -:106AA00004009021000040410080001141050009D0 -:106AB00008000000040000000000000000000000CA -:106AC0000001000000000000000000008000000045 -:106AD00000000000000000000001000000000000B5 +:1066A000000000080008000400080000008800083E +:1066B0000000008200080010000000100008002008 +:1066C0000008008800880008000800000010001082 +:1066D000004000000010004000080000001000080A +:1066E0000002000000080000000800100000000880 +:1066F00000000040000000080040004000080000CA +:106700000040000800080010008800000000001091 +:1067100000000084001000100084008800840088BD +:1067200000080088018801840188010000410100FF +:10673000080000000000000000000004000020002D +:10674000000000000040000500410080000000083B +:1067500000000040000000030082824000000800AA +:1067600000000040000000000021A00040000005E3 +:10677000004000210000004000100000000800213F +:1067800000000008000000000000000000210008D8 +:1067900000000000C0000200000000000005000032 +:1067A00000030000881020052005100520000800C7 +:1067B00008088084008200A0000008880089210069 +:1067C000C1A0030803840001080200840040000007 +:1067D000000008000001000008000841000103A0BB +:1067E000008200840009000000000808080080A062 +:1067F000080003010300000000010010000800A0D1 +:106800000000000800C0000000000008008400082C +:10681000000000A00000030880000000000000A0AD +:106820000000000000000000000010800480100044 +:1068300000000000A000C0000000820088000000EE +:106840000000000082000000080082000000080034 +:106850004000C000820009008200A000C0000000CB +:1068600000008200820020080000C000000000003C +:1068700000000000C0000000200004000000000034 +:1068800000000000000000004000000000000000C8 +:1068900000000000000000000000A0000000000058 +:1068A0000000000000000000000000C080108020F8 +:1068B0008000000000000000000000000000000058 +:1068C000000000000800000000000040410000003F +:1068D0000000000000000000400000000000000078 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000C00000000088000000000050 +:106900000000000000000000000000000000000087 +:1069100000000000000000000000000000840000F3 +:10692000200000000000000000000000218821C0BD +:1069300011A02005A0C1C000A080C1000000C000BF +:106940008308000800802000A08082000800082141 +:106950000800A02100400000C000A00000000800C6 +:106960000000084108081000820008000000000331 +:106970000800A080A02100000000840000080000A2 +:106980000000000000000000000000000000820085 +:1069900000000000000000000000000000000000F7 +:1069A0000000000000000800000000000000A00936 +:1069B0008805A009809021400300211008080810D4 +:1069C00000840800210000408000030400A00800AB +:1069D0000800080008000985008408000000008401 +:1069E000110000C0030000008000081003840000B4 +:1069F0000000030000400000080041000000030008 +:106A000000C0210000000000080000000000080095 +:106A100000000000000000000084000000000000F2 +:106A20000000210000000000080000000000080035 +:106A3000100400002184020400090040C002044147 +:106A4000900002040821000490030020401140003F +:106A50000008C000002108410000A04040090009D2 +:106A6000000900210800000000400000C021400093 +:106A70000000002100000010000208000441840012 +:106A800000000008000000040000000000000041B9 +:106A900000000000000000000000080002000008E4 +:106AA000000000400000000000000008000004009A +:106AB000000880010000902180010000000000011A +:106AC0000000000080000000000000000000000046 +:106AD00000000800000000000000000000010800A5 :106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000080000000000016 -:106B00000000004000000001000000000000000044 +:106AF0000000000000000000000041004100000014 +:106B00000000000000000000000000000000000085 :106B10000000000000000000000000000000000075 -:106B2000000000000000000000000002000004005F -:106B300000000000000000000000000040C08410C1 -:106B4000000882080000000000000000040090041B -:106B50000020020240A0C0828208108400000000D1 -:106B60000000000000000000000000000000000025 -:106B700000000000000011A09040029010A040A072 -:106B800000400004100890C00010008404020000BF -:106B900000000000000010C002A0008240020000BF -:106BA00001019100000000000100820000000204C9 -:106BB0009000002082A00000000000000000008083 -:106BC0000000008080800000000000000000000045 -:106BD0008000000080000080058080808000000030 -:106BE00000000000000000000000000000000000A5 -:106BF00000000000000000002080908041000000A4 -:106C00008080000000800080008000800080000004 -:106C10004000210000000000808000000080000093 -:106C2000000920080509001000000800000000000D -:106C30008080800000008000000000000000000054 -:106C40000200100083800900000000000000000026 -:106C500000008082800080004100090984C02180FA -:106C60000000000000000000000000000000000024 -:106C7000000000000000000000008000090389A05F -:106C800091800000001080850000000080208000BE -:106C90000080000000000000000000000000000074 -:106CA00000004080050002004103088021004000F0 -:106CB00002408000002000808000000000000000F2 -:106CC00000000400840005A0000000000000000097 -:106CD000000088001002829008009000100010113F -:106CE000210400000000000000000000000000007F -:106CF00000000000000000000000000040008401CF -:106D0000A01082A020001000A0048800100008003D -:106D10001040880400000000000000000000000097 -:106D200000000000000400000100018401100100C7 -:106D30000000002002000085A0A008000000000064 -:106D400000000000041000A010A0110000000000CE -:106D50000000000000100088000200A08821001040 -:106D60000085100800000000000000000000000086 -:106D70000000000000000000000000000000C04013 -:106D8000008288400110101000080008A002401086 -:106D900000A00240A0080000000000010000080060 -:106DA00000820002C110000000000101010100008A -:106DB0000000000000010008000804A00008000016 -:106DC00000000000000000800080000009000000BA -:106DD0000000000000000000000000000380002010 -:106DE000008400110090000000000000000000007E -:106DF0000000000000000000000000000000000093 -:106E0000808900800011088300000080008000005D -:106E100080000080008080800004002100020004C7 -:106E200080000080000089800005102005201141AD -:106E3000000000100004000200800080800000803C -:106E40000000000000000000808080000080004002 -:106E50000000000000000000000400850080000029 -:106E600000C000210000000300000000000000003E -:106E70000000000000000000000000000000000012 -:106E800000000000000500000041004080C080803C -:106E9000800000400021800000000002000000008F -:106EA0000000000000000000000041402100100030 -:106EB000401040800900110008030000808200009B -:106EC00000000000000000000000C04010404084AE -:106ED0000001000000000000000090008220888473 -:106EE000100000C01010108400000000000000001E -:106EF0000000000000000000000000000000000092 -:106F000000000000881040908800880102000820DE -:106F100008040400A000A00382100000000000008C -:106F200000000000000000000000000001A00000C0 -:106F30000100010100C00000000001000400400346 -:106F4000C0028200000000000000000000000000FD -:106F50000000000000000000000000000000000031 -:106F600007000000000000000700420000000000D1 -:106F70000000000000000000000000000000000011 -:106F8000000000000000000000E00700500A0000C0 -:106F900000000700000000000000000000000000EA -:106FA00000000000000000000000000000120000CF -:106FB00000E0000000000000000000008800000069 -:106FC000000007000000000000000000000000A01A -:106FD00000AFF03CF03C0000000000000000F3F3C4 -:106FE000303000FEFFFE5F005F00BEFFFEFF0000CE -:106FF0000000000000000000000000000000000091 -:1070000000000000000000000A0A080A0000C1C3D6 -:10701000EB41E141555F414B0000A000CFFF4555DA -:10702000000000000000000000000000F0550055C6 +:106B20000000000000000000000000000000000065 +:106B300000000000A1C101028241C00102A00008C2 +:106B400000C00284020000000000020002010001F7 +:106B50009100000100040100C0A0000000024000FC +:106B60001084000000880000C000000001000082C6 +:106B700040C00000000000A000040200000000016E +:106B8000A083000100400440008200A0A082000019 +:106B900000000000000000000000000000000000F5 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000091C141C02085804080801D +:106BC0000080000080008000000009008000800438 +:106BD0001020C005000200800800000000000380B3 +:106BE0008500000000000000050000000000090012 +:106BF0001000800000000000000003008000000082 +:106C000000089004090300208080000000000000BC +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 +:106C300000000000000000000900200985004182DA +:106C4000800091039080A000800000000000800080 +:106C5000410020000904210008000880110005807F +:106C600002000580030903800900030010000200F0 +:106C70000000000000000000000000000000000014 +:106C80000080208004001000021000008010808925 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB0000000000000000000000040820100A0C0B1 +:106CC000010304001000A184C1A00800040010000A +:106CD000C00004100100000001A0010001C000007C +:106CE00082C091000020000101020100C0400004A8 +:106CF00001A0000000820000000400000000C08429 +:106D0000000000C08290A18221008989A000028336 +:106D100084048284000000000000000000000000E5 +:106D20000000000000000000000000000000000063 +:106D3000000000000000000000000000048800C007 +:106D400090040005C00200C00004A0C000020002C0 +:106D50000004000000000083000400C001000041A6 +:106D60004021000000000040400000C00100004140 +:106D7000048402010110000104040001000000006D +:106D80000001C0C000C000A1004184010101054014 +:106D900000A004A0A082000000000000000000008D +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000009CA +:106DC0000503C14000410080000000008080009069 +:106DD000008000C00000000905401110009003036E +:106DE00000890003000503110083004100024103F4 +:106DF0000089800980022089004080A000410000B5 +:106E00000440000300400310030803830021111015 +:106E10008280000000000000000000000000000070 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E4000C109101140002005800400A100808009C4 +:106E50000020000000800000210004001002030454 +:106E6000008000828000800380020000008000100B +:106E7000000080050000000300000000000000008A +:106E800000000000800000000000840010000400EA +:106E900008400000000000000000000000000000AA +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC000000041200582A0C003000400900240049D +:106ED000040000010002004000000100000000A1C9 +:106EE0000001000200030400080102A1C00000022A +:106EF00000000010020000A00001040000888204CD +:106F000000000000000008A0A00000000202C0A0D5 +:106F100000A001008200A0A0A0A08200000000004C +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F400000000000000000E0070050120082000076 +:106F500007000000000000E000000000411200E017 +:106F600020000000000000000000500600000000AB +:106F700000000000000000000000600000000000B1 +:106F8000000000000000000000000000000A4100B6 +:106F900000E0000000000000000000000000000011 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000045004545FF5DFF0C55FF37 +:106FD00045FFFF00200000000000F3F3F3F3000082 +:106FE0000000AA55F00FCCCCCCCCF00FF00F00FF76 +:106FF000FF00F0F00F0FAA55AA55F00FF00FF0F0B8 +:107000000F0F3CC33CC30000F00FF00F00FFFF0068 +:1070100000FFFF00CCCCCCCCDFFF2000CCCC6CCC74 +:107020000000000000000000000000000000000060 :107030000000000000000000000000000000000050 -:10704000EB2B2B2BFFFEFFAA00000000000000002E -:1070500000A000AFAA3CAA3C000000000000000015 -:10706000F3F3B2300040FF405F5F5F5F3CFFFCFF27 -:107070000000000000000000000000000000000010 -:1070800000000000000000000000FAFAF8FA3C3CA2 -:10709000FDFFFF55F5555F5F4B4B5050F0500F0F04 -:1070A0000505000000000000000000000000F0FFE7 -:1070B00000FF0000000000000000000000000000D1 -:1070C00000002B2B2B2B00FE00AA0000000000006C -:1070D0000000F5F503F383BF83BF0000000000004C -:1070E00000003F303F30FFDF2808FE0EFFFFFFFFAC -:1070F000FFFF000000000000000000000000000092 -:107100000000000000000000000000000F0CFFFC69 -:1071100015BF01AB140014FF55FF00BE0F00F0FFB8 -:10712000F3F3F3F30000000000000000F0F08ACF5A +:10704000000000000000000015151515FF55FF0099 +:1070500045CF45CFEB00000000000000BFFFBFFFA1 +:1070600000000000AA55F00FCCCCCCCCF00FF00FF4 +:1070700000FFFF00F0F00F0FAA55AA55F00FF00F18 +:10708000F0F00F0F3CC33CC30000F00FF00F00FF07 +:10709000FF0000FFFF00CCCCCCCC0000FFFFCCCC2D +:1070A000CCCC000000000000000000000000000048 +:1070B00000000000000000000000000000000000D0 +:1070C0000000000000000000000000FF000F14148A +:1070D000141400000000C30000000000000055551B +:1070E0003C3C00000000C3C3C3C3F0F00F0FAAAACA +:1070F0005555F0F00F0FC3C3C3C3AAAA5555F0F0FE +:10710000F0F0F00FF00FAAAAAAAA000000FFFF00FB +:107110005A5A5A5AC33CC33CF0F00F0F10EFFF000D +:10712000CB34C33C00000000000000000000000061 :10713000000000000000000000000000000000004F -:10714000000000003F3F03033C55FF5500000000D6 -:1071500000000000050503F380BC80BC00000000B7 -:10716000000000003F303F30F7D72000F000FFFF65 -:107170007F7D3F3C00000000000000000000000098 -:107180000000000000000000000000000000000CF3 -:10719000F0FC15BF01AB343034FFF5FF00BE00003A -:1071A0004141F351F3F30000000000000000000033 -:1071B000AAFF000000000000000000000000000026 -:1071C0000000000000003F3F03033C553C55000019 -:1071D000000000000000A0615006000D000000004B -:1071E00000000000000000000E0800000000006128 -:1071F000000E000D00000000000000000000000074 -:10720000000000000000000000000000000000007E -:107210000061000F000100000000000800000000F5 -:10722000000050000000000000610006000D00009A -:107230000000500000000000006100050001000097 -:1072400000610006000D000000000E0800000001B3 -:10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:1072700000000000EF40AF00000000000000000030 -:1072800000000000000000000000000000000000FE -:1072900000000000000014FF14FF000000000000C8 -:1072A0000000000000000000000000000000C0001E -:1072B000C3000000000000000000AF87AFAF82BE37 -:1072C000033FC3C3FFFF555F000A0000000000003A -:1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000EF40FF5000000000000010 -:10730000000000000000000000000000000000007D -:1073100000000000000000000000FFFF000000006F -:10732000000000000000000000000000000000005D -:10733000C000000000000000000000002D05050551 -:1073400082BE82BE41C155F5FF5FAA0A000000005F -:10735000000000000000000000000000000000002D -:107360003C103C380000000000000000000000005D -:107370000000000000000000B2F0B2F000000000C9 -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000F000FFFF0000FF -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000007F3F0F -:1073C0005F0F303F353500000000FF05C3C30000EC -:1073D00000000000000000000000000000000000AD -:1073E0000000001000380000000000000000000055 -:1073F00000000000000000000000FFFF000000008F -:10740000000000000000000000000000000000007C -:10741000000000000000000000000000AAAAAAAAC4 -:10742000000000000000000000000000000000005C +:10714000000000000000000000000000000000003F +:1071500014001400EBFF0B0F4100080000000000BA +:10716000FF000F0F000000003C3C3C3CF0F00F0F14 +:10717000AAAA5555F0F00F0F3C3C3C3CAAAA555525 +:107180000F0F0F0FF00FF00F55555555000000FF72 +:10719000FF005A5A5A5AC33CC33CF4F00B0F00FF8D +:1071A000FF00C33CC33C00000000000000000000E2 +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D0005009000000010061003E009D00080061B0 +:1071E0000007000900050061006DDC951002406198 +:1071F0008006002D100240618006002D10024061C3 +:107200008006002D100240618006002D1002000053 +:1072100040618006002D100240618003C0291002E9 +:10722000400080000020000200000000000000007C +:10723000000000000000000000000000000000004E +:10724000000000000010000000000000000000002E +:10725000CF0CEBEBFFC3E8E80000000000000000EB +:1072600000000000C3FFC3FFBABAFFBA000045CF59 +:1072700000000000D7CF000000000000435F430083 +:107280000000000055410F0300000000F0AAFF3C81 +:10729000000000000000BAFAAAEAF300FF00FCF0C8 +:1072A0003C000000000000000000000000000000A2 +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D0000000CF0C28283C00E8E800000000000077 +:1072E000000000000000C3FFC3FFBABAFFBA0000ED +:1072F00055FF00000000D7CFD7CF000000005F5F30 +:107300005F5F00000000FFC3FFC300000000F0AAA1 +:10731000003C000000000000BAF8BAF8A200AA0081 +:10732000FFFFFFFF00000000000000000000000061 +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000003C3CFF00B2B2C3FF0000000090 +:1073600000000AFF000000000000000000C2C2C2CE +:10737000FFFF3C2000000000EB410B01000000007B +:107380003F150F05000000005505D707000000005D +:107390000000000000000000000000000000F7F303 +:1073A000F0F0CF45000000000000000000000000E9 +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000055550F0FB2B2003C000045 +:1073E000000000000AFF000000000000000000FA9A +:1073F000FAFAFFFF3C2000000000FFFF0F0F000023 +:107400000000FF55CF4500000000FF0FD707000028 +:10741000000000000000000000000000000000006C +:10742000F7F3F0F0CF45CF4500000000000000006A :10743000000000000000000000000000000000004C -:1074400075305500303F303F000000000000000064 -:1074500000000000000000000005040800082000F3 -:107460000005040000000009880004100021000548 -:1074700020100400880520100005841084090000F5 -:107480000000200088000009200020008405000082 -:10749000200084000400200000000009000000001B -:1074A000000088102000200000108800200000004C -:1074B000840020008800000020000000000004007C -:1074C000000920002000000004000000200000004F -:1074D00000000405880000002000000000000000FB -:1074E000000000000000000000000000000002009A -:1074F000000000002000200000000000000000004C -:107500000000000000000000000004000000000077 -:10751000000000002000000000000000000000004B -:107520000000000000000400020000002000000035 -:10753000200000000000000000000000000000002B -:10754000000000000000000000000000000000003B -:107550000000000000000008000000000000000023 +:10744000000000000000000000000000000000003C +:107450000000000000000000000000000008000024 +:1074600000000010000020100008000000000008CC +:107470000000000020000000020084000000000066 +:107480000000840002102000000000000000000046 +:1074900000000000040000100000000020000000B8 +:1074A00004000000000000002000000000000000B8 +:1074B000000000000000200004000000200002087E +:1074C000020000000000000020000000000000009A +:1074D0000000000000008400200000000000000008 +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B +:107520000400000000000000000000000000000057 +:107530000000050000000000000000000000000046 +:10754000000020000000000000000000000000001B +:10755000000000000000000000000000000000002B :10756000000000000000000000000000000000001B :10757000000000000000000000000000000000000B :1075800000000000000000000000000000000000FB @@ -92018,39 +92018,39 @@ :1075A00000000000000000000000000000000000DB :1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000008A3 -:1075E0000084002000080008008400080008001043 -:1075F0000008000800100088000800080084000847 -:10760000008400840008008400840008000800084A -:1076100000C0000800080008000800100008000072 -:10762000000800080084008400C0000800C00008B2 -:1076300000840008001000080008004000000088D6 -:1076400000C0000800080010008800880000000842 -:1076500000880010008800080008000000000000FA -:10766000A0000000001000210000000800410021DF -:10767000001000210000002100030010A0410003C1 -:107680000010000500080021000000000021000398 -:107690000010000300100021001000050041000050 -:1076A00000000005000000080008000000000000C5 -:1076B0000000000800100021001000000000002160 -:1076C000001000030000004100080000000000035B -:1076D0000000080800080000000000000000000092 -:1076E0000000008400840084000000A000840000EA -:1076F00000100084000021A00008410000000000EC -:10770000411000100000000000A0000821840010BB -:10771000001000A000080000008200000000080027 -:107720000000000003000000000000C0000841004D -:1077300000A0000000080000000800A000100000E9 -:107740000082000000A041000000000000000000D6 -:1077500000000300000000A003A0000000000808D3 -:107760000000000090000000000002000000000087 -:107770000400000000000000000000000000000005 -:10778000A000000000000000000000000000400019 -:107790000000000002000000000000000400820061 -:1077A0000000000000008200000000000000000057 -:1077B0008200000000000000000000000000000047 -:1077C000080000000400000000004000000000006D -:1077D000400000000000000000000000040008005D +:1075D00000000000000000000000000000000000AB +:1075E0000000000000000000000000080000000093 +:1075F0000000000800000000000000000000000083 +:107600000000001000000000000000080000001052 +:107610000000001000080000000000100000000042 +:107620000088000800100000001000000010000892 +:10763000000000000008001000080000000000002A +:107640000008000800000000008800080000000892 +:1076500000080000001000100010001000000000E2 +:107660000000000000100000000000000000A0006A +:107670000000080008008200000000000003000075 +:1076800000000000A0000000000000000000A008B2 +:107690000000000000000000000082000800000060 +:1076A000000000000000000000218200000800002F +:1076B0000000000000008200A008000000000000A0 +:1076C00000000000000000000000000000000000BA +:1076D00000000000000000000000000000000000AA +:1076E00000000084001000100010000000000000E6 +:1076F0000000000000000000000000C000100308AF +:1077000000A0000800000084008400000084000045 +:10771000000000000084030000A0008400A000001E +:10772000000000000810000003000300000000003B +:1077300000000010000800840000000000000000AD +:107740000000000000000000000000000000000039 +:107750000000000000000000000000000000000029 +:107760000000000000000000000002000000000017 +:107770000200000000000000000000000000000007 +:107780000000200000000000040000000000900045 +:107790000000000000000000820040000400000023 +:1077A0000000000000000000000090000000000049 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 :1077E0000000000000000000000000000000000099 :1077F0000000000000000000000000000000000089 :107800000000000000000000000000000000000078 @@ -92059,32 +92059,32 @@ :107830000000000000000000000000000000000048 :107840000000000000000000000000000000000038 :107850000000000000000000000000000000000028 -:107860000000000000000000000000000005000013 -:107870000000080008000000C008C0000000000070 -:1078800000000000000000000000000000030010E5 -:1078900000000010000000000000000000030000D5 -:1078A000000300100041000000000000000008007C -:1078B00000100000000000000000000000000000B8 -:1078C000000000000000080000000000002100008F -:1078D000000000000000000000030000004100085C -:1078E0000000000000000000000000000000000890 -:1078F0000010000000000000000000A000000000D8 -:1079000000C02100210000C00008000000080000A5 -:107910000800000000080000000000000000000057 -:1079200000000010000000000000000000A008C0DF -:107930000000000800000000000000A0000000009F -:10794000000021080000000000000000000000000E -:1079500000000010008403000808000000840000FC -:107960000084080000000000000800000000004142 -:107970000008000000410003042100000800084046 -:1079800008000000000800000000000000000800DF -:1079900000000000000000080000000000000008D7 -:1079A00000000000000000000000000000000000D7 -:1079B0000021000000000011000000000200000093 -:1079C00000000000000000000000000000000000B7 -:1079D0000000000000000000000000000000001196 -:1079E000000000000000000900000040000000004E -:1079F0000000000000000000000000000000000087 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000300000000F5 +:1078900000080000000000000000000000080000D8 +:1078A00000080000000000000000000800000000C8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E0000000000000000000000000000310000085 +:1078F00000000000090000A02100001000000000AE +:1079000000840010000000100000000000080008C3 +:107910000000000000000000030000000010000054 +:107920000000000000000004000000000000000053 +:107930000000000000080884088400842100000082 +:107940000000000000000000000000000000000037 +:107950000000000000000000000000000000000027 +:107960000000000000000000080000000000000906 +:10797000000088000004000000000000000000007B +:107980000000000000000000820000400000000035 +:107990000000900000000000004000030000000311 +:1079A00000000000000000030000000000000020B4 +:1079B0000000000000000400000000009000000033 +:1079C000004000050020000000080040000000000A +:1079D00000000000000000000000000000000000A7 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000004000000000000000083 :107A00000000000000000000000000000000000076 :107A10000000000000000000000000000000000066 :107A20000000000000000000000000000000000056 @@ -92258,7 +92258,7 @@ :1084A00000000000000000000000000000000000CC :1084B00000000000000000000000000000000000BC :1084C00000000000000000000000000000000000AC -:1084D000000000000000000000000001000000019A +:1084D000000000000000000000008001000000011A :1084E000000000000000000000000000000000008C :1084F000000000000000000000000000000000007C :10850000000000000000000000000000000000006B @@ -92266,7 +92266,7 @@ :10852000000000000000000000000000000000004B :10853000000000000000000000000000000000003B :10854000000000000000000000000000000000002B -:10855000000000000000000000000000208000007B +:10855000000000000000000000000000009000008B :10856000000000000000000000000000000000000B :1085700000000000000000000000000000000000FB :1085800000000000000000000000000000000000EB @@ -92287,15 +92287,15 @@ :1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000002000AA +:1086A00000000000000000000000000000000000CA :1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000000000C0000000000000000000DA +:1086C00000000000000000000000000008000000A2 +:1086D000000000000000000000000000000000009A :1086E000000000000000000000000000000000008A -:1086F000000000000000000020000000000000005A -:108700000000000000000000000000000000000069 -:108710000000000000000000C00000000000000099 -:108720000400000000000000000000000000000045 +:1086F000000000000000000000000000000000007A +:1087000000000000000000000000000088000000E1 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 :108730000000000000000000000000000000000039 :108740000000000000000000000000000000000029 :108750000000000000000000000000000000000019 @@ -92303,31 +92303,31 @@ :1087700000000000000000000000000000000000F9 :1087800000000000000000000000000000000000E9 :1087900000000000000000000000000000000000D9 -:1087A0000000000000000000000041000000000088 -:1087B00000001100000000000000000000000000A8 -:1087C00000000000000000000000000800000000A1 +:1087A0000000000000000000000040000000000089 +:1087B00000001000000000000000000000000000A9 +:1087C00000000000000000000000000000000000A9 :1087D0000000400000000000000000000000000059 -:1087E0000000000000000000000000050000000084 +:1087E0000000000000000000000000000000000089 :1087F0000000000000000000000000000000000079 :108800000000000000000000000000000000000068 -:108810000000000000000000000000001100000047 -:108820000000000000000008000800089008000890 -:1088300000840008C00800080008008200080082C8 -:10884000008400080008000800840008000200847A -:108850000084000880020008000800080008008268 -:108860000000000800080000000800000008008464 -:1088700000080000008200080008000800840002D0 -:1088800000000008000800080008000000820082C4 -:108890000008000000000084000800080008C0086C -:1088A0000084000800840040002100000000000057 -:1088B000000000080005002000210000000000006A -:1088C000000000090000000000030000000000009C -:1088D000000000050000002100000003000000006F -:1088E0000021000800000021000000000005000039 -:1088F000000000210000000000210000000000082E -:10890000000800030005000000210000000000082E -:10891000000000000000000000080000000000004F -:10892000000000000000000000080000000000003F +:108810000000000000000000000000004100000017 +:1088200000000000000000000000000880080008B0 +:108830000084000080080008000000080008000014 +:108840000084000200080000000000820082008412 +:1088500000080000808400080000000800080000F4 +:10886000000000000008000000000000000200847A +:1088700000000004000200080008000000820082DE +:1088800000000000000000820000000000000084E2 +:1088900000000000000800080008000000009082AE +:1088A00000000000000000080000000500020002B7 +:1088B0000002000000000003000000000000002192 +:1088C000000000090000002100000000000800086E +:1088D0000000004000000008000000000000000050 +:1088E0000003000000000021000300000000000061 +:1088F0000000000000000000000300000000000075 +:108900000008000000000000000800000000000057 +:108910000000001100000021000000000000000025 +:10892000002100000000000800000000000000001E :108930000000000000000000000000000000000037 :108940000000000000000000000000000000000027 :108950000000000000000000000000000000000017 @@ -92338,83 +92338,83 @@ :1089A00000000000000000000000000000000000C7 :1089B00000000000000000000000000000000000B7 :1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000000097 +:1089D0000000000000000000000000000000C000D7 :1089E0000000000000000000000000000000000087 :1089F0000000000000000000000000000000000077 -:108A00000000000000000000000000000000000066 +:108A00000000000000000000C000000000000000A6 :108A10000000000000000000000000000000000056 -:108A2000000000000800000000000000000000003E +:108A20000000000000000000000000000000000046 :108A30000000000000000000000000000000000036 :108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 +:108A5000000000000000000000000008000000000E :108A60000000000000000000000000000000000303 :108A700000000000000000000000000000000000F6 :108A800000000000000000000000000000000000E6 :108A900000000000000000000000000000000000D6 :108AA00000000000000000000000000000000000C6 -:108AB00000000000000000000000000000000000B6 -:108AC0000000000000000000000000050000002180 -:108AD000000000000000000000080000000008087E -:108AE0000000000000000000000300000000000083 -:108AF0000000000000000000000800000005000069 -:108B0000000000000000000000000008000000005D -:108B1000000000000000000000080000000000004D +:108AB0000000000000000021000000000000000095 +:108AC0000000000000210000000000000000000085 +:108AD0000000000000000000000000000200000094 +:108AE0000000000000000000000000000000000086 +:108AF000000000000000000000080000000000006E +:108B0000000000000000A0200000000000000000A5 +:108B10000000000000000000000000000000000055 :108B20000000000000000000000000000000000045 :108B30000000000000000000000000000000000035 :108B40000000000000000000000000000000000025 -:108B50000000000000000000000000000000000015 +:108B500000000000000000000000000000400000D5 :108B60000000000000000000000000000000000005 :108B700000000000000000000000000000000000F5 :108B800000000000000000000000000000000000E5 :108B900000000000000000000000000000000000D5 :108BA00000000000000000000000000000000000C5 -:108BB00000000000000000000000000000000000B5 -:108BC0000000000000000000000800000008002174 -:108BD0000000000000000003000000000000000092 -:108BE0000000000000000021C000000000000000A4 +:108BB00000000000000000000000000000000008AD +:108BC0000000000000000000000000000000002184 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 :108BF0000000000000000000000000000000000075 -:108C00000021000000000000000300000000000040 -:108C1000000000000000000000080000000000004C +:108C00000000080800210000000000000000000033 +:108C1000000000000000000800000000000000004C :108C20000000000000000000000000000000000044 :108C30000000000000000000000000000000000034 :108C40000000000000000000000000000000000024 :108C50000000000000000000000000000000000014 :108C60000000000000000000000000000000000004 -:108C700000002100000000000000000000000000D3 +:108C700000000000000000000000000000000000F4 :108C800000000000000000000000000000000000E4 :108C900000000000000000000000000000000000D4 :108CA00000000000000000000000000000000000C4 :108CB00000000000000000000000000000000000B4 :108CC00000000000000000000000000000000000A4 :108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 +:108CE0000100000000000000000000000000000083 +:108CF0000000000000000000000001000000000073 :108D00000000000000000000000000000000000063 :108D10000000000000000000000000000000000053 :108D20000000000000000000000000000000000043 :108D30000000000000000000000000000000000033 :108D40000000000000000000000000000000000023 :108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 -:108D700000000000000000000000000300000000F0 +:108D600000002000000000000000000000000000E3 +:108D700000000000000000000000000010000000E3 :108D800000000000000000000000000000000000E3 :108D900000000000000000000000000000000000D3 :108DA00000000000000000000000000000000000C3 :108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000080008000A3 -:108DD0000000001100000000000000000000000082 +:108DC0000000000000000000000000000000800023 +:108DD000000000080000000000000000000000008B :108DE0000000000000000000000000000000000083 -:108DF0000000000000000000000000000000000073 -:108E000080000000001100000000000000000000D1 -:108E100000000000000000008000000000040000CE +:108DF00000000000000000000000000000008000F3 +:108E000080000009000900000000000000000000D0 +:108E100000000000000080000000000000020000D0 :108E20000000000000000000000000000000000042 :108E30000000000000000000000000000000000032 -:108E4000000000000000000000000000000008001A -:108E50001000000000000000000000000000000002 +:108E40000000000000000000000000000000020020 +:108E50008200000000090000000000000000000087 :108E60000000000000000000000000000000000002 :108E700000000000000000000000000000000000F2 -:108E800090008200000000080000000000000000C8 -:108E90000000000000000000100082000000000937 +:108E80004000200000000000000000000000000082 +:108E900000000000000000000800020000000000C8 :108EA00000000000000000000000000000000000C2 :108EB00000000000000000000000000000000000B2 :108EC00000000000000000000000000000000000A2 @@ -92437,9 +92437,9 @@ :108FD0000000000000000000000008000000000089 :108FE0000000000000000000000000000000000081 :108FF0000000080000000000000000000000000069 -:10900000000000000002000000000000200000003E +:1090000000000000000200400000000020000000FE :109010000000000000000000000000000000000050 -:109020000008000003000000000000000000000035 +:109020000000000008000000000000000000000038 :109030000000000000000000000000000000000030 :109040000000000000000000000000000000000020 :109050000000000000000000000000000000000010 @@ -92447,15 +92447,15 @@ :1090700000000000010000000000000000000000EF :1090800000000000000000000000000000000000E0 :1090900000000000000000000000000000000000D0 -:1090A00000000001000001000000000000000000BE +:1090A00000000000000000000000000000000000C0 :1090B00000000000000000000000000000000000B0 :1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000484200500A00900913 +:1090D0000000000000000000484200900900C84362 :1090E0000000000000000000000000000000000080 -:1090F000004200000A009000000000000000000094 -:1091000000000000000000000000484200500A007B -:1091100090090000000000000000000000000000B6 -:109120000000484200500A009009000000000000C2 +:1090F000004100000900C80000000000000000005E +:1091000000000000000000000000818100900900C4 +:10911000C843000000000000000000000000000044 +:109120000000600600900900C84300000000000035 :10913000000000000000000000000000000000002F :10914000000000000000000000000000000000001F :10915000000000000000000000000000000000000F @@ -92473,21 +92473,21 @@ :1092100000001401940200000000000000000000A3 :109220000000000000000010000014019402000083 :10923000000000000000000000000000000000002E -:10924000000000000000000000000000000002001C -:10925000000000000040020000000000004000404C -:10926000032004C002000000000000000000000015 -:10927000000000000000004003200000004000004B +:10924000000000000000000000000000000000001E +:10925000000000000040020000000000000000408C +:10926000030810C002000000000000000000000021 +:109270000000000000000040030800000040000063 :1092800000000000000000000000000000000000DE -:109290000040032004C002000000000000000000A5 -:1092A00000000000000000000040032004C0020095 +:109290000040030810C002000000000000000000B1 +:1092A00000000000000000000040030810C00200A1 :1092B00000000000000000000000000000000000AE :1092C000020000000000004000000000000000005C :1092D000000000000000000000000000000000008E -:1092E0000802002004004010000000000000000000 -:1092F0000000000000000000080200200000000044 +:1092E000080200081000401000000000000000000C +:1092F000000000000000000008020008000000005C :10930000000000000000000000000000000000005D -:1093100000000802002004004010000000000000CF -:10932000000000000000000000000802002004000F +:1093100000000802000810004010000000000000DB +:10932000000000000000000000000802000810001B :1093300040100000000000000000000000000000DD :10934000000000000000000000000000000000001D :10935000000000000000000000000000000000000D @@ -92522,8 +92522,8 @@ :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B -:109550000000000000000000000000000009000002 -:1095600000000000000900000000000000909A00C8 +:109550000000000000000000000000000008000003 +:1095600000000000000100000000000000909A00D0 :1095700000000000000000000000000000000000EB :1095800000000000001818000000000000000000AB :10959000000000000000000000000000000000903B @@ -92531,13 +92531,13 @@ :1095B00000000000000000909A0000000000000081 :1095C0000000000000000000000000000000000992 :1095D000000000000000000000000000000000008B -:1095E000000000002000000000000000000000005B -:1095F0000000C000000000000000000000000000AB +:1095E000000000000000000000000000000000007B +:1095F000000000000000000000000000000000006B :10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A :10963000000000000000000000000000000000002A -:10964000000000000000040004000400040000000A +:10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A :1096600000000000000000000000000000000000FA :1096700000000000000000000000000000000000EA @@ -92545,7 +92545,7 @@ :1096900000000000000000000000000000000000CA :1096A00000000000000000000000000000000000BA :1096B00000000000000000000000000000000000AA -:1096C000000000000000000080008000800090008A +:1096C000000000000000000000000000000000009A :1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A :1096F000000000000000000000000000000000006A @@ -92555,76 +92555,76 @@ :109730000000000000000000000000000000000029 :109740000000000000000000000000000000000019 :109750000000000000000000000000000000000009 -:10976000000000840000000000000000000000086D -:109770000008000000000008000000000000008455 -:1097800000040000000000000000000000000008CD -:109790000004000000000084000000000000000839 -:1097A00000080000000000000000000000000008A9 -:1097B0000004008400000000000000000000000021 -:1097C0000004000400000000000041000000000848 -:1097D0000008000800000000000000000000000079 -:1097E000000000080003000000000003000000006B -:1097F0000000000000030000000000000000000066 +:1097600000000000000000080000000000000008E9 +:1097700000080000000000000000000000000008D9 +:109780000008000000000088000000000000000445 +:1097900000040000000000000008000000000004B9 +:1097A00000040000000000000000000000000000B5 +:1097B0000004000400840000000000080000000015 +:1097C0000000000000000000000000000000000099 +:1097D0000000000000000000000000040000000085 +:1097E0000000000000000000000000000000000079 +:1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 -:109810000040000000000000000000000000000008 -:109820000000000000000000000000050000000033 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 :109830000000000000000000000000000000000028 -:1098400000000000400800000000000000000000D0 +:1098400000000000000000400000000000000000D8 :109850000000000000000000000000000000000008 :1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:109880000000004000000082000000000000000016 -:1098900000000000040000000000000000000000C4 -:1098A0000000000000000000048200000000000032 -:1098B0000000000000000000000000000040000068 -:1098C0000000000000000002000000000000000096 -:1098D00000000000004010400000000000000000F8 -:1098E0000000000010000000000000000000000068 +:1098700000000040004000820000000000000000E6 +:1098800000000000000000000000000000000000D8 +:1098900000000008000800000000000000000000B8 +:1098A00000000000000000000900000000000000AF +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000400040000000000000000810 +:1098D0000000000000000000000000000000000088 +:1098E0000000000000000040000000000000000038 :1098F0000000000000000000000000000000000068 :109900000000000000000000000000000000000057 -:10991000000000080000000000000000000000003F +:10991000000000000000000000080000000000003F :109920000000000000000000000000000000000037 -:10993000000000000008000000000000000000001F +:109930000000000000000000000000210000000006 :109940000000000000000000000000000000000017 -:1099500000000000000800000000000000000000FF +:1099500000000000000000000000000800000000FF :1099600000000000000000000000000000000000F7 :1099700000000000000000000000000000000000E7 :1099800000000000000000000000000000000000D7 -:1099900000000000000000000000210000000000A6 +:1099900000000000000000000000000000000000C7 :1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 -:1099F00000000000000000000040004000000000E7 -:109A0000000000000000000000000008000000004E -:109A100000000000008000000000000800000000BE +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000400000000016 +:109A100000000000008000000000000000000000C6 :109A20000000000000000000000000000000000036 -:109A3000000000000000000000000000000800001E +:109A30000000000000000000000000000000000026 :109A40000000000000000000000000000000000016 -:109A50000000000084000000000000000000000082 -:109A60000000000000000000000000008400000072 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 :109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000800000000CE +:109A8000000000000008000000000040000000008E :109A90000000000000000040000000000000000086 :109AA00000000000000000000000000000000000B6 -:109AB0000000000000001100000000000000000095 -:109AC0000000000000000000000000000020000076 -:109AD0000000000000000000000000000000000086 +:109AB00000000000000004000000000000000000A2 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000040000000000000082 :109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 -:109B1000000000000000000008000000000000003D -:109B2000000000000080080000000000008000002D -:109B3000000000000000000000000000000000081D +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 :109B900000000000000000000000000000000000C5 -:109BA000000000000000001000000000008800100D -:109BB0002100000000000000000000000000000084 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 @@ -92659,7 +92659,7 @@ :109DB00000000000000000000000000000000000A3 :109DC0000000000000000000000000000000000093 :109DD0000000000000000000000000000000000083 -:109DE000000000000000000800000020000000004B +:109DE0000000000000000000000000000000000073 :109DF0000000000000000000000000000000000063 :109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 @@ -92667,7 +92667,7 @@ :109E30000000000000000000000000000000000022 :109E40000000000000000000000000000000000012 :109E50000000000000000000000000000000000002 -:109E600000000000000000000000200000000000D2 +:109E600000000000000000000000000000000000F2 :109E700000000000000000000000000000000000E2 :109E800000000000000000000000000000000000D2 :109E900000000000000000000000000000000000C2 @@ -92675,7 +92675,7 @@ :109EB00000000000000000000000000000000000A2 :109EC0000000000000000000000000000000000092 :109ED0000000000000000000000000000000000082 -:109EE0000000000000000000200000000000000052 +:109EE0000000000000000000000000000000000072 :109EF0000000000000000000000000000000000062 :109F00000000000000000000000000000000000051 :109F10000000000000000000000000000000000041 @@ -92683,7 +92683,7 @@ :109F30000000000000000000000000000000000021 :109F40000000000000000000000000000000000011 :109F50000000000000000000000000000000000001 -:109F600000000000000000000000000000080000E9 +:109F600000000000000000000000000000000000F1 :109F700000000000000000000000000000000000E1 :109F800000000000000000000000000000000000D1 :109F900000000000000000000000000000000000C1 @@ -92700,7 +92700,7 @@ :10A040000000000000000000000000000000000010 :10A050000000000000000000000000000000000000 :10A0600000000000000000000000000000000000F0 -:10A0700000004000000000000000000000000000A0 +:10A0700000000000000000000000000000000000E0 :10A0800000000000000000000000000000000000D0 :10A0900000000000000000000000000000000000C0 :10A0A00000000000000000000000000000000000B0 @@ -92740,7 +92740,7 @@ :10A2C000000000000000000000000000000000008E :10A2D000000000000000000000000000000000007E :10A2E000000000000000000000000000000000006E -:10A2F000000000000000000005000A08050000A0A2 +:10A2F000000000000000000000000000000000005E :10A30000000000000000000000000000000000004D :10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D @@ -92774,15 +92774,15 @@ :10A4E000000000000000000000000000000000006C :10A4F000000000000000000000000000000000005C :10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000000020001B -:10A52000000000000000200000000000000000000B -:10A530000000000000008800000000000000000093 -:10A5400000000000000000000000000000004000CB -:10A5500000000000000020000000000000000000DB +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B +:10A53000000000000000000000000000000000001B +:10A54000000000000000000000000000000000000B +:10A5500000000002000000000000000000000000F9 :10A5600000000000000000000000000000000000EB -:10A5700020000000000000000000000000000000BB +:10A5700000000000000200000000000000000000D9 :10A5800000000000000000000000000000000000CB -:10A59000200000000000000000000000000000009B +:10A5900000000000000000000000000000000000BB :10A5A00000000000000000000000000000000000AB :10A5B000000000000000000000000000000000009B :10A5C000000000000000000000000000000000008B @@ -92792,90 +92792,90 @@ :10A60000000000000000000000000000000000004A :10A61000000000000000000000000000000000003A :10A62000000000000000000000000000000000002A -:10A630000000000000000000000004000000000016 +:10A63000000000000000000000000000000000001A :10A64000000000000000000000000000000000000A -:10A6500000000000000000000100010000000000F8 +:10A6500000000000000000000000000000000000FA :10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA :10A6800000000000000000000000000000000000CA :10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B000000000080410000000000000000000007E -:10A6C000000000000000000000000000000000008A -:10A6D0000000001000000000000002000200000066 +:10A6A00000000000000000080000000000000000A2 +:10A6B0000000000000080000000000000000000092 +:10A6C0000000000000000082000000000000000008 +:10A6D00000000000008400000000000000000000F6 :10A6E000000000000000000000000000000000006A -:10A6F00000000008000000080000000000000082C8 -:10A7000000020000000000080000000000000082BD -:10A710000000000800000008000000000000000029 +:10A6F00000000000000000080084000000840082C8 +:10A700000000000000080000000000000000000041 +:10A710000000000000000004000000000000000431 :10A720000000000000000000000000000000000029 -:10A7300000000000000000002000000000000000F9 +:10A730000000000000009000400000000000000049 :10A740000000000000000000000000000000000009 :10A7500000000000000000000000000000000000F9 -:10A7600000000000000000002000000000000000C9 -:10A7700000000000000000000000000000000000D9 -:10A780009000000000000000000000000000000039 +:10A7600000000000000000020021000000000000C6 +:10A7700000000000000000000005000000000000D4 +:10A780000000880000000000000000020000000837 :10A7900000000000000000000000000000000000B9 :10A7A00000000000000000000000000000000000A9 -:10A7B0000300000000000000000000000000000096 +:10A7B0000000000000000000000000000000000099 :10A7C0000000000000000000000000000000000089 :10A7D0000000000000000000000000000000000079 :10A7E0000000000000000000000000000000000069 :10A7F0000000000000000000000000000000000059 -:10A80000000008004000000040004002000000007E -:10A810000000000000000000000003000300000032 -:10A820000300000000000000000000000000000025 -:10A830000000820000000000000000000000000096 -:10A840000000080000000000000008000000C00038 -:10A8500000008200000000000000000000400040F6 -:10A8600000200020000000000000000000000000A8 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 :10A8700000000000000000000000000000000000D8 -:10A88000000000000000000000000000A000100018 -:10A8900000001000000000000000000000000000A8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 :10A8A00000000000000000000000000000000000A8 :10A8B0000000000000000000000000000000000098 :10A8C0000000000000000000000000000000000088 -:10A8D000000000000000000000000000000800016F -:10A8E000000100010009000000080000000000084D -:10A8F0000000000000000008000000000000000848 -:10A900000000000000000000000000000000210026 -:10A91000000000000000000000000000000000082F -:10A920000000000000000000000000000000000027 +:10A8D0000000000000000000000000A000080008C8 +:10A8E0000000000800080000000000000000000058 +:10A8F0000000000000000000000000000000000850 +:10A9000000A0000000A00000000000000000000007 +:10A91000000000080000000000000000000000002F +:10A920000008000000A0000000000000000000007F :10A930000000000000000000000000000000000017 -:10A94000000000000000A00000000000C0000000A7 -:10A95000000000000000000000000000080082006D -:10A9600000000000000000000000000800000000DF +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 :10A9700000000000000000000000000000000000D7 :10A9800000000000000000000000000000000000C7 :10A9900000000000000000000000000000000000B7 :10A9A00000000000000000000000000000000000A7 :10A9B0000000000000000000000000000000000097 :10A9C0000000000000000000000000000000000087 -:10A9D00000000000000000000000000000008000F7 +:10A9D0000000000000000000000000000000000077 :10A9E0000000000000000000000000000000000067 -:10A9F00000000090000000000000000000000000C7 +:10A9F0000000400000000000000000000000000017 :10AA00000000000000000000000000000000000046 :10AA10000000000000000000000000000000000036 :10AA20000000000000000000000000000000000026 :10AA30000000000000000000000000000000000016 -:10AA400000000800000000000000000000000000FE -:10AA500000000000000000000000080000000000EE -:10AA60000800A00001000100000000000000000834 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 :10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000008000000BE +:10AA800000000000000000000000000000080000BE :10AA900000000000000000000000000000000000B6 :10AAA00000000000000000000000000000000000A6 :10AAB0000000000000000000000000000000000096 :10AAC0000000000000000000000000000000000086 :10AAD0000000000000000000000000000000000076 -:10AAE000000880000000040004000088000000004E -:10AAF0000000000000000000000000000000000056 -:10AB00000000000800000000000000000000080035 -:10AB10000000000000000000000000000000000035 -:10AB2000000000080000000000000000000000001D +:10AAE0000000000000A000000000000000000000C6 +:10AAF000000000000008000000000000000000004E +:10AB000000000000000000840000000000000000C1 +:10AB1000000000000008000000000000000000002D +:10AB20000000000000000000000000000000000025 :10AB30000000000000000000000000000000000015 :10AB40000000000000000000000000000000000005 :10AB500000000000000000000000000000000000F5 -:10AB6000000000000000000001C0C002000488C016 +:10AB600000000000000000000000000000000000E5 :10AB700000000000000000000000000000000000D5 :10AB800000000000000000000000000000000000C5 :10AB900000000000000000000000000000000000B5 @@ -92883,7 +92883,7 @@ :10ABB0000000000000000000000000000000000095 :10ABC0000000000000000000000000000000000085 :10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000002808080008063 +:10ABE0000000000000000000000000000000000065 :10ABF0000000000000000000000000000000000055 :10AC00000000000000000000000000000000000044 :10AC10000000000000000000000000000000000034 @@ -92891,16 +92891,16 @@ :10AC30000000000000000000000000000000000014 :10AC40000000000000000000000000000000000004 :10AC500000000000000000000000000000000000F4 -:10AC60000000000000000000000000000000804123 -:10AC700080118000000000000000000000000000C3 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 :10AC800000000000000000000000000000000000C4 :10AC900000000000000000000000000000000000B4 :10ACA00000000000000000000000000000000000A4 :10ACB0000000000000000000000000000000000094 :10ACC0000000000000000000000000000000000084 :10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000C000A4 -:10ACF00002400400C040000000000000000000000E +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 :10AD00000000000000000000000000000000000043 :10AD10000000000000000000000000000000000033 :10AD20000000000000000000000000000000000023 @@ -92908,7 +92908,7 @@ :10AD40000000000000000000000000000000000003 :10AD500000000000000000000000000000000000F3 :10AD600000000000000000000000000000000000E3 -:10AD700009020082C08401C0000100000000000040 +:10AD700000000000000000000000000000000000D3 :10AD800000000000000000000000000000000000C3 :10AD900000000000000000000000000000000000B3 :10ADA00000000000000000000000000000000000A3 @@ -92916,7 +92916,7 @@ :10ADC0000000000000000000000000000000000083 :10ADD0000000000000000000000000000000000073 :10ADE0000000000000000000000000000000000063 -:10ADF0000000908000800080418000010000000081 +:10ADF0000000000000000000000000000000000053 :10AE00000000000000000000000000000000000042 :10AE10000000000000000000000000000000000032 :10AE20000000000000000000000000000000000022 @@ -92924,7 +92924,7 @@ :10AE40000000000000000000000000000000000002 :10AE500000000000000000000000000000000000F2 :10AE600000000000000000000000000000000000E2 -:10AE70000000000080098010808800800001000030 +:10AE700000000000000000000000000000000000D2 :10AE800000000000000000000000000000000000C2 :10AE900000000000000000000000000000000000B2 :10AEA00000000000000000000000000000000000A2 @@ -92932,7 +92932,7 @@ :10AEC0000000000000000000000000000000000082 :10AED0000000000000000000000000000000000072 :10AEE0000000000000000000000000000000000062 -:10AEF000000000000000C00082008441C004000186 +:10AEF0000000000000000000000000000000000052 :10AF00000000000000000000000000000000000041 :10AF10000000000000000000000000000000000031 :10AF20000000000000000000000000000000000021 @@ -92940,7 +92940,7 @@ :10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 :10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000080006042AF +:10AF700000000000000000000000000000000000D1 :10AF800000000000000000000000000000000000C1 :10AF900000000000000000000000000000000000B1 :10AFA00000000000000000000000000000000000A1 @@ -92964,8 +92964,8 @@ :10B0C0000000000000000000000000000000000080 :10B0D0000000000000000000000000000000000070 :10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000430805 -:10B1000040000084218600000000000000000000D4 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F :10B11000000000000000000000000000000000002F :10B12000000000000000000000000000000000001F :10B13000000000000000000000000000000000000F @@ -92989,7 +92989,7 @@ :10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE :10B2700000000000000000000000000000000000CE -:10B28000000000001000200800400008000000003E +:10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE :10B2A000000000000000000000000000000000009E :10B2B000000000000000000000000000000000008E @@ -93027,176 +93027,176 @@ :10B4B000000000000000000000000000000000008C :10B4C000000000000000000000000000000000007C :10B4D000000000000000000000000000000000006C -:10B4E000000000020002000000000000C000000098 -:10B4F000000000082008000000000000000000001C -:10B500000000000200020000000000002000000017 -:10B510000000000400200003000000000000000004 -:10B5200000000000000000000000000000002000FB -:10B5300000000000000810000000C0000002000031 -:10B5400000000000000200020000000008000000EF -:10B5500000000000000410A0000000000000000037 +:10B4E000000000020000000000000000000000005A +:10B4F0000000000200020000000000000000000048 +:10B500000000000200020000000000000000000037 +:10B510000000000200020003000000000000000024 +:10B520000000000000020002000000000000000017 +:10B5300000000000000220020000000000000000E7 +:10B5400000000000000200020008000000000000EF +:10B5500000000000000020000000000000000000CB :10B5600000000000000000000000000000000000DB :10B5700000000000000000000000000000000000CB :10B5800000000000000000000000000000000000BB -:10B5900000000000000100010000000000000000A9 +:10B5900000000000000000000000000000000000AB :10B5A000000000000000000000000000000000009B -:10B5B000000000000000000040000000000000004B -:10B5C000000000000000100000000000000000006B -:10B5D0000000000000001001201100000000000029 +:10B5B000000000000000000080000000000000000B +:10B5C000000000000000000000000000000000007B +:10B5D00000000000000000008000000000000000EB :10B5E000000000000000000000000000000000005B :10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B6100020000000000010804180000000000000B9 +:10B60000000000000000000800000003000000002F +:10B610000000000000000000010000000000000029 :10B62000000000000000000000000000000000001A -:10B6300000000000000000001000410000000000B9 +:10B630000000000000000000000001000000000009 :10B6400000000000000000000000000000000000FA -:10B650000000000000000000108011000000000049 -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000008020A010000000005A -:10B6A000000000000000000000080000000000088A -:10B6B0000008000000000008000880009000000062 -:10B6C0000000000000000008000800000000000466 -:10B6D000000400000000008200088020C00000007C -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 -:10B7100000000000000500000000002100210000E2 -:10B720000021000000210021000000000021002174 -:10B730000021000000210021000000210021402103 -:10B740000021002100210021000084218821002106 -:10B750000021002100210021000000210021002102 +:10B65000000000000000000000000000008400085E +:10B660000084000800080008000800080000000826 +:10B6700000840000008400840084008400000084B2 +:10B680000084008400840084008400840088008298 +:10B690000084000000000000000010000000000016 +:10B6A0000000000000080000000800840000000006 +:10B6B00000080008000800000000000810000084D6 +:10B6C000008800080084000000080000000000005E +:10B6D00000080008000800000008000800840000BE +:10B6E00000000000002100000000004000000008F1 +:10B6F0000000000800210000000000000000000021 +:10B700000000000500080003000200030002000022 +:10B710000021004100030021002100080011000069 +:10B720000000002100210000002100210000002174 +:10B73000000000210021000000210021002100085C +:10B74000000000080021000800210021000800007E +:10B75000000500000021000300210021002100114C :10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000020A9 +:10B7700000000000000000000000000000000000C9 :10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000400000000000000000002039 +:10B790000084000000000000000000000000000025 +:10B7A000000000000000000000000000000000A0F9 :10B7B0000000000000000000000000000000000089 -:10B7C00000000000000000000082000000000000F7 -:10B7D0000040000000000000000800000000000021 +:10B7C0000000000000000000000800000000000071 +:10B7D000000000C0000000000000000000000000A9 :10B7E0000000000000000000000000000000000059 :10B7F0000000000000000000000000000000000049 -:10B80000A000000000000000000000000000000098 -:10B810000000000000000000080000000000000020 -:10B820000008000000000000000000000000000010 +:10B800000000000000000000000000030000000035 +:10B810000000000000000000000000000000000028 +:10B820000100000000000000000000000000000017 :10B830000000000000000000000000000000000008 -:10B840000000A00400000000000000000000000054 -:10B8500000000000000000000000040000000000E4 -:10B860000000A00400000000000000000000000034 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000008000000000000D0 :10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 +:10B880000000000000000000008200000000000036 :10B8900000000000000000000000000000000000A8 -:10B8A0000000000100000000000000000000000097 -:10B8B00000A00000000000000000000000000000E8 -:10B8C0000000110000010000000000000000000066 +:10B8A0000000200000000000000000000000000078 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 :10B8D0000000000000000000000000000000000068 -:10B8E0000000000021010000000000000000000036 +:10B8E0000000000800000000000000000000000050 :10B8F0000000000000000000000000000000000048 :10B900000000000000000000000000000000000037 -:10B910000008000082004008000000000000000055 -:10B92000000800000000000000000003000000000C -:10B93000000800080000A000000000000000000057 -:10B9400000000000000000000000000300000000F4 -:10B95000000800080003820000400003000000000F -:10B96000002140000000000900000000000000006D -:10B9700000000000000000000000000000000000C7 +:10B91000000800000000000000080000000800000F +:10B92000000000050005000000000000000000000D +:10B9300000000008000000000000000800000008EF +:10B9400000000008000800050000000000000000E2 +:10B9500000000008000000000000000800000008CF +:10B9600000000000001000050000000000000000C2 +:10B9700000000000000000000000000000000020A7 :10B9800000000000000000000000000000000000B7 :10B9900000000000000000000000000000000000A7 -:10B9A00000C00000000008C000000000000000000F -:10B9B0000000000000000000020000000000000085 -:10B9C0000000000000000000002000000000000057 -:10B9D0000000000000000000000000000000000067 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000400000000000000000000000000000063 :10B9E0000000000000000000000000000000000057 :10B9F0000000000000000000000000000000000047 -:10BA000084000000000000000000000000000000B2 -:10BA10000000000000080000000000000008000016 -:10BA20008441000800000003000500000000000041 -:10BA3000000082410000000800000000000800082B -:10BA400000000805000800080003000500000000D1 -:10BA500000000003000000080000000500000000D6 -:10BA600000000808000000080003000000000000BB -:10BA700000000000000000000000000000000000C6 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000005000000000000000819 +:10BA200000050005000500000021000000080008D6 +:10BA300000080011000000000000000000000000ED +:10BA4000000800030005000500000000002100417F +:10BA500000080011000000000000000000000000CD +:10BA60000008000500050005000000A1000000001E +:10BA700000000000000000000000050000000000C1 :10BA800000000000000000000000000000000000B6 :10BA900000000000000000000000000000000000A6 -:10BAA00000000000110000000000098800000000F4 +:10BAA0000000050000000000000000000000000091 :10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000011000000000065 -:10BAD0000000000000000000000000004000000026 -:10BAE0000000000000000000000000000000000056 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000500000061 +:10BAE0000000000000000000000000000808000046 :10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000000000035 -:10BB1000000000000000000000000000010800001C -:10BB2000C1000008C0820000C00000010000000049 -:10BB300000000000000000000000000000000108FC -:10BB40000000C1000008C0820000C0000001000029 -:10BB500000000000000000000000000000000110D4 -:10BB60000000C1000008C0820000C0000001000009 +:10BB00000000000000000000000000000000000134 +:10BB10000001000100C00001000100C00011000090 +:10BB20000001000200880001C00100C00000000008 +:10BB300000010001000100C00001000100C000116F +:10BB400000000001000200100001C00100C0000060 +:10BB500000010001000100C00001000100C000114F +:10BB600000000001000200200001C00100C0000030 :10BB700000000000000000000000000000000000C5 :10BB800000000000000000000000000000000000B5 -:10BB9000000000000000000200000000001108800A -:10BBA0000002880000808080000080000003000008 -:10BBB0000000000000000000000409000000004137 -:10BBC0000880000288000080808000008000000360 -:10BBD000000000000000000000090000000000114B -:10BBE0000880000288000080808000008000000340 +:10BB9000004100410041009100410041009010C16E +:10BBA00000040241000000000041804100890000C3 +:10BBB000000000410041004100910041004100901F +:10BBC00010C1000402410000008000418041008952 +:10BBD00000000041004100410091004100410090FF +:10BBE00010C10004024100000000004180410089B2 :10BBF0000000000000000000000000000000000045 :10BC00000000000000000000000000000000000034 -:10BC10000000000009000000000000000400000017 -:10BC2000020002000300000003800000000000800A -:10BC30008003000000000900000000000000040074 -:10BC400000000200020009000000030000000000E4 -:10BC500000808010000009000000000000000400C7 -:10BC60000000020002008900000003000000000044 -:10BC700000808010000000000000000000000000B4 +:10BC1000000041000300000000804100910000008E +:10BC2000020084009000000090004100C1000080EC +:10BC300080000000410003000000008041009100EE +:10BC40000000090084009000000090004100C10045 +:10BC5000008080004100030000000080410091004E +:10BC60000000080088009000000088004100C1002A +:10BC700000808000000000000000000000000000C4 :10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000100A3 -:10BCA0000000000090001188000001100200000058 -:10BCB00000C0820000000000000000000000000042 -:10BCC0000100000000009000108800000100020048 -:10BCD000000000C082000000000000000000000022 -:10BCE0000100000000009000108800000100020028 -:10BCF000000000828201000000000000000000003F +:10BC90000000000001000100000000C00100C00021 +:10BCA00000000000080008C00088C0000500C100B6 +:10BCB00000088200000301000100000000C0010034 +:10BCC000C00000000000080008C00088C000030099 +:10BCD000C1000008820001000100000000C0010056 +:10BCE000C00000000100090008020088C100030034 +:10BCF000C1000008820000000000000000000000F9 :10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD200000000001200000400000C10001000000F0 -:10BD30000000000000000000000000000000000003 -:10BD4000000000000001200000400000C1000000D1 -:10BD500000000000000000000000000000000000E3 -:10BD6000000000000001200000400000C1000000B1 -:10BD700000000000000000000000000000000000C3 +:10BD100000000000000000C00001C0C100000000E1 +:10BD2000000100C002100011000100C1000000006D +:10BD3000000100000000000000C00001C0C10000C0 +:10BD40000000000100C020100011000100C100002F +:10BD5000000000010000000000C00001C0C10000A0 +:10BD60000000000100C002100011000100C100002D +:10BD700000000001000000000000000000000000C2 :10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA00000000000000504100080000041000800B1 -:10BDB0000000000000410000000000000000000042 -:10BDC0000000000000000005041000800000410099 -:10BDD0000000000000000041000000000000000022 -:10BDE0000000000000000005041000800000410079 -:10BDF0000000000000000041000000000000000002 +:10BD900000000000000000000080004180C10000A1 +:10BDA0000000004100C1000900C1004100C10000C5 +:10BDB000000000410009000000000080004180C137 +:10BDC00000000000004100C1000200C1004100C1AC +:10BDD000000000000041000900000080004180C117 +:10BDE00000000000004100C1000900C1004100C185 +:10BDF00000000000004100090000000000000000F9 :10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000008000009111 -:10BE20000000000000099000000000C18000000236 -:10BE30000000004100000000050800000000800034 -:10BE400000910000000000099000000000C1000007 -:10BE500000020000004100000000201000008000EF -:10BE600000910000000000001000000000410000F0 -:10BE7000000200000041000000000341000000003B +:10BE100000000000000000000000C100800080C1A0 +:10BE200000004102000084004100C1410000800484 +:10BE3000000041000000800041000000C1008000BF +:10BE400080C100004102000082004100C1410000A9 +:10BE5000800400004100000080004100C10080001B +:10BE600080C100004102000082004100C141000089 +:10BE7000800400004100000080004100000000003C :10BE800000000000000000000000000000000000B2 -:10BE9000000000000000000000000000000008009A -:10BEA0000010000000001000820000000009820065 -:10BEB0000000000000010000000000090000000078 -:10BEC00008000010000000000200820000000009CD -:10BED0000200000000000001000000000009000056 -:10BEE0000800001000000000020090000000001197 -:10BEF00002000000000000010000000000910000AE +:10BE9000000000000000000000000000C1004000A1 +:10BEA000C0C100000100020008000100C1851000AF +:10BEB000C000000001000000C00001000000C1003F +:10BEC0004000C0C100000100020008000100C1855F +:10BED0001000C000000001000000C0000100C1000F +:10BEE0004000C0C100000100020008000100C1853F +:10BEF0001000C000000001000000C00001000000B0 :10BF00000000000000000000000000000000000031 :10BF10000000000000000000000000000000000021 -:10BF2000000000000000000000000000000081127E -:10BF300000E04000484200000000000048420000CD -:10BF400000000000000000000000000000000000F1 -:10BF5000811200E04000484200000000000048421A -:10BF600000000000000000000000000000000000D1 -:10BF7000811200E0400048420000000000004882BA +:10BF2000000000000042000000000000000081123C +:10BF3000004107004800000000000000420000002F +:10BF400000000000000000420000000000000000AF +:10BF5000811200410700480000000000000042007C +:10BF6000000000000000004200000000000000008F +:10BF7000811200410700480000000000000042005C :10BF800000000000000000000000000000000000B1 :10BF900000000000000000000000000000000000A1 :10BFA0000000000000000000000000000000000091 @@ -93223,206 +93223,206 @@ :10C0F0000000000000000000000000000000000040 :10C1000000000000DEAE00000000000000000000A3 :10C11000000000000000000000000000000000001F -:10C120000000000000006126034000000000000045 -:10C130000230A0000000000000000C4000000000E1 -:10C14000000002C064860000612603400000000079 -:10C1500000000230A0000000000000000C400000C1 -:10C160000000000002C06486612603400000000059 -:10C1700000000230A0000000000000000C400000A1 -:10C180000000000002C06486000000000000020001 -:10C19000000000000000020000000000000000009D -:10C1A000000000000000000000000000000020006F -:10C1B000000000000000020000000000000000007D -:10C1C00040004000000000000000000000000000EF -:10C1D000200000000000000000000000000000003F -:10C1E0000000010000000100040000000000000049 -:10C1F000200004000400040004000000000000000F +:10C1200000000000000060C60300000000000000E6 +:10C130000031E0000000000000000C0000000000E2 +:10C14000000000C06306000060C60300000000009D +:10C1500000000031E0000000000000000C000000C2 +:10C160000000000000C0630660C60300000000007D +:10C1700000000031E0000000000000000C000000A2 +:10C180000000000000C06306000000000000000086 +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000030000000000006C +:10C1D00084000000000000000000000000000000DB +:10C1E000000000000000000000000000000000004F +:10C1F000200000000000000000000000000000001F :10C20000000000000000000000000000000000002E -:10C21000000000000000000000040000000000001A -:10C22000000000000000000000000000000000000E -:10C2300004040000000000000004000000000000F2 -:10C2400000008000800000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C260000000000404000000040080000000000042 -:10C2700000000000800080008000800000000000BE +:10C21000000000000000000000000000000000001E +:10C22000000000000000000400000000000000000A +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000040000000000000004000000000000D6 +:10C2600000040000000000000000000000000000CA +:10C2700000000000000000000000000000000000BE :10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E +:10C290000005000000000000000002000000000097 +:10C2A00000000000000000009000000000000000FE +:10C2B000000000000000000000000200000000007C :10C2C000000000000000000000000000000000006E :10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E +:10C2E000000000000000000000000000008000804E :10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000020000000DD -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000080008000800080008000000000000A5 -:10C3700000000000000000000000000000000000BD -:10C38000000800080008021000080000000000007B -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000210000000000004C -:10C3D00000000000004100210000000900000000F2 -:10C3E000000000000000002100000000010000002B -:10C3F00000002000010020212000000000000000BB -:10C40000000000000000002100000000000000000B -:10C41000000000000000000000000000000000001C -:10C420000800000000000000000000000000000004 -:10C4300000000000000000001100000000000000EB -:10C440001000000000A000A000080008000000008C +:10C300000000000002000000000000000000000823 +:10C310000000000002000008000000000000000013 +:10C3200000000000000000840000008800000008F9 +:10C3300000000000000000080000000000000000F5 +:10C3400000000008000000000000000000000000E5 +:10C3500000080000000000000008000000000000CD +:10C360000000000800080008000800080000004065 +:10C370000040000000000000000800000000000075 +:10C38000000000080008000800100008000000007D +:10C39000000000000000010000000000000000009C +:10C3A0000000000000080000020000000000000083 +:10C3B000000000000000000000400000000001003C +:10C3C000000000000000000000000000000000006D +:10C3D0000000000000000021040000000000000038 +:10C3E00000000000000300210000000000000080A9 +:10C3F0000000000000000008010000000000000034 +:10C400000000000000000000000000030000000029 +:10C410000000000000000000040000000000000018 +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000100000000FB +:10C44000040000000008000800080008000800823E :10C4500000000000000000000000110000000000CB -:10C46000000000000000000000A000080508040013 -:10C470000000000080002000808491000000000087 -:10C48000000000000000000000A000100084000078 -:10C490002000080000000000000000000000000074 +:10C4600000000000000000080008000800080008A4 +:10C470000040000000000000000004000000000078 +:10C48000000041000000000800080008001000083B +:10C49000000000000080000000000000000000001C :10C4A000000000000000000000000000000000008C :10C4B000000000000000000000000000000000007C -:10C4C00000000000000000000000000000800000EC -:10C4D00000040004000000000000C000A000C00034 -:10C4E000C000040000000000000082008200210063 -:10C4F00020002000200000000000000000000000DC -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000100000000000000000000003B +:10C5000000000000000000000000000000008800A3 +:10C51000000090000000004000000000000000004B :10C52000000000000000000000000000000000000B :10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000004E7 -:10C5500000000001000100000000000000000000D9 +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB :10C5600000000000000000000000000000000000CB -:10C5700090008000800080000000000000000000AB +:10C5700000000000000004000000000000000000B7 :10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B +:10C59000000000000000000000000000002000007B :10C5A000000000000000000000000000000000008B :10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000020000000100000000000A000A000EB -:10C5E0000000000000000000080000000000000043 -:10C5F000000000000000000020000000000000001B -:10C6000000000000000000000000000000400000EA -:10C61000000000000000000090000000000000008A +:10C5C000000000000020000000000000000000004B +:10C5D0000000000000000008000000000021000032 +:10C5E000000000000000000000000000000000004B +:10C5F00000000040020000000000C0000000002019 +:10C6000000000000000000000000000000000041E9 +:10C610000000000000000000000000000000000119 :10C62000000000000000000000000000000000000A :10C6300000000000000000000000000000000000FA -:10C64000000000A000000000000000080008000832 -:10C6500011000090000000008000000000000000B9 -:10C66000000000000088000000000000000000083A -:10C6700000081100000000000000000000000000A1 -:10C6800000002000008809002000000000000008D1 -:10C690000008110000080000040000200000000055 -:10C6A000000000000000000000000000000000008A +:10C64000000000000000000100000082000000A0C7 +:10C6500000000000000000000000000000000000DA +:10C6600000001100000000000000000000000000B9 +:10C6700000A0000000018000000000000000000099 +:10C680000001000000A00000000000820000000087 +:10C6900000A00002000000000000000000000000F8 +:10C6A0000000000000000000000900000000000081 :10C6B000000000000000000000000000000000007A :10C6C000000000000000000000000000000000006A -:10C6D00000000000000011001000400000000000F9 -:10C6E0000000000000000000000000000400000046 -:10C6F00000000000A000080008000000000000008A -:10C7000000000080000000000000000300000000A6 +:10C6D0000009000000000000000000000000000051 +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000090000000020 :10C710000000000000000000000000000000000019 :10C720000000000000000000000000000000000009 :10C7300000000000000000000000000000000000F9 :10C7400000000000000000000000000000000000E9 -:10C750000000000000000000A00091008000000028 +:10C7500000000000000000000000000000000000D9 :10C7600000000000000000000000000000000000C9 -:10C770000000000041000000000000000000000078 -:10C780000000000000100000050000001100000083 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 :10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 +:10C7A00000009000000000000000000000000000F9 :10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000100000000000157 +:10C7C00000000000000000000000900000000000D9 +:10C7D0000000000000000000000000000000000059 :10C7E0000000000000000000000000000000000049 -:10C7F000000000000000000000000000A000000099 -:10C800000000000000000000000000000000000028 +:10C7F00000000000000000000000000000900000A9 +:10C800000000000090000000000000000000000098 :10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 +:10C820000000110080000000000000000000000077 :10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C850000000000000000000000000411010100067 -:10C8600000040000000000000000000000000000C4 -:10C8700000000000000000000000000000000000B8 -:10C880001000000000000000030000000000000095 +:10C840000000000000000000000011008000000057 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C870000000000000000000000000000000008038 +:10C880000000000011008000000000000000000017 :10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 +:10C8A0000000000000000080000000000000000008 :10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 +:10C8C00000000000000000000000000000000080E8 :10C8D0000000000000000000000000000000000058 -:10C8E000000500A0000000000000000000000000A3 -:10C8F00000000000000000000000000000000040F8 -:10C9000008004000418000050000004000000000D9 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C9000000000000000000000080000000000000A7 :10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 +:10C92000000000000000000000200000008800005F :10C9300000000000000000000000000000000000F7 :10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C96000000000010089000000000000000000003D +:10C95000002000000088000000000000000000002F +:10C9600000000000000000000000000000000000C7 :10C9700000000000000000000000000000000000B7 -:10C9800000000040000001C00000000000000000A6 -:10C990000000004000000040000000000000000017 -:10C9A0000000000000000000000000000000000087 +:10C9800000000020000000080000002000000088D7 +:10C990000000000000000000000000000000000097 +:10C9A00000000000000000000100008808000000F6 :10C9B0000000000000000000000000000000000077 :10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000001000100000001000000000000000044 +:10C9D00001000088080000000000000000000000C6 +:10C9E0000000000000000000000000000000000047 :10C9F0000000000000000000000000000000000037 -:10CA0000000000004000A0000100000004008200BF -:10CA100000000000000040000000000000000000D6 -:10CA20000000000000000000000000000000000006 +:10CA000000000000000020900000010000880800E5 +:10CA10000000000000000000000000000000000016 +:10CA200000000000000000000000410000808000C5 :10CA300000000000000000000000000000000000F6 :10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA60000000004000044100004100000000000000 +:10CA50000000410000808000000000000000000095 +:10CA600000000000000000000000000000000000C6 :10CA700000000000000000000000000000000000B6 -:10CA8000000000004000000080000800000080005E -:10CA90000000400040000000000000000000000016 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 +:10CA8000000000000800000000800000410000805D +:10CA90008000000000000000000000000000000016 +:10CAA0000000000000000000000000000011000075 +:10CAB00000800000000000000000000000000000F6 :10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE00000000000410400000400030000000000FA +:10CAD00000000000001100000080000000000000C5 +:10CAE0000000000000000000000000000000000046 :10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000800000005000018 -:10CB100000000000000000100021000000000000E4 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 +:10CB00000000000000000011800000000000001183 +:10CB10000000008000000000000000000000000095 +:10CB20000000000000000000000000000000000104 +:10CB300000000040000000000000000000000000B5 :10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000001010000010000000000C2 +:10CB50000000000000000001000000400000000094 +:10CB600000000000000000000000000000000000C5 :10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000100000000A4 -:10CB90000000000000000000000100000000000094 +:10CB800000000000000000000001200000880000FC +:10CB90000001000000400000000000000000000054 :10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 +:10CBB00000000000070082000000000000000000EC :10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000010000000044 +:10CBD00000000000000000000000000007008200CC +:10CBE0000000000000000000000000000000000045 :10CBF0000000000000000000000000000000000035 -:10CC000000000000000000000000000000421200D0 -:10CC1000002100000044000000000000000080002F +:10CC0000000000000000000000000000000007001D +:10CC1000000000000000070082000000000000008B :10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 +:10CC3000000000000000F0F0000000000000000014 :10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 +:10CC50000000000000000000000000000000F0F0F4 :10CC600000000000000000000000000000000000C4 :10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 +:10CC800000000000000000000000000000FF0000A5 +:10CC900000FF000000000000F0F0000000000000B5 :10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 +:10CCB0000000000000000000F0F000000000000094 :10CCC0000000000000000000000000000000000064 :10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 +:10CCE000F0F0000000000000000000000000000064 :10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 +:10CD0000000000000000000000000000000000FF24 +:10CD1000000000FF000000000000F0F00000000034 :10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 +:10CD3000000000000000000000000000FFFF0000F5 :10CD400000000000000000000000000000000000E3 :10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 +:10CD600000000000FFFF00000000000000000000C5 :10CD700000000000000000000000000000000000B3 :10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 +:10CD90000000FF000000FFFF000000000000FFFF98 :10CDA0000000000000000000000000000000000083 :10CDB0000000000000000000000000000000000073 :10CDC0000000000000000000000000000000000063 @@ -93430,21 +93430,21 @@ :10CDE0000000000000000000000000000000000043 :10CDF0000000000000000000000000000000000033 :10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 +:10CE100000000000FF000000000000000000000013 :10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 +:10CE30000000000000000000000005000A0005409E +:10CE400000A800000000000000000000000000003A :10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE70000000006100010009000000000000000047 +:10CE6000000005000A00054000A8000000000000C6 +:10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 -:10CE90000000000005610A0F050500A00061000701 -:10CEA000000D000005000A08050000A000000000B9 +:10CE90000000000015002A00054000A805000A0057 +:10CEA000054000A800000000000000000000000095 :10CEB0000000000000000000000000000000000072 :10CEC0000000000000000000000000000000000062 :10CED0000000000000000000000000000000000052 :10CEE0000000000000000000000000000000000042 -:10CEF000000000000C0C3C3CF0F03C3C000000004A +:10CEF0000000000000000000000000000000000032 :10CF00000000000000000000000000000000000021 :10CF10000000000000000000000000000000000011 :10CF20000000000000000000000000000000000001 @@ -93452,7 +93452,7 @@ :10CF400000000000000000000000000000000000E1 :10CF500000000000000000000000000000000000D1 :10CF600000000000000000000000000000000000C1 -:10CF70000000000000000C0C000000000000000099 +:10CF700000000000000000000000000000000000B1 :10CF800000000000000000000000000000000000A1 :10CF90000000000000000000000000000000000091 :10CFA0000000000000000000000000000000000081 @@ -93460,124 +93460,124 @@ :10CFC0000000000000000000000000000000000061 :10CFD0000000000000000000000000000000000051 :10CFE0000000000000000000000000000000000041 -:10CFF00000000000000000003C00FF0000000000F6 +:10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 -:10D01000000000000000000000000000000000F020 -:10D02000A0A00000000000000000000000000000C0 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 :10D0300000000000000000000000000000000000F0 :10D0400000000000000000000000000000000000E0 :10D0500000000000000000000000000000000000D0 :10D0600000000000000000000000000000000000C0 -:10D07000000000000000000000003C000000000074 +:10D0700000000000000000000000000000000000B0 :10D0800000000000000000000000000000000000A0 :10D090000000000000000000000000000000000090 -:10D0A00000F0A0A000000000000000000000000050 +:10D0A0000000000000000000000000000000000080 :10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000020000000000040 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000020000000000020 -:10D0F0000000000000000000000000000000000030 -:10D1000000000000000000000000000020000000FF -:10D11000000000000000000000050000000000000A -:10D12000000000040000400000000000200000009B -:10D1300000000000000000000000000000000000EF -:10D1400000000000000200000000000000000000DD +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000020000000200000000000000010 +:10D0E0000010000000000000000000000000000030 +:10D0F0000000000000000000200000000000000010 +:10D10000000000000000000000000000000000001F +:10D1100000000000040000000000200000000000EB +:10D1200000000000000000000000000000000000FF +:10D1300000000000200000000000200000000000AF +:10D140000000000088000000000000000000000057 :10D1500000000000000000000000000000000000CF :10D1600000000000000000000000000000000000BF -:10D1700000000002000000000000000000000000AD -:10D18000000000000002000000000000000000009D -:10D19000000000000000100000000000000000007F -:10D1A00000000000000200008000000000000000FD -:10D1B000000000000002000000000000000000006D +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000200009D +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000027D +:10D1B000000000000000000000000000000000006F :10D1C000000000000000000000000000000000005F :10D1D000000000000000000000000000000000004F :10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000820000000000000000009C -:10D21000000000000000000004000000000000000A -:10D2200000000000000000008200000200800000FA -:10D2300000000000000000000400000000000000EA -:10D24000000000000000000082000000000000005C +:10D1F00082000000000000000000000000000000AD +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000800000000D6 :10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE +:10D2600000000000000000000000001000000000AE :10D2700000000000000000000000000000000000AE :10D28000000000000000000000000000000000009E -:10D290000000000800000000000000000000000086 -:10D2A0000000000000000000000000080001000273 -:10D2B00000000008000000840000000000000000E2 -:10D2C0000000000000000000000000080000000056 +:10D290000000000000000000000000080000000086 +:10D2A000000000000000000000000000000000007E +:10D2B000000000080000000000000008000000005E +:10D2C000000000000000000000000000000000005E :10D2D000000000000000000000000000000000004E :10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000900000009E -:10D30000000000000000000000000000000090008D -:10D31000000000000000000000000000000000020B -:10D3200000000000000000000000000040000500B8 -:10D3300000910080000000000000000000000000DC -:10D340000000000000000000C040000000000000DD +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD :10D3500000000000000000000000000000000000CD :10D3600000000000000000000000000000000000BD :10D3700000000000000000000000000000000000AD :10D38000000000000000000000000000000000009D -:10D3900000A00008000000000000000000000000E5 -:10D3A0000400000000000000000000000000000079 -:10D3B0001000000200080000000000000040000013 -:10D3C000000000A000000000210003000300030093 +:10D39000000000000000000000000000000000008D +:10D3A000000040000300000000000000000000003A +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000A0BD :10D3D000000000000000000000000000000000004D :10D3E000000000000000000000000000000000003D :10D3F000000000000000000000000000000000002D -:10D4000000410000000000000000000900000000D2 -:10D41000000000000000000000000000000000000C -:10D4200000000000900000008400000000000000E8 -:10D43000000021000002002000000000A009A00060 -:10D44000A00000000000000000000000000000003C +:10D40000000000000000000000000000000000001C +:10D41000000000000000C00000000000000000004C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400004000000000000000000000000000000D8 :10D4500000000000000000000000000000000000CC :10D4600000000000000000000000000000000000BC :10D4700000000000000000000000000000000000AC :10D48000000000000000000000000000000000009C :10D49000000000000000000000000000000000008C :10D4A000000000000000000000000000000000007C -:10D4B00000000000900000010001000000080000D2 +:10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C :10D4D000000000000000000000000000000000004C :10D4E000000000000000000000000000000000003C :10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B +:10D500000000000008000000000000000000000013 +:10D510000000C0000000000000000000000000004B :10D5200000000000000000000000000000000000FB -:10D530000000080090000000020000000000000849 -:10D5400000000000000000000000040000000000D7 -:10D5500000000000000000000000000000000000CB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D55000000000000000000000000000009000003B :10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000080000A3 -:10D5800000000000000000000000000000842000F7 +:10D5700000000000000000000000000000000000AB +:10D580000000000000080000000000000000000093 :10D590000000000000000000000000000000000883 -:10D5A00000000008000000000000000000000084EF -:10D5B0000084000080880000000080000000000857 -:10D5C000210000A000000000000000000000008416 -:10D5D0000000000000000004000000000000000047 +:10D5A000000000000000000000000000000000007B +:10D5B00000000000000000840000000000000002E5 +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B :10D5E000000000000000000000000000000000003B :10D5F000000000000000000000000000000000002B :10D60000000000000000000000000000000000001A -:10D610000000000000000008000000000000000002 +:10D61000000000000000000000000000000000000A :10D6200000000000000000000000000000000000FA -:10D6300000000200000008000008400221002180D4 -:10D64000200000080009000000098200000000001E -:10D6500000000000000000000008000000000000C2 +:10D6300000000000000000000000000000000000EA +:10D6400000020000000000000000000000000000D8 +:10D6500000000000000000000000000000000000CA :10D6600000000000000000000000000000000000BA :10D6700000000000000000000000000000000000AA :10D68000000000000000000000000000000000009A -:10D690000000110000000000000000000000000079 +:10D69000000000000000000000000000000000008A :10D6A000000000000000000000000000000000007A -:10D6B0000000000080000000800000008000840066 -:10D6C000C008800000000000000000000000000012 +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A :10D6D000000000000000000000000000000000004A :10D6E000000000000000000000000000000000003A :10D6F000000000000000000000000000000000002A :10D700000000000000000000000000000000000019 :10D710000000000000000000000000000000000009 :10D7200000000000000000000000000000000000F9 -:10D73000000000000000000000000000000000C128 -:10D740004002000588C10000000000000000000049 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 :10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 @@ -93585,7 +93585,7 @@ :10D790000000000000000000000000000000000089 :10D7A0000000000000000000000000000000000079 :10D7B0000000000000000000000000000000000069 -:10D7C00010C1008003900011000000000000000064 +:10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 :10D7E0000000000000000000000000000000000039 :10D7F0000000000000000000000000000000000029 @@ -93593,7 +93593,7 @@ :10D810000000000000000000000000000000000008 :10D8200000000000000000000000000000000000F8 :10D8300000000000000000000000000000000000E8 -:10D840000000801080419011C10000000000000025 +:10D8400000000000000000000000000000000000D8 :10D8500000000000000000000000000000000000C8 :10D8600000000000000000000000000000000000B8 :10D8700000000000000000000000000000000000A8 @@ -93601,40 +93601,40 @@ :10D890000000000000000000000000000000000088 :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 -:10D8C00000000000040102000500C140000000004B +:10D8C0000000000000000000000000000000000058 :10D8D0000000000000000000000000000000000048 :10D8E0000000000000000000000000000000000038 :10D8F0000000000000000000000000000000000028 :10D900000000000000000000000000000000000017 :10D910000000000000000000000000000000000007 -:10D9200000000000000100000000000000000000F6 +:10D9200000000000000000000000000000000000F7 :10D9300000000000000000000000000000000000E7 -:10D9400000000000000008402040C00400C00000AB +:10D9400000000000000000000000000000000000D7 :10D9500000000000000000000000000000000000C7 :10D9600000000000000000000000000000000000B7 :10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 :10D990000000000000000000000000000000000087 -:10D9A0000000000000000001000000000000000076 +:10D9A0000000000000000000000000000000000077 :10D9B0000000000000000000000000000000000067 -:10D9C000000000000000000080800080808009804E +:10D9C0000000000000000000000000000000000057 :10D9D0000000000000000000000000000000000047 :10D9E0000000000000000000000000000000000037 :10D9F0000000000000000000000000000000000027 :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 -:10DA200000000000000000000001000000000000F5 +:10DA200000000000000000000000000000000000F6 :10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000A189801080A0FC -:10DA500000030000000000000000000000000000C3 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 :10DA600000000000000000000000000000000000B6 :10DA700000000000000000000000000000000000A6 :10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000010000000075 +:10DAA0000000000000000000000000000000000076 :10DAB0000000000000000000000000000000000066 -:10DAC000000000000000000000000000C1904001C4 -:10DAD0000440C090000000000000000000000000B2 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 :10DAE0000000000000000000000000000000000036 :10DAF0000000000000000000000000000000000026 :10DB00000000000000000000000000000000000015 @@ -93642,7 +93642,7 @@ :10DB200000000000000000000000000000000000F5 :10DB300000000000000000000000000000000000E5 :10DB400000000000000000000000000000000000D5 -:10DB5000002004000042000000000000000000005F +:10DB500000000000000000000000000000000000C5 :10DB600000000000000000000000000000000000B5 :10DB700000000000000000000000000000000000A5 :10DB80000000000000000000000000000000000095 @@ -93666,7 +93666,7 @@ :10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 :10DCC0000000000000000000000000000000000054 -:10DCD0000000000041084000008421060000000010 +:10DCD0000000000000000000000000000000000044 :10DCE0000000000000000000000000000000000034 :10DCF0000000000000000000000000000000000024 :10DD00000000000000000000000000000000000013 @@ -93690,15 +93690,15 @@ :10DE200000000000000000000000000000000000F2 :10DE300000000000000000000000000000000000E2 :10DE400000000000000000000000000000000000D2 -:10DE5000000000000000001000000061000F00053D -:10DE600000080000000000000000000000000000AA +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 :10DE700000000000000000000000000000000000A2 :10DE80000000000000000000000000000000000092 :10DE90000000000000000000000000000000000082 :10DEA0000000000000000000000000000000000072 :10DEB0000000000000000000000000000000000062 :10DEC0000000000000000000000000000000000052 -:10DED0000000000000000000000000000000FFFF44 +:10DED0000000000000000000000000000000000042 :10DEE0000000000000000000000000000000000032 :10DEF0000000000000000000000000000000000022 :10DF00000000000000000000000000000000000011 @@ -93707,7 +93707,7 @@ :10DF300000000000000000000000000000000000E1 :10DF400000000000000000000000000000000000D1 :10DF500000000000000000000000000000000000C1 -:10DF6000FFFF0000000000000000000000000000B3 +:10DF600000000000000000000000000000000000B1 :10DF700000000000000000000000000000000000A1 :10DF80000000000000000000000000000000000091 :10DF90000000000000000000000000000000000081 @@ -93715,7 +93715,7 @@ :10DFB0000000000000000000000000000000000061 :10DFC0000000000000000000000000000000000051 :10DFD0000000000000000000000000000000000041 -:10DFE0000C0CFCFC00FF00AA000000000000000078 +:10DFE0000000000000000000000000000000000031 :10DFF0000000000000000000000000000000000021 :10E000000000000000000000000000000000000010 :10E010000000000000000000000000000000000000 @@ -93723,27 +93723,27 @@ :10E0300000000000000000000000000000000000E0 :10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 -:10E0600000000C0CFCFC000000AA000000000000F6 +:10E0600000000000000000000000000000000000B0 :10E0700000000000000000000000000000000000A0 -:10E080000000000000000000200000000000000070 -:10E090002000000000000000200000000000000040 -:10E0A000200400000000000020000000000000002C -:10E0B000200000000000000020020000000000001E -:10E0C0000404000000000000000000000000000048 -:10E0D0000000880000000000000020000000000098 -:10E0E000000020000000000000000002000000000E -:10E0F00000002000000000000000200000000000E0 -:10E1000000002000000000000000000000000000EF +:10E080000000000000000000000000000000000090 +:10E09000000000000000000004000000000000007C +:10E0A000000000000000000000040000000000026A +:10E0B0000000000000000000200000000000000040 +:10E0C0000000000000000000000000000000000050 +:10E0D000000000000000000000022000000000001E +:10E0E000000200000000000000020000000000002C +:10E0F0000000000000000000000020000000000000 +:10E10000000000000000000000000000000000000F :10E1100000000000000000000000000000000000FF -:10E1200000004000000000000000000000000000AF -:10E1300000000000000000000000000000000000DF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000002DD :10E1400000000000000000000000000000000000CF :10E1500000000000000000000000000000000000BF -:10E160000000000000000088000000000000000027 -:10E17000000000000000000000000000100000008F -:10E18000000000000000000000000000000000008F +:10E1600000020000000000000000000000000000AD +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000001100007E :10E19000000000000000000000000000000000007F -:10E1A000000000000200000000000000000000006D +:10E1A000000000000000000000000000000000006F :10E1B000000000000000000000000000000000005F :10E1C000000000000000000000000000000000004F :10E1D000000000000000000000000000000000003F @@ -93763,22 +93763,22 @@ :10E2B000000000000000000000000000000000005E :10E2C000000000000000000000000000000000004E :10E2D000000000000000000000000000000000003E -:10E2E000000000000000200000000000000000000E +:10E2E000000000000000400000009000000000005E :10E2F000000000000000000000000000000000001E -:10E300000000000800000000000000000000000005 +:10E30000000000000000000000000000000000000D :10E3100000000000000000000000000000000000FD :10E3200000000000000000000000000000000000ED :10E3300000000000000000000000000000000000DD -:10E3400000000000000000000000002000000000AD -:10E3500000000000000000000000000008000000B5 -:10E360000000000000000002110000000300000097 -:10E370000000000000A000000000000000000000FD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E370000000000000000000000000000008000095 :10E38000000000000000000000000000000000008D :10E39000000000000000000000000000000000007D :10E3A000000000000000000000000000000000006D :10E3B000000000000000000000000000000000005D -:10E3C0000000000000000000000000000800000045 -:10E3D0000000000000000000000000000000A0009D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D :10E3E000000000000000000000000000000000002D :10E3F000000000000000000000000000000000001D :10E40000000000000000000000000000000000000C @@ -93799,29 +93799,29 @@ :10E4F000000000000000000000000000000000001C :10E50000000000000000000000000000000000000B :10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000200000BB -:10E540000000000000000000000000000088000043 +:10E5200000001100000000000000000000000000DA +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB :10E5500000000000000000000000000000000000BB :10E5600000000000000000000000000000000000AB -:10E5700000000000008400C009000000110000003D -:10E580000000000008000000000000000000000083 +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B :10E59000000000000000000000000000000000007B :10E5A000000000000000000000000000000000006B :10E5B000000000000000000000000000000000005B :10E5C000000000000000000000000000000000004B -:10E5D0000000000000000000000000000000080033 +:10E5D000000000000000000000000000000000003B :10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000110A +:10E5F000000000000000000000000000000000001B :10E60000000000000000000000000000000000000A :10E6100000000000000000000000000000000000FA :10E6200000000000000000000000000000000000EA :10E6300000000000000000000000000000000000DA :10E6400000000000000000000000000000000000CA -:10E6500000000000200020880000000000000000F2 +:10E6500000000000000000000000000000000000BA :10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000088008800008A -:10E68000000040000000000000000000000000004A +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A :10E69000000000000000000000000000000000007A :10E6A000000000000000000000000000000000006A :10E6B000000000000000000000000000000000005A @@ -93920,186 +93920,186 @@ :10EC80000000000000000000000000000000000084 :10EC90000000000000000000000000000000000074 :10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 +:10ECB0000000000000000000002000000000000034 :10ECC0000000000000000000000000000000000044 :10ECD0000000000000000000000000000000000034 :10ECE0000000000000000000000000000000000024 :10ECF0000000000100000000000000000000000013 :10ED00000000000000000000000000000000000003 -:10ED10000000000000000000008000000000000073 -:10ED200000020000000000000000000000000000E1 -:10ED300000040000000000000000000000000000CF -:10ED400000040004000000000000000000000000BB -:10ED500000000002000000000000000000000000B1 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000100000000D2 +:10ED400000040000000000000000000200000000BD +:10ED500000040004000000000000000000000000AB :10ED6000000400040000000000000000000000009B -:10ED70000000000000000000000000000000000093 -:10ED8000000000040000000000000000000000007F -:10ED900000000002009000000000000200000000DF -:10EDA000004000040004000000000000000000001B -:10EDB0000040000200000000000000000000000011 +:10ED7000000400040000000000000000000000008B +:10ED8000000000040004000000000000000000007B +:10ED90000000000400040000000000020000000069 +:10EDA000000000040004000000000000000000005B +:10EDB000000000000000000400040000002000002B :10EDC0000000000000000000000000000000000043 :10EDD0000000000000000000000000000000000033 -:10EDE00000000000000004000400002002200000D9 +:10EDE0000000000000000000000000000000000023 :10EDF0000000000000000000000000000000000013 :10EE00000000000000000000000000000000000002 :10EE100000000000000000000000000000000000F2 :10EE200000000000000000000000000000000000E2 -:10EE300000000000000002000000000000000000D0 -:10EE400000000000000000000000000000000000C2 -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000008000800000010001A0 -:10EE7000000000000200020000000000000000008E -:10EE80000000000000000000000000000000000082 -:10EE90000000000000000200020000000008000066 -:10EEA0000000000000000000000000000000000062 -:10EEB0000000000000000200000000000000000050 -:10EEC0000000000000000000000000000000000042 +:10EE300000000000000000000001000100000009C7 +:10EE400000000000000000080000000000000000BA +:10EE500000000000000000000000000000000008AA +:10EE6000000000000000000800000000000000009A +:10EE70000000000000000000000000000000000092 +:10EE80000008000000000000000800000000000072 +:10EE90000000000000000000000000000000000072 +:10EEA0000008000000000000000800000000000052 +:10EEB0000000000000000000000000400080002072 +:10EEC00000400000000900000000000000000000F9 :10EED0000000000000000000000000000000000032 :10EEE0000000000000000000000000000000000022 -:10EEF000000000000000000000000000000000080A -:10EF000000000000000000030000000000000000FE -:10EF1000000000000000000000000200008000006F -:10EF200000000000000000000000000000210000C0 -:10EF300000000000000000000000000000000000D1 -:10EF400000000000000000000000000000000000C1 +:10EEF0000000000000000000000000000000000012 +:10EF000000000000000000000000000000000400FD +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000010010C0 +:10EF400000010001000000000000000000000000BF :10EF500000000000000000000000000000000000B1 :10EF600000000000000000000000000000000000A1 :10EF70000000000000000000000000000000000091 :10EF80000000000000000000000000000000000081 -:10EF90000000000000000000000000000000000869 +:10EF90000000000000000000000000000000000071 :10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC0000000000000000000000000000000000041 +:10EFB00000000000000000000000000000008300CE +:10EFC00000000100038000000000000000000000BD :10EFD0000000000000000000000000000000000031 :10EFE0000000000000000000000000000000000021 :10EFF0000000000000000000000000000000000011 :10F000000000000000000000000000000000000000 :10F0100000000000000000000000000000000000F0 -:10F0200000000000000020000000A000A000A000E0 -:10F0300000000000000000000100010000000000CE -:10F0400000000000000000000000000000000000C0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F040000200030002008420000000000000000015 :10F0500000000000000000000000000000000000B0 :10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 :10F080000000000000000000000000000000000080 :10F090000000000000000000000000000000000070 -:10F0A00000000000000000008000000000000000E0 -:10F0B0000000000000000000000020002000000010 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 :10F0C0000000000000000000000000000000000040 :10F0D0000000000000000000000000000000000030 -:10F0E00000000000000000000000000000004000E0 +:10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 :10F1000000000000000000000000000000000000FF -:10F1100000000000001000000000000000000000DF -:10F12000000000000100000000000080000000005E -:10F13000000000000000000000008200000000004D +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF :10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF +:10F15000000000400000000000000000000000006F :10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000206F +:10F17000000000000000000000000000000000008F :10F18000000000000000000000000000000000007F :10F19000000000000000000000000000000000006F -:10F1A00000840000000010000000000000020000C9 +:10F1A00000000000009000000000000000000000CF :10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000000000000000003F +:10F1C0000000000000000190000001C00480000069 :10F1D000000000000000000000000000000000002F :10F1E000000000000000000000000000000000001F -:10F1F00000000000000020000000000000000020CF -:10F20000002000200020000000000000000000009E +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE :10F2100000000000000000000000000000000000EE -:10F2200000000000000000000000040804000400CA -:10F2300000000004000000090000000000000000C1 -:10F2400000000000010001000000000000000000BC -:10F2500000000000000000000000000000000000AE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000841030004058004E5 +:10F25000050005000000210003000000000003007D :10F26000000000000000000000000000000000009E :10F27000000000000000000000000000000000008E -:10F28000000100010001000100000000000000007A +:10F28000000000000000000000000000000000007E :10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000800180005D -:10F2B00080000000000000000000000000000000CE -:10F2C00000000000000020002000000000000000FE -:10F2D000000000000000000000000000000000002E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C0000000000000000000000089C10120409102 +:10F2D0009008000000000000000000000000000096 :10F2E000000000000000000000000000000000001E :10F2F000000000000000000000000000000000000E -:10F300000000000084000000000000000000000079 +:10F3000000000000000000000000000000000000FD :10F3100000000000000000000000000000000000ED -:10F320000000000000000000000000000000840059 -:10F3300001000000000000000000000000000000CC -:10F3400000000000000000000000000000000000BD -:10F3500000000000000000000000000000000000AD +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F340000000000000000000000000008991039010 +:10F350008010000500000000000000000000000018 :10F36000000000000000000000000000000000009D :10F37000000000000000000000000000000000008D :10F38000000000000000000000000000000000007D :10F39000000000000000000000000000000000006D :10F3A000000000000000000000000000000000005D -:10F3B000000003000000000000000000000000004A -:10F3C0000000000000000000000009000000000034 -:10F3D000000000000000000000000000000000002D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000003003A +:10F3D0004103109180800000000000000000000048 :10F3E000000000000000000000000000000000001D :10F3F000000000000000000000000000000000000D -:10F40000008000000080000000000000008000007C +:10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC :10F4200000000000000000000000000000000000DC -:10F430000000028000004180000000000000000089 -:10F44000000000000000000000410000004000003B -:10F4500000000000000000000000000000000000AC +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F450000020000101419090000000000000000029 :10F46000000000000000000000000000000000009C :10F47000000000000000000000000000000000008C -:10F480000000000800000008000000C0000000C0EC +:10F48000000000000000000000000000000000007C :10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C -:10F4B00000000000008800000108000000000000BB -:10F4C000000000000000000000000001000000003B -:10F4D000000000000000000000000000000000002C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D0000000400091889091C1C100000000000030 :10F4E000000000000000000000000000000000001C :10F4F000000000000000000000000000000000000C -:10F5000000000000000008000000000000004000B3 +:10F5000000000000000000000000000000000000FB :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB -:10F530000000000000010001C00100010000000007 -:10F54000000000000000000000000000000040007B -:10F5500000000000000000000000000000000000AB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F55000000000008003A141808591900000000020 :10F56000000000000000000000000000000000009B :10F57000000000000000000000000000000000008B -:10F5800000000000090000008000000005000000ED -:10F5900080000000000000000000000000000000EB +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B -:10F5B00000000000000000090040000400410000BD +:10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B -:10F5D00000000000400000000000000000000000EB +:10F5D000000000000000A108A1210300200300009A :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B -:10F6000000000000000000000002000000000020D8 -:10F6100000020000000000000000000000000000E8 +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA -:10F6300000000000000000000000000400000008BE +:10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA -:10F6500000000000000000000000000000000000AA +:10F650000000000000000000C0404101089040018F :10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A :10F68000000000000000000000000000000000007A -:10F690000001000000000000000000000000000069 +:10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A -:10F6B0000000000000000000000000100001000039 -:10F6C0000001000000000000000000000000000039 -:10F6D000000000000000000000000000000000002A -:10F6E000000000000000000000000000000000001A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D00000000000000000000000008100E00700C2 +:10F6E00000410000000000000000000000000000D9 :10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000600000700EC -:10F710000000000000001200000A000000000000CD +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 :10F7200000000000000000000000000000000000D9 -:10F7300000000000000000000000000000000020A9 -:10F7400004000000000000000000000000000000B5 -:10F750000000000000000020000060000000000029 -:10F760000000000000000000000000000000000099 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F750000000000000000000000000000000A80001 +:10F76000AAAA00FF00000000000000000000000046 :10F770000000000000000000000000000000000089 :10F780000000000000000000000000000000000079 :10F790000000000000000000000000000000000069 :10F7A0000000000000000000000000000000000059 :10F7B0000000000000000000000000000000000049 :10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 -:10F7E0000000000000000000000000000000000019 +:10F7D0000000000000000000000000000000A80081 +:10F7E00000005A5AA05F0000000000000000000066 :10F7F0000000000000000000000000000000000009 :10F8000000000000000000000000000000000000F8 :10F8100000000000000000000000000000000000E8 @@ -94107,7 +94107,7 @@ :10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 -:10F860000000000000000000000000000000000098 +:10F860001500002AFFFF000000000000000000005B :10F870000000000000000000000000000000000088 :10F880000000000000000000000000000000000078 :10F890000000000000000000000000000000000068 @@ -94115,7 +94115,7 @@ :10F8B0000000000000000000000000000000000048 :10F8C0000000000000000000000000000000000038 :10F8D0000000000000000000000000000000000028 -:10F8E0000000000000000000000000000000000018 +:10F8E0000000000000000000FFFF0000000000001A :10F8F0000000000000000000000000000000000008 :10F9000000000000000000000000000000000000F7 :10F9100000000000000000000000000000000000E7 @@ -94123,229 +94123,229 @@ :10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 :10F9500000000000000000000000000000000000A7 -:10F960000000000000000000000000000000000097 +:10F9600000000000A06150300041000000000000D5 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 -:10F990000000000005000A28050000A005000A0874 -:10F9A000050000A0000000000000000000000000B2 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 :10F9B0000000000000000000000000000000000047 -:10F9C00000000000000000610A0F050900A000000F -:10F9D00000000000000000000000000000000061C6 -:10F9E0000007000D00000000000000000000000003 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E00000000000000035FF350080DF80FF0000D0 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 :10FA100000000000000000000000000000000000E6 :10FA200000000000000000000000000000000000D6 :10FA300000000000000000000000000000000000C6 -:10FA40000000000000000000000000003030003C1A +:10FA400000000000000000000000000000000000B6 :10FA500000000000000000000000000000000000A6 -:10FA60000000000000000000000000000000000096 +:10FA6000000000000000000035FF350000FF00FF2F :10FA70000000000000000000000000000000000086 :10FA80000000000000000000000000000000000076 :10FA90000000000000000000000000000000000066 :10FAA0000000000000000000000000000000000056 :10FAB0000000000000000000000000000000000046 -:10FAC00000000000000000000000000000003030D6 -:10FAD000003C0000000000000000000000000000EA -:10FAE0000000000000000000000000000000000016 -:10FAF0000000000000000000000000000000000006 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE00000000000000000000000BFBA1510FA7806 +:10FAF000FA78000000000000000000000000000094 :10FB000000000000000000000000000000000000F5 :10FB100000000000000000000000000000000000E5 :10FB200000000000000000000000000000000000D5 :10FB300000000000000000000000000000000000C5 :10FB400000000000000000000000000000000000B5 -:10FB5000AAAAAAAA000000000000000000000000FD -:10FB60000000000000000000000000000000000095 -:10FB70000000000000000000000000000000000085 +:10FB500000000000000000000000000000000000A5 +:10FB6000000000000000000000000000BFBA1510F7 +:10FB700050785078000000000000000000000000F5 :10FB80000000000000000000000000000000000075 :10FB90000000000000000000000000000000000065 :10FBA0000000000000000000000000000000000055 :10FBB0000000000000000000000000000000000045 :10FBC0000000000000000000000000000000000035 -:10FBD00000000F0FF0F00000000000000000000027 +:10FBD0000000000000000000000000000000000025 :10FBE0000000000000000000000000000000000015 -:10FBF0000000000000000000000000000000000005 +:10FBF00000000000000000042000000020000000C1 :10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000040000E0 -:10FC200000000000000000000000000000000002D2 -:10FC300000000000000000000000000000000004C0 +:10FC100000000000000000002000000020000000A4 +:10FC200000000000000400000000000000000001CF +:10FC30000000000000000000000020000000200084 :10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000000000000000A4 -:10FC60000000000000000000000000000000000094 -:10FC70000000000000000000000000000000100074 +:10FC50000000000000000000000020000000200064 +:10FC60000000000000000200000000000000000092 +:10FC70000000000000000000000100000000000083 :10FC80000000000000000000000000000000000074 :10FC90000000000000000000000000000000000064 :10FCA0000000000000000000000000000000000054 -:10FCB0000000000000000000000000000000000044 +:10FCB0000000000000000002000000000000000042 :10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 -:10FCE0000000000000000000100000000002000002 -:10FCF0000002000000000000000000000000000002 -:10FD000000000000000000000000000000000000F3 +:10FCE0000000000000000000100000000000000004 +:10FCF0000000000000000000000000800000000084 +:10FD000000200080000000000020000000000040F3 :10FD100000000000000000000000000000000000E3 :10FD200000000000000000000000000000000000D3 :10FD300000000000000000000000000000000000C3 :10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000000000000100010091 -:10FD70000100010000000000000000000000000081 -:10FD80000000000000000008000000000002000267 +:10FD60000000000000000000000000000000000093 +:10FD7000000000000000000000000000000400007F +:10FD8000000002A1002000000000000100000000AF :10FD90000000000000000000000000000000000063 -:10FDA000000000000000000800000000000000004B +:10FDA0000000020000000000000000000000000051 :10FDB0000000000000000000000000000000000043 -:10FDC000000000000000000000080000000000002B +:10FDC0000000000000000000000000000000000033 :10FDD0000000000000000000000000000000000023 -:10FDE00000000000000000000004000000002000EF -:10FDF00020002000200000000000000000000000A3 -:10FE000000000000000000000000000000000000F2 +:10FDE0000000000000000000000000000000000013 +:10FDF0000000000000000005000000030005048072 +:10FE000000080003000400000000002000000000C3 :10FE100000000000000000000000000000000000E2 :10FE200000000000000000000000000000000000D2 :10FE300000000000000000000000000000000000C2 :10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 -:10FE6000000000000000000000080000000000008A -:10FE70000000000000000000000000000000000082 -:10FE80000000000000000000000000000000000072 +:10FE5000000004000000000000000000000000009E +:10FE60000000000000000000000000000000000092 +:10FE7000000000000000000021820882008200844F +:10FE800080080001000000010000000000010000E7 :10FE90000000000000000000000000000000000062 :10FEA0000000000000000000000000000000000052 :10FEB0000000000000000000000000000000000042 :10FEC0000000000000000000000000000000000032 :10FED0000000000000000000000000000000000022 -:10FEE0000000000200000000000000000000000010 -:10FEF00000000000000011000000000000000000F1 -:10FF000000000000000000000000000000000000F1 +:10FEE0000000000000000000000000000000000012 +:10FEF00000000000000000000000900008800000EA +:10FF00000000100000800000000000000000000061 :10FF100000000000000000000000000000000000E1 :10FF200000000000000000000000000000000000D1 :10FF300000000000000000000000000000000000C1 :10FF400000000000000000000000000000000000B1 :10FF500000000000000000000000000000000000A1 :10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 +:10FF700000000000000000000000000000900020D1 +:10FF800000000000800000200000000000000000D1 :10FF90000000000000000000000000000000000061 :10FFA0000000000000000000000000000000000051 :10FFB0000000000000000000000000000000000041 :10FFC0000000000000000000000000000000000031 :10FFD0000000000000000000000000000000000021 :10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 +:10FFF00000000000000000000000000000000020E1 :020000040017E3 -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 +:10000000A003C020C003C0041004C0A0200400004E +:1000100000200020000000000000000000000000A0 :1000200000000000000000000000000000000000D0 :1000300000000000000000000000000000000000C0 :1000400000000000000000000000000000000000B0 :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 +:1000800000012100098500000001800100058001B8 +:10009000000000010001000000000000000000005E :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 :1000D0000000000000000000000000000000000020 -:1000E000000000A000000000000000000000000070 +:1000E00000000000000000001100000000000000FF :1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF +:100100000000820590034021089100080000820948 +:10011000900800000000000000090000000000003E :1001200000000000000000000000000000000000CF :1001300000000000000000000000000000000000BF :1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F +:10018000000000000000000000000020000100004E +:10019000000000010000000000000000000000005E :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F :1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE +:10020000000000000000A0040090000000A0100208 +:100210000090008200A01000009000A002020000E8 :1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E -:100280000000A000000000000000000000000000CE -:10029000000000000000000000000000000000005E +:10028000000000000000000000800080000000006E +:10029000838540832000000580000080000080806E :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE -:1003000000000000000009000000000000000000E4 -:1003100000000000000000000000000000000000DD -:1003200000000000000000000000000000000000CD +:1003000000000000000000000000000000050000E8 +:100310008000058003211100C1C0800000408000E2 +:10032000800000000000000000000000000000004D :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D -:100380000000000000090000000300000000000061 -:10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D +:100380000000000000000000000000000400A000C9 +:10039000C000900082902100A1009188020000001E +:1003A00004009000000000000000000000000000B9 :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD -:1004000000000000000000000000000100000000EB -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC +:10040000000000000000000000000000000040109C +:100410000004029002A0C0A000820083019102406B +:10042000000200A004000000000000000000000026 :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C -:100480000000000000000000000008000000010063 -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C +:10048000000000000000000000000000000000006C +:10049000808000808080800080050003000511C1FD +:1004A00080000080000080000000000000000000CC :1004B000000000000000000000000000000000003C :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC -:10050000000000000000000000000000800000006B -:10051000410000000000000000000000000000009A -:1005200000000000000000000000000000000000CB +:1005000000000000000000000000000000000000EB +:1005100000008009800000000000C1099180008077 +:100520008500800000000080000000000000000046 :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B +:100590000000000090002090A082400091412104C2 +:1005A000820408009000A0A0A0024000000000000B :1005B000000000000000000000000000000000003B :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA -:1006200000000000000000000000000000000000CA +:1006100000000000000000000000070000000000D3 +:1006200000E007006000000000000700000000007C :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A -:10069000410000E00000000A00000000000000002F -:1006A000000000000000000000000000000000004A +:100690000000000000000000FF0FF0003636FF00F1 +:1006A000FF0FF000FC66C0663CFF3C00F066F066A1 :1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 +:10071000000000000000000000003F3F303036368F +:10072000FF003F3F3030FC66C066F0FFF0003C66E3 +:100730003C66000000000000000000000000000017 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 @@ -94359,41 +94359,41 @@ :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000000000D8 -:1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 +:10081000000000000000000000000000000024E7CD +:100820003CFF0000FFEF0CFC0FFF0000EFFF0EFE8F +:100830000EFE2424BDBD00000000000000000000EA :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 +:1008A00000C318DB0030FFFF0CFC00F01800FFFF56 +:1008B00002F202F2006699FF000000000000000052 :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 +:100920000000000000000000000000400001000086 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 -:1009900000000000000000000000000000610007EF -:1009A000800D0000000000000000000000000000BA -:1009B0000000000000000000000000000000000037 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000005555FF009E +:1009B00000FFF0F000000000000000000000000058 :1009C0000000000000000000000000000000000027 :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000000B6 +:100A20000000000000000000000000000000D7D718 +:100A3000FFC3C3FFF3F3000000000000000000004C :100A400000000000000000000000000000000000A6 :100A50000000000000000000000000000000000096 :100A60000000000000000000000000000000000086 @@ -94401,7 +94401,7 @@ :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000000000000036 +:100AB000FF00FFC300FFF0F0000000000000000096 :100AC0000000000000000000000000000000000026 :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 @@ -94409,7 +94409,7 @@ :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 +:100B30000000FF00FFC3C3FFF3F30000000000004C :100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 :100B60000000000000000000000000000000000085 @@ -94417,88 +94417,88 @@ :100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000400000000000031 -:100BC000000000000000000000040004000000001D -:100BD0000000000000000000000000000000000015 -:100BE00000000000000000000004000400000000FD -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000200000000E2 -:100C100000000000000000000000000400000000D0 -:100C200000000000000000000000000400040000BC +:100BB0000000000000000000000000040000000031 +:100BC0000000000000000000000800040000000019 +:100BD00000004000000000000004000400000000CD +:100BE00000000000000000000004400400010000BC +:100BF00000000000400000000000000400040000AD +:100C00000000000088000000000000042004000034 +:100C100000000000200000000000000400040000AC +:100C2000000000002000000000000004200400007C :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000020000000092 -:100C60000000000000000000000000000002000082 -:100C70000000000000000000000000000002000270 -:100C8000000000000000000000000000400400041C -:100C90000000000000000000000000004002000012 -:100CA0000000000200000000000000000000000240 -:100CB0000000000000000000000000000000000034 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000020000000000000000000072 +:100C80000000000000000000000000000000000064 +:100C90000000000000000004000000000000000050 +:100CA0000000000000000000000000000000000044 +:100CB00000000000000000000080000000000000B4 :100CC0000000000000000000000000000000000024 -:100CD00000000000001000100000000000000000F4 -:100CE0000000000000000000000000000000000004 +:100CD0000000000000000000020000000000000012 +:100CE0000080000000000000000000000000000084 :100CF00000000000000000000000000000000000F4 -:100D000002000000000000000000000000000000E1 +:100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 -:100D200002000000000000000000000000000000C1 -:100D300000000000000000000000000400040000AB -:100D40000000000000000000000000080008000093 -:100D50000002000000000000000000000000000091 -:100D6000000000000000000000000002000200007F -:100D70000200000000000000000000000000000071 -:100D8000040004000000000000000000000000005B -:100D90000000020000000000000000000000000051 -:100DA000040004000000000000000000000000003B -:100DB0000000020000000000000000000000000031 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000800000000AB +:100D4000400000080000000000000000000000005B +:100D50000000000000000000000000000000000093 +:100D6000000000400000000000000000000000083B +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D9000000800000000000000000000000000004B +:100DA0000000000000000000000000000000000043 +:100DB000000200000000A000000008000000000089 :100DC0000000000000000000000000000000000023 :100DD0000000000000000000000000000000000013 -:100DE00004000000000000000000000000000000FF +:100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 -:100E100000000000000004000000000000000000CE +:100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 +:100E300000000000000000000800030000000000A7 :100E400000000000000000000000000000000000A2 :100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 :100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 -:100EA000000000000000000000080000000000003A +:100EA0000000000000000000000000000000000042 :100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 +:100EC00000000000010000800000000000000000A1 :100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 +:100EE0000000000000000000000000000000010001 :100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 +:100F000008000000000000000000000000000000D9 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 +:100F4000000000000000200000040000000000007D :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 +:100F7000040000000000000000000000000000006D :100F80000000000000000000000000000000000061 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 +:100FB00000000000000000000000000000000041F0 +:100FC0000000900000000000000000000000000091 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 +:100FF00000200000000000000000000000000000D1 +:1010000000000000000000000009000000000000D7 :1010100000000000000000000000000000000000D0 :1010200000000000000000000000000000000000C0 :1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 +:101040000800000000000000000000000000000098 :101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 +:10107000000000010000000000000000000000006F :101080000000000000000000000000000000000060 :101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B00000000000000000000000000000900000A0 -:1010C0000000000000000000000000000000000020 +:1010A000000000000000000400000000000000003C +:1010B0000000000000000000000000000000000030 +:1010C000001100000000000000000000000000000F :1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 @@ -94510,79 +94510,79 @@ :10115000000000000000000000000000000000008F :10116000000000000000000000000000000000007F :10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F +:1011800000000000000000000082000000000000DD :10119000000000000000000000000000000000004F :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F +:1011C000000000000000000000000000010000001E :1011D000000000000000000000000000000000000F :1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF +:1011F0000000000000009000000800000000000057 :1012000000000000000000000000000000000000DE :1012100000000000000000000000000000000000CE :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E +:10124000000000000000000000000000000011008D +:10125000210000000000000000000000000000006D :10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E +:1012700000000000000011008000000000000000DD :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E +:1012D0000041090000030080000000000000000041 :1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE +:1012F00000000000000000000000008000000080EE :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD :1013200000000000000000000000000000000000BD :1013300000000000000000000000000000000000AD :10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D +:101350000000000101000000008800000000000003 :10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D +:10137000000000000000000000000000002000004D +:1013800000C000000000000000000000000000009D :10139000000000000000000000000000000000004D :1013A000000000000000000000000000000000003D :1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D +:1013D0000000000000008800000001000000000084 :1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC +:1013F0000000000000000000000000000100008864 +:101400008800010000000000000000000000000053 :1014100000000000000000000000000000000000CC :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C +:10145000000000000000000000000000410000004B :10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C +:10147000000000000000000000000000000041002B +:1014800000800000090000000000000000000000D3 :10149000000000000000000000000000000000004C :1014A000000000000000000000000000000000003C :1014B000000000000000000000000000000000002C :1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C +:1014D00000000000000000000000001108000000F3 :1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB +:10150000001100000080000000000000000000004A :1015100000000000000000000000000000000000CB :1015200000000000000000000000000000000000BB :1015300000000000000000000000000000000000AB :10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B +:101550000000000000000000000000000001010089 :10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B +:10158000000000010000004000000000000000001A :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B :1015B000000000000000000000000000000000002B :1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB +:1015D000000000000000000000000000000000E02B +:1015E0000000814100000000000000000000000039 :1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA +:101600000000000000000000070082210000000030 :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA :1016300000000000000000000000000000000000AA @@ -94590,7 +94590,7 @@ :10165000000000000000000000000000000000008A :10166000000000000000000000000000000000007A :10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A +:1016800000000000000000000000F0F0000000007A :10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A @@ -94598,7 +94598,7 @@ :1016D000000000000000000000000000000000000A :1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 +:10170000000000000000000000000000F0F00000F9 :1017100000000000000000000000000000000000C9 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 @@ -94606,29 +94606,29 @@ :101750000000000000000000000000000000000089 :101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 +:101780000000000000000000000000000F0F00003B +:10179000FFFF00000000000000000000000000004B :1017A0000000000000000000000000000000000039 :1017B0000000000000000000000000000000000029 :1017C0000000000000000000000000000000000019 :1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 -:1018000000000000000000000000000000000000D8 +:1018000000000000000000000000000000000F0FBA :1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 :1018300000000000000000000000000000000000A8 :101840000000000000000000000000000000000098 :101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 +:1018600000000000000000400006000C0000000026 :101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 +:101880000000000000000000000000000000050053 +:101890002A00054000A80000000000000000000031 :1018A0000000000000000000000000000000000038 :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 +:1018E000000000000000000000000F0FFFFF0000DC :1018F00000000000000000000000000000000000E8 :1019000000000000000000000000000000000000D7 :1019100000000000000000000000000000000000C7 @@ -94636,7 +94636,7 @@ :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 :101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 +:101960000000000000000000000000000F0F000059 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 :101990000000000000000000000000000000000047 @@ -94645,7 +94645,7 @@ :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 :1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 +:1019F000F0F0000000000000000000000000000007 :101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 :101A200000000000000000000000000000000000B6 @@ -94653,31 +94653,31 @@ :101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 :101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 +:101A70000000F0F000000000000000000000000086 :101A80000000000000000000000000000000000056 :101A90000000000000000000000000000000000046 :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000040000000000000000B1 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000400000000000091 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 +:101AE00000000000000000000000000000002000D6 +:101AF00000000000000020000000000000002000A6 +:101B00000000000000002000000000000000200095 +:101B10000000000000002000000000000000200085 +:101B200000000000000004000000000000000000B1 +:101B300020040000000000000000000020008800D9 +:101B400020000000000000008800000000000000ED +:101B50002000000000000000000000002000200025 +:101B60002000000000000000400000000000000015 :101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 -:101B90000000004000000000000000000000000005 -:101BA000000400000000000000020000000000002F -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000400000000000000000000000001 -:101BE00000020000000000000000000000000000F3 -:101BF00000000000000000000000000000000000E5 +:101B90000000000000000004000000000000000041 +:101BA00000000000008200000000000000000000B3 +:101BB00000000000000000000000000000008000A5 +:101BC000000400000000000200040000000000000B +:101BD0000004000000000000000000000000000001 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000010000000000000D5 :101C000000000000000000000000000000000000D4 :101C100000000000000000000000000000000000C4 :101C200000000000000000000000000000000000B4 @@ -94686,11 +94686,11 @@ :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 :101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000200000052 +:101C80000000000000000000000000000400000050 :101C90000000000000000000000000000000000044 :101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 +:101CC00000000000000000000000000000002000F4 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 :101CF00000000000000000000000000000000000E4 @@ -94701,7 +94701,7 @@ :101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 :101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 +:101D70000000000000000000001000000000000053 :101D80000000000000000000000000000000000053 :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 @@ -94713,40 +94713,40 @@ :101E000000000000000000000000000000000000D2 :101E100000000000000000000000000000000000C2 :101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 +:101E300000000000000000000000C00000000000E2 +:101E40000000000009000000000000000000000089 :101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 +:101E7000000000000800000000000000000000005A :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 :101EA0000000000000000000000000000000000032 :101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 +:101EC000000000000000040000000000000000000E :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 :101F000000000000000000000000000000000000D1 :101F100000000000000000000000000000000000C1 :101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 +:101F30000000000000000800000000000000000099 +:101F40000000080004000080000000000000040001 +:101F50000020000000000000000000000000000061 :101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 +:101F800000C000000000008400900000000000007D :101F90000000000000000000000000000000000041 :101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 +:101FB000008400000000000000000000000000009D +:101FC00000000000800080000020000000000000F1 +:101FD0008000000100000000000000000000000080 :101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000400000000000000DD +:101FF00000000000000000000000000000000000E1 :1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 +:1020100000020000000000000000000000000000BE :1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 +:10203000000000000000000000000002000000009E +:102040000000000088000000000004000000000004 :102050000000000000000000000000000000000080 :102060000000000000000000000000000000000070 :102070000000000000000000000000000000000060 @@ -94754,24 +94754,24 @@ :102090000000000000000000000000000000000040 :1020A0000000000000000000000000000000000030 :1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 +:1020C0000000000000000000000000008000000090 :1020D0000000000000000000000000000000000000 :1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 +:1020F00000000000050005000000000000000000D6 :1021000000000000000000000000000000000000CF :1021100000000000000000000000000000000000BF :1021200000000000000000000000000000000000AF :10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F +:1021400000000000000000000000000090000000FF +:1021500000000000900000000000000000000000EF :10216000000000000000000000000000000000006F :10217000000000000000000000000000000000005F :10218000000000000000000000000000000000004F :10219000000000000000000000000000000000003F :1021A000000000000000000000000000000000002F :1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF +:1021C0000000000000000000000000000800800087 +:1021D0000000000000038010000500030000000064 :1021E00000000000000000000000000000000000EF :1021F00000000000000000000000000000000000DF :1022000000000000000000000000000000000000CE @@ -94779,23 +94779,23 @@ :1022200000000000000000000000000000000000AE :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E +:1022500000910000008000000000000000800000ED +:1022600000800000000000000000000000000000EE :10227000000000000000000000000000000000005E :10228000000000000000000000000000000000004E :10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E :1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE +:1022C000000000000000000200000000000000000C +:1022D000000000C0000000040000001000000040EA +:1022E00000000002000000000000000000000000EC :1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD :1023100000000000000000000000000000000000BD :1023200000000000000000000000000000000000AD :10233000000000000000000000000000000000009D :10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D +:10235000000000000000C000000000000000C100FC :10236000000000000000000000000000000000006D :10237000000000000000000000000000000000005D :10238000000000000000000000000000000000004D @@ -94803,32 +94803,32 @@ :1023A000000000000000000000000000000000002D :1023B000000000000000000000000000000000001D :1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD -:1023E00000000000000000000000000000000000ED +:1023D000000000001100000080000000000041002B +:1023E000910000000000000000000000000000005C :1023F00000000000000000000000000000000000DD :1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC :10243000000000000000000000000000000000009C :10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C +:102450000000000000008011002100000000212089 +:10246000110041000000000000000000000000001A :10247000000000000000000000000000000000005C :10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C :1024A000000000000000000000000000000000002C :1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC +:1024D00000000000000000009001000088000000E3 +:1024E00001000100010000000000000000000000E9 :1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB :10253000000000000000000000000000000000009B :10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B +:1025500000000000000000000000004100008200B8 +:102560008111818100418200001100000000000003 :10257000000000000000000000000000000000005B :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B @@ -94843,7 +94843,7 @@ :1026200000000000000000000000000000000000AA :10263000000000000000000000000000000000009A :10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A +:102650000000000000000000000000000000F0F09A :10266000000000000000000000000000000000006A :10267000000000000000000000000000000000005A :10268000000000000000000000000000000000004A @@ -94876,8 +94876,8 @@ :102830000000000000000000000000000000000098 :102840000000000000000000000000000000000088 :102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 +:1028600000000000000005000A30050000A0006123 +:102870000A34C50D00A000000000000000000000A8 :102880000000000000000000000000000000000048 :102890000000000000000000000000000000000038 :1028A0000000000000000000000000000000000028 @@ -94885,7 +94885,7 @@ :1028C0000000000000000000000000000000000008 :1028D00000000000000000000000000000000000F8 :1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 +:1028F0000F0FFF00000000000000000000000000BB :1029000000000000000000000000000000000000C7 :1029100000000000000000000000000000000000B7 :1029200000000000000000000000000000000000A7 @@ -94893,7 +94893,7 @@ :102940000000000000000000000000000000000087 :102950000000000000000000000000000000000077 :102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 +:1029700000000F0FFF00000000000000000000003A :102980000000000000000000000000000000000047 :102990000000000000000000000000000000000037 :1029A0000000000000000000000000000000000027 @@ -94901,7 +94901,7 @@ :1029C0000000000000000000000000000000000007 :1029D00000000000000000000000000000000000F7 :1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 +:1029F00000000000000020000000000000000000B7 :102A000000000000000000000000000000000000C6 :102A100000000000000000000000000000000000B6 :102A200000000000000000000000000000000000A6 @@ -94912,67 +94912,67 @@ :102A70000000000000000000000000000000000056 :102A80000000000000000000000000000000000046 :102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 -:102AB000000000040004000000000000000000020C -:102AC0000002000400000000000000000000000000 -:102AD00000000004000400000000000000000000EE -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000400040000000000000000CE -:102B000000000000000000000000000000000000C5 -:102B100000000000000400040000000000000000AD -:102B200000000000000400000000000000000000A1 -:102B30000000000000000000000000000000000095 -:102B40000000000000000002000000000000000083 -:102B50000000000000000000000000000000000075 -:102B60000000000200000000000000000000000063 -:102B70000000000000004000000000000000000015 -:102B80000000000000004002000000000000000003 -:102B9000000000000000000800000000000000002D -:102BA0000000000000000002000000000000000023 -:102BB0000000000000000000000000000000001005 -:102BC00000100000000000000000000000000000F5 -:102BD00000000000000000000000020002000000F1 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000040000000000D1 -:102C000000000000000000000000040000000000C0 -:102C100000000000000000000000040000000000B0 -:102C2000000000000000000004000400000000009C -:102C3000000000000000000000000008000000008C +:102AA0000000000000000000000000002000000006 +:102AB00000000000200000000000000020000000D6 +:102AC00000000000040400000000000020000000DE +:102AD0000000000088080000000000002000000046 +:102AE000000000042004000200000000000020009C +:102AF000000000000004200400000000000020008E +:102B0000000000000004200400000000000020007D +:102B10000000000000042004000000000000200469 +:102B2000000000000004200400000000000000007D +:102B30000000000000000000000000000000410252 +:102B40000000000000000000000000000000000085 +:102B50000000000000002000000000000000410014 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000020000000053 +:102B80000000000000000000000000000000000243 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000002000200E1 +:102BF00002000200020002000200020002000200C5 +:102C000000400040020002000040000002000200FC +:102C100000400040020002000040004000000000B0 +:102C200000000000000000000000000000000000A4 +:102C3000000000000000000000000000000800008C :102C40000000000000000000000000000000000084 -:102C5000000000000000000000000008000000006C -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000002000052 -:102C80000000000000000000000004000000000040 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000200000022 +:102C50000000000000000000000000000002000072 +:102C600000000000000000000000000000008000E4 +:102C7000800080008000800080008000800880004C +:102C80008000000100018000800000010000800041 +:102C900080000001000180008000000100090000A8 +:102CA0000000000000000000000000000000000024 :102CB0000000000000000000000000000000000014 :102CC0000000000000000000000000000000000004 :102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 +:102CE00000000400000000000000000000000000E0 +:102CF0000000000000000000000000000000004094 +:102D00000000000200000000000000000000004081 +:102D100000000000000000001000000001000100A1 :102D200000000000000000000000000000000000A3 :102D30000000000000000000000000000000000093 :102D40000000000000000000000000000000000083 :102D50000000000000000000000000000000000073 :102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 +:102D700000000000009000000000000009000000BA +:102D800000010000000000000000008400000000BE +:102D90000001000000000000000080000000200092 +:102DA0002000000000000000000000000000000003 :102DB0000000000000000000000000000000000013 :102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 +:102DD00008000000000000000000000000000000EB :102DE00000000000000000000000000000000000E3 :102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 +:102E0000C00000218400000000000000000000005D :102E100000000000000000000000000000000000B2 :102E200000000000000000000000000000000000A2 :102E30000000000000000000000000000000000092 :102E40000000000000000000000000000000000082 :102E50000000000000000000000000000000000072 -:102E60000000000000000000000000400000000022 +:102E60000000000000000000000000000000000062 :102E70000000000000000000000000000000000052 :102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 @@ -94981,368 +94981,368 @@ :102EC0000000000000000000000000000000000002 :102ED00000000000000000000000000000000000F2 :102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 +:102EF0000000000000000000100010002000900002 +:102F000000000000C0400000100010002000200061 +:102F10000040000082408840100010002000200087 +:102F200000400000004000400000000000000000E1 :102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 +:102F4000000000000000000000000000000002007F :102F50000000000000000000000000000000000071 :102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 +:102F700000000000000000000000800080008000D1 +:102F8000000000000000000100848000800080003C +:102F9000800000010000000100018000800080002E +:102FA000800000010000000100010000000000009E :102FB0000000000000000000000000000000000011 :102FC0000000000000000000000000000000000001 :102FD00000000000000000000000000000000000F1 :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 +:103000000000200000400040000000000000000020 +:103010000000000201000040000000000008000065 +:103020000000000000000040000000000000000957 +:103030000009000000000000000000000000000087 :103040000000000000000000000000000000000080 :103050000000000000000000000000000000000070 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 +:10308000000000008000000100014100000000007D +:1030900000000000000040000001000000000000EF +:1030A000000000000000000000010000000000001F :1030B0000000000000000000000000000000000010 :1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 :1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F +:1031000001C102000001000000C000000000040234 +:1031100001C100011001000000C000000001000218 +:1031200001C100001000000001C00000000000020A :10313000000000000000000000000000000000008F :10314000000000000000000000000000000000007F :10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F +:10318000000011C1090208090000008000000000D1 +:10319000808011C10910880900000090001000080B +:1031A000009011C100418820000011802100000022 +:1031B000008000000000000000000000000000008F :1031C00000000000000000000000000000000000FF :1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E +:1032000000000000028041219002C1838000000381 +:1032100000008000208011219000C1808000000308 +:103220000000800040801121A009C1C18041090334 +:103230000009800000000000000000000000000005 :10324000000000000000000000000000000000007E :10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E :10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E +:10328000000000000000008800008500C1890200E5 +:1032900000000000C000008800008400C188020017 +:1032A00000000000C000008800008401C189020104 +:1032B00001000000C000000000000000000000004D :1032C00000000000000000000000000000000000FE :1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE :1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D +:10330000000000000000000040000190890101C1A0 +:1033100000000000000000C040000090890001C1D2 +:1033200000000002000000C040000190890001C1BF +:1033300000000802000001C00000000000000000C2 :10334000000000000000000000000000000000007D :10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D +:10338000000000000000000000008009038290108F +:1033900009C100000000000000808020109085001E +:1033A00009C1000000800000008080400389902057 +:1033B00009C1000080800000418000000000000082 :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED :1033E00000000000000000000000000000000000DD :1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C +:103400000000000000000000000000004141100921 +:10341000030000118000000000000000C10010093E +:10342000030020118000000000000000C10010090E +:1034300003000011800000110000000000000000E7 :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C :10346000000000000000000000000000000000005C :10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C +:10348000000000000000000000000000000001013A +:10349000010101000000C000000000000000C100A8 +:1034A000000101000000C000000000000000C10099 +:1034B000010101000000C000000100000000000048 :1034C00000000000000000000000000000000000FC :1034D00000000000000000000000000000000000EC :1034E00000000000000000000000000000000000DC :1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B +:10351000810000E000004100000000000000000009 +:10352000600000E00000000000000000000000005B +:10353000600000E000000006000000E00000818262 :10354000000000000000000000000000000000007B :10355000000000000000000000000000000000006B :10356000000000000000000000000000000000005B :10357000000000000000000000000000000000004B :10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB +:103590000000FFFFFFFF0000F0F00000FFFF000051 +:1035A000FFFF0000FFFF0000F0F00000FFFF000041 +:1035B000F0F00000FFFF0000F0F00000FFFF00004F +:1035C000F0F000000000000000000000000000001B :1035D00000000000000000000000000000000000EB :1035E00000000000000000000000000000000000DB :1035F00000000000000000000000000000000000CB :1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A -:10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A +:1036100000000000000000000000F0F000000000CA +:1036200000000000000000000000F0F000000000BA +:103630000000F0F0000000000000F0F000000000CA +:103640000000F0F00000000000000000000000009A :10365000000000000000000000000000000000006A :10366000000000000000000000000000000000005A :10367000000000000000000000000000000000004A :10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA +:10369000000000000000FFFF0000FF0000003C3CB5 +:1036A00000003C3C0000FFFF0000FF0000003C3C2D +:1036B00000003C3C0000FFFF0000FF0000003C3C1D +:1036C0000000C3C3FFFF0000000000000000000076 :1036D00000000000000000000000000000000000EA :1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 +:10371000000000000000000000000000FF000000AA +:103720003C3C00003C3C000000000000FF000000AA +:103730003C3C00003C3C000000000000FF0000009A +:103740003C3C0000C3C3FFFF00000000000000007D :103750000000000000000000000000000000000069 :103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 :103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 +:1037900000000000000000000000400280018020C6 +:1037A00092024082800000209202408280018020AC +:1037B000920240E38006002D920240828001802028 +:1037C000920240E28006002C82020000000000000D :1037D00000000000000000000000000000000000E9 :1037E00000000000000000000000000000000000D9 :1037F00000000000000000000000000000000000C9 :1038000000000000000000000000000000000000B8 :1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 +:103820000F000C0000000000000000000041000339 +:10383000030302020000000000000000000000007E +:10384000C000820000000000FFFF00000000000038 :103850000000000000000000000000000000000068 :103860000000000000000000000000000000000058 :103870000000000000000000000000000000000048 :103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 +:1038900000000000000000000000000000000055D3 +:1038A000000F00000C0000000000000000000041BC +:1038B00000030000020200000000000000000055AC +:1038C000000FC000820000000000000000000000A7 :1038D00000000000000000000000000000000000E8 :1038E00000000000000000000000000000000000D8 :1038F00000000000000000000000000000000000C8 :1039000000000000000000000000000000000000B7 :1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 +:10392000000000000C000A00000000000000000081 +:10393000000A00AAC00082000C0000000000000085 +:1039400000000000C000820000000000F0F0000055 :103950000000000000000000000000000000000067 :103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 :103980000000000000000000000000000000000037 :103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 +:1039A0000000000F00550C000A000000000000009D +:1039B0000000000A0000C00082000C0000000000AF +:1039C0000000F0005050C000820000000000F0F045 :1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000040000000400040000000000000000000F6 -:103A100000000000000000000000000000000000A6 -:103A20002000000000002000200000040000000032 -:103A30000000000400000000000000000000000082 -:103A400000002000400020002000000000000000D6 -:103A5000000000040000000000000004000000005E +:1039E00000000000000000002000000000000000B7 +:1039F0000400000000000000400000000000000083 +:103A00002000000000000000200000000000000076 +:103A1000040000000000000020000000000000047E +:103A2000200000020000A0000000200000000000B4 +:103A30000000200000000000000020040000000042 +:103A40000000200000000000000420000000000032 +:103A5000000404000000000000040000000000005A :103A60000000200000000000000000000000000036 -:103A700000400000000000000000000000024002C2 +:103A70000000000000000000000000000000000046 :103A80000000000000000000000000000000000036 :103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 +:103AA0000000000000000000000000040000000012 +:103AB0000000000000000000000000000000000204 :103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000200000000E4 -:103AE00000020000000200000000000004000000CE +:103AD00000000000200000000000000200000000C4 +:103AE00000000000000000000000000000000000D6 :103AF00000000000000000000000000000000000C6 :103B000000000000000000000000000000000000B5 -:103B10000000000090000000000000000000000015 +:103B100000000000000000000000000000000000A5 :103B20000000000000000000000000000000000095 :103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 +:103B40000000010000000000000000000000000074 :103B50000000000000000000000000000000000065 :103B60000000000000000000000000000000000055 :103B70000000000000000000000000000000000045 :103B80000000000000000000000000000000000035 -:103B90000000000000000400000000000000000021 +:103B90000000000000000000000000000000000025 :103BA0000000000000000000000000000000000015 :103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 +:103BC00000000000400000000000000000000000B5 :103BD00000000000000000000000000000000000E5 :103BE00000000000000000000000000000000000D5 :103BF00000000000000000000000000000000000C5 :103C000000000000000000000000000000000000B4 :103C100000000000000000000000000000000000A4 :103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 +:103C30000000000082000000000000000000000002 +:103C400000000000000000000000000000800000F4 +:103C500000800000000000020000002000000020A2 +:103C60000000002000000000000000000000000034 +:103C7000000000000000000000000800000000003C :103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 +:103C9000000000000000000000000800000000001C :103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 +:103CB00000000000000041000000000000002100A2 +:103CC00000000000000000000020040000A0002010 +:103CD00000000020000000000001000000010000C2 +:103CE00000010000000100000000000000000000D2 :103CF00000000000000000000000000000000000C4 :103D000000000000000000000000000000000000B3 :103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 +:103D20000000000000001000000000000000000083 +:103D30000000000000000000040004000400040073 +:103D4000000000000000040082000000C00000002D :103D50000000000000000000000000000000000063 :103D60000000000000000000000000000000000053 :103D70000000000000000000000000000000000043 :103D80000000000000000000000000000000000033 :103D90000000000000000000000000000000000023 :103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 +:103DB0000000000000000000000080008000800083 +:103DC00080000000000000008000000000000000F3 :103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 +:103DE00000000000000000000008000000000000CB :103DF00000000000000000000000000000000000C3 :103E000000000000000000000000000000000000B2 :103E100000000000000000000000000000000000A2 :103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 +:103E3000000000000000400000000000040000003E +:103E400000000000000004000000C00000000000AE +:103E5000C000008000000020A000820000000000E0 +:103E600082000000000000000000000000000000D0 +:103E70000000A000000000000000000000000000A2 :103E80000000000000000000000000000000000032 :103E90000000000000000000000000000000000022 :103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 +:103EB000000000000000000040000000002003009F +:103EC0000000000000002100800000000000000051 +:103ED00000000400002000000801000000000000B5 +:103EE00000000000002000000000000000000000B2 :103EF00000000000000000000000000000000000C2 :103F000000000000000000000000000000000000B1 :103F100000000000000000000000000000000000A1 :103F20000000000000000000000000000000000091 :103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 +:103F4000C0000000000000000400000004000000A9 +:103F500000000000C000000000000021000004215B +:103F60000000000000000000002000000020080009 :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 :103F90000000000000000000000000000000000021 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 +:103FC00000000000000000000000800000008000F1 :103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 +:103FE0008000000000000000000000090008000937 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 :104020000000000000000000000000000000000090 :104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 +:104040000000000000C000900000000000C00090D0 +:104050000000000000C001900000000100C00090BE +:104060000000000000C000910000000000C00090AF :104070000000000000000000000000000000000040 :104080000000000000000000000000000000000030 :104090000000000000000000000000000000000020 :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 +:1040C0000000000000000080008000000000008070 +:1040D00000800000000000831182000500200080A5 +:1040E00000800000000000890091000300000080B3 +:1040F0000080000000000000000000000000000040 :1041000000000000000000000000000000000000AF :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F :10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F +:1041400000000000000000000000800000008080EF +:10415000000080000000808000808000000380A1BB +:10416000000080000000808000008000000080804F +:1041700000008000000080800000000000000000BF :10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F :1041A000000000000000000000000000000000000F :1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF +:1041C000000000000000000000000000820000006D +:1041D000C090000082000000C09000048200000037 +:1041E000C091000082000000C090004082000000EA +:1041F000C090000082000000C0900000000000009D :1042000000000000000000000000000000000000AE :10421000000000000000000000000000000000009E :10422000000000000000000000000000000000008E :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E +:10425000009000C000000000029000C000000000BC +:10426000019000C000000000009000C000000000AD +:10427000909000C000000000009000C0000000000E :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E :1042A000000000000000000000000000000000000E :1042B00000000000000000000000000000000000FE :1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE +:1042D000000000800080000000008080008000005E +:1042E0000940059140890000000000800080000026 +:1042F0000000C180008000000000008000800000FD :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D :10432000000000000000000000000000000000008D :10433000000000000000000000000000000000007D :10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D +:1043500080000000000000008011800000000000CC +:10436000A111C02111000300801180000000000095 +:10437000A111C100090005008011800000000000AB :10438000000000000000000000000000000000002D :10439000000000000000000000000000000000001D :1043A000000000000000000000000000000000000D :1043B00000000000000000000000000000000000FD :1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD +:1043D00000009000000000000000C001200000006C +:1043E0000000C101200001000100C0012000000008 +:1043F0000000C101200000000000C00120000000FA :1044000000000000000000000000000000000000AC :10441000000000000000000000000000000000009C :10442000000000000000000000000000000000008C :10443000000000000000000000000000000000007C :10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C +:1044500000000000000A000007000000002100002A +:104460000700000000110000070000000006000027 +:104470000700000000060000070000000006000022 +:104480000700000000000000000000000000000025 :10449000000000000000000000000000000000001C :1044A000000000000000000000000000000000000C :1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB +:1044D000000000000000FFFF0000FF000000FF00E0 +:1044E0000000FF000000FF000000FF000000FF00D0 +:1044F0000000FF000000FF000000FF000000FF00C0 +:104500000000FF00000000000000000000000000AC :10451000000000000000000000000000000000009B :10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B :10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B +:104550000000000000000000FFFF0000FF0000005E +:10456000FF000000FF000000FF000000FF0000004F +:10457000FF000000FF000000FF000000FF0000003F +:10458000FF000000FF00000000000000000000002D :10459000000000000000000000000000000000001B :1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB @@ -95355,34 +95355,34 @@ :10462000000000000000000000000000000000008A :10463000000000000000000000000000000000007A :10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A +:10465000000000000000000000000000000000FF5B +:1046600000000F0F000000FF00000F0F000000FF10 +:1046700000000F0F000000FF00000F0F000000FF00 +:1046800000000F0F000000FFFFFFF0F0000000002F :10469000000000000000000000000000000000001A :1046A000000000000000000000000000000000000A :1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 +:1046E00000FF00000F0F000000FF00000F0F000090 +:1046F00000FF00000F0F000000FF00000F0F000080 +:1047000000FF00000F0F000000FFFFFFF0F00000AF :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 :104730000000000000000000000000000000000079 :104740000000000000000000000000000000000069 :104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 +:10476000030203300C0092C0038203300C0092C09D +:1047700003E303360C0D92C0038203300C0092C099 +:1047800003E303360C0D92C0038203300C0082C099 :104790000000000000000000000000000000000019 :1047A0000000000000000000000000000000000009 :1047B00000000000000000000000000000000000F9 :1047C00000000000000000000000000000000000E9 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 +:1047F000000004000000000000F0000000000000C5 +:1048000000000400000000000000000000000000A4 :104810000000000000000000000000000000000098 :104820000000000000000000000000000000000088 :104830000000000000000000000000000000000078 @@ -95390,15 +95390,15 @@ :104850000000000000000000000000000000000058 :104860000000000000000000000000000000000048 :104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 +:104880000000000004000000000000000000000024 :104890000000000000000000000000000000000018 :1048A0000000000000000000000000000000000008 :1048B00000000000000000000000000000000000F8 :1048C00000000000000000000000000000000000E8 :1048D00000000000000000000000000000000000D8 :1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 +:1048F00000000000000004000000000000000000B4 +:104900000000000000000F00000000000000000098 :104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 @@ -95408,45 +95408,45 @@ :104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 :104990000000000000000000000000000000000017 -:1049A00000000000000000000000000400040000FF -:1049B00000000000000000000000000000040004EF -:1049C00000000000000000000000000000040000E3 -:1049D00000000000000000000000000000040004CF -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000002B5 -:104A000000020000000000000000000000000000A4 -:104A10000000000000000000000000000000000294 +:1049A00000000000000400000000000000040000FF +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000400000000000000000004DF +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000004C3 +:1049F00000040000000000000000000000000004AF +:104A0000000800000000000000000000000000049A +:104A1000000400000000000000000000000000048E :104A20000004000000000000000000000000000082 :104A30000000000000000000000000000000000076 -:104A40000008000000000000000000000004000258 -:104A5000000000000000000000000004000440000E -:104A6000000800000000000000000000000000003E -:104A700040020002000000000000000000000000F2 -:104A8000000400040000000000000000000000001E -:104A900000020000400000020000000000000000D2 -:104AA00000000008000000000800001000000000E6 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000200000000000044 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000000016 +:104AA00000080000000000000000000000000000FE :104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 +:104AC00000000000000000000000000000400000A6 :104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000040000000000000000000000000091 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B4000000000080000000000000000000000005D -:104B50000000000000000000000000000000000055 -:104B60000000000200020000000000000000000041 -:104B70000000000000000200000000000000000033 -:104B8000000000000000000800000000000000001D -:104B90000000000000000200000000000000000013 -:104BA0000000000000000002000000000000000003 +:104AE00000000000000000000000080008000000B6 +:104AF000000008008200000000000800080000001C +:104B00000000001000100000000000000000000085 +:104B10000000000000000000200000000000000075 +:104B20000000000000000008000000000000000875 +:104B30000008000000040000000000080000000859 +:104B40000008000000000004000000000000000455 +:104B50000004000000000000000000080000000247 +:104B60000002000000000000000000000000000043 +:104B7000000000000000000000000000000800002D +:104B80000000000000000000000000000000000025 +:104B9000000000000000000000008000000800008D +:104BA00000000000000000080000000000000000FD :104BB00000000000000000000000000000000000F5 :104BC00000000000000000000000000000000000E5 :104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 +:104BE00000000000000000000000000000002000A5 +:104BF0000000000000000000000000000000840031 +:104C00000000000000000000000000000000820022 :104C10000000000000000000000000000000000094 :104C20000000000000000000000000000000000084 :104C30000000000000000000000000000000000074 @@ -95462,7 +95462,7 @@ :104CD00000000000000000000000000000000000D4 :104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 +:104D0000000084000000000000000000000000001F :104D10000000000000000000000000000000000093 :104D20000000000000000000000000000000000083 :104D30000000000000000000000000000000000073 @@ -95481,7 +95481,7 @@ :104E000000000000000000000000000000000000A2 :104E10000000000000000000000000000000000092 :104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 +:104E3000000500000000000000000000000000006D :104E40000000000000000000000000000000000062 :104E50000000000000000000000000000000000052 :104E60000000000000000000000000000000000042 @@ -95496,9 +95496,9 @@ :104EF00000000000000000000000000000000000B2 :104F000000000000000000000000000000000000A1 :104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 +:104F20000000000000000000000000000000000879 :104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000000061 +:104F4000000000000500000000000000000000005C :104F50000000000000000000000000000000000051 :104F60000000000000000000000000000000000041 :104F70000000000000000000000000000000000031 @@ -95512,16 +95512,16 @@ :104FF00000000000000000000000000000000000B1 :1050000000000000000000000000000000000000A0 :105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 +:10502000000000000000000000000000000000017F +:10503000000100000000000000000000000000006F :105040000000000000000000000000000000000060 :105050000000000000000000000000000000000050 :105060000000000000000000000000000000000040 :105070000000000000000000000000000000000030 :105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 +:1050A00000000000000000000000000000000011EF +:1050B00000080008000000000000000000000000E0 :1050C00000000000000000000000000000000000E0 :1050D00000000000000000000000000000000000D0 :1050E00000000000000000000000000000000000C0 @@ -95529,15 +95529,15 @@ :10510000000000000000000000000000000000009F :10511000000000000000000000000000000000008F :10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F +:10513000000000000040000000000000000000002F :10514000000000000000000000000000000000005F :10515000000000000000000000000000000000004F :10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F +:10517000000000000000000000000000000000022D :10518000000000000000000000000000000000001F :10519000000000000000000000000000000000000F :1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF +:1051B00000040000000000010000000000000000EA :1051C00000000000000000000000000000000000DF :1051D00000000000000000000000000000000000CF :1051E00000000000000000000000000000000000BF @@ -95561,7 +95561,7 @@ :10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D :10532000000000000000000000000000000000007D -:10533000000000000000000000000000000000006D +:105330000000000000000921400041004000000082 :10534000000000000000000000000000000000005D :10535000000000000000000000000000000000004D :10536000000000000000000000000000000000003D @@ -95569,7 +95569,7 @@ :10538000000000000000000000000000000000001D :10539000000000000000000000000000000000000D :1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED +:1053B00000000000000000000001010000000100EA :1053C00000000000000000000000000000000000DD :1053D00000000000000000000000000000000000CD :1053E00000000000000000000000000000000000BD @@ -95577,7 +95577,7 @@ :10540000000000000000000000000000000000009C :10541000000000000000000000000000000000008C :10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000006C +:10543000000000000000000000000000004100002B :10544000000000000000000000000000000000005C :10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C @@ -95618,7 +95618,7 @@ :10569000000000000000000000000000000000000A :1056A00000000000000000000000000000000000FA :1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA +:1056C0000000000000610004000D00000000000068 :1056D00000000000000000000000000000000000CA :1056E00000000000000000000000000000000000BA :1056F00000000000000000000000000000000000AA @@ -95626,7 +95626,7 @@ :105710000000000000000000000000000000000089 :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 +:105740000000000000001400000000000000000045 :105750000000000000000000000000000000000049 :105760000000000000000000000000000000000039 :105770000000000000000000000000000000000029 @@ -95634,7 +95634,7 @@ :105790000000000000000000000000000000000009 :1057A00000000000000000000000000000000000F9 :1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 +:1057C00000000000000000000002000200000000D5 :1057D00000000000000000000000000000000000C9 :1057E00000000000000000000000000000000000B9 :1057F00000000000000000000000000000000000A9 @@ -95642,7 +95642,7 @@ :105810000000000000000000000000000000000088 :105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 +:1058400000000000000000000000C30FC30F0000B4 :105850000000000000000000000000000000000048 :105860000000000000000000000000000000000038 :105870000000000000000000000000000000000028 @@ -95650,54 +95650,54 @@ :105890000000000000000000000000000000000008 :1058A00000000000000000000000000000000000F8 :1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000004000400000000B0 -:1058F0000000000040000000000000000000000068 +:1058C000000000000000000000000000C30FC30F34 +:1058D0000000000000000000000000000040000088 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 :105900000000000000000000000000000000000097 -:105910000000000020000000000000000000000067 -:105920000000000000000000000000000000000077 -:10593000000000000004200000000000000400003F -:105940000000000000000000000000000000000057 -:105950000000000000002000000000000004000023 -:1059600000000000000000004000000010000000E7 -:1059700040004000000000000000000000000000A7 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000002000005 +:105910000000000000000000000000000001000086 +:105920000000000000000000000010040000000063 +:10593000000000080000000000000000000040001F +:105940000000000000040000000020000000000033 +:1059500040000008000000000000000400000001FA +:105960000000000010000000000000000000000027 +:105970000000000000000000000000000000000027 +:105980000000000000001000000000000000000007 +:105990000000000000000000000000000000000007 :1059A00000000000000000000000000000000000F7 -:1059B00040000000000000000000000000000000A7 +:1059B00000000000000000000000000200000000E5 :1059C00000000000000000000000000000000000D7 -:1059D0000000000000020000000000C00000000005 +:1059D00000000000000000000000000000000000C7 :1059E00000000000000000000000000000000000B7 :1059F00000000000000000000000000000000000A7 :105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000040082 +:105A10000000000000000000000000000000000086 :105A20000000000000000000000000000000000076 :105A30000000000000000000000000000000000066 :105A40000000000000000000000000000000000056 :105A50000000000000000000000000000000000046 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 +:105A60000000000800080000000000000000000026 +:105A70000000000000000000000000080008000016 +:105A8000000400040004000000000000000000000A +:105A90000000000000000000000000020002000002 :105AA00000000000000000000000000000000000F6 :105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000000000D6 -:105AD00000000000000000000000000000000000C6 -:105AE00000000000000000000000000000000000B6 +:105AC00000000000000000000000000000000400D2 +:105AD00000000000000000000004000000000000C2 +:105AE00000000000000000000000010000000000B5 :105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 :105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 +:105B200000000000000000008800000000000000ED :105B30000000000000000000000000000000000065 :105B40000000000000000000000000000000000055 :105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 +:105B60000000000000000000000000000400000031 :105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 :105B90000000000000000000000000000000000005 :105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000000000000000E5 +:105BB00000000020040000000000000000000000C1 :105BC00000000000000000000000000000000000D5 :105BD00000000000000000000000000000000000C5 :105BE00000000000000000000000000000000000B5 @@ -95708,32 +95708,32 @@ :105C30000000000000000000000000000000000064 :105C40000000000000000000000000000000000054 :105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 +:105C600000000041000000410000000000000000B2 :105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 :105C90000000000000000000000000000000000004 :105CA00000000000000000000000000000000000F4 :105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000080000CC +:105CC00000000000000000000000000000000000D4 :105CD00000000000000000000000000000000000C4 :105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 +:105CF0000020000000000000000000000000000084 :105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 :105D20000000000000000000000000000000000073 :105D30000000000000000000000000000000000063 :105D40000000000000000000000000000000000053 :105D50000000000000000000000000000000000043 -:105D600000000000000000000000840000000000AF -:105D70000000000000000000000000000000000023 +:105D60000000000000000000000000000000000033 +:105D70000000000100000000000000000000000022 :105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 :105DA00000000000000000000000000000000000F3 :105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 :105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 +:105DE00000A000000000008400000000000000008F +:105DF000000000000000000000000000000900009A :105E00000000000000000000000000000000000092 :105E10000000000000000000000000000000000082 :105E20000000000000000000000000000000000072 @@ -95741,7 +95741,7 @@ :105E40000000000000000000000000000000000052 :105E50000000000000000000000000000000000042 :105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 +:105E70000021000000000000000000000000000001 :105E80000000000000000000000000000000000012 :105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 @@ -95749,7 +95749,7 @@ :105EC00000000000000000000000000000000000D2 :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 +:105EF000000000000000900000880000000000008A :105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 :105F20000000000000000000000000000000000071 @@ -95757,7 +95757,7 @@ :105F40000000000000000000000000000000000051 :105F50000000000000000000000000000000000041 :105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 +:105F70000000000000001100800000000000000090 :105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 @@ -95765,7 +95765,7 @@ :105FC00000000000000000000000000000000000D1 :105FD00000000000000000000000000000000000C1 :105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 +:105FF00000000000000000000000008000000080A1 :106000000000000000000000000000000000000090 :106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 @@ -95773,24 +95773,24 @@ :106040000000000000000000000000000000000050 :106050000000000000000000000000000000000040 :106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 +:106070000000000000000000000000000020000000 +:1060800000C0000000000000000000000000000050 :106090000000000000000000000000000000000000 :1060A00000000000000000000000000000000000F0 :1060B00000000000000000000000000000000000E0 :1060C00000000000000000000000000000000000D0 :1060D00000000000000000000000000000000000C0 :1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F +:1060F0000000000000000000000000000100008817 +:106100000800010000000000000000000000000086 :10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F :10614000000000000000000000000000000000004F :10615000000000000000000000000000000000003F :10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F +:1061700000000000000000000000000000004100DE +:106180000080800009000000000000000000000006 :1061900000000000000000000000000000000000FF :1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF @@ -95798,7 +95798,7 @@ :1061D00000000000000000000000000000000000BF :1061E00000000000000000000000000000000000AF :1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E +:1062000000110000008000000000000000000000FD :10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E @@ -95806,7 +95806,7 @@ :10625000000000000000000000000000000000003E :10626000000000000000000000000000000000002E :10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E +:1062800000000001000000400000000000000000CD :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE @@ -95814,7 +95814,7 @@ :1062D00000000000000000000000000000000000BE :1062E00000000000000000000000000000000000AE :1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D +:1063000000000000000000000700822100000000E3 :10631000000000000000000000000000000000007D :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D @@ -95822,7 +95822,7 @@ :10635000000000000000000000000000000000003D :10636000000000000000000000000000000000002D :10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D +:10638000000000000000000000000000F0F000002D :1063900000000000000000000000000000000000FD :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD @@ -95830,7 +95830,7 @@ :1063D00000000000000000000000000000000000BD :1063E00000000000000000000000000000000000AD :1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C +:106400000000000000000000000000000000F0F0AC :10641000000000000000000000000000000000007C :10642000000000000000000000000000000000006C :10643000000000000000000000000000000000005C @@ -95846,15 +95846,15 @@ :1064D00000000000000000000000000000000000BC :1064E00000000000000000000000000000000000AC :1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B +:106500000000000000000000000000000F0F00006D +:10651000FFFF00000000000000000000000000007D :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B :10656000000000000000000000000000000000002B :10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B +:1065800000000000000000000000000000000F0FED :1065900000000000000000000000000000000000FB :1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB @@ -95863,7 +95863,7 @@ :1065E00000000000000000000000000000000000AB :1065F000000000000000000000000000000000009B :10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A +:1066100005002A00054000A800000000000000005E :10662000000000000000000000000000000000006A :10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A @@ -95903,162 +95903,162 @@ :106860000000000000000000000000000000000028 :106870000000000000000000000000000000000018 :106880000000000000000000000000000000000008 -:1068900000000000000000000000000400040004EC -:1068A00000040000000000080000000020000000BC -:1068B000000000804088C004880000004000000004 -:1068C00000000000000000048804400020000000D8 -:1068D0000000000020200004200000030000200031 -:1068E00000000000000400040004A0842000200038 -:1068F00088000000000020000000200000002000B0 -:106900000000880000000000000420042000200097 -:1069100000000000000020000000C0000001000195 -:106920000001000100000000000000000000000065 -:10693000000000000004000500000004000000004A -:106940000000000000000000400000000000000007 -:1069500000000000000000024000000000000000F5 -:106960000000000000000001000100000004000021 -:1069700000000000000000000000000200004000D5 -:106980000000000000000000000000000000000007 -:106990000000000000000000400040400000000037 +:1068900000000000000000000000000020000000D8 +:1068A00000040000200000040004000000000004B8 +:1068B00000000000000000040004000020000000B0 +:1068C0000000000000000000000000200080002008 +:1068D000000000020002000000040001000020008F +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000400040000200070 +:106900000000400000000000000400000000000043 +:10691000000000000000000000040004000000006F +:106920000000000000000000000000000000000067 +:106930000000000400000000000000000000000053 +:106940000000000000000000000000000005002022 +:106950000001000000000000000000000000000036 +:106960000000000000000000000000000000000225 +:106970000000000000000000000000000000000017 +:106980000000000400000000000000000000000003 +:1069900000000000000000000000000000000000F7 :1069A00000000000000000000000000000000000E7 -:1069B0000000000000000000000000800000000057 -:1069C00000000000000000000004000000000000C3 -:1069D0000040000000000000000000000000000077 -:1069E0000000000000000000000800050080020018 -:1069F0000000000000000000000000000000020095 -:106A00000000000000000000000000000000020084 -:106A10000000000000000000000000000200020072 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000000000000000000400C3 +:1069D000040004000480000000000000000000002B +:1069E000000000000000000002000200020002009F +:1069F000020402000000000000400040000000000F +:106A0000020002000000000002000200000000007E +:106A10000000000000000000000000000000000076 :106A20000000000000000000000000000000000066 -:106A3000000800000000000000000000000400004A -:106A4000000800000000000000000004000800082A -:106A500000400000000000000000000000000000F6 -:106A60000000008400000000000000000008000496 -:106A7000000800000004000000000000000000000A -:106A800004000000000000000000000800080000F2 -:106A900000080000000000000000000000000000EE -:106AA00004000000000000000000000000000000E2 -:106AB00000000000000000030000000000000000D3 +:106A3000000000080000000000100000000000003E +:106A40000000000000000000000000000000000046 +:106A5000800080088000802000000000000000000E +:106A60000000000000000000000000000000000026 +:106A70000000000000040000000000000000000012 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000008000000000000CE :106AC00000000000000000000000000000000000C6 :106AD00000000000000000000000000000000000B6 :106AE00000000000000000000000000000000000A6 -:106AF0000000000000050000000000000000002170 -:106B00000000000000000000000000000000000382 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 :106B10000000000000000000000000000000000075 -:106B20000000002100000000000000000000000044 +:106B20000000000000000000000000000000000065 :106B30000000000000000000000000000000000055 :106B40000000000000000000000000000000000045 :106B50000000000000000000000000000000000035 :106B60000000000000000000000000000000000025 :106B70000000000000000000000000000000000015 :106B80000000000000000000000000000000000005 -:106B900000000000000000000000080000000000ED -:106BA00000000000000000000000000004000000E1 -:106BB00000000000C0000000000000000000000015 -:106BC00000000000200000000000000000000000A5 -:106BD00000080000000000000008000000000000A5 -:106BE000000000000000000000000000A000000005 -:106BF0000088000800000000000000000000A00065 +:106B900000000000000000000000000000000000F5 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000000D5 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000040000000400040E5 +:106BF0000000004000100010000000000000000035 :106C00000000000000000000000000000000000084 -:106C10000000000000000021000000000000000053 -:106C200000000000A0000000000000000000800044 +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 :106C30000000000000000000000000000000000054 -:106C400000000000000080000000000000000000C4 +:106C40000000000000000000000000000000000044 :106C50000000000000000000000000000000000034 :106C60000000000000000000000000000000000024 -:106C700000000020000000000000000000000000F4 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA000000000000000000000008800000000005C +:106C70000000000000000000000000000000000014 +:106C800000000000000000000000000800080000F4 +:106C900000080000000000000000000000000000EC +:106CA00000000000000000000000000000000000E4 :106CB00000000000000000000000000000000000D4 -:106CC0008200000000030000000000080000002017 +:106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 :106CE00000000000000000000000000000000000A4 -:106CF000A0000000000000000020040000050000CB +:106CF0000000000000000000000000000000000094 :106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000003000070 -:106D2000000000000000000000000008000000005B -:106D30000000000000000000000000000000000053 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D3000000000A0000000000000000000000000B3 :106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000018000000092 +:106D6000000000000000000000000000000004001F +:106D70000000000000000000000000000000000013 :106D80000000000000000000000000000000000003 :106D900000000000000000000000000000000000F3 :106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000008000000080000C3 +:106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE000000000000000000000000800000000009B -:106DF000000000000000000000000000000008008B -:106E00000000000000000000004100000000000041 +:106DD00000000000000000000800000000000000AB +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 :106E10000000000000000000000000000000000072 -:106E20000000000008000000000000000000080052 -:106E30000008000000000000000000080000000042 -:106E400000000000000000000000008200000000C0 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 :106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 +:106E700000000000004000000000000000000000D2 :106E80000000000000000000000000000000000002 :106E900000000000000000000000000000000000F2 :106EA00000000000000000000000000000000000E2 -:106EB0000000010090000000000000000000000041 -:106EC00000000000000000000000010000000000C1 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 :106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000900002 +:106EE000000000000400000000000000000000009E +:106EF0000000000000000000000000000000000092 :106F00000000000000000000000000000000000081 :106F10000000000000000000000000000000000071 :106F20000000000000000000000000000000000061 -:106F300000000000100080000200000000000000BF -:106F40000000000000000000000000000800000039 -:106F50001100000000000000000000000000000020 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000110000 -:106F80008000110000000000000000000000000070 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F600000000000000080000000000000000000A1 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 :106F900000000000000000000000000000000000F1 :106FA00000000000000000000000000000000000E1 -:106FB00000000000000000100080000300800000BE -:106FC0000000000000000000000000000000004180 -:106FD0000000004100000000000000000000000070 -:106FE00000000000000000000000000000000000A1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000080000000800000A1 :106FF0000000000000000000000000000000000091 -:107000000008000000410000000000000000000037 +:107000000000000000000000000000000000000080 :107010000000000000000000000000000000000070 :107020000000000000000000000000000000000060 -:107030000000000000000000000000200001000827 +:107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 -:10705000000100000000000000000000000000002F -:107060000000000000000000000000000000000020 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000C000000082DE :107070000000000000000000000000000000000010 -:107080000000000100900000000800000000000067 +:107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 :1070A00000000000000000000000000000000000E0 -:1070B0000000000000000000000000002000900020 -:1070C00001000000000000000000000000000000BF -:1070D00000000000900120000000000000000000FF -:1070E00000000000000000000000000000000000A0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E0000000000000000000000001000000C000DF :1070F0000000000000000000000000000000000090 -:10710000000000000000C0001000000000000200AD +:10710000000000000000000000000000000000007F :10711000000000000000000000000000000000006F :10712000000000000000000000000000000000005F -:1071300000000000000000000000000020008000AF -:10714000000005000000000000000000000000003A -:107150000000000000000008000011000000000016 -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F -:107180000000000000000800800000004100000036 -:10719000800000000000000000000000000000006F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:1071600000000000000000000000000041000000DE +:10717000800000000000000000000000000000008F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF :1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000011BE -:1071C00000090011000000000000000000000000A5 +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF :1071D00000000000000000000000000000000000AF :1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F -:10720000000000000000000000000002000000007C +:10720000000000000000000000000000000000007E :10721000000000000000000000000000000000006E :10722000000000000000000000000000000000005E :10723000000000000000000000000000000000004E -:10724000000100000001000000000000000000003C +:10724000000000000000000000000000000000003E :10725000000000000000000000000000000000002E :10726000000000000000000000000000000000001E :10727000000000000000000000000000000000000E @@ -96066,12 +96066,12 @@ :1072900000000000000000000000000000000000EE :1072A00000000000000000000000000000000000DE :1072B00000000000000000000000000000000000CE -:1072C0000000600600E00700000000000000000071 -:1072D00000000000000000000000840000E000004A -:1072E000600000000000000000000000000000003E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000600600E037 -:1073100007008200000000000000000000000000E4 +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F00000000000000007004842000000000000FD +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D :10733000000000000000000000000000000000004D :10734000000000000000000000000000000000003D @@ -96106,17 +96106,17 @@ :10751000000000000000000000000000000000006B :10752000000000000000000000000000000000005B :10753000000000000000000000000000000000004B -:1075400000000000000000000000000005610A2F9C -:10755000850D00A0000000000000000000000000F9 -:107560000000000000610007800C00000000000027 -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB -:1075900000000000000005610A2F850D00A000001A +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:1075700000000000000000000000000005180A00E4 +:10758000050005A000000000000000000000000051 +:1075900000000000000000000000000000000000EB :1075A00000000000000000000000000000000000DB :1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB :1075D00000000000000000000000000000000000AB -:1075E00000000000000000000000F0F000000000BB +:1075E000000000000000000000000000000000009B :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A @@ -96124,7 +96124,7 @@ :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A -:10766000000000000000000000000000F0F000003A +:10766000000000000000000000000000000000001A :10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA @@ -96147,183 +96147,183 @@ :1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 -:1077D0000000000000000020002000200220A00087 -:1077E00000004000100000000000000020000080A9 -:1077F0000080000488040000000000002000200039 -:10780000000020002000000000000000C000000078 -:107810000000000020000001000000000000200027 -:1078200020000000200020000000000000002000D8 -:10783000000000000000200000000000000088049C -:107840002000000020002004000000000000400094 -:107850000000100000000080000121011101000162 -:1078600040000000000000000000000000000000D8 -:1078700000040004000100010000000000000000FE +:1077D00000000000000000000000000000000000A9 +:1077E0000000000400002000000000000000000075 +:1077F0000000000000000000000000000000000089 +:107800000000000000042002000200000000000050 +:107810000000000000000002000000000000000066 +:1078200088000000000000002000000000000000B0 +:107830000000000000040000000000000000000044 +:10784000000000000000000020000000A000A004D4 +:1078500088000000000000000000000000000000A0 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 :1078800000000000000000000000000000000000F8 -:1078900000000000000000000000400000000000A8 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 -:1078C000000000000000000000000000000000A018 -:1078D0000000000000022100210800080000000054 +:1078900000000000000000000000000000000000E8 +:1078A00000A00000000000000000400000000000F8 +:1078B00000000002000200000000000010000000B4 +:1078C0000000000000000000000240000000000274 +:1078D00000000000000000000000000000000000A8 :1078E0000000000000000000000000000000000098 :1078F0000000000000000000000000000000000088 :107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 -:107920000003000400030000000800000000000045 -:107930000000000000000000000000000000000047 -:10794000000800000000000000000005000000002A -:107950000000000400080002000000000000008495 -:1079600000000008000000080084008400000000FF -:10797000000000000000000000000084000800007B -:1079800000000008000000080000000000080000DF -:1079900000040000000800080008000800000008BB -:1079A0000000000000840008000800000008000833 -:1079B000000000000084000800840008000800089F -:1079C000000800000082000800840008000800048D -:1079D000000800000084000400050084008200000C -:1079E0000000000000A100000000004000000000B6 -:1079F0000003000000030000000000090008000070 -:107A0000000000000000000000000000000800006E -:107A10000000000000210000000000210000000024 -:107A20000000000800000008000000000003000043 -:107A3000000000000000000800000000000000003E -:107A40000000000000000008000000080000000026 -:107A500000000000000000000000002100000021E4 -:107A6000000000880000000400000000000000008A -:107A700000000000400000000000000000000000C6 +:107910000000000000000000000000000000001156 +:107920000000000004400440044004402000200007 +:10793000000400040000000000000000000000003F +:1079400000000000000000000000000040002000D7 +:10795000200020002000200000040004000000009F +:107960000000000000820082000000000000000013 +:1079700000080000000800080000000000000000EF +:1079800000000000000000000000000000000000F7 +:107990000008000000040082000000000000000059 +:1079A0000000000000008001800180018001800053 +:1079B000800000090001000000000000000000003D +:1079C0000000000000000000000000000000800037 +:1079D000800080848000800084000001000100009D +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000004000000005000001 +:107A4000000800080000000800000000000000001E +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000000000000006 :107A800000000000000000000000000000000000F6 :107A900000000000000000000000000000000000E6 :107AA00000000000000000000000000000000000D6 -:107AB0000000000000000082000000000000000044 +:107AB00000000000000000000000000000000000C6 :107AC00000000000000000000000000000000000B6 -:107AD000000000000000000008000000000000009E -:107AE000000000000100000000000000000088000D -:107AF000080000000000000000000000000000007E -:107B00000100000000000000000000000000000074 -:107B1000000000000000000008000000000000005D -:107B200000000000000000000000820000000000D3 -:107B300000000000000000000000820000000000C3 -:107B4000000000000000000000000800000000002D -:107B5000000000000000000000000800000000001D -:107B600000000000000020000000000000000000F5 -:107B7000000000A0000800000008008200000008CB -:107B8000008204A000000000000000A0000000002F -:107B900000000000000000A000002108000000001C +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000010000000000055 +:107B20000000000000000000001100000000000044 +:107B30000000000000000000000000000000000045 +:107B4000000000000000000000000000080000002D +:107B50000000000000040000000000000000000021 +:107B60000000000000000000000000000500000010 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 +:107B900000000000000000000000008200820000E1 :107BA00000000000000000000000000000000000D5 -:107BB00000000000000000000000000000A0000025 +:107BB00000000000000000000000000000000000C5 :107BC00000000000000000000000000000000000B5 -:107BD000000000080000000800000000030800008A -:107BE00000840008000000000021200000000000C8 -:107BF00000000000004000000000400000000008FD -:107C000000000088000000000003000000000008E1 +:107BD00000000000000000010000000000000000A4 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 :107C10000000000000000000000000000000000064 -:107C20000000000000000000000000000000000054 -:107C3000000000000000000000000008000000003C -:107C4000000000080000000000000000000000002C +:107C20000000004000000000000000000000000410 +:107C30000000000000000000000000000000000044 +:107C400000400000000000000000000000000000F4 :107C50000000000000000000000000000000000024 -:107C60000000040000000000000009008000040083 +:107C60000000000000000000000000000000000014 :107C70000000000000000000000000000000000004 -:107C80004000002000200000000000000000000074 +:107C800000000000000000000000000000000000F4 :107C900000000000000000000000000000000000E4 -:107CA0000000000000000000000000C00000000014 -:107CB00000001100000000000000000000000000B3 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 :107CC00000000000000000000000000000000000B4 :107CD00000000000000000000000000000000000A4 :107CE0000000000000000000000000000000000094 -:107CF0000000000000000011000000000000000073 +:107CF0000000000000000000000000000000000084 :107D00000000000000000000000000000000000073 -:107D10000000000000000000020000000000000061 +:107D10000000000000000000000000000000000063 :107D20000000000000000000000000000000000053 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 -:107D50000000000000000000000000000000000023 -:107D6000000000000000000000000800000000000B -:107D70000000000000000008000000000000008279 +:107D3000000000008200000000000000012100217E +:107D4000000000210041004100000041000000004F +:107D5000000800000800000000000000A000000073 +:107D600000000000000800080008000800000000F3 +:107D70000000000000000000000000000000000003 :107D800000000000000000000000000000000000F3 -:107D9000000000000000000000A000000000000043 -:107DA00000002100000000000000000000000000B2 -:107DB0000008000000000000000000820000000039 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000002000A3 :107DC00000000000000000000000000000000000B3 :107DD00000000000000000000000000000000000A3 -:107DE000000000000300000000000000000001008F -:107DF000080000000000000000000000000000007B -:107E000000000000000000008800010000000000E9 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 :107E10000000000000000000000000000000000062 :107E20000000000000000000000000000000000052 -:107E30000000000000000000000000000000000042 +:107E30000000000000000000000000000010000032 :107E40000000000000000000000000000000000032 :107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 -:107E700011000000090000000000000000000000E8 -:107E800000000000000000000000000040000000B2 +:107E6000000100010100000000000000010000000E +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 :107E900000000000000000000000000000000000E2 :107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 +:107EB0000000000000000000000040000000000082 +:107EC00000000000000011000000000000000000A1 :107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000000000000000092 -:107EF00000000003008000030080000000800000FC -:107F00000000000000000000000000100000002041 -:107F100000800000000000000000000000000000E1 +:107EE000000000100008100800080000000010004A +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 :107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 +:107F300000000000000000000000000000000090B1 +:107F400000000080000900000008000000000000A0 :107F50000000000000000000000000000000000021 -:107F60000000000000000000000000000000000011 -:107F7000000000100000002000010040000000028E +:107F600000000000000900000009000000040000FB +:107F700000040000000000000000000000000000FD :107F800000000000000000000000000000000000F1 -:107F9000000000820000000000000000000000005F +:107F900000000000000000000000000000000000E1 :107FA00000000000000000000000000000000000D1 :107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 +:107FC00000080000000800000000000100000000A0 :107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000009001 -:107FF0000000000000010000100040000000000030 +:107FE0000000000000000000000000000000000190 +:107FF0000000000100000000000000000000000080 :108000000000000000000000000000000000000070 -:10801000900090000100000000000000000000003F +:108010000000000000000000000000000000000060 :108020000000000000000000000000000000000050 :108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 +:108040000000000002100000000008000000000016 :108050000000000000000000000000000000000020 -:108060000000000000000000000000000000000010 -:108070000000000000000000110000008000080067 +:108060000000000000000000000009000000000007 +:1080700000000200000000000000000000000000FE :1080800000000000000000000000000000000000F0 -:1080900000000000000010000000000000000000D0 +:1080900000000000000000000000000000000000E0 :1080A00000000000000000000000000000000000D0 :1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000000000000000000090 -:1080F0000000000000000000000000080040000038 +:1080C0000000090000000000000000008000000027 +:1080D0000900000000000000000000000000000097 +:1080E00000000000000000000000000090002000E0 +:1080F0000900000000000000020000000000000075 :10810000000000000000000000000000000000006F -:10811000000000000040000000000000000000001F +:10811000000000000000000000000000000000005F :10812000000000000000000000000000000000004F :10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F +:108140000000000000020021000000000005000007 :10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000000F -:1081700000000000410008000800030000010001A9 +:10816000000000000000000000000000000500000A +:1081700000000000000500000000000000000000FA :1081800000000000000000000000000000000000EF :1081900000000000000000000000000000000000DF :1081A00000000000000000000000000000000000CF :1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF +:1081C0000000000000000000000000880000000027 :1081D000000000000000000000000000000000009F :1081E000000000000000000000000000000000008F -:1081F00000000000000001000000000000004182BB -:1082000000E0070000000000000000000000000087 -:10821000000000000000600600E007000000000011 +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000005E :10822000000000000000000000000000000000004E :10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E +:1082400000000000000000000041000007000000E6 +:10825000810000E0000000000000000000000000BD :10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE +:10827000810000E000000000810000E0000000003C :1082800000000000000000000000000000000000EE :1082900000000000000000000000000000000000DE :1082A00000000000000000000000000000000000CE :1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E +:1082C000000000000000000000000000FFFF0000B0 +:1082D000FF0000000000000000000000000000009F :1082E000000000000000000000000000000000008E :1082F000000000000000000000000000000000007E :10830000000000000000000000000000000000006D @@ -96331,7 +96331,7 @@ :10832000000000000000000000000000000000004D :10833000000000000000000000000000000000003D :10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D +:108350000000FF000000000000000000000000001E :10836000000000000000000000000000000000000D :1083700000000000000000000000000000000000FD :1083800000000000000000000000000000000000ED @@ -96347,7 +96347,7 @@ :10842000000000000000000000000000000000004C :10843000000000000000000000000000000000003C :10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C +:108450000F0F0000FFFF0000000000000000000000 :10846000000000000000000000000000000000000C :1084700000000000000000000000000000000000FC :1084800000000000000000000000000000000000EC @@ -96355,18 +96355,18 @@ :1084A00000000000000000000000000000000000CC :1084B00000000000000000000000000000000000BC :1084C00000000000000000000000000000000000AC -:1084D000000000000000000000000000000000009C +:1084D00000000F0F0000000000000000000000007E :1084E000000000000000000000000000000000008C :1084F000000000000000000000000000000000007C -:108500000000000000000000000005610A2F850D3A -:1085100000A00000000000000000000000000000BB -:1085200000000061002F850D00A000000000000089 +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B :10853000000000000000000000000000000000003B :10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000000FB -:108580000000000000610006000D00000000000077 +:108550000000000015002A28054000A8006100075F +:10856000800D00000000000000000000000000007E +:108570000000000000000000000000000061000793 +:10858000800D000000610007800D00000000000069 :1085900000000000000000000000000000000000DB :1085A00000000000000000000000000000000000CB :1085B00000000000000000000000000000000000BB @@ -96374,7 +96374,7 @@ :1085D000000000000000000000000000000000009B :1085E000000000000000000000000000000000008B :1085F000000000000000000000000000000000007B -:108600000000000000007C3C3D3C00000000000039 +:10860000000000000000000000000000000000006A :10861000000000000000000000000000000000005A :10862000000000000000000000000000000000004A :10863000000000000000000000000000000000003A @@ -96382,7 +96382,7 @@ :10865000000000000000000000000000000000001A :10866000000000000000000000000000000000000A :1086700000000000000000000000000000000000FA -:108680000000000000000000500005000000000095 +:1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA :1086A00000000000000000000000000000000000CA :1086B00000000000000000000000000000000000BA @@ -96390,7 +96390,7 @@ :1086D000000000000000000000000000000000009A :1086E000000000000000000000000000000000008A :1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000000069 +:1087000000008000C0000000000000000000000029 :108710000000000000000000000000000000000059 :108720000000000000000000000000000000000049 :108730000000000000000000000000000000000039 @@ -96399,177 +96399,177 @@ :108760000000000000000000000000000000000009 :1087700000000000000000000000000000000000F9 :1087800000000000000000000000000000000000E9 -:1087900000000000100000000000000000000000C9 -:1087A0000000200000000000880020000000000001 -:1087B0000000200000000000000000000000000099 -:1087C0000004400400000000200020000000001011 -:1087D000008420A000030000000000000000000052 -:1087E0000000000420000000000020002000C00065 -:1087F0000000008488A000000008000000000000C5 -:108800000000000020000000000088002000200080 -:108810000000008484A000000000000000000000B0 -:1088200010000000000000004000000000000000F8 -:108830000000100000002000000000000000000008 -:108840000000100200000000000000000000000016 -:1088500000000021001100000000000000000000E6 -:1088600000000000000200024000000000000000C4 -:1088700000000000002100110000000000000000C6 -:108880000000100010024000400000020000000044 -:1088900000000000002100110000000000000000A6 +:1087900000000000000000000000000000000000D9 +:1087A00000080000000000000000000200000000BF +:1087B00000020002000000000002000400000000AF +:1087C00000040002000000000000000000000000A3 +:1087D0000000000000030002000000000000000094 +:1087E0000000000000040000000000000000000085 +:1087F000000000000000000800020000000000006F +:10880000000000080002000000004002000000001C +:108810000000000800000000000000000000000050 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000226 +:108850000002000000000000000000000002000014 +:1088600000000000000000000000000000001000F8 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:108890004000000000000000000000000000000098 :1088A00000000000000000000000000000000000C8 -:1088B0000000000010021100000000000000000095 +:1088B0000000000000002000000000000000000098 :1088C00000000000000000000000000000000000A8 -:1088D0000000000010001100000000000000000077 +:1088D0000000000010004100000000000000000047 :1088E0000000000000000000000000000000000088 -:1088F0000000000000001000110000000000000057 -:108900000000000000000200040000000000000859 -:1089100000000000000010004100000800000000FE -:108920000084008400000088000000000088000827 -:108930000008008400088000A008008400100000E7 -:1089400000000000000000000000000000000084A3 -:108950000008000800088000C00800000082000035 -:1089600000080008000800000008000000080008D7 -:1089700000080002000800088008C0080000008409 -:1089800000080008000800000004000000080010B3 -:1089900000840008000800848010A008000800215E -:1089A000002100210002000300210000000000035C -:1089B00000210021000500000021004100210003EA -:1089C0000008002100080000000800000008000066 -:1089D000000000210000002100080021000000002C -:1089E00000210021002100218809000090400000A2 -:1089F00000030040000800400000000800000000E4 -:108A000000210041000000410000000000000000C3 -:108A1000000800000000004000400021000000208D -:108A20000000000000000000002000000000000026 -:108A30000000200000000000000000000084000092 -:108A4000000000000000000000000000080000001E +:1088F0000000000000001000100200000000000056 +:10890000000000000000000000000000044004041B +:108910000800004040040008200800080004000887 +:10892000000400080004008400080084000800001F +:10893000000800080084008480080008000800087F +:108940000008000800000002000800020002000009 +:1089500000080008000080089008000000100002D5 +:108960000008000800080008008400080000000259 +:108970000000008400080000800880090000000456 +:108980000008000800840084000400080008800833 +:1089900080118008008580010085800900000000AA +:1089A000004000080000000000000000000000007F +:1089B000000000000000000000080000002000008F +:1089C0000000000000000008000800000040000057 +:1089D000000000000021002100050021000000210E +:1089E0000021002100210004001100040004000205 +:1089F0000009000400040000000000030000000063 +:108A00000000002100210000000000000000000024 +:108A10000000000800210005000500000000030020 +:108A2000000000000000000000000000000000083E +:108A300000400000000000000000000000000000F6 +:108A40000000000000000000000000000000000026 :108A50000000000000000000000000000000000016 -:108A6000000000000000000000000000008800007E -:108A70000084000000000000000000000000000072 -:108A800000000000000000000000000000000008DE +:108A600000000008000000000000000000000000FE +:108A70000008000800A00000000000000000000046 +:108A800000000000000000000000000041000000A5 :108A900000000000000000000000000000000000D6 -:108AA00000000000C0000000000000000000000006 -:108AB00000000000000000000000000000000002B4 -:108AC0000000000000008400000000000000000022 -:108AD00084000000000000000000000000004004CE -:108AE0000000000000000000000000000000000086 -:108AF00082000000000000000000000000000000F4 -:108B0000000400000000C0000000000000000000A1 -:108B10000000000000000009000000000000A000AC -:108B20000808000000000040000000C00000000035 +:108AA00040001000820082008200000000000000F0 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD00084000000000000001000000000000004FE +:108AE00000008204000500040004001000100004CF +:108AF00000400000000000400000000000000000F6 +:108B00000004000000000000000000000000000061 +:108B10000000000001000002000000000010000042 +:108B20000002000000000000000000000000000043 :108B30000000000000000000000000000000000035 -:108B40000001000000000000000000000000000024 -:108B50000000000000000000000000100000000005 +:108B40000000100000000000000000000000000015 +:108B5000000000000008000000000000000000000D :108B60000001000000000000000000000000000004 -:108B700000000000000000000000000000000000F5 +:108B700000082000000000000000000000000000CD :108B800000000001000000000000000000000000E4 -:108B900000000000000000000000000000000000D5 -:108BA000000000010000000800009000000000002C -:108BB000000000000005004100080000000300085C -:108BC000000000080000000000000008000800414C -:108BD0000000000000000008000800000021000064 -:108BE0000000000200000000000000000000000083 -:108BF00000000000820000000000000800000005E6 -:108C000090000000080000000000000000000000CC -:108C1000000800080000040000210002000000001D -:108C2000402000000041040000840090000000008B -:108C30000000000000000000000000000000110023 -:108C40004000112000C000000000000000000000F3 +:108B90000000000000004000000100000000000193 +:108BA00000000001000000000000000000000000C4 +:108BB00008000000000000000000000000000000AD +:108BC0000000000000000000000000000000004065 +:108BD000000000000000000200020000000200008F +:108BE00000210000000000400000000000008200A2 +:108BF0000004000000000000000000000000000071 +:108C00000000000000000000000800110200000049 +:108C10000000000000004000040000000000000010 +:108C20000000002000040000000000000000000020 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 :108C50000000000000000000000000000000000014 -:108C60000000000000000000000200000000000002 -:108C700000000000000000000000000000000000F4 +:108C60000000000000000000000000000000000004 +:108C70000000000000000084000000000008000068 :108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000110009000000000000000000AA -:108CB0000000000200000000000000000000004171 -:108CC0000008000000000000000800000000000292 -:108CD0000000004100000041000000000000820090 -:108CE0000000000500000000000000000008000077 -:108CF000000000000000000000410000000800002B -:108D0000000000210005000000000008000800002D -:108D10000003000000000000000000000000080048 -:108D2000001000210008000000000000000000000A +:108C90000000000000000000050005000088400002 +:108CA000000021000000000000000008000000009B +:108CB000080008000000080000000000000000009C +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000391 +:108CE000000000030000000000000000000000037E +:108CF00084000000000400000000000000000000EC +:108D0000000800000000000000000000000000005B +:108D1000000084000000000000000000840000004B +:108D20000000000000000000000000000000000043 :108D30000000000000000000000000000000000033 -:108D40000000000000100000080008000000000003 +:108D40000000000000000000000000000000000023 :108D50000000000000000000000000000000000013 :108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000000E3 +:108D7000020000400000000002002000000000008F +:108D800000000040000000000000000000000000A3 :108D900000000000000000000000000000000000D3 :108DA00000000000000000000000000000000000C3 -:108DB00000000000000000000000008800008200A9 -:108DC00000C0C08200009000000100000000000010 -:108DD0000000000000000000000001880000C0004A -:108DE0000010C0820000C000000100000000000070 -:108DF00000000000000001002000000001820000CF -:108E0000C0000010C0820000C0000001000000008F -:108E10000000000000000000000000000110000041 -:108E2000C0000004C0820000C0000001000000007B -:108E300000000000000400000000000409000941D7 -:108E40009100000080800000000000410000000050 -:108E500000000000000900000000001040000011A8 -:108E60008900008080800000800000030000000076 -:108E70000000000000000009040080000010408095 -:108E800020118200000080800000800000030000AC -:108E90000000000000000011000000000002088037 -:108EA00000099100000080800000800000030000A5 -:108EB0000000080000000000000004000000110095 -:108EC0001100900000020400000000000000800378 -:108ED0000000090000000000000004000000020083 -:108EE0008200900000080300000000000080801055 -:108EF000000000000300000000000000040000006B -:108F00000200900090800008030000000000008034 -:108F100080100000080000000000000008000000B1 -:108F20000900110090000000030080000000009084 -:108F300080030000010000000000000000000000AD -:108F400000000200200200000004020000000000F7 -:108F5000C00100000000000000000000010000004F -:108F6000000040001184000101001000000000C05A -:108F70008201000000000100000000C000000100AC -:108F80000000000041002108000101001000000065 -:108F900000C082000000000000000000000001008E -:108FA0000000000004000802000001004000000072 -:108FB00000C082000000000000000000000000006F -:108FC00000011000008800001000000000000000F8 -:108FD0000001000000000000000000000000000090 -:108FE00000011000008800000100000000000000E7 -:108FF00000000000000000000000C00000000000B1 -:10900000000000018800008800000100000000004E -:109010000000000000000000000000000000000050 -:109020000000000184000088000011000000000022 -:109030000000000000000000000000000000000030 -:109040000000004000040000000084000000000058 -:1090500000000041000000000000000000000000CF -:1090600000000008000800000000410000000000AF +:108DB00000000000010000000000000000000100B1 +:108DC00000C00000000000000000000000000000E3 +:108DD0000000000000000000000000900000820081 +:108DE0000010C08200000000000100000000000030 +:108DF0000000000000010000880000000190000059 +:108E000001000090A0A00000000000010000000090 +:108E10000000000000000000000000000000000151 +:108E2000000000C000000000000100200800000059 +:108E300000000000000041000000000000000040B1 +:108E4000030000800000000000000000000000009F +:108E500000000000001100000000001004000004E9 +:108E600082000080808000000000004100000000BF +:108E700000000000000000100000000000200300BF +:108E80000020080000000000000000000041000079 +:108E900000000000000000000000000000000000D2 +:108EA00000081100008000001108001008000000F8 +:108EB00000000300000000800000800000000000AF +:108EC00020001000000000800000000000000041B1 +:108ED0000000020000000000000002000000090085 +:108EE00002000900000008000000000000008008E7 +:108EF0000000000008000000000000000800000062 +:108F00000800080008000000200000000000000029 +:108F100080080000080000000000000000000000C1 +:108F2000000090000080000800004100A1410041C5 +:108F3000000300000100000000C00000200000004D +:108F4000000082004120004040044000000000007A +:108F50000001000000000000000000000000000010 +:108F600000001000880200000188020000000000DC +:108F7000C000000000000000000000000000000031 +:108F80000000000010008810000001000800000030 +:108F90000000C0010000010000000000000000000F +:108FA000000000000500904000010000900040011A +:108FB0000001000000000000C000000000000000F0 +:108FC000000000000002000000000000000000009F +:108FD0000000000000000000000000000000000091 +:108FE00000008800002000000300000000000000D6 +:108FF0000001000000000000000000000000000070 +:10900000000000008800004000000900010000008E +:10901000000000010000000000000000000000004F +:109020000000000000000008000000000000000038 +:1090300000000000000000000000800000000000B0 +:1090400000000000000000800000000000000000A0 +:109050000000000000000000000000000000000010 +:1090600000000041001100000000080000000000A6 :1090700000000041000000000000000000000000AF -:10908000000000000005102000000000410000006A +:109080000000000000410005000000000500200075 :10909000000000000041000000000000000000008F -:1090A000000000000008001000000000C1000200E5 -:1090B00000000000004100000008800000C1000026 -:1090C000001080004100000000C18000000200008C -:1090D00000000020000008830000800000910000D4 -:1090E000000000009000000000410000001000009F -:1090F000004100000000052000000000800000404A -:109100000000000000099000000000C18000000283 -:10911000000000410000000009900008800000C12C -:109120000000000200009000000000C100000005E7 -:109130000000004100000000030800012000004082 -:1091400000000000020002000000004110000000CA -:10915000000000000000000001C100000800001035 -:1091600000000000020011000000001102000000D9 -:10917000000000010000000000400000000040006E -:1091800000C10000000088008300000000091000FA -:1091900000000000000100000000000200002000AC -:1091A00000400000000002004000000000410400F8 -:1091B00000010000000100000000000900000000A4 -:1091C000000000000000000000000000811200E02C -:1091D000070048410000000000000082000000007D +:1090A00000000000000000000000000000000300BD +:1090B00000000020110000000000800000C100003E +:1090C000000000000000000000C180000008000057 +:1090D00000000000000000000002800000C100004D +:1090E0000010000011000000004180000008000096 +:1090F000000000080000030800000008800000C114 +:10910000000000200008A0000000004180000003D3 +:10911000000000000000000010110008800000C1E5 +:10912000000000000000000000000041800000007E +:10913000000008410000800010110000400000C144 +:109140000000000000000000000000050400000016 +:1091500000000000000000000000000020000040AF +:10916000000000000200020000000091400000002A +:1091700000000000000100000110000000002000BD +:1091800000400000000090008200000000914000BC +:1091900000000000000000000000010800012000A5 +:1091A00000400000000000000000000000118200EC +:1091B0000000000001010000408800900000000055 +:1091C000000000420000000000004800810000E0B4 +:1091D0000000480000000000000000420000000005 :1091E000000000000000000000000000811200E00C -:1091F00080004842000000000000484200000000DB +:1091F000070048820000000000000000000000009E :1092000000000000000000000000000000008112CB -:1092100000E040004842000000000000484200001A -:1092200000000000000000000000000000008112AB -:1092300000E08000484200000000000048420000BA +:1092100000E007004800000000000000000000001F +:1092200000000000000000000000000000008100BD +:1092300000E000004800000000000000484200007C :10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E :1092600000000000000000000000000000000000FE @@ -96586,234 +96586,234 @@ :10931000000000000000000000000000000000004D :10932000000000000000000000000000000000003D :10933000000000000000000000000000000000002D -:109340000000757B0000000000000000000000002D +:109340000000747B0000000000000000000000002E :10935000000000000000000000000000000000000D -:10936000DEAE757B00000000000000000000000081 +:10936000DE2E257B00000000000000000000000051 :1093700000000000000000000000000000000000ED -:10938000DEAE0000757B0000000000000000000061 +:10938000DEA40000257B00000000000000000000BB :1093900000000000000000000000000000000000CD -:1093A0000000DEAE757B0000000000000000000041 +:1093A0000000DEA4747B000000000000000000004C :1093B00000000000000000000000000000000000AD -:1093C0000000DEAE61260340000000000000023015 -:1093D000A0000000000000000C40000000000000A1 -:1093E00002C06486612603400000000000000230D5 +:1093C0000000DE2E61560340000000000000023164 +:1093D000E0000000000000000C4000000000000061 +:1093E00002C06A86612603400000000000000230CF :1093F000A0000000000000000C4000000000000081 :1094000002C06486000061260340000000000000E6 :109410000230A0000000000000000C40000000002E -:10942000000002C0648661260340000000000000C6 -:109430000230A0000000000000000C40000000000E -:10944000000002C064860000000000001000000858 -:10945000000000000000000000000000000000000C -:1094600010000205000400000000000020000000C1 -:1094700000000000000000000000000000000000EC -:109480002000000000800001000000000005200016 -:1094900000000000000000001000000000000008B4 -:1094A000000020000000000000000000000020007C -:1094B0000000000000000000200000000000000488 -:1094C0004000000000000004000000000000000058 -:1094D000000000000002000000000000000000008A -:1094E00000000000800000010000000000000000FB -:1094F000000000000000000040000000000000002C -:10950000000000000000004000000000000000001B -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000000000003B -:109530001000000000000000000000000000000219 -:10954000000080000000400000000000000000005B +:10942000000002C06486615E03400000000000008E +:109430000231E0000000000000000C4000000000CD +:10944000000002C07A8620000000200400042000F2 +:10945000000020002020200000000000000000008C +:109460000000000420002000000020000000200078 +:10947000000020002000200000000000000000008C +:109480000000000020020003200000002000000077 +:109490002008000020022000200000000000000042 +:1094A000000000000000200020000000200000005C +:1094B00020020000200420002000000000004000E6 +:1094C000000000000000200000000000000200007A +:1094D000000000000000000100000000000000008B +:1094E000000000000000000000000000000000403C +:1094F0000500000000000000000000000000000067 +:109500000002000200000000000040000000000017 +:10951000000000000040000000000000000000000B +:1095200000000000000200000000400000000000F9 +:1095300000000000000000000000000041000000EA +:10954000800021000000000000000000000000007A :10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:109580000000000000800000020000000000000059 -:1095900000000000000000000000000000000000CB +:1095600000000000000000000004000000000000F7 +:1095700000000000000000000400000000000000E7 +:1095800000000800080008000800000000000000BB +:1095900000100800000000110000000000000000A2 :1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB -:1095C0000000000000000000000300000000008414 -:1095D0000000000800000008000000080908000062 -:1095E0000008000800000008000000000000000063 -:1095F0000000000800080008000000080008000043 -:109600000010001000000010000000000000000822 -:109610000000000000080008000800000008000822 -:10962000008400840084000000000008001000088E -:1096300000000000001000100010000000040008EE -:109640000008001000100000008400040008004121 -:109650000400000000009021000000210000000034 -:1096600000038200000204050080002100000000C9 -:1096700000000000000000000000004000000000AA +:1095B00000000000040005000410041082001000E8 +:1095C0000000000000008400000000000000040013 +:1095D0000008000000000008000800080004000265 +:1095E000000800000004000200000000000000006D +:1095F000000800000000008800088008000000004B +:109600000008000000080008000000000000000042 +:1096100000000388000000900000400800080000DF +:109620000000000800900008000800000000000092 +:109630000000000000008008820080088008000010 +:109640008000000800000008000800000000000082 +:1096500000000000000000210021000000000000C8 +:1096600000000000000000080008000000000000EA +:1096700000000000000000000000000000000000EA :1096800000000000000000000000000000000000DA -:109690000000002100000021000000000000000088 -:1096A00000000008000800050000000000000000A5 -:1096B0000000000800080008000000000000000092 -:1096C0000000000000000000000000004008400012 -:1096D00000000000000000A00000000000000000EA -:1096E00000020000040000080084000400000400E0 -:1096F0000000000000000000410000000000000029 -:10970000000000A0000000A01010000000100008E1 -:1097100000000000000000001102202000000000F6 -:10972000000010000008000000A0000000820000FF -:109730000010000000000084008200000000000013 -:10974000000000000000000800080084080011A1CB -:109750000000C0000000C000000000000000000089 +:109690000004002104000000200000090000000078 +:1096A00000040011000000000000000000000000A5 +:1096B00000000000000000000000000000000000AA +:1096C000000000008800840000000000000000008E +:1096D000000000000000000003000800000000007F +:1096E000000000000000000000000000000000007A +:1096F000000000000000000020000000000000004A +:1097000000A0001000000008000000A000400200BF +:10971000000000A040000400200420000000000021 +:109720000000000000000000000400200000000015 +:109730000000020000000000000002000400000021 +:109740000000000004004100000000900000000044 +:109750000000000000000000000000000000000009 :1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 :1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000000000000B9 -:1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 +:1097900000000000001100000000000000000009AF +:1097A00000000000001100000000000200000000A6 +:1097B0000000000000000000000010000100010097 +:1097C0000100040000000100000000800000000013 +:1097D00000000000000000000000000000A00000E9 :1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000008000000000000000000000000000040 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 -:1098500000000000000000000000000000002000E8 -:1098600000000000000082000000820000000120D3 -:10987000000000A100800000A00000000000000027 +:1097F0000000000000000000000000004000000029 +:109800000000000005000000000000000000000053 +:109810000000000000000000000000000000000048 +:109820000000100000000090410000000000000057 +:109830000000000000000000000000000000040024 +:10984000040004008000000010000000000200007E +:1098500000000000000000000011000000000000F7 +:1098600000000000000000000000000000000000F8 +:1098700000000000000002000000000000000000E6 :1098800000000000000000000000000000000000D8 :1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000005B3 -:1098B00000000000000000000002000000000000A6 -:1098C0000000000000210000000000000000000077 -:1098D0000000000000004000000000A0410000085F -:1098E0000008000000000000008400880000000064 -:1098F0000804000000040010000000000000000048 -:10990000008400001100008411000008000800001D -:10991000000000000800000000000000000000003F -:1099200000000482000011840020110000A000A0AB -:10993000110000000008000000000000000000000E -:10994000000000080008000000080000008400007B -:1099500000000020000004020000000000000000E1 +:1098A00000000000100000000000000000000000A8 +:1098B00000000000000000000000020000000000A6 +:1098C0008800000000009000000000000000000080 +:1098D0000000000000000000000000000000000088 +:1098E0000000000000000000040000000000000074 +:1098F0000000000000000000000000000000000068 +:109900000008000002000000110000A00000008814 +:109910000000000000200000000000000000050022 +:10992000000000040400402000001100409000905E +:109930000000000000000000008800000088100007 +:1099400005000000000000000000040000040020EA +:109950000304040000200000400400000000000098 :1099600000000000000000000000000000000000F7 -:10997000C000000402000000000000080000000019 -:10998000000900000000000000000041000000008D -:1099900000080000000000000000000000000000BF +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 :1099A00000000000000000000000000000000000B7 -:1099B000001000000000000000000008000000008F -:1099C000000000000000000000080000000000008F -:1099D000000000000000000800000000000000007F -:1099E0000000000000000000000000000000000077 -:1099F00000000000000180000000000000000000E6 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000000000080000000000010000007 +:1099D0000000000000000000000000000000000087 +:1099E0000020000000000000000000000000000057 +:1099F0000000000000000000000000000000000067 :109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000036 +:109A1000000000000000000000000000000009003D +:109A20001100000400000000008811000000000088 :109A30000000000000000000000000000000000026 -:109A40000000000000000000000000000000000016 -:109A50000000000000000000000000000000000006 +:109A400000000000000000000040000000000001D5 +:109A50000000000000000000000000000300000003 :109A600000000000000000000000000000000000F6 -:109A700000000000000000000000010000000000E5 +:109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 -:109A900000000000000000C00090002000900000C6 +:109A900000000000000000000000000000000000C6 :109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 -:109AC0000000000000000000000000000000000096 -:109AD0000000000000000000000100010000000084 +:109AC000000000000000000002900090000890904C +:109AD0000000110020010000000000000000000054 :109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000004000000026 +:109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 -:109B100000000000000000000080000000000000C5 +:109B10000000000000000000000000000000000045 :109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 -:109B40000000000000000000000000000000000015 -:109B500000000000000000000000004100080008B4 -:109B600000100000000000000000000000000000E5 -:109B700000000000000000000000800800080088CD -:109B80008000000000000000000000000000000055 -:109B900000000000000000000000000000000000C5 +:109B40000000000000000000000080000080000015 +:109B50000000202009080010002000000000000084 +:109B600000000000000000000000000000000000F5 +:109B70000080000000000000000000000000000065 +:109B800000000000000000000000000000000000D5 +:109B90000080000000000000000000000000000045 :109BA00000000000000000000000000000000000B5 :109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 -:109BD0000000000000000000000000000000000085 +:109BD00080008080000000210000000000000000E4 :109BE0000000000000000000000000000000000075 -:109BF00000000000000000000000000010008801CC -:109C00009084C0020000000000000000000000007E -:109C10000000000000000000000000000000000044 +:109BF000000000C0000000000000000000000000A5 +:109C00000000000000000000000000000000000054 +:109C10000000000200000000000000000000000042 :109C20000000000000000000000000000000000034 :109C30000000000000000000000000000000000024 -:109C40000000000000000000000000000000000014 -:109C50000000000000000000000000000000000004 +:109C40000000000000000000000000000000900084 +:109C500088008488C0900000000000880000000098 :109C600000000000000000000000000000000000F4 :109C700000000000000000000000000000000000E4 -:109C80009000000000000000000000000000000044 -:109C9000000000000000000000000000000088003C -:109CA0000000000020000000000000000000000094 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 :109CB00000000000000000000000000000000000A4 :109CC0000000000000000000000000000000000094 -:109CD0000000000000000000000000000000000084 +:109CD0000890000800900000000101000100000150 :109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 -:109D0000000000000000050000000000000000004E +:109D00000000000000000000000000000000000053 :109D10000000000000000000000000000000000043 :109D20000000000000000000000000000000000033 :109D30000000000000000000000000000000000023 :109D40000000000000000000000000000000000013 -:109D50000000000000000000000000000000000003 -:109D600000000000100008000000000000000000DB -:109D700000000000000000000000000000000000E3 -:109D800000008000000080808000000000000000D3 -:109D900000000000000000000000000000000000C3 +:109D50000000800000000080000000214120050379 +:109D600008410000000000000000000000000000AA +:109D700000000000000800000000000000000000DB +:109D800000000000000000000000000000000000D3 +:109D900000000002001000000000000000000000B1 :109DA00000000000000000000000000000000000B3 :109DB00000000000000000000000000000000000A3 :109DC0000000000000000000000000000000000093 -:109DD0000000000000000000000000000000000083 +:109DD00000000000801000000000000000100000E3 :109DE0000000000000000000000000000000000073 :109DF0000000000000000000000000000000000063 -:109E000000000000C00088A002020800000000005E -:109E10000000000000000000000000000000000042 +:109E00000000000000000000000000000000000052 +:109E10000000000000010001000000000000000040 :109E20000000000000000000000000000000000032 :109E30000000000000000000000000000000000022 :109E40000000000000000000000000000000000012 -:109E50000000000000000000000000000000000002 -:109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 -:109E8000000000000000600000E000000000000092 -:109E900000000000000000000000000000000000C2 +:109E50000000000000009001080890900800080130 +:109E6000900020000800000000000000000000003A +:109E7000000000000000000000000700008100005A +:109E800000000000000000000000000000000000D2 +:109E9000000000000000008100000700000000003A :109EA00000000000000000000000000000000000B2 :109EB00000000000000000000000000000000000A2 :109EC0000000000000000000000000000000000092 -:109ED0000000000000000000000000000000000082 -:109EE0000000000000000000000000000000000072 +:109ED00000000000000000000081000007000000FA +:109EE000810000E00000820000000000000000008F :109EF0000000000000000000000000000000000062 -:109F0000000000000000000028F8282F00000000DA +:109F00000000000000000000000000000000000051 :109F10000000000000000000000000000000000041 :109F20000000000000000000000000000000000031 :109F30000000000000000000000000000000000021 :109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000000001 -:109F600000000000000000000000000000000000F1 +:109F50000000000000000000000028207D7F28EBAA +:109F600028EB0800000000000000000000000000D6 :109F700000000000000000000000000000000000E1 -:109F80000000000000000000000028282828000031 +:109F800000000000000000000000000000000000D1 :109F900000000000000000000000000000000000C1 :109FA00000000000000000000000000000000000B1 :109FB00000000000000000000000000000000000A1 :109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000000081 -:109FE0000000000000000000000000000000000071 +:109FD00000000000000000000000000028207D7F3D +:109FE00008FB08FB0800080000000000000000005B :109FF0000000000000000000000000000000000061 :10A000000000000000000000000000000000000050 -:10A0100014141F14000000000000000000000000E5 -:10A020000000000000000000000000000F1F1F0FD4 +:10A010000000000000000000000000000000000040 +:10A020000000000000000000000000000000000030 :10A030000000000000000000000000000000000020 :10A040000000000000000000000000000000000010 -:10A050000000000000000000000000000000000000 -:10A0600000000000000000000000000000000000F0 +:10A050000000000000000000000000000000FFFC05 +:10A06000FF00CF0C3C3C000000000000000000009E :10A0700000000000000000000000000000000000E0 :10A0800000000000000000000000000000000000D0 -:10A0900000001F1414140000000000000000000065 -:10A0A000000000000000000000000000000000149C -:10A0B000140000000000000000000000000000008C +:10A0900000000000000000000000000000000000C0 +:10A0A00000000000000000000000000000000000B0 +:10A0B00000000000000000000000000000000000A0 :10A0C0000000000000000000000000000000000090 :10A0D0000000000000000000000000000000000080 -:10A0E0000000000000000000000000000000000070 +:10A0E0000300FF00DF082828000000000000000037 :10A0F0000000000000000000000000000000000060 -:10A10000000000000000000000000000000000004F -:10A11000A0610007800D00050000000000000000A5 -:10A12000000000000000000000000000000000002F -:10A1300000005000000000000000000000000000CF +:10A1000000000000000000A00000000000000000AF +:10A11000000000000000000000000000000000003F +:10A1200000000028000001A0000000000000000066 +:10A13000000000000000000000000000000000001F :10A14000000000000000000000000000000000000F :10A1500000000000000000000000000000000000FF -:10A1600000000000000000000000000000000000EF -:10A17000000000610006000D00000000000000006B +:10A160000000000000200000000500610006800CD7 +:10A1700000000000000000000000000000000000DF :10A1800000000000000000000000000000000000CF :10A1900000000000000000000000000000000000BF :10A1A00000000000000000000000000000000000AF @@ -96821,7 +96821,7 @@ :10A1C000000000000000000000000000000000008F :10A1D000000000000000000000000000000000007F :10A1E000000000000000000000000000000000006F -:10A1F000000000000000000000000000000000005F +:10A1F000FF7C00AA0000000000000000000000003A :10A20000000000000000000000000000000000004E :10A21000000000000000000000000000000000003E :10A22000000000000000000000000000000000002E @@ -96829,7 +96829,7 @@ :10A24000000000000000000000000000000000000E :10A2500000000000000000000000000000000000FE :10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE +:10A270000000002C00AA0000000000000000000008 :10A2800000000000000000000000000000000000CE :10A2900000000000000000000000000000000000BE :10A2A00000000000000000000000000000000000AE @@ -96837,7 +96837,7 @@ :10A2C000000000000000000000000000000000008E :10A2D000000000000000000000000000000000007E :10A2E000000000000000000000000000000000006E -:10A2F00000000000000000003C003D0500000000E0 +:10A2F000004040400000000000000000000000009E :10A30000000000000000000000000000000000004D :10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D @@ -96845,194 +96845,194 @@ :10A34000000000000000000000000000000000000D :10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED -:10A37000000000000000000000003D053C0000005F -:10A38000000000000000400000000000000000008D -:10A3900000000000000000000000000000000000BD -:10A3A000000000000000200000000000000000008D -:10A3B0000000000000000000000000000080000419 -:10A3C0000004000000000000200000000000000069 -:10A3D000000000000000000000000000000000007D -:10A3E00000040008100000002010400000080000D9 -:10A3F000000000000000000000000000000000005D -:10A4000000100000000040000000000000000000FC -:10A41000000000000000000000000000000000003C -:10A42000000010000000000000C00000000000005C -:10A430000000000000000000000000000000000814 -:10A4400000000000000040000000000000000000CC -:10A4500000000000000000000000000000000000FC -:10A46000000000401000400000000000000000005C -:10A4700000000000000000000000000000000000DC -:10A48000000040000000000000000000000000008C -:10A4900000000000040000000000000000000000B8 -:10A4A000000000008200000000000000000000002A -:10A4B0000000000004000000000000000000000098 -:10A4C000000000008280000000000000000000008A -:10A4D0000000000000000408000000000000000070 -:10A4E000000000000000020000000000000000006A -:10A4F00000000000000004000000000082000000D6 -:10A500000000000002000000000000000000000049 -:10A510000000000000000000000000000008000033 -:10A520000000000800000000000000000000000023 -:10A530000000000000000000000000000088000093 -:10A54000000800820000000200000000000000007F -:10A5500000000008000000000200000000000008E9 -:10A5600000000008000000000300000000000000E0 -:10A570000000008400000000020800000000000845 -:10A5800000080010000000000208000000000000A9 -:10A5900000000000000000100000000000000000AB -:10A5A00000000000040000000000000000000000A7 -:10A5B0000000000000000000000002000000000099 -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E0000000000000000000000000000000040067 -:10A5F000000000000000000000000000000000005B -:10A60000000000000008040000000000000000003E -:10A61000000000000000000000000020000000001A -:10A62000000000000008000000000008000000001A -:10A63000000000000000000000000000000000001A -:10A6400003000900000000000000000000000000FE -:10A650000000000000000000000000000084000076 -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000080000000000000000D2 -:10A6800000000000000000000000000000000000CA +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000002000000000000000AD +:10A3900004000000000800040004000000080000A1 +:10A3A0000000000000040000200000000000000089 +:10A3B0000000840000000000000400000011000400 +:10A3C00000000003C0110000000020000000000099 +:10A3D000000000000011000000000000C0000000AC +:10A3E0000000000400000000010020000000000048 +:10A3F000000000000000000200400000000000001B +:10A400000008000000000000000000000000000044 +:10A41000000080002000000000000000000000009C +:10A420000000000000000000000000000800000024 +:10A430000000000000000000000000000002000218 +:10A44000000000C00000000000000000000000004C +:10A45000000000000000008200000000000000007A +:10A4600000000000000000000000040000004000A8 +:10A4700000000000000000000000000100000000DB +:10A4800000000000000000000000000008000000C4 +:10A4900000000000000000000000000000000000BC +:10A4A000000020002000000000000000000000006C +:10A4B0000000000000000200020002000200000094 +:10A4C000000000008200000000000000000000000A +:10A4D0000000000000000800000000000000000074 +:10A4E00000000000000082000000080008000000DA +:10A4F0000800080008002009000000008200200079 +:10A5000000008200080082000000000800008000B7 +:10A510000000000000000000000000040000000037 +:10A520000000000000000008000800080000000013 +:10A530000000000000000000000000020000000019 +:10A5400000000008000000080000000800080000EB +:10A5500000000004000000000400000000000000F3 +:10A5600000000000000200000008000800080000D1 +:10A57000000000000000000080000000000000005B +:10A580008000000000000000000400410000000006 +:10A5900000000000000000000000000000000000BB +:10A5A00008000000000000000000000000000000A3 +:10A5B000000000000000000000000000000000009B +:10A5C000C00000000000000040000000400040000B +:10A5D00000000000000004000400400004004003EC +:10A5E000002040000405000500000000C005000533 +:10A5F0000000000000000000000000000400200037 +:10A600000000900020800000880040400000000012 +:10A61000000000000000000000000000000000003A +:10A62000000000000000000000000000000000002A +:10A6300000000000040000000000002000000000F6 +:10A6400000000000000000004000000000000000CA +:10A65000000000000000000000000020004000009A +:10A6600000000000000000000000000040000000AA +:10A670000000000000002000110040004100000028 +:10A680000000000000000040000000000401000085 :10A6900000000000000000000000000000000000BA :10A6A00000000000000000000000000000000000AA -:10A6B0000000840000000000000000000000000016 -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000000000445 +:10A6B0000000000000000000000000000800000092 +:10A6C0000000000000000000200000000800000062 +:10A6D0004000000002004000A000C0000000000098 +:10A6E00082000800008001008200000000000000DD +:10A6F0000800090000000000000001000100001037 +:10A7000000000000004000800000000000000090F9 :10A710000000000000000000000000000000000039 :10A720000000000000000000000000000000000029 :10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A8100000000000008800000000000000000000B0 -:10A8200000000000000000000008000011002008E7 -:10A83000000400000000000000000000000800000C -:10A8400000840000000000000000000005000088F7 -:10A85000200000000000000000000000008400084C -:10A8600000000084000000000000000000840000E0 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A890000000008800000000000000000000000030 +:10A7400040000000000000000000800000008300C6 +:10A750000000A0000000A000A000200020002000B9 +:10A760002000000080000008200000840084000019 +:10A770000000A100880000000000030002000200A9 +:10A780004100000000000001004000000000000047 +:10A790000040000000000000000000000000000079 +:10A7A00000000000000000000000000000000400A5 +:10A7B0000000000000000000000002000000000097 +:10A7C00000000000000000000000000040008800C1 +:10A7D00090000000C0000021040000000000000004 +:10A7E00000008204002100210020000000209000D1 +:10A7F000A0200000080008000000900004090000EC +:10A80000021104000040100000000000040040009D +:10A810000000000000000300000021000000000014 +:10A820000000000000000000000000000000000028 +:10A8300000000000000000000000000000082100EF +:10A840000000000000200000000000000000800068 +:10A8500000000000000000000000000000000040B8 +:10A8600000000020000000000400400000000090F4 +:10A870000000000000000000800000200000210017 +:10A880000002C09009402101030000840000110073 +:10A89000000000000000000800000002001100009D :10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000080000000080 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000008000000000008000850 -:10A8F0000000000000000008000000000000000050 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 +:10A8B0000000000000000000C000000000000000D8 +:10A8C0000000000000004000000000000000000048 +:10A8D000000000000100000084000000842100004E +:10A8E000000582050040C04008400040820400038B +:10A8F000A000820000200000A04000C00000000076 +:10A90000A0C00040880802410000408041000004CF +:10A91000084000C0004000000000000000000000EF :10A920000000000000000000000000000000000027 :10A930000000000000000000000000000000000017 :10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 +:10A9500000000000000010000000110000000000D6 +:10A960000000028402840040004000A000A0000417 +:10A9700000000000000000010000000000100000C6 +:10A980000500034000820000C100030003404000B6 +:10A990002101000100410001000000000000000052 :10A9A00000000000000000000000000000000000A7 :10A9B0000000000000000000000000000000000097 :10A9C0000000000000000000000000000000000087 -:10A9D0000000000000001000000000000000000067 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 +:10A9D000000001000000000000000000A040002175 +:10A9E00002082009900484100008208200A1004081 +:10A9F000010200410000000000000000404004404F +:10AA00000010088201C000000800000800C0080013 +:10AA10008220200000C000000004000000000000B0 :10AA20000000000000000000000000000000000026 :10AA30000000000000000000000000000000000016 :10AA40000000000000000000000000000000000006 -:10AA500000000000000020000000000000000000D6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 +:10AA5000000000000800000041000000000000802D +:10AA6000000880A00088000000000080008000C175 +:10AA70000085028900110000000000000000800035 +:10AA800080000000808009800000000000800089B4 +:10AA9000030985030003008000000080000000001F :10AAA00000000000000000000000000000000000A6 :10AAB0000000000000000000000000000000000096 :10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 +:10AAD00000000000000000000000000080110000E5 +:10AAE0008000809000030080000000A00080808033 +:10AAF0000000002000110000000000000000000025 +:10AB00000000001000090000030021000300830082 +:10AB100009002120100090080000000000008000C3 +:10AB2000000040000000000000000000000000885D :10AB30000000000000000000000000000000000015 :10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 +:10AB5000000000000000000008829000900010003B +:10AB60000000080008C19008A0C01000A0C0880420 +:10AB700010C0000000000000009000000000000075 +:10AB800000000000000000890000000090000000AC +:10AB9000C000830201000100C100000000000000AD +:10ABA000C0000000000000000000000000000000E5 :10ABB0000000000000000000000000000000000095 :10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000001000074 -:10ABE0000001000000000000000000000000000064 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 +:10ABD0000000000000000000000000000000000075 +:10ABE0000100000003100084C089C00803020002B5 +:10ABF000C0841008210000008300900000000000C5 +:10AC000020000000020000100090821000010001EE +:10AC1000008501C100000001000100C000000082A9 +:10AC2000000000C000000000000000000000000064 :10AC30000000000000000000000000000000000014 :10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000200008CC -:10AC6000000800410000000000000000000000009B -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 +:10AC500000000000000000000000000000000000F4 +:10AC6000000008000000C1100810C1052008C10044 +:10AC70000000800080802100110008008500000095 +:10AC8000000000000000800000800080808000083C +:10AC9000000300A11190004000030008058300009C +:10ACA00000000000008000000000008000000000A4 +:10ACB000000800000000000000000000000000008C :10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 +:10ACD000000000000000000000000000000041052E +:10ACE00003804080200000000011000000000000F0 +:10ACF0000000008000800000800000410000800013 +:10AD00000005000200000000800580208000000097 +:10AD10000085000000000008808508090900000384 +:10AD2000800080000000000000000000000400001F :10AD30000000000000000000000000000000000013 :10AD40000000000000000000000000000000000003 :10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 +:10AD600001000190000800000000840088108408A1 +:10AD7000840084002010C0208400A0000000000097 +:10AD800010000000000100000000C000A00008004A +:10AD9000400000C0000010000001C0A00001000041 +:10ADA0000001C00004A0000000000000000000003E +:10ADB000000000000000070000000000000000008C :10ADC0000000000000000000000000000000000083 :10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 +:10ADE0000000810002E00000000000000000000000 +:10ADF000000048420000000000004842000000E05F +:10AE00000700000000810000070000000081000032 +:10AE100007000000810000E000004100810000E028 :10AE20000000000000000000000000000000000022 :10AE30000000000000000000000000000000000012 :10AE40000000000000000000000000000000000002 :10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000000000000A2 +:10AE60000000000000000000000000000000204082 +:10AE70001080A00000A0A00500000500A0000000B8 +:10AE8000000000000000000000000000000000C3FF +:10AE9000000266666666F0F0F0F0FF000000FFFF5B +:10AEA0000000FFFF0000FF000000F0F000000000C5 :10AEB0000000000000000000000000000000000092 :10AEC0000000000000000000000000000000000082 :10AED0000000000000000000000000000000000072 :10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 +:10AEF00004020801050000050000A005000500A0EF +:10AF00003C3C0000000000000000000000000000C9 +:10AF100000000000F606FF00F0F0F0F0FF00000077 +:10AF20000000000000000000FF000000F0F0000042 :10AF30000000000000000000000000000000000011 :10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 @@ -97041,395 +97041,395 @@ :10AF800000000000000000000000000000000000C1 :10AF900000000000000000000000000000000000B1 :10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 +:10AFB000000000000000F0F0F0F0000000000000D1 :10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 :10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 +:10AFF00000000000402002040000A005100820040A +:10B00000448800000000080C000000000000000060 +:10B0100000000000F0F0F0F00000000000003C3CF8 +:10B0200000000F0F00000F0F00003C3C00000F0F4E +:10B03000FFFF9999000000000000000000000000E0 :10B040000000000000000000000000000000000000 :10B0500000000000000000000000000000000000F0 :10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 +:10B07000C0008000000080100108A00500008001D1 +:10B0800040020000448800000000000000000000B2 +:10B090000000000000000040000000000000000070 +:10B0A0003C3C00000F0F00000F0F00003C3C000074 +:10B0B0000F0FFFFF99990000000000000000000042 +:10B0C0000008000000A000000000000000000000D8 :10B0D0000000000000000000000000000000000070 :10B0E00000000000000000000000000000000061FF -:10B0F0000006000D0000000000000000000000003D -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F +:10B0F0000005800D0000000060610006000D1000DA +:10B1000000000000000008000061000F000D00A01A +:10B110000000002805000400A0000020000000003E +:10B12000406380068029920240E3800780299202D2 +:10B130004082800000208202000000000000000029 :10B1400000000000000000000000000000000000FF :10B1500000000000000000000000000000000000EF :10B1600000000000000000000000000000000000DF -:10B170000000000028F882F200000000000000003B +:10B17000FF3C7D7D00000000000000000000010099 :10B1800000000000000000000000000000000000BF :10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F +:10B1A000000000000000F0F010FBFAAFFAAF303002 +:10B1B000301000000000000000000000000000004F :10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F :10B1E000000000000000000000000000000000005F -:10B1F00000000000000000F000F00000000000006F -:10B20000000000000000000000000000000000003E +:10B1F00000003F3F7D7D00000000000000000000D7 +:10B20000010000000000000000000000000000003D :10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E +:10B220000000000000000000F0F010FBF55FF55F8B +:10B23000301030300000000000000000000000006E :10B2400000000000000000000000000000000000FE :10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E +:10B270000000000000000000000000000000FFFFD0 +:10B28000FFFF000000000000000000000000D2D21C +:10B290000055000000000000000000000000000059 +:10B2A00000000000000000000000800000000C30E2 +:10B2B00003C00102040800000000000000000000BC :10B2C000000000000000000000000000000000007E :10B2D000000000000000000000000000000000006E :10B2E000000000000000000000000000000000005E :10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000200000DD -:10B35000000040004000000000000000000000006D -:10B36000000000000000400000000000000000009D -:10B370000000200020000000000000000005000088 -:10B38000000000000000000020000000000000009D -:10B39000000000002000200000000000000000006D -:10B3A000000000000000000020000000000000007D -:10B3B00000000000200020000000000000800000CD -:10B3C0000010000000000002000000000000000269 -:10B3D000000000000000000000000000000200006B -:10B3E00000004000000000000000400000000000DD -:10B3F000000000000000000000000000000000004D -:10B4000000000000400000000000000000000000FC -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B43000400000000000000000000000000200408A -:10B4400000000001000000000000400000000000BB -:10B4500000000000000000000000000000000000EC +:10B30000FF7FFF7F00000000000000000000000041 +:10B31000D2D2AAFF000000000000000000000000E0 +:10B32000000000000000000000000000808000001D +:10B330000C3003C00000000000000000000000000E +:10B3400000000000000010000000200000000000CD +:10B3500000000000000400040000000000001000D5 +:10B360000002000000004000000220000004000273 +:10B37000000000000000400000000010000000007D +:10B38000000300000000000020000000C000C00218 +:10B3900000000000A00000002000A0800000C0000D +:10B3A000000000800000000000000000000000001D +:10B3B00004820010000000000002000000000004F1 +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000004000000000002D +:10B3E000000000000000000000000000000000005D +:10B3F00000004002000200000000000000001000F9 +:10B40000000000000000000000000000000000003C +:10B41000000000004000000010001000004000A0EC +:10B4200000000000004000000000000000000000DC +:10B430000000800400010000000200010000000084 +:10B4400000000000000000000000000004000000F8 +:10B4500000000000000004000000000000000000E8 :10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000010004000000A7 -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C00000000000000000000000000080000000FC -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B5100000000000000000000000000004008000A7 -:10B52000000000000000000000000000000000001B -:10B530000000008400100000000000000000000077 -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600088000400C000000000000000000000008F +:10B4700000000000000000000010000004000000B8 +:10B4800000000000000000000000000084000040F8 +:10B4900000400040004002000200000000000000E8 +:10B4A0008800080008000280004004000800040032 +:10B4B00004000020C02000000200022002004040E2 +:10B4C000020000000000000800000000000000086A +:10B4D0000000000000000000000000000000000864 +:10B4E000000000000000000800000000000000084C +:10B4F00000000000000800000000000000008008BC +:10B500000000000000000000000800000000000033 +:10B51000000800000000000800000000000000001B +:10B520000008000000000000804000018000800052 +:10B53000800880000001000500000000000100827A +:10B54000800800000000000000000000000000056E +:10B5500000000000040000000000000000000000E7 +:10B5600000000000000000000000000000000000DB :10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000080000000000000000A3 -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C0000000000000118800900000000000000052 +:10B5800000000000000000000000000004000000B7 +:10B59000000004000400040000000000040000009B +:10B5A000000084800000000301000021000800006A +:10B5B0000000000001009100010040030282C088E9 +:10B5C0000010400200210000044000000090000034 :10B5D000000000000000000000000000000000006B -:10B5E000000000000000090004000020000000002E -:10B5F0000000000000000000000003002100000027 -:10B6000000000000000000000000000000000084B6 -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000900000000000000F1 +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000004004000100008000000000040009E +:10B61000410041004004410400000020409000002F +:10B620000300000000080000030004000000000008 +:10B630000000000000A004A004000484800080102A +:10B640000020000180210000000000200000000018 :10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000004000000D6 +:10B6600000000000000000000000000000000000DA :10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A +:10B680000000000000000000C000000000000000FA +:10B690000000A00000000000080002000000000000 +:10B6A000000000000000000000000500C1000000D4 +:10B6B00084008800080000000802080082410000A1 +:10B6C0000000000008000000000000000000000072 :10B6D000000000000000000000000000000000006A :10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A +:10B6F0000000000008000000000000000000000042 :10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 +:10B7100000000000000000000000000080000000A9 +:10B7200000000500000005000000410020000200AC :10B730000000000000000000000000000000000009 :10B7400000000000000000000000000000000000F9 :10B7500000000000000000000000000000000000E9 -:10B76000000000000000A000000000000000000039 +:10B7600000000000000000000000000000000000D9 :10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000042055 -:10B7D0000000000000200000000000000000000049 -:10B7E0000000000200000000000000000000000057 +:10B780000400000000001000908000000000040091 +:10B790000000000000004000080000000000C000A1 +:10B7A000000090000000400000080000820000003F +:10B7B0001004000000400000000001000400000030 +:10B7C0000400000008020000828008000000080059 +:10B7D0000004000000000000000000000000000065 +:10B7E0000010000000000000000000000000000049 :10B7F0000000000000000000000000000000000049 -:10B80000000000000000210000000000000000A077 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 -:10B8500000000020000000000000000000000000C8 -:10B8600000000800000000000000000000000000D0 -:10B8700000000000000000000000000000001000B8 -:10B8800010000000000000000000000000000000A8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000008000000000000000000000000000090 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 +:10B8000000000000000000000000112004200000E3 +:10B810000020000009042100000400840000000052 +:10B8200000C040000000000003000084040000206D +:10B83000000080010000000000A000A004A080889B +:10B8400003000084002003014000001000000900F4 +:10B8500000000000000000000002000200000000E4 +:10B8600000000008000000000000000000000000D0 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000001000A8 +:10B890009000000000002000000000009000000068 +:10B8A00020008200000900000000002000000000CD +:10B8B0000100040000020000000000090000400038 +:10B8C0008800900000210040840000020002C002B5 +:10B8D0000020C01100000000000000000000000077 :10B8E0000000000000000000000000000000000058 :10B8F0000000000000000000000000000000000048 :10B900000000000000000000000000000000000037 -:10B910000000000000000002000000000000000025 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000008200000000000095 +:10B930000000200080000000000000002100000046 +:10B9400000000000000000000000000000010001F5 +:10B9500000010000000000000000000000000000E6 :10B9600000000000000000000000000000000000D7 :10B9700000000000000000000000000000000000C7 :10B9800000000000000000000000000000000000B7 :10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 +:10B9A000000090880010000888C010840082000405 +:10B9B00020C00100900000000000010020000000F5 +:10B9C0000000000800880040109041A08283900988 +:10B9D000C08320100004002110900000000000002F :10B9E0000000000000000000000000000000000057 :10B9F0000000000000000000000000000000000047 :10BA00000000000000000000000000000000000036 :10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 +:10BA20000000000000000080008000000000000016 +:10BA3000008000001100A10000000000090080004B +:10BA400000000000008000000000800082094183A7 +:10BA500000C08002004100020008801000000000C9 :10BA600000000000000000000000000000000000D6 :10BA700000000000000000000000000000000000C6 :10BA800000000000000000000000000000000000B6 :10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000008000000000008000000066 +:10BAA0000000000000008000009000000080000006 +:10BAB00080A00000008000080900001000000000C5 +:10BAC000000000008000000080080000804020008E +:10BAD0000303838202A10000008800098080000027 :10BAE0000000000000000000000000000000000056 :10BAF0000000000000000000000000000000000046 :10BB00000000000000000000000000000000000035 :10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000090000000000000000075 -:10BB400000000000000000000000000000000000F5 -:10BB50000000000000000000100088000000C0008D +:10BB20000000000000000000040020C0901002C0CF +:10BB3000080002C0080284C00001018800010088DA +:10BB400010000800100008000002A0014040900111 +:10BB50009104A101834109A1880040C0109108C04F :10BB600000000000000000000000000000000000D5 :10BB700000000000000000000000000000000000C5 :10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000002000000000000000000065 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000004000000000000015 +:10BB900000000000000000000000000002000000A3 +:10BBA00000000000000000000000C1A00090C08460 +:10BBB000910409040004C08290089100888808005C +:10BBC000000000400202908401C0004000884090C4 +:10BBD0000290082001880091A0A011900010C002DE +:10BBE0001040000000000000000000000000000005 :10BBF0000000000000000000000000000000000045 :10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 +:10BC10000000000000000000000041000000800063 +:10BC200000000000000000000000000041000000D3 +:10BC300080802080410000008000000041000080E2 +:10BC40008000410000808000808021800080000012 +:10BC50000080A0008020098040208400C100208056 +:10BC600080008000000000000000000000000000D4 :10BC700000000000000000000000000000000000C4 :10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 +:10BC9000000000000000000000000000000200089A :10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 +:10BCB0000000000000000002800080000000001171 +:10BCC000000000800300000000410000000082022C +:10BCD0000200A0000900898540898500A121000497 +:10BCE0000080008000000000000000000000000054 :10BCF0000000000000000000000000000000000044 :10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 +:10BD10000000000000000000000000000000000122 :10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000090008800000000000000000000BB +:10BD3000820020C082C08200020104C040C0820094 +:10BD40000001000000400000000000090088000021 +:10BD50009001898809900000080840048490A1019E +:10BD60001000400404400400000000000000000037 :10BD700000000000000000000000000000000000C3 :10BD800000000000000000000000000000000000B3 :10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000210062 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 +:10BDA000008100000700000000000000000000000B +:10BDB00000000000000000004842000000000000F9 +:10BDC0004842000000E007008200008200000700F7 +:10BDD0008200008100E007000000008100000700F1 +:10BDE000000A0000000000004842000000000000BF :10BDF0000000000000000000000000000000000043 :10BE00000000000000000000000000000000000032 :10BE10000000000000000000000000000000000022 :10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 +:10BE300000000000240000240000096000090060E8 +:10BE40002400002400000000F0F0000000000000CA +:10BE5000F0FFC0C0A0A0F5F50CFF3CFF00004000C3 +:10BE60000000AA8A2400002424000024000000000E :10BE700000000000000000000000000000000000C2 :10BE800000000000000000000000000000000000B2 :10BE900000000000000000000000000000000000A2 :10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 +:10BEB000000000000000810000810960000009000E +:10BEC00060008100008100000000F0F00000000030 +:10BED0000000F0FFC0C0A000F5FF00F300C30000A9 +:10BEE000500000008AAA81000081810000810000CA :10BEF0000000000000000000000000000000000042 :10BF00000000000000000000000000000000000031 :10BF10000000000000000000000000000000000021 :10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF60000000000000000000000000003C3C3D3DDF +:10BF3000000000000000000024810000040108024D +:10BF400004100820060000060000FFFF0000FFFFAD +:10BF5000000000000F001F145D5F51500FFF0F0025 +:10BF6000000002030000060004100820041008204E :10BF700000000000000000000000000000000000C1 :10BF800000000000000000000000000000000000B1 :10BF900000000000000000000000000000000000A1 :10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE00000000000000000000000000000003D3DD7 -:10BFF0003C3C00610006000D000000000000000055 +:10BFB000000000000000000000000000248110408C +:10BFC00020800140028090000090000000000000EE +:10BFD0000000000000000F000F005D5F51505FFF88 +:10BFE0000A0000000000000000060140028001403D +:10BFF00002800000000000000000000000000000BF :10C000000000000000000000000000000000000030 :10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C040000000000000000000050000A0000000004B -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C070000000000500000000FFFF000000000000BD +:10C0200000000000000000000000051000280000D3 +:10C0300000000000000000000000000060000000A0 +:10C0400000001000000000000000080005402A0663 +:10C05000054C00A8000000280090000100610026A7 +:10C06000000D00000061002E000D0001606100065F +:10C07000000D1000000000000000000000000000A3 :10C0800000000000000000000000000000000000B0 :10C0900000000000000000000000000000000000A0 :10C0A0000000000000000000000000000000000090 :10C0B0000000000000000000000000000000000080 :10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F00000000000000000000000FFFF0000000042 +:10C0D0003C3CFFFF0000000000000000000000E00A +:10C0E0000000000000000040000014281428000098 +:10C0F0000000000000000000000000000000000040 :10C10000000000000000000000000000000000002F :10C11000000000000000000000000000000000001F :10C12000000000000000000000000000000000000F :10C1300000000000000000000000000000000000FF :10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF +:10C1500000003C3C00000000000000000000000067 +:10C1600000000000000000000050000041824182F9 :10C1700000000000000000000000000000000000BF :10C1800000000000000000000000000000000000AF :10C19000000000000000000000000000000000009F :10C1A000000000000000000000000000000000008F :10C1B000000000000000000000000000000000007F :10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F +:10C1D000000000000000F0F000000000000000007F +:10C1E000000000000000000000000000000000430C +:10C1F0000000FCAAFCFF000000000000000000009E :10C20000000000000000000000000000000000002E :10C21000000000000000000000000000000000001E :10C22000000000000000000000000000000000000E :10C2300000000000000000000000000000000000FE :10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C28000200020000000000020000000000000004E -:10C29000000000000000000000009000000000000E -:10C2A000200020000000000020000000000000002E -:10C2B000000000000000000000000010000000006E -:10C2C0000000000020000000000000040004000046 -:10C2D000000000000000000000000000000000005E -:10C2E0000000000020000000000000040400000026 -:10C2F000000000000000000010000000000000022C -:10C300000000000000000002000200000000000029 -:10C310000000000000000000000200020000000019 -:10C3200000000000000000000002000200004000C9 -:10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000024002A9 -:10C350004000000000001004000000000000000089 -:10C360000000000000000000000200401002000277 -:10C370004000000200000000000000020000000079 -:10C3800000000000000000000000000000000000AD -:10C390000000000000000000000000000200020099 +:10C250000000000000000000F0F0000000000000FE +:10C2600000000000000000000000000002030000C9 +:10C2700000000000FCAAFCFF00000000000000001D +:10C28000000000000000000000040000200000008A +:10C29000000020000000000000000000000000027C +:10C2A00000040004000000000000840020000004DE +:10C2B000000040020000000000000000000000003C +:10C2C000000000008804A000C000A00410000000CE +:10C2D00040004000200000118400000084020000A3 +:10C2E00084000000000000000000000000020000C8 +:10C2F000000000000000000000000000000200003C +:10C30000000000000000000000000000000000002D +:10C310000000000000020000000000040004000211 +:10C3200000000002000000000000000400040004FF +:10C3300000020000000000020002000000000000F7 +:10C340000004000400820000000000000000000063 +:10C3500000000004000200001000000000000000C7 +:10C3600000001002000000000000000000000004B7 +:10C370000002000000020000000000000090100019 +:10C3800000000000000004000000000004000400A1 +:10C39000000000000000000000000000000002009B :10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000020000007B +:10C3B0000000000000000000000000000200020079 :10C3C000000000000000000000000000000000006D :10C3D000000000000000000000000000000002005B -:10C3E0000200000000000000000000000000020049 -:10C3F0000200000000000000000000000000020039 -:10C40000020000000000000000000000000000002A -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C4400002000000000000000000000000000000EA -:10C4500000000000000000000000000000000000DC -:10C4600000000400000000000000000000000000C8 -:10C4700000000000000000000000000000000000BC -:10C4800000000400000000000000000000000000A8 -:10C49000000000000000000000000000000000009C -:10C4A000000040000000000000000000000000004C -:10C4B000000000000000000000000000000000007C -:10C4C0000000080000000000000000000000000064 -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C5100000000000000000000000000000000020FB +:10C3E000020000000000000000000000000000004B +:10C3F00082000000020002000200000002000000B3 +:10C400000200000000000000000000080000000022 +:10C410000000000000000000000000000008000014 +:10C420000000000000000000000000080000000004 +:10C4300000000000000000000000000000080000F4 +:10C4400000040000000000000000000000080000E0 +:10C4500000000000000000000000000000000008D4 +:10C46000000004000000000000000000000800843C +:10C4700000000000008200000000000000900008A2 +:10C4800000000000000000000000000000000000AC +:10C49000200000000000000000000000000000007C +:10C4A0000000000800000000000000000000000084 +:10C4B00000000000000000000000000084000000F8 +:10C4C000020004000000040004008400C000A0007A +:10C4D0000000000040008400040004001000000080 +:10C4E0000000000004000000000000000000000048 +:10C4F00000002000000000000800C00084000000D0 +:10C500000404000090000000000000000000000093 +:10C51000000000000000000000000000000000001B :10C52000000000000000000000000000000000000B :10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000210000000000000000000000BA -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B +:10C540000000000000000000000011004100000099 +:10C5500000000900000008000408008209000088AB +:10C5600000000400000000000000000000000804BB +:10C5700041000820000000002100410021000000CF +:10C58000000008A0000008040000000000000000F7 +:10C59000000000000000002100000000000000007A :10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B +:10C5B0000000000000001000000000000000080063 :10C5C000000000000000000000000000000000006B :10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C600000000000000000000000400000000000026 +:10C5E000000000000000000000100000000000003B +:10C5F000C00000000000000008000000000000046F +:10C6000082000000000000000005000000000000A3 :10C61000000000000000000000000000000000001A :10C62000000000000000000000000000000000000A :10C6300000000000000000000000000000000000FA :10C6400000000000000000000000000000000000EA :10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA +:10C660000000000000000000000041000000000089 :10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA +:10C6800000000000000000000000000400000000A6 :10C69000000000000000000000000000000000009A :10C6A000000000000000000000000000000000008A :10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A +:10C6C0000000000084000000000082000000000064 +:10C6D0000000000000000000000000000000080052 +:10C6E00000000000000090080000000000000000B2 +:10C6F00004000000000000000000200040000000D6 :10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C7200000000000000000000400000020000000E5 -:10C7300000000000000000000000000000000000F9 +:10C710000300000000000000000000000000000016 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000020D9 :10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000210000000000000000000000A8 -:10C7700000000000000000000000000000000000B9 -:10C780000000000000000000000004040000002081 +:10C75000000000000000090040200508400004001F +:10C760000584000009000000000021840084418449 +:10C7700000000000008800080000000220200000E7 +:10C7800000880800080008000400400040000384FE :10C790000000000000000000000000000000000099 :10C7A0000000000000000000000000000000000089 :10C7B0000000000000000000000000000000000079 :10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000800000000000000080049 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 +:10C7D00000008400000000000000000000000000D5 +:10C7E00000000000880000000000000900000000B8 +:10C7F000000000000009000200020800000008001C :10C800000000000000000000000000000000000028 :10C810000000000000000000000000000000000018 :10C820000000000000000000000000000000000008 @@ -97536,76 +97536,76 @@ :10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 :10CE90000000000000000000000000000000000092 -:10CEA0000000000000000000000000002000000062 -:10CEB00000002000400000002000200000000000D2 -:10CEC0000000000000002000000020002000000002 -:10CED00000002000400000002000200000000000B2 -:10CEE000000000008800200000002000000020005A -:10CEF00000000000200020000000200020000000B2 -:10CF000000000000C00020002000000020002000E1 -:10CF1000000004002000200000002000200000008D -:10CF2000400000002000000000000000000000029F -:10CF3000400010020000000000000002000010008D -:10CF4000000200004090100240004002000000007B -:10CF50000000000000000000000000000000400091 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000020002000000000002AB -:10CF80000000000000000000000000004000000061 -:10CF9000000000000002000000000000000000008F -:10CFA00000001000000400001090000200000000CB -:10CFB000000000000004000400042000000400043D +:10CEA0000000000000000000000000000000000082 +:10CEB000000000000000000000000004000000006E +:10CEC0000000000000000000000000000000000062 +:10CED000000400040000000000000000000000004A +:10CEE000000000000080008000200080000300009F +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF200000110000000000000000000000040000EC +:10CF300000000002000010000000000000020000DD +:10CF4000000200001000000000020000000040008D +:10CF50000000000010000000400040000000000041 +:10CF6000000000000000002000200003002000005E +:10CF700040000090000000000090000000900000C1 +:10CF8000000000000000000000020002000000009D +:10CF900000000000000000000002000000000090FF +:10CFA0001002000000020002000000020000000069 +:10CFB0000000000000040004000000000000000069 :10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 -:10D03000000000000000000100010001800000016C -:10D0400000010000000000000000000000000000DF -:10D0500000000000000000000000000800000008C0 -:10D0600000000008000000080008000000000008A0 -:10D07000020800000000000000080008000800008E -:10D080000008000800080000000800080000000078 -:10D090000008000800000000000800080008000068 -:10D0A0000008000800080000000800080000000058 -:10D0B000000800080000000000000000000300005D -:10D0C0000008000000030000000800080000000342 +:10CFD0000000000000100000000000000008000039 +:10CFE000000000000000000002100210084008408D +:10CFF00000000000000000000040000000000000F1 +:10D000001000000000000000000000000000001000 +:10D01000001000000000001000000210020000409C +:10D020008240020002000010000000000200000028 +:10D0300000000000000000010001040004000000E6 +:10D0400000000000000000000000000800000000D8 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000080000000800000008A8 +:10D070000008000000080000000000080000000098 +:10D080000008000000000000000800000008000088 +:10D0900000080008000800000000058400000300EC +:10D0A0000008000800000000000800000002000066 +:10D0B0000008000800000000000000000000000060 +:10D0C000000000000000000300000000000000005D :10D0D0000000000800000000000000000000000048 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000002000000000AF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F +:10D0E0000000000000000000000000000000400000 +:10D0F000A000000000000000880088004000100030 +:10D100001000100010000400401004000000040093 +:10D11000000000000000000040009000000000003F +:10D120000000000000000000000084004008000033 +:10D130008800000000000000000000000000000067 +:10D14000000000000000000000400000000000009F +:10D1500000000000000000000000000000000000CF +:10D16000000000000000100000000000000040006F +:10D17000000040000000000000000400000000006B +:10D18000110000000040000000000000000000004E :10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F +:10D1A0000000000000000900000000200000000056 +:10D1B00000900000000000000000000000000000DF :10D1C000000000000000000000000000000000005F :10D1D000000000000000000000000000000000004F -:10D1E0000800000000000000000000000000000037 -:10D1F000000000000000000000000000000000002F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000010000000000000000002E :10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E +:10D210000000000000000005000000000000000009 :10D2200000000000000000000000000000000000FE -:10D2300000000800080000000800000000000000D6 -:10D2400000000000000000000000000800000000D6 -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE +:10D2300000410000000000000000000000000000AD +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000800000000C6 +:10D2600000000000100000000200000000000000AC +:10D27000000000000000000020000000000000008E :10D28000000000000000000000000000000000009E :10D29000000000000000000000000000000000008E :10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E -:10D2C0000000000000080000000000000005000051 -:10D2D000000000030000000000080003000300003D -:10D2E0000008000800000000000000080000000026 -:10D2F000000000000000000000000000000000002E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000003000000000000000000004B +:10D2E0000000000800000000000000000000000036 +:10D2F000040000000000000000000000000000002A :10D30000000000000000000000000000000000001D :10D31000000000000000000000000000000000000D :10D3200000000000000000000000000000000000FD @@ -97614,23 +97614,23 @@ :10D3500000000000000000000000000000000000CD :10D3600000000000000000000000000000000000BD :10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D -:10D3B000000000000000000000000000000000006D -:10D3C000002100000021000000000000000000001B -:10D3D000000000000000000000030000000000004A +:10D380000000002009000000040000000000000070 +:10D39000002010000000000000000000000000005D +:10D3A000000000000000002000000000000000005D +:10D3B0000000000400000000000000000000002049 +:10D3C000000000000000000000000000000000213C +:10D3D0000000000000080000000000000000000045 :10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C +:10D3F000000000001000000000000000000000001D +:10D40000000000000021000001800000000000007A :10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC +:10D4200000000000000000080000000000000000F4 :10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC +:10D440000000000000000000000000000000008458 +:10D4500000000000000000000000000000000008C4 :10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D48000000000010000000000000000000000009B +:10D470000000000000000000000000000084000028 +:10D480000000000100000000000004040000000093 :10D49000000000000000000000000000000000008C :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C @@ -97646,48 +97646,48 @@ :10D5500000000000000000000000000000000000CB :10D5600000000000000000000000000000000000BB :10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B +:10D58000000020000000000000000000200000005B :10D59000000000000000000000000000000000008B :10D5A000000000000000000000000000000000007B :10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000001100004A -:10D5D0000002000000110000000000000000000038 +:10D5C0000000000000000000000000000002000059 +:10D5D000000000000000000000000000000000004B :10D5E000000000000000000000000000000000003B :10D5F000000000000000000000000000000000002B :10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A +:10D61000008000000000000000000000000000008A :10D6200000000000000000000000000000000000FA :10D6300000000000000000000000000000000000EA :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA :10D6600000000000000000000000000000000000BA :10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D69000000000000000000000000000000000008A +:10D680000000000000900000008800000000000082 +:10D69000000000C0000000000000000000000000CA :10D6A000000000000000000000000000000000007A :10D6B000000000000000000000000000000000006A :10D6C000000000000000000000000000000000005A -:10D6D0000000010000000200000000000000000047 +:10D6D000000000000000000000000000000000004A :10D6E000000000000000000000000000000000003A :10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 +:10D700000000000000000000900001000000000088 :10D710000000000000000000000000000000000009 :10D7200000000000000000000000000000000000F9 :10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 -:10D7500000000000080000000000000002000000BF +:10D7500000000000090000000000000000000000C0 :10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 +:10D78000000000000000030000000000080000008E +:10D790000000000000000800000000000000000081 :10D7A0000000000000000000000000000000000079 :10D7B0000000000000000000000000000000000069 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 :10D7E0000000000000000000000000000000000039 :10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 +:10D80000000000000000000000000009000000000F +:10D8100000000020002000000000000000000000C8 :10D8200000000000000000000000000000000000F8 :10D8300000000000000000000000000000000000E8 :10D8400000000000000000000000000000000000D8 @@ -97699,11 +97699,11 @@ :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 :10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000084000000000000008440 +:10D8D00000000000000000840000000000000000C4 :10D8E0000000000000000000000000000000000038 :10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 +:10D90000000000000000000000000000008200E0B5 +:10D91000070000000000008100E007000021000077 :10D9200000000000000000000000000000000000F7 :10D9300000000000000000000000000000000000E7 :10D9400000000000000000000000000000000000D7 @@ -97740,11 +97740,11 @@ :10DB300000000000000000000000000000000000E5 :10DB400000000000000000000000000000000000D5 :10DB50000000000000000000000000000000006164 -:10DB60000006000D000000610006000D000000002E +:10DB60000006000D000000000000000000000000A2 :10DB700000000000000000000000000000000000A5 :10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000000000000085 -:10DBA0000000000000000000000000000000000075 +:10DB900000000000000005610A2F050D00A0000034 +:10DBA0000061002F000D01A0000000000000000037 :10DBB0000000000000000000000000000000000065 :10DBC0000000000000000000000000000000000055 :10DBD0000000000000000000000000000000000045 @@ -97780,158 +97780,158 @@ :10DDB0000000000000000000000000000000000063 :10DDC0000000000000000000000000000000000053 :10DDD0000000000000000000000000000000000043 -:10DDE00000000000000000002000200020000000D3 -:10DDF00000000000000040000000000040000000A3 -:10DE00000000000020000200200020002000000090 -:10DE1000000000000000880000000000200000005A -:10DE20000000000020002000000020002000200052 -:10DE300000000000000000000200000000002000C0 -:10DE400088000000000020042004200020002000A2 -:10DE5000400400000000000020000000000000005E -:10DE60002000000000000002200000000000000070 -:10DE700000000000000000000002000000000000A0 -:10DE8000000000020000000200001000000000007E -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000100000001000000052 -:10DEB0000000000000000000000000000000000062 -:10DEC00000000000000000004002000240020000CC -:10DED0000000000000000000000000000000000042 -:10DEE0002100000000900000000000000000000081 -:10DEF000000000000000040000000000000000001E -:10DF000000000020000000001008000000000000D9 -:10DF100000000000000000000000020000000000FF -:10DF200000000000000000001000000000000000E1 -:10DF300000000000000000000000000000000000E1 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000002000000003 +:10DE000000000000C0040000000000000000C0008E +:10DE100000000000000400040000000020040004D2 +:10DE2000008000800004000400039004000400004F +:10DE30002000000000400000000800040002200054 +:10DE40000004880000000004000020000002000020 +:10DE5000C0000000000000002000000000000000E2 +:10DE600000000000000000000004000000000000AE +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000C000001000000000000000C2 +:10DE9000104000000000000000020002000200002C +:10DEA0000000000400040001000100000000400226 +:10DEB000400010000090000200020002000200007A +:10DEC0000090000200C000020002000000000000FC +:10DED000000200400000000000028002000000027A +:10DEE00000000090000000000002000000000000A0 +:10DEF0000000020004000020008404A004040008C4 +:10DF00002020202000000000000000000000000091 +:10DF10000000000000000000000000000000000001 +:10DF200000000021000000000000020000001000BE +:10DF3000000000024100000000000000004000005E :10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000004000000BD -:10DF6000000000000000000000000000820000002F -:10DF7000000000000000000080000000020000001F -:10DF80000000000000010000000800000000000088 -:10DF90000000000800000000000000000000000079 -:10DFA000000000000000000040080008020000001F -:10DFB0000000000000080000000800000000000051 -:10DFC0000008000000000000000000080008020037 -:10DFD000000000000008000000080000000002002F -:10DFE000000800000000000000000082020800009D +:10DF50000200020000000200020001400040000038 +:10DF60000000020000400000020002000200000069 +:10DF7000008400000000A000200120212005800175 +:10DF80000001800180010088000002000200000002 +:10DF9000000000000000000000000000000002007F +:10DFA000020002000200000000000008000800005B +:10DFB000800000000001A000000000000008000038 +:10DFC0000000000000080000000000000008020837 +:10DFD0000000000000000000000000002008000811 +:10DFE0000000000000080000000000000008000819 :10DFF0000000000000000000000000000000000021 -:10E0000000000000000000000005000000004000CB -:10E010000000000000000000000000000000000000 -:10E0200000080000000000000000000000000000E8 -:10E0300000000000000000000000000000000000E0 -:10E0400000000000000000000000000000000000D0 -:10E0500000000000000000000000000000000000C0 -:10E060000000000000000000000000000000400070 -:10E0700000000000000000000000000000000000A0 -:10E080000000000000000000000000000000000090 +:10E00000000000040000000000000000000000000C +:10E0100000000000002100000000000000020000DD +:10E0200000000000000800000000000000000000E8 +:10E03000000000000000000000000400000040009C +:10E040004000000900000000000000000400000083 +:10E0500000000000000000000000040000000000BC +:10E060004000000000000000000000000400040068 +:10E070004000000000000000000000000000000060 +:10E08000000000000001000000000000000000008F :10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 +:10E0A00000000000000041000000000040000800E7 :10E0B0000000000000000000000000000000000060 -:10E0C0000000080000000000000000000000000048 +:10E0C0000000000000000000000000000000000050 :10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 +:10E0E000040000000000000000000000000000002C :10E0F0000000000000000000000000000000000020 -:10E10000000000000000000000000000000000000F -:10E1100000000800000000000000000000000000F7 -:10E1200000000800000000000000000000000000E7 -:10E13000000000000000000000000000A00000003F +:10E10000000000000000008000000000000000008F +:10E1100000000000000000000000000000000000FF +:10E120000000000000000000C000400000000000EF +:10E130000000000000000000000000000000C0001F :10E1400000000000000000000000000000000000CF :10E1500000000000000000000000000000000000BF -:10E160000000000000000000000008400000000067 -:10E17000000808000000000000000000000000008F -:10E18000000000000000000000000000000000008F +:10E16000000000000020000000000804000008007B +:10E17000000000000004000000000000000000009B +:10E18000000000000000000000200000000000006F :10E19000000000000000000000000000000000007F -:10E1A000000000000000000000000000000000006F +:10E1A000000000000000000040000000000000002F :10E1B000000000000000000000000000000000005F -:10E1C000000000000000040000000000000000004B +:10E1C000000000000000000000000000000000004F :10E1D000000000000000000000000000000000003F :10E1E000000000000000000000000000000000002F :10E1F000000000000000000000000000000000001F -:10E20000000000000000000000000000000000000E -:10E2100000000005000000000000000000000000F9 -:10E2200000080000000000000000000000000000E6 -:10E2300000000000000000000000000000000000DE +:10E20000000000000000000000000000000000020C +:10E2100000000000000800080000000000000003EB +:10E220000000000000089000000000000000000056 +:10E230000000400000000000000000001000000985 :10E2400000000000000000000000000000000000CE :10E2500000000000000000000000000000000000BE :10E2600000000000000000000000000000000000AE -:10E27000000000000000000000000084000000001A +:10E27000000000000000000000000000000000009E :10E28000000000000000000000000000000000008E :10E29000000000000000000000000000000000007E :10E2A000000000000000000000000000000000006E -:10E2B000000000000000000000000000000000005E +:10E2B0000000209011000090000400000420850060 :10E2C000000000000000000000000000000000004E :10E2D000000000000000000000000000000000003E -:10E2E000000000000000000000000000000000002E -:10E2F000000000000000000000000000000000001E -:10E3000000080000004100000000000000000000C4 -:10E3100000000000000000000000000000210003D9 +:10E2E000000400000000000010000000000000001A +:10E2F000000000001000000000000000000000000E +:10E30000000000000000000000000000000000000D +:10E3100000000003000300000021001100000000C5 :10E3200000000000000000000000000000000000ED -:10E33000000000000000000000008200000000005B -:10E3400000000000000000000000000000000000CD +:10E3300000000000000000000000000000000021BC +:10E3400000000100000000000000000000000000CC :10E3500000000000000000000000000000000000BD -:10E3600000000000000000000000000000000000AD -:10E370000000000000000000000008000000002075 +:10E3600000000000080000000000000000000000A5 +:10E37000000000000000000000000000000000009D :10E38000000000000000000000000000000000008D :10E39000000000000000000000000000000000007D :10E3A000000000000000000000000000000000006D -:10E3B000000000000000000000000000000000015C -:10E3C000000000000000000000000000000000004D -:10E3D000000000000000000000000000000000003D +:10E3B000000000000000000000000000000000035A +:10E3C000000000004000000000000000000000000D +:10E3D000000000000000000000000000000020001D :10E3E000000000000000000000000000000000002D :10E3F000000000000000000000000000000000001D :10E40000000000000000000000000000000000000C :10E4100000000000000000000000000000000000FC :10E4200000000000000000000000000000000000EC -:10E4300000000000000000000000000000000000DC -:10E4400000000000000000000000000000000000CC +:10E4300000000000000000000000000001000000DB +:10E4400000000000010010000000000000000000BB :10E4500000000000000000000000000000000000BC :10E4600000000000000000000000000000000000AC :10E47000000000000000000000000000000000009C :10E48000000000000000000000000000000000008C :10E49000000000000000000000000000000000007C :10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C -:10E4C000000000000000000000000000000000004C +:10E4B000000000000000000000000000000040001C +:10E4C0000000000003000300200000000000000026 :10E4D000000000000000000000000000000000003C :10E4E000000000000000000000000000000000002C :10E4F000000000000000000000000000000000001C -:10E50000000000000000000000000000000000000B -:10E51000000000000000000000000080000000007B +:10E50000000000000000000000000000000000808B +:10E5100000080000004000000009000000000000AA :10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000000000000CB +:10E5300000000000000000000000000000090000D2 +:10E5400000100000000041004000201041000000C9 :10E5500000000000000000000000000000000000BB :10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B +:10E57000000000100000000000000000000000008B :10E58000000000000000000000000000000000008B -:10E590000002000000000000000000000010000069 +:10E5900000100001008400010010000000020000D3 :10E5A000000000000000000000000000000000006B :10E5B000000000000000000000000000000000005B -:10E5C000000000000000000000000000000000004B +:10E5C0000000000000000000000001000100014008 :10E5D000000000000000000000000000000000003B :10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000001B +:10E5F000000000000001000000000000000000001A :10E60000000000000000000000000000000000000A -:10E6100000000000000000000000000000000000FA +:10E6100000000000880000000000880010000000DA :10E6200000000000000000000000000000000000EA :10E6300000000000000000000000000000000000DA -:10E6400000000000000000000000000000000000CA -:10E6500000000000000000000000000000000000BA +:10E640000000400008000000000000010000000081 +:10E6500000010000000000000000000000000000B9 :10E6600000000000000000000000000000000000AA :10E67000000000000000000000000000000000009A :10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A -:10E6A000000000000000000000000000000000006A +:10E690000000100000000000090009000000004117 +:10E6A0000900000000000000000000000000000061 :10E6B000000000000000000000000000000000005A -:10E6C000000000000000000000000000000000004A -:10E6D000000000000000000000000000000000003A +:10E6C0000000000080000000110000002010002168 +:10E6D00000080341000000000000000000000000EE :10E6E000000000000000000000000000000000002A -:10E6F000000000000000000000000000000000001A +:10E6F0000000000000000000000005000000000015 :10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000000F9 +:10E7100000000000000000000000000000110000E8 :10E7200000000000000000000000000000000000E9 :10E7300000000000000000000000000000000000D9 -:10E7400000000000000000000000000000000000C9 -:10E7500000000000000000000000000000000000B9 +:10E740000000000000080000000000000000008938 +:10E750000040000000020000000000000000000077 :10E7600000000000000000000000000000000000A9 :10E770000000000000000000000000000000000099 :10E780000000000000000000000000000000000089 @@ -97939,17 +97939,17 @@ :10E7A0000000000000000000000000000000000069 :10E7B0000000000000000000000000000000000059 :10E7C0000000000000000000000000000000000049 -:10E7D0000000000000000000000000000000000039 +:10E7D00000910000000000010000000000000000A7 :10E7E0000000000000000000000000000000000029 :10E7F0000000000000000000000000000000000019 :10E800000000000000000000000000000000000008 -:10E8100000000000000000000000000021000000D7 -:10E8200000000000210000000000000000000000C7 +:10E810000000000000000000000000842100000053 +:10E820000000008421000000000000000000000043 :10E8300000000000000000000000000000000000D8 -:10E8400000000000000000000000000000000000C8 -:10E8500000000000000000000000000000000000B8 +:10E840000000000000000000810000E00000000067 +:10E850000000004100E00700000000000000000090 :10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 +:10E870000000000000000000000000000084000014 :10E880000000000000000000000000000000000088 :10E890000000000000000000000000000000000078 :10E8A0000000000000000000000000000000000068 @@ -97992,27 +97992,27 @@ :10EAF0000000000000000000000000000000000016 :10EB00000000000000000000000000000000000005 :10EB100000000000000000000000000000000000F5 -:10EB20000000000000000A000000000000000000DB -:10EB3000000000A000000000000000000000000035 +:10EB20000000000005610A06050D00A005610A0647 +:10EB3000050C00A000000000000000000000000024 :10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 +:10EB50000000000000610007800D0000000005714A +:10EB6000002F000D00000000000000000000000069 :10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000000000085 +:10EB800000000000000000610006000D0000000011 :10EB90000000000000000000000000000000000075 :10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 +:10EBB000000000FF00000000000000000000000056 :10EBC0000000000000000000000000000000000045 :10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 +:10EBE00000000000BEFFFCFC000000000000000070 :10EBF0000000000000000000000000000000000015 :10EC00000000000000000000000000000000000004 :10EC100000000000000000000000000000000000F4 :10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000000000000000D4 +:10EC30000000000000FF00000000000000000000D5 :10EC400000000000000000000000000000000000C4 :10EC500000000000000000000000000000000000B4 -:10EC600000000000000000000000000000000000A4 +:10EC60000000000000003C7DFCFC000000000000F3 :10EC70000000000000000000000000000000000094 :10EC80000000000000000000000000000000000084 :10EC90000000000000000000000000000000000074 @@ -98020,7 +98020,7 @@ :10ECB0000000000000000000000000000000000054 :10ECC0000000000000000000000000000000000044 :10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000000000024 +:10ECE0000000000000000000BEBEC0FC00000000EC :10ECF0000000000000000000000000000000000014 :10ED00000000000000000000000000000000000003 :10ED100000000000000000000000000000000000F3 @@ -98028,185 +98028,185 @@ :10ED300000000000000000000000000000000000D3 :10ED400000000000000000000000000000000000C3 :10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 +:10ED6000000000000000000000008282C0FC0000E3 :10ED70000000000000000000000000000000000093 :10ED80000000000000000000000000000000000083 :10ED90000000000000000000000000000000000073 -:10EDA00000000000000020002000200020000000E3 -:10EDB000000020052000400020004000000020004E -:10EDC0002080208000002000200020002000000083 -:10EDD00088002000200020002000200000002000EB -:10EDE0002000200000000003200020002000200060 -:10EDF0004000200020002000200020002000020011 -:10EE00002000200020000000200020002000200022 -:10EE10002000000020002000200020002000200012 -:10EE2000200020002100000000000002000410006B -:10EE30000000400040020000000000000000000050 -:10EE4000409000040004000040400000000000006A -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 -:10EE70000000000000004000000000000000000052 -:10EE80000000000000000000000000000900000079 -:10EE90000000000000000000000000000000000072 -:10EEA0000000009040902090100200000000000040 -:10EEB0000000000000000000000000000000000052 +:10EDA0000000000000002000200004000400040017 +:10EDB00004000400020020000000200020002000C9 +:10EDC000200020002004200020042000200020003B +:10EDD00020002000200000000000200420042180EA +:10EDE00020002000208000032000200020002000C0 +:10EDF0002000200020002000000000002000200053 +:10EE0000200020002004200020000000200020001E +:10EE100020002000200020008800000020002000AA +:10EE20002000200020002000000000000002000060 +:10EE30008000800280008000400000000000000090 +:10EE40000000100010020000100200000800000086 +:10EE5000000200000000008440040004000000C024 +:10EE60000840409040904120000000024000000017 +:10EE7000000200020002009000A0009000020002C8 +:10EE8000000200000002000000000000000000007E +:10EE900000000000000000020090000200000002DC +:10EEA000000000024000400200900000000000004E +:10EEB0000000000000000000000000000000001042 :10EEC0000000000000000000000000000000000042 -:10EED0000000000000000000000000000000000032 -:10EEE000000000000000000000000000000800001A -:10EEF00000080008000000000000040000000000FE -:10EF00000000000000000000000000000000000001 -:10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000004000000000000DD -:10EF300000000000000000000000000000000000D1 -:10EF400000000000000000000000000000000000C1 -:10EF500000000000000800000008000000000000A1 -:10EF60000008000000000000000000000000000099 -:10EF70000000000000000008000000080020000061 -:10EF80000000000800000000000000000000000871 -:10EF90000008000800080008000040080000000801 -:10EFA0000008000800000000000000000000000051 -:10EFB000000000000000000000000000000300004E -:10EFC0000000000000002000000000090000000018 -:10EFD0000000000000000000000000210008000008 -:10EFE000000000000000000000000003000000001E -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 -:10F02000000000000000000001009000000001004E +:10EED00000000010001000100010000000000000F2 +:10EEE0000010020000000000000000008800000088 +:10EEF000000004000000000000100010004000406E +:10EF000008000000040004000820082000000000A1 +:10EF1000080000000200020000000200880000005B +:10EF20000000820000000040000088000000000097 +:10EF30000000000002000088000000000000020045 +:10EF400000000000040004000000000000000000B9 +:10EF50000000000000000000000800080000000899 +:10EF60000000000000000000000000080000000099 +:10EF700000000008800800000000000800080000F1 +:10EF8000000800080000800082000009000900005D +:10EF9000000002080008000000000008000800004F +:10EFA000020800080400020800040008000800002D +:10EFB0000021000000000000000000000000000030 +:10EFC0000008000000000000000000000000000039 +:10EFD000000000000000000300000000000000002E +:10EFE00000000000000010000300040000110000F9 +:10EFF000000000000400A080100090000000040049 +:10F0000000000400000000000000000000000000FC +:10F0100000000400000000000000000000000000EC +:10F020000408000010004010000000000000000074 :10F0300000000000000000000000000000000000D0 -:10F040000000000000000000800000000000000040 +:10F04000008200001000000000A000000084418445 :10F0500000000000000000000000000000000000B0 -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F090000000000000000000000000000000000070 -:10F0A000000000000000000000001000030000004D -:10F0B000200000000011000000000008000000080F -:10F0C000000000000000000000050000C00000007B -:10F0D0000000000000000000000000080000000028 -:10F0E0000008000000000000000000000000000018 -:10F0F00000000000000800000008000000080000F8 -:10F10000000000200000C00000000000000000001F -:10F1100000000000000000000000000000000800E7 -:10F1200000000000000000000000000000001000CF -:10F1300000000000000000000000030000000000CC -:10F1400000000000000000000000000000000000BF -:10F15000000000000000100000000000000000009F +:10F06000000000000008000040008400C0000020F4 +:10F070000000000000880000001000000082000076 +:10F080000000000009000000000000000000000077 +:10F09000040000000000000000000000000000006C +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C000010000000000000000000000000000003F +:10F0D0000000000000000000000000000000000030 +:10F0E0001000080000000000000000000000000008 +:10F0F00000000000C004000000000040000000000C +:10F1000000000000000000000000000000080008EF +:10F1100000400004020000000000000000000000A9 +:10F120000000A000000000000040002100000020BE +:10F13000000082000000000000000000000000004D +:10F1400000000400000000000000000000000000BB +:10F1500000000000000000000000000000000000AF :10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F18000000000000000000800080000000000006F -:10F19000000000002100100000000000000000003E +:10F17000000000000000000100000000000000008E +:10F18000000000000000000000000000000000007F +:10F1900000000000004100000000000000400000EE :10F1A000000000000000000000000000000000005F -:10F1B00080000000000000000000000000000000CF -:10F1C000000000000000000000000808000000002F -:10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F -:10F1F0000000000000000000000000080000000007 -:10F2000000000000040000000000000000000000FA +:10F1B0000000000000000000000084008800000043 +:10F1C000080000000000C000000000000000000077 +:10F1D0000000000000080000000000000000000027 +:10F1E000000000000000A0000000000000038400F8 +:10F1F00088008808C0000000000002000000000035 +:10F20000C00000000000000000110000000000002D :10F2100000000000000000000000000000000000EE -:10F2200000000000000000000000040004000400D2 -:10F2300000000000000000000000000000000000CE -:10F2400000000000000000000000000000000000BE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000010000000000000000000BE +:10F24000000000000008000800000000008400002A :10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E +:10F26000000000000000002000000000000000007E +:10F2700040000002090000000000000080000000C3 +:10F280004188000000000000000000000040000075 :10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000000005E +:10F2A000000000002100000000000000000000003D :10F2B000000000000000000000000000000000004E -:10F2C00000000000000000000000000000008400BA -:10F2D000000000000000000000210000000000000D -:10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F3000000000000000000000000000000000000FD -:10F3100000004000000000000000000000000000AD -:10F3200000000000000000000000000000000000DD -:10F3300000000000C000000000000000000000000D -:10F34000000000400000000000000000000000007D +:10F2C000000000000000000000000000000000003E +:10F2D0000000000000000010000000000000000816 +:10F2E0000008100000000000000000000000000006 +:10F2F000000000000000000002000000000000000C +:10F3000000000000000000030000000000000000FA +:10F310000000C000000000000000000000210808FC +:10F3200000000221000000000000000000000000BA +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD :10F3500000000000000000000000000000000000AD :10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D +:10F37000000000000000000000008000000100000C :10F38000000000000000000000000000000000007D -:10F39000000000000000000000000000000000006D +:10F39000000000000000001000001100000000004C :10F3A000000000000000000000000000000000005D -:10F3B000000000000000000000000000000000004D -:10F3C000000000000000000000000000000000003D +:10F3B000000000000040000000000000000000000D +:10F3C000000000000000000000020000000000003B :10F3D000000000000000000000000000000000002D :10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D -:10F4000000000000000000000000000000000000FC +:10F3F00000000000000000C0000000008840000085 +:10F4000001000000000000000000000000000000FB :10F4100000000000000000000000000000000000EC :10F4200000000000000000000000000000000000DC -:10F4300000000000000000000000000010000000BC -:10F4400000000000000000000000000000000000BC -:10F4500000000000000000000000000002000000AA +:10F4300000000000000000000000000000000000CC +:10F44000000000000000000000000080000000003C +:10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000000007C -:10F49000000000000000000000000000000000006C +:10F47000000000000000000000800000000000000C +:10F480000000110000000300000000000000000068 +:10F490000000000000000000000020000000080044 :10F4A000000000000000000000000000000000005C -:10F4B00000000000000000000000030000008900C0 +:10F4B000000000000000000000000000000000004C :10F4C000000000000000000000000000000000003C -:10F4D000000000000000000000000008000000051F +:10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB -:10F5100000000000000000000000000000000000EB -:10F5200000000000000000000000000000000000DB -:10F5300000000000000000000000000000001000BB -:10F540000300410000000000000000000000000077 -:10F5500000000000000000000000000000010000AA +:10F4F000000000000000000000000000000200808A +:10F5000080000000001000008000808000000000EB +:10F51000000000000000000000000000000000806B +:10F52000000000800000000000000000000000005B +:10F5300000000000000000000000000000000000CB +:10F54000000000000000000000000000000000209B +:10F55000000000900000000000000000000000001B :10F56000000000000000000000000000000000009B -:10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000007B +:10F5700000000000000000000000000020008801E2 +:10F580000084C00800004001A0004000C0C000008E :10F59000000000000000000000000000000000006B -:10F5A000000000000000000000000000000000005B +:10F5A000000800000008000000000000000000004B :10F5B000000000000000000000000000000000004B -:10F5C000000000000100000000000000000000003A -:10F5D000000000000000000000000000000000002B -:10F5E000080088000000000000000000000000008B -:10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA +:10F5C000000000000000000000000000000001003A +:10F5D000000020000000000000000000000000000B +:10F5E000000000000000000000000000000000001B +:10F5F00000000000000000000000000000002020CB +:10F600000000908890C00000000000000000000092 :10F6100000000000000000000000000000000000EA -:10F6200000000000000000000000000000000000DA +:10F620000000000084000000000000000000000056 :10F6300000000000000000000000000000000000CA -:10F6400000000001000000010000000000000000B8 -:10F6500000000000000000000000000000000000AA +:10F6400000000000000000000000000000000000BA +:10F650004100000000000000000000000000000069 :10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A -:10F69000000000000000000000000000000000006A -:10F6A000000000000000000000000000000000005A +:10F6800000000000000008800000000000000000F2 +:10F690000300000000000000000000000000000067 +:10F6A000000009000000000005000000000000004C :10F6B000000000000000000000000000000000004A -:10F6C00000000010000800000041000000000000E1 +:10F6C000000000000000000000000000000000003A :10F6D000000000000000000000000000000000002A :10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 -:10F7100000000000000000000000000000000000E9 -:10F7200000000000000000000000000000000000D9 +:10F700000000000080080080000000000000008869 +:10F710000080000000000000000000000000000069 +:10F7200000000000000000200000000000000000B9 :10F7300000000000000000000000000000000000C9 -:10F740000000000000800000000000000000000039 +:10F7400000000000000000000000000000000000B9 :10F7500000000000000000000000000000000000A9 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 -:10F780000000000000000000000000000000000079 -:10F790000000000000000000000000000000000069 -:10F7A0000000000000000000000000000000000059 +:10F7800000000000900088002084000000000000BD +:10F79000000800020000000000000000000000005F +:10F7A0000000000000000000000100000000000058 :10F7B0000000000000000000000000000000000049 -:10F7C0000000000000000002000000000000000037 -:10F7D0000000000000000000000000000000000029 -:10F7E000000000000000840000E0000000000000B5 +:10F7C0000000000000000000000000000000000039 +:10F7D00000000000000000000000210060000000A8 +:10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 -:10F8200000000000000000000000000000000000D8 +:10F8000000000000000000210000070000000000D0 +:10F81000600000E007000021000000000000000080 +:10F820000000000000000000884100E00700000028 :10F8300000000000000000000000000000000000C8 -:10F840000000000000000000880000E00000000050 +:10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 :10F870000000000000000000000000000000000088 -:10F880000000000000000000000000000000000078 +:10F88000000000000000000000000000C3C300C32F :10F890000000000000000000000000000000000068 :10F8A0000000000000000000000000000000000058 :10F8B0000000000000000000000000000000000048 @@ -98214,36 +98214,36 @@ :10F8D0000000000000000000000000000000000028 :10F8E0000000000000000000000000000000000018 :10F8F0000000000000000000000000000000000008 -:10F9000000000000000000000000000000000000F7 -:10F9100000000000000000000000000000000000E7 +:10F9000000000000000000000000050000000000F2 +:10F9100000C3000000000000000000000000000024 :10F9200000000000000000000000000000000000D7 :10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 -:10F9500000000000000000000000000000000000A7 +:10F950000000000000000000000000000000FF00A8 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 -:10F990000000000000000000000000000000000067 +:10F990000303C3C3000000000000FFFFFFFF0000DF :10F9A0000000000000000000000000000000000057 :10F9B0000000000000000000000000000000000047 :10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000000000000000017 +:10F9E000FF00000000000000000000000000000018 :10F9F0000000000000000000000000000000000007 -:10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 +:10FA0000000000000000000000000000000055554C +:10FA10003C3C030300000000000000000F0F7D28A5 :10FA200000000000000000000000000000000000D6 :10FA300000000000000000000000000000000000C6 :10FA400000000000000000000000000000000000B6 :10FA500000000000000000000000000000000000A6 -:10FA60000000000000000000000000000000000096 -:10FA700000610007800D0000000000000000000091 +:10FA600005002A00050000A00000000000000000C2 +:10FA70000000000000000000000000000000000086 :10FA80000000000000000000000000000000000076 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000000000000000000000000000056 -:10FAB0000000000000000000000000000000000046 +:10FA9000000020280040000800000065000F800DD5 +:10FAA00000A50000000000000000000000000000B1 +:10FAB000000005610A2F850D20A000000000000055 :10FAC0000000000000000000000000000000000036 -:10FAD000000000600007800000000000000000003F +:10FAD0000000000000000000000000000000000026 :10FAE0000000000000000000000000000000000016 :10FAF0000000000000000000000000000000000006 :10FB000000000000000000000000000000000000F5 @@ -98251,7 +98251,7 @@ :10FB200000000000000000000000000000000000D5 :10FB300000000000000000000000000000000000C5 :10FB400000000000000000000000000000000000B5 -:10FB500000000000000000008282C0C00000000021 +:10FB500000000000000000000000000000000000A5 :10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 @@ -98259,7 +98259,7 @@ :10FBA0000000000000000000000000000000000055 :10FBB0000000000000000000000000000000000045 :10FBC0000000000000000000000000000000000035 -:10FBD000000000000000000000008282C0C00000A1 +:10FBD0000000000000000000000000000000000025 :10FBE0000000000000000000000000000000000015 :10FBF0000000000000000000000000000000000005 :10FC000000000000000000000000000000000000F4 @@ -98267,7 +98267,7 @@ :10FC200000000000000000000000000000000000D4 :10FC300000000000000000000000000000000000C4 :10FC400000000000000000000000000000000000B4 -:10FC5000000000000000000000000000000F0F0F77 +:10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 :10FC70000000000000000000000000000000000084 :10FC80000000000000000000000000000000000074 @@ -98275,106 +98275,106 @@ :10FCA0000000000000000000000000000000000054 :10FCB0000000000000000000000000000000000044 :10FCC0000000000000000000000000000000000034 -:10FCD0000000000000000000000000000000000F15 -:10FCE00000008400000088002000C0002000000008 -:10FCF00020008800C00020002000200020002000FC -:10FD000020002000C000200020002000880000000B -:10FD10008800200020008800200020002000200013 -:10FD2000200000022000200000002000200004002D -:10FD3000880020000000200020002000200020007B -:10FD40002000200088000000400084008400200083 -:10FD50008804200488002080200020020080000009 -:10FD600020002000004000002000000000400002B1 -:10FD70000000000000000000000000000090009063 -:10FD8000000200000000000000000000000005402C -:10FD90000040000000000000000000000000000023 -:10FDA0000000000000000000000000000000000053 -:10FDB000000040400002400000000002410000003E -:10FDC00000000000000000000000000000000040F3 -:10FDD0000040004000020000000800000901000887 -:10FDE0004008000000C000000000000000100000FB -:10FDF00000000000040000000000000000000000FF -:10FE000000000200040000000000000000040020C8 -:10FE100000200020002000200020002000800000A2 -:10FE200000000200000000000000000000000000D0 -:10FE300000090009000000000000000000000000B0 -:10FE400000000000000000000000000000000000B2 -:10FE5000000000000200040000002000000000007C -:10FE60000008000002024000000000000000000046 -:10FE70000000000000000000000000040000000876 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000840000000000840004000000000008 +:10FCF000000400000000000084002000200020001C +:10FD000020000000000000008800880088008804AF +:10FD10008800000000000000200088802080202053 +:10FD2000202000030400040004020404200020003A +:10FD300020002000002000200080208020002000E3 +:10FD4000200020008802000000008804200020001D +:10FD5000200420000000000000002000000020001F +:10FD60002000200000000000000000000000000053 +:10FD7000000000000000000000000004400000003F +:10FD8000000000000002000200040000000000006B +:10FD9000000000000002400240000004002000209B +:10FDA00008030003000000900000000000000002B3 +:10FDB0000000004000900091009100200020404091 +:10FDC0000000404000400040000200000000100021 +:10FDD0000002008200044002000000040002000251 +:10FDE00000000002000200100000041002100000D9 +:10FDF00004000400040000000000000000000000F7 +:10FE000000000000020000000000000008000000E8 +:10FE100000880404048000000000080000000000C6 +:10FE200000000200020000000000000000000000CE +:10FE300000000000000000000000000000000400BE +:10FE400000000000020008000000000000000800A0 +:10FE5000000000000000820000000200020002001A +:10FE6000080002000800020000000010000000006E +:10FE7000000000080200020800000000000000006E :10FE80000000000000000000000000000000000072 -:10FE90000001000100832001000100010001002099 -:10FEA000000800000000000000000000000000004A -:10FEB000000000000000000004000000000000003E -:10FEC000000000040000008202080000000000089A -:10FED000000000000000000002000000800000841C -:10FEE0000000000000000009848200000000000003 +:10FE9000000000050001000409000000000000004F +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000020000000000000030 +:10FED000000000000000000004000000000000001E +:10FEE0000000000000000000000000000000000909 :10FEF0000000000000000000000000000000000002 -:10FF0000000000000000000084000000000000006D +:10FF000000000000000000000000000000000000F1 :10FF100000000000000000000000000000000000E1 -:10FF200000000000000000000000000000030000CE -:10FF300000080000000000000000000000000000B9 -:10FF400000000000000000000000000000000000B1 -:10FF500000000000000000000000000000000000A1 -:10FF60000400000000000400880000000000000001 -:10FF70000000000000000000400000000000000041 +:10FF200000000000400200002000000084000000EB +:10FF30000000080000004003040040000000000032 +:10FF400000000400000000000000000000000000AD +:10FF500000009000000000000000400000000000D1 +:10FF600000000000400000000000400000004100D0 +:10FF7000030000000000000000000000000000007E :10FF80000000000000000000000000000000000071 -:10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000000000000000000051 -:10FFB0000000000000000000000000000000000041 +:10FF9000000000000000000000000000030000005E +:10FFA000000004000000000000000000000000004D +:10FFB000002000000000000000000000000003001E :10FFC0000000000000000000000000000000000031 :10FFD0000000000000000000000000000000000021 -:10FFE0000000000000000000000005000000880084 -:10FFF00000000000000000000000001000000000F1 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000000001 :020000040018E2 -:10000000000000000000000084000000020000006A -:100010000000C00000000000000000000000000020 -:1000200000000000000000000000A0000008000028 -:1000300000000000000000000000080000000000B8 -:100040000800C000000000000000000002080000DE -:10005000C00082000000080008000000000000004E -:10006000000020000004C0001080080040000000D4 +:1000000000000000080004000400040004000800D0 +:1000100000000000080008000000000000000000D0 +:100020000000000082000800000000000000000046 +:10003000C00000000000820400000000000000007A +:10004000A00000000000824100000000001000003D +:100050000800000000000000000000000000004058 +:100060000000000000000000000000000000001080 :100070000000000000000000000000000000000080 -:1000800000000082000000000000000000000000EE -:100090000000000000000000000008000000000058 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 -:1000D00000000800000041000000000021000000B6 -:1000E0000008000080000000000080080000800080 -:1000F00002A0080000000000000000000000000056 -:10010000C00000000000000000000002000000002D -:10011000840000000000000000000000000000005B -:1001200000000000000000000000000000000000CF -:1001300000020000000000000000000000000000BD -:10014000A000000300000000000800000000820082 -:100150000000100000000000000000000800000087 -:1001600000000000000000000000820000080008FD -:10017000C0000000000000000000000000000000BF -:1001800000000000008400000000000000000000EB -:10019000000000200000000000000000000000003F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000001040 +:1000B000000000000000000000010000000000003F +:1000C000000003000000000000000000110000001C +:1000D00000001000080008000800100000000000E8 +:1000E00000000300000000000000000800080008F5 +:1000F00000040000000000000000000000000000FC +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:10012000000000000000200000000000400000006F +:1001300000000000000000000000000000000000BF +:10014000000000000003000000000000000000119B +:10015000000000410000000000000000000000005E +:10016000000000000000000000000000000000008F +:100170000000000000000000080000000000000077 +:100180000800000000000000000000000000000067 +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000409040043B +:1001B00004000088000000400000008821000000CA +:1001C0000004000000000400000000000000000027 :1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000010E -:1001F00000200004000000000000000000000000DB -:1002000000000000000000000000000000000008E6 +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE :1002100000000000000000000000000000000000DE -:1002200000000000000000030000082100000000A2 -:1002300000000008000000000000000008000000AE -:1002400000000000000000000000000000000000AE -:100250000000000000000000000008000000000096 +:1002200000000000000000000000000000000000CE +:1002300000000000100000000000000000000000AE +:10024000820000000000000000000000000000002C +:10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E -:1002700008210080848000001000000000000000C1 -:100280000000000000080002000000004100000023 -:100290000000000000000500000000000000000059 +:100270000800000004000000000000000000000072 +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E :1002B000000000000000000000010000000000003D -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000080800000000000000827C -:1002F00000000000200800020008000000000000CC +:1002C00000000000008200000000000000000000AC +:1002D000000000000090000000000000000000008E +:1002E000000000000000000000000090000020005E +:1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD :1003200000000000000000000000000000000000CD @@ -98382,56 +98382,56 @@ :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D -:1003700088000000000000000000000000000000F5 +:10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D +:1003B000000000000000000000000000000003003A +:1003C00000000800000000000000000000004000E5 :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D -:1003F000000000000000400021000000000000009C +:1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC :1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC +:1004200000000000000000000000000200000000CA :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC -:10045000000000000000000000000000000000009C +:10045000000000000000008000000000000000001C :10046000000000000000000000000000000000008C -:100470000000000000000000080000002000410013 +:10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C -:1004A00000000000000000000000001000000088B4 -:1004B00000000010000000880000000000000000A4 +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000088000000882C :1004C000000000000000000000000000000000002C -:1004D000000000000000000000000000000000001C +:1004D000000000000090000000100000000000007C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC -:1005000001000000000000000000000000000000EA +:1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000800C3 -:1005300000000000000008000000000000000000B3 +:1005200000000000000000000000000010000000BB +:10053000010000000000000000000000000020009A :1005400000000000000000000000000000000000AB -:10055000000000000000000000000000000000009B +:100550000000000001000000080000000000000092 :10056000000000000000000000000000000000008B -:100570000000000000004000000000010000000139 -:100580000001000100000000000000000000000069 +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B -:1005A0000000000000000000000000000900000042 -:1005B0008000000002000000800000000000000039 -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B +:1005A000000000000000000000000000001000003B +:1005B0000000080000000000000000000300000030 +:1005C0000000000000000000000000000800000023 +:1005D0000000000000000800000000000000000013 :1005E000000000000000000000000000000000000B -:1005F000000000000000000900110003004100029B -:100600000010002100410000000000000000000078 +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A +:1006300000000000000000000000000000000008B2 +:1006400000020000000000000000000000000000A8 +:100650000000000000000000001100210000000068 :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A -:1006800000800000000000000000000000000000EA +:10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A @@ -98439,15 +98439,15 @@ :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA -:10070000000000C000000000000000000000000029 +:1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 -:100730000000000000002100000000000000210077 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:10077000000000000000000000000000000000E099 -:100780000000000000000000000060000000000009 +:100730000000000000840000000000000000000035 +:10074000000000810000070000000000880000E0B9 +:100750000000000000000000000000000041000058 +:100760000700000000000000000000000000000082 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 @@ -98490,29 +98490,29 @@ :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000500B1 -:100A40000A00050000A005000A00050000A0000043 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 +:100A30000000000000000000000000000000006155 +:100A40000006000C0000000000000000000005008F +:100A50000A28050000A0000000610007800D2000AA +:100A6000000000000000000005000A28050000A0AA :100A70000000000000000000000000000000000076 -:100A8000000000000000000000610006000D0000F2 -:100A900000610006000D00000000000000000000E2 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 +:100AC000000000003C3C00000000000000000000AE :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000003CBCED -:100B10003C7C000000003CFC3C3F0000000000006A +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 :100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 +:100B40000000000000003C3C00000000000000002D :100B50000000000000000000000000000000000095 :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 -:100B90003CBC3C7C000000003C3C3C3C00000000B5 +:100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 @@ -98520,7 +98520,7 @@ :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 -:100C100000000000000000000000003C3C0000005C +:100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 @@ -98529,421 +98529,421 @@ :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 -:100CA0000000200041002000000320000080208080 -:100CB0000500018020412080C08088002000C00005 -:100CC0000000200020002000000020000000200084 -:100CD0002000840020002000C00020002000200010 -:100CE0000003000020002000200000002000000081 -:100CF0002000000000002000200020002000200034 -:100D0000100000002000200020008400210084004A -:100D10002000088001002000218000000200040063 -:100D2000400020400040C0020000400000000020C1 -:100D300000208800041000000040001000000002A5 -:100D400000000000000000020000000000000000A1 -:100D50000000000000000000000020000000400033 -:100D6000000000000000000000000002000200007F -:100D70000000000220000000000000000000000051 -:100D80004000000000000000000200000000080019 -:100D90000000000080200800210004400000C0C0C6 -:100DA000400020000004000404000008090008407E -:100DB00001100110020002000310001000080004DE -:100DC0000000000000000000000000000000000023 -:100DD0000000000000100000000000000003000000 -:100DE00000000000000000000000000000000008FB -:100DF00000040000000000080000000000000000E7 -:100E000000000000000400000000000500050008CC -:100E100000000004000002890204011008104000D4 -:100E20000800000400100009008580080001840803 -:100E30008041040104098000800884010001000051 -:100E40000000000000000004000000040004000492 -:100E500000040082000200100004001000100004D2 -:100E6000000800000000000000080004000000006E -:100E700000840008000000840000000800840000D6 -:100E8000008400080008008400080000000000083A -:100E900000040082410809088004800902018000E2 -:100EA000808880820008001101000000000300001B -:100EB0000000010000080021000000050000010002 -:100EC000002104219000002100000000000000002B -:100ED0000021000800000021000000000000004088 -:100EE00000080000000000080000000300000000EF -:100EF00000000000000000000000000000000000F2 -:100F00000000000800000000000800000000004091 -:100F100000000005000000000021000000000004A7 -:100F20000004000090000400880804000000000095 -:100F300000000000040000000000000008000000A5 -:100F4000040000000800000000000008000000008D -:100F50000000000000000000000000A000000008E9 -:100F600000000082000000000000000000000000FF -:100F70000000000800000000000010000000000059 +:100CA000C000000000800080200000000000000460 +:100CB000000000000000000000000000A000000094 +:100CC00000000000000040002000000000000004C0 +:100CD00000000002000000004000000020000000B2 +:100CE00000020004C00400042004200000000000F2 +:100CF0000000000000000000400000800000000034 +:100D0000000000000002000010002000000010049D +:100D100000000000008040002100000000000000F2 +:100D200000000500000010020002000000000000AA +:100D3000000200000002000200002000000200008B +:100D400010002000000000020000400040004000B1 +:100D50000000000040900000000041000000000280 +:100D600000000000004100410001004100000000BF +:100D7000000000400040004000000020000200028F +:100D800000000000000000004000002000024000C1 +:100D90004000100240020910090202020084000211 +:100DA00040000002000000000000000000000003FE +:100DB000000000000000000000000000040000002F +:100DC0000010000000000400000000000400040007 +:100DD0000000000000000000000090000000004043 +:100DE00000100010000082000000000082000000DF +:100DF00000000010001000000000000000000400CF +:100E000004000020822004000400002000200200D2 +:100E100002000000000000000200000000000400CA +:100E200083000400040000000000000000820000B5 +:100E3000000000000008000000820000008400089C +:100E4000000800080010000800080008001000005A +:100E500000000000008200000000000000000040D0 +:100E6000000800040040000000100010000800000E +:100E70000000000000000000000000000000000072 +:100E8000C108C108000100018000800000050001C8 +:100E9000000804000000000800080900000000002D +:100EA000800804C0800080000000000000000002F4 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000220 +:100ED0000000000000000000000000000000000012 +:100EE0008408000008008200000004030003A00042 +:100EF00000000000000000009000000090000000D2 +:100F000000000000000008000000000000000000D9 +:100F1000000000000000000800004041000000C187 +:100F200008000000000000000000000000000008B1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000A000A0110040 +:100F600000000400002000000000000000000084D9 +:100F70000020000000000000000000000000000051 :100F80000000000000000000000000000000000061 -:100F90000008000000000000000000000000000049 -:100FA00041010001110000000000000000200020AD -:100FB00001031000004010000100010000200000AB +:100F90000000000000000000000000000000000051 +:100FA00000108000000000000000000000000000B1 +:100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:101000000000000000000000000000000800840054 -:1010100000000000C000000090000000000004A0DC -:101020000403040000000011820000000011000110 -:101030000001040080000001000802000200000915 -:101040000000000800080082008441000000000049 -:1010500000000000008200004100000000000000CD -:101060000000001000000000000000000000000070 -:101070000000000020000000000000001000000040 -:101080000000000000000000000000000000000060 -:1010900000000000000000C000000000050000008B -:1010A0008021800080A0008200A0080800000000CD -:1010B0000000002000000000840020080000000064 -:1010C0000000000000208200002100000003000456 -:1010D00000000003200000210008000000030000C1 -:1010E00000000008000000000000000000080000F0 -:1010F00000000000000000000003000000000008E5 -:1011000000080000080000000000C000000000000F -:10111000000000000000000000008400000000004B -:1011200082000000000000208800004140050821E6 -:10113000002100000000000000000000000000008E -:10114000000000000000000100000000000000009E -:10115000000000000000000000000000000000008F -:1011600000080000000000000082000000000000F5 -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000000000000000000010088110009009C -:1011B0000000000000000000000000880000002186 -:1011C0000000000000000000000000000000000817 -:1011D00000090000000000080000000000000000FE -:1011E00000002000000000000000000000000000DF -:1011F00000000000000000000000000000000000EF -:1012000000000000200000000000000000000000BE -:1012100000000000000000000000000000000000CE -:1012200000000000000000050000000000000811A0 -:101230000000C10301210000000000000020200088 -:10124000000020000000000000000000200000005E -:10125000000000000000000000000000000020006E -:10126000000000000000000000000000210000005D -:10127000000000000000000020000000000000004E -:10128000200000000000000000000000000021001D -:10129000000000000000000000000000000000004E -:1012A0000000000800100000000000000084009012 -:1012B0000000000010900200000100000001000189 -:1012C00000C09004008890C000C0902000108220D0 +:100FD0000000000000000000000010000000000001 +:100FE00000000000000000000040000000000000C1 +:100FF000004000000020000000000000020000008F +:1010000000000000000000800000840000000000DC +:101010000800A00008000000400040004000000060 +:101020000010040000000005004000000000000067 +:1010300000000000000800000000000000000000A8 +:10104000000000000082001000000000000000000E +:101050000000000000000000000000000000000090 +:10106000000000000082008200000000000000007C +:10107000000000010000000100000000000000006E +:1010800000000000000000000002000000900000CE +:1010900010000000000021004000001003000000CC +:1010A000000000010000000000000000000000003F +:1010B00000080020001000000000000000000000F8 +:1010C0000000000000000000000000100008000800 +:1010D0000000000000000000000000000000000010 +:1010E00000000000000000000000000000400000C0 +:1010F00000000000040000000002000800000000E2 +:1011000000080008000004000000000004000000C7 +:10111000000000000000000000009000000000003F +:1011200000000000000000000000000000000000BF +:10113000000000000000000000900000000000001F +:10114000000000000000000000000000000000009F +:101150000000000000000000000000A000000000EF +:101160000000000000000000000040040004000037 +:1011700000900000000000000000002000000000BF +:1011800000000000110000900000000000000200BC +:10119000000000000000000000000020000000002F +:1011A000000000000000000000000000000000003F +:1011B0000000000000000008000000000000000027 +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00008000000000000000000000000000000E7 +:10120000000300110000000000000000000040800A +:1012100000000800100000000002000000000000B4 +:101220000005000002050000004100000008000069 +:1012300000040008000000000000000000000000A2 +:1012400000000000000800820000008200A00000F2 +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:101290000002000000040000000000000000000048 +:1012A000000000000000000000400090000400006A +:1012B000000000000000000000002000000000000E +:1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E :1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:101320000000000800000010000210C010108841EA -:10133000909000C10021002000C1001100050008AC -:1013400000200080800000008000118080800080EC -:10135000800000000000000000000000000000000D +:1013100000000000000000010000000000000000CC +:101320000000000000000000000020C0008800A0B5 +:1013300084400000000000000000000000000000E9 +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D :10136000000000000000000000000000000000007D :10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A0000000000000800000000000009188109004 -:1013B0000090800400C100100000001002800900AD -:1013C0002000092000000002808080000000002131 -:1013D00080808080000000410000000000000000CC +:101380000900000000000000000000000000000054 +:101390000000000000200003000800200000000002 +:1013A00000000000000000000000000000800000BD +:1013B000008000000000000000000000200000008D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D :1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC +:1013F00000000000000000000000000000000010DD +:10140000000080108080000000000000000000004C :1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000004080FC -:10143000902110888820800000000000800000902B -:10144000008400000121000090C082C0C00820007C -:1014500000A00810C0020000000100900000000081 +:1014200000800000008000000000000000000000BC +:10143000000000008000000000000000000000002C +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C :10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B00089C091820110C040080088002000C0004F -:1014C000000001000200000002000090409082C075 -:1014D00011200000909088C0000000000000000073 +:10148000080088008401C0900000000000000000F7 +:101490000000000000000000000000840000004088 +:1014A000000000080000000800000000000000002C +:1014B0008200A00000000400000000400000004086 +:1014C000000000000000000100000000000000001B +:1014D000000000000000000000000000000000000C :1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:10152000000000000000000000004000000020005B -:10153000400004000000021188C088000000010083 -:10154000030005001100C00000000800000000803A -:1015500080809000000000800080000000000000FB +:1015000000000000C000000000000000000000001B +:1015100000000000000000000000010000000300C7 +:1015200000000000000002000000000000000000B9 +:101530000000028800080008880401000000400044 +:10154000000000000000000000110000000000008A +:10155000000000000000000000000000000000008B :10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A00000000000000000000000000080000000BB -:1015B0000000000040201021881000A00000200042 -:1015C000050040004140110008004000801100214A -:1015D000008080008011000000808000000000007A +:1015800000000000000080000000030000000000D8 +:101590000000000000000000000000000400200027 +:1015A0000500030002000000000000000000000031 +:1015B00000000000000000800080800002000000A9 +:1015C0000000000000020000000000110000000008 +:1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:10163000000000000000880210001100822000401D -:101640000000008000000188010001000000C001CE -:10165000880088400200C00188002040100002007D -:101660000200200002000000000000000000000056 +:101600000000000000000020000900800000000031 +:1016100000000000000000000000000000000002C8 +:1016200000090000000000050002000000000000AA +:10163000000000000000004000C000800000000228 +:101640000000000000000001000000000001000098 +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A :10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A +:1016800000000000000000000000000900820000CF :10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B0000000000000000000C11089009010080127 -:1016C0000001008800400000810000E007000000E9 -:1016D000000000000700008100000000070000007B -:1016E000000000000000600000000000000000009A +:1016A0000001000000000000000000010000000038 +:1016B0000000000000000000000000A00002000088 +:1016C0000000000000000000810000420000000057 +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000820000E0070040 -:101740008200000000000000000000000000000017 -:101750000000F0F8F0F200F0F0F0BCBCA0FF3C3C60 -:10176000003C3030AAAA0000000000000000000089 +:1017000000000000000000000000810000E0070071 +:101710004100000000000000000000000000000088 +:1017200000000081000007000000008100000700A9 +:101730000000000000000000000000810000070021 +:101740000000008100000700000000000000000011 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 :101780000000000000000000000000000000000059 :101790000000000000000000000000000000000049 :1017A0000000000000000000000000000000000039 -:1017B000000000000000000000000000BABA30FF86 -:1017C00000AA00FF00000000000000000000000070 -:1017D000000000000028008200F00000A0A0A0A0EF -:1017E0000000003C3000AAAA000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000505050500000000000000000000000005 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 :1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 -:101830000000000000000000000000000000303048 -:10184000303000AA0000000000000000000000008E -:101850000000000000001F1F5F0F0F000F0FAE0CF5 -:101860005D0C3C3C3C00000000000000000000005B +:1018300000000000000000000000000000000000A8 +:101840000000050501050000000000000000000088 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 :101870000000000000000000000000000000000068 :101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 +:1018900000000000BE14FCFC00000000000000007E :1018A0000000000000000000000000000000000038 -:1018B00000000000000000000000EBEB0000000052 -:1018C0003E0A3D050F0F3C3C555D5D555F0F3F0FD8 -:1018D0000000000000000000141455000F0000007C -:1018E0000C0C0C0C00003C0000000000000000008C +:1018B0000000000000000000000000000000000028 +:1018C00041000A05BBBBFFFF000000000000000054 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 :1018F00000000000000000000000000000000000E8 :1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 +:10191000000000000000BE140C0C000000000000DD :1019200000000000000000000000000000000000B7 -:10193000000000000000000000000000E0E00000E7 -:1019400000003C003C0000000000000C0C005500B2 -:101950003C0005610A00850D00A0A5005A00059015 -:1019600000A5A5005A00059000A500000000000099 +:1019300000000000000000000000000000000000A7 +:101940000000FFC30A05FFFFBBBB00000000000052 +:101950000000006100068009000000000000000097 +:101960000000000000000000000000000000000077 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C00000000000A5615A00859100A50061500645 -:1019D000000D0005EBC30AAA000000000000000093 +:101990000000000000610007800D0008000000004A +:1019A00000000000000000000000000005610A2E99 +:1019B000050D00A005000A28050000A00000000099 +:1019C00000000000000020280000000005180A2088 +:1019D000050005A000000000FFFF0000000000005F :1019E00000000000000000000000000000000000F7 :1019F00000000000000000000000000000000000E7 :101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 :101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 -:101A40000000000000007D553C003C7D3CFC000097 -:101A5000000000000000CBC30AAA00000000000044 +:101A40000000000000000000000000000000000096 +:101A500000000000000000000000FFFF0000000088 :101A60000000000000000000000000000000000076 :101A70000000000000000000000000000000000066 :101A80000000000000000000000000000000000056 :101A90000000000000000000000000000000000046 :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 -:101AC00000000000000000005F550F00005500F00E -:101AD0000000000000000000F0F0404000000000A6 +:101AC0000000000000000000000000000000000016 +:101AD00000000000000000000000000014141414B6 :101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B400000000000000000000000FF0C0C0CF0FA88 -:101B5000F0FCBE3C7D3C00000000F0FF4040000C6B -:101B6000003C000000000000000000000000000039 +:101B30000000F0F070300000000000000000000025 +:101B40000000000000000000000000000000000095 +:101B5000000000000000000000000000000014145D +:101B6000141400000000000000000000000000004D :101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 :101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC000000000000000000000000000FF05050507 -:101BD00000AA003C3C3C3C3C00000000000000002F -:101BE00088002000000004008400000088008800B5 -:101BF00084008400200010001100218000000004F7 -:101C000084002000000020002000100020002000A0 -:101C10002000200820000000218005800003000033 -:101C200000002000200000000000200088002000AC -:101C3000C000840020000000A0002180218040001E -:101C400010001000200000030000880000000000C9 -:101C50002000840020004000C000C08420900000CC -:101C600000000000000000000000000000900000E4 -:101C700000000000000000020000204008200000DA -:101C80000000000000000000000000000000000054 -:101C900000000000000000000000202004100000F0 -:101CA00040000000000000000000000000002000D4 -:101CB00000000000090000000000400004040820AB -:101CC0000082000000000000000010000000000082 -:101CD0000000000020000000100000000021002192 -:101CE00000000000200000000008000000000000CC -:101CF00000000000000000000000000001001105CD -:101D000000080008000000000000000010000000B3 -:101D10000000000000000000000800051000110095 -:101D200000000000000000080000000800000000A3 -:101D3000000000000000000000000005000001009D -:101D40002000000000000000000000000000000073 -:101D50000200000000000808000000000000100061 -:101D600000100008000800080008000020400002E1 -:101D700000820008000000842008001000101010ED -:101D8000A01000100010001000040008000200085D -:101D900002020002000800080082001020108000EB -:101DA000A00800000004000800840008000400846B -:101DB00000080008008400080008000800840008EB -:101DC00010008008000000040008008400100008D3 -:101DD00000100004000000100010000800080008B7 -:101DE00080000408004000020000002000030040C2 -:101DF0000421000800400000000000000008100856 -:101E000004210008002100210040000800400003D8 -:101E1000004000080021002100000000002100080F -:101E20000021000800000021002100090021000914 -:101E30000008002100000003000300020021000050 -:101E400000030021000800210000000300400008FA -:101E500000000008000000080000000000408400AE -:101E60000000000084004182000000000000050026 -:101E70000000000004000920000000000300000032 -:101E800000008000000000000000000000000000D2 -:101E9000008200000000410000000020000000005F -:101EA00000000000000000000082000000000000B0 -:101EB0000000000000000000000000000000000022 -:101EC00008000000000000000300000008000000FF -:101ED0000400000000000500000040082100000090 -:101EE00005880090009000008800C000000082007B +:101BB00000000000703070300000000000000000E5 +:101BC0000000000000000000000000000000000015 +:101BD00000000000000000000000000000002004E1 +:101BE00000000008000000000000000020000000CD +:101BF00000000000000000000000000400002000C1 +:101C000000000004100000000000000020000000A0 +:101C10000002000000004000000200000003040079 +:101C20000000A000A0218800001100004000000278 +:101C30000000000000020000200000000000000082 +:101C40000000000000000000000000000000000094 +:101C50000000000000040000200010080008000040 +:101C60000000000000004000000000000000000034 +:101C70000000000000000000000000020000000062 +:101C800010001002000000000000000040C00082B0 +:101C90000002000000000000000000004090000072 +:101CA0000002000200840002400040C040C01084D6 +:101CB000218440020000009009820002000200001E +:101CC000400000020002000200000040002000026C +:101CD00000000004000000004090104000020000DE +:101CE00000000000000002000004000000000200EC +:101CF00000000000000000000000000010002100B3 +:101D000000002000000000000004000000000000AF +:101D1000200000000000000000080000100041004A +:101D20000000004000000000004000000000000033 +:101D30000000000000000000000000000000100093 +:101D40002008000000400200000002000200C00065 +:101D5000040000000000020000000000021010005B +:101D600041080084008400840004004000080082D0 +:101D700000000040000000400040000000108410FF +:101D8000C000000000000000008400000008000007 +:101D90000000000000820000000400000082808239 +:101DA000A000000000000000000000000000009003 +:101DB0000000009000000000000000000082000011 +:101DC000800080010084000000000000000000008E +:101DD00000004100000000000000000000000000C2 +:101DE0008000A0010021002100210040000300002C +:101DF000000300210021002100210000000000005C +:101E00000008002100210021002100210000002104 +:101E1000000000210021002100210021040088038E +:101E2000040200210000002190218821002184006B +:101E3000C000C000902188419009900484040000F3 +:101E40000000000000210021000000000000000050 +:101E5000000000001011000200000000000040001F +:101E600000000000840000000000000000000000EE +:101E70000000000000900000008200000000000050 +:101E800000A00000000000000000000000000000B2 +:101E9000000000000008100000000000009000009A +:101EA0000900000000000000000000000000009099 +:101EB0000000000000000004080003000900090001 +:101EC0000000000000000000000000000000000012 +:101ED00021000000000000000000000000000000E1 +:101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 -:101F000000000000020001000000000000020000CC -:101F100000000000000000000000000000000000C1 -:101F20000000000002001002000000000000C000DD -:101F300000000000000000000000C00000000000E1 -:101F4000000000000000A0000008000000000000E9 -:101F5000000000000000000004000000000000007D -:101F6000A000A000080000008304000000000000A2 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000400000000000000011 +:101F000000000000000001200000000000000000B0 +:101F1000000000000000000084000000000000003D +:101F200010000000000001400000820008000000D6 +:101F30000004080000000000000082000000000013 +:101F400000000000C0008404C0028200A000000065 +:101F5000000010000000000000040000000000006D +:101F60000000000000000000004000000000000031 +:101F700000080000000000A0000000000000008237 +:101F80000000000000000000100000000000000041 :101F90000000000000000000000000000000000041 -:101FA0000000000000000000000100000000000030 -:101FB0000000000000000000000000000084080095 +:101FA0000000000000000000100000000000000021 +:101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000010000000010 -:101FD00000002100001000000000000000000000D0 -:101FE00020000000000000000010100100000005AB -:101FF00000000009A000020000000020000000080E -:102000000000002100210040000000030000000546 -:10201000080800000000C0000000000000080008E0 -:102020000000002100000021000008030000000063 -:1020300000000021900000000800C0000003000024 -:10204000000800050021000300080000001100083E -:102050000008000000080000000800400000000028 -:10206000004000030000002104030000882100005C -:1020700000C000000004050000000008000400206B -:1020800008000008410000004000000200000000BD +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000200040000000000EB +:101FF000000000030200020800400000000000088A +:1020000000000008000200080000000000000000BE +:1020100000110000000002080000000000000002A3 +:102020000000001100029009000000000000C0083C +:102030000000400040008200880400000000900082 +:102040000000900004000000100500000000840063 +:10205000000008000800080088008200A00090002E +:10206000000000000000000000410400000000002B +:10207000000000000000000000000000020000005E +:102080000000000000000000000000000000000050 :102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D000000000000000000000C000000000000040 -:1020E00004042002041000842100002005100000D8 -:1020F00008000000000000000000000800000000D0 -:10210000000000410000001000000021000000005D -:1021100000000000000000000000000800000000B7 -:10212000000000000000000800080000000000009F +:1020A00000000040000000000000000000000000F0 +:1020B00000004090000011020002000000000088B3 +:1020C000000040900000000000000000000000023E +:1020D0000090000000000000000000000000000070 +:1020E00000000020000800000000000000000000C8 +:1020F00000000000000000000000000000000000E0 +:10210000000000000003100000000021000000009B +:1021100000000000000000000000000000000000BF +:1021200000000000000000000008000300000000A4 :10213000000000000000000000000000000000009F -:102140000000000000000803000800080000000470 -:102150004000000000000000000300000000080034 -:1021600008050800000000050021000000410821CA -:10217000010300000000000000000000000000005B +:102140000000000000000000000000008800000007 +:102150000011080000410000100000008200000093 +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F :10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F +:102190000800000000000000000000000000000037 :1021A000000000000000000000000000000000002F :1021B000000000000000000000000000000000001F :1021C000000000000000000000000000000000000F -:1021D000000084000000000000000000000000007B -:1021E00000000000000000000000000021000000CE -:1021F0000000404000000000000000000000A000BF -:10220000000000A00001C0000010C0820000C0005B -:1022100000010000000000000000000100000200BA -:10222000000100A00001C1000090C0820000C000B9 -:10223000000100000000000000000000000100009C -:102240000000000000A00001C0000010C0820000DB -:10225000C0000001000000000000000000000000BD -:102260000000000000100000C0000010C08201004B -:10227000A00000000000000000000000004102007B -:1022800000000041110000088900008080800000EB -:1022900080000003000000000000000000080000B3 -:1022A0000000000311000008820000008080000090 -:1022B000800000030000000000000000000000207B -:1022C00000000000000911000208A1000000808049 -:1022D0000000800000030000000000000000000972 -:1022E0000000000000100480000291000080808047 -:1022F000410000000041000000000200000000005A -:102300000000090000000300030084000000030037 -:10231000000000000080801100001000000000009C -:1023200000000200000002004100830000100300D2 -:10233000000000000080801000000000110000007C -:1023400000000000080000000200C10083800010AF -:102350000300000000000080801100001000000059 -:10236000000000000300000010004000890000048D -:1023700003000000000000800003000000000000D7 -:1023800000000000000400000100880010020000AE -:1023900001008800000000C0820000000000000072 -:1023A0000000000000000000000088001102000092 -:1023B00001028800000000C0820000000000000050 -:1023C0000000000000000100000000000800821072 -:1023D000000101108800000000C082000000000021 -:1023E0000000000000000100000000C0890040045F -:1023F00000000100C000000000C004010000000057 -:102400000000000000000000840102000010000035 -:1024100001000000000000000000000000000000BB -:10242000000000000000000000000200001000009A -:10243000010000000000000000000000000000009B -:10244000000000000000000000000000020000107A -:10245000000001000000000000000000000000007B -:1024600000000000000000000000000110000088D3 -:1024700000008500000000000000000000000000D7 -:10248000000000000000000000000005040900003A +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000002000000000000000000000000000BF +:10220000000000100001C0000010C010000000001D +:1022100000010000000000000000000000000000BD +:10222000000000100000000000101010000000006E +:10223000000100000000000000000000000001009C +:102240002000000101820000010000901008000041 +:10225000000000010000000000000000000100007C +:1022600000000001010200010000008210C0000017 +:10227000000000010000000000000000001100004C +:1022800000000009048000400200008000000000FF +:1022900000000041000000000000000000110000EC +:1022A0000000001004800004020000800080000094 +:1022B00000000041000000000000000000000011CC +:1022C00008008000001010800008080000008080D6 +:1022D00000000000004100000000000000000010AD +:1022E00000000000001010800002050000008000C7 +:1022F0000000000000410000000008000000000095 +:1023000000004000000008000200880000000300F8 +:102310000000000000008010000008000000000025 +:102320000000110000000800020088000000080002 +:102330000000000000008010000000000800000005 +:102340000000000003000000080002000800000078 +:1023500004000000000000008008000008000000E9 +:102360000000000003000000020010000300000055 +:102370004000000000000000800300000100000099 +:1023800000000000010000000100900009020000B0 +:102390000100020000000000C00100000100000078 +:1023A0000000000000000000010090000902000091 +:1023B0000100020000000000C00100000000010058 +:1023C0000000000000000000000001009000030475 +:1023D00000000100080000000000C0000000010033 +:1023E000000000000000000000000100210010407B +:1023F00000000100400000000000C00000000000DC +:102400000000000000000000000088000010000034 +:1024100002000000000000000001000000000000B9 +:102420000000000000000000000088000020000004 +:102430000200000000000000000100000000000099 +:102440000000000000000000000000000201004049 +:102450000000080000000000000000010000000073 +:10246000000000000000000000000000020000402A +:1024700000009100000000000000000100000000CA +:102480000000000000000000000000101003000029 :1024900000004100000000000000004100000000BA -:1024A00000000000000000000000004100090000E2 +:1024A0000000000000000000000000101003000009 :1024B000000041000000000000000041000000009A -:1024C00000000000000000000000000000410009C2 -:1024D000000000004100000000000000004100007A -:1024E0000000000000000000000000000008801054 -:1024F000000000004100000000000000004100005A -:102500000002800000C10000000080028400000082 -:10251000004100000011000000410000000008041C -:102520000010800000C100000011001084000000B5 -:1025300000C1000000110000004100000000081070 -:1025400000000011800000C1000000110010820096 -:102550000000004180000002000000410000000077 -:1025600009080010800000C1000000000000090000 -:1025700000000041000000020000004100200000B7 -:102580004083000020000040000000004000820066 -:1025900000000091020000000000000100000000A7 -:1025A00001100000200000400000000040008200F8 -:1025B000000000090200000000000001000000000F -:1025C00001840000000020000040000000004000E6 -:1025D00083000000009110000000000000010000D6 -:1025E00000000005000020000040000000008800FE -:1025F0000400000000C10200000000000001000112 -:1026000000000109000000000000000000000000C0 -:1026100000000000811200E080004842000000003D -:102620000000484200000000000000000000000020 -:1026300000000000811200E080004842000000001D -:102640000000484200000000000000000000000000 -:10265000000000000000811200E0800048420000FD -:1026600000000000484200000000000000000000E0 -:10267000000000000000811200E02200484200003B -:1026800000000000484200000000000000000000C0 +:1024C0000000000000000000000000000003800881 +:1024D00000000000040000000000000000410000B7 +:1024E00000000000000000000000000000418040EB +:1024F0000000000003000000000000000041000098 +:102500000008800000C100000011800005000000EC +:10251000000480000003000000000000000005111E +:102520000008800000C1000000000000050000005D +:10253000009080000008000000000000000020085B +:1025400000000008800000C1000000008020A00002 +:1025500000000041800000030000000000000000B7 +:1025600003410008800000C1000000028020A0009C +:10257000000000C1804000030000000000000000D7 +:1025800008080001200000400000000020000300B7 +:10259000000000904000000000000000000000006B +:1025A00000880001200000400000000088000300B7 +:1025B00000000008400000000000000000000000D3 +:1025C0000091000000012000004000000000020017 +:1025D0008200000000114000000000000000000028 +:1025E000000000090001200000400000000102007E +:1025F0008200000000410201000000000000000015 +:1026000000000120000000000000000000000000A9 +:1026100000000000411200E0070000000000000080 +:1026200000000000000000000000000000000000AA +:1026300000000000411200E0070000000000000060 +:10264000000000000000000000000000000000008A +:10265000000000000000811200E0070048000000B8 +:102660000000000000060000000000000000000064 +:10267000000000000000811200E007004800000098 +:10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A :1026A000000000000000000000000000000000002A :1026B000000000000000000000000000000000001A @@ -98959,15 +98959,15 @@ :102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 :102770000000000000000000000000000000000059 -:1027800000000000000000000000757B0000000059 +:1027800000000000000000000000257B00000000A9 :102790000000000000000000000000000000000039 -:1027A0000000000000000000DEAE757B00000000AD +:1027A0000000000000000000DEA4257B0000000007 :1027B0000000000000000000000000000000000019 -:1027C0000000000000000000DEAE0000757B00008D +:1027C0000000000000000000DEA40000257B0000E7 :1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000DEAE757B00006D +:1027E00000000000000000000000DEA4257B0000C7 :1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000DEAE6126034072 +:1028000000000000000000000000DEA4612603407C :102810000000000000000230A000000000000000E6 :102820000C4000000000000002C0648661260340E6 :102830000000000000000230A000000000000000C6 @@ -98976,193 +98976,193 @@ :1028600000000C4000000000000002C064866126E9 :1028700003400000000000000230A0000000000043 :1028800000000C4000000000000002C06486000050 -:1028900082000000000000000000000000000000B6 -:1028A00000000000400000000000040004000000E0 -:1028B0002000000084000000400800001000000517 -:1028C0000000000840040010042020002100000344 -:1028D000400020080000200800052000880020009B -:1028E00000004005000010000000840840002000A7 -:1028F0002000000000002000400088008800400503 -:1029000040002080C0892000882020002020200056 -:102910000000009000020000000000000002000023 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000004000000057 -:1029400000000000000000000000800140000200C4 -:102950000000000000000000000000000002400035 -:102960000000000000000000000000000000000067 -:1029700000000000000000000000000040004000D7 -:102980001000009000200020410000011000000312 -:10299000040200008400001000108200000000000B -:1029A00000008200000000000000040000000000A1 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000400000000000000000000000000000B7 -:1029E00000000000000000000000000000000000E7 -:1029F0000000000000000000009000000000000047 -:102A000000000000004182209009000000000880C2 -:102A1000001040100508000800080508001000100C -:102A2000008400080004000000082084000400085E -:102A300000040004000800080408000800080084DE -:102A400000000008000800000084000800080002E0 -:102A500000080001000000100004000800040088C5 -:102A60000084000002100008000800100010001090 -:102A70000084001000080000001000040010000096 -:102A800000000008051000084009000000840084D0 -:102A90000020000880080000000000000000000086 -:102AA00008210000080000000000000000000000F5 -:102AB0000040000800004000002100000004002148 -:102AC00000000000000000000005000000000021E0 -:102AD000001000000008000000400000004000005E -:102AE000004000000000000000400000000000085E -:102AF000002000200000000000000008000000008E -:102B000000000008000000004100004002008300B7 -:102B100000021000000000201188000000040004E2 -:102B20000000000800000000000000000000000895 -:102B300000080000000000000000000000400084C9 -:102B4000001000000000000000000008000000006D -:102B500000080082000000840000000000000084E3 -:102B600000840000090000000000000000080000D0 -:102B700000000010008200080000000000000000BB -:102B8000050000A00000000000000882091004A059 -:102B900004080090A108000000010000008000046B -:102BA000081000000000000000000000000000000D -:102BB0000000000000000000000000000000000015 +:102890000000000000000000000000100000000028 +:1028A0000000000000008980018001800184000098 +:1028B0000000000000000000000000000000000018 +:1028C0000000000000000000000000000004000301 +:1028D000C080208020002000208000802084010013 +:1028E00000000000000000004000000000000000A8 +:1028F00000000000000010000402000010000000B2 +:10290000000000000004000020000000000400009F +:1029100000000000000200000000000200000000B3 +:1029200000000000000010002008200820082008F7 +:102930000002400000000000400200000000000211 +:1029400000004000400000004000000000000002C5 +:1029500000004004C004C000900280040004800510 +:1029600020000940009040020002000040024002A6 +:102970000000400200004000000000000000400293 +:102980000002400240001002000000900000409051 +:1029900000400000000000000000000000000000F7 +:1029A000000000000000000000008800000000009F +:1029B0000000000000000000840000000000001083 +:1029C00000100000000000000000020000000010E5 +:1029D0000010000003000000000002000080010061 +:1029E00000100090000000000840001002000200EB +:1029F0000040004000000000C04000000200020053 +:102A00000000020002000000000000100080828030 +:102A10000080028000000008008800000408000810 +:102A20000088000800000008008400080000000082 +:102A30000000000000000008000000000008001076 +:102A40000000000800000084000000840000000076 +:102A500000C0000000002084000800000500000401 +:102A6000200000000004000000000000000000083A +:102A70000000000800080000000200000000200024 +:102A8000040020000000000003000000000000041B +:102A90000404000400040000000000000000002105 +:102AA0000000000000000000000000000000000323 +:102AB0000000C00000000000000000210000000035 +:102AC0000000000000000000000090030000400033 +:102AD0000400040900000000880000A141800104F6 +:102AE00000000004000000000020000900030000B6 +:102AF00000000000002000000000000000000000B6 +:102B00000000000000000000401100000000000074 +:102B100000000000000000000000000000C00000F5 +:102B200000000000000000000000000000A00008FD +:102B30000082000000080000000800000000000003 +:102B4000020000000000000000000084008200A0DD +:102B5000090800A000840000000009A0000420046F +:102B6000200100000001000020200088000011006A +:102B70000000418400000000000000A000000800E8 +:102B800008402100000000000000000000000000DC +:102B90004000049000000000000000000000000061 +:102BA00000008200000000000000000000000000A3 +:102BB000000000000000000900000000000000000C :102BC0000000000000000000000000000000000005 -:102BD000000000000000C000000000000000000035 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000008000809000000000800B4 -:102C00000000840084000800000000000021C000D3 -:102C1000C020002088008200400020040000004006 -:102C20000000000100000000000000002000000083 -:102C30000000000000000000000000000000000094 -:102C40000000000000100000000000000000000074 -:102C5000000000000000000000000000000000A0D4 -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000041000000001003 -:102C80000000000000000000000000000000000044 -:102C9000000000010001000400001100800100009C -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 -:102CD00000000000080000001000000000000000DC -:102CE00000210000000000000000000000000000C3 -:102CF00000000000000008000000000000000000CC -:102D00000041000000000000000000000800080072 -:102D1000000004000200820000080000000000041F -:102D2000000400000000090000080000000000008E -:102D3000110800A00000030000A000000000000037 -:102D4000001000000000000000080000000000006B -:102D50000008208400000000000280000000000045 -:102D600000000000000000000008000000840000D7 -:102D700000001108028400000000000800000000AC -:102D80000000000000000000020000080000001029 -:102D90000008000000A000000000000040900400B7 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 +:102BD0000000000000000300010000002180004010 +:102BE0000000000000800080004020400000000045 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000009000000000000AB +:102C200000000000030000000000000000000000A1 +:102C30000000000003000000000000000000000091 +:102C40000000000000000000000000000000000084 +:102C50000000000008000000820002000000844024 +:102C60000001000000000040004000018001000061 +:102C70000000000000000000000000000000000054 +:102C80000000000021000000210000000000000002 +:102C90000000000000000000000000000000000034 +:102CA000000000000000A000000000000000000084 +:102CB00000000480C00000000000000000000000D0 +:102CC00000000000004000000000000000000000C4 +:102CD000000000800000000000030200000000006F +:102CE00000040200000000000100008001000080DC +:102CF0000000A0000000000000000008000000002C +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D2000000000080000000000080000000000088B +:102D30001100000800101100000400002100000034 +:102D400000000008100000000008000000A00008BB +:102D5000000000A0001011840804008289082000EF +:102D6000000000018908000009882090210420004B +:102D700004040000048802041100000000000000A8 +:102D800000000800002005000000084021000800A5 +:102D90000000000009000000090000200000000001 +:102DA000000004000000000000000000000000001F +:102DB0000000000000001000000000000000000003 :102DC0000000000000000000000000000000000003 -:102DD00000210000000000000000000000080000CA -:102DE00000000000000000000000002100000000C2 -:102DF0000008000800000021000000000000002181 -:102E00000000000000000000000000000000820040 -:102E10000800000000008200000000000000000028 -:102E2000040004000000000000000000000000009A -:102E30000000000000000000000000000000000092 +:102DD0000000000000000000000009000285020061 +:102DE00000080000A00420040121008000042080CD +:102DF00000210000000000000000000000000000B2 +:102E00000000820084210800000000000000000093 +:102E100000000000000000000000020000000000B0 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000041000000000051 :102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 +:102E500000000000000000000000000002008040B0 +:102E60008000000000000001A001020020400001DD +:102E7000804003000000000000000000000000008F :102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 -:102EA0000500000020880000000000000000000075 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED000000000000000000000000000000040C0F2 -:102EE000899082A00008000000000000000000009F -:102EF00000000000000000000000000000000000D2 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000111 +:102EC0000000000000010000000000000000000001 +:102ED000000000000000000000000000000000C032 +:102EE000000000000010000001C000004091000040 +:102EF00001C000004091000100000000000000003F :102F000000000000000000000000000000000000C1 :102F100000000000000000000000000000000000B1 -:102F200008040590821088020000000000000000E4 +:102F200000000000010000000000000000000000A0 :102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 +:102F400040410010030000080000000000000000E5 :102F50000000000000000000000000000000000071 -:102F600080809180808000800000000000000000D0 -:102F70000000000000000000000000000000000051 +:102F6000008000000000000000000988031089882C +:102F700000000983212002880008000000000000F2 :102F80000000000000000000000000000000000041 :102F90000000000000000000000000000000000031 -:102FA000000000008300800000000000000000001E -:102FB0008000000000000000000000000000000091 -:102FC0000000000000000000000000000000000001 +:102FA0000000000000001000000000000000000011 +:102FB0000000000000000000000000000000000011 +:102FC00000000000100008004100000000000000A8 :102FD00000000000000000000000000000000000F1 -:102FE000000041001100031141000000000000003A -:102FF00000000000000000000000000000000000D1 -:103000000000000000000000000000000800200098 -:103010000802200000000000000000000000008501 -:103020000080000080000011008000008800840003 -:103030000000C000000000000000000000000000D0 -:103040000000000000000000000000000000000080 +:102FE00000008000000000008000000088801000C9 +:102FF00010098000208020004009880000000000A7 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:103020000000000000040000000900000000000093 +:103030000000000000000000000000000000000090 +:1030400000000000009000000100010000000000EE :103050000000000000000000000000000000000070 -:10306000000000000000010001010100000000005C -:103070000000000000000000000000000000000050 +:1030600000000000080000000000C000000009404F +:1030700000000101C000004090000001C1000000FC :103080000000000000000000000000000000000040 -:10309000000001000000000000000000000000002F -:1030A000001000040008020090009002108400004C +:103090000000000000000000000000000000000030 +:1030A000000000000000000100000000000000001F :1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 +:1030C00000000000000000000001000100010000FD :1030D00000000000000000000000000000000000F0 -:1030E000000000000000C088000000858903000087 -:1030F00000000000000000000000000000000000D0 +:1030E00000000000000000000000008800C0000098 +:1030F00001000000008501C000000000008501C142 :1031000000000000000000000000000000000000BF :1031100000000000000000000000000000000000AF -:103120000000000090000000404000909020C091FE +:10312000000000000000000000000400000000009B :10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F +:1031400000000000000000000010201000080041F6 :10315000000000000000000000000000000000006F -:10316000000000000000000080800000008591C188 -:10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F +:1031600000000000000000000000000000000080DF +:10317000000010100500059011900000002040880C +:1031800011880000000000000000000000000000A6 :10319000000000000000000000000000000000002F -:1031A000000000000000000002008080004000419C -:1031B000A0410004000000800000000000000000AA -:1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF -:1031E0000000000000000000000000880000000057 -:1031F00000110000000000000000000000000000BE -:1032000000000000000000000000000000000000BE -:10321000000000000000000000000010000000009E -:1032200000000000000880110000000000200011D4 -:10323000808000000001000000400000000000004D -:10324000000000000000000000000000000000007E +:1031A000000000000000000000000000000000001F +:1031B000050000000000000000000000000000000A +:1031C000000000000000000000004190210000000D +:1031D00008000000000000000000000000000000E7 +:1031E00000000000000000000000000000000000DF +:1031F000000000009085900805001010A005C00098 +:1032000008000808000000000000000000000000A6 +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000010200007B :10325000000000000000000000000000000000006E -:1032600000000000000000000000000000880000D6 -:10327000000000010000000000000000000000004D -:10328000000000000000000000000000000000003E -:10329000000000000000009000000000000000009E -:1032A00000000000000090008200200088008800DC -:1032B000900282C02000000000000000000000001A -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000008181DC -:1032F00000E0070060000000000000000000000087 -:1033000000000000000000000000000000000000BD -:103310000000000000000000820000E0000000004B -:103320000000000000000000008100000700000015 -:10333000000600E00700000600000000000000009A +:1032600000000000000000000000000000008800D6 +:10327000000000000000C002910000000000C0003B +:1032800090000100010100000000000000000000AB +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C0000000000000000000000000000000880076 +:1032D00000E000000000000000000000000000000E +:1032E00000000000000000000000000000000000DE +:1032F0000000000000000000818100E007000000E5 +:10330000810000E00000000000000000000000005C +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000480000E000000000000000000000000065 :10334000000000000000000000000000000000007D :10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D -:103370000000000024000000000000000000000029 -:10338000000000000000000000000000000000003D +:10337000FF00FF00FF0000000000FF000000FF0052 +:103380000000FF000000FF0000000000000000003F :10339000000000000000000000000000000000002D :1033A000000000000000000000000000000000001D -:1033B0000000FF383838FCF07C600000000000009E +:1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED :1033E00000000000000000000000000000000000DD -:1033F00000000000000024000000000000000000A9 -:1034000000000000000000000000000000000000BC +:1033F0000000FF00FF00FF0000000000FF000000D1 +:10340000FF000000FF000000FF00000000000000BF :1034100000000000000000000000000000000000AC -:103420000000000000000000000000000202030293 -:1034300000000000FF202020BC903C0000000000A5 +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C :10346000000000000000000000000000000000005C @@ -99171,493 +99171,493 @@ :10349000000000000000000000000000000000002C :1034A000000000000000000000000000000000001C :1034B000000000000000000000000000000000000C -:1034C00000003C3C0C0C000000000000000000006C +:1034C00000000000000000000000000000000000FC :1034D00000000000000000000000000000000000EC :1034E00000000000000000000000000000000000DC -:1034F000000000000000180024F0000000000000A0 -:1035000000000000000000000000000000000000BB +:1034F00000000000000000003C3C00003C3C0000DC +:1035000000000F0F00003C3C00000F0FFFFFF0F029 :1035100000000000000000000000000000000000AB :10352000000000000000000000000000000000009B -:1035300000000000000000000F2F0FBF063E063EF7 -:103540000000000000000C0C000000000000000063 +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B :10355000000000000000000000000000000000006B :10356000000000000000000000000000000000005B -:103570000000000000000000000000F0000000005B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B +:10357000000000000000000000003C3C00003C3C5B +:10358000000000000F0F00003C3C00000F0FFFFF89 +:10359000F0F000000000000000000000000000004B :1035A000000000000000000000000000000000001B -:1035B00000000000000000000000002400BD003CEE -:1035C0000F3F0000000000000005000000000000A8 -:1035D00000000000000000000000000000000000EB +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D000000000000000000000000000000180006A :1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000006020268000A5 -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:1036200000000000006100068005000000000000AE -:103630000000000000000A28050000A0006100262C -:10364000000D00000000000000000000000000006D -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A +:1035F00000000000000000000000400280000020E9 +:103600009202000045F380298021920240E380016C +:103610008021820200000000000000000000000085 +:10362000000000000000000000000000000000009A +:103630000000000000000000000000000061000722 +:10364000800D0000000000000000000000000000ED +:103650000000000000000000000000000055003CD9 +:10366000C0C000C300000000000000000000000017 :10367000000000000000000000000000000000004A -:103680005555AA5500000000000000000000000091 -:10369000000000000000000000000000000000002A +:103680000000000000005145000028282800101408 +:1036900014100000FF5A00000000000000000000AD :1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A -:1036C0000000F0FAFAF00000000000000000000026 -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA +:1036C00000000000000000000000000000000000FA +:1036D0000000000000000000000000000000005595 +:1036E000003CC0C000C3000000000000000000005B :1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 +:1037000000000000000000005145000028280028AB +:103710001014141000000000000000000000000061 :103720000000000000000000000000000000000099 :103730000000000000000000000000000000000089 -:1037400000000000F0F0F0F00000000000000000B9 +:103740000000000000000000000000000000000079 :103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 +:10376000003C0055000F0F0F00000000000000009B :103770000000000000000000000000000000000049 -:1037800000000000F0503090000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000FF30EA -:1037B0007530000000000000000000000000000064 +:103780000000000000000000000050005500301054 +:103790003010303C00002828200800000000000005 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000000000000000000000009 :1037C00000000000000000000000000000000000F9 :1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 +:1037E0000000003C0055000F000000000000000039 :1037F00000000000000000000000000000000000C9 -:1038000000000000000000A03030000000000000B8 -:1038100000000000000000000000000000000000A8 +:103800000000000000000000000000005500500013 +:10381000103010303C300000282820080000000044 :103820000000000000000000000000000000000098 -:1038300030303030000000000000000000000000C8 -:103840000000000000000000000000002000000058 -:1038500000000000C0008800880020001010200038 -:1038600000002000000800080000020020090000FD -:1038700000000400200020100400040000002002CA -:103880008810200400100000880820000003200099 -:10389000000000002000200005002000208000081B -:1038A000200088002000C004C00088002000000024 -:1038B00000008400880000002000020002000000D8 -:1038C000C084C000100500000080880520040000AE -:1038D0000000000000000000400200001000000096 -:1038E00000000000000000000000000200020000D4 -:1038F00000000000000000000000000010001000A8 -:1039000000000000000000000000000000000000B7 -:10391000000000000000000000004000000000085F -:10392000090000000002000000010000000000008B -:103930000000000000000000400000000000004007 -:103940000000000800000000000241080000000024 -:1039500020000000840000000000000004000400BB -:103960000000000000000000000000002000000037 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000050000000022 -:1039A0000000000000000000000000000080008017 -:1039B0000080000000000000000000000000000087 -:1039C000000000000200000040100000080002009B -:1039D0000200840004000408000804000000000045 -:1039E0000210000000102000000005000402020088 -:1039F000000800000000000800080010000000009F -:103A00002000000000000000000000880008020004 -:103A1000030800000000000000080008000000008B -:103A20000000000000000000200000001100000461 -:103A300000040004000000000010008400000000EA -:103A40000000001000084100000080080000000095 -:103A50000000400000000000000000000400000022 -:103A6000000000000400000000000000000004004E -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA00000000000000000000000000000000041D5 -:103AB00010000000000000000000000000000000F6 -:103AC000000800000000000084000000004000002A -:103AD000000000000008000000900000000000004E -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000010A5 -:103B10000000000000000000008200000000000023 -:103B20000000000000000000000000000000000095 -:103B3000000005000000050041000000000000003A -:103B400000000000100041080000050040000800CF -:103B5000080000002100000001000000000000003B -:103B60000000000000000000000000000000000055 -:103B7000000000000000000000000000C000000085 -:103B80000000000008000000080000000000000025 -:103B90000000000000000000000082000000C000E3 -:103BA0000000000000001000000000000000000005 -:103BB00010000000000008000000000000000000ED -:103BC00008000000000008000800000008000000D5 -:103BD0008200C011000000098202200000000000E5 -:103BE00021000000000000000300000000000000B1 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000200058 +:103850000000000400000000000000000000000460 +:103860000000000520102000204120000000000082 +:103870000000C00000000000000000040000000084 +:103880000000000401050100110011000003840084 +:103890000100000200200000000000000000000005 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000004000000F4 +:1038D00000000000110000000000000000000000D7 +:1038E000000000000000800080008000C100210274 +:1038F000000200000000080010000000100000029C +:1039000000020002000010002002A002A00200003D +:10391000000010020004000100024040000000848A +:103920004000000000404100210000002000200075 +:1039300000020002000000401000000240000000F1 +:10394000000200000000000200020000000200026D +:103950000000000000000000000000000000040063 +:1039600000000000000000002000200020000204F1 +:1039700000000000000004400000000002000200FF +:1039800008000000004008000000010002000000E4 +:103990000000100000000102010001000000000012 +:1039A0000800000008000000000000000000820085 +:1039B00082400000000000000040000008000000FD +:1039C000840000000200020002000000020000006B +:1039D00000000000000002000200040802000208CB +:1039E0000200000000000000000080008000800055 +:1039F0000301000000900000800000100000040897 +:103A000004000000000040000084000010000000DE +:103A10000200000080000000040104000200000019 +:103A20000008040000000000000002000000000088 +:103A30000200000000000000000000000000000084 +:103A40000008000000000500000000000000000069 +:103A500000000200900000080000000000000000CC +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000400000000006 +:103A800000000000000000000000C0000100000075 +:103A900000000000000040004000048004210040BD +:103AA0000000042000A1040004000000840940007C +:103AB00000000000042040000000000000000000A2 +:103AC00000000000000000000000000000004000B6 +:103AD00040000000000000000000000000000000A6 +:103AE00000000000000000002000000000000000B6 +:103AF00000000000000000040000000000000000C2 +:103B00000000000000000000000000000000200095 +:103B10000000000000000000200005008020800060 +:103B200000030000800100100000000000200000E1 +:103B30001100000003000001000000000000000070 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B6000000000000000000000000000000900004C +:103B700000000000000000004002000000000400FF +:103B80001000A00000000000000000001000000075 +:103B90000000000000000004000000000000000021 +:103BA0000000000000000400000000000000000011 +:103BB00000000000000000000020000000000000E5 +:103BC00000000000000000000000000000000000F5 +:103BD0000000004000100040000000000000000055 +:103BE00000000000000000000000000000000000D5 :103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 +:103C00008000000000000000000000000000000034 :103C100000000000000000000000000000000000A4 -:103C20000000210000000800000004000000000067 -:103C3000000000080000000000000000000000007C -:103C40000000000800000000040000000000000068 -:103C5000000000000000000008000001000000005B +:103C20000000000000000000800000000000000014 +:103C3000000000000000000000000001080000007B +:103C40000000000000000000000002100000000062 +:103C50000000000000000000000020000000000044 :103C60000000000000000000000000000000000054 -:103C7000000000000000000000000800000000003C -:103C80000000000000000000000000000000000034 -:103C90000000000000000000000010000000000014 -:103CA00000000000000000000000000000081000FC -:103CB00000000000000000000400000000000800F8 -:103CC0000000000000000000000082000000000072 -:103CD000C000000000000000000000000011000013 -:103CE000002040000000000800000000000000006C -:103CF00000000000000000000000000000000000C4 +:103C70000000000000000000000000000000000044 +:103C80000000000002000000000000000000000032 +:103C9000000082000800080000000800000000008A +:103CA000080000030000A1020011000000A10000B4 +:103CB00000000000C0000000000000000000000044 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000080000000000000000CC +:103CF0000000000000080420000000201020000048 :103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000101000000000000073 -:103D30000000000000000000000000000000000083 -:103D4000210000000008000000000000000000004A -:103D500021C0110000000000080808200200000037 +:103D10000000000400A00084400000A09184000086 +:103D20001020850005000884020200000000001039 +:103D30000000002000880088000000000000000053 +:103D40000000000000000000000000000000000073 +:103D5000040000000400000010002100000000002A :103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D9000000000000000000000000000000004001F -:103DA0000000000000000000000000000000000013 -:103DB000000000000000000000008400000000007F -:103DC00000000008000000000005080000000000DE -:103DD00000210000000008000000000000001009A1 -:103DE00020000000000000000400000000000000AF -:103DF00000000000000000000000000200000000C1 -:103E000000000000000000040000000000000000AE +:103D70004000000000000000000000000000000003 +:103D8000000008000000000000000000000000002B +:103D900082001000100000008400A000080008004D +:103DA00000004091010901004020000200000000D5 +:103DB00000100000000000000000000000000000F3 +:103DC00000000000000000000000000000000000F3 +:103DD000000000008400000000000000000000005F +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 :103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 -:103E4000000000040000000000000000000000006E -:103E500000000000008200000000000000000000E0 +:103E2000000000000004200010000001000000005D +:103E30000000000100000000000000000000000081 +:103E40000000000000000000000000000000000072 +:103E50000000200000000000000000000000000042 :103E60000000000000000000000000000000000052 :103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC000000084010000000000000000000000006D -:103ED00000000000000000000000080000000000DA -:103EE0000000A00000000000000000000000000032 +:103E80000100000000000000000000000000000031 +:103E90000000000000000000000000000801000019 +:103EA00002009100000010910104000282882000AD +:103EB000A0000000820000000000000000000000E0 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 :103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F4000000820208005000900000000000000009B -:103F500000000000000000000000030080000000DE -:103F600000002000000000000040000000000000F1 +:103F000000000800000000000000000000000000A9 +:103F10000000000000000000000000000000004160 +:103F20004005852020000000804103054088008373 +:103F30000000000000008000000000000000000001 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 +:103F80000008000000050000000000000000000024 :103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB00000000000000000000020000000000000E1 -:103FC0000000200010000500082000000000000094 +:103FA00080000500880041000000A0801100200072 +:103FB000C1808000000000008000000000000000C0 +:103FC00000000000000000000000000000000000F1 :103FD00000000000000000000000000000000000E1 :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000200000000000000000000060 -:10404000000000000020010001000120000000002D +:10400000000000000000000100200000000000008F +:104010000020000000000000000000000000000080 +:10402000000008000400A00011000000850220002C +:10403000010009040200000000000400000000006C +:104040000000000000000000000000000000000070 :104050000000000000000000000000000000000060 :104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 +:104080000000000000002000000000000000000010 :104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000010000EF +:1040A000000000000090000800C100A1000004040E +:1040B0000010108390890010008800C000C000002C +:1040C00000000000000000000000000000000000F0 :1040D00000000000000000000000000000000000E0 -:1040E00000000001000100010001000100010000CA +:1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF +:1041000000000000000000000000000008000000A7 :10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:10414000000000000000000000200208031000082A +:104120000000000000000040208500050241000062 +:1041300000800085002180C1000000800000008018 +:10414000000000000000000000000000000000006F :10415000000000000000000000000000000000005F -:104160000004002000080041002000100008004169 +:10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B0000000000000000000000041022100080093 -:1041C0004000000000000000000020092010410015 -:1041D00003100000000000000000000000000000CC +:10418000000000000000000000050000000000002A +:104190000002000800000000000000000000000015 +:1041A000000000000000000041050500200020087C +:1041B0000000418205C10500000400050008000060 +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF :1041E00000000000000000000000000000000000CF :1041F00000000000000000000000000000000000BF :1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000010000007D -:10424000010000000000000000000000002000004D -:10425000000001000000000000000000000000005D +:10421000000000010000000000000000000000009D +:1042200000000000000000000000010000900008F5 +:10423000000100000109001000820001000000914F +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E :10426000000000000000000000000000000000004E -:1042700000000000000000E000000000000000005E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000004100AD -:1042D00000E00000000000000000000000000000FE +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000810000E0CD +:104290000000000000810000070000000000000096 +:1042A000000000000000000000000000810000E0AD +:1042B000000200000000818100E007020000008190 +:1042C00000000700000000000000000000000000E7 +:1042D000000040000000000000000000000000009E :1042E00000000000000000000000000000000000CE :1042F00000000000000000000000000000000000BE :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D :10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D +:10433000000000810024000000000000F0F070D0B8 +:1043400000000000001C1C1C000000000000000019 :10435000000000000000000000000000000000005D :10436000000000000000000000000000000000004D :10437000000000000000000000000000000000003D :10438000000000000000000000000000000000002D :10439000000000000000000000000000000000001D :1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED +:1043B0000000000081002400000000000000000058 +:1043C000000000000000002C0000000000000000C1 :1043D00000000000000000000000000000000000DD :1043E00000000000000000000000000000000000CD :1043F00000000000000000000000000000000000BD :1044000000000000000000000000000000000000AC :10441000000000000000000000000000000000009C :10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C +:10443000000000000000240000000000040800004C +:1044400010101414000000001414282800000000AC :10445000000000000000000000000000000000005C :10446000000000000000000000000000000000004C :10447000000000000000000000000000000000003C :10448000000000000000000000000000000000002C :10449000000000000000000000000000000000001C :1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC +:1044B0000000000000000000810000000000010278 +:1044C0000000040414140000000014142828000044 :1044D00000000000000000000000000000000000DC :1044E00000000000000000000000000000000000CC -:1044F000000000000000000000000000000000615B -:104500000006000D00000000000000000000000098 -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000610006000D0000F7 -:104550000000000000000000006100008001000079 +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:1045100000000000000000610007800D00000000A6 +:104520000028000001A000000000000000000000C2 +:1045300000000000000000000001800000000000FA +:104540000001402980080000000000280040000110 +:10455000000000000000000000000040100000A06B :10456000000000000000000000000000000000004B -:1045700000610006000D000000610006000D000053 +:10457000000000000000000000000000000000003B :10458000000000000000000000000000000000002B :10459000000000000000000000000000000000001B :1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000AE0C5D0C0000C8 -:1045D0000000000000000000000005FF0505F0F4E9 -:1045E000F8FC0000000000000000000000000000D7 -:1045F000000000000000A0BC0A3E0000000028F8F7 -:1046000082F2000000000000000000000000000036 +:1045B0000000000000000000000F003CFFFA0C0C9F +:1045C00000000055000FFFF00F0F0000000000007A +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA :10461000000000000000000000000000000000009A :10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:104640000000000000000000000000000C0C0C0C3A -:1046500000000000000000000000000014FF14141F -:104660000014283C000000000000000000000000D2 -:104670000000000000000000003C003C00000000C2 -:1046800000F000F00000000000000000000000004A +:1046300000000000000000000000000F003CF0FA45 +:104640000C0C00000055000FFFF0000000000000FF +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A :10469000000000000000000000000000000000001A :1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000005C5C22 -:1046E000FF5C0F2F3F2F00000000000000000000C3 +:1046B0000000000000000000000000000055000F96 +:1046C000000F0A0A0000000F003C53530F000000C7 +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA :1046F00000000000000000000000000000000000BA :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 +:104730000000000000000000000000000000005524 +:10474000000F000F0A0A0000000F003C5353FFF057 :104750000000000000000000000000000000000059 -:104760000000FF0000283C280000000000000000BE +:104760000000000000000000000000000000000049 :104770000000000000000000000000000000000039 -:104780000000000000000000000000410000850063 -:1047900084000000100884001000000000002000C9 -:1047A0001080C000008040004002000000000400B3 -:1047B00020020004200410840000000000042000F7 -:1047C0000000000000008800000320001000C0006E -:1047D0002004200088002000840000208420002085 -:1047E00020200002C0008300880040081000200044 -:1047F000200020000000400020009000880084106D -:104800000000A000000020000400000000C0000222 -:104810000400000000000000000000000000000094 -:1048200000000002400040080000000000000002FC -:10483000200000000001400000040900000000000A -:1048400000000000000040000000000000004000E8 -:104850000000000400080000400000020001000108 -:1048600000010001100140001002040010002000AF -:1048700000020000000000000000000000004000F6 -:104880000000000010000090100000C00000840034 -:10489000000082000400000000000000020002008E -:1048A00002000400000000000000000500000000FD -:1048B0000000000000080000008000000000000070 -:1048C00000000000000000000000000000000000E8 -:1048D0000000000000004000000000000000000098 -:1048E00000000010000000000000000004000000B4 -:1048F000000000000000010000040904080808404E -:104900000204000402040200020000104000000043 -:104910000400050004000208020000000000040278 -:104920000000000805000008410800000000000029 -:1049300000820000000000090002000400100000D6 -:10494000000004040000000800080000000000004F -:1049500000000000000000008008000000000008C7 -:10496000000000080000050000840008000020008E -:104970000000000000000008100400011000008585 -:104980000000000900010001008400840000008490 -:104990000400080090000220040000000000000055 -:1049A0000000000000000000000000000000000007 -:1049B000900000000000000020000000000000083F -:1049C00000000000000000000000200000000000C7 -:1049D00000000000000000000008000000000000CF -:1049E00000000000000000000000000000000000C7 -:1049F0000000400300200000002100080008000023 -:104A000000214000C00000009008C00840000000E5 -:104A100000100900808400008001000000000000F8 -:104A20000000000000000000000000000000000086 -:104A300000000000000000000000800000000000F6 -:104A40000000000000000000000000000000000066 -:104A50000000000041000000000003000000000012 -:104A600000000000050005000500400000000000F7 -:104A7000000000000000000800080002000008001C -:104A80000800000000000800000000000900040009 -:104A900009000000000000000040000400000000C9 -:104AA00000000000080000000000000000000000FE -:104AB0000000000082000000000000001000000064 -:104AC00000000808080000000000C00008000800FE -:104AD00000000800000000000000000000000000CE -:104AE00000000000080000000000000000000000BE -:104AF0000000000082000840840001000040000027 -:104B00000000000400008280000000000804000093 -:104B1000C00510001010008200000000000000001E -:104B20000000000000000000000000000000000085 -:104B300000000000000000000000000000008000F5 -:104B40000000000000000000000000000000030062 +:104780000000000000000000000000000100000028 +:1047900000002000000000000000000001000000F8 +:1047A000040000000000000040000000A000000025 +:1047B00000000000000000040000000000000002F3 +:1047C0002000000000004000000120000000000068 +:1047D0000000000000000000000400000000400095 +:1047E0000000200000000000200000000040000049 +:1047F00000000000000000000000000000000000B9 +:104800000004200240000000200000000002100010 +:104810000000000000000000000200004002100242 +:1048200000004000000200020000000040004002C2 +:104830000000400000000000000040004002400076 +:104840000090000000020002009000000002400002 +:10485000400400044000100010000000100000029E +:1048600040000000000200024000000010001002A2 +:104870000002009000020090409000024002000000 +:104880000090000200000002000000024000000052 +:104890000000000020022000200020024000000054 +:1048A00000000000000000000010001000000000E8 +:1048B00000000000000000000010001000000000D8 +:1048C00000000200000000000010001000000000C6 +:1048D0000000001000100000000000100010000098 +:1048E00000000010000002000200000000000200B2 +:1048F0000200000090100200020000000000000012 +:104900000200001084000200040004000200800085 +:10491000000000000084800180828000800180000F +:10492000000000000000020000000304000000007E +:104930000200000000000200020000000000000071 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:10496000040000000000040000000400000000003B +:1049700000000000000000000000000200004000F5 +:1049800000000000000000000400020002004100DE +:104990000000000000000000000000000080000097 +:1049A0000000000000000002000082000000000083 +:1049B00004000000000000000000000000000000F3 +:1049C000000000000000000088000400000000005B +:1049D0000000C0000000080000000000000000000F +:1049E0000000000000004000040000000000000083 +:1049F00000000000000000000000000000000000B7 +:104A000000004000000000000400000088000000DA +:104A100090000000000000000000000000000008FE +:104A2000000000001100000009000020000000004C +:104A30001100000000000000000000000000000065 +:104A400000004100050005001000100003004000B8 +:104A5000000000004100000000820084000000000F +:104A60000040040000020000000000000000000000 +:104A70000000000000000000000000000000040032 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000100006 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000800EE +:104AC00000000000000000000000000000001000D6 +:104AD0000000000000000040000000000040000056 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000010000002A4 +:104B0000000000090000000000000000000000009C +:104B10000000000000000000000000000000000095 +:104B20008000000000000000000000000000000005 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 :104B50000000000000000000000000000000000055 -:104B6000000000000800000000000000000000003D -:104B70000900000000841000001100000200000184 -:104B800000A00000000100004104009000000000AF -:104B900010000000000005000000000000000020E0 -:104BA00000000000000000080000000000000000FD +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B800040000000000041000000000000000000A4 +:104B900010000000100000000000000000000800ED +:104BA00000020004001100040000000000000000EA :104BB00000000000000000000000000000000000F5 -:104BC00010000000000000000000000000000021B4 -:104BD00000000800000000000000100000000000BD -:104BE00000000000000004000000000000000000C1 -:104BF000000000000000000000080010002000007D -:104C00000000100010008800200800400200C04092 -:104C10000040000320008808080000000400000095 -:104C20002001000000000000000000000000000063 -:104C30000000000000000000000000000000000074 +:104BC00000000800000000000000000000000000DD +:104BD0000000820000000000000000000000000053 +:104BE00001000000000800000000000000000000BC +:104BF00000000000000000000000080000000000AD +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000100000000000083 +:104C300000000000000000000090000000000000E4 :104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C6000000000000000000000000008000000003C -:104C70000000000005080000008200C000000000E5 -:104C80000000000080008000000080000001002083 -:104C9000000100914000000000000010000000082A -:104CA00000000000000000080000000000000000FC +:104C50000000000405000500052000000000000021 +:104C600000000800000003000040000000200000D9 +:104C70000000002000000000000000000000000014 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA00000000000000000002000000000000000E4 :104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000008DC -:104CD0000000000000000000000000000000820052 -:104CE00000000000000000000000000000000000C4 -:104CF0000000000000000000002100000000000093 -:104D000002000010000001040080200000000000EC -:104D1000004000000010000008000000000000003B -:104D20000000000000000000000000000000000083 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 +:104CE00000000000000000000000000400040000BC +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000080000000000003 :104D30000000000000000000000000000000000073 :104D40000000000000000000000000000000000063 :104D50000000000000000000000000000000000053 :104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D8000000080100000000020A105408000038486 -:104D900005000001200000000000000000002000CD -:104DA00000C0008800200088000000000000000013 -:104DB00000000000000000000001C001000100012F -:104DC0000000000000000000000100009001000051 +:104D70000000000000000000000000000000020031 +:104D80000000000000000000000000000000000023 +:104D90000000000008000300000000000004000004 +:104DA00000010000000000000101210108010001D4 +:104DB00000010000000100010000000000000000F0 +:104DC00000000000000000000000000000000000E3 :104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000010000C2 -:104DF0000000209000200040100800010001000089 -:104E0000000000C000880000000000C190011001F7 -:104E1000880100C000000000000200000000000047 -:104E20000000008000000000000000000000000002 -:104E30000000000000000000000000410008000326 -:104E40000008000000000000000000101011001019 -:104E50000020000000000000000000000000000032 -:104E600000000000000000000000000040050008F5 -:104E700000410040200000000080000000410008C8 -:104E800000100002008000000000000000C10910B6 -:104E9000A0098008008000000000008000000000E1 -:104EA0000000000000008000000080000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC0000000000000000000000000004080200002 -:104ED0001020410800000000000000000000000059 -:104EE00000000000000000000000000000000000C2 -:104EF0000000000000000000002080820000000090 -:104F00000000000000008000000000008000088019 -:104F100002000300C10380040000000280000000C2 -:104F200000000000000090001000900090000000C1 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E2000000000410010001100021141C1080010F3 +:104E30000003004100080010001000000000000006 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000000032 +:104E80000000000000000000000000000000000022 +:104E90000000000000000000000000000000000012 +:104EA00000000000000000000000000000110000F1 +:104EB00000400000000000000000000000000000B2 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE0000000000000000000000000008000000042 +:104EF00000000000000000000000000000000000B2 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000000000000000091 +:104F20000000000000000000000000000000000081 :104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000014020 -:104F5000000001000101000000000000000000004E -:104F60000000000000000000000000000000000041 -:104F7000000000000000000004008800404008001D -:104F80000000000000000000080000000000C00059 -:104F9000018800000100C101020100000000C00002 -:104FA0000000000000000000880000000000000079 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000010000000000000000000000E0 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000A0008400C000080055 +:104F70000000000000000000000000000000000031 +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000200000100010000000000000000ED +:104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 -:104FF0000000000000000000000002020020000885 -:105000001002000000000000000000080000000086 -:1050100000C000000001900083C1000010020000E9 -:1050200000C00000000000000000000000000000C0 -:105030000000000000000000000000000000000070 -:105040000000000020000500020000000000000039 -:105050000000002009214120001000000000000095 +:104FF00000000000000000000000000000000000B1 +:1050000000000000000000000000000000000000A0 +:105010000000000000000000000000000000000090 +:10502000000000000000000000000000210011004E +:1050300000000010881041104041000020000500D1 +:105040000000000000000000000000000000000060 +:105050000000000000000000000000000000000050 :105060000000000000000000000000000000000040 -:10507000000000000000200003000000008000008D -:105080000000000000001100090000000000000006 -:105090000000008000100510414189C1000080809F -:1050A000000011800000000000000000000500006A -:1050B00000000000000000000000000000000000F0 +:105070000000000000000000000000000000000030 +:105080000000000000000000000000000000000020 +:105090000000000000000000000000000000000010 +:1050A00000000000000000000000000000110000EF +:1050B00000000000001000110000000000000000CF :1050C00000000000000000000000000000000000E0 -:1050D000000000000909100008000840000000005E -:1050E00000000000000000000000000000000000C0 -:1050F0000000000000000000000000000000802010 -:10510000800000800000000000000000000000009F -:10511000000000000000C1822111850008118000FC -:1051200000008000000000000000000000000000FF -:1051300000A000840000000000000000000000004B +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000020A0 +:1050F00000800080000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000010000000000006E :10514000000000000000000000000000000000005F -:1051500000000000000001910100000001000000BB +:10515000000000000000000000000000000000004F :10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:1051800010000888084088000000000000000000AF -:105190008800000000000000C110000189880100A3 -:1051A000C00000000400000000000000000000003B -:1051B0000081000007000000000000000000000067 +:105170000001002000080000000000000000000006 +:10518000000000000000000000000000000000001F +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B0000000000000000000000000E0000081008E :1051C00000000000000000000000000000000000DF -:1051D0000000000000000000410000E000000000AE +:1051D00000000000000000000000000000000000CF :1051E00000000000000000000000000000000000BF :1051F00000000000000000000000000000000000AF -:105200000000001100000700000000000000000086 -:1052100000000000000000000000840000E000002A -:105220000000600000E0000000000000000000003E +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E :10523000000000000000000000000000000000006E :10524000000000000000000000000000000000005E :10525000000000000000000000000000000000004E :10526000000000000000000000000000000000003E :10527000000000000000000000000000000000002E -:10528000000000003C7E3C3E767630760000000058 -:1052900000000000FFFF00003C3C0000F0F00000B8 -:1052A000FFFF0000F0F00000F0F000000000000040 +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE :1052B00000000000000000000000000000000000EE :1052C00000000000000000000000000000000000DE :1052D00000000000000000000000000000000000CE :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE -:10530000000000000000006600067630303000002B -:10531000000000000000FFFF00003C3C0000F0F037 -:10532000000000000000F0F00000F0F000000000BD +:10530000000000000000000000000000000000009D +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D :10533000000000000000000000000000000000006D :10534000000000000000000000000000000000005D :10535000000000000000000000000000000000004D @@ -99666,495 +99666,495 @@ :10538000000000000000000000000000000000001D :10539000000000000000000000000000000000000D :1053A00000000000000000000000000000000000FD -:1053B00000000000000000000FFF0CFC00000000D7 +:1053B00000000000000000000000000000000000ED :1053C00000000000000000000000000000000000DD :1053D00000000000000000000000000000000000CD :1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000E0E0EFF66F617 -:1054100066760000000000000000000000FF0000B1 -:105420003C3C000066660000FFFF00003C3CFFFFC4 -:10543000C3C3000000000000000000F00CFC42DBD1 -:10544000F9F900000000000000000000000000006A +:1053F000000000000000000000000000000040026B +:105400002004000000000000000000000000000078 +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C :10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C :10547000000000000000000000000000000000002C -:10548000000000000000000000000000020202FF17 -:1054900000F000300000000000000000000000FFED -:1054A00000003C3C000066660000000000003C3C40 -:1054B000FFFFC3C3000000000000000000005020F8 -:1054C00000000000000000000000000000000000DC -:1054D0000000000000610006000D00000000000058 -:1054E00000000000006100008001000000000000DA +:105480008001100800000000000000000000000083 +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B0000000000000000000000000000061000685 +:1054C000000D000000610006000D000000610006F4 +:1054D000000D0000000000000000000000000000BF +:1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC -:1055000000000000000000610006000D0000000027 -:1055100000200000000000610006000D00004002B5 -:10552000800000209202408280018020920240E3AD -:105530008006802D820200000000000000000000B4 -:10554000000000000000000000000000000000005B +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:10552000000000000000000000000000000000007B +:10553000000000000000000000000000000000006B +:1055400000000000000000000000BABA30FF0000B8 :10555000000000000000000000000000000000004B -:105560000000000000004F410F00F828282800002C +:10556000000000000000000000000000000000003B :10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B :10559000000000000000000000000000000000000B -:1055A000000000000000000003034141C3C08280EE +:1055A00000000000000000000000000000000000FB :1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB +:1055C000000000000000000000000000303030301B :1055D00000000000000000000000000000000000CB -:1055E0000000000000000000EFEB0F00F8F828F8C2 +:1055E00000000000000000000000000000000000BB :1055F00000000000000000000000000000000000AB :10560000000000000000000000000000000000009A :10561000000000000000000000000000000000008A -:105620000000000000000000000000030041000036 -:105630008280000000000000000000000000000068 -:10564000000000000000000000000000000000005A -:1056500000000000000000000000FF08FF04000040 -:1056600000000000000000000000ABAB03FF4100A1 -:10567000C3F0000000000000000000000000000077 -:105680000000000000000000000000001EFF1EAA35 -:105690000000000000000000000000007D553D05F6 -:1056A00000000000000000000000000041000300B6 -:1056B00003C30282000000000000000000000000A0 -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000008080404B2 -:1056E00000000000000000000000000003030303AE -:1056F000410000F000000000000000000000000079 -:1057000000000000000000000000000000001E5526 -:105710001E000000000000000000000000003C002F -:105720003D050000000000000000000000004141B5 -:1057300003030000028200000000000000000000DF -:1057400000000000000000000000880400000000CD -:105750000000040000000000000088008800000035 -:10576000000000000000000000002000C000000059 -:1057700000002000880000000000200088000000D9 -:1057800000000200040000020000000000002004ED -:10579000000000002000200008000000C0002000E1 -:1057A0000000000020002000840040000400880069 -:1057B00000000000200002001000100088002000FF -:1057C000840004002100200000000000000000020E -:1057D000000000080002000400200000000000009B -:1057E0000002004000000000000000000000000077 -:1057F000000000020002400400020000000400005B -:105800004000000040000000000005000000000013 -:105810004001000040000000000000000000000007 -:1058200000004000000040000000404080400000B8 -:105830000040004000004000200280008020000066 -:1058400000024082804004000000000000000400CC -:105850000000000004000000000000000000000044 -:105860000000000000000000000000000000040034 -:105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 -:1058A00000090000000000000000000000000000EF -:1058B000000008000400000500004000A0000000F7 -:1058C00000000000000000000010090000080000B7 -:1058D000020804080008000400080000040004088E -:1058E00004000008040000000000000000040000A4 -:1058F0000004000400080404040441000000000245 -:10590000000000080010000000000000000000007F -:1059100000000000000000840904040000000008EA -:105920000000000000080004000000080000000063 -:1059300000000000000000000000000080000008DF -:105940000008000000080084000000088400000037 -:10595000000004000000000000080000000000003B -:105960000000000000000000000000000000000037 -:105970000000000000000000000000000000000027 -:10598000000000000000000800000000000000000F -:105990000000000000000000000000000000000007 -:1059A000000000000000000040080000400000006F -:1059B00000000100000000000000000500000008D9 -:1059C00000210002040800800004002000110008EB -:1059D0000000000000000000000000000040000087 -:1059E00000000800000000000000000000000000AF -:1059F0000400410041000300000000080000000016 -:105A000000080000000000820000000041000000CB -:105A10000000000404000000000021000300040056 -:105A2000000004004100000000000000410000846C -:105A300000A000001082090000002100000000000A -:105A400000A000A00000000011042100200121009E -:105A5000050000200000C000A000000000000000C1 -:105A6000000000000000000010000800100000000E -:105A70000200000000000000A000002082000040A2 -:105A80000000000000000000000000008200000094 -:105A90000000000000000000000000000000000006 -:105AA00000000000000000000000A0002141840070 -:105AB000208084058500A0004000000000008200D6 -:105AC0000000A000830000002040000004048200C9 -:105AD00002040000000000000000000000000000C0 +:10562000000000000000000000000000000000007A +:10563000000000000000000000000000000000006A +:1056400000005D0C5D5D00000000FF0CFF14000019 +:1056500000005D5DFF0C0000000000000000000085 +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:10569000000000000000000000000000000000000A +:1056A00000000000000000000000000000000000FA +:1056B00000000000000000000000000000000000EA +:1056C000000000005D0C0C0C000000000C0C141419 +:1056D000000000000C0C0C0C00000000000000009A +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:105730000000000000000000000000000000000069 +:105740000000000000000000000000000004000055 +:1057500000000000200000000000000040020000E7 +:1057600000004000200000800084008000801000C5 +:105770000000400020000000000000000002400087 +:1057800000000400000400030000000004001004F6 +:105790001000000020000000100040000004A000E5 +:1057A0000800A00088808200400040004000040003 +:1057B000C0008800000040008400048002008800CF +:1057C00088000000A0002000000000000000000091 +:1057D00000000000000010000000000000000000B9 +:1057E000400000000002000000202120094000408D +:1057F0000000000000000000100000020004009003 +:1058000000004002400400000000400200020000CE +:1058100021900000000000020000000200020002CF +:105820000004C0000002404000000000000200022E +:10583000009010000000000000024000804089003D +:105840000000000200020002000000000000000052 +:105850000000000000000000080000000000000040 +:105860000010000000000200020200000200001010 +:105870000000000000000000000002000000001016 +:105880000000000000000000020000000000000016 +:1058900000000000000000000000001000000000F8 +:1058A000040000100000000002000441000000009D +:1058B00002000000020002000400000000000200DC +:1058C00002000000000002000200000000000000D2 +:1058D000000802080000000800000400000000901A +:1058E000040004080400040004000000000000009C +:1058F000009000040000000200000400000000000E +:10590000000000040000000002000400000000008D +:10591000000000000000000004000000040000007F +:10592000000000000400040000002000020000004D +:105930000000000000000000000002000200000063 +:105940008000000040000002000082000200000011 +:105950000000000000000000000000000000000047 +:105960000000000000002000000000000000900087 +:1059700040000400000000000000000000000000E3 +:10598000000000000400A0008800C00082000000A9 +:1059900004004000C0000000000000000000000003 +:1059A00000000000000000000400000000000000F3 +:1059B00004000000000000000000000000000000E3 +:1059C0000000000000000100400040000000000056 +:1059D000000000000000000000881100000000002E +:1059E000009000400000000000000000000000885F +:1059F000000000000000000000000500050000009D +:105A00000000100010001000000000000000000066 +:105A10000000000000000000000000000000000086 +:105A2000000000000000000000000008000000006E +:105A30000000000000000000000000000000000066 +:105A40000000000000000000020000000000000054 +:105A50000000000000000000000000000000100036 +:105A600010400000000020040000000000000000C2 +:105A70000000000400000000000000000000000022 +:105A80008400000000000000000000000000000092 +:105A90000004000000000000000000000000000002 +:105AA00010000800000000000000000000000800D6 +:105AB000C00000000000000008000800080000000E +:105AC00000000000040008000400040008000800B2 +:105AD00008000000000000000000000000000000BE :105AE00000000000000000000000000000000000B6 -:105AF0000000100000000000000000000000000096 +:105AF00000000400000000000000000000000000A2 :105B00000000000000000000000000000000000095 -:105B10000000000000000000000000002100210043 -:105B20000000000000000000000000000000A000D5 -:105B300000A08004020002A000828000000041C09A -:105B4000219003A0110020A00000800000008084AC -:105B50000000000020000000000000000000000025 +:105B1000000008000000000000002100000000005C +:105B2000000000000000000000000000000008006D +:105B3000800000000000410000000800000000009C +:105B400000000000000080000000800080000000D5 +:105B5000000000000800000000000000000000003D :105B60000000000000000000000000000000000035 -:105B7000000008001000000000000000000000000D +:105B700000000000820000000000000000000000A3 :105B8000000000000000000000000000080000000D -:105B900000000008000000000000000000000000FD -:105BA00000000000A000000000000000080000004D -:105BB0002000200088000000840084000000000015 -:105BC0000208000200000082820400008800000534 -:105BD00090058200002010000090080400040300DB -:105BE00000000000000000000000000000000000B5 -:105BF000000800000040000000000000000000005D -:105C000003A00300009005880000000000000000D1 -:105C10000000000000000000000000000000000084 -:105C20000000000000000088000000040008008858 -:105C30000500800080000004000000A000840088AF -:105C40000000838403000000000800010000000041 -:105C500000020040030000014000000000000000BE +:105B90000000000004000000000000000000000001 +:105BA0000800000000000000000000000000C0002D +:105BB00000000400000000000000000000000000E1 +:105BC00000000000820000009000040000000800B7 +:105BD00000000000001000000000000000000000B5 +:105BE000000011000804000000000940400000000F +:105BF0000000000000000020000000000000400045 +:105C00000000000000000000000000000000000094 +:105C10000000000000001000000000000000000074 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000040000000000002000000000000020 :105C60000000000000000000000000000000000034 -:105C70000000000000000000040000000000000020 -:105C80000000000000000000000000000000000014 -:105C90000000000082000000020000004000000040 -:105CA00008000000000000000000040000000000E8 -:105CB000000000000000200001000100404102211E -:105CC00000210808002102040200020008219004BB -:105CD0000808100801050000000000200000000076 -:105CE000000010000000000000000500000000009F +:105C700000000000000082000000000000000000A2 +:105C80000000000000000000000010000000000004 +:105C900000000000000008000000000000000000FC +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000009000000CB +:105CD00084000000000000008400000000000000BC +:105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 :105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 :105D20000000000000000000000000000000000073 -:105D30000000400000000000800020002000C18220 -:105D4000800000004100000080018000800003A06E -:105D500003890001910104002100110000010000ED +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000008000000020247 +:105D50000000000000000000000000000000000043 :105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 +:105D7000000000000000000000000000000000C063 +:105D80000008000000880000000000000000000083 :105D90000000000000000000000000000000000003 -:105DA00001000000400000000000000000000000B2 -:105DB00000000000000000000000000000000000E3 -:105DC00000C102888800000100C00008010108002D -:105DD00001C1400011000001100000000004880211 +:105DA00000000000000000000000000000000000F3 +:105DB000000000000000000000A00008000000003B +:105DC00000000000000000000000000000000000D3 +:105DD00000C0009000A000081102008400880208A2 :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 +:105E00000080000000000000000000000000000012 :105E10000000000000000000000000000000000082 -:105E200000001000100080000000000000000000D2 -:105E30000000000000000000000000000000000062 -:105E4000000002888582A141000302832191100590 -:105E5000800309C121050511000380000000000036 -:105E600000800000000000000000000000000000B2 +:105E20000000000000000000000000000000000072 +:105E300000000000000000000000008000000000E2 +:105E40000000000000000000000000000000000052 +:105E500000000080000000000000908000000000B2 +:105E60008080000000000000000000000000000032 :105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 +:105E8000000000000008000000000000000000000A :105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000000000000090000D9 -:105EC00000080000208020001000C00203054000F0 -:105ED000200089404180C0001089C10300000000FB -:105EE0008000000000000000000000000000000032 +:105EB00000000000000000000000000000000003DF +:105EC00000000000000000000000000000000000D2 +:105ED000000000000000000300008000800000A01F +:105EE0008080008000000000000000000000000032 :105EF00000000000000000000000000000000000A2 :105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 :105F20000000000000000000000000000000000071 :105F30000000000000000000000000000000000061 -:105F4000000000010000000800000000C101004046 -:105F500001000100C141000888000091C1A10800B2 -:105F60000810A00040200000000000000000000019 +:105F400000010020008400000000000000000000AC +:105F50000000000000002000A0000000C0000400BD +:105F600004C0024090C000000000000000000000DB :105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 +:105F800000000000000000000000000020000000F1 :105F90000000000000000000000000000000000001 -:105FA00000000000000000000001000000010000EF +:105FA00000000000000000000000000000000000F1 :105FB00000000000000000000000000000000000E1 -:105FC000000008000000000000100000000101C1F6 -:105FD00000010000A10100C088000000008501C18F -:105FE000000200200402040800000000000000007D +:105FC000900000000000020000000000000000003F +:105FD000000000000000000000900020000800C049 +:105FE00089080008C00404880000000000000000C8 :105FF00000000000000000000000000000000000A1 :106000000000000000000000000000000000000090 :106010000000000000000000000000000000000080 -:106020000000000000000000000000020005000861 -:106030000010000000000000000000000000000050 -:1060400000000000800000000900000205020005B9 -:1060500009C1002104418508108080021040058399 -:1060600011C10580000080808080000000000000D9 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:1060400000000000000000008000000000000000D0 +:106050000000000000000000000000000000000040 +:10606000008041800080808000000000000000006F :106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 +:10608000000000000000000000008004804080004C :106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000080000E8 +:1060A00000000000000000000000000000000000F0 :1060B00000000000000000000000000000000000E0 -:1060C00000000000002000000000000020900900F7 -:1060D00020809120C1C0C00002800840C11010097A -:1060E00003000509004000C100000000000000009E +:1060C0000000000080000000000000000000000050 +:1060D00000000000000000000000000080020040FE +:1060E0000000000000000000008000000000000030 :1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:10611000000000000000000000000000000000007F +:10610000000000000000000000000000C0010200CC +:10611000040000000000000000000000000000007B :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000C18E -:10615000000000109101C1C0110001080100C1033D -:10616000000100000001000000A100880000000004 +:10614000000000000000C000A0004000900000001F +:106150000000000000000000000000000000C0017E +:10616000000008088200840088048408C000000041 :10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF +:10618000000000000000000000000000000000818E +:1061900000000700000000000000000000000000F8 :1061A00000000000000000000000000000000000EF -:1061B000810000E00000000000000000000000007E -:1061C0000000000000000000810000E0000000006E -:1061D000810000E000004100810000E0000042007A -:1061E000810000E000000000008100000700420084 +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E000008100000700000000000000000048429D :1061F000000000000000000000000000000000009F :10620000000000000000000000000000000000008E :10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:1062500000003C3C3C3C00003C3C000000FF0000D7 -:10626000FFFF0000AAAA000000FF00000000003CA1 -:10627000FF3C0000000000000000000000000000E3 +:10624000000000000000000000000F0FFF00000031 +:10625000000000000000000000000000000000003E +:1062600000000C0C0F0F3C00F00000000960040857 +:1062700010200000000000000000000000000000EE :10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE +:10629000000000FFF0F0000000000000000000001F :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE -:1062D000000000003C3C3C3C00003C3C000000FF57 -:1062E000000000000000AAAA000000FF000000005B -:1062F000AAF0AAF00000000000000000000000006A +:1062C000000000000000000000000000C3C355559E +:1062D00000000000000000000000000000000000BE +:1062E000000000000C0C00003C00F0000960000001 +:1062F00001024080000000000000000000000000DB :10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D +:10631000000000000055003C0000000000000000EC :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D :10634000000000000000000000000000000000004D -:10635000000000000000FF000000FFFF0000FF0041 -:106360000000FFFF0000FFFF0000F0F0FFFF171725 -:106370001717F101FD0D00000000000000000000F3 +:10635000000000000000000000000000000000003D +:106360000000000000000303C30000000000240040 +:1063700000240410082000000000000000000000BD :10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD +:106390000000000000000055003C0000000000006C :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD -:1063D0000000000000000000FF00000000000000BE -:1063E000FF0000000000000000000000F0F0FFFFD0 -:1063F0001717171700000000000000000000000041 +:1063D00000AA000000000000000000000000000013 +:1063E00000000000000000000303C3003C3C0F0F4E +:1063F00081000081014002800000000000000000D8 :10640000000000000000000000000000000000008C -:10641000000000000000000000000000000000007C +:106410000000000000000000100020280000000024 :10642000000000000000000000000000000000006C -:10643000000000000000000000000061000680096C +:10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C -:10645000000000610006800D000040638007802876 -:10646000920240C38005802D9202408280018020EC -:10647000820205000A28050000A0000000000000BC +:106450000000A0000000000000000000000000009C +:106460000000000000000000000010002028004094 +:1064700000086000000000001000000000000000A4 :10648000000000000000000000000000000000000C :1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC -:1064C000F414FC3C0000000000000000000000008C -:1064D000000000000000000000000000A0F54141A5 -:1064E00000C38282010341C3000F000F28280A0A5B -:1064F00000C1C1C100000000000000000000000059 +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C :10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B -:106540000000F000F828000000000000000000003B -:106550000000000000000000000000000000A0F5A6 -:10656000EBEB000302020103000000C300C300289C -:10657000000A00C100000000000000000000000050 +:10654000000000000000000000000000000000004B +:10655000000000000000000000000000000000003B +:10656000000000000000000000000000000000002B +:10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB :1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB -:1065E000EFCFAF0F38F83BFB828230F33D29150126 -:1065F000B0B0B0000000000000000000000000008B +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B :10660000000000000000000000000000000000008A :10661000000000000000000000000000000000007A :10662000000000000000000000000000000000006A :10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A :10665000000000000000000000000000000000003A -:106660000000EFCFAF0F08C80BCBBEBE30F3BFABFF -:1066700097830000B000AAA03C300000000000009A -:1066800000000000000000002000400000000000AA -:1066900011000000000004002000000000001000B5 -:1066A00040004000000000008400200000000000C6 -:1066B0000000000000002000C00000004000200496 -:1066C000000400032000000004040000200000007B -:1066D0008800840084004000200020040000400066 -:1066E00040001000200088002000840020000000EE -:1066F00082004000200088000400200004022100E5 -:106700002088200000000000004000000000400041 -:10671000404008004000000080000000020000002F -:106720004000000000000000000000000000000029 -:106730004020000040004000000000000000000277 -:106740004000000000000000000000000000000009 -:106750004040000040004000000000020000000235 -:106760008002A00000000000400000000000410086 -:106770000000200204004040109080000000004013 -:1067800020C00004C12000000200820000000000C0 -:1067900000000000000000000000040004000000F1 -:1067A0000000A00000000000000000000400000045 -:1067B00000000000000000000000000000000000D9 -:1067C00000000000000000000000000000000000C9 -:1067D0000000000000050000840000000009010026 -:1067E0000000000004000010400000000000001045 -:1067F0000004000000000000000001400010001034 -:106800000000031000000210000000000502040058 -:1068100000000000040000000000040084000000EC -:106820000400040000080000040000000000000054 -:106830000000000000000000000000000000000058 -:106840000000000000080000000000080000001028 -:106850000000000800000008000000000000000028 -:10686000080000000088C1100900C11000000000ED -:106870000000000800000010200040004008000058 -:1068800000000000C0C000840011000500110009D4 -:1068900000000000000000000000000000000000F8 -:1068A00000000005000000210000000000000008BA -:1068B0000000000000000008400000000000000090 -:1068C00000000000000000000000000000000000C8 +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:1066800000000000000010000000402040800020BA +:10669000202020000000C00040000000000000009A +:1066A0008800000000002000850020002000000479 +:1066B0002000200000002000200000000000C0009A +:1066C000C00400030000000020008400200020001F +:1066D00084002000000040004004880440001000B6 +:1066E000880410040000000020008800858041809C +:1066F0008900000000002000C00020004000400091 +:106700001000040000001000000200001001002032 +:106710000001000140001090100200001000000075 +:106720000000000040024000400020004102410003 +:1067300000004102000040004000000040020090C4 +:106740000000000200000000000010020002000033 +:10675000000021040004009000002102200200003B +:10676000000240042000210200020002000020205C +:1067700010202002000240020020419000901002F0 +:1067800000002000400200000000000000000100A6 +:1067900000000110001000000000000000000000D8 +:1067A0000000001000102000200020002000000049 +:1067B0000000041000100000000000100010000095 +:1067C00000000010001000000000000008000000A1 +:1067D0000000000000000000000000000040001069 +:1067E0000200020000000000000000000010040091 +:1067F00002000200820000000000000000100010F3 +:10680000000002000000080000000000040000007A +:10681000040004000400000000000000000000006C +:10682000000800000000000080008000800082005E +:106830000400000000000000000004000000000050 +:106840000408040000000000000000000000000038 +:1068500000000000000000080000400000000000F0 +:106860000000000840004100000004000000020099 +:106870000000000004000090020000000000000082 +:1068800000000008000040000000000000000000C0 +:1068900000000000002088000020000084000000AC +:1068A00000000000000000000000000001004100A6 +:1068B00000000000000000000000000000000000D8 +:1068C000000040008400040000000000840000007C :1068D00000000000000000000000000000000000B8 -:1068E0000000820000030000000501084000104085 -:1068F0000000004000000000002100080420008586 -:106900000040008090004004A02100000000000032 -:106910000000040000000000000000000000000073 -:106920000000000000000000000004000000000063 -:10693000000008000000000000000000000000004F +:1068E00004000000000000000000000000000000A4 +:1068F00000000000880000000400040040000000C8 +:106900000000040000000000000000000000000083 +:106910000000000000000000000000000000000077 +:106920000000000000000000000005400000200002 +:106930002000110000000000000000000000000026 :106940000000000000000000000000000000000047 -:1069500000000000000000A00000040004A00000EF -:10696000400000001000400009000000200000006E -:10697000800000000001008200A000000000000173 -:10698000400800012140000004A109000588000022 -:106990000000001000100000000001050040000091 -:1069A00000000021000300000000000000000000C3 -:1069B00000000000000000000000000000000000D7 -:1069C00000000000000000000000C00008000000FF -:1069D000000000000000080000000000000082002D -:1069E0000000C00000000000C0000100000900001D -:1069F000C000C008C00000008200C000000000000D -:106A0000000009400300000000000000A00008840E -:106A100021840000000110050000000008000001B2 -:106A20000000000000000000001000000000000056 -:106A3000000800000000000000000000000000004E -:106A4000000000000000000000000008000000003E +:106950000000000000000000000000000000000037 +:1069600000004100000000000000000000000400E2 +:106970000000000000000300080084008000000008 +:1069800011004100000003000000030003000000AC +:1069900000000000000000000100000004000000F2 +:1069A000000000000000004000000000080000009F +:1069B0000000000000000000000000008200000055 +:1069C00000000000000000000000000008000000BF +:1069D000004000000000A0040000C000C00800004B +:1069E0000000000008001000A00082000800000065 +:1069F0004000000000000000100401001000100022 +:106A0000C0008800A000900000000800A00008005E +:106A100000000000000000000000040000008000F2 +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000020000000000000044 :106A50000000000000000000000000000000000036 -:106A60000000000000000084000000C002840088D4 -:106A70000000000000010000000000000000000015 -:106A80002100030002000200110000000040008409 -:106A900000044000000000000000000200000000B0 -:106AA00000000000000000000000000000000021C5 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000800000000000000BE -:106AD00000000000000000000000000000000000B6 -:106AE000100000000000400000000200040209083D -:106AF000840082000021110840000088024100004B -:106B00000200020082800120400000841000002169 -:106B10004121000002000000000000000000000011 -:106B20000000000000000000000000000000000065 -:106B3000000000000000000000000000000800004D -:106B40004000000000000000000000000000000005 -:106B50000000000000000000000000000804000029 -:106B600000000000002000000000000080208001E4 -:106B70000400000800002100C0108000000480C054 -:106B80002100800080082140040180000021009045 -:106B90000000200000A000008400C000840000402D -:106BA00000000000000000000000002100000000C4 -:106BB00000000000000000080000000000000000CD -:106BC00000000000000000000000000000000000C5 -:106BD00000000000000000000000000000000000B5 -:106BE00000000000000000000000050000000000A0 -:106BF000C1400110C0080121014140900210041061 -:106C000082000200A0031000114000400820202054 -:106C1000000000210021840000000000410000006D -:106C20000000000011000010020000000000000041 -:106C30000200000000000000000000000000000052 -:106C40000000002000000004000000000000000020 -:106C50000000000000000000000000000000000034 -:106C60000000000000000000000000008408000098 -:106C70000000400104000000040002008040800089 -:106C8000000000028000000000000401000100017B -:106C900080014002000000201100410200900088A5 -:106CA00008204010041000820802000000000000CC +:106A60000300000000000000000000000000000023 +:106A700000000000000000000000800020008800EE +:106A80008000000000000000000000000000000086 +:106A900000000000000008000000000000000000EE +:106AA00000000000000000000000000000000000E6 +:106AB00088000080000000000000000000000000CE +:106AC00000000000000000000000000000000000C6 +:106AD000000000000000000010000800000000009E +:106AE0000000A00000000000000000000000000006 +:106AF0000000000000000000100010000000020074 +:106B0000000020000000100000001000C000000085 +:106B1000C000000000000000000000000000002095 +:106B200000000000040000000000000000900000D1 +:106B30000000000000040000000000000000000051 +:106B40000000000000000000000000000400000041 +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000000000000000025 +:106B700000000000040000000000000008000020E9 +:106B800080000000800021000000000021000004BF +:106B90000004059004040000000000000000000054 +:106BA00000000000000000000000000000000200E3 +:106BB00000000000000000000000000000000000D5 +:106BC00000000008000000000000000000000000BD +:106BD0000000000082000000000000000000020031 +:106BE000000000000000000008000000000000009D +:106BF0000000000000000000000000008200000013 +:106C00000800030040000900000000001000000020 +:106C1000080000000000000000000000000000006C +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000020000000000014 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C8000000000008200000008000040000000003A +:106C900000000000000000000200000000000000F2 +:106CA00000000000000000000000000000000000E4 :106CB00000000000000000000000000000000000D4 :106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000040C0008222 -:106CF0000008100200C089898900000001C0A000BE -:106D00004105000100C000000000080040C08940AB -:106D10009108C090000002008201000090800000F5 -:106D20000000000080008000008000800000000063 +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000010000010000000000000081 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 :106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 +:106D4000080000000000000000000000000000003B :106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000808023 -:106D70000080008080000384A0A0C1020000048481 -:106D8000840283A00020008000000000800080803A -:106D90008280208080004009C0108910000000001F -:106DA00000A1800800000000802000880000000092 -:106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000000000000C3 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D8000000000000000004110030200001000009D +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000080000000800000E3 +:106DB00000000000000000000000000000000008CB +:106DC00000000009000000000000000000000000BA :106DD00000000000000000000000000000000000B3 :106DE00000000000000000000000000000000000A3 -:106DF0008000000980108000410010802003C083C3 -:106E000020000300030084000000800000008000D8 -:106E1000A000C020C082C003200010001108832100 -:106E20000800208210909084080004022004880248 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000500C1803C +:106E100000000080000000000000000000000000F2 +:106E2000000000000000000000000002000000C0A0 :106E30000000000000000000000000000000000052 :106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 :106E60000000000000000000000000000000000022 -:106E70000000A0008800A0040804009000080001A1 -:106E8000C009008200000000C000000008000000EF -:106E9000C000401004000805C1010120A10001004C -:106EA000C0019008002000A088900920000408205C -:106EB000882000000000200000000000000000000A -:106EC00000000000000000000000000000000000C2 +:106E70000000000000000000000000000000000012 +:106E800000000000000000000000900008880000E2 +:106E9000C1400000000400000000000000000000ED +:106EA0000000000000000000000000000000C00022 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000020000000000000000000000C0 :106ED00000000000000000000000000000000000B2 -:106EE00000000001000000000000000000000000A1 -:106EF00000000000089000820008890800000005DA -:106F0000090001C100010000000901C108000000E2 -:106F1000000000C0040300C1000821C100012001DD -:106F20000101010005000000000000004100008098 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 +:106F0000000000000000000000000000010000017F +:106F100084000101000000000000000000000000EB +:106F20000000000000000000000000004000000021 :106F300080000000000000000000000000000000D1 -:106F40000000000000000000000000000000000041 +:106F400000000000000080000000080000000000B9 :106F50000000000000000000000000000000000031 -:106F60000000000000010000000000000000000020 -:106F700000000000000080000080000009000904FB -:106F80004183910209C100020411038504C18000FC -:106F900000000000008000A00040009104C1000833 -:106FA00091100821080000108020002080000000BF -:106FB0000020000080000000000000000000000031 -:106FC00000000000000000000000000000000000C1 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F800000000000000000000000000000004100C0 +:106F900040108010214100000000000000000000AF +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000050000000000000000BC :106FD00000000000000000000000000000000000B1 -:106FE00000000000000000010000000000000000A0 -:106FF0000000000000000000000800110000000078 -:10700000102110A111008320840504110300030343 -:107010008000000080000000820503202080821193 -:107020002105101003800205400120088808840013 -:107030004000880910080400000000000000000063 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:1070100041040320100040100000000000000000A8 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 :107050000000000000000000000000000000000030 -:10706000000000000000000000010000000000001F -:1070700000000000000000000000A0000200080066 -:1070800008000189001000009000C01000C002003C -:107090000100C000000008000000C190C1C08302D0 -:1070A0001101012000210104000000000000070080 -:1070B000000000000000070048000000000007007A -:1070C00000000000000000000000000000000000C0 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:10709000000001A100000008000100000000000045 +:1070A00000000000000000000000000000000000E0 +:1070B0000000000000000704004200000000000083 +:1070C00000000000000000000000810000E000005F :1070D00000000000000000000000000000000000B0 :1070E00000000000000000000000000000000000A0 -:1070F000000000000000000000000000008100000F -:1071000007000000884100E007000081810000E0E6 -:10711000000000000000000000000000818100E08D -:1071200007000006880000E00000000000000000EA +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:1071100000000000818100E0070041000000000045 +:10712000000000000000000000000000000000005F :10713000000000000000000000000000000000004F :10714000000000000000000000000000000000003F :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F -:107170000000000000000000000000000000080BFC -:10718000C8CB0FC300993C3C3C3CF0F00000F0F051 -:107190000000FF000000F0F00000FFFF000000F31F -:1071A0000062040C060F0000000000000000000058 +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF :1071B00000000000000000000000000000000000CF :1071C00000000000000000000000000000000000BF :1071D00000000000000000000000000000000000AF :1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F -:10720000383BF8FB0FC3FF993C3C3C3CF0F00000DE -:10721000F0F00000FF000000F0F0000000000000AF -:1072200000000062040C00000000000000000000EC -:107230000210200000881004021020000088108432 +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E :10724000000000000000000000000000000000003E :10725000000000000000000000000000000000002E :10726000000000000000000000000000000000001E @@ -100167,491 +100167,491 @@ :1072D00000000000000000000000000000000000AE :1072E000000000000000000000000000000000009E :1072F000000000000000000000000000000000008E -:10730000000000001018909900000CFC000000FF25 -:107310000000666600000F0F000066660000FFFFB9 -:10732000FFFFF0F0000000000908991800000000BD -:107330006666060600000000000000000000000075 +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:107320003C3C0C0C000000000000000000000000CD +:10733000000000000000000000000000000000004D :10734000000000000000000000000000000000003D :10735000000000000000000000000000000000002D :10736000000000000000000000000000000000001D :10737000000000000000000000000000000000000D -:107380000000000000001018000000000CFC0000CD -:1073900000FF0000666600000F0F00006666000038 -:1073A0000000FFFFF0F0303C6066090800000000BC -:1073B00000000000060600000000000000000000C1 -:1073C0004000000000000000000005000000000078 -:1073D00000000000000000000000000000000000AD +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A000000000000C0C00000000000000000000C5 +:1073B00000000000000000000000000000000518B0 +:1073C0000A00050004A0000000000000000000000A +:1073D00000000000000000610007800D00000000B8 :1073E000000000000000000000000000000000009D :1073F000000000000000000000000000000000008D -:107400000000000000000000000020280000000034 -:1074100045638A27852892A240E38007802892024C -:1074200040828000002082021061202F80480008E6 -:1074300000610007800D0005000000000000000052 +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:1074200005000A29850000A50000000000000000FA +:10743000000000000000000000000000000000004C :10744000000000000000000000000000000000003C :10745000000000000000000000000000000000002C :10746000000000000000000000000000000000001C :10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC -:107490000000FFC34D4DC0C08282FEFCBE3C080808 -:1074A000000C00000000000000005C5CFF0F0F0CEF -:1074B0000A08FFDFFF1C013D013D00000000000045 +:1074900000000000000000000000000000000000EC +:1074A0000000F0003030FF00F0000000000000009D +:1074B00000000000000000000000000000000000CC :1074C00000000000000000000000000000000000BC :1074D00000000000000000000000000000000000AC :1074E000000000000000000000000000000000009C :1074F000000000000000000000000000000000008C :10750000000000000000000000000000000000007B -:10751000000000003C004D4DC0008200FEFCBE3C5F -:107520000A0A000F00000000000000005C5CF00090 -:1075300000000A08FFD3FF10C1FDC1FD00000000DC +:10751000000000000000000000000000000000006B +:1075200000000000F00030300000F000000000001B +:10753000000000000000000000000000000000004B :10754000000000000000000000000000000000003B :10755000000000000000000000000000000000002B :10756000000000000000000000000000000000001B :10757000000000000000000000000000000000000B :1075800000000000000000000000000000000000FB -:10759000000000000000FFFF000F438202822CAFBA -:1075A0002CAF2220EEEF00000000000000000000E1 -:1075B00000002220EEEF00050F050505F303000093 +:1075900000000000000000000000000000000000EB +:1075A0000000000000004141C30055550055000097 +:1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB :1075D00000000000000000000000000000000000AB :1075E000000000000000000000000000000000009B :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A -:107610000000000000000000FFFF555FE3D7F7D730 -:1076200000002CAF2A28EAEB000000000000000058 -:10763000000000002A28EAEBF0F5FFF5F5F5F3036A -:10764000401100000004000200200100010420821B -:1076500000000000000400000000000400042004FA -:1076600020000000000000000100C0000141C080B7 -:1076700000034000C0032003C000000204022004F5 -:107680000003000000000004000000004000C000F3 -:107690002000200020000000C00000800202210025 -:1076A00020108800000088008800000888008800FA -:1076B00020002000200000008400880088002000B6 -:1076C000200000000002000010A00001080240029B -:1076D000050200000000000000000002000200841B -:1076E0001002000000000000000040000000100236 -:1076F0000040000000040000900000004000000076 -:107700000000000000000000000000004000000039 -:107710002100000090004000400200004040C000F6 -:107720000800000100000000000000004000000010 -:107730004000100000000000400200004040000235 -:107740000000000002000000020000000100001024 -:10775000020084000000000000000400000000009F -:107760000200000000000000040000000000C10052 -:107770000000C00000009000A00000000000000019 -:1077800000000000000000000000000000000000F9 -:1077900000000009000000090000000004020000D1 -:1077A00000000000081000000000000000000000C1 -:1077B0002000000000000800000000090000000098 -:1077C000200802100800040000000400040010005B -:1077D000040100000400000000000400000000009C -:1077E000000000000000040004000000000004008D -:1077F0000800000000000000000000004008000039 -:107800000400000004000000000000000000000070 -:1078100000002000000000000000000800008009B7 -:1078200000000000000080010000000000000000D7 -:107830000000000040000000000000880000020876 -:10784000050000000000000000000000020390009E -:107850000000000000000000000000000000000028 -:107860000000000000000000000000000000000018 -:1078700000000000001100000000000000000000F7 -:107880000000000000000000000000009000001058 -:1078900000000000000000000000000004000000E4 -:1078A00000000400000010000800000000000000BC -:1078B00000000000000800050000000000000000BB -:1078C0000000400090000000040040004100110052 -:1078D0004000000000000300009000880000000449 -:1078E0000000000000000000000000000000000098 -:1078F0000000000000000000080000000000000080 -:107900000000000000000000000000000000000077 +:10761000000000000000000000000000000000006A +:1076200000000000000000004141C30000000055C0 +:10763000000000000000000000000000000000004A +:10764000200020002004200420000000000082040C +:10765000100084001000040400002000100020002E +:10766000210021020500050004000400880002003A +:10767000200020044000200488002000880004002E +:107680000001C0004000200420042000200020044D +:10769000200488001000100040041000200020008A +:1076A00020002000200020022004200040002000B4 +:1076B0004000400040008400C00088008800200096 +:1076C000200000000000000010001000000020005A +:1076D0000000000000000000009000900000400248 +:1076E0000002020202040400020040024000404086 +:1076F000100040020002000200000000000221020F +:10770000000200000004200200C000004040000011 +:1077100040000002409040904090000000000000B7 +:1077200000022100400200020000400200000002AE +:1077300000000002080200400000200200020000D9 +:107740004002000200008400000000100000000061 +:10775000000002000000000008000000004000409F +:1077600000000200000000000010004000000000C7 +:1077700000000000004000000000020000000000C7 +:1077800002000010000002000000000000100000D5 +:1077900000000000020000000200000000000000E5 +:1077A00000000200020000000000000004000000D1 +:1077B00002000000020000000200000002000000C1 +:1077C00002000000000000000000000000000000B7 +:1077D0000000040004100000000000000008000287 +:1077E000000000000400000000000900000000008C +:1077F0000000020020080000000020000008000037 +:1078000000004000000000004000000000000000F8 +:10781000000000000400040800000000000005084B +:107820000000040000000400000000000000000050 +:10783000040000000000040800000000020000082E +:107840000000000004000000000000000000000034 +:10785000000000000000900800000000040000008C +:1078600000000000000000000000890000009000FF +:107870000000000000000000000000000000000008 +:1078800004000000000000000000000004000000F0 +:1078900010000400000000000000000000000000D4 +:1078A0000400000040000000000000000000000094 +:1078B00000001000000000000000000000000000B8 +:1078C00020004000400004000000000000200000F4 +:1078D0000000000010000400000000000000000094 +:1078E0000400000000000000000010000400000080 +:1078F0001000000000000000000000001000030065 +:107900000300400000000000000000000000000034 :107910000000000000000000000000000000000067 -:107920000800000008000010000080000904008426 -:1079300000000000030421004100210005000500B3 -:10794000050008C04000080003000000000400001B -:107950000000000000110000000000020000000014 -:1079600000000000004100000000000000000000D6 -:1079700000000000000000000000000000000008FF -:1079800000000000000000000000000000000800EF -:1079900000000000000000000000000000004000A7 -:1079A0000000C0000800080004200400840000005B -:1079B000000088000000820008000800820000002B -:1079C00000000000000900000000000083400000EB -:1079D0004100000000004090008800000285008403 -:1079E00000000000000000C000000000008800004F -:1079F000000000000000000000000900000000007E -:107A0000000800000000000000000000000000006E -:107A10000000000000000000000000000000100056 -:107A200080000000000000840000000000A00000B2 -:107A30000000000000001000000000000010000026 -:107A400000000000000000000004004000000200F0 -:107A50000000000082002000000000040000000080 -:107A600000410000000000080000000000000000CD -:107A70000000000000000000000000000000000006 +:10792000080000000000000000000000000000004F +:10793000100000000000000009000000000400002A +:107940000802000008002100000000000000000004 +:10795000000000000000000000000800000000001F +:1079600020000000000000000840000000000000AF +:1079700008000800080000000400000000000000EB +:1079800000000000000000000000000400000800EB +:1079900000000000000000000000000000000800DF +:1079A00000000000080008000000000000000000C7 +:1079B000000000008200820008001000080008009B +:1079C0004000000010000000C00082008210000093 +:1079D00000000000000000000000000000000000A7 +:1079E0000000000000000000000000000300000094 +:1079F0000000000000000000000000000000000087 +:107A0000000000000000000000000000080000006E +:107A10000000000000000000000000000000001056 +:107A20000000080000000008000000000000000046 +:107A30000000000000000000000000000000000046 +:107A40000000009000000000000000004100040061 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000100006 +:107A70000000A000000000800000000000000000E6 :107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 -:107AA0000400000000000000000000000040000092 -:107AB0000000000000000000A020000040000000C6 -:107AC0000000A00000000000000000000000000016 -:107AD000000009900900400005040088000000042F -:107AE0000090000000000000000000000000000006 -:107AF0000000000000000000000000000000000086 +:107A900000000000200000000000000000000000C6 +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000000000000C6 +:107AC000000000000000A000820000000000000094 +:107AD0000000000000000000000000001000000096 +:107AE000000000000000000000000400000004008E +:107AF0000000000000000000002000000000000066 :107B00000000000000000000000000000000000075 :107B10000000000000000000000000000000000065 -:107B20000000000000C0000200000900400000A0AA -:107B30000000050000000000000000000000000040 -:107B40000000000041202100030000004004110259 -:107B5000000000080000000000000000000000001D -:107B6000000000800000000000000009004100004B +:107B20000000000000000000000000000000000055 +:107B3000000000000000000000000000210000889C +:107B40000000058800000020000020000000000068 +:107B5000090000000000000000000000000000001C +:107B60000000000000000000000000000000100005 :107B70000000000000000000000000000000000005 -:107B80000000100000000041002100000000000083 +:107B800000000000000000000000000000000000F5 :107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000001000000D4 -:107BB00000000009910400004000000090008200D5 -:107BC0008808000000000000000000040000000021 -:107BD000400000000000000041884100000000005B -:107BE0000000000000020000000000020000000091 +:107BA00000000000000000000000000000000000D5 +:107BB0000000000000008200000000000000000043 +:107BC00000000400000000000800000000000000A9 +:107BD000080000000000000000000000000000009D +:107BE0000000000000000000000020000000000075 :107BF0000000000000000000000000000000000085 :107C00000000000000000000000000000000000074 -:107C10000000000000000000000000000000000064 -:107C2000000000000000000011C0000000000884F7 -:107C30000000040000A00800000000000000000098 -:107C400000000000000000000000004020000000D4 -:107C50000000008220000900000000000000000079 -:107C60000040009002900090000000000000000022 -:107C70000000000000000000000000000000000004 -:107C800001C100200084002100000000000000006D +:107C10000000080000000000000200000000110049 +:107C20004100000000000000000000000000000013 +:107C30000000000000000000000000000000000044 +:107C4000008800001100000000000000000000009B +:107C50000000000011000000000000000000000013 +:107C60000000000000000000000000000000000014 +:107C7000000000000000000000C0009000020000B2 +:107C800000000000000000000000000000000000F4 :107C900000000000000000000000000000000000E4 -:107CA0000000000000000000000000010100890049 -:107CB0000001C000000000001000000000000000F3 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 :107CC00000000000000000000000000000000000B4 -:107CD00000000808014010A0A0A000000000000063 -:107CE000000000000800800000000000000000000C -:107CF0000000000000000000000000000000000084 -:107D0000000004C1008900090010000000001000FC +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000800000008084 +:107D00000000000000000000000000000000000073 :107D10000000000000000000000000000000000063 -:107D200000000000000000000000000000104110F2 -:107D30004000001180000000000000000000000072 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 :107D40000000000000000000000000000000000033 -:107D500000000000080040808080008000000000DB -:107D60000000000041000311089041800000000065 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 :107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 +:107D80000000800000000000000000000000000073 :107D900000000000000000000000000000000000E3 -:107DA0000000000000000000000000000000400093 -:107DB000000084008000000080000000000000003F +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 :107DC00000000000000000000000000000000000B3 -:107DD0000000000000000000002100100000000072 -:107DE00000000000000000000100011001A00000E0 -:107DF0000000000000000000000000000000000083 -:107E000000000000000000000000000000C00000B2 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000000000000000000000093 +:107DF00000000000000000000000000000008800FB +:107E000090000000C0000000000000000000000022 :107E10000000000000000000000000000000000062 :107E20000000000000000000000000000000000052 -:107E300010000400080008202000100090009000AE +:107E30000000000000000000000000000000000042 :107E40000000000000000000000000000000000032 -:107E50000000000000000000000000880082000018 -:107E600000000000000000002000000000012001D0 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 :107E70000000000000000000000000000000000002 -:107E80000000000000000000C00000000000C00072 -:107E90000000000090000000000000000000000052 +:107E800000200090009002C00000000000000000F0 +:107E900000000000000000000000000000000000E2 :107EA00000000000000000000000000000000000D2 -:107EB00000000000000004010000008400880002AF -:107EC00000C00000000000000000000000000000F2 -:107ED000000000000000000000000083009000404F -:107EE00088C100000000000000000003002000081E -:107EF000000800000000000000000000000000007A -:107F00000000000000000000000000002000410010 -:107F100080000000000000000500000000000000DC +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000000000000000000000B2 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000808000000000000071 +:107F10000000000000000000000000000000000061 :107F20000000000000000000000000000000000051 -:107F30000000000000000041112100090000008045 -:107F400000000080000000000000000000000000B1 -:107F500000000000000000000000000000100021F0 -:107F6000008300100000000000000000004000211D -:107F70008000001000000000000000000000000071 -:107F800000000000000000000000000000400000B1 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F800000000000000400400000000000000000AD :107F900000000000000000000000000000000000E1 :107FA00000000000000000000000000000000000D1 -:107FB0000000000000000000000800000020000099 +:107FB00000000000000000000000000000000000C1 :107FC00000000000000000000000000000000000B1 -:107FD000000000000000000000000000000000049D -:107FE000000000000000000000000000000010C0C1 -:107FF000200182008200000000000000000000005C -:10800000000000000000000000000000000000016F +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:10800000000000000000000100000020000000004F :108010000000000000000000000000000000000060 :108020000000000000000000000000000000000050 -:10803000000000000000000000000001000400013A -:108040000000002000080000000000000000000008 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 :108050000000000000000000000000000000000020 -:108060001000A000200082000000000000000000BE -:108070000081000007000000000000000000000078 -:1080800000000000000000000000000000000000F0 -:108090000000000000000041840000E0000000003B +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:108080000000000000000000008100000700000068 +:1080900000000000000000000000000000000000E0 :1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000E00700D9 -:1080C000420000000000000041000000000000002D +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 :1080D00000000000000000000000000000000000A0 :1080E0000000000000000000000000000000000090 -:1080F000000028F800F00000000000000000000070 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F +:1080F0000000000000000000000000000000000080 +:108100000000000000000000000000000000000F60 +:108110000C0C000000000000000000000000000047 :10812000000000000000000000000000000000004F :10813000000000000000000000000000000000003F -:108140000000000000000000BCBCA0BC000000005B +:10814000000000000000000000000000000000002F :10815000000000000000000000000000000000001F -:10816000000000002828EBEB9E8A1C08000000009D -:1081700000000000AAFA82F20000000000000000E7 +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF :1081800000000000000000000000000000000000EF -:1081900000000000000000000000000000000000DF +:10819000000F0C0C000000000000000000000000B8 :1081A00000000000000000000000000000000000CF :1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000A0A0A0BC000013 +:1081C00000000000000000000000000000000000AF :1081D000000000000000000000000000000000009F -:1081E00000000000000030F330F3DFCB5D490000F9 -:1081F000000000000000000001000000000000007E -:10820000000000000000000000000000000000006E -:108210000000000000003E3C3D3C0000000000006B +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:108200000000000000000000000000000000005519 +:10821000000F3030F0F0000000000000000000000F :10822000000000000000000000000000000000004E :10823000000000000000000000000000000000003E -:10824000000000000F3F0F3F00000000AAAA5702E5 +:10824000000000000000000000000000000000002E :10825000000000000000000000000000000000001E -:108260000000000000000000F055F03C000000009D +:10826000000000000000000000000000000000000E :1082700000000000000000000000000000000000FE :1082800000000000000000000000000000000000EE -:1082900000000000000000000A00050000000000CF +:108290000055000F3030000000000000000000001A :1082A00000000000000000000000000000000000CE :1082B00000000000000000000000000000000000BE -:1082C000000000000000FFFF0F3F00000000000062 -:1082D0005702000000000000000000000000000045 -:1082E00000000000000000000000F055F03C00001D -:1082F0000000000000000000000000610026000DEA +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E :10830000000000000000000000000000000000006D -:108310000000000000000000000000615006000D99 -:10832000000000610007800D000000000000000058 +:1083100000000000202800400008000000000000CD +:10832000000000000000000000000000000000004D :10833000000000000000000000000000000000003D -:10834000000000000061000B000D00A00000000014 -:10835000009000010000000000000000000000008C -:108360000000000000000000000000000061300676 -:10837000000D0000000000000000000000000000F0 -:1083800028552D55000000000000000000000000EE +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED :1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD :1083B00000000000000000000000000000000000BD -:1083C0000000000000000000000000FF00F00000BE +:1083C00000000000000000000000000000000000AD :1083D000000000000000000000000000000000009D :1083E000000000000000000000000000000000008D -:1083F0000000F3F5F0FF00000000000000000000A6 -:10840000000028002D000000000000000000000017 +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C :10841000000000000000000000000000000000005C :10842000000000000000000000000000000000004C :10843000000000000000000000000000000000003C -:108440000000000000000000000000000055005087 +:10844000000000000000000000000000000000002C :10845000000000000000000000000000000000001C :10846000000000000000000000000000000000000C -:108470000000000030A0F00000000000000000003C -:1084800000000000F8F8F0FA000000000000000012 +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC :1084900000000000000000000000000000000000DC -:1084A0003D3D7D3C00000000000000000000000099 +:1084A00000000000000000000000000000000000CC :1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000FFFFFF00C3826A -:1084D000C382000000000000000000000000000057 +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C :1084E000000000000000000000000000000000008C :1084F000000000000000000000000000000000007C -:10850000000000000000282800AA00000000000071 +:10850000000000000000000000000000000000006B :10851000000000000000000000000000000000005B -:1085200000000505550000000000000000000000EC +:10852000000000000000000000000000000000004B :10853000000000000000000000000000000000003B -:10854000000000000000000000000000FF3CFF3CB5 -:10855000C382C38200000000000000000000000091 +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B :10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000200F9 -:108580000080400000000000000000C0000000006B -:10859000000040800000000020002000C00000001B -:1085A0000000C00000000000A0000000200000004B -:1085B0000000200040000000200021000003208077 -:1085C0002100A00021000000000020040084000021 -:1085D00001004002C0802000000000000000208058 -:1085E000000020804002000000000000840088009D -:1085F000001040002080A0020080000004004040E5 -:108600000000000280040000000240001010100270 -:1086100000000000801000000000100000001002A8 -:1086200040000002000000024002404000008000C4 -:10863000000000000000000040004000200000009A -:1086400040089000000090000000000200000002BE -:1086500000004000800100080000000000024140CE -:10866000100840200002800140004000000000008F -:10867000000000200000100240020008400010002E -:1086800005000000000000800000000082000000E3 -:108690000040004004000200000000000400000050 -:1086A0000000000000200000000000002180218068 -:1086B00000000000000000000000010000100000A9 -:1086C0000000100010002010000400000000010055 -:1086D000A11000000000000020000120014000A0C7 -:1086E0000400000000000010401000000000000026 -:1086F00000100240100908100010020002100000D3 -:1087000040001000210000000502020000000000EF -:108710004000000000000200040000000000000013 -:108720000000000004040400000004000400A00491 -:10873000A004040800080508000000001000000064 -:108740004000000080008000800020010000000048 -:108750004000400800080084008880000409028569 -:108760000041820000000000400084000000000082 -:108770000000008480088000008300000010008258 -:10878000008889C09000C041C0098803840090001F -:108790004008400000000008001100000000000038 -:1087A0000040000000000000000000000021000068 -:1087B00002000400000000000000000000080000AB -:1087C0000000000000000000002101000021100056 -:1087D0000000000501410000884000059120900044 -:1087E0000020000000080200001000080000000047 -:1087F00000080000000000008200C000000500002A -:108800000200A0000010030009000400080000009E -:1088100000000008000000080008000000C0000080 -:108820000000000000000000080000000800000038 -:10883000000009000000110000000000000000829C -:1088400000080082008200000000000020000000FC -:108850000000000000004000400000014100041141 -:10886000001000090000000000000000008200006D -:108870004100210003000000000000000000030090 -:108880000000000000000000844084404004110407 -:1088900084000100000500088402000000000002BE -:1088A00000000100010001000000000000030000C2 -:1088B0000000000020002008020000050000020067 -:1088C0000200000082008200000082000000100010 -:1088D000820000000000820001000800C021C0C129 -:1088E000C000000900210800088082000800000084 -:1088F000820800000010044004401000000900003D -:1089000000400000C000A0000200000100010000C3 -:10891000400000900800000020000000000000005F -:1089200000820000080008000800000000000000AD -:1089300000000000000080008000800000000000B7 -:10894000800080080000000000000000000000001F -:1089500080000000020000A0030020000000009042 -:1089600000020000000000000000002000000000E5 -:1089700010000000000000000000000000000000E7 -:108980000000000000000088000000009000400887 -:10899000400340804000001108081008000000005B -:1089A0009011900000200000001100000000000065 -:1089B0000000000000000041000000000000400036 -:1089C0000211000000000008020002000000000484 -:1089D000000440080008A00000008200824100005E -:1089E00000000008010000000200A00800030000D1 -:1089F000C00000410000000000058200820000006D -:108A000000000800000008800000000000000900CD -:108A100000000004100241020804888400080000DD -:108A200000880000090000000000000000000000B5 -:108A300000000000000000000000400000000000F6 -:108A40004000800000000000000180008000000065 -:108A5000000100050001000100000000000000000E -:108A60000000000003A0201000008900030000089F -:108A700000000000000008000000000000000000EE -:108A8000000000000000000040020002030003009C -:108A90008441000088001005840000008205000861 -:108AA00082008280A0080004000000000000000096 -:108AB00000000000000300050000000000000008A6 -:108AC0000000020000000000C000020800000004D6 -:108AD0000000200000000021000000000000000550 -:108AE000404184000000080900000000000000046C -:108AF0000000000020000000000000000005000051 -:108B00000000040000040800000000000000000055 -:108B10000004000000000000004000000000000809 -:108B20001000000000100000000000000000000025 +:108570000000000000000000000000008800000073 +:10858000200000040000000020040404100020006B +:1085900004002000C000040004000000C00000002F +:1085A00020008400000000002000202020000000A7 +:1085B00020002000040020802005C00000032000CF +:1085C00004001000840004808880010020824000A4 +:1085D00000002080208020004000880440040480A7 +:1085E0002180C020C120210005004004210440005A +:1085F00000002000890040004000C0002000400032 +:1086000000040000400000000000000000204000C6 +:108610004002404000000090000200020090000074 +:10862000400040400000400000000000000000004A +:1086300000401000000200020004000200020000DE +:108640004090100040002000402004200202004022 +:10865000004000824002401000822002000100031E +:10866000092002202041020104040404090002023E +:1086700000024000009010020902000240001002B7 +:1086800002000000000000000000020002100210C2 +:108690000200000000000000C000000000100010F8 +:1086A0000000000020100010000800000010001062 +:1086B00000000000000002000000000000000000B8 +:1086C00000000002000000100010008810040004E8 +:1086D0000085000000000010000002000200000001 +:1086E00000000200020000100110038203A003201A +:1086F000044000000200000002000300020000002D +:108700000100000000000400000000000000040060 +:1087100000000000000000000082040000000000D3 +:108720000000000000000000000000000000000049 +:10873000000800000000000004000000000000002D +:108740000000000000010000000000000004000123 +:108750000001000400000000000009000000050006 +:10876000200000000900000000004000024102411A +:1087700084018001040000000400000020000400C7 +:1087800002001000000000000000000000000000D7 +:108790000000000000000000400000000000000099 +:1087A00000000000840000000400000084000000BD +:1087B0000000000000000000000000002000000099 +:1087C0002000010000000000000000000000008008 +:1087D00000008809000000000400400000000000C4 +:1087E0000000000000211000000000000000002038 +:1087F00008000000880840000000001188004000C8 +:108800008800C100004100000000000000000000DE +:108810000000000000000000000000000000400018 +:108820000000000040000000000000000000000008 +:1088300000000000000000000000000000009000A8 +:108840000000800020000000000000000000000088 +:108850000004000000000000000000000000000014 +:108860000000000000000000000000000000050003 +:1088700000010000000010000000000000000000E7 +:108880000800000010900000000000000000000040 +:10889000004000000000000000000009000000008F +:1088A00020000000000000000800000000000000A0 +:1088B000820000000000000000000800000000002E +:1088C00082009000C000C000000000000000000016 +:1088D000C0008200010008008400080500000000BC +:1088E000000000000000100008000000020000006E +:1088F0000840100000000400820008204000000032 +:10890000080010000900080082200000000000009C +:10891000000000000000000000080000000000004F +:108920000000200400000000000000000000000023 +:108930002100000000000000000000000000000016 +:108940000000030000001000100000000000000004 +:1089500021000000030020000000000000000000D3 +:108960000000000000000000000000000000800087 +:1089700000000000000000C00084000021A1800071 +:108980000000000080002000000002000000000045 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B000000000000000000000000000A000000017 +:1089C0000000080008000000000000000000000097 +:1089D0000000080000008200C0000000000000004D +:1089E00000000020000000020000000082000800DB +:1089F000000000208400008000040488A021000002 +:108A00000003400410040005010020008400000061 +:108A10000000000000000000000000000020000036 +:108A200000000000000000880000000000001000AE +:108A30000500000000200000000000000000000011 +:108A400000000000800000000000000000000000A6 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A700000000000000000000002100100090000DA +:108A80000000000000010001000010008000000054 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000800BE +:108AB0000000000000000000840000000000000032 +:108AC0000000000000000000000000001000000096 +:108AD000000008008200000000000000000000000C +:108AE00000000000000000000000822101000000E2 +:108AF0000000000000000000020020000000C00094 +:108B00000004A004C00400080000000000090000E8 +:108B10002000000000000000000000000000000035 +:108B20000000000000000000000000000000000045 :108B30000000000000000000000000000000000035 -:108B4000000000008000100000000000800000080D -:108B50000001000080000000000000000000000094 -:108B60000300800000000000C100080011000000A8 -:108B700000000008000000000000000000000000ED -:108B8000080000000000204000000000000000007D -:108B900000002000C02000A0908890104010080223 -:108BA0000082080240100188A08808020910000213 -:108BB0000002088800000000000000000000000023 -:108BC0000000000000C008000100000200C000001A -:108BD00008000000000001C10000100000000000BB -:108BE000010088000000100000000000A0000090BC -:108BF000908200A090820000000020000000000091 -:108C0000000000000000040001000000000000005F -:108C10000000840100008800110000000080800036 -:108C20000080008000808080100080000080108024 -:108C30000080008000000000000000000000000034 -:108C4000000020000000008080000300000003807E -:108C5000100082000000000009C121030910000972 -:108C6000000003000000000080000000020000007F -:108C700000008080000080800000400000000000B4 -:108C800000000000000000000000040000000000E0 -:108C900008052021804000401000C1A00982410049 -:108CA00000000002808800808000004000A00000DA -:108CB000000000058080008000000000000000002F -:108CC0000000000000100000001100000000800003 -:108CD0000000800000008000000041009100108929 -:108CE000C102100041000811410008000300830088 -:108CF0009004000000118080808040000900050081 -:108D000041800000000000000000000000000000A2 -:108D1000000000000000000000008800208208C061 -:108D200003820800080502042008040008048802E1 -:108D30009084400090020440900800000000000071 -:108D40000000000000000001000000000000000022 -:108D5000C000000010000000C000000000028800F9 -:108D60000091C10000000000000101404002C0006D -:108D70000800C000900008018484C0900100000039 -:108D8000010001A000000000000000000000000041 -:108D9000000000000000000000000084A00300119B -:108DA00000082010892000208440902089040020A1 -:108DB0008405089189400090080408900000000094 -:108DC00000000000000000000000010000000002A0 -:108DD000000000C000000000001110C10001880068 -:108DE0000001028401C10000000000000100001029 -:108DF00000880088008840900020909002020000C7 -:108E0000000100000001000000000000000000025E -:108E1000000000C000C10000010100000001058841 -:108E20000010004020114100008000000500418337 -:108E30000091009040404100000080800000000050 -:108E4000000000000000000000000000080000001A -:108E500000000000008000030005008582C10001C1 -:108E600080110309028211C1000800210040031093 -:108E70000080008000000500850000008080808068 -:108E8000002000100040000800000000000000006A -:108E900000840003004100C1000341204004004160 -:108EA00000208084001180048008801000000000F1 -:108EB00000088040000000008008802000000000C2 +:108B400000000000000000000000000000008000A5 +:108B50000000000000000000000000C00000000055 +:108B600000000000000000000000410003002000A1 +:108B70000500000000000000000080000000000070 +:108B800000000001000100010000000000000000E2 +:108B90000000800000000000000000000000000055 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC00000000000000000000000000000010000A4 +:108BD000000100000000000000010001000100C0D1 +:108BE00000040190000400000000000000000000EC +:108BF00000000100000010C000000000082089C132 +:108C0000C08501909082000040000000000000013B +:108C10000000000000010000000000000000000053 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C400000000000000000000000000000004041A3 +:108C50000008080800000000000800400020000490 +:108C60004080008010800000000000000000000034 +:108C70004000000010000000808000000000110093 +:108C800091C18088058380830000000011000000EE +:108C90000041032020000010000000000000000040 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000100000000000000000000084 +:108CE000000000050005008400009100C10090080C +:108CF000100000000000000800008000000080005C +:108D000080000011801180C08080004100000003BD +:108D100000100000080040004100000000000000BA +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D400000000000000000000000400000000000E3 +:108D50000000000000000000000000000000000013 +:108D6000000000000000000000C100000200400000 +:108D70001000410000000000000000001000200072 +:108D80008400C020900010018841C0100011000034 +:108D900000010001002000000000010000000000B0 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD00000000000000041008800010000000000C9 +:108DE00000000100000088004000000002000000B8 +:108DF0000000000000000000900000000100404062 +:108E00000020900288204008A084900888C00000BC +:108E10000000000000000000000000000001000051 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000880080000800000002 +:108E60000000210005000400000000000000400098 +:108E700000000000000000000000000000001000E2 +:108E800011800003000000008080008080808280CC +:108E9000200000000000200000080500000800413C +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 :108EC00000000000000000000000000000000000A2 -:108ED000000800000080800080008000000000008A -:108EE0000001C185051003004009000900210000B0 -:108EF00000104110022021001102000080A080001B -:108F0000000000000000000000020000000000005F -:108F10000000002000000000000000000000000031 -:108F200000001005200288908400040082080208D6 -:108F3000200020008220200888000400200820084B -:108F400040000000000000000000000000000000E1 -:108F500000000000000000100800C0001000000029 -:108F600000000001C140000001000001009100006C -:108F700000000001011100C10140000100008888CB -:108F80009020000000100000000000000000000021 -:108F900000000000000100000000000000000000D0 -:108FA0000000000000000000070060210000000039 -:108FB0000700480000000000070048000000000013 -:108FC000070048000000000000000000000000E072 -:108FD00000000000810000E000000000880000E0C8 -:108FE000000000000000810000E0000000006000C0 -:108FF00000E000000000818100E0070000000000A8 -:109000000000070000000000000000000000000059 -:109010000000000000000000000000000000000050 -:1090200000000000500000000000000000000000F0 +:108ED0000000000000000000000000000000000092 +:108EE00000000004000000000000800000400000BE +:108EF00080000000001100000003000000000000DE +:108F0000000000050008000000808004808480804C +:108F1000800041051009050000004105080010000F +:108F20000040000000000000000000000000000001 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F6000000000000001000000000000C0008800B8 +:108F7000A000900000900010008800010000000098 +:108F8000000000000000009000900008C001880868 +:108F900008081000010001000000000001000100AD +:108FA00001000000000000000000000000000000C0 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD000000000000000000000000000880000E029 +:108FE00000000000000000000000000000008800F9 +:108FF00000E0070000820000000000000000880080 +:1090000000E00000000000810000070000008181F6 +:1090100000E007004200818100E00700600081005D +:1090200000E0000000000000000000000000000060 :109030000000000000000000000000000000000030 :109040000000000000000000000000000000000020 -:109050000000000000003C3C3C3CF0F00000FF0041 -:109060000000FF000000000066660000FF00000036 -:10907000000000000000000000000000000FC39985 -:109080006000600030F3F3300000000000000000DA -:1090900000000000000000000000000024243C004C +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:10907000FF00666600000000000000000000000025 +:10908000000000000000000000000000FF008F8FC3 +:10909000F6F6FC0C66F0FF3C00000000000000004B :1090A00000000000000000000000000000000000C0 :1090B00000000000000000000000000000000000B0 :1090C00000000000000000000000000000000000A0 -:1090D00000000000000000003C3C3C3CF0F00000C0 -:1090E000FF000000FF000000000066660000FF00B7 -:1090F0000000000000000000000000000000FF0F62 -:10910000C39900000000F330F330000000000000BD -:109110000000000000000000000000000000242407 -:109120003C00000000000000000002102000008849 -:109130001004021020000088108402102000008813 -:10914000108402102000008810840000000000003D +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000F0F03C3C0000000000000000000018 +:109100000000000000000000000000000000FF0060 +:1091100000000606FC0C66F0003C000000000000A9 +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F :10915000000000000000000000000000000000000F :1091600000000000000000000000000000000000FF :1091700000000000000000000000000000000000EF @@ -100660,1296 +100660,1296 @@ :1091A00000000000000000000000000000000000BF :1091B00000000000000000000000000000000000AF :1091C000000000000000000000000000000000009F -:1091D00000000000000000000000000000003C3C17 -:1091E0000000FFFF0000666600000F0F0000000097 -:1091F000FFFFFFFFF0F00000000000000000000093 -:109200000000101890993C5A0F0FBDBD4E8D000004 -:10921000000000000000000000000000000000004E +:1091D000000000000000000000000000000000008F +:1091E000C3C3C3C300000000000000000000000073 +:1091F0000000000000000F3CFF66000000000000BF +:1092000000000000000000000000000000003C3CE6 +:10921000BDBD00FF38FF3F3F24E73C3C00FF00009E :10922000000000000000000000000000000000003E :10923000000000000000000000000000000000002E :10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E -:109260003C3C000000000000666600000F0F00009C -:1092700000000000FFFFF0F0000000000000000010 -:1092800000000000101800003C3C0F0F81814E8D43 -:1092900000000000000000000000000000000000CE +:109260000000C3C3C3C300000000000000000000F2 +:1092700000000000000000000F3C0066000000003D +:10928000000000000F3F6F7F0000000000000000A2 +:109290000000818100003800030324E70F0F666699 :1092A00000000000000000000000000000000000BE -:1092B00000610006001D0001000000000000000029 -:1092C00000610006000D000000000000000000002A -:1092D000000000000000000000610007000D000019 -:1092E00040638007802D920240E38007802892022D -:1092F000000040828001802082020061000680051B -:1093000000000061002F800D20088500000800008B -:10931000000800610006000D0000000000000000D1 -:10932000000000610006009D000000610006000DC5 -:10933000000000000000AAAA0000000000000000D9 -:10934000000000000000AA00AAFF000000000000CA +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000000000000000000000000000008E +:1092E000000000000000000000610003800D00008D +:1092F000000000610006000D00001061200F800DCD +:10930000000000610006000D000000610007800DF4 +:1093100000000561502E000D00051061202F804DCA +:1093200000080541002D800D0000000000018000B4 +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D :10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD -:10937000000000003030F000405041550000000077 -:10938000AA00AA003D3D3D050000000000000000CD -:109390000000000000000000F000F00000000000ED -:1093A0000000000000000000FCFCF0FC00000000D9 -:1093B00028F82828000000000C0C00FF0000000026 -:1093C0000000000000000000F03CF03C0000000045 +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000F0F0F0F0000000091 +:1093A000000000000F0F05F500000000F000505015 +:1093B000C3C300C300000000000000000000000064 +:1093C000000000000000000000000000000000009D :1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D -:1093F000F0A03C2800002020A00040500000000009 -:10940000000000F0C3F005053D050000000000006D -:109410000000000000000000000000AAC3AA000035 -:1094200000000000000000000000F0F0F0FC000070 -:109430000000282828F800000000BCBC3CBE00004A +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000F0F0F0F000010 +:10942000000000000000000005F500000000F00052 +:109430005050000000C300000000000000000000C9 :10944000000000000000000000000000000000001C :10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC -:109470000000000000000000F0005050AA003C0076 -:10948000000000003CFFF0AA00000000030AF30AFD -:10949000000000000000000000000000F0FA3CBEE8 -:1094A00000000000000000000000000000000000BC -:1094B0005555FF000000000000000000A0A000AA19 +:1094600000000000000000000000000000000505F2 +:109470005500000000000000FF000F0F000000007A +:109480000000000000000000000000003C3F3E3FE4 +:1094900000000000000000000000000000000000CC +:1094A0000F000C0C00000000000000000000000095 +:1094B000C3004141000F0A0A000000000000000044 :1094C000000000000000000000000000000000009C :1094D000000000000000000000000000000000008C :1094E000000000000000000000000000000000007C -:1094F00000000000000000000000C00040400A0022 -:109500000C00000000003C00F0AA00000000000A6F -:10951000F00A00000000000000000000000000AAA7 -:1095200000AA000000000000000000000000000091 -:1095300000005F507D41000000004000008084007A -:1095400040830004000004042040000000400004A8 -:109550004000000000000004400040000000200423 -:10956000400000000004200420048800C000000027 -:10957000880000000000000000000003000000025E -:10958000200004004000200020000404200000000F -:1095900084048800A100C0000000400010004000CA -:1095A00020002000100001102000200020000100F9 -:1095B0004000208020002000000020000000000863 -:1095C0000000000200000000004000000000000059 -:1095D0000000800000020000000021908000400098 -:1095E00000000900000040020040000000040004E8 -:1095F00000000000400040000000080000000004DF -:10960000400040000000410090C021000090000098 -:1096100000000000100002000000400000000000F8 -:1096200000001000000020000200000000400000C8 -:10963000100200000002090000000000000000000D -:109640000100200000000000000000008400000075 -:1096500000000400000040000000000000000000C6 -:1096600000000400000000000000000000000000F6 -:1096700000000000000000000000001000000000DA -:109680004003200300004010000004000009000413 -:1096900000000000000000000000000008000400BE -:1096A0000000000000100000000008000010010091 -:1096B0000000000000000010000000000000821008 -:1096C00000002000C00004080000000000000400AA -:1096D00004000000000004008400040000000408EE -:1096E00000004104020820040000000000000900FE -:1096F0000400040000840004040004000008008446 -:1097000000008000C0880082C0000000000000004F -:109710000001400020000000000000000000800464 -:10972000C100000000000000000000042000000054 -:109730000800000000000000030000000088000096 -:109740000200C0009000100088008800040004039C -:109750008200004000000008844000000000000873 -:1097600000000000000800000000000000000000F1 -:1097700000000000000000210000000000000000C8 -:1097800000000000000000000021000000000000B8 -:109790001000001000000000001101414000000016 -:1097A0000000C00000001000000000000011A00533 -:1097B0000000000000000000000000000800080099 -:1097C00000000000410000900084098441044090A2 -:1097D000400009C0002000881100050021000000A1 -:1097E0000000040000000000400000000000000035 -:1097F0000000000000000000000000000000000069 -:109800000000000000000010000000000000040044 -:1098100000C0000008840000110003004020052063 -:109820000000412000000000000000000000008453 -:1098300000000000000000004100000000000000E7 -:10984000000000A000000000000011400000000423 -:109850000040000020040000000000080800000094 -:1098600000001000820008000000002140000000FD -:109870000000820000000000000000000000000066 -:10988000000082000821000000080041400008009C -:10989000040000002041A00010000800000000802B -:1098A00000000000840000400000000000000000F4 -:1098B000840000000000004000090000A00000003B -:1098C0000005000000000000090000004000410009 -:1098D00000000400110000900000000000000000E3 -:1098E0000000000041000000000000004100800076 -:1098F000008400000000000000C000880000080094 -:1099000000000000000000000000000100008000D6 -:1099100000A0800011008000000080000000000016 -:109920000002009000A00000058500000300100068 -:10993000000000001100400000000200000008903C -:10994000000000840000040000000004C0000000CB -:10995000000000000000000000050000002182005F -:10996000840000000000000008000020002000002B -:1099700000000000000000000000000000000000E7 -:109980000000000000008200000000000000C00095 -:109990000002880020002000882000804040000055 -:1099A0004000C00000004008001100110000A000AD -:1099B0000000000000000000820000000000000025 -:1099C0000000000000000800000000001100050871 -:1099D000050041900000218840000000059005042A -:1099E00003040004400400042100080000000000FB -:1099F000000000000020090000000000000000003E -:109A00000500000000000000000000000000000051 -:109A1000000000010000A10080000001000490048B -:109A2000000000000804030000000000030003041D -:109A30000000000000000000000000000000000026 -:109A400000000000000000000000000000000041D5 -:109A5000C00000080000000000000021000210000B -:109A6000000082000008000000000000000000006C -:109A700000000000000000000000000000000041A5 +:1094F000050555000000000000003C3C55550000EB +:1095000000000000000000000000000000003C3CE3 +:109510003E3E0000000000000000000000000000CF +:1095200000000F000C0C0000000000000000000014 +:109530000000C3004141000F0A0A2000000020047F +:10954000200820008800200000008800000020047F +:10955000210400000000200000042000A0002000E2 +:10956000208220002000200084002000400204000F +:10957000200088000000040004000003050005022C +:109580000580A188000000000400A0000420400025 +:1095900020042004208041002104210440004000D8 +:1095A000410020044000000020000000880020004E +:1095B000A00088040000200020002011000000000E +:1095C0000000000000001000210221004000000007 +:1095D0000000200840004000C04010C04000409003 +:1095E00040000020000000020900000240001004BA +:1095F0000082210240004002400200400000824000 +:109600008240044004400000000000020090400539 +:10961000000209024002C0082004100020022000BD +:109620002002400240020000000040000002408290 +:109630000000400000402002000240020002000042 +:109640000000000004000000000000000000000016 +:1096500000002010001000000000040004000410AE +:109660000400002000200000000020000010020084 +:109670000000000020100000000000008200000038 +:109680000000000020000000201100000000000089 +:1096900000000000020000000000000004000200C2 +:1096A0000000000202091180020002000000040014 +:1096B00000000000020000000040020008400440DA +:1096C00000080000000800000482000040000000C4 +:1096D0000000000000080002000000000200020478 +:1096E0008002800000050005000000040000040066 +:1096F00000000000200840040000000000000200FC +:109700000000000000000000000000000000000059 +:109710004000000000000084000000000000020083 +:10972000040009000001000090080000040002008D +:109730000000000000000000200004010000020101 +:109740000009000000000000000000000008000008 +:109750000000000000000000000040004000000089 +:1097600000000000000000000000000000000000F9 +:1097700000000000000000000000400000000800A1 +:1097800000000000000000000000000000000000D9 +:1097900000000000000004000500040000001000AC +:1097A0000100100800000000000800000041000057 +:1097B0000000000000000400000000004000100055 +:1097C0000021000000000000000000000000000078 +:1097D0000000000008000000000000000400040079 +:1097E0000000002004000000000000000000000055 +:1097F0000000000000000000000004000000000065 +:1098000000000000000000000088000008000000C8 +:1098100000000000000000008000880080000000C0 +:10982000C08420008500002000000000000003002C +:1098300000000000090008004000080008200000A7 +:1098400000000200000010000000000000000010F6 +:109850000000000000000041000084000000000043 +:109860000000088000000402044000000000100016 +:10987000C000000000008200820004200000000000 +:10988000000000000000000000020800840010003A +:10989000A0000800082008000802000000000000E6 +:1098A0009021000000008200A0000002004104009E +:1098B000000000000000000000000000C0000000E8 +:1098C00040020000A00000040000000000000000B2 +:1098D000000005000500000000000000000000007E +:1098E000000000000804000080008000000010005C +:1098F0000000000041000000000000000000000027 +:10990000000000000000000000000900000000004E +:1099100000001000000000200000400000000800CF +:1099200000000800000021000000000041C100000C +:10993000000000000000410000000500028400005B +:1099400000000008000800080000000000000000FF +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000400F3 +:1099700004000000000000000000000000000000E3 +:109980000000000082000000000000000000000055 +:10999000000000000000900000000000040008002B +:1099A0008200820082210000820004000000040086 +:1099B0000000A000400000000000080000000000BF +:1099C0000000000000000000000420000000000073 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000020000000000000000057 +:1099F00080000000000000000000000000000000E7 +:109A00000000000000020000000400400000000010 +:109A100000000000000000001084008400A021006D +:109A200000002100009040004100400000000004C0 +:109A300020000800000000000000040403000000F3 +:109A40002100040000000900000010058000000053 +:109A50000000000000000000000000000000000006 +:109A600000008400008000000000000008000000EA +:109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 -:109A900008000000000040000008010000800400F1 -:109AA000000000000100008200000400000000002F -:109AB0000000100000000040020000001000100034 -:109AC00000080041000500000000004100090000FE -:109AD000000041000000000041000000030003906E -:109AE0000000000000000500210441000000080003 -:109AF000000000020000000000000500100005004A -:109B00000000000400000000000000000000000051 -:109B1000000000000000000080000000040003209E -:109B200083000000000010820040000020000300BD -:109B300011004100000000000000000000000000D3 -:109B4000100000000500090021000000000000884E -:109B500000080000A0000401000000000000000058 -:109B6000000000000100C000000000000001000132 -:109B700000010001000020000001000000000000C2 +:109A9000080000000800000008000000A00000000E +:109AA0004080010208A100808400820900001000AB +:109AB000000000020000000000001000000800008C +:109AC000000000000800000000001040000000003E +:109AD00000000000000000C0000000100000004076 +:109AE00000C00000000000040000000000040000AE +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000243 +:109B20000000000420821104000400000000000076 +:109B3000110000000001000000000000000800A06B +:109B4000000800080000080841080000800100002B +:109B500000A0000000000000000000000000000065 +:109B600000000000000000000000000000000000F5 +:109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 -:109B9000000000000000000002000000100390918F -:109BA00090218240010101888290000840900000CD -:109BB000009008900000000000000000000000007D -:109BC000000000000000000008000000000000008D -:109BD000000000000002911083110002000000004C -:109BE0000000000000000200000000000020001043 -:109BF00000080008001020200010000200000000F3 +:109B90000000000000C000200008909000000000BD +:109BA0000000000011002000000000000001000182 +:109BB000020000010000010084000000000000001D +:109BC00000000000000000000000000011C00000C4 +:109BD00000000088000000000000000000000000FD +:109BE0000000000000000000200000000000000055 +:109BF0000500000000000000000000000000000060 :109C00000000000000000000000000000000000054 -:109C100000000000000011100810411000028091A7 -:109C200080838308804011412021002000108000A3 -:109C300000000000800000000000000000000000A4 -:109C40000000000000000000030080000000000091 -:109C500000000000000008000300030210200000C4 +:109C100000000000000000800000000000000000C4 +:109C20000000000000000900800011000000004159 +:109C300000108500000840001000800000000000B7 +:109C40000000000000000000000000000000828012 +:109C5000000005000080000000000000000000007F :109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000000E4 +:109C7000000000080000000000000000008000005C :109C800000000000000000000000000000000000D4 -:109C9000000000000000000040001000100041A182 -:109CA0008080C1101111408002004100201141004C -:109CB0000000000000028000000000000000000022 -:109CC0008000000000008000000000000000000094 -:109CD00000000000000000000084010001010002FB +:109C90000000000000000000800000400000800084 +:109CA00000000000000000000003000000410080F0 +:109CB000030010000000410041002100090808A134 +:109CC0000000000000000000000000000000000094 +:109CD000098000000809C100000000000000000029 :109CE0000000000000000000000000000000000074 -:109CF0000000000000000000000000000000000064 +:109CF0000000000000000000000000080000000458 :109D00000000000000000000000000000000000053 -:109D10000000000000000000000001C00100010080 -:109D200001A110908201400140900100001000014B -:109D30000100880002100000C000000000000000C8 -:109D400000000200A0004000C00000000000000071 -:109D5000000000000000000000000000C000000043 -:109D600000010000000000000000000000000000F2 -:109D700000010000000000000000000001010101DE -:109D800000010000000000000000000000000000D2 -:109D900000000000000000000000000000000000C3 -:109DA00000000000900000404085000900004101D3 -:109DB0008901110000C000200020A0C000000000A8 +:109D1000000000000000000000000200400100827E +:109D2000C0000000000000000000000000880000EB +:109D3000008200000100000001000000010000009E +:109D4000008900000000000000000000000000008A +:109D50000000014000000101C100000000000000FF +:109D600000000000000000000000000000000000F3 +:109D70000100000000000000000000000000900052 +:109D800000000000000000000000000000000000D3 +:109D9000000000000000000000000000C0400000C3 +:109DA000009083C000000000000000000100084097 +:109DB000009001C00000000100000001000100004F :109DC0000000000000000000000000000000000093 -:109DD00000010001000000000000000000009000F1 -:109DE00008090041000000000000000000200020E1 -:109DF00000200002000011001100000000101010EF -:109E0000050220100000000000000000000000001B -:109E10000000000000000000000000000000000939 -:109E2000040841080008802041C10085401100114C -:109E30009110882183050000000000008080000050 -:109E4000000000000000000000000000000000050D -:109E5000000900100041000000000000000008821E -:109E60000800410010080000000000000000000091 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 +:109DD0000000000000000001000000C100000000C1 +:109DE0000000000000000000000000000000000073 +:109DF0000000100000000000000000002000000033 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000010800000000000000000100092 +:109E30008000000008800000001003200041001096 +:109E40000005000300050000000000000000000005 +:109E500000000000000000110008000900C100001F +:109E600000000000000000000000000000000004EE +:109E700000000000000000000000000000000002E0 +:109E80000040000000000000000000000000000092 :109E900000000000000000000000000000000000C2 -:109EA00010891100410010418880C1034000030364 -:109EB00000890021000000110000000000000000E7 -:109EC0000000000000000000000000800080000092 -:109ED0000000000000000000000000000000000082 -:109EE00001A10000000000010000000000000000CF +:109EA0008002804000000000000000000000000070 +:109EB00000020040000000004105080010002000E2 +:109EC00041800300100003030000000000000000B8 +:109ED000000000000000000041098809008009031B +:109EE0000000000000000000000000000000000072 :109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 +:109F00000001000000000000000000000000000050 :109F10000000000000000000000000000000000041 -:109F2000000000890100000000019140400840004D -:109F3000900000C1000000000001000000880088BF -:109F40000000000000000000000000000008000801 -:109F50000000000000000000000000000000000001 -:109F60000000000000E000004100000000000000D0 -:109F700000000000000000000000000000000000E1 -:109F800000000000000000000000000000000000D1 +:109F20000000C00182008890900000000000000046 +:109F300000000001000000000000012001000100FD +:109F4000000001020000010000000000000000000D +:109F5000000000000000000000000101910100402D +:109F600001010000000000000000000000000000EF +:109F70000000810000E000000000000000E00000A0 +:109F80000000008100000700000000000000000049 :109F900000000000000000000000000000000000C1 -:109FA00000000000000000E000000041000000E0B0 -:109FB00007000000600000E0000050000006000004 -:109FC000070000000000000000000000000000008A -:109FD0000000000000000000000000000000000081 +:109FA00000000000008184000700000000000000A5 +:109FB00000000000818100E007000000810000E057 +:109FC00000000000880000E0000000000000000029 +:109FD000000000000000000000000000880000E019 :109FE0000000000000000000000000000000000071 :109FF0000000000000000000000000000000000061 :10A000000000000000000000000000000000000050 :10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000F0C37D -:10A03000FFC3FAFF0A0F000000000000000000004C -:10A04000000030BABA30000000000000000000003C -:10A050000000000000000000000000000000000000 -:10A0600000000000000000000000000000000000F0 +:10A020000000000000003CFFAA000000000000004B +:10A030000000000000000000000000AAA0A0000036 +:10A040000000000000000000000000000000000010 +:10A05000000000000000000000000000000000FF01 +:10A0600000FF0000AAAA000000000000000000009D :10A0700000000000000000000000000000000000E0 :10A0800000000000000000000000000000000000D0 :10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000C30FC3FAF00A00000000000000000017 -:10A0C00000000000303030300000000000000000D0 +:10A0A0000000000000000000F0FFAA0000FF3C3CA0 +:10A0B00000000000000000000000000000AAA0A0B6 +:10A0C0000000000000000000000000000000000090 :10A0D0000000000000000000000000000000000080 -:10A0E0000000000000000000000000000000000070 +:10A0E00000FF00FF0000AAAA00000000000000001E :10A0F0000000000000000000000000000000000060 :10A10000000000000000000000000000000000004F :10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A130000000F0F0FF3C553C550F41034103000087 -:10A14000000000005C5C00003333000000000000F1 -:10A150000000000000000F1F1F0F000000000000A3 -:10A1600000000000000000000000000000000000EF +:10A1200000000000000000000000C3003F3F0000EE +:10A13000000000000000000000000000000000001F +:10A14000000000000000000000000000000000000F +:10A1500000000000000000000000000000000000FF +:10A1600000003C3C0000FFFF000000000000000079 :10A1700000000000000000000000000000000000DF :10A1800000000000000000000000000000000000CF :10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B00000000000F0F0C300553C550F410341037F -:10A1C0000000000000005C5C252533330000000027 -:10A1D0000000000000000000001414000000000057 -:10A1E0000000000000000000000000000061000707 -:10A1F000000D0000000000000000000000610006EB -:10A20000000D000000610006000D00000061000666 -:10A21000000D000000000000000000000000000031 -:10A2200000000000000000000000000000000060CE -:10A230000005000D00000061000900010000006140 -:10A240003002800500000000303000900010000057 -:10A250000000000000000000000000000005006198 -:10A260000006000D00000000000000000000FF3CA0 -:10A270001717AAFF005500000000000000000000B2 -:10A280000000C8CBF8FB0000000000000000000048 -:10A290000000A0AFA0AF0000000000000000000020 +:10A1A000000000000000000000000000C3007D7DF2 +:10A1B0000F0F3C3C00000000000000000000000009 +:10A1C000000000000000000000000000000000008F +:10A1D000000000000000000000000000000000007F +:10A1E000000000003C3C00000000000000000000F7 +:10A1F00000000000000000000000000000610007F7 +:10A20000800D200000610007000D000005000A28F5 +:10A21000050000A000000000000000000000000099 +:10A22000000000000000000000000000000010001E +:10A230002028004000080000000000000000056128 +:10A240000A2F809D00A00000000180000000004156 +:10A250000006800D0000000000000000000000006B +:10A2600000000000000040428005802092020000B3 +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000000000000BE :10A2A00000000000000000000000000000000000AE -:10A2B0003C3C3C3C00001000FF350035303A3F3A52 -:10A2C00000000000000055550000000000000000E4 -:10A2D000000000000000000000000000000000007E -:10A2E0000000000030BA00AA0000000000000000DA -:10A2F000C3001717005500550000000000000000C3 -:10A3000000000000080B383B0000000000000000C7 -:10A310000000000030303F3F00000000000000005F +:10A2B000000000000000000000000000000000009E +:10A2C00000000000000000000303C3000A0A000FA2 +:10A2D000C0000000D7C3AFAF0000000000000000C6 +:10A2E000000000000000000055003C00303000F08D +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D -:10A330000000FA05FF0000000000FF350035303A4C -:10A340003F3A0000000004AE04AE00000000000030 -:10A3500000000000000000000000000000000000FD -:10A3600000000000000000AA30BA00000000000059 -:10A370000000B2B2003CFFC3FFC3000000000000B9 -:10A3800000000000000000000000FDF13D31000071 -:10A3900000007DAF7D05000000000000000000000F +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000303C3000A0A30 +:10A35000000FC000F0F0D7C30505000000000000AA +:10A360000000000000000000000055003C003030FC +:10A3700000F00000000000000000000000000000ED +:10A3800000000000000000000000000000000000CD +:10A3900000000000000000000000000000000000BD :10A3A00000000000000000000000000000000000AD -:10A3B00000000000FB04FF0041EBFAFAAF872D0517 -:10A3C00000FF00FFFF0F5C5CAA3CF0FF00000000F4 -:10A3D000000000000000000000000000000000007D +:10A3B000000000000000000000000000000000009D +:10A3C00000000000000000000000000000FF003C52 +:10A3D0000C0C0F0F00000000F8FF00FF0000000051 :10A3E000000000000000000000000000000000006D -:10A3F00000000000B2B2C3FFFFC3FDC100000000B7 -:10A40000000000000000000000000000CDC10D01B0 -:10A410000000000028AF2805000000000000000038 +:10A3F00000AA003C00000000000000000000000077 +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C :10A42000000000000000000000000000000000002C -:10A43000000000000000FF00FF0014BEFAFAAF8722 -:10A440002D05F0F0AAAAF0005C5CAA3CF000000028 -:10A4500000000000000000000000000000000000FC +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A45000003C0C0C00000000000028FF00FF000082 :10A4600000000000000000000000000000000000EC -:10A470000000000000002008200000000000001183 -:10A48000C000000020001000880084008804200024 -:10A49000A000200020002000200040004000880094 -:10A4A0002000002120008800880420002000C00037 -:10A4B000202040002000000320002000A000880091 -:10A4C00088000480000004000100400000800400B7 -:10A4D000108088800004200420002000010000007B -:10A4E000000020000000000200000000000000004A -:10A4F000C00000000000200010010000004000002B -:10A500000000000000020000000040000000000009 -:10A510000000100240022100000000004100800005 -:10A52000400010002100100040000000000000006A -:10A530001000000200000000000000000000000009 -:10A54000000000000010009000204000C100200822 -:10A5500000C020044004000300014000000004008B -:10A560000000400000004002000800402000000001 -:10A57000200000C0000000000002000002000000F7 -:10A580000102000000008400100000001000000024 -:10A5900002000000000000000000000000000400B5 -:10A5A0000400000010000800000000000000080087 -:10A5B000001000000000000010100000100000005B -:10A5C000000000000000008009000000000901C137 -:10A5D00008410809000000000200040402400800CD -:10A5E00008000800000000100041100000000000FA -:10A5F0000000000000000200000008000010001031 -:10A600000090400100900000000000C0040000081D -:10A61000000003000404000000080008000400001B -:10A620004100000041000008000041084108040802 -:10A63000040020000400040041040088000004001D -:10A64000000040000000400000100200208800844C -:10A65000400200000902000010000000001000117C -:10A660000000400000000400040011000408000085 -:10A670000500000000000000200800000000900815 -:10A680004021C000A00084008808840088080008D9 -:10A690008804001088008800A000830089008803D7 -:10A6A00000000000000900C100800400000000005C -:10A6B0008800001100000000000000000000000001 -:10A6C00000000000A00000000000880084000000DE -:10A6D000840000000000000000008208000000006C -:10A6E0000020000300000002000000000002002122 -:10A6F00000000004000000101041000000000021D4 -:10A700000000000000040000038403200202400255 -:10A710001100000000010000000003000800080014 -:10A720000000410000000300004010400400000051 -:10A730000000000000000000000000000000000019 -:10A74000000003000000040000820010001005104B -:10A75000004005000300030021000040000000A0AD -:10A7600000000202000000000001000040000001A3 -:10A7700000000000000000000001000000000000D8 -:10A78000000090001000004011418400820084000D -:10A790000000C000842040000800A0090011000053 -:10A7A0008400840010000000004000000000000051 -:10A7B0000000080000000000A000080000000400E5 -:10A7C00040000000000084000400A0009000081079 -:10A7D000000000410800A00000200920000008003F -:10A7E0000000000082008200080008050800000048 -:10A7F000000000040000000000200004000200101F -:10A800000000004000840000400020C00000110053 -:10A810000000000000000020001008000000000000 -:10A8200000001000000000000000000021000000F7 -:10A83000000000840000080000200000000000006C -:10A840000000000000000000000000000000080000 -:10A85000C10100000000090041C000018201008226 -:10A86000000004002100030021001000400000004F -:10A8700000004000080000002100100004000090CB -:10A8800021000002009000000000A00040801003A2 -:10A89000C00010008810A0000000C00082108200DC -:10A8A00040118403020082008411012185000011FF -:10A8B0000000000000200000000000110000000067 -:10A8C000000000000000000000000000A0000800E0 -:10A8D00000000000821000000400A080A0102000F2 -:10A8E0000003000009100002402004098403000452 -:10A8F00000209008A0008403000000000010200049 -:10A90000000000000000000000400440210002029E -:10A910000000090041904001030000000004000114 -:10A92000400200000000800205000000080008004E -:10A930000400000000000000000000000000000013 -:10A9400000000000000000000000100005000800EA -:10A950000000090041A00000000805A00902020350 -:10A9600011A0000009000889090200000000000091 -:10A97000400040000000000000000000080000014E -:10A980000000000000000000000000210000C000E6 -:10A99000000084119000A01040040821A000A00035 -:10A9A00010208200820000000100C000000084042A -:10A9B000C00500000010000082040000000000112B -:10A9C0000008000000000800040000000000000073 -:10A9D000A000A00000000800A000A0000200088065 -:10A9E00008000900C0009080C0800180A00000081D -:10A9F0008408088400008400001000850009090014 -:10AA0000002000048200000000000000000005009B -:10AA100000000000090000002001200021000402C5 -:10AA2000004000000500000002002020000000821D -:10AA30000500100000000089000000000000000474 -:10AA400000000000000000000020040000000000E2 -:10AA5000000008200000000011881188000000009C -:10AA60000002800008820082204008100840000098 -:10AA70000300000000204100030420892140100051 -:10AA800008040388030008000000410000000000E3 -:10AA9000010090000000410802A0000290A04008C0 -:10AAA000000400A0900290A090400082900290408C -:10AAB00090400282900240029004008290040000C4 +:10A47000000000AA003C0180210021804180A00052 +:10A4800000000000200002802184050001840000FB +:10A49000400040024002C000C0002000C000040094 +:10A4A000C00000008400200040008400200008005C +:10A4B0001000900000000003100040002000000089 +:10A4C0002000880000002000C000000040000000C4 +:10A4D0008980110001800180840020008800000034 +:10A4E000200004000400C0000400010000000080FF +:10A4F000021084100440020402200440044004407E +:10A500000000000200000004C1200220820204407A +:10A5100040000000000000000002000021000000D8 +:10A52000400200000900404021000000200080029D +:10A530004090000200000082000020001002400253 +:10A540004002000010001000100020000002000275 +:10A5500040022008A002100420082004404000020D +:10A5600040004040104010020090400210004002A5 +:10A5700000028003204110C1900200000100200071 +:10A58000000000000000001008050008000008009E +:10A5900040100000000008000800004000400000DB +:10A5A0000000100000000000000000000000080093 +:10A5B0002004001000000000001000000000000057 +:10A5C0000800000000000000000000000000000083 +:10A5D00008000800020002108400001000000100C2 +:10A5E0000000020002000200020000000000000063 +:10A5F0000000C01000000300000000000504020875 +:10A6000000000000040004000084000400000000BA +:10A61000040080080010000800000004408420901E +:10A620000000000000000000028400000010000094 +:10A630004000800500000010001000040000000031 +:10A6400000000000040000A000004000400400C022 +:10A6500000000000000000002000001000000000CA +:10A660000200410009000000050000000000000099 +:10A6700000000000040004000800000003000000C7 +:10A680000000000900000000000000000040000081 +:10A6900000002000000084009000000840089000A6 +:10A6A000000000000000000800000000000000089A +:10A6B000000000000000000004002008000000006E +:10A6C000900090000000000000000000000000006A +:10A6D00000080000400200000000000090000000A0 +:10A6E00000000000A0008800000000000000000042 +:10A6F0000400000008000200040090000011820025 +:10A700000008040009820000000000002100000091 +:10A710000084000000000000200000000000000095 +:10A720000000000000000000000000000000000029 +:10A7300000000000000000000000410020020000B6 +:10A74000000000A000000000000000000000000069 +:10A7500000001001090008014090110000000000F5 +:10A7600000000000000000000000040400000000E1 +:10A7700000000000000000000000110400000000C4 +:10A7800000000000000000000800000400000000BD +:10A790000000000000000000000008000000082089 +:10A7A0000000000000000000C000000000000000E9 +:10A7B0000000000008000000000000000800080081 +:10A7C0000800000010000800A04008001000080069 +:10A7D0008200820041040000849108800002100081 +:10A7E00000000000820000000800002000000000BF +:10A7F0000200080008000000000000000800040239 +:10A80000000500100090000000000082000003001E +:10A81000090000000000000000000000000000002F +:10A820000000009000000000000008400800000048 +:10A8300000000008000000000000001000000500FB +:10A840000000000000000000000000C00000400008 +:10A8500000000000000004010000002000040000CF +:10A860000000080000001000000040002000000070 +:10A8700008008000000000001100400000000000FF +:10A88000100021000001000000000000000008008E +:10A890000020000800000000040000000000A021CB +:10A8A00000000000000000000000000000000000A8 +:10A8B00000000000080000000000C00000000000D0 +:10A8C0000000000000000000000084000000000004 +:10A8D00020000000900000000000008000008300C5 +:10A8E0000000000000000000000004000200400022 +:10A8F000200088000003000000020020000000008B +:10A9000000000800088000000000000000000000B7 +:10A91000000000000000000000000000090000002E +:10A920000000000000000000000005000000000022 +:10A930000000000000000000000000000000000017 +:10A94000000000000000000000000000030040A024 +:10A9500000040000008400000500008403080000DB +:10A960004000110400004004040021000000050024 +:10A9700003000000000005000000000000000000CF +:10A98000000000008000801010000008000082001D +:10A99000000000008200000000000800000000002D +:10A9A0000000002100000000000000000000000086 +:10A9B0000000820000000000000000000000000015 +:10A9C0000000000000001000000000000000000077 +:10A9D0000000000000000000000000001000080857 +:10A9E0008200000008100041080000000000000084 +:10A9F00000000000000000000000000000009000C7 +:10AA0000820000000041000800000040000000003B +:10AA1000000000000090000008000000000000009E +:10AA20000000000000000000000000000000000026 +:10AA30004040000000000000000000000000000096 +:10AA40000000000000000000000005000000000001 +:10AA50000000000000004100000000000000830032 +:10AA6000000100000000000000C011000000000014 +:10AA700000000000000000000300000000002000B3 +:10AA8000000000000084000000000000000002C080 +:10AA9000000000900000000000000000000000C066 +:10AAA00005900510024000000000000000000000BA +:10AAB0000000000000000000000000000000000096 :10AAC0000000000000000000000000000000000086 -:10AAD000000000000000000000A00090004000C046 -:10AAE00001912021009100111101009040A10090DE -:10AAF000A00000000800400008889020008290021A -:10AB0000400290040082902000000000000000003D -:10AB100000000300000000009000800000800000A2 -:10AB2000800000800000000000000080088000809D -:10AB30000300098080800080858000000080008004 +:10AAD0000000000000000000000000000000000076 +:10AAE00088C000880190900200010000030000006F +:10AAF0000000000000000000081000040002C01068 +:10AB00004020002040049010C0C0820400A08208B1 +:10AB1000C0800000000000000000000000000000F5 +:10AB20000080900003808000000000000000000012 +:10AB30000000000000000000000000000000000015 :10AB40000000000000000000000000000000000005 -:10AB50000000000000000000000000800000000075 -:10AB60000000094180A1000400401008102180A0CD -:10AB700000119000110080000000A0000000008083 -:10AB80000080808000800080000000000000000045 -:10AB90000000A100880511804180000000A180A074 -:10ABA00080808000008380208000000000088005F5 -:10ABB00080808000002100200080000000218003B0 -:10ABC0008000000000000000000000000000000005 -:10ABD00000000000000000000000000000000091E4 -:10ABE000008900008000000000000085200089111D -:10ABF0004180891000000021808000000200214077 -:10AC00001080088000000020000300000000000009 -:10AC10000000000003001000850803082000908257 -:10AC200004C0820804009082048210204000900238 -:10AC300004A01008040090042040020820009004A2 -:10AC400004820284000000000000000000000000F8 +:10AB500000000000000000000000000000000000F5 +:10AB600000008080000040808080004140208240C2 +:10AB70000000000000000000000003800000000052 +:10AB80000000820021000000000000800000008022 +:10AB90008000000000058000800000000000000030 +:10ABA00000000000002000C0800000000000000045 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE000000000000240031110A1C1000005050093 +:10ABF000000041400000000000000000000000A133 +:10AC000000800080800080880004808000000000B8 +:10AC100080808000000000000200C00000000000F2 +:10AC200000000000200000008811C00000000000AB +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 :10AC500000000000000000000000000000000000F4 -:10AC60000041000300001020101008009082119095 -:10AC7000102000C0C00000001010A00400009000D0 -:10AC8000900221081108200090042082088400000E -:10AC900000000000000000000001000101019120FF -:10ACA0000090000483020304009000040410034099 -:10ACB0000090080405100304009084212003A120C3 -:10ACC00000900804201000000000000000000000B8 -:10ACD0000000000000000001000000000000000073 -:10ACE000880000000000040010020110000010C0E5 -:10ACF000000100400488A00000000000008501C1A0 -:10AD00000390889004202002032000904020C084FB -:10AD100000000000000000000009001000210308EE -:10AD2000020000000080028084800000008080809B -:10AD3000C10000008080A080C1A0000500404089C3 -:10AD40004100000080800080000000000000000042 -:10AD500000000000000000000001000000000000F2 -:10AD6000000000000000000080008000048041001E -:10AD700090800020218589418002004000020090DF -:10AD80000983C100800000000580C1000000800030 -:10AD90008080000000000000000000898021808089 -:10ADA0000021000800210000000000008008800051 -:10ADB0000000000080030000000000088021000067 -:10ADC00000000000009000000000000000000000F3 -:10ADD0000000000000000000000000010000000072 -:10ADE0000000000080110021000080002004020209 -:10ADF000038040000485A1800300110800000008C2 -:10AE0000000000008088008280000040002000C018 -:10AE100000080000000000000000000084C1108451 -:10AE2000020284012000A02008904000200004209D -:10AE30000290020020000440209008004000820898 -:10AE4000829088002000A0034090200000000000B5 -:10AE500000000000000000000000000000010000F1 -:10AE6000000000000000C00120004000820001003E -:10AE7000019001840000910410109088100190004E -:10AE8000100020A008000420A021849008004001A8 -:10AE9000A0024090080000000000000000006000D8 -:10AEA00000E0000041000000000007000021000059 -:10AEB000000007000000000000E00700480000005C -:10AEC00000000700480000000000070048000000E4 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000600000700000055 -:10AEF0000082000007000000600000E00000008207 -:10AF000000060000070000000000000007004800E5 -:10AF100000000000070048060000000000000000DC -:10AF2000FFF00F0000000000000000000000000023 -:10AF30000000000000000000000000000000000011 +:10AC60000000000000008501C1018988C10800883A +:10AC7000000000000100000020000000000088002B +:10AC8000C0C00802C0C0080008C0A00802C002007E +:10AC9000820008A0080004000040009040C00000AE +:10ACA00000000000000020210000000891C1000009 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE000000000000000000002A040C0A01089C1C8 +:10ACF0000000010000000001000000000000000052 +:10AD000089100010C090100289040088C0411121F0 +:10AD10008288000800088808800000000000008089 +:10AD20000000000000000000004000110020889199 +:10AD30000000000000000000000000000000000013 +:10AD400000000000000000000000000000004000C3 +:10AD500000000000000000000000000000000000F3 +:10AD6000000000000000000000008020802080081B +:10AD7000C0C10000102000000041000000000000E1 +:10AD800000004100000080000080414000108085EC +:10AD90000841000000000080838080020021000044 +:10ADA000000000000000000000008000000400001F +:10ADB0008000000000000000000000000000000013 +:10ADC000000000000000000000000005000000007E +:10ADD0000000000000000000000000000000000073 +:10ADE00000000000000000000000000080008089DA +:10ADF0000080000041020000050000080000000083 +:10AE0000000000000003008000800000001000002F +:10AE1000000000008000800500808000C00190904C +:10AE2000882000000000000000000000C00082092F +:10AE3000820002000000000000000000000000008E +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE60000000000000000000000000000000C00022 +:10AE700090881084080001210000000000000000FC +:10AE80000000000000002000881088408800C001F9 +:10AE9000C0900888C000C000044000840200004147 +:10AEA0000000070000000000000000000000821108 +:10AEB00080E007000000000000000000000000002B +:10AEC0000000000000000000000000000000810001 +:10AED00000E0000000000000000000000000000092 +:10AEE0000000000000000000000000000000000062 +:10AEF000500A00E007000000810000E000000000B0 +:10AF000000000000000000000000000000004842B7 +:10AF1000000000000000484200420000070000005E +:10AF200000F000FF006600F00000000000000000DC +:10AF30000F0FFDF4C3C3C3000000000000000000B9 :10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000F03C66FF000050 -:10AF7000000000000000CFCF030300000200000922 -:10AF80000009000000000000FFFF000000000000BA -:10AF900000000000000000000000000000000000B1 -:10AFA00000003636363600000000000000000000C9 -:10AFB0000000000000000000000000000000000091 +:10AF600000000000000000000000000000000000E1 +:10AF700000006C6CFFF066F0FF3C00000000000079 +:10AF800000000000000000000000A00000A0280059 +:10AF9000410022001100201004083C00BD00030203 +:10AFA000030300F00000006600F000000000000055 +:10AFB00000000000FDF40000C300000000000000DD :10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 -:10AFE000000000000000000000000000F03C6600CF -:10AFF0000000000000000000CFCF030300000000AD -:10B000000009000900000010FF0066660000000053 -:10B010000000000000000000000000000000000030 -:10B0200000000000000000000000000002102000EE -:10B030000088100402102000008810040210200074 -:10B040000088108402102000008810840210200064 -:10B0500000881084000000000000000000000000D4 +:10AFE0000000000000000000000000000000000061 +:10AFF000000000006C6C0F0066F0003C00000000D8 +:10B000000000000000000000000000000500000536 +:10B010000028004100220011408002013C00BD00D8 +:10B020000303030300000000000000000000000014 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 :10B0600000000000000000000000000000000000E0 :10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000210AE -:10B090002000008810840210200000881084000026 -:10B0A0000000000000000000000024E724E700008A -:10B0B0000000000000000000000000000000000090 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A000000000000000F0F0606099990099000035 +:10B0B0000000000000000000FFFF00C3424200004B :10B0C0000000000000000000000000000000000080 :10B0D0000000000000000000000000000000000070 :10B0E0000000000000000000000000000000000060 -:10B0F000B020B92900000000242400000000000254 -:10B100004203420383830303000000000FFF0FFF8D -:10B11000000000000000000000000000000000002F -:10B1200000000000000000000000000003033F3F9B -:10B13000000000000000000000000000000000000F +:10B0F00000000000000000003CFF0F660F3CFF66F0 +:10B10000000000000000000000000000F0F0F0F07F +:10B1100010082004440000441008200440200204C9 +:10B12000060900C39F999C99000060600000009987 +:10B1300000000000000000003C3C06F600C3424254 :10B1400000000000000000000000000000000000FF :10B1500000000000000000000000000000000000EF :10B1600000000000000000000000000000000000DF -:10B1700000002020292900000000242700000000F2 -:10B18000000042034203434342420000000000FF2C -:10B1900000FF0000000000000000000000000000B0 -:10B1A00000000000000000000000006100068005B3 -:10B1B000000000000000000000000000000000008F -:10B1C000000000614007000D000000614006000D16 -:10B1D000000000000000001000010000000000005E +:10B17000000000000000000000003C000F660F3CD3 +:10B180000066000000000000000000000000F0F079 +:10B19000F0F08001400288000088800140028010A9 +:10B1A00001080609C3E7FFFFFCFF1000202800404C +:10B1B000000800000000000000001069202F804DF2 +:10B1C0002008000000000000000000000000000057 +:10B1D0000000000000000000000000610006800D7B :10B1E000000000000000000000000000000000005F -:10B1F00000000000A0000A200000000000613036BE -:10B20000009D00A000613000800100050061303623 -:10B21000004D000000614006000D0001000000002C -:10B22000000000000000000000000000000000001E -:10B230008282828200000000000000000000000006 -:10B2400000000000000000000000000000000000FE -:10B250002CEC2FEF000000000000000000000000B8 +:10B1F0000000000000000000000000001061202F8F +:10B2000080490008000000018000000000000000EC +:10B210000000000160000000000010000061000656 +:10B22000000D0800A0002028001000000000000011 +:10B23000000000000000000000000000000000000E +:10B240003A0F3AFF0000000000000000000000007C +:10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE -:10B270000000000000000000000000000000003C92 -:10B28000003C00000000CF0FC3000CAE0C0C00000F -:10B290000000B2C3B2FF0000000000000000000088 -:10B2A000000000000000000000000000000000009E -:10B2B0000000003C033F0000000000000000000010 -:10B2C000000000000000000000000000000000007E -:10B2D000000020E023E30000000000000000000068 +:10B2700000000000000000000000000000000000CE +:10B28000000000F0003C0A0AAAAA0A0A0F0F0000F8 +:10B2900000000000000000000000000000000000AE +:10B2A0000000A0BCFF3C0000000000000000000007 +:10B2B000000000000000000000000000000000008E +:10B2C00000003A003AF0000000000000000000001A +:10B2D000000000000000000000000000000000006E :10B2E000000000000000000000000000000000005E :10B2F000000000000000000000000000000000004E -:10B30000FF0A000A000000008F0F82000CFF0C5D96 -:10B3100000000000B200B23C00000000000000008D -:10B32000000000000000000000000000000000001D -:10B33000000000003F3FA0AF000000000000000040 +:10B300000000000000F0003C0A0A00000A0A0000E9 +:10B31000000000000000000000000000000000002D +:10B3200000000000A0BC003C000000000000000085 +:10B33000000000000000000000000000000000000D :10B3400000000000000000000000000000000000FD :10B3500000000000000000000000000000000000ED :10B3600000000000000000000000000000000000DD :10B3700000000000000000000000000000000000CD -:10B380000000FF0CFF14000000005F1F5514F82898 -:10B39000F8FF00000000000000000000000055B4AD -:10B3A000FFB40000000000000000000000000000EA -:10B3B0000000000000003030A0AF000000000000DE +:10B3800000000000000000F030300055000F000009 +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D :10B3C000000000000000000000000000000000007D :10B3D000000000000000000000000000000000006D :10B3E000000000000000000000000000000000005D :10B3F000000000000000000000000000000000004D -:10B40000000000000C0C1414000000000F1F0014BA -:10B41000282828280000000000000000000000008C -:10B4200000B4AAB40000000000000000000000000A -:10B43000000000000000C080000020A0C000884084 -:10B440000084028210000000400088000084010097 -:10B4500041848500C0030000020320030100200096 -:10B460008884200040000504C0900504C100848445 -:10B470002104200400034002C00288004004400070 -:10B480002000C0A00180842004008800200010005B -:10B4900020000000880205100000A002000000004B -:10B4A0000000408282008900400088804000201116 -:10B4B00000000000840010000008410200030000AA -:10B4C0000041210221110000400000004000000462 -:10B4D0002004080420C0000000000000800040009C -:10B4E00040000008000000002000400504000800A3 -:10B4F0000010020200000000200000000000000018 -:10B50000000000004005200800C040004040000846 -:10B5100080000002200020000801000021000090AF -:10B52000000000008003000040A080000008200010 -:10B530000900000440C0000000000020820000005C -:10B540001041000002004000000004000000400024 -:10B55000020800000200050004080000400004008A -:10B5600004000400080004000000000004000800BB -:10B5700000030110000308000000000005000400A3 -:10B58000018004004000000000008800000000105E -:10B590000000200021041010022008000800000014 -:10B5A0000800000000004000080502101002020020 -:10B5B000089002801004200002C000000001020078 -:10B5C0000000800000000000A00000000008000053 -:10B5D00082008000000000000404000400008900D4 -:10B5E0002004090040040000000005004010000095 -:10B5F0004184400404010008040000000404040025 -:10B60000A0000402000084002000000000000504E7 -:10B61000000004008000820080022009C000800039 -:10B620000000000000000000800040000001000950 -:10B63000800880108004C1058000040540C084009B -:10B64000884088000000A008A00000000000000062 -:10B65000A00008000800080008088200040200009A -:10B660008411000200000000000000000000000043 -:10B67000000000000002012000000008000000009F -:10B680009000C000901140400000400000200400E5 -:10B690004000900320000408080800020000000099 -:10B6A00088000000000000040000000900400008BD -:10B6B000010200210000000000080180001041206C -:10B6C00005204100000800002100210003001000B7 -:10B6D000030021A0050221004100410008004102B1 -:10B6E00008000000210241000000000000000900E5 -:10B6F0000000080000000000080100000000000039 -:10B7000000000000400000000300090000000001EC -:10B71000110020000000000000A0800003A01184A0 -:10B7200009820500098209820504098805000501CE -:10B7300008004000009000000000080008400001E0 -:10B74000000084000000040000030000C00041006D -:10B7500084000000080000200800000009098200A1 -:10B76000840000008200000008000040000000008B -:10B7700000000000C100080082000110000002204B -:10B78000000004000000C0000800000000000800E5 -:10B7900008000000080000008240080801028280C2 -:10B7A0000180080008000800820082000000C0003C -:10B7B00011000000080000008200C000000000002E -:10B7C00008000300000000028000200000C0008884 -:10B7D000C00010004000210011901000000008007F -:10B7E00010000000108841904100100000A00000EF -:10B7F0000500081000082084000000000801000077 -:10B80000800000008804110000A00000000000007B -:10B810000004000000002100089000000091089042 -:10B820000302200811000320000000822188080084 -:10B8300003882000008800880088000000040002BF -:10B840000200101040000400A0201020000000049E -:10B850000800C04000004000080008081000080070 -:10B8600000001000000088000040000800000000F8 -:10B870000000820000000000000000000000000046 -:10B880000000100000000000000000008200040022 -:10B8900004000000010009000000880002001003FD -:10B8A00000208200C0009000040000008403080013 -:10B8B00084210820A00800008200824100110008B5 -:10B8C00000210021000011088400000100840340D1 -:10B8D0000000030009002100000021000000080012 -:10B8E00041000800080021902100210021000300F0 -:10B8F0000800030000000300000003000000000037 -:10B900000000000000000000000000000000000037 -:10B910008300808800000400020011000590A00848 -:10B920002004004011000302200003000008000072 -:10B930001100210403000590110000002100000007 -:10B94000000000000000000000008400C020000093 -:10B9500082002000820000020800C00000001000E9 -:10B960000803C0000800088000000000000000027A -:10B970000000000000110221000000400040000013 -:10B980000000000000100400000008009000820089 -:10B9900000000021040000050000000000089008DD -:10B9A00000000000010011001000040082004000AF -:10B9B0000803000510408200040000210000080078 -:10B9C000C0000210032000000100034000004101FC -:10B9D0000000000011000088208800000000002006 -:10B9E000080000900888080008100300000000000C -:10B9F0000000000000001000100000000000418462 -:10BA000005000000000000002000000000002000F1 -:10BA1000000000001100800000000900000000008C -:10BA20000888410011001002040020000088410035 -:10BA3000000040000902008809900900008400000D -:10BA40001100090080010800030008001000908820 -:10BA50004082101000000000A00000000000010063 -:10BA60008401000003000000200104000000100118 -:10BA700000010001000100000000000000000000C3 -:10BA8000010090000002008800A000C0000000003B -:10BA9000010088000000A000000800C000C088C0AD -:10BAA000000000A08810C011888820C082C100A0BA -:10BAB0000040002040020010008882880002040933 -:10BAC0000805008940A091C0882083900420A00030 -:10BAD00080008080808000001100000000000002D3 -:10BAE0002120000800028903080841088005200879 -:10BAF0000008090300080041000900090040400057 -:10BB000000004000000000000000000000000000F5 -:10BB1000000010000000000005000080020000008E -:10BB2000000000000080000080419100800580023C -:10BB30000080008000000080008010000000008075 -:10BB4000004180A1004000041183A080A141800039 -:10BB500000000000800080800400A0000500C1807B -:10BB60000900000000000240108041002040200534 -:10BB700010802100040010090000000000000000F7 -:10BB80000000000000100080000000100000000015 -:10BB9000000000000000000000800000000300849E -:10BBA00080100000000000000000100002410800AA -:10BBB000C10080100009808580001000020005008F -:10BBC0000200008080088000000340800909119174 -:10BBD0000003100000008488901009000300010099 -:10BBE000C1A00008000000000001010200000000E8 -:10BBF0000108011001000100010000000000000028 -:10BC0000000000000000000100040000000000101F -:10BC1000000000000000002000000004A0C0A001FF -:10BC2000000390C10000001000000000829000039B -:10BC300001C0C10008000800A002040001000108C2 -:10BC40000000010020020201A088080188400901CB -:10BC50008391A0019000008800881003000000017B -:10BC600004010001000001000101000000210100A9 -:10BC7000008800C100000000010001000000000079 -:10BC80000000000000900800008800204000000034 -:10BC90000000020000000100000140010000908847 -:10BCA00000A09090020200040010000010C00002EA -:10BCB00000A0A09101112002000200020210000069 -:10BCC00000000001A000081000100010A0102002C9 -:10BCD0008989854089C180110010000300C10020BE -:10BCE00000100002202000001003102100000010AE -:10BCF0000305404009A000002000100041000000A2 -:10BD0000210004000000000000000000000000000E -:10BD100000000000000000001009000800100020D2 -:10BD2000800000008080C080000000800000008053 -:10BD3000000303A100210941000000000000800071 -:10BD400000110003002100020000110041808880E2 -:10BD500080C1898990A091C1001180088080000075 -:10BD600000800080000000200880052003001008EB -:10BD700008104008080009080080000010001004A6 -:10BD800000020000000000000000000800000000A9 -:10BD90008008802100000000000000000041000039 -:10BDA0000000C110048505801000000000000000A4 -:10BDB0000000C182008005800240000000000000F9 -:10BDC000800000050000000000119004A0808400A5 -:10BDD0000500C1A09109C080A12188012088109090 -:10BDE0009000004000820002000101A0000001005C -:10BDF0000001000900010100000100A00000010095 -:10BE00000000000000000000000000000001000031 -:10BE10000000C001A00010001000000000000001A0 -:10BE200000000000910102400040C100000000003D -:10BE3000000000001140888202041001C000088840 -:10BE40000888A0000020000000000000C101A0023E -:10BE500084828200C0C1910820049101000000008A -:10BE600007000000000000000000000000000000CB -:10BE700000000000818100E007000000880000E071 -:10BE80000000000A0000000000000000880000E040 -:10BE90000700000000000000070000000000000094 -:10BEA000000007004200880000E0070000000000DA -:10BEB000000000000000500A00E007004100000000 -:10BEC000000000000000810000E000000000000011 -:10BED000000000000000000000E007008400F8FD02 -:10BEE000080D00FF00FF000000000000000000003F -:10BEF00000000000000000000000FFD7004100002B +:10B40000000000000000000000F030300055000F88 +:10B41000F0F0AAAA000000000000000000000000F8 +:10B42000000000000000000000000000000000001C +:10B4300000000000210020002084408305000080DF +:10B44000100004A00000000001042100A000200062 +:10B4500004808880200088004004400420002000F0 +:10B46000200020084180010041902084C000890212 +:10B47000400088000003208088840400200421000C +:10B480002000200020C140800180048041802100F4 +:10B4900088000000040020888880412040A090009F +:10B4A0000120002020200000840088008810050072 +:10B4B0002180050005000400009080200020A000ED +:10B4C00040044000C005400009902002208420C0B4 +:10B4D0000090000400040904210400000900C0C019 +:10B4E000C000C040000020082004100540042000D7 +:10B4F000409100022102000040044008000040404A +:10B50000080041000000411009400220A040044012 +:10B510008400080040020000402100204003800316 +:10B520000800100541010041200240042000109154 +:10B53000829004408202820200000203090020205F +:10B540000000000004004085000000000800080022 +:10B550000404200804000802100082000000080013 +:10B56000000020000404050400000000010002089F +:10B570000000200002100410000020000000000065 +:10B580000000000000000000048000000200000035 +:10B59000000000000000020002000400040004009B +:10B5A000038011002040050002000000020000009E +:10B5B0000200000002000400000900000008200052 +:10B5C000000900000000000082102084000000003C +:10B5D00000048409809089840285800000080000AE +:10B5E0000008200080000001200100080000080081 +:10B5F00009004010000800010005000000000008DC +:10B60000000004080000090040004040000800005D +:10B610000000000840000004000000008000A002BC +:10B6200080000402A000C000200005040008800083 +:10B63000000000820000040000000000000300057C +:10B640000000000500030005200004400008000081 +:10B650000011000204000483880000080005A040D7 +:10B660004000000800000000000900210000000068 +:10B6700000001000042001200000844000000000B1 +:10B6800000809080C080000008110040C0000400CD +:10B690000000000000000840020008000000000058 +:10B6A00004000900880011000000000083800000F1 +:10B6B00082001000004004030000000008000000A9 +:10B6C00000000000000041000800830000000400AA +:10B6D000000000000001C10005040000100400008B +:10B6E0004100800000000000000000000000000099 +:10B6F00009000000890000010801000000010000AD +:10B7000000000010000404044000C000030100C059 +:10B710008000110000000000800108008884000003 +:10B720000000080040001000A0000200000010040B +:10B730000010001000101110001000A0008200A0E6 +:10B74000A0000400000008000000A10004800920FF +:10B75000200410000002822100008520040004C1A2 +:10B7600020040000008008000000A0000000C000CD +:10B770000000100020000000408008800800020047 +:10B7800000000800080082000020000010000000F7 +:10B7900000402000C0000000080000000000000081 +:10B7A00010800000100408000800080008000800CD +:10B7B0001004A0110040000008000804000200006E +:10B7C000000400008000000000A0000004008004CD +:10B7D000200080000800000100001000040180002B +:10B7E0008004100000000802000021A000A0080052 +:10B7F00000C0030080004100000080200010000015 +:10B8000088000000800000000000000000000084AC +:10B8100000000000050000000000000000820000A1 +:10B8200000000020030000000000000040000000B5 +:10B8300000000401000000002100000000000000E2 +:10B84000400021000421100082008410002000002C +:10B850008200001101002040100000040080000060 +:10B860000800000010080000400040000004C00074 +:10B87000C000820084000000840004000440040032 +:10B88000002084000000C00000800000C000000311 +:10B890000000A000000020000000000010110000C7 +:10B8A0000000C084840000000011000000080000B7 +:10B8B00020022020000000000020000010400000B6 +:10B8C00000000000000080001000000000210000C7 +:10B8D0000000000000000402A00000880001000435 +:10B8E00000200000000080010000000000000001B6 +:10B8F00000000000000000000000000080008091B7 +:10B9000080000001000000000000000400000000B2 +:10B910000000000000C000000888030000100000C4 +:10B920000800000000410900004000000400000081 +:10B930000410C0208010001041404104210800087C +:10B9400000000004100000008200C0008405000018 +:10B950000000008500200005200410210040002187 +:10B960000000C000000000002000080300000141AA +:10B970000021002182000021820000000000000060 +:10B980000400C000842184200000000000020800A0 +:10B990000100002100000004000800000010000069 +:10B9A0001000000000008500A0008200820000045A +:10B9B000A0801000000010000000842000000000A3 +:10B9C0000405000000000000000800000000000066 +:10B9D0000010000000040001000000110000000041 +:10B9E00000000000000000000000000011880000BE +:10B9F0004090000000000000400000000000000433 +:10BA000000008000000000000001000002000000B3 +:10BA100000004000030000000000000000000000E3 +:10BA2000000000000000000004000800000000000A +:10BA30000000000200000000800000000000000084 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000C1840110884020020000400066 +:10BA600091000000000000009100000000000000B4 +:10BA7000000000000000400001000000C0010800BC +:10BA80008300080010C1000300A19021000000A065 +:10BA900000200108000400C000400090004082C067 +:10BAA0000020009090000101210191009000000011 +:10BAB00001000300000002110091918810090000AC +:10BAC00000000000000020C000400008040040000A +:10BAD00000000200000091004000100000800800FB +:10BAE00021009000000000000900C10000000000DB +:10BAF0000000000000000000000005000000C04140 +:10BB000003088405090085850088009080080000EE +:10BB100003800080418000800080008000000000E1 +:10BB20000080000000001000094189114009001147 +:10BB3000400010008200000005C1000302A00010B8 +:10BB40000000000000000000008000000000000075 +:10BB50000000008080080080801000A180058080A7 +:10BB60000810030002080300000800000010000095 +:10BB7000090009000500418000200000000300804A +:10BB800003002000000041030000800000000002CC +:10BB900000000009000000910000000000030009FF +:10BBA0000080000000080000800005800888090966 +:10BBB00041890800100020004100200020052000DD +:10BBC000C100000000000000800080000000008034 +:10BBD00080001000880810009008A0014008A09084 +:10BBE0001008000100000100010000000020000119 +:10BBF000002000000000010001A000000000000182 +:10BC0000000200880000000001218890909002004E +:10BC100004900000000000000004000010009001EB +:10BC200010858802900088010000C00001100140CA +:10BC3000000101830100004000000140032090004A +:10BC4000088809209000C0008800C000040000009F +:10BC50000002C0000000000020000000094008A011 +:10BC60000440080900000201000000000000040078 +:10BC70001000000000000000000100000000900023 +:10BC80000000000000910010012000919120880226 +:10BC90000390C088000004011000000108010000AA +:10BCA00000000000A00088880008002000C00001FB +:10BCB0000188090900C100000000100000011011F6 +:10BCC0000090001004830000000000000000408885 +:10BCD0000008004000C01100000000004000900378 +:10BCE0008040800909101040001000200204030861 +:10BCF000804000080809000000000008000900005A +:10BD000000000000200000020080100000410880B8 +:10BD10000380910080000000800800030010804133 +:10BD20000000000000000000000000000000008093 +:10BD300000021141890800C1032000218005000391 +:10BD40008090000000A080C1000000000000000002 +:10BD50000000000000000080000000900080000053 +:10BD600080050082000000000004000200000003C3 +:10BD700000050008000000000000000000000000B6 +:10BD80000005000000000000411003210000000039 +:10BD9000030020892008100000008004802100009A +:10BDA000000080408080008000008004004000008F +:10BDB0000000C184412103001011000800080000A8 +:10BDC0000000410920108000100000000000000069 +:10BDD00000008004000200000000000000820090CB +:10BDE0000000900040A01090080000090001000031 +:10BDF0000000000000010000000000A000000000A2 +:10BE00000000000000000000000001090000000028 +:10BE10000000000000A00089000000008201040171 +:10BE200020004000C000020808404000C00100009F +:10BE300008A08800C18908009000010100000001ED +:10BE400000000000830000108288820000000000D3 +:10BE500000A00000C001080920400000884100E067 +:10BE600007000000818100E007006000810000E021 +:10BE700007000000818100E0070000810000000051 +:10BE800000000000810000E000000000884100E0A8 +:10BE900007004200004100000700000A0000810086 +:10BEA00000E00000008100000000000000000081B0 +:10BEB000000007000000500A00E0070000008800B2 +:10BEC00000E007000000888100E00700000000009B +:10BED00000000000000000810000070000000000DA +:10BEE000000000000000143F14035500C30F0000C1 +:10BEF0000000000000000000000000000000000042 :10BF00000000000000000000000000000000000031 -:10BF100000003CFF3C3C28FF30FF00000000000018 -:10BF2000000000000000000000FF00FF282D787DC9 -:10BF3000000000000D0D09090A000000BA7530BAB2 -:10BF40000A0CFAFCCFC0CFC00000000000000000C7 -:10BF5000EF2030303C300C00F0F00000303FFAFAB7 -:10BF6000F8FD080D0A0AFAFA0000000000000000BF -:10BF7000000000000000000000000000FFFF0000C3 +:10BF10000000000000000000000000000000000021 +:10BF2000040000000000000000000000000000000D +:10BF300000000000C3C37CFEF0F000F0F0F000FF52 +:10BF40000000000000000000FCFCFCFC08F80CFCF9 +:10BF50000000000000000000AA00F000000FFAFA44 +:10BF60000000000000000000D73FD70355FFC30FBB +:10BF700000000000000000000000000000000000C1 :10BF800000000000000000000000000000000000B1 -:10BF9000000000003C003C3C28283030000000003D -:10BFA000000000000000000000002828EBEB282D16 -:10BFB000787D000000000A0A04040C000000303004 -:10BFC00030300A0C0A0CFFF00F00000000000000E7 -:10BFD0000000202030301C101C10B1F00100303F58 -:10BFE000F0F0D717D7173CFF3C550000000017179B -:10BFF0003F3F0000000000000000000000000000C3 +:10BF90000000000020000000000000000100000080 +:10BFA000000004000000000000000A00002800005B +:10BFB00000003C3CF0F000007CFE000000F00000BF +:10BFC000000000000000000000000A0AFAFA00F079 +:10BFD00000F00000000000000000AA00F000000FC8 +:10BFE000FCFC00000000C082C0BE010BA1AB5C5C89 +:10BFF0005C5C000000000000000000000000000089 :10C000000000000000000000000000000000000030 -:10C0100000000000000000000000313101010000BC -:10C020000000000000000000000000007F707F7032 -:10C03000FDFD3D3D4343020200000000003C000FB7 -:10C04000000000002F2F28282F7F2A7A00000010E0 -:10C050000000000053535353F0F07050000A3C3C72 -:10C0600000000004141714173CAA3C000000000054 -:10C07000171703030000000000000000000000008C +:10C010000000000000000000000000080000000018 +:10C0200000000000555555550000000005000C00AB +:10C03000FFFF005D000000003030F0F00000000065 +:10C04000000000000000000000000000FF4300436B +:10C050003F302F2000000000F0F0C000F0F0F000B2 +:10C06000AAAA282800000000FC82FCBE515BF1FB5C +:10C07000FF0FF000000000000000000000000000C2 :10C0800000000000000000000000000000000000B0 -:10C09000000000000000000000000000F131C101BC -:10C0A00000000000000000000000000000004F4001 -:10C0B0004F40C1C101014343020200000000003CA7 -:10C0C000000F55553C3C0FFF00F025752070000017 -:10C0D000001000000000FFF30000F0F07070000A94 -:10C0E000555A000000000061000E000D00000061C4 -:10C0F0000006000D000500610006000D0000006153 -:10C100000029809100A000610007800D00000061FF -:10C110000006000D00000061000F800D00A0A000CF -:10C12000400800000000000005610A0E050D00A097 -:10C130000061000F800D0000000030000090000042 -:10C1400000003030C00900080000000000000000BE -:10C1500000613006C0090000A0610006000D00006B -:10C16000A061200900400001000000003CF03CAA52 -:10C1700000000000EAEA00551717FFC30A0F0A0F74 -:10C180000004000000100000ECECECEC00000000EB -:10C19000000000000000000000000000000000009F -:10C1A0000000000000000000000000000000040487 -:10C1B0000000AE0C5D0C000000000000000000005C -:10C1C000000030305050000000000000000000006F -:10C1D000000000000000000000FFB3B0333000009A -:10C1E0000000CF0CCF0C05F5F9F9000000003CF081 -:10C1F0003CAA000000004040005517173C00FAFF21 -:10C20000FAFF0000000000000000EFEFEFEF000079 -:10C21000000000000000000000000000000000001E +:10C09000000000000000000000000000000000049C +:10C0A000100000000000555D55550000000005001F +:10C0B0000C00FFFF000CFF000F0F303000000000ED +:10C0C0000000000000000000000000000000FF0071 +:10C0D00000001F100F0000000000FFFFC000000064 +:10C0E000F0000000282805610A2F850F00A00561D7 +:10C0F0000A2F850D00A00561000F800D000005616D +:10C100000A2F850D00A000610006000D00000061EF +:10C110000007800D000000000029800000A00561DC +:10C120005A2E051D00A000000061000780080000D5 +:10C13000A00050000000000010002028004004086B +:10C14000A0000A29809000A005780A07850D05A0A7 +:10C1500080000021800000000000000000000005B9 +:10C16000100020280040040800000000000000002B +:10C1700000000000F3035050000000000F550F5561 +:10C1800000000000E83CE8FF00000000000000FFA5 +:10C1900000000000000000000000000014145555CD +:10C1A0000000080000000000000000000000303027 +:10C1B00000F000000000000000000000000000008F +:10C1C0000000FF0F553C3A3AF0FF000000002D0040 +:10C1D0002D55003C0055AA003C0000000000000066 +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000F3035F5F00000000C3FFC9 +:10C20000C30000000000E800E8C3000000000000D8 +:10C2100000FF0000000000000000FF00555514144E :10C22000000000000000000000000000000000000E -:10C23000005000000C0C0C0C00000000000000007E -:10C240000000000030305050000F001000000000CF -:10C250000000000000000000BCBC00FF8380030061 -:10C2600000000000CF0C4D8E05F50909000000000C -:10C270000000000000000000AABEF0FCCF0C7D7D95 -:10C28000C3C3414100000000200000005FFC5F0CC0 -:10C290000100AB001F1FFF140000000000000000A1 +:10C23000303000F0000000000000000000000000AE +:10C2400000000000000F553C3A3A000F00000000CB +:10C2500028002855003C0055AA003C0000000000C2 +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C28000C8CBF8FB00000000000000000000000028 +:10C2900000000030000000000000000000FF000F60 :10C2A000000000000000000000000000000000008E :10C2B000000000000000000000000000000000007E -:10C2C00000000000000050503030E000C3000000CB -:10C2D0000000000000000000000000AA50503D05D2 -:10C2E0007D5500000000F5F5A0A0287D287D000008 -:10C2F00000000000000000000000003C003CCF0CEB -:10C300004141C3C3C3C3080000000000000050FC4B -:10C31000500C01000100141414140000000000006F -:10C32000000000000000000000000000000000000D +:10C2C000000000000000FF0F35353CAAF0FF000021 +:10C2D0000000F03C003C3030F000F0003C0000007A +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C300000000080B383B00000000000000000000A7 +:10C31000000000C00000000000000000000000005D +:10C32000000F3C3CF0F00000800000000000000026 :10C3300000000000000000000000000000000000FD -:10C340000000000000000000505030302000C3000A -:10C3500000000000000000000000000014BE50506B -:10C360003D053C00000000005F5F0A0A2D782D7833 -:10C37000000021004002C000400020000100C082F7 -:10C3800010052008000404008980101000000080BF -:10C39000848020008800C010208588800100200053 -:10C3A0004105C0000500880004002000840004004E -:10C3B000000388002005880020008800210000205C -:10C3C00082002000200088000200050020002100DB -:10C3D000009020002002000000000011200000005A -:10C3E00020400000000088000000218000000000C4 -:10C3F000000000004084800105000000800240022F -:10C4000020030002410041001000404009410000AB -:10C4100000104010000000C00001000200024002B5 -:10C420008000080000000200000020000000000062 -:10C430000000000000000000000000000000A090CC -:10C440000001000040000000040080000200000025 -:10C450000402001141001000100000004000000024 -:10C4600000000000000000000002000020040000A6 -:10C470000002000002000000000010001000020096 -:10C4800000000800880000000200020000002000F8 -:10C49000020000000410020300008210400040006F -:10C4A000000008080900010001000000052000004C -:10C4B0000000020000000240041000100000048090 -:10C4C0000420000000000510200001408220000030 -:10C4D0002010000020800000200020008408008040 -:10C4E000040000080000020002000040840903C0AC -:10C4F000020008000241000000000000A0088000C7 -:10C5000080000000800040000000000000000000EB -:10C51000400000080000000180000000401184007D -:10C52000808800000009A000208420000004A001F1 -:10C5300000000004808400008000008200010000F0 -:10C540000020000100000010080180002089200167 -:10C5500000008000000082100000000000000000C9 -:10C5600000040000000000000000000000080000BF -:10C57000A040000080080000000490000000C000FF -:10C58000A00002000000A00082000020C000A00067 -:10C590002000C00020001000C004A000A000000087 -:10C5A0000000000041000021000500000000000024 -:10C5B0000005000900000008000000210009092111 -:10C5C0000000000000000000902100050003C008EA -:10C5D00000000008001100000021A0000000080871 -:10C5E00020002004C00000400040904100000805E9 -:10C5F000840382000000000000080500000000C065 -:10C6000009840400A00810002102080000000800AE -:10C610000000880011000500000800000000000074 -:10C620000400000200004090080209000000000021 -:10C630000000000021000000200000000010001099 -:10C6400008100010000011000300000000000000AE -:10C650000000000010A1410041A003A0210005003E -:10C660008308412088000000030000A00084080027 -:10C6700083000300008208A000000000C0009011A9 -:10C68000C10201208200020002000104A002C000D9 -:10C69000C0001020000040008400000000001000D6 -:10C6A0000010102000080000204000400900000990 -:10C6B000C000000010A000C0830901200000A009F4 -:10C6C000000210400203A00000000000C0000010A3 -:10C6D000A000082001408220004104000410A005B1 -:10C6E0008820080508408280011100001010000019 -:10C6F00000000800101000200820080000200000A2 -:10C700002100200108010300800011004001000009 -:10C71000000003000400000000000800000000000A -:10C72000410808850000410008888000410004009D -:10C7300003000000100000041005040020080000A1 -:10C740000000004041008482080000000400000056 -:10C750000082000011A120900008110000100801C3 -:10C7600000000000000000200304080010000091F9 -:10C77000410000020000000021000800000000004D -:10C780008400A000410040000000080020000800D4 -:10C7900040008200A0000808840008002000040077 -:10C7A00082008200900082031000C0218204A00059 -:10C7B00000000000010000020000004000111040D5 -:10C7C0000000081100000000000400210000824168 -:10C7D000090500000900098020200803000000046A -:10C7E00009040003A000C0040320C002C000A00090 -:10C7F00000400000001000000100000000000040A8 -:10C80000880000001020A002000209000000830040 -:10C81000910011A02008000000020802000080849E -:10C820000504412005004088400000000000000190 -:10C8300000000000080002A0088800000004008832 -:10C84000000000002000110400040804028200021D -:10C85000212004000082C08240022100000220004A -:10C8600000A1020404902100418888840591000001 -:10C870000040204004880089050408900000210041 -:10C8800000002100C00082000000C0022100020060 -:10C89000820008088202A0049000880020008280A4 -:10C8A000900000804000000000020800A02100006D -:10C8B000000441000021080000080005404100007C -:10C8C0000580002000000405000204410003000868 -:10C8D000080000000221000040000021100309218F -:10C8E000C000000800419000A0024000C000840287 -:10C8F000A0000085A0084000880004044000000952 -:10C900002000842000001000000021041000A0007E -:10C910008000000080000000080000000802808203 -:10C9200000044100000485000000100041000000E8 -:10C9300000000085A00000000800100008000000B2 -:10C940002100A004002100000400000021C000001C -:10C9500000022004000020000000A10008848000E4 -:10C9600020004100001000000000008203000000D1 -:10C9700000004000001020900800000000000800A7 -:10C9800000040000000000000000C00000000000E3 -:10C990000000110082000000000000000000000004 -:10C9A0000285A0040004828208010000000010013A -:10C9B000000000009000000000820190842000A090 -:10C9C000008800100004001000004000000000007B -:10C9D00088000010909000A082A040C0900000004D -:10C9E00008C0890110000000A000401090040082DF -:10C9F000900282909005008290050240900400828F -:10CA000090048800000000004000000000001000BA -:10CA100000000000900090000000000000000000F6 -:10CA200000008010002010208020800800100020CE -:10CA3000802011411121C003000000000800820085 -:10CA40000080200000804100000000008000000005 -:10CA500000000000000080800900800080808000CD -:10CA600000008000A041A1110041000580800080ED -:10CA700003800380A00400C0088300A0858000809C -:10CA800000800080800000001000000020001000E6 -:10CA900008050403200309000503C180000000000D -:10CAA000000000000040000380088000000000003B -:10CAB00000008000090000001108080203100203B2 -:10CAC00010031180004000048020808000000000DE -:10CAD00000100011000000008008000080008000AD -:10CAE00083201185808040000010A08041038000D9 -:10CAF000000400830000800200210080000000008C -:10CB00000021002000000004000080008000408818 -:10CB100089000100A001830040009100C1A0000035 -:10CB2000000000000000A000908404C104C0820046 -:10CB300010000088C0000000000001000101000199 -:10CB4000000001A000021001909010119008000058 -:10CB5000000000020002000000001001A000900090 -:10CB6000080010000483088811C02002851091116C -:10CB70000400900240080884840090A0900840C0FF -:10CB80004000900404842084A001A000040004005C -:10CB9000000000000000000000012000080000016B -:10CBA0000000000000000000C1A002904004C0048A -:10CBB00000040090000200100000000101010100CB -:10CBC00010002000A001040009000800A0001000CF -:10CBD000000100100000009000C09040020890A0EA -:10CBE00000A004080010A004400200880088829180 -:10CBF00000C0A10400900240C020058201908490F2 -:10CC0000032003400090080288200040008808A00C -:10CC100000C0000000000000000000408041000350 -:10CC200003400000000000000000C000A1000880D8 -:10CC300082800080040010800000000200020220B8 -:10CC4000100980050041800880114100800000002B -:10CC500009000001008000000000008080800000CA -:10CC60008000000000910080800000800011098594 -:10CC700041A104804180000000008000C1800200CA -:10CC800091008400C10000008080000000800080CE -:10CC90000000008041000400210020040083008087 -:10CCA0000080000400000000000000008002000579 -:10CCB000800080000002800000800000418421008C -:10CCC0000400111180008000000000028000800834 -:10CCD00000000000000180000000000080008002D1 -:10CCE000008200000000C191048041000020820207 -:10CCF000890009000800804080A0000300000003B4 -:10CD00000084008000800020008280000000000578 -:10CD10000000000000000120004001400101000867 -:10CD20000004008400000000000000000000040176 -:10CD300082A002820200000002104040820001C076 -:10CD4000000000000101C010A000200088011000B8 -:10CD500090881010100000010800880020000800D2 -:10CD60009001A041A0A04000C1C0001084040401B3 -:10CD70001000828203C008000800200304824000E3 -:10CD80008200A020040488024001A0854082400067 -:10CD90000000000000000000000600E007000000A6 -:10CDA000000000E0000000000000000000000000A3 -:10CDB000000000E00700820A000000000000000000 -:10CDC000000000E000004200000000E0070000005A -:10CDD000000000E00700420000000000000000002A -:10CDE0000000810000E007000000840A00E0070066 -:10CDF0006000840000E00700000000000000070061 -:10CE00004806000000E0070048000000000007009E -:10CE10004800008100E00700000000000000000062 +:10C340000000000000000000F00035353CAAF000BD +:10C3500000000000F03C003C3030F000F0003C00F9 +:10C3600000000000000000000000000000000000CD +:10C370002000200088008800110020002000028298 +:10C3800004088400080000002000040088008805DC +:10C3900011002088C000408290008800840020089E +:10C3A00005002080C100898040002000200020007E +:10C3B0000003200020002000844088004000880006 +:10C3C0002008008020002100200000002000040040 +:10C3D0000484400020008800880020000500A000A0 +:10C3E00020000003200288004000C0002000200040 +:10C3F0008800000000000000000010004100400024 +:10C4000010030900000200000000400000020002CA +:10C410002100400041412000801120000000400028 +:10C42000000020000404200020104102000004024B +:10C4300009020000404000401000100000002000F1 +:10C44000000200822002400010021100410010048E +:10C45000100000201000000010C0000000000420A8 +:10C4600040004002400241000000000200020002C1 +:10C470000040200202000400000020100000000024 +:10C48000400000000200040000000009020000005B +:10C490008200000040001000030090100000000027 +:10C4A0000000000001000000000402020000000083 +:10C4B0000000000400000100010001000300000072 +:10C4C0000200000000000000000000000000020068 +:10C4D00002000000002002000200000040100220C4 +:10C4E000028002000220840002000000020002001C +:10C4F00000008400000004080000000000080000A4 +:10C50000000080000408008400080000008400840B +:10C510000000410800088008C1881004201109109B +:10C520000008000000102008008800050005000039 +:10C5300000000084000800000208040004088400D1 +:10C5400000000010000000100088000800000984AE +:10C550000000000000840009000840000082030081 +:10C560000001002000400041000000080000000021 +:10C5700009000900000000C00000000800000021C0 +:10C580000808000800000040000000098800880931 +:10C590000011000000008800004100401009000563 +:10C5A00000030000000000028800000000000000FE +:10C5B0000000100000080004000000000141840099 +:10C5C0000000400000080008000000000020880073 +:10C5D0000800A000100210801000080000000000F9 +:10C5E0004005210088008420008040004000200099 +:10C5F000400000004000880088000010000000C0DB +:10C60000090400000084400000020090404000A0A7 +:10C6100011000088000000000000410009018004B2 +:10C6200005002100050003000300210000000300B5 +:10C6300003000000000000000501000000000200EF +:10C6400000000384040009A008000082000000909C +:10C65000100010C008000001410400000500410066 +:10C66000400020000490000000010020050000A010 +:10C670000020099000000000030000088211000063 +:10C68000000000020000004004400800000000100C +:10C6900000000800040008000800C000A04140415C +:10C6A000C120820000000800900084008200A000E9 +:10C6B00040001004080082008402010000000020F5 +:10C6C00000418320100908000000A00000000000C5 +:10C6D0000000820004008200840090000800000036 +:10C6E000000008001000840210000400A0000000F8 +:10C6F0000400080004020000040000000000000024 +:10C70000000000000800000000000300000000100E +:10C710000000000000000800050000C0000040000C +:10C720002100100800004000000000A000004000B0 +:10C7300000080800000100020000000020000000C6 +:10C7400021010000020008000000000000000000BD +:10C750004100000000000000000000000000000098 +:10C7600000000000000000004000080083000000FE +:10C7700000000000000000000000000000000000B9 +:10C780000000000010080000000000000000010090 +:10C7900008200000000000080000900008000821A8 +:10C7A0000000000000000000000040000800100031 +:10C7B0000800C00000000408009101001080C08043 +:10C7C0000000000004000000000000000400000061 +:10C7D0000000000000000411080020000180080093 +:10C7E00001800000000000000000000000000000C8 +:10C7F0000000000000000000820000000000C000F7 +:10C800000000000000A00800000000002000400020 +:10C81000408405000200020021880000110000840D +:10C8200000000000000000000084059000000000EF +:10C83000004010C003000300030011042020210465 +:10C8400005040000000002A00088000003000300AF +:10C8500000000020009005400500050080841004C1 +:10C86000412010044000210009204100040005007F +:10C870000984038800000000008808040000000408 +:10C8800000000000000000000000000000000000A8 +:10C8900000004080000300210008000284004000E6 +:10C8A0000000000009000000000801101000100046 +:10C8B00000000021100000001000000040000021D6 +:10C8C0000000100000000000000090000000C00008 +:10C8D000000000000009200000002000000000000F +:10C8E0009000000000080011000000000800000097 +:10C8F0000000000000080000000004080000000024 +:10C900000200A00000000000000000000000000481 +:10C91000000000908202040040900000210000000E +:10C92000000000C0008440900000110140010000A0 +:10C93000050000000000080000A000000900000041 +:10C9400000000000000000000000000020000000C7 +:10C9500000000000000000000000000000000000D7 +:10C9600000040000000000010000000000000000C2 +:10C9700000000000000000000000000000000000B7 +:10C980000000200000042000000000000000000063 +:10C990000000000010000000000000000000000087 +:10C9A0000000000000000000000101010001000083 +:10C9B00000000000000000000000000083000000F4 +:10C9C0000000000000000000000020C00000002067 +:10C9D0000000000000000000000000010000000155 +:10C9E00000010000A0001000000000000000000096 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000011008000000000000000000085 +:10CA20000000000000000000000000412121004043 +:10CA300000000000000000000000000009001000DD +:10CA40000000050000004100000000000080000020 +:10CA50000000000000000000000000000041000095 +:10CA60000008001000008300050000000000000026 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA900000000000040002000500418000000000CA +:10CAA0000000000000000000000000000000000086 +:10CAB00000008010000000000000000000030000E3 +:10CAC000800800000003000000400000000000009B +:10CAD0000040000080000000000000000000000096 +:10CAE0000000000000000041000000400041000084 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB100000000000000001000000010001A0000072 +:10CB20000000000000000000000000000000A090D5 +:10CB30000000A000C0000000000000000000100085 +:10CB40002000100020000000000000000000000095 +:10CB5000900000000000C000000000000000000085 +:10CB60000000000000000000000100000000009133 +:10CB700000000000000000000000004000000088ED +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000010000000193 +:10CBA0000000000000000000000000000000000085 +:10CBB0000001000000000001000000000000000073 +:10CBC000000102010001000100000200000001005C +:10CBD000000040020000002004C00000000000002F +:10CBE00000000000000001000000000184000000BF +:10CBF000000100000000000000000000000008002C +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000030008000900 +:10CC200000100000000000000000000000000000F4 +:10CC30000000002004044141004100000000000009 +:10CC400000000008801000030808000080000000B9 +:10CC50004100000000800000000080800000000013 +:10CC6000000000000000210010000000000280030E +:10CC70000010004100000000000000004000000023 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000080000014 +:10CCA000000000080000000000000000000000007C +:10CCB00000000000030403004080090000000000A1 +:10CCC000000000000002001100000000000200004F +:10CCD00000000000000080050003000000000000CC +:10CCE000000000000000000500000000008041047A +:10CCF0000820080000000000000000000000000202 +:10CD000000400000000000000000000000000000E3 +:10CD1000000000000000000000000000000000080B +:10CD20000000000000010000000000000000000002 +:10CD300000000000000000000004004000000000AF +:10CD40000000000000000001000300880000000156 +:10CD50000000000000000000C000202090A00000A3 +:10CD600000000000000000000000000000000008BB +:10CD700001010000010000000000000000000000B0 +:10CD800000010000000000000000000000000000A2 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000810000E00000000002 +:10CDD000810000E0000000820000008100000701E7 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000818100E007008206000000000000C2 +:10CE0000000000810000070000000000000000009A +:10CE10000000000000000000000000000000000012 :10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000E626E626624632 -:10CE4000F3CF0000000000000000101000F0000010 -:10CE500000002C2030300000000000000000000026 -:10CE60003C006600FCFFFCF0F0F0FF3CC3C36666CC -:10CE7000FFFF000000090009F330F0F0000000009F +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000FF00F0E3 +:10CE60000066003C00000000000000000000000020 +:10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 -:10CE900000000000000000000C0CFF60000000001B +:10CE90000000000000000000000000000000000092 :10CEA0000000000000000000000000000000000082 -:10CEB000000000000000000000000000E626E6265A -:10CEC0009189F3CF00000000000000000000000086 -:10CED000000000002C200000000000000000000006 -:10CEE0000002000066000C0F0C00F0F0003C0F0F79 -:10CEF0000000FFFF100000010008F330666600002C +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE00000F00066003C00000000000000000000B0 +:10CEF0000000000000000000000000000000000032 :10CF00000000000000000000000000000000000021 -:10CF1000000000000000000000000C0C0060000099 +:10CF10000000000000000000000000000000000011 :10CF20000000000000000000000000000000000001 -:10CF300000000000000002102000008810840000A3 +:10CF300000000000000000000000000000000000F1 :10CF400000000000000000000000000000000000E1 :10CF500000000000000000000000000000000000D1 :10CF600000000000000000000000000000000000C1 :10CF700000000000000000000000000000000000B1 -:10CF80000210200000881084021020000088108405 -:10CF90000210200000881084000000000000000043 -:10CFA0000000000000007E7E000000000000000085 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 :10CFB0000000000000000000000000000000000071 -:10CFC000000000004E4E3F3F000000000000000047 -:10CFD000FBFBFB000000000001420166000FF0FFB8 -:10CFE0000000000000000000000003C33FFF0F0F1F -:10CFF0000F0FC3C342422065000000000000000084 -:10D00000C3C300000000000000000000000000009A -:10D010000000000000000000000000000000FF030E -:10D02000C3000000000000007C7C0000000008003D -:10D0300004000000000000000000000000000000EC -:10D040000000000000004E4E03030000000000003E -:10D050000000FFFFFF000000000001000124363641 -:10D0600036360000000000000000000000C03CFC5C -:10D070000066FF6600004242000000000000000061 -:10D0800024E424E400000000000000000000000090 +:10CFC0000000000000000018000000000000000049 +:10CFD00000000000FFFFFFFF000000000000000055 +:10CFE0000000F0F0606066661818000000000000A5 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000240000000000000000BC +:10D05000000000000000020202C300000000000007 +:10D060000000000000006060FFFF181800000000D2 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 :10D090000000000000000000000000000000000090 -:10D0A000FF03C30000610027000D000000610007BE -:10D0B00000090005000000000000000000610007FA -:10D0C000001D000000610006000D00050061000762 -:10D0D000000D0000A0610007000D00000561300F89 -:10D0E000050D00A10000000030000090000000616C -:10D0F000000F800D0000A0612034C0090000006016 -:10D100003000C0410001000040000000000000614C -:10D110000007000D0000000000000000000000619A -:10D120000037004D00013D3DFF05000000000000FC -:10D130000000BE3CC0C00000000000000000000075 -:10D140000000000000000000000000000000FF00E0 -:10D150003C3C5FAF1C2C00000000000000200000E1 +:10D0A0000000000000000000000000000061000619 +:10D0B000000D000000000000000000000000000063 +:10D0C0000000000000610006000D000500000000E7 +:10D0D0000000000000610007800D000000610007F3 +:10D0E000800D000000001000202800400008000013 +:10D0F00000000000000000610006000D000000615B +:10D10000002F800800A000000000000000000500C3 +:10D110000A28050000A00000000000000000000038 +:10D1200000000000000000000000000000000000FF +:10D130000000AA00AA00000000000000000000009B +:10D1400000000000000000000008000303000000D1 +:10D1500000000000000000000000303FFAFA00006C :10D1600000000000000000000000000000000000BF -:10D170000000000000000000F000000FC3C3C3C3A4 -:10D18000FF575757C0FFC0FF00000000000000001D +:10D1700000000000000000000000000000000000AF +:10D18000FF000F0F3035F5F5000000000000000033 :10D19000000000000000000000000000000000008F -:10D1A000000000000000000005050505000000006B -:10D1B000000000008200C0C000000000000000006D +:10D1A000000000000000000000000000000000007F +:10D1B00000000000F03C003C000000000000000007 :10D1C000000000000000000000000000000000005F -:10D1D0003C3C0F0F5FAF43830000000000000000E5 +:10D1D000000000000000000000000000303F0A0ACC :10D1E000000000000000000000000000000000003F -:10D1F00000000000000000000000F000000FC3C3AA -:10D20000C3C3FF5D5D5D00FF00FF00000000000084 +:10D1F000000000000000000000000000000000002F +:10D2000000000000000030350505000000000000AF :10D21000000000000000000000000000000000000E -:10D220000000000000000000000000000000A0E17D -:10D23000555500000000A0FF28FF0000000000007E -:10D2400000000C00040000000000FCA8F3A2000095 -:10D250000000FF00FF00AAFF000000000000D77DD3 -:10D26000D07000000000000000000000000000007E -:10D2700000000000000000000000000000000000AE -:10D28000FFFFFFFF575D03033CFF00C300000000EA -:10D2900000000000AF7DAF2800000000000000008B +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000FF30FF000000000000C0 +:10D24000000000000000000000005000000000008E +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D270000000000000000000000000000000AAAA5A +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E :10D2A000000000000000000000000000000000007E -:10D2B000A0E1000000000000A0A02828000000005D -:10D2C000000000000C00000000000000A8FCA2F319 -:10D2D00000000000FF0FF000EBFFC3C300000000E0 -:10D2E000D77D070D000000000000000000000000D6 -:10D2F000000000000000000000000000000000002E -:10D300000000F5FFF5FF030C03033CFF00C3000022 -:10D31000000000000000057D05280000000000005E -:10D3200000000000000000000000000000002000DD -:10D330000800A00020102080848020008800881031 -:10D3400001002005820020042000410805052080FE -:10D3500000002000C0002004000420040404200475 -:10D36000C000200488040400200220038800000379 -:10D370000400848488002004208400032004200406 -:10D3800085048800A000040440084000208000803C -:10D3900088002011000020804000000220002000B2 -:10D3A0000400208000002000000020000000000099 -:10D3B0002100C000200041014104000410002000B1 -:10D3C00000400200000000000891400020202000E2 -:10D3D000402020A04000000040900002000010000B -:10D3E0001000000000000400050000002100000003 -:10D3F0000000000040101000044021040000400024 -:10D40000090040000000004000020041C10000028D -:10D41000091000000040000004020000000040006D -:10D4200009004000000200000000000000000000B1 -:10D43000000000000040000004020008000000801E -:10D4400000800404000085050041020005002189D8 -:10D45000A00001000020020004000000000088007D -:10D46000000001030110400000000000000900005E -:10D4700000000000000400000000000000020200A4 -:10D4800000100800040010000400000000000880E4 -:10D49000020000900000000000004010000000406A -:10D4A00000000000002100800000000000000000DB -:10D4B000000002000008000141840001000409008E -:10D4C00000040404A0010000200200000000C000CD -:10D4D00010080002080200090008200000080000EF -:10D4E00000000000100840058400008420080000AF -:10D4F00000020008000000004190001000000483BA -:10D5000000100000008800880400000400000002F1 -:10D5100084020000001100000000000080000000F4 -:10D52000000800000010000000020082000000005F -:10D53000008800000400C0210000100000008400EA -:10D5400000008400400040889003000400000108AF -:10D55000822101004008400000000021002100005D -:10D560000008002000050002000282030002000003 -:10D570000000000000020000000000090800002177 -:10D5800090040000020000080020C00000000021FC -:10D59000000004000000000000008800C000C0027D -:10D5A00004089000A00000214000900000008200CC -:10D5B0004000200084000008000000080000210056 -:10D5C00000000984210400A0412011020500030885 -:10D5D0002002090004002188009000A00000000043 -:10D5E00000824110418203A00302000000000002FB -:10D5F00000A00000000002840000000000840088F9 -:10D60000008800C0030800000002000008080000B5 -:10D61000000021002100000420C008C000000020FC -:10D620000501000000002190050000000000082016 -:10D6300000000300000000000000A00000004008FF -:10D64000C000040084000100000040000804022023 -:10D6500001008580A10040911100A0001000C100D0 -:10D660001000C000100000000811000800000400B5 -:10D6700000008200040400000841000000000400D3 -:10D6800008001000000982110009040008000000D1 -:10D690000008C0040800000004000800C000A0103A -:10D6A0000000C0000800041000000800080082000C -:10D6B00000008200080082000000000000A0008836 -:10D6C00002000000000000000800110000820009B4 -:10D6D0008289040008020400A00404000000410044 -:10D6E00004840000000040000000000011820300DC -:10D6F00021080800098811200000000000000040F7 -:10D700000088000011900300000041000000008824 -:10D71000418808C0000008000000002009000084C3 -:10D72000001000000000008800C0008800200000F9 -:10D7300000020000210000000900000000000000BD -:10D740000000844000000010080000000080080075 -:10D75000020000200200100220001000A0210100A1 -:10D76000A000A000400082028200100040000000E3 -:10D77000004100044091004000080000002100002A -:10D780000000000000000800A000000008000000E9 -:10D790000000040082088200C0210900012004006A -:10D7A00000040002C000000090000000000008001B -:10D7B00000008200000000000000000000001005D2 -:10D7C000050000040404000010842100000004048B -:10D7D0000000800000018000030180908084080028 -:10D7E00004000088000480A000000000050000087C -:10D7F00005084100000388102000000241040020B9 -:10D80000000020A021040002000000000020000011 -:10D8100000020000000000000000000040081000AE -:10D820000000210000002100008803842100030083 -:10D8300005002184004021040000000000000800D1 -:10D84000040000008203100001000000000000003E -:10D85000002140840403000411004000900008A04F -:10D86000008000210020002100200005080240095E -:10D870000005C0410100010000410000040000005B -:10D880000002000008000000000004022000002048 -:10D8900000110000104108094000082108008280A2 -:10D8A0000400020400109020081100058211C0003D -:10D8B000820082082002000000000000A002000098 -:10D8C00000038221002040000000049005000000B9 -:10D8D00000200202004180820485200280000000B6 -:10D8E0000809401000004101000200010010080476 -:10D8F000111000000000208204880884212000020A -:10D9000000002090000000200200408402008000FF -:10D910000084110040000088008805000000208875 -:10D9200000020400091100102100210040C0110074 -:10D93000000000000900800000000000000000005E -:10D9400000000000000000080088A002000208019A -:10D9500000002000C0000000000000A00100000145 -:10D96000010088000101000001001000000000001B -:10D970000000000000000000018884880002000010 +:10D2B0000000000000000000AAAA303000000000BA +:10D2C000000000000000000000000000000050000E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F0000000000000000000000000000000C0C0AE +:10D30000FCFC000000000000000000000000000025 +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000004004B9 +:10D3300020042000200008002000200084000100BC +:10D3400020008408000000801080A000200205005A +:10D350004040408441024000200004002000008240 +:10D360002108048201820400000088008800000374 +:10D370008800208420008204200000002000400853 +:10D3800000000004400088828400040020000400A3 +:10D390000100C00020002080880440048800200094 +:10D3A000001184002000884020820408200020040E +:10D3B0001000110021000000109000000002090080 +:10D3C00004008000100040904004400440409091D0 +:10D3D0000402000110200405050000C0C10000C0C7 +:10D3E0004040840280400202400041024020400050 +:10D3F00000004000001000002000040000001002A7 +:10D4000041C0400020022004100220000900000258 +:10D410000902088240022102401000000091100021 +:10D420000002000241042100200200104104000219 +:10D4300000020000000000000200000000000040A8 +:10D4400082100000008003000102000000000200C2 +:10D450000200004000400000000004000100014004 +:10D4600004000280004000000200000000000000F4 +:10D47000020000000000000002000000020400049E +:10D480000004820400000000020000000000001000 +:10D4900002000200000082000200020002000200FE +:10D4A000000002800041820002000400009002009F +:10D4B0000240020000000000000000080000001010 +:10D4C000000900080000004004002085000800005A +:10D4D0002088048200000000000000020008040010 +:10D4E00020108010000441012004000409080000FD +:10D4F0000000000800000000000000000008000913 +:10D5000000010501000100000008000000080008FB +:10D5100000000000000800000000000000840084FB +:10D52000000000000304000000040900840800104B +:10D530000000C00004088800000040000021000036 +:10D54000000000000000858020008520002084006D +:10D5500088009000C0001000052120002008000372 +:10D560000041000900000111900801048200000040 +:10D5700000004000A00000000000000000000000CB +:10D58000C00089000100A1000000000040008400EC +:10D5900000000400200084000000400000000000A3 +:10D5A00000000400C08040000000000004000021D2 +:10D5B00040081000880000000000040000A00000E7 +:10D5C0000300000000000000202089002001000965 +:10D5D00000000800040008001000A000800089007E +:10D5E0000000210021102188040000002001030216 +:10D5F00041000000410000000000000000000000A9 +:10D6000000000000200020002000040003000300B0 +:10D61000004003000000000402000800418209826B +:10D6200000000800090000040004110000000000D0 +:10D630000000004000200900000000008200C0003F +:10D640001000001000000000C000840000009000E6 +:10D6500008000800A000080000008280C000000050 +:10D660008200080000000402C020204182800000E7 +:10D6700010000000080040000400000000008200CC +:10D6800004000400A000820000008200000082006C +:10D6900082001000100088001000000084000800C4 +:10D6A0008200820004000000080020008200820046 +:10D6B00084008400820008000020C00000000000F8 +:10D6C00000000400009009000000000000080000B5 +:10D6D000112000040000000441100000400441003B +:10D6E0000088050000002100418200008000410404 +:10D6F00041004100000000000000000000000000A8 +:10D7000000000020000000000000030008000000EE +:10D7100021000000000000000000000000000000E8 +:10D720000000410000000000000000008000000038 +:10D730000000000000000000000000002000400089 +:10D740000000000000009000000000000000410008 +:10D75000080002800400000300219100C0080800B6 +:10D760000000080208048200820408038400000408 +:10D7700008080000890400110000080000000000F3 +:10D780000000C000000000000100000000000000D8 +:10D79000000000000000000000050000402008001C +:10D7A00000000000000002000040890300000000AB +:10D7B0008408000000000480820001008200000054 +:10D7C00000000000100000000008000004880000B5 +:10D7D00020201000C004800402000004200000008B +:10D7E00004000000000103112100000100000000FE +:10D7F00003900590000004911100000000000090CB +:10D8000000000000000005000320200000000000D0 +:10D8100000004000400005000082000000002000E1 +:10D8200000900000050000000000400420000000FF +:10D83000009000000000100000200000080005001B +:10D84000030000000000000000008900000000004C +:10D8500088002000040008008200010000852021CB +:10D860008405202008210800082000000003000291 +:10D870000000000000000000200800000000000080 +:10D88000000000000800000900004000000008003F +:10D890000000000000000000000004000000000084 +:10D8A0000400A0000008820000000000000000004A +:10D8B0000000000000000000000000000000000068 +:10D8C00000000000000000000000000008C0000090 +:10D8D000000000000000800003001100208400040C +:10D8E00080000910800511000000110100004000B7 +:10D8F0000000080000000000000091000502000088 +:10D900000000000000000000000000000000000215 +:10D9100000000000400000000000000000000000C7 +:10D9200000000000000000000000210000000400D2 +:10D9300000000000001000000400000200000400CD +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000010209090C0820210010022 +:10D960000100000000000000210140000001000053 +:10D9700082000200000002C00800108890900000A1 :10D980000000000000000000000000000000000097 -:10D990000000000100000000000000000000000185 -:10D9A00011A104000010C0040000010000000000EC -:10D9B00000000000000000000001010084010000E0 -:10D9C0000000000000000000000000000080008057 -:10D9D0000011410205208008000000001100110024 -:10D9E0000341050421102110000005008000000003 -:10D9F000000000000000000040002000C100000006 +:10D990000000000000000000000000001000000077 +:10D9A0000000000000000000000020000000000057 +:10D9B0000000000001000000000000000000000066 +:10D9C00000A000880002002000000000000000000D +:10D9D0000000000000000000200091000480808012 +:10D9E000400021004100000011402108890411106D +:10D9F0000000000085000000A0800300410000003E :10DA00000000000000000000000000000000000016 -:10DA100000000009000304030009001100030011C5 -:10DA2000094091C180030041809100000200000084 -:10DA3000000000000000000000000010100088112D -:10DA400000200000000000000000000000000000B6 -:10DA500080004180020020110808002080000002A0 -:10DA6000000002054010410989C10905208909000B -:10DA70000380000000000000000088801000820584 -:10DA8000C1100000000000000000000000000000C5 -:10DA90000000000000400000004000800000000086 -:10DAA00000000000850003419111410302001000B5 -:10DAB00003004000000000000000000000C0110052 -:10DAC000030209A100000000000000000000A00007 -:10DAD0000000C0020090000000010000000110C022 -:10DAE000000100842002C108849008050800090490 -:10DAF00040049008000000000000000002109000A8 -:10DB000090000983000000400000000000000000B9 -:10DB10000000000000000000000000010004000000 -:10DB200000000000000003904000A190830100006D -:10DB3000010000000000000000000000000000C024 -:10DB400000000001000300000000000000001000C1 -:10DB5000000100012000000200830082009101000A -:10DB60002000820201000001A1001000000000005E -:10DB700000000201000100000000000000000001A0 -:10DB8000040104002101000000000000000000006A -:10DB90000000000000000000000000000100000084 -:10DBA000000000000000000008104102890409087C -:10DBB0000000000002010000000000000000000062 -:10DBC000000000010801000100000000000000004A -:10DBD00000020010000208090080009041081111A5 -:10DBE000200080000000040000050803022002035A -:10DBF000400000400021000800000000000000007C -:10DC000000028011800341110000000000000000AC -:10DC10000000000000000000000000000000020002 -:10DC20000000000021001000000080008880838038 -:10DC30000580004100058021000500000000000073 -:10DC400000000010000383212020000000000000DD -:10DC50000000000000820000000000042011080005 -:10DC60000303004000100000008009880921408063 -:10DC700003110003002180000021000000000000CB -:10DC80000000104002101180101100000000000080 -:10DC90000000000000000000008000000000000004 -:10DCA00000000000000500000000000021890411B0 -:10DCB0000241841000000000000000080000000085 -:10DCC0000000000021800500400003020000000069 -:10DCD000000000000000008200A000000001000120 -:10DCE000010001010001400000000090900908C0FF -:10DCF00083028801021090A090A0020100000000A1 -:10DD000000000000008201820140000100000000CC -:10DD10000000000000000000000000C00000000043 -:10DD2000000000000000000000000000000021C111 -:10DD3000210109A0A0000020000000000001000057 -:10DD40000000000000000140000000000000000092 -:10DD500000000000000000000000070000000000BC -:10DD600000E000000012000000E0070000000000DA -:10DD700000E00700000600000000070000000000AF -:10DD8000000000000000000000E0070000060000A6 +:10DA1000000000000000400000000000080080003E +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000010000000000000000000D6 +:10DA40000000000000000080000000000000000056 +:10DA500000000000002000000000000500A1802060 +:10DA60008000100810800510044040101100904004 +:10DA7000038202004180204003830008000000036D +:10DA80008000000000800000000000000000000096 +:10DA90000000000000030000001000000000000073 +:10DAA0000000000000000000000000000000001066 +:10DAB00080808000000000000008000000000000DE +:10DAC0000000000000000000000000000000000056 +:10DAD000000000000000000000C0000090000808E6 +:10DAE000A088408401900102010001884041038820 +:10DAF000900089C001000084000000C10001000006 +:10DB00002089C000000000080000000000000000A4 +:10DB10000000000000000000000000010000000004 +:10DB200000000000000000000000000000000800ED +:10DB3000100082020400000000000000000000004D +:10DB4000000000000008000000000090000000003D +:10DB50000000000000000000000000000000A02104 +:10DB600002902090050300008800000100010101DF +:10DB700009004000000000010000080001008200D0 +:10DB80004008020100C10000000000000000000089 +:10DB900000000000000000000000900000000000F5 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000004000000000061 +:10DBC0000000000000000000880000000000C0000D +:10DBD0000000000000000000000000000000000045 +:10DBE000051000400010848800000020002108106B +:10DBF00010218203102011050002000500201109E8 +:10DC00000010004180400888000000000000000073 +:10DC10000000000000000000000000000000000004 +:10DC2000200000100005002000110000000000008E +:10DC30000000000000000000000000008000000064 +:10DC400003000000000000000000000000000000D1 +:10DC50000000000000000000000080000000000044 +:10DC60000000000480C18000800010052000050035 +:10DC7000051108044020058008200203202120000F +:10DC80000909800400A0000000000000000000005E +:10DC90000000000000000000008000000002000002 +:10DCA0000000000000000000000000000000000074 +:10DCB00000000000000000008000000000400000A4 +:10DCC000000000000002004000000000800400048A +:10DCD000000080000000000000000000C000A00064 +:10DCE00000000000900110A108840800010200005B +:10DCF00000000001000301910090000101000000FC +:10DD000000000000C0009011909000000000000092 +:10DD10000000000000000000000000C00000000142 +:10DD200000000000000000000000000000000000F3 +:10DD30000000000000002000848404400200000075 +:10DD40000000000000000001000000000000C00111 +:10DD5000A00100008800000000000000000000009A +:10DD6000000000000000818100E007004100810008 +:10DD700000E000000000818100E0070000210000B9 +:10DD800000E007000021818100E0070000000000A2 :10DD90000000000000000000000000000000004241 -:10DDA000820000E000000000000000000000000011 -:10DDB000480000E000004282000000000000000077 -:10DDC0000000000000000000000000E00000500023 -:10DDD0000000000000000000000000000000000043 -:10DDE000000000003F3F152A00FF000000FF000078 -:10DDF000F3F351A200000000B2B23CFF00000000AB -:10DE00000000000000000000000000000000000012 +:10DDA000810000E000000000000000000000000012 +:10DDB0000000000000000000000000000000000063 +:10DDC000810000E00000000000810000070000006A +:10DDD00000810000070000000000000000000000BB +:10DDE00000FFAAAA000000003C3C00FF838FB3BFE5 +:10DDF0000000000000000000000000000000000023 +:10DE000000000000000000000A0A000F00000000EF :10DE10000000000000000000000000000000000002 :10DE200000000000000000000000000000000000F2 -:10DE3000000000AA30AAEAEA40400000000000000A +:10DE300000000000000000000000FCFE3C3C000070 :10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 -:10DE6000000000000000CFCF458A00FF000000FF47 -:10DE70000000CFCF458A00000000B2B200C300000E -:10DE80000000000000000000000000000000000092 -:10DE90000000000000000002000000000000000080 +:10DE50000000551400410000000000000000000018 +:10DE600000000000000000000000F0F0AAAA808C72 +:10DE7000B0BC000000000000000000000000000036 +:10DE8000000000000000000000000A0A000FF0F08F +:10DE9000AAAA00000000000200000000000000002C :10DEA0000000000000000000000000000000000072 -:10DEB0000000000000AA3FAAAABE00140000000053 +:10DEB0000000000000000000000000003CBE3C3CF0 :10DEC0000000000000000000000000000000000052 -:10DED0000000000000000000000000001C000C001A -:10DEE00000005555000000000000000000000F0F6A -:10DEF00000000F0F0000000034F538FA00000000A9 -:10DF000054FC51F30000000000000000BC1CBC1CCD -:10DF1000CF8A8ACF0000000000000000000000004F +:10DED0000000000055140041000000000000000098 +:10DEE000000000000000000000000000FF0F3C5593 +:10DEF000F737C70700000000000000000000000026 +:10DF0000020EC2CE00000000000000000303C3C3E5 +:10DF10000000000000000000000000000000000001 :10DF200000000000000000000000000000000000F1 -:10DF30000000000000000F0F0F0FFF3CCF0C00008F -:10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000000000000C1 -:10DF600000000F0F0F0F0000000000000000000075 -:10DF70000F0F00000F0F00000000C1F5C2FA0000F3 -:10DF80000000A8FCA2F30000000000000000BC1C80 -:10DF9000BC1CF3A2A2F3000000000000000000007F +:10DF300000000000000000000000000000000000E1 +:10DF400000003C7F3C3F000000000000000000009B +:10DF500000000000000014153C3F0000000000001D +:10DF60000000000000000000000000000000000FA2 +:10DF70003C55F434C4040000000000000000000020 +:10DF80000000323EF2FE000000000000000003032B +:10DF90000000FF00555500000000000000000000D8 :10DFA0000000000000000000000000000000000071 -:10DFB0000000000000000000BEBE0000F330C300FF -:10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000000000000000041 -:10DFE0000061000E000D00A50061000100010000AD -:10DFF00015612A0F054D00A800610A0F050D00A04C -:10E0000005610A0E050D00A00000000000000000E0 -:10E010000061000F050D000000000000000000007E +:10DFB0000000000000000000000000000000000061 +:10DFC000000000003C7D3C3C000000000000000020 +:10DFD000000000000000000014143C3C00000000A1 +:10DFE0000000000000000000A00000000000000091 +:10DFF00085610A2F850D00A100610007800D0000DA +:10E0000005610A2F850D00A100610A0D050100A020 +:10E010001061202F804D000800000000000000006B :10E020000000000000000000000000610007800DFB -:10E03000000000610006000D000000610002800584 -:10E04000000000610006000D00000000000000005C -:10E05000000000610007000D00000000000000004B -:10E0600000000000000000FB04FF0F550F550A5F81 -:10E070005F5F0000000000000000AFAF7D2869096D -:10E08000096900000000000000A00000000000007E -:10E090000000CF0C7D7DF5C1C1F50000000000003F +:10E03000000000610006000D00000000000000006C +:10E040000000000000000000000000610007800DDB +:10E05000000000000028000000A010004028000080 +:10E0600000000000000000000000000000000000B0 +:10E070000000000000001717C300FFAA2D2DF000BC +:10E0800000007F6B57430FC500C5FFFF000C282819 +:10E09000F8280000000082C3C2C300000000000096 :10E0A0000000000000000000000000000000000070 -:10E0B000000000000000000000000000C30C000C85 -:10E0C0000000000000000000F330FF3C00000000F2 -:10E0D0000000000004F40404A1AB010B00000000E8 -:10E0E000000000000000000000FB04FF0F3C0F3C9C -:10E0F0000A0A5F0A000000000000000005057D28F4 -:10E10000FF0F0FFF000000000000000000000000F3 -:10E1100000000000CF0C41415F43435F000000005E +:10E0B00000000000000000003C3C3C3C0000000070 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F00000000000000000001717FF3C55002D2D08 +:10E10000FF0F00003E2A1602FFC5F0C5000C000CF0 +:10E110002828F828000000008282C2C20000000007 :10E1200000000000000000000000000000000000EF -:10E130000000000000000000000000000000C34DCF -:10E14000004D0000000000000000C300CF0C0000E4 -:10E15000000000000000F4F4F404F1FB515B000047 -:10E160000000000000000000000000000000FFF0C0 -:10E170003F303CF0AAF00000000000000000040462 -:10E18000140030F330F30000000000008020000095 -:10E1900000000000000000000000FAFC00F0000099 +:10E13000000000000000000000003CFCBEFC0000ED +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E1800000000ECE3EFEAFAFBE142828EBEB000021 +:10E1900000003030BA300000000000000000000035 :10E1A000000000000000000000000000000000006F -:10E1B0000F0F0F0F00000000FF553C0F0000000084 -:10E1C0003C0F55FFFCFCA0AF00000000AFC3A5C38F -:10E1D0000000000000000000C3C3000000A0F0A089 +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F :10E1E000000000000000000000000000000000002F -:10E1F000CFC00F003CF0AAF00000000000000000BB -:10E20000000000008282BEBE000000000000A0A04E -:10E210000000000000000000000000000AFC00F008 +:10E1F000000000000000000000000000000000001F +:10E200000000000002C232F20505BE1430F330F304 +:10E21000000000003030BA300000000000000000B4 :10E2200000000000000000000000000000000000EE -:10E2300000000F3C0F0F0000000000553C0F0000D5 -:10E2400000003C0F55000C0CA0AF00000000FFC305 -:10E25000F5C300000000000000000C0C0C0C0FAF18 -:10E26000FFAF00000000000000000000D6CE10024A +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E26000000000000000000000000000D6CE1002F8 :10E270000E9620B60000C02A472B4062DF5F0B22BB :10E28000FC21400312100200020C800800A80A00C2 :10E29000080220281004011100A10D40410181084D @@ -101957,685 +101957,685 @@ :10E2B00000000000001617084400000000080006D7 :10E2C000000000000000000000000000000000004E :10E2D000000000000000000000000000000000003E -:10E2E0000000000000000000000000002040A0002E -:10E2F00040000040A0002010840082C020002100C7 -:10E300002000880088002000200000000400000099 -:10E3100084044000008040800000408040002000D5 -:10E3200020000000200020800000400000032000AA -:10E3300004000400200400000004880840022000BB -:10E340000000200004042000840000002000408021 -:10E35000200020000000400000000000200000001D -:10E36000000020000000200000004104C0040491CF -:10E3700000008000210100004021404021034000B6 -:10E380000400050004004040004000400000200060 -:10E3900000004000092040028402000241200000E9 -:10E3A00000004000004000000002000000000000EB -:10E3B0004000004000000000400000010000000399 -:10E3C00000000000000080904000000005020200F4 -:10E3D000100400000000040000020000000200021F -:10E3E000400000000000000040000000C0014105A6 -:10E3F0000100400300000041040800000204010085 -:10E40000080009000000001005000000000809A035 -:10E41000890000000000020000000080034121008C -:10E420000010000000400000848088000100A0C0AF -:10E430000000201001000800021000000110000080 -:10E440000000000000000040024082000000004088 -:10E45000000002800200084082100000200000003E -:10E46000020008000000001000418200020021822A -:10E4700085C02000800800082000208200000000E5 -:10E48000400009040400000002C0C0000008058824 -:10E490000805200000820208828400820002100029 -:10E4A000200800080010000000080920410208C0F0 -:10E4B000000800008400408420C080000400200088 -:10E4C0000084000200C02000030080100000000053 -:10E4D00000000000040400000000000008008000AC -:10E4E00020080800000000000000030000000300F6 -:10E4F000C0054004004002030040840000410000C9 -:10E5000000008811A0000000002100210000000090 -:10E5100000080800400040004021200201030000E4 -:10E52000C011000000200000000300050002900060 -:10E5300004800020000000040080400420802004AB -:10E540000002050300050002002100090004000587 -:10E550000009000800002008002100008880000059 -:10E560002080101000000000004000008400000027 -:10E5700000000180A0000300C10009890000000420 -:10E580000000410000000500000005000000000040 -:10E5900000080000030000A0000802820000021032 -:10E5A000090000002000008500000000000000833A -:10E5B000418800020083000000010004008900047B -:10E5C0000001000020A0000000A002820200002044 -:10E5D0000000080000100900800400820090090279 -:10E5E0000000804000014100000000000200000027 -:10E5F0000088000040020800C10000400000200820 -:10E6000082000000902088408800884088008400B4 -:10E61000880001040900C000820009000000000415 -:10E62000080908000400080000008200C01004115E -:10E630002020880082202080000000402000000070 -:10E64000A00082008200C104C000C000A000C00081 -:10E65000000502000000000002000809001100206F -:10E660000800000000001000A000000000000000F2 -:10E670000000A00000000000080404020090110443 -:10E6800000092100000811C009840090110009C090 -:10E69000400021000401A00005080000200008003F -:10E6A00000841100004080002190038800000000D9 -:10E6B00021004084210011014002000011884184A2 -:10E6C0004188050041000082088321824000030048 -:10E6D00040000000A0C000000984A000000000006D -:10E6E0000004004000000084000021000000000041 -:10E6F00000000000000000000000200100000003F6 -:10E70000880004080009820000000000A008000042 -:10E71000100008080500C00000000400A0830005E8 -:10E720000091C004844140020000822108020410CC -:10E730000400C020820000100820A0000000A040BB -:10E7400002210002A0110000080010110800880337 -:10E75000A0110003000582021041A011080540002D -:10E7600000000811000000020080000000400000CE -:10E77000100000000010000008000000000004006D -:10E780000000002000000900000008000008000050 -:10E790000004000000002008090804048088050225 -:10E7A00003000504000100008001000000002101B9 -:10E7B000800085040005000000000001200000002A -:10E7C00000A0800000020090000080000000800097 -:10E7D00000000000000000000000090000A0850407 -:10E7E000400400008000000000000004040000015C -:10E7F000030000880000030000000000000000008B -:10E80000888000008200200004000000000000005A -:10E810008800000090008820090084009000848017 -:10E8200000030000A0808800840040024000828431 -:10E83000002120008800081020102000200920213D -:10E84000000040088804820040004100A009004008 -:10E850000804000388098841820582118200A0080B -:10E8600000088204080000410404000800040000BD -:10E87000000408000008000008000000000000007C -:10E8800000000320100000A0000000004100210053 -:10E890000800000409080000000084821100410003 -:10E8A00009044088008420040500000002010808D3 -:10E8B0000020000000000000000100C10000400432 -:10E8C00000C000000000030100008000A0840800D8 -:10E8D0000008000100000800008220000000000085 -:10E8E000000011404000A00005000004008200006C -:10E8F0000000040000000000000000000000000014 -:10E900000000030000C000000100000200C000047D -:10E9100010028890000000000000000088009000B5 -:10E92000010090000010080800090011404100A1FA -:10E930000041028900010001000000010000900078 -:10E94000400111010000010201850390000804113B -:10E9500041058882C002044000200020900440103D -:10E96000A0C0008882404110A00202408202400004 -:10E9700000000000C00000000000000000000000D7 -:10E9800000001000000020800000080000800080CF -:10E9900011000000008000000000000000000010D6 -:10E9A0008010080200050003802040100002804112 -:10E9B0000021044080400040002000200008110396 -:10E9C000A10908109003000004020388908809023E -:10E9D00080900805089080A0808000000000808062 -:10E9E0008380000000008000828009808880808011 -:10E9F000000000000800800000000000000000008F -:10EA000000002000C0000000110221002000900042 -:10EA1000000000008800C00000000080000000002E -:10EA20000008000280C00000004000030003000056 -:10EA3000000000000011008800000000000080803D -:10EA4000890040C00580C00000000004800280856D -:10EA500080080040000500110000800000000089CF -:10EA600080000000002180400080800980408020DC -:10EA70000000800000000000000000000000000016 -:10EA80000000030010001000400001A02000010061 -:10EA9000C1000800C000A0000800000000820000C3 -:10EAA000008402010208108282200000008900090F -:10EAB0000082008400000000000490001084040024 -:10EAC00008C002C0820502C08382000088200208BC -:10EAD000844002414001401004029004080000906C -:10EAE00000A0900040004004048890C0040004C0CE -:10EAF00004859082040084000400400000000000AF -:10EB000000000000000001000100000001000040C2 -:10EB1000400000C0002100000021A008000000000B -:10EB2000000000000090039011900010900005007C -:10EB30000100C000080201A00488000800000100D4 -:10EB40000800000001100010A00200A100018800D0 -:10EB5000840000001100C140A14011C0409102108A -:10EB6000000200900808C040004008040490C0045F -:10EB700000050404C09000020884002000A00000EA -:10EB80000000000000000000000000010000020082 -:10EB900000000000008000080011002105030000B3 -:10EBA0000000000000000500888091804080000087 -:10EBB00082000300850080004080910003800400F3 -:10EBC000080082000000020303A010202091000131 -:10EBD00000030521090304208811100908021111FE -:10EBE000800000000000800088000000808080001D -:10EBF0009184008900C0840900808000000000002A -:10EC000000000000000000000010000900212003A7 -:10EC1000C1C08441410000020000000300800010D8 -:10EC200000040021000000008003004180800000FB -:10EC30000000801100008000100020020400040089 -:10EC40000000000500800000411100880300111140 -:10EC500000012140108002000000000480A080809C -:10EC60000000000080000000000080208004808000 -:10EC70008000002080040080000000000080000070 -:10EC80000000000000000000000000800000000004 -:10EC90000020C1410301000000000020009000841A -:10ECA000000000000000000000000800108940047F -:10ECB0008800080010011000900001000001010010 -:10ECC000010000000082000400000902042140A0AD -:10ECD00009010001A10082020820100002002003A7 -:10ECE0000408820008001010880088000801044110 -:10ECF00002400200840182A020408800000000043D -:10ED000000A00000000000000000000000C00000A3 -:10ED100000000000000000E00700410000000000CB -:10ED2000070000000000000007000000000000E0F5 -:10ED300007004100000000E000000006000000E0C5 -:10ED400007000000000000000700000A000000E0CB -:10ED5000070000820000000000E00000000000004A -:10ED600000E0070042120000000007000000000061 -:10ED700000000700820A000000E00700820A00008D -:10ED800000E00000000A0000000000000000000099 -:10ED900000E00000410000FFFFFF0F0FFFFF000039 -:10EDA000000000FF00FF0000000000000000381C11 -:10EDB000F99F2C6F436F64640600000000000000A0 -:10EDC0000000200000000000000000000000263FBE -:10EDD00046CF00FC00C000007C704C4000000000EA -:10EDE0000000000000000000FE7EF66600240030F7 +:10E2E000000000000000000000000000000000002E +:10E2F00000400000000000002004000000000200B8 +:10E30000040004000000210004002002C0024008B4 +:10E31000820040008800000010001000020005008C +:10E32000A002020004008400400000040003828078 +:10E3300020004120892040004100210021042002CA +:10E340004000400040000000200020000000880045 +:10E35000202140008800000020022000C00320008F +:10E3600020002000C000000020000000000000028B +:10E370000000000000004000000400000000000257 +:10E3800080008002800040000400C00410054003AB +:10E390000001100010004002400004000500C00011 +:10E3A000820040018404400440020000002100007B +:10E3B000001040900441040300020402040204001F +:10E3C00010002090000205020000400240022100DF +:10E3D0004004000000400440004000400002409023 +:10E3E00040024002000204024102414000C0099084 +:10E3F000000000000040820000000082000000C019 +:10E40000000000000040A0C00000200000400040CC +:10E410000000100011000000408200000000000019 +:10E4200001008400854000400000840090000082CC +:10E430000000000000000420042004000000002070 +:10E440000010000000000040084002000200000030 +:10E450000010000000000000020002200200024044 +:10E460000000000000000010820000000200000018 +:10E47000000000C00000000000840084034103008D +:10E480000010040005000084000200000000058860 +:10E49000000000008002908800008003000000005F +:10E4A000001020004100020002840000000800006B +:10E4B00000410000000009008901A0C18008000897 +:10E4C00000090084000000000400040000000508AA +:10E4D0000000000020000900000000840009410441 +:10E4E00005052008090009000000020000000002E4 +:10E4F0000000000000000000000400008808000088 +:10E500008800004100009000000000080003014066 +:10E51000000011000005000000081002000888211A +:10E5200000000000010000008400000090000021B5 +:10E530000000002000000009000000000008412148 +:10E54000002000000020000000000000004000103B +:10E55000000040000021040000008200840001004F +:10E560000100110089400400400000004005400007 +:10E570004000820000000000400800000000092068 +:10E5800000000300000010000900410041040000E9 +:10E5900020010588040000000002400121912100B3 +:10E5A00021082184000020000900000000000082F2 +:10E5B0000004080000020000000000000000080045 +:10E5C0000400000140004001000000000000400085 +:10E5D00008200500000000000000002000000000EE +:10E5E00010041000A0002000000021001000020014 +:10E5F00000000000400000000000C000000000001B +:10E6000084000800C00000000900000000000800AD +:10E61000C004000483048484A080000000098300F7 +:10E62000900000008400A00000200820090909C013 +:10E630000000080000000800000000000000C0000A +:10E6400000000800820000008200040004000800AE +:10E650000800A000820202001000840010000000E8 +:10E6600000000004C00002001009A009040000001E +:10E670001000100000000800A00900C00000000801 +:10E680000000030000000000000002A000000800DD +:10E690000000000100014001000500020000000030 +:10E6A0004000000000C0080000002101000104003B +:10E6B00004050000410000004000000000000000D0 +:10E6C00008404100000000001100000000000000B0 +:10E6D0000300000000000000000000000000110026 +:10E6E00008000800200041008300800000000000B6 +:10E6F00000000000000000000000000000004000DA +:10E700000000820008000000900008000000820065 +:10E71000000440100020042120200080821100020B +:10E7200000414008200088008208820084008500A3 +:10E73000C0800080820000000000824000000000D5 +:10E7400000000000082100000000000000000000A0 +:10E750000000000000008200000000000000000037 +:10E7600000008200A0000480000000000000000003 +:10E770000000000000000000000000000000009009 +:10E7800000000000100000000000000000080590DC +:10E790002100008905A003018000852005200000DC +:10E7A000410205109182009000000000000805A0C1 +:10E7B00020044004000404000000000004000000E5 +:10E7C000000000000000040011000500000000002F +:10E7D0000000000000000000000000000000000039 +:10E7E00000004000000004000404030000000000DA +:10E7F0000000000000004100000003A00020000015 +:10E8000000410000000000058200840010000009A3 +:10E8100000002080000000850800000809090408A5 +:10E82000400010114009A01002404000C000C0008C +:10E8300001008400050400820000001100000004B3 +:10E8400000000020000000000005000000000000A3 +:10E8500000081000000000000000000000000000A0 +:10E860008200000000000800C00008002000000036 +:10E87000000000000000000008110000000000007F +:10E88000000800000000000000100082002004C00A +:10E890004000050000041100000400900000040086 +:10E8A000080080008000000021000000000011002E +:10E8B0000000020000200489002100000000000088 +:10E8C00000010000000000000000000000000090B7 +:10E8D00000000000000000004000000000000000F8 +:10E8E0000000000000000000000000000090800018 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E910000001000111018900040100000000010054 +:10E9200010000000010100000400000000010001CF +:10E930000000000088C00002900800010002008270 +:10E9400082840002000000000000000000000000BF +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000101A5 +:10E970000200000000000000000000000000000095 +:10E98000000000000000000000000000000008205F +:10E990000021001000108810210989100011114079 +:10E9A000214089080020204100218005000000103E +:10E9B00000080020090208A02191050300044080FE +:10E9C0002180050000800000100000000000000011 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F00004418303400800400000000000000000C4 +:10EA00000000000000000000000000000000000006 +:10EA10008000000000008009100003009141830481 +:10EA20004011028040022040000000000000000071 +:10EA30000000000000000000050321000320A009E1 +:10EA40000000009000000000000000000021008095 +:10EA50000000000000000040000000000000000076 +:10EA600000000000000000000000000000000000A6 +:10EA70000000080040200380410300000000000067 +:10EA80000000000000000000000000000000000086 +:10EA90000000020084000000C00089900000110006 +:10EAA000C100204020201101A0090000000000004A +:10EAB0000000000000000000000091201100000094 +:10EAC000C00000000002002000A0000000000000C4 +:10EAD00000020020000000200001001000000000E3 +:10EAE0000000000000000000000000000000000026 +:10EAF000000000000000010001880101000000008A +:10EB00000000000000000000000000000000000005 +:10EB10000000000000000100000000000001209142 +:10EB2000002101C0000141011100000000010101AC +:10EB3000000000010000000000000000400805087F +:10EB4000000001C0020100000000030000000000FE +:10EB500000008400000001000000C0000000000070 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000001000094 +:10EB80000000000000000000000000000000000085 +:10EB900000000000000000004000410000000021D3 +:10EBA0000490082110A0082190089020110900204D +:10EBB0000404414100410000100041000000002019 +:10EBC0009010034108880010000800400809000068 +:10EBD00000000000000000000800000080000000AD +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000004000030000004191 +:10EC00000000000000000000000000000000000004 +:10EC1000000000000000000021040200200010009D +:10EC20004005102010004040081105A02080030876 +:10EC300000040000000000000002000000000000CE +:10EC40008585082008009003800080008000000077 +:10EC50000000000000208000800000000020000074 +:10EC600000000000000000000000000000000000A4 +:10EC700000000000000000000000C1919000800032 +:10EC800088050000000000000000000000000000F7 +:10EC900000000000000000000000010000000084EF +:10ECA000010000A000210000000001050003004059 +:10ECB0000000000100000000000000010000000052 +:10ECC0000000C0A00909410004000800040002007F +:10ECD0000800000088008400020008000000000115 +:10ECE0000000000000000000000000000000000024 +:10ECF000000000000000000000000000C1912100A1 +:10ED000004000900000000000000000000000000F6 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000818100E007000000484200E090 +:10ED300007000000000000000000000000000000CC +:10ED400000000000484200E007000000000000E072 +:10ED5000000000000000000000000700000000119B +:10ED60000000070000060000000000000000000096 +:10ED7000000000000000000000000000000088000B +:10ED800000E007000000000000000000000000009C +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000F0006600000D +:10EDB0000000000000000000000000000000000053 +:10EDC00000000000000000F0003C06060C0C3F6F45 +:10EDD000306F0000000000003C3C3C3C00000000A4 +:10EDE0000000000000000000000000000000000023 :10EDF0000000000000000000000000000000000013 -:10EE000000000000FF0F3636000000000000000088 -:10EE1000000000000000000000FFFFFF0F0FFFFFD9 -:10EE20000000000000C300FF000000000000000020 -:10EE3000C183F99F1C9F839F04040600000000000B -:10EE400000000000000000000000000000000000C2 -:10EE5000193F89CF003C00000000030303030000BA -:10EE600000000000000000000000FE7EF6660024A6 +:10EE0000FFF07E7E00000000000000000000000017 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000F000668C +:10EE300000000000000000000000000000000000D2 +:10EE4000000000000000000000F0003C06060C0C72 +:10EE50003F603060000000000000FEFC7E3C0000CF +:10EE600000000000000000000000000000000000A2 :10EE70000000000000000000000000000000000092 -:10EE8000000000000000F000363600000000000026 +:10EE800000000F00424200000000000000000000EF :10EE90000000000000000000000000000000000072 :10EEA0000000000000000000000000000000000062 :10EEB0000000000000000000000000000000000052 :10EEC0000000000000000000000000000000000042 :10EED0000000000000000000000000000000000032 -:10EEE00000000000021020000088108400000000D4 -:10EEF0000000000002102000008810840210200092 -:10EF000000881084000000000000000000000000E5 -:10EF1000000000000000000000000000FFFFC3C36D -:10EF200000000F0F096F2D2D9918890800000000AF -:10EF3000000000000000000083A79BBF0007C0077F -:10EF4000000000000000030C0000000000000000B2 -:10EF500091F398FC000000006F186F7E0000818123 -:10EF60000446FFFFA3C30000000000000000069F4E -:10EF70007E7E2424E7E7000000000000000000007F -:10EF8000000000000000000000000CFC0CFC000071 -:10EF90000000000000000000000000000000FFFF73 -:10EFA000C3C300000F0F096F2D2D810089080000D9 -:10EFB0000000000000000000000002261A3E0004CD -:10EFC000C0040000000000000F0F0000000000005F -:10EFD0000000F391FC98000000000918097E000071 -:10EFE00000000446FFFFC3C3000000000000000053 -:10EFF000069F18182424E7E7000000000000000026 -:10F000000000000000000000000000000606F6F608 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000C0C3C3C0000000051 +:10EF3000009918180000000026A73EBF000000003E +:10EF4000000000000000000000000000F0F000F0F1 +:10EF5000090918184E4E3CFF000000000000000098 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA000000000000000000000000C0C0000000049 +:10EFB0000000009918180000000002831A9B00004E +:10EFC0000000000000000000000000000000000041 +:10EFD00000F0090918184E4E00C3000000000000A0 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 :10F0100000000000000000000000000000000000F0 -:10F0200045E3800F002D8A020061500E000D0000A4 -:10F0300000000A080000000005610A0F050D00A08D -:10F0400000613007000D00000061000F051D00A0E9 -:10F0500005610A0E050D00A005610A0F050D00A04F -:10F06000000000613007000D000100610007000D85 -:10F070000000000030000000000000004000001010 -:10F08000000000610007000D000100614007000D55 -:10F090000001000000000000000000610007000502 -:10F0A00000005500050500000000000000000055AC -:10F0B00030300000000000000000000000000000F0 -:10F0C000000000000000000000001310D3D000007A -:10F0D0000000000000000000000050505C5C431C79 -:10F0E000832C00000000A0F0FF0FFFF000000000E4 -:10F0F0000FFF096900000000000000000000000090 -:10F100000000000000000000C0FCC0FC0000000087 +:10F02000000000000000000000610006000D000567 +:10F030000061002F804D000805610A2F850D00A199 +:10F0400000610006000D000000610006000D0000D8 +:10F050001061202F804D000800613007000D000076 +:10F06000000000000008050000A005000A280500B7 +:10F0700000A00000000000000000000000000000F0 +:10F0800000000000000000000000100000018002ED +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000C030F0000080 +:10F0B00000007F3E57160AFAF3F3BFBAB5B041AF6E +:10F0C00041050000000000040400000000000000F2 +:10F0D00000002D2DFF55BEC0BEFC00000000080F33 +:10F0E000FFFF000000000000000000000000000022 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF :10F1100000000000000000000000000000000000EF -:10F12000C30F550055000505000000000000000059 -:10F13000AAFF3030000000000000000000000000C6 -:10F140000000000000000000000000001310131079 -:10F1500000000000000000000000000050505C5C57 -:10F160005F5FAFAF00000000AAFFFF0FFF8D000040 -:10F170000000FF0F6909000000000000000000000F -:10F18000000000000000000000008282BEBE0000FF -:10F19000000000000000000000000000000000006F -:10F1A0000000C30F55FF00000000AAFF78780000A0 -:10F1B00000000055AA5500000000000000007DAFCF -:10F1C0007D0500000000CFF38AA2000000005D0C66 -:10F1D0005F0F00000000069690960000000007D721 -:10F1E0000BEB431C832C0000001700000000000004 -:10F1F000F505FCFC0000000000000000000000001D +:10F120000000000000000000000000000FCF3FFFC3 +:10F13000000000006B2A43020AFA03031F1A15108D +:10F14000EBAFEB050000000000040400000000002D +:10F15000000000002D2DAA0082C082FC00000000EB +:10F160000808FFFF00000000000000000000000091 +:10F17000000000000000000000000000000000008F +:10F1800000000000000000000000000000003C3C07 +:10F19000FF003C3CF0F00000000000000000000018 +:10F1A0000000000000000000000000000000F50565 +:10F1B0003F3F00000000AAAAF0F068EA7CFE3F038F +:10F1C000D7D7E8E83CFF00005000000000003C7F7B +:10F1D0003C3F000000005F503F3FFFFFBEFA0000D1 +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F :10F2000000000000000000000000000000000000FE -:10F2100000000000000000000000000000000000EE -:10F220000000000000001041000000000055787848 -:10F23000000000000000AA00000000000000000024 -:10F2400028AF2805000000008AA2CFF300000000CC -:10F250005D0C5500000000000FFFF0FF00000000F3 -:10F26000D0D7E0EB5F5FAFAF0000001400000000FC -:10F270000000F5050C0C000000000000000000007C +:10F21000000F003CAA003FFF0000000000000000BB +:10F2200000000000000000000000000000000000DE +:10F23000F505303000000000C3C300FF40C254D6C3 +:10F240003F031414E8E800C30A00000000000000B7 +:10F250003C7D3C3C000000005F503030FFFF14500C +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E :10F28000000000000000000000000000000000007E -:10F29000000000000000000000000000000000006E -:10F2A00000000000000055555555008000824000C8 -:10F2B00021801104C1000200888020000200054165 -:10F2C0000800880584008500040002000000040096 -:10F2D00020102000400020000000200000008800D6 -:10F2E0004000210800080084840800030084108482 -:10F2F0000408C00410042000840840002008000214 -:10F3000089004084200820820088008400040400D2 -:10F31000008820040000C000008000008800000079 -:10F32000200000000000000000000000002010216C -:10F3300080904020080102001100040440000300F6 -:10F3400008009000400004002000000800000000B9 -:10F35000000000010000000000000000000040006C -:10F3600000000400400100011009000100004008F5 -:10F3700080080001100184011000000080040000DA -:10F38000000040008003040180084005000940831C -:10F390000000000400010000000000042000000044 -:10F3A000000000000000000000000000000000005D -:10F3B000900090000008000005000020A04001001F -:10F3C000A000002100090000008002000384010069 -:10F3D00008000200020800000200084003000000CC -:10F3E0002000030800400900100001102140000027 -:10F3F000880002001000C080840520000100088001 -:10F40000008000800004409088001000840091007B -:10F4100003802184210000C00000004100800040E2 -:10F4200088400000000002000800084000000210B0 -:10F4300010000000028400850288828200014008DA -:10F440000208000800080208000800040000082163 -:10F45000080800080000008202000400C00008083C -:10F46000040880082004050804888004200090080F -:10F4700000002084040880000508020082004090FB -:10F480000002020409040009800202008500020053 -:10F4900020080420900990000508000004000004E2 -:10F4A00000000008400002080500000020080000DD -:10F4B000000484080000C01004020421008400102D -:10F4C000850490000000000208020003A0088800E4 -:10F4D0008908A02188C100008441000308000021A0 -:10F4E0000821824100000000000000200000C0212F -:10F4F0000411000000000041200000411000200025 -:10F500000002000000050000880000000004000860 -:10F51000010090212085044110000000000000003F -:10F520000000000810000000820004000400000039 -:10F5300000000000100008002100000185000021EB -:10F540000300040100A00504000083040900050075 -:10F55000090020844010002008004008000000102E -:10F56000030800A000100800082003001183000019 -:10F57000000083000000008200008084030000007F -:10F5800083820802000200C0008800C0040000035B -:10F590000084020008000008000083000000000052 -:10F5A0000000000004000020200000000800080007 -:10F5B00000000000000001080000040040101000DE -:10F5C000000001000880A000C00020000800080022 -:10F5D0000800080040000500000082008280000052 -:10F5E00000000400101140030000000020008511FD -:10F5F00008030800088000000008C1800204A10878 -:10F6000021092000A08400800200000040000000CA -:10F610000080004000040100A084090410000008DC -:10F6200008000800080000000800824000000000F8 -:10F63000820000000000000010000900A00090C03F -:10F640000000000004000020008200A00000030071 -:10F650001140110021A021A0040000000000102092 -:10F660000084080000A0009000040000000080005A -:10F670001000000041000008000000092004088577 -:10F680002001400040000041004080001084000044 -:10F690000800004003101101100000410200008426 -:10F6A000210100000090418841000000000000009E -:10F6B00000000040000003000000000204001040B1 -:10F6C00004008200208009200000000000000005E6 -:10F6D0000100010020802000824182100000010210 -:10F6E0000102000000000008080200110000C00232 -:10F6F000090500004180110000020000C004000262 -:10F7000010402020084002000080A082C0408200FB -:10F710000200A00000088200100002041004100083 -:10F7200020002000004000000040004000000000D9 -:10F730000000000800000000000000800000C00081 -:10F740000400804000208540A001040000840000E7 -:10F75000000008000490802091A0109000002188F3 -:10F760000401040103A00000210000210082000028 -:10F7700000842000008484208488000200000001AE -:10F78000094080C180080401808821044004214090 -:10F790004000800003020401000083C080858011C6 -:10F7A00080008800800000010000000100010000CE -:10F7B000000000040000030009A000000010000089 -:10F7C0000008002100080400012100000080000062 -:10F7D000841040004000200988800004904100000F -:10F7E00000000409001190000002042100050284B9 -:10F7F000020000040041000002410020400400001B -:10F800009009100504000800820000042008C000D0 -:10F8100000000200A000021189910004C0840200CF -:10F82000000200040008000900030040004000003E -:10F830000000000000000000000082000200000044 -:10F84000001000020000000080000800000000100E -:10F850000000000000000000800000200000000008 -:10F860004100000080000082000000000000000451 -:10F870008005800000010000000080000001000100 -:10F8800000000400800000000000000000002000D4 -:10F89000000000008400080080002008000100092A -:10F8A000000000000040008500080000000100008A -:10F8B0000000000000000000000000000000000048 -:10F8C000000001900888028282001101400290012C -:10F8D0008200400000000000020000000000010063 -:10F8E0000000000290108290000410C001400888BF -:10F8F0000888000000000000000001C1A001039082 -:10F900000000000040C101001000008900C1010595 -:10F910000001000000C001009008000002C10201C7 -:10F92000C008010084C140011001008900C000002E -:10F9300000000002000000000000000000000000C5 -:10F94000000000001000100000808000A01100A145 -:10F950008805800280000000000000000000000018 -:10F96000020000000000830000000080008008808A -:10F9700080000000000000000500000009C1C14037 -:10F9800083840011000083C10305411100900091A0 -:10F99000108340100010008010000380000080C120 -:10F9A00085088385091083C1892085020082008033 -:10F9B00000002000008000000000000000000000A7 -:10F9C000000000000000208041210391C100088058 -:10F9D00041114111A0000000000080408000002083 -:10F9E000000080058080880008098280A000000057 -:10F9F0000040808900000005000000028000020035 -:10FA000003094109C1000000098002001011C12052 -:10FA1000050408000240C100024088002004A10043 -:10FA2000090083000200C183210091001009C10375 -:10FA30008000000300408000000000000000000083 -:10FA4000000000000000000091C008000083910049 -:10FA5000009000012083C0209000900084010810D5 -:10FA60001001C0A0080090041100A120A18208820A -:10FA70002000100010850802000000000000C000F7 -:10FA8000018800850001C18400000110010000010F -:10FA9000C182000103000001C1A0000111000101A9 -:10FAA000C100004089000100C10500A002840001DE -:10FAB000C101020000000001C000000000000000C1 -:10FAC000000040002000400020009091004090087D -:10FAD000030300830009884101100082008800C0F0 -:10FAE00000C00100A0000400000091110003C0400C -:10FAF0008988401100A18240111100000800000017 -:10FB0000000801880001840001C10000000000011C -:10FB1000890101C100034001840100C000010210FD -:10FB2000000000C100010001100000C10000000041 -:10FB3000010001C100000002000000C00000000040 -:10FB400000000000000000000000000080090089A3 -:10FB5000800388C008200390000511A000000080E9 -:10FB600000000080200000008000050082830083E8 -:10FB700000891091804000A000838940000080002F -:10FB80000000028040851020C11140C100000041EA -:10FB90001008100209C10089A002080209C0002053 -:10FBA00000A10003008200021002031000C105053D -:10FBB0001010410909C10000008000000080000011 -:10FBC0000000000000000000000000000000C1056F -:10FBD0008488200010110800882020000303000002 -:10FBE000000000800000000000A00011000000C024 -:10FBF0000040800080100011008000000000000024 -:10FC0000000000000000C14005C0110040090000D4 -:10FC1000C1099009058020038000800000000002D7 -:10FC20008002800000000004C1C0A009100008404C -:10FC3000C1009008050005118000000000000000D0 -:10FC40000000000000000000001000000080000024 -:10FC50009120204001109001A10089110400A00012 -:10FC6000000000400002000000000011000300003E -:10FC70000882820108A01001040090824010020056 -:10FC80000000000000880000C18900100000000191 -:10FC90000000C183900101400101C010020000007A -:10FCA0000001C003080000000001C1401001000075 -:10FCB0000100C1C0900001000000C0000000000071 -:10FCC00000000000000000000000000100A0004053 -:10FCD0000000600000E007004100000000E00700B5 -:10FCE00000000000000000000000000000E007002D -:10FCF00000000000000007000000000000000000FD -:10FD00000000000000E000000000480000E00700E4 -:10FD100000000000480000E000000000000000E0DB -:10FD200000000000000000E000000000810000E092 -:10FD300000000081884100E007000006000000E0AC -:10FD400000000000000000000000000000000000B3 -:10FD50000000000082D782D7FF00FF00CFF38AA205 -:10FD6000EBEB0BE000000000A0BCBCBC00000000FE -:10FD70000000000083B38FBF0000003092BAD3FBB5 -:10FD8000C0C2C0C2000000000000FFFF0000FFFF73 -:10FD900000003C3C0000000000FF0000AAAA000098 -:10FDA00000FF00003C3C000000FF0000F0F00000FD -:10FDB00000FF0000AAAA000000FF0000AAAA00009D -:10FDC000FFFF0000F0F00000000000000000000055 -:10FDD0000000000000008282D7D7C0C0FCFCCFF337 -:10FDE0004551D7D707D000000000A0BCA0A000005C -:10FDF00000000000000080B08CBC00000030103813 -:10FE00005179C0C2FCFE000000000000FFFF0000AE -:10FE1000000000003C3C0000000000FF0000AAAA17 -:10FE2000000000FF00003C3C000000FF0000F0F07C -:10FE3000000000FF0000AAAA000000FF0000AAAA1C -:10FE4000000000000000F0F00000000000000000D2 -:10FE50000000000000000000FFF05F50DFDF1F1F08 -:10FE600000FF00FF00FF5555000000000055FF3067 -:10FE700000000000AFAF050545CF8ACF0C000000A1 -:10FE80005555A2F33F5F3F5000000000FFFF000008 -:10FE90000F0F00005555000000003C3C0000FFFF24 -:10FEA0000000FF0000000F0F00000F0F00000F0FF9 -:10FEB00000000F0F00000F0F00003C3C00000F0F70 -:10FEC00000003C3C0000C3C3FFFF00000000000036 -:10FED000000000000000341400000F005F50D0D07C -:10FEE000101000FF00FF00FF5555000000000055F6 -:10FEF000003000000000BE14BE1451F3A2F3000055 -:10FF000000000000A2F33F5F3F5F00000000000020 -:10FF100000000F0F00005555000000003C3C0000A1 -:10FF200000000000FF0000000F0F00000F0F000096 -:10FF30000F0F00000F0F00000F0F00003C3C0000EF -:10FF40000F0F00003C3C0000C3C3FFFF0000000097 -:10FF50000000000000000000DFFF00000061000E54 -:10FF6000800500000561000905010008000000008F -:10FF70000090000105610A0F050D00A005614A0E01 -:10FF8000050D00A080615006000D00000061000713 -:10FF9000002D120245828A0FC52092A200004082E5 -:10FFA0008001C020920240E38007002D920240E3CE -:10FFB00080070029920240828001C020920245827F -:10FFC0008039C020920240E38007002D82020000A9 -:10FFD0000000000000000000000000000000FC0C19 -:10FFE000F50500005555FF0035350CCF8E8E00000D +:10F290000000000F003CAA0030FF0000000000004A +:10F2A0000000000000000000000040008400000496 +:10F2B0001005C002880020838880100421041100FA +:10F2C00000208800880084002000020020008800C0 +:10F2D00020088800400020008400400020008404B2 +:10F2E000000488004000840084000003A000400067 +:10F2F0002002840240004000C000200020002104C1 +:10F3000040008804C000000020002000408020044D +:10F3100002020004200020002008840021000300D5 +:10F3200021824100000500002000000000001000C4 +:10F330000000210240A040024020402021000400A3 +:10F3400004C0210110020040000000004000000045 +:10F350000000040040000000040010001000000045 +:10F3600000000040000000000002400200004000D9 +:10F3700000000482200004000000400000000000A3 +:10F380000200000041000000200000020000001008 +:10F39000008441040090100010900502000010024B +:10F3A00010021004209041004000409000400002F4 +:10F3B0000000000002100000008000000440001067 +:10F3C0000410004000C0020000000800004000409F +:10F3D0000200000000400000000082000400000065 +:10F3E0000000000000800021000002090000000071 +:10F3F000020000000000840000000800000000007F +:10F4000020000200000000100000000002000200C6 +:10F4100008000000000000030800000002100200C5 +:10F42000000000000000000000000200900000004A +:10F430000000000000004000000020400202000028 +:10F440000008800200080010000002080000009080 +:10F450000000000000000000000000400200020068 +:10F460000008000000080204051004100910021032 +:10F470000000000000000000000400002000000068 +:10F480000200808400000584000120004000048206 +:10F49000000402000200000002000000050000005D +:10F4A0000004000400000000000040000000020012 +:10F4B0000000A0110000040000000021040800204A +:10F4C0000002C000A0004000000840080000040046 +:10F4D00000004000A0000000000008000000000044 +:10F4E00020000000C00082000000C000000090006A +:10F4F0000000000000000000000000000000000309 +:10F5000000000000840088001000000000000000DF +:10F5100004008800400504001005000020004000A1 +:10F5200004000200110041081000910004210000B5 +:10F530000000000011900390000021000500C101AF +:10F54000400003014100100041002100110000882B +:10F55000400800000000000410000000080008201F +:10F56000040008C00000008405000000002000A086 +:10F5700008000808000000824100000000020000AE +:10F5800000000000000000000900802000001000C2 +:10F5900000000000400000000300000041000000E7 +:10F5A0000000000041002000200000001088000042 +:10F5B00000000000000008000840000008000800EB +:10F5C000900900000000C000000008008200400018 +:10F5D0000000000000000000001004098208A000E4 +:10F5E0000000100010040011000900008209000052 +:10F5F00000000000000000000000C00000008200C9 +:10F600000800A000080000022000C0008480000064 +:10F6100082008200820000000000000082000800DA +:10F620008240104082020000400008000002824038 +:10F63000000082008204C0200000000000000000E2 +:10F64000210400000000080040001100000000003C +:10F650000000000000400000080000000000000062 +:10F660000000110000000000200000000900000060 +:10F6700008020800212000000000000040000000F7 +:10F6800000000000000000000800800000002108C9 +:10F6900000000000000040000000410000000000E9 +:10F6A00000000000000000000000400021000000F9 +:10F6B0000000080000000000210000008400040396 +:10F6C0000000840082080080820000008220008008 +:10F6D00000000041000000000008000000000000E1 +:10F6E000000000000000040000000000880000008E +:10F6F000008000000000A0000000000008000000E2 +:10F7000000000000000000000400080800081000CD +:10F7100008000000C000C000000000000800000059 +:10F72000080000000021C00000000000C000A00090 +:10F730000000000000000000000008004000000081 +:10F740000000000000840300212008004100112077 +:10F75000112021C0410008840084008403000000BF +:10F76000000000900400000000401000089020906D +:10F770000084050400900000000003000000000465 +:10F780000002000000000000002000000000000057 +:10F790000000000000000000000000000000000069 +:10F7A00000000000000000900300040000000000C2 +:10F7B00000000000000000000000000000004011F8 +:10F7C000000008408200000082008800090000114B +:10F7D000080000110000000090110009000008005E +:10F7E0000041000200200000000020000000000096 +:10F7F00000000800000000000040000800000000B9 +:10F8000000000800000000000000000040000000B0 +:10F8100000000000000000000000000000000000E8 +:10F820008200000000000000A00888000008080016 +:10F83000000000000000080082000000000000003E +:10F840000000000000000000000000000000400078 +:10F850000000800000000800000000000000000020 +:10F860000000000000000000000000000000000098 +:10F87000000000000000090000000000000000007F +:10F88000000000000020000000000000000009004F +:10F890004100000000000000050000000000000022 +:10F8A0000000000003000000000000000000000055 +:10F8B0000000000000000000210000000000000027 +:10F8C00000000000000000000000022091880010ED +:10F8D00083C0849088200004900400000000000091 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000010120000000000100000000C4 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000101010100000000000000C3 +:10F940000000000000000000000000008000A00097 +:10F950000000910080000000008080800000000016 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000050000000000000082 +:10F980000000000000000000000000000000000077 +:10F99000000000000000114180030003000300008C +:10F9A0000000000000000000000000000000000057 +:10F9B00000000000000008411002024100000000A9 +:10F9C00000000000000000000000000000008000B7 +:10F9D0000090800000008000801180808080000006 +:10F9E0000080000000000000000000000000000097 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000080008000E6 +:10FA20000000000000000000000000000080000056 +:10FA3000000000000000000020000200080041005B +:10FA400000000000000000000000000000000000B6 +:10FA5000A0004002A0A02010A0000490A0084082B6 +:10FA60000000000400000000000000000000000092 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA9000000000000000000000008800400004009A +:10FAA000C000000000000000000000000000001086 +:10FAB0000000000000000000000000000100010044 +:10FAC0000100000000000000000000000000000035 +:10FAD0000000042100401008100540C00082900280 +:10FAE000A004000000000000000000000000000072 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000100E4 +:10FB200001000000000000000000000000000000D4 +:10FB300000000000000000000000000000010001C3 +:10FB400000000001000000000000000000000000B4 +:10FB50000000000000100020808000C10000008034 +:10FB60000080208000000000000000000000000075 +:10FB70000000000000000000000000000000000085 +:10FB80000000030000000000000000000000000072 +:10FB90000000000000000000000000000000000065 +:10FBA000200009000000000000000000000000002C +:10FBB0000000000000000000000000000000001035 +:10FBC00000024000004100000000000000000000B2 +:10FBD000000000000000000500C00000000000025E +:10FBE0008091800080000000000000000000000004 +:10FBF0000000000000000000000000000000000401 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC20000010008000000000000000000000000044 +:10FC300080000000800000000000000000000000C4 +:10FC400041820210030008030000000000000000D1 +:10FC50000000000000000000880090A1904000001B +:10FC600010010802028804000000000000000000EB +:10FC70000000000000000000000000000000000084 +:10FC80000001000000000000000000000000000073 +:10FC90000000000000000000000000000000000064 +:10FCA00000000001002000900000000000000000A3 +:10FCB0000000080002000800100000000000000022 +:10FCC000000001050101010001000000000000002A +:10FCD000000000000000000000000081000007009C +:10FCE000000000810000070000000000000000008C +:10FCF0000000000000000000000000000000000004 +:10FD00000000810000E00000000000000000000092 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000E00000000000000000F3 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000810000E0000000000000000052 +:10FD5000000000000000000000000000550FFFFF41 +:10FD6000C2F2CEFE7C4C7040AA3CFFF000000000C6 +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB000000000000000FDFFA8AA000000000000F5 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE000AAF002320E3E7F4F7343AA3C00F000009F +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE30000000000000000000FDFFA8AA0000000074 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE600055553C3C0000CACA105192D3A4AE040EB2 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA00000000000000000000000000000003D0510 +:10FEB000FF0500000000000000000000000000003E +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE00000000F0FFF00000000FF3879BAFBF4FE9E +:10FEF000545E000000000000000000000000000050 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF30003D05050500000000000000000000000075 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000610A2E050D00A100000A2813 +:10FF7000050000A0000000000000000000000000DC +:10FF80000000000000000000000000000061000709 +:10FF9000800D2000000000000000000000000000B4 +:10FFA0000000000000000000000000000000002130 +:10FFB0000002000D0005000000000000000000002D +:10FFC0000000000000000000000000000000000031 +:10FFD000000180020000000000000000000000009E +:10FFE00000000000000000000000F0F030300000D1 :10FFF0000000000000000000000000000000000001 :020000040019E1 -:100000000000FF3CF0AA0000000045158A2A00000D -:10001000000000000000AFAFFC0CFFF03CAA0000A5 -:100020003C55FF0FBEBE50FA00000000000C3C3CE7 -:100030000000000015550155FFF03535AAF0FF3CD2 -:100040003CFF550F3F3F0AFA00000000000000008F -:1000500000000000000000000000000000000000A0 -:10006000FC0CF50578287828FF0035350CCF8E8EEE +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:10005000003C000F0F0F0C0C00000000000000001F +:100060000000000000000000000000000000303030 :100070000000000000000000000000000000000080 -:1000800000000000003CF0AA00000000CF3FCF3F7E -:100090000000000000000000AFAFFC0C00F03CAA24 -:1000A00000003C55000F141450FA0000000000003E -:1000B000000000000000BFFFABFF0F003535AAF0C5 -:1000C000003C3C00550F30300AFA000000000000F0 -:1000D0000000000000000000000000000000000020 -:1000E000000000000000AAFFF03C3CF53C05F03C9D -:1000F000AA3C00000000000000000000000000001A -:10010000000000000000B400B4B4000000000000D3 -:1001100000000000000000000000FF0F7D7D3C3C5F -:10012000F0F00000FF551E1EAAF03CFFCF0CCF0CD4 -:100130002828F0FF000000003F3F0AFAFFC34D4DA2 -:100140003C3C00FFAF05BEBEF03CAAFF0000000033 -:10015000000000000000000000000000000000009F -:100160000000000000000000AA00F03C3CF53C0547 -:10017000F03CAA3C0000000000000000000000006D -:100180000000000000000000B4B4B4000000000053 -:10019000000000000000000000000000F0004141ED -:1001A00000FFAAAA0000AA001E1EAAF03C00D7D792 -:1001B00014142828000F0000000030300AFA3C0018 -:1001C0004D4DAAAAF0F0AF051414F03CAA000000AF -:1001D000000000000000000000000000000000001F -:1001E00000000000000020000400010040902000FA -:1001F000858041808980A0080000200020002180A7 -:100200008800A008840020908800848020002000BE -:1002100088002000000020008408210420008800BD -:1002200000002000C00000030000200000002000AB -:1002300004000400200000002008840020002004A6 -:1002400088000000C0008400881104110000208292 -:10025000000000002000000004000000000020005A -:1002600000000000000000004000800204000021A7 -:10027000C000400420024008008200020502040081 -:100280004020000000C040000404000040040000C2 -:100290001000000000902000090000004000000055 -:1002A00021000000400004000000000000000000E9 -:1002B00000002000200000040000400000000000BA -:1002C00000022000000020020004400202C00000E2 -:1002D00000211000000000000002400000000002A9 -:1002E000000000000000400240000000828004087E -:1002F000081000000280820202410200000010008B -:1003000000000004020402800204000040C000104B -:10031000050008400200040004104010000005021F -:1003200040100000080000000000000082400000B3 -:100330008400000000008400001000000000400065 -:100340008810400800000000000900000000910033 -:1003500000100190000000000800000802000200E8 -:100360000000840504000200000082100000210447 -:10037000000002830200000200014010040000009F -:100380000208000009010085000480890200800441 -:1003900000084088840000000090000280400908A6 -:1003A0004009830002000088048802000000000069 -:1003B00002000084410002820288040800840200D6 -:1003C000840804088300040000840000000003087F -:1003D000400200000220000000080008050000881C -:1003E0000008058402100000000000000200012047 -:1003F0002008002088414000100082002000404179 -:100400000008C00000000003820000212100C0009D -:10041000880940000000000000080008900000214A -:1004200000030000040004098200084000000000EE -:10043000820890009000201000000000880000005A -:100440000000900000400000200002210000000396 -:1004500084098402A000000000080002820000005D -:100460000011000000040000000000000000000077 -:10047000048390000801030800C00800000890826F -:1004800000000804000000000000030000102084A9 -:100490000300000000000000000800000000000849 -:1004A0000420000000040082000000000002080098 -:1004B00000000000038400000008000000A000000D -:1004C000000000840000030400020000800000001F -:1004D000008200880384218200040088000200005A -:1004E00000000000080000004100000800000800B3 -:1004F000000002000080C00005038211080583008F -:1005000008008200C00000008240040002000800D1 -:100510000020C0800402000000408211A000000002 -:1005200000000420880000000020080000002000D7 -:1005300000000000080200000800840082000000A3 -:10054000000400000400080000008210A100001157 -:1005500008000011001120040011000200000840F2 -:10056000100000000800000008000010004000001B -:1005700008400820000008200000040011000000CE -:10058000200000000000000000000000000000004B -:1005900003000000000200000000200040000000F6 -:1005A00003000000004000000000000020000000E8 -:1005B0000000000000000000000800101100000012 -:1005C00011000000400000000200000000000800D0 -:1005D0000400100011000004400000204001000051 -:1005E00000000000001000000300000000000000F8 -:1005F000000000000000002100000000108000004A -:1006000000000810100840000020820304000100D0 -:1006100009080080000001000000010082050000C0 -:100620000400000000000000000000000041004144 -:1006300000000004000000000000000000000000B6 -:100640000000000082800000004100000000000067 -:1006500084000000080000000000080000200000E6 -:10066000080000020000001100001000000000005F -:100670000800A0000400A00000840000000803207F -:100680000420009000820288880000000000110011 -:10069000200220000904080020C008A020C011008A -:1006A0000082080000A0050804900000000000C0BF -:1006B000000000080000009000000900210005C0B3 -:1006C00020C00300200800100000030008C0000440 -:1006D000000000C000000084009000000000000046 -:1006E000000000000000000000000000000000000A -:1006F00000000800000000000000000210110002CD -:100700000008000200000020000000000004C000FB -:100710000000000020008800C00000000800000069 -:100720000004002100000000004000000000000064 -:1007300000000000080000000000000000000000B1 -:1007400000000000000000034000400040000000E6 -:1007500000000000002184000800080000000000E4 -:10076000004000000000000200000005000008003A -:100770000000C021C000820004000000042000002E -:100780000000000400000400000000000000000061 -:100790000000000000000000000000000000000059 -:1007A0000000000100000000000000000000000048 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000400000004000000200000097 -:1007E0000000200002900000000000000000000057 -:1007F00000000000000000000000030000000000F6 -:10080000040000000000000101018500000100015A -:1008100000000000000000010003000000000001D3 -:10082000890000000001000000000000000000003E -:10083000010088000000000000000000000000002F -:1008400000000000000000000000000000000000A8 -:100850000000000084000000000000000000000014 -:10086000011100208202008300000000000000004F -:100870000000000000000000000000000000000078 -:1008800000008000000000004008211082200010BD -:1008900000080002000400044010009008400040DE -:1008A00000401005100400200000000000000000BF -:1008B00000032110001000000000000000000000F4 -:1008C0000000000000000000000000000000000028 -:1008D0000000000002008000000000000000000096 -:1008E00000002190058800080021000000000000A1 -:1008F00000000000000000000000000000000000F8 -:10090000000000000080801000031011200003048C -:10091000029000000000000000000041000800906C -:100920000000100202000802410300000004000061 -:10093000000020000800040020000000000000006B -:1009400000000000000000000000000000000000A7 -:100950000000000020802000051008850000000233 -:1009600000000000200020080800058000000000B2 -:100970000000000000000000000000000000000077 -:10098000000000000020004008018209010800006A -:1009900000000188000000000000000000010001CC -:1009A00000050000018900000001010100000000B5 -:1009B00000000000008801000100000000000000AD -:1009C0000000000000000000000000000000000027 -:1009D000000000000000014001000000008800004D -:1009E0000001000000000088000101100008000064 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000003C000F00000C0C000000000000BD +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:10013000000000003F30FFAA0000000000000000A7 +:1001400000000000000000000000000000000000AF +:100150000000000000FF000F000FFDFD0000000088 +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B0000000000000003F3055000000000000007B +:1001C000000000000000000000000000000000002F +:1001D0000000000000000000000F000FF8F8000011 +:1001E0000000000000008400000020002000040047 +:1001F00004200400880000002000200040000000CF +:10020000200220044000C000400002002000200026 +:10021000A000040420048200210082002100880044 +:100220002000200088000003840084008400040271 +:1002300020C18900A000C010880020000400200018 +:1002400020802080100088842000200004002004EA +:1002500084008800000020000411200020002000FD +:10026000880004048804200441000000000000020B +:100270004000000040404100400202040000210014 +:100280001000400400020020400000004000000078 +:100290001000400021000000000010000402400097 +:1002A0004002404000040002000020024002409052 +:1002B00002900004200010042104400004020902FE +:1002C0004000C008C008C0401008400040904040B6 +:1002D00004820900000040000002410204400002C4 +:1002E00000024040000221000402020284000010CB +:1002F00000000000000002100010020000000000DA +:1003000000000300000002000100000000000210D5 +:1003100000400000000000000010000900008800FC +:1003200000100000000000000010000000000000AD +:100330000010001040040002000000020000000055 +:100340000000840002000200001000000200020011 +:1003500000002000020002000000000002000280F5 +:1003600000800280000000000400000041010284BF +:10037000000004100000400000000982000002009C +:100380000000000004100400040004000440000009 +:100390000000090000000008000800000000090833 +:1003A000000009080000000000100000000000002C +:1003B0000000000020848001000900880001000086 +:1003C0000008000800840010000005000000000084 +:1003D00000000510028400004104020002004000F9 +:1003E00040040904090402000900000000000000A4 +:1003F000C0000005C00008000000000000000080F0 +:1004000000080000C00084008800A0009000A00048 +:1004100000030400000000000000000000002000B5 +:10042000C0008408000004080000900000000000E4 +:1004300008000000400800001000000002008904CD +:100440000000000010002008000000000400200050 +:1004500000008400000000118800100084000000EB +:10046000400088000000404008000800080000002C +:1004700041004100000209000000050000002100C9 +:10048000002000A000200008008200000000000002 +:100490000000000000000000000000000300030056 +:1004A0008000000000C0000080820000000000000A +:1004B00000000000000008000000090000401120BA +:1004C00020040800000000000000000000000300FD +:1004D000800000000000004000004100000000001B +:1004E00000081000000000000000000000000000F4 +:1004F0000000C000080000008200000000000000B2 +:100500000400040200000000820008400100C10055 +:100510008240000004402000101082020000A00071 +:10052000100000040004001000C00000C0004000E3 +:1005300000000000040008000411000000009040CA +:10054000200008000000000000000400C0000800B7 +:1005500008000800C00000000800820084000400B9 +:1005600008000004000000000000A01000020000CD +:10057000000000000000000000000040000000003B +:1005800000000000C0000300000021004001020044 +:10059000040008010000000000000000008241008B +:1005A00000000000000000001100001040000000EA +:1005B0000000000000000000000009200000000012 +:1005C000000091000000000003000000000008008F +:1005D0000004000000000000000000000000000017 +:1005E00008000300000000000000000000004000C0 +:1005F0004000000000000008000000000000A00013 +:1006000000000000000000000080042004800005BD +:1006100000000000000000000000080000080021A9 +:10062000000008000000000000000800002000207A +:100630000000000000210000000000000000000891 +:1006400000000000000400000000A0000000000006 +:100650000000040001000000000004000000000091 +:100660000000000000000000008001000080010088 +:100670000000400000000000110021000000000008 +:1006800000000808080803000904112080058810EC +:1006900000000000008400000000000000000000D6 +:1006A0000000000000001000110021000000000107 +:1006B0000501000000040000000000000000000030 +:1006C0000000004000000001000040000000200089 +:1006D00000000000000020000000000000000000FA +:1006E00000000800000000000000080420000004D2 +:1006F00020900000000000000000C000000000008A +:1007000084000000000000090800000004009000C0 +:1007100000002100010001880100004000002021AC +:1007200000000000080000000000000000000000C1 +:1007300000000002000000000800000000000400AB +:1007400000000000000008000000000000000000A1 +:100750000809000000000000000000000000000088 +:100760000000000020008400000082000000000063 +:100770000000000000000000000000000020000059 +:1007800000000000000000000000000000008000E9 +:10079000000000000400040202400200000000000B +:1007A0000000000000000000000000000000400009 +:1007B0000000000400000000000000000000000035 +:1007C0000000000021000000000008000000000000 +:1007D0000000000000000000000000000000110008 +:1007E00000000000000000040000000000002000E5 +:1007F0000000000000000000002000402000010078 +:1008000000000000000100000000000000000000E7 +:1008100000000000000000C00002000290900000F4 +:1008200000000000000000000000000000000000C8 +:1008300001000200000000000000000000000000B5 +:1008400000000000000000000001880141010001DB +:100850000000000000000000000121000000000175 +:100860000000000000000000000000000000000088 +:100870000000000001000000000000000000000077 +:100880000203001000410010000000000000000002 +:1008900011000000000000000080008000800000C7 +:1008A0000000000000000000000000000000000048 +:1008B00000000200400000000000000000000000F6 +:1008C00000000000000000000000000805022010E9 +:1008D000000800000000000000000041102005009A +:1008E00000100000000000000000000000000000F8 +:1008F00000000000000020000000000000000000D8 +:1009000000000000000000000000000000000000E7 +:100910000000000080008000000000008000000057 +:100920008000000000000000000000000000000047 +:1009300000008008000080000000000000000000AF +:10094000000000000000000000000000108802000D +:10095000090808030000000000000000100020004B +:100960002000410300000000000000000000000023 +:1009700000000000004000000040000000000000F7 +:100980000000000000000000000000000000000067 +:1009900000000000400020880800828800008200DB +:1009A0008400C0840000000000000000000000007F +:1009B0000000000090010400100000000000000092 +:1009C0000000000000000000000000000000011016 +:1009D00001000000000100000000000000000120F4 +:1009E0000000000001010000000000000000000005 :1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000400000000000A6 -:100A100008010000010000000000000000000000CC -:100A2000A00000000000000183010000010100009F -:100A300000000000000000010101010100010000B0 +:100A000000000000000000000100000000000000E5 +:100A10000000000000000100000008000000008449 +:100A20000084000000C00000000000000000000082 +:100A300000000000000000000000000100010000B4 :100A400000000000000000000000000000000000A6 -:100A5000000000000000000000000000A0000000F6 -:100A600000000000000000000001010100018800FA -:100A70000000000000000000000000000000000076 -:100A800000000000000000000800000080000000DE -:100A9000000280080002044000002100080000005D -:100AA0000000800020002000000911080504021049 -:100AB00000000000000000000010080321210808C9 -:100AC0000000000000000000000000000000000026 -:100AD000000000000000000000000002004180084B -:100AE00000200000000000000000000403100321AB -:100AF0004020000000000000000000000000000096 -:100B0000000000000000000000001008114040003C -:100B100000004180050021000008001000000000D6 -:100B2000000080008000000080001080080021008C -:100B30000508000080000000000008001000000010 -:100B400000020000000000000000000000000000A3 -:100B500000000000000000000000000041822100B1 -:100B6000080008080000000000000000A1030421A4 -:100B70000800080300000000000000000000000062 -:100B80000000000000000000000000000101010260 -:100B90000190000001A00000010000000000000022 -:100BA000000000009000A000080002000108000002 -:100BB0000100000184000200080082000000010022 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000010212 -:100BE00000000100010000002000000000001102D0 -:100BF000210005004000000000000000000000008F -:100C00000000000000000000000000000000600084 -:100C100000E007000000880000E000000000000085 -:100C2000000000000000004100E00700600000003C -:100C300000E00000000000000000000000000000D4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C7000000000000700000000000000000000006D -:100C80000000000000000000000000000000000064 +:100A50000000210120010001000000000000000052 +:100A60000000010000010001000000000000000083 +:100A70000000000000000000000004000000000072 +:100A80000000000000000000000010004100000015 +:100A90000000000000000000100000000000000046 +:100AA00000000000000000800000000000000000C6 +:100AB00000000000000000000011000800100041CC +:100AC0002000000000000000000000000000000006 +:100AD0000000002011024121200800000000000059 +:100AE000000000000820001000410000000000008D +:100AF0000000000000000000000000008000000076 +:100B000040000000000000000000000400000000A1 +:100B100000000000000000000000000200110000C2 +:100B200000008002800200000000000000000000C1 +:100B3000000000000000000000000009002000008C +:100B40000000000200400000000000000000000063 +:100B500000000000418802001000080800000000AA +:100B600000000000414000000000080000000000FC +:100B70000000000000000000000000000005000070 +:100B80000000000000000000000000000000000065 +:100B900000000000000000000000000000010088CC +:100BA00000040000C001040190904000000000001B +:100BB0000000000000000000000000000000002114 +:100BC0000000000000010000000000000000000024 +:100BD00000000000000000C0010001000101000051 +:100BE0000000000000000100000000000100000003 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C10000000000000000000000000000000008153 +:100C20000000070000000081000007000000000035 +:100C30000000000000000000000000000000008133 +:100C400000E0070400000081000007000000000031 +:100C50000000000000000000500000E00000410023 +:100C60000000000000000000810000E00000000023 +:100C70000000000000000000000000000000000074 +:100C8000810000E000000000000000000000000003 :100C90000000000000000000000000000000000054 -:100CA0000000000000000000FFFF00000000000046 -:100CB0000000000000000000FFFC00C00000000079 +:100CA00000000000000000000C0C0F00000000001D +:100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 :100CD0000000000000000000000000000000000014 -:100CE00000000000000000000000FF00FF00000006 -:100CF000000000B40024000000000000000000001C +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 -:100D200000000000000000000000FFEF10000000C5 -:100D300000000000000000000000FFFF00000000B5 +:100D2000000000000000000000000C0C0F003C3C24 +:100D3000F0F00000000000000000000000000000D3 :100D400000000000000000000000000000000000A3 :100D50000000000000000000000000000000000093 :100D60000000000000000000000000000000000083 @@ -102649,494 +102649,494 @@ :100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 -:100E100000000000000000000000666600FF000007 -:100E20000000000000000000000000000000FF00C3 -:100E3000FF000000000000000000000000000000B3 -:100E400000000000000000000000000000000000A2 +:100E100000000000000000000000000000000000D2 +:100E2000000000000000000000004E4E3CFF0303E5 +:100E300000C30000000000000000000000000000EF +:100E400000000000000000000000767F767F0000B8 :100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 -:100E70000000000000000000F900C10000000000B8 +:100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 -:100E900000000000000000000000000000FF00FF54 -:100EA0000000000000000000000000000000000042 -:100EB000FF00FF0000000000000000000000000034 -:100EC0000000000000000000000000000000000022 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000004E4E00C3E3 +:100EB000030300C30F0F00FF00000000000000004C +:100EC000000000000000000000000000767F767F38 :100ED0000000000000000000000000000000000012 :100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000F900C100000038 +:100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 -:100F10000000000000000000000005610A0C850DC3 -:100F200000A000610007800D000000610006000DB8 -:100F3000000000614027000D000000610007000D67 -:100F40000000000000000000000000610006000D2D -:100F50000000000000000000000000000000000091 -:100F6000000000000000000000000000006100061A -:100F7000000D000000000000000000010061400EB4 -:100F8000000D00A0000000000000000000000000B4 -:100F90000000000000000000000000005F5F0A0A7F -:100FA00000000000AA0A005F0F0F0F0F00000000F2 -:100FB000000000000000000000000000FFFFFFC371 -:100FC000F0FFFFFF00000000000000005555FF008B -:100FD0000A02AAA2000000000000000000000000B9 -:100FE00000000000000000000000000000003F3092 -:100FF00055FF30303030000000000000000055C0C8 -:1010000055002828282800000000000000000000EB -:1010100000000000000000000000000000005F0A67 -:101020005F0A00000000000A005FC34B4BC30000D2 -:101030000000000000000000000000000000AAFF07 -:10104000F0C3C0C0CFCF0000000000000000555525 -:10105000FF000800A8A00000000000000000000041 -:101060000000000000000000000000000000000080 -:101070003F30550028820000000000000000000002 -:1010800055C05500F0F000FF000000000000000017 +:100F10000000000000000000000000610006000D5D +:100F20000000000000000000000005000A28050085 +:100F300000A0100020280040000800000000000071 +:100F4000000000000000000000000061002F000D04 +:100F50000000051000280000000000000000000054 +:100F60000000000000610007800D0000000000008C +:100F700000000000000000018000000000000000F0 +:100F800000000000000000000000000000610007F9 +:100F9000800D0000000000000000000000000000C4 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD000F0FC82BE000000000000000000000000E5 +:100FE000000000000000D73FD70300FF00FF000013 +:100FF00000000000000000000000000F0F0F0000C4 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000003C82BE0000000000000000000014 +:101060000000000000000000143F1403AFAF3F3F3A +:10107000000000000000000055553C3C000F00003F +:101080000000000000000000000000000000000060 :101090000000000000000000000000000000000050 -:1010A00000000000000000000C00F3FF20008A0098 -:1010B000F001C00100000000C0FFCFFF00000000F1 -:1010C0005F503F3F28F0AAAA000000000000000087 -:1010D00050F000A03F00BE00000000000000000033 -:1010E0000000000000000000000000000000000000 -:1010F000000000000000A0F5BEBE000000000000DF -:1011000000003F0F050FCB0BFB3B00000000000071 +:1010A0007D7DCF0C0000000000000000000000006B +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000017FF173C54F44F +:1010F0005EFE0000000000000000003C00550C0CEB +:10110000000F0000000000000000000000000000D0 :1011100000000000000000000000000000000000CF -:10112000000000000000000000000C00F3FF75004C -:10113000DF0030010001000000000000000000009E -:1011400000005F50303028F0000000000000000078 -:1011500000005FFF0FAF3F00BE0000000000000076 -:10116000000000000000000000000000000000007F -:101170000000000000000000A0F5141400000000B2 -:10118000000000003F0FF50FC808F838000000000D +:1011200000004141CF0C0000000000000000000062 +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:1011600000000000000000000000000017C317008E +:1011700004A40EAE0000000000000000003C00557A +:101180000C0C000F00000000000000000000000038 :10119000000000000000000000000000000000004F -:1011A00000000000C0000420000440002000840073 -:1011B0004000200040008800200588050200200033 -:1011C0000200000040008800400040002000208015 -:1011D00020008880200088008400C00020000000DB -:1011E0000400C000000320008800821000002000DE -:1011F000000420000000200288100000000004808D -:1012000004002000200284042000A0000000C00090 -:101210000000000000008800000000000000000046 -:1012200004000000000040000040000000004000FA -:1012300000408002050000000000000440000000A3 -:1012400040001000040400024000000020000000E4 -:1012500000020090000210000000000000004000AA -:10126000000200040004000000000940000000002B -:1012700000000002400000004020000009000004BF -:101280000010000000A000014000090000400082A2 -:10129000000000020000000000002000000200002A -:1012A0000000000000C00000041000000440821094 -:1012B0000000050004001000844000000040000011 -:1012C00020000400001002000000000000000410D4 -:1012D00000000000080004100000000000000000F2 -:1012E0000041000090000000000000000008001015 -:1012F0000490000000000000040000000000000056 -:10130000841009000010020008020980000000009B -:10131000020500000000C000001000008210000064 -:101320000410000040000000100000010000000157 -:1013300002000400400000008000000800080400D3 -:101340000010040000080000000804000000021063 -:101350000200000000840000050005C00008000035 -:101360000000041004C0000004080000040800008D -:1013700009820302040002000400050804000402BC -:10138000020004008802020104004109042004084C -:101390000000050004000410040004080400040216 -:1013A000000400042008A00000008008880010004D -:1013B0000808400084000400A000000800000000AD -:1013C000C005000008000000000000210800A00087 -:1013D00000088208000000000000900800000000E3 -:1013E00000000000000000410000001100000000AB -:1013F0000000000000000000000800009000000055 -:1014000020000008000000000000000000000000B4 -:10141000000082000000000000000000000000004A -:101420000000000082080000000000000000000032 -:1014300009844100002000000000000000110000AD -:10144000000041904000000800000000000000087B -:10145000000000080300410000020000030000003B -:1014600000000000080000080088080010000000CC -:1014700000000000000200000000000000881100D1 -:1014800004400800080000000500411009000304A2 -:1014900000000000000000000000009000000000BC -:1014A00000000040000000000000000009000800EB -:1014B00000110800001008090000080000001020BA -:1014C00000200800000010000800822000008200B8 -:1014D000000008000000000000410021000000049E -:1014E00000000800020000000000C004000000002E -:1014F00000000002088008000800000482000000CC -:10150000084040400840C0000800000000001004EF -:10151000830004040002A0028204A000000208006C -:101520008202100000008200C00882000000C0009B -:1015300082400000000000A0000000000000080041 -:10154000800000000000000000000000000000001B -:101550000000000000000000000003000000020086 -:10156000080004000000000000000000000000006F -:10157000000000002000000804A00000000000009F -:1015800000000000890040004100000000002084AD -:101590000000400009004100110021C000000000CF -:1015A0000000000000002100040000000000000016 -:1015B0000000000000038200001100000000100085 -:1015C0000000100800000000000000000000000003 -:1015D0000000000000000800000000000000000003 -:1015E00000000000000000000800000000000000F3 -:1015F0000000000000000000A00000000100C0008A -:1016000008000000A0000000000040008200000070 -:1016100000000200000000000000000000000800C0 -:101620000000000000000820000000008200000010 -:1016300084000800000008000420030000004004AB -:10164000212003848901000000900000004008C0B0 -:10165000090400000800400400000204040800908F -:101660000000000000A01004049000040504000025 -:1016700000A00000000000000000000200A04000E8 -:1016800000002100000000000084000800000008A5 -:1016900000400000000000000340000400080304B4 -:1016A00000000082000000000400000000000200B2 -:1016B0000000000000000000000010000800000012 -:1016C0000000000800000000000000000002000010 -:1016D0000000020000400000000000004000000088 -:1016E00000000000000000000000000000000000FA -:1016F00000000800000000000000000010000000D2 -:101700004000000000000000000000000800100081 -:101710000000000800001000400008000009000060 -:1017200000080000400200000000840020001000BB -:101730008400000000000000C00020000000000045 -:101740000020000000000000000041000000100028 -:101750000000000000000000000000000800000081 -:101760000000000000000000000000000000000079 -:1017700000000000000000000000000000008000E9 -:1017800000008000000000000004000000000800CD -:101790000000000008C0210000908300000020002D -:1017A000080003000000000003000000000000002B -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000001000000000000000000F8 -:1017F00000000000000000000000000000000000E9 -:101800000100400000000000000000000000000097 -:1018100000010000000110A00000A00890080000D6 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000040000000000A4 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000110000000000000067 -:101870000000000000000000000000000000000068 -:101880000000100000000000000000000000000048 -:101890000003001000080011008009000000000093 -:1018A0000000000000000000000000000000000038 -:1018B00000000000000000000000080080000000A0 -:1018C000000000100000000020802100080008092E -:1018D0000000000000000000000000000000000008 -:1018E0000000000000000000008000000002000472 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:10191000000000000000000000802000830285001D -:1019200008000000000000000000000000000000AF -:101930000000000000000000000008000500030097 -:1019400005210000000000C00000010201000100AC -:101950000001000000000000000000000000000086 -:1019600000000000000000000000004000400000F7 -:101970000001000000000000000000000000000066 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000022000020122 -:1019A000A100414000000000000000000000000015 -:1019B0000000000000000000000000000190000096 -:1019C0000000000100000000000000000000000016 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 +:1011A00000000000100000002010208440004000DB +:1011B00088008800C00020000340C000020020001A +:1011C0000500200089824082880020002000200045 +:1011D00040002000C00084004000200020004000AB +:1011E000200520000003400020002004208420006F +:1011F0002000200000001000C00088004003C00054 +:101200008400200020008400880420002004C00006 +:1012100004000400C003040084048484400420000B +:1012200020002004200400A00400000100100000A1 +:10123000009010020000409000A082010000A04039 +:1012400004020440104040020002000000844000FC +:1012500009000000090040044104000400044100AA +:1012600020022100000000000000400002000020D9 +:1012700002000440004000C02000000241C0000203 +:1012800000020400000400022000000241020200EB +:101290000420402040000040104000200040000298 +:1012A00000C000A00002004000000100000000009B +:1012B0000008000000000010010008000240881033 +:1012C00088000100000002000400008000200020CF +:1012D0000200000000108200020000000000020076 +:1012E00000000000000002040000200000000200D6 +:1012F000082002800100000002000000900084002D +:1013000000100000000002100400000000000200B5 +:101310000000020002008200020000000200030040 +:101320008200000002000000000004100210001003 +:101330000010410000002000040408008000890122 +:1013400009040090049002000000C1000020000188 +:101350000001000800000000020020004000000022 +:101360000000000000000404040100000008000068 +:101370004000400100040808000084080900400003 +:1013800002000008400000000008020000080008F9 +:10139000400002004100090800004108000004006C +:1013A00002000208000004000040000008000008DD +:1013B000002088000000000082000011880000006A +:1013C0001000C0000200000010000000200000001B +:1013D00008000000000000000000000800000021DC +:1013E000000000080000000000080020000082004B +:1013F00008080000000000000000000900000000D4 +:101400000000000000000000000000008200020058 +:1014100000000000000808000400C00000000800F0 +:1014200088000000000040000000000010000000E4 +:1014300010000041100000400000004000000300C8 +:101440000000000000041000000000000000000088 +:101450000000000000000000000008000000410043 +:10146000000000000000000000000000000100007B +:10147000410040004000410000000000000000006A +:1014800010000500400000000000080400200000DB +:101490000500080003000000040000000000000434 +:1014A000000000000000000000000000000000003C +:1014B0001000081182208200A00384048200C00072 +:1014C0000810100008400000050002000202850319 +:1014D00008000000C0044004000004008200100066 +:1014E0008209080082000000000000008200000065 +:1014F0000000840082008200A00020202000040060 +:10150000084000000800100082000800A0008200CF +:10151000820008000000040000402000200082003B +:101520000000000008002004082000000000A000C7 +:101530000200000000000000020000000000100097 +:101540000200C100000000004100900091008801ED +:10155000020000000304000200000300030000007A +:1015600000A009000000080003004100000040C086 +:10157000000000004000000000000000800091001A +:101580000300000000000000080010A000000000A0 +:10159000000000001000000000000000002000001B +:1015A00000000000000008002000004000000000D3 +:1015B000090000008400080000000000C0000800CE +:1015C0000000000000000000000008400000400093 +:1015D0008220044000410000000400000000880850 +:1015E000000000000000400000000000C000820079 +:1015F00000000000000000000000000004000000E7 +:101600000080010001000000001100000000000047 +:101610000000000000000000000000008200080040 +:10162000080008008300000000000800000000001F +:101630000003002100082100000005000000000058 +:1016400000000000000000000004008410400200C0 +:1016500080000300800200000000000000000090F5 +:10166000000000000000000040000000000000003A +:10167000000000A0000000000000000000000000CA +:101680000090400420202020000000000000000006 +:101690000304030005042100000000000000000016 +:1016A00000000000000020002100000000000000F9 +:1016B000000000000000090002000000000000001F +:1016C0000000000000000000000000000000040016 +:1016D0009000000088080080000800040008000551 +:1016E0000010000000210041000000000000000088 +:1016F0000000000000008200000040020000000026 +:10170000C020000000000000000000008200000077 +:1017100008000000000000000000000000000000C1 +:10172000900082000000C0000000A0000000200027 +:1017300000000000000800080021800020000000D8 +:101740001000000000000000000000000000000089 +:10175000000000000000030000042184000240019A +:101760000000000010000800030003040004000053 +:101770002000000008000000000000000000000041 +:101780000000000000000000000000040000000055 +:10179000000000000000080000000000000002003F +:1017A0000000000000000000000000000000000039 +:1017B000030008000000000000000000000000001E +:1017C0000000900000000000000000000002001077 +:1017D0000088001008C1901183400004000102013C +:1017E00000010000000000000000000000000000F8 +:1017F00000000000000000000100000000000000E8 +:1018000000000000000000C000A001100010000057 +:1018100000000000000000000000000000000000C8 +:101820000000000000000000000001000000029025 +:101830000008000410900802002000A0041000001E +:101840000000000000000000000000000000008018 +:1018500000800080000000880903C02000C0004113 +:1018600080210503000200000000000000000000CD +:101870000000000000000000000002000000000066 +:101880000000000000000000008000000200008056 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000400000034 +:1018B0008000008000808000C00000000000000068 +:1018C00080000000004080000000000000000000D8 +:1018D0000000004000000000080010401100C1A0FE +:1018E00000800080000000A0000000000000000058 +:1018F0000000000000000000000000000000008068 +:101900000000000000000000008000080000000847 +:1019100000000000000000000000000000000000C7 +:101920000000000000000000000000000000004077 +:101930000000000000C10090808000000091800045 +:101940000080880000004001C0000000000000008E +:101950000000000000000000000001A0820008401C +:10196000C1A1000200C00000001000000000000043 +:101970000000000000000000000000000000000067 +:10198000000800000000000000000002000100004C +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B00000010000200088C0200908C0900088C0F5 +:1019C000404084C000400002004000C00000000011 +:1019D00000000000200000000000100020090001AD +:1019E000C04182C101000000900000000000000022 :1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000020000010000D3 -:101A10000000000000000000000000000000902016 -:101A2000000200412008010000000000000000004A -:101A300000000000000000000000000000000000A6 -:101A40000001000000000000000000000000000095 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000004036 -:101A70000020000500000000000000000000000041 -:101A800000000000000000000010004100100041B4 -:101A90000000000000000000000000000000000046 -:101AA0000004008500A1008040000000000000004C -:101AB0000000000000000000000000000000000026 -:101AC0000005002000400020800000000000000011 -:101AD0004140200020000210000000000000000033 -:101AE00000000000000000000000000000000000F6 -:101AF00004000820080010000000000000000000A2 -:101B000000000000000000000000000000000000D5 -:101B10000000000000000000000000000040000085 -:101B200000000003800000808020000000400000D2 -:101B300000000000000000000000000000000000A5 -:101B400000004100020021002003C000100002003C -:101B500084000110000000000000000000000000F0 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 +:101A000082000000000000000000000000009000C4 +:101A100002000000C0000000000000000000000004 +:101A200000000000000000000000000000000000B6 +:101A300000000000000003400002C002101003106C +:101A40000010C04010C00000008000800380000033 +:101A500000000000000000000000000080000009FD +:101A60002008002009900300000000000000000092 +:101A70000000000000000000000000000000000066 +:101A8000000000000900000000000000000000004D +:101A90000000800000008500000000000000000041 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000500C100000080800080E0 +:101AC000C100000080800000004000800000000095 +:101AD0000000000000000000800000000000000086 +:101AE000A182904110094002080202201000030068 +:101AF00000000000000000000000000000000000E6 +:101B00000009004100000000000000020020000069 +:101B100000000005000000000000000000000000C0 +:101B200000000000000000000000000000000000B5 +:101B30000000000000000000000080108080000015 +:101B40000000804000000000000000000082004013 +:101B500000000000000000000000C0004000400045 +:101B60004000C10903400800890001010000000095 +:101B70000100000000000000000000000000000064 +:101B80000000000000000000000000000001000153 :101B90000000000000000000000000000000000045 -:101BA00000000000044004200404A0000000000025 -:101BB0000000000000000000000000000000000025 -:101BC0000000000001900100010000000000000082 -:101BD00000000000810000E00000000000000000A4 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000700000000000000DE -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C2000000007000000000000000000000000426B -:101C3000000007000000000000000000000000009D -:101C4000000000000000000000000000000050FA4A -:101C5000BEBE000000000000000000000000000008 -:101C60000000000000000000000000000000000074 +:101BA0000000000000000000000000000000000035 +:101BB00000000000000000000000000010010220F2 +:101BC000A002880004008890208488000011000092 +:101BD00007000000000000000000000000000000FE +:101BE00000000000008180E007000000818100E02B +:101BF000070042000000000000000000000000009C +:101C000000000000008100E00700000000000081EB +:101C1000000007000000810000E0000000820000DA +:101C200000000000000000000000000000000000B4 +:101C3000000000000000820000E000000000000042 +:101C40000000000048420000000000004842000080 +:101C50000000C3C3000F00000000000000000000EF +:101C6000000000000000BAFB55553C00AA0000002F :101C70000000000000000000000000000000000064 :101C80000000000000000000000000000000000054 :101C90000000000000000000000000000000000044 -:101CA0000000000000000000C3FFC3F0C371FF711B +:101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD00050FA141400000000000000000000000092 -:101CE00000000000000000000000000000000000F4 +:101CC00000008124001100220280082002800820E8 +:101CD000000000000003000F0000000000000000F2 +:101CE00030000C0000000000BAFB00003C00AA001D :101CF00000000000000000000000000000000000E4 :101D000000000000000000000000000000000000D3 :101D100000000000000000000000000000000000C3 -:101D200000000000000000000000C300C3F00071CC -:101D30003C710000000000000000000000000000F6 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000812400001100220001400410014025 +:101D5000041000000000140000000000000000005B +:101D60000000C343C30300000000FF3F5050AA001F +:101D70000A0A00000000000000000000000000004F :101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA000000000000000000000000000FFFF000035 -:101DB00000FFCECE00000000000000000000000088 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 +:101D90000000000000000000000000005D0C7D3C21 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000024008100440000442481000041 +:101DD00004081020000000000000140000000000B3 +:101DE00000000000C341C300000000000F3F50503E +:101DF000AA000A0A00000000000000000000000025 :101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E20000000000000000000000000000000D3D30C -:101E3000D3D300FFFEFE0000000000000000000001 -:101E40000000000000000000000000000000000092 -:101E5000000000000000A0000000000000000041A1 -:101E60000006C00D0000000000000000000000009F -:101E70000000000000000000000000000000006101 -:101E80000A0E000D0000000000000000000000002D -:101E9000000000000000000000610006000D0000CE -:101EA00000000000000000000061000E000D00A016 -:101EB00000610006000D0000050000380000000071 -:101EC0000000000000000000000000000000000012 -:101ED00000610006000D000000000000000000008E -:101EE000C3C3FAFF00000000000000000000000073 -:101EF00000000000000000000000000000000000E2 -:101F00000000FFFFC33FC33F0000000000000000CF -:101F10000000000000000000000000000000003091 -:101F20000028000000000000000000000000000089 -:101F3000000000000000101F101F00000000000043 +:101E100000000000000000000000000000005D0C59 +:101E2000550000000000000000000000000000005D +:101E300000000000000000000000000000000000A2 +:101E400000000000000000240081880000880000DD +:101E50002481010240800000002000900005000065 +:101E6000000000000000A000000000000000106959 +:101E7000202F004D000805210A27850D00A0000035 +:101E800000000000000000000000000000000061F1 +:101E9000002F000D01A0000000000028000001A09C +:101EA00000615007800D00000000000000000000ED +:101EB0000000000000000000000000000000000022 +:101EC00000610007800D200060000000000010008D +:101ED00000000000000008000000000000000000FA +:101EE00000000000000000000000000000000000F2 +:101EF0000000000000000000003C003C000000006A +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 -:101F5000000055F0C3000000000000000000000079 -:101F6000000000000A0F0000000000000000000058 -:101F70000000000000000000000000000000000061 -:101F800000000004FBFFFF3FFF3F000000000000D7 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F700000008000000004000000003D003C000064 +:101F80000000000000000000000000000000000051 :101F90000000000000000000000000000000000041 :101FA0000000000000000000000000000000000031 -:101FB0000000000000000000D0DFD0DF00000000C3 +:101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 -:101FD0000000000055F0C3FFF4F0B4B400000000AE -:101FE000000000000000000000C2FFC2000000006E -:101FF00000000000000000000000000000000000E1 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF0000000000000008000F303FAFA0030F0C097 :1020000000000000000000000000000000000000D0 :1020100000000000000000000000000000000000C0 -:102020000000000000000000000000000000300F71 -:102030003000000000000000000073FF730000008B +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 :102040000000000000000000000000000000000090 -:1020500000000000000000000000FFFF3C00000046 -:102060000000000000000000000000FEFFFE000075 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:1020700000000000000000008000F3030A0A0030A6 +:10208000F0C00000000000000000000000000000A0 :102090000000000000000000000000000000000040 :1020A0000000000000000000000000000000000030 -:1020B000300F300000000000000000007FFF7F00B4 +:1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000000000000010 -:1020D000000000000000000000000000D7CFD7CFB4 -:1020E0000000200020000000000000000000A00010 -:1020F00000000000200010802000200000040000EC -:1021000000000000200088004000000000000000E7 -:1021100084000000200084002000200040004000D7 -:1021200000030200040020040200400088000003B5 -:102130004000000000002000200000002000C0043B -:1021400088808800040020042002048000800000B1 -:10215000002000000000000004000000000000005B -:1021600004000000000000A00000000000000000CB -:10217000100000000000410000020000008200008A -:10218000000000000000000000000000000040020D -:1021900000000000000000000000000000880000B7 -:1021A00000000000400000000000000000000002ED -:1021B0004000000240000000000000040000000099 -:1021C000200200024000200000000000002000204B -:1021D000400240034000000000000000000000003A -:1021E000000002000000002000000000000000418C -:1021F0000004001003000210092104000800000080 -:102200000000041002000000001082000000000026 -:102210000040000000000000000582800040000037 -:10222000001000000000000000000210001000007C -:102230000000000005000000000000100210020075 -:102240000000C00840000300034002000900000035 -:1022500040400000000002000400000000100000E8 -:1022600000400000001000000000000000C004005A -:102270000000020004002000000020000000040014 -:10228000000000820000040000840400020000003E -:102290000000000000000410000000000420040002 -:1022A0000000008800000000000000000400040896 -:1022B00004040000040008000000040041000000C5 -:1022C00004000400040080000800C0004000081062 -:1022D000050080C005004100090000000000030067 -:1022E00000000500411004080000880000004021A3 -:1022F00084030040000000008800000040028802C3 -:10230000000000000800080000000000900000002D -:102310000000000000000200000002050000900024 -:1023200004000000000004000000000000000005A0 -:10233000000000000000000000000000000000009D -:1023400088002000000000000000000084008800D9 -:102350000000840000000000008000000000000079 -:102360000400000400000004000004000000050058 -:1023700003000010001000000000000800008001B1 -:102380000021000000000000000000000800030021 -:1023900000000000000000000800000000840000B1 -:1023A00008840000000000000000000000000000A1 -:1023B0000000000000400002008200000800000051 -:1023C0004100400008200000000000080800000054 -:1023D00004000000080000000000080400001000D5 -:1023E00000004100210000000000000008118240B0 -:1023F00000000004080400000000000001080104BF -:10240000A002090202000000000800000009000408 -:1024100000000010000000000000000000000000AC -:1024200000000105000202000000000000000000A2 -:10243000000010400000400084000000C0000809B7 -:1024400010418200C0040000000400098409040057 -:1024500000040020002000210800000000100020DF -:10246000000000000800000008000840080000000C -:102470000000000000000000002008000000040030 -:1024800020210001200100000000000000400000A9 -:102490000000000000080308000000000200200007 -:1024A00000004000040000000000000000000000E8 -:1024B00020000000000000000000000000000000FC -:1024C0000800100000000400000040004000200050 -:1024D00021000000000020001000218800000300FF -:1024E0000000000000000000200000004000000488 -:1024F000000000000000840084000800C0001000FC -:102500000000400000000008000000000000000083 -:1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB -:10253000000004000000000000000800000000008F -:10254000A000080000400000900000000000000013 -:1025500040009000840404009000900004030000F8 -:102560000000002000000000001100202000A0005A -:1025700000000900000041001100000000000504F7 -:1025800000000000840009000000030000000000BB -:102590000000000000000000000004000000000037 -:1025A000008800000900000000000000000000405A -:1025B00000000000210000000000110000000000E9 -:1025C00000000004080000000000000000000400FB -:1025D00020009010000000000000000000009000AB -:1025E00000000000000400000000000005000300DF -:1025F0000000050000000408002108090800000090 -:1026000008000000000000000000000000000000C2 -:1026100000000000000000000000000004000000B6 -:102620000000000000000000000000001000004159 -:102630000000004000000000100000000800000042 -:102640000000001000008400000000000000820074 -:102650000000C000000000002000900040000000CA -:1026600000000000000084000003080000000000DB -:102670000000000000000000000000000000054015 -:1026800021000000210008000400000000040000F8 -:1026900000000000200000100000000000002008E2 -:1026A00000000000050040000000000000000000E5 -:1026B000000000000000000000000000000000001A -:1026C0000000000800000000000000000000000002 -:1026D0000000000000820800110400020304020050 -:1026E0000000200000A00202002000000000000006 -:1026F00002000000000400000000000000000000D4 -:102700000000000000000000000000008500000044 -:1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 +:1020D0000000000000000000000000000000000000 +:1020E0002111C00010402000C000C0002004840462 +:1020F0008880040084002000840004000000840024 +:102100002000820284008400100004022004880061 +:1021100084004000200020008800200088088402FD +:10212000000388002000200020002080C1802004BF +:102130002080200040002000040088112102C002FD +:10214000C008200020004000880000008800040033 +:1021500020048800200088032004200021038880B8 +:102160000580084000000001090000401000000048 +:102170002000400420004102400000004000000216 +:1021800010000002004000900000410205C040C065 +:102190000000000041004100009040000002008269 +:1021A0000008000040000000400240041008100435 +:1021B000100221041002200021022090000240039E +:1021C00040030002400009020902002040004008CC +:1021D000000200020002002000022190C0022084C0 +:1021E0000820100400880000020000000000000029 +:1021F00000002000408000000010084000000000A7 +:1022000000008410000002410000001002000000E5 +:102210000140001000000000084100100010000004 +:10222000020000100000000800008404008000404C +:10223000000000000000000000000000004002005C +:102240000200000001080000000000000000020081 +:1022500002000200000000000000000082000000F8 +:1022600002000000000000100008C0000000000094 +:1022700020000000000000040000000000004100F9 +:102280000008000800080010000800000008000016 +:1022900000080201200800002000090000000000E2 +:1022A00040100584401100004100000802010204B2 +:1022B000000000C000840008400005000900000084 +:1022C000000000000504100900080008000041009B +:1022D0000000000000000088000000000000040072 +:1022E0000000040004004008000000000000000896 +:1022F000000000080000000800021000000040007C +:10230000000000000100000000000000008000202C +:1023100000008800888800020000000420040009F2 +:10232000000000000000400000000000000020004D +:102330002000850084008510850002000000000058 +:1023400000000000000000050021000000008400E3 +:1023500000000000000000000008400084000000B1 +:1023600082000100030010000100030808000000C3 +:102370000000080000000000050008000300200025 +:1023800009000800000002A0210000100000000861 +:102390000020090011000040000041000000000082 +:1023A0000000040000000000000000000000000029 +:1023B00080008000200003002000100003000002C5 +:1023C00010000000040000000300004009000000AD +:1023D0000000410003000000210000000000410057 +:1023E0000000039010009000840004A09000C00042 +:1023F000C000C04082000000820082000000000097 +:10240000000000200000840084000820000010006C +:1024100008000804C0009009044010000400820075 +:102420001000040008008240C00082000000080084 +:102430000400A00482008200080010008200000056 +:102440008200400082009000820008008280A0008C +:10245000080008000840400008008200000010004A +:1024600082000400C0000800044008400800000882 +:1024700000000088000000001000050000000400BB +:102480000000100040A00000020021000000000039 +:1024900000000240001008040500000100000800D0 +:1024A00000000000200000002100210008000000C2 +:1024B000000000000000000009000000800000A0F3 +:1024C0000000000000000000000000000000080202 +:1024D00000C000000000000000000000000000003C +:1024E0000000110011000200000080010801080036 +:1024F0000011042000000000000010200000000077 +:10250000880082008200840011000180C080840065 +:102510000000088084000000000008009000000314 +:102520001000000000021000000000000000C000C9 +:102530000000000082008200000000000000000097 +:102540000000020000000000000010000000000079 +:10255000000000000000000000000800000008006B +:10256000820000000000C000200004000000020003 +:102570000000000000000800000000000000000053 +:1025800000000084000000001100108440080304D3 +:102590000000000002020000000004000000000033 +:1025A000000000000000000000000000000000002B +:1025B000000000000090000000000000100000007B +:1025C00000000940000003000000000000000000BF +:1025D00000000000000000000000000000000000FB +:1025E0000000000008080508080011008008200805 +:1025F000820811000021000000000000000000001F +:102600008400400020000000080082002011080023 +:102610000000200084100400C00000000020000022 +:102620000000002000000200020000008402000000 +:1026300002000000000000000000400004008200D2 +:10264000000000000041A0000000000000000800A1 +:1026500000000000000000000000820800000000F0 +:102660000000000000000000000010000000020058 +:1026700004002100020000880000000000000000AB +:102680000000000000000300000000002100000026 +:1026900000004100000000004104000000100000A4 +:1026A0000000000008000800000000000304000013 +:1026B00000000000000000004000000000000000DA +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00008000000000020000000000000000000C2 +:1026F00080008000840080000000000000000000D6 +:1027000000000000000000000000000000000000C9 +:102710000288882000829008041100A10009880422 +:1027200004200040002088200808828800040882D5 :102730000000000000000000000000000000000099 -:102740000000400000000000C00000000000000089 -:102750000000000001000000000000000000000078 -:1027600000001140000202889008000000000000F4 -:102770000000000000000000000000000000000059 -:102780000000000000000000000040004000820047 -:102790000000000000000000000000000000000039 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C0000000000080000000000000000000000089 -:1027D0000000000000004000000000000041002058 -:1027E0000003001109830388000580050000000034 -:1027F00000000000000000000000000000000000D9 -:102800000000000000000000000000002003100095 -:1028100041000388000000000000000000000000EC -:1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:102840000000000000000000000080028000000086 -:102850000000000000000500400020000300800090 -:102860000008802080401000820383A141100000F6 -:102870000000000000000000000000000000000058 -:1028800000000000000000000000000000000090B8 -:1028900001000000008800000000000000000000AF -:1028A0000000000000000000000000000000000028 -:1028B0000000000000020000000000000000000016 -:1028C000000000000000000020001000A001100027 -:1028D00000000000000000000000000001000000F7 -:1028E0000420A0018411C0900920030040854141CB -:1028F00000000000000000000000000000000000D8 +:102740000000000140010001000000000000000046 +:102750000000000001004000000000000000000038 +:102760000000000000000000000000000000000069 +:10277000000000C1008303000021000000000000F1 +:102780000000000000000000000000000000050044 +:1027900000008800800005800000804100100008D3 +:1027A00000848000000000000000800000000000A5 +:1027B0000080000000000000000000000000000099 +:1027C00005000000004100080503000000000000B3 +:1027D0000000000040000300800000000000000036 +:1027E00000000000000000000000000000000000E9 +:1027F0000000000000C14002820000080000000844 +:102800000080000000000000000000000003000045 +:10281000000000000800A0C14111C18400008085B3 +:10282000000000800000008500000080000000A083 +:102830000000008080000000000500000000000093 +:102840000000000300000080400040004103000041 +:1028500000000000000020002100090003820000A9 +:102860000000000000000000000000000000000068 +:10287000000000000000000002200800C10000006D +:102880000000000400000000000000000000000044 +:10289000000000000000118403C0402105C00200B8 +:1028A00010C01002C0C0900088C0904088C01000C6 +:1028B00010C0C09010C040002000820088000000BE +:1028C0000000000000000000000200000000010104 +:1028D000000000000000000000000100000000896E +:1028E00000000000000000000000000000000000E8 +:1028F0000000000000000000002083000000C10074 :1029000000000000000000000000000000000000C7 -:102910000000A00100000001000000000000000015 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:1029400000000000000000000000004000108410A3 -:10295000000800000000000000000001000020014D -:102960000001000000000100000010900090A08510 -:1029700040C0000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:1029900000000520001000030020000000000000DF -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000080000087 -:1029D00000000000000000000000000000200021B6 -:1029E0000021004000004000100000008002204153 -:1029F000838803C000000000000000000000000009 -:102A000000000000000000000000000000000000C6 -:102A100000000000418003200800200300000000A7 -:102A200000000000000000000000000000000000A6 -:102A30000000000000050009000000000000000088 -:102A40000000000000000000000000000000000086 -:102A50000080000000000000000000000000008274 -:102A6000000000000004210004000500200088A1EF -:102A7000058041000011000000000000000000007F -:102A80000000000000000000000000000000000046 -:102A90000000000000000102000001000000000032 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 -:102AD00000000004000000000000000000000000F2 -:102AE0000041000000000000210021882010880023 -:102AF000899110088888080100000000000000008B -:102B000000000000000000000000000000000000C5 -:102B10000000000000000000000000E007000000CE -:102B200000000000000000000000000000000000A5 -:102B3000000000000000000000810000070000000D -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 +:10291000000000000000000041900091C090904134 +:1029200091820182C002A00203A00090C0A0900288 +:1029300085080084C020908800000000000000008E +:102940000000000000000000000000010000000185 +:102950000001000000000000000000000001000075 +:102960000001000000000000000000000000000066 +:1029700000000000000000000000400901830090FA +:1029800000C1000000000000000000000000000086 +:10299000000000000000000000004108002080034B +:1029A00080414100408083000900C1000000800098 +:1029B00000804100000080000000000000000000D6 +:1029C00000000000000000000000090000080840AE +:1029D000001000410000000000000000002000087E +:1029E00000090008000000000000000000000000D6 +:1029F00000000000000000000000000000101002B5 +:102A0000000900C180050000800080000000000077 +:102A1000000000000004000000000000830500002A +:102A200040001100A1210580408009000000000045 +:102A30008000000080000000000000000000008016 +:102A400000000000000000050000000000004182BE +:102A500000000000050000000000000000004180B0 +:102A600020002000102000000000000000000000F6 +:102A70000000000000000000000000000000C18411 +:102A8000020980004000C000200010000200000089 +:102A900000000000000000010000000000008800AD +:102AA00004082010890009018220118810002000EC +:102AB000820804082000020008A0A0C0A0000000B6 +:102AC00000040010000000000000000000000000F2 +:102AD00001030000000000000000000000000000F2 +:102AE00001040000000001010000000000000000DF +:102AF00000000000000000000000000000000000D6 +:102B0000C103831004900000008100000700000052 +:102B10000000000000000000810000E00000000054 +:102B2000810000E000004842000000000000484230 +:102B30000000000000004842000000000000484281 +:102B400000000000000000000000810000E0000024 +:102B50000000810000E00000000000000000000014 :102B60000000000000000000000000000000000065 -:102B70000000000000E0070000000000000000006E -:102B80000000000000000000000000000000000045 +:102B70000000000000000000000000000000000055 +:102B80000000818100E007000000202030200000CC :102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD0000000000000000000FC0C6F6F000000000F +:102BA0000000201040802800410020400402400224 +:102BB0002004200440022200110020400402204092 +:102BC00004020000000000000000000000000000FF +:102BD00000000000000000000000000000000000F5 :102BE00000000000000000000000000000000000E5 -:102BF00000000000F242F242F330E7E7000000007C -:102C000000000000000000000000000000000000C4 +:102BF00000000000000000000000000000000000D5 +:102C00000000000000FF00F00F000C0C202020202E :102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C500000000000000000000000FC0C60600000AC -:102C60000000000000000000000000000000243010 -:102C7000242400000000FFFFF242F330242400006F -:102C80000000000000000000000000000000000044 +:102C20000000000004080201002800411080080193 +:102C30008001100810088001002200111080080196 +:102C400010800801000000000000000000000000EB +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C8000000000000000000000F00F000C0C00002D :102C90000000000000000000000000000000000034 :102CA0000000000000000000000000000000000024 :102CB0000000000000000000000000000000000014 @@ -103146,492 +103146,492 @@ :102CF00000000000000000000000000000000000D4 :102D000000000000000000000000000000000000C3 :102D100000000000000000000000000000000000B3 -:102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000919151 -:102D600091000000000000000000000000000000D2 -:102D7000000000000000666600FF0C0CFF0C66F609 -:102D80007EFE0000000000000000000000000000C7 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 +:102D200000000000000000001020080400820014D1 +:102D300014000014201004080000A00500820014F4 +:102D4000000082140000A00500000000FFFFFFFF4C +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D8000000000000000000000003C00FF00606048 +:102D9000F0F0000000000000000000000000000053 +:102DA00000000000000000000000804001028200DE +:102DB00014008200008240800201A0050000820011 +:102DC000140082140000A005000000000000063E70 :102DD00000000000000000000000000000000000F3 -:102DE0009191910000000000000000000000000030 -:102DF00000000000000000003C3C0F0F6E6EFF6EF4 -:102E000000F03CFC0000000000000000000000009A -:102E100000000000000000000000000000000000B2 -:102E2000000000000561000F00010000000000002C -:102E30000000000000000000000000000000000092 -:102E40000000000000000038000000A000000000AA -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000006101 -:102E70000006000D000000610006000D0005006165 -:102E800000060099000000000000000000000000A3 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000055D2D201C33DC3000065 -:102EB0000000000000000000000000000000000012 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E00000000000000000000000000003C00000086 +:102E100060600000100000200000000000000000C2 +:102E20000000000000650007800D000060600007E2 +:102E30008000100000610006000D08006000000026 +:102E4000000010000000000000000800000000006A +:102E500000000000000000610007800D000000007D +:102E60000001800000000000000000000000006180 +:102E70000006000D0000000000000000000000003F +:102E80000000000000000000000000000000100032 +:102E90002029804100080000000000000000000020 +:102EA0000000000000000000000000000000000022 +:102EB0000000000F0C0C00C000000000000000002B :102EC0000000000000000000000000000000000002 :102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF0000000000000C33CFF0F3C0FBE00000000BC -:102F00000000FF0A003C557D0000000000000000AA -:102F100000000000000000000000000000000000B1 -:102F20000000000000000000AAFFD2D201003D0016 -:102F30000000000000000000000000000000000091 +:102EE00000000000000F0C0C0000000000000000BB +:102EF00000003000FC00FE000000000000000000A8 +:102F000000000000000000000000000000000000C1 +:102F10000055003CFAFC0F0F00000000000000000C +:102F200000000000000000000000000000000000A1 +:102F300000008080000F0C0C00C0000000000000AA :102F40000000000000000000000000000000000081 :102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F700000000000000030F330F30F000F8200006B -:102F800000000000000A0F3F5F7F0000000000000B -:102F90000000000000000000000000000000000031 -:102FA00000000000000000000000000000003D3DA7 -:102FB00000C300000000000000000000000000004E +:102F600000003C3C5555000F0C0C00000000000018 +:102F7000000030000000F000FA0000000000000037 +:102F80000000000000000000000000000000000041 +:102F900000000055003CFAFC0000000000000000AA +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000C0C000FE1E1FF550000D4 :102FC0000000000000000000000000000000000001 :102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000003C55005500000000EB -:1030000000000000F5F75555F3F37D410000000086 -:1030100000000000000000000000000000000000B0 +:102FE000000000005050F000000F0F0F0000000024 +:102FF0000000000000000000BA00FF000000000018 +:1030000000000000000000000000000000000000C0 +:1030100000000000003C00550F0F000F00000000F2 :1030200000000000000000000000000000000000A0 -:10303000010100C3000000000000000000000000CB +:1030300000000000000000000C0C000FE1E1AA00FD :103040000000000000000000000000000000000080 :103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 -:10307000000000000000000000000055F055F0FFC7 -:10308000D7FF000000000507555530307D41000096 -:103090000000000000000000000000000000000030 -:1030A000000000038283000001058808041100006D -:1030B0000000000404002000840020000000000044 -:1030C00040004004A004C000400040000010000088 -:1030D0000210C100C000100020008800840000031E -:1030E00082004000C00040000280000088041004FC -:1030F0000400000040000100040020042000000043 -:10310000820400000000040488048204008082001D -:10311000000588000000000000000400000000001E -:103120004002008409080540002008000004000057 -:103130004000200005900900000000000000000091 -:1031400041000000000000004000000000001003EB -:103150000000000008040000000000024000000021 -:1031600000004000000020020008000400004101AF -:1031700000014000000200020440000000A0000026 -:1031800000004003000021000000000100010008D1 -:1031900000004102000000020040000000000000AA -:1031A000000000000040401000021000900040109D -:1031B00010000000000000000010080000000000E7 -:1031C000001001000200030000000400C000020023 -:1031D0000041040300400010001002000000000045 -:1031E0000000000002000008000008108400080829 -:1031F00000000410000000000000040000000000B7 -:10320000020002100000049002008480000005000B -:1032100000001103000000210000900002000440A3 -:103220000000830003000000820000A18000020073 -:1032300080008000000000400000000084000000CA -:1032400002000500400000002002020000100204FD -:10325000000402000000000004000400000002005E -:1032600000000282000000000000020000000400D4 -:10327000040400000011000000000000090000002C -:1032800002000302050004004004040003040500DA -:1032900010080400200000000400000004000000EA -:1032A0000004000002020000000000000400900082 -:1032B0004008000004000000000200008405000037 -:1032C0000021840000009000900000809100000028 -:1032D00000080800C00000000400000040000400D6 -:1032E00000000008000000000000000000000000D6 -:1032F00000000000000000000000000008000000C6 -:10330000002100088400020090210000C004010098 -:1033100009040004000000830021000000000000F8 -:1033200000008400000300000810000008000000F6 -:103330002100000041000000040000000000000027 -:1033400000000000000000000000008400082000D1 -:1033500000000000800000000000000000000000ED -:103360000000000000000000000002000900000052 -:103370000000030000001100000000A0000208A0EF -:103380002100030009001100039040000820000103 -:103390004000900100910004000411000088080022 -:1033A0001000000000000000000000000005000008 -:1033B0000402000901830020014000000000000217 -:1033C00090000000002000000040010000808420E8 -:1033D00000000100000008000000000000000040A4 -:1033E000C0000800000040000000000000000200D3 -:1033F00000008200100402000800A000C0000804C1 -:10340000040008400800400282090800024002103F -:1034100008110809A000C00008098202400010003D -:103420000000C00282000800080090200000000098 -:1034300004004002000820020000400008000000D4 -:10344000000000C0000000000088000040C0000232 -:103450000084000002000000410008084000000055 -:103460000000100000000000000004000000002028 -:10347000410000000200000010A005902000200084 -:103480000300080010104000052141004108030816 -:10349000419100889010100003001000218400006A -:1034A0000900000000020400410005200040100057 -:1034B00008000000400000000800000400000003B5 -:1034C000000000000000000010000000A0414000CB -:1034D00090002004820004000000000000000100B1 -:1034E00000000000080000000000080000000000CC -:1034F00004000000020000002000A00000200400E2 -:10350000A02000000003400008091004200004036C -:1035100000020200C004840009200020010800000D -:103520000811000082030000000000208200C0009B -:103530008200000000009020000000000001000058 -:103540004100080004000804000000000000000022 -:1035500080000000808500000040000000000000A6 -:103560000200000000000004000000000000000055 -:10357000000000000000000000408000000000008B -:1035800000000000000020000020002000000000DB -:10359000000000042004100200821000002020011E -:1035A000080400000000000000000000000000000F -:1035B0000200820040210000018200000011000092 -:1035C0000104000000000000900000000000000066 -:1035D00000080080000000000800004000110121E8 -:1035E000000000000000000040000000000000009B -:1035F00000000000000008000000080008000800AB -:103600000000C00000402000000082000200820094 -:103610009000A000080000000000080000200080CA -:10362000012100A00400000000000040080000008C -:10363000000000000004000020004002000009001B -:1036400000004005209002400800000040000004F7 -:103650000000050000020090000000002001200092 -:1036600008002000000000000000000040000004EE -:1036700041082100000000000000000000004000A0 -:103680001000000002000001218205000000080275 -:1036900000A000200020000011C0030000840000F2 -:1036A00000082000080802000002000003040000D7 -:1036B000080000000900004000020490009000A0F3 -:1036C000000000A000A000000000000000000000BA -:1036D0000000000000000001400000000001880020 -:1036E000000000000400880000000000A0000000AE -:1036F00000000000000000000000000000000000CA -:103700000000000185010000100000000000900092 -:10371000000000000000000102A18500111000114E -:10372000000141010800000100000000000000004D -:103730000188002000900040208020808000090047 -:1037400000800000030000000000000000000000F6 -:103750000000000000000000034180080303001087 -:103760008000000000008000000000000000000059 -:103770000000000000000000000000000000000049 -:103780000000000903089108000380000000000009 -:1037900080000008000800100002A090214002A054 -:1037A00000830041900311080002000000000000A7 -:1037B0000000100000800000000008001021050833 -:1037C000418011000500054141A1000000000000FA -:1037D00000000000004100000000910010001011E6 -:1037E000C108000000008000000000000000000090 -:1037F00000000000000000000000000000000000C9 -:1038000000000000088021000800038500008000FF -:103810000021800000000000000000418805A10395 -:1038200083200882410040004008418300000000DE -:1038300000000000000000210000000000000182E4 -:10384000012001A000020100010101A1000000000F -:103850000000000000000001000000000888910046 -:103860009101830184000000A000A000000000007E -:103870000000000000000000000000000000000048 -:10388000000000000000211001000100208910004C -:10389000400008010400009000000000000109023F -:1038A0008200A08521050010010000000109000030 -:1038B00000000000000000000040000000002000A8 -:1038C00000001000020004011001000002000000CE -:1038D00000000000000000000000000000000000E8 -:1038E0000100000001010002000000A000C0004033 -:1038F0000020402000C00000000000000000000088 -:1039000000000000000000000000000101000000B5 -:1039100000100002000200C00000010001000000D1 -:10392000400383200541A141000100010101010183 -:10393000000000000000000004000000000004007F -:1039400000410004000380108008800800038820E4 -:103950000000000000000000000000000000000067 -:1039600000000900410011110080000000000080EB -:103970000080000000000080000000000000000047 -:103980000000000000000000000000101108050306 -:103990001010008000800080008000000200030002 -:1039A000000000A1110483A1A01000202008052020 -:1039B0004041000000000000000080000000000006 -:1039C0001000808000000000001041808200100084 -:1039D0002041000000000000000000000000000086 -:1039E00000002189090009800311002000030080E4 -:1039F00000000000000000000000000000000000C7 -:103A00000000000000000000000000004102210052 -:103A1000100011100000000000000000102105112E -:103A20004100400002108885898010034100A000F9 -:103A300008004010000000000000000000008000AE -:103A400000000000028890009000880101C004007E -:103A50000800890100000000000000009000A000A4 -:103A600008001000010900880084000100000084A3 -:103A70000002000000000000000000000000000044 -:103A80000000000000000000000000000000012015 -:103A9000001000C0010000000090002000000101A3 -:103AA000000000000100109041100202C1000988CE -:103AB00002002100880100000000000000008800D2 -:103AC000820004008800000000E000000000000008 -:103AD00000E0000084820000000000000000000000 -:103AE000000000004100880000E0000000000081AC -:103AF000000007800000000000000000000000003F -:103B000000000000000000000000000000000000B5 -:103B1000000000E0000000000000000007000000BE -:103B20000000000000000081000000E00000000034 -:103B3000000000E0000000000000000000000000A5 -:103B400000000000000000003030303000000000B5 -:103B50003CF03CF00000000000000000000000000D -:103B60000CFC0FFF0000000000000000000000003F -:103B70000000000055AA000000000000F000000056 -:103B80000000000000000000000000000000000035 -:103B900000000000000000000000000000005F5076 -:103BA000C0C00000000000000000CFCF4545FF1757 -:103BB000C3170F0F000C0000000000000000000001 -:103BC00000000000000000000000303090300000D5 -:103BD00000003CF03CF0000000000000000000008D -:103BE00000000CFC00F000000000000000000000DD -:103BF00000000000000055AA001400000000003C76 -:103C0000AAFF00000000000000000000000000000B -:103C100000000000000000000000000000000000A4 -:103C20005F50CFCF0000000000000000CFCFCF00DA -:103C3000FF17C3170F0F000C00000000000000006A -:103C40000000000000C3C0C00000000024141414D1 -:103C50000000000003030303000000000000000058 -:103C60000000000000000000000000000000000054 -:103C70000AC00AC0000000007D283C3C0000000093 -:103C80000000000000000000000000000000000034 -:103C900000000000000000000000FFFF7D7D00002C -:103CA000000014FF14140000000000000000282889 -:103CB000E8E88000A0000000000000000000000014 -:103CC0000000000000000F000C5000000000141461 -:103CD00014140000000082820000000000000000B8 -:103CE00000000000000000000000000000000000D4 -:103CF00000000AF008F0000000003C3C3C3C0000E2 -:103D000000000000000000000000000000000000B3 -:103D10000000000000000000000000000000414121 -:103D200000000000F4FFF4F40000000000000000B8 -:103D30002020E0E0AA00AA0000000000000000002F -:103D4000000000000000000000000C500000000017 -:103D500000603006000D000000610007000D00004B -:103D60000000000000000000000000000000000053 -:103D700000610007C003200100000038004000007F -:103D800000000000009000000000000000000000A3 -:103D900000000000000000000000006100020001BF -:103DA0000000000000000090000000610006000D0F -:103DB000000000610007000D00000000000100008D -:103DC00000000000000000000000000030000000C3 -:103DD00000000000000080F000F00F0F555500C0FB -:103DE00000000000000000000000000000000000D3 -:103DF000000020000000FFFF0000000000000000A5 -:103E000000000000000000000000000000000000B2 -:103E1000000000000000000000000000505082D7A9 -:103E200005C7FFFF0000000000000000E1F1F3F310 -:103E300000000000008000C050005C0C00FF3C3C13 -:103E4000787855FF0000000000000000000000002E -:103E50000000000000000000000000003C3CFF00EB -:103E600000C0000000000000000000000000000092 -:103E70000000000000000000FFFF00000000000044 +:103060000000000000005050F000000F00000000C1 +:10307000000000000000000000003000FF00000021 +:103080000000000000000000000000000000000040 +:10309000000000000000003C00550000000F2180EF +:1030A0008280210021904100408041884080890039 +:1030B0008500C00488840404200082048404110074 +:1030C000A00004000490880088002000C0838400D1 +:1030D0004000200002008400C00089008500000339 +:1030E000C02020204184A08440008800200888005F +:1030F000880020002004200420002000C1000400DB +:1031000004002000408088002000A0004004C0048B +:10311000400040040000C00488008800400088800F +:10312000020440402040080520821004A00310043F +:103130000200024000000020404121C004012001A3 +:1031400002004000090000110000042000020040BD +:103150000400050009008900000400000202400488 +:1031600000002001040120202020410000A00000D8 +:1031700000002000000004C00000000040400202E7 +:103180000000402021000010050200020020800203 +:1031900040001090410240020002000004000900BB +:1031A0000010000000000100011000020102A10057 +:1031B0004000820001400810031000400180001010 +:1031C0000088000002000100000000000800000864 +:1031D0000000000000000000004008001000020095 +:1031E0000000000000040000200000030000004078 +:1031F0000004000400000200000090000100000034 +:10320000020000000100000020000041004000001A +:103210000000000800000000880000000000020418 +:10322000000004000008040008080884418510011B +:103230004000820004080800A00088000008200464 +:1032400041000420040809000808008400008000F0 +:1032500000400204400809000000000980048008C2 +:103260002008008200000009050005080010000881 +:103270000000041004000540000400844082080897 +:10328000040820082082024000000484400800084E +:103290000002020802840084208409044000000423 +:1032A00000080004001000000000000400080000F6 +:1032B0000000C000001100032000100200100403F1 +:1032C000040804410400000000210005C010002192 +:1032D00000000000000000000808000000100008C6 +:1032E00000211009000000000002890520000100F3 +:1032F000000040404000000800080008400800119D +:103300000000A00020008400000000000003000076 +:103310000000000000000000100000000008000095 +:103320004000000000800040400008000905040043 +:1033300000000000050008000800C0004000400137 +:10334000C0408090C0008040080009000804084187 +:103350002100084003040088080041000000000428 +:10336000080400A000040000000011002000C0A01C +:103370002000000000000000000003000000030027 +:1033800003000000008409000300000000000000AA +:10339000000000000800000000000300030000001F +:1033A0004100000000000004000040000000A010E8 +:1033B00008000400080008080080A000080082003F +:1033C0000880200082000840A002A0000840C00041 +:1033D0008304000000210400000008008200A00017 +:1033E000000000000800C0000800000004001000F9 +:1033F0000800404008040800000008040000000025 +:1034000000000400820082050000824008000400E1 +:103410000800000004008200100008000800C0003E +:10342000C0040800080091000840080040824000E5 +:1034300040A080000000000000000008008204009E +:103440002000002080000000030010010000410166 +:10345000400008000000000000000000080000001C +:1034600000000000008200000000040000000000D6 +:1034700000000000400000000000410000000000CB +:1034800010000000000041000000000021000000CA +:103490000000000020000000000000000400000008 +:1034A00000000000200000080200000040000000B2 +:1034B00000000000840000000021C000000288001D +:1034C00000201002828840004000200820050003F0 +:1034D00000400000000884000003100010110003E9 +:1034E00000000008080000000000000000050000C7 +:1034F000000000000000082100110003824000408D +:103500000003C000000000000000000000000008F0 +:103510000000000000000000820000080800900089 +:10352000100010000800A000C00008008400110076 +:103530000400000000000000000000000000000087 +:103540000002000021000510C090C0048900A00006 +:10355000114000000000028408041004050408045F +:103560000004050040040000000000000000000806 +:103570000000110000000000000000004090020464 +:103580000000000000000000000000400000008873 +:103590000000000000000000080000000000000023 +:1035A0000000000000000000000805881000210055 +:1035B000040840000000200000000803000010057F +:1035C0000000820040000021080508000000000003 +:1035D000004110000002001100041008000040210A +:1035E000001000000000000090000000000000003B +:1035F000002100000040000000000008000000085A +:1036000000000000000082000000820000000000B6 +:103610000000000000000008000020000000000082 +:1036200000009080000000000400A00004000000E2 +:103630004000C00000020000002002000000000066 +:1036400000000008000000000000800000000000F2 +:103650000000000009000800202000000000050014 +:10366000004000000004080000000000000000000E +:10367000000000000000000000000000000000004A +:103680000000000000000000000003000000000037 +:10369000000000000000000000000000000000002A +:1036A00000000000030200000000000000200000F5 +:1036B000000000000000C000000001001000000138 +:1036C000840008000001C0C09082010288A00000B0 +:1036D000040082010000040000000000840000C01B +:1036E000000200100040028800000090020000006C +:1036F0000000400000000000080800100084820460 +:1037000000000000000000000000000000000000B9 +:103710000000000000000000100000000000900009 +:1037200000000100A00000000000000000000000F8 +:103730000000000001000000800000001000800078 +:103740000041081082090003C080008002000000D0 +:103750004020802009080008200000000000000030 +:103760000080000000000000000000000000800059 +:10377000090011008000000000004000008040802F +:103780000000000000000000000000000000000039 +:103790000000000000000000000000000000000029 +:1037A0000000000010000000000000000000000009 +:1037B00000000000000041000000800280000008BE +:1037C000000010044100050809110000800080007D +:1037D00000001102028041200488000000008000E7 +:1037E00080000000000000000000800000C10021F7 +:1037F0008000000000080000000000000008000336 +:103800000088000000000000000000000000000030 +:1038100000000000000000040000000000000000A4 +:103820000000000000000000050020000000000073 +:1038300000000000000080000003808008001000ED +:103840001000020001010000000100002000020041 +:1038500082001040002100020000018340000800A7 +:103860004000100000000000000000001000C0C078 +:1038700088A1C00000000001000200000000080153 +:10388000000100108882000000000000000000001D +:103890000000000000000000000000200000000008 +:1038A00000000000000000000000010000400000D7 +:1038B000000000000000900002009000C004000220 +:1038C0000088008201C00001080101010001881088 +:1038D0008288000210C001010500020100010008F9 +:1038E0000088000800C0400000000200C000402026 +:1038F00000880088010800010001000100010000AB +:10390000408890400810891000000000000000006E +:1039100000000000000000000000000000000000A7 +:1039200000900020002000C0000000000001000006 +:103930000000000000000000000000000000000087 +:103940000000008000801080000810042121044144 +:1039500000808080000002804110A010912105109D +:103960000080008000800080800000000000800057 +:1039700000000080000021800008000800080041CD +:103980000000800000800080208000000000000017 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000008000080008002166 +:1039B00000080000000000000000000000000000FF +:1039C00000000002004000000000418510002100BE +:1039D000001100040021000000002005110908006A +:1039E00020030040000000800000000000000000F4 +:1039F00000008000000080000000800080000000C7 +:103A000080000000004000000000000000000000F6 +:103A10000000000000000000000000008000801096 +:103A20008000000000000000000000000000000016 +:103A3000000000050000000000000000001000026F +:103A400000000000000100210020000001C0010072 +:103A500001000000000100020088000000100000CA +:103A6000000001000001008800400000000000008C +:103A7000000000000400200284208800C000020032 +:103A80008800040000000200100208081000000076 +:103A90000000000000000000000000000000C00066 +:103AA000080082001000000000000000000000007C +:103AB0000000000000000000000000000000000105 +:103AC000008900200000810000E000004200810029 +:103AD00000E000006000884100E0070050008181A4 +:103AE00000E007006000000000000000000000008F +:103AF00000000000000A000000000000600000005C +:103B00000000000000000000888100E007000000C5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B4000008100E00700008100000000F5F5A0BC46 +:103B5000000000000000000000000000FFF028F856 +:103B60000000000000000000000000003CF0AAFA85 +:103B7000000000000000000008FBFFFFF7F7C3FF94 +:103B800028F83CFC0000000000008282D2D2AAFA91 +:103B900000500000000000000000000000000000D5 +:103BA0000000F8F828FF0000000000000000AAFA5A +:103BB000AABE00000000000000000000000000009D +:103BC0000000000000000000000000000000A0A0B5 +:103BD000A0BC00000000000000000000000000F099 +:103BE00028F80000000000000000000000003CF089 +:103BF00000F000000000000000008ABAFFFF202053 +:103C0000003C28F800F000000000000082D282D2C0 +:103C1000BABA101000000000000000000000000010 +:103C200000000000282828280000000000000000F4 +:103C300000F0003C00000000000000000000000058 +:103C40000000000000000000000000000000000074 +:103C500050500F0000000000000000001F143F3C07 +:103C60000000FF0000000000000000000000000055 +:103C7000AA00AA003D3D7D3C00000000FFFF0F0FA1 +:103C80002D2DFFAA0000000000000000000000FF32 +:103C9000CACA41417D7D0000000000000000000014 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC000000000000000000000001F1F1F14000083 +:103CD000000050503F3000000000000000001F14A2 +:103CE0000F003C3C505000000000000000000000AD +:103CF0000000B4B4141405055500000000000000D5 +:103D00000F0F2D2D550000000000000000000000E6 +:103D100000FF000000003C3C00000000000000002C +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D400000000000000000000000000014141F1418 +:103D500000610007809D00010061000780050000F0 +:103D60000061502F809D01A105610A2F850D01A0E2 +:103D70000000000000900001000050000000000062 +:103D80000000300000000005A0610006000D0000EA +:103D9000000000610027800D00000000000000000E +:103DA00000000000000000000000A0000000000073 +:103DB0000000000000000090000000610006000DFF +:103DC000000000000000000000000061002F000D56 +:103DD00001A50000000000000000000F00FFF0FA45 +:103DE00030BA00000000000000000505FC0CFF00D8 +:103DF000AC00000000000000000000000000000017 +:103E0000000000000000000000000000000028F892 +:103E1000AAFA0000000000000000000000000000FE +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E4000AAAAAAAA000000000000000000000000CA +:103E5000000000000000000000000000000F000053 +:103E600000AA30BA000000000000000000000000BE +:103E7000FF00AC0000000000000000000000000097 :103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000FAFA2E -:103EA00082D705C705C70000000000000000A0F091 -:103EB000F3F3000000008080C0C05F0F5F0FF0F0E0 -:103EC0005555787800AA00000000000000000000AE -:103ED0000000000000000000000000AA0000000038 -:103EE0000000FFF0AA3C00000000000000000000FD -:103EF0000000000000000F000B0B04003C3C000021 +:103E900028F800F000000000000000000000000012 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC0000000AAAAAABA000000000000000000003A +:103ED00000000000000000000000000000001F1FA4 +:103EE0003F0F00AA141400000000000000000F079C +:103EF000030700F5000500000000000000000000BE :103F000000000000000000000000000000000000B1 :103F100000000000000000000000000000000000A1 -:103F20002F2F2FFFAFAAEFEB0000000000000000D2 -:103F3000FCFCFCFC000000003535FFF07F3C703CD1 -:103F4000ACAC000F003C8E8E0000000000000000B2 -:103F500000000000000000000000000000AACF45A3 -:103F60000000000000F0AA3C00000000000000007B -:103F700000000000000000000F0008082028696908 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F400000000000AA55005500000000000000001D +:103F50000000000000000000000000000000000061 +:103F600014143C0050FA141400000000000000007B +:103F70000F040304007D0041000000000000000069 :103F80000000000000000000000000000000000031 :103F90000000000000000000000000000000000021 -:103FA0000000282828FF0F00CFC3000000000000F9 -:103FB00000000F050A000000000035350F007FFFEC -:103FC00070FFACACF0FFC3FF8E8E0000000000005D -:103FD00000000000000000000000040004002000B9 -:103FE000200020001000840020004000100000800D -:103FF00004001000880302082000880088004000A8 -:10400000208084004000020400008400000084003E -:10401000840020002000020420000003C01188005A -:10402000880004000000840020038800000088004D -:10403000200488800409200020008800408040C1BE -:10404000200020C0080020002004008000000000A4 -:1040500000828800000000000000040000000084CE -:104060000000008400400000000000000000008408 -:10407000000280002100000040000000000000005D -:104080000000000805020000400010A040A0090048 -:104090000902000440000000890021000000100017 -:1040A000210000000000000000000000110040009E -:1040B00000004100000809002100400240001004F7 -:1040C000C0020084000580000000000100044000E0 -:1040D00020000003000000000090000200008200A9 -:1040E000080000004010000200000000020900006B -:1040F0008500028904800000000004100000000018 -:104100000300051010020202020800100010020055 -:104110000005840008410000004003000100000089 -:10412000020200000204001004000200000000026D -:104130000000089003204008888000100409000552 -:104140000000021000100209000000100500081015 -:1041500000400540400005100000000000000889F4 -:10416000000011000500800100C100000284001061 -:1041700020000200000289200400000000880440A2 -:104180000400400040008989040100000008020981 -:1041900000000008021002000084008488844008A7 -:1041A0000000040100080010058400080008000851 -:1041B0004009200082024000820141020384110074 -:1041C0000408000084090001C0100408041108401C -:1041D000401100824084800008000402000040C0BA -:1041E00000044011002000008800000000000005CD -:1041F00004210005000800108521000800000005CA -:104200000005000000020008000800000000000097 -:10421000000000000000000000000000000000009E -:10422000000000000000002100000000002100212B -:104230000010000220000008000520040004000413 -:104240000005000300090003100800414005400874 -:1042500000008440400084000008000200091000B3 -:10426000004110000000008200A04000000000009B -:10427000000809020000000040A0400011000008F2 -:10428000080000000800080100000003000003000F -:1042900008001000000000000000000000080000FE -:1042A000410000000000090005000800410800006E -:1042B00000000200110000A005A0040400884000D6 -:1042C00021044000090000001120030041004104C6 -:1042D0000040002000910000090010000084000050 -:1042E00041004000080000020011901082080009FF -:1042F000C00000054002844008040041080200009C -:10430000084100008400100010000800004108105F -:104310000000C0008200082008001000040008000F -:10432000A0000800C00000000800080000040810F9 -:104330000902408200098300200040020421080491 -:10434000890300114084081182000009000082885E -:10435000000000000040100504000080881190005B -:104360000840084020040240000204881140400434 -:1043700009000040404000402040000009040304C0 -:104380000002410000000088000400040000020058 -:10439000000008000000080000000000000000000D -:1043A00080A000000900100000000000410041C092 -:1043B00010004001C10300000800210090014100ED -:1043C0000400400803002002000040004040008438 -:1043D0004141099041001100000003040002212026 -:1043E0000200000000000000000000210000C000EA -:1043F0008400002100000000880000000000400050 -:1044000000000000000000000008000000000000A4 -:1044100010000008000800000000820000000000FA -:10442000080002400000A000820000001000000907 -:104430000800040040008200040082008208C000DE -:104440000020C000081110401008820500408200C2 -:1044500040200009000204200004820082000420A1 -:104460000800001140004000400082210490080034 -:104470000300000000900004008810080000000005 -:10448000800000000208000000000020100010085A -:10449000100400080000000000000000000000847C -:1044A0000000000000000000000000000000030207 -:1044B0000000000000000000000000880004000070 -:1044C00002000000000002040004809009000900BE -:1044D000000005A040084004048800890804040086 -:1044E000000000041000000440040000030000412C -:1044F0000040900082000000000000C000000000AA -:104500000121008800800082004100090040000075 -:10451000001100030008000000050000000000007A -:1045200082030400200400000008000000000000D6 -:104530000000104184218221400008001000A000EA -:104540008403100384000003A0000200A0080021DF -:10455000080008020421000440004000102100026D -:104560000003000000000005100040000400C00827 -:104570000090200200840340050400001104032081 -:1045800000002090080420040003004009000300FC -:1045900000040000000020040000000000000000F3 -:1045A000000000000000000000000000000000000B -:1045B0000000000005000000000080000000000076 -:1045C000400020002000000041A005008000419034 -:1045D000000003002005000000002100000003008F -:1045E0002002039000000090080011000000080065 -:1045F00005000000010004000000000100000001AF -:104600000000000000008400000000000000000026 -:104610000000000001000000000000010001000196 -:10462000000100000000000000004004010290A012 -:1046300000020000000100000000000140412108CC -:104640008402A0021002014010881004A11184838A -:104650000091100202C001021011202002C0048843 -:1046600084408208000109000801000100000000E8 -:10467000000000000000030080000000004000096E -:104680000505000500001100C00000000004001036 -:1046900000040009000021000000000000200020AC -:1046A0000020002000000000000000008008210819 -:1046B0000010000200000010000000100008089028 -:1046C000889080C1001000A003A00085800990C1DF -:1046D000002100040080A08821A0098280828580BA -:1046E00083008080800000020805000200020000B4 -:1046F000000000000000000000008000000000003A -:104700000000000300000000000080009080000016 -:104710000000000000001000090011000940000026 -:104720000000000080000000000000000000040005 -:1047300009020589090500000000000000000000D2 -:104740009000A120A0021003A0000405800282C0F6 -:10475000A0800320C1201002C000202104808240DC -:1047600020852110050009C0C0000000030084213D -:1047700000000000000000000400A0000400004051 -:104780000000000000000082A000A0000800C1900E -:104790000000000000000000008400000000010193 -:1047A000A000A000A0000800000000000000000021 -:1047B0000140000001C100C0000000000000000036 -:1047C0000000A0900300A140410903048300A091D0 -:1047D000058888400500820885A1A1881100010490 -:1047E00008019010030120081089042090000000A7 -:1047F0008201000000000000000000010000000134 -:1048000000000000000000000000000002000000A6 -:104810000001000000000100000000010000000194 -:104820000001000001000000000000000000000086 -:104830000000828900000110A003000000000000B9 -:104840000000000020A100A100031002C00901A186 -:1048500000C0A002821000A088080882A00800A161 -:1048600020901190841000A020912182000001016D -:10487000A000000000000000000001000002000095 -:10488000000200020000000040000000000880005C -:1048900000080908000009000400000000100000E2 -:1048A00000080010000003004100090000000000A3 -:1048B0000000000000210205088309050000000037 -:1048C000000003000000002105900321808080216A -:1048D0000810201088800000048080008080000084 -:1048E000059011100920009000A000080904004163 -:1048F00003028002032000000000000041000000CD -:1049000000000000000000000000000000000000A7 -:1049100000800000000000000000000000004110C6 -:10492000210040000810000200800000000000008C -:10493000000000000000A0000821892102400000C2 -:10494000000000000000000090401080A080901047 -:10495000C104218008A185000288C089028004204A -:104960004185830021800240C120A08041809104C4 -:10497000202110214000030400000000000000007E -:1049800000000002004000000000000000000000E5 -:104990000000000800A0000000000000000000006F -:1049A00001880000000001000001002000A00000BC -:1049B0000000000000000000C10202018401C101EA -:1049C0000000000000000000000008082010044063 -:1049D0000901110104029185110090411120210863 -:1049E0001001C1402082898489004121A182901058 -:1049F0000300008501A001C00100000000000000CC -:104A000000000000000000000000000000E00000C6 -:104A10000000000000E007000000000000000000AF -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A400000810000000000000000000000000000E5 -:104A500000000000000000000000600000000000F6 -:104A600000000000000000E000000000000000E086 -:104A7000000000000000000000000000000000E056 -:104A80000000000A0000000000000000000000001C -:104A90000000000000000000000000000000000016 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC000000000000000AA5500550000000000009D +:103FD0000000000000000000000021000100880037 +:103FE0000484040021002000400040802000A00044 +:103FF0008280200084002004200220002080840091 +:1040000082800400840040008400201020002100F1 +:104010008800840088002004200000032000208005 +:104020000500200020008800880088002000200073 +:10403000040004042000030020102005208010004C +:104040004000400040002000040485022000880059 +:10405000C000400040008200200020040400040052 +:10406000200021204100100000000000000440005A +:104070004020000400000084409010004000C00474 +:104080004000050840000900000009004000000051 +:1040900008024000210200000000009000004140A2 +:1040A00004042000000209000090404000001000BD +:1040B00000200940000040C088C000410000090401 +:1040C000000020000000C0000000000040030902C2 +:1040D0000000210400020000000200000002014074 +:1040E00000400190901000000000000000900200CD +:1040F00000102004209000000000020000100100C9 +:104100000000000000900000000000040010020009 +:104110000000001000000010000000080100000076 +:104120000004000000040010000000000000001067 +:104130000000000000000000004000C0004001003E +:104140000004044000000000030003800008000099 +:104150000000020000000004000000000000000554 +:10416000400004011040000800080900020000029D +:104170000000000000010904400040080082030420 +:104180004000000000004004000820840008008473 +:104190008088400040000004008200844100080440 +:1041A0000000008400000901050400400408200804 +:1041B000048204040000000020080000414009912E +:1041C0000284000940000900000810841008090951 +:1041D00004084088400800000508000441080284E3 +:1041E0000500A021021001000000004100A1000014 +:1041F000004000110000000008000421C021200040 +:104200009008000801002000210800100008880024 +:104210008420C008880484002000200000080000DA +:1042200004400000000000000000008000000021A9 +:104230009011880000080021100000000808030801 +:104240000000004000000008000000000000000026 +:1042500000020004400000000000900040218200A5 +:104260008208000005000001040000000300002097 +:10427000050004000808038408000010050400007D +:104280000084008241A020A04190A0000800090005 +:10429000030041010000038400000084900000003E +:1042A000000080010000040000000000000400087D +:1042B0000084000008A0000000004100030080000E +:1042C00082000300002000000002000008840000BB +:1042D0000900000108010200000008002100080098 +:1042E00000000000210082008411000088004002CC +:1042F0000400C020010082002000C00000008240B5 +:1043000004008200100000098200081008090880DB +:10431000C0A10080C00090000000C0000800820220 +:104320000804100082080000C000000010002000F7 +:1043300000000800A0200000820000000802000029 +:1043400000408240100009000440A000000000046A +:10435000C000820808002104A040080000000400FA +:104360008200C00010008400000000400400000033 +:1043700041002100100104C000008000040000087A +:1043800000000000001020000000000000000000FD +:1043900003042004400800000000000000000000AA +:1043A00008000000002005000000210800000000B7 +:1043B00080080000000041004000000021000000D3 +:1043C0000000080100010008880000000000000053 +:1043D00000840900000900A0A0014108000041007C +:1043E0000000000000002000000000000800002085 +:1043F00008000000042000000808841100000400E8 +:1044000000000000080000009000820020008204EC +:104410000000000090000800080820004000820012 +:10442000A000000010080000C0000000000500040B +:1044300000008200000000000011080800000000D9 +:1044400000000000000002000000A100840008003D +:10445000000000000000100000008280000000004A +:1044600010000000000000000000820000000300B7 +:1044700011010000000090080008200021A0004069 +:104480000000081011900300110041040900800091 +:10449000001000000090000000000000000841042F +:1044A000008809080088000800040008000009824C +:1044B00000A100000040050009000000000000000D +:1044C00000000000000000009000000008A00000B4 +:1044D00000000300210005000000000000020000B1 +:1044E00000000000000008000804000403000003AE +:1044F000C0000000002004110000100000000000B7 +:1045000000000000002100080021000000009000D1 +:10451000010000100000014000C000A089880000D8 +:104520000000020000004000000800000008000039 +:104530000000000008000000002110000000000042 +:104540000400000800000200080009000000090043 +:10455000A0008400040002000800000000008304A2 +:104560000011000000000800000000000000000032 +:1045700000000002110000018000000200000000A5 +:104580000000000000000500000000000002000024 +:1045900000882000020000901001000900051004AE +:1045A00000000000000000000000000000A0040067 +:1045B00000000300000000000000000000000000F8 +:1045C000000000000088000202000000020000005D +:1045D00088A0000000000000400200000000000071 +:1045E0004001000000000000020008000800000078 +:1045F00003001009900200049083919082908388B8 +:104600000090010100009001000000000000000087 +:10461000000001000101C00100008801010101004A +:10462000900004000000000008002090002000001E +:104630000090000000009000010000000000000059 +:10464000000000000000000000000000C0C0008268 +:1046500000200202000000000000000000018901AB +:104660000001000100000000000000000000000048 +:104670000000000088C180A000A00082100010800F +:1046800082000000101100218508002000000000B9 +:10469000000000002000032080080020C041040426 +:1046A0000220802000000000000080000880000040 +:1046B0000500008000000000000004000000000071 +:1046C00000000000000000000000000000008080EA +:1046D0000000000000000000000003000000004196 +:1046E0008810050300210000000000000000000009 +:1046F0000000000000008000800580C000800000F5 +:10470000000880808080028041002011200000008D +:1047100000000000000002800900090000899000EC +:1047200084000400C18000000000000000000003BD +:10473000008880800080000000000000000300006E +:104740000000000000000000000000000000000069 +:104750000000002000808000000200000000000037 +:10476000008021000000410800000000000000005F +:10477000000000000000000088000291044108C011 +:104780009000880184400890009000000001000023 +:10479000000000000000000000C0000000000089D0 +:1047A000032083000100C190000000000000000011 +:1047B0008800102010A0000200000000000000018E +:1047C00000000000000000000000000000000000E9 +:1047D00000009000880000C0C00000010000000040 +:1047E00000000002010000000101000000000000C4 +:1047F0000000000000000000000090880000114050 +:10480000110290880088009100030001000100005F +:104810000100000000000000000000000101010094 +:10482000010100A10089019100C100A000C0001099 +:1048300000C00802001000100090000000000200FC +:104840000000000000000000000000000000000068 +:1048500000000000C0040090008203C000000000BF +:104860000000000000000000010100010000000045 +:104870000000000000000000000000000800080028 +:104880008500048080020005009000C1000800033C +:104890002020112000000000000000000011111174 +:1048A0001020110400080090048400C100000000E2 +:1048B00000800080008000000080000000000000F8 +:1048C0008000000011000000000000000000000057 +:1048D000000000000000808000000080A180000037 +:1048E0000000000000000000052008212041000019 +:1048F0000000000000000000000000000000800038 +:104900000002808000008002800800800000090012 +:10491000201120000303000000000000000041807F +:104920001100210009004105048804002003000053 +:104930000000000000000002000300000000000072 +:104940000005000000000000000000000000000062 +:10495000000000000000000080008009000000004E +:104960000005000000000000090520000300050804 +:104970000000000000000000000000000000000037 +:104980000200901104020800900110000090100035 +:104990000000000100000101000000000000000014 +:1049A000010801000100000001000189010000016F +:1049B0000000000000000000200120880088200086 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000C000880120026C +:1049E00002000000000000000000000001000000C4 +:1049F00000010000000000000000000000000000B6 +:104A000000000011000007000006810000E0070020 +:104A10000000000000E000000000000000000000B6 +:104A20000000880000E000008421888100E0070089 +:104A300000000000000000000000818100E007008D +:104A400000000000810000E0000000000000000005 +:104A50000000000000000000000000000000000056 +:104A600000008421810000E000000000810000E0DF +:104A70000000000000000000000000000000000036 +:104A8000000000003F3FF6063C3C6666C3C3C3C35C +:104A9000CF4E8D0C00000000000000000000000060 :104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000008080003E3 -:104AC0006600242400000000000000000000F33015 -:104AD0007E7EC0C0FF66FCFCE724F9BDF924BD243E -:104AE000F9F900D000DB030FC3FF839F839F4202CD -:104AF000C3034042C0C300000000000000000000EB -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 +:104AB0001C201414000000007C7CFC3C99999999FE +:104AC000096F0CCF00000000000000000000000093 +:104AD00000000000000000000000000000007C7CDE +:104AE000FC3CF4F4FCF000000000000000000000BA +:104AF00000000000000000000000000000000000B6 +:104B00000000000000003030F606663C663CFF996D +:104B10006600CF4E8D0C0000000000000000000079 :104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B400000006600242400000000000000000000B7 -:104B5000F3304242C0C06666C0C0E72460BD602436 -:104B6000BD246060D0D0DBDB010981999F9F009F4D -:104B70006606FF0F6066F0FF000000000000000006 +:104B300000003C002424000000006060F0003C3CC9 +:104B4000FF00096F0CCF0000000000000000000013 +:104B50000000000000000000000000000000000055 +:104B60006060F00024243C00000000000000000011 +:104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 :104B90000000000000000000000000000000000015 :104BA0000000000000000000000000000000000005 @@ -103640,496 +103640,496 @@ :104BD00000000000000000000000000000000000D5 :104BE00000000000000000000000000000000000C5 :104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000F0F86 -:104C10000F0F0000000000000000000000000C0C5E -:104C20000F0600000000000000000000000000006F -:104C30000000000000000020000000000000000054 -:104C40000000B1C3B100000000000000000000003F -:104C500000000000FF3C660FFF0FF9F90600003C62 -:104C6000427242729900D2D23C303830FF004E4E30 -:104C7000C7C7FFFF09F93030F030602000000000A6 -:104C80000000FFFF00000000000000000000000026 -:104C90000F8D0F8D000000000000000000000000DC -:104CA0000C0C0900000000000000000000000000E3 -:104CB0000000000000000000FFFBFFFF00000000FC -:104CC00000000000B1FFB13C000000000000000047 -:104CD000000000000000003C660FFF0FCFCF660011 -:104CE00066004272C3F3FF66D2D23C3C3838000003 -:104CF0004E4EC7C7000009F93F3FFF3C6624000045 -:104D000000009898989800000000000000000061E2 -:104D10000006000D000000610007000D00000061AA -:104D200000070005000500610006000D000000619D -:104D30000006000D000000610006000D00000000EC -:104D4000000000000000A0610006000D000000004F -:104D500000610006000D000000610006000D00006B -:104D600080610006000D000000610006001D0001CA -:104D700000615003000900010061500600010000BD -:104D800000610006000D000000610006000D00003B -:104D90000000000000FF00FF000000000000000015 -:104DA000000000001455000000000000000000009A -:104DB0008080FF553CFFFFFF000000000000000066 -:104DC000000000000000000035353535100F1F0FC2 -:104DD0000000000000000000000000000000FF20B4 -:104DE000FF203C0F00FFEBFBEBFB00ACF0AC000046 -:104DF000000000000000FF5FFFFFF0AAFF3C303022 -:104E000030FF3A0A3AFAAF3C3C3C00000000000098 -:104E100000000000000082FF007D00000000000094 -:104E200000000000000055550000000000000000D8 -:104E300000008080AA0000C3000000000000000005 -:104E400000000000000000000000FFF00F00100054 -:104E50001F000000000000000000000043000200EE -:104E6000FF34FF343C0F0055415141510FACFFACB2 -:104E700000000000AA0028A0FF5FFF5FF0AA003C2E -:104E8000BABABAFF3AFA3AFAA03C3C3C0000000039 -:104E9000000000000000000000000000FF3FC00014 -:104EA0000000000000000000FFFF000000100000F4 -:104EB0000000000000000000FFFF0000C2C7C3C3E5 -:104EC000000000000000000000000000DFCB9E8A10 -:104ED0002828000000003C3C3C3C00000000C303CC -:104EE00043430301C3412028303C3F3F03030F00ED -:104EF000050500C00000FFBFFEBEF555C141000022 -:104F000000002F28FFFFF0AAC3AA82C3BEFF000043 -:104F10000000000000000000000000000000FFFF93 -:104F200000000000000000000000FFFF0000000083 -:104F300000000000000000000000FFE3FFE3C3C327 -:104F4000C3C30000000000000000000000005D4935 -:104F50001C080050000000003C3C0F0F0000000047 -:104F6000030343430F05FF55A0AAF0FF3F3F030390 -:104F70000F00050500C0A0A0BEBEBEBEFFFFC3C39C -:104F8000000000002F282F28F0AAC3AA82C382C3E2 -:104F90000000000000000000008000800009040004 -:104FA000C0000000002004022000A000C10000009A -:104FB0002000200021022000C00088008204C000E0 -:104FC0004000C00000002000200084008204C002D5 -:104FD0008820001000041000000320002000A02002 -:104FE00004004100840084002002880020824000E8 -:104FF0008820408040090000C0002000A000A000E0 -:1050000000000000848200102000040200000480E0 -:1050100002040000400000004000201000100000CA -:10502000000200C00540000200010000080020004E -:10503000000040000202080100000004000000021D -:10504000200000000000100000C01002400000001E -:10505000400040002004000000000000400000006C -:1050600009000900880040840000004041024020FF -:1050700008001101080800000800000000000900F5 -:105080000000400010000002000100020082000247 -:105090004004100100008000000000000280A0C158 -:1050A000028084004000828002099040A00000003D -:1050B0000000000000024000092108020800000072 -:1050C000080003000100A000000084000020000090 -:1050D00000000400000000000000080500000000BF -:1050E00000000400020283000000411002100000D2 -:1050F0000010040084028440908203090021404093 -:1051000085000810820008004082000082800000B4 -:10511000014000000403880088000402020000101F -:105120004010091000888088020211820088054022 -:1051300000000000000010018000C084C109800050 -:10514000000000004008400000000082020004004F -:1051500020080400000800080484400004840000C3 -:10516000000800840500400840080408900104116C -:10517000000000C0000000C1040804110200028405 -:1051800082C00800800500C08008844100840008B7 -:1051900000840800000002100410098800010310B8 -:1051A0008905000082050010000040000021401029 -:1051B00020210008000088000404000800102000DE -:1051C0000008040800004000000000080005000876 -:1051D00000410000000090000200000800000008EC -:1051E000000000000000000800000102002001088B -:1051F000002100000005840004000510C021888201 -:105200000010C00040024000100000208808840008 -:105210001040840000000000000000000000002199 -:105220000011040400A00020000010008000000015 -:105230001000000000000000040800000000000151 -:10524000000000A000820000002000080000000014 -:1052500000A0000000000000000009000400080099 -:105260000000000009004190080009004004098284 -:10527000100000900508209011020202100104881D -:105280000403210009080900210802880204090218 -:1052900000020903008800000088080008A005003B -:1052A00000004108041108000800081082000000F6 -:1052B00000080000012040004000A00002000000A3 -:1052C0000000C010000000100000001008200000C6 -:1052D0000500002000000000080040100800100039 -:1052E000822108000000C0008400C000400040216E -:1052F0000800000082000800400484000840828802 -:10530000419000028405C000820008000020400097 -:10531000901000200002820008000000001000022F -:10532000084000000020008400C0042002090000A2 -:10533000402000050004402080000420008400007C -:1053400004C0009000040000000200000000000003 -:1053500000001040000000000000000000000000FD -:10536000000000C010000000118200C00000050015 -:1053700088000300038805084188400000842088D5 -:10538000400208110084090840042000408211886E -:10539000000008C000040001080003000800000825 -:1053A00000012100000041100000041005418200AE -:1053B000000020000004088040000221002020009E -:1053C00000000000C0000000000200040000000017 -:1053D0000040000000000000840000000000000009 -:1053E000000008008400C0000000000000009000E1 -:1053F00084008200020004080411A008C000C0005C -:105400001040C00008001002100040200800A0005A -:105410008200104082100800880008218400C00229 -:10542000000200004011000000000400800188001C -:10543000000040008000080100400004000041001E -:105440008000000000000000000000100088400004 -:105450000504000000000000000000000000000043 -:1054600000000000082000000020000000080000EC -:1054700000200800040000000505050402040300E4 -:10548000089020082004832010010800024010200A -:1054900003000404080021011008050203000500B0 -:1054A0000090200000000020000008009080880488 -:1054B000000004080841C00002080200004000008B -:1054C00000090000004002000080001000110000F0 -:1054D00000020000000000000000000000000000CA -:1054E000002100000000000000000000000000009B -:1054F000000000000000110000000100000000009A -:1055000000000009C005000008084082904110001A -:10551000400240119040A041000202000000000043 -:10552000822008000021000090000000400011408F -:1055300040040020C09021040000802003000300EC -:105540000000090000840000059000100200000027 -:10555000000000010000000000000000000000004A -:1055600000101000000000A000000040000000003B -:1055700000000000000800004000000010000002D1 -:105580004008000005C0118208008000A041000210 -:1055900011C0001010000800000211890000002056 -:1055A00003001000800008880000002000001100A7 -:1055B000008200000000000011C120900120820044 -:1055C000C0104090018304888200010000010001A6 -:1055D00001000100A0000000000100000000000028 -:1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000C001A000000149 -:105600000001C108912040A09008000801408420BA -:10561000001108A0000400C0A00240C083100210C6 -:1056200082A008A04102104002C000000000040057 -:105630000001000000000000000091C180900209FC -:105640008011058900200482000500000804002064 -:1056500000021000400000000000004100020000B5 -:1056600000400000000000000000000000000000FA -:1056700000000000000000000000000080418041A8 -:105680000010001089008300008080000002088064 -:105690008011001080800089002000880080218017 -:1056A0008080800000808380000080000003031160 -:1056B00080200021000000000000000080090000A0 -:1056C0000040008000A000858041008009000400A7 -:1056D000890080110200210040004000000000000D -:1056E00000000000000000000000000000000000BA -:1056F000000000000000000000000000000010801A -:1057000088200809831000000000800000001000BD -:105710001020030841210000800880808000208044 -:10572000A00520800908A080212085111083400059 -:1057300009000200102000000200820084C0020064 -:1057400090209001A0C0C09088C0042088C0909094 -:105750000000A00010000000000000080000000091 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:1057800001108300110809820800080040008810F9 -:10579000018200000090012108000201A002040023 -:1057A0004002030009840483880409000291A0894F -:1057B00000C0000001000100000000000002000025 -:1057C00021020102C088850291A0A108C090C002F8 -:1057D00000040084014100000000000000010001FD -:1057E00000000000010000000000000000000000B8 -:1057F00000000000000000000000000000000000A9 -:1058000000000084000201820082080500080040B8 -:1058100088C0C001000000004000104000408482A9 -:105820000010889000A004041103409000090008B3 -:1058300000C0000100000001000100000000008025 -:10584000000040002003840091804100110080008E -:1058500040800010100221A100200010000500214E -:105860000010000000001000000000000000000018 -:105870000000000000000000000000000000000028 -:105880000000000000001100058020000040001012 -:10589000008000A08009100900030009000020809A -:1058A00000000000001000898003899000000002C1 -:1058B0000020009000022120082100080000004084 -:1058C000000000000011000500C1028009008000F6 -:1058D0000200400010100011210000030080800031 -:1058E0000000004000000000000000000000000078 -:1058F00000000000000000000000000000000000A8 -:10590000000000000000A111A01002801000001093 -:10591000000000000000A10003218800000000003A -:105920000080000080004100C1802100050241028A -:10593000A10082801104210820000000400800001E -:1059400008A1001000000001A00800840104040068 -:1059500084402108080000A1000001020001880223 -:105960001000200000000000000000000000000007 -:105970000000000000000000000000000000000027 -:105980000000000000000000039020A000C0000004 -:105990000001000200080000C1A084018200A000F4 -:1059A000080008109020A000C18282824102840079 -:1059B000890388C011C08901014101000000000075 -:1059C0000000000007000000000000E007000042A7 -:1059D000000000E00000484200000000000000005D -:1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10006006000000000700820000000000000097 -:105A20004100000000000000000000000000000035 -:105A30000000000000E00000000A0000000000007C -:105A40000000FF00FF00FF00FF0000FF00006000FB -:105A500000600208802000110022000000002B28B6 -:105A60002B2800FA05FF00000000000000000000E5 -:105A70000000000000000000000000000000000026 -:105A8000000000000000000000000000FFFFAAFF6F -:105A90003C783C3C00000000C0C0F5052B2800000D -:105AA00000000000C300AF005F5F5F5F5F00430066 -:105AB000C3C04140AAAAAAAA0A0A287D0000000081 -:105AC00000000000FF00FF00FF00FF0000FF0000DB -:105AD000090000090104401011002200000000002C -:105AE0002B282B2800FA05FF000000000000000012 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B1000AAFF3C783C3C00000000CFCFF5052B28C5 -:105B20003C3C00000000C300A0003CFF3C3C5F5F29 -:105B30004343FFF05550CF0CFF3C5F5F287D0000D2 -:105B40000000000000000000FFFFFFFF5FFF0550A6 -:105B50000000040108020600900004100820000064 -:105B60000000FF00FFC30000000000000000000074 -:105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 -:105B90000000000055555555FF28FFF8AFEFAAEB60 -:105BA00014000400000000003FFF3F0FFFF08F8053 -:105BB000B2B2FF3C82AAC3FFCF0CCF0C00C0F0C032 -:105BC00000000000000000000000FFFF00000A00CD -:105BD0000AA00000104020800006009001400280D2 -:105BE00000000000FF003C0000000000000000007A -:105BF00000000000000000000000000000000000A5 -:105C00000000000000000000000000000000000094 -:105C1000000000000000F55505552828F8F80FCFC2 -:105C200000C3000000000000000030F03000FFF072 -:105C3000BFB0B2B2C30080A0C0F00C0CCFCF00C088 -:105C400050C000000000000000000000000800102C -:105C500000A015639A0D0009100000610007000DF7 -:105C6000080000610006000D000000610006000D44 -:105C7000000000610006000D0000000000000000B0 -:105C80000000000000000000000000000000000014 -:105C90000000000000610006000D00000061000629 -:105CA000009D0000A0610006000D000000610006DC -:105CB000000D000000615006000D000100610006AB -:105CC0000091000100610006000D000000000000CE -:105CD00000000000C3C3C3C30F0F0F0F50500C0CC4 -:105CE00000000000F0F0F0F0FF00FF0000000000F6 -:105CF00000005353000000000000000000000000FE -:105D00000000000000000000000000000000000093 -:105D10000000000000000000FCA8000000000000DF -:105D20000000C3C3C3C3055505003F1500000000B4 -:105D3000000000000000C3410F007D3F0000FFF0A5 -:105D400035350FAFFFAF7D55FFD7FCFF3CFF00009F -:105D5000000000000000C3C3C3C30F0F0F0F50505B -:105D60000C0C00000000FAFA50500F0F3F3F0000EB -:105D70000000000000FF0000000000000000000024 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000FCA8FCA800000000BB -:105DA000000000000F0FAAAAFFFFFFFF3F153F15DD -:105DB000000000000000000000410F007D3FFFFFD9 -:105DC0000F00353500A0F0A02800AA82F5F50505E2 -:105DD0000000000000000000FFAA1E1E00000000DE -:105DE0008383C0C300000000BF00BF00C0CFC0CF8E -:105DF0000000000055AF3C3C0000C3000000000064 -:105E00000000000000000000000000000000000092 -:105E100000000000000000000000007D0082FFF094 -:105E20003CF00000000000000000F5F5C5C5F0C31F -:105E3000FF007F407F400000000000000000CFCF47 -:105E4000C0C000000000FC3CFEBE20A03CFF7D7DE9 -:105E50000F0F000000000000000055001E1E000093 -:105E600000008383C0C300000000FF40FF40505F7C -:105E7000505F00000000FFAF3C3CFF00C30000008B -:105E80000000000000000000000000000000000012 -:105E9000000000000000000000000000003F00C003 -:105EA000FFF000F00000000000000000F5F5C5C59F -:105EB000F0C300007F407F400000000000000000B1 -:105EC000F505F50500000000F000FAAA2CAF3CFF34 -:105ED000FFC30F0FC0004000400020002040A00082 -:105EE000000020002180A1004080200084002000CC -:105EF00020002000040040004000000521000000B8 -:105F00000000200020009000200004004000C0009D -:105F100088082000000320001000400040112002EB -:105F2000008004102080840088008841C000208008 -:105F300020022080210084408200002040C12000F7 -:105F40000002C00020808804000000000000000063 -:105F50008541C0002000200000000000000000007B -:105F6000000040400000040404000910102000005C -:105F700040004000100040000000200000024000EF -:105F8000000000C0400041000800000009A000001F -:105F90000000080404C000004000C00080000000B1 -:105FA00000001002400140080900400010004000BD -:105FB00000048000A010200020000090200110208C -:105FC0001100100020401002099000000040000065 -:105FD00000040400000000000102200020008400F2 -:105FE00000000010080984000440890004400900F2 -:105FF00000400000002000100200400000001000DF -:106000000800000000000010081004000403000253 -:10601000000000800000001000000000000290005E -:1060200040040000414009004008900500020800BB -:10603000080220000810908420100840020001008F -:10604000C1411000040082004080000010000010D8 -:10605000900000002000000000002005800091005A -:1060600000A00300000185100088800004000310D8 -:1060700008840910001000100085000884840008BE -:106080000008840000000008000584080000418822 -:1060900002090488004000004008000000080811C0 -:1060A0000408898500888805C010840904080083D5 -:1060B0000588828880000001001184098010041086 -:1060C00020882008800002000400890200400000AF -:1060D0000084000004000484030003024008000957 -:1060E000000090000041000004080008000091003A -:1060F00088088200882100000000000300000010D2 -:10610000000004100021000000000008000000084A -:106110000005002140028821C0038800000000081B -:10612000C000000000030421A002002182410400FD -:10613000901000089110202020002021409020087D -:1061400010024003A0000400840540020400041073 -:10615000084008030811A0400820080000080900B2 -:106160000300400800080900030040840200000802 -:10617000080000C00908210000000000050000021E -:10618000088200A0000010080000000004000000C9 -:1061900000001010000000000800000003000000D4 -:1061A0000001080002000400030040010300040095 -:1061B0000040088205A0402080889010C0A04104C3 -:1061C0001082002021904000218805041001001059 -:1061D000009009A003904008104000A00008004073 -:1061E0000009A08020108211100000000002208011 -:1061F000010400200020014000000008A0008240AF -:1062000008000000C04104048400001082008200E5 -:1062100082030800A041A00082050041080084110B -:1062200000008200840008100404880000008441FB -:106230004040082108000800400200400800C0104B -:106240004002A0000808084104400000008040808F -:1062500000048200C040C009040040020800001190 -:106260000420000040108001038804000000008822 -:1062700000020805204000C104A0000000040088BE -:1062800000110000400000A00020000000000000FD -:1062900000000004100000900010000000008800C2 -:1062A000050000000082000800004000030000100C -:1062B0002000031010C080C000C0040100000000D6 -:1062C00003012041000000001100110004901002A1 -:1062D00000020000080004000000000000000000B0 -:1062E0000484000000030040A0218205000000009B -:1062F0000800001000000000004100000003004101 -:106300000000840000000000C040001000211008C0 -:106310000000000500000000400008000800040024 -:10632000040000400000884082400480000804000F -:10633000C08004208202A000020000050940000283 -:106340000400410310208200081182098205002107 -:1063500000214000A0200020000010088209080051 -:106360000041080010000000000100004000110082 -:106370004000000000A140904088110021900800DA -:106380000000008405000000004040A0080000005C -:1063900008000000000000000000000000A0000055 -:1063A0000000000005000000000009000402400099 -:1063B0000900410204A005000282410009204002B8 -:1063C0000000050040A0210405208088080004008A -:1063D00005000008850020080090032040002020D0 -:1063E00000400220030000009008A0084110411165 -:1063F0000421000000048411100400000810008033 -:106400000009000000110008000300400021040002 -:106410000000000084210400002100090000822106 -:10642000820000050021010000000005082102A1F2 -:10643000C01010042000840000000011821000042D -:1064400084002004A00810212003842100000405FA -:10645000081000030102000400038200400800004D -:106460000000000008009000000000000002400052 -:10647000400000A0000011044004000000C020C043 -:1064800020400008008400020040000000090000D5 -:10649000054000000000000000004100100040081E -:1064A00000000500410000084084000000000010CA -:1064B00000020000410000000000000000C01104C4 -:1064C00000880004858420022040918404004088D4 -:1064D000084011000000080021000400090000002D -:1064E0000004008800040004080000000582040283 -:1064F00001820902844004020382C09008C0908493 -:106500000088828800080008000800C00000000021 -:106510000000000000000001000000010000000079 -:1065200008000000A00400088410C09000000000D3 -:1065300001000801000110A1011040A1000108A004 -:10654000830200A000838240001003A0044091C198 -:106550009103C020829101830021C02100820000AC -:1065600000000000000000880082000890908489EC -:10657000A1A1048482848080808082800000858044 -:106580008000090080000080000000800000000002 -:1065900000000000000000090008000800100000D2 -:1065A000000080000000800010808000800000005B -:1065B00000004103400500080890218980880020E0 -:1065C00020910310009000A1000000001080000046 -:1065D00008C1034041108082212010C00002000247 -:1065E000000000000000000000800000000000002B -:1065F0000240A1409004C0000040800800028000DA -:10660000004180A0008480800000000000000000A5 -:106610000080800080000011000000030000800066 -:106620000000002000000000800080028091000037 -:106630000000031041002010410309008041850043 -:10664000090503000908C10082A003041000900995 -:106650000800090021038000A082080008100580BE -:1066600041A1000000000000000000008002008046 -:1066700000004001048504A020A0400104052089F9 -:1066800084A0880090034010081000000200A000C1 -:10669000880000C010008400840284000200000012 -:1066A0000400000000000040000008004000A0209E -:1066B0000040000000020000000101200804100159 -:1066C000A190010200908200A000090320000900AF -:1066D000A000010020C02100020083880002000108 -:1066E000011001A1000000000000000008000209E4 -:1066F00082028400A140C004080482C10540000554 -:1067000084200584C0900008904008A0000000008C -:106710000000100000000000000000000000000069 -:106720000000000000010000000000004003002005 -:10673000021182100001000100000101010190001E -:1067400001000008100000080021A01082C1C0084C -:1067500002010000010940200008910911022001F6 -:106760000001010082000000000000000000008223 -:10677000009000A000084109038380900004C1023A -:10678000008300048490A08000000000000000004E -:1067900000000000000000000000000000000000F9 -:1067A0002000080000000010000900040002801012 -:1067B00000800005850900010008001021214041EA -:1067C000000020080380C02000C105408509800228 -:1067D00000840020000402908009050988090980CE -:1067E000002100400503A00400000000000000009C -:1067F0000000000000000000008500C00000000054 -:1068000080040040808280000011000200800000AF -:1068100000000000000000000000020010800000E6 -:1068200000008000000000000000000000000000E8 -:10683000001100848000000000012180200004007D -:106840000411418008000500041021000304100019 -:106850008008008000000000000341218421208086 -:106860001003030020401000204100000000000041 -:106870000000800080C10000000010088820C08255 -:1068800010000801A04140051000C001200308408D -:10689000040000000010004000000000002001087B -:1068A00000000000080210401000A0000000880056 -:1068B00000008800C0A008200800000101040000BA -:1068C0000100000183A001080800020021900804D3 -:1068D00041041000001000080000000009411008E9 -:1068E00004840101204090000100A001000000008C -:1068F000000000000400880590848800000000E08B -:10690000070048000000000007004800880000E081 -:1069100007008200000000000000000000000000EE -:106920000000600000000000000000000000000007 -:1069300000000000000000000000008200000000D5 -:1069400000E00000410000000000000084000000A2 -:10695000000000000000000000E000000000000057 -:1069600000E007000000000000000000000600003A -:1069700000000000000000000000070042000000CE -:106980000000000000000000000000000000F69081 -:106990007E7EFFDBFFDB0000000000000000000047 -:1069A000000000000000F0F0F0F000000000F0F047 -:1069B000F9F900000000424242420F0F0F0F0000A1 -:1069C00000000000000000000C0C3C3C0099009905 -:1069D000030F0303000093FF00000000C3C3C3C301 -:1069E000F0F0F0F024FF2FFF0000DBDB00000000E0 -:1069F000000000000000000003030303000000FF8C +:104C000000000000000000000000F630F63F000049 +:104C1000000030F3F3F33FFF30F00000000000002D +:104C20000000000000000000000000000000000084 +:104C300000000000000018182828000000000000F4 +:104C40000000FFFFFFFFFCC0FCC0000000000000F0 +:104C50000000000000000000000000000000000054 +:104C6000000000000C6E0CFF0C0C030300000000A1 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000630063FA9 +:104C9000C39FC39030F330300FCF00C0000000003E +:104CA0000000000000000000000000000000000004 +:104CB0000000000000000000181828280000000074 +:104CC00000000000003CFF3CE4E4E4E400000000DD +:104CD00000000000000000000000000000000000D4 +:104CE0000000000000000C6E0C0C00000000000032 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000008561BD +:104D10000A2E051D00A10061000F800C000000613B +:104D20000001000100000000000000000000004140 +:104D300000048009000000000021804000080000FD +:104D40000000009000000061302F800D00A00000E6 +:104D500000610007800D000000000000000000005E +:104D60000000000000000000A000500000900005BE +:104D700000650007800D000000610007800D000045 +:104D80000000000000000000000000000000000023 +:104D9000000000000000000000000000555500C0A9 +:104DA0000035FF35F0C3AAC300000000000000007A +:104DB000F01400000607020300500030000000005D +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF0000000000000000000000000000000000FA4 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E200000CF0035FF35F0C3AAC30000000000002A +:104E30000000F00000140E0F0A0B005000303C0080 +:104E4000F000000000000000000000000000000072 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E7000000000000000000000000000A080A00072 +:104E80000000000F00000000000000000000000013 +:104E9000000000000FFF553C000000000000000073 +:104EA000000000000F0F0F0FF0C3AAC300000000A6 +:104EB0000000000000000000003000300000000092 +:104EC0000C000A00000000000000000000000000CC +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000000000000000000000000C2 +:104EF0000000000000000000000000000000FF149F +:104F0000FF05A0A0505000000000000000000000BD +:104F10000000000000000F00553C000000000000F1 +:104F2000000000000000FFC33C00F0C3AAC3000063 +:104F30000000000000000200020000000000000F5E +:104F4000003C0C000A00000000000000000000000F +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F70000000000000000000000000000000000031 +:104F800014140505A0A0505000000000000000000F +:104F900000000000000000000400200220002000AB +:104FA0002000200084000400850084008800C000E8 +:104FB000020040008580100088808880040400047E +:104FC00020080400040088214040880240408840B6 +:104FD0004000204088000405000304002000C000B9 +:104FE00084004002210088802084200004808820E2 +:104FF0002084880020052004208420002082412075 +:1050000020A0400804000000200084002000400090 +:105010004000890020002004400200000000210020 +:105020000000400040400040090002002000000055 +:105030000000040020404002210020044004000140 +:1050400000010000000040000000000140000901D4 +:1050500000011000004100000000000000000900F5 +:1050600000C00900000004004004000440000020CB +:10507000050140200040000009A01002090009209D +:105080002003040500822000040004020000000048 +:1050900000002120100000000002A001000000001C +:1050A0000400000200000000001004000000104096 +:1050B0000400040000000000011082020040000013 +:1050C00000000410020000000000040002080000BC +:1050D00004000000000800100000000400000200AE +:1050E0000000000000080280000000000003000033 +:1050F000000000000000011010410100A0000004A9 +:10510000200002802000020002008800020000004F +:10511000020002000021890800000108019000003F +:1051200040900010001100100000000000880000F6 +:105130000000400040A040000400400002050000C4 +:10514000040020000000000000000084008404101F +:10515000000841000210000000000084090800005F +:10516000000004000008400400040000000802845D +:1051700000080084040800080804C10802000408AC +:105180004008C10000048004040000004008400002 +:1051900004820000040404041009098440824002CF +:1051A00004000010400010410000C000C0000000DA +:1051B00001000200028002000240024002020408D4 +:1051C00001008880010003080000C08083080200FD +:1051D0008200020002080208030002080090021088 +:1051E0000000080800000800C00000002000A02007 +:1051F0000420001100000800000000000000000072 +:1052000000100000202100030000000040214000A9 +:1052100000218800880800000000400000080021EC +:10522000000810000000100000000400008840008A +:105230004010200880008004800880018001C101A6 +:1052400002000200004002A0820041000040020073 +:10525000800008008800C1008888A000800000400D +:105260008000000008A00084000000000000800012 +:1052700000018001000041004100101010000300F7 +:10528000000000002100C10000000900000000A093 +:1052900008000000000041000000080000000000BD +:1052A0000000000008000000880000020200020068 +:1052B0000400040082000404080002000000000052 +:1052C000088004000200080082001000840008002A +:1052D00008000840000004000000840082008200F2 +:1052E000900088400000080004001040C000080042 +:1052F00082000400C00082008200020082000800D8 +:105300004002040002008200820008008200A00027 +:10531000820090098200820882008204C0409002CC +:10532000C0400000040000000000000000018300F5 +:1053300080008000800008004001020000000200A0 +:10534000000004400800A10000884108000400009B +:105350000004040000000000408200000000000083 +:105360000000000008C000004000000000000040F5 +:1053700003000300210020000300000000004000A3 +:1053800000002100000021C00000210041000000B9 +:1053900041000000000000002100000021884008BA +:1053A000080000840320030000000000900040007B +:1053B0000400040040000200828300000040094015 +:1053C000000000000002C0C0000202000320000034 +:1053D0000105008000808540110010002041204020 +:1053E00008410000004000400000040000000000F0 +:1053F000840001000000088004000000000000009C +:1054000000000000000510008200000010000000F5 +:105410000000044100088200004000000000080075 +:10542000820000000000C000A00011004040030402 +:105430000900800083044008C008044000080001FF +:1054400020A108000000000500410000A00082002B +:1054500008020200214000400200824080008400D7 +:105460008020000000040805000500000400000082 +:1054700000000500200000000420000000000000E3 +:1054800000000000030000400000100000000000C9 +:10549000000000000504000000040084000000007B +:1054A00000000020000000000000000000000000DC +:1054B0000000000000000000022100210040004028 +:1054C00002410080020000000100200000000200F4 +:1054D0000000000000000021000900084021000039 +:1054E0000800000000400040000000000000000034 +:1054F00000000800900000000020000000000000F4 +:10550000080000098800100810000208A00004002C +:105510000008000000000800001002210008000040 +:105520000000000040020000000000000000000039 +:1055300000000000000000000000A00000000001CA +:1055400000010000020400000000400800000320E9 +:10555000A0000000400200820000000000000002E5 +:1055600000000000004000010001000000000000F9 +:105570000000000000002000000400010000000006 +:105580000000004000900002009000000088200011 +:1055900000000000210040000300000000000000A7 +:1055A000080000001100001011880000400003886E +:1055B0000000000084000000C0C0000800C010000F +:1055C00002C100009105000100C00000040040007D +:1055D00000C001011005000000C00000000000A094 +:1055E00001C100010101000000C000000000000234 +:1055F00000000000000000000000000000000000AB +:10560000000088A000900002084000000000A000F8 +:1056100000004141008800884004000000000000B4 +:105620000000000000000000000000000000A000DA +:1056300000001000210000000000C0800080000079 +:1056400000008091030382A00008118021008000E7 +:10565000000000C003088005000900800000000071 +:10566000000011C1090202090000008000000500CD +:1056700000800000000000000000000000000000AA +:10568000090000000080000000000000000005008C +:105690000000000002400009409100A0000000004E +:1056A00000000000000000000000000000000000FA +:1056B00000000000000000000000000000000011D9 +:1056C0008080800041800300201188004100080094 +:1056D0000511880040804004104088000000000050 +:1056E00000008000118002218000C180800800033A +:1056F0000000800000000000000000000000000822 +:105700000000000500000000000000800000000014 +:10571000000200000000000000080083800000007C +:105720000000000000000000000000000000000079 +:10573000410005044180000000000000000000005E +:1057400002000808C000009000000101C100000034 +:1057500041000000C100001001000001C040000035 +:1057600000000000C000008801008400C188020120 +:1057700000000000C0000000000000000000000069 +:105780000000000800000040400000001008000079 +:10579000000000010002000090009001A008080035 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000010101A0000000010000000045 +:1057C0000800001000C0C0C000000000010101C1BD +:1057D00040000001840000C100000004000000C07F +:1057E00000C00000000000C040000191880001C11D +:1057F00000000002000000C00000000000000000E7 +:105800000000000002000200000040400000001004 +:10581000C0400001000000000001A010040400A02E +:105820004110000000000000000000000000000027 +:10583000000000000000000000000020002000091F +:10584000000980000080000080800010000005201A +:10585000029100410003000210C0004021091041E4 +:10586000008500000000000000808009038284049D +:1058700009C100000080000000800000000000005E +:105880000000000000008000800005000000000013 +:10589000008000000020002000410041808088003E +:1058A00005001000000000000000000000000000E3 +:1058B0000000000000110000002000200000000097 +:1058C00000000000800000400000800003002091E4 +:1058D0009000030380000000000000209185030079 +:1058E000418002088000000000000000C18202091F +:1058F000040003118005000000000000000000000B +:105900000000000000000002004100000000804094 +:105910000000000000008040000080000000004007 +:1059200000200000800000000000000000000000D7 +:1059300000000000000000800000000000050000E2 +:10594000000000000000C0000002C0C01000000005 +:10595000010302000101C000400000000001C0047A +:10596000000000080001C000000000C0C000C1111C +:10597000010100000100C000000000000000000064 +:105980000000000000000000000100010000000015 +:105990000800080204408200C0012000400002000C +:1059A0000800089104408200000000000000000090 +:1059B000000000000000000000C000000000000027 +:1059C000000000000000000000410000070042123B +:1059D000000000E0000000000000000000000000E7 +:1059E000820000E000000000000000000000000055 +:1059F000810000E000000000810000E000000000E5 +:105A000000000000000000000000818100E00700AD +:105A100042000081000007000000000000000000BC +:105A20000000888100E00700000000000000000086 +:105A30000000000000000000000000000000000066 +:105A400042000000000000000000050504045000B2 +:105A50005500F0F0F0F00000AAAA000000FF0000DE +:105A6000FFFF0000FFFF0000F0F000003C3C0000E2 +:105A70003C3C0000FFFF0000F0F00000FFFF0000D2 +:105A8000F0F0000000000000000000000000000036 +:105A900000000000EBC0EBFC00004100AAFA3CFC57 +:105AA0000000000030EBF3EB28787878000000006D +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000404CE +:105AD00050000000F0F0F0F00000AAAA000000FF63 +:105AE00000000000000000000000F0F000003C3C5E +:105AF00000003C3C000000000000F0F0000000004E +:105B00000000F0F0000000000000000000000000B5 +:105B1000000000000000EBC0EBFC3C3C7D3C00F0D2 +:105B200000F0000000003028F32828282828000072 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000A0A015 +:105B5000A000000000000F0F000055550000FFFFDF +:105B600000000F0F00000F0F0000FFFF00003C3C83 +:105B70000000FFFF0000FFFF0000FF0000003C3CB2 +:105B80000000C3C3FFFF0000000000000000000091 +:105B9000000000000000000000FF00FFEB28EB28E1 +:105BA0000000000000000000FF004545FC5C0C0CFC +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD0000000A000000F00550F0F000055550000F9 +:105BE000000000000F0F00000F0F00000000000079 +:105BF0003C3C00000000000000000000FF0000002E +:105C00003C3C0000C3C3FFFF000000000000000098 +:105C10000000000000000000000030302020282894 +:105C200028280000000000000000FF0004040C0C05 +:105C30000C0C00000000000000000000000000004C +:105C40000000000000000000000000610006000DE0 +:105C5000000010002028004000084063800100215F +:105C6000920240E38006002D920240E380008021F2 +:105C700092024082800000209202408280018020B7 +:105C8000920240E38007802D8202000000000000A5 +:105C90000000000000610A2F850D00A00000002018 +:105CA00000000000A0610006000D000080610027D8 +:105CB000800D000000000000000000000000000057 +:105CC0000000000000610006000D00000000000060 +:105CD0000000FFFF0000000000000000F0F0553C55 +:105CE000C3C3C3C3000000000CFF0EFF5500550CDA +:105CF00000823CBE000000000000000000500030A8 +:105D00000F000C0000000000000000000000000078 +:105D10000000000000000000000000000000000083 +:105D2000000000000000000000003CFCAAFA000097 +:105D30000000000000000000000000000000000063 +:105D4000000000000000000000000028AA28000059 +:105D5000000028F8FFFF0000000000000000F0F045 +:105D6000553C00AAFFAA0000000000FF0AFF5500F2 +:105D7000550C00C03CFC000000000000000000507A +:105D8000003000000C0000000000000000000000D7 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000F000F013 +:105DB00000000000000000000000000000000000E3 +:105DC0000000000000000000000000000028AA28D9 +:105DD00000000000000000000000000000000000C3 +:105DE000C3FFC30FFCFA0C0A00000000000004000F +:105DF00000FF4141BCBF80830000000000000000A4 +:105E00000000000003030202000000000000000088 +:105E10000000000000000000000000000000000082 +:105E20000000000000000000000000000000000072 +:105E300000005F0A7D7D00000000000000000000FF +:105E4000000000000000000000000000000050FF03 +:105E500055FF0000000000000000000000000000EE +:105E60000000C3F0C300FCFA0C0A000000000000B0 +:105E7000040000FF01013C3C0000000000000000A5 +:105E80000000000F005500000202000000000000AA +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB000000000005F0A2828000000000000000029 +:105EC00000000000000000000000000000000000D2 +:105ED00050FF00FF9000100002052000200020402D +:105EE000200420044002890088808805C1008800C1 +:105EF0002000204021802083210085802080208078 +:105F00002004200420002100C00020804000200048 +:105F1000000501000003200004002100008421008E +:105F20002180000421C18410880082008804C00000 +:105F300020804000400000038800880040022000CC +:105F40004000400020108800C0008800210004802C +:105F50002080400400044002099040000000090233 +:105F6000A0900900400040002000410440002000B3 +:105F7000000041A000019020892020001002400470 +:105F8000400440010001000020004000002000000B +:105F90000402400020040000000000002020100542 +:105FA000100010044040200800204000400240A0A3 +:105FB0004084040200080004400020404002040124 +:105FC000090000000902009100400000400240006A +:105FD00000020004040041910000000000000000E5 +:105FE00000000000000000000000008004040840E1 +:105FF00000000000040000100100914085004100F5 +:106000000040000000000010040000000300201009 +:106010002000008800040004000000004000C004CC +:106020000000000800080800040000100010000034 +:10603000840000400000001010000041000000003B +:1060400082000140084002000800880040009000E3 +:1060500040000000020400008404200000840910B5 +:10606000000040080008000000102008200440093B +:1060700020002000000805100011400040824082EE +:10608000A08400100908000000014010410004082D +:106090008900000000404140000900000900A08480 +:1060A0000009400800100910040800080009000851 +:1060B0000408008400084040000889080000050426 +:1060C000000409840804A0C00404C1100308800867 +:1060D0000008C108000400030008041188008808B3 +:1060E000C0089008C0000021A0000021000000218D +:1060F000A0050000000410200000A04004000008DB +:1061000000082020000200090021000200000221F6 +:10611000021000050808080500088421000040005E +:1061200000020000000000210009201100400000D2 +:106130000021000000880002000000004000000371 +:10614000000800000008000800080000004010805F +:106150000000880000200800004020048810000093 +:106160000000000000080000000000000300000024 +:10617000000000C000000083000000880000100044 +:106180000000000041A10002008221101002000066 +:1061900000000000000000000000080005000000F2 +:1061A000000000010000000000000000800000006E +:1061B0000000080003000002000003A00000A0008F +:1061C000030000000000000000000000000000A02C +:1061D000001000000300080084A0410089010801AC +:1061E0000000840008008200000084000000840099 +:1061F0008800C0000800A000C000082040001080F7 +:106200000809080083048221040004000000000043 +:10621000820004000000100082004000A00008413D +:106220000000000082008400080010001000C0047C +:1062300082000800400008000800080400008200F6 +:1062400004000800100008000000A000400040000A +:1062500082830800080000000040820082000800DD +:106260001020000000842100001004000000000441 +:1062700000000400040000000000400000000000D6 +:10628000000200000000101008000008410041005A +:1062900000000900800040000000000000A0000095 +:1062A00000000000210000000400000000000000C9 +:1062B0000800000000004100000000000000000095 +:1062C000008800000008000000000000000004003A +:1062D00000A004020000038804A000004090000019 +:1062E0000082000800058221000000000400000078 +:1062F00020000000000004000000A00010000000CA +:10630000000082080000A000A000A0088200004158 +:106310009000820800080003A0408208002182004B +:106320000000A0000000C00000000000820000008B +:1063300000008200000000000000000000000000DB +:106340000000840000000000010000000000400088 +:10635000000090001008A000000008040040820027 +:10636000C000002100020000000009081000000029 +:106370000000808800000082000000000002000091 +:1063800000A0000000A0098200000004000000003E +:1063900000000000000000400000000100000000BC +:1063A00000000000000000000000000000000000ED +:1063B0000000000000000000040000840000000055 +:1063C000000000000000000021004088059040000F +:1063D00000000000000000000400000000000500B4 +:1063E000000000000000000000000004A000000009 +:1063F0000021000910000200020000009000C0000F +:1064000000000400A00802002000000010219021DC +:10641000C02100048208822001000008080404054D +:1064200020000000020084040000A00010080209FF +:1064300000000000000020000000000000004000FC +:10644000000040212008000040000400C1000000BE +:10645000A0108200A00084080000000004050021B4 +:10646000C021080004080280820000000010000023 +:10647000001000000000000000000000000000A06C +:10648000000000000000000000000000000000000C +:10649000002000000000000000002000410000017A +:1064A00000000000000000002010000000000000BC +:1064B00000000000000000000000000000000000DC +:1064C000000004000000090400200990000010886A +:1064D0000000000000002000000000040000000098 +:1064E0000800000000820082800821820000000075 +:1064F000000000000000000000000000000000009C +:10650000000000000020014000040004108300028D +:1065100009050411000100008800000010A10020FE +:106520000202C003000000000000000000000000A4 +:106530000000000000010000400082000000000098 +:1065400001008400000000000100A0000000000025 +:10655000000088000000881010080888041000005F +:106560000100200000010001A00001010001000065 +:10657000000000000000000000000000000000001B +:1065800000000900000020000300030000804041DB +:10659000210988A080A10502030200030008919050 +:1065A000212088838090000000000300000000008C +:1065B000000000080503000200000500850000003F +:1065C00000000300000000000000030000000000C5 +:1065D00000004000000000000000058080800000F6 +:1065E00000020300000500210041004002030002F8 +:1065F000000000000000000000000000004000005B +:1066000000000000000500000010002100808080D4 +:1066100004A04008850241A18200090040098505C7 +:1066200090802040C0409003000080008000000067 +:1066300000000000000000200002400040000800B0 +:106640004103000000030080000000000000000083 +:106650000009000000000000000200000008808027 +:10666000000020000340040003100000804100C02F +:10667000000000000000000000000000000000001A +:10668000000000000000000000008401A0828208D9 +:10669000080800C19101A10101A14182100041003F +:1066A000080005A020008801030004000200080083 +:1066B00084000000009000000000000100000000C5 +:1066C000010001010000000000040082000400003D +:1066D0000000008200000000000000019000200087 +:1066E000A082A00000100001000800A0000002002D +:1066F00010824000000000000000000000002000A8 +:106700000000000000004000000000000400000045 +:106710000001C000088303890005A0890000000073 +:10672000010000000404002000029091000000001D +:106730000000000000000000010000000000000157 +:106740000001000000010001000100000001000044 +:106750000001000000000000000000010001002016 +:106760000088000808880001000001010001000005 +:1067700041000000010000000000000000000000D7 +:106780000000000000000000000000000000800287 +:1067900000020002000280108340108402040011F5 +:1067A0001021021010058085402040830010000059 +:1067B00000000000200000000000100000000500A4 +:1067C000000200400003004100400008004100407A +:1067D00000000003002002080040000500200041E6 +:1067E00000000002000480050002030005211010D3 +:1067F0000000400003001000000000000000000046 +:106800000004000000000000000200000000000082 +:106810000000000000000000418410040300091083 +:10682000088203001180080285202188100005419C +:106830000004000000000000000021050800100016 +:106840000200410500001000080080020000000066 +:106850000000410004000500400003004000090062 +:1068600004008000000000008000A11089004100A9 +:106870008820804080000000000000000000000030 +:106880000000000100000000000000010000000006 +:106890000000400020041002880083C10000A1A075 +:1068A00008000003008800840100C0400002099035 +:1068B00000010001008400900000000001000000C1 +:1068C000010000000100000001000100080020009C +:1068D000C0000400010001000000010000000000F1 +:1068E00000000100100010089008A00011880400AA +:1068F00004001100C00104A0A004820000000000F8 +:1069000000000000810000E000000000810000E0C5 +:1069100000000000000000E000000000008100E036 +:1069200007008400880000E000000000821100E001 +:1069300007000006810000E0000000000000810068 +:1069400000E000000000810000E000000000000006 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:10697000000000000000810000E0000000000000B6 +:106980000000000000000000000000000000000007 +:106990000000000000000F0FC3C3000000003030F3 +:1069A0003030001018180000000000000000F0F067 +:1069B0000F0F200000000000000000000000000099 +:1069C00000000000000000000000000000000000C7 +:1069D000FFFFC340000000000000000000000000B6 +:1069E000000000000000000066F366F0C000C9006F +:1069F0003CFF3C00000000007E3CFC3C000000002E :106A00000000000000000000000000000000000086 -:106A1000F6901818FCC3FCFF000000000000000006 -:106A20000000000000000000F03CF03C000000000E -:106A3000F0F0606000000000C309C38166667E66F6 -:106A4000000000000000000000002C2C2C2C0099FD -:106A50000099030F0F0F000093FF000000000000DB -:106A60004242F0F0FF0024242F2F0000C3FF00005B -:106A70000000000000000000000000F006F6C0C0AA -:106A8000C0C002102000008810840210200000887E -:106A90001084000000000000000000000000000062 +:106A10000000000000000000999900FF0000000045 +:106A20003F3F303000181818000000000000000040 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A50000000FFFF404000000000000000000000B8 +:106A60000000000000000000000066FF66FFCF008D +:106A7000C900F066F066000000006600F00000004B +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 :106AA00000000000000000000000000000000000E6 :106AB00000000000000000000000000000000000D6 :106AC00000000000000000000000000000000000C6 @@ -104137,475 +104137,475 @@ :106AE00000000000000000000000000000000000A6 :106AF0000000000000000000000000000000000096 :106B00000000000000000000000000000000000085 -:106B100000000000F0009900C3FFC3F09C9C0CFC37 -:106B200000FF00FF0000000006FF0600000000005C -:106B30003C3C3C3C0000000000000000F090C080A5 -:106B40009D9D9D9D000000000000000000009F9F93 -:106B5000069F017F017F99B400B4FFFF0000FFFC96 -:106B6000FFFF7F017F01CFC00909003CF0FC00FE60 -:106B700000FF000000000000000000000000000C0A -:106B8000FF0CFF00C3C30000000000000000000075 -:106B90000000000000003C3C990099FF99FF9C9C7C -:106BA0000CFC06F600FF00000000F6FFF6000000F7 -:106BB000000036363C3C0000000000000000FF9959 -:106BC000C381BD99BD9900000000000000000000D5 -:106BD0009F9F0606017F017F99B400B460F960F9B8 -:106BE00000C000007F017F01CFC0F9F999BDF9FD18 -:106BF00000FF00FF00000000000000000000000097 -:106C0000000CFF0CF0F0999900610007000D0001E5 -:106C100000610006000D000005615A0FC50D00A0BF -:106C2000000040000000000000610006000D0001AF -:106C300000610006000D000000610006000D00006C -:106C400000610006000D0001000000610007000D5A -:106C5000000000610006000D000100610006000D4B -:106C6000000000610007000D0000006150070001F6 -:106C7000000000610006000D0000000000000000A0 -:106C8000000000000E08001000010000000000FFDE -:106C900000FF0000000000FB04FF000000000000F7 -:106CA00000000000000000000000FFA0FFA00000A6 -:106CB000000000000000000000000000000050FA8A -:106CC00014BE00000000283C7D3C00000000FAFFDC -:106CD0000F00C35500C30C0CFAFAFFFF0F55FFFF5E -:106CE00000000000000000007D287878FF003C3C98 -:106CF000FE7CFE7CFF2AFF0200CF00C700000000E0 -:106D00000000000000000000000000000000000083 -:106D10000CFF00F30000000000FB04FF0000000077 -:106D20000000000000000000000000005F005F00A5 -:106D30000000000000000000000000000000000053 -:106D400050FA14BE000000003C3C3C3C0000000037 -:106D500078FF0FFFC35500C38E8E000005050000AD -:106D6000FFFF3C003F00000000007D2878780F0FF7 -:106D70005555C240C240002A000200CB00C30000AB -:106D800000000000000000000000000000000F2DC7 -:106D90000F0F0CFC00FF00000000000000000000CE -:106DA00000000000000000000000000000000000E3 -:106DB0000000000000005FFF55140000000000000C -:106DC00000000000000000000000000000000000C3 -:106DD0003C0F3C0F020000000000A2F3140014FF5F -:106DE00080C082C3EBC3000000000000BFBE0A0ADF -:106DF000C0C00AFACFCF4D4D000F030F027F7D7D3B -:106E00000000000000000000000000000000000082 -:106E10000F2D0F0F00FF00FF00000000000000001A +:106B10000000000000000000000000000099C3F029 +:106B200000000000006698FE0F0F0F0F000000002D +:106B3000F6FFC3C3000004000000002000000000B6 +:106B40004243C3C30000000000000000000000003A +:106B50000000000000000000000000000000000035 +:106B6000000000000000000000000000000003C35F +:106B7000099962FB62FB00000000000000000000B9 +:106B800000006F6F6F6F0000000000000000000049 +:106B90000000000000000000000000000000FF995D +:106BA000C3F00C6EFFFF0066086E00FF00FF0000E0 +:106BB0000000FFFFC3C30000000000000000000051 +:106BC00000000003C3C3000000000000000000003C +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000000000000000000A5 +:106BF00003C3099962FBFBFB0000000000000000DA +:106C00000000000000F00FFF000000000000000086 +:106C100000610006800D000000610007800D00008B +:106C200000613007000D000000610027000900002E +:106C30000061000080010000A061002980010000C7 +:106C400000610007800D2001000000610007800D39 +:106C50000000004000058000200000610006000DDB +:106C6000000000610006000D000000610006000D3C +:106C7000000080610006000D000000610006000DAC +:106C80000000A0610007800D00000000000000006F +:106C900000000000000000000000000000000000F4 +:106CA000000000000000000000007D555D5D82F0E6 +:106CB000FF000000FFFF3030FF0000010000000077 +:106CC000000400000000000000000000700070F0F0 +:106CD00000000000000000000055BFBF00000000E1 +:106CE000150100003D3DFF05F0FFF0FFFFFFFF0035 +:106CF000F8F828FF0000000000FFFFFF3CFF04053C +:106D0000FF007D0000000000000000000000000007 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000FF00F3003C000C0C1D +:106D300082F00000050405042020FF000000000090 +:106D40000000000000000000000000000000300013 +:106D500030F0000000003C3C0F0F0055BABA0000B4 +:106D60000000150141410505050500AAFFAA3C3CAC +:106D70000F0F2828282800000000AAAAF0F038FAEF +:106D80000000FF00280000000000000000000000DC +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000001F14B0 +:106DB0001F1F00FF30FFC3C3C3C330305555000051 +:106DC0000000000040000000000000000000000083 +:106DD000FCEBFCEB00000000000000000C0C000FBE +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000F0F7D7D828282823F0F7D550000000042 +:106E10000000000000000000000000000000000072 :106E20000000000000000000000000000000000062 -:106E300000000000000000001FFF1414000000000C -:106E40000000000000000000000000000000000042 -:106E5000000000000000FF0FFF00A2F3A2F3FF00FC -:106E6000FFFFA0F0AAFFEBC3F0F000000000BFBFDF -:106E70000A0BCFCF0AFA0C0C4D4D0F0F030F072F43 -:106E800028280000000000000000000000000000B2 -:106E90000000888088000020202020009000100042 -:106EA00020000000048040002000C0004000C0001E -:106EB000840090110100C0002080C1008800000003 -:106EC000058001208800002040808805880000009F -:106ED000880000038800040020042004000020042F -:106EE0000404040085002080A1800580C0021000F9 -:106EF00082002004A00020110203C04104002040B1 -:106F00008200200204400000008288412020C0004E -:106F1000880020000020000000090005400000005B -:106F200000040002000000080000000020008000B3 -:106F300000000000000002002104101002002000E8 -:106F40001002080240C100000001890820004040F2 -:106F5000000000A000004000400005C00500400007 -:106F6000400109C1400010829020102020084041BB -:106F7000000004822100004021024000000000A027 -:106F80000082000009000020000000400000000016 -:106F900000020000000400000000020000200200C7 -:106FA000000002800220000040000020C00200001B -:106FB0004000040011000400020002000400000070 -:106FC0000000010004080000000210021000A002EE -:106FD00001008804881000000200A00900000000E1 -:106FE000020004400800080021000000A0208200E8 -:106FF0000441820041800400000001401080100024 -:1070000040000500840000200000080000894000C6 -:10701000004004100010000400C0000000A00000A8 -:1070200000100040004000000000800000880001C7 -:10703000000080080008A000008200000008800016 -:107040000084000008000304000000010001038424 -:107050000441200800112000000000000008008406 -:10706000008800080010801002049010030000A0A7 -:107070004088200400108240008220080808800216 -:107080008008808440000410034000088084004091 -:107090008000400005820082008400008400C00857 -:1070A00000000400004104210441C000040002214A -:1070B00088009008880000200100000000044009BA -:1070C00040210240000000000000000000210000FC -:1070D000000800C10111002100080000000000218B -:1070E000A00800080010820540219021900009218D -:1070F000C010A04082008400880388408402A11050 -:107100004008A01040024005A00800008200842131 -:1071100008000800000390000000840000080084BC -:107120002100038203C000C005100084000000009D -:10713000000011A00000000009002000090005A0C7 -:1071400009001008090202000800000040000800C1 -:10715000000808104008100005080500000000089D -:1071600000A0032011A04000418210000408050087 -:10717000100000000020410209842182030411094B -:1071800040A0A1000820210000020000000400042B -:10719000000010900000000005000804030000003B -:1071A00000050002000000000002000000000004D2 -:1071B00000090009841100110402004100000811B7 -:1071C00008000000828502000200044008008200DE -:1071D00040021005040840110800840000800000EF -:1071E000080082000400A000080084008205080551 -:1071F0002000000000910840831020204020400023 -:107200008400A00240411002000000409008842049 -:1072100000050020000010110200200900000004F9 -:10722000008400880000000400200000002000000E -:1072300000000000000000C0000000000000080482 -:10724000080000080900202000000008008400C099 -:1072500003088001080000918008410000880404B0 -:1072600000000400001009000010030000000000EE -:10727000C100801000000008400202A108848000C4 -:10728000020000000089800002900000030041001D -:10729000000800A00000000002A000080208008210 -:1072A000000000000800000000000008400000414D -:1072B0000002000000800000000000008400882020 -:1072C000900000109003840000080808100040009F -:1072D00000218400000008001000080800080220B7 -:1072E00000040000820000004000820020008200B4 -:1072F000000884008211080482024080880040084F -:107300000400900082410102A0008200A000C000A1 -:107310008211C000080000050040000000000000CD -:10732000000004000040800000C0040400840088C5 -:107330002104030041840808082000080000000020 -:10734000000010C00000000040000000000000002D -:1073500085A000000000000000009008090100A1C5 -:107360008800030900000404038800004020000096 -:1073700003000009089020000921200020080200D5 -:107380000802400000080800404105041190210057 -:10739000102040002100084000000400000004907C -:1073A0000000080041000080002088090041002101 -:1073B0000009000000080011000000000811000290 -:1073C000000001000000C0032000000900210000AF -:1073D000000010211010000000020021C000000079 -:1073E00000002004A00000008200C000080002008D -:1073F000820000410021C00020218208C1088205CE -:107400000000A0008208900484000005090202091F -:1074100000009004080000000005000800000000C3 -:107420004010000410030000002021000000210093 -:107430000000000020000910000000000000000013 -:10744000020000004090000000000000000000006A -:1074500004000040000800000200030100002000BA -:10746000000000C08000000000000000000080005C -:10747000000021000000000021008908080020828F -:10748000000000000000004000000000000040017B -:1074900080000000000800000000080000000084D8 -:1074A0000008000411900090020040C0001000028B -:1074B000089000000000000000000000880082002A -:1074C0000000000121000801000000000000000091 -:1074D0000000400000000400080040C01141820884 -:1074E00088110000000141000000000000000000C1 -:1074F0000000020084C10005000582A040A10183B4 -:10750000200910044121C0210884100900A10300B2 -:1075100082A10091000100000001000082A0000291 -:10752000400202C000000000000000000080008057 -:1075300000008080000000000000000000009000BB -:107540008000000002080211910300090000000001 -:1075500000000000800005000000000040838388D8 -:10756000802000A004200302C108000800000000E1 -:1075700000000000800011C100080011002085C13A -:10758000048341C00089A0020520804100C000C1E1 -:10759000A00000200009002000400010000820800A -:1075A000218000808000000000000000000000003A -:1075B000004000000000000000000000000000008B -:1075C00000000000000000802100410005210000B3 -:1075D000000080008080A0009000902008002080A3 -:1075E0000340059108824180404140044100000071 -:1075F0000000000000000000A000A100900088032F -:10760000118020112089410300002100030921037A -:1076100003802005200503210080000000000011E8 -:107620008000002180000000000000000000000039 -:1076300040004000404090000000000000C00000FA -:107640000000000000000000000801000000000130 -:10765000900010000200C00802000300A00001001A -:10766000010200000040008800100101002101001B -:1076700000000000000000000000082004000500D9 -:107680000900000200010091010200C00100002178 -:1076900001C1004000000088010100080000000056 -:1076A000000002004000A040840000000000000034 -:1076B000000040080040904021020000000000004F -:1076C00000000000000000010001000101000000B6 -:1076D00001000000000000000000000400030002A0 -:1076E00000C19009004101098588000001010001E5 -:1076F0000101000000880008000800C00890010295 -:10770000000801820809018200820205024100028C -:107710000302C011A0000000910010010000000051 -:1077200001000100089100830005880900000000A5 -:1077300000000000800000008000098000000000C0 -:107740000000000000000004004000410010401054 -:10775000041040100000000000000000008400023F -:1077600000410090800820202185C0A0000203086D -:1077700003081041000000000080008000000000AD -:107780001180118009800020408220C183C185883A -:10779000401105C085080020410540038004000019 -:1077A0002000050002008040000800880021000041 -:1077B000000000000000801000A180808000000018 -:1077C00000000000000020020200080011004190AB -:1077D0002100110020080003009000800000000438 -:1077E000008000800020410080002111000503A1DD -:1077F0000021000040020000000000000000000026 -:1078000004A1212108800808C110A0108200840270 -:10781000C0A1C0044100100341800905A10003403C -:1078200021000300080011008040008080008000DB -:10783000000000000000000002002010028482000E -:10784000C000A000880082000101000001000000CB -:1078500001A000000000000100000021000800005D -:1078600000890008000800000990A0001101A00094 -:1078700020039000A00009000000000000000000AC -:1078800000000005004100840101C1880200910050 -:107890002000C1C1A0012000010109C00400A10015 -:1078A00089000100000001000000C001880440A020 -:1078B000A000000000000000000000000000070021 -:1078C00000000000000000000000810000E0000057 -:1078D0000000000000E000000000000000000700C1 -:1078E0000000000000000000000000000000070091 -:1078F0000000000000E000006081000000000000C7 -:1079000000000000000000E000000000000000E0B7 -:1079100007000000000000000000504100000000CF -:1079200000006000000000000000000000000000F7 -:10793000000000000000000000000000FC3CFD7D95 -:10794000FF30303080FD00FF00000000000000002C +:106E30001F141414AAAA30305F000000003055550A +:106E40001000000000000000000000000000000032 +:106E50000000FCEBFCEB00000000000000000C0C4C +:106E6000000F000000000000000000000000000013 +:106E70000000000000000000000000000000000012 +:106E800000000F0F55558A828A8A3C003C000000A2 +:106E90000000000020008800880088002000C0005A +:106EA00020048800882120008800840084002000BD +:106EB00088008800200020004000880088008808A2 +:106EC0002010880020002000880020002000000002 +:106ED00020100003040220000400C008210020004C +:106EE0002100210488002000200088048800200060 +:106EF0004080200220008800200088042008042010 +:106F0000200404040504850021000008200040003E +:106F1000840040020000000005020400200204007A +:106F2000100200000000042000002000000000000B +:106F3000400000400500400040000000200000002C +:106F4000404000000000000004004100410000003B +:106F50004004000000004000000000000400A00009 +:106F6000C100A000A00020001000050000001100DA +:106F700000000902090100000000040011020002E3 +:106F800000840002000210002002200241400400A0 +:106F900000000400040100000900080008000000CF +:106FA0000000000002008400000002000009000050 +:106FB00000000000000800040000000000000000C5 +:106FC0001000A000040000000400000200100004F3 +:106FD0000285000008080000000300000000000314 +:106FE00000050004108400000004020000090000F5 +:106FF00010048204020000000000000000000005F0 +:1070000000400000080300000000000000038209A7 +:1070100001000300000000820000A000A008800022 +:107020000008000800100000001000080000020422 +:107030000908000800880000008800000982040098 +:1070400000100410050005000004008840054004FD +:10705000008400400000C004000000080908200867 +:1070600000002008001000042008008400820008AE +:107070000440C08405080084040800084008008813 +:1070800000884011000480C0001000842004000823 +:1070900000824000080809080011000002000800F2 +:1070A00009800000000040004000002100000000B6 +:1070B00000000000000000000400000800000000C4 +:1070C000040000080021000000000000000000088B +:1070D00000000000000208089000000004210000E9 +:1070E00000000000C0108408000000040008000830 +:1070F0008221C00800410000000000000040820022 +:1071000082080002002108000810080000030000A7 +:107110000000210404050021000000040090040088 +:10712000800088040000000010000000080000003B +:1071300041000000000000000000002000000000EE +:10714000000800820000040808A0000800820082F5 +:10715000038221020000000008000000000000007F +:1071600000000000000004000000030000014100D6 +:10717000000003000000000000001000000021A03B +:1071800041004020080005844100410008A009207A +:10719000000200A0904000A0000000A00002080231 +:1071A000040020110840C00000000802820584404D +:1071B000080082008400080008008200080088009F +:1071C00082400400820004008400042000040800BF +:1071D000820240020800000010008240C00400004B +:1071E0000800A00002040800C00282004000040061 +:1071F000000082008200080000098200001188005F +:107200000000080010110000100900000400101018 +:10721000080804098200080082100021C000021042 +:107220000008001080000005000000000040001071 +:10723000000800000000100800A000A000000000EE +:10724000000000000000000000000000000000003E +:107250000000000080000000000800001182008291 +:10726000000000000000020000A000000000080074 +:10727000000000100000110000A000A000000008A5 +:1072800000000000000003000000040000000000F7 +:10729000000100000000000040C000830000100852 +:1072A00009092000C10000000100000000050000E5 +:1072B000C00000000000000000000000000000000E +:1072C00000000000000000000000000008000003B3 +:1072D0000000C021000500000000821100400800ED +:1072E000002100000000C0210021C00004000800AF +:1072F0000000000000080000000010000000000076 +:10730000C000100000030000C00084100000100046 +:10731000C0008205C021C1008400100000000000F0 +:10732000A0000840C0002000000020200000000055 +:1073300000000004000000000000000000900000B9 +:10734000000008404010000800A008200084000051 +:1073500000080040000000000500050000000000DB +:10736000030000000000030000000400030000040C +:1073700000004004000000000000002000000000A9 +:10738000000000000000000000001102001000904A +:107390000008119021000002100805000000000004 +:1073A00008000800000000000000000000000000CD +:1073B0000000002000000000000400080010000091 +:1073C00000000000000000000000000000000000BD +:1073D0000000000082000008000001000000001111 +:1073E00082080009002100000000000010050000D4 +:1073F0000000000000080000000000200000000065 +:107400000800100000000000000000000840841088 +:1074100000008200A000000010088200A04020218F +:1074200088000000000002000000000000000000D2 +:107430000000000000840000000000000000009038 +:10744000000000000000000000000000000000003C +:107450000000028200000000000000084000000858 +:1074600000400000000000000000000000000300D9 +:10747000000000000082000000000000000000008A +:10748000020800008000110000001100210000002F +:10749000000000000082000000002000000000C08A +:1074A0000000008400040000000002C0009001A061 +:1074B000900000000000000000000000000000003C +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:107500000000000000000000C000000000000000BB +:107510000000000040000000000008000000200003 +:107520000100000084A0A0C0A0080291008000001B +:10753000408000000000000000000000000000008B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:107570000000000000000000000005000000000006 +:1075800000000000000000001100000000000000EA +:1075900000000000000080000000000080000000EB +:1075A00005000400000000A08508008800210008F4 +:1075B00000008010800000000000000000000000BB +:1075C00000000000000000000000000000000000BB +:1075D000000000000000000000000000000020008B +:1075E0000300090009000000000080008000000086 +:1075F0000000000000000000000800000003000080 +:1076000000000000000000004000040020004100D5 +:1076100000000000000000008000000000040000E6 +:10762000000020001000410390008002A000C0056F +:10763000040010000800100000000000000000001E +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000000002A +:1076600001000100000000A0820088000800C000A6 +:107670000000000000000000000000010000000009 +:1076800000000000000000000000000001000100F8 +:10769000010000000000000000000800900004014C +:1076A0000000000000000100010103200201A19080 +:1076B000100000C020880004A0400000000000006E +:1076C00000000000000000000000000000000000BA +:1076D00000000000000000000000000000000000AA +:1076E000000000000000000000000000000000009A +:1076F0000000000000000000000000000000880002 +:107700000000000000000000000000000001000078 +:10771000C0000001000000000000000000A00020E8 +:10772000000800C000000000000000018810009167 +:10773000A1A00810000000000000A0000000000050 +:107740000000000000000000000000000000000039 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:107780000000000040000000000000000000004079 +:10779000001100090041000000000000000000008E +:1077A0000080008000800020002000000041004197 +:1077B0002008C1101091000200000000000000002D +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000080000000000010000009 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:1078100000800000000000090000000000000000DF +:1078200000400000000000004104030010000000C0 +:10783000088090200380A011000100880040000013 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:107860000000000000000000000800000000000010 +:10787000000000A0008200000000000000000000E6 +:1078800000000000000000000000000000000000F8 +:1078900000000040000000000000000000000000A8 +:1078A00000000001000200040000010800000100C7 +:1078B000000000048200C102A000810000E000007E +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:1079000000000000480000E000000000000000004F +:107910000000000000000000000000000000000067 +:10792000000000000000000000000000810000E0F6 +:107930000000000000000000000000110000000036 +:10794000C2CEC0CC0000000000000000000000001B :107950000000000000000000000000000000000027 -:10796000000000000000000003835050FF3E3E3E38 -:10797000FBF3FAF0AAAFEBAF00000000000000003C -:1079800000000F000F0300000000555500550F5573 -:1079900000C341F1FFFF000A00AAFF05C3C30C0C9E -:1079A0000A0A0000000000000000000000000505B9 -:1079B000FA0AB4B414140000000000000000F00043 -:1079C000F555FFBABABA80FD00FF000000000000C4 +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000F0FCF0FA000001 +:1079B000000000000000F5FDF5FD0A0A0A0A0000BB +:1079C0000000020E000C000000000000000000009B :1079D00000000000000000000000000000000000A7 -:1079E0000000000000000000000003D35050FF0A18 -:1079F0000A0AEBC3AA00000000000000000000001B -:107A0000000000000F0F0F03000000005555000498 -:107A10000F55FFC341F141F1000A00AAFFAFC3C3F4 -:107A2000000F000F00000000000000000000000038 -:107A30000505FB0BA0F5005500000000000000004C -:107A4000505082D72F2F282800000000000000008F +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A2000000000000000000000000000003C00AA70 +:107A30000000000000000000050D050D8AAA0A0ADA +:107A4000000F005569284100000000000000000000 :107A50000000000000000000000000000000000026 -:107A6000000000000C0C5555000000001455145582 -:107A70000303A0AF000000000000000000000000B1 -:107A800000000000000000000000C0F0F0F0C000A6 -:107A9000C100053D053D000000000000AE500000A3 -:107AA0000000353535350000000000000000000002 -:107AB0000000D714D714E020E020000000000000F0 -:107AC0000000FAFA82D72FFF28FF00000000000014 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000007D555D5D7A +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000000000000000307CC +:107AB000030700000000000000004302430200FF33 +:107AC00000FC000F00556B2A43020000000000007C :107AD00000000000000000000000000000000000A6 -:107AE0000000000000000C0C3C0C0000000014051D -:107AF0001405F3F3A0AF0000000000000000000038 -:107B0000000000000000000000000000C0F000F0D5 -:107B1000C3C3C3C3053DFFFF000000000000AA501F -:107B200000000000F5F50505000000000000000061 -:107B3000000000000C0CCFCFC000F03000000000AF -:107B40000000000000005000000000008000000065 -:107B50000000000000610006C00C0000006100078A -:107B6000000D000000000008000000A500610006F4 -:107B7000009D000000615006000D000080600005BF -:107B80000000000000000000000000000000006194 -:107B9000500400050000A000000100000000A061EA -:107BA0000006001D000000614006000D000000619D -:107BB0000006000D0000A0610006000D000000009E -:107BC00000000000000000000000000000000000B5 -:107BD000000000000000FF3F00300AFA000041E111 -:107BE000EBEB3F3F550000000000000000000000EC -:107BF00000004551CFF3A0A000000FAA03AAC3C301 -:107C0000AAAA3C3C00FF00000000000000000000A9 -:107C1000FFFF05C7000000000F003CAAFFAAE1E13A -:107C200000C300C3141450143030F0F000030F0FE1 -:107C30000405000100000000000000008E008E001E -:107C40000000000000000000000000000000000034 -:107C50000000000000000000FF3F00300AFAAAAA5E -:107C600041E141413F3F55FF00000000000000009E -:107C700000000000CFF34551A0A05F5F0FAA00AA4B -:107C8000C3C3AAAA0F0F5555000000000000000052 -:107C9000000005C705C7000000000FFF3CAA550003 -:107CA000E1E155C35FC30000000030304000A0A0F8 -:107CB000AFAF0C0D08090000000000000000CF006D -:107CC0008E00000000000000000000000000000026 +:107AE0000000000000000000000000000000000096 +:107AF00000000000000000000000000000003C004A +:107B00000C0C00000000000000000000000000005D +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000000055 +:107B30000B0F0B0F000000000000000000005F0AA8 +:107B400000F300F000615007800D0000000000000D +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B70000000000000610006000D00000000000091 +:107B8000000000050000000000000000000000618F +:107B90000007800D000000000000000000000061F0 +:107BA0000006000D000000000000000000000000C2 +:107BB000000000900000004000058000000000610F +:107BC0000006000D000000000000000000000000A2 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C200000000000F0FAF0FC00000000000000007E +:107C30000000000000000000000000000F0F0C0C0E +:107C400055550002D3FBC3C3000000000000000034 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000AA003C000000000000EE +:107CB000000000000000000000000F0FFF000000A7 +:107CC0000C0CFFFF555700000000000000000000F2 :107CD00000000000000000000000000000000000A4 -:107CE0000000C200C2C20A0A00AA00000000000090 -:107CF00000000000000055555551FA0AFA0A80C0EC -:107D0000101000000000FF00F0F000000000000074 -:107D10000000000082BEC0C0FFFF053DF0F03C3C0B -:107D2000AAF03CFFF3ECFFECAAAFFFFF0F0FCACAAB -:107D300020000000AAAAAAAA00000000000000007B -:107D40000000000000000000000000000000000033 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000FF0F76 +:107D0000FF0F000000000000000000000000000065 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000F8F828F80000000043 +:107D30000000000000000000000000000000000043 +:107D4000000F0F0FFFCFFFFF3C14141400000000C2 :107D50000000000000000000000000000000000023 -:107D600000000000FA00FAFAFFFFFFFF0000000029 -:107D7000000000000000000055555555FA0ACFCF0D -:107D8000808010100C040C34C3C3AAAA00000000A9 -:107D900000000000000082BEFCFC053D053D00FF28 -:107DA0005555AAF03C00F3EFFFEF000555550000D4 -:107DB000CACA00000000F0FFF03C00000000000014 -:107DC0000000000000000000000000000000200093 -:107DD0002000200000000000000020111000048896 -:107DE0001100200082802100C000000220802000BD -:107DF000040004008400000088002000200020000F -:107E0000004102402000200020008900218300035F -:107E10000011900004008400840000022003040884 -:107E2000840288040400C00020008805028011C17B -:107E300004030000400004022000080088008800BD -:107E400040004000200088008200200021002180A6 -:107E5000090000A01000000000A0200040C00000A9 -:107E60004004C00040000010020010000000100498 -:107E7000000041002000000004A0000000A040001D -:107E800040002000000240001000000010004008E8 -:107E90000000200040000090200000001090090029 -:107EA0001000400010020002040000002000400802 -:107EB000A002000000C004900800400200C0009032 -:107EC0000420000200C000002000204040001020DC -:107ED0009002000000000000A0000004000000006C -:107EE00000000000820005000000000000000120EA -:107EF0000000080000000000040000000000000076 -:107F0000000900000000000000100000080002004E -:107F1000000000000000000002000000000000005F -:107F20000010001000000009000002000000040022 -:107F30000400040000000200000000000000000037 -:107F40000202000000000000844002000000000067 -:107F500004000400001000000010030000100000E6 -:107F60000082008800840008200811000000000042 -:107F7000100010100000000002000900004000087E -:107F800000000004000804040088008804C000C049 -:107F90000004001000000408000000000082000837 -:107FA0000010000803000910040800040000000885 -:107FB00000000000050805020084000000000088A1 -:107FC0000000000805080000040400000400008808 -:107FD000008200040008900900000241900000089F -:107FE0000408901000080500050085008203880041 -:107FF00021000100000800050000840000000005C9 -:1080000000218200A0020003000884080000020092 -:108010000005000901080000402100088803040051 -:1080200084001021840340008821A0008200000009 -:108030001000840282094008900808088800200087 -:10804000840082404000000900008408C000100045 -:10805000C002A0219003000200000000410000A027 -:10806000004000000000080002880400040000082E -:108070002004A00008000000110800A00510002046 -:108080000540020041004000419010200300030021 -:108090000000000000A0200000000300030000001A -:1080A000090005004100030000400800030008002B -:1080B0000382098804A00408080011901020008899 -:1080C0001188410021000090000005080890000080 -:1080D0004100000000000000050000040000000056 -:1080E000A00000000009000900210100004000403C -:1080F000A0400000400084001104000008408400FB -:10810000824000002000A000400090008200000497 -:10811000020000008200400082000000020008000F -:108120008404A0000000820084041041A00290009A -:1081300000000010C000104108048400000000008E -:108140000004080500000000000000000000080412 -:10815000002000000000004100000200000000902C -:1081600000000000000000000020030020000000CC -:10817000200000000000C1002100C0011000040028 -:1081800021C00000400000400090000000000000FE -:10819000000041000002000000000000000010008C -:1081A000400000000010020000000000110000006C -:1081B00000A000402000000000000000400400007B -:1081C00003880000020000000000000000400008DA -:1081D0000200000000881100002020001040004133 -:1081E0000000000000050000880040000000A00022 -:1081F000400004040000000001000008000000210D -:1082000000000000840090001000000000100040FA -:108210000000000000000005000000000041000018 -:108220000010000008000000A00000050000000091 -:1082300000401020000300009000000300200021F7 -:1082400002038400000000008200000508001008FE -:108250000000C00300000000001000000000000546 -:10826000000000004000000000000000001000A01E -:10827000008800000400000404080808000011C081 -:108280000000042000000508200000202000040455 -:1082900011900010000400000000090021A004104B -:1082A000000000000002004000040004090000C0BB -:1082B0000840040000C000001100409004040500C4 -:1082C0000320000403000890412000000500210065 -:1082D0004140009000004004218809000020000077 -:1082E000000000400040000900408800000000003D -:1082F000101000000000400000000000000002001C -:108300000000000300412021841000080000000844 -:1083100000000040000008099040000800038200AF -:108320001000000002400010A000820004000800BD -:10833000000800000000001100000800000800080C -:108340000000004100009000101000020000000535 -:1083500000000804000008100008000500080008DC -:1083600000080021000000000004000000000000E0 -:1083700020100040200000008000000000200000CD -:1083800000001000000000000000200000000000BD -:1083900000000900110000000000000000000000C3 -:1083A00000000000000000000000000000200002AB -:1083B0000040000000C01188034000004000204041 -:1083C000000000004090000020020000200000009B -:1083D00000000000410000004000200010000000EC -:1083E00000900000200000000000000000000000DD -:1083F0000000000000000001010000C000000000BB -:1084000000010110C000000000000000000000009A -:1084100000000000018200000900001082820000BC -:10842000000000010000000000000000000000014A -:108430000000000000000140010000000084C008AE +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D8000FF0FD70F000000000000000000000000FF +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000282828F8000063 +:107DB00000000000000000000000000000000000C3 +:107DC0000000000F0000F0C0F0503C3C143C0400E8 +:107DD000880004102000C000200090002000200037 +:107DE0001000000020000400200010048590040012 +:107DF00088002000200000002000400020108800A3 +:107E000020000000040088002000210020800003E2 +:107E10002011040320002000000020002010200476 +:107E20002000200084002000200020008802200480 +:107E300088002000200020020000200040002004D4 +:107E400020002002C0082000201020002104411042 +:107E5000100000000900090010004002004010005E +:107E600010000090040000A040004000C04120210C +:107E700009000000040004000400000010000000DD +:107E80000000090000020900400204001000100276 +:107E90000000000009000400400240000900040046 +:107EA00010020900400040000400000040002000D3 +:107EB000418210401000040000000000000020007B +:107EC0000402090204000000040200000402100081 +:107ED0004002000500000000021000030000000046 +:107EE0000000000008000200020000000000028004 +:107EF00000000041000082000000A000000000001F +:107F0000000002000000041000000000000000005B +:107F1000000000000000001000000000000400004D +:107F200000210000001000050009000000100010F2 +:107F3000100001050000000000000000000000101B +:107F40000008001000050005880082000000000005 +:107F5000000000050008000400000008008200087E +:107F6000000800840040000000080000001000002D +:107F7000002000000008200000C04010000800841D +:107F8000001000000404048200080000000800083B +:107F90000008000800000010000000080000098828 +:107FA00000080008400000080408000800000882DB +:107FB00008088508200800000008000800000208E2 +:107FC00002080004000800080208001040880000B1 +:107FD000000840080008000300008403000000219E +:107FE0000000200000000008000000000000004029 +:107FF00000000000001000210021000820002000E7 +:10800000040800000400000800088800A000002107 +:10801000004000020040000004212021C000002197 +:1080200000210003000000080021000300000021DF +:1080300000210021000200A1402100210021202177 +:10804000902188028400840240410040880502118A +:10805000000300400000000900000000410800008B +:1080600008080020000003000000000000000000DD +:1080700000000000000000000000410000000000BF +:1080800000000000080810000800000000000000C8 +:1080900000000000000003A00000000040080000F5 +:1080A000000000100000000000840000000000003C +:1080B0000000000000A00000100808000000000000 +:1080C000000003000300052010A00900400040400C +:1080D00000001008050200A0089000000000004108 +:1080E0000000100082008200000004000800080068 +:1080F0000000000082000800400008000400820028 +:10810000A0000800820082058200A005A003820072 +:108110000800080082008200200000000400900097 +:108120008200A0000000000082008200A000820007 +:1081300090008200A000040904008200C00000003A +:1081400082000000100004000000840040000000D5 +:10815000080000000400C00004000400000000004B +:108160000000000000000000080000000000000007 +:10817000000000000000000400008000000000007B +:1081800000000000000000100020000000000000BF +:10819000000000000000000000008000000000005F +:1081A00000000000030000000000000000000000CC +:1081B00000000000000000000000100000000000AF +:1081C000000000000000004002A04000210000006C +:1081D0000040000000000000000000000500020058 +:1081E0000000000400000000000800000010000073 +:1081F00000050002000000000008820800080000DE +:108200000000000000000000020500000011000056 +:10821000004000000000001000000000404100008D +:1082200000000803000000000008020000000041F8 +:1082300000020021824100000040C003000000094C +:10824000004000000000000000000000000082006C +:1082500000000040C0411000000082210000101109 +:1082600040000000080800000000000000000000BE +:1082700000000000000000000300000000000000FB +:1082800000000000000000000000000000000000EE +:1082900000000000000000000900001000000004C1 +:1082A00000000090000000000000000000000090AE +:1082B00000000000000000000000000000000000BE +:1082C0000000000000000020000011000000400439 +:1082D000000000000500210005000300100241100D +:1082E00083000008000000000041000000050000BD +:1082F00000000000000800038400000800210000C6 +:108300001000000000000000000090008405000044 +:10831000100000000009001100000005002100000D +:10832000100000000003000000000000C00000007A +:10833000000000030400000000000008000000002E +:108340000000008000000000000082090000000022 +:108350008200000300000021000000210000001145 +:10836000840320030000000000000000040000005F +:1083700000000500000000000000000000000000F8 +:1083800000008000008200000000200000000000CB +:1083900000000000000000000000000000000000DD +:1083A0000000800000000000000000020400000047 +:1083B000000020000000000000000000000000009D +:1083C000000000000002000000400000000000006B +:1083D000000000000000000000000000000000009D +:1083E00000000990A0000000000000000001000053 +:1083F0000000000000040000C0000010C082000067 +:10840000C0000001000000000000000000010000AA +:108410000000000100880000000000881004000037 +:10842000000000010000000000000000000000004B +:10843000000000000001008800000000008810100B :10844000000000000001000000000000000000002B -:108450000000000000010008000100000002C0C090 -:10846000000000000001000000000000000000000B -:108470000000000000000000001008000080000064 -:108480000009000805800000000000000000000452 -:10849000000000000011200000098800008080809A +:108450000000000000010088000001000088C00842 +:108460000000000000010000000000000000000803 +:10847000000000000009030000028200000080806C +:108480000000800000030000000000000000001059 +:108490000000000000401100000202000000000087 :1084A000000000000041000000000000000000008B -:1084B00000040000000000110800410902000080D3 -:1084C00000800000000000410000000000000000EB -:1084D0000004000000000040028000401100000085 -:1084E000000000000000004100000000100000003B -:1084F0000000000000000000000083008000000079 -:108500000000C100840800040020000041000009B0 -:108510000000000004000000020004001000000041 -:1085200003008000000000028040000000004100C5 -:10853000000900000000040000000200110010000B -:108540000000208080000000001080410000090031 -:10855000000000000000020000000200C1000480D2 -:108560000004040000000000000080400000010042 -:1085700000000000000000000000000010000220C9 -:10858000000000000200090100000085000000005A -:10859000000000000000000000000000030002884E -:1085A00000000100400000000000C00100000000C9 -:1085B00000000000000000000000000000000200B9 -:1085C000028800000102400000000000C00100001D -:1085D0000000000000000000000000000000080093 -:1085E000020800000000020000000000C0010000BE -:1085F000000000000000000000000000000000205B -:10860000000000000000000000000000000000006A -:10861000000008000000000000000000C00000048E +:1084B000000900000000004011000002410000001F +:1084C000808000000000004100000000000000006B +:1084D000000900000000004011000004100000002E +:1084E00000800000000000410000000009000000C2 +:1084F00000000000040000001100900011000000C6 +:1085000003008000000000808010000009000000CF +:108510000000000010000000100082000980000030 +:108520000400000000000000801100000000200096 +:1085300000000000000020000000100002001000F9 +:108540000011110000000000000080080000400041 +:1085500000000000000009000000040010009080EE +:108560000000200000000000000080020000000069 +:1085700000000000000000000000000008000410DF +:10858000000001001000000000C082010000000097 +:1085900000000000000000000000000008000410BF +:1085A00000000000020000000000C0000000000009 +:1085B00001000000000000000000000000000400B6 +:1085C00004C000000000020000000000C001000024 +:1085D0000000000000000000000000000100020098 +:1085E000081000000100900000000000C001000021 +:1085F000000000000000000000000001C00000C0FA +:108600000000010000000000000000000000000069 +:108610000000000000000000000000011000001039 :108620000000010000000000000000010000000048 -:108630000000000008000000000000000001100021 -:108640000004000000000000000000000001000025 -:108650000000000000000000000000000000040115 -:1086600000100000080000000000000000010000F1 -:1086700000000000000000000000000000000000FA -:1086800000000000000000000000000241000000A7 -:1086900000000000800000000000000000098009C8 -:1086A0000000000041000000000000000041000048 -:1086B000000000000000800000000000000000201A -:1086C0000005000000004100000000000000004123 -:1086D0000000000000000000000000000000001189 -:1086E00010030000000084000000000000000041B2 -:1086F00000000010800000C1000000000000000029 -:108700000000004100000000000020020000808006 -:10871000108200008000008900000000000082003C -:108720000000004100000002000000000004000002 -:108730000305000000008000008900000040800068 -:108740008200000000848040000300000000000060 -:10875000000005C000008000009100000000001033 -:108760008500000000C1000000080000000000209B -:108770000000034000012000004000000000000055 -:1087800000000000009190000000000001000000C7 -:1087900002080008000040000008000000008400FB -:1087A00005000000000902000000000000000000B9 -:1087B00000000184000000004000000800000000EC -:1087C0002000050000000011080100010000000069 -:1087D0000000000000080000080000100000000079 -:1087E000020009000000004102000001000000003A -:1087F00000010000018300000000000000000000F4 -:10880000000000000000810000E0000048000000BF -:108810000000000000000000000000000000000058 -:10882000000000000082811200E0070048110000F3 +:108630000000000000000000000000000001100029 +:108640000010000000000000000000000001000019 +:108650000000000000000000000000000001040015 +:108660000088000000000000000000000001000081 +:1086700000000000000000000000000000080011E1 +:108680000000000041000000000000000041000068 +:1086900000000000000000000000000000080003CF +:1086A0000000000003000000000000000041000086 +:1086B00000000000000000000000000000000008B2 +:1086C00000030080000011000000000000000041D5 +:1086D0000000000000000000000000000000000892 +:1086E000000900000000110000000000000000412F +:1086F000000000008009008300000000000010005E +:1087000000000041000000020000004100000000E5 +:10871000100500008000009100000002800082002F +:108720000000004080110010000000000040000028 +:10873000408400000020800000C100000002800290 +:10874000820000000041000000020000000400213F +:10875000000003A00040800000C100000002801063 +:108760009000000000410000000900000000000926 +:1087700000000903000008000083000000008800DA +:10878000110000000089040000000000000100004A +:108790000000009000000800001000000000200011 +:1087A0000800000000892000000100000000000116 +:1087B00000000083000000012000004000000000D5 +:1087C0002000820000000089A000000000000001DD +:1087D000000000000109000020000040000000002F +:1087E00020008200000000034000000000000000A4 +:1087F0000000000000A100000000000000000000D8 +:10880000000000000000811200E007004842000064 +:1088100000000000484200000000000000000000CE +:10882000000000000000411200E00700000000000E :108830000000000000000000000000000000000038 -:108840000000000000000000881200E0070048005F -:108850000000000000000012000000000000000006 +:108840000000000000000000811200E00700480066 +:108850000000000000000000000000000000000018 :108860000000000000000000811200E00700480046 :1088700000000000000000000000000000000000F8 :1088800000000000000000000000000000000000E8 @@ -104623,455 +104623,455 @@ :108940000000000000000000000000000000000027 :108950000000000000000000000000000000000017 :108960000000000000000000000000000000000007 -:10897000000000000000000000000000747B000008 +:10897000000000000000000000000000257B000057 :1089800000000000000000000000000000000000E7 -:1089900000000000000000000000DE2E757B0000DB +:1089900000000000000000000000DEA4257B0000B5 :1089A00000000000000000000000000000000000C7 -:1089B00000000000000000000000DEAE0000757B3B +:1089B00000000000000000000000DEA40000257B95 :1089C00000000000000000000000000000000000A7 -:1089D000000000000000000000000000DEAE757B1B +:1089D000000000000000000000000000DEA4257B75 :1089E0000000000000000000000000000000000087 -:1089F000000000000000000000000000DEAE615E2C -:108A000003400000000000000231E0000000000010 -:108A100000000C4000000000000002C07A866126C1 +:1089F000000000000000000000000000DEA461266E +:108A000003400000000000000230A0000000000051 +:108A100000000C4000000000000002C064866126D7 :108A200003400000000000000230A0000000000031 :108A300000000C4000000000000002C0648600003E :108A4000612603400000000000000230A00000008A :108A5000000000000C4000000000000002C064861E :108A6000612603400000000000000230A00000006A :108A7000000000000C4000000000000002C06486FE -:108A8000000000000004848000000400200040007A -:108A90000002100000008408080008000840C00020 -:108AA0000080844040002000C0002080C000208062 -:108AB00000000000C0048203200220000400880996 -:108AC000000300008800020004000400040000000D -:108AD00020008880880021044004880004000400ED -:108AE000200320002080830020110409008004005E -:108AF000821000000403000040002000200000005D -:108B00008800000000004140000200000000000852 -:108B10000800000000000002414080008902C101FD -:108B2000410000040000050405040000102040007E -:108B300000204002400000010008400240022040A6 -:108B4000058200000000000000040982050040A02A -:108B50000040000200044084049110400002C084E0 -:108B6000C0000000809090102002044020020020ED -:108B700021000005000200022102800010000040D8 -:108B8000400000000000002000000810020000006B -:108B90000000000002000800020001400100020085 -:108BA000021002800300000000404000000084002A -:108BB00000000000A0030000004100800000000051 -:108BC00000048840000000000005080002020200C6 -:108BD0000000004104410000080002000282010080 -:108BE0008200020004050200210021C102000008E9 -:108BF000000000900821000820040000000002008E -:108C00000280020000000000000102008040090410 -:108C100000400000020820008000800002010200E5 -:108C200000000501001020000088000082000010F4 -:108C3000090000080010000000000000020400000D -:108C400000100000040000000000000020080009DF -:108C500000040000020802840008000800C020048C -:108C6000080000088200001000048804A010110809 -:108C700000100000002080400004830900000282F0 -:108C8000000000022000000000000420000001009D -:108C9000400004000021A0000000000000000021AE -:108CA000000000000010010000001009880004030B -:108CB00000000004000004009000A000A000880054 -:108CC0000440000884000800000090088808A00301 -:108CD00004218821A0001009400000008421100018 -:108CE000094100054002840090039000C021041057 -:108CF00040408810900810008208040010400000D6 -:108D00000040900800000000A008000000010000E2 -:108D100008000200400004000000000010000902EA -:108D20000000000005004101088440000000000030 -:108D30000088000000000400000400000010000093 -:108D400000A000A0000009000000000005000000D5 -:108D5000090000840004002000002102000020001F -:108D6000404004840584080008000000040008084E -:108D70000200000002051000212000000000008217 -:108D8000000003C000C0000000000000000004203C -:108D900000100800C0008400000000000000000077 -:108DA0000004000900000800090008800004000019 -:108DB000000040000000000008000440000008001F -:108DC000A000080000000000100000000000880063 -:108DD000C0008200100004208400880000002000F1 -:108DE0008400822190000004000040001000002058 -:108DF0002004080941040000404000000808C000A9 -:108E0000080082002000000040040409080002005D -:108E1000A0012000A1000008000000A00000000444 -:108E200020002084030441000090400080020000E4 -:108E30000010008800001000004000000300000047 -:108E400000000008200000040000002000000000D6 -:108E500000000000410000848009409000000000F4 -:108E6000850041000000410005000000A000400016 -:108E7000110021000040200000102100002000000F -:108E8000201021000010200000000382000020209C -:108E900000048402001000210800000020082000C7 -:108EA00088008200C0008200000400000020000052 -:108EB0000000A000001000040000020000100000EC -:108EC00000084021000000000000000082000800AF -:108ED0000000000000000000000008000041080041 -:108EE00002000000400000040000001100400805DE -:108EF00000008200824082088280002108048240B3 -:108F000000000000A00000000000A0210400A0005C -:108F10008200020000080000080209000000002092 -:108F200000004000092000401000000400080084F8 -:108F300002100020000000000000000800000000F7 -:108F400000080400800800A00000080000000000E5 -:108F500000080000000010000300000020100000C6 -:108F600000000000009080080000032008040002B8 -:108F7000000009100904030040000004000800007C -:108F80000400000041022000000000080040000032 -:108F900000080400000000080010020300000000A8 -:108FA000000000000000C08000000280218020003E -:108FB000000401800000000000080008000082009A -:108FC00082000000002100000000000000000000FE -:108FD000042100000000000008000000080000005C -:108FE00008008800000800000000000020000221A6 -:108FF0000221000300030088C0001004100001409B -:1090000020000008000008200000090008000000FF -:109010000400901184000000020000000000009095 -:1090200020880240219000000010000080100810ED -:10903000000000C008100000000000002000000038 -:1090400000400000000000002000000003000800B5 -:1090500000000400000000000000000041000000CB -:10906000009000A0000000000000000000000008C8 -:10907000000000001100000021040440200540020F -:109080004000001000044010008803004000200051 -:109090000000400000000200A0109090040800882A -:1090A000000000000000000011C0001000A010022D -:1090B00002A00040A002201000000000900000006C -:1090C00002A0820200402010000000008400000086 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000A00004840355 -:1090F0008803000000000000000004A0029001109E -:1091000082000302902001030484000140009001CA -:1091100000010000840000000000838085800000C2 -:10912000000000000000000000001080000000802F -:109130000080918003000080000000000000040017 -:109140000000828000000080008000000500800098 -:10915000000000000000000000000000000000000F -:10916000000000000000000000000000008920A0B6 -:1091700080A000A00000000000000000808000002F -:1091800040808000889180880988808200200010BB -:109190001020000400000000000000000000000893 -:1091A00080800000000000000000000000000008B7 -:1091B0008080000088000808108021000005000061 -:1091C0000000000000000002800080000280050016 -:1091D00008112090000000000000000000000000C6 -:1091E000000000000000000000000000000090806F -:1091F0002009A01120911000412004081000002037 -:1092000000080020000000000003008000000400AF -:10921000030020000310000000000000000308000D -:109220000000A08200000000000000000000880094 -:109230002000401020008800900109400900000033 -:1092400000000000000020001001A0828200014008 -:109250000000000101880000000000000000000084 -:1092600000000000000000000000000000000000FE -:109270001140080009019188010000C0004101006F -:1092800000010001008900000200100008820800AF -:109290000084000000000100000800000000000140 -:1092A000402000210808822100000000000000008A -:1092B00000000002000811888240002000201008F1 -:1092C000000000000001000108200082008400026C -:1092D000000000010000000100000000000000008C -:1092E0000000000000000001000000000000040079 -:1092F000000002A001A10209100900000000840082 -:109300000100080804A010000082900800020184F7 -:1093100083A0000101010001000100000000000025 -:1093200000008005000800108040000000000000E0 -:10933000000000000000008009000020000500037C -:1093400080050000000800200004800000000000EC -:10935000008000040003000910200000000000004D -:109360000000000000200002001000094100000081 -:1093700000000000802008C0418882020000000038 -:109380008000200000808080800004000080088031 -:1093900010809080002020100921000400000000AF -:1093A000000000000000002000800000000000001D -:1093B00000000000000000098080000080800000A4 -:1093C000000080100000000000000000000000A06D -:1093D0000000000041001000050011030000000023 -:1093E000000000000000000000000000000000007D -:1093F000004000000000411040C1850011038000C2 -:109400000040000080020000800080000000800911 -:1094100000218000800021000404030003081010D4 -:109420002000410003008800109088021000000016 -:109430000000000000008800889182840800C010AD -:1094400002100490A0000000000000000000820054 -:109450002011889090000110000000000100000021 -:1094600000000000000000000000000000000000FC -:1094700000000001000000008388101005C00100FA -:10948000C040900188000400100040000800100057 -:10949000C000A0900210020001880001010000013C -:1094A0000100010000000000004100000700000072 -:1094B00000000000000000000000000000000000AC -:1094C0000000000000000000000000E000000000BC -:1094D0000000000007000000000000E000000000A5 +:108A8000400820804000202088004000200488808A +:108A90002040020084002100200040002000C0048B +:108AA0002000880020000402040088002000200428 +:108AB000200840000400040020000400040004100A +:108AC00000034008200004082008409020102004E3 +:108AD0000405200088008800880000002005200888 +:108AE00040042005C000200020C004032005200011 +:108AF00040000010040020004004820020104004C8 +:108B0000020400000020000041410000000021019B +:108B100000044000C000400008000000000040A029 +:108B20004000000000004002090100002000400059 +:108B300040001000000209000002000000000000D8 +:108B40000021000000000000000004000204009169 +:108B500021C005000000040004000000040009001A +:108B60000002040009000004000204411000090092 +:108B700009002002000100004100850204000000FD +:108B800020028000000020200000822000800008D9 +:108B90000000820000000200000000000000000051 +:108BA00000000000010000000800030002000000B7 +:108BB0000000A000000000000000A0000000000075 +:108BC0000000000000000080000000100100000014 +:108BD0000904000000000000000000000000000088 +:108BE00000000000004000000240820000108200EF +:108BF000020000000010000002100000001002003F +:108C000000000000820000000009020000090004CA +:108C10000000000802000008A0080200000400088C +:108C200000080000000808080388000004082084E9 +:108C300000080904000000100008020000100008ED +:108C400000100010400400000210000000000804A2 +:108C5000030888090008000800840008000040108C +:108C600000100208001000080008808800100009A9 +:108C70004008040800084108000800A00584000816 +:108C8000408411080088001010000000000001104E +:108C9000000000008800C00010000000000000007C +:108CA00000000000000000000400000000000000C0 +:108CB000000800100008000000020000000300008F +:108CC000001000000000000800000000000000008C +:108CD000002100032010202120000000002100219D +:108CE00000210000000500050002004100211021C4 +:108CF000001000000041000000000021820500106B +:108D000000212000904188000010080000000000B1 +:108D100040000000000000000900001000880084EE +:108D2000000800A000A000A0000000000800000053 +:108D30000084000000000020001000880000008473 +:108D400000A0008400A000820000000000001100CC +:108D500000A00000009080888000800000000000DB +:108D6000008404A0000800000000000000020000D1 +:108D700011A005400000410041200300000005084B +:108D80000510088403A0000000000300200000007C +:108D90000080830008000080A0000800000004405C +:108DA0000400820500000800C00000000000000070 +:108DB000820000000000000020000200000000000F +:108DC0000000080010050800080020000000000056 +:108DD000C000080010000000820000050800A0008C +:108DE000080008000800880484001004080000003F +:108DF00008000040C04082401000000084000804C9 +:108E00002004844082000000000490000002200042 +:108E10000000000204000000000400000000000048 +:108E2000000000000000030000000000000000003F +:108E30000000418800000000000000000000004029 +:108E40000000000000000000000000000000000022 +:108E500000000000200000000000000000000000F2 +:108E600000000000000000000000000000000008FA +:108E700010001000090010000800000000000400AD +:108E80002104080000000000000000A00000000114 +:108E90008220000000201000000000000000000000 +:108EA000000000000000200000030000000082001D +:108EB000000000000000001000200002000000027E +:108EC00000000000088004000000C008C000090085 +:108ED000000084000008C0028200000000000000C2 +:108EE0000000000000000000004008000400000036 +:108EF0008200000000008200820000050000840063 +:108F0000A0008400840020000000C00582008421AD +:108F100010000085000000010000000000001102A8 +:108F2000001000000082000080000000000003002C +:108F30000000000000001100090000100000000007 +:108F400000A0000008020910040800000000000052 +:108F50004000000041000000000000000010000080 +:108F60000300000200000002000000100084000066 +:108F70000000008800040000000000004002000023 +:108F8000000000A011000982000009020008000092 +:108F90000000200082080000088400000008000093 +:108FA0000009900000000000000000050000000023 +:108FB0000008084000000000000000000000000061 +:108FC0000004000800002000200000000000000055 +:108FD0008208000000000810000090000000084017 +:108FE000000900000000000800210008000800003F +:108FF0001000001000000021000800088500040097 +:109000000000004002002004C0004000A00000005A +:109010001004A0000808000000002002000000006A +:10902000000000000000000400000000020000003A +:109030000000000000000000000000000800000028 +:109040000000000020000000000000000000000000 +:10905000000000000300000000000000000000000D +:1090600003000000000000000000000000000000FD +:1090700000000000000000000000000000000200EE +:1090800000000000000020000000000000021000AE +:10909000000000000000090000C0A0900400A0A093 +:1090A000000100009101000000000000000000002D +:1090B000000000000000000002080140040210103F +:1090C00000000000000000000000000000000000A0 +:1090D000000000008500000000000000000000000B +:1090E0000000C1A0002000024002000000000000BB +:1090F00000000000000000000000C040024000A08E +:1091000082200000000000000000000000000200BB +:109110000000019003A00811008800808380800077 +:109120008080001110008410000940000000000041 +:10913000000000000000000000000000418000006E +:10914000800000000000000000000000000000009F +:109150000000000005008400000000000000000086 +:1091600000000000848000000580008000000000F6 +:1091700000000000000000000000000080800000EF +:1091800000808000000000000000000000000200DD +:10919000800000001011A109800800021180110355 +:1091A00080858883008041001011030300000000C7 +:1091B000000080000000000000000000000000111E +:1091C000809100000000000000000000000000008E +:1091D000000000000000000080000000000080008F +:1091E0000009000000008008000380080000000063 +:1091F00000000000000000000000000000008000EF +:10920000801000028000000000000000000000004C +:10921000000400000000408005210280030300409C +:1092200001000804C18200900000010100009000CC +:1092300020009000C000000000000000000090002E +:109240000801A002880000000000000000000000EB +:1092500000000000000000000200040084900000F4 +:10926000820010000084100008010000A01000001F +:1092700000000000000000000000000000000000EE +:10928000020004099089C0000000000000000000F6 +:1092900000000001008200000002008800840091AC +:1092A00041010240C09000C0000000010001010027 +:1092B00000000000000000000000000000000000AE +:1092C0001008001100081009000000000000000054 +:1092D000000000000000000000000001000100008C +:1092E00000000000000000000000901020080002B4 +:1092F00082080000000000000000000000000000E4 +:109300000000400000102010830200000000000058 +:10931000000000010000000000002000010000012A +:109320009000C11180858083008500050303031030 +:109330001100000000000000050000000000000017 +:109340000000801000040009000800000000000078 +:109350000000000000000000000000000008000401 +:10936000001100000000000000000000008080806C +:109370000000A080000000000000000000000000CD +:109380000000000080000080000089000000000054 +:109390000000000000100020002000200005042133 +:1093A00011210040910485C0A100850000801011AA +:1093B0000300041000000004008000000000000012 +:1093C00000000000000000C000008000000000005D +:1093D000000000000000000000000000000000008D +:1093E0000000000000008000000080000000000578 +:1093F00080080000000000000000000000000000E5 +:1094000000000000000080008088000000000000D4 +:10941000000000000000800000000000800005A1A6 +:10942000200403000504910104400388040000C0E7 +:10943000010101000100000000080082000000009E +:1094400000000000000090009011001004000000D7 +:10945000000000000000000000000000000000000C +:109460000088000200000000080088020400C0001C +:1094700090008803900890000000000000000000A9 +:1094800000000000000000004000028320C08800AF +:1094900000000000000000000200100000000400B6 +:1094A00020C190010900C00000810000070048426F +:1094B000000000E000008100880000E000000000E3 +:1094C0000000000000000000000000000700500045 +:1094D000000000000000000000000000000000008C :1094E000000000000000000000000000000000007C -:1094F00000000000000007000000000000E007007E -:1095000000000000000007000000000000E0000074 -:1095100000000000000007000000000000E0000064 -:109520000000000000000000000000000045303294 -:109530000000000000000000000000000000A0008B -:10954000AA0041000303000000000000000000002A -:1095500000000000003C10D300C300000000000029 -:1095600000000000000000000000000000000000FB -:10957000000000000000000000000000FF0F0000DD -:10958000C0C0FCFC0CFCFAFA000000000F0A0F0A35 -:10959000CBCBEBEBFF00C3C355F57DFD0000000016 -:1095A00000000000000000000000000000000100BA -:1095B0003032000000000000000000004D0CCF8E93 -:1095C00000000A0041C30303000100000000000086 -:1095D00000000000550F55001CDF0CCF00000000FC -:1095E000000000000000000000000000000000007B -:1095F0000000000000000000000000000000FF0F5D -:10960000FF0FC0FFFCFF0CFC0A0A00000000150A57 -:10961000010ACBCBC3C355550F0F00F03CFC000033 -:109620000000000000000000000000000000BF0F6C -:10963000BE0000000000000000000000000080D01C -:109640007020AAAAC3FF002A00AA0004000000009C -:10965000000000000000FFFF30FF1414C0C0000035 -:1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000000EA -:1096800080808080FFFFFFFF0000000000000000DE -:10969000F0F0F0F0000000005F55DFD73C3CF0F048 -:1096A00000000000000000000000000000000000BA -:1096B000FF0FFF0028AA28AA0000000000000000F9 -:1096C00080D070200A0A030F002000000000001064 -:1096D0000000000000000000FFFF3030FF00FF002E -:1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:109700000000003CC3FFFFFF170000000000000046 -:109710000000FFFFFF00000000000F00CFC33C3C33 -:10972000FAF000000000000000000000000000004F -:10973000000000610036000D000000000000000085 -:1097400000008000500000000001A0610006001D24 -:10975000000000610007000D00000000000800008C -:109760000000006100060001000000000000000091 -:109770000000000000610006000D00000500000868 -:10978000000000000061000A00010000A0610A0E54 -:10979000050D000000610007000D0000A06100063B -:1097A000000D000000610005000D000000610006D2 -:1097B000000D000000000000C0C0FCFC0000000024 -:1097C0000000000000000000000000000000000099 -:1097D0000702D78200000000FA00FF050000000029 -:1097E00000000000A0A0C0CF003CF0FC0000000082 -:1097F00000000000000000000000C000FCFF0000AE -:10980000000000000000F0AA00C300F03CFC0000D3 +:1094F0000000880000E000004200000000000000C2 +:10950000000000000000000000000000000000005B +:109510004200000000000000000000000000000009 +:10952000000000000000000081000000FFDF0000DC +:10953000F0F000000000000000000000000000004B +:109540000000000000000000000082FF82554D0D69 +:1095500041010000000000000000000000000000C9 +:1095600000000000000000000000000082FFC2FFB9 +:1095700000000000C5C50F00A7A207020000000000 +:109580000000000000000000000000001010055561 +:10959000A0A0AFAF0000000000000000AAAAFFFFDB +:1095A000000000007C7CFE7C000000000000FFFF4B +:1095B000000000FF000000000000000000000000AC +:1095C000000000000000000000000000D7FFD75599 +:1095D0000D0D01010000000000000000000000006F +:1095E000000000000000000000000000000000FF7C +:1095F000C0FF00000000C5C5FFF0F7F257520000A1 +:10960000000000000000000000000000000010103A +:10961000005000F00FFF0000000000000000287D57 +:10962000287D000000005050FA5000000000FF3C70 +:10963000000055FF000000000000000000000000D6 +:1096400000000200FBFF00000000000000005D5D64 +:109650005D7DBE3CFE7C00000000000000000000BC +:10966000000000000000000000005FFF5FAA000093 +:109670000000000001010B0BEBFFEB0041EB41EBA5 +:1096800000000000000000000000000000000000DA +:1096900028280000FFC3DFDF0000000000000000FA +:1096A0000000000000000000FF808080000000003B +:1096B000C300000055000000000000000000000092 +:1096C000000000000000FFFF00000000000000009C +:1096D0005D5D5D5D3C3C3C3C000000000000000026 +:1096E0000000000000000000000000005F555F0067 +:1096F00000000000000001010B0BEB0FEB0F00005E +:109700000000000000000000000000000000000059 +:1097100000008A088A083C001010000000000000C9 +:1097200000000000000000000000FF00000000003A +:1097300000000363033E0C0DC2C000610001000184 +:10974000000000610006800D000500000000000020 +:1097500000000061000E000D00000000000000008D +:109760000000000000000000000000610006000D85 +:109770000000000000000000000000000061000781 +:10978000800D00010000000000000000000000004B +:109790000000000000003000000000050000000094 +:1097A0000000000000610006000D000000613006AE +:1097B000000D0000FBFFFFFF000000203C553C5562 +:1097C000E8FFE8FF000000000000000000000000CB +:1097D0000000000000000000FFFF0000000000008B +:1097E0000000000000000000000000000000000079 +:1097F000FAFAFAFA00000000000000000000000081 +:109800000000000000000000000000000000000058 :109810000000000000000000000000000000000048 -:109820000000000000002D2D2D2D0CCF555500AA55 -:10983000FFAA000000000000000082BE82BE0000FF -:109840000000000000000000000000000000000018 -:1098500000000707D7D700000000FA00FF0500004E -:10986000000000000000AFAFC0CF557DF5FD000047 -:10987000000000000000000000000000C000FCFF2D -:109880000000000000000000F0AAFFC355F57DFDB8 +:1098200000000000000000000000A0A2A002540000 +:1098300055003CFF3CFDFFFFFFFF000000003C0F18 +:109840003C0FE800E80000000000000000000000FD +:109850000000000000000000000028F800000000E8 +:1098600000000000000000000000000000000000F8 +:10987000000000F00FFF00000000000000000000EA +:1098800000000000000000000000000000000000D8 :1098900000000000000000000000000000000000C8 -:1098A0000000000000000000FFFFFF000CCF555536 -:1098B000C3F0C3F000000000000000000000000042 -:1098C0000000000000000000000000000000000098 +:1098A000000000000000000000000000AAA2AA02C0 +:1098B00004005500000000000000000000003030EF +:1098C0005C5C5C5CF0AAFFAA0000000000000000E5 :1098D0000000000000000000000000000000000088 -:1098E000000000000000000000000000050505FF6A +:1098E0000000000000000000000000000000000078 :1098F0000000000000000000000000000000000068 -:10990000000000000000000000003E3E3EFF05FF9A -:109910003DFF00000000E800EB0000000000000038 -:109920000000C341C341000000004D000C001717A8 -:1099300000FF000000000000000000000000000028 -:109940000000000000000000000000000000000017 -:109950000000000000003EFE02C200000000000007 -:1099600000000000000000000000000000003D3D7D -:109970003DFF0000000000000000000000000000AB -:109980000000000000000000000000000A0A0AFFBA -:1099900005053D3D00000000E80028000000000033 -:1099A000000000008280828A000000004D00CF008D -:1099B0003F3F00FF000000000000000040004000AA -:1099C0000200200000030000880040100000000496 -:1099D0002000A000200488000000080020002000D3 -:1099E00004000000000000000000880040000100AA -:1099F0000400080020050000C00020050003400905 -:109A00000408008002840080018000A08800880093 -:109A1000890001112000880084000000840284096C -:109A200090100082028000000300008040C000000F -:109A3000820000200000400884050000848320008C -:109A4000000040000000000000400000090102008A -:109A5000000000020000000040000002C0004000C2 -:109A600041000002400200000000002021004100EF -:109A7000080000008000008441C000004000000099 -:109A8000200040C10002000241400840051100844E -:109A9000000004A0040200824084009000004009FD -:109AA0000402044100118910000204020002400374 -:109AB0000020008200012020800000020000002021 -:109AC00000100000000000020000820000090000F9 -:109AD000080000000200004040008409900440009B -:109AE00002000200840002100200000000100002C8 -:109AF0000200000000410000A000000000109000E3 -:109B000000001000000902C1001000000100104018 -:109B100000400040000000008205020040000009F3 -:109B2000004002C002000010108084408440028087 -:109B30008480000002000400030000000108080007 -:109B4000010821010200000040850004000000001F -:109B50000040800000080084000080000000000039 -:109B6000801005000004000000000000000000015B -:109B70000001008402080208008400000000400088 -:109B8000000000008008000000020009048240403C -:109B900002840008040000082084020800048000F9 -:109BA000118400000011090000C080100084000929 -:109BB00000100402040000408300400800002082DE -:109BC0004008040400210000900000000021004033 -:109BD0009080901100080480008088408821044013 -:109BE0000000000000000000000800080021002123 -:109BF00000000800400020000000C0080021000212 -:109C000000080000000002034000000002021008EB -:109C100084000203C0200100002000000080C0007A -:109C20000000880890110040A08000080405000989 -:109C3000001108020403000000210421884000886C -:109C400000000021000000024084008800A0000005 -:109C500009A0001003900200081005040808000481 -:109C600000000040008203000040080408A000003B -:109C70000000080080000004000008000000030845 -:109C8000008400A000020000000085000000002108 -:109C90000900050000000021020009012100004028 -:109CA00000040008000000000000000200000002A4 -:109CB00000400000C10100820020000000080300F5 -:109CC000000211820088004000008400C000A02033 -:109CD0000000820000001000020082000000090065 -:109CE000C021000000094009001000000000000031 -:109CF0008200002184000000000002000800000033 -:109D00008200080010004010000040000810080009 -:109D1000000002000000C184080020004000A000F4 -:109D200003000200000482000880080008110010EF -:109D3000C000008000058241820008004000C00091 -:109D40000000400020000000040003880000000024 -:109D50004100110010000000080000000000200079 -:109D600082000000080041000800008500004188D2 -:109D700020000000000004A0000800C00000000057 -:109D800000000000000000849100000080004100FD -:109D900000000000800000004002208403900000CA -:109DA0004100C0000000410000040002008800885B -:109DB00000880200030200000090400000008000C4 -:109DC0000000000080000840008208C0C041000080 -:109DD00000000000000000001010C00000008241E0 -:109DE00082208200000200110000824000004041F9 -:109DF00000080000100010000000820000000000B9 -:109E0000C0000000000000028200040000004000CA -:109E1000820040004000C002000040048520000095 -:109E20000240C000000008030000A0000002000083 -:109E30000021000009400008400000080905000852 -:109E4000004000200000408000008241000000909F -:109E50004008008400A000840000000005004008C5 -:109E600040880008050002004020020000000008B1 -:109E70000300000800000090000021000020000006 -:109E800000000800020000A0100000000000000018 -:109E900084004100800080000000000080000491E8 -:109EA000080480880502099004200900082003881E -:109EB0000200000400040200000089080500088276 -:109EC0001184400200000000910200000000000028 -:109ED000200000000000020000000010104082047A -:109EE000000482400000102000210000000000005B -:109EF00000000000080000000008840088088400BA -:109F000000000000A0410800002100001000000037 -:109F1000000040800021840810000080020008A09A -:109F200000008200C00082400010000010210210DA -:109F30000021820082109000011100210003000323 -:109F40000040000020210000002100080000000067 -:109F500000000000000000C0000040000001000000 -:109F60000300000120000800200000000000400065 -:109F7000400003002000080004000000100800C09A -:109F800004000000000000000020000000000000AD -:109F90000000000080020000000080000040000877 -:109FA00080210800020000000000000103002140A1 -:109FB0000004040003000001000202900000000001 -:109FC00000000000000000C0000000000800024087 -:109FD000000000000000000084000000C0100840E5 -:109FE0000082C088C0C1908804030482C0030004BA -:109FF0008884A0C0000000000000000000000000F5 -:10A000008800880002C00088002082100000010043 -:10A010000400000000000000010005000001C1A0D4 -:10A0200002C100C082A0C0C08204008220020000E1 -:10A0300000018400000141C1882002A0828591C0F6 -:10A04000090501A082850000A000A0000000830196 -:10A0500004010000820000002000800000008080D9 -:10A0600080800080000089C00011831080808010F3 -:10A070000300009000050000000000000000000048 -:10A080000000000000008080000000000080000050 -:10A0900021008000000000000041411190110021CA -:10A0A00089888810000980A080800380008000805B -:10A0B0000005202080400021C0A009830085800287 -:10A0C00040A00388214080A10000000000000000A3 -:10A0D00002418004114180090000000300000000DB -:10A0E0000000804000020000A080912111808008C3 -:10A0F0008000000000000000000000200080000040 -:10A1000080000000000000000000800080000000CF -:10A11000000020001000102000001000100003209C -:10A1200041004180902108838808800000100000D1 -:10A13000000041009000080208899080A1202010B2 -:10A1400020211100090880800384200002002000E3 -:10A150002003000000008000000800000001000053 -:10A160000020A000080582A1C0821088820008A0FB -:10A17000042088008200C0008220000000000084CB -:10A180000040020010000000C000A0000400A00079 -:10A190001000009001000000010000000102890091 -:10A1A000000011002002020001029009A00002003C -:10A1B0009008000090400200010001104140110190 -:10A1C00003018901880008018840098801400100D5 -:10A1D0000000000120A00400A00082010000000196 -:10A1E0000000000005A0000884820408084000A1C7 -:10A1F00008C18921C041000208848985000000004F -:10A2000000000000004000000004008382080002FB -:10A210000084048800000000A0000001000100008C -:10A2200001014101000104110088410503C090C1F2 -:10A230000088008410C000000000000100000888B1 -:10A2400001030182A00240100000C004A0A1000090 -:10A2500000014001000000020182000400900000A3 -:10A2600000080000000988000080000085808091BF -:10A2700021850510112100880520009002100000A2 -:10A28000000000000000004000000010008300807B -:10A29000008000008080000300418009000200016E -:10A2A00000410320212111418008008021A104A048 -:10A2B000000800830088028000102110082100108F -:10A2C00080102040408480108008080905108040DC -:10A2D0000040004080210040000003800400100086 -:10A2E0000000000000000000002000C0808000800E -:10A2F00011881091850000040000002100800000FA -:10A3000000098000800000000000002000800000A4 -:10A3100000000000000000000200200020000805EE -:10A320000001410320802100204021C08021040041 -:10A330009005800480A18000800021020980040033 -:10A340002102418010111080880041051021080071 -:10A35000A003204040082100110421212091090080 -:10A360000000200000001000100020018283104037 -:10A3700004101002918310C00200000000030010BE -:10A380000000900020000800080000000002000803 -:10A390000000000000A00004000000000000010018 -:10A3A00001000001010000200184000011028288E8 -:10A3B0000308090010010810080008000103000448 -:10A3C0000010010021A040888408880091049000BA -:10A3D000028810000090010101000000010101202D -:10A3E000014000000000000000000000000000002C -:10A3F00007008400000000E0000081000000000071 -:10A4000000008100000000000000000000000000CB +:109900000000000000000000000000000000000057 +:109910000000000000000000000000000000000047 +:109920000000000000000000000000000000000037 +:1099300000002DFF2DAA007D7D7D000000000000AD +:109940003030FCFC0C0CF0AA00AA00000000000063 +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B000000000002D552D0000F5F5F54000400099 +:1099C00020004000210401008900210804008808CB +:1099D00002002000C00020002000200084002000A1 +:1099E0002000880088080200880020002000040071 +:1099F0002000200002102000880008000003401012 +:109A000020108800400020000810840040902000B2 +:109A10008800200020002005880020000405200088 +:109A20002000C0002000050802004000841000084B +:109A3000400020000280880088004020002000A014 +:109A40000000000000402040200020002000802076 +:109A50000000000040000000000440001020000052 +:109A60000000000000004000800000000000000036 +:109A7000000000000400400000900000A000000072 +:109A800000004000210800000000C000200021105C +:109A9000000040000002000004000000410010002F +:109AA00000000000002010000800400004020441F3 +:109AB00009000900000205402100400400014103A3 +:109AC0000000000000008400000400000000880482 +:109AD0000800000000000040000000000009000035 +:109AE00000000200000002000000000082000000F0 +:109AF0008200820000400000000000000000010021 +:109B00000000000000000000000000000000004015 +:109B10000810000000000000100000000800000015 +:109B200008400008000008000005011000000000C7 +:109B300000100200210000000100200002000000CF +:109B400010100000000800080000000100000000E4 +:109B500000010000400000000000000000000200C2 +:109B6000000400000040021020001100000000006E +:109B7000000802000010000802080084000020080D +:109B8000400000000400040002100000001000006B +:109B9000000082090008000800080008000800848E +:109BA0000010800009100410800809080889048446 +:109BB0000500001100040208081008400408040011 +:109BC0000008000840000000000040000000000005 +:109BD0000000000000000000840000000000000001 +:109BE0000000000000000000000000000000000075 +:109BF0000000000000080000000000210000000834 +:109C000000008200000040008808000000080003F7 +:109C1000000200000000000000000000000000043E +:109C2000000000080000040000080000000000031D +:109C30000003820002400400040084000040001081 +:109C400000090000004100000000000000000000CA +:109C500021000000000000840000008403080000D0 +:109C6000000000000000000000000000000000C034 +:109C700000A00088008800000008000000400808DC +:109C80000082000000000000000005000000080045 +:109C90000008000000A00000000008A0000000C0B4 +:109CA0000000088203000300000000000800038495 +:109CB00003A005000384210009A008004100000161 +:109CC00021000008080008400800080900020800F8 +:109CD0000000000000040000820000000009840869 +:109CE00008000000A04100000000000090000000FB +:109CF00000000000C000C000000000218200000041 +:109D00000000C00000008200000008000200000007 +:109D100000000008080084008300820000000000AA +:109D20008440840000008200820082001000C00095 +:109D300084001010080008401040080002419005FF +:109D400009110010C0008409824000000088410011 +:109D50000000000021000001000000000090000051 +:109D600000000000000000000000000000000000F3 +:109D7000000008000000400000001000410000004A +:109D800000000000000000002100000000000000B2 +:109D900000000000000000080000080010000000A3 +:109DA00000000000000000000000031000000000A0 +:109DB0001100000008C185A0000808000000000094 +:109DC000000002000000210000000000000000412F +:109DD00000001000000000000000820008000000E9 +:109DE00000000000000000000000C0000800840027 +:109DF0000000040000000000080000000000000057 +:109E000010000000000000000000000000004008FA +:109E100084000800000000000000000000000000B6 +:109E200000000000004000000000000008000010DA +:109E300000001000400000000400C0008200000389 +:109E400040020400080810000800824100020000DF +:109E500000000000008400000500108400000000E5 +:109E6000080000881100000000000000000003A0AE +:109E70000500100811A00000000000000000000014 +:109E800011A0000000000000000008100000000009 +:109E90000090000800080000050000000504030011 +:109EA0000000000000002100009000000000000001 +:109EB0000588020000040000000800000000000007 +:109EC000050000004000880000044004410003A099 +:109ED0000000820920000011410000800000000203 +:109EE0000000000008080000000800000008000052 +:109EF00000000000C00000000000000000000000A2 +:109F00000000080000000400000000000000000045 +:109F10000000000000000000000000000000000041 +:109F20000800000000000000000000000000000029 +:109F30000400000000000009A00008000800000361 +:109F400001084000A0000021000040004000004146 +:109F500002000000000000000000200200040000D9 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900003000000000000000000000000000000BE +:109FA0000000000000000000000000000000200091 +:109FB0000000000800000000000002008000000017 +:109FC000000008000500080000400000000000003C +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 +:10A01000840000000000000000000000000090A08C +:10A0200000080090A02000000000000000000000D8 +:10A03000000000000000000090000000820040A02E +:10A04000000200901020100000000000901090C04E +:10A05000002000022090000000000000000000002E +:10A0600000000500000000000000000000000000EB +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000000D0 +:10A09000020080000000000000000000000000003E +:10A0A0000080000000000000000000000000000030 +:10A0B0000000000000000000000000000000800020 +:10A0C0008880008000000000000000000000000008 +:10A0D00008800080000000800000000000000000F8 +:10A0E0000010000000100000000000000000000050 +:10A0F0000000000000000000000000000000000060 +:10A1000080000000800080000000000000000000CF +:10A11000000000000000000000000000000000003F +:10A120000000800000088000000000000000000027 +:10A13000000000000000000000000000000000001F +:10A1400000000000002180400000800080C10090DD +:10A15000800080008000000000000000000000007F +:10A1600000000001000000010000000000000000ED +:10A1700000000000000000000000000000000000DF +:10A1800000000200100004000200000000000000B7 +:10A19000000000009000A0008840000000000000C7 +:10A1A0000000000002004001A0004000000000008C +:10A1B00000000000000010000800880000000000FF +:10A1C0000000000082008200A0200800040040037C +:10A1D00008A0C000020082002000882000000000CB +:10A1E000000000000000020000000000010000006C +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A21000000000000000000000010001000000003C +:10A22000000000000000022000880020A0100000B4 +:10A230000000000000000000000000000000000816 +:10A240000020000800028820002000A0A002008852 +:10A25000000400884110401000A090820900000016 +:10A26000000000000000000080000000200041000D +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A290000000000000000000000500100010000099 +:10A2A000000000000000000000000000000080002E +:10A2B000000000000000000000000000000000009E +:10A2C0000000000000800000000000000000880086 +:10A2D00000000000000009808080008080808900EC +:10A2E000000000000000000000020000000000006C +:10A2F0000005000000000000000000000000000059 +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000003008080002A +:10A33000000000000000000000000000000000809D +:10A34000000000000000000000000000808000000D +:10A350008000000000000080000000000008008075 +:10A3600000000000000000000000000100000000EC +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000A00082AB +:10A39000000000000000000000000000009000909D +:10A3A000000000000000000000000000100000207D +:10A3B0000208000000000000000000000000009003 +:10A3C0000008000000000000000000009000820271 +:10A3D00090400200200040202084000000000091F6 +:10A3E000008400000000000000000000810000E088 +:10A3F0000000000000810000070060000000000075 +:10A40000000000000000000000000000000000004C :10A41000000000000000000000000000000000003C -:10A42000000000000000000000E00000420000000A -:10A43000000007006000000000000700820000002C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C :10A44000000000000000000000000000000000000C -:10A4500000000700000000000000070000000000EE -:10A4600000E007000000C3C3C3C3000000000000F9 -:10A47000000000000000009900FCC303C3030000BB -:10A480000000F02600260000000000000000000090 -:10A49000000000FFC3FF00000000424242420000F3 +:10A45000000000000000000000000000600000009C +:10A4600000000700000000000000000000000000E5 +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC :10A4A00000000000000000000000000000000000AC -:10A4B000000DFF0D919180800F066F676F098181FC -:10A4C0000000000000000000F0F0F0F0667F0019CE -:10A4D0000F0FFFFF999999990000000000000000FC -:10A4E0000000000040004060C3C3F0F00000000026 -:10A4F00000000000000000000099000C9909FF0F07 -:10A5000000000000F0F600069999FCC00000000071 -:10A510000000000000FF003C00000000FF0FF00002 +:10A4B00000000F0F7E0F7E0C000000000000000067 +:10A4C00000000000000000000000000030303F3FAE +:10A4D0008000000024243C24006F006F99001800C5 +:10A4E000000000007E427E420000000000000000EC +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B :10A52000000000000000000000000000000000002B -:10A530000000FFBDFFBD909900900F066F7F6F096F -:10A54000E7E70000000000000000FF3C003C66FF61 -:10A5500000090F000F1BFFFF3C000000000000007F -:10A56000000000000000D000D060000000000000EB -:10A57000000002102000008810840000000000008D +:10A530000000FFFF0F0F420F420C00000000000060 +:10A540000000000000000000000000000000F0001B +:10A55000FF0F000000002C2C3C2CFFFF00009F0F81 +:10A560001C0F000000000F0F0F0F00000000000084 +:10A5700000000000000000000000000000000000DB :10A5800000000000000000000000000000000000CB :10A5900000000000000000000000000000000000BB :10A5A00000000000000000000000000000000000AB @@ -105079,494 +105079,494 @@ :10A5C000000000000000000000000000000000008B :10A5D000000000000000000000000000000000007B :10A5E000000000000000000000000000000000006B -:10A5F00000000000000000000000000080804F40CC -:10A60000F9F9C3C30F0F00000000000000000000B4 -:10A610000000000000000000DBDB0000434300F00E -:10A6200000000CFF0000000000000000000000001F -:10A6300000000000909000000C18C0C00000909F27 -:10A64000FCFC18F018F0000000009191919166FF59 -:10A65000F0C3FFBF3C3C660FC3FFFF0FFF3F00008E -:10A6600000000000000000000000FF007F0000006C -:10A6700000000000000000000000000000008F80CB -:10A680004040F900C30081C381C33C3C3C3D000015 -:10A6900000000000000000000000F9F90000404048 -:10A6A00000F0000024E700000000000000000000AF -:10A6B000000000006F6FFFFF00003C3CC9C90909A2 -:10A6C000909F0C0C18F018F000000000F3F3F3F367 -:10A6D0006600F0C3C3020000660FC300F000F03054 -:10A6E0000000000000000000000000006F007F007C -:10A6F00000610006000D00000000000000000000E6 -:10A70000006150010011000000610006001D000002 -:10A71000000000000000000000610006000D0000C5 -:10A72000000050000000000000610006000D000065 -:10A73000000000610007000C00000061000E059D94 -:10A7400000A10061200E004D000100610006000D17 -:10A75000000000615006001D00008061200E000D09 -:10A7600000010061000E050D00000061000D000DEC -:10A770000000000000000000FFFF000000000000DB -:10A78000000000AA00F07C004000000000000E0263 -:10A790000F0300000000000000000000000082BE67 -:10A7A00000FF0000000000000000050CF5FC505008 -:10A7B00051550000550000D0FEFEFFAA55555555D5 -:10A7C000FF00C30000000000CF00CF00F0F0F0F069 -:10A7D0000F0F0F0FD250FAFA140CD7CF00C300C0DE -:10A7E000FFFFC3C37DC041C0EAEF4045F0F05050C9 -:10A7F00000000000000000005050FAFA00000000C5 -:10A800000000000000AA00007C00400000000000E2 -:10A810000E020C000000000000000000000000001C -:10A8200082BE00FF0000000000000000050C050CC7 -:10A83000505050540000550000D0020200AA0C0CE9 -:10A84000FFFFFFFFC3C300000000CFCFCFCFC3D7B0 -:10A85000FFFF82FF8282D2505050D7CFD7CF000067 -:10A8600000C0FC3CC0007DFC41FCEAEF4045F0F03C -:10A8700000FF0000000000000000000000000000D9 -:10A880000000000000000000F000404040400F0FBA -:10A890002D2D00000000000000000000000000005E +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000000000000000004A +:10A6100000000000000000000000427E000000007A +:10A620000000000000000000069F069F00000000E0 +:10A630000000000000000000FFFF7272F330000015 +:10A640000000000000000000000099FF9F9F000034 +:10A6500000000000000083C3838366FF42DBDBDB76 +:10A66000DBDBFDFD3CFFC3F0009900663C7E000093 +:10A6700000000000000000000000000000000000DA +:10A6800000000000000000000000000000000000CA +:10A690000000000000000000000000003F3F00003C +:10A6A0000000000000000000000000009999000078 +:10A6B0000000000000000000EFC3EFC37E7EFF3CFF +:10A6C0000000000000000000000000000066060618 +:10A6D000000000000000000080C380806FFF4BDBA3 +:10A6E000DBDBDBDB40403CFFC3F0FF99F0F6FCFE18 +:10A6F000000000000000000000610007800D000065 +:10A700000500002000000000000000000000000024 +:10A710000000000000000000000000000000000138 +:10A72000000000000000000000610006000D0000B5 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A760000000000030000000000500005000000064 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A000000000000000000000000000000055AFA5 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A83000FFAF00000000000000000000000000006A +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 :10A8A00000000000000000000000000000000000A8 -:10A8B000000000A000AF000040404040B0B03C00AD -:10A8C0000000030F40C340400000000000000000F3 -:10A8D0000038FFFAFF00FF00020A030F00000F3CE0 -:10A8E00000FFFFFFAAAAC3C300000000CFC38A82F3 -:10A8F00005050C0C00000000000000000000000036 -:10A9000000000000000000000050F05040434043B1 -:10A910000F0F2D2D000000000000000000000000BF +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 :10A920000000000000000000000000000000000027 -:10A930000000000000A000AF00000000C300B0B0A5 -:10A940003C00030F030F41414141000000000000A3 -:10A950000000FF38FFFA8383010182AAC3FFFFFFD3 -:10A96000FFFF3838FAFAFAFAC3C300000000FFF319 -:10A97000AAA20505000F00000000C0000000002092 -:10A9800021008800000000000010C08000000002CC -:10A990000002040910002040100004000000A04044 -:10A9A0008400A0000000000484002000C000840493 -:10A9B00000020002A000A000C00000030000000090 -:10A9C000200004008804020002080100200020008A -:10A9D00004040000100200800202840088000000CD -:10A9E000020402040200201120008400201002054D -:10A9F00000000240000000002004000400004000AD -:10AA0000000408024000000200400003000810009B -:10AA1000210300002100000010840000100010003D -:10AA200000900000400040C02140100000004000A5 -:10AA300000004101000040004008109000000000AC -:10AA4000400040044020400040004008080000A0B2 -:10AA5000000405000904C121400820000000000096 -:10AA600010840000000200000090100000040000AC -:10AA7000210200024002080000020008000200104B -:10AA800000000205080040080000020008000880DD -:10AA900002008200000040094000840540000200DE -:10AAA000030002000000210021002000111004001A -:10AAB0000010020902100000000400400200000023 -:10AAC00002000000000000048200000000040202F6 -:10AAD000000010000840000991000884048040052F -:10AAE0004000008082004000880000000400000058 -:10AAF000210001000010040000000004000000001C -:10AB00000009000800088008840800000000848410 -:10AB1000800800840000000080828000020084041D -:10AB20000084408200040004909090008484A0A0DF -:10AB3000008400840008040000840000000000027B -:10AB40000000000000400000008800000082008437 -:10AB5000048300000008800800081010800800101E -:10AB600082008000000200888000040002C000080B -:10AB7000000040004088000200880010000000082B -:10AB8000000884402002A003840582000409000814 -:10AB90000040400884080008000010882000900051 -:10ABA000C00208100002C0000008080000081008D9 -:10ABB00000082011000840000000000000210004EF -:10ABC0000021000000400008000800000041C0080B -:10ABD0000000202100004000C0009000400020053F -:10ABE0000088001000102000080088084008400578 -:10ABF0000202C0080008004088000008900000051C -:10AC000000210021000121A00082040003020000B5 -:10AC1000418805090082050000000300800821002A -:10AC2000000000000090090841100400030000002B -:10AC3000100000000084090021A010000008080096 -:10AC400008100000000008002184000003400000FC -:10AC500000000408080000A0020000000000000836 -:10AC6000C100001000A041A0000204900004402098 -:10AC700009A0418821A003A00002000800004000B4 -:10AC80001040000000000000000082101000A040F2 -:10AC90000005900084C000880000040040000840C7 -:10ACA00000000009A1400000000900000009004167 -:10ACB000000000080000000000000000A0001000DC -:10ACC0000000000000100000000088400000C000EC -:10ACD00000408800000000000200000000040000A6 -:10ACE00020000080911008202000000000000804CF -:10ACF000000000000800A004008005050405000015 -:10AD00000809200020000800050000000085001050 -:10AD1000000003002100000200020500008800007E -:10AD20000001004000C00800000000000300000017 -:10AD3000008800004111000004000000000800002D -:10AD4000000000080008000000000000000000C033 -:10AD5000000000000000009000000000000000C0A3 -:10AD60000000000000044000000000C000040000DB -:10AD700011000000000000000000000202000000BE -:10AD80000000210000000000000084008200040296 -:10AD900084408200204000030000900084400010A6 -:10ADA0000010001108000000080800020000000068 -:10ADB0000841000000000000000500200000000025 -:10ADC000000008000000000000000000000000007B -:10ADD000040000100000000000002000000000003F -:10ADE00008100000108082400000880020400040D1 -:10ADF0000000840382020008822182000000000219 -:10AE0000000000000003A0410005820205000000D0 -:10AE100000080084058400020020004008040500AA -:10AE2000040820010004200209000840210000005D -:10AE30000000000004040000000000040000000006 -:10AE40000004000000880000210008000000040049 -:10AE50002120000008000200008800A002820400F7 -:10AE60000204058240002008200000400508000878 -:10AE70002010000804A04090404000080420212039 -:10AE800000000840000000000004030000C00800AB -:10AE9000200808000020000082000010002190021D -:10AEA0008409002002211000002101000008000098 -:10AEB000000000410020000000001000020400110A -:10AEC0000000402100080003040000000000000012 -:10AED0000000000000004000000000210000001001 -:10AEE0000800000002000000020000000000000056 -:10AEF0000000000400000400080000040203000039 -:10AF00004000082100000000A00002048804900016 -:10AF100000000000800400000000000000000000AD -:10AF20000000000000000000800000004000400021 -:10AF30000000000200000200040000000000000009 -:10AF400000000000000000000200000000000000FF -:10AF5000000000000000000000840000000000006D -:10AF600000000800000000000200000002000000D5 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000240008800002010A0C10120080924 -:10AFA000A00200000101A0000001020010008201C7 -:10AFB0008200000100008801000000010101820000 -:10AFC0000001000000001000000000000000000070 -:10AFD0000000000000000000000000000000000071 -:10AFE00000000000100000000000880040A10105E2 -:10AFF00002C108C1000101010200000000000000C0 -:10B0000000000000009008890003104000000000CC -:10B01000000000008080000000000080838808C0DD -:10B0200000880088001110020040001080200511E7 -:10B030008003801000040211000200090041410356 -:10B0400002090002000000000000000000000000F3 -:10B0500000000000000000000000000000000000F0 -:10B060000000000000008000000000000000858853 -:10B07000080941080008000821218020000800007C -:10B080000000000000000820000300908003000082 -:10B09000000000000000000000038021800000008C -:10B0A0008003800000002000210585004189050003 -:10B0B00088000200C1031000080002001021408037 -:10B0C00004002000414000000000000000000000DB -:10B0D0000000000000000000000000000000000070 -:10B0E00000000000000080000000000000000000E0 -:10B0F0000400020882904100050002002000201197 -:10B10000000000000000000080008021808000031B -:10B11000000000000000000020000200A011040058 -:10B1200082000800A040820088008900119011A0D0 -:10B13000908883004100098301A001000000000104 -:10B1400000C00000000001900000000000000000AE -:10B1500000000000000000000000000000000000EF -:10B16000000000009000A0000400C000400020008B -:10B170008200A1021000A00491000008010001005B -:10B1800000000000000000000000A0880200A008ED -:10B19000C0830000000000000000008200840084E2 -:10B1A00010C04091000200908840000000000000A4 -:10B1B0000000008900890002000200000101110165 -:10B1C000000000000000010100010000000100007B -:10B1D000000000000000000000000000000000006F -:10B1E00000000000000000010001000000100088C5 -:10B1F000008200A0004001081111A0110001000010 -:10B20000000100000000000000000000401000A04D -:10B210000400041000000000000000000000000016 -:10B2200000808980000821C02020800900110009C9 -:10B2300041080010008905834109200800410308E6 -:10B2400020214010000903021020004100000010DE -:10B2500000100005000000000000000000000000D9 -:10B260000000000000000003000200400002000097 -:10B270000000000000800091101183210041004077 -:10B2800020090321000000000000000000008000F1 -:10B29000118080000080000000000000000080009D -:10B2A0008000000000008002808000008000108983 -:10B2B00020008800100409090590040003032120E0 -:10B2C00021002000081041801100400002400000D1 -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F00000000080000000001100111100009020EB -:10B3000010001100090010400000000000000000C3 -:10B310008802A18010002000000000000000000052 -:10B320000400A0901002C000100004A040400200E1 -:10B33000038911020288400101A1001000400001B0 -:10B34000010900000100010001C00000010000012E -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000020020BB -:10B3700000000000000200A0000082200091048272 -:10B38000A100008800000000010100000000000092 -:10B390000000110108208804910000000000000056 -:10B3A0000000000000000000000000000000070096 -:10B3B0000000000000E000000000000000000000AD -:10B3C00000000000000000000000000000E000009D -:10B3D000600000000000000000000000000000000D +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A970000000000000000000000000008400200033 +:10A98000020220802080200021100000200004000E +:10A9900082002000200020002000880020002000ED +:10A9A00088040000400020001008840020002000DF +:10A9B00020000400200004044002000388008800F6 +:10A9C0002000408000002000C000C01004004000B3 +:10A9D000200088041000040088024000C00020000D +:10A9E000200084080100200084004004400020046E +:10A9F00008808484400020004000840040A0400083 +:10AA0000404000400020402041A004010000000020 +:10AA10002000000000000000099010040000040065 +:10AA2000009000024002000000002000040000002E +:10AA30000000400040000000000000850000009081 +:10AA400000900000A0020000400021002000090248 +:10AA5000200040C00500050021000001A100000009 +:10AA60000000000220C0200209002040100305025F +:10AA7000008380101011040000008000100000000E +:10AA800002000200000000000000002002000000A0 +:10AA900000000200000000000008000004000000A8 +:10AAA000000004002000000002000200000000007E +:10AAB0000000001000008300200200004108000098 +:10AAC00001000000050040020000000000400010EE +:10AAD000000002100000201000410000004108109A +:10AAE0000000000508000110008000040200A00022 +:10AAF000200008000080A04008000800000082023A +:10AB000000000408000000000482000000010408A6 +:10AB1000020805000008000000020000000000001C +:10AB2000000000080000008400080040004000040D +:10AB30000002020000080008400000110000C001EF +:10AB40000000100000024000800500080000020024 +:10AB50000004000000040008048802080408400003 +:10AB6000A08420000000800008C000040401000848 +:10AB700000000000800800102011098884084000AF +:10AB80000001000000030000002100080000040094 +:10AB9000000200000000100000080000000000009B +:10ABA0000000880090000000040020000000000069 +:10ABB0000000000000000000002100000000000074 +:10ABC000000000000000000000000008000300007A +:10ABD0009000402100000021004000000000000023 +:10ABE000000000040020A01000000000040000008D +:10ABF00000000040002100050009000400000040A2 +:10AC0000000284100000080000400800000000005E +:10AC1000830009011000000000000000000008008F +:10AC20000000000000000000000000000000000024 +:10AC3000000000000084000000000000000011007F +:10AC40000000000000004100000003004000000080 +:10AC500000000000400041A00008090000020800B8 +:10AC600040004100030003022100040002004000F4 +:10AC70002100030008000000000041080508000052 +:10AC8000009000210800000000000000000000000B +:10AC90000000100000800800000400000800000010 +:10ACA0000000000000000000000000000800080094 +:10ACB00008000000020084000400400200000000C0 +:10ACC0001040000008000000080000000000100014 +:10ACD00000008200100404000800C0008400080086 +:10ACE00040208240844000000900C000A00404000D +:10ACF000820410008200C000820420108210844070 +:10AD0000080082038288002100000000000000008B +:10AD100000002108000800200000000000001000D2 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000080000040007 +:10AD40000000030011000200000041004100030068 +:10AD500000000000100000000000000000000000E3 +:10AD600000000088100003000000880008000000B8 +:10AD700003000000000011A0000800000000000116 +:10AD8000000000A002000802000082008200820091 +:10AD90008208002000000000000000000000000009 +:10ADA00000000000000000000000000000000000A3 +:10ADB000000000000000000000000400000000008F +:10ADC00082008200080008004000000000004000EF +:10ADD000000200000000A0000800000000000000C9 +:10ADE0000000100801000000820000002000C000E8 +:10ADF0008200840000009000C0008802000004214E +:10AE000040000040000000030808040000000000AB +:10AE10000000000000010300000009000000000025 +:10AE2000000000040000000000000000000000001E +:10AE30000000000800020000000000020000008482 +:10AE40000000000008000800210080080000090040 +:10AE500000000000000000002020000803000000A7 +:10AE6000000000000000100040000000000440004E +:10AE700000080000000002000504100000000000AF +:10AE800000100800028400004000000811A000200B +:10AE90008200000008000000000000000000000028 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC00000004000000000080008900000000000A2 +:10AED0000000080000000000000000000000002149 +:10AEE0000000000000000000400008000800000012 +:10AEF000A10082000000000082000000C000840069 +:10AF00009008000000000000002100040000102054 +:10AF100000000000400000000000000000000000F1 +:10AF20000000000000002000000000000000000001 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000004000000000000000B1 +:10AF60000000000000000000000000900000000051 +:10AF70000000080000C000004000000805A000001C +:10AF80000000030000042000000021000004000075 +:10AF90000000000000000000000000000000400071 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000010001A000DF +:10AFD000000000000000A0000400000000000000CD +:10AFE0000000000000000000000000000000000061 +:10AFF0000800000088A000880090004000000000C9 +:10B0000000010001A0C0004002A040090002012090 +:10B0100040100008000000000000000000000500D3 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B04000000000000000000000000000004120108F +:10B050000020004000000000821080100009000065 +:10B0600000000000000000000000000000000000E0 +:10B070002000000000000080000000000000000927 +:10B080001102001000108085008200850010110060 +:10B09000210080800080000000000000000080008F +:10B0A00080800040008000000000000000000000E0 +:10B0B0000000000000000000000000000000000090 +:10B0C000000000000000000000000000000041003F +:10B0D0000200052008210000410003000303418015 +:10B0E0000000000000000000000000000000000060 +:10B0F00020001000040041000000001000000000CB +:10B10000030010000500111009004000821011001A +:10B110000800100041004000000000000000000096 +:10B12000020090C08201C004000000000000000086 +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B150000088000000010101000000020100000160 +:10B1600001A000000000000000000000000000003E +:10B1700000000100C1000900890000000401A09046 +:10B180000000008800000100000988902000A00055 +:10B1900000000002010000000000000000000000AC +:10B1A000000000010001400000010000000000005C +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D00000000001010089010000000000000100E2 +:10B1E000100000010000000000000000000000004E +:10B1F000000000000001000000000001400200A06B +:10B2000010021090000100010001000110210091C6 +:10B210000083051020000000A001000000000000D5 +:10B220000000000003110003800340200000000024 +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000802218521031100000041C8 +:10B2600008080203001000000000000000000000B9 +:10B270000000000000000008001000200808800006 +:10B2800000800000000000101010202100110010AC +:10B29000400310A191200020004180080000000020 +:10B2A00000000000000000400004008000000000DA +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000418203000300080300009A +:10B2E00010800410030010030000000000000000A4 +:10B2F0000000000000000000000800800080001036 +:10B3000080000000000000000380100010000341D6 +:10B310002188910220800340208002000900080853 +:10B3200000000000000000000000002000020000FB +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000141000000000100AA +:10B36000000000A00001010000000000000000003B +:10B370000000000000000000000000840082004087 +:10B380000001100004028804020000040100000013 +:10B39000000185020921A040C00000020000000059 +:10B3A0000001000000000000000000110000070084 +:10B3B000600000000000000000000000000000002D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D :10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000E06D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B420000000000000000000020255FF04000400BC -:10B43000DFDF00DF0C0F0C00000000000000000048 -:10B44000044504450000000000000000000000006A +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000E05C +:10B4100000000006000000E0000000000000000046 +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC :10B4500000000000000000000000000000000000EC :10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000F5F5E1F53C3C94 -:10B480000808FF53555500000000000000000000B0 -:10B4900000000000000028F57DF50F0F03030000F9 -:10B4A000000000000000FFC3DFC300000000000038 -:10B4B0000400DFDFDFDF0A0F0A00000000000000E9 -:10B4C00000000404454500000000000000000000EA +:10B4700000000000000000000000000000000000CC +:10B48000000000000000282828280F0F4FEF0000C0 +:10B490000000000000000000F03CF3E3F3F30000C4 +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C :10B4D000000000000000000000000000000000006C :10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000F5F5E1E1A0 -:10B500003C3C3838000055550000000000000000A9 -:10B51000000000000000000028A07DA0FFFFC3C3C2 -:10B520000000000000000000AA003C00BFFF3D7DBD -:10B5300000000F5504040454000000000000000443 -:10B5400000000000C3AAC0A000000000000000002E +:10B4F000000000000000000000000000000000004C +:10B500000000000000000000080828000F0F4FEFA7 +:10B5100000000000000000000000F03C00000000FF +:10B52000000000000000000000000000000000001B +:10B53000000000004D4D4D4D0000000000000000D7 +:10B5400000000000000000000000000000000000FB :10B5500000000000000000000000000000000000EB :10B5600000000000000000000000000000000000DB -:10B570000000000000005000F0F000000000C2FADF -:10B58000F0F0C350C3FFA200A2A200000000000020 -:10B59000000000000000000000005FBE0ABEC10005 -:10B5A000F5000000000000000000AA003C008382BB -:10B5B0000100C0C00F550000005000000000000056 -:10B5C000000000000000C3FFC0F000000000000009 +:10B5700000000000000000000000000000000000CB +:10B58000000000000000AA00FF55000045CF0005A4 +:10B5900000050000000000000000FF551E1EFB0B10 +:10B5A000FB0BCFC3CFC30000000000000000000071 +:10B5B000000000000000FF3CC3000000000000008D +:10B5C000000000000000000000000000000000007B :10B5D000000000000000000000000000000000006B :10B5E000000000000000000000000000000000005B -:10B5F00000000000000000005055F0F000000000C6 -:10B60000C2FAFFFFC350C3FFF300F3F300000000D2 -:10B610000000000000000000000000005F140A1499 -:10B62000C300FF0000000000000000000000000058 -:10B630000090000000612006000D00000060000680 -:10B64000000D000000610006001D00010061000601 -:10B65000000D000000000001000000000061000675 -:10B66000000D0000000000000000000000000000CD -:10B6700000000000000000610006000D0000000056 -:10B6800000000000000000610005000C00000061E7 -:10B690000006000D00000000000000000000006136 -:10B6A0000006000D00010000000000000000000086 -:10B6B00000000000000000000000BF008300F0F068 -:10B6C000CF004175417500C3000F00000000F0AFCE -:10B6D000F0A000C300C0BE14AFAF00FFF0F0000048 -:10B6E0000000FF550F0500000000000000000000F2 -:10B6F0000000000000000000000000000003FCFF4C -:10B7000000000000000000003C553C00AFAF00F01E -:10B710000000507DF330F330000000000000000016 -:10B720000000000400000000000000000000000015 -:10B73000000000000000000000000000BC008000CD -:10B74000000000005555415500C300554D0CCF8EEB -:10B7500030AF30A00082003CBE1405053C3CAAAAD4 -:10B7600000000000FF550F05000000000000000071 -:10B7700000000000000000000000000000000003C6 -:10B78000FCFF00000000000000003C553C00A3A3AB -:10B7900000F0FFFF507DF3B2F3B2000000000000A4 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000FFFF3F30FFC355550000AAAA050542 -:10B7D0003C3C0F550F55FFFA3CFAEBEBAF055555C6 -:10B7E000F0F0000000000000000000000000000079 -:10B7F0000000000000000000000000000000000049 +:10B5F000000000000000000000000000000000004B +:10B600000000000000000000F0F0F0F045CF45CF52 +:10B610000A0F0A0F0000000000000000AA001E1E12 +:10B62000F303F303C3C3FFC30000000000000000E6 +:10B630000000000005610A2E050D00A000000000BA +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B660000000000000610006000D00000000006105 +:10B670000006000D000000000000000000000000B7 +:10B6800000000000000000610006000D0000000046 +:10B6900000000000000000610000000900000061DF +:10B6A00050040009000000610006000D00000000C9 +:10B6B00000000000000000000000003CFF3C000013 +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000FC0CF5007DFF4DCF0000C5 +:10B6F000A0F5E1E1FAFFCACF000000000000000061 +:10B70000000000000000000000000000008B0000AE +:10B710000000000000000000FFFFF8F0C0FFC3FFC2 +:10B72000FFFFB010E8FF00FFB200FF0020E020E0C4 +:10B73000000000000000000000000000AAF0AAF0D5 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B760000000000000000000FC0CFF0A3CFF0CCFB2 +:10B770000000A0F5E1E1F0F5C0C500000000000008 +:10B780000000000000000000000000000000008831 +:10B7900000000000000000000000FFFF280000FF84 +:10B7A00003FFFFFFB010E8FF00FFB200FF00FFFF44 +:10B7B000FFFF00000000000000000000000000008B +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 +:10B7E000000000000000000000000F0FFF002C0010 +:10B7F00004000000828E828E8787550000000000C2 :10B800000000000000000000000000000000000038 -:10B81000A0A00000024302430F0503010000000046 -:10B820000000000000100000000000000000000008 -:10B83000000000000000000000000000AAAA3C0F69 -:10B8400000000000F0F03F300C00000008A808A83D -:10B850000505FF003CFF3C00000000004141AF0532 -:10B8600000FF3C3C00000000000000000000000061 -:10B8700000000000000000000000000000000000C8 +:10B81000F0FAF8F80000000000000000053D053DCA +:10B82000000005AF3F003500000000FA00000000F6 +:10B8300000100414000000000000000000000000E0 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B860000000000000000000000000003C3C5555B6 +:10B870002C3C043C0000BE8EBE8E8787FFAA0000D1 :10B8800000000000000000000000000000000000B8 -:10B890008000A0A0002882C30041FF55C3410000E2 -:10B8A0000000000000000010000000000000000088 -:10B8B00000000000000000000000000082042000E2 -:10B8C0000408001000001000040000000400C0057F -:10B8D00089110000001188000041000002052008C5 -:10B8E00000050011A00204002009000020008400CF -:10B8F00020000000000000010000000000082000FF -:10B900008800000004000003000020004004200420 -:10B9100004002002000040000000000304000000BA -:10B9200000080000020000080005000002000008F6 -:10B9300020058400000088000000000200002100B3 -:10B94000000209000002400240900002000010C006 -:10B95000409002000040000041C000400000000292 -:10B960000000088421901001200041880008004058 -:10B9700041000000009000000000000000000004F2 -:10B9800000001008080200024002000200842102A8 -:10B9900000000008000800A08904008200040000E4 -:10B9A00000020002000010080000009000004000AB -:10B9B00000000000000400000090040000050000EA -:10B9C0000800000008004009400041000200020099 -:10B9D0000810400002400810088002000000000922 -:10B9E00008004000A100400000840000080008009A -:10B9F0000800000002000200080000000000000033 -:10BA00000209000000000000001008000000000013 -:10BA100000100200080004100200020000000200F2 -:10BA20008400000200000000100000000000200060 -:10BA3000000010000000080002000200008400085E -:10BA400004041100098800008000800088000000C4 -:10BA50000008800080908001008541200000008265 -:10BA600000008000800240908008000200080088EA -:10BA70000008000000000000000021040000001089 -:10BA80000000040000080008000000020000001090 -:10BA9000008800080000009000080000000404086E -:10BAA0000084008200080090000000000000009068 -:10BAB00000040008028400020002000000000002EE -:10BAC0000400000500000008000500050008080942 -:10BAD00020889000902100029021000404000000C2 -:10BAE000100300091021C0A100020003C000C02102 -:10BAF000882100080005000800080000002100005F -:10BB000000080008000000004000022100000810AA -:10BB10000000200020004000000040040200C0009F -:10BB2000000000219000900020002000880090007C -:10BB30000000840800000000000000000000000079 -:10BB4000030000A0090003A0030841080010000042 -:10BB50008882001000000800000000A000A000087B -:10BB60000020008403C00004000808A1001010A0F9 -:10BB70000000000000000384000000A000C00000DE -:10BB80000000000000000000030000000000400072 -:10BB90000000080008080008100808C0050041005F -:10BBA000042000200008008200880302001000002A -:10BBB0000000000800000020000000A000A000021B -:10BBC0000000A0000000A00000C000000800080065 -:10BBD0000000C0200000A0000000000000090802D2 -:10BBE000C140000400000010080000000000000335 -:10BBF0000100000000410000C0000800000000003B -:10BC00000009000000110004000000000000840092 -:10BC100020000800000000000009000908000000E2 -:10BC20000000000000000004000008000000000008 -:10BC30000804A000000000000800820000000000CE -:10BC4000820004000000400000000002000000A08C -:10BC5000000000000082000000C00000000010A0F2 -:10BC600000890401000010001000100000A0000472 -:10BC7000000808000000000040080000000000006C -:10BC800000000000000008900020000000100000EC -:10BC9000000000C0000000000000000000000000E4 -:10BCA0000000040000000000000020000000000070 -:10BCB0000004000000000000002000000008000058 -:10BCC0000000000000000002820088000000000068 -:10BCD000A00004008200C000C0000003400000007B -:10BCE00000040420042004410409C021A003904062 -:10BCF00004000041004000000008000000000000B7 -:10BD00000000000000000000000000000000000033 -:10BD10000800000000000000020000000000C00059 -:10BD20000000000000000000000000000000000013 -:10BD300000040020000000000000000000000000DF -:10BD40000000080000000000000009000090000052 -:10BD5000000803A00008054005081108080000A01D -:10BD60000200212000A0040040A0000400024008BE -:10BD70000000400010000000020000000000000071 -:10BD800000000004000000000000000000000000AF -:10BD9000000040000000002000000008000000102B -:10BDA0000020210840080304004000000082040035 -:10BDB000020008C00000000020100020084000849D -:10BDC00008200000000000001100000040000005F5 -:10BDD00000004021002110210000820040210008C5 -:10BDE000000000000021820084000008C0038809D0 -:10BDF000400000000002000000000000004100417F -:10BE00000005000000000000000800000000000025 -:10BE1000000000000000000000000000080000001A -:10BE20000000000000000000000000000000000012 -:10BE300000000400000000000000000000000000FE -:10BE400000000000000000000010000000004002A0 -:10BE5000000008900000000000000000000000004A -:10BE60000000000000040000000420000082000028 -:10BE700000000000000800010000100000000000A9 -:10BE80000002000000000000001020000000000080 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000020000000000000090 -:10BEB000000000000000000000000400400000003E -:10BEC000000000000000000000000000080000006A -:10BED000010090000000000004009000000000013C -:10BEE000000000000001028840080088820800006D -:10BEF00000000000000002000101820010000000AC -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000001000800000008 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF5000000002000000000000008500000000005A -:10BF600000100009000300080805808200108010FE -:10BF7000000000000000000080022121050980402F -:10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA000000000000000000000000000040000008D -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000003000800020054 -:10BFE0000300000080100000000089000590828896 -:10BFF000A000000080000000800041008300854018 -:10C00000C1A00000000000000000000000000000CF -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000100DF -:10C0600000000100900008014082020002008811D7 -:10C070001002C090400008000200040008100800F0 -:10C08000A10009A100000000000000000000000065 -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D000000000000000000000000000000100005F -:10C0E0000000000100010000000001000000081035 -:10C0F0000188001089880000000000000000004155 -:10C10000010283080003000000000000000000009E -:10C11000000000000000000000000000000000001F +:10B89000000000AA28280000000000000000FFFFB0 +:10B8A000053D0000052D3000300000C300C300003E +:10B8B000000000000000880320002003C184400035 +:10B8C0002000880010000000000020002000000878 +:10B8D000000020002000200004008800200040001C +:10B8E000000310004002000000002000200004803F +:10B8F00000002000208000012000840000008888D3 +:10B90000200084008800200040004000200020002B +:10B9100002004100200021008800A1004000C089F1 +:10B92000840020002000840088822080200088007D +:10B9300020002000201120840000A0000000202012 +:10B9400000000020404000200020000040000000D7 +:10B95000090100000000000040000000200000007D +:10B96000C00200408002800140004000002004002E +:10B970000002410000A01002000041004000000051 +:10B980000002000000000040004080000400210090 +:10B99000000090000800400408400840400000906B +:10B9A00000022100400040040002200209100000B3 +:10B9B00000020000000200001010400840801080CB +:10B9C0000980000000000800000000000200820062 +:10B9D0000800000000004000000000000000080017 +:10B9E000000040000000040040000200820002004D +:10B9F00000001000C1000900001000000400010058 +:10BA0000000004000000000000000410040000001A +:10BA100000000800001100000000080000000800FD +:10BA2000000008090000400040000005001004006C +:10BA30000200080482000800040000008009800859 +:10BA40008002200241000008000000000000858202 +:10BA500009048000200800008300000040082082C4 +:10BA6000000000008002008400028000000000004E +:10BA7000040000008082100010000000000000841C +:10BA8000100000000500000000000400000000108D +:10BA90000000000000082008000000000000000076 +:10BAA0008000000089080002850080000308000073 +:10BAB00000000000800800020400000000909008D0 +:10BAC0000041004110410008000000080000000093 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF00000000000000000080009401100000000E4 +:10BB00004000000088000000000090000000900845 +:10BB1000004100000000000000004000A0000008FC +:10BB200000200204000084008880000000008402DD +:10BB30001003A00884020004820084008400000531 +:10BB400000010000410080820000000000000000B1 +:10BB500000400000000000000000000000000000A5 +:10BB600000000000000000000800000000000020AD +:10BB700000082100410000080000000080000000D3 +:10BB80000000000000002100090000080082088871 +:10BB900002A00004050040000000050000000000B5 +:10BBA0004002040040040300102021080500042086 +:10BBB00008024182412000021104000400040082B6 +:10BBC00000A00000000420040140A00000000000CC +:10BBD000820000000000C040000082000000004021 +:10BBE0008200000000000040A00083400000080028 +:10BBF0000908000000000000100000000000C00064 +:10BC000040000000000008000000A000400000000C +:10BC100040008200C000C000C0008400820000110B +:10BC200082000000A0050800A0004002080884006F +:10BC3000C00000000441000900000800400084002A +:10BC4000841000100000000180852000000000002A +:10BC50000004000000000040008800000000000018 +:10BC60000000000000000000000000824000000012 +:10BC70000000400100000000000000000300000080 +:10BC80000000000000000000000040000000000074 +:10BC9000000000000000000040A0000000000500BF +:10BCA00000000000002000000300110080010305D7 +:10BCB0000084030010104100050000000200840011 +:10BCC0001000039020080002200000040000000083 +:10BCD000000000200800000000000000000000003C +:10BCE0000000000000000000000000000000000054 +:10BCF000000000048200A00000000000820000009C +:10BD00000000000000000000000200000000000031 +:10BD10000000102010000800202140004000040016 +:10BD20000200C000820000000004020805000400B8 +:10BD300008A00402A0000004000084040020040005 +:10BD4000100300000008000800008000000100004F +:10BD500000000000080000000000000000000000DB +:10BD600000000000000000000000002000000400AF +:10BD700000000000000100000002000000000000C0 +:10BD800010900004000000A00000000004000882E1 +:10BD90000800000000000002000000000300000096 +:10BDA000000011100004000000A04090058208C0AF +:10BDB00008200802100240000800050000004000B2 +:10BDC0004140404010000000000420000008000531 +:10BDD0000000000000000010000000000000000053 +:10BDE0000000000000000000400000000000000013 +:10BDF00000008300080000000000000000001000A8 +:10BE0000000000000000820010000000002100007F +:10BE10000000000000000000000000000000000022 +:10BE200084000000100000000200820009000000F1 +:10BE300008000000000810110000000000080021A8 +:10BE40000041000000000000C00820008000000049 +:10BE500000000000000000000000000000000000E2 +:10BE60000000204000000000000000000000000072 +:10BE70000000000040000000000000000000000082 +:10BE800000000000000000000000000000000000B2 +:10BE9000000000000000400400000002000000005C +:10BEA000000000200004000000000000000002006C +:10BEB0000082C0C0110020000000209000824100DC +:10BEC00000040304048200000300000000040101D8 +:10BED0000000010000010000000000000000000060 +:10BEE0000000000000000000000000000000000052 +:10BEF000000000000000000121000200000100001D +:10BF0000000000000000000101011000000000001E +:10BF100000000000A0000000000000000000000081 +:10BF2000000000000000000002A00010001002103D +:10BF300009020120A0A0021101000001400100013E +:10BF400008A0008900C1A003900000010000880142 +:10BF5000114121081104000500000000000000004C +:10BF600000000000000000000000000000000000D1 +:10BF70000000000000000000004108040010002143 +:10BF8000000000000000000000410808800500409B +:10BF90000000000010000000000000000000000091 +:10BFA00000000041000800080040A0800000008060 +:10BFB0008080A1030891008880100208031080048B +:10BFC0000008009100200002001000030003002080 +:10BFD0000010118300000405411000000000000063 +:10BFE0000000000000000000800040001000080079 +:10BFF000410000000000000000000880210008004F +:10C000000883000000000000000009002000080074 +:10C0100041000000000000000000000000000000DF +:10C02000000000000000000000100000000080215F +:10C030000000000020008303A011852109000800F2 +:10C0400010004121800080038000000000000000FB +:10C0500080000080001000000100012000000000AE +:10C0600000000000880020008400C00000000000E4 +:10C0700001000100000000000000000001100100AC +:10C08000000001A10000000000000000000000000E +:10C09000010001000000000000000000000000009E +:10C0A0000000000000000000000000000000100080 +:10C0B00002000890080000904001A1201005000037 +:10C0C00001000100010102000201A0000084200023 +:10C0D0000000A000A00800012000000101010000F4 +:10C0E0000000000000000000000000000000000050 +:10C0F00000008400000000000000000000000000BC +:10C10000010100000001000000000000000000002C +:10C11000000000000001000000000000100100010C :10C12000000000000000000000000000000000000F -:10C1300000010000000000000000000000000000FE -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000009000900100003BA -:10C1600000030002000800100000040003000000AB -:10C170000000028003802180000000000000000019 -:10C1800000901085C1110088000000000000000030 -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000200004004100000000000000001A -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000002000003F -:10C1E000000000800000000000118000000200003C -:10C1F000008000008003008000110000000000802B -:10C2000000000880100820802005000000000000C9 -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000004000000000000000000000BE -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C260000000000000020000000000000400108335 -:10C270001020901088208491880808000000001089 -:10C280000004000001C001020002000000000000E4 -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F00000000000000000410000070000000000F6 -:10C30000000000000000000000E0000060060000E7 +:10C13000080800100010A0A00010002100C1820219 +:10C140000001000004000001C01000200004844031 +:10C150000010009000840020001004000904024137 +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C180000010030320081008000000000000000059 +:10C1900000091103410300410000000200410010AA +:10C1A000004100000000000000000000020041000B +:10C1B00000000000008000008080000509020021CE +:10C1C000842000092120880900048000108041009B +:10C1D00000000000200008000000411021040900B8 +:10C1E000110300000000000000000000000000003B +:10C1F00000000080000000000002000000000000BD +:10C20000000041001000100010410000000000007C +:10C210000000000900110000000300000000000001 +:10C2200000000000000000000000000000100000FE +:10C230000000000080100080008000004021A1115B +:10C240001000A0404109090011000303000800800C +:10C25000000000000040000000800000010000011C +:10C260000000000000000000000000000000008846 +:10C2700000880000004000000000000100000000F5 +:10C2800000000000010201000100010100000000A7 +:10C290000000000000080000000000010000000095 +:10C2A000000000000000000000000000000000018D +:10C2B0000000000000000201080200408800208900 +:10C2C0008202A102030000010000000000009001B2 +:10C2D0004010200202000000009000400000000A10 +:10C2E00000E0070000000000000000000000000067 +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000E00000004100000C :10C31000000000000000000000000000000000001D :10C32000000000000000000000000000000000000D :10C3300000000000000000000000000000000000FD :10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD +:10C35000000000000000420000000000000000009B :10C3600000000000000000000000000000000000CD -:10C37000FF00DFC700000000F6F63F30F090F0004D +:10C3700000000000000000000000000000000000BD :10C3800000000000000000000000000000000000AD :10C39000000000000000000000000000000000009D :10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F0000000FF001C040000000006063F30F08033 -:10C40000F000000000000000000000000000000834 +:10C3B0000000000000000000000000FF0066000018 +:10C3C000FEFF838300836000303000000000000027 +:10C3D000000000C33CFF189910900000000080C0CE +:10C3E00090F00000000000000000000000000000CD +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C :10C41000000000000000000000000000000000001C :10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC +:10C4300000000000000000000000000000FF003CC1 +:10C44000FEFFFEFF9F9F009FF0F0F0F00000000055 +:10C45000000000000C0C0C0C3CFF30F00000000051 +:10C4600081C399FF000000000000000000000000F0 :10C4700000000000000000000000000000000000BC :10C4800000000000000000000000000000000000AC :10C49000000000000000000000000000000000009C @@ -105575,404 +105575,404 @@ :10C4C000000000000000000000000000000000006C :10C4D000000000000000000000000000000000005C :10C4E000000000000000000000000000000000004C -:10C4F0000000000000000000000083C380C0606FE7 -:10C500003F3F9F9F667E000000007F70000000009C -:10C510000000FFFDFFFF0000000000000000000021 +:10C4F0000000000000000000000000F60CFC00003E +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B :10C52000000000000000000000000000000000000B :10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C570000000000000000000000000000343004035 -:10C58000606F30309F9F6666000000004F400000E3 -:10C5900000000000FFFFFFFF00000000000000009F +:10C54000DBDBDBD009060906FF0DFF049999999FF3 +:10C550000000000000000000EFFFE0F0FF07FF0711 +:10C5600000000000FF24FF24000000000000000085 +:10C5700000000000000000000000000009FF0CFCAB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B :10C5A000000000000000000000000000000000008B :10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E0000000000000000000000000610006000DD7 -:10C5F000000000610006000D000000610006000D53 -:10C6000000000061303E000D00A8000000000000A6 -:10C61000000000600007000D0000000000000000A6 -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C640000000000000610006000D00000000000076 -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C67000AAFAAFFF0000000000C003C300000000E2 +:10C5C0000000DBDBD0D008070906FF0DFF0499F956 +:10C5D00099FF0000000000000000CFDFC0D0FF0482 +:10C5E000FF04000000000000FFFF0061002E000DAE +:10C5F00000A000000000000000000000000000009B +:10C60000000500610006000D0000000000000000B1 +:10C6100000000061000600050000000000000000AE +:10C62000000000610006000D00000000006100062F +:10C63000000D000000000000000000000061000686 +:10C64000000D000000000000001000000061000666 +:10C65000001D000000610006000D000000610006E2 +:10C66000000D000000610006000D00005D5D5D0C26 +:10C67000003C00FF0000000000000000000000007F :10C6800000000000000000000000000000000000AA -:10C6900000000000A000A080555555550000000086 -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A -:10C6C00000000000000000000000C303C3030000DE -:10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A -:10C6F0000000AEFEAEFE0000000002C202C200005A +:10C69000000000007D7D3F030000C200000000009C +:10C6A0000000000000000000A0FFA0BC000000008F +:10C6B0000000A0FF28FF00000000000000000000B4 +:10C6C000000000000000000000000000000000006A +:10C6D000FF1050FFC3C33F0300005040554100000E +:10C6E00000000000000000000000000000000C0C32 +:10C6F0005D0C003C00000000000000000000000095 :10C700000000000000000000000000000000000029 -:10C710000000000000000000000054145555000007 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000043434343DD -:10C7500000000000000000000000000000000000D9 +:10C7100000000000000041413F0301004100000013 +:10C7200000000000000000000000A0A0A0BC00006D +:10C7300000000000A0A02828000000000000000069 +:10C7400000000000000000000000000000000000E9 +:10C750000000FF5050FFFFFFFFFFFFFFF0C0FFC3CF :10C7600000000000000000000000000000000000C9 -:10C77000000000000000000000000000FFFFFFFFBD -:10C780000000AA0F0000000082AA8200FA3C00000C -:10C790000000000000000000FFFFFFFF000000009D -:10C7A0000000000000000000000000000000000089 +:10C77000FF0CFF1400AA003C0000000000000000B5 +:10C78000000000000000000000000000BABAAABECD +:10C790000000000000000000555543027C7CFF7C37 +:10C7A00000000000000000001F1F1F14A0FFBCBC01 :10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000AAF09F -:10C800003CF00000AA3C00000000820A820A0A3CB8 -:10C8100000000000000000000000F0D7F014C05538 -:10C82000FF00000000000000000000000000000009 -:10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C87000000000000000202000000000C0090000AF -:10C88000000004000000000000400005A1000105B8 -:10C89000010082200000A0080000000000009000BD -:10C8A000A00000050000000000050010200020008E -:10C8B000000420000003000000000004000000004D -:10C8C0001010000000000008000000028811200481 -:10C8D0002000000500000005000300080010010012 -:10C8E00021024084008000830210000400842000A4 -:10C8F0002005000000040084000100000000000288 -:10C900000002009011000002000200022100080055 -:10C9100008400890090100C0050000A0050041C0C2 -:10C92000408241C000840090400040004040A00888 -:10C93000C1024000000000000000000000080000EC -:10C940000500402000000004000000000003000279 -:10C9500000020000000000020002000400041001B8 -:10C9600020841003000200040010000400020002F2 -:10C970000002000000020000000000004000000073 -:10C98000020002000010400082000000020040008F -:10C99000820002000000021002000000000002906D -:10C9A00000000002820004050200000000000000F8 -:10C9B0002000000010000210000000000000000035 -:10C9C00002000040000000000200000040004000A3 -:10C9D0000200000000000000200002000800080023 -:10C9E0001000000000000080000000000241000074 -:10C9F00000000400040002000000000800008000A5 -:10CA00000000000080000000808200000040000064 -:10CA100080000000000000000400008400100000FE -:10CA2000004000840010048400080000040000009E -:10CA300000008400040084000000000000000008E2 -:10CA40000010041000000008000800080000800822 -:10CA500080000000000802000200040800008008B6 -:10CA600000820200000000100002044000100008D4 -:10CA70000000000000080084008400840002000020 -:10CA80000000000800100040A000A0001021880055 -:10CA9000400088001100020000210000C003C021F6 -:10CAA00088008802882120081008000090110040AA -:10CAB0000200C00000088800881010080000020072 -:10CAC000000000080000000000000000000000005E -:10CAD000040010004000200082002000900002218D -:10CAE0000000000082032020898010210000042122 -:10CAF0002000000900050421002140400000000042 -:10CB000000000082418204080000000811000400B7 -:10CB10000300000041000288A1A00482000000A0E0 -:10CB2000008200080400400009020082008409001D -:10CB300000000000000000000000000000000000F5 -:10CB400000000800000000000000000000000000DD -:10CB5000000005000000808200A000080000000026 -:10CB6000000000000000000000841008808400C065 -:10CB700000A0000000820000000000000000000093 -:10CB8000A011400800040040000400040041840497 -:10CB900084400000000084000820000500400011CF -:10CBA0000000000400100004000400400010000019 -:10CBB000000000000000000000080104010400045F -:10CBC0000000000000000040C00000040800000059 -:10CBD0000000A0008440004084000009000000081C -:10CBE0000040000000400040000000080000000578 -:10CBF000000000000021000008002000000090005C -:10CC000000000900000000002100000000000000FA -:10CC10000000000000000000000000000000000014 -:10CC200000000000000000000000000021000000E3 -:10CC300000000000000000000084000110012089B5 -:10CC400000000000000000000000000000000000E4 -:10CC500000000010000000000000000000000000C4 -:10CC600000002000000000000000000000010000A3 -:10CC700000000000000000000000000000000000B4 -:10CC8000000000008200400800000000C000001109 -:10CC90000009084090000800C000080000000400DF -:10CCA0004020000000000008000082000802000090 -:10CCB00000000011000000080000C0100400000087 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000351 -:10CCE00000000008000300000000001040080000E1 -:10CCF00001000002000000210021000000000000EF -:10CD00000020000000000200400040000000000081 -:10CD1000050803000008038400A000C041900988B2 -:10CD200021A009001088000200000004000803048C -:10CD300004200000080004000000000000000000C3 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 -:10CD6000000000000000000000A000000088800219 -:10CD70000000400000000040000000000000000033 -:10CD800000000000000000209000000008000400E7 -:10CD9000A00000000000000084001041000000001E -:10CDA0000021000001008200000008410000008016 -:10CDB00000030000000000000000000000218802C5 -:10CDC0000100000000000088000000000004004195 -:10CDD0000000400000000000000000000000000013 -:10CDE00000000000000800080000000000004000F3 -:10CDF00000000000002100030008000800000008F7 -:10CE0000000000400040000000080000000000009A -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000800000000C0000000003A -:10CE300000400000000000000000000000000000B2 -:10CE40000000200000004000040500000000000079 -:10CE500000000000000000000000000000000000D2 -:10CE60002000000000000000200000000000000082 -:10CE70000000200000200000000000000000000072 -:10CE800000000000000000000000000000A00004FE -:10CE90000004000000000000840000000000010009 -:10CEA00010000000084000C000A0C09040C0022058 -:10CEB0000020829040200082000882900000000044 -:10CEC00000000000000100008200000100000000DE -:10CED0000000000000000000000000000000000151 -:10CEE00000002000000000000000000000001040D2 -:10CEF0000040089008400001A10105010001000068 -:10CF000001000000000000000000000000000080A0 -:10CF1000008000800000030021008000000000006D -:10CF20000800000000001180000000000080048064 -:10CF300000800000800080000000008000000000F1 -:10CF40000000000000000041040908090010000072 -:10CF500000000000000000000000000000000000D1 -:10CF6000000809100011000200000000000000008D -:10CF7000000009008000800000418320A00200031F -:10CF80000000100000000000000000000000000091 -:10CF900010000800048040008000000000008000B5 -:10CFA0000000000000000000000080098021808057 -:10CFB0008000000000000080000000880010008059 -:10CFC00000000000000000002000100008004105E3 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000418010000908082100000000000036 -:10CFF00000008000000000000000090041008311D3 -:10D0000041000000000000000000000000000000DF -:10D010000000000000000002010002008200880001 -:10D020000240000000000000000020002000A0A13D -:10D03000C00208001000900004C0100002C108A047 -:10D0400020C000000000000000000090010001006E -:10D0500001000000000000000000000000000000CF -:10D0600000000000000400000001010100000000B9 -:10D07000000000008800100004000200100890006A -:10D08000080011840000000000880000000000007B -:10D0900000000000C00000000000C0000000000010 -:10D0A000000001000000000000000000C00200209D -:10D0B000001091C000020020C0880482911000205E -:10D0C000C08282020000000000000000000000009A -:10D0D00083010001000000000000000000000000CB -:10D0E000000000000000000000000101010100003C -:10D0F000000000000000408900091089A002000023 -:10D10000000000010001000000000000000000001D -:10D11000000000000000000000000000800000058A -:10D1200000090002081000050004000300038080CD -:10D13000000000002180000000008000808041008D -:10D1400000008000800000000000000000000004DB -:10D150000320020800410000000000000000000061 -:10D16000000000000000000000020921052108085D -:10D1700000000000000000008010008800089011EE -:10D180000010040402210041000900090000001001 -:10D1900000000000000000008000004080008003CC -:10D1A000000000800080000000000000000000007F -:10D1B00080108005000000000008000200800000D0 -:10D1C000000080400000000000000000000000009F -:10D1D000418010001000044000000000000000002A -:10D1E0000000000000000000000020A1100020004E -:10D1F0000802000000000000000000020080008023 -:10D2000000000200110000002110000000000000DA -:10D21000000000000000000000001002900002006A -:10D22000040100000008008400000000000000006D -:10D2300000000401828884888800000000C100404A -:10D240000000900002211004900000000000000087 -:10D25000000001400100000000010000000000008B -:10D2600000000000000000000000000000110100AC -:10D27000000000000000000000000000000000822C -:10D2800000400000002000020088010088008400A7 -:10D29000840000000000000000000000000000000A -:10D2A0000700000A0000000000000000000000006D -:10D2B0000000000000810000070060000000000086 -:10D2C0000000004200000000000048420000000092 +:10C7C0000000F5FAFFFF000000000000000000007C +:10C7D00000005300000000CF00CF00E000EBB4B435 +:10C7E0003CF0FFEBEBEB00000000FF10FF0000004F +:10C7F00000000C0C141400AA003C00000000000013 +:10C8000000000000000000000000000000003030C8 +:10C81000003C000000000000000000000303505036 +:10C82000FF50000000000000000014141F14A0A01E +:10C83000A0A00000000000000000000000000000B8 +:10C8400000000000F5DAFFDF00000000000000003B +:10C85000000000005300000000C500C0E0E0EBEB6A +:10C86000B4B43CF0F0F0F0F0000000001010000054 +:10C870000000000020004000200004000000000034 +:10C880004000C0002000040020042000000001003F +:10C89000C0000400200020002000200000008800CC +:10C8A00088800084000020008800200440000000F0 +:10C8B000C00020040003840041002000200040004C +:10C8C0008800100404004000200020000008200020 +:10C8D0008800208021042000400800882088200053 +:10C8E00084002080208020002100201184C141008C +:10C8F0008900C080200840000000400020000000A7 +:10C9000000000000000000000000000000004100E6 +:10C91000400000000002000000000008100040C0BD +:10C92000400000024002000000020002400200003D +:10C930002100210000010000000040001000210043 +:10C9400000002000210000000000000000020000A4 +:10C9500000C0400040024001400080000002004151 +:10C9600040000000041009100400080040000010FE +:10C970000200020020020000041000000000C000BD +:10C980000800100089020002000002400000400080 +:10C990000000000000040000040004000200000485 +:10C9A0000000001000020210000000000000020061 +:10C9B000008082800000101000000004040000804D +:10C9C00040100000004000000000040000000400CF +:10C9D0009000000200008208400000009140080220 +:10C9E000080804001008000008000000A105100954 +:10C9F000000000000010081000400001000000844A +:10CA000020828400801002000209000880080000D3 +:10CA1000800000080084000000880004000000106E +:10CA200000080008000800010084000200840000E3 +:10CA300000080004000400100008000000080000C6 +:10CA40000002C00400080084000009100004000077 +:10CA500009000010030100100001C0080008400098 +:10CA6000C08300010040000005000004008440C0B5 +:10CA70000000000400820401800000100000000596 +:10CA8000000000000000000800400000000000005E +:10CA900000210008100000000008880000000000CD +:10CAA00000084021000000210000000000080000F4 +:10CAB000000000100000000400040021000000003D +:10CAC00084108408040000210040C0108540000844 +:10CAD0000005002100000008A0408800040090002C +:10CAE0000000004000088821000504000200000347 +:10CAF00008088808C00090840200000000030400B9 +:10CB00000000000000840008050000A000000000F4 +:10CB10000000000000000000000800000000008489 +:10CB2000040003000000000000900000000000046A +:10CB30004184000000900904000000000000000093 +:10CB40000020000000000000001002001110400052 +:10CB50004000000000040004030021200500090437 +:10CB60000002210000844040042011000540200004 +:10CB7000110085A0030005040340C02041200300EC +:10CB8000000000000000004000200000004182087A +:10CB900000110008C0000000C00008000808820062 +:10CBA00000050000C0000040004000000002080036 +:10CBB00040001000080400000000C0000800C02170 +:10CBC000000000008400400000000400A0004002BB +:10CBD0001000000000000000080000100004002009 +:10CBE0008500004140058440040208400805840097 +:10CBF000040900000800000400048411000410046B +:10CC0000100200000000000000000000000000A072 +:10CC10000002000000010000000000000000000011 +:10CC200008000008000000000000000000000001F3 +:10CC300000080000000000000000210000A000002B +:10CC40000000000000000000800000000000000064 +:10CC5000008200000000000000000000000500004D +:10CC6000030020000000800000A000018041008837 +:10CC7000210000000004800000100008089000005F +:10CC80000004000400000000004100080000000053 +:10CC90000000080000000800001100000000000073 +:10CCA0000000040000000000000000000000000080 +:10CCB0000800040008000000C000000000000000A0 +:10CCC00000008200000000210000C00010000002EF +:10CCD0000441000000008440821040004021900088 +:10CCE00000000002000020000800840910008400F9 +:10CCF000020210008400400008004140841002003D +:10CD0000000000000411000000000000110000906D +:10CD100000000000000000000000009000840000FF +:10CD200000000008000000040000000000000040B7 +:10CD3000110009A000900000000000002100050083 +:10CD4000000040A0000000000000030010000000F0 +:10CD50000000008200000040409000000000000041 +:10CD60000288410000000000400000A00504090006 +:10CD700005A00908000004002000809008A0002001 +:10CD8000C0042100030005000008C0000088002145 +:10CD9000000000410000000300000800000000A1A6 +:10CDA000002000000000000800210000000000003A +:10CDB000000800000000900040000000002140003A +:10CDC000000000080000000000000800080000212A +:10CDD0000000000000100800000800118208A000F8 +:10CDE00088000000A021000000004000A000080012 +:10CDF00082410011044000081011000009100000D9 +:10CE000084204000080008000200000002000040EA +:10CE100000081000000000000000000020000000DA +:10CE200000100000000000000000000000000000F2 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000010000001000000000C1 +:10CE600000000000000000000000000000001100B1 +:10CE700020000000200000000500000000008841A4 +:10CE80000000000000400000000000000000000062 +:10CE90000000000000000100000000000000010090 +:10CEA00084000000000000000000000000000000FE +:10CEB000000000000000000008000000000000006A +:10CEC000000000000101010100000000000000015D +:10CED00000000200000008A00120108210A0000045 +:10CEE000000000000000000101000400000100C07B +:10CEF0000904850808840204004000A008A040C17D +:10CF0000091020832005839000049088840200008B +:10CF10000000000000000000080000000000000009 +:10CF20001000800000000000000000000000000071 +:10CF30000000000000000000000080000000000071 +:10CF40000000000000001121030300090020000080 +:10CF500000102010000000118080080080000000F8 +:10CF600000000000000000001141032088030021A0 +:10CF70000080218009808080808000800080800087 +:10CF80008084208300A00021090020800080008090 +:10CF9000000000020000000000000005000000008A +:10CFA0008000800000088000008000000000001069 +:10CFB00000000000000000004000000020004000D1 +:10CFC000000000000000000010800821200908A0D7 +:10CFD000000002800900200010088000804100212C +:10CFE0000000000000000000000003802121100468 +:10CFF0002108A080A00303080903800000030008A3 +:10D0000000008200840008020440030003108580B1 +:10D010009080000000010010000000000000008867 +:10D020000000080040008800C090000800000000D8 +:10D0300000010000000000000000000000000000EF +:10D04000000000000000000000000140010000118D +:10D050000104000000C0000000000100880008007A +:10D0600020C120000000000000000000004001007E +:10D070000001019110400901899001C08800100051 +:10D0800088909000108205009100A00000009000A0 +:10D09000094009A00000000000000000000100009D +:10D0A000000000010001000000010001000000007C +:10D0B0000000000000000000000000000000000070 +:10D0C000000100010000000000000000000001005D +:10D0D0000901010100000000000000010000021031 +:10D0E00000404010C0C0000000000000000000012F +:10D0F000010000000000908800A010C0A0A1401016 +:10D10000000220820204209000410511A103A0200A +:10D110000088000101C000000000000000000010B5 +:10D120000020000400410040000800080041000009 +:10D1300000000000000000000000000000000010DF +:10D1400000100021000800000000000000000005A1 +:10D1500003111021081100000000110241211009E3 +:10D160008090008400800083000000000000000028 +:10D170000010020003400509000900900010800320 +:10D18000808000800000808000410004402109C0B0 +:10D1900000080083000502A080000000000080005D +:10D1A00080208000000080000000000000000000DF +:10D1B0001000050040000800000000000000000012 +:10D1C000000000000000000000000000000000005F +:10D1D00082809000100005100000210810402100FE +:10D1E00010038000800000008000000000000000AC +:10D1F00000000204880210001103410221844080D3 +:10D200001008000080A08000800021000300028040 +:10D2100005410000000000008010C00090000200E6 +:10D220000800C000200090000800000000A000904E +:10D2300000000000000000000100000000000000ED +:10D2400000000000000000000000000000000000DE +:10D250000000C0409100900040000000010000006C +:10D2600001000101040002108284A00000000000FF +:10D270000000000008010500400088012190A04046 +:10D280000310C0018400A0040208820001C0001045 +:10D2900001840001080082022088040000000000D0 +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E :10D2D00000000000000000E000000000000000006E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000E00000000000003D -:10D31000000000000000000000000000000000BC51 -:10D3200000000000000000000000000000000000FD -:10D3300000000000000000000A0A0000C0C0000059 -:10D3400000000000112200810024240000240000BD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D380000000000007000400000000000000000092 -:10D39000A000AF000000000000000000000000003E -:10D3A00000BC0000000000000000000000000000C1 -:10D3B0000000000000000000BEB4BEB480BFC0C0CA -:10D3C0000000000011220000810024008100008183 -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000F7F0F4F000000000000051 -:10D410000000A000AF0000000000000000000000BD -:10D420000000FF550055000000000000000082C30E -:10D4300080C100000000000000000F3F0535C30060 -:10D44000F0AA4488000044000044041008200600AC -:10D45000900000000000000000000000000000003C -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D4800000000000820382C30000FFFF00000000D4 -:10D4900041C1414100000000000000000000000008 -:10D4A00000000000FF5000500000000000000000DD -:10D4B000024300410000000000000000003005357C -:10D4C000C3FFF0AA44880000880000880140028061 -:10D4D00000060090000000000000000000000000B6 +:10D2E00000000000840000000000000000000000BA +:10D2F000000000000000810000E0000000000000CD +:10D30000000000000000000000000000000000001D +:10D310000000000000820000000000000000FFFC90 +:10D32000FFAA00000000FFEBFFF00000000000007B +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D35000000000000000D714F3F3000000000000FC +:10D360000000000000000000F0B000B00FC3005546 +:10D3700000000000000000000F000FC300000000CC +:10D38000CFCFCF000F0F0F3FFFFF7D7D0000FF5578 +:10D39000000000005F004300C30382020505FCFC9F +:10D3A00000C000AA00000000004100F000000000E2 +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D0000000000000000000D71430300000000002 +:10D3E00000000000000000000000F01000100FC35B +:10D3F000FF5500000000000000000F3C0FFF000080 +:10D400000000EBEBEB000F0FFF3F2A7F02570000FD +:10D41000FFD5000000005F5F4343FF0FAA0AAFAFD4 +:10D42000C0C000000000000000000000000000007C +:10D430000000000000003F303C3C00000000000005 +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000006F4FFE +:10D47000AAAA00FF00000000000000000000000059 +:10D48000000000003C30AAFFA200A200F0F0F0F083 +:10D490007D7D2D2800003CFFAAB0AAF0FCF0FCF036 +:10D4A0005F5F5F5F00000000000000000000000000 +:10D4B00000000000000000003F3035350000000093 +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C :10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D5000000000000000082038200F828F8280000D4 -:10D5100000005FDFDFDF000000000000000000000F -:10D5200000000000000000610006000D0000006126 -:10D530000006000D000100610006000D0000000063 -:10D540000038009000A500029000000010000000CC -:10D5500000000000080000000000000000000000C3 -:10D5600000010000000000000000000000000000BA -:10D57000000000000000000000610006000D000037 -:10D58000000000000000000000610006001D000017 -:10D59000002100030008000000610006000D0000EB -:10D5A000000000000000000000000000000000007B -:10D5B00000000000FFFFFFFF00000000A300AF001D -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B -:10D5E0000F0F3C3CFAFA287D00000000000000000C -:10D5F00000000000000000000000F0F07020E828AB -:10D60000E8E80000000000000000000000003030EA -:10D61000303055FF55C3F3F3AFA0000000000C0CF1 -:10D6200000000000000000000000000000000000FA -:10D63000000000000000F808FB0B00000000A00044 -:10D64000AC0000000000000000000000000000002E -:10D6500000000000000000000000000000000000CA -:10D6600000005555FF005050287D000000000000CC -:10D67000000000000000000000000000000070201A -:10D68000E8E8E8E8000000000000000000000000FA -:10D69000FCF0BEF055FF55C30303AFA0000000002F -:10D6A0003C3C3030000000000000000000000000A2 -:10D6B0000F030A030000000000000000000000004B +:10D4F0002F0F0CFC00FF00000000000000000000E7 +:10D500000000000000003C30AA00F300F30030F3FC +:10D51000B2B27D7D7D7DAAAA30F0BEB0FFF00000E2 +:10D52000FFFF50500050A000000000000000A0616C +:10D530000006000D000000610006000D00050061FE +:10D540000006000D00000000000000000000006167 +:10D550000006000D00000000000000000000A061B7 +:10D56000000000090000000000610006000D00003E +:10D5700000610006009D00000000000000000000A7 +:10D5800000610007C00D000080615006000D000022 +:10D59000000000000010000000615006000D0000B7 +:10D5A00080610006009D00010000000000000000F6 +:10D5B000000000003C3CFCFC000000007C2CFCFC5B +:10D5C000FF7DEB690000000000000000000000008B +:10D5D00000000000CFC0EFE00000000000000000ED +:10D5E000FF8F8F8F00FF00FF00001C143C3CFFFFEB +:10D5F000A0A0000000001717151500000000000093 +:10D600000000000B00EB000000000F000000D70737 +:10D61000000000000000000000001C3C1C3CBFBFDC +:10D6200000FF000000004343430000000000000032 +:10D630000000000000000CFC0C0C000000007C2C22 +:10D640000C0CFDFDE9E900000000000000000000F6 +:10D65000000000000000CFC0EFE00000000000006C +:10D660000000FF82828230FFF3FF00003C3C3C3C24 +:10D6700000FF00FF00000000FFFF7D7D00000000B4 +:10D68000000000000B0BEBEB55C355FF0F004141B1 +:10D69000D707D70700000000000000001C3C0C2C3E +:10D6A0008F8F00FF000000005F5F5F000000000040 +:10D6B000000000000000000000000000000000006A :10D6C000000000000000000000000000000000005A -:10D6D000000000000000000000000000000000004A -:10D6E00000000000F0F0FF00AAAAFF000000000008 -:10D6F0000000000000000000000000000000FFFF2C -:10D7000000AAD585D08000000000000000000000C5 -:10D710000000000000002D2DAAFF828203000000FF -:10D7200000000000000000000000000000000000F9 -:10D73000000000030A0300000000000000000000D9 +:10D6D000000000000000000000C3FFC300000000C5 +:10D6E000000000005DFF5D5D00A800A8000096FF3F +:10D6F000147DF028F0EB00000000000000000000A6 +:10D70000000000000000FF0F2D0F0C2CCFEF0000D9 +:10D710000000AAA0AAA8000000000000000000006D +:10D7200003030CFCAFAF00000000AA08FF5D00007F +:10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000000C9 -:10D760000000000000003C3C55553C3CF0F000003F -:10D7700000000000000000000000000000000000A9 -:10D78000FFDF555DDF8FDA8A000000000000000037 -:10D7900000000000000000002D2D00558282F3F0F3 -:10D7A0000000000000000000000000000000000079 -:10D7B0002000000500000000000088108800000024 -:10D7C000000000000008000400002000000000101D -:10D7D0002000000000000003000020000000040002 -:10D7E0000000840000000000404000000000000233 -:10D7F0000000200000000000000000000000000009 -:10D80000000840000000000400002002A00000000A -:10D810000005000000000004A0020000400200001B -:10D82000020420000004401100004000200000001D -:10D830000000400000000000000040001000000058 -:10D84000210000C0100010C0100000400040204027 -:10D850002100000000000004000240000000000061 -:10D860000002000000000000000000000000004076 -:10D8700010400000000000004000410400000000D3 -:10D8800000000084000000000090009000080000EC -:10D8900000400000000200004002000000020004FE -:10D8A000000200000004410200840000000000406B -:10D8B0001000000000000000000000000000000058 -:10D8C00000100008000000000200040002008200B6 -:10D8D00000000000020000400000000000400000C6 -:10D8E0000000900000400000900000000040000098 -:10D8F00000000000000000400000020400000000E2 -:10D900000000000000000000000004001000020001 -:10D9100000000000000000400000000002000200C3 -:10D9200000000200000000000000080000000000ED -:10D9300000000000000000000000000000000008DF -:10D9400000080000000000000000041000000000BB -:10D950000000000000000400000000000008008437 -:10D9600000840008000800000000001000000040D3 -:10D97000000000000000000000000000000000881F -:10D9800000000010004000840000000800000010AB -:10D990000008000000000000000002000000000875 -:10D9A0000000000800000002000000020210000851 -:10D9B000008400000000000400000000000090004F -:10D9C0000000000000000000000040030000840090 -:10D9D0001000040002008800040000009000902164 -:10D9E0002000400840204000000000000003000824 -:10D9F00000080021900090000000000000000000DE -:10DA000000084000000802000000000000000200C2 -:10DA10000400000002000400902100030000000048 -:10DA200000000000020000000008000040000000AC -:10DA3000004000000000000000000488118800027F -:10DA400004080440000000000400410041000004FC -:10DA500000A0000041A0020000004000400040A0E3 -:10DA6000410000200000000000084088410800102C -:10DA700000000000000000000000000000000000A6 -:10DA8000001000000000030040000800000000003B -:10DA900000000000008200000000000800001108E3 -:10DAA000000000A000080002000400040084000040 -:10DAB00000A0002000040000000000A00000000002 -:10DAC00000000000000000400000000200400000D4 -:10DAD00000000000000000400040C04000110011A4 -:10DAE00000400040000000000004000000000004AE -:10DAF00000000000001104000009000900000000FF -:10DB00000002000000000000000000000000000013 -:10DB1000A0090000004000000040000000000800D4 -:10DB20000000000900000000004000040040040064 -:10DB300000400000004008000000004000004000DD -:10DB400000000000201000000000000000000004A1 -:10DB5000000000100000000000880000000000002D -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB80000000000400100000000000000000000081 -:10DB90000000000041000000000000000000000044 -:10DBA00000000000000000000000099000000000DC -:10DBB0000000000000000000000000000000100055 -:10DBC000000000000000000000000800100000003D -:10DBD00004000000100000000440000000000000ED -:10DBE000000000000000000000000000080000002D -:10DBF00000000000000000000008002000000000FD -:10DC00000000000000000000000000000000000014 -:10DC100010000000000000000000000000000000F4 -:10DC200000000000000000000040000000000000B4 -:10DC300000040000000000000000000000000000E0 -:10DC400000000000090000001100000802000008A8 -:10DC5000000809000000020800001008052008A0C4 -:10DC6000044000001000100000A021A00084050066 -:10DC70000300020000000000110009000800041069 -:10DC8000040200000000000000000000000000008E -:10DC90000000000000A008200008000800000000AC -:10DCA0000000004000000308008411400200000052 -:10DCB0000000008403000088000400400000000011 -:10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 -:10DCE0000000200010000000000400000000000000 -:10DCF0000000000000000003000000000000000021 +:10D750000000000000000000000000C3FFC3000044 +:10D760000000000000000CFF0C0C00FF0000000097 +:10D77000FFFF7D7DF028F0EB0000000000000000BE +:10D780000000000000000000000F2D0F0C2CCFEF58 +:10D7900000000000A0A0A8A80000000000000000F9 +:10D7A000000003FF0CFCA0A000000000AA08FF5D21 +:10D7B000400020002009C0000000040020030402F3 +:10D7C000000088002000200200000000200000006F +:10D7D000C004200020042000880020002000200039 +:10D7E00004002000880040000000880088008800B5 +:10D7F00000000000400000002000400020008800E1 +:10D80000200090002000C0004000C00000008808F8 +:10D810000000C00040008800200300002000200419 +:10D8200020408803200084000400880000000002DB +:10D830008800000000004000000000000000000020 +:10D840000000200000000000000040000000400236 +:10D85000000020001000040241000400000000004D +:10D860001000000004000000000000001000210073 +:10D87000100000001000100000000000090010005F +:10D8800040000000100010001002410000002000C5 +:10D8900040401004400000000090000004402100BF +:10D8A000000200C0000240404040100000000000A4 +:10D8B00010004002C00000008400000000000004CE +:10D8C0000000020200400004000088000003000580 +:10D8D0000003000000000000000000030000000042 +:10D8E000200082000000000000000004000000048E +:10D8F0000000000000000000000000000000000028 +:10D90000000000040200000000000000020400000B +:10D9100010410004000000100000020000000000A0 +:10D9200000000000000002100010000000000000D5 +:10D930000000001002000000000010821100000032 +:10D9400000840008020002020002000800000088B3 +:10D9500000000000000000000484008441880000F2 +:10D96000000200040008008200880004000000009B +:10D97000000800000000000000040000008800080B +:10D9800000100400040041840008000440820400E8 +:10D99000000000402000000800082084000000C0B3 +:10D9A0000000000000000088100800020090000045 +:10D9B0000000001000900010000088000009000026 +:10D9C0000000000800000000000000080021000026 +:10D9D000000000080000000000000000000800082F +:10D9E0000008000340008800002000080008000034 +:10D9F0000000A000820000000000020800000041BA +:10DA000000000000000000000000000090009008EE +:10DA100000210000840888009040200088009000C9 +:10DA2000901040000000100090008800000988005D +:10DA30000000400088008411C000008205A000A002 +:10DA400008000000009000000040100000000300EB +:10DA50000000000000000000000000A040002100C5 +:10DA60000000000000000000000005A0009004007D +:10DA7000040000004100030000000000000008084E +:10DA800008A003A0081000A000000002008809827E +:10DA9000058408000400090009000000400000049B +:10DAA0001108029020200302038811202140202029 +:10DAB0001184418209004190108805000000C008CF +:10DAC000C041880800200000840008000011000008 +:10DAD00000040000040000008200000000000000BC +:10DAE000C0000000000484008240A000000000404C +:10DAF00008000800100000000800001000000802E4 +:10DB000000000000000000000000080000000841C4 +:10DB10000000A000000000008400044100408200DA +:10DB2000000000000003080400000000A00000093D +:10DB3000000484410000080010400000C00000887C +:10DB4000100420C0000810000000000010000008B1 +:10DB5000100041001000000000002000218400009F +:10DB60000040008400000000000000200010004081 +:10DB70000000410000000000210000000000000043 +:10DB80000000000000200000000000000000000075 +:10DB900003000408080000100084000008000000D2 +:10DBA00020C000880000000000C0008800C0000005 +:10DBB00000000040000000C0000000900000212094 +:10DBC0000400000000200000000000000000C00869 +:10DBD00000000000000000000000000000008200C3 +:10DBE0000000000000000000000000000000200015 +:10DBF0000008000088000000000000000000000095 +:10DC00000000000000000000840000000000000090 +:10DC1000000082000000000000000003000000007F +:10DC200000000000000000000008400000000009A3 +:10DC3000000008000000080000000000000008408C +:10DC4000000000000500000000C0400000000302CA +:10DC5000210040000000050400A000A00000030017 +:10DC6000000000000000000000000004044000006C +:10DC700000000000000000000400004003882000B5 +:10DC8000090800000000000003000400000000007C +:10DC900000041000034000000000000000400420C9 +:10DCA0000802088404042040098405040590030444 +:10DCB00004884000009040000084028209000900AE +:10DCC000050005A0000000000000020000000000A8 +:10DCD0000000000000000000000004000000000040 +:10DCE0008200000000000000000040400000000032 +:10DCF0000020000000000400000000000000000000 :10DD00000000000000000000000000000000000013 -:10DD100008000000000000000000000000000000FB -:10DD200000000000000000000000000000000000F3 -:10DD300000000008000000000000000000210010AA -:10DD40000000000000000000000000020000400091 -:10DD50000010000040000000000000000000002053 -:10DD60001188208400000004000000002100000051 -:10DD700000000000000000000000000000A0000003 -:10DD800011880010020400002000000000020000C2 -:10DD90000000000000000400050000000004200056 -:10DDA0000000110000000000000020000000400002 -:10DDB000000000000008000000000000000000005B -:10DDC0000000000000000000000000000000000053 +:10DD10000000C00000000000000000000000000043 +:10DD20000000000800000004000000004003840020 +:10DD300000000021000000000000000008001000AA +:10DD4000040000080000009040000008204000008F +:10DD50000000000021880088000000000000000092 +:10DD60000500000000000008000020040200000080 +:10DD70000000000000000000000000A00000000003 +:10DD80000000030000000000000000000000000090 +:10DD90000900000000000008000000000000000072 +:10DDA0000000000000004110008805C0100220049F +:10DDB000000000000000110020C000000910001049 +:10DDC000020000001004200000000000000000001D :10DDD0000000000000000000000000000000000043 :10DDE0000000000000000000000000000000000033 :10DDF0000000000000000000000000000000000023 @@ -106126,439 +106126,439 @@ :10E7300000000000000000000000000000000000D9 :10E7400000000000000000000000000000000000C9 :10E7500000000000000000000000000000000000B9 -:10E760000000000000000000000000000000A10008 -:10E77000000000800000088000000080010200000E -:10E7800008800000008088000190000000830000E5 -:10E7900083000200C080210082000080020000008F -:10E7A00000000000400020000000040004000003FE -:10E7B0004000040320002000000004004004000387 -:10E7C00002000000200400000000000020002004DF -:10E7D0002000200020002000400220002000000433 -:10E7E00040000002410440004000000000042004FA -:10E7F0004000204000082140C110009040404041AE -:10E8000000908002009000080040080840020002CA -:10E81000004010004002400240000000400840005C -:10E8200000C00000000000000002210080C0804005 -:10E830000000000000C01100000000000002000005 -:10E8400000028000000080000000000000002102A3 -:10E8500000000002008200020004004000400002AC -:10E8600000020082400804020008100000040000BA -:10E87000210200001000000000008400A10005003B -:10E88000A000000003004000A000000000000205FE -:10E8900000410200004000020000000000000000F3 -:10E8A0000000000000000003000009000100040057 -:10E8B0000100000002000000C00000000200000093 -:10E8C00004000200010002000141200000000000DD -:10E8D0008210000020400900000000200000040019 -:10E8E00082000000014082000000000000000805D6 -:10E8F00020000000000000000000020002044000B0 -:10E9000002000200000040000200080000000200B7 -:10E9100000000000090000820009038200000200DC -:10E9200000000410000020000000000002080200A7 -:10E930000008020800000008000800084008200441 -:10E94000000800080004080403000800840003080D -:10E9500000000009020880080208020241090000C4 -:10E96000400802840000080041C0000000000008C8 -:10E9700000000010000800008800100500000000E2 -:10E980000140000040080000000040210209880208 -:10E9900000210208880800088408000820081000E8 -:10E9A000100820080000000804000000000000001B -:10E9B0000000C0090000000000000000000000008E -:10E9C0000000000000000000000500000000004002 -:10E9D00004000000000000000000004100000000F2 -:10E9E0000400000500000008000000000000000016 -:10E9F000000000000408010000000000000000A06A -:10EA00000000400000A0110000000800000080008D -:10EA100000000000000000000000000020000000D6 -:10EA200000000000000000080000000000000000DE -:10EA300000000000000011000000000000000000C5 -:10EA40000090040000000000000000000000000032 -:10EA500000000000000000000000000000000000B6 -:10EA60000000000041000000000000000040000025 -:10EA700000000000000000000800840020000840A2 -:10EA800082000404000000400010C0058400000063 -:10EA900000880000C0118800004000000011000044 -:10EAA00000000040820020000040840000000000C0 -:10EAB000000504042104118401020000000000008C -:10EAC000201000001020822082000800C1000103F5 -:10EAD00091400100080900400040A00004090184A1 -:10EAE000828405C0A000000084200000082040208F -:10EAF0000820044082000000080004001004080000 -:10EB00000000200000A000040000000020A000C0C1 -:10EB10001000000900000000000000100000008448 -:10EB2000000400000000000000A0000800400000F9 -:10EB300000000000900004000440040100000000F8 -:10EB40000800000109A00300080000880000200060 -:10EB5000200020002000030010A005000004C100D8 -:10EB600020040304A0040000000000000400004191 -:10EB700040050301000000000000050000008400C3 -:10EB800000008200001100000800A04140020000C7 -:10EB90002000100002000000000000000000000043 -:10EBA000000000200004000400000000000000201D -:10EBB00000008400A000840010000000000000009D -:10EBC000A000000000000000820010000000100003 -:10EBD0004000000000002000000210009000000033 -:10EBE00000000000200000008200A00000000000E3 -:10EBF00000000000000000000000000040000000D5 -:10EC000040000008000800A0000000000000800193 -:10EC100000000000000003000000000040000000B1 -:10EC200000000000000400200000000000000000C0 -:10EC30000000002000000020000000000020402014 +:10E760000000000000000000000000000000880021 +:10E7700000052000001088000000880520008800A7 +:10E780000200200088004000210040852000200079 +:10E79000010020084000A00000004005400088055E +:10E7A0004100890021040020400020002140000396 +:10E7B0008800840020002004200000002000880041 +:10E7C00001084000A00040858502C00808400420E0 +:10E7D0000082C0004100A002040000048800200064 +:10E7E0008880880020914004404020002003409011 +:10E7F000000000000000000509000000000000000B +:10E80000000080000000000090020800801010004E +:10E81000000040000083100408020000009000A0E7 +:10E8200000040200080008002000000000000201AF +:10E830000000400000020000000000004002110043 +:10E84000200040200000200004024000000085015C +:10E850008401000900C0908200034140000041C0D3 +:10E860000940004020000002C00000000900002014 +:10E8700010030808011002082141910888100800BF +:10E88000030083050005890401100100210000092F +:10E8900040050108118202880305000000082000DD +:10E8A00000000880000410000010880408402009BF +:10E8B00002840000000000000208000800100100AF +:10E8C00000109140000040104108100585000040F4 +:10E8D0000004081110028300404021910004001040 +:10E8E00000008800000002918280030900000040BF +:10E8F0004003021090044004850408004000090908 +:10E90000008208820808000410084010020840082D +:10E910004100C10440C0C003410240C02084000245 +:10E9200003000084801020844084000800820011CD +:10E93000910882110000008400000090000040084F +:10E94000020400080889000280044084800408044E +:10E9500041054084C1008089020880080210000837 +:10E960000982020400040208002009404008000057 +:10E970000990809000C000000008002100080011EC +:10E9800000050005004000000005880300080005A0 +:10E9900000100010000000041021001110410008B8 +:10E9A00000210008001000089008008800200021C5 +:10E9B0008808204020050000000890020003042180 +:10E9C0000040000810210000404101080410109090 +:10E9D0004000400204110000842084000440A04054 +:10E9E00000000003400808088805044040030204B2 +:10E9F0009083840000000003000000000900000074 +:10EA00000000000020400000000010000082000014 +:10EA100041000000000003000041100000A00000C1 +:10EA20001000000000000082000000000040000014 +:10EA300000080000800089000000000000A0000025 +:10EA40000400000000004000090010004000000029 +:10EA5000000811000800000803000200000000A0E8 +:10EA6000009110040000100080020000004005002A +:10EA7000030005080000000000001091A01102082A +:10EA800008C0A0100821C040C14084400004844058 +:10EA900008000800004000200210C008000482891D +:10EAA0008200824100000800080008000008000001 +:10EAB000820000000200A00003000000000000002F +:10EAC00000211000A0000000000002000000C04073 +:10EAD00084008240C00440000800A04040030800B9 +:10EAE000040908000020C000000004040400000025 +:10EAF00004008480080000000004A0091102034003 +:10EB00000089410300A100000001408500010900C7 +:10EB100010850082048205C103000484000100897D +:10EB2000000400000084000800000008000000004D +:10EB3000200000000040020003A0A004000000002C +:10EB400021A000000200000041A00000910000840C +:10EB50004184000000000000008400840308850454 +:10EB6000090800A020A0030400C0081041108382FF +:10EB7000000800840010004000040088000008081D +:10EB800000200000C02108000040C010C008840020 +:10EB90000800C000100000028403080800000040C4 +:10EBA000001100040040000000000000820000008E +:10EBB000000008400000000008020085000000007E +:10EBC00000008400A00500000000820282112005E0 +:10EBD000000040001080101100050000A000084057 +:10EBE00009210100089002800803C00800110008F4 +:10EBF000902091000080C00304210140C02000212A +:10EC000020000000000000040000100000000000D0 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000008000000DC +:10EC300000000400000000000000000109040000C2 :10EC400000000000000000000000000000000000C4 -:10EC50000000000000000000800000010000000033 -:10EC600000A00000008880000002000000000000FA -:10EC7000000000000000008800000000000000000C -:10EC80000000828000002100080801000400010447 -:10EC9000042100000121000000210008000088215B -:10ECA00000000000820000000000000400030000DB -:10ECB00010000000100002000200058000000000AB -:10ECC00001400000002100000000000020000400BE -:10ECD0000000000001002000018009000040010048 -:10ECE000008000002184048405200180020010209F -:10ECF000A00082000400041000000480A0000000B6 -:10ED00008200000000020000100000000800000067 -:10ED100002002000020040A00000000020401190EE -:10ED20000004098208A000040088200000082000D8 -:10ED3000004000080090000000000000C02000001B -:10ED400000000200000000000800000000A0040015 -:10ED50001000000041002000A1082040080010849D -:10ED60000800031000008421C12184010820200034 -:10ED7000000000000090A14080000000A1200000E1 -:10ED800000000000000000014001000000004005FC -:10ED90000102A004A0A100400402020200400008F9 -:10EDA0000084881000000000000020000000000126 -:10EDB000000000010001000000000000000090C001 -:10EDC000400500050485000000000000000002006E -:10EDD000000000000000000020000000010088008A -:10EDE00008A0000900A04008010020000000000069 -:10EDF0000000000000000000000000000000000013 -:10EE00000000000000000000004100210005000398 -:10EE100080820409008280A14000A18080800000DF -:10EE200000001100000000000000080000000000C9 -:10EE30000041000500080010000000000000000074 -:10EE400020A0218300888040000000000000000016 -:10EE50008000000000000000000000000000200012 -:10EE600000000080008800A0002011008000400009 -:10EE7000000000000000000000000300000000008F -:10EE80000000000000000000000020001100080049 -:10EE9000030240000310108420004000030009001A -:10EEA0000321000000000000000000001000080026 -:10EEB0000000000000000000000000000000000052 -:10EEC00000008000000300808000000000000000BF -:10EED000000000000000000000000000001000081A -:10EEE00000100000000000088080800000408000CA -:10EEF00000208000000000000000000000000080F2 -:10EF00000000000000000000000080000020000061 -:10EF1000010001000100010101A101C00020000069 -:10EF200000000101000000000000000000000100DE -:10EF300000000000000000000000000000000000D1 -:10EF400000000000080040000882C090000000009F -:10EF500000000000000000000000000000000001B0 -:10EF600090001089000040004001A0A00200200095 -:10EF70000888A000C0880000000000000000000019 -:10EF8000002000880040900008009000040000006D -:10EF90000100850000001002004002058208020006 -:10EFA000000000000200A00100000001820100003A -:10EFB000000000000001000001000000000000004F -:10EFC000000000000000A009000400C002C1000011 -:10EFD00000000010002000A0000000000000000061 -:10EFE00000040202004001C0409000201040A090A8 -:10EFF00001002000200000000000000000000000D0 -:10F0000000000000040000000000000000000000FC -:10F010000000100021000000008241A085A1808333 -:10F0200000090040004180050010000300408041BD -:10F030000020001100050041000010004000000009 -:10F0400000000000000000000008000000048090A4 +:10EC500000000800809000028000400005000000D5 +:10EC600000904000400000028040110000000000C1 +:10EC7000048820010200002021004082400004009E +:10EC80001120C00010884003C0830004000010045D +:10EC9000A0044100C00801034020000010212021F1 +:10ECA000850800210000000000040004004000402E +:10ECB00000008210000020000000000590402000AD +:10ECC000000000000803A008000382050000000007 +:10ECD00000040008000001004000080882118410B0 +:10ECE00000000400000400100002004000000000CA +:10ECF0008400104000000400000508000004000823 +:10ED000000048221410021101000410800A00000F1 +:10ED10000802000040000084084000840000030056 +:10ED20000000082000000000000020C108000000D2 +:10ED300000040000000000000000000000000000CF +:10ED40008000000000000000000000000000000043 +:10ED500003000304000000004082C1000000000026 +:10ED600000A0000080001000000000C10001400071 +:10ED70000004410000C000100488000011040008D5 +:10ED800000000400088409C108200241001100C0ED +:10ED9000002088A0002009010001880002000288EC +:10EDA0000100408802000001010104000001000090 +:10EDB000000000000000080000000000C0009020DB +:10EDC000000809001084000000000000000000009E +:10EDD00002C0400400A00082000101008400000085 +:10EDE000020120010800000110050240080310C1C3 +:10EDF00000000000000000000808050082404008F4 +:10EE0000000121010400000190C1032180200004C1 +:10EE10000485108500030008084121400009000313 +:10EE20008820080500C100050041212102040002DC +:10EE30000000000000000000800000000000000052 +:10EE40004000000082000000000000000000000000 +:10EE50000000800080800080008008081008804149 +:10EE60000010844020218009000380C1A08400C0DC +:10EE700000030000000000000000080040008000C7 +:10EE8000000000104120000000400000801000A1A0 +:10EE90000010800000400080800000000010800012 +:10EEA000800020000210C000830803A0210002207F +:10EEB00041200000000000000000000000200000D1 +:10EEC00080009180092090918208000000000000DD +:10EED0000000000080008005008480001080020097 +:10EEE000001020808280800480C1A1A12000051034 +:10EEF0000590C18880000000800800000300002108 +:10EF00008200800020808300A00041832090400187 +:10EF100088838200040088012084040220002001EC +:10EF200004900400054021011010C00000100100F1 +:10EF300001000100000000000000000010000800B7 +:10EF40000800C000044090A084A1C005000000009B +:10EF50000000000000001000104004A1C0000040AC +:10EF600000000001008840C002001010C10502A08E +:10EF7000C04103A1C1A1400002000801100002002D +:10EF800010001008080000021100830021A090006A +:10EF900001000820A10890000000010000010020ED +:10EFA0000002011000C102030104900410C100011D +:10EFB000000000000001000000000000000000024E +:10EFC0000002100000A00088000290040140000030 +:10EFD000000000000000000020000020004083022C +:10EFE00000000000010100000008002101000001F4 +:10EFF000400400018284410800000000000000007D +:10F0000000910089048500C001000000020000009A +:10F01000004103054103C0A000080803104100039C +:10F020000003114010880090009003030303089030 +:10F030000010210905090541000000000000000042 +:10F040000000008080000080001000100082091085 :10F0500000000000000000000000000000000000B0 -:10F0600000000080800000002080800000800900F7 -:10F070008000410000008000080003000000000044 -:10F0800000004000000080000000000000000000C0 -:10F0900000001180080004000911A1008041200037 -:10F0A000A002418320402100030800000008000066 -:10F0B00000000080001000000003000000000000BD -:10F0C00000000000000000000000804000038000FD -:10F0D0000000000000000000000000000000000030 -:10F0E0000000000080000080008000008008808810 -:10F0F0000000800000000040000000000000000050 -:10F10000000000008000804080008000002000801F -:10F11000008000000040000001000000C104A000C9 -:10F120004000040101C000000100010100000000D6 -:10F1300000000000000800000000000100000000C6 -:10F14000000000000000000000000000C00140A01E -:10F15000402040000000000000000000000000000F -:10F16000000000000000C00002048402C00008008B -:10F1700004020882820000000004009000000000E9 -:10F180000000000000000400040002000400000071 -:10F19000000400400000000000000000000000002B -:10F1A00000000000000000000000000060000000FF -:10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000000000000000003F -:10F1D0000000070000000000000000000000000028 -:10F1E0000000000000000000000000E0000000003F -:10F1F0000000000000000000000000E007008200A6 +:10F0600089800009112021100003000903102105E7 +:10F0700000088008054041200988000000000000C9 +:10F0800000000040009080A104800809004141096F +:10F090000009C111100088808800800500028000EE +:10F0A00000008008008080008000C14085808200D0 +:10F0B0000208038405400300400200000000000035 +:10F0C000000000008080000000004103C00090802C +:10F0D000831000000000000000000000000000C0DD +:10F0E000000080004180091121000341898004084B +:10F0F00005208900218411081180401100100000B2 +:10F1000000800000808000C10000804021090500CF +:10F1100010000008C10008900904A100C000108977 +:10F1200004900800C00040201002100004080420D1 +:10F1300011884101000900010100010000000000E8 +:10F140000000000088004008888402008810202009 +:10F150000584100000000000000000000000100006 +:10F16000408284A004000110000001000101C008D9 +:10F17000A08484848400A1C190418284C0000001E5 +:10F1800000A000400000C008200884882001010180 +:10F19000009000840000000000000000000000005B +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000E00000000000006F +:10F1C00000000000000000000000000000008800B7 +:10F1D00000E000000000000000000000000000004F +:10F1E000000000000000000000000000000000829D +:10F1F0000000000007004200000000000000810045 :10F2000000000000000000000000000007000000F7 -:10F2100000000000000000000000000000000000EE -:10F220003C3CF0F0555F555000000000000000002D -:10F2300000000000000000000000000000000000CE -:10F2400000000000000000000000000000000000BE -:10F25000BE14F5F5AAF03CFF00000000000000001D -:10F26000FFFF0000000000000000F0AA3CFFA0AF7C -:10F27000FCFC0000E31C0080000000000000000017 -:10F280000000000000000000000000AA00E80000EC -:10F29000000000000000000000000000000000006E -:10F2A0000000555500FF5353535300000000000069 -:10F2B000000000000000000000000000000000004E -:10F2C000000000000000000000000000000000003E -:10F2D0000000BE14A0A0AAF03C0000000000000046 -:10F2E000F000F0FF0000000000000000F0AA3C0069 -:10F2F000A0AF0C0C431CA0000000000000000000A8 -:10F3000000000000000000000000000000AA00E86B -:10F3100000000000000000000000000000000000ED -:10F3200000000000FFF77D750000000055553F35D7 -:10F330000000000055FF5500000000000000000024 +:10F210000000000000004100F0AAC3FF5555FF00A8 +:10F22000D4F0FCFC0000000002F7AAFF50F0787850 +:10F230003F41034130BA3CBE000000000000000026 +:10F2400000000000000000000C00FFFF0000F3F3CE +:10F25000D717D4D4002800EB000000000000000005 +:10F26000000000000000FF550FFF0000000000003C +:10F2700000003CBE30BA0D0D0D0D0C080C0B143CFB +:10F28000D7FF0000000000000000F0F000FFFA507F +:10F2900014140000000000000000F0AAC30055553F +:10F2A000FF00D4F0C0C00000000002F70055FAF0E3 +:10F2B00078783F7D037D30BA00AA0000000000008E +:10F2C00000000000000000000000FFF3FFFF00004E +:10F2D000EBEBD717D7D7FC28FCEB000000000000B1 +:10F2E000000000000535F535FF550FFF0000000058 +:10F2F0000000000000AA30BA0D0D0D0D0008000B33 +:10F300000028C3EB0000000000000000C3C35555F7 +:10F31000FA50BEBE0000000000000000FF008E8E0C +:10F32000AF2DAFAF3F033F3FB2B200C300000000BC +:10F33000282830F3AAAAF0F035353C300000000050 :10F3400000000000000000000000000000000000BD -:10F35000000000003C3C0F0FFCFCF5050000000025 -:10F36000000000000000000000000000000000009D -:10F37000000005AA05AA00AA0000AAAAA6AA0000E1 -:10F380000000FF551E1E00000000000000000000ED -:10F390000000000000000000000004100140000018 -:10F3A0000000000000008A8208000000000055559F -:10F3B000303500000000550F550F00000000000020 +:10F35000000050FA003CC3FFD714CF0000000000AB +:10F3600000000000000000D400FCCFCF7D41000071 +:10F37000000000000000000000005F551F140000A6 +:10F380000000B4B4FFAA0000000082AAC3FF0F0F60 +:10F390003C3CFFEFFFEF00000000005550550F0F01 +:10F3A0000F0FAF2D05053F030303B2B23CFF000072 +:10F3B0000000EBEB30F30000F0F035353C3F00008F :10F3C000000000000000000000000000000000003D -:10F3D0000000000000005555FF000C0CF505000072 -:10F3E000000000000000000000000000000000001D -:10F3F00000000000AFAAAFAAA2080000555555555D -:10F4000000000000AA001E1E000000000000000016 -:10F410000000000000000000000000000820028042 -:10F4200000610006000D0000A0610006000D000054 -:10F4300000614006000D000000610006000D0000A4 -:10F4400000610006000D000000610006000D0000D4 -:10F4500000000000000000001061200E004D0008B8 -:10F46000000000000000000000000000000000009C -:10F470000000A0610007009D000000610006000D73 -:10F48000000005610A0F050D00A500000000000046 -:10F49000000005000A08050000A0000000000000B0 -:10F4A0000000FDFDFF5500000000CFCF0C0C000058 -:10F4B00043415F0ABEBEF0F0F0F0000000000055CE -:10F4C0000FC30000000000C30F5500000000000043 -:10F4D000000000000000000000000000000000FF2D -:10F4E00000FF00000000000000000000000000001D -:10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB -:10F5100000000000000000000000000000000000EB -:10F52000000000000808AA0000000000CFCF0C0C6B -:10F53000000081815F0A1414A028F57D00000000FE -:10F54000FF550FC300000000FFC30F55000000006F -:10F5500000000000000000000000000000000000AB -:10F560003C3C00FF00000000000000000000000024 -:10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000007B -:10F59000000000000000000000000000000000006B -:10F5A000000000000000BE14AFAF28E82BEBAF87CF -:10F5B0002D0500200000000000002AEA2AEA0000D1 -:10F5C00000000000000000000000FAFFFAFF3C3CD1 -:10F5D0000F0F000000000000000000000000C3C387 -:10F5E000C30F000000000000000000000000000049 -:10F5F000000000000000000000000000000000000B -:10F600000C030C03000000000000000000000000DC -:10F6100000000000000000000000000000000000EA -:10F620000000000000000000BE140505A8A8ABAB58 -:10F630008F8F0D0D00000000000000002828EBEB6C -:10F640000000000000000000000000000A000A00A6 -:10F65000FF00555500000000000000000000000001 -:10F66000C3C3C30F00000000000000000000000042 -:10F67000000000000000000000000000000000008A -:10F68000000030C030C0000000000000000000009A -:10F69000000000000000000000000000000000006A -:10F6A00000000000000000000000028000000000D8 -:10F6B0000000A0004000C080410000000000C00029 -:10F6C000000002080480C0000280028000030400E1 -:10F6D00000820010000500000104C00000000010BE -:10F6E000900000000000820088030003200000005A -:10F6F0002000008000008400000002002000840040 -:10F700008908400890008405000084000000000281 -:10F710000004100041022080A000400800002000EA -:10F72000C004880800840084000005040010004024 -:10F73000210000000590080221100890410041902E -:10F7400040400000C0018002009080048040000022 -:10F750000000001109854000004002004000000048 -:10F760002000000000000000000020000000050054 -:10F770000000000000100000000800024004000823 -:10F7800000000402008200004004009000020040DB -:10F79000004041000002044000024000200100023D -:10F7A0000800208400900004000410008801000973 -:10F7B00000201000004000000000000000000000D9 -:10F7C00000100000000004100100014003000200CE -:10F7D0008303010010090040000000400000000009 -:10F7E00002000000020000000000020000400000D3 -:10F7F0000000002002100000000084000000000053 -:10F8000008008400000000000000000820004140C3 -:10F8100010000000C01001104000400010404000E7 -:10F820000000020040800200008000C005800080CF -:10F8300000000001000000000000000202080000BB -:10F840000082000000000200808402000400844066 -:10F8500000100200100880881184004000C00000E1 -:10F86000000800001100000000002000000000005F -:10F870000000000000010009050000000008000071 -:10F8800002000008000800000000000800840008D2 -:10F890009008800000000209208380008008830017 -:10F8A00083084108000400200004000400108410B4 -:10F8B00000040005000500000011002100000020E8 -:10F8C0004000000340000000400000040000000071 -:10F8D000100010801000100000850010080404853E -:10F8E0000400020000000000000000080008000002 -:10F8F00000080000000000000000000802000000F6 -:10F900000400000000000000010004000411400099 -:10F9100000000108000900110080C009000000205B -:10F920000000040040004000000090100000200093 -:10F930000000000004A041000000080821001000A1 -:10F9400003000000000200000000000040A01000C2 -:10F9500003000800004000900000000808000308B1 -:10F96000882080A0030000040000210000000000A7 -:10F97000080800000000000000000000000009006E -:10F980000040000000000000000040009140100016 -:10F990000902100020010000000008100000000013 -:10F9A00003080000000400002100040000002020E3 -:10F9B000000005000800824000090000000000412E -:10F9C00000091009004082090000001100090540EB -:10F9D00008118904018084000100008001000000FA -:10F9E00000000000881100000000A00000000800D6 -:10F9F0000011000908090000900084028200000044 -:10FA000082000000C0008200010000C1000000C0B0 -:10FA1000404020C0210001910800C0000009A00062 -:10FA20008220840040004000001182000000400459 -:10FA30000800000000000020000009000000000095 -:10FA400000000204000011840200004002000000D7 -:10FA500090A000000201200408002084001010047F -:10FA600000000000008200000010410000000000C3 -:10FA70002000020000000000000000000504000259 -:10FA80000000110041001100110040002002038419 -:10FA9000090221008004C0004010210200022090D1 -:10FAA000008800C1200000000004000009002100BF -:10FAB0000088000040002000000100210000040038 -:10FAC0000000000000000000010004000000000031 -:10FAD00020000000080000000004000000114000A9 -:10FAE0000810002108008200000300000008001038 -:10FAF0000021080004004000000000000000040095 -:10FB00008200C000820084000000400040008400A9 -:10FB100088008400820420C1409100410011C0038C -:10FB20000000000000110000000000004000200064 -:10FB30001000080000050000C020C0000300000005 -:10FB40000008000021000800000004400008000038 -:10FB5000000000000000000004002121050000005A -:10FB6000000080012100800010000004000000005F -:10FB70000000000000000008080040020000000033 -:10FB80000000000000000000000000001000A002C3 -:10FB90000300004008000001800208040800000083 -:10FBA00000844020008400000000000000000000ED -:10FBB0000000002000200000080000010300820077 -:10FBC00000200000000000080008000800040000F9 -:10FBD0000000000008410000020088000000C00092 -:10FBE000000000000004000900218200084000001D -:10FBF00000040040002100000000000000000000A0 -:10FC000000000100000000000000000000004008AB -:10FC1000200084008280C0002000400010C182804B -:10FC200000000100010201000041400282000002C8 -:10FC3000080000110000000800008200100084216C -:10FC4000000800010000000000000000000000C0EB -:10FC50002000000000000000110000000000200053 -:10FC6000000000000004004000000000000000014F -:10FC7000002009000000000008040000000420002B -:10FC80000000000004040002050000A000000000C5 -:10FC900003A091021182000411008300A0880202D7 -:10FCA0000804000040404002020000000000000084 -:10FCB00000000000202000000000000000000040C4 -:10FCC000020000A0000400040008880000000000FA -:10FCD0009000000000000000000090C01085918599 -:10FCE000C010880101001001880108C0C002000294 -:10FCF00008100000000000000000000000000000EC -:10FD000000000000C002909000A0108200000000DF -:10FD1000000000004041A08208C002050301080461 -:10FD20008401200389A00340202082900101050066 -:10FD300082000000A140000000A090A0021000007E -:10FD40000300909000800000008000800000000010 -:10FD50000000800000000000000000000090A010E3 -:10FD60004008009080410409850500200080008043 -:10FD70000080808000000000000000000000000003 -:10FD80000000000000000380800000800080000070 -:10FD900000000000000090201102C010001082102E -:10FDA0000521850200C00980A08000008000084174 -:10FDB000211080410009A18000000000800080899E -:10FDC0000010021180840000000400800000000088 -:10FDD0008000000080800000000000000000100093 -:10FDE00010080500C1A1C00005000000208000002F -:10FDF0008003000080800000000000000000000080 -:10FE000000000000000000000000802100800000D1 -:10FE10000000000000000000A0802100A0041003EA -:10FE2000910221208002408509800540A0214121C6 -:10FE300002004100040810090000800300898000CE -:10FE40000800110000008080000000000008000091 -:10FE5000080002002000C0080000000000000000B0 -:10FE60008202C000A104C1A108000000A000C08857 -:10FE70000800100190848290000000000000000043 -:10FE8000000000000000000000000400900800A036 -:10FE90000000000000000000000002C00800850013 -:10FEA0008509A0910100A0C1A088C10208014021DC -:10FEB00021C100900000010100004000200100115C -:10FEC0009002410090000000900802000000000035 -:10FED0000000001000880088008200000000000080 -:10FEE000000040410003820411C000110188000598 -:10FEF00000C1041000C00090880200000000000053 -:10FF00000000000000000000000000000288001057 -:10FF1000C08802080000000000000000900101A15C -:10FF20000085C0090083831004820188A0910041EC -:10FF30000289C1C001010001A1010001404000A0EF -:10FF400090009000200400899009888880000000BB -:10FF50000000000000000080000000000000000021 -:10FF6000000000008088001041030888008440A140 -:10FF700004A100C00000000000000080000000009C -:10FF800000000000000000000000000000008000F1 -:10FF900000008000808000000000000000000008D9 -:10FFA000089041A190200020418340410284000537 -:10FFB0000082802183850240410885050820800059 -:10FFC00000808000000000900003002102048000F7 -:10FFD000800000000000000200020000000000009D -:10FFE000000000000000A191830820009141412100 -:10FFF000200810000304001080C080800000000072 +:10F3D00000005555D7D7003CC3FFD714FF300000BD +:10F3E000000000000000000000C000E80C0C7D419F +:10F3F0000000000000000000000000000F001F14CB +:10F4000014CF140CB4B4550000000000A2A2F3F312 +:10F410000F0F3C3CFFEF1000000000005555505509 +:10F42000A0615006000D0000A0615006000D000014 +:10F43000A0610006009D000180610006009D00059E +:10F4400000610005000D0000000000000000000049 +:10F45000800000000000000500613007C0010005C9 +:10F46000000000000000000000000000300000006C +:10F47000000500610006000D0000A061000E000DF7 +:10F4800000A500613006000D00050000000000002E +:10F4900000001061000E004D000100610006000D2B +:10F4A0000000BE14FF0005F30503000000000F5329 +:10F4B000005300000000C707C40400E155E178AA2A +:10F4C00078FF413C4100BABAAABE0000000000002B +:10F4D00000000000000000000000AAEBAAC31C3CD2 +:10F4E0002C2C0000000000000000000000000000C4 +:10F4F000000000000303400000000000C3C34045BB +:10F5000000000000CF0CC3C30F0F0F0F000000005E +:10F51000000000000000000000FF00FFA0AA0000A3 +:10F52000AAAAAAAABE14AF05F5F3F50300000000CD +:10F53000FF53F05300000000F737F434AAE1FFE175 +:10F5400078007855413F41033030003C0000000016 +:10F55000000000000000000000000000FA55FA550D +:10F560001C3C2C2C000000000000000000000000EB +:10F5700000000000000003034000707D7D7DFFFF60 +:10F58000F0FFFFFCBEFC4D4DC3C3FFFFFFFE0000BC +:10F5900000000000000000000000E8FFE8FFF0FFAE +:10F5A0000000FFC30F037D3CFF0F00000000C0C040 +:10F5B0000AFA000000003C3C05AF00000000F0002B +:10F5C000F0FFC3000F553F3C1F14E8E8C0FC0000EB +:10F5D000000000000000000000000000000000002B +:10F5E00000000F9F0F8F00000000000000000000CF +:10F5F0000000000000000000FEAE5404FEFE00000B +:10F60000AA00FF0000003C3C000000000F0F0000BB +:10F6100000000000000000000000000014BE14BE46 +:10F6200000C300FFC0FC50FA7D3C0F0F000000003B +:10F63000CFCF0AFA000000000F0F0F0F00000000EC +:10F64000AAC3AAC3C3FF0F550F001F14E8E8C0C028 +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F6700000000000000000000000FC0CFC0CBEBEFE +:10F680000000AA88FFCC0000FFFF00FF0804010073 +:10F69000BEFF0000000000000000000000000000AD +:10F6A0000000C3C3FFFFC0FC50FA20008800200404 +:10F6B00040032100000421802000200020004000A1 +:10F6C0000000880020082000000220002005000023 +:10F6D0002100100040008800028040058800880555 +:10F6E0000400200002402003C10000030200840047 +:10F6F00088048410200840100900C00488112000EC +:10F700004000C000200020002008C000880203083C +:10F7100021802003859021000109408400004003DE +:10F7200020820880400021002005888009004100D7 +:10F730000000410040000000100200000000000036 +:10F740000000000000000000000000000000008237 +:10F7500000820800200200000002000200000400F5 +:10F7600000000000400000004090400000000082C7 +:10F7700000002100200000000004C0004000110033 +:10F780004000208400400000100021000040108252 +:10F790008440022040C008090884029010024020E2 +:10F7A00000824040A10210904002009000024002FE +:10F7B00000050802210020000502910590020000CA +:10F7C0000000000040090105100400004000000096 +:10F7D00000000040000000000808020803040000C8 +:10F7E0000000020000000008000400050000000006 +:10F7F00000000000000002040000000910808408DE +:10F800000205400940000000008490009041020081 +:10F8100090109010C0008408910000000310048034 +:10F820004000900090090840200000404000000087 +:10F830008204021082844084800820014008000570 +:10F840000008000803408084400485840200C084CE +:10F850000000000400084008000280822002A0018D +:10F86000028200844188000000040090000800002B +:10F87000000000080008000800084088008400100C +:10F88000020000088508808200400004048800848B +:10F8900000840088008800880488109000828440DA +:10F8A0008020C10202820508410002000000800899 +:10F8B00000080041000800000003041000050109D1 +:10F8C0000004040200210003101000080041004160 +:10F8D000000200088808000000100008900504409D +:10F8E0000003000800050005000800200000C040DB +:10F8F00000000000000300210005000000000103DB +:10F900000010020000020103008800000000000453 +:10F9100000040004210510859020034002001021FE +:10F920001008020800098800008002004000004022 +:10F930000000022000100000410241820300210269 +:10F940002082000009040988410808824100000063 +:10F9500021000300008400900000004000004100EE +:10F960000088000003000800410000840000080037 +:10F9700000000000000003A008A000A00084000018 +:10F9800002080800040000824088000208044000C9 +:10F9900041010221000104000040030084018000B5 +:10F9A00000000809080021004108004041820808C1 +:10F9B000040000000000100000021000001082048B +:10F9C000000810108208A004004000200409010073 +:10F9D0000000400900004003C008C00000000040D3 +:10F9E000000000041040084100400805000000002D +:10F9F0000000400010040000A00002004000400091 +:10FA0000000000000000000008000040A00000000E +:10FA100000000003A0000400088500800000901191 +:10FA20004000020004A082004041081100C008000C +:10FA3000000000000041080009000082208400410D +:10FA400003840001414040010000000000404000EC +:10FA50000890100000080084042000831188000032 +:10FA60000000000000002100210000000000000054 +:10FA7000000000A000000000000020008000000046 +:10FA80000000000000000000080000042185009034 +:10FA90004000000040000400080005400020000075 +:10FAA00000C088908040080200000510040000108B +:10FAB0000000009000840088000000200440000343 +:10FAC000C00382091021400220210041C009841195 +:10FAD000A00000000020C02108021004000208005D +:10FAE0000041002100000009C005000000000008DE +:10FAF00004090000000000000000000008002000D1 +:10FB00000000000000002000000000210110012181 +:10FB10008202008000200040004100080008000927 +:10FB2000000208001180000008C0032008910000B6 +:10FB300088041004000000000020000040020800BB +:10FB40000008410811004004830589880500090464 +:10FB500003000090408809200390028400001000F8 +:10FB60001000030000000000000000000000002062 +:10FB700000000002110040844000038400000000E7 +:10FB80000040000000000000000008000000408865 +:10FB90004004000000020204000002002000028273 +:10FBA00008000020088890020000C14182008340C4 +:10FBB0000020000002080000034000004120002156 +:10FBC0001083002100051010080800214121C021E8 +:10FBD0000141080001408203000000030000001101 +:10FBE0000005000040A110030010002100000000EB +:10FBF000000800000041020000080010000800009A +:10FC00002000400200000802A00008001021A0030C +:10FC1000000982028241A1000041000300050000AA +:10FC20000080004004202020100800410300A000B4 +:10FC300040000800000040030005000400410000EF +:10FC4000210221404090200800004010020008845A +:10FC50000090028820400890008800840000002066 +:10FC600000840000000000022000000000000800E6 +:10FC70000000200000000000000000000200000062 +:10FC800000000000000000008000000000000000F4 +:10FC900008000000000100000800000000840000CF +:10FCA00020000020080000010041900000008800B2 +:10FCB0000000080480040090000000000090020092 +:10FCC0000000A011010902110889000101000201D0 +:10FCD0000001000001001000000000000000100002 +:10FCE000000103402020A082820800C00008884054 +:10FCF0000004000000000000000000000500820079 +:10FD0000000000000000000000000000A021A0048E +:10FD1000004188020001010140000000000088014C +:10FD200020000000C0C010900008820420C1011112 +:10FD30001084089101892108A00588820001000033 +:10FD400040000000A020210800A0800200412109FD +:10FD5000910800400000210000000000400509213A +:10FD60000011000821009100000080000080008048 +:10FD700020000080000000000000000000001000D3 +:10FD80008000000000000000000000000000801063 +:10FD90008084000800C0002020210004000400111D +:10FDA000050800080011808000000000000020C14C +:10FDB00021828085809121A083A100C00085401010 +:10FDC0000803802000409000A12011008840028498 +:10FDD000200002004011880041000910C00300000B +:10FDE000002100000000000000418004000000002D +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000800000008000F2 +:10FE10000980090283000200908003009100C10262 +:10FE200090804100820885830000000200808000ED +:10FE3000828002114080C10009002100058010036A +:10FE4000410020004020052008A0820140A0C19070 +:10FE50004108910090008200084090008801C10094 +:10FE6000000000000008000090000400A00800004E +:10FE70000000000000000000000000000000000082 +:10FE800000000000000000000000840010000400DA +:10FE9000C00088021001A120010004080900080028 +:10FEA000C110914090008400C009900090008882A9 +:10FEB000C00089100900004005A002A01100020244 +:10FEC00011090082010000010000024000A082032D +:10FED00008020000410101000101000000001001C2 +:10FEE00000000000000001010001041000110003E7 +:10FEF0000889880000010000C10100000000000026 +:10FF000000000000000000010000000000000000F0 +:10FF10000000000000A000A00010C0880001000147 +:10FF20001001000000010000210001000410000485 +:10FF3000004090C0C01100A1210520C00008008928 +:10FF4000840300C000000100000100000391088943 +:10FF50008521008300200840210003410011004159 +:10FF60008021001000092021410200418009008207 +:10FF7000000800C100000008001020100000000070 +:10FF80000000000000000003000800000000000066 +:10FF90000000000000000000090008800080000848 +:10FFA0000002A00802400010410805412111008014 +:10FFB000000000800080008921A011051184000547 +:10FFC000109020A108A000020405412100081000A3 +:10FFD000200408809008411003902100001108209F +:10FFE00021800800050880028020000080000000B9 +:10FFF0000000008080000000000000000000000001 :02000004001AE0 :1000000000000000000000000000000000000000F0 -:10001000800200400000800000000000000000009E -:100020002102100411804105C12108A09180408067 -:10003000858920A10380A011410821092100080918 -:1000400080000000000080001088094041800420EA -:1000500008000800820000000001000500200000E8 -:100060000000000000000000C1A040090382090157 -:100070000101001000880100C00008A090400200AB +:100010000000000000800000108889800900200393 +:1000200010892188210008034188108903000410E9 +:1000300080108040000000008489880840008241D0 +:10004000C00288840380C0002105030021004020F5 +:1000500089022103A0020500010200200120000006 +:10006000011000040184000102000200200082004F +:100070009000108810081000000000000000000030 :100080000000000000000000000000000000000070 -:100090000000400100000004020000000000000019 -:1000A0000000010301050084000003018240820872 -:1000B00005904009C0048804020101890000010084 -:1000C0000000C00002A088A008000003000000900B -:1000D0000000000000000700000000810000070091 -:1000E00000000000000000000000000000E0070029 -:1000F0000011000000E00700000000000000070001 +:1000900000000000008800080000A0A00420908854 +:1000A000C00000410083019001010041009101C0A6 +:1000B0000000C001202020109000C111A190050077 +:1000C0000901418483204108100001200000010043 +:1000D00000010000000000000000000000E000003F +:1000E0000000000000000000000000000000000010 +:1000F00000060000000000000000000000E000001A :1001000000000000000000000000000000000000EF -:100110000000000000810000070000110000000046 -:1001200000000000000000E007004106000000E0C1 -:1001300000008200000000E000000041000000001C -:10014000070000000000000007000000000000E0C1 -:10015000070000000900000000000000000000008F -:10016000999999900000000000000000C3FF0F66FD -:10017000FCFC7E4200000000F0F0C0663C003C0049 -:10018000FEF9FFFF0000000000000000000000007A -:10019000000000000000FFFFFFFF010381C300001B -:1001A000000000000000000000006F6F0F6FD7FF1D -:1001B000FFD70000220000880008A5C39966000050 -:1001C00000000000000046060000FFFFFFFF0000E7 -:1001D0000000C340C3C30000000000000000000096 -:1001E0000000189918900000000000000000C300F3 -:1001F0000F66C0C07E420000000000004066FC4068 -:10020000FC00F6F9FFFF0000000000000000000005 -:100210000000000000000000DBDB9999090F99FF46 -:100220000000000000000000000000006F0F0F0F32 -:10023000BEFFFFBE000000226611E710CFCF66664A -:100240000000000000000000000006060808080882 -:1002500000000000C3C3C3C3000000000000000092 +:1001100000000000000000000000000000000000DF +:10012000000000000000000000000000000000E0EF +:100130000000000000000000070041000000000077 +:1001400007000006000000000000000000000000A2 +:100150000000000040D046D63C0000000000000037 +:1001600000000000000000000000000099C399C3D7 +:1001700000000000000400C3646604660000000084 +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000006026666000000000000000000007B +:1001B0000000000000003CFF0F99F03CFF66F3C315 +:1001C000000C80B07F4F3C3424343F3F00F00000EF +:1001D00000000000000049D94FDFFF99FFF0000048 +:1001E00000000000000000000000000000000F0000 +:1001F0000FFF0000000000040003666606660000B2 +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:100220003C7EFC3C0400666600000000000000000C +:1002300000000000000000003C000F99F03C006648 +:10024000E7C30018000000003C3424340303FFF02F +:10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E @@ -106566,478 +106566,478 @@ :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E -:1002D0000000000000000000000000C0F0F000007E -:1002E0000000000000007E7E069F0000000000006D -:1002F000000000FFF0F03C3C00FF000000000000A8 -:1003000000242F0F303000600000000000000000CB -:10031000000000000000000000000000F8F8FFF8F6 -:100320003C3C3C3C00000000000000003C3CFFF076 -:10033000C7C7FFFF3CC33CC30000004200002010C1 -:10034000FF6FFF7F0000000000000000F3F3FFFFDD -:10035000000000000000C3C30000CCCC0000F0F09F -:1003600000000000000000001818069F00000000B8 -:100370000000000066663C3C66660F0F000000004F -:10038000000000002000303000620020000000006B -:100390000000000000000000000000000000F8F86D -:1003A000F8F80F0F0F0F00000000000000003C3CA9 -:1003B00066FFC3E7FFFF3CC33CC3000000810000B1 -:1003C000498969F971F10000000000000000F3F3B1 -:1003D0009999040400002424C3C3CCCCCCCC0000E5 -:1003E00000000000000000000038000000A5000030 -:1003F0000000000000001061200F0045000800010F -:100400000005004D00010000200800000000000071 -:1004100000000000000000000000000000000000DC -:1004200000000E3800000000000000000000000086 -:100430000061000B0005000000614007000D000096 -:1004400000614006009D00000561000E000D0000E7 -:10045000A00000000000000000610009050900A0E4 -:10046000000000000000000000000000000000008C -:100470000000000000000000000400040F0F0F0F38 -:10048000000FFF3C00000000000000000000000022 -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B00000000C0330C0142810200000E00B0010D6 -:1004C00000200006AA9000C000900000D454000054 -:1004D00053000000000000000000FF000C0CF3308F -:1004E000B2B20000000000000000000000000000A8 -:1004F00000000000000000000000000000040F00E9 -:100500000F08000FFF3C000020000000000000006A -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:1005300000000000080220804182408000FFE000AF -:100540000000000000000000C000900000FFD4C0C8 -:100550000000FFFF0000000000000000FF000C0C86 -:10056000F330B2B200000000000000000000000004 -:10057000000000000000000000000000000000007B -:10058000FFA03CFFCF0050507F7FFFFF0000000026 +:1002D0000000000000000000000000000000427E5E +:1002E0000F0F000000003F3F24E700000000FCFF6C +:1002F000F6F60000000000000000F3F303030038EE +:1003000000389F9F303F0000000000000000000008 +:1003100000000000000000000000000000000000DD +:10032000033FE7E762666260F303F3030000000047 +:10033000C3FF2727000000006F6F303F663C0FFFB0 +:1003400009090CFC42F07EFFDBDBD0D0F0C0FFC31C +:1003500018DB1BDB00000000000000000600161088 +:1003600000FF00FF00000000030324E7000000007E +:100370000C0006060000000000000000F909F90961 +:1003800000F900F99090303F0000000000000000EC +:10039000000000000000000000000000000000005D +:1003A0000000033F242462666260F909F909000035 +:1003B0000000003C2727000000006060303F663CE2 +:1003C0000F00F9F90CFC42007E0FDBDBD0D0F0C04F +:1003D000FFC318181B1B0000000000000000006194 +:1003E0000006000D00050061000700050000006127 +:1003F0000006000D000500610006000D0000006110 +:100400004006000D000000615007000D00000000D4 +:1004100000000000000000610006000D0000000068 +:10042000000000000000000500614006000D000112 +:1004300000610006000D00050061000000010005DC +:100440001000200800400008A061500E059D00A18A +:1004500080610006009D000100610006000D0000A3 +:1004600082A0D7A000412020000F0F0FFFFFFFFF49 +:10047000B2B2B2B2C0C1E0E100000000C3F000AA15 +:1004800000000000EA2AFAFA00000000FFF5FAF086 +:10049000000000000000000000000000FFAAFFAA0A +:1004A00000000000000000000000AAC2FFFA0000E7 +:1004B0000000555555555F5EFAFA3C7D3F7FF5FDCE +:1004C000557D00000000000000002028303C505006 +:1004D00050D20000C2FAF040FF4F0200FF00FF00C0 +:1004E000EFEF82F5D7F500416161000F550F282825 +:1004F000A0A000C33CFFC2C3E2E300000000C3F0C1 +:10050000FFAA00000000EA2A0A0A00000000FFF526 +:10051000FAF00000000000000000000000000FAA38 +:100520000FAA00000000000000000000AAC2FFFAAD +:10053000000000007D5D55555F5FFAFA00550F5FC2 +:10054000F0FC003C00000000000000002028303CCF +:10055000FAFAFAFAC2FAC2FAF000FF0F4300FF00FB +:10056000FF00CFCF000FCACA000000005D5D7D55BF +:10057000EBC028C00000000000000000F0C3F0C382 +:10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B -:1005B000000000000000B2717171FF001E1E81304A -:1005C000A500C0C0000000000000F0FF0C000A0AF7 -:1005D000000075207F2A0000000000000000FFCF0F -:1005E00000CF4B4B4B4B0000000000000000000010 -:1005F00000000000000000000000000000000C00EF -:100600000C0CA0A03CFFCFCF50507F7FFFFF00001D +:1005A0000000000000000000000000000000AABEE3 +:1005B0000A1EBF83BE8230FC000000100100FFAEA7 +:1005C000AEAEF828F82800000000000000005555E5 +:1005D0003C30000003008082C0C3F0300000000007 +:1005E0001034AAC3AFC3F0FFCACA000A140A0C0C25 +:1005F0003C0028C028C000000000000A140A00AA1D +:10060000FFAA000000000000000000000000000041 :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA -:100630000000000000000000B2713030F000A0A007 -:1006400000B100A5C0C0000000000000AAAA0C0074 -:10065000AA2A303000000000000000000000000066 -:10066000FFCF00CF0F0F0F0F00000000840010001D -:100670009000C000000000000000000000008200A8 -:100680002105010220000400000004008441200034 -:1006900082008402000000000500000088000400C1 -:1006A00020000100200001000003000000002000E5 -:1006B000200090000000000000002000000020004A -:1006C00090002108000040048484000404002008F5 -:1006D0002005000000008200880820000200C00001 -:1006E0008204000004002000100441000000090002 -:1006F000000800824002410000C000C040C040C06D -:100700001000C08240C141C02100000041000084AF -:1007100005000508208402000002200000000000FF -:1007200020400200049002000400000000000000CD -:100730000000000041402000000000000082000096 -:1007400000020082020441004100000510C0C00008 -:1007500040C0410040020002000000024000400092 -:1007600000400082008210021184408400000000DA -:1007700000000009000000000800820000000000E6 -:1007800000000000008090404000020000000000D7 -:1007900000090220000910000000000001200011E3 -:1007A0000000820001000800000005000000002198 -:1007B000A000000010000200001000001002401015 -:1007C00000100202111000028400014000004000ED -:1007D0000420401003000000000084000009000015 -:1007E0000000000000000000000002000000000007 -:1007F00000000084000000000000000000000084F1 -:10080000000000100400000203908000200000405F -:10081000000005840002058800000000020020009E -:10082000000800000000040080020000040800002E -:10083000000000080010410084080009000082093F -:100840008000004100098411008500020401008439 -:10085000804080408001200800080084000000885B -:100860000000001000080000008402840400000062 -:1008700004000005A0088800000800008803880024 -:1008800000008800882188001000002189000000F5 -:1008900000218400820804051008082100000000DF -:1008A00000040000000800000000C108C0809100A2 -:1008B0000000000000000003000000000100000034 -:1008C000010090000308010001038200A008C0039A -:1008D000820000000002000000200821000000004B -:1008E00000210000000000000008000804100400BF -:1008F00090080000000005004100090011001100EF -:10090000000000C02000080000000502000010C028 -:1009100021040082000000100090080000080084FC -:100920000000008500000000000000000200002020 -:10093000040000000000400000000040030040A050 -:1009400000A0080000000800080010A0008800882F -:100950000300034009000402000000002100000021 -:1009600005000040020800002084040008A0800068 -:1009700080002004000200000000000000080000C9 -:1009800000000000000400000885000000040003CF -:100990000008000200000000080084000041000080 -:1009A000004000000000880000000008200421042E -:1009B0002004002000004005A000880084110820C9 -:1009C00008000809100002400902051088C1400013 -:1009D000000308000209010401040504012040008D -:1009E0000010000000200009040482040800082010 -:1009F00000201020882000080000200000000900CE -:100A00004000000000000200000002101140002120 -:100A10000400040100010090000800200090000084 -:100A200000200000200000000000000000840040C2 -:100A300004C0110000910000000803000004090038 -:100A40004100A104800080008001A001A0010208F3 -:100A5000002000000000000020844001209040059C -:100A6000000000000000000011004000090000002C -:100A700005010001008900010040000000000000A5 -:100A8000000000000000000000000010080000004E -:100A90000100000000000000002100030000000031 -:100AA0000008000000000008000000008400820030 -:100AB0000000000004000800000000000800020020 -:100AC000A0008200820482109000C100A1A1090050 -:100AD00082A100418241821108000010000800003C -:100AE0000000000000000000000000000000A00066 -:100AF00000000100000000000400000000000000F1 -:100B0000000000000084000002100000000000004F -:100B10000000408404080004020800820400000071 -:100B2000002000880200000000000000000000001B -:100B3000000000000000800000000000040000A091 -:100B4000800000080000000000004000020040108B -:100B5000C00408080400000041008300038840022C -:100B600009001020040000080008050000880000AB -:100B7000080000A004081108001080000000000018 -:100B80000000000800000221000000000000080230 -:100B90000080080000000080000200000002000049 -:100BA000002100050000000000000002000000001D -:100BB0000021000002080480088090400000A0008E -:100BC0000400A0000800820482008210040884004F -:100BD00083002000A0020000C00008020000040002 -:100BE00000000010008000200000820000000000D3 -:100BF00000000000040000000000000808000002DF -:100C000009C000400000204000C000040040000077 -:100C100021080010000202020404110020880000D4 -:100C20002000000000000004000000002000004040 -:100C300000000000000000040440822020000000AA -:100C4000110040004100804000000400000000014D -:100C5000000004900000082120882088A1040000E2 -:100C600000002088020104200000000000000000B5 -:100C700011044000040020000200410000000000B8 -:100C80000000000000000000000000000000000064 -:100C9000000000000000000000018400410000008E +:10063000A0B400143D013C00300C0000000000009C +:10064000FF0C0C0CF828FFFF000000000000000069 +:10065000000000007F7E0300A0AAF0FFF030F03021 +:100660000000003CAAFFAFFF822000004000040011 +:100670000404880420048804001088022010200448 +:10068000200004102004200420008410400588006D +:10069000200088008400881088048800A0002004BE +:1006A00084002000040088000003C0C02020000453 +:1006B0002003200820000405880020002000880076 +:1006C00000034005840540002000000020080000D1 +:1006D0008885020420040408001184004000C0043E +:1006E00000002120010805090484000141001000D8 +:1006F000C10000010401000500010000110000001C +:1007000004004100000040024108000440000302D0 +:10071000000000004100000200001003000200047D +:100720000982090010001000000000004021404133 +:1007300009024100000200400900000040000000E2 +:1007400000020000410041C04102410041000000A0 +:10075000000041020541100300C004000900000030 +:1007600000000090040104030402A021030400001F +:100770000000004000110088000008000000000890 +:10078000000001090400000800008402104100007C +:10079000000800101000000400000404100000090C +:1007A00008008410000000000000020000000100AA +:1007B0000004C0101005000000100009002008000F +:1007C0008200010082040000040002400440004155 +:1007D00002008209020000090200890409400000A9 +:1007E0000200840004001108000088C0012020825B +:1007F00000820010200820020040008480080002CF +:100800000084008840840004410900840009050038 +:1008100002C000C000900410040820080084048472 +:1008200004822000040000100084098400100000ED +:10083000020800100408000800840088000800086E +:10084000000809080208000800000908400900849F +:100850004088004040084110048409082011108499 +:10086000001000080008000820090008102020855A +:100870000010409004412020880884038808C0406C +:1008800008089003000088032002C00000089002BE +:10089000880000400000082188080000002184082A +:1008A00000000800A04000030000820800080021AA +:1008B000000000210000008002000040000820101D +:1008C0000021900904218800004090109040A02150 +:1008D00000080208A04004401000050802081008A3 +:1008E000008882000000040240030504000020404C +:1008F0001009218800200008410511041000211072 +:100900000088009005100500200000A009C000002C +:1009100000A000000084410000400008004003A047 +:10092000000000000008001010000082000000001D +:1009300000200000210000004140830004820000EC +:10094000110008000010000021001004040800013C +:10095000080203008300001120A141401041000162 +:10096000110303040000088410000500028508A09C +:1009700080118000000482000405000302000200D0 +:10098000840908000011080900008811004108804E +:1009900082410400102082000800A00040020821CB +:1009A00004210410000400008200A00000000000E8 +:1009B000A000080000000405040009800510404064 +:1009C000C0000800040011080040C00208020441F1 +:1009D0000800820040A1080000110420400020040B +:1009E00010040808008008410020C0414011042084 +:1009F000C120092000A00002000889042000098805 +:100A00002084094000A011002088200000840908EB +:100A100021080000080002900008202004002000A7 +:100A2000001000000000000100000008004000A0CD +:100A3000000008100000000088000200042082006E +:100A4000000100000000000002A1000102010200FC +:100A50002100000000004140009041C00040000023 +:100A60000809801141C100080000090000849100BC +:100A70008383200110910021840004210020A01014 +:100A80000040000082412000080200042000000411 +:100A90000005000500020820000000000000000022 +:100AA0000000000000000000A0880000000000001E +:100AB000000000000003C000000002000008020067 +:100AC00000200000A0000003C0008200000304001A +:100AD000821108400000C000000500001000100056 +:100AE00008000000020040402000100002040840FE +:100AF0000040100410402008200809A0808821919F +:100B00000084058820404010051008821090038260 +:100B100010880988009011000900040005000008F1 +:100B20002008000000A009A0004000040000000010 +:100B30000000050000000000000800008020000008 +:100B400080100001008400000900218800040020BA +:100B500040040010030100080004400008040000E5 +:100B60004004218200008500002083000410A102BF +:100B700020030001800180018001C1010004880080 +:100B800084000000000000800041000500200220D9 +:100B90000020011000020020010082020008001164 +:100BA000000000001000000390000800000000009A +:100BB0000400000008200200A000820000000000E5 +:100BC0000400000010000041012190050010C00346 +:100BD0000000082101000041C041000002000000A7 +:100BE00084000000008800000400200020000200B3 +:100BF000C0000003820001000004200800000488F7 +:100C0000110204020902200200104104040420849D +:100C10008290119008400301030410042001000099 +:100C20000000020400000000000000100288110013 +:100C30002000000000080000008800000000000004 +:100C40000000A1002000020000C00200000000001F +:100C5000020000001110020020100010098820C0BE +:100C600000000000000200400000110080000804A5 +:100C7000808200C00040000810000321A01000087E +:100C80000000009000A0A0A00001010110000000E1 +:100C9000000000000200000000010100100100003F :100CA0000000000000000000000000000000000044 -:100CB000000000000000000000004000008490825E -:100CC000000000000000000000001109410200883F -:100CD000880505052003A082A0A01003020489A1B5 -:100CE000C020A0030100000400000000000000007C -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000204103008308E4 -:100D200000090000000000000000000000000000BA -:100D30000000000000000000000000008000000033 -:100D40008080000000000000000000008910A191D8 -:100D5000008300908982A1C089050003C0C0A088DB -:100D6000020300040084100500C000000000000021 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000200100041 -:100DA000000008110000000000000000000000002A -:100DB000000000000020000000000000000000040F -:100DC0000009800000000000800300008000118006 -:100DD0008221850809039000A000110388908000FB -:100DE00000210009800080008400042140000000F0 -:100DF00000000000000000000000000000000000F3 -:100E000000800000008000000000000000000000E2 -:100E100000000000000000000000000000000004CE -:100E200001000000010000000000000000000000C0 -:100E30000000000000000001000000000000880029 -:100E4000840104A1C000000000000201000008208D -:100E500002041100A00005018940A00004001183D4 -:100E6000A0000400080004C0028202009101820078 -:100E70000000000000000000000000000000000072 -:100E80000000000800000004000000000000000056 -:100E90000000000000000000000000000000000052 -:100EA000000040008800000000000000000000007A +:100CB0000000000000000000000000000000000034 +:100CC0000000C0C000020040102000000000000032 +:100CD000000000C000000000000000C00040000054 +:100CE000000000C000000000000001C10001090177 +:100CF000000000C001004002000000C10400090023 +:100D000000880000000011000000001141080011DF +:100D10000011000003008000000004414021004059 +:100D200000030000000000000000000000000000C0 +:100D300000000000000008000000000000000000AB +:100D400000000000808000000000000000000000A3 +:100D50000000000000800000000000000080000093 +:100D600000000000008000000000000011C1111010 +:100D700010090011008008000080000040C18503B8 +:100D800090400089804000100080800082804100F7 +:100D900011118840000000000000800000000000E9 +:100DA0000000000000000000000000000000000043 +:100DB000000000000009000000000000000000002A +:100DC0000000000000000000001000008000000093 +:100DD000000000008000090009100800C1000000A8 +:100DE0000000000080000000000000008000108073 +:100DF0000321C000C19100000000000080000280BB +:100E000009400300C1051000C0010084904008C0E3 +:100E1000A0008201C101900004008200C000000017 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E40000000000000000000000000000088080012 +:100E5000000000000000C000100000010100C100FF +:100E6000000000000000C000000000000000C00002 +:100E7000018800008400C188000000000000C0005C +:100E8000820200820100C18490040090009002025E +:100E9000000001000101000100000001000000014C +:100EA0000000000020000001000000000000000021 :100EB0000000000000000000000000000000000032 -:100EC00000900000C09000A00000000000000000A2 -:100ED0000000C0040140001108C0400300C0A1A1EF -:100EE00003C1044000899040C0C0000401A000A0DC -:100EF0000082000000000000000000000000000070 -:100F0000000000000000820000000000000000005F -:100F100000000000000000000000000000000000D1 -:100F2000000000109100800000040000000000009C +:100EC00000000000000000000000409000081090AA +:100ED00010C000000000000800008800000000882A +:100EE00000C000040000000000C00003000100007A +:100EF00002C140000090890001C100010010000102 +:100F000000C000010000208801C1800000000080B6 +:100F100080800002411105051011002000080041E9 +:100F200000020041092020030041000000000000F1 :100F300000000000000000000000000000000000B1 -:100F400000000000000080800000000000000000A1 -:100F50000000050000A040041105048980A04103A1 -:100F600085A020888082219004108082002010C0FB -:100F700041410004000000000000000000000000EB -:100F80000000000040000000000000000000000021 -:100F90000000000000000000000000000000000051 -:100FA0000000000021800205090003080000000085 +:100F400000000000000000000000000080000080A1 +:100F50000000808000000000000000000000000091 +:100F600000000080008000000000008000A000025F +:100F70000000808880404083850209C10008008508 +:100F80000040008520080511418409C1801000C07F +:100F90000000000011001191038010100002008079 +:100FA00000800000000000000000000000000000C1 :100FB0000000000000000000000000000000000031 -:100FC000000000008004800200000000000000001B -:100FD00000808080800041C02190A08008034100F3 -:100FE00040022100020380028091800080001004F2 -:100FF00004A141004040000000000000000000008B -:1010000000000000000000000002000000000000DE -:1010100000000000000000000000000000000000D0 -:10102000000000000000014000000000010100007D +:100FC0000000000000000000000000000000800998 +:100FD0008010800080000000000000000000800001 +:100FE0000000000000408000000080000000800041 +:100FF000000000000000C1840500200003118000F3 +:10100000008080000000C105050805004011900126 +:101010008420A0A00000009001040108000000014D +:1010200000080010000000000000000000000000A8 :1010300000000000000000000000000000000000B0 -:10104000000000000000C00120C10400C00000003A -:101050000000A0820808080091A0C003A0101101A0 -:101060000140008501C00100C001A00402C00400CD -:101070000190010200820001000000000000000059 -:10108000000000000000000000000001000000005F -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000E00000000060 +:1010400000000000000000000000000000000000A0 +:10105000C0004020041004000000000000900000C8 +:10106000C020000000000000C0000000029000004E +:10107000C000400000200000C1C1000001000000CD +:10108000C000000804000000C1A000000100000032 +:10109000000000E007000000000000E00000410048 +:1010A0000000000000000000000000000000000040 :1010B0000000000000000000000000000000000030 -:1010C000000000E000000000000000000700001128 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000E007000000001100E0070021 -:1010F0000041001100E007000000000000000000B7 -:1011000000000000000000000000000000000700D8 -:1011100000000000000000000000000000000000CF +:1010C000000000E000000000000000000000000040 +:1010D0000000008100000700420000000000000046 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000810000E000008F +:1011000042000000000000000000880000E007002E +:10111000000000FF00FF30303F3F000000000000F3 :1011200000000000000000000000000000000000BF :1011300000000000000000000000000000000000AF -:101140000000000000000000000055FFF0F0FFFF6D -:1011500000FF000000300030000000000000C0C0B0 -:10116000FF00000000000000F0AA004100C30F0FC4 -:10117000AA00F3FF00000000301000000000000093 -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F +:10114000000000000000000000000000000000009F +:1011500000000000FF3CAAF03C3C00FF0000000043 +:1011600000FF00FF0000FFFF000000FF0000F0F0A4 +:1011700000003C3C000000FF00003C3C0000FFFF82 +:101180000000F0F00000F0F00000F0F00000FFFFC1 +:10119000000000FFA0A0AFAF303F303F00000000D4 :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F -:1011C00000000000000000000000000000FFB4B4B8 -:1011D000C3C300C3000000FF00FF000000000000C8 -:1011E000C000DF00202000000000F0AA0F41C3C3B0 -:1011F0000000AA00F0FF0000000030100000000016 -:1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000000BE +:1011C000000000000000000000000000000000001F +:1011D000000000000000003CAAF0AAAAF0F0000005 +:1011E000000000FF00FF00000000000000FF000002 +:1011F000F0F000003C3C000000FF00003C3C000020 +:1012000000000000F0F00000F0F00000F0F000003E +:101210000000000000FF0F7D0F7D2D2D2D2D000003 +:1012200000005F0F1F1F000000003C5555550000D7 :1012300000000000000000000000000000000000AE -:101240000000000000000000000000000000C0C01E -:10125000C0C05757FF030000000000000F0F0A0A2C -:10126000000100000071FF8EAA55AA0004100000C2 -:10127000FFC37DEF0F0F00000000F0F02AAAAAAA1A -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E +:10124000000000000000000000000000000000009E +:1012500000000000000000003C3C0F0F55555555A4 +:1012600000000000FFFF0000FFFF00003C3C00000A +:10127000FF000000FFFF000055550000FFFF0000C9 +:10128000FFFF0000FF0000000F0F00005555000099 +:101290003C3C00003C3C00000F410F41AFAF050556 +:1012A0000000000055001414000000003C550F55CC :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E -:1012D000C0C0C0C05757FF030000000000000A0A4A -:1012E0000A0A00020000000CFFF329292929014005 -:1012F0000000FFFF7DEF2F2F24200000F0F02A2AAE -:10130000AAAA000000000000000000000000000089 -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:10133000000000610003000D00000000000000003C -:101340000000000000000000000000610006000D29 -:101350000000A00000080500000800008000000058 -:101360000000000080610006009D00000061000D8B -:10137000009D00A0A061003F0099000100610038BD -:10138000000100000000000000000000000000005C -:101390000000000005000A08050000A00000000091 -:1013A000000000000000000000000000000000003D -:1013B0000000000010101010FFFF000000000000EF +:1012D000000000000000000000005555FF00FFFF67 +:1012E00000000000000000000000000000003C3C86 +:1012F0000000FF0000000000000055550000000045 +:10130000000000000000FF0000000F0F0000555516 +:1013100000003C3C00003C3C00000061000F000D60 +:101320000000006100000001000500610006000DE2 +:10133000000500610006000D000000000000000034 +:101340000000000000000000000000610007000D28 +:101350000000000000000000000000001000203825 +:1013600000400000000000000020120240E3800660 +:10137000002D9202408280000020920240E380060D +:10138000002D920240828001C020920240E380063C +:10139000002D920245828A09C52092A20000000019 +:1013A00000000000BF3FBE3C30BA30BA0000000071 +:1013B000C300550F00000000FFF03CAA0000000031 :1013C000000000000000000000000000000000001D :1013D000000000000000000000000000000000000D -:1013E000000000000000EFFF410000000030F5F5B4 -:1013F0003F30005100A2000000000F0F0F0FFF0050 -:101400005C5C0000FFFF0000000000000000000026 -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:1014300000000000000000000010BEBE14140000F8 +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000C0C0F0F0F0FFF00287DF5F50000FA +:101410000000FAF0F0F03C55FF0F00FFAAAA000010 +:10142000000000000000AF0FAA0030BAFFFF00006C +:101430000000C3FF550F0000000000F03CAA0000B0 :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C -:10146000000000000000000000004100000000003B -:1014700005053F305151A2A200000000C3C3C3D7ED -:10148000FF005C5C3CF03CF000000000000000004D -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B0000000000000000000BFBFAFAF0000000050 +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000C0C0F0F55553C3C287DA0A01F +:1014900000000000F252F0F03C55000F3C3CF0F030 +:1014A0000000000000000000FFAEFF0CF8FF28FF66 +:1014B0000000000000000000FF3CF72000000000DA :1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C -:1014E00000000000000000000000022A28000000A8 -:1014F0000C0C4040BFBF00A00000440000440000AE -:101500000000FF55AA0000FF00FF000000000000DF -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000BFBFAFAF0000CF -:101540000202000000000000000000000000000097 +:1014E00000000000000000000000000000000000FC +:1014F000000000000000287DF5F50000000000005D +:10150000000000000000000000003F03D7D7F3F305 +:1015100082BE0000000000000000FFAA2D2D3CF05C +:10152000AAFF0000000000000000AEAE0C0CF8F8AE +:1015300028280000000000000000C300F720000081 +:10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B -:101560000000000000000000000000002A2A000027 -:1015700000A50C8D40EABF1500A000088800008877 -:10158000000000005F5F0A0AA0A0AFAF00000000EB -:10159000000000000000000000000000000000004B -:1015A0000000000010000000A18001800080030006 -:1015B000888021804180858005800080009189801D -:1015C00082802088A00084008400000010000400B5 -:1015D00004002000000004000400840004000080D7 -:1015E000208041080003400084000000000000004B -:1015F0000000C0002000880005004180001000802D -:10160000018221004002C000000082041008000096 -:10161000000800000000880000000205100084009F -:1016200084008800890000000000041008084008B9 -:10163000A0000008400420404020A002001000400C -:101640004004090820034000000000000040002082 -:101650000000000200020000000000000000000086 -:10166000000400082003000000000000000040000B -:1016700020000400100000000000C004400400012D -:101680004140080210004101000200000908000466 -:101690000008000440020004400000022000000294 -:1016A0000000108410002000000000000000000076 -:1016B0000000000000000000000400000000000026 -:1016C0000040000000000000020000000000A00038 -:1016D00000000000000000000000000000100004F6 -:1016E000000000000004C00000000000000400042E -:1016F00000000000000000000000000000000000EA -:1017000000000000000008000008000000000004C5 -:1017100000000040840000000000000000000009FC -:101720000041000400000400000000000000000070 -:10173000000000000000000000080000001000048D -:101740000010000800000000000000000000000081 -:101750000000000000000000001000000010000069 -:1017600000000088000000000000000000000000F1 -:101770000040000000080010000008080000000001 -:101780000000020020000000000000000000000037 -:1017900000000000000800000000008400000000BD -:1017A0000000000000000000008204C000000004EF -:1017B0002140000083001100111009004080020840 -:1017C0000200400010100400C010200090400000F3 -:1017D00084000009400000401000000008000000E4 -:1017E00008000011000000000400080000000000D4 -:1017F000880000000000000000000000040000005D -:101800008800010004009000830082001080000026 -:101810000800840000000000000088000000900024 -:10182000080000000000020000000009900800000D -:1018300021A0900000020200C00020008220C01001 -:1018400080008300A10000400800000084000084A4 -:101850000000000000000000000008000000000080 -:101860000000000000000000000000000300000075 -:101870004000000000004100400040000000002047 -:101880000000080004100810212020000020C004DF -:101890000000000041840900000000202100000039 -:1018A000040000000000000021000084050000404A -:1018B00000000021020000000000A020080000003D -:1018C0000821081000400000080010000804000073 -:1018D0008205820008080000820000000000044128 -:1018E0000041081100000002000008110011001161 -:1018F00000000811824104020000C0000800080036 -:1019000000020000000408090020000000000000A0 -:1019100000028800000900110000A0040000080077 -:10192000080200099000A040000090000000400064 -:10193000000020000900800000000000040000A05A -:1019400000000000000000000004000200A00020D1 -:101950000000000000000000002000000000110056 -:101960002000000000C000000000118811002000CD -:1019700000000000000020C00020008800000000DF -:10198000100000000000000009000020000003001B -:1019900000000000110000000000020040000000F4 -:1019A00021000000000000880488000021000000E1 -:1019B0000000002000050000010500000000A180DB -:1019C000010001000141010501009000000001003B -:1019D00000000000000000410000000000000000C6 -:1019E0008200000000000000000000001000000065 -:1019F000000000800000000008000000000000005F -:101A00008200A000000000000000000000000000B4 -:101A100000000000080000000005000000000000B9 -:101A20000000840008000000000000110000900089 -:101A3000000000000800000000004000000000005E -:101A400004100420040010002000100000002040BA -:101A5000080000000040000000000000000000003E -:101A600000080000040000C00000000000000000AA -:101A70000000000003020000000000000000000061 -:101A800021040800080020C00002000003000890A4 -:101A900008000304030800081100212000000500CD -:101AA000000000000000000000000008000000002E -:101AB00000020088000000820000201088008800DA -:101AC0000010200000211000000000000011004064 -:101AD00000090040000000000800000000000000B5 -:101AE000A0088200000000000000000002000000CA -:101AF000000020000000000000008400000008003A -:101B00000000000040000000000090000000020003 -:101B10002000000082000000000008000000C0005B -:101B20000000020000100221000008000000000078 -:101B30000000820010000800900005040000000072 -:101B40000000200000000000000000000000200055 -:101B5000000000000000090000000000000000007C -:101B60000000000000900000020800C0000000001B -:101B700000C000002004000000000000000021045C -:101B80000400000011000520000005000000000016 -:101B900000000000004000020302202000000000BE -:101BA00000880000000010004000040000040090C5 -:101BB0002100002000000500000000000001C0001E -:101BC0000000C18301010000008908A0C000C0001E -:101BD00000C0C0820000000101A010000000000051 -:101BE00000000000000000000000000000000000F5 -:101BF00000C00000000000000084C00000000000E1 -:101C000000000000000000000000000000000001D3 -:101C1000010000C00000010100010040A000000020 -:101C200000000000000001000000000000000001B2 -:101C3000010000C000000000000000000000114191 -:101C400080410000C18340080021114080008003D2 -:101C50008541008080800004004002048000000074 -:101C60000000000000000000000000000000002054 -:101C700005000080000000000000058080000000DA +:10156000000000000000000000000000000000007B +:101570000000000000000000287DA0A00000000086 +:101580000000000000000000000000003F031414F1 +:10159000303082BE000000000000000055002D2DFC +:1015A0003CF0AA0004000420048004002002201063 +:1015B000202020080440040405022000C000201060 +:1015C00020002004840020000400200020102010AF +:1015D0000421C0002000200520000410200020006D +:1015E00088898980000320002000840020002003D7 +:1015F0008403880320002000200821042010048098 +:1016000021022108410288008800C0002002200831 +:1016100020022000880820002000840020002000F4 +:10162000200000C0890200000001204021000000CD +:101630000400000121042003090240000402080004 +:101640000900000209002002000000400000219073 +:101650000002219004000002009000C000000990E8 +:101660004100400820080000000240000402000081 +:10167000404000000000009041C0404140904102C5 +:101680002040200308032091100041000900400081 +:101690004002000400400002050200820008100021 +:1016A00000000040000810040900000002000000D3 +:1016B0000110011082000000008800048400000472 +:1016C000000504000000000300000000000000000E +:1016D0008400040002000003000000050000000078 +:1016E00000000000000000000000000000000000FA +:1016F00088000000000008030200001040004000C5 +:101700000200000040100810200000000000000946 +:101710000000000000000000000000410000000088 +:10172000040000000002100002008208000800000F +:101730000088020020091084040000100084008446 +:1017400000084082108404000000000800080084A3 +:10175000008440080084000805C0000400000088E0 +:101760000084008400100000001000000010000839 +:1017700040080008008800082010000000848084D1 +:1017800080840008008489098008848400882008F7 +:10179000001005080984051009840084008800C031 +:1017A00000C00090000000081184000804A1848299 +:1017B0000921090820214020208040214083040481 +:1017C0001091010410080180049000880000A0021C +:1017D0008805C01182210008000000000000000000 +:1017E00000090008000310080421108200000021F5 +:1017F00000101021000200108800000840080008B6 +:1018000090880508012140000400840000000021A8 +:101810000021C0210041000540008800C0030008ED +:101820008808004090210205840000082005030874 +:10183000030290081082410883418308800010044D +:101840009184832008A080204004800800100004B8 +:101850004190000804080000000000C000000400DF +:1018600000000000000010000082080008020000D4 +:101870000000000000000000008220900090009016 +:101880004100092004000890410003000000030803 +:101890000000210000881100000000081000400036 +:1018A000030000000308000000000020082088005A +:1018B0004000A000A10000001000C141000082C053 +:1018C0000000000000004000020000000000401086 +:1018D0000000900008050000040000000800084017 +:1018E00000008200820008100000000004000000D8 +:1018F000000000008200900000004000C000400096 +:1019000040002000820020000000821184408200FC +:101910000800080204000800880000110400000408 +:101920000800200000002000004104000002A02068 +:1019300040000888000020844010A10010C000046E +:10194000000400000000031080008300000000007D +:1019500085000004000200000000050010000000E7 +:101960000000000000000000000000000000000077 +:101970000000000010200000030000001100000023 +:101980000000000080000010800000000002000441 +:101990000000000020900000000000A011000000E6 +:1019A00011C0000002000900080009081000111011 +:1019B000200091000040C0A111C1A110000301034B +:1019C0004040110001C101C100910009084101809E +:1019D00004800191000000410000000000000000B0 +:1019E00000000000000800080000000000000000E7 +:1019F0008200002100000008000008000021000013 +:101A00000400000000000080410082040041000446 +:101A10000080004003008200000000000010000071 +:101A2000000000000000000800080021001000086D +:101A30008205000000054104001040200800094014 +:101A4000028400080208400840040840050088009D +:101A50001010210404040000000000002100000018 +:101A60000400000021000000000000000000000051 +:101A70000000000000000000000041000002030020 +:101A800000400800202000000940408800880088AD +:101A9000000000100300100000040000000000001F +:101AA0000300030000400900000000A000900000B7 +:101AB00000A021C0000000002140000340110000F0 +:101AC00088200004000401899000204020089040F4 +:101AD000000802080004100900000004000082024F +:101AE00000000000001000000000000400000000E2 +:101AF00000080005000800080000000500210000A3 +:101B000000000008000000000000000010000000BD +:101B100090000800A000000000000000004100400C +:101B2000000400008200000000000005A00010106A +:101B300082080011001000210000C00020042108CC +:101B40000000000000002000082008000001C1047F +:101B500000000000800005008084000000000000FC +:101B600000900004000040002090110005002008B3 +:101B70000000100000000000040000000000000051 +:101B80000000000000000900000000000000A08824 +:101B90001100008200000900000000002104000084 +:101BA0000000000000000000000000000000030032 +:101BB000000000000488000020000900010000006F +:101BC000000009A1000100010083C0100400000111 +:101BD0000040C0080000A0010183100000000000C8 +:101BE000000000010000000000000088000101006A +:101BF0000010A0A000000000000100000000000094 +:101C000000000000000000000000000000000000D4 +:101C1000010000C000000000000000A0A0000000C3 +:101C2000000000000000000000000000008800012B +:101C30000900008210100000000000010000414176 +:101C400009210000C1410204004003058080891180 +:101C500004400080008000050002408880000000F1 +:101C6000000000000008000000000011110000400A +:101C70000300000000000000000000410000000020 :101C80000000000000000000000000000000000054 -:101C90000010020000800000042000040480000006 -:101CA00000000000000000004100000000000000F3 -:101CB000052020000080000000000000000000005F -:101CC0004100214100C1000005410841000000041D -:101CD00082C10041004103000200C0410084002095 -:101CE00000001000000000000000000000000000E4 -:101CF0004000C10000080000000000000000008457 +:101C90000310100000800000000400110900000083 +:101CA0000000000000000002000000000011110010 +:101CB0000040830000808000000000000041000020 +:101CC00010001003004000004040414100800082AD +:101CD0008482008200410400A000054100C100048C +:101CE00000002000000000000000090000001000BB +:101CF00009008280000020808000000000008040F9 :101D000000000000200000000000000000000000B3 -:101D100000000300800000000000410084410041F9 -:101D20000040000003000000008000008000000070 -:101D30000000900083000080000000000000000010 -:101D400000410000000100C100000101010100820A -:101D5000000141C1C08300010100C00041010084B5 -:101D60000405000001000000000000000000000069 -:101D700000009000824000000020400000000000B1 -:101D800000C0000000000100000000000000000092 -:101D9000000000008200020400000000400040013A -:101DA0000001000100000100000000C00000200050 -:101DB000000000001100212000040484A0000000A5 -:101DC0000000000100400001C1830000000000008D -:101DD0000010C00000840000C140000000000000AE -:101DE00001000100000000000000000000000000F1 -:101DF00000000000000400000000000000000000DF -:101E000001000100000000000000000000000000D0 -:101E100000000000000000C0000000000000000002 -:101E200000010000000000000000C00000000000F1 -:101E300000000000000000020000C00000000000E0 -:101E400000000000000000800041C183000000008D -:101E500000210905000000410041C1C1000000004F -:101E60000021030441000000000000000000000009 -:101E700000000000000000800000000000000000E2 -:101E800000004100410000000000000000000000D0 +:101D100000001100808000000000C0008903000066 +:101D20000009000040000000000000000800000062 +:101D300004008900840000114000800000000000C1 +:101D400080400100000100C000840100010100404A +:101D5000004140C19011000101004100880100854F +:101D60008888000001000000000000000000000062 +:101D700000008200100800000108080000000000B8 +:101D8000C001000000000100000000000000000091 +:101D900000000000080020820000002003008200F4 +:101DA000000000040000000000000000000001002E +:101DB0000000000040001084000001020800000044 +:101DC0000000C00100080000908200000000000137 +:101DD00020A11100000300000185010000000000A7 +:101DE00001010000000000000000000000000000F1 +:101DF0000001040000840000030001000000000056 +:101E000000010000000000000000000000000000D1 +:101E100000000000000000200000000000000000A2 +:101E200000000100000000000000000000000000B1 +:101E3000000000001000000200008400000000000C +:101E40000000000100000080000403C10200000047 +:101E50000020050384000084002108C04100000028 +:101E60000009200800000000000000000000000041 +:101E7000000000200002000000000500200000001B +:101E80000000004100000000000000000000000011 :101E90000000000000000000000000000000000042 -:101EA000000000400500000000000000800000006D -:101EB0000000000000000000008000008000000022 -:101EC0000000000000000000C18000418089000087 -:101ED0000802000011042005C1C1008080800000BC -:101EE00020040004800002200010800000C10000D7 -:101EF000000000000000000000C100000000000021 -:101F0000000000208000032000000020800000C1AD +:101EA000000000040200000000000000000000002C +:101EB000000000000009000900000000040000000C +:101EC000000000000041000041408041808500008A +:101ED0004100000810C040091040008080800000D0 +:101EE00002410004800003C00020800000C1000007 +:101EF0000040800002000000004180000009000056 +:101F0000000000000000200800000020800000C148 :101F10000000000000000000000000418000000000 -:101F2000000020410000808040840000800000C14B -:101F30000000000000000000000000800000002001 -:101F40000000000000000000000041C0880182087D -:101F500000000100C00084200104400900C040C00E -:101F600000000101000184880105000120000040FB -:101F7000000000000000000000000003400000001E -:101F80000000000000018400018500000001200025 -:101F900000400000000000000000000000410400BC -:101FA000000000000101000040100104000040009A -:101FB00000C10000000000000000000000C0A00000 -:101FC0000001000000000000000000000000000010 -:101FD000000048420000000000004800811200E0BC -:101FE00007004842000000000000484200000000D6 -:101FF000000000000000000000000000810000E080 -:102000000000480000000000000000420000000046 +:101F2000000020000000000040050040800000C1CB +:101F30000000001180000200000000008000000985 +:101F40000000000000000000030504A182011085CC +:101F5000000000009000898500C0A021001008C08A +:101F60000000010100004082010500012000004046 +:101F70000000000120008400000000054000000077 +:101F800000000000000000000185000000012000AA +:101F900000400000000000000000000000211000D0 +:101FA0000000000001000000C08801820000200045 +:101FB00000400000000020001000000000844000ED +:101FC000000000000000000000000082000000008F +:101FD0000000480A0000000000004812821200E0E1 +:101FE00007005042000000000000484200000000CE +:101FF000000000000000000000000000811200E06E +:102000000700480000000000000000000000000081 :10201000000000000000000000000000000081003F -:1020200000E00000480000000000000048420000FE -:102030000000000000420000000000004800840092 -:1020400000E00000604200000000000000420000CC +:1020200000E0000048000000000000000000000088 +:10203000000000000000000000000000000041124D +:1020400000E00700000000000000000000000000A9 :102050000000000000000000000000000000000080 :102060000000000000000000000000000000000070 :102070000000000000000000000000000000000060 @@ -107054,209 +107054,209 @@ :1021200000000000000000000000000000000000AF :10213000000000000000000000000000000000009F :10214000000000000000000000000000000000008F -:102150000000257B000000000000000000000000DF +:102150000000252B0000000000000000000000002F :10216000000000000000000000000000000000006F -:10217000DEA4747B000000000000000000000000EE +:10217000D4A4257B00000000000000000000000047 :10218000000000000000000000000000000000004F -:10219000DE2E0000747B0000000000000000000044 +:10219000DEA40000747B00000000000000000000CE :1021A000000000000000000000000000000000002F -:1021B0000000DE2E747B0000000000000000000024 +:1021B0000000DE2E257B0000000000000000000073 :1021C000000000000000000000000000000000000F -:1021D0000000DE2E60DE034000000000000002313F -:1021E00040000000000000000C4000000000000063 -:1021F00002C07B0661F603400000000000000231CF -:10220000E0000000000000000C40000000000000A2 -:1022100002C06F860000615E034000000000000005 +:1021D0000000DEA460DE03400000000000000230CA +:1021E00000000000000000000C40000000000000A3 +:1021F00002C07B06612603400000000000000230A0 +:10220000A0000000000000000C40000000000000E2 +:1022100002C064860000615E034000000000000010 :102220000231E0000000000000000C40000000004F -:10223000000002C07A8661560340000000000000E2 -:102240000231E0000000000000000C40000000002F -:10225000000002C06A860000000300004000000089 -:10226000000004000000002000002000000000002A -:102270000000000400004000000000000400820094 -:102280009000200504000000000020004000000431 -:1022900000000200040000030000880002000000AB -:1022A0002000200020002000880041004000200481 -:1022B0000400C00020004000000288002000000050 -:1022C0001082200020108410000441008800880043 -:1022D000100020002000000400004000400000002A -:1022E00041000000000000000001000000000000AC -:1022F0001000000000910000000000000002000437 -:102300004000000000000000000200080000000281 -:102310000002090000900090000000000000000092 -:1023200000C000000040210000400000200021000B -:1023300021020400000000020000414041000004AE -:10234000400200400000040540052100080240044E -:102350000090000000022100000200050040010082 -:102360000000004000000003000301000200828022 -:1023700008100100000000C08300020000000000FF -:102380000008000002050141000000830000000574 -:102390000000020301040302041000000200001107 -:1023A00000048200004000000002024000402000C3 -:1023B00003902102400040884004400000000000DB -:1023C00000418205020090000209090082004108D4 -:1023D00040104009000420104004400000000004A8 -:1023E000040200000500050402000008048400083F -:1023F000002000091000000000020200000000049C -:102400000004008200828000020000080802000828 -:1024100000A0000200082010A00900040000041021 -:1024200000080082000804110500021100410009A3 -:102430008284A002A0C0C108804085828408000870 -:10244000200800000008C00800000004880800847C -:10245000880885088008108380088201A008000091 -:1024600000000080000800080000000300A0000930 -:10247000000200000040000900102009082104218A -:102480000021000000020000000000000021000800 -:102490000005020501210000002190040021000038 -:1024A0000000112100200111100000050400400867 -:1024B00090210008000840080000C000A0000000B3 -:1024C0000021024000080000001100000000000090 -:1024D00000080000000000400004000000040004A8 -:1024E0000000008400202100000000000000002106 -:1024F0000000000000C0000000000001400080203B -:102500000000000000000000410000000000210069 -:1025100000000000800002004000000000000000F9 -:102520000000000002004000020000000000000067 -:102530000000410000000004210010840000410060 -:102540002100000000000300000000004100000026 -:10255000000000001000080000004101050000011B -:1025600020010000000000004000000340030000C4 -:10257000834000800080011000000000C0100008AF -:102580000000001000000000A000000082410011C7 -:102590000002001110000000000220042004A0042A -:1025A000200400008409900010800802C040004010 -:1025B0002000004184008200080400002011200552 -:1025C00020402010200002001000A0111000004048 -:1025D00001200000A0800409C01008800002014012 -:1025E0000040101020040000218400A000A0000082 -:1025F00003A00400002000100400000000001105EA -:1026000000040008000041A0410000A000000000FC -:10261000050800010082058440024008A120C18312 -:1026200000409000000020840010404041850300DD -:102630002101200811000300410021A12100832075 -:1026400089909100A00000000000000000000888B0 -:1026500000000808000000028040038300044101DC -:102660004000008400000020200000000011000055 -:10267000008000000402900800400400A011001037 -:10268000000010031000880010020000000000008D -:1026900000030003880000051040A0008211844060 -:1026A00000000000010500000021A0000000C000A3 -:1026B000000082008200000000000000841104007D -:1026C000000090110040A00000000011A0000000D8 -:1026D00000000000A0000800000008210000020423 -:1026E00000000005000000000000000000C0110014 -:1026F00000000010000080C00000000080000020EA -:1027000000200000000000C02108000000000000C0 -:1027100000000000000000000000000100000500B3 -:102720000001000000004000000008000000000060 -:1027300000000000000000000000208800000000F1 -:10274000030000040000000110000000000004006D -:10275000000000040800000000000020000041000C -:10276000830100000000000800400003000004880E -:1027700000094002401000030800050500000300A6 -:1027800000400808000000100285008002080008D0 -:10279000080302000000200500008910000504085D -:1027A00000040084200400840108000000084000A8 -:1027B00000210010820800028800820520002040CD -:1027C00040000540000000090809090000402040C1 -:1027D0002000002040008200000020000010820441 -:1027E0000004A0200008000400210004008409085F -:1027F000802003002085022000000084C00411A076 -:1028000010080000200020080001804000408010D7 -:1028100000840000890821202088008402C00982E9 -:102820000000008411042008090420C000000002F8 -:1028300003880910000020884002110004000000F5 -:10284000001100000282030009881100020041000B -:102850004000410000000000208411822000080197 -:10286000000100010000080010010000000100004C -:102870000000000000000000000000000001400512 -:1028800000910010900020C04190918402820000CD -:102890000000000000000000000410900000000490 -:1028A0000021000000010000050410000088000065 -:1028B0000100000040C0008800000004001000007B -:1028C00000020002000000002040041120A01010AF -:1028D0000000000000000000104000A000080802F6 -:1028E00040C10102841104100001850100000000B4 -:1028F00000000000000000000002001000050020A1 -:1029000080410002000300400080100083008080AE -:1029100000000000000000000000110000000000A6 -:102920000005001000200008100004000300000053 -:10293000000009001000800000000000008000007E -:10294000000040800080400000002005834000001F -:1029500080890000000000000000000000000080EE -:10296000000000C040208011808900040310000393 -:102970000005000000000040000000000000000012 -:10298000000000000002008980002105A08085056C -:1029900041800000000000000080000080900004E2 -:1029A0000000000080000000000020038490410827 -:1029B0001000000000008080000000000200C190B4 -:1029C00003091000108021A1A020A0880300892104 -:1029D00000000803000000000000000080008009E3 -:1029E0008000800041800309020405850300050082 -:1029F00002001103000000000001000000000000C0 -:102A000000000000020090000221080000004008C1 -:102A1000030041A0000000000000001000008241FF -:102A2000000000C00000820400000082000083C19A -:102A30000001010400000000820800000084000082 -:102A40008204000101A02140910284001005410090 -:102A500020884090888900000000000000000800E5 -:102A6000100088400800000800000001000400A0D9 -:102A70000000010000850088000200000002000044 -:102A8000000001000000C088001000901002908833 -:102A900000A00008C11100020000000200000000B8 -:102AA0000040A021010001400002830000000088D6 -:102AB0004041C0000001000001010041820000907F -:102AC000010000008410000400000008040500015B -:102AD0002041018982A00540000082000000000022 -:102AE00002900020028441C08800010001C10289D7 -:102AF00000000000840000000000000000000080D2 -:102B000000000200100000008000110000008000A2 -:102B10000008009000838908008000000000000089 -:102B200009200089000509200380028003000000BD -:102B3000052000890009041000000408009000200E -:102B4000000304000000800004004000000080A199 -:102B5000000402400404C141848000000000000021 -:102B6000000000000000008021800010100211050C -:102B7000048900400009000900050004002100004C -:102B80000000000200020000000080050005800037 -:102B9000800000000004008000030000008000802E -:102BA0000000800000000084000000000009800098 -:102BB000000080800000000000090000000000000C -:102BC000000000000004800000000011800004806C -:102BD0000480001008080408C080084000000000BD -:102BE000000000008000808000000000058082045A -:102BF00083000909008003090000050300010000AB -:102C0000000000000001001100880000C000200446 -:102C10009088880000A000210084000100000002CC -:102C20000010000008000000000300000000080081 -:102C3000040800000408000000880001000084006F -:102C40000088880000000091200000880000040037 -:102C50000108010800019008A19185C04101000010 -:102C6000000000000000400004A02090000082C08E -:102C7000040191000101004000000000000100116A -:102C80000000070000000081000007000000008134 -:102C9000000007004200000000E000000082000089 -:102CA0000000000000000000000000000000000024 -:102CB000000000000000000000E0000082000000B2 -:102CC0000000000000000000000000000000000004 -:102CD000410000E000000000000000E00000000AE9 +:10223000000002C07A866126034000000000000012 +:102240000230A0000000000000000C400000000070 +:10225000000002C06486400041000000200988039D +:102260001000200020040410880008008880200549 +:102270000010200820102000020000000404400587 +:102280000480880420040441200820002005040064 +:10229000400504002005000304002080040204021D +:1022A0000200400008002000028041042004820057 +:1022B000200320802000880020002000200020082B +:1022C000200020008800400004802000200020849E +:1022D0000402408084020400800040820000050067 +:1022E0000000000005000000020020008200001035 +:1022F0000482000000020000000000000002020052 +:102300000040000400010001400240004000A1081C +:1023100000008000400000000000400000080003B2 +:1023200020018900000284000000894002020401AB +:1023300040000002404040000000400204900200C3 +:102340000040000000000090000041028000A0005A +:10235000800400010002040300020200000010409B +:102360000310040000000000000083800100021040 +:10237000A00000800000000002100020000000000B +:10238000021000800041004100200280C020088827 +:102390000085000000000040084000001008000018 +:1023A00000000141000001000003098009000080D5 +:1023B0000200048008000000000002000200020089 +:1023C000000802000000000004100200000240406B +:1023D00002008280080000000280400041000408E2 +:1023E00000004000050000000388021020202000AB +:1023F000000800840010000800840004098509100A +:102400000208094000200000000000090004090142 +:1024100000040020098404100008000000004001AE +:102420000000020440080008088820000420080476 +:1024300002408210C12000840000001000880008C3 +:1024400000C0000000040384048203000088200907 +:1024500083880508040485840004000280040008C1 +:102460008440000800212008080010210011000805 +:10247000000521210105881100050005000301095F +:102480000000000501888802010400090003002003 +:102490000104880300850008000000000008000017 +:1024A0000000000800210021000300210021042178 +:1024B0000088048820210408040800020002C005E6 +:1024C00000008440024104000010002108000008C0 +:1024D00084000000A000400040080005A0000000AB +:1024E000000000110800000800A009100000109072 +:1024F000030000000400020000840000000000004F +:1025000004840000000040200000200800000900B2 +:102510000001080100A00004000000840000000089 +:10252000000000000000000000840900040000100A +:10253000901000042120C008009000000300030058 +:10254000000000000000000000000000000000008B +:1025500000000000040000A000080800008400C083 +:10256000000082808200212190000411C00900092E +:102570000000404040050004040400110000C000B9 +:1025800000001011080000000040A084C0050820D1 +:10259000040400000409008008210800000008006D +:1025A00000000000080004000000A18008000800EE +:1025B0004000C04008000900002008C0820402005A +:1025C000C0000004820082000204820900000004AE +:1025D000000000008204A0410400820020022020AC +:1025E0002040080900200002A0A004A00882218445 +:1025F00000404008082010840285412000C0008867 +:1026000000822100008400A000A000000802080051 +:1026100041418000208800000220090000000040A5 +:1026200000100388000000A0008421002004008422 +:10263000000021822100040002000001000400408B +:1026400080000000080000000000004000000302BD +:10265000000010000000110010002000020020C146 +:102660002004200520A00040000404030002A0056F +:102670000021840008110180084001000820820028 +:10268000000000080085A000000904030400040005 +:1026900090200408C0210809C021040500000002A0 +:1026A00000038200C000000010081000C0001000ED +:1026B0000000010083400000848000850080838545 +:1026C00000000005000500080000000000000000F8 +:1026D0000000000000000000400090009080080012 +:1026E000000008020808000000002101800003002B +:1026F00000000900030011104002800410000011C6 +:10270000000000C000000002008210008000850070 +:102710008008000180010900000000008000001016 +:1027200000C00000000000000000800080000000E9 +:102730000000200002000800000009400004002002 +:102740000204000000000000211000000000000052 +:10275000002000A009080800000005000000031088 +:1027600000900090000000000000A0A19021002136 +:1027700001A18203C0000105000000201020040513 +:1027800020088208001000040010400400200020EF +:10279000000288119000200400050008011020406C +:1027A0000409000000219040A02100000005002144 +:1027B0004100821090210208080000080003000078 +:1027C0000000040000410021000800210000000872 +:1027D00000200005000082000800081040000800EA +:1027E00040000080400300080000400820040088EA +:1027F00000040404020002000800058405411001E1 +:102800008200908420000040000000A00000000131 +:10281000008508A000840900114020820000040205 +:1028200080008000004000A000A000A00000000088 +:102830000000C000000000008000800000000000D8 +:102840000000000080000000000800000000000000 +:1028500000900000000000000000000000000008E0 +:102860000000000000048000110041101140000031 +:102870000401200000010800000000000200A0C1C7 +:102880009088010208C100000100900000000000D3 +:1028900001000800000000019001A001000001A05B +:1028A0000008001000100000000000000000000000 +:1028B000000000000400000011A0000200841010BD +:1028C00040C1900208049089000000000000000050 +:1028D00000000000000000000000000000000000F8 +:1028E00000004000010100000000C001880000015C +:1028F0000009101084020011000000000000000018 +:10290000A0C100210320802000000800000000007A +:102910000000110080000000114121400011001151 +:1029200011800080108000000003000300020002FC +:1029300000000000400080000000A0800000008037 +:102940000000A0C0A1A10088000400000000000059 +:102950000000000000000000000000000000000077 +:102960000000000900090208000900108920000287 +:10297000000385C091809009820200400080000021 +:1029800000000005800300038000000000040080B8 +:1029900000000000000000000080088009002011F5 +:1029A0001083000500A1008300000000000000006B +:1029B00000090000100009000500418000008003AC +:1029C00080008080A000211088A084110000800079 +:1029D0000000800000000000000000000000000077 +:1029E0000000000000000000000300201180100221 +:1029F00010001120039091C00500408400010008E0 +:102A000000000000900010842040088400000000B6 +:102A100000040000000000C000000008014000A009 +:102A20000100010900000004000400A00090000063 +:102A300000000000000000000000010001A04000B4 +:102A40001000A020C090092040010482C100A00015 +:102A50008200880008400000000000000000000024 +:102A60000000000000000008000000010000000459 +:102A7000000100C000010000040009010100000481 +:102A80000040001000200890410809881102000051 +:102A90000000000100000000000002000000010131 +:102AA00001010300010140000400C000C10000005A +:102AB0000000000000000000000000000001000114 +:102AC00000080002000210C0820508A0010410C125 +:102AD00000000000000000000000000000000000F6 +:102AE0000000000000000000000091000000000055 +:102AF00000000000020100014011030288210410BF +:102B00002080000000800000C000208090009080A5 +:102B100000100005000800200910000280110002CA +:102B2000401003109010111005008000800020005C +:102B30000000400005000000000000030020000825 +:102B40000341008000000080008000040409048923 +:102B50008084000000000000000000000000000071 +:102B6000000000000000000000000000080011004C +:102B700005000041110589210008110011102100F4 +:102B800002020000000000000000000280A100001E +:102B9000800000000000000000000008002100008C +:102BA0000000090020411000200380028002800004 +:102BB0008000092102004100020000000004000022 +:102BC000000000020004800900800000A105020549 +:102BD0004000841000000000000000000000000021 +:102BE0000000000000000000000000001021210093 +:102BF00010000300A18288002100022001880082C9 +:102C000000C0000000000000000000008800040870 +:102C10000202080040000200820090000001000053 +:102C2000000000000090010101000000900120015F +:102C30000200080000010000000000000000000386 +:102C40000000000000008201020102400200C020DA +:102C5000108489208900000000100010000000008E +:102C60000000000000000000000000000000000163 +:102C7000000000000000C10321009100A10000003D +:102C800000E00700820000000000000000000000DB +:102C900000E007000000000000000000000000004D +:102CA000000007000000000000E0070042000000F4 +:102CB00000E0070000060000000000000000000027 +:102CC000810000E00000000000410000070000005B +:102CD000008100E00700000000000000000000008C :102CE00000000000000000000000000000000000E4 -:102CF000000000E007004200000000E000000000CB -:102D000000000000C0C0FFFF000000000000000045 -:102D1000C3E700F0F6F6F6F6000000003C34FFF7DB -:102D200000000000C33CC33C0000FFFF0FF00FF0A9 -:102D30000FF00FF0CCCCCCCC0000FFFFCCCCCCCC37 -:102D400000000F0FF0F00F0FF0F000FF00FF00FF8A -:102D5000FF000000FFFF0FF00FF01F0FE0F00F0F5C -:102D6000F0F0000000000000000060009000C30FC1 -:102D70000099F0000F00FF6666660000000000008A -:102D8000000000000000C0C0FFFF000000000000C5 -:102D90000000C3E7FFFF76F67676000000003434CB -:102DA000FFFF00000000C33CC33CFFFF00000FF02A -:102DB0000FF00FF00FF0CCCCCCCCFFFF0000CCCC50 -:102DC000CCCC00000F0FF0F00F0FF0F0FF00FF0071 -:102DD00000FFFF00FFFF00000FF00FF00F0FF0F0FB -:102DE0002B0FF0F0000000000000000000600090D9 -:102DF000C30FFF9900F0000FFF000000000000006B +:102CF000000000E0000000000000000000005000A4 +:102D0000000000000000000000000000B0BDD0DBAB +:102D100001C131F10010001033FF119900000000D3 +:102D200000000000000000000000000000000000A3 +:102D30000125193D00000000000000000000000017 +:102D40000000000000000000000001C10DCD0600E1 +:102D50000400F066FF3CFFF0663C0000000000004D +:102D60000000000000000000000000000000000063 +:102D700000000000000000000000F6063F3F0000D9 +:102D800000000000000000000000000000000DBD79 +:102D90000BDB0DCD3DFD00130010119933FF00003A +:102DA0000000000000000000000000000000000023 +:102DB000000043675B7F000000000000000000008F +:102DC00000000000000000000000000031F13DFDA7 +:102DD00000000400F066003C00F0663C00000000CB +:102DE00000000000000000000000000000000000E3 +:102DF000000000000000000000000000F606303077 :102E000000000000000000000000000000000000C2 :102E100000000000000000000000000000000000B2 :102E200000000000000000000000000000000000A2 @@ -107265,494 +107265,494 @@ :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 :102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000666666666666666091F391002C0CBB -:102EA00090F0FFFFFFFF00000000999999990FF043 -:102EB0000FF0F0F0F0F000FFFF00F0F0F0F03CC396 -:102EC0003CC3F0F0F0F000003333333369696969D3 -:102ED0000FF00FF0F0F0F0F000FFFF00629D669938 -:102EE0006699649B00F7FF080000000000000000E6 -:102EF000FFFF5FFA00100008C0C3C0E70000000039 -:102F000000000000000000000000000000000000C1 -:102F100000000000FFFFFFFF60606060F3F3F3F369 -:102F20000C0CF0F00006000000000000666666660B -:102F30000FF00FF00F0F0F0F00FFFF000F0F0F0F1D -:102F40003CC33CC30F0F0F0F0000333333336969A9 -:102F500069690FF00FF00F0F0F0F00FFFF00669968 -:102F600066996699669900FFFF0000000000000066 -:102F700000005FFAFFFF00000000C0C30024000053 -:102F80000000000000000000000000000038000009 -:102F900000000061003E000D0000A061403E000DF9 -:102FA0000000006150070005000000000000002044 -:102FB000100240618006002D100240618006002D45 -:102FC000100240618007002D100200004061800661 -:102FD000002D100240618006002D10024061800526 -:102FE000C0211002406180000001000200000000CA -:102FF000000000008000000000900000006150040C -:10300000000100000061000000010000000000005D -:1030100000000000000000000000000000000000B0 -:103020000000000000000000F505F50500000000AC -:103030000000000000000000D7D7D0000000000012 -:103040000000000000000000FFC30F0300000000AC -:103050000000CF00CF45000000000000000000008D -:103060000000FFFFFF003C3CFF0FFA3CFA3C000071 -:103070000000000000000000000000000000FFFF52 -:103080000C4D0CAEFFFFFF14FF140FFF3FFF0000BD -:103090000000000000000000000000000000000030 -:1030A00000000000000000000000FD01F505000028 -:1030B00000000000000000000000D7D7D707000084 -:1030C00000000000000000000000FFC355410000A8 -:1030D00000000000CFCFCF4500000000000000003E -:1030E000000A000AFFFFFF003C3C000F0A3C0A3CBC +:102E800000000000000000000000FF3C961400005D +:102E9000000000000000FCFC06F6DADADBDB0000D4 +:102EA0000000000000000000000000000000000022 +:102EB000000000000000273C270000000000000088 +:102EC0000000000000000000000000000000000002 +:102ED00008660800F0FFFF3C606FFCFC3CFF660FDB +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F0000000000000000000000000000FFC39682E7 +:102F100000000000000000000C0C06F6DADADBC34B +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000033C0300000000004F +:102F40000000000000000000000000000000000081 +:102F5000000008660800F0FF003C606F0C0C3C00AD +:102F6000660F0000000000000800000000000000E4 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000005610A0F050DB0 +:102F900000A1000000000000000005615A0F050DAF +:102FA00000A000610006000D000005610A0E050D7D +:102FB00000A005610A0C050100A005610A0F050DBE +:102FC00000A000610006000D000000000061000686 +:102FD000C00D00000000003800900005A0612038FE +:102FE0000041000800000000000000010000000097 +:102FF0000000000000000000000000000061000769 +:10300000000D0000A0610006000D0000003CC3FFA1 +:10301000200022020000000000000000000000006C +:10302000000000000000000055555545000000005C +:103030005F0A41415F7F557D757575FF0000000097 +:10304000000000005000508200000000000000005E +:1030500000003C3F00AA0000000000000000FF57F5 +:103060005757FCFEF0FA00000000000000000000CE +:103070000000000000000000000000000000FF55FC +:103080007F7F00000000EBEBEBEBC1C100C3B2B2ED +:10309000B2B220002000000000000000000000008C +:1030A00000000000000000000000555555750000AC +:1030B00000005F0AEBEB0F3F003C303030FF0000B8 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000F00AA000000000000000037 +:1030E000FF0303033CBE00AA000000000000000034 :1030F00000000000000000000000000000000000D0 -:103100000C4D0C4D0CAE00AA1414141400FF3CFF1F -:1031100000000000000000003C003C000000000037 -:1031200000F5C3A000000000000000000000AA2A73 -:10313000000000000000000000000000000000008F -:10314000A0F0AAFF0000000000000000C3C343403D -:103150000000000000000000000000000000FFC3AD -:103160000F03000000000F0F0B07FF00FF00F0F03F -:10317000F0F000000000000000000000000000006F -:103180000000069000007D28FDF83F0F3C003C3C0D -:103190007DFD00000000000000003D053C00000037 -:1031A000000000F5C3A00000000000000000AAAA73 -:1031B000AA2A00000000000000000000000000003B -:1031C0000000A2F3A2F30000000000000000FFFFD7 -:1031D0005F50000000000000000000000000000040 -:1031E000FFC35541000000000F0F0B077D7D28280D -:1031F0008282BEBE0000000000000000000000004F -:1032000000000000000006902828F8F83F0F3C005E -:10321000282828A8A0000000000040000010898095 -:1032200088020010A000000008100000020000004A -:1032300000000000880800000008000000022000D4 -:103240000000002082080200000001000000884009 -:10325000C00000000003400000000000A003840044 -:1032600020008411000000008440820800008800D3 -:103270002100C00020002000C0030000000020004A -:1032800020004000400084008800880400022000E4 -:103290008802200020044000004000008000400020 -:1032A0000202008500914000000080010000200023 -:1032B000000210000020000000000000000041009B -:1032C000000000001000100000000000200000C0FE -:1032D000000140000000000000A0000040000000CD -:1032E0000000000400024000000000010002008213 -:1032F0000000A0002100800209000004000200027A -:1033000000024102000400000004000221040082C7 -:103310000090002000000090010800410000010022 -:103320000085008010000840008200090808001194 -:1033300008100082000002000200004000020200AB -:10334000001000040100000200410010900200C0C3 -:1033500000000000C0080011000000000011020879 -:1033600000000002000000020010028500080000BA -:1033700000080904008402402004008000000010BE -:103380000802102090004100020082000000840921 -:10339000001090000108004008000809000000002B -:1033A000400800020002000480851011008491840E -:1033B0000000800100030500000000C005090301B2 -:1033C0000004008500004008000900C0000400055A -:1033D00000040084000000000084000005040004D4 -:1033E00000410084000900080008008400400083B8 -:1033F0000510050020090041000980410240000835 -:10340000008820048210020890080008000800824A -:103410000384020800080284098480080000000276 -:10342000020000050041000000000000C08300858C -:1034300000C100020002409000400008C0030021CB -:1034400000100010040500000005000200830008C1 -:103450000803004000080041004000020000100086 -:103460000080000800028883820500000008000038 -:10347000000800000021004000401002A0080021C8 -:1034800000210040000800030100000000000008C7 -:103490000010000000000000004000080000410093 -:1034A000000180820000000800880300000005027F -:1034B000054041080009000100030000000003006E -:1034C00000A0100003A000001008410021410304E7 -:1034D00000C0000000000884000003010085000017 -:1034E00085840040000000010340000021A0050089 -:1034F000080808A0030800201100090000010000CE -:1035000000C040000009050000002000000000206D -:10351000000004000000000000A0004011000400B2 -:1035200000094080000000000002000000000000D0 -:103530004090000000004002000501020000000071 -:103540008205001100001000A0402002C010881168 -:103550000004C040A0400004901110118209001125 -:10356000000000840011210084009000820000000F -:10357000C080400200004000008020004000088021 -:10358000C00040094009A0400002014110000204AF -:1035900000041000841008400000000000410000FA -:1035A000000000888002020000820000000000820B -:1035B00000888003000800C0C001419040C1009015 -:1035C00000840300004000A00310000180C00990A7 -:1035D00000A00985009009090089008805A0409095 -:1035E000400000000040408282C000000002020053 -:1035F00000880002008400C0090000028088008862 -:1036000000040004000820020000048240880384B3 -:103610000801030000000040210800000000000035 -:10362000408200888200008800030080002082031E -:103630000008094041108283014000800008081002 -:103640000000212100400000C00082000008A040CE -:10365000080000080080000000020004404110083B -:103660004000820800008400400040054000000443 -:1036700000000000000008000000010800402121B7 -:1036800000A00080C0C0000000000000000000009A -:10369000000001400000000082000000000800005F -:1036A00008000004000000000010000000020020DC -:1036B000090000000808C0010310100100022120C9 -:1036C0000003000002A00000000000001000210024 -:1036D0002101100000000340000000010000400430 -:1036E0000004030421900000080400A0400400042A -:1036F000039000000300028408000020028203916E -:10370000A08803040004030500002100000000005D -:103710000300000020000400090000080000000071 -:1037200041900000000000000021008501210011EF -:1037300000210021000000090902200440110102BB -:1037400000000002000000101021102100410808B4 -:10375000000300C18821200800040040002102214C -:1037600000409005400240400000000890084000E2 -:1037700000408221000000409000A00000050000F1 -:1037800010082040820820002000000000002000D7 -:1037900000400000000082800000000000210000C6 -:1037A00000000000000000000000001021021000D6 -:1037B00000A00090000000000082C0010000890409 -:1037C00040A100880001000000010300000000008B -:1037D0000300008211020000000100C0000500107B -:1037E000A084110140040205208900001100030497 -:1037F000890009090300000003014000080020407F -:103800000004000091010800800084020000000014 -:103810000000000100080200021000000300080080 -:10382000200011001100008200001000014101A1E0 -:1038300040000002400801111008400803890040C0 -:103840008805A0100108082100C000080000000041 -:103850000000000000000200910000000002008350 -:1038600008010000000000820400000000000001C8 -:103870000085002000000002010104C000011000CA -:103880008202028200000000008200000000A0828C -:1038900004A0008282829101200102010401000043 -:1038A000000000000000000000000000000002C155 -:1038B000108880110005809140210082008284419F -:1038C000048880080082218300A100110084000088 -:1038D000000000000000000003004000000011A0F4 -:1038E00021A1851000100000000000000000000071 -:1038F000004120404005000508C040200040000273 -:10390000800011000080000000000000080000009E -:1039100000008000000080809141821000100003B0 -:103920000000000000000000000000000000000097 -:103930000880034102404102910021008802208951 -:10394000200010034109A1000080000280800020B7 -:10395000400089008800400040004009400003000A -:1039600008800983900005002000028040020800C2 -:1039700000000480210003004102000000A180003B -:103980000000000000000000000080080000A020EF -:10399000A000000080410000808041000300201052 -:1039A00041800000000000000000800000000000D6 -:1039B0008000011001010103018288822100A10120 -:1039C000A0A1910040011091A1C090C09000A082E0 -:1039D0000201400008000900C000019001008304BA -:1039E0000104019000838400008401000040000174 -:1039F0008382000090020184000001C100000004E5 -:103A00000200848400000082000082820401A082FF -:103A10008500038282000405408204040000010046 -:103A2000010101A0000000000000000010002000C3 -:103A30000000C0001000000001018801A005018401 -:103A400002C088C0100301A0008204A1400400A0AD -:103A50001000900200000000100000000000008331 -:103A60000005000000000001C08300854001004007 -:103A700082900000000001020105820101000102A4 -:103A8000004183000101000000008401018509005C -:103A9000904082000090C08200020482A082000157 -:103AA000410088C0019100000000000000000000FB -:103AB000000000000000800900030821000200103F -:103AC00008090310009080084002081109838080D3 -:103AD00000800500030000000000800000000008D6 -:103AE0000005000800094103081080101011C120D2 -:103AF00000A000400011000002A00283C1080502DE -:103B000002C0028905400902040500218020044109 -:103B10000200008000000500850000808000008019 -:103B200000049109850403C00000000000000000AB -:103B3000000000000000000004218921040003109F -:103B400041C0004103800002009100A100800041BB -:103B5000080005808480100000800080000000A024 -:103B60004110A1002100200403841100080010105E -:103B700080000000000000000000210200058421F8 -:103B800040400000000000000000004000800000F5 -:103B900080000040008000000009000080C180001B -:103BA00000000009002100000011000000000000DA -:103BB000000000000000000000008221A000C00002 -:103BC0008300014000050140000090A08808908417 -:103BD000C0011100040809029000004000100040DC -:103BE000000911050200A104410000C000000140CD -:103BF00041014000200000200000000083A10000DF -:103C000003C100018200000000000000020100105A -:103C1000000004008200002000C040008200040276 -:103C20000282820000A100000000000100000000EC -:103C300000000000000000040088000000000000F8 -:103C400000005000000000E00000880000000000BC -:103C5000000000410000000000008400000000009F -:103C600000000000000000E000000000810000E013 -:103C7000000084410000000000000000000000007F -:103C800000E0000000000000000000000000000054 -:103C9000000000000000000000E000000000000044 -:103CA000000000006000000000E0000000000000D4 -:103CB00000000000000000000000000000003F3F86 -:103CC000BF3F0000000000000000D7820F0FB0F0DF -:103CD000A0A0AB00AF00505050140000C0C00000C6 -:103CE000000000000000CF8ACF00F00FF00FC3C328 -:103CF000C3C300FFFF0000FFFF00F00FF00F000044 -:103D0000F0F00F0FCCCCCCCCFFFF0000CCCCCCCC57 -:103D10003C3CC3C3AAAA55553C3CC3C3F0F00F0FAB -:103D2000CCCCE4CCAAAA555500000000000055AA4E -:103D30000000000000000000000000000000000083 -:103D4000030383030000000000000000D782030388 -:103D5000F0F0F0F0AF00AF00000000000000C0C0C5 -:103D60000000000000000000CFCFCF45F00FF00FA3 -:103D70003C3C3C3C00FFFF0000FFFF00F00FF00F59 -:103D80000000F0F00F0FCCCCCCCC0000FFFFCCCC6F -:103D9000CCCC3C3CC3C3AAAA55553C3CC3C3F0F0B1 -:103DA0000F0FCCCCCCCCAA8A55750000000055AAC8 -:103DB0000000000000000000000000000000000003 -:103DC00000000000EB0000000000FFFF1C10C0C05E -:103DD000C0C00A2A00005555555500AAA8AAFFFFE1 -:103DE00000200000000000E00BEB0000000000FFDE -:103DF00000FF00FFFF0000FF00FF00FF00FF0000CA -:103E0000FFFF0000F00FF00FC3C3C3C3F0F00F0FAC -:103E100000FFFF00F00FF00FAAAA555500FF00FFAA -:103E200008F700FFA955AA5510FFEF000000000099 -:103E30000000000000000000000000000000000082 -:103E4000AFAF2D2D0000EBEB000000001C101C108C -:103E5000A0F000F00A0A000054145000A8AAA8AA72 -:103E60000020002000000000EBEBEBEB0000000066 -:103E7000FF00FF0000FFFF00FF00FF00FF00FF004A -:103E8000FFFF00000000F00FF00F3C3C3C3CF0F066 -:103E90000F0F00FFFF00F00FF00FAAAA5555FF000B -:103EA000FF00FF00FF00AA55AA5500FFFF00000019 -:103EB0000000000000000000000000000000000002 -:103EC000000005052D2D80610006000D0000004159 -:103ED0004006009D000180610006000D00010061A8 -:103EE0004006000D000000610006000D00010061A9 -:103EF0000005002D100240618003C02910024061BE -:103F00008006002D1002000040618007002510028D -:103F100040618006002D100240618006002D1002D5 -:103F200040618007002D100240008000002000004A -:103F30000061000200050000000000000000000019 -:103F40000000000000000005C3C3000000000000E6 -:103F50005555AFAF00000000000000003030303495 -:103F6000C3C3C3C300000000000000000000000045 -:103F7000000800281404040400F300A200AFC3EFFB -:103F800000000000F0D0F01000000000000000333E -:103F9000000000000000FF035501000000004D4D2F -:103FA0003C000000000000000000000000000000D5 -:103FB000000000000000F8F8000000000000000011 -:103FC00000000000000000000000F7FF0000FFF20A -:103FD000FF000000050580000000000000003C3CE0 -:103FE0003C3CC380C3C30000000000000000000090 -:103FF0000000000800281414040400F300A2FFFFCE -:10400000FFFF00000000F0D0F010000004040000EA -:104010000000000000000000FF3F551500000000F8 -:104020004D4DFFC300000000000000000000000034 -:10403000000000000000000028F800000000000060 -:104040000000000000000000000000000000003C34 -:104050000000000000000000000000000000000060 -:10406000C3C343023C3C303C0000000000000000A1 -:10407000FFC35040000000001410140403FF07FFAA -:10408000070707000000000000C000FC0000000C53 -:104090000001363CF5FFE0EBE0E00000000000002E -:1040A000000000000000000000005555FF00000067 -:1040B0000000000000003F305F5FBEBE303C0000EB -:1040C0000000000000000000000000000000F0F010 -:1040D000003CA0AFCFCF00004000002000000C3C0F -:1040E0000414FFFF5F0A003C003C000000000000D9 -:1040F0000000FFC35F43000000001414141403FF0A -:1041000007FFD7D7D7000000000000C000FC000068 -:10411000000000013339F0FAE0EBEBEB00000000A7 -:104120000000000000000000000000005555FF00E6 -:1041300000000000000000003F3050508282303C00 -:10414000000000000000000000000000000000006F -:10415000400000000080000000000000010001009D -:10416000C100004100009000C000040900001000E0 -:104170001000212020800020000000008200C000EC -:1041800020009108000588040000000001002000C4 -:10419000000320008800C000840002038808880013 -:1041A00082092000850089082180A00040000400C9 -:1041B000118000002000880082020000000020041E -:1041C000400020080402880488002180010088A0A3 -:1041D00000A0800000000008000000000002200095 -:1041E0002000080020000020000010040000000053 -:1041F000000000028401800410830000000200001F -:1042000041020000080005000000400000044000DA -:1042100000C0000040000500400000001000000049 -:10422000000020000000040040020404030000021B -:104230000000404000400400100000840002100410 -:10424000000009040900410010204100C020400284 -:10425000002110210000000000000000000000000C -:1042600000080200000000000008000000000040FC -:10427000000000000000000000000000000000043A -:1042800000C1004100000000008982000000880495 -:104290000000000000000409000808000000881069 -:1042A000A041000000400000850000100000000256 -:1042B0000000090001400200900402000000A00874 -:1042C00000039005080202208240830040000400A1 -:1042D00082009000900800040000008400000000AC -:1042E0000008001000080000008204840008000498 -:1042F0000084040005820410000000840008040803 -:10430000001000020084008200880002008400087F -:104310000008000802100000401000000008001013 -:104320000389001000000008040040080284001007 -:1043300040080084080808890008000800080002F6 -:104340000000000800008485858500110208808433 -:1043500080084084028400840021000000000000E6 -:1043600001400102000000100010004100030005A0 -:104370000008C011C0088841000800000004004087 -:1043800000210008000000000000000082088440B6 -:10439000C010010500008908000002080005200483 -:1043A000010800400021C00088A100050002A0090A -:1043B0009004004108050000A10500000021001044 -:1043C0000000002188100000400040080005004166 -:1043D0000008021000408405008900002100000050 -:1043E0000308080102000000000300A10008008487 -:1043F000001000A0000200000000110400400011A5 -:10440000000221000000000000000004030003007F -:104410000500040002840910088400000000000068 -:1044200080010800000000000000004000000000C3 -:10443000100000010000A108000004200000090095 -:1044400000000000000008880000000000000900D3 -:10445000000000000500050809000004000000003D -:1044600000000000000000000040000000050041C6 -:10447000000000110000000400100040080440008B -:104480008500040040002041000000000004880076 -:104490004005004008099005880000850000008064 -:1044A000A000820000001000000304001000004182 -:1044B0000800880400118210C000000008000800F5 -:1044C000A0100400040082100009040482110000FE -:1044D00008000802040004000000C0000400008876 -:1044E00000880920001000C000000000000400083F -:1044F000000000C000C00000008402000000400076 -:104500004000200080404000020409104084000068 -:1045100000104088088420900888202010020000A5 -:10452000210400884090408800A00400040000821C -:10453000118400C0009000880405000400000008F9 -:1045400000A00200080000000088210000400000D8 -:10455000211021A00800911008041000081000008C -:10456000000002400005024101212000000000007F -:104570000041008010008400000000400041010064 -:10458000000020000011004000100040000901035D -:10459000900010000210A000000220020020C021A4 -:1045A000000000210040000010A1000000030400F2 -:1045B0000410000804008241000800000000000010 -:1045C000820200008205C021002100004041040059 -:1045D0000800001040000000080082000000008871 -:1045E000400508080000000800840808000000A03A -:1045F000110002000202020402A0090000084000AB -:10460000400000008000000805001040400000004D -:10461000081003000300000000080000050000006F -:104620002010000000000000000005102000000025 -:1046300000000801000400000000000021000084C8 -:1046400003002100000000000000000008008300BB -:104650000000000000000000000010000400000046 -:104660000003800800090100002000000000000095 -:1046700040C00121001100020000002104200410AC -:1046800000040008400000040000000000000021B9 -:1046900000414008004100000009000420210221DF -:1046A00000418821000000A002400089024000056E -:1046B0000041041000001040C00000000200000390 -:1046C00004402009000500411020A0030810040048 -:1046D0008204000000008200A10982A18305040079 -:1046E000000400040820090040A0090000000000A8 -:1046F00008044105200005C01101000400880420C1 -:10470000002000000082210000C10088110041004B -:1047100009000000040000C0000000000390000039 -:1047200020002000008400000904080008040000A4 -:104730000000400808001100008403000000000091 -:10474000090000000000000000000000000002401E -:1047500000000000001021000000040008200200FA -:104760000300080000020001000100010001000137 -:1047700084000400000082000000880000000000A7 -:104780000000010084000000018390829089108263 -:10479000A00004000000820001A0080000C08210F8 -:1047A000A088401082848482000085022003900249 -:1047B000C003004000100002001000A0A082880882 -:1047C000C00440C0A002820808840000000000006D -:1047D00000000001C00108000001A0C00040020864 -:1047E000A0040403049001042004004100400008D8 -:1047F000000803000000110080000000000000001D -:1048000000000000400080000000100280118405BC -:1048100080840000000000008000408080000000D4 -:1048200080008411A19000100080000011208021E0 -:10483000C003800400000080008000000480C0806D -:1048400040000000808085808080800000000000A3 -:1048500000000000002010080004001000801180FB -:104860000080000000C11009408400C000800000EA -:1048700000020004800000080041800000000009E0 -:104880000080000300000000000000000200022180 -:104890008080A100820084009010020090008209B4 -:1048A0004100850090002108859108410000A0008A -:1048B00082A0802121030000800300008000098085 -:1048C0004103849041800000880902841190000017 -:1048D0000000000000002180900285008403800019 -:1048E0000040808280002080A003900040030040B0 -:1048F0000000000000000800880102C00800000855 -:1049000000000004000100000000000000829190FF -:104910008390A08291A009004000A001210088009E -:104920000800200810000382C101A110C108000086 -:1049300008A041098801010184000401000804A0C5 -:10494000A0408200A0400108A0900300218400093B -:104950000000000000000000110203011000080127 -:10496000040082000809C0000010100111882021F5 -:10497000000000000100000000C000080004010267 -:104980000000000000000000000000000001000026 -:104990009089000500A1100000080040840800086C -:1049A000082000100090890084080040008288C11F -:1049B00000008403010300C0851110000000000006 -:1049C00010000401000320C0102102840008A08907 -:1049D00088890000000000000000000100010001C3 -:1049E0000000040400020009A0C0089000A0018992 -:1049F000A004000011004000000000000080000042 -:104A000041800000000000000000001100030010C1 -:104A10000004001011081005820900800080008049 -:104A20000080800000800000210000C00803209169 -:104A30000020000000200208000989080000000092 -:104A4000000000000009001000200008004100A044 -:104A5000800510A0000000000000000000210010F0 -:104A6000002100038083008000882090000521A1A0 -:104A700021210000214010004100020080090000B7 -:104A80008000800040001000200082000000000034 -:104A900000000000210509050900831000800000C6 -:104AA00000800004801000808080004003210221EB -:104AB0004180020300001140081011C08004000072 -:104AC000000000000000898084090880804184087B -:104AD00004214180A011000000000000000020100F -:104AE000820089000002800080050000000021890A -:104AF0001085218004410101000000000000C00079 -:104B0000028840880800A100A100A0001000000059 -:104B10000000000000000110829000021001000857 -:104B2000000400080000100402108440100084A15A -:104B300004A1840810000000042001A004850400E2 -:104B4000A000A088820088001040028809080201A5 -:104B500009100501888288000000000000000000A4 -:104B60001111081040029001C00082A0A0A0820094 -:104B7000050409A0891005010000000000000000E4 -:104B8000000000E00000000600000000000000003F -:104B90000000000000000000818100E0070000002C -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000810000E0000094 -:104BC00000810000000000000000000000E007007D -:104BD00000110000000007000000000000000000BD -:104BE00000000000000000000000000000000700BE -:104BF0000000000000E00700000A000000000000C4 -:104C0000000030F0000000000000009F839F0000C3 -:104C100000000000000000000000FFC3FFC3FC0014 -:104C2000FC000000000010901C900000000CFC0C28 -:104C3000FC0C154010432000040000003030C0C0C0 -:104C4000C0200C408199C3FF00000000020B0B0B39 -:104C5000F000F00000000000020000000000000072 -:104C60000000000000FF00000000000067676764AC -:104C7000FF00FF00FF000B0B90D290F60000000039 -:104C80000000000030F02060F040F0009F9F839F04 -:104C9000000000000000000000000000FFE7FFE748 -:104CA0000C000C0000000000303070302424000C98 -:104CB000F000F000401540134000020000000C0C12 -:104CC00003030304309B030FC3FF000000000F0F1A -:104CD0000F0F000000FF0020000000000000000097 -:104CE00000000000000000FF0C0C000000006464E5 -:104CF00067647E42FCC00B0B0B0BF0F0F0F0000081 +:10310000FF55757500000000FFF0AAA0808000C385 +:1031100002A207A7EB410505000000000000000027 +:103120000F55FF3C00000000000000000000000000 +:103130000000000000000000FF0F3C55FCF0FEFA0C +:1031400000000000000000000838C8F8000000007F +:103150000000000000000000343400000000000007 +:103160000000DFCFD7C3FCFEF0FA00000000000033 +:10317000000000000000000000000000000000004F +:1031800000007F707F7000000000F0F07D3CB4F51F +:10319000B4F552F257F7EB41AFAF0000000000006A +:1031A00000000F55003C000000000000000000007F +:1031B00000000000000000000000000F3C553C0033 +:1031C000BEAA00000000000000000B3BCBFB00008B +:1031D000000000000000000000051C1C00000000B2 +:1031E000000000005F0F55003CBE00AA0000000078 +:1031F00000000000000000000000000000000000CF +:10320000000000007F703F3000000000F0F055002B +:10321000A0A0F5F502000004848000890210880057 +:103220002000400084408800400003002010040477 +:1032300020044020400088052000008241008800D2 +:10324000050011058400880084002000040020008F +:103250002000400000032010880088008400C00087 +:1032600020008400850020008800200020008802C3 +:103270004000200021808200C00008042000A0003F +:1032800020002005200040804000848010002100A4 +:1032900084C02091200041820000004000202000D6 +:1032A00000000000002000010000000008000501EF +:1032B0004108000000038000000000000010888426 +:1032C000118402840400090010904002000040882C +:1032D00040000000800000000000400040000000AE +:1032E000000000000002200000000000000040007C +:1032F0004004000004C0401000900000890300005A +:1033000010000000214008041002840800048040DE +:1033100040904003001000820000008002080080FE +:10332000000000000000004000020100004000001A +:1033300000090209000000C00000000000000000B9 +:1033400008020200000900800000000800000000E0 +:103350000080000000800021000000090000000043 +:1033600000000000001008000040000000040010F1 +:1033700000008200000000040008020002000200B9 +:1033800000000200000000000040000008020200EF +:10339000000040100400024100020010001009006B +:1033A000022000000200400409080401400220013C +:1033B00000000084200000900402200000080008A3 +:1033C0000000A001200802000204200011040208ED +:1033D0000000000200880010408800000000008209 +:1033E00000880208400000844000028802000208B1 +:1033F000040800002084208440080240008400006B +:103400000004000800840908020000000000000910 +:103410000908000882012002004009090103881000 +:103420000140C01000090002A00304212003004055 +:1034300008000000400000000008014000210400D6 +:103440000000000003022100040010040003000338 +:103450000441000000218221000800080000000053 +:1034600000000008000000080008000240001021D1 +:10347000A021000004008800020300200000400892 +:1034800020080008000000082010000590400008F7 +:103490000041004100000202000000210021200044 +:1034A0000010200903000310000840000002000281 +:1034B000000080000300800000200000100000A039 +:1034C0000000000000009084840080000000008460 +:1034D000000000820000000041820088000000001F +:1034E00000A0000041000084080011000800032033 +:1034F0000000000000A0000200008408000000A0FE +:10350000001080A000A000000400000000000300E4 +:103510000000008800000000A08900000084000274 +:103520000400A000208008808200C003000008047E +:103530000900A005000000000000400488204000B1 +:103540001000A00090040002848002090000831192 +:10355000A000A0008800A000C0008811A000080002 +:103560000000820008000800000082000000824085 +:10357000A0008200000040404000C000C0040041A4 +:1035800082000000080008008240A0000400200023 +:1035900002000200C000820008008220C00008C0B3 +:1035A000A00000902102A110212041C0050805883B +:1035B00000C04090090000C0008804008509008216 +:1035C0000010000000000000000000028088038856 +:1035D0000200000000824100000008C0000000025C +:1035E00000000000108200880000000000000000C1 +:1035F00000000000000000000000000000000000CB +:103600000040008421002100000040000004000070 +:10361000020000820000004000000282008400C01E +:10362000840309840010910408000082020420052C +:103630008200901001028203000082000108110044 +:1036400000800002C000001100200040010901407C +:103650000800C0000000C000820000000008000850 +:10366000000082410000000800210000000000006E +:10367000000000000004000008001000000000002E +:1036800000008200910010211000000000000800DE +:103690000000100000000000020008050000000803 +:1036A000822100C10041110120C10000000421005D +:1036B000000000000004400109C008081188400013 +:1036C00040000002048400C000A0008820004000E8 +:1036D0000288200002080000080800000000000026 +:1036E0000000000011000000000000000000008445 +:1036F000000000000000080121C000000300400895 +:1037000000000000008840000000000000000000F1 +:1037100010000000000000000800000800A00002E7 +:103720000588000004100982082101080203000036 +:103730000000080440414000000000080000900024 +:103740000000820200020005002100000041000884 +:10375000100010200000080000094041082100412D +:103760000008004100000000000000000000000010 +:1037700082001000100000000002000000000400A1 +:10378000000040004000000010000800000082001F +:10379000000582050005A008C02100038202104038 +:1037A00004000940000500100000C000021080C0A5 +:1037B0001102119011C002A00488099011000000AC +:1037C00000000300000900031108090000100000B8 +:1037D000090000200008050000000000008400002F +:1037E00020000000000000100400000000000000A5 +:1037F00000000000000000000000000000000000C9 +:103800000000000000000040000000000000000078 +:10381000000000000000000000000400000008019B +:1038200000000000081000000084000090000290DA +:1038300001C090900000000000000000A0011000F6 +:103840000000080190C0A14100C11010010100005A +:1038500000000001A1C14002A00202090000000016 +:103860000000000040010101C00010000000000045 +:103870000000000000000000000000000000000048 +:1038800000000000000000000000020000008400B2 +:10389000010000000401000000000000000082049C +:1038A000C103880540840421010008A008088000A5 +:1038B0008000100080800000000000000000401028 +:1038C0000003004180020009A182000300090840B2 +:1038D00000210010004089C08000004000C00000AE +:1038E00000000000000020024110002080200000A5 +:1038F00000000000000000000000000002000000C6 +:1039000000000000000000000000030000000000B4 +:1039100000090809400980080000000000000000BC +:1039200000021021051000040040032000A080A028 +:1039300000400010008980800000000000000000AE +:103940008000000280000003C080A1038809088570 +:103950000000000000000000A00083404109C19069 +:103960000000000000000000400040004100200076 +:103970000000000000000000000000000000000047 +:1039800000000000000000000000000000008000B7 +:10399000800040800500050021400000000000007C +:1039A00000008500210000009121A000020090800D +:1039B000101108000401A010908200000000000017 +:1039C00000000288C0010288100102028301A100E8 +:1039D00041909000000088000200A1880901C0A168 +:1039E000C190000000000000000000000100000085 +:1039F00000000000000000000000000000000000C7 +:103A00000000000000000000000000009000200006 +:103A10000400080000040000010001030000000091 +:103A2000000000008810C1008800820111201000F1 +:103A3000A004820800C008C00002919000000000AD +:103A40000000000000020008010800400210001001 +:103A500001050210000000000100000010020091AA +:103A6000A108C1C0000000000000000000210120EA +:103A70000021001100000000000000000000000014 +:103A80000000000001000000000000000000000134 +:103A90000000080000010000000200030000000018 +:103AA000000000000000080900080002020408836A +:103AB0000004418540C0000080000080408000007C +:103AC0000000000000000000008005800500008963 +:103AD00003082121038900001100100000000041AB +:103AE0002120A0898990000000000000000000084B +:103AF0000885022100020000000000000000000014 +:103B000000000000000010000000000000000000A5 +:103B10000010002000080008000308892008001099 +:103B2000000000000000000000C0009100C180847F +:103B300080084105022109918000800500000000F5 +:103B40000000000000000000211120808300200000 +:103B5000410020800500400400000080008000003B +:103B6000A0101041880004110000000000000000B7 +:103B70000002000000000040000000000000000003 +:103B800000000040000000000000000000000000F5 +:103B9000000000000080000000002100030002007F +:103BA000034100000000000000004111048020805B +:103BB0000821A1A08421A1004010C00002028810A9 +:103BC0004000000000000000000005004120040447 +:103BD0001000018800A091080001000000080010FA +:103BE0000000C10440898488C10100000000000079 +:103BF0000000009100000000000100000000000033 +:103C000000000000000000000000000000000000B4 +:103C1000000000000000004000C00000010400009F +:103C2000000000010000000000000000010000A0F2 +:103C300000080101C111A1A085020200000000E0FE +:103C4000070000000000000000000000000000006D +:103C500000000000000000E007000000000000007D +:103C600000000000000000E00700820A00000000E1 +:103C70000000000000000000000041000000000003 +:103C8000000000000000810000E0000000000000D3 +:103C90000000000000000000000000000000000024 +:103CA00000E000000006000000000000000000002E +:103CB00000E0000000000000000007000000F3F337 +:103CC00028EB5FF51C3400000000000000007D0DB3 +:103CD0007D70F0F0E0F40F0F0F0F00C000C0000087 +:103CE000000000000000F8FA00000055D2D20000E9 +:103CF00000000000000000000000D070D77D000030 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D2000000000000FF50FF500000000000000008B +:103D300000000000CD0DC1013A00C50040FE0F0F8C +:103D4000303028EB5FF543C10000000000000000A8 +:103D5000D707D7D0F0F0F0F000000000000000809E +:103D60000000000000000000F0F0C3C3AAFFD2D2A0 +:103D70000000000000000000000000000000070D2F +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA000000000000000FFF5FFF50000000000002B +:103DB000000000000000FD3DF1313A00C50040FE6A +:103DC000FF00FFBFFFBF969090960000000000002C +:103DD000000000000000A0AFC0C00F0F0F0FFF0ACF +:103DE000FF0A000000007D7DFF7D30F30000F3300E +:103DF0007D7D0000000000000000000000000000C9 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E2000FE7C820000000000000000000000000096 +:103E3000000000007F7C737000C000007070000004 +:103E40000EAE04AEFFBFFFBFFFF0F0FF00000000AA +:103E50000000000000000000A0AFCFCF00080082EB +:103E6000FF02FF0A000000007D7D007D30F3141486 +:103E7000F33041410000000000000000000000009D +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000FF7D83010000000000000000000012 +:103EB0000000000000004F4C434000C05000404054 +:103EC00000000E0E0404A061000F000D00A1000010 +:103ED00000000000000080610006001D000000617D +:103EE0000004000D000000610006000D0000A0614C +:103EF000500C0049000800000000000000000061B4 +:103F00000006000D0000000000000000000000009E +:103F100000610007C00D000000000000000000006C +:103F200000610006000D00010061000500050000B1 +:103F30000000000000000000006100070015000004 +:103F4000A061000E004D0001000000000000000014 +:103F50000000000000000000000000FB0000000066 +:103F600055000F0FFFFFCFFF000000000000000012 +:103F7000FF05FF3D0353A3F3000000000000000015 +:103F800000000000AA00FA5000000000000000003D +:103F90000000000000000000000000000000000021 +:103FA000000000000000EB2AEBEA3005FFFF0000F4 +:103FB000000000000000000000001400AFAFF3F3A9 +:103FC000A2A24541EFEBEBFFEAFE0000000000007B +:103FD0000000000000000000000000FB00FB0000EB +:103FE000000000003C3C0000003000000000000029 +:103FF000000005053D3D0353A3F300000000000051 +:104000000000000000001414141400000000000060 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000282A28EA0000FFFF2E +:104030003F0000000000000000000000140000002D +:10404000F300A2005555FFFFAABEEAFE00000000E3 +:10405000000000000000000000000000000003005D +:1040600000000000D0F0F0F050D2505030F328287B +:104070000000000003030101F3F37D410000000094 +:10408000000000004455CCFF4F4A454000000000AE +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000454586 +:1040B000CFCFFFFF285000000000000000000FFFDE +:1040C00003C3EAEAFFFF287D2A7F51FB51FB000072 +:1040D00000000000000000000000000000000F0FC2 +:1040E0000F0F00000000F8F0F0F05050505030F387 +:1040F000EBEB000000000000000030307D410000CC +:1041000000000000000044550000EFEAE5E0000078 +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000004500CFFFFF000000000000000000006D +:104140000FFF03C3EAEAFFFF7D7D7F7F00AA51FBDB +:10415000200284099000880000A0000220040400CE +:1041600004100400000004000200200000001040C1 +:1041700084000810C00020008800C0002000200239 +:1041800000002080A0002020200088008400200063 +:1041900000014000200020002000840020002000BA +:1041A00020000400200088092000000004002005F1 +:1041B00088008810400804008200100082008800F7 +:1041C00084002000208888004005880020808880A6 +:1041D0002000000004020000040000030000800131 +:1041E000000041024102000000000400C0000090F5 +:1041F00080092100A1002190000000000000404043 +:104200000040100200200000040100402040000097 +:104210001004000000020400000240020090400070 +:1042200040000000400200020002004010000000B8 +:104230000902200000000990000000020090200206 +:10424000000200A0400000104000008400000002B6 +:10425000000210000000000000000000000000004C +:104260000000080000200000000001100000000015 +:10427000000804000041100000000002000000419E +:104280000041009002100000020000040000000045 +:10429000000000000000000000000200020000001A +:1042A00000080000000002000200040000090000F5 +:1042B000020000100041040008000000020000009D +:1042C00084400000000900090000081008090009E6 +:1042D00000008208000202000008200004004102E1 +:1042E000050000088200100120840088408800003A +:1042F0000010000000000000800800000011008293 +:10430000000808840920004004000400020000881E +:1043100000000010000800000500008400080008EC +:104320000000040400080000000000000308000072 +:1043300000080908000004081100004002C00488B9 +:1043400040000088020200080010038802898200F1 +:10435000040400080410000900000000010000002F +:1043600010030008004100100003008084030000D7 +:1043700000050002000500100105002001200008D2 +:104380000000008004800000004100210041040082 +:1043900000000000004000050000000000080000D0 +:1043A00000000000000000210000000000080800DC +:1043B00000000000000000080000000000001000E5 +:1043C00000000008000000028800840800000000CF +:1043D00002000400000000000010000021C00410D2 +:1043E000000000A0000000A0000820820920410079 +:1043F00000820008000000100082040000C004C118 +:104400000084000000208004000003040004410830 +:104410004140000000000000000000000300000018 +:104420000000008400000082000000000000110075 +:10443000001010000000080041000008000000000B +:104440000000000000000000000008A003844100FC +:104450002100831000004100080000844020040077 +:104460009000018040000000000900009000000062 +:10447000000008000800401004000200200008208E +:1044800008108200040088800000000404008221DB +:1044900082000000A000A0009000020000000800C0 +:1044A0008221820000000800820082001000820049 +:1044B000820800000004080000000440A04008003A +:1044C0000820080008008200000008008200900018 +:1044D00000000000080020402000020082000001CF +:1044E00080000300400490004100000003840804A1 +:1044F00020042000C1040300000000881100808413 +:1045000000C00090000080000004000020000000B7 +:10451000000000000000000000000000210000007A +:104520000000000000000000040000000000000087 +:104530000000000010000000000000820090000059 +:1045400000C0000000040000400000000000000067 +:104550004100000000000082008421C00000000033 +:104560008821C084840008208400049104208220D3 +:10457000002104030020002000022085008800851F +:104580000800018000040090200000A08220C021CB +:104590000000000000000000000800000000000211 +:1045A0000000000000000000000082000000000089 +:1045B0000000000800000000C000820000000000B1 +:1045C0000000000800000000C00000008400C000DF +:1045D00000000000000008000000000300000003CD +:1045E00000080800200510008005000880208001D8 +:1045F000000905A0800000A10885000080042104B6 +:10460000020800C0202000090520A00000050009C4 +:10461000008400000000000000000300000800A06B +:104620000008000000000000000000000000004042 +:1046300002000000000000000000000000A00000D8 +:104640000000050800A000000008000800000000AD +:10465000000000202182030000080002000000A0EA +:1046600020000000408304209121080888030005F1 +:104670000000900900200004080500050003400028 +:10468000901000088221002000032004024000094D +:104690000004000408001000000010100000004199 +:1046A00000000011000000000000000000400000B9 +:1046B00000000000000800000000000004000000EE +:1046C00000000000000000000000000000000800E2 +:1046D000000090000000840002004000000000087C +:1046E0000421004188054004210120000000000051 +:1046F0000000110021000009080000000000000275 +:104700000000000000080220050100000001000078 +:1047100020000011020100000000400840000000DD +:104720000000000000000000000000000000000089 +:10473000000000080000030400000000000000402A +:10474000200400000900200000000000000000001C +:104750000000000000000040000000000084000095 +:104760000000001000C01100A0000100890010002E +:104770009010A0C188410202A08805084010088856 +:104780000140008200C0001000100008C0A000A07E +:10479000010000000100000088A0008800C008841B +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D0000000000000000000000090C08802008877 +:1047E0008288000000002000000000000800400057 +:1047F000800009C08202000380C083004000800066 +:1048000080004080008041000000008002800200A3 +:1048100000000400000040000000008000000000D4 +:104820008000000000000000000000000000000008 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:1048500000000000000000000000000000800000D8 +:104860000080800000110204000800028282918012 +:1048700084201183C10020219011A12080000041DB +:104880008082808000800083119100890040008038 +:10489000000500000005000000410080000000034A +:1048A0008080000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E0008008008080000980090000050904049107 +:1048F000A004A101A108A0A00340A00909A00800EC +:104900000282A00982040040001101910089000187 +:1049100000040000008400000040000000042000AB +:104920000401A0102084000000000000000000002E +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:104960002000080120088200004000000000000133 +:1049700001C00400A0910003C085000405841082DA +:10498000C00500844000A0100800000000000200E4 +:10499000C0000400040111010000400040000000BC +:1049A0000410001000004010000000000000000093 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E000000002200008008209020000010000010E +:1049F00000010200800900A109C0852103908211F5 +:104A00008204C08200400009028380000000000090 +:104A10008000C011802080088441050000008000D3 +:104A20000500008000000000000000000000000001 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000080008089000005400573 +:104A70000421004011842104048004111011A18438 +:104A800090004000801000A180800000C1049100CF +:104A9000000000000000000200000000000400040C +:104AA00000000000800500090080000000000000F8 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000000000D6 +:104AE000000000000000000980A100808000048018 +:104AF00010002100020001080090000400010501DF +:104B0000211109C009000201C0A090842000090100 +:104B10009100C00000000000000100000000000142 +:104B20000000000000000200A084C04088000000D7 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000000000000000000000000055 +:104B600000000000000000008400102102841000FA +:104B700000A0000001000100000000E007000000AC +:104B8000600000E007008400000000000700420011 +:104B9000810003E000000000000000E00700420088 +:104BA000000000E007000000000000000700000017 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF0000000000000000000000000000000240091 +:104C000000249090C0CF00F00FFF4B004B996F6FC6 +:104C10006F6F0000090000000000000000000000AD +:104C200000000000000000000000606060601C1CCC +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C50000000000000000000000000000000000054 +:104C6000000000000000000000000000E780FF9846 +:104C700002C202C2000000000000000000000000AC +:104C8000242424249F9FC0CFC9C9C9C94B664BFFA8 +:104C9000F3F3FFFF6600600000000000000000006A +:104CA0000000000000000000000000000FCF00C066 +:104CB0001C1C1C1C00000000000000000000000084 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 +:104CE0000000000000000000000000000000E6C21C +:104CF000FEDA03C300C00000000000000000000056 :104D000000000000000000000000000000000000A3 :104D10000000000000000000000000000000000093 :104D20000000000000000000000000000000000083 @@ -107761,990 +107761,990 @@ :104D50000000000000000000000000000000000053 :104D60000000000000000000000000000000000043 :104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA000999F9999090FCBCF0000000000CF00DF39 -:104DB000C1C10000F3638F8F9966956A00180024C3 -:104DC0000000CCCCCCAA242C242C000000000C0C1D -:104DD0006E6EFFFFC3C3F8FFF8FF00201818FFFF37 -:104DE000FFFF0000000000000000000000002F0096 -:104DF0002FFF0F0F0F0F00FF00FF0000000000FF4C -:104E0000606F000000000000000000000000C060B3 -:104E1000C0C0000000000000000000000000000012 -:104E20000000BDBFBDBDFFFFFFFF0000000000CFC1 -:104E300000CFF9F90000F363FFFFF906F50A141437 -:104E400014140000C5C5C5A3242424242000000098 -:104E50000C0C6E6EFFFFE3C3181F181F000000004C -:104E6000303F303F00000000000000000000000064 -:104E7000240024FF1E1E069F033F427EBF8FFFFFBC -:104E800000FF00FF00610006000D0000A0610007A8 -:104E9000001D000100610006000D00000061000619 -:104EA000000D000000610E3DC0050000006100061D -:104EB000000D000000610006001D000000610006FA -:104EC000000D0001000080614003C00500000000EB -:104ED0004000000000000061000F000900000061B8 -:104EE0005006000D000000000000000000000061FE -:104EF0000006000D00001061200E004D000800614A -:104F0000000B000900000E00FF0000000000000080 -:104F10000000000000000000000000000000000091 -:104F20000000AAA80080FFFF2F287D0D00000000D0 -:104F30000000000000000000000000000000003C35 -:104F400000000F035F430000000050557D0D00007E -:104F500000000000000000000F5AA50F0000000034 -:104F60003CFF0F55C303414100000000000000005A -:104F700000000A0F0000C1C300000000AA82AA00BE -:104F80005000500CFCFCFCFC0400FF000000000082 -:104F900000000000000000000100155500000000A6 -:104FA0000000000000000000FFFF2F287D0D000022 +:104D80000000000000000004F9389F1CF0FF707F55 +:104D9000F6F69090FC3C0000FDFCFCFC00000000DE +:104DA000F8C8380800000000000000000000000003 +:104DB0000000FFFFFF02FF020000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF00000007E7EF690434303C3000000000000E5 +:104E000000000000000000000000F9C19F83F0FFD7 +:104E1000F0FFE781E781FC3C99990F0F0FFF00003D +:104E20000000FBCB3B0B0000000000000000000076 +:104E3000000062426242FF02FF62000000000000C8 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E7000000000001818F690404000C0000000003C +:104E80000000000005610A0F050D00A005610A0E73 +:104E9000C50500A005610A0E050D00A00041300502 +:104EA000C007000005610A0F050D00A005610A0F8B +:104EB000050D00A000000008000000000000000038 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000000000000000000000000C2 +:104EF0000000000000008000500000000000006181 +:104F00000006000D0000CCFF88AAA000A505040043 +:104F1000000003030F0300000000FFC300C3FF00F5 +:104F200055550000000000000000F3F3A0AF0000A2 +:104F30000000000000000000000000000000000071 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F70000000000000000000000000000000000031 +:104F8000AAAAFFFFC300C30088AACCFFA000A0000C +:104F9000000000000301070100000000550F550F3D +:104FA00055AAAAAA00000000000000000303A0AF59 :104FB00000000000000000000000000000000000F1 -:104FC00000D400D4FFC35F4300000000F0FF7D0D5C -:104FD000000000000000000000000F5AA50FCACA20 -:104FE000CAC53C000F55C3C3C3C300000000000086 -:104FF00000000A0F0A0F0000818300000000AA824F -:10500000AAAA50005C0CFCF0FCF0EBEB5500000091 -:105010000000000000000000000000000000000090 -:105020000000000000000000000045415555FFFF52 -:10503000808000000000FFC35541000000005F5F5A -:105040004343A00FA0FF0000F4FE000041FF45FF16 -:10505000FFFFD0D0000000000000000000000000B2 -:10506000955633CC0000000000A0AAAA0000000062 -:1050700000000000FC0C0000FF003C3C00000000B1 -:105080000000000028000C0C00000020E0E05500AB -:105090000000000000000000000000000000000010 -:1050A00000000000000000000000000045414541F4 -:1050B000FFFFF0F000000000FFC30F03000000003E -:1050C0005F5F5F00AF0FAFFF0000F0F0000041FF37 -:1050D00045FFFFFF505000000000000000000000EE -:1050E0000000555533CC0000000000A000A00000D7 -:1050F000000000000000FC0C000005053C3C000026 -:1051000000000000000028280C0C00000000020035 -:1051100000000000840004000000040004002100DE -:10512000010001000100000000002008C00500008F -:1051300000000000000020000000001000000040FF -:1051400000008400000800004088880041400003FF -:105150004000C0108440004004000480040004802B -:105160000004400500008800880041040108210077 -:105170000000880020004000000584108400A0008A -:10518000000020040000C005880004000404100092 -:10519000C1000000000000000000000080408040CE -:1051A00020002000200020000002090089020000E9 -:1051B000000000000000004000004100404000905E -:1051C0001001000009000000000000400000400540 -:1051D000000000000000000105018000800488023A -:1051E00080040000000000020000000204020440ED -:1051F00004004004000200020000000000080090CB -:1052000009400000008441020002400284020500BF -:1052100080000000001020040000000800000004CE -:105220000000050001002000040489410040000442 -:105230009008000001008500090001040000010839 -:105240008209908090040010008000899080900472 -:1052500010100000002101C1000000000000010941 -:1052600090A00800000000000010000901200400C8 -:105270000280000000000000000000080009022178 -:105280001010820090000841A008A0008520004175 -:1052900003008400000000008001000000000008FE -:1052A0000083000020002088800000012008000901 -:1052B0000085000009822000201020002009000441 -:1052C000200000840002040800000040114000405B -:1052D00004110004000000904040000840000084D9 -:1052E0000200050380080008000800000010040107 -:1052F0008902002000841184000800100082040844 -:1053000000884084008804100084031000080811FD -:1053100000080210408204040003000000000102A3 -:10532000000001210021022120100002200820108D -:10533000400000050040000800210021004000401E -:10534000100000840010000000400209002120101D -:1053500020032040C103000002412008200820044F -:10536000A00320A1010504A100410041004000006C -:105370000008A021082100400000040300090000EB -:1053800000000008000300080003000010000000F7 -:105390000008890000210900000100100010001021 -:1053A0002000001020004000108200080001004092 -:1053B0008000001041A040010000000800000583AB -:1053C00003A00000204108A0000041A18200008449 -:1053D0008320830088832008000080A080A08008AC -:1053E000808500008004100085040082400008A031 -:1053F00000C0400000A0000000A000080000000065 -:105400000008000009000000219003080308400084 -:10541000400009004000400004022000000000009D -:105420000000830004000400A0008204400409047A -:105430000000C0848800881100002010C100822074 -:1054400001C14000020490000004000000020000BE -:1054500084000003908240000188000000A1010246 -:10546000000010000880A000820800000041A04158 -:105470000000000000020000002010000800A00052 -:1054800000410000C0000802000008008409400933 -:105490009000080000200100410201808088000087 -:1054A0000008000002108000C0C021C000838001FD -:1054B000028500900041000409840000801020C093 -:1054C000049020020000800008C0080803000004C7 -:1054D0001000050000900005008410050000110474 -:1054E0002000000080000002110021100000008256 -:1054F000410000080000000000000301000040908F -:1055000000000000001008000800410008000084AE -:105510000084218200000884200404000204A0000A -:105520000005201000050404C00020030400C04052 -:10553000C040A004C00420008200200300100240EC -:1055400000108541084020849000082103020800D3 -:105550000005A040C00200058500900884050000F9 -:1055600000052005004010080010A010820800105F -:1055700000000000000000080000002000000008FB -:10558000000008000000A000004000000000000033 -:1055900020000003A000200040041021200000088B -:1055A00000100000800100A08001008880048008B5 -:1055B00000002001000300008004090090000900A1 -:1055C00088000310020808828041050000000208DC -:1055D000000802000000000000A020A0040008084D -:1055E00000000008800000080000000800004109D9 -:1055F00000002184000000020008001000094000A3 -:1056000004A00500000000000000020000002108C6 -:10561000000009000000000011020241080080049F -:10562000408820080009002140102000011040217E -:10563000002000400011C0210180000000008840CF -:105640000000000002000008020000040000040442 -:105650000000C00582100021844184C184058204B9 -:10566000204000002010210420020110402010885A -:1056700000210004202040114003000000410800E8 -:10568000000009000000000090000400000000007D -:105690000800000000008400000004000421201025 -:1056A0004000000000000000000000008004020034 -:1056B00000880900200900000010020400002000FA -:1056C0000001110004408000090011C00000050025 -:1056D000000100000000400404000000000400007D -:1056E000000180000000800440018000200880014B -:1056F00000200090000100000000000000000000F9 -:105700000000000004002000200004040004200029 -:105710004002208809000000000000C0090080004D -:105720000005000000009000A001900104000000AE -:1057300008019001900011C0C08801021010C0C083 -:1057400084889188900389C01102C002909008C19A -:1057500083039088101040C100400088108510A07D -:1057600000021002842000000202009008020410CF -:1057700000010200A0000000000000000000000086 -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A000A1C0210405A020C00000802085030010B6 -:1057B00000090021C00200009180000003000000E9 -:1057C00080A11003C00000881180848005000000C3 -:1057D000808208A1C0000089808200900904000234 -:1057E000A000118040000000000080801000858033 -:1057F0000080034109404000000400000000000058 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:1058200000001180838002800000028020000800B8 -:105830002100118041800210A1032008A1101085D1 -:105840008410028083C183C0A1410004800380884A -:105850008080028085030380A10800008002002070 -:1058600080000588089010830590000090A0A08516 -:1058700088C0402120802080820082030000000038 -:105880000000000000000080000000000000000098 -:105890000000000000000000000000000000000008 -:1058A000000000004008C111110804A1009001008F -:1058B000010001009090A002A100C121910103010B -:1058C0002041C1A1909082A10511C12110011001B8 -:1058D0000841C002039002008584C1A0900010001E -:1058E000A020C000208220C0854010C1000005918A -:1058F00010C003118201011009200300C1910000B2 -:1059000000000000000000000004000000A00000F3 -:105910000000000000000000000000000000000087 -:1059200000000000000040919089910104030005EF -:10593000009001C000A101880088030800C008048D -:105940008808100282C002400108004002C0409056 -:105950004010100383C140020108828810C0C0C0FB -:105960000140418888C021210421C0030320000098 -:105970000504A002C0031190000101000501000010 -:105980000000000000000000000000000400000013 -:105990000000000000000000000000000000000007 -:1059A0000000000000000000914020032004A1A09E -:1059B000000802100309000220041011C082000533 -:1059C000008000000000838000110400410980C0B5 -:1059D000800980900020C1C08090028303098080EC -:1059E0008000408004000080411080108088820286 -:1059F0000000C18900A08008404005024140A1216B -:105A0000000400000000000000000500000080000D -:105A10000000000000000000000000000000000086 -:105A200000000000000000000000414000838009E9 -:105A3000C140020420090900020311050009028087 -:105A40000500C000829105000011804090004000D8 -:105A500008118000001100000000914003000900BF -:105A6000000580048021000080004104118821008D -:105A700003080000C103A1A0A100051004A1044077 -:105A80004100200300000000000000000000004072 -:105A90000000000000000000000000000000000006 -:105AA000000000000000000000000000C1C02082D3 -:105AB000219185050001000000000101000200881D -:105AC00000080000C188404102028800C00102882D -:105AD00090884000C00020210202A000C000020403 -:105AE00088888800C001102088888200218985214B -:105AF0002120050100000588020483A08801000917 -:105B00000010001001000000000000000000000074 -:105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000C102B2 -:105B3000849191411001810000E00000000081008B -:105B400000E007000000000000E00000000082000C -:105B500000E000004112000000E0000000118100A0 -:105B600000E00000000000000000000060000000F5 -:105B700000E0000048420000000000E00000484251 -:105B8000000000E0070050000000000000000000DE -:105B900000000000070000000000000000000000FE -:105BA00000000000000000000000000000000000F5 -:105BB000000000E00700828200000000C3C3410330 -:105BC000000000000CFFFCFF00003F3A0000AAF0BC -:105BD0000000AAAA0000A0F50000AFAC00003CAA9B -:105BE00000000CFC0000B2FF0000F4FE000078FF93 -:105BF0003D3D05FFB2BEF0FF00003CAAAAAAA8AB3B -:105C0000FCFF000000000000000000000000000099 -:105C10000000000000000000000000000000000084 +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000000000000000000000000D1 +:104FE00000000000000000000000000000000000C1 +:104FF00000000000000000000000000000000000B1 +:1050000000000BEB0BEBC0C082820000000003D756 +:1050100003141C000C0000F03C3C000000000000E9 +:10502000000000000000FF00FF0000000000000082 +:105030000000000000000000000000000000000070 +:105040000000000000000000000000000000000060 +:105050000000000000000000000000000000000050 +:105060000000000000000000000000000000000040 +:105070000000000000000000000000000000000030 +:10508000000000000F0F0FFF00000F0F00000000D6 +:105090003FD73F141400000000F03C3C000000002B +:1050A0000000000000000000FF00FF000000000002 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:1051000000000000000000000F173C3C0F0F0400DF +:105110000400020400202008051084008408888010 +:1051200088858880208501008800040904008400A7 +:1051300002090400840020002004200405088800DF +:10514000210020004005C000881088058800000369 +:105150008800200820008400200020004000040077 +:10516000200020002000008020000000200040805F +:1051700089002008200088000005200040088800E1 +:1051800020004000208240008400008088042040ED +:105190000000800004000001000310000000040073 +:1051A00005040004000400041010204000A01000BA +:1051B00000C080002190000041024103000120C096 +:1051C0000402400040008000040040021000000083 +:1051D0000000404000000902400010400900208209 +:1051E0004100090009020000000240400002049052 +:1051F0001140040000000400000240024082000050 +:10520000000840020000090300000900401000826D +:105210000005000000000000000091008300010074 +:105220000110000000000000000300000000000961 +:1052300000000000100020410102000000000005F5 +:1052400000800000000000000002000000000000DC +:1052500004000000000000000804000000000040FE +:10526000000000100000A000000900000000000085 +:105270000040000000000000000082000005010561 +:1052800000000010000000000010000202000000FA +:1052900008410210000000000000000004000400AB +:1052A0000440048800000000000005000510048888 +:1052B0004010090400008010000008010282000074 +:1052C0000008400400080084000000910000000075 +:1052D00004000000000000000400040002000000C0 +:1052E000000141100011000800880900044004007A +:1052F00000000384001004080410000800080000E7 +:105300002000410004000510000800080209800088 +:105310000400028200018321000800000040008890 +:1053200020A09008000002210003000000000041BE +:1053300000020802200200850084000000400000F6 +:10534000000000000200881000009000000800002B +:1053500000000021001000000008001000080002FA +:1053600000000000002140000000000800000808C4 +:10537000000000000008C000100090028200000041 +:1053800088000000881000000000200000000000DD +:1053900000089008C0000400040000000010030092 +:1053A0000908910409000000410000820000000883 +:1053B0000000118921011001000408400040000094 +:1053C00003000000000008840090000000000000BE +:1053D00000000084000000840000000000000000C5 +:1053E00000080000000000000000000000000000B5 +:1053F000C0000000000000000000000021000000CC +:1054000000004000000003000000000000002140F8 +:105410000000000000000000000808000300A000D9 +:105420000000008008000009830000004000080020 +:1054300004000900840000040100080000000804C2 +:10544000C009010004002000C0111000A009C0051F +:105450004002000004040000A000000004008200DC +:10546000C0008200A011000000090040401100406F +:10547000C040A04000410005404104400800000039 +:10548000C00008000410040008000000A00008107C +:10549000C000000508008200000000000200840037 +:1054A000000000000008410008A0400000000000CB +:1054B00000C000000400020040000400410004900D +:1054C0000000118220002000804020108800000091 +:1054D000418803840000080008001000000000005C +:1054E00000000000080000000000020000000000B2 +:1054F0000084050003000000008841040000000053 +:10550000000000000000000000000000000000009B +:1055100000C00000000000000000110000000010AA +:105520000000820004000000A011C0210000000063 +:1055300082008204A00040020400000040002021FC +:1055400000000000000000000000004010210000EA +:105550000000004000000000000000000800000003 +:10556000000000000000000000000400000008002F +:1055700040000000000008000000000000000800DB +:1055800000000004000000004000000000000800CF +:10559000000000008800C000000008400800001063 +:1055A00000002100000288C003002100030008A0C1 +:1055B0002108000800010000800180000000800038 +:1055C00080000000000000A00000000000000000BB +:1055D00000A0000800A00000000000000000000083 +:1055E00000000000000000000000000000000000BB +:1055F00000000000000400000000000000000000A7 +:105600000000000000000000000000000000040096 +:1056100000000008001000100300000080000000DF +:10562000000000009008010000021100012101A00B +:1056300005009000C00404000000401040410080BC +:1056400000000004000000000000000482C0000907 +:105650002000000000000000081100000000000809 +:1056600000080000080000210000002100000000E8 +:1056700000008200100000000008000082000809FD +:1056800000000000000000200000000408080000E6 +:1056900004000000000000000000C0002000002105 +:1056A000040500410000009004820000C0101000BA +:1056B00040024000000000000200000080008090D6 +:1056C000002008200021000008000304000100045D +:1056D0000000200000001100000040000000000059 +:1056E00000000000000000000000000000000000BA +:1056F0000000200000000000000000040300000083 +:10570000020000040000008400000000000000A06F +:105710000000000000080000000000000000000081 +:1057200000000000000000409082008200000101A3 +:105730008800830100000001890082000001000050 +:10574000A0009100000000010001840000000101A0 +:105750000101000000000000000140000000000006 +:105760000000000000000000000000000000000039 +:105770000000000000000000000002000400000023 +:105780008800002000A01090000000000000000031 +:105790000000000090000000000000000800000071 +:1057A000C0C0009000021010008080000080000047 +:1057B0001008892188100000001140098010001095 +:1057C000000480100311000000111121804000002E +:1057D0001120080800410000001100200009000508 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000000000000A9 +:105800000000000000000000800000000000000018 +:1058100000000000000000000000000020008000E8 +:105820000000808000000000008000008011000265 +:1058300080800400020004004103110009000800F8 +:105840000803038005800300410080800000800081 +:1058500080414100100008110000100003001100F9 +:1058600041A1000000000000000000000000000056 +:1058700000000000800080000020800003008800FD +:1058800008208800800000848021000000000000C3 +:10589000000000000880100010021021000021000C +:1058A000000010100000000080008000A0008201B5 +:1058B0000288C090008800A00000018500900000D0 +:1058C00001000101000800020000014004900000F6 +:1058D0000200C0A1000000000101000001C00100A1 +:1058E000010001A100000000000000000000000015 +:1058F00000000000000040008200A000C0C00800BE +:105900004100090083000400044184C10810000024 +:1059100000000090000000400000000001010004B1 +:105920000100000000012000880008000400404041 +:1059300000029008101000000100A001000100000A +:10594000010000010001000001000401000100014C +:105950000100000101010000000000000001000042 +:105960000000010000000000000000000000000036 +:105970000000000000000000000000000000000027 +:105980000001000000010000004000088404A0A005 +:1059900000000000000000000000000020010000E6 +:1059A000000000000201000040020002C0080502E1 +:1059B0008080000080808080030408210021004155 +:1059C000000908094105081105000220C121000253 +:1059D00005200309030421410010000841000011C3 +:1059E0000000100005080900000000000000000091 +:1059F00000000000000000000000000000000000A7 +:105A00000000001000000021004000800080000025 +:105A100000800000000000000000000200410021A2 +:105A200000200041000980210010808000000080DB +:105A3000098080000089800080002121110421005C +:105A40000410098909110300100821C00440000056 +:105A50000021024009850380020010100811020095 +:105A60000300218008001000021000000000000068 +:105A70000000000000000000000000000040008066 +:105A80000080000000000000000000080008008006 +:105A900000008000800080000000000040801100B5 +:105AA0001000401011000400110040090000000027 +:105AB000008000009000028890A004000111010104 +:105AC000010000000008000101000001018901013E +:105AD00000000000010001880008010000880101A9 +:105AE0000000010001C001000000010000000000F2 +:105AF00000000000000000000000000000000001A5 +:105B00000020000800000010001000080001200024 +:105B1000A0209084080004000200080090000140CA +:105B2000010000000000000400000000010000006F +:105B300000020084000000000000070000000000D8 +:105B400000E007000000000000E00000000000008E +:105B500000E007000000810000E0070000060000F0 +:105B600000E000000000000000E000005000000025 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B900000000000000000000000000007000000FE +:105BA000000000E000000000000000000000000015 +:105BB0000000000000006000003CFF3C0CFC03F310 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C10000000F3550355008B0F8B00A0A2AA0000D3 :105C20000000000000000000000000000000000074 -:105C30000000FF3CF03C3F14031400000000FFFF95 -:105C4000550F000000000C00FC000000303A00007E -:105C50003CF000000CFC0000B4B40000A0AC00005C -:105C6000F0AA00000AFA0000B2000000040E0000D2 -:105C70007800383800FA828E000F00003CF0F0F017 -:105C80000003545700000000000000000000000066 -:105C90000000000000000000000000000000000004 +:105C3000000000000000050455540A3CF53C0CFC33 +:105C400003F300000000000000000000000000005E +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C900000000000FF550F5500880F8800A0A2AA41 :105CA00000000000000000000000000000000000F4 -:105CB00000000000003CF03C3FD703D7000000008C -:105CC00000000000000000003C3C0000DF1F00005E -:105CD0003C3C00005F3F00003C3C0000F53500000C -:105CE0003C3C000035F50000FF0000005F3F000075 -:105CF0003C3C0000FF55AA005F505F5000003C3C58 -:105D0000FF005010FA3800000000FFAA5F0A0000F0 -:105D10000000000000000000000000000000000083 +:105CB000000000000000000000045054FF000F0F1F +:105CC000FFA53CAA0000000000000000000000004A +:105CD00000000000000000000000000000000000C4 +:105CE000AA00BE7D000000000000000000000000CF +:105CF00000000000000000000000000000000000A4 +:105D0000000000000000000000007D7D0CCF0000BE +:105D10000000555555550A3A0A3A000000000000A7 :105D20000000000000000000000000000000000073 -:105D3000000000000000C3C3FF007D7D3F030000A2 -:105D4000000000000000000000005F0A0000D0100A -:105D500000005F0A0000503000005F0A0000C50527 -:105D60000000AF050000350500005C5C000050300D -:105D70000000AF0500003F172B03DFD31C1000000D -:105D80005C5C5F5050D3FAFB0000000055005F0AD6 -:105D90000000000000000000000000000000000003 +:105D3000000000000000D7D705AF00007D5FFF0026 +:105D40005A5A00A53CAA0000000000000000000014 +:105D50000000000000000000000000000000000043 +:105D60000000AA00824100000000000000000000C6 +:105D70000000000000000000000000000000000023 +:105D800000000000000000000000000041410CCFB6 +:105D9000000000003F1703170A3A0A3A50305050EB :105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000F0F555541413F0357 -:105DC00000610003C015000005610A0BC52512A281 -:105DD00040E38007002D920240E38003C025920239 -:105DE00040E38007002D920240E38003C025920229 -:105DF00040E38006002D920240618007002D1002D2 -:105E0000000040618007002D000205610A0D0509B0 -:105E100000A5000000000000000005000A080500C1 -:105E200000A00000000000000000000000000000D2 -:105E300000000000000000000000A5615A0F050DE1 -:105E400000A000B000BE4101C3030000B0B00501D6 -:105E50000F0300000FFF000000000083008300001C -:105E6000000000000000FF0F41010000F0A0C10091 -:105E7000C1000000000000000000033FD7D7BFFFB3 -:105E8000BAFA0000C30FAAFF0F00C5C58380C1C2C4 -:105E9000AEAE0C5800000000000000000000000042 -:105EA00000000000000000000000000000000000F2 -:105EB0000000000000000000000000000A5FBEBEFD -:105EC00092D3BAFB00B000BE4101C3030000BEBEC6 -:105ED00005010F030FFF0FFF000000008383838382 -:105EE0005541FFC300000000FF0FEB0B0000FFAAAD -:105EF000C1C1C1C10000000000000000033F141434 -:105F0000054500400000C30FAA00FFF0C5C540438F -:105F100002015050F0A4000000000000000000004A -:105F20000000000000000000000000000000000071 -:105F300000000000000000000000000000000A5FF8 -:105F4000141410513879FAFEFAFEFFFFAA0850FF28 -:105F500000FFFFFF3000000000000F0F8FBF415512 -:105F6000FFFFFFFF005D000000000000000041FF98 -:105F700055FFFFFF00D500D3D3D300000000000081 -:105F800000004141AF05000000000000F303505045 -:105F90002828BE00202000000000000000000000B3 +:105DB0000000000000000000828205AF0000280AF9 +:105DC000000000080000000805610A0D050C00A095 +:105DD000006100000001000005600A0F050D00A031 +:105DE0000061000AC00D0008006100000001000011 +:105DF0000061000600050000000000000000000037 +:105E00000000000000000000000000000000000092 +:105E1000000500610006000D0000000030000000D9 +:105E20000000000000000000000000610004000D00 +:105E3000000000610006000D00000000500000108E +:105E400000000000000000000000AC5CFC0C5A3CAC +:105E5000FFFF7D7F3C3FAABEAFBFFFFF550000059F +:105E60000000D0A0F0A02B2B003C0F0F0F3CF0F057 +:105E7000F0F00000000000AA00AA000000000000EE +:105E80000000000000000000000000000000000012 +:105E900000000000000000000041000000000000C1 +:105EA000000000000000000000000000FD0D7D7DEE +:105EB0003C00FEFA0EAE0E2E3EFE3FFF000000003C +:105EC000000000000000000000000000FC0CFC0CC2 +:105ED0005A3C00FF555F000F003C0F3FFFFF55008D +:105EE00000050000D0D0F0F02B2BC3FF0F0F0F3CAC +:105EF0003030F3F300B000A000AA00AA00000000B8 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000410000000040 +:105F20000000000000000000000000000000FC0C69 +:105F30003C3C3C00FEFA0E2C0E2E3CFC3DFD0000CD +:105F4000000000000000000000000000000005004C +:105F50000000000808003DFF3D3D0CAEFFFF0000C3 +:105F60000A0054FE0000FF0F000F00000000FFFFBA +:105F70000000FCFFFCFF15140000C0EAF0F0000078 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000001018B030F9 :105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 -:105FC000000000004D4DC300F0F0F0F0FFFFAA0804 -:105FD00055FF55FFFFFFF0F000000000000000003B -:105FE0004141FFFFFFFF005D0000000000000000D6 -:105FF00041FF41FFFFFF00D500FBFBFB000000005D -:1060000000000000EBEBAF05000000000000F30310 -:106010005F5F0000BE0000200000000000000000E4 -:106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 -:106040000000000000004D4DFF3C00002000010258 -:1060500000000000001000000000002000080020E8 -:106060000000000008008800002004020105041060 -:106070000000000800100000840001000010000073 -:106080004010010820100200A100000320000002BF -:1060900088008405C0008404000004040000020895 -:1060A0008400C00004092000A000200004000400B7 -:1060B0000000890088000200A00088008880200974 -:1060C0004000A0802100000421054003000880005A -:1060D00040910000000000000000000000010000EE -:1060E0000001008241028000000000918001400018 -:1060F00000900000400000000000040020C00001EB -:106100004000410504020000800004000000090076 -:10611000000020080000090040020000000000000C -:106120004000004000048000000000404100008268 -:106130000004000020400090C00000000000410268 -:10614000C0C0000000042000008220000002000007 -:1061500000000100000000000200200000200100FB -:1061600002002180020000100041001082020100A4 -:106170000100000840000080000300000003080345 -:1061800020000084032020000041000302410000A1 -:106190000000000500100040000900000000080891 -:1061A0000000A00000008200020089040300020930 -:1061B000A100090040050110080002400041040050 -:1061C0000309020403080308010302110204080082 -:1061D0000008000040000000000080008000000176 -:1061E0002000000084040000000100000000000105 -:1061F00008821000008480880010000004840000E1 -:10620000000080100003C00184100000100000088E -:106210000000008800000088000005100000000851 -:106220000000008405040040200011100208021044 -:106230000004400840088408400982840301048463 -:106240000008200820080804401002008084000193 -:1062500084000000000000000000000500000000B5 -:106260000000900500020088040000850004898277 -:106270000110000011400040000000101041000516 -:1062800000050002A0082010012000410008400580 -:106290008490000000210008002100000004000399 -:1062A0008241000000088210C0082008020004009B -:1062B0000000002100090003000000000041000070 -:1062C000020390210803082100110040000402008D -:1062D000880300030082000000A021000000008865 -:1062E00041C0000000C000C00020030000080011F1 -:1062F0004003040000A0908800000002000300A0FA -:106300000382090003834120000308C100821100B9 -:1063100008A000020000000200A0008404000008A1 -:106320000000000000A000000010008200009000AB -:1063300000000040000000000000000000004100DC -:1063400008001100408880001100080008C0030107 -:106350000000080400A0000000004100A108008027 -:1063600000000404000400050003000000031010F6 -:1063700020414000008010000009400000000000A3 -:106380004000A0000003040000801111010208A0D9 -:106390000004020000800000C000C0110000C00026 -:1063A0000000C0050000C0118204004000048240CB -:1063B0000441000008100420C020A0044005200073 -:1063C000A000004020000840C104A0848305820092 -:1063D000C0000890821084400000000040001001BE -:1063E00000400900000109010084200400A02000F1 -:1063F00080018000800402202040089000C000A09E -:1064000000080010000000A011040002200020007D -:10641000C0112000000020200000008800000000C3 -:1064200005000000200000900000040000000000B3 -:1064300000002000401021008011000041A0080051 -:106440008800080000C1029009820201081120841E -:1064500000902100210409C1210000000000000873 -:10646000900800080021011021030120000084C1D0 -:1064700040000908000009A104080009000000020A -:1064800000000005A0118200842100402041C008C6 -:10649000048310042004082000100000A01100094B -:1064A000A011A00800000000C00010000202C000FF -:1064B0000000000000000420040004000800200385 -:1064C000200000000808C000824182108200820380 -:1064D000000300008208210800900088020000A04C -:1064E000001002000084008220A12000209100C042 -:1064F0002104110090090000C00282A000000002E7 -:106500002103200000A00040000800840008800053 -:1065100000009140218983031005028500000308D3 -:1065200000040888058800000000210008008000A1 -:1065300000000000000000008000800080000000DB -:106540008000800000A0090000000000000000841E -:106550000000000005080404A084100408040000E2 -:10656000010040800080904100002008000000846D -:10657000000082009000844184034002044100082E -:1065800084214021000982030204840000009084D9 -:106590000103824100402040010421882080000046 -:1065A000001100009008000200000000000500003B -:1065B0000000001020050000058002000009008096 -:1065C00020212000000002400400A1088840A0050E -:1065D000400041008200412100040000404102804F -:1065E00000002000000200040000009000000000F5 -:1065F0000921000000400000000000A0A010800061 -:1066000000840800008200000000038200000000F7 -:106610000004200000020001800404A08440C004A3 -:106620000000004000000300000000000000000027 -:1066300000400000001020040000842082000000C0 -:1066400000408010800000020201000008000304E6 -:10665000000021A040C02184200000010040030868 -:106660008304000001000900000000000000000099 -:1066700004000000C0039005C083A0A0028920048C -:10668000A090000100008200000000000000000057 -:10669000000003C00002410191208888018200208F -:1066A00082900000000000000000000000000000D8 -:1066B00000000000000000000000000000C040409A -:1066C0000090C00205010100000110010482004099 -:1066D0000088100400008989A011C010000000008B -:1066E0000000020000000300020000001100000092 -:1066F0000500000000001121C0020003808080031B -:106700000520800211401105411100050000000024 -:106710000000000091901089C010820000000880E5 -:1067200005000080000000000000000000000000E4 -:1067300000000000000000000000000000000380D6 -:1067400000800000808091402021000200408000F5 -:10675000008000800080000541214003802000006F -:10676000000005008000098010000900049100006D -:106770000000002080000280800002002141108083 -:10678000900083204183108003102000001000003F -:106790000040000000001089090000208000004136 -:1067A0000005008200000000000000000000000062 -:1067B00000000000000000000000000000000000D9 -:1067C00080008041004180808000C1008211A000D3 -:1067D000800000100004000000400003000400835B -:1067E000800580000002800000100000000000888A -:1067F000000000000001C000209008000104830197 -:1068000001A00900A00101A1010400010082000112 -:106810000000000000200000899002000200100427 -:106820000001840300A184100000000000000000AB -:106830000000000000000000000000000000000058 -:106840000000400040039001C01002A00200A1011E -:1068500009008800A000A0218400000100010005BB -:106860000083020082000001C090000000000000D0 -:106870000001000200C0000001C0900500049082E9 -:1068800088A1200201852003088800010000A000E3 -:10689000000100000000000000000403A010080533 -:1068A000A1880282109110408209000100000000BE -:1068B00000000000000000000000000000000000D8 -:1068C00000000000C0880020024000C00010000945 -:1068D00000830111A084000400028200409008049B -:1068E000080200C00020049008C000C00002002080 -:1068F00000080008000000000000408080880400BC -:106900008904008200A011111021910200210920A8 -:10691000040300410000000000000000808800C166 -:10692000C1848491880980048080110400010000E2 -:106930000000000000000000000000000000000057 -:1069400000000000000089000080008000800080BE -:106950000083008211C00000008000808000800061 -:1069600004000985118500008000000005804100B9 -:10697000111021000304000000400000000000840A -:1069800088C004008220218090039000050020111F -:10699000830020002000000080000000800004042C -:1069A000094010000003801000400000800000013A -:1069B00000000000000000000000000000000000D7 -:1069C00000000000000000008041800280C08000C4 -:1069D0000000118502004040800300880000800014 -:1069E00082009020820080000000008000000000F3 -:1069F00001040000010001000000001100880000F7 -:106A000082C1A1408204090103409101098800006C -:106A100001852000010091000800080082000800A4 -:106A20000004008801020000C000C002088888003D -:106A30000001000000000000000000000000000055 -:106A400000000000000000000000C001200140C064 -:106A500008400000010201000101C000102088A0D0 -:106A6000A0000200A000090082000000004000C059 -:106A70000000000000E000000000004100E007000E -:106A80000000818100E007005006001100E00700CF -:106A90000000840000E0070000000000000000008B -:106AA0000000000000E007000000000000E0070018 -:106AB0006000000000000000000000000000000076 -:106AC00000000000000000000000000000000000C6 -:106AD00007004842000000E0000000000000000045 -:106AE00000000000000000E000004106000000E09F -:106AF0000000000000000000000000000000000096 -:106B0000C0C0000046FF42FF0030FFFFF0FF000062 -:106B100060626262BD3CBD3C0000000007070707E1 -:106B2000000000000000000007E7E7E70C0CF60695 -:106B3000B4B4B4B400000000000000000000000085 -:106B40000000000000000000000000000000000045 -:106B500000000000000000000000000000000C0C1D -:106B6000E724A000A0003D343D34FF0FFC0C0000E2 -:106B70000000F0FFF03C00000000000000000000FA -:106B80000000C0C0F0F046FF42FFF0F0FFFFF0FF52 -:106B90000000606060609900990000000000070F2D -:106BA0000F0F00000000000000000FFFFFFFFCFCC3 -:106BB000F606FF99660000000000000000000000DB -:106BC00000000000000000000000000000000000C5 -:106BD0000000000000000000000000000000008035 -:106BE000CFCFE72405000500BDB42D24F000FC0C38 -:106BF00000000000F000F03C000000000000000079 +:105FB00000000000EAFFFFFF000000005050FAFA66 +:105FC00000000000000000000000000000000000D1 +:105FD000050000000000000005FF05050CAE0CAE3A +:105FE0000000000001AB0303FFAA00FF0000000057 +:105FF000FF0F000F0C000C001414000000AA00FF9B +:106000000000000000000000000000000000000090 +:1060100000000000000000000000000000002C3024 +:106020003C20000000000000000000000000000014 +:10603000000000000000FFFFFFC2000000005555F7 +:10604000FFFF0000000000000000000000048804C2 +:10605000040484800000000000002000840084000C +:10606000200004000000A000200020008400880020 +:106070000400200000000003000089802000880048 +:1060800089008400880088008400000320008400C8 +:1060900084002005200090008810841088002000D3 +:1060A00021004000400020088400400020802000A3 +:1060B00004002080200004004000880088002000A8 +:1060C00040002000040040000400880000000000A0 +:1060D000000000000020040000000000000000009C +:1060E000000000000000000011022100A1000400D7 +:1060F00000902000000011001100000008100000B6 +:1061000000002000000040002100040000004000CA +:1061100000000940210040020090000100010090B1 +:106120002140408400842040000000000000400224 +:106130000000C008A00400000000000000000008EB +:1061400000000000000041000000004000040200C8 +:106150000000040000100200000000000000100019 +:1061600000000000041000001000000002100000F9 +:10617000C00000000000000084050000A005080821 +:1061800000030085000000000000000001C00000C6 +:106190000000000000008400000000000800000073 +:1061A0000000820000840002020000000000820063 +:1061B00000024000009010100010000000000010CD +:1061C00000000200020400008200000002100040F3 +:1061D000000800000000410000000004030000006F +:1061E00004000500000800820900001000108488E7 +:1061F0000008000000000010000000000004000083 +:1062000085090000000200084000001004840420FA +:1062100000000008040004040800000000000084DE +:106220000200044000000202000900000400000017 +:10623000021000058008002080000000000000100F +:106240000400000800000400040402C000840008E8 +:106250000004000000000000002104000000A00075 +:106260000000820020000000000800000000000084 +:1062700084058810880090009041000000000041D3 +:106280000021008020044040000000000085000044 +:106290000008000000000009000800100000400095 +:1062A00000080010000000000000000500050000CC +:1062B00000080021000000211104002100008800D6 +:1062C000000000210021002100400021000000000A +:1062D000900000080010000000000008800000008E +:1062E0000010000000A00300000000A00000110842 +:1062F000000000A01110110000A00000110000001B +:10630000000000000808800180010000000000403B +:10631000009000A0000000000000210041000000EB +:10632000000005000088000003000020000000823B +:1063300000100000000000000000A0054100000067 +:10634000410800000000051000A0004000A0000867 +:10635000410000A0004020009000004000400805DF +:10636000400082080000A00000000400004000007F +:10637000001000000040A0000021080940000000BB +:10638000A003880040031000C02108004000C000A6 +:106390000380C020080000008400820008008220E2 +:1063A0008305080500008200080040808241080043 +:1063B00082000010080008004005000800200004CA +:1063C0000000004100000200002000000800004022 +:1063D000A0000000080000002100000000000000F4 +:1063E0000000000000840000020011000000000016 +:1063F0004100000011A000080020210000008000E2 +:106400000000418200080000918800040082000022 +:1064100000828240000000A0000003840800000009 +:1064200000840200800000000082008480080000D8 +:10643000208400000000410040008040200404014E +:10644000004100000090000000000000000000106B +:1064500000A000000800000000A0004100000000B3 +:10646000000000000380008009000010A000C000B0 +:10647000000020002000000020000000000040413B +:10648000840000020002C000000000082000000894 +:106490000800080000401000000000000000C000DC +:1064A00000000010000020000000000000000003B9 +:1064B0000021820002030003100000000010000011 +:1064C00008202004000800008200002100000000D5 +:1064D000A000000008000000000008000084000088 +:1064E00000C000000000822000200484000800009A +:1064F00004080420800083040008800000000000DD +:1065000000000000000000A0000400002001800046 +:1065100000881100000000010000000000000000E1 +:106520000000000000000000000000000000000269 +:1065300000A000A003A000000084050000000000EF +:1065400011880001800100000800410008000000DF +:10655000410020000000400000A0000000000000FA +:106560000000880000000820040000000000001067 +:106570000809004000020800040020008800000014 +:1065800088000000004000020000000000048200BB +:1065900001000000000000000000082000000000D2 +:1065A0000200200800000000004000000000002160 +:1065B0000088002100000085820882001000820807 +:1065C0000110004000A101000011001108000000AE +:1065D0000800000000000000200000000000000093 +:1065E000000000000000000800010084000000001E +:1065F00000000000000000000000200080000000FB +:10660000000000002008000000000000110020C071 +:106610000040204002A040000000001040000000A8 +:1066200000000000000000000000000100880000E1 +:106630000000000800004000020211000008208451 +:10664000090040A020A02104200800000000020052 +:10665000000000000000000000000000000000003A +:106660000000000000000000000001400090000455 +:1066700090C0000000000000000020C00020014089 +:1066800088200308A0208409820500000000000083 +:1066900000000001020000010001000000000000F5 +:1066A0000000000000000000000000001008009042 +:1066B0001088020800000100A00000000000000097 +:1066C000000000000811200800418882000000003E +:1066D00000000000000000000000000000000000BA +:1066E000000000000000000000000000208000808A +:1066F000000080000000000000000000008000009A +:106700004000000090C002850020008300000000CF +:1067100000000000402000410008000200000000CE +:1067200000000000000000000000000000000080E9 +:106730000000008000000003411000110002000072 +:1067400000000000000040C11002021100820000A1 +:106750000000000000000000000000000000000039 +:106760000000000000000000000000000000000029 +:106770008020808580800000000000000000000371 +:1067800000000020008080000090000500800000D4 +:10679000000000000000200010410520410300001F +:1067A0008000000080800000000000000000000069 +:1067B00080000040800080000900080004004108BB +:1067C0000000000000000000888002884011904016 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F000C00082011041C0900000000000000000B5 +:1068000090008800100190C0400008C1888288C0B4 +:1068100000000000000000000110000101A10103C0 +:10682000020082008800C09000000000000000000C +:10683000000002000200A000A00000000100000013 +:106840000101000000000000000009404010890123 +:106850000400000000000000000000000000000034 +:106860000000000000000000000000000000000028 +:10687000000040400088904003020000000000003B +:10688000000000022004C008100883880010C00225 +:10689000108800000000000000000001010000005E +:1068A00001010000000000000000000000000000E6 +:1068B00000000000908800A0000208C00000000155 +:1068C000A000000100000000000000000402008899 +:1068D000012083880000000000000000000000008C +:1068E00000000000000000000000000000000000A8 +:1068F00000000000808000808080A0000000000078 +:106900000000000000808080800011004120208570 +:1069100082C02009000000000000000000091102F0 +:10692000090011110000000000000000000000003C +:10693000000000000000001000890011809100415B +:10694000020482110041000000000000000080826B +:106950000991051091800000000000000000000077 +:106960000000000000000000000000000000000027 +:1069700000000000000080208020808000000000D7 +:1069800000000000000000400000000000000005C2 +:106990000083008080000000000000000000A100D3 +:1069A00010029000000300050080000000000000BD +:1069B0000000000000000000800000808000000057 +:1069C00021002041400003400000000000000000C2 +:1069D000412121880280100000000000000000001A +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000900182C1084000007B +:106A00000000000000000000000100040010000071 +:106A1000C000840308108200000000000000000095 +:106A2000C188020109001000000000880040000039 +:106A300000000000000000000000040004041040FA +:106A400088000108010000000101000000000000B2 +:106A5000000021014004010241000000000000008C +:106A60000000000000000000000000000000000026 +:106A7000000000000000000000000000000007000F +:106A800000000000000000000000000000E0000026 +:106A90000042810000E000004842000000000000C9 +:106AA0000000880000E0070084000081000007006B +:106AB00000000000000000000000000000000000D6 +:106AC000070000000000000000004100000000007E +:106AD00000000000004100E007000000000000008E +:106AE00000000000000000000000000000000000A6 +:106AF000000000000000000000000000F0F0F0F0D6 +:106B0000FFCC00CC000000000000000000000000EE +:106B100020401080A0050000A0050000000000003B +:106B200000000000003CFFF6000000000000000034 +:106B30000000000000000000000000000000300025 +:106B4000F00009091800000000000000000000002B +:106B500000000000000000000000FF3FFF3D0000BB +:106B60000000000000000000000000000000000025 +:106B7000000000000000000000000000000099FF7D +:106B80006600FF3C003C0000000000000000000028 +:106B90000000040208010000A0050000A00500009C +:106BA000000000000000C3FF09000000000000001A +:106BB00000000000000000000000000000000000D5 +:106BC0000000000009093C00000000000000000077 +:106BD0000000000000000000C3000000FF00FF00F4 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000000000000000000000000095 :106C00000000000000000000000000000000000084 :106C10000000000000000000000000000000000074 :106C20000000000000000000000000000000000064 :106C30000000000000000000000000000000000054 :106C40000000000000000000000000000000000044 -:106C5000000043084000008421860000000000007E +:106C50000000000000000000000000000000000034 :106C60000000000000000000000000000000000024 :106C70000000000000000000000000000000000014 -:106C80000000000000006666999938003800808096 -:106C9000C0C0000000000000000000000000000074 -:106CA0000000000000000000000081817E007E7274 -:106CB000818D9090E7810606FFFF00000000000034 -:106CC00000000000000000000000000000000000C4 +:106C800000000CCF4E8D00FF666600000000000083 +:106C90000000000088440000821400880044102096 +:106CA00008040000000000000000000000000000D8 +:106CB000000000000000663C0FFF00000000000024 +:106CC00000000000000C00000000FFFD00000000BC :106CD00000000000000000000000000000000000B4 -:106CE000FF7F0000FF66FF6600000804CFC3CFC32C -:106CF00000000000000000000F0F0F0F0000000058 -:106D0000000000000000000000000000F900F90091 -:106D10008181C3C300000020000F000F00000000AD -:106D20000000000000000000000000000000FF0064 -:106D30004272BD8DF6F6E7810606060600000000E9 -:106D40000000000000000000000000000000000043 -:106D50000000000000000000000000000000000033 -:106D60000000FF7F00003F003FC300000000C0C3E1 -:106D7000C0C3000000000000000066663C3C0061EB -:106D80000005000900000061003F009D000800614F -:106D9000003BC00500000060003D000D00000061E8 -:106DA0000007C00C000000000000000000000061AF -:106DB000500F000D00A0A5614A0F050D00A00000B6 -:106DC00000000000000000000000000000000000C3 -:106DD0000000000000100000100020080040000823 -:106DE0000061400000010000A00000000010000150 -:106DF00000610007009D000000614007009D000544 -:106E00008300050051101010000000000000000079 -:106E100000B000B04100C30055505550FF3F5A1A12 -:106E2000F5F7FFFF000CA0A000000000000000002C -:106E30005F0F550000FF00FF000000003030FFFF33 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000F101F101F0FFF0000000000000005F -:106E70000000FFFF00005500FF00000000000000C0 -:106E8000000000000F0000000000000000000000F3 -:106E9000000000BE00BE4141C3C355505551FF3FE5 -:106EA0005A1A000000000000A0A00000000000002E -:106EB00000005F0F55002828F8F80000000030306F -:106EC0003030000000000000000000000000000062 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000F101F101F000F00000000000DE -:106EF000000000000FFF0F0055FFFFFF0000000023 -:106F000000000000000000003C0C28080000000009 -:106F10000000000051FF51FFFFFFAA82002C002C4F -:106F20003C3C00003C0C3C040C3C0C3C00000000D1 -:106F300000000000FF0F0F0FBCBCBCBC0000000035 +:106CE000C000C00000000000000000000000000024 +:106CF0000000000000000000000000000000000094 +:106D0000000000000CCF0CCFC3C3333300000000E1 +:106D10000000000000008844821400008800440045 +:106D200080400102000000000000000000000000A0 +:106D30000000000000000000663C0F0000000000A2 +:106D4000000000000000000800000000FF3C000000 +:106D500000000000000000000000000000000C0423 +:106D60000C0C80000000000000000000000000008B +:106D70000000000000000000000000000000000013 +:106D800000000000000000000008000000080000F3 +:106D900000000000000000639007000D100000617B +:106DA0000002C00D0800000000000000000010619B +:106DB000000CC009000000000030000000080000C6 +:106DC000000000000000000080610006004D00008F +:106DD00000610006000D000000000000000000003F +:106DE00000613037000104010000000000000000D5 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000FFFF3030F3F300000000000000000E +:106E40000000000000000000000000000000FFFD46 +:106E5000FFFFFFFFFFFF0000F00000000000000048 +:106E60000000D7FFA000FFFCFFFC000000000000B6 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000020000000000000C2 +:106EB0000000A000FFFF3030F3F3000000000000EE +:106EC00000000000000000000000000000000000C2 +:106ED000FFFDFFFFFFCFFFFF0010F00000000000EC +:106EE000000000000000A000C3C0C3C000000000FC +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 +:106F20000000000010000000000000000000000051 +:106F3000000000003FFFAAAA00F0707000000000EF :106F40000000000000000000000000000000000041 -:106F50000000000000000000000000000000000031 -:106F6000000000000000F303F000F000F055000006 -:106F70000000000000001C1CBCBC00000000000061 -:106F8000000000000000000000003C3C3C3C000011 -:106F900000000000000041FF41FFFFFF828200FF70 -:106FA00000FF3C30000C3C003C00000000000000F2 -:106FB000000000000000FF000000A0A0A0A0000052 +:106F5000000000000000564556452000F0F00000FB +:106F60000000000000004100AEAE00F00CFC00008C +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000018000000000000000000C9 +:106FB000000000000000FFFFAAAA0000707000009F :106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE0000000000000000000F303F000F000F05586 -:106FF0000000000000000000BE14BE1400000000ED -:107000000000000000000000000000000000200060 -:107010000085000288009000000000000000400091 -:107020002100210001008802200800000000000467 -:1070300000802000208041800003000040002005E7 -:10704000200389040405840000038808C102100994 -:1070500000001000880088008404890088802005D2 -:10706000898020000040400002000505200021101A -:1070700000000400850440800840209120000400A6 -:107080001003041040008400408010000000000045 -:1070900000000002000010000000000000000000DE -:1070A0000000A0A0889008001000800000000800E8 -:1070B00000080010C00080402010100000000000F8 -:1070C00009000000040080000000000000014000F2 -:1070D0000000000000004000000420004000000408 -:1070E0008002400400000002200000208800000010 -:1070F000020200024102040200208903000210047F -:1071000090004004100090020002A1200000000046 -:10711000000000000000000001000220000000004C -:1071200002000000900490009190091002001100EC -:1071300000058400000500000000000000002000A1 -:1071400002040000000000000800010000000088A8 -:107150000020890800100000000004000000034126 -:1071600020414000000002000209820001032000CB -:1071700009090920A040080804840900080503053E -:10718000090800058510901040210005400000000E -:10719000000000000000000000004010001000008F -:1071A00000000000000000110000200340840000E7 -:1071B00020100000200805080088000800080010C2 -:1071C000800000010000040800100908040000000D -:1071D00005020909040009040004000020840008D5 -:1071E00020009088800000080040840004100800FF -:1071F0000004840484054008A01000108400820864 -:107200000200901002824008050980100404808268 -:1072100000000000000000000008028800082000B4 -:1072200000000400040000004008848020210800C1 -:1072300008400000004001020041000000039040AF -:107240004005008800050141822020210000000047 -:10725000000000A084C000210020002108080003D5 -:10726000000000210400002100000410000040087C -:107270000000000800210005004001000008004156 -:10728000820000090005A000051010400100081050 -:107290009008000000080082000004100002400076 -:1072A00000004100C184C1400000800005020300CD -:1072B000800480000000038820000010048808106B -:1072C000088400A000044100208400A18020001058 -:1072D0001100000009200020004000000010000004 -:1072E000000041000000000000000800000800004D -:1072F00000900000000000004100000104A0000018 -:107300000808410003080002008404010000041082 -:10731000000800008800000000000000000040415C -:107320004011040804000020C105044100210109A6 -:107330002008A1059004C0202000A000040008003F -:10734000820002009010040004000411C100219189 -:1073500041201000000004000400409004888200D6 -:10736000000082008200000000098200C041400944 -:10737000081082050808C08210209009A10082052B -:10738000040400400911C0A0040882020021002169 -:107390008220A004094000C000820000000000001C -:1073A00080000000400183A040910400C000000460 -:1073B000200020A0049003C000C0800400C0000092 -:1073C000808441848010040000902120418220901C -:1073D000402020008800000080048400A120800458 -:1073E0000490088420000000000004A000A0049085 -:1073F0000910001002A01100004000854084080020 -:107400000288828403A004C00411910003C0088490 -:1074100000400009200004C00000000000000040FF -:107420000088401040401000010000000041108022 -:1074300000008400201000000021000200038202EE -:107440002005210341402000C004C010210001009C -:107450000900080000848288000008000002002162 -:10746000C080A0000000C00000002000200808210B -:10747000C0000003C1A1A021C00008000005000851 -:107480000011080008004000828200000000090886 -:107490000090000010001002820000840000000034 -:1074A00000100002000080C0800804A00004000456 -:1074B000002002900300831005022100000805400F -:1074C0000800800288000201820000011108208863 -:1074D00020082000009000210021000010840001FD -:1074E00010040020000000000000000080000000E8 -:1074F0000000000000000810000000000000001064 -:107500000000000080A0000000201004000000C067 -:10751000840805210804050008000000004100005F -:107520000000000800080000400040000008400083 -:10753000A02190000200000820212000200420212A -:10754000201020040021000083802000200500047A -:107550008221882040098282020301020000C020AB -:107560000002002100A00008000000000000000050 -:107570000041400001008200000010218200000054 -:10758000000000090080820040108505C0800410C2 -:1075900090100808000082000010001182111100F4 -:1075A000000000000000000100008284800000084C -:1075B0000002000021000000000800C08040802080 -:1075C00080008000828200884000020485048000E0 -:1075D0000000000000002100000500002000000065 -:1075E000410100910200400521000000410000001F -:1075F00000042002800820104104050800A0008239 -:1076000000820008000009200000200008A00040BF -:10761000000203910908008421044188200009C068 -:1076200000000000000000000000880001000001D0 -:10763000000000000000000010A101821140C00401 -:10764000000000000000000011C0008400A0C088FD -:107650000000000002000000828201840400908289 -:1076600000000000A1010100000100000000000076 -:107670000000000000010000000000000000000009 -:107680000000400400880040101000C04088000244 -:107690008210841000830400C0A0402009A08388C9 -:1076A000908400000000000000000911880440419F -:1076B0000003000000000000000011910811C083C9 -:1076C00000110000000005000000A08000004080C4 -:1076D0008000000000020902000300002000C0003A -:1076E000000000000303A0020300000200000000ED -:1076F000000000000011002100090020000000002F -:1077000000000000808000000000000000800000F9 -:1077100000008000119100A180048040800088005A -:10772000890080800000000000000000000041008F -:107730000804412100000000000000008240800297 -:107740009104910000080000004000000005801036 -:107750000085000010800400400002402009101045 -:1077600010080321000011802100030041100000D7 -:1077700000000000000000102100050002110000C0 -:1077800000000000800000000009000480000000EC -:107790000080800000008080802180800000000048 -:1077A000881184049100000000000000000000C067 -:1077B00000000100010100000084000000A0880317 -:1077C00082010520C0900001000000890000C00077 -:1077D00008011040C0000102010001000000839078 -:1077E00004010183C00100000004004000000140CA -:1077F0000000000000000000000001000100002067 -:1078000040000000C000C00000000000C0849020C4 -:10781000880002108440048202102001024000040B -:1078200090000501A0010800000000000000000019 -:1078300000010000030000010100000084000000BE -:10784000080220A0020521C1000010000000000075 -:107850009088040800104020000100010100000091 -:107860000284200000091084000001000000400094 -:1078700000010000000000000000000010010100F5 -:10788000000100000000000000000040002004088B -:107890000400402000A082049110A09000A00341A9 -:1078A00004C1100300A0000902C100000000000094 -:1078B0000000000910080841004104000000000019 -:1078C000000080108009001002910000800000007C -:1078D0000200000080000000050000204004034179 -:1078E000000580200010009089200000020500059E -:1078F0004102000800000000000000000000A10894 -:10790000400002400300000000000000038000006F -:1079100080800000800000800000088000A0210519 -:10792000C04080C180C0000400A1800300000000AE -:107930000000000041842000410008110000000206 -:1079400000000000880480859100911180000000F3 -:107950000000000080000020008000000084090476 -:107960000200030041004089A18005410000028916 -:10797000000402000340000000000000000000833B -:107980000200020021110000008000800000800041 -:1079900080020000000000000000008080008305DD -:1079A0000904000011008980091021000311000062 -:1079B0000000000000000140000000000100000085 -:1079C000000100000000090088400888030008004A -:1079D000100000001000C0009002080840000010D5 -:1079E000000100000100830801C00908C001000077 -:1079F0000005000100000100000000000000000080 -:107A00000002000000000000000000020010000062 -:107A1000C000A0A140040000A00004000408100061 -:107A2000040000034004C000C0C02008851001000D -:107A30000000000000000000000000E00000000066 -:107A40000000000007000000000000E00700000048 -:107A5000000000E000000000000000E00700000659 -:107A6000000000E000000000000000E00700410A04 -:107A70000000000000E0070000000000000000001F -:107A80000000000000E00000000000000000000016 -:107A900000000000000007000000000000E00700F8 -:107AA0000000000000000700000A000000000700BE -:107AB0005000000000000000000000000000000076 -:107AC00000000000000000000000000082820100B1 -:107AD000BE0000AA3CBE000000000000F0F0687C80 -:107AE000EAFE00000000000000003F3FAFAFFF28AB -:107AF000FF7D00000000000000000000000000000A +:106FD0000000000000000000F0B5FAB5000000005D +:106FE000000000000000000000007F7F00F00CFCAB +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000208000076 +:107010000000400000801104000000000003C004D4 +:10702000880020800480010484800000840088801F +:10703000040085000080040841800180409005051F +:10704000840041000104100000032000840020207F +:1070500088002000840000002000840088008885CB +:107060000400C1002100880020002000C100208011 +:1070700089800400C0000000208000002000200063 +:1070800020000000200000002000000000000000A0 +:107090000000000000004004040000000084000024 +:1070A000000000008004000420050004000009889E +:1070B0000004000040000010200008024010800280 +:1070C000C00000004000020000000000410000007D +:1070D00000000000050040000040210220000000E8 +:1070E0000002000040C0080040840000400008008A +:1070F0000010042000004000000000040000000018 +:107100000000000020000084040000000000A00037 +:107110009000000040000000A0000080000000007F +:10712000000008009004020000102000000500008C +:10713000200082000000020908080000080000008A +:107140000000040000040880000008400000000067 +:1071500000000000A000400040000400000000000B +:1071600000004000000000000009000008000000CE +:1071700000000208082001000000020008040000CE +:1071800000000000080000000210080008000000D5 +:107190000000000000008500000003004004000023 +:1071A000000000000084050100A000C084820004EB +:1071B0000000A0820082000004048400000080041B +:1071C000000400008000040203100082008500001B +:1071D0000000000000100090800089880084008476 +:1071E000000804088400000000C0001000840000B3 +:1071F00000000000000004090808000080000009E9 +:107200000408000800400088008404000004008294 +:107210000000002100000000000000000004000049 +:107220000000000800000000200800000021000805 +:107230000005002120008840000500000221000018 +:1072400000410041000008409000000200080000DA +:10725000000000000021000000410041000000008B +:1072600004088800000884000805000204000008E3 +:10727000840900000000C0030820C00000000009CD +:1072800000000000000000000000000800210000D5 +:1072900000000000000000000008000000000001E5 +:1072A00000000300030000000400C1A04100000032 +:1072B0000440000000828090009000000000000068 +:1072C0000004002000200088000208A00008000040 +:1072D000000200000000000041000000000000006B +:1072E000000000840002008208000000001003007B +:1072F00041000000000000000000000108A00000A4 +:10730000000800004100000000000000000000082C +:1073100008000000A0110820000500000421000062 +:107320000000850000000000C00020410020000097 +:1073300001000000209000092000C0104100080258 +:107340000009410800000000C00004118210828082 +:10735000C00000000000C000A0001000C0008203B8 +:107360000800C0408441880000009000820008406E +:107370000000202000000040004004000000000049 +:107380000000041000000000000000000041A040C8 +:10739000100000400000000000000000000000A0FD +:1073A000000804841000000800080000858200889E +:1073B0000400200400008011000080000008C000CC +:1073C00000001100C00000000000000000A000A1AB +:1073D00000020000100000000000410041002100F8 +:1073E00020A04100200020820000000000080000D2 +:1073F00000101004000400C0000005000500008417 +:107400000004400003000000000004080310000412 +:107410000000000000000000000800000000001054 +:1074200000000000000420000000200508400000CB +:107430002002000000088200000000000008820214 +:10744000002000001000100082000040000004A096 +:10745000840008000811C041000000000000820004 +:107460000808000082000021000000000000000861 +:1074700008080010000000000800008084000000E0 +:1074800000000000080200000000000000000000F2 +:1074900000000000000000000000000000000000EC +:1074A000000000000000000180000000000000005B +:1074B0000000802000200800080004200020002098 +:1074C00011200000000080000000000000080500FE +:1074D00080210000000020080000000000000000E3 +:1074E00000100000400800840000020000000008B6 +:1074F000000000A0000800000000000000100008CC +:10750000000800000400000000002100000000004E +:107510000000000000000000000800000000000063 +:10752000000000000000000000102000000000210A +:10753000001000410000000800000000840000006E +:1075400000000000024000880003200082080000C4 +:1075500082048211002108040011040000000000D0 +:107560008400000000000000000082000000C00055 +:1075700000110000002100000000000000080009C8 +:1075800000008200040000000000004100410800EB +:10759000200000400000000000000000000000008B +:1075A00000000000410000A00000008280000000F8 +:1075B00000000000000000000000000000000000CB +:1075C0000000000400200900000210A000000000DC +:1075D0000008110008A00008800041002100000000 +:1075E00041004000001008820002000010100082DC +:1075F000100420002000200000C020C000900004E3 +:1076000000000800001080020200000000000000DE +:1076100000000220000000000010211003000020E4 +:1076200000000000000000000000000088010000D1 +:107630000000010000000000010010000000000038 +:10764000000105000000000120010300A0019001DD +:1076500040A00085C0A0C08400C000A000080004B5 +:10766000000000000000000000000000100000000A +:10767000000100000000000000008488A08500A137 +:107680000883C0400020008408C000000000010002 +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000009200011A0 +:1076B0000020000021000000000011041011004112 +:1076C0000000001103000009000800410320000829 +:1076D0000021800000020000000400910011002041 +:1076E00000C0000000000000000000000004801046 +:1076F0000003000840002100000000000084002179 +:1077000000040003800000000080800000000000F2 +:107710000800000000000000000000000000000061 +:107720000000000000000000000000001100210027 +:10773000090010111180100002020504000002006F +:107740001100030300802141110203108000040096 +:1077500009008403890090039084008000000004E5 +:107760000000000800000000000000000000000011 +:1077700000000000000308002000050021000000B8 +:107780000000000000200000000380008080000056 +:1077900000200000000000000000000000000000C9 +:1077A00000000000000000000000000000000010C9 +:1077B0000100000000C100400000000000000000C7 +:1077C00001000100010100100100014001840402D8 +:1077D00088000000A08504088300A18484900040F4 +:1077E0000000002000010000000000000000000078 +:1077F00000900000000000010000010000000100F6 +:107800000000000000000000C000C00184001090D3 +:1078100000000001008200000000000000000000E5 +:107820000000000000000000000000000000000058 +:107830000001000002000001000000000001000142 +:107840000000000000010100000000000101000133 +:1078500000A00003014100A0C011000201890490B2 +:10786000040000000000080000000000000000000C +:107870000000000000000100000000010000000006 +:107880000000080401200084A00800400004A0C0FB +:10789000A1C0000000000000010000000000000086 +:1078A00000000000000000000000000000000000D8 +:1078B000000000080041001000110000000000213D +:1078C0000011001100004105111000000004050521 +:1078D00010110090212005A1108980900000212125 +:1078E0008004800000000000030000000000000091 +:1078F0000000000000000500100000000010000063 +:10790000002000098080100041000000008000007D +:107910000000020000000000000041000000000024 +:107920000000000000000000000000000000000057 +:107930000000000041820041000002090000110027 +:10794000200005101190110004000000200088099B +:107950000400031021110421108003412000004085 +:10796000A1000402A1008310830088000000000031 +:107970000000000000002100100040000000000096 +:10798000000000000040080400004000100000005B +:107990008000008000008000000080008000000067 +:1079A00000000000000000000000000000000000D7 +:1079B0000000000000000141000000000000000283 +:1079C000000000000000001001000100000089021A +:1079D00002004000C10001C00000008401018910C4 +:1079E00088A109004000C1008200050005000000D8 +:1079F0000000000000000000010000000100000085 +:107A0000000800000000000001010000000001006B +:107A1000A00082C082084000C000020004000200F2 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000810000E007000000DE +:107A4000000000E000000000000000E00000000076 +:107A5000000000E000000000000000000000000640 +:107A60000042000007008800000000000000000045 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000000007008800000000E0000077 +:107AA00000120000000000000000000000000000C4 +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000000B6 +:107AD000000000F000F20000000000000000F0FED6 +:107AE000FEFEC0C000FF0082008201000500000011 +:107AF0000000000000000000000000000000000086 :107B00000000000000000000000000000000000075 -:107B100000000000F0F0F0F0553C553C202FE0EF65 -:107B2000F0FFF03CC7C7EFEFFF003A300F0F0F0038 -:107B3000D5FF557F0000000000000000000000009D -:107B4000000000000000000000000000000080C3F2 -:107B500000AABE0000AA3CBE0000000082FF000098 -:107B60004054C2D600000000000000003030A0A049 -:107B70000028007D00000000000000000000000060 +:107B1000F3A20302FF0FFFFC20000000F0FFAA3CCD +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000A000A20000000000000000E3 +:107B6000000E0E0ED5D500FFA0A00082010000007F +:107B70000000000000000000000000000000000005 :107B800000000000000000000000000000000000F5 -:107B9000000000000000AAAA00FFF0F0F0F0202F83 -:107BA000E0EFF000F03C04042C2C00003A30000020 -:107BB0000F0080AA002A0000000000000000000062 +:107B90000000F3F70357FF0F0FFC20200020F00038 +:107BA000AA3C0000000000000000000000000000EF +:107BB00000000000000000000000000000000000C5 :107BC00000000000000000000000000000000000B5 -:107BD000FFFB550014140000000000000000FF002F -:107BE0005555FF5F00500000000000000000BEBEC1 -:107BF000AAFFFCFCC0C00000000000000000000064 +:107BD00000000000000000000000000000000000A5 +:107BE00000000F0F3C3C000000003000505000002F +:107BF0000F0F000000000000000000000000000067 :107C00000000000000000000000000000000000074 -:107C10000000000055555555F3B230B2FFFF00008B -:107C20003F3F0AFA0F0FC3C355FFC3FFCFC0CFC0FA -:107C3000FFBF3C3C3C3C7C2C0000000000000000EE +:107C100083C283020000000000400000C300D704BC +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 -:107C50000000FFFF550004040000000000000000C9 -:107C60003C3C0F0FFF5C005C0000000000000000C7 -:107C70001414005555555555000000000000000033 +:107C50000000000000000000000000000000000024 +:107C600000000000FFFF3C3CB000B0A030005050CE +:107C700000410000000000000000000000000000C3 :107C800000000000000000000000000000000000F4 -:107C9000000000000000FF003C3CF3B230B2AA003C -:107CA000AA0030300AFAFF00C3C35500C30055557F -:107CB0005555FFBC3C3C3D387D28000000000000CD -:107CC000000000410007000D000005000A08050043 -:107CD00000A00061000F009D00A500610007000DDD -:107CE00000001061500F000D000000610001000154 -:107CF00000000061000F000D0000000005600A0F89 -:107D0000050900A00000000000000000006100065E -:107D1000000500000000000000000005A50040086C -:107D2000001000A000615A06000D00000061000E66 -:107D3000059D0000A0610006000D0000000000008D -:107D40000000000000F0FFFBFFFFC0C000000000CB -:107D5000000000005D5D0C0C82BEC2FE0000000051 -:107D60000000000000000000000000005F5C5F5C9D -:107D70002A207F755F0AEBEBD70C140C00000C0C6B -:107D80000808FFC0FFFC00000000000000003000F9 -:107D900030000000F0F000000000000000000000D3 -:107DA0000000000000000000000000000000EBC325 -:107DB00041C33CAAF0AA00003F0FFF0F5505000089 -:107DC0000000000000000000FFEB3CFFC0C000000E -:107DD0000000000000005D5D0C0C003CC0FC0000D9 -:107DE00000000000000000000000000000005350F0 -:107DF00053502A207F755F0A4141D7CF14CF00002E -:107E00002C2C282800C000FC00000000000000000E -:107E10003FFF3FFF0000F0F0000000000000000006 +:107C90000000C3C3C3030000000000400000C30095 +:107CA000C300000000000000000000000000000011 +:107CB00000000000000000000000000000000000C4 +:107CC00000000061000EC00100A000610006000974 +:107CD00000000061000000010000006100020001DE +:107CE000000000610006000D00000061003E000D74 +:107CF0000000A0615006000D000000000000000020 +:107D00000000000000610006000D00000061000698 +:107D1000000D000000610006001D000000000000D2 +:107D200000000000A0610007000D0000000000003E +:107D30000000000000000000000000000000000043 +:107D40000000000014143C3C30303F3500F200F2DB +:107D50000000FFFF0F0F0F0F0000FFFFFF000000EC +:107D6000F0FFFFFF5555555500004341C2C2FEFECE +:107D7000FFC3555500000000000000000000000097 +:107D80000000000000000A0A0A0A000000000000CB +:107D900000003C3C3C003F3F0303000000000000AB +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC0000000000000001414000030303F3F00FFAE +:107DD00000FFFF00FF000F0FFF0000C33CFFFF0884 +:107DE000000000000F00C0C0FFC000008181C2C2BF +:107DF000FEFEFFC355557F7F7F0F0000000000008F +:107E000000000000000000000A000AAA00000000B4 +:107E100000000000FFFFFFC3FFFF000000000000A4 :107E20000000000000000000000000000000000052 -:107E3000EBC341C33CAAF0AA00003F0FFF0355016A -:107E40000000000000000000C3C3C3000F0F00AA21 -:107E500000000000000000003F3C0F00282828FF21 -:107E60000000000000000000000000000000000012 -:107E7000353535353C3C00F000000000AAB4FFB4B5 -:107E80000000FF3C3C3CB2B2CF0C00000000000000 -:107E9000000055555555FA50FAFA00000000000050 +:107E30000000000000000000000000000000000042 +:107E400000000000000000003C0C3C0C00FF00FFA4 +:107E500000000000454D4D4DFFFF0000F0F0F0F038 +:107E60000F0F0F0FFAFFFFFFAAAA30F3000000A0C8 +:107E7000C300C300A0A8A0A83F033F3F000000002C +:107E800000000000000000000000C3C3FAFA000078 +:107E90000000000000003C3C3C3C000000000000F2 :107EA00000000000000000000000000000000000D2 -:107EB00000005555555500000000000000000F0A55 -:107EC0000F0F0000000000000000C3C3C383050FB4 -:107ED00000AA00000000000000003F3C0F0028281E -:107EE00028FF00000000000000000000000000006B -:107EF0000000303F303F3C3C0FFF0000000000B46A -:107F000055B40000FF00000082BECF0C000000004E -:107F100000000000F505F303FA5050500000000087 +:107EB00000000000000000000000000000000000C2 +:107EC000000000000000000000003C0C3C0C3C3CAA +:107ED0001C1C0000000055555555FF0F000F00FFFA +:107EE000F0F0CFCF0C0CF0F5F0F082823CFF0000F8 +:107EF000000000000000000000003F033F3F0000C2 +:107F0000000000000000000000000000C300FA00B4 +:107F10000000000000000000FF505050F5050C0C60 :107F20000000000000000000000000000000000051 -:107F300000000000F505F303000000000000000051 -:107F40000F000F050000000000000000100010806E -:107F50004000000801000000001000801100010036 -:107F6000008020804000000001800100840020008B -:107F70002110C00090000405C00400008800200407 -:107F800004000100000304200100040005888900AA -:107F9000840088094000200082002080100020001A -:107FA0008491208088848400898400002040888017 -:107FB00090044010020320001003840020808400FD -:107FC000048504808500000000000000000080009F -:107FD0008002800000000200000000000002C000DB -:107FE00040000020802080020000200220000900C4 -:107FF00000204000000200000000000000200000FF -:108000009101008408000000800104008000041039 -:10801000400000020002C00000400000000200001A -:108020000890410200100020000008044100009167 -:108030000040000804011000000020841000090224 -:1080400000000002002010000000000000000000FE -:1080500000001000400002000400000000000000CA -:108060000900850091020010040284410808008084 -:108070008400901000000010040000200000001098 -:108080000008000000000009000001200120088015 -:10809000002004080000000800008200000000002A -:1080A0008210400208000308850203040440020510 -:1080B0000200410001844105400008090300020359 -:1080C0000505050590000200821000000000000078 -:1080D0000000000080008000000080000000000020 -:1080E00000008800080002090900000100880488D7 -:1080F000050400840000000000C00008000805100E -:10810000038200C000820004000000000801040592 -:1081100080200501000400080020000000C0208429 -:10812000000400008009A084040904014088400084 -:1081300000088084A0102003A01089080400020217 -:10814000200008100840030200080004002100007D -:10815000200090000040000000000000002000000F -:1081600001002140000000000003004088000000E2 -:10817000002104000000400000080005000000107D -:108180000008000300102088100882100000A003DF -:108190000040A00800000000201000030000004183 -:1081A00000000003004000900008C000010500002E -:1081B00000080000001000412008200220000008F4 -:1081C00000218203C0020000820540C108040000B3 -:1081D00000822000000000000000000000000001FC -:1081E00005880804040000000000040000A000103E -:1081F000008820001120000000100000001003C0C3 -:10820000111000882100000211040000000000008D -:108210000088008900000000000000000002080043 -:1082200000000300000000820021030000000200A3 -:1082300008000000080000850500000080C18500DE -:108240000500200005200008000010080820008814 -:108250000000000040000800000000002000200096 -:108260000800C00020002000A000C004C08400114D -:108270008800000000080000080010800000208036 -:108280000000000820000000200000002002400044 -:108290000000000041000000000900404010000202 -:1082A00082001011C0400000C000048004000400DF -:1082B000A00000000104400004040041020000008E -:1082C0000804A000A0040000820508020840008401 -:1082D00000410000000000000088000000000000D5 -:1082E000000020040000C1C08004000440024003DC -:1082F000219003000004000100C0000880080088ED -:1083000080040000000000A0000080000040800009 -:1083100000000000084008840040000008009100B0 -:1083200000001110119009C0118400081020801065 -:108330008004208408A00810111000851140C1207D -:1083400002002005409008C009A021C0000821209B -:1083500011020000000000030000200000080000DF -:10836000C000200088089008080282000000100069 -:10837000200020028200C0088208000000800082E5 -:1083800000000104004000000000000001000000A7 -:1083900001040880000000800405002001000400A2 -:1083A000080508000008000082400000840000006A -:1083B00040410521000000102041080000400888CD -:1083C000101000201121040000008808020800009D -:1083D00008210000050000000000000080000010DF -:1083E00000000010008200000000000000002008D3 -:1083F000021089A080850000000000100010030218 -:10840000210900C020A1000000C000002140200080 -:10841000030020C1030400000020800000010400CC -:10842000000000000000000000000000001000003C -:1084300000000000020000000084800000C0000076 -:10844000000200000802C000000000400000000020 -:108450000000800200A002A0000000000002000056 -:10846000000000000000000004000805880808085B -:1084700001000008010440040005820020090002F8 -:1084800000110008000089000021000000050040E4 -:108490002000200090414000000000020000000287 -:1084A000A0000000024001A000008400400800413C -:1084B0002004000000000010010088081000900057 -:1084C0000010041108210808824100090411040465 -:1084D0000211000010000000000800000008400821 -:1084E00020080010001000100010800409901120D6 -:1084F00020C00804000202C1210109000000800020 -:10850000000000000300030008000000000000005D -:108510000000800000A00000000000000008000033 -:1085200000000000000000104002000400C0200015 -:108530001104209009040010001004080004000039 -:10854000119040080082030400A0408220404002B5 -:10855000008240840000402011C003400000000061 -:10856000010000000001890040010000000000003F -:108570001100040002A18904208982100001A000DA -:10858000010100000100880040000001000000001F -:108590000000000088000000010000000000100240 -:1085A00000040008100200000101000000010001A9 -:1085B000040000010000C10300004004C0C109C064 -:1085C00000000003109090000101000084010000F1 -:1085D000C1008200000090C1A0A002A08408000099 -:1085E0000000020000000408901080030002000058 -:1085F00010004000000080C0410085C0C004004160 -:108600008011020300052003850390080003000089 -:108610000000000000000000000002000000000058 -:10862000800000000080800000410321000900104C -:10863000002080030002000088C111208008002172 -:1086400021C10309004000040000031005040008D4 -:10865000000020008000000000C08208880980918E -:108660000000000000000000100020001100418206 -:1086700040008900000902808800040480C0C121F4 -:1086800011A009000240044082000900090004030F -:1086900000000000000000000009000080098000C8 -:1086A000000000000002000080000000080002102E -:1086B0000884048021000200100302809000100052 -:1086C00010A040808411851040898080210089009D -:1086D00009A0000000008000800009008409080053 -:1086E0000321000000000000000000020100000063 -:1086F00001A085001000A00082900290210088084F -:1087000083010084000000000000082041000200F6 -:108710000201000000000000000082000400A00030 -:10872000100000002000C084A010C0C000000100A4 -:108730000000010801020100000000010004040023 -:108740008890C01020C02000A18900080410890072 -:10875000A00040880000A0000400C000A0888200A3 -:10876000830405C1000000000000010000000000BB -:108770000101000100400084C00900C11003001184 -:1087800000030290000001008800000000000101C9 -:108790000000000100000000000000000004401084 -:1087A000C00001880000C0020004400802880000E8 -:1087B0000101000100000000000001000000C0A055 -:1087C00000044005838302090103210911080040C8 -:1087D000A040419000C000010000000100014020C5 -:1087E00000219088A102000000000000200000107D -:1087F0000409412100410384000980210988008285 -:10880000001041A1C008000040009100400000405D -:1088100020400500004100000000000000000000B2 -:108820008000000041000000840000008080800083 -:1088300000020410042100040000050040000000B4 -:1088400084200311A02121080010114004A1092057 -:10885000008905090504098900200003000400407F -:1088600080030203800588850000000000000000EE -:10887000218011001100080900A000C000100008AC -:1088800083898082000000084088030441001103AE -:1088900002001100088040040000000000000000F9 -:1088A00000000000000000000000802000C0000068 -:1088B00000000000040021000502210240004100E8 -:1088C0001008A18208001000034110809020910040 -:1088D00003114180050008004003000200800000F1 -:1088E0000000C182A14020800803000000000000B9 -:1088F000000001C000000000010000C000200010C6 -:108900000001C1090403049090010141000000002E -:10891000010101A000400002000000000000000072 -:1089200000000000001000A00000000090010404FE -:1089300000020000000800000100000001C1010069 -:1089400000000001C108C000A1041001884010010E -:108950008488022101020108008201000000002039 -:108960000010000041A010A111024101000000E030 -:10897000000000000000000000004241000000E094 -:1089800007004141000000E007004100000000E056 -:1089900000000000000000E00000000000000000F7 -:1089A00000000000000000E00000000A00000000DD -:1089B0000000070060000000000000000000000050 -:1089C000000000000000000000000700848200009A -:1089D00000E007005000000000E000000000000080 -:1089E0000000000000000000000007000000000080 -:1089F0000000000000000000000000000000000077 -:108A00000000FCFCFF0F00010100FFFF7E7E000064 +:107F30000000000000000000000000000000000041 +:107F4000000000000020C0000020C020C08500A06C +:107F50002020C020C08000C08440044000000002F7 +:107F600000000000C000840000002000C1000100EB +:107F70002100208021004000C00085000100000099 +:107F8000C085000000030400880002808400040013 +:107F90000000000041001100040002A04080C00069 +:107FA0008800C08000000400C000201040A08800AD +:107FB0000480848020802002850020004080010011 +:107FC000850084800500008500A0000100010020DC +:107FD00000410001000100400021000100010000FB +:107FE0000000000000000000001000000000100071 +:107FF00040004000000840028000002040000800CF +:10800000000000020000000000C00000410240C06B +:10801000410021000400100088C00020A1110010C0 +:108020000000000010100000000000000900000423 +:1080300000004008001021020000080000000010AD +:108040000800100000024000040041004020092008 +:1080500082824000008002A00000100040C000802A +:108060000000400000000200040008400000000082 +:108070004000000020000402840090000000840002 +:1080800000000000000000400000000000000000B0 +:1080900008000000014100000008200921801010A4 +:1080A0001120880002000000080002000200820087 +:1080B0000384000002000010080800000002000015 +:1080C0000200000090000200000080008888808389 +:1080D000400100418000004000410000000080217C +:1080E00000200000800004080300000000000010D1 +:1080F0000000A000100000000811008400C0000073 +:1081000020080000410000084185000000880000B0 +:108110000910208800C040080084000080109020D2 +:108120008408A005001000000008098800C0400075 +:10813000040820040082820800824004000000102D +:10814000000800040008000000080082000300008E +:1081500000000000000000000000001000200000EF +:108160000000000800210020A02104000409A00054 +:108170008808040300080000018240800000000815 +:1081800000A1008500000000880000000000000839 +:1081900000400002400800059005900802210003FD +:1081A0000941004100100003002100400008404147 +:1081B000400082008200000000210000000000005A +:1081C0000000000000204000000800000005000042 +:1081D00041000000038800000000000008020001C8 +:1081E000000000A0000040C00000008800C0101087 +:1081F00040000000000800000000400280021082E1 +:1082000000000302000805A01000000000020000AA +:1082100000000040000803A00000000003008000F0 +:1082200011A008080000090000200500210000003E +:10823000800888000000000000000000000000002E +:1082400000000008000000008000000000000000A6 +:108250000000010000000020000000000000058078 +:10826000000000000000008000000000000000107E +:1082700000100800400800000820900000110000D5 +:10828000020082000808850800000000C00200000B +:1082900000008400000000090221A011C0000802B3 +:1082A00004080021088808040400A0002000080039 +:1082B00000000000000000100800820082000000A2 +:1082C0000020900008100040080000000000080096 +:1082D00000000000080000C00001000000002100B4 +:1082E00040400000000000C00040000000100000FE +:1082F000400000000020200000000082000000007C +:1083000000C0090811000040400100000082000187 +:108310000000000011A0088200000900000000A079 +:1083200000000091084080100201800800880004CD +:1083300000900000000000040000000000000000A9 +:108340000008000000000000000000000000000025 +:10835000000000000000080000080000C000044009 +:108360000002400800000040C002000900000000B8 +:108370000000820800000000C02100000000000092 +:10838000000810000841410000081021822100006F +:1083900000211002000000050000C0088400082130 +:1083A000850000000808000000000000C000040074 +:1083B000002082000005000000000000000800000E +:1083C000A0418200A000C0000021000000000000C9 +:1083D00000400000000000008000000000000000DD +:1083E00080C1000080840000000100000000000047 +:1083F000000000000000001000A0040000200000A9 +:108400000008020090822008C0A00504A1A0000876 +:108410000000410000040000000000000000000017 +:108420000088400000000900000000000000080073 +:1084300005080088000000000000000000000300A4 +:108440000000000000000008000000000000000024 +:1084500000000000000000000041080020000005AE +:1084600001000121010301020088010808000082C7 +:10847000000508000000000388080000000000005C +:1084800000000000000010004021820010094000A0 +:108490008400000000000008000008000000002127 +:1084A000200010088821C021A12102100810C0005E +:1084B00000A0000010000011004108008200000030 +:1084C00082048200A0000000000020004010402133 +:1084D0000000080008090000000000008000000003 +:1084E00000040200040040004001004004000800B5 +:1084F000202000000000000000000000200000001C +:10850000000000000000000009000000000003025D +:10851000000000000000200000000000000000003B +:1085200000A000880004400000000200000082015A +:108530000000002000000000000004900000000087 +:10854000000000000000000000000000000000002B +:10855000410000000900000000000000C010884039 +:108560008288900203C020050284828988C000901E +:108570000088080200000000000000000000000069 +:108580000000000000000100880100010000000060 +:108590002000000110C01000A0000220000004080C +:1085A000002008881040004000A000100008A0C172 +:1085B00088008390C090C00000000000900000017F +:1085C0000000000000000010018488040402C0883C +:1085D000008200C01010000590A1100500038080EB +:1085E0000080800080008991908800008021808038 +:1085F00000800000808000000000000000000000FB +:108600000000000000000005080300100021000425 +:108610001111001100108080000000008000000097 +:10862000208000000000000020800000000000808A +:1086300008C1102008418004000000000000000074 +:10864000004000000040000000001000000000009A +:10865000808000000000008000A0100300880088D7 +:10866000000004030440898380800208C089A1A11E +:10867000800084028380908000800000000500104C +:108680000000000000000000020010001000412166 +:108690002080100005200280050020400500A180F8 +:1086A0000000200090908200A180000000210010B6 +:1086B0000004028010900880C18300008080800048 +:1086C000000008000300200003110000800080006B +:1086D00080000000000000000000400021400880F1 +:1086E00003808800000100A0909102400401858968 +:1086F000C191080010008488C09000400000000074 +:108700000000000000000000000000C000000000A9 +:108710000101004000000100018810009100880262 +:1087200083C00000910010C1402009C0000200C0B9 +:10873000008900002102A01184044109A000040462 +:108740000200400001A0000000000000C00008007E +:10875000A00010008400080082004000009001008A +:10876000008200089000000910901088C0100110CD +:10877000019003C110880040900288C000000000F2 +:1087800000000000000000000000000000000000E9 +:108790000001000100000200010000000090001034 +:1087A000C02010900000C1080009C090209008006F +:1087B000000000008800409001054085A089000469 +:1087C00000C000C000A000000000410101008800BE +:1087D00000A0000810A1040200080082849020017B +:1087E0000100010010010000008280890089808959 +:1087F0004009118589C000000080808080800000D1 +:10880000000000000000000000000000000000095F +:108810002011092104040004801105410303000014 +:1088200000038010800500004100008880030000E4 +:10883000000000000000000000204002910540C13F +:1088400000800000000000800020000505211102CA +:108850000008008500880041808000800000000042 +:10886000000840024010804182808580800009110C +:108870008091C080C00011118091808080800000B4 +:1088800003000400080008000000000000000000D1 +:1088900041800400200041084140040040000200E3 +:1088A0000020000580808040000080000080800063 +:1088B00000004100100882008200C184A005110060 +:1088C00005020000000000800000412002000400BA +:1088D000110800050000008000000000008000007A +:1088E0000000200002058500C0039040A0A0901069 +:1088F0008800C091058840880400C0412088020299 +:108900000200000001000100010000000000000062 +:10891000000001C00100010000010101010001008F +:1089200000008808C09008408200000004881010F1 +:10893000080882008900100083000900C104A10416 +:108940000804400100000084000400000008010049 +:10895000010001000000008200400000000000044F +:1089600000200000A1208300820088010000000098 +:108970000700500000000000070084000000000015 +:1089800007000000000000000000000000000000E0 +:1089900000000000000000E0000084000000000073 +:1089A0000000000000000000000000420000000085 +:1089B000000000004842000000000000000000002D +:1089C00000E007000012000000000000000081002D +:1089D00000E00000000000000000000000000000B7 +:1089E00000000000600000000000000000003C9F4C +:1089F0003C60F0F099663CF0FF66BD24F9F93F3029 +:108A0000F6F63CF0FF6600000000000000000000E9 :108A10000000000000000000000000000000000056 -:108A2000000000000000000000002F2F2C2C000090 -:108A300099999999FF7C7C7C00000000000000005F -:108A4000000000000000000072727200FFFC000CC9 -:108A500038C11C83B00DD00B000000000F0FC3C342 -:108A60000000000000000000BDBD24246E7E6242B4 -:108A700000000000000000000000000000000000F6 -:108A8000000000000000FF0F00000100FFFFFFF6E4 +:108A20000000000000007EFE7E0E220000220000FA +:108A300022000022221100007EFC42FC0000000007 +:108A400000C3990F066C066C0000000009FF09C303 +:108A5000000000000000000000000000FF00FF0018 +:108A60000000000000F100F00F030F4300000000C1 +:108A70003CFF3C00F0F0FF003CF00066BD2460606D +:108A80003F3006063CF000660000000000000000D9 :108A900000000000000000000000000000000000D6 -:108AA0000000000000000000000000002F2F2C2C10 -:108AB000000000FFFFFFC340404000000000000036 -:108AC0000000000000000000000072727200F6F664 -:108AD0000606F9F99F9FBDBDDBDB000000009999F8 -:108AE00000FF0000000000000000F960F960666609 -:108AF00066660000000000000000000000000000AA +:108AA000000000000000000018F818081100001174 +:108AB000000011000011000022117EC042C0000021 +:108AC0000000FFC3990F000F000000000000F9FF35 +:108AD000F9C3000000000000000000000000FFFFDC +:108AE0000F0F0000000000F700FF0003004300002C +:108AF0000000000000000000000000000000000076 :108B00000000000000000000000000000000000065 :108B10000000000000000000000000000000000055 :108B20000000000000000000000000000000000045 @@ -108752,405 +108752,405 @@ :108B40000000000000000000000000000000000025 :108B50000000000000000000000000000000000015 :108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B800000000000000000000000000090908080C5 -:108B9000C3C3666600000000000000000000000083 -:108BA000FF4FFF0200000000000000000000000076 -:108BB000F600E6E600000F6F3C3C242F3C3C000032 -:108BC0000000000000000000000000000000C7C717 -:108BD000F7F7FF00FF00E3E3F0F0000C000C0000EB -:108BE0000000636363630000000006F6F6F63C666F -:108BF000FFF00191FD9D000000000000000000005A -:108C00000000000000000000000000000908909033 -:108C1000008003C366660000000000000000000042 -:108C200000004F00020000000000000000000000F3 -:108C30000000FF00EFEF000000663C3C242F000026 -:108C40000000000000000000000000000000000024 -:108C500004043434FF000F0FC3C300000000000001 -:108C6000000000000FFF0F0F0000000006F60606D0 -:108C70003C6600F091919D9D00610007000D000091 -:108C800000610006000D00000561000F009D00005E -:108C9000A060000F000D000000610007000D000043 -:108CA0000061000700080000000000000000000054 -:108CB00000610007000D0000000005000A08050023 -:108CC00000A500610006000D000000610006000D17 -:108CD0000000A5614006050D00A00061200C000900 -:108CE0000000006100030091000100610006000D1A -:108CF000000500615006000D0000000000000000AB -:108D00000000FAF30000000F002F00000000A2F79F -:108D1000A0F500000000400000000A0AC0CF0000DB -:108D20000000FF3CC3000000000000000000000045 -:108D30000000000000000000000000000000000033 -:108D4000000000000F0F0F0FFFFF00FF00FAFFFAF7 -:108D5000000000003C003C00FF00DF0078287D2878 -:108D6000C3C3C3C37D41FCFCFFC3FFF00000000090 -:108D7000AAAAAAAA30300D000000F0FF00000000EF -:108D800000000000FAFF0000000F002C00000000AF -:108D9000A2F7AAFF0000AAAA40004000FAFAC0CF3A -:108DA0000000000017171717C2C2010100000000E1 -:108DB00000000000000000000000000000000000B3 -:108DC0000000000000003C0F3C0F3C3CF0F000EBCA -:108DD000FFEB0000000028000800FF00FF007D2DD1 -:108DE0007D28C3C3CFC07D41C0C000C300F00000D8 -:108DF0000000F0C3F0AA3030FF000000F7F70000D9 -:108E0000000000000000F3FA0000C028000000008D -:108E10000000D5D5D0D0F3F30000FFFF0000C30F52 -:108E200055FFFA3C783CEFAEC7860A0AFAFA000012 -:108E30000000000000000000000000000000000032 -:108E40000000000000000000BC1CBC1CF5F5F5A0F3 -:108E5000AA000500F0D0F0100082000200080020F7 -:108E60005FFC5F0C414D7D7D35353535F0AAF0FF57 -:108E70000000000000000000AAA0A8A85555450564 -:108E80000000000000000000F3FAF3FFC028C30058 -:108E900000000000DFDFDADA0C0CFFFF3C3C0505C8 -:108EA000C30F5500503C783C6D2C45040CFC0CFC69 -:108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000B414BE1EA0A0BE -:108ED000F5A000000500F0D0F0D000AA00020028A4 -:108EE000002850FC500C55555555303F303FF0AAE6 -:108EF000F0000000000000000000AAA0A8A855553E -:108F0000000000000000000001000004000000005C -:108F10000000000000000000000800050100201112 -:108F2000210004008800850584040000000004007E -:108F30000480011088040104000488000000000976 -:108F400000020003200000000000400084004011E7 -:108F50000000400040004010881110080010A08060 -:108F6000C1208820880088000000030002008900DA -:108F70000000400011204020C02011800500412049 -:108F800041000180000000000000200000000000FF -:108F900000000000000000000000000000020400CB -:108FA0008002840080000000040000000000000037 -:108FB000000000042000000120000000009040405C -:108FC0000000000100000000000000008000000020 -:108FD0008000200280000000A00000028400000445 -:108FE000002010914001000200020040A000A000FB -:108FF00008000900000008018901104140104002EA -:109000000403400040200000010020000000080090 -:10901000010000000000000000009000000020009F -:1090200020040000100800040000A000020000005E -:1090300000000020400000000000000000000009C7 -:1090400000400040000000000000000000000000A0 -:109050000400900300000210000001800010A088AE -:1090600082000400020301000004000000410189A5 -:10907000000504008240020002028404820004050C -:109080009010200304002120000020008200000036 -:109090000000200008001100000800000084030008 -:1090A000850091010000830110010000000000080C -:1090B000000800840000800000840000000003100D -:1090C0000088038803000000000000100000000476 -:1090D00000C0008800080000000104002004000017 -:1090E000400400008000110004102188000000C02E -:1090F000080400000588001004888311080005405A -:109100008982058580080004A00800000000000096 -:10911000000800002180C00000020000000540108F -:109120004041010300050485008204080010000985 -:10913000010000400040C041400040030008001012 -:1091400000880002A04100000000000000080000AC -:1091500000210208000900080000000900040003C3 -:1091600000040005010000408400004000000000F1 -:1091700000000041018400408204000000410221FF -:109180000000008800900205820804020000000030 -:10919000000000000000A0040000001000A0090072 -:1091A00080C08000101000080002000305A00089A4 -:1091B000000202000000000803008000000000849C -:1091C0000000000411000000000000080000004042 -:1091D000001000000000400000A000000300020595 -:1091E00041104109030008000000038202880808BA -:1091F0000084001041C008020020410800A0412066 -:1092000021000008002004401140001000A00004CC -:1092100020092000002140000011200440110040DE -:1092200020410011004001000011100900400080A1 -:109230000900A0100000C00200000000010010049E -:10924000000400040404000000410800084000007D -:10925000000008110805084100034041C020080033 -:10926000A0051002404100050002A00204204000B9 -:10927000100010000009880500020802A0028241C7 -:1092800082401041C0410409004020040204104003 -:1092900000018000800000008000000000C080000D -:1092A000000011A0000000000200000404A0100053 -:1092B0002120A00000400000000000000000040089 -:1092C0000041004100011001040000000000000006 -:1092D00000000000080000040084008400000082F8 -:1092E000040011000400848809100000000400013B -:1092F0008000412009100000008200010941008522 -:1093000000000888000011820000000888C0008466 -:109310000082000000000000048000102000000017 -:109320000000C00520008441000000400000A18032 -:10933000008000020400202004C0000000000000A3 -:1093400000000000000000000000004100000800D4 -:10935000004000000000C000A008820000040000DF -:109360008200020000410041002000410805820205 -:1093700000008800C0040021824010400000C0218D -:10938000A00308000003080808080805000582106B -:10939000000000100000000000008020110880087C -:1093A0000000000000A0008200C005200309210089 -:1093B00008400304000080C08009910500000000FF -:1093C00000000000000000100000000800900004F1 -:1093D00000000000000000A000400040000020004D -:1093E00000100800800800080000000000000008CD -:1093F000200810A0000800001190032008080808A9 -:109400000410000005000008200000000000000813 -:10941000000000A003020000000000000000002186 -:109420000021012100000000040502098805030451 -:109430000004882100840141402000200000002118 -:10944000000000050240000004000021002104008B -:1094500000218800000000008200000300000000DE -:109460001000000004400010880404000080000484 -:10947000004100100008004184100008200800107E -:109480000010400800002008850508000521401054 -:109490000008C021081108110000000000000000B1 -:1094A0000000200040000004000080000004009044 -:1094B000080400000000000804040001000100840A -:1094C000000000000000000000000000000021007B -:1094D000000000000000000000000000000000008C -:1094E00000000000000008080000000100900004D7 -:1094F00009210082020000000090008404C00000E6 -:10950000000200020004092000C004000220040040 -:10951000020400000000000020000001000008011B -:1095200000010000010011000001100441C0824050 -:1095300000C003A100A18310A0A088C0908400A057 -:10954000820400000100880000000000000000000C -:10955000000000000000C00000000000000001004A -:1095600088000000C0880002040804100001010007 -:1095700040010001C0010190081184211084010400 -:10958000C08808080405A0851105C00801050091E0 -:10959000889040C040A10405114183830008001059 -:1095A0008240004000040809840400408300080051 -:1095B00080800000A18200404020000500808000E3 -:1095C0000580800000000300000000000000000093 -:1095D0004000000000000900000000000000000042 -:1095E0000300000000000080048000000900110555 -:1095F000200985080002004121040082002080002B -:109600002000800000800008A00240830003400288 -:1096100020C00011000588A010A1048211C0020022 -:1096200009001000C01002800400100004418000F6 -:109630000003908088009100830091044189800993 -:10964000800080090000200020002000100000049D -:109650000000000400000000000000000000000006 -:1096600011001000020009009080C1000491110453 -:109670000282100009401121100004110480419061 -:1096800000000000800000001000400489802102DA -:10969000838002418804C110A000A11188058510B3 -:1096A000C088A000A000910000C0000000000001E0 -:1096B000A000C001A008098489002100A0890189B7 -:1096C000100040889000A004010001000100000883 -:1096D0000001000000000000000000000000000089 -:1096E000000000000100000000400204828810A079 -:1096F000904000090000000000011104890111845C -:10970000409082002084A0000000A0848500048492 -:109710000584891088904183912102002100A09046 -:10972000820000000000000100010001010083012F -:10973000000088A0000840A0A00402100002A08839 -:1097400010C0022002042040A0A000000000000180 -:1097500000000000100000000000000000010000F8 -:1097600000000000000000010001000008080021C6 -:1097700000C18989000140010001010010040009B5 -:10978000C1090008C0C00003002083021040018509 -:109790000509A0A08801004111C01184C085018382 -:1097A00084A0100800090011414000400021040974 -:1097B00083210009000000900000801080400441D7 -:1097C00083080480A08000008080820003000010D5 -:1097D00000210009000080000000050000020003D5 -:1097E00000101002000000050040002100020005EA -:1097F0000088002109400020100404201002800588 -:10980000418820A10084800400C0001011098085D7 -:109810000810A105898408092103A14110058010C1 -:109820002008400010820040080040004040408076 -:109830004011400002400089808400000010C120D7 -:1098400011C00000401100400002000000000000B4 -:1098500000050000001000000000000000000000F3 -:1098600000000000000000000000000000000008F0 -:109870002090048821000310418008202100030467 -:109880000980400804001040000000000080000033 -:10989000908011080800880321838904418005080D -:1098A000A04088C109800802000101020190010165 -:1098B0000140010101000001C040082010840400A3 -:1098C00009890220002089010000000500820000B3 -:1098D0000082000000000001000000000000000005 -:1098E00000000000000000000000008800000000F0 -:1098F000000109C00883C188890001A0010101009D -:10990000010102A0210209889001000000880010D6 -:1099100000001008A09083C0A10111C0A011100880 -:10992000C0010491210204844101000000E007000D -:109930000000000000E000006012000000000700CE -:109940000000000000E007000000000000E0070049 -:109950000000000000E007000000000000E0000040 -:1099600000000000000000000000000000000000F7 -:10997000000000000000000000008100000000E086 -:10998000000000000000000007000000000000E0F0 -:109990000000502100000000000000000000000056 -:1099A00007005000000000E0070060000000000019 -:1099B0000000000000000000000000008282003C67 -:1099C00080000F0FAAAAAA820F00BABA00000000F6 -:1099D000C0C0F5050000000000000000000000000D +:108B700000000000000000807E7EE7E7FF3C660FFB +:108B80004E4E3CFF7E7E0CCF0F0F3C3C00000000A1 +:108B900000000000000000000000000000000000D5 +:108BA0000000000000000000000000000000A5A57B +:108BB0000000A005000010082004400220044C7CA6 +:108BC0004F7F000000001F1F1818F9F6F9F600008B +:108BD00000003F3C27240000000000000000FFFFD1 +:108BE000C3C310199099F036000009CB6FEF8000D5 +:108BF0000000000000000000000018188181003C07 +:108C0000660F4E4E00C342420CCF666600FF000066 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C3000A5A5A005000000008001400280011008E9 +:108C4000407043730000000007071818E7FFFFFF9C +:108C500000000000FFFCE7E400000000000000004E +:108C6000C1FF010000098089F060000009086F2C35 +:108C7000B00000000000000000614006000D000090 +:108C800010612006004D000810612006004D00080C +:108C900000610006000D0000000000000000000060 +:108CA00000410006000D000000610006000D0000FC +:108CB00000639006000D1000000000610006000D2A +:108CC000080000613006000D0000A0005A090500F0 +:108CD00000A0000000000000000000610006C009C4 +:108CE000200000610006000D0001000000000010DF +:108CF000000000614006000D00003C003C00000048 +:108D0000A0F5FF4DFF4D0000000000000000000036 +:108D1000000043020000000000000000000000000E +:108D200000000C0C55550000400028283C30D707A7 +:108D3000D707000000005555FF0F0000000000009D +:108D40005F505F50FDFD808000000000FCFC5F5024 +:108D50005555FF00000000000000000000540054C2 +:108D6000C000FFFF00000000FAFA0CFC0000000049 +:108D700000000000FFABFBAA0000AA003C3C000082 +:108D80000000A0F5FF00FF00FFFFFFFE0000000055 +:108D900000000000030300000000000000000000CD +:108DA000000000000C0C553C0000000028283C305E +:108DB000D7D7D7C7000000005555FF0F00000000AF +:108DC00000005F505F50A8FD80D5000000000C0C33 +:108DD0005F50F0F03C3C0000000000000000005438 +:108DE0000004C000FFFF000000000A0A0CFC0000A5 +:108DF000000000000000FFABFBAA909E0AA000004C +:108E000000000000050F2800282800FFF5FF0000E3 +:108E1000000000FF00F00000000000000000000063 +:108E2000000000000000A282828208007F84030309 +:108E30000300C3C3FF0F000000008FFF82FF00008C +:108E400000000000FF000F00000000000000000014 +:108E5000C3C355555F5F303F0000000000000000B5 +:108E6000FFFF00005FDF7FFF000000000000000048 +:108E70000000000000000000F055F0550B0F0F0F30 +:108E8000000000000000000A2800000000FFA0FF12 +:108E900000000000000000F00000000000000000E2 +:108EA000000000000000000082828282A000F0A189 +:108EB00003000300C3C3FF0F000000008F00820007 +:108EC000000000000000FF3C0F3C0000000000001C +:108ED00000000F0FFF005050303F00000000000066 +:108EE0000000F0F000009EDFBEFF00000000000068 +:108EF00000000000000000000000F0F000C30B0FB5 +:108F00000B0B1000000800001000108588041004EE +:108F100010081000100010001000100040000400A5 +:108F20000004210000000002004110002080100019 +:108F300010201008100040001008000011880400E4 +:108F4000850000018808A00540800084408340001F +:108F50002005200001002000A0004000880004003F +:108F600088082000880020002000880020004000A1 +:108F70002000200040802000200020008800000009 +:108F80002000000000000000000000008008000534 +:108F900000010001000000000000000000000000CF +:108FA00010021000100000000001000000904108B5 +:108FB0000000200100030000040000010000400444 +:108FC00010004000000011000000001000400008E8 +:108FD0002000090000000800004000000000000020 +:108FE000200200000000000000000000002000201F +:108FF000202000000000000200000000000020000F +:10900000100000820000000000000000080000C006 +:10901000000000842180080000000000840000009F +:10902000010000000300400002001000A000040046 +:109030000800000000100000000000000000000018 +:109040000000208002030000000000000004000077 +:109050000400001000C000400000004000000000BC +:109060008200000000000000820082000400020074 +:1090700000000000000400000000000000000000EC +:1090800082400000824002000000000000008000DA +:109090000804008200099004008200000000000023 +:1090A000000408021000C000800000848000000856 +:1090B000001080840000008400840088000000000C +:1090C00000080488800800080000000400880008E8 +:1090D0000008000804090003000900000000401017 +:1090E00000000008008205000010008200000088D7 +:1090F0000008000800080384000800000000008445 +:1091000000000408008400820000008000000000CD +:109110000000000000080000000000000041000501 +:10912000000000080008004000030008010840009B +:1091300000000008000000000008400000020005D8 +:10914000002100020002100000030000A002000045 +:1091500000000021080000000000882188419041A3 +:1091600000080010000000000008C040A00000003F +:1091700000000000000000000000000000000000EF +:10918000000000030000000000400020082000A0B4 +:1091900000A0210004000001008800A000A0000839 +:1091A0000084008408A000000008000004004000C3 +:1091B00080A0000005000000410010000884410369 +:1091C000030803A0088221008300418200000402FA +:1091D000218200A000A0A1C0030800020000080036 +:1091E00011C00800000020880300410000000000BA +:1091F0000000000000000000000000000882038260 +:109200000900004000080000000000200000880065 +:109210000400A005820200008209A108A01000211C +:10922000000900100082000008101000000000007B +:109230000002104008040800100410020402A102F9 +:1092400010080802080210000800080800000000CA +:10925000C011A000A0408200080404200284004144 +:10926000820900418208080040030008200900022A +:109270000800040082000000C0000000820000001E +:109280000000000000000404001000400040001036 +:109290000000800000000001000000000201000149 +:1092A0000000000000010011100000000800040090 +:1092B0000000000100000000000000000300840521 +:1092C0001001000100010001000000000001000089 +:1092D00000000008000000000000000800008040BE +:1092E0000000000000000000000000000008000076 +:1092F0000001000000001000000000000000000855 +:109300000000000000000000000041010001001109 +:109310001101000000000200000000002004000015 +:10932000000082090000820082000000000000109E +:1093300000000000000000082000100004000800E9 +:10934000000010000000040800020000C00000003F +:10935000820000000000000000020003000204413F +:1093600000080000C0000000000004000000000031 +:10937000080000000000C000000000210000000004 +:109380000000000000008200000800000000000053 +:10939000000800400002000000A009080008800941 +:1093A00000100008000800A0000000820002000079 +:1093B000000000A0000004840000800000A0030062 +:1093C00000080082000000001000000121000320BE +:1093D000200221000000110003A003820388000482 +:1093E0000404200400002100030003900890009072 +:1093F0000000212000000000000000000000030029 +:109400000010000000A0000000000300000008A001 +:1094100000080000080800000000048004000004A8 +:109420000040010900000000820001050004040062 +:10943000828000080008A000000000000000104129 +:10944000000800040000C10008004000C0002141E5 +:1094500010001004000000000800000000000021BF +:1094600082000010000000000000000084000000E6 +:109470001000018000000100000400040000000052 +:1094800000000000000000000000000000000000DC +:1094900000000800000000000000000080028000C2 +:1094A0000000000008000000000000004000200054 +:1094B00004000008000000000000000000000000A0 +:1094C000000000000000000010000000800000000C +:1094D00040000000800100000000000000000000CB +:1094E0000000000404000000000000000000000074 +:1094F000000000000208000008000000000000005A +:10950000000000000000000000000000000000005B +:109510000000000000000000000000000000020049 +:109520000000910101011000C000C000000008000F +:10953000000000C0000284020010000101010001CF +:109540000001000088108204008200000900000071 +:1095500000010101000040010001000002000002C2 +:109560000002100401C000820288009000C00000C8 +:1095700000400040000000008400000000000000E7 +:1095800000000000000000000000000000000000DB +:1095900000000001000000000000000000000000CA +:1095A000000000009141090280418010800000000D +:1095B00080000000008005808080000000410421C0 +:1095C00000080008000088008000008000202008BB +:1095D0000020002102411041801000100000900086 +:1095E0000000008080002180210000800000000039 +:1095F000000000000000000011000000000000005A +:10960000000000000000000000000000000000005A +:1096100000200040001000000000000000000900D1 +:1096200000000900820010000203118041090000BF +:109630001000400002000000000000000000208038 +:1096400000000900410400000000000000000000CC +:10965000100008004103400002000011210000003A +:109660000000000900800000020000200500418089 +:1096700000000008000000008000000000008000E2 +:1096800000000000000000000000000000000000DA +:109690000000000000000000800080030000800047 +:1096A000000000C08400104001100100A108A101C9 +:1096B0000400000001008300000000000000001012 +:1096C000010800000000010100000000000000840B +:1096D0000010000000000101010001000001010074 +:1096E0000000000000020040000000000000011027 +:1096F00001A000000001000400000800C0000400F8 +:10970000C000000000000000000000000000000099 +:1097100000000000000000000000020010014040B6 +:10972000C01000000001040000000003000101A1BE +:10973000010100A1000000830083400100004000FF +:1097400040010000010000010001080000000001CC +:1097500091010000000000010001000140008800AC +:109760000000000000900040400082C0A001000105 +:1097700000018201000000000000900000010000D4 +:1097800000010001000000000000000000000000D7 +:1097900000000000000001000000000000000000C8 +:1097A00000000000400900048009000400080202D3 +:1097B0000905114100400000000800028004000477 +:1097C00000030041000410050821021100110020CF +:1097D0000005104100080821092100410008A000EF +:1097E0008541100900000000008000008000000892 +:1097F0000040002080040000000000000000000481 +:1098000000100020004100000000000000000000E7 +:109810000000000000000000200000000000000028 +:10982000000000000000000000890000002041A0AE +:109830008200028083100080000000800000000091 +:1098400000000000000009050400050004020005F6 +:1098500000200000000041890800210040040504A8 +:10986000031109000203000000408009800000008D +:10987000800000400000000200008008000080001E +:109880000000008000000000000000000000000058 +:1098900000000000000000000000000000000000C8 +:1098A0008004808000000000008400C000020001ED +:1098B000858821100408080000C000A000080000EE +:1098C0000000000000000000018401000100000110 +:1098D000000000010000000001C1000001000001C3 +:1098E00000A00101010000010000080020000400A8 +:1098F0002000C0822000200010010400A00004000D +:109900008200000000080084000000000000000049 +:109910000000000000000000000000000000000047 +:109920000000C001200884A088000000000007009B +:109930004200000000E000000012000000000000F3 +:1099400042000000000000000000810000E0000074 +:109950000000008100E0070000000000000000009F +:109960004200000000E000000000000000000000D5 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B00000000000A0A00000003C003C00000000EF +:1099C000000014BE000000000000000000000000C5 +:1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 -:1099F000000000000000EAEAFBEF000000000000A9 -:109A0000000000000000D7D0EBE0FF1CFF3C00008E -:109A1000000000002820404050F07555FFFFC2FFB5 -:109A2000000000FFFF000F0D0F0F202F202C000063 -:109A30000000000000000000000000000000808026 -:109A4000003C80000F0FAAAAAA82000000000000BC -:109A50000000CFCFF505000000000000000000006E +:1099F000FFFF0F0F55555000140000000000C0CFAE +:109A0000FAFA000000000000000000000000000062 +:109A10000000000000000000000000000000000046 +:109A2000000000000000FFAA2D2D00000000000033 +:109A3000000000000000B4A0000000AA00AA00007E +:109A40000000000014BE0000000000000000000044 +:109A50000000000000000000000000000000000006 :109A600000000000000000000000000000000000F6 -:109A70000000000000000000EAEAFBEF0F0DFF0D00 -:109A80000000000000000000D707EB0BFF14FF3CB4 -:109A90000000000000002808E040F0F04555CFFF2E -:109AA00040FF0000F0F0F0F00F0C0F0F202F202FE0 -:109AB00000000000FFFF0F0F00000000000000008A -:109AC000000000003C3C00000000DFDF0F8F0F8F24 -:109AD000033F414100AAD2D2000000000000000074 +:109A70002C7C2C7CC3C35555000014000000000052 +:109A8000C0CFFFFF00000000000000000000000049 +:109A900000000000000000000000000000000000C6 +:109AA000000000000000000055002D2D0000000007 +:109AB0000000000055005500000000005500550052 +:109AC0000000000055550000FF3C17170000000083 +:109AD0000000000000000000B0BEB0BE00000000AA :109AE0000000000000000000000000000000000076 -:109AF00000000000000000000000FFFFFFF7000072 -:109B00007FFF0000000000000000FFFCFFFCFFFFE3 -:109B1000C300FFFF000004000400A8A000000035FF -:109B2000003507030303004101413FBF0383AFAF8B -:109B3000FF0000000000F4F004000000000000003E -:109B400000001000000000000A000000DF140F0FEA -:109B50000F0F033F7D7D55FFD2D2000000000000B3 +:109AF0000000BE1EBE1E000000003F305F5F000081 +:109B00000000AAAAA3A30000000000000000FF00BC +:109B10000F0F000000000000000000000000000027 +:109B200000000000000000000000000000000F0026 +:109B300055C3000000005555000000000000FF0064 +:109B40000000000000003C3C0000C30017170000AC +:109B500000000000000000000000101410140000BD :109B600000000000000000000000000000000000F5 -:109B7000000000000000000000000000FFFFFFFFE9 -:109B80000000FFFF0000000000000000FF3CFF3C61 -:109B9000FFFFCB00FFFF080000000000ABAF030F8A -:109BA00000F5000507070303005505557FFF43C374 -:109BB000CFCFFF000061000100010000006100053F -:109BC000000D00000061000E000D00008041000942 -:109BD000009D000005615A0F050D00A00061000EF8 -:109BE000000900A000610007000D000000610006F0 -:109BF000000D0000000000610006000D0000006183 -:109C00003006001D000000610007000D000000612B -:109C1000000E000D00000061400600090000006118 -:109C20000006001D000005610A0E051D00A0006170 -:109C3000000D001900007D4D7D4DAAAAC3F070FFF4 -:109C4000F0FFF7F5FFFF00000000F0F0FAFAC3C3E1 -:109C5000C300382838280000000000000000000081 -:109C6000000000A000000000000000000000000054 -:109C7000000000000008000000000000417D4D7D54 -:109C8000AAAAAAAA82C3C2C30C0C0C08020303032B -:109C9000CACF0000BEBE141400000000A0B0000037 -:109CA00028003C3CC3C355553EFE0000FCFF505FFE -:109CB000FFCFC3CF3A3A3A3A71417141AAAAC3F0F1 -:109CC00050FFF0FFC7C5CF8F000000000000AAAA18 -:109CD0000000C30038283828000000000000000001 -:109CE0000000000000000000000000000000000074 -:109CF00000000000000000000000000000005555BA -:109D000055552A0A0A0AC2C3C2C3FFFFFFFF020356 -:109D10000003C0C50000BEB414B400000000AAAA2D -:109D2000000028083C3CC3C30F00FCFC0000FCFF03 -:109D30005F5F3C0C000C0000FFFFCFFFC3F3FA5045 -:109D40007878000000000000000000000000AAAACF -:109D5000AAFF000000003C3C43000000000000009F -:109D6000000000000000AAFF20AA00000000000080 -:109D700000000000000000000000000000000000E3 -:109D8000AAA2AAAE0000000000000000FFAA5D0821 -:109D9000000000002D2DFF555D55FDF50000000071 -:109DA0000000000000C040C0FFFFB080F3F3D7FF09 -:109DB0001717C30053530000145055500C3C00308B -:109DC000FA50787800008000000080000000000059 -:109DD000000000FF20000000000043000000000021 -:109DE0000000000000000000AAFF00AA0000000020 -:109DF0000000000000000000000000000000000063 -:109E00000000AA20AAEF00000000AA3CF03C5D0878 -:109E10005D08FFFFBEBF2D2DAA005855F8F50000C4 -:109E200000000000000080C0C0C000000000F3F38C -:109E3000557D1717FF3CC35500001450005000001B -:109E400000000000000000000000020020000000F0 -:109E500000000000000010080000000010000000DA -:109E600000008200840200100000000000101000BA -:109E700000000000000020000000880084000000B6 -:109E8000000900000041200400008400C005880093 -:109E9000C0000008A000040020031000840010008F -:109EA000000004020002820482002000000010036F -:109EB0002004C004C00020052000C0088400200049 -:109EC0000000000000000000000010000000000082 -:109ED00000000000000400000084000000000000FA -:109EE0000000000000000000000000001000000062 -:109EF000000000040000000000040000000040001A -:109F000000000500100200400000100000400000AA -:109F10000000000004000000000000020990400062 -:109F2000000000000000000000000000040000002D -:109F300000000000000000000004100000004100CC -:109F400041040000000000000000000000000000CC -:109F500000000000100002001000000000100000CF -:109F600000100000000000000000000000000005DC -:109F70000000000000400404000000000000000396 -:109F800000000000000000000000000000000000D1 -:109F90000008000900100003880400000004000904 -:109FA000000002000010000402090000024100400D -:109FB00000110041001004099005000090050009FF -:109FC0000003A010000000000000000000000000DE -:109FD00000000000000000000800000000880000F1 -:109FE000000000000008000000C0000000000000A9 -:109FF000000004000000001000000010001000002D -:10A000000000000000000008008400884182401029 -:10A010000000001000000008001000000500020011 -:10A0200000880000000000840384000000C01100CC -:10A0300000000084000400400210008240880800F4 -:10A04000208800840088000000000000000000005C -:10A0500000000000000000000008000084008800EC -:10A06000000000000000A000001000000000000838 -:10A0700010000800A000000000090000000000001F -:10A0800000000010000000000000000000000000C0 -:10A09000000088000000000000000020000900000F -:10A0A0000041200220080000C008840000090011BF -:10A0B0002008002140414010000300210000001151 -:10A0C000000090109010002100000000000000002F -:10A0D000008400C041840400000000100900410811 -:10A0E0001188001000820010008400080000008227 -:10A0F000004000000008000000000008008400008C -:10A100000000000000000000000000C0000000A0EF -:10A110000002000000000000000800A000021188FA -:10A1200009080282110841000040008841820008AD -:10A1300040A010002100088408A011840420000021 -:10A14000000000820010410803820000000000416E -:10A150000000000900000000001000000021004184 -:10A1600000000000000200000000000000000008E5 -:10A170000000000200410800000000080004000088 -:10A180000040004000000004084000000000000003 -:10A19000040000100021C0020041004008080041F6 -:10A1A0000021000000411040004000020011004169 -:10A1B00000110808000500090011A0110409004160 -:10A1C0000005004040200020A0090004000000001D -:10A1D000000000000090114000000000099000C045 -:10A1E000000009000000009000001100409000A055 -:10A1F0000002001000C00000000000000040000449 -:10A200000000040000000000000000C0000000008A -:10A21000000000200482050000880000098204007C -:10A2200000040088008440900090001040C0008826 -:10A23000049010820082009040000000000009A0FD -:10A2400011020988000800C002C02000042000009C -:10A2500000000000040004000000000000000000F6 +:109B700000000000BE1EBE1E000000003F3050501E +:109B800000000000AAAAA3A300000000000000003B +:109B90003C3C5555000000000000000000000000A3 +:109BA00000000000000000000000000000000000B5 +:109BB0000FFF55C305610A0E050D00A080000000CF +:109BC0000000000000610006000D0000006150066A +:109BD000000D000000610006C00900000061003EA9 +:109BE000000C00A000610006000D000000610006EE +:109BF0000005000000000000300000000000A0612F +:109C00005006000D00000000000000000000006190 +:109C10000006000D0005000000000000000000002C +:109C200000000000000000610006000D0000A00020 +:109C3000000000000005000000003CBC3CFD553C5D +:109C40000FFF3F3FA0AF00000000000014BE000067 +:109C500000007878AAFF0000000000F0C3F30000C5 +:109C60000000FAFA0041AAC30000C3C300C3C3C086 +:109C7000C3CF000000410000000000000000000011 +:109C8000000000003C3F3C3E0000000000000000DF +:109C900000000000AAFFB4B40000000000000000B3 +:109CA00000000000000000000000000000000000B4 +:109CB0000000000000000000000000003CBC3CFD73 +:109CC000553C0F003030A0AF00000000000014BE73 +:109CD0000000000078780055FE0000000000FFFF43 +:109CE000000000000A0AC341FFFF5F5F030300C3D7 +:109CF000C3C0C3CF0000000000000000000000004F +:109D00000000000000000000000000000000000053 +:109D10000000000000000055B4B400000000000086 +:109D20000000000000000000000000000000000033 +:109D300000000000000000000000000000003CBE29 +:109D40003CFF550F3CFFAFAF303F0000000000006C +:109D5000F0F0000000000000000000F03C5C008219 +:109D60000082000000000000000054545050FF002A +:109D7000A0F00000C0004040555500000000000069 +:109D8000000000000000000000C3004100000000CF +:109D900000000000000000000000000000000000C3 +:109DA000000000000000000000000000C1CBC1CB9B +:109DB00000000000000000000000000000000000A3 +:109DC0003CBE3C3C550F3C00A0A0303F00000000D2 +:109DD000000000FF000000000000000000F03CFC5C +:109DE00000000082000000000000000054FC50F061 +:109DF0000000A0F028A8C000000055550000000099 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000C1CBA6 +:109E3000C1CB000000000000000000000000000096 +:109E4000000000000000000000050000000000000D +:109E500000000000020000000000A00002008400DA +:109E600000008400840000000000040004000000E2 +:109E7000C000840084000000000300000000000017 +:109E800000000000000004000000040000000400C6 +:109E90000000000304002000000000000000880013 +:109EA0000000040000000404000000008404880096 +:109EB000000000002000200800004000A00020104A +:109EC0000000000000000000000000000000000092 +:109ED000020000820082008200000000009010005A +:109EE0004000000011000000000010000000100001 +:109EF000000000000000400004000000000004001A +:109F00000000000000000000020000400900000006 +:109F100000000000200000C004000000400000001D +:109F200040000000000000002000000000000000D1 +:109F300000000000000010001000100000000000F1 +:109F400004000000000002000000004000000000CB +:109F50000000000000000000000000000000000001 +:109F600000000000000800001000000000000000D9 +:109F700000000040C00000000000000000000000E1 +:109F800000000000000400000000000000000000CD +:109F900000000000004100098200000000030020D2 +:109FA0000004000000000040000800050000000060 +:109FB0000000000000040040020904000004000446 +:109FC000000000000400000000000300000000008A +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000000000000000000071 +:109FF00000000084000000840000000800080090B9 +:10A0000000000000000000080008008800080008A8 +:10A010000000000000000008000000000010000820 +:10A020000004001000000008001004880040000830 +:10A0300000840008040800080004040800841010CC +:10A04000000000000004000000000000000000000C +:10A0500000000000000000000010000000002000D0 +:10A060000008000000000000840300000041000020 +:10A070000000000000000000000000009000000050 +:10A08000200000000010000088008820A000880048 +:10A0900000008400400800088200000808402000FA +:10A0A00000000000000000000000020000000008A6 +:10A0B000400090000000080000008400000000053F +:10A0C00000000005900000000000030000400000B8 +:10A0D0000040000000000008000000A00088000808 +:10A0E0000008000000000000050403000008000054 +:10A0F00002000000110000000008410000000008FC +:10A1000000820010000000000000081041A041A0E3 +:10A110002110004000004040000000400002000804 +:10A1200000A0000000000000000400000008000083 +:10A1300000000040080000000000000000000000D7 +:10A1400000000000000000000000004000210000AE +:10A15000001100000009000000410000040000029E +:10A1600000000000000000110000000800000004D2 +:10A1700000000000000300000010000000000000CC +:10A18000000000028400000800090000080000052B +:10A190000808000000000000004008040000000063 +:10A1A00000000000000900000011A00000000000F5 +:10A1B0000004000000000005000000040000002072 +:10A1C0000000000000210400000800000000000062 +:10A1D000000000000000000000000000000000007F +:10A1E00000880000000000000000000400040300DC +:10A1F0000000000000000000000000000082008459 +:10A200002000008400000020008400000000008482 +:10A21000000020082000008800000082100000825A +:10A2200000040000000000400000000000000000EA +:10A230000000000800000000000000000000000016 +:10A2400000000000000000400000000800000000C6 +:10A2500000000000000000000000000000000000FE :10A2600000000000000000000000000000000000EE -:10A2700000100000000000000000002000000400AA -:10A28000000000000000000000000000C00000000E -:10A29000000000080800000000000000004000006E -:10A2A00000000000000804000000840040000000DE -:10A2B000000002000000001000100208000300006F -:10A2C00000040005000082000000021000000008E9 -:10A2D000000800A02008000000000000001000009E -:10A2E000040000100010000800A0000400C0008856 -:10A2F00000000084008400080000000000000084CA -:10A30000001000000000210002000000000000001A -:10A310000000020400040000000800880088090210 -:10A32000001000000000031000A011A000A0081001 -:10A3300008080000090800020908411040880002CE -:10A340000008410820082108001005040404000446 -:10A3500004000000000000000000000000000000F9 -:10A360000000001000000010000088000000000045 -:10A370000000000000000000900000080002002023 -:10A3800008000000000000000002000000000003C0 -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD -:10A3B00000000021000002000000840000000003F3 -:10A3C00088000000001000000810000000080021B4 -:10A3D00008200000000000A0000000000990118883 -:10A3E00000000000000002C00000004000002090BB -:10A3F000200002040000009000000210040004008D -:10A4000004080800000000000088000000000008A8 -:10A4100000C00000000000000000410020002000FB -:10A4200020A000040040090402C0090009401100F6 -:10A43000401008A000000340008400100010408479 -:10A4400003900400022000C020080282208800043B -:10A4500020000284028200000000000000000000D2 +:10A2700000000000000000080000020000000011C3 +:10A2800000000000080000000000C00010020000F4 +:10A29000000000000000024000000000000000007C +:10A2A000000008020000000000000000000000089C +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000000000100000007E +:10A2D0000000000002000000000000A0000020407C +:10A2E00000000008000000A00000000000000000C6 +:10A2F0000208000000000008000000000400000048 +:10A30000000000000000000000C005100500000073 +:10A31000000000C0000000000800000000840800E9 +:10A3200000000000000203000900410000040000DA +:10A33000020000000000000000000000000000001B +:10A34000000005000000050000000084000000007F +:10A3500000000000000000000000000000000000FD +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000000000DD +:10A38000000000000000000000000000000808219C +:10A390000821000000000000001000000009000873 +:10A3A00000000000000000400000840800000000E1 +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000002000000000000000006D +:10A3D0000000000800000000001000000000000065 +:10A3E00000000000004011000000002000000200FA +:10A3F00000001110000002002000000000040040D6 +:10A400002000020000000000008411040000000091 +:10A41000200000A0000000000084200000002000B8 +:10A42000090041040084000400C000000000000096 +:10A4300000001100021000000000000000000000F9 +:10A4400000000000000000002000200000000000CC +:10A4500000000200000000000000000000000000FA :10A4600000000000000000000000000000000000EC :10A4700000000000000000000000000000000000DC :10A4800000000000000000000000000000000000CC @@ -109248,193 +109248,193 @@ :10AA40000000000000000000000000000000000006 :10AA500000000000000000000000000000000000F6 :10AA600000000000000000000000000000000000E6 -:10AA70000000000000800000000001000100000054 -:10AA800084000400000000400000400000804100FD -:10AA900000000000010000000100000040800000F4 -:10AAA00020000000C04001040010200084000003CA -:10AAB00021804080A004018588000000050000116D -:10AAC0004104210488040500A00088000000200241 -:10AAD00004004000408001002091418520020109CE -:10AAE000200941002088049089002110400088003E -:10AAF00000000000000000020000004020002000D4 -:10AB00000000000000000000000100008090000232 -:10AB10004000000000002000004020004000000431 -:10AB20000000000000000001200100020000000001 -:10AB30000000200421040001400400000000100077 -:10AB40004000880304010009849000000004000014 -:10AB5000210100002000000420020004080421411B -:10AB60000840000440908002002008400805214071 -:10AB700000C0820000000000000000000000000093 -:10AB80000100000000000000000001400200000081 -:10AB9000040000000300000010200000000000007E -:10ABA0000000000500000000000000000004000894 -:10ABB0000000000000040000000000080083008482 -:10ABC000029040048240004082094041000400009D -:10ABD0000841A00000080100000000C121022084FB -:10ABE0000004040440400800010400059003000331 -:10ABF0000100A1041100000000000000000020007E -:10AC0000000004000000000000000300100000002D -:10AC10000000800000002000000080000000000014 -:10AC20000000000000080000000000081000000004 -:10AC3000000005000000000100080000008400087A -:10AC400000020002A000001000000210A00402C0D8 -:10AC50000000008400000800021002000220888327 -:10AC600089210082800180848584200500824084BF -:10AC70000008088240820000000000000000000080 -:10AC8000008000000121000000000000000000031F -:10AC90000000000302200000000000000000000887 -:10ACA00000080000C00204000000000000020020B4 -:10ACB00020102000011000000021002101210011BE -:10ACC000400020009000008000412020004120082A -:10ACD00000211008A0000400004002200008040821 -:10ACE0000040040820A0888800108408000500089F -:10ACF00040400021C00000080000000000000000EB -:10AD000000000040000004000000000000000000FF -:10AD100000000000000080010000000000000000B2 -:10AD20000000000000000000000000000000000023 -:10AD300000008000800020000000090000002010BA -:10AD400000009100000000000004000090010010CD -:10AD500080000000048400000400000800080000D7 -:10AD600000000000A100411100042100080009A01A -:10AD700011408004000000100900000200040000DF -:10AD8000000000000000200000040004000000009B -:10AD900000000000A0008209000400000000000084 -:10ADA0000008A000002100001000000000001000BA -:10ADB0004000820000000000009100000000A000A0 -:10ADC000020582000000C10300020080400020084C -:10ADD000A121202140000205200000004040C0A029 -:10ADE00082844005A02020100009044004040800CB -:10ADF000080002800804C0052080084000C0000050 -:10AE000000000000000000C0208220040900200093 -:10AE1000090000080090000009200202008400845C -:10AE200020880484001000840000008200A000003C -:10AE300002A080C0000800040040200400000000C0 -:10AE40000084200000100090400420830004009043 -:10AE5000809020008010208220000090009040C050 -:10AE60000220002140902001C0C009848000000021 -:10AE7000C00080A00308208802202010208200004B -:10AE8000004100000000000000000004000000007D -:10AE90000041000020000000040000410000C00547 -:10AEA00000080000000500410010820800030000B7 -:10AEB0000000008800050000000000000000000005 -:10AEC0000000000082009040040041000000A0004B -:10AED000000820082110C00000084080080808056C -:10AEE00082040421080082048210A0008208000964 -:10AEF0000005C041082182000400A000002100419B -:10AF00000000000000000000000000000001000040 -:10AF1000001011000000000000A000A000001100BF -:10AF20000000000000000000000000000000000021 -:10AF30000000000000100000000000000000000001 -:10AF40000000000000000000000020004004008419 -:10AF5000000000020000822000A00000004000006D -:10AF600000000400808808000009000400000008B8 -:10AF70001100000000000000000000080020002078 -:10AF8000110040410004000000000000000000002B -:10AF90000000000804002011000000000000020072 -:10AFA0000000100000050089402100200020001052 -:10AFB00000208400002100000000000002050000C5 -:10AFC0000010000000000008000004000008040851 -:10AFD0002008400300000000A021002100100041D3 -:10AFE000C0028408080082088221901088080000AE -:10AFF000002000108208881089A108214010824199 -:10B000000008A00000000000000000040000001084 -:10B0100000A00210110000C009400000400004041C -:10B0200021100402820000842104028400A003C0D5 -:10B0300000000000040002000840000000828000C0 -:10B0400000000300000000A020C00088208420A091 -:10B0500000C000C0000011C0000000C0200402A019 -:10B060000582020100000000099003042020020074 -:10B0700011400200202003001141080200C041409D -:10B08000110011000020000000000000000000007E -:10B090000100C100000000000000000000001104D9 -:10B0A0000004000482080100880010010001000073 -:10B0B000000000000000C08800822084C002000060 -:10B0C0000000010000000000000000000800000077 -:10B0D0000001000109000001A110200320C082101E -:10B0E00000010001200000010208A10008001090EA -:10B0F000C008C0900005900211A10041888490C052 -:10B10000829000080089000200000000000000009A -:10B110000400040004000000000000000000000023 -:10B12000A0000200008000804000A111A0030010D8 -:10B130000011000240000002828021800000000017 -:10B1400000000000400000000000000008001000A7 -:10B150000000004110100403000991839103054190 -:10B16000000900100208000900200000A100C00032 -:10B170000500808200890508801120A0210340106D -:10B180000008000500A0008200110000000000007F -:10B1900000002080840041009111000000000000A8 -:10B1A00000009000A00383A1418009004000090035 -:10B1B00041402000200000002000000000090000A5 -:10B1C0000000000800000041000000000010000026 -:10B1D0000040000002800300110241C0044021042D -:10B1E00089030003A000200008050480A000088453 -:10B1F0000580830200808020200089A02080A1108B -:10B200008808082100000040808000000000000045 -:10B21000000000009110A100C000C001000000006B -:10B220000000000041001111104105100004010050 -:10B230000000010100A001000000010000000084E6 -:10B24000008400842000080010019000000000012C -:10B2500000000000000000400100000001A1882162 -:10B260000501A0A084A141000500100120100802E2 -:10B2700003C010A0C1012010849040828205A1402B -:10B28000A100A1A1858500008801A0840020000103 -:10B290000000000100000000000084000000000029 -:10B2A000000000000000A0C0000808C103C00000AA -:10B2B0000000000000010001000000010000840007 -:10B2C0000008001011C00000200000000000000075 -:10B2D0000000A000000000010001000100000100CA -:10B2E000900305040141400201000001000001003B -:10B2F000C011008200880103030500880391032028 -:10B30000041101A00102100508A000850100A00899 -:10B3100000040010004000100004000400110010A0 -:10B32000000000000000000000020090800409906E -:10B330000009200910110041000200210021000530 -:10B34000000300820002048400008000000004006A -:10B35000000000090009000904080020000808098D -:10B3600020090008881110A105842110020310098A -:10B3700010040088009100054088A0100204C0213C -:10B38000850000880890088880040011034008099F -:10B39000829100000000000000000905214120000A -:10B3A00011410000000000000000000000C080808B -:10B3B00080004100090905000903218420002000C4 -:10B3C00005400000800000000000000500000000B3 -:10B3D000000000000000000000000000410908001B -:10B3E000410010081009408008001121000300806E -:10B3F00000000003100008400800090208118491B1 -:10B400008490110041211040410008048000008018 -:10B41000808000000000000000000000000200101A -:10B420000110010100000000000000000400880875 -:10B430000484080001040000000000010111010063 -:10B44000010000018400820010001000000000884C -:10B4500000040000000000000000000000000101E6 -:10B46000010000000000A140100885048800008849 -:10B4700000200002000020822090C020080011015E -:10B48000832091909000C1018588C0880101C0008F -:10B49000820404844000000000000000000000005E -:10B4A00000E0070000120000000000000000002182 -:10B4B000000007000000000000E0000000000000A5 -:10B4C00000E0000000000000000000008400000018 -:10B4D00000E0000000820000000000E0000000002A -:10B4E000000000E000000000000000E00700000095 -:10B4F0000000000000000000000000E00700600005 -:10B50000000000E007006000484200E00700000083 +:10AA700000000000000000000000000020000000B6 +:10AA80000003000040000000000300000000A000E0 +:10AA9000000040000000400204000020A00500006B +:10AAA0000000000020000000000000000000000383 +:10AAB000A00000008800C0000200400084000800E0 +:10AAC00000050000000800400000000040000000F9 +:10AAD000000000000400200020000000020020040C +:10AAE0000000000000000000000000002010000036 +:10AAF0000000000000000000400040004040000056 +:10AB00000000000040048000400440044004400471 +:10AB100040044004210400044191C00000010000F1 +:10AB20000090009040000000408240000040000083 +:10AB300000000000000040004000A0008000004035 +:10AB40008004000000004000000100904000000070 +:10AB50000000400000000000004000000000000075 +:10AB600000000000000000000000000000000000E5 +:10AB70000000000000000040000000000000020093 +:10AB800000008300000000000040004000000000C2 +:10AB90000000000000000000004001020000010071 +:10ABA0000100000001000010001000000040004102 +:10ABB00000400000400000080000000500400010B8 +:10ABC000A0020000820001040000001082000020AA +:10ABD0008200004000050008020000400010000054 +:10ABE000000400404003000240090040000002044D +:10ABF0000000004000000000000000000000000015 +:10AC00000088000008000090009000000000004054 +:10AC100000000008000000000000000040010040AB +:10AC2000040004000000020400000001000000080D +:10AC300000000041000080820000000000000000D1 +:10AC400004850205000000044008004000014000A7 +:10AC50000085008200040082008400040084000853 +:10AC6000008440100084808800098088008200846D +:10AC7000008409840084000000000000000000003F +:10AC800000210000000000000000000000000100A2 +:10AC9000018800800080000000000000900000009B +:10ACA0000500000000204000840084000000000037 +:10ACB000004000000002000000401082000500215A +:10ACC000000810081009840800200040400800080F +:10ACD000000800A000080000000800050021000294 +:10ACE00000210008000000080003000900050040E2 +:10ACF0000008000800080008000000000000000034 +:10AD000000000000000000000000000000820000C1 +:10AD100020002004000400040000000000000000E7 +:10AD20000000A00800000001000005000500000070 +:10AD30000000000100000000000000A00940000029 +:10AD400000080000000000000800000100010000F1 +:10AD5000000000000021000400000082000000004C +:10AD600000002100100010000000000000000000A2 +:10AD700000000000000000000000000000000000D3 +:10AD80000002000000000041000000090004000073 +:10AD90000000000020002000041000000004C0009B +:10ADA000A000000082209011080340400000200015 +:10ADB0008283000000090010820000000000028071 +:10ADC000052104000000210001801080C002000263 +:10ADD000000008000000000900090004C000000095 +:10ADE0000000A000000000000400000000000000BF +:10ADF00000000000000000008400000400000000CB +:10AE000000000001020000080082000009000000AC +:10AE10000000000009008000800000000000000029 +:10AE20000204000000004000030000108908200810 +:10AE30002088024000000000200421100000410092 +:10AE4000910284848000000008400810800200C144 +:10AE5000210100A000000000000800C00000030065 +:10AE60000000050800080500008221A0210000A0C4 +:10AE7000000000000000000000A0004000000000F2 +:10AE80000000900000000000000000000000000032 +:10AE90000002000000000000000800002000000088 +:10AEA0000000A00000000000000000A082000000E0 +:10AEB00000039041002100400840001000110000F4 +:10AEC00082210200822083200000C0020008C0030B +:10AED00000020040014000000021040800000000C2 +:10AEE00000080000000000009000000008000011B1 +:10AEF0000008000000000000000084000000004086 +:10AF00000000000000000000000000000000000041 +:10AF1000000000000000008400000000000080002D +:10AF20000000000000000000000000000021000000 +:10AF300005000000000000900001800000000000FB +:10AF4000000040008000080108010000000100002E +:10AF5000000000000000020100000000800000006E +:10AF600000000000000000000000000000400000A1 +:10AF700000000000000000000000000000000004CD +:10AF8000000000000200000000000000000020415E +:10AF90000100000088080000000000200000900070 +:10AFA000022190009000000000000000000004005A +:10AFB000200020000010C01020050000000000410B +:10AFC0000121000008089040000000080005084129 +:10AFD000001000800008080400210021001100205A +:10AFE00000108221080000000800820000000821F3 +:10AFF00000008400000000000000010000000009C3 +:10B00000002000210000000000842000000020003B +:10B0100000C0400400000000000400040000000024 +:10B0200011000000000800000000200000001108CE +:10B0300002080020000000012008000005C04110A7 +:10B04000030840080000000400110908028220845F +:10B0500010C0000300084100890000040000000047 +:10B0600000A0000000080000000000000000000038 +:10B07000000000000000000000A00000408420103C +:10B080000004000400840000010000000000000033 +:10B0900000000400000000000100080000000101A1 +:10B0A000000100000000000000000000000010107F +:10B0B00090890085041090A00083001008C0C1048E +:10B0C000002010A0080400004000100100019001C1 +:10B0D00040A000A08420881040C0900100A08240C1 +:10B0E00000C0048400100082000000000000000086 +:10B0F00000000000000000000000200040000000F0 +:10B100000000000000000000000008000000000037 +:10B110000000090000000000000003000000000023 +:10B120001140050400410000000000000000000084 +:10B13000800580040084000000A00090000580408D +:10B14000218011808080808000008209802000089A +:10B150008008808002000000008080900008008944 +:10B1600000890000800000800080000000000000D6 +:10B17000000000000000000000004004890380205F +:10B1800000030000000000000000000000000000BC +:10B1900000000000000000000000000000030000AC +:10B1A000000004004000110000000000000000004A +:10B1B000000080000089008880A00000004180001D +:10B1C000800080000003000000000000800080007C +:10B1D00080038084098005408905200280000003E7 +:10B1E0000089808300000080000000000000000053 +:10B1F000000000000000000000000000200004002B +:10B2000009004003000000000000000000000000F2 +:10B21000000000000000000000000000000000012D +:10B220000008000800A0010001000000000000006C +:10B2300000000000408810100483900888008801F6 +:10B24000A0040402080088018284109000004000DD +:10B2500082004001C09010C00201A0898403082030 +:10B260000201008940410000009000000000000041 +:10B27000000000000000000000000000000000A02E +:10B2800000000000000100000000000000000001BC +:10B2900000000001000100000000000000000000AC +:10B2A000000100000000000100000000000100009B +:10B2B000000000000000C00401020810101002107D +:10B2C00000880010108810030088008220C0000051 +:10B2D000000201409004000204110010008940C0E7 +:10B2E000C09000400040A1400200000000000200A9 +:10B2F000000000000000000000000000000000004E +:10B3000000010000A000000100000000000000009B +:10B3100000080000000400400003000500110020A8 +:10B32000000900080005000900400021410000114B +:10B33000000000000000000080004000808010003D +:10B3400000002000200000800010008900A1009172 +:10B350000000110010809100008080040084002112 +:10B3600000808080020011008900000000000000C1 +:10B37000800000000000000000000000000000004D +:10B3800000000020054189000004000000000000CA +:10B3900000000000000000000000000000000000AD +:10B3A0000000800000008000800040040011410087 +:10B3B0000300000000000000000021001185900043 +:10B3C00082008000000080800000000000028000F9 +:10B3D000000000002104098204002000C104890843 +:10B3E0002080C003A111838020008800004000005D +:10B3F000000000000000000000000000000000004D +:10B400000000000020A10000410004050000000031 +:10B41000000000000000000000000000000000002C +:10B42000000000000800880004000800010400017A +:10B4300000000100000000000000000001008982FF +:10B440008588080010000240100488004000008831 +:10B4500004020000000001000088010401000388CC +:10B46000881011400901C101201040C0A100000056 +:10B4700000000000000000000000000000000000CC +:10B4800000000000000001030000000001000000B7 +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B00000E000000000000000000000000060212B +:10B4C00000E00700820000000000000042000000D1 +:10B4D00000000000000000000081000007000000E4 +:10B4E000000000000000600000420000070084002F +:10B4F00000810000070000000000000000000000C4 +:10B50000000000000000000000000000000000003B :10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000E88ED49600C30002000000000000000066 -:10B540000000000000000000E1D91E2600FF096F86 -:10B5500000000000000000000000000000000000EB -:10B56000000000000000000000003C3CFF60000004 -:10B570000019000000000000000024E724E7B9FBE8 -:10B5800020620099C30F26463FCF9999F9F9000030 -:10B5900000003C0C2C2C5A5AF0F000000000000077 -:10B5A000000000000000000000000000000000009B -:10B5B00000008EE896D400000000000000000000AB -:10B5C00000000000000000000000879B78640F0F5F -:10B5D000096F0000000000000000000000000000F3 -:10B5E0000000000000000000000000003C3C606023 -:10B5F00000FF00FF000000000000000027E724E734 -:10B6000099DB0042FF99C30F19893FCF009900F9D8 -:10B610006FFFEFFF000000005A5AF0F0000000003A +:10B520000000000000000000BDBD00BD00000000E4 +:10B53000000000000000000000000000000000000B +:10B54000C7C7C7C7FFFFFFFF0066002683C300C34E +:10B55000F0F090900901003C000000000000D400D1 +:10B56000F00020F00000C0C0009BDF2056562000F5 +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A00000000000000000000000F9F900F90000B0 +:10B5B000000000000000000000000000000000008B +:10B5C0000000FFC7FFC7FCF0FEF60000000000000F +:10B5D0000000FFFF99990909003C000000000000ED +:10B5E000F000F000FFFF0000C0C00000C3004242B6 +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A :10B62000000000000000000000000000000000001A :10B63000000000000000000000000000000000000A :10B6400000000000000000000000000000000000FA @@ -109443,478 +109443,478 @@ :10B6700000000000000000000000000000000000CA :10B6800000000000000000000000000000000000BA :10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000FFFF00009C -:10B6B000000000000000F00FF00F00000008000084 -:10B6C000000000000000000000000000000080C03A -:10B6D0008FCF0000000000000000FCFC9864000018 -:10B6E000000000000000000000000000000000005A -:10B6F000000091019191918100000000F3CF62461A -:10B70000C3C3FFFF03F3606099668844D0E0DBE7C2 -:10B71000FF00FF000000000898FC00FC0099009961 -:10B720000000000000000000000000000B0B24FFE0 -:10B730000000000000000000717169690000000055 -:10B7400000000000000000000000000000000000F9 -:10B750007F3F70300000000000000000F3F39162B2 -:10B7600000000000000000000000000000000000D9 -:10B770000000FFFF9DFD8191818100000000F3CF5B -:10B78000918900003C3C03F36F6FFFFFCCCCDBE7FB -:10B79000D0E04200620000000000990099006F6F45 -:10B7A0006F6F00610006000D00000061000F0001D6 -:10B7B000000500000000000000000061303E009D18 -:10B7C00000000040000500000000006100050009C5 -:10B7D000000000613006009D000000610007000DC0 -:10B7E0000001000000610007000D0000006100077B -:10B7F000000D000080610007000D000000610006E0 -:10B80000000D000100610E0F0001000805610A092A -:10B81000050900A00061003FC0050000A06100060E -:10B82000000D00000000000000F03CFC0070007003 -:10B8300000200000000000000000000000000000E8 -:10B84000FF00000055555555FEFEFCFFBE82BC8032 -:10B8500000C3F0F0000000002B033F1700000000C1 -:10B86000000000000000000000003F410341000014 -:10B87000000000000000CFF38AA2000000200000BA -:10B8800000006F00006FFFFF0000E8E8E8E8FFFF3E -:10B89000FFFFFFFCFFFC003C3000D33FF33F000004 -:10B8A00000000030F0300000000000F03CFC000020 -:10B8B0000070000000000000000000000000000018 -:10B8C0000000FF00FC00550F553C02020003BE8241 -:10B8D000BC8000C3F0F0000000003F033F03000005 -:10B8E0000000000000000000000000003F7D037D1C -:10B8F00000553034000000048AA2CFF3000000009D -:10B90000000000006F6F6F6F00BA0000FCE8E8E80D -:10B91000FF17FF00FFFCFFFC003C3828D33FF37FFC -:10B92000000000000030F0300000000000000000C7 +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000F9FFF9FDFF0CFF9DFFF1F5 +:10B6D00000006C6C6C6C666666662466266600000C +:10B6E00000000000666AF0F0FC7E7E7EF0D0F090F4 +:10B6F000B9B90C0C7F7FFFFFC3C3C3C300000000B8 +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B740000000000000000000F0FFF0FCFF3CFFBD27 +:10B75000FFF70000FC0C0C0C00FF00302424262610 +:10B7600000000000000000000000C0424242F0F073 +:10B77000F0B0040400006F6FFFFF434343C30000B9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A000000000610006000D000000610006000DB1 +:10B7B000000000610006000D0000006100000001B3 +:10B7C0000000000000000000000000610E3CC00D01 +:10B7D000000000614006000D000100614006009D70 +:10B7E000000100000061003E000D0008006100063D +:10B7F000009D000110612036000D000100000030A6 +:10B800000000000000000000000000000000000038 +:10B810000000000000610006000D000000000000B4 +:10B820000000000000000000003C003C00000000A0 +:10B830000000000000000000CFCF454555553535CC +:10B84000FCFCFFFF0000000000000000FCC0FCC08A +:10B8500000000000000000000000000000000000E8 +:10B860003C3C3C9C000000000000000000000F0079 +:10B87000000F0000000028FF00FF00000000000093 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000151555550000D4 +:10B8A00000000000000000000000000000FF000099 +:10B8B0000000B230303000000000CF45CF45555574 +:10B8C0003535000003030000000000000000FCC04C +:10B8D000FFC10000000000000000000000000000A8 +:10B8E00000003C3C3C3C00000F0C0FCF000000006F +:10B8F00014144141ABA8ABA828FFA0FF0000000032 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000FDFD8080010100002B +:10B920000000000000000000000000000000000017 :10B930000000000000000000000000000000000007 -:10B940000000000000C3C0C041404140F1F1B0F12F -:10B950003C003C3C0C0C0404000000000000000013 -:10B9600000000000000000000000000000000000D7 -:10B970000000000FCF008A0A30F00E0BBEEB002053 -:10B980000020EE0000EED7D07D7000000000AAAAD3 -:10B99000AAAA000017FFFF000000B5B7B5B7000066 -:10B9A00040000505415500000000000000000000B7 -:10B9B0000000000000000020000000000000000067 -:10B9C00000000000000000C3C0C055545554B0B082 -:10B9D000B0F13C003C3C0C0CFFFF000000000000FC -:10B9E0000000000000000000000000000000000057 -:10B9F00000000000000F0F008A0A30F0B0E0BEEB3C -:10BA000000000000EEEEEEEED7077D0D0000000016 -:10BA1000BFBABABA000014FFFF000000B7B7BFB743 -:10BA2000000040000505410000000000000000008B -:10BA300000000000000002000000400002000000C2 -:10BA400000000000200001808400000000000000D1 -:10BA50000002028000004000C0004180020000009F -:10BA60000000010003040000A100040000034000E6 -:10BA700000040208008400108880410008102000A3 -:10BA80000000C080C01005008280400400008800D3 -:10BA90008400080808040010200040004090209115 -:10BAA000028820008220000488002100021000008B -:10BAB0000000000000000000000000008000000006 -:10BAC000000000000000800040200000000000C0D6 -:10BAD000000000C1800200000000000040100000D3 -:10BAE000000000000800A00100001000000000009D -:10BAF0008000000100000011000140024020800190 -:10BB00000000000040040001400000400000000070 -:10BB100000000000800084000000000000200002FF -:10BB200002040020A082020141000084089040012C -:10BB30000000010000000000000000000000000004 -:10BB400000000000000000000000000001000000F4 -:10BB500000000000000000000000000000000000E5 -:10BB6000000000000000000000000004019000053B -:10BB7000000000020000010000000000820011C16E -:10BB80000003000000030010000000000111000489 -:10BB9000200800040000090000408400080001049F -:10BBA00000040104010584000109900000840040A4 -:10BBB0000020000040000000000000000000000025 -:10BBC0000008000800000000000000000000200045 -:10BBD00000080000000000000000000000900000CD -:10BBE000008409C000000000000020C00000200404 -:10BBF00000C0000000090010401000840008000090 -:10BC000040020004000800080084040420004000F2 -:10BC100000A0800900080082401000841090059068 -:10BC2000208500002005204002082008020800208E -:10BC300041100005000000000000000000000000AE -:10BC400000000041000000000000000000000000B3 -:10BC5000200800410000000000080004000000006F -:10BC600000000000000000000000000800210004A7 -:10BC700000C0001000000004080588000002000554 -:10BC800000410003002100400121C003000901C15F -:10BC90000009910201400002004000109008008855 -:10BCA00040401040200300009010000400210021BB -:10BCB0009000041188210000000000000000000036 -:10BCC00000100000001000000082008400840000CA -:10BCD0002000A110000041C0000800000008100072 -:10BCE000000021100800090000000000008400008E -:10BCF00000000004000800000000800400000000B4 -:10BD000010000010030000A000844000100005880F -:10BD100008022182401110002110418408052100F1 -:10BD20000002828280400000008241A000A01084B6 -:10BD3000111008C0A1000010000040000000000029 -:10BD400000000008001100040000000000000000D6 -:10BD50000040040002050011A000000000200000C7 -:10BD600000058240821100080008204100080009F7 -:10BD7000A0001000C0052005000088212005020059 -:10BD8000080002218408081000110280A000402150 -:10BD9000024108409041A005080000039040821134 -:10BDA00002218211911040040800C00340A0A0218C -:10BDB000A0219020040082C1400200008000000009 -:10BDC000000003200000020002000000000000004C -:10BDD0001100000080000000000000000200028846 -:10BDE000008800080000000800002100000000009A -:10BDF000000400000084080090C0000000008000E3 -:10BE00000000000082820090000908C000020900C2 -:10BE10000008008480A0021003409010020020C19E -:10BE2000020000A004002001880091C0114000041D -:10BE3000099000000988910820202084000000005B -:10BE400000000000000000050000002100008280CA -:10BE500000004021000810000800008000000000E1 -:10BE600000020000000008008400004100051021CD -:10BE70000040400000000021000000100000000011 -:10BE800082080041000000210800004082020010EA -:10BE900000408240A0410000000808084000000364 -:10BEA0000808004082020002A000C10008080090BB -:10BEB000018085C0828020001000100400830000F3 -:10BEC0000000000000000000000000001100000061 -:10BED00000020000800000000000000802020000D4 -:10BEE0000000200100000000000000000000000031 -:10BEF0000000000080000000000040080004000076 -:10BF000000040000000009C00310800000080300C6 -:10BF100010C002100088038200000004080408001A -:10BF2000008485101190000809A0038408100308FC -:10BF3000000420044004080480888010900103401D -:10BF400000000000000000000004000000000000ED -:10BF50000000200441000000900002050040004164 -:10BF6000020000090810400502418800004100025B -:10BF70000841004100002009002100410021000487 -:10BF800000000010000800210008002108410021E5 -:10BF90001110C04082004000020810080004000098 -:10BFA00010098809022188410100400220088940C7 -:10BFB0002000002182418240820008040204200502 -:10BFC000200200000000000000000000000011003E -:10BFD00000C00000080008000890400002000000B7 -:10BFE0000000000841108000000000000800000070 -:10BFF0000000208200080000009000A00000400027 -:10C00000040500000008000000000000000000001F -:10C010000000408320844008400202840010090090 -:10C0200000040200080000004184080000401102E2 -:10C03000208411402004211003C00004200000844B -:10C0400080088208000000000001000000000000DD -:10C050000200000000010101040100000404A084AA -:10C0600082C1C0A0008800108808C004A008210177 -:10C0700082200808020440020408A0A00901080068 -:10C0800041008200000000A1C0881100820102A0CE -:10C090000120008408C00000C10182010000048466 -:10C0A000024110C0880540C0834010A0828441C175 -:10C0B0000141841103899182909088A0C0A000035F -:10C0C0008903831008900010001100040004000090 -:10C0D00000000000000000100320004000090004E0 -:10C0E00084098505800400800080008000000889A4 -:10C0F0008408000280898000858000800000114152 -:10C10000004084408005000004080011C141800205 -:10C1100000802100000080000040084080100000E6 -:10C1200004028910054100894080108000008000D1 -:10C1300088C108A140210202400021004080000087 -:10C14000004182A188110000008000000000001161 -:10C150000000110010004000020004000400024032 -:10C1600080000900840089800000408002000000F7 -:10C1700088002120910011038000000280218000AE -:10C180001180210040000820000082800800800407 -:10C19000C1020980410088042140410090008211C1 -:10C1A00021030000A108C080842110008800100431 -:10C1B00021000400A010C1A0020209030905858521 -:10C1C000C1801180020311C00303000800000000B9 -:10C1D0000000000000000100010000020100010059 -:10C1E00000830204A000A000A188000089041100BF -:10C1F00010008902030088C0C001080010008811E7 -:10C200008200890211001100910000004008C10065 -:10C21000A000098400020200A100A101908808008A -:10C220000301A10140021101A1821001830021003C -:10C230002001010011204000880504008200A08533 -:10C2400009A083A0009089100803A101000000004C -:10C2500000000000000100000001000100000001DA -:10C2600001010000A0C000040482A02008100011F9 -:10C27000A001A004900500A00183900200A000A1ED -:10C280000041048200110188001100090000000132 -:10C2900001A001890100008800020088A0C10000FF -:10C2A0000100000100019008000200218502848342 -:10C2B00000000020C103020100A100211182C0087A -:10C2C0002091008408088888012089910591000048 -:10C2D00004000400000000400000002100400000B5 -:10C2E0000920052104040004040910418011804143 -:10C2F0000020804080090084028905A11189000581 -:10C30000008800880082000810A041A00488000076 -:10C3100000094182204009110000000000008084D3 -:10C320000002042104200040009020821005111119 -:10C3300000080011000209880020038410A1098070 -:10C34000049000080010858900410211890591417F -:10C35000402100004100000000000000000000102B -:10C360002021210021000241414005022000090452 -:10C3700000000000000000008990218900808905EC -:10C38000002080040080000009042080108000113B -:10C390000000082102210980401104080080028069 -:10C3A00000104021080010004020C1008809828050 -:10C3B0000400000000000080000288C021914100BC -:10C3C00080000089804000800089059100050941B6 -:10C3D00011110101000000000000008800000000B1 -:10C3E00000000105000001000101010500A100900D -:10C3F0000000000004880084000008A090C0101015 -:10C40000080004010884A0109000000101080084C5 -:10C41000000000000111009000840101840210104E -:10C420000140040001010110008401010504A191F3 -:10C4300082081000004000820084000005099183FA -:10C4400008881000C0050284A040401089401002F6 -:10C450009190910100000000000000000000000029 -:10C46000000000000000000000000082840000E0E6 -:10C4700007000006000000000000000000000000AF -:10C48000000041000000000000000000000000E08B -:10C49000000000000000000000E0000088810000B3 -:10C4A000000000000000000000E0000000000000AC -:10C4B00000E000000000000000000000000000009C -:10C4C00000E000000000000000E007000000820023 -:10C4D00000E0070000000000000000000000000075 -:10C4E000000000000000000000000000000000004C -:10C4F0000000AFAFAEAFFF00FF003F3F3030FCFCAD -:10C5000082BE0FFF0555303FAFAFF8F82828000076 -:10C510000000F0F0BEFF000000000000F0F0F0F0BE -:10C52000FF3CC300A8FD0303000000000000000062 -:10C53000FFFF0000FF00FE00000000000028FFFFDA -:10C54000E0EBF0FFFF00FF00ACACACAF0000085D1B -:10C55000AAAAF0F33CFF30F3000000000000000046 +:10B94000FF00FF003C3C3C3C000000000000000009 +:10B950000000500000000000A2A2F3F3000000006D +:10B96000000000000000000000002828303C00001B +:10B970000000000000007F7F43430C0F0C0F00000D +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000F0F0C3FFC5C57B +:10B9A00000C50000000000000000000000000000D2 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000FF000F0F303F303F0000000000007C +:10B9D00000000000500000000000A2F3A2F30000ED +:10B9E000000000000000000000000000AAAAF0FF14 +:10B9F0000000000000000000007F00430C0D0C0F51 +:10BA00000000000000000000000000000000000036 +:10BA1000000000000000000000000000A0A082AABA +:10BA2000CFCF00CF000000000000000002000000A7 +:10BA300000000000000000000000000005001010E1 +:10BA40000002200000051000000040050200A000D8 +:10BA50000000010020000000C0000920C08002009A +:10BA600000000008C0002103400021000003200066 +:10BA700020000800880084008900000021000208DE +:10BA80008800001008032004840000040000200443 +:10BA90000000C0048800840001030910820020C057 +:10BAA000008004004085C02020000020000000002D +:10BAB0000000000000000000000000000000100076 +:10BAC000800000010000000080840082808200006D +:10BAD0000082008208828000000000008401004093 +:10BAE0008000000000000000400000002000000076 +:10BAF0000000000080000000000010000000200096 +:10BB000000000000000180208021002000010000D2 +:10BB10000001000000010000000008008201000098 +:10BB200000110010000000100001000009010000D9 +:10BB30000000000000000000000000000000020003 +:10BB400000000080000000020000008000000000F3 +:10BB50000100000000000000000000000000008064 +:10BB600000000000000000800000018000210100B2 +:10BB7000000000000010000000020040000000046F +:10BB8000001000000009008000900000000000008C +:10BB9000000000000008010800000000004008400C +:10BBA0000000000001000009001000000008000073 +:10BBB0000002000000000000000000400000000043 +:10BBC0000000000000081000000100000008000054 +:10BBD000000010000008000000000000000000004D +:10BBE00002100000000000880010100008401084BF +:10BBF0000800000000080011000000410001008260 +:10BC00000000000100840210020202110284000000 +:10BC1000000800400284001020880084000800080A +:10BC20008009004000840800008400080008000922 +:10BC3000020800850000000000210005000000004F +:10BC4000000000000000000200080000000000806A +:10BC500090008809001090000021000001040004F9 +:10BC60000000000400000000004100110005000574 +:10BC70002005002100000010000800050021000937 +:10BC80000008841000030021000500210005004089 +:10BC90000008080000008208000000210000842144 +:10BCA0000005000000000040011001030010000327 +:10BCB0000003C1000021000000000000030000009C +:10BCC0000000000000000000000000000000000074 +:10BCD0000008000000001100009000001100200189 +:10BCE0000501050000C10810000000A0090800823D +:10BCF0000084008403A0000000890000218405085E +:10BD0000031000A0000041820082008400A0001007 +:10BD100000A0000008000000030000000010080060 +:10BD200003100000090000080001080008000001DD +:10BD3000008410000400000808000000000000005B +:10BD4000000000000000000000000040000205802C +:10BD5000000090210000000208080000010900080E +:10BD60000040202188112100020000000000100086 +:10BD7000A011C0801000000000000000A0022021DF +:10BD8000402190100091000000000800C080400099 +:10BD9000C0888200080020000800200008008200FF +:10BDA000C0008400082184400000820008000000D8 +:10BDB0008200C0000000C004400000040200000037 +:10BDC0000000098808401182008400000000020180 +:10BDD0004002000200082000020140000000400074 +:10BDE00005001100800000008400000008A0000091 +:10BDF00000C0000800020090000000000082000166 +:10BE0000000000C0400100100002000800000040D7 +:10BE1000801000400008000080000000800000A0AA +:10BE200021400040080000100301000000108000C5 +:10BE300021880040000003900000890000000041BC +:10BE40000000400500000000000000210000000587 +:10BE50000000000200000008004100050000000092 +:10BE600090000005001184008421002008100008C3 +:10BE7000A008080800000000880801000000A009D0 +:10BE800000410008A0100840000508400802018099 +:10BE9000100000080800C0000008C0000008821060 +:10BEA000820908210002C040400020000840A00094 +:10BEB000084100210900080082051000C040000070 +:10BEC000000800A08000000000000000000000004A +:10BED0000000000800010000000100000000000850 +:10BEE0000000000000A00090000009A0008383096A +:10BEF000008400A01100000000A0108420000000B9 +:10BF000011100000000020890008001000080084C3 +:10BF10000210000000A080000000000000000000EF +:10BF2000000400000000000000008000000000008D +:10BF300000000000000840000000000000000000B9 +:10BF40000040002100000000000320000000000865 +:10BF50000000000000000111000000400008008007 +:10BF6000000088002000824100008400100300844B +:10BF7000C02100094021022120028203C0051003D4 +:10BF800000000040C02110210100001000218208A3 +:10BF90000005000040C10000000800110021081148 +:10BFA0000008000500000205000008058200A00846 +:10BFB000820000100108000000080421080082002F +:10BFC0000020008420001140020400000000410015 +:10BFD00008040390210020004008000000880000B1 +:10BFE00000400008020000840000029011088290C6 +:10BFF00000200000004000000090000100C02082EE +:10C0000000080000009100040084400000000000CF +:10C010000000000000000810410000002000214046 +:10C02000000400000000020000000000800000008A +:10C0300000000000000040004100000080000200FD +:10C04000009011000000000002000000000000004D +:10C050000000000000000000020000000040889086 +:10C060008290008820000000000000001189040276 +:10C070000282900988A004A000040084110800082E +:10C08000A0058402000040A0019082030810C004B3 +:10C0900001829188C0A0C0C000900404A0400000AC +:10C0A0000001900000000000100091000000A08836 +:10C0B00000880088020811088510C010024000C0E6 +:10C0C0000104100210200000000000000000000029 +:10C0D00000000000000000001100090000001080B6 +:10C0E000910080000000000000000000000090416E +:10C0F0002111059100888080800005000080841057 +:10C100000083000200030000808240090004809048 +:10C1100080000880088000008080410000800000CE +:10C120000000112191090004002110118409002050 +:10C130008000000000808080098308030040009197 +:10C140000000100000800000000040000200040019 +:10C1500000000000000000004000100005004180C9 +:10C16000000000210002000004001100A0004100B6 +:10C1700088000441880010028000800880808000D0 +:10C180008480082185404110000010002103898827 +:10C19000021080000002000000009100090302402C +:10C1A000A18010800000080021081180008011008B +:10C1B0002103000000020000000080000021008038 +:10C1C0008010000000090000800000000000010055 +:10C1D000000000000000000000000100000001005D +:10C1E0000110000000020088000091008800A100FA +:10C1F0009100A1882001A02004C008000801A00827 +:10C200008200A1C08300A0832182000001022101DD +:10C21000A0A182C18800880184C0A0C00800880154 +:10C22000058809020190000001000101009000A0B2 +:10C230000000010100820000000200008820900040 +:10C24000908204018400C0880408100000000000EF +:10C2500000010000000000000000000000000000DD +:10C26000000100018801000088010201000800109F +:10C2700000900000100201A1A10803834002008287 +:10C28000820410C040A000A10808C1A000000883DB +:10C290000002018510C0884000C020040085900085 +:10C2A00000880002A0C10000000011000001000091 +:10C2B00000000000000004200084008210009011A3 +:10C2C00000A0010410C090110009840304A1001013 +:10C2D0000002002100000000000000000000000239 +:10C2E0000010002100410010001000030041000078 +:10C2F000008000000000000204A189891183808071 +:10C300000000008000808002208341801110000026 +:10C310008088100820A18290008200000010004157 +:10C3200000020090009190C00009100385101110C8 +:10C330000003001002100010000000000000800048 +:10C3400000C002A00290098380100088000800C18C +:10C35000008000000000004000000000000000001D +:10C360000000000000000011800000080000000034 +:10C37000009000800000000209C005C108809040C4 +:10C38000000000800000800020094080214040051E +:10C390000000210082808480C010000080008000A6 +:10C3A00000008000008080008008098003000400F5 +:10C3B000101103800400080010108300A000110079 +:10C3C000080021408080C180020000008091008030 +:10C3D000000000100000000000010000000000004C +:10C3E00000000082000000000000400002009000F9 +:10C3F000020000C100200020000020C088088384C3 +:10C400000501900010A002200800C183101089A02F +:10C410000000000011A0041008100901C000040071 +:10C4200004C0A000021020088410A00100C0000079 +:10C430000000000000C0000001000001C000080072 +:10C440000000030083000482840241000000A00277 +:10C4500002908800000000000000000000000000C2 +:10C4600000000000000000E000000000500000E0BC +:10C47000000000000000000000004200608100E0B9 +:10C48000070084000000000007000000820000E0B8 +:10C490000000880000000000000000000000000014 +:10C4A00000E0000060000000000000004200840086 +:10C4B00000E000004200410000E0000042000000F7 +:10C4C000000000000000000000000000000000214B +:10C4D0000000070000000000000000000000000055 +:10C4E00000000000000000000000000000003CB25E +:10C4F000FFB2000000000000000000200020FF0F3D +:10C50000410100005D55004100430AFA82BE00006F +:10C510000000FFD000000000C3410301554500F0BA +:10C52000AF052C04C5C500C5DF00CFCF00000A0A47 +:10C5300000000000000000000000000000000000FB +:10C5400000C38282AAAAAAAA00000FFF000000006E +:10C55000FF75FF75FFFF00300000000000000000C5 :10C5600000000000000000000000000000000000CB -:10C5700000000000A5A5A4A5FF00FF00303030306A -:10C58000C0C082BE0FFF0FC3303FA0A0F0F000AAD2 -:10C5900000000000F0F0820000000000000000FF3A -:10C5A00000FFFF3CC300085DF3F300000000000043 -:10C5B0000000FEFF0001FFFFFEFE00000000000083 -:10C5C000FFFFEBEBFFFF5F5F0A0AACACACAC000017 -:10C5D00000FFAAAA000300C330F30000000000001F +:10C5700000B2C3B200000000000000000020002054 +:10C58000FF0FEB0B00005D5D004100C30AFA82BEA5 +:10C590005500FFA0FFFF002F0000FF550F05FFCF44 +:10C5A00000F0FF553C14CFCF00CF00000000FF008B +:10C5B000AAAA000000000000000000000000000027 +:10C5C000000000008282AABAAABA04140FFF004039 +:10C5D000C3C3FF00FF00FFFFF0F0000000000000F9 :10C5E000000000000000000000000000000000004B -:10C5F0000000000000003CFF1C5FF0F0FF00550F42 -:10C60000550F04040F0F202C3C3C14003F00000089 -:10C61000EAFE000000007C7C2C2C000000FF0000E3 -:10C62000FFDCFFD0C8F808385555F0FF00000000C7 -:10C630003A300E0CC38241003C3C0000040008006C -:10C64000FFFFFFFF0F0F0F3C555500F00CCF8ECFB3 -:10C6500005870505FFC33F03FFF00F000000000042 +:10C5F0000000BE145F5F00000000000000000400A7 +:10C60000000083000100C3C3E3F307030003FF7FBF +:10C610007F7FA0AAA2AA5F570A020000C2C3C0C0BF +:10C6200005050F0F00000000F000F00000C0EB0B4C +:10C63000FFAAFFFF00000000000000000000000053 +:10C6400000000000C0C1F0F500000000FFFF000086 +:10C65000FFFFFFFF080C0C0C51550000000000000C :10C6600000000000000000000000000000000000CA -:10C6700000000000040400043CFF3CFFFE40FE40BC -:10C6800055FF550004040C0C303C3C3C14003F00AA -:10C690000000EBFF000000007C2C7C2C000000FF61 -:10C6A000000023002F00C8F808385555000F00007F -:10C6B00000003F300F0C43024302A0FF00000000C7 -:10C6C0000000010001005555553C5555C3F30CCFF2 -:10C6D0000CCF0587AFAF55555555FAFA0A0A0061D8 -:10C6E0000006000D000000610006000D0000006162 -:10C6F0000006000D00000061000BC0050000006195 -:10C700003006001D000080610006001D00008061F1 -:10C710000006000D000000210003001100010000D0 -:10C72000006140050009000000610006009D000056 -:10C73000006100060005000000610007000900011B -:10C7400000615006000D00018061500500050000E9 -:10C7500000610E0F000D000000213E0BC000000024 -:10C76000000055550000000000000000D714EB2821 -:10C7700000BF00FFF0F0A0A0003C0040C3C3CBC34B -:10C7800000000000A00300FF3C007D7DC3C05550A9 -:10C7900000000000FF3CA52400AFFFAFC282C2C36F -:10C7A00000003CF03CFA0EFE04F400005050000083 -:10C7B000FFFFD7D782820FFF00F0F355F3000A3E48 -:10C7C000FFFF000000007DFDFFFD55550F0F15BF59 -:10C7D00015BF00000000C3C300FFA6A6AAAA909040 -:10C7E00020D0050555550000000000000000D714BA -:10C7F000EB28003F00FF000000FF003C004000006D -:10C80000000000000000A00300FF3C004141FFF0D9 -:10C81000FFF000000000FFC3A5810005FF05C282F4 -:10C82000C2C300003CF03CF00EFE04F40000000027 -:10C8300000000000D7F782020EFF00F1F355F3FF6E -:10C84000003CFFFF0000000000808280FF000F0F0F -:10C8500010BA10BA000000000F0FAAAAAAAAAAAA2A -:10C8600000000000000003030000000000000000C2 -:10C870005A5AFF00000000003C3C04040000000085 -:10C8800000000A000000000000F000F0D7D7CF0C35 -:10C8900050AA78AA00000000000000004040C0003C -:10C8A000C0E8FCFC0000FF0CAE0CFCFCFAFA000037 -:10C8B0000000AAFFEAFFAA00A0003CF53C05554194 -:10C8C0004141F0F0F0F000000000A8AAFDFF55552E -:10C8D00005AF3CFF3CF000000000D7D75F5F0005CC -:10C8E0000000003000900000000400000000000084 -:10C8F00000005A5A00FF02EAFF003C043C04080012 -:10C900000000000000000000000000F000F014141F -:10C91000CF0C5000780000000000000000005050D4 -:10C92000F000C0E8FCFC0000FF00AA000C0C0A0AA2 -:10C930000000000000FFC0FFFF00F5003CF53C05D3 -:10C9400055515151FFFFFF000000000008005D55E8 -:10C95000414105AF3C003CF0000000000000FF003A -:10C960000005050500300030200000000000000038 -:10C9700000000000000000000000000000000000B7 -:10C98000028003800180048000000000000000009D -:10C99000040000008800020088000400000000007D -:10C9A000000020004000210000030000000084007F -:10C9B000000020000008A0000200840000008800A1 -:10C9C00084088800020840000108018088808400F3 -:10C9D00084098890050321008380828301808580FB -:10C9E000848089888980889101800000000000008F -:10C9F0000000000000000000000004000000000033 -:10CA000000840040400410100208000000001100E3 -:10CA100000000000000000000000000041000000D5 -:10CA200000000000000000002000000000000800DE -:10CA30000000000000004000004000000000410035 -:10CA40004184000000002000000020000802402077 -:10CA500000400000204090040400084040082040AE -:10CA6000020809021010020820200820000000001F +:10C6700000000000BE140A0A0000000000000000D4 +:10C680000000000000000000C3C3C3D3000000008E +:10C69000F0707070A8AAAAAAFFD7AA820000FAFFB9 +:10C6A000F0F00F000F0FFFFC00C0F000C0C003C38C +:10C6B000E000CFAACFFF0000000000000000000053 +:10C6C000000000000000C2C3FAFF00000000EBFB06 +:10C6D000000000C700C3283C3C3CF3FF00000061A1 +:10C6E0000006000D000000000000000000000060D7 +:10C6F0000007000D000000613006C00C0000006162 +:10C700000006000D000000210031C00901A000005A +:10C7100000000040000100610006C00900010000A7 +:10C7200000610006009D0000806100070018000005 +:10C7300000615006009D000100610003C00500007B +:10C7400000610003C0050000A0610006000D0000AC +:10C7500000610006009D00000061003E000D000029 +:10C7600000000000080D080D00000000000000009F +:10C7700000000000D7820F0A00000000F3EB5555BF +:10C7800000000000000000005D0CFFFFFFFFA2AAF8 +:10C790000000000000000000FFE3FFA0F0F02828E8 +:10C7A00000000000F1FFB2F3F3F3000000002800E6 +:10C7B0001400000000000000BF00F3A2FFAA00F573 +:10C7C00000C1030F020A007D000DFE00AE00000054 +:10C7D00000000F0F0F0FEBFBFFFB000000005505E3 +:10C7E000000000000000080D080D0000000000001F +:10C7F000000000000000FFAA070200000000F3EBA9 +:10C800000000000000000000000055005500FFFF80 +:10C81000A2A2000000000000000000E300A0F0F071 +:10C82000282800000000FBFF30717171000000003B +:10C8300000000000000000000000000000000000F8 +:10C8400000F500F50F0F0A0A007D007DFE00AE0026 +:10C8500000000000C3C35555001014100000000074 +:10C8600055553C0000000000AA0A0000000000002E +:10C870000000000000000000A0A010000000000068 +:10C880000000000000000000C30AC30AC3D7F0FF85 +:10C89000CFCFEBC30000000000000000000000004C +:10C8A0003C005F0A0000000F000E414143C300003E +:10C8B00000000000000000000000FF4F0000C7FF64 +:10C8C000C7FFFFFFAA280CFFFFFFFFFF143C00007B +:10C8D0000000000000000000CB000000000000008D +:10C8E000000000000000000000000A0A0000000034 +:10C8F00000000000000000000000A0A000000000F8 +:10C9000000000000000000000000C30A0A0AC3D7AC +:10C91000F0F0CFCFFFD70000000000000000A2021F +:10C92000AA023C00FFAA000000000000414143436E +:10C93000000000000000000000000000FF7F000079 +:10C9400000FF00FFFFFFAA000000FFFFFFFF14141D +:10C9500000000000000000000000FFFF00000000D9 +:10C9600000000000000000000000000001800080C6 +:10C970000100418089800380118001800180008056 +:10C980000100108000000880040000000540848041 +:10C990008940038820840190208889840588C10209 +:10C9A00004008580050004800003200000100000C2 +:10C9B00020000200C00520000000C0102000000080 +:10C9C0000000030005800590200200100005020011 +:10C9D00020002000000084000008000000008408FF +:10C9E0000000C000200420854084000000001040AA +:10C9F0000010020090200404021088022040020867 +:10CA000000021000A0400020802000840000A0014F +:10CA100000081021A0110009402180410403C00535 +:10CA20000801002020101000200800000000000075 +:10CA30002000000020A02000410000002000000095 +:10CA40000020000002000802080880010000000029 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000004000010008800300000008F2 :10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA9000000000000000002100000000000000096C -:10CAA0000000000000000000000000030000000083 -:10CAB000000000030003000000410000000000002F -:10CAC0000000000000040011000000000000000051 -:10CAD0000020000000000009000900040000000020 -:10CAE00000040000004000090040000000080000B1 -:10CAF000000002000000001000000000000000081C -:10CB00000008000800000000000000840000000091 -:10CB100000000000000000000010000000880084F9 -:10CB200000840084001000000000001000000000DD -:10CB30000010001000000008000000400084008485 -:10CB40000000000800C000880084000400000010FD -:10CB500008840505090800040408000802080010FC -:10CB6000000402100284048804000082058800107A -:10CB70000000000000000000000000000000002194 -:10CB8000000000000000001000000100000021056E -:10CB9000000000000000000200000000000500008E -:10CBA0000000000000400000881088000000000322 -:10CBB0000000002184212021000000008800204185 -:10CBC00008412021004100410000880090038408B2 -:10CBD0008840C0104002404040088411402120009D -:10CBE00000000121004182080209004020092003C1 -:10CBF000004100000000000000A000000000000054 -:10CC0000000000000000000021A00000080000005B -:10CC1000C0000010110003840000008200080082A0 -:10CC200000000010090000820500000800900000CC -:10CC30000000000000844008008200000010000096 -:10CC400011000908000040A009000010001010A009 -:10CC500003400000058285A100A1001000A0C110C2 -:10CC60008300008440042108080200A000A04100C5 -:10CC7000804010008200A000000000008200000040 -:10CC8000000000000000000040000000000900005B -:10CC9000C00000009000000000000000000900003B -:10CCA0000000000000000000000000418800A0110A -:10CCB0000005200300000041A01010080041020000 -:10CCC0000000900000000041C00990000000A0009A -:10CCD000880008000841000500044004040488009E -:10CCE0008800A000000002000403040008114000B6 -:10CCF000A0040040C00400040004000000000290F2 -:10CD00000000000000000000000000000000000023 -:10CD10000200000000000000009003C0204021003D -:10CD2000000440000000000000C0000800004000B7 -:10CD300000081182000000000084009020044002DE -:10CD40000020100000100482008211881008008268 -:10CD5000118840041100048220840088918809A071 -:10CD600010040288004000841120110200C000203D -:10CD700000040400008800820000000000000000A1 -:10CD8000000000000000000000000000000008009B -:10CD9000000000000000000000080000000000008B -:10CDA00000000000820800000000000800000008E9 -:10CDB0000000000500000021000000000008004104 -:10CDC0000000004000080809000000000000000901 -:10CDD00000000000100000030003A008004009103C -:10CDE0000083000800000003821108910002C000C7 -:10CDF0000000080800000008A0110000000000006A -:10CE00000000000011080000000800000000000001 -:10CE10002110000000002100000000C0000800A058 -:10CE20000082000002002110050800880000008434 -:10CE3000110208840010200020100000000040C0F3 -:10CE40000510001000C000A0000800A0001008009D -:10CE5000008420A0118220C00002210005900082E1 -:10CE600010100910009011A000A009020210008209 -:10CE700000101104000008880200000200000000F9 -:10CE800000000000000090000000200000000000F2 -:10CE90000200400000000020000000000800000028 -:10CEA00002000020A00000000008000082008800AE -:10CEB0000011000000119000002100040000000893 -:10CEC00000030008000082088200000082000800C1 -:10CED00000040000020002000000001088000000B2 -:10CEE00040000400A00000081000024008080000F4 -:10CEF00088050020A008020200080000004005008C -:10CF0000000400000000000000000000000000001D -:10CF10000000000000080000000000080000000001 -:10CF200000000090050800A02010000000A00000F4 -:10CF300000C0000000000000000000000008000029 -:10CF400000000082200800820908008400040420F8 -:10CF5000110809900004090400000210004000823A -:10CF60000000000800A011840000110400400040EF -:10CF7000008240C0099000840008021000001100E7 -:10CF800000000000000000000000000000000000A1 -:10CF90000001000000C00000000000000104840047 -:10CFA0000000000000000000010000000000000080 -:10CFB0000000000000C000000000000000000000B1 -:10CFC0000000000000000000000001000000000060 -:10CFD00000000000000000C0000000000000000091 -:10CFE00000000000C1000000C18301004000018278 -:10CFF000C020C000C1000004C0820000C0000111B8 -:10D000008800000000000000000000000000000098 -:10D010000000002005000080000000000000040067 -:10D0200000000000000000000000410000000000BF -:10D03000000000020200008000000000000000006C -:10D04000000000000000000000000000410000009F -:10D05000000000000002040000800000000000004A -:10D06000000000000041C1410000C18302410005F1 -:10D070000891800080048841008080800011800237 -:10D080000883000000000400000000000000000011 -:10D09000000000004000C0800020000000000000F0 -:10D0A000000000020000030000000080000080007B -:10D0B000000000000900C10000C0800080000000E6 -:10D0C000000000410000000003000000008000009C -:10D0D0008000000000000500050000808000800046 -:10D0E0000000000000414100034100C10000204059 -:10D0F00021410040001004C180410041030089002B -:10D10000894100C1804000000000000000000000D4 -:10D110000000000000000200410800010000400083 -:10D1200000000000000100000100000000C000003D -:10D13000200000000000900010C0008508C004001E -:10D14000000000000001000000000100000000C01D -:10D1500000002000000000009000C040008404C0D7 -:10D1600004000000000000010000010100C100886F -:10D170000101000100850000C1C182C1000101A0C0 -:10D180004000100100C1820100000000000000000A -:10D19000000000000000000000820000000000000D -:10D1A000000000000100000000000000C0000000BE -:10D1B000000000000000000000020000020000006B -:10D1C0000000000000000000000000000000C0009F -:10D1D0000000000000000000000000020000040049 -:10D1E0000000000000000000000000400000C183BB -:10D1F00000000000000004C1040001080000C1405C -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D220000000000000000800000000000000800076 -:10D23000000000000000000000000080000000006E -:10D2400000000000000000000000000000000000DE -:10D2500080000000000000000000000000800000CE -:10D2600000000000000000000000000000800041FD -:10D27000C1830000000000418402800002C100411F -:10D28000C1C100000000000409410000000480004A -:10D2900000C1000000000000000000000004800049 -:10D2A0000000000000000011000003840000800066 -:10D2B00000C10000000000000000000000C180006C -:10D2C000002000000000000000000000000000003E -:10D2D000800000C1000000000000000000000041CC -:10D2E0008000002000000000000000000000C1805D -:10D2F0000041800900004041000983C10403C1418D -:10D3000000808080000040410000800040820000DA -:10D31000200000400000000000000000000000416C -:10D3200020000000000000000000A0000104000038 -:10D33000400000C1000000000000000000000005E7 -:10D34000400000010000000000000000000000009C -:10D350000000400000C100000000000000000000CC -:10D3600000914000000100000000000000000000EB -:10D3700040C088018288000001018200200801036A -:10D38000408900C040C000000101000040020108C7 -:10D39000000000000000000000000000000000008D -:10D3A000500000E00000000000000000000000004D -:10D3B00000000000000000420000000000004800E3 -:10D3C000810000E000004800000000000000004272 -:10D3D000000000000000000000420000000000000B -:10D3E0004800810000E0000048000000000000004C -:10D3F0000042000000000000484200000000000061 -:10D40000480A811200E007004842000000000000C6 -:10D410004842000000000000000000000000000082 +:10CA8000000000000090000000A000200000000056 +:10CA90000000000000000000000000000000000096 +:10CAA000000000000000000000080000000000007E +:10CAB0000010000000000000000000000000000066 +:10CAC0000000000000000100010000000100000063 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000103000042 +:10CAF0000000000000100000000000000084004062 +:10CB00000000000000100009000000050085000082 +:10CB100000400000000000000010000000000000C5 +:10CB200000080000000000080010000100000000E4 +:10CB300000000410000000000000000000000000E1 +:10CB400000C000C00000001002840808000010842B +:10CB5000020802000008028400000010008800881B +:10CB600000080088000000080008001000081000FD +:10CB70000005002100000005002100210003000045 +:10CB800000000008200020000008000800000085C8 +:10CB900010000000088000800000048000802090C9 +:10CBA00040100200020000000000000800110121F6 +:10CBB00000008200002100000041000300088808F6 +:10CBC000001000030003080300000000200500031C +:10CBD000100000000000000200100005000000002E +:10CBE00000100000000200000021000500000010FD +:10CBF0000909000000000000000000100000000013 +:10CC00000000000000000000000009100085000086 +:10CC1000401000000508850800100900800200206F +:10CC2000A14085C18300808821000000030200002C +:10CC3000400200000000008841C00010008400A0F5 +:10CC400003C000C00000000800A000A0000880840D +:10CC500008109102210000C04188008421C0028296 +:10CC600000A00084080000080000028200A000A0CC +:10CC700000A01008000000000000000000000000FC +:10CC8000000000000000000000000000880000001C +:10CC90008800008000008400108000000000020076 +:10CCA0000000080008000000000000000080408034 +:10CCB000020002800000000004000000A00000004C +:10CCC0008200A000820090000000000000009000A0 +:10CCD0008302820000028200040000000000820043 +:10CCE0000000000000000000000000000000002123 +:10CCF00020000400200000000000000000000000F0 +:10CD00000000200000000000000000000000000003 +:10CD100000000000001000000900020200000200F4 +:10CD200000000000009000840082000040020040EB +:10CD300080040010000200000008008400000000D1 +:10CD4000000000C000000000000000000090000093 +:10CD500000002001000000010000000000000000B1 +:10CD600000000000000000000000000000000000C3 +:10CD700002008008020088A00000000000030000FC +:10CD8000000000088200A0410000004100030000F4 +:10CD900001800188018000A1000000000000A000C7 +:10CDA0000000000000000000000300210003000854 +:10CDB0000090010300022108000000210041002131 +:10CDC000000800000000A0000008000000000000B3 +:10CDD00000080010004100000810000000100000D2 +:10CDE00000000000000082000000001000000000B1 +:10CDF0000000080000000005000000000000000026 +:10CE00000000000000000000000000000000000022 +:10CE10000000101010400404212010881008101089 +:10CE2000109010842102111020400900001003000E +:10CE30002010004008A000009002000002900010A6 +:10CE400002082000000002100088208805C00010A1 +:10CE50000084030000000000110820900000000082 +:10CE60000010000800A00308004005002100080091 +:10CE700020A02000098200080088020200000000B3 +:10CE800000090200880590029000000300110005CF +:10CE90009000020000080008000202000000840860 +:10CEA000400010109000000000004000000800004A +:10CEB0000041202100204184000083000000000385 +:10CEC00000119005000000008410082100000008F7 +:10CED00000000000000008210800014100000800D7 +:10CEE0000008000000000400080008000005000918 +:10CEF000000000000010900000001000000800007A +:10CF00000000000000000000000000000000000021 +:10CF1000000400000000091000000900200011407A +:10CF2000200000000290409011000302008800C021 +:10CF30000000000040000000080200002000000087 +:10CF40000000000020900900000000000000000028 +:10CF500000000000000000000000000010000000C1 +:10CF6000000000000000000000000000000000A021 +:10CF7000000000A00000008400000000C00000408D +:10CF800000000800000082850000C0000182C0107F +:10CF90000400820000C08290010000000140C00037 +:10CFA0000101C0000000C18300000200010282886C +:10CFB000C101C10000C0C0820000000000C110001B +:10CFC0000000000000000000000000000000000061 +:10CFD00000000001010000C0000000008400018288 +:10CFE000A0000000000000000000000000000000A1 +:10CFF00000000001000000C00000000004000184E7 +:10D00000C00000418441000084410941804141C188 +:10D0100080808910040500808000414100414185E5 +:10D020008000104180410000C183004100044003A2 +:10D030008000C1408321008080800009001102042B +:10D040008000000000000000000000000000000060 +:10D05000000000000010040000800000000000003C +:10D060004080000000000000000000000000000000 +:10D0700000000000001040000080000000000000E0 +:10D08000208080004100112000C100004141094181 +:10D09000004100418220802000002000C100A14109 +:10D0A00000C100414100214100C100004141414116 +:10D0B0000041000405C180C100040300910020412B +:10D0C0000041800800000000050000000000000092 +:10D0D0000000000000008900A00000050000000022 +:10D0E00000000000004000000500000000000000FB +:10D0F000000000000000A000A000000500000000EB +:10D100000000000000830000000100050000000195 +:10D11000000100010001108320C100000000400058 +:10D120002001000582010000000100C10000000193 +:10D1300000010085000108C10841000001C0400055 +:10D140000301008504010000000000000000000051 +:10D15000000000000000000040000340000000004C +:10D16000A00000000000000000000000000000001F +:10D170000000000000000000410003080000000063 +:10D1800040000000000000C100400000C18201001A +:10D1900000000000C18210000010000009400000E3 +:10D1A00000000000C1000000008400018940000070 +:10D1B00000000000C085040000840000C1400000A1 +:10D1C000000000000001000000000000000000005E +:10D1D0000000000000000000000000A000000000AF +:10D1E000000000000000010001000000000000003D +:10D1F00000000000000000000000004000000000EF +:10D200000000000000000100010000800021858472 +:10D21000400000000041C1A1020011C1000382854D +:10D22000000000000021C10500000080004141C154 +:10D230000000000000119183020000410041C1C1C3 +:10D2400000000000000909040000000000000000C8 +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000500040000000000B5 +:10D2700000000000000000000000000000000000AE +:10D2800000000000000000004100410084C0004197 +:10D290000008000041020041C1C103C104C10000F7 +:10D2A0000080000041410041808003C1C1C1800075 +:10D2B000800800004111000489C11190C141008023 +:10D2C0008080000004400041808040110000000088 +:10D2D0008005008300000000000000000000004105 +:10D2E000800000000000000000000000400400007A +:10D2F00080050083000000000000000000000041E5 +:10D30000800000000000000000008000094040C1D3 +:10D31000C001828900000000400184C101C1840372 +:10D3200000C0A0C000000001000140C001C185C1D3 +:10D330004000408900000000C00104410008408313 +:10D3400000C040C000000001000182400104000054 +:10D350000000040000830000000000000000000046 +:10D36000008304000000000000000000840001A011 +:10D370000000040000830000000000000000000026 +:10D38000008304000000000000000000840000850D +:10D390000000000000004842000000000000484279 +:10D3A000811200E0070048420000000000004842EF +:10D3B0000000000000004842000000000000484259 +:10D3C000811200E0070048420000000000004842CF +:10D3D000000000000000000000000000000000004D +:10D3E0000000810000E00000480000000000000094 +:10D3F000000000000000000000000000000000002D +:10D400000000810000E00000480000000000000073 +:10D4100000420000000000000000000000000000CA :10D4200000000000000000000000000000000000FC :10D4300000000000000000000000000000000000EC :10D4400000000000000000000000000000000000DC @@ -109930,210 +109930,210 @@ :10D4E000000000000000000000000000000000003C :10D4F000000000000000000000000000000000002C :10D50000000000000000000000000000000000001B -:10D51000000000000000747B00000000000000001C +:10D51000000000000000252B0000000000000000BB :10D5200000000000000000000000000000000000FB -:10D5300000000000DE2E747B0000000000000000F0 +:10D5300000000000D4A4257B0000000000000000D3 :10D5400000000000000000000000000000000000DB -:10D5500000000000DE2E0000747B000000000000D0 +:10D5500000000000DEA40000247B000000000000AA :10D5600000000000000000000000000000000000BB -:10D57000000000000000DE2E757B000000000000AF +:10D57000000000000000DE24247B0000000000000A :10D58000000000000000000000000000000000009B -:10D59000000000000000DEAE61F603400000000065 +:10D59000000000000000DE2460DE03400000000008 :10D5A00000000231E0000000000000000C4000001C -:10D5B0000000000002C06F866156034000000000BA -:10D5C00000000231E0000000000000000C400000FC -:10D5D0000000000002C06A8600006156034000009F +:10D5B0000000000002C07B0660DE034000000000A7 +:10D5C0000000023140000000000000000C4000009C +:10D5D0000000000002C07B06000061F6034000006E :10D5E000000000000231E0000000000000000C40DC -:10D5F00000000000000002C06A8660DE03400000F8 +:10D5F00000000000000002C06F8661F603400000DA :10D60000000000000231E0000000000000000C40BB -:10D6100000000000000002C07B0600000000008047 -:10D6200000800080010000802080000004000800CD -:10D63000008021001100208011000000000008007F -:10D640000080020083800490218084000000840018 -:10D6500000000500040005000100000305800080B3 -:10D660000120088021000410200405000000008033 -:10D670000000840088008200C1838910200984840E -:10D6800002A084042000040005C085101008008555 -:10D690008908018220840505000588080000000033 -:10D6A00000040004000420000004000400008000C6 -:10D6B00080000020900084008008A0000000050089 -:10D6C00080000002800002400002081000000000FC -:10D6D00000000000A000A000C000400000000410F6 -:10D6E000001004018002200080000401A00000005E -:10D6F00000020008000000C00000401040010000CF -:10D7000000210021040100008000C021400085A00C -:10D71000050808002041000204004120000000002C -:10D7200000000000000000000000000000000100F8 -:10D7300000000000020001000100010000000100E3 -:10D740000000000000000000000000000121004176 -:10D7500000000008000000000000000000080000B9 -:10D7600000000000010400000000000000080100AB -:10D7700000100005004101800008000800100104AD -:10D780000009010800020010010400040005000067 -:10D790000041000400840088000000C000410084B3 -:10D7A0000000000000000000000000000000000079 -:10D7B0000800040000000000040020001000000029 -:10D7C0000800000000000008000000840004088237 -:10D7D00000040082000000000000000000C0000003 -:10D7E0000000000800820884000800C000080382CE -:10D7F0004010008400082082080400000084008497 -:10D800002009001004040001000404C0208400105A -:10D810000000000002840305000400084103111009 -:10D8200000080000000000000008000000000000E8 -:10D830000008002100080000000000210005000091 -:10D8400001000008000300000121022100880200FD -:10D85000018800080008002100050441A1082008F3 -:10D8600000100000A000040504100021000984C07D -:10D87000000000210040000001200090000300058E -:10D880002041201000080010002182030008040835 -:10D890000208A00000044085002120020080001042 -:10D8A00008831005000000000000000000000000D8 -:10D8B0000000000000000000000000000000000068 -:10D8C000000004000000000000000400800041107F -:10D8D00080000240000000000000000080002000E6 -:10D8E00083000088000000008084808200820000A5 -:10D8F00041044184008200000088200100020800E9 -:10D900000800800880000908000000A02100000035 -:10D910008000800000000000801000100002000263 -:10D92000000800028000000000000000C0000000AD -:10D9300000000000000000000200C00000000180A4 -:10D940000000050004000000010000000000C0000D -:10D950000000090082008400000008002000200070 -:10D960000000008004080000000000000800000023 -:10D970000400080290008200C000010200002000A4 -:10D980000000410404808211C000C10290008200A6 -:10D990000400040000000400820000080400A0004D -:10D9A00082000020040000000000000000000000D1 -:10D9B00000A000000000000000000000000003A024 -:10D9C000042000C09000A100410004C000004100FC -:10D9D00000080000820003100000200421822004BF -:10D9E00089C000000020A084000000C0000403845F -:10D9F00000C0208200C14004410421C00484110001 -:10DA000080C000C004000004000000A02004200822 -:10DA100008900284031008C080820000008800A0E3 -:10DA2000008200820085008408040041000000009C -:10DA3000A0030000000000080400020000009000A5 -:10DA4000000010020400040800000000A021820869 -:10DA50000021000502408203400500000208020583 -:10DA60000205202001410000200000008221020860 -:10DA7000C000040001040804018300800040054048 -:10DA80002004200500050400080300118200201076 -:10DA9000000000080105080401408240C005022181 -:10DAA000000808410040082100100010000000009C -:10DAB00000000000000000080000800000000000DE -:10DAC0000000000080008000800000C0000000080E -:10DAD00000000000000000000000800021008084A1 -:10DAE00000002190A001200000008800000000003C -:10DAF00000000000800020010001200200040890C6 -:10DB000084008001A1080000804009000900410054 -:10DB1000000021C0008404000010020000C0214069 -:10DB2000001000C0021000020000000900A0004127 -:10DB3000C00088020008000000000000000040084B -:10DB400000000000020000001005000000A100001D -:10DB500040210009002108040010200808002010BE -:10DB6000C041C00240048241212082200004000004 -:10DB7000A0009000A01100032008882004100800D5 -:10DB8000000300800408402100048220840502056F -:10DB90000121404040058804880282054021081187 -:10DBA000001120218840000400208288002102000A +:10D6100000000000000002C06F8600000000020051 +:10D6200000000000000000000000000000000000FA +:10D630000000000040000000000004000400200082 +:10D640000100008004000080010084000000000050 +:10D650000000000000000000040000030000218022 +:10D660002000000000000000000004002000000076 +:10D67000020000000008000000102000000004006C +:10D68000200005004003050005000200040003809F +:10D6900004800080901000000400050400000000D9 +:10D6A000000000000000000000000000000000007A +:10D6B0000000000000008000008800008000800062 +:10D6C00000000400002080A00920040000000000E9 +:10D6D0000900000000000000000000000000000041 +:10D6E0000420000000000000000000000000000016 +:10D6F000000000000000000000000000000000002A +:10D700000000000020008000A000C0008000000099 +:10D710009040842000020000110080008200000080 +:10D720000000000000000000000000000000008079 +:10D730000000000000000000008000000000000069 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D760000000000000410041000000000000000037 +:10D770000000000000080000000000100000000091 +:10D780000000000000000000000000000100000098 +:10D790000000000000000000000000000000000089 +:10D7A00000000000000000840000000000000000F5 +:10D7B0000004000000C0008800000002000000001B +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000010000000000000000039 +:10D7E0000000000000100000000000C000C00000A9 +:10D7F0000000000000100000000800000008000009 +:10D8000000000000050800100010000000000800E3 +:10D8100000100008000000100088008800080008C0 +:10D8200000100000000000000000000000000000E8 +:10D8300000000000000000000008000001801180CE +:10D840000000000084000000000000000000201024 +:10D8500000000000001000000000884100410000AE +:10D86000200000000000000085000008000000000B +:10D8700000000000000800000000000000000000A0 +:10D88000000000000000080000000100000000008F +:10D890000000000000000003002100090021001129 +:10D8A0000220002000000000000000000000000036 +:10D8B0000000080000000000000000080000200434 +:10D8C000A0040000000000000000000009000000AB +:10D8D0000000110000000008008200A0000000000D +:10D8E00000100000000000002108040800104100A2 +:10D8F000000000C000000000000000100000000058 +:10D9000000000000000000000000000808080000FF +:10D910000000008800000800000000000000000077 +:10D9200000840085080100000000000000000000E5 +:10D9300000000000000000002000000000000000C7 +:10D940000000400000000000000004000000000093 +:10D950000000000000000000000000800000000047 +:10D960000000008000000000000000000000000037 +:10D970000000000000000000000000000000200087 +:10D980000000000900000000000000000800000086 +:10D990004000A00000000400000008000400040093 +:10D9A000080000000000000000000000000000006F +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000080000000000000008000020055 +:10D9D000008800000000000000000040000200007D +:10D9E0000000000000100000000000A00000000087 +:10D9F0000000000000000000000000000000000027 +:10DA0000000000000000000000840000000084000E +:10DA100000008000000020008000008480000800DA +:10DA2000800089001100210041000000000000007A +:10DA300000210000000000000000000000000800BD +:10DA40000000000020000000000000000000400076 +:10DA500001800008400500000105000500000041AC +:10DA60000041000000080000000000000000040069 +:10DA700000A0000000000000000000030000000003 +:10DA80000010000000000000000000000000000086 +:10DA9000000000000005901000020021A0210002FB +:10DAA00082080208000582000410822000000000A5 +:10DAB0000000001000000000000000000000000056 +:10DAC00021000000000080000000090000000008A4 +:10DAD0008000400200A080000084200000000000C0 +:10DAE0000000020800000000020000100000080012 +:10DAF00080000021000000840800000000080000F1 +:10DB000000000000210000000000000800080000E4 +:10DB100000000000204000000000000100000000A4 +:10DB200000010000210000080000800020A100008A +:10DB300000000000000000000000080000000000DD +:10DB400000004000000000000000000000049004FD +:10DB500040212020020000040008000400090120E8 +:10DB6000000800030002201008000011000000005F +:10DB7000000000000000000000200020002004053C +:10DB80000008000000000004000000000000000089 +:10DB90000000040000000008040800080004080851 +:10DBA000000800210221002182210821042082880E :10DBB0000000000000000000000000000000000065 -:10DBC000000000000040000020008000000000086D -:10DBD0000000000000000000A000000020022084DF -:10DBE000000008A02040800808C08483081120009D -:10DBF00000000000001000000000208400911100CF -:10DC00000010000000200040000409C000090304C7 -:10DC10000000400405A1000400C041000000000411 -:10DC2000000003000082108208014040002011081B -:10DC300000000000000001000000000000000000E3 -:10DC40000000C010900800889010020302888484AD -:10DC50009040108800408888908840C0040400C02C -:10DC6000821000000000C000000005020102081040 -:10DC70002020000041C00488C0020290030401007B -:10DC80001004A00420888900C100000400C00284A0 -:10DC9000C1A088004009000801081088820000081F -:10DCA0008402100289C1200410218882410291005F -:10DCB0008805820300000000400000000000000012 -:10DCC0000500000000008080008080000241820981 -:10DCD00084108090800011000080800080809180FE -:10DCE00000008080090021000000000090801000EA -:10DCF0008300000000008200A100008080800400FA -:10DD00000300820000000000080004000000000082 -:10DD1000840002800000808205802089800200004B -:10DD2000118000008080108411A1050400C08904C6 -:10DD30008305000480A180000000000500808010A1 -:10DD4000000000030000800080100080800011802F -:10DD500009110080C1038000009000000000200035 -:10DD60004003C082840080008000000080000240E8 -:10DD700010034140880000008000808480910000F2 -:10DD800010050521910590112000C09188C08320C5 -:10DD9000A00090C1118890800200000084114141D0 -:10DDA0009000880411801000090009009011C11131 -:10DDB000200021A1009191C10200020010010090F9 -:10DDC0000801880000008400880008000082080024 -:10DDD0008804020190400985880002028400000046 -:10DDE000C10021008384C0900800080000000800E2 -:10DDF00020001100101010000000080090C08210D8 -:10DE00000408008804C0A000108901C0918210A1FC -:10DE1000098309009083210509048382C00008005A -:10DE20000301090008010004C000201008000300DD -:10DE30000500A09009C000A0C089000000000000FB -:10DE40000100000004000000000000100088000035 -:10DE500020C01090018800910209101000000010ED -:10DE600011C0C0100084101102C0000000000000AA -:10DE7000000002028810000440030000040200A019 -:10DE80000441410200848402004101890011001014 -:10DE90000403100300908210008900C00083000872 -:10DEA000010890A0A08804400208880004080188A6 -:10DEB000A040888500880108110800C0000000000B -:10DEC0000000200000008000000040000000000072 -:10DED0000000808090100309418885C10009000975 -:10DEE0000089889080020004008880910000001161 -:10DEF000000400098082001100840408000005105D -:10DF00000010808240840003000300820211001090 -:10DF100000088021C1C0000880030010041000091F -:10DF20000089088900910010008500C100020002EC -:10DF300005C18889834100410884C0C10088000070 -:10DF400000020080000000000004000000008002C9 -:10DF5000008200800000C1102104918090400000E8 -:10DF60000011008000008080808800800010000088 -:10DF70000000000000000003808400008008000012 -:10DF8000001180830080000011894004C0008011CE -:10DF9000098004A0A10000400004000200800041AC -:10DFA000218009200200411180848040000000850A -:10DFB00041C0400808004003C12010028580901035 -:10DFC00000000003000200000000000300840000C5 -:10DFD000C00100108840100091888888020809015B -:10DFE000C000000202848800C0400409021002013F -:10DFF0000000000200C0000088C00420209004013E -:10E000000000840120214002400010C021A040C037 -:10E01000080002404005098800010220000110406C -:10E0200090010110008901C00001C04008080202EF -:10E03000A00800A0018801100101118400C1109006 -:10E04000A100008200E007000000000000E00700DF -:10E0500000000000000007000000000000E00700D2 -:10E0600000000000000007000000000000000700A2 -:10E0700042000000000000000000000000E0070077 -:10E08000000000000000000007004200000000E067 -:10E0900007004200000000E007000000000000E070 -:10E0A00007004211000000E007000012000000001D -:10E0B00007000000000000E0070000000000000072 -:10E0C00007006012000000000000000000000000D7 -:10E0D000000000003C3C3C3CE7E7E4E4FEFFC242B9 -:10E0E000FF007F763030F3F3E7E7E72466FFFCF0CC -:10E0F000F03CF0660000000000000000FFFFFEFCA6 -:10E10000FFFFFFFF00003F303F30808C838FF3F331 -:10E11000030399F0993066666666F9FD60643F3FD7 -:10E120000303FCF333F000000000F0F2FFFF66FC95 -:10E13000663C66666666000000006666F0F0FFFFFB -:10E1400093930F03F9FD00000000000000000000A1 -:10E150000000000000006666F0F02424E4E4BCBD8A -:10E160008000FF001910F3F3F3F32424E724660082 -:10E17000FCF0F03CF03C0000000000000000FEFC61 -:10E18000FEFCFF7CFF6000006F6F6060B0BCB3BF3F -:10E19000FFF00F0099F099F00F00FFF0F9FD6064B7 -:10E1A0007E7E42420FCCCC000000000000020F0F28 -:10E1B000660C663CFC0CFC0C00000000E724F0F050 -:10E1C000000093930F036064000000000000000053 +:10DBC0000000000000000000000000000000000055 +:10DBD00000008000000000000000200000000000A5 +:10DBE0001000009100000001000000000000000093 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC100000000000000000000000000020000000E4 +:10DC200000000000000000000040000080828083AF +:10DC300000200000000000000000000000000000C4 +:10DC4000000000010000000100000001840001014B +:10DC500000011008A0108488C010084110034085FE +:10DC6000C0A0000000000000000000000000000054 +:10DC7000000000001040900400A00082000000009E +:10DC80000000000000000000000000000000000094 +:10DC900000000000100000001000020000C0001191 +:10DCA00041090000100300820008009110C00082AA +:10DCB00000109010000000000000000000000000B4 +:10DCC00000000000001100000004000900410003F2 +:10DCD000411100031080C1000000800084C1A188B0 +:10DCE00000830004000000000000000000000000AD +:10DCF0000000000000008080800000000080000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000100011000000108250 +:10DD20000288C188000280080091008900888080F4 +:10DD300000800000800000000000000000000000E3 +:10DD40000000000000000000000000000000418012 +:10DD5000030040114183C100C021A08920881080A8 +:10DD60008240410288830000000020004100000042 +:10DD7000000000000000000080008011800480008E +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000800080008000000003 +:10DDA000108083009000C188808000000000800205 +:10DDB00080008010808000800000000000000000D3 +:10DDC0000000000000000000000000000000000053 +:10DDD00000C00100010101A108A082000908891109 +:10DDE000850403018404058900000000010001008E +:10DDF0000000000000000000000008000885848585 +:10DE00000884000000000000000000000000000086 +:10DE100000000000000000000000080008000800EA +:10DE2000400089C00900A00009A108021000880074 +:10DE3000C0021000020002840290000000000000F6 +:10DE400000000000000000000000000000000100D1 +:10DE50000000000041018800010140090011A0A15B +:10DE6000C01040030102888302A1000000000001ED +:10DE700000010000000000A0008200001004000467 +:10DE80000084C0A0000000000000000000000000AE +:10DE900000000000000000000000000000110089E8 +:10DEA00000020010028901A000000301080900001F +:10DEB000000308018890002084909010000000006A +:10DEC0000000000000000000000000000000000052 +:10DED00040000000000991038905200480C000C0B3 +:10DEE00080A1800980A00300852191110004000415 +:10DEF00000200041000000000000000000008080C1 +:10DF00000000000000800000000000000000000091 +:10DF10000000000000000000000000000000008879 +:10DF2000000300111109004011900210890880C0FF +:10DF300010041040804100000000008000800000BC +:10DF400000000000000000000000000000000000D1 +:10DF50000000000000002109092102000303C0099C +:10DF60008941A1800404C121C0850500851100807C +:10DF70000000000000200000000000000000000081 +:10DF8000800200210080000000000000000000006E +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000100921841180101002 +:10DFB00009211089410910008000000800808000BC +:10DFC0000000000000000000000000000000000051 +:10DFD000000000000000000001110000000000002F +:10DFE00011882089A1A088010389211085100401CE +:10DFF00000C0000000000001000000000000000060 +:10E00000000010000488000800000000000000006C +:10E010000000000000000000000000000000000000 +:10E020000000000000020002000000030011008454 +:10E030000100000101200002000082001021109068 +:10E0400010000000000000000000000000000000C0 +:10E050000000000000E000000000500000E00000B0 +:10E0600050810000000007008212500000E007000D +:10E07000000000000000000042000000000000005E +:10E0800000000000000A000007000000000000007F +:10E090000000000000000000000000000000000080 +:10E0A00000000000000000E000000000000000E0B0 +:10E0B000070042810000000007000000002100006E +:10E0C0000700000000000000000000000000000049 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000091810181000000000F000B087A +:10E0F00006060C0F000000000000000000000000F9 +:10E100000000FF00000066FFFFFFC7C7FFC7000059 +:10E1100000000000000000000000000000000000FF +:10E12000000000000000000000003C403F400000F4 +:10E1300000000303030300000000E766E766000039 +:10E140003C1C004000000000000000000000000037 +:10E1500000000000000000000000000000000000BF +:10E16000000000000000998100813F1F030709099A +:10E17000090906060003000000000000000000007E +:10E1800000000000FF0000006666FFFFC7C7FFC772 +:10E19000000000000000000000000000000000007F +:10E1A0000000000000000000000000003F403F4071 +:10E1B000000000000303030300000000E766E766B9 +:10E1C0000000FFFF00000000000000000000000051 :10E1D000000000000000000000000000000000003F :10E1E000000000000000000000000000000000002F :10E1F000000000000000000000000000000000001F @@ -110141,322 +110141,322 @@ :10E2100000000000000000000000000000000000FE :10E2200000000000000000000000000000000000EE :10E2300000000000000000000000000000000000DE -:10E240000000000000000000000000000000FFFFD0 -:10E25000FFFF0000000009096F6F4B004BFF7F7F3D -:10E260001F1F66666666B0BFFFFF90F690F690F6D9 -:10E2700090F67E3F7E7E3C3C3C3C000000004242EB -:10E2800000003EFFFFFFFFFFFFFF00001E1E1E1EDF -:10E29000998866440F0F3C3CF960FF662424E7E749 -:10E2A000990900000F0F00FF00000000930093FF8A -:10E2B000C390C399F63CF63C0606F6F6663C000FA2 -:10E2C00000FC03FF0C0CFCFC81819090000000001E -:10E2D000040004000000000018187E7E4B004BFF75 -:10E2E00070701010660F3C3C202F000090F691F7E4 -:10E2F000187E187E42034242660F666600000000E8 -:10E30000030300003E3EFFFF3E3E3EFF000000993B -:10E3100066FFFFCCFFCC0F0F3C3C99009F062424E6 -:10E32000E7E7000900000F0F00FF0CCF000093008B -:10E3300093FFFF90FF99063C063C36363636660062 -:10E34000000F02FE02FE0C0CFCFCE7E7F6F6006193 -:10E35000003F000D00000061000F000D0000A00054 -:10E3600000080090000000610009000100008061C9 -:10E37000000E009D0000A061200E004D000800610D -:10E380000006000D00010061000F000D00000000FC -:10E3900005610A0E050D00A000610E0F000D0000C2 -:10E3A00000610E0F000D000000610E0F000D000057 -:10E3B0000061000D00090001A061000E000D0000C9 -:10E3C00000612007000D000100610E0E029D000596 +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000990018188D0058 +:10E270008D00FCBD0000BD009D00000000000000FE +:10E280000000000000000000000000003C003E060E +:10E2900004060F0F00000000000000000000000056 +:10E2A000000000000000000000000000000000006E +:10E2B000FFC3F0C0666600FF3333A5A5A5A5A5C5BD +:10E2C000E7FFCFCFE0E000300000000000000000DA +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000990019106C +:10E2F0008D009900C08100008100910000000000A5 +:10E300000000000000000000000000000000FFFF0F +:10E31000FFFF0F0F0F0F00000000000000000000C3 +:10E3200000000000000000000000000000000000ED +:10E330000000FF99F09060600FFF3C005500A5A51C +:10E34000A5A500FF0F0F00000030002020200000D6 +:10E350000000000000000000000000000000006558 +:10E360000002000D000000610007C0050000006110 +:10E37000000E000D00000061000EC00900000061E9 +:10E380000006000D0000000000000000000000007A +:10E3900000000E3800000000000000000000000037 +:10E3A000000000000000000000000000000000006D +:10E3B00000610007000900000061500D000D000021 +:10E3C0000061000E000D0008000050380000000041 :10E3D000000000000000000000000000000000003D -:10E3E000000000000000000035F5F5F5A0AFA0A387 -:10E3F000000000002828EBEB0000000000000000F7 -:10E4000000000000000000000000000005F305030C -:10E41000000000000000AFAF832C0000005FF52873 -:10E42000F57D00000000DF00FF0000000000AF836A -:10E43000AF2C0F000FFFFCFFFCF000000000003CC1 -:10E440000034FFFF5500F0FCFAFAFF000F0F000048 -:10E450004505000000000000000000000000000072 -:10E460000000000000000000000035050505A0AF19 -:10E47000ACAF0000000030F330F30000000000C03B -:10E4800003C30000000050FA000000000000F5F394 -:10E49000F5030000000000005F5F431C0000000A5D -:10E4A000A028A07D00A0FFA0FF00FF00000000004A -:10E4B0005F435F1C0F280FFF0C0F0C0000000000D3 -:10E4C000FF3CFF3EFFFF5D0CF0FCF0F03C3C55557F -:10E4D00000005515000000000000000000000000D2 -:10E4E000000000000000000000000000550F553C37 -:10E4F000FCFCF5F50000000000000000000000003A -:10E50000008000000000000000000000000000008B -:10E51000F5F5C1340000000000000000000000001C -:10E520000000F0ACFFAC00000000000002000000A2 -:10E5300000005FF51C340C0CFCFC3CFFBEBE000070 -:10E540000000FFC3FFC3FCFCF505EB0B3C3C0000E7 -:10E5500050FA4141050500000000000000000000E5 -:10E560000000000000000000000000000000553C1A -:10E57000553C0C0C050500000000000000000000E8 -:10E58000000000000000000000000000000000008B -:10E5900000005F5F431C000000000000000000005E -:10E5A0000000000000AC0FAC000000000000000004 -:10E5B000000000005FF543C1FCFCFCFC00C382824C -:10E5C00000000000FFC3FAC20C0CF505EB0B0000C5 -:10E5D000141450FAEBEBAFAF040004000400040085 -:10E5E0000000000000000000000000000400000027 -:10E5F000008000000000000020002000200020001B -:10E6000088008400010084800000000001000000F8 -:10E6100000A0018004004100000320000400041059 -:10E62000008000008900030000000020C10040803D -:10E6300001000184840010802080210020800000DF -:10E6400000900000081000080010000084208500E1 -:10E6500000850400210220850110800080008000D8 -:10E66000800000000000000000000000000000002A -:10E670000000000800000000000000000000000092 -:10E68000000000000000200000100000000040001A -:10E6900000000005200280008800000000008000CB -:10E6A00083010010000004000800000000C1080001 -:10E6B00080200400020509008004000440000002DC -:10E6C0000084000800008000000005000400020132 -:10E6D0000800000400001085040240010000000052 +:10E3E0000000000000000000FDFF55553C3C3C0CC7 +:10E3F000FFC3FFC000000000AF058F0D28007D5552 +:10E4000000000000F0003C000000000000000000E0 +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E430000000000000000000F010000000008080DC +:10E4400000FF800000003000F0000000000000002D +:10E4500000000000000000000000000000000000BC +:10E46000000000000000000000007D7F55553C3C8E +:10E470003C0CFF41FF40F0F3A0A2AFAF8F8FAA008A +:10E48000FF5500000000F0003C000000000000000C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B00000000000000000000000F00040F000003C +:10E4C0008080000F820082003000F0000000000019 +:10E4D000000000000000000000000000000000003C +:10E4E000000000003F3F3F3F000000000000FAFA3C +:10E4F000686882820000000000000000C30003037F +:10E500005541554100000000AA00FF000000000036 +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB +:10E530000000000000000000000000000000055581 +:10E540005555FCFCC3C300000000000000000000A3 +:10E5500000000000000000000000000000000000BB +:10E56000000000000000FFFF0F0F00000000FEAEE3 +:10E57000FAFA68EA828200000000FFFFFDFFC30094 +:10E58000AAAA5550500000000000AA000000000098 +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C0004555555541C300000000100000000000F3 +:10E5D000000000000000000000000000000000003B +:10E5E0000000000004000000010001000100010023 +:10E5F0000100000004000000000000000000000016 +:10E6000000000000200000000000000000000000EA +:10E6100000000000000000050003000000000000F2 +:10E6200000000000000020000005000004080000B9 +:10E6300000000005820002008200000000000000CF +:10E6400000000400010084000000040000008400B9 +:10E6500000000208020084080080000000000000A2 +:10E66000000000000000000000000400040004009E +:10E670000400040000008000000000000000000012 +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C0000000000000000400000000000000000046 +:10E6D0000000000083000000000000400000000077 :10E6E000000000000000000000000000000000002A :10E6F000000000000000000000000000000000001A :10E700000000000000000000000000000000000009 :10E7100000000000000000000000000000000000F9 -:10E720000000008000000010000000000000000059 +:10E7200000000000000000000000000000000000E9 :10E7300000000000000000000000000000000000D9 -:10E7400000090000000000000000000000000000C0 -:10E7500000000000008000000000008000000000B9 -:10E7600000000000000000000000000000000000A9 -:10E770000000000000000000004000000000000059 -:10E7800000000000000000000082000000000008FF -:10E790000008008400840000000000000008000061 -:10E7A000000000820020000000880000008400407B -:10E7B000000800080008004000000010001000825F -:10E7C000008800100088000800080008008200404F -:10E7D0000040000800080004000000000020004085 -:10E7E00000000000000000000000000000210041C7 -:10E7F00000410008000000080000000000020000C6 -:10E8000000210000000000000108000000080000D6 -:10E8100000210000000000100021004100080082DB -:10E820000000000509080008000800030008400374 -:10E830000000000302100003002100412105002117 -:10E840000000000800034021408800C000020010C2 -:10E85000000000000405000400000808000900088A -:10E860000200000000A0000000A0000000820000E4 -:10E870000000000000000000002000A0000000A137 -:10E88000000800C020080008000020080000000068 -:10E8900000822002000000081108000000080000AB -:10E8A0000020000000028408110000001182008294 -:10E8B0008000008200A0C10003A00000008284A0AC -:10E8C00000080000008400A08008800921410500A4 -:10E8D0000801000041A088000885000280000310A4 -:10E8E00003C08808020000000000000000000000D3 -:10E8F000000000008200000000000000880000000E -:10E900000000000000000000400040002000200047 -:10E910000000890000800000C0000000C0009100DD -:10E920002000912000000000C080830000800800CB -:10E93000A000A00082000000000002000080000093 -:10E9400000804002820000004000000090000200B1 -:10E95000080040008880000004009000008004004F -:10E960000000040082000000000000000000000021 -:10E97000000000000000000000000000090000008E -:10E980000000000000000000000000000200000085 -:10E9900080000000200000100000030003000000C1 -:10E9A0000410800020010000000808204000000240 -:10E9B00000000800000800080040000000000020DF -:10E9C000000000040041000400900000000000006E -:10E9D0000000000000000020000000000090002067 -:10E9E00080C0000080000000000000000000000067 -:10E9F000000500000000000000080000000000000A -:10EA00000000000000000000820000100008000567 -:10EA10008200000020002000A003C0218210C0035B -:10EA2000018084000402014100000021A0030021B4 -:10EA30000810080804208209000001200420004179 -:10EA40000008C041202000044004004000410809A3 -:10EA500000050003C002002100410000200000105A -:10EA6000010300410002004100000000000000849A -:10EA70000000000000080000030000020000000881 -:10EA80000084000020100082208400C00088000064 -:10EA900011A000000000A084801000000000000011 -:10EAA0002000202000A0A0C1200000000084000061 -:10EAB0000088000000C08083000000080801800377 -:10EAC0000008200200108501084191090082000021 -:10EAD00020821102001000100000050000840310C5 -:10EAE00000842008000000080082111000000000CF -:10EAF000000000000000000500210041002100414D -:10EB000000000000000000000000000340000200C0 -:10EB10000800084182800000000040089011900524 -:10EB20000802A0110009820400092000000000046E -:10EB3000A00008004000000805000011080088003F -:10EB400020048403A0000000414140000311200480 -:10EB50000003000000110040404000410008400058 -:10EB600040210400001102100004001100400000C8 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E760000000000000000010000000100010000079 +:10E770000084000000000000000000000000000015 +:10E780000000000000000000000000000000000089 +:10E790000000000000000008000000000000000071 +:10E7A0000040000800000000000000000000000021 +:10E7B0000008000000080088004000080000000079 +:10E7C00000000008008400000000000000000000BD +:10E7D00000400008004000000000000800000008A1 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000001000000040014 +:10E8000000000021000000000000000000000000E7 +:10E8100002000010000800000000000000000000DE +:10E8200000000000000000000000000000000000E8 +:10E8300000210000000000000000000000000000B7 +:10E8400000080000000000000000000500000000BB +:10E85000000000000803000800000005000000059B +:10E8600000030000000000000000000000000000A5 +:10E870000000000000000000000000000400000094 +:10E88000800000C00000000000840084000000C080 +:10E8900000848000008400C0000000000000080028 +:10E8A0000000000000000000000800000000000060 +:10E8B0000000000000000000000000000000000058 +:10E8C00000000000000000000000000800A000841C +:10E8D00000080010000811A020A00084008200821F +:10E8E00000840002000000000000000000000000A2 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000020000000000C5 +:10E9500001000000040088000400820004000000A0 +:10E9600008000000A00000000000000000000000FF +:10E970000000000000000040000000000000000057 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000004000000000000017 +:10E9C0000000000000000000000000000000000047 +:10E9D000000004000800000000000000000000002B +:10E9E00000008000000000000000000000000000A7 +:10E9F00000000000000000000000000040000000D7 +:10EA00000000000001000000000000000000000005 +:10EA10000000000000000180000500000000000868 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA5000000000000000000000000021A0210000D4 +:10EA60000000C010010091108305000000000000AC +:10EA70000000000000000000000000000000800016 +:10EA8000000000000000040000000008000800A0D2 +:10EA90000084000000C00010200200000000000000 +:10EAA0000000000000000000200000000000000046 +:10EAB00000840000000000000000000000000000D2 +:10EAC000000000000000000000000000000800A09E +:10EAD0000008000000A00008000220A0008220A082 +:10EAE00000102100000108C0088308000000000099 +:10EAF0000000000000000000020000000000000014 +:10EB000000000000000800000000000000000021DC +:10EB100000000000000000000000000200080000EB +:10EB20000011000900410008000000000000000082 +:10EB30000000000000000000000000400000000095 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000400000008000003A6 +:10EB60000021000008050000080008050811000049 :10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000040000045 -:10EB90000000000000000004000000000000000071 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 :10EBA0000000000000000000000000000000000065 -:10EBB0004100080000000000000084000000000088 -:10EBC0000000000000000000000084000000400081 -:10EBD000000000000000000000080201000000002A -:10EBE0000000000000000000000000000000000025 -:10EBF0000404909000109008000000000000000045 -:10EC000000000000000000000100000010000000F3 -:10EC10000000000000000000C1C18204A08204A026 -:10EC200000000000C000000090040111C1008282B9 -:10EC30000000028201000004040402009000100899 -:10EC40000410A0880090C09090900401918304006B -:10EC500084880000000084000001201000200004CF -:10EC600088401010000000A084A088A001108484B7 -:10EC700002A0000080800080808000000000000072 -:10EC80000000000000000000000004000000000080 -:10EC900000000000000000000000820821910485AF -:10ECA0000021040021000000000000040884041179 -:10ECB00000000000800003000000808080008400CD -:10ECC00000808000800002800000008040418311AD -:10ECD000111000040309052185020009028000804B -:10ECE00000000000008000001180000040854020EE -:10ECF0008020004000000004008080000000000030 -:10ED000000000000000000000000000008002100DA -:10ED10000500418000000000000000008800830220 -:10ED20000889118509100204090021008009209139 -:10ED3000C003119100000900040089000080400018 -:10ED400002100500C080100010C091202180030532 -:10ED50002010104190C041000800404020210000D8 -:10ED60008000000080000000808500058000038096 -:10ED70000221A100C140020004008882900000002E -:10ED80000000000000000000000000000000010082 -:10ED90000000010001A00000000000000000891038 -:10EDA000410003C102200000000000100100A0107B -:10EDB0008403A190A0050000C0008400A00084107E -:10EDC000400002A0038283A088002140A082210489 -:10EDD000208204A1C1008208A00001000100C0112E -:10EDE00004000800020008A0880090C0881110C02C -:10EDF00004089000A1020984404000109088100887 -:10EE00000000000000000000000000000000000002 -:10EE100000000000000100010000000000000000F0 -:10EE2000008401051002C00800000001000000017C -:10EE30000440098203044089000040000010C0C063 -:10EE400010030002000200C104A011840004028823 -:10EE5000C089000940890440A0210001010084000C -:10EE60000001C0400010840485C00000000800407C -:10EE7000010802200100011140C180800080800053 -:10EE80000080000000000000000000000000000002 -:10EE90000000001100040008002000000000000035 -:10EEA0000000001008089191009000020003000487 -:10EEB0000404891020118890059100008009000544 -:10EEC0000009840200020082004000A0C0040091FA -:10EED00080110902008888889100054000400809D7 -:10EEE00003090521808000008000A18000000080CF -:10EEF00000800880000020040521114180028089E3 -:10EF00000080800000000000000000000000000001 -:10EF1000000000000080000000000002000000006F -:10EF200000000000C1A088A11080100280028000B3 -:10EF30008000000204A184054100021100000000CD -:10EF4000000400800010000000090000800580021D -:10EF5000008980808010214002854080C00341806C -:10EF60000384218004030000004000910000002081 -:10EF70000002000080000921A1850980200990007D -:10EF80001010104008000000000000000000000009 -:10EF900000000000000000880000000000010000E8 -:10EFA00000000000000008051109A0400400020450 -:10EFB00020000800000104C19104028283000000C7 -:10EFC0000088000200840000C090C010A0C00200B1 -:10EFD0000205888290401000031088080340110049 -:10EFE0000140010301100101000000040091000034 -:10EFF000040184054004A000010108109004C10030 -:10F0000000000000070000000000000000000000F9 -:10F010000000000000000000000000E00000000010 -:10F020000000000000000000000000E000008182FD -:10F030000000000000000000000000E00700500099 -:10F0400000000000000007000000000000000700B2 -:10F0500000000000000007000000000000E00700C2 -:10F060000000000000E000000000000000000700B9 -:10F070004100000000E00700500000000000070011 -:10F0800000008282BEBEAEFE3C3C000000000000DC -:10F090000000000000000000000000000000000070 -:10F0A00000000000000000000000838FB3BFF5C126 -:10F0B000F5C100000000000000004D4DC300003C01 -:10F0C0000F3F00000000000000AAFFAAFAFF0A009C -:10F0D000B2F0B2F0B4AAB4FFFF00FFD7C303FF3F02 -:10F0E00000BE41FF00000000000000000000000022 -:10F0F000FCF0030F5F0F3C3CF0F5A5FACBFBCBFB1C -:10F100003C3C00AA00C0FFFC04543C3C0000000052 -:10F1100000000000000000000000000000000000EF -:10F12000000000000000000000000000808CB0BC67 -:10F13000F5F5C5C5000A0F0A000000004D4DFF3C63 -:10F1400020202F2F00000000000000F0FFF0FA3C0C -:10F150000A3C0000FFFFB400B455FF00FF070003A6 -:10F160003C3FF0F0F0F00000000000000000000064 -:10F170000000AAAA030F0F0F3C3C005A5A0F083890 -:10F1800008383C3C55FFFFC3FD01FFBF43030000AF -:10F19000000000000000000000000000000000006F -:10F1A00000000000000000000000000000005541C9 -:10F1B0000101103838380000000000000000140081 -:10F1C000555500AC00FC0000D4D4D4D400C300C317 -:10F1D0002D2D2D2D3C3C3C3C07D7D0D7003C0028A2 -:10F1E0007D287D28FFFEFFF400000000FFFFFFFFE9 -:10F1F000FD5DFC0CFF3CFF3D3C3C0F0F1717171744 -:10F2000000000000F3F3C3C33C00FD01FCBC400060 -:10F2100000000000000000000000000000000000EE -:10F2200000000000000000000000000000000000DE -:10F23000554101013C3C3C3C000000000000000046 -:10F240001400141400FF00FF0000FFFF0000C0C006 -:10F2500082822D2D2D2D353F35300BEBE0EB002C30 -:10F26000002C7D287D28000E000400000000BEBE9A -:10F27000AAAA5D5D0C0C3C3C3D3D3C3C0F0F1717B2 -:10F28000173FDF5D8A0841714171000000080000EE -:10F29000000000000000000000000000000000006E -:10F2A000000000600006000D0000000000000000EB -:10F2B0000000806100010011000000610006000DE7 -:10F2C000000005614A0F050D00A000000061000E5E -:10F2D000000D000000610E0E000D000005610A0E19 -:10F2E000050D00A100610E0F001D00010041000787 -:10F2F000000D000000000008059000A100610E0F45 -:10F30000000D00000061400E000D00000000000034 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD00000000000000000000000000000008000B5 +:10EBE00000000000000080000000000000000000A5 +:10EBF0000000000000000000000000000000000015 +:10EC000000C000900000000000C000900000000064 +:10EC100000000000000000000000000008000000EC +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC50000000000000000000000000040090000020 +:10EC600000100000000000000000C0C000200008EC +:10EC7000081000000000000000000000000000007C +:10EC80000000008000800000000000800080000084 +:10EC900000000000000000000000000011009100D2 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD00000000000000000000000000000000080B4 +:10ECE0000000000000000000000000009180008093 +:10ECF0000080800000000000000000000000000014 +:10ED00000000000008000000850080800000000076 +:10ED10008000808000000000000000000000000073 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED50000000000000000000000000000000800033 +:10ED60000000800080008000000080020000800021 +:10ED7000000880808000000000000000000000000B +:10ED8000000000000000010000008400C0900000AE +:10ED900000008400C090000000000000000000009F +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE00008000200A000100040000200080002001D +:10EDF0000800880108A008000000000000000000D2 +:10EE0000000000000000000000000000A09000C012 +:10EE100000000000009000C00000000000000000A2 +:10EE200000010001000001000000000000000000DF +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE60000000A00000880000A008000000000000D2 +:10EE7000000040C00010820889C0000000000000AF +:10EE80000000000000000000000000000000808082 +:10EE900000800000000000800080000000000000F2 +:10EEA000000000200003001011100000000000000E +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000080800000000022 +:10EEF00000000000800000800080218000000000F1 +:10EF000000000000000000000000000080800002FF +:10EF100000000003801180090000000000000000D4 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF60000000000000000000008000000000001110 +:10EF7000000000800000000200A1800000000000EE +:10EF800000000000000000000000000000009008E9 +:10EF9000000000000001C00120000000000000008F +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE000000000000000000000000010000200000F +:10EFF00000000088004000001000101008C0100041 +:10F000000000000000000000000000000000000000 +:10F0100000210000070000000006000007000000BB +:10F020000000000000000000000000E00000000000 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F060000000000000000000000000000000070099 +:10F070000000000000000000000000000000070089 +:10F0800084000000000000000000000000000000FC +:10F0900000000000FFFF000000FF000000FF000074 +:10F0A00000FF000000000000000000000000000061 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F000F0F000000000000000000000000002002E +:10F100002B280000000000000000000000000000AC +:10F11000000000000000FFFF000000FF000000FFF3 +:10F12000000000FF000000000000000000000000E0 +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F170000000F0F000000000000000000000A0A06F +:10F18000A0A0EB280F0F000000000000000000000E +:10F19000000000000000FF000000FF000000FF0072 +:10F1A000000000FFFFFF0000000000000000000062 +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F00028280000CDFFFFFF0000000000200020B5 +:10F2000000F07F7F00F3F3F3000000000000000037 +:10F210000000000000000000FF000000FF000000F0 +:10F22000FF00000000FFFFFF0000000000000000E2 +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F270000000FF00FF000000000000000000002868 +:10F28000000000F00202A2F3F3F30000000000000F +:10F29000000000000000000000000363033E0C0DAE +:10F2A00092C0038203380C0082C0000000000000FE +:10F2B00000000061000700090000000000000010CD +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F300000000000000002008009000000000000045 :10F3100000000000000000000000000000000000ED -:10F3200000000000000000000000040000000000D9 -:10F3300000000000FFFF7F7DBAFFFFFF000000001C -:10F3400000FF00FF3F03173F50BEFABE0000000061 -:10F350000000FC000000000000003800FBFF00007F -:10F36000000000C03FFF45EFEFEFFFFF000000F09F -:10F37000FF0F8000AAAA00000000000000000000AB -:10F38000000000000000AA8EAA0FFF0A005500002E +:10F3200000000000000000000000000000000000DD +:10F330000000000000000000FFEBFFF300000000F1 +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D :10F39000000000000000000000000000000000006D -:10F3A0000000000000000000000000000400000059 -:10F3B0000000000000007F7D7F7DBABAFFFF0000E3 -:10F3C000000028EB30F30303173F5014FA14000039 -:10F3D00000000000C0000000000000000800CBFF9B -:10F3E000000000008080BFBF45C7C7C7FDFD00000B -:10F3F00030F0CF0F0000000000000000000000000F -:10F400000000000000000000AA0FAA0FFF0F005527 +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC -:10F42000000000000000000000000000FF0F8080CE -:10F430000000000000000000FF7FFF3FFCFEFFFF18 -:10F440000000000000AAFFAAFF550F000000000006 -:10F450000000000000000E000E0000000000A8FDEB -:10F46000AAFF000000003030F3F355550000FF0004 -:10F470000F0F2C8338C2F8F8F8FF000000000000DE -:10F4800000000000000000000000EB00EB00AFA057 -:10F49000303000000000000000000000000000000C -:10F4A0000000000000000000000000000000F0006C -:10F4B00080800000000000000000FF7DFF3CFCFE9B -:10F4C000FCFE0000000000ACFFAC00550F00F00097 -:10F4D000AA0000000000000002000200000000007E -:10F4E000085D0055000000002830EBF300413F3F6D -:10F4F0005555C3C3AFAFFAFA0808080F0000000063 -:10F50000000000000000000000000000E8C3E80068 -:10F51000AFA030300000000000000000000000003C -:10F5200000000000000000000000000000000000DB -:10F53000000084080400040000000000040004002F -:10F54000040084000400000000000000000900091D -:10F5500000108400000000102008001000000000CF -:10F5600084008400200020108400040900000000B2 -:10F57000001004000200001000050000040000005C -:10F5800020052000000020002008020000080408D8 -:10F590000405200820050000000000000000000015 +:10F42000000000001455145500000000000000000A +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000141414140000000000000C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000200000000000000000000000000D9 +:10F5300000000000000000000000000000000000CB +:10F54000000020000000000000000000000000009B +:10F55000000000000000000000000010000000009B +:10F56000001000002000000000000000000000006B +:10F570008200000000000000000000000000000009 +:10F580000000000020000000840084000010000043 +:10F590000000040000000000000000000000000067 :10F5A000000000000000000000000000000000005B :10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B :10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B -:10F5F0000000000000000000000000000200000009 +:10F5F000000000000000000000000000000000000B :10F6000000000000000000000000000000000000FA :10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA @@ -110465,40 +110465,40 @@ :10F6500000000000000000000000000000000000AA :10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A -:10F680000000000000000009000000090000000068 +:10F68000000000000000000000000000000000007A :10F69000000000000000000000000000000000006A -:10F6A000000000000000000000000000000000005A -:10F6B00000000000000000000000000000000084C6 -:10F6C000000800000000000800000000000000002A -:10F6D0000000000800840000000800000000000096 -:10F6E0000088008400840000000800100000001062 -:10F6F0000008000800100008000000C00008000812 -:10F70000000800080000000000840084001000C011 -:10F7100000080010000000080010001000000000A9 +:10F6A0000000000800000000000000000000000052 +:10F6B000000000000000000000000000000000004A +:10F6C0000000000800000000000000000000000032 +:10F6D000000000000000000000000000000000002A +:10F6E0000000000000880000000000000000000092 +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000080000000000000000000000000000E1 :10F7200000000000000000000000000000000000D9 :10F7300000000000000000000000000000000000C9 -:10F740000000000000000000000000000000004178 -:10F750000010000000000008000340410000000805 -:10F7600000000000A000000000050021004100088A -:10F770000005A01000100003A000000800210000F8 -:10F7800000000000000300088208A0100010000024 -:10F79000A0050800A0210000A01000210003000027 -:10F7A00000000000000000000000000800820000CF -:10F7B0000000000000000008000000000000001031 -:10F7C00000A00008000000080000000000A000A049 -:10F7D0002108000800080082008400A000A00000AA -:10F7E00000820084000803080010081008000308C5 -:10F7F00021080384008403C0000000A0000808A0C2 -:10F8000021100810000821C000000010000800C0EE -:10F810002100031041A0008400100084000000C0FB +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000800000000000000000000000081 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000001000100000000000000000000009 +:10F7E0000000000000A00000000000000000000079 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F810000000000000A00000001008C0030000006D :10F8200000000000000000000000000000000000D8 :10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 -:10F850000000000000004000000000000002200046 -:10F8600000009000400000009000A0000000000098 -:10F87000000000000000000000000000C0000009BF -:10F880000000000020000000000002000000000056 -:10F890000000000000000000000000000000000068 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000020076 +:10F890000000000004000000000000000000000064 :10F8A0000000000000000000000000000000000058 :10F8B0000000000000000000000000000000000048 :10F8C0000000000000000000000000000000000038 @@ -110508,30 +110508,30 @@ :10F9000000000000000000000000000000000000F7 :10F9100000000000000000000000000000000000E7 :10F9200000000000000000000000000000000000D7 -:10F9300000000000000000000003000000000008BC +:10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 :10F9500000000000000000000000000000000000A7 -:10F96000000000000000000000080000000300008C -:10F970000000001000410000000002000000000034 -:10F980000003000000000010000000000010000054 -:10F990000000000808000000000000000000000057 -:10F9A0000000000000000000000000080008000047 -:10F9B00000000000000000840000000000000000C3 -:10F9C000000000000010008400000010008400000F -:10F9D00000A000A0000800000000000000080000D7 -:10F9E000020000040884000000A0001000A000C075 -:10F9F00008C00000000000A0038421C0028200A013 -:10FA000003A021040010000800000084001000A0E2 -:10FA10000084000000000008000800000010000042 -:10FA20000300004002840008000000000000000005 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A000000000000000000000000000000000C097 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000800000000008400A00000BA +:10FA200000C0008400C000000000000000000000D2 :10FA300000000000000000000000000000000000C6 -:10FA400000110000000000000000000000000000A5 -:10FA500000418800000000100000000000000000CD -:10FA60000000000000000400000008000021000069 -:10FA700000029000020402000000000020080000C4 -:10FA80000000904100040021040000000000040078 -:10FA900000009000884000000400001004000000F6 -:10FAA0000000020000040000001000000000000040 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000410000000000000000000015 :10FAB0000000000000000000000000000000000046 :10FAC0000000000000000000000000000000000036 :10FAD0000000000000000000000000000000000026 @@ -110707,7 +110707,7 @@ :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B -:100590000000000000000001000000010000000059 +:1005900000000000000080010000000100000000D9 :1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B :1005C000000000000000000000000000000000002B @@ -110715,7 +110715,7 @@ :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA +:100610000000000000000000000000100000008248 :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA @@ -110730,25 +110730,25 @@ :1006D000000000000000000000000000000000001A :1006E0000000A40000000000000000000000000066 :1006F00000000000000000000000000000000000FA -:1007000000000000000000000800000000000000E1 -:100710000000000040000000000000000000000099 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 +:1007000000000000000000000200000000000000E7 +:100710000000000080000000000000000000000059 +:100720000000000000000000820000000000000047 +:100730000000002000000000000000000000000099 :1007400000000000000000000000000000000000A9 :100750000000000300000000000000000000000096 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 -:1007A0000000000000000000000000004000000009 +:1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000002000000009 +:1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 -:100820000000000000000000000000000000800048 +:1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 @@ -110756,27 +110756,27 @@ :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 -:1008A0000000000000000000010000000000000047 -:1008B00001000000000000004100000000000008EE -:1008C00001000000000000004100000000000000E6 -:1008D00011000000000000080000000000000000FF -:1008E000000800080084000800080008000800084C -:1008F000000800080008000800080084000800083C -:10090000000800080008000800080082000800082D -:10091000000800080008000800080000000800089F -:100920000008000000080008000810080008008403 -:10093000000810080084000800089008000800085B -:10094000008440080008008400089008000800089F -:100950000008C0080008000800820008000800081D -:100960000084008400000008000000000000000077 -:100970000000000000000021000000000000000056 -:10098000000000000000002100000000000800003E -:100990000000000000000003000000000000000054 -:1009A0000000000000000000000000000000000047 -:1009B000000800000000000000000000000000002F -:1009C00000090000000000210000000000000000FD -:1009D00000000009000000210005000000000000E8 -:1009E0000000000000000000000000000000000007 +:1008A0000000000000000000410000000000000007 +:1008B00041000000000000004100000000000000B6 +:1008C00011000000000000004000000000000000D7 +:1008D00040000000000000080008000000000000C8 +:1008E000000000080008000800840008000800005C +:1008F00000080008000800080008000800080008B8 +:100900000008000400840008000800080008000037 +:10091000000800080084000800080008000800081B +:10092000000800000084008400089008008400088B +:1009300000009008000800840008900800080008E3 +:100940000008C00800000000000880820008008441 +:100950000000808400080084008400840084000873 +:1009600000080084000000000000000800000021D2 +:100970000000000000000000000000210000000353 +:100980000000000000000000000000210000000046 +:10099000000000000000000800000021000000002E +:1009A0000000000000000000000300000021000023 +:1009B00000000000000000210008000000210021CC +:1009C00000000000000000030005000000080021F6 +:1009D0000000000000000000000000000000000314 +:1009E00000090000000800000000000000000000F6 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 @@ -110789,25 +110789,25 @@ :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 -:100AB0000100000000000000000000000000000035 +:100AB0000000000000000000000000000000000036 :100AC0000000000000000000000000000000000026 :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 +:100B000000000000000000000000000000080000DD :100B100000000000000000000000000000000000D5 -:100B20000000000000A00000000000000000000025 -:100B3000000040000000000000000000000800006D -:100B4000000000000000000000000000000000089D +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 -:100B6000000000000000000000080000000000007D +:100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 +:100B8000000000000000000000000000000800005D :100B90000000000000000000000000000000000055 -:100BA000000000000008000000000000000000003D -:100BB0000000000000000000000000000000000035 +:100BA0000000000000000000000000000000000045 +:100BB000000000000000000800000000000000002D :100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 +:100BD000000000000000000000000000000800000D :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 @@ -110823,15 +110823,15 @@ :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 -:100CD0000080000000000000000000000000000094 -:100CE00000000000000000000000000000210000E3 +:100CD000000000000000000000000000000800000C +:100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 :100D400000000000000000000000000000000000A3 -:100D5000000000080000000000000000000000008B +:100D50000000000000000000000000000000000093 :100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 @@ -110928,8 +110928,8 @@ :1013300000000000000000000000000000000000AD :10134000000000000000000000000000020000009B :101350000000004002000000000000400200000009 -:1013600000000040020000000000004002000000F9 -:1013700000000040020000000000004000000000EB +:1013600000000040020000000000004000000000FB +:1013700000000040000000000000004000000000ED :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D :1013A000000000000000000000000000000000003D @@ -110977,8 +110977,8 @@ :10164000000000000000000000000000000000009A :101650000000000000000000000000090000000081 :101660000000000900000000000000090000000068 -:101670000000000900000000000000090000000058 -:101680000000000900000000000000000000000051 +:101670000000000900000000000000080000000059 +:101680000000000800000000000000000000000052 :10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A @@ -110986,7 +110986,7 @@ :1016D000000000000000000000000000000000000A :1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA -:101700000000880000000000000000000000000051 +:1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 @@ -111003,37 +111003,37 @@ :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 :1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000008C0 -:101820000000000800080008000000080008000888 -:101830000008008400080084000800080008000870 -:101840000000008400080008000000080008008470 -:1018500000880000000800000008000800080000E0 -:101860000008000000080084008800000008050847 -:10187000000800000008008400000088000800083C -:101880000008000000840000000000000008008440 -:1018900000840000008800840000000000080004AC -:1018A0000000000000000000000000000021000017 -:1018B0000000000000000000000000000021000007 -:1018C00000000000000800000005000000210000EA -:1018D00000000000000800000000000000400000C0 -:1018E00000000021000000000000000000000000D7 -:1018F00000000003000000000008000000000000DD -:1019000000000000000000000003000000000000D4 -:1019100000000000000000080000000000000000BF -:1019200000080000000000000000000000000000AF +:1018100000000000000000000000000000000000C8 +:1018200000000008000000000000000800080000A0 +:101830000000008400080000008800080008000084 +:101840000000008400000000000000080008000004 +:101850000000000000040000000000080008000074 +:101860000000000000080000000000000008000860 +:101870000000000000000000000000000008000858 +:101880000000000000080000000000000008000840 +:101890000000000000000000000000000008000838 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000080000000000000000000010 +:1018D0000000000000050000000000000000000003 +:1018E00000000000000000000000000000000040B8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 -:101950000000008200000000000000000000000005 +:101950000000000000000000000000000000000087 :101960000000000000000000000000000000000077 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A00000400000000000000000000000000000F7 +:101990000000004000000000000000000000000007 +:1019A0000000000000000000000000000000000037 :1019B0000000000000000000000000000000000027 :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 :1019E00000000000000000000000000000000000F7 -:1019F000000000000000000000000000000088005F +:1019F00000000000000000000000000000000000E7 :101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 :101A200000000000000000000000000000000000B6 @@ -111048,23 +111048,23 @@ :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 -:101AE00000000000000000400000000000000000B6 +:101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 -:101B00000000000000000000004000000000000095 -:101B10000000000000000040000000000000000085 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 :101B70000000000000000000000000000000000065 -:101B80000000000000000000004000000000000015 -:101B9000000000000000000000000008000000003D -:101BA0000000000000000000000000000000000035 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA00000000000000000000040000000000000F5 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 -:101BD00000000000000000000000000000080000FD -:101BE00000000000000000000000000000000000F5 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000021000000000000D4 :101BF00000000000000000000000000000000000E5 :101C000000000000000000000000000000000000D4 :101C100000000000000000000000000000000000C4 @@ -111226,12 +111226,12 @@ :1025D00000000000000000000000000000000000FB :1025E00000000000000000000000000000000000EB :1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA +:1026000000000000000200000000000000000000C8 :1026100000000000000000000000000000000000BA -:1026200000000000000000000000000004000000A6 -:102630000000000004000000000000000400000092 -:102640000000000004000000000000002000000066 -:10265000000000002000000000000000000000005A +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A :10267000000000000000000000000000000000005A :10268000000000000000000000000000000000004A @@ -111245,22 +111245,22 @@ :1027000000000000000000000000000000000000C9 :1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 -:102740000000000000000000000000000000000089 -:10275000040000000000000000000000000000086D -:102760000000000000000008000800000000000851 -:102770000008000000000000000000000000000849 -:102780000000000000000008000800000000000831 -:102790000008000000000000000000000000000031 -:1027A0000008000000000000001000080000000009 -:1027B0000008000800000000000000000000000009 -:1027C00000100000000000000000001000000000E9 -:1027D00000080008000000000000000000000000E9 -:1027E00000000000000000000000000000000000E9 +:102730000400000000000000040000000000000091 +:102740000400000000000000040000000000000081 +:102750000000000000000000000000000008000869 +:102760000008000000000000000000000000000061 +:10277000000000000000000000000000000400084D +:1027800000080082000000000000000000000000BF +:102790000000000000000000000000000000000039 +:1027A0000008000800000000000000000000000019 +:1027B0000000000800000000000000000000000011 +:1027C00000100010000800000000000000000000E1 +:1027D00000000008000000000000000000000000F1 +:1027E00000000000000800000000000000000000E1 :1027F00000000000000000000000000000000000D9 :1028000000000000000000000000000000000000C8 :1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 +:1028200000000002000000000000000000000000A6 :102830000000000000000000000000000000000098 :102840000000000000000000000000000000000088 :102850000000000000000000000000000000000078 @@ -111276,14 +111276,14 @@ :1028F00000000000000000000000000000000000D8 :1029000000000000000000000000000000000000C7 :1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 +:10292000000000000000000000000008000000009F :102930000000000000000000000000000000000097 :102940000000000000000000000000000000000087 :102950000000000000000000000000000000000077 -:102960000400000000000000000000000000000063 +:102960000000000000000000000000000000000067 :102970000000000000000000000000000000000057 :102980000000000000000000000000000000000047 -:102990000000000000000000000000000000000037 +:1029900000000000000000A0000000000000000097 :1029A0000000000000000000000000000000000027 :1029B0000000000000000000000000000000000017 :1029C0000000000000000000000000000000000007 @@ -111304,7 +111304,7 @@ :102AB0000000000000000000000000000000000016 :102AC0000000000000000000000000000000000006 :102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 +:102AE00000000000000000000000000000000002E4 :102AF00000000000000000000000000000000000D6 :102B000000000000000000000000000000000000C5 :102B100000000000000000000000000000000000B5 @@ -111316,7 +111316,7 @@ :102B70000000000000000000000000000000000055 :102B80000000000000000000000000000000000045 :102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 +:102BA000000800000000000000000000000000001D :102BB0000000000000000000000000000000000015 :102BC0000000000000000000000000000000000005 :102BD00000000000000000000000000000000000F5 @@ -111475,15 +111475,15 @@ :10356000000000000000000000000000000000005B :10357000000000000000000000000000000000004B :10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B +:103590000000880200000000000000002000000081 :1035A000000000000000000000000000000000001B :1035B000000000000000000000000000000000000B :1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB -:1035E00000020008000000000000000000000000D1 -:1035F00000000400000000000000000000000000C7 -:1036000000020002000000000000000000000000B6 -:103610000002200000000000000000000000000088 +:1035D00000000001000000000000000200000000E8 +:1035E00000000000000000000000000000000000DB +:1035F00000020000000000000000000000000000C9 +:1036000000000000000000000000000000000000BA +:1036100000000002000000000000000000000000A8 :10362000000000000000000000000000000000009A :10363000000000000000000000000000000000008A :10364000000000000000000000000000000000007A @@ -111493,40 +111493,40 @@ :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A +:1036B00000000000200000000000000000000000EA :1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA +:1036D00000000000200800000000000000000000C2 :1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:103730000000000000080000000000000000000081 -:103740000000000000000000000000000000000079 -:103750000000000000080000000000000000000061 -:103760000000000000000000000000000000000059 -:103770000000000000000002000000000000000047 -:103780000000000000000000000400000000000035 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 +:103710000000000000000000000000080000000899 +:103720000000000000080000000000000000000091 +:1037300000080084000080000000008400000008F1 +:1037400000840084000800000000000000840000E5 +:1037500000080000000080010000000000000000E0 +:1037600000840000000000080000000000000008C5 +:103770000000000800080084000800080008000895 +:103780000008000800080084000800000008000885 +:1037900000000008000800080008000000000021E8 +:1037A00000000008000800080000000000000008F9 +:1037B0000000000000000000000000040000000005 +:1037C00000200000000500000000000000030000D1 +:1037D000000000210021000800080001000000088E +:1037E00000080000000800080000000800000008B1 +:1037F00000000021000000000000000000000000A8 +:10380000000000210000000000080000000000008F +:103810000000002100000000002100000000000066 :103820000000000000000000000000000000000098 :103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 +:1038400000000000000000000000000000840000F4 :103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 +:103860000000000000000000000000080000000050 :103870000000000000000000000000000000000048 :103880000000000000000000000000000000000038 :103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 +:1038A0000000000000000000000000000800080008 +:1038B00008000800000008000000000082008200EC +:1038C0008200820000008200000000000000000072 :1038D00000000000000000000000000000000000E8 :1038E00000000000000000000000000000000000D8 :1038F00000000000000000000000000000000000C8 @@ -111534,17 +111534,17 @@ :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 +:1039400000000000000000000000000000A000A037 +:10395000000000000000000000080008000000A0B7 +:103960000000000000A000000000000000000000B7 +:10397000000000000000000000000000000000083F :103980000000000000000000000000000000000037 :103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 +:1039A00000000000000800000000000000004000CF :1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 +:1039C00000000000000000000000200008000000CF +:1039D00000000000000000000000000300000000E4 +:1039E00000000000000000000000000800000000CF :1039F00000000000000000000000000000000000C7 :103A000000000000000000000000000000000000B6 :103A100000000000000000000000000000000000A6 @@ -111558,9 +111558,9 @@ :103A90000000000000000000000000000000000026 :103AA0000000000000000000000000000000000016 :103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 +:103AC0000000000000000800000000000000A0004E +:103AD00000000000000000000021000800000005B8 +:103AE00000000000000000000008000000000000CE :103AF00000000000000000000000000000000000C6 :103B000000000000000000000000000000000000B5 :103B100000000000000000000000000000000000A5 @@ -111573,75 +111573,75 @@ :103B80000000000000000000000000000000000035 :103B90000000000000000000000000000000000025 :103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 -:103BE00000000000000000000000000000000000D5 +:103BB000000001000000000000000000000000C044 +:103BC00000000000000000000000000100010001F2 +:103BD00000C00001000100C00011000090010002BF +:103BE00000020001100100C1000000000000000000 :103BF00000000000000000000000000000000000C5 :103C000000000000000000000000000000000000B4 :103C100000000000000000000000000000000000A4 :103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 +:103C300000000000410000000000000000410300FF +:103C40000080000000000000000000000041004172 +:103C500000410090004100410090084100090241EC +:103C6000000000800041804100830000000000004F :103C70000000000000000000000000000000000044 :103C80000000000000000000000000000000000034 :103C90000000000000000000000000000000000024 :103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 +:103CB00003000000008000008000000000002000E1 +:103CC0002000004100000000000000000041410011 +:103CD000030000000080410090000000020003008B +:103CE0001000000083004100C1000080800000003F :103CF00000000000000000000000000000000000C4 :103D000000000000000000000000000000000000B3 :103D100000000000000000000000000000000000A3 :103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 +:103D300000000100000000C00000200000000000A2 +:103D4000080010080021900002000000000000019F +:103D500001000100000000C00100C00000000000E0 +:103D6000880040C00040C1004100C10000828200C4 +:103D70000001000000000000000000000000000042 :103D80000000000000000000000000000000000033 :103D90000000000000000000000000000000000023 :103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 +:103DB000000000000000C000000000000000000043 +:103DC00000000002000000000000000000000000F1 +:103DD000000000C00001C0C100000000000100C0E0 +:103DE00010020041000100C10000000000010000BD :103DF00000000000000000000000000000000000C3 :103E000000000000000000000000000000000000B2 :103E100000000000000000000000000000000000A2 :103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 +:103E30000000000000000000800000000000000002 :103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 +:103E5000000000000080004180C10000000000411F +:103E600000C100400041004100C1000000000041CD +:103E70000041000000000000000000000000000001 :103E80000000000000000000000000000000000032 :103E90000000000000000000000000000000000022 :103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 +:103EB0000000000000000000800000C100000000C1 +:103EC00000000000000000410000000800000000A9 +:103ED000000000000000C100800080C1000041021D +:103EE000000084004100C1C10000801000004111A9 +:103EF0000000800041000000000000000000000001 :103F000000000000000000000000000000000000B1 :103F100000000000000000000000000000000000A1 :103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F70000000000000000000000000000000000041 +:103F300000000000000000000000400000C1000080 +:103F400000000000000000000091080000000000D8 +:103F50000000000000000000C1004000C0C10000DF +:103F60000100020008000100C1051000C0000000AF +:103F700001000000C000010000000000000000007F :103F80000000000000000000000000000000000031 :103F90000000000000000000000000000000000021 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 +:103FC00000420000000000004800810000E0000006 +:103FD0004843000000000000004200000000000014 +:103FE00000420000000000000000811200410700B4 +:103FF0004800000000000000000000000000000079 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 :104020000000000000000000000000000000000090 @@ -111662,34 +111662,34 @@ :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F :10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F +:10414000747B000000000000000000000000000080 +:104150000000000000000000000000000000DE2E53 +:10416000757B00000000000000000000000000005F +:104170000000000000000000000000000000DEAEB3 :10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F :1041A000000000000000000000000000000000000F :1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE +:1041C0000000615603400000000000000231E000E2 +:1041D0000000000000000C4000000000000002C0D1 +:1041E0006A8660C603000000000000000031E000A5 +:1041F0000000000000000C0000000000000000C0F3 +:104200006306000000000000000000000000000045 :10421000000000000000000000000000000000009E :10422000000000000000000000000000000000008E :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E :10425000000000000000000000000000000000005E :10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E +:1042700000000000000000400000000000000000FE +:10428000000000000001000000000000000000002D :10429000000000000000000000000000000000001E :1042A000000000000000000000000000000000000E -:1042B00000000000020000000000000000000000FC +:1042B00000000000000000000000000000000000FE :1042C00000000000000000000000000000000000EE :1042D00000000000000000000000000000000000DE :1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE +:1042F00000000000000000000001000000000000BD :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D :10432000000000000000000000000000000000008D @@ -111697,32 +111697,32 @@ :10434000000000000000000000000000000000006D :10435000000000000000000000000000000000005D :10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D +:10437000000000000000000000000000020000003B :10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD +:104390000200000000000000020000000000000019 +:1043A0000200000000000000020000000000000009 +:1043B00002000000000000000200000000000000F9 :1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C -:10442000000002000000000000000000000000008A -:10443000000002000000000000000000000000007A -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C +:1043D00000000008000000080000000000080000C5 +:1043E000000000080000000000000000000000883D +:1043F000008800080000000800000000008880001D +:10440000000000820000000000000000000000002A +:104410000000000000C000000008000000000000D4 +:1044200000880000000800000008000000080000EC +:1044300000000000000800000084000000000000F0 +:1044400000000000000800000088000000000000DC +:10445000000800080000000000000000000000004C :10446000000000000000000000000000000000004C :10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C +:104480000000000000000000000000000000000527 :10449000000000000000000000000000000000001C :1044A000000000000000000000000000000000000C :1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB +:1044C00000000000000000000000000800000000E4 +:1044D0000000000000002000200004000000000098 +:1044E0000000000000000088000000000000000044 +:1044F000000000000000000000000008008400C070 +:1045000000C0000800C0000200C000080000000059 :10451000000000000000000000000000000000009B :10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B @@ -111730,7 +111730,7 @@ :10455000000000000000000000000000000000005B :10456000000000000000000000000000000000004B :10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B +:10458000000000000000010000000000000000002A :10459000000000000000000000000000000000001B :1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB @@ -111738,7 +111738,7 @@ :1045D00000000000000000000000000000000000DB :1045E00000000000000000000000000000000000CB :1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA +:1046000000000000000000000400000000000000A6 :10461000000000000000000000000000000000009A :10462000000000000000000000000000000000008A :10463000000000000000000000000000000000007A @@ -111746,15 +111746,15 @@ :10465000000000000000000000000000000000005A :10466000000000000000000000000000000000004A :10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A +:10468000000000000100000000000000000800031E +:104690000000000000000008000000000000000012 :1046A000000000000000000000000000000000000A :1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 +:1046E0000000000000002000000011000000000099 +:1046F00000000000000000000000000000000008B2 +:1047000000000000000002000000000000000000A7 :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 :104730000000000000000000000000000000000079 @@ -111762,23 +111762,23 @@ :104750000000000000000000000000000000000059 :104760000000000000000000000000000000000049 :104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 +:1047800000000000000000000000000000000040E9 :104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 +:1047A0000000000800000000000000000000000001 :1047B00000000000000000000000000000000000F9 :1047C00000000000000000000000000000000000E9 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 :1047F00000000000000000000000000000000000B9 :1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 +:104810000001000000000000000000000000000097 :104820000000000000000000000000000000000088 :104830000000000000000000000000000000000078 :104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 +:104850000000000010000000000000000000000048 :104860000000000000000000000000000000000048 :104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 +:104880000000000000000000000000000000009098 :104890000000000000000000000000000000000018 :1048A0000000000000000000000000000000000008 :1048B00000000000000000000000000000000000F8 @@ -111787,7 +111787,7 @@ :1048E00000000000000000000000000000000000C8 :1048F00000000000000000000000000000000000B8 :1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 +:104910000080000000000000000000000000000017 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 :104940000000000000000000000000000000000067 @@ -111795,7 +111795,7 @@ :104960000000000000000000000000000000000047 :104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 +:104990000000000000000080000000000000000097 :1049A0000000000000000000000000000000000007 :1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 @@ -111803,7 +111803,7 @@ :1049E00000000000000000000000000000000000C7 :1049F00000000000000000000000000000000000B7 :104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 +:104A10000000000000020000001000000000000084 :104A20000000000000000000000000000000000086 :104A30000000000000000000000000000000000076 :104A40000000000000000000000000000000000066 @@ -111811,7 +111811,7 @@ :104A60000000000000000000000000000000000046 :104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 +:104A90000000000001000000829000000000000003 :104AA0000000000000000000000000000000000006 :104AB00000000000000000000000000000000000F6 :104AC00000000000000000000000000000000000E6 @@ -111819,7 +111819,7 @@ :104AE00000000000000000000000000000000000C6 :104AF00000000000000000000000000000000000B6 :104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 +:104B1000000000000000080000008080000000008D :104B20000000000000000000000000000000000085 :104B30000000000000000000000000000000000075 :104B40000000000000000000000000000000000065 @@ -111827,7 +111827,7 @@ :104B60000000000000000000000000000000000045 :104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 +:104B90000000000000000000001180110000000073 :104BA0000000000000000000000000000000000005 :104BB00000000000000000000000000000000000F5 :104BC00000000000000000000000000000000000E5 @@ -111835,7 +111835,7 @@ :104BE00000000000000000000000000000000000C5 :104BF00000000000000000000000000000000000B5 :104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 +:104C100000000000000000000000000120000088EB :104C20000000000000000000000000000000000084 :104C30000000000000000000000000000000000074 :104C40000000000000000000000000000000000064 @@ -111844,15 +111844,15 @@ :104C70000000000000000000000000000000000034 :104C80000000000000000000000000000000000024 :104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 +:104CA00007000000000000000000000000000000FD :104CB00000000000000000000000000000000000F4 :104CC00000000000000000000000000000000000E4 :104CD00000000000000000000000000000000000D4 :104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 :104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 +:104D1000000000000000000000000000000000FF94 +:104D2000000000FF00000000000000000000000084 :104D30000000000000000000000000000000000073 :104D40000000000000000000000000000000000063 :104D50000000000000000000000000000000000053 @@ -111860,7 +111860,7 @@ :104D70000000000000000000000000000000000033 :104D80000000000000000000000000000000000023 :104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 +:104DA00000FF000000FF0000000000000000000005 :104DB00000000000000000000000000000000000F3 :104DC00000000000000000000000000000000000E3 :104DD00000000000000000000000000000000000D3 @@ -111868,7 +111868,7 @@ :104DF00000000000000000000000000000000000B3 :104E000000000000000000000000000000000000A2 :104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 +:104E200000000000FF000000FFFF00000000000085 :104E30000000000000000000000000000000000072 :104E40000000000000000000000000000000000062 :104E50000000000000000000000000000000000052 @@ -111876,7 +111876,7 @@ :104E70000000000000000000000000000000000032 :104E80000000000000000000000000000000000022 :104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 +:104EA000000000000000FF00000000000000000003 :104EB00000000000000000000000000000000000F2 :104EC00000000000000000000000000000000000E2 :104ED00000000000000000000000000000000000D2 @@ -111884,7 +111884,7 @@ :104EF00000000000000000000000000000000000B2 :104F000000000000000000000000000000000000A1 :104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 +:104F200000000000000015002A00054000A8000055 :104F30000000000000000000000000000000000071 :104F40000000000000000000000000000000000061 :104F50000000000000000000000000000000000051 @@ -111922,15 +111922,15 @@ :10515000000000000000000000000000000000004F :10516000000000000000000000000000000000003F :10517000000000000000000000000000000000002F -:10518000000000000000C00000000000000000005F -:10519000000000000000000000000000000000000F -:1051A00000000000000020000000000000000000DF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000002000000000000000BF -:1051D00000000000000000000000000000000000CF -:1051E000000000000000000020000000000000009F -:1051F00000000000000000000000000000000000AF -:10520000000200000000000000000000000000009C +:10518000000000000000000000000000000000001F +:1051900000000000200000000000000000000000EF +:1051A00000000000000000000000000000000000FF +:1051B00000000000200000000000000000000000CF +:1051C00000020000000000000000000000000000DD +:1051D00000000000000020000000000000000000AF +:1051E00000000000000000000000000000000000BF +:1051F000000040000000200000000000000000004F +:10520000000000000000000000000000000000009E :10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E :10523000000000000000000000000000000000006E @@ -111941,32 +111941,32 @@ :10528000000000000000000000000000000000001E :10529000000000000000000000000000000000000E :1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE +:1052B00000000010000000000000000000000000DE :1052C00000000000000000000000000000000000DE :1052D00000000000000000000000000000000000CE :1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D -:10531000000000000000000000000000000000008D +:1052F000000000000200000000000000002000008C +:10530000000000000280000000000000000000001B +:105310000000000800000000000000000000000085 :10532000000000000000000000000000000000007D -:10533000000000000000000000000000000000006D +:1053300000000082000000000000000000000000EB :10534000000000000000000000000000000000005D :10535000000000000000000000000000000000004D -:10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED +:10536000000800000000000000080000000000002D +:1053700000000000000080000000000000000001AC +:105380000088000000008004000000000000000011 +:105390000000000004000000400084000400400001 +:1053A00000000000000000000000100000000000ED +:1053B00000000000000020000000000000000000CD :1053C00000000000000000000000000000000000DD :1053D00000000000000000000000000000000000CD :1053E00000000000000000000000000000000000BD :1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C +:105400000040000400090004000900000000000042 +:10541000000000000000000000200020000000004C +:105420000004000000000000000000000000000078 :10543000000000000000000000000000000000006C -:10544000000000000000000000000000000000005C +:105440000000000000000000000000000008000054 :10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C :10547000000000000000000000000000000000002C @@ -111976,41 +111976,41 @@ :1054B00000000000000000000000000000000000EC :1054C00000000000000000000000000000000000DC :1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B +:1054E00000000000000000000000000000080000B4 +:1054F0000000000000000004004000000010002038 +:105500000000000000000004000000000000000097 :10551000000000000000000000000000000000008B :10552000000000000000000000000000000000007B :10553000000000000000000000000000000000006B :10554000000000000000000000000000000000005B :10555000000000000000000000000000000000004B :10556000000000000000000000000000000000003B -:10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B +:105570000000000000000000000100010000000128 +:105580000001000000000000000100000000000019 :10559000000000000000000000000000000000000B :1055A00000000000000000000000000000000000FB :1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB +:1055C00000000000000000000008000000000000D3 :1055D00000000000000000000000000000000000CB :1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000000000AB -:10560000000000000000000000000000000000009A +:1055F000000000000000000000000000200020006B +:105600000000840200201003840400110404000040 :10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A +:10562000000000000000002000000000002000003A :10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A +:105640000000000000820000008400000000000054 :10565000000000000000000000000000000000004A :10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:10568000000000000000000000000000000000001A +:1056700000000000000000000000000000008000AA +:105680008000000000000001000000000000000198 :10569000000000000000000000000000000000000A :1056A00000000000000000000000000000000000FA :1056B00000000000000000000000000000000000EA :1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA +:1056D00000000002000000000000000000000000C8 :1056E00000000000000000000000000000000000BA :1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 +:105700000000000001000000C003040000000000D1 :105710000000000000000000000000000000000089 :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 @@ -112018,7 +112018,7 @@ :105750000000000000000000000000000000000049 :105760000000000000000000000000000000000039 :105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 +:105780000000000000002000000000008000000079 :105790000000000000000000000000000000000009 :1057A00000000000000000000000000000000000F9 :1057B00000000000000000000000000000000000E9 @@ -112026,89 +112026,89 @@ :1057D00000000000000000000000000000000000C9 :1057E00000000000000000000000000000000000B9 :1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 +:1058000000000141011010080010001000900090ED +:10581000109001092040902000A10000000000002D :105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 :105840000000000000000000000000000000000058 :105850000000000000000000000000000000000048 :105860000000000000000000000000000000000038 :105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 +:10588000000000001190108880410082000000801C +:1058900000000000110800A0004100080000000006 :1058A00000000000000000000000000000000000F8 :1058B00000000000000000000000000000000000E8 :1058C00000000000000000000000000000000000D8 :1058D00000000000000000000000000000000000C8 :1058E00000000000000000000000000000000000B8 :1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 +:1059000000000000000008000911110280100000D2 +:105910000000008080000000080511112003000035 :105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 :105940000000000000000000000000000000000057 :105950000000000000000000000000000000000047 :105960000000000000000000000000000000000037 :105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 +:105980000000000000000000030008022110C00118 +:105990002000100000849020008801080109000107 :1059A00000000000000000000000000000000000F7 :1059B00000000000000000000000000000000000E7 :1059C00000000000000000000000000000000000D7 :1059D00000000000000000000000000000000000C7 :1059E00000000000000000000000000000000000B7 :1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 +:105A00000000000000000000000010000101000084 +:105A10001001009000409090889040010000040028 +:105A200082010000000000000000000000000000F3 :105A30000000000000000000000000000000000066 :105A40000000000000000000000000000000000056 :105A50000000000000000000000000000000000046 :105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000000000000F6 +:105A800000000000000000000000000000080909FC +:105A900000008011000000808000000080080320CA +:105AA00080038011000000000000000000000000E2 :105AB00000000000000000000000000000000000E6 :105AC00000000000000000000000000000000000D6 :105AD00000000000000000000000000000000000C6 :105AE00000000000000000000000000000000000B6 :105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 +:105B0000000000000000000000000000000008008D +:105B100009090200830380000000000000008800E3 +:105B200011080800802000000000000000000000B4 :105B30000000000000000000000000000000000065 :105B40000000000000000000000000000000000055 :105B50000000000000000000000000000000000045 :105B60000000000000000000000000000000000035 :105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 +:105B900020080389100802019000909090909000D6 +:105BA00003208901900002000000000000000000B6 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 :105BD00000000000000000000000000000000000C5 :105BE00000000000000000000000000000000000B5 :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 +:105C10000000000000E0000000000000000007009D +:105C20000000000000E00000000000000000000094 :105C30000000000000000000000000000000000064 :105C40000000000000000000000000000000000054 :105C50000000000000000000000000000000000044 :105C60000000000000000000000000000000000034 :105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 +:105C900000000000F066F066000000003F6F30601A +:105CA000FF3CF0F0F3E730E70000000000000000E8 :105CB00000000000000000000000000000000000E4 :105CC00000000000000000000000000000000000D4 :105CD00000000000000000000000000000000000C4 :105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 :105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 +:105D1000000000000000FF3C003C000000003F6F5E +:105D20003060003CF0F0F32430240000000000005C :105D30000000000000000000000000000000000063 :105D40000000000000000000000000000000000053 :105D50000000000000000000000000000000000043 @@ -112123,89 +112123,89 @@ :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 :105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 +:105E100000000000000000000000FF0F3C66810051 +:105E2000180020E32CEF1E1E1E1E6F6F187E000050 :105E30000000000000000000000000000000000062 :105E40000000000000000000000000000000000052 :105E50000000000000000000000000000000000042 :105E60000000000000000000000000000000000032 :105E70000000000000000000000000000000000022 :105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA00000000000000000000000000000000000F2 +:105E9000000000000000000000000000000F3C6651 +:105EA0000100080020E32CEF0000FFFF0909187E25 :105EB00000000000000000000000000000000000E2 :105EC00000000000000000000000000000000000D2 :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 :105EF00000000000000000000000000000000000A2 :105F00000000000000000000000000000000000091 -:105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000000061 +:105F10000000000000000000000000000000006120 +:105F200030000001000500000000000000000061DA +:105F30003000000100000000000000000000000030 :105F40000000000000000000000000000000000051 :105F50000000000000000000000000000000000041 :105F60000000000000000000000000000000000031 :105F70000000000000000000000000000000000021 :105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 +:105FA0000F3CFF3CE0E0EFEF0000000000000000CD +:105FB0000F0FFF00202CE3EF0000000000000000A6 :105FC00000000000000000000000000000000000D1 :105FD00000000000000000000000000000000000C1 :105FE00000000000000000000000000000000000B1 :105FF00000000000000000000000000000000000A1 :106000000000000000000000000000000000000090 :106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 +:1060200000000F3C003C20202F2F0000000000004B +:1060300000005555FF00202CE3EF00000000000099 :106040000000000000000000000000000000000050 :106050000000000000000000000000000000000040 :106060000000000000000000000000000000000030 :106070000000000000000000000000000000000020 :106080000000000000000000000000000000000010 :106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000000000000E0 +:1060A000000000001E5F1E0AA0F5A0F50000000021 +:1060B000000000003C550F0FA0AFA0AF0000000093 :1060C00000000000000000000000000000000000D0 :1060D00000000000000000000000000000000000C0 :1060E00000000000000000000000000000000000B0 :1060F00000000000000000000000000000000000A0 :10610000000000000000000000000000000000008F :10611000000000000000000000000000000000007F -:10612000000000000000000000000000000000006F -:10613000000000000000000000000000000000005F -:10614000000000000000000000000000200000002F -:10615000000000000000000000000000200000001F -:10616000000000000000000000000000200000000F -:1061700000000000000000000000000020000000FF -:1061800000000000000000000000000000002000EF -:1061900000000000000000000000000000002000DF -:1061A00000000000000004000000000000002000CB -:1061B00000000000000004000000000000002000BB +:106120000000000000001E5F1E0A287D287D000080 +:106130000000000000003C550F0F000FF0FF0000B2 +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000010000000000000000000EF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF :1061C00000000000000000000000000000000000CF :1061D00000000000000000000000000000000000BF :1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F +:1061F000000200000000000000000000000000009D :10620000000000000000000000000000000000008E :10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E +:10622000000000000000000000001100000000005D :10623000000000000000000000000000000000005E :10624000000000000000000000000000000000004E :10625000000000000000000000000000000000003E :10626000000000000000000000000000000000002E :10627000000000000000000000000000000000001E :10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000020000000000DC +:1062900000000000000000000000020000000000FC +:1062A00000000200000000000000020000000000EA +:1062B00000000200000000000000000000000000DC :1062C00000000000000000000000000000000000CE :1062D00000000000000000000000000000000000BE :1062E00000000000000000000000000000000000AE :1062F000000000000000000000000000000000009E :10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D +:106310000000000000000000000000080000000075 :10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D +:10633000000000000000000000000010000000004D :10634000000000000000000000000000000000004D :10635000000000000000000000000000000000003D :10636000000000000000000000000000000000002D @@ -112215,14 +112215,14 @@ :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD +:1063D00000000400000000000000000000000000B9 :1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000000000000009D +:1063F0000000000000000000000000000008000095 :10640000000000000000000000000000000000008C :10641000000000000000000000000000000000007C -:10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C +:10642000000000000000000000000000110020003B +:106430000000050000000000050000880502118230 +:106440000890208800000088000000000000000084 :10645000000000000000000000000000000000003C :10646000000000000000000000000000000000002C :10647000000000000000000000000000000000001C @@ -112237,8 +112237,8 @@ :10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B -:10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B +:1065300000000000000000000000008800000000D3 +:106540000000000008000000000000000000000043 :10655000000000000000000000000000000000003B :10656000000000000000000000000000000000002B :10657000000000000000000000000000000000001B @@ -112246,16 +112246,16 @@ :1065900000000000000000000000000000000000FB :1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB -:1065C00000000000000000000000000000000000CB +:1065C00000000000000000000000001100000000BA :1065D00000000000000000000000000000000000BB :1065E00000000000000000000000000000000000AB :1065F000000000000000000000000000000000009B :10660000000000000000000000000000000000008A :10661000000000000000000000000000000000007A :10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A -:10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A +:1066300000000090000000000000050000000902BA +:10664000050000900500050008002040110211041B +:106650000900000000000000000000000000000031 :10666000000000000000000000000000000000002A :10667000000000000000000000000000000000001A :10668000000000000000000000000000000000000A @@ -112270,7 +112270,7 @@ :106710000000000000000000000000000000000079 :106720000000000000000000000000000000000069 :106730000000000000000000000000000000000059 -:106740000000000000000000000000000000000049 +:106740000000050000000000000000000000000044 :106750000000000000000000000000000000000039 :106760000000000000000000000000000000000029 :106770000000000000000000000000000000000019 @@ -112368,438 +112368,438 @@ :106D30000000000000000000000000000000000053 :106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 +:106D60000000000000000000000000000000200003 +:106D700000000000200000000000000000000000F3 +:106D800000000000000000000000000000002000E3 +:106D900000000000200000000000000000000000D3 +:106DA00000000000000000000000000000000002E1 +:106DB0002000000000002000000000000000000093 :106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 +:106DD00001000000010000000000000000000000B1 :106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 +:106DF0000002000000000000000000000000000091 +:106E00000000100000000000000000000000000072 +:106E10000000000000000002000000000000000070 :106E20000000000000000000000000000000000062 -:106E3000000000000000000000000000000000044E +:106E3000000000000000000000040000000000004E :106E4000000000000000000000000000000000043E -:106E5000000000000000000000000000000000042E -:106E6000000400000000000000000000000000041A -:106E70000000000000000000000000000000000012 +:106E5000000010000000040000000000000000001E +:106E60000000000000000000000000000000000022 +:106E7000000400000000000000000000000000000E :106E80000000000000000000000000000000000002 :106E900000000000000000000000000000000000F2 :106EA00000000000000000000000000000000000E2 :106EB00000000000000000000000000000000000D2 :106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF000000000000000000000000000000000088A -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000869 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F4000000400000000000000000000000000003D -:106F50000000000000000000000000000000000031 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 +:106ED0000000008000000000000000000000000032 +:106EE0000000000000000000000500400000000558 +:106EF000000000A0000020000000000800000000CA +:106F00000000000800000000000000000000000079 +:106F1000000002080000000000000008000000005F +:106F20000000000800000000000000000000000059 +:106F30000000000800000000400000000008000001 +:106F40000000000000080000000000000000000039 +:106F50000000000000200000000000000008000009 +:106F60000000000000080000000000000001000018 +:106F7000000000000005000000000000000000000C +:106F800000000000000004000000000004000400F5 :106F900000000000000000000000000000000000F1 :106FA00000000000000000000000000000000000E1 :106FB00000000000000000000000000000000000D1 :106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 +:106FD00000000000000000000000000001000000B0 +:106FE00000008400210084800000000000030000F5 +:106FF00040029080200020020000000000000000FD :107000000000000000000000000000000000000080 :107010000000000000000000000000000000000070 :107020000000000000000000000000000000000060 :107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 +:107050000000000000000000000009000000200007 +:10706000050000000582900000040000000000A060 +:10707000000000000004800000020000000000008A :107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 :1070A00000000000000000000000000000000000E0 :1070B00000000000000000000000000000000000D0 :1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 +:1070D00000000000000000000000000008000000A8 +:1070E0008441849000800104050501008200C000F5 +:1070F00000000080C0000000000000000000000050 :10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F +:10711000000000000000000000000010000000005F :10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F +:10713000000000000000000000000040000000000F :10714000000000000000000000000000000000003F :10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F +:10716000100000000820000204009000040003A0AA +:107170002100108200040000000041000000000017 :1071800000000000000000000000000000000000FF :1071900000000000000000000000000000000000EF :1071A00000000000000000000000000000000000DF :1071B00000000000000000000000000000000000CF :1071C00000000000000000000000000000000000BF :1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F +:1071E00004002080840008042000C000C002C021E8 +:1071F0008221A08084801000C0202121C080000056 :10720000000000000000000000000000000000007E :10721000000000000000000000000000000000006E :10722000000000000000000000000000000000005E :10723000000000000000000000000000000000004E :10724000000000000000000000000000000000003E :10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E -:1072800000000000000000000000000000000000FE +:107260000000850000200000000100004100000037 +:1072700000004100000400040000000104A02020E0 +:1072800020020000000000000000000000000000DC :1072900000000000000000000000000000000000EE :1072A00000000000000000000000000000000000DE :1072B00000000000000000000000000000000000CE :1072C00000000000000000000000000000000000BE :1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D +:1072E0000000000008000000000084002080848965 +:1072F00000000004000000000021820000040021C2 +:107300000000C002000000000000000000000000BB :10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D :10733000000000000000000000000000000000004D :10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD +:1073500000000000000000000000000000000082AB +:1073600000000000200808000000000000002120AC +:1073700005040500000000A000000000000000005F +:1073800000000300000000000000000000000000FA :1073900000000000000000000000000000000000ED :1073A00000000000000000000000000000000000DD :1073B00000000000000000000000000000000000CD :1073C00000000000000000000000000000000000BD :1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D -:10740000000000000000000000000000000000007C +:1073E000000000000000000021881090002000082C +:1073F00000012190008382840109042020880090EC +:10740000020900900040821000000000000000000F :10741000000000000000000000000000000000006C :10742000000000000000000000000000000000005C :10743000000000000000000000000000000000004C :10744000000000000000000000000000000000003C :10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C -:1074800000000000000000000000000000000000FC +:10746000000000000000000000001100218000006A +:107470000080054110A000888020119189850010AE +:107480000002839121A10089000500000000000096 :1074900000000000000000000000000000000000EC :1074A00000000000000000000000000000000000DC :1074B00000000000000000000000000000000000CC :1074C00000000000000000000000000000000000BC :1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C -:10750000000000000000000000000000000000007B +:1074E000000000000000000000000000004109084A +:1074F00080908080118083009191830302800541F8 +:1075000011880903C191A121891182100000000096 :10751000000000000000000000000000000000006B :10752000000000000000000000000000000000005B :10753000000000000000000000000000000000004B :10754000000000000000000000000000000000003B :10755000000000000000000000000000000000002B -:10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB +:107560000000000000000000000000000088900102 +:10757000890184830890080240000940910100407D +:107580000091012100010803020040019101000067 :1075900000000000000000000000000000000000EB :1075A00000000000000000000000000000000000DB :1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB :1075D00000000000000000000000000000000000AB :1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B -:10760000000000000000000000000000000000007A +:1075F0000088082000901108080300020091888587 +:1076000084000000010008000008000010909011A4 :10761000000000000000000000000000000000006A :10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA +:107670000000000080800080C180002111A00985E9 +:10768000021100000005050340020083100200897A +:1076900000110000000000000000000000000000D9 :1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA :1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A -:1076F000000000000000000000000000000000008A -:107700000000000000000000000000000000000079 -:107710000000000000000000000000000000000069 +:1076F00000000000801100110000800021911100A5 +:10770000800005008000C01103000202C1111100B9 +:107710008900801000000000000000000000000050 :107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 :107740000000000000000000000000000000000039 :107750000000000000000000000000000000000029 :107760000000000000000000000000000000000019 -:107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 -:1077900000000000000000000000000000000000E9 +:10777000000000000000900000012002080021A18C +:1077800011084088840004001001890008000801E5 +:107790001102400004000000000000000000000092 :1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 :1077D00000000000000000000000000000000000A9 :1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 -:107810000000000000000000000000000000000068 +:1077F0000000000007000000000000E00700818298 +:10780000000000E007000000000000E00000600051 +:10781000000000E007000000000000000000000081 :107820000000000000000000000000000000000058 :107830000000000000000000000000000000000048 :107840000000000000000000000000000000000038 :107850000000000000000000000000000000000028 :107860000000000000000000000000000000000018 -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000000E8 +:10787000000000000000000000002828EBEB00FFE3 +:10788000B2B2E8E8C0FC00FF3C3CC8F8CBFB00000B +:107890000000F0F000FF14D73CFF000000000000E3 :1078A00000000000000000000000000000000000D8 :1078B00000000000000000000000000000000000C8 :1078C00000000000000000000000000000000000B8 :1078D00000000000000000000000000000000000A8 :1078E0000000000000000000000000000000000098 -:1078F0000000000000000000000000000000000088 -:107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 +:1078F0000000000000000000000000003030F3F342 +:1079000000FFB2B2E8E8C0FC00FFF0F008380B3B23 +:1079100000000000F0F03C3C00C328EB0000000039 :107920000000000000000000000000000000000057 :107930000000000000000000000000000000000047 :107940000000000000000000000000000000000037 :107950000000000000000000000000000000000027 :107960000000000000000000000000000000000017 -:107970000000000000000000000000000000000007 -:1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 +:107970000000000000000000000000000000D7141C +:10798000CF0C3F3FFF00F734F734FFBF00A0BF1F0D +:10799000BA1A000000005C5CFF00D7CF140C000096 :1079A00000000000000000000000000000000000D7 :1079B00000000000000000000000000000000000C7 :1079C00000000000000000000000000000000000B7 :1079D00000000000000000000000000000000000A7 :1079E0000000000000000000000000000000000097 :1079F0000000000000000000000000000000000087 -:107A00000000000000000000000000000000000076 -:107A10000000000000000000000000000000000066 +:107A0000D714CF0C3030FF00C704C704FFFF0000BD +:107A1000B515B010000000005C5CFF00D7CF140C5F :107A20000000000000000000000000000000000056 :107A30000000000000000000000000000000000046 :107A40000000000000000000000000000000000036 :107A50000000000000000000000000000000000026 :107A60000000000000000000000000000000000016 :107A70000000000000000000000000000000000006 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 +:107A800000A000600006000C00000061000400017E +:107A900000000061300000010000006100000001F2 :107AA00000000000000000000000000000000000D6 :107AB00000000000000000000000000000000000C6 :107AC00000000000000000000000000000000000B6 :107AD00000000000000000000000000000000000A6 :107AE0000000000000000000000000000000000096 :107AF0000000000000000000000000000000000086 -:107B00000000000000000000000000000000000075 -:107B10000000000000000000000000000000000065 -:107B20000000000000000000000000000000000055 +:107B00000000000000000000FFFF00005555FF00CE +:107B10000C3CCFFF1717171700FFFAFAFF0FFA0AEE +:107B200000F0FFF000000000000000000000000076 :107B30000000000000000000000000000000000045 :107B40000000000000000000000000000000000035 :107B50000000000000000000000000000000000025 :107B60000000000000000000000000000000000015 :107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000000D5 +:107B800000000000000000000000000000003C3C7D +:107B9000FF000030C3F33F033F0300FF0A0AF5056F +:107BA000F000003CFF3C000000000000000000006E :107BB00000000000000000000000000000000000C5 :107BC00000000000000000000000000000000000B5 :107BD00000000000000000000000000000000000A5 :107BE0000000000000000000000000000000000095 :107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 -:107C10000000000000000000000000000000000064 -:107C20000000000000000000000000000000000054 +:107C0000000000000000000000000000F0F0000094 +:107C100050100A08F0F03C3CCFFF0C3C20752A7F46 +:107C2000F5FC050C3CA03CAF00000000000000008B :107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 :107C50000000000000000000000000000000000024 :107C60000000000000000000000000000000000014 :107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD00000000000000000000000000000000000A4 -:107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 +:107C80000000000000000000000000000000F0F014 +:107C900000000000000000FF00FFCFC30C002075B3 +:107CA0002A7FF5FC050C3CA03CAF00000000000062 +:107CB00000000000200000000000000000000000A4 +:107CC00000000000000004000000000000001000A0 +:107CD0000000040020000000000000000000000080 +:107CE0000000A00000002000400000030000000091 +:107CF0000000000000002000000002000000000062 +:107D00000000000000000000A00020000000400073 +:107D1000000004000000200000002000000000001F :107D20000000000000000000000000000000000053 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 -:107D50000000000000000000000000000000000023 +:107D30000000000000000002000000000000000041 +:107D400000000000000000008000000000000000B3 +:107D500000000000800000000000000000000000A3 :107D60000000000000000000000000000000000013 :107D70000000000000000000000000000000000003 :107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000000000E3 +:107D900080000000800000000000000000000000E3 :107DA00000000000000000000000000000000000D3 -:107DB00000000000000000000000000000000000C3 -:107DC00000000000000000000000000000000000B3 -:107DD00000000000000000000000000000000000A3 -:107DE0000000000000000000000000000000000093 +:107DB00000000000000000000000000000000100C2 +:107DC00000000000000000000000000001000000B2 +:107DD0000000000000000020000000000000000083 +:107DE0000000004000000000000000000000000053 :107DF0000000000000000000000000000000000083 :107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 -:107E30000008000800080008000000000000000022 -:107E4000000000080000000000080008000800080A -:107E50000008000800080008000000000000000002 -:107E600000000008000000000008000800080008EA -:107E700000000008000800040004000000000000EA -:107E800000000000000800000000000800080004D6 -:107E900000040004000400000000000000000000D6 -:107EA00000000000000800000000000800080000BA -:107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 +:107E1000002000000000000000000000000004102E +:107E200000000000000004100000000000000040FE +:107E300000000000000000840000000000000000BE +:107E400004000000000000880000000000000400A2 +:107E50000000000000000000000100000000000021 +:107E6000000000000000008800000000000000008A +:107E70000000000000000000020000000000000000 +:107E800000000000000000000200000000000000F0 +:107E900002000001000000000200000000000000DD +:107EA00082010000000000008001000000000000CE +:107EB00000010000000000000000000000000000C1 +:107EC00000000000000000000008000000000000AA :107ED00000000000000000000000000000000000A2 :107EE0000000000000000000000000000000000092 :107EF0000000000000000000000000000000000082 :107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 -:107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 +:107F1000000000000000010001000000000000025D +:107F200000000000002100000000002100040021EA +:107F3000000390210000000000000000000000008D :107F40000000000000000000000000000000000031 :107F50000000000000000000000000000000000021 :107F60000000000000000000000000000000000011 :107F70000000000000000000000000000000000001 -:107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 -:107FA00000000000000000000000000000000000D1 -:107FB00000000000000000000000000000000000C1 +:107F800000000000000000000000000000000800E9 +:107F90000000400011000000400020001100000817 +:107FA0000001410000C00000008200A000000301A9 +:107FB00000840000000082000000000000000000BB :107FC00000000000000000000000000000000000B1 :107FD00000000000000000000000000000000000A1 :107FE0000000000000000000000000000000000091 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 -:108030000000000000000000000000000000000040 +:107FF0000000000000000000000000000800000079 +:1080000008000000000000000000000082000000E6 +:108010000800002108000000040000800405200082 +:1080200010000000000040008200000000000080FE +:108030004000C0004000C000000000000000000040 :108040000000000000000000000000000000000030 :108050000000000000000000000000000000000020 -:108060000000000000000000000000000000000010 +:1080600000004100000000000000000000000000CF :108070000000000000000000000000000000000000 :1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 +:10809000000000004100000000008082001080000D +:1080A000910080C00000000000080008009000005F +:1080B0004002008400A0000000A0000000000000BA +:1080C00000000000000000000000040000000000AC +:1080D0000000000000000000000000000000100090 :1080E0000000000000000000000000000000000090 -:1080F0000000000000000000000000000000000080 +:1080F000000400000000000000000000000000007C :10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F +:1081100082000000820000000000080000040880C7 +:10812000C0008400108884008400A041820284057D +:10813000C00090028205000400000800000000005A +:1081400000000000000000000000000080000000AF :10815000000000000000000000000000000000001F :10816000000000000000000000000000000000000F :1081700000000000000000000000000000000000FF :1081800000000000000000000000000000000000EF -:1081900000000000000000000000000000000000DF -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF +:10819000000000000000000000000000009000014E +:1081A000A102000005208309000000000008200053 +:1081B000000021A00002000000890800000000006B :1081C00000000000000000000000000000000000AF :1081D000000000000000000000000000000000009F :1081E000000000000000000000000000000000008F :1081F000000000000000000000000000000000007F :10820000000000000000000000000000000000006E -:10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E +:1082100000000000000000000000880000000000D6 +:1082200005200180058005800100402188024080F2 +:10823000000000034021C110C000400300210100E4 :10824000000000000000000000000000000000002E :10825000000000000000000000000000000000001E :10826000000000000000000000000000000000000E :1082700000000000000000000000000000000000FE :1082800000000000000000000000000000000000EE -:1082900000000000000000000000000000000000DE -:1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE +:1082900000000000000003000000098400821100BB +:1082A00008C084C140028420842010000000000126 +:1082B000C00200000000000040000000000041007B +:1082C000200000000000000000000000000000008E :1082D000000000000000000000000000000000009E :1082E000000000000000000000000000000000008E :1082F000000000000000000000000000000000007E :10830000000000000000000000000000000000006D :10831000000000000000000000000000000000005D -:10832000000000000000000000000000000000004D -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D +:108320000000000001C00109000090020002A0103E +:108330000110008200882010400800400111014017 +:10834000820800880000000000000000000000001B :10835000000000000000000000000000000000001D :10836000000000000000000000000000000000000D :1083700000000000000000000000000000000000FD :1083800000000000000000000000000000000000ED :1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD +:1083A000000000000000118421A1004180A0000015 +:1083B0000082088400802000030000800000110279 +:1083C00002A1008500000000000000000000000085 :1083D000000000000000000000000000000000009D -:1083E000000000000000000000000000000000008D +:1083E000000000000080000000000000000000000D :1083F000000000000000000000000000000000007D :10840000000000000000000000000000000000006C :10841000000000000000000000000000000000005C -:10842000000000000000000000000000000000004C -:10843000000000000000000000000000000000003C -:10844000000000000000000000000000000000002C +:108420000000000000000000000004031100A09103 +:10843000080009900508C10080008090000080803D +:10844000418002A00511400500000000000000006E :10845000000000000000000000000000000000001C -:10846000000000000000000000000000000000000C +:1084600090000000000000900000000000000000EC :1084700000000000000000000000000000000000FC :1084800000000000000000000000000000000000EC :1084900000000000000000000000000000000000DC -:1084A00000000000000000000000000000000000CC -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000000AC +:1084A0000000000000000000000020880001898812 +:1084B00091912102204190C191A0020020C1901011 +:1084C00090820002018300910090000000000000F3 :1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C +:1084E000000000000000C0000000000000000000CC :1084F000000000000000000000000000000000007C :10850000000000000000000000000000000000006B :10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000000FB +:1085200000000000000000000000000040900088F3 +:10853000909101031000000000008900400000003D +:1085400010001100200001000000080100000000E0 +:1085500000000000000000000000000040000000DB +:10856000000000000000000080000000000000008B +:1085700000000000110000000000000000000000EA :1085800000000000000000000000000000000000EB :1085900000000000000000000000000000000000DB -:1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB +:1085A00000000000000000000000000000008084C7 +:1085B00010118090099100032108094009008040B2 +:1085C0000003800809050000020241059111000026 :1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B +:1085E0000008000000000000000000800000000003 +:1085F0000000000000000003002100000000000057 :10860000000000000000000000000000000000006A :10861000000000000000000000000000000000005A :10862000000000000000000000000000000000004A -:10863000000000000000000000000000000000003A -:10864000000000000000000000000000000000002A +:108630009110C0C188808320A1898982820082052F +:10864000000000050080000080098211050003027F :10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A +:108660000000000000000000000000000002000008 :1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA :1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A -:1086F000000000000000000000000000000000007A +:1086B00000009103028290080301110510831090BD +:1086C0000800100082201084100010008301880030 +:1086D0008900000000000000000000000000000011 +:1086E000000000000000070000000000000007007C +:1086F0000041000000000000000000000000070032 :108700000000000000000000000000000000000069 :108710000000000000000000000000000000000059 :108720000000000000000000000000000000000049 -:108730000000000000000000000000000000000039 -:108740000000000000000000000000000000000029 +:1087300000000000008100E007000000000000E0F1 +:10874000070000000000000007004100000000E0FA :108750000000000000000000000000000000000019 :108760000000000000000000000000000000000009 :1087700000000000000000000000000000000000F9 :1087800000000000000000000000000000000000E9 :1087900000000000000000000000000000000000D9 :1087A00000000000000000000000000000000000C9 -:1087B00000000000000000000000000000000000B9 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 +:1087B000000000000000999900060F300F30F066AD +:1087C0003CFF00000000E4E4FFC300000000FECE18 +:1087D000F2C20000000000000000000000000000E5 :1087E0000000000000000000000000000000000089 :1087F0000000000000000000000000000000000079 :108800000000000000000000000000000000000068 :108810000000000000000000000000000000000058 :108820000000000000000000000000000000000048 -:108830000000000000000000000000000000000038 -:108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 +:1088300000000000000000009B9B00000F300F00B4 +:10884000F0663C0000000000E4E43C000000000092 +:108850003E0E320200000000000000000000000098 :108860000000000000000000000000000000000008 :1088700000000000000000000000000000000000F8 :1088800000000000000000000000000000000000E8 @@ -112809,296 +112809,296 @@ :1088C00000000000000000000000000000000000A8 :1088D0000000000000000000000000000000000098 :1088E0000000000000000000000000000000000088 -:1088F0000000000000000000000000000000000078 +:1088F0000000000000003C3C3C3C00000000000088 :108900000000000000000000000000000000000067 :108910000000000000000000000000000000000057 :108920000000000000000000000000000000000047 -:108930000000000000000000000000000000000037 -:108940000000000000000000000000000000000027 -:108950000000000000000000000000000000000017 +:108930000000000000000000000000000000C30074 +:10894000FFFFFFFF6C0F6CFFF303F3036F186F7EE5 +:108950007C5864403F3F24E7000000000000000016 :108960000000000000000000000000000000000007 :1089700000000000000000000000000000000000F7 :1089800000000000000000000000000000000000E7 :1089900000000000000000000000000000000000D7 :1089A00000000000000000000000000000000000C7 -:1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000000097 -:1089E0000000000000000000000000000000000087 -:1089F0000000000000000000000000000000000077 -:108A00000000000000000000000000000000000066 +:1089B00000000000000000000000000000003C007B +:1089C000C3000024FF006C006CF09F9F909009187A +:1089D000097EFDD9E5C1030324E700000000000083 +:1089E0000000000000000000000000000000050082 +:1089F000000800000000000000000500000000006A +:108A00000000000000000500000800000000000059 :108A10000000000000000000000000000000000056 :108A20000000000000000000000000000000000046 :108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 +:108A400000615032000100000060300F000D00A0F6 +:108A50000061300E000D00A0006130000001000038 :108A60000000000000000000000000000000000006 :108A700000000000000000000000000000000000F6 :108A800000000000000000000000000000000000E6 :108A900000000000000000000000000000000000D6 :108AA00000000000000000000000000000000000C6 :108AB00000000000000000000000000000000000B6 -:108AC00000000000000000000000000000000000A6 -:108AD0000000000000000000000000000000000096 -:108AE0000000000000000000000000000000000086 +:108AC0000000000F000F3030F3F30080000000C002 +:108AD00000C000000000000401053F353F3500F0F4 +:108AE000FFF0000000000000000000000000000097 :108AF0000000000000000000000000000000000076 :108B00000000000000000000000000000000000065 :108B10000000000000000000000000000000000055 :108B20000000000000000000000000000000000045 :108B30000000000000000000000000000000000035 -:108B40000000000000000000000000000000000025 -:108B50000000000000000000000000000000000015 -:108B60000000000000000000000000000000000005 +:108B400000000000000F008F003CC3FF0080000009 +:108B500000C000C000000000004401453035303541 +:108B600000AAFFAA000000000000000000000000B2 :108B700000000000000000000000000000000000F5 :108B800000000000000000000000000000000000E5 :108B900000000000000000000000000000000000D5 :108BA00000000000000000000000000000000000C5 :108BB00000000000000000000000000000000000B5 -:108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 +:108BC000000000000000553C0F0FA0AFF0FF0000B8 +:108BD0000000F0F000000000000000000000FF0FA7 +:108BE000F5053CA03CAF00000000000000000000C4 :108BF0000000000000000000000000000000000075 :108C00000000000000000000000000000000000064 :108C10000000000000000000000000000000000054 :108C20000000000000000000000000000000000044 :108C30000000000000000000000000000000000034 -:108C40000000000000000000000000000000000024 -:108C50000000000000000000000000000000000014 -:108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 -:108CC0000000000000080004000000000000000098 -:108CD0000000000000000004000000000000000090 -:108CE000000000000000000400040000000000007C -:108CF0000000000000000000000000000000000074 -:108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000000000053 +:108C40000000000000000000553C0F0F000F505FB7 +:108C500000A000A0F5F514000000000000000000D6 +:108C6000FA0AF0003CA03CAF000000000000C00089 +:108C70000000000000002000200020000000200074 +:108C800000002000000000000000880040002000DC +:108C900040000000000020002000840000002000B0 +:108CA0000000200000000000000300002000000081 +:108CB0000000200000000000000000000400000090 +:108CC0000004000000000000000000000800000098 +:108CD0000900000000000004000000000000000087 +:108CE0000000008000000000000000000000000004 +:108CF00000000000000200000002000200020090DC +:108D00000000000000020000000000000000000061 +:108D10000000000000000000000000002000000033 :108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 -:108D600000000000000000000000000800000000FB +:108D30000000000000000000000000000000200013 +:108D400000000000000000000000000000008000A3 +:108D50002100820000000000000000000000000070 +:108D600000000000004000000000000000000000C3 :108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000000E3 +:108D80000000001000800000000000000000000053 :108D900000000000000000000000000000000000D3 :108DA00000000000000000000000000000000000C3 :108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE0000000000000000000000000000000000083 -:108DF0000000000000000008000800080000000853 -:108E0000000800080008000800080008000800002A -:108E10000000000000000008000800080000000832 -:108E2000000800080008000800080004000800000E -:108E3000000000000000000000080008000400001E -:108E4000000800080004000400080084000000047A -:108E50000000000000000000000800080000000002 -:108E600000020002000000000008000800000000EE -:108E700000000000000000000000000000000000F2 -:108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000000000D2 +:108DC0000000000000000000000000100000000093 +:108DD000000000000810000000000000004000003B +:108DE0000000000000000000000000000040000043 +:108DF00000000004000000000000000000000082ED +:108E000000000000400100200000000000000008F9 +:108E1000000000000000000800000000040000083E +:108E2000000000000000000000000000000800003A +:108E30000084000000000000000800000000008422 +:108E40000008000000000000000000000001000811 +:108E50000000000000000001000800000000000009 +:108E600000080000000000000000000000000041B9 +:108E700000210003000000000000000000000000CE +:108E800000080000000000000000000000000000DA +:108E900000000000000000000000000000000008CA :108EA00000000000000000000000000000000000C2 :108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000040000052 -:108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 +:108EC0000000002000000000000000000000000082 +:108ED00000200000000000000000C021A000C00031 +:108EE0000021000000410000000302C0000000203B +:108EF00000A00000000000000000000000000000D2 :108F00000000000000000000000000000000000061 :108F10000000000000000000000000000000000051 :108F20000000000000000000000000000000000041 :108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 -:108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 +:108F40000000000000000000000000001100000010 +:108F5000000021010300050021000000080021108D +:108F6000100000000310000000000082804100C0DB +:108F700000830021000000000000000000008200CB +:108F800000000000000004000000000000000000DD :108F900000000000000000000000000000000000D1 :108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 +:108FB00000000000000000000000080000000000A9 +:108FC0000000C00000000800000082000000000057 +:108FD0000000000000000409008004000000000000 +:108FE00000000000000000000000900000000000F1 :108FF0000000000000000000000000000000000071 :109000000000000000000000000000000000000060 :109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 +:109020000000000000000000400000000000000000 :109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 +:10904000000000000000000000001100000000000F +:109050000000000000880000800000048000000084 +:1090600000000000000000020000000000000000FE :1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 +:1090800000080000080000000000A0000000000030 :1090900000000000000000000000000000000000D0 :1090A00000000000000000000000000000000000C0 :1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 +:1090C0000800000000000000080000000000C000D0 +:1090D0000800000008000000200000030800001045 +:1090E00002A1010004000400001000410000820001 +:1090F000A0100080000001A000800000000000001F :10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F +:109110000000000000000000080000000000000047 :10912000000000000000000000000000000000003F :10913000000000000000000000000000000000002F :10914000000000000000000000000000000000001F -:10915000000000000000000000000000000000000F -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF -:1091900000000000000000000000000000000000CF +:1091500000000000008800000000802005848800D6 +:109160000088821004C0850090A000C04100081053 +:1091700000000082004021000421002000080000BF +:1091800000000000000008000000000000000000D7 +:1091900000000000000000000000000800000000C7 :1091A00000000000000000000000000000000000BF :1091B00000000000000000000000000000000000AF :1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000000000008F -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F +:1091D000080082008400000000009000858090114B +:1091E000080000040004001100000009040500004C +:1091F000C0000000004100008400000000000000EA :10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E +:10921000000000000000410000000000000000000D :10922000000000000000000000000000000000003E :10923000000000000000000000000000000000002E :10924000000000000000000000000000000000001E -:10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE +:109250000000000000000000000008001188200449 +:10926000000011000000000000000000000080006D :1092700000000000000000000000000000000000EE :1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE +:1092900000001000000000000000000000000000BE :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE :1092C000000000000000000000000000000000009E -:1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D +:1092D00000000000000000000000C00220A0A0C0AC +:1092E000820810C0000300080401C0040484008246 +:1092F00000A000000000000000008988000200A01B +:10930000909000000000000000000000000000003D :10931000000000000000000000000000000000004D :10932000000000000000000000000000000000003D :10933000000000000000000000000000000000002D :10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD +:10935000000000000000000000000000800010007D +:1093600000008080A089000200050040808080000D +:1093700000800000000000000000000089800080E4 +:1093800000008080000000000000000000000000DD +:109390000000000000008000800080000000000845 :1093A00000000000000000000000000000000000BD :1093B00000000000000000000000000000000000AD :1093C000000000000000000000000000000000009D -:1093D000000000000000000000000000000000008D -:1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C +:1093D0000000000000000000000000000000080085 +:1093E000C1C02084918080800000008080088000BF +:1093F00080000080800000000000000000000000ED +:1094000000210080808000000000000000000000BB +:1094100000000000000010000200820008000000B0 :10942000000000000000000000000000000000003C :10943000000000000000000000000000000000002C :10944000000000000000000000000000000000001C :10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC +:10946000910002119108910402C008002008040133 +:109470000200100004109000000000000000000036 +:10948000000000A000849090000000000000000098 :1094900000000000000000000000000000000000CC :1094A00000000000000000000000000000000000BC :1094B00000000000000000000000000000000000AC :1094C000000000000000000000000000000000009C :1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B +:1094E000000004400089044103A1A00401A00190F0 +:1094F000A088000400840090020800000000000022 +:10950000000004000000009010C0000000000000F7 :10951000000000000000000000000000000000004B :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B :10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB +:109560000000000000890040802109910000118066 +:10957000418080800080000000808080000000002A +:1095800000000000000000000080208000000000BB :1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB +:1095A000000000008040800000000000000000007B :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A +:1095E0000000000000000080800500800011A10044 +:1095F00011002000C00080110080800000000000E9 +:109600000000000000008020800300000000000037 :10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A +:1096200000200090000090002000080002000000D0 :10963000000000000000000000000000000000002A :10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA +:10966000000000000000000002081008A0840201B1 +:109670009100C140C120090004018402408482009D +:1096800000000000000000000800020188008200C5 :1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA +:1096A00000000000000000000000000007000000B3 :1096B00000000000000000000000000000000000AA :1096C000000000000000000000000000000000009A :1096D000000000000000000000000000000000008A -:1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 +:1096E00000000000000000000000000000E0070093 +:1096F0006000880002E0070050060000000007003C +:109700005000000000000000000000810000070081 :109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 +:1097200000000000000000000000000FFFF000003B :109730000000000000000000000000000000000029 :109740000000000000000000000000000000000019 :109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000000000000B9 +:10976000000000000000000000000000BEBEC0FCC1 +:10977000FFD0FFDF003AFF3A00FF00FFF03CF0AA05 +:10978000808FB0BF00000000000000005050FAFAC7 +:109790005555AA5500000000000000000000000020 +:1097A0000000000000000000000000000C0CFCFCA9 :1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 :1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 +:1097E0000000000000000000000000000000828275 +:1097F000C0FCFFF0FFFF003AFF3A28FF00F7F03C03 +:10980000F0AA808FB0BF0000000000000000287D9B +:10981000287DAAAA00FF0000000000000000000050 +:1098200000000000000000000000D2D2D2D20000F0 :109830000000000000000000000000000000000028 :109840000000000000000000000000000000000018 :109850000000000000000000000000000000000008 :1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 +:109870005F0ABEBE5041FA41000000FF00004000F8 +:109880003C550F55FFFF00000000000000000000E5 +:10989000FF3C4D4D0000FFFF0000000000000000F5 +:1098A0000000000000000000000000000055AAFFBA :1098B00000000000000000000000000000000000A8 :1098C0000000000000000000000000000000000098 :1098D0000000000000000000000000000000000088 :1098E0000000000000000000000000000000000078 -:1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 +:1098F00000005F0A141450EBFAEBAAAAFAFA00006F +:1099000000003C550F55FFBF00A000000000000004 +:109910000000C3004D4D0000FFFF000000000000EC :109920000000000000000000000000000000000037 :109930000000000000000000000000000000000027 :109940000000000000000000000000000000000017 :109950000000000000000000000000000000000007 :1099600000000000000000000000000000000000F7 -:1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 +:10997000000000000061300E000900A000615004EA +:10998000C00D00000000000000000000000000000A +:10999000000000000000303800400000000000001F :1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 -:109A00000000000000000000000000000000000056 +:1099F00000000000000000000000F400FF0B430026 +:109A0000FFBC00000000000000000000000000009B :109A10000000000000000000000000000000000046 :109A20000000000000000000000000000000000036 :109A30000000000000000000000000000000000026 :109A40000000000000000000000000000000000016 :109A50000000000000000000000000000000000006 :109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 +:109A70000000000000000000000000000000FFFFE8 +:109A80007F00FF80000000000000000000000000D8 :109A900000000000000000000000000000000000C6 :109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 :109AC0000000000000000000000000000000000096 :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000000066 -:109B00000000000000000000000000000000000055 +:109AF0000000000000000000000000000000D7EBA4 +:109B00001428C3C382000000000000000000000011 :109B10000000000000000000000000000000000045 :109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 @@ -113106,104 +113106,104 @@ :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 -:109B800000000000000000000000000000000000D5 +:109B8000F7FB3438CFCF8E0000000000000000004B :109B900000000000000000000000000000000000C5 :109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000000000000000A5 -:109BC0000000000000000000000000000000000095 -:109BD0000000000000000000000000000000000085 -:109BE0000000000000000000000000000000000075 -:109BF000000000000000000000000004000400005D -:109C00000000000000000000000000000000000054 -:109C10000000000400040002000200000000000038 -:109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 +:109BB0000000200000000000000000000000000085 +:109BC0000000200000000000000000000000000075 +:109BD00000002000000040000000400000000000E5 +:109BE0000000200000030000000000000000000052 +:109BF0000000000020000000A00000002000000085 +:109C00000000000020000000000000000400000030 +:109C10000000000020000000000000000400000020 +:109C20000000000020000000000000000000008292 +:109C300000000000000000000000410000000000E3 :109C40000000000000000000000000000000000014 -:109C50000000000000000000000000000000000004 +:109C500000000000040000020000000000000000FE :109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000000E4 +:109C700000000000000000000000000000A0000044 :109C800000000000000000000000000000000000D4 :109C900000000000000000000000000000000000C4 :109CA00000000000000000000000000000000000B4 :109CB00000000000000000000000000000000000A4 -:109CC0000000000000000000000000000000000094 +:109CC0000000000000000010000000000010000074 :109CD0000000000000000000000000000000000084 :109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 -:109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 -:109D30000000000000000000000000000000000023 -:109D40000000000000000000000000000000000013 -:109D50000000000000000000000000000000000003 -:109D600000000000000000000000000000000000F3 -:109D700000000000000000000000000000000000E3 -:109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 -:109DA00000000200000000000000000000000000B1 +:109D00000080008000410002001000000000000000 +:109D100000900000000000000010000000000000A3 +:109D2000000000000000000000000004000000002F +:109D30000008000000000000000800000000000013 +:109D40000000000800000000000100080000000002 +:109D500000080000000000000004000000000000F7 +:109D60000008000200080000410000000008000098 +:109D700000000008000000000000000000000000DB +:109D80000000000400200088000102000004000020 +:109D900000000004000000000000020000000000BD +:109DA00000000000000000000000040000080000A7 :109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000000000000000093 +:109DC000840000000000000000000000000000000F :109DD0000000000000000000000000000000000083 -:109DE0000000000000000000000000000000000073 +:109DE0000000000004080000000000000000000067 :109DF0000000000000000000000000000000000063 -:109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 -:109E40000000000000000000000000000000000012 +:109E00000000000000000000000020000000000032 +:109E100000000000A02100000000820000000000FF +:109E2000000000002004000000000000000000000E +:109E3000000000000000000000000500000000001D +:109E400000000000000800100000000000000000FA :109E50000000000000000000000000000000000002 :109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 +:109E700000000000000000000000000000002000C2 +:109E80000000080000000900410005000900110061 +:109E9000008421000000000000000000000000001D +:109EA0000000080000008801000000000000000021 +:109EB000000000000000000000000000840000001E :109EC0000000000000000000000000000000000092 :109ED0000000000000000000000000000000000082 -:109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 -:109F10000000000000000000000000000000000041 +:109EE000000000000000000000000000000004204E +:109EF0000000000000000000C000000000000000A2 +:109F000082000000000000410403000800001080EF +:109F1000000000000000000002000000000000003F :109F20000000000000000000000000000000000031 -:109F30000000000000000000000000000000000021 -:109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000000001 -:109F600000000000000000000000000000000000F1 -:109F700000000000000000000000000000000000E1 -:109F800000000000000000000000000000000000D1 -:109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 +:109F30000000000000000000000008000000000019 +:109F40000000000000000000000000100000000001 +:109F500000000020000000000000000000000000E1 +:109F600004000000000000000000000040000000AD +:109F70008001000000000000000000000000000060 +:109F800000000000000000000000020011010000BD +:109F9000000200000000000020000300000000009C +:109FA00000000400000000000000030000000000AA :109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000000081 -:109FE0000000000000000000000000000000000071 +:109FC0000000000000000000400000000000000051 +:109FD000000000000005000000000000000000007C +:109FE000000000000000000000000000040000006D :109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 -:10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 +:10A000000000000000000000400000000000000010 +:10A0100000000002010000000000000000410000FC +:10A02000000000000000000090000000000400009C :10A030000000000000000000000000000000000020 -:10A040000000000000000000000000000000000010 +:10A0400000000000000000000000400000000000D0 :10A050000000000000000000000000000000000000 :10A0600000000000000000000000000000000000F0 :10A0700000000000000000000000000000000000E0 -:10A0800000000000000000000000000000000000D0 -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 -:10A0C0000000000000000000000000000000000090 +:10A0800000000000000000000010000000000000C0 +:10A09000000005C00089040000000000000000A0CE +:10A0A00000000000000000000000000000000001AF +:10A0B0000000000000000010000000000000000090 +:10A0C0000800000000000000000000000000000088 :10A0D0000000000000000000000000000000000080 -:10A0E0000000000000000000000000000000000070 +:10A0E000002100000000000000000000000000004F :10A0F0000000000000000000000000000000000060 :10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F +:10A1100000000011040000104000000000000004D6 +:10A12000000000030000000000000000000000002C :10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A1500000000000000000000000000000000000FF +:10A1400000000000000000000000210000000000EE +:10A1500000000000000800000000000000000000F7 :10A1600000000000000000000000000000000000EF :10A1700000000000000000000000000000000000DF :10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF +:10A19000000000A00000800000018000000000001E :10A1A00000000000000000000000000000000000AF :10A1B000000000000000000000000000000000009F :10A1C000000000000000000000000000000000008F @@ -113211,7 +113211,7 @@ :10A1E000000000000000000000000000000000006F :10A1F000000000000000000000000000000000005F :10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E +:10A2100001000400000088108490A0A0C08200000B :10A22000000000000000000000000000000000002E :10A23000000000000000000000000000000000001E :10A24000000000000000000000000000000000000E @@ -113219,72 +113219,72 @@ :10A2600000000000000000000000000000000000EE :10A2700000000000000000000000000000000000DE :10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE +:10A290000000080000000000038000800080808033 :10A2A00000000000000000000000000000000000AE :10A2B000000000000000000000000000000000009E :10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E +:10A2D000000000000000000000008000800000007E :10A2E000000000000000000000000000000000006E :10A2F000000000000000000000000000000000005E :10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D +:10A310000000000000000000000082002004858989 +:10A32000C10000000000000000000000000000006C :10A33000000000000000000000000000000000001D :10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD -:10A3600000000000000000000000000000000000ED +:10A35000000000000000000000009000020010005B +:10A36000A00000000000000000000000000000004D :10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000000CD -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD +:10A3800000200000000000000000000000000000AD +:10A3900000000000000000000000000040008301F9 +:10A3A000A1A091400000000000000000000000009B :10A3B000000000000000000000000000000000009D :10A3C000000000000000000000000000000000008D :10A3D000000000000000000000000000000000007D :10A3E000000000000000000000000000000000006D :10A3F000000000000000000000000000000000005D :10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C +:10A41000000000000000000000010000010010A08A +:10A4200000200091C0910000000000000100000029 :10A43000000000000000000000000000000000001C :10A44000000000000000000000000000000000000C :10A4500000000000000000000000000000000000FC :10A4600000000000000000000000000000000000EC :10A4700000000000000000000000000000000000DC :10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C +:10A490000000000000000000000900030009114056 +:10A4A00080000000002100400000000000000800C3 +:10A4B0000000000000000000000000000000030099 :10A4C000000000000000000000000000000000008C :10A4D000000000000000000000000000000000007C :10A4E000000000000000000000000000000000006C :10A4F000000000000000000000000000000000005C -:10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B +:10A500000000000200000000000000000000000049 +:10A510000000000000000000000000080000000033 +:10A52000000080800000800000200000000000008B :10A53000000000000000000000000000000000001B :10A54000000000000000000000000000000000000B :10A5500000000000000000000000000000000000FB -:10A5600000000000000000000000000000000000EB +:10A560000000000000400088000000000000000023 :10A5700000000000000000000000000000000000DB -:10A5800000000000000000000000000000000000CB +:10A5800000000000000100000000000000000000CA :10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB +:10A5A0000000000090881004A020C00100000000FE :10A5B000000000000000000000000000000000009B :10A5C000000000000000000000000000000000008B :10A5D000000000000000000000000000000000007B :10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B -:10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A +:10A600000000000000000000070000000000000043 +:10A6100000000000000000000000000000008100B9 +:10A6200000E000000000884100E007000082000018 +:10A6300000E000000000000000000000000000003A +:10A6400000E000000000000000000000000000002A :10A6500000000000000000000000000000000000FA :10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA :10A6800000000000000000000000000000000000CA :10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA +:10A6A0000000000000000000FF99660000000000AC :10A6B000000000000000000000000000000000009A :10A6C000000000000000000000000000000000008A :10A6D000000000000000000000000000000000007A @@ -113292,7 +113292,7 @@ :10A6F000000000000000000000000000000000005A :10A700000000000000000000000000000000000049 :10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 +:10A7200000000000000000000000FFD9E6C00200A9 :10A730000000000000000000000000000000000019 :10A740000000000000000000000000000000000009 :10A7500000000000000000000000000000000000F9 @@ -113305,35 +113305,35 @@ :10A7C0000000000000000000000000000000000089 :10A7D0000000000000000000000000000000000079 :10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 +:10A7F0004F4649400000000000000000000000003B :10A800000000000000000000000000000000000048 :10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 +:10A8200000000000000000000000000000000FFF1A +:10A830001FFF08FFFFFF00000000000000000000F5 :10A840000000000000000000000000000000000008 :10A8500000000000000000000000000000000000F8 :10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 +:10A870000000DFD6D9D0000000000000000000007A :10A8800000000000000000000000000000000000C8 :10A8900000000000000000000000000000000000B8 :10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 +:10A8B00000F018F80808FF08000000000000000081 :10A8C0000000000000000000000000000000000088 :10A8D0000000000000000000000000000000000078 :10A8E0000000000000000000000000000000000068 :10A8F0000000000000000000000000000000000058 :10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 +:10A9100000000008000000A000000000000000008F +:10A920000000000000000000000000610006C009F7 +:10A93000000000600036C00D000000610006000D40 +:10A940000000000000000000000000610006000D93 :10A9500000000000000000000000000000000000F7 :10A9600000000000000000000000000000000000E7 :10A9700000000000000000000000000000000000D7 :10A9800000000000000000000000000000000000C7 :10A9900000000000000000000000000000000000B7 :10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 +:10A9B000F8A8F8FD000000000000005500000000AD :10A9C0000000000000000000000000000000000087 :10A9D0000000000000000000000000000000000077 :10A9E0000000000000000000000000000000000067 @@ -113341,7 +113341,7 @@ :10AA00000000000000000000000000000000000046 :10AA10000000000000000000000000000000000036 :10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 +:10AA30000000F000F0FF00000000000000550000E2 :10AA40000000000000000000000000000000000006 :10AA500000000000000000000000000000000000F6 :10AA600000000000000000000000000000000000E6 @@ -113349,7 +113349,7 @@ :10AA800000000000000000000000000000000000C6 :10AA900000000000000000000000000000000000B6 :10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 +:10AAB000000000000000000000000000FFC3282884 :10AAC0000000000000000000000000000000000086 :10AAD0000000000000000000000000000000000076 :10AAE0000000000000000000000000000000000066 @@ -113357,59 +113357,59 @@ :10AB00000000000000000000000000000000000045 :10AB10000000000000000000000000000000000035 :10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 +:10AB30000000000000000000000000000000001CF9 +:10AB400028280000000000000000000000000000B5 :10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000004000000000000000000000000000091 -:10ABC0000004000000000000000400040000000079 -:10ABD0000004000800000000000000000000000465 -:10ABE0000004000000000000000000000000000061 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 +:10AB600000000000000000000400000000000000E1 +:10AB70000000000000000002200000002000000093 +:10AB800000000000000000000400000000000000C1 +:10AB90000000000000000000000000002000000095 +:10ABA0000000000300000000000020000000000082 +:10ABB0000000000000000000000000000000000095 +:10ABC00000008400000000000000200400000000DD +:10ABD0000000840000000000000484000000000069 +:10ABE00000048400000200000000200000000000BB +:10ABF000000000020040000040910002210000001F +:10AC00000000000000000000000000020000000042 :10AC10000000000000000000000000000000000034 :10AC20000000000000000000000000000000000024 :10AC30000000000000000000000000000000000014 -:10AC40000000000000000000000000000000000004 +:10AC400000001100000000000000000000000000F3 :10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 +:10AC60000000000020002010000000008410000000 +:10AC70000000000000000080000000800000900044 +:10AC80000080000000004000000000000000000004 :10AC900000000000000000000000000000000000B4 :10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 +:10ACB0000000000000100000000000000000000084 +:10ACC00000000000000000008441000000000000BF +:10ACD0000000000000000010000000000000000064 +:10ACE00000000000000000008001000000000000E3 +:10ACF0000000000000000000000800000020000824 +:10AD000000000002000000008000000000000000C1 +:10AD1000000000000000000000000000000000042F +:10AD20000000000000000408000000000000000017 :10AD30000000000000000000000000000000000013 -:10AD40000000000000000000000000000000000003 +:10AD400000100000000000000010000000000000E3 :10AD500000000000000000000000000000000000F3 :10AD600000000000000000000000000000000000E3 :10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 +:10AD800004000000C00800004000000000000000B7 :10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 +:10ADA000000800000000000000000000000000009B :10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 +:10ADC000000000000000000020000000000004005F +:10ADD00084000000000000000000000000080000E7 :10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 +:10ADF00005000000000000004100000000200000ED +:10AE000000000000000000010000800000000000C1 :10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 +:10AE2000000008000000000000000000000000001A :10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 +:10AE400004000004400000000000000000000000BA +:10AE500000200000000000000000000000000000D2 +:10AE600000000000000000000000000000002000C2 +:10AE700000000000000000000000C0000000820090 :10AE800000000000000000000000000000000000C2 :10AE900000000000000000000000000000000000B2 :10AEA00000000000000000000000000000000000A2 @@ -113417,130 +113417,130 @@ :10AEC0000000000000000000000000000000000082 :10AED0000000000000000000000000000000000072 :10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 +:10AEF00080000000000000000000000000000000D2 :10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 +:10AF10000000000000000800000000000000000029 +:10AF200000000000000040080000000000000000D9 +:10AF300000000000400000000000000000000000D1 :10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 :10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 +:10AF70000000000000000000C00000000000000011 +:10AF80000000100000000420000000020002000089 +:10AF900001020000000000000009000000000000A5 :10AFA00000000000000000000000000000000000A1 :10AFB0000000000000000000000000000000000091 :10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 +:10AFE00000000000000000800000000000000000E1 :10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 +:10B0000000000000000000008001000000000001BE +:10B010000000040800000000000000000000000024 :10B020000000000000000000000000000000000020 :10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 +:10B040000000000000000000000004C0000000003C +:10B0500008020400002000A0000000000000000022 +:10B0600000000000000000000002000000000000DE +:10B0700000000000000000000000000000020000CE +:10B08000002100000000100000000400000000008B +:10B09000008000000100000000000000000000002F :10B0A00000000000000000000000000000000000A0 :10B0B0000000000000000000000000000000000090 :10B0C0000000000000000000000000000000000080 :10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 +:10B0E0000000000040000000000000000000000020 :10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F +:10B1000000000000410000008000000080000000FE +:10B110000000000200000800000000000000000025 :10B12000000000000000000000000000000000001F :10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF +:10B1400000000000000000000000090000000000F6 +:10B1500000000000000000000000000005000000EA +:10B1600005000000000000000000000000000000DA :10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF +:10B1800000000000000000000000050000000000BA +:10B190001000000089008201000100000000000092 :10B1A000000000000000000000000000000000009F :10B1B000000000000000000000000000000000008F :10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F :10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E +:10B1F000000000000000000000000000050000004A +:10B2000041000000000000000000000002000000FB +:10B21000000080000004A1118008001100400020FF +:10B22000001000020000000000000000000000000C :10B23000000000000000000000000000000000000E :10B2400000000000000000000000000000000000FE :10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE +:10B2700000000000000000000000000000000010BE +:10B2800000090000000000000000000000001100A4 +:10B290001100411141008000000080008003000087 :10B2A000000000000000000000000000000000009E :10B2B000000000000000000000000000000000008E :10B2C000000000000000000000000000000000007E :10B2D000000000000000000000000000000000006E :10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D +:10B2F0000080800000008089000000000000000045 +:10B3000000010000009000000000000000000000AC +:10B31000000000000000010004089000040082907A :10B32000000000000000000000000000000000001D :10B33000000000000000000000000000000000000D :10B3400000000000000000000000000000000000FD :10B3500000000000000000000000000000000000ED :10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD +:10B37000000000C082009000C091000000000000AA :10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D +:10B39000000000100020009000A00000000100004C +:10B3A000000100000000010000000000000000009B :10B3B000000000000000000000000000000000008D :10B3C000000000000000000000000000000000007D :10B3D000000000000000000000000000000000006D :10B3E000000000000000000000000000000000005D :10B3F000000000000000000000000000000000004D :10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C +:10B4100000000000008000800080000000050003A4 +:10B4200010051041000000000800000000000000AE :10B43000000000000000000000000000000000000C :10B4400000000000000000000000000000000000FC :10B4500000000000000000000000000000000000EC :10B4600000000000000000000000000000000000DC :10B4700000000000000000000000000000000000CC :10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C +:10B4900000000000000000890000000000002110F2 +:10B4A0000340408040000000000000000000000059 :10B4B000000000000000000000000000000000008C :10B4C000000000000000000000000000000000007C :10B4D000000000000000000000000000000000006C :10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B +:10B4F00000000000000000004120108905800300CA +:10B500000000000000000000080020008200100081 +:10B5100000000000000000000089000000000000A2 +:10B520000100010001840000000000000000000094 :10B53000000000000000000000000000000000000B :10B5400000000000000000000000000000000000FB :10B5500000000000000000000000000000000000EB :10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B +:10B57000000000000000000000000100018900043C +:10B5800001000000000000000000000000E00000DA +:10B5900000000000000000000000821100E0070031 +:10B5A0000000818100E007020000000000000000B0 :10B5B000000000000000000000000000000000008B :10B5C000000000000000000000000000000000007B :10B5D000000000000000000000000000000000006B :10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A +:10B5F000000000000000000000000000818100E069 +:10B60000070088000000000000000000C355000F84 :10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A +:10B62000FFCFFFC700000000000000000000000086 :10B63000000000000000000000000000000000000A :10B6400000000000000000000000000000000000FA :10B6500000000000000000000000000000000000EA :10B6600000000000000000000000000000000000DA :10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A +:10B680000000000000000000000000000000C355A2 +:10B69000FF0F00000000000000000000000000009C +:10B6A000000030CF30C700000000000000000000A4 :10B6B000000000000000000000000000000000008A :10B6C000000000000000000000000000000000007A :10B6D000000000000000000000000000000000006A @@ -113548,7 +113548,7 @@ :10B6F000000000000000000000000000000000004A :10B700000000000000000000000000000000000039 :10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 +:10B720000000000000000000000000000000000316 :10B730000000000000000000000000000000000009 :10B7400000000000000000000000000000000000F9 :10B7500000000000000000000000000000000000E9 @@ -113562,34 +113562,34 @@ :10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 :10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 +:10B8000000000000000000005A0FAA5500000000D0 +:10B810000000000000610007000D000000000000B3 +:10B820000000000000600036C00D00000061003E16 +:10B83000C00C00A000610006000D00000000000028 :10B8400000000000000000000000000000000000F8 :10B8500000000000000000000000000000000000E8 :10B8600000000000000000000000000000000000D8 :10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 +:10B8800000000000000000410036C00D000800006C :10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 +:10B8A0000000000000000000000000000000020096 +:10B8B000820028AA3C3C00000000000000000000BC :10B8C0000000000000000000000000000000000078 :10B8D0000000000000000000000000000000000068 :10B8E0000000000000000000000000000000000058 :10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 +:10B9000000000000000000001000EFFF0000000039 :10B910000000000000000000000000000000000027 :10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 +:10B9300000000000EAAAFF3F000000000000000035 :10B9400000000000000000000000000000000000F7 :10B9500000000000000000000000000000000000E7 :10B9600000000000000000000000000000000000D7 :10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 +:10B980000000000000000000000000001F0F000089 :10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 +:10B9A0000000000000000000000000000000CFCFF9 +:10B9B000F0F03C3C000000000000C000F00000007F :10B9C0000000000000000000000000000000000077 :10B9D0000000000000000000000000000000000067 :10B9E0000000000000000000000000000000000057 @@ -113597,199 +113597,199 @@ :10BA00000000000000000000000000000000000036 :10BA10000000000000000000000000000000000026 :10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 +:10BA3000003030300C3C000000000000F000F0004E :10BA400000000000000000000000000000000000F6 :10BA500000000000000000000000000000000000E6 :10BA600000000000000000000000000000000000D6 :10BA700000000000000000000000000000000000C6 :10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 -:10BB0000000000000004000400000000000000002D -:10BB1000000000000000000000000000000400041D -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 +:10BA90000000000000000000000000000000200086 +:10BAA000040000000000000000000000000000088A +:10BAB0000000000000000000000000000000400046 +:10BAC000A08000004100000000000000000088008D +:10BAD00088000000000000000000000000040003D7 +:10BAE0000000000000002000000000000100000035 +:10BAF0000000200000000000000000000000000026 +:10BB00000000000000002000000000000000040011 +:10BB1000000400000000000000000000000004001D +:10BB20000000800000000000000000020000000093 +:10BB30000001000000000000000000000000000004 +:10BB400080004020000040000000000000000000D5 :10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 +:10BB600000000000000000000000000000000400D1 :10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 +:10BB800000000000000000000002000000000000B3 :10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 +:10BBA000000000880000000000000000000000000D +:10BBB0000010000000000010000000000000000065 +:10BBC0000000400004800408002000000000000085 +:10BBD00000000080000000000000000000000000E5 +:10BBE0000041000000000000000000000000008094 +:10BBF00000800410000000000000001000000000A1 +:10BC000000000000000000000000008000000000B4 +:10BC100000000040000000000000000000000000E4 +:10BC200000100000000800080000200004000400CC +:10BC300004000000000800000000000000000000F8 +:10BC400000000000808280028001000100000000EE +:10BC5000000000080040000000000000000000009C +:10BC600000000008000000000000000000080000C4 +:10BC700000400020008400000000000000000000E0 +:10BC800000000000001000000000000000040000A0 +:10BC90000000000000000000000000000040000064 +:10BCA0000000000000000011000000000000000083 +:10BCB0000000000000000000000082000000000002 +:10BCC00001000021000800000000008000000000CA +:10BCD000000800080000000000000000000500004F +:10BCE000004000000000000000000000000000050F +:10BCF00000000010001000000000820000000000A2 +:10BD000000000000000001400000000000000000F2 :10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 +:10BD20000000000000000000000000000000008291 +:10BD300000000000000000A0000000000000000063 +:10BD400000000200000000000004000000200008C5 +:10BD5000000000A000000000000000000000000043 +:10BD600000000001000000000000000000000000D2 :10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 +:10BD80000000000021000300080000000020000067 +:10BD90000000000021000000000000000000000082 +:10BDA000000000000000000000000000000085000E +:10BDB0000080000000000000000000000000830080 +:10BDC0000080000000000000000008800800000063 :10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 +:10BDE000010000000000C000200000000800080062 +:10BDF00000000000000000008200000000808200BF :10BE00000000000000000000000000000000000032 :10BE10000000000000000000000000000000000022 :10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 +:10BE300020002104000011000000000000000000AC +:10BE400020000004000000000000000000020000CC :10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 +:10BE600000000400000000000000000000000000CE +:10BE700000000000000000000000000000000002C0 :10BE800000000000000000000000000000000000B2 :10BE900000000000000000000000000000000000A2 :10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 +:10BEB00000000000000000000000082190000000C9 +:10BEC00000000000000000000000000000000080F2 +:10BED000100000200400000000000000000000002E +:10BEE00000000020A0000000000000000000000092 +:10BEF0000000080000000000840000000000820034 +:10BF00000800820000000000000002000000C000E5 :10BF10000000000000000000000000000000000021 :10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 +:10BF300000000900000021000000000000000000D7 +:10BF40000000000000000000400000000500008428 +:10BF500000028000000180A000000000000000003E +:10BF600000000000000100000000000000000000D0 :10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 +:10BF80000000000000000000000000008000000031 :10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000000000091 +:10BFA0000000000008000000000000000000000089 :10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 +:10BFC0000008000000000000000000000000000069 +:10BFD000000000020000000000200000000200003D +:10BFE00040410000000000000000000000000000D0 +:10BFF000000500000800000000000005C00000006F +:10C00000040082050020080200400008000402002D +:10C01000000000000000820000000000000000009E :10C020000000000000000000000000000000000010 :10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 +:10C0400000000000000041000000000000000000AF +:10C0500000000000000100000000000100000001DD :10C0600000000000000000000000000000000000D0 :10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 +:10C08000000080000000000100010001000000002D +:10C090008000000000000000000000000000000020 :10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 +:10C0B000000000000000019000900004002000003B +:10C0C000000000000000010000000000000000006F +:10C0D00000000000000040A1910900419083000091 +:10C0E00000000000000000009000000000000000C0 :10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F +:10C1000000000000000000004088010100030090D2 +:10C110000000000000000000020000008400900009 :10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF +:10C13000000000000000000011002100008000004D +:10C1400000000000000000001100210000000000BD +:10C15000000000000000000091C1838900898083F5 +:10C16000000000000000000011008000000000003E :10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E +:10C180000000032000090000000985C0212100896A +:10C190000083030000000000000080000500800014 +:10C1A000800000000000000000000000000000000F +:10C1B0000000000000000000000000410900000332 +:10C1C0000000000000000000000000410900000322 +:10C1D00000808000000000000000000000100090BF +:10C1E00080910000000000000000000000800000BE +:10C1F00000000000800000000000000000000000BF +:10C20000000000008000000080000000C100A121AB +:10C210008391A005000080000000800080000000E5 +:10C22000000080800000000000000000000000000E +:10C2300000000000000000000000000000010100FC +:10C2400000000000000000000000000000010100EC +:10C250000000008808009000A00002008800900103 +:10C260001084089100000000000000000000002081 +:10C270000000000802008200080082840000000024 +:10C280000000000000000800000008000000080096 +:10C29000A101A0899100000004000000C00002007C +:10C2A000000000009090000000000000000000006E :10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D +:10C2C00088000000100000000000000000000000D6 +:10C2D000880000000100000000000000000040A1F4 +:10C2E0000091899102090000000000000000010097 +:10C2F000008888000000000000000000000000002E +:10C3000000000000000000000000000041000000EC +:10C31000080000000001A1910000000000000100E1 +:10C32000000100000091000000000000000000007B :10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D +:10C340000000000000008900000000000000000064 +:10C35000000000000000410000000000000000009C +:10C3600080A10010899180C1000000000000000041 +:10C3700041000080000000000000000000000000FC +:10C38000000000000000000000000000210011007B +:10C39000000080092103050511A000000000000035 +:10C3A00021000020000300910000000000000000B8 :10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C +:10C3C000000000000011000000000000000000005C +:10C3D0000000000000110800000000000000000044 +:10C3E0000000A10840809180900000000300000040 +:10C3F00004000011000000800000000000000000A8 +:10C400000000000000000000000000002105118273 +:10C4100000000800809100808400841100000083E7 +:10C42000008000000040002000000000000000002C :10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C -:10C4A000000000000000000000000000000000008C +:10C4400000000000000000010000000000000000EB +:10C4500000000000000000010100000000000002D8 +:10C4600000C00000A10010C0919008000000000072 +:10C470000000000000010000004000000000000279 +:10C4800000020000000000000000000000000100A9 +:10C49000019100400100C009000241A08901000093 +:10C4A0000089000200000000000100000000000000 :10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C +:10C4C000000000000000000000E007008100000004 +:10C4D000000000000000000000E0000081410000BA +:10C4E000000000000000818100E0070088000000DB +:10C4F00000000000000000000000070082000000B3 :10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B +:10C51000884100E007000000884100E007000000BB +:10C520000041000007000000008100E0070000005B :10C5300000000000000000000000000000000000FB :10C5400000000000000000000000000000000000EB :10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB +:10C560000000000000000000DFDFDEDF006FF906E2 +:10C570000000000000000000000000000000F0F0DB :10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B +:10C5900000000000000000000000000000006666CF +:10C5A000000000000000000000000000000099668C +:10C5B000996600000000000000000000000000007C :10C5C000000000000000000000000000000000006B :10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA +:10C5E000000000000000000000008FDF8FDF69E620 +:10C5F0006F8000000000000000000000000000004C +:10C60000F0F000000000000000000000000000004A +:10C61000000000000000000000000000D4D45A5ABE +:10C62000666600000000000000000000000000003E +:10C63000FF00FF00000000000000000000000000FC :10C6400000000000000000000000000000000000EA :10C6500000000000000000000000000000000000DA :10C6600000000000000000000000000000000000CA @@ -113798,155 +113798,155 @@ :10C69000000000000000000000000000000000009A :10C6A000000000000000000000000000000000008A :10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A +:10C6C0000000000000000000000000000000020365 :10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 +:10C6E0000000000000000000000099999898BDB17A +:10C6F0003C306996966900000000000000000000D0 +:10C700000000FFFF00000000000030763030000025 +:10C7100000000000000000000000000000240024D1 +:10C72000000004040020F0D0000000000F0FFFFF05 +:10C73000000000003C3CC3C30000000000000000FB :10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000000B9 +:10C7500002030000000000000000000000000000D4 +:10C760000000000000000000000000009900980098 +:10C7700018181818619E9E6100000000000000005B :10C7800000000000000000000000000000000000A9 :10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 +:10C7A0000000000000000000F0F000000000999977 +:10C7B0000F0F000000003C3CC3C30000000000005D :10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 -:10C8300000000000000000000000000000000000F8 +:10C7D000000000600006000C0000000000000000E7 +:10C7E000000000400006000C0000000000000000F7 +:10C7F000000180210036C00D000000610006000D20 +:10C80000000005000A00054000A80000000000002C +:10C810000001000000000000000000000061003C7A +:10C82000C50D000110614036C01100000000003845 +:10C83000000000080061003E000900000000000048 :10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 +:10C850000000000000000000FFFF000000000000DA +:10C860000000000000000F0FFFFF000000000000AC +:10C8700000000000FF3CFF3C0000F0F03C003C00EA :10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 +:10C890000000000000000000000000000000FFC3D6 +:10C8A0003C00000000000C0C0C0C0000000000001C +:10C8B0000000000000000000000000080008000068 :10C8C0000000000000000000000000000000000068 :10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 +:10C8E00000000000000000000F0F0000000000002A +:10C8F0000000000000000F3CFF3CF000C0F03C00D6 +:10C900003C000000000000000000000000000000EB :10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 +:10C92000FFC33C00000000000000000000FF30CF0B :10C9300000000000000000000000000000000000F7 :10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 +:10C95000000000000000000000000000F0F00000F7 +:10C96000000000000000000000000000F0F00000E7 +:10C9700000000000000000000000F00F00000000B8 :10C9800000000000000000000000000000000000A7 :10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 +:10C9A000000014003C000000000000FA00C20C0C63 +:10C9B0000C06000000000000000000000000000065 :10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 +:10C9D0000000000000000000000000000000F0F077 +:10C9E0000000000000000000000000000000F0F067 +:10C9F00000000000000000000000C3C3FCF00000C5 :10CA00000000000000000000000000000000000026 :10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 +:10CA2000000000003C003C000000000000FA00FA9A +:10CA30000C0C0C0C000000000000000000000000C6 :10CA400000000000000000000000000000000000E6 :10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 +:10CA600000000004000000000000000004000000BE :10CA700000000000000000000000000000000000B6 :10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB000000000000000000000000008000000006E -:10CAC0000000000000000000000000040000000062 -:10CAD0000000000400040000000000080000000046 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 +:10CA90000000000000000000000000000003000093 +:10CAA0000000000000040000000000000000008002 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000040000000000000000210031 +:10CAE0001000400000000000000200000002800270 +:10CAF0000002000000000000000200000000000032 :10CB00000000000000000000000000000000000025 :10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 +:10CB30000040000000000000000000000000009025 :10CB400000000000000000000000000000000000E5 -:10CB500000040004000000000000000000000000CD +:10CB500000000000000000000000000000000000D5 :10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 +:10CB700004000000000000000000000000000000B1 :10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 +:10CB90000000000000000000000000000010000085 :10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 +:10CBC00000000080000000000040000000000000A5 :10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC600000040000000000000000000000000000C0 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 +:10CBE0000000000800000000000000080008000825 +:10CBF0000508800000000008000000080008000888 +:10CC00000008000800000000000000040008000800 +:10CC100000080000000000080000000800080008EC +:10CC20000084000000080000000000000008000868 +:10CC300000080408001000000008000000080008B8 +:10CC400000080010000800000000000000080008B4 +:10CC500000040008000000000008000000080008B0 +:10CC6000000400040000C0000000000000000000FC +:10CC7000000000000000000000000400840000002C +:10CC80000000000000000000000000200000000084 :10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 +:10CCA000000000080000000000000000000000007C +:10CCB000000000000021000000000000040000004F +:10CCC0000000000000080008000000000000000054 :10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 +:10CCF000000000000000000000000900000000002B +:10CD0000000000000000000000000000000000081B +:10CD10000082000000A000000000000000000000F1 +:10CD20000000000000000000030000000000000000 :10CD300000000000000000000000000000000000F3 :10CD400000000000000000000000000000000000E3 :10CD500000000000000000000000000000000000D3 :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 :10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 +:10CD9000000000000000000008000000000000008B :10CDA0000000000000000000000000000000000083 :10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 +:10CDC0000100000000000000000000000000010061 +:10CDD00000800000000000000000000000000000D3 :10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 +:10CDF0000000000000000000000011000000000022 :10CE00000000000000000000000000000000000022 :10CE10000000000000000000000000000000000012 :10CE20000000000000000000000000000000000002 :10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 +:10CE400000000400000000000000000000000000DE +:10CE500020000004000000000000000000000000AE :10CE600000000000000000000000000000000000C2 :10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 +:10CE9000000000000000000000000000000800008A :10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 +:10CEC00000000020000000000000000090000000B2 :10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 +:10CEE0000000000000000000000000000000400002 +:10CEF00000000084080000000000000000C00000E6 +:10CF00000000008400A021C0000000000000050017 :10CF10000000000000000000000000000000000011 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 +:10CF2000000000000084000000000000000000007D +:10CF3000000000000000000000C000000000000031 +:10CF400000000000000100000000000000000000E0 :10CF500000000000000000000000000000000000D1 :10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 +:10CF700000000000000000000000000000020000AF +:10CF8000040000000000000000000000000200009B :10CF90000000000000000000000000000000000091 -:10CFA0000000000000000000000000000000000081 +:10CFA000000000000000000000000000000000027F :10CFB0000000000000000000000000000000000071 :10CFC0000000000000000000000000000000000061 :10CFD0000000000000000000000000000000000051 :10CFE0000000000000000000000000000000000041 :10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 +:10D00000000080000002000000000000000000009E :10D010000000000000000000000000000000000010 :10D020000000000000000000000000000000000000 :10D0300000000000000000000000000000000000F0 @@ -113958,80 +113958,80 @@ :10D090000000000000000000000000000000000090 :10D0A0000000000000000000000000000000000080 :10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 +:10D0C00000000000000000009000000000000000D0 +:10D0D000000000000000010000000000000000004F :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 :10D10000000000000000000000000000000000001F :10D11000000000000000000000000000000000000F :10D1200000000000000000000000000000000000FF :10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF +:10D14000000000000000000011008000000000004E +:10D15000000000000000000011002100000000009D :10D1600000000000000000000000000000000000BF :10D1700000000000000000000000000000000000AF :10D18000000000000000000000000000000000009F :10D19000000000000000000000000000000000008F :10D1A000000000000000000000000000000000007F :10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F +:10D1C00000000000000000000000000000800000DF +:10D1D0000080000000000000000000410900000382 +:10D1E00000800000000000000000000000000000BF :10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E :10D21000000000000000000000000000000000000E :10D2200000000000000000000000000000000000FE :10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE +:10D2400000000000000000000000000000000020BE +:10D25000000000C00000000000000000000101000C +:10D260000000008800000000000000000000000036 :10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E +:10D28000000000000000000000000000010000009D :10D29000000000000000000000000000000000008E :10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E +:10D2C000000000000000000000000000000003005B +:10D2D000008888000100000000000000000000003D +:10D2E00088000000010000000000000000000000B5 :10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D +:10D3000000000000000000000000000000002000FD :10D31000000000000000000000000000000000000D :10D3200000000000000000000000000000000000FD :10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD +:10D350004100008000000900000000000000000003 +:10D36000000000000000410000000000000000007C :10D3700000000000000000000000000000000000AD :10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D +:10D39000000000020000000000000000000000008B :10D3A000000000000000000000000000000000007D :10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D +:10D3D00000000011000000800000000000000000BC +:10D3E000000000000011000020000000000000000C :10D3F000000000000000000000000000000000002D :10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C +:10D41000000000000001000000000000000000000B :10D4200000000000000000000000000000000000FC :10D4300000000000000000000000000000000000EC :10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC +:10D45000000000000001000000400000000000008B +:10D4600000000000000000010000000000000000BB :10D4700000000000000000000000000000000000AC :10D48000000000000000000000000000000000009C -:10D49000000000000000000000000000000000008C +:10D490000000000000000000070000000000000085 :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C +:10D4D00000000000000000000000070082210000A2 +:10D4E000000000000000000000E00000814100009A :10D4F000000000000000000000000000000000002C :10D50000000000000000000000000000000000001B :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB :10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB +:10D55000000000000000000000000000F0F00000EB :10D5600000000000000000000000000000000000BB :10D5700000000000000000000000000000000000AB :10D58000000000000000000000000000000000009B @@ -114039,7 +114039,7 @@ :10D5A000000000000000000000000000000000007B :10D5B000000000000000000000000000000000006B :10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B +:10D5D0000000000000000000000000000000F0F06B :10D5E000000000000000000000000000000000003B :10D5F000000000000000000000000000000000002B :10D60000000000000000000000000000000000001A @@ -114047,8 +114047,8 @@ :10D6200000000000000000000000000000000000FA :10D6300000000000000000000000000000000000EA :10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA +:10D650000000000000000000000000000000FFFFCC +:10D660000000FFFF000000000000000000000000BC :10D6700000000000000000000000000000000000AA :10D68000000000000000000000000000000000009A :10D69000000000000000000000000000000000008A @@ -114059,13 +114059,13 @@ :10D6E000000000000000000000000000000000003A :10D6F000000000000000000000000000000000002A :10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 -:10D7200000000000000000000000000000000000F9 +:10D710000000000000000000000000000000050004 +:10D7200000080000000000000000000000000000F1 :10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 +:10D7600005002A00054000A800000000000000009D +:10D7700000400006000C0000000000000000000057 :10D780000000000000000000000000000000000099 :10D790000000000000000000000000000000000089 :10D7A0000000000000000000000000000000000079 @@ -114073,7 +114073,7 @@ :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 :10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 +:10D7F000000000003C3CFFFF0000000000000000B3 :10D800000000000000000000000000000000000018 :10D810000000000000000000000000000000000008 :10D8200000000000000000000000000000000000F8 @@ -114081,7 +114081,7 @@ :10D8400000000000000000000000000000000000D8 :10D8500000000000000000000000000000000000C8 :10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 +:10D870000000000000003C3C000000000000000030 :10D880000000000000000000000000000000000098 :10D890000000000000000000000000000000000088 :10D8A0000000000000000000000000000000000078 @@ -114089,7 +114089,7 @@ :10D8C0000000000000000000000000000000000058 :10D8D0000000000000000000000000000000000048 :10D8E0000000000000000000000000000000000038 -:10D8F0000000000000000000000000000000000028 +:10D8F00000000000000000000000F0F00000000048 :10D900000000000000000000000000000000000017 :10D910000000000000000000000000000000000007 :10D9200000000000000000000000000000000000F7 @@ -114097,56 +114097,56 @@ :10D9400000000000000000000000000000000000D7 :10D9500000000000000000000000000000000000C7 :10D9600000000000000000000000000000000000B7 -:10D9700000000000000000000000000000000000A7 +:10D97000000000000000000000000000F0F00000C7 :10D980000000000000000000000000000000000097 :10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 +:10D9A0000000000000000000000000000000200057 +:10D9B00084000000000000000000000000000000E3 :10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000000037 +:10D9D0000000000000000000000100000000000046 +:10D9E000C000000000000000000400000000000073 :10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000000000000000412 -:10DA10000004000000000000000000000000000002 -:10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 +:10DA00000000000000000000000400000000000012 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000040000000B6 +:10DA300004000000000000000000000000000000E2 +:10DA400000000000000000000000000200000000D4 +:10DA500000020004000000000000000000000000C0 :10DA600000000000000000000000000000000000B6 :10DA700000000000000000000000000000000000A6 -:10DA8000000000000000000000000000000400048E -:10DA90000000000000000000000010000000000076 -:10DAA0000000000000000000000000000000000076 -:10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 -:10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000000000000085 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000010000000000000000000000000000066 +:10DAB000080008000500000004000000000000004D +:10DAC000000000000000000000000800000000004E +:10DAD000000000000000000000000800000000003E +:10DAE0000000000000100000000000000000000026 +:10DAF0000000000000000000000000000010000016 +:10DB00000000000000000000000000100000000005 +:10DB100000000000000000000000000000000008FD +:10DB200000080008000800000000000000000000DD +:10DB3000000800840000200804080008000800080D +:10DB400000080004000800000000000000000000C1 +:10DB5000000800000000200800080008000800007D +:10DB60000008000800080008000000000000000095 +:10DB7000000000080000000000080008000800087D +:10DB8000000800080004000400000000000000007D +:10DB90000000000200000000000800080004000867 :10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 -:10DBD0000000000000000000000000000000000045 +:10DBB0000000000000000000200000000000000045 +:10DBC000000020000008000000000000000000002D +:10DBD000000000000000900000000000C0000000F5 :10DBE0000000000000000000000000000000000035 :10DBF0000000000000000000000000000000000025 :10DC00000000000000000000000000000000000014 :10DC10000000000000000000000000000000000004 :10DC200000000000000000000000000000000000F4 -:10DC300000000000000000000000000000000000E4 +:10DC3000000010000000000000008800000000004C :10DC400000000000000000000000000000000000D4 :10DC500000000000000000000000000000000000C4 :10DC600000000000000000000000000000000000B4 :10DC700000000000000000000000000000000000A4 -:10DC80000000000000000000000000000000000094 +:10DC80000000000002000000000000000000000092 :10DC90000000000000000000000000000000000084 :10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 @@ -114162,32 +114162,32 @@ :10DD500000000000000000000000000000000000C3 :10DD600000000000000000000000000000000000B3 :10DD700000000000000000000000000000000000A3 -:10DD80000000000000000000000000000000000093 +:10DD8000000000000000000000000000000008008B :10DD90000000000000000000000000000000000083 :10DDA0000000000000000000000000000000000073 :10DDB0000000000000000000000000000000000063 :10DDC0000000000000000000000000000000000053 -:10DDD0000000000000000000000000000000000043 +:10DDD000000000000000000000000000000008003B :10DDE0000000000000000000000000000000000033 :10DDF0000000000000000000000000000000000023 :10DE00000000000000000000000000000000000012 :10DE10000000000000000000000000000000000002 :10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000000000000000E2 +:10DE300000000000000000000000000004000000DE :10DE400000000000000000000000000000000000D2 :10DE500000000000000000000000000000000000C2 :10DE600000000000000000000000000000000000B2 :10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000000000092 -:10DE90000000000000000000000000000000000082 +:10DE80000000008400000000000000C0000000004E +:10DE900000840000000000000000000000000000FE :10DEA0000000000000000000000000000000000072 :10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 +:10DEC00088000000000000000000000000000000CA :10DED0000000000000000000000000000000000042 :10DEE0000000000000000000000000000000000032 :10DEF0000000000000000000000000000000000022 -:10DF00000000000000000000000000000000000011 -:10DF10000000000000000000000000000000000001 +:10DF0000000000000000000000000000000200000F +:10DF100000000000000000000000000200000000FF :10DF200000000000000000000000000000000000F1 :10DF300000000000000000000000000000000000E1 :10DF400000000000000000000000000000000000D1 @@ -114206,7 +114206,7 @@ :10E010000000000000000000000000000000000000 :10E0200000000000000000000000000000000000F0 :10E0300000000000000000000000000000000000E0 -:10E0400000000000000000000000000000000000D0 +:10E0400000000000000000000000000000000500CB :10E0500000000000000000000000000000000000C0 :10E0600000000000000000000000000000000000B0 :10E0700000000000000000000000000000000000A0 @@ -114214,7 +114214,7 @@ :10E090000000000000000000000000000000000080 :10E0A0000000000000000000000000000000000070 :10E0B0000000000000000000000000000000000060 -:10E0C0000000000000000000000000000000000050 +:10E0C0000000000000000000000000000020000030 :10E0D0000000000000000000000000000000000040 :10E0E0000000000000000000000000000000000030 :10E0F0000000000000000000000000000000000020 @@ -114263,7 +114263,7 @@ :10E3A000000000000000000000000000000000006D :10E3B000000000000000000000000000000000005D :10E3C000000000000000000000000000000000004D -:10E3D000000000000000000000000000000000003D +:10E3D0000000000000000000000000E0000000005D :10E3E000000000000000000000000000000000002D :10E3F000000000000000000000000000000000001D :10E40000000000000000000000000000000000000C @@ -114312,7 +114312,7 @@ :10E6B000000000000000000000000000000000005A :10E6C000000000000000000000000000000000004A :10E6D000000000000000000000000000000000003A -:10E6E000000000000000000000000000000000002A +:10E6E0000000000000610007000D000000000000B5 :10E6F000000000000000000000000000000000001A :10E700000000000000000000000000000000000009 :10E7100000000000000000000000000000000000F9 @@ -114351,116 +114351,116 @@ :10E9200000000000000000000000000000000000E7 :10E9300000000000000000000000000000000000D7 :10E9400000000000000000000000000000000000C7 -:10E9500000000000000000000000000000000000B7 -:10E960000000000000000000200000000000000087 -:10E970000000000000000000000000000000000097 -:10E980000000000000000000200000000000000067 -:10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000020000000000047 -:10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000020000000000027 -:10E9D000000000000008000000000000000000002F -:10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 +:10E950000000000000000000200000000000000097 +:10E960002000000000000000000000000004000083 +:10E970000000000020000000200000000000000057 +:10E980002000000000000000000010000000004017 +:10E990000000000000000003000020000000000054 +:10E9A0000000200000000000000000002000002007 +:10E9B0000000000000000000000020000000000037 +:10E9C0000000200000000000000000000000000027 +:10E9D000000000000004000000040000000000002F +:10E9E00000000000000000900090000000900090E7 +:10E9F00000000000000000000000000000000040D7 :10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 -:10EA200000000000000000000000000000000000E6 -:10EA300000000000000000000000000000000000D6 +:10EA100000010000000000000000000000000000F5 +:10EA20000000000000000000000000C000400000E6 +:10EA300000010000000200000002009000A00000A1 :10EA400000000000000000000000000000000000C6 :10EA500000000000000000000000000000000000B6 -:10EA600000000000000000000000000000000000A6 -:10EA70000000000000000000000000000000000096 -:10EA80000000000000000000000000000000000086 +:10EA600002000000000000000000000000000000A4 +:10EA7000000000080000000000000000000000008E +:10EA8000000000000000080000000000000000007E :10EA90000000000000000000000000000000000076 :10EAA0000000000000000000000000000000000066 -:10EAB0000000000000000000000000000000000056 +:10EAB0000000001000000000000004000000000042 :10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000000000000026 -:10EAF0000000000000000000000000000000000016 -:10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 +:10EAD0000000008000000000000000000084000032 +:10EAE0000004000000040000000000040900090008 +:10EAF00000000008000000000000040800400000C2 +:10EB00000000000000020000000000000000000003 +:10EB100000000004000800000000000800000000E1 :10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000000000D5 +:10EB30000000410000080008000000000004400040 :10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 +:10EB50000000000000200008000000000000040089 +:10EB60000000000000000008000000000000000598 :10EB70000000000000000000000000000000000095 :10EB80000000000000000000000000000000000085 :10EB90000000000000000000000000000000000075 :10EBA0000000000000000000000000000000000065 :10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000000045 +:10EBC0001000000000050000000000000000000030 :10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 -:10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 +:10EBE00080000000000000000000000000000000A5 +:10EBF0000300000000000000000000000000000012 +:10EC000000000000000000000020000000000000E4 +:10EC100000000000000000000000000000000800EC :10EC200000000000000000000000000000000000E4 :10EC300000000000000000000000000000000000D4 :10EC400000000000000000000000000000000000C4 :10EC500000000000000000000000000000000000B4 -:10EC600000000000000000000000000000000000A4 +:10EC60000000C100C0000000000000000000000023 :10EC70000000000000000000000000000000000094 :10EC80000000000000000000000000000000000084 :10EC90000000000000000000000000000000000074 -:10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 -:10ECC0000000000000000000000000000000000044 -:10ECD000000000000008000000000010000000001C -:10ECE0000000000010000000000000001000000004 +:10ECA0000100000000000000000000000000000063 +:10ECB00000000000000000008400000000000000D0 +:10ECC0000000000000400000000000000000000004 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000004000000000000000000000020 :10ECF0000000000000000000000000000000000014 -:10ED00000000000000000000000000000000000003 +:10ED000000000000000000000000000010000000F3 :10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 +:10ED200000000400000000000000000000000000DF :10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 +:10ED400000000000000000000000030000000000C0 +:10ED5000410000000000000000000800000000006A :10ED600000000000000000000000000000000000A3 :10ED70000000000000000000000000000000000093 :10ED80000000000000000000000000000000000083 :10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 +:10EDA0000000002000000000000000000000000043 :10EDB0000000000000000000000000000000000053 -:10EDC0000000000000000000000000000000000043 -:10EDD0000000000000000000000000000000000033 -:10EDE0000000000020000000000000000000000003 +:10EDC000000000000000000000000000040020001F +:10EDD000000000000000000000000008000000002B +:10EDE0000000000000000000000000000000000023 :10EDF0000000000000000000000000000000000013 :10EE00000000000000000000000000000000000002 -:10EE100000000000000000000000000000000000F2 -:10EE200000000000000000000000000000000000E2 +:10EE100000000000000000000000000000000008EA +:10EE200000000000000100000000000000000000E1 :10EE300000000000000000000000000000000000D2 :10EE400000000000000000000000000000000000C2 :10EE500000000000000000000000000000000000B2 :10EE600000000000000000000000000000000000A2 -:10EE70000000000000000000000000000000000092 -:10EE80000000000000000000000000000000000082 +:10EE7000000000080000000000000000000000008A +:10EE80000000004000000000000000000000000042 :10EE90000000000000000000000000000000000072 :10EEA0000000000000000000000000000000000062 :10EEB0000000000000000000000000000000000052 :10EEC0000000000000000000000000000000000042 -:10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 +:10EED000000000000000000000030000000000002F +:10EEE0000000000000000000000000000208000018 :10EEF0000000000000000000000000000000000012 :10EF00000000000000000000000000000000000001 :10EF100000000000000000000000000000000000F1 :10EF200000000000000000000000000000000000E1 :10EF300000000000000000000000000000000000D1 :10EF400000000000000000000000000000000000C1 -:10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 +:10EF5000000000000000000000004100000200006E +:10EF6000000005000000000000000000000000009C :10EF70000000000000000000000000000000000091 :10EF80000000000000000000000000000000000081 :10EF90000000000000000000000000000000000071 -:10EFA0000000000000000000000000000000000061 +:10EFA0000000000000000000908800000000000049 :10EFB0000000000000000000000000000000000051 :10EFC0000000000000000000000000000000000041 :10EFD0000000000000000000000000000000000031 :10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 +:10EFF0000900000000000000000000000000000008 :10F000000000000000000000000000000000000000 :10F0100000000000000000000000000000000000F0 -:10F0200000000000000000000000000000000000E0 +:10F02000000000000000000011008000000000004F :10F0300000000000000000000000000000000000D0 :10F0400000000000000000000000000000000000C0 :10F0500000000000000000000000000000000000B0 @@ -114468,40 +114468,40 @@ :10F070000000000000000000000000000000000090 :10F080000000000000000000000000000000000080 :10F090000000000000000000000000000000000070 -:10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000000050 +:10F0A00000000000000000000000000000800000E0 +:10F0B00000800000000000000000000000000000D0 :10F0C0000000000000000000000000000000000040 :10F0D0000000000000000000000000000000000030 :10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 :10F1000000000000000000000000000000000000FF :10F1100000000000000000000000000000000000EF -:10F1200000000000000000000000000000000000DF -:10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000000000000000BF +:10F1200000000000000000000000000000000020BF +:10F13000000000C00000000000000000000000000F +:10F1400000000000000000000000000000020000BD :10F1500000000000000000000000000000000000AF -:10F16000000000000000000000000000000000009F +:10F160000000000000000000000000000088000017 :10F17000000000000000000000000000000000008F :10F18000000000000000000000000000000000007F :10F19000000000000000000000000000000000006F -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000000000000000000000004F +:10F1A000000000000000000000000000000001005E +:10F1B000008888000100000000000000000000003E :10F1C000000000000000000000000000000000003F :10F1D000000000000000000000000000000000002F :10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F +:10F1F000000000000000000003000000000000000C :10F2000000000000000000000000000000000000FE :10F2100000000000000000000000000000000000EE :10F2200000000000000000000000000000000000DE -:10F2300000000000000000000000000000000000CE +:10F230004100008000000900000000000000000004 :10F2400000000000000000000000000000000000BE :10F2500000000000000000000000000000000000AE :10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E +:10F270000000000000000000000000050021000068 :10F28000000000000000000000000000000000007E :10F29000000000000000000000000000000000006E :10F2A000000000000000000000000000000000005E -:10F2B000000000000000000000000000000000004E +:10F2B00000000011000000800000000000000000BD :10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E :10F2E000000000000000000000000000000000001E @@ -114509,23 +114509,23 @@ :10F3000000000000000000000000000000000000FD :10F3100000000000000000000000000000000000ED :10F3200000000000000000000000000000000000DD -:10F3300000000000000000000000000000000000CD +:10F33000000000000001000000400000000000008C :10F3400000000000000000000000000000000000BD :10F3500000000000000000000000000000000000AD :10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D -:10F38000000000000000000000000000000000007D +:10F37000000000000000000000000000000000414C +:10F380000000070000000000000000000000000076 :10F39000000000000000000000000000000000006D :10F3A000000000000000000000000000000000005D -:10F3B000000000000000000000000000000000004D +:10F3B00000000000000000000000070082210000A3 :10F3C000000000000000000000000000000000003D -:10F3D000000000000000000000000000000000002D +:10F3D0000000000007000000000000000000000026 :10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D +:10F3F0000000000007000000000000000000000006 :10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC :10F4200000000000000000000000000000000000DC -:10F4300000000000000000000000000000000000CC +:10F43000000000000000000000000000F0F00000EC :10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C @@ -114533,7 +114533,7 @@ :10F48000000000000000000000000000000000007C :10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C -:10F4B000000000000000000000000000000000004C +:10F4B0000000000000000000000000000000F0F06C :10F4C000000000000000000000000000000000003C :10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C @@ -114541,8 +114541,8 @@ :10F5000000000000000000000000000000000000FB :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB -:10F5300000000000000000000000000000000000CB -:10F5400000000000000000000000000000000000BB +:10F530000000000000000000000000000000FF00CC +:10F540000000FFFF000000000000000000000000BD :10F5500000000000000000000000000000000000AB :10F56000000000000000000000000000000000009B :10F57000000000000000000000000000000000008B @@ -114550,19 +114550,19 @@ :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B :10F5B000000000000000000000000000000000004B -:10F5C000000000000000000000000000000000003B +:10F5C000FF0000000000000000000000000000003C :10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA +:10F6000000000000000000000500003800000000BD :10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA :10F6300000000000000000000000000000000000CA -:10F6400000000000000000000000000000000000BA +:10F6400005002A00054000A800000000000000009E :10F6500000000000000000000000000000000000AA -:10F66000000000000000000000000000000000009A +:10F6600000A00000000000000000000000000000FA :10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A +:10F6800000A00000000000000000000000000000DA :10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A :10F6B000000000000000000000000000000000004A @@ -114595,194 +114595,194 @@ :10F860000000000000000000000000000000000098 :10F870000000000000000000000000000000000088 :10F880000000000000000000000000000000000078 -:10F890000000000000000000000000000000000068 -:10F8A0002000000000000000000000000000000038 -:10F8B0000000000000000000000000000000000048 -:10F8C0002000000000000000000000000000000018 -:10F8D0000000000000000000000000000000000028 -:10F8E00000002000000000000000400000000000B8 -:10F8F0000000000000000000000000000000000008 -:10F9000000002000000000000000200000000100B6 -:10F9100000000000000000000000000000000000E7 +:10F890000000010001000000040000002000000042 +:10F8A0000000200000000000000000000000000038 +:10F8B0002000000000000000200000000000000008 +:10F8C0000000200000000004000000000000000014 +:10F8D00000000003000000004000200004100000B1 +:10F8E00004000000200000000000000000000000F4 +:10F8F0000000000400000000000000000000000004 +:10F9000000000002200000000004000400000000CD +:10F91000000000044000400000000000000000A0C3 :10F9200000000000000000000000000000000000D7 :10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 -:10F9500000000000000000000000000000000000A7 -:10F960000000000000000000000000000000000097 -:10F970000000000000000000000000000000000087 +:10F9500000000000000000000000000000000001A6 +:10F960000000800000000000000000000000000017 +:10F970000000000000000000002000000002000065 :10F980000000000000000000000000000000000077 -:10F990001000000000000000000000000000000057 -:10F9A0000000000000000000000000000000000057 -:10F9B0000000000000000000000000000000000047 -:10F9C0000000000000000000000000000000000037 -:10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000000000000000017 -:10F9F0000000000000000000000400000000000003 -:10FA000000000000000000000000000000000000F6 -:10FA100000040000000000000000000000000000E2 -:10FA200000000000000000000000000000000000D6 -:10FA300000000000000000000000000000000000C6 -:10FA400000000000000000000000000000000000B6 -:10FA500000000000000000000000000000000000A6 -:10FA60000000000000000000000000000000000096 -:10FA70000000000000000000000000000000000482 -:10FA8000000000000008000800080000000000005E -:10FA900000840000000000000000000000000000E2 -:10FAA0000000000000000000000000000000000056 -:10FAB0000000000000000000000000000000000046 -:10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000000026 -:10FAE0000000000000000000000000000000000016 -:10FAF0000000000000000000000000000000000006 -:10FB000000020000000000000000000000000000F3 +:10F99000000000000000000004020000000000055C +:10F9A00000000000000000800000000000000000D7 +:10F9B00000000000000002000200004000000400FF +:10F9C0000400000000000000000000000010000023 +:10F9D0000000000000000000000000000004000023 +:10F9E000000000000000008000000000000800008F +:10F9F00000000008001000000000000000000000EF +:10FA00000000002000000182000001000000000250 +:10FA100000000000000000000008808500080008C9 +:10FA20000004000800080008000800820008000028 +:10FA3000008200080082000800040004000800089A +:10FA40000008000800080008000000840008008486 +:10FA50000008008200000084000000000000000890 +:10FA600000080008009000080220000000000004C8 +:10FA700000000008000000000000000000000082FC +:10FA800000820908000900900821000008004108D0 +:10FA90000001000800080000000000000000000055 +:10FAA0000000000800000000002100000008000025 +:10FAB0000008000800000000002100000000000015 +:10FAC0000000000000000000002100000000000015 +:10FAD00000000000000000000040000000000005E1 +:10FAE0000000000500000000000000080000000009 +:10FAF00000000000000000400000000000000000C6 +:10FB00000000000000000000018000000000000074 :10FB100000000000000000000000000000000000E5 :10FB200000000000000000000000000000000000D5 :10FB300000000000000000000000000000000000C5 :10FB400000000000000000000000000000000000B5 :10FB500000000000000000000000000000000000A5 -:10FB60000000000000000000000000000000000095 +:10FB60000000000000000000090009000000000083 :10FB70000000000000000000000000000000000085 -:10FB80000000000000000000000000000000000075 -:10FB9000000000000000090000000000000000005C -:10FBA0000000000000000000000000000000000055 -:10FBB0000000000000000000000000000000000045 +:10FB80000000000000000000000004200000000051 +:10FB90000000000000000000000000000000000065 +:10FBA000000000000009000000000000000000004C +:10FBB00000000100008000000000000000000000C4 :10FBC0000000000000000000000000000000000035 -:10FBD0000000000000000000000000000000000025 -:10FBE0000000000000000000000000000000000015 -:10FBF0000000000000000000000000000000000005 -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 -:10FC2000000000000000000040000000080000008C -:10FC30004000000000000000000000000000000084 +:10FBD000000000000000000000000000080000001D +:10FBE00084000000000000008420040000400400A5 +:10FBF0000000C000000000008200820010008200AF +:10FC00000000000000000000022000000010004082 +:10FC100000000009000000000000000000020000D9 +:10FC200000000000000000000000000003000000D1 +:10FC300000000000200000040000000000000000A0 :10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000000000000000A4 -:10FC6000000000000000000800000000000000008C -:10FC700000080000000000A0000800000000008252 -:10FC8000000000000000000000080000000000006C -:10FC9000100800000000000000A00000000000822A -:10FCA000000800000000000000000000000000004C -:10FCB0000000000000000000000000000000000044 +:10FC50004000000000000000000000000000000064 +:10FC6000000000000000000000000500800000010E +:10FC70008000000000000000000000000000000004 +:10FC800000000000000000000800830100000001E7 +:10FC9000000100000000000000000500000000005E +:10FCA0000000000000000000000000000000000054 +:10FCB00090000000000000000000000000000000B4 :10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 -:10FCE0000000000000000000000000000000000014 -:10FCF0000000000000000000000000000000000004 -:10FD000000000000000000080000000000000000EB -:10FD100000000000000000000000000000002000C3 +:10FCE0000000000090000000100000000000040070 +:10FCF00004200000000000000000000000000020C0 +:10FD000000000000A0000000080040000000A0006B +:10FD100000040200000000000000000000000000DD :10FD200000000000000000000000000000000000D3 :10FD300000000000000000000000000000000000C3 :10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000000000000000000093 -:10FD70000000000000000000000000000000000083 +:10FD6000000400840000000000000000000000000B +:10FD70008000800100000000000000000000000082 :10FD80000000000000000000000000000000000073 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000000000000000053 +:10FD9000000000008000000000000000008800005B +:10FDA0000000000000000000000800000000000249 :10FDB0000000000000000000000000000000000043 :10FDC0000000000000000000000000000000000033 -:10FDD0000000000000000000000000000000000023 -:10FDE0000000000000000000000000000000000013 -:10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000000000000000F2 -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000001000000000000000000D1 +:10FDD000080000000000000000000000000000001B +:10FDE0000000000000000000000000000000000211 +:10FDF00000000008000000100000000000030000E8 +:10FE00001000000000000000000082000000000060 +:10FE10008400C08008000000000000000000000016 +:10FE200000000000000200000000000000000000D0 :10FE300000000000000000000000000000000000C2 :10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 +:10FE50000000000000000000000021000000000081 :10FE60000000000000000000000000000000000092 -:10FE70000000000000080008000000000000000072 +:10FE70000000000000000000000000000000000082 :10FE80000000000000000000000000000000000072 -:10FE90000000000000080008000000000000000052 -:10FEA0000000000000000000400000000000000012 -:10FEB0000000000000000000000000000000000042 +:10FE900000000890001008000000000000000000B2 +:10FEA0000000000000000000000000A020C00002D0 +:10FEB00000820000000000000000010000000000BF :10FEC0000000000000000000000000000000000032 :10FED0000000000000000000000000000000000022 :10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 +:10FEF00000000000109000900008908800000000B2 :10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000000000000000E1 -:10FF200000000000000000000200000000000000CF -:10FF300000000000000000000000000000000000C1 +:10FF100000000000C0C090209040209010A00088F9 +:10FF200010101008000000000000000000800040D9 +:10FF3000008300C00000000000000000110021004C :10FF400000000000000000000000000000000000B1 :10FF500000000000000000000000000000000000A1 :10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 +:10FF70000000000000009000000000800000000071 :10FF80000000000000000000000000000000000071 -:10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000080000000000000049 -:10FFB0000000000000000000000000000000000041 -:10FFC0000000000000000000000000000000000031 +:10FF90000000000000009180808000000080008050 +:10FFA000050000000000000000000000000000004C +:10FFB00000100000000000000000000000000041F0 +:10FFC0000900000300000000000000000000000025 :10FFD0000000000000000000000000000000000021 :10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 +:10FFF000000000000000000000000003000080007E :02000004001CDE :1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 +:10001000000000000000000090008300A00010809D +:1000200080000010800000000000000000000000C0 +:1000300000000001000000000000000000000000BF +:1000400000010100000000000000000000000000AE :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 +:100070000000000000000000000090009000082038 +:1000800090000000000000000000000000000000E0 +:1000900000000000000000000000890004200200B1 +:1000A00001020400A001A000900000000000000078 +:1000B0000000080000000000200000000000000018 +:1000C00000000000880000000100000000000000A7 :1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 -:1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000010001CD -:1001300000000001000000000000000000000000BE -:1001400000000000000000000000000000000000AF +:1000F000000000000000000000000000C090009020 +:1001000000080240000000000000000000000000A5 +:100110000000000000000000000000000188004115 +:10012000820140C18811000900080082000000001F +:10013000000000008000200000000000000000001F +:10014000000000000000000000001000000000009F :10015000000000000000000000000000000000009F :10016000000000000000000000000000000000008F -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A0000000000000000000000000000000000847 -:1001B00000080008004100000000000000000000EE -:1001C000000000000000000000000000000000002F +:1001700000000000000000000000000000008000FF +:1001800000000000830000000000000000000000EC +:1001900000000000000000000000000000004020FF +:1001A00000100021008800080002008800A0000064 +:1001B00000000000000021000000200000000000FE +:1001C000000000000000000000110000000000001E :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE +:10020000800000008080000000000000000000006E :1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE +:100220000008000800800003000080A0008000009B +:1002300000000000000000004100400041000200FA +:1002400000000000000000000000000100000000AD :10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E +:100280000000C0000288840240000000000000005E :10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E +:1002A000000000A000880090000020008802880460 +:1002B00040000000000000000000000000000700F7 +:1002C00000000000000000000000000000E000004E +:1002D000810000000000000000000000000000009D :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED +:100300000000000000410000070041000000000064 :1003100000000000000000000000000000000000DD -:1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD +:1003200000000000008100000700820000000000C3 +:10033000000000000000000000000000000C0000B1 :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D -:10038000000000000000000000000000000000006D +:100380000000000000009999F0F000FF004E00000E :10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D -:1003B000000000000000000000000000000000003D +:1003A00000000000000000000000242442420F0F63 +:1003B0000F0F007E007F0000000000000000000022 :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD -:1004000000000000000000000000000000000000EC +:100400000000000000000000C3C3FF0000FF006206 :1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC +:10042000000000000000000000000000202040400C +:1004300000000F0C00FF00FF0000000000000000A3 :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C @@ -114791,234 +114791,234 @@ :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C -:1004C000000000000000000000000000000000002C +:1004C0000000FF40FFC0000000000000000000002E :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC -:1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000000AB +:10050000000000000000000000000000C2C2C3C0E4 +:10051000103091F300000000000000000000000017 +:100520000000000000000000000000002C00002C73 +:10053000C242C242FFFF000060F066FF0000000000 +:1005400000000000FF00FFC00000000000000000ED :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B -:10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B +:100580000000000000000000000000000000C2C2E7 +:10059000C0C2000089CF0000000000000000000081 +:1005A00000000000000000000000000000002C001F +:1005B000002CC3C3C3C3F3F0000062F366FF000066 +:1005C00000000000000000610006000D00000000B7 +:1005D00000000000000000600006000C00000000A9 :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA +:10061000A00000300000000000000000000000000A :1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:1006400000610006000D0000000000000000000036 -:10065000000000000000000000000000000000009A +:1006300005615A3E059D00A000610006000D000105 +:10064000000000000000000000000F0F000000008C +:10065000000000000000000000000000FFFF00009C :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A -:1006C00000000000000030BA00AA00000000000096 +:1006B00000000000000055100000000000005F5F17 +:1006C0005F00000000000000000000000F0F0000AD :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:10074000000000000000000000AA30BA0000000015 +:100730000000000000000000551000000000000054 +:100740005F5F434300000000000000000080008065 :100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 +:10076000F0F00000000000000000000000000000A9 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 -:1007E0000000000000000000000000000000000009 +:1007B00000000000000000000000DF00D300000087 +:1007C00000000000000000000000000000000080A9 +:1007D0000080000000000000000000000000000099 +:1007E0000000F0F000000000000000000000000029 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 +:10083000000000000000000000000000DFDFD3D354 :1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000100068 -:100880000000000000000000000000000000000068 -:100890000003000000000000000000000000000055 +:100850000000000000000000200000000000000078 +:100860002002200000080000000400000000000436 +:100870008800000000000004880000000000040060 +:100880000000200000000000000000000000000048 +:100890000003200040000000000420000000880049 :1008A0002000000000000000000000000000000028 -:1008B0001000000000000000000000000000000028 -:1008C0002000000000000000840000000000000084 -:1008D0001000000000000000000000000000000008 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 +:1008B0000000000000000000000020008800200070 +:1008C000880300000000000000000000000000009D +:1008D00000000008000000000000000000200000F0 +:1008E00000840020008400840000210000840000B7 +:1008F00000000000000000000002000000000000F6 :1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 +:1009100000000000000000002100000000000000B6 +:10092000000000002100000000C0000000000000E6 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 +:100950000000000000000000000000000010000087 +:100960000000000000400000000000000000000047 :100970000000200000000000000000000000000057 -:100980000000000000000000000000000000000067 -:100990000000200000000000000000000000000037 +:100980000000000000000000000000050000000062 +:100990000000200000000005000000000000000032 :1009A0000000000000000000000000000000000047 -:1009B0000000100021000000000000000000000006 -:1009C0000000000000000000000000000000000027 -:1009D000000010004100000000840000000000083A -:1009E0000000000000000000000000000000000007 -:1009F000000000008000000000000000000000086F -:100A000000000000000000000000000000000000E6 -:100A100000000088800000000000000000000000CE -:100A200000080000000800000000000000000000B6 -:100A3000000000008000C000000000000000000076 -:100A4000000800000084000000000000000800888A -:100A5000000800088000A0080021002100210000FB -:100A60000000000000210000000400090004000054 -:100A7000000000000008000000000000000000006E -:100A8000000000000008000000000000000000005E -:100A90000000000000000000000000000000000056 -:100AA0000011000000000000000000000000000035 -:100AB00000000021000000210000000800210021AA -:100AC0000008002100210003000000000021002197 -:100AD00000080021002100200000000000000000AC +:1009B000000000002000000800000000000000000F +:1009C000000000000000000800000000000000001F +:1009D00000000000200000000008008400080084DF +:1009E00000080008000800080008000200840084D5 +:1009F00000840084800800040008000800840008C7 +:100A000000840008008200080008000800080008B0 +:100A100000840008808400000004000840840084F2 +:100A20000084008400080008000800080084408456 +:100A3000000800840008800800040008000000008E +:100A40000008008400040002000200080084008402 +:100A50000008000800088008004000210021002153 +:100A60000003000000000021820084210021820494 +:100A7000C008000000000021000000210021000843 +:100A800000210003000300040000002100040020F6 +:100A90000021000800000000000000080021000004 +:100AA0000010000800080000000500050004000810 +:100AB000002000210008000000000040880000081D +:100AC00000400003000800000000000000000000DB +:100AD0000000000000050000000000000000000011 :100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 +:100AF00000000000000800000000000800000040A6 :100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B4000000000000000000000080000000000009D -:100B50000000000000000000000000000000000095 -:100B60001000000000000000000000000000000075 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB000000000000000000000000000000800002D -:100BC0000000000000000000000000000000000025 -:100BD000000000000000000000000000000800000D -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 +:100B10000000030000000000000000001000004082 +:100B20004100000000000000000000400000000044 +:100B30000000000000000000000000000500200090 +:100B40004000100000001100100805080900000016 +:100B50000000000400040090009000008200820069 +:100B60000000100000000000000000008200820071 +:100B700040008200C00000000000000082008200EF +:100B80008200820008000000000000000009080048 +:100B90008200820040000000840000000000080085 +:100BA000820082008200820000000000000000003D +:100BB0000800820082008200C0000000840008005B +:100BC00082008200820082000000001190098200F1 +:100BD000000082008200820000000000000000008F +:100BE00000000008000000080000000000000000F5 +:100BF0000000000000000800008200080000000063 +:100C000000000000000000000008000000080000D4 +:100C100000000500000000000000000000080000C7 :100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000001B3 -:100C400000000000000000000000000000000000A4 -:100C500000000000000000000000000000A00001F3 -:100C60000040000000000000000000000000000044 -:100C70000000000000000000000000000000000074 -:100C800000000000000000000200000090000000D2 -:100C90000000000000000000000000000000000054 -:100CA00000000000000000009000000000000000B4 -:100CB0000000000000000008000000009008000094 -:100CC0000008000000000000900000000000000884 -:100CD000000000000008000800000000900800006C -:100CE00008080000000000000000000000000000F4 -:100CF00000000000000000000000000000000000F4 +:100C300000000000000000001000000000000000A4 +:100C400005000800040000080000009000000800F3 +:100C50000020000000000000000000000000000074 +:100C6000000000000000000000000000080000007C +:100C7000000040000000000800000000000000002C +:100C80000040000000000000000000000000000024 +:100C90000821004000000000000000000000C0002B +:100CA00000000002000000000000000000008200C0 +:100CB00000000000000040000000000000000000F4 +:100CC000000000000000000000000000000008001C +:100CD00000110000000000000008000000000000FB +:100CE00000000800000000000000000000000000FC +:100CF00000C000000000118400000000000000009F :100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000009003 -:100D600000880400000000000000000000000000F7 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000008000823 -:100DC00000210000004100000000000000210000A0 -:100DD00000000000000000000000000000410008CA -:100DE00000210003000000000000000000000000DF +:100D10000000000000000000000000900000000043 +:100D20000000000000000000000000004004090076 +:100D3000098802040000000000000000000000001C +:100D400000000000000000000000000011040590F9 +:100D500011900500110200020588009000000000BB +:100D6000000000000008000000000000000000007B +:100D70000000000000000000000000000000002152 +:100D800000020000000000000000000082000000DF +:100D9000000000000000000000000000000500034B +:100DA000000000000000002100000000000008001A +:100DB0000000000000000000000000000008000526 +:100DC0000000000000000003000000000000080018 +:100DD000820000008200000000000000000000000F +:100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 +:100E000000000000000004000020000000000000BE :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 :100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E700000000000000000000001010000840000EC +:100E40000000000000000000200000000000000082 +:100E500000000988090008020000000000000000EE +:100E6000000005000000030000000000000000007A +:100E700001000000000000000000000000C00000B1 :100E80000000000000000000000000000000000062 -:100E900001000000000000000001000000C0000090 +:100E900001000000000000000000010000C0000090 :100EA0000000000000000000000000000000000042 -:100EB00000000000000000000088000000000004A6 -:100EC0000808000000000001000000000000000011 -:100ED0000000000000000000008800000000000486 -:100EE000C010000000000001000000000000000031 -:100EF0000000000000000000000000020800008068 +:100EB000000001000000000000000000010000C070 +:100EC0000000000000000000000000000000000022 +:100ED000000001000000000000000001010000C04F +:100EE0000000000000000000000000000000000002 +:100EF000000041000000000000000010030000801E :100F000000000000000000000000000000000000E1 -:100F100000004100000000000000080841000080BF +:100F100000004100000000000000000908000080FF :100F200000000000000000000000000000000000C1 -:100F30000000000400000000000409000009110086 -:100F40000000808000000000004100000000000060 -:100F50000000000411000000004109000009110018 -:100F600000008000000000000041000000001000B0 -:100F70000000000000000000000000000800080061 -:100F8000000000000000000000000002000003005C -:100F90000000008000008000000000001000210020 -:100FA00000908000000000000000004100000000F0 -:100FB0000800000000000000100000000200110006 -:100FC0009000000009000000000000008008000000 -:100FD00008000000000000001000000011001100D7 -:100FE00090000000040000000000000080410000AC -:100FF0000000000000000000000000000000900061 -:10100000092000902008820000000000000000007D -:101010000100000000C00000200000000000880067 -:101020009008008502080200000000000001000096 -:1010300000000100000000000000000000000000AF -:10104000C000080200000000020000000000C00113 -:10105000000001000000000000000000000000008F -:10106000C000080200000100020000000000C001F2 -:101070000000000000000000000000000000000070 -:101080000020000000000000000000000000000040 +:100F3000000000004100000000000000000908005F +:100F40000080000000000000000000000000000021 +:100F5000000000004100000000000000001003003D +:100F600000800000000000000000000000000300FE +:100F70000000008000008000000000000200C000AF +:100F8000000000000000000000000041000003001D +:100F90000000008000008000000000000800408089 +:100FA0000000000000000000000000410000000000 +:100FB000030000000080000080000000000002002C +:100FC00040000000000000000000000000410000A0 +:100FD000030000000080000080000000000002000C +:100FE0004000000000800000000000000041000000 +:100FF0000100000000C000002000000000004000D0 +:1010000008200082400008000000000000010000ED +:101010000100000000C000002000000000004000AF +:1010200002080040400082000000000000010000B3 +:1010300000000100000000C00000200000000000CF +:10104000410002200040400040000000000000017C +:1010500000000100000000C00000200000000000AF +:101060004100082000404004400000000000000152 +:1010700000000000C00000000000000000000000B0 +:1010800000880000000000000000000000000000D8 :1010900000000000C0000000000000000000000090 -:1010A000009000001000010000000000000000009F -:1010B000000000000000000000000000000000012F -:1010C0001000008800001100000000000000000176 -:1010D000000000000000000000000000000000010F -:1010E0001000008800001000000000000000000157 -:1010F00000000000000000000000000000000000F0 +:1010A00000880000000000000000000000000000B8 +:1010B000000000000000C000000000000000000070 +:1010C000000000020000000000000000000000001E +:1010D000000000000000C000000000000000000050 +:1010E00000000002000000000000000000000000FE +:1010F0000000000000008000000000000000000070 :1011000000000000000000000000000000000000DF :10111000000000000000800000000000000000004F -:1011200000000000000000000800000000000000B7 -:1011300000000000000000000000000000000000AF -:1011400000400004000000008500090000000000CD -:10115000004100000000000000000000000000004E -:101160000040000400000000C1000000000000007A -:10117000004100000010800000C1000000000000DD +:1011200000000000000000000000000000000000BF +:10113000000000000000000080000000000000002F +:10114000000000000080000000000000000000001F +:10115000000000000000000080000000000000000F +:1011600000000000008000000000000000000000FF +:10117000000000000000800000C10000000000002E :10118000000000000041000000020000000000001C :10119000000000000000800000C10000000000000E -:1011A0000000000000C180000005000000000000F9 -:1011B0000000000000000008800000C100000002E4 -:1011C00080004100000000C100000002000000009B -:1011D0000000000009030008800000C100000002B8 -:1011E00080004100000000840000000200000000B8 -:1011F0000000000008030000200000400000000084 -:10120000000000000000009140000001000000000C +:1011A0000000000000C10000000800000000000076 +:1011B0000000000000000000800000C100000000EE +:1011C00000000000000000C1000000080000000056 +:1011D0000000000000000000800000C100000000CE +:1011E00000000000000000C18000000800000000B6 +:1011F0000000000000000000400000C100000000EE +:1012000000000000000000090200000000000000D3 :101210000000000000000000400000C100000000CD -:10122000000000000000000340000001000000007A -:10123000000000000000000000012000004000004D -:101240000000020010000000004102000000000049 -:1012500000000000000000880001200000400000A5 -:101260000000020010000000004102000000000029 -:10127000000000000000011000000000000000005D -:101280000000000000000000810000E000004800B5 -:10129000000000000000000000000000000000420C +:1012200000000000000000050200000000000000B7 +:1012300000000000000000000000400000C10000AD +:101240000000000000000000000508000000000091 +:1012500000000000000000000000400000C100008D +:101260000000000000000000000504000000000075 +:10127000000000000000000000000000000000422C +:101280000000000000004800810000E0000048006D +:1012900000000000000000420000000000000042CA :1012A0000000000000004800810000E0000048004D :1012B00000000000000000420000000000000000EC -:1012C00000000000000000000000811200E00700A4 -:1012D00048000000000000000000000000000000C6 -:1012E00000000000000000000000411200E00700C4 -:1012F0000012000000000000000A000000000000D2 +:1012C00000420000000000004800810000E0000033 +:1012D0004800000000000000004200000000000084 +:1012E00000420000000000004800810000E0000013 +:1012F0004800000000000000004200000000000064 :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD :1013200000000000000000000000000000000000BD @@ -115039,449 +115039,449 @@ :10141000000000000000000000000000DE2E747BD1 :1014200000000000000000000000000000000000BC :10143000000000000000000000000000DE2E0000A0 -:10144000757B0000000000000000000000000000AC -:101450000000000000000000000000000000DEAE00 -:10146000757B00000000000000000000000000008C -:101470000000000000000000000000000000DEAEE0 -:10148000615603400000000000000230A000000090 +:10144000747B0000000000000000000000000000AD +:101450000000000000000000000000000000DE2E80 +:10146000747B00000000000000000000000000008D +:101470000000000000000000000000000000DE2E60 +:10148000615603400000000000000231E00000004F :10149000000000000C4000000000000002C06A864E :1014A000615603400000000000000231E00000002F :1014B000000000000C4000000000000002C06A862E -:1014C0000000612603400000000000000230A00080 +:1014C0000000615603400000000000000231E0000F :1014D0000000000000000C4000000000000002C0FE -:1014E0006486612603400000000000000230A00076 +:1014E0006A86615603400000000000000231E000FF :1014F0000000000000000C4000000000000002C0DE -:1015000064860000000000000000000000000000F1 -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000005000000080000000000005E -:1015800000800000000000000000000000000000DB -:10159000000000000000000000000000000000004B +:101500006A8620002000200082002000000088045D +:10151000200420002000000020002008000000001F +:10152000C00020000000200000002000000000009B +:1015300020002005C00504008800C0000000000055 +:101540002000000320000000200400002000100004 +:10155000890020042000000000112000000000008D +:1015600000002000200000002008000020002020B3 +:101570002000200420000000000000000000000007 +:10158000000020000000000000000000000000003B +:10159000000000000020000000000000000000002B :1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C000000000000000000000000000100000000B -:1015D000000000000000000000000000000000000B -:1015E00000000000100000000000000000000000EB -:1015F00000000000000000000000000000004000AB -:101600000000400800000000000000000000000092 -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:10163000000000000000100000000000000000009A -:10164000000000000000000000000000000040005A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:1016800000000000000000000084000000000000D6 -:10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B000000000000000000000000000000000002A -:1016C000000000000000000000000000000000001A -:1016D0000000000000000000000000080000000002 -:1016E00000000000000000000000000000080000F2 -:1016F0000008000000000000000000080000008852 -:10170000000800840000000000000000000000004D -:1017100000000000000000000000000200000000C7 +:1015B0000000000000020000C10000200000000048 +:1015C0000000000000000000000000000000090012 +:1015D0000000040000000000000000000000000007 +:1015E00000000000000000000000000000000000FB +:1015F000000100000000000000900000000000005A +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000021002000000B6 +:1016200000000200000000000000000000100008A0 +:101630000000000002400000000000020000000066 +:10164000000000000040000000000000000000005A +:10165000000000000040002000000000000000002A +:10166000000500000008001000800000008002104B +:1016700001000100000308050000200004000080B4 +:101680000100000000C1000000880008008440083C +:1016900000000008008240000008000800884008A0 +:1016A0000200000800080008000000880008008808 +:1016B000000800080008890800080008000941889F +:1016C000000800080084000800000000000000106E +:1016D00000000002001000110009000800080008C6 +:1016E00000080008000800000488004009000010FD +:1016F0008011080008080008800800088008800899 +:101700000020040800080020000000000003000082 +:1017100000000000000000080008000000000008B1 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 -:101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 -:101760000000000000210000000000000000002137 -:101770000000000000100008000000080010000930 -:101780000000000000004000000002000000000017 -:101790000000000021820300000021000000000082 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C00000000004000000000020000000000000F5 -:1017D00000000000000000000000000000000010F9 -:1017E00000000008000800080000000000000000E1 -:1017F000000000000000000000000000000000A049 -:10180000000000C0000800A0000000C000000000B0 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000021000000000000000000000000A6 -:101920000000000000000000002000000000000097 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000008000000080400017 -:101990000000040000000000000000000000000043 -:1019A00000000000050020900090080000000000EA -:1019B0000000000000000000000000000090000097 -:1019C0000088000009080904000020000000000051 -:1019D000000000000000000000080000000800A057 -:1019E000000000000900000000A0000000000084CA -:1019F00000A0000000A00000000800000008001087 -:101A0000000000000000000000880010000000023C -:101A1000110800000020C00000000000C00000000D +:101740000000000000000000040000000008000588 +:101750000008000800210000040840030000000009 +:101760000000000000210000000000000000000058 +:101770000000C0000021880041000400000001209A +:1017800082002000002100800009002000000000ED +:101790000000000000000200000000000000000047 +:1017A00000000088000000000000000000000000B1 +:1017B0000000000000000000210000000000000008 +:1017C0000900008800000000000000000000000088 +:1017D000000000000000002004008000C1000000A4 +:1017E00000000000400003000000000000000000B6 +:1017F00003000000090000C0080004008000000091 +:10180000200100008088002000200000000100006E +:10181000000000000000000000000000A000000028 +:1018200000000800000000000000000008000000A8 +:101830000000C0119000C000000000000000000087 +:1018400008000000850008000000C0000000000043 +:101850000000000000000000040000000000040080 +:10186000000008000800C00008008400000082009A +:101870000000C000820010008811404008000000F5 +:101880000080010001000000048000000100000051 +:101890000000000000080000000000000000000040 +:1018A0000000000000000000000000001000000028 +:1018B0000000000000000000000000002100000007 +:1018C00000A0000000000400000000000000000074 +:1018D00000000000000000000000A0000000410423 +:1018E0008000000000000000000000A000100500C3 +:1018F0000000000000C00300210000844001A1009E +:1019000000040004048220004102002000A004889A +:10191000002000000000000000000008000000009F +:1019200000000000000000000000000000000000B7 +:101930008200000008008800080000000000A000ED +:101940002000000000000020080800000000000047 +:10195000000200008400820000008200820000007B +:101960000020000000000000000908008200840040 +:10197000C0000000848000000000A00002A01180D0 +:10198000C1A04002000300000000208200101000EF +:101990000011012000000000000000000000000015 +:1019A00000000000000000C0000400000000000073 +:1019B0000000000000000000000000000000000027 +:1019C000000000000000009000110000080000006E +:1019D00000000000000000000000000000004100C6 +:1019E00021000001000200000000000400000000CF +:1019F00000000000000009400000000000008041DD +:101A000084400421800000000000000089200001C3 +:101A10001000100008010000000000000800000095 :101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000002100000000000045 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 +:101A300000000000000040000000820000000000E4 +:101A4000C000080084000500000005A1012100A1DC +:101A500000000000002100000000820000000000E3 +:101A6000000000080000000000000000000000006E +:101A70000000000084000400C0800000A00082007C +:101A8000890482009000C18001A00004018004004C +:101A90000100010800000102000000000000000039 :101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 +:101AB0000000000000000000000000000090000096 +:101AC000000000000000050084A005008420040040 +:101AD00021100000100205000000000800000000B6 :101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 +:101AF00000000000000000000000004003000000A3 +:101B0000000008880000000408400405210020208F +:101B100088000488080105820221000000000000FE :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000010001000000010000000042 +:101B40000000000400900090009008100190020432 +:101B5000082000000000000000000000000000005D +:101B60000000000010200004880290000000000027 +:101B700000000000000000000000000091888810B4 +:101B80000004A09004A000A0002010200291912049 +:101B90000408410800C0009040020004000000005A :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C10000000000000000041000800020010000069 +:101BC000000000000080000000000000918008007C +:101BD0008080800000000000000000000000000085 +:101BE0000000000000008200218000800000000052 +:101BF000000000000000000000000000000009805C +:101C00000080008000009180110000000000881119 +:101C10008340800302851080028080800080000065 :101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 +:101C40000000000000000000001100000000200063 +:101C50000210C18021800005000200000000000089 +:101C600000000000000000000000800880808080EC :101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 +:101C8000800000218080000000008021800880808A +:101C90000300C120A0110583000000C10021000045 :101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 +:101CC0000000000000000000000000200090000064 +:101CD000900090018420219000000000000000008E +:101CE0000000000000000000000090008201884019 +:101CF0000290000000000000000000000000000052 +:101D00000000880000200404000084004004A08536 +:101D1000C0048820080084918291200000842089DA +:101D200000080000000000000000000000000000AB :101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000010042 -:101DA0000000000000000000000000000000000033 +:101D400000000000000000000000C00000000000D3 +:101D5000400002100011108201010000000000008C +:101D600000000000000000000000000090410002A0 +:101D70001090821000000000000000000000000031 +:101D800000000000082000820040C0C04190001008 +:101D9000820340C1C004002090902021C00800A010 +:101DA000A000038900000000000000000000000007 :101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E2000030041000300000000000000000000006B +:101DC0000000000000000000000000008000000093 +:101DD0000000000080C1000300A010080000000007 +:101DE000000000000000000000000000000080086B +:101DF00000A10000801100000000000000000000B1 +:101E0000000000000000800000800080A080200210 +:101E10000090000810C180A02109A0A00011C002FC +:101E200000A00000A1410000000000000000000030 :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA000000800000000000000000000000000002A +:101E500000008000800000088021000000050008CC +:101E60008000800000000000000000000000000072 +:101E700080118090008080000000000000000000C1 +:101E8000000000000000000080020011000080003F +:101E9000001180820080800083919120030089409E +:101EA00000400021808000000000000000000000D1 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000001000000000000000000000000B0 +:101ED00088002000080008001021044120884000EC +:101EE00010012000040002000000000000000000BB +:101EF0000000C001A0038882100000000000000064 +:101F00000000000000000000000008018802908826 +:101F1000820082010821C084A00090410388212012 +:101F20001000900040081090900000000000000099 :101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 +:101F50000000000000000000600000810000070099 :101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 +:101F70000000000000210000070000000000000039 :101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 +:101F9000000000110000000007000000884100E080 +:101FA000070082000000000007008400000000001D :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 +:101FD000000000005141FBEB0000000000CF0000BA +:101FE000FB00FB00000000000000000000000000FB +:101FF0000000000000000404EF000A0C00000000D4 +:102000000000000000000000000000000000CF0001 +:10201000450000040014140414000C0C00CF1C0034 +:102020001C0010150000BC00BC003F3F0000000079 :1020300000000000000000000000000000000000A0 :102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 +:102050000000000000004141EBEB000000008ACAD4 +:102060000000FF00FF0000000C0000000000000066 +:1020700000000000000000000000FF00BA3C00006B :102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 +:10209000CFCF45450006009614141414080800DF3D +:1020A00010005F0010151415FF00BC003F3F00003A :1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 +:1020D0000000000000000000500040000000000070 +:1020E0000C0C0CCF000000000000000000000000FD +:1020F000000000000000000000000F5F005500EB32 :1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF +:10211000000080A0C0F000EB00EBFF0DFFFFEB0024 +:102120002828C2C200C2A0A0800015000000000044 :10213000000000000000000000000000000000009F :10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F +:10215000000000000000000000001000000000006F +:102160000000FF0CFFFFA828FC0C0000000000008E +:10217000000000000000000000000000AFFFA0FF12 +:10218000004B000B000000000000000000000000F9 +:102190000000000082AAC3FFEBEBEBEBFF00FFFFA8 +:1021A000FB000808C2400000F030C0001500FFEA44 +:1021B000551455140000000000000000000000004D :1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE -:1022100000000000000000000000000000000000BE -:10222000000000000000000000000000000000614D -:102230000006000D0000000000000000000000008B +:1021D00000000000000000000000000000003000CF +:1021E0000000000000610036000D0000000000004B +:1021F0000000000000000000000000000000A061DE +:102200000036000D0000000000000000000000008B +:102210000000000000000000300000900000056198 +:102220004A0E059D00A500610030C0010000056157 +:102230005A0E050D00A00000000000000000000084 :10224000000000000000000000000000000000008E :10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E +:10226000000000000000000000005F5F004300006D :10227000000000000000000000000000000000005E :10228000000000000000000000000000000000004E :10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E +:1022A0000000000000000030FA0AF5000082FF96EE +:1022B00000000000000010100000000000000000FE :1022C000000000000000000000000000000000000E :1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE +:1022E0000000000000000000000000005F5F5F438E :1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD +:1023000000000000000000000808000000000000BD :1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD -:10233000000000000000000000000000000000009D +:1023200000000000000000300000C202C1000002F6 +:102330000F06000000002020000000000000000048 :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D :10236000000000000000000000000000000000006D :10237000000000000000000000000000000000005D :10238000000000000000000000000000000000004D :10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D -:1023B000000000002F281F14000000000000000093 +:1023A000000000000000000000000000C134C10077 +:1023B000F0AAF05000000000000000000000000043 :1023C000000000000000000000000000000000000D :1023D00000000000000000000000000000000000FD :1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD +:1023F000414100400000000000000000000000001B :1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC -:1024200000000000000000000000000000000000AC -:102430000000000000000F000F000000000000007E -:102440000000000000000000000000000004001177 -:10245000000000000000000000000000000000007C -:1024600088000000000000000000000000000000E4 -:10247000000000000002000000000000000000005A -:10248000000000000000000000000000000000004C -:10249000000000000000000000000000000000003C -:1024A000000000000000000000000000000000002C -:1024B000000000000000000000000000000000001C +:102420000000000000000000000000000000F5F5C2 +:102430000000C082C0400000000000000000200832 +:1024400088000000200020002000200088000008F4 +:1024500020002000000088000000000000000000B4 +:1024600088000000880020400400200020020211A3 +:1024700001800008000820000800200088000003F8 +:10248000000020080000C0008800C000000000001C +:10249000201000080000891100008800000200419F +:1024A0000000000000000400000000000000000028 +:1024B000884100000000200200000000100410000D :1024C000000000000000000000000000000000000C :1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC -:1025000000000000000000000000000000000000CB -:1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B +:1024E00000000000000000000091800000000001DA +:1024F000A100080220000000800080008000000091 +:10250000000000000000000020002000000000008B +:1025100000000000000000002000000000A02001DA +:1025200000A0000000A0000000000000000000006B +:1025300000000000410000000000000000008000DA +:1025400080000010000000000200000008000000F1 :10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000000003B -:1025A00000008200000000000000000000000000A9 -:1025B0000000040000000000000000000000000017 -:1025C0000000820000000000000000000000000089 -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA -:1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA -:10263000000000000000000000000000000000009A -:10264000000000000000100000000000000000007A -:102650000000000000000200040000000400000070 -:10266000000000000000000000000000000000006A -:10267000000000000000400090000000400000004A -:10268000000000000000000000000000000000004A -:10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A -:1026C000000000000000000000000000000000000A -:1026D00021000000000000000000000000000000D9 -:1026E00000200000000000000000000000000000CA -:1026F00000000000000000000000000000000000DA -:1027000000000000002000000000000000000000A9 -:1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 -:102740000000000000000000000000000000000089 -:10275000000000000000000000000000C0000000B9 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:102840000000000000000000000000000000000088 -:1028500000000000080000000000C00000000000B0 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 -:102880000000000000000000000000000000000048 -:102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 -:1028B0000000000000000000000000000000000018 -:1028C0000000000000000000000000000000000008 +:1025600000000000400000000000000000A0028009 +:10257000000201040000010000830104C00000000B +:10258000000000000000008000000000C00000000B +:102590000000000000800000000000000000C000FB +:1025A00000000200000000000000400000000000E9 +:1025B0000800030008800000080005844000400077 +:1025C00085000900000200080000000800008008E3 +:1025D00000080084009000080008000800000000C7 +:1025E0000000000000088008000000080000000350 +:1025F00000100001201120082084000208010000C2 +:10260000000000000000000800100000008400002E +:10261000000000000000000400900004000400001E +:102620000084000000000010000200008084000010 +:102630000000800088008004000880008809800075 +:1026400080000800C0000000000000000000000042 +:102650000000000000000000400000000000040036 +:102660000000000000050000000000000000000065 +:10267000000000000100410800210080410000032B +:10268000002100800000000000400040C010000059 +:1026900082000205002100108408010010008289D8 +:1026A0000000002100020000000000218200002143 +:1026B0000002A005000000030100850200820885D9 +:1026C000A000820000100004000000000000004094 +:1026D00000000000000000000000000000400300B7 +:1026E000000000000000000000000300410009009D +:1026F0004100410005000800040000000004200023 +:10270000218800080004000000002183000100016E +:102710000008000080000000000100002000038885 +:10272000000803002100000108000000000009006B +:1027300041000801090003000500200040C14104D8 +:10274000000400000000000100090000000000007B +:10275000820082000000000008000000100000005D +:102760000800080000000000820008050800A00022 +:10277000880083050800000082009020C100C0008E +:102780000900820082000000000000008400820036 +:102790008200100082000800A000C00082000080BB +:1027A0008200A000C00020004000C0008400A00003 +:1027B000C000A00082008400400008000000040067 +:1027C0000000010000000000010001000000000006 +:1027D00000000000000000000000000000000800F1 +:1027E00000000000000008000000000000000000E1 +:1027F000000000000800000000000000410104008B +:102800000300A000000041080000000000000000DC +:1028100000000000030000000000000000000000B5 +:1028200000040000000000008000A100000005007E +:10283000090803000300000000000000800000C041 +:1028400080880000109000000000200020000000A0 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000008200840062 +:102870008200840084000000080084004000020000 +:10288000000404840411820000040040820400005B +:1028900002000000000000088400000000030005A2 +:1028A0002000824184008404080008210000820086 +:1028B000C0000800A000000008000800828082001C +:1028C00020030800002004410085080000880088DB :1028D00000000000000000000000000000000000F8 -:1028E00000004000040000000000000000000000A4 -:1028F0000000000000000000020000000000009046 -:1029000004000000000004000000000000000000BF -:1029100000000000000000000000000000000200B5 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:10294000000000000000000800000000000809A0CE -:102950000000100000000000000000000000000067 -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:10299000000000000000080000000000000000002F -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 +:1028E00000080000000000000000000000000000E0 +:1028F00000000800000000000300412005008000E7 +:10290000C1A04089C12183840000000900010001A9 +:1029100000008000000000000000000003A008008C +:102920000884800000000000000900000000000092 +:10293000000000000000418408842190000000088D +:102940001184809089000405A10041020000210348 +:102950000002000000000000000000000000000075 +:1029600000000800000000000000A00000000800B7 +:102970000800A0008200840008100041A000A00010 +:10298000000220218220210388090804000000049D +:102990001021000000000000080000000003820079 +:1029A0000000C000004182210400C021012120005C +:1029B0000800400084000800000000004041820040 +:1029C000100840210800A041901088080000000471 +:1029D000400240080000000000000000000000006D :1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 -:102A20002100000000000000000000000000000085 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000000000076 -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 -:102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD00000000000000000000000000000000000F5 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 +:102A0000000021010000000188000000000100001A +:102A10000001000000000000000080000000000035 +:102A20000000000000000000000000000000400066 +:102A300080000000C10000000800000000008300CA +:102A40000000800120C00000000000010001000023 +:102A500000018001C100000000000000000000A093 +:102A600000880088009000000000000000000000C6 +:102A7000000000000000000000000000000040A076 +:102A8000049020909008000210020491A00101100F +:102A9000214120900003000001A0001000202090A0 +:102AA00000000000000000000000000082010001A2 +:102AB00000002000020000000000010020000000D3 +:102AC0009041000500A000A0201000C00400C0102C +:102AD000C0050141084082400000000000000000E5 +:102AE0000080000000000000000000000000000066 +:102AF000000000000000000002090002004100097F +:102B0000808491830000000900028583C0030011C6 +:102B100011C083880082008300000980000000004B +:102B20000000000000000000000020092105000254 +:102B300000084040832080050010000003000000D2 +:102B4000000000C10021001100094085110380032D +:102B5000000320C10302A0030000000000000000E9 +:102B6000000000000008000000000000000000005D +:102B70000000000000000000000020002000020013 +:102B8000101089008900A0202103A0841000C00239 +:102B9000000040002000400502200000000000214D +:102BA00080000000800080000000800041000500DF +:102BB0000208201103000000400020030000210053 +:102BC000400000020000802000040020A000A111AD +:102BD000840040808080050000058088000000009F +:102BE00000000000000000000010000000000000D5 +:102BF0000000000000000000000000000090000045 +:102C00000100010104901000A01021011191A140C8 +:102C1000A10100400040000001A00083000020004E +:102C20004000A0401000080008000200C00000881A +:102C30000000010000000020000000000001000270 +:102C4000010001000090040010C000830200111078 +:102C500091090840A00488029000820004880000C6 +:102C6000000000000000100000000000080000004C :102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 +:102C8000000020000000C04001211102A0C0918876 +:102C90004090831108C002000001010005000000FF +:102CA00040200002000204C00000000000000000FC +:102CB0000000010088010100000000010101000086 +:102CC000000100000001000000C000880002C08870 +:102CD000000401A0A085A0A00841112189A008C17D :102CE00000000000000000000000000000000000E4 :102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D60000000000000000000000000000000000063 +:102D0000000040001000200080051005A18383C052 +:102D1000044003A008A140A08040210308029102C2 +:102D200000000000008000808080000000000000A3 +:102D30000900001008054105110800400408212180 +:102D400000050020002000210020000009802180D3 +:102D5000008002020804048811A000A0402088031B +:102D6000A090000000000000000000000000000033 :102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000000062 +:102D80000000418003202100050321882003050065 +:102D90000341099121A10089104188859105820094 +:102DA000034000008002008000808000001100804D +:102DB00000800000410202112100020340101100B6 +:102DC0002100084009000300020040039005400074 +:102DD00009809000411091024100000941A1219118 +:102DE00021004003000000000000000090000800E7 +:102DF0000800880000000000000000000000000043 +:102E00000000000000A00100010000410340030099 +:102E10000040890100A100C100900001C1820300AF +:102E20008400830100000800C0200402100000009C +:102E300000820040000001010001010000010001CA +:102E40000100010001000004000001000000030077 +:102E5000918891080300410208C18210400001C11D +:102E600000A101A00100000000000000000000001F :102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 +:102E800000000000000000000000000000000081C1 +:102E9000000007008412410000E00700420A5000D1 +:102EA00000E0000000000000000000000000000042 +:102EB0000000000000000000840000E000000000AE +:102EC000810000E0000000000000000000000000A1 +:102ED000810000E000000000880000E00700000022 +:102EE000880000E0000081000000000000000000F9 :102EF00000000000000000000000000000000000D2 :102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 +:102F100024000000008100C2000000003030C0C06A +:102F200064000064000000000000000B0B0B0000B8 :102F30000000000000000000000000000000000091 :102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 +:102F500000003F3CBF3C0000400009990DBD00BD92 +:102F6000000000000000000000C30000000000009E +:102F70000000010000000000000000000000000050 :102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 +:102F900000002400000000810080000000003000DC +:102FA000C0006400006400000000000000DBDBDB08 +:102FB0000F0F0003000000000000000000000000F0 :102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 +:102FD00000000000FF3CFF3C000040000BDB0FFF47 +:102FE00000BF0000000000000F0001C3000000004F :102FF00000000000000000000000000000000000D1 :1030000000000000000000000000000000000000C0 :1030100000000000000000000000000000000000B0 @@ -115490,157 +115490,157 @@ :103040000000000000000000000000000000000080 :103050000000000000000000000000000000000070 :103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 +:1030700000000000000000FF00FF00000000000052 :103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 +:103090000000000000000B0B00000000000000001A +:1030A0000600D300D300C3C30000000000000000EE +:1030B00000C100C10000000000000000000001008D :1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 +:1030D000000000000000000002C23EFE00000101EE +:1030E0000000243CBD0D3C0C2C003C3C81818181C6 +:1030F000000000000000000000FF007F0000000052 :1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000004F +:10311000000000000000000002DB000000000003CF +:1031200000000000FF00FF00C3800000000000005E +:103130000000C1C10000000200C200000000000247 +:10314000010000000000000000000000000000007E +:103150000000000000000000000002C23EFE00006F +:1031600000000000243CFF0FFF0F00003C3C818961 +:10317000898900000000000000000000000000003D :10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF +:10319000000000610006000D000000610036009D87 +:1031A000000005610A0FC59D00A0A0610000C001DC +:1031B000000000000000000000900001000000007E +:1031C0000000000500610000C0090000006100046B +:1031D000C00D000000610006000D00000021300657 +:1031E000C00D000100610A0AC50100A000610007CE +:1031F000C09D000000000000000000000000000072 :1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E +:1032100000000000004000C00000000055F555F51A +:103220000000000000550014C0CA0000F908F908A9 +:10323000F092F0920000000000000000000000008A +:10324000000000000000F0F08200C2C34041F30023 +:10325000A2000F6D000080F0B0F0000000003CFF05 +:103260003CFC0000000005000005FFFF0000A2A2DA +:103270000000C3C343410000000000000000000044 :10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE +:10329000000000000000005000F00000000055FF9A +:1032A000553C0000010000550014C0CFC0CF000005 +:1032B000F908F0920000000000000000000000008B +:1032C0000000000000000000B0F00000000300015A +:1032D000FC0CA8080F6D0F6D82FFBEFFC3004300FA +:1032E00000FFF0F00000000005000005FFFB0000FB +:1032F000A2A200A2000000000000000000000000E8 :1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D +:103310000000000000000000AA2AAA280000000007 +:10332000AAC3AAFFCFD70000A082AAAA30B230B2A7 +:1033300038383535FF00F6000000000000000000BE +:10334000000000000000000000000000F353F5FD45 +:10335000053CD0D7A0AA00000014000000000555CD +:103360000555080800DF000000000305C355BFFF36 +:1033700000000F05F050FAFAFAFA00000000000011 :10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:10340000000020000000000000000000000000009C -:1034100000000000000000000000000000000000AC -:10342000000020000000000000000000000000007C -:10343000000000000000000000000000000000008C -:10344000000000002000000000000000000000005C -:10345000000000000000000000000000000000006C -:10346000000000000000000000000000100000004C -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C +:1033900000000000000000000000AA0AAA00555426 +:1033A0000000AA00AA00CFD7CFD7F0C3FFFFF3F3E6 +:1033B000F3F300380035F000F200000000000000D8 +:1033C00000000000000000000000000000000051AC +:1033D000F5FD053CC0C3C0C30000001400000000A0 +:1033E00005050505000000FF000000000405145558 +:1033F000FFFF00000000000000000000200020008F +:1034000020000000000000000000200020008800D4 +:103410000000040088102000200404042000200084 +:10342000C0008800020004000400040084000000C2 +:10343000000020008400200084000400000320001D +:103440008400200004000000200000008400000030 +:1034500000000002200000000000000088040000BE +:1034600000000000008000002100000000000000BB +:103470000000000000000000000000000004000048 +:1034800000000000200000000000200000000000FC :10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B00000000000100000000000000000000000FC +:1034A000000000000000000080009100800000008B +:1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E000000000000000000040000000400000005C +:1034D00000000000000010000000000200000000DA +:1034E0000000000000000020000004004100000275 :1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B +:1035000000000000001000000000000000000000AB +:10351000000000000000000000000000000000109B +:103520000200000000000000040002000000000093 +:103530000000000000000000000002000000002069 :10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB +:1035500000000000000000000010000000008800D3 +:10356000000020000000840000000400080000802B +:10357000209000000000200020000000000000005B +:103580000000000800080008008400000008000097 +:103590000008000000000000001000000004000807 +:1035A0000084000800400010000000000008000037 +:1035B00000100000000000000084000080000008EF +:1035C0000009000000080000000000000010008852 +:1035D000000800100000000000000000000000884B +:1035E0000010001080080000000000008000800033 +:1035F0000020002100000000800080000400040082 :1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A -:103630000000000000000000840000000400000002 -:10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A -:10367000000000000000000000000000000000004A -:103680000400000000000000000000000000000036 -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 -:103750000000000900000000000000000000000060 -:103760000000000000000000000000000000000059 -:103770000800000000000000000000000000000041 -:1037800082000000000000000000000000000000B7 +:103610000000002100000000000020080000000061 +:103620000000000800000000000000000000000092 +:103630000000000800000000000000000000000082 +:103640000000000000000000000000000005000075 +:1036500000000000000000000000000088000000E2 +:103660000000000000000000000000000000010851 +:10367000000082000000A0000000400000000000E8 +:10368000820082000800000000000000000000002E +:103690000000000000000020002000008000030067 +:1036A0002100100005000000410010000300000090 +:1036B000410000080300000008C0030000000800EB +:1036C00000004100031000000300030000000000A0 +:1036D00003040000031003000800030000000300BF +:1036E00004A008004100080000000800008808004D +:1036F000040010000000030021002100210021A08F +:10370000000800000084000000000200000000002B +:103710000800000000000000000000000000080099 +:1037200008004000000008000000400020001000D9 +:103730008300000000000800080090000000000066 +:1037400082000000080008000000000008000000DF +:10375000080000000000820082000000000000005D +:1037600000000800000008009000000000000000B9 +:103770000000040008000400010000000000000038 +:103780000000000000000000000000000000000039 :103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 +:1037B0000000040000000000000000000000000005 :1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 +:1037D00000000000000000000000080000000000E1 :1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 +:1037F0000000410080008000800002000000000006 :1038000000000000000000000000000000000000B8 :1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 +:103820000000000000000000A000000000000000F8 +:103830008400000000000000000000000000000004 +:1038400000008200000000000000000000000000F6 +:103850000000000000000800000008000000000058 +:10386000C0000000C000C000000000000000080010 +:1038700000000800000000000000000000800000C0 :103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 +:103890000000000000004090000040040090000084 :1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000020000040000000000000000000000F2 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:103900000000000000000000000040000000000077 +:1038B000000005001100400803002100030004007F +:1038C000038400900384000000080010031000002F +:1038D00000000000080000000010000000000000D0 +:1038E0000020000000840020049000000010000070 +:1038F000000009000800000003000900051008206E +:1039000040000000008408840300000003000084DD :1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 +:103920000000080008000000000000000000000087 +:10393000000000000800040000000000000000007B +:103940000000000000000000000000020000000273 :103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 +:103960000008000000000000000000000000000946 +:103970008200900000000000A000400020008200B3 +:10398000040000000020000000000000000000090A +:103990000002000000000000000000000000000025 :1039A0000000000000000000000000000000000017 :1039B0000000000000000000000000000000000007 :1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 +:1039D00000000003000000000000000000000000E4 :1039E00000000000000000000000000000000000D7 :1039F00000000000000000000000000000000000C7 :103A000000000000000000000000000000000000B6 @@ -115650,8 +115650,8 @@ :103A40000000000000000000000000000000000076 :103A50000000000000000000000000000000000066 :103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 +:103A70000000000000000000000000000000A004A2 +:103A800000040000820400000000000000000000AC :103A90000000000000000000000000000000000026 :103AA0000000000000000000000000000000000016 :103AB0000000000000000000000000000000000006 @@ -115659,64 +115659,64 @@ :103AD00000000000000000000000000000000000E6 :103AE00000000000000000000000000000000000D6 :103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 +:103B00008000000000000000000000000000000035 :103B100000000000000000000000000000000000A5 :103B20000000000000000000000000000000000095 :103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 +:103B400000000000000000800000000000000000F5 :103B50000000000000000000000000000000000065 :103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 +:103B70000000000000000000000000100000000035 +:103B800000808000800080000080000000000010A5 :103B90000000000000000000000000000000000025 :103BA0000000000000000000000000000000000015 :103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 +:103BC0000000000000900000000400000000000061 +:103BD00000000000000000000010000000000000D5 :103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 +:103BF00000000000000000000000000000010000C4 +:103C000000000002040002C0A00020040000000028 +:103C100000010000000000000000000000000000A3 :103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 +:103C30000000010000000000000000000000000083 +:103C40000000000000000000A000000000000000D4 :103C50000000000000000000000000000000000064 :103C60000000000000000000000000000000000054 :103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 +:103C800000000000000091040004A00000A000005B +:103C90000000000001000000000000000000000023 :103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 +:103CB00000000000100000000000000000000000F4 +:103CC00000000000000020000000000000000000D4 :103CD00000000000000000000000000000000000E4 :103CE00000000000000000000000000000000000D4 :103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 +:103D0000000000000000000084000000000000002F +:103D10000000000000001000000000000000000093 :103D20000000000000000000000000000000000093 :103D30000000000000000000000000000000000083 :103D40000000000000000000000000000000000073 :103D50000000000000000000000000000000000063 :103D60000000000000000000000000000000000053 :103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 +:103D800000000000000000000000800200C0008071 :103D90000000000000000000000000000000000023 :103DA0000000000000000000000000000000000013 :103DB0000000000000000000000000000000000003 :103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 +:103DD00000000000000000000000000000100000D3 :103DE00000000000000000000000000000000000D3 :103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 +:103E00000000000000000000000000009001820897 +:103E1000820204000000000000000000000000001A :103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 +:103E300000000000000000E00000000000000000A2 :103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 +:103E5000070000000000000000000000000000005B +:103E60002100000000000000000000000000000031 :103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 +:103E80000000000000000000008407000000008126 +:103E90000000070000000000008400000000000097 :103EA0000000000000000000000000000000000012 :103EB0000000000000000000000000000000000002 :103EC00000000000000000000000000000000000F2 @@ -115724,7 +115724,7 @@ :103EE00000000000000000000000000000000000D2 :103EF00000000000000000000000000000000000C2 :103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 +:103F1000FFC30F0382820A0A0000000000000000B5 :103F20000000000000000000000000000000000091 :103F30000000000000000000000000000000000081 :103F40000000000000000000000000000000000071 @@ -115732,32 +115732,32 @@ :103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 +:103F90000000FFC30F03AAAAAAAA000000000000A5 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 :103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 +:103FE0000000000000000000555500000000000027 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 +:1040100000000000FF3C000041C1008000000000E3 :104020000000000000000000000000000000000090 :104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 :104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 +:1040600000000000000000000000555500000000A6 :104070000000000000000000000000000000000040 :104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 +:10409000000000000000000000005FDF1E9E000026 :1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 +:1040B000000000000000000000000000000000619F +:1040C0000006000D000000000000000000000000DD +:1040D00000000000000005180A00050005A000000F +:1040E00000000000000000000000000000A8000028 :1040F00000000000000000000000000000000000C0 :1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F +:1041100000610006000D00A005004A38050000A05F +:1041200000610006000D000000000000000000001B :10413000000000000000000000000000000000007F :10414000000000000000000000000000000000006F :10415000000000000000000000000000000000005F @@ -115790,101 +115790,101 @@ :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D :10432000000000000000000000000000000000008D -:10433000000000000000000000000000200000005D -:10434000000000002000000000000000000000004D -:10435000C00000000000400200000000200000003B -:10436000000000002000000000000000000000022B -:10437000000000000000000000000000000020001D -:1043800040000000000020000000000000000000CD -:1043900000000000000200000000000000002000FB -:1043A00020000000000020000000000000000000CD -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED +:104330000000000000000000000020050000200434 +:10434000000000002000000000000000000000024B +:104350008800000000002000000020000004200071 +:1043600000000000200000008400000000000000A9 +:1043700000000000000020000000040020000400F5 +:104380002000040000002000000020008800000041 +:104390008400000000000000000000000000000297 +:1043A00000020000000000000000200000000000EB +:1043B000200000000000000000000000410000009C +:1043C00000000000000000000000000400000004E5 :1043D00000000000000000000000000000000000DD -:1043E00000000000000000020000000000000000CB -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000400000000000005C -:10442000000000000000000000000000000040004C -:104430004000000000000000000200020000000038 +:1043E00000040000000000000900000000000000C0 +:1043F00010020000000000000000000000000000AB +:10440000100000000000000000000000000000009C +:10441000000000020000000000000000000000009A +:104420000000000000000000000000040002000086 +:10443000000000000000000000000000000000007C :10444000000000000000000000000000000000006C -:10445000000000000000000000000200000000005A -:10446000000000000000000000000000000000004C +:104450000000000000000000000002000041000019 +:10446000000000000041000000000000000000000B :10447000000000000000000000000200000000003A :10448000000000000000000000000000000000002C -:104490000000000000000000000002000200000018 -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000020002000000F8 +:10449000000000000000000000000000020000001A +:1044A0000000000000000000000000008400000088 +:1044B00000000000000000000000000002000000FA :1044C00000000000000000000000000000000000EC :1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC +:1044E000000000000000000000000000000000C00C :1044F00000000000000000000000000000000000BC :1045000000000000000000000000000000000000AB :10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000400000000000000000000000000000003B -:10454000000000000000000000000000000000006B -:104550000000040000000000000000000000000057 -:10456000000000000000000000000000000000004B -:104570000400000000000400000000000000000033 +:104520000000000000000000000800000000000083 +:10453000000000000000000000000008000004006F +:104540000000000000000000000004002000400007 +:1045500040000420000000000000000000000000F7 +:104560000000000000000000000040000000A0006B +:104570000400040000000400080000000000000027 :10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B +:104590000000000000004003000040000000000098 :1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000400C7 -:1045F000000000000000000000000000002000009B -:1046000000000000000000000000000000000000AA +:1045B00000000000080000009000000082000000E1 +:1045C000A00000000000000000000000000000004B +:1045D00000000000000000000900000000000500CD +:1045E000000041000000000000000000000000008A +:1045F000000000000090000000000000000000002B +:10460000000000000000008200A000000000000088 :10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A +:10462000000000000000000008000800000000007A :10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A +:104640000000000000000000000000000800000062 +:10465000000000000000000000000800080000004A +:1046600000008400000000000000000000000000C6 :10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A +:104680000000000000000000040000000000000026 :10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA +:1046A0000000000000000000080000000000000002 +:1046B000C000000000000000080000000000000032 :1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA +:1046D0000000000000000000000000000000008456 +:1046E000000000000010000000000000001000109A :1046F00000000000000000000000000000000000BA :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 :104730000000000000000000000000000000000079 :104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 +:104750000000000000000000000000000800000051 +:104760000000C01000000000000000000000000079 :104770000000000000000000000000000000000039 -:104780000000000000000800000000000000000021 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 +:104780000000000000000000000000000000000029 +:10479000000000080000000000000000820000008F +:1047A00000000000000800000000000000000800F9 :1047B00000000000000000000000000000000000F9 :1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 +:1047D0000000040000000000000000000000400095 +:1047E00004000000000000000000000000000000C5 +:1047F00000040300000000000000000000000900A9 :1048000000000000000000000000000000000000A8 :104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 +:10482000100000004100000000000000080000002F +:10483000000021100800000000000000000003003C +:104840002100000000000000000000000000000047 :104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000008000000000000000000000020 +:104860000000000000000000000000000010000038 +:1048700000008200000000000000000000000000B6 +:104880000000000000000000000000000000000028 :104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 +:1048A0000000000000000000000000000800000000 +:1048B00000000000000000000000080000000000F0 +:1048C00000000000400000000000000000000000A8 +:1048D00000000000000000000000000000000008D0 +:1048E0000000008200000000000000000000000046 :1048F00000000000000000000000000000000000B8 :1049000000000000000000000000000000000000A7 -:104910002100000041000000000000000000000035 +:104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 :104940000000000000000000000000000000000067 @@ -115985,94 +115985,94 @@ :104F30000000000000000000000000000000000071 :104F40000000000000000000000000000000000061 :104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000200021 -:104F700000002000000020000000000000002000D1 -:104F80000000000020000000000000008800000079 -:104F900000000000000000000000000000004000D1 -:104FA0000000000000004000000040000000000081 -:104FB00002002000000004000400000000000000C7 -:104FC0000000000040000000200020000000000061 -:104FD0002000000000002000200000000000000071 -:104FE0000000000020000000200000000000000081 -:104FF00000000000000000000000000000000000B1 -:10500000000400000000000000000000000000009C -:105010000000000000000000000000000000000090 -:10502000000000000000000200000000000000007E -:1050300000020000800000008000800000000000EE -:10504000000000002100000021900000000000008E +:104F60000000000000000000000000000000000041 +:104F700000000000000020000000000000002000F1 +:104F80000000000000000000000000000000000021 +:104F900000000002000420040000000000002000C7 +:104FA0000000000000000000000100000000000000 +:104FB00000000000000000000000000000000000F1 +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000000000004000000000000CD +:104FE00000000000000000000000000000000000C1 +:104FF0000000000000000900000000000000410067 +:105000000900000000000000000000000000000097 +:10501000000000000000000000000002000000008E +:10502000000000000000000400000000000000007C +:10503000000000000002000000000000000000006E +:105040000000000000004000000000000000000020 :105050000000000000000000000000000000000050 -:10506000000000000000000000040002000000003A -:105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:10509000000000000000000000000000020000000E -:1050A00000000000000000000000010000000100FE -:1050B00001000100010001000500010001000100E4 -:1050C00001000500210000000000000000000000B9 -:1050D00000000000000000000000000000000000D0 -:1050E0000000000000000400040000200020000078 -:1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000040000007B -:1051300020002000200020000400A0000200200029 -:1051400020002000A00084000000000000000000FB -:10515000000000000000000020000000000000002F -:10516000000000000000000080008000000100013D -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF +:10506000000000000002000000000000000000003E +:105070000000000000000000000001100000080017 +:1050800002100809000000000000000001000100FB +:1050900001000100000000000000021000000000FC +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000100000D0 +:1050D000000000000040010001000100030000008A +:1050E00000000300010000000000000000040000B8 +:1050F000000000000000000000000000200400008C +:105100008000000180400000000002000000040058 +:10511000040004000408000000000000000000007B +:105120000008000000000000000000000000000077 +:10513000000000000000001000000000000000005F +:10514000000000080000000000080000000000004F +:1051500000000000000000002000200020002000CF +:1051600000000040040004000008000000000001EE +:10517000000000000000000804000000040004001B +:105180000000000800000000000000000000000017 +:1051900000410000000000000402000000000000C8 +:1051A00000000000000000000008000000000000F7 +:1051B00000000000000000000000000010000000DF :1051C00000000000000000000000000000000000DF :1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000004000000BB +:1051E00000000400000004000000000000000000B7 :1051F00000000000000000000000000000000000AF -:105200000000080000000000000000000000000096 +:105200000000000000200900410000000000000034 :10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E :10523000000000000000000000000000000000006E :10524000000000000000000000000000000000005E :10525000000000000000000000000000000000004E :10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:105280000000000000000000080000000000000016 -:105290000000000000000000000008000000000006 -:1052A000000000000000000000008200000000007C -:1052B000C000A00000000000000008000000000086 -:1052C00000000004000000000000000008000000D2 -:1052D00000000000000000000000000000000000CE +:10527000000000000000000008000800000000001E +:105280000000000008000800080000000000000006 +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000A000000000000000000000002E :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE :10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D :10532000000000000000000000000000000000007D :10533000000000000000000000000000000000006D -:10534000000000000001000000000000000000005C -:10535000000000000000000000000000000000004D +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000100000003D :10536000000000000000000000000000000000003D :10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D +:10538000820000000000000000000000000000009B :10539000000000000000000000000000000000000D -:1053A0000000080000000000C00000000000A00095 -:1053B0000000000000000000000000000000A0113C -:1053C00084000000C0000000000000000000000099 -:1053D00000000000000000000000000000000000CD -:1053E00000000000000000000000000000000000BD +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D000A00000000000C00000000000C0000000AD +:1053E0008400000000000000000000000000000039 :1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C +:105400000000000000000000000000000000030099 :10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C +:105420000000000000000000000000000500000077 :10543000000000000000000000000000000000006C :10544000000000000000000000000000000000005C :10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000080000000000F4 -:1054B00000000800000000000800000000000000DC -:1054C00090000000820000000000000000000000CA -:1054D00000000000000000000000000000000000CC +:105470000000000400000000000000000000002107 +:10548000000000000000000082000000000000009A +:1054900000000000002100000000084100000000A2 +:1054A00000000000002100000000000000000000DB +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000000000000008000000D4 +:1054D00000000000080000000000000000000000C4 :1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC :10550000000000000000000000000000000000009B @@ -116081,10 +116081,10 @@ :105530000000000000000000000000000000000368 :10554000000000000000000000000000000000005B :10555000000000000000000000000000000000004B -:105560000000000000000300000000000000000038 +:10556000000000000000000000000000000000003B :10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B -:10559000000000000000000000000000000000000B +:10559000A0080090000408C0000000000000000007 :1055A00000000000000000000000000000000000FB :1055B00000000000000000000000000000000000EB :1055C00000000000000000000000000000000000DB @@ -116092,7 +116092,7 @@ :1055E00000000000000000000000000000000000BB :1055F00000000000000000000000000000000000AB :10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A +:10561000000080800000008080000000000000008A :10562000000000000000000000000000000000007A :10563000000000000000000000000000000000006A :10564000000000000000000000000000000000005A @@ -116100,80 +116100,80 @@ :10566000000000000000000000000000000000003A :10567000000000000000000000000000000000002A :10568000000000000000000000000000000000001A -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA +:105690000000000000000004000080000000000086 +:1056A000000000000000000000000080000000007A :1056B00000000000000000000000000000000000EA -:1056C0000000008000000011000000100000000435 -:1056D00000800040000000030000002000000000E7 -:1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000003B7 +:1056F00000000005000000000000000000000000A5 :105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 -:105720000000000000000000000000000000000079 +:105710000000000000000000000040C00200000087 +:105720000000000000000000004000000004000035 :105730000000000000000000000000000000000069 -:105740000000000000020000000000000001000056 -:10575000000100C000000040000000000000002028 +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 :105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:105780000000000200000002000000000000000015 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 +:105770000000000000010020000000000000009078 +:105780000000000000000000000000000000000019 +:105790000000000000000000C008008800048988A4 +:1057A00000000000000000000000000040000000B9 :1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000020000000B9 -:1057D000010000000400080000000000200090000C -:1057E00001000000000000000000000000000000B8 -:1057F00000000000000000000000000000000000A9 -:105800000000000000000800000000000000000090 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F0000000000002000000000000000000200087 +:105800000000000000000000010000000000000097 +:1058100000000000000000002000800000800080E8 +:105820002100000000000000000040000000000017 :105830000000000000000000000000000000000068 :105840000000000000000000000000000000000058 -:105850000000200020008000000005000000000083 -:105860000000030000000000000000000000000035 -:105870000000000000000000000000000000000028 -:10588000000000000900000080000000000000008F -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000008000000040000000000068 +:105880000000000000000000000008000000000010 +:105890000000000000000000000000000002000006 +:1058A000800000000000000000000000000900006F :1058B00000000000000000000000000000000000E8 :1058C00000000000000000000000000000000000D8 :1058D00000000000000000000000000000000000C8 -:1058E0000040000000000000000000000000000078 +:1058E00000000000000000000000000000000000B8 :1058F00000000000000000000000000000000000A8 :105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 -:105920000000000000000000000000000000000077 +:105910000000000000000000000000000000100077 +:105920002090404004000000000000000000000043 :105930000000000000000000000000000000000067 :105940000000000000000000000000000000000057 -:105950000000000000000000000020000000000027 +:105950000000000000000000000000000000000047 :105960000000000000000000000000000000000037 :105970000000000000000000000000000000000027 :105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000021000000B6 -:1059D000000000000084000000000000008421009E -:1059E00060000000008421000000000000000000B2 -:1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000210075 +:105990000000000000000000000000840000000083 +:1059A0000000000000008400000000000000000073 +:1059B000008100000700000000000000000000005F +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F0000000000000000000000000000084000023 +:105A000000000000000021000000000000840000F1 :105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 +:105A20000000C3C341035030F0300000000000000C :105A30000000000000000000000000000000000066 :105A40000000000000000000000000000000000056 -:105A500000000000000000000000000000FF000047 +:105A50000000000000000000000000000000000046 :105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 :105A80000000000000000000000000000000000016 :105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000000000000F6 +:105AA00000000000FFFF550F503050300000000094 :105AB00000000000000000000000000000000000E6 :105AC00000000000000000000000000000000000D6 -:105AD000000000000000000000000000000000FFC7 +:105AD00000000000000000000000000000000000C6 :105AE00000000000000000000000000000000000B6 :105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 :105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 +:105B20000000000000001F10FFF0000000AA0000AD :105B30000000000000000000000000000000000065 :105B40000000000000000000000000000000000055 :105B50000000000000000000000000000000000045 @@ -116181,7 +116181,7 @@ :105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 :105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 +:105BA00000000000000000000000000000AA00AAA1 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 :105BD00000000000000000000000000000000000C5 @@ -116189,14 +116189,14 @@ :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 :105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 -:105C5000000000000000000000A00000006100063D -:105C6000000D000015610A06050D00A00061000688 -:105C7000050D00A000000000000000000000000072 -:105C80000000000000000000000000000000000014 -:105C90000000000005000A00050000A00000000050 +:105C2000000000610006000D000000000000000000 +:105C30000001000000000000000005180A20050017 +:105C400005A00000000000000000000000000000AF +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000610006000D000000000000A0 +:105C9000050000A000610006000D000000000000EB :105CA00000000000000000000000000000000000F4 :105CB00000000000000000000000000000000000E4 :105CC00000000000000000000000000000000000D4 @@ -116229,102 +116229,102 @@ :105E70000000000000000000000000000000000022 :105E80000000000000000000000000000000000012 :105E90000000000000000000000000000000000002 -:105EA0000000000000000000200000002000400072 -:105EB0002000400000002000200020000000200002 -:105EC000200020004000880020000000000020008A -:105ED0000000200000002000000000000000000082 -:105EE0000000100000002000000000000000000082 -:105EF00000000000000000000000000000000000A2 -:105F0000000000002000C000400040000000000031 -:105F10000000000000000000000000000000000081 -:105F20000000400020000000000000000000000011 -:105F30000000000020000002000200020000000239 +:105EA00000000000000000002000200000000000B2 +:105EB000200020000000000020002004000000005E +:105EC000000020000004000020042000000000006A +:105ED000200020000000000020042004000000003A +:105EE0000000200000010000000020002000000051 +:105EF00000002000000000000000A00000000000E2 +:105F0000000000000000000000000000000004008D +:105F10000400040004000000000020000000000055 +:105F2000000000000004000200000000000000006B +:105F3000000000000000000000000000000200005F :105F40000000000000000000000000000000000051 -:105F50000000000000020000000000041002000029 -:105F6000000000020000000000000000000000002F -:105F70000000000000001000000000000000000011 -:105F8000000000000000000020004100410000006F -:105F90000000000000000000000000000000000001 +:105F500000900000000000000000000000000000B1 +:105F600000000000000000000000000040000000F1 +:105F70000000000000000000000000000000000021 +:105F8000000000000000000000000002000000000F +:105F900080008000800080000000000200000002FD :105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 +:105FB000000002000000000000000000000000805F +:105FC00000000000000000000000020000000000CF +:105FD0000000000000400000000000000000000081 :105FE00000000000000000000000000000000000B1 -:105FF000000000000000010001000000000000009F -:106000000000000000000000000000000000000090 -:106010000100000000000000024000000000000439 -:1060200000800000000000000000000000000000F0 -:106030000000000000000000000000000000000060 -:106040000008000000080000000000000000000040 -:106050000000000000000000000000000000000040 -:106060000008000000080000000000000000000020 -:1060700000000000000000002000200000000000E0 -:1060800000000008000000080000020000000000FE -:1060900000002000000000000000090100000000D6 -:1060A00000010004000000080000020000000000E1 -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 +:105FF00000000000000000000000000000000000A1 +:10600000000000000200000000000000000000008E +:106010000040010001000308030000000000000030 +:106020000000030000000000000000000008000065 +:106030000200000000000000000800000000000056 +:106040000020001000000000000000000008000018 +:106050000000000000000000000800000000000038 +:10606000000800000200000000000000000000081E +:10607000000000000200000000000008000800000E +:1060800000000008000000000000020000000008FE +:1060900000000000020002000200020800400000B0 +:1060A00002000040040002000200020000000000A4 +:1060B00000000000000000000000040004000000D8 +:1060C00004000000000000000000000000000000CC +:1060D0000000000040004000000000000000000040 :1060E00000000000000000000000000000000000B0 :1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F +:106100000000040000000400000000000000000087 :10611000000000000000000000000000000000007F -:10612000000000000000000000000000000000006F -:10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:1061600000000000000000004100000008000000E6 -:10617000210000004100000000004100210041001A -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF +:1061200000000000000000000000000000000084EB +:10613000000000004100000000000300000000001B +:10614000000000000000001000000000000000003F +:1061500000000000000000004000000000000008F7 +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000003000C +:1061900000000000000008000000000003000000F4 :1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF -:1061C0000000A0000000000000000000000000002F -:1061D00000000000000000000800000000000000B7 -:1061E00000000000080000000000000000000000A7 -:1061F000000000000000000000000000010000009E -:106200000000010001000000A100000000000000EB -:10621000C00000800080008000800080008000803E +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:106200000800000000000000080000000000A000DE +:10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E :10624000000000000000000000000000000000004E :10625000000000000000000000000000000000003E :10626000000000000000000000000000000000002E -:10627000000000000000000000000000000002001C -:106280000000000002000200000002000000000008 -:10629000000000000040004000400040004000407E -:1062A00000400000000000000000000000000000AE -:1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000002000000DC +:1062C00000000000000000000000000800000000C6 :1062D00000000000000000000000000000000000BE -:1062E0000000000000000000A00000000000080006 -:1062F0000000A0000000C0000000A000000000009E -:10630000080000000000C0000000000000000000C5 -:10631000000000000000000000000000000000007D +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:1063100000000000080000000000C0008200000033 :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D +:1063400000000000000040100800000000000000F5 :10635000000000000000000000000000000000003D :10636000000000000000000000000000000000002D -:106370000000000000000000000008000300000012 -:106380000000000000000000000008000000000005 +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D :1063900000000000000000000000000000000000FD -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD -:1063C00000000800000000000000000000000000C5 +:1063A00000000000000000000000000021000000CC +:1063B00000080000000000000000000000000000D5 +:1063C00000030000000000000000000000000000CA :1063D00000000000000000000000000000000000BD -:1063E000000000000800000000000000000008009D -:1063F000820000000800000000000000000008000B -:106400000000000000000000080000000000010083 -:106410000000010001000100010000000000000078 -:10642000000000000000000000000000000000006C -:106430000000000000000005000000000000000057 +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:106400000000000000000000000000000000080084 +:106410000000000000000000000000000000080074 +:106420000000000000000800000000000000000064 +:10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C :10645000000000000000000000000000000000003C :10646000000000000000000000000000000000002C :10647000000000000000000000000002000000001A :10648000000000000000000000000000000000000C -:1064900002000000020002000200020000000000F2 +:1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC @@ -116332,8 +116332,8 @@ :1064E00000000000000000000000000000000000AC :1064F000000000000000000000000000000000009C :10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000C0BB -:1065200000000000008800C000000000008800009B +:10651000000000000000000000000000000000007B +:106520000000000000000000000000080000000063 :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B @@ -116341,81 +116341,81 @@ :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB -:1065A00000800000000000000080000000000000EB +:1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB +:1065D000000000000000008000000000000000003B :1065E00000000000000000000000000000000000AB :1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000206A +:10660000000000000000000000000000000000008A :10661000000000000000000000000000000000007A -:10662000800000000000000080000000001000005A -:1066300080000000000000090000000000000000D1 +:1066200000000000000000000000000000800000EA +:10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A +:106650000000000000000000000200000000000038 :10666000000000000000000000000000000000002A :10667000000000000000000000000000000000001A :10668000000000000000000000000000000000000A -:1066900000000000000000000000000000002000DA -:1066A0000000C000000000000000C0000000000169 -:1066B0000000C0000000000000000000000000001A +:1066900000000000000000000000000000000000FA +:1066A00000000000000000000000000000000002E8 +:1066B00000000020000000000000000000000000BA :1066C00000000000000000000000000000000000CA :1066D00000000000000000000000000000000000BA :1066E00000000000000000000000000000000000AA :1066F000000000000000000000000000000000009A :106700000000000000000000000000000000000089 -:106710000000000001000000000000000000000078 -:1067200000000000000000900000000000C0008891 -:106730000000000000C00000000000000000000099 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000010068 +:10673000000008040000000000000000000001004C :106740000000000000000000000000000000000049 :106750000000000000000000000000000000000039 :106760000000000000000000000000000000000029 :106770000000000000000000000000000000000019 :106780000000000000000000000000000000000009 -:1067900000000000000010000000000000000000E9 -:1067A0000000000000000000000000000000408029 -:1067B0000000000000000080000000000000100049 -:1067C00000000000000000000000000000000000C9 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B0004100000000800000000000000000000018 +:1067C00010000000000000000000000000000000B9 :1067D00000000000000000000000000000000000B9 :1067E00000000000000000000000000000000000A9 :1067F0000000000000000000000000000000000099 :106800000000000000000000000000000000000088 :106810000000000000000000000000000000000078 -:1068200000000000000000000000800000000000E8 -:1068300000008000000000000000000000000000D8 +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 :106840000000000000000000000000000000000048 :106850000000000000000000000000000000000038 :106860000000000000000000000000000000000028 :106870000000000000000000000000000000000018 :106880000000000000000000000000000000000008 :1068900000000000000000000000000000000000F8 -:1068A000000000000000000000000000C00000A088 -:1068B00088000000C0000000000800000000000088 +:1068A00000000000000000000000000000000000E8 +:1068B0000000000000002000008200000000000036 :1068C00000000000000000000000000000000000C8 :1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000000A8 +:1068E00007000000000000000000000000000000A1 :1068F0000000000000000000000000000000000098 :106900000000000000000000000000000000000087 -:1069100000000000000000000084000000000000F3 +:106910000000000000000000000000000000000077 :106920000000000000000000000000000000000067 -:1069300000840000000000000000000000000000D3 -:1069400000840000000000000000000000000000C3 +:1069300000000000000000000000210060000000D6 +:106940000000000000000000000021000000000026 :106950000000000000000000000000000000000037 :106960000000000000000000000000000000000027 :106970000000000000000000000000000000000017 :106980000000000000000000000000000000000007 :1069900000000000000000000000000000000000F7 -:1069A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 -:1069B0000F0FFFFFC3C3FFFF0000FFFFC3C3FFFFB5 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000FF000000FF00D9 :1069C00000000000000000000000000000000000C7 :1069D00000000000000000000000000000000000B7 :1069E00000000000000000000000000000000000A7 :1069F0000000000000000000000000000000000097 :106A00000000000000000000000000000000000086 :106A10000000000000000000000000000000000076 -:106A20000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF74 -:106A3000FFFF0F0FFFFFC3C3FFFFFFFFFFFFC3C336 -:106A4000FFFF000000000000000000000000000048 +:106A20000000000000000000000000000000000066 +:106A3000000000000000000000000000FF00000057 +:106A4000FF00000000000000000000000000000047 :106A50000000000000000000000000000000000036 :106A60000000000000000000000000000000000026 :106A70000000000000000000000000000000000016 @@ -116429,26 +116429,26 @@ :106AF0000000000000000000000000000000000096 :106B00000000000000000000000000000000000085 :106B10000000000000000000000000000000000075 -:106B20000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF73 -:106B3000FFFFFFFFF0F0FFFFC3C3FFFF9999FFFFC7 -:106B4000C3C30000FFFF00000000000000000000C1 +:106B20000000000000000000000000000000000065 +:106B300000000000000000000000000000000F0F37 +:106B40000000FFFF00000000000000000000000047 :106B50000000000000000000000000000000000035 :106B60000000000000000000000000000000000025 :106B70000000000000000000000000000000000015 :106B80000000000000000000000000000000000005 :106B900000000000000000000000000000000000F5 -:106BA00000000000FFFFFFFFFFFFFFFFFFFFFFFFF1 -:106BB000FFFFFFFFFFFFF0F0FFFFC3C3FFFF999947 -:106BC000FFFFC3C300000000000000000000000041 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000000D5 +:106BC0000F0F0000000000000000000000000000A7 :106BD00000000000000000000000000000000000B5 -:106BE00000000000000000000000000000000000A5 +:106BE000000000000000000000000000000000A005 :106BF0000000000000000000000000000000000095 :106C00000000000000000000000000000000000084 :106C10000000000000000000000000000000000074 -:106C2000000000610006000D1002400080000020FE -:106C30001002400080000020120240E38006002D78 -:106C400092024082800000208A0200610006000D4E -:106C50000000000000000000000000000000000034 +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 +:106C4000000015002A00054000A800000000000018 +:106C5000000005000000000000000000000000002F :106C60000000000000000000000000000000000024 :106C70000000000000000000000000000000000014 :106C80000000000000000000000000000000000004 @@ -116481,436 +116481,436 @@ :106E30000000000000000000000000000000000052 :106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000200002 -:106E700000000000000020000000000000000000F2 -:106E80002000000000000000C0040000000000001E -:106E9000000000000000000088000000000000006A -:106EA00000000000000000000000200000000000C2 -:106EB000820004000000020004000000040004003E -:106EC00004000000040004000400040000000000AE -:106ED00020002000000020002000000020002000F2 -:106EE0002000000000000000000000000000000082 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000010000000000071 -:106F1000000010001000000000020002000000004D +:106E6000000000002000200020040000200020047A +:106E700000040000000020002000000000000000CE +:106E8000040400002000200020000000200020005A +:106E900000000000000020002000000000000004AE +:106EA000200400020000200000002000000020005C +:106EB00000040000000000000000200000000000AE +:106EC0000000200002002000000000000000200060 +:106ED00000000000040000000200020004000400A2 +:106EE0000400040400000000000000000000000096 +:106EF000000000000002000200000000000000008E +:106F00000000000000000000000000000000000081 +:106F1000000000020000000000000000000040002F :106F20000000000000000000000000000000000061 -:106F30004000000000000000800000000000000091 -:106F40000000000000000000000000000000000041 -:106F5000000000900000000040000000000040041D -:106F60000000000000000000000000000000000021 +:106F3000400000000000000200002002009000005D +:106F4000000200000000000000000000000000003F +:106F500000000000000280000000000000000000AF +:106F60000000000000000000000008000000000019 :106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000020000000000CF -:106FC00000000000000000000000000000000000C1 -:106FD0000000000000100010000000000010001071 -:106FE0000010000000100010000000000000000071 -:106FF000000000820082000000000000000000008D -:10700000000000000000000400000000000000007C -:107010000000000000000000000000000000000070 +:106F800000000000001000000000000000000000F1 +:106F900000000400000000000000040004000000E5 +:106FA00000400000000000000000000000000000A1 +:106FB0000000000000000010000010001000100091 +:106FC00002400240024002400040004002400240B5 +:106FD00000400040004002100280008000900090BD +:106FE0000000000000000000000800000000001089 +:106FF0000000000800000000000000000000000881 +:107000000000000000000000004000000000000040 +:107010000200020800000000040004000000000854 :107020000000000000000000000000000000000060 -:1070300000000000000000000000040084000000C8 -:1070400004004000000000000400000009000000EF -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 +:107030000000000000080000000000000000000048 +:1070400000108001800100018001000100010001A9 +:107050008001020102090001000080400040004060 +:1070600000400000000000000000000000000000E0 +:107070000000000000000000000000008800000088 :107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 :1070A00000000000000000000000000000000000E0 -:1070B000000000000000000000008200000000004E -:1070C0000000000088000000A000A00000000000F8 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 +:1070B00000000000000000000000000000000000D0 +:1070C000004000000003000000000000000000007D +:1070D000000000000000000000000040000000214F +:1070E0000002001104000000000000400000000049 :1070F0000000000000000000000000000000000090 :10710000000000000000000000000000000000007F :10711000000000000000000000000000000000006F :10712000000000000000000000000000000000005F -:10713000000021000000000000000000000000002E -:1071400005000000000041000900410000000000AF -:10715000000000000000000000000000000000002F -:1071600000000000000000000000000000A000007F +:10713000000000000000000000000000000000004F +:10714000000000010000000000000000000000003E +:107150000000030008000000000000000001000023 +:10716000000000000000000000000000000100001E :10717000000000000000000000000000000000000F :1071800000000000000000000000000000000000FF -:1071900000000000100000000000080000000000D7 -:1071A00000000000000000000000A0000800000037 -:1071B000000010001000100000000000000000009F -:1071C00000001000000008000000000000000000A7 -:1071D00000000000000008000000000000000000A7 -:1071E000000000000000820000000000000000001D +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000002100000000000000000000AE +:1071C00002800080A0C000C000000100000001217A +:1071D000000000000000000084000000000000002B +:1071E000000000000000008000000000000000001F :1071F000000000000000000000000000000000008F :10720000000000000000000000000000000000007E :10721000000000000000000000000000000000006E :10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:10726000000000000000000000000400000000001A -:10727000000000000000000000000000000000000E +:107230000000410000000800000000000000000005 +:107240000000804000400541004141000200410033 +:1072500002A01000000000001082000000000000EA +:10726000000000840084008400400300000000004F +:107270000800000000000000000000000000000006 :1072800000000000000000000000000000000000FE :1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE +:1072A00000000000000000000000000004000000DA :1072B00000000000000000000000000000000000CE -:1072C000000000000000820000001000000000002C -:1072D000000000000041000000410000000000002C -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E +:1072C000000000000000020000000200400000007A +:1072D00002000008104010212000C040840000007F +:1072E000C0400000100010002000200000400000FE +:1072F000000000400000000000000000000000004E :10730000000000000000000000000000000000007D :10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D :10733000000000000000000000000000000000004D -:10734000000003000000000000000000000000003A -:107350000000000000000002000000000390400454 -:107360000004000000000000000000000000000019 -:10737000000000000000000000000000000000000D +:10734000000000000000000080000000800000003D +:10735000000080000001800080008000000100002B +:10736000000000010000800080008000800000011B +:1073700000000000210100000000000000000000EB :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED -:1073A00000000000000000000000080000000000D5 -:1073B000000082000000000000000000000000004B -:1073C00000000000000000000000000082008200B9 -:1073D000000000000000000000000041000000006C -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000080000000000000003000200B0 +:1073D0001104000400080000008000A100802100CA +:1073E000854001400140010000800100008008004C +:1073F00000400040004000000000000000000000CD :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C :10742000000000000000000000000000000000005C :10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C +:10744000000000A0000000000500000800088208FD +:10745000800802010001000100000340414000409B +:10746000820002010201020102A00040020000406D +:107470000000000100010001000000000000000009 :1074800000000000000000000000000000000000FC :1074900000000000000000000000000000000000EC :1074A00000000000000000000000000000000000DC :1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC -:1074D00000000000024004200004820400000000BC -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C +:1074C00000000000000000000000000000C00000FC +:1074D0000008000001C100014000000001C190004F +:1074E0008300000100C000000000040201C102008E +:1074F0001101000000C000000000000200000000B8 :10750000000000000000000000000000000000007B :10751000000000000000000000000000000000006B :10752000000000000000000000000000000000005B :10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:1075500000000000000080800000000080000000AB -:10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B +:1075400000000000000000000000000000000080BB +:1075500000000080000009C109089105000511C163 +:10756000024188020003008000000000808011C1F9 +:10757000090288090010008000000000008000005F :1075800000000000000000000000000000000000FB :1075900000000000000000000000000000000000EB :1075A00000000000000000000000000000000000DB :1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB -:1075D0000000000000008000000080A08003808088 -:1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B +:1075D0000000800000008000418089000889C111FE +:1075E000028010218209C183800000030000800016 +:1075F000058011218200C18380000003000080000B :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A :10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A -:1076500000000000A0000000C000900008C110A0C1 -:1076600004C0000000000000000000000000000056 -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA +:107650000000000010000000C0000002880001913E +:10766000C100008801008401C189020000000000FF +:10767000C000008800008400C189020000000000F2 +:10768000C00000000000000000000000000000003A :1076900000000000000000000000000000000000EA :1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA :1076C00000000000000000000000000000000000BA -:1076D000000000000000000000000000A104009075 -:1076E000C0042010000000000000000000000000A6 -:1076F000000000000000000000000000000000008A -:107700000000000000000000000000000000000079 +:1076D0000000000000000008000000C08800000159 +:1076E000908501C140000090890001C100000000A8 +:1076F000000000C040000190880001C100000002AD +:10770000000000C0000000000000000000000000B9 :107710000000000000000000000000000000000069 :107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 :107740000000000000000000000000000000000039 -:1077500000000000000000000000000000004100E8 -:107760000000808000800000000000000000000099 -:107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 +:1077500000000000000000000080000000808008A1 +:107760000908418311C180090289850209C100000D +:1077700000000000008088050382831009C100001A +:1077800000800000008000000000000000000000F9 :1077900000000000000000000000000000000000E9 :1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 -:1077D00000000000000000000000000000000000A9 -:1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 +:1077D0000000000000000000800000000000000029 +:1077E000C108080941004009C185020903000202DD +:1077F0008000000000000000C18009081000401057 +:1078000080000000000000000000000000000000F8 :107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 :107830000000000000000000000000000000000048 :107840000000000000000000000000000000000038 -:1078500000000000000000000000000000820000A6 -:10786000000082008290A0888200000000000000DA -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 +:107850000000000000000000000008000000000020 +:107860000000C108010100000001C1C000010100C9 +:107870000000C000000000000000C1C001010000C5 +:107880000001C00000000000000000000000000037 :1078900000000000000000000000000000000000E8 :1078A00000000000000000000000000000000000D8 :1078B00000000000000000000000000000000000C8 :1078C00000000000000000000000000000000000B8 :1078D00000000000000000000000000000000000A8 -:1078E000000000000000000000004842000000000E -:1078F0000000000000000000000000000000000088 -:107900000000000000000000000000000000000077 +:1078E00000000000840000E000000000810000E0D3 +:1078F000000042000000000000000000600000E006 +:10790000070042000000000000000000000000002E :107910000000000000000000000000000000000067 :107920000000000000000000000000000000000057 :107930000000000000000000000000000000000047 :107940000000000000000000000000000000000037 :107950000000000000000000000000000000000027 -:1079600000000000000000000000220000220000D3 -:107970000000000000000000000000000000000007 -:1079800000000000000000000000000000000000F7 +:10796000FFFF0000F0F00000AAAA000000FF0000E6 +:10797000FFFF0000F0F00000FFFF0000FFFF00002D +:10798000FFFF0000F0F00000FFFF0000F0F000003B :1079900000000000000000000000000000000000E7 :1079A00000000000000000000000000000000000D7 :1079B00000000000000000000000000000000000C7 :1079C00000000000000000000000000000000000B7 :1079D00000000000000000000000000000000000A7 -:1079E0000000000000000000010000001100001174 -:1079F0000000000000000000000000000000000087 -:107A00000000000000000000000000000000000076 +:1079E0000000FFFF0000F0F00000AAAA000000FF66 +:1079F000000000000000F0F00000000000000000A7 +:107A0000000000000000F0F0000000000000F0F0B6 :107A10000000000000000000000000000000000066 :107A20000000000000000000000000000000000056 :107A30000000000000000000000000000000000046 :107A40000000000000000000000000000000000036 :107A50000000000000000000000000000000000026 -:107A6000000000000000A0A0000004011040040875 -:107A700010200000000000000000000000000000D6 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 +:107A600000000F0F00000F0F0000FFFF00000F0FBE +:107A70000000FFFF0000FF0000003C3C00003C3C19 +:107A80000000FFFF0000FF0000003C3C0000C3C3FB +:107A9000FFFF0000000000000000000000000000E8 :107AA00000000000000000000000000000000000D6 :107AB00000000000000000000000000000000000C6 :107AC00000000000000000000000000000000000B6 :107AD00000000000000000000000000000000000A6 -:107AE0000000000000000000A0A0000008022080AC -:107AF00001024080000000000000000000000000C3 -:107B00000000000000000000000000000000000075 -:107B10000000000000000000000000000000000065 +:107AE000000000000F0F00000F0F0000000000005A +:107AF0000F0F000000000000FF0000003C3C0000F1 +:107B00003C3C000000000000FF0000003C3C000086 +:107B1000C3C3FFFF000000000000000000000000E1 :107B20000000000000000000000000000000000055 :107B30000000000000000000000000000000000045 :107B40000000000000000000000000000000000035 :107B50000000000000000000000000000000000025 -:107B600000000000000000000000000012060000FD -:107B700000000000080000000000000000000000FD -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 +:107B600000000000000040028000002092024082DD +:107B70008001802092024082800180209202408217 +:107B8000800000209202458280098020920240827B +:107B900080000020820200000000000000000000C1 :107BA00000000000000000000000000000000000D5 :107BB00000000000000000000000000000000000C5 :107BC00000000000000000000000000000000000B5 :107BD00000000000000000000000000000000000A5 :107BE0000000000000000000000000000000000095 :107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 +:107C0000000000000000000000000000030002006F :107C10000000000000000000000000000000000064 :107C20000000000000000000000000000000000054 :107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 :107C50000000000000000000000000000000000024 :107C60000000000000000000000000000000000014 -:107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 +:107C700000000030005000030202004100035000E9 +:107C8000140000000000000000004040C0000000A0 +:107C900002000000000000000000000000000000E2 :107CA00000000000000000000000000000000000D4 :107CB00000000000000000000000000000000000C4 :107CC00000000000000000000000000000000000B4 :107CD00000000000000000000000000000000000A4 :107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 +:107CF0000000000000000000000000008000808004 +:107D0000040005000000000000000000000000006A +:107D100040004100000000000000000000000000E2 :107D20000000000000000000000000000000000053 :107D30000000000000000000000000000000000043 :107D40000000000000000000000000000000000033 :107D50000000000000000000000000000000000023 :107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000002000C3 -:107DA00020000000000000000000000000000000B3 -:107DB000000020000000C0000000080002002000B9 -:107DC0002000000000000000400000004000000013 -:107DD000C0002000C0002000400020002000000162 -:107DE00040002000C00840000000400000002000CB -:107DF00088002000200000002000C00004000400D3 -:107E0000200000002000200000002000000088006A -:107E1000000000004000040020002000200020009E -:107E20000000000000000000000000000000000052 -:107E3000209000000000000000000000800000080A -:107E4000000000000000000000000002000200022C -:107E5000000000000002000200000002000000001C -:107E60000000000000000000000000000000000012 -:107E70000000000040004000000000000002000080 -:107E800000000000000000000000000000004000B2 -:107E900000000000000000000000000000000002E0 -:107EA00009C00800000000040000000000000000FD -:107EB0000000400002040200400000000100000039 -:107EC00000080000000000000000000000020000A8 -:107ED00000020000000000000000000000000000A0 -:107EE0000200000000000000000800000000000088 -:107EF000000000000200020002000200000000007A -:107F00000200020000000000000000000200020069 -:107F1000020004400000000000000000000000001B -:107F200002000200800000080008000800080008A5 -:107F30000008000480008009800880080082020890 -:107F40000084008200000082000800820082008419 -:107F500000040008000000084002000800000002C1 -:107F60000000000400000000000000040000000009 -:107F70000000000000048000800880848008000069 -:107F8000000200000000000020000004400080000B -:107F900080008000000100000008000000080000D0 -:107FA00009000000000000000000000000000000C8 -:107FB0000000000000080020000000000000000099 -:107FC00000000000000000000000000000000000B1 -:107FD000000000050000000000000000000000009C -:107FE0000008000000000000000000000000000089 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000010000060 -:1080100000000000000090000000000000000000D0 -:1080200000000000000000000000009000000000C0 -:10803000000000000000000000010088008800002F -:108040000000000000000800000000000000000028 -:108050000000000000000000000000000000000020 +:107D7000000000000000000A00280A000C0080003B +:107D800000000400000000000000000000000003EC +:107D90000041400000000000000000000000000062 +:107DA0000000200020000000000020000000000073 +:107DB0000000200020020000000020000000000061 +:107DC000000020002004000000002000000000024D +:107DD000000020042000000000002000000000033C +:107DE00000000000200420040000000084000000C7 +:107DF00000000000200000000000000088000000DB +:107E000000000000200000000000000088000000CA +:107E1000000000000000040004000400040004004E +:107E2000000000000000000200020000000000004E +:107E300000900002000200040000000000000000AA +:107E400000000000000000000000000000000090A2 +:107E500000900000219000040000000000000000DD +:107E600000000000004000000000000000000000D2 +:107E700000000000000000000004000000000000FE +:107E800000000000000000040004000000000000EA +:107E90000000000200000000800000000000000060 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000400000000000800B6 +:107EC00002000000000000000000000000000800A8 +:107ED000080000000000000000000000000000009A +:107EE000020000000000000000000000000004008C +:107EF0000000000000000000000008000400000076 +:107F000010000280000000000000000000000000DF +:107F10000000040800000004000004040000001039 +:107F2000001002100000000800000082000000089D +:107F300000000008000000000000000000000084B5 +:107F40000008000000000008000000000000000819 +:107F500080008004000000000000000000004000DD +:107F600000080000000000000008000000001100F0 +:107F700011080000000000000000000000000000E8 +:107F800000000010000200000008000000000000D7 +:107F90000008008802880000000000008000000047 +:107FA000000000820000000000000000000000004F +:107FB00000000000000004000000000000000000BD +:107FC0000000000000000000000000000000880029 +:107FD0008820900000000000000000000000000069 +:107FE0000000000000000000000000000000000091 +:107FF000000000000100000000000000A0000000E0 +:108000000000000000000000000500000000000368 +:10801000004100410841820000000000000000090A +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:10805000000000010000000000000000000000001F :108060000000000000000000000000000000000010 -:1080700000000000080000000000000004000000F4 -:1080800008000000000000000000000000000000E8 -:1080900000000020000000000000000000000000C0 -:1080A00000000000000000000000000000000000D0 -:1080B000820000000000000000000000002000001E -:1080C0000100000000000000A0000000000000000F -:1080D000000000000000000000000003000000009D -:1080E0000000000000000000840000000800000004 -:1080F00000000000000000000000820000000000FE -:10810000000000000040084000400840000000401F -:108110000040004000008200000008000000000055 +:1080700004000000000002000000000000000000FA +:1080800000000000000000000000110000000000DF +:1080900000000000000000000000000000000000E0 +:1080A00000000000000008020000000000000000C6 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000800000000000000A8 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F000C0000000000040410800000000009000A7 +:1081000000000000002100210821A000000500005F +:108110000000000000000000C0000000000000009F :108120000800000000000000000000000000000047 -:10813000000000000000000000000000000000013E -:108140000000020000000000000000080000000025 -:10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF -:1081800000000000000000010001000100010000EB -:108190004101000100010000000000000000080093 -:1081A00008000000000000000000000000000000C7 -:1081B000000000000000200300000000820000001A -:1081C0000200C000C002000000000000000000200B -:1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000004000004F -:1081F000000000000000000000000000000000007F -:108200000000000000000000000000000800000066 -:10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E +:10813000000000000000000000000000000000003F +:108140000000000000000000000008000000000027 +:1081500041000000000000000000000000000000DE +:108160000000000000000000000000080000000007 +:1081700000000000000000C08000000000C000847B +:10818000009000900000000000A00000000000002F +:1081900000000000000000000000000000020000DD +:1081A00000000000000010000000000000000000BF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000008000000A7 +:1081D000000000000000000004000000000000009B +:1081E000000000000000000000000000040000008B +:1081F00088009000880000004004400020004000FB +:108200000020201100040005002000219000904172 +:1082100000000000004008040000000000410000D1 +:1082200000000000000000000000000082000000CC :10823000000000000000000000000000000000003E -:1082400000008000000000010000000000000000AD -:10825000000000000000000000000000000000001E +:10824000020000000000000000000000000000002C +:10825000000000000000000000008000000000009E :10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE -:1082800000000000000000000000050005000000E4 -:1082900003100000000000000000000000000000CB -:1082A00004000000000000000000000000000000CA -:1082B00000000000000000000000000084008400B6 -:1082C0008200020000000400408000000003000063 -:1082D000000000000000000000000000000000009E -:1082E0000000000000000008000000000000000086 -:1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:10831000000000000100000000000000000000005C -:10832000000000000000000000000000000000004D -:1083300000000000000000000000000000820000BB -:1083400000000008800000008000C1200000000044 -:10835000000000000000000000000000000000001D -:108360000000030000000000050000000000000005 -:1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED -:1083900000000000000002000000000000000000DB +:10827000000000000000000000000001000080007D +:10828000000000008000000100000000090000085C +:10829000000011000000000100A00000000000002C +:1082A00000000000000000880088000000000000BE +:1082B000200000000000000000000000000000009E +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000100008000001D +:1082E000018000000000000000000000000000000D +:1082F00000000000000000008400080020002000B2 +:108300008400200440040000000008040021000054 +:1083100000009009000000000000000000110000B3 +:108320000000000000090011000000110000000022 +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:1083500000000000000000000000000002000020FB +:1083600000000810000005000000000000000000F0 +:1083700000000000000000000000000080008000FD +:1083800080000008800980A10000000009C10000F1 +:10839000000000000000000000004100000000009C :1083A00000000000000000000000000000000000CD -:1083B00000000000040000000000000000000000B9 -:1083C00000000000000000C0018984210401400079 -:1083D000000000002000000000000000000000007D -:1083E000000000000000000000000000000000008D -:1083F000000000000000000000000000000000007D -:10840000000000000000000000C00000000000901C -:1084100000C000000000200000C0000000000008B4 -:1084200000C0000000000008000000000000000084 +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000108D +:1083E00000200000C090000000000000000000001D +:1083F00000000000000000000000000000008800F5 +:10840000880200880088028911030220001102C03E +:108410000000000082000000208200900008040894 +:108420009182009000909008000000000000000081 :10843000000000000000000000000000000000003C -:10844000000000000000000008A010038808802140 -:10845000A00000000000000000000000000000007C -:10846000000000000000000000000000000000000C -:1084700000000000000000000000000000000000FC -:10848000000000000000000000000080000000006C -:1084900000000080000000000000008000000000DC -:1084A000000000800000000000000000000000004C -:1084B000000000000000000000000000000200803A -:1084C0000000000000000000000009001110000082 -:1084D000808880008000800580000000000000008F -:1084E000000000000000000000000000000000008C -:1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B -:10851000000080000000001000008000000000103B -:10852000000080000000000000008000000000004B +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000800000000000000000008C +:1084700000000000000000000000200000000000DC +:108480000000008900002011890891858083051172 +:10849000000000004000000000000000000000009C +:1084A000800040000000000000800000000000008C +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C +:1084E0000000000000088080000000000000000084 +:1084F00000000000000000000000000000008000FC +:1085000080008000000200C100058085801000917D +:108510008008808010001100100008000000808892 +:1085200000080080000000A0800000800000000023 :10853000000000000000000000000000000000003B -:108540000010000000000000000000000100110009 -:108550000000C0890400200010000400000000009A -:10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000000FB -:1085800000000000000000000000000000000000EB -:1085900000000000C000000000010000C00000005A -:1085A00000010000C000080000000000C000000042 -:1085B00000000000000000000000000000000000BB -:1085C000000000000000000000000000000010118A -:1085D0000009000101C100020002002000040000A7 -:1085E000000000000000000000000000000000008B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:108560000000000090000009A0C000000000000012 +:10857000000000000000000000000000000090006B +:108580002000A000080090911083C09010C0080047 +:1085900002C0824004C00100000000000000900002 +:1085A00040C1A08390C0200004C140A020C00000B2 +:1085B00000000000000200000000000000000000B9 +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E0000000000000000088000000904002000031 :1085F000000000000000000000000000000000007B -:10860000000000000000000000000000000000006A -:1086100000880000000000C090000000000000C0C2 -:1086200000000008000000C000000090000000C032 +:10860000008800100000000802100990C1108220AC +:10861000C10411C0C0C003900000000000010001AF +:10862000A1020082C08882C0A1080008C0040482A0 :10863000000000000000000000000000000000003A :10864000000000000000000000000000000000002A -:108650000011209103210985008000800000008026 -:10866000000000000000000000000000000000000A +:10865000000000000000000000000000000000001A +:10866000000000000000000000000000000000808A :1086700000000000000000000000000000000000FA -:1086800000000000000000000000000000000000EA -:10869000000000000000000000800000000000005A -:1086A00000800000000000000080000000000000CA -:1086B000008000000000000000000000000000003A +:1086800000000000008000000000C1801100900088 +:10869000880041809100A00088800008002000210F +:1086A00000034180000080000000418000808000C5 +:1086B00000000000000000000000000000000000BA :1086C00000000000000000000000000000000000AA -:1086D0000000C190A1080511000300000000000087 -:1086E000000000000000000000000000000000008A -:1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000000069 -:1087100000000000000000000000000080000000D9 -:108720000000000080000000000000008000000049 -:108730000000000000000000000000000000000039 -:108740000000000008009000080010000000000079 -:1087500000000000C1C00490402100000000002083 -:1087600000200000000000000000000000000000E9 -:1087700000000000000000000000000000000000F9 -:1087800000000000000000000000000000000000E9 -:108790000000000000000000008800008800C00009 -:1087A000009000000000C000008800000000C00031 -:1087B0000000900000000000000000000000000029 +:1086D000000000000000000000000000000000009A +:1086E00000000000000000000000001080200000DA +:1086F00080000000000000000000000000000000FA +:108700000000000000000080000000002100A00424 +:108710000800030000008080808000000005002128 +:108720000000001100008000000000000020000098 +:1087300000800000000000080000000000000000B1 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:1087600000000000000000000000000020018888D8 +:108770009000020000000000000000000000000067 +:10878000000000000000000000020088000005005A +:10879000111004900400100002040210040000886C +:1087A000000000000000400002C0A0C088000800D7 +:1087B0000804A04088000000000100000000000044 :1087C00000000000000000000000000000000000A9 -:1087D000000000000000884100E007008400000065 -:1087E0000000000000000000000000000000000089 -:1087F0000000000000000000000000000000000079 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000008108 +:1087F00000000700008200000000000000000000F0 :108800000000000000000000000000000000000068 -:108810000000000000000000000000000000000058 -:108820000000000000000000000000000000000048 -:108830000000000000000000000000000000000038 -:1088400000000000000000000076767600000000C6 -:108850000000000000000000FF000FF03C3C303042 -:1088600000000000C3C3C999000000000000000020 -:1088700000000000000000000000000000000000F8 +:10881000000000E000005042000000E0000048427C +:1088200000000000000000000000000000004842BE +:1088300000000000000048420000000007000000A7 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:10887000FF3C003C00000000000000000000000081 :1088800000000000000000000000000000000000E8 -:1088900000000000000000000000C3C3C3C3C3C346 -:1088A000FFFF0000FFFF0000FFFF0000FFFF0F0FB2 -:1088B000FFFF0F0FFFFF0F0FFFFF00000000000082 -:1088C0000000000000000000000089FFFFFF000022 -:1088D0000000000000000000000000000FF0000099 -:1088E000303000000000FFFFF99900000000000098 -:1088F0000000000000000000000000000000000078 +:108890000000284100002800002820400402280091 +:1088A00000280000000000000000A00000A0280038 +:1088B0000028200410082010408000000000000064 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F0000000FF8D008D000000C30000000000009C :108900000000000000000000000000000000000067 -:10891000000000000000000000000000C3C3C3C34B -:10892000C3C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFCF -:108930000F0FFFFF0F0FFFFF0F0FFFFF00000000E3 +:1089100000000303000028414100004110800801CD +:1089200041000041000000000000000005000005BB +:1089300041000041400280010408020100000000E3 :108940000000000000000000000000000000000027 :108950000000000000000000000000000000000017 :108960000000000000000000000000000000000007 @@ -116920,478 +116920,478 @@ :1089A00000000000000000000000000000000000C7 :1089B00000000000000000000000000000000000B7 :1089C00000000000000000000000000000000000A7 -:1089D00000000000000000000000000000000F0F79 -:1089E00000FF0F0F060600000000C7C1FF000000D7 -:1089F0000000000000000000000000000000000077 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F00000000000000000FF66DB00810081000035 :108A00000000000000000000000000000000000066 -:108A10000000000000000000000000000000000056 -:108A2000FFFFC3C3FFFF9999FFFF0000FFFF999964 -:108A3000FFFFC3C3FFFF9999FFFFC3C300003C3C86 +:108A1000000000000000000000A0000505000005A7 +:108A2000402002040000821400000000000000004A +:108A3000008200140108020400820014008800442F :108A40000000000000000000000000000000000026 :108A50000000000000000000000000000000000016 -:108A6000000000000000060600000000C7C7FFFF6E -:108A700000000000000000000000000000000000F6 +:108A60000000000000000000000000000000000006 +:108A7000000000000000000000FF66DB00810081B4 :108A800000000000000000000000000000000000E6 -:108A900000000000000000000000000000000000D6 -:108AA0000000FFFFC3C3FFFF9999FFFFFFFFFFFF18 -:108AB0009999FFFFC3C3FFFF9999FFFFC3C300004C -:108AC0003C3C00000000000000000000000000002E +:108A900000000000000000800000A0000500A00011 +:108AA00000A08010010882140000000000000000F7 +:108AB0000000820014008010402082001400880012 +:108AC0004400000000000000000000000000000062 :108AD0000000000000000000000000000000000096 -:108AE0000000A041202D804D000800000000000083 -:108AF0000001000000000000000000000000000075 -:108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B2000000000004002800000209202408280008D -:108B30000020920240828000002092024082800049 -:108B400000208A0200000000000000000000000079 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000E38001020 +:108B00000001000000000000000000000000000064 +:108B1000000000000000000000000000606100078D +:108B2000000D100000610007000D08000061000644 +:108B3000000D0000600000000000100000000000B8 +:108B40000000080000000008000000A00000000075 :108B50000000000000000000000000000000000015 -:108B6000000000000F00FF000000000000000000F7 +:108B60000000000000000000000000000000000005 :108B700000000000000000000000000000000000F5 :108B800000000000000000000000000000000000E5 -:108B900000000000000000000000000000000000D5 +:108B90000000000000000000000000000000008055 :108BA00000000000000000000000000000000000C5 -:108BB00000000000000000000000000000000000B5 +:108BB0000000410043000000000000000000000031 :108BC00000000000000000000000000000000000A5 :108BD0000000000000000000000000000000000095 -:108BE0000000000000000F00000000010000000075 +:108BE0000000000000000000000000000000000085 :108BF0000000000000000000000000000000000075 :108C00000000000000000000000000000000000064 :108C10000000000000000000000000000000000054 :108C20000000000000000000000000000000000044 -:108C30000000000000000000000000000000000034 +:108C300000000000410041000000000000000000B2 :108C40000000000000000000000000000000000024 :108C50000000000000000000000000000000000014 -:108C6000000000000000000070F27DFF0000000026 +:108C60000000000000000000000000000000000004 :108C700000000000000000000000000000000000F4 :108C800000000000000000000000000000000000E4 :108C900000000000000000000000000000000000D4 :108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 +:108CB000000000000000AAAAAAAA0000000000000C :108CC00000000000000000000000000000000000A4 :108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000030F33CFF010124 -:108CF0000101000000000000000000000000000072 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 :108D00000000000000000000000000000000000063 :108D10000000000000000000000000000000000053 -:108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 +:108D2000000000000000808000000000000000A0A3 +:108D30000000000000000000AAA8AAAA000000008D :108D40000000000000000000000000000000000023 -:108D500000000000000000000000000020002000D3 -:108D60000000200020002000000000000000200083 -:108D70000000400000000000200000002000200053 -:108D800000002000200000008800002020001100CA -:108D9000410021030000C00040000000000320004B -:108DA0002100C00000000000020000000000880058 -:108DB000880002000200880000002000000004007B -:108DC0000400000004000000200000000400000077 -:108DD00004002000200000808900210000800000A5 -:108DE0000000000000000000000000000000000083 -:108DF00000000000900000000000000000000000E3 -:108E000000000000000000000000000000018000E1 -:108E1000A000200010000000400000020000000040 -:108E200000001000000240001000000000000000E0 -:108E30000000000000000000000000000000000032 -:108E400000004000000000001000000000000000D2 -:108E500000000000000000000020040004000020CA +:108D500000000000000000000000000000002000F3 +:108D600000000004000000000000000000000000FF +:108D700000000004000000000004000400000000E7 +:108D8000A00000004000018000000004000000007E +:108D900000000000000000000000000000030000D0 +:108DA000000000000000200000000004000401009A +:108DB00000000000010000000000000400000000AE +:108DC0000000000000002000000000000000002063 +:108DD0000000000000001000000000000000000083 +:108DE000000000000002000000020002000000007D +:108DF0000002000000000000000000000000000071 +:108E0000000000000090800020200000000100020F +:108E10000000000000000000410000000000000011 +:108E2000000000000000000020C000000000000062 +:108E300020000000000020000000000000000000F2 +:108E40000000000000000000000000000000000220 +:108E5000000100020000000000020000000000000D :108E60000000000000000000000000000000000002 -:108E700000000005000000040000000000000000E9 -:108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000020004CC -:108EA00000000000000000040000000300040004B3 -:108EB00000000000000000050000000000000000AD -:108EC0000011080000000000000000000400040081 -:108ED000040000000000000000000000000000008E -:108EE00000000008008400080008000800080008CE -:108EF0000008000800080008000800080008000832 -:108F000000080084000400080008000800080008A9 -:108F10000008004000080004008400080008000861 -:108F20000008000000840000000820080008000875 -:108F300000080008008400080008008400082008D9 -:108F400000100010800800000010001000108008C1 -:108F500080108010000000080084000000400040E5 -:108F600000000000000000080000000000110000E8 -:108F700000000000000000050000000000000000EC -:108F8000000000000000000300000000000200A03C -:108F900000000080002100000000010000210021ED -:108FA0000040001100000008000000000004004024 -:108FB000004000000000000300200000010300004A -:108FC000000000000000000500000008000204038B -:108FD00004000400900800000000000000000000F1 -:108FE0000000000300000000090004000000110060 -:108FF000410005000920040000000500410000A018 -:109000000000000000000008000000000040000018 -:1090100008054000040400080000000020000000D3 -:109020000000080000000000000000000000000137 -:10903000000000000000000008000801000004001B -:109040000000000000000000000000000000000020 -:109050008000800080000000000000000000000090 -:1090600009000000000000000000000000000000F7 -:1090700000000000000000000010000000000000E0 -:1090800000000000C000C000000010000000000050 -:109090000110000000050005000482080000019096 -:1090A00000000000000000000000C000822100005D -:1090B0000000080000000800000000000083088095 -:1090C00008200000000082000000080000000800E6 -:1090D00010090420A000820000000000100082009F -:1090E000000082A00020822000200000000000007C -:1090F00000000900000000000000009100000000D6 -:1091000000C000000000000000000000000000009F -:10911000000040010000000000000001000100000C -:10912000080900000000000000000000000000002E -:1091300000000000000000000500000000000040EA -:109140000040100100A0000000000000000000002E -:10915000000000000001000000000000000000000E -:1091600000000300000300010001000100000000F6 -:109170009000000090000000840000000400040043 -:1091800000000800000000000000000000000200D5 -:109190000000000000080000040000000000204063 -:1091A000000400040000A000000000000000000017 -:1091B000000000000000000000000400000000802B -:1091C000008001A00000002000000003002100003A -:1091D00000088200820000000009002000820800D0 -:1091E00000000021002008000040000000000000F6 -:1091F0000900000000000000000000000000110055 -:109200000400000400200000000000000000000036 -:10921000000000000000000100000000000000004D -:1092200080010001000100000000000000000000BB -:10923000000000000000000000000000000000002E -:109240000020002002200000210021000000210059 -:109250004000000000040000400000000501002163 -:1092600000000000000000000000000100000000FD -:109270000000000000000000000088000000000066 -:1092800000000000000000000000002100000002BB -:1092900000000000000000000000000000000000CE -:1092A000000008080008010800000000000000009D -:1092B00000000000000000000000000000000000AE -:1092C0000000038002000080028000000000000017 -:1092D00000000000080000000000000800800000FE -:1092E000000082000800002100004080A180018071 -:1092F000010200000000000000000000000000006B +:108E70000000020000400040000000000000000070 +:108E8000000000000000000000821000000004400C +:108E9000000000000000900000000000080000003A +:108EA000000004000400004000000000000000007A +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000200058000000200000000000400000005 +:108EE000000000000000000800080000000800006A +:108EF000000000080000000000000008000800005A +:108F000000080000000000080008000380100000B6 +:108F100080840008000000000000040804088000AD +:108F20000008000000000000000900080000000028 +:108F30000800000000080000000000000090000889 +:108F400000000010000000000010001009000000E8 +:108F500000840008842000000000000804000008CD +:108F600000040008000000030000000000000000F2 +:108F700000000010000000000000000000000000E1 +:108F800000000000000000000000000000000100E0 +:108F900000000000000000000000000000000000D1 +:108FA00000000010000000000000000000000004AD +:108FB00000000000000000100010001000008210EF +:108FC00040100010000000000080000000080000B9 +:108FD0000000000000000000200800000000000069 +:108FE0000000000800000000000000000000000079 +:108FF0000000000000080000000000000000000069 +:109000000000000000000000080005000000000053 +:109010000400000000040000000000000000400008 +:1090200000000200000000000000000008004100F5 +:109030000001000010000000001021100010008846 +:1090400009100010000000000900031000000300D8 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000080000000000E8 +:10908000000084000000000004000400040004004C +:1090900001000000000000008200820082008200C7 +:1090A0000000000084000000000000000000080034 +:1090B0000000080000000000000020101010000454 +:1090C00010048210A010A010C004000000000000D6 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:1091000000000500000000000000800080008000DA +:1091100080001000000000000000100000000000AF +:10912000000000000000000000000000000000003F +:1091300000000000000000000000000080000000AF +:10914000000000A00000000000080008000000A0CF +:10915000000000000000000000000000000000000F +:10916000000000A0000800000000008200000000D5 +:1091700000000000000800000000000000000000E7 +:10918000000000000000000000000000000082005D +:1091900000000000010001800100018000000000CB +:1091A000000000004000040000000000000000007B +:1091B0008204820400030010201000040004100048 +:1091C000204100000010C0000400A000C00000000A +:1091D000040000000000000000000000000000800B +:1091E000000000000000000000050000000000007A +:1091F000000000000000000000000000000000006F +:10920000000000000000000000000000000000005E +:109210000000000000004000040440880404000036 +:10922000000000000000000000000000000000003E +:1092300000200420000004200490A0101011101140 +:109240000090A10000000000030400900020042012 +:1092500041200020118809880590030003000300C5 +:10926000002000000084002000000000000000003A +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE +:109290000000080084004000000000000000000002 +:1092A000000000000000000000000000000084003A +:1092B0000000820000020800820000031004001079 +:1092C0000010001120112009000000000000000023 +:1092D000000000000000000000008200000000000C +:1092E000000000000000000000000000000000037B +:1092F000000000000000000000000000000000006E :10930000000000000000000000000000000000005D :10931000000000000000000000000000000000004D -:10932000000000000001000010000000000000002C -:10933000000000020000000000000000000000002B -:1093400000000000844080000020804000000000F9 -:1093500000000000108200000082000000000008F1 -:10936000000000000000050000820584004008089D -:1093700008080801000000000000000000000000D4 -:109380000000000000000100A0000000000000003C -:10939000000000000000000000000000A0A1000389 -:1093A0008890001000018900840100010000000085 -:1093B00000000000000000000000000000000000AD -:1093C00000000000000010C00090004000000000FD -:1093D000000000000000000000000000000010106D -:1093E0001090029082820000000000000000000146 -:1093F00000000000900000000000000000000000DD -:109400000000000000000000030000000000000059 -:10941000000000000000000000000000000083C108 -:1094200009088002009000118903800300090000F0 -:10943000000000000000000000000000000000002C -:10944000000000000000000091800000008000008B -:10945000000000000000000000000000000000000C -:10946000800090800000808000000000000000006C -:109470000041100000020009000000000000000090 -:109480000000000000000000000000050000008057 +:10932000000000000000000000000000000000003D +:10933000000000000000000100000000000000012B +:1093400000080008000080008010000800000000F5 +:10935000000000000000000000000000000000000D +:1093600000A0000800000008008200080000008241 +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:109390000000000000000000000000000008880439 +:1093A00040A0000400000000000000001088000839 +:1093B0000020201000000802009000081008109003 +:1093C00002020008C02000000000000000000000B1 +:1093D00000000000000000A00008204000900000F5 +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:109410000000000000000000000000000000080341 +:1094200085808580008000000000000000000000B2 +:10943000008000000080000000C0004000C080C02C +:1094400080808000058000000000000040000000D7 +:10945000000000000000000040804000008000008C +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC :1094900000000000000000000000000000000000CC -:1094A00021802108828841089100830085008389FA -:1094B00000000000000000000000000000000000AC -:1094C00000000000000000000000800000210000FB -:1094D0008000000000000000000000000008000004 -:1094E0000000000080038080800000000000000079 -:1094F000000000000000000080800000000000006C -:10950000000000000000000000000000000000A0BB -:109510000002000000000000000000000000000049 -:10952000000091A00201A0081101108888008500A8 -:10953000C1890000000000000000000000000000E1 -:10954000000000000000000000000000100000000B -:109550000000C0000000000000000000000000014A -:1095600000900000200002008282900000000000B5 -:1095700000000000100000820000C0020000000097 -:1095800000000000000000000000000000010000DA -:1095900000000000000000000000000000000000CB -:1095A00000000000A0100008A189081000000000C1 -:1095B00001010101000000000000000000000000A7 -:1095C0000000000000000000000000000000900209 -:1095D0000008000000C000000000000000000000C3 -:1095E000000000000000020200020009101100004B -:1095F00000000000000000010188A01000C1000070 -:10960000000000000000000000000000000000401A -:109610000005002000030000000000000000000022 -:10962000000000000000808221C1A108088800031A -:10963000202008051141000000000000000000008B -:1096400000200000000002000000000000000000F8 -:10965000008000000000008000000000000000000A -:109660000000000000000000808000800088904121 -:10967000000000000000000005101000119100C162 +:1094A000000040038280C1C10000000000000000F5 +:1094B0000000000000000000000080800088000024 +:1094C000008880100082800880800008000000086A +:1094D00000000000000000000000030003030880FB +:1094E00040800000000000000000000000000000BC +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000000000005B +:109510000000000000000000000000000008000043 +:1095200000082090404183A091A1000000000000AD +:10953000000000000000000000000000080202C05F +:10954000208420C1020004C0829104C000000000F9 +:109550000001000000000000000000000000000109 +:10956000010200A000000000000000000000000058 +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000001000000CA +:1095A000900000008801004104A109910000000022 +:1095B00000000000100200A00010101000008990B0 +:1095C0000010C1020804C1042004C004039000007C +:1095D00020000000000000000000000000008801E2 +:1095E0000001000108000000000000000000000071 +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A +:109610000000000000000000000000000000080042 +:1096200000000000000080090008800208C100005E +:1096300000000000000080000080000080000000AA +:10964000410021809000008041808000800088805F +:109650000000800000000800000000000000000082 +:1096600000100020002100030000000000000000A6 +:1096700000000000000000000000000000000000EA :1096800000000000000000000000000000000000DA -:10969000800000008000800000000000000000004A -:1096A000000000000000000011820980098088028B -:1096B0004103218903800311000000000000000025 -:1096C000000000000000000000000000000000009A -:1096D00000008008001000000000000000000000F2 -:1096E0000000000000000000000080080080808072 -:1096F00000000000000000000000000000000080EA +:1096900000000000000000000000000000000000CA +:1096A000000000080000000040A1914102001111DB +:1096B00000000000000000000000000000000000AA +:1096C0000000211109002000200080080080008097 +:1096D000000000100000000000000000000000007A +:1096E000000000800000800000000000000000007A +:1096F00000008005000000000000000000000000E5 :109700000000000000000000000000000000000059 -:10971000000002002000020008000000000000001D -:109720000000000000000000000010C0A08241A066 -:1097300008000120009101840001000000000000E9 -:109740000000000000000000000000000000000019 -:1097500000000000C0001089209000000000000000 -:109760000000000008000800880088009000828245 -:1097700008081000000000000000000000000008C1 -:1097800000100000000000000000000000000000C9 +:109710000000000000000000000000000000000049 +:1097200000000000000000000000C0C191A0C1A026 +:10973000A101000000000000000000000000000087 +:10974000000000000500080208100400080040089E +:1097500002102000000000000000000000000000D7 +:109760000000000090C0080002000400000000009B +:109770000000000090000000000000000000000059 +:1097800000000000000000000000000000000000D9 :1097900000000000000000000000000000000000C9 -:1097A000000000000000000000000000821100E046 -:1097B00007004100500000E0000000000000000031 -:1097C0000000000000000000008400000000000015 -:1097D0000000000000000081000007000000000001 -:1097E00000000000000000000000000000000081F8 -:1097F0000000070000000000000000000000000062 -:109800000000070000000000000000000000000051 -:10981000000000000000FFFF0F0F0000000000002C -:109820000000000000000000000000000000010037 -:1098300041410020AA8A0000000000000000000052 -:109840000000000000000000000000000000000018 -:109850000000000000000000F0F000FFA0A0282899 -:1098600000000000000000007C704C400000000080 -:1098700001000100828282820000000000000000DE -:1098800000000000FFF0FF000000000000000000EA -:109890000000000000000000C3EBC34B000000000C +:1097A000000000000000000007000000818100E0D0 +:1097B0000700500A00000000000000000000000048 +:1097C000000000000000000000000000484200000F +:1097D00000E000004842000000E00000000000003F +:1097E0000000000000000000000000004100000038 +:1097F00000000000000000810000070000000000E1 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000363CC6 +:1098300002000F0000000000000000000000000017 +:109840000000000000000000020880200408102032 +:10985000001100222400002400000000000000008D +:1098600000000000000000000100000000000000F7 +:109870000000000000000000FFFF000000000000EA +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000000C8 :1098A00000000000000000000000000000000000B8 -:1098B000551441410020AA8A000000000000000069 -:1098C0000000000000000000000000000000000098 -:1098D0000000000000000000000000000000A0A048 -:1098E000282800000000000000007F734F430000A4 -:1098F00000000100FFFF8F82828200000000000054 -:1099000000000000000000F0000000000000000067 +:1098B000363CFFFF0F000000000000000000000029 +:1098C0000000000040000000000001044010010200 +:1098D0004080110022008100008100000000000093 +:1098E0000000000000000000000000000000000078 +:1098F00000000000000000000000FFFF000000006A +:109900000000000000000000000000000000000057 :109910000000000000000000000000000000000047 :109920000000000000000000000000000000000037 -:10993000000087D20550BB11BE14000000001414B3 -:10994000A6AA0000000000000000000000000000C7 -:109950000000000000000000000000000F000F0FDA -:109960003C3C141400000000000000000000000057 -:109970000000000000008080F0F000000000000007 -:10998000000000000000000000003C3C000000005F +:109930000000FFFF1000030CB3BC0000000000009B +:1099400000000000000000000000000004100140C2 +:1099500004011040040110400690000000000000C7 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 :1099900000000000000000000000000000000000C7 :1099A00000000000000000000000000000000000B7 -:1099B0000000000087870505BE14BE1400000000EB -:1099C0000000AAAA00000000000000000000000043 -:1099D00000000000000000000000000000000F0078 -:1099E000000000001414000000000000000000004F -:1099F000000000000000FF00FF80F0F20082000085 -:109A00000000000000000000000055555555000002 -:109A100000000000000000000000000000000061E5 -:109A20000006000D00000000000000000000000023 -:109A30000000000000008060002480090000004158 -:109A40000000800000050000000000000000000091 -:109A500000610006000C0000000000000000000093 -:109A60001000202800400008000000000000000056 -:109A7000000000000000000000610026000D000052 -:109A8000000000000000000005610A06059D00A519 +:1099B00000000000EBFF1000F3FC030C00000000AF +:1099C00000000000000080000000000000000820EF +:1099D000028008022080080220800000069000001B +:1099E00000000000000000000000000000000080F7 +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000050031 +:109A30000A08050000A000610E3DC00D00000000F6 +:109A40000000000000000000000000000000000016 +:109A500060610006000D100000610007000D0800A5 +:109A600000610007000D0000000000000000000081 +:109A700000610006000D0000000000000000000072 +:109A800000000020000000000000000000000000B6 :109A900000000000000000000000000000000000C6 -:109AA00000000000F3FB03010000000000000000C4 -:109AB000000000000000000030717130AA00CCCC22 -:109AC0007C50FF007C7CA07C0000000000000000B7 -:109AD0000000000000003C3C00000000000000000E +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000005A5A144100A0555553 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000AAFFBD -:109B000000550000000000000000000000003CFFC5 -:109B10003C00000000000000000000000000000009 -:109B2000000000000000F3FBF3FB00000000000059 -:109B3000000000000000000000007171303000AA39 -:109B4000CCCC7C505555A0A000FC000000000000CB -:109B500000000000000000003C3C0000000000008D +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B3000000000000000000000005A5A3CC3000072 +:109B40005955000000000000000000000000000067 +:109B50000000000000800000000000000000000085 :109B600000000000000000000000000000000000F5 -:109B700000000000000000000000000000000000E5 -:109B8000005500550000000000000000000000002B -:109B90003C003C000000000000000000000000004D +:109B700000000000000000000001000000000000E4 +:109B800000000000000000000000000000000000D5 +:109B900000000000000000000000000000000000C5 :109BA00000000000000000000000000000000000B5 -:109BB0000000000000000000000000000C0096966D -:109BC00050A0AA00FF5104043C3C3CB60000000039 +:109BB0000000000000000000000000000000FFFFA7 +:109BC000F00505F0000000000000000000000000AB :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 :109BF0000000000000000000000000000000000065 -:109C000000000000000000000000000000005555AA -:109C10000F0F000000000000000000000000000026 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 :109C20000000000000000000000000000000000034 -:109C300000000000000000000000000000000C0018 -:109C4000C3C35CACAA00FF550000303030300000C8 -:109C50000000000000000000000000000000000004 +:109C30000000000000000000000000000000000024 +:109C4000FFFFF50505F50000000000000000000022 +:109C50000000000000000000000000800000000084 :109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000000E4 +:109C700000000000000000000000000003000000E1 :109C800000000000000000000000000000000000D4 -:109C90003C3C3C3C00000000200020002000200054 -:109CA000200020052000880820002000200420003B -:109CB0002000200020002004200020004000200080 -:109CC00000000400000000004000200020002000F0 -:109CD00020000000200220000003200020000400DB -:109CE00040000000200000000005200020002008A7 -:109CF00040002000000020008411200000004000EF -:109D0000200000000200000000000000040000022B -:109D1000040020000000000084000000000000009B -:109D200000000000000000000000008400840084A7 -:109D30000000008440000000090000000000200036 -:109D4000000000002000000000042000000000903F -:109D5000100200002000000200000000000040008F -:109D60004000000000000000004000000000000073 -:109D70000000200000000000400000000000000083 -:109D8000A000000000008000000000002000410052 -:109D90000000000000004000000000000000000083 -:109DA00000000000000000000000000000000000B3 -:109DB0000000000000050000000420050000000075 -:109DC000000400080000000000080003000000007C -:109DD000000000050000000000000100000000007D -:109DE0000000000400000000000000000000000867 -:109DF0000000000000000000000000000100110051 -:109E000040000300090010000900210003000900C0 -:109E1000210021004000110002001100090000088B -:109E20000008000800080084000800080084000002 -:109E3000000800080008000800100008800800085A -:109E400000080008008400080008008400080000E2 -:109E500000080010000800080008000820080000A2 -:109E600000080008000800080008000800080008B2 -:109E7000008800840000000800080008000820088E -:109E800088088008900890088084840890842008BE -:109E90009084C0829008901088088008A0089008DC -:109EA0000021402100214021000800000000001096 -:109EB000842120218821004000210008000000109A -:109EC00000210021002100000021000000000040CE -:109ED0000003000900210020000300000021000011 -:109EE0000000000000000021002100050002000326 -:109EF000000300000008002100090000000000002D -:109F00000009002000218803880084000000000868 -:109F10008400002000210004000000210000002136 -:109F200000200000000004000000000000004100CC -:109F30000000000000000000000000000000000021 -:109F40000000000000000000000000001100000000 -:109F50000000000841000082000003000000100023 -:109F60000090000000000000080000000000000059 -:109F70000000110000A000000000000000000090A0 -:109F800000000000050000001100000000001100AA -:109F90000000048400080000000000080000000029 -:109FA000410041A01000001000000000000000006F -:109FB0000000080082000004000000000000000013 -:109FC0000000A00082000000000000000800000067 -:109FD0000000080082000000C000840000000000B3 -:109FE00000000000000082000000820082000000EB -:109FF0000041000000000000000000000009000413 -:10A0000000040004000401020004012000000040DC -:10A010000104002001100102004008C008100100E6 -:10A020000108002001040000000000000000000002 +:109C9000000000000000000000002000000800009C +:109CA00020002000000088002000000000000000CC +:109CB0002000200000000041000020000000000201 +:109CC0002000000000000000200000000000000450 +:109CD0002000200000000008000300002000000415 +:109CE000000420000000000000002000000000022E +:109CF0000004200020000000000000002000000000 +:109D0000000400000000000000002000000000022D +:109D10000002000000000000040000040000000039 +:109D2000000000000000000200020000000200002D +:109D300000820000000000000000000000000000A1 +:109D400000000000400000000000000000001100C2 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000002F1 +:109D700000000002000000000000000000000004DD +:109D800000000000200000000000000000000002B1 +:109D900000000004000000000000000000000000BF +:109DA00000000000000002000000000000000000B1 +:109DB0000000000000000000000020000000004043 +:109DC0000000000000110000000000000000000082 +:109DD0000000000000000000000020000000000063 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000020010001100000040 +:109E00000000000000000004000802000200000042 +:109E10000000000000000000000010002100000809 +:109E20000008008400080008000800080008000876 +:109E300000000008000800840008000880000008F6 +:109E40000008000800080008000800080084000856 +:109E50000000000800080000000800088000000062 +:109E600000080008000800080008000800080000BA +:109E70000008000000080008000000088008C0106A +:109E800000840010008400840008001000100010FE +:109E90000008000000100010020000088008900078 +:109EA00000210021002100210040000000000021CD +:109EB0000021C0210021000200000000000000037A +:109EC0000003002100210000002008000000000025 +:109ED000C0009002900990000000000000000021E6 +:109EE00000000011000000000000100010008800B9 +:109EF0001008840000004000000000008400000200 +:109F000090210008000820089010C00084038408F5 +:109F100000210010000000080008000000000002FE +:109F20000021000000000000000000000000000010 +:109F300000000900210000000000000000000400F3 +:109F4000000005000000000000000000000000000C +:109F50000000000009004000400000000000040074 +:109F600004200000100009000020108221000000E1 +:109F700000040004002000000000000000040000B5 +:109F80002000000020000000000000000000000091 +:109F9000000000000000000000000000088208002F +:109FA00000000000000000000000000000000000B1 +:109FB000000000000000C00000008400000000005D +:109FC000000000004000820000008200000000004D +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000000000000061 +:10A00000000000000004000000000000000000004C +:10A010000000000000000000000000000000000040 +:10A02000000000000002000000000000000000002E :10A030000000000000000000000000000000000020 :10A040000000000000000000000000000000000010 -:10A050000000000000000000000000000000000000 -:10A0600000000000030000000000000000000800E5 -:10A070000000000000C000000090210000000090DF -:10A0800000000000000005000201000020010000A7 -:10A090000001100100010201020100010021000184 -:10A0A000020040A100010401000200000000400382 -:10A0B0001000000000080010000000000000000078 -:10A0C000002100000000000000000000000000036C -:10A0D00000000000082182000000000000050000D0 -:10A0E000000300210000002100000000002100000A -:10A0F0000020000090000000400000000003000964 -:10A10000840004200000C00900040200098000024D -:10A110000000020002204000C000A0020020001148 -:10A1200008200000A0000802000240040000000413 -:10A13000000002C00000030000000000000000005A -:10A14000000000000000000000000000000000000F -:10A15000000000882004008811C0000000000000FA -:10A16000008400000000000000000000000000006B -:10A17000000020000000000000000000400040003F -:10A1800009904000000000000000000000A0041042 -:10A19000000000200000080000040004000000008F -:10A1A000000000004000000005200800000300003F -:10A1B000000000000000000000000000000000009F -:10A1C0000000C000000300000000000000000000CC -:10A1D0001000000000000000A000000000000000CF -:10A1E000000000000021000000210002000000002B -:10A1F000000000000000000010000000000000034C -:10A200000000000000000000000000000800010045 -:10A2100000000080A000C000008000000180010359 -:10A220000880010988080003018900090100000075 +:10A0500000000000000000A0000000000000000060 +:10A0600000000000000000000000000000000000F0 +:10A0700000000000100000000000000000000000D0 +:10A080000020002000000001000400000000000883 +:10A0900000000000000000000000000000000000C0 +:10A0A00000A0000000A0000100000000000000006F +:10A0B000000002009000820000000000000000008C +:10A0C000000000000000000300000000004000004D +:10A0D0000000400000000811000000000000000027 +:10A0E0000000000000000000000000000000000070 +:10A0F000000000000240000400000000000000001A +:10A10000000000000021000000000000040000002A +:10A1100000000000020800000000004100000000F4 +:10A12000000000000000002100000000000000000E +:10A13000000000000000000000000000000000001F +:10A14000000000000000000000000000119000006E +:10A1500000000084000000881104000000000000DE +:10A160000000000000200000000000000400108437 +:10A1700000000404049021000090000004900000FE +:10A180000004000000002000000011002020000258 +:10A190000420092011000000000000000000000061 +:10A1A00000000000000000000000000000000000AF +:10A1B0000000000000000800000000000000000097 +:10A1C000000000000000000000000000000000008F +:10A1D000000000000000000000000000000200007D +:10A1E000000000000000000000000000000010005F +:10A1F000100000000000000000040000000000004B +:10A2000000000005000000000041002100000000E7 +:10A21000000000000000000000000000000000003E +:10A220000000000084030000000000110041000055 :10A23000000000000000000000000000000000001E -:10A240000000000005000000000000000000000009 -:10A2500000000000000000000000000000004000BE -:10A260000000008800000000000000000000000066 -:10A2700000000000000000000000100000000000CE -:10A2800041000900410000820000000000000010B1 -:10A2900020000000201020000000000200004020EC -:10A2A00020000020400000000000080400004000E2 -:10A2B000000000000000000000000000000000009E -:10A2C00000009000000200000000000000000000FC -:10A2D000000000000000000000000000000000007E -:10A2E000000001000002000000000000000000006B -:10A2F000000001000000000000000000000000005D -:10A30000000001000000000200000000000000004A -:10A310000000010000000000890300000800018423 -:10A3200010020800010100A02002000100010189C3 -:10A330000400000000000000000000000000000019 -:10A3400000000040020000000000000000000000CB -:10A3500000000000000000000000000000000000FD -:10A3600000000040080000000000000000000000A5 -:10A3700000000000100000000000000000000000CD -:10A38000000000001040210000000000000000005C -:10A390000000000041111021000040C10910001010 -:10A3A00040C100808020410800000000001000082B -:10A3B00010058000000010000000000000000000F8 -:10A3C00000000000840010000080800000000000F9 -:10A3D0000000000800001000000000000000000065 -:10A3E00000000000840090000080000000000000D9 -:10A3F000000000110000000021000000000000002B -:10A4000000000000000082009000009100000000A9 -:10A41000000000000002100003030000000010080C -:10A420004141008000839110008900410800110023 -:10A4300090410088809000000000000000000000B3 -:10A440000000000000000800020800108200100058 -:10A4500000000000000100000100000000000000FA -:10A460000000000000001100110800102000020090 -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000004000832000C0408861 -:10A4900088000000000000000000010000C0002053 -:10A4A0000100010100080011400308100001010033 -:10A4B000A000400100841011000000000000000016 -:10A4C0000000000000000000008800000200000002 -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000100000000000005C +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000000002000000000BE +:10A28000000000000000090020001004000400008D +:10A2900000000000000000000000000000000000BE +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000001000000000000009D +:10A2C0000000010000C000000000000000000000CD +:10A2D000000000000000000001000000000000007D +:10A2E0000001010000C000000000000000000000AC +:10A2F00000000000000000000000000088000001D5 +:10A300000110000100000010041000000000000116 +:10A3100000000000000000000000000088000001B4 +:10A320000108000100000010C0040000000000014E +:10A3300000000000000000000000410000000000DC +:10A340000000000208000080000000000000000083 +:10A3500000000000000000000000410000000000BC +:10A360000000001008000080000000000000000055 +:10A3700000000000000000000000001100000000CC +:10A3800000034000004002000000008000000000C8 +:10A39000004100000000000000000011000000006B +:10A3A00000034080004002000000000000000000A8 +:10A3B0000041000000000300000000800000800059 +:10A3C000000000000300900000800000000000007A +:10A3D0000000004100000300000000800000800039 +:10A3E00000000000030020000080000000000000CA +:10A3F0000000004100000000080000000000000014 +:10A40000400000000800020088000000100000006A +:10A4100000000000801000000800000000000000A4 +:10A420004000000008000200880000000900000051 +:10A4300000000000800800000100000000C00000D3 +:10A440002000000000009000111000022000100009 +:10A4500000000000000100000100000000C000003A +:10A460002000000000004000900200024000820036 +:10A4700000000000000100000000010000000000DA +:10A4800000000100000001000400090200000000BB +:10A49000020000000000C0010000010000000000F8 +:10A4A000000001000000010004008302000000C061 +:10A4B000100000000000C00000000000C00000000C +:10A4C0000000000000000000008800000000000004 +:10A4D000000000000000000000000000C0000000BC +:10A4E00000000000000000000088000000000000E4 :10A4F000000000000000000000000000000000005C -:10A500000000000000000000000000020000000049 -:10A51000000000000000000000000008000088406B -:10A5200000000000000121912000001100012084A2 -:10A53000010000000000C100000000000000000059 -:10A54000000000000000000000000000000080008B -:10A5500000000000000000000000000000000000FB +:10A5000000000000000000008800001000000200B1 +:10A51000000000000000000100000000000000003A +:10A520000000000000000000880000100000020091 +:10A53000000000000000000100000000000080009A +:10A54000000000000000000000000000000000000B +:10A55000000000000000000000000000000080007B :10A5600000000000000000000000000000000000EB :10A5700000000000000000000000000000000000DB -:10A5800000000000000000000000000000000000CB -:10A5900000000800000000000000000000000008AB -:10A5A000028820000000001008039100200800101D -:10A5B00041894100000000200311000000108000CC -:10A5C00000C1000000000000000000000041800801 -:10A5D00000030000000000000000000000108000E8 -:10A5E00000C10000000000000000000000C1800069 -:10A5F0000005000000000000000000000000000056 -:10A60000000800830000000000000000000000C1FE -:10A610000000000200000000000000000000904167 -:10A6200080000020000041110011C1410305418458 -:10A630000000808000004141004080004010000088 -:10A640002000004000000000000000000000008327 -:10A6500040000001000000000000000000000001B8 -:10A660002000004000000000000000000000000981 -:10A6700002000000000000000000000000000000D8 -:10A6800000008801008300000000000000000000BE -:10A690000011400000010000000000000000000068 -:10A6A00041898200A020000000000800849100A0E1 -:10A6B000C002000802C00000000100014020018922 -:10A6C000000000000000000000000000000000008A -:10A6D000810000E0000048000000000000000000D1 -:10A6E000000000000000000000000000000000006A -:10A6F000810000E0000048000000000000000000B1 +:10A5800000000000000000000009100300000000AF +:10A590000400000000000000004100000000000076 +:10A5A0000000000000000000001010030000000088 +:10A5B00009000200000000000041000000008000CF +:10A5C00000C10000000000000000000000C1000009 +:10A5D00000020000000000000000000000008000F9 +:10A5E00000C1000000000000000000000041000069 +:10A5F000000800000000000000000000000000084B +:10A60000800000C100000010800005000000004133 +:10A61000800000080000000000080000031000088F +:10A62000800000C100000010800005000000004113 +:10A63000800000050000000000200000050300006D +:10A64000400000C100000000000000000000000306 +:10A6500002000000000000000000000000000000F8 +:10A66000400000C1000000000000000000000041A8 +:10A6700010000001000000000000000000000000C9 +:10A680000001200000400000000020000300000046 +:10A6900000214000000100000000000000000189CE +:10A6A0000001200000400000000020000300000026 +:10A6B00000914000000100000000000000000009BF +:10A6C0000000000000000042000000000000480000 +:10A6D000810000E00000480000000000000000428F +:10A6E00000000000000000420000000000004800E0 +:10A6F000810000E00000480000000000000000426F :10A700000000000000000000000000000000000049 -:10A710000000810000E0000048210000000000006F -:10A7200000000000000000004800000000000000E1 -:10A730004842821200E00700604200000000000072 -:10A7400048000000000000000000000000000000C1 +:10A710000000811200E00700480000000000000077 +:10A720000000000000000000000000000000000029 +:10A730000000811200E00700480000000000000057 +:10A740000000000000000000000000000000000009 :10A7500000000000000000000000000000000000F9 :10A7600000000000000000000000000000000000E9 :10A7700000000000000000000000000000000000D9 @@ -117411,204 +117411,204 @@ :10A8500000000000000000000000000000000000F8 :10A8600000000000DE2E747B0000000000000000ED :10A8700000000000000000000000000000000000D8 -:10A8800000000000DE2E0000747B000000000000CD +:10A8800000000000DE2E0000257B0000000000001C :10A8900000000000000000000000000000000000B8 -:10A8A000000000000000DE2E752B000000000000FC +:10A8A000000000000000DEA4257B00000000000086 :10A8B0000000000000000000000000000000000098 -:10A8C000000000000000D4AE61560340000000000C -:10A8D00000000230A0000000000000000C4000005A +:10A8C000000000000000DEA461560340000000000C +:10A8D00000000231E0000000000000000C40000019 :10A8E0000000000002C06A866156034000000000BC -:10A8F00000000230A0000000000000000C4000003A -:10A900000000000002C06A8600006156034000009B +:10A8F00000000231E0000000000000000C400000F9 +:10A900000000000002C06A860000612603400000CB :10A91000000000000230A0000000000000000C4019 -:10A9200000000000000002C06A8660DE03400000F4 -:10A93000000000000231E0000000000000000C40B8 -:10A9400000000000000002C07B06000000100000B4 -:10A95000C000000000000000000000000000000037 -:10A9600020000000000000000000000000000000C7 -:10A9700000040000010001801080100200080000A7 -:10A980000004400000000000000000030000000080 -:10A990000010840000000000004084080000000057 -:10A9A0000040000000080010000800000000000047 -:10A9B0000000200000000400000020000000000053 -:10A9C0000000100000000000000000000000000077 -:10A9D0000000000000000000000000000000400037 -:10A9E00000008000000000000000000000000000E7 -:10A9F0004040000000000200044000200001000070 -:10AA00000002410300000000000000000000000000 -:10AA100000000000400000000000000100001000E5 -:10AA200040000000040000010001000000000000E0 -:10AA300041000000000000000000000000000000D5 -:10AA40004100400000004000400000000000000005 -:10AA500000000000000000000000000000000000F6 -:10AA600001020008000402000200000300000000D0 -:10AA70000000000000000000000000200020000096 -:10AA80000080100800050000000000000000000029 -:10AA9000002000000020002002400200A008010069 -:10AAA00000050205000200852190000820800408AE -:10AAB00000080000000000000000000090000000FE -:10AAC0000010001000000010000008000800001036 -:10AAD000000800080008001000080008000800082E -:10AAE0000008400900840009800880080008000868 -:10AAF0000008000800080008000800080011031101 -:10AB000000840020800200020010000400100008F1 -:10AB100000000009000800090009800980080004FD -:10AB200020840000000800850002900500008020BD -:10AB30008084000900080008000805080008058452 -:10AB400000080008058800080508050800840008BA -:10AB500000080021000000000000002100000000AB -:10AB60000100000200000000400000050003002179 -:10AB700000210000000000210021000000028808E0 -:10AB800000024000000000020088000300000000F6 -:10AB90000000000000020000000000210002000090 -:10ABA0000003000400008800040200080004000400 -:10ABB000000400202120042040201120C080A0009B -:10ABC00000800003002000000000000000000008DA -:10ABD00004400000000000000084000040840000E9 -:10ABE00000002000000000000000000000840000C1 -:10ABF0000000000200000000000000000000000053 -:10AC000000004100808400000000002000100000CF -:10AC10000000000000000000000000000000000133 -:10AC2000100000A00801000000840000410108009D -:10AC3000000000011101900100012001A0050202A5 -:10AC400009001002100400901100048241000088E5 -:10AC50000088000000000000000000000000010467 -:10AC60000104010401040884104000400040000079 -:10AC70000000004000400040000000400840000488 -:10AC80000080008400800000000000000000000040 -:10AC900000000000A00000000405200020002000AB -:10ACA0000100010003008200880000000000C100D4 -:10ACB000008000000100008000000080008000098A -:10ACC0000011000000090000000000090011000947 -:10ACD00000090000001100800000000000000000DA -:10ACE00002010201028302010002000100010001D1 -:10ACF00000000000000100010001038400010001C8 -:10AD000000A000400040002000000000418403003B -:10AD100000000000000000000000800080008000B3 -:10AD2000800002000400A00000840000030000086E -:10AD300010000910000004000002000000040008D8 -:10AD400009022000000009080000000000000000C7 -:10AD500000000000000011000002000004000000DC -:10AD60000008880000000000000000090002000048 -:10AD7000000000080000000200098202000000003C -:10AD80000000000000008800842000000000004057 -:10AD90000000004000100021002100000000000021 -:10ADA0000400040402200084C020200010000002DF -:10ADB000C0111000000820000004408000001100B5 -:10ADC00001910000112000800100000200000040FD -:10ADD000002000000000010400000000000000004E -:10ADE00000000000000000000000000008000983CF -:10ADF0000000000000000000000000401100000002 -:10AE00000000000000000004000000080400000032 -:10AE10000010000000000000000000000000000022 -:10AE200000008002A00180000020000080040808CB -:10AE300040014000902000099000000100020282C1 -:10AE4000A0841004002010004008100020210200FF -:10AE500000040990118800041000209005040000EF -:10AE6000000000000000000000000021200001039D -:10AE700000000009000000000021000000000003A5 -:10AE800000000000000020000140018001000000DF -:10AE90000000010090000008000000080000000011 -:10AEA00000000000008000009140C08020002110C0 -:10AEB000010040030002108801848484012000A066 -:10AEC00000008400000000000000002100000000DD -:10AED0000000000000000000000000000000000072 -:10AEE00000000000000000000000000000008000E2 -:10AEF0000200000000000000000000000000000050 -:10AF00000000000000000000050002010220048291 -:10AF1000000000000800080000A00510000000006C -:10AF20000000000000000004000002010004808214 -:10AF3000A000200080004101C10820094105200136 -:10AF400021210000008800880304000000000000A8 -:10AF500000000000000000000000000420042000A9 -:10AF60002000000000000000000000C1000010915F -:10AF7000000100C001018820000000C00000009016 -:10AF8000000000C0000000002000A1880000008830 -:10AF90009090040500409089C0010000000000006E -:10AFA000000000000800840000000000A08900905C -:10AFB00010900004102101A09040088991A0000287 -:10AFC0002020A0031021049001200890000100011E -:10AFD0002001000000000000000000000000000050 -:10AFE000880000000000000000000000089102003E -:10AFF000800800080080212100100020008000004F -:10B000000000000000800000000000009000000030 -:10B010000000800089C141900088001000000000FD -:10B02000000000000000890008000000000082A16C -:10B030002180000900004011082000A0808491A018 -:10B040000888004180A1884188A1030300200041B5 -:10B0500000080010001100000000000000000800BF -:10B06000210000000000000000000000000010802F -:10B07000410002118010000000000800850200005D -:10B080000000000080000000000000008000800040 -:10B090008021808080808000881190A1880000003D -:10B0A000000000000000000088800808118083086C -:10B0B0000980410010118000828089C0099109092E -:10B0C000208008211190C1A1100008028080C18059 -:10B0D000000000001000410000000000000000001F +:10A9200000000000000002C06486612603400000B1 +:10A93000000000000230A0000000000000000C40F9 +:10A9400000000000000002C064860000200000003B +:10A9500000040008000000040000000020000000C7 +:10A9600000040000000000000000000020000000C3 +:10A9700000040000000000040004000000000000CB +:10A9800000000000010001000100000301000100BF +:10A9900004000100000000020000000000000000B0 +:10A9A000000000000000000000040004000000009F +:10A9B0000000000000000000000400000000000093 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000002000273 +:10A9E0000000000000000000000000002100000046 +:10A9F0000000000000000000000000020000000055 +:10AA000000000000000220002000200000000400E0 +:10AA100004008000040000000000000000000002AC +:10AA20000000000200000000000200000000000022 +:10AA30000000000000000000000000000004000012 +:10AA40000000000000020000000000000000000004 +:10AA500000000040000000080000000000000100AD +:10AA600000000000000000000000000000100000D6 +:10AA700000000000000000000000020000000000D4 +:10AA800000000000000000000000C0000000000006 +:10AA900000000000000000000400040001000400A9 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000002000000000000000000020092 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000100010000000000000000056 +:10AAE00004000084000800000000000000000000D6 +:10AAF00000000000000000000088000000000000CE +:10AB000000000000029002000000000000000000B1 +:10AB10000000000000000000000084008400040029 +:10AB200080000000000000000000000000000200A3 +:10AB300000000000000800000000000800000008FD +:10AB40000008008800080088000800840010000049 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB7000000000009021840090004041000000008F +:10AB80000000040000090000000020000000000098 +:10AB900000000000200004000400040004009000F5 +:10ABA00000000000400001000000000088000400D8 +:10ABB0000000000000800500050000804005000046 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE00000002100000000000000000004A00000A0 +:10ABF0000000000400000000000000000000410010 +:10AC000000000000000000000000000080000020A4 +:10AC10000000000000000000000000000000110023 +:10AC200020000000000000084000000800080008A4 +:10AC30000008008400000020840484080020000034 +:10AC400000200000040000C000000408000800A06C +:10AC50000010000000C00000000000000000000024 +:10AC600000000000000000000000000000000010D4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000001000000000B4 +:10AC9000A00000000000000084000000000084000C +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000400000000000000000000000000000070 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD300000000000000000000040000000000000D3 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000030000000000200000080000000000B8 +:10AD70000000000000000000C01100000000C00042 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000008800400000000000DB +:10ADB000C0040000401100000000000500800000F9 +:10ADC000000000000000000800000000000000007B +:10ADD0000000000000000000000000000000000073 +:10ADE000000000000000000000200000080000A09B +:10ADF00000080800000000000000000000000988B2 +:10AE00000000000000000000000000200900008891 +:10AE10000004098800000000000000000000040099 +:10AE200000080000000009080400110800080400E0 +:10AE3000000800000084008800004000002000207E +:10AE400000080800050400080000000800081100C0 +:10AE500000080000000000000000000000000000EA +:10AE600000000000C0000000000000000000000022 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900008000000000000000000000000000000AA +:10AEA000000008000000000000000000000000009A +:10AEB0008400020002000200004000400020004127 +:10AEC000000000000003004000000000000000003F +:10AED0000040000000000000000000000000000032 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB00000000000401140040008088920A090848F +:10AFC00000049004000000000000000000000000E9 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020002000000000000000000000000000000000 +:10B030000000000000004008A1030090002105006E +:10B040000000008000800000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000008A8 +:10B0A0000000001000000000000000000000000090 +:10B0B00000000080000000001100A088200920830B +:10B0C000000000A0808000800000000000000080E0 +:10B0D0000000000000000000000000000000000070 :10B0E0000000000000000000000000000000000060 -:10B0F000000290000001C001000288000100C000B1 -:10B10000000000000000C000000020000000C0009F -:10B11000A00020008888C09088002100081111003C -:10B1200000000000000000000000080808000140C6 -:10B130009100018810000101C00040040282020455 -:10B140000301201008004191A19121909100849069 -:10B1500091880000000000000100000000000000D5 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B120000000000000000000000000000008000017 +:10B13000000800000004000000C0848810C08209DC +:10B1400020C1100004C04082C0C000000090000078 +:10B1500000020000000000000000000000000000ED :10B1600000000000000000000000000000000000DF -:10B17000000000000088010000C0009000010101F3 -:10B1800000C100880000000000C020000000000096 -:10B1900000C00090009090901082A08400840085F0 -:10B1A00083C0000000000000000000000008001044 -:10B1B0000090001100210190000810C1C00200049D -:10B1C00000094003C0080082C191204000010082B4 -:10B1D00000909041000000011000000100000000FC -:10B1E000000000000000000100000001000000005D -:10B1F0000000000000000810050910900000000386 -:10B2000005211191000000000000008000000000F6 -:10B210000000008000000000008080808005032185 -:10B2200010A184A000000000000000000000000940 -:10B230000011008200910020090200918091C1203C -:10B24000008303A1110880030008858340200010BB -:10B250000080009083410000001080110041000038 -:10B26000000000000000000000080008004100008D -:10B27000000000000000000002110300101090A068 -:10B280000900900002108000000000000000800013 -:10B29000000000000000800000898080800000A184 -:10B2A00000900000001100000000000000000000FD -:10B2B000889011008400800084009011080303200E -:10B2C000C19004800880080588898285C1808340F8 -:10B2D000C1201100000020000080000000000011CB +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A0000000000008000000000000000100000096 +:10B1B00040000000000000004000000011080009ED +:10B1C000C1A1908309020004C09020C001000000CA +:10B1D00090000000000000000000000000000000DF +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000110000003E +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B2200000000000000000000000080000004100D5 +:10B23000000080000000200000008000000041A00D +:10B2400011908221009041000080800000001000D9 +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000080000000000000000000000000000B6 +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B0000008002000000000004000000000000026 +:10B2C00021200308408008000003008000000000E7 +:10B2D000000000200000000000000000000000004E :10B2E000000000000000000000000000000000005E -:10B2F00000000000000000000088000101002000A4 -:10B30000C0A0000002000000C0008800008800000B -:10B31000C000200000000000C000888982C08800B2 -:10B320008811102188A00200000000000000000029 -:10B3300000009009018810880800C0080901020176 -:10B34000890183094108A18491004089219090C01E -:10B350000200911000009090820000400000000068 +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000010000000000000000000000000C +:10B34000000005009085844085008400202084A0B2 +:10B350008400000000000000000000000000000069 :10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000880000E0000065 -:10B380000000810000E0000000000000000000005C -:10B390000000000000000000000000210000070085 -:10B3A0000041600600E0070000000000000000000F -:10B3B00000000000818100E007000000418200E001 -:10B3C00007000000810000E000006000821100E042 -:10B3D00007006041818100E00700000000000000DC +:10B3700000000000000000000000000000000000CD +:10B3800000000000000007000000000000000000B6 +:10B3900000000000000000000000000000000000AD +:10B3A00000000000000000000000000000E00000BD +:10B3B0000000000000000000070041000000000045 +:10B3C00007000000000000000000484200000000EC +:10B3D00000004842000000000700000000000000DC :10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000C3C3C3C341 -:10B400000F0FFFFF0F0FFFFFC3C3FFFF00FFFFFF83 -:10B41000C3C3FFFF00FFFFFF0000FFFF3C00000071 -:10B420008340C300C5A5C58530004424000000004A -:10B43000000000000000B4B4B4B4F978E160000C7E -:10B44000F000200000000000000020041008200090 -:10B450000000F166F300E7E7E4E4F0F0FF660000C7 +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000020401080201040802800F4 +:10B4500000282040108000000000000000000000D4 :10B4600000000000000000000000000000000000DC -:10B470000000000000000000000000000000C3C346 -:10B48000C3C30F0FFFFF0F0FFFFFC3C3FFFF00FF7B -:10B49000FFFFC3C3FFFF00FFFFFFFFFFFFFF3C00F5 -:10B4A0005666C300C300C5A5C5A50000242400003E -:10B4B0000000000000000000BDBD2424F978E16018 -:10B4C000000CF0002000000000000001400280019C -:10B4D00000000000F100F30027272424F0F0990079 +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000004020801040802015E +:10B4D00041000041040208010000000000000000DB :10B4E000000000000000000000000000000000005C :10B4F000000000000000000000000000000000004C :10B50000000000000000000000000000000000003B @@ -117619,494 +117619,494 @@ :10B5500000000000000000000000000000000000EB :10B5600000000000000000000000000000000000DB :10B5700000000000000000000000000000000000CB -:10B580000000FFFFF0F0FFFFF0F0FFFFF0F0FFFF23 -:10B59000F0F0FFFFF0F0FFFF0000FFFF00000000F1 -:10B5A0000F0F000004045050F0D0F0F0F0F01E78BF -:10B5B000187E0000000000000000000000000000F5 -:10B5C0003E3EFEFE06F63C3CFFFFF0F005000005A7 -:10B5D000010208040C0C0C1CFCBCFCBC0CCF666605 -:10B5E000033F033F000000000000000000000000D7 +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C00000000000000000000000000000880044AF +:10B5D00001080204010208044400004400000000C5 +:10B5E000000000000000000000000000000000005B :10B5F000000000000000000000000000000000004B -:10B6000000000000FFFFF0F0FFFFF0F0FFFFF0F0A0 -:10B61000FFFFF0F0FFFFF0F0FFFFFFFFFFFFFFFF76 -:10B6200000000F0F00000404505000200000669935 -:10B63000187E187E000000000000000000000000DE -:10B6400000000202C2C206F63C3CFFFFF0F0A00080 -:10B6500000A0804010200C0C0C0C000000640CCFEB -:10B660006666003CC3FF0000000000000000000010 +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B640000000000000000000000000000000880072 +:10B6500044008010402080401020880000880000B6 +:10B6600000000000000000000000000000000000DA :10B6700000000000000000000000000000000000CA -:10B68000000000000000406380008021920240E33F -:10B69000800680299202408280000020920240822F -:10B6A000800000208A001000402000000008806117 -:10B6B000002680990000000000000000000000004B -:10B6C0000061002480010000A061002480A1920696 -:10B6D00000410002800D0000006000208005000095 -:10B6E000000000218000000000610006000D000045 -:10B6F000000000000000000000610006000D0000D6 -:10B700000000000000000000FF17FF17AAAAAAAA65 -:10B71000000001000055AAFF00000000000000002A +:10B6800000000000000000000000000000000500B5 +:10B6900000080000000000000000000000000000A2 +:10B6A000000000000000000000000000000000009A +:10B6B00000000000000000610007000D0000000015 +:10B6C00005000A08050000A005000A00050000A00A +:10B6D00060610006000D100000000000000008007E +:10B6E00005000A08050000A000000000000000009E +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 :10B720000000000000000000000000000000000019 -:10B7300000000000F808F404000000000000000011 -:10B740000000AFAFAF05C0FCC0FC5F7D0A28000061 -:10B750003C3C3C3C55D7008280823D013D39000095 -:10B760000000141455003C3C003C00000000F0AA0E -:10B77000F000000000000000000000000000F0AA3F -:10B78000F0FF00000000000000000017001700FF9D -:10B79000F0F0000000000050AAFF000000000000D0 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B750000000FF7FFFFF000000000000000000006D +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 :10B7A0000000000000000000000000000000000099 -:10B7B000000000000000F000FC0C00000000000091 -:10B7C000000000000505AF05003CC3FF5F7D0A28AF -:10B7D000005FFF3C0000040C008200823C003C380B -:10B7E0005F4F5F5F141455000000003C0000000034 -:10B7F000F0AAF000000000000000000000000000BF -:10B80000F0AAF00000000000000000004D4D4D4D7A -:10B81000FA3CFA3C003F003F0000FFAA0000000095 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000300000000000066 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 :10B820000000000000000000000000000000000018 -:10B830000000000000830003AAAAA000000000008E -:10B84000000000000000000000000000FFFF50505A -:10B850005555E8EBE8EB3C3C3C3C000000003F3F2A -:10B8600030303F3CAA3C0C0C3C003C3C3030C30028 -:10B87000CF0C00FF000000000000000000000000EE -:10B880000000000000000000000000000000CFCF1A -:10B890000C0C503C503C00000000FFAAFFAA000026 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000030000000000E5 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 :10B8A0000000000000000000000000000000000098 -:10B8B00000000000000000000000555555FF00008A -:10B8C000000000000000000000000000303F303F9A -:10B8D00050505555E828E8280FFF0F0001000000E0 -:10B8E0000F0F000F002AAA3C0C0C3C000000303067 -:10B8F000C300CF0CAAAAAAAA000000000000000002 -:10B900000000000000000000080020008800200463 -:10B910000010000000008800000020000000200847 -:10B92000000020000000200001000000200800109E -:10B9300000000000018800050000C1000110210086 -:10B94000000001000000200800034000000020006B -:10B95000000000004000000004000000200000057E -:10B960002000000000000000200020000000000077 -:10B9700000000000000000002011000020008400F2 -:10B980002009000200000400200080008000000068 -:10B9900080010000410000000000000000002000C5 -:10B9A0000000000000000000000010020000000085 -:10B9B00000000000000240200002000020002002E1 -:10B9C000200200004002000009000000000000000A -:10B9D00000004000000000004000000000200000C7 -:10B9E0000000000000000002000000000000000055 -:10B9F0000000000000C0400000C000000000000087 -:10BA00000000000000000000000200000000090427 -:10BA10000000032000000000000000000000000003 -:10BA200000400000000800000000000800000009BD -:10BA30000009000200800002902000800000000049 -:10BA400000000005000000000002000000000004EB -:10BA500000000000000004002000200020800240C0 -:10BA600002000080000020002000200084008820C8 -:10BA7000200082000420820000000000820082007A -:10BA80008200820004020008824082028280000854 -:10BA90008201000088090002410200100010000825 -:10BAA0000202001000100009000000100011000840 -:10BAB00000840000000900100001008300200084C1 -:10BAC0000082000800020008000441910282000088 -:10BAD000001100000008008880008000808880201D -:10BAE000800180080002000080088000820002843B -:10BAF0000001800000888009000403000300028424 -:10BB000004000008040003000011040102010010F9 -:10BB100004090821002104110141000901020080EB -:10BB20000021020808080040010901020103010880 -:10BB30000041000500A1002100A10000C000000894 -:10BB40000000100800409040008800000000000540 -:10BB500000000003000300000004010000000000DA -:10BB600004000480882000009009100000410000BB -:10BB70000000100020000408400490001000900015 -:10BB80004008040088009000200004000000040029 -:10BB9000000800008008000080002000090010005C -:10BBA0004004000000840000008810A010902008CD -:10BBB00020A0080000000002031000100000000098 -:10BBC00011000000200400000002000900840002AF -:10BBD000000000002100000000000000040805A093 -:10BBE00040208000412009200400418421000900F8 -:10BBF00040C0050020000000020000010020892054 -:10BC00000020800000000084004040000000000090 -:10BC100000000000000083400000058000081004C0 -:10BC20000900000001000000010082000000018006 -:10BC300000800080000008000000080009900282D7 -:10BC40000100040084000800C000000082084000D9 -:10BC500000000080000001000000000088000400D7 -:10BC60002000200020000200000000000000000072 -:10BC700000000011008800040020002000040000E3 -:10BC8000000000000400C0000000000000000000F0 -:10BC90009041880004000000080100848420000115 -:10BCA000800120000000200003A0208411844100B6 -:10BCB0001008410400040000418405C003008811FD -:10BCC0008040028880900500100000000000000104 -:10BCD000830000000340000020000000000000007E -:10BCE0008000800080008000800000000040000094 -:10BCF000000000000000000400000001000300013B -:10BD000000000000000040000000000000000000F3 -:10BD100000000900110003000009000020030021B9 -:10BD20000102010201800180004020000240200445 -:10BD30000004908082830080004000080040824020 -:10BD4000080200C00180088200002009040082006F -:10BD500082000800000000000000004000202000D9 -:10BD6000000404A08200000004089000010000000C -:10BD70000000000020000000000000202004080453 -:10BD800000000000C00000000000000000000000F3 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000002000000300000045 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910002000000000000000000200000000000005 +:10B9200000100000000020000000000000000000E7 +:10B930000000000000000000210021000041210063 +:10B940000100010001802100000300000000000050 +:10B9500000040000010000000000000000000004DE +:10B96000000400100010000020000000040000008F +:10B9700000040000000000000000000000020000C1 +:10B9800000040010000000000000000000000000A3 +:10B99000000200020000000000400000000200025F +:10B9A0000002000020000000000000000000000075 +:10B9B000000000000000000000008402840000007D +:10B9C000840010001000200810000000000000009B +:10B9D000000200000000040000000000000200005F +:10B9E00000000000000200000000000000008000D5 +:10B9F0000000000000000000000000000002000045 +:10BA000000000000400000000000000000000000F6 +:10BA10000000000000000000000000000000000026 +:10BA200000000200000000000000000021002020B3 +:10BA30002100210000000000004000400000000044 +:10BA400000000000000000000000000000000400F2 +:10BA5000040001000400200020002000200000005D +:10BA60000000000000000000000000400200000094 +:10BA700004000000000000000000000004000000BE +:10BA80000000000000400000000000000200000074 +:10BA9000000000000000000000000008000000009E +:10BAA00000100000000800000000004002008400B8 +:10BAB00080018400840000000000000800000000F5 +:10BAC000000000000008000000000000020000006C +:10BAD00080008000040080008000820080088000D8 +:10BAE0000000000000000040020000000000030011 +:10BAF00000008000000000000000000000080204B8 +:10BB00000000000000000000000000000000030032 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000090000000000075 +:10BB400004000000040004000100000000000000E8 +:10BB500000000000000000000000040000200100C0 +:10BB60000400A000000040008800000084004000A5 +:10BB700000000000000000000000000800000000BD +:10BB80000000000000210000000000000000000094 +:10BB90004000000000000000000000000000000065 +:10BBA0000000000000000000000000000000410054 +:10BBB0000000000000000000000000000000000085 +:10BBC00000000000000083000000200000002100B1 +:10BBD00021000000210000200000002020000300C0 +:10BBE0000400030011840800030008C000900090C6 +:10BBF000030040880000000000000000000000007A +:10BC00000000000000000000000000000000000034 +:10BC1000000000000000080000000000000000001C +:10BC20000000000000008200000000000000000092 +:10BC30000000000000000000C0000000080000003C +:10BC400000000000000000002000000000002000B4 +:10BC5000A0002000000000000000820000000000A2 +:10BC60000000820000000000000000000000000052 +:10BC70000000000000000000000000000040000084 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC00000000000000000000000800000000000F4 +:10BCD0008000000080000000000000000000000064 +:10BCE000000000000000000800000000000000004C +:10BCF0000000000000000000000000000000000143 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD2000000000000000000000000000000008000B +:10BD3000000000000000A00001008480008000805E +:10BD400002030000000000000000000000000011DD +:10BD500000000000000400000000000000000000DF +:10BD60008400008001800080010800000880A0009D +:10BD7000A000000000000000000000000000000023 +:10BD800000000000000000000000000000000000B3 :10BD900000000000000000000000000000000000A3 -:10BDA000000010082004100410081001808200090F -:10BDB000A141004103040008000800010001000146 -:10BDC00000018900094104402021000085A04000B5 -:10BDD000000200000000000000000000030000005E -:10BDE000808800A0C02105000090800021C00200D2 -:10BDF000098400C00000890000002120050180891D -:10BE000009012100400040000088000010040420C7 -:10BE100020000004008800020904009000000003D4 -:10BE200000A101A1014100800008200000040204DB -:10BE300000040040000000880008004000000040AE -:10BE40000041004108A1012000A000200000820064 -:10BE5000010000211080108001000100000082001C -:10BE6000002100000008A00084008800000040407D -:10BE7000A040000090408400000200098409008472 -:10BE8000002000A000200040004000400000000012 -:10BE90000000000000000000000800000200020096 -:10BEA000000400100820200841080000800802015A -:10BEB00080050001004100000004000100010000B5 -:10BEC00000C100C000848010040141210001000075 -:10BED00011000200410090400040020040000000BC -:10BEE0000000000000000000000000000000000052 +:10BDA0000000000000000000000000000000000093 +:10BDB000000000000000000000000400002000203F +:10BDC00011200000000000000000009000000404AA +:10BDD0000500000000000000000000000090008846 +:10BDE0000000008800200404000420001104110257 +:10BDF000050400002100412041000500100005005D +:10BE000000004000000800000000000000000000EA +:10BE10000000000000000000000000000000000022 +:10BE2000000000000000000000000000080000000A +:10BE300000000800A000000000000000000000005A +:10BE400000000000000000000000000000000000F2 +:10BE5000820020808200000000000000000004003A +:10BE60000400040004002080000004000400080016 +:10BE700000000000000000210000000000000000A1 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC00000000000000000820000000000000000F0 +:10BED00000000000802000000000000000000000C2 +:10BEE00080008000800080008020000080008000B2 :10BEF0000000000000000000000000000000000042 -:10BF0000000500010005000100000800000000001D -:10BF100040000000000000000000000000000000E1 -:10BF200008C000408890900900C12008000100006E -:10BF300000C1018800010001000100021001100889 -:10BF4000008890882000900040A0A190848890A054 -:10BF500040C00000C0000000018800009003000005 -:10BF6000000000000100104100000000000000007F -:10BF70000000C00001008200000009A101080011BA -:10BF80000882080500909091C0C1000000001000D8 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000080019 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000004000000000000000000000000000B1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000001000100000001000000000000BE +:10BF8000000000C0900200820010000000000000CD :10BF900000000000000000000000000000000000A1 -:10BFA0000000008900900002800802C182A10209FD -:10BFB0000009009102000002000811410985C10931 -:10BFC0000080000000008000090080808580808063 -:10BFD0008080A0800000800000002008201100C0A8 -:10BFE00000080000402003000009002000000900B4 -:10BFF0000000000000000200000000009111048514 -:10C00000008480040091098000208010000000005E +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD00000000000000040000000000000200500FC +:10BFE0000000000000000000000000000000000051 +:10BFF0000300000000080008000000080000000026 +:10C0000000000000008080000080000000000000B0 :10C010000000000000000000000000000000000020 -:10C02000000000008900020010A1820409008200C3 -:10C030000200C103020041101011000200800880BC -:10C0400010004100100020001100C100904191102B -:10C050000309919109004100101103801000112182 -:10C0600040004110000009001080110020830900E9 -:10C0700020401100A000200003200300A080050044 -:10C0800005A1118003041100200010008041000070 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000002000000003000000000000CD +:10C050000000000000080000000800800010080038 +:10C0600000020000000000000000000000000008C6 +:10C0700000800008008000000000000000050000B3 +:10C0800000000000000000000000000000000000B0 :10C0900000000000000000000000000000000000A0 -:10C0A00008002000C100020090000009C0820100C9 -:10C0B00010000000C1010088000000010089108804 -:10C0C000010200000188010000880000118841A0E1 -:10C0D00085000101C18801900000010100C000102D -:10C0E0000088010083880000910000C0010000C0AA -:10C0F00000902000891091009000010000A0C1A0D4 -:10C100000200A082C190C0010090080091909001AF +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C000000000000000000000880001008800005F +:10C0D00000000000000000000008000000020088CE +:10C0E0000000000000000000000000880000008840 +:10C0F0000000000400010004001000000000000027 +:10C10000000000000000000000000000000000002F :10C11000000000000000000000000000000000001F -:10C12000A00001000100C100080900890021A11040 -:10C1300000000000000900C100010000001101C161 -:10C140000001000011080001010000008400010945 -:10C1500040C100411091A08300000001000003C114 -:10C16000010000888201000300000040004120001F -:10C1700083000000000000010101000500A0000292 -:10C1800000C040C00088000990A100C10140919109 -:10C19000C0010000000100000001000000000000DC -:10C1A00000000000000000000000000800830021E3 -:10C1B000910200020211008811C10008101002054E -:10C1C00011881008101010800041410900218010D2 -:10C1D00010C1802000A00091008300050009000824 -:10C1E00091882010111091210090000020800809F2 -:10C1F000830391200308002000051120001100098D -:10C20000008500C041050005209091110008418083 -:10C21000902080110010001000000041000000007C -:10C2200000000000000000000000000021201100BC -:10C2300010008200C11002090500090380101011CE -:10C24000030002084190100903000311008900094E -:10C2500080000003C11020899100C003100011006C -:10C26000038009082189A1080200080800000800CD -:10C27000919120000940A0051100200009008005CF -:10C28000800900000003051005800880830082906B -:10C2900010000080034100000000000000000000CA -:10C2A000000000000000000000000000000041004D -:10C2B00001009040A0000901000101000101C083BC -:10C2C0000003018800011111880501000000001120 -:10C2D000000008888801C1C18389A11009010100FB -:10C2E00001A0888401010189040101880100000086 -:10C2F00000000583000089009090A18411A0C00077 -:10C30000900004010000840140854082401002003A -:10C310009109A184C0C0900100000000000000004D -:10C32000000000000000000000A000C0009000001D -:10C33000608100E007000000810000E000000000D4 -:10C34000810000E000000000810000E0000000002B -:10C3500000000000000082000081000007000000D3 -:10C36000880000E000000021600000E00000000004 -:10C370000000880000E000008121818100E00700CA -:10C3800000000081000007000000810000E00000C4 -:10C390000000818100E00700420A00000000000068 +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000200020000000AF +:10C15000000000000000000001002000400000007E +:10C1600000010800000000000000010000001000B5 +:10C1700000000000080004000000000000000000B3 +:10C180000000000000000000000088000000000027 +:10C190008800000000000000000000000000000017 +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C00000000000000000000000080080000000E7 +:10C1D000030000000000000000004100000080009B +:10C1E000110000080000000008000000100000001E +:10C1F00000000000050000008000080000000000B2 +:10C20000000000000000000000000000000000002E +:10C21000000080000000000000000000000000009E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000050011D8 +:10C250000000000000000000000000000008004096 +:10C2600000000000000000000000000000000011BD +:10C27000002100000000000000400000000021003C +:10C280004000080003000000000000000000000063 +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000015D +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000010000000000000000000000000000002C +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C35000000000E0070000000000000000000000F6 +:10C36000000000E007004100000000E000000000C5 +:10C3700000000000000007000000000000E00700CF +:10C3800000000000000000000000000000000000AD +:10C390000000000000000700000000000000000096 :10C3A000000000000000000000000000000000008D -:10C3B00000000000808000000054FFFF0000FFFF2D -:10C3C000FF00FFFF0000FFFFFF00FF0000FF00FF76 -:10C3D00000FF333333330000FFFF00003000000F55 -:10C3E0000807F0F0F0F00000AAAAFF00FF00F0F04C -:10C3F0000F0F00003CC33CC3CCCCCCCC000CFFFFE7 -:10C4000000000000287D7D7D0000DFFF00000000AF -:10C410000000096028F07DF03C3C3C3C000000003E +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C :10C42000000000000000000000000000000000000C -:10C43000000000000000808000000040FFFF0000BE -:10C44000FFFFFF00FFFFFFFFFFFFFF00FF0000FFF8 -:10C45000FF00FF0033333333FFFF0000C3C300008E -:10C46000000F000FF0F0F0F00000AAAA00FF00FF9C -:10C47000F0F00F0F00003CC33CC3CCCCCCCC000C84 -:10C4800055410000000028287D280000DFFF010042 -:10C4900000000960000028F07DF0F0AAF0AA00007A +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C :10C4A000000000000000000000000000000000008C -:10C4B000000000000000C3000000C0C0FFFF00FF3C -:10C4C000FFFFF0F0FFFF00FFFFFF555555553CC340 -:10C4D0003CC396969696FF0000FFFFFF0000000009 -:10C4E00000000000000055550000AAAAAAAAF0F01A -:10C4F0000F0F0000FFFF00005A5A5A5A6969696914 -:10C50000000000005555555500000000C3C3FFFF53 -:10C510000401104044880000BE1EB4145555555502 +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C5100000000000000000003C0F3C3C0000000058 :10C52000000000000000000000000000000000000B -:10C53000000000003C3C5555FF000A0AC0C0000046 -:10C5400000FFFFFFF0F0FFFF00FFFFFFAAAAAAAA6B -:10C550003CC33CC396969696FF0000FF0000FFFF89 -:10C56000030CA30C1B1B6969555500005555555507 -:10C57000F0F00F0FFFFF000000005A5A5A5A696985 -:10C58000696900000000FFF00F0000000000C3C355 -:10C59000FFFF0802208000004488BE1EB4140FFF75 -:10C5A0000F0000000000000000000000000000007C -:10C5B000000000000000000000000061502480091D -:10C5C00000A8400280018020920240E38000802188 -:10C5D0009002400080018020100240618006002D02 -:10C5E0000802A0610026000D00084063800480213D -:10C5F000900240608006802D1002000040618000A3 -:10C6000080210002006100248001000000610026FA -:10C6100000AD920600610000800100000061002072 -:10C620008001000000610006000D00000000000015 -:10C630000000000000610006000D00053C00FFC383 -:10C64000FF40F0F00000000000C3C0C0FF1EFF1E4E -:10C65000F0FFFCFC41000300C0C08080000000002F -:10C660000AFF00C300803C00000000205C5CFC0C62 -:10C67000B2B230F3C3C3C3025514555500003C3C5D -:10C680003C3CFFF0AAF05C5CFC0C303FFFFF00007C -:10C69000000000000000FFFF0F3C3CFC3FFFFFFFDD -:10C6A000000028FF7DFF0000000078785050000057 -:10C6B0000000000000000000000000000000FC007E -:10C6C000FFC3FF40F0F03C000F0000000000141E0C -:10C6D000141E000F3C3C410003000000808000005D -:10C6E00000000AFF00C300800000000000005C5C46 -:10C6F000FC0CB2B230F3C3C3C3415514551500004E -:10C70000FF0FF00000F0AAF05C5CFC0C303F000072 -:10C71000000000000100000000000F3C00C003C347 -:10C72000553C553C28007D000000000078785050B2 +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000003C0F55550000A6 +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D0000000000000000000000005610A0E050DCB +:10C5E00000A0000000000000000005610A0F050D1A +:10C5F00000A000000007000C0000000005000A0871 +:10C60000050000A005610A0F050D00A000610006ED +:10C61000000D0000000000000000000000002000ED +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000055553C3C00000000000098 +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000055553C3C0000000018 +:10C700000000000000000000000000000000000029 +:10C710000080000000000000000000000000000099 +:10C720000000000000000000000000000000000009 :10C7300000000000000000000000000000000000F9 -:10C7400000F3F3F3FFC30F0300050014000A000C0D -:10C75000BFBF3D3D78FF78FF00000000000F000ADA -:10C76000000000000A0A380000000000000000007D -:10C770000000000050FA3C3CFFC3FFFF0FFF000029 -:10C7800000000F0F0F0F287D787800000000F0FFE9 -:10C790003C3C0000000034141414CFCFCF0C3C3FBD -:10C7A000FCFF35353535BEFABEFA0000000000004A -:10C7B000000000000000000000000000000000F089 -:10C7C000F0F000F3F3F3FFC30F0300050014000AB9 -:10C7D000000C878705057828782855000505000096 -:10C7E000000A000000000F0F3C00000000000040A5 -:10C7F00000000000000050FA3C3C0A020A0A082827 -:10C80000C3C30000D7D71414287D78780000000037 -:10C81000000F3C3C00000000341414140CCF0C0C2E -:10C820000003C0C3F5F505051450145000000000C6 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000FF00F0F00000DA +:10C7800000000000000000000000000000000000A9 +:10C790000000000000C300000000000000000000D6 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F000000000000000000000000000FF00F0F05A +:10C800000000000000000000000000000000000028 +:10C8100000000000000000C3000000000000000055 +:10C820000000000000000000000000000000000008 :10C8300000000000000000000000000000000000F8 -:10C8400000F000002000010000042004C0000000EF -:10C85000000020000000040004800500000000002B -:10C860000000200000000400000020000100008003 -:10C87000008020050000200040000102840000002C -:10C880000000C00000030000080000A0208000108D -:10C890000010000090000000000020004000010097 -:10C8A00002000104010000000000010000800100FE -:10C8B0000100000000024000000000002011000004 -:10C8C000000000000002000002C000008000000024 -:10C8D0000000000000C000408000892084020000A9 -:10C8E0000000000000000000000000000000400008 -:10C8F0000010002000000000000080004001000047 -:10C90000050000020000000010008500002110401A -:10C910000000100200000000000000000002000003 -:10C92000020280000800080000000000040000204F -:10C93000040004000000000100000000000000846A -:10C9400000000000000000010000000000000000E6 -:10C9500000000009000010000000000000000000BE -:10C96000000000000000000000008800000500102A -:10C97000080000000000008002000000000001002C -:10C9800000000000000000000000000000000000A7 -:10C990000400000000000000000300000000000090 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000200400000000B4 +:10C8600000040000000000000000000400000000C0 +:10C870000000000000800000000020041000000004 +:10C88000000400040003000000000000000000009D +:10C890000000000000000000000000002000000078 +:10C8A000000000000000000000000000C0000000C8 +:10C8B0004000000400040000000000000000000030 +:10C8C000000000040004000000000000000200005E +:10C8D0000002000200000000000200000000000052 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000010000000000000000424 +:10C90000000000000000000000020002000200021F +:10C910000000000000000000000000000000000017 +:10C9200000020000000200020002000200000000FD +:10C930000000000000000002000000020000009063 +:10C9400000040000000000000000000000000000E3 +:10C950000000000000000000000000400000000097 +:10C96000820000040000010200000000000000003E +:10C97000000002080000004000000000000000006D +:10C980000000000000000000000020000000200067 +:10C990002009000000000000000004000020040046 :10C9A0000000000000000000000000000000000087 -:10C9B00082100400000082000000000082002010AD -:10C9C00082008200000082000000000000000010D1 -:10C9D0000010000000002100210000000000008481 -:10C9E0000008000800080008008440080008000053 -:10C9F00000088000000000000040801000000010CF -:10CA00004010000809840010000000000010001011 -:10CA100000008910000000820000001000000000EB -:10CA200000000000000800000000000002100010DC -:10CA30000000000000000084000000100000000062 -:10CA400000000502000800000400000000000100D2 -:10CA50000000000384830080C0000000008800897B -:10CA60000088880000800121009000100021004112 -:10CA7000001000040021010884000008004000218B -:10CA800000A1000000A10080000000020000880852 -:10CA9000090800209021001190082000C000040027 -:10CAA0000400042000080000044004000400040006 -:10CAB000040004008400040810000000000084004A -:10CAC00000020408000004000808100088000008A4 -:10CAD000200800A000080004000400100008000462 -:10CAE000000400040000000402820404009000908E -:10CAF00000A000900000080002000084000000A1D7 -:10CB00002100081000001104002000004120000056 -:10CB10000082880400A10088410405A000000000F4 -:10CB200009000082058204001100090000000000D5 -:10CB300000000300000008040090800000000000D6 -:10CB40000008000200000000000000200088000033 -:10CB50000000000040000000001100000000000084 -:10CB60008811A02100000000200040050000840082 -:10CB700000000000000000000000820000000040F3 -:10CB80008400000008000800000000000000000011 -:10CB9000000000000000001004050000000000007C -:10CBA00000080000080000000041080000000041EB -:10CBB000002000000011C000101100040000C0009F -:10CBC000020000000000000400100020000000002F -:10CBD00000000000000080000000000000000000D5 -:10CBE000000000A00084000200008000000020007F -:10CBF0002000000000000000210041000000200093 -:10CC0000400100A0000080000000000000000000C3 -:10CC10000020000000000000000080000000000074 -:10CC20000000000000000000000000000000000004 -:10CC30000000000000840000000000000000000070 +:10C9B0000000000000000000000000400000000037 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000001000000000000047 +:10C9E000000003C00000000004000400000000007C +:10C9F0000000000000000000000000000000000037 +:10CA000000000000000000000000000082000200A2 +:10CA10008400848400000008000000008000000101 +:10CA20008000000004000400040800000000000072 +:10CA300000000000000000080400020000000000E8 +:10CA400002000000000002000008000000000000DA +:10CA500000000000000000000000000000000000D6 +:10CA60009000000000000000000000000400000032 +:10CA700000000000100000000000000000000000A6 +:10CA800000008800400000000400000000001000CA +:10CA9000200400002000000000000000040004004A +:10CAA000050040008521080082000400000000000D +:10CAB0000004040000081000000000000000000056 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000800080002000000000034 +:10CAF0000000000000000000110000000400000021 +:10CB00000300000000000000000000000488000096 +:10CB10000000800000008000000000000488002069 +:10CB2000800004000000042000004100000000001C +:10CB300000000000000000000000000000040000F1 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000001000000000000000000000000000A5 +:10CB80000011000000040000000000000000000090 +:10CB90000000000000040000000000008800000009 +:10CBA0000000000000000000002000000000000065 +:10CBB0000000000000000000000000000000000075 +:10CBC00000000000000000000000000000009000D5 +:10CBD000A0000000000000000000000000000000B5 +:10CBE0000000000000000000000000000000000045 +:10CBF000000000000000000000000000090000002C +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000001000000000000000013 +:10CC20000000000000000000000000010000000003 +:10CC300000000000000000000000000000000000F4 :10CC400000000000000000000000000000000000E4 -:10CC50000000000000000000000020000011200083 -:10CC60000090010000040004000500040005218478 -:10CC70002000200083C182A1012100800000020069 -:10CC8000902000800380000000040480A000018048 -:10CC9000A0800080000002000811000000000000D9 -:10CCA00000000000000300000000002000008820B9 -:10CCB000002000000800000082210000A000000009 -:10CCC000000004000000000000020000002100003D -:10CCD00005000020000020A0401011000082058403 -:10CCE0008000000420C021A10003008200852100F3 -:10CCF0008241801080902004000420A021040800BC -:10CD00008000000121208240040000A109200010C1 -:10CD10000404050400040000008400000000210455 -:10CD2000119000001090050040101000000003203A -:10CD30000800050000C000002140089005204100C7 -:10CD400005000000002008202000000000880000EE -:10CD5000000010044000000000000000000000037C -:10CD60008400400000004000A02120212004200475 -:10CD7000A000200340110204082100218400880043 -:10CD80000009841100000011400900004010000457 -:10CD90004000000000030800000000000000000048 -:10CDA0000000000200000041000800000000000038 -:10CDB0000000080000000000080000000000002142 -:10CDC00008008203020002000000A0000000A00092 -:10CDD0000021A00300000000000009000082000004 -:10CDE0000000200009040004208800000000000169 -:10CDF0000001000080000000800100A00000000091 -:10CE00000000000000000000000000000000000121 -:10CE10000001000000000000000000000000000011 -:10CE200000000000000000000000080000000000FA +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000400A0 +:10CC90000000000000000080000000800000020092 +:10CCA0000000000000000000000011000000000073 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF00000000000000000000084000000080000A8 +:10CD000000200000000011040088000000880000DE +:10CD100000040000040000000404000200041140AC +:10CD200000200000008800000020002004200000F7 +:10CD30000404400000000000000000880000000023 +:10CD400000000000000000000000000000000000E3 +:10CD5000008800000000000000000000000000004B +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000008AB +:10CD8000000000080000000000000000000000009B +:10CD9000000000000008000000000000000000008B +:10CDA000000000000008000000000000000000007B +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD000080000000000000000000000000000004B +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE100000400000000002000000000000000000D0 +:10CE20000000000000000000000000000000000002 :10CE300000000000000000000000000000000000F2 :10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000001010000D0 -:10CE6000880000014091000488021084A0410890CD -:10CE70000040C0A001C00004100400109108104040 -:10CE80000105C00410C00101821190A10200000040 -:10CE90008400000001080041C0A000A0000040C0C4 -:10CEA00000880090820200000000000000000000E6 -:10CEB0000000000000000000000000001000000062 -:10CEC00000000000000088C000908890040800C0A6 -:10CED00000900000A04010C09008008200401008A0 -:10CEE000022100200008A091000200040000A0918F -:10CEF0008488001180001189052100110080918231 -:10CF000009A111040010808320020010808200001B -:10CF100010008000000011051020004100030000F7 -:10CF20008080000000000080000000000000000081 -:10CF30000000000000000000000000000000800071 -:10CF400000000000000000004080008000008080A1 -:10CF500005800080000000008580800000800000C7 -:10CF6000000010000200884009804188C0118880BC -:10CF700000000221118883030900020011008205CC -:10CF80008400028311838384800080080080808075 -:10CF9000910010001000C10020004100401103006A -:10CFA0000000000000008040800000000000000041 -:10CFB0000000000000000000000000000000000071 -:10CFC0008000800080000000808080008011800050 -:10CFD00080808000801080008080000080118000B0 -:10CFE0008080000400000000C1019008C0C10989D0 -:10CFF00008C084881000418591C1820000000100B2 -:10D00000C1001100C0C0050485C1080082002004D1 -:10D01000C0908800A100A10091100004000001014F -:10D0200000000000840000000800900000000000E4 -:10D0300000000000000000000000000008000200E6 -:10D040000000C000080082000000C0900200100034 -:10D050008400C090080004018400C090000010000B -:10D060008400C0900000000100010101A10801112D -:10D07000C0850310104000889041C18888000108D5 -:10D08000000010C189900089C0C18908840801A0EE -:10D090000021400300210002000901C00800000037 -:10D0A0000000900100004002008200908288000091 -:10D0B0000000000000000000000000000000000070 -:10D0C0000088000800C00008000000900090A01038 -:10D0D0000001009000C102080088009002C01011F9 -:10D0E0000000009101C10010000308211120410936 -:10D0F00040C0C18511080082090984059102000918 -:10D10000089105008091410209028005118800887C -:10D1100010A00308008900090010008803820005A0 -:10D1200003000003001100000080000000808080E8 -:10D1300000000000000000000000000000000000EF -:10D1400000000000008000800080000000800000DF -:10D1500000800008009100C18080000000800080F5 -:10D1600080880009008510C1211020912100034012 -:10D1700010094080408003110205881103008004DB -:10D1800009051100080003000205899103801000C1 -:10D19000800000890080808000890021000000104C -:10D1A00005821100030008000000000500C0000017 -:10D1B000000000000000000000000000000000006F -:10D1C00000000000000000800000000500030000D7 -:10D1D00000008011800300000000801100408000EA -:10D1E0000000801180408000800001890111010051 -:10D1F00001018400850885109000C0880489918809 -:10D2000004000010000001000000820404918384E7 -:10D210004000040082A18882880800850008000080 -:10D22000000000050100000001000000000000A057 -:10D23000009000000000000000000000000000005E -:10D2400000000000000000100010000000000000BE -:10D2500000080000C001202020000000C001209034 -:10D2600040000200C001200004080200810000E02C -:10D2700000000000880000E000004842818100E0DA -:10D2800007000082810000E000000000810000E053 -:10D29000000048420082000007000000600600E035 -:10D2A00007000000818100E007000000000000810D -:10D2B0000000070000000000000000000000000067 -:10D2C00000000000000000000000000000000081DD -:10D2D00000000700000000410000070000000041BE -:10D2E00000000700000000410000070000000000EF -:10D2F00000000000000000000000204004020FFFBA -:10D300008DBD003C003C00000000F0F0000000007B -:10D31000000020401080669966997A60666000007F -:10D3200000000909080000000000000000000000E3 -:10D33000000000008910081000000000000000003C -:10D340000000000000000000000000000000F0F0FD -:10D3500000000000FFC33C00FF00FF00427E3C00D5 -:10D36000CFF33030C0FC3C000FF0FF007E423C00A9 -:10D370000000000000000000000000011080080113 -:10D380000FFF9999003C093D00000000F0F00000FB -:10D3900000000001040208016798649B66606660F3 -:10D3A0000000000009090800000000000000000063 -:10D3B00000000000000099001800000000000000BC -:10D3C0000000000000000000000000000000FF005E -:10D3D000FF0000000000FFC33C00F0F000007E42B0 -:10D3E0003C000C303030FCC03C003C3C00007E4235 -:10D3F0003C000000000000000000000000000000F1 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF200000000000200000000000000000000000E1 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF70000000000000000000000000000000008031 +:10CF800000000000000000000000000000000000A1 +:10CF90000000001000000000000000000000000081 +:10CFA0000000000300000008000000000000000076 +:10CFB00000000000000000000080000000000000F1 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000008000000000000000000000000000018 +:10D010000000000000010008000000000000000007 +:10D0200000000000000000000001000000000000FF +:10D0300000000000000000080000000200000000E6 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000080000000000000078 +:10D0B0000000000000000000000008000000000068 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D12000000000000000000000008000000002007D +:10D1300000000000000000002000000000000000CF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D180000004000800000000000000000000000093 +:10D19000000000000000000000000000800000000F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000200006D +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000010001000000000000000000001C +:10D2100000000000000000000000100002000800F4 +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D280000000000000810000070400000000000012 +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B00000E000000000000000000000000000008E +:10D2C0000000070000000000000000000000000057 +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D310000000000000000000000000000000FFFF0F +:10D32000F0660000000000000000000000000000A7 +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A0000000F06600000000000000000000000027 +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D :10D40000000000000000000000000000000000001C :10D41000000000000000000000000000000000000C :10D4200000000000000000000000000000000000FC @@ -118114,490 +118114,490 @@ :10D4400000000000000000000000000000000000DC :10D4500000000000000000000000000000000000CC :10D4600000000000000000000000000000000000BC -:10D470000000000000000000000099994020020414 -:10D480001008200400F000F00000FF00FFFFD3C3ED -:10D490000000C3C30500000500A000058F8F000039 -:10D4A00066E7063700000000240FE70F9090D09049 -:10D4B000000000000000C1C1000F427EC3FF000059 +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C -:10D4D000000066663C3C000000000C0CCFCF003C16 -:10D4E0003F03000F6C630066BDDB003C4E720F0F04 -:10D4F0003333000FF0FF0000000000009999801006 -:10D5000001088001400281F100F08080FF80FFFF70 -:10D51000C3C30000C3C3A00000A0A00005008F8FFC -:10D52000F0F0003C060F00000000240FE70F909081 -:10D530009090000000000000C3C3000F003C81BDBC +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB :10D5400000000000000000000000000000000000DB -:10D55000000000000F0F0F0F000000000C0C0C0C5F -:10D56000003C033F000F6C6300662442003C4E7297 -:10D57000000000FF000F000F006100048009120688 -:10D5800000610000800108000061002080010000AF -:10D590000063900080019206006100008001080095 -:10D5A00000612026000D0008006100268095000023 -:10D5B00000610020800100000000000050200000F9 -:10D5C000000000000000000000000000000000005B -:10D5D00000000000000000900005000000280C0082 -:10D5E00012C003E3032E0C0D92C0038203280C002B -:10D5F00092C003E3032E0C0D82C03F3F3F3AF00080 -:10D60000F0000F7D0F28A0A3ACAF55555555F0F392 -:10D61000FCFFFF0FFF3CF8F8FBFBFF3CFF0F0F0F79 -:10D620000F0F00000000F300A800000000000AFF38 -:10D630003C005555FC0C28EBEBEB00000000000013 +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D5900000000028000000A00000000000000000C3 +:10D5A000000000000000000000000000000000007B +:10D5B0000000000000000000000000610007000DF6 +:10D5C0000000000000000000000005000A0805003F +:10D5D00000A00000000000000000000000000000AB +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA -:10D660000000000000000000AAF0AA000000000076 -:10D6700000000000000000003CF03C003F3F303064 -:10D68000F141F0000F7D0F28A0A3ACAFFF000F0FFA -:10D6900000030C0F0F0F003C28282B2B3C3C000FE5 -:10D6A0003CFF00C300000000F30080000000000009 -:10D6B0000A003C005555FC0C2828EB28000000000F +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A :10D6C000000000000000000000000000000000005A :10D6D000000000000000000000000000000000004A -:10D6E00000000000000000000000AAF0AA000000F6 -:10D6F000000000000000000000003CF03C000000C2 -:10D700003F0F0F000000AF05AF05C0AAFCAAFFF550 -:10D710005F55F0FFAAAA5F5FFF0F3030FFFF3D3D6E -:10D72000AF053C3CFCFC00FFFFFF000000000000D8 -:10D730000000F5F514BEFF00171700FF00FF000002 +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 :10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 -:10D780000000030F0A000000AFAF0505C0AAFCAA05 -:10D79000AAA00A00000FAAAA5555F00030F330F3F2 -:10D7A0003D3DAF05000FF0FFE0F4F4F40000000091 -:10D7B00000000000A0A014BEFF001717F0F03C3CD2 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 :10D7E0000000000000000000000000000000000039 :10D7F0000000000000000000000000000000000029 -:10D8000000000100080008000004000004000000FF -:10D810002000000020000000000040000400000084 -:10D8200088000041200400000010000500000000F6 -:10D830002000010020000080850020000000C000C2 -:10D840002000000100002000004000400000404196 -:10D850000400200000112000000020002000000033 -:10D8600082002000000020000000000000000000F6 -:10D87000000000000000200800000000200400005C -:10D880002000000008008040800000000000000030 -:10D890000000000000000000000000000000000088 -:10D8A00000000000000041010000000021002000F5 -:10D8B0000000000020008000000420020000200082 -:10D8C0002102000000000000000000010003100021 -:10D8D0000000000000001000000000000002000234 -:10D8E0004000000000001102000000000082000063 -:10D8F0000002000200000004000200040002000018 -:10D90000400000040004000000410010000000047A -:10D9100000000000000000000000000000100000F7 -:10D9200000000010020000000000000000001000D5 -:10D9300000000000A00020002000000400040000FF -:10D94000000000000000000002000280020002004F -:10D9500002080280020002800280028002800240EF -:10D9600002000200020002808200020002000200A7 -:10D9700002000000020000000000020000000000A1 -:10D98000020000000200000000080000000800087B -:10D99000000200000000000000000400000004007D -:10D9A000000000000000000000080000000800085F -:10D9B00000040000000000008000800040A10089F9 -:10D9C00000080000008400000000800880408008FB -:10D9D000808480848040808484408840804080406F -:10D9E00080018088800283048040000800000008D5 -:10D9F0000010000802000400040002000000020001 -:10DA0000020800880400000002002000400000001E -:10DA10001000000800009000080000050000000849 -:10DA200000080008000000000000000000000000E6 -:10DA300000000000000000000008000800080208C4 -:10DA4000414010200000000040080000400040213C -:10DA5000040001084003A0009140000000050003FD -:10DA6000008000210040000085408200820082008A -:10DA70000000040802100200000800000400040076 -:10DA80000000900002000000000090004000000034 -:10DA90000000002040A000000020800000020000E4 -:10DAA0000010038200080084030000000084038447 -:10DAB0000800000040080000000800A00200000468 -:10DAC0000200400000A00008000800200000002024 -:10DAD00009000000024000000000020100000000F8 -:10DAE0002188004000080001000002010500040038 -:10DAF0000084030040000400000008000000000053 -:10DB000000000000002000000020040000000000D1 -:10DB1000000400000209000000000800820000006C -:10DB200004100810000000000800000000000000C1 -:10DB3000000082000000004100040010000200000C -:10DB400008000000000200040000000000000000C7 -:10DB500000100000000000000000000000000200B3 -:10DB600002000200C00000100000000000000000E1 -:10DB7000004000040004000000000000000000005D -:10DB800000000000C000080000000040000000008D -:10DB90000000000000008000000000000000000005 +:10D8000000000000000000000000000000002000F8 +:10D8100020000000000020002000000000000000A8 +:10D8200000000000000000000000000000002000D8 +:10D8300020000000000004000020000000000000A4 +:10D8400004000001000000000000000000000000D3 +:10D850002000100000000000000000040000000094 +:10D860000000200000000000000400040000000090 +:10D870002000200000000000000000080000000060 +:10D880000000200440000000000000000000000034 +:10D890000002004000000002000000000000004004 +:10D8A00000000000000000000000000400820000F2 +:10D8B0000000000000000000000000010000000265 +:10D8C00000028090000000000000000200900000B4 +:10D8D0000000000000904040000200040002000030 +:10D8E00000000000000000020002000200024000F0 +:10D8F000000000000000000000020004000400001E +:10D900000000000000000000000000000000000017 +:10D910000200000000000000000000000000000005 +:10D9200000000010001000000000000000000000D7 +:10D930000000000004002020000020000000000083 +:10D9400000000000000000000000000000000000D7 +:10D950000000000000100000000000002000000097 +:10D9600000000200000000000000000000000010A5 +:10D9700000000000000004000000000000000000A3 +:10D98000000000000000020000000000000000088D +:10D99000000000080000040000002000000000005B +:10D9A000000000020000020000000000000000086B +:10D9B000000000080000000084010000A00020001A +:10D9C0000000000000000200000000000000000055 +:10D9D0000008000000080000040000000000000033 +:10D9E000000000000400020002000000000000002F +:10D9F0000008040000080200020000000008000007 +:10DA00000000000000000200040000000000000010 +:10DA100000110000000000000020000000000000D5 +:10DA200000000000000000000000000004000000F2 +:10DA300000000000000000000000200004002000A2 +:10DA400004000000C0001000A00000001000000052 +:10DA5000000000000400000040000000200004005E +:10DA6000400004000000000004000400000000006A +:10DA70000000900000000000000000000000000016 +:10DA80000000000000000000000004000000000092 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000008000800066 +:10DAC00080000000000200000200000000000000D2 +:10DAD000000000000000040000040000110000002D +:10DAE0000000000000000000000000000300000033 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000100000000000000000000000000000E5 +:10DB300000000000000000000000000000000000E5 +:10DB40000004002000200000000000000000000091 +:10DB500000000000000500000000000000000800B8 +:10DB60000000000000200000000000000000000095 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 :10DBA0000000000000000000000000000000000075 :10DBB0000000000000000000000000000000000065 -:10DBC00000000000000000002004000000000082AF -:10DBD000000000A0000000000000000000000000A5 -:10DBE00080008084C1000000080000A00000000048 -:10DBF0000000000000000084000000000010000091 -:10DC0000020000000000000000000000000004000E -:10DC10000000400000800000000001000280008041 -:10DC200000000000000000000004000000000010E0 -:10DC3000000001800080018001004000820000009F -:10DC4000000000009000200204000011000000000D -:10DC50000000000000800000012000000100000022 -:10DC60000404100000000000000001400108000052 -:10DC700000000100000000000000000000000000A3 -:10DC8000000008000000000000000000000000008C -:10DC90000000080040040010000410A02010000440 -:10DCA00000042010008400881008210800000010E3 -:10DCB000000800A0200400042004200040002100EF -:10DCC0000090000405102000090180A0000400005D -:10DCD000210000000000004003000204048802004C -:10DCE0000004050000000090000000000200020097 -:10DCF000000000A00200000021002100000004003C -:10DD0000080400400040400009000020000400001A -:10DD100000A00400002000000000880001000000B6 -:10DD200000000000200000000000000000000008CB -:10DD300000000000000000000408000000000004D3 -:10DD40000008000000004000000010000000000873 -:10DD500000000000000000000000020000000000C1 -:10DD600000000200000000000000000000000000B1 -:10DD70000021020008000000000000000000000078 -:10DD8000000000080010000000000000000000007B -:10DD9000000000000000040000000000000002007D -:10DDA0000000000000008000000000000000008271 +:10DBC00000000001000100000000008800000000CB +:10DBD0000000000000000000000000000000000045 +:10DBE000000000000008000000000000000000002D +:10DBF000000000000000000800000000000000001D +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000400000A4 +:10DC400000000080000004800000000000000000D0 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000080000000000000000AC +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000004000000000000034 +:10DCB000008400000000000000000000002000843C +:10DCC00000000000092000004020000000200000AB +:10DCD00000000000000000000000008400200000A0 +:10DCE00000000000009000000000000000000000A4 +:10DCF000000000000000000000000008000000001C +:10DD00000000000000000000000000000000000013 +:10DD1000008800000000000000000000000000007B +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000300000000E0 +:10DD400000000000000000000084000021800000AE +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000300000000000000000000B0 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 :10DDB0000000000000000000000000000000000063 -:10DDC00000000000000000008000000000000000D3 -:10DDD0000000410000000000000000008000000082 -:10DDE0000082000080001100000000000000000020 -:10DDF0000000000080000000200000000000000083 +:10DDC0000000000000000000009000210000A020E2 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 :10DE000020000000000000000000000000000000F2 -:10DE10000000000020000000000002C00010008888 -:10DE200002A00100840000000000000000000000CB -:10DE300000000000000000000000000100010000E0 -:10DE400000000000000000000000000001010001CF -:10DE500090000000000000000000000010C0000062 -:10DE60000000008800C000000088000000C0002002 -:10DE70000000200000C00000002020000000000082 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000100D1 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 :10DE80000000000000000000000000000000000092 -:10DE90000000000000000000000000000080000002 -:10DEA0000000000004042111000500000000000033 -:10DEB000000000000000000000000000001102400F -:10DEC0000002000000000000000000000009210323 -:10DED000210280040000000000000000000080809B -:10DEE0000000000000000080000000000000008032 -:10DEF00000000000000000800000000000000000A2 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED000080000000000000000000000000000003A +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 :10DF00000000000000000000000000000000000011 :10DF10000000000000000000000000000000000001 -:10DF2000000200000000A000840091210403000012 -:10DF300000000000000000000000000000000900D8 -:10DF400041004011000200000000000000000390AA -:10DF500010004011A00900050000000000000000B2 -:10DF600000000000000080000000000000008000B1 -:10DF70000000000000008000000000200000800081 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000008C9 +:10DF50000000000800800000000000000000000039 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 :10DF80000000000000000000000000000000000091 :10DF90000000000000000000000000000000000081 -:10DFA000880090002000000091A040009101A00195 +:10DFA0000000000000000000000000000000000071 :10DFB0000000000000000000000000000000000061 -:10DFC000000000000101000100000000000000004E -:10DFD000001101000000908300000000000000001C -:10DFE0000000000000000000C00000000000000071 -:10DFF000C000000090000000C000200000000000F1 -:10E00000C000000000000000000000000000000050 +:10DFC0000000000000000000000000000000000051 +:10DFD00000000088000100C00000000000000008F0 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 :10E010000000000000000000000000000000000000 -:10E020000000C08800A0020209A00000008202C116 -:10E0300001C000000000000000000000000000001F -:10E0400000000000000101010001000000000000CC -:10E0500000000000C04090A100000000020000008D -:10E060000000000000000000000000C00000008868 -:10E07000000000C000000000000000C00000000020 -:10E08000000000C0000000000000000000000000D0 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E05000000000001000900001000000000000001F +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 :10E090000000000000000000000000000000000080 -:10E0A00000000000800000800000210000040484C3 -:10E0B000C105110300000000000000000000000086 -:10E0C00000000000000921400210001100000000C3 -:10E0D00000000000000980828382030400008000A9 -:10E0E00000000000000000000000000000800000B0 -:10E0F0000000000000800000000000000080000020 -:10E10000000000000080000000000000000000008F +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000020000000000008000000000018 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F :10E1100000000000000000000000000000000000FF -:10E1200000000000000080008000000000000440AB -:10E1300011800080081000000000000000000000B6 -:10E140000000000000000909401103000220000047 -:10E150000000000000004121212111804110000039 -:10E1600000000000000000000000000000000000AF -:10E17000800000000000000080000000000000009F -:10E18000800000000000000000000000000000000F +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000002000000000000BD +:10E16000001000000000000000000000000000009F +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F :10E19000000000000000000000000000000000007F -:10E1A00000000000000000004000A090A0900200CD -:10E1B0000001019000C0010000000000000000000C -:10E1C000000000000000000000020101010000004A -:10E1D00000000000000000000183000001A0000119 -:10E1E000000000000000000000009000009000000F -:10E1F0000000C000082000000000C00088000000EF -:10E200000000C0000000000000000000000000004E +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000001000000003E +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E :10E2100000000000000000000000000000000000FE :10E2200000000000000000000000000000000000EE -:10E230008400840000E00000000A000000000000EC -:10E2400000000000000000000000410000E00000AD -:10E2500000000000000000000000418200E0070014 -:10E26000410000000000000000000000000000006D +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000E00700D7 +:10E260000021000000000700000000000000000086 :10E27000000000000000000000000000000000009E :10E28000000000000000000000000000000000008E :10E29000000000000000000000000000000000007E -:10E2A000000000000000000000000000C0C00000EE -:10E2B00055000000000000000F00000000000000FA +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E :10E2C000000000000000000000000000000000004E :10E2D000000000000000000000000000000000003E -:10E2E0000F000F0000000000000000000000FFFF12 -:10E2F0000000FFFF5555FFFFFF00FFFF0F0FFFFF5F -:10E30000FF00FFFF0000FFFF0000FFFF0000000014 +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D :10E3100000000000000000000000000000000000FD -:10E32000000000000000000000000000000000C32A -:10E330000000D200D200000000000F00000000002A +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD :10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD -:10E360000000F000F00000000000000000000000CD -:10E37000FFFF0000FFFF5555FFFFFF00FFFF0F0FDE -:10E38000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF9C +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D :10E39000000000000000000000000000000000007D :10E3A000000000000000000000000000000000006D -:10E3B00000EB0F0F2AAA2AAA0000000000000000AC +:10E3B000000000000000000000000000000000005D :10E3C000000000000000000000000000000000004D :10E3D000000000000000000000000000000000003D :10E3E000000000000000000000000000000000002D -:10E3F0000000C3C3FFFFAAAAFFFFF0F0FFFFAAAA15 -:10E40000FFFF00FFFFFFF0F0FFFFF0F0FFFF3C3CDD +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C :10E4100000000000000000000000000000000000FC :10E4200000000000000000000000000000000000EC -:10E43000000000EB0C0C00000000000000000000D9 -:10E4400000020000000000000000000000000000CA +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC :10E4500000000000000000000000000000000000BC -:10E460000000000000000000FFFF000000000000AE -:10E4700000000000C3C3FFFFAAAAFFFFF0F0FFFFE8 -:10E48000AAAAFFFF00FFFFFFF0F0FFFFF0F0FFFF81 -:10E490003C3C000000000000000000000000000004 +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C :10E4A000000000000000000000000000000000006C -:10E4B00000000000000050000000000000610000AB -:10E4C00080010000000000000000000000000000CB -:10E4D000000000000061000080010000000000005A -:10E4E000000000000041002F800D0000000000002F -:10E4F00000000000000040028000002092024082E4 -:10E50000800000209202408280000020920240821F -:10E51000800000208A0200000000000000000000CF +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E0000000000005610A0F050D00A000000008F3 +:10E4F000000000A00000000000000000000000007C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB :10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000007D7DE1 -:10E54000FF55F0F3FCFF0000000000000000000099 -:10E55000000000000000FFFF3C0FF0FCF3FF000094 -:10E560000000000000000000A2A2FFFFFFFF00006B +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB :10E57000000000000000000000000000000000009B :10E58000000000000000000000000000000000008B :10E59000000000000000000000000000000000007B :10E5A000000000000000000000000000000000006B :10E5B000000000000000000000000000000000005B -:10E5C0002828AA0000030C0F000000000000000033 -:10E5D00000000000000000003C003C0F003C033F36 -:10E5E0000000000000000000C0000808000030002B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B :10E5F000000000000000000000000000000000001B :10E60000000000000000000000000000000000000A :10E6100000000000000000000000000000000000FA :10E6200000000000000000000000000000000000EA :10E6300000000000000000000000000000000000DA -:10E640000000FF555F5F8083BCBF0000000000003A -:10E65000000000000000000000005FFF5F55E8FFC1 -:10E66000E8FF00000000000000000000C000000003 -:10E67000808000000000000000000000000000009A +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A :10E68000000000000000000000000000000000008A :10E69000000000000000000000000000000000007A :10E6A000000000000000000000000000000000006A :10E6B000000000000000000000000000000000005A -:10E6C00000000000AA000A0A8083BCBF000000000E -:10E6D0000000000000000000000000000FAA0F0072 -:10E6E000E828E8280000000000000000000000000A -:10E6F000000080C0000000000000000000000000DA +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A :10E700000000000000000000000000000000000009 :10E7100000000000000000000000000000000000F9 :10E7200000000000000000000000000000000000E9 :10E7300000000000000000000000000000000000D9 -:10E740000000000000001000000000002000200079 -:10E750000800080410040000080000002000000069 -:10E76000000000000000A000000000000000040005 -:10E770002000200020000000000000000000000336 -:10E780000000000040001000000000000000001128 -:10E790000000200000000000000000000000000059 -:10E7A0000000000000002000000000040004000041 -:10E7B00000020000000084000000000000000000D3 -:10E7C0000002400000000000000000000000000007 -:10E7D0002100000000000000000000000000000018 -:10E7E0000000000000000000000000000002000225 -:10E7F00000000000000400040000000041000000D0 -:10E800000000000041008000040000A0000000A003 -:10E8100000C00000009000000402000000000000A2 -:10E8200000004002000000000082004000001000D4 -:10E8300000020020000200020000000000020000B0 -:10E8400000000000000000000000000000000000C8 -:10E8500000000000000000100004000000000000A4 -:10E8600000000000000000000000000000000000A8 -:10E87000000000000000000000080100000000008F -:10E880000000000001000000000000000000000087 -:10E890000040000000000000000000000000080030 -:10E8A00090108410000000000010000082000000A2 -:10E8B00002000000000000008210001000000000B4 -:10E8C000000000000000090000000000000000003F -:10E8D0000000000000040000000200000000000032 -:10E8E0000008000800000084000000000000000094 -:10E8F0000000000000000000000000884000000050 -:10E900000008001000004000000000C004000000EB -:10E910000040000000000000004000000010000067 -:10E920008000000900010000000000080000000055 -:10E9300000000000000004000082000100C100008F -:10E94000004000080000000084000000900000006B -:10E9500090000000400040000200020000000000A3 -:10E960000000000000000000000000000000400067 -:10E970008400000000000000000841000000880042 -:10E980008480000000000000000000001000000073 -:10E9900008030210000400051041000300030008F2 -:10E9A0004005000300050003000000000000820095 -:10E9B00010050005000500210004000000040011FE -:10E9C000040040004000C004000000000000008877 -:10E9D000008400000000000000000000001000089B -:10E9E00000400900000000002100000000000000BD -:10E9F00008000000000008000000000020000000E7 -:10EA000000400010000000000000000000000400B2 -:10EA100000000000030100000300210008000800BE -:10EA200008000000000000000000000000000000DE -:10EA300000200000000000000002000000000000B4 -:10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000000000B6 -:10EA60000000000000000000000084000000000022 -:10EA70000000000000000000000000000000004056 -:10EA800020000041080500051005000000000000FE -:10EA90000000822100400000000000000000000093 -:10EAA000000082040040000500040004000000048F -:10EAB0000009000400000000000000000000848045 -:10EAC000000500040004A000000000000000000099 -:10EAD00000000000000000000000000000900004A2 -:10EAE00000000010000000040020002000000000D2 -:10EAF00000000000000000000000000000C0000056 -:10EB00000000800000000000050000000000000080 -:10EB10000000000000000040002000000000000095 -:10EB20000000000000000000000200880200000059 -:10EB300000000800000000000000000000000000CD -:10EB400000100000000000000000000000000000B5 -:10EB500000000000000000000000000000000000B5 +:10E7400088002000000000000000200400040000F9 +:10E750002000000010000000000040000000000049 +:10E760000000000000040400000820020000000077 +:10E770000000000000040000100000000000000382 +:10E78000008000800080008400020000000400047B +:10E790000000040000000004000001000000000070 +:10E7A0000000000040000000000000000080100099 +:10E7B0001000008000000000000000000004880439 +:10E7C0000000000000000000000000000002000047 +:10E7D00000024002000000024000000000000000B3 +:10E7E0000000000000000000000000000000009099 +:10E7F0000800000000000000000400020000000407 +:10E800000000000400044004000400900090000098 +:10E8100000900002800000020000102002020000B0 +:10E820000090000000000000000000000040000810 +:10E8300000000000000800000002000000000000CE +:10E840000000000000000000000000840120010022 +:10E8500000000000000000000000000000000000B8 +:10E860000010000000000000000000000000000098 +:10E87000040404000080000000000000000000000C +:10E880000000000000040004000000000000000080 +:10E890000000000000000040040004102000000000 +:10E8A00000000080000000000200000040000000A6 +:10E8B0000400000000000000000000024010000002 +:10E8C00000000010000800100000000000212011CE +:10E8D0002008000000000008000000040000000004 +:10E8E0000000000000080000000000000000000020 +:10E8F00002040000000000200000000000000000F2 +:10E9000000000000000000080000000000000200FD +:10E9100000880000000004000401000000018908D4 +:10E92000000800000020080400000000000084002F +:10E930000400000000000000000009000001800841 +:10E940000082040004000000001000000009000024 +:10E950000021000000100000000000000000000086 +:10E960000010000000000000000000030000000094 +:10E9700000000000000000001000900000004000B7 +:10E980000000C000000000000004000502000004B8 +:10E9900000000000000000000000400040004000B7 +:10E9A0000000100300000000000000002000000034 +:10E9B00000000000000090000000000000000000C7 +:10E9C0000200002100000000000000010000000023 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0002000000000000000008400000000000073 +:10EA00000000000800000000000000410084000039 +:10EA100000010000000000000000000000000000F5 +:10EA200000400000000000000000000000000000A6 +:10EA300000000000000000000000000000000000D6 +:10EA40000000000000000000000000800080008046 +:10EA500000000000010000800080000000000000B5 +:10EA60000000000000000800080000000800080086 +:10EA70000000000000000000000000110021001153 +:10EA80000010000000080840000000000000000521 +:10EA900000000000080000400000004004000000EA +:10EAA000042000200000000000050000000000001D +:10EAB00082000000000000000000020000000000D2 +:10EAC0000000000010000000000000000004002012 +:10EAD00000040000000020000020000400000000EE +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000082000094 +:10EB00000000000000000000000000000000000005 +:10EB10000000000000000000000000000000800075 +:10EB2000000080010001000008000000000000005B +:10EB3000000000000000000000A0000041000000F4 +:10EB40000000000000000000210000000000202064 +:10EB50001000000000200000000020000100000064 :10EB600000000000000000000000000000000000A5 -:10EB7000000000000000000000008400000002000F -:10EB8000908000009000000090000821000000002C -:10EB900000050210000800110002004000040002FD -:10EBA00000000005080090020011000800090000A4 -:10EBB0000011000000210000000000000000000023 -:10EBC00002000000001100000000A0000004041179 -:10EBD000400003081000008800900000008800003A -:10EBE0000000000000200000000000000000000005 -:10EBF000000021000090000000000000050000005F -:10EC0000080011040090042021000000800008008A -:10EC100000000590050100000000000000010088D0 -:10EC20000004080000008020000000000000000038 -:10EC300000000000000000000000000000000000D4 -:10EC40000000400000000000000400000000000080 -:10EC50000020000000000000000000000000000094 -:10EC6000000000040000000000000200020000009C -:10EC70000000000000000000000000000000000094 -:10EC80000000200000000000000000000200000062 -:10EC90000000000000030003842100040803002199 -:10ECA0000010000000000008000000030000000841 -:10ECB00000000000002100410021002100000000B0 -:10ECC00000000000000384210021000090000000EB -:10ECD0000040000000000000008800000004000068 -:10ECE0000000000000000000001000000000000014 -:10ECF0000000000000000000000800000000000804 -:10ED000000002000800000000000000000008000E3 -:10ED100000000000000000020000050400000000E8 -:10ED200011000001050000000000000000000000CC -:10ED30000000020040000000000000000000000091 -:10ED400000000000000000000000000000001100B2 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 +:10EB70000000000000000000000882008200000089 +:10EB8000080000000900002000000000000800004C +:10EB900000000000000000000000000008008800E5 +:10EBA0000000000000000000000000000000000065 +:10EBB00082100000000000000000000000000000C3 +:10EBC0000003000000000000000000210080002180 +:10EBD00000010000000000010000000080000400AF +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC000000901184000404100000000000000000C7 +:10EC100000000000000000000000000000000000F4 +:10EC20000020000000000000400000000000000084 +:10EC300000000000000000000020000000000000B4 +:10EC400000000000000000000000000000000008BC +:10EC5000000000200004002000040000000000006C +:10EC60000000000000000021000000000000000083 +:10EC70000000000000000000000004000000000090 +:10EC80000000000000000000000000080008020072 +:10EC90000000000000000000000000000000002153 +:10ECA00082000000000000000000000000000000E2 +:10ECB000000000000000000000090000000000004B +:10ECC000000000000000080000000000000000003C +:10ECD0000000000000000001000100010000001021 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000400000010 +:10ED0000000000000000000000880000000000007B +:10ED100002000000000000002010000000000000C1 +:10ED200000000000000000000000000020000300C0 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000001A00088009000040000F6 +:10ED600000000100000000000000000000000000A2 :10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000021170 -:10ED9000082000900882000008111010001108835C -:10EDA0000888104000820288000000000000000077 -:10EDB000109010900082C0020000000000000000CF -:10EDC0000000000000000000401008880088088251 -:10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 +:10ED80000000000000008408009000880088000057 +:10ED90000000000000000000000000000000000073 +:10EDA00000000000000000000000900000000000D3 +:10EDB0000000000000000000000000000000000053 +:10EDC0000001000000010001000000004000000000 +:10EDD0000001000000000000118000004080008061 +:10EDE000000000000800000000000000000000001B :10EDF0000000000000000000000000000000000013 -:10EE000000000000000000000000000020000000E2 -:10EE100009A0009000100091000083100085009070 -:10EE20000090000000800080000000000000000052 -:10EE300000000000000000808000000000000000D2 -:10EE400000000000000000000000808000000000C2 -:10EE50000080000000000000000000000000000032 -:10EE600000000000000000000000000000000000A2 +:10EE00000000000000000000008000800080000082 +:10EE100000000000000000000000000000000500ED +:10EE20000000000000000000000000008000000062 +:10EE3000000040000000040000000000000000008E +:10EE4000000000410002000800080000110000005E +:10EE500000000041000200100002000800110088BC +:10EE60000000000800000009008000000000000011 :10EE70000000000000000000000000000000000092 -:10EE8000000000000000000000000040000000083A -:10EE900000000000800880800080000009004121FF -:10EEA000080910008000002080A100000010000070 -:10EEB00000000000800000828000000000000000D0 -:10EEC0000000000000000000000000000000001131 -:10EED000000800000000000000000000000000002A -:10EEE0000000000000000000000000000000000022 +:10EE8000000000000000000000008000800300007F +:10EE900080000000000000000000000000080000EA +:10EEA00000050000000000000000000000000080DD +:10EEB00080008000801000008000800000000000C2 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000929 +:10EEE000004000080001008800000002000000004F :10EEF0000000000000000000000000000000000012 -:10EF00000000000000000000000000000000000001 -:10EF1000000000001000080540020208000009007F -:10EF200008020220898402001004200408840000E2 -:10EF30000000000000000800100802022004000089 -:10EF400000000000000000000000000000000200BF -:10EF50001002880290840000000000000000000001 -:10EF600000000000000000000000000000000000A1 +:10EF00000000000000000000000000008800100069 +:10EF1000C040900000000000000000000000000061 +:10EF200000000001000800000000000000000000D8 +:10EF300090028200C020900088000800C0000000FD +:10EF400000000000000000000000000000000000C1 +:10EF50000000000000000000000000000000210090 +:10EF6000200002000200000002002000000000005B :10EF70000000000000000000000000000000000091 -:10EF80000000000000000000000000000000000081 -:10EF9000880000000000110800080840021000016D -:10EFA000891001100240081091020020108408907E -:10EFB0000000000000000000C0080020A010402059 -:10EFC00000009000000000000000000000000000B1 -:10EFD0008908002008901090000000000000000048 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 +:10EF8000000000000000000000000000000010026F +:10EF900000040084000200000000000000000000E7 +:10EFA0000000C000000000000000000000000000A1 +:10EFB000010000000400000000000000000000004C +:10EFC0000000000000000000000000000000000041 +:10EFD000000000000000000100000000010000002F +:10EFE000410080008000A000200000008000100090 +:10EFF000030000000000000000000000000000000E :10F000000000000000000000000000000000000000 -:10F010000000000000000300C10002808380110096 -:10F020000001410009801180008041000080808043 -:10F0300090000000000000000000838000800000BD -:10F040008000000000000000000000000000000040 -:10F0500000004100008080009000000000000000DF -:10F0600000000000000000000000000000000000A0 +:10F010008000000000000000000000000000000070 +:10F020000000000080000000080000000000000058 +:10F03000000041000000800000000000000000000F +:10F0400000000000000000000000000011000300AC +:10F050000000001000200011004100000500100019 +:10F060000000800800400000000000000040000098 :10F070000000000000000000000000000000000090 :10F080000000000000000000000000000000000080 -:10F0900000000000000000000000000900830000E4 -:10F0A000000000010091009000000008001000091D -:10F0B00000000000000000000000000000100090B0 -:10F0C0000080800000000000000000000000000040 -:10F0D0000000000000108010000000000000000090 -:10F0E0000000000000000000000000000000000020 +:10F0900000000005808200008000000000000000E9 +:10F0A0000000000000000000000000000000000060 +:10F0B00000000000001100000080000000000011AE +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E000000000009001900082004000000000003D :10F0F0000000000000000000000000000000000010 :10F1000000000000000000000000000000000000FF -:10F1100000000000000000000000000090008811C6 -:10F12000100888000001C002880810081001900033 -:10F130001002200290000000000000000000880083 -:10F14000821002080800000000000000000000001B -:10F15000000000000000200082080208900000006B -:10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F +:10F1100000000000400002109010020000000000FB +:10F1200000000000000000000000000000000000DF +:10F13000000000000000000100000040000000008E +:10F140000090000800000000000000000000000027 +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000E007004100000077 +:10F1700000E00700000000000000000000000000A8 :10F18000000000000000000000000000000000007F -:10F19000000000000000600000E00000000000002F -:10F1A00000000700480000000000000007004800C1 -:10F1B0000000000007004800000000000000000000 -:10F1C00000000000070042120000000000000000E4 -:10F1D00000000000000000000000000007004800E0 +:10F1900000000000000000810000070000000000E7 +:10F1A0000000000000000000000000E0000041003E +:10F1B00000000000000000000000000007006000E8 +:10F1C000884100E00701000000000000000000008E +:10F1D000000000000000000000000000000000002F :10F1E000000000000000000000000000000000001F :10F1F000000000000000000000000000000000000F :10F2000000000000000000000000000000000000FE -:10F2100000000000000000000000000000000000EE +:10F21000000000000000000000000002FF007F006E :10F2200000000000000000000000000000000000DE :10F2300000000000000000000000000000000000CE :10F2400000000000000000000000000000000000BE :10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E +:10F260000000000000000000000000000008000096 :10F27000000000000000000000000000000000008E :10F28000000000000000000000000000000000007E -:10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000000005E +:10F2900000000000000000000000000000C3FF00AC +:10F2A0007F000000000000000000000000000000DF :10F2B000000000000000000000000000000000004E :10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E @@ -118605,43 +118605,43 @@ :10F2F000000000000000000000000000000000000E :10F3000000000000000000000000000000000000FD :10F3100000000000000000000000000000000000ED -:10F32000000000000210200000881084000002107D -:10F330002000008810840210200000881084000043 -:10F34000000000000000021020000088108400006F -:10F35000000000000000000000000000000002109B -:10F360002000008810840000000000000000000061 +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D :10F37000000000000000000000000000000000008D :10F38000000000000000000000000000000000007D -:10F39000000000000000000000000000000000006D -:10F3A000000000000000000000000000000000005D +:10F390000000000000000000000000000000C303A7 +:10F3A000C0039919000100000000000000000000E7 :10F3B000000000000000000000000000000000004D -:10F3C000000000000000000000000000000000003D +:10F3C000000000000F0F000F000000002FBFF0F042 :10F3D000000000000000000000000000000000002D :10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D +:10F3F000000080000000000000000000000000008D :10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC -:10F4200000000000000000000000000000000000DC +:10F42000C000C00399180081000000000000000027 :10F4300000000000000000000000000000000000CC -:10F4400000000000000000000000000000000000BC +:10F440000000000000000000000F000000002FBFBF :10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000000007C +:10F47000000005610A0F050D00A005610A0F050DCA +:10F4800000A00000000000000000000000000000DC :10F49000000000000000000000000000000000006C -:10F4A000000000610007800D000000610006000DF3 -:10F4B0000001000000610006001D000100000000C6 -:10F4C000000000010000000000000000000000003B -:10F4D000000000000000000000000000000000002C -:10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C +:10F4A00000008000002800100000000000000000A4 +:10F4B0000000000000610007000D000000000000D7 +:10F4C0000000000005000A00050000A50065002FEF +:10F4D000800D000800000000000000000061000630 +:10F4E000000D000000610006000D00000061000634 +:10F4F000000D0000000000000000000000000000FF :10F5000000000000000000000000000000000000FB :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB :10F5300000000000000000000000000000000000CB :10F5400000000000000000000000000000000000BB :10F5500000000000000000000000000000000000AB -:10F56000000000000000000000000000000000009B +:10F5600000000000000000000000BCBC3CBE000029 :10F57000000000000000000000000000000000008B :10F58000000000000000000000000000000000007B :10F59000000000000000000000000000000000006B @@ -118649,1448 +118649,1448 @@ :10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B :10F5D000000000000000000000000000000000002B -:10F5E000000000000000000000000000000000001B +:10F5E000000000000000000000000000A0A000AA31 :10F5F000000000000000000000000000000000000B :10F6000000000000000000000000000000000000FA :10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA -:10F630003F5F305F000000000000FDF1CDC1787831 -:10F64000AAFF000000000000000000000000000011 +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA :10F6500000000000000000000000000000000000AA -:10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A +:10F660000000FF053D3D000000000000000000001C +:10F6700000005D0C5D5D0000000000000000000067 :10F68000000000000000000000000000000000007A :10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A -:10F6B00000003F5030500000000000003D310D01BF -:10F6C00078780055000000000000000000000000F5 +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A :10F6D000000000000000000000000000000000002A -:10F6E000000000000000000000000000000000001A -:10F6F0000000000000000000000000000000040006 -:10F700004000400001802080002000200000888010 -:10F71000200000041008200000002000000000006D -:10F7200000000000010000000000000000000000D8 -:10F73000200000002010010020000502000300004E -:10F7400000A08800001020000000000088000000D9 -:10F750000000200000040000000000000000000085 -:10F760000000000000040000000000042000000071 -:10F770000000000000020004000000040404000077 -:10F780008000200000001020002000010001000087 -:10F790000020000000000000000000000000000247 -:10F7A00000002000000040000002000000020000F5 -:10F7B000000200020002800020028000A000000081 -:10F7C000000000210000000080000900004000C08F -:10F7D0000000008200000000000000020000009015 -:10F7E000000000020000000000C0400200C0000451 -:10F7F00000900002000021830090009000020000B1 -:10F800000400004000000810000000090010040976 -:10F810000000904100090009000000000000000005 -:10F8200000000000001000100000000010050000A3 -:10F8300000000005000000000000000000000100C2 -:10F8400000000003000000000000000000000000B5 -:10F8500000000040000090000000000000000000D8 -:10F86000040002000000020000000200000004008A -:10F870000200020002000200030000000200020079 -:10F880009000800000000000000100080000000857 -:10F8900000080008000000000000008400000000D4 -:10F8A0000084000000000000040400880000834081 -:10F8B00000080084000000000000000200000004B6 -:10F8C0000400000011000000000000000000000023 -:10F8D00000000002000000400000000000000000E6 -:10F8E0000008200000000000000000000000008868 -:10F8F00000000000000000000000400000000400C4 -:10F9000004900200040004200009100040000000E0 -:10F9100000050000000000000000001004000000CE -:10F920000000000000050000000000004002000090 -:10F930000000000482000000100088000000880021 -:10F9400088400200000020058820000040002000C0 -:10F95000000040009000002188000000000000002E -:10F96000004000000000000500000000C000000092 -:10F97000000082000000400000000004000004209D -:10F9800000110000000000008001000000000000E5 -:10F99000000000000000000000000000000109005D -:10F9A000000000000000000008004000000000000F -:10F9B00000004000000100000800040000000800F2 -:10F9C0000400110000880000004041030040029044 -:10F9D000840200A00004008200A000C000000420F7 -:10F9E00000000000000000200084008400A000004F -:10F9F0000000200000000020000000000000004087 -:10FA000000200490100011900400C00000000200CB -:10FA100000000011000400048280000000000000CB -:10FA2000000000000000000082000000000008004C -:10FA30000080080000000000000008211000820083 -:10FA4000000082000000080000000000010000002B -:10FA50000002008000000000000000000000000024 -:10FA60000000000000000800000000040000080082 -:10FA7000000008000000000000000000000040003E -:10FA800000008200A004A0000000C10000000000EF -:10FA90002008008400000001000103400000000075 -:10FAA000030000000000000000000000042000002F -:10FAB00000000002000000880000000000000000BC -:10FAC00000002000000000000000000000A00488EA -:10FAD00000000001020400A000880082000002C0B3 -:10FAE00000002000000011001100000000200004B0 -:10FAF00008040000000000000020000000000000DA -:10FB00008300000000C0000010001100008004000D -:10FB1000900000800000200000080000000200406B -:10FB200000200000000000000000000000000000B5 -:10FB3000400000000000000000000000A0210008BC -:10FB400004008800880088004000100000000000C9 -:10FB500000000000000000000000000000030000A2 -:10FB6000000000400000080000000000000000004D -:10FB70000000000000000002000040000000000043 -:10FB80000000000400000000000090004000002081 -:10FB900000000000004041008084000000080000D8 -:10FBA0000001000100000200000000000000000051 -:10FBB0000000400000000000000000000000000005 -:10FBC00000020402009020842004000821000000AC -:10FBD0004040028820900590110200881100052005 -:10FBE000000000000000022004000084000020202B -:10FBF0000400000000000000000000000000000001 -:10FC000000001104110500040000000000001100B4 -:10FC100000000000000000000000010000000000E3 -:10FC20000021000400040011002100000008000071 -:10FC30000000080000000000400400000000000078 -:10FC400000000021100082000000080000000000F9 -:10FC500000000003018000200000014000000000BF -:10FC60000000000000000000000000000000004054 -:10FC700000000000000300000000002100214000FF -:10FC800000000000C00008000004000000000000A8 -:10FC90000000000000000000000000001000000054 -:10FCA0000000000000000000000000000000000054 -:10FCB00000000000000000000000800000000000C4 -:10FCC0000000000000A00000200420000000000050 -:10FCD0000000000020C004200000410020000208B5 -:10FCE000004000400000004000840000004002008E -:10FCF00005880200000002000004404000000000EF -:10FD000000000000000000000000000100000000F2 -:10FD1000000000C003C0902000A082C010000010AE -:10FD2000001000040008000000080490000000001B -:10FD300000000000000000000000000000010801B9 -:10FD4000C0010001000000000000000000000000F1 -:10FD5000000000000000009000C090880008000033 -:10FD60000000000000000000000000000000000093 +:10F6E0000000000005050505000000000000000006 +:10F6F000000000005D0C0C0C000000000400000085 +:10F700002000200004002000000420000000200051 +:10F7100020002000880020002000000020000400BD +:10F720002004200020000000000020000000000055 +:10F730000000000400002002200010000000200053 +:10F740002000040004002000000800002000000049 +:10F750000000000000000000200040002000200009 +:10F760002000200420042000000088002000000069 +:10F770000000000400040000200004000400100049 +:10F780000000000000020002000040000000000233 +:10F790000002000200020000000000000000000063 +:10F7A0000000000000000000000008000040080207 +:10F7B0000002000200000000000000000000000045 +:10F7C000410008C00004004000000040004000006C +:10F7D000009000000000000040C000900000000009 +:10F7E0000000000000000000000000000000000019 +:10F7F00000020002000000000000000020002000C5 +:10F8000000000000000000000000000000100410D4 +:10F8100000000000000000000000000000000000E8 +:10F82000021000000000020090000000000004022E +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000010000000000B7 +:10F85000000000000000000008000004000000009C +:10F860000200000002000000000000000400000090 +:10F870000400000000000000000000000000000084 +:10F8800002000000040000880000000000000000EA +:10F890000000000000000000020000000000000066 +:10F8A0000408400000000000008400000008000080 +:10F8B00000000000000000000082000000000000C6 +:10F8C00000080000040000000000000040000004E8 +:10F8D000000004000000000000000008000000001C +:10F8E000000004080000000000000000000000020A +:10F8F00004000200000000000000050804000000F1 +:10F90000000000840011000300200008000000082F +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000002000000000B7 +:10F93000000000000400000040000008000000007B +:10F9400000008800000040000000000000000200ED +:10F95000000002000000880000009000002000006D +:10F960000000000000000000000000000000004057 +:10F97000000000000008000000000000000000007F +:10F9800000000000000011000000000000C00000A6 +:10F990000000000000000000000000000004000063 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000200000000000000000000027 +:10F9C0000000001000000000000000000000000027 +:10F9D0000000000000000300000000000000000024 +:10F9E00000000000000000A0000000000000000077 +:10F9F00000000220000000000000000000000000E5 +:10FA000000080000000000000000000000000041AD +:10FA100008000000001100000000000000000021AC +:10FA200000000000000000000000000000000000D6 +:10FA300000000800000000000000080000040000B2 +:10FA4000080082090000A000000000000000000083 +:10FA500000000000000000000000000000000004A2 +:10FA6000000000210000080000000000004100002C +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA900000000000000800900000000000000000CE +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0002000000000000000000000000000000016 +:10FAD00020000000000000080000000000000000FE +:10FAE000008800000000000000000000000000C0CE +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000300000000000000000000E2 +:10FB200000000008000000000000000000000000CD +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000004035 +:10FB900005900004418800000084000000840000FB +:10FBA0000000000000000000000000000000000055 +:10FBB000000000000000000000000000000005023E +:10FBC00000880804000000000000000000000000A1 +:10FBD00000000000000000A0000000002100000064 +:10FBE000400000000000000000000284000000004F +:10FBF00000000000000000000040000000000008BD +:10FC000000000000000000000000400000000000B4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000002000000080000000000000000CA +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000008000000000000000000AC +:10FC50000000000082000800080000000000000012 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000020000000000000000000082 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000020000000000000000000000034 +:10FCB00000000000004000400000000000000000C4 +:10FCC00011000000200000000900000000000000FA +:10FCD0000000000011400040009000400200004081 +:10FCE00000400200000000001000000000A0000022 +:10FCF00000001100000000000000000000000000F3 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000001A2 +:10FD60000001000000000000000000000000000092 :10FD70000000000000000000000000000000000083 -:10FD80000000000000000000000002000000000071 -:10FD9000000000000000C1808080008080008000A2 -:10FDA000040000800000008000000080008000004F -:10FDB0000000000000000000000000000000004102 -:10FDC000902100200003000000000000000000005F -:10FDD0000000050000000000090021000080000074 -:10FDE0000000000000000000000000000000000013 +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE000401000100041000500000000000000006D :10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000200000000000D2 -:10FE100000000000000000000000001100808000D1 -:10FE2000028004008000C11180000000000000007A +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 :10FE300000000000000000000000000000000000C2 -:10FE400040000300110002800000000000000000DC -:10FE50000008000080058000000000000020000075 -:10FE60000000002000000000000000000000000072 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 :10FE70000000000000000000000000000000000082 -:10FE8000000000000000000000001100100005004C -:10FE90004100000000000000000000008401100488 -:10FEA0008200000810001000890008000000000017 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 :10FEB0000000000000000000000000000000000042 -:10FEC0000000010801000000001000000000000018 -:10FED00000008401000008019020000000000000E4 -:10FEE000000400000001000000000000000000000D +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000000012 :10FEF0000000000000000000000000000000000002 -:10FF000000000000000000000000000000000100F0 -:10FF1000000001000000000000000000900200004E -:10FF20000090A10800100011000088031002008852 -:10FF3000000488C000000000000000000000000075 -:10FF400000000000000100000101000100000000AD -:10FF5000000000000000020000000000000004009B -:10FF600000008200400100000000000000000000CE +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 :10FF70000000000000000000000000000000000081 :10FF80000000000000000000000000000000000071 -:10FF9000000000010100000000000000000080805F -:10FFA000000000008900000900C0001100C100002D -:10FFB0000080000000800000000000000000000041 -:10FFC00000000000000000041021082100030000D0 -:10FFD000000000000000000080000000030000009E -:10FFE000001000030020004000000000000000009E +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE00000000000000000000000050041000000CB :10FFF0000000000000000000000000000000000001 :02000004001DDD :1000000000000000000000000000000000000000F0 -:100010000010002100080310000000000000000094 -:1000200080110080000000004180890009008009E3 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 :1000300000000000000000000000000000000000C0 -:1000400000000000000000001084050404004004CB -:100050000000000000000000000000100080000010 -:1000600000000000800000000000004000000000D0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000400000000050 :100070000000000000000000000000000000000080 :100080000000000000000000000000000000000070 -:100090000080008900210000002000000000000016 -:1000A000000090011020888884001108101088003A -:1000B000100000000004000000000000000000002C -:1000C0000000000000000000000001A0000101008D -:1000D000000100000000000000000000000100021C -:1000E00000000000400004000000000000000000CC +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF -:100110000000000800850000000000000000000052 -:10012000000000000082000007008400600600E07C -:10013000070000000082000007000000000000002F -:10014000000000000000000000000000600000E06F -:10015000000000000000000000000000600000E05F -:1001600007000000000000210000070000008100DF -:1001700000E000000000000000000000000000009F +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F :10018000000000000000000000000000000000006F -:10019000000000000000600000E00000000000001F -:1001A00000000000000000203C3CFF00FF003C007D -:1001B000F0F028282B2B00000000C0C000C0000079 +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F :1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F -:1001E0000000000000000000555500000000000065 +:1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF :1002000000000000000000000000000000000000EE :1002100000000000000000000000000000000000DE -:10022000000000000000000000003C3C000028002E -:100230003C00F0F028282B2B00000000000000C03C +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E -:10026000000000000000000000005555550000008F +:10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E -:1002A00000000000000000000000D7D7FF5500004C -:1002B0000A003C503C5005F505050000050541418C -:1002C00041410000000000000000000000000000AC +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E -:1002E000000000000000C3FFC3C30000FFFFFFFFCA +:1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD -:100320000000000000000000000000005757FF55CB -:10033000000000003C503C5005F505053C3C3D3DAF -:1003400041414141000000000000000000000000A9 +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D -:10036000000000000000000000FF0000000000FF8F -:10037000001000000000000000000000000000006D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D -:1003B0002020000000000040002480000000000019 -:1003C00000200040000100000000000000000000CC -:1003D000000000000000002100068009000000006D -:1003E0000000000000000061000F800D0000000010 -:1003F00080610026000D000000610006800D0000F5 +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F000000000000000000000610006000D000089 :1004000000000000000000000000000000000000EC :1004100000000000000000000000000000000000DC -:1004200000610006800500000000000000000000E0 -:1004300000000000000000000A0AAA0000C300C07B +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC -:100450000000000000000000008000C3ACACA0A0C1 +:10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C -:10047000000000000000AF0AAF0A0000000000000A +:10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C -:1004A000000000000000C3F0AA00000000000000EF +:1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C -:1004C00000C000000000000000000000000000006C -:1004D00000000000000000000000008000C3FFFCDE -:1004E000FFFC000000000000000000000000000011 -:1004F0000000000000000000AF0A2C08000000000F +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB -:10052000000000000000000000F0AA000000000031 +:1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB -:100550000000000000000000000000001414EFFF85 -:1005600055551000000000000000000000000000D1 -:10057000000000000000000000000000000000007B -:10058000000000000000000000000000000000006B +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:1005700000000000000000000000000000004343F5 +:10058000C1C30000000000000000000000000000E7 :10059000000000000000000000000000000000005B -:1005A00000000000000000000000AFAF0CFC0000E5 +:1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B -:1005C000000028283030000000000000000000007B +:1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B -:1005E0007FFF555555550000000000000000000039 +:1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA +:10060000C3C3C1C3000000000000000000000000E0 :1006100000000000000000000000000000000000DA -:10062000000000000000000000000000A0A00CFC82 -:1006300000000000000000000000000000000000BA -:10064000840000050000000000000400000000001D -:1006500000002080000020000002000200040004CE -:100660000002000000000000000000008200000006 -:1006700000001000000020C0000301000000000482 -:100680000004008284804000008004880080000014 -:10069000408001A001800080008000800000008078 -:1006A00040000000880088000000000000000000FA -:1006B00000000080010341830304000000000000EB -:1006C000000000000000000000000000000000002A -:1006D00000020000002000000000000000000000F8 -:1006E00000000000000000001000000200000902ED -:1006F00000000000000000020005000040000000B3 -:100700000002000000210040800000404040004006 -:10071000009000400202020200400040004000023F -:10072000004000020000008200820004000000027D -:100730000000208440040802080488030000000030 -:1007400000000000000000000000000000000000A9 -:10075000000000000000000000080005000000028A -:100760000000000202000000000000000000000085 -:1007700000000000A00400000004000000000000D1 -:1007800020000000000900000000028040008400FA -:1007900000000000000082008200000082000000D3 -:1007A00000000000020000002000000000000040E7 -:1007B0000280000002800200020008000010008891 -:1007C0000084000800080008008400040004000001 -:1007D000000000000004000000000008000000000D -:1007E00000080008000800020000000800000000E7 -:1007F0000000000821000008000000104008000070 -:10080000000080880008000800840000800280004A -:10081000000000000010040000C00000000000C044 -:100820000000000000880008024000040090000062 -:100830000083001000C00010000080008000000154 -:100840000800000000100000000000000008022165 -:100850000200000300080000000000200000000863 -:10086000004100000000000004080000000000211A -:1008700000000000A00000000000020000002104B1 -:100880000000C0414000A00020824105004100045A -:1008900040040408000002080000400900000000B5 -:1008A0000000000001000000011000000000000036 -:1008B0000000880020002011842104002000100086 -:1008C00040090000000000000000000000A000003F -:1008D000000000840082000000000082000100008F -:1008E0000000000000000000000000000000000008 -:1008F000000000A000880000040000002120400447 -:1009000008A100000004000000002003020800020B -:100910000000000000080000880000000000002027 -:10092000000000000000020000A00200000009001A -:100930000000000008040000000000000004800027 -:1009400000000484000000080021000000000000F6 -:100950000000400008000000080000000000000047 -:100960000000000082000000820000000000000083 -:10097000000000008800A00000000200000000004D -:1009800000000800000002000000C021A0040400D4 -:100990000000001000000000000000800002C00005 -:1009A000C000C00410000000000200090100C000E7 -:1009B000000084408440C0000000020000000000ED -:1009C0000000C14000000000000000002100000005 -:1009D000000000000002008400000000000000820F -:1009E0000000000000000300000000000000000004 -:1009F0000000000000000000000000048000000073 -:100A00000000000000000000830000004100000022 -:100A10000000000000000010030021000902000196 -:100A2000000000001100000000900000001040A035 -:100A3000000000004000000100C00000050000842C -:100A400020000000088200000000002000000002DA -:100A50000000000000000000000000000000000096 -:100A60000008000000000000000200000000041068 -:100A700000000000000000008200A00090000000C4 -:100A8000000002009021200400000011021100006B -:100A900000040005A000040400042104A00082203A -:100AA0008208C0020000A00020000011A000000287 -:100AB0001000000008000200020000000200001107 -:100AC000400000000011880440040000080000906D -:100AD000008400C00000000000A000A00000000290 -:100AE0000000000000000000040000000000000002 -:100AF000000008000000000000A00020000004002A -:100B000000000440080000408201000009828400C7 -:100B10002002030000000000000440041000000058 -:100B200000000000000000000000000000000000C5 -:100B30000001000000000000000000000400008828 -:100B4000009000A0000002000020008200000000D1 -:100B50000021001000000000000000400000000024 -:100B60000000000000210000000000000000004024 -:100B70000041000000004000C000000088000800A4 -:100B800088000000A00000000800900000009021F4 -:100B9000081100020241008440080188000040085A -:100BA000A0088811002100090811A0000802000017 -:100BB00000004000A0110040000000000000000004 -:100BC000000000000000880000000000000300009A -:100BD0000000000000001100000000000000000004 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000200F3 -:100C000000002090000000000000850000000000AF -:100C100000008000000100000008400040020000C9 -:100C2000800100000000030003C00000000000017C -:100C3000000020000000000000000000080000008C +:1006200000000000000000000000000000000000CA +:10063000000000000000000000000000200000009A +:100640000000000020042000000000000000400026 +:10065000000000000004000400000000200000086A +:100660000000000020002000000000004100008485 +:10067000000000800004C00400030080008020808F +:10068000008400A001002080008200850085008099 +:100690001082000000800004200400000000200000 +:1006A00000050000000020000000400204000000DF +:1006B00020000000000000002000000040000000BA +:1006C00000024000000204020000000000020000DE +:1006D00000000000000000000002000040000000D8 +:1006E0000000000000020002000000000000040002 +:1006F00000200084000400020085000000040004C3 +:1007000000040004000520020004000400040004AA +:1007100020040005000200081002004000400040D4 +:100720000000000040000000000000020000800205 +:100730000000000040004000000000000000000039 +:100740000100000000000000000000100000000098 +:10075000000000050000000000000000040004008C +:1007600004000400000002000000000000008200FD +:10077000080001002000000000000002000000004E +:100780000000000000024000108088000884000083 +:10079000A00000110000000000008200880200009C +:1007A0000000000008000800000000000010000029 +:1007B0000000000000000000000000100010000019 +:1007C000008804000000000000000000000000009D +:1007D000000800000084000000000000000080000D +:1007E0008008800880000008000000000008001059 +:1007F000001080000800800000820400000100005A +:10080000000000100082001180048020000480029B +:1008100000000000000003000000000000000001D4 +:1008200004000400000000000000000000000000C0 +:10083000000000000000008204000400000000002E +:100840000404202104802000001100000021000881 +:100850000008000400000021000000000003000068 +:100860000000000000000040000000080000000040 +:1008700010000000000040212000000001000000E6 +:1008800000004000004100000410040204000400C5 +:100890000020040091202000400000000000000023 +:1008A000880004210021000000000000000000007A +:1008B00000000020002000000008000000000000F0 +:1008C0000000800080008004800000000000000024 +:1008D0000000000000000000000000000000000018 +:1008E00000000000000000000001400000000000C7 +:1008F00000000000000000000000C1040000200013 +:100900000040000000000000000000010000800026 +:100910008000000180000401800000000000000051 +:1009200000000000000000000000000000000000C7 +:1009300000000000000100010000000000000000B5 +:10094000000000000004000000040004000000009B +:1009500000000000A00001000000000000000000F6 +:100960000000000000001000001110110000000045 +:100970000009000000000000A0200000100000009E +:100980002000000000000000000000400000000007 +:10099000000000002000002100000000000800000E +:1009A0000000000000000000000000000000002027 +:1009B000000000000000042000000000000800000B +:1009C000000000000000000121C00009000100003B +:1009D000000000000008000040000000410000404E +:1009E00000000400080000000000000800A0000053 +:1009F00000000000000000000000000100000000F6 +:100A000000000000210000000200000000000000C3 +:100A100000002000030009000000000000000000AA +:100A200000200000000000000000000000000000A6 +:100A30000000000000000000840000000000000032 +:100A4000000000000000000000A0051100000021CF +:100A5000C0080000000000000000000000000000CE +:100A60000800002108000000000000100000000045 +:100A70004000000000000000000004000000000032 +:100A8000200000000000A0000000000000000000A6 +:100A9000000500000004400000000020000000806D +:100AA0000120000000000000000000000000000025 +:100AB0000021000000000400000000000000000011 +:100AC000000000000000000000004004840000005E +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000001000005 +:100AF0000000000000000000000000008000000472 +:100B000000000000000040000000000000000000A5 +:100B100000000000030000000000080000010000C9 +:100B200000200401000000000000000000000000A0 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000001210088FB +:100B5000000001200800000000000000000000006C +:100B60000000000000000000000000000000000085 +:100B700000000000000000009000000000000000E5 +:100B800000000800000001042100000000008800AF +:100B900088000003C04000800000829100200040D7 +:100BA00000090084000000000000000000050000B3 +:100BB000000000000021040000008400000000008C +:100BC0000000000000000000000000000000040021 +:100BD000000400000401000000000000000000000C +:100BE00000000000000000000408000000100000E9 +:100BF00000000000000000000000110800000000DC +:100C0000000421002000000020002000000000005F +:100C10000000000403000000002000000320000189 +:100C20000000000002202000002009001100000048 +:100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 -:100C6000000000000000000000A000040010004090 -:100C70000000000000000000000000000000000074 -:100C80009010008800A08802111000900890108831 -:100C90000000411109900882108904C00082C00838 -:100CA000C08888C0090808C1C021020202050405E5 -:100CB000088808A0A0200004020200400040004074 -:100CC0000040401000880088201002C0000001A0F1 -:100CD00020000000000000000000000000000000F4 -:100CE0000000000000000000000000800000000084 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000048010008000CF -:100D100000000000822008218083002180830910C8 -:100D20000090000900801008004009048090842190 -:100D30008090800391008800000080800000000007 -:100D40000000000080800000000000808080000023 -:100D50000280000000000000000000000000000011 -:100D6000000000000000000000000000000000097A -:100D700000800000000000000000000000000000F3 -:100D80000000000000000080008000008800038850 -:100D9000850003000000A000400903082121900005 -:100DA00008020800C10010000803918041800385FB -:100DB000028590000403200020A0000003900000A2 -:100DC00000830000800000008003009000000040CD -:100DD00000008040800000000000000000000000D3 -:100DE0000000000000000000000000000000000003 -:100DF00000000010000000000000000000000000E3 -:100E00000000000000000000001000A00000090029 -:100E100004211004028400000300081090A08985BA -:100E20000500C0012108C140820010008282852097 -:100E300084028384119082892100202008A090835D -:100E4000200008C100400440020010048802908481 -:100E50000200080084000888000000000000000074 +:100C60000000000000000000000000000000000084 +:100C700000C0008800C000C00000000000000000AC +:100C8000A000400000008200000001008800000079 +:100C9000000000000000C000000000000000000193 +:100CA000000100000000400000000000000084007F +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000001100000000000000000003 +:100CE0000000000000000000000000000000000004 +:100CF0000000008000000000000000000000000074 +:100D00000000000000000000800000000300090057 +:100D1000000000000000020005000000080521118D +:100D200040100010020002008500000000000400D6 +:100D30008000000000000000000000000000000033 +:100D400000000000000000000000000000000000A3 +:100D50000000000000080000000800000000000083 +:100D60000000000000000000000000110000000072 +:100D700000000000000000800000000000000000F3 +:100D800000000000000000800000808000080000DB +:100D90000010008000000010000080200000801083 +:100DA0008000800800000008000000200080000093 +:100DB0000000000000000000000000000000000033 +:100DC00000000000000000000080000000000000A3 +:100DD0000000000000000000008800000088000003 +:100DE00000000000000000A0000000000000000063 +:100DF00000000000000000000002000000200000D1 +:100E000000000000000020002008A0009002000068 +:100E10000000000000080000000088000200A000A0 +:100E2000080004881001A088000000880000000865 +:100E30000000000000000040000000000000000072 +:100E400000000000000000000000000200000000A0 +:100E5000000000000000000000000400040000008A :100E60000000000000000000000000000000000082 -:100E70001000000000000200000000000000000060 -:100E8000000000000000000040400088C040020256 -:100E9000910800848411C011000189020021030916 -:100EA0000811A0880010000911C00809000400C042 -:100EB00002C0C1080182A085828303080020880443 -:100EC0000885900000000000C100891000208408FF -:100ED0001090080810080002A008000000000000A0 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F00000000000000000000000080000000000061 -:100F1000808041A0000900A18020000141041183CC -:100F2000054010A000102090419090838009058515 -:100F3000414080C090002005C1108088C10300207E -:100F400000830004000000000000A10041000080B8 -:100F500000008000800000000000C0800000000051 -:100F60000000000000000000000000000000000081 -:100F700000000000000000008000000000000000F1 -:100F80000000000000000000000000000000000061 -:100F9000000000000011009000008011000189880D -:100FA0000304100005108091808000808041801033 -:100FB0008080000080000810039020804000208086 -:100FC00008008400400800008000800080000011BC -:100FD000000200008000000000000000000000008F -:100FE0000000000000000000000000000000000001 -:100FF00000000000000082002000080082000000C5 -:1010000000000000000000000000000000000000E0 -:101010000000C00000002002022020100801000192 -:101020001004100805100400C0C01010A00804012E -:10103000C0200804C0C0020005088205088285009F -:10104000880284820584400040000288040802006F -:10105000080020100220080000000020009000007E -:101060000000000000000000000000000000000080 -:1010700000000000000000000082000007000000E7 -:101080000000000000000000000000000000000060 -:101090000000000000000000410000E0070048825E -:1010A0000000600000E0070048000012000020007F -:1010B000844100000000000000000000000000006B -:1010C0005000000000000000600000000000000070 -:1010D00084060000000007004800410000E0000016 +:100E70000000000000000000000000000200000070 +:100E80000000000000000000002000200884000294 +:100E90000000200100010101000000000800000026 +:100EA00001010000090182000001000008010801A1 +:100EB000010000000001000100010000000000002E +:100EC000000000000000000000000000000004001E +:100ED0000000000000000000000010000000000002 +:100EE00040000000000000000000000000000000C2 +:100EF0000000000000000000000040000000800032 +:100F000000000000000000000000000000000000E1 +:100F10000080001180100010080200000020002056 +:100F2000000908401000C104040905411008000828 +:100F300000100800001100400008004100000000FF +:100F40000000000000000000000000004100000060 +:100F50008000000000000000000000000000001100 +:100F60000000000000000000000000000800100069 +:100F70002000000000000000000000000000000051 +:100F800000000000000000000000000000040082DB +:100F90000000000000080000000000000000000049 +:100FA0000000000000000000000800000000000336 +:100FB0000021000000000000000000000000000010 +:100FC000000000000000000000000000000000051C +:100FD0000010000000000000000000000000000001 +:100FE0000000000000000000000000000000010000 +:100FF00001000000000000000000000000000000F0 +:1010000000000000000000000000000000000001DF +:10101000002000400000000100000000000000006F +:101020000000009000900000000000900090000080 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:10106000000000E007000000000000000000000099 +:101070000000000000000000000000000000000070 +:101080000000000007000000000000000000000059 +:101090000000000007000000000000E00000000069 +:1010A0000000000000E000000000000000E0070079 +:1010B0005000000000E007000000000000000000F9 +:1010C0000000000000000000000000000000000020 +:1010D0000000008100000700000000000000000088 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF -:101110000000606060606F0F670300000000000067 -:10112000000000000000000000000000C3C30F0F1B -:1011300091F7FFFF4E7EFFFF0DFDFFFF3CFFC3FF5A -:10114000FF9FE787EFDFEFDF66FF99FF81100181E7 +:10111000000000000000808CB0BC00000000000057 +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F :10115000000000000000000000000000000000008F -:1011600000F066C300000000000000000000000066 -:10117000000000000000000000000000999999980C +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F :10118000000000000000000000000000000000005F -:1011900000000000606060606F6F67630000000027 -:1011A0000000000000000000000000000000FF99A7 -:1011B0000000F7F7FFFFCFFFFFFFFDFDFFFF6F6FA1 -:1011C0006F6F9FFF87E72C1CEFDFF3F3F3F38110C2 -:1011D0001981000000000000000000000000000075 -:1011E000000000F0660000000000000000000000A9 +:101190000000000000000000838FB3BF00000000CB +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000210BC -:101220002000008810840000021020000088108434 +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E -:101250000000000000000000021020000088108440 +:10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E -:101280000000FFFF00000000000000000000000060 -:101290000000000000000000C0C3C0C30000000048 -:1012A000000000000000000000000000000000003E -:1012B0000000FFFFBDF0FFFFF372FFFFE1F9D2DB9B -:1012C000B4BDE7E7F0FFFBFBFDFDB1F38DCFFF3FC2 -:1012D000E727900040908989CFCF000000000000F0 -:1012E000000066660F0F3CFC424200000000000058 +:101280000000000000000000000F003C0000000013 +:10129000000000000000000000000000E0E3ECEFB0 +:1012A0000000000000000000000000000000F9F055 +:1012B00060F000000000DBDB4242000000000000A4 +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE -:1013000000006202FB9B00000000000000000000E3 -:1013100000000000000000000000660066FF000002 -:1013200000000000000000000000000000000000BD -:1013300000000000FFFFBDFFFFFFFF7EFFFFE7FF94 -:10134000F6FFF6FFE7E7FFF0FB62FD64BDFFBDFFC0 -:10135000FF3FDB1BF0004000CFCFCFCF00000000ED -:10136000000000000000000000C042420000000039 -:10137000000000000000000000000000000000006D -:10138000000000000000002000000000000000003D -:10139000000000000000000000000000000030001D -:1013A00000000000006140068009000000000061AC -:1013B0000004801D0001A363806E102D920240E3A3 -:1013C0008006002D900240618006002D10024061D1 -:1013D0008006002D08020000300000000000000020 -:1013E00000000010000000615007800D00010000A7 -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC +:1013000000000000000000000000000F003C000092 +:10131000000000000000000000000000000020238A +:101320002C2F000000000000000000000000000062 +:10133000FFF6009000000000F960F9600000000076 +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:1013600000000000000000000000000005610A0FFE +:10137000050D00A000000000000000000061000654 +:10138000000D0000000000000000000005005A00F1 +:10139000050000A0000000000000000000000A0896 +:1013A000050000A000610007000D000000000061C2 +:1013B0000007000D000005610A0F050D00A0056182 +:1013C0000A0F050D00A000610006000D00000000DE +:1013D0000000000000000000000000000000050008 +:1013E0000A280000000000000000000000000000CB +:1013F000000000000000000000000000000000A04D +:10140000AAA0000000000000000000000000000092 :1014100000000000000000000000000000000000CC -:1014200000000000000000000000FFFFF0F00000DE -:10143000FFFFCF0F008000000000000032F23EFEF0 -:1014400000000000500C00000000FFFFA0A0AFA0B3 -:101450000C0CCF0C0F000F3C00000000000000003F +:10142000000000000000000000000CFAFCFA0000C0 +:10143000000000007C704C4000000000F0F000FF55 +:101440000000000050FA50FA00000000A0BCAABE44 +:10145000000000000000000000000000000000008C :10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C +:10148000FFAFAAAF00000000000000000000000055 :10149000000000000000000000000000000000004C -:1014A000000000000000000000000000FEFCF0F062 -:1014B0000000FFFF0F0F000000000000000002C24C -:1014C0000ECE00000000000000000000FFFD000044 -:1014D0000F000000C3000000003C000000000000FE +:1014A0000000000000000000000000000C0AFC0A20 +:1014B0000000000000007F734F43000000000000A8 +:1014C00000000000000014BE14BE00000000A0BC1C +:1014D000003C0000000000000000000000000000D0 :1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC :1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB -:101520000000000000000000000000000000F54086 -:10153000F5550000000C000DAFABAF83FF350F3544 -:101540003024001404AE04AEFC000C00AA00AA0073 -:10155000C300F330000000000A0A3C3C0000000019 +:1015200000000000000000000000000000000000BB +:10153000000000000000000000000000DF1FDC1CB5 +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B :10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B -:1015B000554055550000000C00FCAFBFAF83F0351F -:1015C00000350000000004040404F0000000BF0027 -:1015D000AF0000003030000000000A0A00000000E8 +:1015B0000000000000000000000000000000D31345 +:1015C000D01000000000000000000000000000003B +:1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB -:1015F000000000000000000000002000000020802B -:101600000000000400044000000000001000000082 -:1016100000000000000000000000000000020000C8 -:10162000000000001100000000000000040800009D -:101630000000000000000003000010001000100077 -:10164000000000000005100000050000000300007D -:10165000000001001000000000000000000500056F -:101660000000001100002000000000000080C08485 -:10167000000000000004A084000000000000004002 -:10168000000400000009000100000000000000004C -:10169000000000000000000000000000200000002A -:1016A0000000000000000400000000000000000234 -:1016B00000020000000410020000000200020040CE -:1016C0000002000000840000009000000000000004 -:1016D0000002000240908000000200020000004072 -:1016E00000040000000221820082100200020004B7 -:1016F0000010000000C0000000100000000000000A -:1017000000000000010010000000000000000010B8 -:1017100008080000000000000000000000000000B9 -:1017200000000000000000000000030002000000B4 -:101730001000000000000003008000000000000016 -:1017400000000080008300000000048004000040CE -:101750000000000000000102000000000200020082 -:10176000020002000200000002000000000302006C -:10177000001102000200000002000000000800103A -:1017800000100008100040C0808200000008000027 -:10179000000000000000000000000208000200003D -:1017A0000008000400820084000400080810000003 -:1017B000008200040000000000000020000008007B -:1017C0000200008202020008000000004120000028 -:1017D0000000000000840000400100000000410003 -:1017E00000000000000000880000000404880000E1 -:1017F00080000000800000000010000000000009D0 -:101800000000002100100803000000000009000093 -:10181000000000080021000000210010000000006E -:101820000000C000000808000005A0000000000043 -:101830000000010000000021000320000000000063 -:101840001000000000008205000900001041200087 -:101850000000000000050000000000210009000059 -:1018600002400040008000080000000984200000C1 -:101870002000088020034005400002000200840090 -:1018800000000084000800000000000000000008C4 -:101890000000000004000000000000000004000040 -:1018A000008200100000000000080000000000009E -:1018B000080020000200208200000000000000025A -:1018C00000000084110202840090000802A00008B9 -:1018D000400200A000A00000114003040500000029 -:1018E00000884104000041102100000000001100A8 -:1018F000020080008004098804001104918800001F -:101900004000000000000000000000000000000097 -:1019100000000000000000000008000000000000BF -:1019200000000000000000000000010001000100B4 -:10193000010001000009010508110000000000007D -:101940000000000000000000000000419040000086 -:1019500000400840000000000000000000000040BF -:101960000000000000040800080208000000000950 -:101970000000000000000140000000100000000412 -:10198000408284000000000000A000000008000069 -:10199000000800000000000000000000000000003F -:1019A00000000000000000000800000020402000AF -:1019B00010001000100000002000000000000000D7 -:1019C000002000000000024000000200200011087A -:1019D00002A0400800080000000002000200000011 -:1019E00000010000000000000000050000000000F1 -:1019F00011000000000000000800000000010000CD -:101A0000000008030000000000004000000000206B -:101A1000000000000000004100400000000800003D -:101A200000000000400000000000C00000000000B6 -:101A300000000003000200882004000000000000F5 -:101A400000009021040000000020000004000000BD -:101A500000200420010800001011000040000400D4 -:101A6000820084000000118000400040000000005F -:101A700000000000840000000000000000000100E1 -:101A800088004004402104000000000040000000E5 -:101A90000000000000000000000000000000000046 -:101AA0000000000000040000000000000000000032 -:101AB0000000000000000000001180010088050007 -:101AC000020202020090A00200000903098890A00F -:101AD00004900003850540A0050020000088000058 -:101AE00000000088050800000202400000042100F8 -:101AF00000844000000000200500000000024004B7 -:101B00002004000440000490009000000003000046 -:101B10000021000300080000010000080000000090 -:101B200000000000000000000000000000000800AD -:101B30000000400000000000000000000009000458 -:101B400020040021000900200000000040000005E2 -:101B500000000000000800110108019100000000D1 -:101B60000000000000000000402182000000000092 -:101B70000000000000000000000000020000000063 -:101B800000000000000000808405010800840000BF -:101B900000A0000000000000000010000000000095 -:101BA0000000000000000000000000000000001025 -:101BB00000000000000000000000004000000000E5 -:101BC000000191834100000000002100000080001E -:101BD000020000000082000100884008402004400C -:101BE0000200110008000040020002000040050051 +:1015F000000000000000200000002000200020006B +:1016000000002000100088059000900000000000FD +:101610002080000400002000000020008400200042 +:101620000000200000000400000040034000018092 +:101630002084018001040003200000002000200419 +:1016400020000000200000002004000020042004EE +:101650000000208500000000208000802080208085 +:1016600020080000200000002000000020042004CA +:10167000000200004080A000000000000000000008 +:101680000000000000900084200000900000000096 +:101690000000000400010000408200000000000083 +:1016A00000040000000000000000009000020000A4 +:1016B000040400212020040100000000000010406C +:1016C000000840000000404000000003000200034A +:1016D0000003000000400002000000200020002065 +:1016E000002000000000000000000000009000004A +:1016F0000000000010000008000000800000010051 +:101700000080000402800004008008000000000047 +:1017100000040000010000000900014000400040FA +:101720000503000000000000040502000000004066 +:101730000000200000000000000000000040004009 +:101740000040004002000040004000800000000017 +:101750000000080008000205010000100000000061 +:101760000000000000000000000002000000000077 +:101770000000001040000000000004000004000011 +:1017800040000004000304040003000411000400EE +:1017900020000001000008000000C000020100015C +:1017A0000005020000080000000002080000000020 +:1017B000000100088000000000000000000000019F +:1017C000000100090501800400010001000411006E +:1017D0000000008480048400000020000409000050 +:1017E00000000090008400000000000004000000E1 +:1017F0000000000800008082008404000204000051 +:10180000008000041005000000000000001100210D +:101810000000000000400200000000000004000280 +:101820000000002100000040000000210003000330 +:10183000000004084000000000000011004000000B +:101840001021000000000000000000050000004022 +:101850008421202100000000000000080204000094 +:101860000008002000080000000000400000000008 +:10187000000000000000000800000400000000005C +:101880000090000400090000008400000000050032 +:101890000000000000000000000000000000410106 +:1018A0000000000000000000050003000000000030 +:1018B0000000000000000300030005000400000514 +:1018C0000000000000A00000008800000000118857 +:1018D0000021000280000000000000820000800063 +:1018E00000000000000004000000000000000000F4 +:1018F00000000000000000000000000000A0000048 +:1019000000088421000000090004000000002000FD +:101910000000010001000100000004008400040038 +:1019200004000200A04000400800844000408240C3 +:101930000840088008400840008000400080008087 +:1019400083400000820010000011000000400000F1 +:1019500000020011000200404100000000000000F1 +:101960000000000000000000000000000000000077 +:10197000000000000000000500000000000008005A +:101980000000000010000000030000C00000400044 +:101990000000008404000400040000008000000037 +:1019A0008000800080000001400100000001000173 +:1019B00000010001214000010001004000890040B9 +:1019C000004040A1000000000000000000000011E5 +:1019D00011A00001030003010001104000000008F5 +:1019E00021000000000000000000000000000000D6 +:1019F00000000000000000000000000000004000A7 +:101A00000000000000000000400020000004C004AE +:101A1000A00000200008C003020000000020000019 +:101A20000400000000040009004002080240000019 +:101A300000000003000810001020200320000040D8 +:101A400000040000000400008200100020002000BC +:101A50000040000000000000000000000000000046 +:101A60000000000001000000000000000000002154 +:101A70000000000000000000000000000000000066 +:101A8000000000000000000000000902800000A02B +:101A90001101000000000000000020020000000111 +:101AA000000080000000000100000000808880002D +:101AB0000000000000000001800080008000800025 +:101AC0000389058900000005000000908320830041 +:101AD0008000000140204020009000900384000816 +:101AE00000000000000020000002000000000000D4 +:101AF00000000000000000000000000000000000E6 +:101B0000000000000000000000000000088000113C +:101B100001000005008020040108002100002000D1 +:101B2000C1080000040000A1001000210200000014 +:101B300000038204000400088200A02182009011AA +:101B4000A000000000400040000000001000000065 +:101B50000000000000000040004000008220402102 +:101B60000000000000000021000000000000000450 +:101B7000000800000000000000000000000000005D +:101B80000000000000000021000000000020000410 +:101B90000020200000084104000040000000000078 +:101BA00080000400000080000004000000008000AD +:101BB000000000000009000105010900000000000C +:101BC000204000000000000100010008000080002B +:101BD000000000000008000000A10001000000005B +:101BE00000000000000021000000000000000000D4 :101BF00000000000000000000000000000000000E5 -:101C00001000000000000000000200004000000082 -:101C100000000000000000010101000100000000C0 -:101C200000000000000000000000000000000000B4 -:101C3000000000000000C10108000001880189A027 -:101C4000A084008890200000000000000000000038 -:101C500000000191840000110000A0A000009090FD -:101C600000000000000000000141C120008300834B -:101C70000200000000000200000000000000000060 -:101C800000C000080104000800000100100000006E -:101C900000000000000000000041082100040010C6 -:101CA0000000000000000000000000000000000034 -:101CB000000000000000000091418021002180030D -:101CC000898000000000800000000000000000008B -:101CD000000000411191800300110000830000000A -:101CE0000000000000000000000011410221000877 -:101CF00000A0800000000000800000000000000044 -:101D00000000008000000200008000001000800041 -:101D100000000000000000000000090004001100A5 -:101D2000041100000000000000000000000000009E -:101D3000000000000000000000009180820091007F -:101D40008904898020219191C18300000000000056 -:101D5000800000000000008080118080200008804A -:101D60008200C1A000000000000000000080000010 -:101D7000000000080000000000000000000000005B -:101D80000000000000080000804080009000080073 -:101D900008008010000000000000000000040000A7 -:101DA0000000010000000000000000000000000032 -:101DB0000000000000000000000000009088080003 -:101DC000A0009100884001008985919102000200E5 -:101DD000000090000000000000908400089001A026 -:101DE000A0901100C182000000000000000082C02D -:101DF00010002000040000000000000000000000AF -:101E0000000000000000000088000800C0000988F1 -:101E100001000000C0000000000000000000000001 -:101E200000000000000100000000000000000000B1 -:101E300000000000000000000000000000000002A0 -:101E4000011001100008040000090090C0C100004A -:101E50000000000000000000010000409110080890 -:101E600001004000909103C000000000000000004D -:101E7000900041008801000000A00008000400005C -:101E80000000000000000000000040000000100002 -:101E900000000000A00000000000000000000000A2 -:101EA00000041111410000200000000000000000AB -:101EB0000000000000000000000000000000000022 -:101EC0000000118009800080800900A000808091BE -:101ED0000000000000000000000011412191851168 -:101EE000C1C11105801180A1C003000000000000E5 -:101EF0000000000491208302000800000000008020 +:101C000000000000000800000000000000000100CB +:101C1000000005000001000000009100000000002D +:101C20000000000000000803A1204091900300C0C4 +:101C300000000008000001C100000000000001C118 +:101C400000001101000000C001009000000200002F +:101C500001C100001101000000C0000003000000ED +:101C6000000100010100000100000400000000006C +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000100000001000052 +:101C900011201010824100200000110008000000F7 +:101CA000000000000200000082A082208410800258 +:101CB000008000000080000009C12103090300002A +:101CC00011C10000C00900000080200085000080D4 +:101CD000000011C10000C0090000008020000800C1 +:101CE00000000041002102080010000080000900EF +:101CF00000000000000000000000000000000000E4 +:101D00000000000000000000000000410008000882 +:101D10000008020921001009211000090000000438 +:101D20000000000000000009000090000200904048 +:101D30008305000080000000800009808000098089 +:101D4000C100028002218900C18080080083000256 +:101D500080800000028002218900C1808900080380 +:101D60000800A1000010000000208002000080098F +:101D7000008880000000000000000000000000005B +:101D80000000000000000000000000000000000053 +:101D90000000000000200100010001000000000020 +:101DA0000001000000000088000000848820889066 +:101DB00004000902000010000000C00000088800B4 +:101DC0000190C100008800008400C1880200000466 +:101DD0000000C0040000008800008400C1880200E8 +:101DE00000000000C100200804000000C001A000A5 +:101DF0001000C082C00000000020000000080000A9 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000001100000000000000B1 +:101E2000100000000101000000000400000010C1CB +:101E30001120C091021000000008000000C08800BE +:101E40000001008401C140000190880001C1000030 +:101E50008802400001C0000040000190880001C1DC +:101E600004010003000001C0000088000000000021 +:101E70000000000000000000010000004000000021 +:101E80000000000000000000000000000000000052 +:101E900000000100000000000020080505410211BB +:101EA000000800110041101102000000800009002C +:101EB0001108912020219084000000800000008003 +:101EC00080090009418011C180020389C10009C154 +:101ED000054000A000401090000080020389C1006E +:101EE00009C180020090000308C00000100010002B +:101EF0001000000000000000100010000000800032 :101F000000000000000000000000000000000000D1 -:101F1000C0000041002080100020000000000000F0 -:101F20000000410402000200020000000000000066 -:101F300000000000000000000000000000000000A1 -:101F40000000418011802180000989899121C10010 -:101F500011110000000900000000000080110009BC -:101F600000008000081183400200101000000000F3 -:101F70000000000021000888038004000000000029 -:101F800000000000000000000000000000100080C1 -:101F900000000000200041000200200000000000BE -:101FA000000000000100000000000100000000002F -:101FB0000000000000000000000000000000000021 -:101FC0000000000001C0019001880000C0890901E3 -:101FD00090000101000000000000000000009001DE -:101FE000000010100800A183210191900000000062 -:101FF00000000000000001000011011000000000BE +:101F100000000000030010002000109111000500D7 +:101F2000110800100000000000000004000800007C +:101F3000000020821088108020088000000000002F +:101F40000000C109050000004009C1022109030089 +:101F5000000080000004000000000000C102210910 +:101F60000300000080000040000000030820210062 +:101F700004004000800400808080000000080040D1 +:101F80000000000000000000000000000000000051 +:101F900000000000000000000000000000A00000A1 +:101FA0000000000000000000000000000000000130 +:101FB0000000000000A00120011000010800000046 +:101FC00000000000C100000000000001C10000018D +:101FD00001000000C0000001000000000000C1007E +:101FE000000101000000C00000010000000100012C +:101FF00000A001000100C0010208408410000000A0 :1020000000000000000000000000000000000000D0 -:102010000020009000000000002001880000000067 -:10202000000000000000600000E000000000000070 -:1020300000000000000000000000000000000000A0 -:10204000000000000000600600E00700420041823E -:1020500000E00700001200820000070000000000FE -:1020600000060000070000000082000007000000DA -:102070000000000000000000600000E000006000C0 -:102080000000000000000000000000000000000050 -:10209000600000E000000000000000000000000000 +:1020100000000000000000000000000000000000C0 +:1020200000E000000000000000E00000000081006F +:1020300000E007000000000000E0070000000000D2 +:10204000000000000000500000E000000000500010 +:1020500000E000000000000000E0070000000000B9 +:10206000500000E000000000000000E00000000060 +:10207000000000E000000000500000E00000000050 +:102080000000000007000000000000000000000049 +:102090000000000000000000000000000000000040 :1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C00000000000000000000000000000000020F0 -:1020D000AF0050005A5AA05F00000000000000004E -:1020E00000000C0CF3F3F0F00FF000FF0FF000FF16 -:1020F00000FF0000000000000000000000000000E1 -:10210000000000000000003C003C00000000000057 +:1020B000000000000000000000000000AC0FACFFBA +:1020C0000000FFFF0000F0F00000AAAA000000FFDF +:1020D0000000FFFF0000F0F00000FFFF0000F0F044 +:1020E00000000000FFFF0000F0F00000FFFF000014 +:1020F000F0F00000000000000000A0BCAABE00003C +:1021000000000000000000000000000000000000CF :1021100000000000000000000000000000000000BF :1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:102150000000FF0000005A5000F5000000000000E1 -:10216000000000000C0CF3F3F0F00FF000FF0FF094 -:1021700000FFFF0000000000000000000000000061 -:10218000000000000000000050505050000000000F +:102130000000000000000000000000000000AC00F3 +:10214000ACF00000FFFF0000F0F00000AAAA0000C1 +:1021500000FF000000000000F0F0000000000000A0 +:10216000F0F00000000000000000F0F000000000AF +:102170000000F0F00000000000000000A0BC003CE7 +:10218000000000000000000000000000000000004F :10219000000000000000000000000000000000003F :1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F -:1021D0000F0F040000000400C3FF3C0000000000DB -:1021E000CFCF30300000BE41BE41FF00FF0096550A -:1021F000965500FFFF0000000000000000000C0CDE -:1022000000FFAF05AF050000000000000000000067 -:10221000000000000000550F0F3CFF005555000066 -:10222000000028287D7D0000000000000000000064 -:10223000000000000000000000000000000000009E -:10224000000000000000000000000000000000008E -:1022500000000F0F000004000400C3FF3C0000005A -:102260000000CFCF30300000BE41BE4100FFFF0074 -:10227000965596550FF0FF0000000000000000008A -:102280000C0C0000BEBE1414000000000000000092 -:102290000000000000000000550F0F3C55550F0FC7 -:1022A000000000002828282800000000000000008E -:1022B000006100028001000000000000000000003A -:1022C000000000000000000000000000000000000E -:1022D00000010020801D00001060002C80410000E3 -:1022E00000000038000010C000000361033E0C0D28 -:1022F00010C00361033E0C0D42C00000000000004E -:10230000000000614002800D00010000000000009C -:102310000000000000000000000000615007800D78 -:10232000000500610006000D00050000000000002F -:1023300000000300FFFF3C3C3F3F000000000000A6 -:10234000000000000000000000000000000000008D -:102350000000AA55F0F000000000FB04FF00303040 -:10236000C0C00000000000000000000000000000ED -:1023700000000000F700FF00000000300000000037 -:102380000000000003030303003C003C00000000C9 +:1021B0000000000000000000000000003FF530F5C6 +:1021C000000000000F0F00000F0F0000FFFF0000D5 +:1021D0000F0F0000FFFF0000FF0000003C3C00006C +:1021E0003C3C00000000FFFF0000FF000000FFFF7C +:1021F0000000C3C3FFFF000000000C0C141400001B +:1022000000005F0F3F0F0000000000000000000012 +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:1022300000000000000000000000000000003F055A +:1022400030050000BF1F0F0F00000F0F000000003F +:1022500000000F0F000000000000FF0000003C3CE9 +:1022600000003C3C0000000000000000FF000000F7 +:1022700000000000C3C3FFFF000000000C0C14149A +:102280000000000055003C000000000000000000BD +:10229000000000000000000000000000000000003E +:1022A000000000000000000000610007000D0000B9 +:1022B00000610007000D000005610A0F850D00A0F8 +:1022C00005610A0F051D00A0400280000020920257 +:1022D0004082800180209202408280018020920210 +:1022E00045E38A0F052D92A20000408280018020E4 +:1022F000920240E38007002D820200610007000D7A +:102300000005A0610007800D000505000A08050012 +:1023100000A000000000000000000000000000001D +:10232000000000610006000D0000FF4DFF7D30F34E +:10233000A0F5000000003E2A160200000000000088 +:102340000000F000AAC37F43FFC3000000000000AC +:1023500000001414550030303C3C55000F00303064 +:102360002828000000007C704C40000055000F0041 +:1023700030302828000000003CFFFDFDFFAA2D2D75 +:10238000000000000000000000000000000000004D :10239000000000000000000000000000000000003D -:1023A00000000000FBFFFFFF000000200000000015 -:1023B00000000000030055000000030300000000BF -:1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD -:1023E0003030C0C00000000000000000000000000D -:1023F000000001000000FF00FF00000000000000DE -:102400000000000000003C7D004100000F0F0000B4 +:1023A000000000000000000000000000B2008200F9 +:1023B00030F3F0F0000000007F6B57430000000096 +:1023C00000000000F0FFAAC37D41FDC10000000035 +:1023D00000000000141455003030000055000F00BC +:1023E00030302828000000007F734F430000550064 +:1023F0000F0030302828000000003C00080855007D +:102400002D2D000000000000000000000000000072 :1024100000000000000000000000000000000000BC -:10242000000000000000FFFFFFFF000000000000B0 -:102430000000000000003C3C000030303F30000055 -:10244000000000000000000000000000000000008C -:1024500000000000000038043838FFDF00200000D2 -:102460000000D0D020D000000000000000000000DC -:1024700010000000000000000000000008000082C2 -:102480000000000000000000FF0F5C5C0000000086 +:1024200000000000000000000000000000000F0F8E +:102430002D2DAA3E003E000000000000000000001C +:102440000000000000000A03FA03B5B015100000F8 +:10245000000000000000FF000F0F2828003C0F0FB5 +:102460005555303000F00000000000000000000072 +:102470000F0F5555303000F000000000F5F3050354 +:1024800017170F000000000000000000000000000F :10249000000000000000000000000000000000003C -:1024A00000000000000000000000000000300030CC -:1024B00000000000000000000A0A00FF30303F303A -:1024C000000000000000000000000000000000000C -:1024D00000000000000000003C000404FFFF0000BA -:1024E00000000000202000F00000000000000000BC -:1024F00000000000000000000000000000008A0052 -:1025000000820000000000000000F0005C5C0000A1 +:1024A00000000000000000005D5D5D0C0000000009 +:1024B0001E0F3C2DFF3E553E0000000000000000B6 +:1024C00000000000000000000AF3FAF3BFBA1F1A70 +:1024D0000000000000000000000000002828003C70 +:1024E00000000000303000F000000000000000009C +:1024F000000000000000303000F000000000F5F3A4 +:10250000050314140F00000000000000000000008C :1025100000000000000000000000000000000000BB -:10252000000000000000000000000000000000307B -:1025300000302009000000000080000200020000BE -:1025400088002000000000000000000000000004DF -:102550002004000000000000000400000000000053 -:10256000C00020000000008500A000000000000066 -:102570002000000341002000008001000808000046 -:1025800040080400200000000004010200000000D8 -:10259000C00020002000200000000000000000001B -:1025A00000009000200000000000A080400000110A -:1025B00020112004000800000000000200000000BC -:1025C0000000000000000000000400000000000007 -:1025D00000000000000000000000000000000000FB -:1025E00000020902000000000004000500000000D5 -:1025F0000000000000002000804000042000800057 -:1026000000008000200000000000004004040000E2 -:102610000000000000000002000000000004400074 -:1026200000042000000240401008000421100000B7 -:1026300000844090218400000000000000000000A1 -:102640000000000000000000000500040000000081 -:10265000000000000000000000000000000000007A -:1026600000000008100088000000000000000000CA -:102670000000000000000000200020000004000412 -:102680000900A10000000000000000000000008020 -:1026900021000200114020000000000000000000A6 -:1026A0000200000082000008A000100002000800E4 -:1026B0000020840082000000000800000088000064 -:1026C00000000000000800000084001000820010DC -:1026D00000080000000000000004000000000000EE -:1026E000001000080010008400000000000000102E -:1026F000000800000000000000008082800800093F -:1027000000839000408441A00008000000A0000861 -:1027100000209084000082A080A00008000800C073 -:1027200004000084000002840010000080840090F7 -:102730008000000000900008000040000000000041 -:102740000005002100050021000500210002000510 -:102750000008000300000003000000080003000858 -:102760000000000000000000000800000000004120 -:102770000008000000000200C00300000008210063 -:10278000202090002000400002C02000020090089D -:10279000C0210480210040080100400000004000EA -:1027A0004008000004088400000088000000900039 -:1027B0000000908000094000200490080000000004 -:1027C0000000000000000000000000000000000009 -:1027D00000A0000000000000000000000000000059 -:1027E00000000000000000000000050000A0000044 -:1027F00000000008008400008084000000000084C5 -:10280000088400C0030200088084000300000088E0 -:10281000110003A0802008000000108400000010B8 -:10282000000021002100000000000000080000005E -:1028300040000920400240082088110041000000AB -:102840000011010400050008000800080010000045 -:102850000000000000050000000000001000080259 -:1028600000008402000000000000000000004000A2 -:1028700000009000040000000000000000000000C4 -:10288000000300210841044100000000C0040000D2 -:102890009000001100000000000000000004010092 -:1028A0000000000400040009000000000000010016 -:1028B0000000004000410002848084800009000084 -:1028C000000000000800008400A0000011000808BB -:1028D00000A0000000000000000000000000000058 -:1028E00000010000099100000000000000840800C1 -:1028F0000000000000C0800000C0000000080008C8 -:102900000000008800C080000000000800000000F7 -:102910000000008400000000000400000088200186 -:1029200020000000210000000084080000000000DA -:1029300004040088400100000001000200020900B8 -:102940000000000500000000000300210005000851 -:102950000000000000000000000000000000000077 -:1029600000000000000800210008001000008400A2 -:10297000000010000000820000000000C00084037E -:1029800000000000000000830002820000040080BC -:102990008582084000000000000004800000000064 -:1029A0008400000000009000A0000000000010045F -:1029B00020000000020000200000000084058400C8 -:1029C00008008421000000840000000000080000CE -:1029D00000100000000000000000000000000000E7 -:1029E00000000000000000000000000000000000E7 -:1029F000000000000000000000900008000000003F -:102A000005A0000000002000004000C011000000F0 -:102A100000024040200021000000000480200090BF -:102A2000000400084040000000000000000000001A -:102A300000000088000000882008090000204004F1 -:102A4000000408884002002101050004000500215F -:102A50000008000800080000002100000008000035 -:102A60000000000300210000000000000000001131 -:102A7000000040000000000040004008400000004E -:102A800000000000C0000000000300000021000062 -:102A90008808002100080811000088084000000094 -:102AA00091092180858003C000000000000800809B -:102AB0000000008009000004000000000000000089 -:102AC000000085A18402840000C00882000000008C -:102AD00000000800000000000000000000000000EE -:102AE000000000000800000000000000099000A0A5 -:102AF00000000000000000000900000800000008BD -:102B000000000000050000000000000000000000C0 -:102B10000000400000000002000000004000000033 -:102B2000000010009004100410040000050005824D -:102B30000020410000200402001000000000218459 -:102B400000000000400208010000081000C0024020 -:102B50001010000000000000000000000000000055 -:102B60000000000000000000000000010000000064 -:102B70000000000000000000000000000000000055 -:102B8000000000C000040090A0040000881010881D -:102B90000082088801000000000000002000000002 -:102BA000000090000101A10082010001000000006E -:102BB00000000000002000900090100000000000C5 -:102BC000000000000001000000000001820002007F -:102BD0008080008000000000000000000000000075 -:102BE00000000000000000000000000009100021AB -:102BF0000002000200000000000000004000000091 -:102C000005000000008000800000008000000080BF -:102C10000000408080002100000000000000000053 -:102C20000000000080001141092180020002000024 -:102C30000000000000000000008000008000000094 -:102C40000300000000000008200000000021000038 -:102C5000000900808000000000000000000000006B -:102C60000000000000000000000000000000110053 -:102C700008001000400000000000000000000000FC -:102C80000000004000000000000000808000000004 -:102C90008003000900880000008021000300410932 -:102CA00080000008808000804100200011C04109A0 -:102CB0008000000000008000000000000000800094 -:102CC00000008000800080002000030020002080A1 -:102CD00090000204C008080200000000000000008C -:102CE00000000000000000000000000000000000E4 -:102CF00000000100000001000000000000000000D2 -:102D00000000000000000002820088000004C000F3 -:102D10000000080010048808108400C001000000B2 -:102D20000101A000A001A084409000A000000103C8 -:102D3000010104000000080090000000900008005D -:102D40009000020008001000C000002001000000F8 -:102D500000A08990002184888908000000000000FC -:102D60000000000000000000000000000000000063 -:102D70000000000000000100000000000000000052 -:102D800000000000000000000000000800080082B1 -:102D900090C00001C10810208488101000000000BD -:102DA000000000000082009082A0000400010000EA -:102DB0002101010100000000000000001040000897 -:102DC000909082020000000000010001000000015C -:102DD000000100004110008900084085000000004B -:102DE00000000000000000000000000000000000E3 -:102DF0000000000000001000400000000000000083 -:102E000000000000000000000000110000000000B1 -:102E100000000080000141808080000005800000EB -:102E200000000000000000000000000000800040E2 -:102E30002020090511410000000000000000008072 -:102E4000000080008080001100210010004100007F -:102E5000000800080000000200848000000000005C -:102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000002000050 -:102E800000000000000000000000000000008000C2 -:102E9000000000000000000180100002000000009F -:102EA000410083004000021000000080000080000C -:102EB000C1A01105C1000340000000000080000017 -:102EC00000000008000000000002000000000000F8 -:102ED0002100200020000808200088118410020032 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000004000000000000CE -:102F000000000000000000000000000000000000C1 -:102F1000C00088A0882040000001100004100204B6 -:102F2000040001A00200010001018200004010A085 -:102F30000800C18841000400090000000090001052 -:102F40000000000000900020000000000090000041 -:102F500000000188000000000101000000000700DF -:102F60004800000000000000000000000000000019 -:102F70000000000000000000000000000000000051 -:102F800000000000000000000000604100E00700B9 -:102F9000000000000000000000000000600000E0F1 -:102FA00007004800880000E0000050000006000014 -:102FB00007000000842100E0070000000006000078 -:102FC00007000000000600000700000000000000ED -:102FD00000000000000000000000000000000000F1 +:10252000000000000000000000000C0C5D0C00002A +:10253000000020002041000000000000000000001A +:102540000004208000800000000020004000000403 +:1025500000002000200082000000A0000000820493 +:102560000804200000000000C0002000200000003F +:1025700000000003200020002000000500000000F3 +:1025800000044004210001004100208420112000AB +:102590004004200400002000200040004100010011 +:1025A000408420822100040000000100200000007F +:1025B00020000000000000000000100000000000EB +:1025C0000002000000201020000210400000000067 +:1025D000000000004000000010000000400000006B +:1025E0000002800000000000000000000090008257 +:1025F000000000000000000000000000000000A03B +:1026000000000000009004020400040200204000CA +:102610008002000180012000000000000002200074 +:1026200020000004000404008000000004020000F8 +:102630000000000000000000000000000200010097 +:102640000000100000080000000040000100000031 +:102650000008000000000000000000000000000072 +:1026600000000000080000000000000000008400DE +:10267000000000000000000000000000000000005A +:102680000000000000000010000800000200080028 +:102690000000000401200900000000000205000005 +:1026A000020000000880088000800020000588C12A +:1026B000020000000800080000000400000080087C +:1026C0004000000080000084000000008000400006 +:1026D00005000000000000000000000000000308EA +:1026E0000000000000000084000400000000001052 +:1026F0000000008200000010000000000000000048 +:102700000008400000020408000800C00000008427 +:102710008208000000000401040400000508000213 +:1027200000840000090002040002042004010000EB +:10273000002000080000400040000200040090005B +:102740000000000000000000000000080000040974 +:1027500000000000000900000020000300820100CA +:1027600000020202000000000008004100210000F9 +:1027700088418821400088000008000002000020F5 +:1027800088000000082100009000000090008800F0 +:1027900088008420000500000000000200080000FE +:1027A0000003000000050002000800020003000012 +:1027B0000020000800000020000000000000009041 +:1027C000000004840004008400040000418205A08D +:1027D0000300000005200020000000A041A000022E +:1027E0002000000300A00000000000C00000030063 +:1027F0000000000000000000008400000000000055 +:1028000020000000008808000000200000000000F8 +:102810000000000000040084050200A00005000084 +:102820000000000000840000000000000000000024 +:102830000000000103000000000000000000000094 +:1028400082008800040090000000881000008520AD +:1028500084200420C1208200000000008800208025 +:10286000828000800021044100802080004100001F +:102870000041004100410000840000000000000011 +:10288000A0110041C0100020000000000000000066 +:102890000000008000000000212104000000000072 +:1028A0000000C0000000040582000000000000805D +:1028B000A0008200C02008000000100000000000FE +:1028C0000000000020000900008400A00089000032 +:1028D00010010001000120090000000000000000BC +:1028E000C10403040004000080C000200020020096 +:1028F000020000C000C00000000000000000000056 +:10290000000000C0000820004000000000004190CE +:1029100000A000A0004000000000840088004000EB +:102920000000000000000000000020040000000083 +:102930000504000000000001000000840008000001 +:102940000008000090040000901010000800000033 +:1029500082040000084000000000000008000000A1 +:102960000008C00082008200000000000020000873 +:10297000002082000000A0000003000000000040D2 +:10298000C000000000000000000002000000000085 +:102990000000000082000000A000000000082000ED +:1029A00020000004000500000000000400000040BA +:1029B0000000040000000000080000000000080003 +:1029C000000008401120400000040000000020002A +:1029D00041000008000000A00088100020A00808A6 +:1029E00003000000000000020000000400000000DE +:1029F0000000000100000000000000000000004096 +:102A0000028800000000042000000000000040A038 +:102A100000000002000209000000119011000000F7 +:102A20008000800000000000000000004000000066 +:102A30000000000000000000000000000000000096 +:102A40000000000000A0000300000021400540003D +:102A5000820000000021002100210000000000028F +:102A6000400200020000000082000000010000A1FE +:102A7000000820050100000000000008000082009E +:102A800000000000008000000000000000080000BE +:102A9000000000000800000000000000820040006C +:102AA0000000000000000100C02100000003000041 +:102AB00020040000000000080003000000000000E7 +:102AC0008200C0000000000000040000418820C017 +:102AD0004100009000820000000010000000000093 +:102AE00000000000000200000000000000002000C4 +:102AF00005200000200004000008008821040908C7 +:102B000009000000030000040000000000000000B5 +:102B100000000000000008C0080000820000000063 +:102B20002000004000000000040000000000000041 +:102B30000000000100000000000020000000000074 +:102B400000000000000000000000008290100082E1 +:102B500000880101000000000000000001000200E8 +:102B60000000000000000000000000000000210044 +:102B700000000202000200822002000000000000AB +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000001000100210000010000000001 +:102BB0000000000000004000820000000000000053 +:102BC0000000000000000000000000000000000005 +:102BD00000800000114100210008000500000200F3 +:102BE0008000000000000000000000000000020063 +:102BF00008000000918000800000008000000000BC +:102C000000000000000000000900000000000000BB +:102C100000000000000000000000000000000000B4 +:102C200000000000000011202110084100080000F1 +:102C3000000000000000000002008800000000000A +:102C40000000000000000000000000000000000084 +:102C5000000800000000000000000000000010005C +:102C60002180110041C00000000000000000008928 +:102C7000000000090010800000218000000000001A +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA00000000000800080002009110085090583D4 +:102CB00000000000000000000009000000200000EB +:102CC0000000000000000000000000000000000004 +:102CD0000000000900C0000000000000000000002B +:102CE00000200108010001C00000000000000000F9 +:102CF0000002000000000001A0001088A0A00888C9 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D20000000840088081000C0082020108840009F +:102D3000A0C0000000000000000000000000000033 +:102D40000000000000880000008400000000000077 +:102D50000000020000000000100000004100890097 +:102D6000000000000000080001000000000000005A +:102D700000000000100000000000409000A00802C9 +:102D8000418400000000000000000000000000007E +:102D90000000000000000000000000000000000033 +:102DA00000000000000000002000000000010201FF +:102DB00008010001000000000000000000001001F8 +:102DC00000010001010000001000000000000000F0 +:102DD0000000000000000000000000000000910062 +:102DE00082000000092000058003080300000000A5 +:102DF0000000000000400009001110400200000027 +:102E00008080098000000000000000000000000039 +:102E100000001000000000000000000000000000A2 +:102E20000000000000001000000000000000092168 +:102E30001105C12102210000000000000000000572 +:102E40000011001010104000000000000000000001 +:102E500000000000000000000000800000000002F0 +:102E600000000000000040050820030010020000E0 +:102E70000000000000004008051141000300800030 +:102E80008040809100000000000000000000000071 +:102E90000000000000000000000000000000000032 +:102EA000000000000000000000040002008000009C +:102EB00002111088088005080000000000000000D2 +:102EC00000040000000000000005000300000000F6 +:102ED0000000000000000000100020000200880038 +:102EE00000010000000000000008000000000100D8 +:102EF00000000000000000000001000100000100CF +:102F00001000041102859000000000000000000085 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000890040D8 +:102F30000082018301100040000100000000000039 +:102F40000000000100000000000000000000000080 +:102F50000000000000000000000000000000000071 +:102F60000000810000E000000000810000E0070098 +:102F7000000A0000000000000000000000E0000067 +:102F8000000000000000070000000000000000003A +:102F90000000600000E000000000000000000000F1 +:102FA0000000000000000000000000000000000021 +:102FB00007000000600600E007000021000000009C +:102FC00000000000810000E000000000008100001F +:102FD00007000000000000000000000081BD0C0C94 :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:10301000000000002841043E30C0CF0F0000000037 -:1030200000000000000000FF00FF000000008181A0 -:103030009F9FDBDBFFFF60002020000000000000FE -:1030400000000000000000000000FFFC0F0C00006A -:103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 +:103000000000000090C090CFB4FFB4990000000011 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:10305000000000000000000000000000000081BD32 +:10306000CFCF0000000000000000000000000000C2 :103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000002841043E0C030300000073 -:1030A000000000000000000000FF00FF0000000022 -:1030B00081819999C000C0006000202000000000BC -:1030C000000000000000000000000000F0FC000C08 +:103080000000000000009FC09FCFB466B4000000A5 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 -:1030E0000210200000881084000000000000000092 +:1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF :1031100000000000000000000000000000000000AF -:103120000000021020000088108400000000000051 +:10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F :10314000000000000000000000000000000000007F :10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F +:10316000000018FC18C00000000000000000000073 :10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:103190000000000000000000000010B9884430303A -:1031A0004444000000000000000000000000000097 -:1031B0000000000000000000FFFFFFFF0000000013 -:1031C000000000000000000000FF00FF09996FFFF1 -:1031D00006FF9FFF00000000096F24BD00000000F3 -:1031E00000000000000000000000000000000000DF +:1031800000000000000000000000C3FF2727B62653 +:10319000B02000000000000000000000000000005F +:1031A000000000000000000000000000000000001F +:1031B0000000000000000000E7E7666F000000006C +:1031C000033FE7E7000000000000000000000000EF +:1031D00000000000000000000000000000000000EF +:1031E00000000000DBFCDBC000000000000000006D :1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000010B9884419 -:1032200074748888000000000000000000000000A6 -:103230000000000000000000000040D000900000EE -:10324000000000000000000000004242DBDB0090B4 -:1032500066F606009F0000000000096F24BD000014 -:1032600000000000000000610006000D00010000E9 -:10327000000000000000000000000000000000004E -:1032800000000000000000610006000D00000000CA -:1032900000000000000000610027800D00A0608297 -:1032A000000000008A00000000610007800D00019E -:1032B00080410006C00D000000000020000000005A -:1032C000100000208000000000000020000000002E -:1032D000000000200000000000610006000D000555 -:1032E00000610006000D00000000000000C33CFF6C -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD +:10320000000000000000000000000000003C272734 +:10321000BF2FB929000000000000000000000000DE +:10322000000000000000000000000000000000009E +:1032300000000000000000000000E7E700090000B7 +:103240000000033F242400000000000000000000F4 +:10325000000000000000000000000000000000006E +:1032600000000000000000003000000000000061CD +:103270000002800D000005610A0E850500A0000017 +:1032800000000000000000610007000D00000500C4 +:103290004A08050000A000000000000000000061D6 +:1032A0000007800D2000000000000000000000006A +:1032B000000000000000000005000A08050000A54D +:1032C00005610A2F850D00A000000000000000002D +:1032D00000610007800D000005000A28050000A01D +:1032E00000000000000000000000000000000000DE +:1032F0000000000000000000808AD0DA7D03410356 +:103300000000000000000000A0F541410303D714B5 :1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D -:1033300000000000F0F000000000000000000000AD -:103340000000FC0CF5F53F3FA0AF000000000000BE -:1033500000000000000000000000000000003CF041 -:10336000F0FF0400000000F000F000000000B2B226 -:10337000B2B20000000000000000000000000000E9 -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D +:10333000000000000000000000000000000000008D +:1033400000004555051575757F7F000000000000E1 +:10335000000000000000AAF0FF3C00000000000098 +:10336000000000000000000000000000000000005D +:1033700000000000000000000000858FD5DF7D3FC9 +:10338000413F0000000000000000A0F5EBEB3F3FD4 +:10339000D714000000000000000000000000000042 :1033A000000000000000000000000000000000001D -:1033B000000000003C3C1000000000000000000085 -:1033C00000000000FC0C05053030A0AF000000003C -:1033D00000000000000000000000000000000000ED -:1033E0003CF0F000040000000000000000000000BD -:1033F00000000000000000000000000000000000CD -:10340000000000000000000000000000A2F3AAFF7E -:10341000FF00DF00000000000000000000000000CE +:1033B000000000000000000000000000000000000D +:1033C000000000000400050120752A7F00000000B5 +:1033D0000000000000000000AAF0003C0000000017 +:1033E00000000000000000000000000000000000DD +:1033F00000000000F3035050000000000000000037 +:1034000055550F0F000000000000000000000000F4 +:1034100000000000000000000000000000000000AC :10342000000000000000000000000000000000009C -:1034300000000000000000000000FFAA00F00000F3 -:10344000000000000000AF05BEBE3F3FA0AF00007F +:10343000000000000000000000000000000000008C +:103440000000000000004D4DFFC3C0C040C200009E :10345000000000000000000000000000000000006C -:103460000000000000003C3C0000FFFFFFDF000008 -:10347000000000000000000000000000000000004C -:103480000000000000000000000000000000AAFF93 -:10349000AAFFFFFFDFDF00000000000000000000C7 +:10346000000000000000000000000000000000005C +:10347000000000000000F3035F5F00000000000098 +:1034800000003C3C00FF00000000000000000000C5 +:10349000000000000000000000000000000000002C :1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000FFAA000063 -:1034C0000000000000000000AF0514143030A0AF71 +:1034B000000000000000000000000000000000000C +:1034C00000000000000000004D4D3C0000C340C261 :1034D00000000000000000000000000000000000EC -:1034E00000000000000000003C3C0000FFFFFFFF68 -:1034F0000400000040004000000000000000020046 -:1035000000000000000084000000040040000000F3 -:103510002000021020002000000000000000200019 -:10352000010000008900852000802000212000008B -:103530000003A1000000200020850005C000000459 -:103540002080000000110000880000020000000040 -:103550000000000001000000200800000080400082 -:103560002084042000A0050004840480040004A03A -:10357000050040080000800000000000000000007E -:1035800000000000000000000004000000008000B7 -:10359000000000C0800100000000000000020000E8 -:1035A0000002040000A00802040500200004040139 -:1035B000009000004000000000000010000000002B -:1035C000000010080000000000084008000100048E -:1035D0000000000800000440000000010000000896 -:1035E00000000002C00100098400A00280208000C9 -:1035F0008003C00000400000001000000000000038 -:103600000000000000000000000000410020000059 -:1036100000000000000000000000000000000000AA -:103620000200040004400000000004000420900098 -:103630000420000000000000000000000000040062 -:1036400004000400050820002000200020000000E5 -:10365000000020000200821010800500110002000E -:1036600000000000020004800480048004800580C3 -:1036700004000580048900080000000000400000EC -:1036800000000000000000000040000000040000F6 -:103690000000008800000084000000880000000096 -:1036A0000000001000008001000000008000800188 -:1036B0000000800900000000008400841000000069 -:1036C0008088C10080009001800080888000800098 -:1036D000000000008008000000008040A010A00052 -:1036E0000000000000000000822080208020822056 -:1036F00084208000C020842000050000C005002137 -:103700000000000000000000000000000000002099 -:103710000005000500000800000000000000010096 -:103720000000000000000000002000000000000079 -:103730000000000000000000000000000000000089 -:1037400000050009A00440039005040800080800D3 -:10375000000800084100410090089000030040006C -:1037600000000200000020000000830089000580A6 -:10377000050004000500880090000084000000841B -:1037800000C000A0000000080000000000000000D1 -:103790000000000000840908000000000000410053 -:1037A000080000000082000000000001000003008B -:1037B00011000000000000000000000000000000F8 -:1037C000030000A021A00082008400A000002100CE -:1037D0000808000000004000108200041000820071 -:1037E00000000900000000000000000004040408BC -:1037F000842084008082A0000000000000000000FF -:103800000000000000000000400008000800C000A8 -:103810004000000000000000000000000021001037 -:10382000C041010000000083000000000200000011 -:10383000838008800000C0000000C0000000084134 -:1038400000210000820004210400048504002000FF -:1038500002040840200000000104081100200904AF -:103860000080080800000000000082000000040042 -:103870000040004000040400844004C003800000B5 -:1038800000000000000000C0000000080000000070 -:103890000000000000000000000000000800000020 -:1038A0001101410010000000004021000000809044 -:1038B000000408100020000008C000000084000080 -:1038C000000000000082000080008000A10280A0B3 -:1038D0008000800100008000110040000300030010 -:1038E00008010004034100000000040200401090A1 -:1038F00040001100000000828000000080020408E7 -:103900000000000000000000002100210408000069 -:10391000000000000000000000000000100008008F -:1039200010000080100001000008000000000000EE -:1039300002400000080500000000C0050000000073 -:103940000000000000108200000004000410A00429 -:10395000000000030084200420000100080020086B -:1039600000082010C0C0102010080000080000004F -:103970000000001100110011908584A0048000A0B7 -:10398000048000C000880008111000000000000042 -:103990000000000000000000000000000000000027 -:1039A00000008000000880002000000000000000EF -:1039B0000000800100008300000000001188050263 -:1039C0000002000000C00084000800A08000800009 -:1039D000000000000300004080018800400000005B -:1039E000800100008001400580018001090008007D -:1039F0004000009000000988000000200021802085 -:103A0000002080200041001100080010004100004B -:103A1000000800000000000000000000000000009E -:103A2000000082002088200820000000A080C00341 -:103A30000041010001110008830201410010002132 -:103A40000003002100000400080882050005200092 -:103A500084032004204100002020090800200000E9 -:103A600008001000000088041088040820040000EA -:103A700020000000000040000005820088020000D5 -:103A800000094011018800C0000000900082000081 -:103A9000000000080000000000000000000000001E -:103AA00000000000000080108000C18400000010B1 -:103AB00000000084400002000000080140A0000057 -:103AC000410021000000000041A00000030000A010 -:103AD0000000000000002000040080002000000022 -:103AE000030003008088000003418341A003830397 -:103AF0001000100000001100000220000000000073 -:103B000005000004800440020000000000000000E6 -:103B100000000000000000000000000000000000A5 -:103B2000000000000000000000C10009080888C172 -:103B30000000000082000000019000900408A00234 -:103B4000022000000090022000000001000000019F -:103B50000000009041204020820800010000000089 -:103B60000001891100A1010210849101419085900A -:103B70008220820200900004880200C000900808A1 -:103B8000000000C0019009C000000000000000001B -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000040C1202040C1D3 -:103BB000800800000500000000000900210000004E -:103BC0000000000000000000800000000010000263 -:103BD000000500080800030080008080001108052F -:103BE000002000100841002111C10080914189A1ED -:103BF000910580048080110000800080008000809A -:103C0000008000000580108091000000200002006C -:103C10001100110000000000000000000000000082 -:103C20000000000009000900200010008000A040F2 -:103C30008083410080008003008000008900C02153 -:103C400084804000000000040000800000000000AC -:103C500000000000000011002120080091A11100C7 -:103C60000500200080001100A0C01105A080030005 -:103C7000090311898989C000A0A0910080880000F3 -:103C8000000480808080088021000203908501006C -:103C90000100000000000000000000000000000023 -:103CA0000000000000000000000000000100902063 -:103CB0008901A01011000800080182040404890091 -:103CC0000900A1A0010020009000000008000000F1 -:103CD000000010000000888410002100000090897E -:103CE000000800000000C000A0001082A14008C031 -:103CF00000A001000141C18905C004C1918804C030 -:103D0000000000008484C090111001000000C00574 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 -:103D3000C08800010084A18900000000000000008C -:103D400090090084401100C190020000900808A072 -:103D500000000000010000000000000900210091A7 -:103D600002A0000100002000000108C00010C008EF -:103D700010C0080300044191100589030082C08827 -:103D800009A100000005009000C100A00000009003 -:103D900000C1000000000000000000000000000062 -:103DA0000000000000000000000000000000000013 -:103DB000000000800020008091C100090011000473 -:103DC000000980C00005008400848080000080809D -:103DD0008080000000000800410000000004000393 -:103DE000009084400020000505200011C100110052 -:103DF000C1808000008505850985044141C000918E -:103E00008000904100020010008200C10004000305 -:103E1000009000880000000000000020000000006A -:103E20000000000000000000000000000000004052 -:103E30000000000341C0A1C08080C00580008080D8 -:103E400000808000008480000080800480008080EA -:103E50000000000000000002000000800000C140DF -:103E6000A180088010084180051103800520809101 -:103E7000898010000984C1A0910585098304000090 -:103E80001191118083038002800580800000C111A0 -:103E9000C0020500200800880000000000010000AA -:103EA000000000000000000000000000000000A072 -:103EB000000000000001A1020890088889000800A5 -:103EC0001010820210001004A0200040080102001F -:103ED000A040022040000000000000080010000088 -:103EE000918820089140C1010004000101020000F6 -:103EF0000208040840A04008C185210091098500FE -:103F000004109103C082100090011000900800007E -:103F1000C1052001C0C00101000000000000000038 -:103F20000000000000000000000000000000000091 -:103F30000000000000000000821100E00700000007 -:103F40000000000000000000002100000700000049 -:103F5000000A000007000000000000000000000050 -:103F60000000600600E007000000600000E00000C4 -:103F70000000820000E000000042842100E0070011 -:103F80000000480000E000004842008100000700F7 -:103F90000000504100E007000000000000000000A9 -:103FA0000000000000000000000000000000000011 -:103FB00000000000000000000000FF55CF45000099 -:103FC0000000FFC35F43000000003CFFBEFF300065 -:103FD000F0F03CFFFCFF28FFFFFF000000000000A6 -:103FE000000000003CF03CF03C3C3C3C0000000089 -:103FF000000000000000000004100820003C080839 -:1040000020FF20D000000000220000220000FF5FFF -:104010000000000F0000000F000000C300000000BF -:104020000000000000000000000000000000000090 -:10403000000000000000000000000000FF55FF55D8 -:10404000C3000000FFC3FFC30000000000FFAAFF81 -:104050003000000000FFF0FF2828FFFF00000000F4 -:1040600000000000000000F0FFF0000FF0FF000073 -:104070000000000000000100000001400280003C40 -:10408000000000FF00F0010000001100001100001E -:10409000FFFF0000000F0000000F000000C3000041 -:1040A0000000000000000000000000000000000010 -:1040B00000000000000000000000000000000808F0 -:1040C000C3000000000000000000C2FAFAFA03C3B7 -:1040D000C3C3055505558A8AAAAA00004D4D0000A4 -:1040E00000000000FFFFF5F53F5F30503C3C3C3CDA -:1040F00000000000000000002400810004100140C6 -:104100005C5C5C5C00000000240000240690000061 -:10411000F000000000000000F000000000000000BF -:10412000000000000000000000000000000000008F +:1034E00000000000000000000000000000000000DC +:1034F00000200005000508200000A000000040009A +:10350000008000800400008000002000400088004F +:10351000020500004000200800000000000020001C +:103520002180000500840103010320000000210028 +:10353000000320000000000020004000C000C00088 +:103540008800000000000000400440082000000047 +:103550000000200084000000C0090000408000003E +:103560002000880040000000840020002008A00007 +:10357000000000010000009080A100A000000000F9 +:1035800080002020002000C000200000000000007B +:10359000000000000000040002080000000000001D +:1035A0000090840240840021040010000088400242 +:1035B00020000000000000000000000000000000EB +:1035C000000000000000000000000090000000006B +:1035D00000000000000000000000000000000040AB +:1035E0004100000040040004000000000000000052 +:1035F000400000002041A0040084401000000000B2 +:103600000000020004000400040004008400040020 +:103610000000000002090400000002000041044113 +:103620000041024100100010A01020104000400096 +:10363000000004000000000004000000040000007E +:103640000000200040100800080004000280000074 +:10365000000800000200040020042000080004000C +:10366000020004800400848040002000000000006C +:10367000000000000480800000010021800800009C +:1036800000080000000080828000800080000000B0 +:1036900040000000000000000000000800080000DA +:1036A000000400820084008200000000800080008E +:1036B00080000084000400000000C1000084800835 +:1036C00000000000900080008004800080008402E0 +:1036D00000000000000800840090800880000008BE +:1036E0000084000000020208001080008000408476 +:1036F00000080084000800400000200000000000D6 +:10370000900040000000900000110002040500023B +:1037100000030003900000200000000000000002F1 +:1037200000000041000001000008010084002008A2 +:1037300020000000000000050000040000210041FE +:1037400000020008840084200008C008C021908581 +:10375000000800000000900040080009402100041B +:103760008800000200000009000900000009900024 +:1037700000080021400000004021000480200000DB +:1037800000000584050003000002410800008000DD +:103790000084000000004000000804000000000059 +:1037A000020000000040000020A00002048200008F +:1037B0008000000000000000000000000000008207 +:1037C000000000A0000200002000040141000220CF +:1037D0001120009000200000000000000002008284 +:1037E000020010000000000000000000000000A027 +:1037F000000000A0000000000020410000200000A8 +:10380000A000C004000000008200020000100010B0 +:10381000A010001000201021002088A0002000002F +:10382000820000000000000020000400000490025C +:103830000802000500000000000040000000000039 +:10384000000000000008010000000000000020004F +:1038500000001000A0400000001100000000400027 +:10386000004082000800080000000800000040003E +:1038700000001000080082008400820000000001A7 +:10388000000000000085038400000984808810087F +:10389000000021100000000100A00301002141C030 +:1038A0002004200400000000009080C000000021DF +:1038B0000005000500200004001003108004000033 +:1038C0000000000000000000400400100000100094 +:1038D00000840504008800000000000000000000D3 +:1038E00000000000000000000000000000000000D8 +:1038F0004000000000000000000000000000020086 +:10390000C0000100040800000804082100000800AD +:103910000000021000000000000002000000001083 +:1039200000030000001000210000084100004002D8 +:10393000000320000004004000021100000882087B +:1039400000004040000000000040000484058400A6 +:103950008800000001090000010000200000002193 +:103960000000000000000000000000030000000054 +:103970000011040020000000104100410000400040 +:1039800000410804048280A000080001000000003B +:10399000000000840000000000A00000000000847F +:1039A0000500000000C0020000A000000040000070 +:1039B00003A1000080004001020000009000000010 +:1039C0001140000000080400000000000084000016 +:1039D000000800000800048805A004080002200870 +:1039E000000000A00000000000000000000008002F +:1039F000080000000000008400000000000000003B +:103A00000000000001024002412108020005830875 +:103A10008308010800080000000500000002010002 +:103A20000008000201800080010901004000400000 +:103A3000000900000011000000054102000000051F +:103A40000021042100000000000800040021000003 +:103A5000840000040808002000210021000000214B +:103A60001000000908000000000000000000000035 +:103A7000000500000100000800418400000510005E +:103A8000000800000008200000904000000000A096 +:103A90002000208220000582210003000000410058 +:103AA0000400000000820410002004820400204072 +:103AB00003040004200000100000001008110000A2 +:103AC000000008008500000000000300080021003D +:103AD00000000000000000000001000000000000E5 +:103AE000000000000000000000C000000000000016 +:103AF00000000000000008000002000000001100AB +:103B00000000000000000000A020A00882A110908A +:103B10000009A090019000030000000000000000D8 +:103B20000000000000000000000000000000000095 +:103B3000000000004000000000010101C000000082 +:103B40000000100090010001000010A000020040E1 +:103B50008808000108008400000102C0908810A0BD +:103B600082880000000000000000000010004000FB +:103B70000000000000000000000001010000000043 +:103B80000001C08800880004102088098804C11042 +:103B9000808200908820409000C00000000000005B +:103BA0000000000000000000000000000000000015 +:103BB00000000900110091000000000841400203CC +:103BC00000021102A1100903000800000880000093 +:103BD0000480008000088420882000408980A100A3 +:103BE0000080800000000000000000004000850907 +:103BF000C02000080000000000000000104100117B +:103C0000402000088080000000800000898404209B +:103C100090A004050908081003094008000000806E +:103C200000000000000000800004008000000091FF +:103C30000004008000000000000900000388090063 +:103C40000208090002000400080041A00000000072 +:103C5000804180A1000020802100090003838000B2 +:103C600080100080800000000000000000000000C4 +:103C7000100010002103C100100010208800020075 +:103C80002110080040080000001100800000081109 +:103C90001089A10291080088002101200000000085 +:103CA00000C00000004000000040000000C0000014 +:103CB0000041000000C000000000000000000010F3 +:103CC00000080000010801080000010001090000CF +:103CD000080040010211000000C00100000001883E +:103CE000020002898210908800000000000000009D +:103CF0000000010001000101080088002100090006 +:103D0000001000000100000100000020000200007F +:103D1000020908100390888940010900040182000B +:103D2000000000000200000000000000040000008D +:103D30000100000004000000000100010001010179 +:103D4000010021001000010100000100010100013B +:103D5000000002000000909001900000010011009E +:103D60000101900200020890A0080000000000007D +:103D70000000000000002001000000000000000022 +:103D80000000000000000100000010900010004042 +:103D9000101082A1A1200404098888081000902135 +:103DA0000204100000008000000004000000000079 +:103DB00000000800000000000000000200020008EF +:103DC000201110051105002041400004101121218F +:103DD00003410000000000000000108000040309FF +:103DE00002110402088200A00010801100000000EF +:103DF000000000000011100200020002000000009C +:103E00000000000002001100050004000000008016 +:103E10000000000009051002098040119080051182 +:103E2000030020050000000000000000000000402A +:103E300000000000800000400000000000000000C2 +:103E40000000008041902140000003091009210476 +:103E5000100010050000804000080080000041882C +:103E60002100110008028011802080000000000065 +:103E70000000000000002184020040001005000046 +:103E800000000000000984821004090003100000F3 +:103E900000000000000008C089102020890103A054 +:103EA000880183008900000000000000000000007D +:103EB00000000000000090000000200088000000CA +:103EC000000000000008018400000000000000C1A4 +:103ED00000000000000000004000401088100400B6 +:103EE0000140000000000100020104C14020200048 +:103EF0000000000000000000014000000000000081 +:103F0000008800900088000090A120010100880036 +:103F10008800200088000800000000E00700000082 +:103F2000000000E00000000000000000070060004A +:103F3000000000000700001200000000070000124F +:103F4000500000E000000000500000E00700508238 +:103F5000500000E0070000000000818100E0070041 +:103F60004200500000E00000500000000000070088 +:103F700000000000000000000000810000E00000E0 +:103F800000000000000000000000818100E0070048 +:103F90000000000000000000420082BEFCFC8FFF19 +:103FA000BFFFB2B2B2B2000000000000000000008B +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000057F757F745 +:103FE000555555000000000000000000000FC355AB +:103FF0003D15290100000000000000000000000045 +:104000000000000000000000000000003C3C3CFFFD +:10401000000000000800080C000FC35582BEC0C09D +:104020008F3FBF3F00C33CFF0000000000000000C6 +:10403000000000000000000000000000030300007A +:104040000000000000000000000000000000000070 +:10405000000000000000000000000000000057F712 +:1040600002A2FFFFFFAA0000000000000000FF0FF7 +:10407000C355BF97AB8300000000000000000000A4 +:104080000000000000000000000000000000000030 +:1040900000C3000000001C3C1C0CFF0FC3555F7DDB +:1040A0005F285F004B003C55FF0F00000000000040 +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000000000000000000000E0 +:1040E000FF03FFF3F0F0F0F000000000000000001C +:1040F000AAFF0FC3808CB0BC0000000000000000CD +:1041000000000000000000000000000000000000AF +:10411000000000000000000030103C1C0000000007 +:104120000A7D0A28550055003C55000F000000008C :10413000000000000000000000000000000000007F -:104140000000C3000000800000000000FAFAFAFA44 -:10415000030000000141014108080000000055551E -:10416000000000000000000005053F5F3050F5F53D -:10417000050500000000FFFF00000024008108206A -:104180000280FC0CFC0CFFFF00008100008100009D -:104190000690F0000000FF000000F00000003C3C32 -:1041A000000000610006000D00000000000000009B -:1041B0000000000000000000000000610006000D8B -:1041C0000000000020298000000100610006000DB1 -:1041D000000100610026009D00000000002000009A -:1041E0000000000000610006000D000000410026F4 -:1041F000800D0000006100008001120600610006D1 -:1042000080050800A0010020800012060061000463 -:10421000800508000363033E0C0D92C003E3033CDA -:104220008C0DC2C000000000000000000000000073 -:10423000000000000000000000000000000000007E -:10424000000000004141C3000A0A0F0F00000000F7 -:10425000FFD70F070000000055555545000000002E -:104260000000000000000000000000000000C0C0CE -:104270003C00F0F5C0C155553C0F30FF3FFF0C002E -:104280000C0000000000F814F0F0FF50BC90DF5D5F -:10429000DF5DFCFC0C0C00000000303FA0AF2D2DBA -:1042A000FFAAF3823082000000000000000000003E -:1042B00000000000000000000000000000000000FE -:1042C0000000000000004141C3000A0A0000000095 -:1042D0000000FFFF0F0F00000000FFFFFFCF0000F6 -:1042E00000000000000000000000000000000000CE -:1042F000C0C0FFFFFFF5C3C155553C0F30003F0064 -:104300000C000C0000000000FC003C3CA0A03C3075 -:104310008A088A080C0C0C0C00000000303FA0AF8B -:104320002D2D55003082308200000000AA3CFFF0A5 -:10433000000000000000000000000000000000007D -:104340000000000038F83BFB003C000F0A0A0F0F8A -:10435000000000000000000000000000FF5FC343F9 -:1043600000000000000000000000FF3C003C0000D6 -:1043700000000000000000000000FCFCFC0CFCAA97 -:10438000FCAA05000F0000F530D5D305D3D3007D7E -:10439000305D000000008ECF8ECF000000000000D6 -:1043A000000000000000F0F0000000000000AA3C47 -:1043B00000F000000000000000000000000000000D -:1043C00000000000000008C80BCB003C000F0A0AE8 -:1043D0000000000000000000000000000000FFFFDF -:1043E000C3C300000000000000000000550F550F7F -:1043F0000000000000000000400000000CFC0C0C5D -:104400000CAA0CAA0500000000F500F5D700050570 -:10441000007D007D000000000C4D0C4D00000000F0 -:10442000000000000000000000553C3C00000000BF -:104430000010000000000000000000000000C000AC -:10444000000000000000000000000000008000806C -:10445000000400800080C0000084000420040000EC -:104460000100000410000000840000000003008030 -:10447000000000000000000000000000000000003C -:10448000000000000000200004C100000005000042 -:104490004100000340840000020000004009C00009 -:1044A0008480C000058285000402038000020000B1 -:1044B00000020000000000000000000010000000EA -:1044C0000000000000C00000000000020000100416 -:1044D0000004000300040004000000050001C00304 -:1044E0000002200200030002000200080000000099 -:1044F00000200000000209000000008200000020EF -:104500000000000000C0000040004140000000002A -:1045100040009002000000024000000040000088BF -:104520000000400200004008040080050420000450 +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:104160000000000300F314D714D700000000000083 +:104170000000AA000FC3838FB3BF0000000000003F +:10418000000000000000000000000000000001002E +:104190000000000000000000000020002C0C0000C7 +:1041A000000005614A0F050D00A000613007000DF9 +:1041B000000005180A00050005A005000A08050012 +:1041C00000A005000A08050000A000610007800D9E +:1041D000000005610A0F850D00A00061000F800D31 +:1041E00020A000000061002F800D0000006100078A +:1041F0008005000005615A0E050D00A000000000BA +:10420000000000000061000580050000006100065C +:10421000000D00010561002F800500000000300046 +:104220000010000000C3AAF0C3C3FF007D28AFAF99 +:10423000003CC3FF00000000000000000000000080 +:10424000000000000000000000000000000000006E +:10425000838FB3BFFFC3FFAA37340704C0C082BE39 +:10426000FBFBAAFF000000000000000000000000AF +:10427000FFFFFBFAFBFF0000000000200000000031 +:1042800000000000000000C3FFC353535F5F000045 +:10429000000000000000000000020000000000001C +:1042A000000000000000FFC3AAF055550F0F7D2845 +:1042B0000505C3FFC3FF0000000000000000000070 +:1042C00000000000000000000000000000000000EE +:1042D0000000808CB0BCFFC3FFAAF7F4C7C4FCFC8D +:1042E00082BEBABAAAFF0000000000000000000071 +:1042F000AA03FF00FB0AFB0F000000000000000003 +:10430000000000000000000000F0FFF053505F5C70 +:10431000000000000000000000000000000000009D +:1043200000000000000000000A0A03F33F14031419 +:10433000A041A0EBEFECE3E0000000000000000073 +:10434000000000000000000000000000000000006D +:1043500000000000000000000F3C0F55BFC3BFFF6E +:104360003082F382A0AFFCFC0000000000000000DF +:10437000000000A3F0A3FAFA3CFF000000000000D8 +:1043800000000000000000000000E8EBE8EBFFFF89 +:1043900000F000000000000000003D01000080FF70 +:1043A0008FFF0000000000000000FAFA03F33FD77F +:1043B00003D7F541F5EB2F2C23200000000000006F +:1043C00000000000000000000000000000000000ED +:1043D000000000000000000000000F3C0F55ABC3C0 +:1043E000ABFF30BEF3BEA0AF0C0C0000000000001D +:1043F000000000000FA3FFA3FAFA3C000000000039 +:10440000000000000000000000000000E8EBE8EB06 +:10441000FFFFA0F000000000002000003D0100FFB1 +:1044200080008F000000000000000000400001003C +:1044300000008880200020000080400320002080B1 +:104440008800080020000000000020044000000850 +:1044500000000000040040001005200010002000B3 +:1044600000008802200000004004200400034010E7 +:104470004000400088000000201020102002200092 +:10448000000000022000048000800484A088200036 +:10449000100020002002400088412000041020006D +:1044A000000001001000200004118804200000C05A +:1044B000040000004010400004A000400000400044 +:1044C00000020000000040000000000000020000A8 +:1044D00000000000000000000002000200000000D8 +:1044E000000000000000090000000008400000007B +:1044F0000000800005020082400000824000002091 +:104500000000000000C00500402000202020002105 +:104510000000800000000001000010C00400200323 +:104520000002000210002100000000000000000056 :10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:10455000010400000004000400000000000400004A -:1045600000000000011001040040000000090000EC -:10457000000000002000000000000000000000001B -:104580000000000000000000000004000040900057 -:104590000000000001000000020000000000040014 -:1045A0000000000010C1000082020300002005008E -:1045B00004080000000000100000000800000000D7 -:1045C00000C000000000000000000000000000002B -:1045D000000020010000000105010088000000012A -:1045E0000000000000002000200100000000000882 -:1045F0000000000000C080C00000000800000000B3 -:104600000000000020000000000000080000004042 -:1046100003080000050040900000000800000000B2 -:1046200000000000400080080000001104000001AC -:1046300004088001020000000000080000000000E3 -:104640000021000000210021000000000000000007 -:10465000000800000008000800000000000300003F -:1046600000000000000000000105004100022009D8 -:104670000400000000000002002140C10080000092 -:104680000400000000110000000500008803000085 -:104690009000900088004000900040000000000062 -:1046A0000000820000030000058000000400A0005C -:1046B00088000400040000A0001000C0800000007A -:1046C00000000000000000000000030000000500E2 -:1046D00009000000000000000000000000000000D1 -:1046E00000000584000009000000040009000082A9 -:1046F0008000800000000000000041002120002018 -:1047000000020000030000884000030000002000B9 -:104710000000000000000504800011C000820000BD -:10472000000000000000009040A090080000800001 -:1047300005004100840080840000000008000000A3 -:104740000000000000000004002000000020002005 -:1047500010000000000000001000200420000000F5 -:104760002004000000042004008008410080201084 -:104770009005000840000000000000044011000403 -:104780000041000000000000000002009000A000B6 -:1047900090009000004108040011400000028200D7 -:1047A00082000020000040000000820904038241D2 -:1047B000830088020800041100000000000080004F -:1047C00000000004000000000000000100000001E3 -:1047D00000010000000000000000000080018000D7 -:1047E0000000804100C000C180C10004000000043E -:1047F0008000000041000000000000000090200048 -:10480000008400C0000000840010020000000004CA -:104810000000000000000000000000008000000117 -:1048200000000084000200000000000000008290F0 -:104830000000040000904000914000000000008053 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 -:1048600000002008A00000002000000000008202DC -:10487000822000888200848884880005000000006F -:10488000000800000011000000000000000000000F -:10489000000000000000000000000811000084007B -:1048A0000004000090000190218901A020840400F0 -:1048B000040004A090400420C10082004080000059 -:1048C000001000C000880000000000000000000090 -:1048D000000000000000000004000800000000903C -:1048E00000000000800000000000800000000900BF -:1048F0000000000109204000092000050000000020 -:1049000000000000000410400088080240004090B1 -:104910000000000040000900000200C0000000107C -:1049200000004100050000000404A02004058220CE -:10493000C0888200C12111C08991040000000020BC -:104940000021000000000000000400040004001129 -:104950000000000000000000002100000000000036 -:10496000200000000000000000000021C04188007D -:10497000000090000002C041000000094003002137 -:104980000000000400210041002100000000020995 -:1049900000000000000800000000020000022000EB -:1049A000020000000000000000000020004000099C -:1049B00000410480400000000000002002020209C3 -:1049C0000091000000000000000000000000000056 -:1049D0000004000000000000000000820000001041 -:1049E0000000800000000000000200000000000045 -:1049F0000000000000000082000000000000000035 -:104A000000000000009000400004200000000000B2 -:104A10002000000000000000400000000000000135 -:104A20000400001000004100000000000000000031 -:104A300040001000802000900000022008010200C9 -:104A400000000020408284840040088800000000AC -:104A50000000000000000000000000000000000056 -:104A60000000000000000000020100000000010141 -:104A70000000000010C0A0030003820040A10090CD -:104A800000200440000002C040020104A010000009 -:104A90000000000000000000000000000000000115 -:104AA000000100010000050900A100A1C0051001DE -:104AB000902010401082081001900010909000C0CB -:104AC000009000840000840000000080800000004E -:104AD00000000000000000000000000000000000D6 -:104AE000000000000000000000090010000200406B -:104AF000400800040009808011210005800980C160 -:104B0000008900098010000083800000030000007D -:104B10000000000000000000000000000000000095 -:104B200000080008000500108220100200400088E4 -:104B30008011802000400080918011800080808062 -:104B400003800080000000008000000980C0000099 -:104B50000000000000000000000000000000000055 -:104B600000000000000000004100200009040000D7 -:104B70000800210005001109C08002008010850096 -:104B80001180050911091010000080008003808049 -:104B90008000000000000000000000000000000095 -:104BA00000000000000000008000808000A0804025 -:104BB000008441002020401180008000809100C0CE -:104BC00080820080000300908008080004108209A1 -:104BD00084820000000000000000000000000000CF -:104BE0000084000000000000000000200000000120 -:104BF000000001C00100010000044090A000040179 -:104C000090A00002000001890101000002000200E2 -:104C100004409000000000000000000000000000C0 -:104C200000000000009000000000C090084084C018 -:104C3000408208C19008200000019000080890C13F -:104C4000844190C1884000000040C004C108008237 -:104C50008488C08400000000000000000000000004 -:104C60001000000000000000000000000001000132 -:104C7000000000000000000183000000C00201A14C -:104C800000218340A0402004902002020001000285 -:104C900088A0009003400000000000000000000019 -:104CA000000000000000000000000000000041C003 -:104CB0000005C004058510A000208240A00190914D -:104CC0000082C090080901000040908400C041802B -:104CD00000000000000000000000000000000900CB -:104CE00000000000000000000000000000000010B4 -:104CF000044009090002000200102004000980A0FD -:104D000020A0102089840080108080008080000115 -:104D1000008000800080090000000000000000000A -:104D20000000000000000000000021001100000051 -:104D300041110908898002C100200320414000116F -:104D400080910089808083C14100008080000080C4 -:104D50000000000280008000000000000000000051 -:104D60000020002100000000000000000000000002 -:104D70000400080009000202040002001000020002 -:104D80004008211010801004A190910082000303BC -:104D90000001801080800080000000000000000002 -:104DA00000000000000000000000211010000000C2 -:104DB00008001021C08041040900A0114010030028 -:104DC0000303C111908909808000C1028502A000FF -:104DD0000000020088C0040404000000000000007D -:104DE00000000000000000000000000000000000C3 -:104DF000000001880100000000000088010001009F -:104E0000010001A1002001840100C102210009006C -:104E10000000000190002082040240000000000019 -:104E20000000000000000000000000000100000081 -:104E300000A0010041018310A005400090084041FE -:104E400020901001090120208890080091010201A2 -:104E50000384C000000000000700480000000000BC -:104E6000000000000000000007000000000000003B -:104E700000000000500000E000000000840000E09E -:104E800000000000484200E007004200500A00E035 -:104E9000070000000000000A00E00700000000001A +:1045400000000400840000000400000000000000DF +:104550000000000002000200000002000000000055 +:104560000000000000090000020000000000400000 +:104570000000018020890000010000000000900080 +:1045800040800000000000000000008010800280D9 +:104590000202000010000000020002000000000003 +:1045A000000000800400000000000000000008007F +:1045B00000000000000000000000000000000008F3 +:1045C00000000000000000000000000800000000E3 +:1045D00000000000000005000000000800000002CC +:1045E00000000000008400840008000800080008A3 +:1045F000808400002004800400002008004000881F +:10460000000080020000004000000008001080024E +:104610008040000900848010001000080000008223 +:10462000000400080002000800820084000040002E +:10463000040800080400200405042000000088008D +:104640008400A00020008405C0000000002100219B +:10465000002100210021002100410005044100410A +:104660000041C0410041004100410141000088007B +:104670000020000500000141000800080000C00003 +:104680000000000000408808040000210421900080 +:1046900010214011C005840800000021A0108205EF +:1046A000000540000003000300080009000800089E +:1046B0000021000000214190040484000000030850 +:1046C00000100000410000000008000808080082F7 +:1046D00000080000050800000000000000000000C5 +:1046E00004002100000800000000008820000002F3 +:1046F00009000090002000001088090009A000882F +:10470000000040080400110804900020008400000C +:10471000000080A04190080000200000050000007B +:10472000004000A0030000A000080900050002846A +:1047300000A000A040000382209021008200418060 +:104740000000201100002000A0008400A002000052 +:104750000000000008000000004000404000080089 +:1047600008000808008000000880000808400400D5 +:1047700000000000000000100000820000000002A5 +:104780000100000000410200004082000000000023 +:10479000000020804000C040000010000011000018 +:1047A000002000050005C010840082000000C00940 +:1047B000080000020000080000008021A0884002DC +:1047C000202000008000210080000300000008007D +:1047D00000C021C000A040A011A000A000A000C007 +:1047E00000A000000090034000840004004000008E +:1047F0000000000000880000000800000800000021 +:104800000000040000000000020800000000080092 +:10481000000000008804000010000000008200007A +:1048200000000000000008000089410000000000B6 +:104830000000000000000000000000000800000070 +:10484000080088000404820400000802020420001A +:1048500000202020840040004002400908089011F8 +:10486000C000400820002000004100050220000494 +:10487000000502000000820000004000000000006F +:104880000400000000000000200000050003A0005C +:1048900000000008400040000000000041009000BF +:1048A0000000C003C0210000000300000420000835 +:1048B00000000020000000000000000800100020A0 +:1048C00020020584000011C0001000902088200004 +:1048D0000000000000000000000000080000009040 +:1048E00000C00000000000000000000000A0000068 +:1048F0000009000009204002090000840020000097 +:1049000000081100200000880084008804000000D6 +:1049100041A0040400040520000000000020400025 +:10492000040008A01100000000200384000000849F +:10493000009000000004028200000088009020C067 +:1049400009000000408090002003C011200984036A +:10495000C0030000A0000021C00583030005820001 +:10496000000390021021A005C00200000000010415 +:104970000000000000040804000000090009C00055 +:104980000000000000000089008408000000000012 +:1049900000000002000800100000000000000008F5 +:1049A0001000000000008400002100210000000031 +:1049B00000000008002100000008000000000000C6 +:1049C00000102000100000040000800000008000A3 +:1049D0000000000003000000000011024000000081 +:1049E000100000000301000004000001000000822C +:1049F0004000000000000001000000000000000076 +:104A0000000000000000000000042003000002403D +:104A10000000000000000000000000000000000096 +:104A20000000000003000000000020000000000063 +:104A30000000000000000000000000000000000076 +:104A40000000000000009000010000000810A08895 +:104A5000008888C08482840400884002C0100488D2 +:104A600000882082404004880088048210890082E7 +:104A700010A108C090C0C084009020020000000077 +:104A8000880000000000010000019000000100000B +:104A9000000002000000000000000000000000080C +:104AA00089024140000800000100000000004000B1 +:104AB00000000000080000010000010100000000EB +:104AC00000000000000000008000020009008000DB +:104AD0000000050000000008000500000083000041 +:104AE00000090003008382408003002080A088101A +:104AF000210389100005880080004000008000002C +:104B0000080000000000000020031110A040001069 +:104B1000000009000000000000000000000000008C +:104B20000200020088800000000010000000000069 +:104B300080000000000080000041000820100010EC +:104B40000000000000000000000800108005800048 +:104B5000000400850083800080800090800400A015 +:104B600000800090000980918080009000C0008348 +:104B70002000C1A008090880800300900088008000 +:104B8000000000000000000000000804080003040A +:104B900041050000000000000000000000000000CF +:104BA00000000884110810020810000000000040F6 +:104BB00000008000000080080000000000000040AD +:104BC00000000000000000000000C0010888A002F2 +:104BD0000888400010C140030840084010C182C14D +:104BE00084C1904004C0901108C00402A0C10240DA +:104BF00084C0840020C0048885C0820002C00441B3 +:104C00008482000000000000000000000109010093 +:104C10000001011000000000000000000000000082 +:104C20000000000000410009018800210000000090 +:104C30000001000008004000A0010000000000008A +:104C40000001000000000000000000000008C0108B +:104C5000040001901104841084028308A18800A03C +:104C6000C008108821880090C008028891880082BE +:104C7000C002C18821830008C0C188A0210420C0CF +:104C8000A004C1820000000000000000000000003D +:104C9000050183010000000000000000000000008A +:104CA00000000000000010010000200103010000CE +:104CB00000000000000100020002000200100000DD +:104CC0000000010000000000000000000000118052 +:104CD000808000004100C18080000000C1004100D0 +:104CE00000008080800041004000C1008000410041 +:104CF00000808000200041200503802110004180B9 +:104D0000800000004180002000030010000500002A +:104D100000412008101002110008000200410002AA +:104D20000000000000000000A0080002002109416E +:104D30000009002000000041008000800080008009 +:104D4000000003000400000000000000000000005C +:104D5000001180090080000000038008008000002E +:104D6000082120004100840021109000050020004F +:104D70008921402041000300001080800080001144 +:104D80000008008900800000000000000000000012 +:104D9000000002A12104210008030004000000001B +:104DA00000000000000000000000C1800240A100DF +:104DB00011020000000000000000000000800080E0 +:104DC00000000000000000000000000000000000E3 +:104DD000000004012088C01020A00200100204403E +:104DE0000200020120020284050003000302049075 +:104DF0000200020191A104C003000421820282404A +:104E00000400040108908408040000000000000071 +:104E10000000000000C100010100010000000000CE +:104E2000000000000000000000000000C1C083007E +:104E3000850088000000000000000000000000085D +:104E4000000400000000000000000000000000005E +:104E500000000000000000E007008206000000E003 +:104E60000000480A00000000000048420000000066 +:104E7000000048420000000000004842000000001E +:104E800000004842000000E00000488200000000EE +:104E9000000000000000884100E007004100000021 :104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000048428421C3 -:104EC00000E00700000000110000070048420081D8 -:104ED0000000070048000000000000000000000083 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000F0F0F0F00000E1 -:104F100000006F6C606C0000BD8DBD8DF0F0F0F096 +:104EB00000E007008200820000E000000000000027 +:104EC000000000000000820000E000000000000080 +:104ED0000000000000003C3C66660000030328411F +:104EE0000000204004022004400220100408280092 +:104EF00000282841000020401080200410082004D1 +:104F00001008A00005002800002820100408000058 +:104F10000000000000000000000000000000000091 :104F20000000000000000000000000000000000081 -:104F30000000000000000000000000002010408081 -:104F4000F03CF03C3CF63CF6DF00FF00DF00FF00E9 -:104F5000DFFF000000F00000000000000000000083 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000003C66006619 -:104F9000F0006060606C606C0000FFCF3C0CE724A8 -:104FA000C30000000000000000000000000000003E -:104FB00000000000000000000000000000010408E4 -:104FC0000201F0FFF0003C063C06FF00FF00FF007E -:104FD000FF00FFFF000000F000000210200000882A -:104FE000108400000000000000000000000000002D +:104F30000000400000000000000000000000000031 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000F0F0FF00000003036C +:104F600000002841108008011008800140800201E3 +:104F70004100004100002841040208014002800174 +:104F80004002800100A00005410000414080020174 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000002000000000000000000000000000D1 +:104FC00000000000000004000000000000000000DD +:104FD00000000000000000000000000000000000D1 +:104FE00000000000000000000000000000000000C1 :104FF00000000000000000000000000000000000B1 :1050000000000000000000000000000000000000A0 :105010000000000000000000000000000000000090 @@ -120098,305 +120098,305 @@ :105030000000000000000000000000000000000070 :105040000000000000000000000000000000000060 :105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 -:105080000000000000000000000000000F0006000B -:105090000F2F9FBF0000FFFF0000000000000C006A -:1050A00006000C66FC660000000000000000000026 -:1050B00000000000000000000000000000000102ED -:1050C000080400A0000536F636F66E6EFEFE00FF00 -:1050D00000FB0000FFFB000000F0000000000000EB -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F -:105110000600002090B004F404F400000000000039 -:105120000C0006000066F0660000000000000000B1 -:105130000000000000000000000000000000FFFF71 -:1051400080401020A0000500360636060808989812 -:1051500000FF00FF0000FFFF000000F000003C3CEB -:10516000000000000000000000000000000000003F -:1051700005000008050000A000000000000000007D -:105180000061000080010000006100028001000059 -:105190000061502280010000A06100248005000011 -:1051A000000000615027000D00000000000000001A -:1051B0000000000000000000000000610006000D7B -:1051C000120600610006000D080000610020800149 -:1051D00000000361033E0C0D10C00363033E0C0D81 -:1051E000C2C000000000000000000000000000003D -:1051F00000000000000000000000000000000000AF -:1052000000004F41FFFF3FBF0FAFEBFFFFFFF0FC80 -:10521000003C00005D51FFFCFFF01F1F101000005C -:10522000000000000000000000000000000000007E -:105230000000000000000000000000003C143C3CA6 -:105240000000000000005F4FFCFCC0C00F550F3C89 -:10525000A03CAF3C5F5F5F0A00003030F505FF0FF8 +:1050600000000000140000140102080401080204FA +:1050700001080204008200140500000544000044F9 +:10508000000088441020080400A00005402002040D +:105090000088004400000000000000000000000044 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000000000000000000000000D0 +:1050E00000000080000082000082804010208010BC +:1050F00040208010402082001400A00000A0880002 +:1051000000888844000080400102A0000500801053 +:1051100001088800440000000000000000000000BA +:10512000000000000000000000000000000000007F +:10513000000000000000000000040000000000006B +:10514000000000000000000000000000000200025B +:10515000000000000000000000000000000000004F +:1051600005610A0F050D00A060610007000D100029 +:1051700000610006000D080060610006000D1000CF +:1051800000610006000D080060610006000D1000BF +:1051900000610007000D080000610006000D00001E +:1051A00000000061002F800D00A000610006000DCE +:1051B00000000000000000000000A5614A0F050D7E +:1051C00000A000610006C00C00000000000000000C +:1051D000000000210007800D00000000000000001A +:1051E00000000000000000000000000000000000BF +:1051F000000000000000000000005555555500005B +:10520000000000000000000000000000000000009E +:105210000000000000000000000000000000AFAF30 +:10522000050500000D010D010F3AFF3A00000000D6 +:10523000200000000000000000000000000000004E +:10524000008000400000000000000C0C0000000086 +:10525000000000000000000000000000000000004E :10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000004F41FFFF3FBF0FAFE0F0F0F024 -:10529000FFFFFFFF00005D51FF3CFF00FF0FF0002C -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000003C149E -:1052C0003C3C0000000000000000C0C0C0C00F5502 -:1052D0000F3CA03CAF3C0A0A5F0A30300000F505E5 -:1052E000F0000000000000000000000000000000CE -:1052F00000000000000000000000000000000000AE -:10530000000000000000FFABFFABD3FFD3FFCFC313 -:105310000F003F3F3FFFFF1FFF1FFFFFF4F4000C94 -:105320000005303F3A3A0000000000000000000095 +:105270000000000000000002000000005515555518 +:10528000000000000200000000000000000000001C +:10529000000100010000000000000000000000000C +:1052A000D782D78200000F030C00003AF03A0000CA +:1052B00000000000000000000000000000000800E6 +:1052C000020000000000000000003C3C0C0C00004C +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000000000000000000BE +:1052F000000000000000000000C3000000000000EB +:10530000000000000000000000C0000000000000DD +:10531000008000000000000000000000000000000D +:105320000000000000000000FF0F000FF0F0B0F0E0 :10533000000000000000000000000000000000006D -:105340000000000000000000000080A0000000003D -:10535000F5F5F505FCAAFCAA00000000000000001D +:10534000000000000002000000000000000000005B +:105350000000000000000000BEFFF0F000000000B0 :10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:105380000000000000000000ABABABABD3D3D3D325 -:10539000FFFFFFFF0F0F0FFFFF14FF14FFFF141499 -:1053A000000C0005303F303000000000000000001D -:1053B00000000000000000000000000000000000ED -:1053C000000000000080000000000000A0A000001D -:1053D000000005F505050CAA0CAA0000000000005D -:1053E00000000000000000000000A01120000011DB -:1053F0004004C00000000008000000000000200081 -:10540000A0000000200020002000C0802000C0007C -:10541000C02020000000000000000000000000008C -:1054200000000000200020000000000320002000F9 -:105430002000201120000204A0008800A10000002C -:1054400000000000C100210040404080200000001A -:1054500020002000020088114000A0800800880081 -:10546000880000028800200020008808000000005A -:10547000000000000090000021000000000000205B -:1054800000200000000000000000000000100000EC -:1054900000000009000000000040000000000000C3 -:1054A00000000002000400000004000800000040AA -:1054B0000040004010020000800000900000020048 -:1054C000000040040002020202009000A10240021B -:1054D0000000000000008000000200400004000204 -:1054E000000400081000000000902082000000006E -:1054F00000000000000300000000000000000000A9 -:10550000000000000040000000000000000000104B -:1055100000800000012000000000000000050040A5 -:105520000040000000000000000000000004000037 -:10553000000000000000000000000000000000006B -:105540000000000000200000000000000002000039 -:105550000000020000000200020000000200000043 -:1055600000090200820002000200840000008400A2 -:105570000008000000000000000000000000000023 -:10558000000000000000000000840000000000088F -:105590000089001000C004010000008200880000A3 -:1055A00000080000000000000000000000000004EF -:1055B0000000400005840084000400080088008486 -:1055C0000000001000000008000000004000008300 -:1055D0000008009000000008000000040000000027 -:1055E00000000084000000880000000000000000AF -:1055F0004002000000000000000000000000000069 -:105600000000000800000000000000000000000092 -:1056100000000000C00010000000000800000000B2 -:10562000000000000000C0080000000000000000B2 -:105630000010000010000000C0008400100088214D -:10564000880090008800912184210100000440110D -:10565000210900000400A0119009200000000000B2 -:105660009108C01000008800A000000000090000A0 -:105670000000000300A000840000000000101100E2 -:105680000000000040000000000000004100410058 -:10569000008400000000090040000000030000003A -:1056A000210000000000030008000000000000A02E -:1056B00000C000000000000800A000A0000000A042 -:1056C000000000A011000008028840000200030052 -:1056D000210002840000410421900088A1004008BC -:1056E00000000888000008020088008200024000D4 -:1056F000028400000800000000000000000000001C -:10570000000000000000000000000800000084000D -:10571000000010000000000008040000004100002C -:1057200000000000A0000100000000000040000098 -:1057300000000000080000000000000088000000D9 -:105740000200000000000200020000000100C00092 -:1057500000001000000011040000C000A040000084 -:105760000800000001000800C011880000000004CB -:105770000000C004000490000000000800000000C9 -:105780000090000000000000000000000000000089 -:105790000000000000000000008480000084000081 -:1057A00000000000000000000200000000000000F7 -:1057B00000C00000008400000000200000C000C005 -:1057C00000008004000200048200000000002004A9 -:1057D0000000000000002000400000000000000069 -:1057E000000000000000080080000084200011205C -:1057F0000020110000000000000000000000000078 -:105800000000000000000000000000004000400018 -:105810000000000000004000000000000000000048 -:1058200000000010000000418400000000000000A3 -:1058300000000041000000008200000000000000A5 -:105840000000000040000000000000000000000018 -:10585000020000000000C0001004820002030000EB -:10586000004040800000A000000008080000000088 -:10587000C0040000900040110000820000C0000041 -:105880000008001000000000000000000000000000 -:105890000000000040000000000000000810100898 -:1058A000000810001000000803080000000003209A -:1058B0001000080005000000210821000000000081 -:1058C00000000008000000880088000011000000AF -:1058D000000089001100000400901189200083C09D -:1058E000009000080040000008002184200000848F -:1058F00000100000118440100000000004000000AF -:10590000000000000000000000080000000000008F -:105910000000000000000000000000000000000087 -:105920000000822108000041000400100021000056 -:105930000000080008000000000000000000000057 -:105940000000000000410000000000000000000016 -:1059500000002000000040000000040008000200D9 -:10596000000808000204820000000009080000008E -:105970000000000000200000081100000000840268 -:1059800000000000000000000000000002080020ED -:105990000000000000000000000000900000000077 -:1059A000000000C000000000000000000000000037 -:1059B000000000820000009000C00000008400C0D1 -:1059C00000000004209000880990000011000004ED -:1059D00000000000000000000000000000000000C7 -:1059E000840420400000A0000000000000C000006F -:1059F000000000C0000009000000000000000208D4 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A2000000000A000000010900000000000000036 -:105A30000000000000000000000000000000000066 -:105A400000000000000000000000000000000088CE -:105A50000000000000C000880000000000C00188B5 -:105A60001000000000C0008802000000900000004C -:105A70000000020000000000000000000000000024 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 -:105AA000000000000980000000808000000000006D -:105AB00000000000000000000000000000000000E6 +:105370000000000000000000000000C3000000006A +:105380008000800000000000000000C0000000005D +:10539000000000800000010000000000000000008C +:1053A00000000000000000000000553C553C0000DB +:1053B000B0F000000000000000000000000000004D +:1053C00000000000000000000000000000000000DD +:1053D000000000000000000000003C280000000069 +:1053E0000000000000000000000001000800200094 +:1053F000C002200021002111200000008800880048 +:10540000000020002000200020008808010020006B +:1054100020008841200020002000100020042004EB +:10542000880020002005200020000003400010001C +:105430002009C00520002000200000052085040070 +:105440000080200820000000C00040000004890007 +:10545000200004040000200020000000000084114F +:1054600040008400200040008800080020008000E8 +:105470000000000080042000200200000000000066 +:1054800020000000000000000000000000010400F7 +:10549000000000000000000010000000000000916B +:1054A00000410000400000900000100000000000DB +:1054B0000002400010000500211000900090000440 +:1054C0000002000440400000400000040000090108 +:1054D0000490100084001000000040000000000054 +:1054E0002000000020000004100010001000000048 +:1054F000000000000041000000000000010000402A +:10550000000000000000000000000000200041003A +:10551000000011000000000000090000020000402F +:105520000000000000000200000000000800000071 +:1055300000000000000082000000000000000000E9 +:1055400000000000000040000040020004000000D5 +:105550000800008000C00000000000000000020001 +:1055600000000010000000000040000000000200E9 +:105570000000000800080000008200020004200073 +:1055800000000000000800080008000800000200F9 +:1055900090000008C0080000008411000000000016 +:1055A00000000008000800080008000800000000D3 +:1055B0000000000000080008000000400008000093 +:1055C00000000088001040840084000800080000EB +:1055D0000084850000200021000800000008000071 +:1055E00000000000000000000084000800820000AD +:1055F00004109000400000002000400840002000FF +:10560000880000000000004000040002000020109C +:10561000001000100010000300100008000000003F +:10562000A000880090400400842140210000000078 +:1056300000000000C0000021100000080021401000 +:10564000A0000000000040900000400590410000D4 +:1056500000009011000520000040842000000000A0 +:1056600000080008000000000040000000000200E8 +:1056700010000208030000021002090000044102A9 +:10568000112000880210008400A1052005A100005F +:1056900005200520400211820010000008000000D3 +:1056A000000010040508000100000088000400004C +:1056B00011000000000000040000000200000000D3 +:1056C0000010008204202020000440000900040093 +:1056D00041004000000000008000110004010000B3 +:1056E0000000400000000000000800000000000072 +:1056F000000000080000200408000404080008005E +:10570000A000C00004000800080000008200820021 +:105710000000000000000000000000020200000085 +:105720000000000000000004000440040004000029 +:105730000000000000000000080000000000081148 +:105740000000000000000800820008000000820045 +:1057500000000000000000000000080000410800F8 +:1057600000000000A0000000000082000000000017 +:10577000A0000000000010008000000000010900EF +:105780000000000040000000000000084000000091 +:10579000000000000000000020000000000000C029 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000000000080000000000001100D0 +:1057C0000000000000000090000000000000000049 +:1057D000000000000000000000000800000440007D +:1057E0000400210000000000000000000000000094 +:1057F0000000000000000000000000008800100011 +:10580000200082008202000382020009401140044D +:1058100008038800A000C0048210040008000000F3 +:105820000000080400080011008000000080408093 +:1058300000A00004C0000000000000000000000004 +:105840000000000000000000000010000000001038 +:1058500008000100000008000804820000000000A9 +:1058600000800000080000000000000500000000AB +:105870000000C040000000000000080020040002FA +:10588000099080900288000140A000A005A000A01F +:10589000000000A0051005100510051005100510EA +:1058A00000104110059040900004410200002104C6 +:1058B0000904000404840000040000900000400477 +:1058C00009040304008400000000000400204020BC +:1058D0000000000020000020040440A000A00200FE +:1058E000000000040000000000000008000040006C +:1058F00008000000001000000000089000000000F8 +:1059000020000000000000210040820040009000C4 +:1059100084001000A0009010001040100000201023 +:105920000010001004100003044190001005000056 +:105930000000000000410000002100000005000000 +:105940000011000010000004000000000000000230 +:1059500000000000000000000000400000000808F7 +:10596000820000000400000000030000000000218D +:105970000800000000001008000000000000000007 +:105980001100A10000000000000000000000000065 +:105990000000000000000000000000000000000007 +:1059A0008000000000008082000000000000000075 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000110000000000C6 +:1059D00000000000000000000204000000040000BD +:1059E0000000000000008002000000000000000035 +:1059F0000000050000000500030000000500000095 +:105A0000210000A0000800020002000000000101C7 +:105A100000001088008400080288088200840009C1 +:105A2000100902A104910082000200000100900010 +:105A3000000008000000010001000000000000005C +:105A40000000000000000000000000000000000056 +:105A50000000000000000000010000000000000045 +:105A600000000000C0009004008200A000000000C0 +:105A70000000000000000000000000000000000026 +:105A80000000000000800080400000000040004056 +:105A90000209000400000000008080008003000371 +:105AA000008400A0C0C10090008800210000100008 +:105AB000000000000000000008004100000000009D :105AC00000000000000000000000000000000000D6 -:105AD00000000000000000800000000000000080C6 -:105AE000030080000000008000008000000008002B +:105AD00000000000000000000000020000000000C4 +:105AE000000000000000C000808004800000000072 :105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 -:105B20000000000000000000800380800080000072 -:105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B50000000000000008000000000000040800005 -:105B600009802108100582850000000800008000DF -:105B70008000000080848000000000000000000021 -:105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 -:105BA0000000000000000000C0000801A0400490B8 -:105BB00000000000000000000000000000000000E5 -:105BC00000000000000000000000000000000000D5 -:105BD0000000000000000000C00000000000000005 -:105BE000C000001001000001C0880000000000009B -:105BF000C000A0009000400204000000000000006F -:105C00000000000000000000000000000000000094 -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000100090008252 -:105C300010900000000000000000000000000000C4 -:105C4000000000080000000000000000000000004C -:105C50000000000000000000008800C000000000FC -:105C6000008800C000010000008900C000010000A1 -:105C7000008900C100100088008200C00000000000 -:105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB00000808400000000000000000000000000E0 -:105CC00000000000000000000000000000000000D4 -:105CD0000000000000000000000000000080000044 -:105CE000000000000080004000100005118200202C -:105CF0000005000510910000008000802080000059 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000004033 -:105D300080048000800000000000000000000000DF -:105D40000000000000000000000000000000000053 +:105B000000000000000000080011008800000008EC +:105B100000050008004080000088000000800000B0 +:105B200000C000800080A000C1008311C18000057A +:105B300010000000080080000000800280000000CB +:105B40000005000000000000000000000000000050 +:105B5000000000000000000000080000000300003A +:105B6000000000000000000080100011800880800C +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000090000085 +:105B900000C1000000400000020004C0048484C072 +:105BA000100002C0840484C009008200A091099002 +:105BB0000000000000000000880000001000040049 +:105BC00000000001000000000000000000000000D4 +:105BD00000000000000000000000000100000000C4 +:105BE000000000000000000000000201000084A18D +:105BF0000490000000000000000000000000000011 +:105C00000000000000000000000010002000100054 +:105C10001000000040009000000011080008C004BF +:105C2000081005840008C0A08204080241408904CD +:105C30000340000000000001000100000800000215 +:105C400000900000000000100000000000000000B4 +:105C500000000000000000000000000000009000B4 +:105C60000000000000000000000000000220080406 +:105C7000909040A000000000000000000000000024 +:105C80000000000000000000000000000000800094 +:105C9000800083000000910000001100C18000809E +:105CA00080000080C1000080C10080808080910061 +:105CB000A08082000004002000210040000080003D +:105CC000008009000000000000000000000000004B +:105CD00000000000000000000000000000000000C4 +:105CE0000000000011000000000000000000800023 +:105CF0000080808000000000000000000000000024 +:105D0000000000000000000000000000000080080B +:105D1000800000008000112121000000020000002E +:105D200000800080000000040040000000008004AB +:105D30000009000000110000000000200000000326 +:105D4000002000C10000030000000000000000006F :105D50000000000000000000000000000000000043 -:105D60008000000000000000C100041103000402D4 -:105D7000800000000000000000000008000080001B -:105D800000000000000000000000000000000040D3 -:105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 -:105DB0008401828408100800000000000000000038 -:105DC00000000000000000000000000000000000D3 -:105DD0000000000000000000000000000090000033 -:105DE0000000C000209000000000C1C0019101002F -:105DF0000000C0000090000000000200A0098840E0 -:105E00001000000000000000000000000000000082 -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 -:105E300000000081000007000000000000000000DA -:105E40000000000000000000000000000000000052 +:105D60000000000000000000000000000000000033 +:105D700000008080000080000000000000000000A3 +:105D800000000000000000000000000000000041D2 +:105D900008014000A00090000001820000004100C6 +:105DA00084000802880404000401C00404A0040064 +:105DB00004830204040090010000000000000000C1 +:105DC00000010004000400000120000000000000A9 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF00000008200400402A0080000000000000033 +:105E00000000000000000000000000000000000092 +:105E10000001000000E000000000000000E00000C1 +:105E200000000000000000004842000000000000E8 +:105E30004842888100E007000000000000000000E8 +:105E40000000000000E000000081000000000000F1 :105E50000000000000000000000000000000000042 -:105E600000000000500000E000000000500000E0D2 -:105E700000000000480000E000000000001100E009 -:105E8000070000000000000000000000000000000B -:105E90000000000000000000000000000000000002 -:105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000F03FFC3000000000E -:105EC00000000000000000000000000000000000D2 +:105E600000000000000000E0000000000000000052 +:105E700000000000004100E007006000000000009A +:105E80000000000000000000000000000000000012 +:105E900000000006000000000000000000000000FC +:105EA00000000000240000240081002404100820C9 +:105EB00004081020F0B0FFFF0504000000000000FF +:105EC000000000000000000055000000000000007D :105ED00000000000000000000000000000000000C2 -:105EE0000000FFFFFF00FFFFFF00FFFFFF00FFFFBD -:105EF0000000FFFFFF00FFFF0000FFFFFF000000AA -:105F0000000400380505000000000000000000004B -:105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 -:105F3000000000000000010000000000F0C00000B0 -:105F40000000000000000000000000000000000051 +:105EE00000000000000000000000000000000000B2 +:105EF000000000000000FFFFFFFFA0AF3C3C0000DF +:105F00000000000000000000000000000000000091 +:105F1000000000000000000000010000000041003F +:105F20004100000000008100008181002400014048 +:105F3000028001024080F0B0FFFF05040000000075 +:105F400000000000000000000000550000000000FC :105F50000000000000000000000000000000000041 -:105F600000000000FFFFFF00FFFFFF00FFFFFF003A -:105F7000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF002F -:105F80000000000400000505000000000000000003 -:105F900000000000C0000800000000000000000039 -:105FA00000000000000000000000000000000000F1 -:105FB0000000000000000000A0A00000AAAAAA089B -:105FC00000000000000000000000000000000000D1 +:105F60000000000000000000000000000000000031 +:105F7000000000000000000000501454A0AF3C3CA2 +:105F80000000000000000000000000000000000011 +:105F900000000000C000080000F000F00000000059 +:105FA0000000000000000000448800000408010216 +:105FB00004081020041008200000000003C041C0A5 +:105FC00000000000000000000000000000000028A9 :105FD00000000000000000000000000000000000C1 -:105FE000000000FF00FFAAAAFFFF00FFFFFFAAAA10 -:105FF000FFFF00FFFFFFAAAAFFFF00FFFFFF5555AD -:106000000000000000000000000000000000000090 -:106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 -:1060300000000000000000000000A0A00000AA086E -:10604000AA0800000000000000000000000000009E +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000D717D7173C3C4D +:106000003C3C000000000000000000000000000018 +:106010000000000000000000000000F200F000009E +:106020000000000000000000000000004488102074 +:106030004080010240800140028000FF15AB03C098 +:1060400041C000000000000000000000000000004F :106050000000000000000000000000000000000040 -:106060000000000000FF00FFAAAAFFFF00FFFFFFE3 -:10607000AAAAFFFF00FFFFFFAAAAFFFF00FFFFFF82 -:10608000555500000000000000000008000000005E -:106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000000000020C0 -:1060C00000000000000000000000000000000000D0 -:1060D00000100000000000000000000000000000B0 -:1060E000000000000000000080000020920240E359 -:1060F0008006802D920240E38004802D920240E3CE -:10610000800680298A0000610026004D0001000001 -:10611000000000000000000000001A13618400006D +:106060000000000000000000000000000000000030 +:1060700000000000000000000000000014171417CA +:10608000FF55AA0000000000000000000000000012 +:106090000000000000000000000000000061000798 +:1060A000000D000080610007000D0000600000008E +:1060B0000000100000610006000D08000061002AC9 +:1060C0008005000000610006000D0000006100076F +:1060D000001D0001000000000000000000000000A2 +:1060E000000000000000000000000000000000614F +:1060F0000007000D000000000000000000008061AB +:106100000027000D0000000000000000000000005B +:10611000000000000000000000007A13818C0000E5 :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F :10614000000000000000000000000000000000004F :10615000000000000000000000000000000000003F :10616000000000000000000000000000000000002F -:1061700000000000000000003F3F7D41282BC3C30A -:106180000000000028E82BEB0000000000000000E9 +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F :1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000000000000EF +:1061A000000000000000000000008200000000006D :1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF +:1061C00000000000000000000000000000010000CE :1061D00000000000000000000000000000000000BF :1061E00000000000000000000000000000000000AF -:1061F0000000000000000000000003037D41282B88 -:1062000000000000000028E82BEB00000000000068 +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E :10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E +:10622000000000000000000000000000000200006C :10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E +:106240000000303F50508282FCC0000000000F0F61 :10625000000000000000000000000000000000003E :10626000000000000000000000000000000000002E :10627000000000000000000000000000000000001E -:106280000000555500000000000000000000000064 +:10628000000000000000000000000000000000000E :1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE +:1062A00000000000000000000000000000000002EC +:1062B000000000000000000000000000000000C01E +:1062C00000000000303F5F5FBEBEFCC00000000069 +:1062D0000F0F0000000000000000000000000000A0 :1062E00000000000000000000000000000000000AE :1062F000000000000000000000000000000000009E -:106300000000B4A0B4A000000000000000000000E5 +:10630000000000000000000000000000000000008D :10631000000000000000000000000000000000007D :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D @@ -120406,1185 +120406,1185 @@ :10637000000000000000000000000000000000001D :10638000000000000000000000000000000000000D :1063900000000000000000000000000000000000FD -:1063A000000000000000000020000000000040008D -:1063B000008000830020002020002000200000003A -:1063C00000000000000040002000820000002000CB -:1063D0008200000082008280200020002000010056 -:1063E0000000400000002000000320002000040006 -:1063F000200020004000200020000000200020009D -:106400000008880020008400200020000000000018 -:106410002000880020002000A080118004802080BF -:106420004184000020002040A00000000000000087 -:1064300000002120002000010001400000000000B9 -:10644000000000000000000000004000000000000C -:10645000000000000000000200100000000000002A -:106460000800000000000000000000000000000024 -:10647000009000004000000000000000400000000C -:106480000000050440000000400021001002400010 -:106490000000008200008000800000029002104096 -:1064A000000220021000000040010002A0000000D5 -:1064B00000000000000000000004040000000000D4 -:1064C00000000010008900000080008000000041F2 -:1064D0000000000300000000001008800000000021 -:1064E000000000000000000000000000000000406C -:1064F0000100010000000040000800000000000052 -:10650000000000000000000000400000000000004B -:106510000800000008000200100502000800834087 -:106520001005104121C09000844082000005000049 -:10653000000800080084000000840084800800C077 -:10654000000000C000C00020000400200020000067 -:106550000008001000000000000000008210000091 -:106560000090000000C000000000000000000000DB -:1065700000004040400800000000000000820000D1 -:10658000000800840000000000000000000000007F -:10659000000000000008001000048010000000004F -:1065A000100880C08200A004000041001000000814 -:1065B0000021004000000005000200050009000263 -:1065C0000010000000000008000200200010001170 -:1065D00000000000000000100005000000030000A3 -:1065E0000000000000000000402100000000010049 -:1065F00000000004000340410800000800080241B8 -:106600000200020000000200000000210000000063 -:106610000000A00000082000A000024102000000CD -:106620000080100000000000010000800041000018 -:1066300004A11000000000000000000000000000A5 -:1066400000A0110000000000000010000001100078 -:1066500008000000000000004000001000000008DA -:106660000000100000820000000000000000000098 -:106670000800000000000000000080000000000092 -:10668000A0008000830000008000000000000000E7 -:10669000000000000000008200020900800080006D -:1066A000000000408090000000A02000104000008A -:1066B000040040400000000000000000001101093B -:1066C00000000004000400000004000000000000BE -:1066D00000000000000000000000000000000000BA -:1066E000000000000400000008000200000000009C -:1066F0000000000000001000000000000000A000EA -:106700000000000000000000000000008400A00065 -:106710000000900000000400081108008202080038 -:10672000080008110800100082C0C0820108C004DF -:10673000840900400800000000000000000009007B -:1067400002840000000400000000000000A000001F -:10675000000000C000000000200000000000000455 -:106760000000000000040200000080008000000023 -:10677000000000000084000000040000000000840D -:106780000000004000002100000000080000400060 -:10679000020020002000000800000004000021008A -:1067A00000080000002010009020000200024001BC -:1067B0000000030000000000004100000000000095 -:1067C0000000000000000002001000000000002196 -:1067D0000000200000000000000000000000000099 -:1067E0000010000000000000000000080021000070 -:1067F00000030005082100050000004100090041D8 -:106800000008012100850000000000000080000059 -:106810000100000000000000000000000000000077 -:1068200000000004000082002000010408008280B3 -:106830000088084189084003820000000000000031 -:106840000000000000200000000000000000000028 -:1068500000000000000000000000090000004000EF -:106860000000000000000000000000000000000028 -:106870000000000000008000000000000000000098 -:106880000000000002002040000200020000204042 -:1068900000020202000020000002000200002000AE -:1068A000000200024000000000048220029000006C -:1068B0000040004000000204000000000003C0008F -:1068C00000000000000000000000001100000008AF -:1068D00000000000000000000000000000000000B8 -:1068E0000008000000000000000000000008200078 -:1068F0000000000000050003000588050000820577 -:1069000000110004040400020010004100110800FE -:10691000000800000000020000000000200000004D -:1069200000000000000000000000000000000188DE -:106930000000000300000021000000000000000033 -:1069400000000000008400A0000000A010A00010C3 -:1069500000000010201000000000000000004100B6 -:1069600000820090001000000000000020000000E5 -:106970000000000004000000000000000000000013 -:10698000000000000000000000A000000000000067 -:1069900000000000000005000090000040400040A2 -:1069A00000000088000211000004000009C000C0BF -:1069B000100909880000000000820000400009A0C2 -:1069C000000000000000000008000088008420880B -:1069D00000000000000000000000000000000000B7 -:1069E00000000000000000000000000000000000A7 -:1069F000101008200082C010C01008C00010C08213 -:106A00000000C010C0880140C08200C0000000002B -:106A1000000000C000000000000000C000000000F6 -:106A2000000000C000000000000000000000100096 -:106A3000009000C100010020000100C00000000023 -:106A400000200000000000000000000000000080A6 -:106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A70000000048080800080808000008000008012 -:106A800080800000848000002180808000800000E1 -:106A900000000000008000000000000000800000F6 -:106AA0000000000000800000000000000000000066 -:106AB0008900000000C110030010000800800000E1 -:106AC000000000000000000000000000000080093D -:106AD0008080800000000000000000000000000036 -:106AE00000000000000000000000000000000000A6 -:106AF0000000000080008008800000008000800806 -:106B0000001100000000A0000488408005C00000C3 -:106B10000000000080000000000000008000000075 -:106B20000000000080000000000000008000000065 -:106B3000000000028000088082001104C1080000EB -:106B40000003000080000000000000000000900032 -:106B500082001084C08400000000000000000000DB -:106B60000002000000020000000000000000880099 -:106B7000020000000000080008C1400202040800F2 -:106B80004085C0108804000009A00509881005048C -:106B9000000000000000C000000000000000C00075 -:106BA000000000000000C000000000000000C00065 -:106BB000000000000000C000004002000001C141D0 -:106BC000000000000000C000000000000000000005 -:106BD0001002000002882084000000000000000075 -:106BE00001000000C00000000000000000000000E4 -:106BF0000000000000000000C008000884C0081069 -:106C0000C1080210021008100001C008002008C0CE -:106C1000850800100000000010C0001000000000F7 -:106C200010C000100000000010C0001000000000A4 -:106C300010C000202001000100C100400000000041 -:106C400001C100400000000000C000000000000082 -:106C500000008000000000000200000000000000B2 -:106C600000004100000000000000000000000000E3 -:106C70000000000000000000000082800080800012 -:106C8000910082800080008089800001088000805F -:106C90008000048000000000000000800000000070 -:106CA00000000080000000000000008000000000E4 -:106CB0000000008000098010000802C100090021C6 -:106CC000411003C10000000000000080000000002F -:106CD000000000000040808500000000000000006F -:106CE00000000000000000000000000000000000A4 -:106CF00000000000000000000000000000110091F2 -:106D000000808000000080840080008000010584F5 -:106D100004849000092000000000000000008000B2 -:106D20000000000000008000000000000000800063 -:106D30000000000000000011000000000000C10978 -:106D40000808410011118000000000000000000050 -:106D5000000000000000200182402008C000000068 -:106D60000000000000000000000000000000000023 -:106D700000000000000000000088008800001000F3 -:106D800084201008400084000482100888880001D4 -:106D9000850291821184C1010000001010000000E2 -:106DA000C000001010000000C00000101000000023 -:106DB000C0000010100000000000000000200000D3 -:106DC000C189010000002001C00000400000000057 -:106DD000000000000000000000810000070000002B -:106DE0000000000000000000000000000704420056 -:106DF0000000000000000000000000000000000093 -:106E000000000000070042120000000007004212CC -:106E10000000000000000700840A000000000000DD -:106E20000000000000000000000000000000000062 -:106E300000000000000000000000000000E0000072 -:106E40000000500000E00000000000000000000012 -:106E5000000000000000000000007E3E78386666FA -:106E60003C3C0000000000000000000000000000AA +:1063A000000000000000000020008800200088009D +:1063B0000000400920000000200000008800880044 +:1063C0002000100010004004000002002010000017 +:1063D0000000008020000004000000008800200071 +:1063E0000000880000000040000388000080881042 +:1063F000C000000088808804880404000000200099 +:106400000400000020002000200800000000000020 +:106410000000840020004004200020000000210033 +:1064200040002004408040042000408400000040E0 +:106430000000400000000002050040400084404091 +:1064400000000002400200000005000080900001F2 +:106450000000000000104004100040000000400058 +:10646000000040000000400000020000009000100A +:10647000000100004000001020001000404000001B +:106480000002000440008002800080000000000044 +:1064900000820002000040000090000400000000A4 +:1064A0004000000280010004100100000000000014 +:1064B00000000000000000000000000000000000DC +:1064C00002000000000000000000000000050003C2 +:1064D0000003000000000000000000402000000059 +:1064E0000000900002000000000082000000000593 +:1064F0000003000001000000000500000010000083 +:1065000000000000000011000000000000C00000BA +:1065100000000200000002410041020000400000B3 +:1065200000000000080002000100014001C000005E +:1065300000080000000800840088020000820000BB +:106540000000030400000000000000820000008240 +:1065500000080900000800A000080000000000007A +:1065600000100000000000002000200000000000DB +:1065700000000008000040080000000800000008BB +:1065800000000000020000082000000000000002DF +:1065900000000004000003080000000820A000081C +:1065A0000590000000000208408420002000200424 +:1065B0000000400084008800000004000400000087 +:1065C000052141210100010001404100200240005D +:1065D0000002009100001000C1000000840084004F +:1065E00040050000402100004005820000058400B5 +:1065F0000000400000000041000500004000008550 +:10660000000000050005050084000421402102214E +:10661000042100000000000000040002002191029B +:10662000002100000500000804000009000484099E +:10663000000900A0002000840090418208840088A6 +:1066400002002040200820002020200020008000A0 +:1066500000C01100101000100300028800000800A4 +:1066600040000004030000000000000000000000E3 +:1066700004000000000000000020000000000000F6 +:1066800000100000000000004000000403000000B3 +:106690000000910000000000000000002100000048 +:1066A00008000000000040000000000000000000A2 +:1066B00000000000004000108200080000080000F8 +:1066C000A000A0000000000082000800C000000040 +:1066D000820000000004080410000000000208000E +:1066E000A0000800A00000000820C0000800100062 +:1066F000C000080000001000000008040000820034 +:106700000000000000008200C00000000000000047 +:106710000800000000000800A00408000800C004F1 +:1067200000040004010001000000000408852000AE +:1067300000008408000000010001000000000000CB +:106740000004000000000000000808000000000035 +:1067500000002100000009000000000008004000C7 +:1067600000000000900800000000080000C00000C9 +:106770000000000000080000008400000084108475 +:106780000000000000000000000000000388084036 +:1067900000000000000000000300030000001000E3 +:1067A000000003840000020010020000000000024C +:1067B0002000080000080000000540000000000064 +:1067C0000000000000000000000008008200000936 +:1067D000C0008800A0008300A0000400A000080002 +:1067E00082000000080000000000C0000800100047 +:1067F000C000C00082008200000082000800A000EB +:1068000084000400000008080010000020000000C0 +:1068100000000000200010000000080082000804B2 +:106820000800C0000200C00040008200C0008404D4 +:1068300082110004000008000000200202904000C5 +:1068400000000020110409041100002004200000B1 +:106850000088000000000000200008000540000043 +:1068600000000200050008000500000404204000AC +:1068700040C00000000000400000000010000000C8 +:1068800000004000000200000000000111040000B0 +:1068900010000000000080000000008800000000E0 +:1068A00000201100000080000000800000000000B7 +:1068B00000010000000000000200000000080005C8 +:1068C000820583090008000800211000000000086C +:1068D00008000000C000C000A00008000000A000E8 +:1068E000A000A000820000040005000500000000D8 +:1068F00000050021C0058200822100000000002167 +:106900000000A04100000005000400210021000853 +:106910000000000984000021082100000000080890 +:10692000C00408218800C000C000C0000000820030 +:10693000A0838200C005000901400010000500048A +:1069400000000000084000000000000000000000FF +:1069500000004002000000000000000000000000F5 +:1069600000000000410003002100030000000000BF +:106970000004000400080000000000000000000007 +:1069800000000000000000000000000040002000A7 +:1069900000000000000000000000000000000000F7 +:1069A000000000000000000041080000410041021A +:1069B0000302211003000300100008010001000081 +:1069C00090820440004082A000000000000000000F +:1069D00000000000010000000000000001000000B5 +:1069E00040C0900400829002408490040082900293 +:1069F0000000000000000000000000000000000097 +:106A000000009004902002829040901090400082FC +:106A1000900200000000000000000001010184015C +:106A20000000000000000000000040029002088208 +:106A3000900241049004A08290A002409004018240 +:106A400090024080808000808000000000000000F4 +:106A50000000000000000200000000000000020032 +:106A60000000800000800080058080800080008021 +:106A70000080000000000000000000000000000096 +:106A800000000000038005808080400000800080BE +:106A900000800080000000000000000000102108BD +:106AA0008910000800000000000000008080408085 +:106AB0000080008082804080808000008000008014 +:106AC000108000808000809000C0800000000000E6 +:106AD000000000000008000000080000000800009E +:106AE0000008000080000082000380000000000217 +:106AF0000003800000000000000000000000000013 +:106B00000000000000000000008200008000800003 +:106B10000002002080004000408010000300028836 +:106B20000800211005C000030000000000008000E4 +:106B3000001080038080118520100305C188800922 +:106B4000001080208080020020094008041000000E +:106B50000000000000000000000000000000000035 +:106B6000000000000000040090084088040240007B +:106B70009084408804020000000000000000000033 +:106B8000000000000000000040009008080202041D +:106B900084009084200240A0000001020000000058 +:106BA00000030100000000050000000000000000DC +:106BB00004009002040220084002908840900308DC +:106BC000040090880408040803A0000288404004E0 +:106BD00000000000000000000000100000000000A5 +:106BE0000000200000000000030400900840C004E2 +:106BF000034000900840C0040000000000000000B6 +:106C0000000000000000000000010340009110405F +:106C10002010038200900820C02000000000000027 +:106C2000000000019000A001000000000000000032 +:106C30000000C10500900204C10483410091884016 +:106C40004184030488908804C004C10000800000CF +:106C50004080000000000000000000000000000074 +:106C600005000000000000000300C180000080005B +:106C70008080C100000080008080000000000000D3 +:106C8000000000000000000000000001C111000928 +:106C900000082083C1800000800080800300000085 +:106CA00000000000002120419008081100000000B1 +:106CB000000000008890002000A090A0C1100020DB +:106CC000000908A0C18000000080828000000082CE +:106CD0000080000000000000000000000000000034 +:106CE0000000000000000000000000000000009014 +:106CF0000080800000000090008080000000000004 +:106D00000000000000000000000000000001800002 +:106D1000008880C0800080000088008000000000A3 +:106D200000000000001009000408040040400000BA +:106D300000000000000080008085001000004083FB +:106D400089A020032111000400A00000000002001F +:106D5000208290049000000000000000000000006D +:106D60000000000000000000000000000000100013 +:106D70001003100408001000900210040800000026 +:106D80000000000000000000000000000000000102 +:106D90000800108308040800080010020204020022 +:106DA00000100000000000000010000001000000C2 +:106DB0000000000000000000100008021091020016 +:106DC000080810210290090120011003209088007A +:106DD0000000000007004800000000000000000064 +:106DE000000000E000000000000000E000000000E3 +:106DF00000000000070048060000000007004806E9 +:106E00000000000000000000000000000000000082 +:106E1000000000000000070048000000000007001C +:106E200048060000000000000000484200E00700A3 +:106E3000000000000000000000000000000007004B +:106E40008406880000E007004800810000E0070099 +:106E500048060000000000000000000000000000E4 +:106E60000000000000000000000000000000000022 :106E70000000000000000000000000000000000012 :106E80000000000000000000000000000000000002 -:106E90000000000000000000000000000F0F0F0FB6 -:106EA000C3C3FFFF0F0FFFFFC3C3FFFF0F0FFFFFA2 -:106EB000C3C3FFFF0F0FFFFFC3C3FFFF00000000AE -:106EC000C3C3FFFFC3C3FFFFC3C3FFFF0000FFFF38 -:106ED000C3C3FFFF00000000000000001E3E183882 -:106EE000FF003C3C0000000000000000000000002B +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 :106EF0000000000000000000000000000000000092 :106F00000000000000000000000000000000000081 -:106F100000000000000000000000000000000F0F53 -:106F20000F0FC3C3FFFF0F0FFFFFC3C3FFFF0F0F01 -:106F3000FFFFC3C3FFFF0F0FFFFFC3C3FFFF00002F -:106F40000000C3C3FFFFC3C3FFFFC3C3FFFFFFFFB7 -:106F5000FFFFC3C3FFFF00000000000000000000AF +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F500000000000000002102000008810840000E3 :106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F800000000000000002102000008810840210A1 -:106F90002000008810840000021020000088108467 -:106FA00000000000000000000000000000000000E1 +:106F700000000000000002102000008810840210B1 +:106F800020000088108400000000000000000000C5 +:106F900000000000000000000210200000881084A3 +:106FA0000210200000881084000000000000000093 :106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE000F4FDF4FD00F06363000000000000000009 +:106FC0000210200000881084021020000088108425 +:106FD0000210200000881084000000000000000063 +:106FE00000000000000000000000000000000000A1 :106FF0000000000000000000000000000000000091 -:10700000000000002D2D2D2D0000000000000000CC +:107000000000000000000000000000000000000080 :107010000000000000000000000000000000000070 -:107020000000FFFF9999FFFF9999FFFF9999FFFFD2 -:107030009999FFFF9999FFFF9999FFFF999900008E -:107040006666C3C3C3C3FFFF0000FFFFF0F0FFFF8E -:10705000F0F0FFFFC3C3FFFF99990000000000009C -:107060000000040D040D0FFF63630000000000002A +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 :107070000000000000000000000000000000000010 -:107080000000000000003C3C3C3C00000000000010 +:107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 -:1070A00000000000FFFF9999FFFF9999FFFF999950 -:1070B000FFFF9999FFFF9999FFFF9999FFFF999910 -:1070C00000006666C3C3C3C3FFFFFFFFFFFFF0F00E -:1070D000FFFFF0F0FFFFC3C3FFFF9999000000001E -:1070E0000000000000000028000000080000000070 -:1070F0000000000005180A00050004A000000000C0 -:10710000000000000000000000000000000040003F -:1071100000000000000040000000000000000061CE -:107120004006000D000040028000002092024082D4 -:107130008000002092020082000000009200008285 -:10714000000000008A0000618007002D920240E3E9 -:107150008006C02D92024082800000209202000032 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E0000010000000000000000000000061000728 +:1070F000000D000000610007000D0000000000000E +:10710000000000010000000000100000000000006E +:10711000000000000000000000000000000000610E +:107120000006000D000100000000000000000061EA +:107130000006000D00000061002F800D00A000007F +:1071400000000000000000614006000D0001006129 +:1071500000068005000000610007800D00010000AE :10716000000000000000000000000000000000001F :10717000000000000000000000000000000000000F :1071800000000000000000000000000000000000FF :1071900000000000000000000000000000000000EF -:1071A000FF1E551E0000000000000000000000004F -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000028EB30F389 -:1071D0005F5FFC0C0CFCF0FF0000000000000000F2 +:1071A000000000000FFF0F000000000000000000C2 +:1071B000000000000000000080A894BCBEF00000A9 +:1071C0000000000000000000000000004D4D4D4D8B +:1071D00000F0A3A3FF00C3C30000000000000000F4 :1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F :10720000000000000000000000000000000000007E :10721000000000000000000000000000000000006E -:107220000000AA1E001E0000000000000000000078 -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000028EB2B -:1072500030F35050FC0C0CFC000F0000000000004C +:10722000000000000000C355C3550000000000002E +:1072300000000000000000000000C1E9D5FD14F0CE +:107240000000000000000000000000000000FFC37C +:107250003C000FFFA3A30F0F5555000000000000D6 :10726000000000000000000000000000000000001E :10727000000000000000000000000000000000000E :1072800000000000000000000000000000000000FE :1072900000000000000000000000000000000000EE -:1072A0000000000000000000C2F2CEFE000000005E -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D000000000000F0FFF000055FCE80000000058 +:1072A00000000000000000000000000000000000DE +:1072B000000000000000000082BE82BEC3C3C3AA5B +:1072C0004141AF0500000000000000000000000088 +:1072D0000000000000000000FA0A0C0C0000000092 :1072E000000000000000000000000000000000009E :1072F000000000000000000000000000000000008E :10730000000000000000000000000000000000007D :10731000000000000000000000000000000000006D -:107320000000000000000000000002320E3E0000DD -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:107350000000000000003C3C3C3C0055F0F0000008 -:1073600000000000000000004000000800000011C4 -:1073700000002100001100000000000000020000D9 -:10738000000000000100000020000000400000009C -:1073900000000000000001000100010003000200E5 -:1073A0000000020000000003880000008800880040 -:1073B0000010010005C0C085040004000000840224 -:1073C00040000005010001000000880000024000AC -:1073D0000000000000004100200000000004A000A8 -:1073E000C1100400040000A0000000000000000024 -:1073F000000000A040000000000021004100419179 -:10740000410000000000040000000000090000002E -:107410000000000800000008040004000404040048 -:1074200041000000000000000000000000004000DB -:107430000000000104008805210240000000000057 -:10744000000180000000400020000000000000005B -:1074500000000000000000002000000010000800F4 -:107460000000100080008090000300000000000574 -:107470000002004011800000000000000080008039 -:107480000040000000000000A02000090090000063 -:10749000000000000000004000000020012010203B -:1074A00000200000000000000000000000000000BC -:1074B0000000000009000010209041400000000082 -:1074C00000004000000240000180010402100000A2 -:1074D00000050000100090002002020003000310CD -:1074E0000304024103000300020003020008000439 -:1074F00000080011000102400008008800840040DC -:107500000040000100000000000800010010001011 -:10751000008400C0000000080008020000410401CF -:107520000001000900400000000800000000000801 -:1075300000000000000084000009800488090008A1 -:107540000008000880080001800040022001008837 -:107550000000000000008000000411010004100879 -:107560000408400908080400080802884001C00215 -:107570009102000089C00021900888000002C0101C -:107580008400A041C008C0080000C0000005002120 -:1075900000210800000000000000000000050008B5 -:1075A0000008000800000000C0000000000000000B -:1075B0000000004100000000880000004000A10021 -:1075C000408000800280008000830280008040C0F4 -:1075D00000A10280008002804080008840800888EE -:1075E000000301000021400085412003100001003C -:1075F0000001020100004003000000000000000143 -:1076000000080090000000100000000000000000D2 -:1076100000C0000080000000000000000000000822 -:1076200000000000000000C000C00000008400C096 -:107630000000000000840082000000000000000044 -:107640000400004000408040004000408040004076 -:10765000004008408040004003400040004003409C -:10766000004003000400000008000408218480A0FA -:107670004000008000000080010200110000004076 -:10768000004100110021C0000800000000000000BF -:107690000000000084000000000000000000000066 -:1076A0000000020000009100050000000000000042 -:1076B00000000000000000000000000002000000C8 -:1076C0000080000002001000000008008880008098 -:1076D00008802000A000000008000000A0000000BA -:1076E00008000800004001020010000841000404E6 -:1076F0008341400208400800004040C100840084EB -:10770000000100A0408200000088009010000000EE -:107710000000000000000000000000C000000000A9 -:107720000000000000000000040004004000000011 -:107730000000000000000000080000000000000041 -:1077400000000040210000000000000000000002D6 -:10775000000200080000000000000800000002080D -:1077600000840000038441014091000100859000E5 -:10777000809010008300000202400021002182A1BD -:10778000080300808480400308400000404000005F -:107790000000100000108400000000000100000044 -:1077A00000000000C01100008200A00000000000E6 -:1077B0000000000000000000000000008200000047 -:1077C000000000410004840000210011000300417A -:1077D0000000000800000040000000000000080851 -:1077E000000004000000820000000400820000008D -:1077F00084000000A02040080000000100000000FC -:1078000000020000004008400000000100000001EC -:107810000000000000000000000800000000080058 -:107820000000000000040010000000A000000000A4 -:1078300000880084000000C00000000021C020106B -:107840000000000000000001000000000000000037 -:107850000000000000000000000000000000050023 -:107860000000020000004100008441A0800200A04E -:1078700000040800000000000000004000088240F2 -:107880000108000282008402002141400121000021 -:107890000100000084001000000000000000000053 -:1078A00000100000000208090000010000809000A4 -:1078B0000004000002000000000000000000004181 -:1078C0000003080000000211020002000000020094 -:1078D00002090200080000210200880010000200D6 -:1078E0000040020000000400080020000080089111 -:1078F0008200002182000000100000210901000028 -:10790000000102000001000000010000020102006D -:1079100011000290000000000000000000000000C4 -:107920002100000100000000000000000400002011 -:107930001100000000000000210000000000000015 -:107940000000000000000000000000000000000037 -:107950000000000000000000000000080204000019 -:10796000000020080000000000A0000080000010BF -:1079700000200900110041000000000400C001C106 -:10798000908810011002C04108C08809C0204088BA -:107990000100089090020000000000000000C0A05C -:1079A00000200040C0A0000000000000000040884F -:1079B00090200082109000000000000000000000F5 -:1079C000000000000000000002C001400008882004 -:1079D00000C000040200000000C1A10482010100F7 -:1079E0000000000000A000040004000001000000EE -:1079F000842000900088A008010320100889000955 -:107A000010C02104800880A0C00811098003002054 -:107A10008000020000000080000000000000000064 -:107A2000A0800000008000000000000000000000B6 -:107A300080008000008000000000000000000000C6 -:107A40000000000000000000000000801180000025 -:107A50000000008000808000000000C18888800352 -:107A600040200000000000000080400000000800EE -:107A70000000000000800080000011418208808822 -:107A8000008309801000200490A1080009212080B3 -:107A900020000000000500200000000000000000A1 -:107AA00080000000000900800000000000000000CD -:107AB000000000000020000880000000000000001E -:107AC0000000000000000000000000001100A008FD -:107AD00090899080000000000000800010000800E5 -:107AE00004008280000000800000000010000221DD -:107AF0009000C100000008200505418510002010FD -:107B0000110041800040C1000488028341001090B0 -:107B1000890400880800C02000C008200000000080 -:107B20002000900002000200020840000000000057 -:107B30000000000090002000000090000000000005 -:107B40000000000000000000000000000000100025 -:107B5000101111081104000000000000C000010015 -:107B60000100000005040000008400000004000083 -:107B700000048400058200000100018901880100E1 -:107B8000000501C001A010890188030390C00140D5 -:107B90000001A1400221C0010003040302C1000052 -:107BA000000000000000C002008400C0A1840000AA -:107BB00000000000000000000020A09002900000E3 +:10732000000000000000000000000000000000005D +:1073300000000000000000000000C0C0FCFCCACA41 +:10734000C3AAEBEBAF050000000000000000000046 +:1073500000000000000000000000FA0AFCFC000031 +:107360000000000000008400400500000000200034 +:107370002000C000200010000000200002032002B6 +:10738000000020030041200020008400A000200015 +:1073900020004000840020000000000040000000A9 +:1073A0000000C00000000003200040002000A000FA +:1073B000200020008800C00000004000880020005D +:1073C0004080C0000000C000400040000400880071 +:1073D000200021008904C1020000020020042004D2 +:1073E00000002000000020000000800803000000D2 +:1073F000000000000000000000000000000000008D +:107400000000000000000408000000000000100060 +:10741000100000000000000010000000410000000B +:1074200000000000004010020000000200004000C8 +:10743000200040004000000809000000009000000B +:1074400000000004000010000000000000004000E8 +:107450002000000020002000204004000000400028 +:10746000400000000000008400000900000300004C +:1074700000400000000000000200000000000000CA +:10748000000000000000000000000010000082006A +:107490000000000000000000020021000000044085 +:1074A0000140020002000000000000000000000097 +:1074B00000000000080001000200000002000000BF +:1074C000020002000008000000000200000000109E +:1074D000000000000810020001000202010000008C +:1074E00003000000900000000009000004000040BC +:1074F00000000000000000002000008402000200E4 +:107500000208000002000200008420000000028245 +:1075100000000088000002000000000084000082DB +:107520008408200800000000000802080000000095 +:10753000020000000200000020000008000000001F +:107540000200001000040000000000080008020013 +:10755000020002000000820000080208000110087A +:1075600020004008000800880008001002080421DC +:1075700088090405008088809003200020020040D4 +:1075800004080400A00040000000000810082003C8 +:1075900001008300010000000400000820008800B2 +:1075A000000004000000100084000400002100001E +:1075B000882120042002881100008808000004406F +:1075C000C0084000A0004000000000009000100033 +:1075D0000000004140000000000000008800000999 +:1075E0009000000890000000000500000005000366 +:1075F00080000008808400200004000080A080013A +:1076000000001100000000080000099000000000C8 +:10761000800020002002200000840002008400007E +:107620000084000200840400000000000000030049 +:10763000000000000000210100000000008400C0E4 +:107640000900009041A000000000004000900000F0 +:107650000084008241A02102210000000900218451 +:10766000080000A0090011881100000400000000BB +:1076700000000000014101000020000000000000A7 +:1076800000000000000008000000000000004000B2 +:1076900000000000000000000000000000000000EA +:1076A000400040000000C000080008000000A000EA +:1076B00010000000000000008200820000000000B6 +:1076C00009000040100000000000820000000000DF +:1076D0008205840008000800080000002000000067 +:1076E00000400080004082000000A00000028400F2 +:1076F0000000C00000A004A00484000100000000FD +:1077000041000000000011000082000000000000A5 +:107710000000000008000000210000000000000040 +:1077200000000000040000000084000000000400CD +:10773000080000C00000030000000000000000007E +:107740000000200000000000000000000000000019 +:107750000000000000000000000000000000A10088 +:10776000110021001104008200000000000003004D +:1077700041A0000000100000C1000000080000004F +:10778000418000020009002100000000000000000C +:1077900000100000040000000000000000000000D5 +:1077A0000000080008410000000000000000040084 +:1077B0000021000400000000000008004000C0009C +:1077C00000000400C011000008004000000000009C +:1077D000000000000800C00082009000C00090007F +:1077E00000000080080008409000001184000000A4 +:1077F0000000000000000002110004001100210838 +:107800000000A004000111A000040000000000001E +:107810000990000000000000080020002102000084 +:10782000210011200388000000000000000000007B +:107830000000000000000000000008000000080434 +:107840002100210400002100080000880000000041 +:10785000000040200408000405A000000000000013 +:1078600000022100004021880800038420840300D6 +:107870000984219041A021C010A1204000000000F7 +:10788000000800800000002120000000000000052A +:10789000000000000000402100000800000000007F +:1078A000000084000000000004000005000008053E +:1078B000000000410000404182000000080000007C +:1078C000080000000000000010000000000000217F +:1078D0000008000800000000400040000800000010 +:1078E0000804004004004000010010008240000035 +:1078F00082410000080200210000C02100000000B9 +:1079000011024000000400000000800000000000A0 +:10791000000009000000000000020000004000001C +:1079200000880200408800880500408800000000B0 +:107930000000000000000000000000000000000047 +:107940000000000020000000000000000000000017 +:107950000000000000000000000000000000000027 +:107960000000200000008000110002880000008854 +:10797000218803880088000000000000000000014A +:1079800010000001000000000100080000000000DD +:1079900000000000000000000000000000000000E7 +:1079A0000000010000000000000000000000414055 +:1079B00002858490008400000000000000000000A8 +:1079C000000000000000000000000301A000000112 +:1079D00000000000000000000000000000000000A7 +:1079E000000000000000000000010101840100010E +:1079F000000000000000000000000100080000007E +:107A0000000480030003002020001000110000008B +:107A10000000000000000000000000000000000066 +:107A20000000000004000000000000000000000052 +:107A300084A00321A0020005000000000000000057 +:107A40000000000000000000000020118810200944 +:107A5000000200000000000000000000000009001B +:107A600000000000000000000000094021408910D3 +:107A700000100000000000000000000003000000F3 +:107A800000000000000000000041039008004109D0 +:107A900021080000000000000000000000000000BD +:107AA00000000008000000030000000000000000CB +:107AB00000008200214108080303000000000000CC +:107AC0000000000010001000100008000300030078 +:107AD000100021030000000000000000000300006F +:107AE00000000000000000000000000002900311F0 +:107AF0000390024004852100114041020000000073 +:107B000000000000009000020000008900910100C8 +:107B10000000010000000000000000000000000064 +:107B20000000000000000000000000000000000055 +:107B30000000000004882000020283090000000009 +:107B400000000000000000000000000001000040F4 +:107B50000000000001010000000000000000000023 +:107B60000000000000000000000000000000010212 +:107B700000210020012000C00100010101010000DE +:107B80000000000000A000000000900000000000C5 +:107B900004000000000000000000000000000000E1 +:107BA00000000000000000002000000001000000B4 +:107BB00000000000000002C00003C185C0A1000059 :107BC00000000000000000000000000000000000B5 -:107BD000899000100811081000000000000400C087 -:107BE00000000101000501C10100000084C001C0C6 -:107BF000C000000482000082C0A00004000490C005 -:107C000089008900040111000008092105A10989E2 -:107C10002109200985118409881000908088800836 -:107C20000000000000000000008000000000A10033 -:107C30000000000000000000000000000080900034 +:107BD00000000100000000000000000000000000A4 +:107BE0000000000000000000000000000000000095 +:107BF00000010800A00000010000000000000100DA +:107C0000000000000000000110001000030011003F +:107C1000001000030008020800000000000000003F +:107C2000000000000000000000000000000008004C +:107C3000000000000000000000084108052120901D :107C40000000000000000000000000000000000034 -:107C50000000109000000005208200110009009033 -:107C6000058000001040209002910200000080007A -:107C70004000400000808000038080000080008081 -:107C800000804020111108218808C08289888380E3 -:107C90008310000000000000004000008080808011 -:107CA000000000050000008000008000800000004F -:107CB00080000000000000000000800080800000C4 -:107CC00000000000000000000000000000000000B4 -:107CD000000000008011008800000000000000008B -:107CE00000800000A0800400058010020000000059 -:107CF000800000000000004000000010C1001011D2 -:107D0000030003110000002000000011C1C0410564 -:107D100002820301082000902020040100000202DA -:107D20000202080000000090000200001000044061 -:107D30000802A00000000000000000009000028285 -:107D4000909088000000000000000000000000008B -:107D5000000000000000C001082120880800000089 -:107D6000000000844000C1A0000001084000820023 -:107D7000008204820000008800010000C001C100F0 -:107D8000210121008200A0820401200010010000D6 -:107D90000000000042000000000000005000000051 -:107DA00000000000600000810000070000000000EB -:107DB000000000008400000000000000000000211E -:107DC00000000700000000000000000000000000AC -:107DD0000000000000000000600000E0070000005C +:107C500000000003200808410004000000000000AC +:107C60000000000000000000000000000000000014 +:107C700000000021004182111008000000000000F7 +:107C800003000002002000100008402140044100D1 +:107C90000800108003002000100300000000000016 +:107CA00000000000000000000000000000000000D4 +:107CB000000000000000000000000882882088000A +:107CC000820400000000000000000000000000002E +:107CD0000000001021082100000009200000000021 +:107CE0000000000000000000000000000000000094 +:107CF00000000000880408008800020808890221AA +:107D000040002011000000000000000001010100FF +:107D1000000001000104000000000100000000005C +:107D20000000000000000000000000000000000053 +:107D300000000000000000000000000088C1A00852 +:107D40001108100000000000000000000000008882 +:107D50000000000000010189000000000000000098 +:107D60000000000000000000000000000000000013 +:107D7000000000000000C002210002009001010389 +:107D800001000100010100000000000000000000EF +:107D9000000007000021000000E0000000000000DB +:107DA00000000000000000000000000000000000D3 +:107DB00000E00000000000000000000000008181E1 +:107DC00000E0070084000000000000000000000048 +:107DD0000000000000000000880000E0000000003B :107DE0000000000000000000000000E000000000B3 -:107DF0000000000000000000500000E00000000053 -:107E0000000000E007006000600000E007000000E4 -:107E1000FFFFDF80FFFF00C05959A9A900FF14EB45 -:107E2000AA3AAA3A55A5AAAA00000000000000003C -:107E30000C000000080F0D0F000000000000000003 -:107E400000F00FFF0FFFAFAF0000000000000000C8 -:107E50000000000000000000000070C0B0C07D0DF8 -:107E60000D7DC3C3C3C3FFFFFF00FFFFC3C3FFFFFD -:107E7000FF000F0FF0F0FF0000FF3C3C3C3C0F0FF9 -:107E8000F0F0FFFFAA8200FFF0F034B675F70000B3 -:107E90000000FFFFDF80FFFFFFCF69696969FF0016 -:107EA000D72855C555C55555AA5A000000000000F1 -:107EB00000000D01010108080D0D00000000000088 -:107EC00000003C3C3C3C00F0A0A000000000000092 -:107ED00000000000000000000000000000C000C022 -:107EE000D70707D7C3C3C3C3FFFFFF00FFFFC3C349 -:107EF000FFFFFF000F0FF0F0FF0000FFC3C3C3C37D -:107F00000F0FF0F0F0FFFFC3AAAA3C3C20A261E3F0 -:107F1000000000002800FFFF55AAA5A565A655AAE8 -:107F200095A995A96565A6A61E1EE1E100000000C1 -:107F3000FFFF55000050000000000010000000008E -:107F40000000000017FF17005C5C5C5C0000000094 -:107F50000000000000000000000000000000080811 -:107F60000808F5FAC1C200FFFFFF0000FFFF00FF95 -:107F7000FFFFFFFF0000CCCCCCCC55555555FFFF83 -:107F80000000FF0000FFAE04AA00000000000F7D0B -:107F90000F3C00000000EBFFFFFFA5A5A5A565A60F -:107FA00055AAA5A5A5A55555AAAA0F0FF0F0000042 -:107FB0000000AAFF000082D20000000000000000C4 -:107FC00000000000000017FF17005F5F5050000026 +:107DF0000000000000000000888100E00700000093 +:107E0000820000E0000060000000000000000000B0 +:107E10000000000000000000000000000000000062 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000000000000042 +:107E4000FF00FFFFFF10FFFF000000000000000028 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E700000000000000000000000CFCFFA0A000060 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC0000000FF02FFFFFF10FFFF000000000000A6 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF000000000000000000000000000C0C0FA0AFE +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F400000000000FFF03D3D008200A000000000A6 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC000000000000000FFF0FDFD000000000000C8 :107FD00000000000000000000000000000000000A1 -:107FE00038181838C1C2F5FA00FFFFFFFFFFFFFF86 -:107FF00000FFFFFF0000FFFFCCCCCCCCAAAAAAAAAE -:108000000000FFFFFF0000FF000000000000000074 -:108010000F550F000000000040E38006002D900285 -:1080200040618006002D100240618006002D08028C -:108030000000002000000000000000000000000020 -:108040000000000000000000000000200000000010 -:108050000000000000000000000000000000000020 -:108060000000A5615A0E850500A040638006002D22 -:10807000920240E380060029900240008000002028 -:10808000100240618007C02D0802A0610004009D1D -:10809000000085610A0A850500A00808FBFB500066 -:1080A000C30000000000000000000000000000000D +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:10801000000000000000000005610A0E050D00A030 +:1080200000610007000D00000000000000000000DB +:10803000000000000000000000610007000D0000CB +:1080400000000000000000000061002B800900001B +:108050000000000000000000000000610006000DAC +:108060000000006100058005000000000000000025 +:10807000000000610007000D00000000000000008B +:108080000000A0610A27800D000100610006800544 +:10809000000000610006000D00003C7D0041000072 +:1080A0000000AAAAAAAA0800F70000000000000029 :1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000FFFF3CFF0000000057 -:1080F00010FB10FB0F003F3000A000A000000000AC -:10810000000000000000000000000000F030C3008C -:108110000000000000000000505A515B00FF00FF0B -:1081200050000000000000000100000000000000FE -:10813000010000000000000000000000000000003E +:1080C00000000000000000000000004D0000FF0064 +:1080D000FF7F000000000000000000000000000022 +:1080E0000000000055C355C3FDFFFD000000000067 +:1080F0000000000000000000000000000000000080 +:1081000000000000553C5555A028A0008250D750D3 +:108110000000000000000000303FFAFA3E7F0243FA +:1081200000000000C3CAAAA30000FF000000000076 +:10813000000000000000000000000000000000003F :10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:108160000000000000000000000000003C000000D3 -:10817000000010FB10FB0F003F300000F0F000008B -:1081800000000000000000000000000000000000EF -:1081900000000000000000000000000A010B202F7A -:1081A000202FF0F0F0F0FFEFFFFFAAAAA2AE000030 +:10815000FF00FF57000000000000000000000000CA +:10816000000000000000550055FFBCFFBC000000EF +:1081700000000000000000000000000000000000FF +:1081800000000000000035353535A028A0AA82FA8D +:10819000D7FA0000000000000000303F0A0AFF0389 +:1081A000FF2B00000000000000000C3C1414000035 :1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E0000000000000000000000000003C0C3CFC0F -:1081F0000000000000000000C3000000090903099E -:10820000000000000000000000000000AAAA00FF1B -:1082100000000000A0A000AAFF000F0FB2B23CFFB8 -:1082200020202F2F70F0F0F000040000AAAAAAAAC4 +:1081C0000000000000000000000000000000FF7D33 +:1081D000FF750F0F0E0F00000000000000000000F0 +:1081E000000000000000FFF2FFAAFFF0FFFF000008 +:1081F000000000000000000000000000000000007F +:108200000000000000000000FF03FFF3971583014A +:1082100000000000C3C30F0F0000000000000000BA +:10822000FF17FF3F000000000000000000301414A2 :10823000000000000000000000000000000000003E :10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:1082600000000000000000000000000000003C0CC6 -:108270003CFC0000000000000000C300FC7D0F0F6C -:108280000F0F000000000000000000000000F0F0F0 -:108290003C3C00000000A0A000AA3C3C5555B2B2F6 -:1082A00000C301000002000088102002200400002A -:1082B000A0000000A005A000000020802000208871 -:1082C0002080400020002080200000008805000061 -:1082D000000000802080208000802080C100840079 -:1082E00084000003200000000080C0001000400057 -:1082F0000000100000000400040000002000200026 -:108300002000200020004000880000040100400000 -:1083100088002000C0004000400084802010410000 -:108320002111890040000088000000004001000188 -:108330004002400040000000000000008004800077 -:10834000800400040500800080040000000040005C -:10835000000000004004000480040004C00402A0E7 -:10836000000000000000400000000002000040A0EB -:10837000000040000000000040000000000000007D -:108380000000000010002100000200000300400077 -:10839000800010000000000020000000000200002B -:1083A0008808200020020040A0000000000000001B -:1083B000014101859185000000000000009000044B -:1083C000008000100000000400040004000400000D -:1083D000000000000000010001800000008000801B -:1083E000000000000400000000000000010910105F -:1083F00000008800000001000000000000000000F4 -:10840000000008000000000091001000401040092A -:108410000000410000000800840082080000820083 -:1084200001000180004003000001090000000884F1 -:1084300000822082200420040008000800000002BE -:108440000009000400000088000900850001000107 -:108450000000000000840000201020040000000440 -:10846000000400000008000000000908004040006F -:1084700020010900000009004000000000842000E5 -:1084800000000000000000080000081080088000C4 -:1084900080820000C0000000000800000285000883 -:1084A00000002000400200100808000800410004FD -:1084B00000418810000000040800000000100000C7 -:1084C000000800000000000400040000000888000C -:1084D000880000000000000000000000000890007C -:1084E00000009000000500A00080000000000800CF -:1084F000A00040000000000000000000000000009C -:108500000008000000030000002190080000002186 -:108510000021000008008808000990004021104157 -:108520009005001000000000400940050000038293 -:1085300040044084001009000888110009824000AE -:108540000300000010001000000100010000000006 -:10855000000000000000030000000000090000000F -:10856000000000000000000000400040000000008B -:10857000A10000008500000000100000000800823B -:10858000000804A0040000000000108200000000A9 -:108590000000000000A008001000090010100500F5 -:1085A0000910000005002100410200000000080041 -:1085B0000000080000004000200000000000004013 -:1085C0000100820000000000820000000100200085 -:1085D00000000000000008000800C0000080828049 -:1085E0000000088000000810080082000000000061 -:1085F00000000000000000000000C00000000000BB -:1086000000000000C00000020040001090000000C8 -:1086100000080000000000100000C0104000A00092 -:1086200000000180C00910002040000584000841BE -:10863000008400A041000000200041000000200054 -:10864000030102000300000000000300000020C03E -:10865000800000000000000000000000000000405A -:1086600000040000000400000010000000000800EA -:108670000000000000002100000041000800000090 -:10868000000000C000C000C00000419003080000CE -:108690000090000100004100080400000084020076 -:1086A00000A00000042000900000000400820000F0 -:1086B00000840303022008090110004100000004A7 -:1086C0002041000200210000000000000000200402 -:1086D0002041000020002040204002000200004015 -:1086E00000000084A08000000000820082000800DA -:1086F00000000000820008000820002000000000A8 -:108700000000100000000800000000000000000051 -:108710000000904000000010C00010080800080091 -:10872000C000900504000500080000000000A00043 -:10873000822084004088808820044084090003044B -:108740000005099020884010400040880000030088 -:108750008001800000008000800180018000800096 -:10876000000100000041004009002100000000104D -:10877000000000000000000000000001000100A057 -:10878000080421A040A00000040000000000020036 -:1087900005A000A00800000000000000000000008C -:1087A00000C000000090000004204104200041842B -:1087B0000008008411020041000800090000014186 -:1087C0004104000800020000A00082848480400070 -:1087D0008200008001000000000000000000000096 -:1087E0008200000008000000A0040000000000005B -:1087F00084000800000000000000C00882000000A3 -:108800000000000200000000000000000000000066 -:1088100000000000020000000000000000008400D2 -:108820000000400000001021C00004412000002191 -:108830000000080000080000000000000000000028 -:1088400002000205000000001190001011401140CC -:1088500003002100004002000000000000000000B2 -:108860000000000000000000000000010000000007 -:108870000082000000000000000000000000000076 -:1088800000000000000000000000000000000000E8 -:1088900000000000000000000000000000040000D4 -:1088A0000200000080002000000000008000200086 -:1088B0004040090400022000118400010100100062 -:1088C000000100C000000400000000C089002089F1 -:1088D000000191C100000088000091C10000400229 -:1088E000000000C000000002000000C10000C10143 -:1088F000A00191C100000000008200000000910072 -:108900000000000000000000400000000000000027 -:108910000000000000000000000000000000000057 -:10892000840000000101000000000001000200C0FE -:108930000284000200090091902100020008410415 -:10894000000900200091001000100010408010026B -:10895000001000108991114000410000899100052C -:1089600000C10000008000000080000000910505AB -:1089700089100008899100050041000000001100E5 -:108980009100000000000000400000000000000016 -:1089900000000000000000000000000000000000D7 -:1089A0000400800000001141001000410008008018 -:1089B0000000000000800510212111050088000042 -:1089C00080000000800041800400118991000400B3 -:1089D0002100040083001180400005008500410053 -:1089E000050340118010000080030000800010800B -:1089F0004100109185100000800000008000000000 -:108A000090009080000082800300030000000300BB -:108A10000000000000000000000000000000000056 -:108A2000400011200400410000000000000200404E -:108A30000000000000000000820003000500C020CC -:108A4000000008000000C000000201000191C00009 -:108A5000010000000100C10000C000000000C000D3 -:108A6000000000000001C001000008000000C0007C -:108A7000010200000191C101000008000000C000D7 -:108A80000000030008201000C0C00000000000002B +:10825000FF3CFF30FFFFBEFF0000000000000000F9 +:108260000000000000000000FFF73CAA3CF0FFFF08 +:10827000F20200000000000000000000000000000A +:1082800000000000000000000000FC000C00BF3DEA +:10829000AB2900000000AAAA00FF000000000000B7 +:1082A000000088000005880010808800840000001D +:1082B00020000020880020804080200040004020D6 +:1082C000000000028800000210804005080008003D +:1082D0002008C08000020000880200002000200466 +:1082E0000208000300000200840040004000040077 +:1082F000040840000000C000840004000000C0002A +:1083000088040204000020000400400420802108AA +:108310002000200000000202C000C000C000400099 +:108320004004400440904000400040200000100005 +:1083300000001000000110002120102000000000AB +:1083400021012002400100004001C008418240029A +:1083500040900003210400000000200411000000F0 +:1083600000080002000040901000400400002000BF +:108370000082200000900002000200022090000015 +:1083800020002002004000400000000041000440A6 +:108390001001090400020004004000042100400014 +:1083A00000000400000000000100040000000003C1 +:1083B0000000050000000000000000400000000078 +:1083C0001000050400900080000202001000000070 +:1083D0000040080021000000000000000000000034 +:1083E000000000000000000000000000010000008C +:1083F00000100000008802100000000000000000D3 +:108400000008004000000010000002000000020010 +:108410000200008008C100100000000008000000F9 +:1084200000000000020008000008400200040000F4 +:1084300000C00000100800840000028200000084D8 +:1084400002000000400100020308030100008084D4 +:108450000004008280082000400000000000008826 +:108460000500008400000010000000004100020030 +:108470000000000920000040000000000000000093 +:1084800000080000000000080008000000000000D4 +:108490002008008800080010000800820082000008 +:1084A0000088000800100082000200050409040092 +:1084B0000008000500084009C005A0000410A01035 +:1084C0000000210504082000040800040000898041 +:1084D00000080000000200009000200005002000BD +:1084E000904010050000000200000000080002009B +:1084F0008200C0000000A00808000008000840003A +:108500000000000004108810880484008800000027 +:108510000000080020000000A100400000008800CA +:10852000000008008800C000C0000000080080A013 +:108530008800020000A0000200000000000480008B +:108540000000000084009100800080880800000086 +:1085500010080001034041401184090080002010F0 +:10856000C120000000000004000000000000A10085 +:108570000000410041080204000400000000000067 +:10858000098400001000000000000001000000004D +:1085900011004100080000000000084080020000B7 +:1085A00041020000800200900800000000008400EA +:1085B0008402000001000000000000000000000034 +:1085C000080000000000A0000000080088880000EB +:1085D00000000000084020040080000000000000AF +:1085E0000000040000000040000000000000000047 +:1085F000000000000000000000020000C0000000B9 +:108600000000000000050000A000000020000000A5 +:108610000000000900000000004000080000000207 +:108620000000000000040400000000030000080037 +:1086300000000000000040000008000800020000E8 +:108640000000000000000000000000000000000426 +:10865000000009000000008200000002410000004C +:1086600000000000200000000000000000000000EA +:10867000000000000000000000004000000000407A +:10868000000000000000000000000000000080006A +:108690000000000020000000000000010089000030 +:1086A00000010000080008001000000000000000A9 +:1086B0000000040000110000000000800000000025 +:1086C0000000820000001000000000000000000018 +:1086D00001000000A00008001003C00000000021FD +:1086E0000802000008000003010308000010000950 +:1086F0001021000000004000000008000000000001 +:1087000000000000000000000000A00000000000C9 +:1087100000800800000000000000000000000000D1 +:108720004000008000000080890090009000400020 +:1087300008000000C004110000A00308110200029C +:1087400000001184000000840000210004000400E7 +:10875000000020000090000000008000000800845D +:1087600000008082000011880890200800000000AE +:10877000000000000000000000040400104002009F +:108780000020400421000400000800000000000058 +:1087900010000004000000000008000000C00320DA +:1087A0000800084000021100411008200888090450 +:1087B0000000000000000005002100210008102139 +:1087C0000000100004000810000040000008000035 +:1087D00008840000000040030000902000210800F1 +:1087E00008008200000000100010000300C1820099 +:1087F0000000000000000000002108000000100040 +:108800000000000000000800080000000000000058 +:108810000000000800400000000000040800000004 +:108820009000100000008800000000000000000020 +:108830000000C00000000000000020000000000058 +:108840002000000000008000000000000000000088 +:10885000000000050000000080000000040000008F +:1088600000040000000000002100000000000040A3 +:1088700000000000000000000000000000000000F8 +:1088800000000000000002000000000000000000E6 +:1088900000000000000000000000050000000000D3 +:1088A00000000000000000000000000000002000A8 +:1088B000000000000082000400000000040002002C +:1088C00000000001000000000001000000000000A6 +:1088D0000000010001009000000001010001000003 +:1088E0000001C110A00800044008000800080110A1 +:1088F0000008000000000000000000000000000070 +:108900000000000000000000000000000000000067 +:108910000000000000000000010000000000000056 +:1089200000000000400000008400000005A0A0C07E +:1089300000408204000000000000000000008500EC +:108940008000000000410010040000110000000041 +:10895000000000001100080089000000044100042C +:108960000041000982000080000000800800000033 +:1089700004000000000000000000000000000000F3 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000100000000000C7 +:1089A00000000000000080000000000000008200C5 +:1089B00000000080808000000000000000000080B7 +:1089C00000000000000300000000000000000000A4 +:1089D0000000000000001009210008020300000050 +:1089E0001000050041A0000080020080008000050A +:1089F0000021000500000000000000000000000051 +:108A00000000002000000000000000020000000044 +:108A10000000000000000000000000000003000053 +:108A20000000000000000000000000000040000006 +:108A300000008090008400000000000000000000A2 +:108A40000004002000000009000000000000008871 +:108A5000000000020000008801000008010000087A +:108A60000020000001000188C00020A0C008A082F2 +:108A7000000000880020000000000000000000004E +:108A800000000000000000A0000000000000000244 :108A900000000000000000000000000000000000D6 -:108AA0000000010000010008018400C00000000176 -:108AB000000100000000000000001120C10088003B -:108AC0000821000000000001004100100001000129 -:108AD00091C100110000000100C000000100000071 -:108AE00000C100010000410100C1000000100000B1 -:108AF00000C000000001900191C1000000000000D2 -:108B000000C0000001010000900100000000000012 -:108B10000001000000000000000000000000000054 -:108B20000000000000000000000000010000410003 -:108B300088000000020100000001040100010000A3 -:108B400001000100000340030810000800031104A5 -:108B500003058991002100050021008000201040BC -:108B600005050091000241051008009100000080F9 -:108B70000000008000000008031091890000200020 -:108B80004100008000004111000000110000004081 -:108B9000000500210020000000000000000000008F -:108BA000000000000000000400100002004100006E -:108BB0009100820000008008000500208041000232 -:108BC00040080305402000000000000000008384EE -:108BD0000411090003008000800000000040C00272 -:108BE000118905000811C1050589030003118000E2 -:108BF000000000000000C100051103000003801008 -:108C000000000000000000000002000900800010C9 -:108C1000000000000000000800000000000000004C -:108C20000000000000000000000000008000801034 -:108C30001000100009000400000000030000000004 -:108C400002840208108003030000000000000000FE -:108C5000C003011100000100C0A0021000000000CC -:108C6000C001899100000000C0A000910100000037 -:108C7000C000000000000000C000000101C00000B2 -:108C8000C00100008200000000000001000100029D -:108C900000000000000000000001000000000000D3 -:108CA0000000000000000000000088020200040034 -:108CB00008000100000001000000000000000000AA -:108CC0000000010501840184000100000000000093 -:108CD0004100810000E000000000000000000000F2 -:108CE0000000810000E000008100810000E0000041 -:108CF00000000000000000000000500000E0000044 -:108D00000021500000E00000000000000081000091 -:108D10000700828100000000000000000000000049 -:108D20000000000000000000000000000000000043 -:108D300000000000820000E000000000000A0000C7 -:108D400007000000810000E00000000000000000BB -:108D5000FFFF0000666600003C3C0000FF000000D2 -:108D60003C3C0000FF00000066660000FFFF0000C2 -:108D700066660000FFFF0000F0F00000666600007D -:108D8000FFFF0000F0F00000666600000000000039 -:108D900000000000000000000000000000000000D3 -:108DA0000000000000000000000000000000FFE4E0 -:108DB000C3E400000000000000000000000000000C +:108AA00000000000000000000000000000000000C6 +:108AB0000000C0002040C0C0828400000000000010 +:108AC00000000000000102010000000001000100A0 +:108AD0000000010000001000000000002001200044 +:108AE0000001000000000000000008C0002000C0DD +:108AF00010A0100040000200100000000000000064 +:108B00000000000100000000000000000000000064 +:108B10000000000000000000000000000000000055 +:108B2000000000000000000000000000008500853B +:108B3000008400C1C0C0002002C0C182000000004B +:108B400000000000200500208020000500004000FB +:108B50000500100008000000000000002011801037 +:108B600000050910000000000000000085000080E2 +:108B70000000A000800080008000200000000000B5 +:108B800000000000000100000000000000000000E4 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000004C1 +:108BB0000004004000C188000080000008000000A0 +:108BC0000000000000001004210205004000000425 +:108BD00000020000000000000020000000000090E3 +:108BE0000002000000084140104041002003C10283 +:108BF00083100500910080008000000080000000CC +:108C0000000000000000000180050002000080005C +:108C10008000800000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C300000000000000000000002000580000000AD +:108C40000000000000000000010100010000010020 +:108C50000001000000000000000000010000000012 +:108C600000020001000000010100010100000001FC +:108C7000110108A10482090040000400080002005C +:108C800000000000000000000001C000200184007E +:108C90000200C0000400020090000000000000007C +:108CA00000000000000000000000000000000000C4 +:108CB000000000000000000000009001908284820B +:108CC000900000000000000000000000000007000D +:108CD0000000818100E007000000000000000700A4 +:108CE0000000000000E0070000000000000000009D +:108CF0000000000000E007005000000000E000005D +:108D000000000000000000000000000000810000E2 +:108D1000070000000000000000000000000000004C +:108D200000000000480000E000000000000000001B +:108D30000000000000000000000000000000000033 +:108D40000700828200000000000000000000000018 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D70000000000000000000000000003F303F3015 +:108D80000000000000000000000000000000E6E617 +:108D90000066000000000000080000000000000065 +:108DA00000000000000000000000000000000000C3 +:108DB0000000000000000000000020004000000053 :108DC00000000000000000000000000000000000A3 -:108DD0000000FFFF0000666600003C3C0000FF0052 -:108DE00000003C3C0000FF00000066660000000040 -:108DF00000006666000000000000F0F000006666FB -:108E0000000000000000F0F00000666600000000B6 -:108E10000000000000000000000000000000000052 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF00000000000000000000000000000006F6F95 +:108E000060600000000000000000000000000000A2 +:108E1000F2F2006600000000080000000000000000 :108E20000000000000000000000000000000000042 -:108E30003CE400E40000000000000000000000002E +:108E300000000000000000000000000020004000D2 :108E40000000000000000000000000000000000022 :108E50000000000000000000000000000000000012 :108E60000000000000000000000000000000000002 -:108E700000000000000000000000000000000000F2 +:108E70000000000000000000021020000088100424 :108E800000000000000000000000000000000000E2 :108E900000000000000000000000000000000000D2 :108EA00000000000000000000000000000000000C2 :108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED00000000000000000000F0F000066660000A8 -:108EE000666600000F0F0000666600000F0F0000AE -:108EF000666600000F0F0000666600000F0F00009E -:108F00000F0F000066660000FFFF00003C3CFFFF03 -:108F1000F0F0000000000000000F3C3C00000000EA +:108EC0000000021020000088108400000000000054 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000CFCF24E700000000000000000000B8 +:108F10000000000000000000000000000000000051 :108F20000000000000000000000000000000000041 :108F30000000000000000000000000000000000031 -:108F400000000000030B0000000000000030003FA4 -:108F50006F6F0CFC0000000000000F0F0000666641 -:108F60000000666600000F0F0000666600000F0F2D -:108F70000000666600000F0F0000666600000F0F1D -:108F800000000F0F000066660000000000003C3C7F -:108F9000FFFFF0F0000000000000000F00000000E4 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F8000000000000C0C24E70000000000000000BE +:108F900000000000000000000000000000000000D1 :108FA00000000000000000000000000000000000C1 :108FB00000000000000000000000000000000000B1 -:108FC000000000000000030F00000000000000305F -:108FD000003F60600CFC00610006002D120240E3BF -:108FE00080048021920240E38006002D920240E33B -:108FF00080008021920240E3800080219202408222 -:1090000080000020920240E380008021920240E331 -:109010008002802D8202000005610A26050D00A84D -:1090200000610006000D00000000000000000000CC -:10903000000000000000000000610006000D0000BC -:1090400000610002800D00000061003E000D000084 -:10905000006100038001000000000000000000002B -:109060000F553C55202FE0EF0000000000000000ED -:10907000FC0C55550F3FFF3FFF0F3C0F202F707F1B -:109080000000000000000000FF550F55AAF0AAF0F4 -:109090000000000000000000000000000000003C94 -:1090A000003C000000000000002000000000000064 -:1090B000000000000000000000000000000000FFB1 -:1090C000F0F0282828280000000000000000F0AA86 -:1090D000F03C00FF00000000000000000000010064 -:1090E00000000F553C55202FE0EF00000000000469 -:1090F0000004FC0C55550030F030000F3C0F202FC1 -:10910000707F000000000000000000550F550000B7 -:10911000FFFF000000000000000000000000000051 +:108FC00000000000000000000000000000000000A1 +:108FD00000000000000005610A0E050D00A0002140 +:108FE000002F800D00A005000A08050000A0056103 +:108FF0000A0F050D00A000610006000D00000061D1 +:109000000006000D000000613007000D00000000A8 +:109010000000000000000000100000280000000018 +:10902000A0000000000000000000000000000000A0 +:1090300000610007800D000000000000000000003B +:1090400000610006009D000000000000000000001C +:1090500000000000000000000055AAFFCFCF0C0C5C +:109060000000000000000000000000000000000000 +:1090700000000000555555553C000100000000005F +:109080003C000F0000000000000000000000000095 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C0000000000000000008000200000000000096 +:1090D00000000000000000000000D2D2D2D2D7145D +:1090E000D714000000000000000000000000000095 +:1090F000000000000000C5C553C5000000000000CE +:1091000000003C000F000000000000000000000014 +:10911000000000000000000000000000000000004F :10912000000000000000000000000000000000003F :10913000000000000000000000000000000000002F -:10914000AAAA3C3C0505AF05000000000000000095 -:10915000F0AAF03C007F0000000008003C2D3C3CE1 -:1091600000000000FFFFFFFF0C0CFCFC00C000C073 -:1091700000000000550F550F3A0A3AFAFF0F550F3D -:109180003AFA3AFA0000000000000000FCFF0CFF71 -:10919000A028F57DFF0F550F000000000000000023 -:1091A0000000F2F2707000000000000020200000BB +:109140000000000000000000000800020000000015 +:10915000000000000000000000000000000000000F +:1091600000000000C3AA0000000000000000000092 +:109170000000000000000000CF0F0C0F3C000C0CA2 +:1091800000F000AA00000000000000000000000045 +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF :1091B00000000000000000000000000000000000AF -:1091C0000000AAFF3CF0FF003C3C00000000000053 -:1091D00000000000000000000000000000003C3C17 -:1091E0003C3C00000000FFFFFF7F0CFC0CFC00C0BB -:1091F00000C000040000FF0F000F3A0A3AFAAA0F5D -:10920000000F3A0A3A0A0000000000000000FC00CB -:109210000C00A028F57DAA0F000F00000000000040 -:1092200000000000F2F2707000000000000020203A +:1091C000000000000000000000000000000000009F +:1091D000000000000000000000000000000000008F +:1091E000000000000000C3AA3C3C0000000000009A +:1091F00000000000000000000000CFAF0C053C00A4 +:109200000C0C00F000AA00000000000000000000AC +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E :10923000000000000000000000000000000000002E -:1092400000000000AA003CF00F0F55550000000080 -:1092500000000000000000001000000000001000EE -:109260000000100010051000400020000000000069 -:1092700000088410C0000000400020000000200012 -:1092800000008800C00084002000200000000000D2 -:109290000000000000000000880020000000040022 -:1092A00000034000040040058480200020000000EE -:1092B0008800020084008800C100040020800000B3 -:1092C000200084002000200020002000208090004A -:1092D0002008000040002040000888002004000012 -:1092E00020840000000000000000100000000500C5 -:1092F000000000000000000010000000000000005E -:10930000000000000000000000000000000000005D -:109310000000000000904000000800000000000075 -:1093200000000000C00040000040001000000000ED -:1093300000000000C0000000000008020002004021 -:109340000000040200020000000000000000000213 -:1093500041000001400200004140100240000000B6 -:1093600000040902040200000000000000000000E8 -:10937000000000020100010001802008008001803F -:10938000208020000000000000000010000000000D -:10939000000000880000000000000000000008003D -:1093A0000010001000000000000000050800000090 -:1093B00000008400009084100009082008090000C3 -:1093C00000000800008901000800001008001000DB -:1093D00040000009108282000200A1040210000077 -:1093E00000000400031000080008000800840008C2 -:1093F00000000084008420102000200480900004DD -:10940000200480048000001000100010000000887C -:1094100000000088002000900090009000080000EC -:1094200000000000000000000000000000008000BC -:10943000000000000000000400000000000180089F -:1094400020000000000000400800000000000200B2 -:1094500080008000040080090008008820052004A6 -:1094600000000000030008080021002000000003A5 -:1094700000008800880000084088848004880884F0 -:1094800010800080001000040000000000000800B0 -:1094900000000000000004000000000008000005BB -:1094A00000000000000000000000000000000000BC -:1094B0000000000000004000900040000000000894 -:1094C0000000000040030000210000000000000038 -:1094D0000041040000000400000001000000010041 -:1094E00084000800044100024000008400200000C5 -:1094F000001000000084080004000404000480043C -:109500000021000400040000000100000000000031 -:1095100000000000000000008000000008000000C3 -:109520000000000000000000030000000000000038 -:1095300000000800008400820000000800004100D4 -:109540000000000000000000000088000000000093 -:1095500000000000400000A00000111040020008C0 -:1095600020001000410000000011800008000800E9 -:1095700008002000000000000800000000000800B3 -:10958000000000800000000000000000000000005B -:1095900000000000100000000000040000000000B7 -:1095A00000000000000000000000080000000000B3 -:1095B000000008000800000000000000000000009B -:1095C000000084004000102002000000000008009D -:1095D0000040820082001040820000400500000030 -:1095E0009000C0090004001188401000000900002C -:1095F000000000004000000000000000001000001B -:109600000004000000040000000000000000000052 -:1096100000000000000000000000000080000000CA -:10962000000000000000000000000000000000003A -:1096300000000800410000000010000000000000D1 -:109640000000000800008000000080000000000012 -:1096500010004000100010009000000000004000CA -:109660000090000040040000000000000000000026 -:10967000002000000000000000000000840800003E -:10968000009020800000008000002000008000800A +:10924000000000000000000000000000000000001E +:10925000000000000000000000000000000000000E +:109260000400040804000400000020000000C00006 +:1092700000002000200020000000880020004000A6 +:109280002005200020002000000020000000040035 +:109290008800200020000080000001002080C00025 +:1092A000000320002080200020008800200088008B +:1092B0008800208020002000028000800000000044 +:1092C000A010100020801080898800052000400038 +:1092D00000000000C0002000A00003001180858471 +:1092E000038400000000000000040000008200A0D1 +:1092F00010000000000000000084000000000404D2 +:109300000004000000000000100040000002000007 +:1093100010400000408440000004400020C02104B0 +:109320000000000040024004000200004000000075 +:109330000002408240204002400000200004000063 +:1093400000004100C0000008C0041004000000003C +:1093500000002100040000000000400084400220C2 +:109360000440044100000041000000000000000033 +:1093700000000400000000000000000900000000E0 +:1093800000000200400500000000001000048400FE +:109390000000020000000000000020800004000027 +:1093A00000000200000000000000040000000000B7 +:1093B000000000000400000000100004000008008D +:1093C0000200000000000200A000000000000000F9 +:1093D0000000000000008200000000000010820079 +:1093E00000000400001000880000000800000000D9 +:1093F0000008000000000408000000080000410010 +:10940000400000000088820800880210000004006C +:109410000484000000000008048209088004000998 +:1094200000080000000000000484000000000408A0 +:109430000000000000000000000204000009040415 +:1094400000080408000400820208000800080084E4 +:1094500000000000001002000010049004840004CA +:1094600004080008000000000008000000000000E0 +:1094700000000005400082001010040200000000FF +:109480000400000000000000900000000000C00880 +:1094900000200000000000000003200040009000B9 +:1094A000000000040000C088000000000020100040 +:1094B00084000000100588000800000841800400B6 +:1094C000C108030000000000100000040021020099 +:1094D0000000000040004000820000000021000069 +:1094E000000800024000200000000004000000C04E +:1094F0000000000000000000000020080008040038 +:109500000008030000080002080003A0000000009B +:10951000210011820000030008A0008200A00000CA +:109520000008000008854100000400000000000061 +:1095300000080000000004000000000000001020EF +:109540008000200002000000000008000001000070 +:1095500000000000000000000300410808000000B7 +:109560000000008811040004800008A00000000032 +:1095700000000000C0008400000008000800000097 +:10958000000000001000000088000000040004003B +:10959000040000000000880000000000000000003F +:1095A0000000080020400000C0800800000000000B +:1095B0000000000082000010000900000000000010 +:1095C0004000002082000000000008001000080099 +:1095D00000200800080008001000080010008200A9 +:1095E0000809820082000000000082008241000021 +:1095F0000800000000000000000000004000000023 +:10960000000000001000000000000000000000004A +:109610001100000000000000050000000000000034 +:109620000300400000088000040000040000000067 +:1096300000000000000000000000008800000000A2 +:10964000400080000085000000000084000400004D +:1096500000000000000000000000000020000800E2 +:1096600020000000000000000000000000000000DA +:109670000000A0000000000000000000000000004A +:1096800000000000000000000808000000000800C2 :1096900000000000000000000000000000000000CA -:1096A00000000000000000400000000000008200F8 -:1096B00000000000000000080000900000002004EE -:1096C0000005000300000000820000000000000010 -:1096D000108800030000C000000200000000A0008D -:1096E00010820800080020000000000000000100B7 -:1096F00010A100A0040200A0002011000000110031 -:109700001188032083200304050440008000000426 -:10971000000400000800080000C000000000000075 -:109720000000000408004020400008000000000085 -:1097300000000000000021000001210000100000D6 -:109740008001000000000000000000000000000098 -:109750000000004000000004000000004020100055 -:109760000000800304000084800421000300030043 -:10977000409011020000000000000000900404006E -:109780008800900040000008000000000000002059 -:1097900000000000000000020000000000000000C7 -:1097A00000000000004100000000000000008800F0 -:1097B00000008203000000000000000084000000A0 -:1097C0000021000000080008000000000021000047 -:1097D0000000000000000000000010000000100069 -:1097E00000000100410040020004000005000000EC -:1097F000000800000000000000000000200000043D -:1098000000822000000400002000000000C00000D2 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000080000000000000000000020 -:109840000000000000000000000000000000000018 -:109850000000000000000000000000000000000008 -:10986000830000004002C00080C14100020084006B -:1098700000400900000020820000000000000000FD -:109880000000000000000000009183A004C082409E -:1098900000018200820100010000000000000000C1 -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000100000001A6 -:1098C000000100000000840000008800000000008B -:1098D00008000100000800000088000000000000EF -:1098E0000000000000000400000010004000000024 -:1098F000900100000100A000000000000000000036 -:109900000000000000000000000040110200804143 -:109910000005001100090002002000000000000006 -:109920000000000000000000000000000000000037 -:1099300000000000000000000000000000410009DD -:1099400000100010000020008000000080000000D7 -:1099500000000000100000001100000000000000E6 -:10996000000000000000040000000000000580115D -:10997000000380030000020000000000000000005F -:109980000000000000000000000000004180000313 -:1099900011C0030341000900114000030000000052 -:1099A00000000000000080000000800000000000B7 -:1099B00000000000000000000000000000000000A7 -:1099C00080000000800011002100020004850000DA -:1099D00000000000800000008021808080000000E6 -:1099E0000008000000001000030005004182800014 -:1099F00020001111C000400003001100030000000E -:109A000000000000000000000000000000008404CE -:109A1000900101C0A12100A0000001000001000090 -:109A20000000000000000200100010009000000084 +:1096A0000400000000802003000000000008000506 +:1096B00000000005000000000000040000000000A1 +:1096C00000001100020000000040C00000028800FD +:1096D000000020110000000000080000000500004C +:1096E0000000900000000000840000000000000066 +:1096F000A000030440C000C00800000000000000FB +:109700000084000000900000004005A0002005201B +:109710000500040005000000000000002000118882 +:1097200000900000000211108008000000000000FE +:109730000008000000000000000000000000000021 +:1097400000000000900080000000200010002000B9 +:1097500000000000800000C0000011010090000027 +:10976000000000000588090000000004400400001B +:1097700000000500002100210000000000000000A2 +:1097800000000000000000030000002100000000B5 +:109790000000820000000000000000000000000047 +:1097A00000000000000000000000000000000000B9 +:1097B000000200000000000000080000002100037B +:1097C0000000000800004000000800000000000049 +:1097D00002030240004000000004000800000000F6 +:1097E00000020000000020009021000008002080FE +:1097F0000000008000800000000000000004000065 +:109800000000000011000000000000000000000047 +:109810000000000000000000000000000000030045 +:1098200000000000000000820000000011000000A5 +:10983000000000000000000000080000000002001E +:1098400000000000000020000000000000000000F8 +:109850000000800080000001000000010001000005 +:1098600000000000000000000004000000000000F4 +:10987000800405000304090400000000000000004B +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000001C7 +:1098A0000000000000000000C000000000000800F0 +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000000000000040C0A0888900E7 +:1098D000000000C010000100000201C14001410071 +:1098E0000000000000000000000000000000000078 +:1098F000000090C00040014082880000000000008D +:109900000000000000000000000000000000000057 +:1099100000000000000000000000004000200003E4 +:109920000008000000000000000000000000090026 +:109930000000000000001000000000000000000017 +:10994000040000000000000000000000808089800A +:1099500083000000008000000300008009C10210A5 +:10996000830500030000000000000000000000006C +:109970000000000000800000400000000000000027 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B0000000000000100000001100000000000086 +:1099C000000000000000000000000000000009008E +:1099D00009000211C1110010800000008000410048 +:1099E000A0000289C111000000000000000000007A +:1099F00000000000000000080002000880000000D5 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000000036 :109A30000000000000000000000000000000000026 -:109A40000000100000000800002001000000008855 -:109A50002000900020000200000010881002C000CA -:109A6000000000000004000001100000000001A13F -:109A700088009100910104000400A00090002000E3 +:109A40000000000000000000000000000000000016 +:109A5000010002880001C188000110000000C00060 +:109A6000008888000091C100000000000000000094 +:109A70000000000000000000400110019000C00044 :109A800000000000000000000000000000000000D6 -:109A9000000301C004A08341000101008201000114 -:109AA00000000000000000000000000000000000B6 -:109AB00000000000000000000000000000000000A6 -:109AC0000000000000000100000000000000000095 -:109AD000000100040088009000C1000000000000A8 -:109AE0000100000000000000000000000000000075 -:109AF000000000400082214000040000000100013D -:109B00000001000000000000000000000000000054 -:109B1000000000C0020085080211000210090020A8 -:109B20000011000000000000000000000000000024 -:109B30000000000000000000000000000000000025 -:109B400000000000000000000900000000200002EA -:109B5000000400110020008000A000900020000000 -:109B600000000900000000000000000000090009DA -:109B70000002000000800080080020800005000333 -:109B80000040400500000000000000000000000050 -:109B90000000000040828085050003400085090028 -:109BA0000200034000000000000000000009000067 -:109BB00000000000000000000000000000000000A5 -:109BC00000000000000000000080000000004120B4 -:109BD0000400410010000000000000000000000030 -:109BE0000080000000000000000000000000418034 -:109BF000000000004041008400000000000500005B -:109C0000000000210005000000000000000000002E -:109C100000000000000000410882404004010040B4 -:109C20000000010000010000000000000000000032 -:109C30000008008800000000000000000000000094 -:109C40000000000000000000000000020002000010 -:109C5000010400000000000000000004009000006B -:109C600008008882080010008800A000C0000400DE -:109C7000018800000000000100C000A000100000EA -:109C80000000008400A100000000000000000000AF -:109C90000000000000000000818100E007000021BA -:109CA000810000E000000000000000000000000053 -:109CB000008100000700000000000000000000001C -:109CC00000000000000000000000000000E00000B4 -:109CD0000000000000E0000000000000000007009D -:109CE0000000000000E00000000000000000000094 -:109CF0000000500001E000000041810000E007008A -:109D000084000000000000000000000000000000CF -:109D100000000000000000000000B4BEB4BE00FF60 -:109D20003C3C0000000000000000000000000000BB +:109A900000000000000000000000000000000000C6 +:109AA00000000100000000000000000000000000B5 +:109AB00000100008008801200000020000000000E3 +:109AC00000000000C00000000000000000000000D6 +:109AD000000000000000020101C1000000080000B9 +:109AE00000C088000001008501C1000000000000E6 +:109AF0000000000000000000000000100002004014 +:109B000000C0000000000000000000000000000095 +:109B10000000000000000000000000000000000045 +:109B20000000000010000300000000000000000022 +:109B3000000000000000000008000000000000001D +:109B4000090000000000800000000000000000008C +:109B50000000000008100002800509C1000000801C +:109B60000000008080030210418311C1000000004A +:109B70000000000000000000000000000000008065 +:109B80000000028000000000000000000000000053 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB0000000000000000000000000000040000065 +:109BC0000000000000000000000000000000000095 +:109BD0000000000000001002024110009009800502 +:109BE000000080000000C1200509200020090000BD +:109BF00000000000000000000000000000008005E0 +:109C000000050080000000000000000000000000CF +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C50000000000000000000001100010100900061 +:109C6000C000000008000000C190000101000001D8 +:109C700000000000000000000000000000000000E4 +:109C8000C000404090020000000000000000000002 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB0000000000000000000000000E000000000C4 +:109CC000810000E0000000000000000000E0000053 +:109CD00042000000000000000000810000E00700DA +:109CE0004200810000E000000000480000E00000A9 +:109CF0000000000000000000000000000000000064 +:109D00000000818100E00701000000000000000069 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 :109D30000000000000000000000000000000000023 :109D40000000000000000000000000000000000013 -:109D50000000000000000000000000000000000003 -:109D6000FFFF00003F3C555500000000A8E9BCFD86 -:109D700000000000000000000000000000000000E3 -:109D800000000000000000000000000000000000D3 -:109D9000000000000000000000000000141E141E5F -:109DA000F0F0F0F0000000000000000000000000F3 +:109D50000000000000000000000000003C3C3C3C13 +:109D60000000AAAA0000F0F00000F0F00000AAAA8B +:109D7000000000FF000000000000000000000000E4 +:109D800000000000FF00F000FF00E8FF00000000FE +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 :109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000000000000000093 -:109DD0000000000000000000000000000000000083 -:109DE0000000CBCB30003FFF55550000000080C184 -:109DF00094D50000000000000000000000000000FA -:109E00000000FFFFFFEF0000000000000000000066 -:109E100000000000000000000000000000005F1EC5 -:109E20004B0A2D2D2D2D0000000000000000000029 -:109E300000000000000000000000F5F00500000038 +:109DC0000002000E00000000000000000000000083 +:109DD00000000000000000000000000000003C3C0B +:109DE0003C3C0000AAAA0000F0F00000F0F00000E7 +:109DF000AAAA000000FF0000000000000000000010 +:109E00000000000000000000F0000000E8FF00007B +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 :109E40000000000000000000000000000000000012 -:109E500000000000AFAF0F0F000000000000000086 -:109E60000000000004000000FFC3FFC30A0005005B -:109E700000000000000000000000000000000000E2 -:109E800000000000FFFFFFFF000000007D417D415A +:109E50000000000000000000000000000000000002 +:109E6000FF0000000F0F00003C3C00000F0F00003F +:109E7000FFFF0000F0F0FFFF000000000000000006 +:109E80000000000000000000F00030302828FF5FD4 :109E900000000000000000000000000000000000C2 -:109EA0005F1E4B0A7D7D2828000000000000000096 -:109EB000000000000000000000000000C0C0000022 +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 :109EC0000000000000000000000000000000000092 -:109ED00000000000000005050F0F0000000000005A -:109EE00000000000000000000000FFC3FFC30A00E4 -:109EF000050000000000000000000000000000005D -:109F0000000000000000AAFBFBFB000000003F3F38 -:109F1000030300000000000000000000000000003B -:109F20000000006100288001000000610000800145 -:109F300000000000000000000000000000300000F1 -:109F40000000000000000000000000000000000011 -:109F50000000000000210006000D00000061000666 -:109F60000001000000610006004D000100613007A3 -:109F7000000900050000000000000000004000068D -:109F8000C00D000000610006C01500000061000661 -:109F9000000D0000000000000000000000000000B4 -:109FA000000000005F5F505014BE14BE35FF35FF47 -:109FB000202F707F00000000000000000000000063 +:109ED0000000000000000000000000000000000082 +:109EE0000000FF0000000F0F00003C3C00000F0FBF +:109EF000000000000000F0F0FFFF00000000000084 +:109F000000000000000000000000F00030302828B1 +:109F1000F5550000000000000000000000000000F7 +:109F20000000000000000000000000000000000031 +:109F3000000000610006000D0000000000000000AD +:109F4000000000610007000D000000610007800DA7 +:109F50000000000000610007000D0000000000008C +:109F60000000000045628A0F852092A240E380072E +:109F7000802D920240828001802082020000000039 +:109F80000000000000000000000000001061202F11 +:109F9000804D0408000000000000000000000000E8 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 :109FC0000000000000000000000000000000000091 -:109FD00000000000000000000000000000000A0077 -:109FE000E1E3C0A0CFAF000000000000003C000093 -:109FF0000000C3C3C3C30000000000000000000055 -:10A000007D7D0F0F0F0F000000000000000000001A -:10A010000000F000F0000000000000000000000060 -:10A020000000000000005C5C5C5C1414BEBE3500E7 -:10A030003500202F707F00000000000000000000AD +:109FD0000000000000000000000000000000000081 +:109FE000000000000000FCFCFFFC0000000000007E +:109FF00000000000000001014100000C0808000002 +:10A000000000000000000000000000000000000050 +:10A010000000000000000000000000000000000040 +:10A020000000000000000000000000000000000030 +:10A030000000000000000000000000000000000020 :10A040000000000000000000000000000000000010 :10A050000000000000000000000000000000000000 -:10A06000EB40000200A00FAF000000000000003C29 -:10A0700000000000C3C3C3C30000000000000000D4 -:10A080003C3CFFFF0E0F0E0F000000000000000020 -:10A0900000000000B000F000000000000000000020 -:10A0A0000000000000000000AFAF050500FF3C3CD1 -:10A0B000FC550C553A3A3A3A000000000000000006 +:10A0600000000000000000003C3CFF3C003F2A2AAA +:10A0700000000000000000000303C300000F0A0AF4 +:10A0800000000000000000000000000000000000D0 +:10A0900000000000000000000000000000000000C0 +:10A0A00000000000000000000000000000000000B0 +:10A0B00000000000000000000000000000000000A0 :10A0C0000000000000000000000000000000000090 -:10A0D00000000000000000000000F3000CFF000082 -:10A0E0000000000000003CFF3CF000000000000009 -:10A0F0000000000000000000000000000000000060 -:10A100000000000000007D7DF050CFFF00000A5FDE -:10A11000AAFF0000000003C2C3C20000000000004C -:10A12000000000000000000000003C3C3C3CAAAAEB -:10A13000AAAAFC550C550AFA0AFA00000000000011 +:10A0D0000000000000000000000000000000000080 +:10A0E00000000000000000000000000000000A0A5C +:10A0F0000C0C0000000000000000003C000F0000FD +:10A10000000000000000000000000000000000004F +:10A11000000000000000000000000000000000003F +:10A12000000000000000000000000000000000002F +:10A130000000000000000000000008000000000017 :10A14000000000000000000000000000000000000F -:10A15000000000000000000000000000F3FF0C0001 -:10A1600000000000000000003C003CF00000000087 -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000002828F050CF3C000034 -:10A190000A5F0A5F0000000003C2C3C200000000A3 -:10A1A000400000104102014000042009C0000000EE -:10A1B00000002000000000004000040000004000FB -:10A1C00020000000200000004000200000004000AF -:10A1D000000020000000010021000800000304002E -:10A1E00020002000400000008400200010008800B3 -:10A1F000880000008200880001000000200020008C -:10A20000200020002040080002008800009020006C -:10A2100000008800408521008900890021804000DD -:10A22000000000000000200120C1000100004000EB -:10A23000000000000000000040000000000040009E -:10A24000000000000000400000000002000040008C -:10A25000000000000000400008000400C1000000F1 -:10A2600000004000000080000000000040000000EE -:10A27000000020000000040000000800000004406E -:10A28000000240008400C101800080000000001135 -:10A29000C0404100000041024000404040C0400436 -:10A2A0000000000000000805000490832004000561 -:10A2B000000000000000000000000000000000009E -:10A2C0000000000000000000000000000000020884 -:10A2D000000000000010001000000000000000005E -:10A2E0000000000900000000000000000000000065 -:10A2F0000000000000000410040000001000000036 -:10A30000000082000800000002009000020090009F -:10A310000310000003020200009000000080000013 -:10A3200000020000000000000088001100048811F5 -:10A3300000A0001000100010001000000400040035 -:10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD -:10A3600000080000000000000000000800000008D5 -:10A370000500000804000000000020100400000098 -:10A3800004001008000000000000030800000004A2 -:10A39000000008850400400100100020000000407B -:10A3A000000009110000000004000400000001008A -:10A3B00041002100000010001000A0210000002139 -:10A3C00000000008900000000000000800000008E5 -:10A3D000000000000000000000000000000000007D -:10A3E0000000000000000000000800000000000065 -:10A3F00000419000900800000000000000000000F4 -:10A400000000000000000400000005000010000033 -:10A41000000000100000200000800000A000A0004C -:10A42000000090000802000000000482000000000C -:10A430004004200088000000000000000000000030 -:10A440000000030000000000000000000000000009 -:10A45000000000000000000000A00000000000005C -:10A460000000000003000000110040010000000097 -:10A47000030000004100410005000000000000A0B2 -:10A4800000000000000000000000000008000003C1 -:10A4900000000000410103A08000000200000990BC -:10A4A0001020000000080001000000000000004132 -:10A4B0000000000408000000000000000000000090 -:10A4C000000000000000000000000000000000008C -:10A4D0000000000000000800000000000000000074 -:10A4E00008040000000000000000100004008400C8 -:10A4F0000000080000000000000000000000000054 -:10A500001021200000000800C0002000000008000A -:10A5100082808440080490408200004008090004C2 -:10A520004040000900110009018500000000000002 -:10A530000000000000A1000000000000000000007A -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000080000000000F3 -:10A560000000809000000000000000000082000059 -:10A5700000000000000000000000000010000000CB -:10A58000000000082000000405000000800000001A -:10A5900000000040030000000588400000000000AB -:10A5A0000000000000404100001020209000040046 -:10A5B00004000400C180010400800080000000004D -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E000000000000800000000000000000004035C -:10A5F00001000000404000000000000000200400B6 -:10A6000000000000000002009000842040000000D4 -:10A61000C0000000820010000809820082002100B2 -:10A620000100900008800000000000004080002031 -:10A6300000000000000020102001000200022100A4 -:10A6400000000000410021000000000000000000A8 -:10A6500000000000000000000000000000080000F2 -:10A66000000000000000800000000000000000006A -:10A6700000901000040000000000000000000090A6 -:10A68000040000000300000000900090000404009B -:10A6900000000004000000000000800000002120F5 -:10A6A0002000400000000020000040000400800264 -:10A6B000020000009000000008000000000002807E -:10A6C0002011002000000020000000000000000019 -:10A6D000000000000000000000000000000000007A -:10A6E0000800000000000000010000000000000061 -:10A6F000000000000000000000000000000000005A -:10A7000000000000000000000000200000008400A5 -:10A710000000000000000000090000809000080018 -:10A720000800080084000000022000000040000033 -:10A730000082000000000000000080000000000017 -:10A740000004000000000000000000000000000005 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000008080000000000D9 -:10A7700008000000000000000000000000000000D1 -:10A7800000000800000000000008000000040000B5 -:10A790000000000000000040000020000010000049 -:10A7A00000100000000000840000400102040020AE -:10A7B0000040210500000000000000000101080128 -:10A7C0000800000100000000000000000000000080 -:10A7D0000000000000000000000000000000000079 -:10A7E000000000000000000000000000C1A00810F0 -:10A7F0000010022000000000010020000000000006 -:10A800000000000000000000000000000000001038 -:10A81000002000020008118900918491001010822C -:10A82000009000820808A001000108010200010058 -:10A830000000820100000000000000000000114044 -:10A8400089202041000200000000000000000000FC -:10A8500000000000000000000000000000000000F8 -:10A860000000000000000000000000000000108058 -:10A870000000008000000000000003000000000055 -:10A8800000000000000000000000000000000000C8 -:10A89000008000000000000011912121A011002083 -:10A8A0000000000000000080001120210020800036 -:10A8B00020020510400800200000000000000000F9 -:10A8C0008382A1090010A103000000000000000025 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F00080000010808000000000000000000000C8 -:10A900000000000000000000000000000000000047 -:10A9100000000000000000000000118021809180F4 -:10A920002090000000008000000080008000804037 -:10A930000002200003002000C19000000000000081 -:10A94000000008C009000808030100000000000022 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A970000000A00010014082200000000000000044 -:10A9800000000008000000000000000000000000BF -:10A99000000000000000000000000000090209C0E3 -:10A9A000A1A0088920008200A0000000022004006D -:10A9B000A0010001880290000000050900000000CD -:10A9C0000000000000000300C001000100000000C2 +:10A1500000000000000000000000000000000000FF +:10A1600000000000000000000000000000000000EF +:10A170000A000C0000000000000000000028000A97 +:10A18000AAA03C3000000000000000000000000019 +:10A19000000000000000000000000000200020007F +:10A1A000200089002080848000000084400020007E +:10A1B0004002100040000000040084004000200025 +:10A1C000200040002000200040000100048020808A +:10A1D00000002000000284402080040000030400EE +:10A1E000000020002008200020008804880088113A +:10A1F000200004042140100040008800400020009E +:10A200008800200020802000400088048204C000D4 +:10A2100020008200200489001080014121000000FC +:10A2200000404100080000204020200400201002CF +:10A230000002A10190024190400221000000204054 +:10A240000000000080004100000000400800A02045 +:10A2500000201100410020010001000809C0000099 +:10A2600000000000000241C000001000004000009B +:10A2700021004182000302030000040200000000EC +:10A280000000000040044120400009004100090096 +:10A2900000400000009000400400A02004000400E2 +:10A2A00000000000080000000000000000000000A6 +:10A2B000010040000200200000000000000000003B +:10A2C0000000000000008300000808801000020960 +:10A2D0000300000001800090400001000100039095 +:10A2E000000000000000000000020000010000006B +:10A2F0000110000000008809C1C002000000000039 +:10A300000808000000410200000002008200020074 +:10A3100000000000010009000140044083400800E3 +:10A3200000100000000004004004000400080010B9 +:10A330000010100084100000000800080010000049 +:10A340000008000004000000080804008040000825 +:10A350008084200004002004000580100284100086 +:10A36000081000000002000000000085041020001A +:10A37000008820084000048800000241000000849A +:10A3800040000000400000000000000400C0000089 +:10A39000400000C00010200020002000A000200984 +:10A3A00000080008840990000010840000000000EC +:10A3B0000408000000004000890800000000880038 +:10A3C0001000040000002000000000000000000059 +:10A3D0000000900084002000010085000021004062 +:10A3E000100001200000000082009000000800041E +:10A3F00040104000080020002000000500A190004F +:10A400000008000000000002000000000020000022 +:10A410000021100000000000030000008400010083 +:10A420008821000000210088090000A02100000010 +:10A430000000800000000500808240000804000049 +:10A44000410800000000000004000090000000002F +:10A45000000000002100008480000400200000A013 +:10A460000040800008900000000000820000000012 +:10A470000000000000008000800080000000100448 +:10A4800000200400001000200408000800000091D3 +:10A49000090008000000100000008400000009000E +:10A4A0002000000005000000000000000000000087 +:10A4B000000000000000000008000000000208008A +:10A4C00000000008080000000000000000008200FA +:10A4D000000000000000C010040085110800820088 +:10A4E00000040000C010080000008200820082000A +:10A4F000840000040000080000050000C0000041C6 +:10A500000000000208000800A00000000008000091 +:10A51000000084000000C0000800080000000004E3 +:10A5200040002000002020001080000000000000FB +:10A53000080000000000000000080000000000010A +:10A5400021000000000000000000000000000000EA +:10A55000030000044000030000A100822008000066 +:10A5600021A002000008000021000000000000C03F +:10A57000218803000000000000000000000000002F +:10A5800000000000000000000000000000000000CB +:10A590000000000000002000100000000008000083 +:10A5A00008000000C0001101A10080400000000070 +:10A5B000000000000000000000000000000000009B +:10A5C000080400000020000000000000040000005B +:10A5D00000000000002000000080C0A000009000EB +:10A5E0000084A108000300400000002000000800D3 +:10A5F000080010000003000801001005C000002141 +:10A6000000000000004000400000000008000000C2 +:10A6100000000000040000000000100082000000A4 +:10A6200010000000040010000000100020000000D6 +:10A63000000000000000000000000000000000001A +:10A6400040000001000000840000000000002140E4 +:10A650000000000000000000000000100010008258 +:10A6600000000002040800000000000000000000DC +:10A6700000000000000000000000020000000000D8 +:10A6800000000002400000890020040000002100BA +:10A69000040000000000004009200000000000004D +:10A6A000048800200000000080040400C100830032 +:10A6B000000020000000000800000000000008006A +:10A6C0000000000000000000080000000000000082 +:10A6D000000800000000080020000000040008003E +:10A6E0000000008000834000000200051010000000 +:10A6F0000000000040110000000000000000000009 +:10A7000000000008000001040240000000000008F2 +:10A710000000000000000000000000000000080031 +:10A7200000000000C0802000040040000004080079 +:10A730000000000000000000000000000000110008 +:10A7400000080000000000000000000000080000F9 +:10A7500020000000000000000000200000000000B9 +:10A76000800800000020002082000001000000009E +:10A7700000000000000000000000000000080000D1 +:10A780000000000008000000200080010000000020 +:10A790000000000000000000410000000004000074 +:10A7A00000002000000000200000000000000088E1 +:10A7B0001100000000000000000088000000000000 +:10A7C0000000000000000000000000000000000089 +:10A7D00000000000000000008800000008C0000227 +:10A7E0000010200800010100A0000000000100008E +:10A7F00000010000000000000000840000000000D4 +:10A800001100A00000000020009001400020000086 +:10A810000000000000000000000000000000000038 +:10A82000000000000000000000008200000003C1E2 +:10A83000A004000910090000000000000000000052 +:10A840000000000000000000000000000000000008 +:10A850000000000000000000110000000000008067 +:10A86000000000000000101110200903004000410A +:10A870000010000200000000000020008000000026 +:10A880000010081140080010000000000400000043 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000005000000A3 +:10A8B00082C100800503801000000000800080003D +:10A8C00000000000000000002080210020054190D1 +:10A8D0000000000000000000000080008000000078 +:10A8E00080008000800000000884A1008508910499 +:10A8F00000100000000080000000000000000000C8 +:10A900000000038088009000A0030008004100912F +:10A910000000000000000000000000000000000037 +:10A9200000000000000000000000020003000340DF +:10A93000082020000005C080C10320008800A0007E +:10A9400004000000008800000090001001000001D9 +:10A950000189000000000000000040001000840099 +:10A960002088880010008400880821102110200011 +:10A970009088000110000000C000000000000000EE +:10A9800000000020000810001000C001000100417C +:10A9900000020000000000000000000000000000B5 +:10A9A000000000880000000000000000000001100E +:10A9B000000100200990909011A0911100C000901A +:10A9C00000200020010000009000000000000000B6 :10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F00000000000901000100084C0A000000000C3 -:10AA00000001000000010000000000000000000044 -:10AA100000000000000090000000000088009090FE -:10AA2000000000101110C02000100090A0200002B3 -:10AA300000910020000800000100900000010000CB -:10AA400000000000000000414004854002030000B7 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000800000008090800000C6 -:10AA80000011001000030041000000000000000061 -:10AA900000000000000000000000000000000000B6 -:10AAA000000300000580212080000000000000005D -:10AAB00000C00008000800A000400420034100047A -:10AAC0000000000000000000859008114180A000F7 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000800400820000000050 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB200000004105900008801103000000000000B3 -:10AB300000000802038040801000408903090900DA -:10AB4000000800000000000000004003040588C069 -:10AB500009000000000000000000000000000000EC -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000040188100888A8 -:10AB80009000000000000000000000000000000035 -:10AB900000000000000000000000000000000000B5 -:10ABA0000000000001200288110211000000009046 -:10ABB0000090C000000100200004010001410002DB -:10ABC000000400000000000000000000000000E0A1 -:10ABD000000060060000000000000000000000000F -:10ABE0000000000000000000000000000000000065 -:10ABF00000000000000000000000000000810000D4 -:10AC000007000082000000000000000000000000BB -:10AC10000000000000000000000000000000000034 -:10AC2000000000000000810000E00000840000003F -:10AC3000000000005000821100E007040000004105 -:10AC400000E00700000000000000000000003C7869 -:10AC50003C3C00000000000000000000000000007C +:10A9E0000000000010020010000802C00001C100B9 +:10A9F0001000000000000000000000000000000047 +:10AA000000000000000000000001010100009000B3 +:10AA100010000000410000000000000000000000E5 +:10AA20000000000000000000000000000000000026 +:10AA3000000000000000900100214091052100006D +:10AA400000000000000010000000000000000000F6 +:10AA500000000000000000000000000000000040B6 +:10AA6000001100080020800000000080008008081D +:10AA70000220080802400000100000000000000052 +:10AA800000100040000200400010050310211008D3 +:10AA900000000000000008000000000000000000AE +:10AAA00000000000000000000000000000000000A6 +:10AAB000000300030008002020400020C085C041A2 +:10AAC0000000000000000000000000050000000081 +:10AAD00041201000200002050000000000000000DE +:10AAE00000000080000000000004000900000000D9 +:10AAF0002085091140000310000000000000000044 +:10AB00000000000000000000000021840208030093 +:10AB100000030010800000000000000000000000A2 +:10AB20000000000000040000000000000000000021 +:10AB300000000380030908000200C1080020000093 +:10AB400008000000009000880000000000000000E5 +:10AB50000000019001000000010000000000000062 +:10AB6000000000000010000800000001001100A01B +:10AB7000000000A000100020000000000010008273 +:10AB800000000000000000000000000001030008B9 +:10AB900001000001880020004000200000000000AB +:10ABA00000000000000000010000000000000000A4 +:10ABB00000000000000200000000000009A12021A8 +:10ABC0000088880000000000000000000000000075 +:10ABD00007000000810000E000000000000000000D +:10ABE00000000000000000000000000000810000E4 +:10ABF00007000000810000E00700000000000000E6 +:10AC000000000000000000000000000000008100C3 +:10AC100000E000000000000000E000004100000033 +:10AC2000000000000000000000000700000000001D +:10AC3000000000000000821100E0070000008841D1 +:10AC400000E00700000000000000C000CFFF00008F +:10AC500000000000000000000000000000000000F4 :10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000002000B4 -:10AC80000000008000000000000000000000000044 -:10AC900000000000000000000000000000000000B4 -:10ACA0000000000000000000FF7FFF7F0000E7249D -:10ACB000C3C3C3C30080008100000000181C181823 -:10ACC0000000000000000000000000000000000084 -:10ACD0003C3C3C3C00000000000000000000000084 +:10AC70000000C000FCFF0000000000000000000019 +:10AC800000000000000000000000000000000000C4 +:10AC9000000000000000000063606363000000002B +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC00000C3FFC3FF66FF0F00000000C0C3CFC377 +:10ACD0000000000000000000000000000000000074 :10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 +:10ACF00000000000C000BC5D00000000000000007B :10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD200000000000000000000000FF7FFF7F000027 -:10AD3000E724C3C3C3C300800000000000003C3C04 -:10AD40003C3C00000000000000000000000000008B +:10AD100000000000000000000000636060600000B0 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000999999999900F00000000000000016 :10AD500000000000000000000000000000000000F3 :10AD600000000000000000000000000000000000E3 :10AD700000000000000000000000000000000000D3 @@ -121593,493 +121593,493 @@ :10ADA00000000000000000000000000000000000A3 :10ADB0000000000000000000000000000000000093 :10ADC0000000000000000000000000000000000083 -:10ADD00000000000000000003C343C3D000000008A +:10ADD00040640024000000000000000000000000AB :10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE0000000000002000202C0000002000000000B6 -:10AE10000000000000000000000000000000000032 -:10AE20000000000000000202020E00000000FF6FA0 -:10AE30000F0FFFFF0000909080984AFF4AFF00002C -:10AE4000000099FF99FF00000000EFEFFFFF0000F6 -:10AE5000000000000000000000003C3C3C3C000002 +:10ADF0000404646400000000C9900000000000002A +:10AE000024E724E70000000090906060000000004C +:10AE100000000000000000000000FF6F9F0F1811ED +:10AE200018180000000000000000000000000000F2 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000F0F4200989EF8FE000076 +:10AE50000000426602260000000000000000000022 :10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000060006000000000000B6 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000C0000000096 -:10AEB000E7E70F0F00D900000000001808FF08FFA7 -:10AEC0000000000019FF19FF000000002020000012 -:10AED000000000000000000000610007000D0001FC -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000280000000019 -:10AF1000000000610006000D0000000000000000BD -:10AF20000000000000000000000000000000000021 -:10AF3000000000613003C0110000000000000000AC -:10AF4000000100610032C00D00000061003F0009F7 -:10AF500000A10000000000000000BFFF010000F79A -:10AF600008FF0000000000000000000000000000DA -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF90000000000000000000000800880000000021 -:10AFA00000000000000000000000000000000000A1 -:10AFB000000000000400C6C35555D7D700000000AC -:10AFC0000000000001000000C3C3C3C30000000074 -:10AFD000C0C0C0C00000000000000000FFFF000073 -:10AFE00000FF00FF00000000000000000000000063 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000008080000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000C3C3555514140000B8 -:10B0400000000000000000000000F505FFFF000008 -:10B0500000A028EB00C30000000000000000AFAF1C -:10B0600005050000000000000000000000000000D6 +:10AE70000000066606664000C0C00000000000003A +:10AE8000000003033F3F000000000000000000003E +:10AE9000000000000000000000000000FF6F9F0F96 +:10AEA0001818181800000000000000000000000042 +:10AEB0000000000000000000000000000000000092 +:10AEC00000000000000000000F0FDB00080E686E9D +:10AED000000000000000000005000A08050000A0B6 +:10AEE00000610006800D000000000000000000006E +:10AEF00000610006000D0000000020280090000105 +:10AF000005610A0F850D00A000610006000D000517 +:10AF1000000000610006000D0000006100058009CE +:10AF2000000500613007000D000000000000000077 +:10AF3000000000000008000000A000000000000069 +:10AF4000000000610A2D8001000105003429850000 +:10AF500000A1000000000000000000000000000050 +:10AF600000000F0FC35500000000000000000000AB +:10AF70000000000000000030003000000000000071 +:10AF80000000005F004B0051555100000000000020 +:10AF90000000000000000000207F343EFFFF5F50F3 +:10AFA0005D5DFF5D0000000000000000000000008B +:10AFB0000000000000000000000000000000000091 +:10AFC000000000000000000002000000000000007F +:10AFD0000C0C000F0000000000000000000000004A +:10AFE00000000000000055550000000000000000B7 +:10AFF0000000000000000000A000A0F00000000021 +:10B0000000000000A0FFB4FFFF5D555D00000000E0 +:10B0100000000000000000000000287D3C3CFFFF15 +:10B0200000005555FF550000000000000000000022 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000003002000000555524 +:10B050003C3C0C0C000F0000000000000000000051 +:10B0600000000000000000000000FFD700F000001A :10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B000000000000000000000FFFF0030CF75DF3F -:10B0C0000000000000000000FFF0FF000000000092 -:10B0D00096FF060FC00FFA000000000000000000FD -:10B0E0003C003C00030300000000000000000000E2 +:10B08000000000000000F0A0F0F582BEF3F3050020 +:10B090000A000000000000000000000000000000A6 +:10B0A00000340004D0DA00000000000000000000BE +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0003030F0F000000000000000000000000030 +:10B0E000000000000000000000000000FFFF00F072 :10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000CCFCF0C30CF5A -:10B14000208A0000000000000000FFF0FF00000067 -:10B15000000090F00000C00F0A0040000000400016 -:10B16000200400000000000000004000000000007B -:10B1700040008800000000000000200000002000C7 -:10B1800020008800000000000000200000000200F5 -:10B190002100200000000800020000020000000062 -:10B1A00000002005C1000000000001004000000078 -:10B1B000000000008800110020002000A100A10074 -:10B1C0000200000001000200010000004080200099 -:10B1D0008300A10020000000080000000000000023 -:10B1E000000000002100000000000000000000003E -:10B1F000000000004000000000000000000000000F -:10B20000400000000000000000000000400040007E -:10B21000C0004000000000008000800000004000EE -:10B22000000000000000400000000000400021007D -:10B23000000020002000200088000000000008001E -:10B2400020008004400008908000080021002002B7 -:10B2500089000400080010002000A1400000000048 -:10B26000900000000000000000000000000000004E -:10B27000000000002000000000000000001000009E -:10B280000000000000000000040000100808080989 -:10B29000000000100000000000000000001000008E -:10B2A0000010001008080000020000000000020961 -:10B2B000010010000000020000000000001000006B -:10B2C000002100800410080002000200080008208D -:10B2D0000800100000100090000000000000410471 -:10B2E00000000000000000080000008400000000D2 -:10B2F00000000000000000100000000000000040FE -:10B30000000004000400000800000000000000002D -:10B3100080000008000000000500000000000000A0 -:10B320000000000800000084001000000000000081 -:10B3300000104000000810000000000000000000A5 -:10B3400000000004001080841000800000008000D5 -:10B350000001040080080204040400004000020010 -:10B360008800000000000000000000000000000055 -:10B370000000880000000000080004000003000036 -:10B38000000000000000000000000000000020009D -:10B3900000000000040004000400000000000000A1 -:10B3A000000000000021000000000000000000007C -:10B3B0000400000004210000001082050000850048 -:10B3C000000004000021880090200000020000001E -:10B3D000008001800041000400040400000000001F -:10B3E0000000000000000000110000040800000040 -:10B3F0000000000000000008000000000000000045 -:10B40000000000000000000000000000000000003C -:10B4100000000000000000000000400000000000EC -:10B4200040000000000000900010000000400500F7 -:10B4300000000000000000000500100000000000F7 -:10B44000100040004000400000004001050483005F -:10B4500010844110081009000521410109C00000B5 -:10B4600000000800030000000000000000101000B1 -:10B470000040000000000000000000000000080084 -:10B4800000000000000000000000000800000000B4 -:10B490000000000000000021000000401005000036 -:10B4A00000000000010000000800000008008221E8 -:10B4B000080000000040000008000000822109048C -:10B4C00041040004200820008200A004C0002005E0 -:10B4D00008400000A1848290C0400040100000009D -:10B4E0000000004004400040008400000000000014 -:10B4F000000000000000000000000000000000004C -:10B500000000000000000000040000000000000037 -:10B51000000000000000000000900000000000009B -:10B52000000000000000080000000000000000A073 -:10B5300000A0000000001100000003000000000057 -:10B54000200910000041C10180C0008200000900F4 -:10B550008000000000900210092100C000000000DF -:10B560002000090410040900080000000000000089 -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000800000000B3 -:10B5900000000000000000000000000000000000AB -:10B5A0004000004100000000010200000011000006 -:10B5B000000000000000000000000000000000008B -:10B5C0001000200501002000840840054100000013 -:10B5D00084C1088000201000001008100000200026 -:10B5E0000000000082000000820000000000000057 -:10B5F000000000004000000000000090000000007B -:10B60000000000000020000000000000000000001A -:10B61000000000000000000000000000000000002A -:10B6200000000000020400000004020200002000EC -:10B63000000000001000000000000020004000009A -:10B640000000000082002020C084000104000800E7 -:10B65000050003200504080010000321800121C01B -:10B660008000200400002000040040400884000501 -:10B6700000000000000000110000000000000000B9 -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A0000000000000000000000300000040000057 -:10B6B000000000000000000000000000000000008A -:10B6C00000000000100010000000C000000000108A -:10B6D0000210000405000008040000400010C01023 -:10B6E000000000040004000000000021040000002D -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000118 -:10B730000000000000080000000000000000000001 -:10B7400000000000000003000084008400000000EE -:10B7500000108041410182C0000820000001020168 -:10B7600000410000000100910200204000000200A2 -:10B7700011040000000000000000000000000000B4 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000010080000000081 -:10B7B000C0000000000000000000000000000000C9 -:10B7C000C0010000000001008800000101A101206B -:10B7D000049100201108082000089020001020107B -:10B7E0000090900800000100C100000090000000DF -:10B7F000A000C000000000000000000000000000E9 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000800000000000000000000000000880 -:10B84000110880080020001003110000004011C101 -:10B85000092188100008A100058208C000000580A9 -:10B8600080000000000000030909820400050000B8 -:10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000001100800000000007 -:10B8B0000041000000000000000000000000000047 -:10B8C00000000000000000000000000000000080F8 -:10B8D0002080032111C04100C08080088291400077 -:10B8E0000000801080808080C00041004011020074 -:10B8F00000008000000000000000000000000000C8 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000010000007 -:10B9300082000021009008000000000000000000CC +:10B1000000000000000000003030F3F382BE303059 +:10B1100005000A0000000000000000000000000020 +:10B1200000003C343C04D5DF0000000000000000BB +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000C00F3 +:10B150000000303000003C3C00FF01058800000585 +:10B160002000200004002000208088002000000033 +:10B1700020041080200020008400210021002100F4 +:10B1800020840480048000042084200004008400C3 +:10B19000C000880841002080418000038800100022 +:10B1A00004000000A1002000840020000400000032 +:10B1B0002000040020001000200002004000400099 +:10B1C0004000400802002000042020008800C00346 +:10B1D00010002100C000200084004000200000007A +:10B1E00000001000100020000000052000900090DA +:10B1F00000000001410400000002000090009000E7 +:10B200009002000440040004000100114000C090BE +:10B210002120002040002090000420200000204039 +:10B220002000200000002082000000820500400075 +:10B23000000040000000002040C01000100000008E +:10B2400000000000090000004000800100044000F0 +:10B2500040000000200040004000400000002000AE +:10B2600020840080010900000100000000000000AF +:10B2700000000000010000000000000000000000CD +:10B2800000000000000000000000000002000200BA +:10B2900000000200000000000000000000020000AA +:10B2A000000000000010000004400000000000004A +:10B2B000200000000000000000000000000000006E +:10B2C0000000000000000000000002000400020076 +:10B2D000000000C100000089020000000000001012 +:10B2E0008008800500042008008410840000020803 +:10B2F00000080008008440900004000800000000DE +:10B300000008000800000008000000840000000899 +:10B3100004900088040820000440044000000091CC +:10B32000000000080408000000088000000002007F +:10B3300000080000000000080000000800040000F1 +:10B34000000000080404000004100004040480004D +:10B3500040102008000202840010000800000000D5 +:10B360000400202120080021000400000008A000A3 +:10B3700000040010000000080000000800040003A2 +:10B380000000000400400021000000050000000053 +:10B39000000000000000200988210000000888004B +:10B3A000000000000002000000000040000000005B +:10B3B000000000020000100000210000000000005A +:10B3C00000000803000000000004000000008200EC +:10B3D00020000400000000000400040004008800B5 +:10B3E0008400000080008000000000014100210076 +:10B3F0002100210109000000000000000000000100 +:10B400000000080041010001000003000382400029 +:10B41000000040000000000200000004408210888C +:10B42000009005840000048400840000080010845B +:10B430002100000003A14102000800A00008004014 +:10B440000090000010000400000008000000410807 +:10B450000000000010002100410005008900008864 +:10B460004100030000002000000000048200820070 +:10B47000020000000000000002000800C0008280FE +:10B4800000000000000004000000008000008200B6 +:10B49000000000000002A000080090110100C0049C +:10B4A000080000000800000000000000000000008C +:10B4B000000000110000400000000000000010002B +:10B4C00000000800C0008200080000040000000026 +:10B4D0004000000008000000000000000000010023 +:10B4E0000000000000110000800000840001000046 +:10B4F00000908000000000000000800000000010AC +:10B50000000400000000000000C0008203040000EE +:10B51000419008002100000000000000000004002D +:10B52000000140002182050000000002000000A090 +:10B53000000020002000000000000200000000A029 +:10B540004140000000000000000000001100000069 +:10B550000000800009000000000000200000000042 +:10B56000040000001100000008000021200000007D +:10B5700000008200100000000400004000000002F3 +:10B58000004002218200000090000000080200003C +:10B59000100000100000080000000000C0000000C3 +:10B5A00000400000200000008500000000000010A6 +:10B5B000002000040800040000000000000000005B +:10B5C000000008000000000000000000000008006B +:10B5D000000800000000000084008200000000005D +:10B5E0000800042100410000000000004088C00263 +:10B5F000000000100000910411008200030104000B +:10B60000080100019100000000000000000000009F +:10B61000020080A0009000000000000203000090E3 +:10B6200000000090000080000000200000000000EA +:10B630000000000404000090030000880000088857 +:10B640000020000041200000000000000000000079 +:10B6500000000000000800000000000004000000DE +:10B6600000200200000008100020410005040040F6 +:10B6700082002000200010000009000020000000CF +:10B680000021004000000010020002090208000032 +:10B69000000402080008084100000000000000202B +:10B6A00000200420882000000000000000000000AE +:10B6B000C0008200C0000002000800080000000076 +:10B6C0000008000000000000000000000000000072 +:10B6D0000000000000000000080082009000000050 +:10B6E00000000000000000050000000808410008FC +:10B6F0000000000080008000099000000000800031 +:10B7000000000000000100000000800080008000B8 +:10B71000000000010001000100000000000011C055 +:10B72000000100019101000100040000000040A0A0 +:10B730000000000000000300000000000000000006 +:10B7400000000500088820401100000000000000F3 +:10B7500000000000000000000000000000000000E9 +:10B7600010000000000000000000000000000300C6 +:10B770002000010000009000000000000000880090 +:10B78000000002C001004000000400C000080100E9 +:10B79000080000C1018988000000000000000000CE +:10B7A0000000000000000000000001000000910007 +:10B7B0000000000000000000000000000100000088 +:10B7C0000400000000000000000000000000000075 +:10B7D0000000000000000000000000000001000068 +:10B7E00008010100000101018800000100000000C3 +:10B7F000000000001140000300410005000011009E +:10B8000002000000918821108920008300800080C0 +:10B810004000800000C10888900300040000000080 +:10B820000500000000000000000000000800080003 +:10B83000C100000000000000000000000000110036 +:10B840002100900000000000000000000000000047 +:10B8500000000000000000000000000000000010D8 +:10B860004011000521401008411085200011000002 +:10B8700000000000000040004100201110200000E6 +:10B8800000008000800020001000200083090008D4 +:10B89000000000008000890005000800C1050009C3 +:10B8A0000000800900000000000000000000000807 +:10B8B0000000004100000000000000000000000047 +:10B8C0000008000000000000000000000000000070 +:10B8D0000000000000000000000000000000000068 +:10B8E000000000000000800000808021000000A116 +:10B8F0000000000000000000004000000001010006 +:10B900001000C0000800C000009003000000C0004C +:10B91000000000000000C000039000000100C10012 +:10B920004000200002002000000000020000001083 +:10B930000001000000000004000000000000000002 :10B9400000000000000000000000000000000000F7 -:10B9500000080010000001910100A0C0020108824F -:10B96000200090000201A008908202200800080137 -:10B9700041000400080010009000000000000000DA -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000010000000195 -:10B9B000000188040008008401A0000000000000CD -:10B9C0000000000000000101000000000000000174 -:10B9D000000100010801000101000101901001882F -:10B9E000039109C1C0200020000408C0000001002C -:10B9F00090000101008500C000900085000000005B -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA200000000000000000000000000000400021B5 -:10BA30000008001000000000008009000000000065 -:10BA40000000000000000020080841080408001061 -:10BA500004104110001100092103090811410000E0 -:10BA6000118305A1918380000000008000800040C8 -:10BA7000114010401141000800210010002000007A -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000294 -:10BAB0008000000080000000008000800000000086 -:10BAC0000000000000000000001100000000000065 -:10BAD00000020000000000008383910088008003C2 -:10BAE000A1820391820000118000802180008000EB -:10BAF000400240A04000030300400000000000009E -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB300088000800080008000800880210848800B7 +:10B9500000000000000000000000000000000000E7 +:10B960000000900040000000089000840800820061 +:10B97000C0C1000000000000000000000000000046 +:10B9800000010001000002000001000100000100B0 +:10B9900000C000000800000000C000880000000196 +:10B9A00001C1000008000000000000000000880045 +:10B9B0000000000020000001000000000000000066 +:10B9C0000000000000000000000101010000000074 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000001410000010001000013 +:10B9F00000000001000000000000000000400020E6 +:10BA00002020001100400011001000410008112109 +:10BA1000101010C0000000000000008000894003EA +:10BA2000050509C1000080000000090008000000B1 +:10BA30000000000000408008001011050000000018 +:10BA40000000000000004005000500050210000095 +:10BA500000000000000000000000000000000000E6 +:10BA60000000000000000011210905410910000834 +:10BA7000030509201010000000000000000000C0B5 +:10BA8000200005000300000000C10000000009A123 +:10BA9000A000080040118000000080000000C18468 +:10BAA0000300030084040000000000000000000008 +:10BAB000000200000000001100040000000000006F +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000400000000000052 +:10BAF000A1009102200040000000000000000000B2 +:10BB00000004000000000000000000080010000019 +:10BB10000005020001000001C000008808000000CC +:10BB2000C1C00000000090000000000400080000F8 +:10BB30000000000100000000000000000000000004 :10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000888891008800BC -:10BB60000400C141200991042001C000888982207D -:10BB70000200004100030008000000010088008866 -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC00050820000000000000000000000000000A3 -:10BBD00000000021000000E000000000820000E002 -:10BBE00000000000811100E007005000000000008C -:10BBF00007004100810000E0070000210000000074 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000200000B5 +:10BB7000000003000421908808000000000000007D +:10BB80000000810000E000000000500A00E0070013 +:10BB90000000000000E000000000000000E00000E5 +:10BBA0000000810000E000006000000000E00000F4 +:10BBB00000000000000007000000000000E0070097 +:10BBC000008100000000000000000000000000E014 +:10BBD000070000000000000000000000000000005E +:10BBE0000000000000000000000000000000000055 +:10BBF00007000000000000E00700422100000000F4 :10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000001000000000007F7C0000F9 -:10BC4000D7FF476F00000000000000000000000068 +:10BC10000000000000FF00FF0000AAAA0000F0F0F2 +:10BC20000000FFFF00003C3C00003C3C0000000026 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 :10BC500000000000000000000000000000000000E4 -:10BC6000002000000000000000000000005500005F -:10BC70003C3CC0C0000300000000000000000000C9 -:10BC80000000E8E8C3FF0000000000000000000022 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB00000000000000000000000000000007F7C89 -:10BCC000FFFFFFFFFFFF000000000000000000007A +:10BC600000000000000000000000000000000000D4 +:10BC70000000000000000F0C0000000000000000A9 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000FF00FF0000AAAA000052 +:10BCA000F0F00000000000003C3C00003C3C0000C4 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 :10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000002000300C08F0F50B -:10BCF000FF00D4D7C0C0000000000000000000001A -:10BD000000000000E8E8003C000000000000000027 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD4000FFFF0000000000000000000000000000F5 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000C00000000000038 +:10BD00000000000000000000000000000000000033 +:10BD100000000000300010103C3C00000F0F00003D +:10BD2000FF00000055550000FF000000C3C3FFFFE7 +:10BD300000000000FF3CC300000000000000000005 +:10BD400000000000000000000000000000000000F3 :10BD500000000000000000000000000000000000E3 -:10BD60000000000C000000000000000000000F0FA9 -:10BD70000F0F35C5C5C5FFFFBEB0000000003E3E39 -:10BD800002020000000000AA000000000000000005 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000FFFFFFFF0000828200000000000073 +:10BD600000000000000000000000000000000000D3 +:10BD7000000000000000A8A8080800000000000063 +:10BD800000AA000000000000000000000000000009 +:10BD9000000000000000F00050503C3C00000F0F7D +:10BDA0000000FF00000055550000FF000000C3C365 +:10BDB000FFFF000000004D4D4D4D00000000000051 +:10BDC0000000000000000000000000000000000073 :10BDD0000000000000000000000000000000000063 -:10BDE00000000000000000000000000000002A0227 -:10BDF00008080F003ACACACA0000BEB0000000001E -:10BE0000BE3C82000000000015001500000000008C -:10BE10000000000000000000000000000000000022 -:10BE20000000000000000000000000000000000012 -:10BE3000000000000000000000000000806100061B -:10BE4000000D0000000030000000000000000000B5 -:10BE500000000000000000610006000D000000610D -:10BE600000060009000000200001C0000000A061E1 -:10BE70000035C0990001A0000000009000A1006101 -:10BE8000000DC500000000610006000D000000006C -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000FC3C0C3C00000000000000000000F2 -:10BED0000000000000000000000000000000AA00B8 -:10BEE0000000000020282028FF00F505FFFAF0B42C -:10BEF00050005FFFFF00FF00000000000000000096 -:10BF000069690F69FFFAAAAC000000003C3C3D38AB -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000FC3C0C3C000000000000000071 -:10BF500000000000000000000000000000000A0ACD -:10BF6000AA080000000000003C3CFF00F50500505E -:10BF7000F0B450005FFF0F00FFF000000000000071 -:10BF8000000069690F69000AAAAC000000003C3C8F -:10BF90003D3800000000000000000000000000002C -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000A8A8080800000000E3 +:10BE000000A000A000000000000000000061000091 +:10BE1000800100000061002F800800084063800757 +:10BE2000002D920240E38007002D920240828001A3 +:10BE30008020820200610007000D000005000A0852 +:10BE4000050000A00061000F000D00A00000000030 +:10BE500000000000000005610007000D0000000068 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000610006050D0001806167 +:10BE8000000F000D00A000000000000000005F1E79 +:10BE90005F1E82B2BEB200000000C080C382CF7DB0 +:10BEA0000C7D173C17000000000000000000C3825A +:10BEB000030200C0808000000000000000000000BD +:10BEC000000000000000000000007D417D410000F6 +:10BED000000000000000000000000000000002431D +:10BEE0000000000000000000000000000000000052 +:10BEF000000000000000000000000000AFAF8782DB +:10BF000035FF350F554055000000000000000000CF +:10BF10000A1E0A1E82B2BEB200000000C0800000ED +:10BF2000CF410C4117FF17C30000000000000000C4 +:10BF30000000030200C38282000000000000000035 +:10BF40000000000000000000000000003F3F03036D +:10BF500000000000000000000000000000000000E1 +:10BF6000F7E30000000000000000000000000000F7 +:10BF70000000000000000000000000000000AFAF63 +:10BF8000838335F03500554555550000000000000D +:10BF900000003C3CFF00F3C3F3FF00000000000082 +:10BFA0000000FD3DCD0DF0FF3CAA000000000000A8 +:10BFB0000000014103C314145050000000000000B1 :10BFC0000000000000000000000000000000000071 -:10BFD000000000000000000000000000F30000006E -:10BFE000000000005555553C00000000DF08FFD759 -:10BFF000F3FF08FBA5AAA5AA555555690000000046 -:10C0000000000000FF41FF3FF0F0CCCC000000003A -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF000000000000000000000000000020EC2CEA1 +:10C000000000000040E04AEA0000000000000000DC +:10C01000000000000F0FFF003000303C0000000067 +:10C0200000000000F131C101F0003CAA0000000056 +:10C03000000000000141000014005000000000005A :10C0400000000000000000000000000000000000F0 -:10C050000000000000000000000000000000F3519C -:10C060005151000000005555555500000000DF08F3 -:10C070002800000C08FBAAAAAAAA5555555500008D -:10C08000000000000000BE00C000F0AACCAA000022 -:10C0900000000000000010000000400020004000F0 -:10C0A0000000000020004000000000000000000030 -:10C0B00020004000200000000000200020002000A0 -:10C0C0000000000020000000000000000000000050 -:10C0D0002000210020000003900000002000A1802B -:10C0E0002000400000002000000000804000A0036D -:10C0F0000400200020002000000004002000400276 -:10C100001000000000002000020002004000C000FB -:10C11000000020102000200040002190210000009D -:10C12000000040004002000020004000000000002D -:10C13000400000002000000020004000000000003F -:10C14000400000000000000040004000000000002F -:10C150000000000002C00000000008000000000015 -:10C16000021000000000000200004040402000C01B -:10C170000000850000000040000010009002000058 -:10C180000401400000024000000280028002000022 -:10C19000000000000000000211400000000000004C -:10C1A000000000008200000000000000000000000D -:10C1B0000000000000000400000000000000080073 -:10C1C0000010000000000000000008000000000057 -:10C1D0000000002000000000000900000000000036 -:10C1E00008910000000000000000000000000400B2 -:10C1F0000100820901000240000008000100040063 -:10C200000100080000080000842000000000000079 -:10C2100000080020000000008200844000080000A8 -:10C22000099000080008000800000000000000005D -:10C2300000000000000000000000000000080000F6 -:10C24000000400080088040800000000000000004E -:10C2500000000000000100000000000800000008CD -:10C26000000800100040000000080000000000006E -:10C2700080001000000804880001210041100840DF -:10C28000808808000000000000400001001000004D -:10C290000010000000C003000000000000080000C3 -:10C2A0000000000000000000000088000000000006 -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D00000000000000000002000000040000000FE -:10C2E000000084000000208000000000000000002A -:10C2F00000000003010000000000010000008400B5 -:10C30000A0000520400090000021001000208808B7 -:10C3100000008400C000040800202000000000008D -:10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED -:10C350000000054000000000000000000000008414 -:10C3600000000300000000880840000002000000F8 -:10C370000000050009001000090800A002000500E7 -:10C380000500210084010000090041A0080100010E -:10C39000000000A0000000000000080003200310BF -:10C3A00000C0000000400008000400000000000081 -:10C3B000000000000000000000000000000000007D -:10C3C0000010000000000000000000000000040059 -:10C3D0000000080000000000000820040000000029 -:10C3E000004000000000000000000080000000008D -:10C3F0000000004140029008000084050080000316 -:10C400000000402108400040004000110011A0043D -:10C4100004080440014100404009200400050011C7 -:10C420009021040400000000000000000000000053 -:10C43000000000000082000000000000000000007A -:10C44000000000000000000800080000400000009C -:10C4500000000000000000000000000000040000D8 -:10C4600000000000000000000000009000400000FC -:10C47000020000000000800100C000000000002059 -:10C4800000A004A00008002009C04000000008200F -:10C4900000008020000008C00000110420202100BE -:10C4A0001100110002000000000000000000000068 -:10C4B000000000000000000000000000000000007C -:10C4C0000000000000080000000000000000000064 -:10C4D000000000000000000000001000000000004C -:10C4E000000082004000000000000000000000008A -:10C4F000000000002000000001004100000000805A -:10C500000041000584000800824082800000000392 -:10C510000021004001A00400000000000000000015 -:10C5200000000000010040100000000000040000B6 -:10C5300000000000000000000000000000001000EB -:10C5400000000000000000000000000000000000EB -:10C550000000000000000000000000404000000853 -:10C5600000081190000200400000020000000000DE -:10C57000000000000000000400080800C0000000E7 -:10C580000002000005000000800040000020412063 -:10C5900003000500050004210390000005000800C9 -:10C5A0000800000002102008C0A0000000000000E9 -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000001000000000000000000000000004A -:10C5F0000000004082000000000000000000010078 -:10C6000000000000042000000000002100000820BD -:10C6100000410041000000000020011082000000E5 -:10C6200000002000001100009000008900000000C0 -:10C6300000000000000000000000020000000000F8 -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C66000000000000408000000C000C0000000003E -:10C6700000A0000000010000000000000000000019 -:10C6800010000082000080C10000040000A0409063 -:10C6900091110082084020C011002001028802820E -:10C6A000000020000040000011001188031000006D -:10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A -:10C6E0000000000000000100000000000000000049 -:10C6F0001020000000008800000000000000000082 -:10C7000001A19090108800A0C000000000008800E7 -:10C71000A1A000000888000810C000200008100236 -:10C720000400000000000800000001008800000074 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C070000000000000000000000000000000323E50 +:10C08000F2FE0000000045E54FEF00000000000058 +:10C0900000000000000020000000200020000180BF +:10C0A000010089802000208021000080208800403D +:10C0B00000000202010420000000400040000000D7 +:10C0C0000000880020004091088000800480040067 +:10C0D000C0002000110000030000040020008400C4 +:10C0E00000000003C0002000208020808880A08005 +:10C0F000040004002004400010000400C000880078 +:10C100000004840004008800200021004002400256 +:10C1100040002100400420041000008200A0000024 +:10C120002008200020080000400420000004000433 +:10C1300000A1000040000403000000000000000017 +:10C1400000000002200000900004800409040004A4 +:10C1500000000000090020900000100800200000EE +:10C16000200000004084200010C0090400044004A6 +:10C1700000044000200041022000000004000000F4 +:10C18000000040C000000000004000000402C12187 +:10C190008001000008000000000800000005020007 +:10C1A00000000000A00000081000000000000000D7 +:10C1B00000000110010000000804900000000000D1 +:10C1C000001000000000020002100000000000004B +:10C1D000000000000100010000100000000000004D +:10C1E0000000000000000500000002000000000048 +:10C1F00000000000010001000000850000000200B6 +:10C2000000000210904000000040000000004000CC +:10C210000202100801008280004002000008008431 +:10C2200000840008008400000200008800880000EC +:10C2300004C00090041004C00090801100080000A9 +:10C24000000000080008000000840008000004044A +:10C2500000040004000004080408080400000008AA +:10C260000000000000080004040404000440100062 +:10C270004000000000040400040840900400000492 +:10C280000000000000080008001000000008001076 +:10C29000808400018000080000100001008400116B +:10C2A0000005000400030008002100210000000038 +:10C2B0002040C00800400405880804080008000069 +:10C2C00000000009200088020000000090110040DA +:10C2D0000200204084000000000000400000000038 +:10C2E000000000110000000001089021200000085B +:10C2F0001080880002800009001100020000000880 +:10C3000000000003000000000021002100000000E8 +:10C310000000000001401000840584880200408075 +:10C32000008200020001000005000004400000A09F +:10C330004100000000A0000100A00000808800A0D3 +:10C340000000110000002100000000080000210092 +:10C350000000000000000508000000A0000200002E +:10C360000000000000000000000008A00000000025 +:10C370000000002000100420000000020000000067 +:10C380000000000000000800000000000900080094 +:10C39000210009000084400005840000001008000E +:10C3A00005404000000004200000000008000000DC +:10C3B00010000000000000000000004100400800E4 +:10C3C00008100000040008400040000000001000B9 +:10C3D0008200000000090000090000000000900435 +:10C3E0000000000004000009040000000004000038 +:10C3F00082000000000000000080088008000000AB +:10C400000005040004000004080010008210000071 +:10C410000800001082004000820000000800901018 +:10C42000004000000000000041000000000000008B +:10C43000000080000000000000000000000000007C +:10C440000000000004000000000000000082000066 +:10C45000000000000800080400C00210009000A0C6 +:10C46000000000840000000040000000000020A048 +:10C470000082030000000000000041024102200091 +:10C480000000000000000000080000000000008420 +:10C4900000000088080004000000200003000000E5 +:10C4A000000100000000004100400040004010007A +:10C4B00010002005200800400040404000000041DE +:10C4C000C00000200000004100000021000090009A +:10C4D00000000000900000000000A00000400000EC +:10C4E00001000080000000000800000500000002BC +:10C4F000840000008400C00000082011000000003B +:10C50000000000000000000000000011000000001A +:10C510000040000000000000000000800800000053 +:10C52000404100808208040000000841030100012E +:10C5300080008088808880A003892041000140908D +:10C540000000000000C10008000000000088110089 +:10C5500009000000000000000040050041000091BB +:10C560000000200440044000000000000000000023 +:10C570000000110000000500001000000004000091 +:10C5800000000000090000000000000000000000A2 +:10C59000000000000000080011002000002005003D +:10C5A0000004040000100000000000400021000012 +:10C5B000000000000021000500000000000300084A +:10C5C00004000000010000008200002100000000C3 +:10C5D0000800000000009000000000000400C000FF +:10C5E000000000000000000000000000000000004B +:10C5F0000010821000000008000000800000000809 +:10C600000000000900000000000000000000000021 +:10C6100000210820000000000000000000100000C1 +:10C62000000000008441009004410002000100006D +:10C6300000000000000000000000000000000008F2 +:10C6400003000000000004000000000000000000E3 +:10C650000000000009000000110220000000808896 +:10C660000000050000000000200040000000000065 +:10C67000000000020010000400000000002000087C +:10C6800000000000000000000000000000000000AA +:10C69000000000080820000000000000000000105A +:10C6A000000200000000000041110000000000C076 +:10C6B00000000100000201C121001001880100C03A +:10C6C00000000000000288008400010090000000CB +:10C6D000000000000000000000000000000000C09A +:10C6E00040820182004010201010000482020000ED +:10C6F00000000000000000008888004000A08404C2 +:10C7000000000100C100000001901000001020088E +:10C710000000000000000000000000000000000019 +:10C720000000010088000000004000880004002094 +:10C73000008000000200008011C14020820980209A +:10C740000080000040000080000000000300800026 :10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000400000000000000C5 -:10C7700000000000000000000000000000000000B9 -:10C78000000021C190A1809100C182000000000042 -:10C790000000A00021008080008080800000000058 -:10C7A00000800000000000000000000004001100F4 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E00000000000000000000000000000030080C6 -:10C7F00000000000800080088000000000000000B1 -:10C800000000000000800010009000038000004045 -:10C81000808080000000009100890000000000007E -:10C820000000000000000004000080008000000004 -:10C830000005800000000000000000000000000073 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C870000084000400008800822002028210000070 -:10C88000000000000000004000010083000188005B -:10C8900004C1084008000000004100110000000031 -:10C8A00000000000000084009000048808000800D8 -:10C8B0000000A0010484000000000000000000004F -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F000000000000000000090000040C08401C063 -:10C900000000000000000000C00001000101020161 -:10C91000001000C000200082000000008200000221 -:10C9200000900090908441880008008400200082DC -:10C9300000010000000100010000000000000000F4 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000800080B7 -:10C9800009800000000000000000000903020908FF -:10C99000834100800000000000000003004100040B -:10C9A000000400000000008009000080000000007A -:10C9B00000000040000900100420000000000000FA -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F00000008011800000000000000080000000A6 -:10CA0000000000000000000000000000900504008D -:10CA10000200040080008000000000008020000070 -:10CA200080000000000000000000000080080000FE -:10CA300000800000000400000080000000000000F2 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000C00120002000040000000200AF -:10CA80009088880808000000000000000000C10035 -:10CA9000040021008400900008C020208800C0000D -:10CAA00090004000C00000000000000000000800EE -:10CAB00090021040C000000100100084000000003F -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF00000000000000000410000070000000000EE -:10CB00000000000000000000000000000000000025 -:10CB1000608100E007000000000000000700420004 -:10CB200000000000070000000021000007000000D6 -:10CB30000000000000000000810000E00000000094 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 +:10C7600000800000028000800000000009008000BE +:10C770000000000000000000000020000080008099 +:10C7800000800000200004000000100000000900EC +:10C790000080000000000000000000000000000019 +:10C7A0000000000008000000000000000000000081 +:10C7B000090080000000000980000280082140007C +:10C7C000C103800800030008800080000000000012 +:10C7D00080000000000000000000000000000000D9 +:10C7E00000000008000000080000800080840005B0 +:10C7F0008000000000000000000000000000802118 +:10C8000080100000201003002008030080000003B7 +:10C810008080808000000000000000000000000018 +:10C820000000000009000280080010210000000242 +:10C8300000000000020000000000C00000880100AD +:10C840000100C101020000000001C00010009020A2 +:10C850000400049000000000000000000000000040 +:10C86000000000000001000000010000A000100412 +:10C8700010C10808000000000000000000000200D5 +:10C8800008004090040000000000010000000200C9 +:10C890000201A0408208000000000000000000002B +:10C8A000000000000000000000080100010100007D +:10C8B000000000A0000000000002000000C0000115 +:10C8C0000100000082C100000802000000C0000852 +:10C8D0000040088800020000000000000000000086 +:10C8E00000000000000008000200020084000002B6 +:10C8F0000888001010400000000000000000000048 +:10C9000010900002008408020100020108000001EA +:10C9100040820002202011080000000000000000FA +:10C920000000000000000000000000000000000007 +:10C93000040000000000880000000080000000806B +:10C9400000080920411180C100000080000008801B +:10C95000090000000000118000000000000000003D +:10C9600000000000000000000000000080008800BF +:10C9700000000080008008000000000000000000AF +:10C98000000000000000008084000203001100038A +:10C9900020408000000000004180000000000000F6 +:10C9A000000000000000000000000020001100094D +:10C9B0000011000000000000000000000000000066 +:10C9C0000000C10821112080091180000000000032 +:10C9D0000000000400110000000000000000000042 +:10C9E0000000000000000000000000020000001134 +:10C9F0000000000000200080800000000000000017 +:10CA00000000000000040040800000000000000260 +:10CA10000000001180040040008080000000000041 +:10CA20000000000000000000000000004180000243 +:10CA3000210008108000800200008000000000003B +:10CA400040000000C121000101880100C000000079 +:10CA500000000000000000080000000000000000CE +:10CA600000000000000000000000000000010000C5 +:10CA700000010000840020038804900000000000F2 +:10CA8000000000000000900120081020A00000908D +:10CA90000001000000014001109000109000000013 +:10CAA000000000000000000000000000000001C0C5 +:10CAB000000101000100C000A00088008200000009 +:10CAC00000E000000000480000E00000000000005E +:10CAD00000E000000000008100E00700000000000E +:10CAE00000000000000000000000000000000081C5 +:10CAF00000E007000000000600E007000000000062 +:10CB0000000000000000000000810000070000009D +:10CB1000000000E007000000818100E007000082C3 +:10CB20000000000000000000000000000000000005 +:10CB300000000000070042000000000000000000AC +:10CB4000F0F0F0F0F0F00000FFFF0000FFFF000049 +:10CB5000FFFF0000F0F00000000000007EF37E30D8 :10CB600000000000000000000000000000000000C5 -:10CB70000000000000000000F0F400F400000000DD -:10CB8000000042C27EFE0F00FFFF00000000000018 -:10CB90000000101800000000000060646060990050 -:10CBA0000C0C990062620000666600000000C0FF85 -:10CBB0004066FF006666F7D3765200000000000072 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF00000000000000000000000FF2400240000EE -:10CC00000000000043C37FFF0F00FF66000000002C -:10CC10000000000000100F0F00000000666600001A -:10CC20009900FF0C990020200000666600000000BB -:10CC3000FFFF66663C3CF0F0B59134100000000048 +:10CB70000000000000000000C900C90FBD24FDF442 +:10CB8000000000000000000000000099FF99FFFF76 +:10CB9000FBFB000000000000000000000000FFFFA1 +:10CBA0003C0F00000000000000000000000000003A +:10CBB00000000000000000000000F666F424000001 +:10CBC0000000F0F0F0F0F0F00000000000000000C5 +:10CBD000000000000000F0F000000000000042F340 +:10CBE00042300000000000000000000000000000D3 +:10CBF00000000000000000000000C9F0C9FF0000B4 +:10CC0000F0F000000000000000000000C30FC30FA0 +:10CC1000FFFCFBF80000000000000000000000180E +:10CC200000003C0F000000000000000000000000B9 +:10CC3000000000000000000000000000F000F424EC :10CC400000000000000000000000000000000000E4 :10CC500000000000000000000000000000000000D4 :10CC600000000000000000000000000000000000C4 @@ -122088,975 +122088,975 @@ :10CC90000000000000000000000000000000000094 :10CCA0000000000000000000000000000000000084 :10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD000000000000000000000000FFFF00008000A5 -:10CD1000000000000000000024243C3C0000000053 -:10CD200000000000838300003C3C0C0C000000006D -:10CD30003C0000340000000000000000F30390906D -:10CD4000000000003C3C3C3C0000000000000000F3 -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000FFFFFFFF0000A7 -:10CD9000000000000000000000000CFF0CFF00007D -:10CDA000000000000000C00000003C3C0C0C000033 -:10CDB00000003C0000340000000000000000F3030D -:10CDC0009F9F000000003C663C3C0000000000000B -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE00000000A00000300000000000000000300022 -:10CE1000009000000000000000000000A02100368B -:10CE2000C00C00000000000000100001A0610A0614 -:10CE3000000D000000005030000000000000000065 -:10CE40000010000100610007C00D0000000000009C -:10CE500000000000000000000000000000000000D2 +:10CCC00000000000000000003C3C00003C3C000074 +:10CCD00066660000FFFF00003C3CFFFFC3C300008E +:10CCE000000004FD343D00000000000000000000D2 +:10CCF000000000000000F0F0FF00000000000081D4 +:10CD00000F8F000000000000000000000000000085 +:10CD1000F8FCFCFC0C240C240000000000000000C7 +:10CD200000000000FF00FF0D0000000000000000F8 +:10CD300000000000000000000000000000000000F3 +:10CD400000F000F00000000000003C3C00003C3C13 +:10CD5000000066660000000000003C3CFFFFC3C30B +:10CD60000000000004FD343D000000000000000051 +:10CD7000000000000000000066663C3C000000006F +:10CD800000810F8F098199990000000000000000C8 +:10CD90000000F8F0FCFC0C24FFFF00000000000085 +:10CDA00000004040000000000D0D000000000000E9 +:10CDB0000000000000000000000000000000000073 +:10CDC000000040404F4F0000000040638007002DEE +:10CDD0009202408280018020920240E38007002D71 +:10CDE000820205610A2F051D00A00000000000005E +:10CDF0000000000000000000000000615027050D49 +:10CE000000000061002F000D000100000000000084 +:10CE10000000000000000028000000000561000F75 +:10CE2000050D00000061002F800D000000000000D3 +:10CE300000000000000000000000000000610A0E79 +:10CE4000000D0000A00040000000000000000000F5 +:10CE500000000000303050500000000000000000D2 :10CE600000000000000000000000000000000000C2 :10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 :10CE90000000000000000000000000000000000092 -:10CEA000AAAA0CFF0C5D00000000000000000000BA -:10CEB0000000000000000000000000000000000072 -:10CEC00000000000000000000000FCFC82BE00002A -:10CED0000000000000000000000000000000000052 +:10CEA0000000C3B2FFB2000000000000000000005C +:10CEB000000000000000000000000000000003036C +:10CEC000C3C3A00CA00C0000000000000000000084 +:10CED0000000000000000030005000F3A2A200009B :10CEE0000000000000000000000000000000000042 :10CEF0000000000000000000000000000000000032 :10CF00000000000000000000000000000000000021 :10CF10000000000000000000000000000000000011 -:10CF2000000082A200FF00000000000000000000DE -:10CF3000000000003E0AFFFF0000000000000000AB -:10CF4000000000000000000000000000C0C082BE21 -:10CF500000000000000000000000000000000000D1 +:10CF20000000000000B23CB2000000000000000061 +:10CF300000000000000000000000000000000000F1 +:10CF400003030000A00CAF0C000000000000000074 +:10CF50000000000000000000030041003C00AA00A7 :10CF600000000000000000000000000000000000C1 :10CF700000000000000000000000000000000000B1 :10CF800000000000000000000000000000000000A1 :10CF90000000000000000000000000000000000091 -:10CFA00000003030FFD7000000000000000000004B +:10CFA0000000000000003F3FA0AF000000000000B4 :10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 +:10CFC0000000000000000000C3C3000000000000DB +:10CFD00000000000000000000000030341410C00BD +:10CFE0000A00000000000000000000000000000037 :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 :10D010000000000000000000000000000000000010 -:10D020000000000000003C140000000000000000B0 +:10D0200000000000000000003030A0AF0000000051 :10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D050000000000010000000000020002000000080 -:10D060000000000020000000000002080000000096 -:10D07000000002004000000000002000200000002E -:10D080000000880020000000C000000000004000F8 -:10D090000000A0000003400000000000014020004C -:10D0A000C00000002000200000002000094088800F -:10D0B000200040004002218004000510888020806C -:10D0C000000088008880210800000084010084009E -:10D0D0002000C00010004002000200024002400098 -:10D0E00000000002000200000000404000000000BC -:10D0F000000000000000200040002100400000006F -:10D10000000000000000400000000090400000000F -:10D11000000000000000000020000000410020018D -:10D1200000000000000000000000000080008241BC -:10D130000002890000008041041080008801001076 -:10D14000000209A0000010022002000000042004D8 -:10D1500000020000000000000000000000000000CD -:10D1600000040000000000000000000000000000BB -:10D17000000000090010080008030000041000006F -:10D18000000000000000001008000000000800007F -:10D1900000000040000900900000000400000100B1 -:10D1A00002000000000000000140000001000040FB -:10D1B000020801000000418041C008000180001009 -:10D1C00003000200014000009108004101100040EE -:10D1D0000000010000410010A12100080000000033 -:10D1E000000400000008000800040000000000081F -:10D1F0002000000400080088000000840000800473 -:10D2000000820000000800080084000000000010F8 -:10D2100000080000000800080040000000010000B5 -:10D220002008820000000008001002010000020037 -:10D230000210804020000008A002A00380020240EB -:10D2400000090400000008080000080000000200B7 -:10D25000000002840800008802A040400000000096 -:10D26000000000008400000000000010000000002A -:10D2700000000000000000000000000000000000AE -:10D280000000000000000000000000000041000459 -:10D2900000000200900084008400020800000008E2 -:10D2A0000000000000808400840000008400101052 -:10D2B00000210100011000008205A0000880820802 -:10D2C0004020824000400200080000084010820018 -:10D2D0002000040008000000000008000003000017 -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D300000000000000000000050000000000000018 -:10D3100000000000C00011000300000080000000B9 -:10D320000082000000200040210000000088400032 -:10D330000000039020000801008841000000004028 -:10D340000300410000000000000008002000080069 -:10D3500000008000002000000000000000C0080065 -:10D36000004000000000000000000000000000007D -:10D3700000000000000000000000000000000800A5 -:10D3800000210000A0000000000084000000000058 -:10D3900000000020040008001000820001100000BE -:10D3A0000000000010002000080004008200C004FB -:10D3B00000008400010008A08280888008004040AE -:10D3C000020090200040001000000004000000094E -:10D3D00000040011004008001000A011000000022D -:10D3E0000210000000000000000800C000000088DB -:10D3F000000800000000000000000000000000081D -:10D400000008000000000000000000840000000090 -:10D410000000000421000000000480001000200132 -:10D420000800000000A08000800000A0008200C072 -:10D430000000000000A04084000500100002000071 -:10D44000800880A000820900110000400008090245 -:10D4500040C0008220A020040010002000C0200452 -:10D460002004200500000000000000000000000073 -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D4900000000000000000008200000020034100A6 -:10D4A0000000404100000000000482002021000034 -:10D4B00000000000004084119005080408C1040029 -:10D4C0008200C000000820400000002088080003FF -:10D4D0000000000000210000000000100110080002 -:10D4E0000000000000050000000000000000000037 -:10D4F0000500000000000000000000000000000027 -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000080008B -:10D520002020000000000000008209010004C1A0CA -:10D5300000000000000000010500210083018010B0 -:10D540000088000000000000000020001000002003 -:10D550004020400004000200200005000088200058 -:10D5600000004000000000880000000000080000EB -:10D5700000000000000000000000000000000000AB -:10D580000000004102000000000000000000000058 -:10D590000000840000000000000300008400008000 -:10D5A00000008211A0002008000084210000000873 -:10D5B00000A10000820002000000020040000900FB -:10D5C00009100000831100210010000084080011E0 -:10D5D00000050009000000080040400400040000AD -:10D5E0000089000000410008000800000000000061 -:10D5F0002000000000040000000000000084000083 -:10D60000000800000000000000000000000000080A -:10D610000000000000000000000000820010200058 -:10D62000004000900090008480010000000000088D -:10D6300000012008000000A000000000008200009F -:10D64000208488050082028200A005080090000462 -:10D650000484091003C00900000811A00200110091 -:10D660000800081011C0208420822004000000005F +:10D040000000000000000000B230B230000000001C +:10D0500000000000000000002000000000000000B0 +:10D060000000200040802000C000208088000000D8 +:10D070004008400002004000A0000400400500807D +:10D08000008003802000200520002003840084000D +:10D090002000880000032100200002000402048018 +:10D0A00085000400410089000500C1002104200022 +:10D0B0002000840000002000200040008800C00202 +:10D0C00084040000000020004002C00020004182D3 +:10D0D0002102210005840000000000000000000083 +:10D0E00000000082000000200082000000200800F4 +:10D0F000000200200002400010000002000010C0EA +:10D1000041040004A0020000A10000000000200073 +:10D11000000000000000000004402108404010C052 +:10D1200000200400800204000202820404000400C3 +:10D1300000004000000009004000A00000000000C6 +:10D1400040004000400040000000200000000500BA +:10D150002008900090001004000000000000000073 +:10D1600000000000000002000000000000000000BD +:10D17000000000000000040000400000000000006B +:10D1800000008800A0000080000000090000900955 +:10D190000800000000000200000000000100040080 +:10D1A000880000008200000002200000000800004B +:10D1B0000000008020000000880002002100010023 +:10D1C000200000000000000000000000000000003F +:10D1D000000002100800000000000000000800002D +:10D1E0000082000000000000000800900008000419 +:10D1F0000004000800000000028400820084000097 +:10D20000000000000284000002400084008800103A +:10D210000000000800000082050000000400040077 +:10D220000000008200080400000000010000040467 +:10D230000000000800020200040000000900840849 +:10D240000400001000080000000000080000048432 +:10D2500000000484000004000200000010210421EA +:10D260000000000000000000040000008808040323 +:10D27000040000000400000088000000000000001E +:10D28000000000000008C000000088210080900815 +:10D29000C00000000420C005C003001100000441CC +:10D2A0000003000041009000000000000002002187 +:10D2B00000000000000000000000000000000090DE +:10D2C0000010000008000000002182210000002062 +:10D2D00000000000000040000011001100200300C9 +:10D2E0004184000000000000000800000000000071 +:10D2F000C0008000000000200000000000000000CE +:10D3000000000000000000000500002003001004E1 +:10D3100008000500000000000084000000900000EC +:10D32000C0A00088098888080300000000004108A8 +:10D3300000820020040003200020000041000000C3 +:10D34000001111880000800208000000030008009E +:10D3500010004100000040040800400008000009DF +:10D3600000000000000000000800000000000000B5 +:10D3700000000000000004008200C000000008005F +:10D38000000000000800000000000000000008800D +:10D390000000200082000380200000000000000048 +:10D3A00000001000040004000800C000000000009D +:10D3B0000800080000004000020082400000080051 +:10D3C00000000000000008000000820008000000CB +:10D3D000001000000000A0000010A0000841400064 +:10D3E000100000000000200000000000000000000D +:10D3F0002100000000004100000000A0002000000B +:10D40000000000000000000000000000008800880C +:10D4100000400000800000002040000000001100DB +:10D4200000000000000080008000000009000000F3 +:10D4300000C0000040000000080080000000000064 +:10D44000000000000000004000080008000000008C +:10D4500000000000020009000900000000000000B8 +:10D46000000000000021000000000000000000009B +:10D47000000004000000000008000000002100007F +:10D480000000000000000000A00082000000C000BA +:10D4900000210290000000008491040000000003BD +:10D4A000A000001100000211044108090400082036 +:10D4B000C000C000A011000000000000100000002B +:10D4C0000000000008200000010000000000000033 +:10D4D000000008000000000000000800000000003C +:10D4E000000000000000110000000000000000002B +:10D4F0000088002000200000002000900000400074 +:10D500000088090002A000C000200000000800847C +:10D510000000000089400000000000040900000035 +:10D52000000000001104000000040300000080005F +:10D53000040005020000080010A008000000000020 +:10D5400004000800000003040000020000000000C6 +:10D5500004000000000000A0000200000304100806 +:10D56000008800000004000200080000000008001D +:10D5700000000008000000000000000000000000A3 +:10D58000000000001000000000000000000000008B +:10D59000000084000000200000040000200000883B +:10D5A00000009000000008030000000000080000D8 +:10D5B0008280002000910100004100000000000076 +:10D5C00000000000000008004000004102000000D0 +:10D5D0000008000000008200000002008800000037 +:10D5E000000000000000000000000000000000003B +:10D5F0000000000000000002000000000000000821 +:10D600000000110000000000000000820000000087 +:10D610000000000000000000000000010000800089 +:10D6200000040000000000000000000009000000ED +:10D6300005000020000100200400000000000000A0 +:10D640004100000000000000000000840000001005 +:10D6500000000000000021000000000000000000A9 +:10D6600000000002000000000000000000000000B8 :10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000400000005A -:10D6900000009000000000000000000000000000FA -:10D6A00000000088000100200001C01000000101FE -:10D6B0000100909000040040009000000000112044 -:10D6C00004400000C0000001A1018440000302C02A -:10D6D00000020040A0200004009002910008000118 -:10D6E0000000200000010000010000000000000018 +:10D68000000000000000000000000000000000009A +:10D690000000000000410140900300410004080424 +:10D6A0000120000400000000000000000000A008AD +:10D6B000001008900410000000000000000020C0CE +:10D6C0000040004000000000000000000001A0C079 +:10D6D00000840088C000000000000000000000007E +:10D6E0000000000000000001000001010001000036 :10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000800099 -:10D710000000000000000000000000000000000009 -:10D72000000000000000001108080510008800003B -:10D730001141092185030085000000000000000060 -:10D74000A00000000000000000048420890000A167 -:10D75000918000800080000000090905800800A079 -:10D760000011080000200008040003000000000071 +:10D700000000000000000000000000000000000019 +:10D710000000000000000008100304850004000061 +:10D7200000004000000000000000000000000000B9 +:10D7300088002100000080000000000000000000C0 +:10D74000008000000000000000090002000200024A +:10D7500080000000008000000000000000000000C9 +:10D76000000000000000000000410003020400105F :10D7700000000000000000000000000000000000A9 :10D780000000000000000000000000000000000099 -:10D790000000000000040000000000000000000085 -:10D7A000000000890000000041801003110541893C -:10D7B000000020004183201109090000000300003F -:10D7C00000008800A19011808208410440054004B7 -:10D7D00003880000008000800000000000000000BE -:10D7E00000002000C1002011801000000004808093 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000001000000000000000007 -:10D820000000000000040088000000900140011189 -:10D8300001890000002000050003014100000040B4 -:10D8400000900000891021048504080000100040A9 -:10D8500001C10189400004C008A084002000A0008C -:10D860008400100010081000C001C0010000A000DA -:10D8700040848282000000000000000000000000E0 -:10D880000000000000000000000000000000000098 -:10D8900000000000001000020090001000000000D6 -:10D8A00000000000000000000000080000C10000AF -:10D8B000000001A10000000000018800010100003B -:10D8C00000000000000000900008904001C000002F -:10D8D000040101000000414000A002048984C0004E -:10D8E0000001000010010000000000010001000024 -:10D8F0000001000100000000000000000000000026 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000800000000087 -:10D92000000000000000000000000000800000096E -:10D93000000000080811000000204103A020114150 -:10D940000000000000000000000000800080048053 -:10D9500000050040050309039000008080000900D5 -:10D960000009090803201010001010000210001117 -:10D97000000400200005100400000000000000006A -:10D980000000000000000000000000000000000097 -:10D990000000000000000000000200000000000085 -:10D9A0000000000000000000000280008000000075 -:10D9B0004189110088008303000041022011090001 -:10D9C0000300000080008000800008848880100030 -:10D9D0008302410091008800054080000091008092 -:10D9E0008000000400800080000000A008910380F7 -:10D9F0000908000000000000000000000000000016 -:10DA00000000000000000000000000000000000016 +:10D7900000000000000000001100218310021009A9 +:10D7A00080118080808580800000000000000000E3 +:10D7B0000000000000218080800000000000004088 +:10D7C00000008000000080008000000000000000D9 +:10D7D00000000000000880000000000000000000C1 +:10D7E00000000000000000000000400005000400F0 +:10D7F00041110000000000000000000000000000D7 +:10D800000000000000100000000800000000000000 +:10D81000000000000000000000000088010300205C +:10D820000040020004108203041000000000000009 +:10D83000000000000200C004A0100888000000885A +:10D8400000010008020020000200C00000000000EB +:10D85000000000004000020104100400000000006D +:10D8600000000000000000000000000000080000B0 +:10D87000010001C1000000000000000000000000E5 +:10D880000000000001000000C000000000000000D7 +:10D890000000000000000000000000008200050001 +:10D8A0000001C100C00020000000A0000000000036 +:10D8B00000000000000008880088404184880000C3 +:10D8C000000002000000C0020002000000C00000D2 +:10D8D000010001000000C09008880088A00400003A +:10D8E0000000000000000000000000000000000137 +:10D8F0000000010100010000000000000000000025 +:10D900000000000000001000000000000000000007 +:10D9100000000000000000000000000000000020E7 +:10D9200011104121200280008000000089000000C9 +:10D9300000000000000000008811000480058883BA +:10D940002000000080000000808000800000008037 +:10D9500000001000100000008000008000008080A7 +:10D9600000000000000000000000000000000000B7 +:10D9700000200540100400410000000000000000ED +:10D980000000000000000000002000210000000056 +:10D990000000000000000000000000000000000087 +:10D9A00003A0210040000404000200000000000069 +:10D9B00000000000000000000000801000050011C1 +:10D9C00000000000000400000000000200020080CF +:10D9D0000000000000000000000080020040000085 +:10D9E0000000000000000000000000000000000037 +:10D9F00000004105050404000210000000000000C2 +:10DA00000000000000000000000000010000000015 :10DA10000000000000000000000000000000000006 -:10DA200000000000000000000000020110004000A3 -:10DA300088002188C10084000800000011009001C6 -:10DA4000C1000300900010001000080020C00982EF -:10DA50009004A000910402000200080008000004E5 -:10DA600082840800000000820040000000C100091C -:10DA7000014000010000A0880210C000000000006A +:10DA2000000002A0880008001100000004A010847B +:10DA300004000000000000000000000002019088C7 +:10DA40009001C0000000000100000000000100C0C3 +:10DA5000000200000000000000000000C00188A0DB +:10DA600004080800000000000000000000000000A2 +:10DA70000000000001820000010001010000000020 :10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000081000005 -:10DAA000070000000000000000000000000000006F -:10DAB00000000000810000E0000000000000810084 -:10DAC00000E00000000000000000000000008421D1 -:10DAD00000E007008200000000E0000000000000FD -:10DAE00000000700500000000000000000000000DF -:10DAF00000E0000042000000000000000000000004 +:10DA9000070000000000000000000000000000007F +:10DAA00000000000500000E000000000000000E066 +:10DAB00000006000000000000000000000000042C4 +:10DAC00000000700000000110000070000000081B6 +:10DAD000000007006000000000000000000000815E +:10DAE00000E00700600000000000000000000000EF +:10DAF000000000000000818141E0070000000000FC :10DB00000000000000000000000000000000000015 :10DB10000000000000000000000000000000000005 -:10DB20000000F0F0F2F20000000000000000CFCF93 -:10DB3000CFCF0000000017FF000000000000000031 -:10DB4000FD00F10000000000F7F4000000000000FC -:10DB500003FF55550000F0F00B0F0B0A000000000A -:10DB60000808FBFB8397829600000000000000007D -:10DB7000000000000000000000FF00FF00000000A7 +:10DB2000000000000000AAAAAAAA00000000BFFF8F +:10DB3000BFFF000000000000000000000000000027 +:10DB40000F550F553E0EFECE0000000000000000F5 +:10DB5000000000000A0A0C0C000000000000000099 +:10DB60004000F000EAEAC0EA000000000000000007 +:10DB700000000000000000000000000000000000A5 :10DB80000000000000000000000000000000000095 :10DB90000000000000000000000000000000000085 -:10DBA0000000000000FF82FF0000000000000000F5 -:10DBB000CF4D0C4D0000000017FFFFFF3C3C000064 -:10DBC0000000FDFFF1FF00000000F7F4FFFF000080 -:10DBD00000003FFF555500AAF0C0FBFFFBFA000014 -:10DBE00000000808FBFB0115001400000000000005 -:10DBF0000000000000000000000010FB10FB00000F +:10DBA0000000000000000000303F00000000000006 +:10DBB000BFFFBFFF000000000000000000000000E9 +:10DBC0000000FFC300C33202F2C2000000000000E8 +:10DBD0000000000000000A0A0C0C00000000000019 +:10DBE000000000000000C0C0C0EA0000000000000B +:10DBF0000000000000000000000000000000000025 :10DC00000000000000000000000000000000000014 :10DC10000000000000000000000000000000000004 -:10DC200000000000000000000000000000000000F4 -:10DC30000000BEBEBEBE00000000FFC3FFC3000068 -:10DC400000000000CFCFCFCF00000000FF00FFFF9B -:10DC500000000000FFFF00FF0F0F7D55FCFCFCFCE7 -:10DC600000000000F0C300AA4908490850FA4141E9 -:10DC70007D7D282800000000FF003C3C00000000E3 -:10DC80005555555F00000000000000000000000036 +:10DC200000000000000000000000C300C30000006E +:10DC30000000FFFFFFFF00FE005400000000000096 +:10DC400000000000A0A003F38F80DFD000000000E0 +:10DC50000000000000000000FFBE000F00000000F8 +:10DC6000000000000F0F0F0F0000554100000000E2 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 :10DC90000000000000000000000000000000000084 -:10DCA0000000000000000000000000000000000074 -:10DCB00000000000BEBEBEBE00000000FFC3FFC3E8 -:10DCC000000000000000CFCFCFCF00000000FF0019 -:10DCD000FFFF00000000FFFF00FF0F0FFFFFFCFC35 -:10DCE000FCFC00000000F0C3FFAA4908CB8A50FAF0 -:10DCF000EBEB5F0A5F0A0000000055550F0F0000B4 -:10DD000000005555555000000000000000000000C4 -:10DD10000000000000000000000000000000000003 -:10DD200000000000000000000030000000000000C3 -:10DD30000000000000000000300000000000004073 -:10DD40003001C0010000000000013001C0000000EF -:10DD5000000030000000000000613036C095000176 -:10DD6000006130070001000105005A0800000001B1 -:10DD700000610006000D00000061000000010005C8 -:10DD800000610006000D000000000000000000001F +:10DCA000000000000000000000000000C300C201EE +:10DCB00000000000FFFFFF7C01FFABFF0000000041 +:10DCC000000000000000AFAF03F38F80DFD0000042 +:10DCD000000000000000FF000F0FFF14000F000005 +:10DCE0000000000000005F5F5F0F0000F5EB000028 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD100000000000000005000A08050000A0000047 +:10DD20000000000000000000000000000000006192 +:10DD30003007800D000000613007000D000000007A +:10DD4000000000000000000005614A2E050D00A043 +:10DD500005000A28050000A0000020280040010856 +:10DD600000610006000D0000A061002E000D000102 +:10DD700000000000000000000000000000000000A3 +:10DD800000000029800201A0000000000000000047 :10DD90000000000000000000000000000000000083 :10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 -:10DDC000FD01FFFC0000FFFF00003C2DFFBEF3FF44 -:10DDD000E8F00000000000000000404000000000EB -:10DDE00000002828C0FC053CFF00000000000000E7 -:10DDF0000000000000003030F3F37D287D2828AAC1 -:10DE00007DFF000000000000FFFF00000000000098 +:10DDB000D5D5DFD52AAA00AA000000000000000087 +:10DDC00000000000000000000000000000000C0C3B +:10DDD000FCFC00000000000000000000000000004B +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE000000003030FF5F3C00F00000000000000028 :10DE10000000000000000000000000000000000002 :10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000000000000000E2 -:10DE40000000FD010300003CFF3C00003C2D0014DD -:10DE50003000E8F00000000000000000400000007A -:10DE600000000000EBEBC0FC053C000000000000DF -:10DE7000000000000000000082BE82BE0F0F0F0FE6 -:10DE800028007D5500000000C000FF3F000000009A +:10DE300000001515101520AA00AA0000000000001F +:10DE400000000000000000000000000000000000D2 +:10DE50000AFA0AFA000000000000000000000000BA +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000030300F5F3C00F0000000000098 :10DE90000000000000000000000000000000000082 :10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC00000000000FFCF000CAFFF10BF0000FF00FC -:10DED0005555C0F0FCF000000000000000000000FC -:10DEE0000000F0FAFCFEFF3C003C1F1A1A1A00006A -:10DEF0000000000000002D2DFFAA00000000F7F731 -:10DF00000707F07DF07D0000000000000000000029 +:10DEB000000000007F7540450000004D000000009C +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000004D4DFFC3000000000000D6 +:10DEF0000000000000000000000000000000000022 +:10DF0000000000000000F000BFBFFF003AFF00006B :10DF10000000000000000000000000000000000001 :10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000000000000E1 -:10DF4000000000000000FFCF000C005010BF0000D8 -:10DF5000FC0C5F50C0F0FCF000000000000000006E -:10DF600000000000F0FFFCFFFFFF00001510101084 -:10DF700000000000000000002D2D550000000000F2 -:10DF8000F4F40404F028F028000000000000000071 -:10DF90002080008000801110100020000000200070 -:10DFA00020002000400020001000000000000000C1 -:10DFB00020000000880088008800200000802000E9 -:10DFC00020002000200820008800010000008800B8 -:10DFD000000320000182210020002000200000809A -:10DFE00020C02000200020000000200200000000CF -:10DFF0008880200000000000200020000000840035 -:10E00000200020050000200040002080C0094000C2 -:10E0100020004002400200022001400000004000B9 -:10E020000000000040000000000040000000000070 -:10E03000000040004000410000000000000000021D -:10E0400000000000000000000000000020000000B0 -:10E050000002000040000403040000000000000073 -:10E06000001009110000000000002000090100005C -:10E070000902000200900090200000000000000053 -:10E0800000000090400000000000000000024090EE -:10E0900000000808200420008202208904000000FB -:10E0A0000200000000000020900220880000000014 -:10E0B00000000000000400000000000090000008C4 -:10E0C0000000084000000408000040800000000438 -:10E0D00000000040000040009000000008000080A8 -:10E0E0002020008004000000000000004000000923 -:10E0F0000000000000000009000090004000040043 -:10E100000005900001100400000004410000900090 -:10E11000000001080008808580C000898002000896 -:10E120000008000800840008000100838004000843 -:10E1300000840082000000000008008400840008C1 -:10E140000082000800840084800100108020008884 -:10E15000000100080001000080880088000800001D -:10E16000002080110020800000880000000880004E -:10E1700000080000000800080208000000108000ED -:10E1800000820000000840000000000000080000BD -:10E1900000C000C00884008801C120882008908841 -:10E1A0000003000000000000002100000002001039 -:10E1B000000000000008000300080000000000004C -:10E1C0000000000900000000000000000902000536 -:10E1D0000000000000000208000000032102000906 -:10E1E0000200840000000008A040000000000000C1 -:10E1F0009000001001000010000040210000882164 -:10E200000088000900414021002100054021004113 -:10E21000840800050008004188052004C10480002E -:10E2200000040000000000000000000000000001E9 -:10E2300000010000000000000000000009000000D4 -:10E240000000001000000300001000004000C001AA -:10E25000000009000000050080000000030040915C -:10E260000000C100050405000000000100000000DE -:10E270000000020200040200000240200200000030 -:10E2800003000310204041000500000000000004CE -:10E290001090000800020090000000000003000041 -:10E2A000004182400000000000000000A0000000CB -:10E2B0000820830008000000080008048200000015 -:10E2C000000008000800000082001000100800098B -:10E2D00000002000010040000000200400000000B9 -:10E2E000000000000000A0000000C000100000417D -:10E2F000880008400800A00000000800004100114C -:10E3000000110008001090004082C0000040C011C1 -:10E31000A004C00020909002A0029000000200C063 -:10E32000008400840800000000400900000009008B -:10E330000000040804C0000000000000008400C0C9 -:10E3400000000000000000000000000002848000C7 -:10E3500000000000800010084000009080000000D5 -:10E360000008410011900500000000C0000000C03E -:10E37000000000008088800000A04000800008A00D -:10E3800000000000040120000084001105000010BE -:10E3900000A002000204000300100000219000050C -:10E3A00084000000000400000003200000000008BA -:10E3B000000000000020002000000000000000031A -:10E3C00000000000000800000000000000008200C3 -:10E3D0008800000000402000080011008421000097 -:10E3E0000000C00020000000040200000010000037 -:10E3F0000090004000000040024100050011822111 -:10E40000000000210010030240008205902140839B -:10E41000A088C005004100080003A0000002A04140 -:10E42000A008000000000001000000000000000043 -:10E4300000000000000000010001000000000000DA -:10E4400000000000000005000000000000000000C7 -:10E45000000000040000000480000940900000005B -:10E4600000000000200005000000800005082000DA -:10E47000000000410400022040200900400000404C -:10E48000000000880090000108000900400005001D -:10E490000310001000900900210000040004000196 -:10E4A00000A0000000000000002100C104000040A6 -:10E4B0000021C00500000000000001020000000073 -:10E4C000000000000000000000000011000000003B -:10E4D000000000000000000000000004000404111F -:10E4E000C080002100000400A000000082000000A5 -:10E4F0000041000000412004080000090040822182 -:10E500000008000520212121820500210208008346 -:10E51000080584052021C085090520412041881176 -:10E520002084A12100410000000011002002000011 -:10E5300000000000000041900000000040110000B9 -:10E5400000000000200000000000000000000000AB -:10E550000000000000000000000000000000008239 -:10E560000000090400C0000080000000000200005C -:10E57000000000C000000004000080000000000057 -:10E58000000002000000000040C020402000000009 -:10E59000020220400220002000020202008211102C -:10E5A000000800104000001000018400110100016B -:10E5B0000000000000000000000091008800000042 -:10E5C000000000000000000000000000000000004B -:10E5D000000000000000000010A00000C02010207B -:10E5E00000000100209000C0000000C00083000077 -:10E5F000002002C1001100010402021009208882DB -:10E60000C088081008411083C020020908882083B0 -:10E61000C08409840988A083C0100101010084011D -:10E620000000C01185410082A00200080003880399 -:10E630000010000000000000000000009100000039 -:10E6400000000000000000000000000000000000CA -:10E650000000000000000000000090800900800021 -:10E6600000000000090040000000000000C0002180 -:10E670000005000380890090001000841100A08034 -:10E68000008080008088859000C080A010C1A00319 -:10E6900010888984A085C02100888084201002030E -:10E6A00080020903008240880491009110C1830018 -:10E6B0002004898400000000000000009100000098 -:10E6C0000910C10000000000000000000000000070 -:10E6D00000000000100004001000400004000211BF -:10E6E000C080C10010004110209141000000008056 -:10E6F00000080004002000800005801180028000D6 -:10E7000080108000800000008004800300008041B1 -:10E710008020009080808000804000800008800081 -:10E72000800000008000400005088005050591116B -:10E730008300100108A0000000000000000040005D -:10E740009002890183040000000000000000000026 -:10E750000000000000000100000000000000400078 -:10E76000A001A140910001900083008501080000F4 -:10E7700000400021008800C020084040A00808C0D8 -:10E7800008000811408808848800088402880284F0 -:10E79000400008118840080410A00803880202A164 -:10E7A000100020002000C084A0408503044004889D -:10E7B0000000210001000000000000000000000037 -:10E7C00000010000C0000000000000000000000088 -:10E7D0000000000000000000000000000000000039 -:10E7E000C01100880003891100010001000001012F -:10E7F0000001010001002100830020900108400871 -:10E8000000C0C009000810050211C102000891A053 -:10E810000803C088000810858808C18988098440D9 -:10E820000802000001010100000010A0018485041D -:10E83000C108002091202102100200000000000009 -:10E840000000110900200020000500000000000069 -:10E8500000000000000000000000000000000000B8 -:10E86000000080090002004011C1000900030003FC -:10E8700011410001410010000300090002000800DE -:10E8800080000080A08400A180200090A010208241 -:10E8900008119109A011218484C041829004009044 -:10E8A000218885101104200820000005A0400209DD -:10E8B00005A0A1850311090810A1050300000000AF -:10E8C0000000000000C00021000000000000000067 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000900090000000000090084201158 -:10E8F000200003030001030088201100A000210470 -:10E90000112084000400004000840000000000404A -:10E9100080C080800000000500A0000000000021F1 -:10E920009083048004000004008000800000002028 -:10E9300040040980041100900021018301010000BE -:10E9400000000000000000910020102000000000E6 -:10E9500000000000000000000000000000000000B7 -:10E96000000000000000A0C000104040000020880F -:10E970009001C00005010001C0000801200008004E -:10E9800021000504084088002001C0111002C000C9 -:10E99000880120118408C000040002111002C00088 -:10E9A000040004111008C00000010020000800004D -:10E9B000044111A0C0401100000000E0000042002E -:10E9C0000000000000000000000000E00700000060 -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000008100E0070060213E -:10E9F000810000E0000000000000000000000700AF -:10EA00008400820000E00700000000000000070012 -:10EA10004212000000000700421200000000070040 -:10EA20004212000000000700421200000000000037 -:10EA30000000000000000700000A000000000000C5 -:10EA4000000000000000000000000000F0F00000E6 +:10DF30000000000000007F7F40400000FF4D000017 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000004D4D3C0000000000DB +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000F0001F1F00003AFF2A +:10DF900088002000000000000005200040020082F0 +:10DFA0002080A08420808980200020002100208003 +:10DFB00040002005820040000000040000004000F6 +:10DFC0002000000020002000880000000000200049 +:10DFD00000030091000220084004400020000020BF +:10DFE0002020200040004000200020080482400043 +:10DFF000108088000004880040040400200004040D +:10E00000200020022000200088004091200088008D +:10E010004000400000000000000000000000C001BF +:10E0200000030020002008022020800200A0209091 +:10E030000004C040000000000000002000000000BC +:10E040000090000000000000000000004000000000 +:10E0500000080000202020000804800121020000A8 +:10E0600040014001000000000004094008A0001128 +:10E07000000000040800000100C008002084000027 +:10E08000400000900000000200020000002011008B +:10E090004000100000000000000000000010200000 +:10E0A000848040080000000000000200000083009F +:10E0B0000400000000000100050000000100000055 +:10E0C00000000210020000410000000002000000F9 +:10E0D0008200020800000000040000000080000030 +:10E0E000000000000000000000000000021002100C +:10E0F0000800048004800000000002000800000006 +:10E100000000000000000100000001100800028073 +:10E1100002000000000000000008000020000000D5 +:10E1200080080002801100880090020805080300A2 +:10E13000200000000008000020081000000808006F +:10E1400000082008000800080000000800080084FB +:10E150000000000800840000000800040084204043 +:10E1600000080408008400080008000000041004EF +:10E170000000800000022004008400000010000065 +:10E1800000080404001000C04010000810040084BF +:10E19000410200080008000000000000000000002C +:10E1A00000000000400000004000000004809000DB +:10E1B0002009A004820020000005000000000000EB +:10E1C00000000021000000410421042100000000A3 +:10E1D000A0210005400020000000202000210011A7 +:10E1E0000000002000002003002100090021900809 +:10E1F00088000002000000414040000000200004B0 +:10E2000000040000000000050009000800000000F4 +:10E210000003840400000000880000000000008467 +:10E22000000800000000880000040000000000203A +:10E2300000000084000500000000080010004100FC +:10E2400000000008000008000000000000A000A07E +:10E2500000400000000040A0008200000200040016 +:10E26000000400002189210021840084000000A016 +:10E270000000000800000000000080001100000005 +:10E2800000010001000000842100000800000000DF +:10E29000000000002103000000000000000000005A +:10E2A000200010000002000084800808C000000860 +:10E2B000C000A0100800A0000008820000000000BC +:10E2C00001000000040000000840000800000000F9 +:10E2D0000000C000C00000000005000000000100B8 +:10E2E000000000802000000004000000040840003E +:10E2F0000000084000000000000040040040000052 +:10E3000000000000A0000000000082401004000097 +:10E3100010001000A00008000000C00082000000F3 +:10E320000000020000000001008200020000000066 +:10E330000001000000840504000000080000000047 +:10E3400000002000000000000000000000000000AD +:10E3500000000000000008000000080000000000AD +:10E3600040000000000480000004800004088000D9 +:10E370000000110000001000000000080000000074 +:10E38000002000000090000000000040000000009D +:10E390000000000000000000400000000804001021 +:10E3A0000000000000000000000008004003100012 +:10E3B00000080040000000000402400040801040BF +:10E3C00000040000000882001000000300000000AC +:10E3D00000400800000000008200080082000000E9 +:10E3E0000000000000000020000004000000040005 +:10E3F0000000000000080000C00000000000000055 +:10E400000000000400040000000400000000000000 +:10E4100000000000000000000800000000000003F1 +:10E42000080000000000000000000000000080085C +:10E43000000000000000400009000000910080047E +:10E440000000000800000000000003000302082094 +:10E45000000000000040020000000000000000007A +:10E4600000400000028841A00490099080000088CC +:10E4700080000000000000000000040040001100C7 +:10E48000000000000001002100400803000000001F +:10E49000000000000000000000000000000409A0CF +:10E4A00040000000000000000000840000000000A8 +:10E4B000000882000000C04000000080000400004E +:10E4C000000800108221002100000000002100400F +:10E4D00000000000880000000000000000000000B4 +:10E4E000200040000000200020042008000000045C +:10E4F0000009001100000000C005000500054000F3 +:10E50000824100081041000000080840000000049B +:10E510000000000504008800001000080000000052 +:10E5200000001000000000000000000000000000DB +:10E5300000000000000000000000000000040008CF +:10E54000000000000000000000002000204000004B +:10E5500000000000001000000000000000000000AB +:10E5600000000084000000008000800180000000A6 +:10E57000000000000000002000000000000000007B +:10E5800000020000001000000084002000090000CC +:10E59000020000080000000000000000020000006F +:10E5A00000022008004000080000000000000000F9 +:10E5B00000008901880000000000880010000000B1 +:10E5C0000100840041000000000100004001000043 +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000010A10204096B +:10E5F000009100000000000000000000000000008A +:10E60000000000A00004050400100100000000004C +:10E6100000000000000000000000000100010000F8 +:10E6200000000100000101000000000000000000E7 +:10E630000000002008100020000000009100890068 +:10E6400000001100020083000000004103080408DC +:10E6500000040000000000000000000000000000B6 +:10E660000000000000000000000000000988838313 +:10E6700005880010000000000000000000000000FD +:10E6800000000000008000800400008011000000F5 +:10E690000000000000000000000000000041000831 +:10E6A00000020002112000020241000200000000EE +:10E6B0000000000011800900020020A140000300BA +:10E6C00004000300080809001110211011000900BE +:10E6D0004004211100000000008000000000000044 +:10E6E000000000000000000000000000000003889F +:10E6F00010020208030800000080000000800000F3 +:10E7000000000000000000009010118021000002B5 +:10E71000002100890000000000000000000000004F +:10E7200000000000000000100000000000000000D9 +:10E7300000000000000000C000000100008901008E +:10E74000008800000120009100000000010100028B +:10E7500000000100010000000000000200000000B5 +:10E7600000000000000000000000000000000000A9 +:10E770000091019000830190000000080000000853 +:10E7800000000000000000009002100000080000DF +:10E7900000000000009000000000000000000000E9 +:10E7A0000000000000000000000100000000000068 +:10E7B0000000000000000000000100000000000058 +:10E7C0000000000108010001000088004001010173 +:10E7D0000001010100010001000000000000000034 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000C001A0000001400100000000020074 +:10E800000000000000000000000000010000000007 +:10E810004101000084000000000000000000000032 +:10E820000000000000000000000001000000820065 +:10E8300000000000000000000000000802081008AE +:10E840000005080200080010004100200005000833 +:10E850000420000808034108041000000000000024 +:10E8600000000000000000000000000000000000A8 +:10E870000000000008102100032110200200000009 +:10E880000000000000000000000000000003000580 +:10E8900000028811000000000000020000000000DB +:10E8A0000000000000000200410000001000110004 +:10E8B0004100000000000000000000004120211184 +:10E8C0002100034100090040000000404104050808 +:10E8D0000200030321081020030003108000000041 +:10E8E0000000000000000000000000000000000028 +:10E8F000000000000000831109041000C00800049B +:10E900000000000000000000000000020000408243 +:10E910008980400091110005800080000000000007 +:10E9200000000000000000200000000000000011B6 +:10E93000004100000000000000000000000001880D +:10E9400000010100010100900000000000010091A1 +:10E9500000000100010001090100000001000400A5 +:10E960000800400008000000000000000000000057 +:10E9700000000000000000000221100191000401CD +:10E980000001000000000000000000000000000086 +:10E99000C1C102084000A101100004000800A0004D +:10E9A0000000000000000000000000000000000067 +:10E9B0000001000000000000000000000000000056 +:10E9C000000000E000008811810000E00700000066 +:10E9D000810000E000000000820000E00000000074 +:10E9E0000000000000000000000000000000000027 +:10E9F00000000000000000000000880000E00700A8 +:10EA0000000000810000070000000000000000007E +:10EA10000000810000E000006000810000E00000D4 +:10EA200000000000000000000000000000000000E6 +:10EA30000000480000E007000000000000000000A7 +:10EA400000000000000000000000000000000000C6 :10EA500000000000000000000000000000000000B6 -:10EA600000000000000000000000606090902000A6 -:10EA7000240000F1FFF1000000000000F0F70007A3 -:10EA8000000000000000FFC9C3C300F9000000003F -:10EA90000000000000000000000000000000000076 +:10EA60000000E4FF000000000000000000000000C3 +:10EA7000000000000000000000000000F606FCFCA2 +:10EA80000000000000000000000000000000000086 +:10EA90000000000020002400000000006F436F43CE :10EAA0000000000000000000000000000000000066 :10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000F0F066 +:10EAC0000000000000000000000000000000000046 :10EAD0000000000000000000000000000000000036 -:10EAE000000000000000000000000000FFFF9F9FEA -:10EAF00030003C0000FDFFFD000000000000F0F4CD -:10EB0000000400000000FFFFFFC900FF00F9000043 -:10EB100000000000000000000000000000000000F5 -:10EB200000000000000000000000000000000000E5 +:10EAE00000000000E4FF0000000000000000000043 +:10EAF0000000000000000000000000000000F6061A +:10EB00000C0C0000000000000000000000000000ED +:10EB1000000000000000202024240000000000006D +:10EB20006F43000000000000000000000000000033 :10EB300000000000000000000000000000000000D5 :10EB400000000000000000000000000000000000C5 :10EB500000000000000000000000000000000000B5 :10EB600000000000000000000000000000000000A5 :10EB70000000000000000000000000000000000095 :10EB80000000000000000000000000000000000085 -:10EB900002102000008810840210200000881084D9 -:10EBA00002102000008810840210200000881084C9 -:10EBB0000000000000000000021020000088108407 -:10EBC0000000000000020000000000000000000043 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 :10EBD0000000000000000000000000000000000035 :10EBE0000000000000000000000000000000000025 -:10EBF000F6F6343499109911CFCFCFCF0000000032 -:10EC0000000000FF42420000000000FFFFFF8303FE -:10EC1000B33300000000000000000000000000000E -:10EC200000000000000000000000000000000000E4 -:10EC3000000000000000303FF6F600000000000079 +:10EBF0000000000000000000000000000000000015 +:10EC000000007E0C7ECF000000000000000000002D +:10EC1000000000000000000000000000B0BD838381 +:10EC200083830000000000000000000000000000DE +:10EC300000000000000000000000000000000000D4 :10EC400000000000000000000000000000000000C4 -:10EC50000000000000000000800000000000000034 +:10EC500000000000000000000000000000000000B4 :10EC600000000000000000000000000000000000A4 -:10EC70000000F6F6000099009999CFCFCFCF0000A1 -:10EC80000000000000FF42420000000000FFC3C37C -:10EC90008000B03000000000000000000000000014 -:10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000303F060600000000D9 -:10ECC0000000000000610007000D000000000000CF -:10ECD0000000000015610A0E050900A000000000F8 -:10ECE00000000000000000000000000000610006BD -:10ECF000000D0000006100360009000000603005D2 -:10ED0000C000000000000561340E050D00A0056183 -:10ED1000340CC59D00A000610006000D00000061DC -:10ED20004006000D000100610006000D00000061BA -:10ED30000006000D000000610006000D00050061E6 -:10ED40000006000D0000FFF7FFFF000000010000BB -:10ED50000000000000000000000000000020000093 -:10ED600000000000000000000000000000000000A3 -:10ED700000000000000000000000003C30303C2D8E -:10ED80003C2DFFFAF0B4000000C3000000000000BA -:10ED9000BA00FF4500000000000000000000FFEF87 -:10EDA000000000002C2FECEF000000000303D7143C -:10EDB0000F0F0F0FF0F000FF000000000101BFBFB8 -:10EDC0003C3C3C3C00FF00FF000400000000000150 -:10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 -:10EDF000000000000000000000000000003CAAAA83 -:10EE00003C2D3C2D0050F0B40000D4D4D4D40000EC -:10EE10000000FB00FF0400000000000000000000F4 -:10EE2000FFFF000000002023E0E3000000003F3F60 -:10EE3000D7144F0E4F0EAAAA3C3C00000000000061 -:10EE4000FFFF3C2D3C2D30F300FF0F0F170F00800C -:10EE50000000000000000000000000000000003C76 -:10EE600000000000000000000000000000000000A2 -:10EE700000000000000000AF10BF00000000000410 -:10EE80003C3C00000000F3FFE8F0000041EBEBEB3E -:10EE9000000000003414F7D700000000000000005C -:10EEA0000000000004000000000000005555FF00B5 -:10EEB00000000000FFFFC00000000000FBEB0000AE -:10EEC000000000001E1EFFAAF0F0F0F00F0F0F0F61 -:10EED0000000000000000000000000000000000032 -:10EEE0000000C3000000000000000000000000005F -:10EEF000000000000000000000AF10BF0000000094 -:10EF000000000000000000003000E8F00000E1E137 -:10EF1000E1E1000000003414F7D700000000000019 -:10EF200000000000000000000000000000000F0FC3 -:10EF30003C3C000000003FFF000000000000FFFF1D -:10EF40000000000000001E1E5500E8E8F0F0400040 -:10EF5000000000004100200008000800840020009C -:10EF60000000000001032005000000000002210055 -:10EF7000000000000400200800008800000040801D -:10EF800000800088000020000000880000000003CE -:10EF900000000000000002002000008021800080AE -:10EFA0000000000000008800208000000000040035 -:10EFB000000000000000840020000000008002002B -:10EFC000000204004008100420000000002104009A -:10EFD0000000000040008800000080008000000069 -:10EFE000400040000000044000400000000000001D -:10EFF00004000000000020000000200000000000CD -:10F000002020002000200000000000000000000080 -:10F010000000200000000000800040000004C00448 -:10F020000004200000000300000000020000009027 -:10F030000000000000000000200000C000000004EC -:10F0400000000000400280058041410200004100B4 -:10F0500010000000108304030410040310200000BB -:10F060009005000000842021004000000005000001 -:10F070000000000000000000000900000000000087 -:10F080000000904004000400002000002000000464 -:10F090000010000000000000000800000000000058 -:10F0A00000800010000000000800000000000000C8 -:10F0B0000000000000000400022000200200000008 -:10F0C0000400840000404000001100000000000027 -:10F0D0000000001003C0802080088001800400111F -:10F0E00000000008000800418008000000880000BF -:10F0F000000000100084000000840008008400105C -:10F1000000100010008480008088000900008084C6 -:10F110000089000800000000000000400088000492 -:10F1200000080002000000000000001000080000BD -:10F130000008000800100000001000110001040089 -:10F140000008001004000000800000080088000093 -:10F1500004840010000000080009002000080005D9 -:10F1600000050008000000830004002000100000DB -:10F1700000080000000800000000C00500050002B3 -:10F1800000080000000000100000040304800003D9 -:10F19000C0000008A00000000003000800020200F8 -:10F1A0000100000200088280000040000000020010 -:10F1B00001000000000004002004040082000000A0 -:10F1C000084184000003040441004000400900009D -:10F1D0000000880000210000000000000000000086 -:10F1E00000000382030003840040000100010001CD -:10F1F00000000000080800000000000000100000EF -:10F200000000000041000800000021A08300A120B0 -:10F2100000C0058803A00300000041002100210078 -:10F220008004028220010000000200202000000073 -:10F2300040C002A0200020A000A00011A0C040A05B -:10F2400000C080C00010088220200288058403C00E -:10F25000008409000000000000000000840900058F -:10F260000000000000000090008500110000080070 -:10F270000800000500004000088000000000820037 -:10F280008400000000000800C0000083200000008F -:10F290000000840040910000820000000000000097 -:10F2A0000000080000000000000000000000000056 -:10F2B000040000000000000000000000000040000A -:10F2C00004000000C0000000004010114003820054 -:10F2D00040110441820000410011A0410082004021 -:10F2E0000000008200000008002000200010000044 -:10F2F00000A080A000A00000008800040000000022 -:10F3000000000000000000000300000000200000DA -:10F310000000000000008002000400000000000067 -:10F320000000000000000040000008000040000055 -:10F33000020000000040110000000000000020005A -:10F3400000000000008411040000009011C089C07A -:10F350000040008409000090000800020000002125 -:10F36000002100200000000000210005000301032F -:10F37000010004900441000000000009A004040002 -:10F38000000000001000000000000000A0000000CD -:10F39000000082000000000084080000000300005C -:10F3A000C000000000100040000200000000000348 -:10F3B00000000000000800200000000008200000FD -:10F3C0000000C0000004000040020003002001040F -:10F3D0000008001000000104A00000054000080221 -:10F3E000200000C008A008A00000000000000000ED -:10F3F0002000200080048084000000000000000144 -:10F4000004000000000000000000000000A0080050 -:10F410000020000000A00300020005000000210001 -:10F42000000008000288004000114091090000041B -:10F43000400011C0000002880040090411840088C7 -:10F44000008211C00984210800840900001000C056 -:10F4500008104001000005A0200000000588098870 -:10F4600000C00084002100210003000800000041CA -:10F4700000800004001100040808000500210005B8 -:10F4800008020004000000088200000002000008DA -:10F490008240000000000000820000008400200084 -:10F4A0000000000040000003000000000000000019 -:10F4B000000000000021000000000000000000002B -:10F4C000080000000000001100000000000502100C -:10F4D0000021844040020000000008000000900865 -:10F4E0002008022109200000000000A00000000008 -:10F4F00000000002000100900001008200000000F6 -:10F500000000000000000000000000840000000077 -:10F5100000000000000000000000000200000000E9 -:10F5200000000000000000000000000000000000DB -:10F530000000000000400000000000000440000047 -:10F540000010000400001108110409041140110802 -:10F550001190000820109105210411820000200064 -:10F56000409000842084000001000800000000009A -:10F57000000000880000C000C000010090000000F2 -:10F580000000080000000000000000000000000073 -:10F59000000000000000000000000000000000016A -:10F5A000200101000000000000024000000000C037 -:10F5B0000000010141010000000000000000000007 -:10F5C000000000010000000191A0008200850020E1 -:10F5D000001110090011000900010100C001000123 -:10F5E0000000000000000000000009008000000092 -:10F5F0000000000000000000800000000300800008 -:10F600000000030080000000000000000000000077 +:10EC70000000000000000000000000000000000094 +:10EC800000000000420C42CF000000000000000025 +:10EC90000000000000000000000000000000B0BD07 +:10ECA0008383838300000000000000000000000058 +:10ECB0000000000000000000000000000000000054 +:10ECC00000000000000000000000000000410004FF +:10ECD000000D000005610A0F850800A00061000713 +:10ECE000800D0000002100058005000000000000EC +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000561300F800D00000500CC +:10ED10000A20050000A000000000000000000061C3 +:10ED20000007800D200080610006800D00000000BB +:10ED300000000000000000610006000D00000565F5 +:10ED4000000F800D000000000000000000003CF0FB +:10ED500055FF00C300C30000000000000000C30016 +:10ED6000F0AA0E3ECEFEFFFFFFFF000300010000F1 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000FFF035355555FF0081 +:10ED90000000000000000000000000000000000073 +:10EDA000FEFCBE3C0ACBFFFF00000000000000009C +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0003CF055008080BCBC00000000007D7070DD +:10EDE000C3FFF0AA0232C2F2EAAAAAAA00000000F7 +:10EDF0000000000000000000000000000000000013 +:10EE0000000000000000000000000F003535C3C303 +:10EE1000FF000000000000000000000000000000F3 +:10EE20000000FEFCBE3C0ACBFFFF0000000000001B +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE50000000F555F5FFAFFAFFAA000000003030C2 +:10EE60003F3F00000000F5F0F5FF00000000FAAAA7 +:10EE7000FFFF000000000000000000000000000094 +:10EE8000000000000000000000000000FF4D3C4DAD +:10EE90000AFCFAFC00000000000000000000000076 +:10EEA0000000000000000000AAAAFFAA0000000065 +:10EEB0000000000000000000000000003F0F7D5532 +:10EEC000000000000FFF3C550000000000000000A3 +:10EED00000000000055505003C3C3C3C00000000E3 +:10EEE0000AFA0AFA00000000F3F0F3FF03030040FF +:10EEF000BABAFFFF000000000000000000000000A0 +:10EF00000000000000000000000000000000C34DF1 +:10EF1000004D0A0CFA0C0000000000000000000088 +:10EF200000000000000000000000FAFAFFFA0000F4 +:10EF300000000000000000000000000000003C0095 +:10EF40003C00000000000F003C55000000002000C5 +:10EF50002000200000082000200088002000400041 +:10EF60000100000020802000200088802000840014 +:10EF700020000004000440002000200420002000A5 +:10EF8000C000C000200020000400C00020000003DA +:10EF90002080200084000000880020002000200243 +:10EFA0000000200040001000218005802180218089 +:10EFB00088002002880088042000200088002000AB +:10EFC000880004002000C000910021028900A18077 +:10EFD000400000000002004000000000210004008A +:10EFE00020021000000000044000000000040000A7 +:10EFF00040000000000200000000000000000000CF +:10F0000040004000400040000000000000001002EE +:10F010000000400400000008100000401000000044 +:10F020000000400000908500808210041004200839 +:10F0300010044000100000004000400000000004E8 +:10F0400010004000200240022104040004A004003B +:10F050000420004000400400000000000000000800 +:10F06000000000000000000000000000000000049C +:10F07000000000000088000010020008000084006A +:10F08000020000000000000000000000000400007A +:10F090000000000000000000000000000000000070 +:10F0A00000000000000040004000000200080003D3 +:10F0B0000009000000000000000000000800040833 +:10F0C0000200000000000000000082080220040985 +:10F0D00008039000008400880008008400840084F5 +:10F0E0000000008800080008000000080000000080 +:10F0F00000010000000000090002001100000000F3 +:10F1000000080008020800080200000800000404CB +:10F110000088001000000008000800080008000433 +:10F12000000800080008020880888000000900002C +:10F1300000080084000000840484000200840000B1 +:10F140000082200802C000040008000000880009B6 +:10F15000800800820088000000000000001100000C +:10F1600000000000000000109000000090218203C9 +:10F1700000050000000000080000C00900020000B7 +:10F1800000000000400000004000000000000000FF +:10F19000000000080000000008009010400000007F +:10F1A000A000000000008800000000000003000034 +:10F1B00000000004000000080200000008004000F9 +:10F1C000400000000021000000080020000008109E +:10F1D00020000400000802000900030802000300E8 +:10F1E000000000000000110040000000008400004A +:10F1F000000000000800009000080008000800015E +:10F200000000000000000020000000A0000000003E +:10F2100000000800000000000000000000000008DE +:10F220000040000000840000008400000040000056 +:10F230000000000000000000040000A0000000002A +:10F240000000000803000000004003000000000070 +:10F2500000008000400000000000000000000041AD +:10F26000000882000000C002000000111008000029 +:10F270000004000000000000000000110000000970 +:10F280000000080000000000002000000000000056 +:10F290000000820000000800000000004041000063 +:10F2A000002100000840000082000000082000202B +:10F2B000080508080000081182000000080000008E +:10F2C0000011000000000040C00000000020000904 +:10F2D000A00008000809000000000811000000005C +:10F2E000000000000000000000000000000000011D +:10F2F000008200090082098400000000080000006C +:10F3000000000000000000080000000000000000F5 +:10F3100000820008008200000000040000000000DD +:10F3200000000000000009000000000000000000D4 +:10F3300000000000000900820000000000900000B2 +:10F3400000000000008400000000000000840000B5 +:10F350000088000000C000900000009000900000B5 +:10F36000000000000800000000000000000800008D +:10F370000000000000000000000801000400000080 +:10F380000000000000080000000000000000000075 +:10F39000000000000000000000400000000000002D +:10F3A0000000000000000008000000000400102021 +:10F3B00000000000010000000000008500030005BF +:10F3C00000000021000804210000000000000000EF +:10F3D0000000000000000000000000000900000024 +:10F3E00000000000000000000300000400040040D2 +:10F3F00040880520090400200300008420840508BB +:10F40000000003100884001000000000000000004D +:10F410000000000000000000008400000000000068 +:10F4200000000884002002081190000000A00020C5 +:10F4300004000000000240020000008800200000DC +:10F4400005000000000000000000000800000000AF +:10F4500000000000000000040000040000000400A0 +:10F460004000000300000000000000000000000059 +:10F470000000000000000000000000000011000873 +:10F48000000000000008000800000000000000214B +:10F49000000000000000000000000000000000006C +:10F4A00000000000200300000041000000021000E6 +:10F4B00010000400820000080000000300000000AB +:10F4C00000080003000000410000001100000000DF +:10F4D000040000090000000000000004000000001B +:10F4E000000000000082000000000000000000009A +:10F4F00000000000000800080000000000000000FC +:10F5000000000000000800000000000009000000EA +:10F5100000000000000800080000000000000008D3 +:10F5200000840000000080000000000000000900CE +:10F53000000000000008000800C0000000002000DB +:10F54000009000000008000009C00000000000005A +:10F550000000009020840000000004C000080000AB +:10F56000009000000000000000000000000000000B +:10F570000000000000000000000008000000010082 +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B00000000000000000000000A0008200000029 +:10F5C0000001910182000000000000000000000026 +:10F5D000000000000000000000000000000000002B +:10F5E0000000840001000000000000000000000096 +:10F5F00000000000000000000000080004000000FF +:10F6000008000000100000000000000000000000E2 :10F6100000000000000000000000000000000000EA -:10F6200000400020041000000000008000000000E6 -:10F6300000004008031082080010000000000000D5 -:10F64000000000110008002000081180001108903F -:10F65000000011C080030002000220414010801011 -:10F66000001000000000000000008000000000000A -:10F670008000000000000000000080020000000286 -:10F6800080000000000000000000000000000000FA +:10F6200000000000000000000000000000000200D8 +:10F6300000000000000000000000000085008000C5 +:10F640000000404182028400000000000000000031 +:10F6500000000000000000000000000000000000AA +:10F660000000000000000300000000000000000097 +:10F67000000000000000000000000000000000008A +:10F680000000000000000041000000000000000039 :10F69000000000000000000000000000000000006A -:10F6A0000080000000000040000300000000000592 -:10F6B0000080000010802100040003C00000000052 -:10F6C0000000000000000000000000000000001129 -:10F6D000808080800880212111911003100011008A -:10F6E000050041850000000000000000100090A00F -:10F6F000100004000000000000000004880040002A -:10F70000A001C0A0000000000000000000000000F8 -:10F710000090000000000000000000000000000257 -:10F7200000000010002000000001000100000000A7 -:10F730000082008200000108010001000089000031 -:10F7400000000000000000000000000000000200B7 -:10F7500000011040901001400100019101850190CD -:10F76000000001000188000000000000000000000F -:10F770000000100000010000000000000004004034 -:10F78000084090A000C0000100000001000000003F -:10F790000000000000000000000000000000000069 -:10F7A0000000400000000000000000000000000019 -:10F7B0000000000000000000000041010000000007 -:10F7C0000000000000000000000000000100000038 -:10F7D0000810010800900810400001008400C100DA -:10F7E0000001010002010000000000000000000014 -:10F7F0001109000000400041110900000000004014 -:10F8000000808000800000800002000300200000D3 -:10F8100000000000000000000000000000000000E8 -:10F82000110000008000000000000900000000003E -:10F8300000000000000000000000000503020803B3 -:10F840001040000000000000000000002100050042 -:10F850001000808008001080000080000300080075 -:10F86000400000081040880900200000000000004F -:10F8700000000000000800800000000000080000F8 -:10F8800000000009008000000000000900000000E6 -:10F890000000800000030000800000000000000065 -:10F8A00000000004000300000000032121004000CC -:10F8B0004000000000000000000000004121211075 -:10F8C0000400030200000000000000000008000027 -:10F8D00000000000000000000080000090A021084F -:10F8E00004000310418908210800081000000000EE -:10F8F00000000000000000A1001000000000000156 -:10F90000000000000000004000880000000000002F -:10F9100000000000900040002000040000000000F3 -:10F9200000000000000000000000000000010000D6 -:10F93000000001000000880004008800040001C1EC -:10F9400000000000010100000000000000000000B5 -:10F95000000000000000880008088808000011A0CE -:10F960001100090001000141010001000100000037 -:10F97000000000000000000000E0070000000000A0 -:10F98000000007000000008100E007004200810045 -:10F9900000E0000000000000000007000000000080 -:10F9A0000000000000000000000007000000000050 -:10F9B00000E0000000000000000000000000000067 -:10F9C000000000E000000000000000000000000057 -:10F9D0000000000000000000000000E00700000040 -:10F9E000810000E000000000880000E000000081CD -:10F9F0000000000000000000000000000000000007 -:10FA000000000000FFFF0000000000000000C30035 -:10FA1000000000000000000030FF35FF0000000083 +:10F6A000000000000000000000000000004000001A +:10F6B0000000000000000000000000000200410007 +:10F6C0000509058805000280414041000000000056 +:10F6D000000000000000000000000000000000002A +:10F6E00000000000002000000040000000000000BA +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000001D8 +:10F7300000000000000000000000000000000000C9 +:10F7400000000100008900000182000101080000A2 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000001008800010008000007 +:10F770000000000000000000000000000000000089 +:10F780000000000000010000000000000000000177 +:10F790000001000100010000000000000000000066 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000010001000136 +:10F7D0000000000000000000000000000000000029 +:10F7E00000000000000000000000000040000000D9 +:10F7F0000000000000000000000000000000000009 +:10F8000000020009000200410000000000000000AA +:10F810000040002000200041000000000000000027 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000008000800410020000408104110DA +:10F850000041000000000000000000000000000067 +:10F860000000000000000000000008000000000090 +:10F870000000000000000000000000000000000088 +:10F880000000000400000000000000000000000074 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000040000000000000000000044 +:10F8C000000000004183030005000009410802090F +:10F8D00010002002000000000000000000000000F6 +:10F8E0000000000000000000000000000000000414 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000001100000000000000104A1 +:10F9500001000100000100000000000000000000A4 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F98000000000000000810000E000000000000016 +:10F9900000E0000000000000000000000000000087 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000810000E000000000E6 +:10F9C0000000000000000000000000000000000037 +:10F9D000820000E0070200000000000000000000BC +:10F9E0000000000000000000000000000000000017 +:10F9F000001100E00700000000000000000000000F +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 :10FA200000000000000000000000000000000000D6 -:10FA30000000000000000000000055555555000072 +:10FA300000000000000000000000000000000000C6 :10FA400000000000000000000000000000000000B6 -:10FA500000000000000000000000FF00FF00202F59 -:10FA6000E0EF0000AA0A0000000000000000000013 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 :10FA70000000000000000000000000000000000086 -:10FA8000000000000000FFFF000000000000AAAA24 -:10FA90000A00000000000000000030FF35FF0000F9 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 :10FAA0000000000000000000000000000000000056 -:10FAB000000000000000000000000000CFFF0CFF6D +:10FAB0000000000000000000000000000000000046 :10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000A00086 -:10FAE000202FE0EF0000AAAA0000000000000000A4 +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000000000000000000000000016 :10FAF0000000000000000000000000000000000006 -:10FB0000C3001717F0F0F0F0000000000000000044 -:10FB10000C0C0005000000000000000000000000C8 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 :10FB200000000000000000000000000000000000D5 -:10FB30000000000000000000000000000000FFFFC7 -:10FB4000C3C300000000000000000000000000002F -:10FB50000000000000000000000000000000FFFFA7 -:10FB60007C3CFFEB554100510055000000000000B7 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 -:10FB80000000C3001414F0F0F0F0000000000000CA -:10FB900000000C0C0000000000000000000000004D +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 :10FBA0000000000000000000000000000000000055 :10FBB0000000000000000000000000000000000045 -:10FBC000FFFFC3C3000000000000000000000000B1 +:10FBC0000000000000000000000000000000000035 :10FBD0000000000000000000000000000000000025 -:10FBE000FFFF5000BEAA1400001000140000000027 +:10FBE0000000000000000000000000000000000015 :10FBF0000000000000000000000000000000000005 -:10FC000005610A0E050C00000561000E000D00A044 -:10FC100000610037009D00A500610006C0090000DA -:10FC200000000008000000000000000000000000CC -:10FC300005000A08050000A000610005000D000095 -:10FC4000000000003000000000000061000700110B -:10FC50000000000000000000000000610006001D20 -:10FC6000000000610003000D000000610006C005F7 -:10FC7000000000610006C019000000000000000044 -:10FC8000000000000000FFC3141400000000C3C304 -:10FC900000000000000000000000000000003E0A1C -:10FCA0003E0A00000000000000000000000000000C -:10FCB00000000000000000000000F0F0F0F0000084 +:10FC000000000000000000000000000000000000F4 +:10FC1000006100078008000000610007000D00007F +:10FC200000610006000D0000000000000000000060 +:10FC300000000000000000000000000000000000C4 +:10FC4000000000650007800D0000000000000000BB +:10FC5000000000610006000D000000000A0980029B +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000005610A2F050DD3 +:10FC800000A00000000000000000000000000000D4 +:10FC9000000000000000F300A200000000000000CF +:10FCA00000000000000000F0003C00000000000028 +:10FCB0000000000000000000000000000000000044 :10FCC0000000000000000000000000000000000034 -:10FCD000FF003800000000000000000000000000ED -:10FCE000000000000000000000000000F500F4002B -:10FCF0000000000080200000BFA3BFBF0000000084 -:10FD0000000000000000000000C314140000000008 -:10FD1000C3C300000000000000000000000000005D -:10FD2000FEFAFEFA000000000000000000000000E3 -:10FD3000000000000000000000000000FC0CF404C3 -:10FD40000000000000000000000000000000000BA8 -:10FD5000000100003800000000000000000000006A -:10FD60000000000000000000000000000000F000A3 -:10FD7000F000000000008020AFDFA0A0A0BC0000C9 +:10FCD00000000000F000000F00000000000F003CDA +:10FCE000FFFF000000000000000000000000000016 +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000A2000000000041 +:10FD2000000000000000000000F0003C00000000A7 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD50000000000000000000000F303FB0BF000FA7 +:10FD6000003CB2B200FF00000000000000000000F4 +:10FD70000000000000000000000000000000000083 :10FD80000000000000000000000000000000000073 :10FD90000000000000000000000000000000000063 :10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000000000005FE4 -:10FDC00000FF000000000000000000000000000034 -:10FDD00000000000BABA005500000000000000005A -:10FDE00004000000000000000FAF0FAF0000000093 -:10FDF00000000000A0BEE1FF14140030202000F03D +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000E0CCECC6F +:10FDE00000FF00550C0CFAFA0000000000000000B3 +:10FDF0000000000000000000000000000000000003 :10FE000000000000000000000000000000000000F2 :10FE100000000000000000000000000000000000E2 :10FE200000000000000000000000000000000000D2 :10FE300000000000000000000000000000000000C2 -:10FE4000005F00FF00000000000000000000000054 -:10FE500000001C001C1C10100055000000000000D9 -:10FE6000000000000000000000000F050F0500006A -:10FE70000000FFFFFFFBA0BCE1FD555500F0A0A076 -:10FE800000F0000000000000000000002000000062 -:10FE9000000004008800000088002000000000002E -:10FEA00000000000000020002000000020000000F2 -:10FEB0000000880000000000000020080000000092 -:10FEC00000000000000000002100000300002000EE -:10FED0000008000000040000000000000000000016 -:10FEE00000000000000000000000208089842080C5 -:10FEF00021900180000041C10500400200800140C6 -:10FF0000C1000000090201800180210000001000F2 -:10FF100040000000200000000002000040004000FF -:10FF200000000000000000000000A0000000000031 -:10FF30000000000000000000000000004000000081 -:10FF40000000000000000000000020000000000091 -:10FF5000000000000000000000000002000000009F -:10FF60000000000000000000000000000004084045 -:10FF70000010904010100000841090020003000454 -:10FF800040032082000082040204202040C000417F -:10FF9000000000000809000002000000000800093D -:10FFA000000000000000000000000200000000004F -:10FFB0000000000000000009000000000000A04058 -:10FFC0000041A0000000000000000000A04100006F -:10FFD00000000000004000090000000000000000D8 -:10FFE000000000400000004000000000000002008F -:10FFF00000000200010000000000210000000100DC +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000200A0 +:10FE6000C2C0000000550C0CF0FF000000000000B4 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000000000000000200052 +:10FE900020020000200004008800200000008800EC +:10FEA0002000C0000000200000000000400204000C +:10FEB0000400840020002000201020000400200006 +:10FEC00020000400880005000180000300030003F7 +:10FED00020008408200020002000200220002004B0 +:10FEE000880288002000040021000180000000003A +:10FEF00020022002200020002000400220002000DC +:10FF00002002100200002002200801000000000072 +:10FF1000000000000000000000000400400041005C +:10FF2000000004C0100000000002200200000000D9 +:10FF300000000000000010020000000000000000AF +:10FF4000000000004100000010021002000000004C +:10FF5000200010004100100000000902090000000C +:10FF600000840000040000000000100210020000E5 +:10FF700010000900000041000000410004004000A2 +:10FF80000002400009822000000021C04000000063 +:10FF9000000002000000000400040008004100000E +:10FFA000000000000000000000000100110202003B +:10FFB0000000000000000000000802000200000035 +:10FFC00000000000000000000000004100000000F0 +:10FFD0000000000000000010000800050000A00064 +:10FFE0000000000082000000000800000000000087 +:10FFF0000005020000000020000800008200000050 :02000004001EDC -:1000000000000000000041000000000000000400AB -:100010000000008400080082008800840008008836 -:100020000010000000880000000800840008008420 -:100030000000008400400000000000080084001060 -:1000400000C0008800880000000800100084000044 -:100050000000000800000000000000000008000090 -:1000600000000008000000C00000008400400008FC -:1000700000880008000008080000000090880010B8 -:1000800002000008000000008800000000000010CE -:100090000000002100080021000000000003000013 -:1000A00000000021000500210041000000100000B8 -:1000B00000000021000000210021000000100000CD -:1000C000000300218405002120030000000000023D -:1000D0000408000000210000A02100000000200012 -:1000E0002005904100030021400500004000400031 -:1000F00000009000408004A10400900010880100DE -:10010000850008004100200802800000C021412134 -:10011000100000080084001000C000A000000008CB -:1001200000C000000090000000000000000000007F -:100130000000038400000000000000000000000038 -:100140000000000021820500000000000000000007 -:10015000000000000000000000A0000000000000FF -:10016000000000080000001000A0408800400004CB -:100170000000000002008008820280000220C140CE -:1001800002002008C08890908402A0200090009077 -:100190009000C00009A00000001100040009000048 -:1001A0000000000008000000000800000005C0007A -:1001B000000000000000000000000000000000003F -:1001C000000000000003C0110000C0050000000591 -:1001D000000000000000000082000000820000001B -:1001E00000110000000000000800000000000000F6 -:1001F0000000000000002000400088000100000016 -:10020000000000000009000402000000400000009F -:100210000000C00000001100090000000084000080 -:1002200000000000000000840008000000900000B2 -:10023000008400000000001000000000000000002A -:1002400000000000000000000000000000000000AE -:100250000000000000000000000000C000000000DE -:10026000000000000000000000000000000000008E -:10027000000000000000000000000000000040003E -:10028000000009000000000000118000000080A0B4 -:100290000000000000000000884000000000001086 -:1002A000000000008200000082000002A0000000A8 -:1002B000000000000000000000210000000000001D -:1002C0000000820008000000080000000000000894 -:1002D00000000000000000080021000000000000F5 -:1002E0000000000008000000000000000000000006 -:1002F00000000000000000000000000501000200F6 -:1003000000000000000000000000010808100400C8 -:10031000100500050100010000000411200000008C -:1003200000840000000000000084000800000000BD -:10033000000000C0000000000000001000000900E4 -:1003400000000000000000000000000000000000AD -:100350000000000000000000000400000000000099 -:100360000002000200900210000000002040000087 -:1003700000000000008400200010008840102004CD -:1003800020A00090209005000000090004008204D5 -:10039000A004850405201000080000A0C140000052 -:1003A0000000000000000011040000050000000033 -:1003B00000000008002100080008000800040008F0 -:1003C00000000000000508000000000000210000FF -:1003D00000000000000000080008082100000000E4 -:1003E000000800000000000088000000000000007D -:1003F00000000000000900000021000000110010B2 -:1004000000080000000020409005000002000004E9 -:10041000002000000008000200090005004020053F -:1004200000000000000020000000000000000000AC -:1004300000000000000005C00000000000000000F7 -:10044000000000100000000000000000000000009C -:100450000084000000000000000000000000000018 +:100000000000020000000209100000400000000093 +:1000100000080008008400080008000800880008A4 +:100020000008000800000008000800001002200876 +:100030000008000400000008000800020084000816 +:100040000008000800840008000800040000000800 +:10005000000000080000008400840010020800086E +:1000600000080008008400840084008400840002EA +:10007000008200080000001000040008008800084A +:10008000000800080000000800020084008800004A +:100090000000002100210021000500000002902145 +:1000A000C0214005882140094009C000000084218A +:1000B0008421002190210000000000000000900534 +:1000C0000021902100210000000000000003020830 +:1000D00000210000A040882100082000200000002E +:1000E00000000021000000050008000820000003B7 +:1000F0000000002100050020000500410005000867 +:10010000000000218805000000000000002184009C +:1001100088000085000000000000000000002000B2 +:10012000000000000000000000004000000000008F +:10013000000000000000001000000000000041006E +:10014000410000000000000003000000000000006B +:10015000000000000000000000000000000000009F +:100160000000000040000000000000000800050042 +:100170000088008800200000000800000000000047 +:1001800000000000030000000082000000000000EA +:1001900005000000050400000000C0000000000091 +:1001A000000000000000000000410000000000000E +:1001B00000000000C1100000000008000000000363 +:1001C0000400000000040005000000000000000022 +:1001D000000008002000000000030000C003080029 +:1001E000001100000000004140000005081100005F +:1001F000000500000000200000000000C00010000A +:10020000000000000009080400009000824008007F +:100210000000040010008200000000000000000048 +:100220002000000000C021000000008400000084C5 +:1002300000000008200040400000091000000000FD +:10024000002000002000001000000000040000005A +:1002500000000008200080000000000000000000F6 +:100260000000000800000000000000000000000086 +:100270000000009000A000048040000000000090FA +:100280000008000000000000000000A000000000C6 +:10029000000000000000800000008200000000005C +:1002A000000000000240080000089000C0000008A4 +:1002B0000008000000050000100800000000C00851 +:1002C000080000000208020800080000000000000A +:1002D00000080000000000001008000000050000F9 +:1002E00000000000000002080000000800000003F9 +:1002F000000000210008000000001002820500003C +:1003000000000000000002410000000800000000A2 +:100310000000000000410200000010410000000049 +:1003200000000300000000000000049000000484AE +:100330000000002000000008000080000000000015 +:100340000000108400000000000000000000000019 +:10035000000000000000000000000000000000009D +:100360000002000000020000000005001100000073 +:100370000000000000902000084011000000000074 +:10038000000000000000000000000000000000006D +:1003900000000000000000000004000080000008D1 +:1003A000880000008221000000000000000300001F +:1003B0000000000000050008000800000010000810 +:1003C00000410000000300000000000000100000D9 +:1003D0000000000800000808000000000000000005 +:1003E00000080000000000000011000000000000F4 +:1003F00000000000002100000021000800000004AF +:1004000000080000000000400240000000048800D6 +:1004100000410000002100410008004100000040B0 +:10042000000000000000000000000040000002008A +:1004300000000004000000040000000000000000B4 +:10044000000009020000008400000000000000001D +:10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C -:10048000000000000000000000000000000000006C -:100490000000000000C00000000000042010000068 -:1004A00080000000000000000000000000000000CC -:1004B0000000000004000002000000000000000036 +:100470000040000000902000000000000000090083 +:100480000000000000000000040000000000000068 +:100490000000000000000000000000000000090053 +:1004A000000000000000000000000000000000004C +:1004B000008800000100008810100000000000010A :1004C000000000000000000000000000000000002C -:1004D000000000000000000200000000000000001A +:1004D0000040000001000088101000000000000132 :1004E000000000000000000000000000000000000C -:1004F0000000000000000000000800000000820072 -:100500000000000001010100000089C10001C000DD -:1005100000050208840101000002C0A000000000E4 -:100520000089C00000000000000000000000000082 -:100530000000000000039100000000000000000027 -:1005400000000000000000000000000000000000AB -:100550000000000011032100000000000000000066 -:10056000000000000000000000000000000000008B -:100570000000000000000840410000800000000072 -:100580000000000000004120042100002041000282 -:100590000011090509801010052100000000000964 -:1005A00000041140000000004100000400000000B1 -:1005B0000000000000000900400000808000800072 -:1005C00000000000000900004000000000000000E2 -:1005D00000000000000009004080008080008000D2 -:1005E0000000000000040000000004000000000003 -:1005F00000000000000000000900A10000048000CD -:1006000080000000000000034000114000000000D6 -:10061000410441410002008382098003004104003B -:100620008200114100C10002000000000000000033 -:1006300000000000000000008800030400088200A1 -:1006400008000000000000000000010000000000A1 -:1006500000000000000000008400031000080200F9 -:100660000800000000000001000000000000000081 -:1006700000000000000000000000840010C000A185 -:10068000020008000000000000010100000100A0BD -:100690000000000001010088004141A0104100015C -:1006A00000C0410004010085C0C10000000000003E -:1006B000000000000000000000000010000000002A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000010000000000A -:1006E000000000000000000000000000000000000A -:1006F00000000000000000000000000000100000EA -:1007000000000000000000000000000000400001A8 -:10071000C18200000000000001400400000200004F -:10072000094001000000000100010100000000007C -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:1007800000000000000000000000000000000080E9 -:100790000020048409000000001108909100000569 -:1007A00000098585040000000003094004000000E2 -:1007B0000004008300000000000000000000004171 -:1007C0008000000400000000000000000000004065 -:1007D000800000C100000000000000000000004197 -:1007E0008000000200000000000000000000000087 -:1007F0000004800000C100000000000000000000B4 -:1008000000C1000000020000000000000000000025 -:100810000911804180C1000002048004404103406E -:1008200004C10004808000004041002080000304D7 -:100830000000040000830000000000000000000031 -:100840000091020000010000000000000000000014 -:100850000001200000400000000000000000000037 -:1008600000910200000100000000000000000000F4 -:100870000000000020000040000000000000000018 -:100880000000000540000001000000000000000022 -:100890000000048420018440000000008201A0C107 -:1008A00001C0A04100C182C000000101000140A0C0 -:1008B00001A0000000000000000000000000000097 -:1008C0000000810000E0000048000000000000007F +:1004F00000000088000001000088100400000000D7 +:1005000000010000000000000000000000000000EA +:100510000000008800000000008804C00000000007 +:1005200000010000000000000000001100000000B9 +:100530000010100000024000000080800000000059 +:100540000041000000000000000000110000000059 +:100550000010200000024000000000000000000029 +:100560000041000000000000000000000011000039 +:1005700000000010200000104000000000000000FB +:100580000000004100000000000000000011000019 +:1005900000000009090000091000000080000000B0 +:1005A00000000041000000001100000000000000F9 +:1005B0001100000004000200108000001100800003 +:1005C000000000008010000011000000000000008A +:1005D00011000000040002001080000010008000E4 +:1005E000000000008040000000001100000000003A +:1005F000000011000000100002001080000009003F +:1006000080000000000080200000110000000000B9 +:1006100000004000000010000200820000000900FD +:1006200080000000000080080000000000000000C2 +:1006300000000000000000000400041000000000A2 +:10064000080000000000C0000000000000000000E2 +:100650000000000000000000040004100000000082 +:10066000080000000000C0010000000000000000C1 +:100670000000000000000000000004000410000062 +:100680000000080000000000C001000000000000A1 +:1006900000000000010000000000040010C0000085 +:1006A0000000080000000000C00000000000000082 +:1006B000000000000000000102010008000000002E +:1006C0000000000000000001000000000000000029 +:1006D000000000000000000102010008000000000E +:1006E0000000000000000001000000000000000009 +:1006F00000000000000000000000020100080000EF +:1007000001000100000000000001000000000000E6 +:1007100000000000000000000000020100040000D2 +:1007200001000000000000000001000000000000C7 +:1007300000000000000000000008890400800000A4 +:100740001100000000000000004100000000000057 +:10075000000000000000000000088004008000008D +:100760001000000000000000004100000000000038 +:100770000000000000000000000000118004008064 +:10078000000005000800000000000041000000001B +:100790000000000000000000000000418004000094 +:1007A00000000300000000000000004100000011F4 +:1007B000800000C100000000800005000000004132 +:1007C000000000400000000000000000118800113F +:1007D000800000C1000000000000A000000000C177 +:1007E0000000004000000000000000000840000081 +:1007F0000011800000C1000000408000A000000047 +:1008000000418000004000000000000000000409DA +:100810000011800000C10000000200000300000081 +:1008200000C180110004000000000000000003115E +:100830000000200000400000000004000300000051 +:100840000089020000010000000000000000000913 +:10085000000020000040000000000200090000002D +:1008600000030200000100000000000000000191F0 +:1008700000000000200000400000000120000900EE +:10088000000000030800000100000000000000005C +:1008900000A000002000004000000000A000840034 +:1008A000000000050800000000000000000000003B +:1008B00000880000000000000000000000000000B0 +:1008C0000000811200E00700480000000000000066 :1008D0000000000000000000000000000000000018 -:1008E0000000810000E0000048000000000000005F +:1008E0000000811200E00700480000000000000046 :1008F00000000000000000000000000000000000F8 -:1009000000000000810000E000004800000000003E -:10091000000000000000000000004800000000008F -:1009200000004842821200E0070048420000000038 -:10093000000048420000000000000000000000002D +:1009000000000000811200E0070048000000000025 +:1009100000000000000000000000000000000000D7 +:1009200000000000811200E0070048000000000005 +:1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 @@ -123072,454 +123072,454 @@ :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 -:100A30000000000000000000747B000000000000C7 +:100A30000000000000000000257B00000000000016 :100A400000000000000000000000000000000000A6 -:100A5000000000000000DE2E747B0000000000009B +:100A5000000000000000DEA4257B00000000000074 :100A60000000000000000000000000000000000086 -:100A7000000000000000DE2E0000747B000000007B +:100A7000000000000000DEA40000257B0000000054 :100A80000000000000000000000000000000000066 -:100A90000000000000000000DE2E252B00000000FA +:100A90000000000000000000DEA4257B0000000034 :100AA0000000000000000000000000000000000046 -:100AB0000000000000000000D4A4615603400000C4 +:100AB0000000000000000000DEA4612603400000EA :100AC000000000000230A0000000000000000C4008 -:100AD00000000000000002C06A866156034000006A +:100AD00000000000000002C06486612603400000A0 :100AE000000000000230A0000000000000000C40E8 -:100AF00000000000000002C06A860000615603404A +:100AF00000000000000002C0648600006126034080 :100B00000000000000000230A00000000000000013 -:100B10000C4000000000000002C06A8660DE034056 -:100B20000000000000000231E000000000000000B2 -:100B30000C4000000000000002C07B062080008006 -:100B40000000008001000100008000800000000023 -:100B5000000000000008000000000000000000008D -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000003000072 -:100B80000000000000040000000000000000002041 -:100B900000000020008000020000000000000000B3 -:100BA000010400100204A000000084000000108076 -:100BB00000000000000000804000088000001004D9 -:100BC0004004004000040400040000200020000055 -:100BD00000000000400000000000000000001000C5 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000040000004000000000000B1 -:100C000000000000000200000000000000000000E2 -:100C100000010000000100200000000000001000A2 -:100C200000020402000400C1400200020090000023 -:100C3000001000900004000040020000800200024A -:100C4000008482808200080404000280044120C1E4 -:100C500082200000000000000000000000000200F0 -:100C60000210000000400010000000000010001002 -:100C70000241000000000000000000000000001021 -:100C80000000000000000000004000000000000024 -:100C90000000000000000000004000000000020012 -:100CA00002000000000000002000000000008200A0 -:100CB00083100000000002009000050008000800FA -:100CC0000000000500040000000191888020808859 -:100CD0008004008800000008008800C000000000B8 -:100CE0000008100000000000008400080000000060 -:100CF00000000040000000100000008800C000005C -:100D000000080000000800000000000000080008C3 -:100D100000000000000000000000001000000000C3 -:100D200000000008004000000000800000400008B3 -:100D30000000020000000000800011001000800090 -:100D40008000044000000000009000000008000047 -:100D5000002001000000000000000010000300005F -:100D60000000000300000000000000000000000080 -:100D7000000000000000000000000008000000006B -:100D80000000000000000000000000000000400023 -:100D9000000000002000000090000000040000009F -:100DA00040000000400000000000880002044000F5 -:100DB0008400840002002000400004004000050080 -:100DC00000110200001000000000000400080000F4 -:100DD000000000012002000000000000000000846C -:100DE0000000000000000000000000000000000003 -:100DF000100000000000000000000000000000845F -:100E00000000004000000000000000000040000062 -:100E100000000040002000000004002000108000BE -:100E20000084000000000000040000000200000137 -:100E3000000200004020200000000000008200109E -:100E4000109000208020000100000020000400001D -:100E50000000000000000000000000000000000092 -:100E6000000400000000000000000000000000007E -:100E70000000000000000000000000110000000061 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000002100000000000011 -:100EC00000000888000000000000000000100083FF -:100ED000000000080000000000200090000000005A -:100EE000000000000008000000000000000000906A +:100B10000C4000000000000002C064866126034013 +:100B20000000000000000230A000000000000000F3 +:100B30000C4000000000000002C06486008021001C +:100B4000000520002008208020802080210000C196 +:100B500000004000200020800000028210802180E0 +:100B60008380218040002000200020002100000020 +:100B70000084208420002000850405000003040078 +:100B800020000480400040000005208002002080FA +:100B90000082C000400200082000200088004000C1 +:100BA0002004110020808800000020001004200094 +:100BB0000400000040044080208004200484401091 +:100BC0000800000000004000000400040004400091 +:100BD0000004000000081002000400000004C0042B +:100BE000100420082008000000000002000020007F +:100BF000000000040004009021002000A00000007C +:100C0000200200000004009000900000000400009A +:100C1000400200030000909140020000000000022A +:100C2000C0008000A00000040004000000000000DC +:100C3000000200020000000000200020400100042B +:100C400000000005004100000000000000900000CE +:100C50000000000000800000000000000000000014 +:100C600010000000000000000000080000408205A5 +:100C700000009005000002000310000001020300C4 +:100C80000000000000000000004000000000001014 +:100C900040000100418001001080A0000000900091 +:100CA00000000208100000022002000008000000FE +:100CB0000000000000000000000882000200008028 +:100CC000000000000008400000C000000400000414 +:100CD00002880000408200040000000800080000B4 +:100CE0000008038800080000050020080208000032 +:100CF00040080008008800000008080900082001DA +:100D0000200800000088008402000000411000104C +:100D1000000800844004C002400020020084031048 +:100D2000000000880001A0002001800900000000F0 +:100D300000080000030803080000008403080008FE +:100D400000200300000000000041004000050000FA +:100D5000840084088389022103210300000000002D +:100D60000000002100000021000900210000000017 +:100D70000000022100002008000000210000000007 +:100D800000000040000000000002200000210000E0 +:100D90000000000000800008C020C0000008000023 +:100DA00040080400A085010000020000400202414A +:100DB000000000000000000000000000080000002B +:100DC00040000100A00800000000000000880000B2 +:100DD00041000000000020408008A0A0A000000802 +:100DE000000000000000000000000084110000006E +:100DF000000000000000100080C00000000000089B +:100E0000000000821000000000000000A00011009F +:100E10000082004000040004400100C000820088FD +:100E200000A000000082000420000000400000102C +:100E300000000000000000000000400000824000B0 +:100E40000084000020000082C0000000210020007B +:100E500000000000000900000000000000800010F9 +:100E60000000008000000000000000000000000002 +:100E7000000000000000000000000000000000086A +:100E80000000000000040804000000040000080046 +:100E90000800201108400000080000000000821136 +:100EA00082048200004000080040090001408200E6 +:100EB000110008100000A0100000100000008200C7 +:100EC0008200824000090000088300000000020048 +:100ED00000000000000009000000000000100002F7 +:100EE00000080000000400000000000800000000EE :100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F2000000000000000000000000000008200003F -:100F3000000000C0000000000000000000000000F1 -:100F400009000000804100820082000000000000D3 -:100F5000000000000005001000000021000000005B -:100F60000000000000000000000000000000000081 -:100F70000003001100000008000000000000000055 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA00020000000000000110040000000000000D0 -:100FB0000400000000000000000000000202000029 -:100FC0000000000000021000840501000002000083 -:100FD00000000000000000C0000000000000200031 -:100FE00000000000000000000000000000000800F9 -:100FF00000000000000000000000000000002000D1 -:1010000000000000000000000000000000000000E0 -:101010000000000000000000000000000000402070 -:1010200000000000000000A000000000000000041C -:1010300000108000110000080008020000C04008F5 -:101040000400000000002100A02000000800401063 -:101050000003000000090021000200000000000061 -:10106000000800000009000500000000000000402A -:101070000008000000000000000000000000000068 -:101080000000000000000000000000000000000060 -:101090000000000800000000000000000000000048 -:1010A0000000000000000000000000000000000040 -:1010B00000000040000000000000000000000000F0 -:1010C000020000000221000000809000880300035D -:1010D00021000000000000002100000000000000CE -:1010E00000000000000000000000000000000800F8 -:1010F00000000000000000000000000000000000F0 +:100F000000000000000000010001000000000000DF +:100F100000000010000000000000030000000008B6 +:100F200003002000000041000000000020004000FD +:100F30000000200000080004000008000300100862 +:100F400000000000000000820300212000080000D3 +:100F500010000000000000089000100000000000D9 +:100F6000001100000200000002000204000400045E +:100F70000000000800000000000000000000020067 +:100F8000000000000000000000040000000000005D +:100F9000000300000000080500001000100000031E +:100FA00000008400004082000008000000040000EF +:100FB0000008000000000000000000000000000029 +:100FC000000000000000040004089020040000005D +:100FD000000000000000008800000040008840027F +:100FE0000002000040A0801000008000800100018D +:100FF00000A1000000010020000000200088000087 +:101000000000000000A000840000000100000000BB +:101010000200000000002000008800000000000422 +:101020000008000000000008000000000020080484 +:101030000000000000000000008800000000000028 +:1010400000000000000011A08088840000018000E2 +:1010500000080000000300008200000020002002C1 +:101060000008000400000000000002000000000072 +:10107000000000000008000000000002000800005E +:10108000000000000000000000000000000001005F +:101090000000202100000000000800000400000003 +:1010A000000000080000004140000800820000002D +:1010B0000000000000008280000800000000000026 +:1010C00000210000000010000800000004000400DF +:1010D000040000000000000000000000000000000C +:1010E00080010000000103000000000080C000003B +:1010F00000000000000000010000000000000000EF :1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000082000041000000FC -:1011300000000000000000000000000000000000AF -:1011400000000000200080000000001000000000EF -:101150000000400800000000000000000000000047 -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A0000000000000008800000000901000000017 -:1011B000000000000000000001001100000000021B -:1011C0000010000000100000000000000000C089B6 -:1011D000C19102411091090000004100000000008F -:1011E00000000400000000000000000000000000FB -:1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE -:10122000000000000000000000000000000080003E -:10123000000000000000000000001100100000008D -:10124000008000800000000000000000000000009E -:1012500088A00304008400030002000000110000C5 -:1012600000008080000000800000000000000000FE -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E -:1012A000000000000000000000000000004180007D -:1012B000800000000000000000000000008000002E -:1012C00000000000001000000000000080418000CD -:1012D00080009000411108914100000100000000D1 -:1012E0000000000090C000000008000000000000A6 -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000001001AC -:10133000100890000000000000000000000000887D -:1013400000000000000000890002000008001001F9 -:101350000884C0008800900008A0211000008800C8 -:1013600000000000000000008400000000000000F9 -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000040906D -:1013B00000A0908800100000000000000000000065 -:1013C000000100000001900000001000100000006B -:1013D000000000000000900800001191C1C0000052 -:1013E00000000000040002000000000002000000F5 -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:10143000800000808000000000000000000000002C -:101440000011000800100041000000000000000032 -:10145000000000000000040000101041C02188803E -:1014600000000000000000000002002100800000D9 -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B00000008000000000000000000000000000AC -:1014C000000000100000000000008000800000000C -:1014D0000000800280888000000080800080808082 -:1014E0008010000000000000000000010000000863 -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:10153000000000009000909008880000000000006B -:101540000000000000000000000000004000080053 -:1015500008001000C001820940908400C0400404CB -:1015600084100800000000E000000000000000E01F -:101570000700410000000000000000000000000023 -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B00000000000000000000000070041000000E3 -:1015C000000000000000008100E0070000000000B3 -:1015D00000000000000000000000070060000000A4 -:1015E0000000000042820000000000000000000037 -:1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:10163000000000000000000000AAFFAAF8F8F0F87F +:101110000400000020000000000200002000000089 +:101120000000000000C00004000080C000000000BB +:101130000000000004000000000403410000000063 +:10114000000000000000000008000000000080888F +:101150008800800000A00004008400080000000057 +:101160008900000001C100014001000000C004002E +:101170000108000001C10000410000000000000063 +:10118000000000000000000001000000010001005C +:1011900090000000000000000000010000000000BE +:1011A00000000000000000010200400000000000FC +:1011B00000000000000000010000880100000000A5 +:1011C00000000000000000000000000000001010FF +:1011D00000880010909000800080000000800000D7 +:1011E00009002000000002C00321850500400080A6 +:1011F00000000380000009C109038203000400000D +:1012000000000000000000000000020000002100BB +:101210004100800000000000000000000400000009 +:1012200000000000090000000408102080200003D6 +:101230000000000004000000084100210020000917 +:10124000000000000000000000000000000000009E +:101250000080000009808080000000020000000083 +:10126000000000000004000040821100400485A03E +:101270000000800000008000200083000980C1037E +:10128000000000000000000000020000000200005A +:101290001100100010008800000000000000000293 +:1012A0000000000000000011000010000500050013 +:1012B00041C00000000000000000110500004004D3 +:1012C000414100000000000000000000000000009C +:1012D00000008000809180058080000000000000F8 +:1012E00000000000000000000000000400000000FA +:1012F000C0A0000010000000C00001A08900019003 +:10130000C1C000000000000000000000000000005C +:101310000000100088000900090000000000000023 +:10132000000100000000000000000000002000009C +:10133000010001A000000000000000000108000002 +:10134000000101010000000000000000000000009A +:1013500000000000100090C1108890C088000000BC +:10136000000090000000200100000000840108003F +:1013700008C001C000002000001000C0880100016A +:10138000018501C100000000000000000000100005 +:10139000000000000000000100010001000000004A +:1013A000000000000000000000000000010000013B +:1013B000000001010001000000000000000000002A +:1013C0000500020000010000000000000000000015 +:1013D00000000000000090900010C0900202000089 +:1013E0000000000000000003801100201120000810 +:1013F0000202104010840000000000802080804025 +:10140000090940C011C100000000000000000000F8 +:101410000000000003000010001000100011000088 +:1014200000000000000000000000000000000800B4 +:101430000004031008040004000000000000050080 +:101440000000C141C1402041000000000000000038 +:101450000000000000000000808000808080858007 +:1014600080000000000000000010000000000000EC +:1014700008800320030002118000800000000000AB +:10148000C104050040000409000000000000000045 +:10149000000000000000000000000000000000113B +:1014A0000000000000000000000000050000000037 +:1014B000000020A120004100040200000000000004 +:1014C0000000410810110800100300000000000097 +:1014D00000000000000000000000801180408080BB +:1014E0008000C000020000000000000000000000BA +:1014F00000000140008401008501C00010000000D0 +:101500000000C1C000000100000100000000000058 +:1015100000000000000000000000000800888808AB +:1015200000010000000000000000000000000000BA +:101530000000000001C100000000000000000000E9 +:101540000000000001010001010000010000000096 +:101550000000000000000000000000009001108862 +:10156000904040000000000000000000000000E08B +:1015700000000000000000E000000000000000E0AB +:1015800000000000810000E00000000000000000FA +:1015900000000000000000E000000000004100E04A +:1015A000070041000000000000E000000000810092 +:1015B00000E0000000000000000000008200500079 +:1015C00000E000000000000000E00000410A000010 +:1015D0000000000000000000000000000000500AB1 +:1015E00000E007004842FFFF00000000000000008C +:1015F0000000000000003C3C3C3C000000FF0000FC +:1016000000FF000000FF0000AAAA000000FF000089 +:1016100000000000000000000000000000000F0FAC +:101620000F0F00000000000000000000000000009C +:1016300000000000000000000000000000000000AA :10164000000000000000000000000000000000009A -:10165000FFFFFFFF0000000000FF343E000000001D -:10166000A0F5BEBE0000003C00000000000000002D -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A +:10165000000000000000000000000000000000008A +:101660000000FFDF00FF00DFFF00FF0000000000C0 +:1016700000000000000000003C3C3C3C000000FF7B +:10168000000000FF000000FF0000AAAA000000FF09 :10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B0000000000000000000000000F0FFF0FCF05F -:1016C000F0F8000000000000000000000000000032 -:1016D0000000EFFFFFFF000000000000343E0000AC -:1016E0000000A0F51414FF14003C000000000000EE -:1016F000000000000000F0F0F0F00000000000002A -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 -:10173000000000000000000000000000F0F0F0F0E9 -:10174000FFAA55000000000000000000000000009B -:1017500000000000FFD7FFFF0000000000000000B5 -:10176000AE77B6B6002000A000003FBF000000002A +:1016A0000F0F0F0F000000000000000000000000FE +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000FFFF00FF00FF5CFCFFFF0000A8 +:1016F00000000000000000000000FFFF0000555542 +:1017000000000F0F00000F0F0000FFFF0000F0F0BF +:10171000FFFF0000000000000000000000000000CB +:10172000000000000000FF14FF1400000000000093 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000051555555FBFF00005C0CFFFFC9 :101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 +:10178000555500000F0F00000F0F00000000000073 +:10179000F0F0FFFF0000000000000000000000006B +:1017A0000000000000000000FF1CFF14000000000B :1017B0000000000000000000000000000000000029 -:1017C0000000AFAF050500000000000000000000B1 -:1017D000000000000000FFFFFFFF0000000000000D -:1017E0000000DB82B6B6000000A000003F3F0061B1 -:1017F0000007000D000005610A0F050D00A10000A3 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:1018500000610A37000900000000300000000000AD -:101860001000000800000005A0610006009D0000B7 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000055555555FFFF0000A00007 +:1017F00000000000000000610007000D00004063D1 +:101800008007002D920240E38007002D9202408263 +:1018100080018020820200000000000000000061C2 +:101820000007000D0000006100360001000000000C +:1018300000610007000D000000610007800D00003E +:1018400000610006000D000000610007800D20000F +:1018500000610006000D0000000000000000000014 +:1018600000000000000000000361033F8C0D10C069 +:10187000000000000000000000000000FAFAF3FF82 +:10188000FF2D000043C343030000000000000000E0 +:101890008383830000C0008200000000000000007D +:1018A00000000000000000000000000000F0FFF455 :1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D00000000000000055FFFCFF000000000000B9 +:1018C00000000A1E0A1EF514A0140000000000000B +:1018D00000005D5D5F5500AA00F000000000000000 :1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 +:1018F0000000000000000000000000000000505048 +:101900003000D200000040C0400000000000000095 +:10191000000000008300C0C08282000000000000C0 :1019200000000000000000000000000000000000B7 :1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:10195000000000000000000000AA000300000000DA +:10194000000000000A4B0A1EA014A01400000000B2 +:10195000000000000C0C0F0000AA00F000000000C6 :101960000000000000000000000000000000000077 -:101970000008000800000000000000000000000057 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 +:101970000000000000000000000000000000000067 +:1019800000000000C3F382B2037D034100000000A9 +:1019900000000000C300030300000000000000007E :1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000007D4139 -:1019F0003F3F001000550000000000000000000004 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 +:1019B00000003C7F0000000000000000000000006C +:1019C0000000000000002F203F30F0FCA0BC000011 +:1019D0000000000000001F145F55003C00AA00003A +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A0000000000000000417100303F7D3F410000B8 +:101A100000000000000082000202A2A200F3000009 :101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 +:101A3000000000003C00000000000000000000006A +:101A400000000000000000003F302F20003CA0BC40 +:101A500000000000000000001F140F00003C00AA5E :101A60000000000000000000000000000000000076 -:101A70007D410303000000550000012100000083A8 -:101A800000000000000000000000000000000080D6 -:101A90000000000000000000000000000000000046 -:101AA00000000000000000008200000000000000B4 -:101AB00000000000000000000003400000000000E3 -:101AC0000000000000000000000000000000000016 -:101AD00000040002000000802084200000000000BC -:101AE0000205000000000005820000110400040847 -:101AF0000400020002000100C010400004000002C7 -:101B000000020000000000000000000000000000D3 -:101B10000004000000000000000040000000000081 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000002000000000000A3 -:101B4000000000000000000000000002000000840F -:101B50000084000100000000002090200000000030 -:101B600000000000000000000000000000008000F5 -:101B7000800080008000800002001001020002004E -:101B8000A04082400209000002000008000020007E -:101B900000040080000000000000000000100000B1 -:101BA00000000000000000000000824082000200EF -:101BB00082000040820000000000000000000200DF -:101BC0000010000000008200000000000040000043 -:101BD0000000000000000100010001000000000002 -:101BE00000000040080002000000824000000000E9 -:101BF0000000000000800010000000000000001045 -:101C00000000000000000088000000820082000048 -:101C1000808400410004001000000000000000006B -:101C2000000000000000004000000000000800006C -:101C3000000800100010000000000000000000007C -:101C4000000000400000004000000200000000080A -:101C5000000000080000020020002000200000001A -:101C600000000000000080000000000000000008EC -:101C7000020000080200002000110484000000009F -:101C80000003000000000041000800000000000008 -:101C9000000000210008000000000000000000001B -:101CA0000000001000000000000000000000000024 -:101CB0000000000000000000000000000000020022 -:101CC0000000000000000000000000000000000014 -:101CD0000000080000000480000004000400000070 -:101CE0000400000520210021000000400021000028 -:101CF00020000000042090A00491000000102102A8 -:101D00000000000000000000008200000000000051 -:101D100000000000000000000008000000000000BB +:101A7000000000000000000000008800200020009E +:101A80008800000000008800000020800000018025 +:101A900000092010200020004000200088002000C5 +:101AA000200000004000200002002008C0000000CC +:101AB0000010881088004000000320000000000093 +:101AC000200000000008000088000010400088008E +:101AD000840000100000200020001000888489008D +:101AE0002000C0000004000020008800200020002A +:101AF000840484108400200088004000000000005E +:101B000000000000000000000000000021040000B0 +:101B10002010002000000000000000000000000075 +:101B200000000000000000020490004000000000DF +:101B30000000000000000000000000000040004025 +:101B40000082000000020000000010000000000001 +:101B50000040400000000000000240004000001172 +:101B60000800000000000000000000000090008855 +:101B70000040000041004100000241000000000060 +:101B80000000000000000200000000090000A000AA +:101B900000000205000000000200820000000000BA +:101BA0000000100010001000000082008200000001 +:101BB0000000000010400800000002030000820046 +:101BC00000008200100082000000000000002000E1 +:101BD00082008200000000000400400002000400B7 +:101BE00091800210004084000010000000000000FE +:101BF00000090000080900000000000000000000CB +:101C00000000000000040008000800400210000866 +:101C100000000000020800000000000800080008A2 +:101C2000000000000000000800080000020000089A +:101C30000000000000100084001020080088000050 +:101C4000400802080008000800100088000000009A +:101C5000000800840000000000400200404000082E +:101C60008004081080090910000005900382030415 +:101C7000001000000000000000000000000000084C +:101C80000000000000000002000000000000000052 +:101C9000200000412000880000000000000000003B +:101CA0000011000800000003000000000000000018 +:101CB0000000000000000000000000000000000024 +:101CC00000000000000000000000002100000000F3 +:101CD00040000000000000000000002000000000A4 +:101CE00000000000000900000000000000000000EB +:101CF00000000000000000000000000000051000CF +:101D000020000000000005000500000000000800A1 +:101D1000080080881100800011000008000800847D :101D200000000000000000000000000000000000B3 -:101D30000000000000000000001000000000000093 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000400008008800077 -:101D6000000080820400200004000000008800A021 -:101D70000088000000A0C00100218920410041012D -:101D80000800218800410021000900000000000037 -:101D9000000000000000000000000004000000003F -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD000000000000000002140A100000000000001 -:101DE00000000000000000000005000000080000E6 -:101DF00000050000000008000085018001050000CA -:101E00000810A08908000000000000040040000045 -:101E1000000000000084000000000000000100003D -:101E200000000000000000000008000000000000AA -:101E30000000000000100000000000000000000092 -:101E40000000000000000000000000000000001082 -:101E500000000000000000000000800200000008F8 -:101E600000C000A00000000000000300000000000F -:101E7000000000000000000080900020042004000A -:101E800041008001001080000000002100000000DF -:101E90000000000000030005000000080000000032 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED00000000000020000000000000041000000BF -:101EE00000000100200000000000000000000021B0 -:101EF00000000000000000000000000004000420BA -:101F00000000C0800200000008210000000000A0C6 -:101F100000000000000000000008000000000000B9 +:101D300000000000000000000000000000020000A1 +:101D4000000800000482000000000000410021089B +:101D50001008000000000000000000100082008257 +:101D600000004100000000000000000000000082B0 +:101D700000000082000000000000000000000000E1 +:101D800000001084C0000002C00084000000004178 +:101D90000000000000000000820000000000004081 +:101DA0000000000000000000004000000004C0002F +:101DB000040000000000000000000000000000001F +:101DC0000009080000000000000008000011C00029 +:101DD00000000800080400000800081102000004C8 +:101DE0000000000282000800001000400011000006 +:101DF00000000000820000001000000000400040D1 +:101E00000000C0000800000000000000000000000A +:101E100008000000008441001100000000000000E4 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E500000000000000000000900009000000010D9 +:101E60000000000000004000000000011100000020 +:101E7000410010A010001000000011000000000040 +:101E80000000114009820000000000000000000076 +:101E90000000820000000000000040000000000080 +:101EA000000000000000000000000000080000002A +:101EB0000000000000100000000000000000000012 +:101EC00000000000000000000000000040000000D2 +:101ED00000000000000000000008A000000000005A +:101EE000000000000800820000000041C000000067 +:101EF0000002000000000000000000400000004060 +:101F000008000000000000008400000800A020007D +:101F100000000008000800C00084000000A01100BC :101F200000000000000000000000000000000000B1 -:101F3000000000000000000002000000000000009F -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000C002BF -:101F60000000400820008000000000000000030086 -:101F700000A0000009000084000040000000800074 -:101F8000A00300000240C000020002880000000020 -:101F90000000000000000000000000000000000041 -:101FA00000000040000000000041000000000000B0 -:101FB0000000000800000000000000000000000019 +:101F30000008000800000000000000000000000091 +:101F400000000900082000880002000000000000D6 +:101F500000000008008800C000000000001000041D +:101F600000000090000000000000000000000008D9 +:101F700000000084000000C000000000000000001D +:101F8000000000C00000008800C000000000000049 +:101F9000000000000000000040008400000000007D +:101FA00000000040000000000011000000000000E0 +:101FB0000008000000000000000000000000000019 :101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00041800000000000410008000000000000E7 -:101FF00000000000000000080021000000000000B8 -:102000000120040005000000004000000410000052 -:1020100000000300030000000000000000000000BA -:102020000000000000000000118800000084000093 +:101FD00008000000000008000000000000000000F1 +:101FE000000000000000820000001000000000005F +:101FF000000000800000000000000000000200005F +:1020000000000000000000000000000000000000D0 +:10201000000021000000000000000000000000009F +:1020200000000000000000000000000000000000B0 :1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000C0020000000800000008000000009E -:1020700000000000000000000000000000000082DE -:102080000000040100088400414000010000000934 -:1020900040040102A0040440000000000000000011 -:1020A0000000000000000000000000000000000030 +:10204000000000000000000000000200000000008E +:10205000000000000000110000000000000011005E +:102060000000000000000000000000000040000030 +:10207000000000000010110000000000000000003F +:1020800000000088000400000000000009000000BB +:102090000000000000000000000000000000000040 +:1020A000848400A000100440000000000000000034 :1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000000000000010 :1020D0000000000000000000000000000000000000 -:1020E0000000000003009000000003020090009038 -:1020F000009100000000000000000000000000004F -:1021000000001088009000100808030000000090F4 -:10211000002090800300008000000000000000000C -:1021200000000000000009000000000000000000A6 +:1020E00000000000000000000000000000000000F0 +:1020F000000002C0829000A0888200000000000062 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:10212000090080800000090080000000000000001D :10213000000000000000000000000000000000009F :10214000000000000000000000000000000000008F :10215000000000000000000000000000000000007F -:1021600000000000000021000000000091820080BB -:1021700000C100200000000000000000000000007E -:10218000000000000000000000008080C00000008F -:1021900000000000000000A1808800800000000016 -:1021A000000000000000000000040000000000002B +:10216000000000000000000000000000000000006F +:10217000000000008000000005000080000000005A +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A0000000000080040000800200000000000029 :1021B000000000000000000000000000000000001F :1021C000000000000000000000000000000000000F :1021D00000000000000000000000000000000000FF -:1021E0000000000000000880020011000003C10090 -:1021F0000204021180000000000000000000000046 -:1022000000000000000000000011008080000000BD -:1022100000028080800090004010A00584900000A3 -:1022200000000000000000000000000000000000AE +:1021E00000000000000000000000000000000000EF +:1021F000000000000000000000030080000000005C +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:102220000000000000008800100004011000000001 :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E :10225000000000000000000000000000000000007E -:10226000000000000000000000020000010000016A -:1022700002000400100190000400100000000000A3 -:102280000000000000000000000090011084080819 -:1022900008009000A040C0000040008288048882AE -:1022A00000000000000000000000840000000100A9 +:10226000000000000000000000000000000000006E +:1022700000000000000000000000000000880000D6 +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A0000000000000000000404084A00040024008 :1022B000000000000000000000000000000000001E :1022C000000000000000000000000000000000000E :1022D00000000000000000000000000000000000FE :1022E00000000000000000000000000000000000EE -:1022F00000010404004090890091000000000000EB -:1023000000000000000000000000041000100004A5 -:102310001010000200100082A0C0008400000083A2 -:10232000001000000000000000000000000000009D -:102330000400000000000000000000000000000099 +:1022F000000000000000000000000404888200903C +:10230000A02000000000000000000000000000000D +:1023100000000000000000000000000000000000BD +:10232000000000000000000000000000000000802D +:10233000820000000000000000000000000000001B :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D -:102360000000000000000000000000000000000964 -:10237000004100110002028280080091000000006C -:1023800000000000000000000000000000800000CD -:102390000000000000800000000085800000004078 -:1023A00000800000000000000000000000000000AD +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000808000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A00000000000000000000000000000020080AB :1023B000000000000000000000000000000000001D :1023C000000000000000000000000000000000000D :1023D00000000000000000000000000000000000FD -:1023E000000000000000000000000000000009895B -:1023F0001000020040038208828010008300000069 -:1024000000000000000000000000000000000008C4 -:1024100000080000000080008011008000008200A1 -:1024200084209082040000000000000000000000F2 -:10243000000000000000000000000000000000009C +:1023E00000000000000000000000000000000000ED +:1023F000000000000000000000000000000080114C +:1024000080008000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000000AC +:1024300000A00020000000000000000000000000DC :10244000000000000000000000000000000000008C :10245000000000000000000000000000000000007C :10246000000000000000000000000000000000006C -:102470000008000000000100908804201000020005 -:10248000000000100010000000000000000000002C -:1024900002002004A0049000C000A0881084200046 -:1024A0000000000007000000000000000000000025 +:10247000000000000000000000000000000000005C +:10248000C001A0004000900000000000000000001B +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C :1024B000000000E00000000000000000000000003C :1024C000000000000000000000000000000000000C :1024D00000000000000000000000000000000000FC :1024E00000000000000000000000000000000000EC -:1024F0000000000000E000000000000000E0070015 -:1025000000000000000000000000000000000000CB -:10251000000000810000070000000000000007002C -:1025200000003F1BFFDB00080C080000000000005B -:10253000000000000000000000000000000000009B +:1024F00000000000000000000000000000000000DC +:102500000000000000E007000000000000000000E4 +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000F030F090000000000000FB :10254000000000000000000000000000000000008B :10255000000000000000000000000000000000007B :10256000000000000000000000000000000000006B -:102570000000000000000000000000003CFF3C00E4 -:10258000F6B4D2900000000000000000000000003F -:102590000000000024242424DB999D990FC360606F -:1025A00081818F0E2703E7C30C0C0C0C0000000088 -:1025B000000000000000000000000000000000001B +:10257000000000000000000000000000000000005B +:1025800000000000F0F06666C707C4040000000009 +:10259000000000000000000000000000000000003B +:1025A000000000000000000000000000000000002B +:1025B0000000000000000000C000600000000000FB :1025C000000000000000000000000000000000000B :1025D00000000000000000000000000000000000FB :1025E00000000000000000000000000000000000EB -:1025F0000000000000000000000000000000F0FFEC -:10260000F000F6B4D29000000000000000000000CE -:1026100000000000000020000000000000000FC3C8 -:10262000000081818F0E000000000000000000000B +:1025F00000000000000000000000000000000000DB +:1026000000000000000000FF3C3CC404C4040000C3 +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA :10263000000000000000000000000000000000009A :10264000000000000000000000000000000000008A :10265000000000000000000000000000000000007A @@ -123527,901 +123527,901 @@ :10267000000000000000000000000000000000005A :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A -:1026A000000000000000000000000080F000F0C00A -:1026B000000000000000000000000000000000001A +:1026A000000000000000000000000000000000002A +:1026B0000000000000000000000F004E0000C000FD :1026C000000000000000000000000000000000000A :1026D00000000000000000000000000000000000FA :1026E00000000000000000000000000000000000EA :1026F00000000000000000000000000000000000DA -:10270000000000FF0F0F0434C7F7000000003C3C3E -:102710003C3C00000000000000003C3C3C3C000051 -:10272000969F040404046060000000000080F090A4 -:10273000F0D00000000000000000000000000000D9 -:102740000000000000000000000000000000000089 +:1027000000000000000000000000BD7DBD7D000055 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000000000270066990073 +:10274000C0000000000000000000000000000000C9 :102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 :102770000000000000000000000000000000000059 -:102780000000000000FF3C3C0434C7F700000000DC -:102790006C6C6C6C00000000000000000000241055 -:1027A0000000FFFF0404040460E300C300610E06A0 -:1027B000000D0000000000000000000000610007A4 -:1027C000000D0000000000000000000000000000FC +:102780000000000000000000000000000000FFFF4B +:102790000000000000000000000000000000000039 +:1027A0000000000000000000000000000000000029 +:1027B00000000000000000000000000000610007B1 +:1027C000001D0000000000000000000000000000EC :1027D00000000000000000000000000000000000F9 :1027E00000000000000000000000000000000000E9 -:1027F0000000000000000000000000000000006178 -:10280000000600010000006100000001000000005F -:1028100000000000000000000000000000000000B8 -:10282000003800000000A000000800400005000083 -:1028300000007D69000000000000000000000000B2 +:1027F00000000000000000000000000000000000D9 +:102800000000000000000000000000000000106157 +:102810000007000D000000000000000000000000A4 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 :102840000000000000000000000000000000000088 :102850000000000000000000000000000000000078 :102860000000000000000000000000000000000068 :102870000000000000000000000000000000000058 -:1028800000000000F0AAF0AA0F0F0F3C00FC03FFAD +:102880000000000000000000000000000000000048 :102890000000000000000000000000000000000038 :1028A0000000000000000000000000000000000028 -:1028B00000000000FFEB000000000000000000002E +:1028B0000000000000000000000000000000000018 :1028C0000000000000000000000000000000000008 :1028D00000000000000000000000000000000000F8 :1028E00000000000000000000000000000000000E8 :1028F00000000000000000000000000000000000D8 -:1029000000002A00A0800000FFFF0F0F0F3C00FC1A -:1029100003FF0000000000000000000000000000B5 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 :1029200000000000000000000000000000000000A7 :102930000000000000000000000000000000000097 :102940000000000000000000000000000000000087 :102950000000000000000000000000000000000077 :102960000000000000000000000000000000000067 :102970000000000000000000000000000000000057 -:102980000000000000000000287D287D3C3C1E1E49 -:10299000FCFFFCFF00000000000000000000000041 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 :1029A0000000000000000000000000000000000027 :1029B0000000000000000000000000000000000017 :1029C0000000000000000000000000000000000007 :1029D00000000000000000000000000000000000F7 :1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000A0F5A0F53C3C24 -:102A10001E1E0C000C000000000000000000000062 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 :102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A400000000000000000000000880000000000FE -:102A500001000000008000000000000000000000F5 -:102A60000000000000000000000020000000000046 -:102A70000000000000000003000000000000000053 -:102A8000000000200020000000800000200404045A -:102A9000000000020000000088000000000010009C -:102AA00000000003000000001080008400200100EE -:102AB0004002C0004040A000000000000084100060 -:102AC0000000000000000000000000000000000006 -:102AD00000000400000000200000000000000000D2 -:102AE0004000000000000000004000000000000066 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000100010000000400000001BE -:102B100080034000000000020000000000000000F0 -:102B2000000010000500000200020020002000014B -:102B300004000090000000020400000002000005F4 -:102B4000000000000000000002050000000000007E -:102B50000800040000090010002008000000000028 -:102B600090000000000000000800044082400200C5 -:102B70000000000000400000000000000000000015 -:102B80000000001000000000000000000000010034 -:102B90000300000000000000000000000000020030 -:102BA00002000000020090009000020040000000BF -:102BB0000000080008004000000001000084000040 -:102BC00000C00040004002000000000000080000BB -:102BD000004000080000000000000011000000009C -:102BE00000000000000000000000000000080000DD -:102BF000004000100000000000000008000000007D -:102C000000000000000000000000000000000008BC -:102C1000040004000000000000000000001000009C -:102C2000000000000000000000000200000080081A -:102C300000000000200080008084000008080000E0 -:102C400000000000008000000000000000000010F4 -:102C50000000000300000000000000000008000069 -:102C60000000000000000000000000000000000361 -:102C70000000000000000000000000000000000054 -:102C8000000000000000000004000000000004003C -:102C90000000200040004000000004000000400050 -:102CA00004080000000000084000001188008800AF -:102CB00020008800048088000809C021200440000A -:102CC000000000000000002000000000000000A044 -:102CD00000000000001000100000000000000000D4 -:102CE00000000000000000000000000000000000E4 +:102A300000000000000020000400200020008800AA +:102A400088002000C000000088800400C00421002D +:102A500088002008C000200004002000200088001A +:102A600020008800400000002000200020002000FE +:102A7000040020200400000320082000200400049B +:102A80002080200020040890000020000000880022 +:102A90000400000300002000008241002180900417 +:102AA000200020002000C0004000209040002010A6 +:102AB00020024100C00020030000090000020900BC +:102AC00000000000000000002020000400000002C0 +:102AD000400000000002040010000000000200009E +:102AE00000000000000010080000000000000400CA +:102AF0000400000021022040000010000008000235 +:102B00000000401000020090801140000000000012 +:102B10001000000000000090000040200802081093 +:102B20000400400000004040000041000003049009 +:102B300040034040040200000000000004000000C8 +:102B400004094000400010000405000000050000DA +:102B50000041840084000800000000000000000024 +:102B60000200001000080010020000000000000039 +:102B70008210000000000841004100000000000039 +:102B800000000000050003020300020008000040EE +:102B9000821008000008100000000000088000807B +:102BA0000880000002000000000020000100400931 +:102BB00000000000000000400200000000000000D3 +:102BC000000000048084800080000000000000827B +:102BD000008400000000040000000000000020004D +:102BE00000000000008400000284000004000008CF +:102BF00000000000000400000004000000000000CD +:102C0000000000080000020088C088008004000066 +:102C10000084020000000584100000C00300804012 +:102C200000108410001003000000050000004000A8 +:102C300080000008020040080010000000C00000F2 +:102C40000000000000030000002000000021200020 +:102C5000000020092009000800000000001000000A +:102C6000001000080000000000000000000000004C +:102C70000000000000000008080088084000000074 +:102C800000000000000000000400040000800400B8 +:102C90000400000000000000880240000005000061 +:102CA00040000008100002000003000000000000C7 +:102CB000010089000080A1050000820000000000E2 +:102CC00000000000000004000000008400000382F7 +:102CD000800000000000800000020088001000005A +:102CE00000000000000000000000000008000000DC :102CF00000000000000000000000000000000000D4 -:102D00000000000000000000000080000000000043 -:102D100080000000800000000000000000A0000013 -:102D20000000000000820008000000A000A009A030 -:102D3000000000000000000821A0C000110200A057 -:102D4000408800000000900000000000000000002B -:102D50000000000000000000000000000000000073 -:102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D900000000000040000410000000000000000EE -:102DA0000000000000000000000000000000000023 -:102DB000008000000000C010080000008480A00017 -:102DC0000200400200000000008800C00000000077 -:102DD00000000000000000000008000000000000EB -:102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E10000000000000008000000000000000000032 -:102E20000000009000000000000000000000000012 -:102E3000400000020000008800840088210000108B -:102E400021008000000000000000008000800000E1 -:102E50000000000000000000000000000000000072 -:102E6000042000000000000000000000000000003E +:102D00000000000000080000000880008000002093 +:102D10008000000000000000000000000000000033 +:102D20000300080000000000000000000000000098 +:102D30000008040004000008040000000000000077 +:102D40000000A00008000200000340004100000451 +:102D50000800820000000800000010000000C00011 +:102D6000000000000000000000000800000000005B +:102D700000000000000000000000820000090000C8 +:102D80000000000000040000000008000000000037 +:102D9000000008000000000004080000000000041B +:102DA0000000A00404200405828040020003A0006B +:102DB00000008200C00082008400A0000040820465 +:102DC000A000A0000000008810A021008800C00022 +:102DD00000000000000040080300000000000800A0 +:102DE00000000300030000000000000000000000DD +:102DF00021000000000000000000000000001100A1 +:102E000000000000000000000008000000000000BA +:102E100000000400040000000000080000000000A2 +:102E20000800000000000001000011404000000008 +:102E30000040020008000008001021000384008404 +:102E4000000200000300000000000011000000006C +:102E5000000000080000000000000104080000005D +:102E600082000000080000000000000800000000D0 :102E70000000000000000000000000000000000052 -:102E80000000000000410000000000000000000001 -:102E900000000400000000000041042000000000C9 -:102EA0000000000000000000000000009000000092 -:102EB000000800004004890004210403C041880088 -:102EC000000802110800000300100000052008029D -:102ED00000000000000000000000000000000000F2 -:102EE0000000800100000000000000000000000061 +:102E80000000000000000000000000000000000042 +:102E90000000008000000000000000000040001161 +:102EA0000800000008000000000000000000000012 +:102EB00000001000000000040000040000000010EA +:102EC00000030000000000210000000000000000DE +:102ED00000000000000000000000000220A10084AB +:102EE00000000000000000000400000000000000DE :102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F1000000000008000000000000000910100009F -:102F20000000000000022000000800000000000077 -:102F30000000000000888000200820008008402059 -:102F40000000050802008088090000100000004011 -:102F5000004100000000000000050000000000002B -:102F6000000500000000000000200021000000001B +:102F00000000000000000840000000000000000079 +:102F10000000000000400000000000000000000071 +:102F200000000000000000000200048208000020F1 +:102F300000000000000000002100000080000000F0 +:102F4000000000000000002000000005002000003C +:102F50000000010800000400000000000004000060 +:102F600000000000000000000003000000008200DC :102F70000000000000000000000000000000000051 :102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000020000011 -:102FA00000000021000500080000000000080000EB -:102FB000000000000100400000002100400002105D -:102FC00000090000A00388100800C00000000000F5 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000100000000E0 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000901A6 -:1030200000C00000000000000000000000000000E0 -:103030000008000000001000008400C0A000800014 -:103040000000000000900008000180000400000063 -:103050000000000000000000000000000000000070 -:10306000000000000000C008000400A090900000D4 +:102F90000000000000000000000000000000000031 +:102FA0000008080400000000000000000000088085 +:102FB0000005880000080020200408000000000030 +:102FC0000400400000210104000000402184210091 +:102FD00040002182400000000020000000000001AD +:102FE0000000000000000000000008004100000098 +:102FF0004100000000000000000008000000000088 +:103000000000000000000000200020000000000080 +:10301000000011000000000000040000000000009B +:1030200000000000000005A00000200009080000CA +:10303000A010000000000000000020000000400080 +:1030400003208000000000040400000002000000D3 +:10305000000000000000000100000001000000006E +:10306000000000000000000000000001000000005F :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 -:103090000000000000000000089000040088000408 -:1030A00001010408C083820200000000000000004B -:1030B0000000000000000000C001010090001000AE -:1030C000C009000400A08810C0C0000000A0A00239 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000080000000808080E0 +:10309000000000000000000002C0000000A0008846 +:1030A0000000000000000000000000000000000020 +:1030B000C0080002000802820000000000000000BA +:1030C000020300410010880300000000000000001F +:1030D000000000000000000000410000001000108F +:1030E0000000000005000000004000400008002033 :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF -:10311000000000000000000000008000000000002F -:1031200000001140102100C08000000000000000DD -:1031300000000000000000000000804021040009A1 -:10314000801180C100910011000280000000008009 -:1031500000000000000000000080000000000000EF -:1031600000000000000000000000800080008000DF -:1031700080000000000000000000000000000000CF +:1031100000000000000000000000008000000080AF +:10312000000000000000000000000000000000009F +:10313000000080800080008000000000000000008F +:10314000000080C10021009000400000000000004D +:10315000000000050000000000000000000000006A +:10316000001000020000000200000000000000004B +:10317000000000000000000000000000000000004F :10318000000000000000000000000000000000003F -:10319000000000000000000000000000000080109F -:1031A00080808080A00020001100801100000000BD -:1031B0000000000000000000000000008080C1004E -:1031C0008510410400008005000080000000000917 -:1031D000800000080000000000000008000000005F -:1031E0000000000000000000000000000800900047 -:1031F000A00090000000000000000000000000009F +:1031900000000000000000000000000000000088A7 +:1031A000000080000000000000000000000000009F +:1031B000000000000000000000800000000000008F +:1031C00000000000008080008005008400000000F6 +:1031D00000000000000000000000000000020000ED +:1031E00000000001000000000000000000000000DE +:1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:1032200082011010089009040800050490010000B4 -:1032300000000000000000000000000000001088F6 -:103240000800090005910000040090A0900084008F -:103250000000A010000000000001020100000000BA -:103260000000000000000000000000000000A08836 -:1032700000040088020200000000000000000000BE +:10321000000000000000000000000000000040006E +:1032200010C188100800000000000000000000002D +:103230000000000000000000000000A000000000EE +:1032400000000000000090401090A000C0040000AA +:10325000004000000000000000000000000000002E +:10326000000000000000000010000000000000004E +:10327000000000000000000000000000000000004E :10328000000000000000000000000000000000003E :10329000000000000000000000000000000000002E -:1032A00000100004009002040009000801900201CF -:1032B000000000000000000000000000000000000E -:1032C00000400105059100A000900004009002005C -:1032D00000020090008209820000002000050440E6 -:1032E00000000000000000000000000000000000DE -:1032F00000000000000080800000000000000000CE +:1032A00002900088080810C0000000000000000024 +:1032B0000000000000000000088800901002028258 +:1032C000000000000000000008400102209002827F +:1032D00000000000000000000000000000000000EE +:1032E00000001000080000000000000000000900BD +:1032F000000021002000000000000000000000008D :1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD -:103320000000000000000080800000400980119033 -:1033300080110000000000000000000000000000FC -:103340000000008309101008008000000280028045 -:1033500080000080000000008800000000040000E1 -:10336000000000000000000000000000000000005D -:103370000000000400000000000000000000000049 +:103320000000110000800080848000000000000088 +:1033300000000000000000000000410000000080CC +:1033400000000000000000000000200008001080C5 +:1033500080000000000000000000000000000000ED +:10336000000021000800080000000000000000002C +:103370000000000800000000000000000000000045 :10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D -:1033A00000000000800000000080000002111100F9 -:1033B000C000000800000000000000000000000045 -:1033C000000000002184110041000811800000006D -:1033D0008000000084080820C18000000000000177 -:1033E00000000000000000000000000000000000DD -:1033F000000000000001000400C000000000000008 +:1033A0000000000080040021800080000000000078 +:1033B0000000000000000000000000008000800409 +:1033C00000000000000000000000000009004004B0 +:1033D00040000900000000040000000000000000A0 +:1033E00000000000010001000000000000000000DB +:1033F00000000000000000000000000000000000CD :1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC -:1034200000000000000090000404101000000805D7 -:103430001100410000010000000000000000000039 -:1034400000000000000001C000100090010090008A -:1034500088A010880000C0018888848210000000C5 -:103460000000070000000000000000000000000055 -:1034700000000000000000810000070000000000C4 +:10342000000000000000C001A0048402A000000011 +:103430000000000000000000000000000000C000CC +:10344000A000000088000000000000000000000054 +:103450000082008200000000000000000000000068 +:10346000000000000000000000000000000000005C +:1034700000E000000000000000000000000000006C :10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C -:1034A0000000000000000000000000000700000015 -:1034B000000000E007000000000000000000000025 -:1034C0000000000000000000410000E00000420099 -:1034D0000000000007005000000000000000600035 +:1034A00000000000000000000000000007004100D4 +:1034B000000000000000000000000000000000000C +:1034C0000042000007004200000000000000000071 +:1034D0000042000007000000000A00000700000092 :1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000C300C346 +:1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB -:103520000000000000000000000000F5FFF5303F43 -:10353000A0AF50FA00FFF0F0F0F000000000000033 -:1035400000000000000000000000000000008A826F -:103550000000A0F5A0F5707F707FD095F095000079 +:103520000000000000000000000030FF30BA70F220 +:1035300050500000000000000000000000000000EB +:103540000000828200C35050505000000000000074 +:103550000000000000003475B6F700000000000015 :10356000000000000000000000000000000000005B -:1035700000000000000000000000000000000082C9 -:103580000003000000000000000000000000000038 +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B :10359000000000000000000000000000000000002B -:1035A00000000000000000000000000000A0FFA0DC -:1035B000303FA0AF50FA00FF30F330F300000000BE -:1035C00000000000000000000000000000000000FB -:1035D000CBC300000000FFFF202F202F525D525D63 -:1035E00000000400000000000000000000000000D7 -:1035F000000000000000000000000000585058507B -:1036000083FFF30000000000000000000000000045 +:1035A000000000000000000000000000303030BAD1 +:1035B00070F2505000000000000000000000000009 +:1035C00000000000828200C314BE00AA00000000B8 +:1035D00000000000000000002061A2E300000000E5 +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA :1036100000000000000000000000000000000000AA -:103620000000000000000000000000000000CF5576 -:103630000C555F5F5F0A3C5C3C5C3CFC3C0C000052 -:10364000000000000000000000000000000000007A -:1036500000000000AB00FC550C55FFFA0F0AC2C277 -:10366000FAFAD700D70000000000000000000000B8 -:1036700000000000000000000000000000005A50A0 -:103680005F5582FF00000000000000000000000005 +:1036200000000000000000000000000000003F3F1C +:103630005F5F28282828000000000000000000002C +:10364000000000000000DAD05A5000000000000026 +:103650000000000000000FFF3C5500AAC0C00000A1 +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A -:1036B000CF550C550A5F0A0A3C5C3C5C3CFC3C0C58 -:1036C00000000000000000000000000000000000FA -:1036D0000000000000000300FC550C55F5F005004B -:1036E000C2C2FAFA000000000061000E050D00A041 -:1036F00000000000000000000000000000000000CA -:103700000000003000000000000000000000000089 +:1036B0000F0F0F0F0505AF05000000000000000010 +:1036C00000000000000000008A800A0000000000E6 +:1036D00000000000000000000F003C550000C0C0CA +:1036E00000000000000000000000000000000000DA +:1036F00000610006000D000000610007000D0000E1 +:1037000000610006000D0000000000000000000045 :1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 -:103730000000000000000000000000610000000127 -:103740000000000000000000000000000000000079 -:10375000000000610006C019200100610006000D94 -:103760000000A0610006000D000000000000FF0046 -:103770000F0000000000000000000000000000003A +:103730000000A5005A0805900001000000000000EC +:1037400000000000000000000000A500002800109C +:103750000000000000000000000005610A2E050DB9 +:1037600000A000000A280000000000000000000087 +:103770000000000000000000000000000000000049 :103780000000000000000000000000000000000039 :103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 -:1037B000000000000000000000000000FF0FF50501 -:1037C00028AA7DFF000000000000000000000000AB -:1037D00000000000FFFF0000FFF7FFF700000000FF -:1037E00000000000FFFF00000000000000000000DB -:1037F000FF000F00000000000000000000000000BB +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000000000F9 +:1037D000000000000000000000000000E9A86928C7 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000F5F500F50000000000000000EA :1038000000000000000000000000000000000000B8 :1038100000000000000000000000000000000000A8 :103820000000000000000000000000000000000098 -:103830000000000000000000000000000000FA0A84 -:10384000F000008255D700000000000000000000DA -:10385000000000000000FBFF0800F0F0F0F00000A6 -:10386000000000000000FF0FF0000000000000005A -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000C18027 +:103860004100000000000000000000000000000017 +:103870000000000000000202010100000000000042 +:1038800000000000000000FE00FF0000000000003B :103890000000000000000000000000000000000028 :1038A0000000000000000000000000000000000018 :1038B0000000000000000000000000000000000008 -:1038C000FF0FF50528EB28EB0000000000000000CA -:1038D00000000000000000003FFFF0F5000F0A0AA2 -:1038E000C0C0410000000000000000000000000017 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000000000000000000000000000E8 +:1038E000FF14FF0C000000000000000000000000BA +:1038F00000000000000000000000010100000000C6 +:103900000000000000000000003D003C000000003E :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 -:103940000000F000F50530F330F300000000000047 -:10395000000000000000000000003FF5F0F500004E -:103960000000C0C055000000000000000000000082 -:10397000000000000000000000000000000000093E -:1039800000000000000020000000000020000000F7 -:103990000000000000000000000000000000000027 -:1039A00000000000000020000000000020000008CF -:1039B0000000000200000000000000000000000005 -:1039C000000400002000200020002000000520004E -:1039D00000000000000000000000040004000200DD -:1039E00004000005080000002000400000910000D5 -:1039F000C0000000004000000000000000000000C7 -:103A00000002000040000000000000000000000074 -:103A100000000000000000000000000000000000A6 -:103A20000000000040000000000000000000000056 -:103A30000002000000000000000000000000000084 -:103A400000000002000080008000000080000002F2 -:103A50000000000000000000000000000002000064 -:103A6000000000020002C09040A0400082A00010B0 -:103A70002000410010008400000008000000000049 -:103A80000200000000000000000000000000000034 -:103A90000000020000000000000000000000000024 -:103AA0000000000000000200000002000000000012 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000008000000EE -:103AD00000000000080002000000020000000000DA -:103AE00002000000080000000800000010000800AC -:103AF000080404000010022000000000000000087C -:103B0000000800000000000000100000000000C0DD -:103B1000000000000000000800000000000000108D -:103B2000000800000000000000000000000000008D -:103B30000000000000000010000000000000000075 -:103B4000000000080000000000000000000000006D -:103B50000000000000000010000000000000100045 -:103B60000000800804008000000000000000000049 -:103B70000000800180000000000100000000000043 -:103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000010000005 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000020000000D5 -:103BD0000080080000000200000000000008000053 -:103BE00000000000004000000000400000058900C7 -:103BF000C0008200821184400080000800000000A4 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:10396000000014140C0C0000000000000000000017 +:1039700000008400840000008400200020008400F7 +:1039800084408400880040000005200088002080DA +:10399000888020002080C00020002000200020001F +:1039A00020001000200084008800880020004000D3 +:1039B000200000030000C100200001802000200042 +:1039C0002000000004004000200020002000000033 +:1039D0002000200000004000408000800000200007 +:1039E000410088004002108008800880200000828A +:1039F00004000484000000000000008400000000B7 +:103A0000000400014002000000000002000000006D +:103A1000211000100000051000000000004000C050 +:103A200000000200200040004000000000000000F4 +:103A30000940000000000000409000000404000065 +:103A400000000440100840000000000800000000D2 +:103A500020000590100200C02090000441040000E6 +:103A60000000400010844100840280108510400056 +:103A70004005400000020021040000000800100082 +:103A80000000080000000000000040000085000069 +:103A900004080900084000000000000300030800BB +:103AA000000000008810000000000000000000007E +:103AB0000000000000000000000000004080010045 +:103AC000000000008800020088002000020088102A +:103AD0008808030091000000000010001000401052 +:103AE000A00001004085000000000220089008406E +:103AF0000100050210000102000000000200048223 +:103B000000000088800000080000200080080002FB +:103B10000000A00088008285000000000000000076 +:103B20008810000000080008008400000008410020 +:103B30000082008800C004840000000000088002A9 +:103B4000200800000000008400082000040800088D +:103B5000098400008808080000000000908200002E +:103B600080090088400882020002000000038011E2 +:103B70008001104040038000401100000000000060 +:103B8000010000050000000000000008880000009F +:103B90000105000300000008000400000008000206 +:103BA0000008000000000000001188000008000369 +:103BB0000008000000000000001000000021A0002C +:103BC0000000000000000000000882210005000045 +:103BD00008000000000000000003000300000002D5 +:103BE000002100200005000040800000000088083F +:103BF0000008002100080003000500040000000088 +:103C00000000080000000000000003000000008227 +:103C100004A0400000000008000000000090000028 :103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C4000000000000000000020000000000080A034 -:103C5000000000048000009000820084000000004A -:103C6000000800000000000100000000000040000B -:103C700040900300008203000000000405000000E3 -:103C800000000000004000000000000000000000F4 -:103C90000000000000000000000000000000000024 -:103CA0000000000000000000000000000000000014 -:103CB00000000000000000000000000000400000C4 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000010000000000000000000000E3 -:103CE00000000000400021200200000000414000D0 -:103CF00010000800000082000800850000412080BC -:103D000000040004000400000000000000000000A7 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 +:103C30000000000000000000000000010000000083 +:103C400000000000000000000000000000002190C3 +:103C500000848000000000000000000000000090D0 +:103C600000880000100040000000900200000000EA +:103C700000004100000000000082008400010021DB +:103C8000A005000500000000C00000210811C000D0 +:103C9000000000008500A0000000900004008200E9 +:103CA0000000000004008204000082000000000008 +:103CB000000008000000000000410821C0000000D2 +:103CC0000800080000000900C00000008200000099 +:103CD000000000000000000200040805000084034A +:103CE00000000140200020100000004104020008F4 +:103CF000080000210021004000020000C00208006E +:103D000011000090000000002100410000000000B0 +:103D1000000040000000400000000300118800087F +:103D200000004000000840A000000000000000006B :103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D500000000000000020000000000000000084BF -:103D600000000000200080008401800000000000AE -:103D7000800088C040000000088280A0200400C0AD -:103D8000800400200020000000000000000000006F -:103D90000000000000000000000000000000000023 -:103DA00000000000002100000000000000000000F2 -:103DB0000000000000000000000000000000000003 -:103DC0000000000000000000000000009000000063 -:103DD00000009000000000800000000000210000B2 -:103DE000000000000008000020202000010000006A -:103DF000C000028000000040000200040008012111 -:103E00000008004100000000000000000000000069 -:103E1000000000000000000000000000000000841E -:103E20000000001000000000000000000000000082 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000110061 -:103E50000000000011840090000400000000000039 -:103E60000000000000000000000000C1800002A06F -:103E700004000488801009A020000909119003A003 -:103E80002020020800A00000000400000000000044 -:103E90000000000000000000000000000000000022 -:103EA00000000000000000000021000000000000F1 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000004DE -:103EE000000004000000000000000000880800003E -:103EF0000000002100000021000000000000000080 -:103F0000202100002005002100000000000000002A -:103F100000000000000000000000000000000000A1 -:103F200000000000008200100000000000000000FF -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000090058 -:103F6000000100000400000000000000210000002B -:103F7000000000100000110011000084000000008B -:103F80000300800020048008000000000000000002 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 +:103D40000000000041000000100400000000090015 +:103D500020000000030020102100000000000000EF +:103D60000000110002048990A0A0000021884001F9 +:103D70000085000008000000000400052100008903 +:103D800000000000000082000040000804009000D5 +:103D90000000000400210800400200030008C000E9 +:103DA000080000000021C000A00200000000000088 +:103DB00000008200000000000000000000088200F7 +:103DC00000000000000008000000000000000000EB +:103DD0000000821182008200A000A000000000000C +:103DE0000000000000080010000300000000004177 +:103DF0004000100000000000084040000000C00427 +:103E0000004010000000000008000800000004004E +:103E100011A0000000040000000080A100000000CC +:103E2000004000040000000000000000000000004E +:103E30000000000000000000000000000000110071 +:103E4000000000000000000000000000000000086A +:103E5000000800844008000000000000000000008E +:103E6000000000001100099000A000000000000008 +:103E70000000800000000484000000408800000072 +:103E80000001000000004102000582050002000060 +:103E900000040008000508084000002108A10008EF +:103EA00000000000A0080000000000211000000039 +:103EB00000000000012100000000000000000800D8 +:103EC000080084000000000000030008000000005B +:103ED000C00000008200080082000800002182006B +:103EE0000011000320000000000040080808001036 +:103EF00008218200A0A000000021C00001020003F0 +:103F00000010000008050000820000000000110001 +:103F1000000000000000000000000002008200021B +:103F200000000804118800000200000000040000E6 +:103F300000020000020040400000050000000000F8 +:103F40000000000820000000000000000002000047 +:103F500000000000000000000000008400000000DD +:103F60000000000011100000000800000010000018 +:103F700000000000002008020000110004000800FA +:103F800040201100000011000000400404A1008343 +:103F9000048941888882000882100000080082009D +:103FA0000000A0C0409001088284082000A000A06A +:103FB0004008000000009000000000000000000029 :103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000001010000DF -:103FE000020100010000000000000000000091003C -:103FF00004000000890200200404C0C0A0089082D0 -:104000008210900801A0849010A0004100000000E0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 +:103FD000880000000000000000000000C000020097 +:103FE0000000820040840402008202A00000010060 +:103FF00000000000000000000000000000C0009071 +:1040000008A090A0000100018200000180838004CC +:10401000009080209080008000808080030021003C +:10402000800000008080008021008080000000006F +:10403000008000800000030000000000000000007D :104040000000000000000000000000000000000070 -:10405000000000000000000000000000000011044B -:104060000021804000080000000000000000000067 -:10407000880000000000890003808000000091009B -:1040800083808080008011800088804100080000CB -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 +:1040500020000000000000000000000000008000C0 +:1040600000000000C0008080808000808000000090 +:1040700003000900000000000000000000000080B4 +:1040800041808080000000410921400200080000BA +:10409000808280200080000000A1008500000900CF +:1040A0000200000021000000000500800000000068 :1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E0000000000091000304000000000000000038 -:1040F0001100090003000900000000A100000000F9 -:104100001080A0030880C191800008001100030303 -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:104160000000000010001100A0000000000000008E -:104170000000000000020100008490001010020006 -:10418000C00009C0A000014009A1100090008500F6 -:10419000110100000000000000000000000000000D -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF +:1040C00000000000000080000000000080000000F0 +:1040D00008800500400500200000000000000000EE +:1040E000000000000000000080008040000380000D +:1040F00080000000000880004180200010200202A3 +:1041000080008000000200111100020005004188BB +:104110008800040804C182080000001000A000020A +:10412000000001000000010000004000A008200085 +:1041300000000000000000000000000000880000F7 +:1041400000000000000000000800A000A000020025 +:10415000000000400000000000840000000000009B +:10416000000000000000000000000200040340C046 +:104170000490080090000400C08400C0000000000B +:104180000100040282000401C020000800000100B8 +:1041900001A183A000048904C182029000100002E2 +:1041A00002A00001000000010000C002008200A087 +:1041B000A100024000200010A0100001000000013A :1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E0000000000000000001C0010101000000000B -:1041F0000000000000000000C0010000040400886E -:10420000080411C000210000901191090000010173 -:10421000000101000000000000000000000000009C -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:1042600000000000000000000003004011080000F2 -:104270000000000000000008000900210009000201 -:104280000084001109880008001180A11084000832 -:104290000404000511000000000000000000000000 -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE +:1041D00000000001000000000000000100000000DD +:1041E00000000000009000200082008205400004D2 +:1041F0000840C004000100000000010100000000B0 +:1042000000000000C00400040082A189000000003A +:10421000A10100014100408005808900000000806C +:1042200000008200000800210008002080800000BB +:104230000000890080000000000000000002000370 +:104240000020000500000000000000000000000049 +:10425000000000000001000500080020001100001F +:104260000000000000000000000000000000C1008D +:10427000008080008980002000000005414100008E +:1042800000000000000080030082008289410008D5 +:1042900000200520100200020011808000000000B4 +:1042A000800080008000000300000000000000008B +:1042B00080008000000000000000000000000000FE :1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000080110040000808ED -:1042F00000000000000000000000000400000011A9 -:1043000080410003008000008809A184C0000408E7 -:1043100008021100028000100000000000000000F0 -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:1043600000000000000000000000004001840188FF -:1043700001010000000000000000009000010000AA -:1043800000014001849104C0C00011C140831002AB -:104390008501000001C020408200000000000000F4 -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD +:1042D0000080000000000001418010022100002049 +:1042E00000000000000000000000000000000000CE +:1042F000000080A08080800000000000000000001E +:1043000041000200210011041000408440800000A0 +:104310004100400002000208C00188A008400200DD +:1043200002008200080002000010000000000000EF +:1043300000000210108200000000000000000000D9 +:10434000000020004000900000000000000000007D +:1043500000000008008400000001010201010100CA +:10436000000000000000000000000000000000004D +:104370000000A000820310021000000000880084EA +:10438000000001A000000100000001000004000482 +:104390000000000001000100010100000000070012 +:1043A000480A0000000000000000000000000000BB +:1043B0000000000000000700840000000000000072 :1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E000000000000000000000000000000000E0ED -:1043F000000000000000000000000000000000E0DD -:1044000007000000008100000700410A00000000D2 -:1044100007004200000000E007000000000000006C -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C +:1043D000000000000000000000000000500000E0AD +:1043E00007000000000000000000000000000000C6 +:1043F000000060000000000007004806000000E028 +:1044000000000082000000000000420000000000E8 +:1044100007008400000000E0000000000000000031 +:10442000000000006600620499999999000000005C +:10443000000000000000000000F000F0000000009C +:10444000F0F0F0D4000100010000000000000000C6 :10445000000000000000000000000000000000005C :10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000FFFFFFFF810000180CCFBC -:1044900008898181000030303030000000000000C9 -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC +:10447000000000200000000000000000000000001C +:10448000000000000000000000000000000000002C +:1044900000000CFF0CFF0000000000000000000006 +:1044A000000000000000660066000808990800008F +:1044B000000000000000F066F0663C663C6600000C +:1044C0000000F0F0F0F0000100010000000000002A :1044D00000000000000000000000000000000000DC :1044E00000000000000000000000000000000000CC :1044F00000000000000000000000000000000000BC -:1045000000000000000000003CFF30FF00008018A9 -:10451000CFCF89898181C300303030300000000066 -:10452000000000000000000000000000000000008B +:1045000000000000000000000000000000000000AB +:10451000000000000CF00C00000000000000000093 +:10452000021020000088108400000000000000003D :10453000000000000000000000000000000000007B :10454000000000000000000000000000000000006B :10455000000000000000000000000000000000005B :10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B +:104570000000000000000000000002102000008881 +:104580001084000000000000000000000000000097 :10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F0000000000000000000090099000000000019 -:1046000000000000000000000000000000FF00FFAC -:10461000000C000C3D0100008181C0C0C0CFC3C3AD -:10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A +:1045A0000000000000000000000000003C5C000073 +:1045B000000000000000000000003F3F606F6F003F +:1045C0006FF0E7FFE70000000000000000000000BF +:1045D00000000000000000000000000000003C3C63 +:1045E0003C5C000000000000000000000000000033 +:1045F00000000000000000000000000000000000BB +:1046000000000000000000006C6C606F0000000003 +:10461000000000003F3F427E9F18F9180000000094 +:1046200000000000000000000000000000003C3C12 +:104630000000000000000000000000003030606F4B +:10464000600060F0F6FFF6000000000000000000CF :10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:104670000000000000000000000009000000000031 -:10468000000000000000000000000000000000FF2B -:1046900040FF0066000C3D0100000000C0C0C0CF1C -:1046A000C3C3000100030000000000000000000080 -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F0000000000000000000006100000001000058 -:10470000000000000000000000610A0E050900A082 -:104710000061303E004D00010061000E000D000000 -:104720000061000000010000000000000000000027 -:104730000000000000000000000000000000000079 +:104660003C3C3C3C0000000000000000000000005A +:10467000000000000000000000000000000000003A +:10468000000000000000000000006C6C6060000092 +:104690000000000000000303427E061860180000BE +:1046A00000000000000000614006001D0000000046 +:1046B00030000010000000610006000D0000000046 +:1046C0002000000000000000000000000000006169 +:1046D0000006000D000000000000000000000000C7 +:1046E00000000000000000000061000E800900A032 +:1046F00000000000000000000000000000000000BA +:10470000000000000000000100610007000D00052E +:1047100000610006000D000000612006000D000091 +:10472000006100050009000000000000000000001A +:104730000000000000000000000000000FFF0EFE5F :104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:1047700000000000000000000000FF3FFF3FF0AA23 -:10478000AAAA000000000000000000000000DFFFF7 -:10479000D7FF00000000D0F0D0D0E8E8E8005514C2 -:1047A0000F0C0F0F0F0FA8ABA8AB0000000000000C -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F000000000000000000000000000C000C00039 -:10480000F0AAAAAA000000000000000000000000BA -:104810000020002800000000F0F0F0F0EBEBEB00CF -:10482000FF3C0F0C0F0FFF00A8ABA8AB000000006F +:10475000000000006D452C04000000000000000077 +:10476000000000000000000000000000FFFA000848 +:10477000F0F8000000000000000000000000000051 +:104780000000000000000000000000000000003CED +:1047900000FF1F1F5F0F0000000000000050F8F82E +:1047A00028FF5050CFC0F514A014000000000000F6 +:1047B00000000000000000000000000000000FFFEB +:1047C0000AFA0000000000000000000000000000E5 +:1047D000000000000000EFC7AE86000000000000EF +:1047E0000000000000000000000000000505FFFAC6 +:1047F0000000FFFF000000000000000000000000BB +:1048000000000000000000000000000000000000A8 +:10481000003C0000141455000000000000000000DF +:104820002828282850500F00A014A01400E8C3E83E :104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 +:104840000F0F0C0C00000000000000000000000032 :104850000000000000000000000000000000000058 :104860000000000000000000000000000000000048 -:104870000000000000000000000000000000FF3FFA -:10488000C0000000FFFF000000000000000000006A -:104890000000A0A0AAEB0000000000000000000043 -:1048A0000000FFAA00AA3C1E3C1EA0AFAAAA00005E -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 +:1048700000000A0A0A0A0000000000000000000010 +:104880000000000000000000000000000000000028 +:1048900000000000000000000000505050500000D8 +:1048A000000000000000C300FF00027F00553CE84C +:1048B000FFE8000000000000000000000000000011 +:1048C000000000000C0C00000000000000000000D0 :1048D00000000000000000000000000000000000D8 :1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:10490000FF3FC0000055AAFF0000000000000000AB -:104910000000000000000000000000000000000097 -:10492000000000003F3F30303C1E3C1EA0AFAAAA52 -:104930000000000000000000000000000000000077 -:1049400000000000000000000000000000000080E7 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000003000000000000000000000000000034 -:104980000000040004000400040000000000840093 -:10499000000000000400040000000000000001808E -:1049A0008480000021000000C0008500000000801D -:1049B00001000000000000000000000000000000F6 -:1049C00000000000000000000000400000000000A7 -:1049D0000004000040000000000000000000000093 -:1049E00000000000000000000000000000000000C7 -:1049F0000000000000000000000200004100000074 -:104A0000000200028000800280008000000200009E -:104A1000000200400002000200000000410200020B -:104A200004202120000020900000408204020002A7 -:104A30000020040200000440000000000200020008 -:104A4000020000000200000000000000000004005E -:104A50000000020008000800000000000000000044 -:104A60000000000002000000000000100000000034 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90000000020002000003000000000000A0006F -:104AA0000000000000000000000402009000000070 -:104AB000010020002100000800000040000000006C -:104AC00000100010001000000000000000000000B6 -:104AD0000000000000000040000000000000000096 -:104AE00000100000000000000000000000000000B6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B1000000000000000000000080000000000008D -:104B2000000000000000000800000001000000007C -:104B3000028220008400A0000000000000000000AD -:104B4000000000080000000000000000000000005D -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000002000040001 -:104B900020000000000000004000000200000000B3 -:104BA00000000400000000008400000000004040FD -:104BB000008082A104212000880000000000000085 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000A0000004 -:104C1000800000000008000000000000000000000C -:104C200000000000A00009820000000000A00400B5 -:104C30009101210200048000080000000000000033 -:104C400000000040000000000000004000000000E4 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C9000000000000000000000000000000000090B -:104CA0000000000300400420000900408440080088 -:104CB00000000841002101090004C000404100003B -:104CC00000000000000000000000000000000000E4 -:104CD0000000000000000090000000000000000044 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000800100000000000002 -:104D30000000000000000040208800012100000069 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D9000000001000400002000800000000000006E -:104DA0000000000000000000400040000021000062 -:104DB0001000000200200020080004000400000091 -:104DC0008200000000000000000000000000000061 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E0000000000000008000000000000000000009A -:104E100000000008040280000001002041000000A2 -:104E2000000000002100000000A0000000002000A1 -:104E30000000050440050408111040C00410800063 -:104E40000000200000000000000000000000000042 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 +:1048F000000000000CFC0CFC0000000000000000A8 +:1049000000000000000000000000000000000000A7 +:10491000000000000000000000000000287D2828A2 +:104920000000000000000000C300F330027F0055CB +:104930002000000088000800000004000400880037 +:1049400088000000200020838880400020008980AB +:104950002000000040000002100088004000880095 +:10496000200004008800200000000000880088006B +:104970000003208000002000C0004010000020083C +:1049800002042000200020042004048000002104F0 +:1049900021908800000020020800000000000004B0 +:1049A0004000218041004102211000008400C0002D +:1049B0002000000000000000800004000000000053 +:1049C000000000000000000000040004800000005F +:1049D0004002000000008000000180A0000080A0D4 +:1049E0000000100000000000000040000000000077 +:1049F0000000000040040000000000000000000073 +:104A0000000000004100410421020000C0104102EA +:104A100084030403400000004000890040000900B6 +:104A200000A0000004100402040104012002400060 +:104A3000200000000000000000000008000004004A +:104A40000000000000020000000000804000008222 +:104A50000000088002002010000240824000020096 +:104A600011000004000002000000020002008200A9 +:104A7000000002000000000088000010000000009C +:104A80000000000000000000004000008400020060 +:104A90000400002000410300030011200000044135 +:104AA00084408403080000000004040000008240E9 +:104AB00002000200000000000010000000000000E2 +:104AC00000000000008400030000000000048000DB +:104AD0000003008880100000800100018009800030 +:104AE00005001000000800000000000000000004A5 +:104AF0000010000000840000040400100000000802 +:104B00000000000800880084000800024000000047 +:104B10000400050000000000020002100800000868 +:104B200005000004000280080008000000000000EA +:104B300000000008800400000000000000000000E9 +:104B4000000000000000050000000000000000411F +:104B50000010C0080100000800080008010000085B +:104B600000000100000000400008000000000040BC +:104B700000000000900004000000000000000000A1 +:104B800000000000000000002008002000000000DD +:104B90000000000005000000C140C00082000008C5 +:104BA000002100030004000300000400880000410D +:104BB000C0400003000000000000000000000000F2 +:104BC00000A00000000000008408000000000000B9 +:104BD0000300088241004000000000000082400005 +:104BE0000000000040000010081000000000080055 +:104BF00000000000080008000800000021A00000DC +:104C000000000000000003000000000000000000A1 +:104C1000000005000000040000002000000041002A +:104C20000300000009000020000041000000418254 +:104C300000000000000003000000210082021000BC +:104C40000000841010000000200010204011A0215E +:104C5000000000119008080200110802A000C040E6 +:104C600008020000831104110800080000008200FF +:104C7000000000000002900000110021000000046C +:104C800000000000000008000802000008001000FA +:104C90002011200020400000820200408202C0005B +:104CA0000141C021080440049040A0000000000021 +:104CB00000000000000900900009104140000000C1 +:104CC00008000000000000000000000000010000DB +:104CD0000000000000C00001001000000000000003 +:104CE00000010000000010001000000080004100E2 +:104CF00000080000000000010300040000000000A4 +:104D000000000000000000000000030000000000A0 +:104D10000000800080008000110000000000000002 +:104D20000000020409900000800000014100000022 +:104D3000000000002100210000031100C1C080001C +:104D40000000000000000000000000000000010062 +:104D500000058200400000000040000084100000B8 +:104D6000820000000000080300400800004000002E +:104D70008200000000000000000000800000000031 +:104D80000000000000000000000000001000000013 +:104D90000000C100000000000000820090000840F8 +:104DA000840008030005A000108008000008080027 +:104DB0000841008084080920822000080000821039 +:104DC0000003008440000088001000000000000480 +:104DD0000400040000A000000088000000000000A3 +:104DE00000000400000000000000000008000008AF +:104DF00000000000000000001000000000020000A1 +:104E0000000000000000030000000084000000001B +:104E10000000000020000000000020000000000052 +:104E2000020100020900000000040310000000005D +:104E3000000000001010000040010001000400000C +:104E4000000000080002000000000010000208201E +:104E500000000080002140030000002110084000F5 +:104E60000011404100210000000000000000000887 +:104E700000000040000900200000000008000000C1 :104E80000000000000000000000000000000000022 -:104E9000000000000000000000000000000090087A -:104EA0000000000000000000000000000000008082 -:104EB000000000008400001000009010000082003C -:104EC000404002002011000000000000000000002F -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 +:104E9000000000000002C00002004000000000000E +:104EA00000000408000000040004040300050821B9 +:104EB000C01040000411000000000000100000209D +:104EC00000040020000900000000000000040000B1 +:104ED0000000000000200000000000000000801022 +:104EE00000000000000000000000000011100000A1 +:104EF00003000000030000000000000000000000AC +:104F00000000000000000000000000080000000099 :104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F300000400000008400000000000000000000AD -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000100000000000000000000000000000040 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000010008410000469 -:104FA000008200000000000000000000000000007F -:104FB0000000029000020088C088000100019001FA -:104FC0000000004100820011848500000000000004 -:104FD00000000000000000000000000000000000D1 -:104FE0000000400000004100000000000000000040 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000008000000010 -:105020000000008000000000000000000000000000 -:105030000000000000000000000080000808094097 -:10504000001000090091000000400008000000006E -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000800090 -:1050A00000020080800000000000000000000000FE -:1050B00000000000000000000004000080000480E8 -:1050C0000841000010002000410390118000000002 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F +:104F200000000008800000000000000000000200F7 +:104F30000000040000000002000008000000000063 +:104F4000000002040000000000000000000000005B +:104F5000000000000000000000010001000100004E +:104F6000000000010001000010900004000088040F +:104F7000010120010000000100000000000000000D +:104F80000000000000000000000000000000010020 +:104F9000000000000000000000000001200090015F +:104FA00000000402042082C082900800000000007B +:104FB00004000100000000000000100488100090B0 +:104FC00008A00001080140000001000000000000EE +:104FD0000000000000000000000000400002094046 +:104FE0000009001100214010000000002085000091 +:104FF0000085114180020003000300000000000052 +:10500000000000000000002000030000000000007D +:10501000400000000000000000000000201180217E +:10502000880400008800A100050080808000000046 +:10503000000000001020002100200040808000803F +:1050400000008000404103208010000300000000A9 +:105050000000000080008000800080000000000050 +:105060000000000089108200100041104080020002 +:10507000210089A141000200201141100000000020 +:10508000000000000000000000000010000000040C +:105090000000000000000000000000000000208070 +:1050A0002000110002038000002080020080000028 +:1050B0008000000080000000000000008000100060 +:1050C00008C0830083002000100841001000C000C9 +:1050D0008800A000A00008000800A00090000000C8 +:1050E00000000000000002A0A1000000410101C07A +:1050F00011000100048990C04100010183010000FA +:10510000000000000000004000000000000100005E :10511000000000000000000000000000000000008F -:105120000800100000829000000000000000000055 -:1051300000000000000000000000820000A09000BD -:10514000001001010004010009A090018401908475 -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000001003E -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F +:10512000009000000100000110008408A010840815 +:105130008800820004000284080090000000C00083 +:10514000A100A1C1A08205900000000000020000A3 +:1051500000000000000000000088000200000008BD +:10516000000000000000010000010101000000003B +:105170000001000500010204000041008800010058 +:10518000000000000000000000000100010000001D :10519000000000000000000000000000000000000F -:1051A0000000001000A0001002000000000000003D -:1051B00000000000000000000000104000829090FD -:1051C00000C00000010100010000004100839010B8 -:1051D000039100000000000000000000000000003B -:1051E00000000000000000000000000000000000BF -:1051F000400000000000000000000000000000006F -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:1052200000000000000000000000800000000000FE -:1052300000000000000000000000000000800000EE -:1052400080000080000011040421000500A000037C -:105250009091918800000000000000000000000014 -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A000000000000000001180000000000000006D -:1052B000000000000000000000000000000080006E -:1052C0008040800080002000031103000303800061 -:1052D0001111880008080000000000000000000014 -:1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D -:10531000000000000000000000000000000000008D -:1053200000000000000000001001208400000000C8 -:10533000000000000000000000000000000000006D -:105340000800A09110108200900488010000030161 -:1053500090008383830091010000000000000000A2 -:10536000000000000000000000000000000000003D -:10537000000000E00000000000000000000000004D -:10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000700F6 -:1053B00000000000000000000000000000000000ED -:1053C00000000000000007000006880000E0000068 -:1053D0005000000000E00700000000000000000096 -:1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C +:1051A000000000000000010101000991002004102E +:1051B000C08900900088000000C0000000000000CE +:1051C000000008040004049011A000000001000188 +:1051D00000000000000000000000000000000000CF +:1051E00000800000100004004000000910080010BA +:1051F000000200210982080200A000009100830043 +:105200000800000000000000000000002000050071 +:10521000100000000000000000000000000000007E +:105220000000000000202020080511028810002046 +:105230000089909100000080000000800000400084 +:1052400010000000C00000808000890000090010EC +:1052500041210009000000800000000000020080E1 +:105260000000000000000000000000002000050019 +:1052700020002002410020912100030020804000F6 +:1052800020000311000000000000000020000800C2 +:1052900003001000000000040000000000000000F7 +:1052A00000000000000020001111090000038040F0 +:1052B000801100000000000000000000000000005D +:1052C0000000000000000000000280808000808458 +:1052D00080000000000000000008009000000000B6 +:1052E0000010008800000000000000000000010025 +:1052F00000200004000101400005018801000108B0 +:10530000011000400001000000000000000001004A +:10531000010000000000000000010000000000008B +:10532000000000000000000000000101000000017A +:10533000C0012004021004000000008800020000E8 +:105340000000008800C000000800824008840200BD +:10535000C0C10200020000000000000000000000C8 +:105360000081000007000000000000E000000000D5 +:10537000000000E000000000000000E000008800E5 +:10538000480000E0000000000000000000000000F5 +:1053900000000000000000000000810000E00000AC +:1053A00000000000000000000000000000E000001D +:1053B0000000484200E0070000110000000000006B +:1053C0000000000000000000000000420000070094 +:1053D000500000000000000042000000000000003B +:1053E000000000000000FFFF3F3F00000000000041 +:1053F00000000000000000000000000000000A0A99 +:105400000F0F00000000000000000000000000007E :10541000000000000000000000000000000000008C -:10542000000000000000000000000000AAFFFFFFD5 -:1054300002FE02FE0000000000000000000000006C -:1054400000000000EBEBC303AAAAACAA7D5555559A -:105450000000000000F0FFF00C0CFCFC000000005D -:10546000000000000000000000000000000000003C +:10542000000000000000000000000000000000007C +:10543000000000003C3CF0F03C3CFFFF000000009E +:10544000F0F0C0C000000000000000003C3C3C3612 +:10545000FF3CAAF0AAAA00FF000000000000000024 +:105460000000000000000000FFFF3F3F00000000C0 :10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C +:105480000A0A000000000000000000000000000008 :10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000055A7 -:1054B000000002FE02FE00000000000000000000EC -:1054C000000000000000EBFFC3030000ACAA2800AE -:1054D000000000000000003CFF3C0CFC0CFC000045 -:1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000FFAAAA0838CBFB000093 +:1054C0000000E8E8C0C000000000000000003C3C14 +:1054D0003C3C003CAAF0F0F0F0F0000000000000BE +:1054E000000000E155E100000000FFFF00000000A7 +:1054F0000000000000000000000000000808007D1F +:105500000041AAAA0A0A000000000303F3F3000006 :10551000000000000000000000000000000000008B :10552000000000000000000000000000000000007B -:105530000F4D0F4DBCBC1C1C000000000000000003 -:10554000000000000000000000000FCFFFFF5F5FC1 -:1055500000000000000000003F550355AFBE0514D9 -:10556000000000000000000000000000000000003B +:1055300000000000000000001EFF1EAA0000000086 +:1055400000000000003C003C0000000003031717AF +:10555000F7C737073010000000000000000000000F +:1055600000000000AAE1FFE100000000FAFBF0F1FA :10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B +:10558000007D004100000A0A00000000AFAFAFAF8D :10559000000000000000000000000000000000000B :1055A00000000000000000000000000000000000FB -:1055B00000000F4D0F4DBCBC1C1C00000000000083 -:1055C0000000000000000000000000000000A0A09B -:1055D000000000000000000000003F550355AFBE72 -:1055E00005140000000000000000000000000000A2 -:1055F0000000000000000000000000610007000D36 -:10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A -:10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:105650000090000080610004C00D000000610000A7 -:105660000001000000000000000000000000000039 -:10567000000000000000000000000000000000002A -:10568000000000000000000000000000000000001A -:10569000000000000000000000000000000000000A +:1055B000000000000000000000001E551E00540006 +:1055C000000000000000FF500050000000003F3FBE +:1055D0001717F4C43404200000000000000000008D +:1055E000000000000000000000000000003000008B +:1055F000000000610007000D000000610007000DC1 +:10560000000000410004000D00010061000280055F +:105610000000000000000000000000610006000D16 +:105620000000000000650007800D00000000000081 +:10563000000000000061000100010000A5614A2F88 +:10564000850D00A000000000009000010061000630 +:10565000000D000505614A2E050D00A0A0610006A1 +:10566000000D00000000000000000000000000002D +:105670000000000000000000000000000014505571 +:105680003C000C003CFF550FFC00FC0F00B23CB28C +:10569000000000000000000000000000FFFE00000D :1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D000000000000000FFFFFF1E00000A0A8F0DFF -:1056E0008F0DC0FC00FF0000000000000000000063 -:1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 +:1056B000000000000000F0F05555F8FB080B00005A +:1056C00000000BCB3BFB00000000000000000000CE +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F0000000000000000000000000000000001496 +:1057000050003C000C003C00550F0C000C0FC3B2C5 +:10571000FFB2000000000000000000000000FFFFDA :105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000FFFFFF1E0000000A24 -:105760008F0D8F0DC0FC00FF000000000000000046 +:105730000000000000000000F0F0FF00F8FB080B84 +:105740000000000008C838F8000000000000000059 +:105750000000000000000000000000000000000049 +:1057600000000000033F417D000000000000000039 :105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 +:10578000550050000A0A040E007D007D0C0FCCCF9E +:10579000003CF055FA0A0C0C00000000000000006C :1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 -:1057D000000000000000000000000300010C0000B9 -:1057E0000101FFFF3F3F40FE40FE000000000000BF -:1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:1058600000000000C0C0000040FE40FE200000001C -:105870000000000000000000000000000000000028 -:1058800000000000000000000000000020000000F8 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000002000D8 -:1058B00000000000000000000000000000000000E8 -:1058C0000000000000000000100010040000200094 -:1058D00000000000000000101000000000000000A8 -:1058E0000000000000000000200020000000400038 -:1058F0000000004000000000000000000000000068 -:105900000000000000000000000000000000100087 -:105910000000000000000000000000000000000087 -:105920000000000000000000000000000040000037 -:1059300000000000000000000000000000000082E5 -:1059400000000002000000000082000000020004CD -:105950004000109010000000000000000000000057 -:1059600000000000000000000000000010401000D7 -:10597000020002000040820000000000020000005F -:1059800000000040000000000000000000000000D7 -:105990000000000000000000000000000000020005 -:1059A00000000040000000000000000000000000B7 -:1059B00000000000000000000000004000000000A7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000200000000000000C5 -:1059E00000000000000000000000000000000800AF -:1059F0000000000800000000000000000008000097 -:105A0000000000880000000000000000000000000E -:105A10000000000800000000000000000008000076 -:105A20000000000000000000000000000000000076 -:105A3000030000000040000000000000000000081B -:105A40000000000000000000000000000000000056 -:105A5000000000000000000000000000000000083E -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000000000000F6 -:105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000000000D6 -:105AD000000000000000000020000000000000099D -:105AE00000000000020040009000000000001000D4 -:105AF0009000000000000000000000000000000016 -:105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 -:105B30000000000000000000040000000000000061 -:105B40000000000000000000000000000000000055 -:105B500000A000000002000004000000000040005F -:105B6000000805000000040400020000000200001C -:105B7000000000000000008800000000000000405D -:105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 -:105BA0000000000000000000004000000040000075 -:105BB00000400000000000000000000000000000A5 -:105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE000000400400000000400000000000000006D -:105BF0000000000004001000000000000000000091 -:105C00000000004000000000000000000000000054 -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 +:1057B00000000000000000000000AFAFAF05080BC4 +:1057C000F8FB0000000000000000000000000000E6 +:1057D00000009E008A000000000000000000300071 +:1057E000303CFFC3CFCFCFC0C3C3000000000000D8 +:1057F0000000000000000000000000AF00CF00002B +:105800000000550050000A0A040E00410041000348 +:10581000C0C3FF3CF055FA0AFCFC00000000000089 +:105820000000040404040000000000000000000068 +:1058300000000000000000000000000005AF0505AA +:10584000080BF8FB00000000000000000000000052 +:10585000000000001C000800000000000000000024 +:105860003000303C3C000C0CCFC0FF002000000496 +:105870000000200000008400040020000000000060 +:10588000C0000008000000004002200000000400EA +:1058900000000000000020000441000040008400DF +:1058A0004000C00004000000C000400000000000F4 +:1058B0008400840004000000200020000400000098 +:1058C00020008800040040004000000000000000AC +:1058D00020002000200000000000200020004000E8 +:1058E0000000840020000000000004000000100000 +:1058F0000000410000000000000000000000000067 +:105900000000000040000000400000000000000017 +:1059100040004000000000000000200241000000A4 +:105920000000000000000000000200001040000025 +:1059300010002000000000000040000000400000B7 +:10594000000040001000400000040000210221403F +:105950001000000000000000400040002100400056 +:105960000000000000000000400000004040100067 +:1059700000000000000000000000004000000010D7 +:1059800000000040000010000000000000000210B5 +:105990000000000300000000000000000000000004 +:1059A00000000000000000000200000000000000F5 +:1059B00000000000000000000010080000000000CF +:1059C00000000200000000000804000000000000C9 +:1059D0000200004000100040001000000000000025 +:1059E00082000000000000000040000000040020D1 +:1059F000840040C000000000000000000010000013 +:105A0000000000000008400000000000000002004C +:105A10000000000000000000000000000000000086 +:105A20000400000000820000008405000000000067 +:105A30000004000000000000000002040008000054 +:105A400000000008000800080000030000080240F1 +:105A50000000000005000400000000C00004000079 +:105A60000000000200080008000000040008040014 +:105A70000000000000000000000000210000000005 +:105A8000000000000000904100000008000000003D +:105A9000400000084000000000000000000000413D +:105AA00000000000000800080020000000000000C6 +:105AB00000000000000084000000A00000080000BA +:105AC00000000000200000000000000000080000AE +:105AD000000000002000000000008800000002021A +:105AE000000300000000002000000000000008008B +:105AF000080000000000000000000000000000009E +:105B00000000000000000000000008000800410044 +:105B100003A040004102000000A000A0088400088B +:105B200000000000000000000082080000000000EB +:105B3000000000000800000000000000000000A0BD +:105B4000400040000000040000000800008208003F +:105B500000000000008800000300008403100040E3 +:105B6000000008000000000003000000080800001A +:105B700000000000000009000011000400040010F3 +:105B80000000080000000041000000000010044078 +:105B900000000011000000000011000000000040A3 +:105BA000000900200009084000400000000000003B +:105BB0000000004000000040000000400000C04025 +:105BC00000080040000000000000080000400840FD +:105BD000840000000021104108040402004000007D +:105BE00082000011000382028210004100040004C0 +:105BF000000000000000821100030000000000000F +:105C00000000090000102000000000000000040057 +:105C1000000000000090000000000000000000886C +:105C200000002000000000000000000000840000D0 :105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 -:105C60000000000000000000001000C000C00000A4 -:105C70000020000000000000000000000000000004 -:105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 +:105C40000090000000000000000000000000400084 +:105C50000000000000000000020000000000410001 +:105C60001100200000400010000000000000212072 +:105C700000A020000004000040000300000000001D +:105C80000000000000000000000000000800080004 +:105C90008400000000000000000000000800000078 +:105CA0000000820000000000000000000000000072 +:105CB000000000000008000000008200000000005A :105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 +:105CD00000000000000000000004080000000000B8 +:105CE0000000000000000000100000000000901004 +:105CF0000000000000000000000004001000000090 +:105D00000004080000A000000088000000A00004BB +:105D1000000000000000100041000502000000A08B +:105D20000000000020080084000041004100000045 +:105D3000000000000000000000002104000000003E :105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D6000000000000000000009041100000040884D -:105D700040002010050400001188000040000002CF +:105D5000000000000000000200A00004000021007C +:105D6000000000000008110002000000000803000D +:105D700041000884214003002100000000000000D1 :105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 +:105DA00000000000000000000000000000000008EB +:105DB00000020000080000000000000808000000C9 :105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000110000A2 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 +:105DD00000000000000000000800000000000000BB +:105DE000000000000000000000000000400820004B +:105DF0000000820000000000000000000021000000 +:105E00000000200041A0000004A0000000000000ED +:105E10002000000000C00000001000000000000092 +:105E2000000000000000000000000200022000004E +:105E30000000000000000000000000002000200022 :105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E6000000000000000008400002000000000008E -:105E700002000910000000100008000000000000EF -:105E8000000400000000000000000000000000000E +:105E5000000000000000000000000000080420C056 +:105E60000910000000A02000000000201100040420 +:105E7000002000000088082020C000001100000061 +:105E800020004100000000000000000000000000B1 :105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 @@ -124575,917 +124575,917 @@ :1067F0000000000000000000000000000000000099 :106800000000000000000000000000000000000088 :106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 -:106830000000000000000000000010002000020026 -:1068400020000000000000000000000000008800A0 -:106850000000880000000000000020002000200050 -:106860002000000000000000000000030000000005 -:1068700020000000000000000000000020002000B8 -:1068800020002000000000000000000000000200C6 -:1068900020008980000082000000008000000200CB -:1068A0000000000000800000000000000000000068 -:1068B0000090000040000000000000008000C000C8 -:1068C00080008000000000000000000000000000C8 -:1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000100088 -:106900000000000000020002000200041004000069 -:10691000800000040220000000000004004000008D -:106920008002009000000002000000020000000051 -:106930000200000000000000000000000241000012 -:106940000000000000000000000000000000004007 -:1069500000000000084000000000000002000000ED -:1069600000000040000000000000000000000000E7 -:106970000000000000000000000000000000000017 -:1069800008000000020000000000000000000000FD -:1069900000000000080004000080010090000010CA -:1069A000040304000405040000000000000082004D -:1069B0000000400000000000000000000000000097 -:1069C00000000000000000000000000000000000C7 -:1069D0000000400400000000000000000000000073 -:1069E00000000000000000000000000000000000A7 -:1069F000000000000000000000000008000000008F -:106A00000000000000000000000000000000000086 -:106A1000000000000000800080000310080000005B -:106A20000001800080008000804000000000000025 -:106A300000840000000000000000000000000000D2 -:106A40000000000000000000000000000000000046 -:106A5000000000000000000000000008000000002E -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 -:106A800000000000000000000000000800000000FE -:106A9000000040000000000000000800900000001E -:106AA00000009000900020000400040590400021A8 -:106AB00000100000000000000000000000000000C6 -:106AC00000000000000000000000000000000000C6 -:106AD00000000000000000000000000000000000B6 -:106AE00000000000000000000000000000000000A6 +:106820000000000000000000000004000400888058 +:1068300020000000000004002003100020002000C1 +:1068400020000000820000002080200020008880BE +:106850000900880482002000200088002000200019 +:1068600000000110050088842088000388000000D3 +:106870004000200488024000C0004000C002000028 +:106880002000880088000800040009058980008530 +:1068900020042104200020091000200400008800AA +:1068A00020002000200020028984880000000000D1 +:1068B0000004000000000082000000000000000052 +:1068C0000000000200000200009000040000000030 +:1068D0000010880010000000004080004000000010 +:1068E000000000002001200000040004000040001F +:1068F0000000100200001000000200000004100060 +:106900000000400240004000800080008802200813 +:10691000400404914001000040008000000040005D +:106920004000100000901004000440080000000027 +:10693000000000000002000000080000000000004D +:106940000000080000000000000002000800000035 +:1069500004000910020001000100200000040000F2 +:106960000000080000088200000090C00005000040 +:1069700000000004000000000000000000002010E3 +:106980000200200008000000880009210010020217 +:10699000011001000300088008408402002184885F +:1069A000000000088900C01021091002020009023D +:1069B00000100000000000050000001000000000B2 +:1069C00000000010000000080000000005080000A2 +:1069D0000000800088018904200820088900200127 +:1069E000000000000000000440004000000800001B +:1069F000000003C00008000400082008200402046E +:106A000000000000000009040040000090000000A9 +:106A1000C10502010808C040C10204020084000050 +:106A200000100800000040840001C000830100C085 +:106A30009005000090050009000800030002000511 +:106A40002000000000009121000000000000004133 +:106A50000000001100000008020200000000000019 +:106A6000000000000000000300000100008500217C +:106A700000000000000000000000000500400002CF +:106A800000020010000000008400000340008200AB +:106A9000000000000008000000004000901000020C +:106AA000C003002100080421002100020100880821 +:106AB00000020008000000000000000000000000CC +:106AC0000300800000000000400000000000000003 +:106AD000000000000000000000A01008000000C03E +:106AE0000008090000000000030000004000000250 :106AF0000000000000000000000000000000000096 -:106B00000000000000000000000000000040000045 -:106B10000000000000000088090000888000008854 -:106B20000000200000000000000080008000000342 -:106B300000000010000000410008000000040000F8 -:106B40000000000000000080010020000000C040A4 -:106B50000000000000000000000000000000000035 -:106B600000000000000000400040000000000000A5 -:106B700000000000000000000000000000000021F4 -:106B80000000000000000000000000000000C00045 -:106B90000000000000000008000000100000084095 -:106BA00000000004000000040400040004000404C9 -:106BB000000000400000C0000000000000000000D5 -:106BC000000000000000000000082000800000001D -:106BD00000A0000000000000000000000000000015 -:106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000000084 -:106C100000000000000000000000000002000284EC -:106C2000A0010000000000042040800080008800D7 -:106C3000809000000000210000000000000800001B -:106C40000000000000000000000000001000000430 -:106C50000000000000000000001100020000000021 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C800000000000080000000000000000000000FC -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000010908A00880AA -:106CB00000200800C00000000000000200000000EA -:106CC0000000000000000000000000000000800044 -:106CD00000010000000000000000000000000000B3 +:106B00000000000009010000000000080000000073 +:106B1000000000000002000000000084800000006F +:106B20000000000000000040000000000000020023 +:106B30000900000108000800004000008200020077 +:106B40000000A000040082000085A0918284A04083 +:106B50000040820400008208A0000804A000000990 +:106B60000000200000400802000000080821840006 +:106B70000000C000000000000800080008008200BB +:106B80000200020008100840042120000040000418 +:106B900000000811090490100809084102040004CB +:106BA000C010C0004040A005A109032182000004DC +:106BB000A010A1090902009021000300080002882A +:106BC0000040002011000200000410020002210415 +:106BD0000004008400000000000000000000020823 +:106BE00000000000C10000000000000000000300E1 +:106BF0000000000004002000000000000000000071 +:106C00000000000008000000000008002000000054 +:106C1000000000002188020020A1099083042004C4 +:106C2000200400050420C185114010C090882190E7 +:106C3000009004C1208420C110040002000500114E +:106C4000000000080000000020000000000000001C +:106C5000001008000000000082000000000000009A +:106C6000080000000000000000000000000000001C +:106C70008200000008400000000000000004000046 +:106C80000000000000000000000000008200820000 +:106C90008200000088002000084082000021C1001E +:106CA000C0034003A080A0080808040390118203D9 +:106CB0001008400882088210A10240000000000075 +:106CC0000000000000000000004080000000000400 +:106CD00000000000000000000000000000000000B4 :106CE00000000000000000000000000000000000A4 :106CF0000000000000000000000000000000000094 :106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 -:106D2000000000000000000800A000000200002198 -:106D3000002000010000008200A000000000000010 -:106D40000000000000000000000000000000418082 -:106D500010000000010000210003000000000000FE -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 -:106DA00000000000000001000008000000210010A9 -:106DB000000300208820002000040021C0000041C2 -:106DC00000000000000000000000000000000004BF -:106DD000842080000000024000000000000000004D -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E200000000004000011C004C002001140204016 -:106E30000205020000012001000102002000000004 -:106E40000000000000000000000000000000000042 -:106E5000000010884189009182830000000000003A -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA0000000000000C000880008080284C0000242 -:106EB00000A0081010089008008200C00000000127 -:106EC00000000801000000000000000000000000B9 -:106ED0000000000080098988218880880000000067 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F200000000000000000800000008000000080E1 -:106F30000000000080008080808000800000000051 -:106F400000080008800800000000000000000000A9 -:106F5000000000000000088009111189414100056E -:106F600000800000000000000000000000000000A1 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 +:106D1000000000000000000000000000000800006B +:106D20000800000080880002000000000000000051 +:106D30000000000000000000000108010000000940 +:106D400000059000000002008240020020000800C0 +:106D500000000002200000002004080020000008BD +:106D600000080000000000000000002100000000FA +:106D7000820000000200000000000000000000008F +:106D800000040010000800000000000000000008DF +:106D900000000800000000000000001000000800D3 +:106DA000080384108400A02110080021822100041F +:106DB000088002118520008500008209859000402E +:106DC00020900000400020880000001003A0030075 +:106DD0000904210000010000000000000000000084 +:106DE0000000000000000000000000000000110092 +:106DF000000000000000000000000800000000008B +:106E0000000000000000000000000000000800007A +:106E10000000000000840008000011102040090854 +:106E20002004804000000008000000050404419098 +:106E300003010410112002820002200003004040E0 +:106E400000030000000011000000000000008800A6 +:106E5000000000019100840000000000000000001C +:106E60000000A0C09040002002820000000001004D +:106E7000000000000000000000000001A0008400ED +:106E80000001000000000000000000000000000001 +:106E900000000000000000000000000008C00082A8 +:106EA00000100888021001848984C0840101410116 +:106EB00004000001000000000000000000C1090003 +:106EC0000308082000000000C000000000000000CF +:106ED00000000000050208218005000200000000FB +:106EE000040000008080808000008080000000009E +:106EF0004000000000000000000000000941A00563 +:106F00000403000300000000000000000000000077 +:106F10000000000000000000000000000000C08031 +:106F200009000000800088801000020089001141E3 +:106F3000082180410021080021000000000000C15C +:106F4000210485848010000000000004000000007F +:106F50000000000000000000210003040083000086 +:106F60000000000000000000000080A100000004FC +:106F700000000040000000000000000000000020B1 +:106F800010000209022100000000000000000000C3 :106F900000000000000000000000000000000000F1 -:106FA00000000000000000008000000000008000E1 -:106FB0008000801080000000800000008000808041 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000110010001A10100FC -:106FE000000000040000000000000000000000009D -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:1070200000000000000000000000080010008400C4 -:1070300008C008000800A0880000080010008400B4 -:10704000C0900000000000000000000000000000F0 -:10705000000000000000000000008888009100850A -:10706000910300000000000000000000000000008C -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 +:106FA0008000802000000000404110218502C18047 +:106FB0000500C01191004110080009218300C100A3 +:106FC00010830411200088820000000000000000EF +:106FD00000000000000000000084010000000089A3 +:106FE00000000000000000000000200004099000E4 +:106FF0000001000000000000000000000000000090 +:1070000000090000009000010000000000000000E6 +:107010000000020084000000880000000000000062 +:10702000000002000201409020009101880003004E +:1070300041A091A002881100110100002000400031 +:10704000C1004110410091028310000000000000C7 +:10705000000000000001000000000000000001002E +:1070600000010000000000000000C00000020084D9 +:10707000A1900000020000000100000000000000DC +:1070800000000000A000A0000001000000000000BF :1070900000000000000000000000000000000000F0 -:1070A000000000000000000000000000C088009008 -:1070B0000088A1A004C00000000088880008000823 -:1070C0000002000000100082000400C00000000068 -:1070D0000000000000000000000000008080009020 -:1070E000008591C1000000000000000000000000C9 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F +:1070A00000000000001000030002A089400810C189 +:1070B00002919003000041018900010100000001DC +:1070C0000001000110028205014082C10010000988 +:1070D0000002000000000010000900000002080586 +:1070E0000241001100000000000005008000008047 +:1070F00000008900000000000000100000000000F7 +:107100000000000000411103C1100508000000004C :10711000000000000000000000000000000000006F -:1071200000000000000000000000000000008000DF -:1071300000000000898000000000000080800080C6 -:10714000008000000000000000804180100000006E -:107150000000000000000000000000000000892185 -:10716000912105000811000000000000000000004F -:10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000000FF +:1071200000000000000000820003000888C1800900 +:1071300000048004008400089110C1200340000373 +:1071400000080008004100821190218090C10005D4 +:107150000000000000000000000000000000418866 +:1071600004090300400000090000000000000000C6 +:10717000800000008000000000000000000000000F +:1071800000000000000010028300100082080000D0 :1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B000001100210000000000000080008080001D -:1071C00080098080800000000011000000000000A5 +:1071A00000000000000000000000809180800000CE +:1071B000800380000080801090091021A00003400F +:1071C0008000000080800020C110A1210080040206 :1071D00000000000000000000000000000000000AF -:1071E000C191A10001008901000000000000000021 -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000001001000000200101004080F -:10724000A0009000080840408800000000000000F6 -:10725000000000000000000000000000000000002E -:107260000000484200E007000000000000000000AD -:10727000000000000000000000000000000000000E -:1072800000000000000000000000000000000000FE +:1071E00001A10100010000000000000000000000FB +:1071F000000004841084040000000000000000006F +:107200000000000000000000090002000100020070 +:10721000000000000000000000000000004000909E +:10722000000000000000000000008800A0049002A0 +:107230000200C004080802408800C12183400804FD +:107240000800C004901008020200C1892008A002B2 +:107250008200810000E000000000000000E000006B +:107260000000820000E000000000810000E000005B +:1072700000000000000007008400000000E00000A3 +:1072800000000000000000000000880000E0000096 :1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000008100000700840000000000C2 -:1072C00007000000000000000700000000000000B0 +:1072A000000000000000000000000000004100009D +:1072B00007000000000000E000004206480000E077 +:1072C000000000110000000000000000000000E0CD :1072D00000000000000000000000000000000000AE -:1072E0000000000014143C0000000020000000001A -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D +:1072E000000000000000000000000000000000009E +:1072F00000000000E800E800AAFFF0000000000025 +:10730000000000000000000000000000820082C3B6 :10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:1073300000000000000000000000000F0000CFCFA0 -:10734000CFCF00000000303C3F3C02FE02FE0000B8 -:10735000000000000C000000000000000000000021 -:107360000000000000001414003CFFFFFFDF0000DD -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED +:107320000000000000000000000000000000CFC3CB +:107330000F03005000FF3F3000000F0FFF00F0FC74 +:10734000FCFC00000000F0F000FF00000000F0FF77 +:107350003CBEF0FFF03C0000000000000000000018 +:10736000000000000000000000000000000000001D +:10737000000000000000E800E800AA00F0000000A3 +:10738000000000000000000000000000000082007B +:1073900082C30000000000000000000000000000A8 :1073A00000000000000000000000000000000000DD -:1073B0000000000000000000000000000C0C0C00A9 -:1073C000CFCF45CF14140000303C3F3C02FE02FEFC -:1073D00000000000000000000000000000000000AD -:1073E0000000000000000000040000000000000099 -:1073F000000000000000000000000000000000008D +:1073B000FFFBFFFB008000FF3C3C3C3CC3C355553A +:1073C000F0FCF0F0000000003C3C3C3C0000000001 +:1073D000F0F03CBEF000F03C0000000000000000B7 +:1073E000000000000000000000000000000000009D +:1073F0000000000000000000FC0C5F5F0000FF00C8 :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C -:10743000000000000000000000007D55AFAF00001C -:10744000000028280F0F000000003C3C3C0F8F0D6F -:107450000F0F00000000000000000000000000000E +:10742000000000000000B0B01010000000000000DC +:1074300000000055C0D00303030350CF500F00C31A +:10744000FFC300000000808AD0DA00000000FFFFC8 +:10745000FFFFBEBEAFAF080B383B000000000000CE :10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C -:1074800000000000000000000000000000000000FC +:1074700000000000000000000000FC0C50500F0F46 +:107480005555000000000000000000000000000052 :1074900000000000000000000000000000000000EC :1074A00000000000000000000000000000000000DC -:1074B0000000000000000000000000005555AFAFC4 -:1074C0003CFC000028280F55800080003C3C3C0F0D -:1074D0008F0D000000000000000000000000000010 -:1074E0000000000000000000000000001060403DAF -:1074F000C0000000000000000000000000000000CC -:10750000000000000000000000000000000000007B -:10751000000000000000000000000000000000006B +:1074B000000000000055C0D00303030150C050007D +:1074C000F0AAF0AA00000000858FD5DF00000000C0 +:1074D00055000F0014140505C8CBF8FB0061000728 +:1074E000800F000000610006000900000061000636 +:1074F000C009000000610007800D2000000020008E +:107500000000000000610007000D00000000000006 +:107510000000000000610007800D00000000000076 :10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:107540002038000000A10000200000000000000022 -:1075500000000000000500610006001D00000000A2 -:1075600000000000000000000000000000003804DF -:107570003C000000F00000000000000000000000DF +:107530000000000000008061503E000D0000A061CE +:10754000400700190000A061000280050000A06152 +:107550000006000D0005A061500700950000000026 +:107560000000080B080B00000000000A000A702051 +:107570002A2A00000F0F0000000000000000000099 :1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB +:10759000000000000000140400043030303A000005 :1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B -:1075F0003C003C00F0F000F0000000000000000043 +:1075B000000000000000000000000000FCFC0CFCCB +:1075C000000000003A0F300F00FFF0F0CDC10D01B8 +:1075D0000000000000FF3C3C00555555FFFFFFFF39 +:1075E00000000000080B080B00000000000A000A61 +:1075F00020202A2A00200F2F000000000000000099 :10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A +:1076100000000000000000000000000030303030AA :10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A -:10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A -:1076700000003F3FFF3F9C9C20DF00000000000017 +:1076300000000000000000000000000000000C0C32 +:107640000CFC000000003A003000AAAAC3C3FDF100 +:107650003D3100000000F0F0F0F000553C55A0A0D6 +:1076600030300000000000000000000000000000BA +:107670000000A2F700D7FFFFFFFF0000000000009E :1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA +:107690000000000000000000000000F5343400008D +:1076A00000A000000000000000000000000000003A :1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D000000000000000000000000000F3FFF3FFC6 -:1076E000000000000000000000000000000000009A -:1076F000000000003F3FFF3F0000000000000000CE +:1076C0000000000000000000F0FCAABE00FFC3C3E1 +:1076D0005C5C000F00000000F0FCFFFF3F3C7D3CC5 +:1076E000F2F2000F000000000000000000000000A7 +:1076F00000000000AAAA0000F0FFF0FF0000000058 :107700000000000000000000000000000000000079 -:107710000000000000000000000000000000000069 -:107720000000000000000000000000000000000059 +:10771000000000000000000000000000000504045C +:10772000000000A0000000000000000000000000B9 :107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 -:107750000000000000000000000000000000000029 -:107760000000000000000000000000000002000017 -:107770000000000000000400000000000000000005 -:107780000000000000000000000000008800000071 -:1077900000000000000020000000000000000000C9 -:1077A00000000000000000030000000000002000B6 -:1077B00000000000000000002000000000000000A9 -:1077C0000000000000000000000000000000200099 -:1077D0000180088000040004000000000000400058 -:1077E00001008800012002000002000200000000E9 -:1077F00000000000004000008000000000000000C9 -:107800000000000000000000000000000000000078 -:107810000000000000000000400000000000000028 -:107820000000000000040000000000000000000054 -:107830000000000000000002000040000000000006 -:107840000000000400000000000000000000000034 -:107850000002084080104002400340000000000089 -:107860000000020000C008910000000008000200B3 -:107870000000000000000000000000000000000008 -:1078800000000000000002000000000008000000EE -:1078900000000000000000000000004100000000A7 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000002000000000A8 -:1078C000004000000000000090400200010800009D -:1078D0004000040040802000000002090040000039 -:1078E0000200004000000300001000100200000031 -:1078F0000000000000000000000000000000000088 -:10790000000000000000000000080000000000006F -:10791000000000000000000000000008000000005F -:1079200000C0000000C000000008000800000000C7 -:10793000000000000000000800000000000400003B -:10794000000000000000000000000008009010018E -:1079500000008000800080028000000080000000A5 -:107960000000000000000040080000850008400002 -:1079700000000000000000000000000000080000FF -:1079800000000000000000000000000000000000F7 -:1079900000000000000000080000000000000000DF -:1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C00000000000000000000000000000000000B7 -:1079D00000000000900004000000200000002003D0 -:1079E0000800000900009000004100004000000075 -:1079F0000000000000000000000000000000000087 -:107A00000000000000000000000000000000000076 -:107A1000000000000000000000080000000000005E -:107A20000000000000000000000000000000000056 -:107A30000000000000000000000000000000000046 -:107A40000000000000000000000000000000000036 -:107A500000000000000000008000000200000002A2 -:107A6000000000A000A00084000003080000000047 -:107A700000000000000000000000000000400000C6 -:107A80000000000000000008900000080000000056 -:107A900000000000000000000000000000000000E6 -:107AA000000000040000004000000004000000008E -:107AB00000000000000000000000000000000000C6 -:107AC00000000000000000000000000000000000B6 -:107AD000000000080000000000002000030010006B -:107AE00089000100080000000000000000000010F4 -:107AF0004110004000000000000000000090000065 -:107B000000000000009000000000000000000000E5 -:107B10000000000000000000000000000000000065 -:107B20000000000000000000000000000010000045 -:107B30000000000000000000000000000000000045 -:107B400000000000000000000082000000000000B3 -:107B500000000000000000000000000000004000E5 -:107B60000000080002000000000000000000028881 -:107B700000830411008900000000000000000000E4 -:107B80000000000000000180000000000000000074 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000010C5 -:107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000000000000000B5 -:107BD000000800000000000000000000000000009D -:107BE0000080008800040085001100090005820360 -:107BF00000000800822000000000000000000000DB -:107C000000C0000000000000042000840088008400 -:107C10000000000000000000000000000000030061 -:107C20000000000000000000000000000000000054 -:107C30000000000000000000000000000000000044 -:107C40000000000000000000000000000000000034 -:107C5000000000000000000000004004000200825C -:107C600000040002001000090040000800000000AD -:107C70000000008880000089000000000000000073 -:107C800000000000000000000000000000000000F4 -:107C900000000021000200000008000000000000B9 +:1077400000000000000000000000003C003C0F0FA3 +:1077500055555C5CF0FF00000000F0FC28280F008D +:1077600055000202000F2000020084002100418227 +:10777000850002008800048089058900208040007F +:1077800084002000C00020002000040088002000A9 +:107790002000200020802000200084002000000025 +:1077A00020008800200000032000200084008800C2 +:1077B0000500210000002004200020002000000817 +:1077C0008500110010802100200084008400041036 +:1077D0004108400040002080218004808500400254 +:1077E00000044000200020000000000020000800ED +:1077F000C021200005000000000420082000000433 +:107800000000000000000000090000000900000066 +:10781000000000000000090240000000000000001D +:1078200000004000000021000000000010000000E7 +:107830001000200020004040000040000000000038 +:1078400000002000A0008004200240000000000092 +:10785000008240010000C040410240082120100089 +:107860008001210000020000210082000800820047 +:107870008400040000008800904100000000000027 +:107880000000000002000040840000000000200012 +:1078900000000000000000000000000000000000E8 +:1078A0000010000000000000001000000041000077 +:1078B00002000005004100000000004008000841EF +:1078C000080500100100840089808200900090402B +:1078D000000084000100414190108300008001807D +:1078E000038021C0C0051000404100040000008456 +:1078F000000000A0808820880000000000000088B0 +:1079000000400000200000000200024000080008C3 +:107910000008030800400300000003000300000407 +:107920000084000000000008000809010000008435 +:1079300000040084200400004100008400000000D6 +:10794000000002C00084400020044002400841843E +:107950000000000411402000400002084084412043 +:1079600040204020902005000210800011100008E7 +:1079700000000808000500080000000300000000E7 +:1079800002100008000000000008820000412000F2 +:1079900000030000000000000000000000000000E4 +:1079A00000000000000000000000000004080000CB +:1079B00000000000000800108400840000000000A7 +:1079C000000800000040004000210100414040212B +:1079D000000001000008002100080041100001081B +:1079E000000800000000000200080021002100053E +:1079F00000C000848088000000C00000000000007B +:107A00000000802000000082000041000300000010 +:107A1000000000000000000000000000000800A0BE +:107A20000400110000000000000000000000000041 +:107A3000000000A0000003840000080000004000D7 +:107A4000000000000008000808000000080088008E +:107A50000300000802081100099000020882C0001B +:107A600040824000000808880301080040400500EB +:107A700002080011C021C000000908000009080028 +:107A8000000408000000C0044009000000000000DD +:107A90000841A004000000000800000000000409E4 +:107AA0001004820400000808822100000000000089 +:107AB0000404000000000000000020020004000098 +:107AC00002002000A0004004000482208800A000E2 +:107AD0009104A00801040900001010020341C11123 +:107AE00001114108100482894091101191419102C5 +:107AF00010408311000421000004110041404100A6 +:107B00000000000000000000000020000000000055 +:107B10000000000000000000000000002000000045 +:107B2000200040000000000000000000080000826B +:107B30000800000000000008000008000008000025 +:107B4000000000008308004041C0000000C0214048 +:107B500021004000210102001000004108C12082E4 +:107B600020202040200909822104000411A008845B +:107B700002C0028340A0000482888200000001004D +:107B8000C00000000805000000050800000000001B +:107B900000000008000082000000820000000003D6 +:107BA00000000000002100000000000000080000AC +:107BB0000000000000000000824000000000000003 +:107BC000000000002008000090000000000082007B +:107BD0000000200082000800A003C0418400821140 +:107BE0000204914000830402000520410241400547 +:107BF00084209021020010400001001002000008C3 +:107C000008000000000000102100000800400000F3 +:107C1000000000000000000020000000080000003C +:107C2000000000000900000000000000000000004B +:107C300002400200200000000000000000000000E0 +:107C400000000000000088000002000000000000AA +:107C50000000002004080000830011900282080048 +:107C60002008089008410910400109000800000898 +:107C7000800805000502000003820104000840217D +:107C80000002040200210020000400410005000061 +:107C90000110820500040000000000030000000045 :107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD0000000000000000000000000008900020019 -:107CE0000000018000820080028001C000000000CE -:107CF000000000210000000004100000000003004C -:107D000000000004099000000000000800000000CE -:107D10000000000000000000000000000000000063 -:107D200000000000000000000000000002000082CF -:107D3000000400000000000000000000000000003F -:107D4000000000000000000000000000000008002B -:107D50000000000000000000000000000000100013 -:107D60000000000040020003004000040241000047 -:107D700011002184110200000000800100000000B9 -:107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 +:107CB00000000000000400000000000000000000C0 +:107CC000000000000400000000210000020002008B +:107CD00088000200A000028008000100A004C00586 +:107CE00002404041C00008104080408001200284D2 +:107CF00010C1010210030888A02121032090400038 +:107D00000000020082000000000009100000009046 +:107D1000000008010000000000000000000000005A +:107D2000000000000000000000000040000000848F +:107D300000000000110000000000402000002000B2 +:107D400000000004000000000000000000400000EF +:107D5000000000000000000000020040400000A001 +:107D6000209000C000A0000000880004200220A095 +:107D70000904000420C10390210820C008880441A0 +:107D800082A0002102A1000000010001000100000A +:107D900000000100000000000000000000000000E2 +:107DA000000000000000000000008400000000004F :107DB00000000000000000000000000000000000C3 -:107DC00000000000000000000000000000000000B3 -:107DD00000000000000000000000000000000000A3 -:107DE000100001008800040000C0010508820000A6 -:107DF0000000000000000000C0C0080800208288C9 -:107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 +:107DC0000000000000000000010000019000000021 +:107DD0000000000000000000C00505400083021103 +:107DE00000000100100088004083400482820241AC +:107DF0002003900204081083000102000801000122 +:107E00008091001100088010000900081020000275 +:107E10000000000002000000000000000000000060 +:107E2000000000000000000000000300000000004F :107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 -:107E50000000000000000000000000000000000022 -:107E600000000000400000000000008020900000A2 -:107E70000000000000000000000080800080000082 -:107E80008000000000000000000000000000000072 -:107E900000000000000400000000000000000000DE +:107E40000000000000000000000011110010884137 +:107E5000000300000000000000000041A18205C0F6 +:107E600080C0000040000000000003411182108229 +:107E700080A104C1A021910900A12020A11000022D +:107E8000000300008040800500000080002000000A +:107E90000040800200000010800000000000000090 :107EA00000000000000000000000000000000000D2 :107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 -:107ED00000000000000000000000000000000000A2 -:107EE0000000000002000800850041809000081199 -:107EF0001180912000000000000000000000000040 -:107F00000000000000000000000000000000000071 -:107F1000000000000000000000C0000000000000A1 +:107EC00000000000000000000000000020802000F2 +:107ED00011000000000000000000000020028902E4 +:107EE000044084100000000080000000081110020F +:107EF00089414121040984110502C1A1C180A10564 +:107F00000991892082000485080440840002000150 +:107F100000000001080004008400C0000000000010 :107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000000000000000000021 -:107F600000000000000010001000A10011A011048A -:107F7000C10001A008010000000000000000000096 -:107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 -:107FA00000000000000000000000000000000000D1 -:107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 -:107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000001100030005001068 -:107FF000840300A18401C101000000000000000012 -:1080000090020002008282C0000000000000000018 -:108010000000000000000000000000000000000060 +:107F3000000000000000000000000000A0000000A1 +:107F4000000082000000000000000000000000901F +:107F5000000001000000000000000000000088C0D8 +:107F6000048540C004A04000400002008800A184B5 +:107F7000408540C1410510881082110991A1020875 +:107F800021000040C00041820104A108C14000005E +:107F900000000000000000000200000000000000DF +:107FA00000000000000000000000000000000001D0 +:107FB00000010000000000000000000000000000C0 +:107FC00000000000000000010000000000000000B0 +:107FD000000000000001000100000000000000009F +:107FE00005A011040941C00500890091000401C1E8 +:107FF00005A0A04104200441101105090491C0828C +:1080000000000000010100014100038002808200A5 +:10801000000020000500000000000000000011002A :108020000000000000000000000000000000000050 -:108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:108050000000000000000000000000000000000020 -:108060000000000000000000000000C00008002028 -:10807000118900200082002089110000000000000A -:1080800000000000008000808380000000000000ED -:108090000000000000000000000080090000000057 -:1080A0008000000000000000000000000000000050 +:1080300000040008000300400000000000000000F1 +:10804000000000000000000000010000000000002F +:10805000000000200020414000110000000000004E +:108060000000C1108888A10889C10010000300C168 +:1080700040C1C102210890A089028588080311909F +:1080800089850002400310081141000900020080A8 +:108090008000A10240000200030000000000000078 +:1080A00000000000000000000000000000000000D0 :1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000000000000009008007 -:1080F0000000004085A1A18002800208000000006D -:108100000000000000000008000000000000000067 -:108110000000000000000000000000009000A0002F -:1081200088000800000000000000000000000000BF +:1080C00000000000000000000000000100000000AF +:1080D0000000000002A01111410020020000000079 +:1080E00000000000C1858010218003040010008082 +:1080F00000800000C104892010802004C180881005 +:108100000480820890800980210002038400C082DC +:1081100084020800910104000500A000000000C0D6 +:1081200000A00000000000000000000000000000AF :10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000A06F -:1081700000820008000140C11182C110C10100004D -:1081800000000000000000000000000000000000EF -:10819000000000000000000000000000000000815E -:1081A00000000700000000000000000000000000C8 +:108140000000000000000010008800000001000096 +:1081500000000000000000C001010000000000005D +:10816000000000000000091002A08540840000010A +:10817000000400100000098502418402C100914002 +:10818000090891028301C1A0048290108800810037 +:1081900000E007004811814200E0070000000042B3 +:1081A00000E00700000000000000000000000000E8 :1081B00000000000000000000000000000000000BF :1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000000000008F -:1081F0000081000007040000810000E00000840A04 -:1082000000000000000000000000000007008400E3 -:10821000000000000000000000000000000000005E -:1082200099FF3C3C0000000000000000000000003E +:1081D0000000000000000000000000E0000081003E +:1081E0000000000000000000500000E00700480A06 +:1081F0000000000000000000000000E0070048212F +:10820000000000E007000006000000000000000081 +:108210000000000000000000F3F3F0300000000058 +:10822000000000000000000000000000000000004E :10823000000000000000000000000000000000003E :10824000000000000000000000000000000000002E :10825000000000000000000000000000000000001E :10826000000000000000000000000000000000000E -:1082700000000000000070F0F0F0CB09CF0FC0C08C -:10828000C0C0000000000000000000000000006608 -:10829000C3C100000000000000000000000000005A -:1082A000000099FFFCFC000000000000000000003E +:10827000000000000000FF0F3F3F00000000000072 +:10828000000076307630F7F6F3F0FFFFFF240000B1 +:1082900000000000000000000000C3C30000000058 +:1082A00000000000000000000000000000000000CE :1082B00000000000000000000000000000000000BE :1082C00000000000000000000000000000000000AE :1082D000000000000000000000000000000000009E :1082E000000000000000000000000000000000008E -:1082F0000000000000000000F0F0F0F0CB09FF0FDC -:10830000C0C0C0C00000000000000000000000006D -:108310000066C3C70000000000000000000000006D +:1082F0000000000000000000F0003030000000002E +:1083000000000000FFFF7630E766C3006060FF24D6 +:10831000000000000210200000881084000000000F :10832000000000000000000000000000000000004D :10833000000000000000000000000000000000003D :10834000000000000000000000000000000000002D :10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D -:1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED +:1083600000000000000000000000000000000210FB +:1083700020000088108400000000000000000210AF +:1083800020000088108400000000000000000000B1 :1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD +:1083A000000000000000000000007E663C0C0000A1 :1083B00000000000000000000000000000000000BD :1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D +:1083D00000004242C3C30000000000000000000093 :1083E000000000000000000000000000000000008D -:1083F000000000000000000000000000F000F0009D -:108400000000060083838787000000000000000052 -:108410009F0F00F0000000000000000000000000BE -:10842000000000000000000000000000000000004C +:1083F000000000000000000000000000D313D010B7 +:108400000000000000000000000F666F24FFF4FF72 +:1084100000000000FCFCF6F6000000000000000078 +:1084200000000000000000000000000066660C0C68 :10843000000000000000000000000000000000003C :10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C +:108450000000000042420000000000000000000098 :10846000000000000000000000000000000000000C -:108470000000000000000000000000000000F0808C -:10848000F0000600000000000000000000000000F6 -:108490000000180800F000000000000000000000CC -:1084A000000000000000000000000000003000009C -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000000AC +:108470000000000000000000000000000000DF1FFE +:10848000DC1C00000000000000003C3F7E7F242434 +:10849000F4F4000000000C0C060600610002C00DA0 +:1084A000000000610035800D000000610037000D04 +:1084B00000080000000000000000000000000000B4 +:1084C000000000610006000D000000000000000038 :1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C -:1084F00000000000000000000000000000610036E5 -:10850000000D000000615004C011000100000000D7 -:10851000000000000000500000900000000000007B -:10852000000000000000000000000000000000004B +:1084E0000000000000610001000100000000000029 +:1084F0000000000000610007800500000061000628 +:10850000009D0001006100070009000100610007F3 +:1085100000090000A0610006000D00050000000039 +:10852000000000001000000000000000000000003B :10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B +:1085400000000000000000000000D6FE0000000057 :10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000000FB -:108580000000000080C0C70500000002FF020000DC -:1085900000000000000000000000000000000000DB +:10856000000000000000D010DF1FF808FB0B000027 +:1085700000000000000003032F2FFFFFFFFF00009B +:1085800000003CFCFFFF1F1F5F0F00550055FF055B +:10859000FF140E5E0A5A0000AA0030F3AAAA0000D7 :1085A00000000000000000000000000000000000CB :1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB +:1085C000000000000000000000000000547C0000DB :1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B -:108600000000000000000000C30000000000FF00A8 -:10861000000000000000000000000000000000005A -:10862000000000000000000000000000000000004A +:1085E0000000000000000000D010DF1FF808FB0BA7 +:1085F0000000000000000000030307073030003CCB +:10860000000000003CFC00AA14145500B4B4A0A063 +:10861000050514140454005000080008F0F0F0F0B0 +:10862000CFC30C00000000003030303000000000EC :10863000000000000000000000000000000000003A :10864000000000000000000000000000000000002A :10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A -:1086700000000000000000000000000000000000FA -:1086800000000000000014D70F0C00FF00FFAAFF3D -:10869000AAAA000000000000000000000000000086 -:1086A00000000000000000000000000000000000CA +:10866000000000000000000000000000FFFF5C5F51 +:108670005C5F00000000000000007D3C3D3D503C80 +:10868000FF0000000000000000003D3D7D3CF8F8C8 +:1086900028FF1F14FF14A0BCF0FC0303A0AF3FFF92 +:1086A000FFD7CFC38E000000000005F505050000D0 :1086B00000000000000000000000000000000000BA :1086C00000000000000000000000000000000000AA :1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A -:1086F000000000000000000000000000000000007A -:10870000000000000000000000C30B0800FF00FF95 -:10871000AAFFEAEB000000000000000000000000DB -:108720000000000000000100000000000000000048 -:1087300088000000000000000000000000000000B1 -:108740000000000000000000000000000000000029 -:108750000000000000000008000000000000000011 -:108760000000000000030000000000000000000006 -:1087700000000000000000000000000000000000F9 -:108780000000020002000000000000000002008063 -:108790000000000400040080088021020480010021 -:1087A0000080210420800000040000000000000080 -:1087B00000000000000000000400000000000000B5 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000000004000085 -:1087F000000000000004000400000002000000006F -:108800000002000000400000000200020000000022 -:1088100000020004000000000520801088C18010C4 -:108820002090000410010004000000A184000080DA -:108830000200010000000000020000000000001023 -:1088400000410000000000000000000000000000E7 -:108850000000000000000000020000000000000016 -:108860000000000000000000000000000000000008 -:1088700004000000000000000000000000000000F4 -:1088800000000000000002000200001000000010C4 -:10889000000002000041000001040000000002028C -:1088A00040800000050403040000000800201000C0 -:1088B0000020000002000000000000100000000086 -:1088C0000082000000000000000000400040001096 -:1088D00000000000000000000000000000C00000D8 -:1088E0000008000000000000000000000000000080 -:1088F00000088000000000000000000000000008E8 -:10890000000000080000000000000000000000005F -:10891000000800000000000000002001000000042A -:108920000000801000002001200100000000000075 -:10893000000088000021000000000000000000008E -:108940000021000000050000000000000000000001 -:1089500000080000000000000000000000410000CE -:108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000000F7 -:1089800000000000000000000000000040000000A7 -:1089900000000000200400800000008000000000B3 -:1089A0000002010402000000000890000000000026 -:1089B00000080008000000000000000000000000A7 -:1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000000097 -:1089E0000000000000000000000000000000000087 -:1089F0000000000000000000000000000000000077 -:108A00000000000000000000000000000000000066 -:108A100000000000000000850002002000020000AD -:108A20000084000020A18000000000000000000081 -:108A30000002000200080020004100400040000940 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 -:108A700000000000000500000000000000000000F1 -:108A80000000000000000000902100000000000035 -:108A90000000000000040009820440000000000003 -:108AA000001100050000410400400004000000889F -:108AB00000041190200000000001009000000382DB -:108AC00000000000000000000000208402400000C0 -:108AD000000000000000000000000000000008008E -:108AE00000002000000000000088000000000000DE -:108AF0000000000000000000000000000000000076 -:108B00000000000000000000000000A000000000C5 -:108B1000000000000000000000000004808400004D -:108B20000000009040000000C009020000010000A9 -:108B300000050001820282080000000000410000E0 -:108B4000000000000000000800000000000000001D +:1086E0000000000000000000000000003C0F3C0FF4 +:1086F00050535053000000000000000055000505D5 +:10870000503C00000000000000000000050555007E +:10871000282828281F141414A0BC003CF3F3A0AF91 +:1087200003FFFFD784000400000020002000200089 +:1087300000002084888040004000210820000000C4 +:10874000000403802100200000002000020020001F +:1087500000008800210020002008040420020000FE +:108760000400200000030000000084002005040035 +:10877000202084040000C08020884004200420823F +:10878000C0902084200400000000000804002000A5 +:108790000080888284838800880004004000208054 +:1087A0000200200020040000200000000000000063 +:1087B00000000000802000100000000020000000E9 +:1087C0000000000020022000000000000000200047 +:1087D0000200000000404000000004000001000012 +:1087E00004000090040000000000000010001000D1 +:1087F00010000001000000000020402000400000A8 +:1088000004044004000400014000400020048000F3 +:108810000000000400042104200041024100800007 +:108820000020900041000040000000000000000017 +:1088300000000400000000000000840004000000AC +:108840000000000000000000000002000000000026 +:108850000000000004000000000000000000000014 +:108860000080004000000000000000000000000048 +:10887000000000030820000000009000000000C17C +:1088800000000010000090000000820801000400B9 +:10889000010002000000000088000400A100021096 +:1088A00082210021004100050009000800000400A9 +:1088B0000000000800000900050805000084801081 +:1088C0000000000800080000001000080008000474 +:1088D00000100084000000040010000002100000DE +:1088E0000040041000840000008800000008020816 +:1088F00000000004000009850010030000000000D3 +:1089000000202040000000C0000011840904044041 +:1089100002840200000202020008048800084010DD +:1089200000000982020000840000008200000008AC +:10893000000000080000000000000000000000002F +:10894000040000050000000000009000000000216D +:1089500000000000000000080000000000000040CF +:1089600000000000400588000000000800004040B2 +:108970000409000800410040000800000000000851 +:10898000004000000020200000030000820008805A +:1089900020089000080800418304000000088204B9 +:1089A00000040005080020002021200388080000A2 +:1089B000210000080000000000000000000000008E +:1089C000000880000300000000A00000000000007C +:1089D000000000000008000000000000000000008F +:1089E0000000000000008000000000000000000007 +:1089F00008000882000000002100000000000000C4 +:108A00000300000000000021900000002000000092 +:108A1000801000C00302850009000484009000203B +:108A20000311210408A02008A11011A003A0110027 +:108A30000409001100008221002000020000000251 +:108A4000000000040011000500050000000408807B +:108A500000000000000500000011000000400000C0 +:108A60000000000000000040000002200009000992 +:108A700000004000000000000000080004000000AA +:108A800008000800000008000004000304000400BF +:108A900020000902C1020020090200C10441C041B6 +:108AA0002005A021C120C10204A000030802C000CB +:108AB00084000000000000880000030000000000A7 +:108AC0001100000000000000000002000000000093 +:108AD0000004000000000000020020000000000070 +:108AE00008000004004000000008009000004182DF +:108AF00002100000080000000000090009008000CA +:108B000020000008000000000000004000400200BB +:108B100009000900824010002185400041202110F9 +:108B20002084000020902000200000410488009054 +:108B30000988419000410000000000000000000092 +:108B40008200000000000000000090000000000013 :108B50000000000000000000000000000000000015 -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B800000000000000000000000000000000000E5 -:108B90000000000000000000900000000080008045 -:108BA0000080000001000100000290A0008004008D -:108BB00000000000000000000000000000000000B5 -:108BC000000000000000000000000000000800009D +:108B600000000000000000000000080000000008F5 +:108B700000000005000000000021000000000008C7 +:108B8000000000080000000502000000000882004C +:108B9000820810000008C105020502108810A00814 +:108BA000080008C08500C009000420098821904001 +:108BB00000100008000000000000210000840000F8 +:108BC000000000080000000000000000000000009D :108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000000000000000075 -:108C00000000000000000000000000000000000064 -:108C1000000000000000000000000000000400044C -:108C200011020002000020000400000000020020E9 -:108C300000A000820000400200000080002100002F -:108C40000011000000000010000000000000000003 -:108C500000000000000000000021000000000000F3 -:108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 -:108C800000000000004100000000000000000000A3 -:108C900000000000000000000000000000000000D4 -:108CA00000008800000000000004010800000084AB -:108CB000402000080000020000050004022000001F -:108CC0000000000000000082000100000020000001 -:108CD0000000000000000000020000000000000092 -:108CE000000000000000000000000000202009003B -:108CF00009880000000000000000000000000000E3 -:108D00000000000000000000000000000000000063 -:108D1000000000080000000000002010000000001B -:108D20001100008800000000000000011000000099 -:108D30000003000104A0000400A0004085A00090F2 -:108D4000008290840000000000000000000000008D -:108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000000E3 -:108D900000000000000000000000000000000000D3 -:108DA00000008800000000008501C000000011C024 -:108DB000000401A0840401010100000100012080E1 -:108DC00000800000800000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE0000000000000000000000000000000000083 -:108DF0000000000000000000000000000000000073 -:108E00000000000000000000000000000000000062 -:108E10000000000000000000000000000000000052 -:108E200000000200000000000020212100090011C4 -:108E30000280000041800000114103210010000861 -:108E40008000002180808000800000000000800001 +:108BE0000800000800000000004000000000000035 +:108BF0000000000000020000000000000000000073 +:108C000021C000000000000000C0000000000000C3 +:108C10000002000000100010088480108421212030 +:108C2000111003A0002004000010088989A005404D +:108C300040A00508090000080000000000009000A6 +:108C40008800000000000420000000000000200454 +:108C50000000000000000008000400000004000004 +:108C600000000000001020000000000000000000D4 +:108C7000004100000000000000000821000000008A +:108C800000030000000000000000040400000000D9 +:108C9000000000214021900088008811050000029A +:108CA0000000C01184088809000041004008010844 +:108CB0008804100800411008402111000004000041 +:108CC0000000000000400000000000000000000064 +:108CD0002000000000000000000002000000000072 +:108CE0000000200000400000000000040000098295 +:108CF00040020040000000000000000000000000F2 +:108D0000000000880000002000000010001000009B +:108D100020002002000020000082008200A08804C1 +:108D2000009000904004410200400210828840C040 +:108D3000088211110904034002040304000000002A +:108D4000000000000000000000000000040000001F +:108D50000100040000000100890000000000000084 +:108D60000000000000000000000000000001000101 +:108D70008901000000000000000100000000000068 +:108D8000000000000000000800040000000090083F +:108D90009008008210100000000001000000A1C037 +:108DA000012040A0040000009090029082039001F6 +:108DB000C001820100001000080001000400000052 +:108DC00000000000000000000000400000008000E3 +:108DD0000000040080000000040004000000000007 +:108DE0000000090000000000000000000000000278 +:108DF0000410040200050009000200200000000029 +:108E000000000000000000000080000000000000E2 +:108E1000008080800080808000000000040000004E +:108E2000A18040808080000000008202000891083C +:108E3000030209058440000980000000030080004F +:108E400000000000000000000000000000000080A2 :108E50000000000000000000000000000000000012 -:108E60000000000000000000000000000000000002 -:108E700000000000000000000000000000000000F2 +:108E600000100000000000000000000000000000F2 +:108E700002000800040004020000000000000000DE :108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000108021002040B1 -:108EB0004103850041201011C1002000410011082C -:108EC000058508001000A01004000200000000004A -:108ED000C0000000000000000000000000000000D2 -:108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 -:108F000000000000000000000000008400000000DD -:108F10000000000000000000000000000000000051 -:108F2000000000000000000000000000000201003E -:108F300001010101080088010083094000200000B0 -:108F40000101000404A000820082900800000000DB -:108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F900000000000000000000000000000000000D1 -:108FA00000000000000000010001000000010001BD -:108FB000010001010101A0840082A005A089000038 -:108FC000000001010001000000000000008000001E -:108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 -:108FF0000000000000000000000000000000000071 -:109000000000000000000000000000000000000060 -:109010000000000000000000000000000000000050 -:1090200000000000000000000040000400020011E9 -:109030000008102108201140008400C18008C040B1 -:10904000002010000905101100020010008000002F -:109050000000000000800000000000000000000090 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000090000D7 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B00000000989020010001184800900210000CD -:1090C0008040030011110300111104018284008209 -:1090D0008400000000C0000200000000000000004A -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:109130000000000000C100000000000990C1A00272 -:109140000002880000000100010001010081000010 -:109150000700000000000000000000000000000008 -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF +:108E90000000800080090000800000090000000937 +:108EA00000000000000000800000410004110811D3 +:108EB0009040110402008905208900098000800487 +:108EC00000000000000000000000000000000000A2 +:108ED0000008000000000008000000000000000082 +:108EE0000000000100000000000000000000000081 +:108EF00000000010010000000100000000000088D8 +:108F00000000000000000000000000000000000061 +:108F100000000000080008000802900000000000A7 +:108F20000000000090000484841084000010900071 +:108F30009091900085C090004000850204004000A0 +:108F4000A000A000000000000000000000000000E1 +:108F5000000000000002004090A00100000100009D +:108F60000000000100000000000000000000000000 +:108F700000000000000001000001000000000100EE +:108F800000000000000000000000000000001000D1 +:108F90000000000004001008000800909008000085 +:108FA000100000000000408900880800C0C1904007 +:108FB00000909089C18400408402A04001C000025A +:108FC0000004000400020000000000000000000097 +:108FD0000000000005000080008080000400000404 +:108FE000000300090502000000000000000000006E +:108FF000000000000000001111020021000200002A +:109000000800410000000000000000000000000017 +:1090100080000000000000008080008000800300CD +:10902000000080000000040000200080800480C157 +:1090300080841108090591880004104189904184B9 +:109040000980008000000000000000000000000017 +:1090500000000020000000000000000000000000F0 +:1090600000090000000000000004000000000000F3 +:1090700000000000000000000900100020000802AD +:1090800000020000000000000000000000000000DE +:10909000000000000011000000008011808080802E +:1090A00000000005000000000000800400828080B5 +:1090B00080002111112083911011100920800900D6 +:1090C000110900080021000000000000000000005D +:1090D0000000000000010000000000008400C0004B +:1090E00090000000000000000000000100000000EF +:1090F000000000000000000000000002000000006E +:1091000001000200A000A00000000000000000001C +:1091100000000000000000000000000008012082A4 +:10912000101002000000000000000000C0018404D4 +:1091300040021000918911884091000000C0011088 +:109140000040010000000088001000000000000046 +:1091500000000000000000E007000000000000E048 +:1091600007000000810000E000000000810000E036 +:10917000000000000000000000000000000000E00F :1091800000000000000000000000000000000000DF -:1091900000000700000000000000000000000000C8 -:1091A00000000000000000000000000000000000BF -:1091B00000E000000000820000E000008400884120 -:1091C00000E007000081000000E00000000000AAAD -:1091D00082AAFFA0FFFF00000000000000000000C6 -:1091E000000000000000000000000000000000007F +:1091900000000000000000000000070000000000C8 +:1091A000000007000000810000E000000000000057 +:1091B000000007000082000000E00700001100002E +:1091C00000E007000041000A00E007000000000086 +:1091D0000000000000000000000000000000AC00E3 +:1091E000AC0080A880A80000000000000000000083 :1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E +:109200000000000000000A000A0F0000000000003B :10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E -:10924000AABEFFFF000100000000000000000000B7 -:1092500000AA00AAA0A0A8A800000000000000002A -:1092600000000000000000000000000000000000FE +:10922000BCFFBCBCA0E3FFFF00000000000000008A +:1092300008FB0C0C7070505050FA55FFC0FCC3FF77 +:1092400000000000C0FCE8E8000000005F0A828225 +:10925000000000000000000000000000000000000E +:10926000AC00AC00808080800000000000000000A6 :1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE +:1092800000000000000000000A000A0F00000000BB :1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE -:1092C0000000003C557D0000000000000000000090 -:1092D0000000AAAAA200FF00FB000000000000009E -:1092E00041410000000000000000000000000000FC +:1092A0000000A0FFA0A0A0E3A0E3000000000000D9 +:1092B000000008FB0C0CF2F2505050FA00AA003CDF +:1092C000033F00000000C0FCE8E8000000005F0A67 +:1092D000D7D70000000000000000000000000000E0 +:1092E000000000000000000000000000000000007E :1092F000000000000000000000000000000000006E :10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:1093400000000000030341000000000000000000D6 -:1093500000000000AAAAA000FF00FF00000000001B -:1093600055554141000000000000000000000000D1 +:10931000000000000000000000000000FFFFFF55FB +:10932000000000007D3C7F3FDFD75F55000000005C +:10933000000000005F0FFF0F500F503FFC5CFC5C13 +:1093400055FF550F00000000000000040000000061 +:1093500020250005000000000000000000000000C3 +:1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED :1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD -:1093C000000000000000000000008F8F828200007B -:1093D000000000000000000000300000000000005D -:1093E0000000000000050000000000000000000078 -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C -:10941000000000000000000000000008000000A0A4 -:10942000000000000000000000000000000000003C -:1094300000000000000000000061000600090000BC -:1094400000610006C009000000615037C00501A09E -:1094500000210000000100000000000000000000EA +:10939000000000000000000000000000000000AA23 +:1093A00000000000000055005F0FCFC30F00000059 +:1093B0000000000000005F0F0F0F500050300C5CE9 +:1093C0000C5C55F055000000000005050505000087 +:1093D000000000000000000000000000000000612C +:1093E000000F000D00A000610007000D00000061EB +:1093F0000007800D200000650007800D00000000C0 +:10940000000000000000006100050009000000618C +:109410000006000D00000000000000000000000039 +:109420000000000800000000000000000000000034 +:1094300000610007800D0000A0615A0E059D00012B +:109440000061000C0001000000614007009D000069 +:109450000571002F000D0001000000000000000059 :1094600000000000000000000000000000000000FC :1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC +:109480000000000000000000FF30FF00505F303F90 :1094900000000000000000000000000000000000CC :1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000003C3C34 -:1094C000FFFF00200000F0F8F0FA00000000FF0F9E -:1094D000C303872DAF05C3FF003C00000000000060 +:1094B0000000000000000000000000000000AAFF03 +:1094C000287DAA08FFFFA0E3FFFF03F303F3FFFCDF +:1094D000FFFC000000000000000000000000000091 :1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B +:1094F000000000000000AAE8F0E800000000000002 +:1095000000000000000000000000FF04FF04505FA6 +:10951000000F00000000000000000000000000003C :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B -:109540003E3C3EFF00000000F8FAF8FA0000000080 -:10955000FF0FC303AF05AF05003CC3FF00000000D1 +:109540000055287DAA00FFFFA0E3A0E30A0AFAFA6B +:10955000FFFF7DFF00000000000000000000000091 :1095600000000000000000000000000000000000FB :1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB +:109580000000000000000000000000005F005C5CC4 +:10959000145514005F500F00000000000000000090 :1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB -:1095C0000000000000008000C000FFEBF05F000022 -:1095D0000000AAFA000FCF0CD7D730F3B271000009 +:1095C000000000000000F3F3F3F3AEAEAEFF003C8A +:1095D000C3FFAF8205820000000000000000000011 :1095E000000000000000000000000000000000007B :1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A +:1096000000000000000000000000000000005F00FB +:109610005C5C1E551E005050000000000000000061 :10962000000000000000000000000000000000003A :10963000000000000000000000000000000000002A -:109640000000000000000000C000C0000000F05F4B -:1096500000000000AAFE000FCF0C141430F3B2710A -:109660000000000000000000880000000000000072 -:10967000000000000000000000000000000000806A -:1096800000000000000000000000000000000000DA -:10969000000000000000000000000000000000804A -:1096A00000030000000000000000000000000004B3 -:1096B00000000000000000000000008041800180E8 -:1096C00011840000000000000000001100001000E4 -:1096D00040009000A00000000000900020801004D6 -:1096E00041800000000000000000000000000000B9 -:1096F000000000000000000000000000000000006A -:109700000004400000000000000000000000000015 -:109710000000000000000000000000000000000049 -:1097200000040000400000000000000000000000F5 -:109730000000000000000082000000000040A010B7 -:109740000808A00240020002000010000002000011 -:109750000002000000000000400000000000A00225 -:109760004040A008000000000000000000000000D1 -:1097700000000000A00900008200000000000000BE +:109640000000000000000000A2F3A2F30C0C0CFFCD +:10965000B2B2B2B2AFD705D70000000000000000E0 +:1096600020000000000000000000000000000000DA +:1096700000000008000000000000040000002100BD +:1096800084000000000400000400000000008400CA +:1096900000000000000084000000400000802180E5 +:1096A00000032000000284000003840888000000FA +:1096B00004000008001000002004000004008900DD +:1096C000838420000000110411040400200205021C +:1096D000830005880100110205020300050505004D +:1096E00004800000000000000000410000000000B5 +:1096F0000000000000000000000000000000000466 +:1097000020004000000000000000000041000004B4 +:10971000000000000000000400000000009040086D +:1097200010020000400000000000000000000000E7 +:1097300000C0200040000040000004004000200065 +:1097400010404004C0000000C00088002000040059 +:109750002000400210102000A000400088000202FB +:1097600020C0000400000000000082000000000093 +:1097700000000000000000000000000000000000E9 :1097800000000000000000000000000000000000D9 :1097900000000000000000000000000000000000C9 -:1097A00000050000000000000000000000000000B4 +:1097A00000000000000000000000000000100000A9 :1097B00000000000000000000000000000000000A9 -:1097C0000000000000000009000000000009000087 -:1097D0000000000000000000000000000000000881 -:1097E0000000020000411184000000080000000099 -:1097F0000000000000000000008800C00000000021 -:109800000000008400840000000000080000000048 -:10981000000000000000000000000084000000A024 -:109820000000000000100000000000000008000020 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000084000094 -:109850000000000000000000000000000084000084 -:1098600000000002000000041021000000000000C1 -:1098700000000000000000000021000000080000BF -:1098800000000000000000000010000000000000C8 -:109890000000000000050041000000000000000082 -:1098A00000000000000000000000000000000010A8 -:1098B0000000000000000010000000100000000088 -:1098C000000000000000000000218421842100002D -:1098D000202120030000C000002100030021000817 -:1098E000000200004000890008110000000200A0F2 -:1098F0000000000400400000000000000000000024 -:10990000000000000000000000080000000000004F -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 -:10994000000000000000000000000000090000000E -:10995000000000000000000000100284050000006C -:1099600000020008090000900800000000400011FB -:10997000001100400000000400400011000300003E -:10998000C0050005000000000000000040000000CD -:109990008200000000000000000000000000000045 -:1099A00000000000000000000000000000000000B7 -:1099B0000000000000000000000000000041000066 -:1099C0000000000000000000000000000000000097 -:1099D0000000000000000000000000000010000077 -:1099E00000000000000002020011100000000488C6 -:1099F00002200400000040000084040000000084F5 -:109A000000000000000000040000008800000000CA -:109A10000000000000000000000000000040000006 -:109A20000000000000000000000000000000000036 +:1097C0000000000000000900000005090800110069 +:1097D000210008000500000000000000000000005B +:1097E000000000210400000000000000000800004C +:1097F00000000010030800000000000000840000CA +:109800000000000800080000000000000008000040 +:109810000000000004100000000400000000000030 +:1098200000000008000800000000000000000088A0 +:10983000000000000000000002840000000000841E +:1098400000080008008800088200000820000010BE +:10985000820290080000880009100000000000004B +:1098600000080082000002820000000000000000EA +:1098700000000000000000000000000000000000E8 +:1098800000000000000000000000000000000010C8 +:109890000000000000000000001000030000002194 +:1098A0000010000000212010000000000010000047 +:1098B000000500000008C0210000000000000000BA +:1098C00000000000000020100500000801A10000B9 +:1098D000000800000500040021008800040885033A +:1098E000014010214110C1001110000000000000D3 +:1098F0000000000000000000000000000000000068 +:109900000000000000000000000000000000000057 +:109910000000000000000000110000000000000036 +:109920000010000000A00000800000000000000007 +:1099300000000002080000000000000000C010004D +:1099400000000000000000000000100000C04010F7 +:109950004100210000848200A108821000008310D1 +:10996000400808A0C18220C01088C0A082008200E8 +:1099700082008200000000000000000000000000E3 +:1099800000040004000000000000020008000000C5 +:1099900000009000000000002000820040008800CD +:1099A0009000820000000800820004000000040013 +:1099B000000000000000880000008400000000009B +:1099C000880040000200820004000000000009043A +:1099D00004000011000040000004100008112000E5 +:1099E00003004000000082200802040083202000C1 +:1099F000200000001104210020000090200400003D +:109A0000210000000040000000000082000400006F +:109A10000000000000000000000000000000000046 +:109A20000000000000000082042000000000000090 :109A30000000000000000000000000000000000026 -:109A400009000000000000000000000000000010FD -:109A50000000008800000040000000000000000836 -:109A600004000000000000008000000080001100E1 -:109A70000000000000410000000000050000A00000 -:109A800000000000000000000000000000000021B5 -:109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000010A6 -:109AB00000000000000000000000000000000000A6 -:109AC0000000000000000008000000000208000084 -:109AD0000008001000000005A000000000000000C9 -:109AE0000002000000000000001000000220000042 -:109AF0000020000000001000000000000000000036 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B40000000000000000000000000000000000015 -:109B50000000000000C00088000000200400008811 -:109B6000000000400010000800C0009000900500B8 -:109B70000002000000000000000004008200000558 -:109B8000000000000000004100000000000800008C -:109B90000021000800000000000000000800000094 -:109BA00000000200000000000004000000020000AD -:109BB00000000000000000000000000000000000A5 -:109BC0000000000000000000000000000000000590 -:109BD0000000000010000003000000000010000062 -:109BE0000000004100000000000000000011000023 -:109BF00008000000000000000020049005000000A4 -:109C0000400400000000040000000000000000000C -:109C10000000000000000000000000000000000044 -:109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 +:109A400000000000000000000000001020000000E6 +:109A5000400080000000000000C041008000004085 +:109A6000C088C00020880000000090C080000890DE +:109A7000000000000000000000000000A00008003E +:109A800000000000000400000000000000000000D2 +:109A900000000021000000000000000000000000A5 +:109AA0000000000000000000000800050000820027 +:109AB0000000820000008200A008000000000000FA +:109AC0000000000000000000000000000011000085 +:109AD000080000800000092100000010A010000014 +:109AE000904000A1A0050121840088210888A000E1 +:109AF00000800000000000000000000000000000E6 +:109B0000000000000000000000C000000000000095 +:109B1000208800000000000011000000000000008C +:109B2000000003080084000000082000000000027C +:109B30000000000000000000001000000000000015 +:109B400000000000000000002000090000000000EC +:109B50000000000000080082028211A00840038972 +:109B600002084084030205400202080200000208C5 +:109B700003880020200000000800200000000800EA +:109B80008200000000000000000000000000000053 +:109B90000000000000000000000090000000000035 +:109BA000000000000000000000000020004000084D +:109BB00000000800000000008208C00082020200CD +:109BC000C000000000020000000000000004884106 +:109BD0000000000008009000400004802000820483 +:109BE00040210009000204402021041090080011C7 +:109BF0004005081108094000040009001104000094 +:109C00000000099021000000000000884040000092 +:109C10000000000000002000000000000000000024 +:109C200000000400000000000000000000C0000070 +:109C30000000000000000000000000000000200004 :109C40000000000000000000000000000000000014 -:109C500000900000000000C00000000000000000B4 -:109C600000000000000000000000001000001100D3 -:109C70000090A090400440000000000000000000A0 -:109C800000000000000000000000000000080000CC +:109C500000000000000002000000009080100000E2 +:109C60000000800004200020040140009000050056 +:109C70002102808404100920000000000000000080 +:109C80000000000000000000000000000090000044 :109C900000000000000000000000000000000000C4 -:109CA000000000000000000001000100008400002E -:109CB00000000000000000000000000000000000A4 -:109CC000000000000000000000000000000000C0D4 -:109CD0000000000000000188840000000000000077 -:109CE000000000000000000000000001000000C0B3 -:109CF0000000000000000010C00000000000000094 -:109D000000000000000000000000000510000080BE +:109CA00000000400000100A0000001000088101066 +:109CB00000000000000100000000000000000000A3 +:109CC000000000000000000100020000030000A0EE +:109CD00082100000000000010000010100000000EF +:109CE000C109000108000110A0820900A0010010B4 +:109CF00082040001A00100A0840000000000000018 +:109D00000000000000000000000008110500000035 :109D10000000000000000000000000000000000043 -:109D20000000000000000000000004050300000027 -:109D30000000000000000000000000000000000023 -:109D400000000000000000000000000011411100B0 -:109D50000080000000000000200000000000000063 -:109D600000000000000000000000000000101000D3 -:109D70000080000000000000110000000000090049 -:109D80000000000000000000000000004000828091 -:109D90000000008000000000000000410000020000 -:109DA00000000000000000000000000020002180F2 -:109DB0000000008000000000000000020000000021 -:109DC0000200000000000000000000000000090088 -:109DD0002100000800000000000000000009000051 -:109DE0004000000000000000000000000000100023 -:109DF0000300000000000000000000000040000020 -:109E000000000000000000000000000000008900C9 -:109E100010820084C00884000000000000010000DF -:109E200001000000000000000000000000004100F0 -:109E3000C01000A0C004840000000000000000006A -:109E40000000000000000000000000000000000012 -:109E50000200108800010000020000000000000065 -:109E600000000100000000000000000000000000F1 -:109E7000020089080000000210000000000000013C +:109D20000002000000000003090000090800000014 +:109D30008000000000000041000000000000000062 +:109D4000000000090000000000100980000520004C +:109D50000000800000000000004100004140092197 +:109D6000000002C10208801002110080C11102032C +:109D7000008080000920004009110000000005005B +:109D800000000000000000000000000002009080C1 +:109D90000080000000000000000000110000020030 +:109DA000000000000000040000004000020010005D +:109DB000000004000000000000008004000000001B +:109DC000400000000000000005000000400002000C +:109DD0008400000008000000000000008010050062 +:109DE00011030000000020054141008000404108AF +:109DF000804000030900C000844100C180030000CE +:109E00000000000000000000000000000000410011 +:109E1000210200024000900000000000000000004D +:109E2000000000000000000000000000010004002D +:109E3000C00400000100C00000000000C0010000DC +:109E40000000010000000000000000000000010010 +:109E5000050004C000000100A00000000000C000D8 +:109E600000000001008200400100010100400001EB +:109E700004110803000000844100210100111001B9 :109E800000000000000000000000000000000000D2 -:109E900000080000000000000000000000000000BA -:109EA00000000000000000000000000000000000B2 -:109EB000000800000000000000000000000000009A +:109E900000200000000000000000000000000000A2 +:109EA00000000000000000000000000000010401AC +:109EB000008400000000000000000000000100001D :109EC0000000000000000000000000000000000092 -:109ED000000000020000100000000000000001006F -:109EE0000000000000000000000000000000000072 -:109EF0000000001000001000000000000000000042 +:109ED000040000400000000000000000000000013D +:109EE0000000008800018220000000000001014005 +:109EF000100000880000C084010000000000000085 :109F00000000000000000000000000000000000051 -:109F100000000080000000000000000000000000C1 -:109F20000000000000000000000000000000000031 -:109F300000000080000000000000000000000000A1 +:109F10000000000000000000000000000000000041 +:109F2000000000000000000000000000000000042D +:109F30008004000000000400000000000000004158 :109F40000000000000000000000000000000000011 -:109F50000000000000000000800000000000000081 -:109F600003000000000000000000000000000000EE -:109F700000000000008000008000000000000000E1 -:109F800002000000000080000091000000000000BE -:109F900000000000004180000002000000000000FE -:109FA000000000000000000200830000000000002C -:109FB000000000000041000000020000000000005E -:109FC0000000000000000002800000C1000000004E -:109FD00000000000000000C10000000000000002BE -:109FE0000011800010830040800000C100000000CC -:109FF00000000000000000C100000000000000049C -:10A00000000980002083000008000010000000000C -:10A010000000000000000005020000010000000038 -:10A02000000000000000000082010083000000002A -:10A0300000000000000000A140000001000000003E -:10A0400000000000000000000000200000400000B0 -:10A0500000000000000000000041020000000000BD -:10A06000000000004000001000012000004000003F -:10A07000000000000000000000410200000000009D -:10A08000000000004000018200000000000000000D +:109F500000408040000000001100000000000000F0 +:109F60000041000000000008C0090000000000409F +:109F700004898200000500044189410000000005B9 +:109F80004111000000008005008300000000000077 +:109F9000000000000041000000050000000000007B +:109FA000000000000002800000C1000000028000EC +:109FB00040000000004100000004000000000040DC +:109FC0000000098800000040800000C1000000047B +:109FD00080000500000000C1000000040000000037 +:109FE0000000000011104191800400C100001040E9 +:109FF000000211C10383410400000080000004043A +:10A00000004180041185000004000083000000006E +:10A0100000000000000000414000000000000000BF +:10A0200000000000000000002000004000000000D0 +:10A0300020000200000000A102000001000000005A +:10A04000000100000083000000012000004000002B +:10A05000000120000200000000098400000100004F +:10A0600000000000000000C0400820008440000004 +:10A070000101200188850005041100C004C0000012 +:10A0800000010001828400050000000000000000C3 :10A090000000000000000000810000E00000480017 -:10A0A000000000000000000A0000000000000000A6 -:10A0B0000000000000000000810000E000004800F7 +:10A0A00000000000000000000000000000000000B0 +:10A0B0000000000000000000811200E007004800DE :10A0C0000000000000000000000000000000000090 -:10A0D00000000000000000000000810000E000001F +:10A0D00000000000000000000000811200E0070006 :10A0E0004800000000000000000000000000000028 -:10A0F00000000000000000000000810000E00000FF -:10A100004800000000000000000000000000000007 +:10A0F00048000000000000004842881200E007000D +:10A10000484200000000000048420000000000003B :10A11000000000000000000000000000000000003F :10A12000000000000000000000000000000000002F :10A13000000000000000000000000000000000001F @@ -125503,210 +125503,210 @@ :10A1F000000000000000000000000000000000005F :10A200000000000000000000000000000000747B5F :10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000DE2E747B33 +:10A22000000000000000000000000000DE2E257B82 :10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000DE2E000002 -:10A25000747B00000000000000000000000000000F -:10A260000000000000000000000000000000DE2EE2 -:10A27000747B0000000000000000000000000000EF -:10A280000000000000000000000000000000DE2EC2 +:10A24000000000000000000000000000DEA400008C +:10A25000257B00000000000000000000000000005E +:10A260000000000000000000000000000000DEA46C +:10A27000757B0000000000000000000000000000EE +:10A280000000000000000000000000000000DEAE42 :10A29000615603400000000000000230A0000000F2 :10A2A000000000000C4000000000000002C06A86B0 -:10A2B000615603400000000000000230A0000000D2 -:10A2C000000000000C4000000000000002C06A8690 -:10A2D000000061F603400000000000000231E000D1 +:10A2B000612603400000000000000230A000000002 +:10A2C000000000000C4000000000000002C0648696 +:10A2D0000000612603400000000000000230A000E2 :10A2E0000000000000000C4000000000000002C060 -:10A2F0006F8661F603400000000000000231E000BC +:10A2F000648660DE034000000000000002300000C1 :10A300000000000000000C4000000000000002C03F -:10A310006F860000200000000000000020002000E8 -:10A3200020002000000020002000000000000000AD -:10A3300000000000200000000000000020000000DD -:10A34000000000000000000000000000000000000D -:10A3500000000002000000000000000000000000FB -:10A3600000000180000000000204400000000080A6 -:10A370000084002000000000000000000000000039 -:10A3800000008200000000002000000084000004A3 -:10A39000008800080000000000000000000000002D -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D +:10A310007B06000001002100040000000000040092 +:10A3200020800000000004002080200000000000C9 +:10A330000004050000002000208000000000200430 +:10A34000000000000000200420000000000088033E +:10A350000000000320008588218021800000890002 +:10A360002100008000100000000000040004040030 +:10A370000004040000040008020420048580048016 +:10A3800021048800410440000020888084000000EF +:10A3900084040200000040004000000000000000B3 +:10A3A00000000002000000000000000400000000A7 +:10A3B0000000000004000000000000040000000095 :10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E0000000000010020000000000008004008453 -:10A3F000004000020001000000000000000000001A -:10A4000000000000000000000090000000000000BC -:10A4100040010005000100009040000010100809F4 -:10A420000000000000409000000000090000000053 -:10A4300000000000000000000000000000400000DC -:10A4400000000000004000000000000000000000CC -:10A45000000000000000000000008200000000007A -:10A46000000000000080000000000000020000006A -:10A4700001000100000040080005000802410082C0 -:10A480000000000000000000004100000000820009 -:10A490008405000400080000000000000000000027 -:10A4A0000010000000080008008800000000000004 -:10A4B0000000000000000000000000000000008814 -:10A4C000000000000008000800000000000000007C -:10A4D000000000000000000000000000000000007C -:10A4E0000000000000000002000800000000000062 -:10A4F000000040004000000080000000000100005B -:10A5000000030000000000000008000000000390AD -:10A51000000000000001000100C000000003000076 -:10A520000000000000000005000000000000000026 -:10A53000000000000000000000000000000000001B -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000000000FB -:10A5600000000000000000000000000000000000EB -:10A5700000000000004000100005900300000000F3 -:10A58000000040000021001000100005000200083B -:10A5900000000010010410000008900000000000FE -:10A5A00000000000000000040000000000000000A7 -:10A5B0000000000000820000000000000000000019 -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E000000000000000000000000000000000006B -:10A5F0000000000000000982094000000000000087 -:10A600000000000080C00300000000A000840000E3 -:10A6100009000000002020838000000200200004C8 -:10A620000009001100000000000000000000000010 -:10A63000000000000000000000000000000000001A -:10A6400000000000000000000000080008000800F2 -:10A6500000000800080000000000820082000000E6 -:10A660008200000000000000400000000000000028 -:10A67000000000000010000002C000000100000007 -:10A680000000000000000000820000000000000048 -:10A69000000000400011020001090010020404083B -:10A6A000200420000004009000042000009000001E -:10A6B00000020000000200880000002000000000EE -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000088084000000005E -:10A6F00000840284000000840084800900A040A03F -:10A700000000000000000000414000000008004080 -:10A710000000004000001104000008880091C1847E -:10A720000991000000000000000800410000000046 -:10A730000000000000000000000000000000000019 -:10A7400000000000000000000041000000000000C8 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000008008200820000000800D5 -:10A770000000000000030000000000410200000093 -:10A780000000001000000008000801400000000068 -:10A7900000000000000000000008080000000000A9 -:10A7A0000000010000000000000000000010000098 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F00000000000000000000002000800008000CF -:10A800000000000000C00000000000084000000040 -:10A81000000000A0000000000088000040000300CD -:10A8200011000000200000000000000900000000EE -:10A8300000000000000000000000002000000000F8 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000010000000000002C6 -:10A88000001100A109900008000000210010002123 -:10A890000000000000000000000000802000000810 -:10A8A00001040080A0800200400041000800200058 -:10A8B0001102050240042004000000000000110005 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F000000800820000000000000084000000004A -:10A90000208500000040C00300000000000000009F -:10A91000000000000000000000820208000202089F -:10A9200000A008000008210409A0000000000000A9 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 +:10A3D0000000000000000000100420082002040219 +:10A3E0000202040000204002400000400000000083 +:10A3F0000000000000040000000000000000040451 +:10A40000800404910000040200C00201002000004A +:10A410000504000000000000000000000000000033 +:10A4200000000000040000000000000900000041DE +:10A430008400000000400000020000000040000016 +:10A4400000000000000091200020002000200000FB +:10A450000010000000000000000084000000000068 +:10A4600001000002000000000000000000000000E9 +:10A4700000000000000002000000000000000000DA +:10A480000000000001000080000082000400900035 +:10A49000004000000020050000000000090000004E +:10A4A0000000000820000000000000000040000044 +:10A4B000000000000000000000000000000000009C +:10A4C0000000001000000000040100010001030171 +:10A4D0001000000003000300000000000000000066 +:10A4E0000000020000000000008400400000024064 +:10A4F00000C0004000400008000000000004000010 +:10A50000000000000000020000040000090000003C +:10A510000300000000100041408401000000000022 +:10A52000000000000000000000000021004090003A +:10A5300000000005000000000000002100000005F0 +:10A540000000000000000000000000080000000003 +:10A550000000000000000000900000000200000069 +:10A5600000100000001000000000000000000000CB +:10A5700002000000200000000100000800000000B0 +:10A5800000000000000000004008A1102000002092 +:10A5900002000008404009080002004110000000CD +:10A5A00000000000050000000000000000000001A5 +:10A5B0000000000000000000000000000000090092 +:10A5C0000002000000000000000000000000000089 +:10A5D0000000000000100000000800400000000023 +:10A5E00000000340400000000000000000080000E0 +:10A5F0000000000000000000000808A000000000AB +:10A6000000A0208200C000001100400004000010E3 +:10A6100000850000411080884000000800082002EA +:10A6200004049000A109002000840005000000112E +:10A630000000008000020000000000000000000098 +:10A6400000000000000000000000020008000400FC +:10A65000052005000500080020040000820000001D +:10A6600000000000000000000000000000000000EA +:10A67000000500410005000020000000A000A0002F +:10A680000804C004000202048804084000100140CD +:10A69000A090C00200210508830282048802018084 +:10A6A00020000000030040002000004000000300E4 +:10A6B00000000000021000000084000000200000E4 +:10A6C0000082000000000000000000000000000008 +:10A6D000800084018400840000002000034000000A +:10A6E000000000840000210003840000000000003E +:10A6F0000200000000400000000000000000000018 +:10A70000000080000800000000000200110021018C +:10A71000080000210320020004400890200111C01D +:10A720000820A00808008204000082050011A00093 +:10A730000000000000100000000500800000000084 +:10A740000000000000000000008000000010000079 +:10A7500000030000000002080000880000009000D4 +:10A760000000000000000000A00002000000000047 +:10A7700000110011000000000000000000000000B7 +:10A78000080000000000000040000000A020202180 +:10A790008204020000080404000890000021101147 +:10A7A00000209000000100000001000000000000F7 +:10A7B0000000000008000301000000000004000089 +:10A7C000000008000000000000000002000000007F +:10A7D000000000080000000000A0000800A0000029 +:10A7E00000000000000000000000000080000000E9 +:10A7F0002100000000000000000020000084000094 +:10A80000200000000000000000840010000203117E +:10A81000801000908008000080880000090000007F +:10A820000000000008A0200008008300A000822093 +:10A830002004A105400400110000002100040004D0 +:10A8400000000204002000210000000300000000BE +:10A8500000000005000000000000004000000000B3 +:10A860002000820000000000000004000000000042 +:10A870000020000000000040000000000800080068 +:10A8800000400000000900210800080008008810AE +:10A890000200A010000020000084210000A1848597 +:10A8A00020080220052100914000800008001100CE +:10A8B0000300000008002090000020020004200097 +:10A8C0000000000000000000000000000200000086 +:10A8D0000004110000040000000000C0000000009F +:10A8E000020841080300000000000300030000000C +:10A8F000008404000000000000400000040000008C +:10A900000000000000001100008420000000200072 +:10A9100004100000000000100490042002004120F8 +:10A92000412080101190A082210484830940048278 +:10A93000A008050885029082028441080402008272 +:10A9400002080000000000000000000000000100FC :10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A97000000000000000000088000000000000004F -:10A98000000000008801010010001001000000001C -:10A990008400000000000000000000000000000033 -:10A9A0000000000000A101A088A0008800000000B5 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000002001000100002000033 -:10AA00000900000000000010030900000008000019 -:10AA10002000850000000000000000000000000091 -:10AA200000000000000040C1092100090089000069 -:10AA30000000000000000000000000000000000016 -:10AA40000000000000000000000000000000000006 +:10A9600000000000000000000000000001010000E5 +:10A970000800000011400020008840000000000096 +:10A9800000000000000000000000000000000000C7 +:10A99000000000000911900210888291C009009007 +:10A9A00000000411000090000000000111088282E4 +:10A9B000008400918200208000808000020080805E +:10A9C00009808080000000000900000000000000F5 +:10A9D0000400000000000000000000000000000073 +:10A9E0000000000000000000000000000000114115 +:10A9F0002111000000039000000000000000000092 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000009184889000418090912007 +:10AA200000C0004180902020890804091103100013 +:10AA3000A1040340C100800000218020808000002C +:10AA400080218000000000400000000000000000A5 :10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA7000000000000000000003002100030000218E -:10AA80000900200000000400900090004000C188F0 -:10AA900000000000000000000000000000000000B6 -:10AAA0000000000000000040400000031180000989 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 +:10AA6000008000080000000000000000000000005E +:10AA7000100040C040804010000000000000800036 +:10AA800000000000000000000000000000000000C6 +:10AA90000000001000000000028041040811901026 +:10AAA0008000800880100080910220C09102898877 +:10AAB00004000803401005844000840204110408C7 +:10AAC0009000040204104084000100000000000017 :10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF00000000000000000000000008801000000CD -:10AB00000001000000000000010089908300910016 -:10AB1000C19100000000000000840000000000005F -:10AB20000000008800000000000100400001010456 -:10AB30000085000000000000000000000000000090 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000010000D4 -:10AB8000000000000001000100010000004100057C -:10AB9000010901C1000000010001000100000000E6 -:10ABA000000000000000000000000000080000019C -:10ABB0000100C101000000000000000000000000D2 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000002134 -:10AC000002110002001000100008002100090010CD -:10AC1000211021A108880002000400040041000066 -:10AC20000000000000000000000000000000804064 -:10AC300011030902114100000000000000000000A3 -:10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC80004180400040000340000000000000001030 -:10AC90000002038021800902000000000000000083 -:10ACA0000000000000000000090010000400200067 -:10ACB000C10211204100200300000000000000003C -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD000000000102000000000000008800000000B8 -:10AD10000000008201880110000000000000000017 -:10AD20000000000000000000000000000000010022 -:10AD30000000C1009100C0000201000000000000FE -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD9000000000000000000007000000000000E0CC -:10ADA00000000000000000000000000000000000A3 -:10ADB00000000000000000E00000000000000000B3 +:10AAE00000000040000100840000000000000000A1 +:10AAF00000000008000400040000100000400000F6 +:10AB0000C000000000000000000000000000000085 +:10AB10000000000000010084000088C002C0848999 +:10AB2000094008004083A0901002080384044121DA +:10AB300082C005C191080940C10441100084080485 +:10AB4000820505900004020404400000000000009B +:10AB500000000001000100000001000000000000F2 +:10AB600000000000000040000000000000000000A5 +:10AB700000000001000001002001000103000000AE +:10AB8000008401C000000000000000000000000080 +:10AB90000000000000000000000000009091008410 +:10ABA00040040241014005A0208400080000050087 +:10ABB00083010100C12089C088119083418800056C +:10ABC00080910489C10000800080840000000000A2 +:10ABD000000000001111001000050020000000001E +:10ABE00000000000040000008000000000000000E1 +:10ABF00000000000000100030810802020419000A8 +:10AC0000000000800980000000000000000000003B +:10AC10000000000000000000000000000000208490 +:10AC200008080211009103002080090000000011B3 +:10AC3000912108214102A184838580001011000523 +:10AC40008082008000000009802000800000000455 +:10AC500000000000000000000008000000000000EC +:10AC600000000000000000400004000000000000A0 +:10AC70000000000000000001C0A140054100830366 +:10AC80000000008000000000000000000000000044 +:10AC900000000000000000000000800000008000B4 +:10ACA0000400880590850310002180050080800045 +:10ACB000048483900900912008A1102004A00401BD +:10ACC0009000822190021004900084419002820042 +:10ACD0000001000000000000000000010000000072 +:10ACE0000000000000000000000100000000000063 +:10ACF00000000000000000000001080940004000C2 +:10AD000009010000000200900000000000000000A7 +:10AD10000000000000000000000004001000C0005F +:10AD20001000918410909190880102011002A040BF +:10AD3000020004C1021090A01101500000E00700C1 +:10AD4000480A0000000007004800810000E00700FA +:10AD50004800810000E000000000000000E0070063 +:10AD600000000000000000000000000000000700DC +:10AD7000000000000000000000000000840000E06F +:10AD8000000000000041000007000000000000007B +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000E007004200000000007A +:10ADB00007005000000000E00700420A0000000009 :10ADC0000000000000000000000000000000000083 :10ADD0000000000000000000000000000000000073 :10ADE0000000000000000000000000000000000063 :10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE100000000000000000000000F0F00000000052 -:10AE20000000000000000000000000000000000022 -:10AE300000000000000000F04200000000000000E0 +:10AE00000000000000000000000099009999000077 +:10AE10000000000000000000000000000000A50588 +:10AE200005A50000000038F9C1F9A5FF050FB00D18 +:10AE3000BDBD0408000062F391F3000000000000B3 :10AE40000000000000000000000000000000000002 :10AE500000000000000000000000000000000000F2 :10AE600000000000000000000000000000000000E2 :10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE9000000000000000000000000000F9F91800A8 -:10AEA00000000000000000000000000000000000A2 -:10AEB000000000000000000000F0DB0000000000C7 -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 +:10AE80008081818000000000000000009900000027 +:10AE900000000000000000000000000000000000B2 +:10AEA000FF0F0FFF000000001C9F839F050FA5FFF1 +:10AEB000D00BDBDB0C0C000046CF89CF000000007C +:10AEC00002102000008810840210200000881084E6 +:10AED0000210200000881084000000000000000024 :10AEE0000000000000000000000000000000000062 :10AEF0000000000000000000000000000000000052 :10AF00000000000000000000000000000000000041 @@ -125719,981 +125719,981 @@ :10AF700000000000000000000000000000000000D1 :10AF800000000000000000000000000000000000C1 :10AF900000000000000000000000000000000000B1 -:10AFA0007E7E033F00000000000000000000000063 -:10AFB0000000000000000000000000009F1E9F1E17 -:10AFC0000000000000000000000000000000000081 +:10AFA000000000000000000000000000F500F5F5C2 +:10AFB000DD00DDDD00003CC30000000400000000F7 +:10AFC000BDBDB00D0000000000000000000000004A :10AFD0000000000000000000000000000000000071 :10AFE0000000000000000000000000000000000061 :10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B0200000004242033F000000000000000000005A -:10B030000000000000000000000000000000061EEC -:10B040009F1E000000000000000000000000000043 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000610006000D000000610006000D0000C8 -:10B0A00000610006009D000800610007000C000020 -:10B0B000000000000000000000610006000D00001C -:10B0C000A0010000000000000000000000000000DF -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 +:10B000000000000000000000000000000000000F31 +:10B01000F0FF66663C3C00000000000000000000FD +:10B020000000000000000000000000000000F5F536 +:10B03000F500DDDDDD0000003CC300000000000085 +:10B040000000DBDBD00B0061000480050001006123 +:10B050004006000D000100610007800D0001006541 +:10B060000007800D00000561000F000900000000CE +:10B0700000000000000005000A08050000A0000014 +:10B08000000000000000000000213000C0050000AA +:10B090000000303000400008000000000000000008 +:10B0A00000000000000000000000000000000000A0 +:10B0B00085614A08050100A005610A0E050D00A181 +:10B0C00000610A0F050D00A0C3FFC300558700876C +:10B0D00000000000AF05AF05000000000000000008 +:10B0E0000000000000000000000000003CF0FFFF36 :10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000C00000050D0F0F000000000C3CF7 -:10B12000003C20A020A0F3F0F2F0000000003C0062 -:10B130000A0A0000000000000000FC5F0C5F000035 -:10B140000000AF05BEBEC3FFE8E80000000000003D -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B190000000000000C0AAAA050D0F0F000000006B -:10B1A000003C003C20002000F0F0F2F00000000025 -:10B1B0003C0F0A0A0000000000000000FCFF0CFF2A -:10B1C00000000000AF051414003CE8E80000000097 -:10B1D000000000000000000000000000000000006F +:10B10000000000000000000000000F0F2F0F00FFE4 +:10B1100050C000000000000000000000000000001F +:10B12000000000000000000000000000000000001F +:10B1300000005F0F7F3FAAFAEBFB00000000000059 +:10B14000000080858A8FFFFF00FFC3FFC300FF87D9 +:10B15000AA8700000000D7D782820000000000000C +:10B1600000000000000000000000000000003CF0B3 +:10B17000FFFF0000000000000000000000000000D1 +:10B180000000000000000000000000000F0F0F0F83 +:10B19000000050C00000000000000000000000009F +:10B1A000000000000000000000000000000000009F +:10B1B0000000000055007D3C00F0C3F300000000DB +:10B1C00000000000D0D5DADFCFCFFFFF020EC2CEE5 +:10B1D000AAC3F00000000000000000000000000012 :10B1E000000000000000000000000000000000005F :10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B2100000000000000000004000000000000000EE -:10B2200000001414F4F4000000000C0E00AA00004A -:10B23000000000000000000000000000000000000E -:10B24000000000000000553C0FFF28EB28EB000039 -:10B2500000000000000000000000000000000000EE +:10B2000000000000000000000000000000000055E9 +:10B21000003C0000040800000000000000000000E6 +:10B22000000000000000000000000000000000001E +:10B230000000000000007D557F5F003CAABE0EB0FC +:10B240000BE00000000003F303F355550F0F323EEF +:10B25000F2FEAAC3F0FF00000000000000000000A2 :10B2600000000000000000000000000000000000DE :10B2700000000000000000000000000000000000CE :10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000400040004000EE -:10B2A000000000000000E0E000007D410C0C000008 -:10B2B000000000000000000000000000000000008E -:10B2C0000000000000000000553C0F0028EB28EBB8 -:10B2D00000900080000000800000040000000000DA -:10B2E0000000000000000000000000050000000059 -:10B2F000000000000000000000002000000000002E -:10B30000000000000000000000000000000000003D -:10B31000000300000000000000000000200000000A -:10B320000100000000000000000000000000000319 -:10B33000000000000000000000000010000000807D -:10B3400002080000000000000000A0000200000849 -:10B350000040000900020000000200008000000020 -:10B36000000040000000000000000000000000009D -:10B3700000000000000000000000000000000000CD -:10B38000000040000000000000000000000000007D -:10B3900000000000000000000000000000000000AD -:10B3A0000002020040000000000000000000000059 -:10B3B00000000200000000002100008200000000E8 -:10B3C00021082102000000000000000040000000F1 -:10B3D000210121C1080082400940000000008200D4 -:10B3E000824182048200000082008200000000008E -:10B3F000020000000000000000000000000000004B -:10B40000001000000000000000000000000001002B -:10B410000000000000000000090000000000000023 -:10B420000000020000000100010000000000000018 -:10B4300000000800080000000000400002000008B2 -:10B44000400008000941000000000000000000006A -:10B450000004000000110000000084000000000053 -:10B4600000000000000100000000000000000000DB -:10B470000084000000000000000000000000000048 -:10B4800000000000000000000000000000000000BC -:10B4900040000000000000000000C00000000000AC -:10B4A00000000008800000004000080000000000CC -:10B4B00000000000800080000000410080000000CB -:10B4C000004082088000C04000000008004000905A -:10B4D000039000910090110040030103000200005E -:10B4E00000002004004100000000000000000000F7 -:10B4F000000000210000000000000000000000002B -:10B500000000000800000000000000000000000033 -:10B51000000000000000000000000000000000002B -:10B52000002100080100000000410003004100412B -:10B5300000210000000800080000000800000000D2 -:10B54000002100008802000000000003A0000000AD -:10B550000041000040800000000080000400000165 -:10B5600000000000000100000000000000000000DA -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A0000000000000012000000000000010000862 -:10B5B00000000010000003A0000000C0000000C058 -:10B5C00000840000000000010000000040000000B6 -:10B5D0004000000020200004000000000040008423 -:10B5E000000000000000002000110000000000002A -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B6100000000000000000000000400000000000EA -:10B620000000000000000800020000000000000010 -:10B63000000000000000000000000000000000000A -:10B640000000004000000000000000000010C000EA -:10B65000000000410010000220824009108820C133 -:10B66000001040C0000000C00003008811C00000AE -:10B670000000008800000000000000000000000042 -:10B68000004000000000000000000000000000007A -:10B69000000000000000000000000000800000002A -:10B6A000000000000000000080008000000000009A -:10B6B00000C00000008800A00300008800000040D7 -:10B6C0000000000000000000000000002100400019 -:10B6D00000080000000000850001800580828009CC -:10B6E0000000000200000020000504040000000427 -:10B6F0000000004100000000000000000000000009 -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B7200000000005000000004002200000000000B2 -:10B7300000020005000000410008000000000008B1 -:10B7400000410021840002000021000008000008E0 -:10B75000000500000000400000000000058000001F -:10B760004002000000000000000100008001000015 -:10B7700000010000000000000000000000000000C8 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000020000000080008000000097 -:10B7B000000000080000008400C011000982204041 -:10B7C00000000502000000000000000000C00000B2 -:10B7D000000000004000000000880000000020047D -:10B7E000000080C0822001A0002000040009001198 -:10B7F000000401A000200002000000000000000082 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B8200000000000000088210021002108000041E4 -:10B8300000000004208800030041000200100008FE -:10B8400000080040004100000000404100080000E6 -:10B850004000004100000000011000000041000015 -:10B8600020080082900920050441008941880002D7 -:10B8700000A009C00421002000000000000000001A +:10B290000055003C0008000C000000000000000009 +:10B2A000000000000000000000000000000000009E +:10B2B00000000000000000003C003F0FF0FCFAFE20 +:10B2C000BEBEEBEB00000000A0A0AFAFFF00C3C309 +:10B2D00020000000000000008805000020000000A1 +:10B2E00084000880200084000000200084002000EA +:10B2F0000000000000000000200001002105008087 +:10B300000000000020040000000020002084040051 +:10B3100000030180010303900000210000002000D1 +:10B320008800000000000000000000000200200073 +:10B330002000000000000900880420002000208078 +:10B34000200488000000840400040410041002009B +:10B350000008800000000000000000000000000065 +:10B36000000040008010000000000000000000000D +:10B37000000000000000000000008000200020000D +:10B380000004400000000000000000000000002059 +:10B39000000000002008200020090000100000002C +:10B3A00000001000400000000000000000088000C5 +:10B3B0000000000200000000A000000080008200E9 +:10B3C000000400000000000004000000000400026F +:10B3D0000000410000030000000000000000000029 +:10B3E00000000000000000000000008000000200DB +:10B3F000000000000000000000000000008000804D +:10B40000000400040000000000080010000000001C +:10B41000008000000000000000000080000000002C +:10B420000000010000000200020000000000000017 +:10B43000000000000000000000000100010000000A +:10B4400001000000200000000000010000000000DA +:10B450000300200000000000004000080000000081 +:10B46000000802000000000800000300002000089F +:10B4700000000000020000000000000800000004BE +:10B480000004000100010084000000840000008826 +:10B490000000002000000000000800000010000074 +:10B4A00000001100408205000000000000080500B7 +:10B4B0000000000000000000094000000404080033 +:10B4C0000000020009008000040000084040000065 +:10B4D0000008400009080904000000000000000006 +:10B4E00000080000000000800800000000210800A3 +:10B4F00000410003000000000000000000210000E7 +:10B5000000000000000000000000000000410000FA +:10B51000000000009008000000000005000000038B +:10B5200000000021000000800083001100080000DE +:10B5300000000008000000080000000000000000FB +:10B54000000800000000002121210020000300006D +:10B55000000001419083004100410800000000000C +:10B560000084000000A00000000200000084000031 +:10B5700000840000008200000000000000000000C5 +:10B5800000000000000000080000000000000000B3 +:10B590000000000000000001080000000000110091 +:10B5A00000840082000000C0000200400000000093 +:10B5B0000000000000000002000000084108000038 +:10B5C00000000000000000A00300840811894190E1 +:10B5D000039000A04000044000A000000200000012 +:10B5E0000240020000000000000000000000000017 +:10B5F00000118200000000000000000000000000B8 +:10B6000002008200000000000000000008000000AE +:10B6100000000000000000050000904100009000C4 +:10B6200000000000400000000000008000008200D8 +:10B6300000000000400000000000A00000008200A8 +:10B640000000900000000900400091002000400030 +:10B6500000209040908202000800880008800000CE +:10B66000000011001100000000000000000021C0D7 +:10B6700000840088000000000000000000000000BE +:10B680000000004000000000210000000000000059 +:10B6900000000000000000004000400040000000EA +:10B6A0000090000000008000000000000002008800 +:10B6B00000000000004000000000028802000200BC +:10B6C00020000008080011002000000420400000B5 +:10B6D00011004001038440211100104000000004CB +:10B6E00000000000000000008200000000000000D8 +:10B6F000000000000000000000000000000000004A +:10B700000008000000000000000000000000000031 +:10B71000A0000800820008000000000000000200F5 +:10B7200000000000000000084000000000110002BE +:10B73000014000000000001000210000080000008F +:10B740000000000590030004820020202080900863 +:10B750000421202121A100040805824001000804E1 +:10B760009004000000C0210000902100030021008F +:10B7700000000300000003081000000000000000AB +:10B7800000000800000000A0000000000000000011 +:10B79000000000000000000800000000000000029F +:10B7A0009082000000000000000480000000000003 +:10B7B0004101408400000000000003000000000080 +:10B7C00000000000110200000001000008A1820436 +:10B7D0000910A1840000840405A191C0000020820A +:10B7E000020100C1020090000200000002210000DE +:10B7F0000000020200000000000000000000000342 +:10B800000008002000009000000000000800000078 +:10B81000000000000000000088118200000000000D +:10B8200040000000000090004002008091000003F2 +:10B83000000000210080000000000800000200005D +:10B8400000000000000088210000000004800005C6 +:10B8500001419103204084044021840088400080FD +:10B860008209C04104840000000000000000400282 +:10B870000000408800880000000000000000000078 :10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000800018 -:10B8B000000800000001801100000000000900A144 -:10B8C000400000880000008400000000400000A04C -:10B8D0000000C1000000400000000285090800C00F -:10B8E00000C0800800030088022101418810840004 -:10B8F00000A085032005048900000000000000006E +:10B89000000000000000000000000000000000C0E8 +:10B8A000008800024000000000000000210240006B +:10B8B0000000000000000002110000000000000075 +:10B8C0000000000002000000412002A020008204CD +:10B8D00000000402040002820001000000000000D9 +:10B8E0000940400040000802000000000000000085 +:10B8F000000000000400000040A0000000C0400064 :10B900000000000000000000000000000000000037 :10B910000000000000000000000000000000000027 -:10B92000000000000800000000000888000002007D -:10B93000000208C1000802A00004000000910008F5 -:10B9400004020000000000001000000000000000E1 -:10B950000000110100001000C00100A00004000858 -:10B9600000020009A109830900098010029000402B -:10B9700000400084410200030010000000000000AD +:10B92000C001000100000201000041C101904082FD +:10B9300010010004000002820082000000000000EC +:10B94000000000000000000000001000A000000047 +:10B950001000010100000000000011000100400083 +:10B960001000029001059004001000000000020089 +:10B970000000000040000000000080800000000087 :10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000008000000000008000000097 -:10B9B0000000000080C100910491001000020010FE -:10B9C0000080800200000000000000000000000075 -:10B9D000000000004041202100048002008000009F -:10B9E00000800000004103208240008920002003E5 -:10B9F0000304C19141800202A08480040000000081 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA200000000000090000001100102100000900C2 -:10BA3000110089001021C10010080503410508808C -:10BA40002100840004090000000080000000400084 -:10BA5000200020000800008000000000000000001E -:10BA600000090000800009000940090008A0011039 -:10BA70004184001111C09008C101A08590C0000050 -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000002000000000001000093 -:10BAB00002001000A00000010804110111C085401F -:10BAC00001C0C100A00088000200A0001000C0005A -:10BAD0000100000000000100020220000000100030 -:10BAE0000000040000C0C0000010000300880189AD -:10BAF0009008008905A000C00804018300A1A1C12D -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000001000014 -:10BB30000000040200820011A0900410012010886F -:10BB40001184001000C001A0A010001000A0000887 -:10BB5000002000000000000000000000002101049F -:10BB60000008040000000000C000C000410188007F -:10BB7000020184882083214009C080051120112101 -:10BB80004011000000000000000000000000000064 -:10BB900000000000000000000000000000000000A5 -:10BBA000000000000000000000000011000900215A -:10BBB0000004000000100082002189108080218094 -:10BBC0000990890900800000210080800080000029 -:10BBD00000800000000000000000000000000008DD -:10BBE0000985008900000000000000000003911199 -:10BBF00084008940888040202180020521028280C3 -:10BC0000200088410000000000000000000000004B +:10B99000000000000000090000000000000000009E +:10B9A000000080410021000500200000A0410800A7 +:10B9B0008000802100800000800000000000000066 +:10B9C00000000000000000000000000080000000F7 +:10B9D00009000000110820200041001091004000E3 +:10B9E00084000000201140109084008400090000B1 +:10B9F0000000000000000000000000000000804186 +:10BA0000800800800000000000000000000000002E +:10BA100000000000002000000040000000000000C6 +:10BA2000000000002080108408C0400500000000D5 +:10BA300008000510419020000580020541800000AB +:10BA400000000000000080000000800000000000F6 +:10BA500080008004808091000000910010000204AA +:10BA600011008905118083008800C1408410000006 +:10BA70000000000000000000000000000000820044 +:10BA80008201A011409000000000000000000000B2 +:10BA900000000000000000010000000100000000A4 +:10BAA0000000000000000102000801850182000082 +:10BAB00000000182010001A100000004010101A0B9 +:10BAC00000000000000000000800C000100002009C +:10BAD0008800100082019008040004C011008884CE +:10BAE0000800A082A000090408101000840002824F +:10BAF0000000000000000000000100000000000144 +:10BB0000A00000A00002058200000000000000006C +:10BB10000000000000000000000004000000010020 +:10BB200000000000000000000088001089A0001044 +:10BB300000008810000301080189C0000000000116 +:10BB4000A000000000000000000000000000000055 +:10BB50000000001000088490000200000001A00016 +:10BB6000010100418288049000C104890403A101FD +:10BB7000C0880000000000000000004000050041F7 +:10BB80000010000000800080840000000000000021 +:10BB90000000000000000000000000008000000025 +:10BBA0004000000000000000000000004100918003 +:10BBB00000800000008900020585092000110005B1 +:10BBC000002100050000000000000000000000004F +:10BBD0000000020000800080008009801100000346 +:10BBE0000010114004400021808305118004A1044D +:10BBF00090104085001000000000000000200000B0 +:10BC00000000000080008000000000000000000034 :10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000100004 -:10BC30000000081000000800100000000200C1848D -:10BC400082A01080031009004000030000000000E3 -:10BC50000000000000000080000000000011211022 -:10BC600009802080080000200080000000004104BE -:10BC700084002100001191048890A1902100050505 -:10BC80000882919003010000000000000000000005 +:10BC200000000000000000000000000003210321CC +:10BC300003004003000021822000050000110000E5 +:10BC400000000000000900000000000000000000EB +:10BC500000800080000000000010000000002011A3 +:10BC600010891080030000910091001100114183A0 +:10BC7000091109000204000000000000000000019A +:10BC8000000000000000040082888404C00000005E :10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000292 -:10BCB000000000000100000001020002000200007C -:10BCC000C140A0828840210000C00104000400009F -:10BCD00000000090002000000010000000000000A4 -:10BCE0000101002000040100C001022010A0880012 -:10BCF000918983000900080000420000070000123B -:10BD0000818100E00700500A0000000000000000F0 +:10BCA0000000000000000000000000000000A003F1 +:10BCB000820082000401000001C0000000000000BA +:10BCC0000020000000000000000000000000000054 +:10BCD000000000820010000000000088001000003A +:10BCE000002100020040000000C100080001000126 +:10BCF00000C100A100200000810000E00000000061 +:10BD000000000000000000000000000007004200EA :10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD40000000000000E00000000000000000000013 -:10BD50005000000000000000000000000000000093 -:10BD60000000000000E00000008200000000000071 -:10BD70000000810000E000000000535353000B0B53 -:10BD80002828AEBEAEBEF0FCF0F0000000000000BF -:10BD900000000000000000000000000000000000A3 +:10BD2000000000E000000000000000000000000033 +:10BD3000001100E0070081000000810000E0000029 +:10BD40006000820000E00000000000000000000031 +:10BD500000000000000000000000000000E00700FC +:10BD60000000000000E007000000000000E0070005 +:10BD70006000000000E00000810000000000000002 +:10BD800000000000000000000000BEBE0E00000A1F +:10BD9000050F00000000000000000000000000008F :10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC000007082F20000C3C3101010BA000000001F -:10BDD000003FC0FF00000000030F00000000000053 -:10BDE00000000000000000000A000F000202000234 -:10BDF000000000003CAA3CAA00000000FFFFFF007A -:10BE00000F0B00280C3C0CBE0000000000000000DE -:10BE10000000000000000000000000000000000022 +:10BDB0000000020000000EFEBEBE000000000000F9 +:10BDC00000FC000000000000000000000000000077 +:10BDD0000000000000000000000000000000000063 +:10BDE00017171717000000000000000000000000F7 +:10BDF000331133220000000000006F6F00000000CC +:10BE0000000000000000000000000000828202002C +:10BE1000005F005F00000000000000000000000064 :10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE40000000007082F2A0AF0000101010BA0000D5 -:10BE500000000000C0C000000000000C0000000056 -:10BE6000000000000000000000000A000000AAAA74 -:10BE7000AAAA00000000F000F0FF0000000000008F -:10BE8000FF0FAAAA0A0AFFFF0000C302C3000000B6 -:10BE900000000000000000000000000000000000A2 +:10BE3000000000000000000002F28282000000000A +:10BE4000000000540000000000000000000000009E +:10BE500000000000000000000000000000000000E2 +:10BE60000000FF3CC30000000000000000000000D4 +:10BE70000000FF55FFAA0000000000006F6F0000E7 +:10BE800000000000000000000000000000000000B2 +:10BE90000000BE823C000000000000000000000026 :10BEA0000000000000000000000000000000000092 :10BEB0000000000000000000000000000000000082 -:10BEC00000007D7D0F080F084F0F280080A8A8A84C -:10BED000004D004DFF0000000000000000000000C9 -:10BEE0000000000000000000000000000000000052 -:10BEF00000FF00FF0F0F0A0A7D417D410000000096 -:10BF00000000000000000000BFFF0000C3C3C3002A -:10BF10000000000000000000000000000000000021 +:10BEC000F0F000F0000000000000000000000000A2 +:10BED000000000000000000000000000A0A041EBF6 +:10BEE0000000000003F303F30000000044CC88CC02 +:10BEF0000000000006000F00070BD0E0FCA8A8FC23 +:10BF00000000000000000000000000000000000031 +:10BF1000AAAAA0A00F0F0F0F000000000000000051 :10BF20000000000000000000000000000000000011 :10BF30000000000000000000000000000000000001 -:10BF40000000000041410F000F000000280000A881 -:10BF5000A8A8004D004DFFA0000000000000A08038 -:10BF600020000000000000000000000000007070D1 -:10BF70004040AEAE828200000A0A3F3F0303000049 -:10BF8000000005610A3E059D00A100610034C00962 +:10BF40000000000000F000000000000010100000E1 +:10BF50000000000000000000000000000000F5F5F7 +:10BF600041EB000000000A0AFAFA0000000055FF49 +:10BF7000AAFF0000000006000F00D7EBD7EBF3A2EA +:10BF8000A2F300650007800D000000610006000DAF :10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000610006000D0D -:10BFC0000000000000610006000D0000A00050010C -:10BFD0000001000100610006000D000000000000EB -:10BFE0000000000000610006000D000000210006B6 -:10BFF000000D000000000000000000050061300797 -:10C00000C00D0000E0EBE0E0AA0A8202FFFF0000A2 -:10C0100000C343C300000000000000000000000057 +:10BFA0000000000000000000000000610007000D1C +:10BFB0000000000000000000000000213036000DED +:10BFC0000000000000203000C005000000603006C6 +:10BFD000C00D000000000000000000000000000094 +:10BFE000000000010061000F050D00A005610A08B6 +:10BFF000050100A105610A0F050D00A000614007C1 +:10C00000001D000100000000000000000000000012 +:10C01000D7D714140000000000000000000000004A :10C020000000000000000000000000000000000010 -:10C0300000000000000000000000000000BE00BE84 -:10C040000000FF0400000000FFC3083C003CF505B1 -:10C050003F3FAA00AAFFFAFAFAFA00000000000027 -:10C060000000000000000000000000000000058744 -:10C070002DAF000000000000000000000000505044 -:10C080000F0020207070EBEBE0E0FFFFC3C3F7FF71 -:10C09000000000C303C30000000000000000000017 +:10C030000000000000000000000000000020003CA4 +:10C04000000000000000FFFFF00000000000000002 +:10C0500000001F145F5500000000000000000000F9 +:10C060000000000000000000000000000000FF00D1 +:10C070003F300000FFFF00000000AF83AF2C007DC9 +:10C0800000703F153F2A0000000000000000000083 +:10C090000000CF0CCF0C00000000000000000000EA :10C0A0000000000000000000000000000000000090 -:10C0B000000000000000000000000000000000146C -:10C0C00000140000FF04000000003C00083C003C9D -:10C0D000F5053030AA00AAFF00FAFFFA00000000C0 +:10C0B0000000000000000000000000000000E3E3BA +:10C0C0000030000000000000FFFF00000000002022 +:10C0D000000000001F145F55000000000000000079 :10C0E0000000000000000000000000000000000050 -:10C0F00005872DAFF000AA0000000000000000003E -:10C1000055550F002C2C7C7CE000EB0000D75050E4 -:10C110005F5F5F55383038300000000000000000DD +:10C0F000FF003F30F000F0FF000000005F435F1CD6 +:10C100007D7D7070CF45CF8A0000000000000000E8 +:10C11000000000000000000000000000000000001F :10C12000000000000000000000000000000000000F :10C1300000000000000000000000000000000000FF -:10C1400000000000FF7D0041000000000000000032 -:10C1500000FF3F3FD71400FF3C3C00FF00C30C0C26 -:10C160000C3C000000000000000000000000020085 -:10C170000200000FFFC300000000000000000000EC -:10C180000000D787AAFF00000000EBEBEBEBD7D74E -:10C1900050504F414F41303030300000000000001F +:10C14000F3F35F50AAAAAA0C0000C3C3FFFFA0FF2D +:10C15000FF0000000000E0005500000000000000AB +:10C1600000000000000000000000000000000000CF +:10C170000000FF3F00033C3C3C3C000000007D030E +:10C18000410320E023E34B4BAA0000000000000025 +:10C19000000000000000000000000000000000009F :10C1A000000000000000000000000000000000008F :10C1B000000000000000000000000000000000007F -:10C1C000000000000000FF7DFF7D00000000000077 -:10C1D000303030F30303D714F0F0AAAA003C00007B -:10C1E0000C0C0C0C0000000000000000000000001F -:10C1F00000000300F0FF3C00000000000000000011 -:10C20000000000000005AAFFFFFF10FF0000000073 -:10C21000000000000000000000000000000000001E -:10C220000000880000000000000000000000000086 -:10C2300000000000000000000000000000000000FE -:10C2400000002000000000000000000000030000CB -:10C250000000000000000000000000000400880052 -:10C260000000000020000000880000000000848022 -:10C27000008000040088000990C000200000000039 -:10C2800008000000C10200000000000000000000E3 +:10C1C000000000005F50AA0CAA0C000000003C3CDC +:10C1D000A0FF00000000000040005500000000002B +:10C1E000000000000000000000000000000000004F +:10C1F00000000000FF3F000300FF3C3C0000000087 +:10C200007D3F413F2CEC2FEF4B4BFF5500000400CE +:10C2100004002000400000000000000000000200B8 +:10C2200002000000000000000400200000000000E8 +:10C230002000200020000000020000080000200074 +:10C2400020000000000000000004200000030500A2 +:10C25000058802850580200000000000000800001D +:10C2600020002004880004000000000020002000BE +:10C2700000850280208400200080008400110420BA +:10C28000830420040204208000000100010000005B :10C29000000000000000000000000000000000009E :10C2A000000000000000000000000000000000008E :10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D00000000000000000000000000000008000DE -:10C2E0000000008400000000008400000000000046 -:10C2F00000080008000100050000412100010000C5 -:10C300000000C100410440C1000000000000000224 -:10C310000000010000900000000088009000000074 -:10C3200000000000000000100000000000000010ED -:10C3300000000000000000000000000000000000FD -:10C3400002000000000000000000000000000000EB -:10C3500000000000000000000100010001000000DA -:10C3600000000100010040009000000000000300F8 -:10C370004000400000000000000004000400000035 -:10C380000000000008000000400000000000010064 -:10C390000000000020000010000000000000000865 -:10C3A000000000400000000000000000000000004D -:10C3B000000800000000000000000000000000086D -:10C3C000000000000000000000000000000000006D -:10C3D000000800000000000000000400400004000D -:10C3E0000008000040004000800000000000000045 -:10C3F00008008008880000000000000000400008DD -:10C400000008000000008000000080000008000418 -:10C4100002000088000000000090000000050005F8 -:10C42000900000000000000000000000000000413B +:10C2C0000000000000000004000000000000000268 +:10C2D00004848204800404040000000000000000C4 +:10C2E00000000000000000040084000000000000C6 +:10C2F00002002010001000100003032000200004A2 +:10C300008001040200000000000400002000200062 +:10C31000000000000010000000000000000000000D +:10C3200000000000000000100000000000000000FD +:10C3300000100200000000000000000000000000EB +:10C3400000000000000000000000004100000000AC +:10C350000000000000000040000000000005000098 +:10C3600000000000000000002000000000000000AD +:10C3700000000000000000000000000000000000BD +:10C38000028000000200080001000000A000008000 +:10C390000080000000000000000000000208040807 +:10C3A0000010000000080000000005000000000868 +:10C3B000000800000010001000100000001000082D +:10C3C0000000000005080000000000000010000848 +:10C3D0000008000000000000000100000000000054 +:10C3E0000088000400000088000080000000008435 +:10C3F0000008000800000008200000000000000005 +:10C4000000080020000000080200040000004100B5 +:10C41000000400040000000000080008A00008005C +:10C42000000000008200000000000000000000008A :10C4300000000000000000000000000000000000FC :10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000008D4 -:10C4600000000000000000000000000001020000C9 -:10C47000000000000000001000040008002100205F -:10C4800000100010008000000008020002110000EF -:10C490000000000000022100000003110020000045 -:10C4A00000A000000000008200000000000000006A -:10C4B000000000000000000000000000000000007C +:10C4500000000000000010000100A08002000000A9 +:10C46000000000080000002100080011000000008A +:10C470000041000000000021000020000000000832 +:10C48000880321002000A00400058400000040046F +:10C490004008000040000000000000000000001004 +:10C4A000800000000000000000000000000000000C +:10C4B0000008000000000000000000000000000074 :10C4C000000000000000000000000000000000006C -:10C4D0000000000000000000000000842084000232 -:10C4E0004182000800C0001000100010001040A1A0 -:10C4F00000000300410000000008410100840384A3 -:10C5000000010000000000200000001080C080003A -:10C51000090008000010001000040091001088417C -:10C5200000200000000900A0000000000000000042 +:10C4D0000000110000000000918240A000208000B8 +:10C4E00000000002000000000000000000880000C2 +:10C4F000000000000000000000002020800000007C +:10C5000041A0008820C080C0210100C0000205C0F9 +:10C510008901000000840084200000000000000069 +:10C52000000000000000000000000000000000000B :10C5300000000000000000000000000000000000FB :10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000040000000000D7 -:10C56000004000002000010000000000000000006A -:10C57000C00000000000000200100080C000C000E9 -:10C580000000000000000000000000000089000022 -:10C5900008000005000400050004400200040041FA -:10C5A00000900091000000C0002100000000000089 -:10C5B000000000000000000000000000000000007B +:10C5500000000000000000000000010000800080DA +:10C56000080000200000082000200000200020001B +:10C570000000000000000000A00000000009000012 +:10C5800000008800900088000000000000004020AB +:10C59000081040049000200409000000000800007A +:10C5A000000000000000000000000000000000008B +:10C5B0000000000000000000000000000800000073 :10C5C000000000000000000000000000000000006B -:10C5D00000000000000000000000000080000000DB -:10C5E000000000000000C100040000000000000086 -:10C5F00000000000000000000001004100080000F1 -:10C6000000000000000000000000000008000040E2 -:10C6100020000200008200C00090099001002080EC -:10C6200000800180000008000020010000000000E0 -:10C6300000000000000000000000000800000000F2 +:10C5D000000000002000099000000002100000028E +:10C5E000000200C000000000000000000000210068 +:10C5F000000000000000000000000000000000003B +:10C6000000001100020000002100000002000000F4 +:10C6100000014100000040088000200000000000F0 +:10C620000000000000000000010001000000000008 +:10C6300000000000000000000000000000000000FA :10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C660000400040004000400208000000000C0005A -:10C6700000000000401000088221C000C00000003F -:10C680000008000400800102020000800000000297 -:10C690009000000800880000002100400000080011 -:10C6A000C110001020100084800021010200000051 -:10C6B000000000000000000000000000000000007A +:10C6500000000000000000000000020000000100D7 +:10C6600000800180000000002000000000020000A7 +:10C67000900000000000A000000082000000000008 +:10C6800020800080000008009000000000000002F0 +:10C690000882A100008020004080200000090000E6 +:10C6A000000000000000000000000800080000007A +:10C6B00000000084000000000000000000000000F6 :10C6C000000000000000000000000000000000006A -:10C6D00000000000000000A00000000000000000BA -:10C6E00000008084A0008000A0828004000000C0C0 -:10C6F0004100000000008010000003000000410025 -:10C7000000000001000100040288800000200008F1 -:10C71000001000000000000209100008009100A0B5 -:10C72000000900000211210000400010002000203C -:10C7300000030011000000020000000000000000E3 +:10C6D0000000000000000000000800A08000000032 +:10C6E00040A000020208000000002000000000003E +:10C6F0002100000000000000008400000000000095 +:10C70000000080040004000000102090001000844D +:10C71000000020200408002083C08304800009C09A +:10C7200020002008000020000000000000000000A1 +:10C730000004000800200004000000000041000088 :10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C76000000000000400000000000141000400413E -:10C77000000000000041000400002000000800212B -:10C780000000001100210000000000030000004034 -:10C7900008400000000000080000001002410010E6 -:10C7A0000000000000000084A088000000010001DB +:10C750000000200000000000000020000800000091 +:10C7600000000000000208000000881102210400FF +:10C770000400020000000000900000219000020070 +:10C7800000000011000004000000900200002009D9 +:10C790000002200200000000C00888009021040070 +:10C7A0000180000000000000000000000000000008 :10C7B0000000000000000000000000000000000079 :10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E00000000000000080000000000004000001C4 -:10C7F0000000000000000000000000000000000039 -:10C80000000000000008008200000000001000008E -:10C8100000010083000000000040000009C10090FA -:10C82000020109084188402004A0821110C00008BC -:10C8300000C004C000000000000000000000000074 +:10C7D00000000000000000000000000021000090A8 +:10C7E0000090000000000003400040C00000000076 +:10C7F0002100000000000000000000000000000018 +:10C800000000000000000000000000000000200008 +:10C8100000002000000000000500000041000000B2 +:10C82000000040100000000000000000400484A050 +:10C83000008204C0000000000000000000000000B2 :10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000C000900000000000C1B7 -:10C870000190840000000000030010010001C000CE -:10C88000000002001000000001001000000188C03C -:10C89000009000A088020108010440400004020248 -:10C8A000000400C0C010C084098400048008808097 -:10C8B0000080000080000000000000000000000078 +:10C8500000000000000000000000000000040008CC +:10C8600000C00088000040C10041008382C0000079 +:10C8700000000000000000000100000100010000B5 +:10C88000000000000100C084C00401820802901072 +:10C8900000900110C010010190880082101100006A +:10C8A0000000040100000000000000000000808083 +:10C8B0000000008080000000000000000000000078 :10C8C0000000000000000000000000000000000068 :10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000008000800000000048 -:10C8F00000C011918009000400031004800300218E -:10C900008000400080008000000909030003000946 -:10C9100080800080000000002180210000800080D5 -:10C920008400000000008000098004088482040460 -:10C930000000002000408000000000000000000017 +:10C8E000008000000000000080C1008300020004FE +:10C8F00000000000000000000009210000080010F6 +:10C9000000000000000041008080008040808080A6 +:10C9100000000080400080801108801000C10008E5 +:10C920000010030940080011000000000000000092 +:10C930000000000580400000000000000000000032 :10C9400000000000000000000000000000000000E7 :10C9500000000000000000000000000000000000D7 -:10C960000000000000000000000000008000000047 -:10C97000808000008000034080A10000400004008F -:10C9800021218900400003004000058008001100BB -:10C9900041090000804100098080848009001084E2 -:10C9A000C000000000110080000090C0C001A0A1E4 -:10C9B000880004004001828990000000000000000F +:10C960000000000500000000000000000002850932 +:10C97000C1000000000000000000030002000500EC +:10C98000002000000000000000000000000200097C +:10C9900000008000001000028000000000098000FC +:10C9A00000802083000088201008000000000000A4 +:10C9B00000009000840408058204000000000000CC :10C9C0000000000000000000000000000000000067 :10C9D0000000000000000000000000000000000057 -:10C9E00000000000000000000000000000008200C5 -:10C9F0000000C090000282000001C0910000010010 -:10CA000000000101080002000000A1000004010074 -:10CA100001000101A000820088A1C09002404000F6 -:10CA200000891100000000000088000002C00041E1 -:10CA300004854009088200400082090200000000CD +:10C9E00000000000008400A00000000000C0000162 +:10C9F0000383C182000000000000000000880000E6 +:10CA0000000000000000000000000000A0008441C1 +:10CA100082048404080010001003900088000000C5 +:10CA200084008490910808001101020000000000B9 +:10CA300000000000C19000848408A0820000000073 :10CA400000000000000000000000000000000000E6 :10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA70000000009000C000009100009100C1000083 -:10CA80000000000000000008000200C100030000D8 -:10CA9000010000010101C040000890A088C0A00171 -:10CAA00000010001820140080010108410C08009BC -:10CAB00003840021009180000000000089800000B4 +:10CA60000000000000000000000000000001202085 +:10CA700041A088A089040000000000000000000020 +:10CA8000000000010001000000000000000002A002 +:10CA9000A0840482C0841084001000909082101042 +:10CAA000004091840000000021018201000100008B +:10CAB00000000000000041000000008000000000B5 :10CAC0000000000000000000000000000000000066 :10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000800080000391050091038584 -:10CB000000020910410200100089008900400088DD -:10CB100000052011410511418080000080008080C7 -:10CB200000400004002191108080000080008000FF -:10CB300021040440100083030011800000800000E5 +:10CAE0000000000000000000000000000000000145 +:10CAF000000082008000080000000000000000002C +:10CB000000000000002100110000000000000000F3 +:10CB1000A000000080008000000000000080408035 +:10CB2000808010808800000000051140412105022E +:10CB300000000000000000000009800900008000E3 :10CB400000000000000000000000000000000000E5 :10CB500000000000000000000000000000000000D5 :10CB600000000000000000000000000000000000C5 -:10CB700000008009000900000000A18409030021D1 -:10CB8000400040C004001100084000000080000088 -:10CB9000001141C011001000081080118009808030 -:10CBA0000000884084C00900044080048040800068 -:10CBB0000000C101918941401001400120A0828400 -:10CBC00088000000000000000000000000000000DD +:10CB700000018009820009218004000000000000FB +:10CB80000000088405000500050300000000000007 +:10CB900000008004004000800000800000118080C0 +:10CBA00080008011800000000000021141042080FC +:10CBB00011030000000000000000840020C09082EB +:10CBC000080000000000000000000000000000005D :10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF000000000009000000000000000C090000154 -:10CC00000001900001C100000000010100C000020D -:10CC100000C000000189010000000101C00110A155 -:10CC200040821000C103822010828201C001A00155 -:10CC30004000C000810000E0000060000011000022 -:10CC400007000000000000000000000000000000DD +:10CBE000000000000000000000000400C000C000C1 +:10CBF000C0000001C00005A0052184000000000065 +:10CC00000000000000A10000000000000000000083 +:10CC100000000000080188A084408200900010906D +:10CC20001010020010012000101000000088000504 +:10CC30000182010000000000000000000000000070 +:10CC40000700480000000000000000000000000095 :10CC500000000000000000000000000000000000D4 :10CC600000000000000000000000000000000000C4 -:10CC70000000000000000081000007000000828129 -:10CC800000E007000000000000000000420000007B -:10CC9000000000004100000000E000000000000073 -:10CCA00000000700420000000000070000000041F3 -:10CCB00000000700001289CF090F00000001434265 -:10CCC000C3C24C664C66000000000000000000007B +:10CC7000000000000000488100E007000000000004 +:10CC8000000000000000810000E000000000000043 +:10CC900000000000000B000000E007005009000049 +:10CCA00000E007000082000000E007000000000034 +:10CCB00000E0000000000000000000000000000094 +:10CCC0000000000000000000000000000000000064 :10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000FFFF0000FF00000037 -:10CD00003C3C0000FF0000000000000000000000AC -:10CD1000000000000000000700000000000000000C -:10CD2000F690BDBDF03CFF66F6067E4200000000B6 -:10CD30000D0042FFD9D9999989CF99FF00000000D1 -:10CD4000C342434200004C660000000000000000A7 +:10CCF000000000000000000000000000FF3EFF7C7C +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20007F3F7E3CF7F6F3F0FFFFFFF0FF00FF00D0 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 :10CD500000000000000000000000000000000000D3 :10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000FFFF0000FF00B6 -:10CD800000003C3C0000FF0000000000000000002C -:10CD9000000000000000000000040000000000008F -:10CDA0000000F6902424F03C0066F6067E42000067 -:10CDB0000000090942FF003C003C000000000000A8 -:10CDC0000000000000000000000000000000000063 +:10CD700000000400000000000000100000F0FF3C74 +:10CD8000FF7C000000000000000000000000000028 +:10CD90000000000000000000000000000000000093 +:10CDA00000006F0F6600E766C30000000F00FCC0C4 +:10CDB000FCC00000000000000000000000000000B7 +:10CDC0000000021020000088108400000000000015 :10CDD0000000000000000000000000000000000053 :10CDE0000000000000000000000000000000000043 :10CDF0000000000000000000000000000000000033 :10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000099F981C11E -:10CE4000CF89C080000000000020662200000000A2 +:10CE100000000000000000000000000002102000E0 +:10CE200000881084000000000000000000000000E6 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 :10CE500000000000000000000000000000000000D2 :10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000FF00000F0F000000FFFFFFF0F00000A8 +:10CE700000000000C0C000F0000000000000FFFF44 +:10CE8000FFFF0099999900000000000000000000D9 :10CE90000000000000000000000000000000000092 -:10CEA0000000000000006F6F0CFCBDBD096F242D59 -:10CEB000242D00000000F1F9F0F000000000FFF95F -:10CEC000C3C1FF99FF99000100020030FF33000049 +:10CEA00000000000000066E76FEF0C6E0C6E00FFE4 +:10CEB00000FF0000FFFF00000000F6F6C234000093 +:10CEC0000000000000000000000000000000000062 :10CED0000000000000000000000000000000000052 :10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF0000000000FF00000F0F000000FFFFFFF0F027 -:10CF100000000000000000000000000001011919DD -:10CF2000000000000000000060600CFC2424096F79 -:10CF3000BD2D242D101070700000000000000000B6 -:10CF400000610004C0190000000050300000000023 +:10CEF000000000000000C0C000F0000000000000C2 +:10CF00003C3C0069009900000000000000000000A7 +:10CF10000000000000000000000000000000000011 +:10CF2000000000000000000000C30FCF0C6EFFFFE8 +:10CF3000033F033F00C33CFF00000000F9F9C13884 +:10CF400000000000000000000000000000000000E1 :10CF500000000000000000000000000000000000D1 :10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF80000000030203380C0092C003E3033CCC0D05 -:10CF900082C000610006000D000000610006000D67 -:10CFA00000000040000400000000100020000040CD -:10CFB000000810614006000D00011000003800005C -:10CFC0000000F0F020300000000000000000000031 +:10CF70000000000000000000000030000000000081 +:10CF80000000A0612036C00500080000000000007D +:10CF9000000000610006C009000000000000000061 +:10CFA000000000610007000D000000610007000D97 +:10CFB000000000610002000D000000610007000D8C +:10CFC0000000000000000000000000000000000061 :10CFD0000000000000000000000000000000000051 :10CFE0000000000000000000000000000000000041 :10CFF0000000000000000000000000000000000031 -:10D00000000000000000000000000000C3C3FF5546 -:10D0100000000020000000000200000000000000EE -:10D0200000000000AF05BEBEEBEB30F300000000D7 -:10D0300000000000F0D0F0505151FBFB0000000058 -:10D0400000000000F0F0003000FF8FFF0000000043 +:10D000000000000000A000A00000000000000000E0 +:10D0100000000000BEBFFFFF0000FFFF0000000097 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000006900FF05B +:10D0400000000020000000000000000000000000C0 :10D0500000000000000000000000000000000000D0 :10D0600000000000000000000000000000000000C0 :10D0700000000000000000000000000000000000B0 -:10D080000000000000000000000000000000FFFFA2 -:10D09000FF5500000000003C000F000000000000F1 -:10D0A000000010005100AF051414282830F30000D0 -:10D0B000000000000000F0D0F0500051AAFB00007A -:10D0C0000000000000003C083C0000AA80AA00000C +:10D0800000000000000000A000A000000000000060 +:10D09000000000000000FEFFFFFFFF00FF00000097 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000969644 +:10D0C000FFFF000000000000000000000000000062 :10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D1100008088A0800FF00FFFFFF0041AF00000081 -:10D1200000000000FEF0F0F00FAF0F0FF3F328EB5C -:10D130000000000000000000000000001414141C97 -:10D1400000000000000000003C083C0000AA80AA8B +:10D100000000000000000000F5DFC3FFAA0000558A +:10D1100000000000000000000000CFCF00F200F28D +:10D1200000000000000000000000000000000000FF +:10D130000000000000000000FF3EFF0A00000000A9 +:10D14000070BD7EB0000AA28000000000000000039 :10D1500000000000000000000000000000000000CF :10D1600000000000000000000000000000000000BF :10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000008088A0800000000FFFF0003A0004C -:10D1A000000000000000F2F0F0F00F2F0F2F3030E1 -:10D1B00028EB000000000000000000000000141434 -:10D1C0003C3C0000000000000000000000000000E7 -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000003000000001B -:10D21000000000000000000000000000000084008A -:10D22000840000000000000000000000000000007A -:10D230000000008000000010000000002000000836 -:10D24000100000000000008000000080400000008E -:10D2500000000000000000000000000000000000CE +:10D1800000000000000000000000F5DFC3FFAA005F +:10D19000005500000000000000000000CFCFFFF2AB +:10D1A000FFF200000000000000000000000000008E +:10D1B000000000000000000000003E3E0A0A0000DF +:10D1C0000000D0E0D7EB0000AA82000000000000C1 +:10D1D000000020000000000020000000000082008D +:10D1E000000000000000040000000000000000003B +:10D1F0000000000084000000040000000000200087 +:10D2000000000000000020000000000200000000FC +:10D210000003000000000000000400000000000007 +:10D2200000000000000000000400040402000000F0 +:10D2300000000400020003002000020000000000C3 +:10D240008484042084032000210085044000000021 +:10D2500000000200000000000000000000000000CC :10D26000000000000000000000000000400000007E -:10D2700000000000000000000000000000000000AE +:10D27000000000000000000000002000000000008E :10D28000000000000000000000000000000040005E -:10D29000000000000000000000000000000000008E -:10D2A00000000000000000000000000000000090EE -:10D2B0000090009000402102009000900000A1002A -:10D2C00000009000000010000002000000020000BA -:10D2D000000000000020000000000000000002002C -:10D2E000000002000000000000000010000000002C -:10D2F000000000000000000000000000000000002E +:10D29000008200000000000000000000000000000C +:10D2A000000000000000000000000002000000007C +:10D2B0000000000000000002208480040004000040 +:10D2C00000000020008500008040200020080000B1 +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000010000000000000000000001E :10D30000000000000000000000000000000000001D -:10D310000000000000000000A0000000000000006D -:10D32000000000000000900000000000000000006D -:10D3300000000000820000000000900000000000DB -:10D340000800000000000000000040000200410052 -:10D35000000000000088000000080000000000003D -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000008000000000000A5 -:10D380000000000000000000000800000000000095 -:10D390000000000000000000000000840400000005 -:10D3A0000000000004000000000000100000000069 -:10D3B00000000400040000000000000000840000E1 -:10D3C00000100000000000000000000480000000C9 -:10D3D000A0000080880000000000000000000000A5 -:10D3E0000000000000000000000000080000000035 +:10D31000000000000000000000000000000000000D +:10D320000000000000000000000084000000000079 +:10D3300000000000000000000100000001000108E2 +:10D3400000800080000000000100000000000000DC +:10D3500000000000000800000000000000000000C5 +:10D36000000000820008000000000008001000100B +:10D370000000000004100000000000000000000099 +:10D38000000000000088000000000088000000008D +:10D39000000000000000000000000000000000008D +:10D3A0000000000000000000000000000400000079 +:10D3B0000000000000000000020004000000040063 +:10D3C0000400002021200000000020000000408414 +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D :10D3F000000000000000000000000000000000002D :10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000080000F4 -:10D43000000000000000000088000000000000085C -:10D4400090009000200000211000000040A0044047 -:10D45000040840050040009000900000000000001B -:10D460000084000000000000000000000000000038 +:10D410000100000000000000000002000000000009 +:10D4200000000000000000000000000001000000FB +:10D4300000000000000000000000000000000000EC +:10D4400000000000A0000000000020000021A00358 +:10D4500000090008000000000000000000000000BB +:10D4600000000000000000000000000000000000BC :10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D49000000000000000000000000000000000008C -:10D4A000000800000008000000000000000000006C -:10D4B00000A00000000200001100000000000000B9 -:10D4C00009020908090091A00000800000820021E3 -:10D4D000000800C0000000900080018001000000F2 +:10D480000000000000000000000000000300000099 +:10D49000000002000000000000000000800000000A +:10D4A00000000000080000080008000000820200E0 +:10D4B000000000000000000000000000000000A0CC +:10D4C00000000400030200844188000000000008FE +:10D4D0000008038800C000000000000000000000F9 :10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C +:10D4F0000000000000000000000000000000080024 :10D50000000000000000000000000000000000001B :10D51000000000000000000000000000000000000B -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000000000000020000000000000000000BB -:10D550000400002088110000002100024020040087 -:10D5600000020004000400000000000000000000B1 +:10D52000000090000000000000000000000000006B +:10D53000C00082000800040000000000000000009D +:10D540000100010002000100040000002000200092 +:10D550008880000090009010000000000000000093 +:10D5600000000000000000000000000000000000BB :10D5700000000000000000000000000000000000AB :10D58000000000000000000000000000000000009B :10D59000000000000000000000000000000000008B :10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C0000000000000000000000000000400000057 -:10D5D000008280C0000009000004000000800010EC -:10D5E0000100000000000000001100000000000029 +:10D5B0000000000000000000000000000000020069 +:10D5C0000000200004000000200000000000000017 +:10D5D0000000000400A000000000000000000000A7 +:10D5E000000000000000000000000000000000003B :10D5F000000000000000000000000000000000002B :10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000001000000000DA -:10D640000000000000200000002100000000082071 -:10D6500000000020001000000020000000841120C5 -:10D66000038904C000A000000004000000000000C6 +:10D61000000000800000000000000000000000008A +:10D620000000000000000000000000000000A0005A +:10D6300000000000000000000008000000000000E2 +:10D640000000000001002080830001000000044170 +:10D6500000200000000000080000000200000000A0 +:10D660000000000000000000210021000000000078 :10D6700000000000000000000000000000000000AA :10D68000000000000000000000000000000000009A -:10D69000000000000000000000000000000000008A -:10D6A00000000000000000000000000000000282F6 -:10D6B00000000000210000C0000000000040000247 -:10D6C00000A0000000000002001000A020000000E8 -:10D6D00000100800000000000000020104000380A8 -:10D6E0000084090000800002000000040000000027 -:10D6F000000000200000000000000000000000000A +:10D69000000000000040000000C000000000008406 +:10D6A00000000000000000880000000000000000F2 +:10D6B00000082000009000000000000000000000B2 +:10D6C00000000084000020A08204200820A00002A6 +:10D6D00080880011008800A00088210808840000CC +:10D6E0000000200002000000000000000000000018 +:10D6F000000000000000000000000000000000002A :10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 -:10D720000000000000000000000000000000900069 +:10D7100000000000000000000000000020000000E9 +:10D7200000000000000900000002080000000000E6 :10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000080000D1 -:10D7500001000508000488000408001188910010E9 -:10D760008408004084020002000000002100000044 +:10D740000000000000000000900000000009000040 +:10D75000000020090400000000080404040402047E +:10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 :10D780000000000000000000000000000000000099 :10D790000000000000000000000000000000000089 :10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 +:10D7B0000800000000000800000000000000000059 :10D7C0000000000000000000000000000000000059 -:10D7D000000020C0402000002000C00020004020A9 -:10D7E0000020C08490820000C00000000000000003 +:10D7D000000040000000000000A000000001000167 +:10D7E0000001000000000000000000000000000038 :10D7F0000000000000000000000000000000000029 :10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D8200000000000000000000000000000000000F8 +:10D8100000000000000000000000C000000400A0A4 +:10D8200004C0000000000000000000000000000034 :10D8300000000000000000000000000000000000E8 -:10D840000000000040C000C0000010081088C09018 -:10D8500000908890010120010000000000080010E5 -:10D8600085A104898300A1000000000000000000E1 +:10D8400000000000000000000000000001000000D7 +:10D8500000000000100800880008101001000000FF +:10D86000880100010000000000000000000000002E :10D8700000000000000000000000000000000000A8 :10D880000000000000000000000000000000000098 :10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000000078 +:10D8A00000800000000000000000000000000000F8 :10D8B0000000000000000000000000000000000068 -:10D8C00000000000000080800000000000009000C8 -:10D8D00000000000000011418021091100040084B3 -:10D8E0000511400200048800A1110080C11000054C +:10D8C0000000000000000000000000000000110245 +:10D8D0000021000000008080000000808080110294 +:10D8E0000021000800080000000000000000000007 :10D8F0000000000000000000000000000000000028 :10D900000000000000000000000000000000000017 :10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 +:10D9200000000000000000000000002000000000D7 :10D9300000000000000000000000000000000000E7 -:10D94000000000000000000000000000000800804F -:10D95000000080A18000808000000000000000091D -:10D9600088800909054020C00300A1C0902021053E +:10D9400000000000000000000000000000000000D7 +:10D950000000020011000211800000090000800098 +:10D96000000002001100080000000000000000009C :10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 :10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 +:10D9A00000000084000000000000000000830082EE :10D9B0000000000000000000000000000000000067 -:10D9C00000000000000000000000900088009000AF -:10D9D000C0C0880010C0080882C00000000000001D -:10D9E000000011028800018911104088000008A180 -:10D9F00000C0000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D000000000000040010000820800020088886A +:10D9E0009000001000000100010000000000000095 +:10D9F0000000000000000000000000000000000027 :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 -:10DA200000000000000000000000000000000000F6 +:10DA2000000000A00000000884C00000000000000A :10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000100010B6 -:10DA5000C008000811C00008C0100210000001003A -:10DA60000100000090910009C01100A00900000011 -:10DA7000800200A000000000000000000000000084 +:10DA400000000000000000000000000000000000D6 +:10DA50000000000000000001900001001008008894 +:10DA60000082020800000000000000010000000029 +:10DA700000000000000000000000000000000000A6 :10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 +:10DAA0000000000000000000008000800000000076 :10DAB0000000000000000000000000000000000066 :10DAC0000000000000000000000000000000000056 -:10DAD0000080808000004100008080800000000005 -:10DAE000410009000000800404A004A105A0040274 -:10DAF00005A121000040000000000000000000001F +:10DAD00000000000000040020903020211028080E1 +:10DAE000000000808080000200090000001100009A +:10DAF0000000000000000000000000000000000026 :10DB00000000000000000000000000000000000015 :10DB10000000000000000000000000000000000005 :10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000000000000000E5 +:10DB30000000000000008000000000000000000065 :10DB400000000000000000000000000000000000D5 -:10DB5000000800000080000000000000000000003D -:10DB60000900040004001000210085418900021111 -:10DB7000050190A0892004000000000000000000C2 +:10DB500000000000000000000200000202000310AC +:10DB60008011800280800000020011000800001077 +:10DB700000000000000000000000000000000000A5 :10DB80000000000000000000000000000000000095 :10DB90000000000000000000000000000000000085 :10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000000000000000000065 +:10DBB0000000C000A000C000040000000000000041 :10DBC0000000000000000000000000000000000055 -:10DBD00000000000000200400000020010880888D9 -:10DBE0000800000000000000000003C0A0A0100218 -:10DBF000010000000000070082000000000000009B +:10DBD0000000000000000000000000000000000045 +:10DBE00000000801201010101000000001000100CA +:10DBF0000000000000000000000000000000000025 :10DC00000000000000000000000000000000000014 :10DC10000000000000000000000000000000000004 :10DC200000000000000000000000000000000000F4 :10DC300000000000000000000000000000000000E4 :10DC400000000000000000000000000000000000D4 -:10DC50000000000000000000000000420000000082 -:10DC600000004842480000E000008200001100E08F -:10DC7000070000005500550014142828000000007B +:10DC5000000000000000000000000000000000E0E4 +:10DC6000070000000000000007000000000000E0C6 +:10DC700000000000000000000000000000000000A4 :10DC80000000000000000000000000000000000094 :10DC90000000000000000000000000000000000084 :10DCA0000000000000000000000000000000000074 -:10DCB0000000000000000000000000000000000064 +:10DCB000BE3CBE3C0000010000000000000000006F :10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000040801020040848 -:10DCE0001020041008200000000000000000FF5079 -:10DCF000FF50FFFF000C4500050000140028000045 +:10DCD0000000000000000000000000000000000044 +:10DCE000000000000000282FFFFF00F03CFC0000B7 +:10DCF0000000000000000000000000000000000024 :10DD00000000000000000000000000000000000013 :10DD10000000000000000000000000000000000003 :10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000000000000000E3 +:10DD30000000FF7D7D7D000000000000000000006D :10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000001020408B4 -:10DD6000010240800140028000000000000000002D -:10DD7000FF50FFF0FFFF00FFFFFF00FFF0F0F0FF9C +:10DD500000000000000000000000000000000000C3 +:10DD60000000000000000000282F282FAAFABEFEA5 +:10DD700000000000000000000000000000000000A3 :10DD80000000000000000000000000000000000093 :10DD90000000000000000000000000000000000083 :10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 +:10DDB000C180C180000000000000000000000000E1 :10DDC0000000000000000000000000000000000053 -:10DDD000000000000000000000003CC30000240020 -:10DDE000002406009000040810200000000000003D -:10DDF0000000000303030000D0D00000000070709A -:10DE0000707D000000000000000000000000000025 +:10DDD0000000000000000000000000000000000043 +:10DDE00000000000000000000000FF4FFF415D0C3C +:10DDF0005D0C0000000000000000000000000000BA +:10DE00000000000000000000000000000000000012 :10DE10000000000000000000000000000000000002 :10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000000000000000E2 +:10DE30000000C180C1800000000000000000000060 :10DE400000000000000000000000000000000000D2 -:10DE50000000000000000000000000003CC30000C3 -:10DE60008100008100060090010240800000000057 -:10DE70000000000000C3C3C30000D7D705610A0E2D -:10DE8000059D00A10000000000000000000000004F +:10DE500000000000000000000000000000000000C2 +:10DE60000000000000000000000000004F4F414192 +:10DE7000FFFF5D0C0000000000000000000000003B +:10DE80000000000000000000000000000000000092 :10DE90000000000000000000000000000000000082 :10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 -:10DED0000000000000000000000000000000000240 -:10DEE0009000000010000000000000000800002169 -:10DEF0000003C00D00000061003F000D00000000A5 +:10DEB00000000000000030000090000000000000A2 +:10DEC0003000000000000000000000000000000022 +:10DED0000000000000000000000000100000000032 +:10DEE00000000000000005610A08050100A0000014 +:10DEF00000000000000000610000000100000000C0 :10DF00000000000000000000000000000000000011 :10DF10000000000000000000000000000000000001 :10DF200000000000000000000000000000000000F1 :10DF300000000000000000000000000000000000E1 :10DF400000000000000000000000000000000000D1 :10DF500000000000000000000000000000000000C1 -:10DF600000000000000000000000000000000000B1 -:10DF7000303030300000000055CF55FF0000FFFF6B -:10DF8000000F000000FF0000000000000000000083 +:10DF60000000000000000000FFFF3F3FC000FCFF7A +:10DF700000000000000000005555F505B0B0F1F1BB +:10DF80000000000000000000000000000000000091 :10DF90000000000000000000000000000000000081 :10DFA0000000000000000000000000000000000071 :10DFB0000000000000000000000000000000000061 :10DFC0000000000000000000000000000000000051 :10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000000000000031 -:10DFF00000003C303C3C0000000055C355F3B4F534 -:10E00000B4F5000000000B0B282800000000000001 +:10DFE0000000000000000000000000003030C00011 +:10DFF000FCFF00000000000000005555F505B0B022 +:10E00000F1F100000000000000000000000000002E :10E010000000000000000000000000000000000000 :10E0200000000000000000000000000000000000F0 :10E0300000000000000000000000000000000000E0 :10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 -:10E070000000000041FFF3F30000000000AA28AAFE -:10E080000000C3DF000000000B0B28280000000088 +:10E06000000000000000000000000000555555555C +:10E07000A0AFAAAA00000000000000003C3CFC0C7D +:10E08000A0AFAAAA000000000000000000000000ED :10E090000000000000000000000000000000000080 :10E0A0000000000000000000000000000000000070 :10E0B0000000000000000000000000000000000060 :10E0C0000000000000000000000000000000000050 :10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 -:10E0F00000000000000041FFF0F000000000FFFF02 -:10E100002FAF0000C3D70000000000000000000097 -:10E1100000000000000000000000000000000000FF -:10E1200000000000000000000000000000000000EF -:10E1300000000000000000000000000000000000DF -:10E1400000000000000000010000000000000000CE -:10E1500000000000000000000000000000000400BB -:10E1600000000000000000000000000000000000AF -:10E17000000000000000000000000000000000801F -:10E18000000000000000008000000000000000000F +:10E0E0000000000000000000000000000000555586 +:10E0F000FF00A0AFAAAA00000000000000003C3C06 +:10E10000FC0CA0AFAAAA0000000000000000000064 +:10E1100000000000020000000000000000000000FD +:10E1200020000400000000000000000000000400C7 +:10E1300000000000200000000000000000000000BF +:10E14000200020000000000200000000000000008D +:10E15000209100800010200000000000000000005E +:10E1600088000000200002040000000000040004F9 +:10E17000200000000000200084808400000084044F +:10E1800021000000008420040000000000000000C6 :10E19000000000000000000000000000000000007F :10E1A000000000000000000000000000000000006F :10E1B000000000000000000000000000000000005F :10E1C000000000000000000000000000000000004F -:10E1D000000000000000000000000000000000003F +:10E1D00000000002000400010000008400000000B4 :10E1E000000000000000000000000000000000002F -:10E1F000000000000000000000000000000000001F -:10E200000002000000000000000201000200910076 -:10E2100000000200000000002000020000000000DA -:10E2200000000000000000000000000000000000EE +:10E1F0000000000000000000000000020000040019 +:10E2000000002000000000040000000000000000EA +:10E2100000100000000000000000000000000000EE +:10E2200000000000020000000000000002000000EA :10E2300000000000000000000000000000000000DE :10E2400000000000000000000000000000000000CE :10E2500000000000000000000000000000000000BE -:10E2600002000000000000008200820004000000A4 -:10E270000200000000000000040000000000000098 -:10E2800000004000020000000000400020000000EC -:10E2900020000210000000000000801000000000BC -:10E2A000000000000000000000000000000000006E -:10E2B000000000000000000000000000000000005E -:10E2C000000000000000000000000000000000004E -:10E2D000000000000000000000000000000000003E -:10E2E000000000000000040000000000000000002A -:10E2F000040000000000000000000000000000001A -:10E3000000000000800000000000000080000020ED -:10E3100000000000000000000005000000000000F8 +:10E26000000000000000000000000000000082002C +:10E27000000000000000000000000000000000009E +:10E2800010000000000000000041000000840000B9 +:10E29000000000000000000800000000000800006E +:10E2A0000008000000000000000000000000000066 +:10E2B000000000000000001000000000004000000E +:10E2C000001000000000001000000000000000002E +:10E2D000040000000000000000000000000000003A +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000041A +:10E30000000080040008000000040000020000007B +:10E3100000000000000000000000000000000010ED :10E3200000000000000000000000000000000000ED :10E3300000000000000000000000000000000000DD :10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD -:10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000900000000D -:10E38000000000000000000000210000000000006C -:10E39000000100000000000000000000000000007C -:10E3A000000000000000000000000000000000006D +:10E36000000082000000000000000021000000000A +:10E37000000800000000000000000008000000008D +:10E38000400000000000000000002000008020008D +:10E39000000000000000000000000000000000007D +:10E3A0000000000000000000000000080000000065 :10E3B000000000000000000000000000000000005D :10E3C000000000000000000000000000000000004D -:10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D -:10E3F0000000000000000000004000A000000084B9 -:10E4000000C0000200880008089009000000110008 -:10E41000008800410004000000040000000000002B +:10E3D0000000000000000000000000000082008437 +:10E3E0000000000000000000000000000008000025 +:10E3F000000000000000000000000000000000001D +:10E4000000008000000000000004004080080004BC +:10E410008008000000000000000000000000000074 :10E4200000000000000000000000000000000000EC :10E4300000000000000000000000000000000000DC :10E4400000000000000000000000000000000000CC -:10E450000000000000000040000000040000000078 -:10E4600000000000000000000000000000000400A8 -:10E47000000000400000000000000000000000005C -:10E48000000000000020000000000000001100005B -:10E490000000000000000000000000010004000077 -:10E4A0000000000400000000000000000000000068 +:10E45000000000000000020000000000208000001A +:10E46000000900000000000000000000000008009B +:10E47000000000000000000000000000000000009C +:10E48000000000000000000020400000000000002C +:10E49000080000080000000000000000000000006C +:10E4A0000000000000000000000000000000040068 :10E4B000000000000000000000000000000000005C :10E4C000000000000000000000000000000000004C -:10E4D000000000000000000000000000000000003C +:10E4D000000000000000000000000000000000023A :10E4E000000000000000000000000000000000002C :10E4F000000000000000000000000000000000001C :10E50000000000000000000000000000000000000B -:10E51000000000000000002001C1A12008900000C0 -:10E5200000050000000000000000000000000000E6 +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB :10E5300000000000000000000000000000000000DB :10E5400000000000000000000000000000000000CB :10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000000000000AB +:10E560000000200000000000000800000000000083 :10E57000000000000000000000000000000000009B -:10E580000000820000000000000000000000000009 -:10E5900000000000000000000401022008018021AA -:10E5A000000000000000000000000000000021004A +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B :10E5B000000000000000000000000000000000005B :10E5C000000000000000000000000000000000004B :10E5D000000000000000000000000000000000003B -:10E5E000000000000000000000000000000000002B -:10E5F00000000000000000000000000820040000EF -:10E6000020001102058840040090008400000000F2 -:10E610000000008800020010200000114000C1042A -:10E620000040000400090004400200000020000037 +:10E5E0000000000080840000000000000000000027 +:10E5F0000000000000000000020000000000000019 +:10E600000000000003000000000000C0000000083F +:10E6100000000040000000080002000000000000B0 +:10E6200000000000000000000000000000000000EA :10E6300000000000000000000000000000000000DA :10E6400000000000000000000000000000000000CA -:10E6500000000000000000000000000000000000BA -:10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000000000000009A -:10E680000000000000008200000000000000000008 -:10E6900000080200000300000000880020000000C5 -:10E6A0000400000100000000000000000000000065 +:10E6500000000000000000000000000000000200B8 +:10E660000000000000000000000000000021000980 +:10E67000000800080000000000000000000000008A +:10E680000000000000000000400000000000020048 +:10E690000000020008000000000000000000000070 +:10E6A000000000000000000000000000000000006A :10E6B000000000000000000000000000000000005A :10E6C000000000000000000000000000000000004A :10E6D000000000000000000000000000000000003A :10E6E000000000000000000000000000000000002A :10E6F000000000000000000000000000000000001A :10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000010E9 -:10E7200000010808A0900000010082000000000025 +:10E7100000000000200000000000000000000000D9 +:10E7200000000000000000000000000000000000E9 :10E7300000000000000000000000000000000000D9 :10E7400000000000000000000000000000000000C9 :10E7500000000000000000000000000000000000B9 -:10E7600000000000000000000000000000000000A9 +:10E7600000000000000000000008004000A10009B7 :10E770000000000000000000000000000000000099 :10E780000000000000000000000000000000000089 -:10E7900000000100C00000000000010004000000B3 -:10E7A0000003050200830088000041000000000013 +:10E790000001000100010001000000000000000075 +:10E7A0000000000000000000000000000000000069 :10E7B0000000000000000000000000000000000059 :10E7C0000000000000000000000000000000000049 :10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000000000000000000000029 -:10E7F0000000000000000000000000000000000019 +:10E7E00000000000000000000000008000850084A0 +:10E7F0000084000000000000000000000000000095 :10E800000000000000000000000000000000000008 -:10E8100000000000040000000000000002000000F2 -:10E820000000838021000300C00000000000000001 +:10E810000000004100210010002000000000110055 +:10E8200000000000000000000000000000000000E8 :10E8300000000000000000000000000000000000D8 :10E8400000000000000000000000000000000000C8 :10E8500000000000000000000000000000000000B8 :10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 +:10E870000020001000000000000000000000000068 :10E880000000000000000000000000000000000088 -:10E8900000000000030004002000200020002000F1 -:10E8A000040004000804A1840400C18400000000E6 +:10E890000000000000000000000000100004000064 +:10E8A0000004000000000000000000000000000064 :10E8B0000000000000000000000000000000000058 :10E8C0000000000000000000000000000000000048 :10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 +:10E8E00000000000000000000000000000000088A0 +:10E8F0000008008900000000000000000000000087 :10E900000000000000000000000000000000000007 -:10E9100000000000000000000000010001000100F4 -:10E9200001000100010000900100051109410000F3 +:10E9100000000000000000100000000000010001E5 +:10E9200000000001000000000000000000000000E6 :10E9300000000000000000000000000000000000D7 :10E9400000000000000000000000000000000000C7 :10E9500000000000000000000000000000000000B7 :10E9600000000000000000000000000000000000A7 -:10E970000000000000000000000000000000000097 +:10E97000A0000010010802100000000000000000CC :10E980000000000000000000000000000000000087 -:10E99000000000000000000000010001C0010001B3 -:10E9A0000000000100010001048040030585A10270 -:10E9B000000000050005004000000000000000000D +:10E990000000000000000000000000000000000077 +:10E9A0000000040000000000000000000000000063 +:10E9B0000000000000000000000000000000000057 :10E9C0000000000000000000000000000000000047 :10E9D0000000000000000000000000000000000037 :10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 +:10E9F00000008000098020809000000000000000DE :10EA00000000000000000000000000000000000006 -:10EA10000000000000000000000000200040002175 -:10EA200000030004000400210020028402C00280D0 -:10EA30000540000000000000000000000000000091 +:10EA100000000000000000000000000004000500ED +:10EA20000000000080000000050000000000000061 +:10EA300000000000000000000000000000000000D6 :10EA400000000000000000000000000000000000C6 :10EA500000000000000000000000000000000000B6 :10EA600000000000000000000000000000000000A6 -:10EA70000000000000000000000000000000000096 +:10EA700000000000080411000500890000000000EB :10EA80000000000000000000000000000000000086 -:10EA900000000000000000000000000000800005F1 -:10EAA00000000004000000000000000501C1010892 -:10EAB00001900001000000000000000000000000C4 +:10EA90000000000000000000000000004000100026 +:10EAA000080002000000000000000000000000005C +:10EAB0000000000000000000000000000000000056 :10EAC0000000000000000000000000000000000046 :10EAD0000000000000000000000000000000000036 :10EAE0000000000000000000000000000000000026 -:10EAF0000000000000000000000000000000000016 +:10EAF0000000000000000001030089000900000080 :10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000040B5 -:10EB20000000000000000084000000000000608180 -:10EB300000E007008400600000E0000060000000CA +:10EB100000000000000000000000000000000100F4 +:10EB200000000100000000000000000000000000E4 +:10EB300000000000000000000000000000000000D5 :10EB400000000000000000000000000000000000C5 :10EB500000000000000000000000000000000000B5 :10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000000095 +:10EB70000000000000000000810000E00000000034 :10EB80000000000000000000000000000000000085 :10EB90000000000000000000000000000000000075 -:10EBA0000000000000000000000000000000000065 +:10EBA0000000000000000000000000E00000000085 :10EBB0000000000000000000000000000000000055 :10EBC0000000000000000000000000000000000045 :10EBD0000000000000000000000000000000000035 :10EBE0000000000000000000000000000000000025 -:10EBF0000000000000000000000000000000000015 +:10EBF00000000000000000000000E3C3E3C3F000D9 :10EC00000000000000000000000000000000000004 :10EC100000000000000000000000000000000000F4 :10EC200000000000000000000000000000000000E4 -:10EC30000000000000003C3C3C0000000000000020 +:10EC300000000000000000000000000000000000D4 :10EC400000000000000000000000000000000000C4 :10EC500000000000000000000000000000000000B4 :10EC600000000000000000000000000000000000A4 -:10EC70000000000000000000000000000000000094 -:10EC80000000000000000000000000000000000084 +:10EC7000000000000000000000000000E3C3E3C348 +:10EC8000F000000000000000000000000000000094 :10EC90000000000000000000000000000000000074 :10ECA0000000000000000000000000000000000064 :10ECB0000000000000000000000000000000000054 @@ -126704,120 +126704,120 @@ :10ED00000000000000000000000000000000000003 :10ED100000000000000000000000000000000000F3 :10ED200000000000000000000000000000000000E3 -:10ED30000000000000000404242430F09190000042 +:10ED300000000000000000000000000000000000D3 :10ED400000000000000000000000000000000000C3 :10ED500000000000000000000000000000000000B3 :10ED600000000000000000000000000000000000A3 :10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000000083 +:10ED8000FFDFFFFF000000000000000000000000A7 :10ED90000000000000000000000000000000000073 :10EDA0000000000000000000000000000000000063 -:10EDB00000000000000000000404242400009999D1 +:10EDB0000000000000000000000000000000000053 :10EDC0000000000000000000000000000000000043 :10EDD0000000000000000000000000000000000033 :10EDE0000000000000000000000000000000000023 :10EDF0000000000000000000000000000000000013 -:10EE00000000000000000000000000000000000002 +:10EE00000000FF0FFF0F00000000000000000000E6 :10EE100000000000000000000000000000000000F2 :10EE200000000000000000000000000000000000E2 -:10EE30000000000000000000000005614A3AC50122 -:10EE400000A500610006C0090000000000000000ED +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 :10EE500000000000000000000000000000000000B2 :10EE600000000000000000000000000000000000A2 :10EE70000000000000000000000000000000000092 -:10EE80000000000000000000000000000000000082 +:10EE80000000000000613004C00D00000000000020 :10EE90000000000000000000000000000000000072 :10EEA00000000000000000000000000000610006FB -:10EEB000000D000000610006000D0000C3C0C3800B -:10EEC000F0F0F0F0000000005F0F0F0F00000000F6 +:10EEB000000D000000610007000D000000000000D0 +:10EEC0000000000000000000000000000000000042 :10EED0000000000000000000000000000000000032 :10EEE0000000000000000000000000000000000022 :10EEF0000000000000000000000000000000000012 -:10EF00000000000000000000000000000000000001 +:10EF0000000000000000FF00FF0000000000000003 :10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000000000000000000E1 -:10EF300000005540FFC0000000000000FFFFC3C0FC -:10EF4000C380F0FAF0FF000000000F0F0F0F000069 +:10EF200000000000000000000000000000004F4F43 +:10EF30000041000000000000000000000000000090 +:10EF400000000000000000000000000000000000C1 :10EF500000000000000000000000000000000000B1 :10EF600000000000000000000000000000000000A1 :10EF70000000000000000000000000000000000091 -:10EF80000000000000000000000000000000000081 +:10EF80000000000000000000E343C3C300000000D5 :10EF90000000000000000000000000000000000071 :10EFA0000000000000000000000000000000000061 -:10EFB000000000000000AA8000000000F270F27063 -:10EFC000FFC35040F3F0F1F000000000000000002B +:10EFB000FFFFFFFF00000000000000000000000055 +:10EFC0000000000000000000000000000000000041 :10EFD0000000000000000000000000000000000031 :10EFE0000000000000000000000000000000000021 :10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 +:10F000000000000000000000000040004000000080 :10F0100000000000000000000000000000000000F0 :10F0200000000000000000000000000000000000E0 -:10F030000000000000000300020000000000FFC309 -:10F0400000C3FFC30000F3F3F3F30000000000006F +:10F0300000003C3CF505000000000000000000005E +:10F0400000000000000000000000000000000000C0 :10F0500000000000000000000000000000000000B0 :10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 :10F080000000000000000000000000000000000080 :10F090000000000000000000000000000000000070 :10F0A0000000000000000000000000000000000060 -:10F0B00000000000000000000F000A000000000037 -:10F0C00053C353C300000000000000000000000014 +:10F0B000000000000000F505000000000000000056 +:10F0C0000000000000000000000000000000000040 :10F0D0000000000000000000000000000000000030 -:10F0E000020000000000000000000000000000001E -:10F0F0000000000000000000000000000000000010 -:10F1000020000000000200000000000000000000DD -:10F1100000000000000000000000000000000000EF -:10F1200000002000000800000000000002000000B5 -:10F1300000000000000800000000000000000000C7 -:10F1400000000000010000000000000000000000BE +:10F0E000000000000000840000000000000000009C +:10F0F000000000000000000004000000000000000C +:10F1000000000000000000002000000000000000DF +:10F1100000000000000000000000200000000000CF +:10F1200000000004000000002000000000000000BB +:10F1300000000000000800000000200000000004A3 +:10F1400000000404040400000000000000000000AF :10F15000000000000000400000000000000000006F :10F16000000000000000000000000000000000009F :10F17000000000000000400000000000000000004F :10F18000000000000000000000000000000000007F :10F19000000000000002000000000000000000006D -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000004000000000000000000F -:10F1C0000002000000002000020002000000000019 -:10F1D0000000000008000200020000000200000021 -:10F1E000000000000200000000000000000000001D +:10F1A000000000000000000400000000000000005B +:10F1B000000000004000000000000000000000000F +:10F1C0000004000400000000000000000000000037 +:10F1D0000000000000000000000000000000080027 +:10F1E000000002000000000000000000000000001D :10F1F000000000000000000000000000000000000F :10F2000000000000000000000000000000000000FE -:10F2100000000000000002000000000000000000EC -:10F2200000000000000002000200000000000200D8 -:10F2300000000000020002000200040004000000C0 -:10F24000000000000000000000000000004000007E +:10F2100000000000000000000000020002000000EA +:10F2200000000000000000000800000000000000D6 +:10F2300000000000000000000000000002000000CC +:10F24000080000000000A00008000000000000000E :10F2500000000000000000000000000000000000AE :10F26000000000000000000000000000000000009E :10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000002007C +:10F28000000000000000000000000000000000007E :10F29000000000000000000000000000000000006E -:10F2A0000000000000000400000000000000040056 -:10F2B000000000000000000000000000000000004E -:10F2C0000000000000000000000000080000000036 -:10F2D00000000000000000000000820000000000AC +:10F2A000000000000000000000000000000000005E +:10F2B00000000000000004000000000000008000CA +:10F2C00000008082000000000000008200000000BA +:10F2D000000000000000000000000000000000002E :10F2E000000000000000000000000000000000001E :10F2F000000000000000000000000000000000000E :10F3000000000000000000000000000000000000FD :10F3100000000000000000000000000000000000ED -:10F3200000000000000000000000000000000000DD -:10F330009000040040004000000004004000400035 -:10F34000000000000000040000000010040000C0E5 -:10F350000000000000C000000000000000000000ED +:10F3200000000000000000000000000000080000D5 +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD :10F36000000000000000000000000000000000009D :10F37000000000000000000000000000000000008D :10F38000000000000000000000000000000000007D :10F39000000000000000000000000000000000006D -:10F3A000000000000000000000000000000000005D -:10F3B00000000400000000000020000000A0000089 -:10F3C0000020000000000000000802000000000013 -:10F3D00000000000000000000000004000400000AD -:10F3E00000000000000000400000000000000000DD +:10F3A0000000000000400008000000000000000015 +:10F3B000000000000000000000000000000000004D +:10F3C00000000000000000080000008200000400AF +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D :10F3F000000000000000000000000000000000000D :10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC :10F4200000000000000000000000000000000000DC :10F4300000000000000000000000000000000000CC -:10F4400000000000000000000000000000000800B4 +:10F440000040000300000000002000000000004019 :10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C :10F47000000000000000000000000000000000008C @@ -126825,24 +126825,24 @@ :10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C :10F4B000000000000000000000000000000000004C -:10F4C0000000000000000000000000000000000438 -:10F4D0002004000000000000000000000000000008 +:10F4C00000000000000000000000000000820208B0 +:10F4D0000008000400000000000000000000000020 :10F4E000000000000000000000000000000000001C :10F4F000000000000000000000000000000000000C :10F5000000000000000000000000000000000000FB :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB :10F5300000000000000000000000000000000000CB -:10F5400000000000000004000000000000000000B7 -:10F5500000000000000000000000000000000000AB +:10F54000000000000000000000000000000020009B +:10F5500000000000000800000000000000000000A3 :10F56000000000000000000000000000000000009B :10F57000000000000000000000000000000000008B :10F58000000000000000000000000000000000007B -:10F59000000000000000000000000000000000006B -:10F5A000000000000000000000000000000000005B -:10F5B000000000000000000000400000000000000B -:10F5C00000000000000800000000000000104000E3 -:10F5D000001000A0000841000004000900400000E5 +:10F59000000000000000000000C0000000000000AB +:10F5A00000000000000200A00000000000000000B9 +:10F5B000000000000000000000000000000000004B +:10F5C0000000000000000000000020000200009089 +:10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B :10F6000000000000000000000000000000000000FA @@ -126850,15 +126850,15 @@ :10F6200000000000000000000000000000000000DA :10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA -:10F6500000000000000000000000000002000000A8 -:10F660001100000000000000000000000000000089 +:10F6500000000400000000000000000000000000A6 +:10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A :10F68000000000000000000000000000000000007A :10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A :10F6B000000000000000000000000000000000004A -:10F6C000000000000000000000000000000000102A -:10F6D000000000000082000000A000840000000084 +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000A00000000000008A :10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A :10F7000000000000000000000000000000000000F9 @@ -126866,7 +126866,7 @@ :10F7200000000000000000000000000000000000D9 :10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 -:10F7500000000000000000000000010000000000A8 +:10F7500000000000000000000000000000000000A9 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 :10F780000000000000000000000000000000000079 @@ -126874,7 +126874,7 @@ :10F7A0000000000000000000000000000000000059 :10F7B0000000000000000000000000000000000049 :10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000011000400000014 +:10F7D0000000000000000000000000000000000029 :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 :10F8000000000000000000000000000000000000F8 @@ -126882,7 +126882,7 @@ :10F8200000000000000000000000000000000000D8 :10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 -:10F8500000000000000000000000000000000000A8 +:10F850000000800080000008800000000000000020 :10F860000000000000000000000000000000000098 :10F870000000000000000000000000000000000088 :10F880000000000000000000000000000000000078 @@ -126890,7 +126890,7 @@ :10F8A0000000000000000000000000000000000058 :10F8B0000000000000000000000000000000000048 :10F8C0000000000000000000000000000000000038 -:10F8D0000000000000000000000000000000000028 +:10F8D00000000000400010000201C0000000000015 :10F8E0000000000000000000000000000000000018 :10F8F0000000000000000000000000000000000008 :10F9000000000000000000000000000000000000F7 @@ -126907,7 +126907,7 @@ :10F9B0000000000000000000000000000000000047 :10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 -:10F9E00000020010000200090000000000000000FA +:10F9E0000000000000000000000000000000000017 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 :10FA100000000000000000000000000000000000E6 @@ -126915,15 +126915,15 @@ :10FA300000000000000000000000000000000000C6 :10FA400000000000000000000000000000000000B6 :10FA500000000000000000000000000000000000A6 -:10FA6000000000090000000000000000000000008D +:10FA60000000000000000000000000000000000096 :10FA70000000000000000000000000000000000086 :10FA80000000000000000000000000000000000076 :10FA90000000000000000000000000000000000066 :10FAA0000000000000000000000000000000000056 :10FAB0000000000000000000000000000000000046 :10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000000026 -:10FAE0000000000000000000000000000000000016 +:10FAD000000000000000000000000000000000A086 +:10FAE0000010000000000000000000000000000006 :10FAF0000000000000000000000000000000000006 :10FB000000000000000000000000000000000000F5 :10FB100000000000000000000000000000000000E5 @@ -126931,7 +126931,7 @@ :10FB300000000000000000000000000000000000C5 :10FB400000000000000000000000000000000000B5 :10FB500000000000000000000000000000000000A5 -:10FB6000000000000000810000E000000000000034 +:10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 :10FB90000000000000000000000000000000000065 @@ -126955,7 +126955,7 @@ :10FCB0000000000000000000000000000000000044 :10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 -:10FCE0000000000000000000000000000000000014 +:10FCE00000000000000000008E8EFFC30000000036 :10FCF0000000000000000000000000000000000004 :10FD000000000000000000000000000000000000F3 :10FD100000000000000000000000000000000000E3 @@ -126963,7 +126963,7 @@ :10FD300000000000000000000000000000000000C3 :10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000000000000000000093 +:10FD6000000000000000000000008E8E3C0000003B :10FD70000000000000000000000000000000000083 :10FD80000000000000000000000000000000000073 :10FD90000000000000000000000000000000000063 @@ -126971,8 +126971,8 @@ :10FDB0000000000000000000000000000000000043 :10FDC0000000000000000000000000000000000033 :10FDD0000000000000000000000000000000000023 -:10FDE0000000000000000000000000000000000013 -:10FDF00000610007C00900000000000000000000D2 +:10FDE000000000000000000000000000000000050E +:10FDF0000000000000000000000000000000000003 :10FE000000000000000000000000000000000000F2 :10FE100000000000000000000000000000000000E2 :10FE200000000000000000000000000000000000D2 @@ -126980,7 +126980,7 @@ :10FE400000000000000000000000000000000000B2 :10FE500000000000000000000000000000000000A2 :10FE60000000000000000000000000000000000092 -:10FE7000000000000000C0000300000000000000BF +:10FE70000000000000000000000000000000000082 :10FE80000000000000000000000000000000000072 :10FE90000000000000000000000000000000000062 :10FEA0000000000000000000000000000000000052 @@ -127006,71 +127006,71 @@ :10FFE0000000000000000000000000000000000011 :10FFF0000000000000000000000000000000000001 :02000004001FDB -:10000000000000000000820000000000000000006E -:1000100004000000040000000000000000000000D8 -:1000200000000000000020000000000000000000B0 -:100030002000000020000000000000000000000080 -:10004000000200000000000020000000000000008E -:100050000000200000002000000000000000000060 -:100060000000000000000000200000000000000070 -:100070000000200002002000081000000000000026 -:1000800000800000000000000002000000000000EE +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:10004000000200000000000000000000000082002C +:10005000000000000400000002000000000000009A +:100060000000000000000000000000000000200868 +:1000700002080000000008080008000090000000CE +:100080000000000000000000000000000000000070 :100090000000000000000000000000000000000060 :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 :1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 -:1000F00000000000000080000000800100000000FF -:1001000000000004000000000000000000000000EB -:1001100000000000000000000000040000000000DB -:1001200000000000000000000000000000000000CF -:1001300000000000020000000000000000000000BD -:1001400000000000000000000000000004000000AB -:10015000000000000000000000000200020000009B -:100160000000020002000200000000000000000089 -:1001700002000000000000000400000002008200F5 -:1001800000000000000000C000C0000000000000EF +:1000E0000000000000000008000000000008000000 +:1000F00000000000000000828000000000000000FE +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000002000000000000000000CD +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:100170000000080000000900024002000810000012 +:10018000000000004000000000000000000000002F :10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F -:1001C00000000000000000000000000000008000AF +:1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F -:1001F00000000000000000000000000000000000FF -:100200000000000000000000880000008200820062 +:1001F00000000000000000008200000180000001FB +:10020000000000000000800000000000000000006E :1002100000000000000000000000000000000000DE :1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000020006E -:1002700000000000000090000400000000000000EA -:10028000000000000000000000000000000000006E +:10025000000000000200000000000000000000009C +:100260000000000000000000000000000000000886 +:10027000000000000000000000000000000000007E +:1002800000009000000000000000000000000000DE :10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E :1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E +:1002E00000A000000000000000000000000000006E :1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000004E9 -:10031000000000000000000000400000000000009D +:1003000000000000008400000008008800000000D9 +:1003100000000000000000000000000000000000DD :1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D -:100360000000000000000000000000000004000089 -:10037000000000000000002000000000000000005D -:10038000004000000000000000000000001011000C -:10039000000000000000000000400000000000001D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000001008400880000000000000200000006D +:10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D -:1003F00000000000000000000040000000000000BD -:1004000000000000000000000000000000000000EC +:1003F00000000000000000000000000000000000FD +:10040000000000C18000004000000000000000006B :1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC @@ -127078,16 +127078,16 @@ :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C -:10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C +:10048000000000000000008000000000004010009C +:10049000002100000000000000000000000000003B :1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C -:1004F00000000000000000200000000000000000DC -:1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000010000000000000DB +:1005100000002000000000000000000000000000BB :1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB @@ -127095,47 +127095,47 @@ :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B -:10059000000000000000200000001100000000002A +:100590000200000000110000000000000000000048 :1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA -:1006100000000000000800000000000000000000D2 +:1006000000000000000000000000080000000000E2 +:1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A -:100680000000000000000000000000000100040065 -:10069000000000000000400000000000000000001A +:100680000000000000000000000090C0009000A0EA +:100690000010000001001000000000000000000039 :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA -:1007000000000000000000000000000000000800E1 -:10071000000000000200040089000000000000004A +:100700000000000000000000000000000080000069 +:100710000080000000000300000000000000000056 :1007200000000000000000000000000000000000C9 :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 -:100780000000000000000000000000000000100059 -:100790000000040040000000000000000000000015 +:1007800000000000000000000000000000008000E9 +:10079000800400A1800000000000000000000000B4 :1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 :1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 -:1007E0000000000000000084000000000000000085 +:1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 -:100810000000020004008900000000000000000049 +:100810004000100004A1C000000000000000001013 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 @@ -127143,56 +127143,56 @@ :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 -:100890000000000100000001010000010001000053 -:1008A0000001000000000000000000000000000047 +:10089000000088080010001009C0000000010000DE +:1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 -:100910000000000000040021002111000040004000 -:100920000011004000000000000000000000000076 +:10091000000000000000000000808880000900083E +:1009200000000009000000000000000000000000BE :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 -:100960000000000000000000000400000000000083 +:100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 -:100990000000000000000082008000000008000449 +:10099000000000000000800280A1000000000000B4 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 :1009D0000000000000000000000000000000000017 -:1009E0000000000000000000000000010000000006 +:1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 -:100A1000000000000000000000C00082000400018F +:100A10000000000000000000C000822184040400E7 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 :100A50000000000000000000000000000000000096 -:100A6000000000000000000000000000000007007F +:100A60000000000000000000000000000000000086 :100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 -:100A900000000000000000000000000000E0000076 -:100AA0008400810000E00000000000000000000061 +:100A9000000000000000000000000000000007004F +:100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 :100AC0000000000000000000000000000000000026 :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 +:100B1000000000000000000000000000F690E7E781 +:100B20008181CBEF00000000000000000000000009 :100B300000000000000000000000000000000000B5 :100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 +:100B90000000000000000000000000000000F690CF +:100BA00081818181CBEF0000000000000000000087 :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 :100BD0000000000000000000000000000000000015 @@ -127208,7 +127208,7 @@ :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 -:100CA000000000000000060F00000000000000002F +:100CA0000000FFDB3F3FC0FCBDBD000000000000B6 :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 :100CD0000000000000000000000000000000000014 @@ -127216,32 +127216,32 @@ :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 +:100D2000000000003C003F3FC0FC8181000000004B :100D300000000000000000000000000000000000B3 :100D400000000000000000000000000000000000A3 :100D50000000000000000000000000000000000093 :100D60000000000000000000000000000000000083 -:100D700000000000000000000008000000A00000CB +:100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 -:100DA0000000000000000061000600090001006171 -:100DB0000007C00900000000000000000000000063 +:100DA000000000000000A000200800900005006185 +:100DB0000006000D00000000000000000000000020 :100DC0000000000000000000000000000000000023 :100DD0000000000000000000000000000000000013 :100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000FF00FFC4 -:100E300000000000303080000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000082820000000000000000AE :100E400000000000000000000000000000000000A2 :100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 :100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000007FC3 -:100EB000007F0000000000000000000000000000B3 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000C0C0000000000000B2 :100EC0000000000000000000000000000000000022 :100ED0000000000000000000000000000000000012 :100EE0000000000000000000000000000000000002 @@ -127249,7 +127249,7 @@ :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 -:100F3000000041410000000000000000000000002F +:100F300000000000000000000000000000000000B1 :100F400000000000000000000000000000000000A1 :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 @@ -127257,32 +127257,32 @@ :100F80000000000000000000000000000000000061 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 -:100FB00000000000004100000000000000000000F0 +:100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000001F0 +:100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000020000000000000000000000000000AE +:1010100000000000000000000000020000001000BE +:10102000100000000005000000000000000800089B +:10103000000000000000000040000400100000005C :101040001000000000000000000000000000000090 :101050000000000000000000000000000000000090 :101060001000000000000000000000000000000070 :101070000000000000000000000000000000000070 :101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A000000010000000000000000002000000002E -:1010B0000000000000020000000200020002000226 -:1010C000000200004000000011400000000000008D +:10109000000000000000000000000000000010023E +:1010A0000000000000000000000000080008000030 +:1010B00000000000000000000000000040004000B0 +:1010C0001000000000000000000000000000000010 :1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF -:1011100000000000000004000000000000000000CB -:10112000000000009000000000000000000004002B -:1011300000000000000000000000000000000200AD -:101140000200900000008000000088010000000004 +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000009000004100000000000000000000DE +:101140000009000000000000000000000000000096 :10115000000000000000000000000000000000008F :10116000000000000000000000000000000000007F :10117000000000000000000000000000000000006F @@ -127296,8 +127296,8 @@ :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE :1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000400BA -:10123000040000000000040004000000000004009E +:1012200000000000000000000000000000000000BE +:10123000000000000000000000000000001100009D :10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E @@ -127305,25 +127305,25 @@ :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E -:1012B000000000000020000000000000000000000E -:1012C00000A00000000000000000008800410008AD -:1012D00000090082000401040000004000000040FA +:1012B000000000000000000000000000000000002E +:1012C0000000000004A00002080000000000000070 +:1012D000000000000000000000000000000000000E :1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD -:10131000000000000040000000000000000000008D +:1013100000000000000000000000000000000000CD :1013200000000000000000000000000000000000BD -:10133000004000000000000000000000004000200D -:101340000000000000000000000000400009000054 -:101350000001000000200004040400000000000060 +:1013300000000000000000410000000490000005D3 +:101340000000200000000800000000000000000075 +:10135000000000000000000000000000000000008D :10136000000000000000000000000000000000007D :10137000000000000000000000000000000000006D :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D -:1013A00000000000004000000000000000000000FD -:1013B00000000000000000000040000000000000ED +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D -:1013D00000400000090000000000000000200000A4 +:1013D000000000000000000000000000000000000D :1013E00000000000000000000000000000000000FD :1013F00000000000000000000000000000000000ED :1014000000000000000000000000000000000000DC @@ -127331,31 +127331,31 @@ :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C -:101450000000000100008200000000000000000108 +:10145000000000000000000000000000000000008C :10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C :1014A000000000000000000000000000000000003C -:1014B0000000000000000000000000000000000428 -:1014C000000000080000000800A00000000000006C -:1014D00000000000008000809000008001800080FB -:1014E00000040000000000000000000000000000F8 +:1014B000000000000000000000000000000000002C +:1014C00000001108008400000900000800000088E6 +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC :1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB :1015200000000000000000000000000000000000BB :1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:10155000000000000000114000040000000404042A -:101560000004000100000000000020000000000056 +:101540000000000000000000000000000000000893 +:10155000200010000000000000000000000000005B +:10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B :1015B000000000000000000000000000000000002B :1015C000000000000000000000000000000000001B -:1015D00000000000001000090088008900080000D9 +:1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB :1016000000000000000000000000000000000000DA @@ -127363,32 +127363,32 @@ :1016200000000000000000000000000000000000BA :1016300000000000000000000000000000000000AA :10164000000000000000000000000000000000009A -:101650000000000000000000004100004002000007 -:101660000000000003000000000000000000000077 +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A :10167000000000000000000000000000000000006A :10168000000000000000000000000000000000005A :10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A :1016C000000000000000000000000000000000001A -:1016D00000000000000000000000000000119180E8 -:1016E000C180000200000004008000000000000033 +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA :1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 :101740000000000000000000000000000000000099 -:1017500000000000000000000000000088880088F1 -:101760009184C10800010084000100040000000011 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 :101780000000000000000000000000000000000059 :101790000000000000000000000000000000000049 :1017A0000000000000000000000000000000000039 :1017B0000000000000000000000000000000000029 :1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000900079 -:1017E00001000000090101008400840000000000E5 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 :1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 @@ -127396,7 +127396,7 @@ :1018300000000000000000000000000000000000A8 :101840000000000000000000000000000000000098 :101850000000000000000000000000000000000088 -:10186000000003002000111102000000000005002C +:101860000000000000000000000000000000000078 :101870000000000000000000000000000000000068 :101880000000000000000000000000000000000058 :101890000000000000000000000000000000000048 @@ -127404,7 +127404,7 @@ :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 -:1018E000000041A1840041801011000000080000A8 +:1018E00000000000000000000000000000000000F8 :1018F00000000000000000000000000000000000E8 :1019000000000000000000000000000000000000D7 :1019100000000000000000000000000000000000C7 @@ -127412,7 +127412,7 @@ :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 :101950000000000000000000000000000000000087 -:101960000000000091890204084009010000000005 +:101960000000000000000000000000000000000077 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 :101990000000000000000000000000000000000047 @@ -127420,15 +127420,15 @@ :1019B0000000000000000000000000000000000027 :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 -:1019E000000000000000500000E0000000000000C7 -:1019F00000E0070000000000000000000000000000 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 :101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 :101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 :101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 -:101A600000000000000000002C2FECEF0000000040 +:101A60000000000000000000000000000000000076 :101A70000000000000000000000000000000000066 :101A80000000000000000000000000000000000056 :101A90000000000000000000000000000000000046 @@ -127436,7 +127436,7 @@ :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 -:101AE000000000000000000000002023E0E30000F0 +:101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 @@ -127444,16 +127444,16 @@ :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 -:101B6000000000000000000000000000DF9ECB8AA3 -:101B700000280082000000000000000000000000BB +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 :101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000005D1C7C -:101BF0004908000000000000000000000000000094 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 :101C000000000000000000000000000000000000D4 :101C100000000000000000000000000000000000C4 :101C200000000000000000000000000000000000B4 @@ -127461,7 +127461,7 @@ :101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 -:101C700000603007C001000505610A0F050D00A0D6 +:101C70000000000000000000000000000000000064 :101C80000000000000000000000000000000000054 :101C90000000000000000000000000000000000044 :101CA0000000000000000000000000000000000034 @@ -127469,7 +127469,7 @@ :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 -:101CF000000000040008FFFF0000000000000000DA +:101CF00000000000000000000000000000000000E4 :101D000000000000000000000000000000000000D3 :101D100000000000000000000000000000000000C3 :101D200000000000000000000000000000000000B3 @@ -127477,7 +127477,7 @@ :101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 :101D60000000000000000000000000000000000073 -:101D70000000000000040008FFFF00000000000059 +:101D70000000000000000000000000000000000063 :101D80000000000000000000000000000000000053 :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 @@ -127485,7 +127485,7 @@ :101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 :101DE00000000000000000000000000000000000F3 -:101DF00000000000000005050A0A5555AA5500001C +:101DF00000000000000000000000000000000000E3 :101E000000000000000000000000000000000000D2 :101E100000000000000000000000000000000000C2 :101E200000000000000000000000000000000000B2 @@ -127493,7 +127493,7 @@ :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 -:101E7000000000000000000000000000AAAA00FF0F +:101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 :101EA0000000000000000000000000000000000032 @@ -127502,13 +127502,13 @@ :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 -:101F000000000000000000000200000000000000CF +:101F000000000000000000000000000000000000D1 :101F100000000000000000000000000000000000C1 -:101F20000000000000000000200000000000000091 +:101F200000000000000000000000000000000000B1 :101F300000000000000000000000000000000000A1 -:101F40000000000000000000000020000000000071 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000020000000000051 +:101F40000000000000000000000000000000000091 +:101F5000000000000005000000000000000000007C +:101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 :101F80000000000000000000000000000000000051 :101F90000000000000000000000000000000000041 @@ -127516,32 +127516,32 @@ :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 :101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 +:101FE00000000000000000000000210000000000D0 :101FF00000000000000000000000000000000000E1 -:102000000000000000000040000000000000000090 +:1020000000000000000000000000000000000000D0 :1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 +:1020200002000000000000000000000000000000AE :1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000900000 +:102040000000000000000000000000000000000090 :102050000000000000000000000000000000000080 -:1020600000009000000000000000000000000000E0 -:102070000000000000000000000000000000000060 -:102080000000008800400004000000000000000084 +:102060000000004000000000000000000000000030 +:102070000000000000100000000000000000000050 +:102080000000000000000000000000000000000050 :102090000000000000000000000000000000000040 :1020A0000000000000000000000000000000000030 :1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000000000000010 :1020D0000000000000000000000000000000000000 :1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000020000000000DE -:10210000000000000000004100000000000000008E +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF :1021100000000000000000000000000000000000BF :1021200000000000000000000000000000000000AF :10213000000000000000000000000000000000009F :10214000000000000000000000000000000000008F :10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F +:102160000000000000000000000000000009000066 +:1021700000000000000090000000000000000000CF :10218000000000000000000000000000000000004F :10219000000000000000000000000000000000003F :1021A000000000000000000000000000000000002F @@ -127550,40 +127550,40 @@ :1021D00000000000000000000000000000000000FF :1021E00000000000000000000000000000000000EF :1021F00000000000000000000000000000000000DF -:102200000000000000000009000000410000000084 -:102210000000001100000040000000090000000064 -:1022200000000000000000000000000000000000AE +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:10222000004000000000000000000000000000006E :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E :10225000000000000000000000000000000000007E -:1022600000000000004000000040000000400000AE -:10227000000000000000000000000004000000401A -:102280000000000000000040000000C00900000045 -:10229000020000902000000000000000000000008C +:10226000000000000000000000000000000000105E +:1022700000000000000000000000100400400010FA +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E :1022B000000000000000000000000000000000001E :1022C000000000000000000000000000000000000E :1022D00000000000000000000000000000000000FE -:1022E00000000000000000000200000000000000EC -:1022F00000000000000000000000000000000000DE -:1023000000000900000000000000000900000000BB -:10231000000040000000000000000000000000007D +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000002000BE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD :1023200000000000000000000000000000000000AD :10233000000000000000000000000000000000009D :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D :10236000000000000000000000000000000000006D :10237000000000000000000000000000000000005D -:1023800000000000000000000000000009000088BC -:1023900000040520000000000000210000000000F3 +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D :1023A000000000000000000000000000000000002D :1023B000000000000000000000000000000000001D :1023C000000000000000000000000000000000000D :1023D00000000000000000000000000000000000FD :1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD -:1024000000000000000000080000000000000000C4 -:102410000000000088000000000000000000000034 +:1023F00000000000000000040000000000000000D9 +:1024000000001100000000000000000000100000AB +:1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC :10243000000000000000000000000000000000009C :10244000000000000000000000000000000000008C @@ -127591,15 +127591,15 @@ :10246000000000000000000000000000000000006C :10247000000000000000000000000000000000005C :10248000000000000000000000000000000000004C -:1024900000C0204002000900008800000504090077 -:1024A00000000000000241000000000000000000E9 +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C :1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C :1024D00000000000000000000000000000000000FC -:1024E00000000000000000400000000000000000AC -:1024F00000040000000000000000000400000200D2 -:1025000000000000000000000000090000000000C2 -:10251000200000000000000000000000000000009B +:1024E00000000000000000000000000000000000EC +:1024F00000000000001000000000000000000000CC +:1025000000000000000000000000001000000000BB +:1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB :10253000000000000000000000000000000000009B :10254000000000000000000000000000000000008B @@ -127697,47 +127697,47 @@ :102B000000000000000000000000000000000000C5 :102B100000000000000000000000000000000000B5 :102B200000000000000000000000000000000000A5 -:102B30000040000000000000004000000000000015 +:102B30000000000000000000000000000000000095 :102B40000000000000000000000000000000000085 :102B50000000000000000000000000000000000075 -:102B60000000000000000000000000030000000062 +:102B60000000000000000000000000000000000065 :102B70000000000000000000000000000000000055 :102B80000000000000000000000000000000000045 -:102B90000000000000000200000000000000000033 -:102BA00000000000000000000000008000000000A5 -:102BB0000000000100000000000000010000000013 +:102B9000000000000000000000000800000000002D +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 :102BC0000000000000000000000000000000000005 :102BD00000000000000000000000000000000000F5 :102BE00000000000000000000000000000000000E5 :102BF0000000000000000000000000400000000095 -:102C000000000000000000000000000000000004C0 -:102C100000900000000000900090000000900090E4 -:102C200000000000009000900000009000200000D4 -:102C300001000000000000000000020000800041D0 -:102C40000000000000840000000000000000000000 +:102C000000000000000000000000000000000000C4 +:102C1000000000000000400040004000C000000034 +:102C20000000000000000000000000900000000014 +:102C30000000000000000000000000000000000094 +:102C40000000000002000000020000000000000080 :102C50000000000000000000000000000000000074 :102C60000000000000000000000000000000000064 :102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 +:102C80000200020000000000000000000000000040 :102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB00000002000000000000000000000000040B4 -:102CC0000000000000C00041000000000000000003 +:102CA0000000004000000000001000000040004054 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 :102CD00000000000000000000000000000000000F4 :102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000200D2 +:102CF00000000000000000000000000000000000D4 :102D000000000000000000000000000000000000C3 -:102D100000000000000003000000000000000000B0 +:102D10000040000000000000000000000000000073 :102D200000000000000000000000000000000000A3 -:102D30000000880000000100900090000000C0002A +:102D30000000000000000000000000000000000093 :102D40000000000000000000000000000000000083 :102D50000000000000000000000000000000000073 :102D60000000000000000000000000000000000063 :102D70000000000000000000000000000000000053 :102D80000000000000000000000000000000000043 :102D90000000000000000000000000000000000033 -:102DA00000004000000000000000000000000000E3 -:102DB00000000000000000002000000000000000F3 +:102DA0000000000000000000000000000000002102 +:102DB0000010000000000000000000000000000003 :102DC0000000000000000000000000000000000003 :102DD00000000000000000000000000000000000F3 :102DE00000000000000000000000000000000000E3 @@ -127745,145 +127745,145 @@ :102E000000000000000000000000000000000000C2 :102E100000000000000000000000000000000000B2 :102E200000000000000000000000000000000000A2 -:102E300000000000000090001000001100002000C1 -:102E40002000000500040004000000400000000015 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000001131 -:102E900000110000000000000000000000400002DF -:102EA000000000000000000000040000000000001E -:102EB00000000005000900041140910003002000FB -:102EC0008000C10441000001000003004000000038 +:102E7000000000000008000000000000000000004A +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000100100000000000000000011 +:102EB0000000000000020008000000000000000008 +:102EC0000000000000000000000000000000000002 :102ED00000000000000000000000000000000000F2 :102EE00000000000000000000000000000000000E2 :102EF00000000000000000000000000000000000D2 -:102F000000000004000000000000000000000000BD -:102F10000090000000000000000000000000000021 -:102F20000000000000880000000000000000000019 -:102F3000000000000000000000000000C0809000C1 -:102F40004140000000000000A0000000000000114F +:102F000000000000000000000000000000000000C1 +:102F10000000000000000000000000000000009021 +:102F200000000000000000084000000000000082D7 +:102F3000000000000000020000000000000000008F +:102F40000000000000000000000000000000000081 :102F50000000000000000000000000000000000071 :102F60000000000000000000000000000000000061 :102F70000000000000000000000000000000000051 :102F80000000000000000000000000000000000041 :102F90000000000000000000000000000000000031 :102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000809 -:102FC0000090A001000000000000000000000000D0 +:102FB0000000000000000008000000000000000009 +:102FC0000000000000000000000000000000000001 :102FD00000000000000000000000000000000000F1 :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 :1030000000000000000000000000000000000000C0 :1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:1030300000000000000000000000000000009005FB -:1030400090C0000509048404A0040104820000006B -:1030500001000082001100000000000000000000DC +:10302000000000000000000000840000000000001C +:103030000008000800000000000000000000000080 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 :103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000024100908800000009002000094033 -:1030D00002022000080404000000030002000000B7 +:1030B0000000000800080000000000000000000000 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 :1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000400000000BB -:10311000000000000000000000000000000000406F -:103120000200000000000004000000000290020005 -:103130000200020002040000000000000000008203 -:10314000000401040090A088008800020008010823 -:10315000009001080020009000080000000000001E +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:103120000000001000000000000000000004000883 +:1031300000000000200000000200000000900000DD +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F :10318000000000000000000000000000000000003F :10319000000000000000000000000000000000002F :1031A000000000000000000000000000000000001F -:1031B00000000000000000000000000010000000FF -:1031C00000001000118000000500000020800000B9 -:1031D0000200000011000080030000000000000059 +:1031B000020000000000000000000000000000000D +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE :1032100000000000000000000000000000000000AE :10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000008000000900A1000980000005C6 -:1032500000A1000900000040001000020000000072 +:10323000020000000000000000000000000000008C +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E :10327000000000000000000000000000000000004E :10328000000000000000000000000000000000003E :10329000000000000000000000000000000000002E :1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C00080008000800080008400848200C0C09064 -:1032D00000000002004000000000002100910000FA +:1032B000800080008002000000000000000000008C +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE :1032F00000000000000000000000000000000000CE :1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000008000800A000900008010801020128 -:103350000901200004000000100004000400000027 -:103360000800000000000000000000000000000055 +:10333000000040008200080010840000000000002F +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D :1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C000000000000088000800A000020004800443 -:1033D00080040441000080000000C00080008000E4 -:1033E00000000500000000000000000000000000D8 +:1033B0000000000000000000080000010000000004 +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD :1033F00000000000000000000000000000000000CD :1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC :10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C -:1034400000000000000000000000000000008000FC -:10345000000000000000000000000000800080105C -:1034600000008000000000000000000000000000DC +:1034300000000000000000410009801000040000AE +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C :10347000000000000000000000000000000000004C :10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C :1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C +:1034B000000000000000000000000080000000008C :1034C00000000000000000000000000000000000FC -:1034D000400004A088848800A000A000900008009C -:1034E0000400A000400040000000000000000000B8 +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC :1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB :10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000A0DB -:103550000000000000E000000000000000E00000AB -:103560000000000000E0000000000000000000007B +:103530000000000000000000000000000008000281 +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B :10357000000000000000000000000000000000004B :10358000000000000000000000000000000000003B :10359000000000000000000000000000000000002B :1035A000000000000000000000000000000000001B :1035B000000000000000000000000000000000000B :1035C00000000000000000000000000000000000FB -:1035D00007000000F7C7F4C400000000FC0CFC0C5E -:1035E00000000000FF66B4B400000000000000000E +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB :1035F00000000000000000000000000000000000CB :1036000000000000000000000000000000000000BA :1036100000000000000000000000000000000000AA :10362000000000000000000000000000000000009A :10363000000000000000000000000000000000008A :10364000000000000000000000000000000000007A -:103650000000000000003707340400000000F6F608 -:103660000606000000009900B4B40000000000004D +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A :10367000000000000000000000000000000000004A :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A :1036C00000000000000000000000000000000000FA -:1036D00000000000000000080000000000000000E2 +:1036D00000000000000000000000000000000000EA :1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 @@ -127891,47 +127891,47 @@ :103720000000000000000000000000000000000099 :103730000000000000000000000000000000000089 :103740000000000000000000000000000000000079 -:10375000000000000000000000000737C7F74040ED -:103760002020427E427E0000000006F606F60000A1 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 :103780000000000000000000000000000000000039 :103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000F0FFFFF0434C4F4DD -:1037E000000000000C0CCFCF0000000030303F3F45 +:1037C0000000000000000000FFBD0F0D0000000021 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 :1037F00000000000000000000000000000000000C9 :1038000000000000000000000000000000000000B8 :1038100000000000000000000000000000000000A8 :103820000000000000000000000000000000000098 :103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:10385000000000000000000000000300F3F0006121 -:103860003007000D000500613007000D0000006109 -:103870003007000D00000000000000000000000004 +:103840000000000000000000000099BD090D00000C +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 :103880000000000000000000000000000000000038 :103890000000000000000000000000000000000028 :1038A0000000000000000000000000000000000018 :1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 +:1038C000000000000000000000610006000D000084 :1038D00000000000000000000000000000000000E8 -:1038E00000000000000100040000000000000000D3 +:1038E00000000000000000000000000000000000D8 :1038F00000000000000000000000000000000000C8 :1039000000000000000000000000000000000000B7 :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 -:103960000000000000000001000400000000000052 +:1039400000000000000000000000000000004F4FD9 +:103950004F00000000000000000000000000000018 +:103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 :103980000000000000000000000000000000000037 :103990000000000000000000000000000000000027 :1039A0000000000000000000000000000000000017 :1039B0000000000000000000000000000000000007 :1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 +:1039D0007F7F7F000000000000000000000000006A :1039E00000000000000000000000000000000000D7 :1039F00000000000000000000000000000000000C7 :103A000000000000000000000000000000000000B6 @@ -127948,225 +127948,225 @@ :103AB0000000000000000000000000000000000006 :103AC00000000000000000000000000000000000F6 :103AD00000000000000000000000000000000000E6 -:103AE0000000000000000000000000000000008056 -:103AF0000000000000000040000000000000004046 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000C00020002000C6 :103B000000000000000000000000000000000000B5 :103B100000000000000000000000000000000000A5 -:103B20000000000000000000000100000000000094 -:103B30000000000000000000000000000000020083 -:103B40000000000000000200000000000000000073 -:103B500000000000000000000000000082000000E3 -:103B60000200000000002000000000000000000033 -:103B70000040000000000000000100000000000004 -:103B80000001000000000000000000000000000034 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000040000100000034 +:103B500000000000400000004000000000000000E5 +:103B600084000000000000000000000000000000D1 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 :103B90000000000000000000000000000000000025 :103BA0000000000000000000000000000000000015 :103BB0000000000000000000000000000000000005 -:103BC0000000000000000000000000000000008273 -:103BD0000000000000000000008200000000000063 -:103BE00000000000000000000000000001000000D4 -:103BF0000000018000000000000000000041000003 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000002000000A2 +:103BC0000000000000000000000000008000400035 +:103BD00000000000000080000000800000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000200B2 +:103C100000000000000000000000000000000000A4 :103C20000000000000000000000000000000000094 :103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 +:103C40000010000000000000000000000000000064 :103C50000000000000000000000000000000000064 -:103C6000000000000000000000000000000002C092 -:103C700000000000044000000000000000080000F8 -:103C800000000000004000000000000000000000F4 -:103C9000000000000000000000000000000800001C -:103CA0000000000000000000000000000000000014 -:103CB000000000000000020000000000000000887A -:103CC00000080000000000400000000000000008A4 -:103CD00000000000000000000000000000000000E4 -:103CE00000080000000000000000000000000008C4 -:103CF0000100000000002000200000000000000083 -:103D00000000000000000000008000000000000033 +:103C60000000000000000000000000000000000054 +:103C70000000000000000008000000080000000034 +:103C80000000000000000008000000000008000024 +:103C90000000000000000008000000080000000014 +:103CA0000000000000000008000000000008000004 +:103CB00000000000000000000008000000080000F4 +:103CC00000000008000000000008000000000004E0 +:103CD0000000000008000000000800000040000094 +:103CE0000000004000000084001000000000000000 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 :103D100000000000000000000000000000000000A3 :103D20000000000000000000000000000000000093 :103D30000000000000000000000000000000000083 :103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000020000000000800080004100000000 -:103D80000000000000000000000000200000000013 +:103D50000000000000000000000000008800880053 +:103D6000000000040005002100000005000500001F +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 :103D90000000000000000000000000000000000023 :103DA0000000000000000000000000000000000013 :103DB0000000000000000000000000000000000003 :103DC00000000000000000000000000000000000F3 :103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 -:103DF000000000A00209004120910005400240029D -:103E00000009820000000000000501000000000918 +:103DE000000000000000000000A000000000000033 +:103DF00000000000000000000000000000000000C3 +:103E00000000000000000000000000000000200092 :103E100000000000000000000000000000000000A2 :103E20000000000000000000000000000000000092 :103E30000000000000000000000000000000000082 :103E40000000000000000000000000000000000072 -:103E500000000000000000000000000088000000DA -:103E60000000000000000000000000000000884189 -:103E700000000000001180000000A0200000099058 -:103E8000000040000000200000000000208800002A -:103E90000000000000000000000000000000000022 -:103EA000000000000000000000000000000000848E +:103E5000000000000000000000030021000000A19D +:103E60000000000200050000100500001000000026 +:103E70000000000000000000000000000000000042 +:103E800000000000000000004100000000000000F1 +:103E9000000400000000000000000000000000001E +:103EA0000300000000000000000800000000000007 :103EB0000000000000000000000000000000000002 -:103EC0000000090000000000000000000084000065 -:103ED0000084000011000900000000000000000044 -:103EE000110002000900000000000004000003406F -:103EF00000400000000000040380200005800480D2 -:103F000000000000C00000000100000000040003E9 -:103F10000000001100200000000000000000000070 +:103EC00000000000000000000000000000000000F2 +:103ED00000820000000000000000000000000082DE +:103EE0000002000000850000020000082088004059 +:103EF0000082000009000000000000000000000037 +:103F000000000000080000000000000000000000A9 +:103F100000000000000000000000000000000000A1 :103F20000000000000000000000000000000000091 :103F30000000000000000000000000000000000081 :103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000800000000000049 -:103F700000000000000000000000A040800084203D -:103F8000C0200000000041000000200041000301AB -:103F90000000000000000001000000000000000020 +:103F50000000000000000000000000000000401011 +:103F60002002002100110041000000000005002196 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 :103FD00000000000000000000000000000000000E1 :103FE00000000000000000000000000000000000D1 -:103FF000000000000000000400000000000000417C -:104000000100000040004080000483020000000026 -:1040100000020011000000200002008000000000EB +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 :104020000000000000000000000000000000000090 -:10403000000000000000000000000000000000413F +:104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 -:10405000000000000000000000000040000000031D -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000040000900000000400002000000078 -:10409000098820000288000000890000002000003C -:1040A0000000000000000000000000000008000800 -:1040B00000000000000800000000000000080000F0 -:1040C000000000000000000000000000000000C030 -:1040D00000080000008400400000000020000208EA -:1040E000020400C0000400901100110000880000CC -:1040F000110020400890110400000000000000049E -:10410000898800080104909000880088000200025D -:1041100000A0080201900010000000000000000054 +:104050000000000000000000000000000000000060 +:104060000080000000800000000000020005000940 +:10407000000500040004000000080000000000002B +:104080000000000000000000000000000000000030 +:1040900041000800080000000000000000000000CF +:1040A0000000000000000000000000000000000010 +:1040B00008000800080000000000000000000000E8 +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000080000000000C0000018 +:1040E0000000000200102008000000000085009081 +:1040F00000002000004000000000000000820200DC +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F :10413000000000000000000000000000000000007F :10414000000000000000000000000000000000006F :10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F +:104160000000000001010000000100000000C0018B :10417000000000000000000000000000000000003F -:1041800000008980000020808080000000000980FD -:1041900000804000808020000080000000000000BF +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F :1041A000000000000000000000000000000000000F :1041B00000000000000000000000000000000000FF :1041C00000000000000000000000000000000000EF :1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:10420000000000000020008300848080000200A0E5 -:1042100000A000000005002100890000000000004F +:1041E000000000000002084000040009000800036D +:1041F00000100009000000000000000000000000A6 +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E :10422000000000000000000000000000000000008E :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E :10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:1042800000000000000000010003004190900001C8 -:104290000003009100000000008200820000000086 -:1042A000004000000040000000000000000000008E +:10426000000000000000108010000500112109006E +:1042700009000800411100000000000000000000DB +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E :1042B00000000000000000000000000000000000FE :1042C00000000000000000000000000000000000EE :1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:10430000000000000000000088000400009002C0CF -:1043100090008200000008004000040000008800B7 -:10432000000000008200000000000000000000000B +:1042E00000000000000000000010000001000005B8 +:1042F0000088000001000100000000000000000034 +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D :10433000000000000000000000000000000000007D :10434000000000000000000000000000000000006D :10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:1043800000000000000000000000000000000080AD -:104390008980000000000000C000000080000000D4 -:1043A00005004000000000000000000000000000C8 +:10436000000000000000000000000001000000004C +:10437000000000000000010001000000000000003B +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D :1043B00000000000000000000000000000000000FD :1043C00000000000000000000000000000000000ED :1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:104400000000000000000000000000008004000226 -:10441000800000008000800080008000800080001C -:10442000000000000000000200000000000000008A +:1043E00000000000000000000000000000080210B3 +:1043F00002090000000003022141401100000000FA +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C :10443000000000000000000000000000000000007C :10444000000000000000000000000000000000006C :10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:104480000000000000000000000000000000040127 -:1044900010010800A000100002000200100002003D -:1044A00090009000A000000000010000000000004B +:10446000000000000000000000000000000041000B +:104470001100210009001009020005001140000090 +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C :1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC :1044D00000000000000000000000000000000000DC :1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC +:1044F000010800000100000000910000010000011F :1045000000000000000000000000000000000000AB -:10451000008100E007000000000000E00000000053 -:10452000000000E0000000000000000007000000A4 +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B :10454000000000000000000000000000000000006B :10455000000000000000000000000000000000005B :10456000000000000000000000000000000000004B :10457000000000000000000000000000000000003B :10458000000000000000000000000000000000002B -:104590000000A0F5A0F55555AA55A03FAF3F00007B -:1045A0000000F0F000FF000000000000000000002C +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB :1045C00000000000000000000000000000000000EB :1045D00000000000000000000000000000000000DB :1045E00000000000000000000000000000000000CB :1045F00000000000000000000000000000000000BB :1046000000000000000000000000000000000000AA -:104610000000000028287D7DAAAA00FFA030AF304E -:1046200000000000AAAA3C3C0000000000000000BE +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A :10463000000000000000000000000000000000007A :10464000000000000000000000000000000000006A :10465000000000000000000000000000000000005A :10466000000000000000000000000000000000004A :10467000000000000000000000000000000000003A :10468000000000000000000000000000000000002A -:104690000000000000007D413F3F0000FFFFDFD32E -:1046A0001F130000000055FF55000000000000002F +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A :1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA :1046E00000000000000000000000000000000000CA :1046F00000000000000000000000000000000000BA :1047000000000000000000000000000000000000A9 -:1047100000000000000000007D4103030000FFFFD7 -:10472000DCD01C10000000000F3C0F3C000000001B +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 :104730000000000000000000000000000000000079 :104740000000000000000000000000000000000069 :104750000000000000000000000000000000000059 :104760000000000000000000000000000000000049 :104770000000000000000000000000000000000039 :104780000000000000000000000000000000000029 -:10479000000000000000000000000061303F004DFC -:1047A000000000613007000D000000613007000DBF -:1047B000000005000A08050000A00000000000003D +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 :1047C00000000000000000000000000000000000E9 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 +:1047F0000000000000000000000000000061000652 +:10480000000D000000610006000D00000000000027 :104810000000000000000000000000000000000098 :104820000000000000000000000000000000000088 :104830000000000000000000000000000000000078 :104840000000000000000000000000000000000068 :104850000000000000000000000000000000000058 :104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 +:1048700000000000000000000000000000000E0F1B +:104880007DFFC30FC30F003C0000000F0A0A0000A9 :104890000000000000000000000000000000000018 :1048A0000000000000000000000000000000000008 :1048B00000000000000000000000000000000000F8 @@ -128174,7 +128174,7 @@ :1048D00000000000000000000000000000000000D8 :1048E00000000000000000000000000000000000C8 :1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 +:104900000E0F0000FF0FFF0F003E0002000F0A0A0B :104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 @@ -128182,187 +128182,187 @@ :104950000000000000000000000000000000000057 :104960000000000000000000000000000000000047 :104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 +:1049800000000000FF00FF3FC30328AA28AA080078 +:10499000AA0000000000000000000000000000006D :1049A0000000000000000000000000000000000007 :1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 :1049D00000000000000000000000000000000000D7 :1049E00000000000000000000000000000000000C7 :1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A2000000000000009000020000000200000003D -:104A30000000000000000000000000000000000076 -:104A400000000080000000002000000000000000C6 +:104A00000000000000000202FF3FFF3F30F03CFFCB +:104A10000A0AAA00000000000000000000000000D8 +:104A20000000000004000000000000002000200042 +:104A30002000200000000000000000000000000036 +:104A400000000080000000000000000000000000E6 :104A50000000000000000000000000000000000056 :104A60000000010000030000000000000000000042 -:104A700000000000000000000000000082000000B4 -:104A8000000000000080880000000080008000809E -:104A900000800080008000820080008020800080F4 -:104AA0000080018000800000000000000000000085 +:104A70000000000000000000000000000000010035 +:104A8000098001801180000000000000000000008B +:104A90000000000000000000000000000000010015 +:104AA0002180018011800000000000000000000053 :104AB00000000000000000000000000000000000F6 :104AC00000000000000400000000000000000000E2 :104AD00000000000000000000000000000000000D6 :104AE00000000000200000000000000000000000A6 :104AF00000000000000000000000000000000000B6 -:104B00000000000000000004000000000040001051 -:104B100000400002000400100011004000400002AC -:104B20000010000804040010000000000000000055 +:104B00000200C0040808A00200000000000000002D +:104B10000000000000000000000000000000000095 +:104B20000220C0101010A0020000000000000000D1 :104B30000000000000000000000000000000000075 :104B40000000000000000000000000000000000065 :104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 +:104B60000000000000000041000000000000000004 :104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA00000000000000000000000000800000008F5 -:104BB00000000008000000000000000000080008DD -:104BC0000008008400840000008400840000008449 -:104BD00000000008000000000000000000840084C5 -:104BE0000084000000000000000000000000000041 +:104B90000000000500000000000000000000000010 +:104BA0000000000000000100000000000000000004 +:104BB00000000008000000000000000000000000ED +:104BC00000000000000800000000000000000000DD +:104BD00000000008000000000000000000000008C5 +:104BE0000000000000820000000000000000000043 :104BF00000000000000800000000000000000000AD -:104C00000000000000000000000800000084000018 -:104C1000000000000008000000000000000000008C -:104C200000000000000000000008000000108800E4 -:104C3000000000098400C0008405004184000000D9 -:104C40000000C00090000000000000000000000014 -:104C50000000000000050005000000020021000027 -:104C60000005000000000000000000000000000837 -:104C700000210021000300000003000000000000EC -:104C800000210021000000000000000000000021C1 -:104C90000021102100000000108004000200100814 -:104CA00020080088000010000200880004000000B6 -:104CB0000000000000000000008400000000000070 +:104C0000000800000000000000000000000000009C +:104C100000000000001000880000000000000000FC +:104C2000001000000084000008840008000000213B +:104C3000000000000000000000050000000000412E +:104C40000000000000000000000000000000000064 +:104C50000000000000000000000000000000000054 +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000003002100 +:104C9000002100000021000000050041004100212A +:104CA00000020000002100080021000808000000A8 +:104CB00000000000000000000300000000000000F1 :104CC00000000000000000000000000000000000E4 :104CD00000000000000000000000000000000000D4 :104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 :104D000000000000000000000000000000000000A3 -:104D10000000000080000000000080208000800073 -:104D200080008000000800008000800000008000FB -:104D30004000A0000400000000000000000400008B -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 +:104D1000000000000000008200A000A000A0000829 +:104D2000000800000000000000000000000000007B +:104D3000820000008200820082000000C0000000AB +:104D4000000000008200820082004000000000009D +:104D500008000000820082008200000000000000C5 :104D60000000000000000000000000000000000043 :104D70000000000000000000000000000000000033 -:104D80000000880002000000000000000000040095 -:104D90000000020000000000000000000000000011 -:104DA00000008800000000000000880000000000F3 -:104DB0000000009011000000000000000000000250 -:104DC0000000000000000000000000900000000053 -:104DD00000000000000008000000080000000000C3 -:104DE0000000009000000000000000000000000033 -:104DF00000000000000000000800000000000000AB +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA00000000000000000000000000000004000C3 +:104DB00000000000000000000000000000000000F3 +:104DC0000000000000000000000000000000008261 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 :104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E2000000000000000000000000084000020409E -:104E30002000000000000000900000004000000082 -:104E40000000000000000000000000000000000062 -:104E5000000000000000000000000000080000004A -:104E60000000000000000000000000000000000042 +:104E1000000000000000000000000000000000A0F2 +:104E200000A000000088000000000000000000005A +:104E300000000000000000000000080000008200E8 +:104E4000000008000000000000000000000000005A +:104E500082000000000000050000A00000008200A9 +:104E6000C00008000000000000000000000000007A :104E70000000000000000000000000000000000032 -:104E800000000041000000410000000000000000A0 -:104E90000000000000000000820000000000C000D0 -:104EA0000000820000000003000500000041000037 -:104EB0000000000000210000009000000000000041 -:104EC0000004000209000088050021000000000025 -:104ED00010000000000000000000000000000000C2 +:104E80000008000000000000000000050000000015 +:104E90000000000000080003004000410000000086 +:104EA000004100100010000000000005000000009C +:104EB00000000000000800000000000000000000EA +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 :104EE00000000000000000000000000000000000C2 :104EF00000000000000000000000000000000000B2 :104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000000000000000004100000000000030 -:104F400082008200880000000000002000040000B1 -:104F50000000000000000000000000000000000051 -:104F600088000000000000000005001100000000A3 -:104F700000110021000800000000000000000000F7 -:104F80000000880000000000000000000000000099 -:104F900000002011900090080000000000000000B8 -:104FA000000090000200000000000011000004005A -:104FB000000000110240000000040000004000005A -:104FC000021000000000110020000000000000009E -:104FD0000000000000000000400000000000000091 +:104F1000000000000000000000C000020088000047 +:104F2000110011000010000000000000000000004F +:104F30000000000000000000000000000000000071 +:104F40000800080008000000000000000008000041 +:104F50000000000000000800000000000000000049 +:104F600008000841080000000000000000000000E8 +:104F70000000000000000000000000000000000031 +:104F80000000000000080000000000000000000019 +:104F900000000008002100080000000000100009C7 +:104FA0000008000000410000000000000021000097 +:104FB0008800002100009021000004000000000093 +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 :104FF00000000000000000000000000000000000B1 :1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:1050300000000000000000042040004000000000CC -:10504000000000000000000000000000010000005F -:1050500000840000000000000000000000000000CC -:10506000000000000100000000000000000000003F -:1050700000C0000000000000000000000000000070 -:10508000000000000000010000000000000000001F -:10509000000000C000000000000000000000000050 -:1050A000010000008583010004000141C082050168 -:1050B000040000C0C082010000000140C0000000E8 -:1050C00000000000000000000000000000000405D7 -:1050D000410000000000000000000000000000008F -:1050E000000000000000410000000000000000027D -:1050F000020000800000000000000000000000002E -:10510000000000000000000041000000000000005E -:10511000000202000080000000000000000000000B -:1051200000414041000040414141004141888480AC -:105130002005A1410080008041410041418580005F -:10514000000040000000000000000000000000001F -:1051500002002100002000000000000000000040CC -:10516000000003000000008000008000000000003C -:10517000090009800080008000000000000000415C -:10518000000000000300000000800000800000001C -:105190000000090004000080000000000000000082 -:1051A00000414100400500410000414111410041E2 -:1051B00000418240008300202080C100A14100C145 -:1051C000004100000100000000000000000000009D -:1051D0000000A100C0A00041C0008200000000004B -:1051E000000100000100000000C0000020000000DD -:1051F000000010000482000890020200000000007D -:105200000001000000000100000000C000002000BC -:10521000000000009000829000089000C000000094 -:1052200000000001000001000085000000010001F5 -:105230000001000109C0C0820001010840002001F6 -:1052400000058201000000000000000000000000D6 -:10525000000000000040000000000000000000000E -:105260000000000000000000C0000000000000007E -:105270000000000000040000020000000000000028 -:1052800000000000000000000000C000000000005E -:105290000000000000000004000002000000000008 -:1052A00000000000000000400001C1820100000079 -:1052B0000000C182040000880000C08501000000D9 -:1052C0000000C1000000000000000000000000001D +:1050100000000000000000000000000009C00000C7 +:105020000090098209000000200002080000000032 +:105030000000000800000000000000000000000068 +:105040000000000000000000000000000000000060 +:105050000040000000000000000000000000000010 +:10506000000000000000000000000000000001003F +:1050700000400000000000000000000000000000F0 +:105080000000000000000000000000000000000020 +:10509000000000C00000000000000010C000000080 +:1050A0000000000000000000000000000000000000 +:1050B000000000C00000000000000040C000000030 +:1050C000000000000000000000000000000040059B +:1050D00004000000000000000000000000000000CC +:1050E00000000000000000000000000000000005BB +:1050F00002000000000000000000000000000000AE +:10510000000000000000000000000000000000009F +:105110000011090000800000000000000280000073 +:10512000000000000000000000000000000000007F +:10513000001102000080000004000000098000004F +:10514000000005000000000000000000000000005A +:10515000030090000080000000000000000000112B +:10516000000003000000000000000000000000003C +:10517000A00090000080000000000000000000047B +:105180000000000009000000000000000000000016 +:1051900000000900400000000000000000000000C6 +:1051A00000110000090000000000000000000000E5 +:1051B00000000900040000000000000000000000E2 +:1051C00000050000000000000000000000000000DA +:1051D0000000A00021A000024000400000000000EC +:1051E00000000000000000000000000000000000BF +:1051F0000000030003A00002400040000000000087 +:10520000000100000000000000000000000000009D +:105210000000000002001104000000000200000075 +:10522000000000000000000000000000000000007E +:1052300000000000C000109000000000020000000C +:10524000000000000000000000000000000000005E +:105250000000000000900000A0000000000000001E +:10526000000000000000000000000000000000003E +:105270000000000000400000A0000000000000004E +:10528000000000000000000000000000000000001E +:10529000000000000000000200000000000000000C +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000020000000000000000EC +:1052C00000000100000000000000000000000000DD :1052D00000000000000000000000000000000000CE -:1052E000000000000000000000008000000000003E -:1052F000000000000000008000000000000000002E -:10530000000000000000000000000000800000001D -:10531000000000000000000000800000000000000D -:10532000000000000000000000800003C085200095 -:1053300000000041C19100000005004103824100CE -:1053400000000021C1050000004080000084000032 -:10535000000000000000000000418000000200008A -:1053600000000000000000000000800000C10000FC -:105370000000000000000000004180400003000029 -:10538000000000000000000000000000800000C1DC -:105390000000000000000000000000418040000309 -:1053A0000000000000000000000085C0804100C136 -:1053B00000004109804141C103C120840000808078 -:1053C000000041410041808003C1000120000041F4 -:1053D0000000000000000000000000410400000187 -:1053E000000000000000000000000000400000C1BC -:1053F0000000000000000000000000C140010001AA -:10540000000000000000000000000000000040005C -:1054100000C10000000000000000000000C14001C9 -:1054200000010000000000000000000040C1200159 -:105430008240000000001001A0C101C121110082C2 -:1054400040C000000001000140C001C10000000098 +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:10531000000000000000000000000000000000008D +:105320000000000009000200000000000000000072 +:10533000000000000000000000000000000000006D +:105340000000000004000000000080050083000051 +:10535000000000000000000000C180000005000007 +:1053600000000000000000000003800000C10000F9 +:10537000000000000000000000C1800000050000E7 +:10538000000000000000000000000000800000910C +:105390000000000000000000000000C1000000004C +:1053A0000000000000098000030900008000009157 +:1053B0000000000000000000000000C1000000002C +:1053C00000000002000080000411000004000083BF +:1053D0000000000000000000000000410400000088 +:1053E000000000000000000000000000200000405D +:1053F0000000000000000000000000410400000068 +:105400000000000000000000000000000000080094 +:105410000010000000000000000000000011020069 +:1054200000000000000000008400010400000800EB +:10543000001000000000000000000000001110003B +:105440000000000000010000400001A0000000007A :10545000000000000000000000000000810000E0EB :1054600000004800000000000000000000000000F4 -:10547000000000420000000000004800810000E041 -:105480000000480000000000000000420000000092 -:105490000000000000420000000000004800810001 -:1054A00000E0000048000000000000000042000092 -:1054B0000000000048420000000000004842411285 -:1054C00000E0070000420000000000004842000029 +:10547000000000000000000000000000810000E0CB +:1054800000004800000000000000000000000000D4 +:10549000000000000000000000000000000081008B +:1054A00000E00000480000000000000000000000D4 +:1054B000000000000000000000000000000081006B +:1054C00000E00000480000000000000000000000B4 :1054D00000000000000000000000000000000000CC :1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC @@ -128383,68 +128383,68 @@ :1055E00000000000000000000000000000000000BB :1055F000DE2E747B000000000000000000000000B0 :10560000000000000000000000000000000000009A -:10561000DE2E0000747B000000000000000000008F +:10561000DE2E0000247B00000000000000000000DF :10562000000000000000000000000000000000007A -:105630000000DE2E252B000000000000000000000E +:105630000000DE24247B00000000000000000000C9 :10564000000000000000000000000000000000005A -:105650000000D4A4615603400000000000000230A6 +:105650000000DE246156034000000000000002301C :10566000A0000000000000000C400000000000004E -:1056700002C06A866156034000000000000002314B -:10568000E0000000000000000C40000000000000EE -:1056900002C06A860000615603400000000000005E +:1056700002C06A866156034000000000000002304C +:10568000A0000000000000000C400000000000002E +:1056900002C06A86000061F60340000000000000BE :1056A0000231E0000000000000000C40000000009B -:1056B000000002C06A8660DE0340000000000000B7 +:1056B000000002C06F8661F6034000000000000099 :1056C0000231E0000000000000000C40000000007B -:1056D000000002C07B060000000000000080000007 -:1056E000000000000040000000000000000000007A +:1056D000000002C06F860000000000000000000013 +:1056E0000000000000008800000000000000000032 :1056F00000000000000000000000000000000000AA -:105700000000000000008400000000000000000015 -:105710000000000000000003000000000000000086 -:105720000000000000000200000000000000040073 -:105730000000000000000000000000000000000069 -:105740000000000000002000000000000000000039 -:105750000000000000000000000000000000002029 -:105760000000000000000001000000000000000038 +:105700000000000000000000000000000000000099 +:105710000000000000000002000000000000000087 +:105720000000000000000000000000000000000079 +:105730000000000000000000000001000000010067 +:105740000000000002000804000000000400000047 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 :105770000000000000000000000000000000000029 :105780000000000000000000000000000000000019 :105790000000000000000000000000000000000009 :1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 +:1057B00000000000000000000000000002000000E7 +:1057C00002000000000080008000000000000000D7 :1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 -:1057F0000000000000410000000000000000000068 +:1057E00000000000000000000000000000000009B0 +:1057F0000000000000000000000000000040000069 :105800000000000000000000000000000000000098 :105810000000000000000000000000000000000088 :105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 :105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860000000000000080000000000000000000030 +:105850000000000800000000000000000000000040 +:105860000000000000000000000000000000000038 :105870000000000000000000000000000000000028 -:105880000000000000880000000000000000000090 +:105880000000000000000000000000000000000018 :105890000000000000000000000000000000000008 :1058A00000000000000000000000000000000000F8 :1058B00000000000000000000000000000000000E8 :1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000000000100C7 -:1058E0002000010020000100010000000000000075 -:1058F0000000008000000000000000000000000028 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 :105900000000000000000000000000000000000097 :105910000000000000000000000000000000000087 -:105920000000000000000005000000000000000072 +:105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 -:105940000000000000000000000000000000000057 -:105950000000000000000000010000004000000006 -:1059600020008000040080002000200000000000D3 -:105970000000000000040000000000000000000023 +:105940000000200002000000A00000000000000095 +:1059500000089000000800000000000000000000A7 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 :105980000000000000000000000000000000000017 -:1059900000000000000000A0000000000000000067 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000021000000B6 -:1059D0000000000000000000000004000000800043 -:1059E000000000000000880000000000000000002F +:105990000000000000000000000000000000000007 +:1059A00000000000001000000000000000000000E7 +:1059B0000000000000000000000000820000000065 +:1059C0000000000080008000000000000082000055 +:1059D000000000000000000000000082000800003D +:1059E00000008200000000009000000000000000A5 :1059F00000000000000000000000000000000000A7 :105A00000000000000000000000000000000000096 :105A10000000000000000000000000000000000086 @@ -128452,137 +128452,137 @@ :105A30000000000000000000000000000000000066 :105A40000000000000000000000000000000000056 :105A50000000000000000000000000000000000046 -:105A600000001000000000002000000020002000C6 +:105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 :105A80000000000000000000000000000000000016 :105A90000000000000000000000000000000000006 :105AA00000000000000000000000000000000000F6 :105AB00000000000000000000000000000000000E6 :105AC00000000000000000000000000000000000D6 -:105AD00000000000000000000000000000000000C6 -:105AE00000000000800001000100008000000000B4 -:105AF00000000100000000C1008000000004000060 +:105AD00000000004000000000000000000000000C2 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 :105B10000000000000000000000000000000000085 :105B20000000000000000000000000000000000075 :105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B500000000000000000000000000000800800BD -:105B600008004100020000000410040000040000CE -:105B700000000000200000000004000400000001FC +:105B40000000000000000000028000000002208829 +:105B500000410803000000400008000000000000B1 +:105B60000000000000000000000000000000000035 +:105B7000000000000000000003000000000003001F :105B80000000000000000000000000000000000015 -:105B900000000000000000000000000021000000E4 +:105B900000000000000000000800000000000000FD :105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000080000002100BC -:105BC00021000000000000000000000000000000B4 -:105BD000000000000000000000C0000000C0001035 -:105BE0000000800088008000000088000000900015 -:105BF00000002000200000008200002000000005BE -:105C0000002000000000000900000000000000006B -:105C10000000000000004000000000000000000044 +:105BB00000000000000000000000000000000000E5 +:105BC0000000000000000000000080100000000045 +:105BD0008008000080820000000121000000000019 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000000084 :105C20000000000000000000000000000000000074 -:105C300000000000000000004000024000000000E2 -:105C40000000000000000000000000000000020052 -:105C50000000000000000000000000000000000044 -:105C600000000000000000000080040000000000B0 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000001000000044 +:105C50002000000088040010000900040011000466 +:105C6000002000080000000000000000000000000C :105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 :105C90000000000000000000000000000000000004 :105CA00000000000000000000000000000000000F4 :105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE0000000000000000000000000208000000014 -:105CF00000000100000000080010008800080000FB +:105CC0000000000000000000000000000000800054 +:105CD00000000000000000000001000000000000C3 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 :105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 :105D20000000000000000000000000000000000073 :105D30000000000000000000000000000000000063 :105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D6000000000000000000008C0011011108402B3 -:105D7000000000004000000000800080050000805E -:105D800000000000400000000000000000000000D3 +:105D5000C141888888881010C0C000400008000237 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 :105DA00000000000000000000000000000000000F3 :105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE0000000000000000000000080002080C000D3 -:105DF00000000004000000400000000400200084B7 -:105E00000000000500000004000000000000000089 +:105DD000000091C0911011808000808000800080C0 +:105DE0000080000000000000000000000000000033 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 :105E10000000000000000000000000000000000082 :105E20000000000000000000000000000000000072 :105E30000000000000000000000000000000000062 :105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E6000000000000000000000000000020000210F -:105E70008080002100010084000000840001008374 -:105E80000011000000000000000100000000000000 +:105E50000000000091008304C091C1208000000375 +:105E60008021000000000000000000000000000091 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 :105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 :105EC00000000000000000000000000000000000D2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000008484AA -:105EF000040110108401010084000400010004006A -:105F00008400000090000000040000000000000079 +:105ED00000000000000008882101A1A109050800B8 +:105EE00088010411A0A000000000000000000000D4 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 :105F20000000000000000000000000000000000071 :105F30000000000000000000000000000000000061 :105F40000000000000000000000000000000000051 -:105F50000000000000000000000000000000000041 -:105F60000000000000000000000000000000000031 -:105F7000C08500A10009C102040000000000040067 -:105F8000800000000000C00000008000000005004C +:105F5000000000000000000002010088038809C161 +:105F6000840000100084850800000000000000008C +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 :105FB00000000000000000000000000000000000E1 :105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF0000000800400A10085049000000020000043 -:106000000000800000008000800000000000000010 +:105FD0000000000000000000000000104109050260 +:105FE000A1C1000000800000098000000000000046 +:105FF00000000000000000000000000000000000A1 +:106000000000000000000000000000000000000090 :106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 :106030000000000000000000000000000000000060 :106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:1060700000000000C104A184A180091000000001FB -:10608000000000000800A000080008000000000058 +:10605000000000000000000000000000C1804104BA +:106060008300C00900008080808080000000000064 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 :106090000000000000000000000000000000000000 :1060A00000000000000000000000000000000000F0 :1060B00000000000000000000000000000000000E0 :1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F000000000000000C100A0A009A08400000072 -:1061000000E007000000000000E0000000000000C8 -:1061100000E000000000000000000000000000009F +:1060D0000000000000000000000000000000C140BF +:1060E000A0A009000901A000080804840200000023 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F :10614000000000000000000000000000000000004F :10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:106170000000000000000000418200E00700600015 -:106180000000000000000000F3F37E420000000069 +:10616000000000E00000820000000000000060006D +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F :1061900000000000000000000000000000000000FF :1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF :1061C00000000000000000000000000000000000CF :1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F00000000000000000000000000166FF808039 -:106200000000000000000000000030307E4200006E +:1061E00000009F8300000F0F09F990910001009FAC +:1061F000FF9F000000000000000000000000000001 +:10620000000000000000000000000000000000008E :10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E :10624000000000000000000000000000000000004E :10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:1062800080990000000000000000000000000000F5 +:10626000000000009F9FFF0000000FFF90900000C3 +:10627000009FFF9F000000000000000000000000E1 +:10628000000000000000000000000000000000000E :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE @@ -128590,73 +128590,73 @@ :1062D00000000000000000000000000000000000BE :1062E00000000000000000000000000000000000AE :1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000027273F -:10631000C3FF0000000000000000000000000000BB +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D :10634000000000000000000000000000000000004D :10635000000000000000000000000000000000003D -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:106380000000FFFFC000400000000000000000000F -:106390002727003C00000000000000000000000073 +:106360000000000000000000F9C100C1FFF0DBD018 +:106370003C3C00FF00300030000000000000000046 +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD :1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000000000000009D -:10640000000000003F7FC0C0C0C005610A0F050D3D -:1064100000A000613007000D000000610007000DC2 +:1063E00000000000000000000000F9C1F9C1FFF04A +:1063F000DBD02C2C009F003090300000000000000B +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C :10642000000000000000000000000000000000006C :10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C :10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000001041003FC00D000000000000AF +:10646000000000000000000000000000A04040010B +:1064700000900001800050000000000000000000BB +:10648000000000000000000000000000000000000C :1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC :1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C -:10650000000000000000000AAAAA40550000000098 +:1064E0000000000000000000000000000000C35594 +:1064F000000FAA003C0F0000000000000000000098 +:10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B :10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:106580000000000000000000000AAA285555000085 +:10657000C355FF0FAAFF3C0F000000000000000001 +:10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB :1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB :1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:106600000000000000000000000000000000414108 -:1066100041410000000000000000000000000000F8 +:1065F0000000AA00FF00FF00555500000000000049 +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A :10662000000000000000000000000000000000006A :10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A :10665000000000000000000000000000000000003A :10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A +:1066700000000000FF55FF55F0F03C3C000000001A :10668000000000000000000000000000000000000A -:1066900041414141000000000000000000000100F5 +:1066900000000000000000000000000000000000FA :1066A00000000000000000000000000000000000EA :1066B00000000000000000000000000000000000DA :1066C00000000000000000000000000000000000CA -:1066D00000000000000100000000000000000000B9 +:1066D00000000000000000000000000000000000BA :1066E00000000000000000000000000000000000AA :1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 +:106700000000000000000000001000000000000079 :106710000000000000000000000000000000000079 -:106720002000000000000000000000000000000049 +:106720000000000000000000000000000000000069 :106730000000000000000000000000000000000059 :106740000000000000000000000000000000000049 :106750000000000000000000000000000000000039 @@ -128672,15 +128672,15 @@ :1067F0000000000000000000000000000000000099 :106800000000000000000000000000000000000088 :106810000000000000000000000000000000000078 -:106820000000000000000040000000000000000028 -:106830000000000000080000000000000000000050 -:106840000000000000000000000000000000000048 -:106850000000000000080000000000000000000030 -:106860000000000000000000000000000000000028 -:106870000000000000000008000000000000000010 +:106820000000000000000000000800080008000050 +:1068300000400000004000000000000000000000D8 +:106840000000000000000000001000080008000028 +:106850000000000000000000000000000000000038 +:1068600000000000000000000000000000400040A8 +:106870000000000000000000000000000000000018 :106880000000000000000000000000000000000008 -:1068900000000000000000080000000000000000F0 -:1068A00000000000200000002000000000000000A8 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 :1068B00000000000000000000000000000000000D8 :1068C00000000000000000000000000000000000C8 :1068D00000000000000000000000000000000000B8 @@ -128688,14 +128688,14 @@ :1068F0000000000000000000000000000000000098 :106900000000000000000000000000000000000087 :106910000000000000000000000000000000000077 -:106920000000000000008000000080000000000067 +:106920000000000000000000000000000000000067 :106930000000000000000000000000000000000057 :106940000000000000000000000000000000000047 :106950000000000000000000000000000000000037 :106960000000000000000000000000000000000027 :106970000000000000000000000000000000000017 -:106980000000000000000000000000000000000007 -:1069900000000000000000000000000000000000F7 +:1069800000000000000000000008000000080000F7 +:1069900000000008000000000000000000000000EF :1069A00000000000000000000000000000000000E7 :1069B00000000000000000000000000000000000D7 :1069C00000000000000000000000000000000000C7 @@ -128704,7 +128704,7 @@ :1069F0000000000000000000000000000000000097 :106A00000000000000000000000000000000000086 :106A10000000000000000000000000000000000076 -:106A200088000000000000000000000000000000DE +:106A20000000000000000000000000000000000066 :106A30000000000000000000000000000000000056 :106A40000000000000000000000000000000000046 :106A50000000000000000000000000000000000036 @@ -128713,7 +128713,7 @@ :106A80000000000000000000000000000000000006 :106A900000000000000000000000000000000000F6 :106AA00000000000000000000000000000000000E6 -:106AB0000000008000000000000000000000000056 +:106AB00000000000000000000000000000000000D6 :106AC00000000000000000000000000000000000C6 :106AD00000000000000000000000000000000000B6 :106AE00000000000000000000000000000000000A6 @@ -128721,21 +128721,21 @@ :106B00000000000000000000000000000000000085 :106B10000000000000000000000000000000000075 :106B20000000000000000000000000000000000065 -:106B30000000000000040000000000000000000051 +:106B30000000000000000000000000000000000055 :106B40000000000000000000000000000000000045 :106B50000000000000000000000000000000000035 :106B60000000000000000000000000000000000025 :106B70000000000000000000000000000000000015 -:106B80000000000000000000000000000000000005 -:106B900000000000000000000000000000000000F5 -:106BA0000000000000A00000000000000000400005 -:106BB00000000000000000000002000200000000D1 +:106B800000100000000000000000000000C01184A0 +:106B90000000008400000000000000080000000069 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000000D5 :106BC00000000000000000000000000000000000C5 :106BD00000000000000000000000000000000000B5 :106BE00000000000000000000000000000000000A5 :106BF0000000000000000000000000000000000095 :106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 +:106C10000000000000000000000800000008000064 :106C20000000000000000000000000000000000064 :106C30000000000000000000000000000000000054 :106C40000000000000000000000000000000000044 @@ -128745,7 +128745,7 @@ :106C80000000000000000000000000000000000004 :106C900000000000000000000000000000000000F4 :106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000100000000000000D3 +:106CB00000000000000000000000000000000000D4 :106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 :106CE00000000000000000000000000000000000A4 @@ -128753,7 +128753,7 @@ :106D00000000000000000000000000000000000083 :106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 -:106D30000000000000000000000002000000000051 +:106D30000000000000000000000000000000000053 :106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 :106D60000000000000000000000000000000000023 @@ -128761,7 +128761,7 @@ :106D80000000000000000000000000000000000003 :106D900000000000000000000000000000000000F3 :106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000009000000040000C6 +:106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 :106DD00000000000000000000000000000000000B3 :106DE00000000000000000000000000000000000A3 @@ -128769,7 +128769,7 @@ :106E00000000000000000000000000000000000082 :106E10000000000000000000000000000000000072 :106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000151 +:106E30000000000000000000000000000000000052 :106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 :106E60000000000000000000000000000000000022 @@ -128777,7 +128777,7 @@ :106E80000000000000000000000000000000000002 :106E900000000000000000000000000000000000F2 :106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000800CA +:106EB00000000000000000000000000000000000D2 :106EC00000000000000000000000000000000000C2 :106ED00000000000000000000000000000000000B2 :106EE00000000000000000000000000000000000A2 @@ -128786,7 +128786,7 @@ :106F10000000000000000000000000000000000071 :106F20000000000000000000000000000000000061 :106F30000000000000000000000000000000000051 -:106F400080000000050000000000000000000000BC +:106F40000000000000000000000000000000000041 :106F50000000000000000000000000000000000031 :106F60000000000000000000000000000000000021 :106F70000000000000000000000000000000000011 @@ -128810,7 +128810,7 @@ :1070900000000000000000000000000000000000F0 :1070A00000000000000000000000000000000000E0 :1070B00000000000000000000000000000000000D0 -:1070C00000000000000000E00000000000000000E0 +:1070C00000000000000000000000000000000000C0 :1070D00000000000000000000000000000000000B0 :1070E00000000000000000000000000000000000A0 :1070F0000000000000000000000000000000000090 @@ -128850,8 +128850,8 @@ :10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D :10733000000000000000000000000000000000004D -:1073400000000000000000000000000000000061DC -:107350000007000D00000000000000000000000019 +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D :10736000000000000000000000000000000000001D :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD @@ -128899,7 +128899,7 @@ :10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A +:107650000002000000000000000000000000000028 :10766000000000000000000000000000000000001A :10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA @@ -128907,7 +128907,7 @@ :1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA :1076C00000000000000000000000000000000000BA -:1076D00000000000000000000000000000000000AA +:1076D00000000001000000000000000000000000A9 :1076E000000000000000000000000000000000009A :1076F000000000000000000000000000000000008A :107700000000000000000000000000000000000079 @@ -128915,15 +128915,15 @@ :107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 :107740000000000000000000000000000000000039 -:1077500000000000008000000000000000000000A9 -:107760000010000000000008000000000000000001 -:107770000000000000080000000000000000000001 -:1077800000000000000000400000000000000000B9 -:1077900000000000000800000000000000000000E1 -:1077A00000000000000000000000000000000000D9 -:1077B00000000000000000080000000000000000C1 -:1077C00000000000000000000000000000000000B9 -:1077D00000000000000000020000000000000000A7 +:107750000000000000000000000800100000000809 +:107760000000000000000000001000000000000009 +:1077700000000000000000000040000000000008C1 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00000080000000000000000000000000000D1 +:1077B00000000000000000000000000000000000C9 +:1077C00000080000000000000000000000000000B1 +:1077D00000000000000000000000000000000000A9 :1077E0000000000000000000000000000000000099 :1077F0000000000000000000000000000000000089 :107800000000000000000000000000000000000078 @@ -128970,7 +128970,7 @@ :107A900000000000000000000000000000000000E6 :107AA00000000000000000000000000000000000D6 :107AB00000000000000000000000000000000000C6 -:107AC00000000000000000000000000000000000B6 +:107AC00000000000000000000000001000000000A6 :107AD00000000000000000000000000000000000A6 :107AE0000000000000000000000000000000000096 :107AF0000000000000000000000000000000000086 @@ -129155,7 +129155,7 @@ :10862000000000000000000000000000000000004A :10863000000000000000000000000000000000003A :10864000000000000000000000000000000000002A -:1086500000001001000000010040000000000000C8 +:108650000000800100008001000000000000000018 :10866000000000000000000000000000000000000A :1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA @@ -129163,7 +129163,7 @@ :1086A00000000000000000000000000000000000CA :1086B00000000000000000000000000000000000BA :1086C00000000000000000000000000000000000AA -:1086D00000000000208000000000000000000000FA +:1086D00000000000009000000000001000000000FA :1086E000000000000000000000000000000000008A :1086F000000000000000000000000000000000007A :108700000000000000000000000000000000000069 @@ -129171,7 +129171,7 @@ :108720000000000000000000000000000000000049 :108730000000000000000000000000000000000039 :108740000000000000000000000000000000000029 -:1087500000000000000048000000000400000000CD +:1087500000000000000000000000000400200000F5 :108760000000000000000000000000000000000009 :1087700000000000000000000000000000000000F9 :1087800000000000000000000000000000000000E9 @@ -129179,8 +129179,8 @@ :1087A00000000000000000000000000000000000C9 :1087B00000000000000000000000000000000000B9 :1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000810018 -:1087E00000004C000000000000000000000000003D +:1087D0000000000000000000000000000000008118 +:1087E00081004C00000000000000000000000000BC :1087F0000000000000000000000000000000000079 :108800000000000000000000000000000000000A5E :108810000000000000000000000000000000000058 @@ -129202,28 +129202,28 @@ :108910000000000000000000000000000000000057 :108920000000000000000000000040000000000007 :108930000000000000000000000000000000000037 -:108940000000000000000000000000000000000027 +:10894000000000000000000000000000000010080F :108950000000000000000000000000000000000017 :108960000000000000000000000000000000000007 -:1089700000000000000000000002000041000000B4 +:1089700000000000000000000000000041000000B6 :1089800000000000000000000000000000000000E7 :1089900000000000000000000000000000000008CF -:1089A000008400020008000800080002800800009F -:1089B0000008008400080002000000080008000809 -:1089C000000000040008000200840000000800000D -:1089D0000008000800080008000800020008000065 -:1089E000000800000008000800000008000000085F -:1089F000000000080082000800020008000490083F -:108A00000008000000080008000800080000000836 -:108A1000000800080008000800080008000000081E -:108A20000040000000000000000000000000000006 -:108A3000000000030000000000000008002100000A -:108A40000000000000030000000000000021000002 -:108A5000000000000000000900000040002100218B -:108A600000000000000300000000000000000021E2 -:108A700000210000000000080000000800000021A4 -:108A8000004000000021000000000000000000087D -:108A900000000000002100000003000000000000B2 +:1089A0000004000000020008000000008008000829 +:1089B0000004000000000008008200000008000819 +:1089C0000004000000020008000000080008000881 +:1089D00000840000000000080008000800080000F3 +:1089E00000080000000000000008000000820008ED +:1089F0000008000800080008000200840008900831 +:108A00000008000800000084008200080000000840 +:108A10000008000800080008000800080008000816 +:108A20000000000800000008000000000000000036 +:108A3000000000000000000000000008002000000E +:108A40000000000000000005000000000000000021 +:108A500000000021000000080000000000000002EB +:108A600000030000000500000008000000080000EE +:108A700000000005000000000000000000050000EC +:108A800000050000000000000000000000210000C0 +:108A90000000000000000000002100000021000094 :108AA00000000000000000000000000000000000C6 :108AB00000000000000000000000000000000000B6 :108AC00000000000000000000000000000000000A6 @@ -129248,44 +129248,44 @@ :108BF0000000000000000000000000000000000075 :108C00000000000000000000000000000000000064 :108C10000000000000000000000000000000000054 -:108C2000000000000000000000000000000800003C -:108C30000000000000000003000000000008000029 -:108C40000008000000030000000000050002000012 -:108C500000000003000000000003002100000000ED -:108C600000000000000800200000000000000011CB -:108C70000000000800030000000200082021000995 -:108C800000110000000500000005000000000000C9 -:108C900000090000000000000000000000000000CB -:108CA00000000000000000080000000000000000BC +:108C2000000000000000000000000000000500003F +:108C300000000021002100050000000000000000ED +:108C4000000090000008000000000000000000008C +:108C5000000000000000000000000000000800000C +:108C60000000000000000000000000000000000004 +:108C700000000000002100000000000000000000D3 +:108C80000040000000000000000300000000000899 +:108C900000000008000000000000000000000000CC +:108CA00000000000000000000000000000000000C4 :108CB00000000000000000000000000000000000B4 :108CC00000000000000000000000000000000000A4 :108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 +:108CE000000000000000000000000000000000087C +:108CF0000000000000000000002000000000000054 :108D00000000000000000000000000000000000063 :108D10000000000000000000000000000000000053 :108D20000000000000000000000000000000000043 -:108D30000000000000000021000000000000000012 -:108D40000000000000000000000000000000000023 -:108D50000008000000000008000000000000000003 -:108D60000000000000000000000000000000000003 -:108D70000000002100000021000000210000000090 -:108D800000000000000000030000002100000000BF -:108D900000080000002100000000000000000000AA +:108D3000000000000000000500080000000000081E +:108D400000000003000000000000000000000021FF +:108D500000000000000000000000000300000021EF +:108D600000000021000000000000000000000000E2 +:108D700000050000000000030005000000000003E3 +:108D800000050000000000080008000000000000CE +:108D900000030000000800000000000000000000C8 :108DA00000000000000000000000000000000000C3 :108DB00000000000000000000000000000000000B3 :108DC00000000000000000000000000000000000A3 :108DD0000000000000000000000000000000000093 :108DE0000000000000000000000000000000000083 -:108DF0000000000000000000000000000000000073 +:108DF000000000000000000000000000000005006E :108E00000000000000000000000000000000000062 :108E10000000000000000000000000000000000052 :108E20000000000000000000000000000000000042 -:108E300000008800000000000000000000000000AA -:108E4000000000000000000000008800000000009A +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 :108E50000000000000000000000000000000000012 -:108E60000000000000000000000000000000000002 -:108E700000000000000000000000000000000000F2 +:108E6000000000000000000000008800000000007A +:108E7000000000000000000000000000880000006A :108E800000000000000000000000000000000000E2 :108E900000000000000000000000000000000000D2 :108EA00000000000000000000000000000000000C2 @@ -129293,32 +129293,32 @@ :108EC00000000000000000000000000000000000A2 :108ED0000000000000000000000000000000000092 :108EE0000000000000000000000000000000000082 -:108EF000000000030000000000000000000000006F -:108F00000000000000000000000000000000000061 +:108EF0000000000000000000000000000000000072 +:108F00000000000010000000000000000000000051 :108F10000000000000000000000000000000000051 :108F20000000000000000000000000000000000041 -:108F3000000000008000800000000003000000002E -:108F40000000000000000000000000008000800021 -:108F50000009000300000000000000000000000005 -:108F600000000011000000000000000080008000F0 -:108F70000009001000008000800000000011800047 -:108F8000800000100011800080000000001100002F +:108F30000000000080008000000000110000000020 +:108F400000000000000000000000000000008000A1 +:108F50000000001000000000000000000000000001 +:108F60000000000900000000000000000000800078 +:108F700000020003000080000000000000118000DB +:108F80000000000000030000800000000008000056 :108F900000000000000000000000000000000000D1 :108FA00000000000000000000000000000000000C1 -:108FB0000000000000001000100000000001000090 -:108FC0000000000000000000000000000000100091 -:108FD000400000000001000000000000000002004E -:108FE00088000000000000000000000000001000E9 -:108FF0004000000000000000080010000000000019 -:1090000040001000000000000800100000000000F8 +:108FB0000000000000001000100000000000000091 +:108FC000000000000000000000000000000002009F +:108FD0008200000000080000000000000000020005 +:108FE00010000000000000000000000000009000E1 +:108FF0004000000000010000080002000000000026 +:109000000800A00000000001020020000000000194 :109010000000000000000000000000000000000050 :109020000000000000000000000000000000000040 :109030000000000000000000000000000000000030 -:10904000000000000200000000000000000000001E -:10905000000000000200000000000000000000000E -:1090600000000000020000000000000000000000FE -:1090700000000000020000000000000000000800E6 -:1090800000000000000002000000000000000800D6 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 :1090900000000000000000000000000000000000D0 :1090A00000000000000000000000000000000000C0 :1090B00000000000000000000000000000000000B0 @@ -129326,32 +129326,32 @@ :1090D0000000000000000000000000000000000090 :1090E0000000000000000000000000000000000080 :1090F0000000000000000000000000000000000070 -:1091000080000000000000000000000000000000DF -:1091100080000000000000000000000000000000CF +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F :10912000000000000000000000000000000000003F :10913000000000000000000000000000000000002F -:109140000000100000000000000008000000000007 -:1091500000000000000000000000110000000000FE +:109140000000110000000000000008000000000006 +:10915000000000000000000000000300000000000C :1091600000000000000000000000020000000000FD -:1091700000000000000000000000110000020000DC -:1091800000000000100000000000000011000000BE -:1091900000000000030000000000000000000000CC +:1091700000000000000000000000200000020000CD +:1091800000000000100000000000000020000000AF +:1091900000000000100000000000000000000000BF :1091A00000000000000000000000000000000000BF :1091B00000000000000000000000000000000000AF :1091C000000000000000000000000000010000009E :1091D000000000000000000000000000000000008F :1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F +:1091F000000000000000000000000000010000006E :10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E +:10921000000000000000010000000000000000004D :10922000000000000000000000000000000000003E :10923000000000000000000000000000000000002E -:10924000484200500A009009002100000A009000E6 -:109250000000000000000000842100500A00900976 -:109260000000000000000000842100500A00900966 -:109270000000000000000000842100500A00900956 -:109280000000842100500A009009842100500A0047 -:109290009009842100500A0090090000000000009D +:10924000484200900900C843004200000900C800DD +:109250000000000000000000484200900900C843E0 +:109260000000000000000000484200900900C843D0 +:109270000000000000000000484200900900C843C0 +:109280000000484200900900C8434842009009008D +:10929000C843484200900900C84300000000000095 :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE :1092C000000000000000000000000000000000009E @@ -129370,20 +129370,20 @@ :109390000000140194020010000014019402000067 :1093A00000000000000000000000000000000000BD :1093B00000000000000000000000000000000000AD -:1093C0000000000000000040032004C00200004034 -:1093D00003200000004000000000000000000040EA -:1093E000032004C002000000000000000000004054 -:1093F000032004C002000000000000000000004044 -:10940000032004C0020000000040032004C002004A -:109410000040032004C002000040032004C00200FA +:1093C0000000000000000040030810C00200004040 +:1093D0000308000000400000000000000000004002 +:1093E000030810C002000000000000000000004060 +:1093F000030810C002000000000000000000004050 +:10940000030810C0020000000040030810C0020062 +:109410000040030810C002000040030810C0020012 :1094200002000000000000400000000000000000FA :10943000000000000000000000000000000000002C -:10944000000000000000000008020020040040109E -:1094500008020020000000000000000000000000E2 -:10946000080200200400401000000000000000007E -:10947000080200200400401000000000000000006E -:109480000802002004004010000008020020040030 -:1094900040100802002004004010080200200400D0 +:1094400000000000000000000802000810004010AA +:1094500008020008000000000000000000000000FA +:10946000080200081000401000000000000000008A +:10947000080200081000401000000000000000007A +:109480000802000810004010000008020008100048 +:1094900040100802000810004010080200081000E8 :1094A000401000000000000000000000000000006C :1094B00000000000000000000000000000000000AC :1094C000000000000000000000000000000000009C @@ -129431,7 +129431,7 @@ :1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 :1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 +:1097900000000000000300000000000000000000C6 :1097A00000000000000000000000000000000000B9 :1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 @@ -129444,77 +129444,77 @@ :109830000000000000000000000000000000000028 :109840000000000000000000000000000000000018 :109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000000F8 +:1098600000000000000000000008000000080008E0 :1098700000000000000000000000000000000000E8 -:1098800010000000000000000000000000000000C8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000040000000000000000B4 +:1098800000000004000000000000000000000000D4 +:109890000000000000000000000000800000000048 +:1098A00000000000000000000000000000000000B8 :1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000000000098 -:1098D0000000000000000008000000000000000080 -:1098E0000000000800000000000000000000000070 -:1098F0000000000000000000000000000000000860 -:10990000000000080000000000000000000000004F -:109910000008000000000008000000000000000037 -:109920000008000000080000000800000008000017 -:10993000000000080000000800080000000000000F -:1099400000080000000800000008000800080008E7 -:10995000000800080008000800840008000000005B +:1098C0000000008000000000000000800000000098 +:1098D0000000008000000000000000000000000008 +:1098E0000000000000000000000000010000000176 +:1098F000000900040000000000000000000000005B +:109900000000000000000000000000000000000057 +:1099100000080000000800000000000000400000F7 +:10992000000800000008000000000000000800001F +:109930000000000800080008000800000000000007 +:109940000008000000400000000800000040000087 +:10995000000800080040000800080008000000009F :1099600000000000000000000000000000000000F7 -:1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000080000000000000000BF -:1099A00000000000000000000000000000000000B7 -:1099B000000000080000000000000000000000009F -:1099C000000000000008000000000040000000004F +:1099700000000000000000000000000000210003C3 +:1099800000000000000000000000000000080000CF +:1099900000000000000000000000000000000000C7 +:1099A00000000000010000000000000000000000B6 +:1099B000000000000000000000000000000800009F +:1099C000000000000000000000000000000800008F :1099D0000000000000000000000000000000000087 -:1099E00000000000000000000000000000840000F3 +:1099E0000000000000000000000000000000000077 :1099F0000000000000000000000000000000000067 -:109A0000000000000000000000000008000000004E +:109A0000002000080000000000000000000000909E :109A10000000000000000000000000000000000046 -:109A20000000000000A0000000000000000000088E -:109A300000000008000000840008000000A00000F2 +:109A2000000000000000044009000000000000A049 +:109A300000000000000800200000000000000000FE :109A40000000000000000000000000000000000016 -:109A50000000000000000000000000000000000006 +:109A500000400000000000000000000000000000C6 :109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 +:109A7000000000080000008000000000000000005E :109A800000000000000000000000000000000000D6 :109A900000000000000000000000000000000000C6 :109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 :109AC0000000000000000000000000000000000096 -:109AD0000000000000000000000000000000000086 -:109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000000066 +:109AD0000100000000000000010000000000000084 +:109AE0000100000000000000000000000000000075 +:109AF0000000000000010000000400000000000061 :109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 +:109B1000000000000000000000000008000000003D :109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 -:109B50000000000000000000000000000000000005 -:109B60000000000000000000000000000080000075 -:109B700000000000000000000000000000000000E5 -:109B800000000000000000000000000000000000D5 +:109B500000000400000000000000040000000000FD +:109B60000000040000000000000000000080000071 +:109B70000000900000000000000000000000000055 +:109B800000000000000000000000000000080000CD :109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 +:109BA0000000000000000000000000200000000095 :109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 -:109BD0000000000000000000000000000000000085 -:109BE000000000000000000000000008000000402D +:109BD00000000020000090000000002000000000B5 +:109BE0000000002000000000000000000000004015 :109BF0000000000000000000000000000000000065 -:109C0000000000080000000000000000000000004C -:109C100000A000000000000800000000000000009C -:109C20000000000000000000000000001100000023 -:109C3000000000000000000000000000000000A084 -:109C4000000000000000020000080000000000000A -:109C50000000000000000000000000000000000004 -:109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000008DC -:109C800000000000000000000000000000000000D4 +:109C0000000800000000000000000000000000004C +:109C10000000000000000000000000000000000044 +:109C2000000000082000000000000000000100000B +:109C30000000000000080000000000000000008498 +:109C40000000000000001100000000000000000003 +:109C50000000000000010000000000000001000002 +:109C600000000000000100000000000000000000F3 +:109C700000000000000000000000000000000000E4 +:109C800000050000000000000008000000000000C7 :109C900000000000000000000000000000000000C4 :109CA00000000000000000000000000000000000B4 -:109CB00000000000000000000000000000000000A4 -:109CC000000000000000000000080000000000008C +:109CB000000000000000000900000000000000009B +:109CC0000000000000000000002100000000000073 :109CD0000000000000000000000000000000000084 :109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 @@ -129525,121 +129525,121 @@ :109D40000000000000000000000000000000000013 :109D50000000000000000000000000000000000003 :109D600000000000000000000000000000000000F3 -:109D700000000000000000000000000000000000E3 +:109D700000000000000000000000000001000000E2 :109D800000000000000000000000000000000000D3 :109D900000000000000000000000000000000000C3 :109DA00000000000000000000000000000000000B3 -:109DB00000000000000000000000000000000000A3 +:109DB0009000000000000000000000000000000013 :109DC0000000000000000000000000000000000093 -:109DD0000000000000000000000000000000000083 -:109DE0000000000000000000000000000000000073 -:109DF0000000000000000000000000000000000063 -:109E00000000000000000000000000000000000052 +:109DD00000000000000000009000000000000000F3 +:109DE0009000001000000000900000000000000043 +:109DF0000000000000000000000000000000110052 +:109E00000021000000000000000000000000000031 :109E10000000000000000000000000000000000042 :109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 +:109E30001100800000000000000000000000000091 :109E40000000000000000000000000000000000012 -:109E50000000000000000000000000000000000002 -:109E600000000000000000000000000000000000F2 +:109E50000000000000000000110080000000000071 +:109E600011008000000000001100800000000000D0 :109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 +:109E800000090000110200000000000000000000B6 :109E900000000000000000000000000000000000C2 :109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 +:109EB0000000000000800000000000000000000022 :109EC0000000000000000000000000000000000092 -:109ED0000000000000000000000000000000000082 -:109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 +:109ED0000000000000000000000000000080000002 +:109EE00000000000008000000080000000800000F2 +:109EF00000800000000000000000000000000000E2 +:109F00000000000000000100000000000000000050 :109F10000000000000000000000000000000000041 :109F20000000000000000000000000000000000031 -:109F30000000000000000000000000000000000021 +:109F30000000000000000020000000880000000079 :109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000000001 -:109F600000000000000000000000000000000000F1 -:109F700000000000000000000000000000000000E1 -:109F800000000000000000000000000000000000D1 +:109F500000000000000000000000000000000020E1 +:109F60000000000800000020000000C000000020E9 +:109F700000000002000000000000000000000000DF +:109F800000000000000020000000010000000000B0 :109F900000000000000000000000000000000000C1 :109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 +:109FB0000000000000000100008808000000000010 :109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000000081 -:109FE0000000000000000000000000000000000071 -:109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 +:109FD0000000000000000000000000000000010080 +:109FE000008888000000010000888800010001004E +:109FF0000088880000000000000000000000000051 +:10A0000000000000000000008003000008000000C5 :10A010000000000000000000000000000000000040 :10A020000000000000000000000000000000000030 -:10A030000000000000000000000000000000000020 +:10A0300000000000000000004100008080000000DF :10A040000000000000000000000000000000000010 :10A050000000000000000000000000000000000000 -:10A0600000000000000000000000000000000000F0 -:10A0700000000000000000000000000000000000E0 -:10A0800000000000000000000000000000000000D0 +:10A060004100008000000000410000800000090065 +:10A07000410000800000000000000000000000001F +:10A0800000000000000000000002110000000000BD :10A0900000000000000000000000000000000000C0 :10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 +:10A0B000000000000000000000000011000000800F :10A0C0000000000000000000000000000000000090 :10A0D0000000000000000000000000000000000080 -:10A0E0000000000000000000000000000000000070 -:10A0F0000000000000000000000000000000000060 -:10A10000000000000000000000000000000000004F +:10A0E000000000110000008000000011000000804E +:10A0F00000000011000000800000000000000000CF +:10A10000000000000000000000000000010000004E :10A11000000000000000000000000000000000003F :10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F +:10A13000000000000000000000000000000100001E +:10A1400000400000000000000000000000000000CF :10A1500000000000000000000000000000000000FF -:10A1600000000000000000000000000000000000EF -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF +:10A1600000000000000100000040000000010000AD +:10A17000004000000001000000400000000000005E +:10A18000000000000000000000000000000000E0EF :10A1900000000000000000000000000000000000BF :10A1A00000000000000000000000000000000000AF :10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F +:10A1C0000000070082000000000000000000000006 :10A1D000000000000000000000000000000000007F -:10A1E000000000000000000000000000000000006F -:10A1F000000000000000000000000000000000005F +:10A1E00000000000000000000000070082000000E6 +:10A1F000000007008221000000000700820000002C :10A20000000000000000000000000000000000004E :10A21000000000000000000000000000000000003E :10A22000000000000000000000000000000000002E :10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E +:10A2400000000000F0F0000000000000000000002E :10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE +:10A26000000000000000000000000000F0F000000E +:10A2700000000000F0F0000000000000F0F000001E :10A2800000000000000000000000000000000000CE :10A2900000000000000000000000000000000000BE :10A2A00000000000000000000000000000000000AE :10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E +:10A2C000000000000000F0F00000000000000000AE :10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E -:10A2F000000000000000000000000000000000005E +:10A2E0000000000000000000000000000000F0F08E +:10A2F000000000000000F0F0000000000000F0F09E :10A30000000000000000000000000000000000004D :10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D :10A33000000000000000000000000000000000001D -:10A34000000000000000000000000000000000000D +:10A3400000000000000000000000FFFF000000000F :10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED -:10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000000CD +:10A370000000FFFF00000F0F0000FFFF00000000C3 +:10A380000000FFFF000000000000000000000000CF :10A3900000000000000000000000000000000000BD :10A3A00000000000000000000000000000000000AD :10A3B000000000000000000000000000000000009D :10A3C000000000000000000000000000000000008D :10A3D000000000000000000000000000000000007D :10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D +:10A3F00000000000000000000F0F0000000000003F :10A40000000000000000000000000000000000004C -:10A41000000000100000000000000000000000002C +:10A4100000000010000000000006000C000000001A :10A42000000000000000000000000000000000002C :10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C +:10A44000000000000000000005000A00054000A810 :10A4500000000000000000000000000000000000FC :10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC +:10A4700005000A00054000A805002A00054000A8C4 +:10A4800005000A00054000A80000000000000000D0 +:10A4900000000000000000000000FF00F0F00000DD :10A4A00000000000000000000000000000000000AC :10A4B000000000000000000000000000000000009C :10A4C000000000000000000000000000000000008C @@ -129647,7 +129647,7 @@ :10A4E000000000000000000000000000000000006C :10A4F000000000000000000000000000000000005C :10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000000000003B +:10A51000000000000000000000000000FF00F0F05C :10A52000000000000000000000000000000000002B :10A53000000000000000000000000000000000001B :10A54000000000000000000000000000000000000B @@ -129655,8 +129655,8 @@ :10A5600000000000000000000000000000000000EB :10A5700000000000000000000000000000000000DB :10A5800000000000000000000000000000000000CB -:10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB +:10A590000000000000000000000000000000FF00BC +:10A5A00000FF0000000000000000000000000000AC :10A5B000000000000000000000000000000000009B :10A5C000000000000000000000000000000000008B :10A5D000000000000000000000000000000000007B @@ -129664,21 +129664,21 @@ :10A5F000000000000000000000000000000000005B :10A60000000000000000000000000000000000004A :10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A +:10A62000FF0000FF0000000000000000000000002C :10A63000000000000000000000000000000000001A :10A64000000000000000000000000000000000000A :10A6500000000000000000000000000000000000FA :10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA :10A6800000000000000000000000000000000000CA -:10A69000000000000000000000004000000000007A -:10A6A00000020000000000000000000000000000A8 -:10A6B000000000000000000000000000000000009A -:10A6C0000000000000080000000000000000000082 -:10A6D00000000000000000000000400040100000EA +:10A6900000000000000000000000000000000000BA +:10A6A00000000002000000000000000000000000A8 +:10A6B000000000100000000000000000000000008A +:10A6C0000000000200000000000000000000000088 +:10A6D000000000000000000000000000000000007A :10A6E000000000000000000000000000000000006A -:10A6F0000000000000000000000000000000000852 -:10A700000008000000000000000000000000000041 +:10A6F0000000000000000000000800000000000052 +:10A700000000000000000000000000000000000049 :10A710000000000000000000000000000000000039 :10A720000000000000000000000000000000000029 :10A730000000000000000000000000000000000019 @@ -129687,28 +129687,28 @@ :10A7600000000000000000000000000000000000E9 :10A7700000000000000000000000000000000000D9 :10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 +:10A7900000000000000000000008000000000000B1 +:10A7A00000000008000000000000000000000000A1 +:10A7B000000300000000000000080000000000008E +:10A7C0000000000800000000000000000000000081 +:10A7D0000000000000000000000000040000000075 +:10A7E0000000000000030000000000000000000066 +:10A7F0000000000000000000000000000000000356 :10A800000000000004000000000000000000000044 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000008000020 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000008000000 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000080008D8 -:10A87000000000000000000000000000000800824E -:10A8800000000000000000000000000000080008B8 -:10A8900000000000000000000000000000000000B8 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 +:10A810000000000000000000000000040000000034 +:10A820000000000000000000000000000000000028 +:10A83000000000000008000000000004000000000C +:10A8400000000000000800880000000000840000F4 +:10A8500000000000000400000000000000040000F0 +:10A860000000000000000082000000000000000066 +:10A8700000000000000000000000000800080000C8 +:10A8800000000000000000000000000000000000C8 +:10A890000084000000000000000000000000000034 +:10A8A00000020000000000000000000000000000A6 +:10A8B0000000000000000400000000000000000094 +:10A8C0000002000000000000000000000000000086 :10A8D0000000000000000000000000000000000078 -:10A8E0000011000000000040000000000000000017 +:10A8E0000011000200000000000000000000000055 :10A8F0000000000000000000000000000000000058 :10A900000000000000000000000000000000000047 :10A910000000000000000000000000000000000037 @@ -129716,58 +129716,58 @@ :10A930000000000000000000000000000000000017 :10A940000000000000000000000000000000000007 :10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 +:10A9600000080000000000000000000000000000DF :10A9700000000000000000000000000000000000D7 :10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 +:10A990000000000000000020000000000000000097 :10A9A00000000000000000000000000000000000A7 :10A9B0000000000000000000000000000000000097 :10A9C0000000000000000000000000000000000087 :10A9D0000000000000000000000000000000000077 :10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 +:10A9F000000000008400000084000000000000004F :10AA00000000000000000000000000000000000046 :10AA10000000000000000000000000000000000036 -:10AA200000000000100008001000000000000000FE -:10AA30000000000000000000000000000000000016 -:10AA400000000000000000000800000000000000FE -:10AA50000000000000A00082000000A00000000034 -:10AA600000000000000000001000100000000000C6 -:10AA70000000000000000000008200000000000054 -:10AA800000000000000010000800080000000000A6 -:10AA900000000000000000000000000000000000B6 +:10AA20000000000000000000000000000000000026 +:10AA300000000000000800A000000000000000006E +:10AA40000000000000000000000000000000000006 +:10AA50000000000000A000A00000000000000000B6 +:10AA600000000008000000000000000000000000DE +:10AA700000000000000000000008000000000000CE +:10AA800000000000000003000000030000000000C0 +:10AA9000000000000000000000A000000000000016 :10AAA00000000000000000000000000000000000A6 :10AAB0000000000000000000000000000000000096 :10AAC0000000000000000000000000000000000086 :10AAD0000000000000000000000000000000000076 -:10AAE000000000000000000000080000000000005E +:10AAE0000000000000000000000000000000000066 :10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000200000000000043 +:10AB00000000000000000000000000000000000045 :10AB10000000000000000000000000000000000035 :10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 +:10AB300000C000080000000000000000000000004D :10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000008000000000000DD -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 +:10AB500000000400000000000000000000000000F1 +:10AB600000000000000000000000000200000000E3 +:10AB700000000400000000000000000000000000D1 +:10AB80000000002000000000000000000040000065 +:10AB900000000084000000000000008400000000AD +:10ABA0000000008400000000000000000000000021 :10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 +:10ABC000000000080000000000000000000000007D :10ABD0000000000000000000000000000000000075 :10ABE0000000000000000000000000000000000065 :10ABF0000000000000000000000000000000000055 :10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000030021 -:10AC3000000000000800000000000000000000000C +:10AC10000000000000000000000000000002000032 +:10AC20000000000000020000000000000000000022 +:10AC30000000000000000000000000000084000090 :10AC40000000000000000000000000000000000004 :10AC500000000000000000000000000000000000F4 :10AC600000000000000000000000000000000000E4 :10AC700000000000000000000000000000000000D4 :10AC800000000000000000000000000000000000C4 -:10AC900000000000000010000000000000000000A4 +:10AC900000000000000000000000000000000000B4 :10ACA00000000000000000000000000000000000A4 :10ACB0000000000000000000000000000000000094 :10ACC0000000000000000000000000000000000084 @@ -129923,14 +129923,14 @@ :10B62000000000000000000000000000000000001A :10B63000000000000000000000000000000000000A :10B6400000000000000000000000000000000000FA -:10B6500000000000000000002000000020000000AA -:10B66000000020000000000020000000200000007A -:10B6700000000000000000002000000000000000AA -:10B680000000200000000000000000002000000377 -:10B69000000000000000000000002000000000008A -:10B6A000000000000000000000000000004000005A -:10B6B000000000000000000000000000001000007A -:10B6C0000000000000000000000000000008000072 +:10B6500000040000000200000000000200000000E2 +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000020000000000000000C8 +:10B6800000000000000000000008000000000003AF +:10B69000A00000000000000090000000000000007A +:10B6A0000000000000000002000000000000000098 +:10B6B0000000000000000000000008000000C000C2 +:10B6C00088008400C0000000C000000000000000EE :10B6D000000000000000000000000000000000006A :10B6E000000000000000000000000000000000005A :10B6F000000000000000000000000000000000004A @@ -129941,158 +129941,158 @@ :10B7400000000000000000000000000000000000F9 :10B7500000000000000000000000000000000000E9 :10B7600000000000000000000000000000000000D9 -:10B7700020080000000000000000000000000000A1 -:10B7800000000000000000000000000000000000B9 -:10B790002008000000000000000000000000000081 -:10B7A0000000000000000000000000000000000099 +:10B7700000080000000000000000000000000000C1 +:10B7800000000003000000000000000000000000B6 +:10B79000200800000000000000000000000400007D +:10B7A0000000000000000000000500000000000094 :10B7B0000000200800000000000000000000000061 :10B7C0000000000000000000000000000000000079 -:10B7D0000000200800000000000000000000000041 -:10B7E0000000000000000000000000000000000059 -:10B7F00000008001000000000000000000000000C8 -:10B800000000000000000000000000000000000038 -:10B8100000008001000000000000000000000000A7 -:10B820000000000000000000000000000004000014 -:10B830000000000080010000008200820000008201 -:10B840000090009000900000009000000090000028 -:10B850000000000080010000000000000000000067 -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000002100000000A7 -:10B880000000000000000000000000210000000097 -:10B8900000000003002100000040000000400021E3 -:10B8A0000008000800030008000000000000000875 -:10B8B0000000000000030021004000000003002100 -:10B8C000000200000003000400000000000000046B -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 +:10B7D0000000000800100008001000100000000029 +:10B7E00000000000008800080008000000000008B9 +:10B7F00000000009000000080084000000080000AC +:10B80000000800040000008400840000000000889C +:10B81000000080830000008400080082000800040B +:10B820000000008400900000008400000000000080 +:10B83000000800008001000000080000000800006F +:10B8400000000000000000000000000000000008F0 +:10B850000008000000010021000200080000002193 +:10B86000002100080021004100000000000000212C +:10B870000021002100210008000900000000002133 +:10B88000002100080008000000080040000000211E +:10B8900000210021002100000021002100090000FA +:10B8A00000210021002100040041000300210000CC +:10B8B00000210021002100000000004000210000C4 +:10B8C000002100210008900000000000002100007D +:10B8D0000021002100210000000000000000000005 +:10B8E000000000000000000000A0000000000000B8 +:10B8F0000000000000000000000000000008000040 +:10B900000000000000000000000200000000000035 :10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000002000000000000F5 -:10B9500000000000000000000000820082000400DF -:10B96000820082008200820000004000000000008F -:10B9700082000000820082000800820000000000B7 -:10B980008200000082008200000000000000000031 -:10B990008200000082008200080000000000000019 -:10B9A0000000820000008200820000000000000011 -:10B9B0000000820000008200820008000000C00039 -:10B9C00000000000000000008200000000000000F5 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 -:10BA000000000000000000000000000003004000F3 -:10BA1000000000080000000000000000000000001E -:10BA2000000000000000000000000008000000000E +:10B9200000000000000000000988009011000000E5 +:10B930000004000000000000000000000000000003 +:10B9400000000000000000000000000200000000F5 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B970000000000000000000008000000000000047 +:10B9800000000000000000000000000000050000B2 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000C0000000840500004E +:10B9B0000000A0000000000082008400820000005F +:10B9C000000082000000000000000000A000000055 +:10B9D0000000000000000000000000040000000063 +:10B9E0000008000000000000000000080000000047 +:10B9F000000000000000000000000004000000A0A3 +:10BA000000000000000000000000000000000084B2 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 :10BA30000000000000000000000000000000000006 :10BA400000000000000000000000000000000000F6 -:10BA50000000000000000000000000000000A00046 -:10BA600000000000000000000000080000000000CE -:10BA700000000000000000000000080000000000BE -:10BA8000C00000000000C000000000000000000036 -:10BA9000000500000000002100000010000300006D -:10BAA0000000A00800080000C00090000000000096 -:10BAB000000000080000004000210000A00000037A -:10BAC0008800000200020000400000049000000016 -:10BAD0000000000400000000000000000000000062 +:10BA500000000000000000000000000000012003C2 +:10BA600000080000000020000000000000080000A6 +:10BA700000000008000000000000000000080200B4 +:10BA800000089000000020000200000000000000FC +:10BA9000000000210000000200000002000200007F +:10BAA00040000008000090029000020000008400A6 +:10BAB000000000000000000000080000004000003E +:10BAC00008000008000000000200020000008209D7 +:10BAD000000000000000000000080000000000005E :10BAE0000000000000000000000000000000000056 :10BAF0000000000000000000000000000000000046 :10BB00000000000000000000000000000000000035 :10BB10000000000000000000000000000000000025 :10BB20000000000000000000000000000000000015 -:10BB30000200000000000000000000000000000003 +:10BB300009000000000000000000000000000000FC :10BB400000000000000000000000000000000000F5 :10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000080008000000C5 -:10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000008000000AD -:10BB9000080000000000004100030000082100210F -:10BBA000000000000000000000000000000008008D -:10BBB000000000000000000008210000000000005C -:10BBC00000211000000000000000A000000008009C -:10BBD0000000000000000000000000000000000065 +:10BB600000000005000000000000000800000000C8 +:10BB700000000000000800000000000500100005A3 +:10BB8000000500050000002100080008C0000000BA +:10BB90000000000000210000000000030008000574 +:10BBA0000000000000000000002100000000000074 +:10BBB00000008400000000030000000300050008EE +:10BBC000000000000003000000000000080000006A +:10BBD000000000000000000300000000000000085A :10BBE0000000000000000000000000000000000055 :10BBF0000000000000000000000000000000000045 :10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 +:10BC100000000000000000820000000000000000A2 :10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 +:10BC300000000000000000000000050005000000FA :10BC400000000000000000000000000000000000F4 :10BC500000000000000000000000000000000000E4 :10BC600000000000000000010001000100C0000110 -:10BC7000000100C1008300002101000800820001D2 -:10BC8000400100C0000000010001000100C00001EF -:10BC9000000100C1000500000101000800020001D0 -:10BCA000400100C00000000000010001000100C0D0 -:10BCB0000001100100C10089000001010008008896 -:10BCC0000001400100C0000000010001000100C0AF -:10BCD0000001000100C100030000410100080082D2 -:10BCE0000001400100C0000000410041004100C0CF -:10BCF0000041004100A00841000502410000008011 -:10BD00000041804100C0000000410041004100C0EE -:10BD10000041004100881041000402410080008081 -:10BD20000041804100C0000000000041004100418E -:10BD300000C00041804100830841000402410080AE -:10BD400000000041804100C000000041004100416E -:10BD500000C000410041009008C1001002410000F5 -:10BD600000800041804100C000004100030000004D -:10BD700000804100C000000020001000C0800000D2 -:10BD800088004100C1000040800041000300000025 -:10BD900000804100C0000000020002008800000096 -:10BDA00085004100C1000040800000034100030005 -:10BDB000000000804100C000000002000200880076 -:10BDC000000083004100C1000040800041000300EA -:10BDD000000000804100C000000010000800880042 -:10BDE000000083004100C10000408000010001000C -:10BDF000000000C00100C000000000008300040239 -:10BE00000090C0004100C10000408200010001001C -:10BE1000000000C00100C00000000000400005025A -:10BE20000090C0000300C10000408200000001003B -:10BE30000100000000C00100C000000000008200FE -:10BE400005020090C0000300C10000408200010014 -:10BE50000100000000C00100C000000001008200DD -:10BE600005080090C0000900C1000040820000C029 -:10BE70000001C0C100000000000100C1824100417A -:10BE8000000100C10000000000010000000000C02F -:10BE90000001C0C100000000000100C00840001106 +:10BC7000000100C0010500008401000800820001ED +:10BC8000000100C1000000010001000100C000012E +:10BC9000000100C001050000900100080002000141 +:10BCA000000100C10000000000010001000100C00F +:10BCB0000001000100C0009101000001000200909D +:10BCC0000001000100C1000000010001000100C0EE +:10BCD0000001000100C00183000000010002000219 +:10BCE0000001000100C1000000410041004100903E +:10BCF0000041004100901041000209410080008095 +:10BD000000410041008500000041004100410090D9 +:10BD10000041004100901041000209410080008074 +:10BD20000041004100850000000000410041004149 +:10BD300000900041004100900941100409410000B9 +:10BD40000000004100410085000000410041004129 +:10BD500000900041004100901041000409410000A2 +:10BD60000080004100410085000041000300000008 +:10BD7000008041008900000010000900040000005C +:10BD800089004100C1000080808041000300000064 +:10BD90000080410089000000100003001000000036 +:10BDA00083004100C100008080800000410003004A +:10BDB0000000008041008900000010008300100096 +:10BDC000008083004100C1000080808041000300AA +:10BDD00000000080410089000000100003001000F6 +:10BDE000000088004100C100008080800100010047 +:10BDF000000000C00100C00000000000880088C0F2 +:10BE00000088C0001100C100008410100100010072 +:10BE1000000000C00100C00000000000880088048D +:10BE20000088C1001100C10000841010000301004F +:10BE30000100000000C00100C00000000000080078 +:10BE400088900040C0000900C1000084101001006B +:10BE50000100000000C00100C000000000008800D8 +:10BE600082900020C1002100C1000084101000C099 +:10BE70000001C0C100000000000100C0101000114E +:10BE8000000102C10000000000010000000000C02D +:10BE90000001C0C100000000000100C0101000112E :10BEA000000100C1000000000001000000000000CF -:10BEB00000C00001C0C100000000000100C102413B -:10BEC0000011000100C1000000000001000000009E -:10BED00000C00001C0C100000000000100C1054118 -:10BEE0000003000100C1010000000001000000008B -:10BEF0000080004180C100000000004100908020CF -:10BF00000041004100C1000000000041004000006D -:10BF10000080004180C100000000004100898010C5 -:10BF200000C1004100C100000000004100400000CD -:10BF300000000080004180C100000000004100902E -:10BF4000800300C1004100C100000000004100402A -:10BF500000000080004180C100000000004100A0FE -:10BF6000880200C1004100C10800000000410040FB -:10BF70000000C100800080C10000410000080300F3 -:10BF80004100C1410000800200004100000080002B -:10BF90004100C100800080C1000041100000C100CC -:10BFA0004100C1418000800200004100000080008B -:10BFB00041000000C100800080C10000411000412C -:10BFC000C1004100C1418000800800004100000024 -:10BFD00080004100C100800080C1000041000008D5 -:10BFE00085004100C1418000800800004100000040 -:10BFF00080004100C1004000C0C1000001002000DD -:10C0000090000100C1914000C0000000010000004C -:10C01000C0000100C1004000C0C1000001001000CC -:10C0200010000100C1111000C0000000010000005C +:10BEB00000C00001C0C100000000000100C0C010AF +:10BEC0000021000100C1000000000001000000008E +:10BED00000C00001C0C100000000000100C08210CD +:10BEE0000041000100C1000000000001000000004E +:10BEF0000080004180C100000000004100C18002BC +:10BF000000C1004180C1000000000041001100009C +:10BF10000080004180C100000000004100C180029B +:10BF200000C1004100C111000000004100110000EB +:10BF300000000080004180C100000000004100C1FD +:10BF400080080041004100C10000000000410011D4 +:10BF500000000080004180C100000000004100C1DD +:10BF600080200041004100C100000000004100119C +:10BF70000000C100800080C100004102000082007A +:10BF80004100C1C10000801000004100000080009D +:10BF90004100C100800080C1000041020000820019 +:10BFA0004100C1C180008005000041000000800008 +:10BFB00041000000C100800080C10000410200007B +:10BFC00082004100C14100008041000041000000AA +:10BFD00080004100C100800080C10000410200409B +:10BFE00082004100C1C1800080400000410000008B +:10BFF00080004100C1004000C0C1000001000200FB +:10C0000002000100C1410200C00000000100000068 +:10C01000C0000100C1004000C0C1000001000200DA +:10C0200002000100C1090400C0010000010000007D :10C03000C00001000000C1004000C0C100000100BC -:10C04000100108000100C1111000C0000000010033 +:10C04000020002000100C1098800C00100000100D7 :10C050000000C0000100C1004000C0C1000001009C -:10C06000200083000100C1118200C0000000010017 +:10C06000020002000100C1050200C0000000010042 :10C070000000C000010000000000000000420000BD -:10C080000000000000008112004807004800000086 +:10C08000000000000000811200410700480000008D :10C09000000000000000000000000000004200005E -:10C0A0000000000000008112004807004800000066 +:10C0A000000000000000811200410700480000006D :10C0B000000000000000000000000000000000423E -:10C0C0000000000000004100811200480700480005 +:10C0C0000000000000000006811200410700480641 :10C0D000000000000000000000000000000000421E -:10C0E0000000000000000000811200480700480026 +:10C0E000000000000000000081120041070048002D :10C0F0000000000000000000000000000000000040 :10C10000000000000000000000000000000000002F :10C11000000000000000000000000000000000001F @@ -130127,214 +130127,214 @@ :10C2E00060C603000000000000000031E000000014 :10C2F000000000000C0000000000000000C0630609 :10C30000000000000000000000000000000000002D -:10C3100000002000000000000000000000000000FD +:10C310000000000000040000000000000000000019 :10C32000000000000000000000000000000000000D -:10C3300000002000000000000000000000000000DD -:10C3400000000000000000000000000000000000ED -:10C35000000000002000000000000000000000407D +:10C3300000000000004000000000000000000000BD +:10C3400000030000000000000000000000000000EA +:10C35000000210000000004000000000000000008B :10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000040000000000000004A5 -:10C39000000000000000000000000002000000009B -:10C3A000000000000000000000000002000000008B -:10C3B000000000000000000000000500050000046F -:10C3C0000004000000000000000000000000000069 -:10C3D0000000000000000000000010000002000249 -:10C3E000000040000000000000000000000000000D +:10C3700000000000000000000000000200000000BB +:10C3800000000000000000000004000000000000A9 +:10C390000000000000000000000000000000000499 +:10C3A0000000000000000000000400000000000089 +:10C3B000000000000000000100000000000000007C +:10C3C000000000000000000000000000000000006D +:10C3D0000002000000000000000000000002000059 +:10C3E000000000000000000000000000000000004D :10C3F000000000000000000000000000000000003D :10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C +:10C41000000002000000000000000000000000001A :10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC +:10C4300000000000000002000000000000000000FA :10C4400000000000000000000000000000000000EC :10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC +:10C4600000000000020000000000000000000000CA :10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000200000000000000000000009A -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D0000000000000000000000000080000000054 -:10C4E0000084000000000200000000900000000036 -:10C4F000000000000000008200000090000000002A +:10C480000000000000000000000000000084000820 +:10C49000000800100000000000080008000800006C +:10C4A00000880084000000000000000000000082FE +:10C4B0000088000000080000800800080008000054 +:10C4C0000000000000000000000000840084000064 +:10C4D00000000000000800900000000800080008AC +:10C4E000001000000000000000000000000000003C +:10C4F0000004000000080000000000080084008420 :10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000080041A2 -:10C5500000000000000000000003000000000000D8 -:10C5600000000000000000000000000000040000C7 -:10C5700000000009000000000000000000000000B2 -:10C5800000000000000000000000000000000800A3 -:10C590000800000021000000000000000000000072 -:10C5A000000000000000000000000000000000008B -:10C5B00000000000000000000000008400A000A0B7 -:10C5C0000084008400000000000000000000000063 -:10C5D000000000000000000000000000008400A037 -:10C5E00000000000008400000000000000000000C7 -:10C5F000400000000000008800880000009000005B -:10C600000000000400900000000000000000000096 +:10C5100000000000000000000000000000000041DA +:10C520000000000000000000000000080000000003 +:10C5300000000000000500000000000000000000F6 +:10C54000000000000000000000000080002100202A +:10C550000000000000000100010000200020000495 +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C5900000C00000000800100008000000080008AB +:10C5A00000080000000000A00010000000000000D3 +:10C5B00000000000000000080084000000080008DF +:10C5C000000800080000000000100000004000000B +:10C5D00000200440020000002008040400000008BD +:10C5E00000084008001000000000000000000000EB +:10C5F00000004100000000004108000003000008A6 +:10C6000000A000A0000800000000000000000000E2 :10C61000000000000000000000000000000000001A :10C62000000000000000000000000000000000000A :10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA +:10C6400000000100000000000000000000000000E9 +:10C6500000000000010000000000008000800000D9 +:10C660000000000010000000000000000000840036 :10C6700000000000000000000000000000000000BA :10C6800000000000000000000000000000000000AA :10C69000000000000000000000000000000000009A :10C6A000000000000000000000000000000000008A :10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A +:10C6C0000200000004000000000000000000000064 +:10C6D00000000000000004000000000000200040F6 :10C6E000000000000000000000000000000000004A :10C6F000000000000000000000000000000000003A :10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 +:10C710000000000000000000000000000000000811 :10C720000000000000000000000000000000000009 :10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C760000008000000000020001100000000000090 -:10C7700000000000000000000000000000000000B9 -:10C7800000020000000000000000000000000000A7 -:10C790000000000000000000000000000800080089 -:10C7A0000000080008000000080000000000000071 -:10C7B0000000000000000000000000000000000079 -:10C7C00000C0000008080000000000000000000099 -:10C7D000000000000000000000000000008211883E -:10C7E0000000008200900808000000000000000027 -:10C7F00000000000000000000000050000880900A3 -:10C8000011880000009008040000000000000000F3 -:10C810000000000000000800000000000000000010 +:10C7400001000000000000000000000500000000E3 +:10C7500000002005000090200000004000000000C4 +:10C760001004000000000000000084000000000031 +:10C770000000000000000000820000000000000037 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000080000110080 +:10C7A0000000000000A000100000000000000000D9 +:10C7B000000000000000000800000002000011005E +:10C7C0000000020000A000100000000000000000B7 +:10C7D0000000000000A0000000010020000900008F +:10C7E000040080010400002011041000000000007B +:10C7F0000000000000000000000000000008000031 +:10C800001100004008000000000000880000000047 +:10C810000000000000030000000000000000000015 :10C820000000000000000000000000000000000008 :10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000080000E0 -:10C8500000000021000000030000000000000000B4 -:10C8600000000000000000000000000000000021A7 -:10C8700000000000000000030000000000000000B5 +:10C840000000000000000000002100400000000384 +:10C8500000000000000000000003000000000008CD +:10C8600001000000000000000009000900000000B5 +:10C8700000000000000000000000000000000000B8 :10C8800000000000000000000000000000000000A8 :10C890000000000000000000000000000000000098 :10C8A0000000000000000000000000000000000088 :10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 +:10C8C0000000000000000000000000000001000067 +:10C8D00000000000000000000082000000000000D6 +:10C8E0000001200000000000000000000000000027 :10C8F0000000000000000000000000000000000038 :10C900000000000000000000000000000000000027 :10C910000000000000000000000000000000000017 :10C920000000000000000000000000000000000007 :10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 +:10C940000000000000000000000000900000000057 +:10C9500000000000000000000000000090000090B7 +:10C960000000010090000000000000000000000036 :10C9700000000000000000000000000000000000B7 :10C9800000000000000000000000000000000000A7 :10C990000000000000000000000000000000000097 :10C9A0000000000000000000000000000000000087 :10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 +:10C9C00000000000000000000000000000800000E7 +:10C9D00000000000000000000000000011008000C6 +:10C9E000000000001100A100000000000000000095 :10C9F0000000000000000000000000000000000037 :10CA00000000000000000000000000000000000026 :10CA10000000000000000000000000000000000016 :10CA20000000000000000000000000000000000006 :10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 +:10CA40000000000000000000000000000000008066 +:10CA50000000008000000000000000000000000056 +:10CA600000800000008000080980001000800000A5 :10CA700000000000000000000000000000000000B6 :10CA800000000000000000000000000000000000A6 :10CA90000000000000000000000000000000000096 :10CAA0000000000000000000000000000000000086 :10CAB0000000000000000000000000000000000076 :10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 +:10CAD000000800000010000000000000000000003E +:10CAE00000000020000000C000010102000100025F :10CAF0000000000000000000000000000000000036 :10CB00000000000000000000000000000000000025 :10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 :10CB300000000000000000000000000000000000F5 :10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 +:10CB500000000000C0900000000000000000000085 +:10CB6000000001000088880001009100088808008A +:10CB700000000000020000000000000000000000B3 :10CB800000000000000000000000000000000000A5 :10CB90000000000000000000000000000000000095 :10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 :10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 +:10CBD00000001000000000800000000000000000C5 +:10CBE000000000004100008000000900410080803A +:10CBF00080004100000080000000000000000000F4 :10CC00000000000000000000000000000000000024 :10CC10000000000000000000000000000000000014 :10CC20000000000000000000000000000000000004 :10CC300000000000000000000000000000000000F4 :10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 +:10CC50000000000000118000000000000000000043 +:10CC60000000000000000011000000800000001122 +:10CC7000000000800800000000000000000000002C :10CC800000000000000000000000000000000000A4 :10CC90000000000000000000000000000000000094 :10CCA0000000000000000000000000000000000084 :10CCB0000000000000000000000000000000000074 :10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 +:10CCD00000000000000000012000008800000000AB +:10CCE0000000000000000000000100000040000003 +:10CCF00000010000004001000000000000000000F2 :10CD00000000000000000000000000000000000023 :10CD10000000000000000000000000000000000013 :10CD20000000000000000000000000000000000003 :10CD300000000000000000000000000000000000F3 :10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 +:10CD500000000000000000000000000007000000CC +:10CD600000000000000000000000000000000700BC +:10CD70008221000000E007008200000000000000A7 :10CD800000000000000000000000000000000000A3 :10CD90000000000000000000000000000000000093 :10CDA0000000000000000000000000000000000083 :10CDB0000000000000000000000000000000000073 :10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 +:10CDD0000000000000000000000000FF000000FF55 :10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 +:10CDF000F0F0000000000000F0F000000000000073 :10CE00000000000000000000000000000000000022 :10CE10000000000000000000000000000000000012 :10CE20000000000000000000000000000000000002 :10CE300000000000000000000000000000000000F2 :10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 +:10CE500000000000000000000000000000FF0000D3 +:10CE600000FF0000000000000000000000000000C3 +:10CE70000000F0F0000000000000F0F000000000F2 :10CE800000000000000000000000000000000000A2 :10CE90000000000000000000000000000000000092 :10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 :10CEC0000000000000000000000000000000000062 :10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 +:10CEE000FF000000FFFF0000000000000000000045 +:10CEF00000000F0F0000FFFF0000FFFF0000FFFF1A :10CF00000000000000000000000000000000000021 :10CF10000000000000000000000000000000000011 :10CF20000000000000000000000000000000000001 :10CF300000000000000000000000000000000000F1 :10CF400000000000000000000000000000000000E1 :10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 +:10CF60000000FF00000000000000000000000000C2 +:10CF7000000000000F0F0000000000000000000093 :10CF800000000000000000000000000000000000A1 :10CF90000000000000000000000000000000000091 :10CFA0000000000000000000000000000000000081 :10CFB0000000000000000000000000000000000071 :10CFC0000000000000000000000000000000000061 :10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 +:10CFE000000015002A00054000A800000000000015 +:10CFF0000000000005002A00054000A805402A06A0 +:10D00000054C00A800000000000000000000000027 :10D010000000000000000000000000000000000010 :10D020000000000000000000000000000000000000 :10D0300000000000000000000000000000000000F0 @@ -130342,7 +130342,7 @@ :10D0500000000000000000000000000000000000D0 :10D0600000000000000000000000000000000000C0 :10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 +:10D080003C3CFFFF0000000000000000000000002A :10D090000000000000000000000000000000000090 :10D0A0000000000000000000000000000000000080 :10D0B0000000000000000000000000000000000070 @@ -130350,7 +130350,7 @@ :10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F +:10D1000000003C3C000000000000000000000000A7 :10D11000000000000000000000000000000000000F :10D1200000000000000000000000000000000000FF :10D1300000000000000000000000000000000000EF @@ -130358,7 +130358,7 @@ :10D1500000000000000000000000000000000000CF :10D1600000000000000000000000000000000000BF :10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F +:10D18000000000000000F0F00000000000000000BF :10D19000000000000000000000000000000000008F :10D1A000000000000000000000000000000000007F :10D1B000000000000000000000000000000000006F @@ -130366,58 +130366,58 @@ :10D1D000000000000000000000000000000000004F :10D1E000000000000000000000000000000000003F :10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E +:10D200000000000000000000F0F00000000000003E :10D21000000000000000000000000000000000000E :10D2200000000000000000000000000000000000FE :10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000020000000BE -:10D2500000000000000000000000000000000000CE -:10D26000000000000000000000000000200000009E -:10D2700000000000000000000000000000000000AE -:10D280000000000000000000000000000000000896 -:10D29000000000021000000000000040000000003C -:10D2A000000000000041000000000000000000112C -:10D2B000000000000000000000000000000000006E +:10D2400000000000000000000000000000000002DC +:10D2500020000000000000000000000000000000AE +:10D2600000000000000000000000000500000000B9 +:10D270002000000000100000000000030002000079 +:10D28000000000100000000000000000000000008E +:10D290000000200000000008000000000000000066 +:10D2A0000000000000000000000000080000000076 +:10D2B0000002200000020002000000000000000048 :10D2C000000000000000000000000000000000005E :10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E +:10D2E000000200000000000000000000000000003C :10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000010000D -:10D31000000000000000000000000000000000000D +:10D30000000000000000000000000000000000001D +:10D31000000000000000000200000000000000000B :10D3200000000000000000000000000000000000FD :10D3300000000000000000000000000000000000ED -:10D3400000000000000000000000000000000010CD +:10D3400000000000000000000000000000000000DD :10D3500000000000000000000000000000000000CD -:10D3600000000000000000000200000000000010AB -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D -:10D39000001000000000000000000000000000007D +:10D3600008000000000000000000000000000010A5 +:10D3700000008200000000000000840000000000A7 +:10D38000000000000000001000000000000000008D +:10D390000010024102000200020000000000000034 :10D3A000000000000000000000000000000000007D -:10D3B000001000000000000000000000000000005D -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC -:10D43000000000000090000000000000000000005C -:10D4400000000000000000000000000000000000DC -:10D4500008000800000000000800080000000000AC -:10D4600000000000000000000000000000000000BC +:10D3B000000000000000000000000000000000006D +:10D3C0000000000000000000000000080008000845 +:10D3D00000080000000000000000000200840000BF +:10D3E0000008000000000000000000040004000825 +:10D3F0000008000000000000000000000000000025 +:10D400000008000000000000000000000000000410 +:10D410000008000880C0800080008000000000003C +:10D4200000000008000000000000000000000000F4 +:10D4300000080010000000000000000000020000D2 +:10D44000000000C000030000000000000000000019 +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000008B4 :10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D490000000000002000000000000000400000086 -:10D4A0000000000000000000000000000000040078 -:10D4B0000000400010008400400004000800040048 +:10D48000000000020000200000000000000000007A +:10D4900000000000000090008800000000009000E4 +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C :10D4D000000000000000000000000000000000004C :10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B -:10D5200000000000000010000000000000000000EB -:10D530000000000000000000000000000000008863 +:10D4F0000000000000000008000000000000002004 +:10D50000000000000000000000000000000000C05B +:10D5100000000000000000001100000000000000FA +:10D5200011000000000000000000000000000000EA +:10D5300000000000000000000000000000000000EB :10D5400000000000000000000000000000000000DB :10D5500000000000000000000000000000000000CB :10D5600000000000000000000000000000000000BB @@ -130435,28 +130435,28 @@ :10D6200000000000000000000000000000000000FA :10D6300000000000000000000000000000000000EA :10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA +:10D6500000000000000000000000001000000000BA :10D6600000000000000000000000000000000000BA :10D6700000000000000000000000000000000000AA :10D68000000000000000000000000000000000009A :10D69000000000000000000000000000000000008A -:10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000000000006A +:10D6A0004000020040000000200040400000000058 +:10D6B000200000000000000000000000000000004A :10D6C000000000000000000000000000000000005A -:10D6D000000000000000000000000000000000004A +:10D6D0000000000000000000000000080000000042 :10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D710000000000000000000000000880020000061 -:10D7200008000000000000000000000000001000E1 -:10D730000000000000000000050000200020002084 -:10D7400011000000000000001100000000000000B7 +:10D6F0000000000000000000000000080000000022 +:10D700000000000000840000000000000000000095 +:10D710000084040000C000840020210000004000BC +:10D720000000000080880000000080000001000070 +:10D730000000800000000000000000000008000061 +:10D7400000200000000000000000000000000000B9 :10D7500000000000000000000000000000000000C9 :10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 -:10D7A0000000000000000000000000000000000079 +:10D780000000000000000000000000000000000297 +:10D7900000000000880000000000000900000000F8 +:10D7A00000020000000000000000C000C000C00037 :10D7B0000000000000000000000000000000000069 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 @@ -130472,16 +130472,16 @@ :10D8700000000000000000000000000000000000A8 :10D880000000000000000000000000000000000098 :10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000000000000000068 +:10D8A00000000000000000C000000008000041C0AF +:10D8B00001000300000141C0040005010001000057 :10D8C0000000000000000000000000000000000058 :10D8D0000000000000000000000000000000000048 :10D8E0000000000000000000000000000000000038 :10D8F0000000000000000000000000000000000028 :10D900000000000000000000000000000000000017 :10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 -:10D9300000000000000000000000000000000000E7 +:10D920000000000000000000008000000000000077 +:10D9300091911003900800089188850390090008D0 :10D9400000000000000000000000000000000000D7 :10D9500000000000000000000000000000000000C7 :10D9600000000000000000000000000000000000B7 @@ -130489,48 +130489,48 @@ :10D980000000000000000000000000000000000097 :10D990000000000000000000000000000000000087 :10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 +:10D9B0008000090008210811904109800321051108 +:10D9C000A0030000000000000000000000000000B4 :10D9D0000000000000000000000000000000000047 :10D9E0000000000000000000000000000000000037 :10D9F0000000000000000000000000000000000027 :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 :10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 +:10DA30000000C000012001000001C101010400003C +:10DA40000001C00100000000000000000000000014 :10DA500000000000000000000000000000000000C6 :10DA600000000000000000000000000000000000B6 :10DA700000000000000000000000000000000000A6 :10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 -:10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 +:10DAA00000000000000000000000000000000090E6 +:10DAB0000000000000C000000000010003C10000E1 +:10DAC0000001000003C10000000000000000000091 :10DAD0000000000000000000000000000000000046 :10DAE0000000000000000000000000000000000036 :10DAF0000000000000000000000000000000000026 :10DB00000000000000000000000000000000000015 :10DB10000000000000000000000000000000000005 :10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 +:10DB30000000000000000080000303080808918333 +:10DB4000000305100508918300000000000000009C :10DB500000000000000000000000000000000000C5 :10DB600000000000000000000000000000000000B5 :10DB700000000000000000000000000000000000A5 :10DB80000000000000000000000000000000000095 :10DB90000000000000000000000000000000000085 :10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 +:10DBB0000000000000000000000088830809418088 +:10DBC0000941830821090580094100000000000087 :10DBD0000000000000000000000000000000000045 :10DBE0000000000000000000000000000000000035 :10DBF0000000000000000000000000000000000025 :10DC00000000000000000000000000000000000014 :10DC10000000000000000000000000000000000004 :10DC200000000000000000000000000000000000F4 -:10DC300000000000000000000000000000000000E4 -:10DC400000000000000000000000000000000000D4 +:10DC3000000000000000008808000000C002000191 +:10DC400000840101C088000100840101000000007F :10DC500000000000000000000000000000000000C4 :10DC600000000000000000000000000000000000B4 :10DC700000000000000000000000000000000000A4 @@ -130538,24 +130538,24 @@ :10DC90000000000000000000000000000000000084 :10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 -:10DCC0000000000000000000000000000000000054 +:10DCC00000E000000006000000E00000001100007D :10DCD0000000000000000000000000000000000044 :10DCE0000000000000000000000000000000000034 :10DCF0000000000000000000000000000000000024 :10DD00000000000000000000000000000000000013 :10DD10000000000000000000000000000000000003 :10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 +:10DD300000000000000000000F0F0F0FC3C3FFFF23 +:10DD40000000FFFF9999FFFF0000FFFF9999FFFF77 :10DD500000000000000000000000000000000000C3 :10DD600000000000000000000000000000000000B3 :10DD700000000000000000000000000000000000A3 :10DD80000000000000000000000000000000000093 :10DD90000000000000000000000000000000000083 :10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000000000000053 -:10DDD0000000000000000000000000000000000043 +:10DDB000000000000000000000000F0F0F0FC3C3A1 +:10DDC000FFFFFFFFFFFF9999FFFFFFFFFFFF9999FB +:10DDD000FFFF000000000000000000000000000045 :10DDE0000000000000000000000000000000000033 :10DDF0000000000000000000000000000000000023 :10DE00000000000000000000000000000000000012 @@ -130569,41 +130569,41 @@ :10DE80000000000000000000000000000000000092 :10DE90000000000000000000000000000000000082 :10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 -:10DED0000000000000000000000000000000000042 +:10DEB0000000000000000000000000000000FFFF64 +:10DEC000F0F0FFFF9999FFFF9999FFFF0000FFFF16 +:10DED00099990000FFFF0000000000000000000012 :10DEE0000000000000000000000000000000000032 :10DEF0000000000000000000000000000000000022 :10DF00000000000000000000000000000000000011 :10DF10000000000000000000000000000000000001 :10DF200000000000000000000000000000000000F1 :10DF300000000000000000000000000000000000E1 -:10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000000000000C1 +:10DF4000FFFFF0F0FFFF9999FFFF9999FFFFFFFF97 +:10DF5000FFFF999900000000000000000000000091 :10DF600000000000000000000000000000000000B1 :10DF700000000000000000000000000000000000A1 :10DF80000000000000000000000000000000000091 :10DF90000000000000000000000000000000000081 :10DFA0000000000000000000000000000000000071 :10DFB0000000000000000000000000000000000061 -:10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000000000000000041 +:10DFC0000000400280000020920240E38001002116 +:10DFD000920240E3800100218A020000000000005C :10DFE0000000000000000000000000000000000031 :10DFF0000000000000000000000000000000000021 :10E000000000000000000000000000000000000010 :10E010000000000000000000000000000000000000 :10E0200000000000000000000000000000000000F0 :10E0300000000000000000000000000000000000E0 -:10E0400000000000000000000000000000000000D0 -:10E0500000000000000000000000000000000000C0 +:10E04000000000000000000000000000553C553CAE +:10E05000F0F4FBFF5555FC0C3071B2F300000000EA :10E0600000000000000000000000000000000000B0 :10E0700000000000000000000000000000000000A0 :10E080000000000000000000000000000000000090 :10E090000000000000000000000000000000000080 :10E0A0000000000000000000000000000000000070 :10E0B0000000000000000000000000000000000060 -:10E0C0000000000000000000000000000000000050 -:10E0D0000000000000000000000000000000000040 +:10E0C0000000000000000000000000000000553FBC +:10E0D000553000040B0F55553C3C3030F3F3000035 :10E0E0000000000000000000000000000000000030 :10E0F0000000000000000000000000000000000020 :10E10000000000000000000000000000000000000F @@ -130611,7 +130611,7 @@ :10E1200000000000000000000000000000000000EF :10E1300000000000000000000000000000000000DF :10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000000BF +:10E15000FCFCAC0C780078FF3C0F3C0FF4FCFEFCA0 :10E1600000000000000000000000000000000000AF :10E17000000000000000000000000000000000009F :10E18000000000000000000000000000000000008F @@ -130619,35 +130619,35 @@ :10E1A000000000000000000000000000000000006F :10E1B000000000000000000000000000000000005F :10E1C000000000000000000000000000000000004F -:10E1D000000000000000000000000000000000003F -:10E1E000000000000000000000000000000000002F +:10E1D00000005CFC0C0C3C003CFF3C5F3C0A040C67 +:10E1E0000E0C000000000000000000000000000015 :10E1F000000000000000000000000000000000001F -:10E200000000000000000004000000000000000406 -:10E2100000000000000000040400000000000000F6 -:10E2200000000000000000000000000000000000EE -:10E2300000000000000000002000000000000000BE -:10E2400000000000000000000004000400000000C6 -:10E25000000000000000000000002000000000009E -:10E2600000000000000000000000040000000000AA -:10E270000000000000000000000088000000000016 -:10E28000000000000000000000000000000400008A -:10E29000000000000000000000000000000000007E -:10E2A000000000000000000000000000000000006E +:10E20000000000000000000400000000000000000A +:10E2100000020000000000000000000000000004F8 +:10E2200000000000000000040000000000000000EA +:10E2300000020000000000000000000000000000DC +:10E2400000000000000000000000000000000000CE +:10E2500000000002000000000000000000000000BC +:10E2600000000000000000000000000000000000AE +:10E27000000000000002000000000002000000009A +:10E28000000000000000000000000000000000028C +:10E29000000000000000000000020000000000007C +:10E2A0000000000000000000000000040000000268 :10E2B000000000000000000000000000000000005E -:10E2C000000000000000000000000000100000003E -:10E2D000000000000000000000000000000000003E +:10E2C000000000001000000000000002000000003C +:10E2D000000000000000000000000000000200003C :10E2E000000000000000000000000000000000002E -:10E2F000000000000000000000000000000000001E +:10E2F000000000000000000000020000000000001C :10E30000000000000000000000000000000000000D :10E3100000000000000000000000000000000000FD :10E3200000000000000000000000000000000000ED :10E3300000000000000000000000000000000000DD :10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD -:10E3600000000000000000000000000000000000AD +:10E3600000000000000000000000000000000200AB :10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D +:10E380000004000000000000000000000002000087 +:10E39000000200000000000000000000000000007B :10E3A000000000000000000000000000000000006D :10E3B000000000000000000000000000000000005D :10E3C000000000000000000000000000000000004D @@ -130659,25 +130659,25 @@ :10E4200000000000000000000000000000000000EC :10E4300000000000000000000000000000000000DC :10E4400000000000000000000000000000000000CC -:10E4500000000000000000000000000000000000BC -:10E4600000000000000000000400000000000000A8 -:10E470000000000000000000880000008400000090 +:10E4500000000000040000000000040000000000B4 +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C :10E48000000000000000000000000000000000008C :10E49000000000000000000000000000000000007C :10E4A000000000000000000000000000000000006C :10E4B000000000000000000000000000000000005C -:10E4C000000000000000000000000000000000004C -:10E4D000000000000000000000000000000000003C -:10E4E0000000000000000400000000000000040024 +:10E4C000000000000000000000000000002000002C +:10E4D00000000000000041000000000000000000FB +:10E4E000000000002000000000000000000000000C :10E4F000000000000000000000000000000000001C -:10E500000000000008000000000000000000000003 +:10E50000000000000000000000000000000000000B :10E5100000000000000000000000000000000000FB :10E5200000000000000000000000000000000000EB :10E5300000000000000000000000000000000000DB :10E5400000000000000000000000000000000000CB :10E5500000000000000000000000000000000000BB :10E5600000000000000000000000000000000000AB -:10E570000000000000000200000000000000000099 +:10E57000000000000000000000000000000000009B :10E58000000000000000000000000000000000008B :10E59000000000000000000000000000000000007B :10E5A000000000000000000000000000000000006B @@ -130691,7 +130691,7 @@ :10E6200000000000000000000000000000000000EA :10E6300000000000000000000000000000000000DA :10E6400000000000000000000000000000000000CA -:10E6500000000000000000000000000000000000BA +:10E65000000000000000400000000000000000007A :10E6600000000000000000000000000000000000AA :10E67000000000000000000000000000000000009A :10E68000000000000000000000000000000000008A @@ -130699,16 +130699,16 @@ :10E6A000000000000000000000000000000000006A :10E6B000000000000000000000000000000000005A :10E6C000000000000000000000000000000000004A -:10E6D000000000000000000000000020000000001A -:10E6E000000000000000000000000000000000002A -:10E6F0000000000000000020000000000000008872 +:10E6D00000000000000000200000000000000420F6 +:10E6E000000000880904099005884000008809900E +:10E6F0002188000000000000000000000000000071 :10E700000000000000000000000000000000000009 :10E7100000000000000000000000000000000000F9 :10E7200000000000000000000000000000000000E9 :10E7300000000000000000000000000000000000D9 :10E7400000000000000000000000000000000000C9 :10E7500000000000000000000000000000000000B9 -:10E7600000000000000000000000000000000000A9 +:10E760000000000000000000000084000000000025 :10E770000000000000000000000000000000000099 :10E780000000000000000000000000000000000089 :10E790000000000000000000000000000000000079 @@ -130817,92 +130817,92 @@ :10EE00000000000000000000000000000000000002 :10EE100000000000000000000000000000000000F2 :10EE200000000000000000000000000000000000E2 -:10EE300000000000000000000000000000000000D2 +:10EE300000000000000000000004000000000000CE :10EE400000000000000000000000000000000000C2 :10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 +:10EE6000000000020002000000000003000000009B :10EE70000000000000000000000000000000000092 -:10EE80000000000000000000000200000000000080 -:10EE90000000000000000000000000000000000072 +:10EE8000000000000000000200000000C000880038 +:10EE90000000A000000000000000000000000000D2 :10EEA0000000000000000000000000000000000062 -:10EEB0000000000000000000000000000000000052 +:10EEB000000000040000000000040000000000004A :10EEC0000000000000000000000000000000000042 -:10EED0000000000000000000000000000000000032 +:10EED000000000000004000000000000000000002E :10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000001000000002 -:10EF000000000000000000000000000010000000F1 +:10EEF0000000000000000000000000000000000012 +:10EF000000000000000400000000000000000000FD :10EF100000000000000000000000000000000000F1 :10EF200000000000000000000000000000000000E1 -:10EF300000000000000000000000000000000000D1 -:10EF400000000000000000000000000002100000AF +:10EF30000000000000000080000000000000000051 +:10EF400000000000000000000000000000100000B1 :10EF500000000000000000000000000000000000B1 -:10EF6000000000000000000000000000021000008F -:10EF70000000000000000000000000000000000091 -:10EF8000000000000000000000000000000002106F -:10EF90000000000000000000000000080000000069 -:10EFA0000000000000000000000000000000004021 -:10EFB0000000000000000000000000000000000051 +:10EF6000000000100000020000000000004000004F +:10EF70000800000000000000000000000000000089 +:10EF8000000000000000000004000100010001007A +:10EF9000010001000100040000000000000000006A +:10EFA00000000000000000800000000000000000E1 +:10EFB00000840000000000080040008200000008FB :10EFC0000000000000000000000000000000000041 -:10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 -:10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000000000000000D0 -:10F0400000000000000000000000000000000000C0 -:10F0500000000000000000000000000000000000B0 -:10F0600000000000000000000000000000000000A0 +:10EFD000008400000000000800000000000000089D +:10EFE0000000000000000008800000000000000891 +:10EFF0000000000000000000000800000000000009 +:10F000000008000000000000000880000400040068 +:10F010000440040004000400C108000000000000D7 +:10F0200000080000000000000004000000000000D4 +:10F0300000080000000000000000000000000000C8 +:10F0400000000003000000000000000000000000BD +:10F050000000000000000000000000000040000070 +:10F06000000000030000000000000000000000009D :10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F090000000000000000000000000000000000070 -:10F0A0000400000000000400000000000000000058 +:10F08000000004000000C0000400040000000400B0 +:10F090004000040804000400008004000000000098 +:10F0A0000000000000000000000000000000000060 :10F0B0000000000000000000000000000000000050 :10F0C0000000000000000000000000000000000040 :10F0D0000000000000000000000000000000000030 :10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000000FF -:10F1100000000000000000000000000000000000EF -:10F1200000000000000004000000000000000000DB +:10F1000000000000000000000400000000000000FB +:10F11000800000008000800080000020800000004F +:10F1200000000000000000000000000000000000DF :10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF +:10F1400000000000010000000000000000000000BE +:10F15000002100000000000000000000000000008E :10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F +:10F17000000000000100000000000000000000008E +:10F1800000000000000084000000C000000000003B :10F19000000000000000000000000000000000006F :10F1A000000000000000000000000000000000005F -:10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000000000000000003F +:10F1B0000000000000000000000800000000000047 +:10F1C000000000000000040000000000000000003B :10F1D000000000000000000000000000000000002F :10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F +:10F1F00000000000100004000000000000000000FB :10F2000000000000000000000000000000000000FE :10F2100000000000000000000000000000000000EE :10F2200000000000000000000000000000000000DE :10F2300000000000000000000000000000000000CE -:10F2400000000000000000000000000000000000BE -:10F2500000000000000000000000000000000000AE +:10F24000000000000000002000000000000000009E +:10F2500000000000000000000008000000000000A6 :10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E -:10F29000000000000000000000000000000000006E +:10F27000000000000000002000100000000000005E +:10F28000000000000000000010000000000000006E +:10F29000000000000080000000800000000000006E :10F2A000000000000000000000000000000000005E :10F2B000000000000000000000000000000000004E -:10F2C000000000000000000000000000000000003E +:10F2C000000000000000000000010000000000003D :10F2D000000000000000000000000000000000002E :10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E +:10F2F000000000000000000000010000000000000D :10F3000000000000000000000000000000000000FD -:10F3100000000000000000000000000000000000ED -:10F3200000000000000000000000000000000000DD -:10F33000402000000000000000000000000000006D +:10F310000000400000200520000000200300050040 +:10F3200000000004050000000000000000000000D4 +:10F3300000000000000000000000000000000000CD :10F3400000000000000000000000000000000000BD -:10F3500000000000000000000000000000000000AD +:10F3500000000000000800000000000000000000A5 :10F36000000000000000000000000000000000009D :10F37000000000000000000000000000000000008D -:10F38000000000000000000000000000000000007D +:10F380000000000000000005000000000000002157 :10F39000000000000000000000000000000000006D :10F3A000000000000000000000000000000000005D :10F3B000000000000000000000000000000000004D @@ -130911,103 +130911,103 @@ :10F3E000000000000000000000000000000000001D :10F3F000000000000000000000000000000000000D :10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC +:10F4100000000000000000000500000000000000E7 :10F4200000000000000000000000000000000000DC :10F4300000000000000000000000000000000000CC -:10F4400000000000000000000000000000000000BC +:10F44000000000000000000000000000900000002C :10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C +:10F4700000000000000000000000000090000000FC :10F48000000000000000000000000000000000007C :10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C :10F4B000000000000000000000000000000000004C -:10F4C000000000000000000000000000000000003C +:10F4C00000000000000000000000000011008000AB :10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C +:10F4F000000000000000000000000000110080007B :10F5000000000000000000000000000000000000FB :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB :10F5300000000000000000000000000000000000CB :10F5400000000000000000000000000000000000BB -:10F5500000000000000000000000000000000000AB +:10F5500000800000008000000000000000000000AB :10F56000000000000000000000000000000000009B :10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000007B +:10F58000008000000080000000000000000000007B :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B :10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B -:10F5D000000000000000000000000000000000002B +:10F5D0000000002000000008000000000000000003 :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA +:10F6000000000020000000080000000000000000D2 :10F6100000000000000000000000000000000000EA -:10F6200000000000000000000000000000000000DA -:10F6300000000000000000000000000000000000CA +:10F62000000000000020000000400000004000003A +:10F6300000200000000000000000000000000000AA :10F6400000000000000000000000000000000000BA -:10F6500000000000000000000000000000000000AA +:10F650000000010000888800000000000000000099 :10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A +:10F680000000010000888800000000000000000069 :10F69000000000000000000000000000000000006A -:10F6A000000000000000000000000000000000005A -:10F6B000000000000000000000000000000000004A -:10F6C000000000000000000000000000000000003A -:10F6D000000000000000000000000000000000002A +:10F6A000000000000000000020000000000000003A +:10F6B0000800000000000000000000000000000042 +:10F6C0000000010000000000000000000000000039 +:10F6D0000000000041000080000000000000000069 :10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 +:10F700000000000041000080000000000000000038 :10F7100000000000000000000000000000000000E9 -:10F7200000000000000000000000000000000000D9 +:10F720000000000000002000000000000000200099 :10F7300000000000000000000000000000000000C9 -:10F7400000000000000000000000000000000000B9 -:10F7500000000000000000000000000000000000A9 +:10F7400000000000100000000000000000000000A9 +:10F750000000000000000011000000800000000018 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 -:10F780000000000000000000000000000000000079 +:10F7800000000000000000110000008000000000E8 :10F790000000000000000000000000000000000069 -:10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000000000000000000000049 +:10F7A0000000000000000000000000080000000051 +:10F7B0000000000800000000000000000000000041 :10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 +:10F7D00000000000000000000001000000400000E8 :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 +:10F8000000000000000000000001000000400000B7 :10F8100000000000000000000000000000000000E8 :10F8200000000000000000000000000000000000D8 :10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 -:10F8500000000000000000000000000000000000A8 -:10F860000000000000000000000000000000000098 +:10F8500000000000000000000000000000000700A1 +:10F860008200000000000000000000000000000016 :10F870000000000000000000000000000000000088 -:10F880000000000000000000000000000000000078 -:10F890000000000000000000000000000000000068 +:10F880000000000000000000000000000000070071 +:10F8900082000000000000000000000000000000E6 :10F8A0000000000000000000000000000000000058 -:10F8B0000000000000000000000000000000000048 -:10F8C0000000000000000000000000000000000038 +:10F8B000070000000000000007000000000000003A +:10F8C00000000000000000E0000000000000000058 :10F8D0000000000000000000000000000000000028 -:10F8E0000000000000000000000000000000000018 +:10F8E000F0F0000000000000000000000000000038 :10F8F0000000000000000000000000000000000008 :10F9000000000000000000000000000000000000F7 -:10F9100000000000000000000000000000000000E7 +:10F91000F0F0000000000000000000000000000007 :10F9200000000000000000000000000000000000D7 :10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 :10F9500000000000000000000000000000000000A7 -:10F960000000000000000000000000000000000097 +:10F960000000F0F0000000000000000000000000B7 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 -:10F990000000000000000000000000000000000067 +:10F990000000F0F000000000000000000000000087 :10F9A0000000000000000000000000000000000057 :10F9B0000000000000000000000000000000000047 :10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000000000000000017 +:10F9E000000000000000FFFF000000000000000019 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 +:10FA1000000000000000FFFF0000000000000000E8 :10FA200000000000000000000000000000000000D6 :10FA300000000000000000000000000000000000C6 :10FA400000000000000000000000000000000000B6 @@ -131020,14 +131020,14 @@ :10FAB0000000000000000000000000000000000046 :10FAC0000000000000000000000000000000000036 :10FAD0000000000000000000000000000000000026 -:10FAE0000000000000000000000000000000000016 +:10FAE0000000000005000A00054000A8000000001A :10FAF0000000000000000000000000000000000006 :10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 +:10FB10000000000005000A00054000A800000000E9 :10FB200000000000000000000000000000000000D5 -:10FB300000000000000000000000000000000000C5 -:10FB400000000000000000000000000000000000B5 -:10FB500000000000000000000000000000000000A5 +:10FB300000000000000005000A08050000A0050004 +:10FB40000A08050000A0000000000000000000619D +:10FB50000006000D00000000000000000000000092 :10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 @@ -131060,192 +131060,192 @@ :10FD300000000000000000000000000000000000C3 :10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000000000000000000093 -:10FD70000000000000000000000000000000008003 -:10FD80000000001000000010000000400000008093 -:10FD90000000004000000000000000000000000023 -:10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000000000000043 -:10FDC00000800080004000400000000000000000B3 -:10FDD0000000000000000000000000000000000023 +:10FD6000000000000000000000000005000000008E +:10FD700000000003000000039000000000000000ED +:10FD800000000008000000008800000000000000E3 +:10FD9000000000000000000000000004000000005F +:10FDA0000000000400040003000000000000000048 +:10FDB0000000000000000000C00000000000000083 +:10FDC0000000000000000000000000000000000033 +:10FDD00000004000000000000000000000000000E3 :10FDE0000000000000000000000000000000000013 :10FDF0000000000000000000000000000000000003 -:10FE000000400000000100000001000000010000AF -:10FE100000100000000100000000000000000000D1 -:10FE200000000000000000000000000000000000D2 -:10FE300000000000000000000000000000000002C0 -:10FE40000000001000100001000100000000000090 +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000002D0 +:10FE30000090000000020002000200020002000028 +:10FE400000000002000000000000000000000000B0 :10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 +:10FE60000000009000000000000000000000000002 :10FE70000000000000000000000000000000000082 :10FE80000000000000000000000000000000000072 -:10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000000000000000052 -:10FEB0000000000000000000000000000000000042 +:10FE90000000000000000000000000000200000060 +:10FEA00000000000000000000000000000000080D2 +:10FEB00000000000008000000000000000000000C2 :10FEC0000000000000000000000000000000000032 :10FED0000000000000000000000000000000000022 :10FEE0000000000000000000000000000000000012 -:10FEF00000000000000000000000000000000008FA -:10FF0000000000000000000000000008000800845D -:10FF100000000000000000000000000000000008D9 -:10FF200000000000000000000000000800000008C1 -:10FF300000000008000800000000000000000000B1 -:10FF40000084000000000008000800080008000805 -:10FF5000008400080008000000000000000000000D -:10FF60000000000000000008000800080008000869 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 -:10FF9000000000000000000000000000000000055C -:10FFA0000021000000000000000800080000000020 -:10FFB0000000000800000000000000000000000039 -:10FFC0000000000000000000000000000000000031 -:10FFD0000000000800000000000000000000000019 -:10FFE0000000000800000000000000000000000009 +:10FEF00000000008000000000000020000000000F8 +:10FF000000000008000000000000000000000000E9 +:10FF100000000008000800000000000000000000D1 +:10FF20000000410800000000000200000000000086 +:10FF30000020000000080040000000000000000059 +:10FF400000000000000800000000000002000000A7 +:10FF50000000000000080000000000000000000099 +:10FF60000000000000080000000000000000000089 +:10FF70000000000000000008000000000000000079 +:10FF80000000001100000000000000000000000060 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000010000000010030 +:10FFC000000000000000000004000000A00000008D +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000000000000000000000011 :10FFF0000000000000000000000000000000000001 :020000040020DA -:1000000000000000000000000000000000000000F0 +:100000000000009000000000000000000000000060 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000000000000A0 +:100030000000000000000000400000000000000080 +:10004000040005002100050000000300000000007E +:10005000410000000000000000000000000000005F :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 +:10008000000000000400000000000000000000006C :100090000000000000000000000000000000000060 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 +:1000A0000000000008000000000000000000000048 +:1000B000000000000580010001000000C0000000F9 :1000C0000000000000000000000000000000000030 :1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 +:1000E0000000000008000000000000000000000008 :1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF +:10010000000000000000800041000000000000002E +:1001100000000000000000080000000000000000D7 +:10012000410000000000000000000000008200000C +:100130001000000000008420040004000000000003 :1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F +:100180000000000020000400000000000400000047 +:10019000001100000000000000000000100000003E +:1001A000000000001000000000000000000000003F +:1001B0000000000000000000040082000420044051 +:1001C0000010A00000200009C00000000000000096 :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE +:10020000000000000000008480000000000080006A :1002100000000000000000000000000000000000DE :1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE +:100230000000000000000084000080000000800139 +:10024000800100010000000100000000000000002B :10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E -:100270000000000000000000000000000008000076 -:10028000000000000000000000000000000000006E -:100290000000000000000000000000000021000835 -:1002A0000008000000000000000000000021000025 -:1002B0000000000800000000000000000000000036 -:1002C000000000000000000000000000000000002E -:1002D00000000000000000000000000000000021FD +:10026000000000000000000000000000000040004E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000080008001006D +:10029000010200000000000000000000000000005B +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000084803A +:1002C000000001820100100000000000000000009A +:1002D0008409000000000000000000000000000091 :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED -:1003100000000000000000000000000000000000DD +:1003000000000000000000000000000000200020AD +:1003100004820400000000004100410000000000D1 :1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD -:1003400000000000000000000000000000000000AD +:100330004100050000000000000000000000000077 +:1003400008200000044040001000410005000000AB :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D -:100390000000000000000000000000000800000055 +:10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000C000080088008845 +:1003C00010C020100000909000019000000000017B +:1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC -:10041000000000000000000000000000000080005C +:1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC -:1004400000000000000000000000000000000000AC -:10045000000000000000000000000080008000009C +:100440000000808000000000800011108003000385 +:10045000001000000000000000000000000000008C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C -:1004A000000000000002000000000000000000004A +:1004900000000000008000100000000000000000CC +:1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C -:1004C000000000000000000000000000000000002C -:1004D0000000000000000000000000000000000814 +:1004C000000000000000001080008000000000809C +:1004D000008000000000000000000000000000009C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000010000000000000BB -:1005300000020000000000000000000000000000B9 -:1005400000000000000000000000000000000000AB -:10055000000000000000000000000000000000009B -:100560000001008800000000000000000000000002 +:10051000000000000000004000010090000000000A +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:100540000000000000000000100182009000000088 +:100550000020000200100000000000000000000069 +:10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A0000008000800C0000000000000000000007B +:1005900000000000000000000000C000000000009B +:1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B +:1005C0000000000000000000101000880082038876 +:1005D0000100018808000000000000000000000089 :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA -:10062000000000800080008000000000000000004A +:10061000000000000000000010000000800000004A +:1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A +:10064000000000000000000000008000000000002A +:1006500088004100038083002000000000000000AB :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A -:10069000000000000000000000000000000000005A -:1006A00000000000000000000000800000000000CA -:1006B000000080008000000000000000000000003A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E000000000008000800000000000000000000A +:100690000000000000000000000000080021000031 +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C0000000000000000000000000000008809012 +:1006D0000000000080118000008000000000000089 +:1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 -:10072000000000000000000000000000C000020007 -:1007300000000000C00008000200000000000000EF -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:10076000000000000000C0000800000000000000C1 +:1007100000000000000000000000000000010000D8 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:100740000000000000000000000000000000100099 +:1007500010830820880002018200904040000000C1 +:100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 +:1007A000000007000006000000000000000000003C :1007B0000000000000000000000000000000000039 :1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 +:1007D0000081000007040000000000000700820004 :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 -:100820000000000000000000000000000F0F0FFF9C -:1008300000FF99FF000000000FFF99FF000000007B +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000000000000099FF00FF0000F1 +:100850000000F0F000FF72307272C3C3C3CA000020 +:10086000F0F00000000000000000000000000000A8 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000FFFF4A -:1008B0000FFFFFFF99FF000000000FFF99FF0000EE +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 :1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E00000000000000000000000000099FFFFFF72 +:1008D00000000000F0F000C3B130B1B1C3C3C3CA1F +:1008E0000000F0F000000000000000000000000028 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 @@ -131260,25 +131260,25 @@ :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000000000000000017 -:1009E0000000000000000000000000000000000007 -:1009F000FFC3FFF000000000000000000000000046 +:1009D0000000000000000000003CFF66F0FF000F78 +:1009E00000000000FFFF0000000000000000000009 +:1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000FFC3FFF000000000000000000000C5 +:100A500000000000000000000000003C0066909FC5 +:100A6000000F000000000000000000000000000077 +:100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 -:100AA0000000000000000000000000000000000046 -:100AB00000000000000000900000A0000000000006 -:100AC0000000A00000000000000000000000000086 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000A0005000000000000000000006 +:100AA0000000000000000000000005000A0805002A +:100AB00000A0000000000000000000000000000096 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000018503876 +:100AE0000000040005610A06054D00A80000000092 +:100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 @@ -131301,7 +131301,7 @@ :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 +:100C6000000000000000000000000000FFFF000086 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 @@ -131309,441 +131309,441 @@ :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 :100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 +:100CE0000000000000000000000000000080FF7F06 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000200000000000000020000EF -:100E000000000000000000000000000000000002E0 -:100E100000000002000200020000000200000002C8 -:100E200000000000000000000000000000000000C2 -:100E300000000000000000100000000000000000A2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000010000000000000000082 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000001000000000000062 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000001000000000000042 +:100D2000000000000000000000002004000000009F +:100D300000002000000004000000000420009000DB +:100D400090042041000000000000000000000000AE +:100D500000000000000000000000880000020820E1 +:100D6000000000000003000000000000A0000000E0 +:100D7000C000000000000000000000002000000093 +:100D80000400000004000000000000000004000057 +:100D9000040004000400048004800000208000009F +:100DA000880000002000000000000000000000009B +:100DB00000000000000000008002000000008084AD +:100DC00000000000800000000002000000000000A1 +:100DD000000009000000000000000000000000907A +:100DE0008000200000000000000200000000000061 +:100DF00000020000000000000000000000000002EF +:100E000000008000000080000000000000000000E2 +:100E100000000000000000000008000800000008BA +:100E200000020000000000000000000000000000C0 +:100E300000000000000000100000000001000000A1 +:100E40000000010000000900020000000010000086 +:100E50000000000000000010010403040080C080B6 +:100E60000000020000000000000000000800000078 +:100E7000400000000004000000000000000000002E +:100E8000400000000000C000000000000000000062 +:100E9000000000000000000000000000000000084A :100EA0000000000000000000000000000000000042 -:100EB000000000080000000000000008000000081A -:100EC000000800000000000000000000000000001A -:100ED00000000208000800080000000800080008E0 -:100EE00000080000000000000000000000000000FA -:100EF00000000000000800080008000000080008CA -:100F000000080008000000080000000000000000C9 -:100F100000000000000800080008000000080008A9 -:100F20000008000800080008000800080000000091 -:100F30000000000000000008000800000000000899 +:100EB0000000000000000000000000000000200012 +:100EC0000000000040000000C00000000000000022 +:100ED00000000000000000000000200140010004AC +:100EE000000400000000090009000000000080006C +:100EF00000008000009000010000000000000000E1 +:100F00000000800000000000000000000000000061 +:100F100000000000000000000000000000000000D1 +:100F200000010400000000000000000000000000BC +:100F300000000000000000000000000000000000B1 :100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000008000000000000000079 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0001000000000000000000000000000000031 -:100FB00000A0000000000000000000000000000091 -:100FC0000000000000000000000000000000000021 -:100FD000000000000000000000A000000000000071 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 +:100F50000000000000080000000000000041000048 +:100F60000000000000000000000000000000000081 +:100F700000040000010000A1002100210000000089 +:100F80000000400000040020002082050000000056 +:100F90000000A00008000021000000000000000880 +:100FA0000000000000000008000000000000000039 +:100FB0000000000000000000000000000000000031 +:100FC00000000004000000400000000000000000DD +:100FD0000000000000000000000000000800000009 +:100FE00000000000000000000800000008000000F1 +:100FF00000000000000010000510000005000000C7 +:101000000000000000880000000100010000000056 :1010100000000000000000000000000000000000D0 :1010200000000000000000000000000000000000C0 :1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 +:1010400020040120002008200000202020000800AB +:10105000840084000000820000008200C000820042 +:1010600000008400C0000400C00000000000000078 +:1010700000000080000000008200008000001002DC +:10108000000000400040004000400000000000055B +:101090000000000000000000000000000800000048 +:1010A0000000000000000000010000000800000037 :1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 +:1010C000000080012001100100010000800180006B :1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF +:1010E0000000030003004100800000000000000039 +:1010F0000000000000020000008800000010000056 +:1011000000A000000000000000000000000000003F +:10111000000000004100000000000000000000008E +:10112000000000000000000004002000000000009B :1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F +:101140000000000004000000040020000020202017 +:1011500000200000002100000000080084080000BA +:1011600000001000040008000005000002038202D5 +:10117000842004200000000001009000042100846D +:1011800000200411410200110000000000000000D6 +:101190000800000000000021000000000000000026 :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:1012100000080010000800080000000000000000A6 +:1011C00000000000000080001188A00080000001E5 +:1011D000020100010000000000000000000000000B +:1011E000000000000000800000000000000000007F +:1011F000000000000001000009824000030400001C +:1012000000020001A1000401000000000000000035 +:1012100000000000000000000000000000000000CE :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E +:1012400000000000000000000000910020000000ED +:10125000000000000000002000000003000000006B +:10126000000000008400000000000400048004006E +:1012700008418200082100050000A000400088000D +:101280001021000084000002002000000000000087 +:101290008200000000008200000000000000000842 :1012A000000000000000000000000000000000003E -:1012B000000000000000000000000000000000002E -:1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E -:1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD +:1012B0000000000500000000000000000000000029 +:1012C0000500000000000000000000002000800871 +:1012D0000008000000004100410100000000000083 +:1012E00000000000000000000000000080008004FA +:1012F000800000000000000000000000009080005E +:1013000000828000000000000000000100000000DA :1013100000000000000000000000000000000000CD :1013200000000000000000000000000000000000BD :1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D +:10134000000000000000000000000000098800907C +:10135000A0010111212001050290909000000000E1 +:1013600000000000000000000000000010889190C4 +:101370008209824188A00002000410020000C0A07F +:10138000A02041080801A0A0912100118283000043 +:1013900000000200000000909020001088820000F1 +:1013A000000000000000000000000000000001003C :1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC +:1013C000000000000000000000000000000010000D +:1013D0002020080811C01120209091C100030000B6 +:1013E000000000000000000000000000000080007D +:1013F000A0A02088802100800000008000800000E4 +:10140000A080A09103098009A08591A000A080A1DF +:1014100000000000800000000800808000000080C4 :1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC +:10143000110000210000000000000000000000007A :10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C +:10145000080020210580884020400500880211886E :10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C +:1014700090401011838503900000800280800080DE +:1014800000008300102140110900820082200280A8 +:101490009121000000000000000080008021000079 +:1014A00080000000000000000000000000000000BC +:1014B0000000000900001102000000000000000010 :1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB +:1014D0000000908890000110090920219184A10149 +:1014E00091C00000000000000000000000000000AB +:1014F0000000110088001008209010001000848463 +:10150000409000008888910040109100A1000300E5 +:101510000184A191000000000000000088009000FC +:1015200010209000000000000000000000000000FB +:1015300000000000000000000100000000000000AA :10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B +:10155000000000009090019001091010010210910C +:1015600082058489000000000000000000000000E7 +:101570000000000090884090A091090840400010B1 +:10158000904004080000880300910541A02140A07C +:101590000140A1918484000000000001000190023C +:1015A00000100000C0020000000000000000000069 +:1015B0000000000000000000200000010100000009 :1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB -:1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA +:1015D000000000000000000840101008008005A076 +:1015E000041041A1839000000000000000000000F2 +:1015F00000000000000080410803809090888080F7 +:10160000000080008080000000A00510A010800570 +:10161000800002C1821180800003000500100010CC +:1016200080000080000080800000000000000000BA +:10163000000000000000000000008000000808001A :10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A -:10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B000000000000000000000000000000000002A +:1016500000000000000000000808002008801000C2 +:1016600021112008101140110000000000000000AE +:101670000000000000000000A1800280888091111D +:10168000000080000080000000004100C1088821A7 +:1016900088400008800500112005000000000000BF +:1016A000000080000000808080000000000000003A +:1016B0000000000000000000000000021100000017 :1016C000000000000000000000000000000000001A -:1016D000000000000000000000000000000000000A -:1016E00000000000000000000000000000000000FA -:1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 +:1016D0000000000000000000000091A090100140F8 +:1016E000C0C00191012001210001000000000000A4 +:1016F000000000000000000000009108A0C0109051 +:1017000008018800041000900000000041080291C8 +:101710000383110090A0022008A100000000000037 +:101720000000000090001090080804000000000075 +:1017300000000000000000000000000000000100A8 :101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 -:101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 +:10175000000000000000000000000000000000E0A9 +:1017600007000000480002E0070000210000000020 +:10177000000000000000000000000000000000E089 +:101780000700880000000000070000000000820041 +:1017900001E000008100008100E00700000000007F +:1017A0000000000000000000000007000012000020 :1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 +:1017C00000E0000000000000000000000000000039 +:1017D0000000000000000000000000000000AAAAB5 +:1017E0003C3C02F20EFE000000000F0AFFFA00006F +:1017F0000000000000000000000000000000AABE81 +:10180000AFBFAAEBFAFB000000AAAAAAAAFF000039 +:10181000FF553F15C0F5C0050000000078782D2D5C +:101820000000000000000000BABABFBA00000000CB :1018300000000000000000000000000000000000A8 :101840000000000000000000000000000000000098 :101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 +:1018600000FF3C3C02F20EFE000000000707F7F705 :101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 +:10188000003C053D0041F0F1000000000C0C0CFF95 +:101890000000FF55FF55CFF5CF0505000000287863 +:1018A0002D2D000000000000000030303F3000000F +:1018B0003F3F0000000000000000000000000000AA :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 +:1018E0000000FF3C003CF5F5C5C5BEBEC0FCFF5581 +:1018F000EF450000000000000000000000000000B4 +:1019000000001F1FFF1FFF7C7C7C00040000BF3F06 +:10191000BE3C000000A0FFFF2D2D2D7DFF00161600 +:10192000141414140000000000000000FF75757509 +:10193000BFBFBFBF000000000000000000000000AB :101940000000000000000000000000000000000097 :101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 +:1019600000000000FF55005535350505BEBEC0FC22 +:10197000FF55FF55000000000000000000000000BF +:10198000000000001414F414FF4040400000000068 +:101990008F0F82000000000000007D2D7D7DFF0084 +:1019A0003C3C1717D7D70000000000000000FF20C4 +:1019B0002020AAFFAAAA00000000000000000000EA :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 +:1019E0000000000000000061000900010000056522 +:1019F0004A0FC50F20A000000000000000000000FA +:101A000000000000000000610007000D0000000061 +:101A1000000000000000000000410007C01D0000A1 +:101A20000069003C000D050000610006000D00008B +:101A30000000000000100000000000000000000096 +:101A4000000000000000000000000006000C000084 :101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 +:101A600000000000000000007F7F7070AAF0AAF064 +:101A7000F5FF050F00FF3D3D0000000000000000E5 +:101A800000000000000000000C0C0CFF3C053CFFB7 +:101A900000000000000000000000FCFC7D4100F29E +:101AA000FFF2C3C3C3C30000000000000000000E2B :101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 +:101AC000000000000000000000000000FF0000FF18 :101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 +:101AE000000000000000000000002F2F20203CF02C +:101AF0003CF0F7F7070700FFFDFD000000000000C5 +:101B000000000000000000000000000000003CF5A4 +:101B10003CFF00000000000000000000FCFC7D41D4 +:101B200000F7FFF700000000F000F00000000000E8 +:101B3000000E000000000000000000000000000097 +:101B40000000000000000000000000000000FF0096 +:101B500000FF000000000000000000000000000086 +:101B60000000000000000000000000005CFC5CFCC5 +:101B7000FCFC00FF00C3F0AA7D7D41410000000095 +:101B80000000000000000000000000003A3F3A3F63 +:101B9000000FC35500000000000000000000143CCE +:101BA000143C5F0350035555414100000000000004 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 +:101BD000FF0000FF00000000000000000000000007 +:101BE00000000000000000000000000000005C0C8D +:101BF0005C0C0C0C00FFFFC3F0AACF0CCF0C000054 +:101C000000000000000000000000000000003A3F5B +:101C10003A3FFF0FC3550000000000000000000025 +:101C200044CC44CC5FF350F355A541810100000042 :101C300000000000000000000000000000000000A4 :101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D300000020000000000000000000000000000A1 -:101D4000000000020000000200000002000200008B -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 +:101C50000000FF0000FF0000000000000000000086 +:101C60000000200000000000000000000000200034 +:101C70002000200004000500200084000000210056 +:101C8000000020008800000000000000000020008C +:101C90000000200000000000000000000000200004 +:101CA0000003000020000004000000000000000409 +:101CB0000004000000000000000000000000000020 +:101CC0001000000000000000000084000000000080 +:101CD0000400000000000000000000800080000000 +:101CE00088800000000000000000000000000040AC +:101CF0000000809000028000A0048000000000042A +:101D000020000000000000000000000000000900AA +:101D100000000000000400000004000005000000B6 +:101D2000000000000000000000020040000200006F +:101D30000002000200020000000200020000110088 +:101D40000000000200000000000000000000000091 +:101D50000000000000000000000000000040002023 +:101D60000000004000000000000000000000000033 +:101D70000000000020000000200300000000000020 +:101D80000000400000000000000000000080000093 :101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 +:101DA00000000000000000000080000008000000AB +:101DB0000000000010000000000000000000000013 :101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 +:101DD0000000000000000000000000000080010082 +:101DE00001000100000000080000000000000002E7 +:101DF00000000000008280000090800000000000D1 +:101E0000000000008000000800000000000000400A :101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 +:101E2000000000880000000000080020000084007E +:101E3000000000000000000800000000000000009A +:101E40000000000000000000000800820000000800 +:101E50000000000000000008000000000000000476 +:101E6000040804000400000000000000000000005E +:101E7000000800000000000000000000000000005A +:101E80000000000000000000000000200000000032 +:101E9000000000000000000800000000000000003A +:101EA000000000000000000000000000200800000A +:101EB0008208040000000000000000000000000094 +:101EC000000000080000000000000000000000000A +:101ED0000000000000000000000000000000900072 +:101EE00000000000020000000000000000000000F0 +:101EF00000000000090004000000100000002100A4 +:101F000004001100098200000090034000204100FD +:101F10000000000003002100210000000000080074 +:101F200000000982080000822182000021000508CB +:101F300005C000000200009000000000000000004A +:101F4000410000000000000000000000000000024E :101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 +:101F600000000000000080000000080000000000E9 +:101F700000000000000000000005100510200020F7 +:101F800020000804000084092009820000000000ED +:101F90000000000000000000000001000800000038 +:101FA0000000A0000000000000000000000004008D :101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 +:101FC000000000000000C000000000000000000051 +:101FD000000000000000820000000000020000007D +:101FE00000000000000000000000000001000000F0 +:101FF00000000000000000000000000000000001E0 +:1020000000018000000100000000800004000000CA +:1020100000000000000000000000000004000000BC +:1020200000000000000000000000000005000000AB +:10203000800005000000000000000000000000001B :102040000000000000000000000000000000000090 :102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F +:10206000000000000000000000000000400004002C +:102070000000000000000200000004000400100046 +:102080008800040000002000000400000000C004DC +:102090000040000800000000000000000020820056 +:1020A0000000000000000000080000000000000028 +:1020B00000000000001100C101200021000000000C +:1020C0000800000008000000000000000000000000 +:1020D00000000000080000000000C0000000000038 +:1020E000000084000000000000000000000000204C +:1020F0000000000000000000000000900000000050 +:102100000000410091A00002090409010000090833 +:1021100000010000000000000000000000000001BD +:102120000000090020A04100089000C000880000C5 +:102130000000000005C00590082004412100210096 +:1021400005000000030005002100000800882000B1 +:102150000000080000000000000000000000000077 +:102160000000000000A0000000000084000000004B +:102170000001000000000000000900000000000055 +:10218000C00000000000210000200020000000042A +:102190000004000000000000840082000000000035 +:1021A0000000820000000000000088214000400084 +:1021B0004000000000008400040000000000000057 +:1021C000000084000000000000000000000000008B :1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE -:1022100000000000000000000000000000000000BE +:1021E000000000000000000000000000C00000002F +:1021F00000000000000200000000000000000000DD +:102200000000000000001100A0000001000100001B +:1022100000010001000000000000000000000000BC :1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E +:10223000000000000000000000008000000000001E :10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E +:102250000000000000000800000000000000000076 :10226000000000000000000000000000000000006E :10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E -:10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E +:102280000000000000000000020220098210C0903F +:1022900000000500820000000000000000000000B7 +:1022A000000090000000000000000000000000009E +:1022B00000000000000000000000400000000000DE +:1022C000020000000000000000000000000000000C :1022D00000000000000000000000000000000000FE :1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD -:10233000000000000000000000000000000000009D -:10234000000000000000000000000000000000008D +:1022F00000000000002000000000000000000000BE +:102300000000000000000000000083A011088820E9 +:1023100000000000A1000300000000000000000019 +:10232000000011008000000000000000000000001C +:10233000000000000000000000000000200000007D +:10234000000080000000000000000000000000000D :10235000000000000000000000000000000000007D :10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D +:1023700000000000110000800000000000000000CC +:10238000000000000000000000000000900010218C +:102390000900880000880800100511830000000073 +:1023A000000000000000008000000080000000002D :1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D +:1023C000808080000000000000000000000000008D :1023D00000000000000000000000000000000000FD :1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000000CC -:1024100000000000000000000000000000000000BC -:1024200000000000000000000000000000000000AC +:1023F000000000000000000000000000008000005D +:1024000000000000000000000000000000000320A9 +:10241000C1000088830000030100010100030000E7 +:102420000000000000000000002000000008000084 :10243000000000000000000000000000000000009C -:10244000000000000000000000000000000000008C +:1024400088002004A0000040000000000000000000 :10245000000000000000000000000000000000007C :10246000000000000000000000000000000000006C -:10247000000000000000000000000000000000005C +:102470000000000000000000000000200000000438 :10248000000000000000000000000000000000004C -:10249000000000000000000000000000000000003C -:1024A000000000000000000000000000000000002C +:1024900000900090010020900001900000010000D9 +:1024A000000000000000000001000088880000001B :1024B000000000000000000000000000000000001C -:1024C000000000000000000000000000000000000C +:1024C000000000900020200400C000000000000078 :1024D00000000000000000000000000000000000FC :1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC +:1024F0000000000000000000010000900000020049 :1025000000000000000000000000000000000000CB -:1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB +:102510000000002011030500080800100008002139 +:1025200040020000000000000000410000800000A8 :10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B +:102540000000000005800000008000000000000086 :10255000000000000000000000000000000000007B :10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000000003B -:1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B -:1025C000000000000000000000000000000000000B +:102570000000000000000000000008004080000093 +:1025800080000000000000000000000000000000CB +:1025900000000000080309A12000080800801011B5 +:1025A000000040400000000000000000001100009A +:1025B000008000000000000000000000000000009B +:1025C000000000000000001000C00000000000003B :1025D00000000000000000000000000000000000FB :1025E00000000000000000000000000000000000EB :1025F00000000000000000000000000000000000DB :1026000000000000000000000000000000000000CA -:1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA -:10263000000000000000000000000000000000009A -:10264000000000000000000000000000000000008A +:10261000000000000000100020029090000000C0A8 +:1026200001010000000000000000000000000001A7 +:10263000000000400000000000000000000000005A +:102640000000000000000000000000110020000059 :10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A :10267000000000000000000000000000000000005A -:10268000000000000000000000000000000000004A -:10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A -:1026C000000000000000000000000000000000000A +:1026800000000000008800000000000000000000C2 +:102690000000000000000000000000E00700000053 +:1026A000000000E0000081000000000000000000C9 +:1026B0000000000007008200000000000000000091 +:1026C000000000000000000000000081000007047E :1026D00000000000000000000000000000000000FA :1026E00000000000000000000000000000000000EA -:1026F00000000000000000000000000000000000DA -:1027000000000000000000000000000000000000C9 -:1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 +:1026F00000000000000000000000000000E00000FA +:1027000000000000000007040000000000000000BE +:102710000000000000000000000066666666BDBDA7 +:10272000B4B4000000000000000000000000000041 +:102730000000000000000000F0F0000000000000B9 :102740000000000000000000000000000000000089 -:102750000000000000000000000000000000000079 +:102750000390039F00000000000000000000000044 :102760000000000000000000000000000000000069 :102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 +:10278000000000000000000000003C3C00000000D1 +:10279000000000000000000000000000FFF00F003B +:1027A0002424B4B400000000000000000000000079 +:1027B00000000000000000000000F0F00000000039 :1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000000000000F9 +:1027D0000000F390F39F00000000000000000000E4 :1027E00000000000000000000000000000000000E9 :1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 +:102800000000000000000000000000003C3C000050 :1028100000000000000000000000000000000000B8 :1028200000000000000000000000000000000000A8 :102830000000000000000000000000000000000098 @@ -131753,180 +131753,180 @@ :102870000000000000000000000000000000000058 :102880000000000000000000000000000000000048 :102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 -:1028B0000000000000000000000000000000000018 +:1028A0004E4E00FF272727270000000000000000F1 +:1028B000000000000000000000000000FFFF00001A :1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000000000F8 +:1028D000000000000000F101F10100000000000014 :1028E00000000000000000000000000000000000E8 :1028F00000000000000000000000000000000000D8 -:1029000000000000000000000000000000000000C7 +:102900000000000000000000000000FF0000FFFFCA :1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 +:1029200000004E4E00FF2424E7E7000000000000F6 :102930000000000000000000000000000000000097 :102940000000000000000000000000000000000087 :102950000000000000000000000000000000000077 :102960000000000000000000000000000000000067 :102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 +:1029800000000000000000000000000000FF000048 :102990000000000000000000000000000000000037 -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 +:1029A0000000000000610009000100000061000754 +:1029B000000D0000000000000000000005000A00FB +:1029C000054000A80000000000000000000000001A +:1029D00000000000000005180A38050004A00000EF :1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 -:102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 +:102A000000000000000000610006000D0000051835 +:102A10002A00054004A8000000000000000000009B +:102A20000000000000007F3E4302BEBEF0F03CEB21 +:102A30003CEBF3FF535F00000000000000000000CB :102A40000000000000000000000000000000000086 :102A50000000000000000000000000000000000076 :102A60000000000000000000000000000000000066 :102A70000000000000000000000000000000000056 :102A80000000000000000000000000000000000046 :102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 +:102AA00000000000000000007F3E43028282F0F040 +:102AB000FFEBFFEBF0FC505C0000000000000000AA :102AC0000000000000000000000000000000000006 :102AD00000000000000000000000000000000000F6 :102AE00000000000000000000000000000000000E6 :102AF00000000000000000000000000000000000D6 :102B000000000000000000000000000000000000C5 :102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 +:102B200000000000000000000000FF00FF007878B7 +:102B3000287D000000005FAA0AAA00000000000033 :102B40000000000000000000000000000000000085 :102B50000000000000000000000000000000000075 :102B60000000000000000000000000000000000065 :102B70000000000000000000000000000000000055 :102B80000000000000000000000000000000000045 :102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 +:102BA00000000000000000000000000055550F0F5D +:102BB0007878287D000000005FFF0AFF0000000019 :102BC0000000000000000000000000000000000005 :102BD00000000000000000000000000000000000F5 :102BE00000000000000000000000000000000000E5 :102BF00000000000000000000000000000000000D5 :102C000000000000000000000000000000000000C4 :102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 +:102C2000000000000404200000000000000000007C +:102C300000000000100400008200200000000000DE +:102C400000000000840420020000000400000000D6 +:102C500000000000880040004080210000000003C8 +:102C60000000000000002004200000000000000020 +:102C70000080008082002080200020800000000072 +:102C80000000000000002000000000000000000024 +:102C900000000000000020040000200000000000F0 +:102CA0000000000010000000000000000000000014 +:102CB00000000000000000000000000000002000F4 :102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000000000000000002E2 -:102CF00000000000000000000000000000000002D2 -:102D00000000000040000000000000000040000043 -:102D10000090009000400000000000000000000053 +:102CD0000000000000000000808280024000000030 +:102CE00000000000000000000001000000000002E1 +:102CF00000000010002000A00020000000020000E2 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 :102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000000093 -:102D40000210000000000000000000000000000071 -:102D5000000000000000000000000400000000006F -:102D60000210000000000000000000000000000051 -:102D70000000000000000000000000000000000053 -:102D80000000021000000000000000000000000031 +:102D30000000000000000010000000000000000083 +:102D40000010000000000020000000000000000053 +:102D50000000000000000000000001004020000012 +:102D6000002000000200040000000000000000003D +:102D7000000005000000000000000000000040000E +:102D80000080008000000000001000000000000033 :102D90000000000000000000000000000000000033 :102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 +:102DB0000000000000000000000209000008000000 +:102DC00000000000000000000000000000000400FF +:102DD0000000040000000000000000080440800122 +:102DE00000000009000004000000000000000000D6 +:102DF000000004004000000000000000090820005E +:102E0000800000080020000000000000000000001A +:102E100000000000000000000000000000080000AA +:102E20000000000000820000000000000000000020 +:102E30000000000000004000400004000208000004 +:102E400000008800080000000000000000000000F2 +:102E5000000000000000000000004000880040006A +:102E600002000000000000000000A000040040007C +:102E700000000400000584000010000004000000B1 +:102E80004000000000000000000000000000000002 +:102E90000000002100000003000800000000000006 +:102EA000000000080000000000000000000000001A +:102EB00010004000400040000000040000000084BA +:102EC00000840084092000000000000000000000D1 +:102ED00000000000000000000000000000001000E2 +:102EE00040044000410021000000000000000400F8 +:102EF000000000200500000000000001000080002C +:102F00000000800000000000000000200000000021 +:102F10000000080000A00000000000000300000006 :102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 +:102F30000800000000000000000000040000000481 +:102F40000809000000000000000000000000000070 +:102F50000800000000000000000000000000000069 +:102F60000000000204100520010000000000000025 +:102F70000000A08000000000000000000000000031 +:102F80000100000001400000000000000000C0003F :102F90000000000000000000000000000000000031 :102FA0000000000000000000000000000000000021 :102FB0000000000000000000000000000000000011 :102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 +:102FD00000000000000000000000210000000000D0 +:102FE0000000000000018000C0010400000000009B +:102FF00000000000002000000000000000000000B1 +:10300000000002000000400000000000000000007E +:103010000000000000400000000000000000000070 +:103020000000080000000000000000000000000098 :103030000000000000000000000000000000000090 :103040000000000000000000000000000000000080 -:103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF +:10305000000000000000000000000000040040002C +:103060000000000010000000000000000000000050 +:103070000021000000200400000082008200000007 +:103080000000000000000000000000000800000830 +:10309000002100000000000000000000000000000F +:1030A0000000000000080000080000000000000010 +:1030B0000000000000000000100000000000000000 +:1030C00011880004100403041100088400000800A3 +:1030D000000000000000100000000000000000845C +:1030E0000000000000002100000400000008400073 +:1030F0000000000004000000800000000900000043 +:10310000000000000000000000000000008200003D :1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F +:10312000000000200000002000000000000000005F +:1031300000840000000000000021000000000000EA :10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F +:1031500000080010001000008200000000000000C5 +:10316000A00000000000C0000802000008000000ED +:1031700020000000000000000000008000000000AF +:10318000000010000000000000040000000000002B :10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F +:1031A0000000000000000000000000000800000017 :1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF +:1031C00000000000110000040000000400000000E6 :1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF +:1031F000000080000000000000000000000400004B :1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE +:103210000000110000080000000000000000000095 :10322000000000000000000000000000000000009E :10323000000000000000000000000000000000008E :10324000000000000000000000000000000000007E :10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E +:10326000000000000000000000000000000001005D +:10327000100102010000000000000000000000003A +:103280000000000002000000840200820020049080 +:10329000000100000001000000000000000000002C :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E :1032C00000000000000000000000000000000000FE :1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD +:1032F0001000212111030008000000000000080058 +:10330000000000002000800000000080008000001D +:1033100080000041000200040002000000000000E4 :10332000000000000000000000000000000000009D :10333000000000000000000000000000000000008D :10334000000000000000000000000000000000007D :10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D +:103370000000080021000000031000000000000011 :10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D :1033A000000000000000000000000000000000001D @@ -131934,74 +131934,74 @@ :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED :1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC +:1033F000000000000010012000000021000000007B +:103400000000000000080000000000000000900024 +:103410009000840040400000000000000090000088 :10342000000000000000000000000000000000009C :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C :10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C +:103470000000000000000101000005010001000043 +:103480000000000000000100000000010001000039 +:10349000400200828484849000000000010000004B :1034A000000000000000000000000000000000001C :1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC :1034D00000000000000000000000000000000000EC :1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB +:1034F00000000000000000001011210085211111C2 +:1035000000000000000000000200000000020004B3 +:1035100000208080008000004000000011000900B1 :10352000000000000000000000000000000000009B :10353000000000000000000000000000000000008B :10354000000000000000000000000000000000007B :10355000000000000000000000000000000000006B :10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B +:103570000000000000000000000010081008080013 +:10358000081100000000000800000000000000001A +:103590000000000080000008000000002100000082 +:1035A0000000080000000000000000000000000013 :1035B000000000000000000000000000000000000B :1035C00000000000000000000000000000000000FB :1035D00000000000000000000000000000000000EB :1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A +:1035F00000000000000000000000000001080101C0 +:1036000001000100000000000000000000000000B8 +:10361000000000000000100000859090880001006C +:103620000000000001000000000000000000000099 :10363000000000000000000000000000000000008A :10364000000000000000000000000000000000007A :10365000000000000000000000000000000000006A :10366000000000000000000000000000000000005A :10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A +:1036800000E0070000000000000000E0070000006C +:103690000000000000000000000000000700000023 +:1036A000000000E007000000000000000000000033 :1036B000000000000000000000000000000000000A :1036C00000000000000000000000000000000000FA :1036D00000000000000000000000000000000000EA :1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 +:1037100000000000000000000000FCFCFFFFAAAC5D +:10372000FFFF00000000000000000000000000009B :103730000000000000000000000000000000000089 :103740000000000000000000000000000000000079 :103750000000000000000000000000000000000069 :103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 :103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 +:10379000000000000000000000000000FCFCFFFF33 +:1037A000AAAC0000000000000000000000000000C3 :1037B0000000000000000000000000000000000009 :1037C00000000000000000000000000000000000F9 :1037D00000000000000000000000000000000000E9 :1037E00000000000000000000000000000000000D9 :1037F00000000000000000000000000000000000C9 :1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 +:1038100000000000000000000000000000004DCF8C +:103820004D0C0F0F0F0F0000000000000000000003 :103830000000000000000000000000000000000088 :103840000000000000000000000000000000000078 :103850000000000000000000000000000000000068 @@ -132009,141 +132009,141 @@ :103870000000000000000000000000000000000048 :103880000000000000000000000000000000000038 :103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 +:1038A0004D4D4D4D55553C550000000000000000A9 :1038B0000000000000000000000000000000000008 :1038C00000000000000000000000000000000000F8 :1038D00000000000000000000000000000000000E8 :1038E00000000000000000000000000000000000D8 :1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 +:10390000000000000000000005610A0F050900A08A +:1039100000000061000F000D00A000610006000D16 +:103920000000800000080000000000210006000DDB +:1039300000A00000000000000000000000000000E7 :103940000000000000000000000000000000000077 :103950000000000000000000000000000000000067 :103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 +:10398000000000000000000000001400000028FFFC +:10399000AAFF00000000000000000000000000007E +:1039A000000FAFAF0000000000000000FFFF3C3C34 :1039B0000000000000000000000000000000000007 :1039C00000000000000000000000000000000000F7 :1039D00000000000000000000000000000000000E7 :1039E00000000000000000000000000000000000D7 :1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 +:103A00000000000000000000000000005400000062 +:103A10002800AA00000000000000000000000000D4 +:103A20000000000000000000000000000000FFFF98 +:103A30003C3C00000000000000000000000000000E :103A40000000000000000000000000000000000076 :103A50000000000000000000000000000000000066 :103A60000000000000000000000000000000000056 :103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 +:103A8000000000000000000000000000000008002E +:103A9000080000000000000000000000000000001E :103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 +:103AB00082000FFF00000000000000000000000076 :103AC00000000000000000000000000000000000F6 :103AD00000000000000000000000000000000000E6 :103AE00000000000000000000000000000000000D6 :103AF00000000000000000000000000000000000C6 :103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 +:103B100000000000000080800000000000000000A5 :103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 +:103B3000000082000F0F00000000000000000000E5 :103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 +:103B50000000000000000000000020000000000045 +:103B600020000000000040000000000000000040B5 +:103B70000000000000000000000020000000000025 +:103B80002004000000002004000088110000000054 +:103B90000000000000000000C0000002000000085B +:103BA0000000200200000000200000000080000053 +:103BB0000008008200800000C0042004840000008F +:103BC00000002000000000002000000000000000B5 +:103BD00000000000000000000000000021000000C4 :103BE00000000000000000000000000000000000D5 :103BF00000000000000000000000000000000000C5 :103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C20000000000000000000000000000000000094 -:103C30000000000200000000000000000000000082 +:103C1000000000001000000000080000000000008C +:103C20000001000200010000009000020090000866 +:103C30000040000100080002000000000000000039 :103C40000000000000000000000000000000000074 :103C50000000000000000000000000000000000064 :103C60000000000000000000000000000000000054 :103C70000000000000000000000000000000000044 :103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 +:103C90000200000000000000000000000000000022 :103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 +:103CB000000010000000000000000800008000006C :103CC00000000000000000000000000000000000F4 :103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 +:103CE00000000000001000000000000000000000C4 :103CF00000000000000000000000000000000000C4 :103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 +:103D1000000000000000050000000000000000009E :103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 +:103D3000000020008000000000000000800000085B :103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 +:103D500000000084000000000000000000000000DF :103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 +:103D70000000000040004000000040000000C000C3 :103D80000000000000000000000000000000000033 :103D90000000000000000000000000000000000023 :103DA0000000000000000000000000000000000013 :103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 +:103DC00000000000000800000000000000000000EB +:103DD00000000000000800000000000000000000DB +:103DE000000000000004009000000000000000003F :103DF00000000000000000000000000000000000C3 :103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 +:103E10000000000000004100000041000000000020 +:103E200000000090000000200400000005000000D9 +:103E3000000008000000000000000000000000007A :103E40000000000000000000000000000000000072 :103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 +:103E6000000008000000000000000000000000004A :103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 +:103E80000000000000001000000000000000000022 :103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 +:103EA000000000000000000008000000400040008A +:103EB00000000000000000000000000000000120E1 :103EC00000000000000000000000000000000000F2 :103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 +:103EE00000000000000000000020000000000000B2 +:103EF0000000000000000000000400040000008832 +:103F000000000004000400000000000000000000A9 :103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 +:103F200000000000000000C0000000900000000041 :103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 +:103F40002000000000000000000000000000000051 :103F50000000000000000000000000000000000061 :103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 +:103F80001000000000000000000000000000000021 +:103F90000000A00000000800000000000000000079 :103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 +:103FB000000000000000000000000000820000007F +:103FC00000000000000004000000000000000000ED :103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 +:103FE0000000000000000000000090000000000041 +:103FF00000000000009000000000000000040088A5 +:1040000000000000000010000000000000000000A0 :1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 +:104020004000000002204000408405040000000021 +:104030000000000000001000000000000000080860 +:1040400000000384030000200000200000000000A6 :104050000000000000000000000000000000000060 :104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 +:104070000000001000000000000000000000000030 +:104080000000000000000000000000000000100020 :104090000000000000000000000000000000000020 :1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF +:1040B00000000000000200000000000000000000FE +:1040C00000000000000000000005000000020000E9 +:1040D00000210008000000000000000000000000B7 +:1040E0000000000000000000000000004000080088 +:1040F000000000000000000000000000000420009C +:1041000009000000009020000000000000000000F6 :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F :10413000000000000000000000000000000000007F @@ -132154,49 +132154,49 @@ :10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F :1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF +:1041B00000000000000001000000000000000000FE +:1041C00000000000010000000000000001A100A1AB +:1041D00000080002000000000000000000000000D5 :1041E00000000000000000000000000000000000CF :1041F00000000000000000000000000000000000BF :1042000000000000000000000000000000000000AE :10421000000000000000000000000000000000009E :10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E +:104230000000000000000000080000000000000076 +:10424000000000000000110000210000000040C13B +:1042500000080000009000000000000000000000C6 :10426000000000000000000000000000000000004E :10427000000000000000000000000000000000003E :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E :1042A000000000000000000000000000000000000E :1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE +:1042C00000000000000000000009000011100000C4 +:1042D0000000000900800000000000000000000055 :1042E00000000000000000000000000000000000CE :1042F00000000000000000000000000000000000BE :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D :10432000000000000000000000000000000000008D :10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D +:10434000000000000000000000000000000001006C +:10435000000000000000004000000000000000001D :10436000000000000000000000000000000000004D :10437000000000000000000000000000000000003D :10438000000000000000000000000000000000002D :10439000000000000000000000000000000000001D :1043A000000000000000000000000000000000000D :1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD +:1043C00000000001000000000000000000002000CC +:1043D00000010100000000000100020000000000D8 :1043E00000000000000000000000000000000000CD :1043F00000000000000000000000000000000000BD :1044000000000000000000000000000000000000AC :10441000000000000000000000000000000000009C :10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C +:10443000000000000000000000000000000000106C +:10444000001000000041000000000000000000001B +:104450008000000808000000000008008000000044 :10446000000000000000000000000000000000004C :10447000000000000000000000000000000000003C :10448000000000000000000000000000000000002C @@ -132204,7 +132204,7 @@ :1044A000000000000000000000000000000000000C :1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC +:1044D00000021100000000000000000000000000C9 :1044E00000000000000000000000000000000000CC :1044F00000000000000000000000000000000000BC :1045000000000000000000000000000000000000AB @@ -132212,15 +132212,15 @@ :10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B :10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B +:1045500000000000010000000000880020000800AA +:104560000400000000000000000000000000000047 :10457000000000000000000000000000000000003B :10458000000000000000000000000000000000002B :10459000000000000000000000000000000000001B :1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB :1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB +:1045D00000000000000000E00000000000000000FB :1045E00000000000000000000000000000000000CB :1045F00000000000000000000000000000000000BB :1046000000000000000000000000000000000000AA @@ -132228,8 +132228,8 @@ :10462000000000000000000000000000000000008A :10463000000000000000000000000000000000007A :10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A +:10465000000000000000000000000000000030F03A +:1046600060F00000000000000000000000000000FA :10467000000000000000000000000000000000003A :10468000000000000000000000000000000000002A :10469000000000000000000000000000000000001A @@ -132237,7 +132237,7 @@ :1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA +:1046E000300060000000000000000000000000003A :1046F00000000000000000000000000000000000BA :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 @@ -132253,7 +132253,7 @@ :1047B00000000000000000000000000000000000F9 :1047C00000000000000000000000000000000000E9 :1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 +:1047E00000000000FC980000000000000000000035 :1047F00000000000000000000000000000000000B9 :1048000000000000000000000000000000000000A8 :104810000000000000000000000000000000000098 @@ -132261,31 +132261,31 @@ :104830000000000000000000000000000000000078 :104840000000000000000000000000000000000068 :104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 +:10486000000000000000FC980000000000000000B4 :104870000000000000000000000000000000000038 :104880000000000000000000000000000000000028 :104890000000000000000000000000000000000018 :1048A0000000000000000000000000000000000008 :1048B00000000000000000000000000000000000F8 :1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 +:1048D00000610006000D0000000000000000000064 +:1048E00000000006000C000000610006000D000042 :1048F00000000000000000000000000000000000B8 :1049000000000000000000000000000000000000A7 :104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 :104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 +:10495000000000000000C3C30F0F000000000000B3 +:1049600000000000FF0000FF000000000000000049 :104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 :104990000000000000000000000000000000000017 :1049A0000000000000000000000000000000000007 :1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 +:1049D0000000000000000000FFFFFFFF00000000DB +:1049E000000000000000FF0000FF000000000000C9 :1049F00000000000000000000000000000000000B7 :104A000000000000000000000000000000000000A6 :104A10000000000000000000000000000000000096 @@ -132293,442 +132293,442 @@ :104A30000000000000000000000000000000000076 :104A40000000000000000000000000000000000066 :104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 +:104A60000000000000000000FF0000FF0000C3C3C2 +:104A7000C3FF000000000000000000000000000074 :104A80000000000000000000000000000000000026 :104A90000000000000000000000000000000000016 :104AA0000000000000000000000000000000000006 :104AB00000000000000000000000000000000000F6 :104AC00000000000000000000000000000000000E6 :104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 +:104AE00000000000000000000000FF0000FF0000C8 +:104AF000FFFFC3FF000000000000000000000000F6 :104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000002000000001000B3 -:104BF0000002000000000000400000000000000073 -:104C000040000002000000400002004000000040A0 -:104C10000000004000000000000000000000000054 -:104C20000000000000000000000000100000000074 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000100000000054 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000010000034 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 +:104B10000000000000000000000000000000C004D1 +:104B200020000000000000000000008000000102E2 +:104B300000000000000000000000008000040810D9 +:104B40002000000000000000000000000000000441 +:104B500000800000000200000003000000000000D0 +:104B6000000000080000000000000000000000003D +:104B7000000000000000A000000000000000000095 +:104B80000400000000000000000000000000000021 +:104B900000000000000000000000000000004100D4 +:104BA00000000000000000000000000000080000FD +:104BB00002010000000000000000000000400000B2 +:104BC00004010000000000000000000000000000E0 +:104BD0000000000800000083400000000002000008 +:104BE00000900000009100000000000000000000A4 +:104BF00000000002000000000000000000000000B3 +:104C000000000000000000000000000000000000A4 +:104C1000000000000002000000000000000400008E +:104C2000011004000400000000000010000000005B +:104C30000000000000000000000000000200000072 +:104C4000000000000000080000000010000001400B +:104C50000000020000404011000000800000000041 +:104C60000200000000000000000000000000000042 +:104C7000000000100200000000000400040000001A +:104C8000000000000000000000000000000008001C +:104C9000000000000010000000000000000004827E +:104CA00000002008000011000000000004080000BF +:104CB00000000000000000000008000802000000E2 +:104CC00000000008000000000000000000840082D6 +:104CD0000800000000880009840800080020000087 +:104CE0000000000000080000040000000082000036 +:104CF0000400000000000000000800080008000890 +:104D00000000000000840000000000080000000017 +:104D10000000000000000000000800080008000873 +:104D20000021000000080000000002000200020054 +:104D300002030209020090000800000000000000C9 +:104D4000000000000008000000000000000000005B +:104D50000400000002000000400040000000400885 +:104D600000000000000088000809000000000000AA :104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D9000000004000400000000000000000000000B -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 +:104D80000000000800000000000000000000000813 +:104D90000008000000000008000000000000000003 +:104DA00000000004000000000000000080008000FF +:104DB00080008000800080000000000000000000F3 :104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 +:104DD00000000000000000000300000000000000D0 +:104DE0004000000000000000000000000002000879 +:104DF00000000000000000004000000000000084EF +:104E0000000000000000004000A0000000000000C2 :104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 +:104E200008004000008000000100000000000000B9 +:104E3000000000000008000000000000000000006A +:104E4000000000000000000000000800000000005A +:104E50000000000000000000000000000000004012 +:104E600000840000000000000000000000000000BE +:104E700000000100008000000000000000000004AD +:104E800000000040000000000000000000000000E2 :104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 +:104EA00000000000000000400400020000000000BC :104EB00000000000000000000000000000000000F2 :104EC00000000000000000000000000000000000E2 :104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 +:104EE00000000020000000000000000000000000A2 +:104EF000000000002000000400000000000000008E :104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 +:104F1000040000000000000000000000000000008D +:104F2000000000000000000000402100000400001C +:104F30000100000000000000000300090010000054 +:104F40000000000000000008000000000008000051 +:104F500000000000000000000000400020000400ED +:104F60000002000004020000000000000000000039 +:104F700090000000000000000000000000000000A1 :104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 +:104F90000000000800000000000000000000000009 +:104FA000000000000000080000000000A000000158 +:104FB0000000020000000000000000000000008867 :104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 +:104FE00080000000000080000000000000000000C1 +:104FF00000080900000000000000000000A0000000 +:10500000000000840000000400A000A000000000D8 :105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 +:105020000000000000000000000000C0012100405E +:105030000005014000000000000300000003000024 +:10504000000900000008000000000000000000004F +:105050000000000000000000000800000000000048 +:105060000000000000000000000000200000000020 +:1050700000000008004000000000000000000000E8 +:10508000000000000000000000000000000200001E +:10509000000300000000000000000000000000000D +:1050A00000000000000000000000000000002000E0 +:1050B000000100002001000000000000000000824C +:1050C00000000000000800000000000000000000D8 +:1050D00000000000002000000000000000000000B0 +:1050E00000000000000020000000000000000000A0 +:1050F00000000000000000000800000000000000A8 :10510000000000000000000000000000000000009F :10511000000000000000000000000000000000008F :10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F +:1051300011C001040009000000C000040000C010FC +:1051400010C0008800000084000000000000000083 :10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F +:1051600009A0001000881008C00000000000900096 +:10517000000000000000000000000100000000002E :10518000000000000000000000000000000000001F :10519000000000000000000000000000000000000F :1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF +:1051B0000000918808901089002000800000000005 +:1051C000008080800000000000000000000000005F :1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF +:1051E0000000108000000000008080030003002009 +:1051F00080080000000000000000000011002100F5 :10520000000000000000000000000000000000009E :10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E +:105230000000000009801002A080880080000004A7 +:10524000800080000000801100008000000000004D +:1052500000000000800000008000800000000000CE +:1052600000000000000000038091808002004100E7 +:105270008910419000000000008000000000004103 +:105280000900000300800000000000000000000092 :10529000000000000000000000000000000000000E :1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE -:1052D00000000000000000000000000000000000CE -:1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D +:1052B000000000000000010202000240C0000800DF +:1052C00000000800C000000010000488C0000000BA +:1052D000000000000000100000000800C0000000F6 +:1052E00000000000000000000001A04090900000BD +:1052F0000000A000014100000000000200000000CA +:10530000000901000000008800000000000000000B :10531000000000000000000000000000000000008D :10532000000000000000000000000000000000007D -:10533000000000000000000000000000000000006D -:10534000000000000000000000000000000000005D +:10533000000000000000000002020003000403C09F +:1053400008080088001004C0101000890084C0C143 :10535000000000000000000000000000000000004D -:10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D +:105360000000000000000000000800100088820417 +:1053700000040020009000C00000000000000000B9 +:105380000000000088000000010000000000000094 :10539000000000000000000000000000000000000D :1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED -:1053C00000000000000000000000000000000000DD -:1053D00000000000000000000000000000000000CD +:1053B000000000000000000000000010000920A014 +:1053C00091888080000000800080808900030002B6 +:1053D00010C10000000000000000000000000000FC :1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C +:1053F0008000000008001080008000000000000015 +:10540000000000000000000000004100000000005B :10541000000000000000000000000000000000008C :10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000006C -:10544000000000000000000000000000000000005C +:105430000000000000000000000000009008208034 +:10544000C18009008000800080800000800480000E :10545000000000000000000000000000000000004C -:10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C +:10546000000000000000000000000000000000102C +:105470000000800021101009080009000000000051 +:10548000000000000000000000110000000000000B :10549000000000000000000000000000000000000C :1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC -:1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B +:1054B0000000000000000000000000000000C088A4 +:1054C000008208084100C00010A010108800C00130 +:1054D000208804A000000000000000000000000080 +:1054E000000000880000000000000000000008002C +:1054F000100088201000010001850000000000005D +:10550000000000000000000000000001000000009A :10551000000000000000000000000000000000008B :10552000000000000000000000000000000000007B :10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B +:10554000000000E00000000000000000000000007B :10555000000000000000000000000000000000004B :10556000000000000000000000000000000000003B -:10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B -:10559000000000000000000000000000000000000B +:10557000001100000700000000810000070060002B +:1055800000000000000000000000000000E000003B +:105590008141000000000000000000000000000049 :1055A00000000000000000000000000000000000FB :1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB +:1055C0000000FFFFC3C3FFFF7F43FFFF0FC3FFFFC9 +:1055D000CF0CFFFFFF00FFFFD71700000000000007 :1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000000000AB +:1055F0000000D7D707D7FFFF000000000000A2007F :10560000000000000000000000000000000000009A :10561000000000000000000000000000000000008A :10562000000000000000000000000000000000007A :10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A +:1056400000000000FFFF5F5FFFFF7F43FFFFFFC31E +:10565000FFFFCFCFFFFF5F5FFFFFD7170000000006 :10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:10568000000000000000000000000000000000001A +:1056700000000000D7D7D7D7FFF7000400000000D4 +:105680000000FF000000000000000000000000001B :10569000000000000000000000000000000000000A :1056A00000000000000000000000000000000000FA :1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 +:1056C00000000000000000FFFFFFA0AFFFFFAAAA3C +:1056D000FFFF82BEFFFFC3C3FFFF5F50000000005B +:1056E00000000000000000000000C3C3C3FF000072 +:1056F0000000000000008000FF00FFFF000000002D +:10570000000055FF55FF00000000000000000000F1 :105710000000000000000000000000000000000089 :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 +:105740000000000000000000FAFAFFFFF0FFFFFF7A +:10575000C3FFFFFFC3FFFFFFAAFFFFFF0F00000013 +:10576000000000000000000000000000FFFFC3FF79 +:1057700000000000000000008000FF0000FF00FFAC +:105780000000000055FF55FF000000000000000071 :105790000000000000000000000000000000000009 :1057A00000000000000000000000000000000000F9 :1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 -:1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 +:1057C0000000000000000000000040E38001002114 +:1057D0009202408280000020920240E38006002D69 +:1057E0008A0200000000000000000000000000002D +:1057F0000005000000000000000000000030000074 +:1058000000000061003E009D00A1000000000000BB +:105810000000000000400006000C00000000000036 :105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 +:1058400000000000000000000000000055550F3C63 +:10585000C0C3FCFF000000000000000000000000CA +:10586000FF0FFFC300000000000000000000000068 :105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 +:10588000000000000000FF00000000000000000019 +:1058900000000000000000005555FFFF0000000060 :1058A00000000000000000000000000000000000F8 :1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 +:1058C000000000000000000000000000000055552E +:1058D0000F3CC000FC3C0000000000000000000085 +:1058E0000000FF0FFFC300000000000000000000E8 :1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 +:10590000000000000000C000FF00000000000000D8 +:1059100000000000000000000000555500000000DD :105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 :105940000000000000000000000000000000000057 -:105950000000000000000000000000000000000047 +:105950003CFF3C000C0FFCFF0000000000000000BA :105960000000000000000000000000000000000037 :105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 +:105980000000000000000000F0E0F0F0FFC3FF0F97 +:105990000000000000000000000000000000F0F027 :1059A00000000000000000000000000000000000F7 :1059B00000000000000000000000000000000000E7 :1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000000000000000C7 +:1059D00000003C0F3C0F0C00FCF000000000000039 :1059E00000000000000000000000000000000000B7 :1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 +:105A000000000000000000000000FFEBFFFFFFC3EC +:105A1000FF0F000000000000000000000000000078 +:105A2000F0F0000000000000000000000000000096 :105A30000000000000000000000000000000000066 :105A40000000000000000000000000000000000056 -:105A50000000000000000000000400000000000042 -:105A60000000000000000000000000000000000036 +:105A50000000000000000000000000000000000343 +:105A60000000040000000000000000000000000032 :105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 +:105A80000000000000000000000000040100000011 +:105A900000040000000300000000000000020000FD :105AA00000000000000000000000000000000000F6 :105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000000000D6 -:105AD00000000000000000000000000000000000C6 -:105AE00000000000000000000000000000000000B6 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 -:105B200000000000009000000000000000000000E5 -:105B300000000000000000400000004000000040A5 -:105B40000040000000000000000000000000000015 -:105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 +:105AC000000000040004000000000000040040008A +:105AD0000000000000000000000000004100008203 +:105AE000418200000000410000020084000000002C +:105AF00000000000000000000002000000000000A4 +:105B00000000000000000000000000000000040091 +:105B1000000000000000000000000000100200046F +:105B200000020000000200900002000000020002DB +:105B30000000000000020002000000000000000061 +:105B400000000000000000000000000000008000D5 +:105B50000000000000000000010000000000000044 +:105B6000000300030000000000800000048000002B +:105B70000000000000000200000000000000000023 +:105B80000000000000000000000001000000000014 :105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 +:105BA00002000000000000000200000000000000F1 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE00000000000000000000000000000000000B5 -:105BF00000000000000000000000000000000000A5 -:105C00000000000000000000000000000000000094 -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000000024 -:105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 +:105BD00000200000000000000800400000002084B9 +:105BE000000000000000008200000010000880207B +:105BF0000000000800080008000000000000000885 +:105C00000000000000000000000000000408008800 +:105C1000000009080008000800080000000000005B +:105C20000008040800000000000000000000000858 +:105C30000000000000080008000800080008000834 +:105C4000000800080000000000000000001000082C +:105C5000000809010008000800080008400084004E +:105C6000000000000000000000000000000004111F +:105C700088400000900000000000000000000000CC +:105C8000002100000000000000000000000089006A +:105C90002009000000008800400000000000880289 +:105CA0000000000000000000000090000000040060 +:105CB0000000000000000000000040004000000064 :105CC00000000000000000000000000000000000D4 :105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 +:105CE00000A000840000000200020000000000008C +:105CF000000000010000000000000000000800009B +:105D0000000000000000000000000000050000008E +:105D100004009100000000020002000200000000E8 +:105D200000020008009000000000000000000000D9 +:105D30000008000000080000000000000000000053 :105D40000000000000000000000000000000000053 :105D50000000000000000000000000000000000043 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 +:105D6000080000000000000000000000000000002B +:105D70008200080084000000000000000000000015 +:105D80008200820082000000A000000000000000ED +:105D900000000000C0000080008000000000000043 :105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 -:105DC00000000000000000000000000000000000D3 +:105DB0000000000000000000A00000000000000043 +:105DC0000000000000000000820000000000000051 :105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 +:105DE0000000000000000000000000004000000073 +:105DF0000000000080000000000000000000000023 :105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 +:105E1000000000000000000000040020000000005E :105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 +:105E30000000000000000000000020000000000042 :105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 +:105E50000000000040000000000000000000000002 +:105E600000000000000000000008000082000000A8 +:105E7000000000000000000000080000000000001A :105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 +:105E900000000800000040000000010000000000B9 :105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 :105EC00000000000000000000000000000000000D2 :105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 -:105F00000000000000000000000000000000000091 -:105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000000061 +:105EE000000000000000000000880088000000841E +:105EF00000000084000000000000000800200000F6 +:105F00000000000000000000000000000008000089 +:105F10000000000000000000800000002090000051 +:105F2000200020000000000000080900090000C057 +:105F300000000000008400000000000000000000DD :105F40000000000000000000000000000000000051 :105F50000000000000000000000000000000000041 :105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 +:105F700000000000000200000040000000C000001F +:105F80000000000000000000880000000000000089 :105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 +:105FA00000200000000000000000000000000000D1 +:105FB000000000000000000090000000000000024F :105FC00000000000000000000000000000000000D1 :105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 +:105FE0000000000000000000000040000000000071 +:105FF0001100000000000000000000000000002070 :106000000000000000000000000000000000000090 -:106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 +:10601000000000000000000000000000000000C0C0 +:10602000000000010000000011000000000000005E +:10603000030000000000000000000000000000005D +:10604000000000000000000000000000040000004C :106050000000000000000000000000000000000040 :106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 -:106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 +:10607000000100010000000000000000A01000C0AE +:10608000000002000000000000000000000000000E +:1060900000000000000000000000000000A08900D7 +:1060A0008804000000000000000000000000000064 :1060B00000000000000000000000000000000000E0 :1060C00000000000000000000000000000000000D0 :1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:10611000000000000000000000000000000000007F -:10612000000000000000000000000000000000006F +:1060E00000000000000000000000000000000008A8 +:1060F0000020000800080000000000000000808070 +:10610000000000008000000000000000000000000F +:1061100000000000000000000000000000000080FF +:10612000210000000000000000000000000000004E :10613000000000000000000000000000000000005F :10614000000000000000000000000000000000004F :10615000000000000000000000000000000000003F :10616000000000000000000000000000000000002F :10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F +:1061800000000040000000000000000000000000CF :1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000000000000EF +:1061A000410008400311100300000000000000003F :1061B00000000000000000000000000000000000DF :1061C00000000000000000000000000000000000CF :1061D00000000000000000000000000000000000BF :1061E00000000000000000000000000000000000AF :1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E +:10620000000000000001000000000000000000008D :10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E +:1062200000000040000000890001000000000000A4 :10623000000000000000000000000000000000005E :10624000000000000000000000000000000000004E :10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E +:1062600000000000000000000000004000000000EE +:10627000000000000000010001000000000000001C +:106280000000000040900010002084880000000002 :1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000000EE +:1062A00000000000000000010400000100000000E8 :1062B00000000000000000000000000000000000DE :1062C00000000000000000000000000000000000CE :1062D00000000000000000000000000000000000BE :1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D +:1062F000000000000000000003002000200000005B +:10630000000000000000000000000000800000000D :10631000000000000000000000000000000000007D -:10632000000000000000000000000000000000006D +:106320000000000000000008001000040011400000 :10633000000000000000000000000000000000005D :10634000000000000000000000000000000000004D :10635000000000000000000000000000000000003D :10636000000000000000000000000000000000002D :10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D +:1063800000000000000000008000801000110000EC :1063900000000000000000000000000000000000FD -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD +:1063A00000000000000000008982400010009103FE +:1063B00000000010000000000000000000000000CD :1063C00000000000000000000000000000000000CD :1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD +:1063E000000000000000000000000002002100008A :1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C +:1064000000000000000000000000C000A001020128 :10641000000000000000000000000000000000007C -:10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C +:106420000000000000000000000008404000910053 +:1064300091000000000100000000000000000000CA :10644000000000000000000000000000000000004C :10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C +:10646000000000000000000000000000000100002B :10647000000000000000000000000000000000001C :10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC +:1064900007000000000000000000000000000000F5 +:1064A000000000000000000000000000810000E08B +:1064B00007000000000000000700000000000000CE :1064C00000000000000000000000000000000000CC :1064D00000000000000000000000000000000000BC :1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B -:10652000000000000000000000000000000000006B -:10653000000000000000000000000000000000005B +:1064F0000000070000000000000000000000000095 +:106500000000000000000000000000000000FF008C +:10651000F0003C3CFFF00000000000000000000024 +:10652000000000000000000000000000000010005B +:106530001800000000000000000000000000000043 :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B :10656000000000000000000000000000000000002B :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB +:106590000000F0003C3C090000000000000000008A :1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB @@ -132744,399 +132744,399 @@ :10666000000000000000000000000000000000002A :10667000000000000000000000000000000000001A :10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA +:1066900000000000FF990000000000000000000062 :1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA +:1066B0000000000000000F0F0000000000000000BC :1066C00000000000000000000000000000000000CA :1066D00000000000000000000000000000000000BA :1066E00000000000000000000000000000000000AA :1066F000000000000000000000000000000000009A :106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 +:10671000000000000000FF99FF9900000000000049 :106720000000000000000000000000000000000069 -:106730000000000000000000000000000000000059 +:1067300000000000000000000F0F0000000000003B :106740000000000000000000000000000000000049 :106750000000000000000000000000000000000039 :106760000000000000000000000000000000000029 :106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 -:1067900000000000000000000000000000000000F9 +:10678000000000000000000000610006000D000095 +:106790000000000000000000A00000080000000051 :1067A00000000000000000000000000000000000E9 -:1067B00000000000000000000000000000000000D9 -:1067C00000000000000000000000000000000000C9 +:1067B000000000000000000000610006C0010000B1 +:1067C00005000008000000000000000000000000BC :1067D00000000000000000000000000000000000B9 :1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 +:1067F0000000000000000000000000000008000091 +:1068000000A00000000000000000000000000000E8 :106810000000000000000000000000000000000078 :106820000000000000000000000000000000000068 -:106830000000000000000000000000000000000058 -:106840000000000000000000000000000000000048 +:10683000000000000000000000000000000030B276 +:10684000F3B20000000000000000000000000000A3 :106850000000000000000000000000000000000038 :106860000000000000000000000000000000000028 :106870000000000000000000000000000000000018 :106880000000000000000000000000000000000008 :1068900000000000000000000000000000000000F8 :1068A00000000000000000000000000000000000E8 -:1068B00000000000000000000000000000000000D8 -:1068C00000000000000000000000000000000000C8 +:1068B00000000000000000000000000008002800A8 +:1068C0003030F3F300000000000000000000000082 :1068D00000000000000000000000000000000000B8 :1068E00000000000000000000000000000000000A8 :1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 +:106900000000000000000000000000000000007512 +:1069100000BE0000000000000000000000000000B9 :106920000000000000000000000000000000000067 :106930000000000000000000000000000000000057 -:106940000000000000000000000000000000000047 +:1069400000003C0CBE0E0000000000000000000033 :106950000000000000000000000000000000000037 :106960000000000000000000000000000000000027 :106970000000000000000000000000000000000017 :106980000000000000000000000000000000000007 -:1069900000000000000000000000000000000000F7 +:1069900000F700BE00000000000000000000000042 :1069A00000000000000000000000000000000000E7 :1069B00000000000000000000000000000000000D7 -:1069C00000000000000000000000000000000000C7 +:1069C000000000003C0C3C0C000000000000000037 :1069D00000000000000000000000000000000000B7 :1069E00000000000000000000000000000000000A7 :1069F0000000000000000000000000000000000097 :106A00000000000000000000000000000000000086 -:106A10000000000000000000000000000000000076 -:106A20000000000020000000000000000000000046 -:106A30000000000000000000000000000000000056 -:106A40000000000020000000000000000000000026 -:106A50000000000000000000000000000000000036 -:106A60000000000000002000000000000000000006 -:106A70000000000000000000000000000000000016 -:106A800000000000000020000000000000000000E6 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000000000000000000C6 -:106AD00000000000000000000000000000000000B6 -:106AE00000002190000000000000210000000000D4 -:106AF0000000404000004000000040000000400056 -:106B00000000000000000000000000000000000085 -:106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 -:106B3000000000000840000000000000000000000D -:106B40000000000000000000000000000000020043 -:106B500000000000084000000000000000000000ED -:106B60000000000000000000000000000000000025 -:106B70000000000000000200000000000000000013 -:106B80000000000000000000000000000000000005 -:106B900000000000000000000000000000000000F5 -:106BA00000000000000000000000000000000000E5 -:106BB00000000000000000000000000000000000D5 -:106BC0000000000000000000400000000000000085 -:106BD00000000000000000000000000000000000B5 -:106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 -:106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 +:106A100000001000008020004000C00020000000A6 +:106A2000000000088880048010040000200000009E +:106A300000000000880000000000000020000000AE +:106A40000000000000000011A00000002000000075 +:106A500000000003000020040000000400002000EB +:106A600000000000000000000000200000002000E6 +:106A700000000000000020000000000000002000D6 +:106A80000000000000000002000000000000000004 +:106A9000000088000000000280008000000000006C +:106AA0000000000000A100020002800000000000C1 +:106AB0000002000000000000000000000040000094 +:106AC00000A009000000000000000000000000001D +:106AD000000000000000009000910004000000840D +:106AE00000000002000000000000000000000000A4 +:106AF0000000000000000002000000000000000094 +:106B00000000000000000002000040020000000041 +:106B100000000000000040004008000010000000DD +:106B20000400040000004004008040004000000019 +:106B3000000000000800000000000000000000004D +:106B40004000000004000080208088000000200039 +:106B5000820010000300000000000200200000007E +:106B60000000040000000000000000000000000021 +:106B70000000000000000000000000000000000015 +:106B800000000000000000080000000000000000FD +:106B900000000000000020008000808400088000C9 +:106BA0000000000800080090848400028000800833 +:106BB00004000000000004080008001000080000A5 +:106BC00000000008000800000002000200000008A9 +:106BD00080000000800084080000004004908008CD +:106BE0000084008400820008000000000000000013 +:106BF0000008040000000000000804000000000875 +:106C000000000008000000820000000000000000FA +:106C10000008008400000000800820082002000016 +:106C2000A00090000000000000000000002100090A +:106C300000080040000000000000000500080000FF +:106C400000210010001000000000040008000000F7 +:106C500000098200400004804000000000040000A1 +:106C60000000900004080400000000000000000084 +:106C700082000040000800008800000000000000C2 :106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000000000000000000D4 -:106CC00000000000000000000000000000000000C4 -:106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 +:106C90000000000000000000000020008000C1058E +:106CA0000000008811000000080000000008000833 +:106CB00000820001000100A00000000000000000B0 +:106CC00000000800000000000000000000000000BC +:106CD00000000000000000000008000000000004A8 +:106CE00000040088000000A0000000000000000078 :106CF0000000000000000000000000000000000094 :106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 -:106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 +:106D100000000000000000000000000080000000F3 +:106D20004000C0008200000000000000000000835E +:106D3000080020000000000000000000090008001A +:106D400000008200000008001000A0008200820005 +:106D5000000000000800200000000000000000000B +:106D600000000000C0000000000000000000004023 +:106D700000000000000000000000000000040010FF +:106D80000000000000000000000000000000A00063 :106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 +:106DA0000000800000000000000000000000000063 +:106DB0000008000080000000000000000000040047 :106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 +:106DD0000000000000000000800002000000000031 +:106DE0000000000011000010210000000000000061 :106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 +:106E00000001000000000000001000000000000071 :106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 +:106E2000000000000003088000800821000000002E +:106E3000000000800100000000000021002100206F +:106E40000040000000000000000000000000000002 +:106E500000000000000008000080000000000000AA +:106E600040000000010200040000000400000000D7 +:106E70000000000000000000820000000000000090 +:106E800000000000000800000000000000000000FA +:106E900000000000000000000000080000000800E2 +:106EA000C00000000090000000040004000000008A +:106EB0000000000000084000000003000000000087 +:106EC00000010000000000000000000000000000C1 +:106ED00000000000040000000390002011000500E5 +:106EE0000000400000004001040004000400000015 +:106EF000000000080000000000000000000000008A :106F00000000000000000000000000000000000081 :106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 +:106F2000000000000000000000000000000004005D +:106F3000C000080500000000000000020000000082 +:106F4000000500000000000000080800000800081C :106F50000000000000000000000000000000000031 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 +:106F60000000000082000000000500000004000096 +:106F700000210000000000000000000000000000F0 +:106F80000000000000000000000000000000900071 :106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 +:106FA000400000000000000000000000000005009C +:106FB00000000000000000000000000000010000D0 :106FC00000000000000000000000000000000000C1 :106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 +:106FE00000000000000000000000000000000001A0 :106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 +:107000000000000802000000400000000000000036 :107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 +:107020000000000000000000000001000301030058 +:1070300000000000000000000000000000008800C8 +:1070400000000000900000000000000000000000B0 :107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 +:107060000001110340080000901100000001A00180 +:10707000000000010000000000000000000000000F :107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 +:1070A0000000000001000000000000001120A121EC +:1070B00083090008000000000000000002050540F0 +:1070C000001000031100800000000000000000001C +:1070D00000000000000000000000000000020008A6 +:1070E00000000008114100200041808300000041A1 +:1070F0000010000800080000000000000000000070 :10710000000000000000000000000000000000007F :10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F +:107120000000000000000200000041000000038891 +:107130002100200520820000000000000000040063 +:10714000090040054191000000800000008000001F :10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000000FF +:107160000000000000100000808800800000000087 +:1071700000000000110005030000000000000000F6 +:1071800000000000000000000000800080000000FF :1071900000000000000000000000000000000000EF :1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF +:1071B00000020000010101050000000000000000C5 +:1071C0000188000000010188000000200000000884 :1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E +:1071E00000040000000000094000021108A008404F +:1071F000000000000000010000010000000000008D +:1072000000000000000000000000840002001000E8 +:1072100090000000000000000000000000000000DE :10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E +:107230000000000008000001010000000000000044 +:10724000000000000100010100000100008888002A :10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E +:107260000000000000000000000000400008850849 +:10727000A0000000000000008900000000000000E5 :1072800000000000000000000000000000000000FE :1072900000000000000000000000000000000000EE :1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE +:1072B00000000000000005020208080200000000B3 +:1072C0000000000000080240212100204100008051 :1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E +:1072E000000000000000000000000000008011000D +:1072F000090080000000000003008800000000007A :10730000000000000000000000000000000000007D :10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D +:10733000000000004000411021002100202000003A +:107340000000000000004100110005004002001193 +:1073500000000080000000000000000000000000AD +:10736000000000000000210440104100400000091E +:107370000020008000000000218911004000400032 :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED :1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D +:1073B0000002000000000000019100000100000038 +:1073C000000000000000000001400000000001007B +:1073D000000100000040000000000000000000006C +:1073E000000000000000000001000001000001009A +:1073F000900088419008400000000140010000001A :10740000000000000000000000000000000000007C -:10741000000000000000000000000000000000006C +:107410000000000000900088000000000000000054 :10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C +:1074300000000000000000000000000000E000006C +:1074400000000000000000000000880000E00000D4 +:1074500000000000000007008200000000000000A3 +:107460000000000000000000000000000000070015 +:107470000000810000E0070000000000810000E043 :1074800000000000000000000000000000000000FC :1074900000000000000000000000000000000000EC :1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC +:1074B00000000000810000E000000000000000006B :1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC +:1074D0000000000000000000F0F0000000000000CC :1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C +:1074F000000000000F0AFFAA5FC05FC0000000008C :10750000000000000000000000000000000000007B :10751000000000000000000000000000000000006B :10752000000000000000000000000000000000005B :10753000000000000000000000000000000000004B :10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B +:1075500000000000000000000000F0F0000000004B :10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B +:107570000000000000000C08FCA85FCF5FCF0000F7 :1075800000000000000000000000000000000000FB :1075900000000000000000000000000000000000EB :1075A00000000000000000000000000000000000DB :1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB +:1075D0000000000000000000000000000000FFFFAD :1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B +:1075F00000000000000000003CBEFFBE00C3140CF1 :10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A +:107610000000000000000000000000000000F1FB7E +:10762000F1FB00000000000000000000000000006E :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA +:10767000000000000000000000003CBEFFBE000053 +:10768000140C0000000000000000000000000000DA :1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA +:1076A000F1FBA1AB000000000000000000000000A2 :1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D00000000000000000000000000000000000AA -:1076E000000000000000000000000000000000009A -:1076F000000000000000000000000000000000008A -:107700000000000000000000000000000000000079 +:1076C0000000000000610007000D00000000000045 +:1076D0000000000000610006C00D000005000A0067 +:1076E000054000A8000000000000000000000000AD +:1076F000000000000061000E000D00A00021300A13 +:10770000C00D00A0000000610004C00500000000E2 :107710000000000000000000000000000000000069 :107720000000000000000000000000000000000059 -:107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 -:107750000000000000000000000000000000000029 +:1077300000000000000000000000000000000061E8 +:107740000007C00D000000410E0FF5FF0000000013 +:10775000000000000000FFFF0000D700D707000076 :107760000000000000000000000000000000000019 -:107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 +:10777000000000000000FFFFFFFF0000000000000D +:1077800000000000000000000000FF0C00000000EE :1077900000000000000000000000000000000000E9 :1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 -:1077D00000000000000000000000000000000000A9 +:1077C000000000000000000000410F0FFFFF00005C +:1077D0000000000000000000FF550300D700D7D7CD :1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 +:1077F0000000000000000000FFFF14100000000067 +:1078000000000000000000000000FF0CFF0C000062 :107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 :107830000000000000000000000000000000000048 -:107840000000000000000000000000000000000038 -:107850000000000000000000000000000000000028 -:107860000000000000000000000000000000000018 -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000000E8 +:1078400000000000000000000000C2C3C0C07F7F35 +:107850007F7F000000000000000000545454080026 +:107860000C0000000000000000000000000000000C +:10787000000000000000000000003C0000000000CC +:1078800000001E1E3CFF0000000000000000000081 +:107890000000FFFF000000000000000000000000EA :1078A00000000000000000000000000000000000D8 :1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000000000000000000098 -:1078F0000000000000000000000000000000000088 -:107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 +:1078C000000000000000000000000000FAFFF0F0DF +:1078D000FF7DEB690000000000000000FCFCFCFCE8 +:1078E00000000C000000000000000000000000008C +:1078F0000000000000000000000000003C0000004C +:10790000000000001E1E3C000000000000001000EF +:10791000001000FF00FF0000000000000000000059 :107920000000000000000000000000000000000057 :107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 -:1079500000000000000000002000000020000000E7 -:107960000000000400000000000000000000000013 -:1079700000000000C0000000200000002000000007 -:1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000002000C7 -:1079A00000000000000000000000000000000000D7 -:1079B000000000000000000000000000C0002000E7 -:1079C00000000000000000000000000000000000B7 +:107940000000000000000000000000000000200017 +:10795000000000000000000000000000000088009F +:1079600000000400000020000000000000002000D3 +:1079700000000000000000000000000000002000E7 +:1079800000000000000000000000000000000002F5 +:10799000000000000000000400008400000400005B +:1079A00020004000400040050000000000002000D2 +:1079B00000000000000000000000200000000000A7 +:1079C000200000000000000000000000000440044F :1079D00000000000000000000000000000000000A7 :1079E0000000000000000000000000000000000097 :1079F0000000000000000000000000000000000087 -:107A00000000000000000000000000000000000076 -:107A10000000000000000000000000000000000066 -:107A200000004100000041C0000041004100000092 -:107A30000000000000000000000000000000000046 +:107A000000000000000000080090000000000000DE +:107A100000000082000000080000000000000002DA +:107A200000000000000000000002009000000000C4 +:107A30008000000000000000000040000000000086 :107A40000000000000000000000000000000000036 -:107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 -:107A70000000000000000000000000000000000006 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 -:107AA00000000000000000000000000000000000D6 -:107AB00000000000000000000000000300000000C3 +:107A5000000000000000000000000000000800001E +:107A6000000004000000000000000004000000000E +:107A700000080000000000000000000000000000FE +:107A800000000000020000000000000000000000F4 +:107A900000000000000004000000000000000000E2 +:107AA000000884050000000000000000000402102F +:107AB0000000008400000000000000100000000032 :107AC00000000000000000000000000000000000B6 -:107AD00000000000000000000000000000000000A6 -:107AE0000000000000000000000000000000000096 -:107AF0000000000000000000000000000000000086 -:107B00000000000000000000000000000000000075 -:107B10000000000000000000000000000000000065 -:107B20000000000000000000000000000000000055 -:107B300000820000000000000000000000000000C3 -:107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 -:107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 -:107BA000000000000000880000000000000000004D -:107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000000000000000B5 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000000095 -:107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 -:107C10000000000000000000000000000000000064 -:107C20000000000000000000000000000000000054 +:107AD000000000000008000800080008000800047A +:107AE00000080008000800080008008400080008DA +:107AF00000080004008400080008000800080008CE +:107B000000080008000800080008008400040008BD +:107B10000088008400000004000800080008040831 +:107B20000008008400080008004000080004000865 +:107B3000000900900005000000080008000400088B +:107B40000084000400040008000800100000008405 +:107B500000080008008484210000002000000000CC +:107B600000000000000000210000000000080000EC +:107B700000000000000000080000000000210000DC +:107B8000002100000000000588000000000800003F +:107B9000000990000000000000000000000000113B +:107BA0000000000000000005900000000000000040 +:107BB000000000004008400800000000000000082D +:107BC00000050008000000080000000000000000A0 +:107BD0000008000500000000050000000000000093 +:107BE000000000000000080000000000000000008D +:107BF000000000A0000000000000000000000000E5 +:107C0000000000000000000000000900000000006B +:107C1000000000000000000800000000000000005C +:107C2000000000000000000000000000000800004C :107C30000000000000000000000000000000000044 -:107C40000000000000000000000000000000000034 -:107C50000000000000000000000000000000000024 +:107C4000000000000000000000000000000000082C +:107C500000000000000000000000820000000000A2 :107C60000000000000000000000000000000000014 :107C70000000000000000000000000000000000004 :107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 +:107C900000000000000000000008000008000002D2 :107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD00000000000000000000000000000000000A4 -:107CE000100000000000080000000000000000007C -:107CF0000000000000000000000000000000000084 +:107CB000000000200005000000000000000000009F +:107CC00000000000000000000000000000000800AC +:107CD0000800080000000000840000000000000010 +:107CE0000000000010000000000000000000000084 +:107CF0000000000000820000000000000000000002 :107D00000000000000000000000000000000000073 -:107D1000000000000000000800000000000000005B -:107D20000000100008000500080005000000000029 -:107D30000000000000000000000000000000000043 -:107D4000000000000000000000000500000000002E +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D3000000000000000118800900000000000001A +:107D400000000000000000A0000000000000000093 :107D50000000000000000000000000000000000023 :107D60000000000000000000000000000000000013 :107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 +:107D800000000000000900000000000000000000EA :107D900000000000000000000000000000000000E3 :107DA00000000000000000000000000000000000D3 -:107DB00000000000000000000000000000000000C3 -:107DC00000000000000000000000000000000000B3 -:107DD00000000000000000000000000000000000A3 -:107DE0000000000000000000000000000000000093 -:107DF0000000000000000000000000000000000083 +:107DB00082000000100000000000000000000080B1 +:107DC00000000000000500000000000000000000AE +:107DD0000000000000000000000000000000080893 +:107DE00010900000000000A000C000000000000093 +:107DF00000000000000000200000000000000084DF :107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 +:107E100000400900080000000800000411080000EC +:107E200000001102000000000090000000000000AF +:107E30000000000000000000000000000900090030 +:107E4000000400000000000000000000000000002E :107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 +:107E60000000000000000009000000000000000009 :107E70000000000000000000000000000000000002 -:107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 +:107E800000000000000000000002000000000000F0 +:107E900000000000000000000000000800000000DA :107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 -:107ED00000000000000000000000000000000000A2 +:107EB0000000000000001000000010210000000081 +:107EC00000000000000800000000000000000000AA +:107ED0000008000000030000000000000000000097 :107EE0000000000000000000000000000000000092 :107EF0000000000000000000000000000000000082 :107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 +:107F10000000000008000000000000000000000059 :107F20000000000000000000000000000000000051 :107F30000000000000000000000000000000000041 :107F40000000000000000000000000000000000031 @@ -133147,7 +133147,7 @@ :107F900000000000000000000000000000000000E1 :107FA00000000000000000000000000000000000D1 :107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 +:107FC00003A00120400802020000000000000000A1 :107FD00000000000000000000000000000000000A1 :107FE0000000000000000000000000000000000091 :107FF0000000000000000000000000000000000081 @@ -133155,7 +133155,7 @@ :108010000000000000000000000000000000000060 :108020000000000000000000000000000000000050 :108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 +:10804000000020800300800000800000000000008D :108050000000000000000000000000000000000020 :108060000000000000000000000000000000000010 :108070000000000000000000000000000000000000 @@ -133163,7 +133163,7 @@ :1080900000000000000000000000000000000000E0 :1080A00000000000000000000000000000000000D0 :1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 +:1080C00000000000800000208040008000000000D0 :1080D00000000000000000000000000000000000A0 :1080E0000000000000000000000000000000000090 :1080F0000000000000000000000000000000000080 @@ -133171,24 +133171,24 @@ :10811000000000000000000000000000000000005F :10812000000000000000000000000000000000004F :10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F +:1081400000000000000008000000A0A100040000E2 :10815000000000000000000000000000000000001F :10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF +:1081700002000000000000000000000000000000FD :1081800000000000000000000000000000000000EF :1081900000000000000000000000000000000000DF :1081A00000000000000000000000000000000000CF :1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF +:1081C0000000000000000000901000900089A01145 :1081D000000000000000000000000000000000009F :1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F +:1081F00000008000000000000000000000000000FF :10820000000000000000000000000000000000006E :10821000000000000000000000000000000000005E :10822000000000000000000000000000000000004E :10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E +:108240000000000000000000000000030005001016 +:10825000809100000000000000000000000000000D :10826000000000000000000000000000000000000E :1082700000000000000000000000000000000000FE :1082800000000000000000000000000000000000EE @@ -133203,8 +133203,8 @@ :10831000000000000000000000000000000000005D :10832000000000000000000000000000000000004D :10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D +:108340000000000000000000000000000000080025 +:108350008802080004000000000000000000000087 :10836000000000000000000000000000000000000D :1083700000000000000000000000000000000000FD :1083800000000000000000000000000000000000ED @@ -133212,7 +133212,7 @@ :1083A00000000000000000000000000000000000CD :1083B00000000000000000000000000000000000BD :1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D +:1083D000820000E00000000000000000000000003B :1083E000000000000000000000000000000000008D :1083F000000000000000000000000000000000007D :10840000000000000000000000000000000000006C @@ -133220,7 +133220,7 @@ :10842000000000000000000000000000000000004C :10843000000000000000000000000000000000003C :10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C +:1084500000000019003F81C389CF00000000000028 :10846000000000000000000000000000000000000C :1084700000000000000000000000000000000000FC :1084800000000000000000000000000000000000EC @@ -133228,7 +133228,7 @@ :1084A00000000000000000000000000000000000CC :1084B00000000000000000000000000000000000BC :1084C00000000000000000000000000000000000AC -:1084D000000000000000000000000000000000009C +:1084D0000000000019193F3F91F399FF00000000D0 :1084E000000000000000000000000000000000008C :1084F000000000000000000000000000000000007C :10850000000000000000000000000000000000006B @@ -133244,7 +133244,7 @@ :1085A00000000000000000000000000000000000CB :1085B00000000000000000000000000000000000BB :1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B +:1085D0000000000000000000F3F3030300DB00DBF9 :1085E000000000000000000000000000000000008B :1085F000000000000000000000000000000000007B :10860000000000000000000000000000000000006A @@ -133252,16 +133252,16 @@ :10862000000000000000000000000000000000004A :10863000000000000000000000000000000000003A :10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A +:1086500000000000000000000000F3F3930300DBC3 +:1086600000DB00000000000000000000000000002F :1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA :1086A00000000000000000000000000000000000CA :1086B00000000000000000000000000000000000BA :1086C00000000000000000000000000000000000AA -:1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A +:1086D0000000000000000000000000000061000633 +:1086E000C0090000000000000000000000000000C1 :1086F000000000000000000000000000000000007A :108700000000000000000000000000000000000069 :108710000000000000000000000000000000000059 @@ -133269,7 +133269,7 @@ :108730000000000000000000000000000000000039 :108740000000000000000000000000000000000029 :108750000000000000000000000000000000000019 -:108760000000000000000000000000000000000009 +:1087600000000010FFFF00000000000000000000FB :1087700000000000000000000000000000000000F9 :1087800000000000000000000000000000000000E9 :1087900000000000000000000000000000000000D9 @@ -133277,7 +133277,7 @@ :1087B00000000000000000000000000000000000B9 :1087C00000000000000000000000000000000000A9 :1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000000000000089 +:1087E000000000000000F5FF000000000000000095 :1087F0000000000000000000000000000000000079 :108800000000000000000000000000000000000068 :108810000000000000000000000000000000000058 @@ -133295,178 +133295,178 @@ :1088D0000000000000000000000000000000000098 :1088E0000000000000000000000000000000000088 :1088F0000000000000000000000000000000000078 -:108900000000000000000000000000002000200027 -:108910000000880000008800000000002000200007 -:10892000200000000000200000008800200040001F -:108930008800C0008800880000004000000000009F +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:10892000000000000000000000000000000800003F +:10893000000000040400000000000003000000002C :108940000000000000000000000000000003000024 -:10895000000000000000000000000000840088000B -:108960008400000000000000000000000000000083 -:1089700000000000000000000000000000000000F7 -:1089800000000000000000000000000000000000E7 +:1089500000000000000020000000000004000000F3 +:10896000880000040002000088000000000084006D +:1089700000000000000220000000A0000000040031 +:10898000200000000000880000000000000000003F :1089900000000000000000000000000000000000D7 -:1089A00000000000000000000000000000000900BE -:1089B00000000000000000000000000000000000B7 +:1089A00000000000000000002000000000000000A7 +:1089B00000000000000000000000000000020000B5 :1089C00000000000000000000000000000000000A7 -:1089D00000000000000000000000000005C02100B1 -:1089E00005C0000009900000090000000000000020 -:1089F0000000000000000002000000000020002035 -:108A00002120000000000000210000000000000004 -:108A10000000000000000000000000000000001046 -:108A2000000000000000000000000000000020081E -:108A30000000000000000000000000000000001026 +:1089D0000082000000000000000000000000000015 +:1089E0000000000000000082000000000000000005 +:1089F0000000000041000000000000000000000036 +:108A0000000000000000000000080000000000005E +:108A1000000000000000020000000000000000084C +:108A20000000000000000000000000000000200026 +:108A30000440000000000000000500400000041198 :108A40000000000000000000000000000000200006 -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 -:108A700020080000000000000000000000000000CE -:108A800000000000000000000000000000000000E6 -:108A900020000000000000000000000000000000B6 -:108AA00000000000000000000000000000000000C6 -:108AB0008001000020000000000000000000000015 -:108AC00000000000000000000000000000000000A6 -:108AD0008000000000000000000000000000000016 -:108AE0000000000000840000000000000000000002 -:108AF0000000808500000000008400000008008461 -:108B000000000090008400900084009000000000AD -:108B10000000809000000000000000000000000342 -:108B20000000002100000000000000000000000024 -:108B30000000002100000000000000000000000014 -:108B40000000000400080000000000000000000019 -:108B500000000008000000030021002100210000A7 -:108B60000008A021C02100080008880800080000B3 -:108B700000000003000800020000000000000000E8 -:108B800000000000002100000000000900000000BB -:108B90000003000000400000000000000000000092 +:108A5000000000000200000000000008000000000C +:108A60000000000004000000000000000000000002 +:108A700020100000000000000000000000000000C6 +:108A8000000000400000001100000008000000008D +:108A90002000001000080000000802080008008400 +:108AA0000082000800080008000820080008008272 +:108AB00080080004000800080008000800080008FA +:108AC0000008000800080008000800080008000866 +:108AD0008008000000080008000800080084000862 +:108AE00000080008000800080008000800840008CA +:108AF0000008820800880008000800080008000834 +:108B00000008008200040008000800080084000833 +:108B1000000880089000002140084021002100004A +:108B200000080021C00004210000002100210000F5 +:108B30000008002100000021000800210040000082 +:108B40000000002100008821000084210040400036 +:108B50000200902100000000402140080021C000D8 +:108B6000000000000021000000210000002100089A +:108B70000000000000210021002100080021002148 +:108B8000000000000021002100210000002100055C +:108B900000000000002100000000000000000000B4 :108BA00000000000000000000000000000000000C5 -:108BB00000000000080000000000000000000000AD +:108BB00000000000000000000000000000000000B5 :108BC00000000000000000000000000000000000A5 -:108BD000000000000000000003000000080000008A -:108BE00041000000410009002100210000000000B8 -:108BF000000000000000000000000008020000006B -:108C000000000000000000900000000000000000D4 -:108C10000000000000000000820000008200000050 -:108C2000820000000000A00084000000A0000000FE -:108C30000800C00000000000000000000000080064 -:108C4000000008000000000008000000080082008A -:108C5000C00082000000080000000400080082003C -:108C600000000800000000000000000000000000FC -:108C700000000000000000000000000000000000F4 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA000000000000000000008002100000000009B +:108BD0000000000000000000000000000000000095 +:108BE0000040000000000000000041000000000004 +:108BF00000000000000000000082000000000000F3 +:108C0000000000000000000000000000090000005B +:108C100000000800000003000000000000008200C7 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C500000000040000000000000100010000000B4 +:108C60000000000084000000100482008200000068 +:108C700000400000000000040000820382000000A9 +:108C800000000400000000000800820082000000D4 +:108C900000000000000000000000000800000000CC +:108CA00000000000000000000000000000000000C4 :108CB00000000000000000000000000000000000B4 :108CC00000000000000000000000000000000000A4 -:108CD00000000000000000000000000000A00000F4 -:108CE0000000000000000000000000000000000084 +:108CD0000200000000000000000000000000000092 +:108CE00000000000000000000000000000C000C004 :108CF0000000000000000000000000000000000074 -:108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000800A000AB -:108D2000000000000000000000000000000400003F -:108D3000880000000000000000000040000000006B -:108D4000000000000000000000000000000008001B -:108D500000000000000000000000002100000800EA -:108D6000A0030008080082080000000000080000BE +:108D0000000000000000000000000000000800005B +:108D10000000000000000000000000000000000053 +:108D20000000000000000200000000000000000041 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000110000000002 +:108D60004000000000000000000040000000000083 :108D700000000000000000000000000000000000F3 -:108D800000400000000000000000000000000000A3 -:108D900000000000000000000000000000040000CF +:108D8000000000000000000000004000000800009B +:108D900000000000000000000000000000000400CF :108DA00000000000000000000000000000000000C3 -:108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE000000000000000000000000000090000007A -:108DF0000000000000000000000000000000000073 +:108DB0000000000000000000000000000000004073 +:108DC000000000000000000000000000000005009E +:108DD000000000000000000400000004000000008B +:108DE0000000000000000000000800000000040077 +:108DF00000000000000000004000030000200310FD :108E00000000000000000000000000000000000062 :108E10000000000000000000000000000000000052 -:108E200000000800000008000800A0000800000082 -:108E30000000000000000000000000000000000032 +:108E20000000000000020000000000000000000040 +:108E30000000000000000000000800080000000022 :108E40000000000000000000000000000000000022 -:108E500000000000000000000000082100210003C5 -:108E600000001000000084000000A00008000000C6 -:108E700008000000000000000000000000000000EA +:108E50000000000000000000000800080000000002 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000002100080000C9 :108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000030000CF +:108E900000000000000000000000000500080000C5 :108EA00000000000000000000000000000000000C2 :108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000000000092 +:108EC000050000000000000000000000000000009D +:108ED000000000000000000000880000000000000A :108EE0000000000000000000000000000000000082 :108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 +:108F0000020000040000000000000000000000005B :108F10000000000000000000000000000000000051 -:108F20000000000000010001000100C0000100017C -:108F300000C0000300000001004000880001400163 -:108F400000C1000000000000000000000000000060 -:108F5000000000000000000000020000000000000F -:108F600000000000000000010001000100C000013D -:108F7000000100C0000300000001004000020001E9 -:108F8000400100C1000000000000000000000000DF -:108F900000000000000000000000000200000000CF -:108FA00000000000000000410041004100C00341FA -:108FB000004100C120C10020084100000000004124 -:108FC0008041009000000000000000000000000050 -:108FD000000000000000000204000000000000008B -:108FE000000000000000000000410041004100C0FE -:108FF0000341004100C108C1004040410000008021 -:1090000000418041009000000000000000000000CE -:109010000000000000000000000802000000000046 -:10902000000000000000000041000300000000807C -:109030004100C000000040008200880000809000D5 -:109040004100C1000010800000000200000000008C -:109050000000000000000000020009000000800085 -:1090600000000000000000110003410003000000A8 -:1090700000804100C0000000020005002000000048 -:1090800085004100C10000108000000010000000B9 -:1090900000000000000000000000020009000000C5 -:1090A00000000000000000000002010001000000BC -:1090B00000C00100C00000000000040005820004A0 -:1090C000C1004100C10000918200000000000000CA -:1090D00000000000000000000000100010900010D0 -:1090E0000800020000000000000000000100010074 -:1090F000000000C00100C000000001002000088244 -:109100000082C0004100C100009182000000000008 -:1091100000000000000000000000000090000208B5 -:1091200000108800080000000000000000C00001DE -:10913000C0C100000000000100C182050041000123 -:1091400000C100000000000100010000000000005C -:109150000000000000000000000000000088000087 -:10916000000000000000000000000000000000C03F -:109170000001C0C100000000000100C120410083C7 -:10918000000190C10000000000010001000000008B -:1091900000000000000000000000000000000010BF -:1091A000000000000000000000000000000000803F -:1091B000004180C10000000000410090809000410B -:1091C000004100C10000000000410010000000004C -:1091D000000000000000000000000000000000008F +:108F20000000000000000000000000000100000040 +:108F3000000000000001010000C00000000000006F +:108F40000000000000000000000000000100000020 +:108F5000000000000000000000C000000000000051 +:108F60000000000000000000000000000000010000 +:108F70000000000000000000010000C00000000030 +:108F800000000000000000000000000000000100E0 +:108F90000000000000000000000000C00000000011 +:108FA0000000000000000000000000000000410080 +:108FB0000000000000000004080000800000000025 +:108FC0000000000000000000000000000000410060 +:108FD00000000000000000101100008000000000F0 +:108FE0000000000000000000000000000000000081 +:108FF00041000000000000000002080000800000A6 +:109000000000000000000000000000000000000060 +:10901000410000000000000000020300008000008A +:1090200000000000000000000000030000000080BD +:10903000000080000000000002008400000000002A +:10904000000000000000004100000300000000805C +:109050000000800000000000020088000000000006 +:1090600000000000000000410000000003000000BC +:10907000008000008000000000000200C00000002E +:10908000000000000000000000410000030000009C +:10909000008000008000000000000200C00000000E +:1090A000000000000000000000410000010000007E +:1090B00000C0000020000000000082000820001016 +:1090C000400002000000000000010000010000005C +:1090D00000C0000020000000000008000820001070 +:1090E000100002000000000000010000000001006C +:1090F000000000C000002000000000004000080840 +:10910000001010000200000000000001000001003B +:10911000000000C00000200000000000400008889F +:1091200000900800020000000000000100000000A4 +:10913000C000000000000000000000000008000067 +:10914000000000000000000000000000000000001F +:10915000C000000000000000000000000008000047 +:1091600000000000000000000000000000000000FF +:109170000000C00000000000000000000000000827 +:1091800000000000000000000000000000000000DF +:109190000000C00000000000000000000000000807 +:1091A00000000000000000000000000000000000BF +:1091B00000008000000000000000000000000080AF +:1091C000000000000000000000000000000000009F +:1091D000000080000000000000000000000000808F :1091E000000000000000000000000000000000007F -:1091F0000080004180C1000000000041009000108C -:109200000041004100C100000000004100100000CA -:10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000C100800080C10000410000080200410020 -:10924000C1C1000080080000410000008000410012 -:109250000002800000C100000000000000000000CB -:1092600000C1000000090000000000000000000034 -:109270000000C100800080C1000041008000820029 -:109280004100C1C180008008000041000000800052 -:1092900041000010800000C100000000000000003C -:1092A000000000C1000000020000000000000000FB -:1092B0000000C1004000C0C1000001002000890082 -:1092C0000100C1119000C000000001000000C000BA -:1092D000010000002000004000000000000000002D -:1092E000000000110200000000000000000000006B -:1092F00000000000C1004000C0C1000001000200E9 -:1093000005000100C1410400C00000000100000090 -:10931000C00001000000200000400000000000002C -:109320000000000000110800000100000000000023 +:1091F00000000000800000000000000000000000EF +:1092000000800000000000000000000000000000DE +:1092100000000000800000000000000000000000CE +:1092200000800000000000000000000000000000BE +:109230000000800000C100000000000000000000ED +:1092400000410000000200000000000000000000DB +:109250000000800000C100000000000000000000CD +:1092600000410000000200000000000000000000BB +:1092700000000000800000C10000000000000000AD +:10928000000000410000000200000000000000009B +:1092900000000000800000C100000000000000008D +:1092A000000000410000000200000000000000007B +:1092B00000000000400000C10000000000000000AD +:1092C0000000008902000000000000000000000013 +:1092D00000000000400000C100000000000000008D +:1092E00000000089020000000000000000000000F3 +:1092F000000000000000400000C10000000000006D +:1093000000000000008902000000000000000000D2 +:10931000000000000000400000C10000000000004C +:10932000000000000021020000000000000000001A :1093300000000000000000000000004200000000EB -:1093400000000000811200480700480000000000F3 -:10935000000000000000000000000000000000000D -:1093600000000000810000E0000048000000000054 -:1093700000000000000000000000000000420000AB -:1093800000000000000081120048070048000000B3 -:1093900000000000000000000000000000000000CD -:1093A000000000000000810000E000004800000014 -:1093B00000000000000000000000000000000000AD +:1093400000004800810000E000004800000000002C +:109350000000004200000000000000420000000089 +:1093600000004800810000E000004800000000000C +:109370000000004200000000000000000042000069 +:10938000000000004800810000E0000048000000EC +:109390000000000000420000000000000042000049 +:1093A000000000004800810000E0000048000000CC +:1093B000000000000042000000000000000000006B :1093C000000000000000000000000000000000009D :1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D @@ -133482,195 +133482,195 @@ :1094800000000000000000000000000000000000DC :1094900000000000000000000000000000000000CC :1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000757B00000000BC +:1094B00000000000000000000000747B00000000BD :1094C000000000000000000000000000000000009C -:1094D0000000000000000000DEAE747B0000000011 +:1094D0000000000000000000DE2E747B0000000091 :1094E000000000000000000000000000000000007C -:1094F0000000000000000000DE2E0000757B000070 +:1094F0000000000000000000DE2E0000747B000071 :10950000000000000000000000000000000000005B -:1095100000000000000000000000DEAE747B0000D0 +:1095100000000000000000000000DE2E747B000050 :10952000000000000000000000000000000000003B -:1095300000000000000000000000DE2E60C60300F6 -:109540000000000000000031E0000000000000000A -:109550000C0000000000000000C0630661560340DC -:109560000000000000000230A00000000000000029 -:109570000C4000000000000002C06A86000060C6C7 -:1095800003000000000000000031E00000000000C7 -:1095900000000C0000000000000000C063066156DF -:1095A00003400000000000000230A00000000000A6 +:1095300000000000000000000000DE2E6156034025 +:109540000000000000000231E00000000000000008 +:109550000C4000000000000002C06A866156034013 +:109560000000000000000231E000000000000000E8 +:109570000C4000000000000002C06A860000615636 +:1095800003400000000000000231E0000000000085 +:1095900000000C4000000000000002C06A86615616 +:1095A00003400000000000000231E0000000000065 :1095B00000000C4000000000000002C06A860000AD -:1095C000000000002000000020000000000000005B -:1095D0000000200084008400200020000000000023 -:1095E0000000000400000000200000000000000057 -:1095F000000000000000000020000000000000004B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A -:10963000000000000000C00000000000000000006A +:1095C0002000200000008800000000002010200083 +:1095D0001000000000001000000800002000000043 +:1095E00020001000C00088080000000020082000B3 +:1095F00020000000000088000000000020000003A0 +:10960000000321004100210020080000000020008C +:1096100020052000880000040500000000844000B0 +:10962000C000C000200020052005000000008800C8 +:1096300020002000200088202000000000052003DA :10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA -:1096700000000000200000000000000000000000CA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA +:109650000002000200000002000000000000000004 +:1096600000000002000000000000000000000000F8 +:1096700000000000000000000000000000000000EA +:10968000000000001008400820900010000000902A +:10969000000800840000000800081000000000021C +:1096A0008002000000000000000000000000000038 +:1096B0001000000000000000000100000000000099 :1096C000000000000000000000000000000000009A -:1096D000000000000000000000000000000000008A +:1096D0000000000000000200000000000000000088 :1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 +:1096F0000000000000000000010000000000000069 +:10970000A041000000801004008002040000080056 +:1097100000000000000000000000080000414000C0 +:1097200041004000000000000000000000000000B8 :109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000100008B1 -:1097A00000000000000000080000000000000000B1 -:1097B0000000000000000000000000000000009019 -:1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:1098400000000000000000000000000041000800CF -:109850000800000000000000000000000000000000 -:1098600000000000000008000000000000000000F0 -:1098700000000000000000000000000000000008E0 -:1098800000C0008241000000000000000000000055 -:1098900009000300030000000000000000000000B9 -:1098A00000000000000000000000000000000000B8 -:1098B0000000008800000000000000000000000020 -:1098C0000000000400820000000000000000A00072 -:1098D0000000000000000000000000000000000088 -:1098E0000000000000000000000000000000000078 -:1098F0000000000000000000000000000000000068 -:1099000000000800840008000000000000000000C3 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 -:109940000000000000008400000000000000000093 -:109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 -:1099700000000800000000000000000000000000DF +:1097400000000000000800080008000800100008E1 +:109750000008000800080008000800080000008455 +:10976000000802080008000820080084008400089F +:109770000008008400080008000804042000000815 +:10978000000800100000000280090002000900101B +:109790000008000800080008000800080008410050 +:1097A0008008C00880000084000800084108008884 +:1097B00000080008008400080008000800080000F5 +:1097C000000800880040000200400000000000087F +:1097D0000000000000000040000000000100000048 +:1097E000000000000000000000030000000800006E +:1097F0000021000000000000000000000008002020 +:109800008803901000030000000001000000000029 +:109810000000000000000021000000000000000027 +:109820000000100084004002000800030000000057 +:109830000000000000000000001100100000000304 +:1098400000100000000000210000000000000000E7 +:10985000000020000000000000010000000004A043 +:10986000000000A0000000000000000000840000D4 +:109870001000200000000900000000000000008827 +:109880000000008200020000000000002000000034 +:109890000000008800000000000000000000000040 +:1098A00000000000808209028040000000000000EB +:1098B0000000000020000000000000000000000088 +:1098C000008400000000000000000800000000000C +:1098D0000000000000000000000000800000018087 +:1098E00009800800000000000100000000000000E6 +:1098F00082000800000000000000000000000000DE +:109900000000000000000000000000000000000057 +:109910000800000084008400000000000000000037 +:1099200000000000000000800000080000000000AF +:109930000000C00000000000000000000000000067 +:109940000000000000000000A000000000A00000D7 +:1099500000000000000000000000000000080000FF +:109960002020020400000000000020000000000091 +:1099700000000000000000000000000000000000E7 :1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 -:1099B00000000000000000000000000000000000A7 +:109990000000000010001000000000000210000095 +:1099A0000500100000000000000800000008000092 +:1099B00000A00000000000002100000008000000DE :1099C0000000000000000000000000000000000097 -:1099D0000000000000000000000000000000000087 -:1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 -:109A00000000000008000008000000000000000046 -:109A1000000800000000000000000000000000003E -:109A20000000000000000000000000000000000036 -:109A30000000000000000000000000000000000026 -:109A40000000000000000000900040000000000046 -:109A50000000000000000000000008000300008477 -:109A600000900890030000000000080000000000C3 +:1099D000000000000000080000009000900000005F +:1099E0000000002010000000000000000000000047 +:1099F0000000000000000021000000000000000046 +:109A00000000000000000020000000000000000036 +:109A100000080000000800004041000000000010A5 +:109A2000000020000000C00008000000000000004E +:109A30000021000000000000000200000000000003 +:109A4000000000000000000000000000000800000E +:109A50000000000000000000000000000000000006 +:109A6000000000A0000280000000000000000000D4 :109A700000000000000000000000000000000000E6 -:109A80000200008200000000000000000000000052 -:109A900000000000000000000000000008000300BB -:109AA00000000000090000000000000008000000A5 +:109A800010000082000000000000000000000088BC +:109A900000000000000000000900000000000000BD +:109AA0000000000000A00004000000000000000012 :109AB00000000000000000000000000000000000A6 -:109AC0000000000000000000058800000000000009 +:109AC0000000000009A000000000000000000000ED :109AD0000000000000000000000000000000000086 -:109AE0000000000000000000000200000000000074 -:109AF0000000000000000000000000000000000066 +:109AE0000000820001000000C0000000000000092A +:109AF0000000000000000000000000000000002145 :109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B40000000000000000000000000000000000015 -:109B50000000000000000000000000000000000005 -:109B600000000000000000000000000000000000F5 +:109B100000000000000000000000000000410041C3 +:109B20000000002100000000100000000000000004 +:109B300001000100000008210000000000000000FA +:109B40000000000000000000100000000000000005 +:109B500000000008000000000000000000000000FD +:109B600000000000000020000000000000000000D5 :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000000000000000A5 +:109B900000000002000000000000000000001000B3 +:109BA0000000000000000000000010002000410044 +:109BB0000000400040000000000005000000000020 :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 -:109BE0000000000000000000000000000000000075 +:109BE00000000000000001009000000000080000DC :109BF0000000000000000000000000000000000065 :109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 +:109C100000000000000000000000890110010000A9 :109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 +:109C30000001000190010001000000000000000090 :109C40000000000000000000000000000000000014 :109C50000000000000000000000000000000000004 -:109C600000000000000000000000000000000000F4 +:109C600000000000000000001100A1000000000042 :109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 -:109C900000000000000000000000000000000000C4 -:109CA00000000000000000000000000000000000B4 -:109CB00000000000000000000000000000000000A4 +:109C900000000000000000000000000089048008AF +:109CA00000090000000000000000000000000000AB +:109CB000000000400009001000210000000000002A :109CC0000000000000000000000000000000000094 :109CD0000000000000000000000000000000000084 -:109CE0000000000000000000000000000000000074 +:109CE0000000000000000000000000880980000360 :109CF0000000000000000000000000000000000064 :109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 -:109D30000000000000000000000000000000000023 +:109D100000000000000000000000000002801000B1 +:109D200010004103000000000000000000000000DF +:109D30000000000008004000030041000000000097 :109D40000000000000000000000000000000000013 :109D50000000000000000000000000000000000003 -:109D600000000000000000000000000000000000F3 -:109D700000000000000000000000000000000000E3 +:109D600000000000000000000000000000110102DF +:109D7000000000880000000000000000000000005B :109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000000B3 -:109DB00000000000000000000000000000000000A3 +:109D9000000000400000000000000000000000087B +:109DA00000000100010100000000000000000000B0 +:109DB0000000000000000040000000000100000062 :109DC0000000000000000000000000000000000093 -:109DD0000000000000000000000000000000000083 -:109DE0000000000000000000000000000000000073 -:109DF0000000000000000000000000000000000063 +:109DD00000000000009000000000000000000000F3 +:109DE0000000000000000000000000000000010072 +:109DF0008888080000000000020000000000000049 :109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 +:109E2000000100000001010100000000000000002E +:109E3000000000000000000000000100010100011E :109E40000000000000000000000000000000000012 :109E50000000000000000000000000000000000002 :109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 +:109E700041000080800041000000800000000500DB :109E800000000000000000000000000000000000D2 :109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 -:109EC0000000000000000000000000000000000092 +:109EA0000000002100210005114100000000000019 +:109EB0000000000000000000000000202009082130 +:109EC0000041000000000000000000000000000051 :109ED0000000000000000000000000000000000082 :109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 +:109EF00000000011000000800000000500000000CC :109F00000000000000000000000000000000000051 -:109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 -:109F30000000000000000000000000000000000021 -:109F40000000000000000000000000000000000011 +:109F10000000004000000000000000000000000001 +:109F2000000000002189110041001108000000001C +:109F300000000000000000000000000021001020D0 +:109F400005000310000000000000000000000000F9 :109F50000000000000000000000000000000000001 :109F600000000000000000000000000000000000F1 -:109F700000000000000000000000000000000000E1 +:109F700000000000000100000040000000000000A0 :109F800000000000000000000000000000000000D1 -:109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000000000000000091 +:109F900000000000000100000000000000000000C0 +:109FA000000000000000011101000000010000009D +:109FB00000000000000000000000000000000100A0 +:109FC0000000000001000000000000000000000090 :109FD0000000000000000000000000000000000081 :109FE0000000000000000000000000000000000071 -:109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 -:10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 +:109FF000000000000000000000E007008200810077 +:10A0000000E0000000000000000000000000000070 +:10A0100000000000000000810000070000000000B8 +:10A020000000000000000000480000E00000000008 :10A030000000000000000000000000000000000020 :10A040000000000000000000000000000000000010 -:10A050000000000000000000000000000000000000 +:10A0500000000000000000000000000007000000F9 :10A0600000000000000000000000000000000000F0 -:10A0700000000000000000000000000000000000E0 +:10A07000000000000000000000000000F0F0000000 :10A0800000000000000000000000000000000000D0 :10A0900000000000000000000000000000000000C0 :10A0A00000000000000000000000000000000000B0 @@ -133678,7 +133678,7 @@ :10A0C0000000000000000000000000000000000090 :10A0D0000000000000000000000000000000000080 :10A0E0000000000000000000000000000000000070 -:10A0F0000000000000000000000000000000000060 +:10A0F0000000000000000000000000000000F0F080 :10A10000000000000000000000000000000000004F :10A11000000000000000000000000000000000003F :10A12000000000000000000000000000000000002F @@ -133686,8 +133686,8 @@ :10A14000000000000000000000000000000000000F :10A1500000000000000000000000000000000000FF :10A1600000000000000000000000000000000000EF -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF +:10A1700000000000000000000000000000003C3C67 +:10A180000000FFFF000000000000000000000000D1 :10A1900000000000000000000000000000000000BF :10A1A00000000000000000000000000000000000AF :10A1B000000000000000000000000000000000009F @@ -133695,7 +133695,7 @@ :10A1D000000000000000000000000000000000007F :10A1E000000000000000000000000000000000006F :10A1F000000000000000000000000000000000005F -:10A20000000000000000000000000000000000004E +:10A200003C3C0000000000000000000000000000D6 :10A21000000000000000000000000000000000003E :10A22000000000000000000000000000000000002E :10A23000000000000000000000000000000000001E @@ -133703,231 +133703,231 @@ :10A2500000000000000000000000000000000000FE :10A2600000000000000000000000000000000000EE :10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE +:10A2800005402A06054C00A800610006800D00006C :10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E +:10A2A00000000020000000A00000000000000000EE +:10A2B000000000610004C008000000000000000071 +:10A2C0000000000000000000000000610006000D1A :10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E +:10A2E000000000000000000000A0000000000000CE :10A2F000000000000000000000000000000000005E -:10A30000000000000000000000000000000000004D +:10A30000000000005555FFFF0000000000000000A5 :10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D -:10A33000000000000000000000000000000000001D -:10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD +:10A3300000000000D708FF08E1E114AF00000000B2 +:10A34000000000000000000000000000F020F0F01D +:10A35000002000C30000000000000000000000001A :10A3600000000000000000000000000000000000ED :10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000000CD +:10A380000000000000005555000000000000000023 :10A3900000000000000000000000000000000000BD :10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D +:10A3B000000000000000BF00BF41D2D20A7D0000B3 +:10A3C0000000000000000000000000000000F0207D +:10A3D000F0F0002000C300000000000000000000BA :10A3E000000000000000000000000000000000006D :10A3F000000000000000000000000000000000005D -:10A40000000000000000000000000000000000004C +:10A4000000000000000000000000F0F0000000006C :10A41000000000000000000000000000000000003C :10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C +:10A43000000000000000000030003000000000209C :10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC +:10A45000A2F382C3002000300000000000000000D2 :10A4600000000000000000000000000000000000EC :10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC +:10A48000000000000000000000000000F0F00000EC :10A4900000000000000000000000000000000000BC :10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C +:10A4B000000000000000000000003000300000201C +:10A4C000002000000000000000000000000000006C +:10A4D0000000AAFF82C3002000300000000000003E :10A4E000000000000000000000000000000000006C -:10A4F000000000000000000000000000000000005C -:10A5000000000000000000000020200020000000EB -:10A5100020000000000020000000000000000000FB -:10A520000000000000000000842020000400000063 -:10A5300020000000000000000000000000000000FB -:10A5400000004000000000000000000000000000CB -:10A5500000000000000000000000000000000000FB -:10A5600000002000000000000000000000000002C9 -:10A5700000000000000000000000000000000000DB -:10A58000000000000000000000000000000040008B -:10A59000000000000000000000002000000000009B -:10A5A000000000000000000000000000400000006B -:10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E000000000000000000000000000000000006B -:10A5F000000021000000000000000000000000003A -:10A600000000000000000000000000000800000042 -:10A610000000000000000000000000000210000028 +:10A4F000000000000000000000002000000000003C +:10A500008800200000002000200020000000020041 +:10A5100000000408200088008800200000000000DF +:10A520008400040002002000200000110800200028 +:10A5300088042010200020002000000320000000DC +:10A5400008002000200520412000C00084000000F9 +:10A5500088008800880284004000880020000000F5 +:10A5600000052000880088002000200020008400D2 +:10A5700020008400200020002000200000000000B7 +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000008000000000000B3 +:10A5A0000000000000000000000000402100210029 +:10A5B00000000000000000020000210000000090E8 +:10A5C000008400C000020002000000020000000041 +:10A5D0000000000000000001000000000000000278 +:10A5E0000000000000000000000000000000000269 +:10A5F0000002000221000000000000000000020034 +:10A60000020000000200000002000000000002083A +:10A610000000000002000000000000000200000036 :10A62000000000000000000000000000000000002A -:10A630000000000000000200000000000200000016 -:10A640000000000000000000000000000000080002 -:10A6500000000000000000000000000000000200F8 -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000000005A -:10A7000000000000000000000000000000008200C7 -:10A710000000000010000000080000000000000021 +:10A6300000002000000000000400000002000000F4 +:10A640000000020002000000000004000000000002 +:10A6500000000400000000004080040000800000B2 +:10A6600000000000A000000000000000000000004A +:10A6700000000000000000000000000000000200D8 +:10A68000000000000000000800880400000800002E +:10A690000010000800000008001000100008001062 +:10A6A000000800080000000800080000000800087A +:10A6B00000040008000000080008800000080000F6 +:10A6C000000000080004000000080008800000846A +:10A6D0000010000080080000000880088082000848 +:10A6E000000000C000000010090800100000000079 +:10A6F00000000000000800000004001000000088B6 +:10A70000000004000000A00004000000000200009F +:10A710000000000000000002000000000000000037 :10A720000000000000000000000000000000000029 -:10A730000000100000000000000000000000000009 -:10A740000000000000000000000000000000000009 -:10A7500000000800000008000000080000000000E1 -:10A7600000000000000000000000000000000000E9 -:10A770000000000004008800400000000400000009 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000800000000000000000091 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F000000000000400000009000000000000004C +:10A730000000400040000000000000008800000011 +:10A740008800000000009000900000000009000553 +:10A75000C00300030000081000000000C0880000D3 +:10A7600001080000000000000000000000000008D8 +:10A77000A0000008000000000008400800000000E1 +:10A7800000000000000000000000000000080000C1 +:10A7900000000000000800000000000000000000B1 +:10A7A000008208000000000000000000000000001F +:10A7B0000000000000400000000000000000000059 +:10A7C000000000000000030040000008000000043A +:10A7D00040000000000041000001050000000802E8 +:10A7E00008002000040000000008001000820000A3 +:10A7F0000000000000000008000000000000000051 :10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 +:10A810000000020004000000000000000000000032 +:10A820000000000000000000000000000800080018 +:10A83000000000000000080002000000000002000C +:10A84000004000000000000000000800A000C00060 +:10A85000A000000000000800000000000000080048 +:10A86000400040000000090000000000000000005F +:10A8700008000000000082000000A00000000800A6 +:10A8800082000000000082000000000000000000C4 +:10A8900000000000040000000000000000000000B4 :10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 +:10A8B0000000000000000200000000000200000094 +:10A8C0000000000800000000000000008000000000 +:10A8D0000000030000000000000000000000000075 +:10A8E0000000800080000800080000000000000058 :10A8F0000000000000000000000000000000000058 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 +:10A90000000000000000000000000003000800003C +:10A91000000000000000000000080000000000002F +:10A92000000000000000000000000000000800001F :10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 +:10A9400000008200900000000000000000090009E3 +:10A9500000118400A000840084008400C000C002B4 +:10A960000405A00000000000000000000008000036 +:10A9700000000005000000000008000000000000CA :10A9800000000000000000000000000000000000C7 -:10A99000000000000000000000000000110008009E -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D000000021000000000000000000000008004E -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000002000000000000433 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 +:10A99000000000000084000000C000C000000000B3 +:10A9A000008400840000000000000000000000009F +:10A9B0000000000000000000100000000020000067 +:10A9C00000000000098800000004000000000000F2 +:10A9D0004000020000C00000002000000000000055 +:10A9E00000000000000000000900000000A00000BE +:10A9F0000000000000000000000000000000040053 +:10AA0000000002000000000000000000000000083C +:10AA1000000000210000000000000000000000090C +:10AA20000000000000000000000000020002000022 :10AA30000000000000000000000000000000000016 -:10AA400000000000000000000000080000000000FE -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 +:10AA40000000000000000000000002000000000004 +:10AA5000C000000000000000000000400000840072 +:10AA60004000C04108100041000000210009200002 +:10AA7000001000090821002100000800000000204B :10AA800000000000000000000000000000000000C6 :10AA900000000000000000000000000000000000B6 :10AAA00000000000000000000000000000000000A6 :10AAB0000000000000000000000000000000000096 :10AAC0000000000000000000000000000000000086 :10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 +:10AAE0000000000000000001000000000000000065 +:10AAF00080000000000000002100000000000000B5 :10AB00000000000000000000000000000000000045 :10AB10000000000000000000000000000000000035 :10AB20000000000000000000000000000000000025 :10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 +:10AB400000000000000000000000C088009000002D +:10AB50000210000000A088080040008200040020CD +:10AB6000002008A0C0020002000284021105900427 +:10AB700000022002000000000000000000000000B1 :10AB800000000000000000000000000000000000C5 :10AB900000000000000000000000000000000000B5 :10ABA00000000000000000000000000000000000A5 :10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 +:10ABC000000000000000000000000000A0000000E5 +:10ABD0000000008000000380008000800080008072 +:10ABE000000000008000808000800080008011C193 +:10ABF00021850085008300000000000000000000A7 :10AC00000000000000000000000000000000000044 :10AC10000000000000000000000000000000000034 :10AC20000000000000000000000000000000000024 :10AC30000000000000000000000000000000000014 :10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 +:10AC500000048080000000000000002100000000CF +:10AC60000000800380000080000080830008000056 +:10AC700080410988008880A00000000000000000DA :10AC800000000000000000000000000000000000C4 :10AC900000000000000000000000000000000000B4 :10ACA00000000000000000000000000000000000A4 :10ACB0000000000000000000000000000000000094 :10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 +:10ACD0009000200340A008000000000000000002D7 +:10ACE000000010000889A008821000000840A08819 +:10ACF00088000841A10384A18289000000000000AF :10AD00000000000000000000000000000000000043 :10AD10000000000000000000000000000000000033 :10AD20000000000000000000000000000000000023 :10AD30000000000000000000000000000000000013 :10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 +:10AD5000000010C000020010111000008800000068 +:10AD6000000000000000000200082110829000A0F6 +:10AD7000004000824010090200820108000000002B :10AD800000000000000000000000000000000000C3 :10AD900000000000000000000000000000000000B3 :10ADA00000000000000000000000000000000000A3 :10ADB0000000000000000000000000000000000093 :10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 +:10ADD00000000000000000000000A10000000000D2 +:10ADE000000000000000000000800000048000005F +:10ADF00000800080000000808280410041800000CF :10AE00000000000000000000000000000000000042 :10AE10000000000000000000000000000000000032 :10AE20000000000000000000000000000000000022 :10AE30000000000000000000000000000000000012 :10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 +:10AE500000000000000000008000000080000000F2 +:10AE600000000000800000000000008080008000E2 +:10AE70000020000000808000410591110980200021 :10AE800000000000000000000000000000000000C2 :10AE900000000000000000000000000000000000B2 :10AEA00000000000000000000000000000000000A2 :10AEB0000000000000000000000000000000000092 :10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 +:10AED0000000000000000000080010880290100030 +:10AEE000000040008800040040009000208208908C +:10AEF000A000400110040808A00001000405080299 +:10AF000090000000000000000000000000000000B1 :10AF10000000000000000000000000000000000031 :10AF20000000000000000000000000000000000021 :10AF30000000000000000000000000000000000011 :10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 +:10AF500000000000000000000000000000000700EA +:10AF6000840000000000000000000000000000005D +:10AF7000070000000000000007006000000000E083 +:10AF800007008141000000000000000000000000F8 :10AF900000000000000000000000000000000000B1 :10AFA00000000000000000000000000000000000A1 :10AFB0000000000000000000000000000000000091 :10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 +:10AFD0000000000000000000000000003F3F0F0FD5 +:10AFE0000089000000009F839F9F00000000FF0079 +:10AFF00000000FFF0FFFF0FFF0C3FF00FF00B1BD27 +:10B00000B1BDF300F3660000000000000000000086 :10B010000000000000000000000000000000000030 :10B020000000000000000000000000000000000020 :10B030000000000000000000000000000000000010 :10B040000000000000000000000000000000000000 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 +:10B050000000000000000000000000000000303987 +:10B0600000090089008900009F9F9F9F0000000049 +:10B07000F1F1F1F100000FFF66FF66C3F1008100FE +:10B08000B181B181F000F066000000000000000016 :10B0900000000000000000000000000000000000B0 :10B0A00000000000000000000000000000000000A0 :10B0B0000000000000000000000000000000000090 @@ -133941,25 +133941,25 @@ :10B13000000000000000000000000000000000000F :10B1400000000000000000000000000000000000FF :10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF +:10B16000000000000018FF06C3020000FFFFC0003F +:10B1700000000000890009050000FFFF000000003A +:10B1800000000F09C000CC00FFFFFFF90000000025 :10B1900000000000000000000000000000000000AF :10B1A000000000000000000000000000000000009F :10B1B000000000000000000000000000000000008F :10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E +:10B1E00000000000000000810606020200000000CE +:10B1F0000000000000008900090500C100C1000036 +:10B2000030000F090F0900000000FCFCFCFC0000EE :10B21000000000000000000000000000000000002E :10B22000000000000000000000000000000000001E :10B23000000000000000000000000000000000000E :10B2400000000000000000000000000000000000FE :10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE +:10B2600000000000000000000E00000000000000D0 +:10B27000000000000000000000000E0000000000C0 +:10B2800000000E000000000000400E06000C000050 :10B2900000000000000000000000000000000000AE :10B2A000000000000000000000000000000000009E :10B2B000000000000000000000000000000000008E @@ -133967,7 +133967,7 @@ :10B2D000000000000000000000000000000000006E :10B2E000000000000000000000000000000000005E :10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D +:10B30000000000000000000000000404FF00FFFF38 :10B31000000000000000000000000000000000002D :10B32000000000000000000000000000000000001D :10B33000000000000000000000000000000000000D @@ -133975,7 +133975,7 @@ :10B3500000000000000000000000000000000000ED :10B3600000000000000000000000000000000000DD :10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD +:10B380000000000000000000000000000000FF00BE :10B3900000000000000000000000000000000000AD :10B3A000000000000000000000000000000000009D :10B3B000000000000000000000000000000000008D @@ -133983,8 +133983,8 @@ :10B3D000000000000000000000000000000000006D :10B3E000000000000000000000000000000000005D :10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C +:10B40000000000000000000000000000000000C379 +:10B410000100F0F00000000000000000000000004B :10B42000000000000000000000000000000000001C :10B43000000000000000000000000000000000000C :10B4400000000000000000000000000000000000FC @@ -133992,65 +133992,65 @@ :10B4600000000000000000000000000000000000DC :10B4700000000000000000000000000000000000CC :10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC +:10B4900000C30000F0F00000000000000000000009 :10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000020006C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000020004C -:10B4E0000000000000000000000000000004000058 -:10B4F0000000000000000005000000000000000047 -:10B50000200000000000000000000000000000001B -:10B51000000000000000000000000000000000002B -:10B5200020000000000000000000000000000000FB -:10B53000000000000000000000000000000000000B +:10B4B000000000000000000020000000000020004C +:10B4C0000000000000040004200020088400200088 +:10B4D00020000000000020002000000000002000EC +:10B4E0000000000000000400000020002000840094 +:10B4F0002000000084002000000020000200000066 +:10B500000404040000000000020084002000200069 +:10B51000880000000000200020002000200084009F +:10B5200020040400000004048804200020002000FF +:10B5300004008800400020002000000000000002FD :10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B +:10B550000002400000000000000040000000000069 +:10B5600000000000000000000000000000000400D7 +:10B57000200010000000000000000000000000009B +:10B580002100000000000000000200000000000098 +:10B5900000000004000000000000000000000000A7 +:10B5A000100000000000000000000000000000008B +:10B5B0000000200000000000000009000000000062 +:10B5C0000000000000000000000000000200000079 :10B5D000000000000000000000000000000000006B -:10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B +:10B5E0000000000000000000000000100000084003 +:10B5F000000000100000000000000000000000003B :10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A +:10B610000000000000000000020000000000000028 :10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A0000000000000000000000000000000008218 -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A +:10B630000000000000000000000000000000000802 +:10B640000000000000000000000000840000000076 +:10B6500000000000000000000008000000080008D2 +:10B6600000080000000800080008000000000000BA +:10B67000008800000000000000080008000800002A +:10B68000000800080000000800100008000000008A +:10B690000000000000000000000000080008000892 +:10B6A00000080008000800080000000800000084EE +:10B6B00000000000000000080000000800080084EE +:10B6C000000000080000000000080000000000006A +:10B6D0000000000000000400000000000040000026 :10B6E000000000000000000000000000000000005A :10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 -:10B710000008000000000000000000000000000021 +:10B700000000000000000000000004000000000035 +:10B710000200000000000000880884000000000013 :10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000400000005 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 +:10B730000008000000000000000000000000000001 +:10B74000000800200084002000000000000000002D +:10B7500000000000000800000000000000000008D9 :10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 +:10B7700000000800040000000000000000000000BD +:10B780001100000000200400410804A00000000097 +:10B7900005000008000000000000080040000088CC +:10B7A00000000084000000200000000000000000F5 :10B7B0000000000000000000000000000000000089 :10B7C0000000000000000000000000000000000079 :10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 :10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 +:10B800000000000000000000000000000800000030 :10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 +:10B820000000000010000000000000000000080000 +:10B830000000000008000000000000000000000000 :10B8400000000000000000000000000000000000F8 :10B8500000000000000000000000000000000000E8 :10B8600000000000000000000000000000000000D8 @@ -134063,26 +134063,26 @@ :10B8D0000000000000000000000000000000000068 :10B8E0000000000000000000000000000000000058 :10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 +:10B900000000000000000400000000000000000033 :10B910000000000000000000000000000000000027 :10B920000000000000000000000000000000000017 :10B930000000000000000000000000000000000007 :10B9400000000000000000000000000000000000F7 -:10B9500000000020000000000000000000000000C7 +:10B9500000000000000000000000000000000000E7 :10B9600000000000000000000000000000000000D7 :10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000002000000067 +:10B9800000000400002020880800000000000004DF +:10B99000412000001100000205000000000000002E +:10B9A00000882184080000040084000000000000DA +:10B9B0000000050000000000000000000000000082 :10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 +:10B9D0000000000800000008000000000000000057 :10B9E0000000000000000000000000000000000057 :10B9F0000000000000000000000000000000000047 :10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 +:10BA1000000000000000000000000000080000001E +:10BA200000000000000000000000000000210000F5 +:10BA300000000009000200000000000000000000FB :10BA400000000000000000000000000000000000F6 :10BA500000000000000000000000000000000000E6 :10BA600000000000000000000000000000000000D6 @@ -134238,60 +134238,60 @@ :10C3C000000000000000000000000000000000006D :10C3D000000000000000000000000000000000005D :10C3E000000000000000000000000000000000004D -:10C3F000000000000000000020000000000000001D -:10C4000020000000000000000000200000000000EC -:10C4100000000000000000002000000000000000FC -:10C4200020000000000000000000000000000000EC -:10C4300000000000000000000000200000000000DC -:10C4400000002000000000000000000000000000CC -:10C4500000000000000000000000200000000000BC -:10C4600000002000000000000000000000000000AC -:10C4700000000000000000001000000000000000AC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000400000000000000000005C -:10C4A000000000000000000000000000200000006C +:10C3F00000000000001020000000200000000000ED +:10C4000020000000000000002000000000000000EC +:10C4100000002000000020000000200000000000BC +:10C42000200000000000000020004000000000008C +:10C430000000200000000004200000002004000094 +:10C44000000020000000000000022000000040006A +:10C45000000000002000000020000000200040003C +:10C460000000200000000000000020000400200068 +:10C47000000000002000000000000000000000009C +:10C4800000000000000000020000000000000000AA +:10C49000000010000000400000000000000000004C +:10C4A000000000000040000000000000000000004C :10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000401C -:10C4E000000000000000000010000000000000003C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000001000000000000000001B -:10C5100000000000000000400000000000000000DB -:10C52000000000000000000000000000000000000B -:10C5300000000000000002000000000000000000F9 -:10C5400000000000000000000000000000000000EB -:10C55000000000000000000000400000000000009B +:10C4C0000000000010020000000000000000000258 +:10C4D00000000000009000000000000000000004C8 +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000002003A +:10C50000000000000000000000000000000000002B +:10C510000000000000000200020000000000000017 +:10C520000000000000000200000000000000000009 +:10C530000000820000000200000000000000000077 +:10C5400000000000000000000000000002000000E9 +:10C5500000000000000000000200000000000000D9 :10C5600000000000000000000000000000000000CB :10C5700000000000000000000200000000000000B9 :10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B +:10C59000000000000400000000080000000000008F +:10C5A0000000000000000000000000080000000083 +:10C5B0000000000000000000000200000000000079 +:10C5C0000000000000000000000000000008000063 :10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B +:10C5E000000000000000000000000000001000003B :10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A +:10C600000000000000000000000000000008000022 :10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA +:10C620000000000000000000000000000400040002 +:10C630000000000000008800000040000000000032 +:10C6400004000000000000000400840090000000CE +:10C65000000040008400000000000000A000000076 :10C6600000000000000000000000000000000000CA -:10C6700004000400000000000000000000000000B2 +:10C6700000000000040000000000000000000000B6 :10C6800000000000000000000000000000000000AA :10C69000000000000000000000000000000000009A :10C6A000000000000000000000000000000000008A :10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A +:10C6C0000000002004000000000000000000000046 +:10C6D000040000040000000000000000000004004E :10C6E000000000000000000000000000000000004A -:10C6F000000000000000002000000000000000001A -:10C700000000000000000000000000000000000029 +:10C6F000000000000000000000000000000000003A +:10C700000000000000000020000000000000000009 :10C710000000000000000000000000000000000019 :10C720000000000000000000000000000000000009 :10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 +:10C7400000000000004000000000000000000000A9 :10C7500000000000000000000000000000000000D9 :10C7600000000000000000000000000000000000C9 :10C7700000000000000000000000000000000000B9 @@ -134315,17 +134315,17 @@ :10C890000000000000000000000000000000000098 :10C8A0000000000000000000000000000000000088 :10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 +:10C8C00000000000002000000088000000000000C0 +:10C8D0000000000000000000000000000400000450 +:10C8E0000000000000200000000000000000000028 :10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 +:10C900000000000000000000002100000000000006 :10C910000000000000000000000000000000000017 :10C920000000000000000000000000000000000007 :10C9300000000000000000000000000000000000F7 :10C9400000000000000000000000000000000000E7 :10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 +:10C9600008000000000000000000000000000000BF :10C9700000000000000000000000000000000000B7 :10C9800000000000000000000000000000000000A7 :10C990000000000000000000000000000000000097 @@ -134433,63 +134433,63 @@ :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 :10D010000000000000000000000000000000000010 -:10D020000000000000000000000020000000880058 -:10D030000000200000000000200020000000000090 -:10D040002000000000000000000020000000200080 -:10D0500000002000880000002000200000000000E8 -:10D06000200000000000000000000004200000007C -:10D070002000000020002000000020002000000010 -:10D080000000200000000000000000002000000060 -:10D0900020000000200020000000200020000000F0 -:10D0A0000000200000000000000000000000000060 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 +:10D0200000000000000000000000200000000000E0 +:10D030000000200020002000200020000000000050 +:10D0400000040004000000000000200000000000B8 +:10D05000000420002000200020002000000000002C +:10D06000000000000001000000000000200000009F +:10D0700000000000200020002000400020044000AC +:10D0800000000004000000000000400088040000D0 +:10D0900000000000200020002000400020040000CC +:10D0A00000000004880400000000000000004000B0 +:10D0B00000000000000040400002000200020000EA +:10D0C000000000000000000000020000000000005E +:10D0D000000000000000000000000000000000024E :10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF +:10D0F0000000000000001000000000000000000020 +:10D10000000000000000000200000000000000001D +:10D1100000004000000200000000000000000000CD +:10D12000000000000000000085000000000000007A +:10D1300000000000000000000000000002000000ED +:10D1400000000000000000100000080000000010B7 :10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F +:10D16000000000000000004000000000004000003F +:10D1700002000000000000000000000000000000AD +:10D18000000000000200004000000000000000005D +:10D19000000000000000000000000000000000107F +:10D1A0000008000000000000000220000000000055 :10D1B000000000000000000000000000000000006F :10D1C000000000000000000000000000000000005F :10D1D000000000000000000000000000000000004F :10D1E000000000000000000000000000000000003F :10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE +:10D2000020000000000000000000000000000000FE +:10D210000000000000000000000000080000000006 +:10D2200000000000000000000000000100000000FD :10D2300000000000000000000000000000000000EE :10D2400000000000000000000000000000000000DE :10D2500000000000000000000000000000000000CE :10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E +:10D27000000040000000000000000000000000006E +:10D280000000000000008800000004000000000012 :10D29000000000000000000000000000000000008E :10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E :10D2C000000000000000000000000000000000005E :10D2D000000000000000000000000000000000004E :10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E +:10D2F00000000000400000000000000000001100DD :10D30000000000000000000000000000000000001D :10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000000000000FD +:10D3200000000000000000000000410000000000BC :10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD -:10D35000C00000000000000000000000000000000D +:10D3500000000000000000000000000000000000CD :10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D +:10D37000000000000000000000000000004000006D +:10D38000000000000000000010400000000000004D +:10D39000004000000000000000000000000000004D +:10D3A000A000000000000000000008000000C00015 :10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D :10D3D000000000000000000000000000000000004D @@ -134499,19 +134499,19 @@ :10D41000000000000000000000000000000000000C :10D4200000000000000000000000000000000000FC :10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000800D4 +:10D4400000000000000000000000000000000000DC :10D4500000000000000000000000000000000000CC :10D4600000000000000000000000000000000000BC :10D4700000000000000000000000000000000000AC :10D48000000000000000000000000000000000009C :10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C +:10D4A0000000000000000000000008001000000064 :10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C :10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B +:10D4E00000000000000000000000000000004000FC +:10D4F000000000000000000000000020000000000C +:10D500000000000000000008000000000000000013 :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB @@ -134521,7 +134521,7 @@ :10D5700000000000000000000000000000000000AB :10D58000000000000000000000000000000000009B :10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B +:10D5A0000800000000000000000000000000000073 :10D5B000000000000000000000000000000000006B :10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B @@ -134538,7 +134538,7 @@ :10D68000000000000000000000000000000000009A :10D69000000000000000000000000000000000008A :10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000000000006A +:10D6B0000000000000000000010002000000000067 :10D6C000000000000000000000000000000000005A :10D6D000000000000000000000000000000000004A :10D6E000000000000000000000000000000000003A @@ -134546,16 +134546,16 @@ :10D700000000000000000000000000000000000019 :10D710000000000000000000000000000000000009 :10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000000000D9 +:10D730000000000000000000000010008000000059 +:10D740000040000000000000000000000000000099 :10D7500000000000000000000000000000000000C9 :10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 :10D780000000000000000000000000000000000099 :10D790000000000000000000000000000000000089 :10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 +:10D7B000000000000000000000000200090000005E +:10D7C0001000000000000000000000000000000049 :10D7D0000000000000000000000000000000000049 :10D7E0000000000000000000000000000000000039 :10D7F0000000000000000000000000000000000029 @@ -134563,7 +134563,7 @@ :10D810000000000000000000000000000000000008 :10D8200000000000000000000000000000000000F8 :10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 +:10D8400000000100000000000000000000000000D7 :10D8500000000000000000000000000000000000C8 :10D8600000000000000000000000000000000000B8 :10D8700000000000000000000000000000000000A8 @@ -134571,7 +134571,7 @@ :10D890000000000000000000000000000000000088 :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 +:10D8C0000000000100000000000000000000000057 :10D8D0000000000000000000000000000000000048 :10D8E0000000000000000000000000000000000038 :10D8F0000000000000000000000000000000000028 @@ -134579,7 +134579,7 @@ :10D910000000000000000000000000000000000007 :10D9200000000000000000000000000000000000F7 :10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 +:10D940000003002000210020000200000000000071 :10D9500000000000000000000000000000000000C7 :10D9600000000000000000000000000000000000B7 :10D9700000000000000000000000000000000000A7 @@ -134587,7 +134587,7 @@ :10D990000000000000000000000000000000000087 :10D9A0000000000000000000000000000000000077 :10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 +:10D9C000000000000000000000080001000000004E :10D9D0000000000000000000000000000000000047 :10D9E0000000000000000000000000000000000037 :10D9F0000000000000000000000000000000000027 @@ -134595,7 +134595,7 @@ :10DA10000000000000000000000000000000000006 :10DA200000000000000000000000000000000000F6 :10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 +:10DA4000000000000010000000000001810000E064 :10DA500000000000000000000000000000000000C6 :10DA600000000000000000000000000000000000B6 :10DA700000000000000000000000000000000000A6 @@ -134636,7 +134636,7 @@ :10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 :10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 +:10DCD00000000000000000610006800D0000000050 :10DCE0000000000000000000000000000000000034 :10DCF0000000000000000000000000000000000024 :10DD00000000000000000000000000000000000013 @@ -134644,7 +134644,7 @@ :10DD200000000000000000000000000000000000F3 :10DD300000000000000000000000000000000000E3 :10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000000000000C3 +:10DD500000610006000D000000000000000000004F :10DD600000000000000000000000000000000000B3 :10DD700000000000000000000000000000000000A3 :10DD80000000000000000000000000000000000093 @@ -134652,7 +134652,7 @@ :10DDA0000000000000000000000000000000000073 :10DDB0000000000000000000000000000000000063 :10DDC0000000000000000000000000000000000053 -:10DDD0000000000000000000000000000000000043 +:10DDD000000000000000010083820000000000003D :10DDE0000000000000000000000000000000000033 :10DDF0000000000000000000000000000000000023 :10DE00000000000000000000000000000000000012 @@ -134660,7 +134660,7 @@ :10DE200000000000000000000000000000000000F2 :10DE300000000000000000000000000000000000E2 :10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 +:10DE500000000000000000007978FBFA00000000DC :10DE600000000000000000000000000000000000B2 :10DE700000000000000000000000000000000000A2 :10DE80000000000000000000000000000000000092 @@ -134668,7 +134668,7 @@ :10DEA0000000000000000000000000000000000072 :10DEB0000000000000000000000000000000000062 :10DEC0000000000000000000000000000000000052 -:10DED0000000000000000000000000000000000042 +:10DED0000000000000000000000014141C1C0000E2 :10DEE0000000000000000000000000000000000032 :10DEF0000000000000000000000000000000000022 :10DF00000000000000000000000000000000000011 @@ -134676,46 +134676,46 @@ :10DF200000000000000000000000000000000000F1 :10DF300000000000000000000000000000000000E1 :10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000000000000C1 -:10DF60000000000020000000200020002000200011 -:10DF700000002000200020000000200020002000E1 -:10DF800000000000200000002000200020002000F1 -:10DF900000002000200020000000200020002000C1 -:10DFA00000000000000020000000200020002000F1 -:10DFB00020000000200020002000000020002000A1 -:10DFC00020000000000020000000200020002000B1 -:10DFD0002000000020002000200000002000200081 -:10DFE0002000000000000000000000000000000011 +:10DF50000000000000000000000000003C3C1C1C11 +:10DF60000000000020002000200000002000200011 +:10DF70000000000020002000200000002000200001 +:10DF800000000000200020002000000020002000F1 +:10DF900000000000200020002000000020002000E1 +:10DFA00000000000000020002000200000002000F1 +:10DFB000200000024000200020022000000040005D +:10DFC00020000000000020002000000000002000D1 +:10DFD00020000000200020002008000000000000B9 +:10DFE000200000000000000200000000000000000F :10DFF00000004000000000000000000000000000E1 -:10E000000000000000000000000000000000000010 -:10E010000000000000000000000000000000000000 -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000040000000A0 -:10E0400000000000000000000000000000000002CE -:10E0500000020002000000020000000200000000B8 -:10E0600000000000000000000000000000000000B0 -:10E070000000084000000000000000000000000058 -:10E080000000004000000000000000000000000050 -:10E090000000000800000000000000000200000076 -:10E0A0000000004000000000000000000020000010 -:10E0B0000000000000400000000000000000000020 -:10E0C0000000000000400000000000000000000010 +:10E0000000004000000000001000000000000000C0 +:10E0100000000002000000000000000000040000FA +:10E020000000000000000000000000904090009000 +:10E0300000900000000000400000000040000000D0 +:10E04000004000000002000000000000000000008E +:10E0500000000002000200020002000000000000B8 +:10E06000000000000200020000008200000000002A +:10E070000000000000000000000000400000000060 +:10E08000000000000000000000000000000004008C +:10E09000000000000000000002000000000002007C +:10E0A000000002000000000002000000000000006C +:10E0B000020000000000000000000000000000005E +:10E0C000020000000000000000000200000000004C :10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 -:10E0F0000000000000000000000000000008000810 -:10E10000000000000004000000000000000000000B -:10E1100000000000000000000000000000080002F5 -:10E1200000000000000000000000000000000001EE -:10E1300000000000000000100000000000000008C7 -:10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000008B7 -:10E1600000000008000000000000000000000000A7 +:10E0E00000000000004000080008000002000000DE +:10E0F0000200000000080200000000000000000014 +:10E1000000000000004000040008000000000000C3 +:10E1100000000000000800000000000000000000F7 +:10E1200000000000000000000000000802000000E5 +:10E1300000000000000000080000020000000000D5 +:10E1400000000000000000000000000800000000C7 +:10E1500000000000000000080000000000000000B7 +:10E16000000000000000000010000000000000009F :10E17000000000000000000000000000000000009F :10E18000000000000000000000000000000000008F :10E19000000000000000000000000000000000007F -:10E1A000000000000000000000000000000000006F -:10E1B000000000000000000000000000000000035C -:10E1C000000000000000000000000000000000004F +:10E1A000000000000000200000000000000000004F +:10E1B000000000000000000000000000000010004F +:10E1C000000040000000000004000000000000000B :10E1D000000000000000000000000000000000003F :10E1E000000000000000000000000000000000002F :10E1F000000000000000000000000000000000001F @@ -134724,22 +134724,22 @@ :10E2200000000000000000000000000000000000EE :10E2300000000000000000000000000000000000DE :10E2400000000000000000000000000000000000CE -:10E2500000000000000000000000000000000000BE -:10E2600000000000000000000000000000000000AE +:10E2500000000000000000000000000000000800B6 +:10E26000000040000000000000000000000000006E :10E27000000000000000000000000000000000009E :10E28000000000000000000000000000000000008E :10E29000000000000000000000000000000000007E :10E2A000000000000000000000000000000000006E :10E2B000000000000000000000000000000000005E :10E2C000000000000000000000000000000000004E -:10E2D000000000000000000000000000000000003E -:10E2E000000000000000000000000000000000002E +:10E2D0000000000000000800000000000000000036 +:10E2E0000000000000000000000008000000000026 :10E2F000000000000000000000000000000000001E :10E30000000000000000000000000000000000000D :10E3100000000000000000000000000000000000FD -:10E3200000000000000000000000000000000000ED +:10E3200000000000000000000000000010000000DD :10E3300000000000000000000000000000000000DD -:10E3400000000000000000000000000000000000CD +:10E340000000000000000000004000000800000085 :10E3500000000000000000000000000000000000BD :10E3600000000000000000000000000000000000AD :10E37000000000000000000000000000000000009D @@ -134747,18 +134747,18 @@ :10E39000000000000000000000000000000000007D :10E3A000000000000000000000000000000000006D :10E3B000000000000000000000000000000000005D -:10E3C0000000000000000000000000000008000045 +:10E3C000000000000000000000000000000000004D :10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000001D +:10E3E00000000000000000000000820000000000AB +:10E3F000000000000000000011000000000000000C :10E40000000000000000000000000000000000000C :10E4100000000000000000000000000000000000FC :10E4200000000000000000000000000000000000EC :10E4300000000000000000000000000000000000DC -:10E4400000000000000000000000000000000000CC -:10E4500000000000000000000000000000000000BC -:10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C +:10E4400000000004000000000000000000000000C8 +:10E4500000001000000000000000000000000000AC +:10E46000000000000000000000000000080800009C +:10E470000800000000000000000000000000000094 :10E48000000000000000000000000000000000008C :10E49000000000000000000000000000000000007C :10E4A000000000000000000000000000000000006C @@ -134766,12 +134766,12 @@ :10E4C000000000000000000000000000000000004C :10E4D000000000000000000000000000000000003C :10E4E000000000000000000000000000000000002C -:10E4F0000000000000000000000000000500000017 +:10E4F000000000000000000000000000000000001C :10E50000000000000000000000000000000000000B :10E5100000000000000000000000000000000000FB :10E5200000000000000000000000000000000000EB -:10E5300000000000000000020000000000000000D9 -:10E5400000000000000000000000000000000000CB +:10E5300000000000000000000000000400000000D7 +:10E5400000000000000005000000000000000000C6 :10E5500000000000000000000000000000000000BB :10E5600000000000000000000000000000000000AB :10E57000000000000000000000000000000000009B @@ -134803,7 +134803,7 @@ :10E7100000000000000000000000000000000000F9 :10E7200000000000000000000000000000000000E9 :10E7300000000000000000000000000000000000D9 -:10E7400000000000000000020000000000000000C7 +:10E7400000000000000000000000000000000000C9 :10E7500000000000000000000000000000000000B9 :10E7600000000000000000000000000000000000A9 :10E770000000000000000000000000000000000099 @@ -134843,7 +134843,7 @@ :10E990000000000000000000000000000000000077 :10E9A0000000000000000000000000000000000067 :10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000000000000210026 +:10E9C0000000000000000000000000000000000047 :10E9D0000000000000000000000000000000000037 :10E9E0000000000000000000000000000000000027 :10E9F0000000000000000000000000000000000017 @@ -134892,7 +134892,7 @@ :10ECA0000000000000000000000000000000000064 :10ECB0000000000000000000000000000000000054 :10ECC0000000000000000000000000000000000044 -:10ECD00000000000000000000000000000A0000094 +:10ECD0000000000000000000000000000000000034 :10ECE0000000000000000000000000000000000024 :10ECF0000000000000000000000000000000000014 :10ED00000000000000000000000000000000000003 @@ -134929,80 +134929,80 @@ :10EEF0000000000000000000000000000000000012 :10EF00000000000000000000000000000000000001 :10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000000200000000000C1 -:10EF30000000200000000000000000002000000091 -:10EF400000000000000000000000200000000000A1 -:10EF50000000200000000000000000002000000071 -:10EF60000000000000000000000000002000000081 -:10EF7000000000002004000000000000000020004D -:10EF80000000000000000000000000002000000061 -:10EF90000000000020000000000000000000200031 -:10EFA000000000000000000000020000000000005F -:10EFB0000000000000000000000000000000000051 +:10EF200020040000200020002000200088000200B3 +:10EF30002000200020000000000020002000000031 +:10EF40002000000020000000200020040004000039 +:10EF5000100020002000000000000004000000025B +:10EF6000000020000100218000002000200000009F +:10EF70000000000020002000000000000000000051 +:10EF80000000200084002004000020002004000075 +:10EF9000000000002000200400000000000000002D +:10EFA00040024000000200000000000000000000DD +:10EFB00000000000009000020000000000000000BF :10EFC0000000000000000000000000000000000041 -:10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000200000000EE -:10F020000000000000000000008000000000000060 -:10F0300000000000000000000000000000000000D0 -:10F0400010000000000000000000000000000000B0 -:10F0500000000000000000000000000000000000B0 -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F090000000000000000000000000000000000070 -:10F0A000000000000900000000000010000000083F -:10F0B0000008000000000008000800080000000828 -:10F0C0000000000000000000000000000000000838 -:10F0D00000080000000000080008000800004008C8 -:10F0E0000000000800000000000000000000000018 -:10F0F0000008000800000000000800840004000070 -:10F1000000080000000800000000000000000000EF -:10F1100000040008000000000002000000000000E1 -:10F120000082000000080000000000000002000053 +:10EFD00000020000000000A000000020002000004F +:10EFE000000000A000004082400241000000000438 +:10EFF00000000000000009000000000041000000C7 +:10F0000000000000004004000900000000000000B3 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000400000000000000DC +:10F0300008000000000000000800000000000000C0 +:10F0400000000000000000000000000000000000C0 +:10F050000800000008400000000000000000000060 +:10F06000000000000000411008020800000000003D +:10F07000001000000000000000000000000002007E +:10F080000000000000000000080008000000000070 +:10F090000000080000000000000000000000000068 +:10F0A0000000080000080000000000000000000848 +:10F0B0000000000004000000000800000000000044 +:10F0C0000000000000080000000800000000000828 +:10F0D00000000000000000000084000000000000AC +:10F0E0000000000000000008840180838000000010 +:10F0F00000080000000000002000000000000000E8 +:10F1000000000000000000080000000000000000F7 +:10F1100000080000000000000000000000080000DF +:10F120000000000000000040000000080000000097 :10F1300000000000000000000000000000000000CF :10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF -:10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000300007C +:10F15000000000000000000000000000000090001F +:10F16000000000000000000000000000088901000D +:10F170000000000000000000000000000000000887 +:10F18000000000000000000000000000000000007F :10F19000000000000000000000000000000000006F -:10F1A000000000000000000000000000000000015E +:10F1A000000000000000000000000000000000005F :10F1B000000000000000000000000000000000004F :10F1C000000000000000000000000000000000003F :10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F +:10F1E000000000000000000000000000000080029D +:10F1F00040000000000000000000000000000000CF :10F2000000000000000000000000000000000000FE :10F2100000000000000000000000000000000000EE :10F2200000000000000000000000000000000000DE :10F2300000000000000000000000000000000000CE :10F2400000000000000000000000000000000000BE -:10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E +:10F25000000008000000000008000800080000008E +:10F26000000000000000000000000000000082001C +:10F270000800848000000000000000000000000082 +:10F2800000008200000000000000000000000000FC :10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000041001D +:10F2A000000000000000000000000000000000005E :10F2B000000021000000000000000000000000002D :10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E :10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F3000000000000000000000000000000000000FD -:10F3100000000000000000000000000000000000ED +:10F2F0004100C1004104000000000000000000C007 +:10F3000000000000000000000000000000040000F9 +:10F3100000000000000800000000000000000000E5 :10F3200000000000000000000000000000000000DD -:10F33000000000000040000000000000000000008D +:10F3300000000000000000000000000000000000CD :10F3400000000000000000000000000000000000BD :10F3500000000000000000000000000000000000AD -:10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D +:10F36000000000000000820000000800080000000B +:10F37000000000000020000000110002000000005A :10F38000000000000000000000000000000000007D -:10F390000000000000000000000000080000000065 +:10F39000000000000000000000000000000000006D :10F3A000000000000000000000000000000000005D -:10F3B000000000000000000000000000000000004D +:10F3B000000000000000002000000000000000002D :10F3C000000000000000000000000000000000003D :10F3D000000000000000000000000000000000002D :10F3E000000000000000000000000000000000001D @@ -135010,84 +135010,84 @@ :10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC :10F4200000000000000000000000000000000000DC -:10F4300000000000000000000010000000000000BC +:10F4300000000000000000000000000000000000CC :10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000000007C +:10F46000000000000000000000008200000010000A +:10F470008200000001800180008041000000000443 +:10F480000009000000000000000000000000000073 :10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C -:10F4B000000000000000000000000001000000004B +:10F4B000000000000000000000000000000000004C :10F4C000000000000000000000000000000000003C :10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB +:10F4F000000000000000200420040004A000000020 +:10F5000000000500210000000300030020000000AF :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB -:10F5300000000000000000000000020000000000C9 +:10F5300000000000000000000000000000000000CB :10F5400000000000000000000000000000000000BB :10F5500000000000000000000000000000000000AB :10F56000000000000000000000000000000000009B -:10F57000000000000000000000000000000000008B +:10F570000000000000000000010401404103881069 :10F58000000000000000000000000000000000007B :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B -:10F5B00000000000000000000000030080000000C8 +:10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B :10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B -:10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA +:10F5F000000000000000100000001190101088852D +:10F6000000020000000000000000000000000000F8 :10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA :10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA :10F6500000000000000000000000000000000000AA :10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A +:10F670000000000000000000000000000091008970 +:10F680008091212000000000000000000000000028 :10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A -:10F6B000000000000000000000000000400000000A -:10F6C000A00090000000000000000000000000000A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A :10F6D000000000000000000000000000000000002A :10F6E000000000000000000000000000000000001A -:10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 +:10F6F0000000000000000000000000000000408842 +:10F700004084A0A083200000000000000000000052 :10F7100000000000000000000000000000000000E9 :10F7200000000000000000000000000000000000D9 :10F7300000000000000000000000000000000000C9 -:10F7400000000001000000000000000000000000B8 +:10F7400000000000000000000000000000000000B9 :10F7500000000000000000000000000000000000A9 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 -:10F780000000000000000000000000000000000079 +:10F7800002890800050800090000000000000000D0 :10F790000000000000000000000000000000000069 :10F7A0000000000000000000000000000000000059 :10F7B0000000000000000000000000000000000049 -:10F7C00000400005002000050000000000000000CF +:10F7C0000000000000000000000000000000000039 :10F7D0000000000000000000000000000000000029 :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 +:10F80000000080104120A1A01011000000000000A5 :10F8100000000000000000000000000000000000E8 :10F8200000000000000000000000000000000000D8 :10F8300000000000000000000000000000000000C8 -:10F8400000000003008000800000000000000000B5 +:10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 :10F870000000000000000000000000000000000088 -:10F880000000000000000000000000000000000078 +:10F880000000000021059088110085200000000084 :10F890000000000000000000000000000000000068 :10F8A0000000000000000000000000000000000058 :10F8B0000000000000000000000000000000000048 -:10F8C00000000000000000020040000000000000F6 +:10F8C0000000000000000000000000000000000038 :10F8D0000000000000000000000000000000000028 :10F8E0000000000000000000000000000000000018 :10F8F0000000000000000000000000000000000008 -:10F9000000000000000000000000000000000000F7 +:10F9000000000000000009000321C0108200000078 :10F9100000000000000000000000000000000000E7 :10F9200000000000000000000000000000000000D7 :10F9300000000000000000000000000000000000C7 @@ -135095,7 +135095,7 @@ :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 -:10F980000000000000000000000000000000000077 +:10F980000000000000000000000000E00700000090 :10F990000000000000000000000000000000000067 :10F9A0000000000000000000000000000000000057 :10F9B0000000000000000000000000000000000047 @@ -135103,15 +135103,15 @@ :10F9D0000000000000000000000000000000000027 :10F9E0000000000000000000000000000000000017 :10F9F0000000000000000000000000000000000007 -:10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 +:10FA000000000000000000000000F5F5003C0000D0 +:10FA1000003C0000000000000000000000000000AA :10FA200000000000000000000000000000000000D6 :10FA300000000000000000000000000000000000C6 :10FA400000000000000000000000000000000000B6 :10FA500000000000000000000000000000000000A6 :10FA60000000000000000000000000000000000096 :10FA70000000000000000000000000000000000086 -:10FA80000000000000000000000000000000000076 +:10FA8000000000000000000000000000F0F0003C5A :10FA90000000000000000000000000000000000066 :10FAA0000000000000000000000000000000000056 :10FAB0000000000000000000000000000000000046 @@ -135119,40 +135119,40 @@ :10FAD0000000000000000000000000000000000026 :10FAE0000000000000000000000000000000000016 :10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 +:10FB000000000000000000000000000000000C03E6 +:10FB100003C300000000000000000000000000001F :10FB200000000000000000000000000000000000D5 :10FB300000000000000000000000000000000000C5 :10FB400000000000000000000000000000000000B5 -:10FB50000000000000820000000000000000000023 +:10FB500000000000000000000000000000000000A5 :10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 -:10FB90000000000000000000000000000000000065 +:10FB9000000300C38200C20000000000000000005B :10FBA0000000000000000000000000000000000055 :10FBB0000000000000000000000000000000000045 :10FBC0000000000000000000000000000000000035 -:10FBD00000610006000D00000000000000000000B1 +:10FBD0000000000000000000000000000000000025 :10FBE0000000000000000000000000000000000015 :10FBF0000000000000000000000000000000000005 :10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 +:10FC1000000000610E07001D000000000000000051 :10FC200000000000000000000000000000000000D4 :10FC300000000000000000000000000000000000C4 :10FC400000000000000000000000000000000000B4 -:10FC5000000000000000000000080000000000009C +:10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 :10FC70000000000000000000000000000000000084 :10FC80000000000000000000000000000000000074 -:10FC90000000000000000000000000000000000064 +:10FC9000000000000000020A000000000000000058 :10FCA0000000000000000000000000000000000054 :10FCB0000000000000000000000000000000000044 :10FCC0000000000000000000000000000000000034 -:10FCD00000000000000000004000400000000000A4 +:10FCD0000000000000000000000000000000000024 :10FCE0000000000000000000000000000000000014 :10FCF0000000000000000000000000000000000004 :10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 +:10FD1000000000000000000082AA010000000000B6 :10FD200000000000000000000000000000000000D3 :10FD300000000000000000000000000000000000C3 :10FD400000000000000000000000000000000000B3 @@ -135160,7 +135160,7 @@ :10FD60000000000000000000000000000000000093 :10FD70000000000000000000000000000000000083 :10FD80000000000000000000000000000000000073 -:10FD90000000000000000000000000000000000063 +:10FD900000000000000000000000A0F00000AAAA7F :10FDA0000000000000000000000000000000000053 :10FDB0000000000000000000000000000000000043 :10FDC0000000000000000000000000000000000033 @@ -135168,196 +135168,196 @@ :10FDE0000000000000000000000000000000000013 :10FDF0000000000000000000000000000000000003 :10FE000000000000000000000000000000000000F2 -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000000000000D2 +:10FE10000000000000000000000000002030000092 +:10FE2000AAAA00000000000000000000000000007E :10FE300000000000000000000000000000000000C2 :10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 -:10FE600000002000840000000000000000004000AE -:10FE70002000000040000000200040004000000082 -:10FE800000000000200000000004400000002000EE -:10FE900020000000200000002000000020002000C2 -:10FEA00000000000000000000000400020000000F2 -:10FEB0002000200000002000000020002000200082 -:10FEC0000000000000000000000000002000000012 -:10FED00020000000000000000000880040400000FA -:10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 -:10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000000000000000E1 -:10FF20000000000000004000000000000000000091 -:10FF300000000000000000000000000000000000C1 -:10FF4000000000000000000000000000008400909D -:10FF500000900000000200002000000020000000CF -:10FF600000001000000000000000000008880000F1 -:10FF70000008000000000000000000000800000071 -:10FF80000000000000000000000000000805000064 -:10FF9000000000000010000000000000021000003F -:10FFA0000000000000000000000000000000080049 -:10FFB0000000000000000000000000000000000041 -:10FFC0000000000000000000000000080000000029 -:10FFD0000000000000000000000000040000020417 -:10FFE00000000000000000000000008400820520E6 -:10FFF00000000000000000080008000800080008D9 +:10FE50000000000000000000000000002000200062 +:10FE600020000000000020008400000000002000AE +:10FE7000200088000000200000000000200020007A +:10FE80002000000000002000000000110000200001 +:10FE9000200000000000200000800002008001809F +:10FEA00021002000018000A02080018000000000CF +:10FEB00020002000000000002000100000000000D2 +:10FEC00020002000000000002000000000000000D2 +:10FED0002000200000000000200020004000000062 +:10FEE00000000000000000000000000040020000D0 +:10FEF00000000000000000400000000000000000C2 +:10FF000000000000000000000000209000900000B1 +:10FF1000000000004000000000000002000000029D +:10FF200008100400000008400041054008020000DD +:10FF3000009000000004000000000090000000009D +:10FF400000000000000000000000000000000000B1 +:10FF50000000009000000000000000000000000011 +:10FF6000000000000210040004000400040000006F +:10FF70000000000004000000040000000200040073 +:10FF8000000000000000000000000000020000006F +:10FF90000000000000000800020000000202000053 +:10FFA00000000000080040009100200008802000B0 +:10FFB0000000040004000000000000000000020037 +:10FFC0000000040000000000000000000000000825 +:10FFD000000000000004000000000000000002001B +:10FFE00000000008000000000000000800080008F1 +:10FFF00000000000000000000000000000080000F9 :020000040021D9 -:100000000000000040080000000800080000400850 -:1000100000000008000000080004000400080004BC -:1000200000000000000400840008008400080000B4 -:100030000008000000080008000800000008000890 -:100040000008000000080000000800040084000808 -:1000500000840000000800080008000800080008EC -:10006000000800050000000000000000000800007B -:100070000000000000000000000000000040000040 -:10008000000000000021000000000000000000004F -:10009000000000000021000000000000000000003F -:1000A0000008000000000008000000000000000040 -:1000B000000000000000000000030000000300003A -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000002000 -:1000E00000000021000000000000000000000000EF +:1000000000000008000000000000000800080008D0 +:100010000000000000000000800000000008000157 +:100020000000000000088000800020008008804060 +:1000300080080000820000000000000000000008AE +:1000400000000000000800000000000000080000A0 +:100050000010000000000000000000000008000880 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A000010000000100000000800080200020000E +:1000B00020002000040000000000000040000000BC +:1000C0000000000000000000000000080000000028 +:1000D000000000000000000000000400000000001C +:1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF +:10011000000000000000000000000000000040009F +:1001200011004000000040000000112000408082CB +:10013000800080888004000011840000000000001E :1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:10017000000000000000000000210000000000005E +:100160000000000000000000000000000000080087 +:10017000000000000000000000000000000000007F :10018000000000000000000000000000000000006F -:10019000000000000000000000050008C000000092 -:1001A000000000000000000000000000000000004F -:1001B0000008000000000000000000000000000037 +:100190000000000000000000000000000000090056 +:1001A0000000840000000000080000100020000093 +:1001B00000000000008400000000000000000000BB :1001C000000000000000000000000000000000002F -:1001D000000000000000080000000000000008000F -:1001E00000000000000010000000000000000000FF +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000004000B :1001F00000000000000000000000000000000000FF -:100200000000000000820000000000000000000864 +:1002000000000000000000000200000000000000EC :1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000080000000000000000B6 +:100220000800000000000000000080000001000144 +:1002300000000082000000410000000021000000DA :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E -:10026000000000000000000000000000000084000A +:10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E -:100280000000000000000000000000000008000066 -:100290000000080000000000000000000000000056 -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C00000000000000000400000000000000000EE -:1002D00000000040000000000000000000000000DE +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A0000000000088004000000000000082010201 +:1002B0000800200000000000A011A0000000A02005 +:1002C00000000041000000000000004100000000AC +:1002D000000000000000000000000000000000001E :1002E000000000000000000000000000000000000E -:1002F00021000000000000000000000000000000DD +:1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED -:1003100000000000000000000000000000000000DD -:1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD +:1003100000000000000000000000000000200000BD +:1003200000000000000000008000000000004110FC +:10033000080280900582020000000000000000001A :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D -:10037000000000080000000800000000000000006D +:10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D -:1003A0000000000000000000000800000000000045 -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D +:1003A000000000000000000000000000000000004D +:1003B0000010080004004009080040004000400010 +:1003C0000003000000000000000000080000000022 :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC :1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC -:1004300000000000000000000300000008000000B1 -:1004400000000000000000000000000800000000A4 -:10045000000000000000000800000008000000008C -:100460000008000000000000000000000000000084 -:1004700000A00000000000000000000000000000DC +:10043000000000010000800080008000000000003B +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B000000000010000000000000000000000003B -:1004C000000000000000000000000000000000002C +:1004A00000000000000000000000000000008800C4 +:1004B0000000000002A14002A02082A1910401825C +:1004C0000288108200900000000404040000000074 :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000000AB +:1005200000000000000000000000000000000800C3 +:1005300000000000000080A08890001080400900AA +:1005400003008000800000000000008000800000A8 :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B :1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B +:1005B00010411100110000000000001000090000AF +:1005C00080400021804080000000009000800000FA :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB -:1006000000000000000000080000000000000000E2 +:1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:1006400000000000000000000000000000000000AA +:10063000000001010088000000000000000100012E +:1006400000000800000040A0C0080000000300A057 :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A +:1006B0000000000000010001000000000808010126 +:1006C00001A120A100030489000982C1A08800A023 +:1006D00004A0020200000000000000000000000072 :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 +:10073000000000000009000800210009000000205E +:10074000104010400040009080080008A082050082 +:100750000000800080000000000000000000000099 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 +:1007B0000000000000000000800080000004000035 +:1007C00080000000000000008010002080800000F9 +:1007D0008000800000000000000000000000000019 :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 +:100830000000000000000000880010001000880088 +:100840000000C0009000C000C000C00190A0402087 +:1008500040004000020020002000000000000000D6 :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 -:10088000000000000000000000000006000006005C +:100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 +:1008C000410000000000000007000000000A02E0F4 +:1008D000070000000000000007000000000000000A :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 +:100930000000000000000000000000000000400077 +:100940000000000000000000300024000000000C47 +:10095000DFFFF0F040003CF600F60F0F0C00000047 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000000000000000017 +:1009C0000000000000000000000300000000000024 +:1009D000000CFFFF00004000F6F6F6F60F0F0000D7 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 @@ -135373,7 +135373,7 @@ :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 :100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 +:100AD00000000000000000200024006642420404E0 :100AE0000000000000000000000000000000000006 :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 @@ -135381,31 +135381,31 @@ :100B200000000000000000000000000000000000C5 :100B300000000000000000000000000000000000B5 :100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 +:100B500000100000000000000020000000009F9F27 :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 -:100B900000000000000000000020000000A0000095 +:100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 +:100BC00000000000000000610006000D00000000B1 +:100BD000A0614006000D0000A0650036009F2005C2 +:100BE00000000E00000000000000000000000000F7 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 +:100C50000000000000000000000000000000040090 :100C60000000000000000000000000000000000084 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 +:100CC000000000000000000000000000000000081C +:100CD0000000000000000000010000000000000013 :100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 @@ -135413,7 +135413,7 @@ :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 :100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 +:100D5000050000000000000000000000000000008E :100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 @@ -135421,228 +135421,228 @@ :100DA0000000000000000000000000000000000043 :100DB0000000000000000000000000000000000033 :100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 +:100DD000000005000000000000000002000000000C :100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E2000C0000400000004000400C0000000C02155 -:100E30008800000000000000C000C0000000C000EA -:100E400020000000000020000000C0000000200082 -:100E500000000000C0000000000220002000000090 -:100E6000200020008800000000000000200000009A -:100E700020000000000020000000200020000004EE -:100E800020042000200000000000000020000000DE -:100E90002000000000022000000000000000000010 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000020000000000000000000000002 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 +:100E10000000000000000000000000004000000092 +:100E2000000000000400840000200020008000007A +:100E3000000000000000880000000000200000000A +:100E40000000000000002000000000000000000082 +:100E50000000000000040004000300000080000007 +:100E600000000000000000840000000000000000FE +:100E7000000000000000000400000000040000006A +:100E80000000000000000000000000001000000052 +:100E9000000400000000000400000000000000004A +:100EA000000000000000000000000001000300201E +:100EB0000002000000000000000000000020000010 +:100EC0000000000000002000000000000000000002 +:100ED000000000840000000000000000000000048A +:100EE00000000000000000000004000000000000FE +:100EF00040000000000000020000000400000000AC +:100F000000000000000000000002000000000000DF +:100F100000000000000000000000000002000000CF +:100F200000000000000004000000000004000400B5 +:100F3000040004000000000000000000040008009D :100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000004000000000000000000000000000479 -:100F7000000000000000000400000000000000006D -:100F80000000000000000000000000000000000061 -:100F90000000000000000005000000000000000844 -:100FA0000000000800080008000800080008000011 -:100FB0000000008800080008000800080008000879 -:100FC00000000008000800080008000800080000F1 -:100FD00000080000000800080008000800080000E1 -:100FE00000080008000800080008000800080008C1 -:100FF00000090008000000080008000800080008B8 -:101000000082000800080008000800080008000826 -:10101000000800040000000800080008000800089C +:100F500000000000000000000010000000009000F1 +:100F60000000000002000200020002000304020070 +:100F7000050003000200020003000200020002005C +:100F8000020002000000000000000000000002005B +:100F90000200020002000008000000000000000043 +:100FA0000008000800080000000800000008800099 +:100FB000800880028008000000000008000800008F +:100FC00000400008000800000008000000080000C1 +:100FD00000080000000800840000008400080000F1 +:100FE0000000000000080008800080088000A009C0 +:100FF0008000020882008082800002008000800859 +:1010000080008000800800080000000800000084C4 +:101010008000808280008000000400000000000842 :1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 +:1010300000000000000004000000000000000000AC :1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 +:10105000000000000000000000000000010001008E +:101060000000000090004000000020C000830082CB :101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000900000000000000000000000047 -:1010A0000000000000000000000000000000000040 -:1010B00000000000000000400000000000000000F0 +:101080000000000500030000000000000005000053 +:1010900000000008002100000040000800080000D7 +:1010A000002100000000000000000000000000001F +:1010B00000000000000000008000000000000000B0 :1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 +:1010D000000000000000410000004000000020006F +:1010E000200000000000000008002100800400042F +:1010F00000040800110000000000000000000000D3 :1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000005000100B9 -:1011300001000000000000000000000000000000AE -:10114000000000000000000000000000000000009F -:101150000000000000000000000000000000A000EF -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000000000000000010000000000020000F -:1011B00020002000000000000000000000000000EF -:1011C0000000000000000000000800000000000017 -:1011D0000000000000000800000000000000000007 -:1011E00000000000000000000000000011000000EE -:1011F00000000000000000000000000000000000EF -:10120000008400900000000000A000840000008422 -:101210000090008400820000000000000000000038 -:10122000009000000000000000000000000000002E +:1011100000000000000000000000000100000000CE +:1011200000000000000000000000000000000000BF +:101130000000080000000000004000000000000067 +:101140000000080000000000000000000002000095 +:10115000000000000000000000100000000000007F +:101160000000000000004000000000000004020039 +:10117000000000000000000000030000000002006A +:1011800000020000000000000000000000400040DD +:10119000004000400040000000000000000000008F +:1011A000000000000000000000000000000000003F +:1011B0000000000000000000000000000000000827 +:1011C0000000000800000000000000000000000017 +:1011D000000000000000000000100000000000A05F +:1011E000000000A00000000000000000000000015E +:1011F000800000000000000000000000000000006F +:101200008008000000000000000000000000000155 +:101210000001000100010001008400000000000046 +:1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000413D -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000800083E +:10125000000000000000820000000000000000000C +:10126000008000800080008000000000000001007D +:1012700000000100030002020280000500000000DF +:101280000008000502000000000000040005004006 +:101290000008100210032000200000080040004059 :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E -:1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:1013300000000000000000000000010000000000AC -:10134000008000000000000000000000000000001D -:101350000000000000000000000000000000080085 -:10136000000000000000000000000003000000007A -:1013700000000000000000000000000000000080ED -:101380000000000000000000000000000000000855 -:101390000000000000110000001100000003000028 -:1013A0000021000000000000000000000000080014 -:1013B00000000800080000000000000020000000FD -:1013C00000080010000000000000000000C0000045 -:1013D0000000000000000000000000000000000805 -:1013E0000000000000840800000000000000000071 -:1013F00000000000000000001100002000000800B4 -:10140000000405000000000000000000000000844F -:1014100000000000000000000000000000000000CC +:1012E000000040040004000400040000210021006C +:1012F00020C000002000A000C020850403000020C2 +:10130000000021010000800000000000000100003A +:1013100000010001800080008000800000000001CA +:1013200000010000000000000000000000000000BC +:10133000000000000000080008000000000000009D +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:101360000000000020002000000008000000000035 +:101370000000000000000000000000002000000449 +:101380000004000800000008002102030200002100 +:1013900000040008000000210021000000000000FF +:1013A0000021000000000008000000000000000014 +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000080008000000000000000FD +:1013F000000000000000000000000000000080006D +:1014000000010001000100000000000080008000D9 +:1014100000000001000100000000000000000000CA :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C :10146000000000000000000000000000000000007C -:10147000000100000000000000000000000000006B -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B00000000000000000000000000000004000EC +:101470000000000000000000000000C000000008A4 +:10148000000001C102004000000100C0000000088F +:10149000000001C108004100000001C1020020015C +:1014A000000100C000000000000200000000000079 +:1014B000000000000000000000000000000000002C :1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000080000A3 -:101540000008000000000000000000000000000093 +:1014E00000000000000000000000000000000800F4 +:1014F000000000000000000020000000008000004C +:101500000880000009C182029103000300800000EE +:101510000080000009C189098511000511C1201052 +:101520009109000800800000000000800000000019 +:1015300000000000000000000000000000000000AB +:10154000000000000000008000000000000000001B :10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B +:101560000000000000000000000000000008000073 +:101570000002000000000000000000100000001049 +:10158000800000088000418082000289C141000083 +:10159000800000008000118089001182C1830280D8 +:1015A00010218200C1838009000300008000000038 :1015B000000000000000000000000000000000002B -:1015C000000000010000000000000000000000001A +:1015C00000000000000000000004000000200000F7 :1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB -:1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA +:1015E00000000000000000000000000000000001FA +:1015F00000000000000000000000000000010000EA +:10160000000010000001C000000288000091C1012C +:10161000000010000000C000000288000090C1110E +:10162000008800008400C189020100000000C000A1 :1016300000000000000000000000000000000000AA -:10164000000040000000000000000000000000005A +:101640000000000000000000000000000400000096 :10165000000000000000000000000000000000008A :10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A -:10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B000000000000000000000000000000000002A -:1016C00000000000000000002000000000000000FA +:101670000000200000000100000000001000000039 +:10168000000000002008000001C088000101008463 +:1016900001C100000008000000C0880000000085B3 +:1016A00001C140000090890001C10000000200005B +:1016B00000C000000000000000000000000000006A +:1016C000000000000000000000002000000080007A :1016D000000000000000000000000000000000000A :1016E00000000000000000000000000000000000FA -:1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 +:1016F00000000000000000000800000000000000E2 +:101700000000110000008080000003808002410979 +:10171000418911C100000080000000808009211172 +:10172000058311C180100282851109C1000000806B +:101730000000008000000000000000000000000029 :101740000000000000000000000000000000000099 :101750000000000000000000000000000000000089 :101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 +:101780000000000000008010001000000000C18276 +:101790000200410040098000800000000000C18973 +:1017A000110941004009C1102109030008118000FE :1017B0000000000000000000000000000000000029 :1017C0000000000000000000000000000000000019 :1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000600000000038 -:101850000000000000000000000000000000000088 +:1018000000000000000000000800000000000000D0 +:10181000C1C0000000000001C00010000000000076 +:10182000C108000100000001C10200010100010027 +:10183000C0000000000000000000000000000000E8 +:101840000000000000000000000000000000000098 +:101850000000000007000000000000000000000081 :101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000410000E00000000000000000000027 -:1018A0000000000000000000000000000000000038 +:101870000000000000000000000000E00000000088 +:101880000000000000E000000000000000E0000098 +:101890000000480000E000004212000000000000CC +:1018A0000000820000E000000000480000E00000AE :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 :1018D0000000000000000000000000000000000008 :1018E00000000000000000000000000000000000F8 :1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 +:101900000000000000000000000000000000FFFFD9 +:101910000000F0F00000AAAA000000FF000000FF95 +:101920000000F0F00000AAAA000000FF0000FFFF86 +:101930000000F0F00000FFFF0000F0F000000000E9 :101940000000000000000000000000000000000097 :101950000000000000000000000000000000000087 :101960000000000000000000000000000000000077 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 +:10199000FFFF0000F0F00000AAAA000000FF000016 +:1019A00000FF0000F0F00000AAAA000000FF000005 +:1019B00000000000F0F0000000000000F0F0000067 :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 :1019E00000000000000000000000000000000000F7 :1019F00000000000000000000000000000000000E7 :101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 +:101A10000F0F00000F0F0000FFFF00000F0F00006E +:101A20000F0F00000F0F0000FFFF00000F0F00005E +:101A3000FFFF0000FF0000003C3C0000C3C3FFFFAD :101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 :101A60000000000000000000000000000000000076 :101A70000000000000000000000000000000000066 :101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD000000000610007000D000000000000000091 -:101AE00000000000000000000000000000000000F6 +:101A900000000F0F00000F0F0000000000000F0FEC +:101AA00000000F0F00000F0F0000000000000F0FDC +:101AB000000000000000FF0000003C3C0000C3C329 +:101AC000FFFF000000000000000000000000000018 +:101AD0000000000000000000000005180A000500DA +:101AE00005A0000000000000000000000000000051 :101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B1000000000000000000000000000006100065E -:101B2000800D000000000000000000000000000028 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 +:101B0000000000610007000D0000000000610007F8 +:101B1000000D000040638007002D9202408280018A +:101B20008020920240828000002092024082800148 +:101B300080209202408280018020920240828000B8 +:101B400000208202000000000000000000000000F1 :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 :101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 :101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 +:101BA0000000C000820000000000000000000000F3 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 @@ -135650,8 +135650,8 @@ :101BF00000000000000000000000000000000000E5 :101C000000000000000000000000000000000000D4 :101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 +:101C20003000500000000000000000000000000034 +:101C30003000500000C0808041000300000C080804 :101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 @@ -135659,187 +135659,187 @@ :101C80000000000000000000000000000000000054 :101C90000000000000000000000000000000000044 :101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 +:101CB0000000000A0008000000000200820000008E :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 :101CF00000000000000000000000000000000000E4 :101D000000000000000000000000000000000000D3 :101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000002000800010000002000210037 -:101D600010004000020005004100080002002000B1 -:101D700010004000880020008800880020008802B1 -:101D80002000880020002000040020002000200007 -:101D9000200020020003200020002000200020401E -:101DA000200220002010200020042000200020001D -:101DB0002000200020002000200020002000200023 -:101DC0002004200020002000200020002004200506 -:101DD00020002000100080008000040000000000AF -:101DE0008800800080008900C000A0008000800082 -:101DF000800080008400200000000000000000003F -:101E00000000000000000000000000000000400290 -:101E100000000000090000000000000000000000B9 -:101E200000010001000000010000000000000000AF -:101E300000000000000000000000000000000000A2 -:101E40000000008400081090000000900000008452 -:101E50000000000000000000000000002100010060 -:101E60000000000000000040000000000000000032 -:101E70000000000000000000000000000000000062 -:101E80000000000000000010000000000000000042 -:101E9000020000000000200400004010040240087E -:101EA0000010000804080404004010102040100036 -:101EB0004000080802080404082000000000000098 -:101EC000000000000000000000000003000000000F -:101ED0000000000000000000200000080008880842 -:101EE000100800080008000800080084000800002E -:101EF00000080008000800080008000800080008A2 -:101F00000010000800080008000800000008000099 -:101F1000000800080008000880080000808580098B -:101F200080090001008480098009008580098009FA -:101F300080008008800980858009800900000008F1 -:101F40000008000800840008008200080084008463 -:101F500000080008000800080008800801000010C0 -:101F600000000000000001000000910000000000DF -:101F7000000000000000010000000110002100002E -:101F80000000000000000000000000000008000049 -:101F9000000000000000000000000000000000033E -:101FA00000000000000000000021000000030021EC -:101FB00000000000000000210010000000210008C7 -:101FC0000000004000400003001000050004000075 -:101FD000880090210000000500030000002110008F -:101FE00000000000030000000200000004000000E8 -:101FF000000000000000030040000000100000008E -:1020000000000000000000000800000000000000C8 -:1020100000000800000000000000000000000000B8 -:1020200000000000000000000000040000000000AC -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000800000000000088 -:102050000000000000000000000000000000000080 -:10206000200000000000A0001000000000000000A0 -:10207000200000000400A000000008000000200074 -:102080000000000000000000000000000000080048 -:10209000000000000000000000000000000004003C -:1020A00000000000000000800000000000000000B0 -:1020B00000000002000000400000000000000000DE -:1020C0000000000000000000000000000000000010 -:1020D00000000000000000000000000000001000F0 -:1020E00008008000000000000000800000000000E8 -:1020F0000000800000008000000000008000080058 -:10210000800000000000000000000000000000004F -:1021100000000000000000000000000000000000BF -:10212000000000000000000000400000000000006F -:102130000000000000010000000100000000000895 -:10214000000000000000000000A0000000000000EF -:102150000008000000000000000000000000000077 -:10216000000000008200000000000000820000006B -:1021700082000820000000000000000000020000B3 -:10218000000000400000000000000000000000000F +:101D20000000000028000A00000A000C000000006B +:101D30000000000000000008000A000C0200000083 +:101D40003000A000000000000000000000000000C3 +:101D50000000000000000000000000002000200043 +:101D60000000000000000000000000002000000053 +:101D7000000000000000A000000000002000200083 +:101D800000000000400000000000000020000000F3 +:101D90000000000000030000200000000000200000 +:101DA00040000000000020000000000000052000AE +:101DB0008800000000000000200000000002200059 +:101DC00020000000000020000000000000002000B3 +:101DD00020000000000040000000000200000000A1 +:101DE00000004000000000000000000000000000B3 +:101DF00000000000000000000000000200004000A1 +:101E0000000000000000008400000000000000004E +:101E100000000000000000000000000000000000C2 +:101E20000000000000000000008800000000000426 +:101E30000000000000020000004000000000000060 +:101E400000000000000000C00002000200020000CC +:101E50000000000000000000004000000000020040 +:101E60000000000000000000000000000000000072 +:101E70000000000000002000000000000000000042 +:101E80000000000000000000000000000000000052 +:101E90001000020000002000000000000000000010 +:101EA00000000000020082000000000900000000A5 +:101EB0000000000002000000200000000000000000 +:101EC0000000000000000000000000000000000012 +:101ED00000000000000000002000000800080008CA +:101EE00000080008000800080008000800000008BA +:101EF000000800000000000880000008000800083A +:101F00000008000800080008000800080000000899 +:101F10000008000800000008800000000008000819 +:101F20000008000800080008000800080008000079 +:101F300000080008040800000008800000080008ED +:101F40000010000800080008000800080008000051 +:101F50000008000800840000000880000021002123 +:101F600000000021000000000000002100210021ED +:101F700000000021000000000000002100210021DD +:101F800000000021000000000000002188218821BD +:101F9000000000210000900000000021000000214E +:101FA0008421000000210000000000004021882161 +:101FB00000219000002104000000000040210021C9 +:101FC0000021000800210000000000000021002185 +:101FD0000021000990210000000000000021000005 +:101FE000000000000000410000000000210000008F +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:10201000110000000000000000004000000000006F +:10202000000000000000020000000084000000A08A +:1020300000A000A000A000000000000000000010B0 +:102040000000200000000000000000000000000070 +:1020500000840000000000000000000800000000F4 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:1020800000000000000000000000004100000010FF +:1020900000000000004000000000000000000040C0 +:1020A0000000000000040004000000000800000020 +:1020B0000000000000000000000000000000000020 +:1020C00000000000002000400000000000000000B0 +:1020D0000000000000000000000000000000000000 +:1020E000C0000000004000000000000000000000F0 +:1020F00000000000000000000000000800000000D8 +:1021000000000000000000000000000000000000CF +:10211000000000C0000000000000000000000000FF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:102160000000000000000800000000000000000067 +:102170000000000000000000000000000008000057 +:10218000000000210000100000000000C00000005E :10219000000000000000000000000000000000003F -:1021A000000000210000A04000002000A00000006E -:1021B00090000000000800410202000800210040D9 -:1021C0000000004000040000004100410002000047 -:1021D000002100000000000000000000002100407D -:1021E00000000000000900000000000000000000E6 -:1021F00000000004000000000000000000000000DB +:1021A000000000210000000000000000000000000E +:1021B000000000000000000000000000000000001F +:1021C00000000000002100000000002100000000CD +:1021D000000000000000840000000000000000215A +:1021E00000000000002100000000000000000000CE +:1021F00000000000000000000000000000000000DF :1022000000000000000000000000000000000000CE -:1022100000000000000000000000000000000000BE -:1022200000000000000000000000000000000000AE -:1022300000000000000000000000000000A00000FE +:1022100000000000000000C00000000000000008F6 +:1022200000000000000000000000090400000000A1 +:102230000004000000020000000000000000000098 :10224000000000000000000000000000000000008E -:102250000000000000000000000000080000000076 -:1022600000000000000000000000000000008400EA -:10227000840000009000200000000000000000002A -:1022800000110041000000000000000000000000FC +:1022500000C00000000000000000000000000000BE +:102260000000000000000000000000000000080066 +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E :10229000000000000000000000000000000000003E -:1022A0004000000300009005000000000000000056 -:1022B00000080000000000000000000000410000D5 -:1022C00000030000000000000000004100000000CA -:1022D00000050000002100000010000000000010B8 -:1022E00000000003000000000000000000000000EB -:1022F000000000000000000080000000000000005E +:1022A0000008000000000000000000000000000026 +:1022B00000000000000000000000000000210000FD +:1022C0000000000800000000000300000000000003 +:1022D00000000000000000000000000000000000FE +:1022E00000000008000000000000000000000000E6 +:1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD +:1023100000000000020000000000000000000000BB +:1023200000000000000000000000000000000200AB :10233000000000000000000000000000000000009D :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D -:102360000000000000000000000000000000C101AB -:1023700000000391010000000141C00221000100A2 -:1023800000102040010040000141C000000000009A -:10239000000000000100000000000000000100003B -:1023A00000C000000000000000000000000300006A -:1023B000C1000000C1830001000000110840C001FD -:1023C000C0010082C0900001C0000189900000009F -:1023D00000000000000000000000000000000000FD -:1023E0009000000200000000000000000000000556 -:1023F000A0030000A0034141004141858080020903 -:1024000003210080000041208021419080000000D5 -:102410000000000000004100000000000000000873 -:102420000900008000000000000000000000000023 -:102430000041C1410000C1830004001110A08000D0 -:1024400080101108008080000040801110030000FF -:10245000000000000000000000000000000000007C -:102460000008020000000000000000000000000062 -:1024700003000310008000804141104100410041F1 -:1024800010880082001008004000A14100908041A7 +:10236000000000000000000000000000000000006D +:10237000000000000100000000000000000001005B +:1023800000C000000000000000000000000000008D +:10239000000000000100000000000000000001003B +:1023A00000C000000000000000000000000000006D +:1023B000000000000000010000000000000000001C +:1023C000010000C00000000000000000000000004C +:1023D00000000000000001000000000000000000FC +:1023E000010000C00000000000000000000000002C +:1023F000000000000000410000000000000000029A +:102400000800008000000000000000000000000044 +:102410000000000000004100000000000000000279 +:102420000800008000000000000000000000000024 +:10243000000000000000000041000000000000005B +:102440000002080000800000000000000000000002 +:10245000000000000000000041000000000000003B +:1024600020020800008000000000000000000000C2 +:102470000000030000000080000080000000000059 +:1024800041009000009100000000000000000041A9 :102490000000030000000080000080000000000039 -:1024A0001000820000008000800000000002004157 -:1024B00000004100084100C100001020034100005D -:1024C0000008A0C10041001110008300044100C1B8 -:1024D000800900000900000000000000000000006A -:1024E00000008200108000808000000000000000DA -:1024F000001000000101000200C000010101000104 -:10250000009102408409000101C0C1002001008344 -:10251000820100000100000000C000002000000057 -:1025200000008800108400840800400000000000C3 -:10253000000100000000010100C1000001000101D4 -:102540000000002141C1880900000100400088010D -:1025500000C1820000000000000000000000000038 -:1025600000000000080002100010820002000000BD -:102570000000000000080000A0850100000000002D -:10258000C183040000100000204100000000000092 -:10259000C101000000000000C000000000000000B9 -:1025A0000000000000C0000000000000000000006B -:1025B00000000000000000400000C1830000000097 -:1025C00000000041A00000200000C1400000000009 -:1025D00000000000000000000000000000000000FB +:1024A0000900900000808000000000000000004152 +:1024B0000000000003000000008000008000000019 +:1024C0000000090090000080800000000000000073 +:1024D00000410000030000000080000080000000B8 +:1024E000000041009000009100000000000000008A +:1024F000004100000100000000C0000020000000BA +:1025000000009000100800C09000020000000000D1 +:10251000000100000100000000C0000020000000D9 +:1025200000009000111000C0020002000000000036 +:102530000001000000000100000000C000002000B9 +:10254000000000009000110400C00800020000001C +:102550000000000100000100000000C00000200099 +:1025600000000000900011080040880002000000F8 +:102570000000000100000000C0000000000000009A +:1025800000000000008800000000000000000000C3 +:102590000000000000000000C0000000000000007B +:1025A00000000000008800000000000000000000A3 +:1025B00000000000000000000000C000000000005B +:1025C0000000000000000088000000000000000083 +:1025D00000000000000000000000C000000000003B :1025E0000000000000000088000000000000000063 -:1025F0000000000000000000004141904100000088 -:102600000041C190800000C100030382000000006F -:102610000021C11000000000000080000000000048 +:1025F000000000000000000000008000000000005B +:1026000000000000000000000000000000000000CA +:10261000000000000000000000008000000000003A :1026200000000000000000000000000000000000AA -:10263000000000000000000000800041C183000095 -:102640000000000911C0000000410041C1C10000AC -:102650000000000411410000000000000000000024 +:10263000000000000000000000000000800000001A +:10264000000000000000000000000000000000008A +:1026500000000000000000000000000080000000FA :10266000000000000000000000000000000000006A -:102670000000000000000000A082800080C1000077 -:102680004100004120C103C183410000808000005F -:1026900041410041808003C10000800000C1000072 -:1026A00000000000000000000041004000030000A6 -:1026B00000000000000000000000C188804180C1CF -:1026C00000000310800082410890C141008080809A -:1026D0000000094100008000088400008000009193 -:1026E000000000000000000000000041000800039E -:1026F000000000000000000000000211820004C180 -:1027000000000000820140C101C10489008804C0AA -:1027100000000001000140C001C10000400000C1F4 -:10272000000000000000000000000011880100010E -:1027300000000000000000000000000040C1200177 -:10274000824000000000020003110102401100C09D -:1027500040C000000001000040020110000008001D -:1027600000100000000000000000000000058800CC -:102770000001000000000000000000000000000058 -:10278000000048420000000000004842811200E0C2 -:10279000060048420000000000004842000000001F +:1026700000000000000000000000800000C1000019 +:102680000000000000000000004100000004000005 +:1026900000000000000000000000800000C10000F9 +:1026A00000000000000000000041000000040000E5 +:1026B000000000000000000000000000800000C1D9 +:1026C00000000000000000000000004100000002C7 +:1026D000000000000000000000000000800000C1B9 +:1026E00000000000000000000000004100000002A7 +:1026F000000000000000000000000000400000C1D9 +:1027000000000000000000000000000502000000C2 +:10271000000000000000000000000000400000C1B8 +:1027200000000000000000000000000502000000A2 +:102730000000000000000000000000000000400059 +:1027400000C10000000000000000000000110200B5 +:102750000000000000000000000000000000400039 +:1027600000C1000000000000000000000011020095 +:102770000000000000000000000000000000000059 +:10278000000000420000000000004800810000E05E +:10279000000048820000000000000042000000002D :1027A000000000420000000000004800810000E03E -:1027B000000048000000000000000042000000008F -:1027C0000000000048420000000000004842811262 -:1027D00000E00600484200000000000048420000FF -:1027E0000000000000000000000000000000810068 -:1027F00000E00000480000000000000000000000B1 +:1027B000000048820000000000000042000000000D +:1027C00000000000004200000000000048008100FE +:1027D00000E000004882000000000000004200000D +:1027E00000000000004200000000000048008100DE +:1027F00000E000004800000000000000004200006F :1028000000000000000000000000000000000000C8 :1028100000000000000000000000000000000000B8 :1028200000000000000000000000000000000000A8 @@ -135856,205 +135856,205 @@ :1028D00000000000000000000000000000000000F8 :1028E00000000000000000000000000000000000E8 :1028F00000000000000000000000000000000000D8 -:102900000000757B000000000000000000000000D7 +:102900000000747B000000000000000000000000D8 :1029100000000000000000000000000000000000B7 -:10292000DEAE747B0000000000000000000000002C +:10292000DE2E747B000000000000000000000000AC :102930000000000000000000000000000000000097 -:10294000DE2E0000757B000000000000000000008B +:10294000DE2E0000747B000000000000000000008C :102950000000000000000000000000000000000077 -:102960000000DEAE747B00000000000000000000EC +:102960000000DE2E747B000000000000000000006C :102970000000000000000000000000000000000057 -:102980000000DE2E60DE0340000000000000023187 +:102980000000DE2E6156034000000000000002310E :10299000E0000000000000000C400000000000000B -:1029A00002C07B06615603400000000000000231B7 +:1029A00002C06A8661560340000000000000023148 :1029B000E0000000000000000C40000000000000EB -:1029C00002C06A86000060DE0340000000000000D4 +:1029C00002C06A860000615603400000000000005B :1029D0000231E0000000000000000C400000000098 -:1029E000000002C07B0661560340000000000000AA -:1029F0000230A0000000000000000C4000000000B9 -:102A0000000002C06A86000000000004000400000C -:102A100000000000000000000000000000000000B6 -:102A2000000000002000000000000004040000007E -:102A3000000000000000000000000000880000000E -:102A40000000000000000003000000000000200063 -:102A5000000000000000000000000008000000006E -:102A60000000000000000000000000000000000066 -:102A70000008000000000000100000000004000436 -:102A80000000000000000000000000000000000046 -:102A900000400000000000000000000000000000F6 -:102AA00000000000000000000000000000008000A6 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 +:1029E000000002C06A86615603400000000000003B +:1029F0000231E0000000000000000C400000000078 +:102A0000000002C06A8600002000000000000008EC +:102A10000000000000000000200000000000000096 +:102A20000000000000000000200000001000000076 +:102A30000000000000000000200000004000000036 +:102A40000000000000000001000020000000000065 +:102A500000000000000400048800200000002000A6 +:102A6000000500000004000000002000000000003D +:102A700000000000000400042000200000002000EE +:102A80000000000000000000000200000002000240 +:102A90000000000000000000000000000000000234 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000200000000000014 +:102AC00000000000000000000000000000001020D6 :102AD00000000000000000000000000000000000F6 :102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000020000D4 -:102B000000000008000000000000000000000000BD -:102B100000000000000000000000000000000000B5 -:102B20000000000000000000000000000000840021 -:102B30000000000000000000000000000000000095 -:102B4000000000000000000900000000000000007C -:102B50000000000000000000000000000000000075 -:102B60000000000000000000000001000000000064 -:102B70000000000000000000000000040000000051 -:102B80000000000000000000000000000000000045 -:102B90000008000800000000000000080008000015 -:102BA0000008000000080000000800080000000005 -:102BB0000008000800000000000000080084001069 -:102BC00000080000000800000008000800000010D5 -:102BD00000000008000800080000000000080000D5 -:102BE000008800080008000800000088040800842D -:102BF0000082008800080010000800080002000899 -:102C0000000800080008000800080008000800008C -:102C1000000000000000840000000000000001002F -:102C200000000000000000000000000000000000A4 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B10000200000000000000004000000000000073 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000010004000000200004003 +:102B4000000000000000000008100000000000006D +:102B50000040000000000000000000000000000035 +:102B60000000000000000000000000000000000065 +:102B7000000800400041004100000040000000004B +:102B80000000000000000000000000400000000005 +:102B90000084000000000000000000000088000821 +:102BA0000004000800000000000000000000000019 +:102BB0000000000000884000000000000000000845 +:102BC00000090008000000000000000000000000F4 +:102BD00000000000000000000000000000000000F5 +:102BE0000008000800840000000000000000000051 +:102BF0000000004000000000000000000000000095 +:102C000000080008000000000000000000000000B4 +:102C10000000000000000021000000000000000093 +:102C20000000000800000005000000000000000097 :102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000008000000000000000000000008000064 -:102C6000000000000000000000000008000000005C -:102C7000000000000008000000210021000000000A -:102C8000002100000000000000030002000000001E -:102C9000210000000000030021000000210041008D -:102CA000020000000000008400000000000000009E -:102CB000000800000000000000000000000000000C -:102CC0000000000000000008008800000000000074 -:102CD00000002000000000002100090000A000000A -:102CE00000000008008200A000820088008400002C -:102CF00000000000000000000000000000000000D4 -:102D00000008000000000088000000A00000000093 -:102D1000000000000000000000000000A000000013 -:102D20000000000000000800A000000000000000FB -:102D30000000000000000000200000000000000073 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 +:102C40000000000000002000010020000000000043 +:102C50000000000010000000000000002000000044 +:102C60000000000000000000000000000000000064 +:102C70000000000000000020002100000000000013 +:102C80000000000000000000000300000000000041 +:102C90000000000000000000000000000000000034 +:102CA00000000000000000000084000000000000A0 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000800220000000000062 +:102CD00000000000000000000000000000000000F4 +:102CE0000000000000000008000000A0000000003C +:102CF00000000000000000000000041000000000C0 +:102D00000000000000000000000000820000000041 +:102D100000000000000000000000000000000000B3 +:102D200000000000010000040040010001008400D8 +:102D30000100000000000000000000800000000012 +:102D40000080008000800000008000000000000083 +:102D50000000000010000000004000000000000023 :102D60000000000000000000000000000000000063 -:102D7000000000000000000000000800000000004B -:102D80000000000000000000000000000000000043 +:102D7000000000000000002000000004000400200B +:102D8000000400040000000000000000000000003B :102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000080000000000093 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 +:102DA000000000000000020000000000020002001D +:102DB00000000200000000000000000011400000C0 +:102DC00000000040004000400004004000000000FF +:102DD000000000000000000000400008004000006B +:102DE000000000000000000000080000000000A03B +:102DF00000000000000000000000000020000000B3 :102E000000000000000000000000000000000000C2 -:102E100000000000210090000000080008000000F1 +:102E100000000000000000000011000000000000A1 :102E200000000000000000000000000000000000A2 :102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E600000000000000000000000000001800000E1 -:102E70000021000000080000000000000000000029 +:102E4000000000000004000000000000000000007E +:102E500000800000000000000000000000000000F2 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 :102E80000000000000000000000000000000000042 -:102E900000080000000000000500050041000000DF -:102EA00008004100410000880000080800880090E8 -:102EB000000003000000000000000000000000000F -:102EC000000800000000000000000008008400006E -:102ED00000000000000000000000000000080000EA -:102EE00000000010000800002040000000880810CA -:102EF0002000008402A011000088000000000000F3 -:102F000000000000000000000000040000820088B3 -:102F10000000009000000000000082000800820015 -:102F20000000000000000000080000000000000099 -:102F30000000000000000000004000000000400011 -:102F40000000000000000000000000000000000081 -:102F50000000000000000021080000000000000048 +:102E900040000000000000000000000000000000F2 +:102EA00000000000000000000000000809080208FF +:102EB0000000000000000000000000000000000012 +:102EC000000000000000000040000008000810089A +:102ED00000000004000000000000100000000000DE +:102EE00000000000000000000000030000080008CF +:102EF00008A000000000000000000000000000002A +:102F000000000000000000000000080000080008A9 +:102F100008040000000000000000000000000000A5 +:102F200000000000000000000000000000000000A1 +:102F3000000000000000010000000103010001008A +:102F400001000000008000400000000000000000C0 +:102F50000000000000000000000000000000000071 :102F60000000000000000000000000000000000061 -:102F70000000080000000000000000000008000839 +:102F70000000000000000000000000000000000051 :102F80000000000000000000000000000000000041 -:102F900000008200000000000000000000000000AF +:102F90000000000000000000000000000000000031 :102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC00000000000000000002100000000000000E0 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 +:102FB000000000000000000002000000020002000B +:102FC0000284020020000040000100000000000018 +:102FD00000000000000000000000000000001100E0 +:102FE00000000000200000000000000000000000C1 +:102FF00000040000000000000204000000200000A7 +:103000000000040000080000200000000000000094 :1030100000000000000000000000000000000000B0 :1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 -:10305000000000000000000000000000000000016F +:1030300000000000000000C000000000000000C010 +:1030400000000000000000C000200000000000C0E0 +:103050000000000000000000000000000000000070 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 :103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 +:1030B0000000000000000000008000000000000090 +:1030C0000080000000000000008000000000000000 +:1030D0000080000000000000000000001000000060 :1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF :1031100000000000000000000000000000000000AF :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F +:10314000800000000000000080000000000000007F +:103150008000000000200000800000080000000047 :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F -:1031800000000080000000000000000000000000BF +:10318000000000000000000000000000000000003F :10319000000000000000000000000000000000002F :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F -:1031C00000000000000000000000004000000000BF -:1031D00000000000000000000000000000000000EF +:1031C0000000C000000000000000C000000000007F +:1031D0000000C000000000000000C000000000006F :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF -:1032000000000000000400000000000000000000BA +:1032000000000000000000000000000000000000BE :1032100000000000000000000000000000000000AE :10322000000000000000000000000000000000009E :10323000000000000000000000000000000000008E -:1032400000000000000000000000820001000000FB -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E +:103240000000000000C000000000000000C00000FE +:103250000000004000C090000000009000C000008E +:103260000800000000000000000000000000000056 :10327000000000000000000000000000000000004E :10328000000000000000000000000000000000003E :10329000000000000000000000000000000000002E :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000300FB -:1032D00000000000000000000000000000000000EE +:1032C00000000000000000800000000000000080FE +:1032D00000000000000000800000000000000080EE :1032E00000000000000000000000000000000000DE :1032F00000000000000000000000000000000000CE :1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D :10333000000000000000000000000000000000008D -:10334000000000000000000000000000004000003D -:10335000000000000000000000000000000000006D +:10334000000080000000000000008000000000007D +:10335000000080000000000000008000000000006D :10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D -:103380000000000000080000000000000000000035 +:10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D :1033A000000000000000000000000000000000001D :1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD +:1033C00000000000C000000000000000C00000007D +:1033D00000080000C000200800000000C00000003D +:1033E000009000000000000000000000000000004D :1033F00000000000000000000000000000000000CD :1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC :10342000000000000000000000000000000000009C :10343000000000000000000000000000000000008C -:1034400000000000000000000000000000008421D7 -:103450000060070000000000000000000000000005 -:10346000000000000000000000000000000000005C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000E00000000000007C :10347000000000000000000000000000000000004C -:1034800000000000000000000081000007000000B4 +:10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C :1034A000000000000000000000000000000000001C :1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC +:1034C0000000000000000000FFFFFFFFFFFFFFFF04 +:1034D000FFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFA +:1034E0000000FFFF00FFFFFF0000000000000000E1 :1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB :10352000000000000000000000000000000000009B :10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B +:1035400000000000000000000000FFFFFFFFFFFF81 +:10355000FFFFFFFFFFFFFFFFFFFF00FFFFFF00FF79 +:10356000FFFFFFFFFFFF00FFFFFF00000000000064 :10357000000000000000000000000000000000004B :10358000000000000000000000000000000000003B :10359000000000000000000000000000000000002B @@ -136068,28 +136068,28 @@ :1036100000000000000000000000000000000000AA :10362000000000000000000000000000000000009A :10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A +:1036400000000000000000000000FFFFFFFFFFFF80 +:10365000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFF78 +:10366000FF00FFFF9999FFFF00000000FFFF00002F :10367000000000000000000000000000000000004A :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA +:1036C000000000000000000000000000FFFFFFFFFE +:1036D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:1036E000FFFFFF00FFFF9999FFFFFFFF00000000B1 :1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 :1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 :103730000000000000000000000000000000000089 -:103740000000000000000000000000000000001069 -:103750000000000000000000000000610026800D55 -:1037600000A00000000000000000000000000000B9 -:103770000000000000000000000000000000000049 +:103740000000000000000000000000000000000079 +:1037500010024082800000209202408280000020FF +:10376000920240828000002092024082800000206D +:103770008A0200610007000D000000000000000048 :103780000000000000000000000000000000000039 -:103790000000000000000020000000A00000000069 +:103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 :1037C00000000000000000000000000000000000F9 @@ -136124,436 +136124,436 @@ :103990000000000000000000000000000000000027 :1039A0000000000000000000000000000000000017 :1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000400040000000000DF -:1039E00000000000000000000000000000000000D7 -:1039F0000000041000000000200020000000000073 -:103A000000000000000300000000000000000000B3 -:103A10000000000020080005000020002000000039 -:103A20000000000000000008000200000000000884 -:103A3000000010080000000004001003200800002F -:103A400020A00000020000000000000000000000B4 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000400016 -:103A700000000000800000000000000000000000C6 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000010000000210080000000000451 -:103AC0001100800500000000000000000000000060 -:103AD00000000000000000400000000000000000A6 -:103AE00000000000000002100000000000000000C4 -:103AF0000000000000001040080008000010000056 -:103B0000000000100010001000000010080000006D -:103B10000000001000100010001082000000820061 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000020000065 -:103B4000000000000100000000A0000800080000C4 -:103B5000000000000000000000000000000000085D -:103B6000000800080000000000080008000800002D -:103B700000000004000000000000000000000084BD -:103B80000084001000000000020800000008000887 -:103B900000000000000000000000004000000000E5 -:103BA0000000000000000000000000080010008479 -:103BB0000000000800000000000000840000000376 -:103BC00000080000000804000008000500000800CC -:103BD00000000000000000000000A000C000000085 -:103BE00000000000000000000000000000000000D5 +:1039C0000000000088002000040004002000000027 +:1039D000000020002000C0000000000000002000C7 +:1039E0000000200000004000000000002000C00097 +:1039F0000000820020000000000000000000200005 +:103A00000000200000030000200000000000200053 +:103A100000000000000020000080000808000000F6 +:103A20002000000020000000200000000004200012 +:103A30000000000000002000000000002000000046 +:103A400020000000200000008000800080000000B6 +:103A50000000000000000002210000000000400003 +:103A60000000000000004000000000000000000016 +:103A70000000000000000002000000000000000044 +:103A80001000000000000000000000000000000026 +:103A90000000000000000002000041020001800060 +:103AA0000000000000C00000000000000000000056 +:103AB0000000000000000000000000000090000076 +:103AC00000000000000000000000200021000400B1 +:103AD00000000000020803000000000000000000D9 +:103AE00000000200000000000000000000000000D4 +:103AF0000000010000090441000020000000200037 +:103B000004000400000002000000000000000000AB +:103B10000400400000000040020000000300020812 +:103B20000000000001000000000000000000000094 +:103B30000000000000000000002100000000000064 +:103B4000000000000000000000000004A00084004D +:103B500082000208020000000800000000000000CF +:103B600000000000800000080200000800000008BB +:103B700000000008040000828000000080000000B7 +:103B80008000820080000088820000000010000099 +:103B90000040800080400200000000000000200083 +:103BA0000001000800000400000002000000028480 +:103BB00000000000040000000000050000000000FC +:103BC00000000008000000000008020000080021BA +:103BD0000000000000000000000000100000202095 +:103BE000000000000000000000000000000088004D :103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C1000000000050021000000000000000000007E -:103C2000020000000021000000000000000002036C -:103C3000000000000021000000080000000040001B -:103C400000210400004000000000000001080800FE -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 +:103C00000000000000200009840000000000000007 +:103C10000008A000000200008241000040000041B6 +:103C20000002000000000000000000088800000002 +:103C3000000000000000000000000008000000007C +:103C4000200800000000000000000000000000004C +:103C50000000000000000000000000000001000063 +:103C60000000030000000000000000000000000051 +:103C700008000900000000004100000000000000F2 :103C80000000000000000000000000000000000034 -:103C9000000000000000000800000000000000001C -:103CA00000000000000800000000000000400000CC -:103CB0000000000000000000000000840000000080 -:103CC00000000000000000000000000000002000D4 -:103CD00000000000000000000000000000000800DC -:103CE0000000000000000000000000000000820052 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 -:103D30000000000010000000000000000000000073 -:103D40000000000082000800A10000000000000048 -:103D5000040000000000000000000000000000005F +:103C9000001000A000000000000000000000000074 +:103CA0000000000200000000000000000000000012 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD0000000000020000000000800008400000038 +:103CE000000000000000020000000200820000004E +:103CF000004000000000080000000000000000007C +:103D00000000000000000000000020400000000053 +:103D10000000010000002004004000000800C00076 +:103D2000080000000080000000000000000000000B +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D5000000000000000C00800000000000000009B :103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000001000000000000023 -:103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000000000003 -:103DC00000000000000800000000040000000000E7 -:103DD000000080000000000000000000000008005B -:103DE00000000000080000000000000000000000CB -:103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E2000000000000000000000080000000000008A -:103E30000000000000000000000000000000000082 -:103E40000000000000080000000000000000002149 -:103E500004039021000000000000000000000008A2 -:103E6000000000000000000000000000000400004E -:103E70000000000041000000000000000000000001 -:103E80000000000000000000000000000000000032 -:103E9000008800000000000000000000000000009A -:103EA000000000000000020000000000000200000E -:103EB000000800A000080000000000000000000052 -:103EC00000000000000000000000000000000002F0 -:103ED00002000000000000000000000000000800D8 +:103D700000000008000000000000000000000084B7 +:103D800000000000000000000000000080000000B3 +:103D90000000000002000004000400000000000019 +:103DA0000000000000000040009000000000000043 +:103DB00000000000000000000000000011000000F2 +:103DC00000001000000000000000000000000000E3 +:103DD00000000000000000000003000000000011CF +:103DE00000000000000000000000000002000400CD +:103DF00004000400080000000800820000410000E8 +:103E0000820008000000C00000028800C00000001E +:103E10001004000400000010C0000000C0000000FA +:103E20009000A000000000000000820000000000E0 +:103E30000000000000000000000000000011000071 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000020000000000000060 +:103E60000000000000000000400000000000000012 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000080005000300000022 +:103E90000000000100010000000000000000000020 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 :103EE00000000000000000000000000000000000D2 :103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F2000000000000000000300000000000000008E -:103F30000000000000000000000000000000000081 -:103F40000000000000000000080000000008000061 -:103F5000000000030000000000000000000000401E -:103F60000500000000000500000000000000000047 +:103F000000000041C0110241000000000004000850 +:103F10002000000010050000000000210000021039 +:103F200000000000000000210000008001000008E7 +:103F30000100000000000000000000110004000467 +:103F40000000000000000000000000000000000071 +:103F5000000000000000000000004100000000021E +:103F6000030000000000000000000000000000004E :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:10404000000000000000000000000000000010A0C0 -:1040500000900088001000A0009088100000000070 -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 +:103F90000000800000000000000000002100000080 +:103FA00000010000000000000000000000022000EE +:103FB00000010800000000000000000000001100E7 +:103FC00000000000110000000500000200000000D9 +:103FD00000000000000000000000000090C1008907 +:103FE0000091102000000000000000000000000010 +:103FF000000000000000000000000000040200902B +:10400000000202C0A02002200082A00200010001E4 +:104010000800000002C0088800A0C000000040A006 +:10402000000200A0080200000001000000000101E1 +:104030000000000000000820004000C04000000018 +:104040000000000000000000000000000000000070 +:10405000000000000000000000000000000000C19F +:104060000008001180200000000000000000000097 +:1040700000000000000000000000000000000080C0 +:1040800000000080800080000000008000800008A8 +:104090001108800500028080000020808000000060 +:1040A00080800080000000800003000800030008FA +:1040B00041410003004100108000000000000000AA :1040C00000000000000000000000000000000000F0 -:1040D00000800080000000800082008200890010C3 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F +:1040D00000000000000000000000000000000000E0 +:1040E00091004100024020A00000000000000000FC +:1040F0000000000000000000000000000000800040 +:10410000000080A08000808000000003800080000C +:10411000418020000204101080090000809180007E +:10412000000000000000800400000000000000000B +:104130000000800000008000800000000089808076 :10414000000000000000000000000000000000006F -:104150000000800000008080800002008202890050 -:1041600080090000000000000000000000000000C6 -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:1041900000400000000000000000000000000000DF -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D0000000000008000200A01090000000100085 -:1041E000A00090000000000000000000000000009F +:10415000000000000000000000000000000000005F +:10416000000010882000830020900000080000005C +:10417000100000000000000000000000A00000008F +:10418000C000080002C110A008C090008401A01067 +:1041900082040010000000010101020088000202F8 +:1041A0008200000000000000A08900000000000064 +:1041B00000000000028820004000C0000000000253 +:1041C00008A0020000000000000000000000000045 +:1041D00000000000000000000000000000000000DF +:1041E00000000000C02001A089828520000000009E :1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E -:104250000000000000000810001010020000100212 -:1042600000100009C0110000000000000000000064 +:1042000000000000A1900088C00804880840004019 +:104210009008C0080000000011010001C020020445 +:104220000008A0040000889000080002A0C0000060 +:104230000100000000000000010001000000C0A01B +:104240000000008482A000000000000000000000C8 +:10425000000000000000000000000000000000005E +:104260000000000000008000118090008900000024 :10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000008000008000000000DE -:1042E0008011001100A1809100000000000000007A -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D +:10428000000000000000410000008080000000806D +:1042900000000080808000030341042100108000A2 +:1042A0000000000088000000000000000080008086 +:1042B00000004100050000000000090009000000A6 +:1042C000000000000080A08000000000000000004E +:1042D00000000000000000000000000000000000DE +:1042E0000000000000000000219010A002910803CF +:1042F000001000000080000000000000000000002E +:10430000000000000000000000000080000000002D +:104310000000000000000000032121000900110539 +:10432000001000808000000000000000008080007D +:104330000000000000000000000000100911000053 +:104340000000804000C000000000000000000000ED :10435000000000000000000000000000000000005D -:1043600080002100919188000310000000000000EF -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D0000000000000000000000000000000880055 -:1043E0000288100011000811098801000000000077 -:1043F00000000000000000000000000000000000BD +:10436000000000000000000000000141018201C1C6 +:1043700001010001002000400000000000000000DA +:104380000000000000820000000082008208A0906F +:10439000820002002040100884000083000000001A +:1043A000000010018820088884000000000084A01C +:1043B00008849000000000000000000000000111CF +:1043C00000C000001000402090C0880000000000E5 +:1043D00000000000000000000000000000000000DD +:1043E000000000000000000000000000818100E0EB +:1043F0000700880600000000000000000000000028 :1044000000000000000000000000000000000000AC -:1044100000000000000A000007000000000000008B -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000213B -:10446000000007000000418200E007000082000019 -:10447000000000000000000000000000000000003C +:10441000000048420000000007000082000000E0A9 +:1044200000000000000000E007004206000000005D +:1044300000000700000000000000000042008100B2 +:1044400000E00700810000000000070000000000FD +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000000000004C +:104470000000F0FCFAFA000000000000000000005C :10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC +:104490000000600000600F010F015545FFCF0000D4 +:1044A000000000000000F1F0FBF014BE14BE00009C +:1044B00050105010FFF00028000000000000000025 +:1044C00000000000000000000F3FFF3F3C143C14C0 :1044D00000000000000000000000000000000000DC -:1044E000D707D707CF45CF45FF000F00FF0FC30306 -:1044F00000000000000000000000000000000000BC +:1044E00000000000000000000000000000000000CC +:1044F00000000000F0F0F0F00000000000000000FC :1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:104560000000D707D707CF45CF45FFFF0F0FFF0F3D -:10457000C303000000000000000000000000000075 -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB +:10451000010000000900000903010F055500FF001C +:104520000000000000000000F1F0FBF0F0F0FFFFE1 +:1045300000005010501000F00028000000000000A3 +:10454000000000000000000000000535F5353C3C8F +:104550001414000000000000000000000000000033 +:10456000000000000000000000000000000000004B +:1045700000005051F0F37D7D5D550000000000000B +:104580000000000000000000000000000000A0A0EB +:1045900000002481000004011040F4FAF8FA0F0F23 +:1045A00014D70000000000000000FFFFFFFF8200A2 +:1045B000BE000000CF55CFFFFF00FF00000000004D +:1045C00000000000000000000F0F00010F000000BD :1045D00000000000000000000000000000000000DB -:1045E00000000000FF00FF003CFF00C3FF00FF00D1 -:1045F0000FFF00F0000000000000000000000000BD -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000C000FFFFFCFF00C3A0002E -:10467000FFFFAFFF00F0000000000000000000009E +:1045E00000000000000000000000000000000000CB +:1045F000000000005051000055555D5500000000BE +:10460000505000000000000000000000000000000A +:10461000A0A000000000248108022080040A080AEB +:104620000F0F00C3000000000000000000AA000FF0 +:1046300082F0BEF000000C550CFFFF55FF55000046 +:104640000000000000000000000000000001005514 +:1046500005555500000000000000000000000000AB +:10466000000000000000000000000000000000004A +:1046700000000000000000615024800500000000E0 :10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A0000020000000A0000000000000000000004A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000002000000000AA -:1046F00000610024800900000000000000000000AC +:1046900000000000120600000000000008000000FA +:1046A000000000000000006100040009000000613B +:1046B0002007000D00000000000000000090000036 +:1046C00000610006000D000000210004C00D00087C +:1046D00000000E00000000000000000000000000CC +:1046E00000000000000000000000000000000000CA +:1046F0000000000000000000FFFF55000000000067 :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 +:1047200000000000000000002F2F0F0FAFAAAEAA5C :104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 +:1047400000000000000000000000AA00AA00000015 :104750000000000000000000000000000000000059 :104760000000000000000000000000000000000049 -:1047700000003C3C3C3CC300FF3D0000000000004A +:1047700000000000000000000000FFFF0C0000002F :104780000000000000000000000000000000000029 :104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 +:1047A000000000000000000000000FAF0FAFAFAA34 +:1047B000AAAA0000000000000000000000000000A5 +:1047C000000000000000000000000000AA00AA0095 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 -:1047F000000000000030FFFFC300FF3D000000008C -:1048000000000000000000000000000000000000A8 +:1047F0000000000000000000000000000041000375 +:10480000FFFFFFFF000000000000000000000000AC :104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 +:1048200000000000000000000000000005050F036C +:10483000CB000000000000000000000000000000AD +:104840000000000000000000000000000000AFAF0A +:104850000040000000000000000000000000000018 :104860000000000000000000000000000000000048 -:1048700000000000000000F3F3F3CF45CF45000037 -:104880000000000000000000000000000000000028 +:10487000000000000000000000000000000055558E +:104880000F0F00302828000000000000000000008A :104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 +:1048A000000000000000000000000000000055555E +:1048B000FFC3EB000000000000000000000000004B +:1048C00000000000000000002000000000000000C8 +:1048D000A0A0004F00000000000000000000000049 :1048E00000000000000000000000000000000000C8 -:1048F000000000000000000000F3F3F3CF45CF45B7 -:1049000000000000000000000000000000000000A7 -:10491000000020000004000500000000000000006E -:104920000000000000000000000000000000000087 -:104930000000200000020000000000000000000055 -:104940000001400000000000000000000000000026 -:104950000000000000000000000000000000000057 -:10496000001020000000000000000009000000000E -:104970000400000000000000000000000000000033 -:10498000840800000000000000000000000000009B -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 +:1048F00000000000000000000000000000000000B8 +:10490000000004000400200000000400200000005B +:1049100000000000000088002000C000000000002F +:104920008800000000111000000000000000880056 +:1049300000000000C0002000200004000000000073 +:104940000001000000000000000000000000000066 +:1049500000000000000000002000200020000004F3 +:10496000000400000000000000000000000000043F +:1049700000000000000000002000200020000004D3 +:104980000004000080008000800000000000800023 +:1049900000000000000200020040000020000000B3 +:1049A00000000000000000002100000000000000E6 +:1049B00000000800000040000000000000000000AF :1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 +:1049D0000084000000000040000000000000000211 :1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000002B5 -:104A00000000000000000000000000200000000086 -:104A10000040000000000000000000050000000051 -:104A20000000000000000000000000000000000086 -:104A30000010000000000000000000000000000066 -:104A40000005000000000000000000000000000061 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A8000000000090000000000000084000904008C -:104A90000000000100000000000000040000000011 -:104AA0000000000000000000000000000004000002 -:104AB00000000000000000000000000200000008EC -:104AC00000000000000800000000000000000008D6 -:104AD00000000000000000000000000000000000D6 -:104AE00000080000000000080000000000080008A6 -:104AF00000000000000000000000000000000000B6 -:104B000000080008000800A00000000001000000EC -:104B1000002100000000000000000000000800006C -:104B2000000800000000000800000000000000086D -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000005000000000000000050 -:104B600000000000A00000000000000000000000A5 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000040021 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000008000000000000BD -:104BF00000000000000000000000000000000000B5 -:104C00000000000800A0030040880020822000204F -:104C10000000000000100010000000000000000074 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000410000000033 -:104C40000000000000800000010000800000000063 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000A000000000000000A4 -:104C700000000000000000008200000000000000B2 -:104C80000000000000000000000000000000000123 -:104C90000001000000000001000100000000000011 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000080000200000040000B8 +:1049F00000020000000200000000000000000000B3 +:104A0000000000000000040004022000000001007B +:104A10008500000000000000000000800000000091 +:104A20000000001000000000000000000000000076 +:104A3000100000000000000000000000000000095D +:104A40000000000000000000000000000000000066 +:104A50000000000500000000000000000010000041 +:104A60000000000000100000000000000000000036 +:104A7000000000000900000000000000000000002D +:104A80000000000000000200800080018000008221 +:104A900020002000000002000200020002020000CC +:104AA0000008000000000200000000880000000074 +:104AB00000000000000000000000000800000000EE +:104AC000008800000000000000000000000000005E +:104AD000000000000088000000000200001000003C +:104AE00040000040000000000000000000840000C2 +:104AF0000000030000004008020000000000000069 +:104B0000000800000000000000000040000000005D +:104B10000000010000000003000000000000000091 +:104B20000000000400000000000000000000080079 +:104B300000000000A00000100200000000000000C3 +:104B40008800000088000000000000000000000055 +:104B50000000000000000000000000000000000055 +:104B60000000000000000020000000000000010024 +:104B7000000000000000000000090011000000100B +:104B80000000040000000000000000000000080019 +:104B90000000000020000000000000000000008471 +:104BA000000000C00000000000000300030003003C +:104BB00000000000080008000000410000844110CF +:104BC00000000000000000C00000000000840000A1 +:104BD00000000000000003000000000803000000C7 +:104BE000000003000008004000200000000000005A +:104BF0004000000000000000000000000000000075 +:104C00000000000000100000000000000000000094 +:104C10000000080000000040000001008403840838 +:104C2000C0054004008000800080080000000000F3 +:104C300000008200000000000000000000000000F2 +:104C40000000820000000800000000000000084092 +:104C50000000000408090040024002400240020532 +:104C6000000000000200104000100040824002409E +:104C700000040040000000040000000500040002E1 +:104C80000000000000000000000000000000000024 +:104C9000000000000400000000000000040000000C +:104CA0000001000080000020002000200000000023 +:104CB000004000C0000000000000000000000000F4 +:104CC00000000000000000000000000000000000E4 :104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D100082118200A00000050000000000000000D9 -:104D20000000000000000021000000000000000062 -:104D30000000000000000000000000000000000073 -:104D400000000000000090000000000000000400CF +:104CE0000000009011000200000800000000000019 +:104CF000030000000000030020842104200003843E +:104D0000000002000200020000000000000000009D +:104D100000110000C08000000800A0000000080092 +:104D20000000000000080002000204000000002152 +:104D3000000000050000000000002000000004004A +:104D40000020000000000000010000000000000042 :104D50000000000000000000000000000000000053 -:104D6000000000000000000000000000000800003B -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC000000000000000000000000000000000845F -:104DD0008000000000000000000000000000000053 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E00000000000000000000000800A000000000FA -:104E100000880084000000008209001100000000EA -:104E20000000002100000000000000000000000061 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E5000000000000000000000000008000000004A -:104E60000000000000000000080000030000000037 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E9000000000000000050000000000000000000D -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000800000000000000DA -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F100000000000000000008804904000820000B3 -:104F200002A000A1004000400000000000000000BE -:104F30000000000000000000000000000000000071 +:104D6000000000000000000000000000820082003F +:104D70008200000084000204880000090000000492 +:104D8000000400000000000000000000000000001F +:104D900000000590410000022100080021000000F1 +:104DA0000000000000000000000000008000000083 +:104DB000000011020800051020000000080000009B +:104DC000091000000084051000002000000800C049 +:104DD000008400000000000400080300008400C0FC +:104DE00000A008000000000000000000009000008B +:104DF0002100000000000000800000000000000012 +:104E00000000100000000000000000000000000092 +:104E1000000000008400C000400800000000000006 +:104E2000000000000180008301000100000000007C +:104E300000100080000000000800000000000003D7 +:104E40000000000000000000C00000000000004161 +:104E50000000000000000000000000000040000210 +:104E6000000000000000000900000800000002101F +:104E7000000002000200000002000200000000002A +:104E8000000400000000004000400040004000001E +:104E9000000000000000000000008000000008008A +:104EA00000000000000004200020040404000000B2 +:104EB00000000000002000000000000000000000D2 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000800000000000000CA +:104EE0000000000000000000004000000040000042 +:104EF0000000000000400000000002000000200050 +:104F0000000021002000000000000000000000025E +:104F1000000000000000000040A091040402A0C0B6 +:104F20000001040000010001000000900088000062 +:104F30000000008800880000000000000000000061 :104F40000000000000000000000000000000000061 -:104F5000010000000000000000010000000000004F +:104F50000000000000000000000000000000000051 :104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000808000008091 -:104FA0000000C0C000030005000300000000000076 +:104F700000000000000000000000100284208808EB +:104F80008240889000040084882000000000000017 +:104F900000000000000000000000A08083808080EE +:104FA0000000054180030011000300001180000093 :104FB00000000000000000000000000000000000F1 :104FC00000000000000000000000000000000000E1 -:104FD000000011002100000000000000000000009F +:104FD00000000000000005000000000000000000CC :104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000008000000010 -:10502000800080808000800380008080000000007D -:105030000000000000000000000000000000000070 +:104FF0000000000000000000000000009080210080 +:105000000000800003000880000000000000000095 +:105010000000000000000000000000001005080370 +:1050200010892080400083000300C01000008080B1 +:10503000001100800000008000008080000000005F :105040000000000000000000000000000000000060 -:105050000000000000410900000300000000000003 +:105050000000000000080000000000000000000048 :105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:10509000000000000000000000000000000004000C -:1050A000400084009008020020010400909000005D -:1050B00000000000000000000000000000000000F0 +:1050700000000000000000000000000000008200AE +:10508000A183100090A19100A0C0418090800000F9 +:10509000000000000000000000000000000001000F +:1050A0000000018300020140100001009001000097 +:1050B000829000008890880000900000C0100000DE :1050C00000000000000000000000000000000000E0 -:1050D00000000000000000010100000000020000CC +:1050D00000000000000000010000000000000000CF :1050E00000000000000000000000000000000000C0 :1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F +:10510000049009C0892005C1080009C1900209C0A6 :10511000000000000000000000000000000000008F -:10512000000400400090110008A0000091900000D1 -:10513000000000000000000000000000000000006F +:105120000202000290A140C10000010088000000BE +:105130000100004090881011014000889088020012 :10514000000000000000000000000000000000005F -:1051500000000000000000000000880000000000C7 -:10516000000000000200000000000000000000003D +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F :10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A000000000800000008040000080210091800D -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF +:105180000000A1410091C004100821840090C009D2 +:1051900090A00000000000000000000000000000DF +:1051A0000000808300838021001100001100850031 +:1051B0000000112000A08003104111800000800039 +:1051C000800000000000000000000000000000005F :1051D00000000000000000000000000000000000CF -:1051E00041000000000080000000000000000000FE +:1051E00000000000000000000000000000000000BF :1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:1052200000000000001180008000000080110000DC -:10523000808000000000000000000000000000006E +:105200000000000041080003808888104103000866 +:1052100080A100200000000000000000000000004D +:1052200000000000800080418000800803A121026E +:1052300002000310800000080080000080100008B9 :10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000113D +:10525000000000000000000000000000000000004E :10526000000000000000000000000000000000003E :10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A0000000000000004001200084004000400099 -:1052B0000010040240000000000000000000000098 -:1052C00000000000000000000000000000000000DE +:1052800000000000000002118811900008030000D7 +:105290000000800000080000000000000000000086 +:1052A000000000000000C0880200A0008201004150 +:1052B0000088010000019000000088841000900028 +:1052C00088888888000000000000000000000000BE :1052D00000000000000000000000000000000000CE -:1052E00000010000000000000000000000000000BD +:1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D -:10531000000000000000000000000000000000008D -:105320000000000000000000000600000600000071 -:105330000006000006000000000000000000000061 -:10534000000000000000000000000000000000005D +:105300000000000000000000109002904088410161 +:105310002090208804884000000000000000000069 +:105320000000000000000000884100E007000000CD +:10533000884200E0070000000011000007000000A4 +:1053400000810000070000000000000000000000D5 :10535000000000000000000000000000000000004D -:10536000000000E0070081000000000000000000D5 +:10536000000000E00000000000000000000000005D :10537000000000000000000000000000000000002D :10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000F330FF00EF20CC -:1053B000EF2000000000DB42DB42000000000000A4 -:1053C00000000000000000000000000000000000DD +:1053900048420000000000004842000000000000F9 +:1053A000000000000000000000000006000C7E76F7 +:1053B000767600000000000000003F3FC0C0F0F023 +:1053C0000FF0F0FF0F003CCC3CCC000000000000D0 :1053D00000000000000000000000000000000000CD :1053E00000000000000000000000000000000000BD :1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000F330FF005A -:10543000EF20EF2000000303DB42DB42000000000E -:10544000000000000000000000000000000000005C +:1054000000000000000000000000000020104080AC +:10541000A00500002040040222001100000000004E +:1054200000000000000000000000000066663C3C38 +:105430006E66666600000000000000003F3FC0C0CE +:10544000F0F00FF0F0FF0F003CCC3CCC000000006F :10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C :10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C +:105480000000000000000000000000000000040810 +:1054900002010000A0051080080100220011000098 :1054A00000000000000000000000000000000000FC :1054B00000000000000000000000000000000000EC :1054C00000000000000000000000000000000000DC @@ -136563,292 +136563,292 @@ :10550000000000000000000000000000000000009B :10551000000000000000000000000000000000008B :10552000000000000000000000000000000000007B -:105530000F0F0F66000CF3FFFCFCFC0C0404F7F7E4 -:10554000000000000000000000000000000000005B +:10553000202FFFFF000000000000000060609F9F20 +:1055400009F609F60F0F0F0F669666963C3CC3C32B :10555000000000000000000000000000000000004B :10556000000000000000000000000000000000003B :10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B -:10559000000000000000000000000000000000000B -:1055A00000000000000000000000000000000000FB -:1055B00000000F0F0F66000CF3FFFFFFFF0F340416 -:1055C000C7F700000000000000000000000000001D -:1055D00000000000000000000000000000000000CB +:105590000000008800440108020400008214050095 +:1055A00000050000000000000000000000000000F6 +:1055B00000000000FFFF000000000000000060602D +:1055C0009F9F09F609F60F0FF0F0669666963C3C31 +:1055D000A5A5000000000000000000000000000081 :1055E00000000000000000000000000000000000BB :1055F00000000000000000000000000000000000AB :10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A -:105630000000000000000030000000008061003623 -:10564000000D00000000000000000000000000004D -:10565000000000000000000000000000000000004A -:1056600000000000000000000000000000600006D4 -:10567000000C00A00000000000000000000000007E +:105610000000000088004400801040208214000038 +:10562000A00000A00000000000000000000000003A +:1056300000000000A0610026800900000061003C1D +:10564000800510C00361033E0C0D10C00300033839 +:105650000C0042C00000000000000000000000003C +:1056600000000000000000000000000000610007D2 +:10567000000D00000000000000000000000000001D :10568000000000000000000000000000000000001A -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA +:1056900000000000000060610006000D10000061C5 +:1056A0000006000D080000000000000000000000DF +:1056B00000000000000000000000202CEFEFFF14AD +:1056C000FF0C00000000000000000030003000006F :1056D00000000000000000000000000000000000CA :1056E00000000000000000000000000000000000BA -:1056F0000000FFFF000000000000000000000000AC +:1056F00000000000000000000000000000000000AA :105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 -:105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 +:105710000000000000000000000000800000000009 +:10572000000000003C3C3C3C000000000000000089 +:105730000000000000000000000000002020EFE357 +:10574000FF14FF0000000000000000000C000FCF5D :105750000000000000000000000000000000000049 :105760000000000000000000000000000000000039 :105770000000000000000000000000000000000029 :105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C0000000AAAA00C000000000000000000000C5 +:105790000000000000000000000000000000010008 +:1057A0000000000000003C303C3C00000000000015 +:1057B0000000000000000000000000000000000CDD +:1057C000000841410303FFFFFFFF0000000000004D :1057D00000000000000000000000000000000000C9 :1057E00000000000000000000000000000000000B9 -:1057F000000000000000F0F00000000000000000C9 +:1057F00000000000000000000000000000000000A9 :105800000000000000000000000000000000000098 :105810000000000000000000000000000000000088 :105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 -:1058400000000000AAAAFF3F0000000000000000C6 +:10584000000000084155030F000800F800000000A8 :105850000000000000000000000000000000000048 :105860000000000000000000000000000000000038 -:105870000000000000000000F0F000000000000048 +:105870000000000000000000000000000000000028 :105880000000000000000000000000000000000018 :105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 +:1058A0000000400000000000000040000000000078 :1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000020000000A8 -:1058E00000000000000000000000000000000000B8 -:1058F0000000000000000020000000002000000167 -:1059000000000000000000000000000040008800CF -:10591000000000000000000000000000000820005F -:10592000000500000000000000000000200420042A -:1059300000001000400000000000400000000000D7 -:105940000000000000000000000000000000002037 -:105950000000000000000000400000000000000007 -:105960000000000000000000000000020000000035 -:105970000000000000000000000300000000000420 -:10598000000000000000000000000008000000000F -:1059900000000000400000000000000000000000C7 -:1059A00000000000000000000000000000000002F5 -:1059B00000000000000000000000000000000002E5 -:1059C00000000000000000080000000000000000CF -:1059D00000100000100000000000000000000000A7 -:1059E0000010000000000010000000802002009065 -:1059F00000900800000000000000080008000010EF -:105A00000010000000400200000000000000000044 -:105A100000400000020002000200020002000040FC -:105A200000400040000000000000000000000000F6 -:105A30000000000000000000000000000000000066 -:105A400000000000000000820200000000080008C2 -:105A50000008000800000008000400000084008422 -:105A60000000000000000008000800000004801092 -:105A70000004000400880008000000000008000086 -:105A800000000000000000000008004000000000CE -:105A900000400000040800000008000000000008AA -:105AA00000000000000000080010000800080008C6 -:105AB0000000000000100000001000000000008442 -:105AC00000000004020000000008000000000005C3 -:105AD0000000000000210000000000000000080895 -:105AE0000000000000210000000000000000004055 -:105AF0000008000000080000000000000000000393 -:105B0000000000000000000000000000000800008D -:105B10000000000000000000000000000000000085 +:1058C00020000000C00000000000200020000002B6 +:1058D0000000000004002000000000002000000084 +:1058E0002000000020020000000020002000000036 +:1058F0000000000000002000000000002000000365 +:105900000000200000002000000000002000200017 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000002000200037 +:1059300000800480048004200000000000000000BB +:105940000000000000020000400000000000000015 +:105950004000040000000000000000000000000003 +:1059600000000000000200000000000041000000F4 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000000000000000200000000000203 +:1059A00020000000000000000004000000000000D3 +:1059B0000000002080208020800100000000000006 +:1059C00000000000000000000000000000000000D7 +:1059D000000000000000050010040000000000109E +:1059E00002000000000000000000000000000000B5 +:1059F0000400000000000000000000000241000060 +:105A00000000000000000000000000000000020094 +:105A10000000008000000000000000000000020004 +:105A20000000002100000400000000090000000048 +:105A30000000040001040000000000040000000059 +:105A40000000000000000000000000000000100046 +:105A500000000400000000820400000104000408AB +:105A600000080010210000000008000000000008ED +:105A7000000800080000000000000084000004028C +:105A800000100200000000000000001000C0000034 +:105A900000080290040400880000000000000000DC +:105AA00004000000020000000000000000080000E8 +:105AB00004080000000004010400000000010400CC +:105AC00000A000000200000000000008000000002C +:105AD000080000000008004004000000000800006A +:105AE0000000002000004021000000000000000035 +:105AF0008400000084000008000000000000000096 +:105B00000400000040000000A00000002000200869 +:105B10000000000000002000000000000000000065 :105B20000000000000000000000000000000000075 -:105B3000000000000000000004030000000000005E -:105B40000000000000000000000000000000000055 -:105B500000000000000000A000000008000000009D -:105B60000000000000000000000000000000000035 -:105B70000001000000000000000000000000000024 +:105B3000000000000080008300000000000004005E +:105B4000000000040040000000A00084000000A04D +:105B5000080008000000000000881100000000009C +:105B6000000000000400002000A000000000000071 +:105B700000200000052000000020000000000000C0 :105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000000000000000E5 -:105BC00000000000000010000000000000000000C5 -:105BD00001000000000000000000000000000000C4 +:105B90000000000000000000800000000000000085 +:105BA000000000000200020000002000040040008D +:105BB0000284008800000020004000000000000077 +:105BC00000000000000000000000100000000000C5 +:105BD0000040000000000000000000000000000085 :105BE00000000000000000000000000000000000B5 -:105BF0000000008001000000010000000000000023 -:105C00000000004000000000020000000000000052 -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C4000000000000000000000000800400000000C -:105C50000000040000000000000000A000000000A0 -:105C60000000000000000000000000000000000034 -:105C700000000000002004000000040000000000FC -:105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 -:105CC00000000000001000000000000000000105BE -:105CD00000000020000000000000000000000000A4 -:105CE00000000000000000000000000000000000B4 -:105CF0000000000000000000000000200000000084 -:105D0000000000030000000000030000000000008D -:105D10000008000000000008000000000000000073 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 -:105D40000000000000000000000000000000004013 -:105D50000200000800010000000000000000000038 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000001000022 -:105D800000000000000000C00000000000840000CF +:105BF00000000000000000000000000000000000A5 +:105C00000000000000040000000000000000000090 +:105C10000000000010000000000000000000000074 +:105C200000008800000000004002000000000000AA +:105C3000000008000000000000000000000000005C +:105C40000000000000000000000000000000030051 +:105C50000000000008000800000011000000000023 +:105C600000000090000000C000C0002020000000E4 +:105C70000000000000000000000000000000000024 +:105C800000000000000000004100000000000000D3 +:105C900000000000000000200000050000000000DF +:105CA00000900000099000840008000009900000A6 +:105CB00000C000000300408800880382408240004A +:105CC0004000400000A000000000050000000000AF +:105CD00000000000000000000000000000000000C4 +:105CE0000000004100000000000000200020000033 +:105CF00000000000000000000000000000000000A4 +:105D0000000000000800000000000000000000008B +:105D1000000000000000040000000000000000007F +:105D2000000000000000000008000000000000006B +:105D3000000008000000C000C1800580C180018013 +:105D40000000880490040020000000000000000013 +:105D500008A00890000041000000000021A0000001 +:105D600000840000000005820020000000200020C8 +:105D7000000000000000000000000000050000001E +:105D800000020000000000000000090000002000E8 :105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 -:105DC00000000000000000000000000000000000D3 -:105DD0000004000000000002000900210000000093 -:105DE00000000008000000000000000000000000AB +:105DA00000000000000000000000030000000000F0 +:105DB00000004020400404044020022084400220CF +:105DC000022041000001000100000000000000006E +:105DD000000000000000400000000000000800007B +:105DE00000000000000000000000001100000000A2 :105DF00000000000000000000000000000000000A3 -:105E000000009000000000210000000000000000E1 -:105E10000000000000000000000200000000000080 -:105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000000000000000000E2 -:105EC00000000000000000000000000000000000D2 -:105ED0000000000000000000900000000010000022 -:105EE00000000000000000000000000000000000B2 +:105E00000000000000000000000002000000000090 +:105E10000000000000000000000000000000000082 +:105E20000000000000410000000000000000000031 +:105E30000000001000410000000000000000000011 +:105E4000820010200000000500000005000000088E +:105E50000000002100000000000000002000000001 +:105E60000008110203000000000000000000000014 +:105E7000000000000000000000000008000000001A +:105E8000050000000000000000000000000000000D +:105E900000000000000000000000200011040000CD +:105EA0000000000000000000090000000084000065 +:105EB0000000000040A011C00000110000C0000060 +:105EC00000000000000100000000000021020000AE +:105ED000410200024020000000000000000000001D +:105EE000000000000000880400C000C02082000004 :105EF00000000000000000000000000000000000A2 -:105F00008800000000000000000000000000000009 +:105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 +:105F20000000000010000000000000000000000061 :105F30000000000000000000000000000000000061 -:105F40000000000000000000000000000000000051 -:105F500000000000000000001100800000000000B0 -:105F60000000000000000000000000000000000031 +:105F40000000000800000000000000000000000049 +:105F50000000000000000000000000000000000041 +:105F600000000000000000000000000000008000B1 :105F70000000000000000000000000000000000021 -:105F80001100800000000000000000000000000080 +:105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 +:105FA00000000000040000000000000000000000ED :105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD0000000000000000000000000000080000041 -:105FE0000080000000000000000000000000000031 -:105FF00000000000000000000000000000000000A1 -:106000000000001000800009008000000000000077 +:105FC00000000000000000000000000000000500CC +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000118021000400FB +:105FF0002000001100000000000000000000000070 +:106000000000000000000000000000000000000090 :106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 :106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000002020 -:10606000000000C000000000000000000000000070 -:106070000000000000000000000000000000000020 -:1060800000000000880000200000008200000000E6 +:1060400000000000000000800000008000080080C8 +:106050000008000000000000000000000000000038 +:106060000000000000000000000000000008A10087 +:10607000000001000000000000000000000000001F +:106080000000000000000000000000000000000010 :106090000000000000000000000000000000000000 :1060A00000000000000000000000000000000000F0 :1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000100BF -:1060E000028888000100000000000000000000009D -:1060F00000000000000000000000000000000000A0 -:10610000000000000000010020898800000000005D +:1060C00000000000000000000008000000080000C0 +:1060D000000200000040000000000000000000007E +:1060E0000000000000000000000000000000081098 +:1060F00000A10091C1A0000000000000000000000D +:10610000000000000000000000000000000000008F :10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:1061600041008080000009000000000000000000E5 -:10617000000000000000000000000000000000001F -:1061800000000000000000000800809100001100E5 -:1061900000000000000000002000000000000000DF -:1061A00000000000000000000000000000000000EF +:10614000000000000000000000000002020000004B +:10615000010020000200000000000000000000001C +:10616000000000000000000000000000000000002F +:106170008091008300A191910000000000000000C8 +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000001000030008D4 :1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF -:1061E000000000110000008000000000000000001E -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000002000000008C -:106210000000000000000000000000050000000079 -:10622000000000000000000000000000000000006E +:1061C00000000000000000000000110000000000BE +:1061D000000040008000800003000000000000007C +:1061E00000000000000000000000000000000000AF +:1061F000000020022000400000020000000000001B +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:106220000000000000000000000000000009000065 :10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:10625000000000000000000000000000000000003E -:1062600000000000000100000040000000000000ED -:10627000000000000000000000000000000000001E +:10624000000000000000000000000000000000400E +:106250000000000000080000000000000000000036 +:10626000000000000000000000000000000000002E +:10627000000000000104010401040001000000000E :10628000000000000000000000000000000000000E :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE :1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE -:1062E0000000000000000000000007008221000004 -:1062F000000000000000000000000000000000009E +:1062D0002000000800000000000000000000000096 +:1062E00000000000000000000000000000000000AE +:1062F000000000000000810000E00700000A00002C :10630000000000000000000000000000000000008D -:1063100002E0070000000000000000000000008113 -:106320000000070000000000000000000000000066 -:10633000000000000000000000000000000000005D +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000000000006D +:10633000810000E0000000000000000000000000FC :10634000000000000000000000000000000000004D -:10635000000000000000000000000000000000003D -:10636000000000000000000000000000F0F000004D -:10637000000000000000000000000000000000001D +:106350000000000007000000000000E0070000004F +:10636000000000000000000000000000000000002D +:1063700000000000000000000000000055C3D5C36D :10638000000000000000000000000000000000000D -:1063900000000000F0F0000000000000000000001D +:1063900000000000000000000000000000000000FD :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E0000000000000000000000000000000F0F0CD -:1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C -:10641000000000000000F0F000000000000000009C +:1063D000000000FF0000F0F00000000000000000DE +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000055C385 +:1064000055C3000000000000000000000000000074 +:10641000000000000000000000000000000000007C :10642000000000000000000000000000000000006C :10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:1064600000000000000000000000000000003C3CB4 -:106470000000FFFF0000000000000000000000001E +:106450000000000000FF0000F0F00000000000005D +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000809C :10648000000000000000000000000000000000000C -:10649000000000000000000000003C3C0000000084 +:1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC -:1064D00000000000000000000000000000000000BC +:1064D0000000000000000000FF000000FFFF0000BF :1064E00000000000000000000000000000000000AC -:1064F0003C3C000000000000000000000000000024 -:10650000000000000000000000000000000000008B -:106510000000000000000000000000003C3C000003 +:1064F000000000000000000000000000000000009C +:106500000000A0A0A0A0000000000000000000000B +:10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B +:1065500000000000000000000000FF00000000003C :10656000000000000000000000000000000000002B -:1065700005002A00054000A80000000000000000FF -:10658000000000000000000000000000000000000B -:10659000000000000000000005650A06054E20A866 -:1065A00000000000000000000500002000000000C6 -:1065B00000000000000000000000000000000000DB +:10657000000000000000000000000000000000001B +:1065800000610006C00900000000000000000000DB +:1065900000000000000000000000000000000000FB +:1065A00000000000000000000000000000000000EB +:1065B0000000000000000000000000610006C009AB :1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB +:1065D0000000000000000000000015002A0805402F +:1065E00000A805790A07050D05A0000000000000BD :1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:106610000000000000000000000000000000F0F09A +:10660000000005000000F0FC000000000000000099 +:10661000000000000000000000000000000000007A :10662000000000000000000000000000000000006A :10663000000000000000000000000000000000005A -:10664000000000000000000000000000000000004A +:10664000100010000000000000000000000000002A :10665000000000000000000000000000000000003A :10666000000000000000000000000000000000002A :10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A +:106680000000000005000000F0FC00000000000019 :1066900000000000000000000000000000000000FA -:1066A000F0F000000000000000000000000000000A +:1066A00000000000000000000000000000000000EA :1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA +:1066C0000000FFFFFFFF00000000000000000000CE :1066D00000000000000000000000000000000000BA :1066E00000000000000000000000000000000000AA :1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 +:106700000000000000000000000000000010000079 :106710000000000000000000000000000000000079 :106720000000000000000000000000000000000069 :106730000000000000000000000000000000000059 @@ -136863,194 +136863,194 @@ :1067C00000000000000000000000000000000000C9 :1067D00000000000000000000000000000000000B9 :1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000088000000000011 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000276 -:106820000000000000000000000000000000000068 -:106830000020000000000000000000010000000037 -:106840000000000000000000000000000000000048 -:106850000000000000000000000010000000000028 -:1068600000000000000000000000400040000000A8 -:1068700000000000000000000000200000000000F8 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000010000000D8 -:1068B00000000001000000000000000000000000D7 -:1068C00000000000000000000000000000000000C8 -:1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000020000A6 -:1068F0000002000000000000000000000000000096 -:106900000000000000000400040000050400000076 -:106910000000000000000000000000100000000067 -:1069200000000000000000000000001000800000D7 -:106930000000000000000100010001000100000053 -:106940000000000000000000000000000000000047 -:106950000000000000000000000000000000000037 -:106960000000000000000000000000000010000017 -:10697000000800000000000000000000000000000F -:106980000000000400040010800080000004800467 -:106990000000008200080000040000040000000065 -:1069A00000000000000400000004000800000010C7 -:1069B00000000000000400002000209020082000BB -:1069C00000000000000000000000000000080000BF -:1069D00000000000000000000000000000080008A7 -:1069E000000800000000000000000000000400009B -:1069F000000000000000000000000000001000087F -:106A00000008000000000000000000081010000056 -:106A1000000800000000000000000000000800085E -:106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 -:106A4000000800000000000000000000000000003E -:106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A7000000000000000000000080000000000000E -:106A80000200000000840000000000000000000977 -:106A900000A0000000000000000000000000000056 -:106AA00000000000000000000000000000000000E6 -:106AB000000000A002000000000000000000000034 -:106AC00000000000000000000000000000000000C6 -:106AD00000000000000000000000000000000000B6 -:106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 -:106B000000004100000000000800000000004000FC -:106B10000000008000000000C000000000008200B3 -:106B20000000000000000000000000000000000065 -:106B30000000000000000000000000000000000055 +:1067F0000000000000000000000000000000000099 +:1068000000000000000020000000000084032000C1 +:106810008400000000002000000000000000400094 +:106820000000000000002000000000000000000048 +:106830000000000000002000000200030000000033 +:106840000000000000000000820000000000400086 +:106850000000000000000000200000000000000018 +:10686000400000000000000240080004000040005A +:1068700000000000000000004004040000020000CE +:1068800000020002400000000000000000000000C4 +:106890000000008400000000000000000000000074 +:1068A00021020000000000000000000000020000C3 +:1068B00000000000000000000000000000000000D8 +:1068C000002009000000030000000000000000009C +:1068D0008000000000000000000000001000000028 +:1068E0000000800000020000000000000000000026 +:1068F0008000000000000000000000000000000018 +:1069000000000000000041000000000005100441EC +:10691000010000000400000000000000000002056B +:106920000004000000000000000000000000000063 +:106930000200000000020000000000000000000053 +:106940000000000000000100000000000000000046 +:106950000000000000000000000000000100000036 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000410800000000080000000000400076 +:1069900000C0040800848008000000840008000093 +:1069A0008402040504000408000000080000000040 +:1069B000040000040000000800000008001000822D +:1069C0000000000000000002081000000008200085 +:1069D00000000000000000000008000400080200A1 +:1069E000000800000408000000000000000800008B +:1069F000000000000000000000840000008420006F +:106A0000008400088421000000210000000800002C +:106A10000004002100029000002100000000880214 +:106A200000080004010001088910000000100000A7 +:106A30000000002100000000000200000000000330 +:106A40000000000000410000900000000000000075 +:106A500000000000000000000000000000000041F5 +:106A60000000000000080041400540054000900083 +:106A70009000904190000000000500000000000020 +:106A800000000000000000200000000000000000E6 +:106A900000000801000000000000000000000008E5 +:106AA00000000000000102000800200100000000BA +:106AB00000000000000000000000000000080000CE +:106AC00000000000000000000000042000000000A2 +:106AD00000200020000000A0008200000000000054 +:106AE0000000000000000000000002000084000020 +:106AF0000000000000000000000040000000000056 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B20000020002000000000000000000000000025 +:106B3000000000000000000008000800080000003D :106B40000000000000000000000000000000000045 -:106B50000000000000000000000000000000000035 -:106B60000000000000000000000000000000000025 -:106B70000000000000000000000010000000000005 -:106B800000000000000000000000000000080000FD -:106B900000040000002000000000000000000000D1 -:106BA00000000000000000001000000000000000D5 -:106BB0000000000000000000000041000000000094 -:106BC00000000008000000000000000000000000BD -:106BD00000000000000000000000100000000000A5 -:106BE000000000000000000000000000000000A005 -:106BF000000000000000000000C0000000000000D5 -:106C00000000000000000000000082000000820080 -:106C100000410000C000820082000000000000006F -:106C2000000000002000000000000800000000003C -:106C3000000000000000A0000000000000000000B4 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C800000001000000000000000000000000000F4 -:106C90000000008400000000000000000000000070 -:106CA00000000000000000000000000000C0000024 -:106CB00000000000000000840000008400000000CC -:106CC00000000000000000000000000000000000C4 -:106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 -:106D0000000000000000000400000000000000007F -:106D10000000A002000200200000000000020000AD -:106D20000000000000100000000000000000000053 -:106D300082000200000000000000000000000000CF -:106D4000000200000002000000000000000000003F -:106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900003042000000000002000000000000000AC -:106DA00000000000000000010000000000000000E2 -:106DB0004100000000000000000000000000000092 +:106B50000000200000002000A00000000000000055 +:106B600020008200000020002000200000004000E3 +:106B700004000000A000200082000800400001087E +:106B800040000000A000000000A00000000000087D +:106B900000000002008800820000000000000000E9 +:106BA0000000000000000000009000000000000055 +:106BB00000000000000000000000000000000000D5 +:106BC000000000000000000000000000008800003D +:106BD00000000500000000000000000000000000B0 +:106BE000000000000000000000000004000000049D +:106BF0000000000000000000000000000000000095 +:106C000020008000000000000000000000000000E4 +:106C1000000000000000000400210000000200410C +:106C2000002100000000000000040000000000201F +:106C3000000000050000000000000000000000004F +:106C40000000000000000000200800000000040810 +:106C500004000000000040000000400000000404A8 +:106C6000A0000441004088058800400500040000A1 +:106C7000000500008208824000008241840000007C +:106C800000C00000880488000000001100004100DE +:106C900000000000000000000001000000000004EF +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000040000000000000000000000C0 +:106CD0000000000000000000800000000000000034 +:106CE0000000000000000000000000008000000024 +:106CF0000000000000000000008800000000090003 +:106D0000000000050000000000000000000000007E +:106D100082000000000000002000000000000000D1 +:106D20000005000400000000002100000000000039 +:106D30000000000000000002000900210000000324 +:106D40000000000000000000000000000200000041 +:106D5000000000000000000020008400200000105F +:106D600090050000000300058804200400000004D2 +:106D70000000000420000009000400000804400492 +:106D80002000000040002000000000200011C00092 +:106D9000008200000400020000000000000000006B +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 :106DD00000000000000000000000000000000000B3 :106DE00000000000000000000000000000000000A3 :106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000010A00002004080 -:106E20000002000000000000000000000000000060 -:106E30000000000000000000000000000000000052 +:106E000000000000000800008000000000000000FA +:106E1000000000000000000000000040000820000A +:106E2000041090A000040010840400000000000082 +:106E3000000002000000000002000000000000004E :106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000800080F2 -:106EA0000000008000000000000000000000000062 -:106EB00000000000000000000000000000000000D2 +:106E5000000000000040004000A0104002208420FC +:106E6000018810821090900200828803041008406C +:106E700000A0828211101104100504090000000016 +:106E8000000000009003000801214083824000823E +:106E90000082C040000000000000000010000080E0 +:106EA00002000080008000000000000000000000E0 +:106EB00000000000000000001000000000000000C2 :106EC00000000000000000000000000000000000C2 -:106ED00008000000000000000000000000000000AA -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F200080048000000080008000800000000000DD -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000002021 -:106F50000000002000000000000000000000000011 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00082000241A040880802000200020088001E -:106FB00000000000000000000000000000000000D1 -:106FC00040008800000084000000000000000088ED -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000822000000402404000000000000038 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:107050000000000020000000000000000000000010 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A00000000000400000008080000000000000A0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D0000000000000000000000020000000000090 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000080028000800000409D -:1071300000000080000000000000000000000000CF -:10714000000000000000000000800080000000003F -:107150000000000000000008000000000000000027 -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A000000000000000000082008840024008004B -:1071B0000000008800400000000000000000000007 -:1071C00000000000000000000000000400020000B9 +:106ED00000000000000000800000000000008010A2 +:106EE00000000920009000030005008300088000D6 +:106EF0008000000080009003900380080083000061 +:106F0000000000000000809100020210001000A0AC +:106F100000110009000900000000000000008000CE +:106F200080118088000000000005808000000000C3 +:106F3000000000000000801180008011800000002F +:106F40000000000000000000000000000000000041 +:106F500000000000000000000000804000A00000D1 +:106F6000808080880000809080800090000800A0D1 +:106F7000000000C100910080100021A0418020A1EC +:106F80000000000000000000008880C080A0808019 +:106F9000800080A000118080000000000000000040 +:106FA00010001001A041A00082008200A084A00473 +:106FB0000000000000000000080008009000C00071 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000100090A110A0C0 +:106FE0000800080202C1908408C1408204C00488DD +:106FF00008C0840008C0900284C00288C1C1C0409B +:1070000002C10000000000000000101008C1901133 +:1070100002C0080008C0882008C00000000000006E +:10702000000000C000820001A1102008000800003C +:107030008204000000000000000000C008000008FA +:1070400001C000000000000000000000000000007F +:10705000000000000000000000000000008400406C +:107060008440040811100004C1080482118401083E +:10707000C102200889910091C0848891050800050B +:10708000C0888882000000000000000021821140BA +:10709000C008049089040020C10802880000000094 +:1070A00000000000000000050010C0C000000080CB +:1070B0000000800000000000000000000000000050 +:1070C0000000108000000000000000000000000030 +:1070D00000000000000000000000000000000000B0 +:1070E0000080000080804180000085802080C100F9 +:1070F00003809000080041100008800000104188C3 +:107100000088C11100900000000000000000410054 +:107110000800C100A0004180098085808500000032 +:10712000000000000000000000000080000080045B +:10713000800400800000000000000000000000004B +:1071400000000080000000000000000000000000BF +:10715000000000000000000000000000000000002F +:10716000000000800000000021000808110000005D +:107170002100100002008300800000040080000055 +:107180000588831104800810000000000000000042 +:10719000A108209183802000001100000000000061 +:1071A0000000000000000000000000A088080200AD +:1071B0001001081120400200000000000000000043 +:1071C0000000002000080000000000000000000097 :1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:1072200000000000000000000000008200000700D5 -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:1072500000000006000007000000810000E00000C0 -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E -:1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000FF003FA0 -:1072B00066663C00000000000000000000000000C6 -:1072C00000000000000000000000000000000000BE +:1071E000000004002002828884008500200220081C +:1071F0008400C100102091880200020008884082AB +:10720000400084A1208884101101000000000000CB +:1072100000001101080305824100C00040A020C009 +:1072200040000000000000000000000000E0070037 +:107230000000000000000700000000000000000047 +:107240000000008200E007000000000000000000D5 +:10725000000000000000000000000000000000002E +:107260000000000000000000070000000000000017 +:1072700000004842000000000000484200000000FA +:1072800000004842000000000000484200000000EA +:1072900000000000000000E0000048420000000084 +:1072A000000048420000000000000000ADADADADA0 +:1072B000F3F30000C0C3F0FF00002C2C000000001E +:1072C00000000000000000002424FF000000000077 :1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000FF5E -:10733000002F66663C000000000000000000000016 -:10734000000000000000000000000000000000003D +:1072E0000000000000003C00F6F60F0F0C002040EC +:1072F0000402A0000500A0000500A00000A0A00559 +:1073000000002004100822001100200410080000D2 +:10731000000000000000204004022040040222007F +:107320001100221100000000000000000000EFEF3B +:10733000EFEFC3C30000808190992C2C2C2C00000F +:1073400000000000000000000000242400000000F5 :10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD +:107360000000000000000000F6F6F6F60F0F000027 +:107370001080080100A0000500A000050500000520 +:107380000000A0054002800100220011400280019F +:1073900000000000000000001080080110800801BB +:1073A0000022001100002211000000000000000077 :1073B00000000000000000000000000000000000CD :1073C00000000000000000000000000000000000BD :1073D00000000000000000000000000000000000AD @@ -137059,987 +137059,987 @@ :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C :10742000000000000000000000000000000000005C -:107430000000FFFF82000030013100000000F33146 -:10744000F03100000000000000000000000000001B -:107450000000000000008D8DCFCF00000000000074 -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C -:1074800000000000000000000000000000000000FC -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000FFFF004200300030000000002C -:1074C000FF3DFC3D00000000000000000000000047 -:1074D00000000000000000000C0C0C0C000000007C -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C -:10750000000000000000000000000000000000007B -:10751000000000000000000000000000000000006B -:10752000000000000000000000000000000000005B -:1075300000000000000005000A28050000A100006E -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:107560000020000000A000610007800D0000000066 -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB +:10743000000081C38181F3009100F6F606369900C1 +:107440009D04000000000000000000000000F0F6B5 +:107450000606000000000000000000000000000020 +:107460000000000000000000000000000904991462 +:1074700098999899100820041020080444000044AA +:107480004400004405000005440000440000884416 +:107490000102080400000000000000000000884411 +:1074A0004400004410200804000082140000000082 +:1074B0000000000081C38181F300F300F0F0003090 +:1074C00099009B0200000000000000000000000086 +:1074D000C0C606060000000000000000000000001A +:1074E000000000000000000000000000000009048F +:1074F0009914999981998001400280400102880085 +:10750000008888000088A00000A0880000888844C7 +:1075100000008040102000000000000000008844AF +:1075200000008800008880400102821400000000F2 +:1075300000000000000000610007000D00000000D6 +:1075400000000000000000000000000000000061DA +:107550000027004D000500000000000000000000B2 +:10756000000000000000000000000000000000001B +:1075700000000E000000000060610006000D100019 +:1075800000610006000D080060610006000D10009B +:1075900000610006000D080000000000000000006F +:1075A00060610007000D100000610006000D08007A +:1075B0000000000000000000000000000A000000C1 :1075C00000000000000000000000000000000000BB :1075D00000000000000000000000000000000000AB :1075E000000000000000000000000000000000009B :1075F000000000000000000000000000000000008B -:10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A +:107600000000555555550000000000000000030320 +:1076100000000000800000000000000000000000EA +:107620000000551555550000000000000000000046 +:1076300000000000000000000000000000000A0040 :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA +:1076700000000000000000000000000000A000006A +:1076800000000000551555550000000000000000E6 +:1076900003030000000000000100000000000000E3 +:1076A00000000000551555550000000000000000C6 :1076B00000000000000000000000000000000000CA :1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A :1076F000000000000000000000000000000000008A -:107700000000000000000000000000000000000079 -:107710000000000000000000000000000000000069 +:1077000000000000000000800000000000000000F9 +:107710000000000000000000000000004000000029 :107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 :107740000000000000000000000000000000000039 :107750000000000000000000000000000000000029 :107760000000000000000000000000000000000019 :107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 -:1077900000000000000000000000000000000000E9 -:1077A00000000000000000000000000000000000D9 -:1077B0000000000000000000040020002000200065 -:1077C00000000000000000000000000004000000B5 -:1077D0000000000000000000400000000020000049 -:1077E0000000000000000000000000002000000079 -:1077F0000000840000000000000300000000000002 -:1078000000000000000000000004880000002000CC -:107810000000000040004000040000000000A10043 -:1078200000000000880000000000000000002000B0 -:1078300000000000400000042004000000000000E0 -:1078400000004000000000000000000000000000F8 -:107850000000000000000000000000000000000127 -:107860000000000000000000000000000000000018 -:107870000000000000004000000000000000400088 -:1078800000000000000000000000000000000000F8 -:107890000000000000008000800000000000008266 -:1078A00008000000000040904000000000000002BE -:1078B000400009000002000000000040000000003D -:1078C0009000000000000000001100100000000007 -:1078D0000000000000000000000000400020000048 -:1078E00000030000000000000090021002050200EA -:1078F0000000000082000000000000000000000006 -:107900000200000000000000000000100010020053 -:1079100000000200000000004100000040000000E4 -:107920000000000200000000000000000000000055 -:107930000000000000000010000000000000110422 -:10794000008400080004008400040004000400080F -:1079500000840084000000840084001000100001F6 -:107960000000008400000002000800040000001075 -:1079700000000000000000000000001000080000EF -:1079800000000008000000000000001000080000D7 -:10799000000000000008000000088884000880083B -:1079A0000000009000010000100800000008000026 -:1079B0000000000000100000000800000084000823 -:1079C000000000400009001000080008002100210C -:1079D0000000004000000000004000000008000817 -:1079E00000840008000400050004004000000000BE -:1079F0000005000000080009000800080000000061 -:107A00000000000500000000000000000000000071 -:107A10000000000000000000000000000000000066 -:107A20000000000000000000000200210003000030 -:107A300000040000002100210000001000000000F0 -:107A400000000400000000840001000000000000AD -:107A500000200000000000000000000000100000F6 -:107A6000000000050000000100000001000100000E -:107A700000000300030003000300000000000000FA -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 -:107AA00000000000000000000000000000000000D6 -:107AB00000000000000000000000000000000800BE -:107AC00000000000000000000000000000000000B6 -:107AD00000000000000000000000000000000000A6 -:107AE000000000000900088009000803010401806B -:107AF0000100000000000000000000000000000085 -:107B0000000000000000080000000000000000006D -:107B100000000000000000000000000000008400E1 -:107B2000080000000000000000000000200000002D -:107B30000000000000000000000000000000000045 -:107B400000000000000000000002000000000084AF +:107780000000C0C000000000000000000000000079 +:107790000000000000000000000000C00000000029 +:1077A0000000000000000000000080000000000059 +:1077B0000000008000000000000000002000200009 +:1077C00000000000000000000080008000000000B9 +:1077D0000000000020000000100200002000200037 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000300000000200066 +:107800001000A000040000000200000008000000BA +:1078100088000000000004000000000000002000BC +:1078200020002041200200002000000020008840AD +:10783000200200008800200000004000000000003E +:107840000000000000000000000000040004000030 +:107850000000000200020002000000000000000022 +:107860000000000000000000000000020000000016 +:1078700000004002000000000000000000000000C6 +:1078800000000000000000000000004000000000B8 +:1078900000000000000000000000080000000000E0 +:1078A0000000000000000000000000004000000098 +:1078B00000000001000000000000000000000000C7 +:1078C000900005100005000000000200000000000C +:1078D0000080000000000000000004000000000024 +:1078E000040000000000000000000200040002008C +:1078F0000000020002000200000002000000000080 +:107900000000000002000040000000000000000035 +:107910000200000000000000000000000400000061 +:107920000000000000000000000000000400010052 +:10793000A00001000400000000000000000000089A +:107940000202020008080000000002000008000017 +:107950000000000400000000000000000000000221 +:107960000000000000040400040000000004000007 +:1079700000000000008400000088000000000000FB +:1079800020000000000000000000000000000400D3 +:1079900000000000020000000000000000000008DD +:1079A00000000000000000000000000000000000D7 +:1079B0000400000004008000000004000000000833 +:1079C0000000000000000000002100210010000065 +:1079D000000000000000000400410008000000005A +:1079E0000400000000020000000000000000000091 +:1079F0000000000000000000000000000000040083 +:107A00000000000000000000001100000000000065 +:107A10000400000000000000000000000000000062 +:107A200001000400040040004000000002000000CB +:107A300040000400040004000000000000000400F6 +:107A400000000000000003000000410000000000F2 +:107A5000038400000000000000010000000808008E +:107A6000000000000000000200000000008800008C +:107A700000000000000000000000000000000800FE +:107A80000008000040004000022040040000008286 +:107A900020882090009000000020008800C0000492 +:107AA0000000400200000000000000200200000072 +:107AB000050011048900840084000484410000044E +:107AC00000001100000000000000000000000000A5 +:107AD0000000000000000000000000000000004066 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000482 +:107B0000000000000000000000000000080000006D +:107B10000000000000000000000000000000000065 +:107B200000000004000000000000840000000000CD +:107B30000400000000000000002000000000000021 +:107B40000000000000000000000000000200000033 :107B50000000000000000000000000000000000025 -:107B600000820000000004840002048200A008A13A -:107B700004202008000000000000000000000000B9 -:107B800000000008000000000000000000000000ED +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 :107B900000000000000000000000000000000000E5 -:107BA0004000050005000500000000000000808482 -:107BB00003000000000000000000001000000000B2 -:107BC0000000000000000000000000000000401164 -:107BD00000000000000000000000000000000000A5 -:107BE000900000000000000090050000020020004E -:107BF00000400221000300020005004100000000D7 +:107BA00000000000000400000000000000000000D1 +:107BB0000000008200000000000000010000000042 +:107BC00000000000000000000002C0410000002191 +:107BD0000021000000000000000000000020000064 +:107BE0000000000000000000000000000000000095 +:107BF0000000001000000000000000000000000075 :107C00000000000000000000000000000000000074 -:107C100000000000000000000000820000000000E2 -:107C20000000000000004000000000020000000012 -:107C3000000000000000000000000008000000003C -:107C400082000000080008000000000000000000A2 -:107C5000020000000000000400840000000000108A -:107C600000A0000000000000000000000000000074 -:107C700000000000002000000000000000000000E4 -:107C800000040000000000000000000000000000F0 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC0000000000000000000000000000041000073 -:107CD0000000000900000000000800090021000069 -:107CE00000000021000000000000000011000080E2 -:107CF0000100118000050080010801200021000022 -:107D0000000000000008000000000000000000006B -:107D1000000000000000000800000000000000005B -:107D20000000000000000000000000000000000053 -:107D30000000000000050000000000000008000036 -:107D400000000000000000000000C0000000000073 -:107D500000000000000000000000410000000000E2 -:107D6000000000000000000005820000000020006C -:107D700000102084080200A000020800400100005A +:107C10000000000000000000000000400100000023 +:107C20000000008000800100010000000000000052 +:107C300000000000000000000000001140000000F3 +:107C40000100C00000000000000000000000000073 +:107C50000000000003000020002000000000008859 +:107C60000800000009000000000000000000408241 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C9000004000900000099020000010098840007A +:107CA000098409100404040420202000201000206E +:107CB00000080410002000200020102000000420F4 +:107CC0001120040004C000C000C020000000000912 +:107CD000000000410000002100000005000000003D +:107CE000000000080000000000000000000000008C +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000100000000000000000410000000002 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000002100000002000010 +:107D50000000000000000000000000000000000023 +:107D600000000000000000000020000000000000F3 +:107D70000000000000000000000000000000000003 :107D800000000000000000000000000000000000F3 :107D900000000000000000000000000000000000E3 :107DA00000000000000000000000000000000000D3 -:107DB000000000A000A000C00000000000000000C3 -:107DC00008000000000000000000000000000000AB -:107DD00000000000000000000000000000000000A3 +:107DB00000000000000000000000000000000000C3 +:107DC0000000000000A00500000005000000000009 +:107DD00000049004000484880000000000000000FB :107DE0000000000000000000000000000000000093 -:107DF0000308A010101102080802900390A18289C4 +:107DF0000000000000000000000000000000000083 :107E00000000000000000000000000000000000072 :107E10000000000000000000000000000000000062 -:107E20000000000000000000000040008888820080 -:107E30002000080000000200080000000000000010 -:107E40000000000000000000000000000000000032 -:107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 -:107E700000001002C18880030002091090A18088D0 -:107E8000800800000000000000000000000000006A +:107E2000000000010001000000010000000001004E +:107E30000000000000000000000000000000000042 +:107E4000000000000000C000000000000000000072 +:107E500000000080808000000000000000000000A2 +:107E600000001100000002000000000000000000FF +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 :107E900000000000000000000000000000000000E2 -:107EA0000000000000000000000000008010201012 -:107EB00080040002000002000000800000000000BA -:107EC00000000000000000000000000000000000B2 -:107ED00000000000800080008000800000000000A2 -:107EE0000000000000000000000000000000000092 -:107EF00000000000090083028891A1200280021185 -:107F0000C103A18300000000000000000000000089 +:107EA00000000000000200080000000800000000C0 +:107EB00004000000000000000000000000000000BE +:107EC00000000000000010000000000000000000A2 +:107ED0000000000000000090808080000000000092 +:107EE0000000000000080000004100000000000049 +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 :107F10000000000000000000000000000000000061 -:107F2000000000000000000000000000000002004F -:107F300002009020900300001000080041000000A3 -:107F40000000000000000000000000000000000031 -:107F5000000000000000020002000800080000000D +:107F20000000000000000000000000000010000839 +:107F3000000000050000000000000000000000003C +:107F400000000000000000000080000000000000B1 +:107F50000000000000000800000882A008000000E7 :107F60000000000000000000000000000000000011 -:107F700000000000000008081100114103918290E8 -:107F800008018400C1900000000000000000000013 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 :107F900000000000000000000000000000000000E1 -:107FA00000000000000000000000000000000000D1 -:107FB00020909000A000090020000100010089002D -:107FC00000000000000000000000000000000000B1 -:107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000000091 -:107FF00000000000000000009008009010858388B9 -:1080000008890011008482100000000000000000B8 +:107FA00000000000000000000020000000000001B0 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000800000002A7 +:107FD00000000000000000000200000400A00004F7 +:107FE0000000000000000000000008000000000089 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 :108010000000000000000000000000000000000060 :108020000000000000000000000000000000000050 -:10803000000040830010A010A01100110088002152 -:10804000011000000000000000000000000000001F -:108050000000000000000000000000000000000020 +:1080300000000000900100000000000000000000AF +:108040000000000000000000000000010000080027 +:1080500000000000000000000000800000000000A0 :108060000000000000000000000000000000000010 -:1080700000000000000000000000809120104190EE -:10808000A10880081103418883100000000000004F +:1080700008000000000000000000000000000000F8 +:1080800000000000000000000000000000000000F0 :1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 -:1080B00000000000801011C1900380210009009091 -:1080C0000005110400000000000000000000000096 -:1080D00000000000000000000000000000000000A0 +:1080A00000000000000000000000000000002000B0 +:1080B0000000000000000011000008200000000087 +:1080C00000000000000000000000000002080000A6 +:1080D000001000020000000000000000800080008E :1080E0000000000000000000000000000000000090 -:1080F0000000000000000000000000009109901145 -:108100002080030288090390080090080000000006 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F :10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000208008002100210800004D +:10812000000000000000000000000000000021002E +:108130001000080000000000000000000000000027 :10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:1081600000C000A0000000000000000000000000AF -:1081700000000000000000000000000000000802F5 -:10818000A0108890030005901189001004000000E1 +:10815000000200000000000000000000000002001B +:1081600010C01000400000000000000000000000EF +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF :1081900000000000000000000000000000000000DF :1081A00000000000000000000000000000000000CF -:1081B000000000000000000000A00100019001018B -:1081C0000088009000100000000000000000000087 +:1081B00001000100010000000000000000000000BC +:1081C00000000000000000000000000000000000AF :1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F -:10820000842100E007000000821100E00700000068 +:1081E0000000000007000000000000000000000088 +:1081F000000000E00000000000000000000000009F +:10820000000000000000000000000000000000006E :10821000000000000000000000000000000000005E :10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E -:108240000000600000E000000000000000000000EE -:10825000000000000000000000000000000000001E -:10826000000000000000000000000000000000000E +:1082300000000000000000000000000000E000005E +:10824000000000000000000000000000000000002E +:108250000000000000000700000000000000000017 +:108260000000EB00EBF00000FFF000000000000059 :1082700000000000000000000000000000000000FE -:10828000000030F3AAAA2075A2F700003C00FFF519 -:10829000FFF10000000000000000000000000000EE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE :1082A00000000000000000000000000000000000CE :1082B00000000000000000000000000000000000BE -:1082C000BFBF2C2C000000000F000F0000000000BA +:1082C00000000000000000000000000000000000AE :1082D000000000000000000000000000000000009E -:1082E000000000000000000000000000000000008E +:1082E00000000000EBEBEBEB0000FF0000000000E3 :1082F000000000000000000000000000000000007E -:108300000000000000FF00FF20F720F7FFFFFFC381 -:1083100000A000B00000000000000000000000000D +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D :10832000000000000000000000000000000000004D :10833000000000000000000000000000000000003D -:108340000000BF3E2C08000000000F410F0000009D +:10834000000000000000000000000000000000002D :10835000000000000000000000000000000000001D -:108360000000000000000000000080B0C0F000002D +:108360000000000000000000000055FFEBEB0000E3 :1083700000000000000000000000000000000000FD -:10838000000000000000BEBEFEFFFFFFC2FF55550B -:108390000F0FFF3C4D4D00000000000000000000EA +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD :1083B00000000000000000000000000000000000BD -:1083C000555555550C003F0F00000000FFFFFFFF03 +:1083C00000000000000000000000000000000000AD :1083D000000000000000000000000000000000009D -:1083E000000000000000000000000000000000008D +:1083E00000000000000000000C00030055FFEBEB54 :1083F000000000000000000000000000000000007D -:108400000000000000000000141404003D00000003 -:108410003F030F0FC3004D4D00000000000000009F +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C :10842000000000000000000000000000000000004C :10843000000000000000000000000000000000003C -:10844000000000FF00FF0F0CFF3F00000000FFFFD7 -:108450007D7D000000000000000000000000000022 -:10846000000000000000000000000000000000000C -:1084700000000000000000000000000000000000FC -:1084800000000000000000000000006100228005E4 -:1084900000000061002280050008000000000000CC +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:108460000000000000000000000000000E000000FE +:108470000000000000000000000000610007000D87 +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC :1084A00000000000000000000000000000000000CC -:1084B00000000000000000000000000000000000BC -:1084C0000000000000610006000D000000610006D1 -:1084D0008009000100000000000000000000000012 -:1084E000000000000000000000000000000000008C +:1084B0000000000000000000000000000061000655 +:1084C000000D000000610007000D0000000000002A +:1084D00000000000000000000000000005610A0E1E +:1084E000050D00A0000000000000000000000000DA :1084F000000000000000000000000000000000007C -:10850000000000000000000000000000CFEFEFEFCF -:10851000DFFF55FF7F555F55AAFABAFA0000000049 +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B :10852000000000000000000000000000000000004B :10853000000000000000000000000000000000003B -:10854000000000000000000000003C003C000000B3 -:1085500000003CFF3C7F0000000000000000000025 -:10856000000000000000000000000000000000000B +:10854000000000000000000000000F0F000000000D +:10855000000000000000000000000000000000001B +:108560000000AAAAAAAA0000000000000000000063 :1085700000000000000000000000000000000000FB -:1085800000000000000000000000000000000C04DB -:108590000404002000AA40555055AA0A8A0A000087 +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB :1085A00000000000000000000000000000000000CB :1085B00000000000000000000000000000000000BB -:1085C0000000000000000000555504540400340071 -:1085D0000000000000FF00FF00000000000000009D -:1085E000000000000000000000000000000000008B +:1085C00000A0000000000000000000000F0F0000ED +:1085D000000000000000000000000000000000009B +:1085E0000000000000C33CFF00000000000000008D :1085F000000000000000000000000000000000007B :10860000000000000000000000000000000000006A -:1086100055550F0F30B271F3FF55AA0020F0EFFF50 +:10861000000000000000000000000000000000005A :10862000000000000000000000000000000000004A :10863000000000000000000000000000000000003A -:1086400000000000000000000000000000000A0A16 -:10865000020000000000F00000FF00000000000029 +:1086400000000000008200000000000000000000A8 +:10865000000000000000000000000000000000001A :10866000000000000000000000000000000000000A :1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA -:1086900000003F030F0F0000FFFFEF04EF04200076 -:1086A000EF0F0000000000000000000000000000CC +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA :1086B00000000000000000000000000000000000BA -:1086C000000000000000000000000000000000802A -:1086D0000A0A000000000000F00000000000000096 +:1086C0000000000000000082000000000000000028 +:1086D000000000000000000000000000000000009A :1086E000000000000000000000000000000000008A -:1086F00000000000200400040000000088000000CA -:1087000020000000200000042004200020000000C1 -:10871000000400042000000000000000200000020F -:108720002000A00020000000200420002002000003 -:108730000000001100030000000000040000200001 -:108740000000200000000000000000000000000009 -:1087500020000000010008004000000001000000AF -:1087600000000000000040000000110000000000B8 -:1087700008100000020000000001000000000000DE -:1087800000000000000021000001000000000000C7 -:1087900000000000000000000000000000000000D9 -:1087A00000000000000000000000000200000000C7 -:1087B0000000000000000000200000000000000099 +:1086F000000000002000000000000000200000003A +:10870000200020000000000000000000C000000069 +:108710000000000020000000000000002000000019 +:1087200020002000000000040000000020000000E5 +:1087300000000000000220000008000000002000EF +:108740000000200010000000000000000000880071 +:10875000000000008800000000004000000020022F +:108760000000208020000000000400000000200025 +:10877000001088002004000000000000000000003D +:1087800000000000000000000002400200000000A5 +:1087900000000000000000000000000200000000D7 +:1087A0000000008200000002000000000000000045 +:1087B00000000000000000000000000000000000B9 :1087C00000000000000000000000000000000000A9 -:1087D0000000800000004000C00085000000400054 -:1087E000000000000000000080004100C000000008 -:1087F0000000800300008002000000000000000074 -:1088000000000000008400800000010000800000E3 -:108810000000008000900000000000000000000048 -:108820000000000000000000000500000000000043 +:1087D0000000000204020000000000000000000091 +:1087E00000000000040400000002400000000082BD +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000002000000000000000000000046 :108830000000000000000000000000000000000038 -:108840000000040000000400000000000000000020 -:108850000000000000000000000010008400000084 -:10886000000000009009000000000000000000056A -:108870000000000000020010000900880400040449 -:108880000008009000000041000400840200000481 -:108890000000000000040004000000000088000048 -:1088A00000080000000000000000000000000000C0 -:1088B00000000000000000000000000000000000B8 -:1088C0000000000800000400000004000000000098 -:1088D00000000082000000000010000800080008EE -:1088E0000008000800000000000000000000000078 -:1088F00000000000000000000009008400210021A9 -:1089000000000011002100000000084000210003C9 -:1089100000050009002101000000000000410003E3 -:1089200000000000000500000000008000000000C2 -:108930000005000800009000402100080000000829 -:1089400000000008000000000000002100000000FE -:1089500000000000000001000000000800000010FE -:1089600000000000002100000000000000080000DE -:1089700000000002000800000800000500000000E0 -:10898000000800840000000000000000000000005B -:1089900020000000000000000200000011000000A4 -:1089A0000000000000000000000200400040000441 -:1089B000000400040082000000000000000000002D -:1089C00000000000000000000000000000000000A7 -:1089D0000800410008000800200000001100008489 -:1089E00000100002008400A00008000800880008B1 -:1089F0000000000000010000000000000000000076 -:108A00000000004000400040000500400000000061 -:108A100000000100004000000005010000400000CF -:108A20000000004000000000000000110080000075 -:108A30000000000000000000000400040004000426 -:108A40000000000000000000000000000000000026 -:108A50000800002100000000000008000080010064 -:108A60008200400000054011400082000003002108 -:108A700000000000000000000000000000100000E6 -:108A80000000108200090001400100000001000008 -:108A90000300000020000001000000C020000001D1 -:108AA000000000001101000000000402000000406E -:108AB00000000000000000C0008200010001000171 -:108AC00000010000000000000000000000000000A5 -:108AD0000000000000000000000000000000000492 -:108AE00020000000009000000084009000000000C2 -:108AF0000000030000000000000000000000000172 -:108B00000000008400030000000400200020400456 -:108B10000000000400052020900200000021004019 -:108B20000002002001410000014001000105010098 -:108B3000000000210009000000000000000000000B -:108B40000008000000000000000800000000000015 -:108B500000000800000000000000000000002000ED -:108B600020002004400001000100000200800800F5 -:108B7000004100000000004000000000C000004074 -:108B80000040002000040000000000010040000040 -:108B9000800000000200008880000000000000400B -:108BA0000000000000000202020002020202028431 -:108BB00002020000000200A000000000000000000F +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000100000017 +:1088600001000000010001000100000008000000FC +:108870000100000000000000A00000000400000053 +:1088800000000000000000000000000004000000E4 +:1088900000000408000200000000000004000000C6 +:1088A000001000000000008200000400040004002A +:1088B00004000002000000000000000004000000AE +:1088C00000000000000000000000000000000000A8 +:1088D0000000040000000000000000000000080884 +:1088E000000008000000080020000840000084008C +:1088F00000000800000000820000000000100000DE +:10890000000000080005000000080000000008004A +:108910000200000000000000000000000400000051 +:108920009000820000000000000000000000000035 +:108930000000000000000000000000000000000037 +:1089400000000000A000000000008400880000007B +:10895000008020002000A000A0008800000000008F +:108960004000040004000400000000000003900424 +:1089700010049000100400040409002100090010F4 +:1089800000000000000000840000008200000000E1 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000200000000C5 +:1089B00000000000000000000000000000000000B7 +:1089C0000000000000000000400020000000000047 +:1089D0000000000480048500000000000900000081 +:1089E00000000400400000040000000000004000FF +:1089F00000001100000000000084040000020000DC +:108A00000000000000000000000000000000000066 +:108A10000000000000000800080000040011002011 +:108A200000000000000000008200000000000000C4 +:108A300000000000000000008200000000000000B4 +:108A4000000000000008000000008200000000009C +:108A5000080000000000000000000000000000000E +:108A60000000020000000000000000000000C10043 +:108A70000000000000050000880400210000002123 +:108A800000100000020002000200000000000200CE +:108A90004000000000000000000000000000000096 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD0000000000000000000000000000000000096 +:108AE0000000000080000000000000000000000006 +:108AF000080000000300000000000000000000006B +:108B0000050000010010000000000000000000004F +:108B10000000000000000010000000000000000045 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000000000000025 +:108B500000009000000000800080010001800800FB +:108B600002000000900002000000C004C0000221CA +:108B7000900000114003000400008402000800007F +:108B800000000000000000100000000000000000D5 +:108B900000000000000000000000000000200400B1 +:108BA00000000000000000000000000000000000C5 +:108BB00000000002000000000000000000000000B3 :108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE00088028000C08503004000048400820020C9 -:108BF0000000000000000000000000000000000075 -:108C0000000000000000000000A101210080A02160 -:108C10000005000300902000002100030100000077 -:108C200000410000009100410041000300000000ED -:108C300000050000000000210021000000210000CC -:108C40000000000000030000000000000000000021 -:108C50000000000000000000000000000000000014 -:108C60000000010000800000000000000100C121A0 -:108C700001210008000808080000000000000000B2 -:108C8000000000000000000002004140200000043D -:108C9000000000000000030480000000000020002D -:108CA000210000000000000400000000000000009F -:108CB0001188400000004002000040000002000255 -:108CC0000082000000000000000000000000000022 -:108CD0000000000000000000000000000000000094 -:108CE00000000082200000040000000000100400CA -:108CF000040004000000000021000000000000004B -:108D0000000011000000000000008000034110106E -:108D100000118211090808884090828808094002E1 -:108D20000021822002094008000882080404000093 -:108D300000C00002080800C000C0100000000000D1 +:108BD000400020000000040820084008108810040D +:108BE0004000000000000000000000000000000045 +:108BF00000000000000000400400000800201000F9 +:108C000000100000000000840000000000000000D0 +:108C10000000000000000000001000000000000044 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000001000000000000000000014 +:108C5000000000000000000000002000C000000034 +:108C600000000000000800000000080000000000F4 +:108C7000000000050000002100210021000084897F +:108C80008400010008050000002100000000000031 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000020000000000000000000A4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000008000000014 +:108CE00000C00000000000000000000000000000C4 +:108CF0000000000000000000000000000000000074 +:108D000000100008021080000000000000000000B9 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 :108D40000000000000000000000000000000000023 :108D50000000000000000000000000000000000013 -:108D60000000000000000001890190000000C1081F -:108D70000091208810110000000000000000000198 -:108D800000014000000090C000000002200810C157 -:108D900080910091808889809000808080001141BE -:108DA0008011001180A011C180C10008800800005E -:108DB00000000000000080800000000000000000B3 -:108DC000000000000000000000000800000000009B +:108D600000000000000100000000000000004010B2 +:108D7000008800101088C08810080010C082080207 +:108D80000884008208100890080200820810000081 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 :108DD0000000000000000000000000000000000093 -:108DE0000000000000000000001141080010000415 -:108DF0009083218800020021000000000000000094 -:108E0000404121210005000000800000008000801A -:108E100089918991030208828980898911110991B8 -:108E2000098002A1841109A1899010821191402129 -:108E3000801000840000000080000080800000009E -:108E400000000000000000000020000000200000E2 +:108DE0000000000004000008000000000000000077 +:108DF00083800000008000008500000000808880E3 +:108E00000080008000800000000000800080008062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 :108E50000000000000000000000000000000000012 -:108E600000000000000000000000020041000811A6 -:108E70001003000020110003A011000000000000FA -:108E800000001080410005114191000080000000A9 -:108E90000000080810C0029091C0084008C01041AE -:108EA00091C0090802C0100988C0090802C0044125 -:108EB0000104080004C0080000020800A0C010C09F -:108EC00000020000000000000000000000000000A0 +:108E600000001008000000080000000000000000E2 +:108E700000000000002100020000000000A080416E +:108E80000080000000C180900080000000A08000F1 +:108E90008000000000000000000000000000000052 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 :108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 -:108EF000010100010288880100829000000000004A -:108F00000000000001400000010001A0100010005E -:108F10001000880003100102C04010820310008876 -:108F2000C010119003100110C040020821109110D0 -:108F3000C10810100810001004A010C0C11000C01B -:108F400010A0100000000000000000000000200041 -:108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000100 -:108F700001010801000088880100A190018900001A -:108F80000000000000000000000101000000408817 -:108F900000A01010A10441001100A08000004109B0 -:108FA000001180C1118341001180A0808000C100A8 -:108FB00091808500118091000080000002009000E7 +:108EE000000000000101000000010000000000007F +:108EF0000000000002000210109008888800021094 +:108F0000080290022000080802C120082000081072 +:108F10000488048800000000000000000000000039 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000010000000000000000000010 +:108F600000000000000000000800000000000000F9 +:108F700000000000000089100020088402109010FA +:108F80000020020808908920002084200920A110D8 +:108F90000020020420040000000000000000000087 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 :108FC00000000000000000000000000000000000A1 -:108FD0000000000020000000000000000000000071 -:108FE0000000000000000000000000000000000081 -:108FF000001010080021001100200241858340105C -:1090000000000000000000000011210321114011A8 -:1090100080000080008089000388080209000303A3 -:10902000C102080005008809028291000980092018 -:1090300084822100090009040000800000008000F3 -:1090400080000000000000000000000000000000A0 -:109050000008000000000000000000000000000008 -:109060000000000000000000000000000000000000 -:1090700000000800081003000311A1028900C000CD -:10908000400000000000000000001009100008006F -:109090001140000000800000000002A10310112018 -:1090A0002101099089881188050102A01010211062 -:1090B000910108A0881009049100C000101010024E -:1090C0000800080088C0880290000000000000002E -:1090D000000000010000000000000000000000008F +:108FD0000000000000000001000000000000000090 +:108FE00000000000000000000010800000001000E1 +:108FF00000000000000000004180008080801080A0 +:109000002000008000000800410000808000040073 +:10901000410000800080008000000000000000008F +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:10905000000000000000000000010000000000000F +:1090600000000000000000000000000010000000F0 +:10907000000000000000000000008002000400006A +:1090800080008002009000000000000800028000C4 +:1090900000800008800500000000000000000000C3 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 +:1090D000000000000000000000000001000000008F :1090E0000000000000000000000000000000000080 -:1090F00000000000010000000100000003012090BA -:1091000091108300000000000000000000830100B7 -:10911000010000000000008200020000880000E062 -:1091200000004842500000E000004842410000E0DA -:1091300000004842600000E00000484200000000DB -:109140000000840000000000000042000000000059 -:1091500000000000810000E00000000000000000AE +:1090F0000000000000000000000000000800200246 +:1091000020100800080088821088020090001008D3 +:109110000208888202001009900888000000000000 +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:10915000000000000000000000000000000000000F :1091600000000000000000000000000000000000FF -:10917000000000000000840000E000004100001139 -:109180000000070042000000000000000000000096 -:109190000000000000000000000007000000F03C9C -:1091A0003C3CBFBF2020F0F03C66BD2DB424FF6CDA -:1091B0006C6C3FFF399966663F30BFBF20BFCCC3A0 -:1091C000CC3C40DFBF208778C33C40DF40DF00005D +:1091700000E000000000000000000000000000000F +:10918000000007004800600000E007008482000043 +:1091900000000700488200000000070048000000AF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F :1091D000000000000000000000000000000000008F :1091E000000000000000000000000000000000007F :1091F000000000000000000000000000000000006F -:10920000D9FF00D9FFFF00000000000000000000AF -:10921000000000000000000000000000000020002E -:10922000F0666666BF20BF203C663C66FF0FF0001C -:10923000006C6C6C366630003F303F30BF20202021 -:10924000C3C33C3C40DFBF208778C33CBF20BF2066 +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E :1092600000000000000000000000000000000000FE :1092700000000000000000000000000000000000EE -:10928000000080FF0080E724E724000000000000C9 -:1092900000000000000000000000000000002000AE +:1092800000000000000000000000000000000000DE +:1092900000000000000000000000000000000000CE :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE :1092C000000000000000000000000000000000009E :1092D000000000000000000000000000000000008E :1092E000000000000000000000000000000000007E :1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:10932000000000003C0F66660F27FFE70F3C6666F3 -:10933000626EF3FF663C0F3CC3C6FFF6CFCFCF662D -:10934000FB08FB0833335A5AFB08FB08F0F0F0998E -:10935000F4D0F4D000000000000000000000000085 +:1093000000000000021020000088108402102000DD +:1093100000881084021020000088108402102000B1 +:109320000088108400000000000000000000000021 +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED -:109380000000000000000C0CCFCF6666666600008F -:109390000000000000000000000000000000C3C347 -:1093A0000C0C999998993C0F3C0F0024F0E40F3C69 -:1093B0000F3C000C919D66660F0F00063C360C0CAE -:1093C0000C6604F704F73333333304F704F70F0F55 -:1093D0000F660B2F0B2F00000000000000000000A4 +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D :1093F000000000000000000000000000000000006D -:1094000000000000000000000CCF0CCF0C0CFCFC96 +:10940000000000000000000000000000000000005C :10941000000000000000000000000000000000004C -:10942000DBDB0C0C9999999940618004802510022E -:109430004061800680211002406180048025100276 -:10944000406180048025100240008000002010024E -:10945000400080000020000200000000000000002A -:1094600000610007800D0000000000000000000007 -:1094700000000000000000000000000000000000EC -:109480000000006100008005000000610026000D62 -:109490000000000000000000000000610006000D58 -:1094A000000000002000000000005F5F0A0A0000CA -:1094B0000000FF0F3C55202CEFEFBE1E0F0F0000E9 -:1094C00000001E1E5F0F00000000000000000000F2 +:10942000000000000000000000000000000000003C +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:109470000000000000000000000000000007000CD9 +:1094800000000000000000000000000000000010CC +:10949000000000610006800D0000000000000000D8 +:1094A00000000000000000100000000000000000AC +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000009C :1094D000000000000000000000000000000000008C :1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:1095000000000000FF0FF0005300000000003430A6 -:109510000000000000000000000000000000AA00A1 -:10952000FFFBFFA200000000000000001F0B1F0B4C -:1095300000000000000F3C552020EFE3141E0F0F29 -:10954000000000001E1E0A0F0000000000000000C6 +:1094F0000000000000000000000000000000FF006D +:109500003C3C0000000000000000000000000000E3 +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B :10955000000000000000000000000000000000000B :1095600000000000000000000000000000000000FB :1095700000000000000000000000000000000000EB -:109580000000000000003F3F30305300FF000000AB -:109590003733400000000000000000000000000021 -:1095A000AB00FB00A2000000000000000000FF0F65 -:1095B0003C55C7F7CFFF000000003028FFEB3F030A -:1095C0007D7DFF3FAF3FFF3C4D4DFFF5FF3C000071 +:10958000FF003C3C00000000000000000000000064 +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B :1095E000000000000000000000000000000000007B :1095F000000000000000000000000000000000006B -:10960000000000000000000035F535055014FABEDA -:10961000000000000F0F000000000000000000002C -:1096200050F0AF00700000000000000000000000DB -:10963000000F3C5500300838000000000028CFEB38 -:109640003F0341410030A030C3004D4D00A0003C1D +:1096000000003C3C3C3C000000000000000000006A +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000000000003A +:10963000000000000000000000000000000000002A +:10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A :1096600000000000000000000000000000000000FA :1096700000000000000000000000000000000000EA -:109680000000000000000000000035F53505501412 -:10969000FABE3E0A3E3E0F0F000000000000000030 -:1096A00000005000AF007D70555500000000000024 -:1096B0000000200020000400200000000000000442 -:1096C000000010100002004000040000000200042E -:1096D0000004000000040000000000020000000080 -:1096E0000000200000400000000000040000000016 -:1096F0000000000300000000000000000000000067 -:109700000000000000000000000000000000010058 -:1097100000000004000000001000000040000000F5 -:1097200000000000008000000000000000000000B9 -:109730000000000000000000000000000000000029 -:109740000000000041000000000141000000000096 -:109750000000000000000000000000000000008287 -:109760002100000000004101000000000002000094 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:109790004000210000000000000021000000000047 -:1097A00004000090000221100000400005000000AD -:1097B00000000002000000000000000000000100A6 -:1097C0002000200020100104400000044000000898 -:1097D0000000001000100000000000000000000069 -:1097E000020000000000020000000000000002046F -:1097F000020000000008000000000000000000005F -:109800000000000000080000024002400240024048 -:109810009040010000409009020000020000020098 -:1098200000000403020000400110000000809000CE -:109830000400000000100000000000820000000092 -:109840002000808280828000200180080001800842 -:1098500000000000000000080000000000000004FC -:10986000000000900000000005000002000000025F -:1098700000080000001000100000000000400084FC -:1098800000080000000000000000000180000085CA -:109890000009004102080001000480840008000063 -:1098A00080840000000880080001080100000040DA -:1098B0000084000000100000001000A100A1008240 -:1098C0000291009100880084208000820082008044 -:1098D000008000890080008800804080028000882D -:1098E000888820859080008090C002800000000061 -:1098F0000080044000000003000000000000000998 -:109900000003000000000000000000000000000054 -:10991000000800000100010091000100200000206B -:10992000C088000000100000900000002008001017 -:109930000000001000210009000000000440004069 -:1099400000400040004000404040114000400040C6 -:109950000040004000400040004000400040804087 -:1099600000400040004000400040004083400304AD -:10997000038203408000000000000000000000009F -:1099800000000000000000000000000000000000D7 -:109990000000000000002000200020002008000837 -:1099A00000A0004000000000110200820000000042 -:1099B000000000000400002000000000000800007B -:1099C0000000000000000000000500000000002072 -:1099D0000000000400A1000000000080000008104A -:1099E000080008C108050000004000000000000059 -:1099F00000000080000000200000000000000000C7 +:10968000000000003C3C3C3C0000000000000000EA +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000001000200088002002000000000000D0 +:1096C00000000000000020000000000082000000F8 +:1096D000000020002000200020004000000040008A +:1096E0000000000000002000000400002000000036 +:1096F00000040002200020002000200020000000C4 +:109700002000000004000002202000800000200053 +:1097100000000000208220802000210020000000A6 +:1097200020020000200000002000000200042000B1 +:109730000000000000000000000200000000000027 +:1097400000000000000400000000000000900090F5 +:109750000002000200000000000200401040000073 +:109760000040000000020000000000000090000423 +:10977000000000000000400000000802000000009F +:1097800000000000000000000000000100200000B8 +:10979000000000024100400400040000200200001C +:1097A00000000000000000000000004000840001F4 +:1097B0000000400000000000000000000000000069 +:1097C0000000000004000000000000000000001184 +:1097D0000000000000000000000000000000000089 +:1097E000000000000200000000000000000008006F +:1097F0000200000000000000000000000000000067 +:109800000000020000000000000000000000000056 +:109810000000020010000400000002000000000030 +:109820000000000000000000000000000000000038 +:109830000000000000100010000004000000040000 +:109840000000040000000000000000000000040010 +:109850000000000004000200000200000000000000 +:1098600000000000000040000000000000000000B8 +:1098700004000400000000000000000000000000E0 +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000400C4 +:1098A000000000000000000002000004000000842E +:1098B0000000000000820088000040080000000056 +:1098C0000000000000000000000020000000020076 +:1098D00000008800000000000000000000000400FC +:1098E0000000000000000000000000000000000078 +:1098F0000000000000000000000000000400040060 +:109900000000400004000000000000000000000013 +:10991000000000009000000084000000910800009A +:1099200020050400000300000000020010000409EC +:109930000000020000000000040000000000002001 +:10994000000000000000000000000000080000000F +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700000200000000000000000000000000000C7 +:1099800000000400000000000000000004000020AF +:1099900000000000002000A0000802001184020066 +:1099A000200080000000418400044088408820049A +:1099B000052002024000000000900088008800009E +:1099C0000000000000000000000000000000000097 +:1099D0000000000000000000000400000000000083 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000400000000000063 :109A00000000000000000000000000000000000056 -:109A10008800010020002000A0000080000000005D -:109A200000800083008000000080008000800080B3 -:109A30000000000000000000000000000000000026 -:109A400000000900000000000000000000A000006D -:109A50000000000000010040000041004140000003 -:109A6000001000080040000000000001000000009D -:109A70000090000000400090000100000000000085 +:109A10000000000000000011000000000004000031 +:109A20000000000000000000000000001000000026 +:109A300000000000080000000000000000410102DA +:109A400000000000000000000000000040000000D6 +:109A50000000412040000200000000000000000063 +:109A600000000000000000000000000000000000F6 +:109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 -:109A9000000000000200801080000084004000C030 -:109AA00000840040004000400000004000400040B2 -:109AB000004000A0000000A00084000000000000A2 -:109AC00000000000000000A0029100000000C01192 -:109AD000400000028802C000840000400003C00271 -:109AE00000040005000440000002000500400000E2 -:109AF00000000011888400400008000000030040BE -:109B0000000000000008000800000000000000083D -:109B10000000000002000200004000002104008557 -:109B2000000005800080012004800088820400007D -:109B3000200000840004001000000000000000006D -:109B4000000000000090110211400240202000009F -:109B50002088042000C00040001000020000000027 -:109B6000008909A000000000800011000000000032 -:109B70000040028200000040000110000000008848 -:109B800000000000000000000000000000000000D5 -:109B9000000000000000800080000001000082C181 -:109BA00020400082204000400220030203400001C8 -:109BB00000008000000400002000000040040000BD -:109BC00000840000408400210021080000080100FA -:109BD00090800100890000009140000000000021F9 -:109BE000C080000088000005000300000000202164 -:109BF00000000000004140110000000800000000CB -:109C0000000800000000000000000000000000004C -:109C1000000000000000000008800000008001003B -:109C20000100010421000180000288210000008859 -:109C30000004000400040004000000100000000004 -:109C400000000000000000210000000000000000F3 -:109C500002000040020002000000020000000000BC -:109C600000000040000000000000000000000000B4 +:109A900000000000000000000000000000000000C6 +:109AA000000000000000000000004100000800006D +:109AB0000008000005008000000010000000000009 +:109AC000080100000000000000000000080008007D +:109AD0000000C00000000000000000004000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B2000000000000000020000040000000000042B +:109B300000000000000000000000004000000011D4 +:109B400000200020000000000000000000000000D5 +:109B50000000000000000000000000000000000005 +:109B6000000000000000000000880000000000006D +:109B700000000000000000000000000000000000E5 +:109B80000000000000000000000000000000008451 +:109B9000000005200000000800000008022000006E +:109BA000040000000040004011A0008200020008F4 +:109BB00000881184119040820588002000820004F2 +:109BC000000011200502000000000000000000005D +:109BD0000000000000000000000000000000000085 +:109BE0000000000000000000000000000000000075 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000002100000000000023 +:109C2000000000002000000000000000000000080C +:109C300000000000000800000011200040030000A8 +:109C4000000088008200000000000000000000000A +:109C500000004000000040000500000004404000FB +:109C60000500110000004100410000000000050057 :109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 -:109C900000000000000000000000004000C0004084 -:109CA0000200020002858200024000010000000064 -:109CB000004000A100A10001000100000000000020 -:109CC000000000A00000000000A091020002008837 -:109CD0001010830200880010080820100111901055 -:109CE0009021080288829040821008090082200991 -:109CF00004A1100800100088A0109004089000082B -:109D0000C010000000000000000000010000000082 -:109D100000000000000000000000000000C0000083 -:109D20008800000000C100000000A00001880021A0 -:109D30000000000001010000C01100000000000050 -:109D400000000000000000000000000020000000F3 -:109D500010000000900000000580000000001021AD -:109D60008011000891008000008080800041000385 -:109D7000002080880080008000008080008080209B -:109D80000020002000000000000000000000000093 -:109D90000000000000000000000000000000008043 -:109DA00002000000000000910911000000032000E3 -:109DB00000A10005000311110003808900110000BB -:109DC0000000000000000000000000000000800013 -:109DD000009000800080804000A180400080808052 -:109DE00088851180A188A00083910380C180000034 -:109DF0000589808011009000028290800000080098 -:109E000020C0800220800000000000000000000050 +:109C900000000000000000000000000000000000C4 +:109CA000090000000000200000000000000000008B +:109CB00000000000000000000000000000000000A4 +:109CC0000082000000000000000000000000000012 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D300000000000000000000000000040000000E3 +:109D40000000C00001000000400000000000000012 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000000000000000000000D3 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 +:109DB000000005000000000000000000000080001E +:109DC00000000000000011000500840000000000F9 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 -:109E20001100410002919100418009000991110047 -:109E30004080218041000980090009A111000091A2 -:109E4000000000030000000000000000000000000F -:109E5000100002C1824088C0100088C0409008C035 -:109E6000089011C0900211C1080010C08810A1C054 -:109E70000800C0C11010848409009111850888026F -:109E8000050090418220C082000000000000000018 +:109E20000000000000000000000000000000000032 +:109E30000011000000080000000000000000000009 +:109E40000000000000080000004100008004000045 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 :109E900000000000000000000000000000000000C2 -:109EA0000000000000000091C000000200000191CD -:109EB00000C000080120A00000C0010000C0010097 -:109EC00000C000000001000000820000000000004F -:109ED000000003020002C088C0A091902010C010B2 -:109EE000888221100111C0A0042009020004C010C2 -:109EF000080909080008C0410809030900410411C4 -:109F0000A0C0C1C0000803028402000000000000DD +:109EA00000000000000000000002000000000000B0 +:109EB00000000000000000000000000000000000A2 +:109EC000000000000000000000008200900004007C +:109ED000A0000000000000000000000000000000E2 +:109EE0000000000000000000000000000000000072 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 :109F10000000000000000000000000000000000041 -:109F20000000000000000011100091C100000001BD -:109F3000100091C1000001024040000000880001B3 -:109F4000200083200000000000000000000000004E -:109F500000000000C100000080000000410080807F -:109F6000808040004111030888108210C1030083E3 -:109F700080880041C1830505908880C1C19000A000 -:109F800000902008410000000800918005000000BA +:109F20000000000000000000100000000000000021 +:109F30000000000000002000000000000000000001 +:109F40000000000000880090008800080000000069 +:109F50000000000100000000000000000000000000 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 :109F900000000000000000000000000000000000C1 -:109FA00000000000000000000083001191890010F3 -:109FB00009031111918940000380C080400008030B -:109FC00005098011919003000000000000000000CE -:109FD000000000000000000000000000000000027F -:109FE000808080800000110008001000030200093A -:109FF00000A1808080088021000000800010800087 -:10A00000808080A1800000A10000802180000000ED +:109FA00000000000000000000000000000000000B1 +:109FB0000000000000000000800000000800000019 +:109FC0000000000000000000000000000000001180 +:109FD0000010000900080000000000000000000060 +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 :10A010000000000000000000000000000000000040 -:10A0200000000000000000000000008000000000B0 -:10A030008280091111000300A020090009000041DD -:10A0400003801011038009108000000080000000D0 -:10A0500000000000000000000200020288109000D2 -:10A06000200110101010200010081188200282001A -:10A07000020120081010820108050808208810013C -:10A0800008101082101184009005080840A11000EB +:10A020000000000000000000000000080000000028 +:10A030000000000000000000000800000000000018 +:10A040000000000000000000000000000000000010 +:10A050000000000000000000000000000000000000 +:10A0600000000000000000000000000000000000F0 +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000000D0 :10A0900000000000000000000000000000000000C0 -:10A0A0000000000000000000000000900008000018 -:10A0B0000000C040000900C001001101000882003A -:10A0C00000010002008909840101C000A000020013 -:10A0D0000000000000000000000000000000000080 -:10A0E00048420000006000004842600000E00000BC -:10A0F000484200000000000048420000000000004C -:10A100004842000000000000420000000000000083 -:10A110008400008200000700000000000000000032 -:10A12000000000000000000000000000840000E0CB -:10A1300000000000410000E00000000000000000FE -:10A140000000000A500000E0000081210000000033 -:10A150000000000000000000000000000030AABA6B -:10A1600000A03CBC202020FFA0A0A0BC0020FFFF3E -:10A17000003CA0BC3C7D3C7DF0FCFFFFFCFEFCFEF7 -:10A18000D7FFC7FF55696569F0F0A5B19633333342 -:10A19000DF2055AA000000000000000000000000C1 -:10A1A0000000000000000000000000000000555505 -:10A1B0005555FFFF0F0FFFFF5555FFFF00000F0F15 -:10A1C000F0F00FF00FF0F0F0F0F0C3C33C3C00F003 -:10A1D00000FF000000000000000000000000000080 -:10A1E000AAAA00003C3C000000FFA0A0A0A0002004 -:10A1F0000020003C003C00FF307FF0D05050F0F0D9 -:10A20000C04000AA00FAAA696A695A4E0F0F9696D2 -:10A21000333310EF55AA00000000000000000000DA +:10A0A00000000000000000000000000000000000B0 +:10A0B00000000000000000000000000000000000A0 +:10A0C0000000000000000000000000000000000090 +:10A0D00000000000000800900000000000000000E8 +:10A0E0000000000000000000000000000000000070 +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F +:10A11000000000000000000000000000000000003F +:10A12000000000000000000000000000000000002F +:10A13000070000000000000000000000000000E038 +:10A14000000000000000000000000000000000000F +:10A1500000000000000000E000000000000000001F +:10A1600000000000000000000000000000000000EF +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A1900000000000000000000000000000000000BF +:10A1A00000000000000000000000000000000000AF +:10A1B000000000000000000000000000000000009F +:10A1C000000000000000000000000000000000008F +:10A1D0000000CF410C410000000000000000000022 +:10A1E000000000000000000000000000000000006F +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A21000000000000000000000000000000000003E :10A22000000000000000000000000000000000002E -:10A2300055555555FFFF0F0FFFFF5555FFFFFFFF0A -:10A240000F0FF0F00FF00FF00F0F0F0FC3C33C3CD8 -:10A2500000000000000000000000000000000000FE -:10A260005D550C001F140F001F140F001F14141451 -:10A270005D0C5500FF1FFF1F8F0DAF05FF5FE30053 -:10A280003C3CFE04FDFC0203BF40AF5055AAD42B5A -:10A2900096C696361FE0FF00000000000000000098 +:10A23000000000000000000000000000000000001E +:10A24000000000000000000000000000000000000E +:10A2500000000000CF7D0C7D000000000000000029 +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000000000000BE :10A2A00000000000000000000000000000000000AE -:10A2B0000000AAAAFFFFAAAAFFFFAAAAFFFF5555FE -:10A2C0005555FF0000FF55AA55AAA5A5A5A55555AA -:10A2D00055550000000000000000000000000000D4 -:10A2E0000000555500000F000F000F000F00141460 -:10A2F000141455005500E000FF00FF0DFF05FF0F8F -:10A30000F300FF3CFF0480C07F3F807FA05F55AA21 -:10A31000F00F96C3963C00FFE01F00000000000015 +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000000000000000008E +:10A2D0000000000000000000000000000000404AF4 +:10A2E000454F0000000000000000000000000000DA +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D :10A32000000000000000000000000000000000002D -:10A3300000000000AAAAFFFFAAAAFFFFAAAAFFFF27 -:10A34000AAAAAAAAFF0000FF55AA55AAA5A5A5A5D5 -:10A35000AAAAAAAA00000000000000000000000055 -:10A3600000000000400080000020100240618007D3 -:10A37000002D10024061800280251002406180069D -:10A38000002D100240618006002D10024061800601 -:10A39000002D100240618006002D00020500002003 +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD +:10A36000E0EAE5EF0000000000000000000000004F +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A3900000000000000000000000000000000000BD :10A3A00000000000000000000000000000000000AD -:10A3B000000000000000406380068021920240E31C -:10A3C00080008021900240618006002D10024061D3 -:10A3D000800080210802A0000000000000000000B2 -:10A3E000000000000000000000000000000000006D -:10A3F0000000000000005F5F5755AA82AABE00005F -:10A40000000000302020000000000030202000006C -:10A4100000000F3F0F0300000000000000000000DC +:10A3B00000000000000000000008050000A00000F0 +:10A3C00000000000000000610007001D0000000008 +:10A3D000000000000000000000000000000000611C +:10A3E0000007000D00000000000000000000000059 +:10A3F000000000000000000000000000000000005D +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C :10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000AA00AAFFC9 -:10A44000553F55300000FFFF000000A00000000055 -:10A450003C3C3C3C82F0BEF00000000000000000EC -:10A4600000000000000000000000000000000000EC -:10A47000000000000000000050505455AA02AAFE3F -:10A4800000000000003020200000000000302020EC -:10A49000000000000F3F0F0300000000000000005C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000FCFC28EB0000000000000000E1 +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC :10A4A00000000000000000000000000000000000AC -:10A4B0000000000000000000000000000000F000AC -:10A4C000F0FF553F5530F03CF03C000000A000008C -:10A4D0000000FF000F0F82F0BEF00000000000003F -:10A4E000000000000000000000000000000000006C -:10A4F00000000000000000000000AC0CAC0C00F0FC -:10A5000055F00000000000A000301400A0F0A0A052 -:10A510000000000000000F030F03C0F0C0F00000B7 -:10A52000C0C00000000000000000000000000000AB +:10A4B000000000000000000000000000000000009C +:10A4C000000000000000000000000000000000008C +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000C0C028EB000000000000D9 +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B :10A53000000000000000000000000000000000001B -:10A54000F0FF3C3CBE14BE140CFC0FFF00000000EA -:10A55000400000004DCF4D0C3A3A3A3A000000005E +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB :10A5600000000000000000000000000000000000EB -:10A57000000000000000000000000000FC5CFC5C2B -:10A58000AAF0FFF00000000000A000301400F5F079 -:10A59000FFFF5F5F000000000F3F0F3FFCF0FCF08B -:10A5A000FFFFCFCF0000000000000000000000000F +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB :10A5B000000000000000000000000000000000009B -:10A5C0000000F0003C3CBEBE14140CFC00F0800007 -:10A5D0008000400000004DCF4D0C303F303F000068 +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000000000000000000007B :10A5E000000000000000000000000000000000006B -:10A5F000000000410000000000110002A00800045B -:10A6000000000004000400000000002020200000E2 -:10A610000000000400000002002100030084400349 -:10A6200000000003000000000000000520000003FF -:10A630000000000000020000000000000000100008 -:10A640002100000000020000000000000080200047 -:10A65000880000000000000000000800000020004A -:10A660002000000000000000000000000800400082 -:10A6700000000000000000000000000000000000DA -:10A6800000000000000100000000000000010001C7 -:10A6900000000000008200000000000000000040F8 -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000000000009A -:10A6C0000000080000000000000000000000001072 -:10A6D00000000000000000000000000080000000FA -:10A6E00000040000000200000000000000008000E4 -:10A6F00000000000000000000000000000000882D0 -:10A700000002000000000000000000000000A000A7 -:10A7100000000003000000000000008003000000B3 -:10A72000048000000000000000000041000800005C -:10A730000000000000000000000000000000000019 -:10A74000000900000005000900000003000290025B -:10A7500000000000000090410041000000000000E7 -:10A760000100001000000000000000000000004197 -:10A770000000000000000000008800000000000051 -:10A7800000040000000000840000000000000088B9 -:10A790000084000800000000000000000020840089 -:10A7A0000000802000000000000000000000000009 -:10A7B000008400C000000000000000000000000451 -:10A7C0000004000000000000000000000000000184 -:10A7D00000110000000000000084001000000000D4 -:10A7E0000010081000000000000000000000000041 -:10A7F000000000000000400300000000000300080B -:10A8000020A1202000044000008089000009884128 -:10A8100000034008C1000000000588000100000896 -:10A820000008002008000000C021C000C000000097 -:10A8300000090409000000000400000800030000F3 -:10A8400000000000002100000000000000000000E7 -:10A850000000000090099000004100000008000086 -:10A8600000000000000000000000002000000008C0 -:10A87000002100030002000900001188000000848C -:10A8800009008020800540C04100000420840004AD -:10A8900000A000A040820420000000000000400052 -:10A8A0000000210005A10804000200820000000051 -:10A8B0000000000000840000000000000000000014 -:10A8C0000000000000000000000000000000000088 -:10A8D00000000000000000880000000800000008E0 -:10A8E00000A00000000000000000000000080000C0 -:10A8F0000008002000000000000000000000000030 -:10A9000000000000008000210000000000000000A6 -:10A910000000000000000400000000000000000033 -:10A920000000010000000040018000000003000062 -:10A930000000000400040004000400000000000007 -:10A9400000000000000000000000000010000000F7 -:10A950000000000000110020004100200000000065 -:10A9600000000000000000000000080000000000DF -:10A970000000000000000100004108210300400029 -:10A98000000040000200020400000040008400209B -:10A990000020000000C0000080080000001000A09F -:10A9A0000000000004C0000400C1024000000000DC -:10A9B0000000000000000000000000000000000097 -:10A9C00000000082000000000000000800000000FD -:10A9D0000000000000000000000000000000000077 -:10A9E00000000000000000000000000080000000E7 -:10A9F0000000000000A000000800000000A000000F -:10AA00000000000000000000900001A000204005B0 -:10AA1000010590000000000000030080008000108D -:10AA20000040000000040200008002000203000059 -:10AA300000210002000000200000000000000000D3 -:10AA400000000000000000000000000800000000FE -:10AA500000000000000000000000000000000000F6 -:10AA60000041000008000000000000000008000095 -:10AA70000008000000000000000800000000820044 -:10AA800040000084008440900904098804044004C4 -:10AA90000220202040040090008840A021200020B7 -:10AAA00000820000200000049120214080008804E2 -:10AAB00040000000000021880000000000A000000D -:10AAC000000000000000000800000000000000007E -:10AAD0000000200000000000008800000000008846 -:10AAE00000000000000280000000000000200020A4 -:10AAF000000000000000000002000000000000A0B4 -:10AB000000000000200020002000000020040020A1 -:10AB100000080000000020000000000400030008FE -:10AB200000000000402040000000008000A00180E4 -:10AB300041000000000000210000000000000000B3 -:10AB400000000000000000000008000000000000FD -:10AB500000000000000000000000000000090000EC -:10AB60000011000000110041004100410000000000 -:10AB70000000000000050003000800210011000093 -:10AB80000000080000000000000000840000000138 -:10AB90000001020000000000800000000000000032 -:10ABA000000000000010000400000000054000410B -:10ABB00002408200000000000000000000000000D1 -:10ABC0000000000000000000000000000000000085 +:10A5F0000000000500002000000000000000000036 +:10A60000000000000000200020000000000000000A +:10A610000402000000002000000000000000000014 +:10A6200000000000000020002000000000000003E7 +:10A6300010002003000000000000000000000000E7 +:10A640000480000000000000200020000000000046 +:10A65000200020000000000000041000000000089E +:10A660002000040000000003200090000000001102 +:10A670000002008410020002000000000000000040 +:10A6800000000000000000000000000000000000CA +:10A6900000080000000200000000000000001000A0 +:10A6A00000020000000000020000000000000002A4 +:10A6B000000000020002000200000000009000C044 +:10A6C0000000002000002104000000000000000243 +:10A6D0000000000010000000100200000002000056 +:10A6E000000000001000000000004000000000001A +:10A6F000000000020002040001200300210000000D +:10A700000400020000000000020000000000000041 +:10A7100084000000100000000000000000000000A5 +:10A7200000000000004000000000000000000000E9 +:10A7300000000000000000000400042000000000F1 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000040000000000F5 +:10A7600000000000000000000000000000000000E9 +:10A77000040008000000000080020404040004003B +:10A780000000000000000408000000080000008233 +:10A790000000008202000000000000000400000031 +:10A7A000000000000000040400000082000000001F +:10A7B000000000000000048404C000000009200024 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000008000071 +:10A7E0000000000000000000000000000000000069 +:10A7F0002000000000040200000000000020010012 +:10A800000000000000000111000900090000000024 +:10A810000000000001000000000000000020000017 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A8400004000000000000000003040001000400F8 +:10A850009000000000000000001140410400204171 +:10A860004000900000008800400040004000400090 +:10A87000880088008400C000800000000000000004 +:10A880000400000000000000040000000000008838 +:10A8900000000000000004000000000000000001B3 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000020096 +:10A8C0000000000000000000000000008000040004 +:10A8D0008200000000000090000000000000000066 +:10A8E000000000400200000000080000000000001E +:10A8F0000588040000000088000000000000C0007F +:10A90000C000000082208200020000000000C000A1 +:10A910000000000000000000000000080008000027 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000100010015 +:10A9400000000000000000000000000000000021E6 +:10A950000000002100009000000000000000000046 +:10A9600000000000000000000000000000000304E0 +:10A9700000000004010005000103030000000000C6 +:10A9800000000000000000000000000000000000C7 +:10A990000000000000000000200003000000000094 +:10A9A000000000880000000000000000000000001F +:10A9B0000000000000000000000000000000040093 +:10A9C0000400000000000000000000000000000083 +:10A9D00000000000000000000088000000000000EF +:10A9E0000000000000000000030000000000000064 +:10A9F000880000000400200020002000A0000000CB +:10AA0000000000000000A00000000000040000039F +:10AA10002000820482004000040040008402000004 +:10AA200000000020000800000000000000000000FE +:10AA300000000000000020000000000000000000F6 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000008EE +:10AA600000000000000000000000000000000400E2 +:10AA7000890020008400000020090002010020005D +:10AA800000000000000000000000000000000000C6 +:10AA900000008000000100008000800080000901AB +:10AAA0000000000000010020000000000000000085 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD00000000090000000000000000400000000E2 +:10AAE000004000000040000000000088000000045A +:10AAF00000900200000200044004C0021100088817 +:10AB00008088A000000000000000A00000030000FA +:10AB10000000A0000000C0000089A1000000840027 +:10AB200040090000000000090000000000000000D3 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000010001000000000003 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB7000000000004000000084008400000001028A +:10AB80000100004100000000000000000000000083 +:10AB9000000000000000000041000004040000006C +:10ABA000080003020000000800002100000000006F +:10ABB0000000000000000000000000000000000095 +:10ABC000000000000000000000000400040000007D :10ABD0000000000000000000000000000000000075 :10ABE0000000000000000000000000000000000065 -:10ABF00000000000000000000000000000000084D1 -:10AC0000000400A080840000000000000000A003F9 -:10AC10000883008910A1000100000001000084C029 -:10AC2000000800848802000001000000000088C0C5 -:10AC300090888808108200000000000000000000DA +:10ABF0000000000000000000000041822000000072 +:10AC00000200200004040000000000000400A0C0B6 +:10AC1000009000A0001011C090880182C08240C145 +:10AC20000140848900010000000000009000000045 +:10AC30000000000000000000000000000000000014 :10AC40000000000000000000000000000000000004 -:10AC50000000000000000000100200C000A088C03A -:10AC600000000400000000010000000000000000DF -:10AC7000021000C0001010040000000000000000DE -:10AC8000021010C000401090000000000000000002 -:10AC90008041001000918003004100080011002055 -:10ACA000008000000080008000000800000000001C -:10ACB0008080800080808080000000000000000014 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC70000000000000000000092008400082088851 +:10AC800090209002008202880000000000008000F6 +:10AC90000080008000000000918080001000008093 +:10ACA00080902120050200040000000000008000C8 +:10ACB0000000000000000000000000000000000094 :10ACC0000000000000000000000000000000000084 :10ACD0000000000000000000000000000000000074 -:10ACE000000000090009000400030000000000004B -:10ACF00000001100000000800000000000000000C3 -:10AD0000000009008000008000000000000000003A -:10AD100000000400021120000511090009000400D0 -:10AD2000041100000000800000800000000000000E -:10AD30000000000080000080808000000000000013 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000040000080008014 +:10AD0000000000000080098080000000000080003A +:10AD1000808000008041000080800010802000883A +:10AD2000808000009000A0C0A0890000000080008A +:10AD30008080000000000000000000000000000013 :10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000004EF -:10AD600080800000800000008000004100000000A2 -:10AD7000000000008000000400808000000000004F -:10AD80000000000080000009008280000000000038 -:10AD900000000000010200010188000000A0000086 -:10ADA0000100000084000400100004900000000076 -:10ADB00000000000000082008888C09000000000B1 +:10AD50000000008000000000000000000000000073 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000009CA +:10AD800000A000800009008280088080000002008E +:10AD90008400C090900082010090C09088018201E0 +:10ADA000A040C090000203000802C0A120002000C3 +:10ADB000840002900000000000000000000000007D :10ADC0000000000000000000000000000000000083 -:10ADD00000000000000000000000000000008400EF -:10ADE0000000A008100008A0A0000800A0010000BA -:10ADF00000000000000008001084C04008C00000EF -:10AE000000000000000040001088C082080200001E -:10AE10000000000000008402010403C082880000DA -:10AE20000100010000001004000890C082880000AA -:10AE300000010001000100000088009088C00000AF +:10ADD00000840000000200000000000000000000ED +:10ADE00000880000000800000000000000000000D3 +:10ADF0000000000000000000000000000000100043 +:10AE00000884204020088800901104910408004024 +:10AE10000002900800C008400008901000C0000028 +:10AE2000C088029003C0A0000140918902C10002C5 +:10AE30002000009000000000000000000000000062 :10AE40000000000000000000000000000000000101 -:10AE500000000000000000000000000000000000F2 -:10AE600008000088000210040000000800C000A0D4 -:10AE70000000000000000000C008002084880208D4 -:10AE8000000000000000000091C000200888881029 -:10AE90000000000000000000000011800500880094 -:10AEA0000000110010000000800000808000808001 -:10AEB00000000002000200080000000500858084F8 +:10AE500000000000080000000000000000000000EA +:10AE6000000000008800000000000000000000005A +:10AE700000000000000000000000000000000000D2 +:10AE800091820020842091200904089084042104E8 +:10AE900000800000800000800080000080000080B2 +:10AEA000000080008080908000110280A0088082D5 +:10AEB0000080000000800000000000000000000092 :10AEC0000000000000000000000000000000000082 -:10AED0000001000000000000000000000000000071 -:10AEE0000000800000000000000000002180090038 -:10AEF000008000000000000000008380008000004F -:10AF00000080000000000000000041000080800080 -:10AF100000000000000000000000A08091028509F0 -:10AF200005030980050009000808000000C10000B1 -:10AF3000000000000000000000008011008280007E +:10AED000000102000000000000000000000000006F +:10AEE0000000020000000000000000000000000060 +:10AEF0000000000000000000000000000000000052 +:10AF000000004100008080000400418000000080BB +:10AF1000108000050009008000008005001100007D +:10AF200080008011002100008000C18510412100B7 +:10AF30001141000500C0008000000000000000007A :10AF40000000000000000000000000000000000001 -:10AF500000000001000000000000000000000000F0 -:10AF600000000000000080000000800021040211A9 -:10AF7000038009000000000000000000001000092C -:10AF80000000000000000000000000000010008829 -:10AF9000000000000000000000000000C1A08200CE -:10AFA0009001910100A0000001000101000000A03B -:10AFB000008400000000000000000000C00188883C -:10AFC00040881000000000000000000000000000A9 -:10AFD0000000000000010000000000000000000070 -:10AFE0000000000000008800A010C004A0000100C4 -:10AFF0000104014000000000000000000000880083 -:10B000008802040210000000000000000000200080 -:10B0100088100410020000000000000000008421DD -:10B0200000E007000000410000E000000000000612 -:10B030000000070000000000000000000000000009 -:10B0400000000700000000000000000000000000F9 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B07000000000000000000A0000000000000000C6 -:10B080000000000007004200000000000000000077 -:10B090000000000007004800000000000000000061 -:10B0A00066F03CFFF3306666000000000000000020 -:10B0B00000000000FBB9622000000000000000005A -:10B0C0003CF0663CFFF06F6F0000000000000000E5 +:10AF500000000001000000410000000000000000AF +:10AF600000000000000000200000000000000000C1 +:10AF700000000000000000000000000000000000D1 +:10AF80000000000000088010000080000008801011 +:10AF9000008000000000000200C00000C0000004AB +:10AFA00010100800C000888800000800C1A08501BA +:10AFB00089889000000000020004000000000000EA +:10AFC0000000000000000000000000000000000081 +:10AFD000000000000001000000010000000000006F +:10AFE0000000000000000000000100000000000060 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000009000100988080200840180 +:10B0100020208802200000810000070000420081FB +:10B02000000007004800842100E007004100818102 +:10B0300000E0070088000081000007000000000019 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000007004100A8 +:10B0600000000000000000000000000007000000D9 +:10B0700000000000000000000000000000000000D0 +:10B080000000000000000000000000000700480071 +:10B09000000000E007004800000000003F30F0F032 +:10B0A000C6C630305AF03C00C3663C0006F6F000DD +:10B0B000C6363030F066F0000000000000C300C368 +:10B0C0000000000000000000000000000000000080 :10B0D0000000000000000000000000000000000070 -:10B0E00000000000000000000000E7816F09000080 -:10B0F0000000000000000F00000000000000000041 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 :10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000066F03C0072726666000000000000DD -:10B13000000000000000FBFB2020000000000000D9 -:10B1400000003CF0663C0F00606000000000000062 +:10B1100000000000000000000000000000003F30C0 +:10B120000000363630305AF03C003C663C00F606F3 +:10B13000F000C6363030F066F00000000000C300BA +:10B14000C30000000000000000000000000000003C :10B1500000000000000000000000000000000000EF -:10B16000000000000000000000000000E781660011 -:10B1700000000009000000000F00000000000000B7 +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF :10B1800000000000000000000000000000000000BF :10B1900000000000000000000000000000000000AF :10B1A000000000000000000000000000000000009F @@ -138048,492 +138048,492 @@ :10B1D000000000000000000000000000000000006F :10B1E000000000000000000000000000000000005F :10B1F000000000000000000000000000000000004F -:10B2000000000000000002102000008810840000F0 -:10B2100000000000000002102000008810840000E0 -:10B220000000000000002D2D00FF000000000000C5 -:10B23000000000000000427E3F3F6E4E6E7E000028 -:10B240000000000000000F663C0FFF660FFF0000CB +:10B20000000000000000000000000000000002102C +:10B2100020000088108402102000008810840000A4 +:10B22000000000666F09003CCFF30F0F6969003C16 +:10B23000663306061E78060609F900FF00FF0000C7 +:10B240000000FF00FF000000000000000000000000 :10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE -:10B2700000000000FFFFFFFF0000000000000000D2 +:10B2700000000000000000000000000000000000CE :10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE -:10B2A00000000000000000000F0F0F0F0000000062 -:10B2B0000000000000000000427E03036242627250 -:10B2C00000000000000000000F663C0F00660F0049 +:10B2A000000000000066096F003C0C3000003C3CD0 +:10B2B000003C663306061E78060606F600000F0FF1 +:10B2C000000000007F00FF00000000000000000000 :10B2D000000000000000000000000000000000006E :10B2E000000000000000000000000000000000005E -:10B2F000000080000000FF7EFFFF000000008000D3 +:10B2F000000000000000000000000000000000004E :10B30000000000000000000000000000000000003D :10B31000000000000000000000000000000000002D -:10B3200000000000000000000000A0610024800573 -:10B3300000000061000480050000000050200000B3 -:10B34000000000610006000D00001061200E004D9D -:10B3500000080000000000000000000000000000E5 -:10B3600000000000000000000000000000000000DD -:10B370000000000000000000000000000061000666 -:10B38000000D0000000000000000000000000000B0 -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000AF3C053C71 -:10B3B000000000007D410F0F0000000000000000B1 -:10B3C0000000000000000000FF0F0000000000006F -:10B3D000FF5F0050000000000000000000000000BF +:10B320000000000000280C9012C0038203280C00CB +:10B3300092C003E3032F8C0D92C003C3032F8C0D27 +:10B3400082C0000000280000000000000000000093 +:10B3500000000000000000000000000000000000ED +:10B360000000000005000A08050000A00000000021 +:10B370000000000005000A08050000A00000000011 +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000010000100614007F4 +:10B3A000000D00010000000000000000000000008F +:10B3B0000000000000000000000000000000E0E0CD +:10B3C000FFFFFFFF00000000000000000000000081 +:10B3D000000000000000000000000000000000006D :10B3E000000000000000000000000000000000005D :10B3F000000000000000000000000000000000004D :10B40000000000000000000000000000000000003C :10B41000000000000000000000000000000000002C -:10B4200000000000000000000000000000002D3CB3 -:10B430002D3C000000003F030F0F00000000000043 -:10B4400000000000000000000000FFFF00F000000E -:10B450000000FF5F0050000000000000000000003E +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000082008A +:10B4400010100000001400000000000000000000C8 +:10B4500000000000000000000000000000000000EC :10B4600000000000000000000000000000000000DC :10B4700000000000000000000000000000000000CC -:10B4800000EA00AA00000000000000000000000028 +:10B4800000000000000000000000000000000000BC :10B4900000000000000000000000000000000000AC :10B4A000000000000000000000000000000000009C -:10B4B0003C3CFF00C7CFF7FF3F3F7D41C7EFD7FFC1 -:10B4C000000000000000000000000000000000007C +:10B4B000000000000000000000000000000000008C +:10B4C000C0F0C050000000000000000000000000BC :10B4D000000000000000000000000000000000006C :10B4E000000000000000000000000000000000005C :10B4F000000000000000000000000000000000004C :10B50000000000000000000000000000000000003B :10B51000000000000000000000000000000000002B :10B52000000000000000000000000000000000001B -:10B5300000000F0F55550008303803037D410028E7 -:10B5400010380000000000000000000000000000B3 +:10B53000000000000000000000000000000000000B +:10B540000000C0F0C0F00500000000000000000096 :10B5500000000000000000000000000000000000EB :10B5600000000000000000000000000000000000DB :10B5700000000000000000000000000000000000CB -:10B58000000000000000008000000000000000003B +:10B5800000000000000000000000000000000000BB :10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000200020114A -:10B5B0002011000000000000001184400000000085 -:10B5C000000920000000000000040000000000024C -:10B5D0000000010400910080000400040000000449 -:10B5E0000000000200000008001000080003000036 -:10B5F000000000000000000500000008000000003E -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000A004100076 -:10B620000000000000000000000000000880000092 -:10B630000000000000000000000000000009000001 -:10B6400000000000000000000000000000000000FA -:10B650000000000008000020004000000000000082 -:10B6600000000000000000000001000000010000D8 -:10B6700000000000000000000000000000000000CA -:10B680000000000000000000210000000000000099 -:10B69000000000001000000000000000000000009A -:10B6A0000000000200000000404000000000801088 -:10B6B0000000000008000088000000800090088062 -:10B6C000400010000000000088094004000800004D -:10B6D000000300030400000000000000000000C0A0 -:10B6E0000021000000000000118811801189110460 -:10B6F0000000000002000000000000000000000048 -:10B700000020020010000000000000000000000205 -:10B710000200000000000000000000000000000027 -:10B7200000000004000000040000000000400000D1 -:10B73000018000000082001000400010000400049E -:10B74000000405000008008800C000088008000010 -:10B7500000040000000480040082000000040008CF -:10B7600000200040000800000084A005A004A00400 -:10B77000A0010000001000000010001000100000E8 -:10B780000010000100000008000000000000004060 -:10B790000000000000000000000000840000000025 -:10B7A0000010000000040008000400080000000170 -:10B7B0000004081000100000000000000004004019 -:10B7C0004040881100080200000040000005000011 -:10B7D00000029000890000009100000000000005B8 -:10B7E00004000000840500009002000900A1000888 -:10B7F00000840000000000000000000000080005B8 -:10B800000000000000000008000000080021000502 -:10B8100000004000000000080000200000080000B8 -:10B82000A0000000400004000400000040210200CD -:10B8300000000005040500000000000000000001F9 -:10B840000000000011000000800000000000000067 -:10B8500000000000000004000000040000000008D8 -:10B8600000A08002000000000000009000A000087E -:10B8700000010008000000000000000000000000BF -:10B8800000000000000000000000000000000008B0 -:10B890000000001000020010000000000000000086 -:10B8A00000000020000000C000A0200000A000C098 -:10B8B00000002000000000C0A02000080008014196 -:10B8C0008205C00500080400100500000003000800 -:10B8D000000000410100400000050000000000C120 -:10B8E000A008A021A0000940000000000000000006 -:10B8F0000084010001200020000000200010004111 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B9200000000000002000000000000000000000F7 -:10B930000000000000000000001000904100000026 -:10B94000080000000000118241000000000000C05B -:10B95000200000000000080080000020050000001A -:10B96000000241A10900000840010082008400009B -:10B970000000020804080485030100000000000024 -:10B980000000000000000000000000100082000025 -:10B9900000000000000000000000000000000000A7 +:10B5A000000000000000000000000000000040005B +:10B5B0000000000820000000000000000000000063 +:10B5C00000000000018011800180418020112005D1 +:10B5D0004000400020000000000000008800000043 +:10B5E00000000000000020000000200000032000F8 +:10B5F00020002000200384000003000088030000D6 +:10B6000000020000000010002000000000002100E7 +:10B610000080008820808880C085008088914091CB +:10B620000080008001800000208000040080000075 +:10B630000082000000000000000000040040000044 +:10B6400000000002000004049020200420408084B8 +:10B65000000080008000000000000000000040406A +:10B6600000000000000000040000000400000000D2 +:10B670000000000000020000000000000090000038 +:10B6800040000000004000400040000008400090E2 +:10B69000209000040004400420040004400400043E +:10B6A00021200020002004200000000400010020D0 +:10B6B0000000000002000200040004050400040071 +:10B6C00000000400000004000000050001800000EC +:10B6D000A00000000321840000000000040002001C +:10B6E0000000020000000200020002000000020050 +:10B6F000000000000000000002000500050020001E +:10B7000001000000020000000000000000008200B4 +:10B71000020000000000000000000000000008001F +:10B720000210200020002000200000000000000087 +:10B7300005000000000000000008000000000000FC +:10B7400002000000000000000000000004000420CF +:10B7500002000000000020000408000000000000BB +:10B7600004000000000000000000000000000000D5 +:10B77000000000000000000000000008200020A0E1 +:10B780008000200000080000000000000000000011 +:10B790000000000000000000200000080000000879 +:10B7A000000000008008800084008000001000007D +:10B7B0000010400040000000000000400010002188 +:10B7C00000210021000300050000000000202020CF +:10B7D0000404004000000000000900000000000315 +:10B7E0000000000000080040000900000000040004 +:10B7F0000000002000000000000000000200000027 +:10B80000000000000000000000418405000000006E +:10B810000000000000000000040004004000900050 +:10B8200000009000400090004000840040408400F0 +:10B83000200288000000000000000000000000005E +:10B840000000000000000000030003A00300080146 +:10B850008801800100010000008800000040000015 +:10B8600000000000000000000000000000000000D8 +:10B870000000000000200000000000000000100098 +:10B880000000008200000000000000000000000036 +:10B8900000000000000000000000000000000000A8 +:10B8A0000900000011044000090000001100408858 +:10B8B0000402009040000088000004000800080016 +:10B8C0000000000082008200000000000000000074 +:10B8D00000000000002000801100010001000100B4 +:10B8E0000000000000000000004000000000000018 +:10B8F000000000040000040000000080000000219F +:10B9000000800900008800000000000000410005E0 +:10B910000000820000002000080000000800000075 +:10B9200000000000000082008400000000400000D1 +:10B93000000004000400820021000000000000005C +:10B9400000000000000000000000000000000000F7 +:10B950000000410000000001004020002000200005 +:10B9600020000000000000000000000000000000B7 +:10B970000000050000004100000000000020110050 +:10B9800000A000042000000400000000000000C02F +:10B990000000000000080000200800000000000077 :10B9A0000000000000000000000000000000000097 -:10B9B000000000000900090000080901820084005D -:10B9C000A00000000021A00000000000C00000094D -:10B9D0000000000020000041000000000080051170 -:10B9E00000200421001002000400000000020011E9 -:10B9F00000020009000000000000008800000000B4 -:10BA00000000002100000000000000000000000015 -:10BA1000000000000004000000000000000800001A -:10BA20000000000000000000000000000000000214 -:10BA300000000000000000000000000008000000FE -:10BA400000C00088000040C000040004090000C0DD -:10BA5000200000C0050000C0009000001100002080 -:10BA60000800002100000000000080A000100090ED -:10BA70000000000000000000000000840009000039 -:10BA800000000000000000000000000000000000B6 -:10BA900000A0001000840000000000000008000862 -:10BAA00000000000000000000000008200A000A0D4 -:10BAB0000000000000000000008400842084A084B6 -:10BAC0001000820502000800002100200000002074 -:10BAD0002002000200000000002000000000000022 -:10BAE00008200800082100000188010401000089E5 -:10BAF000010000400180080000A1000800000000D3 -:10BB000000000021000000410000000000000000D3 -:10BB1000000000030000000000000000000000081A -:10BB200000000010200000000000000000000000E5 -:10BB30000000000000000000000000000000000005 -:10BB4000008000000000004000000000000800002D -:10BB500000000000000000040000000000000000E1 -:10BB60000000000900000008410804204000048291 -:10BB70000308080005000202000000200001050083 -:10BB800000000000000000000000000000000000B5 -:10BB90000000000000000000004000000000004025 +:10B9B00000882100800080000300040000000003D4 +:10B9C0000000000000218200000000002000820032 +:10B9D0000000000000000000000000040010000350 +:10B9E00000000000901100000000000400080000AA +:10B9F0000000C00000000000000000000000000087 +:10BA000000000000000000000000000900000040ED +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000900000002000000066 +:10BA3000040000110000A00020002000020000000F +:10BA40000000000000000084090000001100024016 +:10BA5000030040A0080408002100020008030001C0 +:10BA600000000000210000000000000000000000B5 +:10BA700000000000000000000000000000000000C6 +:10BA80000000000000000082000000000000000034 +:10BA900040040088000000040000000002000000D4 +:10BAA00011000000000000000000008811000000EC +:10BAB0001104090011000990400491029184058845 +:10BAC0000021002100000000000000000000000034 +:10BAD000C01190000000000000002008000090004D +:10BAE000000000000002000000000008000000212B +:10BAF0000000000000000000000000000000000046 +:10BB00000000018001800184018000020002000425 +:10BB100000040000000000000000000000002004FD +:10BB20000000000000000000000084000000000091 +:10BB30000800200000000000000008000000048051 +:10BB40008200000000200000000000000000000053 +:10BB500000000000000000000000000000010000E4 +:10BB600000000000000000000000000000000000D5 +:10BB70000000004000000000000000000000008401 +:10BB800000000000202004042021202000000000EC +:10BB9000000100010800000000002000000000007B :10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000001000080008000400080240842063 -:10BBD00000A0044000000000000000000000000081 -:10BBE000840000004190C0880210820800C001401B -:10BBF0001002209000000000000000000101010080 -:10BC0000C001000000000000000000000000000073 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC40000000000000000080008000800080800074 -:10BC500000001080800000000000000000000005CF -:10BC60001002800000408800210000808080028057 -:10BC700020808080000000000000000000001141D2 -:10BC800009218908000800000000000000000000F1 -:10BC900002000000000000000000000000000000A2 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC00000000000000000000000000200800000F2 -:10BCD00000090085808500000000000000000000D1 -:10BCE0000000000000000083000000098004000044 -:10BCF000030088080820C1884100100305201000B7 -:10BD0000090041000011418900000000000000000E -:10BD10000000000080008000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000400010A3 -:10BD5000000082001002848282029000000008002D -:10BD600000000040000000000010900020001005BE -:10BD7000840088008300C101C1900000010001001F -:10BD800000900000004000010105000000000000DC -:10BD90000000000002001000400010000000000041 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC000000000000000000000000000040000006F -:10BDD0000000820090200890000203A000000000F4 -:10BDE00000000000000000000100000004840004C6 -:10BDF000000508A04020A00890200282000000005A -:10BE000000000000000100004100010100000000EE -:10BE10000000000000000000000000000000000022 +:10BBB00000000082800000000000094000004000FA +:10BBC00080200000000000000000000000000000D5 +:10BBD00000000000000000000000000000C185908F +:10BBE00010100002010010004100000000000000E1 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000A00000000000000094 +:10BC10000000010000000000000000000000000023 +:10BC20000000000000000100000000000000000013 +:10BC300000000000000000004000010000000100C2 +:10BC40000000910000000000000000000000000063 +:10BC50000000000000000000000000000000209133 +:10BC600009C1809100840800880090000000000055 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000002000000B2 +:10BC9000000000000800000000000000000000009C +:10BCA0000000000000000000080000000500000087 +:10BCB000000000004000000008000000100000002C +:10BCC000200021000400000000000000000000002F +:10BCD0000000000000000000000000000000000064 +:10BCE000C18020401191900010081041030802000B +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000090000000327 +:10BD10000080001000000011000000000000000082 +:10BD200000000000000000000000001000000041C2 +:10BD300000000002000000080000000300000003F3 +:10BD400000000000008000080080000000000000EB +:10BD500000000000000000000000000000000000E3 +:10BD600000000240C101028311000101000101A194 +:10BD700000000000000000000000000000000000C3 +:10BD8000000000000000000000000000000000882B +:10BD9000000100080000000000000000000000009A +:10BDA0000000000000000000000000000001000092 +:10BDB00000000000000000000000000000000088FB +:10BDC00000010088000000080001000800000000D9 +:10BDD0000000000000000000000000000000000063 +:10BDE00000000000400091119091A1A100004000CE +:10BDF000C001000100000000000000000000000081 +:10BE00000000000000000000000000000000000032 +:10BE10000800080001000000100000000000000001 :10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE40000000000000000000000000000000800072 -:10BE5000000000000000000080000080C1800000A1 -:10BE60000000000000000011401005091110000939 -:10BE700000100008008280918021801080910000D5 -:10BE80000000000000004008000009081141000007 -:10BE900000000000000000000000000000000000A2 +:10BE300010000000000000002000000001000000D1 +:10BE4000A000C00000000001C0014001000100008E +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000080058989C08591C1001094 +:10BE7000800900030910000000000000000000001D +:10BE800000000000000000000000000000000000B2 +:10BE90001000800080004100000000000000100041 :10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED00080008000800080008000000000000000E2 -:10BEE0000000000000000000214008004100400068 -:10BEF0000002804000808000419100908800204036 -:10BF000080000000000000084182110808001110A4 -:10BF10000000000000000000000000090000000018 +:10BEB00000000000000008000000800000001000EA +:10BEC000050000008000030009408010802000026F +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000A10091400380210339 +:10BEF00000008011000000110000000000000000A0 +:10BF00000000000000000000000000000000000031 +:10BF1000000000000002000000000000000000001F :10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000400080004000800040082044004FB -:10BF6000400000000010000000000100010000007F -:10BF700000008400A089C090820011912088A1C097 -:10BF80000801C01000008800820101880100000043 -:10BF90000001000000000000000000000000001090 -:10BFA0000088000000000000000000000000000009 +:10BF300000000000000000000000000800000000F9 +:10BF4000000000000002000000000020004000008F +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000900088A04108D0 +:10BF7000110102080401820082010000000000009B +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 :10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD00000C000000000000000000000410000E080 -:10BFE0000000000A00000000000000000000000047 -:10BFF0000000000000810000070000000041000078 -:10C00000070000000000000000000000008100E0C8 -:10C010000700002100000000000000000000008177 -:10C020000000070000000000000000000000000009 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C05000000000000000FFF80000000000008282E5 -:10C0600082825F435F430000000000000000000088 -:10C0700000000000000028FFA0F520E02FEF3C3C6E -:10C080003C3CF0F0F0F03333F0F000000000000032 +:10BFC000000000000000000100000000000100006F +:10BFD0000000000000000000000000000000000061 +:10BFE000000000000000000000000000884100E0A8 +:10BFF00007000000000000E0000041000000000019 +:10C000000000000000000000000000000000000030 +:10C01000000000000000000000E00700000A00002F +:10C0200000E0000000000000000000000000000030 +:10C03000000000000000000000E000000000000020 +:10C0400000E000000000880000E00700000600009B +:10C0500000E00700420000000000000000000000B7 +:10C060000000000000000000000000000000F0F0F0 +:10C07000F0FFF000F0FF05000500000000000000E8 +:10C0800000000000000000000000000000000000B0 :10C0900000000000000000000000000000000000A0 :10C0A0000000000000000000000000000000000090 :10C0B0000000000000000000000000000000000080 :10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000FFC800000000000099 -:10C0E0002C0CECFF00005F4300000000000000008B -:10C0F000000000000000000000D7A0F52020EFEFB6 -:10C10000F000F0FF3C003CFF33330F0F0000000055 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F000D0D0D0FFF000F0FF0E0E040400000000CE +:10C10000000000000000000000000000000000002F :10C11000000000000000000000000000000000001F :10C12000000000000000000000000000000000000F :10C1300000000000000000000000000000000000FF :10C1400000000000000000000000000000000000EF :10C1500000000000000000000000000000000000DF -:10C16000000028287D75FFFFFFFF0000000028EB7E -:10C1700028EB00000000000000003535353C8FFF43 -:10C18000CFFFFFC34D4D3F037D7D00000000000049 +:10C1600000000000000000000000000000000000CF +:10C170000000570C1717C3C3C3C300000000000022 +:10C1800000000000000000000000000000000000AF :10C19000000000000000000000000000000000009F -:10C1A0000000000000000000DFD7CFC30000000047 +:10C1A000000000000000000000000000000000008F :10C1B000000000000000000000000000000000007F :10C1C000000000000000000000000000000000006F -:10C1D00000000000000000000000000043FF40FFDE -:10C1E0000000000028285575FDFD7DFF00000000BF -:10C1F00028EB28EB000000000000000035353C3C37 -:10C200000D000C003C004D4D3F034141000000007B +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000005F001C1C03038380000000009F +:10C20000000000000000000000000000000000002E :10C21000000000000000000000000000000000001E -:10C2200000000000000000000000CFC3EFC30000CA +:10C22000000000000000000000000000000000000E :10C2300000000000000000000000000000000000FE :10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000FFFFFFFF0000E2 -:10C2600030000000000000613007800D0000000079 -:10C2700000000000000100610006000D00000061E8 -:10C280000026000D000000615026000D0008A0618E -:10C290000006000D000005000A29050000A00000AE -:10C2A000000000000000000000000020000000006E +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C27000000000000000006120208000000100613B +:10C280000007000D0000000000000000000000009A +:10C29000000000000000000000000000000000009E +:10C2A00005610A0F050D00A000610007000D0000E8 :10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000015D +:10C2C00000610007000D000000610007000D000084 +:10C2D00005610A0F850D00A005610A0F050D00A07C :10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000E4A5A5A56B -:10C3000000000000FFBFFFFF0F0F3C3C0EF10FF0DD -:10C310000000000000000000FC0C3F3F3CFFAA3C76 +:10C2F0000000000000000000FE3C0500F2F228F201 +:10C30000000000004D4D4D4D0000000000000000F9 +:10C31000000000000000000000000000000000001D :10C32000000000000000000000000000000000000D :10C3300000000000000000000000000000000000FD :10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C370000000000000000000000005002D2827A597 -:10C38000A5A500000000FFFFFFFFF0F0C3C34FB002 -:10C390000FF00000000000000000FC0C30303C00FA -:10C3A000AA3C0000000000000000000000000000A7 +:10C350000000000000000000000000000000DA8A79 +:10C36000D08000000000000000000000000000007D +:10C3700000000000000000000000FE3C050028282E +:10C3800000FA00000000FFC33C00000000000000B5 +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D :10C3B000000000000000000000000000000000007D :10C3C000000000000000000000000000000000006D :10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F0000000000000000000000000008296001411 -:10C40000000000000000000000000000000000002C -:10C41000303FAFAF00000000C33CC33CCF0C3F3FF8 -:10C42000BEBE7878000000000000000000000000A0 +:10C3E000DF8FD58500000000000000000000000085 +:10C3F000000000000000000000000000575F0C007B +:10C400000C9C0094000000000C0CFCFC00000000E0 +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C :10C4300000000000000000000000000000000000FC :10C4400000000000000000000000000000000000EC :10C4500000000000000000000000000000000000DC :10C4600000000000000000000000000000000000CC -:10C470000000000000000000000000000000AABE54 -:10C48000283C000000000000000000000000000048 -:10C490000000303FA0A0000000008778C33CCF0C14 -:10C4A000030314147878000000000000000000006E +:10C4700000000000000000000000000000005F5FFE +:10C4800000000C9C009400000000A0AFA0AF0000D2 +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C :10C4B000000000000000000000000000000000007C :10C4C000000000000000000000000000000000006C :10C4D000000000000000000000000000000000005C -:10C4E00000000000000000000000000000080080C4 -:10C4F0000002000000000005000000000000000035 -:10C5000000000000000000030041000000000003E4 -:10C51000000000000000000000000009000400000E -:10C520000080000000000004000100000000000086 -:10C5300000000000000000000000000000000000FB -:10C5400000000002000200000000000000000000E7 -:10C5500000000000000000000000000000000000DB -:10C560000000000000000400008200000000000144 -:10C57000000800C0000000000000000000C0000033 -:10C5800000000000000000000084400000000000E7 -:10C590000000000000840000000000000000008295 -:10C5A0000000000400000000000000000500000082 -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000001000000000004B -:10C5E000000000000000000400040010008001882A -:10C5F00000880004008300000080A0800004000088 -:10C6000000008400000900000080100000082008DD -:10C610000000008000000000000000000000840016 -:10C6200000000000000000030010000400000003F0 -:10C6300084008405000000000000000000000000ED -:10C640000000100000000041000000000000020097 -:10C6500000000000000010000200000000000000C8 -:10C6600000000000000000000000A000080000041E -:10C670002005000500090004000200040004000079 -:10C680000008050000040004000400040004000089 -:10C69000800400000004000200820000008200000C -:10C6A00000820088000800C000C000C0030900002C -:10C6B000001000840000008800100010000000003E -:10C6C0000000000008000090000000840000081036 -:10C6D0000000000000000000000000100000000842 -:10C6E0000000000000880000000000000000800042 -:10C6F000100000A100418808000584838805040318 -:10C700000400402184099002C00520802008000810 -:10C71000000000210109000040110000000000118C -:10C7200084C100C101210000000300400005000297 -:10C73000000000020000000900020041000000406B -:10C7400000040000001000100000000000000000C5 -:10C750000010000000030000000000000040000086 -:10C7600000000000000000000000000000002000A9 -:10C770000000839005080000002100000004000074 -:10C78000090000020008000000000004044000004E -:10C79000008200A00082402009080510021011004C -:10C7A000002000400040408400000082000000841F -:10C7B0000001000000000000000000010000000077 -:10C7C00000000000000000A00008000000000000C1 -:10C7D0000000000000000000000800000000002031 -:10C7E00000000000000000000000000000840000C5 -:10C7F000000000000040004000400040008800852C -:10C8000000400040004000400088004000840105D6 -:10C8100010400040C04020400183014000000089DA -:10C82000004000C0014000800080008000030091B3 -:10C830000085000000000000000000000002004031 -:10C84000000800400021000000000000001100006E -:10C8500000000011000000000000000000000000C7 -:10C860000000000000000000000000410000001176 -:10C8700000000000000000830009000100A100404A -:10C88000004000A10009001100850040080100419E -:10C890000208000940030091859140402091000862 -:10C8A00000400005000340A100400040004000A0FF -:10C8B00000040004008400000002001000000010CA -:10C8C00000000008020000A00000000000000000BE -:10C8D00000000004000000040000000000820000CE -:10C8E0000000001000000000000000000000000038 -:10C8F000000000000000000040052000000800C00B -:10C900000005840000050021020984218821000817 -:10C910000008040020400002004001000002200046 -:10C9200084024041404004409000014100059002D3 -:10C9300000200000002004000000000200000000B1 -:10C9400000410000000000000000000000000000A6 -:10C9500000000000000000000000000000000000D7 -:10C96000000000080040000000000000000000007F -:10C9700000000000000000000000000000000001B6 -:10C9800000081100000004C0412000000000000861 -:10C99000050000004000800300A00004200800A162 -:10C9A0009108000080408289008903A0100041A006 -:10C9B000009100010008000180A0000000000000BC -:10C9C000000005000000000000000008000000005A -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000002080012175 -:10CA0000012188C000050008000500000103002185 -:10CA10000021000020A101030100C1020041842186 -:10CA20000021010000C10188000010050021004123 -:10CA30000021C02101000009002100800000000049 -:10CA40000000002100410000000000000000000084 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000200020008008EE -:10CA800010001000000521820882200021A0020071 -:10CA90000082000000828004400820084009090844 -:10CAA000009000C002900040020800008088000052 -:10CAB000100000000000200404000000201000000E -:10CAC0000000000000000000000000000000000066 -:10CAD000000000000000000000002004000420000E -:10CAE0000000004000000500000000000000000001 +:10C4E00000000000000000008805000000000000BF +:10C4F0000200880020000200020002000200020484 +:10C500000400200020002000200088000400880093 +:10C51000000020002000000000000000400000009B +:10C5200020002000000000000003000000052000A3 +:10C5300020000000840000000000400010402000A7 +:10C540000000200000008800000020800080208281 +:10C5500000808800200000000803200088032000DD +:10C5600008002011000020008400000000000000EE +:10C570000000800000000000800080008002800237 +:10C5800080020000000200000002000000008002A3 +:10C590000000000000000000000000020000000099 +:10C5A0000000000200000000000000000000000089 +:10C5B00000000000000000000002000080000000F9 +:10C5C00000000000000000020002000080200020A7 +:10C5D0008020002040020000000080900020000029 +:10C5E0000040800041C0000000000000000000008A +:10C5F0000000040000000200000000200000000015 +:10C6000000000000000000000000000084000400A2 +:10C61000000000000000000000400000000000409A +:10C6200000000040040001000002000000000000C3 +:10C63000040000000000000000000000A0000480D2 +:10C64000040010890000000000000000000000004D +:10C6500000000000000000000000000000000000DA +:10C66000000000000000000000000000000900843D +:10C6700000000000000020908000000020820000E8 +:10C68000000000080400000400000000000000009A +:10C690000010000000000000000000010000000881 +:10C6A0000001000800010000400000000000000040 +:10C6B00000000000000000000000008800000000F2 +:10C6C00000020000800800000008000000000000D8 +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000080004000000102E +:10C6F0000020000000008400000020002000000056 +:10C700000008000090000000000000000000000091 +:10C7100000210000000500000000000500210000CD +:10C7200001020003000400000000000000410000BE +:10C730000000000000000000100000200020200089 +:10C74000000000200009C020200000008800000038 +:10C7500000080000040000000000040000000108C0 +:10C76000880089008400900088098404C0092000A2 +:10C7700000000088000000200090000080888000F9 +:10C78000000008000000000000C0000000000000E1 +:10C790000000000000000000000400400000000055 +:10C7A0000000020000000000000000000000000087 +:10C7B00000000000000000000000000000850001F3 +:10C7C0008500002000010090000100200000000012 +:10C7D00000000000020010000000100000000082B5 +:10C7E00008000000020000000020400021001100AD +:10C7F00002001100000000000002000002400004DE +:10C80000A04000400040A0400040084002400040DE +:10C8100000400104C1C0C040C0C00040824002408E +:10C82000C0400840A040C0030140C04000000000DC +:10C830000800080000000800080000000000A00038 +:10C840000000A000000000000000900300000400B1 +:10C850000000000000000000A00008020803C00063 +:10C860000000C00002000000000082008200820080 +:10C87000080082000800000000080000000083019A +:10C88000000000010001410141010001050180019A +:10C890000401000102010421000100210001000146 +:10C8A0008001000100010001000002010001000000 +:10C8B0000000000000000000000000000000000078 +:10C8C00000000000000000824100000000000000A5 +:10C8D0000000000000000000000000000000000058 +:10C8E00000000000000080000000000000000000C8 +:10C8F0000000800000008000000000000000000038 +:10C900000100020002000280000000000000000898 +:10C910000000020002000200008400A000000308E2 +:10C9200002000200020002008204820408000808DB +:10C93000000882004000A000000000000009000084 +:10C9400000030000080308208220002000200002CD +:10C9500000000000000800000000000020000000AF +:10C96000200000009000000440002020000440044B +:10C970000209000010040000900000000000000008 +:10C980000000200080008000800400000000000003 +:10C99000000100848000830080000041092102A082 +:10C9A0008405C000800080008000000100010000BC +:10C9B000001100000000000000000000000000C0A6 +:10C9C0000000000000000000000100A100010001C3 +:10C9D00000210000002000000000000000888020EE +:10C9E0000000910000900020400409004004032052 +:10C9F00040048520059010880002410000000000DE +:10CA00008800000000000800000005000004000489 +:10CA100000080000010000A10100000000840104E2 +:10CA2000000800200880010502C00100080009116B +:10CA300082080200000000008200100000000803CD +:10CA400000021021000000200020820300050002E7 +:10CA50000000000500200000080000210000000088 +:10CA6000000000000000000000000000000088003E +:10CA7000020400000005000000002000004000004B +:10CA8000000000000000000000000000020000099B +:10CA900000010009210020000004200000000040E7 +:10CAA000020100010001000420080004200004002D +:10CAB00002000001800000000000000000000000F3 +:10CAC0000000000100000000000100010000000063 +:10CAD000000000000000000100080000000000004D +:10CAE0000000000000000000000000000000000046 :10CAF0000000000000000000000000000000000036 -:10CB00002109890288029082090800880108101012 -:10CB1000080810020088829004021009100802918F -:10CB200010891002A003C004A0910390C008101047 -:10CB30000221A00500020488000091000800000006 -:10CB400000000000000002000000000000000000E3 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB8000000011C189210410009010800000408035 -:10CB900080800080800000008900000041A10088A2 -:10CBA00000021041000800038091104102058083BB -:10CBB0008080A041000411008020110088009000B6 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC0000000000009000899091A0418980038089F4 -:10CC10008010000000008090008000801080058857 -:10CC2000A0118888848009A1C09084100900029115 -:10CC30004100028040000021830041000003000009 -:10CC400000410000000000000000000000000000A3 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 -:10CC8000000000000000080040C1091009C10800B0 -:10CC900008C040902082900010C1028202C0C19062 -:10CCA00003C0829102C1081090C085C0081188009D -:10CCB000900490A09082200010848204A1100001B2 -:10CCC000008400000084000000000000000000005C -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD0000100010000000020003080003C10211110E -:10CD1000210882888208039011080002C0880282DC -:10CD200003020108C0081010032001028302C12180 -:10CD3000A0C0009120088503032000040803848319 -:10CD40000100C0008400000000000000020000019B -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000C18000038910C6 -:10CD900091C1418000008080C100C18000008000FE -:10CDA0008080C1020889A0890010C11111210508E5 -:10CDB00091109020040800C08841C1040040C110B7 -:10CDC0008041041180110003410500000010800023 -:10CDD0000008000400000000000000000000000047 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE0000000000000000000000000000C1800811C8 -:10CE1000100083008002004180800000800800A094 -:10CE2000000000000209898089801002802108002A -:10CE3000090011404100C0808489112080028020B7 -:10CE400000090003000200030000000000000000D1 -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE80000000000000000000000000000000898891 -:10CE90000303020211000800888908082000080026 -:10CEA000022088882000020008080808100104C138 -:10CEB000020203880801910809080909C0018801D4 -:10CEC00008040203C0010000000000000000000090 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000088000099 -:10CF1000000000E000004842810000E0000048827C -:10CF20000000000000004842810000E0000048428C -:10CF3000820000E0000048820000000000000021A4 -:10CF40000000000000006000008100E00700820097 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000FFFF43FFF6F6E66636363C36FFE656 -:10CFA0000026FF3CBC3C76764646FF66E666767613 -:10CFB000F676BDFF2400FCFC0C0CC3009000C0C939 -:10CFC000CFC9009966FF0989C989000000000000E7 -:10CFD0000000000000000000000000000000000051 +:10CB0000000000000000000000C008000008000055 +:10CB100001C100000000000000C00000000800008B +:10CB200001C100000000000000C00000000800007B +:10CB300001C1020000000001020888900002828901 +:10CB4000000003C1204100C190050000000000006A +:10CB500000000001200100010001000000000000B1 +:10CB600000000000000001000000908810200090EC +:10CB700010829002888400889088002000040002BF +:10CB80000040000000000000000040800000058020 +:10CB9000000009C1210302030000008000000280A0 +:10CBA000000009C121030903000000800000028089 +:10CBB000000009C1A1100503000380840009008959 +:10CBC00080100000A0400008004000C000000000ED +:10CBD0002000000011418021000800030000000037 +:10CBE0000000000000000000020000001100808032 +:10CBF00000008880008000800000000000000080AD +:10CC00000080000000000000000000000010800014 +:10CC100000038000008082000980C10000088000BD +:10CC200000088000008082000980C10000028000AE +:10CC3000000280000080900009C0C10000800091C7 +:10CC4000800980800000040009A189008983000018 +:10CC5000000000090000408041000508200000009D +:10CC600000000000000000080000000800000000B4 +:10CC70000082800000808000001080100080000092 +:10CC800000000000000000000000000000000001A3 +:10CC900010000001C000000288000190C1000001E6 +:10CCA00010000001C000000288840190C110000142 +:10CCB00010000001C000000288000191C100404046 +:10CCC00010C0040310C0000082A090C0088208C1F8 +:10CCD00000000088000000100002008400010184B0 +:10CCE0000000000000000000000000900000009024 +:10CCF0000200100840029008400020850211200820 +:10CD00000000000000000000000000000000000023 +:10CD100000008808000001C088000001008401C1F3 +:10CD200000004008100000C089000001028401C119 +:10CD300000008200001001C088000001008401C1D1 +:10CD400003040004C08808900001210201A0C1A0D2 +:10CD5000A1400000000008000000000000000500E5 +:10CD6000000000000000000000000100200008009A +:10CD70000000C110002004081090890800208410D1 +:10CD8000C120A00000000000020000000000000020 +:10CD9000000000000080000008808002000941803F +:10CDA00011C1000080808000098084020009418058 +:10CDB00011C1000000000080028080100009008086 +:10CDC00011C1C1801080C1000000000141000300BA +:10CDD000A10020002000000000000000040040002E +:10CDE00009000000000000000000000010008000AA +:10CDF0000000080041800080000080004100000029 +:10CE0000808084000000000000008000000000001E +:10CE1000000000008000000000000000C1022100AE +:10CE2000000040098000800000000000C1022102D3 +:10CE3000000040098000800000000000C1102100B7 +:10CE40000300000921100800088040000001A191A2 +:10CE50002180910008110000000400000000031070 +:10CE60000320000040000000000000000000000857 +:10CE700000400000000000100010008000000000D2 +:10CE80000020000000000000000000000000000082 +:10CE90000000000000000800000000000000C100C9 +:10CEA000000000000001C000100000000000C100F0 +:10CEB000000000000001C000100000000000C100E0 +:10CEC0000000000000010300911041024100000138 +:10CED0000308C0020402C1000000000000000000BE +:10CEE0000001000100000000000000000000000040 +:10CEF0000000000000000000900020882010880042 +:10CF000010000289029010000000000000000000E4 +:10CF10000000000000000000880000E000000000A9 +:10CF2000480000E000000000000000E000000000F9 +:10CF3000480000E007000000000000E000000000E2 +:10CF4000820000E0000000000000000000004842F5 +:10CF500000000000000000004842000000E0070060 +:10CF60000000810000E00700000000000000000059 +:10CF70000000000000E007000000000000000700C3 +:10CF800048000000000007004811000000000000F9 +:10CF900000000000000000000000FFFF0000F0F0B3 +:10CFA000000066660000FF000000FF000000F0F0D7 +:10CFB000000066660000FF000000FF000000FF00A8 +:10CFC000000066660000FF00000028000028201016 +:10CFD00040800000A00000A0201004080000000015 :10CFE0000000000000000000000000000000000041 :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 -:10D0100000000000BC000000060626666666666624 -:10D0200066666666003C2C3CF6760646006626661A -:10D03000464606463DFF3400BC3C2C3CC3FF9FFFE8 -:10D040009999999940DF40DF39B9F9B9000000009A -:10D0500000000000000000000000000000000000D0 +:10D01000000000000000000000000000FFFF000012 +:10D02000F0F0000066660000FF000000FF00000056 +:10D03000F0F0000066660000FF000000FF00000046 +:10D04000FF00000066660000FF0000004100004194 +:10D0500004080201000005000005408002010000F4 :10D0600000000000000000000000000000000000C0 :10D0700000000000000000000000000000000000B0 :10D0800000000000000000000000000000000000A0 @@ -138544,304 +138544,304 @@ :10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D110000000000000000000FFBCFFBD0D094F6FC4 -:10D12000F7E7F7F7000FF0FF3C3C3C663C6C3C66D1 -:10D130003C3D3CFF187E383EFF98FFFF2DD22DD29C -:10D140000C180018FB9B6202C3C0C399FDD9644050 -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF +:10D100000210200000881084021020000088108483 +:10D11000000000000000000000000000000000000F +:10D1200000000F0F00000F0F0000FFFF00000F0FA7 +:10D1300000000F0F00000F0F0000FFFF00000F0F97 +:10D1400000000F0F00000F0F0000FFFFFFFFF0F0C7 +:10D15000440000440000A0050000000088441020A6 +:10D1600008040000000000000000000000000000B3 :10D1700000000000000000000000000000000000AF :10D18000000000000000000000000000000000009F -:10D190000000000000000C0CCFCF002C00240F0971 -:10D1A0000F6F042404040002FDFF3C363C663C3C47 -:10D1B0003C663C343C00383E383E000000672DD2CF -:10D1C0000FF0FFDBF3DBFBFB0202C3CFC399FFDBF6 -:10D1D000240000000000000000000000000000002B -:10D1E000000000000000000000000000000000003F +:10D1900000009090E7810000000000000000000007 +:10D1A000000000000F0F00000F0F00000000000043 +:10D1B0000F0F00000F0F00000F0F00000000000015 +:10D1C0000F0F00000F0F00000F0F00000000FFFF07 +:10D1D000F0F088000088A0050000000088440000EE +:10D1E000804001020000000000000000000000007C :10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E -:10D2100000000000000000000F0F0F0F4000800111 -:10D220000020100240618007802D10024000800025 -:10D2300000201002406180028025100240618004BD -:10D240008029100240618006002D10024061800696 -:10D25000002D000205610A2F050D00A000000061ED -:10D260000006000D000000000000000000000000AB -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E -:10D2900000000000000000000000000000003F301F -:10D2A000FF0FAAFFF0AA000000000000000000002D -:10D2B000000000000000FF555755EFAFEFEFFF00F3 -:10D2C000FF00787800FF3CC3CCCCAA3CF0FF000004 -:10D2D0000000C33C0FF00000000000FE01FF000052 -:10D2E00000000000FFBEFFFF000000000000000083 -:10D2F000000000000000000000000000000000002E +:10D2100000000000F6F6E7810000000000000000BA +:10D220000000000040638007802D92024082800150 +:10D230008020920240E38007002D920245828A09F5 +:10D24000852092A240E38007002D92024082800157 +:10D250008020820260610006000D10000000006165 +:10D260000006000D080005610A0F050D00A005214C +:10D270000A0E850D00A000000000000000000561FE +:10D280000A0F050D00A00000400000000000000093 +:10D29000400000100000000000000000000000003E +:10D2A00000000000000000000000000000003C0042 +:10D2B000550030303C3C00000000000000003C0005 +:10D2C000550030303C3C00000000000000000F0022 +:10D2D000550030303C3C551555550000000000000D +:10D2E000000000000000000000000000000000003E +:10D2F0000028000000000000000000000000000006 :10D30000000000000000000000000000000000001D :10D31000000000000000000000000000000000000D -:10D320003F30F000AA00F0AA00000000000000005A -:10D3300000000000000000000055545520A02020EF -:10D340001E1E1E1E787800FF3CC3CCCCAA3CF00009 -:10D3500000000000C33C0FF000000000FF01FE00D1 -:10D36000000000000000FFBEFFFF00000000000002 -:10D3700000000000000000000000000000000000AD +:10D3200000000000000000000000000000000000FD +:10D330003C005500303000000000000000000000FC +:10D340003C005500303000000000000000000000EC +:10D350000F005500303000005515555500000000F5 +:10D36000000000800000000000000000000000003D +:10D370000000002800000000000000000000000085 :10D38000000000000000000000000000000000009D :10D39000000000000000000000000000000000008D -:10D3A0000000CF0C3F3FFCFC30F300000000000009 -:10D3B000000000000000000000000F0F0F0FD2005F -:10D3C000D2FF3CFF0F55000000000FF055AA56AAEF -:10D3D00055AA3CC3FF00C33C55AA00000000000052 -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D +:10D3A000000000000000000000000000000000007D +:10D3B0000000FF000F0FA0A000F000000000000020 +:10D3C0000000FF000F0FA0A000F000000000000010 +:10D3D00000003C000F00A0A000F0000000000000D2 +:10D3E00000000000000000800000000000000000BD +:10D3F000000000000A00FCFE00C0F0F00000000089 :10D40000000000000000000000000000000000001C :10D41000000000000000000000000000000000000C -:10D4200000000000CF0C0303C0C030F30000000078 -:10D43000000000000000000000000000EB28EB28C6 -:10D44000D200D2FF3C000F55400000000FF055AA5B -:10D4500055A955AA3CC300FFC33C55AA00000000D3 -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC +:10D4200000000000000000000000000000000000FC +:10D430000000000000000000A0A000F000000000BC +:10D440000000000000000000A0A000F000000000AC +:10D45000000000003C000F00A0A000F000008000D1 +:10D4600000000000000000000000010000000000BB +:10D4700000000000000000003C3C00C0F0F0000094 :10D48000000000000000000000000000000000009C :10D49000000000000000000000000000000000008C -:10D4A0000000000000000000000400000000000474 -:10D4B00000040008000004002080000000000000BC -:10D4C000202020202000000000000000000000803C -:10D4D00000040002000420000020002000020021BF -:10D4E00020112002200200030000081100000000AB -:10D4F000000000000000000000000000000000002C -:10D50000000020002000200000002000000000009B -:10D51000000000000000000000000000400040008B -:10D520000000200020002004030000010020000073 -:10D5300000200001000200908000000400000000B4 -:10D5400000000009000100000000000000000000D1 -:10D5500000040001000000000000000500010004BC -:10D560000002000000000000000000008000000039 -:10D5700000000000000000000000000000000000AB -:10D580000000000000000004000000000090000007 -:10D590000000400040000000009040000000000437 -:10D5A00010000090000000020000000000040004D1 -:10D5B000200000104000001000108804200000042B -:10D5C00001040000008500000020000000000000B1 -:10D5D0000000000500400003A000008400000004DB -:10D5E000000300090040004182000000000000002C -:10D5F00000000000000000000400000000400000E7 -:10D6000000000000004000080004010000000000CD -:10D61000000000000000000000000000000000000A -:10D620000010020000000000000000040000008361 -:10D630000001800200018308001100090001801030 -:10D6400000090491000800200004001100840082F9 -:10D65000108400A00090008205040010002000004B -:10D66000008200820040000400040010000000005E -:10D67000000000080000000000040000000000009E -:10D680000040000000000000008300822008000825 -:10D6900000000082000000000000000000000010F8 -:10D6A00000000000000000080000000000040088E6 -:10D6B000000808002005A0A00010042109000010A7 -:10D6C0000000880008080041004100080080004177 -:10D6D0000000000300058821C00889038591900996 -:10D6E0000008000500C1000400418800024100005C -:10D6F0000000000000000000000000000021000009 -:10D700000000000300000040020000000240010091 -:10D7100000000000000000000000000000004000C9 -:10D720000000000000009000004000000000000029 -:10D730000904080000008982210508C040A00800F3 -:10D74000050400041100800040402000000020205B -:10D7500009900040118400020210008220842004FD -:10D760000002008400000020008400040002020087 -:10D770000000000000C00000000000840000000065 -:10D780000000000000000000000000000000000099 -:10D790001000000000000000000000000000000079 -:10D7A0000000000000000000000000000000000079 -:10D7B000002020110000000000000004018400840B -:10D7C00001840020002008200120008001110000B9 -:10D7D0000002001000008310000000802004000000 -:10D7E00000000040010000050000000000110000E2 -:10D7F00000040000000000000004004100200000C0 -:10D8000000100000000000000002004100040100C0 -:10D8100000000000000000050011000000000004EE -:10D8200000000000000000000000000000000000F8 -:10D830000000000080880090000000840009024180 -:10D840001121041100014183000104890920088885 -:10D850000000000800000002080920020004809176 -:10D860000000000200C008C000C0000000881000D6 -:10D8700010880088000000040000000000001084F0 -:10D88000000000000000000000C00000004000890F -:10D89000040000880282004000C000000040000038 -:10D8A00000400000000000100000000000000040E8 -:10D8B00000000000000800200020000300204000BD -:10D8C000A0030421088000080041C00500210011C8 -:10D8D0000000008001030040002184080003008054 -:10D8E0002121019001800041080982000800000008 -:10D8F00000400000000800000000000000000000E0 -:10D9000000000000000000000800000000001000FF -:10D9100000080000000000000005000000100000EA -:10D9200000000000000000000000000000000000F7 -:10D93000000000000000000005210001080800A10F -:10D94000000009000888880421004102050009023E -:10D950000000090011100802058400400500004085 -:10D9600002048800080408040084200000008204E7 -:10D970000000000000A020000000000000000000E7 -:10D9800000A00000000000000000000000000000F7 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000808009005412061 -:10D9C0002100080002200203039000210000002132 -:10D9D000000500030005000300C101000005010966 -:10D9E00000000040000301040121000000000003CA -:10D9F00009410002000800080000000000080000C3 -:10DA0000000000000000000000000000000800000E -:10DA100040000000008001000180010000100005AE -:10DA200000090000002100100000000000000000BC -:10DA300000000000000000000000000000C000C066 -:10DA4000080140080810080100C0080309C0004090 -:10DA5000080002C00988410811C00040022000C02F -:10DA600008C04000091100C020C120C00082088405 -:10DA700000008200200041000000050800000000B6 -:10DA8000000400000000000000200000040000006E -:10DA90000000004005001120200004040490000054 -:10DAA00000C00000000000000000020000000000B4 -:10DAB0000000000000000000000000002000000046 -:10DAC0000000000000000004000201840088000142 -:10DAD00000008400000100C0008400C000C0A0401D -:10DAE000C01000C08282909084118285001000C016 -:10DAF0000008004000880000400000038201000090 -:10DB00000000020000000000000000000000000013 -:10DB100000000000000000000000010005000000FF +:10D4A0000000000000000000000020000005000057 +:10D4B00000000000A0028400200020000010840072 +:10D4C0008400200284020104850020800080840002 +:10D4D0000008040020002080C0000480C102000079 +:10D4E0000000200020000003000020042000400075 +:10D4F0002104890020C02100208020802004208079 +:10D50000840088002000200000112000208020805E +:10D51000880020042000200020802000208020801F +:10D520002000200020002000100000400082008227 +:10D5300000000000000004002000000000000001C6 +:10D540000000000000820004200220020004000409 +:10D5500000000000000000000004000000080400BB +:10D560000000000000000002000040020002000273 +:10D570000802200020000004200000040004000134 +:10D5800010040082000010020000100200000020C1 +:10D590000020000000000002000000200004002025 +:10D5A0000020000000400082008200000000000017 +:10D5B00000000000000000000000000004800010D7 +:10D5C000000000000000000000000000000020003B +:10D5D00088210000000000000200000000000000A0 +:10D5E0000400000002000021040000000000000010 +:10D5F0000000000000000200000000000000000029 +:10D600000000000000000200000002000000020014 +:10D610000000000000000000000000000000000406 +:10D620000000001000000000000000000000008466 +:10D6300000840000000800000004000000088020B2 +:10D64000000400000000000000C00400000000080A +:10D6500000080000000804000004040200C00000EC +:10D6600000000008000000000000000000000000B2 +:10D670000008000800880008000400000000009076 +:10D680000000000000080008000800000000000082 +:10D6900000080008000000840008000000000000EE +:10D6A000000000080008000800080000000040001A +:10D6B000000800080000000900000000000500004C +:10D6C00000400209002002000000000000000000ED +:10D6D00088000000000000000000000000002000A2 +:10D6E0000000000800090000000000000000000029 +:10D6F000000000000000000000000008000084009E +:10D700000400040000000000880000000000000089 +:10D710000400040000000400880040008800880025 +:10D72000080091000000900090218400C0000000DB +:10D7300000000020000000200000000000000400A5 +:10D740000000000000000040000000000000000099 +:10D7500000000000000000000000000000020000C7 +:10D76000000000000001000003084000000000006D +:10D77000000002040004030000000000000000009C +:10D78000000000000000000400000000000000880D +:10D79000000080008000020009000000200000005E +:10D7A000090005900440000000900002118821004B +:10D7B00000028200000000000000000000000000E5 +:10D7C0000000000000000000080000000000000051 +:10D7D00008000000000000008202A00900110009FA +:10D7E000001190000800100800090000C0000000AF +:10D7F000000000000000000000040000C000A004C1 +:10D800000000000000000004200000008200000072 +:10D810000000001000000000820000000000000076 +:10D8200000000000A0000010821000002000200076 +:10D8300020002000000000000084008400000000A0 +:10D8400011000000000000000000009040020000F5 +:10D850000000000000880900000000A00000000097 +:10D860000090030000880000800100000000000418 +:10D8700000000000000000000000000000000000A8 +:10D8800020000084000000000000000000000020D4 +:10D890000400000004000000000000000000000878 +:10D8A00000000008000000100000000000008000E0 +:10D8B00080008000800000090000000000000800D7 +:10D8C00000008200000000000400000000000000D2 +:10D8D0000000000000050000000000000000000043 +:10D8E00000000000820000000800080300000000A3 +:10D8F0000008000000000000000008000000000018 +:10D900000000000000000000000000000000000017 +:10D9100000200000000000000000000000000000E7 +:10D9200002000000000000200000000000001000C5 +:10D930000000400000000000000000200000000087 +:10D940000088000000204000008480000088000063 +:10D950000000000000C000001100000000000000F6 +:10D960000000000000000000000080000000000037 +:10D970000804080040040004000003908000210413 +:10D980000000000000200000000008000200000865 +:10D99000002010000000000000001100000404003E +:10D9A0001120059020881188110011881188118894 +:10D9B000118809C000C0000200C00000000000057E +:10D9C0000000000000000008020800000000000045 +:10D9D000000800410000000000009000000000006E +:10D9E0000008010001800100018321880800000077 +:10D9F0000000004000214000000000000000820004 +:10DA00000000000000000000000000000000000016 +:10DA10000004000000000000000000000000000002 +:10DA200000000000080000000000000000000000EE +:10DA3000040000000000840000000000000000005E +:10DA400000000000000000000000000000000000D6 +:10DA500000002100000011000090110000000000F3 +:10DA6000000040002000200420002004C0048000AA +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA900000002000000000000090020000000000D4 +:10DAA0000000000000000000000000000000050071 +:10DAB000200000000000000005000000050000003C +:10DAC0000000000000000000000000000000004016 +:10DAD00000C00090C0C00000000000000000000076 +:10DAE0000000000000000000000001000000000134 +:10DAF00000000000000000009000004082010000D3 +:10DB00000000100000000000000000000000000005 +:10DB10000000000001000000000000000000000004 :10DB200000000000000000000000000000000000F5 :10DB300000000000000000000000000000000000E5 -:10DB40000000000010000000000000004000000085 -:10DB50000011001100000011008000000000000012 -:10DB600080800000000080000020034000C0000012 -:10DB700000800080000000000041C141008380035C -:10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000004100100034 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB60000000000002000000000000004000000073 +:10DB700009410009004100080303052100C1800399 +:10DB8000000000000000000000000000000009008C +:10DB90000000000000000400000000000000000081 :10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000000000000000000065 -:10DBC00000000011008000040000804080008040C0 -:10DBD00080A041001080041108C0000080000000F7 -:10DBE0000000000000000002000004000300881193 -:10DBF00004840000000000000000000080410003D9 -:10DC0000830300000000000000000000000000008E -:10DC100000000000000000000000000000880080FC -:10DC2000000900C00000000000000000000000002B -:10DC300000000000000000000000000000000000E4 -:10DC400000000000000000C00001008208201084D5 -:10DC5000080008050000040400010005900002000F -:10DC600000000002000000000000000002A004000C -:10DC700083008209000000000000008800004004CA +:10DBB0000000000000000000000000000000040061 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000800080118000800000000000000034 +:10DBE00000000010000000410000000900000008D3 +:10DBF0000000800080008000008000008021000084 +:10DC00008303000000000000000000000008000086 +:10DC100000050000001000000008000000000000E7 +:10DC20000000000000000080000000000000000074 +:10DC300000000000000000800008008000080000D4 +:10DC400000100000000000000000000000000000C4 +:10DC500000000000A0000201A0000400000000007D +:10DC600000000000000000000001000000000000B3 +:10DC70000001000090008200400008900000048431 :10DC80000000830100000000000000000000000010 -:10DC9000000000000000000000000000000000087C -:10DCA00000A0000000A10000000000000000000033 -:10DCB0000000000000000000000000000000000064 -:10DCC000000000000000000484900401000803A08C -:10DCD0004021A00010A10100000104000001100279 -:10DCE000000084040390C00400A00010A0088889EC -:10DCF0000090830102C0C000900084000300000077 -:10DD000000000040000400000000000100000000CE -:10DD10000000000000000000000000000000000003 -:10DD200000010000080000010000000000000000E9 -:10DD300000000000000000000000000000000000E3 -:10DD40000000000000000000020000040010048930 -:10DD5000040000090004C090041021108804001180 -:10DD600082800000800009000000008000800080A8 -:10DD70000004218002088084A10000008000890046 -:10DD8000000000000080008500000000000300008B -:10DD90001000000000000000000000000000000073 -:10DDA000000008080011800300410000000000008E -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000100040000003 -:10DDD00000004010409082808300109011900880D5 -:10DDE000040000000011008000000000000000009E -:10DDF0000000008321000200200000040010000049 -:10DE0000000040408000C1C100850000000000000B -:10DE10000000000000000000000000000000000002 -:10DE2000000000004108210305001100000000006F -:10DE300000000000000000000000000000000000E2 +:10DC90000000000100080001000000010000000079 +:10DCA000000000000000000000100000000800005C +:10DCB0000000000000000000004000000002000022 +:10DCC0000000000000000000000000000000000054 +:10DCD000000000000000100200820002029000001C +:10DCE00000000000000000009000000000000000A4 +:10DCF0002000000001000000000000000000000003 +:10DD0000000000400089000000000000002000002A +:10DD100000000800100000000000100000000100DA +:10DD200000000000000000000000000020000000D3 +:10DD300000000000000000000000000008000000DB +:10DD400000000800000000000000000000000000CB +:10DD50000000000000000000808000800080830040 +:10DD600000000000000000000000000000000900AA +:10DD700000008000000041000000030021000000BE +:10DD80000500000000800008000000000000008086 +:10DD900000004100000000000800000080000000BA +:10DDA0004100000000000000000010000000000022 +:10DDB000000000000000000000000800000000005B +:10DDC0000000000000000000030000000000000050 +:10DDD0000000000000000000000000020000000041 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000800000000000000040080000097 +:10DE0000000010108000C1C10008000000000000E8 +:10DE10000080000000000000000000000000000082 +:10DE200000000000000000000000000000000040B2 +:10DE300000000000000000000000000000000040A2 :10DE400000000000000000000000000000000000D2 -:10DE500000000000010021A00440A0000008010211 -:10DE60000002010000000000000800008400000023 -:10DE70000000C0000040008201100100000000010D -:10DE8000000000000101020040400004000000000A -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000101000000000000000070 +:10DE5000000000000000000000000000000100A021 +:10DE60000020C000000000000000000000000000D2 +:10DE70000000000000010000000000000001000898 +:10DE80000040000001010400404000890000000043 +:10DE90000000002000000000000000000000000062 +:10DEA0000000000000000000000000000000000072 :10DEB0000000000000000000000000000000000062 -:10DEC00000000000000000000000000000000081D1 -:10DED00000E007004200500A00E00700000048424E -:10DEE00000E0070000000042000007000000000002 -:10DEF000000000000000820000E00000000000813F -:10DF00000000070042000000000000004800000080 -:10DF100000000000120000000000000000000000EF -:10DF20000000000000000000484200E00700500030 -:10DF300000000000000000000000000000000000E1 -:10DF400000000000000000000000000000000000D1 -:10DF5000000000000F0FC3C3CF0CCF0C0F0FC3C3C3 -:10DF6000000000000000000000000000FFC33C00B3 -:10DF70003C3CFFFFFAFFFAFF000000006969333301 +:10DEC0000000000000000000000000000000000052 +:10DED00000000000000000000000000000000081C1 +:10DEE000000007000000000000000000000000002B +:10DEF00000E000000082000000E00000008281815C +:10DF000000E00700000000000000000048000000E2 +:10DF10000000000012000000000000E0000000000F +:10DF2000000000E00000008200000000000000008F +:10DF300000000000070000000000000000000000DA +:10DF40000000000007000000000000E000000000EA +:10DF500000000000000000000000000000000000C1 +:10DF6000FFFFFFFFC3C3C3FF00000000000000006D +:10DF700000000000000000000000000000000000A1 :10DF80000000000000000000000000000000000091 :10DF90000000000000000000000000000000000081 :10DFA0000000000000000000000000000000000071 :10DFB0000000000000000000000000000000000061 :10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000F0FC3C3CF0CCF0C0F0FC9 -:10DFE000C3C3000000000000000000000000FFC3E9 -:10DFF0003C003C3CFFFFFAFBFAFF000000006969AF -:10E0000033330000000000000000000000000002A8 +:10DFD0000000000000000000000000000000000041 +:10DFE00000003C3C3C3CC3C3C3F000000000000008 +:10DFF0000000000000000000000000000000000021 +:10E00000000000000000000000000000000000020E :10E010000000000000000000000000000000000000 :10E0200000000000000000000000000000000000F0 :10E0300000000000000000000000000000000000E0 :10E0400000000000000000000000000000000000D0 -:10E05000000000000000000000000000FFFFFFFFC4 -:10E06000000000AA00000000505050505F5F7D2863 -:10E07000C0C0C0C0FFFFFFFF0000000055D5551510 -:10E080005555AAAA7D7D3F03000000000000000056 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000FF00FF003C3CFF00000000003B +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000FF4FFF0F0000000034 :10E090000000000000000000000000000000000080 :10E0A0000000000000000000000000000000000070 :10E0B0000000000000000000000000000000000060 :10E0C0000000000000000000000000000000000050 -:10E0D0000000000000000000000000000000FFFF42 -:10E0E000FF7F000020AA00000000FAFAFAFA0A0AEC -:10E0F0007D28CFCFCFCFFFFFFFDF00000000AA2A8F -:10E10000AAEA55956AAA41413F03000000000000B9 +:10E0D0000000000000000000000000000000000040 +:10E0E000000000000000FF43FF41FA50FF00000065 +:10E0F0000000000000000000000000000000000020 +:10E1000000000000000000000000414F000F000070 :10E1100000000000000000000000000000000000FF :10E1200000000000000000000000000000000000EF :10E1300000000000000000000000000000000000DF :10E1400000000000000000000000000000000000CF -:10E15000000000000000000005610A2F050D00A06E -:10E1600005610A2F850D00A105610A28850100A01F -:10E1700005005028050000A000000000001000006D -:10E18000006100008091000005005028050000A0FB +:10E1500000000000000000000000000000000000BF +:10E16000000000000000000000000020000000008F +:10E17000000000000000000000610007000D00002A +:10E1800000610007000D000000610032C00D0000BA :10E19000000000000000000000000000000000007F -:10E1A000000000000000000000000000000000006F -:10E1B000000005610A2D850900A000000000000094 -:10E1C000000000000000000000000000000000004F -:10E1D0000000000000000000000000000000FF0040 -:10E1E0000F0FCACA00F0FF0FF0003F3FFF0F08F803 -:10E1F0000BFB000000000000000000000000000019 -:10E2000000003CF53CF500FF00FF000000000000AE +:10E1A000000000610007000D000000610007000D85 +:10E1B0000000000000000000000005000A08050043 +:10E1C00000A0000000000000000005000A08050093 +:10E1D00000A000610007000D00000000000000002A +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E :10E2100000000000000000000000000000000000FE :10E2200000000000000000000000000000000000EE -:10E23000000000003CFF550F30F3EBEB0000000046 +:10E2300000000000000000000000000000000000DE :10E2400000000000000000000000000000000000CE :10E2500000000000000000000000000000000000BE -:10E26000FF000F0FCACA0FFFFF0FF0003030F000A1 -:10E2700008F80BFB00000000000000000000000098 -:10E28000000000003C053C051414BEBE0000000068 +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E :10E29000000000000000000000000000000000007E :10E2A000000000000000000000000000000000006E -:10E2B0000000000000003C00550F30F3282800004B +:10E2B000000000000000000000000000000000005E :10E2C000000000000000000000000000000000004E :10E2D000000000000000000000000000000000003E -:10E2E00000000000000000000000000000003C3CB6 -:10E2F0003C3CFCFC00FF00000000000000000000AF -:10E30000000000000000FF55AA0000F00FFF000011 +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E300000000000000000000000000000000F5F523 :10E3100000000000000000000000000000000000FD :10E3200000000000000000000000000000000000ED :10E3300000000000000000000000000000000000DD :10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD :10E3600000000000000000000000000000000000AD -:10E37000FFAA55000C0C00FF000000000000000088 -:10E3800000000000000000005F5F0A0A0CFC0CFCAB -:10E39000000000000000000000000000000000007D +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E390003D05C30000000000000000000000000078 :10E3A000000000000000000000000000000000006D :10E3B000000000000000000000000000000000005D :10E3C000000000000000000000000000000000004D @@ -138854,1182 +138854,1182 @@ :10E43000440000000008000600000000000000008A :10E4400000000000000000000000000000000000CC :10E4500000000000000000000000000000000000BC -:10E460000000000040090000000020000002000041 -:10E4700088000008208000802000000400000000C8 -:10E480004000000520110100000000050004000903 -:10E49000000000080005002000000000000500A0AA -:10E4A00000000000000340000000008400000000A5 -:10E4B0000005000000022000200020800000000075 -:10E4C0000000000410002000000000000000000018 -:10E4D000000000000000200020002000000000805C -:10E4E0000005000020000000000000000000000007 -:10E4F00000002104000440400040800000000000B3 -:10E50000000000000004000002000000000000C144 -:10E510000000000000000000000100000000008476 -:10E520000010000000840000000000000002000055 -:10E530000000000000020001800080008010000048 -:10E5400000000000000000000000000000000000CB -:10E550000000009000900000000000040000000097 -:10E560000002000000000000200000000105000083 -:10E5700001000003010800040004001000049009D9 -:10E58000010000054000000400210000001100000F -:10E59000A01100009004408500840000008800095C -:10E5A000004100800010000000000000000000009A -:10E5B000000004000041000000800008000000008E -:10E5C000000000040200200500000000A000A000E0 -:10E5D000A000000400000005000000000000000092 -:10E5E00000040000000400050000808400082008EA -:10E5F000000820C00004204000000889000000C17D -:10E6000000A020C000040000000800080008000866 -:10E6100000080008001040098004002100000021CB -:10E620000000000000100001000800000082000847 -:10E630000008008480100084000400200000000016 -:10E640000000000000830008800400080084000827 -:10E65000000800840090000800900008008400007A -:10E660000000008400C0000800000008400500020F -:10E6700000218203A121000001210021200888033C -:10E680000005000200218809020502210103C021C2 -:10E6900002020202904184040010002100050003E0 -:10E6A00000210120002100080021000200000008D4 -:10E6B00000000009000000080008000801058800AB -:10E6C00000000000002102080040000000200000BF -:10E6D00000000000000800000021000800110008F0 -:10E6E000002100080008004000410008000240101E -:10E6F000088403C0000020A0000820000000801053 -:10E7000000A000000001094000089100800202887A -:10E7100000008041A08900080003000000A0001054 -:10E720000088001002010008000000880085000039 -:10E73000000000000084000000000000000020082D -:10E7400000000000000000000000000000000001C8 -:10E75000000000A000A00000000000000040000039 -:10E7600000000000000000000000000000000000A9 -:10E77000C002000508800000002100110080000098 -:10E780002000202140000000A000000020C100095E -:10E79000080488048204080482410000080500007F -:10E7A00008000080088300800005000408000100C4 -:10E7B00000000888C08082000083000001008320E0 -:10E7C00000000002000000040011018000A1408050 -:10E7D00001000021000000000000000500000040D2 -:10E7E00000100041000000040000000000000000D4 -:10E7F0000000000400C00004000000A000A01104FC -:10E80000008200842188030800041084000482042C -:10E8100040A0000109050301000100000000030001 -:10E82000001000A0000405040004098800A00008EE -:10E8300004820000002000200000212000A0200011 -:10E84000040120200582030000010008400400208C -:10E8500083204000008400000020000200A000008F -:10E860000001002100840084008200A0000400A0B8 -:10E8700000000000C0084002012100000204022143 -:10E8800090210021820090020302020341210041F5 -:10E8900010A100028400C0002000C0020080850892 -:10E8A0008883C0A183418408008082C000110109CF -:10E8B00082000005000040208420842000200020E9 -:10E8C00000022003C00000032003004100110020CB -:10E8D000000400110004000000000000000000001F -:10E8E00000000003000000000005000000400000E0 -:10E8F0000021880000000500850020000900910922 -:10E9000080000500000209000501A002800020002F -:10E91000000005040501020000000002090000409B -:10E9200002080040054040880991000809030000E2 -:10E9300008000000000000000001000100010001CB -:10E9400000010000800000000000800000000000C6 -:10E950000001098900000001000000000000000023 -:10E960000000000000000000000000000000009017 -:10E9700000000000000000002004A00401040104C5 -:10E98000002120089004000420004004A005000499 -:10E9900088A10082A02100044004C0040409880466 -:10E9A00000410011A0040004000401100021001027 -:10E9B000820808828209C100000001C1C1800120D3 -:10E9C00001088421010020088400010201000009DF -:10E9D0000084000800200000002100000202001155 -:10E9E00001030041000000000000002100000000C1 -:10E9F0000000000800410000000083824182020004 -:10EA00000282001000C0110420A080A004C02000D9 -:10EA100000840040004120840000400200A000204B -:10EA200000900000021008C0021011820201009044 -:10EA300000010000A01000820482000004200420D5 -:10EA40000401040000040400119020A02000200014 -:10EA500000820005000005C120001088008400C06D -:10EA60000400400200000000030800A000000000B5 -:10EA7000000000C000A00000110000A0020340211F -:10EA8000908804082141200590A110A04041114127 -:10EA90009004C00810A0A1A0900302090488A0025D -:10EAA000048490080302112010A0A09001C188895D -:10EAB0004040001188C000000000209000000000CD -:10EAC000000000000000010021002100000083A1DF -:10EAD0004108040882210001C0000200000000007B -:10EAE0000000020000000000000000000000000024 -:10EAF000000000000000000188011101000191895F -:10EB000011A18000009120C021A180098080404097 -:10EB100010A18082808382008203800880830500A8 -:10EB2000008082000080C08088808900000010C1C1 -:10EB30009140820400100980210000000080000044 -:10EB400000080020001000201100900010000000BC -:10EB5000119003A100208010110802210910000467 -:10EB6000000008000000000000000000000000009D -:10EB700000000000000000001010210390110008A8 -:10EB8000809103852082A183118088A18209A1A19F -:10EB9000038240A1A189A10388C1C18583082108FE -:10EBA0004008900285C1008080118003008300002E -:10EBB00000000000802080000000000080000000B5 -:10EBC00000001000210005004005108421002104F0 -:10EBD0000991000241082011100510081080402101 -:10EBE00010800840080002000800800000050000B6 -:10EBF0008000000000000000000000000200110082 -:10EC00000803109020C00540A1C1029009C108A0CE -:10EC100083C0409021C008041109039008C0082156 -:10EC2000C1C0900103888282C01002008202820368 -:10EC30008202100088000401C000000000000200F1 -:10EC4000000000000110018200000184010301881E -:10EC5000000100C100000000001101900001000847 -:10EC6000000001C000010100000000000800A00039 -:10EC700088201000000000000000000000000000DC -:10EC800000000191912001C0C10204029110018590 -:10EC9000C0030804112000C008C12082092083217C -:10ECA000C0912090C0028204101104A00208084004 -:10ECB00010830205890108000801030104110010F6 -:10ECC0000009A08800000000000082000000010090 -:10ECD000040020010000400500A00540028501005D -:10ECE000840040000001000000000001000000005E -:10ECF000000008000000000000000000000000000C -:10ED00000101010001004110201085031190419084 -:10ED1000038482889102C1100005100800C14111CE -:10ED2000888489050210828000400010200003853D -:10ED30008082000389824108A140A010884100849C -:10ED400000800084008000004000110011001100CC -:10ED50004109000580211104038800809020801162 -:10ED600041048208C040101000020020002100026F -:10ED70000000000000000000000000000000000093 -:10ED8000000011100500111010111089C1001003AE -:10ED900090020400A0801009820985021089900267 -:10EDA00091090400858010048009800080800000A3 -:10EDB0000004800400000000000200830000000046 -:10EDC00000100080000000000000218920050500DF -:10EDD0001020118211040300084004899100900062 -:10EDE00004090020000400000009000000000000E9 -:10EDF0000008800080020000800000000000000089 -:10EE00000000090411000000101088C0200508C08F -:10EE10000405100021A00302C001020008A1A10402 -:10EE200010008200C1100304C00002000820081076 -:10EE30002000A000048482C0C000000000030088FD -:10EE40000000000000A0000000000000010400001D -:10EE50000100010000020001000001002040030049 -:10EE6000110020A000C10000000000000090000080 -:10EE7000000000011000402090908200000000007F -:10EE8000000000000001000000000000820000E01F -:10EE900000004842810000E000004842810000E09C -:10EEA00000004812880000E000004842810000E0B5 -:10EEB00000008200810000E000000000600600E029 -:10EEC00007008200008100000700000000000081B0 -:10EED000000007000000810000E0070082128100AE -:10EEE00000E000000000000000E00700820A0000CF -:10EEF0000000000000000000000000000000000012 -:10EF0000000000000000810000E000000000FBB9EC -:10EF10006220F9FF6000BF2FFFFFF7FFC7FFFB383C -:10EF2000E320F960BD243F30FF00F960BD24096F84 -:10EF30004B4B817E0FF0930393F30FCC69CC000011 -:10EF400000000000000000000000001000000000B1 +:10E46000000000000080008008800080000008009C +:10E470000000000000002000000000000400000078 +:10E480000000040000000000210004040008000057 +:10E490000000000040002020410000002002000099 +:10E4A0000000200000030080008021002080000088 +:10E4B00004000000000000002100200001002000F6 +:10E4C00000000000200088800080208009000000FB +:10E4D00021000400001104000500040004002000D5 +:10E4E00000000000C00000040004800400040000DC +:10E4F000800000020000000000000000000000009A +:10E500000000000000000000000402020002000001 +:10E51000000000020300800200010400110200005C +:10E5200000000000000200000004000420020004BB +:10E53000000000000000000000002000000020009B +:10E540004000000000020000000400040004A002DB +:10E550000040040280020000C0028400800090029B +:10E56000400000000000090020002000020001001F +:10E570000400000000000080020000000000020013 +:10E58000000000000000004000000000000000004B +:10E5900000000000000000000100820000000121D6 +:10E5A000000000000000000000000000000008085B +:10E5B0000000000000000000000001840080000551 +:10E5C0000000000500000000000000000000010540 +:10E5D0000200018801800480001100000000018811 +:10E5E00000800000000000000000800080000000AB +:10E5F000080002000200000002020000000000000B +:10E60000000000000000000000000000000000000A +:10E61000000000000004000000840400000000006E +:10E6200020080000000000000000000000080008B2 +:10E630000200020400040004000000042021002065 +:10E640000000000800000000000000000088000832 +:10E650000888000004200420802000000000000042 +:10E66000042000200000000002000040000900001B +:10E6700000210005000020000000010200400040D1 +:10E68000004000200009000300040002000400080C +:10E69000000000001005000000050100000000203F +:10E6A000000020A000000000820500030000900090 +:10E6B00000020021002100080008000020000000E6 +:10E6C00000210020002000000000000000002000C9 +:10E6D000040504058808414100009000041004A0CE +:10E6E00005400420050200008402C009000000006B +:10E6F000000000000088000000000040408800008A +:10E700000000000000000000000000000001000008 +:10E710000000004000080000080000004000000069 +:10E72000000100880021000000000000000000003F +:10E730000000000000000200008200000000000055 +:10E74000000000000009000100000000400000007F +:10E750004104000000000000049000000000800060 +:10E76000002184008001C0010000000000000800BA +:10E7700000000000000400042000000020002041F0 +:10E780002000200020000800820000000000080097 +:10E79000000502040000820000000000A00000004C +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000210000000300000000000035 +:10E7C000000008C101000005010000000009000070 +:10E7D00000080000000210000003000300030421F1 +:10E7E000A00804000900C0200580000500050108FC +:10E7F000010000A000A000050001000000000000D2 +:10E8000000002000000020882000030020000300FA +:10E81000030020002001200020000004110000005F +:10E8200005040004000000A000A00000000000009B +:10E8300000000000000000000000000000000000D8 +:10E840000000000000202000000020000000110057 +:10E85000009000A0000000A00000000000000008E0 +:10E860008082000080000400080184202100000054 +:10E870000808080000000021020000050000002137 +:10E880000000900840092003904000080020000488 +:10E8900082108200000800102000201000040004F4 +:10E8A0000010820300880000002000210180000089 +:10E8B00000000011000000000000000800000040FF +:10E8C00000002008000000000000202100210000BE +:10E8D0000200000000000000840010050000040396 +:10E8E000040205A0042005A004A004A0A0A000002C +:10E8F000A000A000C0000000000200000000000016 +:10E90000000200000000000021000800000200409A +:10E910000000000000000200000080008084000071 +:10E9200000080040004000200000000100000240FC +:10E9300000000000000000001100000000000000C6 +:10E940000000000000000000000000008002400203 +:10E950000002000000000240000000002000000251 +:10E960008908C00084219185842180218021002193 +:10E9700000200090008409000021002140210000B7 +:10E9800000031008200000030021002100402000A7 +:10E99000200420042004A0002004200520042004DA +:10E9A000000800040000000800040008000400043F +:10E9B00000210021000000000000000000000021F4 +:10E9C0000000000000000000000000000000010046 +:10E9D00000000021000010110021000000000000D4 +:10E9E00008000003042101830583048005050482D7 +:10E9F00004200000C083A009840000000000000083 +:10EA00000000000000000000000000000000000105 +:10EA100000000000000020002000A10803100000FA +:10EA200000002104200011042084000000C0000028 +:10EA30000000000000000000000000000000008254 +:10EA4000000000000008000800080082000000002C +:10EA50002000000000000000000000000000000096 +:10EA60000000200200008000042084209120840007 +:10EA700080218001000021100000000008020088B1 +:10EA80000102081000A000820408001008040040E1 +:10EA900000841084A1102090A0A082C090081010C3 +:10EAA00000402004840411040084888400000000D5 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD000000000000000000000000000000008022C +:10EAE00010020110081010C000900000C00000C00B +:10EAF000A0900200A1A084080208004082088500BE +:10EB000000000480800008800980808000000000F0 +:10EB100000800000800020802000000080000000B5 +:10EB20008000040000800080888000000000000950 +:10EB30000009000300400000000000000000000089 +:10EB400000000000040000000000000000000000C1 +:10EB500000000000100000000000000000000000A5 +:10EB600080808000040080008080008000008000A1 +:10EB700000808380800091808500800040808080BC +:10EB8000000400A10088008010082103208020805C +:10EB90008000808880110080100021880880838098 +:10EBA0008004808880030080A00009829180888092 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000800000005000000000000000038 +:10EBD00000000009008000040000000000000000A8 +:10EBE0000000800800908005000000000003808085 +:10EBF00080801180110080809183800080A08080BF +:10EC0000800002008882202088100101000000108E +:10EC10000010080008C1028210C0890002C010085C +:10EC200010C0040004C1109110C0090004C1820486 +:10EC300009C0000000400000008800000000000043 +:10EC400000000000000000000001000800000000BB +:10EC50000000000000000002000100880000000029 +:10EC60000000000010000282828888040200000177 +:10EC70008408C090000201000808C1820200200838 +:10EC800002088410041008200020881008000001E9 +:10EC90000201000109840084C0080802051000096F +:10ECA000C003108583400240C0041008C1020084E4 +:10ECB000C009918300000001100000010000000065 +:10ECC000000000000001000008000000000000003B +:10ECD0000000000000000000820020000000000092 +:10ECE00000000000000010400820082003108400ED +:10ECF00000840000C0C040010040C09100C103A0DA +:10ED000000208820042091008080000002008008FC +:10ED100000040021001041000000808000804103B9 +:10ED2000008880210008410000008080820041802E +:10ED3000000880A120A01100104008000020000061 +:10ED400000000000000000010000000000000800BA +:10ED5000000000000000000020000000800009000A +:10ED60000300000000000000048000808000888014 +:10ED700080000080000080808011008580A100A0BC +:10ED8000C1000080000085000008001000000000A5 +:10ED9000000080000000000800000000800000006B +:10EDA0008011008000008040800080000080000012 +:10EDB000008080830000800300000002000000004B +:10EDC0000000000000000000000100000000000042 +:10EDD00000000000000000000000002000210000F2 +:10EDE0000000000000000000008080020089800018 +:10EDF00000008003802180808000911183C0A100E9 +:10EE00000800800500900080000002018802900246 +:10EE1000200002884000880002010200088804885F +:10EE200040000808902090100801020002A08810FD +:10EE30004000A0028208C00204010000000000009F +:10EE400000000000000000000000000100000000C1 +:10EE500000000000000000000000000000010000B1 +:10EE6000000000000000000000000002840002100A +:10EE7000100290029000100090C00200C1014040BA +:10EE8000418800000800908290042000000000E00B +:10EE9000070000000000000000000000000000006B +:10EEA000000048420000000000004842000000E06E +:10EEB000000048420000000000004842000000E05E +:10EEC000070000000000000000000000000000003B +:10EED00000E0000000000000000000000000000052 +:10EEE00000E007000000000000000000000000003B +:10EEF00000E007000000004200000700004200425E +:10EF00000000070000420000000007004800000069 +:10EF100000000000000000000000000000002010C1 +:10EF200004082800002820100408A0000500220082 +:10EF30001100A00000A022110000A00005000000A8 +:10EF400000000000000000000000000000000000C1 :10EF500000000000000000000000000000000000B1 -:10EF600001098199C2E6DAFE0000000000000000FD -:10EF700000000000000000007F766F6600000000C7 -:10EF80000000000000000000000000000000000081 -:10EF9000FFFF0000BDFF2400B0200000340004008B -:10EFA000FF00FF00FF00FF006F60FF00FF00FF0099 -:10EFB000F690B4B4BD420FF06CFC6C0C96CCF0CC67 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000DFFF0000F6F60000C7 +:10EF8000F6900000F0F0000000000000000000001B +:10EF90000000000000000000000000080000000069 +:10EFA00040800201410000414080020100A00005B4 +:10EFB00000220011050000050000221100A000053C :10EFC0000000000000000000000000000000000041 :10EFD0000000000000000000000000000000000031 -:10EFE0000000030FC3FF99FF99FF0000000000001D -:10EFF00000000000000000000000191009000000DF -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 +:10EFE0000000000000000000000000000000000021 +:10EFF00000000000000000000000FFFF0000060607 +:10F000000000F6900000FF0000000000000000007B +:10F010000000021020000088100400000000000022 :10F0200000000000000000000000000000000000E0 :10F0300000000000000000000000000000000000D0 :10F0400000000000000000000000000000000000C0 :10F0500000000000000000000000000000000000B0 :10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F09000000000000F0F0FBD0424DFFF3C3C3CF6D6 -:10F0A0003C063C9FFFFFFF6C6642667E06F60CFC4A -:10F0B000990F66F0660F99F0FF930093F330DB1819 -:10F0C000F04DF07100FF3C3C6F6F0CFC424299998F -:10F0D0000066006600000000000000000000000064 -:10F0E0000000000000000000FBC300000000000062 +:10F0700000000000021020000088100400000000C2 +:10F08000000000000000000000000000021020004E +:10F090000088108400000000000000000F0F0F0F18 +:10F0A00000000000100820044002200400A0000519 +:10F0B00001020804402002041020080400A00005FA +:10F0C0001008200400000000000000000000000004 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 -:10F10000000006061E1E00000000000000000000B7 -:10F110000000000000000F0F0F240400DFDB3C3C68 -:10F120003C063C3C3C3C0000006C664E664E00FFDA -:10F1300000FF993C66C33C3CC3C3006CFF6C0CCF22 -:10F1400024E70F4D0F710F0F666660600CFC4242A2 -:10F1500000000066006600000000000000000000E3 -:10F1600000000000000000000000FBFB00000000A9 +:10F10000666600003CFF00003CFF0000FF66000058 +:10F1100000000000000000000000000000000F0FD1 +:10F120000C0F000000008001400280011008A000C8 +:10F130000500804010208010010880400102A000DE +:10F1400005008001400200000000000000000000F7 +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F :10F17000000000000000000000000000000000008F -:10F1800000000000069F069F000000000000000035 -:10F190000000000000000000406180028025100295 -:10F1A00040618002802510024061800280251002AB -:10F1B000406180028025100240618007802D10028E -:10F1C00040618007802D00020561502B85090005F4 -:10F1D00000615026000D0000000005610A2E050D9B -:10F1E00000A005610A0F850D00A0006100008001EC -:10F1F000000005610A0F050D00A000610006000D6A -:10F20000000080000000000000000000000000007E -:10F2100000000061000580010000FF5575558ABAA5 -:10F220008ABA0F555555BAFABABA0F550F55BAFAE8 -:10F23000BABAFF557555BABAFABA000000005F0AAB -:10F240005F0A000000007D417D4100000000C0FC1D -:10F25000BEBE00000000FFFFFFFF0000E3F3000060 -:10F260000000000080A0C0F0D7D717173F3F303014 -:10F27000AABE000000000000F0AA3C3C0000000014 -:10F28000000000000000000000000000000000007E -:10F2900000000000C3FFC300F5F555550055455566 -:10F2A0008ABA0AFA0F554D558A0A8A8A55554D551C -:10F2B0008A0A8A8A005545558A8A0A8A000000000F -:10F2C0005F0A5F0A000000003F3F030300000000E8 -:10F2D000C0FC8282000000003CFF3CFF0000EBFF0E -:10F2E00000000000000082AAC3FF37F737F7FF0FC6 -:10F2F000F000003C000000000000F0003C3C00007A -:10F3000000000800000000000000000000000000F5 -:10F3100000000000000000FF0000A0A00000BEBE32 -:10F320008282AFA0AFA00505AFAF0CAACFAA3C3C2C -:10F330003C3C503C5F3CF5A0F5A002F207F7000012 -:10F3400000000FC30FC30000000000000000D7D76B -:10F350003F0300000000000000000000000000006B -:10F3600000A200F3C3D6C35400000000F0D0C0C018 -:10F37000FF3FFC3CF0AAFFFFC3AAC3FF0FD700006A -:10F3800000000000FFFFFFFF000000000000000081 -:10F39000000000000000000000000000F000F05538 -:10F3A000FF3CC300A0A0AFAFAF05AF050CAACFAA2A -:10F3B000F0F0FF00503C5F3C7D287D2802F207F70B -:10F3C000000000000FC30FC3000000000000000099 -:10F3D00014143F03000000000000000000000000C3 -:10F3E0000000A2A2F3F3FFFEFF7C00000000F0D0BB -:10F3F000F0D0C303C000F0AA0000C3F0C3F00FD7E1 -:10F40000FFFF00000000FEFFFFFF00000000000003 -:10F410000000000000000000000000000080F0007C -:10F42000F0550200020000102000200020102000F3 -:10F4300000100200000000008800020320002000ED -:10F440002000000000000000000020040000002058 -:10F45000C0004002000500000088000000000420F9 -:10F46000000800030208000400080104000000086E -:10F4700088050000000000000000C00001000141FC -:10F48000008000001100100001000102000020A017 -:10F49000200440800000C080000021000000000027 -:10F4A000000000008000800000000000000000005C -:10F4B000000000000000000000000000000000004C -:10F4C0000000800000C000C000C00000000120005B -:10F4D000200100008001000000000020200000004A -:10F4E0000001000000008000000100010201000096 -:10F4F0000000000000000000000000000000080004 -:10F50000080000200000080000C0080008010000FA -:10F5100080050001802000C00010000020000000D5 -:10F52000000000820000000000000804000300004A -:10F53000000000080005000400030008000000208F -:10F5400004400020002000000000004001020820CC -:10F550002020008020020000040090C10020000450 -:10F56000002000830000000000C0000800048400A8 -:10F570000041000000100100100000000000010028 -:10F58000002000802000A04000020000A0000088B1 -:10F590000000008000040000089008000000000047 -:10F5A000A000000000000000000800040008008423 -:10F5B00000080084008800000009000400000084A6 -:10F5C0000001801000110085001000000008028971 -:10F5D0000009801100048001000880880020008557 -:10F5E0000009020100102040000000090084000909 -:10F5F000000800100082000802000008000200005D -:10F6000002840085004041840002000800080010C8 -:10F61000000200880020000900829011808800000C -:10F620000082000041000082000001410121010030 -:10F630000041032101094003010089002041A10488 -:10F6400041082003004000050004000500000002FE -:10F65000000800218800002100200021002100096D -:10F6600001084005100808080021000000210008DA -:10F670002010004000000000000300400021002195 -:10F6800000000000C005A080000500050021000565 -:10F690004000001000090011000988080808000057 -:10F6A000000500000000200000030021028402C0C9 -:10F6B0000200008482A00284000002840284809000 -:10F6C000020102A08582000020A02085020005849E -:10F6D0000000050800000388414000850000000884 -:10F6E00000C020408000900090A04000000003C0B7 -:10F6F0000001830111020308408241004000210003 -:10F7000021820000000000004104000000A00082EF -:10F710000084A100008500000000000000008000BF -:10F7200000000000000000008000000000840000D5 -:10F730000000000082100480900402800004200079 -:10F7400020092000C080004004004000208000000C -:10F75000008082040889004100090010000008842C -:10F760000000400000000209080008100304000027 -:10F7700000210108080000C00803900020000008D4 -:10F7800000000000840000000000000500110000DF -:10F790004000008000000080000004002000000005 -:10F7A00000000000C00000048411C00082000000BE -:10F7B000001000000000000220042009A0042041E5 -:10F7C000008811400000030405A02100000000048F -:10F7D00000A003040011000400C01104090000820D -:10F7E0001102008200A000900084008202412008E3 -:10F7F000000003102001800000091000000000A09C -:10F8000040A00040028200000088008400020084C2 -:10F810000000008400100000000200008000800052 -:10F82000000009A00008000800010000009000008E -:10F8300000840084408001040280820000840082F1 -:10F84000020200A102880041404100002103900310 -:10F8500009880004102100028221000482080000AF -:10F860000000018204088240204009200000C0837B -:10F870000090000000040005A00490C000000002F9 -:10F8800000000808004110200405A0080004000042 -:10F890000002050508000000A00200400000000072 -:10F8A0000040042000410000840000118580820592 -:10F8B00001800180000580022001A10200000002F9 -:10F8C0000041A185090280404000C0A01010400006 -:10F8D00021A02010080908080500050000012000EB -:10F8E000210200004002820220408884400100C0C2 -:10F8F000000400210000000100000001414121043A -:10F90000418400004000008421080300110021010F -:10F9100000A00809A000042000040000000000006E -:10F92000000021908001000000000000020002049D -:10F930000500204020400000042103210205002191 -:10F940000003200000050005084140020021820359 -:10F9500000040008000500000005201190080021A7 -:10F96000002100080011408000000421200801054A -:10F970000080081100080000834100090089850407 -:10F9800090038810002182000811108220002003BB -:10F9900000049004090503800021008440084041D0 -:10F9A000000300040100C02000210021000300101A -:10F9B000010082A100880080400403002000880824 -:10F9C000000004000000008400000000008200002D -:10F9D00000080000400000000000418200A0041068 -:10F9E0000000000003840300880200000000800083 -:10F9F0004000000480020084000010C002000010DB -:10FA0000020500000090000000000800000800C08F -:10FA1000000200000001200040040000201000004F -:10FA20000000009000090800001000000000000025 -:10FA3000000002820040004000404009050390049D -:10FA40008808C002C008002082081111000400C00C -:10FA500020020100200102000001030489901182AC -:10FA6000A010C1000090A11000100401001000843B -:10FA700000A104C011020590C08800008903A18282 -:10FA800009080400C004004000020404A190002002 -:10FA9000820800C0A00290209188048800400010D5 -:10FAA000A0100010900810838204A00400C0000081 -:10FAB0000008000000C000C00101081005C0C020FF -:10FAC0008000008400000080020080800940210046 -:10FAD000090380001100802100030040908008008D -:10FAE00040800080C000218040800080020800111A -:10FAF00009410008098484848303000400009141C3 -:10FB000009A1848900000000008000000080080036 -:10FB100011800080000080009100C000000004807F -:10FB20002100000000000811908880418009000039 -:10FB30000000008000002082000010088020A080CB -:10FB4000C0A12008A1838040A091A004C0808004AF -:10FB50008089000480000311098004000003004034 -:10FB6000002100C000000008800200858000000025 -:10FB70000000800000800011000000418080000033 -:10FB80001100918389084189000000400090000025 -:10FB90000000800300800080082040108940098018 -:10FBA0000000C000400821800980009180112100E0 -:10FBB0000000004100000000028000219100880840 -:10FBC000099041C0C1C109C1080011C0059008C019 -:10FBD000080110C0C0C108000003A0040000008597 -:10FBE0008400C002C0A09000C00110010011900468 -:10FBF000000010008400209004000400040104A010 -:10FC00000000A000024082C083110000000200A09A -:10FC10000000C000080310A082A00100A0C1A00045 -:10FC2000000420008300918509C00088A0C1A004C1 -:10FC30000102000000010088000010C00200400026 -:10FC4000C10141080102C011A00811020409C0103D -:10FC5000100909088404C103110200000100820197 -:10FC60000001900040890891A102C04104108290D7 -:10FC7000021040100040029002C089C1A00285A07D -:10FC80009105000090820088018985C1C0080000AC -:10FC900000A02010C0100004000882831105C08855 -:10FCA0000404108888000205000010A1C0C10009EA -:10FCB00001080903C000000000008800202001881E -:10FCC000001190C041890302C1830389C10080A053 -:10FCD0008040A0C0C1840000820284002000400057 -:10FCE00002400005004100408002028980A000908F -:10FCF00000908485800010802080C000050889A0C5 -:10FD0000A0200941000000092080090511C1808060 -:10FD100000000000008080000021008905412002D1 -:10FD200080088009C1890020809000080090004070 -:10FD300021831090C0088000000000000500000929 -:10FD40000910000800A089110202080089110004AE -:10FD5000838009008400800200000000000011027E -:10FD6000024108A11140000980008000800080024B -:10FD70000080808000000009000000000080000575 -:10FD800000210080000000004184110009000800EB -:10FD9000000000000000800000058080008000005E -:10FDA000800000A00000001000000021000080057D -:10FDB000A1C0000088004005000480000000000091 -:10FDC000000000002000111008000203C11008000C -:10FDD00002000808C0880800080004041088020017 -:10FDE0000040014101050001820002881088A00046 -:10FDF0009000001008080200000000C0000200107F -:10FE0000000000A0000800000000A188A1A0C0A080 -:10FE100083009000100020000800880088822008DD -:10FE20004000020820038808900020A04021C088DC -:10FE3000A00003C1841005880000C0000800000075 -:10FE40000000C000200010100000480000E000008A -:10FE50004842810000E000004842810000E00000CC -:10FE60004842818100E007004200810000E000007C -:10FE70000000008100E007004200818100E00700EF -:10FE80000000884100E0070000210000008100E040 -:10FE9000070000000000000000005000000000000B -:10FEA00000006000004200E0070082000000000047 -:10FEB00000000081821100E007004100810000E0A5 -:10FEC00000004100500000E000004200F0F4F0FFAC -:10FED000CFFF8FFFF0F0F0AACFFF8FFFFFFBFFF007 -:10FEE000CFFF8FFF00000000000000000F00FFF0B8 -:10FEF000F505F505F8F8FDFD282D787D00000000DA -:10FF0000A0A3ACAF00000000000000000000000053 -:10FF10000000505400000A0C0AFCC355FF000A0AF6 -:10FF2000303F55FF0FC30000000050500000003864 -:10FF3000003C0000F0F05F5F00FF0F070D05AAAA6C -:10FF4000AAAA00000000FF0FF000FFFF000CF0E085 -:10FF5000F00000300070F0E8F0AA003000700010EF -:10FF600000F00030007000000000000000003A3A8D -:10FF70003A3AFFFFF0F008080D0D282D787D0000BB -:10FF80000000A0A3ACAF00000000000200000000D1 -:10FF9000000400000014F0F0FA0CFAFCC355FFFF57 -:10FFA000FAFA303F55FF0FC330000000D250C300B3 -:10FFB0000038003C0000F0F0505000FF0F0F0F0F12 -:10FFC000AAAA00FF00000000FFFF0000FFFFFFCF14 -:10FFD000550F0F0F1F5F1F1F0F555555FF54FF146F -:10FFE000550F550F1050101000000000F0F0F0F009 -:10FFF000BFBFFFFFA041A0EB555555553C3C3C3CD5 +:10F18000000000FF000000C3000000C30000006694 +:10F19000000000000000000000610007000D0000FA +:10F1A00000610006000D000060000000000010007B +:10F1B00000610006000D080060610007000D1000EE +:10F1C00000610006000D080005610A0E050900A097 +:10F1D0000000000000100000000000610007000DAA +:10F1E0000000000000000000000005610A0F050D8E +:10F1F00000A0000000000000000000610007000DFA +:10F200000000030203380C0092C003E3033E0C0D20 +:10F21000C2C000000000000000000000000000006C +:10F22000000000000000400000000000000000009E +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F250000F0F000000000000000000000000000090 +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000FBFFFFFF86 +:10F29000000000200000000000000000000000004E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000010000000000004D +:10F2C0000000000000000000000F0000000000002F +:10F2D00000000F0F00000000000000000000000010 +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F300000000000000000000000000000000FFFFFF +:10F31000FFFF0000000000000000000000000000EF +:10F3200000000000000000000000FFFFFFFF0000E1 +:10F3300000000000000000000000000000000000CD +:10F34000000000000000000000000000000000C3FA +:10F35000F0AA000000000000000000000000000013 +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000303000000000000000000D +:10F3A000000000000000000000000000FEFFFFFF62 +:10F3B0000000000000000000000000000400000049 +:10F3C000000000000000000000000000000001003C +:10F3D000FFC3F0AA000000000000000000000000D1 +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F41000000000000000000030300000000000008C +:10F4200000000002000000000000000000020000D8 +:10F4300000000000000000000000000000000003C9 +:10F4400000000000000200080002000000000200AE +:10F45000040300020000000001000080000000031F +:10F460000100000300000000000000000200020094 +:10F470002000201100000002004000804011000226 +:10F4800000000000008500800000A1002000200096 +:10F4900020002000000000034000001120000002B6 +:10F4A0008400C00000000000000000000000000018 +:10F4B000000000000000000000020000000000004A +:10F4C000000000000000000000000000000000003C +:10F4D00000000000400000000000080000040000E0 +:10F4E0000000208400000000000000020000100066 +:10F4F00000000000000000000040000000040000C8 +:10F5000000000000000000200020000004000000B7 +:10F5100000001000000000C0000040000082000059 +:10F5200000000000000000000000080000000000D3 +:10F5300000000009000000000000000002000008B8 +:10F5400000000000000000000000000000000000BB +:10F55000000000000200000802000000020502088E +:10F560000200000002000000000000000000020095 +:10F57000000000000000000001800280108000896F +:10F580000000000900000200000000000000000070 +:10F590000080008000C002000000000000000000A9 +:10F5A0000000840000008400000804000000020243 +:10F5B0000200020002000200000002000000000041 +:10F5C00000000200000000000240000000000200F5 +:10F5D0000000000000000000000000840000008423 +:10F5E0000008040800820400000000000008000871 +:10F5F0000000008800000000000020200020002003 +:10F60000002000040088000800840000001000882A +:10F61000001000200020002000080202020402085E +:10F6200002000000000000080200040000000003C7 +:10F63000002100000000000304000005000000009D +:10F6400000080000000800000000000000080000A2 +:10F650000000000200000000000300210008000874 +:10F6600040080003040804050409000020112021BB +:10F6700020032005C00800050408040888002008AD +:10F680000000400000400009000000000000904120 +:10F6900004000400000004000000002000214000DD +:10F6A00084414000900588008400002120880002E9 +:10F6B000048421A0008200840088008400200220AD +:10F6C00000880084002000000020022000C000A06C +:10F6D00000A040C0000400000088000000000000FE +:10F6E0000000000000008002800880000000800010 +:10F6F000800080008000110000A0000000000000D9 +:10F70000008400200000000002882020002000204B +:10F71000000080000088008400880088002100002C +:10F7200020A0210021002000000020000000000097 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000200000000000000000000000000A7 +:10F760000000000000000000002100000000000078 +:10F770000000000000000000000000000200000087 +:10F7800000000109000400800000000002000004E5 +:10F7900000000020000000008400000000000000C5 +:10F7A0000000000000000000000000000011000048 +:10F7B0000000000000000000000000000500000044 +:10F7C000000000000000000000A000080008008207 +:10F7D0000000000082000000000000A00000000007 +:10F7E00000840000000000A00000000021000000D4 +:10F7F0000000000000000000000800900090009051 +:10F8000000000000200400010004000000000200CD +:10F810000000090000011100000041000000008408 +:10F8200009A00088098221A00984000021000000AD +:10F8300000000000000000000000000000210000A7 +:10F84000000000000008000000050000002000008B +:10F8500091050000000000080000000084009010E6 +:10F860000080000000030002002000A10000000052 +:10F870000008000000004000000000112000000807 +:10F880000000002000000004200000000000000034 +:10F89000820000000000C000000000000000000026 +:10F8A000820000000000000000000000820900004B +:10F8B0000400000900A00002118211A00020000431 +:10F8C000210005040082000400820010092009883C +:10F8D000112008000000200200000990000800002C +:10F8E00009880002000000000000008400200000E1 +:10F8F00000000000000000000000000020000000E8 +:10F9000000000000000000000001800000840000F2 +:10F910000000000000000090000004A0008404002B +:10F920000000002011900000000000000084000092 +:10F9300011001100008400000000020300210000FB +:10F940000000000300000000002100000008400843 +:10F950009000400040030000002188210021200386 +:10F960000000200020210003000220050000000309 +:10F97000000000210021000000030000000300003F +:10F980000021200000000011000000040000000021 +:10F99000000000020000000201210000010001003F +:10F9A00000000000900088110003C0040004001053 +:10F9B0000000000000004002000000000000000005 +:10F9C00000000000000000000084000800000008A3 +:10F9D0000000000000000082000000900000000015 +:10F9E00000000004000000000000000009002000EA +:10F9F00000000000050005000000008400A00908C8 +:10FA0000008400000000000000000008000000006A +:10FA1000000000840000000000000400000804C092 +:10FA2000080000901188110000C0110000000000C3 +:10FA30001190110040A000004002000000000000F2 +:10FA400000000000000000000000000000000000B6 +:10FA50000000000000000000000004080020000476 +:10FA600010041084828404A01082020000000800A8 +:10FA7000A0000000000000000000000000000000E6 +:10FA80000100000000000000000000000100200054 +:10FA900000000000000000000000000000009000D6 +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000008080000026 +:10FAE00000800080800009000000808080001100FC +:10FAF0008000800000000000050000000000000001 +:10FB000000000400000000000000000011001100CF +:10FB10008000040000000000000000000000000061 +:10FB20008000000000000000000000000000000055 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000008000000080000000A5 +:10FB6000008880000080880020A08800208041005C +:10FB70000300A005050000090000000000000000CF +:10FB8000001000000008000000000000000000005D +:10FB9000000800800002008000000000000000005B +:10FBA0000000800000008000000000800000008055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000000000000035 +:10FBD000000000000000000088000800A0000800ED +:10FBE000020002C0028284C00800C1C0041003C029 +:10FBF00000001000A0008200000000880000000843 +:10FC000000000001000000010000000000000000F2 +:10FC1000000000010084000000020000000000005D +:10FC20000000880002880800821000000008000020 +:10FC300000080000000000000000000000000000BC +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC6000000089A00004C088880803A100C1C085E5 +:10FC7000C08400020011000300900000000090000A +:10FC8000000000000000080000000100000000006B +:10FC9000000000000100040020000000000000003F +:10FCA00000000000000000008800000000000000CC +:10FCB000080000000000000000000000000000003C +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE00000000000410000808000008041080010FA +:10FCF00080210004000500880021000808000000A1 +:10FD000000000800000000000000000010000000DB +:10FD1000000000000000410080008000040003009B +:10FD200000000000000002000000000000000200CF +:10FD30000000800000000000000000000000000043 +:10FD400000000000000000000000000000000000B3 +:10FD50000000000000000000000000000000001093 +:10FD6000008000800000000000000000000000048F +:10FD700000800080001000080000008000080000E3 +:10FD80000002000000000000000000000000000071 +:10FD9000000000000000000000000004000000005F +:10FDA0000000000000000000000000020000000051 +:10FDB0000000004000000000000000000000000003 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE00000010020000800008200088208A08200B4 +:10FDF00082088820820882010088004000400001BB +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000010000E1 +:10FE20000000000000000000000000000089000841 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE7000484200000000000048420000000000006E +:10FE80000000000000E0070000000000000000E0AB +:10FE9000000000000000000000000000000000E082 +:10FEA00007008200000000000000000000000000C9 +:10FEB0000700000000000000070000000000000034 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000208802068 +:10FEF0000208802024000024020880200000000066 +:10FF000001000000000000000000000000000000F0 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF6000000000000000000000000000000001048C +:10FF70004010010440108100008101044010000085 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000000000000000000000011 +:10FFF00024000024040810200408102004011040EC :020000040022D8 -:100000003C3C3C3CFFFF000055553C3C00010000DF -:10001000000000000000000000007D2D7D7D00003C -:100020000000FF4FFFFFF0F0C3C3808200000A0012 -:100030000A0000000000414055502D2D2D2D005587 -:100040000055555555550000000028EBFFFFC3F043 -:10005000FFFF550F170F0B0A0B0B0F554D55AB003C -:10006000EB000F0F170FFBFAFBFB00000000AAAA22 -:10007000AAAAFF00FF00F541F5EBFC0CFC0CAFAFAA -:1000800005050F550F55F505F5050F0FFF0000008D -:100090000000000000000050008000007D2D7D2D3C -:1000A00000000000FF4F0000AAAA00FF00000000AF -:1000B000FAFFFAFF0000000255545550FF00FFFF01 -:1000C000F0F0F0F0F0F055550000000000FFFFFFE9 -:1000D000F0F0FFFF40618002802510024061800740 -:1000E000802D100240618007802D000205610A2AE0 -:1000F000850900A000613007800D00000061002725 -:10010000000D000000610027800D00000561502FE8 -:10011000850900A00000000030210040000100001F -:1001200030000000000000613006000D0001056194 -:100130004A2F050D00A100610006000D00000061BE -:100140000E248015000000610006800D0000406351 -:10015000800180219202FF5575558ABA8ABA03F34D -:1001600003F3FFF00F000000000000C300C33CFFDA -:10017000BFFF55FF00AA00000000FFF00F000000C5 -:1001800000000F55C3000000000000000000000048 -:100190000000F3F328EB0000FC0C3F3FBEBE287DBF +:10000000000000005555555500000000000000009C +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:10003000000000000000C000FCFF00000000000005 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:10007000008081000081010240800102408008026E +:1000800020800000000055550555000000000000CC +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B00000000000000000008040FDFE0000000085 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000060000000000010000061000629 +:10010000000D080000610006000D000005610A0FE7 +:10011000050D00A0000000610007000D00000000B8 +:1001200000000000000005610A0F050D00A000009E +:1001300000000000000005000A08050000A00500FE +:100140000A08050000A000000000000000000000F8 +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F -:1001B00000000000000FC355000000000008000808 -:1001C000CACAC0C00C0C0C140000000000000000E3 -:1001D00050505050F03CF000005545558ABA0AFA8C -:1001E00003F303F3FFF00F0000000000FFC3FFC3A1 -:1001F0003C00100055FF00AA000000005353535369 -:10020000000000000F55C3FF0000000000000000C8 -:1002100000000000303028EB0000FC0C30301414DB -:10022000287D000000000000000000000000AA007F -:10023000F00000000000FF0FC35500000000FFCBDE -:100240000008CACAC0C0CFCFCFD70000000000004E -:1002500000003C3C3C3CF03CF0003C007D41407CDC -:10026000437F00000000FF0FF0000000FFFF0000D0 -:10027000000055555555FA50FA5000000000000096 -:1002800000000000000000000000FF00FF0400006C -:10029000000000001000000000000000F5055F5F96 -:1002A000F0FF3CF000000000000000000000000033 -:1002B0000000000000000000550F00C30000000017 -:1002C000000000005F554B413C3C00000000000076 -:1002D00000000000F1F1010100FF1414FFC37D4193 -:1002E000407C437F00000000FF0FF000F0F0F0F0D2 -:1002F00000000000F330F330D2D2D2D20000000070 -:10030000000000000000000000000000FF00FF00EF -:100310000000000000000000000000000000F505E3 -:100320005050F0003CF00000000000000000000011 -:1003300000000000000000000000550FFFC3000097 -:10034000000000000A001E140A00AAAAAAAA0000BF -:10035000000000000000F1F1010100FF141484000E -:10036000002000002090C080048404C02080000091 -:100370004000040010002080000400202020000025 -:10038000400000004003880540092000008500006F -:1003900000000009400000000000000020000003F1 -:1003A00000004000000020002000200000000000AD -:1003B000000000000002000000800080001020000B -:1003C000C0000000A00000042000208404204000A1 -:1003D0000000000000000000000500000005208073 -:1003E000400000010000002120048021892100102C -:1003F00000008000000080000040000104010001B6 -:1004000000008000008280000082000000080020C0 -:10041000400000000000000000000000000000009C -:10042000000000008000000000000000000000004C -:100430000900000000000001000000100010000092 -:100440000000000000000000000100000005800323 -:1004500080004000000000001000000000000000CC -:100460000810000000080000008800A000200082A2 -:1004700000020004000000000008000400024088A0 -:10048000A000040240200020108020050004008904 -:100490000020002000040084008400040004000008 -:1004A000000400000010010000090100000000210C -:1004B000001000000009000000000205000082801A -:1004C00000000008820000000000008300032008F4 -:1004D0000088000000000009000000090000020080 -:1004E00002000288000000100008000200050089D8 -:1004F00000210001000900080008000004090009AB -:1005000091200040000980090085800484080009CA -:1005100000200009000900890021002100C1000914 -:1005200000840001000000084008008802080084E0 -:10053000000400080084000800000084800800888F -:1005400000400000000000820082008400100000D3 -:10055000800000040000000800840000000400087F -:100560008008000000100408000500200011002190 -:1005700000088221008000030005001008050241E8 -:10058000098001058500008304000005040800417E -:1005900010020000004100210021000800000003BB -:1005A00000100002004100008421002100C1000071 -:1005B00000000000000500000041840884000000E5 -:1005C0000002000091000021848088210009A01011 -:1005D00000050505050504210000012100020008B1 -:1005E0000002000000210141800000002001219054 -:1005F00000000000008800040800000000848084DF -:100600008000024002880200002080C000108800A4 -:10061000000080844184030000C0058803A000001E -:10062000008220020000030000000000000000041F -:10063000050000000000080021C01100030811009F -:100640000000411005A008000000000200000000AA -:10065000000800088410A00880084102028220A03F -:100660001182000100000200408200000000000230 -:1006700000050000008000800000400000000080B5 -:100680000100108001800090418040110000900026 -:1006900001000800408301000800008000200000E5 -:1006A000000008110000000490C10000841108003F -:1006B00000410000400000000800000000000000B1 -:1006C000000008000000000000000000000008001A -:1006D0000000200000032000000001000000820054 -:1006E000000082000003828000000100000000047E -:1006F00000A10008200800020004000800A000007B -:100700000004100000202020000402020800000065 -:10071000000020002010082020820000000440017A -:100720000000118800820010008300020000008891 -:1007300002A00208008805000000009000000000F0 -:10074000008200000000000000080000000000001F -:10075000008400008084000880000000040800007D -:100760000000000000A00082000200004000022102 -:1007700000110000001000410000002000410010A6 -:10078000210000210020002102210080A00400009F -:10079000A000000021030102A000002110040002BB -:1007A000A0030021084182080000000000000000B2 -:1007B000000000030000008800410041000000002C -:1007C0000000820000000000008800000880000097 -:1007D000000503020105000000008810010001006F -:1007E00000000000000090050040000020200441AF -:1007F00000100000001000A0000009000009001017 -:1008000000002000000005C10000000000040011ED -:10081000101002002008A010040000000008800151 -:10082000000400A00000000800080302020000000D -:10083000000000880000000005090300000000001F -:1008400000000084000800002188400200008010A1 -:1008500000820900400240A008A000902010201053 -:10086000408400A00000008400020000210020203D -:1008700002C0000300410000000800090010002130 -:10088000004000200020002002A100109011004133 -:100890000210820040000008000000031121001037 -:1008A0004003000508400041000000020100001163 -:1008B0000005000000000011000985021010000072 -:1008C0002000A0410000000002400000C01100090B -:1008D00000098400904000020021822102400208A9 -:1008E00000050008000402080021001000000000BC -:1008F00000100108000000000000000000000000DF -:10090000000000000003400100034004000000005C -:100910000000000008000200000021000000C000EC -:1009200000008000050000C00800110010C0101079 -:100930000020110000000000004000401090000066 -:100940000000000005000000000000001100000091 -:100950000000000000000000000100000000000096 -:100960000000000000000000800000000001000006 -:10097000000000004000A082A1201002A010110081 -:10098000119088000888000000000000000089C065 -:100990009090880810880000010001010000010209 -:1009A0001190110410000000000001000000000080 -:1009B000010088000000000001C000020004840261 -:1009C0000000000000000000C0C000020004C09150 -:1009D00000090082000002040100A00008010000DC -:1009E000000101A104110408000000000000000043 -:1009F00000000100040000018000110080000000E0 -:100A00008400888010000000000000001100000039 -:100A10009180A1808880000000102100084000051E -:100A2000040041808400000000000000020000007B -:100A300000000400090000000000090000000000A0 -:100A400000800000000000000000004000090005D8 -:100A5000001000880010000900112000A0100008FC -:100A60000009051040400040801000000000000018 -:100A700000000009031000030021100041408940DC -:100A800091008809109011899003008900000008E6 -:100A900000110940910009888483020004001100BC -:100AA0000809008900110005808300080000000487 -:100AB000008000030000000300000000400000214F -:100AC0001140891000000000000000000480214156 -:100AD00004840402800080028000800090808300F3 -:100AE00090009108800204080500A18000008000A9 -:100AF00000008000000004000900002184004089FB -:100B0000A09183882090C190058809000020008270 -:100B100000010082011182008489C19100100084CB -:100B20000000008410020200000190890001009082 -:100B30000001000400000000000000000000899097 -:100B4000C002830911010000000000000000014004 -:100B5000010500A1010102000801A040080004C035 -:100B6000030082002003A020A001010409088400E2 -:100B700010008400C00082020000C00000A1022119 -:100B8000000004A0888810110801024001A10100A2 -:100B900000008200000000400400900888C10101AC -:100BA000000184010100100200A0009102C10000B8 -:100BB000C000C000000000000400000000010000B0 -:100BC00008C00088000420080000000000000000A9 -:100BD0008210004085040400000200100104A000FF -:100BE0000000010000010100000301A1000008084D -:100BF000000000000000000000010000C001000132 -:100C00008420000200090489000880110002418349 -:100C1000020000000000030000900021808984840D -:100C200004400308102140040005001000A080418A -:100C300009008000800009000010801000200041A1 -:100C400000008000000000000080000000000000A4 -:100C5000000000002080100080000000008008805C -:100C60008000000003211005110300044110020957 -:100C700080900000000000000000004011411121A0 -:100C800000408080808480800010C191901103809A -:100C90009103410420040200080088919082898019 -:100CA000842041820209410005104111900010008A -:100CB00003000004004000000000000000000000ED -:100CC0000000000041100280040084400000000089 -:100CD00000000000218020002000C04000098000AA -:100CE0008000000010840900100010102021210055 -:100CF0000000090400050080008000000800038057 -:100D0000100010000804028302048200C041218404 -:100D1000119011010100000101000100C141208971 -:100D2000080803010108000000000000030120A0E2 -:100D3000040440000000000100000000000000006A -:100D4000000000000000918402202004A0010000A7 -:100D500000000000000091040200C0000500200017 -:100D600088044002040000C1008800C00000C101E6 -:100D7000C000888420010000000400400000010041 -:100D8000000801880000000000000700000000418A -:100D900000E007000011818100E007000000000072 -:100DA00000E007000000000000E0070000008841AC -:100DB00000E007004100008100E007004206480013 -:100DC00000E0000000000000820000E000000000E1 -:100DD00000000000000000000000000000004200D1 -:100DE0000000000000000000880000E00000840017 -:100DF000884100E007004100000000000000000002 -:100E00000000000000000000000B0B0B6666666629 -:100E1000C0C0C3420000007E0000000000000000CF -:100E20003F306C6CFF3C66FF0000000000000000DB -:100E30003F3F3F30F0F0FF3C0000000000000000AA -:100E400000000000000000000000FC9F0C9FCF008D -:100E5000CFC30000000000000000FF4EC34EDB09BE -:100E6000DB0999FFFFFF0000000000000000000008 -:100E70000000FF240F240C0C000000000000000004 -:100E80000000000000000000000000DBDBDB666605 -:100E90006624C300C34200000042000000000000BE -:100EA00000003F306C6C003C660000000000000059 -:100EB000000030303F30F0F0C300000000000000C0 -:100EC000000000000000000000000000FC900C90FA -:100ED000CF3CCFFF00000000000000003C4E004E61 -:100EE000DB6FDB6F99FBFFFF0003000300000000D6 -:100EF00000000000F02400240C0CFFFF00000000A4 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000100000000000000010000EC +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000200000000000000EB +:1003100000010000000000000000000000000000DC +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:100360000400000000000000040000050000000080 +:100370000811000008000000000000040000000553 +:1003800020050103000000040000000000040080BC +:100390000420081000040000000200080008000308 +:1003A0000400000000000000000000000000400009 +:1003B00000002000400200040010000400000004BF +:1003C000208000008880008000410000000420049C +:1003D0001080208020800080040020002000400049 +:1003E0000082000000040000000000000000000087 +:1003F00000008008000480081000000200000004D3 +:1004000000000000080200000000000000000000E2 +:100410000010800180010000000200000090000038 +:100420000000000000000000000040000000080282 +:100430000082002000002084008400840503000264 +:100440000000400400820004000441040090000108 +:1004500000014004002000201020400084008000A3 +:10046000A1040000000000000000000000000000E7 +:100470000010000000000800040000000000000060 +:10048000000000000000000001000000000000214A +:100490000000000000880000008000000000000054 +:1004A000008000000000A000850083000000000024 +:1004B000008000000080000000800082000000003A +:1004C000008500800000000000090100000000001D +:1004D00000050000000220000000000088418400A8 +:1004E00084008400000000000402020200000000FA +:1004F00004000000008400008000000004000400EC +:100500000000040000000200008408000000000851 +:100510000000000800000010410000100208000068 +:1005200000000020000000840200080040000000DD +:10053000000800200008020402840204040400826F +:10054000000000040004000000000510020000C0CC +:1005500000C00084008400010000040000080000C6 +:10056000000000000000000000000208000004007D +:1005700090000000000802009000400000004000D1 +:1005800004004005040020080421000200050400C6 +:10059000040805050000002100210121092100A116 +:1005A00000210084002000000202008304040205F0 +:1005B0008820004100000000002100210010900868 +:1005C00000C0000040400000C00820058803002152 +:1005D000040440210008000404030020000000215E +:1005E00082218221002100210000000020000484DB +:1005F00000000008000000000000000000000000F3 +:100600000000830000008000000011000040000096 +:10061000800280028882000000A0008220002084E6 +:100620000020000000200001000000000040000841 +:10063000000000010000000800C0000000000000F1 +:10064000000000040000000000000800808400009A +:1006500000000001100004A0000080000001100054 +:10066000210000A00084000005A00000000000049C +:10067000000400000200000000000000080000006C +:1006800000000000000000000000004082000000A8 +:1006900000100000000000000000C0000809000079 +:1006A0000000000000210000000000000000000524 +:1006B00000000020000000800000004000000080DA +:1006C0004000010000808800A000200040000000E1 +:1006D000A011A000910090002000080802800000F6 +:1006E000080984A1200000000000000400000000B0 +:1006F00000000000000000000000000400000000F6 +:1007000000000000000000000000000000040000E5 +:10071000000000A0000000A0000000000008030886 +:1007200000000008000000000000000000000000C1 +:100730000000000000000008002000000000000091 +:100740000004841020000004200000A08000840029 +:100750000000000000000208000000008000C1044A +:1007600000008000000480840000008400850000F8 +:100770000000000000000000000000000000000079 +:1007800000000000000001080000008301030000D9 +:100790002021000200000100088500000083000005 +:1007A00004040010020020A1040000200004000046 +:1007B0000000080000100000000800050000010310 +:1007C00000002000001000000000040000000210E3 +:1007D0000000A008000800020009080482000009C7 +:1007E0000002900800008320C009002100000808D2 +:1007F0000000000200080084000000000000000863 +:10080000008800000000000404000000002004082C +:1008100000400040200000020400212000082020A9 +:10082000000480041104210000208904000100005C +:1008300000004110000011901100001000000000A5 +:10084000040000008000000002000082000000A000 +:10085000000004200008000800A000008001000241 +:1008600000A0002000000000200104A000840084FB +:1008700080000000000000080000000000000000F0 +:1008800000080000000000000000881100210005A1 +:1008900000000000200000210000000000084000CF +:1008A00008410003000800080003000000090009D7 +:1008B0000005000000000000000000210008000802 +:1008C000000000080000002120000005C0032011E6 +:1008D00020034021840090008800202100000009AE +:1008E000208040008811C005200440090441048490 +:1008F0000804820500000000000000000000000065 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:100920000000800000000000000000000000000047 +:10093000000000C0000000000000000800000000EF +:100940000000000000000000000080000000000027 +:1009500080008000A00000000000000000000000F7 +:100960000000800480000000000000000000002063 +:1009700004108001000000000000000000000000E2 +:1009800000000000000040C0088800821004000041 +:1009900000000000000041021004000210020200EA +:1009A0000000000002000090000000909000000095 +:1009B000000000000000000008C00802048210C00F +:1009C00000000000000000000000A0011100000075 +:1009D000000001009000000000880085010900105F +:1009E00084A185C00082C0094090008901900089DF +:1009F000C0418340018382A100000000000000008C +:100A00000000000000000000800080000080000066 +:100A10000000000000000000840000000000000052 +:100A200000000000000000000080000000800000C6 +:100A3000000000000000000000008000C0000080F6 +:100A400000000000000000000000000991400408C0 +:100A5000001000004100820000000002002102207E +:100A6000000400102110059180840941000820092C +:100A70000008001021104088001000000000000055 +:100A80000000000000000000000080008010000254 +:100A900000000000000000000000800080A1008233 +:100AA00000000000000000000000004100108089EC +:100AB0008000000000000000000000008000802096 +:100AC000000000800000000000000080109008007E +:100AD000030921100010000000020000008800033C +:100AE000001100C11005058211020820000900C193 +:100AF00080400080100910021102881100000000DF +:100B000000000000000000000000000008000802D3 +:100B100010C08804000000880000008804000882DB +:100B2000908288C090001088100010880001880111 +:100B3000A0A008000000008800000088000010004D +:100B4000080302C084020000008800000008019031 +:100B50000100010001010000000000000000001180 +:100B6000009100020011C1908408C090C1042000CF +:100B7000102188020808A190828483840504000063 +:100B8000000000000000000000000000000011084C +:100B90000008C0821002000000000200000084046F +:100BA0000008001002080004002020C0000800888F +:100BB00008900004830200000000C0000000000153 +:100BC00011040008C0118984000000000200000028 +:100BD00000000901000000000000C000000000004B +:100BE00004002100000002000905418484830405FB +:100BF00082100088102002C005A121824083C00419 +:100C000000000000000000000000000000000000E4 +:100C1000C180008000008000100000000000000083 +:100C200011800080008080800900000000000080AA +:100C3000000080000080C1801000000080000000E3 +:100C40000001C1400084008509030200000000008B +:100C5000000000099010410802210211001000104C +:100C600009108000C10010008800C121101011215E +:100C700010900200118085008280C121080310219C +:100C80008988000000000000000000000000000053 +:100C900000000000001180000000000000100000B3 +:100CA00000000000000800000000000000820000BA +:100CB0000000000000110080800000000002000021 +:100CC000000000010000008400008000000000041B +:100CD0000000000010840800100008200000000040 +:100CE00000000000881008100300100002C01188E6 +:100CF00040800811800000908011000003008504EE +:100D000088801010000000000000000000000000BB +:100D100000000000040004020802100000000000AF +:100D200000000000020004030210020000000004A2 +:100D3000000200004000200110040200000000003A +:100D4000000000000001100010110802080000005F +:100D500000000000000001A10000000001000000F0 +:100D600000000000000010000900A1009000211107 +:100D7000042110080201020088A0902188008588C3 +:100D800008A00904030100000000000000000000AA +:100D90000000000000000000000007004800000004 +:100DA0000000070000000000000007000000000035 +:100DB000000007000000500A00E00700810A000060 +:100DC00000000700000600000000000007004800C7 +:100DD0000000000007000000000000E0000000002C +:100DE000000000E000004100000000E000004106BB +:100DF000000000E007004812000000E0070041008A +:100E0000000000E00700480A0000000000000000A9 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E3000000000000000000066666666000C00000E +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E600000000000000000000000F3E730E7000091 +:100E70000000000000000000000003813F81240FFB +:100E8000E70F00000000000000000000000000006C +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB00000000000000000000001466666660000B9 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE000000000000000000000000000F324302497 +:100EF00000000000000000000000000003BD3FBD36 +:100F0000240FE70F000000000000000000000000B8 +:100F1000000000000000000000000000021020009F +:100F20000088108400000000000000000210200073 +:100F30000088100400000000000000000000000015 +:100F4000000000000000000000000000000002108F +:100F50002000008810840000000000000000000055 :100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000FFC39F -:100F9000FFC3C202CE0E3C3C3C3C08003C3C00007F -:100FA00000000000000036360CFC666600FF000002 -:100FB00000000000000006F6F6F6666666660000B1 -:100FC0000000000000000000000000000000000021 -:100FD0007E7E1E7ECFCFC0C000000000000000005B -:100FE0009FFFDFFF000000007E66666600BF008393 -:100FF00000000000040F000B87818781FFFF303065 -:101000000000000000000000000000006666666648 -:10101000FF99F09000003C3C00FF00FF0000000042 -:10102000000000000000000036360CFC00FF0F0F2F -:10103000000000000000000006F606060C0CFCFC98 -:1010400000000000000000000000000000000000A0 -:1010500000007E7E7E7E9F909F900000000000003A -:10106000000006664666000000007E666666009F19 -:10107000009F000000000F0F0B0B8781878100008D -:10108000303000000000C200020000000000427E7C -:10109000427E05614A0E050D00A010610027000D7B -:1010A000000005610A2D850D00A01061200F004D84 -:1010B000000805610A0F050D00A0006100258009E8 -:1010C000000005610A2F050D00A0006100078009DE -:1010D00000000000006130068015000000000000E4 -:1010E0000000000000613006000D000000610006F5 -:1010F000000D00010061000680090000006100246D -:1011000080050000000000000000000500610006EE -:10111000000D0001000000000F55C300A3A3000F45 -:1011200000C3550FFF003C3C0000000020E02CEC09 -:10113000C30F55000000000000C00000FF3C0F5529 -:10114000ACACF0FF00000000000000000000000058 -:101150003F3FA0AF00000C0C00400000000000006A -:10116000000000000000F2F300000000000000009A -:10117000000000000000FFFFFFFFA0F5A0F54141C7 -:101180007D41C3F3C3030000000000000000AF3C3A -:10119000053C00000000000000000F55C3FFA3A3A2 -:1011A000F0FFFFC3550F55550F0F0000000023E35C -:1011B0002FEFC30F55FF8000A0F000000000003C9F -:1011C0000F55ACAC000F0000000000000000000054 -:1011D00000003030A0AF00000C0C00000000000048 -:1011E0000000000000000000FAFF00000000000006 -:1011F0000000000000000000FFFFFFBF0000FFFF35 -:1012000041417D415555555500000000000000004A -:10121000AF0005000001000000000000413F410355 -:1012200000000000FF55AA000000000000000000C0 -:10123000000000000F00C355BEBE303000000000AB +:100F70000000000000000210200000881084000023 +:100F80000000000000000210200000881084000013 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC000060600FFFFFF0000000000000000000018 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF000707C737F00000000000000000000000013 +:10100000BDC081C0F909F90900000000000000001E +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:101030000000000000000000000000008000000030 +:101040000000060600FFF0F00000000000000000B5 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000404C434F0000000000000000000052 +:101080000000BDFC81FCCFCFC0C00000000000000C +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000005000A08050024 +:1010B00000A0000000000000000005000A08050074 +:1010C00000A000610026800D000005000A08050050 +:1010D00000A0000000614006000D000105000A08A4 +:1010E000050000A000610007000D0000006100077E +:1010F000000D000000613007000D000000610007D6 +:10110000001D000085610A0F059D00A10061000718 +:10111000000D0000000000000000000000000000C2 +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:1011500000000000000000000000575207020000DD +:1011600000000000000000350035FCE80000000031 +:1011700000003CFC00003070F0B00000000082A0D5 +:10118000D7A0C0C0FFF000000000000000000080F9 +:101190005DDDF0FFFFFF0000000000000000000028 +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000F7F2A7A2DD +:1011E0000000000000000000003C0055FFFF031756 +:1011F000000000007F3D4001F3F2F0F1000000002C +:1012000082F5D7F5C0C00F0000000000000000000C +:101210000020D5F5F0FF3C3C00000000000000007D +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E -:101250000000000000000000000000000000287DE9 -:101260007D7D000000000000000080C082C3C3D666 -:10127000C354FFFFFFFF0000000000000000FFFF5D -:10128000FEFFFF0C550CAAF0AA00000000000000B1 -:1012900000003F350F050F000F00000000007D3FEC -:1012A0007D03000000004B4B4B4B00000000000092 -:1012B0000000000000000FFFC355BEBEF3F3400066 +:10125000000000000000000000000000000000008E +:10126000000000000000000000000F0C0F0AEFEF6C +:10127000AEAE0000000000000000171717170000B6 +:1012800000005F50FCFCBE30BEF300E83CE800000C +:1012900000000000020880000100000000000000C3 +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E -:1012E000287D28280000000000000000A0F0AAFFD0 -:1012F000FFFEFF7CFFFFFF3F0000000000400040BA -:10130000FFFFFFFFAA0C000CAAF0AA0000000000DB -:1013100000000000303500050F000F0020102000F5 -:10132000000000000100208000880000200000056F -:1013300000040000200020000000200020004003E6 -:10134000000000000000C0100080C02100008400E8 -:1013500000000080000020000090208000030004B6 -:101360002100000400040000400000000000000014 -:10137000100000000010000020000000204040008D -:1013800040004000000000002000040000000000B9 -:101390002000000084050000200000032000002041 -:1013A0000000000000840200004000200000000057 -:1013B000020000010000000000000000000000002A -:1013C00000000000000000004100091000000000C3 -:1013D00000000000000220020000000200100000D7 -:1013E00000001000000000000000000000000000ED -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:10141000000009000002000000000000000200843B -:1014200000000009000000000020029000200010D1 -:101430000204000400000009000000100000A000E9 -:101440000000000008090000820000000000844045 -:101450000000000908000400000800002000000946 -:101460000000A000002004000000000000000000B8 -:101470000000000400002002000000000000000046 -:1014800004000800000000000400A00000000000AC -:101490000000000000000000020000410000000009 -:1014A00000000008000000840088008900200085FA -:1014B000000800890089000800100010000800845E -:1014C000001000880088008400C00088200000828E -:1014D00000080088000880A0000000840088808840 -:1014E00000080000000800098000000800000088D3 -:1014F0000008001000110088800000020084000035 -:1015000000000088000800080008008400080000AF -:10151000000800040084008400100000008800001F -:101520000000000090050008001000000008008086 -:101530000241010000210000A0102004000800006A -:101540000008000800210021000300000003000043 -:10155000000800210010001000100000000400032B -:101560000000C021000000110009900901020009DB -:1015700082000005080800080008000800040000B8 -:101580008200820082000000000010009000200312 -:1015900000000000000800000000000000400008FB -:1015A00000080000000010C00082000000080000D9 -:1015B0000040848802A00008000200A0410100A0B1 -:1015C0000000000000840008000800C00084030040 -:1015D000020800100084000800A003400000410938 -:1015E0000000000003000000210200880008100035 -:1015F00000080800030008000000080000000401C3 -:10160000040811000000000005C00000000000C038 -:1016100020A000A000840008000800C00084000290 -:1016200000100082000800A0000000000000000080 -:101630000000000008800000000000009000000092 -:1016400020000000820000009000000082002010B6 -:101650004000A000200040000800008000000100C1 -:1016600020008200A00000800000080040000080F0 -:101670004080000004800280048000800080000020 -:101680000000000000000000000000000800000052 -:10169000000000000000000000000000000000004A -:1016A00000040000000000000000000000100084A2 -:1016B00000A000000000004000000000000000C08A -:1016C0000000008400000300000200000000110080 -:1016D00000000000000000004000000000100000BA -:1016E0000400000000C00900002000000004800485 -:1016F0000004802000000004000400040020000416 -:1017000000000000000000000000000000000000D9 -:101710000000000000000000008400000000000045 -:1017200000000000000000000000000000000000B9 -:101730000041000003050180010001800000000855 -:101740000000000500400000000000210000000033 -:10175000000000008200A01184000000C021C00031 -:101760000010C041000200040004004100000020FD -:10177000040300201021000400000000000000000D -:101780000000002004000000000000000000000035 -:101790000000000000000000000000000000004108 -:1017A000000000000008000000000000000000A091 -:1017B00008840000118482A002200482044000906A -:1017C0000000008800000008008400840040000041 -:1017D000000000100008001000000000008421003C -:1017E000000000A0000000100001000100A00000A7 -:1017F000030180A011A1C000001100000000000042 -:101800000308210011218000000000C0001000A08A -:10181000100000000088100802000082000011C0C3 -:101820000000000000000010000000C0040000A044 -:101830000021000000080004001000040210000451 -:101840000011000400000000000000000000002162 -:101850000009080200049002900084008200000247 -:101860004020A000A04105089020002020200280F8 -:10187000000000040004A011A00400048205C009B7 -:101880000004000000050004000000000004000443 -:101890000000000000000000000000000000000048 -:1018A0000000000000000008000000000000000927 -:1018B0000000000000000000084000000000800060 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000088000000A020A0000020 -:1018E00000020001000000828800008300C1008324 -:1018F00000040000000100010000000100000000E1 -:1019000000000500000000000001000000000000D1 +:1012E00000000000000000000000000003000500F6 +:1012F00045EF04AE0000000000000000FF3CC3000A +:10130000000000005F500C0C823082F3C3E8FFE85D +:10131000000000000000320B80004342000000404B +:1013200000042000001000080000208000000200DF +:101330002000000010000000040004000010040061 +:10134000000020000000000000112000A00020008C +:101350004000000020008400200010000003000076 +:1013600020000000200000000400000020002000F9 +:101370002000400000002000208084002080000029 +:1013800020000000100000032000000020002000CA +:101390002000200088002000000020002000000025 +:1013A0000002000000020000000000900020000089 +:1013B00000000000000400000000000400044002DF +:1013C0000090000000000000000000000008000085 +:1013D000000000000082000000000000004000004B +:1013E0000040004021024090400000820000004088 +:1013F00000400000000200200090001000C000200B +:101400000002009010900002000000000002004066 +:1014100000000000000000000000000000000000CC +:1014200000000000000000090000000000000000B3 +:1014300000000000000000000000000000000000AC +:101440000000000002000000000000000000020098 +:101450000400000000000200000002000000000084 +:10146000000090000000000000000000020090005A +:10147000000000000000000000000000020000105A +:101480000208000002000000000000000000000050 +:10149000000000000000000000000000010000004B +:1014A0000000000000000400000000000400000034 +:1014B000000000000400000004000400040000001C +:1014C000000000000000008400000000048800000C +:1014D00000000000008420080400400000C000005C +:1014E00002000000000000880000000000000088EA +:1014F0000088040800000000000800004000000010 +:101500002085008200880002000800000000000022 +:1015100000000090000000000008001000004000E3 +:101520000000009000000000000000000000000823 +:101530001000000002000000900000000000000009 +:1015400000000000000002000200021040004008FD +:1015500040080041000040000005040090008400A5 +:1015600000054000000090000208884000000000D4 +:1015700000400000000240020000000040000000A7 +:1015800088210000000000020040880002000000E6 +:10159000000200090000000004000009100004001F +:1015A0000000000000000000008400000000008235 +:1015B000000800000000000000000000000000C063 +:1015C000000200A000C0008402C01100000400104E +:1015D0000004040800900002000200020000000065 +:1015E000000000200084000000A0000000000000B7 +:1015F0000084001000C00000040000000000004053 +:10160000020000A0008400404108209000202184B6 +:10161000110400402004409000A0021000C040C00F +:1016200011024084000000000000000000000000E3 +:1016300000000005000000000000000000000000A5 +:10164000000000000000000000000000000000405A +:101650000000000000000000000000000021000069 +:101660000000000000000008000000000000000072 +:10167000000000000000000000000000000000006A +:101680000000000000000000000300002002000035 +:10169000080000000000C000000040410000000001 +:1016A0000041000900110000840800000000000053 +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D00000000000000000A000000000000000006A +:1016E00000000900100000000000000000080000D9 +:1016F00041000010000000A0008400000000000075 +:1017000000000008000000000000000404000000C9 +:101710000000000040000000000000000000000089 +:101720000000000000840000000000000000100025 +:1017300000000000000000000000000000000008A1 +:101740000000002000000002000000000000000077 +:101750000000000000000000000000000000000089 +:101760000000000000000000000008000000000071 +:101770000000000000020000000000000000000067 +:101780000000080000000000C00000100000000081 +:10179000000000030400000000080000000000003A +:1017A0000000000000000000000000020000000037 +:1017B00000000000000000000040000000000000E9 +:1017C0000002008200A0000000A0000000A00000B5 +:1017D000110800A0001000000002000040024000BC +:1017E00000A040040000090000A0000000A00000CC +:1017F00000C0000011880088000000840000200064 +:1018000002C0004040000904004000000000000841 +:10181000090040400040004020C02004108840C023 +:101820000008030400040282000000A00302050473 +:101830000000000000080000000000080000000098 +:101840000000004000080000000000000000000050 +:101850000000000000000000004100000000000047 +:101860000000000000000000000000000008000070 +:10187000000000000000000800110000000000004F +:1018800000000021002100410000000000000000D5 +:1018900040000041000000210000000000000000A6 +:1018A000001100000000000000000000080000001F +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000008000010 +:1018D0000000000000000000000000000000000008 +:1018E000000000000000000000000082050400006D +:1018F0000000000000A00000000000000500000043 +:1019000000000000000000042000000000000000B3 :1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000088C00090CF -:101940000008081000010000A000000000000000D6 -:1019500000000000000000000000000040A0840221 -:101960000040822010409188A0C002401002100464 -:1019700001032002000010C0000205A008000000C2 -:1019800000000000000000009000000000000000C7 -:101990000000000000000000000000000000000047 +:1019200000000000000000000000100000000000A7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:10198000000000000000000000000000000000A0B7 +:1019900000900090008400000000000000000000A3 :1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000808027 -:1019C0000080000000000011111000110010000044 -:1019D0000000000000000000000000000000008087 -:1019E0000000000080008080A000000000008083D4 -:1019F00080854003008500008900210005008000EB -:101A00000000000005000000110080000900000037 -:101A100000000000000000000000000000000000C6 +:1019B0000000000000000000000000000000030024 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A10000080000000000000000000000000000046 :101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 -:101A400000008008808080800000100011001010CD +:101A40000000800000008000000000000000000096 :101A50000000000000000000000000000000000086 -:101A600000000005008000001080A1800511110316 -:101A7000A0092180830802200000800500100009D1 -:101A80008009004000000002000000080000004142 -:101A90000000000000000000000000000000000046 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000800000038080800000000000000043 :101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC0000000000010018488C09000A00000010008 -:101AD0000001000000000000000000000000000005 -:101AE000000000000000001000001102910810002A -:101AF0004089884083C00201838400000890000070 -:101B0000A0009084000000000001000000010040DF -:101B10000000004000000000000000000000000085 +:101AB00000000000000000000040000000000000E6 +:101AC00000000400080010001000000000000000EA +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B10000000000010009000A08490200000000051 :101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000040901088C0000001006C -:101B50000000000100000000000000000000000084 -:101B600000000000022000A0000804049011008979 -:101B700008919141834008A040049010000040C0AB -:101B80000001C0A102C100008200000000000100AD -:101B9000C00004000000000002000000000000007F +:101B30000000000000A00000000000010000000004 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B900000000000000000880000000008020000B3 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 -:101BC0000000000000000000008080008080001005 -:101BD00040000010001100000000000000000000A4 -:101BE0000000000000000000008000808000898468 -:101BF000001080A108208400C080108009800000AF -:101C0000800200080005854100000000000005007A -:101C10000200800080004100000080000000000001 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C10000000000000000000000000000000008044 :101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 -:101C400000000000000000008011808900000000FA -:101C50001002110010000040000000000000000011 -:101C600000000000000000000009000080000000EB -:101C70000388050410911040210520200800114020 -:101C80000000C1400280C080400000000000000051 -:101C90000000000000200000000000000000000024 +:101C40000000000000000000001100800080000083 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C9000000000000000000000000009002100001A :101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC00000000000000000000000C001208810108B -:101CD0000000009101000000000100000000000071 -:101CE0000000000000000000000020002000400074 -:101CF000880000C1008800410000010400C101A06B -:101D0000010100009101A08241404100000000005B -:101D100000000000000000010000000000000000C2 -:101D200000000000000000000000000000000000B3 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D500007000000810000E000000000000000001B +:101CB00000000000000000000000020040000400DE +:101CC00020000000000000000000000000200008CC +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D1000000000000000000000000000900020A172 +:101D20009020000000000000000000000000000003 +:101D300000000000000000000000000001000100A1 +:101D40000100010000000000000000000041000050 +:101D5000070000000000000000000000000000007C :101D60000000000000000000000000000000000073 -:101D7000000000000000000007008400008100E077 -:101D8000070042000000484200E007000000480051 -:101D900000E000000000004200E0070082000000B8 -:101DA0000000000000000000000000000000000033 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D900000000000000000000000000000000081C2 +:101DA000000007000000000000000000000000002C :101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000AFAFB5 -:101DD000F0FFFFAAF0FF000000000000000000007C -:101DE0000000000000000000000000000000C341EF -:101DF0000301FAFAD782000000005050F3030000FC -:101E00000000D0D0D0000000303F3F3F82C3BEFF73 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 :101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 +:101E200000FFFFFF00003C3C00000000000000003D :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 -:101E5000A0A0000F00AAF000000000000000000099 +:101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 -:101E7000FF550F05D7D7D7D7000000005F5FF303EA -:101E800000000000F0F0F0F0000030303F30820041 -:101E9000BE3C000000000000000000000000000048 -:101EA0000000000000000000000000000000000032 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA000000000AFAFAF00003C3C000000000000AD :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 -:101ED0000000CF0C17170F0F555500000000000031 +:101ED000000000000000BE3E3E3E0000000000008A :101EE00000000000000000000000000000000000F2 -:101EF0000000E3EB000000000000C028C0EBD2D2DD -:101F0000005500A200F300FA0FFC0000FFFF5F5035 -:101F1000555555550000000000000000000000006D -:101F200000000000000000000000000000000000B1 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F20000000000004C70FCFD0DF202F000000000A :101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 -:101F500000000000CF0C1717FF000F0F000000005B +:101F50000000000000000000AA00000000000000D7 :101F60000000000000000000000000000000000071 -:101F700000000000F3FF000000000000FC28FCEB64 -:101F8000D2D2AAFFA2A2F3F3FFFAFFFC00000000E6 -:101F90005F503CFF3C00000000000000000000001B -:101FA0000000000000000000000000000000000031 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA00000000000000004C70FCFDFD00F000000CA :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 -:101FD0000000000000001000200800400008006120 -:101FE0000000800100000000000000000000000070 -:101FF000000000000000000000000000000005617B -:102000000A0E050D00A005610A2F051D00A00000A5 -:10201000006100258009000000610007800D0000BC -:1020200005610A2F050D00A000000000000000005F +:101FD00000000000000000000020000000000000E1 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:102020000000000000000000000000380000000078 :1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 +:10204000000000000000000000610006000D00001C :102050000000000000000000000000000000000080 -:10206000F5F5F5053CAAFFAA0000000000000000FD +:102060000000000000000000000000000000000070 :102070000000000000000000000000000000000060 -:1020800000E000EB8FDF5050E0EB000000000000AC -:1020900000005F0A7D7D3A3AF0FF0000000000007A +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 :1020A0000000000000000000000000000000000030 :1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 +:1020C0000000000000000000000041A041F50000F9 :1020D0000000000000000000000000000000000000 -:1020E00000000505F50500AAC3AA000000000000D5 +:1020E00000000000000000000000000000000000F0 :1020F00000000000000000000000000000000000E0 -:102100000000E0E0EBEB8FDFFFFFFFFF00000000CF -:10211000000000005F0A28283A3A000F0000000083 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF :1021200000000000000000000000000000000000AF :10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F +:10214000000000000000000000000000EBA0EBF524 :10215000000000000000000000000000000000007F -:102160000000000017D71714F0FFAAAA0000000013 +:10216000000000000000000000000000000000006F :10217000000000000000000000000000000000005F -:102180000000000000000000F0C0D0C00000C2FA53 -:10219000F37DC355000000000000000000000000B7 +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F :1021A000000000000000000000000000000000002F :1021B000000000000000000000000000000000001F :1021C000000000000000000000000000000000000F :1021D00000000000000000000000000000000000FF -:1021E00000000000000017D71714000FAAAA000073 +:1021E00000000000000000000000000000000000EF :1021F00000000000000000000000000000000000DF -:1022000000000000000000000000F0F0D0D0C2FA92 -:10221000C2FAF37DFF55000000000000000000003E +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE :1022200000000000000000000000000000000000AE :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E -:10225000000000000000000002000400040004036D -:102260000010200000100008000000000000100016 -:10227000000000000000000000000000000000005E -:10228000000400000000000000100000000020001A -:1022900000000000000000000002400000004000BC -:1022A0000000000000080000000000000000000026 -:1022B00020000000001000000000000000000000EE -:1022C0000000000000004000A0000010000000001E -:1022D00020000000000000000000000000000000DE -:1022E000000040020000000000004000000000006C -:1022F000000000004000000000004000000000005E -:1023000010000400000000000000000000000000B9 -:1023100000000400000000000000000000000000B9 -:1023200000000000000000000002000000000000AB -:10233000000000000000000000020000400000005B -:10234000000000000000000000000000000000008D -:1023500000000000400000004000400000000000BD -:10236000A00902000000100000000000080000109A -:1023700000100000000000000200000082000000C9 -:10238000000000000200000000000100000000004A -:10239000000002000000000000100100000000002A -:1023A00010000000010010000000000000100000FC -:1023B000040000000000000002000008000000000F -:1023C00002000209021000001000000000000000DE -:1023D000000000000000820000000000000000007B -:1023E0000008000880100000001000880400008829 -:1023F0000008100000080008001000C00084001051 -:10240000001000100010000800C00040028400848A -:1024100000C0001080080008000000C0020000009A -:1024200003048000000010100008000000000000FD -:102430000000000800000410001000000010000858 -:10244000000000100000000800C0000800000000AC -:10245000000800080008000800000010001000102C -:102460000021000000210003020500000000200000 -:10247000000800000008002100000000200000000B -:102480000000000000009008001000000000001094 -:1024900000000200000000000041000000000008F1 -:1024A00000000010000040000100000000000000DB -:1024B000000000080000000000089000002000005C -:1024C0000000000000000800000000000000000004 -:1024D000C00000000000000000000000000000003C -:1024E000000000080000000000A000000000000044 -:1024F00000000000000000080000001000020010B2 -:10250000000008000800080008000000001000009B -:1025100000002100000003840384000000100082FA -:102520000082000000A00000808420000002000063 -:102530000000008200000000000000000400000015 -:10254000000000000000000000000000000000008B -:102550000000000800000000000000000000000073 -:102560000000000200000000000000000000000069 +:10225000000000000000000000000000000000007E +:10226000040000000000000020000008000304003B +:102270000080000000000004000000000004400096 +:1022800020000000000400042004000400052000D9 +:1022900000080000880001910003000040000505CF +:1022A000200520000000840000052100000000043B +:1022B0002000400000112000000004002000040461 +:1022C0000490200300002003C0042080890089803E +:1022D00041802002000020000000000000000000FB +:1022E00000000000000000400000000000000000AE +:1022F0000084000400000000000100000000000253 +:1023000000020000000000020000000300010000C5 +:102310000002409000000000081000000000800053 +:1023200040028000000000000000000040000000AB +:1023300000000000000041000002000040900090FA +:1023400008000011400000020090008440042000BA +:102350002002A002400800004000000084000000AD +:102360000000000002000400000040000000A00087 +:102370000000020000000000041000000000000047 +:10238000000000000000000000000000000002410A +:1023900000000000000001000000009000000000AC +:1023A0000100008083050000000000000000000024 +:1023B00000000400000900001000001000000000F0 +:1023C000000000000300080000000200000500807B +:1023D000008000410002000000000000000000003A +:1023E00000000200000000000000000000000000EB +:1023F0000084040000080000000200000008000043 +:1024000000000000000000000000000004000000C8 +:102410000482000004080000040000000011000015 +:10242000000020080004080004000000000840002C +:102430000000040000000408000800000000000084 +:10244000008200840000080000000008000400086A +:102450000002000204C00091000800080000000013 +:10246000000000000000000000000000000000006C +:1024700000000000020000000200008020000000B8 +:102480000000000800000003000000400000000001 +:10249000000020002000200000C100808880204132 +:1024A000000021000004000540040040000300106B +:1024B00000410040000220029011000000002000B6 +:1024C000000400009000200400008800900010002C +:1024D000000020000008000088000000000000004C +:1024E00010080000000000000000000000000000D4 +:1024F0000000000000A000000000000000048000B8 +:1025000000000000001000000000000000000000BB +:1025100000000000A0A0800080A0000400040004CF +:10252000808800008400000100000001000000001D +:10253000000000080000009011A0030200900000BD +:102540000000000000000000000000020010000079 +:102550000000008400200020000040000000000077 +:10256000000000000000000000000000000000006B :10257000000000000000000000000000000000005B -:1025800000000000A0000000400008000000000063 -:10259000000000000000000000000000000000003B -:1025A0000000000000000000008000840000000027 -:1025B000000000000000000000000000000000001B -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000A0000000A000040000A7 -:1025F000100000000000008200000000000000A0A9 -:1026000000000008000000080000000000000000BA -:1026100000000000000000000000000000000000BA -:102620000000000000840000000000020004000020 -:10263000000000000000000000000000000000009A -:10264000000000000000000000000000000000008A -:10265000000800000008000000000000000000006A -:10266000000000000000000000100003000000084F -:10267000000800000008000000000000000000004A -:10268000000000000000001000000000000000003A -:1026900000000800000000001000004100100000D1 -:1026A000000500050000000300000108000400030D -:1026B00000210000004100000000000000000008B0 -:1026C0000000000000000000000008000000000002 -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F0000008000000080000008440000000050001 -:1027000000C0000000000000000000000000000009 -:1027100000000002020000000000218800082110D3 -:1027200003C00000000011C000C000002001000133 -:102730000020040800C000080000000000000000A5 -:1027400000840000000000080000000000000000FD -:102750000000004000000000000000100000000029 -:102760000000000000000000000000000040000029 -:10277000002100040000000000000000000800002C -:102780000000004008000000000000000000000001 -:102790000000000090000000040000000000004164 -:1027A00000104002000000000008000400000004C7 -:1027B00000080004000200400021000900000000A1 -:1027C00000000000000000000000004000000000C9 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 +:102580000000000000050000000020000000000026 +:10259000C000000000000000000000000008000073 +:1025A000000000000000010004040000080000001A +:1025B00000001010000000000000000000000000FB +:1025C00000000000000000000400080000000000FF +:1025D00000000005000000000000000004000000F2 +:1025E000000000000000404000000000000000006B +:1025F00000000000000000000000000000000000DB +:1026000000000000000020000000000080840000A6 +:10261000002000000000000000000000000000009A +:102620000004009000000000400080000000000056 +:102630000000000000080004000003000008000083 +:102640000082000000000000008441000004080037 +:102650000000000000820000000000002088080048 +:10266000001000000000000000000000000000005A +:10267000000000000000000000000000000000005A +:102680000000000000000000000000000000040046 +:10269000000002000008000000800200000083002B +:1026A00002000000000000000000008801400082DD +:1026B000008200000005A00020400004004000103F +:1026C00002000000900040000000000400400000F4 +:1026D0000011000000000020100000000020000099 +:1026E00000000008000000000005000000000000DD +:1026F000000000000000000000000000000000409A +:1027000000000000000000000000000000100008B1 +:102710008000000000000000000000040000000035 +:1027200020000088000000000900000000200400D4 +:102730000020002000000000000000000000000059 +:1027400020000000400040080300000000101100BD +:102750000000110000000000000000A00090000038 +:1027600000004088000000000000000000000000A1 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 +:1027900000000000002100000000002100000000F7 +:1027A00000000000000000000011000000000021F7 +:1027B0000005020000900005000800032009000841 +:1027C00000080000000000080000000000000000F9 +:1027D0000000000000084008000000001000000099 +:1027E000000000210008000000000021200000007F +:1027F00002002000000400000000000000000200B1 :1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000002000000B6 -:1028200000000000000000000000000000000000A8 -:102830000000000000000001000000000000000097 -:102840000000000000000000000000000000000088 -:102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 -:1028700010400040000284840000000000000000BE -:102880000000000000000000000000000000000048 -:102890000000000000000000C088001000082010A8 -:1028A0001010000400A00082C00800C0000804024C -:1028B0000000010020009100000000000000000066 -:1028C0000000000000000000000000000000000008 +:1028100000000000000404000000000000000000B0 +:1028200000000000000011A0000000A00000000057 +:102830000000000000000020000000000000000078 +:1028400000840000410021000008008241820584CC +:102850004100000000040082000005000008200084 +:1028600000000082200000000000000000000000C6 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000100000047 +:102890000000000000000000000000000000000038 +:1028A000000000000000000090000010011010085F +:1028B0000000010000009000000000000000000087 +:1028C0000000000000000000000100000000000007 :1028D00000000000000000000000000000000000F8 -:1028E00000000000000000000000000000000000E8 -:1028F0000000000000800000000000000000000058 -:1029000000000000000000000000000000000000C7 -:102910000000000000000000000080800000008037 -:1029200000808080000000800000008000000080A7 -:102930000080000011008000820000000000000004 -:102940000000000000000000000000000000000087 +:1028E00000000000010020000001000000000000C6 +:1028F00000000000000000000000000000000000D8 +:102900000000000000000000000000000000400087 +:1029100000000000000004000000000000000000B3 +:10292000000000000000090000000000000040005E +:1029300000000000101104218402000300000000C8 +:102940000000000000110003001000100000000053 :102950000000000000000000000000000000000077 -:102960000000000000000000000000000000000067 -:102970000000000000000041008500000000000091 -:102980000000000000000000000000000000000047 -:10299000000000000000000000000000000000082F -:1029A0000000000080000003800080008000804163 -:1029B0008091000000000440000004054103000075 +:1029600000000000000441110920002100000000C7 +:102970000000000000000000000000000000000057 +:10298000000000000000000000000000000800003F +:102990000002000000000000000000000000000035 +:1029A0000000000000030000000800000003001108 +:1029B00000880000000082881000080989A100003A :1029C0000000000000000000000000000000000007 :1029D00000000000000000000000000000000000F7 -:1029E00000000000000000000000000000000000E7 -:1029F0000000000000000000000300A00000000034 -:102A000000000000000000000000000000000000C6 -:102A10000000000000000000000000000000C000F6 -:102A20000003C004C0001000880310A0108208003A -:102A3000100408A0820000000185000001010105CA +:1029E00000000000000002A00200050821210000F4 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000001C5 +:102A10000000000000000000000000000090000026 +:102A200000000000000000000000000100000000A5 +:102A3000008800A10000000191098288C10009C13D :102A40000000000000000000000000000000000086 :102A50000000000000000000000000000000000076 -:102A60000000000000000000000000000000000066 -:102A70000000000000000000C0000082840204008A +:102A600000000000000000000190000001010109C9 +:102A70000000000000000000000000000000000056 :102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA000400000088282090210080004009083821E -:102AB00040080000C0080588000000010401000172 -:102AC0000001000000000000000000000000000005 +:102A90000000100000000000000000000000000026 +:102AA0000000000000000000000020000000000006 +:102AB000C00802100088A0100000000110000900EA +:102AC0000000000000000000000000000100010004 :102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 -:102AF0000000000000000000000000000080000056 -:102B00009000000000000000000000000000000035 -:102B100000000000000000000000000000000000B5 -:102B20000000800000800000A18080000000000004 -:102B3000C080808000000080A1000000000400111F -:102B4000000404410000000000000000000000003C -:102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B700000000000000000000000000000008000D5 -:102B80008000800000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000008000808000000000009114 -:102BB00000008000800400008080800000004180D0 -:102BC00009000400081100000000000000000000DF +:102AE00000000000000000000000000110000001D4 +:102AF00001000000000000000000000000000000D5 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000001000000000000000A5 +:102B2000090000000000000000000000800000001C +:102B300008008000008000008900000011100408D7 +:102B400091100208000000000000000000002000BA +:102B50004000000000000000000000000000000035 +:102B60000000000000000000000000000008030852 +:102B70000810040800000000000000000000000031 +:102B80000000000000000000000000000000000045 +:102B9000000000000000000000000000000900002C +:102BA000000000000000000000000000000800001D +:102BB00000000000800400090080000000004100C7 +:102BC0000241110008100000000000000000000099 :102BD00000000000000000000000000000000000F5 -:102BE00000000000000000000000000000000000E5 -:102BF0000000000000000000000000000000900045 -:102C0000400004000400000000000000000000007C +:102BE0000000000000000000000000000000108055 +:102BF00020000800050800000000000000000000A0 +:102C000000000000000000000000000000000000C4 :102C100000000000000000000000000000000000B4 -:102C2000000000000000C000081084084000900070 -:102C300004828800A00040012004844004000000B9 -:102C40000108000001000001000000000000000079 +:102C200000000000000000000000000000000001A3 +:102C30000000000000000800C000081002000000B2 +:102C4000010200030020010000000000000000005D :102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 -:102C800000000000000050000000000000000000F4 -:102C90000000000000000000000000000000000034 -:102CA00000000000000000000000000000004200E2 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000E00000000000000000000024 +:102C60000000001000000000000000000000000054 +:102C7000000400000000000100000000000000004F +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000E00000000054 +:102CA000810000E082000000000000000000000041 +:102CB000000000E000000000008100E0070060006C +:102CC0000000000000E007004121000000000000BB :102CD00000000000000000000000000000000000F4 :102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D00000000F131C10100F000F0000000000000FF +:102CF0000000000000E000004100000000000000B3 +:102D000000000000000000000000000000000000C3 :102D100000000000000000000000000000000000B3 -:102D2000000000000000000000003C0066F0900978 -:102D30009000FF0F000F10100900FCC04242C318A2 -:102D4000FF1800000000000000000000000000006C +:102D200000000000000000000000000000000000A3 +:102D3000000000000000000000006666666608896A +:102D40004ACB00000000000000000000000000006E :102D50000000000000000000000000000000000073 :102D60000000000000000000000000000000000063 :102D70000000000000000000000000000000000053 -:102D800000000000FD3DCD0D006600660000000063 +:102D80000000000000000000000000000000000043 :102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000003CFF66F092 -:102DB00000090000663C663C10100900FCC07E7EE5 -:102DC000C3DBFFDB0000000000000000000000008B +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000003C3CF000AB +:102DC0002CAD6EEF000000000000000000000000CD :102DD00000000000000000000000000000000000F3 :102DE00000000000000000000000000000000000E3 :102DF00000000000000000000000000000000000D3 @@ -140041,486 +140041,486 @@ :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 :102E70000000000000000000000000000000000052 -:102E800000000000000000004666DFFF00000000B8 +:102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 :102EA0000000000000000000000000000000000022 -:102EB000FFBF6626DBDBDBDBD8FCFCFCFCBDFC815A -:102EC0007E7E7E7ED83CD80000000000000000001E -:102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F0000000000000000000000006666FFFF0000F7 +:102EB0000000000000000000000000000000000012 +:102EC0002D6F2D6F000000000000000000000909B8 +:102ED0006F6F000000000000000000000000000014 +:102EE00000000000000000000000000000009999B0 +:102EF00099990000000000000000000000000000A0 +:102F000000000000000000000000000000000000C1 :102F100000000000000000000000000000000000B1 :102F200000000000000000000000000000000000A1 -:102F30000000FFFF6666FFC33C00FCFCFCFCFCBD20 -:102F4000FC811E1E7E1ED8FFD8C3000000000000BA -:102F50000000000000000000000000000000000071 +:102F30000000000000000000000000000000000091 +:102F40000000094B094BFFFFFFFF000000000000DD +:102F5000187E187E00000000000000000000000045 :102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000300011 +:102F700099999999000000000000000000000000ED +:102F80000000000000000000000000000000000041 :102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB00000000000000030000010000000003000A1 -:102FC0000000000000003000000000000000006170 -:102FD0000007000D000000000000000000000000DD -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 +:102FA0000000000000610007000D00000061000744 +:102FB000800D00A00000000000000000006100077C +:102FC000000D000000610E2F000D000000000561E3 +:102FD0000A0F050D00A000000000000000000061C5 +:102FE0000006000D000000000000000000000000CE +:102FF0000000000000000000000000000000006170 +:103000000007000D000000000000000000000000AC :1030100000000000000000000000000000000000B0 :1030200000000000000000000000000000000000A0 :103030000000000000000000000000000000000090 :103040000000000000000000000000000000000080 -:10305000A0A0B0108200C00000000000000000002E +:103050003CFF550FF0AAAAAA0000000000000000E3 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 +:10308000555D55510305030F0000000000000000CE :103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 :1030B0000000000000000000000000000000000010 :1030C0000000000000000000000000000000000000 -:1030D00000000000B0108200C000000000000000EE +:1030D00000003C00550FF0B2AAB200000000000052 :1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF +:103100000000F5FD0501030F0305000000000000AD :1031100000000000000000000000000000000000AF :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F :10314000000000000000000000000000000000007F -:1031500000000000000000008200C300000000002A -:10316000000000000000000000000000000000005F +:1031500000000000AF0FCFCF0505050500000000FF +:1031600000000000DFD3DCD0000000000000000001 :10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F +:1031800000000000FFAF500000010301000000003C :10319000000000000000000000000000000000002F :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF -:1031D000000000000000000000008200000000006D -:1031E00000000000000000000000000000000000DF +:1031D000000000000000050F0C0C040004050000B6 +:1031E0000000000000001F131C1000000000000081 :1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:1032200000100000200020008400000000000000CA -:10323000000000000000000000000000000000107E -:10324000000000000010000000000000000000046A -:10325000000000000000000200000000001000005C -:103260000000000000000000012001800120052076 -:10327000000000000000000000000000000010003E -:10328000100000000000000000000000000020020C -:10329000C00000000000001000000000000000005E -:1032A00000000000000000000000400000000000DE -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE -:1032D00000000400000000000000000000000000EA -:1032E00000000000000000000000040104200401B0 -:1032F00084010000000000000040004000000000C9 -:1033000000000000000000000000000000000000BD -:10331000000040000000000000000000000000006D -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000002000000000000000000000000403B -:10335000000000000000000000000000000000006D -:103360000000020000000000000000000320040034 -:10337000012000200000000000000000000000000C -:103380000200000000000000000000000200020037 -:103390000000000000000000000000000008001015 -:1033A00000000000008800080000000000880008FD -:1033B00000880000008800400000000800080000AD -:1033C000000000C00000004000000040000000407D -:1033D00000000008000000000000000800000008D5 -:1033E0000000000000840000000000000000040154 -:1033F000800004010009000800000000004000886F -:10340000000000000000001000000000000000109C -:103410000000000000080040000000000000000064 -:1034200000000000001000000000400090000000BC -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:10345000000000000000000000410000000000002B -:1034600000100003000090000000000000000000B9 -:10347000000000000000002000000000000000002C -:1034800000000000004100000000000000000000FB -:10349000000000000000000000000000000000002C -:1034A0000084000000000008000000004000000848 -:1034B00000000000001000000000000000000000FC -:1034C00000000010000041000000000000000000AB -:1034D00000A000A04100000000000000000000006B -:1034E00000000000000000000000000000000000DC -:1034F00000000008000000000001000000000000C3 -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000001000000000000000000000000000006B -:10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:10357000000000000000000000210000000000002A -:10358000000000000000000000000000000000003B -:103590000000000000000000000000040000000027 -:1035A0000000000800000000000000000000000013 -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D0000088000000000000000000000000000063 -:1035E00000000000000000000000000000000000DB -:1035F0000000000000000084000000000000000047 -:10360000000000400000000000000000000000007A -:1036100000000000000000000000000000000000AA -:10362000000000000000001000000000000000008A -:10363000000000000000000000000000000804007E -:10364000000000000000000000000000000000007A -:103650000000000008000000000000000000000062 -:10366000000000000000000000000000000000005A -:1036700000080000000000000080000000000000C2 -:103680000000000000000002000000000000000830 -:10369000000000000000000000000000000000002A -:1036A0000000000000000000080000000000000012 -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000008F2 -:1036D000000000A00000000008000810000000C06A -:1036E0000008000000C00000000000000000000012 -:1036F00000000000000000000000002000000000AA -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:1037200000000084000000000000000000000040D5 -:103730000020000300000000000000000000000066 -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 -:103770000000000000000000000000000000000049 -:103780000000000000030000000000000000000036 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000000000000000000000000B8 -:1038100000000000000000000008000000000000A0 -:103820000040000000000000000000000000000058 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 +:10320000000000000000FF3CC3000F0B030B000098 +:103210000000000000002080200420002084000422 +:1032200000808888040000002000000500000200E3 +:10323000020820008802C0000400200004858400E9 +:103240000400880420200104210489040180210055 +:103250000400400020000003210001000000208045 +:1032600004002080400020000004200020A0400036 +:103270002000022020802083018000820080408383 +:1032800020A02000208020830080A0041011401086 +:103290000000200488002000800480098000800451 +:1032A000004100040004000040840084000200008B +:1032B0008002800200020084000080044000802020 +:1032C00004001000000000010403040104010404D0 +:1032D0001000000000000000000004000400048250 +:1032E0000020200000040004000400000004000589 +:1032F00080008000800311040004202000210004CD +:1033000088200005000800040004000400010000FB +:103310008001000000C100000000000000000080EB +:1033200000002000820020000000000000000000DB +:103330000200000000000100900001008800010070 +:1033400000000100010000800200000002090000EE +:103350000200020003000100020000000000000063 +:1033600000000200000088000010000000000300C0 +:10337000030001000000000090000200000420088B +:1033800008202000010000000000030200000000EF +:103390000000000082000200002102000000000086 +:1033A000000400008002000280840000000200028D +:1033B00004000000000000080208000804000908DA +:1033C00004000000040004002020000000000000B1 +:1033D00000000000009040044004000400000000D1 +:1033E0002004000804000000000000000410000099 +:1033F000400040000808008420000000040000098C +:103400008084890900080400000000000809000009 +:1034100000000000008400000008000000000420FC +:103420000008000000000000000000002000000074 +:103430000000000000000000000000030000002069 +:103440000020402000002000200020002008040070 +:10345000200004002008008000040000200000007C +:1034600000000021040000210405000300050008FD +:103470002003002090A1212020002008008000844B +:103480004020858004022000000304040409908089 +:1034900090880008048240910000A0000000000015 +:1034A000000000000000000000000000000080009C +:1034B0000000000000000000000000000084000088 +:1034C00000010085000100908000800080008000E5 +:1034D00000008000000080000004008200009100D5 +:1034E000000000080008808200080002002000029E +:1034F00000408000210100208401800080A0002085 +:103500000021000120048000880020088004A00021 +:10351000000400040000800480040584008205008B +:1035200021000000820000000000000000000800F0 +:103530000800020082000200020000000000C0003B +:10354000C00000000000C00008200000A000000033 +:10355000000000000000000082000000820008005F +:10356000000400000011000008008200C0000000FC +:1035700000000000000000008200000008000000C1 +:103580000000000008000000000008008204008025 +:103590000400000082081000000808008400008475 +:1035A000000000000000000000000000000000001B +:1035B0000000000080000000800080000000040087 +:1035C00000000800000004000500000021000000C9 +:1035D000008403000000000000000000000008005C +:1035E00000000001000000A0000000C0000000007A +:1035F00000000000000000004100210000000082E7 +:1036000000820000000000A000000000A1000001F6 +:103610000020008200840000000000000308080071 +:103620000004400000A0840082008400000020000C +:10363000200000000000C00002000000C000C00028 +:103640000000000002050000824000000021000090 +:10365000000000002000000090002000000000009A +:10366000010901000000000000029020004100005C +:103670002002202108009009C02103000004C0009E +:103680000100048020110211044002020202001114 +:103690000002008800200111010000030120000841 +:1036A000000200020804000000000000000000000A +:1036B0008000800000000000008480000000000006 +:1036C0000000000000008000000000002100000059 +:1036D0000000000000000000000000020082000066 +:1036E00000082084200211A000000084000300A034 +:1036F00011C000008000000000000000200009212F +:1037000000900400801080002000000000080001EC +:103710000090000000040001040004040804408339 +:1037200000A000000000000000000109000082006D +:103730008200010000000000000000000000000006 +:1037400000000008000082000000080008000008D7 +:103750000020000000210000000900000000C0411E +:1037600000000021000001000000000000830003B1 +:103770000020010000028200820000000020018081 +:1037800000090080C0059083000904000021C000EA +:10379000010300090009000200890005000804096E +:1037A0000808040882080021A0004004020000006C +:1037B00002000000200000000000000000000000E7 +:1037C00000001100000000000000000000000000E8 +:1037D00000000001000000000000000000000000E8 +:1037E0000000030000000000208409000000002009 +:1037F00000000001040000000000000000000001C3 +:1038000004040000410400000004000080000000E7 +:10381000000020A0090000200000000400020000B9 +:103820008010000080A0000000000000000041C0E7 +:1038300001000001000040C100000401000000C0C0 +:1038400000020000000000C0000000000010402046 +:1038500000900020000000000000000000000000B8 +:103860000000000000000000000004010001000052 :103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:1039800000000000000000800000000000000000B7 -:103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A00000000000000000000001000000010000096 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A800000000000000000000000000040000000F6 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B0000000000000000000000000900000080002C -:103B100000000000000000000000000000000000A5 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B8000000000000000000000000000001000081D -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 -:103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000010000000000000000000000000000A3 -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C9000000000000700000000000000000000001D -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 +:10388000010100012100000040C0820200C002C00E +:10389000C000900040001000000000000100000087 +:1038A00000000000210000000000000001000000F6 +:1038B00091A0022100090000839100038009000308 +:1038C0000080000000000000008000000000008078 +:1038D000200000800000000003000000090000003C +:1038E000000000000400000000030203820800083A +:1038F00000000000000000000000000000000400C4 +:1039000000001108210820400040000000000400D1 +:10391000800091008800890000000300030020005F +:10392000000011000900400000000000000002003B +:103930000000200041212011800009000300111126 +:10394000830500008002000080000000800000006D +:1039500080000000002100008000000800800008B6 +:10396000000000090080000400001009030010118D +:103970004184000000000000000000000000000082 +:103980000000000011092080900310208009000829 +:1039900080838000900805008308908480038080E5 +:1039A000000500804010840011102100000000007C +:1039B00000000000002000000001C0000100000025 +:1039C0000101C000000010000000C0000000100055 +:1039D0000000C0002000000004409000000100042E +:1039E00000010040000000C000010008019001003B +:1039F000000001A10000000000020000000400001F +:103A00000000000000000290040809000308A00064 +:103A10000488A08208100411901010019108100071 +:103A20000420080104029100200291000384000098 +:103A300000000000000000000101000083C1000040 +:103A40000001000003C100000000000200C00000EF +:103A50000000000800C0C020004090204008000086 +:103A600010004000000000000200100000000000F4 +:103A700020001101000100000000000040000000D3 +:103A80000000100000000000000108010201000118 +:103A90001010100210908502018910080290009009 +:103AA0000001400008010100010020001001010098 +:103AB000000010000000000000202009202091914B +:103AC0000003200900039191000000000000008025 +:103AD0000000000000800080000000808000008066 +:103AE00005000000000010001000000000000200AF +:103AF0000041082183081108000011000000800027 +:103B00000000000000000000000009118010C1103A +:103B100010108280800080004180100800A1000009 +:103B20001002091080088008080804098002800833 +:103B300004110000000000000000C04020110380BC +:103B400009108300110003800900800000000000BC +:103B500000008000000000000000804000000080A5 +:103B6000000000020021000000000000000400002E +:103B70000000088840112000081000000010000814 +:103B8000000000000000000000000000210305C04C +:103B900005002011800000408000000040912104B9 +:103BA0000800110800000089000000000002001158 +:103BB000000000090000000000000000C1820001B8 +:103BC00001840101C082010000849100C000000056 +:103BD00000000000C0000000000002009000202053 +:103BE000000284000001000000000000000000004E +:103BF0000000000000A10101010001000000000020 +:103C0000000100000000000000000000000001A012 +:103C100000C10090000010000211080220000108FD +:103C200000910090010000000090008800000088D2 +:103C30000088000800000000000000000000810073 +:103C400000E000000000880000E00000000000002C +:103C500000000000000000000000000000000081E3 +:103C6000000007000000004100E007000000000025 +:103C700000E007006000000000E00000000000001D +:103C80000000000007000000000000E0000000004D +:103C9000000000E007004100000000E00700008293 +:103CA000000000E007008200000000E007000000C4 +:103CB000000000E007000000000000E0000000003D +:103CC0000000FFFF0000AAAA00003C3C0000AAAAD6 +:103CD0000000FFFF000000FF00003C3C000000FF70 +:103CE000003CFF3CB282B2BE0000000000000000B9 :103CF00000000000000000000000000000000000C4 :103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 +:103D100000000000000000000000F03CFFAAC2CE3E +:103D2000F2FE000000003C3C3C3C000000000000B3 :103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 +:103D40000000000000000000AAAA00003C3C0000A7 +:103D5000AAAA00000000000000FF00003C3C000098 +:103D600000FFAAAAAAAAB282B2BE00000000000008 :103D70000000000000000000000000000000000043 :103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000000000000013 +:103D9000000000000000000000000000F03C00AA4D +:103DA000020E323E000000003C0C3C1400000000FB :103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 +:103DC0000000000055550000FFFF000055550000A1 +:103DD000FFFF0000FF0000000F0F00003C3C000050 +:103DE000F0F0FFFFFF0F5555FFEBD7C300000000B9 :103DF00000000000000000000000000000000000C3 :103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 +:103E100000000000000000000000FF000F0F55FF31 +:103E200055004141EBEB000000008282D7D7000033 +:103E30000000AA00AAFF0000000030F0F3F000002C +:103E4000000000000000555500000000000055551E +:103E5000000000000000FF0000000F0F00003C3CCD +:103E60000000F0F0FFFFF00055553C281400000062 :103E70000000000000000000000000000000000042 :103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F10000000000000000000000005000A08050085 -:103F200000A00000000000000000000000000000F1 -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 +:103E900000000000000000000000000055553C3C00 +:103EA0000F3C0F3CA0F5A0F500000000A0F5A0F528 +:103EB00000000000C3F0C3F00000000070B0F2F199 +:103EC000000000000000000040E38000802192021A +:103ED00040E3800080219202408280000020920214 +:103EE00040828000002082020000002000000000CC +:103EF00005610A2F050D00A005610A0F050D00A040 +:103F000000610007000D0000000005000A08050020 +:103F100000A000610007000D000005610A0F050DFB +:103F200000A005610A0F050D00A105610A0F050D2E +:103F300000A005610A0F050D00A005610A0F050D1F +:103F400000A000610007000D00007D2D282DC0FCA1 +:103F5000FCFC3F3F3F30F028F0EB00000000000089 :103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 +:103F80000000EF6DAE2CAAF03CFF00000000000026 +:103F9000000000000000000000000000040000001D +:103FA000F0AA3CFF0000000000000000F0D2F0D2B8 +:103FB000040400000000000000C000000000000039 +:103FC0003F3C555500000000000000007D2D282DCD +:103FD000C0C0FCC030303F30F028F0EB00000000E3 :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 +:1040000000000000C7458604AAF03C000000000044 :1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 +:104020000000F0AA3C000000000000000000C3D225 +:10403000F0D2343400000000000000C30003000090 +:1040400000003FFF555500000000000000005555DE +:104050000F0FB2BEB2BE173F17033C3CF0FF00008B :104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 +:10408000000000000000FDCD3D0D280000030000F1 :104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 +:1040A000000C0000AAF0FF3C00000000000000002F +:1040B00000000000CF0C14140000000000000000FD +:1040C000000000005353F00000000000000000005A +:1040D000FF000F0FB282B282173F17033C3C000F64 :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF +:104100000000000000000000F1C131012800003F64 :10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000020000000001020000000000000000F -:10416000000000000000000000050000000000004A -:10417000000000000000000020000000000000001F -:1041800040000000000000000000000400000000EB -:1041900000000000001100000000200000000000EE -:1041A00000001000101100000000000000000000DE -:1041B0000000880000000000000020000000000057 -:1041C000000020001000000000000004000040007B -:1041D00040002000400000000000000000004000FF -:1041E000000000004000000000000000000000008F -:1041F000000000002000000000000000000000009F -:10420000000000004000000040000000000000002E -:10421000000000000000000000000000000000009E -:10422000000000000000400000000000000000004E -:1042300000004000000000000000000000004000FE -:10424000000040024000400000004002000040002A -:104250000000000200000000000000000400000058 -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A0009000000000000400000000000000021068 -:1042B00000080000000000000200000000000400F0 -:1042C000000010400000000000000000000000108E -:1042D0009009080002100210000000000000000019 -:1042E00000080000000000040000000000080000BA -:1042F00000000000004000080000000000880200EC -:104300000040000000100000000000000008000055 -:104310000000000000000410000000000000000089 -:10432000000000000000001000000000000000106D -:104330000400000000000000000000000000000079 -:10434000000010000000000000000000000000005D -:104350000000081000000000000000000000000045 -:104360000000000000000000000004000040000009 -:10437000000000000000000000000000000000003D -:1043800000030000000000000000000084000000A6 -:10439000000000000000000000000000000000001D -:1043A0000000000088000000000000000000000085 -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000400000000000AD -:1043D000000000000000000000000000000000A03D -:1043E00000080000000000000000000000000000C5 -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:104430000000000000000084000000840000000074 -:10444000000000000008000000000000000008005C -:10445000000000000000000000000000000000005C +:10412000000000000000AAF0003C000000000000B9 +:10413000000000000000CF0CD7D7000000000000F6 +:104140000000000000005353FF0F000000000000BB +:1041500000002000000000048404000000000000B3 +:10416000000000000000200000000000000000002F +:10417000200020808404A004840400001000840037 +:1041800000008400000020048400000400110004EA +:10419000400400032005840000002004000000000B +:1041A00020008800880040052000408000848800AE +:1041B0000000048520832005402088800100200025 +:1041C00001002180208020040105208000000100E2 +:1041D00010080804000000000008000800000000AB +:1041E00000000000000000000000100800000008AF +:1041F0000000000000040001000300014000000076 +:104200000000000000000000000000000005008425 +:104210004000840000000000000800000000400092 +:1042200000000004000040008000000480044005FD +:1042300000020502080410040000800100042000B0 +:1042400080822000200200040001200210040000EF +:1042500010000000800000000000000000000000CE +:10426000000000100000000000000000020000003C +:1042700000000000000082000800040000000000B0 +:10428000000000000010000000000000000000001E +:10429000010000000100000000000000000000100C +:1042A00000000000080000002000000000000000E6 +:1042B0001000008084002010000000800400041022 +:1042C00000000000010001000000000000100400D8 +:1042D00002000200020002000000000000000000D6 +:1042E00009000000000000000000000002000000C3 +:1042F00000000000000000000008000000080008A6 +:104300000000050000000000000000000000008424 +:1043100000004004000008000000000804000082C3 +:104320000482000004000000000000000000000003 +:104330002000040005040000A08400080420801070 +:1043400000080008000004000408000000900001BC +:10435000000000080000000000000008000000004D +:10436000000000000000000000000000000000004D +:10437000002000000000000000000000000000001D +:10438000000000000000000000000000000000002D +:10439000000020209080002090000000900000008D +:1043A000100040080221004000030000000420210A +:1043B0000004000304214121200000110400200812 +:1043C00020210410000200050002A0410004002189 +:1043D00088099021900000210000000800004100A1 +:1043E00000000000000000000000000000000000CD +:1043F00000000000080000000800000000000000AD +:104400000000000000000000000000000000118417 +:104410000082008400050004000500000000000088 +:1044200000A000A0008400A041A040202120088915 +:10443000808200A100001100200080000088800020 +:10444000800880088010000200A0048800A01109E4 +:104450000004400000840000080203080800000077 :10446000000000000000000000000000000000004C -:1044700000000000000000000000000000200040DC -:1044800000400020000000000000000000000000CC -:10449000000000000000000000000000000000001C -:1044A0000000000000000000000000000000080004 -:1044B00000000000004100000000000000000000BB -:1044C00000000000000000000000000000110000DB -:1044D0000000000088110000000000400000000003 -:1044E00000000000000000000000000000080000C4 +:10447000000000200000000000000000000000001C +:104480000000000008000000000000000000000024 +:104490000000000982000000000001000900000087 +:1044A00010000004004082400000A0000000000056 +:1044B00088000000000082000000000040000000B2 +:1044C0000000000000104000008000000800000014 +:1044D000001100400880048000000000C0000000BF +:1044E00000000000000000A0000000000000080024 :1044F00000000000000000000000000000000000BC :1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000200000000000000000006B -:1045300000000020000000C000000000000000009B -:104540000000000800000008000000080000000053 -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:104580000000000000000000000000000000000823 -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000008E3 -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F000000000200000000000000000000000009B -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:104620000000000000000000000000000004000086 -:104630000000000000000000000000020000000078 -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000100000000000003A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000008000000030000DF -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000002000000000000000000A7 +:104510000082000000000010000000A04000200009 +:10452000000000000200000002000008000000007F +:104530002100000000000000040000000000000056 +:10454000000003000000000080C000040000000024 +:1045500000A0000000A0090480040000000000008A +:10456000000000080003000800080003000000002D +:104570000000000000000000000800000000000033 +:10458000000000000000000000000020000000000B +:10459000000000000000000000000000002000A05B +:1045A00000080000000500000800000000000800EE +:1045B000000000000100200200000080000900054A +:1045C00000400000010200008804100000000021EB +:1045D000000400410000020020111008C04010003B +:1045E0000040200300000000000000000000000068 +:1045F0000000210000000000000021000000000079 +:104600000000000000840000000000000000000026 +:1046100000A01100000000840000000000880008D5 +:1046200000051188000000000008000800A0000834 +:104630000000000000202000200920A008040088BD +:1046400021A0210002880400400820090900000878 +:10465000000000011188000091C000081120000036 +:1046600080000000910000000009000090000000A0 +:1046700000000000900000000000000000000000AA +:104680000000000000000000000000000000002109 +:104690000000000000000000000000000000010019 +:1046A00000200000002000000000081100090800A0 +:1046B000002100002000000800000400200000008D +:1046C00000410003001100000005904100000811A6 +:1046D000000800050000000500800003002182A101 +:1046E000000300410021000800000000000000005D +:1046F00000000000000000000000000011000000A9 +:1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000050000000000000074 -:104740000000000000400000000000000000000029 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 +:104720000400000100000001000000000000000083 +:1047300000000000000000000000000000008000F9 +:104740000000000000000000000000000000000069 +:104750000000000000A000000090094000000000E0 +:104760000040000000080000000000000000000001 :104770000000000000000000000000000000000039 :104780000000000000000000000000000000000029 :104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 +:1047A00000000100090008000000000000000000F7 +:1047B00000000000000000000000000001000000F8 +:1047C0008800000000000000000000000100000060 +:1047D0004000010000010101010100011188008277 +:1047E0000190880410000000100004000000000088 :1047F00000000000000000000000000000000000B9 :1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 +:104810000400000000000000000000000000000094 +:104820000000000004002000410000000000000023 +:104830000000000000000000000000000000200454 +:104840000921051000110200000002000000110003 +:104850000800840011000005210804100010908059 +:104860000080400000008000030082008000000003 :104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 +:104880000000000000000000000000000000001018 +:104890000000000800000000000000000000000010 +:1048A000000000000000118808009111880300003A :1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 +:1048C00003092100102040020009000000410000FF +:1048D00011020880100210801004110010021082D2 +:1048E00000048090000280000000000080040000AE :1048F00000000000000000000000000000000000B8 :1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 +:104910000001000000000000000000000000000096 +:1049200000000000000000001091890409009105BA :104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 +:104940000000000201000001010000000000000062 +:104950000000000000080000000800200000010026 +:104960000105100010211090C08890009000A00058 +:1049700082000000000000000000000000000000B5 :104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 +:104990000000000010000000010000000000000006 +:1049A00000000000000000000000000102014000C3 +:1049B00001010000000000000000000000000000F5 +:1049C00000000000000105000001000000000800D8 +:1049D00000000000000008001001000100010800B4 +:1049E0004001000102C01008000802C000020001DE +:1049F00000880089000000000000000000000000A6 :104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 +:104A100000000000000080000000410000000000D5 +:104A20000000000000000000000000001008000866 +:104A300080024108000000000000000000000000AB +:104A40000000000000000008110209210810000009 +:104A50000000000009001102801080080208000810 +:104A600085210908090500008000000082800009F6 +:104A700000080011004100000000000000000000DC :104A80000000000000000000000000000000000026 :104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 +:104AA00000000000000000000000000000000802FC +:104AB0000920080010400000000000000000000075 +:104AC0000000000000000000048010080300020342 +:104AD0000000000000000000000000200000009125 +:104AE00040A1034010210811000980C1000000000E +:104AF0000000008000000000000000000000000036 :104B000000000000000000000000000000000000A5 :104B10000000000000000000000000000000000095 :104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 +:104B30000190002101880101000000000000000038 +:104B40000000000000000000000000A001000100C3 +:104B500000000000000000000000008800010000CC +:104B600000900185000101010101020088218810E7 +:104B700004000000000800880000000000000000A1 :104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 +:104B900000000000000000000000000000E0000035 +:104BA0000082000000000000000000000000000083 +:104BB0000000000000E007000041000000000000CD +:104BC000000000000000000000000000000000E005 +:104BD00000000000000000E000000000000000E015 +:104BE00007000000000600E007000000004200E0AF +:104BF00007004200820000E000000000000000000A :104C000000000000000000000000000000000000A4 :104C10000000000000000000000000000000000094 :104C20000000000000000000000000000000000084 :104C30000000000000000000000000000000000074 :104C40000000000000000000000000000000000064 :104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 +:104C6000000000000000000000000000000000FF45 +:104C7000C0CFC0C0C05000000000BDFF24FF000036 :104C80000000000000000000000000000000000024 :104C90000000000000000000000000000000000014 :104CA0000000000000000000000000000000000004 @@ -140528,7 +140528,7 @@ :104CC00000000000000000000000000000000000E4 :104CD00000000000000000000000000000000000D4 :104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 +:104CF00001F7C1C73030303000000000BD00240093 :104D000000000000000000000000000000000000A3 :104D10000000000000000000000000000000000093 :104D20000000000000000000000000000000000083 @@ -140540,970 +140540,970 @@ :104D80000000000000000000000000000000000023 :104D90000000000000000000000000000000000013 :104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 +:104DB0000000000000000000000000000000F3F30D +:104DC00003030000000000000000000000000000DD :104DD00000000000000000000000000000000000D3 :104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 +:104DF00000000000C99999990042000300000000DA +:104E00000B020B0200000000000000000000000088 :104E10000000000000000000000000000000000092 :104E20000000000000000000000000000000000082 :104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 +:104E40009F909F9000000000000000000000000004 :104E50000000000000000000000000000000000052 :104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 +:104E7000000000000000C9C399C3424203030000C0 +:104E8000000009000F060000000000000000000004 :104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 +:104EA00000000000000000610007000D000000008D +:104EB000000000000000000000000000000005618C +:104EC0000A0F050D00A00000000000000000000017 +:104ED000000000000000000000610007000D00005D +:104EE00000610007000D000005610A0F050D00A01C +:104EF0000061002F050D00A00061302F009D00080B +:104F000000610007800800000000000000000000B1 :104F10000000000000000000000000000000000091 :104F20000000000000000000000000000000000081 :104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 +:104F4000F505FCFC0F01FF4100000000000000001F +:104F50000000000000000000000000050005014105 +:104F60000101000000000000000000000000ACACE7 +:104F7000ACACF7C73707CF3C0C3C0000000000008A +:104F800000000000000000551414000000000000A4 :104F90000000000000000000000000000000000011 :104FA0000000000000000000000000000000000001 :104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 +:104FC0000000F5050C0C0F0DFF7D00000000000037 +:104FD000000000000000000000000000C3C300004B :104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 +:104FF000000FF0FFF4C43404CF000C0000000000E8 +:105000000000000000000000000504040000000093 :105010000000000000000000000000000000000090 :105020000000000000000000000000000000000080 :105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 +:105040000000000000000000AFAF0CFC00000000FA +:105050000000000000000000000000000000A0AF01 +:1050600003032A0A2AAA0000000000000000000032 +:1050700000000F3AFF3A080BC8CB0FC355000000E1 :105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 :1050A0000000000000000000000000000000000000 :1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 +:1050C00000000000000000000000A0A00CFC000098 :1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 +:1050E000A0AFF3F33F0F3FFF0000000000000000FF +:1050F00000000000003AF03A383BF8FB0FC355FFC0 :10510000000000000000000000000000000000009F -:1051100000000000000020004000400000000000EF -:10512000000000000000200000000000000000005F -:10513000000000000000200020000000000000002F -:10514000000000000000200000000000000000003F -:105150000002000000000000200020050000000008 -:10516000000011000100008020800000000000000D -:1051700040000000000000002000200000000000AF -:1051800000002000000000002000000000000000DF -:1051900020000000400000000000000000020000AD -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000400000000DB -:1051D00000000000000000000000000000000000CF -:1051E0000000000020402000000400040000000037 -:1051F000000000000000000000000000400000006F -:105200000000000040000000210200004000008279 -:105210000002000000000000000004000000000088 -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:1052500000000000000004400000001000100005E5 -:10526000000000000000200020002040A104A00059 -:105270000000A00000000200000004000200000086 -:105280000000000000000000000000008200000894 -:105290000000000000410000000000880000000045 -:1052A00000000000000000000000000040000000BE -:1052B00000000000000000080000000000000000E6 -:1052C000000000004000000000000000000000009E -:1052D00000000000000000008010000000000084BA -:1052E0000000000000880000800080008000200195 -:1052F00000000000000000000400000000000000AA -:10530000000000000000100000000000000000820B -:1053100000820082000000820800000000000000FF -:105320000000000004000000000000000000004039 -:10533000000000000000000000000000000000006D -:10534000000000000000000000000000000000005D -:10535000000000000000000000000000000000004D -:1053600001000021002100000021000000000000D9 -:105370000008000800080000000800080000000005 -:105380000008000900000008000000000000000004 -:10539000000000000000000000000000000000000D -:1053A00000A000000000000000000000000000005D +:105110000000000000000000000000000000880007 +:10512000000000000000408400002000200020005B +:105130000000000000008200A0000000000020002D +:1051400000000408040020000000400040040000AB +:1051500000038200000000002000000000030003A4 +:10516000000300000005200004000000000000040F +:105170008405000400040400208010000000008466 +:10518000400000858804200420800000000000000A +:1051900010004000000200000002000000000000BB +:1051A00000000000000010000020000000000000CF +:1051B0000000000400000000000000000090040057 +:1051C0000000000000000004000000000000044097 +:1051D00000000000000000000004000000000000CB +:1051E00000000008000000000002000000000000B5 +:1051F000000000000091090200020004000000000D +:10520000000580000004000100010004040000000B +:105210000000000004000000000084000000000006 +:1052200000000000000000000000008000000000FE +:10523000000000000000000000400000000000002E +:10524000000000000000000000000000000002005C +:1052500008008200000000000000000000000000C4 +:105260000280000000000000000820108400000000 +:1052700002000000A000000004000000000900007F +:1052800000002000040000000000080000000000F2 +:10529000820084000000050805000000000004846E +:1052A00004000000000000000000000000200008D2 +:1052B0000084000000000002000000000000000068 +:1052C000000000000200044000000000020004840E +:1052D00004000000000000000000000000000000CA +:1052E0000000041004000000000004100000000092 +:1052F0000084008400000400000009000000000099 +:1053000000000400800000840000000884080008F9 +:105310000000000000000400400000000000000049 +:105320000000000000000000000800400000000035 +:105330000004000000000000000000000400000065 +:105340000000000800000000000000000000C00095 +:10535000000040404000000000000041000000004C +:10536000000000090000000000080000000000002C +:105370009000000008000000000004008408000005 +:1053800020008804000990000008A0002080080088 +:105390004000000000000000040800A00000000021 +:1053A00000000000000000000000000000000000FD :1053B00000000000000000000000000000000000ED -:1053C00000000000080000000000000000000000D5 -:1053D00000000000000000000000000000000000CD -:1053E00000000200000000000000000000000000BB -:1053F000000000000000000000C0000000000000ED -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C +:1053C00000000000000000000000000000001100CC +:1053D00000000000000000000084000000C0000089 +:1053E00000000000000000000084008400000000B5 +:1053F0000000000000A000A0000000100800000055 +:10540000000080000082008800C000C00008000486 +:1054100080840010000000880002000000210000CD :10542000000000000000000000000000000000007C -:105430000000000500050000000900000000000059 -:105440000000000800000000000002000005000548 -:1054500000000000002100210003002100000000E6 -:105460000000000010800000002100000002000089 -:1054700000000000000000410000000000400000AB -:1054800000000000000000400000000000000000DC -:1054900000000008000000000008000500040000F3 -:1054A00000000000000000000000000004000040B8 -:1054B000000000000000008200000000200000004A -:1054C00000000000008400400000000802400000CE -:1054D00000000200020000000000000000000000C8 -:1054E000000000000040002000C000000002000199 -:1054F0000000000000000000000000000090000814 -:105500000008000000000000000000000000000093 -:10551000000000000000008200000000000000A069 +:105430000000002000000005000000000000000047 +:105440000020000000410021000000410040002039 +:105450000000000000000800080008000000000034 +:105460000000000000000800000000000000000034 +:10547000080000000000820000000800004000005A +:10548000C0400000000000000000001100002000EB +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B00000000000000100000000000000000000EB +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E000000000000000000000000002004000007A +:1054F000000000004100000000000000000000006B +:10550000000000000000000000000000000000009B +:105510008900000000000000000000000000000002 :10552000000000000000000000000000000000007B :10553000000000000000000000000000000000006B -:105540000000000000000005000000000000000056 +:105540000000000000000000020000000000000059 :10555000000000000000000000000000000000004B -:10556000000004000020840004210010002100003D -:1055700000000021000000000000000000000021E9 -:1055800000000041000000000000000000000000DA -:105590000000000000000000000000000000000803 -:1055A00000000000000000000000000000000000FB +:10556000000000000000000000000000000000003B +:105570000800000000000000080000000000C0005B +:105580000000400000000000000000000000820059 +:105590000000010300000000014000000000902016 +:1055A00000020000000000000000000000000000F9 :1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000800000010000800000010000B9 -:1055F00000000400000000000000000000000000A7 -:10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:105620000000000000080000000000000000000072 +:1055C00000000000000000001104000000000000C6 +:1055D000002000A000C000000000090800080084AE +:1055E00000A00000000000000000210000000000FA +:1055F000000000000010110800000084009000402E +:105600000000000000C00302100020080004400257 +:10561000118800A002040910040040820208000062 +:105620000002080800000021000000000000000047 :10563000000000000000000000000000000000006A -:1056400000000040000500000000000000400000D5 -:1056500000000040000000000000000000210021C8 -:1056600000000000000001800500058003C000214B -:1056700000030009000000000000000000000021FD -:1056800000030041000000000000000000000000D6 -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA -:1056B000004000000020000000000000000000008A -:1056C00000000000000000000000021000000000C8 -:1056D0000000000000000000000000000000008248 -:1056E00000000200038400004020840084208441E4 -:1056F0000500000000000000000000000000038220 -:105700000008000000000000000000000000000091 -:105710000000000800000008000000000000020077 +:10564000000000000000001000000000000000004A +:10565000000000000000000000000000000000004A +:1056600000009000000000000000000200020000A6 +:1056700000000000000200000021000800080000F7 +:1056800000000000002100000000000004002000D5 +:1056900000000010C00000000000000500840005AC +:1056A00000030011000000A000000000080000003E +:1056B00000000000000000000000000000000000EA +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000240050000000084EF +:1056F0000000000202400000000000000000000066 +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000004148 :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 :105740000000000000000000000000000000000059 :105750000000000000000000000000000000000049 -:105760000000000000000000000010C10091009047 -:105770009011000000000400000000000000000084 +:105760000000000000000000000000000000000039 +:1057700000000088004000880008000000000000D1 :105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 +:10579000000000000000100000000808C090008217 +:1057A00090880000000000000000000000000000E1 :1057B00000000000000000000000000000000000E9 :1057C00000000000000000000000000000000000D9 :1057D00000000000000000000000000000000000C9 -:1057E0000000000000000000000000001090001108 -:1057F000000980910000030080000000000000000C -:10580000090000000000000000000000000000008F -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 +:1057E00000000000000000000000000000000000B9 +:1057F0000000000000000010008900900000000080 +:105800000000000000000000000000000000000098 +:10581000090000000000080089000000008000006E +:1058200009800000000000000000000000000000EF :105830000000000000000000000000000000000068 :105840000000000000000000000000000000000058 :105850000000000000000000000000000000000048 :105860000000000000000000000000000000000038 -:10587000001080808000000000050080000000090A -:105880000000000400000000000000000000000014 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000414 +:10589000000000000000400040000804090000046F +:1058A0000090008400800000000000000000000064 :1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 +:1058C0000000000000820000000000000000000056 :1058D00000000000000000000000000000000000C8 :1058E00000000000000000000000000000000000B8 -:1058F0000200900040409000000000000004000002 -:105900000000000000010000000000000000000096 -:105910000000000000000000000000000000000087 -:105920000000000000000000000000000000000077 +:1058F0000000000000000000000000000010000098 +:105900000000000000000000000000000000000097 +:105910000000000000000000000001000100000085 +:105920000001008200A100A00000000000000000B3 :105930000000000000000000000000000000000067 :105940000000000000000000000000000000000057 :105950000000000000000000000000000000000047 :105960000000000000000000000000000000000037 -:105970000000084000909120880200000000000113 -:10598000000000000800000000000000000000000F -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 +:1059700000000000000000000000A0000000000087 +:105980001000000000000000000000000000000007 +:105990000000000000000000000000000000000106 +:1059A000000010080808001010A00000000000000F :1059B00000000000000000000000000000000000E7 :1059C00000000000000000000000000000000000D7 :1059D00000000000000000000000000000000000C7 :1059E00000000000000000000000000000000000B7 -:1059F00000000000808021009100100000040000E1 -:105A00000002000000008000000002000000000012 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 +:1059F0000000000000000000000000008000000027 +:105A00004000000000000000000000000000000056 +:105A10000000000000000000000004000011001061 +:105A20000021000500038000000085080000000040 :105A30000000000000000000000000000000000066 :105A40000000000000000000000000000000000056 :105A50000000000000000000000000000000000046 :105A60000000000000000000000000000000000036 -:105A70000000000000000011800300000000000092 -:105A80008000800080000000000000000000000096 +:105A70000000000000000000000000000000000026 +:105A80008000000000000000000000000000000096 :105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000000000000F6 +:105AA00000000000000200090000800080000000EB :105AB00000000000000000000000000000000000E6 :105AC00000000000000000000000000000000000D6 :105AD00000000000000000000000000000000000C6 :105AE00000000000000000000000000000000000B6 -:105AF0000000000000000000900110010020900054 -:105B0000000002000200040000000000000000008D +:105AF00000000000000000000000000000000000A6 +:105B0000000008004000000000000000000000004D :105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 +:105B20000082000000000000900002004000100011 :105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 +:105B40000000000000000000000A00000700000044 :105B50000000000000000000000000000000000045 :105B60000000000000000000000000000000000035 -:105B700000000000000000000000004204000700D8 -:105B800000000000000000000000000000E0000035 -:105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B900000000000000000000000000000E0000025 +:105BA0000000000000E000000000000000E0000035 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 :105BD00000000000000000000000000000000000C5 :105BE00000000000000000000000000000000000B5 -:105BF000000000000000000000000000007DFFFF2A -:105C0000040CF4FCF0F0F0F00000000000000000D4 +:105BF00000000000000000000000000000000000A5 +:105C0000000000000500050000000000000000008A :105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 +:105C2000000000000000000000000000BF01FF00B5 +:105C3000000400FB00000000000000000000000065 :105C40000000000000000000000000000000000054 :105C50000000000000000000000000000000000044 :105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000007DA7 -:105C800000000103F1F3B1F0B1F0000000000000EA +:105C70000000000000000000000000000000000024 +:105C8000000000000000050005000000000000000A :105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 +:105CA00000000000000000000000000000008F0D58 +:105CB000CF0C000000FF000000000000000000000A :105CC00000000000000000000000000000000000D4 :105CD00000000000000000000000000000000000C4 :105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 -:105D0000FF0F3C550C0CFCFC0000000000000000E4 +:105D00000000000000000000000200000000000091 :105D10000000000000000000000000000000000083 :105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 +:105D3000C343C3E3000000000000000000000000B7 :105D40000000000000000000000000000000000053 :105D50000000000000000000000000000000000043 :105D60000000000000000000000000000000000033 :105D70000000000000000000000000000000000023 -:105D80000000000F3C550C0C0CFC00000000000053 +:105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 :105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 +:105DB00000008202D7F70000000000000000000091 :105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 +:105DD000000000000020000000A000000000000003 :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 -:105E0000000000000079203E000D05000061000642 -:105E1000000D000000610007000D00000000000000 -:105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 +:105E000000000000000000000000000080610006AB +:105E1000000D000000000000000000000000000075 +:105E20000000000000610007000D00000061000795 +:105E3000000D000000613007001D000000000000A0 :105E40000000000000000000000000000000000052 :105E50000000000000000000000000000000000042 :105E60000000000000000000000000000000000032 :105E70000000000000000000000000000000000022 :105E80000000000000000000000000000000000012 -:105E90000000413C413C0000000000000000000008 +:105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000000000000000000E2 +:105EB000000034043404000000000000C3C30000EC :105EC00000000000000000000000000000000000D2 :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 :105EF00000000000000000000000000000000000A2 :105F00000000000000000000000000000000000091 -:105F1000000000007D3C7D3C00000000000000000F +:105F10000000000000000000000000000000000081 :105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000000061 +:105F30000000000034340404000000000000C3C36B :105F40000000000000000000000000000000000051 :105F50000000000000000000000000000000000041 :105F60000000000000000000000000000000000031 :105F70000000000000000000000000000000000021 -:105F800000000000000000000000FFFF0000000013 +:105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 +:105FB00000000000000028FA7DFA00000000000048 :105FC00000000000000000000000000000000000D1 :105FD00000000000000000000000000000000000C1 :105FE00000000000000000000000000000000000B1 :105FF00000000000000000000000000000000000A1 -:10600000000000000000000000000000FF7F008092 -:106010000000000000000000000000000000000080 +:106000000000000000000000000000000000000090 +:1060100000000000C000C000000000000000000000 :106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 -:106040000000000000000000000000002000000030 -:106050000008C0000000000008000200000004006A -:106060000080040010000000000021200100000555 -:10607000018000000000000020004000000020001F -:1060800000002000200000000000200000030000AD -:106090000000000088000010000000002000400008 -:1060A00020000000208020000000C0002000100020 -:1060B0000000000020000000080000002000200078 -:1060C00020008800400040000000C0002000400088 -:1060D00000000000000000080000800080000000B8 -:1060E0008000002080000000000000004001080047 -:1060F0000000401000000000000000000000000050 -:10610000000000000000000000000000000000008F -:1061100040000000000800000000000010400000E7 -:106120008000000000000010100000024002C000CB -:1061300040000000400000001000C00040000000CF -:10614000400000004000000020004000400000002F -:10615000000000000000020000000000000000003D -:10616000000000000000000004000080008000002B -:10617000000882020000200000000000000004006F -:106180000000000000040200000300000000020004 -:10619000000000100004040000008800000020003F -:1061A00004000000010000000005000000000000E5 -:1061B0000080000002000200080000000020002013 -:1061C0000820000000000000000004400000000063 -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000800000200020EF -:1061F0000000000100010082800000840000000017 -:106200008084000000000001000000000000000089 -:1062100080820000000900858008100800820004C8 -:1062200000020008008220000008000000000000BA -:1062300000000004000800080004020400100041EF -:106240000011000900840000000800004100030064 -:10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:1062700000000041000000020000000900080000CA -:1062800000020009000800210008000000210000B1 -:1062900001000121000001009008004000808821D9 -:1062A0000008000000850005900200000000004189 -:1062B00000000000000000000000000300080008CB -:1062C0000000000888000000000000000008000036 +:10603000000000000000000028507D50000000001B +:106040000000000000000000000000000000000050 +:106050000000000000000000000020000000000020 +:106060008203000400000000000020000000000087 +:106070000000000000000000000020000000000000 +:106080002000C0000000000000002000000200000E +:106090000000000202000004040400042004400088 +:1060A00000002000001000000041840320000000D8 +:1060B000C000000402000000C000400220002000D8 +:1060C00000002000000084008800200088000000FC +:1060D00000000000000000000000000000000000C0 +:1060E000000000000000100000020000000000009E +:1060F0000000000200040000000040020000104008 +:10610000000041000002410000000000000000000B +:1061100040000000000400004001000100010001F7 +:1061200000000000000020000000000000900000BF +:106130000000000000000800000000020002000053 +:1061400000020082000000000002000000000000C9 +:106150000000000000000000000004000400040033 +:106160000000000000000200040000000200001017 +:10617000000000000400000000000000000000001B +:106180000000000082000800000004000000000081 +:1061900000000000080008000800000000000000E7 +:1061A00004000000040002000000000002000000E3 +:1061B00000000000000008000400040004000200C9 +:1061C0000000820004000000000000000000000049 +:1061D000000000400000000000000200000000007D +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:1062100000000000000080008000800000000000FE +:106220000000000000000000000004000000040066 +:1062300000000000000000000000200000400008F6 +:106240000000040000020082000800080000008234 +:1062500004004008000000000000000000000000F2 +:1062600000000000000000400000000000000000EE +:10627000000000000000000090000000000000008E +:1062800000000000000000000000000000004000CE +:10629000900040000000000000000000200000000E +:1062A0000000C000000000050000020000212000E6 +:1062B00004088400000000002008000000210040C5 +:1062C00000000000000000000000200088400000E6 :1062D00000000000000000000000000000000000BE :1062E00000000000000000000000000000000000AE :1062F000000000000000000000000000000000009E :10630000000000000000000000000000000000008D -:106310000000200020000000080000000001000232 -:106320000008000100000002000000000000000062 -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:106350000000000000000082A0000000000000001B -:10636000001100400000000000000000000040009C -:106370000000000000000000094101000000084189 -:10638000A02100000000C000820800000000A0045E -:1063900083000000000000030000004100000080B6 -:1063A00000848210000800000000000800000000C7 -:1063B0000000000000000000000000000000C0001D -:1063C0000020000000000000008000000005000424 -:1063D00008000000000000000003000000000000B2 -:1063E000000000000000000010002100000000007C -:1063F0000000000000000084200040404088210090 -:1064000000C000820008000808000085410000A0CC -:10641000048520000090008400C0000000C000003F -:10642000000400210008000000000082000000823B -:106430000000000000A000000000000000000000BC -:10644000000800A000900000000000020000000012 -:1064500000A000A000080004000800C00000000028 -:1064600000000000000000000000080000000821FB -:106470000000002100000000000000214021000079 -:106480000008000500030000200004400000200078 -:10649000000082042000000000008204000009C106 -:1064A0000502000541000010000800000402000081 -:1064B0000000A041000000030010000008000000E0 -:1064C0000000000000400000000300110000000870 -:1064D0000021000000000000000008000000000093 +:10631000110000000000000000000000000000006C +:106320000000000000000000008200A0000800083B +:10633000000002000000000000000000000000005B +:106340000000008400200000000000100000000099 +:106350000004000000900000000000210000000088 +:1063600000000040000000000000000000000000ED +:10637000000000000000000000000000000000001D +:106380000000000000000000000000000000C0004D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C000000000000800000010008800000000002D +:1063D00000000000000000000800000000000000B5 +:1063E00000000000000000000000000002000000AB +:1063F000210000000000000000000000000000007C +:10640000000000000000000000000000004000004C +:10641000000000000000000000000000000000007C +:1064200000000000000000882100000000000000C3 +:10643000000000000000000000000000000000005C +:10644000200000000000000000000000000000002C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000009000000000000000000000007C +:10649000000000000200900000000000000000006A +:1064A0000000000082000005000200200010000033 +:1064B00000000000000000000000000000080000D4 +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC :1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000080001C -:10650000000000000000000000000000800000000B -:1065100000000000000180000000000000010000F9 -:106520008802C0000000840000000000000021017B -:10653000000000000000000000000000000000005B -:106540000000000000000000000000080000000043 -:10655000000000000000000000000000000000003B -:10656000820000000200000088000200A0008200FB -:10657000004000210000000000210000020000088F -:1065800040880008002101080040000000008588C4 -:106590000000000000004005002120210000000351 -:1065A0000000014100C0014120100210000808084D -:1065B00000090000000000000041004100400021EF -:1065C000000000000000000000000000000000804B -:1065D0000000000800000021002100000008000069 -:1065E00000000000000000000000000800000000A3 -:1065F0000008000021000000000000000000000072 -:106600000008820800820004200000000000000052 -:10661000200400820000000040200090809011883B -:10662000400800002000212002008000000000003F -:10663000000000000000004000000000000000001A -:1066400000000000000000000000000800840000BE -:106650000002000000000000110000C000A00008BF -:1066600000840084000000000000000005C000401D -:106670000040101004A000000008080801000000FD -:1066800002000000100101004101100000000000A4 -:10669000900000000000400001000000C088008859 -:1066A00001A010040000A091019101111009000047 -:1066B00001000200000000010100080000010100CB -:1066C000000040000000000000000000000000008A -:1066D00001000800000800000000000000000000A9 -:1066E0000000000000000000000000000000890021 -:1066F00000800080808004850002004180890800BD -:1067000021000000000020080800900800000000A0 -:106710000000000020000000800005000000800054 -:10672000000010808080000082C011A010A080A115 -:1067300000001000800000000040101080110009CF -:1067400008000300800000000000000000000000BE -:1067500000004100800000800000000000000000F8 +:1064F000000000000000000000000000000000009C +:106500000000000000880000000000000000000003 +:1065100000000088000000000000000040000000B3 +:106520000000000000000000000000080000000063 +:106530000000000800000002200000000000000031 +:106540000000000000000000000000000008090832 +:10655000040800001100000000040000001000000A +:106560000000000000000000000000000000020029 +:10657000000000000000000000000000000000001B +:10658000000000000000000000000000000000000B +:1065900000000000000000000000000000000000FB +:1065A0000000000000002000000000080021001191 +:1065B00000110008000000000000002100000000A1 +:1065C00000000000000000000000000000000000CB +:1065D00000000000000800000000000000000000B3 +:1065E000000000000090110000000000000000000A +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:106650000000000000000004000000000000000036 +:106660000000040000000000000000000000000026 +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A00000000000000040C08404008208100000C8 +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 +:106720000000000000000000800000000080808069 +:106730001100000005000000000000000000000043 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 :106760000000000000000000000000000000000029 -:10677000000000890085000080008010000000807B -:1067800000000080000000001100041100004140E2 -:106790000000000000000080050010001111418081 -:1067A00000030009804080000000A009A008C08903 -:1067B00091210000000000000000900088001000FF -:1067C0001121000000000000000000000000000097 -:1067D000000011001000080011000000000000007F +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000000F9 +:1067A000000000000000000000008000008200C027 +:1067B0000080000800000041000000000000000010 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 :1067E00000000000000000000000000000000000A9 -:1067F0000000000000100004000008008201089062 -:1068000082080000001000000010000401000002D7 -:10681000010000000000000000080100010001016B -:1068200001A00000A01010A108000000A1A04101DB -:106830009102A1010000000000000000058809008D -:1068400085000503000000000000000000000000BB -:106850000000000000000000010000C00000000077 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:1068200000000000000000000000000002008408DA +:1068300004118402000000000000000000000000BD +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 :106860000000000000000000000000000000000028 -:106870000000000004C00020000402C0A0100108B5 -:1068800000200204010000004000000000850041DB -:10689000040400C10001000100010100000000002B -:1068A00000010100080010100408C0200000404052 -:1068B0000890A09185020000000000000001000186 -:1068C00001000501000000000001000000010000BF -:1068D0000000000000000000000184010000000032 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A000000000000000000000000000000189A0BE +:1068B00000848808A0840000900000000000000010 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 :1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000800280808096 -:106900000300050082804108001180080009000989 -:10691000009000C1001000100003000811020000E8 -:1069200000090021410080000080008082000000FA -:10693000808085C1809188800000001000030041A4 -:1069400000080803A00502200040004000200011BC -:1069500000000000000000000009000300210409FD +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000166 +:10693000410000000080000000000000000008008E +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 :106960000000000000000000000000000000000027 -:106970000000000000000000800080000000000017 -:1069800000080080800000000009000900000000ED -:10699000A184900084000800000200410000000073 -:1069A00000890000000000110002808000800000CB -:1069B0000000C01120210311404100000000000030 -:1069C000000041004110218010020004000000007E -:1069D00000000000000000000000000000100000A7 -:1069E000000800000000000000000000000000009F -:1069F0000000000000000000000008008200C0004D -:106A00004000040102024008820000000000000073 -:106A1000000009A040000500830000000001000004 -:106A2000000000C0000000000001880088408208CB -:106A300040000000C1C0110004A19101000000004D -:106A400000000000012000200110000000000000F4 -:106A500000000000000000000000000000C0000076 -:106A60000000000100000000000000000000000025 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000000000000000000000E7 +:1069B0000001801100210000000000000000000024 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000076 +:106A20000000000000000000000000000000000066 +:106A300000000001080010C0100402000000000067 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 :106A70000000000000000000000000000000000016 -:106A800000000000000000000700000000000000FF -:106A900007004200000000E000000000810000E06C -:106AA00007004100810000E000006011810002E069 -:106AB000000060120000884102E00704000A0000A4 -:106AC00000E000000000000000E00700000081007E -:106AD00000E00000000000000000000000000000D6 -:106AE000000007004100000000000000000000005E -:106AF00000000000000000000000000000003CF06A -:106B00003CF0C3000030FFFF8DFF2424242400004C -:106B1000000000000000C390C39FC9C0C9CF00009F -:106B20000000000000000000000000000000B4B4FD -:106B30009900F060F060000000081800E77EE7763A +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000000000E6 +:106AB0000000000000000000000007004800000087 +:106AC00000E00000000000000000000000000000E6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 :106B40000000000000000000000000000000000045 :106B50000000000000000000000000000000000035 :106B60000000000000000000000000000000000025 :106B70000000000000000000000000000000000015 -:106B8000FFFF6666C3000042FF008DFFF000FFFFBD -:106B90000000000000000000C3F0C3FFCFC0CFCF53 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 :106BA00000000000000000000000000000000000E5 -:106BB000B4B4FF66000F0000000000080000811858 -:106BC0008110000000000000000000000000000034 +:106BB00000000000000000000000000000000000D5 +:106BC00000000000000000000000000000000000C5 :106BD00000000000000000000000000000000000B5 :106BE00000000000000000000000000000000000A5 :106BF0000000000000000000000000000000000095 :106C00000000000000000000000000000000000084 :106C10000000000000000000000000000000000074 :106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 +:106C30000000000000000000000000000210200022 +:106C40000088108400000000000000000000000028 :106C50000000000000000000000000000000000034 :106C60000000000000000000000000000000000024 :106C70000000000000000000000000000000000014 -:106C800000000000F6F6B4F600000000FFFFFFFF72 -:106C90009CFC90F0000000000000000000000000DC +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 :106CA00000000000000000000000000000000000E4 -:106CB00000000000FCE4FCFCFFFFFF0000000C4EA5 -:106CC0008D4ECFCF0CCF0000000000000000000070 -:106CD0000000990FBD0F0000000000000000000040 -:106CE000000000000000C3C3C3C300000000000098 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 :106CF0000000000000000000000000000000000094 -:106D0000000000000000F6F6F6F6000000008383A5 -:106D100081819C9C90900000000000000000000019 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 -:106D3000000000000000FCFCFCFC99F099F0000051 -:106D40000CCF0CCF0C0C0C0C00000000000000005D -:106D500000000000000F240F0000000000000000F1 -:106D60000000000000000000C3C3C3C30000000017 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000000000000000043 +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000000000000023 :106D70000000000000000000000000000000000013 -:106D80000000000000000000000030000090000043 -:106D900000610006000D000005610A0E050D00A04F -:106DA00000610007000900000061000EC00900A09A -:106DB00000610007C005000000653007C00F20011A -:106DC0000000A06D003FC00F240000610006000C11 -:106DD00000000041000C000D00A000610006C00989 -:106DE000000000000000000000000061000E050D22 -:106DF00000A00000000000000000000000000000F3 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000000D3 +:106DC0000000000000000000000000610007000D4E +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 :106E00000000000000000000000000000000000082 -:106E100000000000000000000000000000001A1A3E -:106E200000A00000004082BE82BE00000000700092 -:106E300070FF00000000FFF0FFF000000000000005 -:106E4000000000000505050600000000000000002D -:106E5000AAAAFFFFC1C0000007000707000000004A -:106E60000080FFFD000000000000000000000000A6 -:106E70008000000000000000000000000000000092 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 :106E80000000000000000000000000000000000002 :106E900000000000000000000000000000000000F2 -:106EA000101000A000000000003C83BF00000000A4 -:106EB000700070FF00000000FFF0FFF00000000015 -:106EC00000000000000055555596F000F00000004D -:106ED00000000A0A0FFFC1C0C3C3D700D7D7000004 -:106EE00000000000FFFF00000000000000000000A4 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 :106EF0000000000000000000000000000000000092 :106F00000000000000000000000000000000000081 -:106F1000000000000000000004000000000000006D -:106F2000000000000000F0F0FFFF00003030000023 -:106F300000000000000000000000200055000000DC -:106F40000000000000000000D70700D00000000093 -:106F500000000000000000000000AF1F7D7D0D0D4F +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 :106F60000000000000000000000000000000000021 -:106F700000000000C3FFC3FF00000000000000008D +:106F70000000000000000000000000000000000011 :106F80000000000000000000000000000000000001 -:106F900000000000000000000000000800000000E9 -:106FA0000000000000000000F0F0FFFFF0F03030C3 -:106FB000000000000000000000000000A0005500DC -:106FC00000000000000000000000D70700D0010012 -:106FD0000000000000000000000000000F1F7D0006 -:106FE0000D00000000000000000000000000000094 -:106FF000000000000000AAFFAAF00000000000004E -:107000000000000000000000000000000000000080 -:107010000408100000000000040000000000000050 -:10702000840000000000000088000000080040000C -:10703000040420000000840000000000080000009C -:107040008400000000000000040000030000210094 -:107050000000020020020000000083000000200069 -:1070600000000000100000000000200000000000F0 -:107070008800208040000000000000004100000067 -:10708000C0000900200000000200200000000000F5 -:1070900000002000000000000000000000000000D0 -:1070A0000000002000000000000020000000800020 -:1070B0000000000000000000000000000000800050 -:1070C0000000400000000000000000000000000080 -:1070D0002000000000000000000000004000000050 -:1070E0000000000000004000000000000000100050 -:1070F000000000020040100000000000000010002E -:1071000000000000C00240000000800000000000FD -:10711000000000000000000000000000000000006F -:10712000000000090004000000000004000000004E -:1071300040000200000002000021000000200004C6 -:1071400000000010000001050000002040000000C9 -:10715000000000000000001000000000000000001F -:1071600002000040000000000004000000000000D9 -:10717000000000084040044000000800A10010008A -:107180001020100000000000A0C0001000204120CE -:107190000000000000080082000000000000000065 -:1071A000000800080000000100000000000100824B -:1071B00009008000800800840000000000040089AD -:1071C0000008000800000000080000000001800026 -:1071D00000001008000800080088000000080000F7 -:1071E00000000008000800080000000000000088FF -:1071F00000000008008480080005000880084000A6 -:1072000000008008218800880000001100890089A2 -:1072100088010000000000000008000000000000DD -:10722000000800200004000000000104002100000C -:1072300000000000000900400102000000020041BF -:107240000000004000C000000003004100210008D1 -:1072500000040000004100000000000800080021B8 -:107260000000000000410020000000000021000894 -:107270000008004100000000000000000040000580 -:10728000000000210021000840080021010801023F -:10729000002100100000210000000000000000009C -:1072A000400000000001000100000000200100007B -:1072B000000000000000000000832009000000A181 -:1072C00000A00000000000050008080000100000F9 -:1072D000000000000000000800840000008400009E -:1072E00041A008002100002000904100000000A003 -:1072F00000A0000000C0000000000000000000002E -:10730000000000000000118200A0C0000000040086 -:1073100004010900000120210000000000000021FC -:1073200000000008080082200005C0210020001194 -:1073300000800004004101058840C01008110000D1 -:1073400000000141088300001004000582040000D1 -:107350000004014100110000004100090011000576 -:10736000000000210005000000000000881100005E -:10737000000800000000080010110805100000417E -:1073800008050003000000900003000983000000CE -:107390000000044104050408800000A00000000073 -:1073A00000000000000010000083008200A0000127 -:1073B0000082000400A10000080000010001008814 -:1073C0000000000020000008091021010000001149 -:1073D0000090000004000000000000000000008495 -:1073E00000C00000000000000000000000000000DD -:1073F000000000000000000000000000000000008D -:1074000000000008000000000004004000400400EC -:1074100000000010800480048001000000000000D3 -:107420000002000000000200200040000080000078 -:107430000000004100800000C00401214000000065 -:107440009020002000080000019104000441002069 -:107450000000002000200002822000000041000007 -:1074600008202008000000000003040000000003C2 -:107470000000000000080000000000000000000004 -:1074800000000000101040000100080000408200D1 -:1074900000200000000004000020000800000000A0 -:1074A000000000000000000000008000A10040205B -:1074B0000000000000000020000000010208100889 -:1074C000400200030040090000000408A100800001 -:1074D00000010000000121A100840001000000C0A3 -:1074E0000304000080004088000000000400090040 -:1074F00005820008080000000008000000000000ED -:1075000000000000000080880000408400080001A6 -:1075100000000001000000008000000100000000E9 -:107520000000000000000800002100000000000230 -:107530002100018000A100000041000400000000C3 -:1075400000410200400988214002A009052121A133 -:107550001100010001210041002100110804000078 -:1075600000020009001008000000000400210021B2 -:1075700000000000000800000000000000002000E3 -:1075800000000000000000000004002100052010A1 -:1075900000410821C021000000000000000004009C -:1075A0000000000000000000008400000000000057 -:1075B00000898408202020200000000000004100F5 -:1075C0000000000080008000000200010000A00018 -:1075D000A02004082000040000040082000020C055 -:1075E000000000000000000011000000000000008A -:1075F0000000000000080000000020000000000063 -:10760000000000000000000000000000000000007A -:107610008000004000C000C000000000200000000A -:107620002000000008000100000000000000000031 -:107630000000000000001100000100A00008001080 -:10764000002001090120C0109091000001000000FD -:107650000000C001C1200004900508C0911082887C -:107660000208000000010300080100000000000003 -:107670000200000000000000000000000000000008 -:10768000000000000002000000080000000201C02D -:10769000000400C00300000010000400414001206D -:1076A0000800C0110000800003000000000010006E -:1076B00000000000004000029003000800800080ED -:1076C0000280000009880811000980C00000100035 -:1076D00000000000910488C04005808880008280FE -:1076E000800080000000001008100008004000002A -:1076F0000400800000000000000000000000000006 -:1077000000000000000000000000008000000000F9 -:107710000300000000008900210008000000A10310 -:10772000218400050010000200000000000000009D -:107730000000004000002000008020000200000443 -:1077400000050004000040001021208041040900D1 -:10775000210011000580C100C000840590918300C4 -:107760002008C0001000000010800800030005037E +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:10700000000000000000000000008800C000000038 +:107010002000000000000000200000000000000030 +:10702000200000802080008084800000400200005A +:10703000C004008001000100210000050080000064 +:107040002002000020000000040000034000200097 +:1070500000042000040004080004200000000000D8 +:107060000004200040000400040020002000200054 +:10707000020020002000200800040400100000820C +:10708000000020002000200020002000000200005E +:107090000000C00000020002000000000002000228 +:1070A000000200000020002000200020000000005E +:1070B0000000000000200400400020A000020002A8 +:1070C00000000000000000000000000000000000C0 +:1070D0000000000000820000000800000000000026 +:1070E00000001002000000000002000000900000FC +:1070F000000000000000000000000001000040004F +:10710000002000000000000000000000000000005F +:1071100000040000000000400040020000000400E5 +:107120000400000002000400050000000000000050 +:107130000000000000000000000040850080A0006A +:10714000030200020208000002000000000000002C +:107150000400001008080400000002000000000005 +:10716000000000000000000000000000004082005D +:107170000800820000000000000000000000020083 +:1071800000000400000000000200020000000200F5 +:1071900000000004000400820000008404000000DD +:1071A00000000000000000080000200000000000B7 +:1071B0000000000000000000000011088002000430 +:1071C0000000400100010009000000000000000074 +:1071D00000000000000000000000000000080000A7 +:1071E0000000000000000000001000000008000087 +:1071F000000080080000000800080000000800C02F +:10720000000000088008000400080004044000009A +:10721000000040000000000500040000000800001D +:1072200000080000000000000000000088040000CA +:107230000000000000000000000004200020C12029 +:107240000100000000000000000000000400042114 +:107250000000000000080000000000000000000026 +:1072600000080000000000000000000000000021F5 +:1072700000090000400088000002000000004003F8 +:1072800000000000400004004040840010000000A6 +:1072900000000000000000000000000100000000ED +:1072A00000000000000000000000000000000001DD +:1072B000009000000000000000000000000100013C +:1072C0000401040041000000000000000000000074 +:1072D00000000000000000000000000000000000AE +:1072E00000A000A0000000000084040000000000D6 +:1072F00008000000000400000900008200000004F3 +:1073000000000000000000008000000000000000FD +:107310000020000003000000C00000050004000081 +:107320000000A000000000000000001000000000AD +:1073300020058200A0000800000000000000C0003E +:10734000004100000040000000000000000000407C +:1073500000000000004000000000000000000040AD +:1073600000000000000000000000004000020000DB +:1073700000000000000000000000002000000040AD +:107380000000000000040800000010A000118400AC +:10739000100000009000000040000000000000010C +:1073A000050000A000000000000000000000000038 +:1073B000000080000000000000000000000000004D +:1073C00000000000000003000000000000000000BA +:1073D00000000000000008000000000000000000A5 +:1073E000000000000000000000000000000000A0FD +:1073F000000800080000000000000000020000007B +:10740000008400080000000100000000002000903F +:1074100000080084000000000000000000000000E0 +:1074200000000000000000000000000082000000DA +:1074300000000000000000000000000008008400C0 +:10744000080000008200C0022000000000000000D0 +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000200100000000200000BB +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000200000AC +:1074C000002000000000000000018000000000001B +:1074D0000000002000000008002000000000000064 +:1074E00000C00000000802000000000000000000D2 +:1074F000000000000000000000000000000000008C +:10750000000000000000000000002000000000005B +:10751000000040040000000000000400000000041F +:10752000000010000000000000210008000800001A +:1075300000000000200000000000000000008400A7 +:1075400000402000000500000000000000A0000036 +:107550000004000000000000000000000000000027 +:10756000000000000000000000000000000000001B +:1075700000000000000800000000000800000200F9 +:1075800000000008000000000000000000000008EB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B0000000000000000000000000840000020045 +:1075C00008000000000008000000000000000005A6 +:1075D00000000000000000000000000000000500A6 +:1075E0000000000000000000000000000000008417 +:1075F00000000008000802000000000000840000F5 +:1076000000000000000000A00000000800000000D2 +:10761000000000080008000000000000000000005A +:10762000000000000200080100000000000000004F +:1076300000000000000000000000000182000000C7 +:1076400000010000000000000000000000004000F9 +:107650000000000002000000000000000000000028 +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A +:1076800000000000000000000000000000000000FA +:10769000010000000088009000C0002000000000F1 +:1076A000000000000040802080030009000000006E +:1076B00000000000000000000000000000100008B2 +:1076C0000000001000000000000000001100210078 +:1076D0000000000003008000000000000000000027 +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:1077100000000200000000000080000000000000E7 +:107720000000000000004000200020004000000099 +:1077300000000000000000000000000000000080C9 +:10774000008000020083000000000000000005002F +:107750002000200040004080020041000341000062 +:107760000000000000000000000000000000000019 :107770000000000000000000000000000000000009 -:10778000000000000000000002000903088005005E -:107790000800100008004100900003000400418030 -:1077A00011001041C090881100000000000000008E -:1077B00000000000000100000090000200000084B2 -:1077C000000100000089000000100500A1A0018454 -:1077D000008201000100001008001084A00082084F -:1077E00004000585A1008384000000100100000052 -:1077F0000001000000000000000000000000000088 -:10780000000000000000000000000000000501086A -:10781000001000000100010001408900210001006A -:1078200009A010000205A11091C000000000000096 -:107830000000000100000001010001000100400003 -:107840000001C000040000001000902100884100E9 -:10785000C0C00000000000010100090800C00808C5 -:107860002104C104A090C08509C1000000000100EE -:107870000001000000000001000000000000000006 +:1077800000000000000000000000001000000000E9 +:1077900000000000000400000000000000000000E5 +:1077A00000000000000000000000010000000000D8 +:1077B00000000000000000000000000000000000C9 +:1077C000000200400000000900000000000000006E +:1077D000000000840000008400020000000001019D +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:1078000000000000000000000000000000010090E7 +:107810000000000000000001000000000000000067 +:107820000000000000000000000000010000010155 +:107830000001000000000000000000000000000047 +:107840000000000001000200000000000000000035 +:107850000000010000000200000000000000000025 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 :1078800000000000000000000000000000000000F8 -:1078900000000000400100000201040100C000A13E -:1078A000009000C0219100C084000102000000008F -:1078B0000000000000400002000511092011032013 -:1078C0009002100800000000000009000009028872 -:1078D0002110028300090003000511098491114061 -:1078E00080051109840480020021210200000000AB -:1078F00003024121110900020010000900000000EC +:1078900010000000000000000000000000000000D8 +:1078A00000000200000000000000000000210309A9 +:1078B0004021001100000000000000000000000056 +:1078C00000000000020010000000000000000000A6 +:1078D0000000000004200003000500030000000079 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 :107900000000000000000000000000000000000077 -:107910000000000000008009000800100011004075 -:10792000001000A0008540A10521082021A0000032 -:1079300000000000000000000000000000000890AF -:107940000908020008080000001180000000A1885A -:1079500011090580020941040003100002004000E3 -:1079600004850580100080110009008000200000BF -:1079700021020800000009110000000000000000C2 +:1079100000008000000000000000000000000000E7 +:107920000000000000000000000000000000000255 +:10793000000000000009000000000000000000003E +:1079400000000000000021001104000005000000FC +:10795000000000000000008000040000000341035C +:107960002100210040410000000000000000000054 +:107970000000000000000000000000000000000007 :1079800000000000000000000000000000000000F7 -:1079900080008000000000090009000000000011C4 -:1079A0000084002000800003C1891082A1800903A7 -:1079B00000000000000000000000000000000000C7 -:1079C00001C10001000001018200200182000800C5 -:1079D000C14008881140890001100000000000002B -:1079E00000900108008401002005A0021040100151 -:1079F0000000011000000000000000000000000076 +:1079900000008000000080000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B0000085000000000000000000000000000042 +:1079C00000000000000000000100010100000000B4 +:1079D00000000000000000000002000000000000A5 +:1079E0000184000001000001000000000000000010 +:1079F0000000000000000000000000000000000087 :107A00000000000000000000000000000000000076 -:107A10000000081010000200020000080000000032 -:107A200000000088002000020001C1909008099029 -:107A30008400000000E000000000820000E0000080 -:107A40000000000000E007004200000000E0070026 -:107A50000000000000E007000000810000E00700D7 -:107A60000000000000E007005000000000000700D8 -:107A700084000000000000E00000000000000000A2 +:107A10000000000040009000040000000000000092 +:107A20000000000000000000000000000000000056 +:107A30000000810000E000000000000000000000E5 +:107A400000000000000000000000480000E0070007 +:107A500000000000000000000000480000E00700F7 +:107A60000000000000000000000600000000000010 +:107A70000000000000000000000000000000000006 :107A800000000000000000000000000000000000F6 -:107A9000000000000000000000000000810000E085 -:107AA00000000000810000E007000000000000006E -:107AB000070084000000000000000000000000003B -:107AC00000000000000000000000000000BE00BA3E -:107AD000000000000F00C341F0F030300000000053 -:107AE000000000000000000038BA79FB030F00001E -:107AF00028EBFCFC0000000000000000000000007B +:107A9000000000000000000000000000000000E006 +:107AA00000000000000000000700000000000000CF +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 :107B00000000000000000000000000000000000075 -:107B1000000000000000FBFA5150000000000000CF -:107B20000000000000000000000000AA2000000289 -:107B30003C3C0101000000000000000000000000CB -:107B4000000000000000000000000000000000AA8B -:107B500000BA000000000F0FC341000030300000E9 -:107B600000000000000000000000109251D3C3FF8D -:107B7000000028EBC0C00000000000000000000072 +:107B1000000000000000D75FD75F000000000000F9 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 :107B800000000000000000000000000000000000F5 -:107B90000000000000000000FFFE5554000000003F -:107BA000000000000000000000000000000000F0E5 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 :107BB00000000000000000000000000000000000C5 :107BC00000000000000000000000000000000000B5 -:107BD0000000000000000000AA001E14A0F0A0F0A9 -:107BE00000000000000000000FFF0FFFAA00EF459B -:107BF0000F0F0F0FBF150000000000000000000075 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 :107C00000000000000000000000000000000000074 -:107C1000000000000000000000000F0FFFFF000048 -:107C20000000000000000000000000000000000054 -:107C3000FFFF0000C3FF0000000000000000000084 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000001010F00000043 +:107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 -:107C50000000FFFF4F410000000000001E14AAFFBB -:107C6000AAFF0000000000000000A3A3A3A3AA0035 -:107C7000AE040D050C00BA1000000000000000006A +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 :107C800000000000000000000000000000000000F4 -:107C90000000000000000000000000000F0FFFFFC8 -:107CA00000000000000200000000000000000000D2 -:107CB00000003E3EC3FFC3FF040000000061000758 -:107CC000000D000000610006C009000005610A0DFA -:107CD000050100A000610007000D0000A061000E7A -:107CE000009900A10061000EC00100A005610A0911 -:107CF000050100A105610A0E050D00A0000000614C -:107D000000040009000000610006000D00000000F2 -:107D10000000000000000000000000000000006102 -:107D20003006000D000000610006C0090000006080 -:107D30000007C09D0000A5610A0E051D00A00000FF -:107D400000000000000000000000303F303FFDC197 -:107D50003D013CF0AAAA0000000000000000B0BEF7 -:107D600000003000100028280A0A00CFCFCFFF0003 -:107D7000FCFC0C0FFCFF000000000000EFE0000026 -:107D80004100C3C3FFA0000000000000000000008D +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000001010F00C3 +:107CB000000000000000000000000000006100065D +:107CC000800900000000000000000000000000002B +:107CD0000000000005610A0C850D00A000000000F6 +:107CE0000000000005610A0E850900A00061000681 +:107CF000000D000000000000000000000000000077 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D200000000000000000610007000D00000000DE +:107D30000000000000000000000000000000000043 +:107D40000000AFAAABAB0000000000000000000084 +:107D5000000000000000FF55D755000000000000A3 +:107D600000000000000000000000FFFFFFFFFF0018 +:107D7000070F0000000000000000000000000000ED +:107D800000000000000000000000000000000000F3 :107D900000000000000000000000000000000000E3 -:107DA0000000000000000000000000003000FFFFA5 -:107DB000000000000000BAAA0000000F0000F3510C -:107DC000000000000000000000000000303F3030E4 -:107DD000FDC13D013CF0AAAA000000000000000027 -:107DE000B0BEB0BE0000000028280A0A00CF00CFB5 -:107DF000FF000C0C0C00FCF00000000000002F2025 -:107E000000000000C3C3FF00000000000000CF7DA1 -:107E1000CF7D000000000000000000000000000016 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000AFAAABAB000000000000000004 +:107DD0000000000000000000FF00C30000000000E1 +:107DE00000000000000000000000000053500000F0 +:107DF0000000070F0000000000000000000000006D +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 :107E20000000000000000000000000000000000052 -:107E3000CFFF00000000000010000300000FF3510E -:107E4000F3510000000000000000000000000000EE -:107E50000000FFFFFFFFAAFFBEBE00000000000001 -:107E6000000000000000F300AAAA0000000000CFFC -:107E7000CFCFFF5C005C0CFC0FFF00000000C5C50D -:107E8000C5C50000A8A800A80000435F00000000CE +:107E30000000000000000000000000000000000042 +:107E4000000000CF007DCF00000000000000000017 +:107E500000000000000000000000C3C382C3000057 +:107E60000000000000000000000000000000000012 +:107E70000000000000000F0F0F0F000000000000C6 +:107E800000000000000000000000000000000000F2 :107E900000000000000000000000000000000000E2 -:107EA00000000000000000000B03EBC30000000016 -:107EB00000005555000000000B1F00F000280028AE -:107EC00000000000000000000000000000000000B2 -:107ED000000000003D3C3F3C005514140000000031 -:107EE00000000000F0FFB0BE000000000000000035 -:107EF00000CF00CFFF5C005C00F003F30000000047 -:107F0000FFF00F000000FCFC00FC435F435F00003B +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000C007D4D00000000000000DC +:107ED000000000000000000000000000C3C382C3D7 +:107EE0000000000000000000000000000000000092 +:107EF00000002000000000000D0F0F0F0000000028 +:107F00000000000000000000000000000000000071 :107F10000000000000000000000000000000000061 -:107F2000000000000000000000000F07FFD7000065 -:107F300000003000000000000000E0F400003C3CC5 -:107F400000300000400000000000000002000000BF -:107F5000000000000000400000000000840000005D -:107F600000000000010000000000000020000000F0 -:107F700000000000000020000000000020000000C1 -:107F800000000000010900030000000000002000C4 -:107F90000000A00000000000200000000000000021 -:107FA000000000104000200000000400000000005D -:107FB000400000000000C00020000000001000048D -:107FC000000000008400208000000000000000008D -:107FD000000000000000008200000000000000001F -:107FE0000000000000002000000000000000000071 -:107FF0000000000000000000400000000000000041 -:108000000000000000002000000000000000000050 -:1080100000000000000010024002400000001000BC -:108020000000000040001000800040000000100030 -:108030001000100040004040004010004000004090 -:10804000000040000000108200040000000000005A -:108050000000000000000009000000000000000017 -:108060000000000000000000000000000000000010 -:1080700000000000A000000000000041000000001F -:1080800000000000000000090000000000000000E7 -:1080900000000000004000000000000000000000A0 -:1080A00010000000000000000000000000000000C0 -:1080B00000008200000090000000000000000000AE -:1080C00000090400020990400000000000000000C8 -:1080D0000008000000000008000000000008000088 -:1080E0000000000000080008000800080000000868 -:1080F000000800000000008400000088000800085C -:108100000000000800080008000800080000000047 -:10811000008400080010000000840084008400082F -:1081200000080000008400840084000800080000AB -:10813000000800080000000000000000000800081F -:1081400000840008000000080084000800400021AE -:10815000000800210005000000210000002100218E -:108160000008202184000000902100000821002147 -:1081700000080021000000000008000300080021A2 -:1081800000000021000000000003000000110000BA -:10819000002100210021002100000021000000003A -:1081A000002100030021000900000005002100213A -:1081B00000210005002100080041004100030009E2 -:1081C0000021000000210000000000080000000065 -:1081D00000000000000000001000050011000084F5 -:1081E00000C00000200003002000200000A000903C -:1081F000000000000000000800000084008220A0B1 -:1082000000C0000000020000000000000084000028 -:1082100000000000000000400010000440000000CA -:10822000000000000000000000000000000000004E -:108230000000000000000000000000080500050824 -:1082400000004100000002000300000009080000D7 -:1082500000C0000000000000080000000000004115 -:108260000000000000000000000000000000000905 -:1082700000000005000000100000000200000000E7 -:1082800000000000001000000009000000000000D5 -:1082900000000000000500050009000000000000CB -:1082A0000005000000000000000000400000000089 -:1082B0000000000000400000000008400010000026 -:1082C0000005000000000011000000050000A000F3 -:1082D00000090204008400000000008420C009C0DE -:1082E00000C0000000000090008800900000000026 -:1082F000000000C0000400000000000040040090E6 -:1083000000000000001011000000000000000090BC -:10831000008810000000000400840000000000003D -:1083200000000000004000000000000000200000ED -:1083300000080010001000000000000000C00082D3 -:1083400002A0000000000000000000000900110071 -:1083500000A0000000000000002100080000000054 -:10836000000200000000000000009000000000007B -:1083700000080000000000000000000000000010E5 -:108380000000200800000000004000000000000085 -:1083900000080000000000000003000000000000D2 -:1083A00000000000000000080000000000000000C5 -:1083B000000800210000000800000000000000008C -:1083C0000000080000000000000300410000001051 -:1083D0000000000000000008000000000000000095 -:1083E0000000000000000000201021C000C021009B -:1083F000000000000002000009900082001020C070 -:10840000050000000000000020880000009020000F -:1084100011000088090005900000000000080020FD -:108420000510110000020000000000001000000014 -:1084300008000000000000000000000000000088AC -:1084400000000590090800880000050000000000F9 -:108450002100000009000800008200000000000068 -:1084600000000004880000008408001100000009DA -:1084700000080008002100080008000000000000BB -:10848000000300410000000000000000000900009F -:10849000000800080021000800080000000000009B -:1084A00000020000000400040000000000000000C2 -:1084B0000008000000210000000800000000000586 -:1084C000000000000000000300008400000088009D -:1084D00000080000000800000008004000840000C0 -:1084E0000082000010842090008400001110111000 -:1084F00011000090000041000000000020000082F8 -:108500000000200005000000110000001100009094 -:108510001102000409020002009020000000200067 -:1085200000000000201020000000000000002000DB +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F400000000000000040000000000000000000F1 +:107F50000000000400020000000088000000000093 +:107F60000000000000000000001188000004000074 +:107F700000000000000000000000200000020000DF +:107F80000000000000000003000000002000840446 +:107F9000000000000000000040000000000200009F +:107FA0000000000001004180000000028800200065 +:107FB00000110400A00000002000000000020400E6 +:107FC00000020000100040800000000000000000DF +:107FD000000000000000000000000000009000828F +:107FE00000000000410000000000400000400000D0 +:107FF00000C0000000000000400000000000000081 +:10800000400000020000000000001000000000001E +:1080100000000000000000820002000000000000DC +:108020000040000000021004A00800000000000052 +:10803000000000000002000010001000000000C05E +:10804000020200000002C0008408000000000000DE +:108050000000000000000008000000000000001107 +:10806000020000000000000000000040004002008C +:108070000000000000000000000000000000000000 +:1080800000000000000000030100000000000000EC +:1080900000000000000000000000000002000000DE +:1080A000000000000000000002000040000000008E +:1080B00000000200000000000000000000000000BE +:1080C0000000024000000000000000100000000856 +:1080D0000000000800000008008400100000008478 +:1080E000000000080084000800080008000000826A +:1080F00000040008000000080008008400000008D8 +:10810000000000080000008200082082000000003B +:10811000000800000008000000080008000000003F +:108120000008000000040000008200084002000077 +:10813000000802000408000000080004000800888D +:10814000000800000008000000840008000800216A +:108150000021002100210021000000030000002177 +:108160000021002100210005000000210100002164 +:108170000021002100210040000000030000000455 +:10818000000400110004000004000000044000008E +:108190000000000000000000880000000000000057 +:1081A0004000000000000000000000000021042149 +:1081B000000500210008000000000000002100214F +:1081C0000000002100000000000810000021002134 +:1081D000400000000008000000000000000000084F +:1081E00000000000000000004000000040002000EF +:1081F00041000500410000000000000000000000F8 +:10820000000000000000040000000000000000006A +:10821000000000000000000000000000000000005E +:1082200000900000000000000000000000000000BE +:108230000000000000000000000000000000000836 +:108240000500000000000000000000000000000029 +:10825000000082008200C000000000020004000054 +:10826000000040008200C0000000C00000000000CC +:1082700000008200820000000000000000000000FA +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000800000000000000C6 +:1082B00000000000000000000000000000000000BE +:1082C0000000000084000000000084000040004026 +:1082D00000400840000000C0000000004000000016 +:1082E000000000000000000000000000002000006E +:1082F00000A000000800000800000000009000003E +:10830000000000000000000000004000000000002D +:108310000000000800000000000000000000000055 +:10832000000000400000000000000000000000000D +:10833000000000000000000000000000000000003D +:1083400000C000C0000000080000000000000000A5 +:108350000000000000000000000000080000000015 +:108360000000000008000000900800000000000568 +:10837000080000008403000000000040000000002E +:1083800002000000000300000005002000000000C3 +:1083900000000000000000000000000000000000DD +:1083A0000000024000000008000800030000000870 +:1083B0000040020800000008C0410000000000006A +:1083C0000208024000000008004100000000000810 +:1083D0000000002100002008000000000000000054 +:1083E000000000000000000000000000000000008D +:1083F00040000000400005000000000000000000F8 +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:108430000000000000000000009002000900080099 +:10844000000000000000000000000000000200002A +:10845000000000000000000080000000000000009C +:10846000000000000000000000000000000000000C +:1084700000000021000000000000000300000000D8 +:10848000000082000000000000000000000000006A +:1084900000000000000800090000000000000000CB +:1084A00000000000000000000000000000000000CC +:1084B000000300000040000300000000000800036B +:1084C000000088000021880000000000000000007B +:1084D0000003000000100000000000000000000089 +:1084E000000000000000000000000000000000008C +:1084F0000000000000000000090000000000000073 +:1085000000881100000000000000000000000000D2 +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B :10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000101B -:1085500020000910000000000000020000000000E0 -:1085600020000000000000000000000000000000EB -:1085700000000002000000000000000000000000F9 +:1085400000000000000000004000000000000000EB +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000010A +:1085700001000002000000000000000000000000F8 :1085800000000000000000000000000000000000EB -:1085900000000002000000000000000000000000D9 -:1085A00000000000000000000000000000000000CB -:1085B00000000000000200000000000000000000B9 -:1085C00000000000000000000000000000000000AB -:1085D0000000000000020000000004000000000095 -:1085E00011008000000000000000000000000000FA -:1085F0000009090000000000000000000000000069 +:108590000000008400000000000000000000000057 +:1085A0000000000000000000000000000000018842 +:1085B000000001000002C0100000000000010000E7 +:1085C0000000000000000000000000000000008823 +:1085D0000000010000021002000000000001000085 +:1085E000000000000000000000000000000000008B +:1085F0000808080000000000000000000000000063 :10860000000000000000000000000000000000006A -:108610000009090000000000000000000000000048 -:10862000000000000000000000000000000000004A -:10863000000000090200000000000000000000002F -:10864000000000000000000000000000000000002A -:1086500000000041110000000000000000000000C8 -:1086600000000000210000000000000000000000E9 -:108670000000410003000082000000000000000034 -:1086800000090000100000000000000000000000D1 -:108690000000410003000082000000000000000014 -:1086A00000040000000011000000000000000000B5 -:1086B00000000000410003000091000000000000E5 -:1086C0000000002000000400000000000000000086 -:1086D000000000000900030000C0000000000000CE -:1086E0000000000300000000000000000000000087 -:1086F00000000000020003100008C088880000008D -:108700000000000000000000000000000000000069 -:1087100000000000880003100008C088020000006C +:1086100008050900008000000000000000000000C4 +:108620000000000000000000001100000000000930 +:1086300040000009400000008000000000000041F0 +:108640000000000000000000001100000000000910 +:10865000050000094000000000000000000000418B +:108660000000000004000000000000000000000006 +:10867000000009008280008000000000000000006F +:108680000041000041000008000000000000000060 +:1086900000000300880000800000000000000000CF +:1086A0000010000000001100000000000000110098 +:1086B000000004000200908000000800800000001C +:1086C00000008040000011000000000000001100C8 +:1086D00000001000020090800000030080000000F5 +:1086E0000000800800000100000000000000000001 +:1086F00000000000820020100010100002000000A6 +:108700000000000100000000000000000000000068 +:1087100000000000400020880008209008000000B1 :108720000000000000000000000000000000000049 -:10873000000000000000020003100008C08888004C -:108740000000000000010000000000000000000028 -:10875000000000000000880003040009C0888800B1 -:1087600000000000000100000000C0000000000048 -:108770000000000000000088000000000000000071 +:108730000000000000000400081000000100080014 +:1087400000000000C0010000000000000000000068 +:1087500000000000000004000410000000000800F9 +:1087600000000000C0010000000000000000000048 +:1087700000000000000000400000000000000000B9 :1087800000000000000000000000000000000000E9 -:1087900000000000000000020000000000000000D7 +:1087900000000000000000100000000000000000C9 :1087A00000000000000000000000000000000000C9 -:1087B0000000000000000000008800000000000031 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000008800000000000011 -:1087E0000000000000000000000000008000000009 -:1087F0000000000000000000000000000000090070 +:1087B00000000000000002000002000000000000B5 +:1087C00000000000000100000000000000000000A8 +:1087D0000000000000000200000200000100000094 +:1087E0000000000000010000000000000000000088 +:1087F0000000000000000000000000000000000079 :108800000000000000000000000000000000000068 -:1088100000000000000000000080000000000900CF +:108810000000000000000000000000000000000058 :108820000000000000000000000000000000000048 -:108830000000000000000000000000000000000038 -:108840000200000000000000000000000000000026 -:108850000000000000000000000000000000000018 -:10886000090000000000000000000000800000C1BE -:108870000000000000000000008000C18000001126 -:10888000000000000000000000000010800000C197 -:108890000000000000000000008000C18000001106 +:108830000000000000000011801000000000410056 +:1088400000000000000000410000000000000000E7 +:10885000000000000000000380100000000008007D +:108860000000000000000041000000000004008340 +:1088700000000000000000000000004100000010A7 +:10888000000000000000000000000000000800835D +:10889000000000000000000000000041000000088F :1088A0000000000000000000000000000011800037 -:1088B00000C10000000000000000000000918000E6 -:1088C0000011000000000000000000000004800013 -:1088D00000C1000000000000000000000041800016 -:1088E0000004000000000000000000000000400044 -:1088F00000C10000000000000000000800858200A8 -:108900000000000000000000000000000000200047 -:108910000040000000000000000000080085820008 +:1088B00000C100000000800008000000000400105B +:1088C00000400000000000090000030800118000C3 +:1088D00000C100000000800008000000004100000E +:1088E00000400000000000000000080900008401B2 +:1088F00000830000000000000000000000410200B2 +:10890000000100000000000000000000000008005E +:10891000008300000000000000000000004108008B :108920000000000000000000000000000000000047 -:10893000200000400000000000000000000000C017 -:108940002000000000000000000000000000000007 -:1089500020000040000000000000000000000011A6 -:108960008200000100000000000000000000000084 -:108970000000000000110000000000000000810065 -:1089800000E00000480000000000000000000000BF +:10893000200000400000000010000300000000A024 +:10894000020000010000000000000000010500001E +:10895000200000400000000010000300000000891B +:1089600002000001000000000000000001100000F3 +:108970000000000000000000000000000000810076 +:1089800000E000004800000000000000000A0000B5 :108990000000000000000000000000000000810056 :1089A00000E000004800000000000000000000009F :1089B00000000000000000000000000000000000B7 -:1089C000410000E000008400000000000000000002 +:1089C000411200E0070000810000000000000000EC :1089D0000000000000000000000000000000000097 -:1089E000810000E0000048000000000000000000DE +:1089E000811200E0070048000000000000000000C5 :1089F0000000000000000000000000000000000077 :108A00000000000000000000000000000000000066 :108A10000000000000000000000000000000000056 @@ -141524,449 +141524,449 @@ :108B00000000000000000000000000000000000065 :108B10000000DE2E747B000000000000000000005A :108B20000000000000000000000000000000000045 -:108B30000000DE2E0000747B00000000000000003A +:108B30000000DE2E0000257B000000000000000089 :108B40000000000000000000000000000000000025 -:108B500000000000DE2E747B00000000000000001A +:108B500000000000DEA4257B0000000000000000F3 :108B60000000000000000000000000000000000005 -:108B700000000000DE2E61560340000000000000EF +:108B700000000000DEA46156034000000000000079 :108B80000230A0000000000000000C4000000000C7 :108B9000000002C06A866156034000000000000029 :108BA0000230A0000000000000000C4000000000A7 -:108BB000000002C06A860000615603400000000009 +:108BB000000002C06A860000612603400000000039 :108BC00000000230A0000000000000000C40000087 -:108BD0000000000002C06A866156034000000000E9 +:108BD0000000000002C0648661260340000000001F :108BE00000000230A0000000000000000C40000067 -:108BF0000000000002C06A860000000000000000C3 -:108C0000000000000000880000002000010040007B -:108C100020000005200020004000010000000800A6 -:108C20000000000000000000000020000000000420 -:108C30002004400000080000000340050000000080 -:108C4000040004000000000000800000000000009C -:108C5000000000002000000000008800000000006C -:108C600000000008000000000000000000000100FB -:108C70000004000500000400008000000000000067 -:108C8000000000000084000000000000050040001B -:108C90008000000000000000000000000200000052 -:108CA0009000000000000000000000000000000034 -:108CB0000000000080000000000000000000000034 -:108CC00000008000400000000002000209000000D7 -:108CD00040000000400000000000000040000000D4 -:108CE0000000000040000000000000004000000004 -:108CF0004002000100000000000200020000000825 -:108D000000100000000000800000000000000005CE -:108D1000000000030000000000000000010000004F -:108D20000002000000000000000000000000000041 -:108D3000000800100000000000000000000010000B -:108D400000080100000000000000000000000040DA -:108D500000400241004002000000000000000284C8 -:108D60008200000000000000001000100010004110 -:108D7000844110100210000500410009002100008C -:108D80000084000002000000002000000000000835 -:108D900000080004000800080000000000000200B5 -:108DA0000008001100C000000000000000000008E2 -:108DB0000008000000080008008200080000000011 -:108DC0000000081040001100001000080000000022 -:108DD0000008008800400008008200000008000031 -:108DE000081000080200000400000008000000084D -:108DF000000800000000000800000010008400C00F -:108E00000002000000000000000000044005010016 -:108E100000000482000200040005002100000000A0 -:108E2000030004208482000000000008000000000D -:108E3000000000000080200000410002000020002F -:108E4000000020000000400000054000000000403D -:108E5000000000050040000000410040000000004C -:108E6000000000000100010000008210C000C000EE -:108E70000000000000108200C00500000000A000FB -:108E800084050000050000000500000000018000CE -:108E9000400000008004000000830008000800007B -:108EA00000109088800100110000001000000010E8 -:108EB0000000000000080004918800080000000283 -:108EC000080000000000000000000000000000009A -:108ED0000000000000000040000000000002000050 -:108EE0000000000005004000040005000300000031 -:108EF0000000000000000000000000000010000062 -:108F00000000000000000408010001209180010021 -:108F1000010001802000820000A10000000000107C -:108F200000050004084000004140200000009000BF -:108F30000000000004000000C00008000100010063 -:108F400000110000000008210000000000080000DF -:108F50000000000000088200001000000010C000A7 -:108F6000000000400000080800004000080408005D -:108F700000000008000800040009000000110000C3 -:108F800000090004010400848008408240110404A8 -:108F90000484049004048088090420040000000470 -:108FA00000820084000080010000C089800000A0D1 -:108FB00000A0000400000390000003000300200054 -:108FC000200211002000000009040000000021849C -:108FD00000000004410000000020000020100000FC -:108FE00020A00082100000080000000080000000A7 -:108FF00000000000000000040088008200A00000C3 -:1090000003080800008520102041202000210021B5 -:109010000020200300040040000320020082002002 -:10902000C000002100080003001000000002010041 -:109030000041000000000840008000000000200007 -:10904000000000000004080000000000000500000F -:10905000080000090003000500000005080000806A -:10906000900008000000000000008441040004009B -:109070008400C000000000000084820000000000A6 -:109080008200000400000000000000000001000059 -:1090900000000001800000110000000880080004AA -:1090A0000009000000200000000020000000000176 -:1090B00020000008000000000000000400880900F3 -:1090C00000080000210000A1800000000020000036 -:1090D000000020000000000000000000000800C0A8 -:1090E00000100008000000000000000000008000E8 -:1090F000800000024108000000000021000800C0BC -:109100000000000810010000000000000000002125 -:109110000508000820210003A000000901820111B8 -:10912000019101030041000000040004011000004F -:10913000000900000000000000002009408021001C -:109140000100008000802004090021000000004090 -:1091500004050009000000000004000000090000F0 -:109160000000004100000004000000000000820038 -:1091700000000000000000040004000000200000C7 -:1091800000001000010000080084000040080000FA -:10919000000084C000000000000000000000042067 -:1091A0000400042004000000000000000000020190 -:1091B0000000110000000000000000000000090491 -:1091C000A0042000200421040000208820000000CA -:1091D0002090A104200020000000200400000008CE -:1091E0000484000000041100000000084100000099 -:1091F0002004000000000200000000000000200524 -:109200000000008400002000000020040004000092 -:109210008808A00084100820030211028200008840 -:10922000019002C08584881000000000000000004A -:1092300088A00040002002A0000000000000000004 -:109240000000010190010000110000004100A00099 -:109250000000C0A00002840810A0000000008400EC -:1092600000000000000000000000000000000000FE -:109270000000004090088400A02000000000400092 -:10928000000001000100400000000000000000009C -:10929000000000808200800080001180830089002F -:1092A000000020002100C00000800000000000003D -:1092B000000000800080000080000000000000002E -:1092C0000000004020084040000090000900C0005D -:1092D0000000000000801000800080800000050079 -:1092E000000000000000000000000000000000007E -:1092F0000000000000009180800080000300030057 -:10930000800000001000400080000000000000000D -:1093100004000000900041000240028889A0212141 -:109320000804119105892100100810830000000035 -:1093300000000000210084082004C100000000009B -:1093400000000000400000000400050809020400BD -:10935000892084210000C000410208830800000029 +:108BF0000000000002C0648640000000000820055C +:108C00002000000000040004000000910008C000E3 +:108C100020008800200020002080000004002000A8 +:108C200040004000000004000000000000000004BC +:108C3000200020002000400000030000040000008D +:108C400020002000000040008800400000000004D8 +:108C5000000840002000000400000100080000831C +:108C600008802100C00020002000200000800000BB +:108C70000000200088000000000080000082000149 +:108C80000082000000000000000000004020000002 +:108C90000000000000000000000000400004800010 +:108CA0000000000000000000800440000000000000 +:108CB0000000000000000000800000000000000034 +:108CC00000000000400000000000000080000000E4 +:108CD0000090000000000000000000400800C18279 +:108CE000004080100800000000000000100000108C +:108CF00000000000400000000090000000000100A3 +:108D0000100000050000000000000000000000202E +:108D1000000000000000000004100000000000003F +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D5000000082000200000000000000020000008D +:108D60008209008000100000088000000000000060 +:108D700000100000010000000011000001000200CE +:108D80004008800802900008000800080000090060 +:108D90000009008800080000008800840008000026 +:108DA0000010000800000004000800080000000097 +:108DB00000100010008809000000004000080000BA +:108DC000000000000008000000000008000800008B +:108DD0000000000000004000000000000000004013 +:108DE0000000000800100009000080100090020838 +:108DF000000003010000028400080008021020089F +:108E0000100200000000000000000021000000052A +:108E10000000000000000004000005200000000029 +:108E20000000000000000000000000000020000022 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E600000000400000000000100004108000000B4 +:108E70000000881000108200C00000000000000008 +:108E800000000001000000000000000000000000E1 +:108E9000000000000000410005010000840100A066 +:108EA0000040000040000000000000000040000002 +:108EB00004000000000000000000000400000000AA +:108EC000000000000000000800C0000800000000D2 +:108ED00000000000000000000082000200080008FE +:108EE00000080000000000200000080004008000CE +:108EF000000011000000000000A000020008009027 +:108F00000084000082000100100000000000080042 +:108F10000000C00000020000200009040000202022 +:108F200000058205C0000000008000000800040069 +:108F3000000000000000000000000000000400200D +:108F40000000088400000000000008000804A000E1 +:108F500008000010000000000000820082000000F5 +:108F60000040000000000000000082410010088066 +:108F70000800000000000000000000000000820562 +:108F800000400000000003004000A00000000500B9 +:108F90000000000000840082410000002001000069 +:108FA0000001000800000000000000200000000098 +:108FB0000000410000000000000000000000000070 +:108FC000000000000002000000000000000000009F +:108FD0000000000000000800000000000000000089 +:108FE000000000000000000000000200000000017E +:108FF0008010800000000000000000000040000021 +:109000000000028200000000A0020008000200111F +:10901000A00000118800840082000400820000008B +:1090200000000400000000050000000000008200B5 +:109030000000000000000000000000000000080028 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000008090 +:10906000000008038240080008000000080000001B +:1090700082110400000000000000000000008208CF +:10908000000000008200000000000000000000005E +:10909000000000000000000000000000800411C07B +:1090A0000000000080000000000000000000000040 +:1090B0000000000000000000000000000088040024 +:1090C00000000000000000000000000000000000A0 +:1090D00000000000008800000000040800000000FC +:1090E0000010118400A00000000000000200000039 +:1090F0000000020080880000000000080000000856 +:109100000000008800A00000000000A08200000213 +:109110000004000400000021000000000100000025 +:109120000000000400000004000000000000000037 +:10913000001000100000002000000000820000006D +:109140000000000000000000000000000000080017 +:10915000000000000000000000000000000000000F +:1091600000000200000082000000A0000008A00033 +:10917000C0000000080000000000004004000000E3 +:1091800000040004C0000000820000000000000095 +:10919000000100000000210000000000000040006D +:1091A00000000000000100000004000000000000BA +:1091B0000000000000000002000400002000000089 +:1091C000000000000000000002000000020000009B +:1091D000000000000000000000000200000000008D +:1091E000000000000000000000000000000000007F +:1091F00000000000008400001100000020088082B0 +:1092000000000000000000000000088200000000D4 +:109210000001A000000100000000000000000000AC +:1092200000A00020841100090090009000080002B6 +:10923000040000000000C00000000000000000006A +:10924000000000000000000000000000000000001E +:10925000000000000000000000000000000000000E +:1092600000000001000100010000000000000000FB +:109270000000024000020004208400A000000088DA +:10928000009000C0000000400002000000008900C3 +:1092900000000041802000030010000000000000DA +:1092A0000000209010218010000800000080008045 +:1092B000008000000000000000000000000000002E +:1092C000000000000000000000000000400000005E +:1092D000000000000000000000000000000000008E +:1092E000000000000008000400080020000000004A +:1092F000000000008080000000800000038000006B +:10930000000000000080000000000080000003005A +:109310001000000000000000000000080000000035 +:10932000000000000000002100800000000000009C +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD -:109370000000000000002000210003000383000023 -:109380000000000000800200020000002000000930 -:109390000000000900000984100004010088021187 -:1093A0000300110504890090A100908884890000C1 -:1093B0000000000000008500110188A1C10000002C -:1093C000000000000000004000000100000110C08B -:1093D0000400A0011101000088000000091085842C +:1093700000000000000080008010000980008000D4 +:10938000002100800000000000000000000000003C +:1093900000000000000000020000000000010000CA +:1093A000000000000000000000000002002000009B +:1093B00000000000000000000000000000000000AD +:1093C000000000000040000000000000000000005D +:1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D -:1093F00000000000000000000004010001000088DF -:109400000000000000000002000001000000000059 -:109410000000000000000000100800000010C00361 -:10942000021002850090030800C184C00084A010CF -:10943000000000000000000040840040A0A0C0C068 +:1093F00000000000000000008800020090890200C8 +:109400000200000000080000000000000000000052 +:10941000000000000000000000000000100000003C +:1094200000000000000000009000000001000201A8 +:1094300002000000000008000040000890A000C0EA :10944000000000000000000000000000000000001C -:1094500000040403008501850000C0910010100580 -:109460008803000000000000000000000000000071 -:109470000000000000000000000010000009900142 -:1094800002020000000000000001000000010000D6 -:1094900000010000A0000000000100910011000286 -:1094A0000288000900C00011C091000200100009EC -:1094B000048900000000000000000000000080009F -:1094C00089800000000000000000004004214104E9 -:1094D0000000000400C0002140080000800800894E -:1094E00000850520000200000008000400000000C4 -:1094F0000000000000000000000000008040008329 -:10950000801183A00005000300000011002000105E -:1095100000100011000200030003100241A0408966 -:109520000880108241092111118011044102210299 -:10953000050020100000000000000000008400C1B1 -:109540000000000800000000000000000202090006 -:10955000200000084080080010001011000000806A -:1095600000100080800200000000000000000000E9 -:109570000000000000000000000000000000C189A1 -:109580000400A000400900000000000000000009E5 -:10959000000000000011000000000000000001C0F9 -:1095A00001200184001103889000110201008583CD -:1095B000C0C184844100000000000000000084C09D -:1095C0000410C0908401000000000000000001832E -:1095D00000000100000100C001C000900001000077 -:1095E000C040401140821001000000000000000057 +:10945000000000000001000100000000000000000A +:1094600000000000000000000000000000000000FC +:109470000000000000000000000002400002400464 +:1094800082020000000000000000900000000000C8 +:109490000400000000000000000000000900C100FE +:1094A0000800000000000000000000112021080357 +:1094B000801180000000000080000080008080009B +:1094C000008000000000000000000000000000001C +:1094D0000000000500030010000200000000000072 +:1094E000000000000000000000000000000011006B +:1094F000110000000000000000000000008000805B +:10950000000080800000000000000000000000005B +:109510000000800000400008000800054110100015 +:109520000500100000000000000000000004000022 +:10953000000080000000000000000000000000406B +:1095400000000000004000000000000000000000DB +:10955000000000000000000000000000000000000B +:1095600000000000000000000000000000000000FB +:109570000000000000000000000000000000800566 +:1095800000040080800080008080000080000000D7 +:1095900000000000000000000000000000000000CB +:1095A000000001000000000000000000000090002A +:1095B0009000880002000000000000000000000091 +:1095C000000000000000000000000000000000009B +:1095D000000000000000000000000000000000008B +:1095E000000000000000000000000000000000007B :1095F000000000000000000000000000000000006B -:109600001140020002000200000000000000000003 -:109610000010000000000001000000000000000039 -:109620000000000007008200000000E007000000CA -:10963000000000E007000000000000000000000043 -:10964000810000E0070041820000000000000000EF -:10965000000000E000000000000000E00000410009 -:10966000000000000000070088000000000000006B +:10960000C00004118840A000040004020800040007 +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000000000003A +:10963000480000E007000000000A000007000000EA +:10964000000000000700000000810000070000008B +:10965000000000000000000000000000000000000A +:1096600000000000000000000000000000000000FA :1096700000000000000000000000000000000000EA -:1096800000000081000007000000000000E007006B -:109690000000810000E000000000000000E0000089 -:1096A00000000000000028EBEBEBFFF0AAAA50142A -:1096B000FABEA03CAF3C0C0FFCFF00000000000015 -:1096C000000000000000AA0000540000000000009C -:1096D0000000000000000000000000000000C3FFC8 -:1096E000E8E80000C1C100C17D0D000000000000DD +:109680000000000000000000000000420000070091 +:1096900000000000000000000000000000E00000EA +:1096A00000000000000000000000000000000000BA +:1096B000000080809000000000000000000000001A +:1096C0000000000000000A003C3E00000000000016 +:1096D000000000000000000000000000000000008A +:1096E000000000000000000000000000000000007A :1096F000000000000000000000000000000000006A -:109700000000000000F00CFC0F0FFFFF0000000045 +:109700000000000000820A090000002C282A28AA74 :109710000000000000000000000000000000000049 -:10972000000000000000000028EB282800F0AAAA92 -:109730005014FABEA03CAF3C0C00FCF0000000004E -:109740000000000002000000AA000040000000002D +:109720000000000000000000000000000000000039 +:109730000000000090909000000000000000000079 +:1097400000000000000000000000383C00000000A5 :109750000000000000000000000000000000000009 -:10976000003CE8E80000F5F500F57D0D7D0D0000FA +:1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 -:1097800000000000000000F00CFC000000000000E1 +:1097800000000000000000000A0A0000003C000089 :1097900000000000000000000000000000000000C9 -:1097A0000000000000000F0F3C3CFDC1FDC1FF00A8 -:1097B000FF00FFCFF0C03C5F3C50AF05AF0500009D -:1097C0000000000000003C3C5F5F0F031414000029 +:1097A00000000000000000000000000000000000B9 +:1097B000000000000000FF5E5E5E000000003CF064 +:1097C000BE000000000000000000000000000000DB :1097D0000000000000000000000000000000000089 -:1097E00000005454550000003C3C3C3C0000D7C3F2 +:1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 -:109800000000000000000000FF55BE140000000032 -:109810000000000000000000000000000000000048 -:1098200000000000000000000F0F55553D013D01F4 -:109830003C3C55553F0F30003C5F3C50AFAF0505F9 -:1098400000000000000000003C3C000A0C00141462 +:1098000000000000000000000400000000C300F39E +:10981000C3C3F0F0141414140000505000000000F2 +:109820000000000000000000000000000000000038 +:109830000000000000000000FF14141400000000ED +:10984000BE00BE000000000000000000000000009C :109850000000000000000000000000000000000008 -:10986000000000000404550000003D3CFFFF000024 -:10987000C3C3000000000000000000000000000062 -:1098800000000000000000000000FF55FF55000030 -:1098900000000000000000000000000000000000C8 -:1098A000000000000000000000000061000E000D3C -:1098B00000000061000F000D00000061000F000DAE -:1098C000000000000000000000008061000EC09D4C -:1098D0000005000000000000000000610001000120 -:1098E000000000610007000D00000000006100069C -:1098F000001D000000610006000D000000000000D7 -:1099000000000000000000000000000000610036C0 -:10991000000D000000610006000900A000610006C3 -:10992000C009000000610007000D000000F0553C78 -:10993000AA00AA00AAF0C30000B20000AA00C3F067 -:109940003F0FFAFA000000000000000000000000D5 -:10995000000000000000000000000000FFAA5F0AF5 -:1099600083BF83BFFF00FF008080B0B00000000015 -:10997000000000000000000000007D690000000001 -:109980000000000000000000000000000000F0F0F7 -:109990003CFF083F00FF0000000008080F0F000018 -:1099A00000000080FFFF00000000003CC0C0FFF08E -:1099B000553C00C000FCAAF0C3FF00B2FF00AAFFA4 -:1099C000C3F0FFCFFAFA0000000000000000000022 -:1099D0000000000000000000000000000000550032 -:1099E0005F0A80BC80BC1F00140000F000F0000083 -:1099F000000000000000000800000000FFEB000075 +:1098600000000000000000000000000000000000F8 +:1098700000000000000000000000000000000000E8 +:10988000000000000000000000000000000000C315 +:1098900000F7C3C3F0F0141414143030505000001B +:1098A0000000000000000000000000610006000D44 +:1098B00000000000000000000000006100068009B8 +:1098C00000000000002000000000000000080090E0 +:1098D000000000000020000000A0000000000000C8 +:1098E000000000610006000D000000000000000004 +:1098F0000000000000000000000000000061000601 +:10990000000D00000000000000000000A0000000AA +:1099100000100000000000200000000000005000C7 +:1099200000000000006100070009000004000000C2 +:109930000000000000000000000000000000000027 +:10994000A0A043FF00000000000000000000000095 +:109950000000000000000000000000000000000007 +:10996000000000000000000000000C0000000000EB +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A000000000000000000000003A003A00000043 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000043FF0000000000000000000055 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000000000000000067 :109A00000000000000000000000000000000000056 -:109A100030303C1408FF00FF000000005D5D5F5F18 -:109A2000000000000000FF7F00000000003CC0C0FC -:109A300000000000FFFF53FF00000000000FEB00DC -:109A400000000000FFC3F0FF000000000000000065 -:109A5000000000000000FFFF000000000000000008 -:109A60005555FF0082BE82BE000000000CFCAFAF67 -:109A7000000000000000F0FAFCFE00000000000002 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000A00FA0032 +:109A300000F70F0F00000000000000000000000011 +:109A40000055105100000000000000000000000060 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 -:109A9000000000000000FF00FF00000000000000C8 -:109AA0000000000000003030B2B2000000000000F2 -:109AB000000000000000FF0053FF00000000000F46 -:109AC000280000000000FF55F0FF0000000000002B -:109AD00000000000000000A0BEBE0000000000006A -:109AE000000055550F0F003CC3FF000000000CFCA8 -:109AF000A0A0000000000000000000000000000026 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000F000F4000000000061 -:109B20000000000000000000F0F0F0F00000000075 -:109B300000000000200000000000020020000000E3 -:109B40000000200000002000000000802000000035 -:109B500000002000200000000000200000000000A5 -:109B600000002000400020000000880020000000CD -:109B7000000084000003000000400000000002001C -:109B800000000180000020000000400288800000EA -:109B9000010000800180010001000000018001003F -:109BA00000000000000000000000000000000000B5 -:109BB000000000000000C0000000000000000000E5 -:109BC0000000000000000000000000000004000091 -:109BD0000000000000004000000000000000000045 -:109BE0000000000002000000000000000000000073 -:109BF0000000000010000000400011010000000003 -:109C000000004040400200004000000080010020B1 -:109C10004000040221200820040004000000040881 -:109C200008000000000000000000000040000000EC -:109C300000000000000000000000004000000000E4 -:109C40000000000000000000000000000100000013 -:109C500000000000010900000000000000000000FA -:109C600000410000001000000000000000000000A3 -:109C700008000100000000000000000001080000D2 -:109C800000850000000090400000000000000080FF -:109C9000000000000000000000050021400002005C -:109CA00000400809082000098840080082000009D7 -:109CB000820802080000000000000000000100000F -:109CC0000000000000000000000000000000200074 -:109CD0000000008400002088000000000204000052 -:109CE000000000C0000000000000000000000008AC -:109CF00000000000200000820000000000004088FA -:109D000002000020008800820084000000000000A3 -:109D100000020008000000000500008400008040F0 -:109D20000000110000000089000000000088000011 -:109D300000080010000000000004001000050041B1 -:109D400000410000004100000000004000A1008030 -:109D500000850000000000050041000000050041F2 -:109D600000000000000800080000000500000021BD -:109D7000000000080000000400840008000000004B -:109D800000410000000400001008008200000000F4 -:109D9000000200000021000000000008000900216E -:109DA00000020003004100000000000900880021BB -:109DB0000000000000210000000000410000000041 -:109DC0000000000000C0000800C000C00085004086 -:109DD0000040004000000000008408C00084000033 -:109DE000000000000008000000000000000000006B -:109DF00000000000000000000001000500820000DB -:109E0000000000840088009100C08003000300006F -:109E10000000000000000000080000000000030037 -:109E200000080000000000000800000000000320FF -:109E3000000000000000080000A0000000820000F8 -:109E40008280000000800800000000000000000088 -:109E50000000000000000000000000002008008456 -:109E6000C000000920C1400008000200820000007C -:109E700084002000000000008200000000A1080013 -:109E800000008200890084094000010201000040B6 -:109E900008020202009185024041000000000021FA -:109EA0000800000240400000002100110000008076 -:109EB00000000000820008090800000900000011ED -:109EC00000000040008400400082000800A0000064 -:109ED00000000000000000000000004040004000C2 -:109EE0000041000011C000048084000480000002D2 -:109EF00000A0030000A000000200000000000020FD -:109F000002000000000008900088400010001000CF -:109F1000410040858009000420858088008400007D -:109F20000090000820008000030000A02000000036 -:109F30000020000000C0000800900000008800C061 -:109F4000000000900000A0408200208088000000F7 -:109F50000040000000A10100008801400003202112 -:109F60002000000000059002008200210241000054 -:109F70000200020000850105C080C08504200000A9 -:109F8000010001A000000804000400040404000013 -:109F900040884002001182090402400808C14000C4 -:109FA0000040000000000000000000100000002041 -:109FB0000009000000000021000000000041A0088E -:109FC00000000000000000C00009000083040082BF -:109FD000028400A1000000400200004002010000D5 -:109FE000800000000000001000081104000880003C -:109FF000000080008000004002000040004080839C -:10A00000000004A004050000009111A100898891BE -:10A010000000800880010000000080008000000433 -:10A020000000000000000000000000000000000030 -:10A030000001000000000000050000000000080012 -:10A0400000000000000000002021210920218240A2 -:10A0500000400040400440000021000900050009C4 -:10A0600001A101050085002101850188210401C0AD -:10A0700000410000000800210003C003C0000009E7 -:10A080002004042000000004000000000082000002 -:10A0900000000040008800A002000000081100211C -:10A0A00000210000C009C0080003002100000000DA -:10A0B000000000110003000800000800000000007C -:10A0C000000090000000200000008000A008830035 -:10A0D00000010001000121000500000000C000088F -:10A0E000000020400284204000000204020402001C -:10A0F00020400008000000080000000000000000F0 -:10A100000000800180A100000001000000840040E8 -:10A11000000000001188000902034084410000A0F3 -:10A12000008211A0000000000000000000000500F7 -:10A13000000041000008000011040000000000823F -:10A14000000000A0000000000000000402C0024067 -:10A150000002820100C002040040820000C00182AF -:10A160001008C00841C00101C109000201C001027C -:10A170004084900000C000020004101000C0008263 -:10A180000040A0A0C0014021A120C011000001A1F9 -:10A190000482858200830000880188010000C1A03C -:10A1A0000102008402400000040000000000C11011 -:10A1B00008A000A040A00000000000000000000077 -:10A1C000000000000000000000000000000085808A -:10A1D000890404098008408080800080800000910C -:10A1E0001004009000C09188100284890000118042 -:10A1F000108084000000008000000080008000804B -:10A2000000800000000080020040020000A000006A -:10A2100011902109C08000211140A11000400009C7 -:10A220009182210902C000000000800000000000AF -:10A230008202808500410000000000000000000054 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB000000000FF000000000000000000000000A7 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B0000000000005FFFF7F7000000000000000009 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B3000000000000000200084000000000000047D +:109B40000004202020002100000000800000888008 +:109B500002030200000088002000880001000000CD +:109B60000080208000000000840802040002000041 +:109B700000002000000300008800200020000000FA +:109B80000000000002080000020002008405000836 +:109B90000008000088000000000088002010000875 +:109BA000038088042004000020000000000800104A +:109BB000C01088102000000000000000000000001D +:109BC0000001000100010000040000000920000065 +:109BD0000010800080004000000000040000200011 +:109BE00000000004000200000000000000900000DF +:109BF000000000000000000040000000000800001D +:109C0000400000000002040000000000000000000E +:109C100000C0000000000000000000000000000084 +:109C20000000080221C10085008200000000000041 +:109C300000020000000000000000012000400000C1 +:109C4000008004000000000001020800000020085D +:109C50000000000000000000000000000000000004 +:109C600000000000001000000000000002000000E2 +:109C700000000000000000000000000000000200E2 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000020000000000000A4 +:109CA000000000000000020320100000000000007F +:109CB000000000000000000010000000040100018E +:109CC0000000000402A0020002004001008200081F +:109CD00080010200000002000000000000000200FD +:109CE0000000000010000000000000000000000262 +:109CF0000040000002080000000000000000020018 +:109D000000000208000000820000000000000000C7 +:109D100000040000000000400000000100000000FE +:109D20000004028202000508000080080000020012 +:109D300000000400001000100000001004000000EB +:109D40000000010000800080000001850810002054 +:109D5000000220040800000088000000000000004D +:109D600004000000000000080000000508000400D6 +:109D700004000400040000020000000200000000D3 +:109D800000000000000000000000000000000400CF +:109D900000000000000000000000000000000000C3 +:109DA0000000000000080000021008000021000070 +:109DB00000000000000000200009000800404000F2 +:109DC000000000004000400421080088200400003A +:109DD00000010001800480900008000000000000E5 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E0000000000000000000000000000000003004F +:109E10000000000000000000000011000000080821 +:109E20000000080000000000008480918090000085 +:109E30000000000000000000000000000000001012 +:109E4000080040004000842021801180210001A0F2 +:109E5000000041200000A088080000000000000071 +:109E600000000000000000000000000000002000D2 +:109E70000000080000000000000000000800820050 +:109E80000000000000000000000000000000820050 +:109E9000080000000000080000001000000008009A +:109EA0000000000000000000000000000802A021E7 +:109EB00004800000100000000000900082040004F4 +:109EC000820080008084888405C1A0049004A000E2 +:109ED00020050000A001210000200000000000007B +:109EE00000000000000000000000000000004190A1 +:109EF00080000000410000000000000000000000A1 +:109F00000000000000000000410000001088210057 +:109F10000000001000000000000000000000000031 +:109F200080000000000000000000000003A0808509 +:109F300000000004000000C000000000000000005D +:109F40002000000000001000001004004003A100E9 +:109F5000C004A0000100C0000000000810030000C1 +:109F600000000000000500000000C0080000A00084 +:109F7000C0000000000000000000004100000000E0 +:109F80000000400000000000000000000000000091 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000030000000000020000AC +:109FB0000000004101C00000000008000000000097 +:109FC00082000000100000000000000080820000FD +:109FD00020000001110040884000000840090000F6 +:109FE0000000000011000000000000000000000060 +:109FF0000000000000000000000000080000000059 +:10A0000008000000800000000000000000000000C8 +:10A010000000000800000000000000020000000234 +:10A020000000000000000000000011000084000299 +:10A0300000000008030020410008000000000800A4 +:10A040000000050000000008080004000000840073 +:10A05000C000A0088404040500000100000000887E +:10A0600000000021000000210000080000000000A6 +:10A07000000300000000000000000000000000409D +:10A0800000000000000000000000000008000000C8 +:10A0900000000000000000000000000000000000C0 +:10A0A0000000000000000000000000410000084027 +:10A0B00000030000008000080080004000410020F4 +:10A0C00000210000000020000000000080000000CF +:10A0D000000000C021050001110021002000210026 +:10A0E000022003000000090008000000000000003A +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000110000000000000000003E +:10A11000000000000000000000000000000000003F +:10A120000000080000000000000000000000000027 +:10A13000000000000000001000000004000000C04B +:10A1400000000000200441000900000410400090BD +:10A1500000A0A00801008501840000010883899007 +:10A160000403908900400082008800200000000065 +:10A170000000000000000100880000000000000056 +:10A1800000000000000000000000000000000000CF +:10A1900000000000000000000000000000000000BF +:10A1A000000000000000C0000000000008000000E7 +:10A1B000000000000000C0C00120080408020000E8 +:10A1C000000000000000000000000000000080000F +:10A1D0000080008080801104090280410020000876 +:10A1E000038900888090000000000000000000004B +:10A1F000000000000000000041000300000000001B +:10A20000000000000000000000000000000000004E +:10A21000000000000000000000000000000000003E +:10A22000000000000000000080000000000080002E +:10A23000000000000000000090800380000080000B :10A24000000000000000000000000000000000000E -:10A250000900410284889010800080000080808086 -:10A260000980210208058410090002218211901141 -:10A27000080404108209800080000004008080002F -:10A280000000000000008000020020050380A020E4 -:10A2900000000584A040040282411000110011005A -:10A2A00041038211044008A010208000000000003B -:10A2B00000800000002180800003000000A000005A -:10A2C000000000000000000000000000000000008E -:10A2D0000000000202000441C100080082000010DA -:10A2E000C00400400300A1C0C00011000100110122 -:10A2F000C100910100011000C0000800040000101E -:10A30000C0000000C000A0C0C0C0030021000010B9 -:10A3100083010000A0C111000105C183008200007B -:10A320000000010188200200094190A10200109064 -:10A330000000008240408801A004000100000010DD -:10A340000000000400000000000000000000000009 -:10A350000000000002030100010302C108080040E0 -:10A360000408C0C0A0020040820801C0880800891B -:10A37000010903C008082088008502C104040040C8 -:10A38000020400C0A0400004404000C002010020C0 -:10A3900001204011000082008500020191000001AF -:10A3A000010084000101020005020101C0890000D2 -:10A3B0000000020000002008008800880002000061 -:10A3C000000002000000000000000000000000008B -:10A3D00000000000000000101004050891C08080FB -:10A3E0000080808080800004118203A002850080AC -:10A3F00021020282919080848004002189A00000C3 -:10A4000000800080008000800000800000808002CA -:10A410000540054184A000008041400480212002C5 -:10A4200000200321031102410008404021210904BA -:10A4300020000000800000000080110020000000CB -:10A440000400000000000000000000000000000008 -:10A4500000000000000000008802848000004040EE -:10A460008005808080800000A10282899180100395 -:10A470008810828982800911801080800000000885 -:10A48000801180808080000080200000000000009B -:10A490000204094005914140000021091005910086 -:10A4A0000202214009414000081003001000020090 -:10A4B00090100011008800000000C10821900200E7 -:10A4C0000300000000080000000000000000000081 -:10A4D00000000000000000000000C1012002020294 -:10A4E0000101C000200208084000C10520820808C0 -:10A4F0000101C000118309082100C0A010C084849C -:10A500008801C000082004040000C0014040A0A051 -:10A51000840021002020004004010000118202007C -:10A520008288020001830001000001002088C0022F -:10A53000892005000001002000020000A100C008E1 -:10A540000920850008000001880088000000000044 -:10A55000000000000000000000000000000000E01B -:10A56000000000000000000000000012000000E0F9 -:10A5700000000000000000E000000081000000E09A -:10A58000000041000000000000000000000000008A -:10A5900000000000000000E00700600000000081F3 -:10A5A00000E00700420A000000000700420000002F -:10A5B00000E0070088000000000007000000000025 -:10A5C00000E007004200000000000700000000005B -:10A5D0000000000000000000000000000000999949 -:10A5E000FFFF81C3FFFF4BDBFFFF03C3FFFF00FF44 -:10A5F000FFFF0CCFFFFFC30FFFFF8DCFFFFFC30F88 -:10A60000FFFF03C3FFFF9999FFFF0CCFFFFF939F4D -:10A61000FFFFC3C3FFFF3C3CFF66F6FFF6F0000000 -:10A62000C3580058000000000000000000000000B7 -:10A630000000080CFFFF09090000000000000000F6 -:10A6400000000000008D00FFCCCCC0C00000000066 +:10A25000088080118280A0A1910009000800A0035D +:10A260000300A18090008380000000400080000077 +:10A27000000000000000000000400000004000005E +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000000000000BE +:10A2A00000000000000000000000800000008000AE +:10A2B000800000000000000000000000210091006C +:10A2C0000088000000000000000000000000000006 +:10A2D000000002109001A08490910482010083008C +:10A2E00091A190200504A1009188000000000010B9 +:10A2F000000000000000000000000000000000015D +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000080088009D +:10A33000A00090000000000000000000C090A100FC +:10A340000900A088000000000000000000000000DC +:10A3500000000000008800100085000200000101DC +:10A360000001010140020088029008014000000045 +:10A370004000820000000000000000000000880093 +:10A3800000010000000000000000000000010000CB +:10A3900000010000000000000000000000000000BC +:10A3A000000000000000000000000000000000109D +:10A3B000000200400002000000000000000088C011 +:10A3C0000002001021C10000000000000000000099 +:10A3D0000000000000000000000000A108100004C0 +:10A3E00008080005114180C01140900880118000CC +:10A3F000000000000000000000000000000000005D +:10A400000002002003020000000000000000002005 +:10A41000001000100010000000000000000000000C +:10A42000000000000000000000000000000000002C +:10A43000008000000000000000000000000000009C +:10A4400000080010000009110000000000000000DA +:10A4500000000000000000000802008010008908D1 +:10A460000404081103000811C188101141000303FE +:10A4700080000000000080000000000000000000DC +:10A4800000000011000000000000000000000000BB +:10A4900000000000000000000000000000000000BC +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000080000000000000000000001C +:10A4C000000041002080100010000000000000008B +:10A4D0000000000000000000000009001010110240 +:10A4E0000800000501210190010103A0004100A026 +:10A4F0002100C0009000040088000000000000005F +:10A50000000000000001000000000000000000004A +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B +:10A53000000000000000001000000000000000000B +:10A5400000000000010200A0011001000000000056 +:10A55000000000000000000000000000008100007A +:10A5600007000000818100E007000000000000E01B +:10A5700007000000000000000000000000000000D4 +:10A5800000000000000000E000008100000000006A +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB +:10A5B0000000000000000000000007004200000052 +:10A5C000000000000000480000E0000084000000DF +:10A5D0000000000000000000000000000000C3C3F5 +:10A5E000C3C37E7E0E0000000000000000003C3C63 +:10A5F0000000242024200000F0D000000000000013 +:10A60000000000000000000000000000000000004A +:10A61000000000000000000000000000000000003A +:10A62000000000000000000000000000000000002A +:10A630000000000000000000000000000C0C8D0C69 +:10A640000000000000000000000000004206DB06E1 :10A6500000000000000000000000000000000000FA -:10A660000FFFFFFFBDFFFFFF4BDBFFFF3FFFFFFFC4 -:10A670009F9FFFFFCFCFFFFFC3FFFFFF8DCFFFFFE8 -:10A68000C3FFFFFF3FFFFFFF0FFFFFFFCFCFFFFF26 -:10A69000939FFFFF0FFFFFFF3C3C0066060F060085 -:10A6A0000000C34000400000000000000000000067 -:10A6B00000000000090F0000000000000000000082 -:10A6C0000000EF6FFFFF000000000C0C0000000016 -:10A6D000000000000000000000000000000000007A +:10A6600006660060FFFF0F00000000000000000011 +:10A670003C3C0000202020203C3CF0D000000000AA +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000000AA +:10A6B00000000000000000000000000000000C0C82 +:10A6C0008DCF000000000000000000000000429F4D +:10A6D000DB9F000000000000000000000000000000 :10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A :10A700000000000000000000000000000000000049 @@ -141975,494 +141975,494 @@ :10A730000000000000000000000000000000000019 :10A740000000000000000000000000000000000009 :10A7500000000000000000000000000000000000F9 -:10A7600000000000FFFF9999FFFFF909FFFFF0F0DB -:10A77000FFFFB1B1FFFFFCC0FFFFF909FFFFC1C13F -:10A78000FFFF99C3FFFFFF00FFFF99C3FFFFFF001B -:10A79000FFFFC9C9FFFFC3C000000F0F3F663F6640 -:10A7A0001F1F7F7F00000222C3E30C0C3C3C000013 -:10A7B000000000000000F044F0440CFC0CFD000020 -:10A7C000000030303030FF003000BD24BD240000D8 -:10A7D0000000000000000000000000000000000079 -:10A7E000000000000000FFFFFFF0FFFFF9F9FFFF8E -:10A7F000FF99FFFFF3F3FFFFFFC3FFFFF9F9FFFF2F -:10A80000FDFDFFFFFFC3FFFFF9F9FFFFFFC3FFFFE0 -:10A81000F3F3FFFFF9F9FFFFFFFC0000006630666D -:10A8200030661010707000000020C3E30C0C0000B4 -:10A830000000000000000000FFFF0000FCFCFDFD28 -:10A840000000000006060606FF00FF00BD2DBD2D1E -:10A8500000000000000000000000000000000000F8 -:10A86000000000000000000040E38001002192028F -:10A87000408280000020920240E380060021920284 -:10A8800040E380010021920240E38007002D920204 -:10A8900040828000002092024082800000208A02D4 -:10A8A0000061000900010000000000610037000D98 -:10A8B00000080061000E050D000000610007001D8A -:10A8C000000005000A08050000A000410006000D78 -:10A8D000000005000A08050000A0000000000000BC -:10A8E00000000000000000000000FFD7FF140CFC77 -:10A8F0000FFF000000000000000051F30000820084 -:10A90000C2C0FFFCFF0C0F0AFFFA0000000000F0BD -:10A91000E0F0000000000000000000000000000067 -:10A9200000003C3C0F0F82BEC0FC00000000000095 -:10A93000EFE0AFA083AF0000550001000000000071 -:10A94000000000000000000000000000AAAA555707 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000D70014FC -:10A970000CFC00F0000000000000000055FF00008B -:10A98000C3C3C3C300FC000C000AF0FA00000000BF -:10A9900000F020F0000000000000000000000000B7 -:10A9A000000000003C3CFF0082BEC0FC0000B2FF83 -:10A9B0000000EFE0FFF083AF83AF000001003C5FD9 -:10A9C00000000F03FFC300000000000000000000B3 -:10A9D00000FF000000000000000000000000000078 -:10A9E00000000000000000000000000000003C5FCC -:10A9F0003C5F28F07DF00000000000000000000037 -:10AA0000A8FC00C30028550F550FA0ACAFAC000048 -:10AA100000003A003A0000000000000000000000C2 -:10AA2000000000000000FFFFD714E8E828EB00005A -:10AA30003CFF28AA50FABEBEF5FDA5ADC3C300A0D9 -:10AA40000000A0F000000000000000000000000076 -:10AA5000000000FA000000000000000000000000FC +:10A760000000000000CFFFFFF4F4F7FF000000003E +:10A77000663CFF3C00DB00DB66F6BDFD0000000030 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000B080BF8F0000000000000000C0FF4C +:10A7D0000000F6F69090000000000000000000006D +:10A7E00000000000000000CFFFFF0000000000009C +:10A7F0000000003C993C409B00DB00F03CFC8000EA +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A8400000000000B080BF8F00000000000000008A +:10A85000C0996666DB42DB42000000000000000099 +:10A86000000000000000000080610036000D0000C4 +:10A87000006100208000000000610E04000900005B +:10A88000A0004000000000000000000000000000E8 +:10A8900000610007000D0000000000000000000043 +:10A8A00000610006000D0000000000000000000034 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D000000000615006C0010001000000000000FF +:10A8E000000000000000000000000505080800FF4F +:10A8F000000035053707EBAAF0AA0F3C050500AAB2 +:10A900003C7D00000000000000000000000000008E +:10A9100000000000000000500505000000000000DD +:10A92000000000000000CFCFFFF00000000000009A +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A950000000000000004100F0F0FFFF00000000D8 +:10A9600000000000000000000000000005050505D3 +:10A9700000FF000005050F0F00F0F0AA0F3C0505D1 +:10A98000F0FAFCFD000000000000000000000000E4 +:10A990000000000000000000005000000000000067 +:10A9A0000000000000000000CFCFFFF0000000001A +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D00000000000000001009600B0B0BFBF000002 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000410000005C0C5C0F00803CBC5FFF6D +:10AA000000007CFEFCFC00000000000000000000D4 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA5000000000000000000000000000F0FFF0FF18 :10AA600000000000000000000000000000000000E6 -:10AA70003C503C5028F07DF0000000000000000039 -:10AA8000A8FCA8FC0F0F0F0F55FF5500A0ACAFACF2 +:10AA700000000000410000005C0C5C0F1C9C3CBC12 +:10AA8000D7D700007CFEFEFE0000000000000000A2 :10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000D714E8E828EBD8 -:10AAB00000003CFF28AA50FA1414F7FFA7AF80004B -:10AAC00000A00000AAFF100000000000000000002D -:10AAD00000000000FAFA0000000000000000000082 -:10AAE0000000000000000000000000000000000066 -:10AAF00000002000000008008480200020000000EA -:10AB00000000000000000000040020000200880097 -:10AB10002003200000001010200000002000000092 -:10AB200040000000000000000000200000000000C5 -:10AB3000002100030000000000002002009010002F -:10AB40000180000000800000000000800000000084 -:10AB500000040080010000050000208001100000BA -:10AB6000000000000010000000000188000000004C -:10AB700000000000800000008000001000000000C5 -:10AB80000000000040000000000000000000800005 -:10AB900000000000000000000000000000020000B3 -:10ABA0000000000040000000000000004000000025 -:10ABB0000000000000000000000021020000400929 -:10ABC00080004002000040080084000000044000B3 -:10ABD0000000000100021000000010C00008020088 -:10ABE00000000000000000004000000008400000DD -:10ABF0000000000000000000000000000000000055 -:10AC0000000000000000000000050000000000003F -:10AC10000100A0000000000500000000000002008C -:10AC2000010000000000000008000000000000001B -:10AC300000000000000000000200020000200410DC -:10AC400000000088098200000200000000000000EF -:10AC50000200400020000000000204050002041071 -:10AC6000910840400800200008408200084002008F -:10AC70000000820008000800000000C000840000FE -:10AC800000000000000000000000000000100000B4 -:10AC90000000080000000000000802000010001082 -:10ACA0000000400000000000000000000000000064 -:10ACB00000000088000000000000881088100011CB -:10ACC0008008009000218221000000100408000884 -:10ACD0000000800080008000000000018800100952 -:10ACE000828440088000800080000008028880097B -:10ACF00080C00040000000000000000800000000CC -:10AD00002108000000000000000000000021820275 -:10AD10000021010000000000008000000088000801 -:10AD200000100005004100050000000800100000B0 -:10AD300000050000002100000000000000000000ED -:10AD40000808004121000021010008200000000047 -:10AD50000000000800020121000000000021002185 -:10AD6000000000030002004100000000001000107D -:10AD700000000010000000000000000000C00010F3 -:10AD800000008210000000000382000000000000AC -:10AD900000000000200000080082000400A0000461 -:10ADA0000000000808080084008400000000030080 -:10ADB00003C00000000000000800000000000000C8 -:10ADC000000000080000828403824000034141002B -:10ADD00000A0000000A0410008A00410051000849D -:10ADE00003000000009003000010000000000001BC -:10ADF0000001000000000000000041000000000011 -:10AE000000008800000000000000C00000000000FA -:10AE100000000000000000000000020001800000AF -:10AE2000400002000000000000008200000004005A -:10AE300000000000080000000800200040000000A2 -:10AE400000000000C000A008088009000000080001 -:10AE500000000400040000008200820000100000D6 -:10AE600020830002014004080000001000050004D7 -:10AE70000011014100208390000000000005004007 -:10AE800000080000000000040000000000000000B6 -:10AE9000000000000000000000000000C1002020B1 -:10AEA000000000A008000008000041C000000000F1 -:10AEB0000000000000000000000000000000800012 -:10AEC0000000030000000800400089208800000006 -:10AED000800009C080021184402000000000200191 -:10AEE00000000008000140108084000000100240B3 -:10AEF00000100904080000000420090000000004FC -:10AF0000000801002080010409000000000000008A -:10AF1000000001000021000090000000008000A05F -:10AF2000000001C100A0218021800008000800006D -:10AF300000000000000800080003000000000041BD -:10AF400008000000000000050000000004000800E8 -:10AF5000A0000305008310050002044140004010DA -:10AF60000220404100100420000240050241000080 -:10AF70000405000400000041000804410000000036 -:10AF80000000004120088004200920080000000083 -:10AF9000000008004000000000A0000009020004BA -:10AFA0001105110004040020A020A02000000000D2 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000004000002008000384210869 -:10AFD00000000000C0C000080008210921408808C6 -:10AFE000800080008300000080A000C080048010EA -:10AFF0000000001000110000000000000000000030 -:10B00000000000000000000000000000000400003C -:10B0100000090009000000000000200000000000FE -:10B02000900000000000000401A190040408000842 -:10B0300000000008001100080010002100000000BE -:10B0400000000000022100000804880088000000C1 -:10B050000003014140004040008820050080C004FA -:10B060000800402120820800000800200010018410 -:10B07000001008004000204000000000000800050B -:10B08000001100000041000400000000000000006A -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000202009008000D7 -:10B0B0000000000800000000000000000000000088 -:10B0C0000000000000000000000000000000000080 -:10B0D0000000099008A08090C0010008C000000294 -:10B0E00000889082A1A08004A184008400A10301B3 -:10B0F00010200000000000000200002000000000FE -:10B100000000008400000000008404C000A000884B -:10B11000109000000000000000000000000100018D -:10B12000000190109102029084850108408200C1C4 -:10B13000A0830000820082000000000000000000E8 -:10B140000000000001000400000000008800000072 -:10B1500000008400C1C10102C040A0822111000989 -:10B1600088C0C08340A000011101040183020103D3 -:10B170009089901089000100A000C00110C000401B -:10B1800000040404000000000000000080800000B3 -:10B19000020000000000000000000000000000109D -:10B1A0000040004080828300858900402084A110F7 -:10B1B000040400880000040080000000000000007B -:10B1C00000000000000021000000000000008000DE -:10B1D000000000000000A1912041808400114090F7 -:10B1E000218200200008808011039111800889903D -:10B1F00010830088802089400304804100048080FF -:10B200000080008000800000000000000000800836 -:10B2100080008040000000000000000000000000EE -:10B22000000000000000910041918940008300006F -:10B230008410040220110200020004000521000015 -:10B24000000000000000020020004000400000005C -:10B25000800080008000808082000902A1A141005E -:10B26000000089112080C108C1802100099189A1B5 -:10B27000A00085038591C1890280A100800084041B -:10B280000000800080A1000000000000000000001D -:10B29000100108000800100000000000000000007D -:10B2A000000000000000000008049009A085A0092B -:10B2B00004882000A1C1010000100100000000016D -:10B2C000000000000000000000000000000001007D -:10B2D0000000080010008400C09090000008A1A1A8 -:10B2E0008388C008020483A005018808010000913A -:10B2F00005050290200005840589018811000800D9 -:10B3000009848200100008A184C000000000000031 -:10B310000000A082020400880282000000000000F9 -:10B32000000000000000000000000001002002C03A -:10B330001010C08201830083000800000000040197 -:10B3400000000000000000000000000100010001FA -:10B350000001000000100008009000C000C10021A2 -:10B36000059185C1C0030102C084C0100010000215 -:10B370000010A1C0A0850020021002C000410340BF -:10B38000848501C10410000400029108000000003F -:10B3900000000000000000000000828000000000AB -:10B3A0000000000000000000410000000220119198 -:10B3B00041091000008420030004028400410002BF -:10B3C00080210010000000000000000000100008B4 -:10B3D0000021001000000000000000800080100824 -:10B3E000054021A104C1000210210491888000823F -:10B3F00009901190A18000900341C12085900082A6 -:10B400008920802121910000000000800980000037 -:10B41000000000000000000000210000000000000B -:10B42000000000000000000400000000000008917F -:10B43000910409840008408011050400000911806E -:10B440004000110011100000000000000000090081 -:10B45000040011000240000000000009008000000C -:10B460008084004000000004218902849000900242 -:10B47000C180080088000991C189A00008004141ED -:10B480002084040002802140800900850080800023 -:10B49000000000000000000000000005008800001F -:10B4A000000000000000000000000000000000009C -:10B4B00001419005C0841001A1C0828283820000F6 -:10B4C00000C00100000000000000000000000000BB -:10B4D000008200000000010000000000000900825E -:10B4E0000000C0C0820090000400C14140038340BE -:10B4F000A001C1C0010008888804058982A010103D -:10B50000840001A000C00110010002009020888486 -:10B5100004000000000000000000000000E0000047 -:10B52000000000000000000000000000000000001B -:10B530000000000000E007000000000000E007003D -:10B540004200000000000000600000000000000059 -:10B5500000000000000000000000000000000000EB -:10B5600007000000810000E007005021000000E01B -:10B570000700000A000000E000008400820000E0F4 -:10B5800007000000818100E00700000000000000CB -:10B5900007000000000000000000000000000000A4 -:10B5A0000C0A0C0A0000000000000000000000006F -:10B5B00000000000080A080AAA00F0000AFFFAFFCB -:10B5C0000C0FFCFF00000000000000000000000065 -:10B5D000000000000000000000000000000000006B -:10B5E00000000A0AC0CF80C0828200000000000074 -:10B5F000F0F00000AF8340402828003000A07D7D9F -:10B600007D0DEAAAC0C000000000AAFF2020008033 -:10B610000000000008000000000000000000000022 -:10B6200000000000F0F0000000000000000000003A -:10B6300000000000000000020002000000000A00FC -:10B64000FA000C00FCF00000000000000000000008 -:10B6500000000000000000000000000000000000EA -:10B6600000000000FAFAC0CF00C0828280A8C3C3E5 -:10B67000FF7DFF7DAF83AF8340402828003000006E -:10B68000FFFFFF0F0000C0C000000000AA00202044 -:10B69000008000000000000000000000000000002A -:10B6A000F5F503F300AA14140000000000000000E8 -:10B6B0000000000000000000001C000855045504B4 -:10B6C000FF3F003F1E1E1E1E000000000000000085 -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000FA50EBEB0A010C00000023 -:10B6F0003C00000000003C3C3C3C555500003C3CFC -:10B700000000A0F5A0A0FCA0AAA00000000000007E -:10B710000000000000005F5FFF3C00000000000030 -:10B720000000050503F300AA050500000000000065 -:10B7300000000000000000000000001C000855147C -:10B740005500FF030003BE14BE14000000000000FB -:10B7500000000000000000000000000000000000E9 -:10B760000000000000000000FA5041410A010C00F6 -:10B7700000003C00FFFF20001C0C14005555000089 -:10B7800000000000B4F5B4B4282028200000000018 -:10B790000005000003000505FF3CFF3C0000000021 -:10B7A0000000000000615007000D000000000000D4 -:10B7B0000000000000610006000D000085610A091C -:10B7C000050100A100610009000100000061000600 -:10B7D000000D0000000000000000000000610006F5 -:10B7E000000D000000000000000000400008A561FE -:10B7F0005A0AC59D00A000610E0400090000A06166 -:10B8000000060095000080400006C09D0000006119 -:10B810000036C049000180005008000000A0000070 -:10B820000000000000000000000000000000000018 -:10B8300000000000000000000000000000005FFFAA -:10B8400050F03AFF3AFFFFF0AFA0FC00FCFF000011 -:10B85000FFFFFFF0FBF0000000000000000030F0F0 -:10B860003CFF550045000000000000000000000003 -:10B8700000000000000400F03C3C3C3CF5B4F5B492 -:10B88000FA00C300DF00DF003CBECFCF00003C2841 -:10B8900000000000000F070F000000000000000083 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000F67 +:10AAE000000F000000000000000000000000000057 +:10AAF0000000008000000020400020802080000432 +:10AB000020040080C0802000200020008400000479 +:10AB100020040080880000802080200000000000C9 +:10AB20000008000000022000200041820283018012 +:10AB300040040003000020004000210488000000C1 +:10AB400084000000400000002000200008002000D9 +:10AB500000002000020020002004200020000083CC +:10AB60002003028840004000200388001000880075 +:10AB70001000040000204000000100000004000458 +:10AB8000000100010004000400040000100009009E +:10AB900000010001400400820004000400000000E5 +:10ABA0000000000000020000000000820804800491 +:10ABB0000804800100000000000080004000040044 +:10ABC0000000000000004100000800A0000080001C +:10ABD0000002000000000000000000000000100063 +:10ABE0000020000000112082800240000000900040 +:10ABF00000A08000A0000000080000050000040084 +:10AC000000000800900004000000000002000000A6 +:10AC10000000000000000000100000000000000024 +:10AC20000000000000000200000000000000000022 +:10AC300001000000000000000000000020000200F1 +:10AC40000000020000000000000000800000000082 +:10AC500000000000000002000109000000000500E3 +:10AC600000000180218009800000400000000000F9 +:10AC7000004000000100040000000000000000008F +:10AC8000800000000200000002000200000004003A +:10AC9000020002000000000000000000000000842C +:10ACA0000000000000000000000000080000000894 +:10ACB0000000080000000000000002000008800002 +:10ACC00000000084000000080004000000200000D4 +:10ACD00000100000000000000008080000840000D0 +:10ACE000A088000004208804900800008008000864 +:10ACF0000000200003004000008408000000002144 +:10AD00000000042000000000002100000000882155 +:10AD1000840000000000001000200000200000055A +:10AD2000000000000000000800000000000000001B +:10AD3000002100008400000000000000000000006E +:10AD400000000008000000050000000300030000F0 +:10AD50000000C0000003000000000000002100000F +:10AD6000002100000000002000000808000201820D +:10AD700000080000002000218200052000000000E3 +:10AD80000300000091010084000200C009000000DF +:10AD9000000041000000008400A1000100008000CC +:10ADA000008800000000000000000000000000001B +:10ADB0000000000000000000000000000000000093 +:10ADC000008400000084000000000000000000007B +:10ADD000211000000000000000A0000000A0000002 +:10ADE00000000200090000000001000080A1000135 +:10ADF00040030011000000840000030084010000F3 +:10AE0000050004000500000002000800000000002A +:10AE10001000008900000000000082000000C00552 +:10AE20000000000000000000840082000800820092 +:10AE3000080840000008080000800000080000002A +:10AE4000000083000000C108000000000000820034 +:10AE500000000400000000000800000000000000E6 +:10AE60000000A00002000400000002002111A00068 +:10AE7000000011050010080040040880000010A028 +:10AE80000800840080008400110080000000400061 +:10AE9000000000000004000000000084000000002A +:10AEA000000000000000008400000000000000001E +:10AEB0000000000000000000000008200000000862 +:10AEC0000000000040840000208400000000000416 +:10AED0000082000080080000000010000000000058 +:10AEE000000000000200A000000000008000A000A0 +:10AEF0002100000040100000000089000210000046 +:10AF0000112104000841822100410480200020001A +:10AF100020000000200010210000010008000004B3 +:10AF20000084000000000005000000000800000090 +:10AF30000000C000900000000000040000000000BD +:10AF4000820000000000000000000041080000082E +:10AF5000840000000000040004080000000000005D +:10AF60000000000808000000000020088200050022 +:10AF70000004900800009002841108000000000006 +:10AF800000000000800000102000000080208000F1 +:10AF900083A080A000008508048805080200030043 +:10AFA000000100210000000000000000000000007F +:10AFB0000088008400000000000000000000100075 +:10AFC0000000000000000000000000000000000081 +:10AFD00000000000000000008000000000000000F1 +:10AFE000000400000000800000100000800000004D +:10AFF0008210020120010000000100008900000011 +:10B00000000000100000A041000008000808200017 +:10B0100005000500100000000408002100000000E9 +:10B0200000040000002000200008000500000008C7 +:10B0300000000040000800000200000002210000A3 +:10B040000200000000000000002100050040000593 +:10B0500084008408000000080000000800000000D0 +:10B060000005C00500000000004100410000210073 +:10B0700000084020080000000000A140000000007F +:10B080000240020400000204000000C000000000B2 +:10B09000800084008400000011900008000000007F +:10B0A000000000000000000100000000000000009F +:10B0B0000000000000000000000000000000000090 +:10B0C00000000000000000840000000000000000FC +:10B0D0000000000000000000000000000000000070 +:10B0E000000000000000000000000000000000045C +:10B0F00004000000800180000500000040000900FD +:10B1000000A0098402900000028910100090004005 +:10B110000090400100900820C005918200080008BE +:10B1200090082000010008009000000000000000CE +:10B13000000000000000000000000000000000000F +:10B140000000030085081188049000000000010041 +:10B1500000000000000000000000000004200020AB +:10B1600000A04000000000000000000000000000FF +:10B1700088000000000000900000881000014001DD +:10B180000001000001A120840020002180800080B7 +:10B19000000000000011008380098088910000A158 +:10B1A00000020088000041008000800000000000D4 +:10B1B000040000000000000000000000000000008B +:10B1C0000000000088002080030080800000000054 +:10B1D00003004000000000000000000000008000AC +:10B1E000000000000000000000000000000000005F +:10B1F000100000000000000000800000808000417E +:10B200000021000300201141804000030083000062 +:10B21000004000008000000003031100A000800037 +:10B2200088C1918502A091009000820020800009D1 +:10B2300000000041000000000000000000000000CD +:10B2400000000000000000090005004180800000AF +:10B250001140050000031100000000000000000084 +:10B260008000008200800000000000040000000058 +:10B2700000000011000400809100A1110284050962 +:10B2800000008000800000000300C0001100C10029 +:10B2900008000000820090000020000101A0C0C052 +:10B2A000020002C0039082C108008300A1008490C4 +:10B2B000000000000001000000000000000000008D +:10B2C00000000000000000008400004000000802B0 +:10B2D00000000100000000000084000000000000E9 +:10B2E00000000800400500A0000000000001000070 +:10B2F00000000800040090000890880809091084E4 +:10B300009011829008000200880088000400030069 +:10B3100091000090004090408220020200000090C6 +:10B32000100905100182C002028400020084008519 +:10B330000085000010000000000000000000000078 +:10B3400000000000000000000000000002094000B2 +:10B350008409000000000800000100000000000057 +:10B3600000000000820200200002A0020000000095 +:10B370000000000000000000C001000100C00088C3 +:10B3800000820002000001000100000002004100F4 +:10B390008800110000000080800080008083204031 +:10B3A00000858011C1802080A0809100008000086D +:10B3B0000002001100000000000009000000000071 +:10B3C00000000000000000000000000020110088C4 +:10B3D0000009029100000000000900082009000097 +:10B3E000000000000000000000000000808000005D +:10B3F00000000000000000090010800400080000A8 +:10B40000000000801080000010001000000080008C +:10B4100091008800830080050020000080008305E3 +:10B420001100028011112004110502008510000096 +:10B43000008000000011000000000000000000007B +:10B44000000000000000000000000000000080007C +:10B4500080820080800000000400091103000909B7 +:10B46000000000000000000080000000008080005C +:10B470000000000000000000804080058080000087 +:10B48000410221839180880208094080058008805C +:10B4900000890021000000109000404002020200DC +:10B4A0009090C1000302000041A1418240828201CC +:10B4B0000000000400A000000000000000000000E8 +:10B4C000000000000000000000000000000000007C +:10B4D0009000080900900800000000000001010031 +:10B4E00000000000000000000000020020008802B0 +:10B4F000A00000000200400002004000080240825C +:10B500000400112008821002100000000020000238 +:10B510000008008500400040000100810000070095 +:10B520000000818100E007000012810000E00000BF +:10B530004842500A00E007005000000000E0000010 +:10B540000082000000000000000000000000000079 +:10B550000000000000E0070000000000000000E024 +:10B560000000000000000000000000000042000099 +:10B57000070000000000000000000000001100E0D3 +:10B5800007000041821100E00700000000000000F9 +:10B5900000000000480A00E007000000F0FCFFFC8B +:10B5A0007828787DF0F0AAAA0000FFFF00000000D4 +:10B5B0004010802000000000FF510000000000004B +:10B5C000000000000000000000000000000000007B +:10B5D00000000000FF3CC33C0F0FF5F50000000029 +:10B5E00000000000000000000000000000003C3CE3 +:10B5F000AAFF00005555CF3CCF3C00000000FCC323 +:10B60000FCFF000000000F0FAF8F000000000000E3 +:10B610000000000000000000000000000000000C1E +:10B620000F0C7828787D0000FFAA28EB28EB01009A +:10B6300000000104020800000000FF5500000000A7 +:10B6400000000000000000000000000000000000FA +:10B65000000000000000FFFFC3FFFFFFF5F5000042 +:10B6600000000000000000000000000000000000DA +:10B67000F0F0FAFF00000CFCCFFFCFFF000000004D +:10B6800000000000000000000000A080C3FFFCFCE0 +:10B6900000000000000000000000000000000000AA +:10B6A0005555FC0CFF00FF002D2D2D2D0000000036 +:10B6B0000410082024000024000000005C0C5E0E32 +:10B6C000000000000000000000000000000000007A +:10B6D0000000000000000000AFF3AFF35555EBEBA6 +:10B6E000000000000000000000000000000000005A +:10B6F0000000050F00000000000000000000000036 +:10B700000000000000004FFFEFFFFF3CFF3C000087 +:10B710000F0F00000000808A858FE800E8C3F0FF6B +:10B72000080C5555FC0CBEBE1414AF05AF05FFFF49 +:10B7300000000140028081000081000000000C0C2C +:10B740000F0F0000000000000000000000000000DB +:10B7500000000000000000000000AFF3AFF3FFFFA7 +:10B76000EBEB000000000000000000000000000003 +:10B7700000000000050F0F0F3030303000000000D7 +:10B7800000000000000000005FFFFFFFFF3CFF3CE7 +:10B7900000000F0D00000000D0DAD5DFE83CE8FF24 +:10B7A000F0F4080C00000020000000000061002000 +:10B7B000800112060061000080050800006100267B +:10B7C0008011000000610007000D00000000000073 +:10B7D00000000000000000000000000005610A0FEA +:10B7E000050D00A1000000610007000D0000000031 +:10B7F00000000000000000080E3000000000000003 +:10B8000000000000000080610036000901000041D6 +:10B810000E36C015000100610006000D0000006139 +:10B820000032800500000000000000000000171733 +:10B83000D714A0B4E1F53F3FFF0F00000000000067 +:10B840000000A0F5F5F50000000000000000000079 +:10B8500000000000000000000000000000000000E8 +:10B8600000005B0B510100003CF3FFF30F0FFFF0F2 +:10B8700000000000000000000000000000000000C8 +:10B88000000000000000000000000000FF3CFF2C52 +:10B890000F00F7F7000000000000FF7F000000002D :10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0005F0F50003A003A005F500F00C000C0FF09 -:10B8D0000000FFFBFFA5FFF50000000000000000D6 -:10B8E00030F03CFF000000000000000000000000FD -:10B8F000000000000000000000003D3CFFFF551468 -:10B900005514FF00C3000000000000AA0F0F300014 -:10B910003C2800000004000F050F0000000000009C +:10B8B0001717D714A0B4E1F53030F00000000000F5 +:10B8C00000000000A0A0F5A00000000000000000A3 +:10B8D0000000000000000000000000000000000068 +:10B8E00000000000FBABF1A100003CF3FFF3FFFF01 +:10B8F000FFF0000000000000000000000000000059 +:10B900000000000000000000000000000000FFFF39 +:10B91000FFAF0F000707000000000000FF7F0000DE :10B920000000000000000000000000000000000017 -:10B9300000000000000000000000C0F0C0F00000A7 -:10B940000000BFBFB0B0B4FFB4FF5F503F300FAADC -:10B95000FFAA000000007F007F050000000000003B -:10B960000000000000000000A2FF00000000000036 -:10B9700000000000DFFF080000200000C0C380823C -:10B9800050A000A000000000B2E2B2E300C000C579 -:10B990004343FF0001000000AAAAAAAA0000000079 -:10B9A0000000000000000000000000000000000097 -:10B9B000000000000000000000000000C3FFC3FF03 -:10B9C000000000001F1F1010B400B4005F503F3093 -:10B9D00000AAF0AA000000002F002F0500000000C0 -:10B9E0000000000000000000000020FF0000000038 -:10B9F000000000000000FFFF000000005555F0FFB0 -:10BA0000A0AA0000000000800080382838EB000069 -:10BA100000FF030300000100000000008080000020 -:10BA200000000000000000000000000000002000F6 -:10BA30000000000004000000000000000000000002 -:10BA40000000000020000010000020002000200066 -:10BA500040000400200000000000840000000000FE -:10BA6000041000002000C0000000C000000000031F -:10BA70000100000000000000000040800000008085 -:10BA8000000020800400000000008880000000000A -:10BA900000000080018000800000000200000080A3 -:10BAA00000000000200000000000208000000000D6 -:10BAB0000000000000000000000000000000000086 -:10BAC00040000000000000000000000080000000B6 -:10BAD00010008000000000000000000000000000D6 -:10BAE0004000000000000000000040004000000096 -:10BAF0000000100000000090000040000020000244 -:10BB00000020000000040000000000000010000001 -:10BB100000000000001004100010000000000000F1 -:10BB200000104000000000000000000000200000A5 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000800ED -:10BB500000000000000040000000000002000000A3 -:10BB600000000000040000000000000000000000D1 -:10BB70000000000000000000400000000000000085 -:10BB80000000820010000400000008000809000006 -:10BB900008090805000082000800020008000200F1 -:10BBA00000009000000000000800080002000200F1 -:10BBB00090000800000000000000000000000000ED -:10BBC000000000000000000000000900000000006C -:10BBD0000000000000000000800000840000000061 -:10BBE0000000000000000000000000000000000055 -:10BBF000000000000000008800008000000000003D -:10BC000000000000000080000000000000C0008470 -:10BC1000000000000088000000000000000000009C -:10BC2000000000820000000000000000008800A06A -:10BC300000000000000800000000000000000000FC -:10BC400000000000000000000000000000002000D4 -:10BC500020000000000000000000000000000000C4 -:10BC600000000000000000000000000000100008BC -:10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000C000880000006C -:10BC900040000021880000800000404100000405B1 -:10BCA000001008200080009000000000004100000B -:10BCB0000000000001000041000000000000000042 -:10BCC0000000000000100000000000000000000064 -:10BCD000800080000084000000080000000000A038 -:10BCE00000A000000000008400000300000000101D -:10BCF0000000000000000000000000000300000041 -:10BD000000004082000008000000008400000000E5 -:10BD1000110091004000400005020084910200C023 -:10BD200000080000000000100011000800000000E2 -:10BD300000000010000008000000000000000000EB -:10BD400008000000000000000000000000000000EB -:10BD5000000000000000000000000000A000000043 -:10BD60000000000000000000000000004000A000F3 -:10BD7000000084000000200000080000080000000F -:10BD800008000800200004000000840000000000FB -:10BD90000000820008000000000084050080000010 -:10BDA0000000000000000000000000000000001182 -:10BDB000000400000000000000000000000000007F -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF000000000000000000000000008000000003B -:10BE00000000000000000000008200900088210077 -:10BE10004000210420000090001009844000002010 -:10BE200000C00090000000040000000000000000BE -:10BE30000000000000400000009000000000000032 -:10BE400000000000000000000000000000000000F2 -:10BE50000000000000000100000000802100000040 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000080000000000BA -:10BE80000000080082000000820000000240000064 -:10BE9000001000008205C0088208C0000800820867 -:10BEA0000003000000000008000000000000002166 -:10BEB000000000000000000800000000000000007A -:10BEC0000000000021000008000000000000000049 -:10BED00021000000000000C0201000C00004A040AD -:10BEE000000800000000000000000000000000004A -:10BEF00000000000000000000000000020104000D2 -:10BF00000000000000000000000000000004030129 -:10BF1000001021100000210008A00084000000840F -:10BF20000084400021000000051000000000000017 -:10BF30000400000008002100008400000000000050 -:10BF400000000000000000000000080000000000E9 -:10BF500000000000000000000000000020000000C1 -:10BF600020000000000000040000000000000400A9 -:10BF700000000000000000000008000000000000B9 -:10BF8000000000000000C0000000000020000000D1 -:10BF9000400810008204002102042021902188031F -:10BFA0002002A0000011004100090010000800005C -:10BFB0000400002100000000000204000000000056 -:10BFC000000000020000000000000000000000006F -:10BFD00000000000000000000000000000008000E1 +:10B9300000005CFC5C0C5055FAFFBF1FBF1FF0F00D +:10B94000AAAA000000001450BEFA00000000000087 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B97000D7D7AFAF000000000000000000000000BB +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000008C8C0C0C7CD754D7F9 +:10B9A00000000000003CF055CFCF505F00000000C9 +:10B9B000000000005CFC5C0C0005AAAFB010B010E9 +:10B9C00000FFAAAA000000001450BEFA0000000008 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000D7D7AFAF000000000000000000003B +:10BA00000000000000000000000000000000000036 +:10BA100000000000000000000000FCCC3C0C7CFF9B +:10BA200054FF00000000FF3CF055C0C0505F000014 +:10BA30000000000020002100000000002080100015 +:10BA4000040000002000880000002000880004009E +:10BA50000000020020002000000004002000000080 +:10BA6000000004042000888000802080C080000343 +:10BA7000000084002000000420008400200020003A +:10BA8000400004000000040000000000200020002E +:10BA90000000018088020200900020800080208049 +:10BAA0002000C000C0882000C00084008200080080 +:10BAB0000000000000000000020000000000000282 +:10BAC000890000000000800000000000000000006D +:10BAD0000000000000000000000000000000000066 +:10BAE00040000000000200042004000400040002E2 +:10BAF0000000000000000000000010000000000036 +:10BB00000008000000000002000000000002000227 +:10BB1000008400000420000100000000002000203C +:10BB20004020400000000010000800840040000099 +:10BB3000800000000000000000000000000008007D +:10BB400000000000820200004080000004000800A5 +:10BB50009000000000000000000000000000000055 +:10BB60000000000000000000000000009003100032 +:10BB70009000000000000000000000000000040031 +:10BB800000000800000000000000000000000000AD +:10BB900000000800000000004000000000009100CC +:10BBA0008400000000000000000004000400824146 +:10BBB00082000800001000000000001000000000DB +:10BBC0008000000800000001000882080000100842 +:10BBD0000400040800000000000000000000000055 +:10BBE0000000008400000000000800000000008841 +:10BBF00000000088000000000000000000000000BD +:10BC0000000000000008000000080008000000001C +:10BC10000000001000000000000080000000000094 +:10BC200040880000000800000004000882000000B6 +:10BC30000000200000000800A000000000008403B5 +:10BC40000000000001054000900000001000C0004E +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000400D0 +:10BC70000000000000A10000000000000000000023 +:10BC80000000004100000010000000000000000063 +:10BC900000000000000000000000000000000000A4 +:10BCA00000004000840040210000000000000080EF +:10BCB000000000000000000803000300080003006B +:10BCC0000000038421000800A10000000088880013 +:10BCD0000000000000000000000003000000000061 +:10BCE00000000084000000000500040000000000C7 +:10BCF000000000000000090400000300038441006C +:10BD000000002100050041000000000000000000CC +:10BD10000000000000000000000000000200000021 +:10BD2000090000028008080021000088009003023A +:10BD30000020008200000084000008000800880045 +:10BD40000000848000000000A00000000800000047 +:10BD500001000000000000000800000000000000DA +:10BD60000000040000050000820008000800000038 +:10BD700000000000002000000000000000000000A3 +:10BD80000000000000000000000000000040000073 +:10BD900008000800080010008400000002000800ED +:10BDA00008000000000000002004000000000885DA +:10BDB0004010000200110000000408000000000014 +:10BDC000000000040040000000000000000000002F +:10BDD0000000200000000008000000080000000033 +:10BDE00000000084000000000000000000000000CF +:10BDF00000000000000000000000008400000000BF +:10BE000000840000000000000000000000000000AE +:10BE1000000000000000000010000540000080004D +:10BE200000002100000000000000000000000000F1 +:10BE30000010410104001188002000900000000063 +:10BE4000000000000000000082000000A0000002CE +:10BE500020000000018400000000004000000000FD +:10BE600000000000000000000000000000000400CE +:10BE700000000000000000000000000008000000BA +:10BE800000000000000008000000000000000000AA +:10BE90000000000000000000000000004000000062 +:10BEA00002000000001008008200A02000A0100086 +:10BEB0000000000001020100000008000000000076 +:10BEC00000100000030005000990000000000000C1 +:10BED000000004000300020508000000000021002B +:10BEE00000000000000000840000000000000004CA +:10BEF000000000C00000000000000002000800C0B8 +:10BF000000000000000000000084000000000000AD +:10BF1000000000000000000000040000000000001D +:10BF2000000080024000110180080000000120058F +:10BF30008020210403C008000420000080000000CD +:10BF400000000000000010002000400082000000FF +:10BF5000000000020020001110040000000000009A +:10BF600000000000000000000000000000000000D1 +:10BF700000080000000800000000000000000000B1 +:10BF8000000000000800000000410041000000081F +:10BF9000000000020000000000000000000000009F +:10BFA000840000004000C080000082000800000003 +:10BFB0000400040088100000001001008800200226 +:10BFC0002080900000000000000000000000000041 +:10BFD0000000200000000000000000000000000041 :10BFE0000000000000000000000000000000000051 -:10BFF00000900000000000000000000000000000B1 -:10C000000000080000000000000000040000000024 -:10C01000000000000000000000000004809000000C -:10C0200000000902000000000000009020840000D1 -:10C0300000000000000000000000000000002000E0 -:10C040000902000021C00000000000000000000004 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000010001000100000000CD +:10BFF0000000000000000800000008000000000031 +:10C000000000080000000000000000000000000028 +:10C010000000000000000000000000000000000020 +:10C0200000000000000000000020110000000000DF +:10C030000300C000800011010000000104C00000E6 +:10C0400000021110000000000000000000000800C5 +:10C050000100840008000040018502C10083000047 +:10C0600000000000000000000000000000000000D0 :10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900003A00120408504A100010201100000005E -:10C0A00000A0001082050021024190C1008890820A -:10C0B0004000000000004000000000000000000000 -:10C0C0000920C008000410820000000000000000E9 -:10C0D0000000000000000000000000000000000060 -:10C0E00000000000090000000041002000400002A4 +:10C080000000880000000000000000000000000028 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000001090880090108840 +:10C0B000100882200090C09000A00000000404003E +:10C0C00040C084040082A08800000000000000003E +:10C0D0008000200080008000004021048840000291 +:10C0E0000000000000000000000000000000000050 :10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C110000000A0902110808800A000201004802042 -:10C1200000200089418800A0004080848020000217 -:10C1300080C00000000000000000000000000000BF -:10C140000000090000800000808000000000000066 -:10C1500000000000000000000000000000000000DF -:10C16000000000080000000400002080040004001B -:10C1700008050000000000000000000000000000B2 -:10C180000000000000000000000000002000080087 -:10C1900009004100820005098400A08421001000EC -:10C1A0000500410300000003009100800000808032 -:10C1B00080028010000000008000000000000000ED -:10C1C000000000000000002100000000000000004E -:10C1D000000000000000000000000000000000005F -:10C1E00000000000000100000001000001C001008B -:10C1F000000001000000000000000000000000003E +:10C100000000000009000000000000000000000026 +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000080800000000F +:10C1300080008000000000008080408000000080BF +:10C1400000008000000000800000000000000000EF +:10C1500000008000000080008000030010840400C4 +:10C16000414000000000000000000000000000004E +:10C1700000000000000000000000000000000000BF +:10C18000000000040000001000000000000000009B +:10C19000000000000000000000000000000000009F +:10C1A0000000000000000000000000000200088302 +:10C1B00020808800C080048311888388800000214B +:10C1C00000000000000000820020000000000000CD +:10C1D000000000008800400008000482008200C1C6 +:10C1E000000001010000000000000000000000004D +:10C1F000000000000000000000000000000000003F :10C20000000000000000000000000000000000002E -:10C2100001000000010011840400A0A04140008240 -:10C220000188000001010000000100020008889060 -:10C2300040C00401040900008800080088000000D4 -:10C24000000000000000000000C0008400000000AA -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000400000000000000CA -:10C270000100890001000000000000000000000033 -:10C2800000000000000000000000000000000000AE -:10C29000000000002000000040850110844109C01A -:10C2A0000001000000010001040100000001A001E4 -:10C2B000040001C0208804040010004082A000A0F7 -:10C2C000000000000000000084900090008204C084 -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000004004A -:10C2F00000000300820002000000000000000000B7 -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000008021030210A1C6 -:10C32000840800021009412100400002210909404F -:10C330000402830003000300090000800080000065 -:10C3400000800000000000000000000000000080ED -:10C3500080800000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C37000000021800404030002020000000000000D +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C23000889001A0830011400991410291908800EB +:10C24000880008000800A000840884C1C004000021 +:10C2500000000000000000210011000800C14001A2 +:10C260000100A10101010000000000000000000029 +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000010200000000000001AA +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B00088000088000408C0C00800400040000852 +:10C2C000009000408202008809A000848884C00891 +:10C2D00000000000000000000020008200840084B4 +:10C2E00080084004A1210820000000000000000098 +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000400004000309409D +:10C31000000100000000000000000000000000001C +:10C32000000000000000000000000000000000000D +:10C33000000000000080008000808080000000007D +:10C3400000000000008000800000C100000000002C +:10C3500080800000000000000000001100800080CC +:10C360000000410083002100911100000000000046 +:10C3700000000000000000000000000000000000BD :10C3800000000000000000000000000000000000AD -:10C3900000000000008000000000000890891110DB -:10C3A000090082032111400009000205804080003D -:10C3B0000000000021200821400008000004008047 -:10C3C00000000000000000000000000000008002EB -:10C3D00000008000000000000000000000000000DD -:10C3E000000000000000000000000000000000004D -:10C3F00000000000014000010100000000000000FA +:10C39000000000010000000000000000000000009C +:10C3A000000000000000000000000000000000008D +:10C3B0000000000000020008000000804105200588 +:10C3C00009809100000000890000800080118040F9 +:10C3D00080000000000000000000000000000008D5 +:10C3E00000400000014004000100110100000000B5 +:10C3F000000000000000000000000000000000003D :10C40000000000000000000000000000000000002C -:10C410000000000000000040000000000001C10218 -:10C42000C021C084110101C001000000000004010E -:10C43000820090000200010001C00188010000009C -:10C44000002000100000000000000000000082003A -:10C450001001900004000000000000000000000037 -:10C4600000000000000000000000000000000000CC -:10C4700000E000000000000000000000600000007C +:10C41000000000000001000000000000000000001B +:10C42000000000000000000000000000000000000C +:10C430000000000000008801888890000082210030 +:10C44000A09120020200000000020010040004007D +:10C4500020A008A010000000000000000000000064 +:10C46000000000000000000000E0000041000000AB +:10C4700000000000000000000000000000000000BC :10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C -:10C4A0000000000007000000000000E000000000A5 -:10C4B0000000000000000000000000000700600015 -:10C4C000000000000000000000000000000000006C -:10C4D0000000000007000000000000000000000055 -:10C4E000000000000000000000000000000000004C +:10C4900000E00000000000000000000000000000BC +:10C4A000000000000000000000000000000000008C +:10C4B00000000000000000000081000007000000F4 +:10C4C000008100E007006082000A00000700000011 +:10C4D000000000000700480A000000000000000003 +:10C4E0000000000042424642FFC3FFC300000000BC :10C4F000000000000000000000000000000000003C :10C50000000000000000000000000000000000002B :10C51000000000000000000000000000000000001B -:10C520000000A020A08009000F0000000000000013 -:10C53000000042004206000000000000000000066B -:10C5400000F000000000C0F0F0F00000000000006B -:10C5500000002424F0FF0C3C99FF000000000000C4 -:10C5600000000000000000000000000000000000CB +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000F6666666FF00D4 +:10C54000F0F02400F4F0FF5EFF463C3C3C3C0C0C59 +:10C550000C0C0000000000000000000000000000C3 +:10C56000000000000000C3C3000000C300C30000BF :10C5700000000000000000000000000000000000BB :10C5800000000000000000000000000000000000AB :10C59000000000000000000000000000000000009B -:10C5A00000000000C342C3030100030000000000BC -:10C5B000000000000000000000000000000000007B -:10C5C00000060000000000000030203000000000E5 -:10C5D000000000002424FFFF0C3C000000000000CD +:10C5A000000000000000000000000000000000008B +:10C5B00000000000000000000000000066666666E3 +:10C5C0000000000024002400005E0046000000007F +:10C5D000FF0FF0000000000000000000000000005D :10C5E000000000000000000000000000000000004B :10C5F000000000000000000000000000000000003B :10C60000000000000000000000000000000000002A @@ -142470,405 +142470,405 @@ :10C62000000000000000000000000000000000000A :10C6300000000000000000000000000000000000FA :10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA +:10C65000000000000000021020000088108400008C +:10C66000000000000000000000004242C34200FF42 +:10C670000CF30000000000000000000000000000BB :10C6800000000000000000000000000000000000AA :10C69000000000000000000000000000000000009A -:10C6A00000000000000000008189E7EFFC00FC644E -:10C6B00000000000000000000000C3C300000000F4 -:10C6C0006F1F0000F0F0F0F000000000F900FF0024 -:10C6D000000000000000000000406666000000004E -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000DFC3FFFF00000606F0F0FCF00F3F99BD4E +:10C6D00000000F0F000000640000000000000000D8 +:10C6E0000000000000000000000000004242434340 +:10C6F00000F000F00000000000000000000000005A :10C700000000000000000000000000000000000029 :10C710000000000000000000000000000000000019 -:10C72000000000000000000000008181E7E7FC003D -:10C73000FC000000000000000000000100010000FB -:10C7400000000F1F00002000209000000000FF00EC -:10C75000FF000000000000000000C242E66600008A -:10C7600000000000000000000000000000000000C9 -:10C770000000000000000000000000610007000D44 -:10C78000000000610006000D000000000000000035 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000610006000D0000A06100060E -:10C7B000000D000000610004000900000061000697 -:10C7C000000D000005610A0E050D00A0000000002C -:10C7D00000000000000000000000000000000E004B -:10C7E00000900000000000000000000000000000B9 -:10C7F0000000000000000000000000000000000039 -:10C8000000000000D00FD000000000000000000079 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C740000000DFDFFFFF00000606FFFFFCFF003CEC +:10C750009FBF00000F0F00000066000000000000F7 +:10C760000000000000000000000000610006009DC5 +:10C77000000000613007000D000000000000000014 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000610007000D24 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000610E3E009D000100610E3E71 +:10C7D000000500000000003800100000000000000C +:10C7E0000000000000000000000000000000000049 +:10C7F000000000003C00080000EF00EA000000001C +:10C800000000000000000000000000000000000028 :10C810000000000000000000000000000000000018 -:10C82000000000000000000000000000000000B058 -:10C8300000BE3F001F002800EBC30F003F38000080 -:10C8400000000000042000000000000000000000C4 -:10C8500000000000000000000000000000000000D8 +:10C8200082A28AAA000000000000000000000000B0 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000FF0000000000000000000000000000D9 :10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C88000000000000000100F100000000000000079 +:10C8700000000100000000000000EFEFEAEA000005 +:10C8800000000000000000000000000000000000A8 :10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B000B0B0BEBE000000002820EBE30F003F3008 -:10C8C0000000000000000000C2FA000000000000AC -:10C8D0000000000000000000000000000000000058 +:10C8A000000082A28AAA0000000000000000000030 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D000101000EF00000000000000000000000049 :10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C9000000000000000000007D7DC0FC1000B000B1 +:10C8F000000000000000000049555555AAFF3030E7 +:10C900000000000000000000000000000000000027 :10C910000000000000000000000000000000000017 -:10C92000000000000000000000000000000055FFB3 -:10C93000C0C0A0B0E0F000BE00BA00B000BE0A0A5D -:10C94000FFCF00007FFF0000000000200028000053 -:10C9500000000000000000000000000000000000D7 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C940000000000000000000000000000000000CDB +:10C95000FFFC00000000C3CFFFFF0000000000004C :10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 -:10C98000000000000000000000004141C0FC100F4A -:10C99000B00F0000000000000000000000000000D8 +:10C970000000000000000000000000000000287D12 +:10C98000F0F00000000000000000000000000000C7 +:10C990000000000000000000000000000000000097 :10C9A0000000000000000000000000000000000087 -:10C9B00055FFFCFCAABEEBFF00AA00BAB0B0BEBE99 -:10C9C0000A0A00000000FFFF0000000000A000AA0B -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000002100001016 -:10C9F0002000200020000000000020002000000097 -:10CA000000002000200000002000000000000000C6 -:10CA1000400020000000040000002000200004006E -:10CA200000002000880088002000000000030000B3 -:10CA300001000000100000000000000000000000E5 -:10CA400000000000000000000000040000020000E0 -:10CA500001000000002100000000000000000000B4 -:10CA600000000080000000000000000000802000A6 -:10CA700000000000000000000000000000000000B6 -:10CA80000000000000000000000200001000100084 -:10CA90000000800200001000000000000000000004 -:10CAA0000000000000004000000000000000000046 -:10CAB00040404000000000000900000000040000A9 -:10CAC0000000000000000000000000000000000165 -:10CAD0000000040000000000000000000000000052 -:10CAE0000000000000100000000000000002001024 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB1000000020000082000800000040000000101B -:10CB200000040000001000100000000000100000D1 -:10CB300000000040000000000000000000000000B5 -:10CB400000000400040002100010020001000000B8 -:10CB500000000200040000000000000000000000CF -:10CB6000900000000220020004000000000000000D -:10CB700000000000000000080000000000000000AD -:10CB800000000000000000000000000000000000A5 -:10CB90000000000080000003000100000001000010 -:10CBA0000001000000000000000000000400000080 -:10CBB000000000000000000000080000000000006D -:10CBC0000000000000840000008800000000401009 -:10CBD0000000050000100000000800000000000038 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC200000000002000800000000000000000008F2 -:10CC300000000000000040000000080000000000AC -:10CC4000900000000040904100100000000004002F -:10CC5000000000004000000800000000C0050400C3 -:10CC6000000000000000000000200000000500009F -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA000000000000001110000000300000003006C -:10CCB0000000400000000000000004A00400080084 -:10CCC0000000000003000582008800020002050049 -:10CCD0000010088441004000000000000000000037 -:10CCE0000000000800000000030000000010000029 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000805000006 -:10CD2000080002400000C0000000000000000000F9 -:10CD3000080000109000000000000021000000002A -:10CD4000001000000000000008008800080000003B -:10CD500000114000000200040103824100040004AD -:10CD600000110000000000040000000000040004A6 -:10CD70000040002000410000000900000000000009 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D000000CFFFC00000000C3CFFFFF00000000C0 +:10C9E0000000000000000000000000000000000047 +:10C9F00020002000000000002000000000000000D7 +:10CA000020002000000000000000200000000000C6 +:10CA1000200488000000000000000000000000006A +:10CA200020002000000000000000200000020000A4 +:10CA30000000200000000000040000000000400092 +:10CA400000002000200400000000000020088800F2 +:10CA50000380010000800000200000000180000031 +:10CA60000011A004200088000408840004000000D5 +:10CA70004000020000000000000000000000400034 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000004000400000020000000014 +:10CAA0000002000000000000000000000000000084 +:10CAB00040000000000000004000000000040000F2 +:10CAC000000000000000000000000000000000085E +:10CAD0004000020204000020000080000000080462 +:10CAE000000000000901000000000000000000003C +:10CAF00090000000000000000000000000000000A6 +:10CB0000100000000000000000000000000000090C +:10CB10008200000000000000000000000000000093 +:10CB200000000000000000090000000000000000FC +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000002000000000000000000E3 +:10CB50000000000040400000000009040200010045 +:10CB60000000000091C1000004000000000000006F +:10CB70002010000000000000000000000000000085 +:10CB8000000000000084000000000000000004001D +:10CB90000000040004000000040004000400000081 +:10CBA0000000000800080000000000000000000075 +:10CBB0000000000000000000000000000000000075 +:10CBC000000000000010000800000000000000004D +:10CBD000000000400000C10900000000200100002A +:10CBE00010000000040040200000000000001100C0 +:10CBF000040085040841002100000000000000003E +:10CC00000000000008008208A000C0000000000032 +:10CC10008200000000000040000000000000000052 +:10CC20000000000000000000000000000000000004 +:10CC30000000000000000000000082000000000072 +:10CC400000000000000000000000000000000000E4 +:10CC5000000040000000400000000000C000900004 +:10CC6000C00090000080400040A000000000C00014 +:10CC7000000000008400030000000000000000002D +:10CC80000000000000000000000000000000008222 +:10CC90000000000000000000000000000000410053 +:10CCA0000000000000000000000000000300000081 +:10CCB000000000000000000000001008000000005C +:10CCC0000000000000000000000000004000000024 +:10CCD00000000000000000000000050040001100FE +:10CCE000004008004100000840828002000000006F +:10CCF0000000000000080000000004000000000028 +:10CD00000000000082000000000000000000400061 +:10CD1000000000000040000000000000A00008002B +:10CD20000000000008000000000000048209000468 +:10CD300000000041000000000000000000000000B2 +:10CD4000000410000000000000000400000000418A +:10CD5000004000000000000000000000000008008B +:10CD60000000C00000000000000008410020084151 +:10CD70000100000400090008080400000000000091 :10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 -:10CDA00000000000800100004100000000000000C1 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000100000000000000000000000062 -:10CDD00000C0000080000000000010000000000003 -:10CDE000000000000000000000040000000000C07F -:10CDF00000202000000000000000000000000000F3 -:10CE00000000000000000000000000000000000022 -:10CE1000000000000000000000000000080000000A -:10CE200000080000000000000000000000400000BA -:10CE3000000000410000820000000000000000002F -:10CE400000000000000000000005000000000800D5 -:10CE5000000000200800080000000000A000000002 -:10CE60000000001000000000000000000000820030 -:10CE70000000000000000041000000000000000071 -:10CE80000000000000000000000000000000001092 -:10CE90000000000000000000000000000000000092 -:10CEA00000000000008400000000000000000000FE -:10CEB0000000000000000000000000000000000072 -:10CEC000000800040000000003000800000000202B -:10CED000091002100000000400C008000800000053 -:10CEE000009000A0091008A0000000080000000841 -:10CEF00000000000000000002000000008004000CA -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 -:10CF200008000000000000000000002100050011C2 -:10CF30000000000000080000000000000000820067 -:10CF400000000000000000000000000000000041A0 -:10CF500000000000004100008800000000004000C8 -:10CF600088000004004000090000000000040008E0 -:10CF7000000420000000000000000000000000414C -:10CF80000010000000000000000000000000000091 +:10CD90008000000000000000000000000000000013 +:10CDA0000000000000000000000000000000000083 +:10CDB00000000000000000880000000000000000EB +:10CDC000000008000000000000000000000000005B +:10CDD0000000000000000000000000000000000053 +:10CDE00000000000000000000000000000C0000182 +:10CDF00000001000000000C0000000000000002142 +:10CE0000000000000800000000000000000000001A +:10CE10000000000000000000000000000000A00072 +:10CE200000000040000000000000000000000000C2 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000084000000000088000400C2 +:10CE600004804080100000000000000800800000E6 +:10CE7000050000000008000000000000000800009D +:10CE8000000000000000030000000000080000088F +:10CE900000A000000084000000000000000000006E +:10CEA0000000000000000000000000000000000082 +:10CEB00000000000000000000000030000840000EB +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE000008485200520008400002100000100044A +:10CEF0000008840400002100008400000000008479 +:10CF00000000000000000000000000009000000091 +:10CF100000000000000000000000080008000002FF +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000004000000000000DD +:10CF5000000000000000000000008200000000004F +:10CF60000200A00040000000000000099000000046 +:10CF7000C0080011000000040010000000000008BC +:10CF8000000400000000000000000000000000009D :10CF90000000000000000000000000000000000091 -:10CFA00000000000000000000000008200000000FF -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000020000000000041 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000110000000000000000000000000060 +:10CFC0000008000000000000000000000000000059 :10CFD0000000000000000000000000000000000051 -:10CFE00080000000000000040000000000000000BD -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 +:10CFE0000000000000000000000000000000000041 +:10CFF000000000000000000000C000000000000071 +:10D000000008000100000000000000000000000017 +:10D01000000000000000010000000000000000000F :10D020000000000000000000000000000000000000 -:10D0300008000000000000000000000000000000E8 +:10D0300000000000000000000000000000000000F0 :10D0400000000000000000000000000000000000E0 :10D0500000000000000000000000000000000000D0 -:10D06000A101820100011040000800820882000036 -:10D07000000000000000900000000000000000A080 -:10D08000900400A00002000000000000000000006A -:10D090000000000000000000000000000000000090 +:10D060000000000000002010208200C000820101AA +:10D070000000840100000088000400A008A0000057 +:10D08000000001000000000000000000000000009F +:10D090000000000000000000100000000000000080 :10D0A0000000000000000000000000000000000080 -:10D0B00011008000000000000000000000000000DF -:10D0C000000000000000000000080002000400044E +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 :10D0D0000000000000000000000000000000000050 -:10D0E00000098302000300088000008000000000A7 -:10D0F0000000000000000000000000000000000030 -:10D100000000800000000080000800000000000017 +:10D0E00000000000000000000000000000000080C0 +:10D0F00011410421A0020000000000000080000097 +:10D1000000000000400000000000000000000000DF :10D11000000000000000000000000000000000000F -:10D12000000000000000000002800900090008095A -:10D1300080008000800080000000000000000000EF -:10D14000000000000000000000008000000000005F -:10D15000801100000000000000000000000000003E -:10D160000000020020000400039000000040008046 -:10D1700000000000000000000000000000000000AF -:10D18000000000000041808000000000000000005E +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000080C10080FE +:10D170008080A080900004008990000000000005DD +:10D180000089000000000000000000000000000016 :10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000010000000006F -:10D1B0000101040010000800C00000000000000091 -:10D1C0000000000000000000000000000202020059 -:10D1D00088000400000000000000000000000000C3 -:10D1E000000000000082010000000188000000C073 -:10D1F00000A000000000000000000000000000008F -:10D2000000000000000004C182A0900000000000A7 +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000082912C +:10D1F0008202C0900910110084000989000000001B +:10D200000001008800000000000000000000000095 :10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE -:10D2300000000000000100000001000100000000EB +:10D2200000010000000000000000000000000000FD +:10D2300000000000000000000000000000000000EE :10D2400000000000000000000000000000000000DE -:10D2500001000100010000000000000000000000CB -:10D2600000000000000000000100000000000408B1 -:10D270000002000404C000000000000000000020C4 -:10D280000010000800080090009000C0A0000000FE +:10D2500000000000000000000000000000000000CE +:10D26000000000000000000000000000000040403E +:10D270000082908200020001000101010001209063 +:10D280000004000802A000000000000001000000EF :10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E -:10D2B000000000000000001000110008000800003D +:10D2A0000004000400040000000000000000000072 +:10D2B000000000000000000000000000000000006E :10D2C000000000000000000000000000000000005E -:10D2D0000000030010000800000000000000000033 -:10D2E00000000000000000000000032003040540CF -:10D2F00000000080008080000000000000000000AE -:10D30000000000800080008000000000000000009D +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F00080800000800000800020031009020011DF +:10D30000000000800080800000000000000010008D :10D31000000000000000000000000000000000000D :10D3200000000000000000000000000000000000FD -:10D33000410221112100030800000000000000004C +:10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD -:10D3500000002110040009804000000000000000CF -:10D360000000000000000000000041000300090070 -:10D3700002400000000080000000000000000000EB -:10D38000000000000000000000008000000000001D +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D370000000A005108210800500410511002180E9 +:10D380000011410020110300030000040000000010 :10D39000000000000000000000000000000000008D :10D3A000000000000000000000000000000000007D -:10D3B0000000011000010100010100000088008848 +:10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D -:10D3D0000000000001010008004001000000000002 -:10D3E00000000000000000000000000001880100B3 -:10D3F000000001010400A0000800840000000000FB -:10D400000000000000000000000000000400020016 -:10D4100084048400000000E0000000000000000020 +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F0000000000041002188C19020000100019040 +:10D40000010800010100010101000000000100000D +:10D41000000000000000000000000000000000000C :10D4200000000000000000000000000000000000FC -:10D4300000000000000000E000000000000000000C +:10D4300000000000000000000000000000000000EC :10D4400000000000000000000000000000000000DC :10D4500000000000000000000000000000000000CC :10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000070000000000A5 -:10D48000000000000000000000000000000000009C -:10D490000000070050000000000000000000000035 +:10D470000000000000000081000007004100810062 +:10D4800000E000000000000000E007000000810054 +:10D4900000E00000000000000000000000000000AC :10D4A000000000000000000000000000000000007C :10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C :10D4D000000000000000000000000000000000004C :10D4E000000000000000000000000000000000003C -:10D4F0000000000000000000AAF0AA3C0A0F0B0F79 -:10D50000000000000000000000000000CFF5000057 -:10D51000D7D7F0F0F0C0F0C000000000000000001D +:10D4F0000000000000000000C0C0C0EA8E8E8EFF59 +:10D50000000000000000000000000000F0F000300B +:10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB :10D5400000000000000000000000000000000000DB :10D5500000000000000000000000000000000000CB :10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000FFF0FF3C000F72 -:10D58000030F000000000000000000000000CFF5C5 -:10D590000000D7D700FFF0C0F0C00000000000007E +:10D5700000000000000000000000000000AA8E8EE5 +:10D580008EFF000000000000000000000000F0F02E +:10D59000000000000000000000000000000000008B :10D5A000000000000000000000000000000000007B :10D5B000000000000000000000000000000000006B -:10D5C000000000000000C3824500000000000000D1 +:10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B -:10D5E0000C0C0C0C0000000000000000000000000B -:10D5F000000000000000000000000000FFFF02AA81 -:10D60000000000000000000000000000000000001A -:10D61000000000003030B030F000F00000000000EA +:10D5E000000000000000000000000000000000003B +:10D5F00000000000000000000000000003FF00FF2A +:10D60000FF0F0F5500000000000000000D0D0D0D74 +:10D61000000000000000000000000000000000000A :10D6200000000000000000000000000000000000FA :10D6300000000000000000000000000000000000EA -:10D640000000000000000000C38241000000000054 +:10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA -:10D6600000000C0C2C0C000000000000000000006A -:10D670000000000000000000000000000000FFFFAC -:10D68000000000000000000000000000000000009A -:10D690000000000000003030B0300F0F00000061CB -:10D6A0000006000D00000000000000000000000067 -:10D6B0000000000000000000000000000000004129 -:10D6C0000004000D000000610006000D00050000D0 +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000003FFF6C +:10D68000FFFF000F0F5500000000170F554D0D0D47 +:10D690000D0100000000000000000000000000007C +:10D6A0000000000000000000000000000000006119 +:10D6B0000006000D00000000000000000000000057 +:10D6C000000000000000000000000000000000005A :10D6D000000000000000000000000000000000004A -:10D6E00000610006000D00000000000000000000C6 -:10D6F000000000000000000000610006000D0000B6 -:10D7000000000E000000000000000000000000000B -:10D71000000000000000000000000E0000000000FB +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D7000000610E3E000D000800010001C00900008C +:10D7100000610004000D000000610007C00D000062 :10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 -:10D740003535F0FF00000000000000001000500020 +:10D7300000000000FF0FF0F00000000000000000FB +:10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 -:10D760000000000000C200000000000000000000F7 -:10D7700000000000000000000000808000A0FF5FAB -:10D78000FF5F00000000000000000000000000003B -:10D790000000000000000000000000000000000089 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D7800000000F3C0F0F000000005555FFF0F0AAFD +:10D79000C3AAF030C3000000000000000000000039 :10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 -:10D7C00000003535000F0000000000000000505040 -:10D7D00050500000000000000000000000000000A9 -:10D7E000000000000000C2C20000000000000000B5 -:10D7F000000000000000000000000000A0A000A049 -:10D800000000FF5F000000000000000000000000BA -:10D810000000000000000000000000000000000008 +:10D7B000000000000000FF0FFFFF0000000000005D +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D80000000000000F3C0F0F00000000FF00F0F0D0 +:10D8100000AAFFAA000000000000000000000000B5 :10D8200000000000000000000000000000000000F8 :10D8300000000000000000000000000000000000E8 -:10D840000000000000000000F5F0C1C00000000072 +:10D8400000000000000000000000000000000000D8 :10D8500000000000000000000000000000000000C8 -:10D86000000000000000370007000000000000007A -:10D8700000000000000000000000000000000F0792 -:10D880000707000000010000000000000000000089 -:10D890000000000000000000000000000000000088 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000F5059E +:10D89000FFF0FF5F0C2C0000000000000000000003 :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 -:10D8C00000000000000000000000550041000000C2 +:10D8C0000000000000000000000000000000000058 :10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000340004000000000000 +:10D8E0000000000000000000000000000000000038 :10D8F0000000000000000000000000000000000028 -:10D900000A02020200000000000000000000000007 -:10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 -:10D9300000000000000004000000000000000000E3 -:10D9400000000000000000000000000000000400D3 -:10D9500040000000000020020000000000008400E1 -:10D960000000000040000000000010000000000067 -:10D970000000200000000000100000000000000077 -:10D980000000000000032000000020000000000054 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000010000000000067 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000010000000000047 -:10D9D00000000000400040000000000000000000C7 -:10D9E0000000400040000040100000000000000067 -:10D9F0000000000000000000000000000000000027 -:10DA00000000000000000004000000001000000002 -:10DA100000000000000000000000000000004000C6 -:10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 -:10DA60000000000000400000000000000000000076 -:10DA70000000000000000000000000400000000066 -:10DA80000000000000000000000000000000000096 -:10DA90000000020000000040004090000000004034 -:10DAA0008200000000000000000000008400000070 -:10DAB000000000000000000000000008000000005E +:10D900000000000000000000000000000000000017 +:10D91000F5050F00FF5F0C2C000000000000000068 +:10D9200000000000000000002000000000000000D7 +:10D9300000000200000000002000000000000000C5 +:10D9400000000000000000002000000000000400B3 +:10D950000000200000030000000000000000400064 +:10D96000C000C00000000000000020000000020411 +:10D9700020040000200000008400000000000000DF +:10D980004003000000000000C00020000000200054 +:10D9900020000000200000002000400390008200D2 +:10D9A0008200000000000000840000000000000071 +:10D9B0002000000000000000000000000000000047 +:10D9C0000000000000000000000010000002000045 +:10D9D0000000000000000000000000020002000241 +:10D9E0000002000200000000000000001000000023 +:10D9F000000000000000100000040004000000000F +:10DA000000000000000000000000100010000000F6 +:10DA100000000000000000001000000000000000F6 +:10DA200000000000000400000000000000000010E2 +:10DA300000000000000000000000000000000040A6 +:10DA40000000004000000000000000000000000096 +:10DA50000000000000008210000000000000000034 +:10DA600000000000000000000000000000000000B6 +:10DA70000000000000000000000010000000000096 +:10DA8000000000000000000000000000000000088E +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000050000000000000000000071 +:10DAB0000000000000000000000000000000000066 :10DAC0000000000000000000000000000000000056 -:10DAD000000000000000000000000008000000003E +:10DAD000000000000000000000000400040000003E :10DAE0000000000000000000000000000000000036 -:10DAF00000080000000000000000000000100010FE -:10DB0000000800000000000000000000000000C04D -:10DB100000080000000000000000000400000000F9 -:10DB200000080000000000000000000000000000ED +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000400000000000011 +:10DB1000000000000000000000000082024002003F +:10DB200000000000000000000000000003000000F2 :10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 +:10DB40000000000090000000000000000000000045 :10DB500000000000000000000000000000000000C5 -:10DB60000000000000000005000000000000400868 -:10DB70000000000000000000880004000000900089 -:10DB80000000200000000000000000008800C0002D -:10DB90000000880000000000820000000008000073 -:10DBA00000000000000000000000A00000000000D5 +:10DB600008000000000000000000000000000000AD +:10DB700000000000000000000000000000000000A5 +:10DB8000000000000000000000000800000010403D +:10DB90000000000090004000000002008200200011 +:10DBA0009000C0002000200088000040000000001D :10DBB0000000000000000000000000000000000065 :10DBC0000000000000000000000000000000000055 -:10DBD00000000000000000000000008400000000C1 +:10DBD0000000000000000000000000000000000045 :10DBE0000000000000000000000000000000000035 -:10DBF000000000000000000000000800000000001D -:10DC000000000500000041000000000000000020AE -:10DC1000004000000000000000C0000008000000FC -:10DC200000000000000000000000000000000000F4 -:10DC300000000004000000000000000000000000E0 +:10DBF0000000000000000000000000000000000025 +:10DC000000000000030000000000000041000800C8 +:10DC100041000000410000004000004009000000F9 +:10DC200000000000000000000000080000000000EC +:10DC300000000800000000000000000000000000DC :10DC400000000000000000000000000000000000D4 :10DC500000000000000000000000000000000000C4 -:10DC600000000000000000000000000000000000B4 -:10DC7000000000000000000000000009000000009B -:10DC8000000000000000000000000000A0000000F4 -:10DC90000000000000000000004000000002000042 -:10DCA0000041000008400000004000040040004027 +:10DC600000000000000000000000000000080000AC +:10DC7000000000000000840000000000000300001D +:10DC80000000000000000004000000000000C000D0 +:10DC9000A00084000000000000000000000000411F +:10DCA00000088403000000100000000000110004C0 :10DCB0000000000000000000000000000000000064 :10DCC0000000000000000000000000000000000054 :10DCD0000000000000000000000000000000000044 -:10DCE0000090000000A000000000000040000000C4 -:10DCF0000000000020000000000000000000000004 -:10DD00000010000000C00010000000000000000033 -:10DD10000000000000000000000000000090000073 -:10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000000000000000E3 +:10DCE0000020000000000000000002000000009082 +:10DCF000000400000082000000000000000000009E +:10DD00000000000000000000030000000000000010 +:10DD10000000000000000000000000000000000003 +:10DD200000A0000000000000000000C02000200053 +:10DD300000000000200000000000000000000000C3 :10DD400000000000000000000000000000000000D3 :10DD500000000000000000000000000000000000C3 :10DD600000000000000000000000000000000000B3 -:10DD700000000000000000000000000000000000A3 -:10DD8000000000000000040000000000000000008F -:10DD9000080000000000000000000000000000007B -:10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000000000000053 -:10DDD000000000000000000000000008000000003B -:10DDE00000A000900000008805080000000000006E -:10DDF00000000000000000000000000009204000BA -:10DE000000880000002000080000000000000088DA -:10DE100000000400000200A0000000000200020058 -:10DE200000000000000000000000000000000000F2 -:10DE300000001000020000000800030000000000C5 +:10DD700000000000000000000000000000000003A0 +:10DD8000000000000008002100000000100000005A +:10DD90000800000008000000000000000000000073 +:10DDA00000000000820000000000000000410000B0 +:10DDB00000000000000082000000000000000000E1 +:10DDC000000000000000000000000900000000004A +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000100000000090110051 +:10DE200020000040030009000388000000000008F3 +:10DE300000001100000000000300000000000000CE :10DE400000000000000000000000000000000000D2 :10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000800080000A2 -:10DE7000000000000000000000000008000000009A -:10DE8000000000000000000000000000080000008A -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000000000000000100062 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90001000000000000000000000000000000072 +:10DEA0000000000000000000000000000000000072 :10DEB0000000000000000000000000000000000062 :10DEC0000000000000000000000000000000000052 :10DED0000000000000000000000000000000000042 -:10DEE00000000000008400000000000000000000AE -:10DEF000000000000000000000000000000800001A +:10DEE0000000000000000000000000000000000032 +:10DEF000000000C011000000000000000000000051 :10DF00000000000000000000000000000000000011 -:10DF100000000000000000000000000041000000C0 -:10DF200000000500000005000000000000000000E7 -:10DF300000000000000000000000000000000000E1 +:10DF10000000000000000000000000000000000001 +:10DF200000080000000000000000001000040000D5 +:10DF300000001004200000A00000002000000940A4 :10DF400000000000000000000000000000000000D1 :10DF500000000000000000000000000000000000C1 :10DF600000000000000000000000000000000000B1 @@ -143023,680 +143023,680 @@ :10E8B0000000000000000000000000000000000058 :10E8C0000000000000000000000000000000000048 :10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 -:10E8F00000000000000000000000200020000000D8 -:10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 -:10E92000000000000000000200090000000000805C -:10E9300000000400000000000000000000000000D3 -:10E940000000008000040020000200000000000021 -:10E9500000000000000000000000000000000000B7 -:10E9600000000000000000000000000000000000A7 -:10E970000000000000000000000000000000000097 -:10E980000000000000000000000000020000000085 -:10E990004084000000000000400040000000000033 -:10E9A0000000000000000000000000000002000263 -:10E9B000000400000000000000000000000000A0B3 -:10E9C00000000000002000020001000000A0000084 -:10E9D0000000000000020000000000000000000233 -:10E9E0000000000000000000000000000000000027 -:10E9F00000080000000000000000000010000008F7 -:10EA00000800000000000200080000100009084192 -:10EA100008080200000008000000080000000000D4 -:10EA20000000000082000000000000000200020060 -:10EA300000000204000000000200000002000000CC -:10EA4000000000000000000020400000000008005E -:10EA500000000000000000000000020002000000B2 -:10EA60000200004000000000000002000000000062 -:10EA70000000000000080000000000000000200866 -:10EA8000001000000000000800000000000000006E -:10EA90000000008800840000000000000000000862 -:10EAA00000820000000000080000000000000000DC -:10EAB00000000000001100000000000000840000C1 -:10EAC00000080000000000000008800000000000B6 -:10EAD0000000000000000000000000000000000036 -:10EAE0000010000000000000004000000000900046 +:10E8E0000000000000000400000000002000000004 +:10E8F000000000000000020000000000880000008E +:10E900000000820000000000000000002000000065 +:10E910000000040000000400059008054090040079 +:10E9200004002000000000038900880000000200AD +:10E9300000000000200088002000000088008900FE +:10E940000000008000020000200000000200208281 +:10E950000000000000008800880083802000200064 +:10E9600004C000000400030040000000000000009C +:10E97000000000000000000000000008000000404F +:10E980001000400000000000000000000000000037 +:10E990000000000000000000408408038000801197 +:10E9A00040040000000000000000400000000000E3 +:10E9B0000000000000000000000010000020000027 +:10E9C00010000000000200010000000000008000B4 +:10E9D00000110000000000000000000040020000E4 +:10E9E000004009110000000040000000020000008B +:10E9F00000000040000002000210000000000000C3 +:10EA00000000000000000000000000000000000006 +:10EA100000100000000000000000100440410288C7 +:10EA2000A110200000000000000000000000000015 +:10EA300000000000000000000000000000000010C6 +:10EA4000A000000020000100100000000080211044 +:10EA50004000110000000000004002100141404051 +:10EA60004080C0100100014120008500000000002E +:10EA7000000000000000000000000000000800008E +:10EA80000000020000000000000000002000000064 +:10EA900000000000000000000000000080418082B3 +:10EAA000804108018000000000000000000000001C +:10EAB0000000000000000000000000000000000056 +:10EAC00000001084000880004000800800820010D0 +:10EAD00088838084C0080082008800002084200091 +:10EAE0008400C10200840800200080840800000027 :10EAF0000000000000000000000000000000000016 :10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 -:10EB200000000000000000030000C0000000000022 -:10EB300004000000040000000000000000000000CD -:10EB4000000500050000000040080100000041022F -:10EB50000000108000009000000000000000000095 -:10EB60000000000000000000000000000000400065 +:10EB100000000000000000000000000000000100F4 +:10EB20000000008000000100000000000011000053 +:10EB3000000300080021000800000005000000009C +:10EB4000000000218808010900000000C00000004A +:10EB50000800001008050000000000000000000090 +:10EB6000084000A108050810000000800000000215 :10EB70000000000000000000000000000000000095 :10EB80000000000000000000000000000000000085 -:10EB9000000000000000090000000000000000006C -:10EBA0000000000000000000000000000000000065 -:10EBB00000000000000080000900000000000000CC -:10EBC0000000000000000000002000012000000004 -:10EBD000840100400004000000000000000000006C -:10EBE0000000000000000000000000000000000025 -:10EBF000000000000000000000000800000000000D -:10EC0000000008000000000000008200001000006A -:10EC100000000011000000000200000000000000E1 -:10EC20000000A000000008008200000000000000BA -:10EC300000000000000000000400040000000000CC -:10EC40000000A00000000000820082000000000917 -:10EC500000000000000000000000000000000000B4 -:10EC60000000000000000040000000040000000060 -:10EC70000040000400000000000000000000000050 +:10EB90000000000000000000000000000000000075 +:10EBA0000800200000080000200000000000000015 +:10EBB0000000000000000000000000000000000055 +:10EBC000000000000000090020000000000000001C +:10EBD0000082800000008300000000000020000090 +:10EBE0000000800100028000800100900002090006 +:10EBF0000001000000000000820000000000000092 +:10EC000008000000000000000000000000000000FC +:10EC100000000800000000000000000000000000EC +:10EC20000000820040000180040010050000000088 +:10EC3000A0000000000000000200080082000000A8 +:10EC4000C0000000200008000800080008000000C4 +:10EC5000400002001000820540004040100000000B +:10EC60000200A00000002000200021000080A00081 +:10EC7000041120040000000000000000000000005B :10EC80000000000000000000000000000000000084 -:10EC900000000000000000000000800000000000F4 -:10ECA0000000000000000200000000000000000062 -:10ECB00000000082000000000000800080000000D2 -:10ECC0000000000000000000000000002000000024 -:10ECD000200000002084200000400000000002000E -:10ECE00002200200000000000004200000000000DC -:10ECF000000400820000000000000000000000008E +:10EC900000000000800000000000000000000000F4 +:10ECA00000000000080080000404080000000000CC +:10ECB0000008000000000000000000000000000844 +:10ECC0000208000000008000000000008004030033 +:10ECD000000088840000000009A0A100800041001D +:10ECE0000000080000000004C1888004820821029E +:10ECF000200483002001000000000000000000004C :10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000021D2 -:10ED200000000000000000000000000008000000DB -:10ED3000000000000000000000004000001001A0E2 -:10ED4000000000000000002100000000820082009E -:10ED50000100040020004000000000040000000446 -:10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000000083 +:10ED10000000000082000000000000000000000071 +:10ED200000000000000500000000000800000000D6 +:10ED30000021000020080000000000000008820000 +:10ED40000000000000000008000000002000080093 +:10ED50000000400000000002C10008004002101145 +:10ED60000000C04082030005080040080900088038 +:10ED7000000000000008004000000000000000004B +:10ED8000000000000000000000000000000810006B :10ED90000000000000000000000000000000000073 -:10EDA0000300000000000008000000000000000058 -:10EDB00000000000000000000000000080001000C3 -:10EDC00004050000000000200000000000000020FA -:10EDD00000001000800080008000000000010000A2 -:10EDE000030100000000000000000000000000001F -:10EDF0000000000000000000000000000000000013 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC00000000000000000000000000000008000C3 +:10EDD0000000000080000000000008000004800126 +:10EDE000800040000000000021A0000080008200A0 +:10EDF0008002000000000000000000000000000091 :10EE00000000000000000000000000000000000002 -:10EE10000000820000000000000000000000000070 -:10EE2000000082210000000000000000000000003F -:10EE3000000088000000C00040000000000000004A -:10EE40000000200000210000000000000000000081 -:10EE5000820082000040914002008300000500040F -:10EE6000000900C000400000000000000000000099 -:10EE70000000000000000000000000000000000092 +:10EE100000000000000000000000000002000000F0 +:10EE200000000000A000000000210000A000080079 +:10EE300004080000000400020003000000080000B5 +:10EE40000000000082000000000000000080008838 +:10EE50000080000040100800C00000000008000012 +:10EE600000058200000000080240C02120110200BD +:10EE70000000400220210003000400020000000006 :10EE80000000000000000000000000000000000082 -:10EE90000000000000000010100000000000000052 -:10EEA000000000000000000410000000000000004E -:10EEB000000000000000000400000000000000004E -:10EEC00000000000800000000000000000000000C2 -:10EED00000000000000000002000000040000000D2 -:10EEE00000000004200400000800000404000000EA -:10EEF000000000000000000400000000000000000E +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0008000800000000000000000000000000052 +:10EEC00000A0410000A000000000000000000008B9 +:10EED0000005200808000000410000840000000038 +:10EEE00000A0000000000584000009000900209037 +:10EEF000004000048001000020000000000100002C :10EF00000000000000000000000000000000000001 -:10EF100000000000000000000000000000000008E9 -:10EF2000000400400000000000000000000000009D -:10EF300000000000000000000000000000000000D1 -:10EF400010844082040482040000000000000000DD -:10EF500000000000000000004088A10090A082088E -:10EF600000018500410000010000000000000000D9 -:10EF70000000000000000000000000000000000091 +:10EF100000000000000000000000000000000000F1 +:10EF20000000000000000000000000000000118947 +:10EF3000A00284022009010000000000000000007F +:10EF400000010001000100010000000000000000BD +:10EF500041018900900188000101A000000000012A +:10EF600020A000008840028800000000000000008F +:10EF700002C140024120202008C0010240021010BE :10EF80000000000000000000000000000000000081 :10EF90000000000000000000000000000000000071 -:10EFA0004080000000800000000000000000000021 -:10EFB0000000000000000000000000000000000051 -:10EFC00000008400A180000080800000000000009C -:10EFD00000000000000000000000800003008480AA -:10EFE00080800020030303050010000000000000E3 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 +:10EFA0000000000000000000000000000000000061 +:10EFB00091C18509004100A1110900210000000054 +:10EFC000000000100010001000040000000000000D +:10EFD0000000914189210810800011418021000327 +:10EFE0000003008005100000001100000000000078 +:10EFF000000080C1008940028010C0110308104148 +:10F0000000C0000000000000000000000000000040 :10F0100000000000000000000000000000000000F0 -:10F02000000000000021008000000000000000003F -:10F0300000000000000000000000000000000000D0 -:10F04000000000008500A103C0899082000000003C -:10F05000000000000000000000000000C18020113E -:10F060008391C1A100800300034005C0000000009F -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 +:10F020000000000000000080000000000000000060 +:10F030000000C1808404059141910000000000009F +:10F0400000000000000000000000000000000000C0 +:10F05000000000008080C1009011C109090010006B +:10F060000900084100800802898008210000000092 +:10F0700000000000A00241218285100390030900D6 +:10F08000110200A1000000000000000000000000CC :10F090000000000000000000000000000000000070 -:10F0A00000000000000000C0001000000000000090 -:10F0B0000000000000000000000000000000000050 -:10F0C00000000000000010401101840505910000BF -:10F0D0000000000000000000000000000000884068 -:10F0E000A1A184A1A1910040000000000004000043 -:10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000000FF +:10F0A000000000000000000000020000000000005E +:10F0B000000000001010100111A185A00000000048 +:10F0C0000000000000000000000000000000000040 +:10F0D00000000000000008C01000A1018301000032 +:10F0E00001000000010188100500A0A0010100003E +:10F0F0000000000000000920A00120A08901A188D3 +:10F1000090000241820300000000000000000000A7 :10F1100000000000000000000000000000000000EF -:10F12000000000000000C00000000000900000008F -:10F1300000000000000000000000000000000000CF -:10F140000000000000000000100400A190418303B3 -:10F1500000000000000000000000000000000000AF -:10F1600040100091841000400000030001010100E4 -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F +:10F1200000000000000000000000000000000000DF +:10F130000000000000000211018901410485000067 +:10F1400000000000000000000000000000000000BF +:10F15000000000000000000000890090018901010A +:10F1600000000000890000000410008200028202FA +:10F170000000020000000000C00801A088A140407B +:10F180001040C00491C183C10000000000000000D5 :10F19000000000000000000000000000000000006F -:10F1A00000000000000000008000000000000400DB -:10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000008089008380A192 -:10F1D000918400000000000000000000000000001A -:10F1E00000008091009100910983000091050521A4 -:10F1F00011400000000000000000000000000000BE -:10F2000000000000000000000000000000000000FE +:10F1A000000000000000000000000000000000005F +:10F1B00000000000000000000090412109A0002193 +:10F1C000000005000500000000000000000008002D +:10F1D0000000000000000000000000891080098588 +:10F1E000114100004100A100000080C00280100910 +:10F1F0009091000080000000000080800880C1A184 +:10F200000509008080A09021848400000000000097 :10F2100000000000000000000000000000000000EE :10F22000000000000000000000008000000000005E -:10F2300000000000000000000000000000000000CE -:10F24000000000000000000000000000800280417B -:10F250001000041100000000000000000000000089 -:10F2600000000000208991898580854121090500E1 -:10F270000500051100000000000000000000000073 -:10F28000000000000000000000000000000000007E +:10F23000800000000000000000009190800589001F +:10F2400010020000000000000000000000000000AC +:10F250000000000000000000000000004185109147 +:10F26000090003031100400010001010C180118834 +:10F270000500C140000000000000000021910200D4 +:10F2800085009010030083118480051100000000A8 :10F29000000000000000000000000000000000006E -:10F2A0000000000000000000000000000400040056 -:10F2B00090000400000000000000000000000000BA -:10F2C0000000000000000000000000000000040238 -:10F2D0004002914082010000000000000000000098 -:10F2E0000000000000008902834008844000019073 -:10F2F000000000000001000000000000000000000D -:10F3000000000000000000000000000000000000FD +:10F2A000000000000000000000000000100004004A +:10F2B000080008000000000000000000C088A00452 +:10F2C0008200C000000000000000000000000000FC +:10F2D00000000000000000000000000000000188A5 +:10F2E0000183010201010000000000000000C1A034 +:10F2F0001108020008000000000000000000A1400A +:10F300000800082008008800A040858482000000D2 :10F3100000000000000000000000000000000000ED :10F3200000000000000000000000000000000000DD -:10F330000000000084000000000000000000000049 -:10F3400000000000000000000000000000000000BD -:10F35000000000E0070000000000000000000000C6 -:10F360000000000000000000818100E007000000B4 -:10F37000810000E00000000000000000000000002C -:10F38000000000000000000000000000000000007D +:10F3300000000000000000000000000000000000CD +:10F3400000E007008200000000E000000000000074 +:10F3500000000000000000000000000000000000AD +:10F36000810000E000008200000000E000000012C8 +:10F37000000000E0000000000000000000000000AD +:10F38000000000E000008400008200E00700500060 :10F39000000000000000000000000000000000006D :10F3A000000000000000000000000000000000005D -:10F3B000A890A894000000000000000000000000D9 -:10F3C000000000000000000000000000000000003D -:10F3D0000000FA0AC300F0F0F0F0000000000000A6 -:10F3E00000000000000000000000E9C1D5FD0000A1 -:10F3F000000000000000000000000000000000000D -:10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC +:10F3B000D70C140C0000000000000000000000004A +:10F3C00000F0D757C2C2404000000000000000001B +:10F3D000000000000000000000000000000000002D +:10F3E00000000000000000200020000000000000DD +:10F3F000000055153000000800000000000000006B +:10F400000000FDFDFDFD00000000F8FD0000FFAF65 +:10F41000FCFC0000000000000000000000000000F4 :10F4200000000000000000000000000000000000DC -:10F430000000AB93AB97000000000000000000004C -:10F4400000000000000000000000000000000000BC -:10F4500000000000FA0AFF00FAF2F2F200000000D9 -:10F460000000000000000000000000002A02163E1C -:10F47000010000000000000000000000000000008B -:10F48000000000000000000000000000000000007C -:10F49000000000000000000000000000000000006C +:10F430000000D70C140C00000000000000000000C9 +:10F44000000000F0D000C2D64054000000000000D0 +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F4700000000000555500000000000000000000E2 +:10F4800000000000FDFDFCFD40000000F8FD000054 +:10F49000FFAF0C0C000000000000000000000000A6 :10F4A000000000000000000000000000000000005C -:10F4B0000000000000FF000000000000000000004D -:10F4C000000000000000000000000000000000003C -:10F4D000000000000000000005067D3C7C3D0000AF -:10F4E0000000000000000000000000000000CFCF7E -:10F4F0003030C2FEC23E00000000000000000000EC -:10F5000000000000000000000000000000000000FB -:10F5100000000000000000000000000000000000EB +:10F4B000000000000000000000000000000000004C +:10F4C0000000000000000000C000D010000000009C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000202028281000100000005C +:10F50000000000000000000005000C000000505F3B +:10F5100055553C00140000000000000000000000F1 :10F5200000000000000000000000000000000000DB -:10F53000000000000000F5F5A0A0000000000000A1 -:10F5400000000000000000000000000000000000BB -:10F5500000000000000000000505050555005005ED -:10F56000000000000000000000000000000000009B -:10F57000FCFC0303C13DC13D000000000000000091 -:10F58000000000000000000000000000000000007B -:10F59000000000000000000000000000000000006B +:10F5300000000000000000000000000000000000CB +:10F5400000000000000080000000C000D01000009B +:10F5500000000000000000000000000000000000AB +:10F560000000000000000000000000000400000097 +:10F570000000000000000000A2A2AAAA10001000D3 +:10F58000000000000000000000C0000000000000BB +:10F59000D0DFD7D7B6A2968200000000000000009E :10F5A000000000000000000000000000000000005B -:10F5B000000000000000000000003000000000001B -:10F5C000000000000000000000000000000000003B -:10F5D000000000000000000000008061000600093B -:10F5E000000000000000000000000000000000001B -:10F5F000000000610E3DC015000000610005C0095B -:10F6000000000000000000000000000000000000FA -:10F6100000000000000000000000000000000000EA +:10F5B000000000000000000000000000000000004B +:10F5C0000000000000000000A020000A001500005C +:10F5D00000610002000D0000000000610006000D47 +:10F5E0000000000000000000000000000001C0005A +:10F5F000000000210002000D0000A0410004000DE9 +:10F6000000000000000000000000806150050015AF +:10F6100000000061003700990000000000000000B9 :10F6200000000000000000000000000000000000DA :10F6300000000000000000000000000000000000CA -:10F6400000000000000000000000000000000000BA -:10F65000000000000000000000000000BCBCBCBCBA -:10F66000A8FD0000000000000000000000000000F5 -:10F67000000000003333550A000000001BFF1B0090 -:10F68000F0FF505F000000000000000000000000DC -:10F69000000000000000000000000000000000006A +:10F6400000000000000000000000AAAA2D2D2C0FD1 +:10F650003CFF00000000000000000000000000006F +:10F660000000000000000000000000000F3C55FFFB +:10F6700055FF287DC300C300000000005F50FCFC64 +:10F6800028557D550000000000000000131313D31F +:10F69000000000AAEBFFEBFFAAFF505000000000A3 :10F6A000000000000000000000000000000000005A :10F6B000000000000000000000000000000000004A -:10F6C000000000000000000000000000000000003A -:10F6D000000000000000000000000000000000002A -:10F6E0000000A8A8000000000000000000000000CA -:10F6F000000000000000333355AA010000000FFF96 -:10F700000F00000FA0AF000000000000000000008C -:10F7100000000000000000000000000000000000E9 +:10F6C00000000000000000000000000000002D2DE0 +:10F6D0003CFF3CFF000000000000000000000000B4 +:10F6E00000000000000000000000000000000F3CCF +:10F6F000550000AA287D3F3F0303000000005F5033 +:10F700000C0C28007D00000000000000000010101C +:10F7100010D0000000AAE0F0EBFF005550500000B0 :10F7200000000000000000000000000000000000D9 :10F7300000000000000000000000000000000000C9 -:10F7400000000000000000000000000000000000B9 -:10F7500000000000000000000000000000000000A9 -:10F7600000000000C70486860000000000000000C2 -:10F770000000000000000000000000000000F10395 -:10F7800055555555AAAAAAAA00000000000000007D -:10F790000000000000000000000000000000000069 +:10F7400000000000000000000000000000004D4D1F +:10F75000FF3CAAFFF03CFF55AA000000000000009B +:10F76000000C3C3C00000000000000000000000015 +:10F77000F505FFF0FFF0F0AA3F30F5F54140C3403A +:10F7800028AA28AAFFAAF00000000000000000003C +:10F79000C300F0AA08085858FFFFFF0C0C0A0C0A17 :10F7A0000000000000000000000000000000000059 :10F7B0000000000000000000000000000000000049 :10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 -:10F7E000000000000000CB088A8A00000000000032 -:10F7F00000000000000000000000000000000A00FF -:10F80000F1035555558AA5A0A5A5000000000000EC -:10F8100000000000000000000000000000000000E8 -:10F8200000000000000020000000000000000000B8 -:10F8300000000000000000000000010001000100C5 -:10F840000080000000002000000001000100010015 -:10F8500001000000000000000000000000000000A7 -:10F860000000000300000000400000000000000055 -:10F870000000000000000000000000000000000088 -:10F880000000000000000100000001000000000274 -:10F8900000910002000200000000000000000003D0 -:10F8A0000000000000000000000000000000000058 -:10F8B0000000000000000000000000002000200008 -:10F8C00020000004000000000000000020002000D4 -:10F8D00020002000000000000000000000000000E8 -:10F8E0000000000000000000000000000000000018 -:10F8F0000000000200000000000000000000000006 -:10F9000000000000000040000400000204000000AD -:10F9100000900002000040000000000021000000F4 -:10F9200000000000000000000000000000000000D7 -:10F9300000000000000000000000000000000000C7 -:10F9400000000200000000000000000000000800AD -:10F950000000000000000000020000009000000015 -:10F9600084000000200000000000000002000000F1 -:10F97000000000000000000002000000000002097A -:10F9800002000809000002000800020000008400D4 -:10F9900084000040000088000000202102100200C6 -:10F9A000020002000200020000000000000000004F +:10F7D0004D4DC300AA00F03CAA00AA0000000000A2 +:10F7E0000000303C3C3C0000000000000000000035 +:10F7F0000000F5050F0000F0F0AA3F30050541407C +:10F80000C3402800280000AAF0000000000000000B +:10F810000000C3FFF0AA0D085D58FFFF0C0C0C0A96 +:10F820000C0A2000000000000000000000000000A2 +:10F830002000200000000000020000000200000084 +:10F840000000200000008800000010000000000000 +:10F850002000200000000000000084002000840040 +:10F8600084000002200000002000898020000200A7 +:10F8700000002000200002004082400240002000E2 +:10F88000200220022100010020002000200520008D +:10F890008405208020000000840002A002000000F7 +:10F8A0002000040000000000000000000000000034 +:10F8B00000000000009000000000000000000000B8 +:10F8C0000000000000000000000010000000000028 +:10F8D00000000002009000000090000800000000FE +:10F8E0000000000000000000400000004010000088 +:10F8F0000000400000000000800080118001000036 +:10F9000000020003000110002000000000000000C1 +:10F910000000000000104000000000000010000087 +:10F9200000000000000000000800000008000000C7 +:10F9300000000200000000000200000000000000C3 +:10F9400008000200020000000000000000000000AB +:10F950000000900000000000000000000000820095 +:10F96000000002000000000000050103000000008C +:10F970000000000000000200A0000404080002884B +:10F9800000002000000002080000000000000080CD +:10F99000000003000200A0008400010000800000BD +:10F9A00000008410000008000000000000000000BB :10F9B0000000000000000000000000000000000047 -:10F9C000000800000008000000000000020800001D +:10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 -:10F9E000000800000008800000000000000000087F -:10F9F0000000000000000000000000000000000007 -:10FA00000000001011000040000000000000004055 -:10FA100002000500118800000000050091000500AB -:10FA200003C0000000001000000000000000000003 +:10F9E0000000000000000000000000880800000087 +:10F9F00000C0000000000000000000008001800046 +:10FA00008011000080840000400100000000000020 +:10FA10000010008808000088008200C00800001064 +:10FA20000000008400000000004000000000000012 :10FA300000000000000000000000000000000000C6 :10FA400000000000000000000000000000000000B6 :10FA500000000000000000000000000000000000A6 -:10FA60000000000000000000200000000000040072 -:10FA70000000000000000000000000000000000086 -:10FA80000000000000000000000000000000000076 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000000000004002000000000000032 -:10FAB000000800000000000000000000000000003E +:10FA60000000000000000000000000000000000096 +:10FA700000800000000000000000000000080021DD +:10FA80000005000000000000000000000105000863 +:10FA90008405001000000008004100410021000022 +:10FAA000000800000005000000030008000000003E +:10FAB0000000000000000000000000000000000046 :10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000000026 -:10FAE0000000000000000000001080000000000086 -:10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB200000000000000000000001000000000000D4 -:10FB30000000000000000000000000008200000043 -:10FB400000000000000000000000000000000000B5 -:10FB50000000000000000000004000000000000065 -:10FB60000000000000000000000000000000000095 -:10FB70000000000000000000000000000000020083 -:10FB800000000200000000000000000000008200F1 -:10FB900000000002000900040040000400090011F8 -:10FBA00000004004004100040000000400000004C4 +:10FAD00000000000000000000000400000000000E6 +:10FAE000000000000020000800000084000000006A +:10FAF00000000010000000000000000000000000F6 +:10FB00000000000000002100008400000000100040 +:10FB1000000000A00008210800C0038203A00088A4 +:10FB200003000000000000000000008400840000CA +:10FB300000000000000000000000000000000000C5 +:10FB40000000C000000000000000000000000008ED +:10FB50000000000000000000000000000000100095 +:10FB600000000000A00000000000040004000000ED +:10FB700000000000000000050003000082000000FB +:10FB800000000000000000000003004140004008A9 +:10FB90000000840040400000000000000009000058 +:10FBA000200008000800880000040000C0000800D1 :10FBB0000000000000000000000000000000000045 :10FBC0000000000000000000000000000000000035 -:10FBD0000000000000000000000000000000000025 -:10FBE000000000000000000000000000090000000C -:10FBF0000000000000000000000000000000000005 -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000000002100000000000000C3 -:10FC20000040000000010000000121000901210046 -:10FC300000010000000000000000000000000000C3 -:10FC400000000000000000000000000000000000B4 -:10FC50000000000000000000000000008400000020 +:10FBD000000000000000000800000000000000001D +:10FBE0000000000000000000000000000000000015 +:10FBF0000000009000C00000008200000000000033 +:10FC00000000000000000000000000000000800074 +:10FC1000800000020000004000000000008800009A +:10FC2000000020040000090000000800000000405F +:10FC300000000000000000000000000000000000C4 +:10FC400010000000000000000000000000000000A4 +:10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 -:10FC70000000000000000000000000000000000084 -:10FC80000000000000000000000000000000000074 -:10FC9000000000000000020008000000000040001A -:10FCA0000003000040000004100000000000840277 -:10FCB000000200040000000000000000000000003E +:10FC7000000000000000000000210000000300035D +:10FC80000008820300080000C021002100030000DA +:10FC900000400040000000802004000800009000A8 +:10FCA000004100000000000800000800A00000055E +:10FCB00010001041000000000000000000000000E3 :10FCC0000000000000000000000000000000000034 -:10FCD000000000000000000008000000000000001C -:10FCE0000000000000000000000000000000000014 -:10FCF00000000000000000000000080000000000FC -:10FD000000000000000000000000000000000000F3 -:10FD100000C00000000021000000210000200000C1 -:10FD20008000000000008000000180000000000052 -:10FD300000000000000100000000000000000000C2 -:10FD400000000000000000000000080000000000AB +:10FCD0000000000000000000000000000000000024 +:10FCE000000000000000000000C00800000000004C +:10FCF00000000000000003002100000021000000BF +:10FD00000000000000000010400000000000080893 +:10FD100000000000008200880008000100080000C8 +:10FD200000000000210000C0000003A000840400C7 +:10FD3000088200A020000000000000000000000079 +:10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000000000000000000093 -:10FD70000000000000000000000000000000000083 -:10FD80000000000000000000000000000000000073 -:10FD900090000000900040000000400000000000C3 -:10FDA0000009000000002000400040414000000029 -:10FDB0000000000400080021000000000000000016 +:10FD60000000000010000000000000000000200063 +:10FD70000200000002000000000000000000000877 +:10FD800000080000000500080800000090080000BE +:10FD900000030041002100002005000800081004B5 +:10FDA0002008000020100009200400410005001177 +:10FDB0009004024004400002000000000000000027 :10FDC0000000000000000000000000000000000033 :10FDD0000000000000000000000000000000000023 :10FDE0000000000000000000000000000000000013 -:10FDF00000000000000000000000000000002000E3 -:10FE000000000000000800000000000000000000EA -:10FE100000080000000000000000000000C000001A -:10FE2000000000000040000003000000200000006F -:10FE300000040004000100080000000000000000B1 +:10FDF0000000000000000000000000000000000003 +:10FE00000000000000000000000080000000000072 +:10FE10000000000000000000000080000001000160 +:10FE200080010000200000010000000000840000AC +:10FE300000000000000000000000000000000000C2 :10FE400000000000000000000000000000000000B2 -:10FE500000000000000001000000000000000000A1 -:10FE60000000000000000100000000000000000091 -:10FE70000000000000000100000000000000000081 -:10FE80000000000000000000000000000000000072 -:10FE900000000000000000000000000010A000842E -:10FEA00000A0840800000000A00000000001000085 -:10FEB00084000000000005000400000100000000B4 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000004110408869 +:10FE800008401088000000000000000009C09140F8 +:10FE900000A0C0830000100000010000010101006B +:10FEA000900000008810A04000828820400804884C +:10FEB000002088A0000000000000000000000000FA :10FEC0000000000000000000000000000000000032 -:10FED00000000000000000004000000000000000E2 -:10FEE00000000000000000004000000000000000D2 -:10FEF00000000000000000004000000000000000C2 -:10FF000000000000000000000000000000000000F1 -:10FF10000000000000000000000000000000008061 -:10FF20000000000000000000090000000000004187 -:10FF30000020000400090000C12080100003000020 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000000012 +:10FEF00000000000000000000000000000008880FA +:10FF000091008080800000000000000000008482DA +:10FF1000C089001000880009030400030002114199 +:10FF2000092020410009008000800080008080803E +:10FF300000000000000000000000000000000000C1 :10FF400000000000000000000000000000000000B1 -:10FF5000000000000000002000000005000000007C -:10FF60000000000000000010000000100000000071 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 :10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 -:10FF90000000000000000000000000000000000061 -:10FFA00000000008800000004180050008022108D0 -:10FFB00000800000040408110080050040001003C8 +:10FF800080000040001000000000000000000000A1 +:10FF90000980000341A1048941801100400900A1AA +:10FFA000C180030010114189000000828009000017 +:10FFB00080058011808400800000000000000000A7 :10FFC0000000000000000000000000000000000031 :10FFD0000000000000000000000000000000000021 -:10FFE000000000000000000000010000000100000F +:10FFE0000000000000000000000000000000000011 :10FFF0000000000000000000000000000000000001 :020000040023D7 -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 -:10002000000090004001A0048200001000000000C9 -:100030000100004000000000000000C000000100BE +:100000000000080088058804028400000000000049 +:10001000000004C0100100A1C0A100C00000000049 +:10002000008908900300010111898800A003088459 +:100030000402040008880804841000000000000086 :1000400000000000000000000000000000000000B0 -:10005000000000000000000000000000A000000000 -:10006000000000000000000000000000A0000000F0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 -:10008000010000000000000000000000000000006F -:100090000000000000000000000000000000000060 -:1000A00000000000080400820088C08200000000F8 -:1000B00002010001000000008801010000000100B1 -:1000C00083010001000000000000000000000000AB +:1000800000000001030800218811C01100000000D9 +:1000900000000000201088A1A004880000000101D9 +:1000A000A00100000000010101010101090400A0FC +:1000B00088080208850400088808C0C00000000005 +:1000C0000000000000000000000000000000000030 :1000D0000000000000000000000000000000000020 -:1000E00000004000000000000000000000000000D0 -:1000F00000000300000000000000000000000000FD -:1001000000000300000000000000000000000000EC -:1001100000000000000000000000000000000000DF -:100120000000000000008080000000000580000347 -:100130000004000300400011104189211105000353 -:1001400040410821001100000000000000000000F4 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:10010000000000000001419000A00040809000002D +:10011000000000000000808980028004801000112F +:100120000808C10509100000410309091141C10077 +:1001300000000080808041800080008080000000FE +:1001400000000000000000000000000000000000AF :10015000000000000000000000000000000000009F :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F -:10018000000200000000000000000000000000006D -:10019000000000000000000000000000000000005F -:1001A00000000000000000000010000480808000BB -:1001B00002004104400010032182091108000311CC -:1001C000218511000500034100000000000000002F +:100180000000000000000001800880020080800064 +:100190000000000000000000C180A0912100832029 +:1001A00041914111050003404182111003000000FC +:1001B000000900A000800000000400100080000082 +:1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF -:1002000000000001000000000000000000000000ED -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000C0018284844043 -:100230000200010000010000010001C100010000F6 -:10024000010001400100000000010000000000006A +:1002000000000000000000000001040110100810B0 +:100210000800000000000000000041A08911110446 +:10022000110101A00001000001010189010101C0CB +:1002300000000200C009104010001001C00410406E +:1002400002000000000000000000000000000000AC :10025000000000000000000000000000000000009E -:100260000000000000E000000000000000000000AE -:100270000000000000E0000000000000000000009E -:100280000000000000E0000000000000000000008E -:10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000070000000000000000000000810000E0D6 -:1002C00000008400810000E0000041820000000086 +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000070048110000000000000000000000E01E +:1002A00007008800000000E000008800810000E0F6 +:1002B000000081000000000007004800000000006E +:1002C00007004811000000000000000000000000CE :1002D000000000000000000000000000000000001E :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD -:100320000000000000000000000000000000090DB7 -:10033000F9FD60FF00000000000000000000000068 +:100320000000907E907E00000000000000000000B1 +:1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D -:1003B0000D0DFDFD3C3C00000000000000000000B1 +:1003A00000010000901890180000000000000000FC +:1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC +:10041000000002102000008810840000000000008E :1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC -:1004400000000000000000000000000000000000AC +:100430000000000000000000000002102000008802 +:1004400010840210200000881084000000000000CA :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B00000000000FF009D0099999999000000003C +:1004A00000000000F6F60CFC1818181800000000F8 +:1004B000000000000000000000000000000000003C :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:10053000000000000000FF00FF0090999899000063 +:1005200000000000000006060CFC09096F6F0000C7 +:10053000000000000000000000000C0CCFCF000005 :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B -:10056000000000000000000000000000000000612A -:100570000007000D00000000000000000000006106 -:100580000007000D000000000000000000000061F6 -:100590000007000D00000000000000000000000047 -:1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C00000610006000D000000610004C009000089 -:1005D00000610004C00900000000000000000000ED +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000610006000D0000E7 +:1005A000000000000000000000412004000D0001D8 +:1005B00000410004000D000000000001C000000028 +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA -:1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:10064000000000FA00F3000000003A003A3A3F00D0 -:100650003F2A0000000000C343C300000000000068 +:1006100000000000000000000000000000003F1487 +:10062000031400000000000000003C0FFF553CC018 +:10063000FFFFFC0CF5F5C0CCC3CFF505FFF0F5F5D9 +:1006400050FA000000000000000000000000000060 +:10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A -:1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A -:1006C00000000000FAFAF3F3000020003400343494 -:1006D0003F003F2AFFFFF10000C341C300000000BC +:1006A0003FD703D700000000000000003C0F0055BA +:1006B00000C0FFFFFC0C0505000C030FF5050F0043 +:1006C000A0A050FA000000000000000000000000A0 +:1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000FF8A000002001E -:100750002000000055AA050D050D000000FF000057 +:100720000000000000000000000000000000000FBA +:10073000003CEBEB00C300000000000000005F0A7B +:10074000BEBEFF3C3CF000000000000000000000C6 +:100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C000000000000000000000000000FF8A0000A0 -:1007D00000000000FFFF55FF050505050000A0FF14 -:1007E0000000000000000000000000000000000009 -:1007F0000000000000000000010000800080008078 -:1008000001000100008000800000000000000000E6 -:1008100000000000000000000000000000000000D8 -:100820000003000000800000000000000000000045 -:1008300000000200020000000000000000000000B4 -:1008400000000000000000000000000000000002A6 -:100850000000000200000000000001000000008015 -:100860000000000000000000000000000000200068 -:100870000000000000000000000004000020202014 -:100880000020040004000020002000000000000000 -:100890000000000000001000000000000000000048 -:1008A0000000000000400004000200000000000002 -:1008B00000000004000040000004000200000000EE -:1008C0000000000000000000000000040000000024 -:1008D00000000000000003020000000040000000D3 -:1008E0000008000000000000000000000000000000 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000802000000000000000000DD -:1009100000000000000000000000001000000000C7 -:1009200000000000000000000004000000000000C3 -:100930000000001000000000000010000000000097 -:100940000000000000000200000000000010000095 -:100950000000000002000000004100000200000052 -:100960000000004100000008008400100084000026 -:1009700000000082000000100000001000100008BD -:1009800000000000000000C00000000000000000A7 -:10099000000000000000000800000000000800083F -:1009A000000000000000000000080001000000003E -:1009B0000000000000000000000800000200000825 -:1009C0000008000000000000000800000000000017 -:1009D0000000000000000000000800400040000887 -:1009E0000084000000000000000000000000000083 -:1009F00000000000000200000000001000000008DD -:100A000000000000000000000000000000000000E6 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000080000AE -:100A40000000100000000000000000000000000096 -:100A50000000000000000000000000000000000096 -:100A600000000000000000009000000000000000F6 -:100A70000000000000000000000041000000000035 -:100A80000000000000000000000000000300000063 +:1007B000000F003C282800C3AA82AAA0151F151FFD +:1007C0005F0A1414003C3CF0000000000000000030 +:1007D0000000000000000000000000000000000019 +:1007E00000000000000020001000000000000000D9 +:1007F00000000000000020002000000000000000B9 +:100800000000400040000400200000000000000044 +:1008100004000000000000002000000000000000B4 +:100820000002000020000000040020410000000041 +:10083000000000000000C00088002100200000002F +:1008400000800000200000002000210002000000C5 +:100850000000000000000000040020000010000064 +:1008600004000000000000001000400040000000F4 +:100870000000000000000000000000000000000078 +:100880000000400000000000000040000000008464 +:100890000000000000080000000000000000000050 +:1008A0000000000000000000000000000000000048 +:1008B0000000000020000000000000001000800088 +:1008C0000000000400000000000000002000000004 +:1008D00000000000000000200000000000000000F8 +:1008E0000000000000000000000000000000000008 +:1008F00000000000020000000000000000000000F6 +:1009000000000010080008000010001000000000A7 +:1009100000000000000000000000000000000009CE +:1009200000000009000000080008000500050000A4 +:1009300000000000000000000000000000000000B7 +:10094000200000080010000082100080001000004D +:1009500004000000A00000000000000000000000F3 +:10096000000000000200000800000000000000007D +:10097000000000000000000000080000001000005F +:1009800000000084000100400000000000000000A2 +:1009900000000000000000000008000000000088C7 +:1009A0000000000000000000000000100000000037 +:1009B0000000000000000000000000100000000027 +:1009C00000008004000000000010008800400000CB +:1009D00002400010000000000000040000880284B3 +:1009E0001108000803880300000000000000000058 +:1009F00000020000000000000000000000000000F5 +:100A000000000000000000000000000000000800DE +:100A100000020000002100000000000000000000B3 +:100A200000000008000500000000000000000000B9 +:100A300082000000000000000000000000008408A8 +:100A4000000800000100000000000000000090000D +:100A500000002008000000050008000000008200DF +:100A600000100000A00000000008000000000000CE +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD00000000008000011000000000000000300FA -:100AE0000000000000000082000000000000000084 -:100AF000000000000000A00000000000000008004E -:100B000008000000000000000000080000000000D5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000001100000000A4 -:100B400000000000000000000004000000000000A1 -:100B5000020000110041000000008809000208099D -:100B600008000000000400000011820300040000DF -:100B70000000000000A000000000000000000008CD -:100B8000000000000000000800000000000000005D +:100AB00000000000000800080084000000000000A2 +:100AC000000000000008100805A000A000080000B9 +:100AD000000000A0800000841182000000000000DF +:100AE0000084000200C0008221C00000004000001D +:100AF00000000000000000000000000000000003F3 +:100B000000000005000000000000000000000000E0 +:100B100000000000000000210000000000000000B4 +:100B200000000800000400000000100000000000A9 +:100B3000000000000800000084080000820000009F +:100B40000000004000000000000000040008000059 +:100B5000000004000004000900000005000000007F +:100B60000000004108008402000040410000000035 +:100B70000000000000000000000000000000000075 +:100B800000000000000000A0000000A00000000025 :100B90000000000000000000000000000000000055 -:100BA000000000000000000800000000000000003D +:100BA00000000000000000000000008400000000C1 :100BB0000000000000000000000000000000000035 -:100BC000009000000000000000080000000000008D -:100BD000000000000000000000000000090000000C -:100BE000110000000000000000A000000000000054 -:100BF000000000000000000000000800A00000004D -:100C00000000C00000000000C00000000000000064 +:100BC000000000000000000000000300008500019C +:100BD0000000024000000000000000000000410092 +:100BE0000000000000900000400000000000000035 +:100BF00000000000000000000000000000000000F5 +:100C000008000000000000000008000000000000D4 :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 +:100C40000000000000000000000000000000004163 +:100C5000000008000000000000000000000000008C +:100C6000002100000008000000000000000000005B :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 -:100C90000000000000000000000000002100000033 -:100CA0000300000000000000000000000000000041 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD00000000000100000080000110200000000E9 -:100CE00000000000000000000000200000000000E4 -:100CF00000000010000008000800000000000000D4 -:100D000000000000000000000000080000002000BB -:100D100000000000000004000000000000000000CF +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB000000000000008000808A000A000000000DC +:100CC00000000000008400000000000000000000A0 +:100CD00000100000801021100000000000C0001073 +:100CE00000000084008400A000C000A000000000FC +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D1000000000410000000800000000000000008A :100D200000000000000000000000000000000000C3 -:100D30000000000000000000002100000000000092 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D700000000000880000000000000000000000EB -:100D8000000000000000000000000000000800005B -:100D90000000000000000000000000000000000053 -:100DA000000000000000000000000000000800003B -:100DB00000840000000000000000000000000000AF -:100DC000000000000000000000900000000000088B -:100DD0000200000000000000000000000000000011 -:100DE0000000000000000000009000040000000867 -:100DF00000000090008200100000000000000000D1 +:100D300000000000000000000000000800000000AB +:100D4000000000000000000000000008000000217A +:100D500084000000000000000000004000000000CF +:100D6000004000000000000002218808002100026D +:100D700008004041000000000000000000000000EA +:100D8000000000000000000000080000000000005B +:100D90000000000041000000000000000000000012 +:100DA000000000000000000000080000000000003B +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000100000008291 +:100DD0000000000000000000000000000001000012 +:100DE00000000000000000000000002000000000E3 +:100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000100B1 +:100E300000000000000000000000000000000000B2 :100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000100000001000000000000000070 +:100E50000000000021000000000000000000000071 +:100E60000000000000000100000000000000000081 +:100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 :100EB0000000000000000000000000000000000032 -:100EC0000200000000000000000000000000000020 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF000000000000041000000040010000000009D +:100EC0000000000000000000000000000000000022 +:100ED00000000000000009002000000000000000E9 +:100EE00000000000000000001000000000000000F2 +:100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 -:100F100000000000000000000000008000000080D1 -:100F20000020008000000000000000000000000021 +:100F10000000000000000000000080000000000051 +:100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 :100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 +:100F5000000000000000008020001100418300001C +:100F60000000000000000020000000000000000061 :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 -:100F9000000000000000000000400000000400000D -:100FA00000400000000200000000000000000000FF +:100F90000000000000000000100008000200000037 +:100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 +:100FD000000000000000000000C0000001000189C6 +:100FE0000000000000880000000100000000000078 :100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 -:101010000000000000000000000000009000000040 -:10102000010000004000000000000000000000007F +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 :1010300000000000000000000000000000000000B0 -:1010400000000000A0000000000000000000000000 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 +:1010400000000000000000000000000000000000A0 +:10105000000000000000000000000001000000018E +:10106000010100000000000000000000000000007E :101070000000000000000000000000000000000070 :101080000000000000000000000000000000000060 -:101090000000000000000000000008000000000048 -:1010A0000000100000000000000000000000000030 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 :1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000001000E0 -:1011000009000000000000000000000000000000D6 -:1011100000000000000000000000000000000004CB -:1011200000000000000000050000000000000000BA +:1010D00000000000000000000000000000090020E7 +:1010E00000051141000000000000000000000000A9 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:10111000000000000000000000000000000000804F +:1011200000000000000000000000000000000000BF :1011300000000000000000000000000000000000AF :10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F +:1011500000000000000000000000000000004184CA +:1011600011004000004180008000000000000000ED :10117000000000000000000000000000000000006F :10118000000000000000000000000000000000005F :10119000000000000000000000000000000000004F -:1011A000000100000000000000000000000000003E +:1011A0000008000000000000000000000000000037 :1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F :1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF +:1011E00001880100000000011000080000008400D8 :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE :1012100000000000000000000000000000000000CE -:1012200000000000070000000000000007000000B0 +:1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE -:1012400000000000000000000000000000E00000BE +:10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E +:101260000000810000E00000884100000000000054 +:101270000000000000E0000000000000000000008E :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E -:1012E00000000000000000000000000000000000FE +:1012E0000000000000000000000000000014EBFF00 :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD @@ -143704,11 +143704,11 @@ :1013300000000000000000000000000000000000AD :10134000000000000000000000000000000000009D :10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D +:101360000000000000000000000000000000001469 +:10137000EBFF000000000000000000000000000083 :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D +:1013A0000000000000000000000055550F00000084 :1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D :1013D000000000000000000000000000000000000D @@ -143716,7 +143716,7 @@ :1013F00000000000000000000000000000000000ED :1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC +:1014200000000000000000000000000055550F0003 :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C @@ -143724,20 +143724,20 @@ :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C -:1014A0000000000000000000000005000A08050020 -:1014B00000A005000A08050000A0000000000000D0 +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C :1014C000000000000000000000000000000000001C -:1014D0000000000000610007000D00000000000097 -:1014E00000000000000000000000000000000000FC -:1014F00000000000000000000000000000000000EC -:101500000000000000000000000000000061000674 -:10151000000D0000000000000000000000000000BE +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000400005B7 +:1014F000C000000080000000000000000061000744 +:10150000000D0000000000000000000000000000CE +:1015100000000000000000000000000000000000CB :1015200000000000000000000000000000000000BB :1015300000000000000000000000000000000000AB :10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B +:1015600000000000000000000000000000000F0F5D +:10157000FF000FFF303F00000000000000000000EF :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B @@ -143745,7 +143745,7 @@ :1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB -:1015F00000000000000000000000000000000000EB +:1015F000FF00555500F0303F0000000000000000E3 :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA @@ -143753,154 +143753,154 @@ :10164000000000000000000000000000000000009A :10165000000000000000000000000000000000008A :10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A +:101670000000000000000FFFA0AF0000000000000D :10168000000000000000000000000000000000005A -:10169000000017173F3F000000000000000000009E +:10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A :1016C000000000000000000000000000000000001A :1016D000000000000000000000000000000000000A :1016E00000000000000000000000000000000000FA -:1016F00000000000000000000000000000000000EA +:1016F000000000000000000000F0A0AF00000000AB :1017000000000000000000000000000000000000D9 -:101710000000000017170303000000000000000095 +:1017100000000000000000000000000020000000A9 :1017200000000000000000000000000000000000B9 -:101730000000000000000000000000800000000029 -:101740000000000000000000000000000000000099 -:1017500000000000100000000000008000030000F6 -:101760000000000000000000000000000000000079 -:1017700000000000000000000000000000800000E9 -:101780000000000000000000000000000000000455 -:101790000000000000000000000000000100000048 +:101730000000000000000000000000802000000009 +:101740009000A00000000000000040000000000029 +:1017500000000000000000000000008000032000E6 +:10176000000020000000000000000000C000000099 +:101770000000000000000000000000008880200041 +:101780000000820000000000840000082008000023 +:1017900000000000000000000000000020800000A9 :1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000004000025 -:1017C0000000000000000000000000000004000015 -:1017D0000000040000000000000000900004000071 -:1017E00000900000000000020040004000020000E5 -:1017F0004000000000C000000000000400000004E1 -:101800004000000000000000000000000000000098 -:1018100000000000000000000000000000002000A8 -:1018200000000000000000000000000000000000B8 +:1017B00000000000000000000000000020044000C5 +:1017C0000082000000000000000000000000008215 +:1017D00040C0008400840084000021000004000058 +:1017E0000000000000000000404000000000400039 +:1017F00000000000000000000000000000400004A5 +:101800004000000000000000000000024000040052 +:1018100000000000000000000000000000000004C4 +:1018200000000000000000000000A0000000000018 :1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000001000000010000058 -:101870000000000000000000000000000000000068 -:101880000000000000000010000000410000000007 -:101890000000000000408441000000000000000043 -:1018A0000000000000000000000000000008000030 -:1018B000000000880084008200000008000000088A -:1018C00000000000000000000000000000C0000058 -:1018D00000000000000000000000000800000008F8 -:1018E00000000000000800000008000000000000E8 -:1018F00000000000000000000000000000080010D0 -:101900000084000000080000000800000000000043 -:1019100000C000C0000000000000000000A00000A7 -:101920000000000000210021002100210000002112 -:1019300000000021002100210021002100000003FF -:1019400000000021002100210021002100000021D1 -:1019500000000021002100030021002100000008F8 -:1019600000000021000000210000002100210041B2 -:1019700000000000002100210000002100210000E3 -:10198000002100000021002100000021C0210000F2 -:1019900000052005202100030000000520090000AB -:1019A0000000000000030000000000000000000034 -:1019B00000000000000000000000008200000000A5 -:1019C000000008000000000000000000000000000F -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 +:101840000000000000000000000000400000000058 +:101850000000001000000000000000000000000078 +:101860000000000008000000001000000000000060 +:101870000010000000000000000000000000000058 +:101880000041000000000000000000000010000007 +:1018900000000000000000008400000000000009BB +:1018A000000000000000000800820000008400002A +:1018B000000000080000000000000008008400088C +:1018C0000000000000000008000800080000000000 +:1018D00000000084000000000000008400080008F0 +:1018E00000000000000000000008000800C0000028 +:1018F0000040000000000000000000080008008810 +:10190000000800000000000000C000080000000007 +:1019100000000000000000000000000800040000BB +:101920000008000800210000002100210000002123 +:10193000000000210021900000210021000000088B +:101940000000002100210002002100210000000908 +:1019500000080221000290030021902100000000F5 +:1019600000000021000000210000002120210021B2 +:101970000000000000020003C00000050002000398 +:10198000000000000008000000000000000000004F +:101990000000002000000000000000000000000027 +:1019A0000000000000000000000000000000000037 +:1019B000000000000000000800000000000000001F +:1019C0000000000000000084000000000000000093 +:1019D00000000000000000A0000000000000000067 +:1019E00000000000000000000000090000000000EE +:1019F0000000000010000000000041002100000075 :101A000000000000000000000000000000000000D6 -:101A10000000000000000040000000000000000086 -:101A20000000000000900000000000000000000026 +:101A100000000000000000001100000000000000B5 +:101A200000000000000000100000000000000000A6 :101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000050000000091 -:101A50000000000000000000000000000000000086 -:101A60000000000000110000000000000000000065 -:101A70000000000000000000000000110000000055 -:101A80000000000000000000000000000010000442 -:101A900000000000002000400000000000110011C4 -:101AA00000004041000400000011000000000000A0 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000084000000000000000092 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 +:101A4000000000000009000000000000000000008D +:101A50000000000000000000000000008400000002 +:101A600000000000000000000000000000008200F4 +:101A700000040000000000000800000000008200D8 +:101A800000000004000400000000000000008200CC +:101A900000000000C00000080000840084008211E3 +:101AA000400000000000A000000000000000000056 +:101AB0000000000000000000000010000000000016 +:101AC0000000008400000082000000000000000010 +:101AD00000000000000000000000001000000000F6 +:101AE0000000000000000000008400000000000072 :101AF00000000000000000000000000000000000E6 -:101B0000000000000000000000000088000000004D -:101B10000000000000002004200000000000200061 -:101B200000002020049000000000000000000003DE -:101B3000000000000041000800000000000000005C -:101B4000000000000000002100000000000800006C -:101B50000000000000000000000000000000000085 -:101B60000000000000210008000000000000000844 -:101B70000000000000000000002100000000000044 -:101B80000000000000000800001000000000000835 -:101B90000000000000000000000500000000000040 -:101BA0000000000800000000000000000008000025 +:101B000000000000000021000000000000000000B4 +:101B100000000000000000002100000000000000A4 +:101B20000000000020000400000000000000000091 +:101B30000008000000000005000000000000000098 +:101B40000000000000000008002100030000002148 +:101B5000000800000000000000000000000000007D +:101B6000000400080008000000000003000000005E +:101B700000000008080000000000C0000000000095 +:101B80000000000400000000000000000040000011 +:101B900000000800000400000000A0000400000095 +:101BA0000000000400000000000000000000000031 :101BB0000000000000000000000000000000000025 -:101BC000000000000000000008000000000000000D -:101BD00000000000090000000000000000000000FC +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 :101BF00000000000000000000000000000000000E5 :101C000000000000000000000000000000000000D4 -:101C10000000000000000020000000400000000064 -:101C200000000000000000000000000000000004B0 -:101C3000000000000000000000000008000000009C -:101C40000000000000000000000800030008000081 -:101C50000000000000080000000000040000000078 -:101C60000000000000000000000800030008000061 -:101C70000000000000000000000000000021000043 -:101C80000000000000000000000000080003002128 -:101C9000000000000000000000000000000500003F -:101CA000000000000008000800000002000000081A -:101CB00000400000410000000000000000000000A3 -:101CC0000000000000000000000000000000000014 +:101C100000000000000400000000110000C00000EF +:101C200000000000000000000000000000000000B4 +:101C30000000000000000008000000050000000097 +:101C4000000000210000000000080021000000004A +:101C5000000400000000000000030000000000007D +:101C6000000000000000000000210008000000004B +:101C7000000000000000000000050000000010004F +:101C800000210000040000000000000300410021CA +:101C900000000000000020000000000040000000E4 +:101CA000080000000000C0000000000082000000EA +:101CB000000000000000000000000008000000001C +:101CC0000000000000000000008200000000000092 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 :101CF00000000000000000000000000000000000E4 -:101D000000080008000000000000000000000000C3 -:101D100000000000000000040200000400040000B5 -:101D20000040000400000000200020840920202042 -:101D30000000204000000000000000000000000043 -:101D40000000000000000000000200000000000091 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D20002000000000000000000000002000000073 +:101D300000000000000000000000000000000000A3 +:101D4000000000000001010000C0000000000000D1 :101D50000000000000000000000000000000000083 -:101D60000000000000000000000200000000000071 +:101D6000000000000000000000C0000000000000B3 :101D70000000000000000000000000000000000063 -:101D80000000000000000000000000020000000051 +:101D80000000000000000000000000C00000000093 :101D90000000000000000000000000000000000043 -:101DA000000000000000000000000008000000002B +:101DA0000000000000000000000000C00000000073 :101DB0000000000000000000000000000000000023 -:101DC00000000000000000091000000000000000FA +:101DC0000000000000000808030000000000000000 :101DD0000000000000000000000000000000000003 -:101DE00000000000000000091000000000000000DA +:101DE00000000000000008110900000000000000D1 :101DF00000000000000000000000000000000000E3 -:101E000000000000000000000009100000000000B9 +:101E000000000000000000000811090000000000B0 :101E100000000000000000000000000000000000C2 -:101E20000000000000000000110910000080000008 +:101E20000000000000000000081105000000000094 :101E30000000000000000000000009000000000099 -:101E40000000000000000000020009000080000007 -:101E50000000000000000041000009000000000038 -:101E600000000000000000000200090000800000E7 -:101E70000000000000000040000000000900000019 -:101E800000000000000000000000020009000080C7 -:101E90000000000000000000002000000900000019 -:101EA000000000000000000000000200820000802E -:101EB00000000000000000000040000000000000E2 -:101EC00000000000000000000000880002C00008C0 -:101ED00010000200000000000001000000000000EF -:101EE00000000000000000000000880002C00008A0 -:101EF00010000200000000000001000000000000CF -:101F0000000000000000000000000000880002C087 -:101F100000081000020000000000000100000000A6 -:101F2000000000000000000000000000880010C059 -:101F30000040C00088000000000000010000000018 -:101F40000000000000000000000000000088000009 +:101E40000000000000000000090082800080008087 +:101E50000000000000000011000041000010000020 +:101E600000000000000000000900908000800000D9 +:101E70000000000000000009000000001000000049 +:101E800000000000000000000000090090000000B9 +:101E9000000000000000000000040000020000003C +:101EA000000000000000000000000800908000809A +:101EB000008000000000000000040000000000009E +:101EC000000000000000000000000200201000C020 +:101ED00004100200000000000000000000000000EC +:101EE000000000000000000000000200201000C000 +:101EF00004000200000000000000000000000100DB +:101F0000000000000000000000000000100021C0E0 +:101F1000002004001000000000000001000001008B +:101F2000000000000000000000000000210021026D +:101F30000084820490000000000000000000000007 +:101F40000000000000000000000000000010000081 :101F50000000000000000000000000000000000081 :101F600000000000000000000000000000880000E9 :101F70000000000000000000000000000000000061 -:101F800000000000000000000000000000000088C9 +:101F80000000000000000000000000000000001041 :101F90000000000000000000000000000000000041 -:101FA00000000000000000000000000000000088A9 +:101FA00000000000000000000000000000000090A1 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 :101FD0000000000000000000000000000000000001 @@ -143911,29 +143911,29 @@ :1020200000000000000000000000000000000000B0 :1020300000000000000000000000000000000000A0 :10204000000080000091000000000000000000007F -:10205000004100000011000000000000000000002E -:102060000000800900830000000000000000000064 -:10207000004180000011000000000000000000008E -:10208000000000008000009100000000000000003F -:1020900000000041000000110000000000000000EE -:1020A000000000008000009100000000000000001F -:1020B00000000041000000020000000000000000DD +:1020500000418000000200000000000000000000BD +:1020600000000010008300000000000000000000DD +:10207000004100000002000000000000000000001D +:1020800000000010800000C10000000000000000FF +:10209000000000C100000009000000000000000076 +:1020A00000000000000200830000000000000000AB +:1020B000000000410000004100000000000000009E :1020C00000000000080000100000000000000000F8 -:1020D00000000005020000000000000000000000F9 -:1020E0000000000008000083000000000000000065 -:1020F00000000005100000000000000000000000CB -:1021000000000000000008000010000000000000B7 -:10211000000000000005C0000000000000000000FA -:102120000000000000000800001000000000000097 -:10213000000000000005C0000001000000000000D9 +:1020D00000000005080000000000000000000000F3 +:1020E000000000001000008300000000000000005D +:1020F00000000003200000000000000000000000BD +:10210000000000000001200000400000000000006E +:10211000000000000011400000000000000000006E +:1021200000000000000082010083000000000000A9 +:10213000000000000021400000010000000000003D :10214000000000000000000000000000000000008F -:1021500000000000810000E00000480000000000D6 -:10216000000000120000000000000000000000005D -:1021700000000000810000E00000480000000000B6 +:1021500000000000810000E0000048820000000054 +:10216000000000000000000000000000000000006F +:1021700000000000810000E0000048820000000034 :10218000000000000000000000000000000000004F :10219000000000000000810000E000004800000096 :1021A000000000000000000000000000000000002F -:1021B000000000000000810000E000004800000076 +:1021B000000000000000810000E000004806000070 :1021C000000000000000000000000000000000000F :1021D00000000000000000000000000000000000FF :1021E00000000000000000000000000000000000EF @@ -143967,4277 +143967,180 @@ :1023A00000000C4000000000000002C06A86615678 :1023B00003400000000000000230A0000000000008 :1023C00000000C4000000000000002C06A8600000F -:1023D00088002000000000002000200020002000D5 -:1023E00000002000200000000000000000000000AD -:1023F000200000000000000020002000200020003D -:10240000000020002000000000000000000000028A -:1024100000002000000000000200200020802000BA -:102420002000000020002000000000000200000446 -:102430000080200082040000000020002000200016 -:10244000200000002000200200000000000000002A -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C -:10247000000000020000000000000000000000005A -:1024800000004000000000000000000000000040CC -:1024900000000000404000400000C00000000010AC -:1024A00000004000000000040004000000000004E0 -:1024B00000000010000000000000000000400000CC -:1024C0000000000000000002000100000000000009 -:1024D000000000400140000000200000000000005B -:1024E00000000000020000090040000000000000A1 -:1024F0000040000000000040084002000000020010 -:1025000000000200080000000000000000000010B1 -:1025100000000001004000400000004000000040BA -:1025200000000000020000000000000900000000A0 -:102530000000000000000200000000050000000094 -:10254000001000008200000000400000000082092E -:1025500000410040000104010000000100080000EB -:10256000000800080010000800000000000800003B -:1025700000840000000000000000000000080000CF -:102580000008000800000008000000000008020029 -:102590000000000000000000000000000000000833 -:1025A000000102080008000000080000000000848C -:1025B00000000000000000001110040000C000082E -:1025C00000000008020800000084000000000088ED -:1025D00000000000030000000000000000000000F8 -:1025E00000000000000000000000000000000000EB -:1025F0008200000000000000000000000000000059 -:1026000000000021000000000000000000000000A9 -:1026100000000003000000000000000000000000B7 -:102620000005000000100000000000000000001085 -:102630000008000000000000002100000000000071 -:102640000021000000000000004100000000000523 -:1026500000030020008001000000000000000000D6 -:10266000000000000000000000000000000000006A -:102670000008000000A000000000000000000000B2 -:10268000000000000000000000000000000000004A -:1026900000080000008200000000000000000000B0 -:1026A0000000000000000001100000000000000019 -:1026B000000000A0000000820000000000000000F8 -:1026C0000000000000000000000000000088000280 -:1026D0000000008200010010040000C000A0008083 -:1026E00000800000A00000000000000000000000CA -:1026F00000000000000000000000000000000000DA -:1027000000000000000000000000000000000000C9 -:102710000000000000000021000000000000000098 -:102720000000000000000000000000800000000029 -:10273000000000000000000000000000002100096F -:102740008800000088058811000000110040000387 -:102750000000000300C00041010900C00021002169 -:102760000020004000000000000000000000000009 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 -:1027A0000000000000080000000000000010000011 -:1027B0000000000000000000000000000000000019 -:1027C000050009000004000000A02100200009000D -:1027D00021100000000400214190080005210000A4 -:1027E00000000020000000000000000000000000C9 -:1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000000000000B8 -:1028200000000008000000000000000000000000A0 -:102830000021000000000000000000000000000077 -:102840000000001000000000000000000000000078 -:10285000000000009000000000400000091000008F -:10286000000000000001000000080000000000005F -:102870000000000800000000000000000000000050 -:102880000000000008000000000800000000000038 -:102890000000000800000000000000000000000030 -:1028A0000000000000000000000000080000000020 -:1028B0000000000000080000000000000000000010 -:1028C0000000000000000000000000080000000000 -:1028D0000000000800A0000000000001000004014A -:1028E000000001800980010001800000000000005C -:1028F00000000000000000000000000000000000D8 -:1029000000000000000000000000000000000000C7 -:1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 -:102930000000000000210000000000000000200056 -:1029400000000000000000002000000000008800DF -:102950000000004100114000400000000080009194 -:1029600001890084022002400400044000000000AD -:102970000000000000000000000000000000000057 -:102980000200000000000000000000000000000045 -:1029900000000000000000000000000000A0000097 -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C00000000000000000000000090000000800F6 -:1029D00000000004000002001188118400000010B3 -:1029E00040200820402000C0000400209002000089 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 -:102A200000000000000000000000000000000000A6 -:102A3000020000000000C0000000000000000000D4 -:102A400000000000000000000090000400400002B0 -:102A500000000000000000000000010088000000ED -:102A600041A0208800908400008000800000008049 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000002000000008084 -:102AD00000000000000000000000000008000000EE -:102AE00000008900800000000000000000000000DD -:102AF0008000000000000000000000000000000056 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000800080000000000095 -:102B40000000000000000000000000000000000580 -:102B50000000000000000000000000000000000075 -:102B600040001000000000008084000020000000F1 -:102B70000000C00000000000000000000000000095 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB00000000000000002002000A000C000000093 -:102BC0000000000000000000000000000000000005 -:102BD0000000008400000000000000000000000071 -:102BE0000000000000004000044004C0A0020100FA -:102BF0000020000200C000000000000000000000F3 -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 -:102C3000000000000000000000C00010008400C080 -:102C40000000000000000000000000000000000084 -:102C500088000000000008000000000000000000E4 -:102C60000001000000010001010000C0848485C053 -:102C70002000000000800080000000000000000034 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000080000000000000000000000000000084 -:102CD0000000000000000000800000000000000074 -:102CE00000000010000900210003400000000080E7 -:102CF000A1800000004000800000000000000000F3 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000008013 -:102D40000000000000000000000000000000000083 -:102D500000000000000080000000000000000000F3 -:102D6000000000000080002000000010000000C1F2 -:102D70008011000000000090000200000000000030 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC00000100000000000000000000000000000F3 -:102DD000000000000000C000A000C00008000000CB -:102DE00000000000000000C0000100000000000022 -:102DF000A00508C18200000600004300000000009A -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000420020 -:102E700000000000070082820000000000F000FF58 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC000000000000000002400400000000000009E -:102ED00000000000000000000000206666660000A0 -:102EE00000000000000000000000000000000000E2 -:102EF000000060206020000000000000000000F0E2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F500000000000000000000000000020660000EB -:102F60000000000000000000000000000000000061 -:102F70000000000060206020F00009000000000058 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000303CB -:1030000000C30000000000000000000000000000FD -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:10304000000000000000000000000000001800095F -:103050000000000000000000000000000000000070 -:10306000BFFF0000000000000000000000000000A2 -:1030700000000000000000000009009900000000AE -:10308000030300C366663C3C000000000000000033 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C00000000000000000000000000000000018E8 -:1030D00000090000000000000000000000000000E7 -:1030E0000000BFFFBFFF0000000000000000000064 -:1030F000000000000000000000000009009900012D -:10310000000005002038004000080000000000001A -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:1031500000900005000000000000000000000000DA -:10316000000000000000000000000000000000005F -:103170000000000000610006000D000005004A0884 -:10318000059000A00000000000000000000000000A -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000FF08FF38000091 -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F0000000000000000000000000000000FF00CF -:103300005500000000000000000000000000000068 -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:10338000FFFF555500000000000000000000000095 -:10339000000000000000000000000000000000002D -:1033A00000000000000000000000200000000000FD -:1033B000000000000000000000000000000000000D -:1033C00000000000000003000100200400030000D2 -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000020000000BD -:1033F00000000080000000000010000000000080BD -:103400000000010000000000000800800002000031 -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C -:10344000000000000000000020002000000100003B -:103450004002000000000000000000000002000028 -:10346000400000000000000000000000000000001C -:1034700000000000000200020000008300000002C3 -:10348000401000004000000000000000002000018B -:1034900000000080000000000000000000000000AC -:1034A00000000000000000000000000000400000DC -:1034B0000000820000000000020000000000000088 -:1034C000000000000000000000000000004120009B -:1034D000000000000000004090000000000000001C -:1034E0000000820000000010004002000200000006 -:1034F000004002000000000000000000000000008A -:10350000000000008205824002000020020000004E -:1035100002000000000200000000000400000000A3 -:10352000000000000000000000080000000800008B -:103530000084000000000000000000000000000007 -:10354000000000000000000000400000001000002B -:1035500080000000000000000000000000000000EB -:103560000000000002000000000000000010000049 -:10357000000800000000000003C000000000000080 -:10358000050000000000000000000900000100002C -:1035900000880000000000000000000000000000A3 -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C00000000005000000000000000000000000F6 -:1035D000000090000000000010000000000000004B -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000009000000000000C2 -:103600000000000000000000000000210000002079 -:10361000002000000080000000000000000000000A -:10362000000000000000000000000000000000009A -:10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A -:103650000000000000000000000003000000000067 -:103660000000000000000000000000A000000000BA -:103670000000080000000000000000000000000042 -:103680000000000000000000000000000000030037 -:103690000001000100020020A00000000000000066 -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000005020000050000EE -:1036D00000020111000000000000000000000000D6 -:1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000500100000B5 -:103700000200020000414000000010002000A00262 -:103710008300001000100010001000000090000056 -:103720000000000000000000000000000000000099 -:103730000000000011000000000000000000000078 -:103740000000000000000000000000000000000079 -:103750000000000120000000004000000000000008 -:10376000000800C000000000000000000000000091 -:103770000000000000000800000000000000000041 -:1037800000000000004000C0A082028280C09100C2 -:103790000090200002C1000902A100010200000007 -:1037A0000002020000000000000000000000000015 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00020000000000000000004000000000000C5 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:103800000000000000000000402100000000000354 -:1038100020058805A003C0039021C082088980008C -:10382000050005018000000000000000000000000D -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000010000000067 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000008800002000000080000000000010 -:103890000000800000A021C00000210000200020C6 -:1038A0000000020002000000001000000000000004 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D0000000020000000010010801800108010042 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:103900000000000000000000000000402000400017 -:10391000024000410241002140092041008900216C -:10392000A1001100800091020000000100000000D1 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:1039500000000000000000000000400020042000E3 -:1039600020C0000000000000000000000000000077 -:103970000000000000000000000000000000000047 -:10398000000000000000020400100000000000021F -:1039900000001184000000C00590219009820020E1 -:1039A0000988048400012090408202010000000088 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000001002100C5 -:1039E0009000000000000000000000000000000047 -:1039F00000000000000000000000000000000000C7 -:103A0000000000000000000004010001000000A010 -:103A10000008000800200091010440100004A008E4 -:103A200090C090A0881011400503801080210000F4 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000101046 -:103A6000C105800000100000000000000000000000 -:103A70000000000000000000000000000000000046 -:103A800000000000000000000000002000080011FD -:103A900000800080008000000208411080890091B1 -:103AA000038009000080008020801000200003A017 -:103AB0000000000500800000000000000000000081 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE0001080080011000803000000000000000022 -:103AF00000000000000000000000000000000000C6 -:103B0000000000000000000000000400210004008C -:103B10000803418010021008102020000805020050 -:103B2000411000000021808080000182219001006E -:103B300000820000000000040000000000000000FF -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000011001000100010100000000000040 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000010010024 -:103B90000100000100080000000101000104010013 -:103BA00000820100C000C082A00890040000010152 -:103BB00002A0000100000000000000000000000062 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 -:103BE00000000000000101010100000100000000D0 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C1000010000000000080000000000C000C0011A -:103C2000000001011101C1020084849005C0400020 -:103C300002208020002000000000000000000000A2 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000010401105410411000098 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C9000000008000000000080000000000000009C -:103CA000800902104003910882C00003809004093B -:103CB000092103404100030500008000800000004E -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE000000000000000000021A1110008001111D7 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000921210002000908820891004100E9 -:103D20000803210991098300084100040020008054 -:103D3000800000212001A0C001004000020002001C -:103D40004000000000000000000000000000000033 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000001A101000100AF -:103D70000101000000000000000000000000000041 -:103D80000000000000000000000000000000000033 -:103D900000000000001100000000000110202000C1 -:103DA000820001000310A100050083010800024009 -:103DB00090C088000000000000000000000000002B -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE000000000000000000000000000600000E093 -:103DF0000000410000000000000000000000000082 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E2000000000000000810000E00000841200811A -:103E300000000700820A0FF00FF000FF00FF0100F2 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA000FF0F000000000000AA28AAA800000000E0 -:103EB0001C1C0000000000000FF00FF0FF00FF00CE -:103EC00041000000000000000000000000000000B1 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000FF0FFF0F00000000820082800000F1 -:103F300000003C1C00003C3C3C040FF00FF00F0F55 -:103F40000F0F000000000000000000000000000053 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000004050F0F00000000C2C2C2FAAA -:103FB000000000000002000F505555550FF00FF0A3 -:103FC000F0F0F0F000000000000000000000000031 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:1040200000000000000004000F0F00000000FAC2B2 -:10403000FAFA00000000000F000F5155555540617D -:104040008006002D080200000000000000000000B3 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 -:1040700000000000000000610004C001000000001A -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A00000610006000D000000610006000D000028 -:1040B00000610004C009000005614A3E050D00A032 -:1040C000CF45CFCFAFFF0FAF0000000000000000D2 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F0000000000000000000FF007D823DC3C33CC3 -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:104120000000040F0C0F0000000041C300C300009A -:1041300000000000F757EBE0EB0B000000007F00F1 -:104140004F00030103030A0F000A000000000000F3 -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:1041700000000000000000000000FB047F00FE00C3 -:1041800000FF000000000000000000000000000030 -:10419000000000000000000000000000000000001F -:1041A00000000000040F000F0000000001C300C366 -:1041B000000000000000FD5500E0000000000000CD -:1041C0007F7F4F4F7450F574D150F5D1000000003F -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F0000000000000000000000000000000D7FFE9 -:1042000000FF827D000000000000000000000000B0 -:10421000000000000000000000000000000000009E -:10422000000000000000E0EBE0EB0F0B0F010000CE -:1042300000000A0A0A0F8000000000400000000091 -:104240000000000000007450F5745050F55000005C -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000FFFF54AA14EB0000000000000000000033 -:10429000000000000000000000000000000000001E -:1042A0000000000000000000E0EBE0EB0F0F0F0F3C -:1042B000000000000A0A0A0E000000000000800052 -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000010000000000CD -:1042F000000000000000000001000180010001003A -:1043000001000000000001000003000000000000A8 -:10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000206D -:1043300000040000000000840020008000800020B5 -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000200000002D -:1043700000000000000000000000100040080400E1 -:1043800004000800000000000400000040000000DD -:10439000000200000000000000000000000000001B -:1043A00000000002000000004000000000000000CB -:1043B00000010001000000000004000100020002F2 -:1043C00000010000000000000000000000000000EC -:1043D00000100010000000000000001000000000AD -:1043E000001000100000000000000000000000406D -:1043F0000000000000000000001000000808080095 -:10440000000090100000A0008209040000000000DD -:10441000000000000010000000000000000000008C -:104420000000004000000000000008000000020042 -:10443000000000000000010000000000001000006B -:10444000080002000210080900000000001000002F -:10445000000000000000000000000008000000084C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000008000000092B -:1044800000000000000000000000000080000000AC -:104490000000000000000000000004000008000010 -:1044A000000800000000000000000000048400007C -:1044B0000084000000100000400000100008000010 -:1044C00000080000800080000000000000000000E4 -:1044D00000000000000000020000000000000000DA -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:104510000000000000000000000000000008000093 -:10452000000000000000000000100000000000007B -:1045300000000000010000000100C0000000019028 -:10454000000000C100C100020000012100210000A4 -:1045500000080000000000000001000000840000CE -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:1045800000000000000000000000000000820000A9 -:1045900000200000000000000008000000000000F3 -:1045A000000000000000000000000000000000000B -:1045B00000000000000020000000048400880000CB -:1045C00004200000001000202100000004A0098841 -:1045D00003C0000000000000000000000000000018 -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000040000000000000000B7 -:104600000000000000020005000001000011000988 -:104610000011004000000008000000000000000041 -:10462000000000000000000000000000000000008A -:1046300000000000000000414000000001000000F8 -:104640000000910921C00100050504094004000093 -:1046500021000010008000000000000000000000A9 -:10466000000000000000000000000000000000004A -:104670000000000000000000000100000000000039 -:104680000000000000000001000000000400000025 -:10469000000000080085000000000000000000008D -:1046A00000000020000000000000000000000000EA -:1046B00000000000000000002000000009000200CF -:1046C000000000000400840908C004004102410108 -:1046D0002000400421010020000000000000000034 -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:104700000000000000000000000010000420000075 -:1047100000020021001001C1000000080005000097 -:104720000000000000000000000000000000000089 -:104730000000000000000000000020002000040035 -:104740002000C0A108022180020000000520000412 -:10475000A000018001A10508A000210000000000C8 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000008000800128 -:104790000000000000840001044000000000000050 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000C08000B9 -:1047C000800880900010800184048000008888C1E7 -:1047D0000001110004020420840100000000000414 -:1047E00000000000000000000000000000000020A9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000100040000050010000001410000000834 -:10482000000200000021000000080000000000005D -:104830000000000000000000000000000000000078 -:10484000000000000400000404109100208488414E -:1048500000410820030404A10104000000A000009E -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:1048900000004082800000000011000804000000B9 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 -:1048C00020000000000080000004A0000200820917 -:1048D0000000410080011082804040880090034029 -:1048E000010400008800000000000000000000003B -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:10491000101188088289900802C000100004041059 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 -:104940000000C1C08203021010C101C003201091F9 -:1049500000044002A1901083000310A18883008509 -:1049600090A10980210080000000000000000000EC -:104970000000000000000000000000000000000037 -:104980000000000000001000000000000000000017 -:10499000000090C19189800880898080000000001B -:1049A0008080000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 -:1049C000000000008480210400C100032183418095 -:1049D000001100918491038500C0008209C100206C -:1049E0000040800480000003000000000000000080 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A1000000000001100A1008500C1A000000003FB -:104A20008000008000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A4000000000000000A00083000400C01103006B -:104A50002103118040030480210011890984808092 -:104A60000011808000A002000082000000A0000071 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A900000000000000090080800830091A0A00022 -:104AA000A0018402A09000000000000000000000AF -:104AB00000000000000000000000000000000000F6 -:104AC000000000000000000009840900100091109F -:104AD000000401C00108018501080140019100881E -:104AE00088C0108908400083010088024040C0014E -:104AF00000000000000000000000000000000000B6 -:104B00000000000000000000000082000000000023 -:104B1000000000000000000088910140C188028967 -:104B2000400200A084000904000000000000000012 -:104B30000000000000000000000000000000000075 -:104B400000000000000000000000884100A1059165 -:104B5000059104010101C1008900030200A0820344 -:104B60008903C00000C0048485C00421808580833F -:104B7000000900000000000000000000000000002C -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000080214189A1A069 -:104BA00089C18080008000008900000000000000B2 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000A004A1A0 -:104BD00040A10991001021041103110984902109B9 -:104BE00002851184840003002080028000200000E0 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000002189118059 -:104C200011800811000900200080800000000000B1 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000210241 -:104C5000048902000300C109892004000209C1116E -:104C600084049100C004050404210900C0008401EB -:104C7000000000A000000000000000000000000094 -:104C80000000000000000000000000000000000024 -:104C9000000000000000000000000000000001888B -:104CA000008200A00000100000A02084820000000C -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD0000184018200040000C188020188000000F4 -:104CE000C189040140000901C00104108910A1001C -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D1000000000E0000000000000000000000000B3 -:104D2000818100E00700824100810000070000004F -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000818100E007008100818100E0070000 -:104D60008400880000E00700000000000000070049 -:104D70005000FFFF0000F00FF00F000000000000E7 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000003800F9F942429F9FDBDB61 -:104DB000FFFF0000000000000000000000000000F5 -:104DC00000000000000000000000000000000000E3 -:104DD0000000000000000000DB180B0860609090ED -:104DE0000000000070000E0099990989003C003C09 -:104DF000F06000000000FFFFF00FF00F0000000067 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E200000000000000000003C00FFFFDBDB9F9F54 -:104E30007F7F7F7F00000000000000000000000076 -:104E40000000000000000000000000000000000062 -:104E500000000000000000000000E7000700600004 -:104E600090000000000070000E0099990989007EF2 -:104E7000007C0000F0600000000000000000000066 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF0000000000000000000999966663C3C3C3CC4 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000FB6B00902470D88F90 -:104F300081000300007F04FF00000000000000006B -:104F40000000000000000000000000000000000061 -:104F5000000000000000000000000000000210300F -:104F600011330000D90000000000000099900000FB -:104F70000000018199993C003C0099996666C3C381 -:104F8000C3C300000000000000000000000000009B -:104F90000000000000000000000000000000000011 -:104FA00000000000000000000000FBFB00902770E4 -:104FB000D88F00000300007F00FF00000000000009 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000020000CF -:104FE000000099FF2626FF000000000000009991B4 -:104FF0000000000000009999BF00BF0040618006DA -:10500000002D080200000000000000000000000069 -:105010000000000000000000000000000061000728 -:10502000000D00000000000000000000006040369D -:10503000C00C000000005030000000000000000024 -:105040000000000000000000000000000000000060 -:1050500000000000000000000000000000000061EF -:105060005034C0090000A0615A3EC50100A0A561EE -:105070004A0EC501000005614A0E059D00A0000012 -:10508000000001000000000000000000000000001F -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000FAC046 -:1050B0000AC0BD42F5A00000000000000000000092 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000F070F00000100FF3C5A18ED -:1050F0000400000000AA0888000F000F0000000054 -:10510000000000000500000000000000000000009A -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000FACF0ACF42BDFFF50000000000000000DA -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:105160000000FFFF3034000F050F040000000000B6 -:1051700050100000400000FF0CCC000A000B0000A3 -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B0000000A0A00809AAAA00000000000000004A -:1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E00000000000141C141C00F0C0F08282A2A277 -:1051F000003F001500E300EF000700D70F00C3C019 -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000A8093000C3C30000000007 -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:105260000000000000001414141400F000F0AAAABA -:10527000AAAA00152A3FE3E3EFEF080D287D0500F9 -:10528000C3C2000000000000000000000000000099 -:10529000000000000000000000000000000000020C -:1052A00000000000000000000000000000000000FE -:1052B000000000000000200001000000008000004D -:1052C00000000000000000030000000000000000DB -:1052D00000000000000000000000000000000000CE -:1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D -:10531000000000000000000000000000000000008D -:10532000000000000000000000000000000000007D -:1053300000000000000000009000200000000002BB -:10534000000000000000000000004000000000001D -:1053500000400000000000400000000000000000CD -:1053600000000000000000000000400000000000FD -:10537000009000000000000000000000000000009D -:10538000000000000000000000000000000000001D -:1053900000001000000000100000000000000000ED -:1053A00000000000000000000000000000000000FD -:1053B00000000000000000100000000000000010CD -:1053C0000009000000410000000000000000000093 -:1053D000001000100000000000000010000000009D -:1053E00000000000000000000000000000000000BD -:1053F000001000000000000000000000000000009D -:10540000020000000000000000000000000000009A -:10541000000000000008000000000000000000087C -:105420000008000000000000000000000000000074 -:10543000000000000008000000000000000000085C -:105440000008000000000000000000000000000054 -:105450000000000000000008000000000000000044 -:10546000000800080000000000000000000004C068 -:10547000000000080000000800000000000000001C -:1054800000100010000000000000000000000000FC -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC -:1054C00000000100010000000000000000000000DA -:1054D0000008004100000000000000000000000083 -:1054E00000000000000000000000000000000000BC -:1054F000000000000000C000000004800000000068 -:1055000000000000000000000000900000410000CA -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B -:105530000000000000000000000000841100400096 -:1055400000000000200004840000000000000000B3 -:105550000000000800000000000000000000000043 -:10556000000000000000000000000000000000003B -:10557000000000000000000000C00000802000C00B -:105580000000000000C04100000000C000C000C0DA -:1055900000100000000000000000000000000000FB -:1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C000000000840009008500800004000000093C -:1055D000000300000008004100000000000000007F -:1055E00000000000000000000000000000000000BB -:1055F000000000000000000000000000000090001B -:1056000000000000880000009000000090000000F2 -:105610000000010000000000000000000000000089 -:10562000000000000000000000000000000000007A -:10563000000000000000000000000000000000006A -:1056400000000000000400A00004000400000000AE -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:1056800000000000000000000000000000004000DA -:1056900020002020020000000000000000000000A8 -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C000000000009000000000000000000000004A -:1056D00000000000000000000000000000080000C2 -:1056E00000000000000000000000000000000000BA -:1056F000A00000000000000000000000000000000A -:10570000000001000000050000000000C0000000D3 -:1057100000418200000000000000000000000000C6 -:105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 -:1057400000000000000000000000000000000584D0 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000010000019 -:1057800000000010048400008484008400C0000035 -:1057900000C040000084001000C0000000000000B5 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000001210000B7 -:1057D0000080000000000011000200000000000036 -:1057E00000000000000000000000000008000000B1 -:1057F0000000000000000000000000000000200089 -:105800000000900000000000000000009000004137 -:1058100040000002000288000000000000000000BC -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 -:10584000000000000000000000000000000020A098 -:105850000004002000000000000000900000000094 -:105860000000000000000000000000000000000038 -:105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000082202000002000000400202082000060 -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D0004100020000000000000000000000000085 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 -:105900000000000000000000A0A0049000028282BD -:10591000000000000000000000A0008200040082DF -:105920000000000000000000000000000000000077 -:105930000000000000000000000000000000000067 -:105940000000000000000000000000000000000057 -:105950000000A0008900000000000000000000001E -:105960000000000000000000000000000000000037 -:105970000000000000000000000000000000000027 -:105980000000000000000000000000808080000097 -:105990008000000000000000000000800000008087 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D000000000040000000400800000000000003F -:1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000492 -:105A10008000800000000000000000000000000383 -:105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 -:105A40000000000000000000000000000000000056 -:105A500000000000000100000001008200000000C2 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000820094 -:105A9000C001A0A090000000000000000000000075 -:105AA0000000008200000000000000000000000074 -:105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000000000D6 -:105AD000000000000000000140000400010100007F -:105AE00000000000000000000000000000000000B6 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B1000C0000084008204040000000000000000B7 -:105B2000040000000000020000000000000000006F -:105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B5000000000000000000000108000004108402C -:105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 -:105B90000000800000000000808000000000000085 -:105BA00000008000000000008000000000000000F5 -:105BB00000000000000000000000000000000000E5 -:105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000200020000C1 -:105BE00000000000000000000000000000000000B5 -:105BF00000000000000000000000000000000000A5 -:105C00000000000000000000000000000000000094 -:105C10000000000000040080000080000000000080 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000000024 -:105C80000000000000000000000000000000000014 -:105C90000000000000000000C004820204000000B8 -:105CA000000000000000C000A000C000C000000014 -:105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE00000E00700000000000000000000000000CD -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D100000000000000000000081000007005000AB -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000FF00FFA0A0C5 -:105DA000A0A0000000000000000004045555000001 -:105DB00000000000000000000000000000000000E3 -:105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000010001062 -:105E2000A0A0A0AA0000000000000000000455553A -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000C3C37C -:105EA000C000F020F0000000000000000000FFF043 -:105EB000555000000000000000000000000000003D -:105EC00000000000000000000000000000000000D2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 -:105F00000000000000000000000000000000000091 -:105F10000000000000000000000000000000000081 -:105F2000C3C3C100F0F0F00000000000000000005A -:105F3000FFF35551000000000000000000000000C9 -:105F40000000000000000000000000000000000051 -:105F50000000000000000000000000000000000041 -:105F600000000000000000000061000F000D00A014 -:105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 -:105F90000000000000000000000000000000000001 -:105FA00000000000003000000000000000000000C1 -:105FB00000000000400000000000000000000000A1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF0003CAA0000000000000000000000000000BB -:106000000000000000000000000000000000000090 -:106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:1060700000FF3CAA0000000000000000000000003B -:106080000000000000000000000000000000000010 -:106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:10611000000000000000000000000000000000007F -:10612000000000000000000000000000000000006F -:10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000000000000EF -:1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000024000000000000000000000004C -:10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E -:1062300000000000000000000080000000000000DE -:10624000000200000000000000000000000000004C -:10625000000000000000000000000000000000003E -:10626000000000000000009000000000000000009E -:1062700000000000400000000000000000000000DE -:10628000000000000000000000000000000000000E -:1062900000004000000000000000000000000000BE -:1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000001000000000CE -:1062C00000000001000000000000001000100000AD -:1062D00000000000000000000800000000000000B6 -:1062E0000000001000000000000000000840020054 -:1062F0000000001000000200000000000010000577 -:10630000000000410000000000000000001000003C -:10631000000000000000000002000000000000007B -:10632000000000000000001000000200000000104B -:10633000000000000000000002000000001000004B -:106340000000020000000000000000000000000843 -:106350000000000000000008000000000000000035 -:10636000000000000000000800000000000000081D -:106370000000000000000008000000000000000015 -:106380000000000000000008000000000000000005 -:1063900000080000000000000008000000000000ED -:1063A0000000000000000000008400000000000069 -:1063B00000080010000004000010000000000000B1 -:1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000200000000009B -:106400000000040000000000000000000000000088 -:106410000000000000080000000000000000000074 -:10642000000000000000000000000000000000006C -:106430000000000000000000000000080000000054 -:10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:106470000000000000000000000004000000000018 -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC -:1064C00000000000000000000000000003000000C9 -:1064D00000000000000000000000000000000000BC -:1064E000004000000000000000000000000000105C -:1064F00000000000000000410000004000410004D6 -:106500000004000000110000000000000000000076 -:106510000004000000000000000000000000000077 -:106520000000000000000000000004000000000067 -:106530002000000000000000A0000000000020007B -:1065400082000000A0002080000000000000080081 -:10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B -:106570000000000000000000000000C0000000005B -:1065800000900000009000000900000000000000E2 -:1065900000000004000000000000000000000000F7 -:1065A00000000000000000000000000000000000EB -:1065B00000000000000000000000000000000000DB -:1065C00000000000000000000020000000000000AB -:1065D000800000000000000000000000000000003B -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A -:106640000000900000000000000000000041022156 -:1066500008410204000000000000000000000000EB -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:10668000002000C0008400000000050000000000A1 -:1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA -:1066C0000000000000000000000000000000008446 -:1066D00080888000800000000000000000000000B2 -:1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000002168 -:106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 -:106730000000000000000000080000000000000051 -:106740000000820020000000000000002000200067 -:106750000400020008059000000000000000000096 -:106760000000000000000000000000000000000029 -:106770000000000000000000001000040000000005 -:106780000000000000C000001184020000000000B2 -:1067900000042004000420000000000000000000AD -:1067A00000000000000000000000000000000000E9 -:1067B00000000000000000000000000000000000D9 -:1067C00000000000000000000000000000000000C9 -:1067D00000000000800080000000000000000000B9 -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 -:106830000000000000000000000000000000000058 -:10684000000000000000000000000000A0020000A6 -:106850000004C0100040008800C088A000000000B4 -:106860000000000000000000000000000000000028 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B00000000000000000000000000000000000D8 -:1068C0000000000000000000000000000000C00008 -:1068D00000000000008000800000000000000000B8 -:1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000000000000000000000000000057 -:106940000000000000000000000000000000000047 -:106950000000002180800000910000C08584A1809B -:106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 -:106980000000000000000000000000000000000007 -:1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 -:1069B00000000000000000000000000000000000D7 -:1069C00000000000000000000000000000000000C7 -:1069D000000040000000100284C0400004C1108587 -:1069E000050800000000000000000000000000009A -:1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000000086 -:106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 -:106A40000000000000000000000000000000000046 -:106A500000000000C01000A0008800A00011000489 -:106A60001084C18900000000000000000000000048 -:106A70000000000000000000000000000000000016 -:106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000000000000000000C6 -:106AD00000000000000080800000000000800088AE -:106AE00000418089A1C000000000000000000000FB -:106AF0000000000000000000000000000000000096 -:106B00000000000000000000000000000000000085 -:106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 -:106B30000000000000000000000000000000000055 -:106B40000000000000000000000000000000000045 -:106B500000000000000000000000008500000000B0 -:106B600000008000000080400000000000000000E5 -:106B70000000000000000000000000000000000015 -:106B80000000000000000000000000000000000005 -:106B900000000000000000000000000000000000F5 -:106BA00000000000000000000000000000000000E5 -:106BB00000000000000000000000000000000000D5 -:106BC00000000000000000000000000000000000C5 -:106BD00000000000000000000000900084A09084ED -:106BE00040001010400204A010000000000000004F -:106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 -:106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 -:106C600007004200000000000000840A000000004D -:106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000000000000000000D4 -:106CC00000000000000000000000000000000000C4 -:106CD0000000000000000000000000000000F0FFC5 -:106CE000F00081990109FFFFFFFF00000030000064 -:106CF0000000000000000000000000000000000094 -:106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 -:106D50000000000000000000000000000000000033 -:106D6000663C663CC3FF030F4646466600000000D3 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E600000000000F3F30000662442008083BCBFF2 -:106E70003C3E3C3F0000000000000000000000001D -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE000000000000000F3F3F3F36666666680833B -:106EF000BCBFFFFFFFFF000000000000000000001B -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 -:106F50000000000000000000000000000000000031 -:106F6000000000000000000000000008000000A079 -:106F700000613006000D000100000000000000006C -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF000000000000000FFC30F03000000000000BD -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000FFC30F03000000003C -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F000000000000000000000000000FF41000050 -:10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:107170000000000000000000000000000000FFEB25 -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000A000000000000000000004002B -:1071C000000300800000000000000000000000003C -:1071D000000000000000200000000000000000008F -:1071E000200000000000000000000000000000007F -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:1072300000004000000000000000100000000000FE -:1072400090000000000400000000000000000000AA -:1072500000020000400000000000000000000000EC -:10726000000000000000000000000002000000001C -:1072700000000004400000000000000000000000CA -:1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00008000000002002000800000003000000A9 -:1072B00000000000000000000800080000000000BE -:1072C0000000080000000021004100000000000054 -:1072D00000000000000002000000080000000200A2 -:1072E000020000000000020000000000000000009A -:1072F0000000000000000000020002000210000078 -:107300000200000002000000000000000000000079 -:107310000000000000000000000000000000000865 -:107320000000000000000001000000000000040058 -:107330000000000000000000000000000000000845 -:10734000000000000000000000000000000000003D -:107350000000000000000000000000000000000825 -:1073600000400000000000000000000000000000DD -:1073700000000000000000000000000000000040CD -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B000000000000000C1000000004000000000CC -:1073C000004100000000000000000000000000007C -:1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F000000002000000000000000000000000008B -:107400000000040000000000000000000000000078 -:10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C -:10743000000000000000000020000000000100002B -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C -:1074800000000000000000000000000000000000FC -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000004000000D8 -:1074B0000000000004804000000000000000000008 -:1074C0000000001000000000001100400000000457 -:1074D00000040000000000000000000000000000A8 -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C -:107500000000000000000000000000000800000073 -:10751000000000000000000000000000000000006B -:1075200000000000000000000000000000008000DB -:1075300000A00090000080208010000000000004E7 -:1075400000902004008900C00000000400840000B6 -:107550000004000400000000000000000000000023 -:107560000000000000000008000000000000000013 -:10757000000000080000000000000000000000C043 -:1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B00004000000000000000000000000000005C2 -:1075C00000020000000000100005000000000000A4 -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B -:10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A -:1076300000008000000000000000000000000000CA -:107640000000000000000000000100000000000039 -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:10768000000000C009000000080000100084008411 -:107690000084000000000000000000000000000066 -:1076A00000000000000000000000000000000000DA -:1076B0000000000000000000840010000021000015 -:1076C0000000000000000040000001080000000071 -:1076D0000000000400000004000000000040000062 -:1076E000000000000000000000000000000000009A -:1076F000000000000000000000000000000000008A -:107700000000000000000000000000000000000079 -:107710000000000000000000000000000000000069 -:107720000000000000000000000000000000000059 -:107730000000000000000000009000000010008227 -:107740000000000000900000000100000884030019 -:107750000090000020000000000100000000050073 -:107760000000000000000000000000000000000019 -:107770000000000000000000000000000000000009 -:1077800000000000000000000400000000000000F5 -:1077900000000000000000000000000000000000E9 -:1077A00000000000000000000000000000000000D9 -:1077B00000000000000000000000000000000000C9 -:1077C00000000001000000000000000000000000B8 -:1077D000A00000000000C0000000000084000100C4 -:1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 -:107810000000000000000000000000000000000068 -:107820000000000000000000000000000000000058 -:107830000000000000000000000000000000000048 -:1078400000000004000804110020000000000000F7 -:107850000000000000000000000000000000000028 -:107860000300000000000000000000000000000015 -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 -:1078C00000000000000000100000000500000000A3 -:1078D00080008000800000000000800000000002A6 -:1078E0000000000000000000000000000000000098 -:1078F0000000000000000000000000000000000088 -:107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 -:107920000000000000000000000000000000000057 -:107930000000000000000000000000000000000047 -:1079400000000000000000000001000000004000F6 -:1079500010001000C00088004000C00008000000B7 -:107960000001000000000000000000000000000016 -:107970000000000000000000000000000000000007 -:1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 -:1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C00000000000000000000000000000000100B6 -:1079D00000000000000000000084004084A00008B7 -:1079E0000000000000000000000000000000000097 -:1079F0000000000000000000000000000000000087 -:107A00000000000000000000000000000000000076 -:107A10000000000000000000000000000000000066 -:107A20000000000000000000000000000000000056 -:107A30000000000000000000000000000000000046 -:107A4000000011000000000000000000090010000C -:107A5000080000000000000000000000008000009E -:107A60000000000000000000000000000000000016 -:107A70000000000000000000000000000000000006 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 -:107AA00000000000000000000000000000000000D6 -:107AB00000000000000000000000000000000000C6 -:107AC00000000000000900040000000021028800FE -:107AD0008500A00000000000000000000000000081 -:107AE0000000000000000000000000000000000096 -:107AF0000000000000000000000000000000000086 -:107B00000000000000000000000000000000000075 -:107B10000000000000000000000000000000000065 -:107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 -:107B400000000000000000000000000000008900AC -:107B5000100002009100000000840084000000007A -:107B60000090002000000000000000000000000065 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000000D5 -:107BB00000000000000000000000000000000000C5 -:107BC000000000000000000000810000070000002D -:107BD000810000E00700000000000000000000003D -:107BE00000000000070000000000000000E00000AE -:107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 -:107C10000000000000000000000000000000000064 -:107C20000000000000000000000000000000000054 -:107C30000000000000000000000000000000000044 -:107C40000000000000000000000000000000000034 -:107C50000000000000000000000000000000000024 -:107C60000000000000000000000000000000000014 -:107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD000000000000000C0C3000000000000000021 -:107CE0000000000000000000000001000000000093 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 -:107D20000000000000000000000000000000000053 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 -:107D50000000000000000000000000000000000023 -:107D60000000FFFF280000000000FFFDFDFD0000F7 -:107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 -:107DB00000000000000000000000000000000000C3 -:107DC00000000000000000000000000000000000B3 -:107DD00000000000000000000000000000000000A3 -:107DE000000000003F3F280000000000FDFDFDFDF9 -:107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 -:107E50000000050000380000000000610007C00DB0 -:107E600000000000000000000005000000000010FD -:107E70000000000000610007000D0000000000008D -:107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 -:107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 -:107ED000000000000000000000000000FFFF0000A4 -:107EE0000000000000000000000000000000000092 -:107EF0000000000000000000000000000000000082 -:107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 -:107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000000000000000F3FF2F -:107F60000000000000000000000000000000000011 -:107F70000000000000000000000000000000000001 -:107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 -:107FA00000000000000000000000000000000000D1 -:107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 -:107FD00000000000000000000000000000000000A1 -:107FE0008282828200000000000000000000000089 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 -:108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:108050000000000000000000000000000000000020 -:10806000000082808282000000000000000000000A -:108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E000000004000000000000000000000000008C -:1080F00000000000000000000000008400030000F9 -:10810000000000002000000000000000000000004F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000010000F -:10816000000000008000000000000000000040004F -:1081700000000000000000000000210000110000CD -:1081800000000000004000000000000000000000AF -:1081900000000000000000040000000000000000DB -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000008000000A7 -:1081D0000000820010800800000000800000000005 -:1081E0000000000000000800000000000000000483 -:1081F00002000200000090000100000000000200E8 -:108200000000040800000000000000000000000062 -:10821000080000000000000008000000000002004C -:108220000000020000000800000000000000000044 -:10823000000000000200000000000200000000003A -:10824000000000000000000000000000000000002E -:10825000000000000000000400000000000400888E -:108260000000000000000000000000000000080006 -:1082700000010000000000100000080000000200E3 -:10828000000000008000000000000000000000006E -:108290000000000000000000000000000000008856 -:1082A00000000000000800080000000000000000BE -:1082B00000000000000000000000000000000000BE -:1082C000000000000021000000000000000000008D -:1082D0000000000000210000000000080000000075 -:1082E0000000001100210000C00900000000000093 -:1082F000000000000041000000000120000000001C -:108300000000010000000008000000000000000064 -:10831000000000000041000000000000000000001C -:10832000000000000000000000000000000000004D -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000100001C -:1083600000001100000000000000000021000000DB -:108370000000000000000000000000C004010090A8 -:1083800000000000020000000000000000000000EB -:1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000820082000000A9 -:1083D00000000000A00000000000400000000002BB -:1083E0000000018000100000008400002004000054 -:1083F000000000000000200000080000000401044C -:10840000010000000000001000000020000000003B -:10841000000000000000000000000000000000005C -:10842000000000000000000000000000000000004C -:108430000800000000000000000000000000020032 -:10844000020000000000000000000000000000002A -:10845000000000000000000000000000800000009C -:1084600000010000202041000000001000008001F9 -:1084700000000000000000008082090100001101DE -:10848000040120C0024000020001000000050008B5 -:1084900000000000000000000000000000000000DC -:1084A00000000000000000000000000000000000CC -:1084B000000000C0000000000000000000000000FC -:1084C00000000000000000000400000000000000A8 -:1084D000000000000000000000000000000000009C -:1084E0000000100000002000904104000000001077 -:1084F0000000000001050000000500000000000071 -:10850000000300000000090802030800000000202A -:108510000008000000000000000000000000000053 -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000008000000080000000000000000B -:10857000000100000000041000880010000000004E -:108580000000000000000000C0008000800000002B -:1085900000010000000000000000000000000000DA -:1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000000000000000BB -:1085C00000000000000003000000000000000000A8 -:1085D00000000000820000210000000000000000F8 -:1085E000400000002000000000000084000008009F -:1085F00001210000000000210180008000840100B2 -:108600002021000082050204000001410140030016 -:10861000000020040000000900000000000000002D -:10862000000000000000000000000000000000004A -:10863000000000000000000000000000000000003A -:10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A -:108660000000800000008000000000000005000005 -:10867000800008000300000000000420002000200B -:10868000040000A000000082000000002000200282 -:10869000A0A000008000000000000000000000001A -:1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C0000000000000000000000011000000000099 -:1086D000000000000000000000000000000000009A -:1086E0000000000000010100020100000010000471 -:1086F0000002000800C0C188A1A09082C1900010B3 -:10870000000488900000A0000100000020C090003C -:10871000010800A0000000010000000000000000AF -:108720000000000000000000000000000000000049 -:108730000000000000000000000000000000000039 -:108740000000000000000000000000000000000029 -:108750000000000000000000000000000000000019 -:10876000000000000000000821000011000000804F -:1087700000000080008000808980A18000800400CB -:1087800000001000000000008000030000000080D6 -:1087900000000280000000000341000341030005C7 -:1087A00000000000000000000000000000000000C9 -:1087B00000000000000000000000000000000000B9 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000009001100090066 -:1087F00080008000000580008900830091118500C1 -:1088000080008021001000000000000011004100E5 -:108810000011000080A080050000000000000000A2 -:108820000000000000000000000000000000000048 -:108830000000000000000000000000000000000038 -:108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 -:108860000000000000000000000000020000010005 -:1088700001004000900088000800A1004000A10510 -:1088800091004000820004899084000000000100F3 -:10889000011090908800A089820000000000000074 -:1088A00000000000000000000000000000000000C8 -:1088B00000000000000000000000000000000000B8 -:1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000000000000000000098 -:1088E0000000000000000000000000000000000088 -:1088F000000100000400400010000200049000404D -:10890000008989C1909000880004040800000000DC -:1089100000000001000488080004A04000000000DE -:1089200001008800000000000000000000000000BE -:108930000000000000000000000000000000000037 -:108940000000000000000000000000000000000027 -:108950000000000000000000000000000000000017 -:1089600000000000000000000000000000000010F7 -:108970000009400800108000800080008000000492 -:108980000000000591C180800000000011800000FF -:108990000000000000110080000000808200000044 -:1089A00041001000A10000000500000000000000D0 -:1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000000097 -:1089E0000000000000000000000000000000000087 -:1089F0004102080008000811000900000000000002 -:108A00000002808080008008001180C0000000000B -:108A10000484040900000011880991A18800210044 -:108A20000000000400000000000000000000000042 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 -:108A7000000001400100010001000000004000046E -:108A80000000C084021008C0100104012021040469 -:108A900000000188010000000001C100881109C028 -:108AA00011000000000100000000000000000000B4 -:108AB00000000000000000000000000000000000B6 -:108AC00000000000000000000000000000000000A6 -:108AD0000000000000000000000000000000000096 -:108AE0000000000000000000000000000000000086 -:108AF00000000000810000E000000000008100E0B4 -:108B000007000000818100E007008400000000E011 -:108B100007000000810000E007000000008100E085 -:108B2000070000000000810000E0070000000000D6 -:108B30000000000000000000000000000000000035 -:108B40000000000000000000000000000000000025 -:108B50000000000000000000000000000000000015 -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B80000000000000000000100000000000F6F6E9 -:108B90000606FF7F007F0000000000000000FF3C91 -:108BA00000960F0D0F0F00000000000000000000F5 -:108BB00000000000000000000000000000000000B5 -:108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000000000000000075 -:108C000000000000000000000000100000C0000391 -:108C1000F6F00600FF4000400000000000000000E9 -:108C2000FF3C00960F0D0F0F000000000000000039 -:108C30000000000000000000000000000000000034 -:108C40000000000000000000000000000000000024 -:108C50000000000000000000000000000000000014 -:108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 -:108CC00000000000000000000000000000000000A4 -:108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 -:108D000000000000FF00FD00040404046F5F002069 -:108D100024F4E7F7000FF0FF00FF00FF0000000061 -:108D200000000000B4B47E7E0000000000000000DF -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000400000000FF6F6F02 -:108D900000002424E7E7202FE0EF3C3C2D2D0000CD -:108DA000000000000000B4B47E7E0000004000001F -:108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE0000000000000000000000000000000000083 -:108DF0000000000000000000000000000000000073 -:108E000000610006C005000000610036000D000092 -:108E100000612036C09200000061000F000D0000CC -:108E20000060000FC00100A01061203F000D000194 -:108E3000000005610003C00D0000000000000000FC -:108E40000000000000000000000000000000000022 -:108E50000000000000000000000000000000000012 -:108E60000000000000000000000000000000000002 -:108E700000000000000000000000000000000000F2 -:108E8000000030000505C141404000000000000026 -:108E900000000000000041411441000000000000FB -:108EA00000000000FF00FFFF000000008000000045 -:108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 -:108F00000000000030000505800040400000000027 -:108F100000000000000000001414005500000000D4 -:108F2000000000000000FF00FFFF00000000000044 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 -:108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F8000000000000000F0F00000FF005F000000A3 -:108F9000000000000000000000005055000000002C -:108FA000000000000000000000005555AA55000018 -:108FB0000000000000000000C0F0100000000000F1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 -:108FF0000000000000000000000000000000000071 -:109000000000000000000000FFFF000000FF005F04 -:10901000000000000000000000000000FCFDFCFC5F -:10902000000000000000000000000000AAAA00FFED -:109030000000000000000000000030000000000000 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 -:1090900001000000200000000000000000000000AF -:1090A0000000000000000000008000000000000040 -:1090B00000000000000000000000000301000000AC -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000400000000000000040000000068 -:10910000000000000000000000000000000000005F -:1091100000000400000280000000000010000000B9 -:10912000000000000000000000000002000000003D -:109130000000000000000000000000000000080027 -:10914000000000000000000000000000000000001F -:1091500000000000000000000000000000001000FF -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF -:1091900000000000000000000000000000000000CF -:1091A000000000000000200000000000000000009F -:1091B000000000000000002100000003000000008B -:1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000001100007E -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E -:1092200000000000000000008000000000000000BE -:10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E -:10925000000000000000000000040000009000007A -:109260000088000000000000001000000000000066 -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:10929000000000000000000000000080000000004E -:1092A000000000000000000000000021000082001B -:1092B000002100000000C00000080041000500007F -:1092C0000008000010000000000000000000000086 -:1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:109310000000000000000000000000000004000049 -:1093200000000082000000000000000000000000BB -:1093300000000000211000100000000000000000EC -:109340000002000000000000000000000008000013 -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000200000AD -:1093A00000008408000000100020000400C100003C -:1093B0000000000400000005001000000000004153 -:1093C0000009000001020000000000000000000091 -:1093D000000000000000000000000000000000008D -:1093E0000004000000000000000000000000000079 -:1093F000000000000000000000000000904000009D -:109400000000000000030000000000000000000059 -:109410000200000000000000000000000000000149 -:1094200000C0000000010000000100010001000474 -:10943000000000000001000000000000000000002B -:10944000009000C0000002000000000000020000C8 -:10945000000000000000000000000000000000000C -:1094600000000001000000000000000000000000FB -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC -:10949000000000000000000000000000000000804C -:1094A000048020002000C08004000080000001042F -:1094B0000084208021002180210000412041A04023 -:1094C000A000010020000000000000000000A0003B -:1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000004000000000001B -:10951000000000000000000000000000001000C07B -:1095200000208020800080000008800000100000E3 -:1095300020014105804082008240820000008000BE -:1095400000010000040080080002028800002100E1 -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB -:1095A000000000000000000000008800000500002E -:1095B0000002000400210421880002009000000045 -:1095C0000000A04100000489080000000000000025 -:1095D0000002000400000000000000000000000085 -:1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A -:1096300000000001000141008000000080000000E7 -:1096400000000010000000000020000020000004C6 -:109650000000000400000000000000000000000006 -:1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000010110000001A7 -:1096B000000100A00190908200A000C0010084C0C1 -:1096C000C00041C001000300000141C0A00003012F -:1096D0000001000001000000000000000000000088 -:1096E0000000000000000000000000000101000078 -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000001141802146 -:1097300000400003008003808000000002801000D1 -:10974000890000009191400585040040918903043F -:10975000820900400000020000000000000000003C -:1097600000000000000000000000000000001110D8 -:1097700000210008000400000000000000000000BC -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000080808080B9 -:1097B000800080208041110021000580038000048A -:1097C00000000008800009800321081184050900B9 -:1097D0000321031183080000000000020080000044 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:1098200000000000000000000000000000000890A0 -:10983000884010000800900100000100000400882A -:10984000000000000001C020010200000101C084EE -:1098500001A000000001C101000000000001004063 -:1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A0000000000000000000000000000000C000F8 -:1098B0000000001000080008000240010001040040 -:1098C000100100011000000001C0000000010400B0 -:1098D00003C001010001000103C1000000000000FD -:1098E0000000000000000000000000000000000078 -:1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:109930008000000000800980098000008020000273 -:109940008003001121110011001108830041410919 -:109950008304918502400303052091C000000000AC -:1099600000000000000000000000000000000000F7 -:1099700000000000000000002000080000000000BF -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 -:1099B000000000000000040210800900030041893B -:1099C00080000800201100000002000000008880D4 -:1099D0004100048009058304030910804040000011 -:1099E0000004800000008000000000000000000073 -:1099F0000000000000000000000000000000000067 -:109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000036 -:109A300000000000008800000000000201C00000DB -:109A40000102020083000001000000A0A00000004D -:109A5000C140000000840100C082000000840101B8 -:109A60000000900120002000020000000000000023 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000000B6 -:109AB00000000000000007000041810000E00700F6 -:109AC0000006818100E007000000004100E007007F -:109AD0000000000000E000000000008100E007003E -:109AE0000000000000000000000000000000000076 -:109AF000000000000000000000000000000000E086 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B4000003F3C3FA000A000000000000F0F0F0FDF -:109B5000FFFF0000FFFF0000FFFF5555FFFF000063 -:109B6000FFFF55550000F0AAF0AA00000000000019 -:109B700000000000000000000000000000000000E5 -:109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000000000000000A5 -:109BC0000000003F3C3FA000A000000000000F0F7D -:109BD0000F0FFFFFFFFFFFFFFFFFFFFF5555FFFFC9 -:109BE000FFFFFFFF55550000003CFF3C0000000058 -:109BF0000000000000000000000000000000000065 -:109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 -:109C20000000000000000000000000000000000034 -:109C3000000000000000000000000000FFFF000026 -:109C40000000000028FD1428DF00DF1F00000000D6 -:109C5000F0F0FFFFAAAAFFFFAAAAFFFF0000FFFF84 -:109C6000AAAAFFFFFFFF00000000000000000000A4 -:109C700000000000000000000000000000000000E4 -:109C800000000000000000000000000000000000D4 -:109C900000000000000000000000000000000000C4 -:109CA00000000000000000000000000000000000B4 -:109CB00000000000000000000000000000000000A4 -:109CC000000000000000FFFF0000D700D7140000D4 -:109CD0000000F0F0FFFFAAAAFFFFAAAAFFFFFFFF04 -:109CE000FFFFAAAAFFFF0000000000000000000024 -:109CF0000000000000000000000000000000000064 -:109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 -:109D30000000000000000000000000000000000023 -:109D40000500000000610000C01D00000061003639 -:109D5000C00100004563803F002D920240E3800176 -:109D60000021920245E3803900218A0000000000B2 -:109D700000000000000000000000000000000000E3 -:109D800000000000000000610002000D0000000063 -:109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000000B3 -:109DB00000000000000000000000000000000000A3 -:109DC000000000000000FF003C3C00000000C0C09C -:109DD0000303B4000F0F00000000AF0CAFFC3F3FC7 -:109DE0003030E8FFF0FFCF4DCFCF0A0F3C3C0000F2 -:109DF0000000000000000000000000000000000063 -:109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 -:109E40000000000000000000FF053D3D0000000094 -:109E5000C0C0030314000F0F00000000A00CA0FC02 -:109E60005F3F5030E800F0000C4D0C0C0F0F3C3CF5 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 -:109EC00000000000000000000000F00D0F00000086 -:109ED0000000000000003C043C0000000000000006 -:109EE0000000FCFC0C5C787800FFBF833D01AEBE37 -:109EF000FEBE0000000000000000000000000000A6 -:109F0000000000000000000000000000AF50AF5053 -:109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 -:109F30000000000000000000000000000000000021 -:109F4000000000000000000000000000F0000F0012 -:109F500000000000000000003C863C000000000003 -:109F600000000000FCAC0C0C3C3C00FF3F033F0336 -:109F70000414541400000000000000000000000061 -:109F800000000000000000000000000000003C3C59 -:109F9000FF000000000000000000000000000000C2 -:109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000000081 -:109FE0000000000000000000000000000000000071 -:109FF00000000000820000000000000000000000DF -:10A00000000000000400000000000000000000004C -:10A010000000000000000000000000000000000838 -:10A020000000000000000000000000000000000030 -:10A030000000000000000000000000000000000020 -:10A040000000000000000000000000000000000010 -:10A0500000000000000000001000000000000000F0 -:10A06000000000000090000000000000000040021E -:10A0700000000000000000000000000000000000E0 -:10A0800000000000000000000000000000000000D0 -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B000000000000000000000040000000000009C -:10A0C000000000000000000000000000020000008E -:10A0D0000000000000000000000000000000000080 -:10A0E000004000000000000000000200A00000008E -:10A0F0000000000000090000000000000000000057 -:10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000A00000000000020000000000000000007D -:10A140000000000000080000000000000000000007 -:10A1500000000000000000000000000000000000FF -:10A1600003000000004000000000000000000000AC -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF -:10A1900000000008000000000000000000000000B7 -:10A1A000000800080000000000000000000000009F -:10A1B000000000840000000000000000000000001B -:10A1C000000000000000000000000000000000008F -:10A1D000000000000000000000000000000000007F -:10A1E000000000000000000000000000000000006F -:10A1F000004100000000000000008400000000009A -:10A200000000000800000000000000000000000046 -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A2300000000000000000000000000000000040DE -:10A24000000000000000000000000000000000000E -:10A2500000000000400000000000000000000000BE -:10A26000400000A00000100000000000000000827C -:10A27000000000A000000000000000000000050039 -:10A2800000000000000000080000000000000000C6 -:10A29000000000002000000000000000000000009E -:10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000003009B -:10A2C000000000000000000000000000000000008E -:10A2D0000000004100000000000500000000000434 -:10A2E000004100040000000900000005000000001B -:10A2F00000000041004100000000000000000000DC -:10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D -:10A3300008000000004000000000000000000000D5 -:10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD -:10A3600000000000000000000000000000000000ED -:10A3700000000000000000000904000000900088B8 -:10A380000020000000000004009000000000000019 -:10A39000000000000000004000000000000000007D -:10A3A00000000000000000000000000000000000AD -:10A3B0000000000000A000000000000000000000FD -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000000000000000006D -:10A3F0000000000000000000000000080000000055 -:10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A450000000000000000000000000000000008478 -:10A4600000000000000000000000000000000040AC -:10A470000484000000840000000000A00008000028 -:10A4800000880000000000840000040000000000BC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000800000000000000A4 -:10A4B000000000000000000000000000000000009C -:10A4C000000000C0000000000000000000000000CC -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000100000000000005C -:10A4F0000000000000000000000000100000000844 -:10A50000000000000000000000000000000000004B -:10A510000000000200000000000000000000000039 -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000000000001B -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000020000F9 -:10A5600000002000000000000000000000000000CB -:10A57000000000000000000000840000200000C077 -:10A5800020002000000009C00000200000000000A2 -:10A59000000000000000002000000000000000009B -:10A5A00000000000000000000000000008000000A3 -:10A5B0000200000000080000000000000000000091 -:10A5C0000000000000000000008200000000000009 -:10A5D000000000000000000000000000000000007B -:10A5E000000000000000000000000000000000006B -:10A5F000000000000000000000000000000000005B -:10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000000FA -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F0000000000000000000000000000000000058 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 -:10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC100000000000000001000000000000800000B3 -:10AC200000000080000000030000000000000000A1 -:10AC30000000000000100000000000000000000004 -:10AC4000000088000000000000000000000000205C -:10AC500000000000000000000000000002000000F2 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000200000000000010A2 -:10ACA0000000000000100000000000000000000094 -:10ACB0000000000000000040000000000000000054 -:10ACC0000000000000000000000000000000000084 -:10ACD00000830000000000000000000000000000F1 -:10ACE000000800000000000000000000000000005C -:10ACF0000000000000000000000000000000000054 -:10AD000000000000000002000000000000000241FE -:10AD10000000020000000000000000000000020926 -:10AD2000020000000000000002000000000000001F -:10AD3000000000000009000000000000000000000A -:10AD4000020000000000020000800000020000007D -:10AD500000000000000000000000000000000000F3 -:10AD6000004100000000020000000000000400009C -:10AD700000000004000000000000000000000000CF -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA0000000000000C000000000000000000000E3 -:10ADB000000000000000000000000000000000088B -:10ADC000000000000000024000000004000000003D -:10ADD000000000000000000000000000000000046F -:10ADE000000010080000000000000000000000004B -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE200000000100010000000041000000000000DF -:10AE30000000000000000000000000000010000002 -:10AE40000000000000000000008000002000200042 -:10AE500000000000000000000021000000000000D1 -:10AE600000000000000000080003000000002100B6 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA0000000000008000400000000000000000096 -:10AEB0000000000000000000000000000000000092 -:10AEC00000000000000000000000000800008000FA -:10AED00080000000000000000000000000000000F2 -:10AEE0000000000000000000000000000000000062 -:10AEF00084000000000000000000000000000000CE -:10AF00000000000000110000000000000000000030 -:10AF100000030000004000000004000000000000EA -:10AF2000881100080000000900090000000000006E -:10AF300021800000000000000000000000008800E8 -:10AF4000000082000008000000080000000000006F -:10AF500000000000008000000080000000000000F1 -:10AF60000000000000000040200800000000000079 -:10AF70002000A040000000000000000000000000D1 -:10AF8000000000000082000000880000000800842B -:10AF9000000400000082000000000004000000A087 -:10AFA0000004000000840088008811880000000070 -:10AFB0000000880400000000000000000000000005 -:10AFC0000000000000000040000000000000000041 -:10AFD0000000000000000004000000040000000069 -:10AFE000000000000000000000002000020000003F -:10AFF00008008000000000000000000000000000C9 -:10B0000000000000000000000000000084000000BC -:10B010000000000000050000000000050000001016 -:10B020000000404100020000840090000400000085 -:10B030000080000800000000000000000000000088 -:10B040000000000000000000000000000000000000 -:10B0500000000000020002000000000400000004E4 -:10B0600000000000000000080000000000000000D8 -:10B0700020000000040000000000000000000000AC -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000004000000000000000000000000050 -:10B0C0000000000000000000000000000000000080 -:10B0D000000000000000800080000000000100006F -:10B0E000000100000000000000000000000000005F -:10B0F0000000800000008000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000300002C -:10B1200000040000000000410000000090009000BA -:10B130009000000800410011000400000000000021 -:10B1400000000000000000000000000000000000FF -:10B15000000000000000000090008400002000209B -:10B1600000200000000000000000000500000000BA -:10B170000000021004000180200000000000000018 -:10B1800000000000000000000000000000000000BF -:10B1900000002000000000004100008200042000A8 -:10B1A00020002082000000000010000000000000CD -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000016E -:10B1E000000100010000000000000000000000005D -:10B1F000000002000000800020200000000000008D -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B2200000000000000000000000000000001040CE -:10B23000000800A090A0A002840201048204000083 -:10B2400000000000000000000000000000000000FE -:10B25000000000000000000000C0019090A08820C5 -:10B26000C101909090040404000000000000000060 -:10B2700000000000000000000000000001000000CD -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000008000000000800000800080028080800C -:10B2C000000000000000000000000000000000007E -:10B2D00000000000000000000000008003808000EB -:10B2E0000000A011808080858085000000000000A3 -:10B2F000000000000000000000000000000040000E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B3300000000000800380108000800000A00080DA -:10B34000800000000000000000000000000000007D -:10B35000000000000000000000000000A000C1008C -:10B360008991C1001080C140851189000000000052 -:10B3700000000000000000000000000000090000C4 -:10B380000009008000000000000000000000000034 -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B00000000000840008A0A00908C010000404D8 -:10B3C000A084C09000000000000000000000000009 -:10B3D0000000000000000000000000000000080065 -:10B3E0009000A09111409190020140019000000056 -:10B3F000000000000000000000000000000000004D -:10B4000000880000000800000000000000000000AC -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B4300000000000000088040004000421C0C020B7 -:10B44000880400C0828800000000000000000000A6 -:10B4500000000000000000000000000000000000EC -:10B4600002100009840189899001004191040510AE -:10B4700000000000000000000000000000000000CC -:10B4800000000400080000000000000000000000B0 -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B0000000000000000000000000000000098003 -:10B4C000808080000000C0800000000000000000BC -:10B4D000000000000000000000000000000000006C -:10B4E000000000A000898020A1918010038388853E -:10B4F0001102000000000000000000000000000039 -:10B5000000000900000080000900000000000000A9 -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B530000000000000000000000000000084008007 -:10B540000000000400A08000800000000000000057 -:10B5500000000000000000000000000000000000EB -:10B560000000000000900000008080119100919187 -:10B57000858085030000000000000000000000003E -:10B5800000000000000000090000000000000000B2 -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B0000000000000000000000000009000A083D8 -:10B5C000A0080800880108880402040000000000A8 -:10B5D000000000000000000000000000000000006B -:10B5E000000000000000844000884008A001900096 -:10B5F000834104040401000000000000000000007A -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B64000000007000000008100E00701600000002A -:10B6500000000000000000000000000000000000EA -:10B660000000000000000000810000E00700000072 -:10B67000000000E007008200000000000000000061 -:10B680000000000000000000000000E007000000D3 -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C0006FFC60FC00013C3C7F734F43F63FF6305B -:10B6D000000000000000000000000000000000006A -:10B6E00000000000000000000000181808083030BA -:10B6F0000000FFC3FCC06666666600000000000034 -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 -:10B7400000006F0C600C000100007C704C40063F54 -:10B7500006300000000000000000000000000000B3 -:10B760000000000000000000000000001818080899 -:10B77000000000003F033C00FFF000F0000000006C -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 -:10B840000000000000004C4F7C7FF3F30303073738 -:10B85000C7F766000F0F00000000000000000000A6 -:10B8600000000000000000000000000000000000D8 -:10B87000437F30F0000000003EFE3EFEFF00FF0070 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000404370739F909F90B4 -:10B8D0000434C4F467000C0C0000000000000000F9 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000407C30F00000000402C202C2FF2CB5 -:10B90000FFEF000000000000000000000000000049 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B94000000000000000000000000000300800902F -:10B9500000A000613037000D00080000000000006A -:10B9600000000000000000000000000000000000D7 -:10B970000000000080612006C0010001006100009D -:10B9800000010000000000000000000000000000B6 -:10B990000000000005610A0F050D00A00000000076 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000028FFC7C7D717A4 -:10BA0000D414E828E8EB000000000000000000006B -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000028FFD7D7F1 -:10BA8000D717D414E828E8EB0000000000000000FD -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000003C0A -:10BB0000D8D8D7D71717E828E8EB000000000000C6 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB8000003CD0D0D4D41414E828E8EB0000000026 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000001000000000084 -:10BBC0000080008000000000000001000000000074 -:10BBD000000000000000000000000009000000005C -:10BBE00000000000000100000000000084000000D0 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000400000000 -:10BC400000000010001000000000000008000000CC -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000010000001100000000000100001061 -:10BCC0000000000000000000000000000000004034 -:10BCD00000410000010000000200004000000000E0 -:10BCE0000000000000000000000000000000000054 -:10BCF00000000009000000000040000000000000FB -:10BD000000400008000000000000000000000040AB -:10BD1000000000050000000000000000020000001C -:10BD20000000001000000000000000020000000001 -:10BD300000000000200000408208000000004000D9 -:10BD400000400000000000000000000000000000B3 -:10BD500000000000000008001108000000000000C2 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000800000000BB -:10BD800000000000100000000000000000000000A3 -:10BD9000000000000000000000000008000000009B -:10BDA0000000000800880000000000000000000003 -:10BDB0000000000000000000000001000000000082 -:10BDC00008000000000000000000002182000000C8 -:10BDD00000000000004101000041C105000000001A -:10BDE0000100000000000000000000000000000052 -:10BDF0000000000000000040000000000000000003 -:10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000000000000022 -:10BE200000000000000000100000000000400000C2 -:10BE300000000000000000000000000004000000FE -:10BE40000000800000000000000000000000000072 -:10BE500000000000000000002000000004000000BE -:10BE60001100040000840000000000000000000039 -:10BE700000000000000000000000000000000000C2 -:10BE800003000000000003000000000000000000AC -:10BE9000000800000000000000000000000000A0FA -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000200001100408032121 -:10BEC000C00800884000C004C0004002A0008208F2 -:10BED00082020002A00500080810014100100105BF -:10BEE000012000000000010000000000000000022E -:10BEF0000000020000000000400000000000000000 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF200000000000000000000000004000000000D1 -:10BF300040020000000000000000800008018001B5 -:10BF4000A000210121098000000100A08001000063 -:10BF500000010001000100880001800104000001CF -:10BF60002000200141000020040000A0000000008B -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000800080000A1 -:10BF90000000000000400000000000000000000061 -:10BFA00000000000200000880000000002400000A7 -:10BFB000000200000000000000000000100010005F -:10BFC00010082000A008100300002005A0051000A4 -:10BFD0000000C02140110005820482040803C00053 -:10BFE0004000A041000021800080004100000000CE -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C0300000009000000000000000000000008000F0 -:10C04000800080018000000180000000800000006E -:10C0500000000000000080000000000100018000DE -:10C060000000800000001100A0200004000000007B -:10C0700000041000000000000000000000000000AC -:10C0800000000000000000000000000000000000B0 -:10C0900000C0000000C00000000000000000080810 -:10C0A0000000000000000000000000000000000090 -:10C0B00000000084000000000000000000000000FC -:10C0C000200020002000110010051008A009200405 -:10C0D00000050000C000200440020041A004C0058B -:10C0E000820082100841A04100040004000000C04A -:10C0F0000000000000000040000000000000000000 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F -:10C1300000009000000088000000000000000000E7 -:10C140000000800080008000900880008041020094 -:10C15000000100000000000000008001000000015C -:10C16000000000000000800000000000000000004F -:10C1700000040000000000000000000000000000BB -:10C180000000000000C000000000000000000000EF -:10C190000000000800000000020000000000000095 -:10C1A0000000000000000000000000000004008803 -:10C1B0000000000800C000000000000000000000B7 -:10C1C0000000000091C10008881010030002050261 -:10C1D00010028202C04001A04002040800030121B5 -:10C1E0000009000800A001900404C0400241019031 -:10C1F00040040404000000000000000000000000F3 -:10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C2400000000000000091C1119104898009008064 -:10C25000898080808080C08003008000808000848E -:10C26000034000840085008003808080000080916E -:10C270004185008380830000000000000000000072 -:10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E -:10C2C0000000000000000000918011009100C110EA -:10C2D000090011008400C100C1802110809103C1B8 -:10C2E0001100A111A000008309008009800089A02D -:10C2F000038085411110854100000000000000000E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000000000000FD -:10C340000000000000000000000008900400410010 -:10C35000910084008800A0009100880805C1A00910 -:10C360001089A00209C01190048840408200A000FA -:10C37000900420C0020091419001000000000000E4 -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000080500A0C0 -:10C3D00010900901400400A104010105401000096A -:10C3E000401091C190010100000191014000000343 -:10C3F00004030508040400409090828300000000BC -:10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C440000000000000000000000000000000800963 -:10C4500000801090894180910090800511C1800971 -:10C4600000880080899100212003102009110040DC -:10C47000008380A191C08083218540C1809100000C -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D00041911100418000000084000000000041F3 -:10C4E000C18585004100820441A121008580404131 -:10C4F00083801180400085408585854085800303C9 -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000140010000840000008800A00004E9 -:10C560000001110810000284080089A11004088449 -:10C57000880104044140004008009004024040400B -:10C58000400100000000000000000000000000006A -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D00000000000000000E007000000818100E092 -:10C5E00007000006000000E000008406000000E0F4 -:10C5F00000000006000000E007000000000000E06E -:10C600000700608100000000000000000000000042 -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000A0AFA0AF00003C -:10C66000000000000000B0BCB3BFF5C0F000000F38 -:10C67000F0FF000000003C3C00FF00F0FFF0002055 -:10C680000020000F282F0000000000000000000024 -:10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000303F303F7C -:10C6E00000000000C0C00000808C838FF5CFF000F8 -:10C6F000ACACACAC00000000000000FF00F000F0AB -:10C700000020FFFF000F000F0000000000000000ED -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000050000503F0342 -:10C760003F0300000000CFEF0CAEFD3DCD0DC3C375 -:10C77000F3C3DFD31F13BFB5BAB0FF00C300FF0080 -:10C7800040000404FF0404FF040400000000000053 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000400001045 -:10C7E000FFFF0000000000C0CFCF0C0CF131C101F1 -:10C7F00000000000DCD01C101F151A10FF0AC30037 -:10C80000FFFF40000000FF0000FF000000000000EC -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 -:10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600050010000000000600036C00800000061B8 -:10C8700030060091000000613006000100000061F8 -:10C880000004000900000061000000010000000039 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0005555FF00AAAA3C3C000000004F4FB04F36 -:10C8F0007000000DE8E8E8E8C040000030F330F3D5 -:10C90000FF82F000F0F000F00E3E0C3C00003F3FD4 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C960000000F5F5FFF0FFAAFF3C00000000B0B0AA -:10C9700000FF000000000000FFFF0000C0400000BA -:10C98000FFFFFF00F000F0F200F20C3C0C3C00282E -:10C990003F3F000000000000000000000000000019 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E000000000000F0F3C3C00FF3C3C000000003A -:10C9F000030328E8000000000C0CFCFC0000FF0012 -:10CA0000ACACACAC00000000AAAAAAAA3CFF101073 -:10CA1000283F003F00000000000000000000000070 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA60000000000000000FFF3CFF0FFF3F3F0000F1 -:10CA70000000FCFC28E800000000ACACACAC0000FE -:10CA8000FF800CFC0CFC0000000000003C3C3CFF64 -:10CA90000000003F003F0000000000000000000018 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000541 -:10CAF000000384000000000500000000000000802A -:10CB0000000000008800000000000000000000009D -:10CB10000000000000000000000000000000010014 -:10CB200000030000000020000000000000000000E2 -:10CB300000000000000000000000000000000000F5 -:10CB40000080000000002000000004000000000041 -:10CB500000000000000000000000000000000000D5 -:10CB60000080000000000000000000000000000045 -:10CB70000000000000000000000000840000000031 -:10CB800000040000000000000000000000000000A1 -:10CB90000000000000000000000000000000000095 -:10CBA0002000000000000000000000000000000065 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000400000000000000000000000061 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000400000000000000000000000041 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC60000000000000410000000000000000000083 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA000000000000008000000080000000800006C -:10CCB00000080084000000000000000800080008D0 -:10CCC000000000840000008400080000000800004C -:10CCD0000084008800000000000000080008000830 -:10CCE0000000000800840084000000000000000034 -:10CCF0000000000000000000000000000000000034 -:10CD000000000000000000080008002100210021B0 -:10CD1000000800082000000000004008200800086B -:10CD200090000000840000050000002100000021A8 -:10CD3000002100000008000500410003002100055B -:10CD4000002100000008000000090021000300038A -:10CD5000002100000005000000210021000000006B -:10CD60000021000800000000000800000000000092 -:10CD700000000000000000000000000000000010A3 -:10CD800000000000410000000000008400000010CE -:10CD900005000500008800C0000000000000000041 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE0000880000000000000000000000000000009A -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000001000001 -:10CE300000000000000000000000000000000000F2 -:10CE4000A000000000000000000000000000000042 -:10CE50008200000000000000000000000000000050 -:10CE60000000000000004000A000000000000000E2 -:10CE700000000000000000000000110000000000A1 -:10CE80000000000000004000000000000000000062 -:10CE90000000000000000000000000000000100082 -:10CEA000400020000000000000020082000000009E -:10CEB0000000000000000000000000000000000072 -:10CEC00000000000000000000000008800000000DA -:10CED0000000000000100000000000000000000042 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000090000000000000210000000070 -:10CF10000000000000000000000000000000000011 -:10CF200000000000000000000000002100000021BF -:10CF300000000000002100000000000000000000D0 -:10CF400000000000000000000000000000000000E1 -:10CF50000008000000000000000000080041000080 -:10CF600000000000000000000000000000000000C1 -:10CF70000021000000000000000000000000000090 -:10CF8000008411000002000000002000000000C02A -:10CF90000000098805042100090000880000000045 -:10CFA0000000000008040000000000000000000075 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF00000C00000000000000000000088000000E9 -:10D000000000000000000000000000020021840079 -:10D01000840500000000000000080000004000003F -:10D0200000000000000000000000000000100008E8 -:10D0300000210000000000000000000000050000CA -:10D0400088000000002100000000000400000041F2 -:10D0500000210008000000000000000000000000A7 -:10D060000000000000000000200400000000000597 -:10D070008800002100000000000000000000000007 -:10D0800000C0008800000000000000000000000058 -:10D09000000200000504000021000000200005003F -:10D0A0000000000020000090000000044004400048 -:10D0B000400000000002000000000000000000002E -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D1000001000000000000000000000000C000005E -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000100000000020000FC -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000010000000008D6 -:10D1500000000000A000000000000000000000002F -:10D1600000000000000000000000010000000008B6 -:10D1700000000000000000000000000000000000AF -:10D1800000004100000000000000000202000080DA -:10D19000000000000000000000000000000000008F -:10D1A0000000000000000000000041091100000024 -:10D1B000000000000000000000000000000000006F -:10D1C00000000000000000000000000040092100F5 -:10D1D00000800000000000000000000000000000CF -:10D1E000000000000000000000000000404121009D -:10D1F00000800000000000000000000000000300AC -:10D2000000000080000080000000000009002000F5 -:10D210000080000000000000000000410000040049 -:10D2200000000000000000000000000004002100D9 -:10D2300000808000000000000000001100000000DD -:10D2400010000000000000000000000000000400CA -:10D2500082800000000000000000000000030000C9 -:10D2600010000000000000000000000000000900A5 -:10D2700082000040000000000000000000040000E8 -:10D280000100000000C000002000000000000200BB -:10D2900085040008C000020000000000000100003A -:10D2A000010000000000000000000000000003007A -:10D2B00002880008100002000000000000000000CA -:10D2C000000000000000000000000000000000005E -:10D2D00003001004008402000200000000000001AE -:10D2E000000000000000000000000000000000003E -:10D2F000880010400085C00002000000000000010E -:10D3000000000000C000000000000000000000005D -:10D310000004000002000000000000000000000007 -:10D3200000000000000000000000000000000000FD -:10D3300000040000C0000000000000000000000029 -:10D3400000000000000000000000000000000000DD -:10D3500000000010000000000000000000000000BD -:10D3600000000000000000000000000000000000BD -:10D3700000000004000000000000000000000000A9 -:10D38000000000000000800000000000000000001D -:10D39000000000800000000000000000000000000D -:10D3A000000000000000000000000000000000007D -:10D3B00000000000000080000000000000000000ED -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000800000C1000000000000DB -:10D41000000000000041800000110000000000003A -:10D420000000000000000004008300000000000075 -:10D43000000000000000800000100000000000005C -:10D440000000000000000010800000C1000000008B -:10D4500000000000000000418000001000000000FB -:10D460000000000000000010800000C1000000006B -:10D470000000000000000041000000040000000067 -:10D480000000000000000000400000C1000000009B -:10D49000000000000000001140000000000000003B -:10D4A0000000000000000000840100830000000074 -:10D4B0000000000000000010080000000000000054 -:10D4C00000000000000000000000200000400000FC -:10D4D000000000000000000000050800000000003F -:10D4E00000000000000000000000200000400000DC -:10D4F0000000000000000000009184000000000017 -:10D5000000000000000000000000000000000042D9 -:10D510000000000000004800810000E0000048001A -:10D5200000000000000000420000000000000000B9 -:10D530000000000000000000840000E00000A042A5 -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000810000E000006A -:10D560004800000000000000000000000000000073 -:10D5700000000000000000000000810000E000004A -:10D580004800000000000000000000000000000053 -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA -:10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D680000000000000000000000000000000747BAB -:10D69000000000000000000000000000000000008A -:10D6A000000000000000000000000000DE2E747B7F -:10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000DE2E00004E -:10D6D000747B00000000000000000000000000005B -:10D6E0000000000000000000000000000000DE2E2E -:10D6F000747B00000000000000000000000000003B -:10D700000000000000000000000000000000DE2E0D -:10D71000615603400000000000000231E0000000FC -:10D72000000000000C4000000000000002C06A86FB -:10D73000615603400000000000000230A00000001D -:10D74000000000000C4000000000000002C06A86DB -:10D750000000615603400000000000000230A000FD -:10D760000000000000000C4000000000000002C0AB -:10D770006A86615603400000000000000230A000ED -:10D780000000000000000C4000000000000002C08B -:10D790006A86000000000000000000000100000098 -:10D7A0000000000000000000000000000000000079 -:10D7B0000080000000000000008000000000010068 -:10D7C00000000000000000000080000000000000D9 -:10D7D00000800001000000000000000000000000C8 -:10D7E0000000000000000000000000000008000031 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D8100000000000000000000000000000002000E8 -:10D8200000000000000000000000000000000000F8 -:10D830000000004000000000000000400000000068 -:10D840002000000000000000000000400000000078 -:10D850000000004000000000000000000000000088 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000010000068 -:10D8B0000000000000000000001000000000000058 -:10D8C0000000000000000040000000000000000018 -:10D8D0000000000000100000000000000000001028 -:10D8E000000000000000000000000009001000001F -:10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D9100000000040000000000000000000000010B7 -:10D9200000000000000000000000004000080000AF -:10D9300000000000000000000000000000000000E7 -:10D94000000000000000000000000000008800004F -:10D9500000000000000000000000000000000000C7 -:10D9600000000008000000000000000000000000AF -:10D97000000000000000008800000000000000001F -:10D98000000000080000000000000000000000008F -:10D99000000000C0000000000000000000000000C7 -:10D9A0000000000000000000000000000100010075 -:10D9B000010000050121000200000000000000003D -:10D9C00000000008000500000000000000800100C9 -:10D9D00000050000008020000000000000000000A2 -:10D9E0000000000000100000000000000000000027 -:10D9F0000000000000210000000000000000000006 -:10DA000000000000002100000000000000000000F5 -:10DA100000000000004100000000000000000000C5 -:10DA200000000000000000000000000000002000D6 -:10DA30000400200000A020A00000218203000000BC -:10DA400000000000000000000000000000000004D2 -:10DA50002000000000A0000480080000000000007A -:10DA600000000000000000A0000000000000000016 -:10DA70000000000000000008000000C000000000DE -:10DA800000000000000000A00000000000000000F6 -:10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000002000200036 -:10DAB00004000000C000C0000000A00020008200A0 -:10DAC0004000C0001000200020002000C0008200A4 -:10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 -:10DB100000000000020000000000000000002000E3 -:10DB20000000000000000000000000000000800075 -:10DB30000000C100000000002110002000000000D3 -:10DB400000008000000080000000008421880300A5 -:10DB500000000000000000000002000000000000C3 -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000000000000085 -:10DBA00020000000000000000000200000004000F5 -:10DBB00000000000C00300800405A005A021880229 -:10DBC000A000C0000000C0041100200020A0A0A000 -:10DBD00020002000C0410000C00000102000000014 -:10DBE0000004000000000000000000000000000031 -:10DBF0000000000000000000000000000000000025 -:10DC00000000000000000000000000000000000014 -:10DC10000000000000000000000000000000000004 -:10DC200000000000000000000000000080840000F0 -:10DC300080000000000000000004800000000000E0 -:10DC400000000000000000880501A00080008005A1 -:10DC50000021800080880082000000000000800019 -:10DC600000000001000000000000000000000000B3 -:10DC70000000000000000000000000000000001094 -:10DC80000000000000000000000000000000001084 -:10DC90000000000000002100000000000000000063 -:10DCA0000000000000000000000000000000000074 -:10DCB0002000000000002004200040002004200577 -:10DCC000A0040000002020042104040400212000FE -:10DCD0002004C000C08420008240820000000011A7 -:10DCE00000000020002000000000000000000000F4 -:10DCF0000000000000000000000000000000000024 -:10DD00000000000000000000000000000000000013 -:10DD100004000000000000000000000000000000FF -:10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000200000002000A3 -:10DD4000A100040021002000200440004120200008 -:10DD50000000000000000020210000C0038421001A -:10DD60000000000000004100000000000000000072 -:10DD700000000000000000000000000000000000A3 -:10DD80000000000000000000000000000000000093 -:10DD90000000000000000000000000000000000083 -:10DDA0000000000000000000000000000000000073 -:10DDB000000000010000C000000008208508C0101D -:10DDC0000010019000400008000800A001400084FD -:10DDD00000021105900884020083009001C040A059 -:10DDE000000801040182048200A00000000000007D -:10DDF0000000000000000000000000000000000023 -:10DE00000000000000000000000000000000000012 -:10DE10000000000000000000000000000000000002 -:10DE200000000000000000000000000000000000F2 -:10DE3000000000000011111100100000808004801B -:10DE4000808000801109008900C100800500030066 -:10DE5000000000009184858580C100A04005032159 -:10DE60000005008511C0030580410040000000004E -:10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000000000092 -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000020004000411418086 -:10DEC0008580911180000300091011A00508110040 -:10DED00021A1200000C141008500851183A04000E0 -:10DEE00003C0118040C10380052111404040000063 -:10DEF0000000000000000000000000000000000022 -:10DF00000000000000000000000000000000000011 -:10DF10000000000000000000000000000000000001 -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000001000100DF -:10DF40008408029082019000000000C0019100004E -:10DF500000840108019000894020020084019003A0 -:10DF60000040000501020005004000400182004021 -:10DF700000000000000000000000000000000000A1 -:10DF80000000000000000000000000000000000091 -:10DF90000000000000000000000000000000000081 -:10DFA0000000000000000000000000000000000071 -:10DFB000000000000000000000000000000100015F -:10DFC00001008840000882900111C000000001009B -:10DFD000400002010000100140019004000300A075 -:10DFE0000083080001004000C1012001000004007E -:10DFF000840100000000000000000000000000009C -:10E000000000000000000000000000000000000010 -:10E010000000000000000000000000000000000000 -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000090203D2 -:10E04000112111090083008500C1049180000200A4 -:10E0500040001000800400218020001100832190E6 -:10E060000311009180400804400511110020210592 -:10E0700085410011000000000000000000000000C9 -:10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 -:10E0B000000000000000000000000000000011004F -:10E0C00011000200400008840591118003110980AD -:10E0D0008911900083034102852103000903038312 -:10E0E00005C004000340C1809100050005050282BF -:10E0F00085008500034000000000000000000000D3 -:10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000000000FF -:10E1200000000000000000000000000000000000EF -:10E1300000000000000000000000000000000000DF -:10E1400000100100000001000141000900840100ED -:10E1500090048201080009008985400084000201C2 -:10E160000002000201A00000104083008800C000EF -:10E170009141020002008400000000000000000045 -:10E18000000000000000000000000000000000008F -:10E19000000000000000000000000000000000007F -:10E1A000000000000000000000000000000000006F -:10E1B000000000000000000000000000000000005F -:10E1C0000000000000E000000000000000E0070088 -:10E1D0000021000000E000006000000000E00000FE -:10E1E0000006000000E007000000000000E0000062 -:10E1F0000012000000E0000000000000000000002D -:10E20000000000000000000000000000000000000E -:10E2100000000000000000000000000000000000FE -:10E2200000000000000000000000000000000000EE -:10E2300000000000000000000000000000000000DE -:10E2400000000000000000000000000000000000CE -:10E25000BFB02F207F4F7C4C00000000FEF2CEC2EA -:10E260000000000000000000F636C606FF3CC300B8 -:10E2700000000000F7B57634000000000000000048 -:10E28000000000000000000000000000000000008E -:10E29000000000000000000000000000000000007E -:10E2A000000000000000000000000000000000006E -:10E2B000000000000000000000000000000000005E -:10E2C000000000000000000000000000000000004E -:10E2D0000000BFB02F2073437040000000003E32AA -:10E2E0000E020000000000000000F636C606E4E45E -:10E2F000E4E400000000D391521000000000000090 -:10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD -:10E3200000000000000000000000000000000000ED -:10E3300000000000000000000000000000000000DD -:10E3400000000000000000000000000000000000CD -:10E3500000000000000000000000000000000000BD -:10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D -:10E3A000000000000000000000000000000000006D -:10E3B000000000000000000000000000000000005D -:10E3C000000000000000000000000000000000004D -:10E3D0000000003FFF3F00039F9F707C737F0000A1 -:10E3E000000043734F7F00000000303F3F3F0000BC -:10E3F000BDBD253D677F0000000029B92FBF00008B -:10E40000000000000000000000000000000000000C -:10E4100000000000000000000000000000000000FC -:10E4200000000000000000000000000000000000EC -:10E4300000000000000000000000000000000000DC -:10E4400000000000000000000000000000000000CC -:10E45000000000000030FF3000009F9F404C434F01 -:10E460000000000040704C7C00000000303F303065 -:10E470000030BDBD0119435B0000000020B026B68E -:10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C -:10E4C00000000000000000000000000000000061EB -:10E4D000000000090000006100040001000000616C -:10E4E00030000005000000613006000100000061FE -:10E4F0000000000100000061300000010000006128 -:10E5000030000001000000000000000000000000DA -:10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000000000000CB -:10E550003C3CFF0000F000F15F3C0A3C00280F2F1C -:10E56000FF3C0F3C000000000000000030F330F3DF -:10E570000C3C0E3E004000F0FF00FF284040FFF042 -:10E58000507C003C00140F1F000000000000000041 -:10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C000000000000000000000000000000000004B -:10E5D00000000F0FFF00F0F0F0F15F3C0A3C00007C -:10E5E0000F0F003C0F3C000000000D007000000009 -:10E5F000FFFF003C003C0040FFFFF000F000000087 -:10E60000FFF0003C003C00000F0F00000000000085 -:10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000000000EA -:10E6300000000000000000000000000000000000DA -:10E6400000000000000000000000000000000000CA -:10E65000000000000FFF0F0000F00FFF000000009F -:10E66000ACFCACFCFF0F550F143F003F0000000056 -:10E67000ACACACAC0C0F000F0C2C0C2C5555505006 -:10E6800000FF00F0000F000F000F000F000000005F -:10E69000000000000000000000000000000000007A -:10E6A000000000000000000000000000000000006A -:10E6B000000000000000000000000000000000005A -:10E6C000000000000000000000000000000000004A -:10E6D00000000000000055FF550000F000F00000B1 -:10E6E0000000AC0CAC0C000F550F000F000F000029 -:10E6F00000000CFC0CFC2C2F000F0CAE0C2C557DDC -:10E70000505080FF80F0141F000F000F282F0000D2 -:10E7100000000000000000000000000000000000F9 -:10E7200000000000000000000000000000000000E9 -:10E7300000000000000000000000000000000000D9 -:10E7400000000000000000000000000000000000C9 -:10E7500000000000000000000000000000000000B9 -:10E7600000000000000000000000000000000000A9 -:10E770000000000000000000000000000000000099 -:10E780000000000000800000000000000000000009 -:10E790000001000000000000000000000000000078 -:10E7A0000000000000000000000000000000000069 -:10E7B0000000000000000000000000000000000059 -:10E7C0000000000000000000000000000000000049 -:10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000000000000000000000029 -:10E7F0000000050000000000000000000000000014 -:10E8000000000000000000200000000000000000E8 -:10E8100000000000000000000000000000000000F8 -:10E8200000000000000000000000000000000000E8 -:10E8300000000000000000000000000000000000D8 -:10E8400000000000000000000000000000000000C8 -:10E8500000000000000000000000000000000000B8 -:10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 -:10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000000000078 -:10E8A0000000000000000000000000000000000068 -:10E8B0000000000000000000000000000000000058 -:10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000008000000080000000820 -:10E8E00000080008000800000008000800080000F8 -:10E8F0000008004000080008000000400000004040 -:10E9000000820008000800000082000800400000AB -:10E9100000080000004000000008000000000000A7 -:10E920000000000000080008000000000040000097 -:10E93000000000080000000000400000000000008F -:10E9400000000000000800100000000000000000AF -:10E9500000000008000000000000000000000000AF -:10E9600000000000000000000000000000000000A7 -:10E9700000000000010000000000000020000080F6 -:10E980000000000000000000010004002000000062 -:10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000000000000000067 -:10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000000000000000047 -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000C000C00000A7 -:10E9F000000000000000040000000384000080C04C -:10EA000000040000000000000000040080008000FE -:10EA100000000000000000000000000000000000F6 -:10EA200000000000000000000000000000000000E6 -:10EA300000000000000000000000000000000000D6 -:10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000000000B6 -:10EA60000000000000000000008000009000000096 -:10EA70000000000000000000000090008200000084 -:10EA800090008880A000000000000000000000004E -:10EA90000000000000000000000000000000000076 -:10EAA0000000000000000000000000000000000066 -:10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000100000000016 -:10EAF0000000000000000000000000000000000016 -:10EB000000000000002000000000000000000000E5 -:10EB100000000040000000000000000000000000B5 -:10EB200000000000000000000000000000000000E5 -:10EB30000000000000000000000000400000000095 -:10EB400000000000000000000000000000000000C5 -:10EB50000000000000000000000000400000000075 -:10EB600000000000000000000000000000000000A5 -:10EB7000000000000000000000000500000001008F -:10EB8000A000058000C10000A000000000000000FF -:10EB90000000008000000180000000000000000074 -:10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000000045 -:10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 -:10EBF0000000000000C000000000200084000000B1 -:10EC00000400000084040020000021000000000037 -:10EC10004100000000040084040421000000000002 -:10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000000000000000D4 -:10EC400000000000000000000000000000000000C4 -:10EC500000000000000000000000000000000000B4 -:10EC600000000000000000000100000000000000A3 -:10EC700000000000900000009000000090004000A4 -:10EC8000000000004000004100000009A011000049 -:10EC900000008200200000000000000000000000D2 -:10ECA000000900000000000000000000000000005B -:10ECB0000000000000000000000000000000000054 -:10ECC0000000000000000000000000000000000044 -:10ECD0000000000000000000000000000000000034 -:10ECE00000000000000000000420080000000000F8 -:10ECF0000000000000000000000000000000000014 -:10ED00000000000000000000000000000000000003 -:10ED10000000000000008000000000000000000073 -:10ED200000000000000000000000000000000000E3 -:10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 -:10ED800000A0000800A008081004010440A020A072 -:10ED90000000000000000000C005A191C082828335 -:10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000000000000053 -:10EDC0000000000000000000000000000000000043 -:10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 -:10EDF0000000000000000000000000000000000013 -:10EE000000000000008000008080C08020008000A2 -:10EE100000000000000000000000801120A000C0E1 -:10EE20008020000000000000000000000000000042 -:10EE300000000000000000000000000000000000D2 -:10EE400000000000000000000000000000000000C2 -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 -:10EE70000000000000000000000000000000000092 -:10EE800000000000800000008000800020004100A1 -:10EE9000401184000000000000000000C080410418 -:10EEA000C09140830000000000000000000000004E -:10EEB0000000000000000000000000000000000052 -:10EEC0000000000000000000000000000000000042 -:10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000000000000012 -:10EF0000000000000000040082000400900041A006 -:10EF1000A000A1019000000000000000000004C05B -:10EF2000A000848382910000000000000000000027 -:10EF300000000000000000000000000000000000D1 -:10EF400000000000000000000000000000000000C1 -:10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 -:10EF70000000000000000000000000000000000091 -:10EF80000000000000000000004000A090A002105F -:10EF90000001004090A002A100000000000000005D -:10EFA000C00401419082C182000000000000000006 -:10EFB0000000000000000000000000000000000051 -:10EFC0000000000000000000000000000000000041 -:10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000800000800000 -:10F0100080800020008580418011000000000000F9 -:10F020000000804041838340110500000000000083 -:10F0300000000000000000000000000000000000D0 -:10F0400000000000000000000000000000000000C0 -:10F0500000000000000000000000000000000000B0 -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F090000000000005020491208003100000000021 -:10F0A0000000000084004011030040400000000008 -:10F0B0000000000000000000000000000000000050 -:10F0C0000000000000000000000000000000000040 -:10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000000FF -:10F1100000A000A000000001000501400101000066 -:10F1200000000000000090A0A0A1A1C0830000008A -:10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF -:10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F -:10F190000000000007000000000000E00700000081 -:10F1A0000000000000000000000000E00700500028 -:10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F2000000000000000000000000000000000000FE -:10F210000000000000003CF03CF000000000F0AAFC -:10F22000F0FF0000000000000000A000F3F3F0F485 -:10F23000003400000000000000000000000000009A -:10F2400000000000000000000000000000000000BE -:10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E -:10F2900000000000000000003C003CFF00000000F7 -:10F2A000F0AAF00000000000000000000000C3C34E -:10F2B000F0F000300000000000000000000000003E -:10F2C000000000000000000000000000000000003E -:10F2D000000000000000000000000000000000002E -:10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F3000000000000000000000000000000000000FD -:10F310000000000000005F5C5350AFAF03005F5C73 -:10F32000535055FF00000000000000000000D7000F -:10F33000C3003C08FF0800000000000000000000BF -:10F3400000000000000000000000000000000000BD -:10F3500000000000000000000000000000000000AD -:10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D -:10F38000000000000000000000000000000000007D -:10F3900000000000000000005F5C5350AAAA0000BB -:10F3A0005F5C535055FF404000000000000000002B -:10F3B000D705C3000000FF000000000000000000AF -:10F3C000000000000000000000000000000000003D -:10F3D000000000000000000000000000000000002D -:10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D -:10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC -:10F420000000006100040001000000000000000076 -:10F43000000000610000000100000000000000006A -:10F4400000000000000000000000000000000000BC -:10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000000007C -:10F49000000000000000000000000000000000006C -:10F4A000000000007D2D78280000C3C3000000008C -:10F4B000000000000C0F0C0FF0A0F0A000000000F6 -:10F4C000000000000000000000000000000000003C -:10F4D000000000000000000000000000000000002C -:10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB -:10F5100000000000000000000000000000000000EB -:10F520000000000000007D2D782800A0C3E300004B -:10F530000000000000000C0F2C2FF2A2F0A0000031 -:10F5400000000000000000000000000000000000BB -:10F5500000000000000000000000000000000000AB -:10F56000000000000000000000000000000000009B -:10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000007B -:10F59000000000000000000000000000000000006B -:10F5A000000000000000000000000000C0E8FCE8CF -:10F5B0000000000000000000FCFC0000F000F0F083 -:10F5C000000000000000000000000000000000003B -:10F5D000000000000000000000000000000000002B -:10F5E000000000000000000000000000000000001B -:10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA -:10F6100000000000000000000000000000000000EA -:10F620000000000000000000000000000000C0E832 -:10F63000FCE80000000000000000FCFC0028F000D6 -:10F64000F1F10000000000000000000000000000D8 -:10F6500000000000000000000000000000000000AA -:10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F6800000000000000000000000000000840000F6 -:10F690000010002000000000000002000000000038 -:10F6A000000000000000000000000000000000005A -:10F6B000000000000000000000000000000000004A -:10F6C000000000000000000000000000000000003A -:10F6D000000000000000000000000000000000002A -:10F6E000000000000000000000000000000000001A -:10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000009F0 -:10F7100000000001000100000000000000000000E7 -:10F7200000000000000000000000000000000000D9 -:10F7300000000000000000000000000000000000C9 -:10F7400000000000000000000000000000000000B9 -:10F7500000000000000000000000000000000000A9 -:10F760000000000000000000000000000000000099 -:10F770000000000000000000000000000000000089 -:10F780000000000000000000000000000000000079 -:10F790000000000000000000000000000000000069 -:10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000000000000000000000049 -:10F7C0000000000000000000000000000000000039 -:10F7D0000001000000000000000000000000000028 -:10F7E0000000000000000000000000000000000019 -:10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F810000000000800080000001000840008000834 -:10F8200000080008000800000008000000080000B0 -:10F830000008001000080000000000000008008818 -:10F840000010004000080084001000000084000048 -:10F850000008000000000010000000000000000888 -:10F860000000000000080088000000000000008484 -:10F8700000000008000000840000000000000010EC -:10F880000000000000080040000000000000000030 -:10F89000000000080000000000000000000000055B -:10F8A000000500000000000000000000000500004E -:10F8B00000008200000000000000000000000000C6 -:10F8C0000000000000080000000000000000000030 -:10F8D0000000000000000000000800100000000010 -:10F8E0000005000000000000000000000000000013 -:10F8F0000000000000000000000000000000000008 -:10F9000000080000000000000041000000000000AE -:10F9100000000000000000000000000000000000E7 -:10F9200000000000000000000000000000000000D7 -:10F930000000000003C00000000000000000000004 -:10F94000000000000000000000A000000000000017 -:10F95000000800000000000000000000000000009F -:10F960000000000000000000000000000000000097 -:10F970000000000000000000000000000000000087 -:10F980000000000000000000000000000000000077 -:10F990000000000000000000000000000000000067 -:10F9A0000000000000000200000000000000000055 -:10F9B0000000000000000000000000000000000047 -:10F9C0000000000000000000000000000000000037 -:10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000000000000000017 -:10F9F0000000000000000000000000000000000007 -:10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 -:10FA200000000000000000000000000000000000D6 -:10FA300000000000000000000000000000000000C6 -:10FA400000000000000000000000000000000000B6 -:10FA500000000000000000000000000000000000A6 -:10FA60000000000000000000000000000000000096 -:10FA70000000000000000000000000000000000086 -:10FA80000000000000000000000000000000000076 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000000000000000000000000000056 -:10FAB0000000000000000000000000000000000046 -:10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000000026 -:10FAE0000000000000000000000000000000000016 -:10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB200000000000000000000000000000000000D5 -:10FB300000000000000000000000000000000000C5 -:10FB400000000000000000000000000008000000AD -:10FB500000000000000000000000000000000000A5 -:10FB60000000000000000000000000000000000095 -:10FB70000000000000000000000000000000000085 -:10FB80000000000000000000000000000000000075 -:10FB90000000000000000000000000000000000065 -:10FBA0000000000000000000000000000000000055 -:10FBB000000000100008000000000000000000002D -:10FBC0000021000000000000000000000000000014 -:10FBD0000000000000000000000000000000000025 -:10FBE0000000000000000000000000000000000015 -:10FBF00000000000000800000000000000000000FD -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 -:10FC20000000000000000090000000000000000044 -:10FC300000000000000000000000000000000000C4 -:10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000000000000000A4 -:10FC60000000000000000000000000000000000094 -:10FC70000000000000000000000000000000000084 -:10FC80000000000000000000000000000000000074 -:10FC90000000000000000000000000000000000064 -:10FCA00000000000000000000000008300000000D1 -:10FCB0000000000000000000000000000000000044 -:10FCC0000000000000000000000000000000000034 -:10FCD0000000000000000000000000000000000024 -:10FCE0000000000000000000000000000000000014 -:10FCF0000000000000000000000000000000000004 -:10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000100000C3 -:10FD300000000000000000000000000000000000C3 -:10FD400000000000000000000000000000000000B3 -:10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000000000000000000093 -:10FD70000000000000000000000000000000000083 -:10FD80000000000000000000000000000000000073 -:10FD90000000000000000000000000000000000063 -:10FDA00000000000000000000000002000000040F3 -:10FDB0000000000000000000000000000000000043 -:10FDC0000000000000000000000000000000000033 -:10FDD0000000000000000000000000000000000023 -:10FDE0000000000000000000000000000000000013 -:10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000000000000000F2 -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000A0000001000031 -:10FE300000010000000000000000000000000000C1 -:10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 -:10FE80000000000000000000000000000000000072 -:10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000000000000000151 -:10FEB0008404900100000000000000000000000029 -:10FEC0000000000000000000000000000000000032 -:10FED0000000000000000000000000000000000022 -:10FEE0000000000000000000000000000001000011 -:10FEF0000000000000000000000000000000000002 -:10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000000000000000E1 -:10FF20000000000000000000000000000000004190 -:10FF300000038000400200000000000000000000FC -:10FF400000000000000000000000000000000000B1 -:10FF500000000000000000000000000000000000A1 -:10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 -:10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000000000000000000051 -:10FFB0000005804000000003000000000000000079 -:10FFC0000000000000000000000000000000000031 -:10FFD0000000000000000000000000000000000021 -:10FFE0000000000000000000000000000000000011 -:10FFF00000020000000000000000000000000000FF -:020000040024D6 -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000020000000001000000000000BD -:1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000000000000A0 -:100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 -:1000A0000000000000000000000000000000000050 -:1000B00000000000818100C8430000000000000033 -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 -:1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B00000000000000000004200048180000000F8 -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F -:1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000440A05A -:1002C0000502200000000000000000000000000007 -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E -:1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED -:1003100000000000000000000000000000000000DD -:1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD -:1003400000000000000000000000000000000000AD -:10035000000000000000000000000000000000009D -:10036000000000000000000000000000000000008D -:10037000000000000000000000000000000000007D -:10038000000000000000000000000000000000006D -:10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D -:1003B000000000000000000000000000000000003D -:1003C000000000001000000000000000000000001D -:1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D -:1003F00000000000000000000000000000000000FD -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC -:10044000000000000004000880020000000000001E -:10045000000000000000000000000000000000009C -:10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C -:10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B000000000000000000000000000000000003C -:1004C00000000000008A020000455100000000000A -:1004D000000000000000000000000000000000001C -:1004E000000000000000000000000000000000000C -:1004F00000000000000000000000000000000000FC -:1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB -:10054000000000000000000009999000000A00006F -:10055000000000000000000000000000000000009B -:10056000000000000000000000000000000000008B -:10057000000000000000000000000000000000007B -:10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C0000000000000000000FFFFFFFFFFFFFFFF33 -:1005D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B -:1005E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B -:1005F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B -:10060000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA -:10061000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA -:10062000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA -:10063000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA -:10064000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA -:10065000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA -:10066000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A -:10067000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A -:10068000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A -:10069000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A -:1006A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A -:1006B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A -:1006C000FFFFFFFFFFFFFFFFFFFFFFFF0000000036 -:1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000000000000000000000000FA -:1007000000000000000000000000000000001001D8 -:1007100000001001000000000000000000000000C8 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:100780000000000000000000000000000000000069 -:100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 -:1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000000000000F9 -:1008000000000000000000000000000000000000E8 -:100810000000400000004004000000000000000054 -:1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000000000A8 -:1008500000000000000000000000A40000000000F4 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 -:100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:1009100000000000000100000000000000000000D6 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 -:100990000000000000000000000000000000000057 -:1009A0000000000000000000000000000000000047 -:1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000000000000000017 -:1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000040000E2 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000008BE -:100A300000000000000000000002000000000000B4 -:100A400000000000000000000000000000000000A6 -:100A5000000000000000000000000008000800087E -:100A6000000800840008000800080008000800844E -:100A7000000800080008000800080008000400083A -:100A800000080084000800080008000800080008AA -:100A9000000800080008000800080000000800081E -:100AA000000800080008008400080008000800088A -:100AB0000002000800080040000800080008008448 -:100AC000000800080008000800080008008400086A -:100AD00000080008000800020002000800000021D1 -:100AE000002100210008000000210000000000217A -:100AF0000040002100210000000300000000002150 -:100B0000000500200003000000000000000000219C -:100B100000000000000300000021000000000000B1 -:100B2000002000000021000000080021000000005B -:100B3000000000000020000000080003000000008A -:100B400000000000000000000000000000000000A5 -:100B50000020000000000000000000000000000075 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C8000000000000000000000000008000000005C -:100C900000000000000000000000000000A00000B4 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE00000080000000000000000000000000000FC -:100CF00000050000000000000000000000000000EF -:100D000000000000000000080000000000000000DB -:100D100000000000000000000000002100000000B2 -:100D200000000000000000000000000000200000A3 -:100D300000000000000000000000000000000000B3 -:100D4000000000000000000000080000000000009B -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000080000EB -:100E000000000000000000000000000000000000E2 -:100E100000000000002100000000000000000000B1 -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF0000000000000000000800000000000000071 -:1010000000000000000000000000000000000000E0 -:10101000800000000000004100000000000000000F -:1010200000000000000000008000000000000041FF -:1010300000000000000000000000000000000000B0 -:10104000000080000000000000418000000000005F -:10105000004100000000000000000000000000004F -:101060000000000000000000000000000000000080 -:101070000000000000000000000010000000000060 -:101080000000000000000000000000000000000060 -:101090000000C0000000000000010000000000008F -:1010A00000000000000000000000C0000000000080 -:1010B000000100000000000000000000000000002F -:1010C00000000000C000000000000001C00000009F -:1010D000000000010000000000000000000000000F -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF -:1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F -:1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:1012000000100000000000000000000000000000CE -:1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000000BE -:1012300000000000000000000002000000000000AC -:10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E -:1012B000000000000000000000000000000000002E -:1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E -:1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE -:101300000000000081000000000000070000000055 -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:101400000000000000000000000000001401800047 -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C -:1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100010040000000000000000000000000000B7 -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB -:1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A -:101690000000000000040000000000000000000046 -:1016A0000000000000000000000000000004000036 -:1016B00080000000000000000000000000000000AA -:1016C0000000000000040000800000000000000096 -:1016D0000000000000000000000000000000000406 -:1016E00000008000000000040000800000000000F6 -:1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000020000B7 -:101730000000400000000000000000000000000069 -:101740000000000000020000000040000000000057 -:101750000000000000000000000000000000000287 -:1017600000000000400000020000000040000000F7 -:101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000008080000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000900000000000000000000000000099 -:1017C0000000000000000000000090000000000089 -:1017D0000000000000000000000000000000000009 -:1017E00000000000900000000000000090000000D9 -:1017F00000000000000000000000000000000000E9 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:10199000000000000000000800000000000000003F -:1019A000000000000008000000080008000000001F -:1019B000000000000000008800000000000000009F -:1019C000000000000008000000880008000000007F -:1019D0000000000000000000000000000000000007 -:1019E00000080000400000040000000000080000A3 -:1019F00000000000000000000000000000000000E7 -:101A00000008000000000000000000004088000006 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A4000000800000000000000000000000000008E -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA00000000000000000000000008400000000B2 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000010000000100000001000000000000000A4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D30000000000000000000000000000021000082 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE -:1022100000000000000000000000000000000000BE -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E -:10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD -:10233000000000000000000000000000000000009D -:10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D -:10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D -:1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D :1023D00000000000000000000000000000000000FD -:1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000000CC -:1024100000000000000000000000000000000000BC -:1024200000000000000000000000000000000000AC -:10243000000000000000000000000000000000009C -:10244000000000000000000000000000000000008C +:1023E0000800010000800000000000000000000064 +:1023F00000000000000000000000040002000000D7 +:1024000020000000000000000000000000000003A9 +:1024100000000000000000000000000020002080FC +:102420008800200000000000000000000000000004 +:1024300000008400020000000000000220002000D4 +:102440002000000000000200C0000000000040006A :10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C -:10247000000000000000000000000000000000005C +:102460004000C0000800001005000000000000004F +:102470000000000000000000000000008000C1001B :10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C -:1024A000000000000000000000000000000000002C -:1024B000000000000000000000000000000000001C +:1024A000002000000000000000000000000000000C +:1024B000000000000000000000000000008200009A :1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC -:1025000000000000000000000000000000000000CB +:1024D000000000410000000000000000000000407B +:1024E00000100000000000090010000000000000C3 +:1024F00000000000000000000000000000030800D1 +:10250000000502000000000000094000000000007B :1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B +:102520000000000000000010000000100200000089 +:102530000040000000000200000000408200000097 +:102540000000000000000000840000000000000007 +:102550000000000000000040000000000008000033 +:1025600000040040000000080010000800080000FF +:102570000000000000000000000000000004000057 +:1025800080000008000000400010009080820000E1 :10259000000000000000000000000000000000003B -:1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA -:1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA -:10263000000000000000000000000000000000009A +:1025A00000C00010001000000082000000000000C9 +:1025B00000000000000000000000000000C000005B +:1025C0000000000000000000020002000000000007 +:1025D00000000200000000000021000000000000D8 +:1025E00000000000000000000009000000000000E2 +:1025F00000009000000000000005002100210041C3 +:10260000000001000010000000100010001000A1E8 +:102610000040000000050001000000000000000074 +:1026200000020000000000000000000000000000A8 +:102630000000000000000000000000000000000496 :10264000000000000000000000000000000000008A :10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:10267000000000000000000000000000000000005A -:10268000000000000000000000000000000000004A -:10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A -:1026C000000000000000000000000000000000000A +:102660000000000000000008000000000000000062 +:102670000008000000000000000000000000000052 +:102680000000004008000000000000000000000002 +:102690000002000000000000000100000000000037 +:1026A0004100000000004110000000000000000098 +:1026B00000A00082000000000040000000000000B8 +:1026C00000004000110000000000000000000000B9 :1026D00000000000000000000000000000000000FA :1026E00000000000000000000000000000000000EA :1026F00000000000000000000000000000000000DA :1027000000000000000000000000000000000000C9 -:1027100000000000000000000000000000000000B9 +:10271000000000040000000000050000A000000010 :1027200000000000000000000000000000000000A9 :102730000000000000000000000000000000000099 -:102740000000000000000000000000000000000089 -:102750000000000000004000200000000000000019 -:102760000000000000002000200000000000000029 -:1027700000100000400000002000000000000002E7 -:102780000000000000000000200000000000000029 -:1027900000000010000020004000000000000000C9 +:1027400000000000000090000000020000000800EF +:102750002000000020000000000002000000000037 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000800000010000031 +:102790000000000000000000000000000000000039 :1027A0000000000000000000000000000000000029 -:1027B000000000000000840000000000C0000000D5 -:1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 +:1027B0000000020000000000000000000000000017 +:1027C00000000000200000000000000400000000E5 +:1027D00000000008000000000000000000000000F1 +:1027E00000000000000000000000080000000000E1 +:1027F00000000008000000020000000500090000C1 +:10280000002100000000000000080080000000001F +:102810000008000000034002000000040000000067 +:10282000000000000000C0000000000000000000E8 :102830000000000000000000000000000000000098 -:102840000000000000000000000000000000000088 -:102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 -:102880000000000000000000000000000000000048 -:102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 -:1028B0000000000000000000000000000000000018 -:1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000000000F8 -:1028E00000080000000000000008000000000000D8 -:1028F00000000000000000000000000000000000D8 -:1029000000080000000000000008000000000000B7 -:1029100000000000000000000000000000000000B7 -:10292000000000100000000000000008000000008F +:1028400000000000000000099000000000000000EF +:1028500000000000000000000000000000008200F6 +:1028600000000000000000000000000080000000E8 +:1028700000000088000000080000000000000000C8 +:102880000000000000000000000000000010000038 +:1028900000000082000000040000000000000000B2 +:1028A000000009000000000000000000000000001F +:1028B0000000030000000000000000000000000015 +:1028C0000000000000000000000000900008000070 +:1028D00000000800000000004100000000000000AF +:1028E000100000040000000000000000880000004C +:1028F00000000000000000000000002100050003AF +:102900000121000000210003000000000010000071 +:102910000000000000000000004040000000000037 +:10292000000000000000000000000008000000009F :102930000000000000000000000000000000000097 -:10294000000000000000000000000008000000007F -:102950000000000000000000000000000000000077 -:102960000000000000000000000000000000000067 +:102940000000000000000000000000000000000087 +:1029500000000000000000000000000020008200D5 +:102960002000900020000000000000000000000097 :102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:102990000000000000000000000000000011000026 -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 -:1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 +:102980000000200000000000000005000000000022 +:102990000000000000000000020000008040000075 +:1029A0000000050000000000000000000000000022 +:1029B00000000000000000000000200000000000F7 +:1029C00000000004200000000000000020000000C3 +:1029D00000000000000000000000000000000020D7 +:1029E0000082000000000000000000000000000065 +:1029F00000000000000088C010200008C082000015 +:102A0000010000000000000000000000000002883B +:102A10000088001008100000000000000000000006 :102A200000000000000000000000000000000000A6 :102A30000000000000000000000000000000000096 :102A40000000000000000000000000000000000086 :102A50000000000000000000000000000000000076 :102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 +:102A70000000000000000000110000800080808045 +:102A8000000008000000000000000000000000003E +:102A900000800000000080800000000000000000B6 +:102AA000000200000010000900000000000000000B :102AB0000000000000000000000000000000000016 -:102AC00000000800000000000000000000000000FE -:102AD0000000820000000000000000002100000053 -:102AE00008000000100008000000000000000000C6 -:102AF00000000000000000000000000021000000B5 -:102B000000000000080008000000000000000000B5 -:102B100000A00000000000000000000000002100F4 -:102B2000000000000000100008000000000000008D -:102B3000000000000000000008000000000000008D -:102B400000000500400008004000000040000000B8 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000080048000D2 +:102B00008000000000000000000000000000000045 +:102B100000000000000000020000000000000000B3 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 :102B50000000000000000000000000000000000075 :102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 +:102B700000000000000000000000000088000805C0 +:102B80004002088400000000000000000000000077 +:102B900000000000000000840000000000000000B1 :102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 +:102BB0000000000000000000100000000000000005 :102BC0000000000000000000000000000000000005 :102BD00000000000000000000000000000000000F5 :102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 +:102BF0000000000000000000000000000000C01005 +:102C0000000884021008000100010001000100001A +:102C100000000000000090100082001010C00000B2 +:102C200000000000000000000000000000000001A3 :102C30000000000000000000000000000000000094 :102C40000000000000000000000000000000000084 :102C50000000000000000000000000000000000074 :102C60000000000000000000000000000000000064 -:102C7000000000000000000000000800000000004C -:102C80000000000000000000000000000000000044 -:102C9000000000000000000000000800000000002C -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 +:102C70000000000000000000000000000000000054 +:102C80008300008080008280000800100010001186 +:102C900000000000000000000080008000000280B2 +:102CA000000000000000000000000000080000001C +:102CB0000001000000000000000000000000000013 :102CC0000000000000000000000000000000000004 :102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000000100000000000D4 -:102CF00000000000000000000000000000000800CC -:102D000000000000000000000000100000000000B3 -:102D100000000000000000000000000000000800AB -:102D2000000000000000000000000000080000009B -:102D3000000000000000000005000000000000008E -:102D40000800000000000000000000000800000073 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D00000000800980110080000000020000000027 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000100000000000000000000000092 +:102D40000000000000000000000000000000000083 :102D50000000000000000000000000000000000073 :102D60000000000000000000000000000000000063 :102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 +:102D800000000000100004101040100000010000BE :102D90000000000000000000000000000000000033 :102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 +:102DB0000000000000010000000000000000000012 :102DC0000000000000000000000000000000000003 :102DD00000000000000000000000000000000000F3 :102DE00000000000000000000000000000000000E3 :102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 +:102E0000000000000000000000000700C443810033 +:102E100000E00000000000000000000000000011C1 +:102E2000000007000000000000000000000000009B :102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 +:102E400000820000070000000000000000000000F9 :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 :102E70000000000000000000000000000000000052 :102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 +:102EA00000000000FFC000990000000000000000CA :102EB0000000000000000000000000000000000012 :102EC0000000000000000000000000000000000002 :102ED00000000000000000000000000000000000F2 @@ -148245,14 +144148,14 @@ :102EF00000000000000000000000000000000000D2 :102F000000000000000000000000000000000000C1 :102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 +:102F20000000000000003F000099000000000000C9 :102F30000000000000000000000000000000000091 :102F40000000000000000000000000000000000081 :102F50000000000000000000000000000000000071 :102F60000000000000000000000000000000000061 :102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 +:102F8000000000000000000000000000021020000F +:102F90000088108400000000000000000000000015 :102FA0000000000000000000000000000000000021 :102FB0000000000000000000000000000000000011 :102FC0000000000000000000000000000000000001 @@ -148261,31 +144164,31 @@ :102FF00000000000000000000000000000000000D1 :1030000000000000000000000000000000000000C0 :1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 +:103020000000000000002400B400000000000000C8 :103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 +:10304000000000000000000000000000F0F0F0F0C0 :103050000000000000000000000000000000000070 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 :103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 +:1030A00000000000000000002400240000000000D8 :1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 +:1030C0000000000000000000000000000000F0F020 +:1030D000F0F0000000000000000000000000000010 :1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F +:103110000000000000000000000000610006C0097F +:1031200000000000000000000000000030300290AD +:103130000000000000000000000000610006000D1B +:10314000000000000000000000000000000000304F :10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F :10318000000000000000000000000000000000003F :10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F +:1031A0003C3CF0FF000000000000000000000000B8 :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF :1031D00000000000000000000000000000000000EF @@ -148293,7 +144196,7 @@ :1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE :1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E +:1032200000003C3CFFFF0000000000000000000028 :10323000000000000000000000000000000000008E :10324000000000000000000000000000000000007E :10325000000000000000000000000000000000006E @@ -148303,7 +144206,7 @@ :10329000000000000000000000000000000000002E :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE +:1032C000FFFF000000000000000000000000000000 :1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE :1032F00000000000000000000000000000000000CE @@ -148311,405 +144214,405 @@ :1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D :10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D +:103340000000F3F330300000000000000000000037 :10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC +:10339000000000000000000000000000200000000D +:1033A0000000A00000000200000001000000010079 +:1033B00000800080000000000000000020000000ED +:1033C0000000200040000100214001000003000037 +:1033D00000000000000000000000000000002000CD +:1033E0000000020020002000008000800000080093 +:1033F000000000000000000000000200001020009B +:10340000000020002000000002000000400020001A +:10341000000000000000000000000000000040006C +:103420000000000000000000800000000800000014 +:1034300040000002002000000000000000400000EA +:10344000000000000000892008009001200000001A +:10345000000000000000000000000000000010005C +:1034600040000000000000000000002020200000BC +:1034700080000000000000000000000000000001CB +:10348000000000000000002000000000000000001C +:1034900000000200000000000000000000400000EA +:1034A000000000000000000000000200004000409A +:1034B00000000000000000000000000000400008C4 +:1034C00002000200001008100000000000000010C0 :1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B +:1034E0000010000002000000004000000210000078 +:1034F0000000018000000000000000000000021039 +:103500000800000000008200000000000000000031 +:10351000004000000000000000400000000000002B +:103520000000000000400000000000000008000053 +:103530000000000000000000000000880000000003 +:1035400000008000800000010001004000820000B7 +:103550000000000000000000000000C000000000AB +:10356000000400400000000800000000000000000F +:103570000000004008100008008400000000000067 +:103580008040800000000082000000080008000069 :10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA +:1035A0000000000008000000000000000000000013 +:1035B00000000100000000100000C00800410000F1 +:1035C00000000000080000000000090000100000DA +:1035D000C00000000000000000000008000200031E +:1035E00000210000000008000000000008030000A7 +:1035F000001000000000000000000000840008002F +:10360000000000000000090000000009080000217F :1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A -:10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A -:10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA +:10362000000000000000000000000000000000A0FA +:10363000008400842084008800000000090100004C +:103640000000000000000000000800A004A000012D +:10365000000000000000000000080008000000005A +:1036600000000000000000000084000000000000D6 +:103670000000004100000000000000000000000009 +:1036800080000000000000004000008800000000F2 +:103690000000000000000000080000000000000022 +:1036A0000000000000000000000000000000C0005A +:1036B0008400001009000100C0000000A0001000FC +:1036C00082000000820000000000000000000000F6 +:1036D0000000C000010000000000C0000000000069 +:1036E0000000000082000000000002000000000056 :1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000000000B9 -:103710000000200000002000A00020000000200089 -:1037200000000000200020008800000000000000D1 -:1037300000000000000020002000000000008800C1 -:1037400000008800200000002000000300000000AE -:10375000000000008800840020002000000000001D -:1037600088000000C00020000400200200000000CB -:1037700000000000200020002000200000000000C9 -:1037800020000000000020002000200000000000B9 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000002000000000000000D9 -:1037D00000000000000000000000000000000900E0 -:1037E00000000500000021000004000000000000AF -:1037F00000000500000000000000000000000000C4 -:1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000002008000070 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000002008000050 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000200830 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000200810 +:103700000000000000400000000000000000000079 +:103710000000080088000000000000000000000019 +:103720000000000000000000000000000000000099 +:10373000000000000000C0002000000000000000A9 +:1037400080000000000000000000000000000000F9 +:103750000000000000002000000000000000000049 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000000000000049 +:1037800000000500000000000000000000400000F4 +:103790000000000000080000000000000000000021 +:1037A0000000000008000000000000000000000011 +:1037B000000000004000020000800800000500003A +:1037C0000000000000000000000000008200000077 +:1037D0008220820000000821000000080000000094 +:1037E000000000000003000000000008000082004C +:1037F0000000000000080000000000100000008031 +:1038000000000000840001000080000000000000B3 +:1038100000000000000000080000000000000000A0 +:103820000000000000000008000000000000000090 +:1038300000A00004000085088582000880000000C8 +:103840000000000000000000000000082000000050 +:103850000000000100000000000000000000000067 +:1038600000000000000005000000000000900000C3 +:103870000000000000000000000000000001000047 +:1038800000100000000000000800004000000000E0 :103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000800197 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000848001F3 -:1038D0000000008400000000000000000000000064 -:1038E00000000000000000000000000000000000D8 -:1038F0008001000000000000000000000000000047 -:1039000000000000000000000000000000000000B7 -:103910008001000000000021000000000000000005 -:103920000000000000000005000000000000000092 -:103930000000002100000000002100000000000441 -:103940000000000200000000002100000000000054 -:103950000000000000210000000000210000000025 -:10396000000300000004000000000004000000004C +:1038A0000000000000000000000000000000000018 +:1038B000820000000000C000A00084009000000012 +:1038C00000000010004100880021000000000000FE +:1038D0000000000000008200000000000009010557 +:1038E00000000000000000000021000000000000B7 +:1038F0000000000090000000000000080000000030 +:1039000000000000000000080000000000080000A7 +:103910000000000800000080000000000000880097 +:103920000000000000000000110000000000000086 +:103930000000000000000000000000000000000087 +:10394000000000000000000000080000000000006F +:1039500000000000000000000000000000900200D5 +:103960002000000000000000000000000000000037 :103970000000000000000000000000000000000047 :103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 +:10399000000040400000000000080000000000009F :1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000800000000000000000000000000CF -:1039F000000000000900000000000000410000007D -:103A000000000000000000000000000000000000B6 -:103A1000000000000000820000000000820008009A -:103A20008200820040008200000000008200A000AE -:103A300082000000000082000000C0008200080038 -:103A40008200000000008200000008008200A00048 -:103A50008200000008000000820000008200820056 -:103A60000000820000000000000000000000820052 -:103A700000008200A000080000001000400082004A -:103A800000008200820000008400820000008200AA -:103A900040008200820008000000000000000000DA +:1039B00000000000000000000000000010012000D6 +:1039C000A001040100009000A00000000000000021 +:1039D00000000000100000000000000000A1002016 +:1039E00000210004000000000000000000000000B2 +:1039F000000000000000000000000000000040A0E7 +:103A000000400082020200000000000000000000F0 +:103A100000000000000000010001000000000000A4 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000204125 +:103A40002121002080030000000000000000000091 +:103A5000000000000000800000000000000040C1E5 +:103A60000083100900830000000000000000000037 +:103A70000000000000000000000000000000000046 +:103A80008080000000008080000000000000000036 +:103A900000000000000000000041000800110000CC :103AA0000000000000000000000000000000000016 -:103AB00000000000000000000008000000000000FE -:103AC00000000000000000000000400000000000B6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 +:103AB0000000000000000000000000000000000006 +:103AC0008200A0008400C18083000500900003A153 +:103AD0000000000000000000800080008000808066 +:103AE0000000001100820000000000000000000043 :103AF00000000000000000000000000000000000C6 -:103B00000000000000000000210000004000000054 -:103B100000000000000000000000000000000000A5 -:103B20008400840000000800000000000000000085 -:103B3000000082000000002184000000000000005E -:103B4000C00040000000080000000000000000006D -:103B500000008200000000000000000000000000E3 -:103B60000000C00000000000000000000000000491 -:103B7000080000000800000000000000A000000095 -:103B80000000C0000000000008000000000000006D -:103B90000000000000000000000000000000000025 +:103B00000000000000100009000000000009008013 +:103B10000000000000008000000000000000000025 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000880082001100C1A00288900084005B +:103B500001910000000000000000100010000800AB +:103B6000C008000000000088000000000000000005 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000001100000000000024 +:103B900000840020000002000200820000000000FB :103BA0000000000000000000000000000000000015 :103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 -:103BE0000000000000000000000000004000000095 +:103BC0000000000000210190018500C000000000FD +:103BD00004000100000000000000000000100000D0 +:103BE000101000C08800000000000200000000006B :103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 +:103C0000000000000000848400400082C0C000006A :103C100000000000000000000000000000000000A4 -:103C200000000000000082004000000000000800CA -:103C300000000000000300000009000882000000EE -:103C400000000000A000820040000000000008000A -:103C500000008200100000000009002100000000A8 -:103C60000000000000000000820040000000000092 -:103C7000000000000800000084000009000010009F -:103C8000000000000000A000080008000000400044 -:103C9000000000000000000008000000000000001C -:103CA0000000000000000000000000000000000014 +:103C20000000010000000000000000000000000093 +:103C30000000000000000000000000000000000084 +:103C40000000000000000009092009090583002088 +:103C500000418003104000000000000000000080D0 +:103C6000000080000080000000004000890000008B +:103C70000000000000000000000000000000000044 +:103C800000000000000000000000000000008000B4 +:103C90000000000000000000000000000000000024 +:103CA00000001000080000000000000000000000FC :103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 +:103CC00000000000000000000005008000800020CF +:103CD0004185038321000020000000000000000057 +:103CE0000020002100000000800200008000800011 :103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D2000000000010001000100C00001000100C00E -:103D3000002100000101000800020001000100C094 -:103D4000000000010001000100C00001000100C0EE -:103D5000000500000101000800880001000100C00A -:103D60000000000000010001000100C0000100018E -:103D700000C00009000001010008008800010201E4 -:103D800000C0000000010001000100C000010001AE -:103D900000C000050000010100080004000140010E -:103DA00000C0000000410041004100C0004100414E -:103DB000008309410005024100800080004100416C -:103DC00000C0000000410041004100C0004100412E -:103DD00000830841000502410080000000410041CD -:103DE00000850000000000410041004100C000418A -:103DF0000041008310410005024100000000004125 -:103E000080410085000000410041004100C00041A8 -:103E10000041008308C1000502410000008000410C -:103E2000804100C00000410003000000008041000C -:103E3000C00000001000100090800000A0004100B1 -:103E4000C10000800000410003000000008041002C -:103E5000C0000000100010008280000083004100BC -:103E6000C1000080800000034100030000000080CA -:103E70004100C000000020001000880000009000F9 -:103E80004100C1000080800041000300000000806C -:103E90004100C000000020001000C0800000900021 -:103EA0004100C1000040800001000100000000C08E -:103EB0000100C00000000000410004020090C000AA -:103EC0000300C1000084202001000100000000C0A8 -:103ED0000100C00000000000410004020090C0008A -:103EE0000300C10000040400000001000100000004 -:103EF00000C00100C00000000000410004A00090CC -:103F0000C1000900C100000482000100010000009E -:103F100000C00100C0000000000083000402009007 -:103F2000C1008300C1000040820000C00001C0C188 -:103F300000000000000100C182830003000100C1F5 -:103F40000000000000010000000000C00001C0C12E -:103F500000000000000100C182050011000100C145 -:103F600000000000000100000000000000C000018F -:103F7000C0C100000000000100C182410021000119 -:103F800000C10000000000010000000000C00001AE -:103F9000C0C100000000000100C1824100210001F9 -:103FA00000C100000000000100000000008000418E -:103FB00080C10000000000410090802000410041CD -:103FC00000C10000000000410040000000800041EE -:103FD00080C1000000000041009080A0004100412D -:103FE00000C100000000004100050000000000804A -:103FF000004180C10000000000410090802000418D -:10400000004100C1000000000041000500000080E8 -:10401000004180C10000000000410090802000416C -:10402000004100C100000000004100400000C1004C -:10403000800080C100004100000808004100C1412B -:104040008000800200004100000080004100C100AB -:10405000800080C100004100000808004100C1410B -:10406000800080020000410000008000410000004C -:10407000C100800080C1000041000008080041002C -:10408000C14180008002000041000000800041002A -:10409000C100800080C10000410000080300410011 -:1040A000C14100008002000041000000800041008A -:1040B000C1004000C0C100000100200091000100CB -:1040C000C1910800C001000001000000C000010013 -:1040D000C1004000C0C100000100200091000100AB -:1040E000C1910800C001000001000000C0000100F3 -:1040F0000000C1004000C0C100000100200091008C -:104100000100C1910800C001000001000000C000D2 -:104110000100C1004000C0C100000100200090006B -:104120000100C1914000C001000001000000C0007A -:10413000010000000000000000420000000000003C -:104140000000811200480700480000000000000045 -:10415000000000000000000000420000000000001D -:104160000000811200480700480000000000000025 -:1041700000000000000000000000004200000000FD -:104180000000000081120048070048000000000005 -:1041900000000000000000000000004200000000DD -:1041A00000000000811200480700480000000000E5 +:103D000000000000000000000000800000058000AE +:103D100000000000000000000000800080000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D4000000000000000000000000088008800C0A3 +:103D500000000108010401900000000000000000C4 +:103D600000000001000000100000C0001000400032 +:103D70000200000000000000000000000000000041 +:103D8000000000000000000000000000C0008400EF +:103D9000080040000000A00004000000080002002D +:103DA0000484820000000000000000000000000009 +:103DB0000000000000000000000000000000000003 +:103DC000000000000000000000000000008100E092 +:103DD0000700000A810000E007000000000000006A +:103DE000000000000000000007000000000000E0EC +:103DF00007000000000000000000000000000000BC +:103E000000000000000000000000000000000000B2 +:103E100000000700000A0000000000000000000091 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000D0D33F280000000000000000000058 +:103E60000000000000000000000014554155AA1099 +:103E7000002800000000000000000000000000001A +:103E80000000000000000000000000000000000032 +:103E90000000FF008200BE00FFFAFFFA00000000F1 +:103EA0003000F3FF000000000000000000000000F0 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000C0C33F3C0000000000000000E4 +:103EE00000000000000000000000000014554155D3 +:103EF000000000280000000000000000000000009A +:103F000000000000000000000000000000000000B1 +:103F100000000800F3008200B200005000500000D2 +:103F200000003000F3FF000000000000000000006F +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000F0F000000000BF3F83 +:103F6000BF3F000000000000000000000000C3C0D0 +:103F7000C303BE3CAA0000000000000000000000D7 +:103F80000000000000000000000000000000000031 +:103F90000000000050105010000000000000000061 +:103FA00000000000000000000FFF0F0F00000000E5 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 +:103FD0000000000000000000FF2800F000000000CA +:103FE000BC3CBC3C000000000000000000000000E1 +:103FF000C0C303C3AA08AA08000000000000000014 +:1040000000000000000000000000000000000000B0 +:10401000000000000000FFFF0F0F00000000000084 +:10402000000000000000000000000F000F0F000063 +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:1040500000000000000000210036009D0008004123 +:10406000000EC00D00000000000000000000000075 +:104070000008059000A510610007000D0000000079 +:104080000000000000000000000000000000000030 +:104090000000000000000000A00000080000000078 +:1040A000000000000000000080000000000000018F +:1040B00000610006000D000000000000000000008C +:1040C00000000000000000000000000000000000F0 +:1040D000000000000000000000000000FFFF0000E2 +:1040E0000505FF00000000040000000000000000C3 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:104150000000000000000000000000000000BFBFE1 +:10416000000A05055555000000040000000000008D +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F :1041B00000000000000000000000000000000000FF :1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF +:1041D000000000000000000000000000AA00A0FF96 +:1041E0005555A0A00000000080FF00FF0000000067 +:1041F0000000000000000000000000003030003C23 :1042000000000000000000000000000000000000AE :10421000000000000000000000000000000000009E :10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E +:104230000000000000000AA055550000000000002A :10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E +:104250000000000000000000000000000000AA00B4 +:10426000A0ACD700A0A0000000008000000000006B +:1042700000000000000000000000000000003030DE +:1042800000FF00000000000000000000000000002F :10429000000000000000000000000000000000001E :1042A000000000000000000000000000000000000E -:1042B0000000000000000000757B0000000000000E -:1042C00000000000000000000000000000000000EE -:1042D000000000000000DEAE757B00000000000062 -:1042E00000000000000000000000000000000000CE -:1042F000000000000000DEAE0000757B0000000042 -:1043000000000000000000000000000000000000AD -:104310000000000000000000DEAE757B0000000021 +:1042B0000000000000000000000A5FF500000000A0 +:1042C00000000000000000000100010000800480E8 +:1042D00000000000000000000000000000000000DE +:1042E00000000000000400000000000000002000AA +:1042F00000000000000000000000000000000000BE +:104300000008000200002000000100000000000082 +:10431000200000000003000000000000000000007A :10432000000000000000000000000000000000008D -:104330000000000000000000DEAE60C603000000C8 -:10434000000000000031E0000000000000000C0050 -:1043500000000000000000C0630660C6030000000B -:10436000000000000031E0000000000000000C0030 -:1043700000000000000000C06306000060C60300EB -:104380000000000000000031E0000000000000001C -:104390000C0000000000000000C0630660C60300BF -:1043A0000000000000000031E000000000000000FC -:1043B0000C0000000000000000C0630600000000C8 -:1043C000200000000000200020000000200020004D -:1043D000000020000000000020000000000000009D -:1043E000200000000000200020000000200020002D -:1043F000000020000000000020000000000000007D -:1044000040002000A00090002000200000002000BC -:10441000200000002000000000000000000000005C -:1044200020002000200000002000200000002000CC -:10443000200000002000000000000000000000003C +:10433000200000000000000001020000000000005A +:104340000000000000000000020020002000000427 +:104350000004000000000000000000000000000059 +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:1043800000000001000100008000000000000000AB +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000400100000000BC +:1043C00000000000000000000000000000000000ED +:1043D00000100000000000000000000000000000CD +:1043E00000000000000000000000000002000000CB +:1043F00000000010000000000000000000000000AD +:1044000000000000400040000002018000000000A9 +:10441000000000000010000000000010000000007C +:10442000000000000010000000000000000000007C +:10443000000000000000000000000200400000003A :10444000000000000000000000000000000000006C -:10445000000000000000200000000000000000003C -:104460000000000000040000000000000000000048 -:104470000000000000000000050000000000000037 -:104480000000000200000002000000000000000028 -:104490000000000000040004000000000000000410 -:1044A000000000000000000000000000000000000C -:1044B00000000002000005000000050200040000EA -:1044C00000000000000000000000000000000000EC +:104450000008000000100000000000000000004004 +:10446000000000000000000000000000000000004C +:1044700000400000000000000000000000000000FC +:104480000000000000008000800000011004000017 +:104490000000008400000000000000000000000098 +:1044A00000000000000800000000004000000000C4 +:1044B0000000004000000000110002008008804061 +:1044C0000000000800840000000000000000000060 :1044D00000000000000000000000000000000000DC :1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B +:1044F000000000000000000000000021000000009B +:104500000000000000000000400000080000210042 +:104510000000000000000000000000000000000893 +:104520000000000000080000000000000000000083 +:104530000000000000000000000008000000000073 +:104540000000000000000000000000000000000863 :10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:104570000084000000000084000000000000000033 -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB +:104560000000080008000000000008000000000033 +:1045700000842100000000000000000000A00000F6 +:10458000000000000000030800008000000000A000 +:10459000900000000000001000000000000000007B +:1045A0000000000800000000000000000000000003 +:1045B000000008000082008400000000800000006D +:1045C0000000000000000000000000000000008467 :1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:104600000000002100000000000000040000000085 -:104610000000000000110000000000000000000089 +:1045E00000000000080000000800000000000000BB +:1045F000000000000000000040000000000000007B +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A :10462000000000000000000000000000000000008A :10463000000000000000000000000000000000007A -:104640000000000000000800000008000800000052 -:10465000000000004100000000000008110000C040 -:104660000000000000000000000008000000000042 -:104670000000000000000000000000A00000008218 -:1046800000000000000000000000000008004000E2 -:104690002000000000000000090000000090000061 -:1046A00000000000000000000000000008000800FA -:1046B00008000000000000000000000000000000F2 -:1046C00000000000000000000000000000000000EA +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:1046600000000000000002000000000000840000C4 +:10467000001000000000000000000000000000002A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C000000000000000000000C0000000A00090FA :1046D00000000000000000000000000000000000DA :1046E00000000000000000000000000000000000CA :1046F00000000000000000000000000000000000BA :1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000100079 +:104710000000000000000000000000000010000089 +:104720000002000000000000000000000000000087 :104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 +:104740000000000000000000000800000000000061 +:104750000005000000000000000000000000000054 :104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 +:104770000000088400A000000000030000080300FF :104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 +:104790000000000000080000000000000000000011 +:1047A00000000000000000002000000000000000E9 :1047B00000000000000000000000000000000000F9 -:1047C000000000000000000000000000C000000029 -:1047D00000000000000000000000000000000000D9 +:1047C00000000000000000000000000000000000E9 +:1047D00000A000A000000000000000000000000099 :1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000020000000000000000000096 -:104820000000000000000000000000000000000088 +:1047F0000000000008000000000000080011000098 +:1048000000000002000000000000000000000000A6 +:104810000000000000000000000000000000000098 +:10482000000800020000000000000000000000007E :104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000080008000008080038 -:104860000800000008000000000000000000000038 -:1048700000000000000000000800080000A00890F0 -:104880000800000008000000000000000000000018 -:104890000000000000000000000008000800009078 -:1048A0000890080005000800000000000800000053 -:1048B00000000000000000000000080008000000E8 -:1048C00008000800030008000000000000000000CD -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 +:104840000000000000000000000800000000000060 +:104850000000000000000000000000000008000050 +:104860000000000000000000000000000000000048 +:1048700000000000008400000000000000100000A4 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C000000000000000000000000000008802025C +:1048D00000000000000000A0000000000000000038 +:1048E00000000000010000000000000000000000C7 :1048F00000000000000000000000000000000000B8 :1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 +:10491000000000000000000000000001C0000001D5 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 +:104940000000000000000000000000000000020065 :104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 +:104960000000000000002000000000000000000027 :104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 +:1049900000000000000000000000000009200000EE +:1049A0000004000000000000000000000000000003 :1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 :1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 +:1049E000000000000008000000400000000000007F :1049F00000000000000000000000000000000000B7 :104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 +:104A10000000000000000000000000001000110075 +:104A200020004141000000000000000000000000E4 :104A30000000000000000000000000000000000076 :104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 +:104A50000011000000000000000000000000000045 :104A60000000000000000000000000000000000046 :104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 +:104A90000000000000000000000000000000001006 +:104AA0000000010001010000000000000000000003 :104AB00000000000000000000000000000000000F6 :104AC00000000000000000000000000000000000E6 :104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 +:104AE00000000000000000000000080000000000BE :104AF00000000000000000000000000000000000B6 :104B000000000000000000000000000000000000A5 :104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 +:104B2000000101010100010100000000000000007F :104B30000000000000000000000000000000000075 :104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 +:104B50000000000100000001000100000000000052 :104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 +:104B7000080000000000000000000000000000002D :104B80000000000000000000000000000000000025 :104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 +:104BA00000000004081005111111000000000000B1 :104BB00000000000000000000000000000000000F5 :104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 +:104BD0000000000000400000002000020000000073 :104BE00000000000000000000000000000000000C5 :104BF00000000000000000000000000000000000B5 :104C000000000000000000000000000000000000A4 :104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 +:104C20000000000041900300090010110000000086 :104C30000000000000000000000000000000000074 :104C40000000000000000000000000000000000064 :104C50000000000000000000000000000000000054 @@ -148717,15 +144620,15 @@ :104C70000000000000000000000000000000000034 :104C80000000000000000000000000000000000024 :104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 +:104CA00000000000000001C0010000000001000041 :104CB00000000000000000000000000000000000F4 :104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 +:104CD00000000000000000000400A00000008200AE :104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 +:104CF000000000E0000000000000000000000000D4 :104D000000000000000000000000000000000000A3 :104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 +:104D20000000000000000000810000E00000420AD6 :104D30000000000000000000000000000000000073 :104D40000000000000000000000000000000000063 :104D50000000000000000000000000000000000053 @@ -148736,7 +144639,7 @@ :104DA0000000000000000000000000000000000003 :104DB00000000000000000000000000000000000F3 :104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 +:104DD000000000000000000000000000FFFF3CFF9A :104DE00000000000000000000000000000000000C3 :104DF00000000000000000000000000000000000B3 :104E000000000000000000000000000000000000A2 @@ -148744,7 +144647,7 @@ :104E20000000000000000000000000000000000082 :104E30000000000000000000000000000000000072 :104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 +:104E50000000000000000000000000000000C3008F :104E60000000000000000000000000000000000042 :104E70000000000000000000000000000000000032 :104E80000000000000000000000000000000000022 @@ -148770,106 +144673,106 @@ :104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 +:104FF0000000000000000000000000000061000749 +:10500000000D000000000000000000000000000093 :105010000000000000000000000000000000000090 :105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 +:105030000000000000610006C00900000000000040 :105040000000000000000000000000000000000060 :105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 +:1050600000000000000080610006000D000000004C :105070000000000000000000000000000000000030 :105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 :1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 +:1050B000000000000000300030003030F53000000B :1050C00000000000000000000000000000000000E0 :1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 +:1050E000000000000000000000000000AA3CAAAA86 :1050F00000000000000000000000000000000000B0 :10510000000000000000000000000000000000009F :10511000000000000000000000000000000000008F :10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F +:1051300000000000000000001F002F000000F5002C :10514000000000000000000000000000000000005F :10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F +:105160000000000000000000000000000000AA3C59 +:10517000AAAA0000000000000000000000000000DB :10518000000000000000000000000000000000001F :10519000000000000000000000000000000000000F :1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF +:1051B0000000000000000000000055555555AA00F1 +:1051C000AA00000000000000000000000000000035 :1051D00000000000000000000000000000000000CF :1051E00000000000000000000000000000000000BF :1051F00000000000000000000000000000000000AF :10520000000000000000000000000000000000009E :10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E +:10523000000000000000000000000000417D417DF2 +:10524000020A080A00000000000000000000000040 :10525000000000000000000000000000000000004E :10526000000000000000000000000000000000003E :10527000000000000000000000000000000000002E :10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E +:10529000000000000000000000000000000084008A :1052A00000000000000000000000000000000000FE :1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE +:1052C00000000000000000020000000000000000DC :1052D00000000000000000000000000000000000CE -:1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:10530000000000002000000000000000000020005D +:1052E00000000000000500000000000000000000B9 +:1052F00002000085008003000000000000000000A4 +:10530000000000000000000040000000000000005D :10531000000000000000000000000000000000008D -:10532000000000002000000000000000000020003D +:10532000000000000000000040000000000000003D :10533000000000000000000000000000000000006D -:1053400000000000000020001000400000001000DD -:10535000200000000000000000000000000000002D -:1053600000000000000220002000200000002000BB -:10537000200000000000000000000000000000000D +:10534000000000000000000000004000000000001D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D +:1053700000008000004000108800000000000000D5 :10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00041000000000000000000000000000000BC -:1053B00000000000000000000000000000000000ED -:1053C000000000000000000000002100000021009B -:1053D00000000000000000000000000000000000CD -:1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000010000000008C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000010000000006C +:1053900000000000020000100010000000000000EB +:1053A0000800000082000010001000000000001043 +:1053B00000100000000000000010000000000000CD +:1053C000000000000000000000100000000000408D +:1053D00000000010000008000000000000000000B5 +:1053E00000000000000000000010000000000000AD +:1053F0000000000000000000080000100400000091 +:10540000000002000000000000000000000000009A +:105410000000000000000000000000880000000004 +:1054200000008000000000000000000000000000FC :10543000000000000000000000000000000000006C -:10544000000000000000000000000002001000004A -:10545000000000000000000000000000000000004C -:10546000000000000000000000000000001000002C -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C +:10544000000000000000000000000000000000005C +:105450000000000800000000000000000000000044 +:1054600000000000000000000000008400080000B0 +:105470000000000800000000000080000000001094 +:105480000008000000000000000000080008000004 :10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC +:1054A00000000000080000000000000000000000F4 +:1054B00000000008000000000000000000000000E4 :1054C00000000000000000000000000000000000DC :1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000080008008B +:1054E00000080000000000030000000000000000B1 +:1054F00000000000000000000000000000050000A7 +:105500000000000000000000000000080000000093 :10551000000000000000000000000000000000008B -:10552000000000000000000004000000080002006D +:1055200000000000000080000000000000000000FB :10553000000000000000000000000000000000006B -:105540000000000000000000000000000000080053 -:1055500040000000400004000000040000000000C3 -:105560000000000000000000000000000000080033 -:10557000080000000000080000000000000000001B +:105540000000000000000000000000000000000853 +:10555000000000A00000000000A00000000000000B +:1055600000840000000800000000000000000000AF +:10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B :10559000000000000000000000000000000000000B :1055A00000000000000000000000000000000000FB :1055B00000000000000000000000000000000000EB :1055C00000000000000000000000000000000000DB -:1055D00004000020000000000000000000000000A7 +:1055D00000000000000000000000000000000000CB :1055E00000000000000000000000000000000000BB :1055F00000000000000000000000000000000000AB :10560000000000000000000000000000000000009A :10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A +:1056200000000000008400000000000000000000F6 :10563000000000000000000000000000000000006A :10564000000000000000000000000000000000005A :10565000000000000000000000000000000000004A @@ -148882,25 +144785,25 @@ :1056C00000000000000000000000000000000000DA :1056D00000000000000000000000000000000000CA :1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 +:1056F00000000000000800000000000000000000A2 +:105700000000000000000000000000000003000096 +:105710000000004100000000000000000000000048 :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 :105740000000000000000000000000000000000059 -:105750000000000004000000040000000000000041 +:105750000800000000080000000000000000000039 :105760000000000000000000000000000000000039 :105770000000000000000000000000000000000029 :105780000000000000000000000000000000000019 :105790000000000000000000000000000000000009 -:1057A0000090000000000000000000000000000069 -:1057B00000000000000000000000040000000000E5 +:1057A00000000000000000000000000000000000F9 +:1057B00000000011000000000000000000000000D8 :1057C00000000000000000000000000000000000D9 -:1057D0000000000000000000000000004100000088 -:1057E000410009000000000000000000000000006F -:1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000003000000000000000000000000A6 +:10580000000000000000000000000000001100087F +:105810000008000000000000000000000000000080 :105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 :105840000000000000000000000000000000000058 @@ -148915,7 +144818,7 @@ :1058D00000000000000000000000000000000000C8 :1058E00000000000000000000000000000000000B8 :1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 +:105900000000000000000000C00000020008C00409 :105910000000000000000000000000000000000087 :105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 @@ -148923,24 +144826,24 @@ :105950000000000000000000000000000000000047 :105960000000000000000000000000000000000037 :105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 +:105980000000000000000000000000000000008097 :105990000000000000000000000000000000000007 :1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 +:1059B0000000800000000000000000000000000067 :1059C00000000000000000000000000000000000D7 :1059D00000000000000000000000000000000000C7 :1059E00000000000000000000000000000000000B7 :1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 +:105A000000000000000000000000000080000041D5 +:105A10000080800000000000000000000000000086 :105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 +:105A3000000000000800C00000000000000000009E :105A40000000000000000000000000000000000056 :105A50000000000000000000000000000000000046 :105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 +:105A8000000000000000000000000000000088008E +:105A900004898808C0000000000000000000000029 :105AA00000000000000000000000000000000000F6 :105AB00000000000000000000000000000000000E6 :105AC00000000000000000000000000000000000D6 @@ -148948,7 +144851,7 @@ :105AE00000000000000000000000000000000000B6 :105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 +:105B1000C0880084008200C0000000000000000077 :105B20000000000000000000000000000000000075 :105B30000000000000000000000000000000000065 :105B40000000000000000000000000000000000055 @@ -148956,7 +144859,7 @@ :105B60000000000000000000000000000000000035 :105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 +:105B90000000800000000080008000000000000085 :105BA00000000000000000000000000000000000F5 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 @@ -148964,15 +144867,15 @@ :105BE00000000000000000000000000000000000B5 :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 -:105C10000000000000000000000000000000000084 +:105C100000000000000980A10000800000000000DA :105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 +:105C30000000000000000000000000000000000460 +:105C40000002000000000000000000000000000052 :105C50000000000000000000000000000000000044 :105C60000000000000000000000000000000000034 :105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 +:105C900000000000000004002021040410000000A7 :105CA00000000000000000000000000000000000F4 :105CB00000000000000000000000000000000000E4 :105CC00000000000000000000000000000000000D4 @@ -148980,7 +144883,7 @@ :105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 :105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 +:105D100000000000000000000042000007005000EA :105D20000000000000000000000000000000000073 :105D30000000000000000000000000000000000063 :105D40000000000000000000000000000000000053 @@ -148988,32 +144891,32 @@ :105D60000000000000000000000000000000000033 :105D70000000000000000000000000000000000023 :105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 +:105D90000000000000000000000000000000003CC7 +:105DA0007878000000000000000000000000000003 :105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 :105DD00000000000000000000000000000000000C3 :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 :105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 +:105E100000000000000000000000000040400041C1 +:105E2000003C3C3C000000000000000000000000BE :105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 +:105E4000000000000000000075757575000000007E :105E50000000000000000000000000000000000042 :105E60000000000000000000000000000000000032 :105E70000000000000000000000000000000000022 :105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA00000000000000000000000000000000000F2 +:105E90000000000000000000000000000000F00012 +:105EA000F0003D3C5A5A00000000000000000000D5 :105EB00000000000000000000000000000000000E2 -:105EC00000000000000000000000000000000000D2 +:105EC00000000000000000000000454545450000BE :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 :105EF00000000000000000000000000000000000A2 :105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 +:105F2000C0C0C0C07E3C5A5A000000000000000003 :105F30000000000000000000000000000000000061 :105F40000000000000000000000000000000000051 :105F50000000000000000000000000000000000041 @@ -149021,7 +144924,7 @@ :105F70000000000000000000000000000000000021 :105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 +:105FA00000000000303000900008000000000000F9 :105FB00000000000000000000000000000000000E1 :105FC00000000000000000000000000000000000D1 :105FD00000000000000000000000000000000000C1 @@ -149057,12 +144960,12 @@ :1061B00000000000000000000000000000000000DF :1061C00000000000000000000000000000000000CF :1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF +:1061E000000000000000000000000000000000109F :1061F000000000000000000000000000000000009F :10620000000000000000000000000000000000008E :10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E -:10623000000000000000000000000000000000005E +:10623000000000000000000000000000000004005A :10624000000000000000000000000000000000004E :10625000000000000000000000000000000000003E :10626000000000000000000000000000000000002E @@ -149070,25 +144973,25 @@ :10628000000000000000000000000000000000000E :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000040000AA -:1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D -:106310000000000000000000000000000002000477 -:106320000000000000000004000000000000000069 -:10633000000000000000000000000000000000005D +:1062B00000080000000000000000000000000400D2 +:1062C00000000000000000080000000000000000C6 +:1062D00000000000000000000000000000100000AE +:1062E00000000000000000000000000000000000AE +:1062F0000000021000000200000000000010020078 +:10630000000000100000000000000000000000106D +:106310000000000000000400000000000000000079 +:106320000200000000000000000002000000000069 +:106330000200000000000000000000000210000049 :10634000000000000000000000000000000000004D -:10635000000000000000000000000000000000003D -:1063600000000000000000000000400400000000E9 -:10637000000000000000000000000000000000001D -:1063800000000000000000000000000000004000CD -:1063900000000000000000000000000000000000FD -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD +:1063500000880000000000000008000000000000AD +:106360000000000000000000000800000000000025 +:106370000000000000000000000800000000000015 +:106380000000000000000000000000080000000005 +:1063900000000000000000000000000800000000F5 +:1063A00000000000000000000000000800000000E5 +:1063B00000000000000000000000000800000000D5 +:1063C0000000000000000000000082000000080043 +:1063D0000000880000000000000000000000000035 :1063E00000000000000000000000000000000000AD :1063F000000000000000000000000000000000009D :10640000000000000000000000000000000000008C @@ -149107,12 +145010,12 @@ :1064D00000000000000000000000000000000000BC :1064E00000000000000000000000000000000000AC :1064F000000000000000000000000000000000009C -:10650000000000000000200000000000000000006B +:10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B -:106550000000000000000000000000000000090032 +:10655000000000000000000000000000000000003B :10656000000000000000000000000000000000002B :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B @@ -149135,7 +145038,7 @@ :1066900000000000000000000000000000000000FA :1066A00000000000000000000000000000000000EA :1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA +:1066C000000800840000000000000000000000003E :1066D00000000000000000000000000000000000BA :1066E00000000000000000000000000000000000AA :1066F000000000000000000000000000000000009A @@ -149143,12 +145046,12 @@ :106710000000000000000000000000000000000079 :106720000000000000000000000000000000000069 :106730000000000000000000000000000000000059 -:106740000000000000000000000000000000000049 +:106740000000000000000000000000000008000041 :106750000000000000000000000000000000000039 -:106760000000000000000900000000000000000020 +:106760000000000000000000000000000000000029 :106770000000000000000000000000000000000019 :106780000000000000000000000000000000000009 -:1067900000000000000000000000000000000400F5 +:1067900000000000000000000000000000000000F9 :1067A00000000000000000000000000000000000E9 :1067B00000000000000000000000000000000000D9 :1067C00000000000000000000000000000000000C9 @@ -149269,7 +145172,7 @@ :106EF0000000000000000000000000000000000092 :106F00000000000000000000000000000000000081 :106F10000000000000000000000000000000000071 -:106F20000000001000000000000000000000000051 +:106F20000000000000000000000000000000000061 :106F30000000000000000000000000000000000051 :106F40000000000000000000000000000000000041 :106F50000000000000000000000000000000000031 @@ -149277,19 +145180,19 @@ :106F70000000000000000000000000000000000011 :106F80000000000000000000000000000000000001 :106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000400000000000A1 +:106FA00000000000000000000000000000000000E1 :106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000004000000000000BD +:106FC00000000000000000000000000000000000C1 :106FD00000000000000000000000000000000000B1 :106FE00000000000000000000000000000000000A1 :106FF0000000000000000000000000000000000091 -:10700000000000000000000002100000000000006E +:107000000000000000000000000000000000000080 :107010000000000000000000000000000000000070 -:10702000000000000000000002100000000000004E +:107020000000000000000000000000000000000060 :107030000000000000000000000000000000000050 -:1070400000000000000000000000084000000000F8 +:107040000000000000000000000000000000000040 :107050000000000000000000000000000000000030 -:10706000000000000000000000000210000000000E +:107060000000000000000000000000000000000020 :107070000000000000000000000000000000000010 :107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 @@ -149302,35 +145205,35 @@ :10710000000000000000000000000000000000007F :10711000000000000000000000000000000000006F :10712000000000000000000000000000000000005F -:10713000000000000000000000000000000004004B -:10714000000004000000000000000000000000003B +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F :10717000000000000000000000000000000000000F :1071800000000000000000000000000000000000FF :1071900000000000000000000000000000000000EF :1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000004CB +:1071B00000000000000000000000000000000000CF :1071C00000000000000000000000000000000000BF :1071D00000000000000000000000000000000000AF :1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F :10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E +:10721000000040000000000000000000000000002E :10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E +:10723000000040000000000000000000000000000E :10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E +:10725000000200000000000000000000000000002C :10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E -:1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE +:1072700000000000400000000000000000000000CE +:1072800000000000000002000000000000000000FC +:1072900008000800000000000800080000000200CC +:1072A00000000800000000000000000000000000D6 +:1072B000000008000200021000000840000000006A :1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E +:1072D000000000100000000002000000000000009C +:1072E0000200000008000000000000000000000094 +:1072F0000000020002000000000002000000000088 :10730000000000000000000000000000000000007D :10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D @@ -149340,7 +145243,7 @@ :10736000000000000000000000000000000000001D :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD -:1073900000000000040000000000000000000000E9 +:1073900000000000000000000000000000000000ED :1073A00000000000000000000000000000000000DD :1073B00000000000000000000000000000000000CD :1073C00000000000000000000000000000000000BD @@ -149381,7 +145284,7 @@ :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A +:107620000800000000000000000000000000000052 :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A @@ -149513,19 +145416,19 @@ :107E30000000000000000000000000000000000042 :107E40000000000000000000000000000000000032 :107E50000000000000000000000000000000000022 -:107E600000000000000000C00000009000000000C2 +:107E60000000000000000000000000000000000012 :107E70000000000000000000000000000000000002 :107E800000000000000000000000000000000000F2 -:107E900000000000000000800000000200000080E0 -:107EA00000000010000000000000000000000000C2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 :107EB00000000000000000000000000000000000C2 -:107EC0000000000000004000000000000000000072 +:107EC00000000000000000000000000000000000B2 :107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000340000009000046 +:107EE0000000000000000000000000000000000092 :107EF0000000000000000000000000000000000082 :107F00000000000000000000000000000000000071 -:107F10000000000000000000000800000001000058 -:107F20000040000000010000000000000000000010 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 :107F30000000000000000000000000000000000041 :107F40000000000000000000000000000000000031 :107F50000000000000000000000000000000000021 @@ -149540,13 +145443,13 @@ :107FE0000000000000000000000000000000000091 :107FF0000000000000000000000000000000000081 :108000000000000000000000000000000000000070 -:108010000000000000000000000000000008000058 +:108010000000000000000000000000000000000060 :108020000000000000000000000000000000000050 :108030000000000000000000000000000000000040 :108040000000000000000000000000000000000030 :108050000000000000000000000000000000000020 :108060000000000000000000000000000000000010 -:1080700000000000000000000000000000000008F8 +:108070000000000000000000000000000000000000 :1080800000000000000000000000000000000000F0 :1080900000000000000000000000000000000000E0 :1080A00000000000000000000000000000000000D0 @@ -149567,22 +145470,22 @@ :1081900000000000000000000000000000000000DF :1081A00000000000000000000000000000000000CF :1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F +:1081C00000000000000008000000000000000000A7 +:1081D0000000000000000000000000000800000097 +:1081E000020000000000080000000000080000007D +:1081F0000000000000000800020002000000000073 :10820000000000000000000000000000000000006E :10821000000000000000000000000000000000005E -:1082200000000000008400000000000000000000CA -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E +:108220000000000000000800000000000000020044 +:108230000200000000000000080000000000000034 +:10824000000000020000000000000000000000002C :10825000000000000000000000000000000000001E :10826000000000000000000000000000000000000E :1082700000000000000000000000000000000000FE :1082800000000000000000000000000000000000EE :1082900000000000000000000000000000000000DE :1082A00000000000000000000000000000000000CE -:1082B00000000008000000000000000000000000B6 +:1082B00000000000000000000000000000000000BE :1082C00000000000000000000000000000000000AE :1082D000000000000000000000000000000000009E :1082E000000000000000000000000000000000008E @@ -149598,7 +145501,7 @@ :1083800000000000000000000000000000000000ED :1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD -:1083B00000000005000000000000000000000000B8 +:1083B00000000000000000000000000000000000BD :1083C00000000000000000000000000000000000AD :1083D000000000000000000000000000000000009D :1083E000000000000000000000000000000000008D @@ -149622,31 +145525,31 @@ :10850000000000000000000000000000000000006B :10851000000000000000000000000000000000005B :10852000000000000000000000000000000000004B -:10853000110000000000000000000000000000002A +:10853000000000000000000000000000000000003B :10854000000000000000000000000000000000002B :10855000000000000000000000000000000000001B :10856000000000000000000000000000000000000B :1085700000000000000000000000000000000000FB -:108580000000000000008008000000000000000063 +:1085800000000000000000000000000000000000EB :1085900000000000000000000000000000000000DB :1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000800000008000BB +:1085B00000000000000000000000000000000000BB :1085C00000000000000000000000000000000000AB :1085D000000000000000000000000000000000009B :1085E000000000000000000000000000000000008B :1085F000000000000000000000000000000000007B -:108600000000000000000200C001000000000000A7 +:10860000000000000000000000000000000000006A :10861000000000000000000000000000000000005A :10862000000000000000000000000000000000004A -:1086300000000000000000000000880008000000AA -:10864000C00000000000000000000000000000006A +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A :10865000000000000000000000000000000000001A :10866000000000000000000000000000000000000A :1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA :1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000100000000B9 +:1086B00000000000000000000000000000000000BA :1086C00000000000000000000000000000000000AA :1086D000000000000000000000000000000000009A :1086E000000000000000000000000000000000008A @@ -149654,12 +145557,12 @@ :108700000000000000000000000000000000000069 :108710000000000000000000000000000000000059 :108720000000000000000000000000000000000049 -:1087300000000000000000020009000000410000ED +:108730000000000000000000000000000000000039 :108740000000000000000000000000000000000029 :108750000000000000000000000000000000000019 :108760000000000000000000000000000000000009 :1087700000000000000000000000000000000000F9 -:108780000000000000000000411010004100000047 +:1087800000000000000000000000000000000000E9 :1087900000000000000000000000000000000000D9 :1087A00000000000000000000000000000000000C9 :1087B00000000000000000000000000000000000B9 @@ -149667,11 +145570,11 @@ :1087D0000000000000000000000000000000000099 :1087E0000000000000000000000000000000000089 :1087F0000000000000000000000000000000000079 -:108800000000000000000000000001000010001047 +:108800000000000000000000000000000000000068 :108810000000000000000000000000000000000058 :108820000000000000000000000000000000000048 :108830000000000000000000000000000000000038 -:108840000000000000100000000000000000000018 +:108840000000000000000000000000000000000028 :108850000000000000000000000000000000000018 :108860000000000000000000000000000000000008 :1088700000000000000000000000000000000000F8 @@ -149708,43 +145611,43 @@ :108A60000000000000000000000000000000000006 :108A700000000000000000000000000000000000F6 :108A800000000000000000000000000000000000E6 -:108A90000000000000000000FF999999000000000C +:108A900000000000000000000000000000000000D6 :108AA00000000000000000000000000000000000C6 :108AB00000000000000000000000000000000000B6 :108AC00000000000000000000000000000000000A6 -:108AD000F3F3F9F9000000000000000000000000BE +:108AD0000000000000000000000000000000000096 :108AE0000000000000000000000000000000000086 :108AF0000000000000000000000000000000000076 :108B00000000000000000000000000000000000065 -:108B100000000000000000000000FF99FFFF0000BF +:108B10000000000000000000000000000000000055 :108B20000000000000000000000000000000000045 :108B30000000000000000000000000000000000035 :108B40000000000000000000000000000000000025 -:108B50000000F3F3F9F9000000000000000000003D +:108B50000000000000000000000000000000000015 :108B60000000000000000000000000000000000005 :108B700000000000000000000000000000000000F5 :108B800000000000000000000000000000000000E5 -:108B9000000000000000000000610006000D00055C +:108B900000000000000000000000000000000000D5 :108BA00000000000000000000000000000000000C5 :108BB00000000000000000000000000000000000B5 -:108BC000000000000000000000610006000D000031 -:108BD0000000000000000005000000000000000090 +:108BC00000000000000000000000000000000000A5 +:108BD0000000000000000000000000000000000095 :108BE0000000000000000000000000000000000085 :108BF0000000000000000000000000000000000075 :108C00000000000000000000000000000000000064 -:108C100000000000000000000000F0FF00FF000066 +:108C10000000000000000000000000000000000054 :108C20000000000000000000000000000000000044 :108C30000000000000000000000000000000000034 -:108C400000000000000000000000000000000F0F06 -:108C5000CFCF000000000000000000000000000076 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 :108C60000000000000000000000000000000000004 :108C700000000000000000000000000000000000F4 :108C800000000000000000000000000000000000E4 -:108C9000000000000000000000000000F0FFFFFFE7 +:108C900000000000000000000000000000000000D4 :108CA00000000000000000000000000000000000C4 :108CB00000000000000000000000000000000000B4 :108CC00000000000000000000000000000000000A4 -:108CD000FFFFCFCF000000000000000000000000F8 +:108CD0000000000000000000000000000000000094 :108CE0000000000000000000000000000000000084 :108CF0000000000000000000000000000000000074 :108D00000000000000000000000000000000000063 @@ -149767,24 +145670,24 @@ :108E10000000000000000000000000000000000052 :108E20000000000000000000000000000000000042 :108E30000000000000000000000000000000000032 -:108E400000000000000000000000000000800000A2 -:108E50000010000000000000000000000000000002 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 :108E60000000000000000000000000000000000002 :108E700000000000000000000000000000000000F2 -:108E800000000000000000000002000000000000E0 -:108E90000002400000000000000000000000000090 -:108EA0000000000000000000000000000040000280 -:108EB00000020002000000020000000200000000AA -:108EC0000000000000000000000000000000004062 -:108ED0000000000100000000000000000000000091 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000000000000000092 :108EE0000000000000000000000000000000000082 -:108EF0000000001000000000000000000000000062 +:108EF0000000000000000000000000000000000072 :108F00000000000000000000000000000000000061 -:108F10000000001000000000000000000000000041 +:108F10000000000000000000000000000000000051 :108F20000000000000000000000000000000000041 -:108F30000000000000100000000000000000000021 +:108F30000000000000000000000000000000000031 :108F40000000000000000000000000000000000021 -:108F50000000000000100000000000000000000001 +:108F50000000000000000000000000000000000011 :108F60000000000000000000000000000000000001 :108F700000000000000000000000000000000000F1 :108F800000000000000000000000000000000000E1 @@ -149792,40 +145695,40 @@ :108FA00000000000000000000000000000000000C1 :108FB00000000000000000000000000000000000B1 :108FC00000000000000000000000000000000000A1 -:108FD00000080088000000000000000000080008F1 +:108FD0000000000000000000000000000000000091 :108FE0000000000000000000000000000000000081 :108FF0000000000000000000000000000000000071 :109000000000000000000000000000000000000060 :109010000000000000000000000000000000000050 :109020000000000000000000000000000000000040 -:1090300000000000000000004000000000000000F0 -:109040000008000000000000000000000000000018 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 :109050000000000000000000000000000000000010 -:1090600000000000002100210000000000000000BE +:109060000000000000000000000000000000000000 :1090700000000000000000000000000000000000F0 :1090800000000000000000000000000000000000E0 :1090900000000000000000000000000000000000D0 :1090A00000000000000000000000000000000000C0 -:1090B000000000000008000800840000000000001C +:1090B00000000000000000000000000000000000B0 :1090C00000000000000000000000000000000000A0 :1090D0000000000000000000000000000000000090 :1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 +:1090F0000000000000000000000000001000000060 :10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F +:10911000000000000000000000000000100000003F :10912000000000000000000000000000000000003F :10913000000000000000000000000000000000002F :10914000000000000000000000000000000000001F -:10915000000000000000000000000000000000000F +:1091500000000000000000000000000000001000FF :1091600000000000000000000000000000000000FF :1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF +:1091800000000000000000000200000000000000DD :1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000000000000AF -:1091C000000000000000000000000000000000009F +:1091A00008000000001000000000000000000000A7 +:1091B000000000000000000000000010000000009F +:1091C000000000000000000000000040000000005F :1091D000000000000000000000000000000000008F -:1091E000000000000000000000000000000000007F +:1091E000000000000000000000000000020000007D :1091F000000000000000000000000000000000006F :10920000000000000000000000000000000000005E :10921000000000000000000000000000000000004E @@ -149838,27 +145741,27 @@ :1092800000000000000000000000000000000000DE :1092900000000000000000000000000000000000CE :1092A00000000000000000000000000000000000BE -:1092B0000000000000000000000000A0000000000E +:1092B00000000000000000000000000000000000AE :1092C000000000000000000000000000000000009E :1092D000000000000000000000000000000000008E -:1092E0000000000000080000000000000000000076 +:1092E000000000000000000000000000000000007E :1092F000000000000000000000000000000000006E :10930000000000000000000000000000000000005D :10931000000000000000000000000000000000004D :10932000000000000000000000000000000000003D :10933000000000000000000000000000000000002D -:109340000000000000000000000000080000000015 +:10934000000000000000000000000000000000001D :10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED :1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD +:10939000000000000000000000000000004000008D +:1093A000004000000000000000000000000000007D :1093B00000000000000000000000000000000000AD :1093C000000000000000000000000000000000009D :1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D +:1093F00000000000000000000040000000000040ED :10940000000000000000000000000000000000005C :10941000000000000000000000000000000000004C :10942000000000000000000000000000000000003C @@ -149881,7 +145784,7 @@ :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B :10955000000000000000000000000000000000000B -:10956000000000000000000000000000800000007B +:1095600000000000000000000000000000000000FB :1095700000000000000000000000000000000000EB :1095800000000000000000000000000000000000DB :1095900000000000000000000000000000000000CB @@ -149889,7 +145792,7 @@ :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B -:1095E0000000000000000000000000000200C000B9 +:1095E000000000000000000000000000000000007B :1095F000000000000000000000000000000000006B :10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A @@ -149922,7 +145825,7 @@ :1097C0000000000000000000000000000000000099 :1097D0000000000000000000000000000000000089 :1097E0000000000000000000000000000000000079 -:1097F0000000000400020000000000000000000063 +:1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 :109810000000000000000000000000000000000048 :109820000000000000000000000000000000000038 @@ -149954,7 +145857,7 @@ :1099C0000000000000000000000000000000000097 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 -:1099F000000000000000000000000000AAAAAAFF6A +:1099F0000000000000000000000000000000000067 :109A00000000000000000000000000000000000056 :109A10000000000000000000000000000000000046 :109A20000000000000000000000000000000000036 @@ -149962,8 +145865,8 @@ :109A40000000000000000000000000000000000016 :109A50000000000000000000000000000000000006 :109A600000000000000000000000000000000000F6 -:109A70000000000000000000000000000000FFFFE8 -:109A8000AAFF00000000000000000000000000002D +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 :109A900000000000000000000000000000000000C6 :109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 @@ -149971,7 +145874,7 @@ :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 -:109B00000000000500000000000000000000000050 +:109B00000000000000000000000000000000000055 :109B10000000000000000000000000000000000045 :109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 @@ -150014,12 +145917,12 @@ :109D800000000000000000000000000000000000D3 :109D900000000000000000000000000000000000C3 :109DA00000000000000000000000000000000000B3 -:109DB0004000000000000000000000000000000063 +:109DB00000000000000000000000000000000000A3 :109DC0000000000000000000000000000000000093 -:109DD0000000400000000000000000000000000043 +:109DD0000000000000000000000000000000000083 :109DE0000000000000000000000000000000000073 -:109DF0000000000200000000000000000000000061 -:109E0000000000000004000000000000000000004E +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 :109E20000000000000000000000000000000000032 :109E30000000000000000000000000000000000022 @@ -150065,20 +145968,20 @@ :10A0B00000000000000000000000000000000000A0 :10A0C0000000000000000000000000000000000090 :10A0D0000000000000000000000000000000000080 -:10A0E0000000000000000000000000000000000070 +:10A0E000000000000000000000000200000000006E :10A0F0000000000000000000000000000000000060 :10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F +:10A11000000000000200000000000000000002003B +:10A1200000000000004000000000000000000000EF :10A13000000000000000000000000000000000001F :10A14000000000000000000000000000000000000F -:10A1500000000000000000000000000000000000FF +:10A1500000080000000000000000000000000000F7 :10A1600000000000000000000000000000000000EF -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF +:10A1700000080000000000000000000000000000D7 +:10A1800000000000000000000000000002000000CD +:10A1900000000008000000000000000000000000B7 :10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F +:10A1B000000000400000000000000000000000005F :10A1C000000000000000000000000000000000008F :10A1D000000000000000000000000000000000007F :10A1E000000000000000000000000000000000006F @@ -150096,13 +145999,13 @@ :10A2A00000000000000000000000000000000000AE :10A2B000000000000000000000000000000000009E :10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E -:10A2F000000000000000000000000000000000005E +:10A2D0000000000000000008000000000000000076 +:10A2E000000000000000000000000000000000402E +:10A2F0000000000000000008000000400000000016 :10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D +:10A310000000000000000000000800000000000035 :10A32000000000000000000000000000000000002D -:10A33000000000000000000000000000000000001D +:10A3300000000000000000000040000000000000DD :10A34000000000000000000000000000000000000D :10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED @@ -150254,33 +146157,33 @@ :10AC800000000000000000000000000000000000C4 :10AC900000000000000000000000000000000000B4 :10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 +:10ACB0000000000000000040000000000000000054 :10ACC0000000000000000000000000000000000084 :10ACD0000000000000000000000000000000000074 :10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000000000000000000013 -:10AD40000000000000000000000000000000000003 +:10ACF0000000000000000200004000000000020010 +:10AD000002100000004000000200000000000000EF +:10AD1000000000000000001002000200020000001D +:10AD20000200000000100000000000000000000011 +:10AD30000000000000000000000000000000020011 +:10AD400000000000000002000000020000000000FF :10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD70000000000000000002000000004000000091 -:10AD800000000000000000000000000000000000C3 -:10AD90000000000000004000000000000000000073 -:10ADA000000000000000000000000002000000029F +:10AD600000000000000000000000000000000040A3 +:10AD700000000000000000000000000000000000D3 +:10AD800000040000000000000000000000000000BF +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 :10ADB0000000000000000000000000000000000093 :10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000210000041 +:10ADD000000000000000000000000000000003C0B0 +:10ADE0000000000000C000000000000000000000A3 +:10ADF0000000000000000000000000000000000053 :10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000210000020 +:10AE10000000000000000000000000000000000032 :10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000021000 +:10AE30000000000000000000000000000000000012 :10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000210E0 +:10AE500000000000000000000000000000000000F2 :10AE600000000000000000000000000000000000E2 :10AE700000000000000000000000000000000000D2 :10AE800000000000000000000000000000000000C2 @@ -150291,13 +146194,13 @@ :10AED0000000000000000000000000000000000072 :10AEE0000000000000000000000000000000000062 :10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 +:10AF0000000000000000000000000000000400003D :10AF10000000000000000000000000000000000031 :10AF20000000000000000000000000000000000021 -:10AF300000004000000000000000000000000000D1 -:10AF40000000000000000000000000000000000001 +:10AF30000000000000000000000000000000000011 +:10AF400000000000000800000000000800000000F1 :10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 +:10AF60000000000000040000004000040000000099 :10AF700000000000000000000000000000000000D1 :10AF800000000000000000000000000000000000C1 :10AF900000000000000000000000000000000000B1 @@ -150305,7 +146208,7 @@ :10AFB0000000000000000000000000000000000091 :10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 +:10AFE000000000000200000000000000000000005F :10AFF0000000000000000000000000000000000051 :10B000000000000000000000000000000000000040 :10B010000000000000000000000000000000000030 @@ -150332,12 +146235,12 @@ :10B1600000000000000000000000000000000000DF :10B1700000000000000000000000000000000000CF :10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF +:10B1900000000004000000000000000000000000AB :10B1A000000000000000000000000000000000009F :10B1B000000000000000000000000000000000008F :10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F +:10B1E000000000000000000000000200000000005D :10B1F000000000000000000000000000000000004F :10B20000000000000000000000000000000000003E :10B21000000000000000000000000000000000002E @@ -150496,38 +146399,38 @@ :10BBA0000000000000000000000000000000000095 :10BBB0000000000000000000000000000000000085 :10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 +:10BBD00082000000000000000000000000000000E3 :10BBE0000000000000000000000000000000000055 :10BBF0000000000000000000000000000000000045 :10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 +:10BC1000000002000000000000008200840000001C +:10BC20000000000000000002000000000000000012 :10BC30000000000000000000000000000000000004 :10BC400000000000000000000000000000000000F4 :10BC500000000000000000000000000000000000E4 :10BC600000000000000000000000000000000000D4 :10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000040000B0 -:10BC90000000000000000000000040000000000064 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000004000000044 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000004054 +:10BCB0000000000000000000000000000000000084 +:10BCC00000000000000000000040000000000040F4 +:10BCD00000000000004000000000000000000040E4 +:10BCE0000000004000000000000000000000000014 +:10BCF0000000000300000000000000000000000041 +:10BD000000000010000000000000000000000040E3 +:10BD1000000000000000000800000000000000001B +:10BD200000400000000000000000000000000000D3 +:10BD300000000000000000080000000000000000FB +:10BD400000080000000000000008000000000000E3 +:10BD500000000000000000080000000000000000DB +:10BD600000080300000000000008000000000000C0 +:10BD700000000000000000000008000000000000BB +:10BD8000000000080008000000000008000000009B +:10BD90000000000000000000004000000000000063 +:10BDA000000000A0000800000000000800000000E3 :10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 +:10BDC000000000080000000000000000000000006B :10BDD0000000000000000000000000000000000063 :10BDE0000000000000000000000000000000000053 :10BDF0000000000000000000000000000000000043 @@ -150548,16 +146451,16 @@ :10BEE0000000000000000000000000000000000052 :10BEF0000000000000000000000000000000000042 :10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 +:10BF10000000000000000000000000000009000018 :10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 +:10BF3000000000000000000000A000000000000061 +:10BF400000000900000000000000000000000040A8 +:10BF500000000000000000000000000000000004DD +:10BF60000000008400000000000000040200000047 :10BF700000000000000000000000000000000000C1 :10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000000000091 +:10BF9000000004000000000000000000000000009D +:10BFA0000000000000002100000000000000000070 :10BFB0000000000000000000000000000000000081 :10BFC0000000000000000000000000000000000071 :10BFD0000000000000000000000000000000000061 @@ -150578,19 +146481,19 @@ :10C0C0000000000000000000000000000000000070 :10C0D0000000000000000000000000000000000060 :10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 +:10C0F0000040000000000000000000000000000000 :10C10000000000000000000000000000000000002F :10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F +:10C12000000000009000000000000000000000007F :10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F +:10C140000000000000000008000000900000200037 +:10C1500000080000000000000000000000000000D7 +:10C160000000000000002008000000840000200003 +:10C1700000080208000000000000000000000000AD +:10C18000000000000000000008080000000000009F +:10C190002000000800000000000000000000000077 +:10C1A00000000000000800000040004000002100E6 +:10C1B000200000020000000000000000000000005D :10C1C000000000000000000000000000000000006F :10C1D000000000000000000000000000000000005F :10C1E000000000000000000000000000000000004F @@ -150738,78 +146641,78 @@ :10CAC0000000000000000000000000000000000066 :10CAD0000000000000000000000000000000000056 :10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 +:10CAF0000000000000000000000000000000208096 +:10CB00000000000000080000880000000000000095 +:10CB100000000000000000000000000000002100F4 +:10CB2000000300008400000000002000000000005E +:10CB3000880000000000000000000000000000006D +:10CB40002080000000000000840020008800020017 +:10CB500020000000000000000000000000000000B5 +:10CB60002080000000000000000000000000000025 :10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 +:10CB800000040000000000000000000000000000A1 :10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 +:10CBA0002000000000000000000000000000000065 :10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 +:10CBC0000000000400000000000000000000000061 :10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 +:10CBE00000000004000000000000001000000040F1 +:10CBF00000000000000000000000000000000041F4 +:10CC000000100000000000400000000000000010C4 :10CC10000000000000000000000000000000000014 :10CC20000000000000000000000000000000000004 :10CC300000000000000000000000000000000000F4 :10CC400000000000000000000000000000000000E4 :10CC500000000000000000000000000000000000D4 -:10CC60000000000000004000000000000000000084 -:10CC700000000000000000000000000000020000B2 -:10CC80004000000000020000000000000000000062 -:10CC90000000000000000000000000000000000094 -:10CCA000000000020002000200000002000000027A -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000010000000000000000034 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000010000000000000000013 -:10CD10000000000000000000000000000000000013 -:10CD200000000000000000000010000000000000F3 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000010000000000000D3 -:10CD500000000000000000000000000000000000D3 +:10CC600000000005000000080000000800000008A7 +:10CC7000001000000000000000000008000000A0FC +:10CC800000080000000800080000008800080008F4 +:10CC9000000000000000000000000084000000848C +:10CCA00000080000008400000084000000840008E8 +:10CCB0000008000000000000000800000000000064 +:10CCC000000000080084000000000000000000A038 +:10CCD000000800000000000000C00000000000008C +:10CCE00000000008000000000021002100210008D1 +:10CCF00000000000000300000021002100210000CE +:10CD000000000000000000000021000500210000DC +:10CD1000004100000000000000410000000500008C +:10CD200000000000000000000000000000000021E2 +:10CD300000000009000000000005002100000021A3 +:10CD400000000000000000000000000500000005D9 +:10CD500000000000000000050000000000000000CE :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 :10CD800000000000000000000000000000000000A3 :10CD90000000000000000000000000000000000093 :10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 +:10CDB000000000000000000000000000000800006B :10CDC0000000000000000000000000000000000063 :10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE200000000000000000000000000040000000C2 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 +:10CDE00000000000000000000000000082000000C1 +:10CDF0000000000000000000000000008200A00011 +:10CE000000000000400000000000000082008200DE +:10CE1000000000000000000000000000820082000E +:10CE200000000000000000110000900000008200DF +:10CE3000820000000000000090000000000082005E +:10CE400000000000000000008200000000008200DE +:10CE50000000000000008800A01100000000820017 +:10CE600000002000200082004000000000000000C0 :10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 +:10CE8000000000000000000800000000000000009A +:10CE9000000000000000000000000000000000088A :10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 :10CEC0000000000000000000000000000000000062 :10CED0000000000000000000000000000000000052 :10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 +:10CEF000000000000000000000000000000000032F +:10CF000000000003004100000021000000000000BC :10CF10000000000000000000000000000000000011 :10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 +:10CF30000000000000000000000000009000000061 +:10CF4000820000000000000000000000000000005F +:10CF500000000000000500000000000000000000CC +:10CF600008000000000000000000000000000000B9 :10CF700000000000000000000000000000000000B1 :10CF800000000000000000000000000000000000A1 :10CF90000000000000000000000000000000000091 @@ -150818,15 +146721,15 @@ :10CFC0000000000000000000000000000000000061 :10CFD0000000000000000000000000000000000051 :10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 +:10CFF0000000000000080000000000000000020027 +:10D000000000000000000000000000000008000018 +:10D0100000050008000800000008000082009009D8 +:10D0200000000000000000000000000000210000DF +:10D03000000800210000002100000000000008009E +:10D04000900000000000000000000000000400004C +:10D050000000002100000005080000000000081189 +:10D0600082110240000000000000000400000000E7 +:10D07000820000000000000000000000000000002E :10D0800000000000000000000000000000000000A0 :10D090000000000000000000000000000000000090 :10D0A0000000000000000000000000000000000080 @@ -150835,79 +146738,79 @@ :10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF +:10D10000000000000000000000000000000200001D +:10D11000000084000000000000000000000000008B +:10D1200000000000000000000000000000080000F7 +:10D130000000C0000000000000000000000000002F +:10D1400000000000000000000000000000000008D7 :10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF +:10D16000000000000000000000000000000000843B :10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F +:10D180000000000000000000000040410500000019 :10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F +:10D1A000000000000000000000004005400000807A :10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE -:10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E -:10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E +:10D1C00000000000000000000000000040054000DA +:10D1D00000800000000000000000000000000000CF +:10D1E00000000000000000000000000040050200F8 +:10D1F000000000000000000000000000000011001E +:10D200000000000000000000000000000900820093 +:10D2100000C0800080000000000000030000080043 +:10D220000000000000000000000000000900840071 +:10D2300000008000800000000000000300000000EB +:10D2400002000000000000000000000000000300D9 +:10D25000900000800000800000000000001100002D +:10D26000030000000000000000000000000020009B +:10D27000900000800000000000000000000200009C +:10D280000000000000000000000000000000C000DE +:10D2900020A00011080008000000000000010000AC +:10D2A0000100000000000000000000000000C000BD +:10D2B00020A000C0080008000000000000010000DD +:10D2C000000001000000000000000000000000005D +:10D2D000C00021A00002840008000000000000003F +:10D2E00000000100000000820000000000000000BB +:10D2F000C10021A0000284004000000000000000E6 :10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D +:10D3100000100000000000000000000000000000FD :10D3200000000000000000000000000000000000FD -:10D3300000000000000000000000000000000000ED +:10D3300000100000000000000000000000000000DD :10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD +:10D350000000008400000000000000000000000049 +:10D36000000000000000C0000000000000000000FD +:10D370000000008400000000000000000000000029 :10D38000000000000000000000000000000000009D :10D39000000000000000000000000000000000008D :10D3A000000000000000000000000000000000007D :10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D :10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D +:10D3E00000000000000000008000000000000000BD :10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC -:10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C +:10D40000000000000011800000C1000000000000CA +:10D4100000000000004100000009000000000000C2 +:10D42000000000000008800000C1000000000000B3 +:10D430000000000000418000000200000000000029 +:10D440000000000000000000000200830000000057 +:10D450000000000000000041800000020000000009 +:10D460000000000000000000800000C1000000007B +:10D4700000000000000000418000000500000000E6 +:10D48000000000000000000020000040000000003C +:10D4900000000000000000C10200000000000000C9 +:10D4A000000000000000000120000040000000001B +:10D4B00000000000000000C10400000000000000A7 +:10D4C0000000000000000000000082010083000056 +:10D4D000000000000000000000C104000000000087 +:10D4E00000000000000000000000400000C100003B +:10D4F000000000000000000000C104000000000067 :10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B +:10D510000000000000000000810000E00000480062 :10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB +:10D530000000000000000000810000E00000480042 :10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B +:10D5500000000000000000000000810000E000006A +:10D560004800000000000000000000000000000073 +:10D5700000410000000000000000810000E0000009 +:10D580004800000000000000000000000000000053 :10D59000000000000000000000000000000000008B :10D5A000000000000000000000000000000000007B :10D5B000000000000000000000000000000000006B @@ -150923,28 +146826,28 @@ :10D6500000000000000000000000000000000000CA :10D6600000000000000000000000000000000000BA :10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A +:10D680000000000000000000000000000000747BAB :10D69000000000000000000000000000000000008A -:10D6A000000000000000000000000000000000007A +:10D6A000000000000000000000000000DE2E747B7F :10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000000000005A -:10D6D000000000000000000000000000000000004A -:10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 -:10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 +:10D6C000000000000000000000000000DE2E00004E +:10D6D000747B00000000000000000000000000005B +:10D6E0000000000000000000000000000000DE2E2E +:10D6F000747B00000000000000000000000000003B +:10D700000000000000000000000000000000DE2E0D +:10D71000615603400000000000000230A00000003D +:10D72000000000000C4000000000000002C06A86FB +:10D73000615603400000000000000230A00000001D +:10D74000000000000C4000000000000002C06A86DB +:10D750000000615603400000000000000230A000FD +:10D760000000000000000C4000000000000002C0AB +:10D770006A86615603400000000000000230A000ED +:10D780000000000000000C4000000000000002C08B +:10D790006A86000000000000000000000000000099 :10D7A0000000000000000000000000000000000079 :10D7B0000000000000000000000000000000000069 :10D7C0000000000000000000000000000000000059 -:10D7D0000000000000000000000000000000000049 +:10D7D0000000000000000000000000000400000045 :10D7E0000000000000000000000000000000000039 :10D7F0000000000000000000000000000000000029 :10D800000000000000000000000000000000000018 @@ -150957,34 +146860,34 @@ :10D8700000000000000000000000000000000000A8 :10D880000000000000000000000000000000000098 :10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 +:10D8A0000000000000000010000000000000000068 +:10D8B0000000001000000000000000000010000048 +:10D8C0000000000000000040000000000000000018 :10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 -:10D8F0000000000000000000000000000000000028 +:10D8E0000000000000000000000000000010000028 +:10D8F0000040000000000000000000400000001098 :10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 +:10D910000000000000000000000000000082000481 +:10D9200000080000000000000088008200000010D5 +:10D93000008400000008000000000000000000005B +:10D9400000080000000000000000000000000000CF +:10D9500000000000000800000000000000000000BF +:10D9600000000010000000000000000000000000A7 +:10D970000000000000000010000000000000000097 +:10D980000000000000C000000000000000000000D7 :10D990000000000000000000000000000000000087 :10D9A0000000000000000000000000000000000077 :10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 +:10D9C0000000004100000000000000000000000016 :10D9D0000000000000000000000000000000000047 :10D9E0000000000000000000000000000000000037 :10D9F0000000000000000000000000000000000027 :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 :10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000000000000000E6 +:10DA30000000000000A00000000000000000000046 :10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 +:10DA500000000000001000000000000000000000B6 :10DA600000000000000000000000000000000000B6 :10DA700000000000000000000000000000000000A6 :10DA80000000000000000000000000000000000096 @@ -150996,7 +146899,7 @@ :10DAE0000000000000000000000000000000000036 :10DAF0000000000000000000000000000000000026 :10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 +:10DB1000A000000000000000000000000000000065 :10DB200000000000000000000000000000000000F5 :10DB300000000000000000000000000000000000E5 :10DB400000000000000000000000000000000000D5 @@ -151005,30 +146908,30 @@ :10DB700000000000000000000000000000000000A5 :10DB80000000000000000000000000000000000095 :10DB90000000000000000000000000000000000085 -:10DBA0000000000000004000000000000000000035 +:10DBA0000000000000000000000000000000000075 :10DBB0000000000000000000000000000000000065 :10DBC0000000000000000000000000000000000055 :10DBD0000000000000000000000000000000000045 -:10DBE0000000000000000002000000000000000033 +:10DBE0000000000000000000000000000000000035 :10DBF0000000000000000000000000000000000025 :10DC00000000000000000000000000000000000014 :10DC10000000000000000000000000000000000004 :10DC200000000000000000000000000000000000F4 :10DC300000000000000000000000000000000000E4 -:10DC400000000000000000000000000000000000D4 +:10DC40000000000000000084000000000000000050 :10DC500000000000000000000000000000000000C4 :10DC600000000000000000000000000000000000B4 -:10DC700000000000000000000000000000000000A4 +:10DC7000000800000000210000000000000000007B :10DC80000000000000000000000000000000000094 -:10DC90000000000000000000000000000000000084 +:10DC90000000000000002100000000000000000063 :10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 :10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 +:10DCD0000010000000000000000000000000000034 :10DCE0000000000000000000000000000000000034 -:10DCF0000000000000000000000000000000000024 +:10DCF0000400000000000000000000000000000020 :10DD00000000000000000000000000000000000013 -:10DD10000000000000000000000000000000000003 +:10DD100008000000000000000000000000000000FB :10DD200000000000000000000000000000000000F3 :10DD300000000000000000000000000000000000E3 :10DD400000000000000000000000000000000000D3 @@ -151216,32 +147119,32 @@ :10E8A0000000000000000000000000000000000068 :10E8B0000000000000000000000000000000000058 :10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 -:10E9200000000000000000000000000000000000E7 -:10E9300000000000000000000000000000000000D7 -:10E9400000000000000000000000000000000000C7 -:10E9500000000000000000000000000000000000B7 -:10E9600000000000000000000000000000000000A7 +:10E8D00000000000000000820084000800840000A6 +:10E8E00000080008000800080008004000080000B8 +:10E8F0000008000000080000008200840000000002 +:10E90000000800080008000800400000000800009F +:10E9100000C000000008000000000000000000002F +:10E9200000000008000800080008000800000008B7 +:10E93000000000080000004000000000000000008F +:10E94000000000C0001000080008000800000008D7 +:10E9500000000008000000000000000800000000A7 +:10E960000000000000000000000000100000000592 :10E970000000000000000000000000000000000097 -:10E980000000000000000000000000000000000087 +:10E980000000000000000000000000000003000084 :10E990000000000000000000000000000000000077 :10E9A0000000000000000000000000000000000067 :10E9B0000000000000000000000000000000000057 :10E9C0000000000000000000000000000000000047 :10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 +:10E9E0000000000000000010000000000000000017 +:10E9F0000000000000100000000000000000000007 :10EA00000000000000000000000000000000000006 :10EA100000000000000000000000000000000000F6 :10EA200000000000000000000000000000000000E6 :10EA300000000000000000000000000000000000D6 :10EA400000000000000000000000000000000000C6 :10EA500000000000000000000000000000000000B6 -:10EA600000000000000000000000000000000000A6 +:10EA60000000000000000000008000000000000026 :10EA70000000000000000000000000000000000096 :10EA80000000000000000000000000000000000086 :10EA90000000000000000000000000000000000076 @@ -151249,43 +147152,43 @@ :10EAB0000000000000000000000000000000000056 :10EAC0000000000000000000000000000000000046 :10EAD0000000000000000000000000000000000036 -:10EAE0002000000000000000000000000000000006 -:10EAF0000000000000000000000000000000000016 -:10EB000020000000000000000000000000000000E5 -:10EB100000000000000000000000000000000000F5 -:10EB200000002000000000000000000000000000C5 -:10EB300000000000000000000000000000000000D5 -:10EB400000002000000000000000000000000000A5 -:10EB50004000000000000000000000000000000075 -:10EB600000000000000000000000409000000000D5 +:10EAE0000000008400000000001000100000000082 +:10EAF00000000000004000000000000000000000D6 +:10EB00000000000000000000000000000040004085 +:10EB100000080000004000000000000000000000AD +:10EB200000000000000000000000000000000000E5 +:10EB30000000004000000000000000400000000055 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 :10EB70000000000000000000000000000000000095 :10EB80000000000000000000000000000000000085 -:10EB900000000000000000000000000000000090E5 -:10EBA0000000000200000000000000000000000063 +:10EB9000000000000000000000000008000000006D +:10EBA0000000000000000000000000000000000065 :10EBB0000000000000000000000000000000000055 :10EBC0000000000000000000000000000000000045 :10EBD0000000000000000000000000000000000035 :10EBE0000000000000000000000000000000000025 -:10EBF00008400000000000000000000000000000CD +:10EBF0000000000000000000000000000000000015 :10EC00000000000000000000000000000000000004 -:10EC100008400000000000000000000000000000AC +:10EC100000000000000000000000000000000000F4 :10EC200000000000000000000000000000000000E4 -:10EC3000000008400000000000000000000000008C +:10EC300000000000000000000000000000000000D4 :10EC400000000000000000000000000000000000C4 -:10EC5000000008400000000000000000000000006C -:10EC600000000000000000000000000000000000A4 -:10EC70000000000000000000000000000000000094 -:10EC80000000000000000000000000000000000084 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000100000000000000A3 +:10EC70000040000000000000000000000000000054 +:10EC80000000004000000000000000000000000044 :10EC90000000000000000000000000000000000074 :10ECA0000000000000000000000000000000000064 :10ECB0000000000000000000000000000000000054 :10ECC0000000000000000000000000000000000044 :10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000000000024 -:10ECF0000000000000000000000000000000000014 +:10ECE0000000000000000500030008000000000014 +:10ECF000080000000000000000000000000000000C :10ED00000000000000000000000000000000000003 :10ED100000000000000000000000000000000000F3 -:10ED200000000000000002000000000000000000E1 +:10ED200000000000000000000000000000000000E3 :10ED300000000000000000000000000000000000D3 :10ED400000000000000000000000000000000000C3 :10ED500000000000000000000000000000000000B3 @@ -151435,16 +147338,16 @@ :10F6500000000000000000000000000000000000AA :10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A -:10F69000000000000000000000000000000000006A -:10F6A000000000000000000000000000000000005A +:10F6800000000000000000000000000000880008EA +:10F690000010002000000000000000080000000032 +:10F6A0000000000800000000000000000000000052 :10F6B000000000000000000000000000000000004A :10F6C000000000000000000000000000000000003A :10F6D000000000000000000000000000000000002A :10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 -:10F7100000000000000000000000000000000000E9 +:10F7000000000000000000000000000000000005F4 +:10F7100000000001000100000000000000000000E7 :10F7200000000000000000000000000000000000D9 :10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 @@ -151456,30 +147359,30 @@ :10F7A0000000000000000000000000000000000059 :10F7B0000000000000000000000000000000000049 :10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 +:10F7D0000001000000000000000000000000000028 :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 :10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 -:10F8200000000000000000000000000000000000D8 -:10F8300000000000000000000000000000000000C8 -:10F8400000000000000000000000000000000000B8 -:10F8500000000000000000000000000000000000A8 -:10F860000000000000000000000000000000000098 -:10F870000000000000000000000000000000000088 -:10F880000000000000000000000000000000000078 -:10F890000000000000000000000000000000000068 -:10F8A0000000000000000000000000000000000058 -:10F8B0000000000000000000000000000000000048 +:10F810000000000800880008000800080008001028 +:10F8200000880000000800080000008400080008AC +:10F830000000001000080008008800880088000010 +:10F840000088000000080084000800840084008410 +:10F850000000000000000008000800000010008800 +:10F860000000000000000008000000100000000080 +:10F870000000000000000008000800000008000070 +:10F880000000000000000008000000000000000070 +:10F890000000000000100000000000000000000058 +:10F8A000000000050000000000000000000800004B +:10F8B0000000000000000000000000000008000040 :10F8C0000000000000000000000000000000000038 -:10F8D0000000000000000000000000000000000028 -:10F8E0000000000000000000000000000000000018 +:10F8D0000000000000000000000000100000000810 +:10F8E0000005000300000000000000000000000010 :10F8F0000000000000000000000000000000000008 :10F9000000000000000000000000000000000000F7 -:10F9100000000000000000000000000000000000E7 +:10F91000000000000000000000000000000000A047 :10F9200000000000000000000000000000000000D7 :10F9300000000000000000000000000000000000C7 -:10F9400000000000000000000000000000000000B7 +:10F9400000080000000000000000000000000000AF :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 @@ -151492,23 +147395,23 @@ :10F9E0000000000000000000000000000000000017 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 -:10FA100000000000400000000400000000000000A2 +:10FA100000000000000000000000000000000000E6 :10FA200000000000000000000000000000000000D6 -:10FA300000000000000000002000000000000000A6 -:10FA40004000000000000000000000000000000076 -:10FA50000000000000000000000020000000000086 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 :10FA60000000000000000000000000000000000096 -:10FA7000000000000000C0000000200000000000A6 +:10FA70000000000000000000000000000000000086 :10FA80000000000000000000000000000000000076 -:10FA90004000000000000000000000000000000026 +:10FA90000000000000000000000000000000000066 :10FAA0000000000000000000000000000000000056 :10FAB0000000000000000000000000000000000046 :10FAC0000000000000000000000000000000000036 :10FAD0000000000000000000000000000000000026 :10FAE0000000000000000000000000000000000016 -:10FAF0000000000000000000000000000000000006 +:10FAF00000410000000000000000000000000000C5 :10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000400000000E1 +:10FB100000000000000000000000000000000000E5 :10FB200000000000000000000000000000000000D5 :10FB300000000000000000000000000000000000C5 :10FB400000000000000000000000000000000000B5 @@ -151516,13 +147419,13 @@ :10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 -:10FB90000000000000000000000000000004000061 +:10FB90000000000000000000000000000000000065 :10FBA0000000000000000000000000000000000055 -:10FBB0000000000000000000000000000000000045 +:10FBB0000000000000000010000000000000000035 :10FBC0000000000000000000000000000000000035 :10FBD0000000000000000000000000000000000025 :10FBE0000000000000000000000000000000000015 -:10FBF0000000000000000000000000000000000005 +:10FBF00000000000001000000000000000000000F5 :10FC000000000000000000000000000000000000F4 :10FC100000000000000000000000000000000000E4 :10FC200000000000000000000000000000000000D4 @@ -151533,7 +147436,7 @@ :10FC70000000000000000000000000000000000084 :10FC80000000000000000000000000000000000074 :10FC90000000000000000000000000000000000064 -:10FCA0000000000000000000000000000000000054 +:10FCA0000000000000000000000000400000000014 :10FCB0000000000000000000000000000000000044 :10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 @@ -151541,7 +147444,7 @@ :10FCF0000000000000000000000000000000000004 :10FD000000000000000000000000000000000000F3 :10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000000000D3 +:10FD200000000000000000000000000000030000D0 :10FD300000000000000000000000000000000000C3 :10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 @@ -151549,15 +147452,15 @@ :10FD70000000000000000000000000000000000083 :10FD80000000000000000000000000000000000073 :10FD90000000000000000000000000000000000063 -:10FDA000000010000000080000000000000000003B +:10FDA00000000000000000008000002000000003B0 :10FDB0000000000000000000000000000000000043 -:10FDC0000500080000000000000000000000000026 -:10FDD0000000000000000000000000000000100013 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 :10FDE0000000000000000000000000000000000013 -:10FDF00000000000000000000000000000001000F3 -:10FE000000000000050000000000000000000000ED +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000000000000000F2 :10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000000000000D2 +:10FE200000000000000000000000040000010000CD :10FE300000000000000000000000000000000000C2 :10FE400000000000000000000000000000000000B2 :10FE500000000000000000000000000000000000A2 @@ -151565,33 +147468,33 @@ :10FE70000000000000000000000000000000000082 :10FE80000000000000000000000000000000000072 :10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000000000000000052 -:10FEB0000000000000000000000000000000000042 +:10FEA0000000000000000000000000000001000051 +:10FEB0000004A0000000000000000000000000009E :10FEC0000000000000000000000000000000000032 :10FED0000000000000000000000000000000000022 -:10FEE0000000000000000000000000000000000012 +:10FEE0000000000000000000000000000001000011 :10FEF0000000000000000000000000000000000002 :10FF000000000000000000000000000000000000F1 :10FF100000000000000000000000000000000000E1 -:10FF200000000000000000000000000000000000D1 -:10FF300000000000000000000000000000000000C1 +:10FF200000000000000000000000000000000020B1 +:10FF3000000500000040000000000000000000007C :10FF400000000000000000000000000000000000B1 :10FF500000000000000000000000000000000000A1 :10FF60000000000000000000000000000000000091 :10FF70000000000000000000000000000000000081 :10FF80000000000000000000000000000000000071 :10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000080000000000000049 -:10FFB0000000000000000000000000000000000041 +:10FFA0000000000000000000000000000000000051 +:10FFB0000040800000000020000000000000000061 :10FFC0000000000000000000000000000000000031 -:10FFD0000000000000001000000000000000000011 +:10FFD0000000000000000000000000000000000021 :10FFE0000000000000000000000000000000000011 -:10FFF00000000000000000000800000000000000F9 -:020000040025D5 +:10FFF00000020000000000000000000000000000FF +:020000040024D6 :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 +:1000300000000000020000000001000000000000BD :1000400000000000000000000000000000000000B0 :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 @@ -151599,7 +147502,7 @@ :100080000000000000000000000000000000000070 :100090000000000000000000000000000000000060 :1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 +:1000B00000000000818100C8430000000000000033 :1000C0000000000000000000000000000000000030 :1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 @@ -151615,7 +147518,7 @@ :10018000000000000000000000000000000000006F :10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F +:1001B00000000000000000004200048180000000F8 :1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F @@ -151631,8 +147534,8 @@ :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E +:1002B000000000000000000000000000000440A05A +:1002C0000502200000000000000000000000000007 :1002D000000000000000000000000000000000001E :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE @@ -151648,7 +147551,7 @@ :10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D +:1003C000000000001000000000000000000000001D :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD @@ -151656,7 +147559,7 @@ :1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC -:1004400000000000000000000000000000000000AC +:10044000000000000004000880020000000000001E :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C @@ -151664,7 +147567,7 @@ :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C -:1004C000000000000000000000000000000000002C +:1004C00000000000008A020000455100000000000A :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC @@ -151672,7 +147575,7 @@ :1005100000000000000000000000000000000000DB :1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000000AB +:10054000000000000000000009999000000A00006F :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B @@ -151680,28 +147583,28 @@ :10059000000000000000000000000000000000005B :1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B -:1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA -:1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A -:10066000000000000000000000000000000000008A -:10067000000000000000000000000000000000007A -:10068000000000000000000000000000000000006A -:10069000000000000000000000000000000000005A -:1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000000000002A +:1005C0000000000000000000FFFFFFFFFFFFFFFF33 +:1005D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:1005E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:1005F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:10060000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10061000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10062000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:10063000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10064000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10065000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10066000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10067000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10068000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10069000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:1006A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:1006B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:1006C000FFFFFFFFFFFFFFFFFFFFFFFF0000000036 :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA -:1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 +:100700000000000000000000000000000000900158 +:1007100000000001000000000000000000000000D8 :1007200000000000000000000000000000000000C9 :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 @@ -151717,11 +147620,11 @@ :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000000000D8 +:1008100000000000000000040000000000000000D4 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 +:1008500000000000000000000000A40000000000F4 :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 @@ -151733,7 +147636,7 @@ :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 +:1009100000000000000100000000000000000000D6 :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 @@ -151744,80 +147647,80 @@ :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 -:1009C00000000000000000002000000000002000E7 -:1009D000200000002000A0000000C0002000000057 -:1009E0000000200000001000200010000000200087 -:1009F0002000000020004000000020004000000017 -:100A00000000200000002000000320002000000063 -:100A1000200020000000200020008800200020008E -:100A2000000088002000002020002000C0000000FE -:100A300020002000000020002000200020002000D6 -:100A40000000200020000000200000000000000046 -:100A50000000000040000000000000000000000056 -:100A60000000000000000000000000000000000086 -:100A70000002000000000000000200000000000072 -:100A80000000000000000000000000000000000066 -:100A9000000000000000000200C000A000000020D4 -:100AA000000000A0000000000000000000000000A6 -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000100000000006 -:100AE00000000000000000000000200800000000DE -:100AF00000000000000000000000001000000000E6 -:100B000000000000000000000000200800000000BD -:100B100000000000000000000000000000100000C5 -:100B2000000000000000000000000000200800009D -:100B300000000000000000000000000000100000A5 -:100B4000000000000000000000000000100400048D -:100B50000000000000840000000400040000000009 -:100B6000000400000000000000000090800100026E +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A500000000000000000000000000800840010FA +:100A600000080008000800840008000800080002D0 +:100A7000000800080008000800080008000000083E +:100A8000000800080008000800080008000800002E +:100A900000080008000800080084000000080008A2 +:100AA000008400080008000800080008000800088A +:100AB000000000100008000800080084000800087A +:100AC0000000000800080082001000820008008476 +:100AD0000000008400080008000200080000000078 +:100AE00000080000000500000008000000000005EC +:100AF00000000003000000000002000000210021AF +:100B000000000000000000030000000000210021A0 +:100B100000000000000000000000000800000021AC +:100B20000021000000000000000000000002002082 +:100B3000002100090000000000000000000000008B +:100B4000002100000000000000000000000800007C +:100B5000000800000000000000000000000000008D +:100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 -:100B800000000000000000000000000080010000E4 +:100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 -:100BA00000000000000000000000000000008001C4 +:100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000840000800120 -:100BD0000040000000210021000000400003000050 -:100BE0000002000000040003000000008804000070 -:100BF0000020000000000040000000000000000095 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 -:100C100000000020000000000000000000000000B4 -:100C2000C000000000000000000000000000000004 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 -:100C50000021000000000000000000000000000073 +:100C50000000000000000000000000000000000094 :100C60000000000000000000000000000000000084 -:100C70000000020000000000000000000000000072 +:100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 +:100C900000A00000000000000000000000000000B4 :100CA0000000000000000000000000000000000044 -:100CB000000000000000080000000000000000002C -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000082000000820010 -:100CE0000000000000000000000082000000820000 -:100CF00000000000000000000000820000008200F0 -:100D000000000000000000001000820000008200CF -:100D1000000008000000100008008200820010009F -:100D200082000000000082000000080082008200B3 -:100D30008200000008008200000082008200820021 -:100D40008200000000000800000008008200080087 -:100D500082000000080000A0000000000000000069 -:100D6000000000000000050000000000000000007E +:100CB000000000000000000000000008000000002C +:100CC000000000080000000000000000000000001C +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000030000000000080000000000000000D8 +:100D100000000000002000000000000000000000B3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 -:100DA0000000000000000800050000000000000036 +:100DA0000000000000000000000000000000000043 :100DB0000000000000000000000000000000000033 -:100DC000000000000000080000000000000000001B -:100DD00000000000000000000808A000000008005B -:100DE00000000000000000000000004000110011A1 -:100DF00000000000002040400800A004000008009F -:100E000000000000000000000000000000000000E2 -:100E100000000800A011004000000800C000000011 -:100E20000800C000000000000000000000000000FA -:100E3000000000000000000000400800A0000000CA -:100E4000080000000000000000000000000000009A -:100E50000000000000000000004000000000000052 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000021002100000000B1 +:100E000000000021000000000000000000000000C1 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 :100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 @@ -151826,95 +147729,95 @@ :100EB0000000000000000000000000000000000032 :100EC0000000000000000000000000000000000022 :100ED0000000000000000000000000000000000012 -:100EE0000000000008000000080090000000000062 -:100EF00000000003000008000003000000000000E4 -:100F0000C000000008000000080008000000000009 -:100F10000800000300000000000000000000C00006 -:100F200000000000000008000000080000000000B1 -:100F300000000000000000000808000000000000A1 -:100F40008400000000000800A0000800100000005D -:100F50000000000000000000082100000000000068 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000800000049 +:100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 -:100FE00000010001000100C00001000100C0000379 -:100FF00000000101000800820001400100C1000062 -:1010000000010001000100C00001000100C0000358 -:1010100000000101002000880001400100C1000023 -:10102000000000010001000100C00001000100C03B -:10103000000300000001004000900001400100C1D9 -:10104000000000010001000100C00001000100C01B -:10105000000300000001004000040001400100C145 -:10106000000000410041004100C00341004100C1B7 -:1010700020C100200241008000000041804100901A -:10108000000000410041004100C00341004100C197 -:1010900020C100200241000000000041804100907A -:1010A0000000000000410041004100C00541004136 -:1010B00000C120C100200941000000000041804122 -:1010C0000090000000410041004100C00341004188 -:1010D00000C120C100200941000000800041804182 -:1010E0000090000041000300000000804100C000AB -:1010F0000000090090000800008085004100C10048 -:101100000010800041000300000000804100C0008A -:1011100000001000C100020000A085004100C100D5 -:101120000010800000034100030000000080410027 -:10113000C00000004000C100080000A08300410082 -:10114000C100001080004100030000000080410049 -:10115000C00000004000820088000080A000410024 -:10116000C1000010800001000100000000C001006B -:10117000C00000000000050010020004C0000300D1 -:10118000C1000091820001000100000000C00100C8 -:10119000C00000000000040010080005C0000900A5 -:1011A000C10000918200000001000100000000C0A9 -:1011B0000100C00000000000040020400005C00045 -:1011C0004100C1000091820001000100000000C048 -:1011D0000100C00000000000040004820004C00000 -:1011E0004100C1000091820000C00001C0C10000A8 -:1011F0000000000100C110830011000100C10000C7 -:10120000000000010001000000C00001C0C100009A -:101210000000000100C110820083000100C1000035 -:101220000000000100010000000000C00001C0C17A -:1012300000000000000100C110830041000100C156 -:101240000000000000010001000000C00001C0C15A -:1012500000000000000100C110830041000100C136 -:10126000000000000001000100000080004180C17A -:101270000000000000410090119000C1004100C139 -:10128000000000000041001000000080004180C10B -:10129000000000000041009000890041004100C1B1 -:1012A000000000000041001000000000008000412C -:1012B00080C100000000004100900090004100410A -:1012C00000C100000000004100100000008000414B -:1012D00080C10000000000410090009000410041EA -:1012E00000C100000000004100100000C1008000AB -:1012F00080C100004111800305004100C141000090 -:10130000800800004100000080004100C100800012 -:1013100080C100004100000390004100C1C10000F5 -:101320008008000041000000800041000000C10072 -:10133000800080C100004100000302004100C1C1E3 -:101340000000800800004100000080004100C10052 -:10135000800080C100004100000302004100C1C1C3 -:101360000000800800004100000080004100C10032 -:101370004000C0C100000100200003000100C1893D -:101380009000C000000001000000C0000100C1008A -:101390004000C0C100000100200005000100C11193 -:1013A0009000C000000001000000C000010000002B -:1013B000C1004000C0C10000010020008900010000 -:1013C000C1119000C000000001000000C000010039 -:1013D000C1004000C0C100000100200089000100E0 -:1013E000C1119000C000000001000000C000010019 -:1013F00000000000000000420000000000000000AB -:1014000081120048070048000000000000000000B2 -:10141000000000000000004200000000000000008A -:101420008112004807004800000000000000000092 -:10143000000000000000000000420000000000006A -:101440000000811200480700480000000000000072 -:10145000000000000000000000420000000000004A -:101460000000811200480700480000000000000052 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:10101000800000000000004100000000000000000F +:1010200000000000000000008000000000000041FF +:1010300000000000000000000000000000000000B0 +:10104000000080000000000000418000000000005F +:10105000004100000000000000000000000000004F +:101060000000000000000000000000000000000080 +:10107000000000000000000000000200000000006E +:101080000000000000000000000000000000000060 +:101090000000C0000000000000010000000000008F +:1010A00000000000000000000000C0000000000080 +:1010B000000100000000000000000000000000002F +:1010C00000000000C000000000000001C00000009F +:1010D000000000010000000000000000000000000F +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000002000000000000AC +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:10130000000000004800000000000007000000008E +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:101400000000000000000000000000001401800047 +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C @@ -151925,6 +147828,4103 @@ :1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC :1015000000000000000000000000000000000000DB +:1015100010040000000000000000000000000000B7 +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:101690000000000000040000000000000000000046 +:1016A0000000000000000000000000000004000036 +:1016B00080000000000000000000000000000000AA +:1016C0000000000000040000800000000000000096 +:1016D0000000000000000000000000000000000406 +:1016E00000008000000000040000800000000000F6 +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000020000B7 +:101730000000400000000000000000000000000069 +:101740000000000000020000000040000000000057 +:101750000000000000000000000000000000000287 +:1017600000000000400000020000000040000000F7 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000008080000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000900000000000000000000000000099 +:1017C0000000000000000000000090000000000089 +:1017D0000000000000000000000000000000000009 +:1017E00000000000900000000000000090000000D9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000400000000000000000000B4 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000400000000000064 +:101880000000000000000000000000000000000454 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:10199000000000000000000800000000000800082F +:1019A0000000000000080008000000000008000817 +:1019B0000000000000000008000000000088000295 +:1019C00000000000000800080000000000080008F7 +:1019D0000000000000000000000400000000000003 +:1019E00000000000000000880008000000000088DF +:1019F00000080000000000000000000000000000DF +:101A000000000000000000000002000000000008CC +:101A100000080000000000000000000000000000BE +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB00000000000000000000000000000000040E6 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000040000000000000000000000000A6 +:101B00000000000000000000000000000000004095 +:101B10000000004000000000000000000000000085 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000001000000015 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000800000000DC +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000000AC +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000000DC +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000000000000000000000009B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:10258000000000000000000000000000000000004B +:10259000000000000000000000000000000000003B +:1025A000000000000000000000000000000000002B +:1025B000000000000000000000000000000000001B +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B000000000000000000000000000000000001A +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000000000000000000099 +:102740000000000000000000000000000000000089 +:102750000000000000009000900000000000000059 +:102760000000000000000000000000000000000069 +:10277000000084008800000000000000000000004D +:102780000000000000000000000000000001000048 +:102790000000000000000000000000000000000039 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000000048 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C0000000000000000000000000000000000008 +:1028D0000000000000000000008200820082000072 +:1028E00000820000000000000000008400080000DA +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000080000BF +:1029100000000000000000000000000000000000B7 +:102920000000000000000000000000000000008225 +:10293000000000000000000000080000000000008F +:102940000000000000000000000000000084000003 +:102950000000000000030000000000110000000063 +:102960000000004000000000000000000000000027 +:102970000000000000000000000000000002000055 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000002000200000000036 +:102A60000000000000000000000000000000000066 +:102A7000840000000000000084000000000000004E +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000100010000F4 +:102AE00000000000000000000000000000000000E6 +:102AF000000000A000000000000000000000000036 +:102B00004000000008000800000003000000000072 +:102B100000000000000000000000000000000000B5 +:102B20000008080000000000000000000000000095 +:102B3000000000000008000000000000000000008D +:102B40000000000000000000000000000000000085 +:102B50000000000000A000000000000000000000D5 +:102B6000000400000000000000000002000000005F +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000001000100000000000000000062 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000080000000004000400000000000000D4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000030000000000C0 +:102D100000000000000000000000000000000000B3 +:102D2000000000000000000000000000080000009B +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D500000000000000000000000008400000000EF +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E600000000000000000000000008000080000DA +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000400000A2 +:102EF00000080000000000000000000000000000CA +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F700090000000000000000000000000000000C1 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000800D9 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000001000000000000000000000000040 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:103170000000000000000000070000000000000048 +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:1034800005000A08050000A0000000000000000080 +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000000000000000000000CA +:103700000000000000000000000000000000A00019 +:10371000A000000000000041C00000000000000008 +:10372000000000000000000000000000000088020F +:103730002000880000008800000000000000000257 +:103740000000000000000000000000030000000076 +:1037500000000000000000000000880000040000DD +:103760000000000000000000000000000000000059 +:103770000000000200000000000000000000000047 +:103780000000000200000000000000000000000037 +:103790000000000000000000000021000000000008 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:103810000011000000000000000000000000000097 +:103820000000000000000000000000002000000078 +:103830000000000000000000000000000000000088 +:1038400000000000000000000000000000800000F8 +:103850000000000000000000A000A0000000000028 +:1038600090000000000000000000000000000000C8 +:103870000000000000000000000000000003000342 +:103880000000000000000000000000000000200810 +:1038900000080008008400080000000000900000FC +:1038A000008400000000000000000000000880000C +:1038B00000080008000000080000000000000000F0 +:1038C0000000000000000000000000000088000868 +:1038D00000000008000800020008000000000000CE +:1038E00000000008000000000000000000000000D0 +:1038F00000000008000800080008000000000000A8 +:1039000000000008000000000000000000080000A7 +:103910008001002100090021000000210021001188 +:10392000000400210021000200000021002100000D +:103930000021002100020000000000210021000001 +:103940000009000800000000000000210021000024 +:103950000000000000210002000000000021002102 +:1039600000000000004100000000000000210021D4 +:1039700000000000002100020000000000210021E2 +:1039800000000000000800000000000000210021ED +:1039900000210021000000000004000000000002DF +:1039A00000000090118800040000000211000000D7 +:1039B0000000000000000000000000000000000007 +:1039C0000000000000A00000000000000000000057 +:1039D00000000000000000000000000000000000E7 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000020000000000000A7 +:103A000000000000000000000000000000000000B6 +:103A10000000000000000000000000008400000022 +:103A2000000000000000000000008400820084000C +:103A30000000C005C008000000000008820000006F +:103A4000C0000000820084004000C00082004000EE +:103A50008200A000A080000082008200820000009E +:103A60008200000000004000000082008200000090 +:103A700000000000000382080000820082000000B5 +:103A80000000000000000000000000000000000036 +:103A90000000000000000000000000880088000016 +:103AA0000000000000000082008200000000000012 +:103AB00000000000000000010000000000080000FD +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000040000000000000000E2 +:103AE00000000000000000000000000800000000CE +:103AF00000000000000000000001000000000000C5 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000880000084000D5 +:103B2000400200000000000084004000000000048B +:103B3000400000000000000000080000000808002D +:103B400008000000000082000800000000000000E3 +:103B5000000000000002000000000000000000085B +:103B600000080800000000000800820000000000BB +:103B70000000000000000008000000000000000835 +:103B80000000000000000000000008000000000528 +:103B90000008000000000004000000080000110000 +:103BA00000000000000000000000400000000000D5 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000021000000000000000000000000000073 +:103C30000000000000000000000000000000000084 +:103C40000000820800008200000000000000000068 +:103C5000000040008400000000000000820300001B +:103C6000000000000800A000080000008200000022 +:103C700000000000000000000000000000000080C4 +:103C80000000000000000000000000000000000034 +:103C90000000000800000000000500030000000014 +:103CA0000000000000000000000000000000030011 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D000000040000000000000000000000000000AF +:103D100000000000000000000000000000000000A3 +:103D2000000000010001000100C00001000100C10D +:103D3000000900008801008400820001000100C128 +:103D4000000000010001000100C00001000100C0EE +:103D5000018300000001008800100001000100C183 +:103D60000000000000010001000100C0000100018E +:103D700000C0008300000001008800100001000165 +:103D800000C1000000010001000100C000010001AD +:103D900000C001410000000100020010000100010C +:103DA00000C1000000410041004100A0004100416D +:103DB0000090034100040241008000800041004166 +:103DC0000085000000410041004100C00041004169 +:103DD00000901041000202410000008000410041BB +:103DE00000850000000000410041004100C000418A +:103DF00000410090084100040241000000800041A1 +:103E00000041008500000041004100410090004158 +:103E10000041009010410004024100000080004178 +:103E200000410085000041000300000000804100C7 +:103E30008300000010001000020000808800410094 +:103E4000C10000808080410003000000008041002C +:103E50008300000010002000100000808900410055 +:103E6000C10000808080000041000300000000804D +:103E70004100C00000001000400002000080A000CF +:103E80004100C100008080804100030000000080EC +:103E90004100890000001000090002000080880035 +:103EA0004100C1000080808001000100000000C0CE +:103EB0000100C000000000000300880800C0C1101D +:103EC0008900C1000084101001000100000000C042 +:103ED0000100C00000000000880082080084C020AB +:103EE0008300C100008410100003010001000000E5 +:103EF00000C00100C000000000008800400800026F +:103F0000C0004100C1000084101001000100000049 +:103F100000C00100C00000000000880040C0000296 +:103F2000C0001100C1000084101000C00001C0C119 +:103F300000000000000100C008110041000108C19C +:103F40000000000000010000000000C00001C0C12E +:103F500000000000000100C040110003000100C18A +:103F600000000000000100000000000000C000018F +:103F7000C0C100000000000100C0041100030001E6 +:103F800000C10000000000010000000000C00001AE +:103F9000C0C100000000000100C0101000110001AD +:103FA00000C100000000000100000000008000418E +:103FB00080C100000000004100C1000800C10041B4 +:103FC00000C110000000004100110000008000410D +:103FD00080C100000000004100C1002000C100417C +:103FE00000C100000000004100110000000000803E +:103FF000004180C100000000004100C1802000C1DC +:10400000004100C1000000000041001100000080DC +:10401000004180C100000000004100C1800200C1D9 +:10402000004100C100000000004100110000C1007B +:10403000800080C100004102000390004100C141A6 +:104040008008800300004100000080004100C100A2 +:10405000800080C100004102000385004100C1C111 +:10406000800080020000410000008000410000004C +:10407000C100800080C100004102000385004100B2 +:10408000C1C1000080050000410000008000410027 +:10409000C100800080C10000410200008200410098 +:1040A000C14100008010000041000000800041007C +:1040B000C1004000C0C100000100020083000100F7 +:1040C000C1910200C001000001000000C000010019 +:1040D000C1004000C0C100000100020082000100D8 +:1040E000C1050200C001000001000000C000010085 +:1040F0000000C1004000C0C10000010002008200B9 +:104100000100C1054000C000000001000000C00027 +:104110000100C1004000C0C1000001000200100009 +:104120000100C1114000C000000001000000C000FB +:10413000010000000000000000420000000000003C +:10414000000081120041070048210000000000002B +:10415000000000000000000000420000000000001D +:10416000000081120041070048000000000000002C +:1041700000000000000000000000004200000000FD +:10418000000000008112004107004800000000000C +:1041900000000000000000000000004200000000DD +:1041A00000000000811200410700480000000000EC +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B0000000000000000000757B0000000000000E +:1042C00000000000000000000000000000000000EE +:1042D000000000000000DEAE757B00000000000062 +:1042E00000000000000000000000000000000000CE +:1042F000000000000000DEAE0000757B0000000042 +:1043000000000000000000000000000000000000AD +:104310000000000000000000DEAE757B0000000021 +:10432000000000000000000000000000000000008D +:104330000000000000000000DEAE60C603000000C8 +:10434000000000000031E0000000000000000C0050 +:1043500000000000000000C0630660C6030000000B +:10436000000000000031E0000000000000000C0030 +:1043700000000000000000C06306000060C60300EB +:104380000000000000000031E0000000000000001C +:104390000C0000000000000000C0630660C60300BF +:1043A0000000000000000031E000000000000000FC +:1043B0000C0000000000000000C0630600000000C8 +:1043C00000000000001100000000000000000000DC +:1043D00000000000000000000000000400000000D9 +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000010000BC +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:104450000000000400000000000000000000000058 +:104460000000000000000000000000000000000448 +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000200000000000000000000000000001A +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000040000F8 +:1044C000000000000000020002000000A000000048 +:1044D00000000000000000000000000000040000D8 +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000001000000000000000000000008B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:1045400000000000000000088088800800000000D3 +:104550000000000200080008000800040000000538 +:10456000000000000000000800000008000000003B +:10457000000000000008000800080000000000081B +:104580000000000000000004008400000008000893 +:10459000000000000000000800820082000000000F +:1045A00000080000000000000000000800080008EB +:1045B00000000000000000080010000000000008DB +:1045C0000088000000118802204002000000000264 +:1045D000000000000000008000000000002100003A +:1045E0000021000500000008000900000003000091 +:1045F0000009000000000000000000210000000091 +:104600000000000000000000000000000008004161 +:104610000000000000000000000000080000000092 +:104620000008000000000000000000000000000082 +:10463000000000000000000000000000000000007A +:1046400000000000000000820000000004C0000024 +:10465000000004000088110000400008000800006D +:104660000000000800200000000000000000210001 +:10467000000800004100000000080008000800A039 +:1046800000000000000000000000008400000000A6 +:104690000000000800000200000000080002000204 +:1046A000000000000000000000000000000000000A +:1046B00000000008000800000000000800080008D2 +:1046C000008400000008001000000000000000004E +:1046D0001000000000000000200001000080000029 +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000001100000000000000000000000078 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000410028 +:104750000000100000000000008280842008000497 +:1047600000820000000000000000000000000000C7 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000002002C7 +:1047D0000000084000000000004000090000000246 +:1047E0000004080020000000000900000400000090 +:1047F00000000002000000000000000000000000B7 +:10480000000000410000000000080000000000005F +:104810000000000000000000000000000000000098 +:104820000000000000000000000000080000000080 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:1048500080880020200000041100040000001120C6 +:1048600000210020912080000000000000000000D6 +:10487000000000000000000800001100000000001F +:1048800000000000008200000000000000000000A6 +:104890000000000000000000000800000000000010 +:1048A0000000000000000082000000000000000086 +:1048B00000000000000000000008000011000000DF +:1048C00000000000000000000000000000000000E8 +:1048D00000800000000440041000000000030000FD +:1048E000000000A10021010000030080004100043D +:1048F0008400000000000021000000000000000013 +:1049000000000000000000000000000000000000A7 +:104910000000000000000000000000000021000076 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:10495000000020040000000141831000000000005E +:10496000000000000002000020840000000400009D +:1049700000010300000000004100000000000000F2 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D0000000000000020040008800881004000869 +:1049E000000810100000900001000000000000000E +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A500000000000000000800000090000000000CD +:104A60000080008000000000000003000000000043 +:104A70000000030000000000000000000000000033 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000020000500080000A9 +:104AE0000000808900000000800900000009000823 +:104AF00000100000000500000000000000000000A1 +:104B000000000000000000000000000000000000A5 +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B500000000000000000000000000000100091B4 +:104B60000000200008820820208804901000100017 +:104B70000800000000000001000400000000000028 +:104B80000000000000000000000000000000000025 +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000002001000C3 +:104BE000000002000240000802081004000020003B +:104BF00000000000000010000000010000000000A4 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C500000000000000000000000000000008000D4 +:104C600000000000A00000000080000000800000A4 +:104C70008000000011000000000000004100000062 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 +:104CE00080000000000000000000008000000000C4 +:104CF000100810001000400000000000000000003C +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D6000000004008400880088001000A0021010D9 +:104D7000020000010020019000000000000000007F +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000003 +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000E00000000000000000E3 +:104DF00000000000000000E000000000000000E0F3 +:104E00000000008200000000000000000000000020 +:104E10000000000000000000000000000000000092 +:104E20000000000000000000000000000000000082 +:104E30000000000000000000000000000000000072 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E6000000000000000B0BCB3BF000000005F5FA6 +:104E70005050F3F3030300000000000000000000A6 +:104E80000000000000000000000000000000000022 +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000000000000000000F2 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE0000000000000000000808C838F00000000A4 +:104EF000F303F303F505F5050000000000000000D2 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000000000000000091 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F600000000000000000000000DFD31F1300005D +:104F700000002830EB3003F303F3000000000000D2 +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000000000000000000000F1 +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000000000000000000000000D1 +:104FE000000000000000000000000000DCD01C10E9 +:104FF0000000000028F3EBF3A0A0AFAF000000001A +:105000000000080000000000000000000000000098 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000000000070 +:105040000000000000000000000000000000000060 +:105050000000000000000000000000000000000050 +:1050600000000000000000000000000000000061DF +:105070003007000D00000000000000C000000061CB +:105080000007000D000100610007000D0000000096 +:105090000000000000000000000000000000000010 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000000000000000000005F +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F +:10517000000000000000000000000000000000002F +:105180000000080000000000000000000000000017 +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000000000000000000BE +:1052F000000000000000000000000000000000416D +:10530000000000000000000000000000200000007D +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000200000005D +:10533000000000000000000000010000000000006C +:10534000000000000000000000000000000020003D +:10535000000000000000000000000002000000004B +:10536000000000000000000000000000000020001D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D +:1053A0000000008400000000000000000000000079 +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000020000BB +:1053F00000000000000000000000000000000000AD +:105400000000020000000000000002030000000095 +:105410000000020000000000000002000000000088 +:105420000041020000000000000000050000000034 +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:1054500000000000000000000000821000100000AA +:105460000000000000000000000000080000000034 +:10547000000000000000000000000000000000002C +:105480000000000080000000000000088000000014 +:105490000000000080000084008400008082000082 +:1054A000000000C0800000000000000800000008AC +:1054B00000000084008400000000000000000000E4 +:1054C00000000000000000080008000800040004BC +:1054D00000080000000000000008000800000008AC +:1054E0000000000000000084000800080000000820 +:1054F0000084000000000000000800080000000414 +:1055000000050000048204000041001100000400B6 +:10551000A0218800040004210021002100040021B2 +:1055200000400002000400200008000800000021E4 +:1055300000008800000000000008000800000008CB +:105540000000000000000040000500000000000016 +:1055500002000000880000000000000000000000C1 +:10556000000000000000000000000000000000003B +:10557000000000000000000010050000000088008E +:10558000000004A00088410421A00082009041088E +:105590000020000800880008000811A000A00001F9 +:1055A00000A0000100020001000100000000000056 +:1055B00000A000000000000000000000000000004B +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E000001000100000000000000000000000009B +:1055F00000000000000000000000000000000000AB +:1056000000000000000000000000820000002000F8 +:1056100000000000000000000000C100A000000029 +:1056200000000004000000000080000000000000F6 +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:105660000000000000040000000000000000000036 +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000C05A +:10569000800000000000000000000000200000006A +:1056A0000000000000820000000000200000000058 +:1056B00000000000000000000000000000000000EA +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F000000000000000001000000000000000009A +:10570000000000000000000000030100820082048D +:1057100020050000000408102121200000210003C2 +:10572000000320009005C00300400004002000207A +:105730000000000000000000000000000000000069 +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 +:105770000000000000000000000000000000000029 +:105780000000000000000000000011A02000000246 +:1057900000A1802000C000018003C00080A0210083 +:1057A00008880000800000000002000100010001E4 +:1057B00000090000000000080008000000000000D0 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000008000000000000A1 +:105800000000000000000000000000000000C005D3 +:105810004008000084410005A00082000802082121 +:105820008804002120210021000400040040000021 +:10583000002000A000210021000000000000000066 +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000008000040 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000008000010 +:105890000000000000000000000000000000000107 +:1058A0000000000100008000000000000001000175 +:1058B00000000001000500000000000000000000E2 +:1058C00000000000000000000000000000000000D8 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000000000000097 +:10591000010200C000A00002001000820110000877 +:105920000002001100880002000800400040001042 +:10593000899000200102909000000000000000000B +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:1059900000001100000011000080008000800280E3 +:1059A0000080000900080305004003800000058016 +:1059B000008089800080108080800000000000004E +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000080040008800000008008529 +:105A200000100000000200C0008900000010008289 +:105A300000840000000200830084808000000000D9 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A9000000000000000000100C0004100000401FF +:105AA00002100288A0020000001100100000000196 +:105AB00000C10011000000000003004190900000B0 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B1000000000000000000004002000000002005F +:105B2000C00008000000100084000200000008000F +:105B3000100010000000020004001000009041C09E +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000080008000000005 +:105BA0001000800080000000840080000900410097 +:105BB0009000800000000000900080000000008045 +:105BC0004180000000000000000000000000000014 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C100000000000000000000000000000108000F4 +:105C20000000000080008080008080800002000072 +:105C300000008000000080000000800000090009D2 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000020002 +:105CA0000400A00002000200100204040890020197 +:105CB000A0002000040020000400C00008009000A4 +:105CC000A000A00040000000000000000000000054 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D2000000000E000000000000000E00000420071 +:105D3000000000E000000000000000E00000420061 +:105D4000008100E007000082000000000000000069 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA0000000FCC0E7E7000000007EF37E3000004A +:105DB0000000BDBDF69000000000FD7CD958000039 +:105DC0000000F6F690909966999900000000000096 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E200000000000FCC024240000000042F34230C7 +:105E3000000000002424F69000000000E564C1404A +:105E4000000000007E187E18FF006666000000005B +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F200000000000000000002D2D66FF00000000B2 +:105F30003437F4F700080000CFCF427E00000000A5 +:105F40000F0F3C3C000000004EC34EFFFFFF00005F +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA000000000000000000000002D2D00990000FE +:105FB00000000407C4C7000000000C0C427E000073 +:105FC000000000FF6666000000004E004E3CFFFF30 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000000000000000A1 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:1060200000000000000000000000000000613007D8 +:10603000000D000000613007000D00000061300716 +:10604000000D000000613007000D00000061303FCE +:10605000004D0000000000000000000000000000F3 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000000000000000000000D0 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000004000000000000000000000000E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B0000000000000008400000000080000000052 +:1062C00000000000000010000000000800090000AD +:1062D00000000009000000000000000200000002B1 +:1062E000000000020002200000000000000000008A +:1062F000000000000000000000020000000000009C +:10630000000000000000000000000003000000008A +:106310000000000000040000000000000000000079 +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000000000000000000000CD +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:10642000000000000000000000000000000000006C +:10643000000000000000000000000000000000005C +:1064400000000000000000000000000200000084C6 +:106450000000000000000000000000000008000034 +:106460000004000000000000000000000000000028 +:1064700000080008000000000008000000000008FC +:1064800000000000000000000000000800000008FC +:106490000000000800820000000000080000000862 +:1064A00000000000000000000000000800000008DC +:1064B00000000004000000000000000400000000D4 +:1064C0000000000000000000040090009021000087 +:1064D00000000008040000000000000800050000A3 +:1064E00000050000000000000000000000000000A7 +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:10651000000000000000000000000000000000007B +:10652000000000000000000000000000000000006B +:10653000000000000000000000000000000000005B +:106540000408000000A000840088000000A003826E +:1065500000000388000000080084000000000084A0 +:1065600000000084000000820000008200000000A3 +:10657000000000000000000000000000000000001B +:10658000000000000000000000000000000000000B +:1065900000000000000000000000000000000000FB +:1065A00000000000000000000000000000000000EB +:1065B00000000000000000000000000000000000DB +:1065C000000000004000000000000000000000008B +:1065D00000000000080000000000000000000000B3 +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A00000000000000000000000000000C000002A +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000800000000B2 +:1066E00000000000000000000000000000000000AA +:1066F000000000080000000800000000000000008A +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000000069 +:106730000000000000000000000000000000000059 +:10674000000000000000000000C000000084050000 +:106750000000110000100000042000000020008450 +:106760000000000000C011000800030000000082CB +:106770000000000000000000080000000000000011 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000080000000000F1 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000100000000000000800000005AC +:1067D0000000000000000021000300000000000095 +:1067E0000000000000000000000200110000000096 +:1067F0000003000000030000000000000000000093 +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000040000000000000000E4 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000076 +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000000D5 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000000000000000000000000095 +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000000000000000043 +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000000000C3 +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000020000000000000000000000072 +:106F00000000000020000000000000000000000061 +:106F10000000000020000000000000000000000051 +:106F20000000000000000000000000000000000061 +:106F3000000000000000000000000000000200004F +:106F4000000000000010000500000000000000002C +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F800000000000000000000000000000040000FD +:106F900000000000000000000000000000040000ED +:106FA00000000000000000000000000000000004DD +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000020000BF +:106FD000100400000000000000000000000000009D +:106FE000000400000000000000000000000000009D +:106FF0000000000000000000000000000000000091 +:10700000000000000000000002000000000000007E +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:10703000000000000200020000000000020000004A +:107040000000000001000000080000000000000037 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000080000000000000000E8 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000008000000000000C8 +:1070C00000000000000002000000000000000000BE +:1070D00000000000000000000008000000000000A8 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:107150000000000000000000000000000000000827 +:10716000000000000000000500000000000000001A +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C0000000000000000000000000000088000037 +:1071D000008400000000000000000000000000002B +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000400000000000000000000000000006A +:10722000000000000000000000000000000000005E +:107230000800000000000000000000000000000046 +:10724000001082100000000000000000000000009C +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000001000000000000000000000000000DE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000080000000000C000040071 +:10735000000000000000000000000000000000210C +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000008002000200000000000100000A5 +:1073900000000000000000100000000000000000DD +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:107450000000000000000000000000000008000024 +:107460000000000800000000000000000000000014 +:1074700000000000000000000000004000000000CC +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E0000000000000000008000000000000000094 +:1074F0000000000005000000000000000000000087 +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:107550000000000000000000084000880002C08415 +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000000000000000BB +:1075D00000000000000000000000008000000080AB +:1075E000800000000000000000000000000000001B +:1075F000000000000000000000000000000000008B +:10760000000000000000000000000000000000007A +:10761000000000000000000000000000000000006A +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000080901A +:1076600080C000800000000000000000000000005A +:10767000000000000000000000000000000000000A +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00000000000000000000000000000000000BA +:1076D000000000000000000000000000000090001A +:1076E00002830203400800000000000000000000C8 +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000000039 +:107750000000000000000000000000000000000029 +:107760001008008884081088000000000000000055 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000008000008000020000000000000097 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:107860000000000080000000000000000000000098 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E00000000000000010008888209004000000C4 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 +:107910000000000000000000000000000000000067 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 +:107950000000000000000000000000000000000027 +:107960000000000000000000000000000000000611 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000000C7 +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000000000000000000A7 +:1079E00000000000000000000000554B004BF3F3C6 +:1079F0000303000000000000000000000000000081 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000000000000000000026 +:107A6000000000000000000000000000FF4BAA4BD7 +:107A7000F505F50500000000000000000000000012 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000000000000C00ACC +:107AF000C0FA82A082F50000000000000000000033 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B7000CF0ACFFAD7A0D7F5000000000000000020 +:107B800000000000000000000000000000000000F5 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF00000000000000000C00000000000000000C5 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000000000000000000B3 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 +:107E20000000000000000000200000000000000032 +:107E30000000000000000000200000000000000022 +:107E400000000000000000008400000000000000AE +:107E50000000000000000004200000000000880076 +:107E6000000000030000000000000000000000000F +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000100F1 +:107E900000080000000000000000000000000000DA +:107EA00000000000000000000002000000000002CE +:107EB00000000000000200020002000200000000BA +:107EC00000000002000000000000000000000000B0 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000002000000000000000080 +:107F00000000000000000000000000000000000071 +:107F10001000000100000000000000000000000050 +:107F2000000000000000000000000000200400002D +:107F30000000004000000000000000000000000001 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F700000000000000000000000020000000000FF +:107F800000000000000000000000000000000000F1 +:107F900010000000000000080000000000000000C9 +:107FA000000000000000000000000000000082014E +:107FB00002000000000000000000000000000000BF +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:1080100000008000000000000001000000000000DF +:1080200000000088000000000000000000000000C8 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000010000000000DF +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:1081000000000000030000000000000000000084E8 +:108110000000000000080000000000002000000037 +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:1081500000000000000000000000C000000000005F +:10816000000000000000000000000000000000000F +:1081700000000000000008000000000000000000F7 +:1081800000000000000000000000000000000000EF +:1081900000000000000000000100000000800180DD +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000000200000000203C +:10822000022000000000000000000000000000002C +:10823000000000000000002000000000000000001E +:10824000000000000000000000000000000000002E +:108250000000000000000000080000000000000016 +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:10829000000000002000000090000000000000002E +:1082A00000000000000000000000000800000000C6 +:1082B00000000000000000000001000000000000BD +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:108300000000000000000000000000000000050860 +:1083100000000888210000000000000000000000AC +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000800E5 +:1083900000000000000000000000000000000000DD +:1083A00000030000000000000005000000090000BC +:1083B0000021000000000000030003004100030052 +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:108410000000000000000000000000000500000057 +:108420000000000000000500000000000000000047 +:108430000500000000000000000000C000912000C6 +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A000000000000100900000000000000000003B +:1084B00000000000000000000000000000830091A8 +:1084C00000050000000000000000000000000000A7 +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:108520000000000000001100802100000000000099 +:10853000000000000000000000000000000011002A +:10854000A1004000C09100000000000000000000F9 +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000009008011400000F1 +:1085B00000000000000000000000000000000000BB +:1085C000004083000000C091000000000000000097 +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:108620000000000000000000000000000002010146 +:1086300000880000000000000000000000000000B2 +:10864000000000000000009100C0000000000000D9 +:10865000000000000000000000000000000000001A +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000001009088B1 +:1086B00002000900000000000000000000000000AF +:1086C000000000000000000041A100800000000048 +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000410008 +:108730000080800908000000000000000000000028 +:10874000000000000000A1118320030005110000BB +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B0000011110000800000000000000000000017 +:1087C0000000000000000000C14120000000000186 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:1088300000000001010000400000000000000000F6 +:1088400000000000000000000000000000E0070041 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000E007008200000000004F +:1088C000000000000000000000000000FF000000A9 +:1088D000FF00000000000000000000000000000099 +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:10893000000000000000000000000000F0F0000057 +:108940000000000000000000000000000000FF0028 +:108950000000FF0000000000000000000000000018 +:108960000000000000000000000000000000000007 +:1089700000000000000000000000000000000000F7 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B0000000000000000000000000000000F0F0D7 +:1089C00000000000000000000000000000000000A7 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 +:108A10000000000000000000000000000000000056 +:108A20000000000000000000000000000000000046 +:108A30000000000000000000000000000000000036 +:108A40000000000000000000000000000000000026 +:108A50000000000000FFFFFFF0F000000000000039 +:108A60000000000000000000000000000000000006 +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000066660000EA +:108AC000FFFF0000000000000000000000000000A8 +:108AD00000000000000000FFFFFFF0F000000000B9 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000666669 +:108B40000000000000000000000000000000000025 +:108B500000000000000003E3030E0C0982C00000C7 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC00005002A06054C00A8000000000000000077 +:108BD00000000000000000000000000055005500EB +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C400000000000FF0000FF000000000000000026 +:108C5000000000000000000000004000000055007F +:108C600055000000000000000000000000000000AF +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC000000000000000FF0000FF000000000000A6 +:108CD0000000000000000000000000000000000094 +:108CE0005555551500000000000000000000000070 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000FF0000FF0000000025 +:108D5000000000000000000000000000000000F023 +:108D600000005555555500000000000000000000AF +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000FF0000FF0000A5 +:108DD0000000000000000000000000000000000093 +:108DE000000000000000020000000000000002007F +:108DF000000000000000020000000000000002006F +:108E00000000000000000200000000000000200040 +:108E1000000000000004200000000000000020000E +:108E2000000200000000000420000000000000001C +:108E300020000000000000042000000000000000EE +:108E400020000000000000002000000000000000E2 +:108E500020000000000000002004000000000000CE +:108E6000200000000002000200000002000000904C +:108E7000109000000002000200000000000000004E +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000200000000000000000000A0 +:108ED0000000000000020000000000000000000090 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F000000008200000000000000000000000000DF +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000020000000100010000000900000014 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000020000000C1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC0000000000000000000080008000000C000D1 +:108FD000040000000000000000000000000040004D +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000880000000000400000000000010057 +:10905000000000000000000001000000000000000F +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000004000000AC +:1090C0000000000000002000000000000000000080 +:1090D000040000C0000000000000040000000000C8 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F +:10912000000000000000000000000000000000003F +:109130000000000000000000000000040004000027 +:10914000000000000000000000000000000000001F +:10915000000000000080000000000000000000008F +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F +:1091D000000000000000000400000000000000008B +:1091E000000000000000000000000000000000007F +:1091F000000000000000000000000000000000006F +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E +:10924000000000000000000090000000200000006E +:1092500090000000880000000000010000000020D5 +:1092600000000000000000000000000000000000FE +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE +:1092900000000000000000000000000000000000CE +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000200000000000C000000284000028 +:1092E00000010084000000000000000000000000F9 +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:10931000000000000000000000000000000000004D +:10932000000000000000000000000000000000003D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:109350008400C00000000180018001800100000045 +:1093600000090000000000020000000900020000E7 +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000009D +:1093D0000000000000000000202004040404040039 +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000C000000000A0000D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000000000000004C +:10942000000000000000000000000000000000003C +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000001120888820406B +:109460009088000090000000000000000000000054 +:10947000000000000000000000000080000000006C +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC +:1094A00000000000000000000000000000000000BC +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000110000007B +:1094E00008808000110080000000000000000000E3 +:1094F000000000000000000000000000000000006C +:10950000800080000000000000000000000000005B +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:1095500000000000000000000000000000002003E8 +:1095600009919103108000000080000000000000BD +:109570000000000000000000000000000000A0004B +:1095800082000400C0000000000000000000000095 +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C000000000000000000000000000000000009B +:1095D000000000000000000000000000000000008B +:1095E00090000005A18801C0000000200000008854 +:1095F000000000000000000000000000000000006B +:10960000000000A0000000C00000000000000000FA +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000000000003A +:10963000000000000000000000000000000000002A +:10964000000000000000000000000000000000001A +:10965000000000000000000000000000000000000A +:109660000000912004880890029101000088080001 +:1096700000000000000000000000000000000000EA +:10968000000000000000000000800000000000005A +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000000000000000000000000000000000AA +:1096C000000000000000000000000000000000009A +:1096D000000000000000000000000000000000008A +:1096E00000000000A000801000108885410000806C +:1096F00080000000000000000000000000000000EA +:109700000000000080020000008000000000000057 +:109710000000000000000000000000000000000049 +:109720000000000000000000000000000000000039 +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:109750000000000000000000000000000000000009 +:109760000000000000000088802180210008001116 +:109770000000008000000000000000000000000069 +:10978000000000000000C00100A000400000000038 +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000000000000000000000000099 +:1097D0000000000000000000000000000000000089 +:1097E000000000000000000088C0901004118801F3 +:1097F0000001000000400000000000000000000028 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 +:109830000000000000000000000000000000000028 +:109840000000000000000000000000000000000018 +:109850000000000000000000000000000000000008 +:1098600000000000000000000000000000E0070011 +:1098700082210000000007008200000000000000BC +:10988000000000000000000000000000FFFF0000DA +:10989000F0F00000000000000000000000000000E8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000000000000000000000000098 +:1098D0000000000000000000000000000000000088 +:1098E000000000000000000000000000F777F373A4 +:1098F000FF3DCF3D00000000F0F000000000000040 +:109900000000000000000000000000000000FFFF59 +:109910000000000000000000000000000000000047 +:109920000000000000000000000000000000000037 +:109930000000000000000000000000000000000027 +:109940000000000000000000000000000000000017 +:109950000000000000000000000000000000000007 +:109960000000000000000000000000000000FF7F79 +:10997000FB7BFFFDCFFD00000000F0F000000000C9 +:109980000000000000000000000000000000FFFFD9 +:1099900000000000140000000000000000000000B3 +:1099A00000000000000000000000000000000000B7 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000000000000000000000000000097 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F000FCFFC3EB14FF14FF000000000000FFFF9A +:109A00000000000000000000000000000000000056 +:109A1000FFFF000004000000000000000000000044 +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A70000000FCFFFFEB0000000000000000000001 +:109A800000000000000000000000000000000000D6 +:109A900000000082000000008A00000000000000BA +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000005610A0F050D00A005000A0026 +:109B0000054000A800000000000000000000000068 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B30000000000000000000000000000000000025 +:109B40000000000000000000000000000000000015 +:109B50000000000000000000000000000000000005 +:109B600000000000000000000000000000000000F5 +:109B70000000000000000000000000FF00A0000046 +:109B800000000000000000000000000000000000D5 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 +:109BC0000000000000000000000000000000000095 +:109BD0000000000000000000000000000000000085 +:109BE0000000000000000000000000000000000075 +:109BF00000000000000000000000000000FF00A0C6 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000007F6BFA +:109C80007F6B0000000000000000000000000000EA +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D0000FFFF7D7D0000000000000000000000005B +:109D100000000000000000000000000000008800BB +:109D2000000000000000000000000400000020000F +:109D300000000400000000000000200000002000DF +:109D40000000000000800000008020800000200053 +:109D500000002000000000000000200000030000C0 +:109D600020000004000000000000000020000000AF +:109D70002000000020000000000000002000000083 +:109D80002000000000000000000000002000000093 +:109D90002000000020000000000000002000000063 +:109DA0000000000000000040000000000002004031 +:109DB00000000002000000000000000000000000A1 +:109DC0000000000400000008000000080008000077 +:109DD0000000000000000000000000000000000083 +:109DE000000400000000000000000000000000006F +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000010000000000002 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000100100050005000500000000000000B2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB000000000000000000000000400000000009E +:109EC0000000000000000000000000008000000012 +:109ED0000000000000000000000000000000000082 +:109EE0000000000000000000000000000000000072 +:109EF000000000000000000000000000000800005A +:109F0000000000002008A000A000A00000840000C5 +:109F100000000000090000000000000000840000B4 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F500000000000000000000000000000210000E0 +:109F600000000000000000000000000000000008E9 +:109F700000000000000000000000000000000000E1 +:109F80000000000000000000000000000080000051 +:109F90000000000000002000000800110000004048 +:109FA00000000000010000000000000000000000B0 +:109FB00000000000000000000000000000000000A1 +:109FC0000000000000000000000000000000000091 +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000020000000000041 +:10A000000400000011000000000400000000000433 +:10A01000000000200002000000000000000000001E +:10A02000000100000000040000000000000000002B +:10A030000000000000000000000000000000000020 +:10A040000000000000000000000000000000000010 +:10A0500000000000000001000000000000000000FF +:10A0600000000000000000000000000000000000F0 +:10A0700000000000000000000000000000000000E0 +:10A08000000000000000000000000400000000804C +:10A0900000000000000000000000000000000000C0 +:10A0A00000000000000000000000000000000000B0 +:10A0B00000000000000000000000000000000000A0 +:10A0C0000000000000000000000000000000000090 +:10A0D0000000000000000000200000000000000060 +:10A0E0000000000000000000000000000000000070 +:10A0F0000000000000000000000000000000000060 +:10A1000000000000000000000000000080000000CF +:10A11000002000000000000000000000000000001F +:10A12000000000000000000000000000000000002F +:10A13000000000000000000000000000000000001F +:10A14000000000000000000000000000000000000F +:10A1500000000000000000000000000000000000FF +:10A1600000030000000000030000000000000008E1 +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000400000000000100CA +:10A19000008001000100002000110000000000000C +:10A1A000000000000000000000000020000000008F +:10A1B000000000000000000000000000000000009F +:10A1C000000000000000000000000000000000008F +:10A1D000000000000000000000000000000000007F +:10A1E000000000000000000000000000000000006F +:10A1F000000000000000000000000000000000005F +:10A20000000000000000002000000000000004909A +:10A2100020200404202004000000000000000008AA +:10A22000000000000000000000000000000100002D +:10A23000000000000000000000000000000000001E +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000050000000000000008000000000000E1 +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000800000000B6 +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000000000000000008E +:10A2D000000000000000000000000000000000007E +:10A2E000000000000000000000000000000000006E +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000000000002D +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000001000000FC +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A390000000000000000202012020100000000068 +:10A3A00000000000000000000000000000000000AD +:10A3B000900000000000000000000000000000000D +:10A3C000000000000000000000000000000000008D +:10A3D000000000000000000000000000000011006C +:10A3E000002100000000000000000000000000004C +:10A3F000000000000000000000000000000000005D +:10A40000000000000000000000000000000000004C +:10A4100000000000000000008389410802A0001035 +:10A42000000000000000000000000000000000002C +:10A43000110080000000000000000000000000008B +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000090000111000000000000000000000C2 +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A49000000000000000000000001000A0212000CB +:10A4A000110000000000000000000000000000009B +:10A4B000000000000080000000000000000000001C +:10A4C000000000000000000000000000000000008C +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000010000000000000000006B +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A5100000000000000000000000000005A0210075 +:10A52000100000000000000000000000000000001B +:10A530000000000000000020000000880000000073 +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB +:10A5600000000000000020000001000000000000CA +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000004090EB +:10A5A0000110C01110C000000000000000000000F9 +:10A5B000000000000000010000880800000000000A +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000000000000000000007B +:10A5E00000000000000000008000000811000000D2 +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000000000000000004A +:10A61000000000000000000000000000000000003A +:10A620008009409000A00000000000000000000031 +:10A6300000000000000000004100008080000000D9 +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000000000000FA +:10A6600000000000000000000002110000000000D7 +:10A6700000000000000000000000000000000000DA +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A000000009A0A082410010000000000000008E +:10A6B0000000000000000000000000110000008009 +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000000000000000000007A +:10A6E0000000000000000000000000000100000069 +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A720000000000008081010A08890000000000041 +:10A730000000000000000000000000000001000018 +:10A7400000400000000000000000000000000000C9 +:10A7500000000000000000000000000000000000F9 +:10A76000000000000000000000000000000000E009 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A000000000000000000000E007004100000081 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000070082000000000000000000000000 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000FFF000F03F3639306B +:10A830000000000000000000000000000000000018 +:10A84000000000000000F0F0000000000000000028 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000FF3C003C3F36BC +:10A8B000393000000000000000000000000000002F +:10A8C0000000000000000000F0F0000000000000A8 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A0000000000000000000000000000000606FD8 +:10A9B000F0FF6EFE6EFE00000000000000000000D0 +:10A9C00000000000000000000000FFFF0000000089 +:10A9D0000000000000000000000000000000000077 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA3000606F000F089808980000000000000000F8 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 +:10AA7000000000000000000000000006000C0000C4 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB000000000610009000100000000000000002B +:10AAC0000000000000000000000005000A00054032 +:10AAD00000A80000000000000000000000000000CE +:10AAE0000000000000000000000000000000000066 +:10AAF000000000000000000000000000FF0000FF58 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB3000000000000F0F553C7CFE7CFE0000000072 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB70000000000000000000000000000000FF00D6 +:10AB800000FF0000000000000000000000000000C6 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000F0F553C40C240C20000E2 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC0000FF0000FF00000000000000000000000046 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000FF0035353C3C3C3CBB +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC80000000FF0000FF00000000000000000000C6 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB00000000000000000000000FF00353500F03B +:10ACC000FFF0000000000000000000000000000095 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000200000000000000000000000000044 +:10ACF0000000000000002000000000000000000034 +:10AD00000000200000000000000000000000000023 +:10AD1000040000000000200000000002000000000D +:10AD200000080000200000000000000000000000FB +:10AD300000042000000000002000000000000000CF +:10AD40000040400020000000000000000000000063 +:10AD500000002000000090002000C0000000000063 +:10AD600000000000000000000002000200000000DF +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000200000000000000000000000091 +:10ADC000000200022100000000000000000000005E +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000200000051 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE2000000000000000000002000200820082001A +:10AE3000020000000000000000000000020000000E +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000110E1 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB000000000000000000000000008000000008A +:10AEC000000000000000000400000000000000007E +:10AED000000004000400000004000408000000005A +:10AEE000080000000000000000000000000000005A +:10AEF0004000020000000000000000000000000010 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF4000000004000000C00090004000400000002D +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF9000000000000000008200000000000000002F +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000002071 +:10AFC000040040000000000000000000000000003D +:10AFD0000040004000400000000000080040000069 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B060000000002000200020000000000000000080 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E000000000000001000100010000000000005D +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B120000000000800000000000000000000000017 +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000400000000000000FB +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B19000000000000000000000000084000000002B +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C0000000000000000000000000C000000000BF +:10B1D0000000000040040000020000000200000027 +:10B1E00000002000000000000000000000840000BB +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000002000000000000000000001C +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B26000000000000000000000800000000000005E +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000020000000003E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B36000000000000000000000000000000090004D +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F00080000000000000000000000000000000CD +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B47000000000000000800000000000000000004C +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000010001008900082080000000000000A +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B57000000000000100000040000000000000008A +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F00000000000000010000000800000000000BB +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000008000800000000BA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F0000000000000000000000000010011002018 +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800007000000000000000000000000000000B2 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B90000000000000000CCFCCFFF000000000000A1 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B980000000000000000000EFEFEFEF00000000FB +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA000000000000000005000A08050000A000007A +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000200000022 +:10BC20000000000000000000000000000000000014 +:10BC300000000000000000000000000020000000E4 +:10BC400000000000000000000000000400000000F0 +:10BC50000000000000000001400000000000200083 +:10BC600000000000000000000002000000080000CA +:10BC70000000000000000000200000000000200084 +:10BC800000000000000000000000000000000000B4 +:10BC90000000000000000000000010000002000092 +:10BCA00000000090000000000002004000020002BE +:10BCB0000000000000000002000000000000000082 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000030000000150 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD100000000000000000004000000000000000E3 +:10BD20000000000000000000000000800000000093 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000001000000200C1 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000020000000000000000000000B1 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000040000053 +:10BDB0000000000000000000000000000000000083 +:10BDC000000000000400000000000000000000006F +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE100000000000000000000004000040000000DE +:10BE200000000000002000000000000000000000F2 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE80000000400000000002000000000000000070 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF100000000000000000001000000000400000D1 +:10BF2000000400000000000000000000000000000D +:10BF30000000000000000000010000000000000000 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000030000000000000008000000000000A6 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB000000000000000000000000400000000007D +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000040004000000000018 +:10C020000000000000000000000000000000000010 +:10C0300000000000000000000000002000000000E0 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000400000000AC +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B000000000000000000000000000000100007F +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C100000000000000000000000000000000000827 +:10C11000000000000000000000000000000000001F +:10C1200000000000208800840900000000000000DA +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000004000000000000000000000000008B +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C2000000000000000000000008008200000000A4 +:10C21000000000000000000000000000000004001A +:10C22000000000000000000000900000210000005D +:10C2300000000000000000000000000000000000FE +:10C240009000000000080000000000000000000056 +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000010001000000000000000000000000AC +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C00011008000000000000000000000000000DD +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C3000000000041000800000002000000000000E2 +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000008000000080000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C0000000000000000020000000C0000000008D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000001000088880001000000DA +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C00000000000000000004100008000000900A2 +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000010001B +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C54000000000000000000000000011000000805A +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000100006A +:10C5D000004000000000000000000000000000001B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C650000000070082210000000000000000000030 +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000F0F000000000000000007A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C750000000000000000000F0F0000000000000F9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C850000000000000003C3C0000FFFF0000000062 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D00000000000000000003C3C000000000000E0 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C950000000000000000000000005002A00054063 +:10C9600000A800000000000000000000000000001F +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000061000630 +:10C9A000000D00000000000000000000000000007A +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000C3FF00FF0000000000000000000044 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA00000000000C3FFFFFF0000000000000000C5 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000200000000000000000000000033 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000020000000000000000000012 +:10CC20000000000000000000000000000000000004 +:10CC3000000000000000008000000008000010005C +:10CC40000000000000000080000000080000C0405C +:10CC50000040004000400000000200900000000280 +:10CC600000000002000000000090009000000000A2 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000040000000000000100034 +:10CCB000000000000000000200020000000100006F +:10CCC0000000000000000000000200000001000061 +:10CCD000410100010001000100000000000000000F +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD30000000000000000100000000400000004072 +:10CD4000004000000080008000900200020002000D +:10CD50000200000020002000200000000000000071 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000008000000000000AB +:10CD800000000000000000000000000000000000A3 +:10CD9000000000000000000000040000000000008F +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000020000000001000070 +:10CDC000000102010000404000400040800080005F +:10CDD000800080001100C100830880000000000076 +:10CDE0000000000000000000000040000000000003 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE30000000000000000005000990000000000054 +:10CE40000000000840000400000300000000002172 +:10CE50000000002100000000900800009000000089 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB000000000000000000000000000000800006A +:10CEC000000000000000000000000000000000085A +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF00000000000000000000000000000000040F2 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF3000000000000000002100000100000000408F +:10CF400000800000004000400040000000000000A1 +:10CF500000000000000000000000210000000000B0 +:10CF600000040000000000000000000000000000BD +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA00000000000000000000000000000A000A041 +:10CFB0000000000800004100000000002000000008 +:10CFC000000000400000008300010001000000009C +:10CFD000000000000000000000000000A0000000B1 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000200000000000200000020000000CC +:10D04000200000000000002100000000000400405B +:10D0500090000000000000210000002000000000FF +:10D060009000000020000000000000000000000010 +:10D07000000000000000000000000000008400002C +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B00000000000000000000000000000A00000D0 +:10D0C00000008000000000000000000000000000E0 +:10D0D000000100000000000000000000000000004F +:10D0E00000000000110480000000000000020000A9 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000200000000000000001D +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000800000000000000000000E7 +:10D1400000000080018001800080010800000005CF +:10D150000000010000A10105010000210000000500 +:10D1600090000000200020050000000000000000EA +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A00000000000000000000000000000000084FB +:10D1B000000000000000050000080500000000005D +:10D1C0000000000000402040204000040200000059 +:10D1D0000000000002000040020002000000000009 +:10D1E00000000000000080008090000000000000AF +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000041C089020109900188C16E +:10D2500000080008908800C000200008900088C1E5 +:10D2600000000008900800C0842100089000000021 +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C0000000000000000000918908114089004022 +:10D2D00000C10010008200000080000000800000FB +:10D2E00000C100000082001000A009081091001089 +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D340000000000000000000000009800021901192 +:10D3500083000000001000008000800000108000AA +:10D3600080008000000200008000A0004104110441 +:10D370008803000000000000000000000000000022 +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C00000000000000000000000000091020000CA +:10D3D0000801C100900002010000C0000800000127 +:10D3E0008400C020100002000000C00008200000DF +:10D3F0002001C0010000000000000000000000004B +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D440000000000000000000000000000000880054 +:10D450000111000903C002020000000800C0080812 +:10D460000088000802C002020000000882C008080C +:10D470000040830982C1000000000000000000009D +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D00000091089108891900000090000800080E8 +:10D4E000808000000080808000001000008080802C +:10D4F00080A00091408880840000000000000000AF +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000980889083800941800280008080DB +:10D56000000080008080808000008008800880802B +:10D5700000008809910280808908000000000000F6 +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000001008111109840101C00020881A +:10D5E00008082000C00010C008088800C00020887B +:10D5F00008088800C10020A10808040100000000FC +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D65000000000000000000000E0000000060000E4 +:10D660000000000000000000000000004100000079 +:10D67000000000000000000000E0000000000000CA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D00000000000000000000F0F0F00FFFF0F050B +:10D6E000FFFFCF00FFFFD714FFFF0FC3FFFFCF0CDB +:10D6F000FFFFC3C3FFFFC341FFFFCF00FFFFC30313 +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000FFFFFF00FFFFCE +:10D76000FFF5FFFFCFFFFFFFD7D7FFFFFFC3FFFF8F +:10D77000CFCFFFFFFF0FFFFFFF7DFFFFCFFFFFFFBB +:10D78000FF3F00000000000000000000000000005B +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D00000000000000000000000000000FAFFFF51 +:10D7E00041EBFFFFC3C3FFFFCACAFFFFAAAAFFFFA7 +:10D7F00028EBFFFFAAAAFFFFCACAFFFF00FFFFFF37 +:10D8000082BEFFFF000000000000000000000000DA +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D850000000000000000000000000000000FFFACF +:10D86000FFFFEBEBFFFFF0FFFFFFFAFAFFFFF0FF18 +:10D87000FFFFEBEBFFFFF3F3FFFFFAFAFFFFFAFA0C +:10D88000FFFFC3FFFFFF00000000000000000000DA +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E000406380010021920240E38006002D9202F5 +:10D8F000408280000020920240E38006002D9202C8 +:10D9000040E38001002192020000000000000000BE +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D96000000055550F3C00C33CFF000000000000C4 +:10D9700000000000000000000000000000000000A7 +:10D980000000FF7D007D03F30FFF0000000000009A +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000055550F3CC0C0FCFC00000000CA +:10D9F0000000000000000000000000000000000027 +:10DA000000000000FF28002800F00CFC00000000CF +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA6000000000000000FF00151500FF00FFFAFA9B +:10DA7000F0FF000000000000000000000000F3F3D1 +:10DA8000FAFA00000000FFF03F30B200B2FF0000E1 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000FF0017173C3CAAAA3D +:10DAF000FAFAF0FF00000000000000000000000043 +:10DB0000F3F3FAFA000000000F003F30B200B2FF5A +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB50000002040040000404040000000000000073 +:10DB60000000000000000000000000800000100025 +:10DB70000000840000001000000000000000000011 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000001000000000000000000075 +:10DBA0000002000000000040000000000000000033 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000400000000000000000000000000015 +:10DBD0000000000080008000800080000000000045 +:10DBE0000000000000000000000000A00002000093 +:10DBF0008090000000C0000000C041000082008250 +:10DC00000000100000000000000000000000000004 +:10DC100011000000000000000000000000000000F3 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000040A4 +:10DC400000000000000000000000000000000000D4 +:10DC5000000008000000010000004000400000003B +:10DC600000000000000000000000000000000000B4 +:10DC70002100080821000000000000004000000012 +:10DC8000010004000400000000000000000000008B +:10DC90000000200000000000000000000000000064 +:10DCA000000000000000000200020000000000046C +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000040050 +:10DCD0000000000000000000400000008000800004 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000880080018800000000000000800013 +:10DD000000004004800080000000000000000000CF +:10DD10000000000000000000000000000000000003 +:10DD2000000000009000000000000000000004005F +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000001000000C2 +:10DD600001000000000000000000000000000000B2 +:10DD700000210000004100880000000004000400B1 +:10DD80000011000200000008000000080008000068 +:10DD90000000000800000000000300000000000078 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000200023 +:10DDE0000000200000000000000000000000000013 +:10DDF000000000000000000000210000048203A0D9 +:10DE00000008088400A000000000000021000300BA +:10DE10004100000000000008080811000000000098 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE50000000000000000000000000000000004181 +:10DE6000040500000000C0000000000000000000E9 +:10DE700082001000100041000000C10000002000DE +:10DE80000200020000090000000000000000000085 +:10DE9000000000000000A0000000000000004100A1 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE00000008000000000000000000000000000B2 +:10DEF0000000000000000000C00000002000000042 +:10DF0000800000000004000000000000000000008D +:10DF100000000000000000000000000000000900F8 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF50000000000000000000000090000000000031 +:10DF600000000000040000040000900200210021D5 +:10DF70000002000000000000C00083000580018056 +:10DF800001800000082100040004008084800080DB +:10DF9000A08300090000000800000000000000004D +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000100000000000030 +:10DFF0000000000000000000000000000400840495 +:10E0000020082020400400040305030121200020F3 +:10E0100021200020009000041188000000C00002B0 +:10E020002188000200000000000000000000000045 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000009A7 +:10E07000000800090011000000000000000004007A +:10E0800000000000000008210004088802058280CA +:10E09000000000000021820000008200000000005B +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000800000000000000000000001000400008A +:10E1100000200000000005000000000000000000DA +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E160000000000000000000000011059110900068 +:10E17000000500000000000000000000000000009A +:10E180000000A0C1088800908291010000004100B9 +:10E1900000004040909000A000000000000000003F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000910883080B +:10E1F00008410008000000000000000000000000CE +:10E200000000000009419121100280C0110020008F +:10E2100084000000400080000000000000000000BA +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E26000000000000000000000000000000011900D +:10E2700008049090108300000000000000000000DF +:10E280000000000000004100020000401180004139 +:10E290000000000200000080002000800003000059 +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000204000940C19100000000000000007D +:10E3000000000000000000004004A0108801880800 +:10E310000001000000000000400210010040C001A8 +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E3700000000804101191111011000000000000AD +:10E380000000000000000000000010400188119112 +:10E390008802000110000000000010100020002082 +:10E3A00002A00000000000000000000000000000CB +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000008008A1109088829100000000B9 +:10E400000000000000000000000000008802412120 +:10E4100084400089000200210003092000000080E0 +:10E42000000080000000000000000000000000006C +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E4700000000000000088911109200083030000C3 +:10E48000000000000000000000000000000010A1DB +:10E490000902418010110005000000000000000882 +:10E4A000101100000000000000000000000000004B +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F00000000000000000001041050400100800AA +:10E50000000000000000000000000000000000000B +:10E5100000A1009100900000000000000000000039 +:10E520001001408800901000000000000000000072 +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E5700000000000000000000000000000E00700B4 +:10E58000000000000000000000000000000000008B +:10E590000000000000E007004200000000E0000072 +:10E5A0004100000000000700000000000000000023 +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000FFFF00001D +:10E600007272F33000000000000000000000000003 +:10E6100000000000000000003DCFFDCF0000000022 +:10E62000000000003C3CFF99F3B172300000000094 +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E670000000000000000000000000000000663CF8 +:10E68000663C7272F33000000000000000000000E1 +:10E69000000000000000000000003DFFFDFF000042 +:10E6A0000000000000003C3C6600F3B17230000046 +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E7800000007E7E00FF0F6F9FFF00000000000072 +:10E7900000000000000000000000FF97F697FDBD9C +:10E7A000FDA5000000000000000000FF00FF36365D +:10E7B000F6F600000000000000000000000000006D +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E8000000000000181800FF006090F000000000F9 +:10E81000000000000000000000000000FFF7F6F715 +:10E82000FDFFFDE700000000000000000F0F66661E +:10E830000606C6C600000000000000000000000040 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000061000F000D000000000B +:10E890000000000000000000000000000000056112 +:10E8A0000A0D050100A000610007000D00000061D5 +:10E8B000000E000D0000000000000000000000003D +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E9000000000000000000003C3FFBFBFB7BF373BA +:10E9100000000000000000000000000000000000F7 +:10E920007F7C4340C0C3FCFF00000000C3FF0FFF1B +:10E93000005500550000000000000000000000002D +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E9800000000000000000000000FCFFFBFBFF7F18 +:10E99000F777000000000000000000000000000009 +:10E9A00000007F7C434000033C3F00000000FFFF6D +:10E9B000FF555555555500000000000000000000AF +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA0000000000000000000000000000FFC3F0FF55 +:10EA1000AFEFAFE5000000000000000000000000C4 +:10EA2000000000003F0FFFFF0A0AFAFA0000000092 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000FFFF88 +:10EA9000AAFFFFEFFFE500000000000000000000FB +:10EAA0000000000000003F0F14140C0CFCFC0000E0 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD000840084000400000020000000000000000A +:10EAE0002000000000000000000000000000000006 +:10EAF00000000000000000002000000000000000F6 +:10EB000020000000000000000000000000000002E3 +:10EB10000000200020002000000020000000000471 +:10EB20000000200000000000000090080000C0006D +:10EB300000050080848000004000200004000000E8 +:10EB40000000200000000000000004000000400061 +:10EB50000000000000000000000000000040000471 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB900000004000800080008000000000000000B5 +:10EBA0000000000000000084000000021008009037 +:10EBB00000000000004000400000000000000000D5 +:10EBC0000000000000000000000000000000000045 +:10EBD00000000000000000000000840000000000B1 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC000000040000000000080000000000000000F8 +:10EC100000040000000000000000000000000000F0 +:10EC200000000000001000000008000000000008C4 +:10EC30000000021000400000000000400000000042 +:10EC400000080000000800000000040000000000B0 +:10EC5000000082000000000000000000040000002E +:10EC60000008000000000004000000000004000490 +:10EC7000000000080000000000000000000000008C +:10EC80000004000000000000000000000000000080 +:10EC9000000000080000000000000000000000006C +:10ECA00000000000000800000000008400000000D8 +:10ECB000000000008008000100C00000000100000A +:10ECC0000002000200840084000000100008000020 +:10ECD0000002000000100000000000009000000092 +:10ECE0000000000004000000000090009000000000 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000300000008D8 +:10ED300000030000004100000000A00000080500E2 +:10ED40000400000000000000000304080405400067 +:10ED5000000000000000100900000000000000009A +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000001100000000000000000062 +:10EDA00000A000A00008000800000084000000008F +:10EDB0000008000040000000110000A008A00800AA +:10EDC00020880000008200000000001000A0000069 +:10EDD000000800000800000008000000000000001B +:10EDE000000000000000000800000000000000001B +:10EDF0000000000000000000000000000000000013 +:10EE000000000000000000000008000000000000FA +:10EE100000000000000000030000000000000000EF +:10EE2000000000000040004000000000000800005A +:10EE300000080000000000000004000000800080C6 +:10EE40000100000000008800000000000000000039 +:10EE50000000C000000000000000000000000000F2 +:10EE600000000000000000000000000000000000A2 +:10EE7000000000000000000000000000000008008A +:10EE80000800080000000000000000000000000072 +:10EE90000000000000000000000000000000000072 +:10EEA00000000000000000000000008400000000DE +:10EEB0000000000000100000000002000000000838 +:10EEC0000004200000000000000800000000001006 +:10EED000000800000000000000000000000000002A +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF20000080004001000080000000000008000098 +:10EF300000000000880000080003900000000000AE +:10EF40000000000800000840040000000000000865 +:10EF50000003000000000000000008110400080881 +:10EF60000000000000000000000000000008000099 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF900000000000000000000000008400000000ED +:10EFA00000000904400420000004000000000000EC +:10EFB0000000000000000000000000024000008887 +:10EFC000008400000000000000200200002041201A +:10EFD00004004000000800200020000000000000A5 +:10EFE000000400000000000000000000000000001D +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000040000000000030008D1 +:10F030000021000000000000001000000003840018 +:10F040000000000000000008000000910000000027 +:10F050000009000000000000000000000000820025 +:10F060000003100000000000000005000000000088 +:10F070000000000000000000000000000000000090 +:10F080000000020400000000050005000000000070 +:10F09000000005000000000000000000000000006B +:10F0A0000000000000000000000900000000000057 +:10F0B0000000020002000040000000040000000008 +:10F0C0000000200000004000200020002020000060 +:10F0D00000000000000000000000008200000000AE +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000080000000000D7 +:10F1300000000000000000000000000000000000CF +:10F140000020001000880010010000900000000066 +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A00000000000000000000000000080000900D6 +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000801100218000000D +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000090000D5 +:10F2300000030000000000000000000000000000CB +:10F2400000000000000000030000000000030900AF +:10F2500000090000000000000000000000000000A5 +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000010000000000000000000000004D +:10F2C000000000000000000000090010002088007D +:10F2D0000108000000020000000000000000000023 +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000200000000000000000000000000CB +:10F34000000000000000000002000000000020009B +:10F350000000880082900100000000000000000012 +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000011000000000000003C +:10F3C00000000000000000000000800000000000BD +:10F3D00000001100000080804100000000000000DB +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F44000000000000000000000000000000080003C +:10F45000000000000011801000000000000000000B +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000010002C +:10F4D00008008800900000012000000000000000EB +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F530000000000000000000000000E000000000EB +:10F5400000000000000000000000000000000000BB +:10F550000000000000000000000000E00700008242 +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D0000000000000000000000000FF000000FF2D +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F650000000000000003A000000000000FF000071 +:10F6600000FF00000000000000000000000000009B +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D0000000000000000082008000000000000028 +:10F6E000FF0000003C3C00000000000000000000A3 +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000002000000000000A7 +:10F760000000FF0000003C3C000000000000000022 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C000000000610007000D0000000000000000C4 +:10F7D00000000000000000000000000030000000F9 +:10F7E000000015602A06054C00A80000000000007B +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000FFFF0000000000009A +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F9500000000000000000000000000000000000A7 +:10F96000000000000000000000000000F0F00000B7 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000F0F037 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000200000000000D6 +:10FA10000000000000000000000020000000008046 +:10FA20000080000000000000000020000000000036 +:10FA300000000002000000000000200000000000A4 +:10FA40000000000000000000000000032000000093 +:10FA50000100010000000000000000000480000020 +:10FA600000400000400000000000000020000000F6 +:10FA70000000000000000000000004000000000082 +:10FA8000000000002000001000000000000800003E +:10FA90000008400200000000000000000008000014 +:10FAA000004000400000000000000008400000008E +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD000000004000400000000000000000000100E +:10FAE0000000000100000000000000000000000015 +:10FAF0000000000000000000000000000000000006 +:10FB00000000000000000000000000000000A00550 +:10FB100000000000000000000000000000000040A5 +:10FB200000000000000000000000000001000008CC +:10FB300000000008000500000000000000000000B8 +:10FB400000000000000000040000000000080000A9 +:10FB5000010000000000000000000008000000009C +:10FB60000000000000000008000000000000000489 +:10FB70000400000004210400020004000000000052 +:10FB800000000000000800000080040000000004E5 +:10FB9000008400000008000800000000008400004D +:10FBA000200100000008000800040000008208088E +:10FBB00000080000000800840008000000000008A1 +:10FBC0000008000000840004000800000008000491 +:10FBD000000004080000000400000484000000008D +:10FBE00000820008000000820008000800080008E9 +:10FBF00000088004008880088000000800080008D1 +:10FC00000008008400000000000800400008000810 +:10FC100000080008000300000008000000000000C9 +:10FC2000000800080000000000400000000001097A +:10FC30000100004000000000010000000000000082 +:10FC400000000000000000000008000000000000AC +:10FC5000000000000000400020080000000000003C +:10FC600000080008000000210000001100218800A9 +:10FC70000000900004080484040004000021000037 +:10FC8000000000000000000040000000000800002C +:10FC90000000010000000000000000000000000063 +:10FCA0000000000000000000000000000000000054 +:10FCB00020002000000100000000040000000000FF +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE00000000000000021000300000005000000EB +:10FCF00000000000000080048020800080000000E0 +:10FD0000008200000000000000000000000021014F +:10FD100000000000040000000000000000000000DF +:10FD20000000000000000000000001000080000052 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD5000000000000000000000000400002000A0DF +:10FD6000000000000000000008000000000000008B +:10FD700000000000000000008200000000000009F8 +:10FD8000004100410000000082000000002100004E +:10FD9000001000100180008000080000000000003A +:10FDA000000000000000000000000000200000042F +:10FDB000000800100808000000000000000000001B +:10FDC0000000000000000000000800000008000023 +:10FDD00000000000000000A0000000008008008378 +:10FDE00000050008008800880000000000000000F6 +:10FDF00000000000008200840000000000080000F5 +:10FE00000000000000000000000000A0000800004A +:10FE1000000000000000202000400000000000085A +:10FE20000004000800000000900000000003000033 +:10FE3000000000400000000000080000000000205A +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000009000000000002000F2 +:10FE6000000400000000004000000000000000004E +:10FE70000000000200000000000000000040000040 +:10FE80000000000000410000000000002008000009 +:10FE900090000000000001000000100400000000BD +:10FEA000000000080000000000000000000000004A +:10FEB0000008000800000000000000000000000032 +:10FEC0000001000000000000000000000000000031 +:10FED000000000000000000000000004000000001E +:10FEE0008000000109000000000000000000000088 +:10FEF000030000000000008400C000000004008433 +:10FF0000000000840908000000000000000000005C +:10FF10000000000000000008200000008001000038 +:10FF20000000000900210000000000000000100097 +:10FF300000000000000000080000000000000000B9 +:10FF40000009000900000000000000090000000096 +:10FF500000000000000000000000000000000000A1 +:10FF60000080000001000100C003000000100041FB +:10FF70000000000000000000000000000000000879 +:10FF800000110000000800000041004100020000D4 +:10FF90000800000000000000000000000000000059 +:10FFA00000000000000000000000000000820000CF +:10FFB000808200000008000800010000000000002E +:10FFC000000000000000000000000002000200022B +:10FFD00000000000000000000000000800A0000079 +:10FFE00000000004000020002000000000880088BD +:10FFF0000000080009400000008400C000880000E4 +:020000040025D5 +:1000000000000000000000000000000000000000F0 +:10001000000000820000000000000000000000005E +:1000200000000000000000000000000000000000D0 +:10003000000001000090000000000100000000002E +:100040000000000090000000000000000000000020 +:1000500000000000000000000000000000000000A0 +:1000600000000000118400000008000800000000EB +:100070000000000000000000000000000000000080 +:10008000000000009008000000A0840800000000AC +:1000900000000000000000000000000001009000CF +:1000A00000880000000000000000000000000000C8 +:1000B000000000001100218000000000110021005C +:1000C000000000001100800000000000000000009F +:1000D0000000000000000000000000000000000020 +:1000E000000000000000910000001080008000006F +:1000F0000000000000000000000000000000000000 +:10010000000000000000008000000000000000006F +:1001100000000000000000000000000000001100CE +:10012000A10000000000000000000000000000002E +:100130000000000000000041090000030000004131 +:10014000090000090000000000800000000000001D +:10015000000000000000000000000000000000009F +:100160000000000000000000000900218082000063 +:10017000000000000000000000000002000000007D +:10018000000000000000000000000020000000004F +:10019000000000000000000000000000000000005F +:1001A00000400980001000800000000000000000F6 +:1001B000000000000000000000010102000000003B +:1001C0009001C10020001000000000200000008805 +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000008400000008087B +:1001F000C00000000000000000000000000000102F +:1002000000000000000000000000A00090010000BD +:1002100020000000000000000000000000000000BE +:1002200000000001010200010002000000000000C7 +:100230000000000000000000000000008800209086 +:100240000100000008000000010001000088080013 +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000C084C00288 +:1002700000080288000000000000000000000000EC +:1002800000000000000000000000000088080008D6 +:100290000000A0A00000000000000000000000001E +:1002A0000000000001008888080000000000000035 +:1002B0000000000000000000000000000900000035 +:1002C000808041000500800000000800410000809F +:1002D000800000000000000000000000000000009E +:1002E000000000000000000000000000000080008E +:1002F000800000808200000000000000000000007C +:10030000000000000000000000000000000000806D +:1003100000000000000000000000000000000000DD +:10032000000000000000410000808000410000004B +:1003300000000000000000000000000000000011AC +:1003400080110000000000000011000000000011FA +:10035000000000800000000000000000000000001D +:10036000000000000000000000000000000000008D +:1003700000000084000000000000000000000000F9 +:1003800080000000000000000000000000000000ED +:100390008000008900000000000000000000000054 +:1003A00000000000000000000011000010800000AC +:1003B000000000000000000000000000000000003D +:1003C0000001200100000000000000A100880000E2 +:1003D00000010000004000000000000000000000DC +:1003E000000000000000000000000000000000000D +:1003F0000000840000030410100000000000000052 +:100400000000C00000000000C0000000000000006C +:10041000000008009010A0A02000000000000000D4 +:10042000000000000000000000000001000001408A +:1004300000000000000000000000000000000000BC +:100440000000000000E007008182000000E00000E2 +:100450008100000000000700820000000000000092 +:10046000000000000000000000000000000000008C +:1004700000000000000000E0070041000000000054 +:10048000000000000000000000000000000000006C +:100490000000000000000000070000000000000055 +:1004A000000000000000000000000000000000E06C +:1004B00007008200000000000000000000000000B3 +:1004C000000000000000FF000000FF00000000002E +:1004D00000000000000000000000F0F0000000003C +:1004E000000000000000000000000000000000000C +:1004F0000000000000003C3CF6F672F37230000091 +:10050000000000000000DBDBC3C3000000000000AF +:100510000000000000003C3CFF0F7272F3F300008B +:1005200000000000000000000000000000000000CB +:1005300000000000F0F000000000000000000000DB +:100540000000000000000000FF000000FF000000AD +:10055000000000000000000000000000F0F00000BB +:10056000000000000000000000000000000000008B +:1005700000000000000000003C3C909072F37230DC +:100580000000000000000000DBDBFFFF00000000B7 +:1005900000000000000000003C3CF00072723030AF +:1005A000000000000000000000000000000000004B +:1005B000000000000000F0F000000000000000005B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:100640000000000000000000000000FF00000000AB +:100650000000000000003C3C0F0F00000000FFFF06 +:10066000000000000000000000000000000000008A +:100670000000000000000000000000003636FFFF10 +:100680003C7EFF7E00000000000000000000000033 +:100690000000000000000000000000006F6F3C3C04 +:1006A00009096F6F0000000000000000000000005A +:1006B000000000000F0F0000FFFF0000000000001E +:1006C00000000000000000000000000000FF00002B +:1006D000000000000000000000FF6666000000004F +:1006E000000000000000000000000000000000000A +:1006F000000000000000000000000000000036368E +:1007000000000042C34200000000000000000000A2 +:1007100000000000000000000000000000000909C7 +:100720003C3C18187E7E0000000000000000000025 +:100730000000000000000F0F00000000000000009B +:100740000000000000000000000000000000156034 +:100750002A06054C000000600006000C00000500A1 +:100760000A00054000A80000000000000000000092 +:100770000000000000000000000000000000000079 +:100780000061000F000D00000000000000000000EC +:10079000A0000000000000000000000000000000B9 +:1007A0000000000800000000000000000000000041 +:1007B000000000000000000005402A06054C00A8CB +:1007C0000000000000000000000000000000000029 +:1007D00000000000FFFF000000000000FFFF00001D +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:100830000000000000000000000000000F0FFFFF9C +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B00000000000000000000000000000000F0F1A +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000F0F000000000000038 +:1008E000F0F0000000000000000000000000000028 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:100940000000F0F0000000000000000000000000C7 +:1009500000000000000000000000F0F000000000B7 +:100960000000F0F0000000000000000000000000A7 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C00000000000F0F00000000000000000040043 +:1009D0000000000000000000000000000000000017 +:1009E000000000000000008800000002000000007D +:1009F000004000200000A0000000000000000000F7 +:100A000000000000000400080003000000000000D7 +:100A100000000000000000000010000000080000BE +:100A200000000000000000000002000000000000C4 +:100A300000000000000000000000000000000000B6 +:100A40000002100010000000000000000084000000 +:100A5000000000080000000200000000000000008C +:100A60000000000000000000000500000001000080 +:100A70000000000100010000000040000000000034 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA00000020000400000000000000800000000FC +:100AB0000000000200000000000010000000000024 +:100AC0000090000000000000000000000000000096 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000004010002096 +:100AF0000208001000000082040400404010204062 +:100B0000020800020808020820200410000000006B +:100B100000000000000000000000000800000000CD +:100B2000000000000000000800000010000000109D +:100B300000000000000000000000000000000000B5 +:100B4000000000000000000000000000200000087D +:100B50000084000000000008000800080008008869 +:100B600000840084000000080000000800008009E4 +:100B700000018001000100840009808500118009C6 +:100B800080858001000180858001808580010000D2 +:100B9000000400880088000000C000C000000000C1 +:100BA00000100082000800080002000200C00008D7 +:100BB00000080008008200080008000800840008FF +:100BC0000008000800080008008402000284C00831 +:100BD00000080002000000000021002100000000C9 +:100BE00000080008000000000021002100000000B3 +:100BF00000080008000800000008000800000000CD +:100C00000000000000000000004000000008000399 +:100C10000000004188218800000000050008000550 +:100C20000000000000030005000200212000000277 +:100C300010040000A0210000000000400041000856 +:100C400000004000001000008800000000000008C4 +:100C50000021000000000000000000000000000073 +:100C60000000000000004100000000000000000043 +:100C70000000000000000010000000000000000064 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000001044 +:100CA00000A008A00000000000000010000000C02C +:100CB0000008A00440000000000000000000000048 +:100CC0000000000000000000000000C01100000053 +:100CD0000000000000000000000000000000000014 +:100CE0000000040000000000000000000000000000 +:100CF000A000820000000000008000000000000052 +:100D0000000000800008000000000000000000005B +:100D100000000000000000000011000000000000C2 +:100D200000000000000000000000000000090000BA +:100D300000000000000000000000000000000000B3 +:100D4000000000000000004000400040844000001F +:100D500000000000004000840000000000000000CF +:100D6000000000080000000000000000000000007B +:100D7000000000080000000000000002000000A0C9 +:100D80000000000000100001000000000000000052 +:100D9000000800000000000000000000001000003B +:100DA00000000082000800080004000000000000AD +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000100000000013 +:100DD00000000000000000000021000000000000F2 +:100DE0000000200000000800000000210021000099 +:100DF0000000000000090002A00000002000080020 +:100E0000000040004021000402000005000000082E +:100E10000000000000050020000020080003002161 +:100E20000021000800000000900000080000000001 +:100E300000000021002100100080000000000000E0 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E6000000000000000000000C00000000000843E +:100E700000200088000000000810000000000000B2 +:100E8000000400000000000000000000000000005E +:100E9000000000000000000000C000000010000082 +:100EA00009000040000000000000000000000000F9 +:100EB000000000000200000000002004090009906A +:100EC0000900090000000000000000000000000010 +:100ED00000C0000000002100408400040000002148 +:100EE00000020000000800000000000000000008F0 +:100EF00008000003040800000002000000050000D4 +:100F0000400584030041000000210000002100088A +:100F100000080000000800210000000000000000A0 +:100F200000080008000800000000000000000009A0 +:100F300000000011000300088800002100000005E7 +:100F40000000000000000041000000000000000060 +:100F500088000000000000080008000000000000F9 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F8000000000000000000000000500000000005C +:100F90000000000000000000000000000000000051 +:100FA00000000088110000000000000000000000A8 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE00000010001000100C00001000100C10091EA +:100FF00000000401008800820001000100C0000020 +:101000000000C1000000C18300010000001010407A +:10101000C001C0000090C0820000C00001110200A9 +:10102000000100018801000100C10001000100C0B1 +:10103000000900010001008400100001000100C14E +:10104000000000000000000000000100000000009F +:1010500000000001010000C00000000000000000CE +:101060000000004100410041009000410041008823 +:101070001041000941410000008000410041008909 +:1010800000000041C1410000C183000800030403C7 +:101090008000801091410000808000118010048346 +:1010A00080000000004100410041008300410041F8 +:1010B000008910C100200241000000800041004171 +:1010C000008400000000000000000000410000005B +:1010D0000000000000100800008000000000000078 +:1010E0000000000041000300000000804100890072 +:1010F000000011000300028000108400C100C10044 +:10110000008080004100114100C1000009104041F1 +:101110000000000589C18041004103008400834133 +:1011200000C1801100004100030000000080410068 +:101130008200000040004100200000849000C100B7 +:10114000C10000000000000003000000008000005B +:10115000800000000000020090000000000000007D +:1011600000000000004101000100000000C001007B +:10117000C000000000008800881000C0C000090006 +:10118000C100000808000000000100C100000000CC +:1011900001010000000002C102090001010040003D +:1011A000090100C182C0000301000100000000C06D +:1011B0000100C00000000100840088C00002C000DF +:1011C0000900C1000084C00000000100000000C050 +:1011D000000020000000000010000808001020009F +:1011E000020000000000000100C00001C0C10000BA +:1011F0000000000100C0081100C1000100C1010091 +:10120000000000010000000000400000C183000059 +:10121000000000000108C00000200000C1400000E4 +:101220000000000000000000000000C00001C0C17C +:1012300000000000000100C020C10011000100C139 +:101240000000000000010001000000000000C000DC +:101250000000000000000000000000080000000086 +:10126000000000000000000000000080004180C17C +:1012700000000000004100C190C00041004100C1D9 +:101280004000000000410009000000800041C183CF +:101290000000000000090883000000410041C1C1B6 +:1012A0000000000000100441000000000080004128 +:1012B00080C100000000004100C100080041004161 +:1012C00000C1000000000041000400000000000018 +:1012D000800000000000000000000000008000000E +:1012E000000000000000000000000000C1008000BD +:1012F00080C100004102000084004100C1410000A3 +:10130000800500004100000080004100C191804143 +:1013100080C100001011000005C11002C141008011 +:101320008080000011410004800009C00000C1005D +:10133000800080C100004104000090004100C1C154 +:101340000000800400004100000080004100000017 +:10135000800000C10000000000000000000000410B +:101360000000000200000000000000000000C100BA +:101370004000C0C100000100020085000100C11151 +:101380008800C001000001000000C000010040C052 +:1013900020018240000000004000C04100844089DC +:1013A00000C040C0000000010000401000830000A9 +:1013B000C1004000C0C10000010184000300010021 +:1013C000C1098800C000000001000000C000010049 +:1013D0000000400000C1000000000000000000000C +:1013E0000089020000000000000000000000000072 +:1013F00000000000000000420000000000000000AB +:1014000081120041070048000000000000000000B9 +:1014100000000000000048420000000000004842B8 +:10142000811200E00600484200000000000048422F +:10143000000000000000000000420000000000006A +:101440000000811200410700480000000000000079 +:10145000000000000000000000420000000000004A +:101460004800810000E0000048000000000000008B +:10147000004200000000000000000000000000002A +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB :1015200000000000000000000000000000000000BB :1015300000000000000000000000000000000000AB @@ -151937,448 +151937,448 @@ :1015A000000000000000000000000000000000003B :1015B00000000000DEAE0000757B000000000000AF :1015C000000000000000000000000000000000001B -:1015D000000000000000DEAE757B0000000000008F +:1015D000000000000000DEAE747B00000000000090 :1015E00000000000000000000000000000000000FB -:1015F000000000000000DEAE60C603000000000036 +:1015F000000000000000DE2E60C6030000000000B6 :1016000000000031E0000000000000000C000000BD -:101610000000000000C0630660C603000000000078 -:1016200000000031E0000000000000000C0000009D -:101630000000000000C06306000060C60300000058 +:101610000000000000C0630660DE03400000000020 +:1016200000000231E0000000000000000C4000005B +:101630000000000002C07B06000060C6030000003E :10164000000000000031E0000000000000000C007D -:1016500000000000000000C0630660C60300000038 -:10166000000000000031E0000000000000000C005D -:1016700000000000000000C0630600000000000041 -:1016800020000000200000000000200020000000DA -:10169000200000002000004040000000000000008A -:1016A00020008800200000000000200020004000F2 -:1016B0002000000020004000200000010000000089 -:1016C00000002000000020000000000000002000BA -:1016D000200000000000200020002000000000008A -:1016E0000000200088002000000000000000200012 -:1016F000200000000000200020002000000000006A -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000900000000000000000000000000B0 -:101730004000000000000000000000000000000069 -:101740000000000000000000000000000000000099 -:101750000020200000000000000000000000000049 -:101760000000000000000000000000000000000079 -:101770000000200000000000000000000000000049 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000020000000000000000000000009 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:101830000000000000008000000000000000000028 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 +:1016500000000000000000C0630661560340000067 +:10166000000000000231E0000000000000000C401B +:1016700000000000000002C06A86000000000000B8 +:10168000000020000000000000000000000000003A +:1016900000000000000000008800C0000000C00042 +:1016A000000404080000000004008800000000009E +:1016B0000400C00000000000200000038800A0001B +:1016C0002000000820090000000020082000000081 +:1016D0000008200004000005000020002000100089 +:1016E0002000000020000000000020102005000065 +:1016F0000000200020000000000020000000000882 +:10170000000000000000000000000008400200028D +:1017100000020000000000000000000000000000C7 +:101720000000000080000000000000000000000039 +:101730000000800000000000000000000000009099 +:101740000000000000004000000000000000000059 +:1017500000000000000000000000000000A00002E7 +:10176000000200000000000000000002000009006C +:101770000000000000001100000000000000000058 +:101780000000000000000000000000000000100049 +:101790000088100010000000000090000000000011 +:1017A0000000000004000000000000000000000035 +:1017B0000000000000000000000000000200000027 +:1017C0000100000002000300000000000000000013 +:1017D0000000000000000000000000000200020005 +:1017E00000000000000003000000000002000200F2 +:1017F0000000400040004000000000000000000029 +:1018000000100008000000000008000800000008A8 +:1018100080000008800880000008000000080084A4 +:101820000008000800088088001000080000001070 +:101830000000000200080004000800840088000086 +:1018400000004008000800084000000800080000F0 +:101850000010000800080010000800040200000842 +:101860000008000800080008400800080088000878 +:1018700000080008800880088008000000100004AC +:10188000000400000008000000000200000000004A :101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B000000000000000000900000000000000001F -:1018C0000000000000000000000000000004000014 +:1018A0000000000000080100000000000008000027 +:1018B0000008000000000000000000000010000010 +:1018C00000000000840088000000004100000003C8 :1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000080008001000B7 -:101910000000000000000000000000820020000025 -:10192000000000000000000041000800030000006B -:1019300005000000000000000084008200A00000FC -:101940000000000000000000000041000800080046 -:1019500040000000000000000000000000820000C5 -:10196000100000000000000000004100080003001B -:1019700000000000410000000000000000820000A4 -:101980000000000000000000000000000000000057 -:10199000000000000000000000000000C000400047 -:1019A0000000000004000400040005000400010021 -:1019B0000100000000000000000000000000000026 -:1019C0000000100000000000000000000000000007 -:1019D00000000000000000000800000000000000FF -:1019E00040000000080000000000000000000000AF -:1019F00000000000000000000000000000000000E7 -:101A000000000000080000000000000000000000CE -:101A100000000000000000000000000000000000C6 -:101A20000000000000008000800080008400800032 -:101A3000040004000000000000000000000000009E -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A6000080000000000000000000000000000006E -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000040000000000000000000000000042 -:101AA0000000000000000011100000030000000012 -:101AB0000000000000000000820300000400000994 -:101AC00000000000000000110800000000000000FD -:101AD0000000000000000000000000000000000006 -:101AE000000000000000000000110800820000005B -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000011080000000000BC -:101B100000000000000008004000000000000888ED -:101B20000400410000000800000010000000000058 -:101B300000000000000008004000000000048800D1 -:101B4000000000000000080010000000000000007D -:101B500000000000000000000800030000840000F6 -:101B6000080009000000000008000000000000005C -:101B700000000000000000000800030000840000D6 -:101B80000800000000000000080000000000000045 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000400040004000400000015 -:101BC000000000000000000000000009000000000C -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000020000000000000000F3 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000020000000010000000C2 +:1018E00000000000840008082000900400000008A8 +:1018F000000000210000000090090000000000002E +:10190000000800080000000000C0008480000008FB +:10191000000200000010000000080010008400A079 +:101920000000020000000000080000844000008267 +:101930000000008200820008000000A000000000FB +:10194000000000000000008200C0008411100000B0 +:1019500020000000000000000000001000000082D5 +:101960000008008400A0009000000020000100009A +:10197000000000A02000000000000000000200C0E5 +:101980000008000000000000080000000000000047 +:1019900000000000090000008200000001000000BB +:1019A000000000000000C000000000000000000077 +:1019B000000000000000A000000000000000000087 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000040000000000010002 +:1019E00008000000000000008400000000800000EB +:1019F0008200000000000000000000000000000065 +:101A00008200000000000000000000000000000054 +:101A10000000000000000482000000000000200020 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A4000000000000000000000000800000000008E +:101A50000000000000000000001000000000000076 +:101A6000040000000000000000000000000000046E +:101A70002000200000000000000000000000000026 +:101A800041000004000400400000000000000008C5 +:101A900000000000000000200000000000000041E5 +:101AA000000008000800000882000000000000009C +:101AB0000000000000000000000000080000000519 +:101AC000000000000000000000080000000000000E +:101AD00000000000000300000000000200400000C1 +:101AE00000200021A000000000000000010009000B +:101AF00001000108C000000000009000000000008C +:101B00000000000000210011001100000000000092 +:101B1000000000000008000011010082000000A089 +:101B20000010008200000002000000A00000000081 +:101B300000000000000000A000000084000010C0B1 +:101B40000000400000000000000000000000050050 +:101B5000400000C000000008000011000008000163 +:101B600000A00009000000000000000000002000AC +:101B70002000200020000000000000000000009075 +:101B8000008209020400009000000000000000082C +:101B90000000000000080000000000000008000035 +:101BA000000000000008000000080000820004415E +:101BB0000000000000000800000900008410000080 +:101BC0000000000000080000000000080000000005 +:101BD00000000000000000000000000000080000FD +:101BE00004000000000000000000000000000000F1 +:101BF00000000000001000000000000000000000D5 +:101C00000080010001000100000000000000000051 :101C100000000000000000000000000000000000C4 :101C200000000000000000000000000000000000B4 -:101C300000000000000000008000800080008000A4 -:101C4000030003004100030000000000000000004A +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000000000034 -:101CB000000000C000900000000000C00090000084 -:101CC000000000C0A0909000000000000000000094 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D300000000000008000800000000000800080A3 -:101D4000000000000080858000000000000000000E -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 +:101C70000000000000000000000000000004000060 +:101C800000000004200020042000050000000000E7 +:101C900000000000000000000000000090000000B4 +:101CA0000000010000000000000000000000000033 +:101CB0000000020000000000020000000000000020 +:101CC0000000000000000000000000000000000014 +:101CD00000000001000000001001000000000000F2 +:101CE0000000000000009000001000000000000054 +:101CF0000000000001000000900000000000000053 +:101D00000000000001008800030000000000000047 +:101D10000000000000000000000000001100800032 +:101D20000000000011000021000000000000000081 +:101D300000000000A0000000000080000000000083 +:101D40000000000000000000000000000000000093 +:101D500000000000000000200808800400100000BF +:101D600000000000000011008000000000000000E2 +:101D7000000000000000110021000200000000002F +:101D8000000000000000100021008800000000009A :101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000080000000000080008080000023 -:101DC00000008000808041004000C0058391000039 +:101DA000008000000080000800001110000000000A +:101DB0000000000000008000800000000000000023 +:101DC0000000000000000000000000000080000093 :101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 +:101DE00000000000000000000000008000000080F3 +:101DF00000000000000000000008000000100000CB +:101E00000000000000000000400810001104031151 :101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E30000000000000009000000000008400C0903E -:101E4000000000008400C090004000008400C191A8 +:101E20000000002000000008000000000100000089 +:101E30000000000000000000020020002000000060 +:101E4000000000000000000000000000000000048E :101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 +:101E60000000000000000000000000000020000052 +:101E700000C00000000000000000000100000000A1 +:101E8000000000000000000000000041010001010E :101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000029090 -:101EC00000C000000000009000C000000001009170 -:101ED00001C0000000000000000000000000000041 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F4000008000800000000000801180000000037D -:101F500000A111C00000000000000000000000000F -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB000000000000000000000110000000080117F -:101FC0008041000000008011800300000000859126 -:101FD0008341110003050000000000000000000024 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 +:101EA0000000010000888800000000000800000118 +:101EB0000100000000000000000000200088002059 +:101EC000000400000000000000000000000000000E +:101ED0000000000000000000000000000000010100 +:101EE0000100000100000000000000000100008867 +:101EF0008800010000000000000000000000C00198 +:101F000000000100000000000000000000000201CD +:101F100000000101000000000000000000000000BF +:101F20000000000041000080000000000000800070 +:101F30000008080000000000000000000000000091 +:101F40000000008008000000000000000000000009 +:101F50000000000000000000000000000000002061 +:101F6000102040410004000000000000000041007B +:101F700000800000090000000000000000000020B8 +:101F8000801000031003000000000000000000406B +:101F9000001000031011000000000000000000000D +:101FA00000000000000000110000008000000000A0 +:101FB00011000000000000000000000000000040D0 +:101FC00000890080000000050000000000000005FE +:101FD0000000000000000000000000000000000001 +:101FE00000100000000000000000000000000000E1 +:101FF0000011000000800000000000000000000050 :1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:10204000C001200000000000C001200100000000CD -:10205000C09120010100000000000000000000000D -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 +:1020100010801011030003110000000000000000F8 +:10202000000000000000000000010000004000006F +:10203000000001000000000000000000000000009F +:10204000000000020002000000000000000000008C +:102050000000000000000000000000000000000080 +:10206000000000010000000000000000000000006F +:10207000000000010000004000000000000000001F :102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000070019 -:1020C0000000000000000700000000000000070002 -:1020D0000000000000E007004100000000000000D8 +:10209000000001C00101000001000000000000007C +:1020A0000000000000000000000000000000070029 +:1020B0008200000000E000000000000000000000BE +:1020C0000000008100000600000000810000070001 +:1020D0000000008100000700000000000000000078 :1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF +:1020F0000000000000000000070082210000000036 +:1021000000000000000000E00000410000000000AE +:1021100000000000000000E000008200000000005D :1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:1021400000000000000000FF000000FF000000FF92 -:10215000000000FF000000FF000000FF0000000082 +:10213000F0F00000000000000000000000000000BF +:1021400000000000000000003F3E3F3C0000000097 +:10215000000000000000000000000000000000007F :10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F +:1021700000000000000000000000F0F0000000007F :10218000000000000000000000000000000000004F :10219000000000000000000000000000000000003F :1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000FF000000FF000011 -:1021D00000FF000000FF000000FF000000FF000003 +:1021B0000000F0F00000000000000000000000003F +:1021C00000000000000000000000833F0CDD000064 +:1021D00000000000000000000000000000000000FF :1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF +:1021F000000000000000000000000000F0F00000FF :1022000000000000000000000000000000000000CE :1022100000000000000000000000000000000000BE :1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:1022400000000000FFFF0000FF000000FF00000092 -:10225000FF000000FF000000FF00000000FFFFFF84 +:10223000000000000000FFFF0000000000000000A0 +:10224000000000000000000000000000FFBFFFBF12 +:10225000000000000000000000000000000000007E :10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E +:102270000000000000000000000000000F0F000040 +:10228000FFFF000000000000000000000000000050 :10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E :1022B000000000000000000000000000000000001E -:1022C000000000000000FFFF0000FF000000FF0012 -:1022D0000000FF000000FF000000FF00000000FF02 -:1022E000FFFF0000000000000000000000000000F0 -:1022F00000000000000000000000000000000000DE +:1022C00000000000000000000000000000007B3063 +:1022D0007B30000000000000000000000000000053 +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000F0FC0 :1023000000000000000000000000000000000000CD :1023100000000000000000000000000000000000BD :1023200000000000000000000000000000000000AD -:10233000000000000000000000000000000000009D -:102340000000000000000008000010C00382030825 -:102350000C0092C0038203080C0092C003E3030E3A -:102360000C0982C000000000000000000000000016 -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D +:102330000000000005000A00054000A8000000069B +:10234000000C000000000000000000000000003849 +:102350000000010005000020000000000000002037 +:10236000000000A00000000000000000000000616C +:102370000006000D00000000000000000000050045 +:102380002A00054000A800000000000000000061D5 +:102390000007000D000000000000000000000061C8 +:1023A0000007000D00000000000000000000000019 :1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D +:1023C000FF0000FF0000000000000000000000000F :1023D00000000000000000000000000000000000FD -:1023E0000000A0A0A0AA0000000000000000000063 -:1023F00000000000000000000000000000000000DD +:1023E00000000000000000000000000000000000ED +:1023F00000000000D7FFD7FF000000000000000031 :1024000000000000000000000000000000000000CC -:1024100000000000000000000000000000000000BC -:1024200000000000000000000000000000000000AC +:1024100000000000DF1FF3F30000000000000000D8 +:102420000FAFFBFB1FFF1FF30000000000000000C8 :10243000000000000000000000000000000000009C -:10244000000000000000000000000000000000008C +:102440000000FF0000FF000000000000000000008E :10245000000000000000000000000000000000007C -:1024600000004000A0A0A0A00000000000000000AC -:10247000000000000000000000000000000000005C +:10246000000000000000000000000000000000006C +:10247000000000000000FFCFFF0C00000000000083 :10248000000000000000000000000000000000004C -:10249000000000000000000000000000000000003C -:1024A000000000000000000000000000000000002C +:10249000000000000000DF1FFFFF00000000000040 +:1024A00000005FFFFBFBDFFFDFF300000000000028 :1024B000000000000000000000000000000000001C -:1024C000000000000000000000000000000000000C +:1024C00000000000FF0000FF00000000000000000E :1024D00000000000000000000000000000000000FC :1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC +:1024F00000000000D7AAFFFA000000000000000062 :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB +:1025200000000000000000001F1FFFF3000000007B :10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B +:10254000000000000000FF0000FF0000000000008D :10255000000000000000000000000000000000007B -:10256000000000000000000000000040000000002B -:10257000000000000000000000000000000000005B +:10256000000000000000000000000000000000006B +:10257000000000000000D7FFFFFA0000000000008C :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B -:1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B -:1025C0000000000000000004000000000000000007 -:1025D00000404040000000000040000000000000FB -:1025E000000000000040000000000000404000002B -:1025F00000002000000000000000000000000000BB -:1026000000000000000000404000400000002000EA -:10261000000000002000000000000000000000009A -:10262000000000000000002020002000000020002A -:10263000000000002000100000000000000000006A -:10264000000000000000000000000000000000008A -:1026500000000000000040000000000040000000FA -:10266000000000000000000040000000000000002A -:10267000400000000000000000000000000000001A -:10268000000000000000000000000040000000000A -:102690000000000000000000050000000000000035 -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A -:1026C0000000000000000000080000000000000002 -:1026D00000000000000000000210000000000000E8 -:1026E00000000000000000000800000000000000E2 -:1026F00000000000000000000210000000000000C8 -:1027000000000000000000000000080000000000C1 -:1027100000000000000000000000021000000000A7 -:1027200000000000000000000000080000000000A1 -:102730000000000000000000000002100000000087 -:102740000000000000000000000000000000000089 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C0000000000000000000000000000400000005 -:1027D00002000000020000000000000010000000E5 -:1027E00000001000000000000000000000000000D9 -:1027F00010000000100010000000000000000000A9 +:1025A00000000000000000000000DFDFFFF300007B +:1025B00000000000000000000000200020000000DB +:1025C00000000000000020000000000000000000EB +:1025D00000000000000000000000000000000000FB +:1025E0000000000002004000000000000000C000E9 +:1025F00000000000000800028800820000000000C7 +:1026000084100000000820002008000000000005E1 +:102610000000000000000000400000000000000278 +:10262000200000001000200020800080008000803A +:1026300000089000000090800000000000000000F2 +:102640000000000000080000000000000000000082 +:10265000000000000000000040000000000000003A +:1026600000000000000080000000000000000000EA +:10267000000000000000000000000000000000005A +:10268000000040000000000000000000000000000A +:102690000000000200000000000000000000000236 +:1026A00000020000000200021000002000040004EC +:1026B0000004000000900000004000000000000046 +:1026C0009000000000000000000008000800080062 +:1026D00008000000000008000800080008000800CA +:1026E0000800080008000800080082000000000040 +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000020000000000B7 +:102720000000000000000000000000000000200089 +:10273000200003000000000000000800000000006E +:102740000000000000000000000800000008000079 +:102750000000000000000010000800000008000059 +:102760000000000000000000000800000008000059 +:1027700000000000000800000010000000000084BD +:1027800000000000000000080000001000000084AD +:102790000000000000000008000000000008000029 +:1027A0000000000000000008000000080000000811 +:1027B00080008000200800880000000080100000D9 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E000000000000000C000020004008800040097 +:1027F000C000000000000000000000000000000019 :1028000000000000000000000000000000000000C8 -:1028100000001000000008000000000000000000A0 -:1028200000000000000000000000000000000000A8 -:102830000000080000000800000000000000000088 +:102810000010000000000000000000000041000067 +:102820004020000000000008000000000000000040 +:10283000210002000000040000020000040000204B :102840000000000000000000000000000000000088 -:102850000000000000000000000000000000000078 -:102860000000000010000000000000000000000058 -:102870000000000000000000000000000000000058 -:102880000000000000000000000000000000000048 -:102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 -:1028B0000000000000000000000000000000000018 -:1028C0000000000000000000000000000000000008 +:102850000000000000840000030000840800000065 +:102860000000002000000800000000000000000040 +:10287000080000000000000005000000000000004B +:10288000000000000000000000000000000000A0A8 +:10289000000000080000000000080800000200001E +:1028A00000000000000000000000000000840000A4 +:1028B0000000840000000020800000000000008272 +:1028C00000090000000000000000020000000000FD :1028D00000000000000000000000000000000000F8 :1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 +:1028F0000000840000000000000000000000000054 :1029000000000000000000000000000000000000C7 :1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:10294000080000000000000000000000000000007F +:10292000000000000800000000000000000000009F +:1029300000000000000000000000C0000080000057 +:102940000000004000000000000000000000000047 :102950000000000000000000000000000000000077 :102960000000000000000000000000000000000067 :102970000000000000000000000000000000000057 :102980000000000000000000000000000000000047 :102990000000000000000000000000000000000037 :1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 +:1029B00000000000000000000000000000000020F7 +:1029C00000080000000000000000000000000000FF :1029D00000000000000000000000000000000000F7 -:1029E00000000000000000000000000000000000E7 -:1029F0000000000000000000000000000080000057 +:1029E00000000000000000000400000000000008DB +:1029F00088009000000000000000000000000000BF :102A000000000000000000000000000000000000C6 :102A100000000000000000000000000000000000B6 :102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A500000000000000000000000000000880000EE -:102A60000000000010000000000000000000000056 -:102A70000000000000000000000021000000000233 -:102A8000000000000800000000000000000000003E -:102A90000000000000000000000000000400000032 -:102AA000000000000000080000000000000000001E -:102AB0000000000000000000000000000000000016 -:102AC00000000000000008000000000000000000FE +:102A3000040000000000000082000100008001008E +:102A40000002012101080000000000000000000059 +:102A500000000000000800840084000000000084E2 +:102A60000000000000000000000000000004000062 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000003000000000043 +:102A900000C000000000000800000000000000006E +:102AA00000840090000000000000080008001100F1 +:102AB000000800A00000000000A003000400112096 +:102AC000048204000400040000000008000000006C :102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 -:102AF0000000000002004000000000000000000094 +:102AE00000020008000000080002000000030800C7 +:102AF00000000000000000000000000000000000D6 :102B000000000000000000000000000000000000C5 :102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 +:102B200000000000000000000000000200000000A3 +:102B3000000000000000000088004000200088081D +:102B40000000000000000020102000200000000015 :102B50000000000000000000000000000000000075 :102B60000000000000000000000000000000000065 -:102B700000000000000080000000000000000000D5 +:102B70000000000000000000000000000000000055 :102B80000000000000000000000000000000000045 :102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 +:102BA0000000000000040000000000000000000021 +:102BB0000000000000000000000000000000800095 +:102BC00000000000000000000001000120010000E2 :102BD00000000000000000000000000000000000F5 :102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000100D4 -:102C000000000000A0000000000000000000000024 +:102BF0000000000000000090002000100090000085 +:102C000000000000000000000000000000000000C4 :102C100000000000000000000000000000000000B4 :102C200000000000000000000000000000000000A4 :102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 +:102C4000840501090005C01011C000020000A000A9 :102C50000000000000000000000000000000000074 :102C60000000000000000000000000000000000064 :102C70000000000000000000000000000000000054 -:102C80000200000000000000000000000000000042 +:102C80000000000000000000000000000000000044 :102C90000000000000000000000000000000000034 :102CA0000000000000000000000000000000000024 :102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 +:102CC0000000000208C005048085098000000000A3 :102CD00000000000000000000000000000000000F4 :102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D000000000000800000008000000000000000C3 +:102CF0000000000000000000000000000020008034 +:102D000000000000000000000000000000000000C3 :102D100000000000000000000000000000000000B3 :102D200000000000000000000000000000000000A3 :102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 +:102D400000000000020020000000850480008021B7 +:102D50008080000000000000000000000000000073 :102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D800000000000A0002000A000C0000000000023 +:102D700000000000000000000000000000000088CB +:102D8000000400000000000000000000000000003F :102D90000000000000000000000000000000000033 :102DA0000000000000000000000000000000000023 :102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 +:102DC00000000000000091A005000084080104003C +:102DD0000490A01082080000000000000000000025 :102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E0000000000000000000000A0000000C0000062 +:102DF0000000000000000000000000000000C00013 +:102E000000000000020000000000000000000000C0 :102E100000000000000000000000000000000000B2 :102E200000000000000000000000000000000000A2 :102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 +:102E4000000000000000000000050001000584C033 +:102E500088900088100800C00000000000000000FA :102E60000000000000000000000000000000000062 :102E70000000000000000000000000000000000052 -:102E800000000000000000000000000500000080BD +:102E80008000000000008000000000000000000042 :102E90000000000000000000000000000000000032 :102EA0000000000000000000000000000000000022 :102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 +:102EC00000000000000000000000000211040020CB +:102ED000000510800000008000800000000000005D :102EE00000000000000000000000000000000000E2 :102EF00000000000000000000000000000000000D2 -:102F00000000000000000000000000000000008041 +:102F00000000000880080000000000000000000031 :102F100000000000000000000000000000000000B1 :102F200000000000000000000000000000000000A1 :102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 +:102F400000000000000000000000000002008004FB +:102F50001100054080000008008000000000000013 :102F60000000000000000000000000000000000061 :102F70000000000000000000000000000000000051 -:102F800000000000000000000000000000000082BF -:102F9000000400000000000000000000000000002D +:102F80000000000010002000880020000000000069 +:102F90000000000000000000000000000000000031 :102FA0000000000000000000000000000000000021 :102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 +:102FC0000000000000000000000000000000058478 +:102FD000108404048801080010888802880000001A :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 +:10300000000000000000000000000000810000003F :1030100000000000000000000000000000000000B0 :1030200000000000000000000000000000000000A0 :103030000000000000000000000000000000000090 :103040000000000000000000000000000000000080 -:103050000000000000000000000000000000000070 +:10305000000000E007000012000000000700000070 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:10309000FFFFFFFFF0F00000000000000000000054 +:10308000000000000000000018DB18DB000000005A +:103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 :1030B0000000000000000000000000000000000010 :1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 +:1030D0000000FF003636FF7EC3420000839FC0C061 +:1030E000F6060000000000000000000000000000E4 :1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF -:103110000000FFFFFFFF00000000000000000000B3 +:10310000000000000000000000000C0CCFCF000009 +:1031100000000000000000000000000000000000AF :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F :10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F +:1031500000000000FF0036363C7E0042839F839FC4 +:10316000CFCFF606000000000000000000000000C5 :10317000000000000000000000000000000000004F :10318000000000000000000000000000000000003F :10319000000000000000000000000000000000002F @@ -152388,45 +152388,45 @@ :1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:103210000000FFFFFFFFFFFFFFFF000C002000008A +:103200000000000000000000000000000000007E40 +:10321000FF7E000000000000000000000000000031 :10322000000000000000000000000000000000009E :10323000000000000000000000000000000000008E :10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E +:103250000000000000000000606F3C3C0C0CFCFC17 +:1032600000FF000000FFFFFF000000000000000062 :10327000000000000000000000000000000000004E :10328000000000000000000000000000000000003E -:1032900000000000FFFFFFFFFFFFFFFF0000000036 +:10329000007FFF7F00000000000000000000000031 :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E :1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE +:1032D00000000000000000000000606F3C3C6C6CCF +:1032E0006C6C00FFFFFFFFFFE1E100000000000049 :1032F00000000000000000000000000000000000CE :1033000000000000000000000000000000000000BD -:103310000000000000000000100600610006000D23 -:103320008A00000000000000000000000000000013 +:10331000000000003000000000000000000000007D +:10332000000000000000000000000000000000009D :10333000000000000000000000000000000000008D :10334000000000000000000000000000000000007D -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D +:103350000000000000000000000000000061000903 +:103360000001000005003408059000A000000000E6 :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D -:1033A0000F0F0F0F000000000000000000000000E1 +:1033A000000000000000000000000000000000001D :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD +:1033D00000000000000000000000000000000F0FCF +:1033E000D7D7FCFC3CFF00000000000000000000FC :1033F00000000000000000000000000000000000CD :1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC -:1034200000000F0F0F0F0000000000000000000060 +:10342000000000000000000000000000000000009C :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C +:103460000F0F1414C0C000C30000000000000000D3 :10347000000000000000000000000000000000004C :10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C @@ -152434,7 +152434,7 @@ :1034B000000000000000000000000000000000000C :1034C00000000000000000000000000000000000FC :1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC +:1034E000000055553F03EBEBE8E80000000000004A :1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB @@ -152442,96 +152442,96 @@ :10353000000000000000000000000000000000008B :10354000000000000000000000000000000000007B :10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B +:103560000000000055553F032828E8E8000000004F :10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B +:1035800000002000400000000000200000000000BB :10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B00000000000000000000000000040000000CB -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000020000000CB -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB -:1036000000000000100000000000000000000000AA -:10361000000000000000000000004000000000006A -:10362000000040000000000000000000000000005A +:1035A00000081000200000000000200400000000BF +:1035B00000000000000240000000000000080000C1 +:1035C000000000002000200000000000200040005B +:1035D000000000004000200000000000A0000040AB +:1035E0000000000000002000080000002000200073 +:1035F0000000000020004000000000000004000067 +:1036000000000000000000000000000000000000BA +:103610000000000000000000400000000000000268 +:10362000000000000000000000000000000040005A :10363000000000000000000000000000000000008A -:10364000000040000000000000000000000000003A +:10364000000000000000000000000000000000007A :10365000000000000000000000000000000000006A -:10366000000000004000000000000000000000001A -:10367000000000000000000000000000000000004A +:1036600000010000000000000000800000000000D9 +:103670000000000000000000020000000000000048 :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 -:103770000000000000000000000000000000000049 -:103780000000000000000000020000000000000037 +:1036C00000000000000000000000040000000000F6 +:1036D0000480000000000000000002000000020062 +:1036E000020002000200000000000080A000004074 +:1036F00004000000020000000000000800100000AC +:1037000000000008000000000000000000000000B1 +:103710000008000000000000000000080000000099 +:103720000000000400000000000000000000000095 +:103730000008000000000000000000000008000079 +:103740000000000000000000000800000008000069 +:103750000000002000000000000000000008000041 +:10376000000000040000000000080000001000003D +:103770000001000000000000000000000000000048 +:1037800000000000000000000000000090000000A9 :103790000000000000000000000000000000000029 -:1037A0000000000000000000A000000000008400F5 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000001000000000000000E9 +:1037A000000000008800C0000000000000000000D1 +:1037B0000000040000000000000000000000000005 +:1037C0008800000000000000000000000000000071 :1037D00000000000000000000000000000000000E9 :1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 +:1037F00000000000000000000000000000000020A9 :1038000000000000000000000000000000000000B8 :1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 +:10382000090000000000110000000000000009086D +:103830000088000000000000000000000000000000 :103840000000000000000000000000000000000078 :103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 +:103860000000004000000000000000000000000018 +:103870000000000000000000000000000000000840 :103880000000000000000000000000000000000038 :103890000000000000000000000000000000000028 :1038A0000000000000000000000000000000000018 :1038B0000000000000000000000000000000000008 :1038C00000000000000000000000000000000000F8 :1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 +:1038E00000000000000000000000000000200000B8 +:1038F00001000000000000000000000000000009BE :1039000000000000000000000000000000000000B7 :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 :103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 +:10395000000000000900000000000000000000005E :103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 +:103970000000040000000000000000000000000043 :103980000000000000000000000000000000000037 :103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 +:1039A0000000080000000000C0000000000000004F :1039B0000000000000000000000000000000000007 :1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 +:1039D00000000000400000000000000000000000A7 :1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A10000000000000000000000000000020000086 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 +:1039F000000000200800000000000000000000009F +:103A00000020002000000000000000000000000076 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000110085 +:103A3000008820880820000000000000000000002E :103A40000000000000000000000000000000000076 :103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 +:103A60002000000000000000000000000004000032 +:103A7000000000000001000000C000000002200063 +:103A800020A00008002000840000000000000000CA :103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000001000000006 +:103AA0000000000000000000000000000000000016 :103AB0000000000000000000000000000000000006 :103AC00000000000000000000000000000000000F6 :103AD00000000000000000000000000000000000E6 :103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 +:103AF0000000000084000000000000000000000042 :103B000000000000000000000000000000000000B5 :103B100000000000000000000000000000000000A5 :103B20000000000000000000000000000000000095 @@ -152547,40 +152547,40 @@ :103BC00000000000000000000000000000000000F5 :103BD00000000000000000000000000000000000E5 :103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 +:103BF000000000000000000090880000000000406D +:103C0000000200880010000000000000000000001A :103C100000000000000000000000000000000000A4 :103C20000000000000000000000000000000000094 :103C30000000000000000000000000000000000084 :103C40000000000000000000000000000000000074 :103C50000000000000000000000000000000000064 :103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 +:103C700000000000000000001100800000000000B3 +:103C800000800000008000800000000000000000B4 :103C90000000000000000000000000000000000024 :103CA0000000000000000000000000000000000014 :103CB0000000000000000000000000000000000004 :103CC00000000000000000000000000000000000F4 :103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 +:103CE0000000000000000000008000000000000054 +:103CF0000000000000000000000000000080000044 +:103D000000800000000500840000000000000000AA :103D100000000000000000000000000000000000A3 :103D20000000000000000000000000000000000093 :103D30000000000000000000000000000000000083 :103D40000000000000000000000000000000000073 :103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 +:103D60000000000000000000000000C00000000093 +:103D70000000000000000000000000000000002023 +:103D8000000000C000000000000200000000000071 :103D90000000000000000000000000000000000023 :103DA0000000000000000000000000000000000013 :103DB0000000000000000000000000000000000003 :103DC00000000000000000000000000000000000F3 :103DD00000000000000000000000000000000000E3 :103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 +:103DF00000000000000000000000000000000100C2 +:103E00000088880001001000000000001000000081 :103E100000000000000000000000000000000000A2 :103E20000000000000000000000000000000000092 :103E30000000000000000000000000000000000082 @@ -152588,31 +152588,31 @@ :103E50000000000000000000000000000000000062 :103E60000000000000000000000000000000000052 :103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 +:103E800041000080000009000000000000008000E8 :103E90000000000000000000000000000000000022 :103EA0000000000000000000000000000000000012 :103EB0000000000000000000000000000000000002 :103EC00000000000000000000000000000000000F2 :103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 +:103EE0000000000000000000000000400000000092 :103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 +:103F00000000001100000080000080000000800020 +:103F10008000000000000000000000000000000021 :103F20000000000000000000000000000000000091 :103F30000000000000000000000000000000000081 :103F40000000000000000000000000000000000071 :103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 +:103F60000000000000000000000000000001000050 :103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 +:103F8000000000000001000000400000C0009000A0 +:103F90001000100000000000000000000000000001 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 :103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 +:103FE0000000000000000000000000000000008150 +:103FF00000000700000600000000000000000000B4 +:104000000000000000000000000007008221000006 :1040100000000000000000000000000000000000A0 :104020000000000000000000000000000000000090 :104030000000000000000000000000000000000080 @@ -152620,24 +152620,24 @@ :104050000000000000000000000000000000000060 :104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 +:10408000000000000000000000000000F0F0000050 +:104090000C0C0E3E000000000000000000000000BC :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 :1040C00000000000000000000000000000000000F0 :1040D00000000000000000000000000000000000E0 :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F +:104100000000000000000000000000000000F0F0CF +:1041100000000C0C02320000000000000000000053 :10412000000000000000000000000000000000008F :10413000000000000000000000000000000000007F :10414000000000000000000000000000000000006F :10415000000000000000000000000000000000005F :10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F +:104180000000000000000000000000000000FF0030 +:104190000000FFFFC0C3D0D70000000000000000F7 :1041A000000000000000000000000000000000000F :1041B00000000000000000000000000000000000FF :1041C00000000000000000000000000000000000EF @@ -152645,15 +152645,15 @@ :1041E00000000000000000000000000000000000CF :1041F00000000000000000000000000000000000BF :1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E +:10421000FF0000000000E0EBF0FF000000000000E5 :10422000000000000000000000000000000000008E :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E :10425000000000000000000000000000000000005E :10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E +:10427000000000000000000000000020000000A07E :10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E +:1042900005002A00054000A8A00000000000000062 :1042A000000000000000000000000000000000000E :1042B00000000000000000000000000000000000FE :1042C00000000000000000000000000000000000EE @@ -152687,55 +152687,55 @@ :10448000000000000000000000000000000000002C :10449000000000000000000000000000000000001C :1044A000000000000000000000000000000000000C -:1044B00000000000200000000000000020000000BC -:1044C00000000000000000000000000000000000EC -:1044D00000404000204000000000000020000000DC -:1044E00000000000000000000000000000000000CC -:1044F000000000000000200000000000000020007C -:10450000000000000000000040000000000000006B -:10451000000000000000200000000000000020005B -:10452000000000000000000020000000000000006B -:10453000000000000000000000000000000010006B -:104540001000000000001000000000000000000249 -:1045500000001002100000004002400000000000B7 -:10456000004000000000000000000000000000000B -:1045700000000000402020000000000000000002B9 -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000010000000000000000000000000DB -:1045D000000000400000000000000000000000009B -:1045E00000000010000000000000000000000000BB -:1045F000000000400000000000000000000000007B -:10460000000000000010000000000000000000009A -:10461000000000000040000000000000000000005A -:10462000000000000010000000000000000000007A -:10463000000000000040000000000000000000003A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A +:1044B000000020000000200000000000200000009C +:1044C00000000000000000000000000000002000CC +:1044D000100020000000200000000000200000006C +:1044E000400000000000000000020000000020006A +:1044F000000000002000000020000000000020005C +:104500000000000000000000000084000000000027 +:10451000200000002000000020000000000020001B +:10452000000000000000100000000000000000007B +:104530002000000000000000000000000000000259 +:104540000000400000000000000400000000000027 +:10455000000040000000000000000000000000001B +:10456000000000000000000000004000000000000B +:104570000002000000000000000000000000000039 +:104580000000000020000000000200000002000205 +:104590000000000400000000000000020000000015 +:1045A00010400000000000000000000200020000B7 +:1045B000000000900000000000000000000000006B +:1045C00000000000000000000000000000000000EB +:1045D000000000000040000000400000000000005B +:1045E00000400000004002000200000000400040C7 +:1045F000004000400000000000000000000000003B +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:104630000000000002000000000000000000000078 +:104640000000000000000000000000000000000268 +:104650000000000000000000000000000000000852 :10466000000000000000000000000000000000004A :10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A +:104680000004000000040000000000000000000022 :10469000000000000000000000000000000000001A :1046A000000000000000000000000000000000000A :1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA +:1046D000000000000000000000000000000040009A +:1046E0000000900004000000000000000000000036 :1046F00000000000000000000000000000000000BA :1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 +:104710000000000000000000000004000000000095 :104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 +:104730000000000000008400900000000000000065 :104740000000000000000000000000000000000069 :104750000000000000000000000000000000000059 -:104760000000000004000000000000000000000045 +:104760000000000000000000000000000020000029 :104770000000000000000000000000000000000039 :104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 +:1047900000000000000000000000002000004000B9 :1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 +:1047B00000000000008400000088000800000000E5 :1047C00000000000000000000000000000000000E9 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 @@ -152743,15 +152743,15 @@ :1048000000000000000000000000000000000000A8 :104810000000000000000000000000000000000098 :104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 +:104830000000000000000000000000000004000074 :104840000000000000000000000000000000000068 :104850000000000000000000000000000000000058 :104860000000000000000000000000000000000048 :104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 +:104880000800000000000000000000000000000020 :104890000000000000000000000000000000000018 :1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 +:1048B00000000000000000000800000000000000F0 :1048C00000000000000000000000000000000000E8 :1048D00000000000000000000000000000000000D8 :1048E00000000000000000000000000000000000C8 @@ -152760,14 +152760,14 @@ :104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 +:10494000000000000000000000000008000000005F :104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 +:10496000000004200000000000000000000000081B +:1049700002200000000000200400000000000000F1 +:10498000000000000800000000000000000000001F :104990000000000000000000000000000000000017 :1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 +:1049B000002000840000090000000000000000004A :1049C00000000000000000000000000000000000E7 :1049D00000000000000000000000000000000000D7 :1049E00000000000000000000000000000000000C7 @@ -152775,13 +152775,13 @@ :104A000000000000000000000000000000000000A6 :104A10000000000000000000000000000000000096 :104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 +:104A30000000000000000000000000000002000074 :104A40000000000000000000000000000000000066 :104A50000000000000000000000000000000000056 :104A60000000000000000000000000000000000046 :104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 -:104A90000000000005000000000000000000000011 +:104A90000000000000000000000000000000000016 :104AA0000000000000000000000000000000000006 :104AB00000000000000000000000000000000000F6 :104AC00000000000000000000000000000000000E6 @@ -152882,217 +152882,217 @@ :1050B00000000000000000000000000000000000F0 :1050C00000000000000000000000000000000000E0 :1050D00000000000000000000000000000000000D0 -:1050E0000000000020002000000000000000200060 -:1050F00000000000200020000000204020000000F0 -:10510000000000002000200000000000000020003F -:10511000000000002000200000002000200000000F -:10512000000000000000200020000000000000003F -:1051300020000000000020002000000020002000CF +:1050E0000000000000000000400000000000200060 +:1050F000208020802080200400001000000020007C +:1051000088000000000088000000880000002000E7 +:10511000200020002000200000020000000000000D +:105120000003000000000000200400002000000038 +:1051300021002000200020002000000000000000CE :10514000000000000000000020000000000000003F -:105150002000000000002000200000008800200047 -:10516000000000000000000000020000000000003D -:10517000000000000040400000000002000040006D -:10518000000000000000000000000000000000001F -:1051900000000000000000000200000040000000CD -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C000400000000000000000000000000000009F -:1051D00000000000000000000000000000000000CF +:1051500020002000200420002004000000000000A7 +:10516000000010000000000000000000000000002F +:105170000000800490048004000100000000000092 +:10518000000000000000000000001000000000000F +:1051900000004000000400000000000000000000CB +:1051A00000000000000000000000000140000000BE +:1051B00000000200000000000000000000000000ED +:1051C00000000000000200020002000000000000D9 +:1051D00000020000000000000002000100000000CA :1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000040000000004E -:10522000000000000000000000000000000000007E +:1051F000000000000200000088408840000000001D +:10520000004000000000000000000000000000005E +:10521000000000000000000000000000000000008E +:10522000000000400000000000000000020000003C :10523000000000000000000000000000000000006E :10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:10526000000000000000000000000004000000003A -:10527000000000000000000000000000000000002E +:1052500082000200020000000200020000000000C4 +:10526000000000000000000000000000000000003E +:105270000000000000000900000000000000000025 :10528000000000000000000000000000000000001E :10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE -:1052D00000000000000000000000000000000000CE +:1052A00000000000000000000000000002000000FC +:1052B00005004100000000000000000000000000A8 +:1052C00000000000020002000000000000000200D8 +:1052D00000000000000000000000000000000200CC :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE :10530000000000000000000000000000000000009D -:105310000000000000000000000000090000000084 -:10532000000000000000000000000000000001007C -:10533000000000000000000000000000000000006D +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:105330000000000000000000040000000000000069 :10534000000000000000000000000000000000005D -:10535000000000000000000000000000000000004D +:105350000400000000000000000000000000000049 :10536000000000000000000000000000000000003D :10537000000000000000000000000000000000002D :10538000000000000000000000000000000000001D :10539000000000000000000000000000000000000D :1053A00000000000000000000000000000000000FD -:1053B00004000000000000000000000000000000E9 +:1053B00000000000000000000000000000000000ED :1053C00000000000000000000000000000000000DD :1053D00000000000000000000000000000000000CD -:1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000001009B -:105410000100040000000000000000000000000087 -:10542000000000000000000000000000000000106C -:105430000100010001000000000000000000000069 +:1053E00010000000000000000000000008000000A5 +:1053F000C000C00000000000000000000800000025 +:105400000000200000000800000000000000000074 +:10541000000000000000000000000000000000008C +:105420000000C000000000000000080000000000B4 +:10543000000000000000000000000000000000006C :10544000000000000000000000000000000000005C -:105450000000000000000000C0000000000000008C -:105460000000000000000000080000000000000034 +:105450000000001000000000000000000000C0007C +:105460000000000000000000000000040000000038 :10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:105490000400040080000000000000000000000084 +:10548000000000008000000000000000000000009C +:10549000000000000000000000000000000000000C :1054A00000000000000000000000000000000000FC -:1054B00000010400040002000000000000000000E1 +:1054B00000000000000000000000000000000000EC :1054C00000000000000000000000000000000000DC :1054D00000000000000000000000000000000000CC :1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC :10550000000000000000000000000000000000009B -:10551000000000000000000000000400040004047B -:105520000000C000000000000000000000000000BB -:10553000000000000000000000000040001100001A -:10554000000000000000000000000000000000005B -:105550000000000000000800000000000000000043 +:105510000000000000000000080000000000000083 +:105520000000000000000000000008000000000073 +:105530000000C00000000000820000000000000029 +:10554000000000000000000000110000000000004A +:105550000000000000000000000000000800000043 :10556000000000000000000000000000000000003B :10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B -:10559000000000000000000000000000800080000B -:1055A000800000000000000000000000000000007B +:1055900000000000000000000000000000400000CB +:1055A00000000000000000000000000000000000FB :1055B00000000000000000000000000000000000EB :1055C00000000000000000000000000000000000DB :1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000000000AB +:1055E00000000000040000000000000000000000B7 +:1055F000000000900000000000000000000000001B :10560000000000000000000000000000000000009A -:105610000000000000800000000000000100000009 -:105620000000000000000100000001000000000078 -:1056300000000000000000800000000000000000EA -:105640000009000000000000000000000000000051 +:10561000000000000000000000000000000000008A +:10562000000000000000000000000000000000007A +:105630000000000000000800000000000000000062 +:10564000000000000000000000000000000000005A :10565000000000000000000000000000000000004A :10566000000000000000000000000000000000003A :10567000000000000000000000000000000000002A :10568000000000000000000000000000000000001A -:1056900000000000000000200000000000000400E6 -:1056A00000000000000000004000000004000000B6 -:1056B0000000000000000000004000820000000028 -:1056C00000000000000005000000000000000000D5 +:1056900000000000000000000000000000400000CA +:1056A00000000000000000000000000000000000FA +:1056B00000000000000000000000000000000000EA +:1056C00000000000000000000000000000000000DA :1056D00000000000000000000000000000000000CA :1056E00000000000000000000000000000000000BA :1056F00000000000000000000000000000000000AA :105700000000000000000000000000000000000099 -:10571000000000000000000000C000900000000039 -:1057200000C000900000000000C0009100000000D8 -:105730000000000000000000000389C090080088FD -:10574000C082000000000000000000000000000017 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:105730000000000000000000000000000000000069 +:105740000000000400200008020800000000000023 :105750000000000000000000000000000000000049 :105760000000000000000000000000000000000039 :105770000000000000000000000000000000000029 :105780000000000000000000000000000000000019 -:105790000000000000000000000000800080000009 -:1057A00000000080008000000000088000910000E0 -:1057B00000000000000000000000000089808080E0 -:1057C0000080808000000000000000000000000059 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000000000000000000000000000E9 +:1057C00000000000008000000000800000000000D9 :1057D00000000000000000000000000000000000C9 :1057E00000000000000000000000000000000000B9 :1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:1058200080008080000000008000808000800000F8 -:10583000800080C0000000000000000000000000A8 -:105840000021008080000000000000000000000037 +:105800000000000000000000000000000040000058 +:105810000040000000000000000000000000000048 +:105820000000000000000000000000000000000078 +:105830000000000000000000000000000000000068 +:10584000000000000000000000A000800000000038 :105850000000000000000000000000000000000048 :105860000000000000000000000000000000000038 :105870000000000000000000000000000000000028 :105880000000000000000000000000000000000018 :105890000000000000000000000000000000000008 -:1058A00000008400C090000000008400C09000024E -:1058B00000008400C0900000000000000000000014 -:1058C000900090008882100000000000000000009E +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000000000E8 +:1058C00000000000000000000000001000A0000028 :1058D00000000000000000000000000000000000C8 :1058E00000000000000000000000000000000000B8 :1058F00000000000000000000000000000000000A8 :105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 -:1059200000000000009000C000000000849000C053 -:1059300000000000019000C0000000000000000016 -:10594000000088880088009089C0000000000000E6 -:105950000000000000000000000000000000000047 +:1059100000009000000000000000000000000000F7 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:1059400000000000000000000000820800080008BD +:1059500008880000000000000000000000000000B7 :105960000000000000000000000000000000000037 -:105970000000000000000000000000000000000027 +:105970000000000000000000010000000000000026 :105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A00000000000000000800080000000008080F7 -:1059B000088000000000118000800000000000004E -:1059C00000000000000000800080898000000000CE +:1059900000000000000000004000000000000000C7 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000100000000000C7 :1059D00000000000000000000000000000000000C7 :1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000000A7 +:1059F000000000000000000000000800000000009F :105A00000000000000000000000000000000000096 :105A10000000000000000000000000000000000086 -:105A200000000000801100020000000080118008CA -:105A300000000000A11183084100030000000000E5 -:105A4000000000000000800880108000800000003E -:105A50000000000000000000000000000000000046 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A500080000000000000000000000000000000C6 :105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 :105A80000000000000000000000000000000000016 :105A90000000000000000000000000000000000006 -:105AA0000000000000009000000000000000C001A5 -:105AB000200100000000C1012001000000000000E2 -:105AC0000000000000000000C000880190888800ED -:105AD00000000000000000000000000000000000C6 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00082000200400020000000000000000000E2 :105AE00000000000000000000000000000000000B6 :105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 -:105B200000000000000000000081000006000000EE -:105B300000210000060000000041000006000000F7 -:105B400000000000000000000000008100000600CE -:105B50000021000000000000000000000000000024 +:105B10000000000000000000000002E000000000A3 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B400000000000000000000000000000E0000075 +:105B50000000000000000000000000000000000045 :105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 +:105B700000000000000000000000000000E0000045 :105B80000000000000000000000000000000000015 :105B90000000000000000000000000000000000005 -:105BA000000000000000000000000000FFFF0000F7 -:105BB00000FF000000FF000000FF000000FF0000E9 -:105BC00000FF0000000000000000000000FF0101D5 -:105BD0001818201C00000000000000000000000059 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000C3C30F0F0C0F0CFF00000000FB :105BE00000000000000000000000000000000000B5 :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 :105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000FFFF76 -:105C3000000000FF000000FF000000FF000000FF68 -:105C4000000000FF00000000000000000000000055 -:105C500000001818003C00000000000000000000D8 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C5000000000000000555500FF0C000CF0000093 :105C60000000000000000000000000000000000034 :105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 :105C90000000000000000000000000000000000004 -:105CA0000000000000000000000000000000FF00F5 -:105CB0000000FF000000FF000000FF000000FF00E8 -:105CC000000000FFFFFF00000000000000000000D7 -:105CD000393C5A5A0C00000000000000000000008F +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD0000000000000000000FFEFFFEF00000000E8 :105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 :105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 :105D20000000000000000000000000000000000073 -:105D3000FF000000FF000000FF000000FF00000067 -:105D4000FF00000000FFFFFF000000000000000057 -:105D50000000000000000000000000000000000043 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D500000000000000000000000FFFF0000000045 :105D60000000000000000000000000000000000033 :105D70000000000000000000000000000000000023 :105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 -:105DB0000000030203380C0092C0038203380C0079 -:105DC00092C003E3033E0C0D82C0000000000000FF -:105DD00000000000A000203800400001000000008A +:105DA000000000650006000F200000000000000059 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD0000000000000610006000D0000000030001F :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 +:105E00000000000000610006000D0000000000001E :105E10000000000000000000000000000000000082 :105E20000000000000000000000000000000000072 :105E30000000000000000000000000000000000062 @@ -153104,7 +153104,7 @@ :105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 -:105EC0000000000000000040000000000000000092 +:105EC00000000000000000000000000000000000D2 :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 :105EF00000000000000000000000000000000000A2 @@ -153120,196 +153120,196 @@ :105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 :105FB00000000000000000000000000000000000E1 -:105FC0000000000000000000000000FF00FF0000D3 +:105FC00000000000000000000000000000000000D1 :105FD00000000000000000000000000000000000C1 :105FE00000000000000000000000000000000000B1 :105FF00000000000000000000000000000000000A1 :106000000000000000000000000000000000000090 -:106010000000000000000000000000000000000080 -:106020002000200020002000200020000000200090 -:1060300020002000000020002000200000000000C0 -:106040002000200020002000200020000000200070 -:1060500020002000000020002000200000000000A0 -:106060000000200000002000200020002000000090 -:106070002000200020000000200020002000000060 -:106080000000200000002000200020002000000070 -:106090002000200020000000200020002000000040 -:1060A00000000000000000000000000200000000EE -:1060B0001000000010001000000000000000400070 -:1060C0000000000000000000000000000000400090 +:106010000000000000000000000000002000200040 +:1060200020002000200000002000200000000000D0 +:10603000200020004000000020002000208004807C +:106040002000204020000000200020000000000070 +:10605000200020002000000020022000000320007B +:106060000000200020002000000020002000000090 +:106070000000200020002008000020032000000075 +:10608000000020002000200000002000200400006C +:106090000000200020002000008020002080100050 +:1060A00000000000000000000000000000004000B0 +:1060B0000000000000000000000000000000404060 +:1060C00080400000000140000002000000020000CB :1060D00000000000000000000000000000000000C0 -:1060E0000000000000002000000000000000000090 -:1060F000000200000000000000000000000000009E -:10610000000000000000000000000000000000008F -:10611000000000000000000000000000000200007D -:106120000000000000000000000000000000020865 -:106130000000000000000000000000000000084017 -:106140000000000000000000000000000000020845 -:1061500000000000000000000000000000000840F7 -:106160000000000008000010000000000000000017 -:1061700000400000000000000000000000000000DF -:1061800008400000000000000000000000000000C7 -:1061900008400000000000000000000000000000B7 -:1061A00008400000000000000000000000000000A7 -:1061B00000100000000800000008000800000000B7 -:1061C00000080000000000000000000000000000C7 -:1061D000001000000002000000080008000000009D -:1061E0000008000000008000000100000000000026 -:1061F000000000100000000000000008000800007F -:106200000000000800000000000000000000000086 -:10621000000000000000000000000008000800006E -:106220000000000800000000000000000000000066 +:1060E00000000000000000000000000000000000B0 +:1060F000000000000000000000030000000010008D +:106100000002000000020002000000020002000184 +:106110000000000000020002000000040000000473 +:10612000000000000008020000000000000800005D +:106130000210000000400040000000000840004045 +:10614000021002000100010008400200004000406F +:10615000020000000000000000000000000000003D +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:106190000000000002000200000001000100018078 +:1061A00003000008000400040008000000080000CC +:1061B00000082000000000020000000000000000B5 +:1061C000000000082008040404040000001000106F +:1061D00000080000000000000000000000000000B7 +:1061E000000000000008200800000000000000007F +:1061F0000000000800000000000000000000000097 +:106200000000020800080008000000000000000074 +:106210000000000800000000000002002000200034 +:10622000200420080000000000000000000000051D :10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E +:1062400000000000000000000000C000000000008E :10625000000000000000000000000000000000003E -:10626000000000110000000000000009010900000A +:10626000000000000000000000000000000000002E :10627000000000000000000000000000000000001E -:1062800000200000000000000000000000000000EE -:1062900000000000000000000000000900000000F5 +:1062800000000000000000001000000000000000FE +:1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE :1062C00000000000000000000000000000000000CE :1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000400AA -:1062F000000000000000000000000000000000009E +:1062E00000000000000000000000030000000000AB +:1062F0000500000000000084000000000000000015 :10630000000000000000000000000000000000008D :10631000000000000000000000000000000000007D -:10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D -:1063400000000000000000000000880000000000C5 -:10635000000000000000000000000100000000003C -:10636000000000000000000000000090000001009C -:10637000008000000000000000000000000000009D -:10638000000000000000000000000000000000000D +:10632000000000000000000000000000A0000000CD +:1063300000000000000000000000000082000000DB +:1063400000000000000000000000000000400040CD +:10635000000000000000000000001000000000002D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000010000800000000000008C :1063900000000000000000000000000000000000FD -:1063A00000020000000000000000000000000000EB -:1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD -:1063D000000000000000000000000000400000007D -:1063E0000000000000000000000000004109000063 -:1063F0000200000400000000000000000000000097 -:10640000000000000000000000000000000000008C +:1063A00000000000000000000000000000080000E5 +:1063B00000000000000000000000000000000010CD +:1063C000000000000000000000000090000000003D +:1063D00000000000000000000010000000000000AD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:106400000000000000000000200000040000000068 :10641000000000000000000000000000000000007C -:10642000410000010000000000000000000000002A -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C -:10645000000000000000200000000000000000001C -:10646000000000000000900000000000000001009B -:10647000018000800180000000400000000000005A -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000010000000EC +:106420000000000000000000000000040000000068 +:106430000000000000000000000000000000080054 +:1064400000000000C000000000000000000000008C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:106480000000000090000000000000080000000074 +:1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC +:1064B00000000000000000000000000000000800D4 :1064C00000000000000000000000000000000000CC -:1064D0000000000000000000000000840000000038 -:1064E000000000A00000000000000000000000000C -:1064F000100040100004040400002100000000000F -:10650000000000000000000000000000000000008B +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000200000000000007C +:10650000000000000000000000000000000020006B :10651000000000000000000000000000000000007B -:10652000000000000000000000000000000000006B +:1065200000840000000000000000000000000000E7 :10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000004000400090002B -:106560000000000000210100000000000000000009 -:106570000000008010800080010000000021000960 -:10658000000000000000000000000000000000000B +:10654000000000400000000000000000000000000B +:10655000000000000000000000000000000000003B +:10656000000000000000000000000000000000002B +:10657000000000000000000000000000000000001B +:106580000000000000000000000300000000000008 :1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB +:1065A00000000000000000000000000400000000E7 :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB -:1065E000000000000000000040000000000000006B -:1065F00000000000410880080004040000000002C0 -:106600004002400000000000000000000000000008 -:10661000000000000000000000A0000000000000DA -:106620000000000000000000000000000000050065 -:106630000500000000000000000000000000000055 +:1065E00000000000000000000000000000000000AB +:1065F0000008000000000000000000000000000093 +:10660000000000000000000000000000000000008A +:106610000000000008000000000000000000000072 +:106620000000000000000000000000000001000069 +:10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A -:106660000000000000000001A00000010000000088 -:1066700000000000000210C0A10901C0880800004D -:10668000000000000000000000000000000000000A +:1066500000000000000000000000009000000000AA +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:106680000000000000000000000000000000010009 :1066900000000000000000000000000000000000FA -:1066A0000000000000000000010090000000000059 +:1066A00000000000000000000000000000000000EA :1066B00000000000000000000000000000000000DA :1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E000000000000000000305080008000800008A -:1066F0000000000000000000008389100310000863 +:1066D000000000000000000000000000008000003A +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A :106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 -:106720000000000000000000000041000000000028 +:106710001100210000000000000000000000000047 +:106720000000000000000000000000000000000069 :106730000000000000000000000000000000000059 :106740000000000000000000000000000000000049 -:106750000000000000000000000000000000000039 -:106760000000000000000000100008000800418840 -:10677000000000000000000000000800890991806E -:10678000C110000000000000000000000000000038 -:1067900000000000000000000000000000000000F9 +:106750000000000000000000000080000000008039 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:10679000000000410900000300800000000000002C :1067A00000000000000000000000000000000000E9 -:1067B00000000000000000000000000000000000D9 +:1067B00000000020000000080000000000000000B1 :1067C00000000000000000000000000000000000C9 -:1067D00000000000000000000000000000000000B9 -:1067E00000000000000000000000010201000000A5 -:1067F00001A10000000000000000000089088901DC -:1068000091909101000000000000000000000000D5 -:106810000000000000000000000000000000000078 +:1067D00000000000000000000000000090C0000069 +:1067E00000020000000000000000000000000000A7 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000890100000000880000000066 :106820000000000000000000000000000000000068 -:106830000000000000000000000000000000000058 +:106830000000000000000000000100000000000057 :106840000000000000000000000000000000000048 :106850000000000000000000000000000000000038 -:106860000000000000000000000000000001000027 -:10687000010000000000000000000000000020886F -:10688000A109200989890000000000000000000023 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B00000000000000100000000000000000000D7 +:106860004090000000000000000000000000000058 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:10689000000000000000000088000000010000006F +:1068A00000000000000000000000000001000000E7 +:1068B00000000000000000000800000001000000CF :1068C00000000000000000000000000000000000C8 :1068D00000000000000000000000000000000000B8 -:1068E0000000000000000000000000000000002088 -:1068F000104010050005000000000000000000002E -:10690000000088A1110511C1000000000000000076 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:10693000002000030008001000000000000000001C +:1068E0000000008000000000000000000000000028 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000410036 +:106920000000000000000000000000000000100057 +:106930000000000000000000000000000000100047 :106940000000000000000000000000000000000047 :106950000000000000000000000000000000000037 :106960000000000000000000000000000000000027 -:106970002189210021001002000000000000000019 -:10698000000088A108C1C18088110000000000003B -:1069900000000000000000000000000000000000F7 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000110000E6 :1069A00000000000000000000000000000000000E7 :1069B00000000000000000000000000000000000D7 :1069C00000000000000000000000000000000000C7 :1069D00000000000000000000000000000000000B7 :1069E00000000000000000000000000000000000A7 -:1069F000000001C1000001000000000000000000D4 -:106A0000000000008821C1A108849101000000005D -:106A10000000000000000000000000000000000076 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000175 :106A20000000000000000000000000000000000066 :106A30000000000000000000000000000000000056 :106A40000000000000000000000000000000000046 :106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A7000000000000000000000008800000000008E -:106A80000000000000008421006006008200000079 +:106A6000000000000000000007040000000000001B +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 :106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB0000000000000000000000000004100000095 -:106AC00000000000000000000000000000000000C6 +:106AA00000E0000081410000000000000000000044 +:106AB00000E00000000000000000000000000000F6 +:106AC00002E00000000000000000000000000000E4 :106AD00000000000000000000000000000000000B6 -:106AE00000000000000000000000000000000000A6 +:106AE000000000000000000000000000FF000000A7 :106AF0000000000000000000000000000000000096 -:106B00000000000000000000000000002424BDBDC3 +:106B00000000000000000000000000000000000085 :106B10000000000000000000000000000000000075 :106B20000000000000000000000000000000000065 :106B30000000000000000000000000000000000055 :106B40000000000000000000000000000000000045 :106B50000000000000000000000000000000000035 -:106B60000000000000000000000000000000000025 +:106B60000000000000000000000000000000FF0026 :106B70000000000000000000000000000000000015 -:106B800000000000000000000000000000016000A4 -:106B9000F999000000000000000000000000000063 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 :106BA00000000000000000000000000000000000E5 :106BB00000000000000000000000000000000000D5 :106BC00000000000000000000000000000000000C5 @@ -153322,492 +153322,492 @@ :106C30000000000000000000000000000000000054 :106C40000000000000000000000000000000000044 :106C50000000000000000000000000000000000034 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C800000000000000000000000000000003800CC -:106C900018180004666200000000000000000000F8 +:106C60000000000000000000000000003C3C0000AC +:106C70000F0F0000000000000000000000000000F6 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 :106CA00000000000000000000000000000000000E4 :106CB00000000000000000000000000000000000D4 :106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 +:106CE00000000000000000000000000000003C3C2C +:106CF00000000F0F00000000000000000000000076 :106D00000000000000000000000000000000000083 -:106D100038BD181800006666000000000000000082 +:106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 :106D30000000000000000000000000000000000053 :106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 :106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D800000610006000D000000000000000000008F -:106D900000008060503FC0000000000000000000C4 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 -:106DC000000000610006000D00000000000000004F -:106DD00000000000000000000000000000000000B3 +:106D700000082A00054004A80000000000000000F0 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 +:106DA0000000000000000000000000400006000C91 +:106DB0000000000000000000000000610006000D5F +:106DC0000000000000000000000000650006000F49 +:106DD0002000000000000000000000000000000093 :106DE00000000000000000000000000000000000A3 :106DF0000000000000000000000000000000000093 -:106E000000004141EBEB000000000000000000002A -:106E1000000000003C00FCF00000F000000000005A -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E400000000000000000003F00AA550000000004 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E200000000000000000000000000000005555B8 +:106E3000FFFF000000000000000000000000000054 +:106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 :106E60000000000000000000000000000000000022 :106E70000000000000000000000000000000000012 -:106E80000000000050FA50FA04000000000000006A -:106E90000000000000003C003C20F0F000F000008A +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 :106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000003FAA55000084 +:106EB0005555000000000000000000000000000028 +:106EC00000000000000000000000000000000000C2 :106ED00000000000000000000000000000000000B2 :106EE00000000000000000000000000000000000A2 :106EF0000000000000000000000000000000000092 -:106F0000000000000000F0F0F070CF55F0510000DC -:106F10000000000000000000FC5FDC5F9C9C20DFA4 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 :106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 +:106F300000000000F0F00000000000000000000071 :106F40000000000000000000000000000000000041 :106F50000000000000000000000000000000000031 :106F60000000000000000000000000000000000021 :106F70000000000000000000000000000000000011 -:106F80000000000000000000FFFFFF7FCF55FC5D08 -:106F900000000000000000000000FC5FFC5F00003B +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 :106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 +:106FB000000000000000F0F00000000000000000F1 :106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE0000000000000002000200000000000200839 -:106FF0000000000000000000000000000000000091 -:107000000000000000002000200000000000200020 -:107010000000000000000000000000000000100060 -:1070200040000000000002002000080000000000F6 -:1070300020000000000200000000880000000000A6 -:107040000000000000000000200000000000000020 -:1070500020000000000000000000200000000000F0 -:10706000210000000000000021900000000000004E -:107070000000009000000000000000000000000080 -:1070800000000000000040000000000000000000C0 -:1070900000000000000000000000000000000000F0 -:1070A00080008000000000008000400080000000A0 +:106FD0000000000000000000000000002000000091 +:106FE0002000000020002000000000002000200001 +:106FF0002000000000000000000000002000000051 +:107000002000000020002000C00000002000200020 +:10701000200001000010020000000000000020021B +:107020000000200000002000880088000000000010 +:107030002000200000000000200088000000200048 +:107040000100200088002000880000000000880067 +:1070500020002000000000008800880000020000DE +:107060000000000000000000000000000000000020 +:1070700000000000000000000000000040000000D0 +:1070800000000000000200000002000200000000FA +:107090000002000008000001800000000000000065 +:1070A00000000000000000000000000000000000E0 :1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:10711000000000000000000010000000000000005F -:10712000000040004000000000800000100000004F -:10713000000000000000000000000000000000004F -:1071400000000000000400000000C000000000007B -:1071500000000000040004000180010000000300A2 -:1071600000000008000000000008000800080000FF -:107170000000000000000000000000080000000007 -:107180000000008400000000000800080008000063 -:1071900000000000000800000000000800000000DF -:1071A000000000008000800000000040000800088F -:1071B0000000000000080008000000000008400077 -:1071C00000000000000000000000000000080008AF -:1071D000000000000008800880082010200800003F -:1071E000A0000000000000000000000000000000FF +:1070C00000000200000000000000000000000000BE +:1070D000000000000000400000A000A00000000030 +:1070E0000000001000100000000000100000000070 +:1070F0000000000000000009000000000000000087 +:107100000000000000090000000000000010000066 +:10711000000000000000001000000000020000005D +:10712000000000000000000000000000000000005F +:107130000000000004000200000000000000000049 +:1071400008000000020502000040020004000400E4 +:107150000000020000000400000002000000000027 +:10716000000000080000000800080008008800086F +:1071700000000000000800000008000800044104AE +:1071800004000008000000040002000800000008DD +:107190000000000000080000000300020000800062 +:1071A00000000000000400000000000000080000D3 +:1071B00000040200000000080000000000000000C1 +:1071C000000082080000000000000000000800002D +:1071D0000000008400000008000000008200200081 +:1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F :10720000000000000000000000000000000000007E -:107210000000400000080000000000000000000026 -:10722000000000000000C00000020000000000009C -:10723000000000000000000000000000000000004E -:107240000002000000000000000000080000000034 -:10725000000000000000000001000000000000002D -:10726000000001000000000000000000000000001D +:10721000000000000000000000000000000000006E +:1072200000000000000000000000000000008200DC +:1072300082008200900000000000000000000000BA +:10724000000000000000000000000000000000003E +:10725000000000000000000000210000000000000D +:10726000000000000000000000000000000000001E :10727000000000000000000000000000000000000E :1072800000000000000000000000000000000000FE -:10729000000000008020000000000000400000828C -:1072A0004000000200000000000000010004000097 -:1072B000009000000000000000000000000000003E -:1072C00000000000000000000000000000000500B9 -:1072D000000000000000000011004000000000005D -:1072E000000000002000000000000000000000007E +:1072900000000000000000000000000000000000EE +:1072A00000000000000004000000000000000000DA +:1072B00000000000000000000000000000000000CE +:1072C0000000000000000000000000A0000000001E +:1072D00000000000000003000000000000000000AB +:1072E000000000000000000000000000000000009E :1072F000000000000000000000000000000000008E :10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:1073200000000000000000000080000000100000CD -:1073300000000000080008800000000000000000BD -:107340000000000082000000000000000000880033 -:107350000000080004000400C080000000800080DD -:10736000008000800000008000000000000000009D +:10731000100000000000000000000000000000005D +:1073200082008400840000000000000000000000D3 +:10733000000000000800080000000000000000003D +:107340000400000082000000C000A0000000000057 +:1073500000000000080008000000000000000040DD +:1073600000000000000008000040000000000000D5 :10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000010ED +:1073800008000000000000000000000000000000F5 :1073900000000000000000000000000000000000ED -:1073A000000040000000000000000002000000019A -:1073B000000000000000800000400000000000000D -:1073C000000000000000000041000000000000007C -:1073D00000000000000083008000000800000002A0 -:1073E0000020000400100002001000000000000057 +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D :1073F000000000000000000000000000000000008D :10740000000000000000000000000000000000007C -:107410000000000000000000000000000400000068 -:107420000000C00000004000001100000008400003 -:1074300000089080000400000000000090000000A0 -:107440000000002100000000000000000000080013 -:107450000000000084000400402008009000850027 -:10746000A0209080000008008200C0000000000002 +:10741000000000000000000000000000000000006C +:107420000000000000000000000000000008000054 +:10743000000000000000000000000000000000004C +:10744000000000000000A00000000000000000009C +:107450000000000000000000000500000000000027 +:10746000000000000000000000000000000000001C :10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC -:107490000000000000000000000000000002118851 -:1074A0000002118800C000200000000000000589D3 -:1074B000800420891102000000000000000000008C -:1074C00000000000000000000000000000000000BC -:1074D000000000000000000080000001000000002B -:1074E00008002101004000008000000000000000B2 +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000008C4 +:1074C0000000000000C00000000000840000000078 +:1074D00000000000000000000000090000000000A3 +:1074E0000000000000000000000010040000000088 :1074F000000000000000000000000000000000008C :10750000000000000000000000000000000000007B :10751000000000000000000000000000000000006B :10752000000000000000000000000000000000005B -:107530000000018000800000000200000021000027 -:10754000000500000000000000080000000000002E -:1075500000000000000000000000000083000000A8 -:10756000C1908505C1C085200000C1900000820047 +:10753000000000000000000000000000000000004B +:10754000000008000000000000000400000000002F +:107550000000000000020000000000000000000029 +:1075600000000000002100000000000000000800F2 :10757000000000000000000000000000000000000B :1075800000000000000000000000000000000000FB :1075900000000000000000000000000000000000EB -:1075A00000000000110000000000000000000000CA -:1075B0000000000040100002410000000000119097 -:1075C00009000000000000000008000000000000AA -:1075D0000000000008000800000041840000028450 -:1075E00008000803408404414001000008054100F0 -:1075F000000000000000000000000000000000008B +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000000000000000BB +:1075D00000000000000000000000000000000000AB +:1075E000000000000000000000000000000000009B +:1075F000800000000000000000000000000000000B :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A -:107620000000000100000001000100000000000057 -:1076300000000002901101091090889008A00088B5 -:1076400000A0200800000000000000000000000072 -:1076500000000000000000000000000010A000205A -:1076600000209010C1C10921C0889090A0C0049052 -:1076700083A00820000000000000000000000000BF +:107620000000000000000000000001C00020000079 +:1076300000880000000000000000000000000000C2 +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA -:1076A00000000000000800080020000800000000A2 -:1076B00000000000000000C10921890000030080D3 -:1076C000000000800000000000000000000000003A -:1076D00000000000000000000000000000008080AA -:1076E000000000008000A190888880838040808016 -:1076F0008040108380200000000000000000000097 +:1076A00000000000000000000000000021800080B9 +:1076B00000000000000000000000000000000000CA +:1076C00000000000000000000000000000000000BA +:1076D00000000000000000000000000000000000AA +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A :107700000000000000000000000000000000000079 :107710000000000000000000000000000000000069 :107720000000000000000000000000000000000059 -:10773000000000000000000020001000880041410F -:107740008000802080008000000000000000000019 -:107750000000000000000000000000000000000029 -:107760000000800300008080410009030509C1C1B9 -:1077700005000303400003030000000000000000B8 +:107730000040008000000000000000000000000089 +:107740000000000000000000000000000000000039 +:107750000000000000000000000000030000000026 +:107760000000000000000000000000000000000019 +:107770000000000000008000000000000000000089 :1077800000000000000000000000000000000000F9 :1077900000000000000000000000000000000000E9 :1077A00000000000000000000000000000000000D9 -:1077B0000000000000000000000088040900110023 -:1077C000A10108001001A082C0000000000000001C -:1077D00000000000000000000000000000000000A9 -:1077E00000002000820140000890209090010001DC -:1077F0009191900200012040004100000000000033 +:1077B00000000001001000000000000000000000B8 +:1077C00000000000000000000000000000000000B9 +:1077D0000000000000000000000000000001008424 +:1077E0000010000000000000000000000000000089 +:1077F0000000040090008400C000000000000000B1 :107800000000000000000000000000000000000078 :107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 -:10783000000000000000000000000000902101880E -:10784000A091A0A108200002009020C0000000002C +:1078300000008800000000000000000000000000C0 +:107840000000000000000000000000000000000038 :107850000000000000000000000000000000000028 -:10786000000000002090000800400210884189902C -:1078700005910201401101A18305908800000000DC +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 :1078800000000000000000000000000000000000F8 :1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000002100B7 -:1078B00002000000000000000000000000000008BE -:1078C0001041800800C1000000800000008000001E +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 :1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000008000008080009088 -:1078F0002103A1A1800980A0101002A103A0000013 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 :107900000000000000000000000000000000000077 :107910000000000000000000000000000000000067 -:107920000000000000000000000000000000001146 -:107930000000000000000000000000000000000047 -:107940000480400040004003001000000080000060 +:107920000000000000000000000000000000000057 +:1079300000000000000080000000000000000000C7 +:107940000000000000000000000000000000000037 :107950000000000000000000000000000000000027 -:107960000000000000000000802000108080000067 -:10797000A1000321A19009058080919085008511C7 +:107960008000000000008000000000000000000017 +:107970000000000000000000000000000000000007 :1079800000000000000000000000000000000000F7 :1079900000000000000000000000000000000000E7 :1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C000000001080190019001002000A090C0403B -:1079D000880000000000000000000000000000001F -:1079E00000000000000000000000C00040219040A6 -:1079F0008800C00000219103910104C091A10300FF -:107A000090010000000000000000000000000000E5 +:1079B0000000000000000000C000200020001000B7 +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000000000000000000A7 +:1079E0000000C0009000A000100000000000000097 +:1079F0000000000000000000000000000040004007 +:107A00000000000000000000000000000000000076 :107A10000000000000000000000000000000000066 :107A20000000000000000000000000000000000056 :107A30000000000000000000000000000000000046 -:107A400000000000600000600000000A000000006C +:107A40000000000000000000000000000000000036 :107A50000000000000000000000000000000000026 :107A60000000000000000000000000000000000016 -:107A70000600000000060000060082810000006091 -:107A80000600880000000000000000000000000068 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 :107A900000000000000000000000000000000000E6 :107AA00000000000000000000000000000000000D6 -:107AB00000000000000000000000000000000000C6 -:107AC00000000000000000000000CFEFDFFFC3C394 -:107AD000000080000C0C000000000000000000000E -:107AE000000000000000000000000000000033CC97 -:107AF000300350507C7C30300000802F802F0000FD -:107B0000002020E3D4FC0000000000000000000082 +:107AB00000000000000000000000000050FC0F006B +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000300000000000093 +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000000000000000000075 :107B10000000000000000000000000000000000065 :107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 -:107B400000000000000000000000000022002200F1 -:107B5000C1C30000000100000000000000000000A0 -:107B60000000000000000000000000000000000015 -:107B7000C3CC0003A050BC7C00000303208F208FE7 -:107B8000000000002020D7FF0000000000000000DF +:107B30000000000000000000000000000000500CE9 +:107B40000F00000000000000000000000000000026 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000200030000000010 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 :107B900000000000000000000000000000000000E5 :107BA00000000000000000000000000000000000D5 :107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000D0D0D050FFAA4C -:107BD000550040604060AA000F3C0000000000001B +:107BC000FF003C000000000000000000000000007A +:107BD00000000000000000000000000000000000A5 :107BE0000000000000000000000000000000000095 -:107BF000000030AA3055AAAA000000000404F0F0EA -:107C00000303C300030055145514000000000000D6 +:107BF0000000000000000000000000000000000085 +:107C0000000000000000D7D70000000000000000C6 :107C10000000000000000000000000000000000064 :107C20000000000000000000000000000000000054 :107C30000000000000000000000000000000000044 -:107C4000000000000000000000000000DFDFDF5F38 -:107C5000FFAADF8A00004040AA00F0C30000000035 +:107C4000000000003C0000000000000000000000F8 +:107C50000000000000000000000000000000000024 :107C60000000000000000000000000000000000014 -:107C70000000000030A030500FB00FB082000000B4 -:107C8000F0F00202C3C3171755145514000000008A +:107C70000000000000000000000000000000000004 +:107C8000000000000000000055FF0A0A000000008C :107C900000000000000000000000000000000000E4 :107CA00000000000000000000000000000000000D4 -:107CB000000000000000000000000000006100065D -:107CC000000D000000000000000000000000006146 -:107CD0000007C00C000000004000009000050000FC -:107CE0000000000000000000000000000000000094 -:107CF000000000000000A000000800000000A061DB -:107D00005036000D0000006120090009000000004D +:107CB00000000000000000000000000000000000C4 +:107CC00000000000A00050000000000000000000C4 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000A000F4 +:107CF0000000000000000000000000000000000084 +:107D0000000000000000000000000000000500006E :107D10000000000000000000000000000000000063 :107D20000000000000000000000000000000000053 :107D30000000000000000000000000000000000043 :107D40000000000000000000000000000000000033 -:107D500000000000000000400000000000000000E3 +:107D50000000000000000000000000000000000023 :107D60000000000000000000000000000000000013 :107D70000000000000000000000000000000000003 -:107D8000FBFB55FFFFFFF3F33E3D3E3DF5001414B2 +:107D800000000000000000000000000000000000F3 :107D900000000000000000000000000000000000E3 :107DA00000000000000000000000000000000000D3 :107DB00000000000000000000000000000000000C3 :107DC00000000000000000000000000000000000B3 -:107DD000000000800000FF000040000000000000E4 +:107DD00000000000000000000000000000000000A3 :107DE0000000000000000000000000000000000093 :107DF0000000000000000000000000000000000083 -:107E00000000FBFBFFFF7DFF7DFF0A050A05F50073 -:107E1000141400000000000000000000000000003A +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 :107E20000000000000000000000000000000000052 :107E30000000000000000000000000000000000042 -:107E4000000000FF01FF0000000000000000000033 -:107E5000000000004100EBFFFFFF3C0000000000BD +:107E40000000000000000000000000000000000032 +:107E50000000000000000000000000000000000022 :107E60000000000000000000000000000000000012 :107E70000000000000000000000000000000000002 -:107E800000000000CF3CFF052000F0000041004151 -:107E9000955555590000000000000000000000004A +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 :107EA00000000000000000000000000000000000D2 :107EB00000000000000000000000000000000000C2 -:107EC0000000000000FF00FF0000000000000000B4 -:107ED0000000000000004100EBFFFFDF3C0000005D +:107EC00000000000000000000000000000000000B2 +:107ED00000000000000000000000000000000000A2 :107EE0000000000000000000000000000000000092 :107EF0000000000000000000000000000000000082 -:107F0000000000000000CF00AA052000F0000CCF08 -:107F10000CCF9555555500000000000040000000B2 -:107F20000000000000000000000000000000000051 -:107F300000000000200040000000000000000000E1 -:107F40000000000000000000000000000000000031 -:107F5000C000000020000001C00004000000A000DC -:107F60000000000000000000880040000000400009 -:107F700000000005000020000000000000000000DC -:107F800010000000000000000000000000002000C1 -:107F90000000000000002000000000000000800041 -:107FA00000000090009000004000009000000000E1 -:107FB0000000000000400040414000000000004080 -:107FC00000020000000000000000000000000000AF -:107FD0000000000000000000000000008000000021 -:107FE000000000000002000000000000000000008F -:107FF0000000000000000000090000000000000078 -:1080000000008000000000000000000000000000F0 -:108010000000000000000000000000000000000060 -:1080200000800000000000000800000000000000C8 -:10803000000000000000000004000000000000003C -:10804000000000000000400040100000020000108E -:10805000080200000000A00009000000000000006D -:10806000000000004000400010110808000000005F -:1080700000000000000000000000080000000800F0 -:10808000000004000000A0004000080208000404F2 -:10809000202004000000000000080800000000008C -:1080A00000000002000000000000200000000000AE -:1080B00000080008000000000008C0880000400020 -:1080C0000000000000000000800880000000800028 -:1080D00000848009000000000084080000004000C7 -:1080E0000000000000008000800880040000000004 -:1080F0000000000000080008000800000008000060 -:108100008000000080000000000880088011808846 -:1081100080018001800800080008000000080000BD -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:108140000000000000000000000800000000000027 -:108150000000880000000008000800000000000087 -:108160002004A0200004408000000000000800005F +:107F00000000000000000000000000000000000071 +:107F1000000000000000000000002000200400001D +:107F2000000020000400000090202020200000001D +:107F30000000200000000000000020002000880059 +:107F40000000200020000000040020042004400065 +:107F50000000200000000001000088002000200038 +:107F60002000000020002000000000002000200071 +:107F70002000000020000000000020002000200061 +:107F80002000000020000000000000002000200071 +:107F900000000000200000001000000000000000B1 +:107FA000400000000040000010000001000100003F +:107FB00040020000000000C000C0410000000000BE +:107FC0000000000200000002000000A000A000006D +:107FD000000400000000000200000000000000009B +:107FE000000000000000000000000000400000024F +:107FF000000000020002000000020000000000007B +:10800000004000000040000200004000004000006E +:108010000002004000000000000008000000000016 +:10802000040000000000080008000010000000002C +:108030000400000000000000080000000000000034 +:1080400000000000000000000000000002000440EA +:10805000040000000000000000000000000000001C +:10806000000000000000000000000000000004000C +:108070000000000000000000000000000000000000 +:1080800000000000000000001000040000000000DC +:108090000000000000000000000002000008008452 +:1080A000000400100000000800840082000800089E +:1080B0000000800000100000001000000482000298 +:1080C0000000008200000008000000000008000816 +:1080D0000000000000000000000800000000000494 +:1080E000000800000000000000080000000000027E +:1080F00000840000000000000000000800000000F4 +:10810000000200000000000000080000000800005D +:108110000000000000000000000000080000000057 +:108120000000001000080000000000000000000037 +:108130000021000000000000000000080000000016 +:108140000008000001000000000000000000000026 +:10815000000000000000000000000000000000001F +:1081600000400000000000000000000000000000CF :1081700000000000000000000000000000000000FF -:108180000000000000800000000001110000000855 -:108190000000000001802004000000210005000014 -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D0000000000000000000090200000082000012 -:1081E0000000410021010000410200000090000059 -:1081F0000000000800000000000000000000000077 -:1082000000000300080041100000410004002100AC -:108210000500000000000420C10100000000000073 -:10822000000000000000000004000000000000004A -:10823000000000000000000000000000000000003E -:108240000010C0000000000000000000000000005E -:10825000000082100000000000000000000000008C -:1082600000000000080000A000000020000000083E -:108270000000A08084000000C0000000000000009A -:10828000000000000800000082000000A000400084 -:1082900000000000002100000000000000000000BD -:1082A0000000000000000000000080000000080046 -:1082B000000000000000000000000000000000A01E -:1082C00000000000000000000000000000000000AE -:1082D000000000000001000000000000000000009D -:1082E0000000000000000300002100000001000069 -:1082F00000000000002000900000000000000000CE +:1081800000000008000000000000000000000000E7 +:10819000000000000000000000000000C00000001F +:1081A00000000008000000000000000000000000C7 +:1081B000000000000000400000000000000000007F +:1081C00000000000000002000000000000000000AD +:1081D0000000000003000300000000000000000099 +:1081E000000000000000000000840000000000000B +:1081F000000000000000000000000000000000007F +:108200000000000000000000000000000000000866 +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:1082300008000020000000000000C0000000000056 +:108240000000000000008400840000000000000026 +:1082500000000021080000000000000000000000F5 +:10826000000000000000000000000000000000000E +:1082700000000000000008000000000000000000F6 +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000100000000000008000000B5 +:1082C0000000050000080000200000000000000081 +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E :10830000000000000000000000000000000000006D -:1083100080000000000000000800000000000000D5 -:108320000000000000000000080000000003000042 -:108330000000000800000000000000000000000035 -:108340000800000000000000000000000000000025 -:108350000000000000000000002100020011880061 -:108360008400080000000000C00404A00008C191BF -:1083700000050400000040000000000000000000B4 -:108380000000080000008200C000080090050800FE -:10839000C08001048821C0000102208001A001A04A -:1083A00000000000000000200000000000000000AD +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:1083300000000000000000004000000000000000FD +:108340000000000008000000000000000000000025 +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:108390000000000000000000000000000000A0003D +:1083A00000000000000000000000000000000000CD :1083B00000000000000000000000000000000000BD :1083C00000000000000000000000000000000000AD -:1083D000000000000000000000A000A000A000902D -:1083E00000C000008000000000002104A12004055E -:1083F0000420009021000090800000000000000098 -:10840000000000000000000000000000000000006C -:108410000000000840000000050040018020040525 -:1084200020050300030021002100000000000000DF -:1084300040000000000000000000000000000000FC -:1084400082000000000000000000000000000000AA -:1084500000000000000000000000002100210021B9 -:1084600000008400840000000008000020090400CF -:1084700000000420000000000002002000110000A5 -:108480000000000500000000000082218200900032 -:10849000C000A000C0000000000200000021002079 -:1084A00020200404000900098800000000000000EA -:1084B00000008000410000000000210000000000DA -:1084C00000000000000000000000000000000000AC -:1084D0000000080000000000000000000000000094 +:1083D000000000000000000000000000000000009D +:1083E00000900020000000000000000000000000DD +:1083F00000000090000000000000000000000000ED +:108400000000000000000000000000000300000069 +:108410000000000004000000000000000000000058 +:108420000000080000000000000000000000000044 +:10843000000000000000000000000000000000003C +:10844000000000000000000082000000008000002A +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000800000000F4 +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000080000000000D4 +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C0000000000008000000000000000002004062 +:1084D000000020000000000000000000000010006C :1084E000000000000000000000000000000000008C -:1084F0008000000080010000000000010001000079 +:1084F000000000000000000000000000000000007C :10850000000000000000000000000000000000006B -:108510000000000000000000000000010000080052 -:108520000001800180010000000000000000000048 +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B :10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:108550000000000000000000000088000000000093 -:1085600001000800000020C00010001000080003F7 -:1085700002A19182101190090101000090010000F8 +:10854000000000000000000000000000000000200B +:1085500000200002102000000000000000000000C9 +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB :1085800000000000000000000000000000000000EB -:10859000021040A0000282100040A108090400C09F -:1085A00010100090008204C10000000000000000D4 +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB :1085B00000000000000000000000000000000000BB :1085C00000000000000000000000000000000000AB -:1085D0000000000000000000000002000000000099 -:1085E0000000030000000000008000800080008088 -:1085F000000091C191050088809110410521001073 -:108600000003000000000000000000000000000067 -:1086100000008080800000800080038591A103031A -:1086200000038088008300030008000000000000B1 -:1086300000000000000000000080000000000000BA +:1085D00020000000008000000000000000000000FB +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:10862000000000000000000000000000000000004A +:10863000000000000000000000000000000000003A :10864000000000000000000000000000000000002A -:108650000080000000000000000009000200090086 -:1086600011008000000000008000800000008000F9 -:1086700080000000030089088980838005002000B5 -:10868000200000800000000000000000000000004A -:108690000000000000008000802180808500A0890B -:1086A0004140C10805004111401184000000000054 -:1086B00000000000000000000000000400000000B6 -:1086C00000000000000000000000000000000000AA -:1086D0000000000400000000000000000000000096 -:1086E000000000001000A0000088C0100800080072 -:1086F000A0001000000020002101A08483900090C1 -:10870000010001000008000000000000000000005F -:10871000000000000000A00082000201C090109044 -:10872000919002C1090104A0A00105019000000080 +:108650000000000000A10080800000000000000079 +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C000000000000000001000000010000000008A +:1086D00000000000100010C000A0C000000000005A +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 :108730000000000000000000000000000000000039 -:108740000000000000000000000000000000000029 -:108750000000000000000000000000000000000019 -:108760000000000000000000000000000000901069 -:1087700000000000030000004002000802A0020503 -:1087800000010000090100000000000000000000DE -:1087900000000000000000002040880200400202AB -:1087A000C0000100A0001001080501822082A1A1E3 -:1087B00000000000000000000000000500000000B4 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 -:1087E000000900090009001100020002000200094E -:1087F0000000000000008900000000C14105880859 -:10880000804100100303212100050000000000004A -:108810000000000000000000000080008080008058 -:108820000080804108058505802080A110894003D3 -:1088300040040000000000000000000000000000F4 -:108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 -:108860000000008000000000000800000000000080 -:1088700000000000008000800000000080210080D7 -:1088800080000040210000000000034000000000C4 -:10889000000000000000000000000000002000C1F7 -:1088A000000000002189109183804005A1A1A02132 -:1088B0004000034000000000000000000000000035 +:108740000000000000000000000008000000000021 +:1087500000000000000090880090002083200000AE +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000800000000000000A1 +:1087D0000000000000000000000000000000A100F8 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000020000008 +:108850000000000000000000000000008020000078 +:108860008000000000000000000000000000000088 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 :1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000000000000000000098 -:1088E0000000000000100000000000010200909055 -:1088F00002029000000000A00084000000000209B5 -:108900008820A0C0080101900000000000010000C4 -:108910000000000000000000000000000000000156 -:108920000089000000000510A1200808000011A126 -:108930009100898200000000000000000000008219 -:108940000000060000000000000000000000000021 -:10895000000000000000008200000700000000008E -:108960000000000000000000000000000000000007 +:1088D00000000000000000000000000020008210E6 +:1088E000080004000000000000000000000000007C +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000070000000000000000000000000010 +:1089600000000000410000000000000000000000C6 :1089700000000000000000000000000000000000F7 -:1089800000000000060000000021000006000000BA +:1089800000000000000000000000000000000000E7 :1089900000000000000000000000000000000000D7 -:1089A0000082000006008200000600600600500001 -:1089B00084210060060000000000000000000000AC +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000000B7 :1089C00000000000000000000000000000000000A7 :1089D0000000000000000000000000000000000097 -:1089E0000000000000000000000000000000000087 -:1089F000000200000000000000000000424242426D -:108A00000000F69090900F070F0700000000000094 +:1089E000C3C300FFFFF0003C0000000000000000D7 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 :108A10000000000000000000000000000000000056 -:108A2000000000000000F1F00000FFFF0000000067 -:108A30000000F00F0000999F669600000000000003 +:108A20000000000000000000000000000000000046 +:108A30000000000000000000000000000000000036 :108A40000000000000000000000000000000000026 :108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 -:108A70000000000200000000000000000000424270 -:108A800042420000F690B4B4FFFF00000000000076 +:108A600000000F0F999900F0003C0000000000008A +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 :108A900000000000000000000000000000000000D6 -:108AA0000000000000000000F0F0000006000600DA -:108AB000000000000000F00F8100420000000000F4 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 :108AC00000000000000000000000000000000000A6 :108AD0000000000000000000000000000000000096 :108AE0000000000000000000000000000000000086 @@ -153818,476 +153818,476 @@ :108B30000000000000000000000000000000000035 :108B40000000000000000000000000000000000025 :108B50000000000000000000000000000000000015 -:108B60000000000000000000000000000000000005 -:108B7000000000000000000000001818A5A589668C -:108B800089677666F6F60000FCFDFEFFF3F3C3FF8F +:108B60000000000000000F0F66FF06060C0C00005E +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 :108B900000000000000000000000000000000000D5 -:108BA0000000000000000000202020F05A002B00F0 -:108BB000FFFF6FFF1008200406F930CF00C0003F10 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 :108BC00000000000000000000000000000000000A5 :108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000000004242303091 -:108C000010FF10FF466606060000FFFFFFFFDBDBDC -:108C1000C3FF000000000000000000000000000092 -:108C200000000000000000000000202020205A006A -:108C30002B000F0B0F0B8001400200000000000C06 -:108C400000F3000000000000000000610026000D9D -:108C500000A0000000000000000000000000000074 -:108C6000000000000020000000A000000000000044 -:108C7000000000610006000D000000610006000D0C -:108C80000005000050000000000000000061000628 -:108C9000000D000000610026000D00A00000000093 -:108CA000000000000000000000000000000000388C -:108CB0000000000800600E3F000D00000061003C55 -:108CC000C0010000000000000000000000000000E3 -:108CD0000F0F0F0F00000000000000000000000058 +:108BE00000000000000000000F0F7EFF06060C0CC6 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000005000A080500F8 +:108C600000A0000000000000000000003000000034 +:108C700000050000000000000000000000000000EF +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000094 :108CE0000000000000000000000000000000000084 -:108CF00000000000000000000000008C00000000E8 -:108D00000080008C00000000000000000000000057 -:108D10000000FFBE0FC3C3C3414182C20000000078 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 :108D20000000000000000000000000000000000043 -:108D300000000000000028083C3CAA00BA000E0217 -:108D40003C3CC0C0FCC0000000000000000000006F -:108D500000000F0F0F0F00000000000000000000D7 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 :108D60000000000000000000000000000000000003 -:108D70000000000000000000000000000080000073 +:108D700000000000000000000000000000000000F3 :108D800000000000000000000000000000000000E3 -:108D9000000000000F3CFFF3C3C341410808949456 +:108D900000000000000000000000000000000000D3 :108DA00000000000000000000000000000000000C3 -:108DB000000000000000000000003C3C000030000B -:108DC0000E023C3CC0C0FCC00000000000000000DF +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 :108DD0000000000000000000000000000000000093 :108DE0000000000000000000000000000000000083 -:108DF00000000000000000000000000000300082C1 +:108DF0000000000000000000000000000000000073 :108E00000000000000000000000000000000000062 -:108E10000000C286C387F0F0F0F096964D0C00007B +:108E10000000000000000000000000000000000052 :108E20000000000000000000000000000000000042 -:108E30000000000000000000000000BF00FC0D5515 -:108E400000C3FCFCFDFD00C3008200000000000028 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 :108E50000000000000000000000000000000000012 :108E60000000000000000000000000000000000002 :108E700000000000000000000000000000000000F2 :108E800000000000000000000000000000000000E2 -:108E900000000000C3E7C3E741C37DFF96964D4D38 -:108EA00004000400000000000000000000000000BA -:108EB0000000000000000000000000003FFDFFFF78 -:108EC0000D0000C33C3C7D3DF0F0F0F000000000E0 -:108ED000000000000000000000000000880000000A -:108EE0000000C000000000000000A0000000C00062 -:108EF0002000000040004000000040002000000072 -:108F00004000200000000000880020000000200039 -:108F10002000400000014000200000001000200060 -:108F20000000000020000000400020002000400061 -:108F30000000000000002000000040004000000091 -:108F4000000000000000000000000004000000001D -:108F500000000000000000000000000000A0000071 -:108F6000000000000000000000000000000000C041 -:108F700041000000000000000000000000000000B0 -:108F800000000000000000000000000000000000E1 -:108F90000000400000000000000000000000000091 -:108FA00000000000200000000000000000000000A1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 -:108FE00000000000000000000080010001000000FF -:108FF0000000000000000000000000000000000071 -:109000000000000000000000002000000000000040 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000800000000000000000000002 +:108EF0000000100000000000000000800400A0003E +:108F0000C004040400000000000000040000000091 +:108F10000000200000010000000000000000000030 +:108F200020002000200000000002000000000000DF +:108F300000000000400400000000000000000000ED +:108F40002000200088000000000000000000000059 +:108F50000000000088000000000000000000000089 +:108F6000000000000000100400000000000000905D +:108F700041000000000000000000000000408000F0 +:108F800000000000000000000000000000000002DF +:108F900000000000000000000000000000000000D1 +:108FA00000000000000200000000000000000000BF +:108FB00000000000000000000002000200020000AB +:108FC00010000000400200024000400000080000C5 +:108FD0000000000000000000000000000020000071 +:108FE000000000000000000000040000000000007D +:108FF00000880000000000000000000000020000E7 +:1090000000100020002000200400000000000000EC :109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 -:109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000004000804 -:1090600000080008000800080008000220884008E6 -:109070000908000800080008000800000082000835 -:10908000400800080008000800080001000000086F -:1090900000080008000800080008000000000000A8 -:1090A000000800080008000800080008008400000C -:1090B000001009080008000800080008000040002F -:1090C0000008000800080008000800080000000070 -:1090D0000008000800080008000800080000000060 -:1090E000A0000000000000009000880000000000C8 -:1090F00000000000900000000000000000210000BF -:1091000000000000000000400003000001044000D7 -:1091100000000000100000004000000000000004FB -:1091200004009020000090218400000584000000CD -:109130000000000000000021000000000000000806 -:1091400000000000000000400000040000000000DB -:10915000000000000000000000000000000000000F -:1091600000000000000000000000000000000000FF -:1091700000000000000011000000000000000000DE -:1091800000000000000000000000000000000400DB -:10919000100000000000410000000020000000005E -:1091A00000200000000000201100008800000000E6 +:10902000020000000000000000000000000000003E +:10903000000000100000000000000400000000001C +:109040000000000002000200020000000200020016 +:109050000000000000000000000000000008000800 +:10906000000800000008008200080041008402841B +:10907000028200400000000400080000000800090F +:1090800009080000000900010009000000080000B4 +:1090900000080004000000080008000000000008AC +:1090A0000008000800000008000000080000000898 +:1090B000001000080002000000080008000000087E +:1090C0000008000800000008000000080000000878 +:1090D0000000000800040000000800080000000371 +:1090E0000040002100050040000000400000000892 +:1090F000000000100000000000000000000300114C +:10910000004000000020000000000080004000003F +:10911000000000090008000000000000000000003E +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:109150000000000000000000000000000800000007 +:1091600000000000000000000000210000000000DE +:10917000000000000308082008000320030000008E +:1091800000000000008800110088000200020000BA +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF :1091B00000000000000000000000000000000000AF -:1091C0000000000000000800000000000400000093 -:1091D000000000000000000000000000210000006E -:1091E0000000000000000800080000000009000066 -:1091F000000000000000000000000000000000006F -:1092000000000000900900000000000000000000C5 -:1092100000200000000000000000004100000000ED -:1092200000000800000000040841000200000000E7 -:1092300000008200000000000000000008000000A4 -:10924000000000000000000000000000000000001E -:109250000000000000000000000000004000C0000E -:1092600000000000080021000000030000000000D2 -:1092700011000000000000000000000000000000DD -:1092800000000000000000000000000000000000DE -:109290000000000100000000000000A0000000002D +:1091C000000000000000000000000000000000009F +:1091D000000000000000000000000000000000008F +:1091E000100000000800A000820000000800080035 +:1091F0000000000000008200A000000000008400C9 +:10920000A0020000000000000000000000000003B9 +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E +:109240000800000000000000000000000000000016 +:1092500008000020000000000004000000000000E2 +:109260000000000000A00000000008000000000056 +:109270000000000000000000000000C00000000826 +:10928000001041000000000021000000000000006C +:1092900000000000000000000000000000000008C6 :1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000100000A00000FE -:1092C0000800000003000000410005000800030042 -:1092D000100000001000000008000000080000005E -:1092E0000000000000000008000000000200000074 -:1092F000080000000000080000000000000000005E -:10930000000000000000000000000000000000005D -:10931000000000000000404082000000000000004B -:109320000000040400000000000000000000000035 +:1092B00000000000000000000000000000080000A6 +:1092C0000008000000000000000000000000000096 +:1092D000000000000000000000000000000000008E +:1092E0000008000000000000002000110010000035 +:1092F000000000008200000000008200080008005A +:1093000082008200000084009000A00000000002A3 +:109310000011000300000000000800000000000031 +:10932000000000000000000000000000000000003D :10933000000000000000000000000000000000002D -:10934000000000000800000008000000000000000D -:1093500000200000000000000000000008000000E5 -:109360000000000000000000000000840000000079 +:10934000000000000000000000000000000000001D +:1093500000000000000000000000000000000040CD +:1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED -:10938000000000A0000000000000000000000090AD -:109390000000000000880000100000A00000000095 -:1093A00000000000840100000000000400040088A8 -:1093B000040005001100050000000000000000008E -:1093C000000000000000000000000000008200001B -:1093D00000000400002011200420000000000040D4 -:1093E000000000000000000000000000000000007D -:1093F0000800080000090000000000000000000054 -:10940000000000210000000000000000000000003B -:10941000000000000000000000000000000000004C +:109380000000000000002000009000002084000089 +:1093900000000000000000000000000000001000BD +:1093A00000000000000000000000000000000000BD +:1093B00008000000000000000000000000000000A5 +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D +:1093E000000000000000000000000000100000006D +:1093F00000000000000000000821000082000000C2 +:109400008200080000000800400000000000820008 +:10941000002100000000000300090000000000001F :10942000000000000000000000000000000000003C -:109430000000000000000000000000000000000824 +:10943000000000000000000000000000000000002C :10944000000000000000000000000000000000001C -:109450000000000000000000000000000000080004 +:10945000000000000000000000000000000000000C :1094600000000000000000000000000000000000FC -:109470000000000000000000000021000084000047 -:1094800000000300000000000000000000000000D9 -:1094900000000000000000000000000800000000C4 +:1094700000000000000000000000000000000300E9 +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC :1094A00000000000000000000000000000000000BC -:1094B0000000000000C000000000000000A000004C +:1094B00000000000000000000000000000000000AC :1094C000000000000000000000000000000000009C -:1094D000000000004100000000200800000008001B -:1094E00000000088000000000000000000000000F4 -:1094F000000000000000000000000000000001016A -:109500000800000000000000000000000000000053 -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000000100003A +:1094D000000000000000000000000000000000820A +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:1095000000000000A002001000900002020288C0CB +:1095100000020003000001008200000000000000C3 +:10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B :10955000000000000000000000000000000000000B :1095600000000000000000000000000000000000FB :1095700000000000000000000000000000000000EB -:1095800003020008002000000000000000000000AE -:1095900000000000000000000000000000000000CB +:10958000000000000000800000000000008008854E +:10959000002100A000880000100000000000000072 :1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B :1095E000000000000000000000000000000000007B :1095F000000000000000000000000000000000006B -:109600000580090008002120000000000000000083 -:10961000000000000000000000000000000000004A +:1096000000000000000000000000002000800000BA +:10961000A000A18520808508028021001000401054 :10962000000000000000000000000000000000003A :10963000000000000000000000000000000000002A :10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A :1096600000000000000000000000000000000000FA :1096700000000000000000000000000000000000EA -:10968000000000C0000001000120000000000000F8 -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA -:1096B00000020000000000000000000000000000A8 +:1096800000000000000000000000000000000002D8 +:1096900000000882031011A08201000201080000EE +:1096A0000089000000000000000000000000000031 +:1096B00000000000000000000000000000000000AA :1096C000000000000000000000000000000000009A :1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A :1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 -:109730000000000000000000020000000000000027 +:10970000000000000000000000000000402000A059 +:10971000000488A0020200020210100200000000F3 +:109720002001000100000000000000000000000017 +:109730000000000000000000000000000000000029 :109740000000000000000000000000000000000019 :109750000000000000000000000000000000000009 :1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 -:10978000000000000000000320052003004000004E -:1097900000000000000000000000000000000000C9 -:1097A00000000000000011000000000000000000A8 -:1097B00000000000410000000000800000000000E8 +:1097800000000000000000000000000000000000D9 +:109790000080008000008080208090808000092070 +:1097A000000300210008000000000000000000008D +:1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 :1097D0000000000000000000000000000000000089 :1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 -:10980000000000000000000002A121110800400338 -:109810000000000000000000000000000000000048 -:109820000000000000000000000200000000000036 +:109800000000000000000000002000000000000038 +:109810000008800000000000A1089080088002205D +:109820000380080808004005000000000000000058 :109830000000000000000000000000000000000028 :109840000000000000000000000000000000000018 :109850000000000000000000000000000000000008 :1098600000000000000000000000000000000000F8 :1098700000000000000000000000000000000000E8 -:109880000000000000000000000000A10001000036 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 +:1098800000000000000000000000000000000000D8 +:109890000000000020002000000041888902C04034 +:1098A0004100000401000000000000000000000072 :1098B00000000000000000000000000000000000A8 :1098C0000000000000000000000000000000000098 :1098D0000000000000000000000000000000000088 :1098E0000000000000000000000000000000000078 :1098F0000000000000000000000000000000000068 -:1099000000000000000000000000000000000060F7 -:1099100000008100000000000000000000000000C6 -:1099200000000000000000000000000000810000B6 -:1099300006000000608200600700000000000000D8 +:10990000000000000000000000000000810000E0F6 +:109910000000000000000000000000000000000047 +:109920000000000000000000070000000000000030 +:109930000000000000000000000000000000000027 :109940000000000000000000000000000000000017 :109950000000000000000000000000000000000007 :1099600000000000000000000000000000000000F7 :1099700000000000000000000000000000000000E7 :1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 +:1099900000000000000055055505000C001CFF00EC +:1099A000C3C320E023E3000000000000000000002B :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 :1099F0000000000000000000000000000000000067 :109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000036 +:109A10000000000000000000FF0FFF0F000C001C02 +:109A200055550F0F20E023E3000000000000000068 :109A30000000000000000000000000000000000026 :109A40000000000000000000000000000000000016 :109A50000000000000000000000000000000000006 :109A600000000000000000000000000000000000F6 :109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000000B6 +:109A9000000000000000000000000000C2FA00000A +:109AA0000000FF3CFF3C7F757A7000000000000062 :109AB00000000000000000000000000000000000A6 :109AC0000000000000000000000000000000000096 :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 +:109B1000000000000000000000000000C2FAC2FACD +:109B200000000000FF3CCB082F252A200000000089 :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 -:109B900000000000000000610004000D0000000053 -:109BA00000000000000000000000000000000000B5 -:109BB000000000000000050000200000000000611F -:109BC0000026800D00A00000000000000000000042 +:109B900000000000000000610006800D00000000D1 +:109BA00000000010000000613006000D000105619A +:109BB0000A0E050D00A000000000000000000000DB +:109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 :109BF0000000000000000000000000000000000065 :109C00000000000000000000000000000000000054 -:109C100000000000000000000F5F5F5FAA00AA00C4 -:109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000EAFA00000000000050 +:109C30008082C0C3FFFF0C0C000000000000000089 :109C40000000000000000000000000000000000014 :109C50000000000000000000000000000000000004 :109C600000000000000000000000000000000000F4 :109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 -:109C9000000000000000000000000F4F5F5F202068 -:109CA00000000000000000000000000000000000B4 -:109CB00000000000000000000000000000000000A4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000EBFF00000000CA +:109CB0000000A0AAF0FFD3DFD3DF00000000000007 :109CC0000000000000000000000000000000000094 :109CD0000000000000000000000000000000000084 :109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 :109D00000000000000000000000000000000000053 -:109D1000000000000000000000000000000400043B -:109D2000FF00FF0000000000000000000000000035 -:109D30000000000000000000000000000000000023 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000C2FA77 +:109D3000E9E9C34100000000D0D0D00000000000DD :109D40000000000000000000000000000000000013 :109D50000000000000000000000000000000000003 :109D600000000000000000000000000000000000F3 :109D700000000000000000000000000000000000E3 :109D800000000000000000000000000000000000D3 :109D900000000000000000000000000000000000C3 -:109DA0000000AFAF0303000000000000000000004F -:109DB00000000000000000000000000000000000A3 +:109DA0000000000000000000000000000000C2FAF7 +:109DB000C2FAFDFDFF7D00000000F0F0F0F00000B1 :109DC0000000000000000000000000000000000093 :109DD0000000000000000000000000000000000083 :109DE0000000000000000000000000000000000073 :109DF0000000000000000000000000000000000063 :109E00000000000000000000000000000000000052 -:109E10008800000000008800200000030008000007 -:109E20002000900000008800C000880088008800A2 -:109E300088008800000020002000000000000400CE -:109E40002000200000002000200020002000200032 -:109E500000032000200000002000200088000000F7 -:109E600088008800000040004000C0000000400260 -:109E7000840000000000000000002000000000003E -:109E8000A0000000000000000000000000008400AE -:109E90000000400000000000000000000000000280 -:109EA000410041822100009000A04000000000001D -:109EB00000000000000000000000000000000000A2 -:109EC0000000090000020000000000000000000087 -:109ED0000000000000001000000010000000000062 -:109EE000000000000002000000000000000000046C -:109EF0000000000000000000000000000000000062 -:109F00000000000005000900000000000000000043 -:109F1000000200000000000000000000000000003F -:109F200000000040000000000000000000000000F1 -:109F300000000210000000000000001000000000FF -:109F400000000040000000000000000000000000D1 -:109F50000000204000000000004000000000000061 -:109F600000000000000000000000000300000000EE -:109F70000000000020100000001000100000000091 -:109F80000000000000400000000000000000000091 -:109F900000000000104000080008000800080082CF -:109FA00000080090000000840008008400080008F9 -:109FB0000008000800080008000800080008000069 -:109FC0000008000400000000040800000008000869 -:109FD00000080008800800000008000800080008C9 -:109FE0000000000800080000000000080000000851 -:109FF000000800080008C008000800080008000861 -:10A000000000000800100084000000840000000828 -:10A01000000800080008800800210000000400007B -:10A0200000000009C004900000020000C000000011 -:10A0300000000000000000000020000000050000FB -:10A0400000000000000000000000000040000000D0 -:10A050000000900000000000000000008821902116 -:10A06000900090050005000084000000000300211E -:10A0700000000005000000000000000300210002B5 -:10A080000000004000039000000090000008000065 -:10A0900000000000000000000010000000000000B0 -:10A0A0004000000008000800080000002100000037 -:10A0B00000000000000000000000000000000000A0 -:10A0C0000000000000400000000000000000000050 -:10A0D0000000000000000000000000000000090077 -:10A0E000000011000000000000000000000000005F -:10A0F0000000000000000000000008000000000058 +:109E100000000000000000004000200000000000E2 +:109E200000000000000500028800000000000000A3 +:109E300000001000000000000000200000000000F2 +:109E400000000000000000002000000000000000F2 +:109E50000003000020000004400400042000000073 +:109E600000000009000000000000200000000000C9 +:109E700000000000200000002000C00020000000C2 +:109E800000000000000000000000200000000000B2 +:109E900000000000000000000000100000000000B2 +:109EA000000000000000008800000000000000002A +:109EB000000000001000000000002000000400006E +:109EC000000200000000000000000000000000048C +:109ED0000000000000004000000000000002000040 +:109EE0000000000000000000000000001002000060 +:109EF00010020000100200004040000200001002AA +:109F0000000200001000000000820040000000007D +:109F10000000000008000000000000000000000039 +:109F200000000000004000000000000000000000F1 +:109F300000402000004000400000000000400040C1 +:109F400000000000004000000000000000000000D1 +:109F500000002000000000000000000000000000E1 +:109F600000000000000000000000000000000000F1 +:109F700000000000200000000000000000000000C1 +:109F800000000000000000000200020008000000C5 +:109F90000000000020400008000800080008000839 +:109FA0000008000800080008000000080008000081 +:109FB00000000008800000080008000800080008F1 +:109FC0000008000800080008000000080008000061 +:109FD0000084000880000000000800080008000855 +:109FE0000008000800080008000800000008000839 +:109FF00000000000000880000008000800080008B9 +:10A000000008000800080008000800000008000818 +:10A010000000000000088000000000000000002197 +:10A0200000000000000000000000040000000441E7 +:10A030000000002000000009000000210021202174 +:10A04000000000000000002100000021002100218C +:10A05000000000000000002100000021002100217C +:10A060000021000000030000002100210021000366 +:10A07000002100000000000000210021002100005C +:10A08000002100000000000000210021002100004C +:10A090000021000000000000002100040084008274 +:10A0A00000000000040000000000410041000088A2 +:10A0B000050008004000110000400390000040002F +:10A0C00000400000002000040000000000040040E8 +:10A0D0000000000000000000000000000000000080 +:10A0E0000000000000000000000000000000000070 +:10A0F0000000000000000000000000000000000060 :10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000820082003B -:10A120000000A000A00082008200C000C0008200E9 -:10A130000000000000000000000000040800000013 -:10A1400000100000000000000000000000040000FB -:10A15000000000000000840000001010000010004B -:10A1600000000000000000000004000008000400DF -:10A1700000000000080008000800080082008200BB -:10A1800008000000C00000008200000000009000F5 -:10A190000000000008001000000008000880000017 -:10A1A0000000000000000000400000000800000067 -:10A1B00000004100000003000000000000890000D2 -:10A1C000000000000000000000000000000000048B +:10A11000000000000000000000000000000000003F +:10A1200000000000080000000000000040000000E7 +:10A130000000000008000000000000000000000017 +:10A14000000000000002000000000000000000000D +:10A1500000000000000000000000000000000000FF +:10A1600000000000000000000000000000000000EF +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A1900000000000000000000000000000000000BF +:10A1A0000000000008400000000000000000000463 +:10A1B0000088000000000000000000000000030014 +:10A1C000000000000000000000000000000000008F :10A1D000000000000000000000000000000000007F -:10A1E00000000000000000040000009000000020BB -:10A1F0000084080000000000000000A000000040F3 +:10A1E000000000000000000000000000000000006F +:10A1F000000000000000000000000000000000005F :10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000043A -:10A2200008000000000040000000A0000000400006 -:10A23000000000000000000000000000000000001E -:10A2400000000000000000000000000000000011FD -:10A2500000000000004000000000000000000005B9 -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000020000A0030000000039 -:10A280000005080000000000000382000000000834 -:10A29000080808080000080010008400C000C00082 -:10A2A000C00000000000000000000000000011904D -:10A2B000000000900000000200000000000000000C -:10A2C000000000000000000000004004000000004A -:10A2D000000000000000000000000000000000106E -:10A2E00000000000009000000004000000000000DA -:10A2F000002000000000000000000000000000003E +:10A21000000000000000000000000000000000003E +:10A2200000000000000000000000A0210400000069 +:10A2300000000000000000000000000000000021FD +:10A2400000000000000000000000200000000040AE +:10A2500000000000000400000000000000000021D9 +:10A2600000000000000000000000000020000000CE +:10A2700000000002000000000000000000110000CB +:10A2800000210000000090000000000020000000FD +:10A2900000000000000000000000000000000000BE +:10A2A0000021000000000000080000000000000085 +:10A2B000040000000000000000000020400000003A +:10A2C0000000008240900020004003200000404039 +:10A2D000008200900000000000000000000000006C +:10A2E000000000000000000000000000000000006E +:10A2F000000000000000000000000000000000005E :10A30000000000000000000000000000000000004D -:10A3100000000088000000000000000000000000B5 -:10A3200000000000A000080000008200000084007F -:10A33000000000000000000000000000000000001D -:10A34000000000A00000000000000000000000006D -:10A3500000080000000000000000000000210021B3 -:10A3600000000000000000050000000000050021C2 -:10A37000000000000008082100210000000000216A -:10A380000021000000000005000040000805400812 -:10A3900008000000002100000000C00000000800CC -:10A3A0000000A000100000000000000000000000FD -:10A3B0000000000000000000000000900088000085 -:10A3C0000000000020080000000000000000000065 -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000002000000020002D +:10A31000000000000000000000000000000000003D +:10A320000000000000000800000000000000002104 +:10A330000000000000000000000000000000000815 +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000021DC +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A39000C0000000000000000000000000000000FD +:10A3A00000000000000000000000000000000300AA +:10A3B000210000000000000000000000000000007C +:10A3C000000000000000000000000010000000007D +:10A3D0000000000040000400000000000000000039 +:10A3E000000000000000000000000000000000006D :10A3F000000000000000000000000000000000005D :10A40000000000000000000000000000000000004C -:10A410000000000000000000000400000000000038 -:10A42000000000004000000000010001000100C029 -:10A430000001820100C000830000000100020082D0 -:10A440000001400100C10000000000000000000009 -:10A4500000000000000000000000000000020000FA +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A4300001000000000000000001000000C000005A +:10A44000000000000000000000000000000000000C +:10A4500001000000000000000000000000C000003B :10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000002DA -:10A4800000000000000000000000000100010001C9 -:10A4900000C00001000100C001A100010001008214 -:10A4A00000400001400100C10000004100410041A6 -:10A4B00000850041004100C003C100104041008000 -:10A4C0000000004100410083000000000000000087 -:10A4D000000000000000000000000009090000006A +:10A47000000001000000000000000000010000C01A +:10A4800000000000000000000000000000000000CC +:10A49000000001000000000000000000000000C0FB +:10A4A00000000000000000000000000000000000AC +:10A4B00000004100000000000000001010000080BB +:10A4C000000000000000000000000000000000008C +:10A4D00000004100000000000000000210000080A9 :10A4E000000000000000000000000000000000006C -:10A4F0000000000000000000000000000002020058 -:10A5000000000000000000000000000000410041C9 -:10A51000004100C00041004100C002410010404124 -:10A5200000000000004100410083000041000300E2 -:10A530000000008041009000000020000200900018 -:10A54000000089004100C10000808000000011006F -:10A550000000000000000000000000008800100063 -:10A560000000000080000000000000080003000060 -:10A570001000000000000000000000000000890042 -:10A580009000000000008000000000000008410072 -:10A590000300000000804100900000004000020025 -:10A5A0002000000083004100C10000808000010005 -:10A5B0000100000000C00100C100000000004100D7 -:10A5C00004080020C0004100C10000828200000099 -:10A5D000000000000000000000000000000011006A -:10A5E000889000C088000800000000000001000002 -:10A5F000000000000000000000000000000000005B -:10A600001000089000C08800080000000000000151 -:10A6100001000100000000C00100C10000000000B6 -:10A62000410082080020C0008300C1000082820037 -:10A6300000C00001C0C100000000000100C1C00551 -:10A640000021000100C10000000000010000000026 -:10A6500000000000000000000000000000000000FA -:10A6600000040000000000000000000000000000E6 -:10A6700000000000000000000000000000000000DA -:10A6800000000004000000000000000000000000C6 -:10A69000000000C00001C0C100000000000100C0B7 -:10A6A000C00500C1000100C1000000000001000061 -:10A6B00000000080004180C10000000000410083D4 -:10A6C00080900041004100C10000000000410041B5 -:10A6D000000000000000000000000000000000007A +:10A4F0000000000041000000000000000002030016 +:10A5000000800000000000000000000000000000CB +:10A5100000000000410000000000000000020500F3 +:10A5200000800000000000000000000000000300A8 +:10A530000000008000008000000000008200890010 +:10A54000008800000000000000000041000003003F +:10A5500000000080000080000000000083008900EF +:10A560000088000000000000000000410000000022 +:10A570000300000000800000800000000000830055 +:10A5800090000088800000000000000000410000F2 +:10A590000300000000800000800000000000830035 +:10A5A0009000008800000000000000000041000052 +:10A5B0000100000000C0000020000000000040007A +:10A5C000102000C102000200000000000001000095 +:10A5D0000100000000C0000020000000000040005A +:10A5E000102000C102000200000000000001000075 +:10A5F00000000100000000C000002000000000007A +:10A600004000100800C1101002000000000000010E +:10A6100000000100000000C0000020000000000059 +:10A620004000102000C110000200000000000001E6 +:10A6300000000000C000000000000000000000005A +:10A640000088000000000000000000000000000082 +:10A6500000000000C000000000000000000000003A +:10A660000088000000000000000000000000000062 +:10A67000000000000000C00000000000000000001A +:10A680000000008800000000000000000000000042 +:10A69000000000000000C0000000000000000000FA +:10A6A000000000880000C000000000000000000062 +:10A6B000000000000000800000000000000000001A +:10A6C000000000000000000000000000000000008A +:10A6D00000000000000080000000000000000000FA :10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000000005A +:10A6F00000000000000000008000000000000000DA :10A700000000000000000000000000000000000049 -:10A71000000000000080004180C1000000000041F6 -:10A72000008380C00041004100C1000000000041E2 -:10A7300000410000C100800080C100004100000510 -:10A7400002004100C14100008008000041400000BB -:10A75000800041000011800000C1000000000000E6 -:10A760000000000000C10000001000000000000018 -:10A770000000000000000010800000C10000000088 -:10A7800000000000000000C1800000080000000080 -:10A79000000000000000C100800080C100004100F6 -:10A7A000000005004100C1C1800080080000414058 -:10A7B000000080004100C1004000C0C10000010055 -:10A7C000880089000100C1919000C00000000100D4 -:10A7D0000000C00001000000200000400000000058 -:10A7E0000000000000000011020000000000000056 -:10A7F00000000000000000000000200000400000F9 -:10A800000000000000000000001110000000000027 -:10A810000000000000000000C1004000C0C10000B6 -:10A820000100200082000100C1050400C0000000FA -:10A8300001000000C0000100000000000000004214 -:10A8400000000000000000068112004807004800D8 -:10A8500000000000000000000000000000000000F8 -:10A860000000000000000000810000E0000048003F -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000810000E0000067 -:10A890004800000000000000000000000000000070 -:10A8A0000042000000000000000A8112004807007A -:10A8B0004800000000000000000000000000000050 +:10A7100000000000000000008000000000000000B9 +:10A720000000000000000000000000000000000029 +:10A73000000000000000800000C1000000000000D8 +:10A7400000000000004100000004000000000000C4 +:10A75000000000000000800000C1000000000000B8 +:10A7600000000000004100000004000000000000A4 +:10A770000000000000000000800000C10000000098 +:10A780000000000000000041000000040000000084 +:10A790000000000000000000800000C10000000078 +:10A7A00000000000000000C10000000400000000E4 +:10A7B0000000000000000000400000C10000000098 +:10A7C0000000000000000005020000000000000082 +:10A7D0000000000000000000400000C10000000078 +:10A7E00000000000000000850200000000000000E2 +:10A7F00000000000000000000000400000C1000058 +:10A800000000000000000000000502000000000041 +:10A8100000000000000000000000400000C1000037 +:10A8200000000000000000000041020000000000E5 +:10A8300000000000000000000000000000000042D6 +:10A840000000000000004800810000E00000488295 +:10A850000000000000000042000000000000004274 +:10A860000000000000004800810000E00000488275 +:10A870000000000000000042000000000000000096 +:10A8800000420000000000004800810000E00000DD +:10A8900048820000000000000042000000000000AC +:10A8A00000420000000000004800810000E00000BD +:10A8B000488200000000000000420000000000008C :10A8C0000000000000000000000000000000000088 :10A8D0000000000000000000000000000000000078 :10A8E0000000000000000000000000000000000068 @@ -154303,210 +154303,210 @@ :10A9800000000000000000000000000000000000C7 :10A9900000000000000000000000000000000000B7 :10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000757BA7 +:10A9B0000000000000000000000000000000747BA8 :10A9C0000000000000000000000000000000000087 -:10A9D000000000000000000000000000DEAE747BFC +:10A9D000000000000000000000000000DE2E747B7C :10A9E0000000000000000000000000000000000067 :10A9F000000000000000000000000000DE2E00004B :10AA0000747B000000000000000000000000000057 :10AA10000000000000000000000000000000DE2E2A -:10AA2000757B000000000000000000000000000036 -:10AA30000000000000000000000000000000DEAE8A -:10AA400060C603000000000000000031E0000000CC -:10AA5000000000000C0000000000000000C06306C1 -:10AA6000615603400000000000000230A00000001A +:10AA2000747B000000000000000000000000000037 +:10AA30000000000000000000000000000000DE2E0A +:10AA4000615603400000000000000231E0000000F9 +:10AA5000000000000C4000000000000002C06A86F8 +:10AA6000615603400000000000000231E0000000D9 :10AA7000000000000C4000000000000002C06A86D8 -:10AA80000000615603400000000000000230A000FA +:10AA80000000615603400000000000000231E000B9 :10AA90000000000000000C4000000000000002C0A8 -:10AAA0006A8660C603000000000000000031E0007C -:10AAB0000000000000000C0000000000000000C0CA -:10AAC000630600020000000400000000000088008F -:10AAD0001000080020020000A010100000008400F8 -:10AAE0000000840004000000100088000000200026 -:10AAF0001000400040004000000020000020200026 -:10AB0000880000034000204040000800880040000A -:10AB100020004000200020002000880020000000CD -:10AB200000008800000020002000400020000000FD -:10AB300000002000000020000400000000080000C9 -:10AB40000000020000000000000000000000000003 -:10AB50000000000089000500000020010000000046 -:10AB6000090000000000400000000000100000008C -:10AB700040000900100200000000000000000091E9 -:10AB8000000000000000000040010000A0004000A4 -:10AB900000000000000000004000400040000004F1 -:10ABA000000020000000090000000000000000007C -:10ABB000000000008000000009008000000000008C -:10ABC0000000000000000000000000000000000085 -:10ABD00000008200000000850080000090800000DE -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC0000000001800000000001000080020000043C -:10AC1000000000000000000000000000000000092B +:10AAA0006A86615603400000000000000231E000A9 +:10AAB0000000000000000C4000000000000002C088 +:10AAC0006A86008020020000C00000000000000034 +:10AAD00000000000880000100000000000020000DC +:10AAE0000010000020000000000000000000000234 +:10AAF000000000002000000400000000000000042E +:10AB000000040003004120000000000400080000D1 +:10AB10000000000000002000000000000000000015 +:10AB20000000000000002000000000000000000005 +:10AB300000000004000020000000000000000000F1 +:10AB400000000000004000000000000000000000C5 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000040040000A1 +:10AB70000091000200000000000200000004000438 +:10AB80000000004000000000000400000000000081 +:10AB900000000000100000000000000000000000A5 +:10ABA0000000400000001000410000000000000014 +:10ABB0000000000000000000000040000000000055 +:10ABC000000000000000000000000000000000097C +:10ABD00000000000008000000000000000000000F5 +:10ABE0000000000200000000000000200000000043 +:10ABF000000000000000000000000000080000004D +:10AC00000000000000400000000000000000000004 +:10AC10000000000000000000000000000200000032 :10AC20000000000000000000000000000000000024 -:10AC300000000000000000001000000000000009FB -:10AC40000100000000000000008400000000000877 -:10AC5000000200000000000000400040000800105A -:10AC600000020000000000040000000000000002DC -:10AC700000000000000000000008000000080020A4 -:10AC800000000200200400820000200002400000BA -:10AC90000001038800000000000000080088000890 -:10ACA000000000820000000000840000000000009E -:10ACB000000800000000000000000008000000087C -:10ACC000000004000000000000080000000000096F -:10ACD000000000000000000000090088000088005B -:10ACE0000400000000000000000000100000000050 -:10ACF0000000000000000000000000004000000014 -:10AD000000000000000090000000000000000200B1 -:10AD100040000504000000000002000000000000E8 -:10AD20000000000000000000000000000000000023 -:10AD3000000000000000000000000008000000000B -:10AD400000000000000000000008000000000800F3 -:10AD5000000011000300000003000000080200884A -:10AD60000000000800900000000800000000000043 -:10AD700000000000000000000000000000000800CB -:10AD8000000000000008000000A00000000000001B -:10AD90008000000008010088000000000000100092 -:10ADA000000000000000000200000084000000001D -:10ADB0000000410000000000030008A00000410066 -:10ADC0000000000000000000210000004100A00081 -:10ADD000000000000000C0000000C00000000100F2 -:10ADE000000000000000821100050009C0080000FA -:10ADF000100004000400C000000000000800000271 -:10AE00000000000000008205A0000000000000001B -:10AE10000809008000091004080000000000080074 -:10AE20008200000000000000820040000000C0001E -:10AE300008001000000004000000000000000000F6 -:10AE40000800001108400840000000000000000059 -:10AE500000000000000000000000000000000000F2 -:10AE600040000000000000000000000000000000A2 -:10AE700000000000000000000000000000000000D2 -:10AE800000010000000000000000000400004184F8 -:10AE9000000000000040110000050000000000005C -:10AEA00000000000000000000000000000000000A2 -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED00000000000A0000000A00000000000000032 -:10AEE00000009000000000100000000000000000C2 -:10AEF000000000000400000000000000000000004E -:10AF000000000800820082004000000000000000F5 -:10AF10000800000001000000000000A00000820006 -:10AF200000000000C0000000000000000000000061 -:10AF300000000800000000000000080000000800F9 -:10AF4000000008008200A0000000000000000000D7 -:10AF500000000800000000000000000041000000A8 -:10AF600041200088030008000001000000000000EC -:10AF700000000000000000000000000000080000C9 -:10AF80000000000020000008000010840000000401 -:10AF90000000808400002020000000040004000065 -:10AFA00000000000000020000000000000840000FD -:10AFB0000000000000080000000000000000030482 -:10AFC000000000200000000000000000030000005E +:10AC30000000000002000000000000000000000012 +:10AC40000000004000000000001000000000008232 +:10AC50004110000009080002000000000000000090 +:10AC600000000010008400840000000000000000CC +:10AC700000080000000800C000000008000880086C +:10AC800000000000000000000000000000000000C4 +:10AC900000840010400000040004000800080008C0 +:10ACA0000208000000000000000000000000020098 +:10ACB00002000084000000000000000800080008F6 +:10ACC00002080084110000000000000000000000E5 +:10ACD0000000000000000000004000000000000034 +:10ACE00000000000040000100000100084000000BC +:10ACF0000800000084008440C00800080000000034 +:10AD00000000000000000000000000000000000043 +:10AD100000000000002000200020000000000000D3 +:10AD20000000000300000000000000000009000017 +:10AD30000000000000000000000000000000000013 +:10AD400000000000002000000000000000000000E3 +:10AD50000000000000002000000040000000000093 +:10AD60000000000000820000000000000000000061 +:10AD7000000000000000200000200000000800008B +:10AD80000000000000820000000000000000000041 +:10AD900000000000000000010001000100000008A8 +:10ADA0000000000000000008000000840000100007 +:10ADB000000000000000000020000000000000086B +:10ADC00000000000000000A0000000820000000061 +:10ADD000400000000100000000000000000800002A +:10ADE0000000000000000000000000000000000063 +:10ADF000000004000400000000000000000000004B +:10AE00000000000000090000000000000000000039 +:10AE10000000000000000000008000200020002052 +:10AE20000000000000000000000000000000000022 +:10AE300000400000000000000000000000000000D2 +:10AE400000000040000000000000000000000000C2 +:10AE5000030000000000040000C0410041000008A1 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000008000000000000000000CA +:10AE800000000000000000200000000000000000A2 +:10AE9000000000000000000000000520000100018B +:10AEA000000100A000000000000000000000000001 +:10AEB0000000000000000000000000000200000090 +:10AEC00002000000000000000000000000C01000B0 +:10AED0000000000000038220820000080000000043 +:10AEE0000000000000000000000000000000002042 +:10AEF000000010000000000000080000000000003A +:10AF00000000000000000000000000000000000041 +:10AF100000000000000000000400002100004000CC +:10AF20000020000000000000000000000000000001 +:10AF3000000500000000000000000000000000000C +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000001000000000000F0 +:10AF60000000000000000008000804080084000041 +:10AF70000040000010000900000000000000000078 +:10AF80000000000040000008000800080000000069 +:10AF900000000000000000000000000000000000B1 +:10AFA0000000000100000000000800080008000088 +:10AFB0002000000000000000000000080000000069 +:10AFC0000000000000000000000800080008000069 :10AFD0000000000000000000000000000000000071 -:10AFE00000000000008000000000000000040000DD -:10AFF000000500080000000000080000000000003C -:10B0000000000000000020002000000008000000F8 -:10B01000000000000008000000040040004001089B -:10B02000000400000000000000000000000000001C -:10B0300000000000000000210000000000080000E7 -:10B0400000000200000000000000040000000000FA -:10B0500008000000000000000000000000000000E8 -:10B0600000000000000000200000000000000001BF -:10B0700000000000000000000000000020000000B0 -:10B0800000C000000000000020008000000003005D -:10B0900000000000000000C00000000100000000EF -:10B0A0000800000000000040000000000000000058 +:10AFE000000000000000000000000000000300005E +:10AFF0000000000000002021000000000800000008 +:10B0000000000000000000000000000000200021FF +:10B0100000210021000000000000000000000000EE +:10B0200000000100000000000021000000000000FE +:10B030000000000000000000000000000008000008 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B060000000000000A00008000000000000000038 +:10B0700000100000000000000000000000000000C0 +:10B080004000000011004104000000000300030024 +:10B0900000000000000000000000000005000000AB +:10B0A000000000000400000000000000000000009C :10B0B0000000000000000000000000000000000090 -:10B0C000000000000000410000000000210000001E -:10B0D0000000000000000000000000000000000070 -:10B0E00000000000000000000000C11190910091DC -:10B0F000200400000000000000000000000000002C -:10B10000000000000000000000000000000100003E -:10B1100000000804019002A020A00003010100012A -:10B120008401000100000000000000000000000099 +:10B0C0000000000000000000000020000000000060 +:10B0D00000040000000000000000000090000010CC +:10B0E000000001000200400000000000000000001D +:10B0F0000000000000000000000000000000000050 +:10B10000000000010000000100000000000000003D +:10B11000000000000000000000000000000000002F +:10B120000000000010080090001008080000000057 :10B13000000000000000000000000000000000000F :10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000089C0808393 -:10B17000001000200000000000000000000000009F -:10B1800000000000000000000000000000080003B4 -:10B190000020004083800300808000800000202089 -:10B1A00021218004000400000000000000000000D5 +:10B15000000000000000000000000000110080005E +:10B160000000000008008440800200000000000091 +:10B1700000000000000000000000000000000000CF +:10B18000000000000008000800100003000000009C +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000A0800080000000000000FF :10B1B000000000000000000000000000000000008F :10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000008080005F -:10B1F00080030080800000000000000000000000CC -:10B2000000000000000000000000000000000080BE -:10B21000000000000010030084098980A180000064 -:10B2200091801000030008410000000000000000B1 +:10B1E00000800000008020002100400003020000D9 +:10B1F000000000000000000000000000000000004F +:10B200000000000000004080210020002009800094 +:10B21000800080000000000000000000000000002E +:10B220000000000000000000000080080000800016 :10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000030000FB +:10B2400000000000000000000000000000000000FE :10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000008D6 -:10B27000100090019040C08200000000000000001B -:10B2800000000000000000000000000000000000BE -:10B2900000C00000000000090200118440A0C102AB -:10B2A0000000099000000000008500000000000080 -:10B2B000000000000000000000000000000000008E +:10B2600000000020000000C000900100000001016B +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000104010001000000B7 +:10B29000080008000800A0000000000000000000F6 +:10B2A0000000000000000000000008000201000093 +:10B2B00090000000000000000000000000000000FE :10B2C000000000000000000000000000000000007E :10B2D000000000000000000000000000000000006E -:10B2E00000000000000000000000000000008400DA -:10B2F000000002880140089083C0000000000000A8 -:10B30000000000000000000000000000000000003D -:10B31000000000000100010000000803008410018B -:10B320000404000000000000000100000000000014 -:10B33000000000000000000000000000000000000D +:10B2E000000001000088880001000001000000014A +:10B2F000000100000000000000000000000000004D +:10B30000000000000000000000000000010000003C +:10B31000000000000000000000000000000000002D +:10B3200000000000000000000000000000100010FD +:10B3300000002002000000000000000000000000EB :10B3400000000000000000000000000000000000FD -:10B3500000000000004000029020000201000000F8 -:10B3600000000000000000000000000000000000DD -:10B37000000000000000418041004080000000000B -:10B3800000000000000000000000000000000000BD -:10B39000000000000000030010000800808800206A -:10B3A0000010000500000009040441210004000011 -:10B3B000000000000000000000000000000000008D +:10B3500000000000000000000000000000000000ED +:10B3600000000000410000800000090000200308E8 +:10B37000402100200000000000000000000000004C +:10B3800000000000000000000000000000001000AD +:10B39000100000000000000000000000000000009D +:10B3A000000000000000000000000000000000009D +:10B3B000000000000080000000000000000000000D :10B3C000000000000000000000000000000000007D -:10B3D000000000004000008000808000008010001D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000200808000000000004B -:10B40000000000000000000000000000000000003C -:10B410000000000000000821110041000800800524 -:10B4200080088080000000000889080000002008D3 -:10B43000000000000000000000000000000000000C +:10B3D000000000000000000000000000000000006D +:10B3E0000000000000000011000000800000038049 +:10B3F000100008000900000000000000000000002C +:10B40000000000000000000000000000000021001B +:10B4100010000800051000000000000000000000FF +:10B42000000000000000000000000000000000001C +:10B43000800000000000000000000000000000008C :10B4400000000000000000000000000000000000FC :10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B47000000000000000000002000020082004007E +:10B46000000000000000000000010000004000009B +:10B4700000A000000000000000000000000000002C :10B4800000000000000000000000000000000000BC -:10B4900000000000000000000001010000000000AA -:10B4A0004000889082408800000001C00100000038 -:10B4B000000100000000000000000000000000008B +:10B4900001820000000000010000004000400000A8 +:10B4A000000000000000000000000000000000009C +:10B4B00000009000101008080800000000000000C4 :10B4C000000000000000000000000000000000007C :10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F00000000021000007000000488200600600F4 -:10B5000082000000000000000000000000000000B9 -:10B5100000000000000000000000000000600000CB -:10B52000880041820060060000000000000000600A -:10B530000000500A000000000000000000000000B1 +:10B4E0000000000000000000000000000000070055 +:10B4F00082210000000000000000000000000000A9 +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B5300000000000004100000700000000000000C3 :10B5400000000000000000000000000000000000FB -:10B550000000000082000060000000000000000009 -:10B5600006000000000A00000700000000000000C4 -:10B57000000000000000000000000000F0F0E0E02B -:10B580000303FC9900000000000000000000000020 +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B570000000F0F0000000000000000000000000EB +:10B5800000000000000000000000000000000000BB :10B5900000000000000000000000000000000000AB -:10B5A0000000000067666666C7C7C3C300000000EE -:10B5B000000000000000000000000000000000008B +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000FCFFFCF0FFFF00000000A6 :10B5C000000000000000000000000000000000007B :10B5D000000000000000000000000000000000006B -:10B5E00000000CFCFCFC000000000000000000005B -:10B5F0000000000000000000000000000000F0F06B -:10B60000F0F00303FC000000000000000000000058 +:10B5E000000000000000000000000000000000005B +:10B5F00000000000F0F0000000000000000000006B +:10B60000000000000000000000000000000000003A :10B61000000000000000000000000000000000002A -:10B6200000000000000066666666C3C3C3C3000076 -:10B63000000000000000000000000000000000000A +:10B62000000000000000000000000000000000001A +:10B6300000000000000000000C0F0C00363636360B :10B6400000000000000000000000000000000000FA :10B6500000000000000000000000000000000000EA -:10B66000000000000CFCFCFC0000000000000000DA +:10B6600000000000000000000000000000000000DA :10B6700000000000000000000000000000000000CA :10B6800000000000000000000000000000000000BA :10B6900000000000000000000000000000000000AA @@ -154515,494 +154515,494 @@ :10B6C000000000000000000000000000000000007A :10B6D000000000000000000000000000000000006A :10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B70000000004FF00FF06002424000000000000E9 +:10B6F00000000F0F0000FFFF00000000000000002E +:10B700000000000000000000000000000000000039 :10B710000000000000000000000000000000000029 -:10B72000000000000000000000000F0F2F2F990004 -:10B73000BF3C000000000000C3C3C3C30000000002 -:10B7400000000000000000000000000000000000F9 +:10B72000000000000000C2C2F7F7000000000000A7 +:10B7300000000000000000000000000024E427E7F3 +:10B740000F0F0F0F000000000000000000000000BD :10B7500000000000000000000000000000000000E9 :10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B780000000000004DF00DF660024240000000049 +:10B77000000000000F0F00000000000000000000AB +:10B7800000000000000000000000000000000000B9 :10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000009F0FBF2FFD -:10B7B00000003F3C000000000000C3C3C3C3000002 -:10B7C0000000000000000000000000000000000079 +:10B7A0000000000000000000C240F7E300000000BD +:10B7B000000000000000000000000000000024E481 +:10B7C00027E72424BDBD00000000000000000000A9 :10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000049 -:10B800000020000000A000610036809D00050000BF -:10B810000000000000000000000000000000000028 -:10B8200000000000000000610004000D0000006145 -:10B830000E36C0050005000000610002000900018D -:10B8400000000000000000000000000000000000F8 +:10B7F00000000000000005002A00054000A80061CC +:10B800000006000D00000000000000000000000025 +:10B8100000000000000000000000000000000061C7 +:10B820000006000D00000000000000000000000005 +:10B830000000000000000000000000000000000008 +:10B8400000000020000000000000000000000000D8 :10B8500000000000000000000000000000000000E8 -:10B8600000610006800D00000000000000000000E4 -:10B8700005000020000000000000000000000000A3 -:10B8800000000000000000000000000000000000B8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000FFA2A23C2020200000000000000000D9 :10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000EFE0FF0000000000CA -:10B8B00000000000DF005F0000000000FFFF00103C -:10B8C0000010000000000000000000000000000068 +:10B8A000EAFA0000000000000000000000000000B4 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 :10B8D0000000000000000000000000000000000068 :10B8E0000000000000000000000000000000000058 :10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 +:10B900000000FFFFF3F30000000000000000000053 :10B910000000000000000000000000000000000027 -:10B9200000000000000000000000FF00FF00000019 -:10B93000000000000000FF00FF000000EB41EB41B1 -:10B9400000001010000000000000000000000000D7 +:10B920000000EBFF0000000000000000000000002D +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 :10B9500000000000000000000000000000000000E7 :10B9600000000000000000000000000000000000D7 :10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 +:10B9800000000000FAFAFAFAFCFFFCFF00000000D9 :10B9900000000000000000000000000000000000A7 -:10B9A000000000000000000000000000FFD78AFF38 -:10B9B0000000000000000000FFFF00C00000410088 -:10B9C000010100FF00000000000000000000000076 +:10B9A000000000008082C0C3F0C3FF55000000000B +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 :10B9D0000000000000000000000000000000000067 :10B9E0000000000000000000000000000000000057 :10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000DF0F48 +:10BA000000000000000055FF55FFC0C3FCFF000010 :10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000FFDF38 -:10BA3000FFAA0000000000000000FFFF00C000009F -:10BA40000000000071717171000000000000000032 +:10BA2000000000000000A0AAF0FFFFFF5555000035 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 :10BA500000000000000000000000000000000000E6 :10BA600000000000000000000000000000000000D6 :10BA700000000000000000000000000000000000C6 -:10BA80000011000000000000000000002000000085 -:10BA90000000C00000002000840000000000020040 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000002000000000030003200040 -:10BAC000000000000400001000004000400084005E -:10BAD00040001000000000002000000000000000F6 -:10BAE0002000400040000000400000004002000034 -:10BAF000040020000000000000000008000000001A -:10BB000000000000000000000000400000000000F5 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000020000000013 -:10BB300010001000000000000000000000000000E5 -:10BB400000000000000000821000100000900002C1 -:10BB50004000100000000000000000000000000095 -:10BB60000000000000000000000010004000000085 -:10BB70000000840000000000000000000000000041 -:10BB800000000008000000000000000000000000AD -:10BB90000000021000000000000000000000000093 -:10BBA00000001010000000000000008000000000F5 -:10BBB00000401040040004100000010900000000D3 -:10BBC000000002080000000000000000000000402B -:10BBD00000400000001000000010080000000000FD -:10BBE00000000000004000000040000000000000D5 -:10BBF000000000000010000000000008000000002D -:10BC000000000000084000000000000000000000EC -:10BC100000000000000800004100000000040000D7 -:10BC20000000000000C00000000000000020000034 -:10BC30000000000000108000888400000400000064 -:10BC40000000000000C00000000000000000000034 -:10BC50000000000000000040000000080000000894 -:10BC600000000000000000100000000800000000BC -:10BC7000000000000000000000000040000000087C -:10BC800000000000000000000000000000000408A8 -:10BC90000000000000009000000008000000080004 -:10BCA0000000000000000000000000000000000094 -:10BCB0000400040000000000000000000400000078 -:10BCC000000000000000000000000000000800006C -:10BCD0004000000000000000000000000000000024 -:10BCE0000200000000000000000000000000000052 -:10BCF00000000000000000000800000082000000BA -:10BD0000080000000000000000000000000000002B -:10BD1000000000000000000008000000000000001B -:10BD20000000000000000000000000000000000013 -:10BD30000000800080000800000000000800800073 -:10BD4000110800000000000000000000400000009A -:10BD50000002008800040000000000000000000055 -:10BD60000040000800000000000000000008000083 -:10BD700000000000000000000800000000000000BB -:10BD800000000000030003000000000000000000AD -:10BD900000000000000000000000000000000000A3 -:10BDA0000000001000000000000000000000000083 -:10BDB0000000000000000000000000000000004043 -:10BDC0000000904000000000000000410000000062 -:10BDD000000000090000000000000000000000005A +:10BA8000880020000000840020008800000020843E +:10BA90008800000000000000000088000000200076 +:10BAA00000002000000000002000008000000202D2 +:10BAB0002000010000000020000020820020202043 +:10BAC000000300002000001100002000000000041E +:10BAD000200020800000000400040002200000007C +:10BAE00020000000200000000000200000000000F6 +:10BAF00020002000000000000000000020000000E6 +:10BB00002000000000000000000000000000000015 +:10BB100000400000000000000000000400000000E1 +:10BB2000000000000002000000000000000400000F +:10BB3000809100000400000040010000002000018E +:10BB400000050000000000000000000000000000F0 +:10BB5000000000000004000008832101000400022E +:10BB60000000009000000002000000004002000001 +:10BB70000002000040000000000000020000000081 +:10BB8000400000000840000000000000000000002D +:10BB90000040000008008400840000000000000055 +:10BBA000000000400010000000000000880020009D +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000002000000020000035 +:10BBD000000000000004010000000100010000005E +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000002000005040000000400000036 +:10BC0000000000000000000000000084028800081E +:10BC100000000010004000000000000000000008CC +:10BC200000100008000800000004000000000008E8 +:10BC3000000809840004000800080200020000084F +:10BC400000080004000800000000000100000001DE +:10BC5000000800080000000020040204200020006A +:10BC600000080008000400040000000000000000BC +:10BC700000080002000000000000800000008000BA +:10BC800000020002000002000000A000000000020C +:10BC90000000000000080000000000040003000095 +:10BCA0000000080400000000000004004000000044 +:10BCB000002100002000200000000080040010008F +:10BCC000002000000008000000000000000000004C +:10BCD000000400000000000000000000020200005C +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000021000000000012 +:10BD10000000000000080000000800080008000003 +:10BD200000000000040000000000000040002100AE +:10BD300008000000000080008000000800208082D1 +:10BD400000000001040000000000000041000000AD +:10BD500000001100000000000000000000040004CA +:10BD600000000000000011000000000000080000BA +:10BD700000000000000000000000000000A0000023 +:10BD8000000000000000000000000000080000218A +:10BD90000000000082000800820800000800000087 +:10BDA0000000080082000891820008008200000064 +:10BDB000A000100000000000A02100000000000909 +:10BDC0000000000000000000000000000000004132 +:10BDD0000000000000004005000000050005000014 :10BDE0000000000000000000000000000000000053 -:10BDF00008000000004008000800004000000000AB -:10BE00000000000000000000000000000000000032 -:10BE10000000000000000090000000000000000092 -:10BE20000000000000000000000000000000000012 -:10BE3000008800000000000000000000000000007A -:10BE400000C0000000000890000002000000000098 -:10BE5000000000000000000000000004000000904E +:10BDF0000000000000000000000000001010101003 +:10BE000000411000100500000000000000000300C9 +:10BE100000080000400000000000000000000000DA +:10BE200000100000004000100040000080000000F2 +:10BE300000000000000000000000000008000000FA +:10BE400000000000000000000000000000000000F2 +:10BE50004100000000000000800000000000000021 :10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000110008000000A9 -:10BE80001140000000400000000000000000000021 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000009000000000000000059 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000009000880000000009 -:10BF200000000000050800020000110000000000F1 -:10BF30000000000000000000000000000000000001 -:10BF40000000000008000500000020882084009008 -:10BF500000000000009000040084000000000004C5 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000040000AD -:10BF90000000080000000000000000000000000099 -:10BFA0000000000000000000000000000000000091 -:10BFB00000000000000000000000000000008800F9 -:10BFC0000100010500040000000000040000004121 -:10BFD0000000000300000000000800000000000056 -:10BFE0000000004000000000000000000000000011 +:10BE700000000000000000000000000000000000C2 +:10BE80000000000010001000000000000000000092 +:10BE90000011000000110841000000000004000033 +:10BEA0000000000800000000000000080000000082 +:10BEB00008000000000008000000088000000000EA +:10BEC00000110000880000000000102000000000A9 +:10BED00000000000000000009000000000000000D2 +:10BEE00040110004000000000004000000000000F9 +:10BEF0001000000000200000000000000000000012 +:10BF00000000000020000020000000009000000061 +:10BF100088000000000000000084000000A0000075 +:10BF200040000000000000000000000000000000D1 +:10BF300000001000000000000000050003040000E5 +:10BF400000000000000000000300000000010000ED +:10BF500000000000000000000000000000000004DD +:10BF60000000800000000000000000010000000050 +:10BF700000000000000000200000000000000000A1 +:10BF800000000000000000000000000000000000B1 +:10BF9000000000000041000000000041000000001F +:10BFA000000000020000000000000000000000008F +:10BFB0000800000000000000A00082000000000057 +:10BFC00000000000002000400000002100000000F0 +:10BFD00000000000000000800080008000000000E1 +:10BFE000000000000800000400000004000400023B :10BFF0000000000000000000000000000000000041 :10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C0300000000000000000000000200000000000E0 -:10C0400000000400040000000808110011010000B5 -:10C0500000000000000000000000000000000302DB -:10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000200000002001188000000000040D3 -:10C090000000000000000008000000000000000098 -:10C0A0000000000000000000000000000000000090 +:10C0100000000008002100000000000000000300F4 +:10C020000300030003000000000000000000000007 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000010000110000000000DE +:10C050000000000000000000002000200020000080 +:10C060001100000000008000050100000001000137 +:10C07000000100000000000000000000410000007E +:10C080000000000002000000100000C000000000DE +:10C09000410000000000030000000000000000005C +:10C0A0001040004000401020000000000000000090 :10C0B0000000000000000000000000000000000080 -:10C0C00000C000900000000000C0009000000000D0 -:10C0D000000000000000000000030000000000005D -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F +:10C0C0000890019002400004000000000000000001 +:10C0D00000000000000000000000A0080002002096 +:10C0E00000000000000184000001000000000000CA +:10C0F000000000010001000000000000000000003E +:10C1000000000000000000000000112000200010CE +:10C11000080800000000000000000000000000000F +:10C120000000C000000000008000000000000000CF :10C1300000000000000000000000000000000000FF -:10C1400000000080008000000000008000800000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000800000000080008080000000006F -:10C1D00080008080000000000000000000000000DF -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F +:10C140000000C0802000850000800000000000008A +:10C1500000000000000000000000000003000000DC +:10C160000000000000410803801100102009212177 +:10C170000000000500080010002000200000000062 +:10C18000000000000000000000000000A10000808E +:10C19000000000800000000000000000000000001F +:10C1A00000000000000000210080000000000000EE +:10C1B00000000000000000000000800000000000FF +:10C1C0000000000009882121858802880000000005 +:10C1D000000000000000000000000000000000005F +:10C1E000800000000000800000000010000010002F +:10C1F00021004100001000000000000000000000CD :10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C24000000000000008000000008400C090000012 -:10C2500000008400C090000000000000000000000A -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C28000000000000000000000000000000000901E -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E +:10C21000000280008000000000000000000000001C +:10C22000000000000000200020C002A040400000EC +:10C23000000000000000900002000000C0000000AC +:10C24000000000000000909191C011A009030000BF +:10C2500000080000000800000008000000080000BE +:10C2600000001000000200000800040090012020DF +:10C2700001080100000000000000000000000000B4 +:10C2800000000000000000000000000000000000AE +:10C2900090008801A00208000000000000000000DB +:10C2A0000000000000000000C09000880040C04076 :10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000009000C01E -:10C2D00000000000009000C000000000000000000E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E +:10C2C000000000000000000040882090204102098A +:10C2D000010000001000000000000000200000002D +:10C2E000000000100002002010000000000100010A +:10C2F000000100000100000000010000000000003B :10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D +:10C31000000088C00004081010A000000000000009 +:10C32000000000000000000000008000000000008D :10C3300000000000000000000000000000000000FD -:10C34000000000000000000000000000000000806D -:10C350000080000000000080098000000000000054 -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD +:10C340000000000000000000000000410009002182 +:10C3500090A0410000000000000003000000000069 +:10C36000000000000000000000000000001120108C +:10C370000910001000101003000000080000080061 +:10C38000110000000000000000000000000000009C :10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C00000000000000000000000000080090021C3 -:10C3D0000000000080118005000000000000000047 -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D +:10C3A000000000000000000000000000000280000B +:10C3B000800080000000000000000000000000007D +:10C3C0000000000000000000000000004002A0008B +:10C3D0004100200400000040000000000000004078 +:10C3E0000000000000000000000800000000000045 +:10C3F0000080000000000802100010001040000043 :10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C44000000000000000000000000000000090005C -:10C45000000000000000C0012000000000000000FB -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC +:10C41000000000000000800000000080000000001C +:10C4200000000000000000000000000000004001CB +:10C4300002404010A00000000000000000000000CA +:10C4400000C0000000000000000000000000848820 +:10C45000894040884000000000000000000000000B +:10C46000000000000000000000002020100808006C +:10C470000000000200900000000100000100000028 :10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C +:10C4900000000000000000004000041010088200AE :10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C0000000000000000000000A0000060000005C -:10C4D00000820000060000004882006006000000A4 -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C +:10C4B00000000000000088000000000000000000F4 +:10C4C000000000000000000000000000000000006C +:10C4D000000000E000000000000000000700410034 +:10C4E00000000000070000000000004100000700FD +:10C4F00000000000000000000000810000E00000DB :10C50000000000000000000000000000000000002B -:10C510000000000A0000060000000000000000000B +:10C510000000000000000000000000000000070014 :10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB +:10C530000000F0F0FF00AAF0FF3C00000000000047 :10C5400000000000000000000000000000000000EB -:10C5500000000000FFFF000000FF000000FF0000DF -:10C5600000FF0000000000000000000000000000CC -:10C5700000000000000000000000000000000000BB +:10C5500000000F0FC3C30C0A0CFA0000000000001B +:10C560000000000000000000000000003C503C50B3 +:10C57000AA0CAA0C0000000000000000000000004F :10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B +:10C59000000000000000000000000000FFCF554533 +:10C5A00055145504000000000000000000000000C9 +:10C5B000000000005555C3C3AAF0003C0000000075 :10C5C000000000000000000000000000000000006B -:10C5D000000000000000FFFF000000FF000000FF5F -:10C5E000000000FF0000000000000000000000004C -:10C5F000000000000000000000000000000000003B +:10C5D000000000005555FF000C0A0CFA0000000096 +:10C5E00000000000000000000000000000003C50BF +:10C5F0003C50AA0CAA0C0000000000000000000043 :10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C65000000000000000FF000000FF000000FF00DD -:10C66000000000FFFFFF00000000000000000000CD -:10C6700000000000000000000000000000000000BA +:10C6100000000000000000000000000000000F0FFC +:10C620000505FF3CFF0C00000000000000000000BA +:10C63000000000000000FFFF3C3C5F0ABEBE00009F +:10C6400000000000000000000000050514140000B8 +:10C65000000000000000FFF5FFFF7F752F250000A0 +:10C6600000000000000000000000000000000000CA +:10C67000F0F50005AFAFAFAF00000000AAAAC3C33A :10C6800000000000000000000000000000000000AA :10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D0000000000000000000FF000000FF0000005C -:10C6E000FF00000000FFFFFF00000000000000004E -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 +:10C6A00000000000F0F040F000000000000000007A +:10C6B0000000000000000000FF0A3C3C5F0A141468 +:10C6C0000000000000000000000000000505141438 +:10C6D00000000000000000003C3C3C3C7A702A2036 +:10C6E000000000000000000000000000000000004A +:10C6F0000000F0F500050505050500000000AAAAE8 +:10C70000F0FF00000000000000000000000000003A :10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 +:10C72000000014FF1FFF40F040F000000000000078 +:10C7300000000000000000000000000030000000C9 :10C7400000000000000000000000000000000000E9 -:10C75000000000000020000000A0030203380C00CD -:10C7600092C003E3033E8C0D82C000000000000075 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 -:10C790000000000000000000000000000000002079 -:10C7A000000000A0000000000000000000000000E9 +:10C750000005000000000000000000613007000D2F +:10C76000000105000A08050000A005000A080500F0 +:10C7700000A000000000002800000000006100068A +:10C78000000D000000610002800100000061000651 +:10C79000000D00000000000000000000000000008C +:10C7A0000000000000000000000000000000000089 :10C7B0000000000000000000000000000000000079 :10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 +:10C7D0000000000000000000000000000000E0EB8E +:10C7E000D7D787870000000000000000000000008D :10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 +:10C8000000005505414100EBF0EBC3C30000000000 :10C810000000000000000000000000000000000018 :10C820000000000000000000000000000000000008 :10C8300000000000000000000000000000000000F8 :10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 +:10C850000000000000000000000000000000E0EB0D +:10C86000E0EBD7D7AAFF00000000000000000000A6 :10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 +:10C8800000000000FFAFEBEB0FEBFFEB0F0F0F0F04 :10C890000000000000000000000000000000000098 :10C8A0000000000000000000000000000000000088 :10C8B0000000000000000000000000000000000078 :10C8C0000000000000000000000000000000000068 :10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 +:10C8E00000000000F050F0400000000000000000D8 :10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 +:10C900000000553F553C0000000000C3AAC3AA0325 +:10C91000AA0382AA87AF0000000000000000000008 :10C920000000000000000000000000000000000007 :10C9300000000000000000000000000000000000F7 :10C9400000000000000000000000000000000000E7 :10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 +:10C96000000000000000F0F0F0C000000000000037 :10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 +:10C9800000000000550355000000000000C3AAC3CA +:10C99000AA03AA03D2FAD7FF00000000000000009B :10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000200057 -:10C9C0000000000420004000200020000000400083 -:10C9D0000004000000002000000000000000000033 -:10C9E0000000000000000000000000040000000043 -:10C9F00020000000000000000800C10000030080CB -:10CA00004000008082800000000000000000000064 -:10CA10000400000000000000000000000000000012 -:10CA20000000000000000085000000000000000081 -:10CA30008400000000000000000000000000000072 -:10CA400000000000000000000000000000000000E6 -:10CA50004000000000000000000040000000400016 -:10CA600040004000100000000000000000004000F6 -:10CA70004000C00040004000400080C002000000B4 -:10CA80004002C00040024010000000000000000012 -:10CA90000000400000004000000000000000000016 -:10CAA0000000000000000000001000A000A000C076 -:10CAB00000A0000000000000000040000000000096 -:10CAC00090000000000000000000000000000000D6 -:10CAD0000000000000000000004182008205040008 -:10CAE0000000000000030000000000002080001093 -:10CAF00003000000000001800000000401000000AD -:10CB000000000041010000020000000000000000E1 -:10CB10000000000000000000000000000000000015 -:10CB200000000000000000000010000000900080E5 -:10CB300000800000820000000000A1000000001042 -:10CB40000000000000000000008400000004000459 -:10CB50000008000400000000000800004000000081 -:10CB60008000000000000008000800000000001025 -:10CB70000009820000000000201000C00000080032 -:10CB8000000000000000100000090010000000007C -:10CB90000000000800000000000000000400000089 -:10CBA0000000000000000000000400080000004138 -:10CBB00000400040000000000000000010000000E5 -:10CBC0000001000000100000000000000000000054 -:10CBD0000000004000000000000040400000000095 -:10CBE0000000000000000000000000000000000045 -:10CBF0000021000088009000000040008405000033 -:10CC00002010000000000082000082094011000096 -:10CC100000080040000000000000000000110000BB +:10C9B0000000000000000000000000002000000057 +:10C9C00020000000880000004000208200000000DD +:10C9D00000002000880088000000200420000000E3 +:10C9E00020000000200000002011200000000000B6 +:10C9F0000000840020042000000420000002200029 +:10CA000000002004880004200020042020200000D2 +:10CA100004820000202020002000000220080000E6 +:10CA20000080C0002080880000000000200000007E +:10CA3000000000000000200020000000200800008E +:10CA40000000000400000000000000000041090098 +:10CA500000000000000040C0000000C00000000016 +:10CA60000000000000000000000000000000400086 +:10CA700000000000000000021000000000000000A4 +:10CA8000000000000000000080010001A10300017F +:10CA900040008020000000010002000000000000B3 +:10CAA00000C00008110200020000000009900040D0 +:10CAB0000000000000000000000000000000000175 +:10CAC000000000080000000000000000000000005E +:10CAD000000000000000000004000000040000004E +:10CAE0000000000000000000000000000000000046 +:10CAF0000000C00000000000000000000000000076 +:10CB000000000000000000400002040004000020BB +:10CB1000050000000100000000000000000000000F +:10CB200000000008000001000000000000000000FC +:10CB300002000000000000000000000000004000B3 +:10CB400001000000000800000000000800000000D4 +:10CB500000040000000800000000000000001008B1 +:10CB600000000000000800000000000800080000AD +:10CB70000010000000040000000400000000000895 +:10CB8000000000000000000800010200800880088A +:10CB9000000184000000040000000000000000000C +:10CBA00000040000020100824000000000080010A4 +:10CBB0000000000000000000020000000000000073 +:10CBC000800040020000000000000000000000089B +:10CBD0008800A000004100000000000000000000EC +:10CBE0000002000000000000000000000000400003 +:10CBF000000004000400000000000000000000002D +:10CC00000000000000000000000000000000040020 +:10CC10008800000088009000000000400020008094 :10CC20000000000000000000000000000000000004 -:10CC300040000000000000000000000000000003B1 -:10CC400000000000010000000000000000000000E3 -:10CC500008000000000000000000000000000000CC -:10CC6000000000A000000000000000000000000024 -:10CC700000000800000000000000000000000000AC -:10CC8000000000010084000000030090008280008A -:10CC9000000000080040000000000000000000004C -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000002000000000000000000044 -:10CCD000000000000008000000000000000000004C -:10CCE00000080000000000000000000900000080B3 -:10CCF0000800000300050005000090000900008006 -:10CD0000C00000000005000000000000000000005E -:10CD100000040000000000000000002004000800E3 -:10CD200000000000000008000800000008000008E3 -:10CD3000000000000000824182000411080004028B -:10CD4000002040110000A10082000000000000004F -:10CD50004108000003000000000000000000000087 -:10CD600000000000000400000000000000000000BF -:10CD70000020410005000000008421C000008890D0 -:10CD800000402004210021000000000000004100BC -:10CD90000000000400000000000800000000000087 -:10CDA0000000000000000000000000000000000083 -:10CDB00000000000008800000084008480008000E3 -:10CDC00080080001408200002000000000000000F8 -:10CDD000000800000000000000000000000000004B -:10CDE00000000000200000000000200000000811EA -:10CDF00000200000000008000800080000400800B3 -:10CE00000000000082000000090084000000018092 -:10CE100000000000000000000040000000030000CF -:10CE200000000040000000000000000000000000C2 -:10CE30000000000000000000840082410800C000E3 -:10CE40000800000000000000000082000000000058 -:10CE5000000000000000000000200000042000206E -:10CE600000000000000000000000000000000000C2 -:10CE70000000000100000000000000A00000000110 -:10CE8000000000840010000000A0880000000000E6 -:10CE9000080800000000000800000000000000007A -:10CEA0000000000000000000000000000000000082 -:10CEB00000000000000000000000000021008000D1 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000080000000000000C000000000000000F2 -:10CF00000005080090210010000408000010000037 -:10CF100000000104000001040104000000200020C2 -:10CF20000000000000000000000000000000000001 -:10CF30000000000082008200080090000000000055 -:10CF400000000011000040040004401100008200B5 -:10CF500000000000080000000000000000000000C9 -:10CF60000000000000000000000000080000008237 -:10CF7000000000400000410000000500000000A08B -:10CF8000050000000000000000000000000000019B -:10CF900000000000400441004004080000000000C0 -:10CFA000000005000000000000000000000000007C -:10CFB0000000000000000000000000000000000071 -:10CFC00000000000000000000000000000000082DF -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000009000000000100800000089 -:10D00000000008009003012100A0080200080000B1 -:10D0100000A00020000300C10840A0881004000008 -:10D020000000000000000000000000000000000000 -:10D03000000000000000000000000000000011C01F -:10D0400000200040C040000200400002009091001B -:10D0500000000000080000000000000000000000C8 -:10D0600000000000000000000000000000000000C0 -:10D07000000000000000110080000000000080009F -:10D08000000000008000101021A000830008008034 -:10D09000000000800000000000C00085000980033F -:10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C000A18000000080800000800000008000003F -:10D0D000110021000000800000000000000000009E -:10D0E0000000000000000000000000000000000040 -:10D0F000000000000004000000000080000000802C -:10D100008000000000008000A000082191000908B4 -:10D11000000000C10082000000000480890304A117 -:10D1200041030000000000000000000000000000BB -:10D1300000000000000000000000000000000000EF -:10D1400000008000000880008000800000040000D3 -:10D15000800000410900000900800000000000007C -:10D1600000000000000000000000000000000000BF -:10D17000000000000000000000840000002000000B -:10D1800000C0080088000400080003840104A10016 -:10D190000100000000C000A00000000011C0090153 -:10D1A00091039185000000000000000000000000D5 -:10D1B000000000000000000000000000000000006F -:10D1C0000000000008000400A000080008000001A2 -:10D1D00000C0900000010100000000880000000075 -:10D1E000000000000000000000000000000000003F -:10D1F00000000000000000000000000001000088A6 -:10D20000020001000002001000A00010C0A0019167 -:10D21000084102C1840000200000080000009011B5 -:10D220000004008211030000000000000000000064 -:10D2300000000000000000000000000000000000EE -:10D240000000000000000888001000A00400200476 -:10D2500000A0009002A0008288400402014000006B -:10D2600000000000000000000000000000000000BE -:10D27000000000000000000000000000000041006D -:10D2800000808000090000000000000010008041C4 -:10D290001010008880910000000000008000000055 -:10D2A00000A14008414009410000000000000000CA -:10D2B000000000000000000000000000000000006E -:10D2C00000000000000000000000000000008000DE -:10D2D000008000800080800000000080808041008D -:10D2E000000000000000000000000000000000003E +:10CC30000000000000000000000000000000008074 +:10CC400000000100010021A0412000840300000039 +:10CC50000000000000C00000000000020000000012 +:10CC6000000000000000210011004000000003004F +:10CC70000000000000000000000011000090000013 +:10CC800000000290000000000000200000004000B2 +:10CC90004040000000400040000000004000400014 +:10CCA00000100088004000040000000000000000A8 +:10CCB0002100000000000000000000000000000053 +:10CCC00003200508028440A082000000000000024A +:10CCD0000800080000000000000000000000000044 +:10CCE000080000000000000000000000000000003C +:10CCF00000000000000000000040000900000804DF +:10CD00000000000000000000000000000000000023 +:10CD10000000080001000900010000000080000080 +:10CD200001808200000010001000000000000800D8 +:10CD3000000008000040080082000000000400110C +:10CD40001009020000000000040010001000100292 +:10CD5000008400000300000000000000000000103C +:10CD600000000000000000000000000000080000BB +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000040000400040004000000002027 +:10CDA0000000042003000400000000000000000058 +:10CDB0000000040008000000000000000000000067 +:10CDC000008400088000000803848010040900002B +:10CDD00000000840000002000020000800000000E1 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE1000000000004000402004000000400201919A +:10CE200000000010402000000000820020040000EC +:10CE300000000000000000000000000400000000EE +:10CE40000000000010004080008005084000410004 +:10CE5000000041000000000000000010020000007F +:10CE600000000000000000000000000010000002B0 +:10CE700000000000000008000020000011880500EC +:10CE80000900000000880000000000000000000011 +:10CE90000000000000008002040004000500800083 +:10CEA000024000004001200102000040000000009C +:10CEB0000000000000000000000000000000000072 +:10CEC000000000A000000800802000200401800075 +:10CED000820000004000400000000000002100042B +:10CEE00000000041000000080800000000000000F1 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000041800020000030 +:10CF200000000000000000100000000000000000F1 +:10CF300000000800000000000003000000090000DD +:10CF400000000000080082000000100020001041D6 +:10CF500002800482100840002184000000000000CC +:10CF600000000000000000000000000000000000C1 +:10CF70001000000000000000000008000000000099 +:10CF80000000000005000000050000000000000097 +:10CF90000000000000000000000000000420000568 +:10CFA00020002088000000000001000000000500B3 +:10CFB000000000000004000041000000000000002C +:10CFC00000400000000002A000201120800080002E +:10CFD000800080020000000000000000011000A09E +:10CFE000084020A000000000000000000000000039 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D0100000000000000000000000020000000809FD +:10D0200008108202000090A010100000820800008A +:10D0300000000000000000000000100000000000E0 +:10D04000000000000000000000000000000001C11E +:10D0500090004001008300000000000000002080DC +:10D06000040000800000000000000000000000003C +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000009000000000087 +:10D0A0000810110880A000080380800000008000A4 +:10D0B0000800000000000000000000000000000068 +:10D0C0000000000000000000000000000000000060 +:10D0D00009C11005A12000100000000000000000A0 +:10D0E000020021A1058020030000000000000000D4 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D1100000000000000000000000000000100000FF +:10D12000000000008021808000000000001180804D +:10D13000000000000021000000002000030020008B +:10D14000410000000000000000000000000000009E +:10D150000000880090089003C1100000000000004B +:10D1600000000908A182A0A088840000000000003F +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000018E +:10D1A0000008000002002000080800000000000144 +:10D1B000A04088000000000000880000000000007F +:10D1C000000001000000000000000000000000005E +:10D1D000000000001100900188019109000000008A +:10D1E00000000000404100A0A084400900000000B1 +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000100A10011010810014010E1 +:10D2300000881010A0100000000000000000000195 +:10D2400000000001000100000000000000000000DC +:10D2500000000000000040880121914190C10000C1 +:10D260000000000000000010004180A003820000C8 +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A00000110011000800100090110811A0800862 +:10D2B00080000000000000000000000000000000EE +:10D2C00000040009002100410000000000000000EF +:10D2D00000000000000000000041080985084089A6 +:10D2E0000000000000000000058090001000A00376 :10D2F000000000000000000000000000000000002E -:10D30000001100000080000000200080008000006C -:10D31000C18310214100A003800080100000800024 -:10D3200000002182C080108020100000000000005A -:10D3300000000000000000000000000000000000ED -:10D34000000000000000000000008002808000005B -:10D350008000800080808000000000022111000019 -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D3800000000001000000400000000100200084B7 -:10D39000000009A0110000000201080004000200C2 -:10D3A00082000000018988A0008440010000000084 -:10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000C000042079 -:10D3D0000088A0009000A0A090A000000000000124 -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000001100001C -:10D40000060000000000000007008221000000006C -:10D41000000000000000006000005000000000005C -:10D4200000004200000060000060000050000000AA -:10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000000001200060000060000000000AE -:10D4600000E000008141000000000000000000001A -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000F0F00000BC -:10D49000000058400000FF003C3C00040008909051 -:10D4A00000800F0F0F0F00004242424200000000B8 -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D00000C30000A000A000F6FF6F003F300FF077 -:10D4E00000000000C4C4C8CC000000000000000020 -:10D4F000000000000000000000000000000000002C -:10D500000000000000000000000000000000F0F03B -:10D510000000000000000000FF00C3C3080000205E -:10D52000909000000F0F0F0F0000BDFFBDFF000027 -:10D5300000030000000000000000000000000000E8 -:10D5400000000000000000000000000000000000DB -:10D55000000000C3C3000500050090FF09003F3034 -:10D560000FF000000000C4C4080800000000000024 +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000200000000FB +:10D330000000000500800080000000008000000068 +:10D34000800000000000000000400000000000001D +:10D3500000000000000000000000C10983A10500DA +:10D360000010000000000000000090C00910A0089C +:10D37000A00000000000000000000000000000000D +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000800C000C000C000880100901C +:10D3B00088000000200090022002000010000200FF +:10D3C0009000080000A00000000000000000000025 +:10D3D000000000000000000000000000C189109063 +:10D3E00082A000000000000000000000000000001B +:10D3F00000006000000000000000000000000000CD +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D42000000000000000000000000000000000817B +:10D43000000007000000008100000700000000005D +:10D44000000000000000480000E0000000000000B4 +:10D450000000000000000000000000000000821139 +:10D4600000E00700000000000000000000000303CF +:10D47000F3F3F3F0C3C00000000000000000000060 +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A0000000000000000000FFFFFFFF0000000080 +:10D4B000000099998187818700F006F6C300FF007C +:10D4C00040D9D9D900000000000000000000000091 +:10D4D000000000000000000000000000000000004C +:10D4E000FF00F0F030303C000000000000000000C1 +:10D4F00009F909F9333003000000000000000000C2 +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000FFFFFFFE000000 +:10D5300000000F0F0F0F818781870FFF06F6430052 +:10D540007F0046DFDFDF0000000000000000000079 +:10D5500000000000000000000000000000000000CB +:10D5600000000000000030303C000000000000001F :10D5700000000000000000000000000000000000AB :10D58000000000000000000000000000000000009B :10D59000000000000000000000000000000000008B @@ -155011,493 +155011,493 @@ :10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B :10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D600000000000000000000000000003C3C0000A2 -:10D61000FFFF00000000000000000C42006600E078 -:10D620003C003C000000F0F0000000000000302052 -:10D630000001FFFF0FDF00000000000000000000FD -:10D6400000000000000000000000000000000000DA -:10D650000000000000000000E73C0008000440FF5C -:10D6600000FF2424BDBD00000000000000000000F9 -:10D6700000000000000000000000000000000000AA -:10D6800000000000000000000000000000003C3C22 -:10D69000000000000000000000000000000000E0AA -:10D6A00000E03C003C008080F0F000000000000042 -:10D6B000743000010BFF00DF0000000000000000DC -:10D6C000000000000000000000000000000000005A -:10D6D00000000000000000006060C73C0001000284 -:10D6E00000FF00FF0000FFFF00000000000000003E -:10D6F000000000000000000000000000000000002A -:10D70000000000000000000000000020000000A059 -:10D7100005002A00054000A80000000000000000ED -:10D7200000613006009100000000300000000000A1 -:10D73000000000605006C00D000100000000000065 -:10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000A00050000000D9 -:10D760000001000000300000000000400006000C36 -:10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 +:10D5F000000000007E7E7E7E60FC6FFC000000006C +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D63000000000000000F0F09900C9C0C9C0FFFF61 +:10D640006666FF000000000000000000000000000F +:10D6500000000000000000000000000000000000CA +:10D6600000000000000066662424000000000000A6 +:10D670000000000000004E7E4E4E600C6F0C00005B +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B0000000000000000000F0F09900C9C0C9C0DF +:10D6C000DB99420099999999000000000000000040 +:10D6D000000000000000000000000000000000004A +:10D6E0000000000000000000000024248000000072 +:10D6F000000000000000000000613006000D000086 +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D73000000080610006000D000000610026000D61 +:10D7400000000000002000100000000000000000A9 +:10D75000000000610006C00C000000000000000096 +:10D76000000000000000000000001021202D804D6E +:10D7700000A1000000000000000080C082C3FFC0C4 +:10D7800055D700000000000000000000000000006D :10D790000000000000000000000000000000000089 -:10D7A00000000A00080000CFCFCF000000000000FA -:10D7B00000000000000C00087D00707D00000000EB -:10D7C0000000000000000000000000000000000059 -:10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000FF003A -:10D7F000FFFF00000000000000000000000000002B -:10D800000000000000000000000000000000000018 +:10D7A0000000000000000000000000000000000079 +:10D7B00000000000000000005FC300C30000000084 +:10D7C000CF0C4D0C00000000000000000000000025 +:10D7D00000000000000000000028000C0000000015 +:10D7E000000000000000000000000000FF000FF03B +:10D7F000BF00FF000000000000000000A0F0AAFF32 +:10D80000FFFC55D7000000000000000000000000F1 :10D810000000000000000000000000000000000008 -:10D82000000000000A00000000FFFFFF00000000F1 -:10D83000000000000000000000007D00707D00007E -:10D8400000000000000000000000000000000000D8 -:10D8500000000000000000000000000000000000C8 +:10D8200000000000000000000000000000000000F8 +:10D83000000000000000000000005FC3FFC3000004 +:10D840000000CFCF4DCF000000000000000000001E +:10D85000000000000000000000000028000C000094 :10D8600000000000000000000000000000000000B8 -:10D87000FF000000000000000000000000000000A9 -:10D880000000000000000000000000000000000098 +:10D870000FF0BFBFFFFF000000000000000000002D +:10D880000000F0D0C0C00000000000000000000058 :10D890000000000000000000000000000000000088 -:10D8A000000000000000FFFDEBEB00FF00000000A7 -:10D8B0000000000000000000BEBEBE14FFE33C00FC -:10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000000000000000000000048 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C000AAAAC0F000000000000000000000000054 +:10D8D0000000000000000000000000005578AA00D1 :10D8E0000000000000000000000000000000000038 -:10D8F00000000000F0F00000000000000000000048 -:10D900000000000000000000000000000000000017 +:10D8F000F5053C005000550000000000000000004D +:10D9000000000000F0D0F0D0000000000000000097 :10D910000000000000000000000000000000000007 -:10D920000000000000000000FFFDEBEB20FF000006 -:10D9300000000000000000000000BFBFBF15002075 -:10D940003C0000000000000000000000000000009B -:10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 -:10D97000000000000000F0F00000000088008800B7 -:10D9800000000000200020000000000088000000CF -:10D990000000000000000000000000800000000007 -:10D9A000004000000000000000000400040000002F -:10D9B00004000400040001000300000300008400D0 -:10D9C0000080200000000000000000002000000097 -:10D9D00000000000200040000000200000000000C7 -:10D9E00000100000000000000000000040000000E7 -:10D9F0000000000020000000008020000000000067 -:10DA00000000000000000000000200000000000014 -:10DA100000000000000000000000000000400000C6 -:10DA200000000001000000000000000080008002F3 -:10DA300000008000C000C00004000400000000904E -:10DA40000000000480000000000000C00000400250 -:10DA50004000000040004000200000820000000064 -:10DA600000000000000000000000000000000000B6 -:10DA70000000000000000000000000400000000363 -:10DA80000100000000000000000000000010000085 -:10DA9000000000000000000000000010A0100000C6 -:10DAA000020000400809A000000000000004000976 -:10DAB0000100010040080000000000000004000018 -:10DAC000200000000004100400000000000000001E -:10DAD000000400000000000400000000000200102C -:10DAE0000009000800000000000000000000001015 -:10DAF0000000000000000000020002000000021010 -:10DB000000840200000000840000000000080508F6 -:10DB100000840000000000080000008200000004F3 -:10DB20000082800400850004000000000090008452 -:10DB30000084400804048004000000000004001079 -:10DB40000000800004100009840500000084000823 -:10DB5000000840002010000020020008000000849F -:10DB6000020800000008008800880008000800087B -:10DB700000082000008400000000800880080000E9 -:10DB8000804000029002000000020000000000003F -:10DB90000000000800410000000500000000000037 -:10DBA00000000103000000820100000000000041AD -:10DBB000000800400100000501A100210000000054 -:10DBC000000800002003000888000388000884087B -:10DBD0000403000000000000000000000000000836 -:10DBE0000000001100000000000000000000000024 -:10DBF00000400000000000000000000001000800DC -:10DC000000000021000000000000000000000000F3 -:10DC10000000000000000000000000000000000004 -:10DC2000000000C010000800000404000000000014 -:10DC300000080000050040840000100800000010EB -:10DC40000000000000000900004000001008000073 -:10DC50000000000400A00000000000000000000020 -:10DC600000000000000000000800000000000500A7 -:10DC7000000000000000000000A0000000001000F4 -:10DC8000000000000000000082000000080000000A -:10DC90000000080000000000090000000000000073 -:10DCA0000100000000000000040008000000000067 -:10DCB00000000000008000000180000001880000DA -:10DCC0000000000000000000000900090000101121 -:10DCD0000000000000000000000000000000000044 -:10DCE0000000000000000000000000000000000034 -:10DCF0000000000000000003000000000000000021 -:10DD0000000000030100018000000008000800007E -:10DD10000300000000840800080002000808080052 -:10DD2000008202900308000000A00008000000002C -:10DD300000C000000000002000C0400200001009E8 -:10DD400000000500400000000000400209900000B3 -:10DD500089900000000000000000000000000500A5 -:10DD60000300000000004100000000000800000067 -:10DD700020000000000000C0000000C00000000003 -:10DD800000000000000020000404000084000000E7 -:10DD90000008000000000000000900000000000072 -:10DDA000820000000000000000002000850000004C -:10DDB0001008C000A00000200010C000018000007A -:10DDC00000800008000000000000000000000000CB -:10DDD00001000180000300000000001000000008A6 -:10DDE00000008211000000000000000000000000A0 -:10DDF0000000000000000000000000000000000023 -:10DE0000000890000000000000001000000000006A -:10DE10000000000000000000000000000000000002 -:10DE200000000000000000000000000000002000D2 -:10DE30000000800000000008000100000500400212 -:10DE400000000502000000000000000000000000CB -:10DE50001100200010040000000000000500000078 -:10DE60000000000000000000000000002000000092 -:10DE700000000000000000000084000000A000007E -:10DE80000000090000000000000000848500010877 -:10DE9000010001000100000000000000000000007F -:10DEA0000000002100000000000000000040000011 -:10DEB0008400000001000040000500090009000086 -:10DEC0000803820001020010842100080004000001 -:10DED0000000000000000000000000020009000037 -:10DEE0000000000000000000000000000000000032 -:10DEF0000000000000000000000000000000000022 -:10DF00000000000800000000000000000000000009 -:10DF1000400040A040004000000000000000000061 -:10DF200000000008000000040000090000A0000834 -:10DF300000000310000820A0000108000800009065 -:10DF400000000500000040010000000000A000C02B -:10DF500000004000219020020088000000000082A4 -:10DF600005000000000800000000000000000000A4 -:10DF70000000000000000000080000000000200079 -:10DF80000000000000000000000000000000000091 -:10DF900000000001000090010001000000000000EE -:10DFA0000000000000000000000000000000000071 -:10DFB0000000010000900000000000009000000040 -:10DFC0000000000001004000000000000000000010 -:10DFD00000000003000101C1080100C100000000B1 -:10DFE0000000000000000000000000000000000031 -:10DFF0000000000000000000000000000000000021 -:10E00000000000000000000000000000010000907F -:10E010000000000000081105900800080000000042 -:10E0200000000000000000000000000000000000F0 -:10E03000000000001100218000000000110080009D -:10E04000000000002000210080000000000000000F -:10E0500000000000000000114120911100090000A3 -:10E0600000000000000000000000000000000000B0 -:10E0700000000000000000000000000000000000A0 -:10E08000000000000000000000000000000011007F -:10E0900021800000000010A00500054010100000C5 -:10E0A0000000000000000000000000000000000070 -:10E0B00000000000000000400980002000800000F7 -:10E0C00000800000008009000400100004890000A6 -:10E0D000008000000080000000002182110009097A -:10E0E0000000000000000000000000000000000030 -:10E0F0000000000000000000000000000000000020 -:10E10000000000000000000000000000000000000F -:10E110000041090000030080019100000100008817 -:10E1200000000000000000000000000000000000EF -:10E1300000000000000000000003010800000008CB -:10E1400000000020000000C0000401820000010265 -:10E15000000000040000000200000082018301C0F2 -:10E1600001A100000000000000000000000000000D -:10E17000000000000000000000000000000000009F -:10E18000000000000000000000000000000000008F -:10E190000000100101020000000800004100000121 -:10E1A000000100000000000000000000000000006E -:10E1B000000000000000000000000000A0008290AD -:10E1C000000003000288020001000101000040007D -:10E1D0000000010000000400000000000001000138 -:10E1E00083010101000000000000000000000000A9 -:10E1F000000000000000000000000000000000001F -:10E20000000000000000000000000000000000000E -:10E210000000000000008800C09000000010110500 -:10E2200010080310000000000000000000000000C3 -:10E2300000000000000000000000000009000000D5 -:10E240008080410041008080800009000210004071 -:10E2500000200020020000008000000000000002FA -:10E26000002005201109000000000000000000004F -:10E27000000000000000000000000000000000009E -:10E28000000000000000000000000000000000008E -:10E29000000000000000100000000080410010108D -:10E2A0000500410010110000000000000000000007 -:10E2B00000000000000000000080000000000011CD -:10E2C00080400080000000110000008000804100BC -:10E2D00002052100081000000020000000000000DE -:10E2E000C180A0001000090900000000000000002B -:10E2F000000000000000000000000000000000001E -:10E30000000000000000000000000000000000000D -:10E31000000000000000000000119111000000004A -:10E3200000110020000000010000000000000000BB -:10E330000000008200000000000000020000000059 -:10E34000000120010008000000010000004000085A -:10E3500001040001010001000000000000000000B5 -:10E36000000041C005000500C101000000000000E0 -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000001200100005B -:10E3A00000004100006000000000000000000000CC -:10E3B000000000000000000000000000000000005D -:10E3C0000000000000E0070000000000000007005F -:10E3D000822100000060060000000000000006002E -:10E3E0000000000048000060000084000000000001 -:10E3F000000000000000000000000000000000001D -:10E40000000000000000000000000000000000000C -:10E41000000000000000000000000000000000E01C -:10E420000700810000000000000000000000000064 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D940000000AAAACFFF00000000000000000000B5 +:10D95000000000000000000000000000000000784F +:10D96000AA0000000000000000000000000000000D +:10D970000000FF003C0014001E002000000000001A +:10D980002080000400800080880420800000208027 +:10D9900020000080008020002004008000000000A3 +:10D9A0008900000400000000200020000041200049 +:10D9B000200000000000040020040003000000001C +:10D9C000000000000000000088040008000084003F +:10D9D0000000000001000080008240840590840265 +:10D9E0000000000040824000210488840000000004 +:10D9F00000000000A0000000000020000000000067 +:10DA00000000004000850004000400004004000005 +:10DA100000041004000400040000000100040000E1 +:10DA200000822000004041020000000400000000CD +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000C00000000020000000F6 +:10DA500000000000009020C00004000440054008C1 +:10DA6000000004000402000400022003000400007F +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA900000000000000000000000C00000000000C6 +:10DAA00000000000000000000000820000000000F4 +:10DAB0000000000000000000000000000000000066 +:10DAC00000000040000200408200A100004190419F +:10DAD00000000000000040000103400020902000F2 +:10DAE00001000000C0080000008401000000830065 +:10DAF00000002000000001000000000010000200F3 +:10DB000000000008000000000000000000000010FD +:10DB10000000000000000000000800C0000002003B +:10DB200000820008000000000000000000820000E9 +:10DB300000000000000000000008000800040200CF +:10DB40000000000000050400040100004000000087 +:10DB50000004000000000500800020088008000587 +:10DB60008284400004000001000000052000000045 +:10DB700040020000800000002000000200020000BF +:10DB80000000A00400000000008000210009002126 +:10DB900020210010014010020100000200002009B5 +:10DBA000002100002021200400000080010004006A +:10DBB000112104032021000020000000A00000002B +:10DBC000A0080000400000039000040002A1022110 +:10DBD0000200008020402000840088C000840004EF +:10DBE000088000110400000000900000000200A165 +:10DBF0000021000200110000000090000000000859 +:10DC000000080021008500A0410005040900000073 +:10DC100000008000000020848084200000000000BC +:10DC200080080000000080008040000004202000E8 +:10DC30008000200000008000000080000000000044 +:10DC40000000000000000000000003000000004091 +:10DC5000C1008000054000850984000000410541A5 +:10DC6000090188020088008800000005000000010A +:10DC70000004000000010000080000000000100087 +:10DC80000000000008000008000040000000400004 +:10DC90004000400000000000000000000400008080 +:10DCA0000800000000800121000000800005010440 +:10DCB00000000100042101000003110500000180A3 +:10DCC00001A1098301000000000002000000000023 +:10DCD0000080008300800000088000800000088031 +:10DCE00000210000019008008200000000008280F6 +:10DCF000C000008000800091000920040000001195 +:10DD000000000000001000080009000080840000EE +:10DD100040A0000000000000000000000000000023 +:10DD20000020000000000020100000A00002000001 +:10DD30002001050020008088108800001088000065 +:10DD40000240024002400200000000008084000007 +:10DD50000884004005400040008200400040080068 +:10DD6000000400000000081140000002090000004B +:10DD700000041000100200020004000200C002A013 +:10DD800000000000000000080000100000800003F8 +:10DD9000000000200003000000000002002100003D +:10DDA0009000204000008220880000110000000048 +:10DDB000900000008400000000000180000000804E +:10DDC00000000221000000000010000000000240DE +:10DDD0008200000001080040908000838904020056 +:10DDE0002040000000004000088490008802C0002D +:10DDF00000000009000000000004000200000041D3 +:10DE00000000000540000000000000008000000449 +:10DE1000000000000300080000002188000100004D +:10DE200000000000800000000001000000000084ED +:10DE30000000000000900000000000080404000042 +:10DE40000020000080000000210003000000090005 +:10DE5000800103000000029020031140050202012E +:10DE6000830080A1208400008000051000000000D5 +:10DE7000000000000000000000000001000100841C +:10DE80000000000000001000000220880020902107 +:10DE9000000288040420002100000041C0000000AE +:10DEA00000000000000000000008000984210900B3 +:10DEB00000000000080020002020200420040102AF +:10DEC0000400210204000000022100080088000074 +:10DED0002180018001800100004085C10040904008 +:10DEE00084000004000400000090019008800110EC +:10DEF000000300050000000311021184010041022B +:10DF000000000008002100000011000000000021B6 +:10DF10000200118241010400000000000508000019 +:10DF20000000000000000500000000C0000000A08C +:10DF3000100000000000410080008001800091017D +:10DF40001001A0109001801000008000000000402F +:10DF5000000002404040024002A000010202000115 +:10DF60000001000021010001000000052003080459 +:10DF700020A104840000002004822001200340C06E +:10DF800040A1000002C009C02040000000000000C5 +:10DF900000000040004000A0A082000101008400B9 +:10DFA00000000001000101000000000090000000DE +:10DFB0000000000000000100000000000000000060 +:10DFC0000000000100000000000000C00010000080 +:10DFD0000000000000C0000000900000008401006C +:10DFE000900000000100218200000001108991884A +:10DFF000202188210301100100008200000001009F +:10E000000801000100010101C00000000000000043 +:10E0100000000000400000000280000000114120CC +:10E0200000400002004100101011000911008000A2 +:10E0300020000000000000000800000000000000B8 +:10E0400008000000034100090811000900800000D9 +:10E050000000000000000089001100090009000014 +:10E060004009000900001111830300200003809182 +:10E070002120021100031141214000058009000008 +:10E08000030082100021004041040004000500004C +:10E090000000000000000211102185004100410035 +:10E0A00020000511081100000000004000000008D9 +:10E0B00000000041000002081000090041000005B6 +:10E0C00000000020000002001180090041800000D3 +:10E0D000000000008000000000800010000000032D +:10E0E00000800000000000C0090003A12000208083 +:10E0F0009010080990902100004109000003008061 +:10E100000010100010102121400000000400044005 +:10E110000000000000000000820008C010C0830062 +:10E12000008200000001000000000000000000006C +:10E13000000100400000002000010000000001007C +:10E1400000000088000000880000000400000104B6 +:10E15000000090000000C0000000008800010000E6 +:10E160000008000400C0000084C1010200C00000DB +:10E1700082C005901100A1A0210000010100000053 +:10E18000008800900100010001050004000000006B +:10E1900001010000000000000000828284400008AD +:10E1A0009082000000000901010000004100880089 +:10E1B00000000000C000400001000000020000005C +:10E1C000010000004000080000000000880004007A +:10E1D000010000000000000800C00000000000086E +:10E1E000010000C0C00000204185000000000000C8 +:10E1F00020828320C0A10320002008030088A0887B +:10E2000000880188000009010000010000000000F2 +:10E2100001010001000000000000000003000000F8 +:10E2200000000800004141200802110200008200A5 +:10E2300082000500400080000000410000008000D6 +:10E24000000008000900000080000500050005002E +:10E25000C100080000000000000000800000000075 +:10E26000210005000280050300A0C105112008035C +:10E27000050880209183832011A103089088000065 +:10E280002100200041000011910803110820000521 +:10E2900008050821000800000000000000000089B7 +:10E2A00080008000000520821100080002020000AA +:10E2B00000000000000000100011000000000088B5 +:10E2C00000000000000500200003000000000085A1 +:10E2D0000020000000050000000000000000000019 +:10E2E000A102058011000300A120110041000000DF +:10E2F000030220110380892189A11011000011114E +:10E3000000020011100000000000100000002011A9 +:10E310002100040040004004000000000000000054 +:10E3200040C08888020010000004010000000000C6 +:10E3300000000000000000000000000000000000DD +:10E3400000020000000000000000000000000000CB +:10E3500000400000000000000000000088000000F5 +:10E360000000C100000800080000050100A0000036 +:10E370000400000100010184050010092120201083 +:10E3800091010001000100000000000001000000F8 +:10E3900000010184000000000000000000000000F7 +:10E3A0000000810000E000005000810000E000005B +:10E3B0008400410000E000000000008100E0070050 +:10E3C0008206810000E000000000818100E007007B +:10E3D0000000884100E0070000000000000000008D +:10E3E000000000000000000000000000000000002D +:10E3F0000000000A810000E000008121000000E030 +:10E4000000008100000000E000008141000000E009 +:10E4100000000000000000E00000500000000000CC +:10E420000000000055550F0FFFFC0F0F000000000B :10E4300000000000000000000000000000000000DC -:10E440000000000000FF000000FF000000000000CE -:10E45000F0F00000000000000000000000000000DC -:10E460000000000000007D7D7D7D000000000000B8 -:10E47000000000000000000000000000000000009C -:10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000FF7D -:10E4A000000000FF0000000000000000000000006D +:10E4400000000000000000000000000000000000CC +:10E450000000000000000000000000000F0F0F0F80 +:10E46000FFFFFF000000FFFF0000FFFF0F0FC3C30F +:10E470003C3C0FF00FF03C3C3C3CFF0000FFD7550C +:10E48000870582C082C0000000000000000000007C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000FF00C3C3FFFCCFCF00004E :10E4B000000000000000000000000000000000005C -:10E4C00000000000000000FF000000FF000000004E -:10E4D0000000F0F00000000000000000000000005C -:10E4E00000000000000000007D7D7D0500000000B0 -:10E4F000000000000000000000000000000000001C -:10E50000000000000000000000000000000000000B +:10E4C000000000000000000000000000000000004C +:10E4D00000000000000000000000000000000F0F1E +:10E4E0000F0FFFFFFF000000FFFFFFFFFFFF0F0FF9 +:10E4F000C3C33C3C0FF00FF0C3C3C3C3FF0000FF16 +:10E50000D7FF87AF82C000000000000001000000BC :10E5100000000000000000000000000000000000FB -:10E5200000FF000000FF0000000000005555555599 -:10E530000000000000000000000000005555555587 -:10E5400000000000555555550000FF000000FFFF7A -:10E550000000FFFF0000FFFF0000000000000000BF -:10E56000000000000000000000003CFF3CFF000035 -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B +:10E520000000000000000000FFFF0F0F1717C300DE +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000FFFFFFF0F0FFFF0000F0F0FFFF555548 +:10E570005555FFFF00005555AAAA55AA55AAFFFFF9 +:10E5800000000AFAC3C3D200D2FF0000000000005E :10E59000000000000000000000000000000000007B -:10E5A00000000000FF0000003C3C0000000055554A -:10E5B0005555000000000000000000000000555507 -:10E5C000555500000000555555550000FF0000004E +:10E5A00000000000000000000000FFEB0F0F171735 +:10E5B000C300000000000000000000000000000098 +:10E5C000000000000000000000000000000000004B :10E5D000000000000000000000000000000000003B -:10E5E0000000000000000000000000003CFF3CFFB5 -:10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A +:10E5E000000000FFFFFFF0F0FFFF0000F0F0FFFF72 +:10E5F000AAAAAAAA0000FFFF5555AAAA55AA55AA79 +:10E600000000FFFF0AFAFFFFD2FFD2FF0000000068 :10E6100000000000000000000000000000000000FA -:10E62000000000000000FF0000003C3C006100070B -:10E63000C00D00020000000000000000000000000B -:10E6400000000002000000000000000215402A0641 -:10E65000054C00A805002A00054000A805410A0E47 -:10E66000050D00A005000A08050000A000000041FB -:10E670003003C001000000000000000000000000A6 -:10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A -:10E6A00000000000000015402A06054C00A80000EC -:10E6B000000000000000000000000000000000005A +:10E620000000000000000000000000000061300752 +:10E63000800500010061000080010000006100030E +:10E64000800D000005610A2F050D00A00061000784 +:10E650008005000005610A2F850D00A005610A2BC9 +:10E66000850500A04002800000209202000040E3E7 +:10E670008006002D900240618006002D100240614E +:10E6800080008021080200610007001D000000409A +:10E690000006000C000000610007000D0000006192 +:10E6A000000400090000000000000000000000005D +:10E6B000000000000000FDFDFD0583BFAFBF0000AE :10E6C000000000000000000000000000000000004A -:10E6D0005555FFFF00000000000000000000000092 -:10E6E0000000002400000000000000000000000006 -:10E6F0000F053C3C1050FFFF000000000000000030 -:10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000000F9 -:10E7200000000000000000000000FF00FFFF0000EC -:10E730000C000F140002C0F20000000000000000F6 +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F0000000000000000000000000004343FF0095 +:10E700003C3C550FC3C0FFFC3C555555000080C133 +:10E7100000000F0FFFFF00003C553C5500000000BB +:10E7200041414141550075200000000000000000FB +:10E7300000000000000000000505FD0580BCA0BC35 :10E7400000000000000000000000000000000000C9 -:10E75000000055550000000000000000000000000F -:10E76000FF00170000000000000000000000000093 -:10E7700000000F050F0520A020A0000000000000F1 -:10E780000000000000000000000000000000000089 -:10E790000000000000000000000000000000000079 -:10E7A000000000000000000000000000FF0000006A -:10E7B0000000000000000030000000000000000029 -:10E7C0000000000000000000000000000000000049 -:10E7D000000000000000F0F0000000000000000059 -:10E7E0000000000000000A5F0A5F00000000000057 -:10E7F00000000000F3FF0C0000FAF0AA0000000087 -:10E800000000000000000000000000000000000008 -:10E8100000000000000000000000000000000000F8 -:10E8200000000000000000000000000000000000E8 -:10E83000F0F00000CF010001303A000000000000BD -:10E8400000000000000000000000000000000000C8 -:10E850000000000000000000F0F0000000000000D8 -:10E8600000000000000000001414BEBE0000000004 -:10E87000000000000000FFFF000000FA00FA0000A6 -:10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000000000078 -:10E8A0000000000000000000000000000000000068 -:10E8B0000000F0F00000848084008820200488801C -:10E8C00020000220000021000180050020A000801F -:10E8D00000200420042005A0210005A021880100BB -:10E8E0000100008000800100010001000100200003 -:10E8F0002000000020200000208000000280008016 -:10E90000000084050000000000000000000000007E -:10E910002000200540100000000010000009000049 -:10E920000000000000800000000000000010000057 -:10E9300000000000000000000020050000010001B0 -:10E94000002020004003000020002020A0840005BB -:10E95000002000018001800190059000A009902016 -:10E9600004000400002000202002200020002000DD -:10E970008000800000000001000000102000004026 -:10E980002020000000000000000000000000000047 -:10E9900000000000000000010000000080000000F6 -:10E9A0000000000040000002000000000000000124 -:10E9B0000000000000000000000000000000000057 -:10E9C000000089000480038001808980880088908D -:10E9D00084000100010000000000880083000000A6 -:10E9E0000000000401004008A10800000000000031 -:10E9F0000000010884008300910000000000000076 -:10EA000000000500008000840000000000000400F9 -:10EA10000000020000000000880000102000000834 -:10EA200000040000008000000080000000000000E2 -:10EA30008200000000110000000000000000000043 -:10EA40000000000004108020400204200420008404 -:10EA5000002000000408040000000008000004007A -:10EA600000080000008940C0800440C02000000071 -:10EA70000008000802840082208420840000000036 -:10EA80000004000804840002000200840008410819 -:10EA90000000000880040084001000842009800029 -:10EAA000008200080008040800040002000800C0FA -:10EAB0004104410800020000008400820084000537 -:10EAC000000300050000000000030008000500210D -:10EAD000000000080408002100000021001000418F -:10EAE000002000110005008501030089004100108D -:10EAF00000090000100500400000000800080000A8 -:10EB000000009100400201A0000800000008001071 -:10EB10000005002100000010004000080020000255 -:10EB200000000040000000000002822100100003ED -:10EB30000040000800100000000000080010001154 -:10EB4000000000000000000000A000080082000893 -:10EB5000000000000000000000000800110000009C -:10EB600000000041000000C0081020004010050017 -:10EB7000000004002100000000000008000000C0A8 -:10EB80000000000008008000044000000000210098 -:10EB90000001000000000000000000000000000074 -:10EBA000000041000000008400000001000000019E -:10EBB000000000000000000105000000000000004F -:10EBC00000840800080008000000820000004110D6 -:10EBD000008040000000000002004000A000820011 -:10EBE000A0000000C000080000000011A0090800FB -:10EBF00082030000000000100000880000000803ED -:10EC0000400000000000A000C003008040000000A1 -:10EC10000400000000040000820000008200048064 -:10EC200001008400A0002000008000030003000019 -:10EC3000C0000021820000102000008008030800AE -:10EC4000C000848000000000000000000000000000 -:10EC50008410000400000000000000000000000814 -:10EC6000000000A00000000008880000008821C00B -:10EC700000A00000000000000800000000C000002C -:10EC80002100408400000000000000002004410238 -:10EC9000400841A021022000000000000000030005 -:10ECA0008020088400A000008000000441000300D0 -:10ECB00040000084030041400001200400100004D3 -:10ECC000410000000002012100800108410000080D -:10ECD00000020010004000030041000000208221DB -:10ECE00000410808A0020841C008000008400000D8 -:10ECF0000810000400210008A000001000002003FC -:10ED000000008200020000000021A1040800A10808 -:10ED100000000020C040A00300008208A004A02042 -:10ED20000200020082080100080000000800200024 -:10ED3000000008210020000002208400021184202D -:10ED4000000000000000000004840020048484848B -:10ED500000080001000000000000000000000000AA -:10ED600000000000000000000000000000000000A3 -:10ED7000000000000001000000100000000008007A -:10ED800000000000000080000000000040081000AB -:10ED9000080000000000000000000000000000006B -:10EDA000000080008000000008000000000000005B -:10EDB000A000000000000000000080002100000012 -:10EDC00000C00000000000840000002100000000DE -:10EDD0000021002100030010000800210441000070 -:10EDE0000421820040004005400000410821C0117C -:10EDF00000050008080884210041001082039021CA -:10EE0000002100008200820040910000000000000C -:10EE10000200200400024000040940050000A00890 -:10EE2000C011A008821000000000000010000000C7 -:10EE300000218400000082000008C00000050000DE -:10EE40002004011000210000091000000000000053 -:10EE50000000000000000000000000000000800032 -:10EE600000008000000000000000000000C0000062 -:10EE7000000003004184002000002000000000008A -:10EE800000000000000000C0000040400000002022 -:10EE9000210021902082000240020000400000007A -:10EEA0000000000021080301000000004000800075 -:10EEB000000000000000030040000010410041403D -:10EEC000000020044000000000000200410011C0CA -:10EED000A0101002108888C1001000880288C08825 -:10EEE000000400088810081000100010C0C00505BC -:10EEF000111041C10288C0048488014090040000C0 -:10EF000000000000000088C00040000282040003EE -:10EF100000C00104820810048283820988218205CE -:10EF20000082000400020088100290040004209077 -:10EF30000000000100010000A1400300100282094E -:10EF40004102009084A02008000001009000000011 -:10EF5000A08010008000800011900089001000093E -:10EF6000000000000280008082800080000080009D -:10EF70001041822188020003900009000300000074 -:10EF800000000000050000000080000005000000F7 -:10EF900000000080418008808080800211A1400331 -:10EFA00000822080008000800000C080808000807F -:10EFB000000000020008400200109041A103000977 -:10EFC0008082108021008080000000000800000086 -:10EFD000000000008010808080008900091005007A -:10EFE000C1900040000400400000000080048082C6 -:10EFF0008000400021049000410509A005084190CF -:10F00000049000030000004000000003000480A002 -:10F010008000000020008802888089A110800208FA -:10F0200090801021000000210080000080008021DD -:10F030008080800000000000040041004080200427 -:10F0400005844188800000008000800000000041AD -:10F0500000800000020010008240C0000800000094 -:10F060008588C109000000880008C0888400400825 -:10F07000104008880290041083100920001100A19C -:10F080000003010200000000000000008800820070 -:10F0900088849082000090A01101A10890030102D1 -:10F0A0000009A1840083000000400002000002006B -:10F0B0000400A082C0000000000001000100000860 -:10F0C0000000014101A002009000A00004840000A3 -:10F0D00000010004000002100021C0A0A0C0080927 -:10F0E0000008010000C103024010000403C00984AD -:10F0F000000810100808C103000940100989218880 -:10F10000A0A0908811010000400000000100100440 -:10F1100004A0001041100000080000020011851139 -:10F120008882002000118304020000000000050016 -:10F13000C0400088000402C000010000010000017E -:10F14000908801A02109000340900040844002C043 -:10F150000001000000000000000900820041088951 -:10F1600080892003210000914100000000000280FE -:10F170008800008080801080082020888583C0411E -:10F18000200900850005C1110000000000001000EA -:10F190008000808000001000000080000005002139 -:10F1A00041A00040021009A1098280000000000077 -:10F1B0008800800000000080808000211002200470 -:10F1C0000041004120912183118880400021008965 -:10F1D00080A0000800030005002080028089000054 -:10F1E0000000A109A01102001010001180210000F0 -:10F1F00000000040808300000000418985050380F5 -:10F200008840094005200400842000000000000020 -:10F21000000000400080008080000000C0008500E9 -:10F220002000402103000280C080C01080008000C8 -:10F2300080008000000080800000800021800000AD -:10F2400011000041900890084100051000100000D6 -:10F25000000000008000000000000000C00020202E -:10F2600010041000C10220900004090002001000E8 -:10F270000888A000100120C11088881089048285A8 -:10F28000C008080002414000890009010000000098 -:10F290000000000040010410844008000000C1107C -:10F2A0000408C1900101829021021084050002002F -:10F2B000040084000400000004022082040001A075 -:10F2C0000000000000010400830140004001000034 -:10F2D0000020008400001000400020004000840056 -:10F2E00000600600000088000060060000000000CA -:10F2F0000060060048000000000006004212000006 -:10F30000006006000000810000600600424100002D -:10F310000060000000000000006006000000000027 -:10F32000500600600600428200000000000000005D -:10F33000000000000000000000060000060082003F -:10F3400060000060000000120000000000000000EB -:10F35000000000000000000000000000000060004D -:10F36000C3CF00000B080000007E0000DBDB0000C4 -:10F37000003CF1FD3D00C2FF00FF00FFFF00EF1069 -:10F38000FFFF0000FF00FFD2000089CF80C080C0D7 -:10F390000000000000000000FFFFFC0066660000A7 -:10F3A0000000F090F00000000000D958FF183C3C2D -:10F3B00018180030C17200000000404C404C3C0066 -:10F3C000306600000000000000001018343C00000F -:10F3D000BDF0000000008181606066426440000072 -:10F3E0000000C3E70000FFFF0000FFFF00009B9B41 -:10F3F00000000000F1F1C2FFC2FF2CD3EF10FF00AC -:10F40000FF00BFFF4000FF00FF9089CF89CF90F041 -:10F4100090F00000000000000000FF7FF040FF03BC -:10F4200003030000F090F0FF0000000FC140FF1840 -:10F43000033F3F3F0030C1300000000000000000EB -:10F44000000030000000000000000000131B373FE8 -:10F45000000099F00000000081813C0042424040E1 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000008000000000000000A000007F7F7B +:10E78000FF003C3C550F00C03CFC3C55555580C13A +:10E7900080C100000F0F00000000555555550020A6 +:10E7A0000000F000FFFF55005500000000000000D1 +:10E7B000000000000000F3F328EBBFBFBF050CFC16 +:10E7C000FFFFCF0C7D7D0000000000000000000076 +:10E7D000000000000000B2B2C3FF00000000000013 +:10E7E0000000CFCF7D41B2B2C3FF000000000000A7 +:10E7F0000000000000000000000000000000000019 +:10E8000000000000FF3500353A303A3F00000000BC +:10E81000F0F03CAA05051800F0F00000F7F7F7F754 +:10E82000F0F0F0AAA0A8A8A8FF3C55140000000032 +:10E830000000000000000000303028EB05BF050597 +:10E840000CFC08A8CF0C41410000000000000000B3 +:10E850000000000000000000B2B2003C0000000018 +:10E86000000000000C0C7D41B2B2003C0000000032 +:10E87000000000000000000000800000000000F028 +:10E8800000F000000000FF3500353A303A3F00004C +:10E890000080F0F03C3C05050000F0F000000404AE +:10E8A0000404F0F0F0AAF0FCFCFC00000000000002 +:10E8B000000000000000000000800004001089003B +:10E8C000000008002100000000000005400820842E +:10E8D00000800085200401000000000000004000CE +:10E8E0000000888020840000C0000000400020005C +:10E8F0000000C00020000003000000110000101103 +:10E90000200200038908210000002000000400000C +:10E91000004000008440C0C0000000000020004013 +:10E9200000000004880488000000000004000000CB +:10E9300000000000200000000000000800010001AD +:10E940002000000080002000000000000004000003 +:10E9500000040004000400000800000000000000A3 +:10E96000000000000002000200000000000400009F +:10E9700000000000000000000000400000880000CF +:10E980000000000000004090840000000000000033 +:10E990000000000100000001000321000000000051 +:10E9A000050100000001000100000000000000005F +:10E9B0000000000200000000000000002080200095 +:10E9C00000800800080300000908000000000000A3 +:10E9D0002002000000000000000400000000000011 +:10E9E000000040000000000000000841080008008E +:10E9F00000410000900008000009000000000083B2 +:10EA000000090800008090020000000000000000E3 +:10EA10000000000040000000000001020000008033 +:10EA20000080900001002009000201800000A10088 +:10EA30000000040000000000000000000000C1040D +:10EA4000800000048400800800088800000800009E +:10EA5000000000010000008800000001000000002C +:10EA6000008400000008000400040008800880C042 +:10EA700080000010000800000000000000000002FC +:10EA80000040000280020902000500044108001055 +:10EA9000000002000484919000000000400100008A +:10EAA0000004000400002000850000052004000090 +:10EAB0000400001080000000000000000000004181 +:10EAC00000050100000088210000C002C010000203 +:10EAD00000080000002100080000002100030008D9 +:10EAE00000088808000800002000008820080000B6 +:10EAF000000000A100000000000000000000000075 +:10EB00000000200820110900400040008800020495 +:10EB100000C000C0904041C0100000000000004054 +:10EB200002000000008000410082004000402004FC +:10EB30000000000000000000000000000008C0000D +:10EB400000000500208400A00084000000000821CF +:10EB50000000000003000800000000000088000022 +:10EB600000200400030000000082800040048000B8 +:10EB70000000000000100000000000000000000085 +:10EB8000000000048400800088008400000005006C +:10EB90000200400341031101C0030004000003A070 +:10EBA0000003808400080040030221410001008925 +:10EBB00080850000008400000000000000000000CC +:10EBC00010000405000004000000008000000000A8 +:10EBD0000000400000000800000000800100A000CC +:10EBE0000000000000000000000008830000000595 +:10EBF0000100004040000811000082000000C00039 +:10EC0000000000000082000200000002000000007E +:10EC10000880098000000000A0000800100011001A +:10EC200008000411A080C000000000830080008064 +:10EC3000010000800009820900080000C0000000F7 +:10EC400000000800000000000000000008040000B0 +:10EC50000000000000000000000000000020040090 +:10EC60000000000000000000000000000020000084 +:10EC70000820200000C100C080C0000000900000FB +:10EC800000000000000000100090008800900000CC +:10EC9000000000020404000040000000000000002A +:10ECA000900000000800000400C000C00004004004 +:10ECB00000044088100240084000090021A0000024 +:10ECC00000000000000010032021C04008050020C3 +:10ECD0000005008008210021000000009021008034 +:10ECE0000000094004210000000000039000110012 +:10ECF00020080020040000000000001008080005A3 +:10ED000000000000000000000000000084089100E6 +:10ED100004410002048004000000C0000000C000A4 +:10ED2000404041A1C02100008805A080008382806E +:10ED30000004020408040040020008000000A000D3 +:10ED400000000008C000000000008000090800006A +:10ED5000000400000004A10803C00200000200C07B +:10ED600000100000020180900984000000000004EF +:10ED70002000808400018084008400000084000062 +:10ED800002000000000000040000110005000084E3 +:10ED900020000400400000020000040000004100C8 +:10EDA0001100C0A11040000405C0008200400040D6 +:10EDB00008400591830100A1050141080000000001 +:10EDC00000A000000000000000880021C000042016 +:10EDD000822104080004000482110003082182211A +:10EDE000000800000800008000000000A0000000F3 +:10EDF0000009100200000000080000020009008263 +:10EE000000090002000000020003000000040009E5 +:10EE10008200000000000041100801800000000096 +:10EE20000008000009111008C04000008804882074 +:10EE30000000080000042004020908000021000866 +:10EE40000041000800000021000000210000000037 +:10EE500000000000000000010001000000000000B0 +:10EE60000000000000000000002000000000210061 +:10EE70000000000000000000000000000000000092 +:10EE8000001021400000008400000000000011017B +:10EE900009000002000205000000800120020000BD +:10EEA000000021000000408480A100A10300008335 +:10EEB000008400000800080100010088110004001F +:10EEC00000A0098809A00000000000020000A04185 +:10EED000018220410241C00000A0008408C000005F +:10EEE0000000000000000000000000000000000022 +:10EEF00000000000000000009100100000008510DC +:10EF0000840200100408000000000000000000005F +:10EF1000C1010082000082A0C0010001040088201D +:10EF200009C100098820C00101C1898910408200FF +:10EF3000031101048209C0A00203A10904A19004E5 +:10EF400040A0000200C0100200000000000000000D +:10EF500000C10903001180108300000005808000BB +:10EF6000000010000000000011000000050000007B +:10EF700000000000000000001100880040000000B8 +:10EF80000980000000808080000000000000000078 +:10EF90000000A108000009020011C0410008801013 +:10EFA0008008098821888004802120C0A0890083EE +:10EFB0008000898803C140820403A0904121090395 +:10EFC00000830080000000008000000000000000BE +:10EFD000000009801000881111110008802180882C +:10EFE00000000040000000000000000800C0000316 +:10EFF0000080000000100000000010080500204103 +:10F0000008000000002180008000000000000000D7 +:10F010000000000002008040858010911000210057 +:10F02000890091A1820000001100802100000040B1 +:10F03000008080000300A10002890810C089C084FC +:10F04000800821A000000000808000000000000077 +:10F05000000000001008A000A000A0001000100098 +:10F06000A021084000010000000000000001002174 +:10F07000000400080000000100A0000001010004DD +:10F0800001000104A0001000820008000000000040 +:10F0900000000000000004002001A110C010008842 +:10F0A0000100A000919108A090000000C0010000A4 +:10F0B000C001A08282C0020004900111201102044C +:10F0C00084044090018282008200A0048400000039 +:10F0D000000000000000400501A091C189850202E6 +:10F0E00008100002A1020000000000010000000062 +:10F0F00020000400000000000200000000000000EA +:10F10000C00008010000C0C00288000211C0000059 +:10F11000000000000000000000820010108200C00B +:10F12000002100200189012008080109080102C10D +:10F13000C0C00021008509C1010100050808901028 +:10F14000A1050800C0A0002102C0008400A00800A2 +:10F150000000000000000000808811854105114179 +:10F1600080000080000090000005000300200005E2 +:10F17000000080000000410000008000000000004E +:10F1800009208005802041030000808000800480E9 +:10F19000000000000000000000000041000210110B +:10F1A0000408001003A01040020480C103899121CB +:10F1B000828900041110009040C110080089058068 +:10F1C00000A010C08504200208408000000000005C +:10F1D0008000000000000000000008840000080912 +:10F1E000050000008000000080000000000000001A +:10F1F00000008008804100000000800080000000C6 +:10F20000000000080003000000088000800000806B +:10F210008000000000000000000000000040888026 +:10F2200090000200411000800000110010000880D2 +:10F230000400110080000080000000008841880068 +:10F240008280090040002000210010110010800081 +:10F2500000800000000000000000000000A000A0EE +:10F2600001830100000004104010A0000000000015 +:10F2700000000000C0010401C000400002000400C2 +:10F280001000040000200000000000010400A002A3 +:10F29000C084040000000000000000000000040220 +:10F2A00008A08404A000010000A0000001000000EC +:10F2B000890890880800C000C00800202000038949 +:10F2C00005A0090883004000A1A0A14001010000A1 +:10F2D00004028440C0000000000000000000810023 +:10F2E00000E000000006000000E000004200000016 +:10F2F000000000000000008200E007004100000064 +:10F30000000000000000008100E007008200000013 +:10F3100000000000000000000000000000000000ED +:10F32000810000E000005000880600E0070088002F +:10F3300000000000000000060000000000000000C7 +:10F34000810000E000004100000000E000006000DB +:10F3500000000000070000000000000000000000A6 +:10F3600000000000C0C0D0F0008D008D0000000043 +:10F3700000000000000000006666F0F000000000E1 +:10F38000E7FC24FC0000000000000000000000007A +:10F39000FF00FF00000047470000000000000000E1 +:10F3A0000000FFFFFFFFFFFFFFFF00000000200045 +:10F3B000FF00C30FC30F8989FFFF81E7FFFF033FF2 +:10F3C000FFFFAC3CA3C3F6660666F0666666BDFF4B +:10F3D0002400381838180424042400000000000019 +:10F3E000000000000000D0F0D0F072FF72FF0000BB +:10F3F000000100000000000000003C3CFF00000095 +:10F400000000E7C024C00000000000000000000071 +:10F410000000FF000C0000994747000000000000BA +:10F4200000000000FFFFFFFEFFFFFF7F0000000065 +:10F4300020000000C30FC30FB9B9FFFFC3C3FFFF14 +:10F440000F0FFFFFAC3CA3C30999F9990F99999944 +:10F450004200DBFF381838180C3C0C3C0000000060 :10F46000000000000000000000000000000000009C :10F47000000000000000000000000000000000008C :10F48000000000000000000000000000000000007C @@ -155506,495 +155506,495 @@ :10F4B000000000000000000000000000000000004C :10F4C000000000000000000000000000000000003C :10F4D000000000000000000000000000000000002C -:10F4E0000000000000000000C3C3000010910000F5 -:10F4F000C3C3000042C30000FFFFFFFF000006FF80 -:10F5000006FFFBFFFFFF08F700FFFFFFFFFFF0F024 -:10F51000F0B00000000000000000000000000C0C33 -:10F52000C3810203F6FF00005840262600000000B9 -:10F530000707195BFF66FF66240024000000000037 -:10F540008999FFFF0090079700000000000000006D -:10F5500000000000000000000000000000000000AB -:10F5600000000000000000000000E7F30000FFFFC3 -:10F570000000CFFF0000FFFF0008FFF70000FFFFC3 -:10F5800006FF3AC30400000000FF00FF40707070E7 -:10F59000FFFFFFBD000000000000000000000000B1 -:10F5A0000C0CFFBD0003F0FF00005ADB2626000014 -:10F5B000001007070143990099002490BD990000AD -:10F5C0000000000066660090069600000000000043 -:10F5D000000000000C0C00000000F6FC0000C3401E -:10F5E000C343000000000000000003E3030E8C0D85 -:10F5F00092C003E3030ECC09B2C00361030F0C0DEC -:10F6000090C0030003080C0010C0030003090C00A5 -:10F6100000C005610A0FC50D00A000610007000DC4 -:10F62000000080615007001D00000000A06150260E -:10F63000800D00A000613006000D000000003000C9 -:10F640000000000000000030009000050060000194 -:10F65000C000000000610006000D0000006100060F -:10F66000009D000080610006000D00000000000009 -:10F670004FBE843F00F3000030303F3F00000000E9 -:10F68000000000000000000000000000707050004A -:10F69000AA0078503F03FF14F303F00000000000BD -:10F6A000000000000000000000000000000000005A -:10F6B0003028005550557F5F2F0F3C003C3C000028 -:10F6C000000000000000000000000000000000003A -:10F6D0000F0F00C3C0C08082A0AAFFD7FF070000A1 -:10F6E00000000000000000000000300AF00C0000E4 -:10F6F000000007BE86BFF3F3000030303F3F00003C -:10F7000000000000000000000000000000002020B9 -:10F7100050000000785003030014FF0FFC0C0000A1 +:10F4E000000000000000C1C1C100CBCBCBCB1E008F +:10F4F0001E0000000080000000000000000000006E +:10F5000000000000000000000000000000000000FB +:10F51000000000000000400000000202070200009E +:10F5200000000000000000003CFF3CFF99000000CC +:10F53000C3C3C3C30066FF66FFFFF099FFFFD0D0CF +:10F54000FFFF99F066666966A5A3A5AC959565650C +:10F55000C33CC03F04DF04DF2400FF009900990092 +:10F560000000000000000000F9F9F900F6FFF0F9D2 +:10F57000FFE1FFE10000C3C3000000000000000045 +:10F58000000000000000000000000000000000007B +:10F590000000000000000000F0F000004F4FEF4FAF +:10F5A000000000000000000000003CFF3CFF99004C +:10F5B0008000C3C3C3C30066FF66FFFFF0F0FFFF18 +:10F5C000F4F4FFFF999999999996A5A3A5AC9999F7 +:10F5D0006666C33CCF30FB20FB202F00FF00990064 +:10F5E000B92000000000000000000061000480005D +:10F5F000000000610007000D000000610006000D22 +:10F600000000A0610A2F050D00A00000000000000E +:10F61000000005610A2F050D00A000000000009009 +:10F620000001000000000000000000000061000177 +:10F630008001000100610026800D0000406380060B +:10F64000002D920240E38006002D9002406180016F +:10F650008021100240618007002D08020000000098 +:10F66000000000000000000000000000AFAF050532 +:10F67000FCFC82BE00000000000000000000000052 +:10F680000000F0F00000000000000000000000009A +:10F6900000000000000000003A0F3AFF00000000E8 +:10F6A00000000000000000000000000000003030FA +:10F6B000303000C0FFC01414000015051515C0CA75 +:10F6C000CFCA0000000000000000040000003F302E +:10F6D000FFFF3838FBFB8000000000000000000046 +:10F6E000000000000000000000000000000087870C +:10F6F0008787C0C082BE000000000000000000003C +:10F7000000000300F3F00000000000000000000013 +:10F71000000000000000000000003A003AF0000085 :10F7200000000000000000000000000000000000D9 -:10F73000FFFFF3EB00555555705020003C003C2076 -:10F7400000000000000000000000000000000000B9 -:10F7500000000F0F00C3C0C0C0C3F0FF00000000D6 -:10F76000000000003C140C0C00000000300A000CEB -:10F770000000000000000000A8AAAAAAFDFF0102E4 +:10F73000FF00FF0000C0FFC01414C3C3150515155A +:10F74000F0FAFFFA000100000000000000000001D4 +:10F750003F3000001010D3D380C0C0C00020000094 +:10F760000000000000000000000000000000000099 +:10F77000303028EB303030F3000000000000000093 :10F780000000000000000000000000000000000079 -:10F79000C30341000000000000000000C3FFFEFEA4 +:10F79000000000000000000000000000FA0CFAFC6D :10F7A0000000000000000000000000000000000059 -:10F7B000000000000000200000005555F7750F05FF -:10F7C0000301000000000000000000000000000035 -:10F7D0000000FF77FFFF00000000F0F01000800045 -:10F7E00010100000000000000000000000000000F9 -:10F7F00000000000000000000000FCFFFFFFB0D38D -:10F80000004D0000000000000000000000000000AB -:10F8100000000003410000F0ACAC00000000003C20 -:10F8200002020000000000000000000000000000D4 -:10F830000000000000000000000000005555D755F2 -:10F84000FF55C34100000000000000000000000060 -:10F8500000000000FFFFFF7700FFAAAA10001000C1 -:10F8600080001010000000000000000000000000F8 -:10F87000000000002000C0000000880020002000E0 -:10F880000000200500000000200088008800000023 -:10F89000000000000000000000000000050005005E -:10F8A000048000900000000500000002000000003D -:10F8B00000000002000240088200044040020100F3 -:10F8C000210020828482840000092004880800002E -:10F8D00020000000000000080400200004080000D0 -:10F8E0000000000000000000000000000000000018 -:10F8F0000000000400000000000000020000000002 -:10F9000000000000000000000000000000000000F7 -:10F910000000000000000000000000000000A00245 -:10F92000A0008004000400000000000000010000AE -:10F9300000000000000100000900404000A121017A -:10F9400004000402002100210000000080000000EB -:10F9500000008000000000002000000000200000E7 -:10F960000000008400000000000000000000000013 -:10F970000000000000000000000000000000000087 -:10F98000000000000000004000000000080000002F -:10F990000000000000000440908000009000C000C3 -:10F9A0000000000000000140000084000000000092 -:10F9B0000080000000000040000004000100000082 -:10F9C000002000800000000000100100C1000000C5 -:10F9D000058000000000000000900080888000800A -:10F9E0000002000020802000001000000000000045 -:10F9F000000000808200000002100000410000882A -:10FA00000088000000000000040000000000050065 -:10FA1000008800840000008420840010008800908A -:10FA20000010000000000000040800000002008434 -:10FA3000008400100008000800080000808404080A -:10FA40000008090900020008000800082000200240 -:10FA500009402002000800040008001004100010F3 -:10FA600000100005008400020008040800000000E7 -:10FA7000200000880002008400880084000000004C -:10FA8000000800080000000000400008000000001E -:10FA90000000000800080000000800100005000039 -:10FAA00001000000000300000008404000000008C2 -:10FAB00000000008000800210000002100000040B4 -:10FAC00089820009009000800002000008080021DF -:10FAD000000200000002000000080002000800030D -:10FAE0000040000300000011000000200021000879 -:10FAF00000040000000200030008000800080000E5 -:10FB00000302110000A00082000000A0008200A0FB -:10FB10000088000000100000030800001100030826 -:10FB200000A0080808A000A0008200008082000059 -:10FB300000002184000020000000000000C0000040 -:10FB40000001021103820010084000010010800132 -:10FB5000000000A100200320000000000000400081 -:10FB6000000003000200008200000808088308006B -:10FB7000000400A1000008010008000000000000CF -:10FB800000000000000008008200040000000000E7 -:10FB9000C000040000000800000000000000040095 -:10FBA00008408440A010840000000800A000080065 -:10FBB000824000400800C0000805820082008200E8 -:10FBC0000000000004004009401110000082A00065 -:10FBD000018800100410000000000000A0000000D8 -:10FBE0000000000000080000000000000000040009 -:10FBF0008400000201020109001000020000000060 -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 -:10FC200000000001000100010000000000000000D1 -:10FC3000000000C0000000100810000000A000003C -:10FC400000000000000020000000408400080003C5 -:10FC500000001009009100840000008241000000B3 -:10FC600000000000000000080000000000C00000CC -:10FC7000A100080000002000200800010000000092 -:10FC80000000100000080000080000000000C00094 -:10FC9000000000000000080000080041080000000B -:10FCA00000000000000000000100C080080000000B -:10FCB00000020005004100000010004000000000AC -:10FCC0000000000000000010000084000880000018 -:10FCD0009003000040000002204000098200000064 -:10FCE0000005C021A0030000080220040000000855 -:10FCF000A0200440084000000008C10808000021BE -:10FD0000C004C0000000008800000000000000A047 -:10FD100009842010201000020008000020840084C4 -:10FD2000008400C000840010038408040810000050 -:10FD300005A0200400A000840000030800000000CB -:10FD40000082210000000000000000A002C0850425 -:10FD5000400040A0000002900010000000000000E1 -:10FD60000000000003C000000000000000080000C8 -:10FD7000004004A100400800080000002001080025 -:10FD80000000088800A0000000000008000000003B -:10FD90000000000000000000000000410000000022 -:10FDA000C000000008000008001008080800000853 -:10FDB0000008000840090000002100008200000443 -:10FDC00000118400900200000000004100040800BF -:10FDD00040108209828200038221000040059021A8 -:10FDE00040000102A184210400004008C02140001D -:10FDF0000000000001809121840400000000001038 -:10FE000000210000000000090000000000000000C8 -:10FE100000000000000000000000000000000000E2 -:10FE20000000000000000000000000000000800052 -:10FE30004100000000000000008400C0000000003D -:10FE4000200400000000000000A0000000C020040A -:10FE5000800040030000090300A000000000000033 -:10FE60000084000040002005A00100000000000008 -:10FE700000000000000004200400000000020990BF -:10FE8000000008000000000000000000000000006A +:10F7B0000000C3C300003CFF3C000000000000FF4D +:10F7C00000C0CAC0CACFC300C300550F0F0F00004E +:10F7D0000000FC0CFFFFF000F0FF000000003C3CCC +:10F7E000ACAC0000000000000000000000000000C1 +:10F7F0000000F3F328EBF3F330F300000000000007 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000A0CD2 +:10F820000AFC0000000000000000000000000000D2 +:10F8300000000000CFCF0C0C3C003C00000100C1D8 +:10F8400000FF00C0FAF0FAFFC300C300550F0F0F0E +:10F8500000000000FC0C00003C3C3C3C0000800030 +:10F860003C3CACAC000000000000000000000000C8 +:10F8700000000000000000002000400000008800A0 +:10F880000004000020000000200020000000000014 +:10F8900000002004008004842000400402080200CC +:10F8A0000000000020000000840420000020A000D0 +:10F8B000000020040003C000200020002000000001 +:10F8C00004000004050420000002200020110000B4 +:10F8D00020000004200400000000200084000080BC +:10F8E00000800080000000000000000020000000F8 +:10F8F0000000A00000024000000000000000000026 +:10F9000000000000000000000000000000000002F5 +:10F9100040000000100000048021210000010000D0 +:10F920000000000000000000000000000000009146 +:10F9300000040000000000000000000000000000C3 +:10F9400000008000000084000000000000000000B3 +:10F950000904090400000000000000C000000000CD +:10F960001020002000200000040000000008000417 +:10F970004002000200000000000000000000000043 +:10F980000000000000000000000000000000000077 +:10F9900000000000000000008200020000030000E0 +:10F9A00040004000000004020000000000000000D1 +:10F9B000050001000110090000000000000008001F +:10F9C00000000010000000000420000000000010F3 +:10F9D00004008200000900090085080000000009F9 +:10F9E0000000050001000100050004000200000005 +:10F9F0000400000005808405840000400000000031 +:10FA000009000000000800000000004000000000A5 +:10FA1000000000000000000400820000800000845C +:10FA200000008000800400000001000000080010B9 +:10FA30000000C090400020002000000040000000B6 +:10FA40008000000000110000000000010000009094 +:10FA5000041000000088040000000002800000087C +:10FA60000000000004000400040004000000040082 +:10FA70000000820000000402000004000000A0005A +:10FA80000008C000A00000000000200000000000EE +:10FA900000000000000800000000000000008800D6 +:10FAA00000002000000000008200000000000000B4 +:10FAB0008408000000410141004020410000900006 +:10FAC0000108A000A100000000000000008000214B +:10FAD000A000400000048800000800008800000822 +:10FAE00000400100000000000000000000020000D3 +:10FAF00000002000000088000000000000000084DA +:10FB000000000000004000040000000000020000AF +:10FB10000008000800000002000000880000040047 +:10FB20004100000000000000080000A000000000EC +:10FB300000A00800000000082000090000080000E4 +:10FB40000500400005000200000000A00510002094 +:10FB500000A040A0000010004010000000000500C0 +:10FB60004100008202000508000000000084000936 +:10FB70000000000000000000000203000000000080 +:10FB8000000000000000000008000000080008005D +:10FB900040000000000000000000000082000000A3 +:10FBA0000005000000040004000000000000000048 +:10FBB000880000000009880000000000000020000C +:10FBC00000000000000000000080080008000000A5 +:10FBD0000000000000000000000000004000900055 +:10FBE00000000800000000000800000008000000FD +:10FBF00008000011002008000011A000080000000B +:10FC000008000000000000000000000000000000EC +:10FC100000000000000000000000410000000300A0 +:10FC2000030000000000000100010040004000004F +:10FC300000000000000400040000000000040000B8 +:10FC4000800000000000008400C00040000000822E +:10FC500000880000000000A000000000000000007C +:10FC60000000000000000002009000C00000000042 +:10FC7000110020000000000100000000000200024E +:10FC80000000000400000000000000000000000070 +:10FC90000000000000002000000000000000000044 +:10FCA0000400820000002000000009800000000025 +:10FCB0000041000000000000000000102080200033 +:10FCC0008800200000004000020000000221000225 +:10FCD0000003000000A00021000040000000000020 +:10FCE000C000000000000100084000840020004126 +:10FCF000000000000180820000000000000000837E +:10FD000000004000004100C0090440002104000040 +:10FD100000001104040000C0000000000084000086 +:10FD200000840088009003C08400000008100002D6 +:10FD300000000090408400000000000000008004EB +:10FD4000800000008000000080908002200080C0C1 +:10FD500000010900000403210500000405040090CF +:10FD600003000300000000000800004005402120BF +:10FD700002000300210040200000000000000500F8 +:10FD8000000400000000000020000000000000004F +:10FD90000021000000000000000000000000000042 +:10FDA000820000000000001100800002000000003E +:10FDB00000080000000000040041001000000002E4 +:10FDC000000000002000200000008403010000412A +:10FDD000000000002020000900000000900000004A +:10FDE00000020000000000009000004140110409E2 +:10FDF00000000000000000000200080000000002F7 +:10FE0000000040004000000400000000000000006E +:10FE10000000000000000000000000000040004062 +:10FE200000000000000000000000111000000000B1 +:10FE300000842000000000002000000000000000FE +:10FE400000000000000080008000000000000800AA +:10FE500000C00900080008010000000000000000C8 +:10FE60000000000000000000000000000000000092 +:10FE700000000000000000000000000020900004CE +:10FE800000880000000000000000000000000000EA :10FE90000000000000000000000000000000000062 -:10FEA000000000000000000000000000040000004E -:10FEB00000009000000001001000000000000000A1 -:10FEC000840000000000000090000000000304C057 -:10FED0000009A0048403100101019000100000003B -:10FEE000010084010001C003402100A0A00502A080 -:10FEF000041008A00882A041011184889089A00301 -:10FF00000082100204C00000A00182010001000074 +:10FEA00000000000000000000000000001A10000B0 +:10FEB00004030009000005018800000000000000A4 +:10FEC0000000000000010100080000010000C1C0A6 +:10FED00010210021A088C004909000109090000094 +:10FEE00000000000000000849108828410100000CF +:10FEF000000000000000000000000000000000A062 +:10FF000000A000C084C0018300830009C00000007D :10FF100000000000000000000000000000000000E1 -:10FF20000000000000000000000000000000800051 -:10FF300000000000000000004100850000000000FB -:10FF40001000800000000000000000000000000021 -:10FF5000000400840085001000202121000380059A -:10FF600000090204C00200028041800800100083E2 -:10FF70000080C1808080008088A0110880C100209E -:10FF800080C1034180908010002080100003002178 +:10FF2000000000000000000000000000000011843C +:10FF300000210090000400200821000300000000C0 +:10FF400000000000000000110811800900100000EE +:10FF50002180808800080000A09080A000A08083FD +:10FF6000000000000000000000008380800080800E +:10FF70000000000000000000030005000000000079 +:10FF80000080000000000000091100210041000075 :10FF90000000000000000000000000000000000061 :10FFA0000000000000000000000000000000000051 -:10FFB0008000001180C080000020000000200000B0 -:10FFC0000000020005004000100009102000100091 -:10FFD000000000008009808080002000A1008800CF -:10FFE00002050305112009030891080090009011F3 -:10FFF00090100000000000850000028040110010F9 +:10FFB00000804108901110800980040002000308AD +:10FFC000000000000000000041800800091110043A +:10FFD000000000808010808000038000001180807D +:10FFE000808000000000000000000000800200008F +:10FFF00000800000000200000000000000800000FF :020000040026D4 -:10000000042190800820C011081141000300031052 -:1000100010200000000000000000000000000000B0 +:1000000000000000000080000000000000A100824D +:1000100000400000000000000000000000000000A0 :1000200000000000000000000000000000000000D0 -:10003000000040000000A009C0000000000800000F -:1000400000A0000001000100008401000000010286 -:1000500001000000A0020490A008C040C1040940B3 -:10006000A1009040008200000082018821880400E5 -:10007000A1010501000000000010000000C0000107 -:10008000000800210310A101A109030000C0000025 -:100090000000000000000000000000000000000060 +:10003000000088088801030190880010000000007B +:100040000101000000000000000000C000000001ED +:10005000010000004002A0010282400002002001D5 +:10006000A084829000000000000000000000020157 +:100070008484C09000000001000400000000002003 +:10008000000000A00400A000A000820000908840B2 +:10009000821084000000000000000000000000004A :1000A0000000000000000000000000000000000050 -:1000B000000000000090000400A000C00100040146 -:1000C000C00000000000000000010000000000006F -:1000D00000010000000008A000200890A0C000005F -:1000E00001110809000000000500A1000001C0087E -:1000F00001041184A0088202000200040009041017 -:10010000001091410883048301A10990A08300019C -:100110000100A0000000000000000000000000003E +:1000B00000000000040001000801C1010000000070 +:1000C0000401000100000000000000000000000129 +:1000D000910101010000C020A0100004A0C0C0C018 +:1000E000001001A008A00000000000000000C009EE +:1000F0000005048501100000000000000000010060 +:100100000000400100011000008400A040A0100089 +:1001100000080010000800000000000000000000BF :1001200000000000000000000000000000000000CF -:100130000000000000000000000000000080100926 -:10014000804000104009000400100021000400203D -:100150000002002100020000C00408102040898035 -:100160004003031010881120004182402004050242 -:100170008080118088800200008300830004008852 -:100180000005050088A109C00002118205051002C2 -:1001900000022041C108000900000000000000002A +:100130000000000000008020080800108911000263 +:100140000041002100030000000000000000090041 +:1001500000034004111000008080808000008000B7 +:1001600080000880100080000000000000000000F7 +:100170008091004000114084000000000000000059 +:10018000100000400020004080000000000000003F +:1001900000000080008000800000000000000000DF :1001A000000000000000000000000000000000004F -:1001B00000000000000000000000000000008000BF -:1001C0000000000300000000000000000000000428 -:1001D00000800000000080200000A1040940908001 -:1001E000880041804040400002054121210021005B -:1001F00004401010218009800810000300008000D6 -:100200008000A104831005000402088040801000D3 -:1002100008080882400040000320000000000000A1 +:1001B0000000000000000000411010C10500030015 +:1001C0000280080921000302000000000000000076 +:1001D0000008112110000820000021009090858067 +:1001E0008800000080000000000000000000000007 +:1001F00000000011808580800000000000000000E9 +:10020000000000000000000000000010808080005E +:100210008000400400008300820000000000000015 :1002200000000000000000000000000000000000CE -:10023000000000000000000000001000C00420408A -:10024000100000000000000000000040000000005E -:1002500000008808A000C00008000000090104A1F7 -:100260000490A10001C001A0010201008311A000BF -:1002700009008200018800A00104010182008800B9 -:1002800040000200C10041011000100183A083C0A2 -:10029000A1A0910100090000000000010000000081 +:100230000000000000000000000001010141918861 +:100240008800001001000100010000000000000013 +:100250000000000101000100010100000300090885 +:1002600008108900000002020020000000000000C9 +:10027000000000000000824010100200000020007A +:10028000040000000000000000000000C00010207A +:1002900008C00400020008204002A1000000000085 :1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C0000600000000000060060050000000000072 -:1002D000000000000000000000000000000050814D -:1002E00000E00600000000000000060060000000C2 -:1002F000006000000000840000E0000060000000DA -:10030000000000000000000600000700420084001A -:1003100000E00000420000000000000000000000BB +:1002B000000000000000000000000000818100E05C +:1002C000070088820000000000000000000000001D +:1002D00000000000842100E007004200000000064A +:1002E00000000700810000410000070060000000DE +:1002F0000000000000000081000007004200000034 +:1003000000000000000000000000070000000000E6 +:10031000000007000000410000E0070000000000AE :1003200000000000000000000000000000000000CD -:100330000000000000000000000000000000FF0FAF -:10034000FFEBAFAF00000000000000000000000065 -:100350000000000000005555515100000000000051 -:10036000F700FF00AA00AAAA000000000000000099 -:1003700038AA7DAA0000000000000000FBF1FBF19C -:100380002020202C2C03EC0F3F3FA0AFBA82BABE36 -:100390000000000015003F00000000000000000009 +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000D100F9003FAA3FFF00000000EBFF4B5F08 +:1003700000000000000000002F7F2F7F3CF03CF0C9 +:10038000A0AFA0AF000000000000000000000000CF +:10039000CFCFCF0000FF00F0FFFF55F500000FFFAB :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D -:1003C000AA00AAAAAFAF0040000000000000000091 -:1003D0000000000000000000FFFFF3FF000000002D -:1003E0000000F7D7FFFF0404000000000000050034 -:1003F000050038AA28AA0000000000000000FFFF46 -:1004000000002020202C2C00EC0C3030A0AF8A8281 -:100410008ABE0030A0A015153F3F0000000000007C -:1004200000000000000000000000000000000000CC +:1003C0000C0C0C0C000000000000000000000000FD +:1003D000000000000000000000000000000000001D +:1003E0000000C100C1003FFF3FFF00550055000065 +:1003F00000000000000000000000207020700000DD +:10040000FFFF00FF00FF00000000000000000000F0 +:100410000000CFCFCF0000FF0000C3C341E10000C8 +:100420000F0F0000000000000000000000000000AE :1004300000000000000000000000000000000000BC -:10044000000000000000FF55BEBE000000000000DC +:100440000000EFEFFFFF02000000000000000000CE :10045000000000000000000000000000000000009C -:1004600000000000C3FFC3FFAA004D4D00000000C4 -:10047000000000000000000000000000D7D70000CE -:1004800030303030FFFF0303000000003C0F3C0F12 -:100490000000000029296869CF00FF00000000006B -:1004A000000000000000000000000000000000004C +:10046000000000003F3F0FAF555555550F040F00DA +:10047000DFDFDF5F0000000000000000FFCFF3C3FC +:1004800055FF5500000000000000000000000000C3 +:1004900000000000B030F0F000000000000000009C +:1004A000505055FF00000000000000000000000058 :1004B000000000000000000000000000000000003C -:1004C0000000000000000000FF00BEBE00000000B1 +:1004C00000000000FFFFFFFF000000000000000030 :1004D000000000000000000000000000000000001C -:1004E00000000000000083ABC3FFAA000C0C00005A -:1004F0000000100000000000000000000000570293 -:10050000570235FF3535FFFFFF0000000000550F93 -:100510000F0F0000000029294040FA00FA000000F7 -:1005200000000000000000000000000000000000CB +:1004E00000000000000030300FAF555100000F0039 +:1004F0000F00D7D7D75500000000000000003C0CCB +:1005000030000F0F0F0F000000000000000000007F +:10051000000000000000A000F0F0FF14FF1F00F03A +:10052000000050F055FF0000000000000000000037 :1005300000000000000000000000000000000000BB -:1005400000000000000000000000004000080561FD -:100550000A0F050D00A000610006000D00000061FB -:100560000006000D0000000085610A3E859D00A583 -:1005700005610A0E051D00A000610007000D0000C6 -:10058000006100048005000000610006000D00000D -:10059000A0610026000D000000610004800500003D -:1005A00000610006000D00000000000000000000D7 +:1005400000000000000000614028800100010061FF +:100550000006000D00000000000000000000056122 +:10056000002880010000000000612026000D00012D +:1005700000610026000D00000000000000000000E7 +:100580000061002E000D000080000000000000004F +:1005900005790A06050D05A0000000000000000016 +:1005A00000610E02801D000000000000000000003D :1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D0000000000001030F0F0000000004C704C763 -:1005E0000000000000CF00450000E0EB000070F2CA -:1005F00070F24000000055054101000000AAB0B0B3 -:10060000B0F05F1E0A1E0000000000000000200382 -:10061000E00F00000034550014004D7D4D55C3031C -:1006200055555055101455005501000000000000AC +:1005C0000000000000000000050CFCFC0080C08062 +:1005D00080808080F0FFFFFF00000000000000002E +:1005E000FD5DFD5D50FA55FF0000000000000000B9 +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:10061000000000000000F0F000FF000000000000FB +:1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA -:1006400000000000000000000000000000000000AA -:1006500000000000000003030F0F00000000AEEFD9 -:100660002CEF0000000000CF00450000E0EB000090 -:1006700070F270F220004000FF0FC303020200AAD4 -:10068000A0E0A0E05F0F0A0F0000000000000000E3 -:100690002000E00CFFFFFFFFFF003C004D414D55E7 -:1006A000FF3F5555F0FFB0BE55005501000000005A +:1006400000000000000000000000050CFCFC008021 +:10065000C080808080A0F0FFFEFF0000000000004E +:100660000000A808A80850FA00AA000000800000B6 +:10067000000000000000000000000000000000007A +:100680000000000000000000010000000000000069 +:100690000000000000000000F0F0F0F0000000009A +:1006A0000000000000000404000000000000000042 :1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E0005FAA0A0000000000CFFF4555000083C349 -:1006F000C3C30000000000FF00FAFF0FBE0C303043 -:10070000C3C3000000003F305F5F8ABA8EBE0000A6 -:1007100000000000000000010001C0C00A0AFF0F35 -:100720005C5C5F7DFF7DFCFCFCFCC5F5C50000004A +:1006C000000000000000000000000000001F0014F7 +:1006D000F000F0FFFF0F000FFFFFFFFF0000000022 +:1006E00000000000FFCF3F0F3CAAF0AA000000F07E +:1006F00000F0000000000000A0000000000000006A +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:100720000000000000000FFF0F00000000000000AC :1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:100760000000FFAAAA0000000000FFFF555500008E -:10077000AFFFFFFF00000000FFFFFEFEFF0FFF0FB7 -:100780001C140000010000003F3050508ABA82B2B1 -:1007900000000000000000004141C3C3C0C00A0ABD -:1007A000F0005C5C0028A028FDFDFDFFCFFFCF001E -:1007B000200000000400880020000000200020002D -:1007C000200000002000880020002000040000100D -:1007D000200000008800200000000400200000002D -:1007E000200000022000200420000000000400007F -:1007F00000030400000000000000000800002000CA -:100800000400200000022000200020000008000456 -:100810000000200000000000000400110000200083 -:10082000200020000011200420002000000800000B -:1008300000000000000000000000000000020002B4 -:1008400000020002000000000000000000000000A4 -:10085000000000000000000209000000000000008D -:100860000000000000010300000000000000000084 -:100870000000000000000000000000000000000078 -:100880000400000000000000000000000000100054 -:100890000001000000000000000000000000000057 -:1008A0000000000000000000000100000000050042 -:1008B0000000000000000000001000002000000008 -:1008C0000000000000000000000000000800000020 -:1008D000020004000000000000000000040000000E -:1008E0000200008001000000000000800080050080 -:1008F000000000090000000000800000000000006F -:1009000084800000001000000008010004000000C6 -:1009100090800000000000090000000000000010AE -:10092000000001000000000000C000000000020004 -:10093000000000900000000000000000000880009F -:10094000000000C0000000040000000000080408CF -:10095000000800000008000000080008000811005E -:100960000008000000100200048800C0000200021D -:100970000210000004080000200000020008000827 -:100980000000000200000000000000100210000043 -:100990000000000400080004040000000008000833 -:1009A00000080000028800080000000400080000A1 -:1009B00000000004000400840000000000000000AB -:1009C0009000000090000000020000002000C00025 -:1009D00000009000000000002000000000008800DF -:1009E000C0100000C0000000000000000000000077 -:1009F0000000000000000100000000000021C00015 -:100A000000410021882000050002000400210004AC -:100A1000400300210021002100000011002100807E -:100A200000000005402100404000000000210009B6 -:100A3000A0210021200300400020008200000000CF -:100A40000000000000080000000000000008008214 -:100A5000000000A0080000100800030003000900C7 -:100A6000000000C000000000000020000308000893 -:100A7000000003820820080040A0000000C0000021 -:100A800000000800000008900040009121000904C7 -:100A900000080000008200000000000800C0008480 -:100AA000000403000000008800000000050800A00A -:100AB0000082028800008082009000400000000058 -:100AC000A00008000000000000008200C000080034 -:100AD0008200082000000000040082000000C00521 -:100AE0000000000008040000004100410000010077 -:100AF000000900000100000000400100000000406B -:100B00000040004000400040000000400040010064 -:100B10000000000040400005000000000000004010 -:100B20000040000001000000008020800440000818 -:100B3000000000110000040000008300C00000005D +:100740000000000000000000000000000000001F8A +:100750000014F000F0FFFF0F000FFEFFFFFF00008E +:10076000000000000000F0C030003CAAF0AA000029 +:1007700000F000F000000000003CA03C0000000081 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A00000000000000000000FFF0F00000000002C +:1007B00020000000000020000000000000002000D9 +:1007C00000000000000820000000000000000400FD +:1007D00002020000000520000020008004808884C0 +:1007E0000000000000002000C08000040004880415 +:1007F0000003200000000008200400000200200088 +:100800002000000000000000200020000002000383 +:1008100004002000000000040000C00000002000D0 +:100820004000000040000000200020000000000206 +:10083000001100000040000004000000000000A0C3 +:1008400000000000000000000000040000000000A4 +:100850000000800100000000050000010020802051 +:100860000020400000000000000000200000000008 +:1008700000000000000000000000000310900000D5 +:100880000002000000000002000000C000020000A2 +:100890000002200000000000000200000000000034 +:1008A00000001000000080000000000004000002B2 +:1008B00000000002820000000000001000000000A4 +:1008C0000000000000000000000000000000000028 +:1008D000000000000082000000100040000001093C +:1008E0000009010082000800820000000000901052 +:1008F000000090000000000000000009000002005D +:100900000040000002100000000000000000000095 +:10091000000000104009000000000000000000007E +:1009200000000000000090009000840040000000E3 +:10093000000000000010000004000008000000009B +:10094000000000000010000000000000000800028D +:100950000008000000000041000000050001000048 +:10096000040000000400000000000008000800006F +:1009700000080000008400000000000000000000EB +:100980000000000000000000000200000008000855 +:1009900004000010008883000000000000820300B3 +:1009A0000000000000000400000000000004918826 +:1009B000000004000000040088084000400000001F +:1009C000400010008800020000000000000000004D +:1009D0000000000000000000000000000010000007 +:1009E000A0008400A0000000000000000020000023 +:1009F000010000000008000000002000200090809E +:100A0000000090004041000002044000000000008F +:100A1000000010008800000020001000000000000E +:100A2000A000000008000200000088000000000094 +:100A300000000000000000000000000000000000B6 +:100A4000000000000000000000000000000000A006 +:100A50000084038400000000000008100000000172 +:100A600000100000000041A000000008000000008D +:100A7000000004000000050000000000C100C100EB +:100A800011042100110000044000000400000000D7 +:100A900000004100000000000400200000000000F1 +:100AA0000000000000000000000003000000000043 +:100AB00041000000000800080000000000000000E5 +:100AC000000000000800A00000000000000004007A +:100AD00088008800000000000000080000000100FD +:100AE0000080008000008400000008000000004139 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000090000000000090000D3 +:100B10000000000000000000000000004000000095 +:100B20000000000084000000000000000000002120 +:100B3000012000040011000000000040000000003F :100B400000000000000000000000000000000000A5 -:100B50000000000000010000000000000000040090 -:100B6000000011000000000000000000000009006B -:100B700002001188000002000000000102000000D5 -:100B80001185410100010001000100000001000188 -:100B900002040000000000010084110000000000B9 -:100BA00000010001000020A01100000480040001E9 -:100BB00000000900110040000000008220000082B7 -:100BC00000000000000000000200A000000000087B -:100BD00000000000000000000000004008000000CD -:100BE000000082000000820000000000820002007D -:100BF00000000000024000000000900008004000DB -:100C0000000002110441004004A100000040012046 -:100C1000000800000221200400000300C10400407D -:100C2000020500414021C0020204008001200008AA -:100C300000009008201101000100000320030211B0 -:100C4000024000000008000800000400000000004E -:100C5000000000000000000800000000000000008C -:100C600000900000000008000300000000000000E9 -:100C70000800000000000000000000000908080053 -:100C80000400000008A04000080000020500024027 -:100C900040080084008480000000028802020203F1 -:100CA000028880880008000000042101044002003E -:100CB00020200084000889A00200020205008000B4 -:100CC000800883000200080000000000000000000F -:100CD00000000000000000050000000000000040CF -:100CE00000000040000000000000000000000004C0 -:100CF0000000080000000041000000210021002148 -:100D00000008000200000000C021000000000421D3 -:100D100001210000000000000021000300029021DA -:100D20000121008090000041002100A10021000568 -:100D30000021000004000008202120000002000023 -:100D400000020002C00000000000000000000000DF +:100B50000000000000000000000000000000000095 +:100B60002000400800040000000000000000000019 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B900000000000000000000000000000008000D5 +:100BA0000000000000000004000000000000000041 +:100BB0000000200100010000000000000000000013 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000900085 +:100BE0000080828009800380000004000000000073 +:100BF000000000410000000000008280840000002E +:100C0000000000A0050000C00080040000410000BA +:100C100000000000000000000000000000000000D4 +:100C20000000000000000000000000000000A00024 +:100C300008000000000000000000000000030000A9 +:100C4000000021000000000010000000000000046F +:100C50000000000000000000000000840000000010 +:100C6000000440040304A0108204000080000984F2 +:100C70000010000000000000000000400308050212 +:100C800000000000210420000005000441002100B4 +:100C90000000000000000000000000000000000054 +:100CA0001000100000000000000000000000000024 +:100CB0000000210000000000000000000000000211 +:100CC0000004080000000800000000000000000010 +:100CD0000000000000000000000000000200820090 +:100CE0000000000840048200100000000004000022 +:100CF00000000000000000400010000004000000A0 +:100D000000000800000000002000000000000000BB +:100D100000000000000000000000000000000000D3 +:100D20000000000040000000000004000800040073 +:100D30000000000002000000000000000000002190 +:100D40000000002100000000000000000000000082 :100D50000000000000000000000000000000000093 -:100D6000000000000000030003000000000020005D -:100D700000000000000000400000200021000000F2 -:100D80000000000000000000000009004100000019 -:100D900000880200410040840000000000000000C4 -:100DA00000002000000400002100000000040000FA -:100DB0000000110000A000000000A000C08840005A -:100DC00000042102210200000000000000000000D9 +:100D60000000004000008001000080000000000042 +:100D700000000000000000000000000000008000F3 +:100D800000000000080000000000800000000000DB +:100D90000000000000000000000000000000000053 +:100DA00000000000000080000000000000000020A3 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 :100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF000C0000000000084000801C0000201900053 -:100E000090039008028888820000022188080285E9 -:100E1000082103410003088888110808020800829D -:100E2000822002030402000910110808030840820E -:100E300084020803000200111003020302020008EA -:100E400008100809080800118221000000000000B5 +:100DE000000000000000000088050405010808A1BB +:100DF0000202020400A010A0000000000000000099 +:100E000000000000880000000000000100009001C8 +:100E100000010000000000000000000000000000D1 +:100E200000000000000000000000000000000000C2 +:100E30000000000000000000000000040104C020C9 +:100E4000A0100000000000000000000000000000F2 :100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E7000000000000000000000008040200380030C -:100E80000020084000830041009100008020118371 -:100E90000020119020900402004100828080008098 -:100EA00000808000004100020091808384802180C6 -:100EB0008080008080410002009180080041004154 -:100EC0000091009180C180C10088808800000000EE -:100ED000000000000005000000000000000000000D -:100EE0000000008000000000000000000000000082 -:100EF000000000000000000080008000C180400071 -:100F0000400409800000008900000080000090007B -:100F1000409040004083A010088908880382800028 -:100F200080910000808009800289090010919180E1 -:100F3000A1C10911098391808289118004A0A08038 -:100F40000282901183C08980898990118983000071 +:100E60000000000000000000000088410021020393 +:100E70000002808080000000800000000000000070 +:100E8000000000000400000000000000032000003B +:100E900000200040000000000000000000000000F2 +:100EA000000000000000040000000000000000003E +:100EB000000000000000000000000000000003002F +:100EC0000900008000000000000000000000000099 +:100ED0000000000000000000000000000000000012 +:100EE00000000000000000000000000080850003FA +:100EF00080C000208000800500808000000000008D +:100F0000000000000000000300000080000002005C +:100F10000310118000040000000000000000000029 +:100F200000000000000000000000000000000000C1 +:100F30000000000000000000000000000000008829 +:100F40000810408420820000000000000000000023 :100F50000000000000000000000000000000000091 -:100F60000000000000080000000000000000000079 -:100F700000000000000000009000A0000800081021 -:100F80009100030188C0900002C0088490C0000056 -:100F9000090003C1030221C1840003C0020390C001 -:100FA000080008C0020210C0C00202C0030488C0CA -:100FB000084008C0030389C0080808C0020291C0A5 -:100FC000418802C0100383C1088840C0100582C157 +:100F6000000000000000000000000000000090C031 +:100F700088C1909082830200020084829000000069 +:100F800000000000000000000001000200A00000BE +:100F900000000001018400050000000000000000C6 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000090018401A10005000000000000000065 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 -:100FF000000000000000000000040020004000404D -:10100000001000020111000891110008C0401011E9 -:10101000000009100108C141838203100003C010C1 -:10102000111003100008C088108889100002C1C088 -:10103000108883100208C083108985100102C1C086 -:10104000108211100102C010100289100110C0207E -:10105000100200000000000000000000000000007E +:100FF00000080540018288C00202000800900282B9 +:1010000000000000000000000001000000010001DD +:1010100000000000000100010101000000000000CC +:1010200000000000000000000000000000010001BE +:1010300000000000000000000000000000000000B0 +:1010400000000484C00100C100C1000000000000D5 +:101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000009040421000241080091808052 -:1010900000900000C100408488A18884412005039D -:1010A00088834084410000808000000041000800E7 -:1010B0008300000041090082808510094100110071 -:1010C00088000080C10011008880008041001180EC -:1010D000A0000080000000000000000000000000F0 +:1010700000000080C00008804080808000800080E8 +:101080008080000000000000000000080020000533 +:1010900004410000000300040005114000000000AE +:1010A0000000000000000000000000000000001030 +:1010B0000008000400000000000000000000000024 +:1010C0000000000080208004002102400000000099 +:1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 -:1010F0000000000000000000000000000000008070 -:101100000000000021800400090002080008000916 -:10111000008000000000A189840211808403210066 -:1011200008004080090480088000008000000280E0 -:10113000111109800341C18889024180910383A074 -:10114000090909802020108082090980880390897C -:10115000A1090900090300000000000000000000D0 +:1010F0000000000040048889410088008020002012 +:10110000000000000000000000000000004080001F +:10111000000080000000030008118300C0400000B0 +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000830040004000C0040000D8 +:10115000000000000000000000000000000000008F :10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:101180000008001000000102001000100001020021 -:101190008810108208000000090208101084100056 -:1011A0000304031011109000080108101040900073 -:1011B00002A002111110900009080810101003017C -:1011C00008A102101140910188A00811111010010E -:1011D00008A01011118808010000000000000000A4 -:1011E000480000E00000000000420000070000008E -:1011F00000000000000000000000000000000000EF -:10120000000000000000000000000000000000429C -:101210000000000000004842000000000000000044 -:1012200048420000000000004842000000000000AA -:101230004842410000E000004842410000E0000058 -:101240004842410000E000004842410000E0000048 -:101250004842410000E00000484200000000000059 +:101170000000000000008300900388889100900028 +:10118000A0A10804100000000000000000000800FA +:101190001000040010000000888405011100030104 +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C0000000000000000000080021004100910024 +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F0000000000000000000884100E007008200BD +:101200000081000007000000000000000000000056 +:1012100000810000070000000000880000E00000DE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:1012400000000000000000000000000000E00700B7 +:10125000410000000000000000000000000000004D :10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:1012800000000000000000EFEFEF00000000BFBF13 -:10129000BF20F0F03C663F393630000078F93CFF63 -:1012A0003CF6F6F6F0F0663CBDFFB4F0F978FF3C92 -:1012B000BD2DB424F0F0663CBDB42D2478F93CFF7C -:1012C000BDFF2D0FF0F03C66BDB4FFF07878F960FB -:1012D000BFBFBF20F0F03C66BD2DB424000000006D +:101270000000000000000000000000000008000066 +:1012800099107C787C78FF76F372000000000000F3 +:10129000000003430042000000000000C000CC0C2E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C0000000000000000000000000003C006F6F04 +:1012D0003C000000000000000000000000000000D2 :1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE -:10130000000000000000000000FFFFFF00000000E0 -:1013100020BF20203C663C66FF9966000000786094 -:101320003C003C060606663C663C2D0F24006078B7 -:10133000003CFF0FF000663C663CFFF00F00786059 -:101340003C00B4F024003C663C662D240F003C3C7D -:10135000FF0020BF20203C663C66FF0FF00000002D +:10130000FF001010FFF96060B930B130000000003C +:101310000000000003430343000000000000404CB5 +:10132000404C000000000000000000000000000031 +:1013300000000000000000000000000000000000AD +:1013400000000000000000000000000000006F6FBF +:101350006F6FFFFF000000000000000000000000B1 :10136000000000000000000000000000000000007D :10137000000000000000000000000000000000006D :10138000000000000000000000000000000000005D @@ -156005,491 +156005,491 @@ :1013D000000000000000000000000000000000000D :1013E00000000000000000000000000000000000FD :1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000990090B3 -:10141000000000000F270F270F0F0F660636C6F6D5 -:1014200000002D242DBD0F27FFE72427E7273606D0 -:1014300036F63CFF36F60F27FFE7FF0FE7273606A5 -:1014400036F6FF3CF6360F27FFE7FF3CF636F7048B -:10145000F7F73F3F3F6600FF06F63F3F3F660FFF4F -:1014600027E700000000000000000000000000006E +:1014000010000000000000003E3E3C3F343FF6FF6D +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000030000000000000000000005C +:10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000FF5D -:1014900000F0000000000024FFE73C3C3C66003CFC -:1014A000C3FF00000F000FFF0F270024000FFF0FE6 -:1014B0003C003CFF3C0036060024F0E4000F2427EB -:1014C0003C003CFF003C06360024F0E4003C0636BD -:1014D000040404F7030303663C3C363630303066C0 -:1014E0000F0027240000000000000000006100063B -:1014F000800D000000000020000000A0000000009F -:1015000000000000000000000000000000000000DB -:101510000000000000610006002D100240618006FE -:10152000002D1002000040618006002D1002406175 -:101530008006002D10024000800000201002406153 -:1015400080048025100240618006802110024061E5 -:1015500080048025100240618004802510024061D3 -:101560008004802510020000000000000000000040 +:1014800000001000000000008000666600FF000FF2 +:10149000C2CF0000000000000000000000000000BB +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000C00000000000000000004C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:101500000000000000613027804D00010000002035 +:101510000000000000000000000000000061002644 +:10152000000D00000000806100008001000000004C +:10153000000000000000000000000000000000614A +:101540000006000D00000000000000000000000088 +:1015500000000000000000610E07000D0000000008 +:10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000E0EB0000005F0000000021 -:1015A000000001010000000000F30000000F000532 -:1015B000C0F000000000000000000000000000007B -:1015C000553C0F0F00000000FF3C0F55C7D7EFFF41 -:1015D0005F1F4B0B000000001717171700000000DB -:1015E000D70F140F000000000000000000000000F2 +:101580000000000000000008000000000000000053 +:10159000000000000000000000000000000000004B +:1015A0000000000000000000FF3C3F3F28EBF0F08F +:1015B000000000000000000000000000000000002B +:1015C00000000000F0F000FF00000000000000003C +:1015D0000000000000000000A2F382C3000F00041E +:1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB :1016000000000000000000000000000000000000DA -:101610000000000000000000E0EB0000005F005F41 -:1016200000000000010100000000F3F3000000FFD3 -:101630000055C3FF00000100000000000000000092 -:101640000000550F0F0F00000000003C0F55001068 -:1016500028381E1F0A0B000000003F0F030F000078 -:101660000000170F170F000000000000000000002E +:1016100000000000000000000000000000000000CA +:101620000000000055AAEF000000C300030328EBF0 +:10163000F0F00000000000000000000000000000CA +:10164000000000000000F0F0F0F0000000000000DA +:1016500000000000000000000000AAFF82C3000F8D +:10166000000C00000000000000000000000000006E :10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A -:1016900000000000000000000000C3FFC2FAFFF7D6 -:1016A0000000C0F0C3FF00000000000083AFC3FFD4 -:1016B000C3C3C3C1A8AAFCFF0000000000000000D3 -:1016C000000000003C0F55FF4F7FCFFF00000000DF -:1016D00008F80DFD3C0FFF55FF2DFF7DCF0C7D7DE4 -:1016E000EFEF2FEFCF0C7D7DCFFFEBEB0000000085 +:1016800000000000000000000000FF040000000057 +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000CFCF0C0C84 +:1016B000BABFBABF00000000000000000000000038 +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E000FF0F550500000000000000000000000092 :1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:10171000000000000000000000000000C3FFC3FF45 -:10172000FFF7FFF7C0F0C3FF000000000000C3FF99 -:10173000C3FFFFFFFFF5AAAAFFFF010000000000A2 -:101740000000000000003C0F5500003080B0000099 -:1017500000000000FFFF3C0F005500280078CF0C70 -:101760004141202020E0CF0C4141003028280000DA -:1017700000002000200020002000000020080000C1 -:1017800000000000200020000000000820000000F1 -:101790000000200020000000000000000400010004 -:1017A000010001002100000000000000040400000E -:1017B0000000000000000002100000000000000017 -:1017C0000000004100000400000000008804000048 -:1017D00004000409040404000000000200000000EA -:1017E00000000011000000020002000000020004DE -:1017F00000000000000000000000000000020000E7 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:101820000400048204008400110000000000000095 -:101830000000000000000000000180000002000025 -:101840000000000200000000000400000000008210 -:101850000000000000000000000000000000000088 -:101860001000000000000000000140000000000027 -:101870000000000000000000000000000000000068 +:10170000000000000000000000000000FF001010BA +:1017100000000000000000000000000000000000C9 +:101720000000000000000000000000000000CFCF1B +:101730000C0C101510150000000000000000000047 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000FF0F550500000000000000000441CC +:1017700004001000200000000000000000008800AD +:10178000000000002011000000000004200088007C +:1017900020000000200000000000000400044000C1 +:1017A00000004000200000000004000020000003B2 +:1017B00020002000000420000000000804040004B1 +:1017C000040000000000000000000000020400040B +:1017D0000000200000002000008404042004008495 +:1017E000200000028800000400000000000000004B +:1017F0000000000000000000002040000000000089 +:1018000000000000000204000000000000000000D2 +:101810000000000000000040000000400000000840 +:101820002000000000000000000000000000000098 +:101830000000000000000082110000000000000015 +:101840000000000000000000000000000000008414 +:10185000000200000002000000024021000300021C +:10186000002009000000000000000002000200004B +:10187000000200080000000000000000000000005E :101880000000000000000000000000000000000058 -:10189000044082008240000000400200000000007E -:1018A00000100000000000000000000000000080A8 -:1018B00000000000004000000000000000000000E8 -:1018C000008082100000040800000000A00000005A -:1018D00000000010000000000000000500000000F3 -:1018E0000000881000000008000000000200020054 -:1018F00000000410000000000000000000000400D0 -:1019000000000010000004000000000800000000BB -:1019100000840004000000000400000020002000FB -:10192000000400840000000000000010000000001F -:10193000000200100000000400000300000000008E -:10194000000000020000000010000000200800005D -:1019500000000000000400000000008800000000FB -:101960000008000000000300000800000088008458 -:101970000500001005080000000000000000000045 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000400000043 -:1019A000820000089000000000000000000000809D -:1019B0000080000000080000008000802088C080B7 -:1019C0008880C089008408A100A1008000A108804F -:1019D0000080008900A1048804A1008800A1218062 -:1019E00004C0008020A1008002A1888088A188888E -:1019F0000083408002A14080000000000000000041 +:101890000010000000000000000000000000021026 +:1018A00000000000000082000000080000000000AE +:1018B00008000000000000000010000000400800C8 +:1018C00008000840000000000000000000000200C6 +:1018D0000040020000000000020000000000008044 +:1018E0000000008000000200000000100000000066 +:1018F00020000200000000000000000004000400BE +:1019000000080000000000000010000000000000BF +:101910000000000000C000000000000800000000FF +:1019200000080000000000000000000400000000AB +:10193000000000000000008200000000000404001D +:10194000040000080408000000000000020000007D +:101950000000000000000000000004000000000083 +:1019600000200010000400004000000000000400FF +:10197000040004400400000000000400000804000B +:1019800004000000880000000000000000000000CB +:10199000000000000000000000000800200000001F +:1019A0000000000010000000000000000000000027 +:1019B0000200000000000000000000000000000025 +:1019C000000000008800C0000000880004008400BF +:1019D00004000000000000000000000000000400FF +:1019E0000000000000840000000000000000000073 +:1019F00000000000080000000000000000000000DF :101A000000000000000000000000000000000000D6 -:101A10000000004000000000000002000000004044 -:101A200000001100000008000000000000A00008F5 -:101A300002400040008811000000094000400040C2 -:101A40000040004000400040024000400040004094 -:101A50000040004000400040004000400040004086 -:101A600002400840004000400040844000400240E6 -:101A7000004000400040C0408240000000000000E4 -:101A80000000000000000000000000000000000056 -:101A900000000000A0000000000000000000200086 -:101AA000C009000200050041000000000004000021 -:101AB0000800000000000000080500000000000011 -:101AC0000080000090410011C0800100000401046A -:101AD0000083000001000000000009000000000079 -:101AE000000000000000000000008205000000006F -:101AF00000000000A00400410802A0020000000055 -:101B000000000000000000000000000000000000D5 -:101B100000000084000000000000001011002100FF -:101B20000000110000000300000000000000008819 -:101B300000000000000000004000008400000000E1 -:101B4000000000402040000000000040408400C031 -:101B5000020400400000020000000000020000003B -:101B600000000000000000840000000000000000F1 -:101B7000000000840000000021000000034000007D +:101A1000000000000000000000000900000080003D +:101A2000000000000000000003000400040000406B +:101A300000000000000000000000000000000002A4 +:101A40000000000000000000000004000000000092 +:101A5000000000000000000021000800000000203D +:101A6000000021000000032103000000000000002E +:101A7000000000100000000000000800000000004E +:101A8000000000000000000000000800000000004E +:101A9000000000000000000000000800000000043A +:101AA0000004000000000000000000000000000032 +:101AB000000000000000000900000000000000001D +:101AC000000000000000000000000000080000000E +:101AD0000800000000000000020008008200000072 +:101AE000820000000000000000000040000400042C +:101AF000840000040000000000400000000000001E +:101B000008000000000000000000000000000000CD +:101B1000000000080000000002C0000000000000FB +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B5000000000100000000000000008000000006D +:101B60000000000000000000000000000000000075 +:101B70001000000000000000000000000000000055 :101B80000000000000000000000000000000000055 -:101B9000080000000000C000000000000000000875 -:101BA0000000000000000000000000000000000035 -:101BB000A000000000000800000004112000000048 -:101BC000000000004005C0030000000800054003BD -:101BD00000050021C00500030000C004000500024C -:101BE0000005000000031003004000400005000055 -:101BF00000002000004000210020000040200000E4 -:101C000000200000000000000000000000080000AC -:101C10000000000000000000000000820000000042 -:101C2000000021000200020020000000000000006F -:101C3000110200000900008220C000A011881102DA -:101C400000001102000008820388020202A00202C2 -:101C50000302028200080000050200A000840008C0 -:101C6000098240020000009021900020000020081E -:101C70000084090220C00090210800C00004111057 -:101C800000820000000000000000000000000000D2 -:101C90000000000008000000000000000800000034 -:101CA00000080000000000000000080008004000DC -:101CB00000000000001100000000010001004000D1 -:101CC00000000000012100800004090400809080D1 -:101CD0000021008301210000002101104008C00004 -:101CE00000A18800002100410021880091030080AC -:101CF000C02188000421202100A109080000000063 -:101D000000210005000000000000000000000000AD +:101B90000000000000000000000000000000000045 +:101BA00000000000008000000000000000000000B5 +:101BB0000000000000000000000000000000000025 +:101BC0000400000000000000000000000000000011 +:101BD0000000000000000000000000000000000005 +:101BE00000000000200000000000020000000000D3 +:101BF00000080000000000040000000000000000D9 +:101C000000000000000005000000110000000000BE +:101C1000000000000000000000000000000000C004 +:101C20000008008400000004000010000000000014 +:101C30000000000000000000000000040000001090 +:101C40000000040440200004000000000000000028 +:101C5000000000000000000000000500000000007F +:101C600000C00000000000000000000000000000B4 +:101C700000000001008400001121000000000000AD +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA00088000000000000000000000000020002A8 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD00000000000000000000000080000000000FC +:101CE000000000008800000000000000000000006C +:101CF00000000000002100080004000000000002B5 +:101D000000000000000000000000000000000000D3 :101D100000000000000000000000000000000000C3 -:101D20000000000000002100000000000000000092 -:101D300000001100000400000088024002000202BE -:101D40000084000000000202004000000202004087 -:101D500000400000004002000000000002000300FC -:101D60000000004000002100000000000000020010 -:101D700000400000000000000000004002000000E1 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000040000000000000000000000000000043 +:101D60000000000000000000000000000000000073 +:101D70000000000000000500000105010000000057 :101D80000000000000000000000000000000000053 :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 :101DB0000000000000000000000000000000000023 -:101DC0000000000008000001900200200488089034 -:101DD00010088510820220089002002000028890DE -:101DE0000908000200028810020200040008A00294 -:101DF00002080090000290088202A10384080202F7 -:101E0000A0081108820282C000000000000000004B +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF0000820000190100008000001000000000011 +:101E000000000000000000000000000000000000D2 :101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E3000000000000000000000000000050000009D -:101E4000000000000000000000001000038080007F -:101E500080008080088080000000100000800080EA -:101E60000000A08000800000000080800000008052 -:101E7000000000800000000000000011A01000859C -:101E80000020008082800000800000000000000030 +:101E200000000000000000000000000009000000A9 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E7000000088090008001000082000030000008E +:101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 :101EA0000000000000000000000000000000000032 -:101EB00000000000000000000000000000800000A2 -:101EC000000082008800090009800000800000A056 -:101ED0008083008090008490A080418080000085F5 -:101EE000809000808000809080800080800000844E -:101EF000808080808000008880800080840004C111 -:101F0000A088038984008582408040800000000012 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF0000000000089801109101108004000210035 +:101F00004000410000000000000000000000000050 :101F100000000000000000000000000000000000C1 :101F200000000000000000000000000000000000B1 -:101F3000000000000000000000000000000000049D -:101F40000000004009001100080090C0000040009F -:101F500002C1080802C0080010C1110891C0400069 -:101F600002C0080810C0080002C0400802C00200F9 -:101F700002C1080810C0080088C0080802C0051087 -:101F800003C0090903C0090010C0118202C000008B +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000840880000088800000001 +:101F80000000000001200000000000000000000030 :101F90000000000000000000000000000000000041 :101FA0000000000000000000000000000000000031 :101FB0000000000000000000000000000000000021 -:101FC0000000A000000000000000008800080000E1 -:101FD00011030021C089101189090089C0088810E7 -:101FE00009020002C008101011020010C0020810FF -:101FF00003020010C008101011080008C0028288F7 -:1020000091030002C009080311090008C003102150 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF000000000000000000008900010000890029F +:1020000000000000000000010000000000000000CF :1020100000000000000000000000000000000000C0 :1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000500000000000300000000000000110077 -:102050000000C12000088004808441C0000280117B -:102060000085C100008080808080C1800080800069 -:1020700000004100008080808080C180008080005E -:1020800000004120201090A10084C18400828021A2 -:10209000000200000000000000000000000000003E +:10203000000000000000050000000000000000009B +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:1020700000000000000000000000800900100908B6 +:102080000088002000000020004100000000000047 +:102090000000000000000000000000000000000040 :1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000400000000000000080000050 -:1020D000000200000010800000008000800000006E -:1020E00000008008000080800000800080080080E0 -:1020F0000080000000008000000080008000008060 -:1021000000008000008811080380914080208088B2 -:1021100000808002000000000000000000000000BD +:1020B0000000001000000000000000000000000010 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000089801000C7 +:10210000080008000020000000000000000000009F +:1021100000000000000000000000000000000000BF :1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:102140000000000000000000000000000084008289 -:102150000002000000000201202088881000088290 -:10216000089008081000020002022002100002017C -:102170008820020804000200048202020400080011 -:1021800088080888040002A1020203400401082113 -:102190000809C040820100000000000000000000AB +:10213000000000000001000000000000000000009E +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:102170000000000000000000000000000000080255 +:10218000101008080100000000000000000000001E +:10219000000000000000000000000000000000003F :1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C00000000000000000000060060000000000A9 -:1021D0000000000000420000000000000000484233 -:1021E00000000000000048420000000000004842DB -:1021F00000000000000048420000000000004842CB -:1022000000000000000048420000000000004842BA -:102210000000000000004842000000000000000034 +:1021B000000000000000810000E0000000000000BE +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:10220000884100E007000000810000E000000000BD +:1022100000000000000000000000000000000000BE :1022200000000000000000000000000000000000AE :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E -:1022500000000000FF00FFFF00000020FFFF282813 -:1022600028F80020FFFF303030BA0028F0F8282886 -:1022700028F800FF20FF0030AABA00A03CBC3C3C7C -:102280003CBC00A03CBC3C3C3CBC0020FFFF2828E0 -:1022900028F80028F0F8282828F80000000000009E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:102280000000F0FFAAAA1014BABE0000000000006F +:10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E :1022B000000000000000000000000000000000001E :1022C000000000000000000000000000000000000E -:1022D000000000000000000000FF000000200020BF -:1022E0002828282800200020303030300000F0F06E -:1022F00028282828000020200000AAAA00003C3C32 -:10230000000000A000003C3C000000A000200020D5 -:10231000282828280000F0F028282828000000009D +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:10230000000000000000AAAA1014BABE00000000DD +:1023100000000000000000000000000000000000BD :1023200000000000000000000000000000000000AD :10233000000000000000000000000000000000009D :10234000000000000000000000000000000000008D -:1023500000000000000000003D3C050000003D3C86 -:1023600005005D0C0C0CFFFF04003D3C05003D3CEE -:1023700005005D0C0C0C3D3C05003D053C00FF04D8 -:10238000FF003D0505055D550C003D3C3C3CFFFF55 -:1023900004005D0C0C0C3D3C05003D3C3C3C000049 +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000FFFF00003F3F03030000CB +:10239000000000000000000000000000000000003D :1023A000000000000000000000000000000000002D :1023B000000000000000000000000000000000001D :1023C000000000000000000000000000000000000D -:1023D000000000000000000000003C3C0000000085 -:1023E0003C3C00000C0C0C0C040004003C3C0000C5 -:1023F0003C3C00000C0C0C0C3C3C00003C003C0045 -:102400000404000005050505555500000500000001 -:10241000040004000C0C0C0C3C3C00000500000007 +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD +:102400000000000000000000151515153D3D0101FC +:1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC :10243000000000000000000000000000000000009C -:10244000000000000000000000000000000000008C -:1024500005610A0F050D00A000610006002D1002A5 -:10246000000040618006002D100240618006002DB2 -:102470001002400080000020100240008000002078 -:102480001002400080000020100240008000002068 -:10249000100240618006002D100240618006002D70 -:1024A000100200000000000000000000000000001A +:1024400000610007800D0000000000000000000097 +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000061002080014A +:102490000000006000068000000000000000000056 +:1024A000000000000000000000000000000000002C :1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C :1024D00000000000000000000000000000000000FC -:1024E00000000000000000000020141400000000A4 -:1024F000C3410301000000000000000000000000D4 -:1025000000000000000000000000000000000000CB -:10251000000000001C0C1C0CFFFF1000000000005D -:102520005D5DDFDF00000000000000000000000033 +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000000DC +:102500000000000000000000000000003C3C5505F9 +:102510008082BCBE00000000003C3C3C000000008B +:1025200000000000000000000000000000000000AB :10253000000000000000000000000000000000009B :10254000000000000000000000000000000000008B :10255000000000000000000000000000000000007B -:10256000000000000000000000000020000000004B -:102570000000FF550F0500000000000000000000F3 -:10258000000000000000000000000000000000004B -:1025900000000000000014001400FFFF1400000001 -:1025A00000005D08D782000000000000000000006D +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:1025800000000000000000000000000000003C3CD3 +:1025900055058082BCBE00000000003C0000000029 +:1025A000000000000000000000000000000000002B :1025B000000000000000000000000000000000001B :1025C000000000000000000000000000000000000B :1025D00000000000000000000000000000000000FB -:1025E00000000028C0C00000000000000000000043 -:1025F00000000000FFF01C3C000000000000000094 +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB :1026000000000000000000000000000000000000CA -:1026100000000000000000008082C0C383828300AD -:1026200000000000F4FCF6FE0000000000000000C6 +:10261000FF003F3F3CFCFCFC0000000000F03030BD +:1026200000000000000000000000000000000000AA :10263000000000000000000000000000000000009A :10264000000000000000000000000000000000008A :10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A -:10267000000000000000FFF03C3C000000000000F3 +:10267000000000000000000000000000000000005A :10268000000000000000000000000000000000004A -:1026900000000000000000000000A0AAF0FF83007E -:1026A000830000000000141C161E00002000000023 -:1026B00000000000020000000000000020000000F8 -:1026C00000080000000000002004000220000000BC -:1026D00000000000000200000000000000000000F8 -:1026E00000000000000000052000000300000410AE -:1026F00000200083000000800004000804000000A7 -:1027000000210000001000200088200000000000D0 -:102710000004001100000005008400040000000017 -:1027200000200082000000000010200000000000D7 -:102730000000000000000000000200000000000097 -:102740000002000400000000000000000000000083 -:102750000000000000000000000000000004000075 -:102760000000000000000000000000000000000069 -:102770000000000100200000000400000000000034 -:102780000000000000020000000100200000000026 -:102790000000000000000000000000200000208277 -:1027A0000000000100200000000000000000000008 -:1027B0000000000000000200000000000000000017 -:1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000009000000F0 -:1027E00000000000000000000200000000000000E7 -:1027F00000000000000002000000008000000080D7 -:1028000000000200000002000000000002000000C2 -:10281000020000000000000000000000080000802E -:102820000400100004009000A00000000000000060 -:10283000000000000000000004000000000000880C -:102840000000000000000088000000000000000000 -:102850000000000000000000000000000000020076 -:102860000000000000000008000000000000000060 -:102870000000000000000000000000000004000054 -:102880000420000000000000000400080000000018 -:102890000000000000000008000000000000000828 -:1028A0000020000000008000000000040000008400 -:1028B0000004000000000000000000000000000014 -:1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000000000F8 -:1028E00000000000000000000005880920008400AE -:1028F000040000002000C000008020000021002112 -:10290000830811210010C00004800400002100A1F0 -:102910002003002100002000008590800005102188 -:10292000008584210000000004000200A0000021B6 -:102930000000002100000000000000000000000076 -:102940000000000000000000000000000000000087 -:102950000000000000000000000000000000000077 -:1029600000000008000000000000000000042088B3 -:102970000500808200000000000000202004000408 -:102980000004040004840004000080208002000091 -:1029900000200090009000C00000002000200004F3 -:1029A000100000200500000003088000020400A0C1 -:1029B0000008008800000000000000000000000087 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000020D7 -:1029E00000000020000000000000000000000003C4 -:1029F0000000040002000000200008000000200089 -:102A000000000000000000030000000000002000A3 -:102A1000000000000000000000000800008000002E -:102A20000000000000000400040500080000000091 -:102A30000000000000080008000000000000000086 -:102A40000000000000000000020000000200020080 -:102A50000000210000000000000020000000000035 -:102A6000000021000201020000840890008800009C -:102A70000020000080400090000000200000400086 -:102A800080C0000000C00000030000100000000033 -:102A9000000000000084000000080000001000207A -:102AA0000000000000A00000800000000000000006 -:102AB0000000000000000000030000000000000013 -:102AC0000000000000000000000000000000000006 -:102AD00000000000000000000000000000000000F6 -:102AE00000000040000000000000000300000000A3 -:102AF000000502000000052000100000900000000A -:102B000001040120000200A105A100000000000551 -:102B100001400100002100000180000800000005C4 -:102B2000000000000000000001000180000000051E -:102B300000A00100000000210000000000000000D3 -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 -:102B60000000000000A1000800000020000020007C -:102B70000000000000820004848500A00000200402 -:102B800000002009209110904004840440000004BB -:102B9000000004000400008800020420000000007F -:102BA0000000110000004004000404C004204000A4 -:102BB00009081121040000000000000800000000C6 -:102BC0000000000000000000000000000000000005 -:102BD00002000000000000000000000000000000F3 -:102BE00002000000000000000000000001000000E2 -:102BF000000000000000000800000000004100008C -:102C000000212000002020002021002000002021A1 -:102C10000005000000000002002100210021002129 -:102C200020002010002000000005002100052021C8 -:102C300020040005000400000021002100200021E4 -:102C40000000000000000000000000000200000082 -:102C50000000000000000004000000000000000070 -:102C60000288058200000000000208021100040230 -:102C700000900002200009C000A000A0000011A0E8 -:102C800000000000000000010000000000A00000A3 -:102C900000020082030000000000000000000000AD +:102690000000FF00000000C0C0C00000000000F00B +:1026A00030300000000000000000000000000000CA +:1026B000000000000002000288000000000000008E +:1026C0000000000000000008000040800000000042 +:1026D00000000000000000000000000000000004F6 +:1026E00000000000040000000404000300000000DB +:1026F0000000000001030084018401840000000048 +:102700000000000000002000000440000000000065 +:102710000000000020000200000000000000000097 +:102720000040000088002008820000000000000037 +:102730000000000000020000000000020000000095 +:10274000000000000000000000000000C0020000C7 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000267 +:1027700000000002000220040004400420082100A0 +:102780000000000000000000000000002000000029 +:1027900000000000000080000000000000000000B9 +:1027A0000000000000000090000000000000000099 +:1027B0000000000000000200020084008809000000 +:1027C0000000000000000000000000000000010008 +:1027D00000000000000002000800100010000200CD +:1027E000024108000000000802100200A0050000DD +:1027F0000000000000000200410003800909409031 +:1028000000000000000000000200000000050000C1 +:1028100000000000000002000182110800910390F6 +:102820000000820000000200000000000000000024 +:102830000084000000000000000000000000000014 +:1028400000840400001000100082000000820008D4 +:10285000400000000000008410000008000000009C +:1028600000000000000000840084000000840010CC +:1028700000000000000000000000A0082004200864 +:1028800080080000008400000008008400000000B0 +:102890000000000000000008000002409001000459 +:1028A000A04000C000000000048400000000000000 +:1028B00004080000040004000000200500080005D2 +:1028C00020000010000000000008000000000000D0 +:1028D000000040020000A000820000000000000094 +:1028E0000800000000000000000800004000000098 +:1028F0000000000000000000000000030004400091 +:1029000040020108840000000000000500000000F3 +:102910000000000000000009000000080110000095 +:102920000108010088000000000000000000000015 +:102930000000C0000000000000000008800000004F +:102940000000800000000000000000000000000007 +:1029500000000000800100000000000000000000F6 +:102960000000000000000000000000000000000067 +:1029700000000000000000000000000000000085D2 +:1029800080000091400004000000000000000000F2 +:102990000000000000000900000000000000080125 +:1029A00009202001020000000008000000000000D3 +:1029B0000000000000000000004000400000000097 +:1029C00000000000004000210000000002000000A4 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000050000E2 +:1029F00000000000000000000000000000000000D7 +:102A000000000002008000800000000000000000C4 +:102A100000000000000000000000000000000000B6 +:102A200004800000008000A00004004000040004B6 +:102A3000000004000400000000000000000000008E +:102A40000000000000000000000000000000000086 +:102A50000008000000000008000000000000000066 +:102A600000080084000800000000000002000000D0 +:102A70000000000000000000000008000000000846 +:102A80000000000000010908000400000000000030 +:102A90000000000000000000000000000000000036 +:102AA0000000000400000040000405004100000098 +:102AB000008800008000800000000021000000006D +:102AC000A021000300800100004100000000000080 +:102AD00000100000000000000000010000000000E5 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000004000000080000B9 +:102B100000000000000000000000000000000000B5 +:102B200090000000000001800500010084400000CA +:102B3000000000000400000000000400000000008D +:102B40000000000000000004200000000000000061 +:102B50000000000000000000000000004000000035 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B8000000000000000000005000001000011002E +:102B90000000000000000000000000000000000035 +:102BA0000000000000000020044004040440000075 +:102BB000000000000008800000000000800000030A +:102BC00000030000000000000000000000000021E1 +:102BD000000000410000000000000800000000802C +:102BE00000000000000000000000000000000000E5 +:102BF00000080000000000000000000000100000BD +:102C000000000000000000000000000000000000C4 +:102C10000008000000410021000000000000000842 +:102C200000000000000000000000000000000000A4 +:102C30008400000900001009A00000000000080046 +:102C40000000000000000000000000004100000043 +:102C5000000000000000000000000010081000004C +:102C6000050200000000000000000000000000005D +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 :102CA0000000000000000000000000000000000024 -:102CB0000000000000000200000000000000000012 +:102CB00000000000000000000000000000002004F0 :102CC0000000000000000000000000000000000004 :102CD00000000000000000000000000000000000F4 -:102CE0000000000000000000000088C00004008810 -:102CF000C0000000000000000000A0C0022000840E -:102D00008802000102C001824010100802C10009BF -:102D100000851002C0C000080084C008A002008224 -:102D20000088101088C000900084400804C000088B -:102D300000081002C0C0008200401008000000001F +:102CE00000000000000000010000000000000000E3 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000010100C1 +:102D100004010001000000000000000000000000AD +:102D200000000000000000000000000089C189A12F +:102D300008408209000000000000000000000000C0 :102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D60000000000000000000000000008080000063 -:102D70000080800000000000000000001180008042 -:102D8000008000000000028021808000808000C15F -:102D90000010009180028080000000808080800010 -:102DA0000000008080800080000000800080808023 -:102DB0000000000080009180008000808080000082 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 +:102D5000090000000000000000000000000000006A +:102D60000000000000000000000200000000000061 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000004102 +:102D900008100905002100000000000000000000EC +:102DA000000000000000000000000000000091C1D1 +:102DB00089A100C180880000000000000000000020 +:102DC00000000000000000000000000000000010F3 +:102DD00000000002000000000000000000000000F1 :102DE00000000000000000000000000000000000E3 -:102DF0000003800000800000000000000000800050 -:102E0000000000008080000089804000200089834D -:102E1000C1800200400203838000800080000080A7 -:102E20000000001100800000000080008000008091 -:102E30008000800080000080000080000000808012 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100008821000081020210000000000000000BF +:102E200000000000000000000000000000000000A2 +:102E30008980C10011098303000000000000000028 +:102E40000000000000000080000000000000000002 +:102E50000001000000010000000000000000000070 :102E60000000000000000000000000000000000062 -:102E700002001001840084900000000000000000A7 -:102E80000800020084008290000008100300850002 -:102E9000119008080400850002900400080010004A -:102EA00002900000000100840090820008000800E9 -:102EB000A090080008000800C09084000800A0004E -:102EC000049000000000000000000000000000006E -:102ED00000000000000000000000000000000000F2 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000011000000000002100000000000000 +:102EA0000000000000000000000000000000000022 +:102EB0000000A18888000189C10100000000000015 +:102EC000000000000090000000040000000000006E +:102ED00000000000020000000000000000000000F0 :102EE00000000000000000000000000000000000E2 -:102EF0000000101000A0009089C000000000000039 -:102F000000008802000200C010880000400800098C -:102F100090C091894004010491C0108840080008C5 -:102F200090A01104848400200008A0C090080082B2 -:102F300090088382400800829008C1A00284008229 -:102F4000008403C00000000000000000000000003A -:102F50000000000000000000000000000000000071 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F10000000000000012100A101000100000000EC +:102F200000000000000000000000000000000000A1 +:102F30000000000002030183018989C10000000034 +:102F40000000000001000000200000000000000060 +:102F500000000000000080000000400000000000B1 :102F60000000000000000000000000000000000061 -:102F70000000000080800080008089800000000048 -:102F800000000000000000000000008000008089B8 -:102F900000C0801111A08000118085008880808091 -:102FA0000080800009800000008000800000008018 -:102FB00000808080890080800080808089000000FF -:102FC0000080000009000000000000000000000078 -:102FD00000000000000000000000000000000000F1 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F900000000000000000049111C01009040000AE +:102FA0000000000000000000000000000000000021 +:102FB00000000000000080900883031091C1000011 +:102FC00000000000000010000000000000000000F1 +:102FD00000000000000000090000000000000000E8 :102FE00000000000000000000000000000000000E1 -:102FF00000000000000000040011000000000000BC -:103000000000000000000000008000000000000040 -:10301000410011800500091140800280090005402F -:10302000000000800000000080020000800000001E -:10303000000900C100800000000000A10080000025 -:103040000000008000000000000000000000000000 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000004108410010002008EE +:1030200000000000000000000000000000000000A0 +:1030300000000000000000008090890880801109D5 +:103040000000000000000000000500020000000079 :103050000000000000000000000000000000000070 :103060000000000000000000000000000000000060 -:1030700000000000000000001001000484848400AF -:103080000000000000000000000000A0000400009C -:103090000000010200A00104000001A000A0010442 -:1030A0000000000000A000A00000C0000800900088 -:1030B0000200000000A000400000000000050082A7 -:1030C0000000000000A000840000000000000000DC -:1030D00000000000000000000000000000000000F0 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:10309000000000000000000000000190000001009E +:1030A000000100000000000000000000000000001F +:1030B00000000000000000000000C0C11000828479 +:1030C0008900000000000000000000000001000076 +:1030D00000000000000000000000810000E000008F :1030E00000000000000000000000000000000000E0 -:1030F0000000000000000000000000810000060049 -:103100000021000000000000000000820000070015 -:1031100000000000418200E007000000418200E062 -:1031200007000000008200000700841200820000F7 -:10313000070000000082000007000000008200007D -:10314000070000410082000007004200000000006C -:10315000000000000000000000000000000000006F +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:10311000000000000000000000000000000000E0CF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000818100E0AD +:103140000700840000000000000000000081000073 +:103150000700000000000000000000000000000068 :10316000000000000000000000000000000000005F -:1031700000000000000000000000000030300000EF -:10318000DF20565600000000000000000000000094 -:103190003C00FFC30000000000003820FBE30000FB -:1031A00000006220FBB900000000BDBD8181FCC0B1 -:1031B000E7E7F6C6360600000000FCF4FCD000008D -:1031C0000000E4FCE4C000000000E4FCE4C00000F7 +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000080800F +:1031C00000766600B6240000000000000000000049 :1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF -:103200000000FF00666600000000000000000000F3 -:1032100000002020EFEF0000000000002020FBFB5A -:10322000000000002020FBFB00000000B989B989E4 -:10323000FCC024247646764600000000C0F4C0D0CE -:1032400000000000E4F0E4F000000000E4F0E4F02E +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:103240008080007666006624000000000000000018 :10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E :10327000000000000000000000000000000000004E @@ -156501,800 +156501,800 @@ :1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE :1032F00000000000000000000000000000000000CE -:1033000000006669000F00FF04FB000000000000E1 -:103310000000C300D8D8919D939F00001818F33087 -:10332000919DB1BD3C00D8D8919DB1BD1818FCC08D -:10333000999F993C0F0F666600000000427E3F3F58 -:103340006C006CFFC3FF4E4EF3E7FFE727273CFFFF -:1033500042427E7E000000000000000000000000ED +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:1033400000000000666E0C0C0C0C3C3C0000000001 +:10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D -:10338000000000006666000F00FF00FF0000000064 -:1033900000000000FF3CD8D8919D909C0000DBDB32 -:1033A000F330919D818DFFC3D8D8919D818DDBDB5A -:1033B000FCC09990993C0F0F033F00000000427E33 -:1033C000030366666666003C4E4E00240C242727E5 -:1033D00000C3626E626E000000000000000000008A -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000080002038004000000000A4 -:10341000000000000000000050200000000000003C -:1034200000615026800100000061502480050000EA -:103430000000502000000000A0000020000000005C -:10344000000050200000000000005020000000009C -:1034500000005020000000000000000000000000FC +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000024280C0C0C0C0000000081 +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000610007800D00000000E8 +:1033F000000000000000000000000000000000616C +:103400000006000D000000000000000000000000A9 +:1034100000000000000000000000000000000000AC +:10342000000000000000000000610007000D000027 +:10343000000000000000000000000000000000008C +:103440000000000000000000A06120228040000871 +:10345000000000000000000005000A28050000A090 :10346000000000000000000000000000000000005C :10347000000000000000000000000000000000004C :10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C -:1034A0000000C0FC828220202034B4B4B4B40000F8 +:1034A00000000000000000000000C00055550002B0 :1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC +:1034C00000000000000000000000140014003CBEDA +:1034D00032B000000000000000000000000000000A :1034E00000000000000000000000000000000000DC :1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB -:1035200000000000C0FCBEBEF7E3F7F7F5F0A0F026 +:10352000000000000000000000000000C0003C3C63 :10353000000000000000000000000000000000008B :10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B +:103550008200B0B000000000000000000000000089 :10356000000000000000000000000000000000005B :10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B +:1035800000000000F0F0F0F000000000000000007B :10359000000000000000000000000000000000002B -:1035A00000000000000000000000F3F33030C0C055 -:1035B00082BE0030A0A0000000000000000000005B -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB +:1035A0000000000000000000000000000000E8E84B +:1035B00000C3000000000000000000000000000048 +:1035C00000000000000000000000000000008D0F5F +:1035D000141400FA28F200000000000000000000AF :1035E00000000000000000000000000000000000DB :1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA +:10360000000000000000F0F0F0F0000000000000FA :1036100000000000000000000000000000000000AA -:10362000000000000000000000000000D7FF00289C -:10363000FCFC82BECFFFAFAF000000000000000026 +:10362000000000000000000000000000000000009A +:10363000E8E83CFF0100000000000000000000007E :10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A +:103650000505141400FA00FA000000000000000044 :10366000000000000000000000000000000000005A -:1036700000004000000000000000200000000000EA -:103680008800000000000000200020002000200032 -:103690000000000220000008000400900040000824 -:1036A00000000000000400000003200020002000B3 -:1036B0002004000000000000084004020080A00078 -:1036C0000104000800410009001120002000200032 -:1036D0000404000000000004000400000000004199 -:1036E0008800000800080000000000000000000240 -:1036F00000000000000000000000000000000000CA -:103700000000000000000000000080008000800039 -:103710008000004000018000000000000003000164 +:103670000000000000000004000000000000000046 +:103680000180018001800180010000000000000035 +:10369000000088000004000000000000000000009E +:1036A00002000000000800030003000040000200C8 +:1036B0000009841100030000000000000000000861 +:1036C00000040400040000080408000000002000BA +:1036D0000400880000000040000500000000000019 +:1036E00010002083208000202083000000000000C4 +:1036F000000000000000009000000000000000003A +:10370000000004400440044004400240000009005E +:1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 -:1037300000000000000000900000800180010002F5 -:10374000008404820000000000000000000000006F -:1037500000000000400400820000000000000000A3 -:103760000000000000000000000000C00000000099 -:103770000000000020000000000008000000080019 -:103780000200080000000400000008000800080013 -:10379000090008000100010001000900000000000C -:1037A000900000000000040000000010000009006C -:1037B00009000800080000000000000000102000C0 -:1037C00009000900090000030000000808000000CB -:1037D0000200A00804000000020402000000000033 -:1037E00000000000000000080208000502100000B0 -:1037F0000000000000008000000000000000000049 -:103800000000000000000000000000000008800030 -:10381000800084008200200020000400A00400003A -:10382000000004000000000000000000000800008C -:1038300084008400800080000000008420000004D8 -:103840008000A082A084A08400000000000000840A -:1038500009840082008400000084000800080082BF -:103860000084000800000000008200000004000046 -:103870000000000000000000000000000000000840 -:103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 -:1038A00000210000000200410040004020002041B3 -:1038B000000090020003040000000041000390009B -:1038C000080890400000000000410021000520058C -:1038D00000050240002100040008000890000000DC -:1038E0000810000900400808000020210200200004 -:1038F00001080000000000000000000000000000BF -:1039000000000000000000000000000008000000AF -:1039100000000000000000000000000000000000A7 -:103920000000001000000200000000020000000083 -:103930008000000000A0000080000002000000885D -:10394000008880900040000000000000000000009F -:10395000800000020000001000004000008800000D -:103960000000000000000000000000000040800097 -:10397000000008000000000000000000C00008096E -:10398000000000000000000008000000000000002F -:1039900000000240000004000200102000000800A7 -:1039A00000000000040002000400040000084011B0 -:1039B0000000002100008200A01082088200001197 -:1039C000000400020003A0000000002000400000EE -:1039D00000000008000000000000000008000000D7 -:1039E00000000000002108009000000000082002F4 -:1039F0000021002120040000000008000000000059 +:103730000000000000000000000000000000008207 +:103740000000000008000000000000000000200051 +:103750000000002000000000000000000000000049 +:103760000000000000040020000100040000000030 +:103770000000000000000000000008000000000041 +:1037800000000000044000C0022000A00200001061 +:10379000894108000200004000000200A000000073 +:1037A0008800880401100000C02102000000000011 +:1037B00000009000900000000000000002000000E7 +:1037C000000084000200020000000000000002006F +:1037D00000000000080902000000000302000000D1 +:1037E00002000400020400000200000000000004C7 +:1037F00000040000000800840084008200840008A7 +:103800000084008400828483044180090041808810 +:103810000083028480080000000000000000008493 +:1038200000000000000808000000008800080000F8 +:103830000000000800000008000000000000000078 +:103840000000000000000008000000000004000468 +:1038500000880004000000080000000000000000D4 +:10386000000000000002008400000000008202044A +:10387000000800080008002100000000000000050A +:103880000041000000000021C140002000000008AD +:103890000080000800C1004000000000000000009F +:1038A00000210000001000000000000002000000E5 +:1038B0000000000840000000400000000000000080 +:1038C00000000000000000000000000000000000F8 +:1038D0000000000000000000000008000000880058 +:1038E0002000400000000000000000000000000078 +:1038F000002000A000000000000000000000000008 +:1039000000000000000000000000020000010000B4 +:103910000000004000000010000100000000000056 +:103920000000000000000000000000000000800017 +:103930000000000000004000000040000400000003 +:10394000000000000090008800000000000000005F +:10395000000000000000000000000000080000005F +:103960000000000000000000410000000000000016 +:103970000000000100000800080008000000000925 +:1039800000000000000082008200824100009000E0 +:103990000000004000000040210020000000000066 +:1039A0000000000000000000000000000010000007 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000800EF +:1039D000000000000000000000000000840000055E +:1039E00000000000000000040004000000040000CB +:1039F00040004040100000000000000040000000B7 :103A000000000000000000000000000000000000B6 -:103A10000000000000000000800000008001108213 -:103A200011840088000080C000A080008000000198 -:103A300000A0009000A0000000000000000800A00E -:103A4000410000004000008400000500000000C0AC -:103A5000000000C0000000820000002000A0000064 -:103A6000000000000000000400000000000005004D -:103A7000000100000000000000000800000000003D -:103A80000000000000000000000000000000000036 -:103A9000200082000800080004001000002002003E -:103AA0000000000000000020001008000008004195 -:103AB0000840824000038905000084088208002035 -:103AC0000000004082000000010000080400002007 -:103AD00000000000000000000011002100000011A3 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000002000000000000000000C4 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000000000800080000001A4 -:103B20000000000000000000000100000000000094 -:103B3000000000A00002008420000000000000003F -:103B4000020900000200000000A008000000800040 -:103B5000008500000000000405840000020000C091 -:103B600000A005040000000000840000090000001F -:103B7000000800000000000000000002000000003B -:103B80000000000000000000000000000011000024 -:103B9000000000004000000040004000030004005E -:103BA00089009000C100000800410000004104406D -:103BB00000000005C020A02000000004000002005A -:103BC00000000008002020082008400800212021D3 -:103BD000200820202041000400040005000400000B -:103BE000000800210005000000000000000800009F -:103BF000000000080000200000002000000000007D +:103A1000000000100901000003000800000400007D +:103A20000000000000000000000000000000000195 +:103A30000000000000100000000000000000000076 +:103A40004000000000000000000000000000000036 +:103A50000000000000000000000000000000000066 +:103A6000080000000000000000000000000003004B +:103A700000008000A00080000000000000000000A6 +:103A80000000000000000000000004000000000032 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000011000000008200820001 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE0000000000000000000100090000000000036 +:103AF0008200000004000008000000000000000038 +:103B00000000000000000000210000000000000094 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000004000081 +:103B40000000000002040800401000000000000017 +:103B50000000000000000000000000000000000065 +:103B600000C0050008022000000220C00000000084 +:103B700000004000020000000000200000020000E1 +:103B800000004000000000000000000000000000F5 +:103B900000000008000000000000000000400000DD +:103BA00000210000000000000000000000000000F4 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE0000000000000000000000000000000004095 +:103BF00000000000000000000000000800000000BD :103C000000000000000000000000000000000000B4 -:103C10000000000000000000000000000000108212 -:103C200000001000000004820084200000842100B5 -:103C30009008000003000000008200000000000067 -:103C400000A00000000000010004000000000000CF -:103C5000A100A140842080100001000100000001AB -:103C60000300000000000000000000000000000051 -:103C70000000000000000000000400000000000040 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000080000000000000008000054 +:103C60000000000000000000000000000000000450 +:103C7000000000000084000000000088000800A090 :103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 -:103CA000100200880088C091A001910010008200DD -:103CB000100502111011100901000100C0000000E0 -:103CC000000100040088002002900240008400A04F -:103CD000C0021003008990000004000000000000F2 +:103C9000000000000000000088C090A00010C0825A +:103CA00089C0402000844084000000000000000023 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 :103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000001C3 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D200000008080000009008084000488090411DC -:103D30008009884021A0008280A14000400000004E -:103D400000000000118000000000808080800000E2 -:103D5000008080808090112110000002000000008F -:103D60001100000000000000000000000000000042 -:103D7000000000000000000000000000000800003B -:103D80000008000200000000000000000009000020 -:103D90000000000000000000000000000000000023 -:103DA0000000000000058090400500C1A00584804F -:103DB000824003211100888291001104080008004C -:103DC000410041000000800080A1800000800000D0 -:103DD00000020082000010C01180024082A1000594 -:103DE00000000005000000000000000000000000CE -:103DF00000000000000000000000000000000000C3 -:103E000080000000800000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E2000000000000000A0009009898888020802B4 -:103E30001004A001884110022009A04008C0000021 -:103E4000010000000100000002009008029000083C -:103E5000000088C000A1C000A0040108C0009009B3 +:103CF000000000000000000000000103A1A18803F3 +:103D0000089100000000000000000000000000001A +:103D10000000000000000000000080808000000023 +:103D2000008089800080000000000000000000008A +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000821832077 +:103D80000003001000000000000000000000000020 +:103D90000000000000000000000000008000002083 +:103DA000808080808000800480C08000000000004F +:103DB00000000000000000000000000000000041C2 +:103DC0000082000000000000000000000000000071 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000008980BA +:103E00000902808083910000000000000000000093 +:103E1000000000000000000000000000000008009A +:103E2000A0018488C090A0001000A0418200000082 +:103E30000000000000000000000000000000000082 +:103E4000000000030000000000000000000000006F +:103E50000000000000000000000000000000000062 :103E60000000000000000000000000000000000052 :103E70000000000000000000000000000000000042 -:103E8000840008002000C0000000000000000000C6 +:103E80000810A001884083880000000000000000A6 :103E90000000000000000000000000000000000022 -:103EA0000000000000000000C0028288024020885C -:103EB00001118308C0050008C0010190A189A0017B -:103EC00000000000000100010000009000880800D0 -:103ED000020208C000908240C00000214088840196 -:103EE00002040000040000000000000000000000C8 +:103EA000000000A0009088C0901000040040A0C056 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 :103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 +:103F00000000404001A0A10202910000000000005A :103F100000000000000000000000000000000000A1 -:103F20000000000000000000000082800000000887 -:103F300005004088108841A10588890804020521F0 -:103F40008408000400210021000300000980000013 -:103F50008000020080000000008080000908000846 -:103F60000021C008000080000000050000000000E3 +:103F20000000000000000080808000000000000011 +:103F30000080000000000000000000000000000001 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 +:103F800000000000809010038303821000000000F6 :103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000008000001081 -:103FB000000000002111048404000911210488403C -:103FC00041800911000200200000001100000000E3 -:103FD0000004008000000005809080008000044103 -:103FE00004040500021000000000000000000000B2 +:103FA00000000000801180C100000000000000003F +:103FB0000000000000000000000000000000000001 +:103FC0000000000080000000000000000000000071 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 +:10400000000000000000C10202890500400000001D :1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000900000 -:104030002000889000000102000301840000A140DC -:10404000A11104C082000010000100000001000066 -:104050000000888800840200840040080810820064 -:1040600001110089000001000000000000000000B4 +:10402000000000000000C0012089C0000000020064 +:104030004010048810000000000000000000000094 +:1040400000000000000002002000840000000000CA +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 -:104080000000000000000000000000840084000028 -:104090000000000000000000500000E000000000F0 -:1040A0000000000000000000000000000000000010 -:1040B0000000006007006082000A00600600000047 -:1040C0000000000006008411410000E00000000034 -:1040D00000000000000007000000000000000000D9 -:1040E0000012810000E007004200410000E00000F3 +:104080000000000000000000C10190080190210024 +:104090000000000000000000000000000000000020 +:1040A00000000000000000000000000007004200C7 +:1040B00000110000070000000000000000000000E8 +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF +:1041000000000000000000000000818100E00700C6 :10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:104130000000F555F050F303F30300000000ACACB1 -:1041400020E3AFAFAEAF0F050F0500000000000089 -:1041500000000000C382C382FCFC0000553FFF0F3B -:10416000A0E1A0E1000000003A3A000000000000D9 +:1041200000000000000000000000AAAAF0F0AFAFFD +:10413000F0FF00000000A8B400AA0000000000008A +:1041400000000000000000000000A00000000000CF +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000FF5FFA5AF5F505050000000059 -:1041C000A0A020E3AAAAAEAFFF55FF550000000053 -:1041D000000000000000008200820C0C0000553F2F -:1041E000FFFF80808080000000003A3A000000005D +:10418000000000000000000000000000D7FFAA00AF +:1041900030C0FFFF00000000000000000000000031 +:1041A000000000000000000000000000F0F000FF30 +:1041B000A0A0000F01000000A8A80000000000005F +:1041C000000000000000000000000000AA0A00003B +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF :1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:104230000000000000000AC0FAC0FF00C3F0000048 -:104240000000ABABABAB0000BFBEF000FB0000005A -:10425000000000000000000055D2FFD255FF55FFBE -:104260000055C3F00F0FAFAFC341004100BE0014B3 +:104200000000000000000000000000000000280086 +:10421000AA0030C000000000000000000000000004 +:1042200000000000000000000000000000000F3C43 +:10423000550FFC0C3535FF00F7085050505000006A +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E :10427000000000000000000000000000000000003E :10428000000000000000000000000000000000002E -:10429000000000000000BEBE0000000000000000A2 +:10429000D4141714FF00FF0000000000000000000D :1042A000000000000000000000000000000000000E -:1042B00000000000000000000ACFFACFFFFFC3F0AB -:1042C0000000000000C33CFF00000000FB00FB00FA -:1042D0000000000000000000000055D2FFD2E1E124 -:1042E000E1E1FFFFC3F00F0F0F0FC341004100BE1C -:1042F00000140000000000000000000000000000AA +:1042B0000F3C550FFC0C353500FF04FB50500040FF +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE :1043000000000000000000000000000000000000AD -:104310000000000000000C00FFFF00000000000093 -:10432000000000610006800D000000000000000099 -:104330000000000000000000000005000A0F050C4E -:1043400000A005610A3F050D00A085610A0E050D5C -:1043500000A00061000680090000000005000A08B6 -:10436000050000A0000030000000000005610A0FF9 -:10437000850D00A000610007800D00000000000016 +:104310000000D714141409090C0C00000000000060 +:10432000000000000000000000000000000000008D +:1043300000001000200800400008800050200040CD +:10434000000000000000000000000000000000006D +:1043500000008000000000000000000000000000DD +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D :10438000000000000000000000000000000000002D -:104390000000000000610006000D000500000000A4 +:1043900000000000A0610022800900000000000071 :1043A000000000000000000000000000000000000D -:1043B0000000000000000000000000000000FFFFFF -:1043C00000FF00000B0FFBFF00FF000701010101D0 -:1043D00000CF00450000000030353A3F00000000EB -:1043E0000000000000000000000000000000FDFDD3 -:1043F0007D55005F00430000000000000000000049 +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD :1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C +:104410000000000000000500383CFFFF20DF000026 :10442000000000000000000000000000000000008C :10443000000000000000000000000000000000007C -:10444000000000FF00000A0EFAFE00FF00D7FF0187 -:10445000FFF100FF00FF0000000000FF00FF000070 +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C :10446000000000000000000000000000000000004C -:10447000FFFF7D5500FF00FF00000000000000006E +:10447000000000000000000000000000000000003C :10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C +:10449000000000000000000000000400000020DF19 :1044A000000000000000000000000000000000000C :1044B00000000000000000000000000000000000FC -:1044C00000003C3C00FF0000FF7D00415F43000016 -:1044D000AAF03CF0D700070000000000FCFCAAFF97 +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC :1044E00000000000000000000000000000000000CC -:1044F0000000FFFF3C005F004300000000000000E0 +:1044F00000000000000000000000000000000000BC :1045000000000000000000000000000000000000AB -:10451000000000000000000000003030F3F3000055 -:10452000000000000000000000000000000000008B +:1045100000000000000000000000E828D4140000A3 +:10452000303000000000000000000000000000002B :10453000000000000000000000000000000000007B -:10454000000000003C3C00FF0000CFCF0C0C5F439C -:104550005F43FFF0FFF0D7D70707000000000C0C07 -:10456000AA000000000000000000000000000000A1 -:1045700000000000FFFF3C005F5F434300000000BD +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B :10458000000000000000000000000000000000002B -:104590000000000000000000000000003030F3F3D5 -:1045A00000000000200000000000000000000000EB -:1045B0002000000000002000000000000400200097 -:1045C00020000000000000000000000402000000C5 -:1045D0000000004004000000000020000000000077 -:1045E00000000000000100020000000000032000A5 -:1045F0000200000000000000000000002000000099 -:10460000000002040000000000000003000200009F -:104610002000000000000000000000032000000057 -:104620000000004100410000000000000008000000 -:104630000002000200020002000000000000000072 -:104640000000000000000000000000020000000068 -:104650000000000000018000000000008000030056 -:1046600000C000C021000000009100000008000010 -:1046700000008090008400000000000200000000A4 -:104680000040110080000000000000000000000950 -:10469000000000C000020000000000000000000058 -:1046A00000000000000000100000000000000000FA -:1046B00000400000000000000000000000000000BA -:1046C0000000000002000000000000000000108058 -:1046D000000000000200000009008500090909002F -:1046E0000000020000000000000000001000004078 -:1046F00000000000000000000003000000030000B4 -:104700000200000000000000A00800000003880074 -:104710000003000000080000A000000200000005E7 -:104720000000104000000000000000000000000039 -:104730000000000000000000000000000000000079 -:104740000000000800000000000000000000000061 -:1047500000400000000000000000A0000800A000D1 -:1047600084080008000000000000000000000000B5 -:1047700000830088000000820000000800000000A4 -:10478000000000080008008200080000000800087F -:104790000082000000080002000800080004000277 -:1047A00000000082000400840008000800000000EF -:1047B00000000000000300000000000000000000F6 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000800000000D1 -:1047E000000000000000900888080021000000215F -:1047F00088050002002020219002C00802209008B5 -:10480000840000110020002000009002000300003E -:1048100000000021001120212000842100038400D9 -:1048200000210004000504210000002100400000D8 +:104590000000000000000000000000002B2817149D +:1045A000000030300000000000002000000000008B +:1045B00000000000000000000000000000000000FB +:1045C0000000000000000000000020000000840047 +:1045D0008400000000000000000000000000000057 +:1045E00000000000000200000000000520000200A2 +:1045F0002000200002110000000000000000001157 +:1046000090110003000300000000000000002000E3 +:104610008800C0C1200084000000000004000000E9 +:1046200020008880048300000000000000000000DB +:104630000000000000004000000000000000000238 +:10464000000000000000000000000000000000006A +:104650000000000000000000000000020000000058 +:104660000000000000000000004000000000000208 +:10467000800000000008820000820090000000001E +:1046800000840040009000000000000000022100B3 +:10469000000000000020000000000000000080007A +:1046A00000000002000400040440000000000000BC +:1046B00000000000000000000000000000090000F1 +:1046C0000000000000000000000004000000840062 +:1046D0000000001000000005000000000003400082 +:1046E00000000000000000000000000000000000CA +:1046F00000000040200002000000A00000000000B8 +:104700000000040404000400021000000000000087 +:104710000000000000000080000000000000020017 +:1047200000800500400000000000000800000000BC +:104730000000000800080008000800080008000841 +:104740000008000800080008000800840084000039 +:1047500000000008080800080010008400400082E3 +:104760008008000800080008000800000008000099 +:104770000000000000080084801000000084000891 +:10478000000000080011000800100008008400006C +:1047900000000000000200820020000000840010E1 +:1047A000000000204000808200000082000000081D +:1047B00000000040000000000000000000000000B9 +:1047C00000000000000000000040000000000000A9 +:1047D00000000000000000000000000000080008C9 +:1047E000000000090000042100000010000000216A +:1047F0000000000000000000900804000000840891 +:10480000000000110000000000100000000000087F +:104810000000000000000008000020000408001054 +:104820000000000000000000020000000000000086 :104830000000000000000000000000000000000078 -:1048400000000000000000000000030009A01100AB -:10485000000000000000000000A0000000000000B8 -:10486000008200000020050000A003A0000000005E -:10487000000800080000000041080400000000A03B -:104880000000000805A000C00002000800000902A6 -:1048900000200000000000900000004000004000E8 -:1048A0000000009041000090210020000000001056 -:1048B00000000000000000000000000040000000B8 -:1048C00000000000080000000200000000000000DE -:1048D000000000000000000084000000080000004C -:1048E0000021082000000000084000C00041040032 -:1048F0000000844000400040004000400040004074 -:104900000040824090404040004000400040004055 -:104910000040004000000080004000400040004097 -:1049200000C0844000400040004000400080004043 -:1049300000830000000000000000000000000000F4 -:104940000000000000000000000000000000000067 -:10495000000000000082000000000000008800004D -:10496000000000000001000000000085210500C0DB -:1049700000000000000100010001008500010001AD -:1049800000010001400311014001008921010001E3 -:1049900000010001000100000040000108010001C9 -:1049A0000001000300010001000100090083004034 -:1049B000080520400000000000000000000000008A -:1049C00000000000000000000000000800000000DF -:1049D0000000000008000000000000000041A008E6 -:1049E0000021A0050000004100200000402110210E -:1049F0000000844100000000A00000004000000012 -:104A0000000484000000000000000000010090008D -:104A10000000000400200405000000080000000061 -:104A200040000000840200050000000200000000B9 -:104A30000000401000100000000000000000000016 +:10484000000000C0000000000000000000C00008E0 +:10485000001000000000001000A000000010000088 +:104860000000030000000000000000000000000045 +:1048700000000000000000820000000000000000B6 +:104880000000008800000000000000880000040014 +:104890000000000000000000000000000000000018 +:1048A00000A00000000800000500800000000000DB +:1048B00000000004000400000000000000000000F0 +:1048C000000400000041080000000000000000009B +:1048D00000000000C00000000000002100000000F7 +:1048E0000020000000400041002000000000000007 +:1048F00000000000000000000000000001040000B3 +:1049000000400080000000000000A0001000000037 +:10491000000000000000000000000000000008058A +:104920000000C000000300000000A0080400000018 +:10493000000000200004000000000000000000A0B3 +:104940002004000000000000000000000000000043 +:1049500000C0000000000000000000000000000097 +:1049600000000000000000000000000000400010F7 +:104970000000000000000000000000000000020035 +:1049800000000000000400000000000000A0000083 +:104990000000000000000000000008000900000006 +:1049A00000002000000000000000001000000000D7 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000800000000000000000000000000CF +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A00000000002000000000020000400000000242 +:104A1000001120000021000800000000000000003C +:104A20000800000000000000000000000000000876 +:104A3000008000080080000000000000000000006E :104A40000000000000000000000000000000000066 -:104A5000000000000000219000000308000803008F -:104A600000C0008400A0052000A0008900C0808450 -:104A7000000208C000000000000003000002000067 -:104A80000390002000A00088000004040002400001 -:104A90000000000000C00000000000000200020052 -:104AA0000000008800000000000000080000050071 -:104AB0000000000000000084000000000000000072 +:104A500000000000000000000000000003A00000B3 +:104A60000000000000000000000000002000000026 +:104A70000000000000000000000000000000000036 +:104A8000000000000000000005008000000300009E +:104A90000000000080000000000000000000000096 +:104AA000009009000000000000000000000000006D +:104AB00005000502050100100000000000000000D4 :104AC00000000000000000000000000000000000E6 -:104AD00008000000000002000000900000009000AC -:104AE000001100410000C0002021200021032021EE -:104AF0000004080800040004000000088408000006 -:104B0000000000000208000020210800C000000092 -:104B10000000000002000000000000000121002150 -:104B200000210021000000218480C000002100003D -:104B3000000500210000002100210000000000000D -:104B40000000000000000000000000000000000065 +:104AD00000000000000000000000000000000000D6 +:104AE0000000400040000000000000000000000046 +:104AF0000000002100000000000000000000000095 +:104B00000000000000000000000040000000010064 +:104B10000000000500030000000000080000000085 +:104B2000000000000000000000004021000000081C +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000200000000000063 :104B50000000000000000000000000000000000055 -:104B600000000000000000000000800080008400C1 -:104B700080000001000000010001000000000000B2 -:104B80000000000000000090000003C009000000C9 -:104B9000000000000000000000000400000002000F -:104BA00000080000000000000000004000000008B5 -:104BB000000000A000C00908000000000000000084 +:104B60000000000000000000000000400000000005 +:104B70002000000000000000020000000000000013 +:104B80000000000000000000000000000000000025 +:104B900020000000000000000000000000000000F5 +:104BA000000000000000000000000000204002049F +:104BB0002000204000000000000000000000000075 :104BC00000000000000000000000000000000000E5 -:104BD0000000000000000000000000001004004081 -:104BE0000010880010C000C000A0101082A00000BB -:104BF000010200902001000001010000000000C03F -:104C000000010002000000C000200020880000C059 -:104C100000028200000220C0000400889020880862 -:104C200000024002020488109008908882088408DC -:104C300000020008080802020008000802820000C2 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF00004000000000000000000000000000000B1 +:104C000000000000000000C00000001000000108CB +:104C10000000C000000100010100100100080000B8 +:104C2000000000000000082000880010C000000004 +:104C30000000000000000001010020000001000051 :104C40000000000000000000000000000000000064 :104C50000000000000000000000000000000000054 -:104C60000080008000000000000000800080000044 -:104C700000004000008000080010401000200000EC -:104C8000088300210082000800800000000000006E -:104C9000008005800000000000800080000000000F -:104CA000008011000000800000000880000080806B -:104CB000008000000080800005000080008000006F +:104C60000000000000000000000000000000000044 +:104C700005008000000000000000000000000000AF +:104C800000000000000000000080000000000000A4 +:104C9000111111218011000820110310800900104A +:104CA0000000000000000000C000000000008000C4 +:104CB0000000000000000000004108200010000279 :104CC00000000000000000000000000000000000E4 :104CD00000000000000000000000000000000000D4 -:104CE000800000000021800000000004000000009F -:104CF0008003801100038080000580000005800093 -:104D0000000000000008008080080000000580000E -:104D10008000020091030400A00080008002800057 -:104D200000808000808580900080000080C180101D -:104D30008080800000A080808080000080A18000B2 -:104D400000800000000000000000000000000000E3 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000000000000B4 +:104D00000000000000000000000080000000000023 +:104D10000000098082A111000080098090A111008B +:104D20000080000000000000000000000000000003 +:104D30000000800080008041808011004000200041 +:104D4000C0000000000000000000000000000000A3 :104D50000000000000000000000000000000000053 -:104D6000000008000488C00104008400C0A0840082 -:104D7000A0001000108900000408000008002000B6 -:104D8000C0000000001088010040C0010000880041 -:104D90000200C000010002000000C1001000080174 -:104DA000108802C0080040C0080820C0020008C0E7 -:104DB000108902C0080084C0080804C0020008C0AE -:104DC000108402C00000000000000000000000008D +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000001000000013 +:104D900000000088010882C0000000C0010882C035 +:104DA000010000C000000000000000000000000042 +:104DB000000000004000C0008401C0C0C00021000D +:104DC0002000C10000000000000000000000000002 :104DD00000000000000000000000000000000000D3 -:104DE0000000000008100008001010100408000463 -:104DF000000800881010C0200802012000080510DB -:104E0000040000000000888801C0002010C00000DD -:104E10000090002010C090030020C04100C100029B -:104E20000008C008000841080002C0020203210275 -:104E30000008C088820811080002C0082082050806 -:104E40000008C00802100000000000000000000080 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000100000000B2 +:104E000000000000000100000000000000000000A1 +:104E10000000001000C000400008100083000040A7 +:104E20000009200083000000000000000000409006 +:104E300000A020400220000000000000000000014F +:104E4000000001010001000000000000000000005F :104E50000000000000000000000000000000000052 -:104E60000000000000008080008000808000008042 -:104E70000000008000008980808080002000008089 -:104E800088000800050000000000100020000080DD -:104E9000000000000000008000A0001000A100C081 -:104EA000000000808080008041A00040800300203E -:104EB00041200088800880A0C18000008000008020 -:104EC0004100008080802080000000000000000081 +:104E60000000000000000000000000000000000042 +:104E7000000000000000000200090010000800000F +:104E80000000000000000001000000000000000021 +:104E900000000000000000800882091180009103DA +:104EA0002090110980009110030000000000000014 +:104EB00080000080008080000000000000000000F2 +:104EC000004000100540102100000000000000001C :104ED00000000000000000000000000000000000D2 -:104EE0000000000000000000800080000000800042 -:104EF0000000000000008000801100090000000098 -:104F00000000000000000000000088001000038086 -:104F10008200800000000000000080880000000087 -:104F200080408000800000800000800000100000B1 -:104F30008000000080110000800080000010000050 -:104F400080000000808080800000000000000000E1 +:104EE00000000000000000000000000000000000C2 +:104EF00000000000000000000000000000000000B2 +:104F000000000000000000000001000000000000A0 +:104F100000000000000000000000108211110300DA +:104F20000940108510110300094000000000000036 +:104F300000000040000000000000000000000080B1 +:104F40000000210503802000004000000000000058 :104F50000000000000000000000000000000000051 -:104F60000000000000000000000008001004880499 -:104F7000A000C00010C000C0A0001001200002026C -:104F8000400000000010000000000000C000011000 -:104F900000100800C000202002000000C040902047 -:104FA00000200401C00004040008000008000203FF -:104FB000020282000200082088880800080002031C -:104FC0000808100002000882080802000000000023 +:104F60000000000000000000000000000000000041 +:104F70000000000000000000000000000000000031 +:104F80000000000000000000000000010000000020 +:104F90000000000000008800008800000041008937 +:104FA00091000101080800890100010100000000D2 +:104FB00000000000000000000000000000000000F1 +:104FC00000C000880188018200C0000100000000CC :104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 -:104FF000000000000000000000000000410000E090 -:1050000007005000840000E00000000000000000E5 -:105010000000000000000000000000000000000090 -:10502000000000000000000000000000004200003E -:10503000000000004842000000000000484200005C -:10504000000000004842000000000000484200004C +:104FF00000000000000000000000000000000000B1 +:1050000000000000000000000000000000000000A0 +:10501000000000000000000000000000000081000F +:1050200000E000008121810000E0000081210000FB +:105030000000000000000041000007000012000016 +:10504000000007000042818100E00700000000002E :105050000000000000000000000000000000000050 -:105060000000000000000000000000000000F03C14 -:10507000003C89CFFFFFFF0000009B9FDBFF0FFF7D -:10508000C0C0813FBD3F000000003636363600000C -:105090003C3C0000F3300000F0FF0000FFF0000097 -:1050A0003C3C0000F330000066FF0000F6F6E666C8 -:1050B0007E3CFE3C6F6F7FFFE7FF67FF6F6F7FFFF8 -:1050C000BDFF3DFF6F6F6060E7FF67FFFCFC0C0CEE +:105060000000000000000000000000000000000040 +:105070000000000000000000000000000000000030 +:105080000000000000000000000000000000000020 +:105090000000000000000000FF00FF00FF00000013 +:1050A0000F0F0F0FCCCCCCCC0000FFFFCCCCCCCC66 +:1050B000000000000000000000000000DBDB99FFA2 +:1050C00000000000000000000000000000000000E0 :1050D00000000000000000000000000000000000D0 :1050E00000000000000000000000000000000000C0 -:1050F000F03C003C000000003C3C3C3C0000000058 -:105100000FFFCFCF813FBD3F00000000363636365F -:10511000000066660000F3300000F000000000F0C0 -:105120000000FF000000F3300000660000000606EB -:105130002666183C083C6060400024006400606003 -:105140004000240034007FFF400024006400BC3C89 -:105150002C3C0000000000000000000000000000E7 +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:1051100000000000000000000000FF00FF00FF0092 +:105120000000F0F0F0F0CCCCCCCCFFFF0000CCCCF9 +:10513000CCCC000000000000000000000000DBDB21 +:10514000090900000000000000000000000000004D +:10515000000000000000000000000000000000004F :10516000000000000000000000000000000000003F :10517000000000000000000000000000000000002F :10518000000000000000000000000000000000001F :10519000000000000000000000000000000000000F :1051A00000000000000000000000000000000000FF :1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF +:1051C000000000000000000000802002000000003D :1051D00000000000000000000000000000000000CF :1051E00000000000000000000000000000000000BF -:1051F00000000000666606063031767700003C3C11 -:10520000343D343D000000000000F0F000000000DC -:105210000000069F0000000066660000F6F6000031 -:1052200006F60000069F0000FF3C0000F6F60000B6 -:105230003C0F363C3636FFBCFFBD0206BF9FFFC2A7 -:10524000FFFF0604F6F7667F666F0206BF9F3C7F8E -:105250003C7E6C666C6C00000000000000000000EA +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:105220000F0FC3C3C3C366669999696969695A5AFE +:105230005A5A696969690000000000000000F9001D +:10524000F00000000000000000000000000000006E +:105250000000C39660600000000000000000000035 :10526000000000000000000000000000000000003E -:105270000000000000000000F0000001464700F0C0 -:105280003C000009606930303F3F30303030000072 -:1052900000000000069F000000000F0F000006063F -:1052A000000006F60000069F0000003C0000060615 -:1052B00000003C0F3C3C3636002C00240006FF9FCB -:1052C0000000003D0404F7F7664066600006FF9F9B -:1052D0003C103C1866666C6C00000000000000008A +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000F0F3C3C3C3C66669999696969694E +:1052B0005A5A5A5A696969690000000000000000E2 +:1052C000F000F000000000000000000000000000FE +:1052D0000000000000966060000000000000000078 :1052E00000000000000000000000000000000000BE -:1052F000000000000000000000003000000000007E -:10530000000030000000000005610A0F850D00A0BC -:1053100000610007802D1202000040E38006002D8E -:105320009202408280000020920240E38006002D1D -:105330009202408280000020100240618006002D11 -:10534000100240618006002D100240008000002005 -:105350001002400080000020100200000000000049 +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000610006000D000029 +:10531000000000000000000000000000000000008D +:105320000000400280000020900240618000802147 +:105330001002406180008021000200000000000097 +:10534000000000000020000000000000000000003D +:10535000000000610026800100080000000000003D :10536000000000000000000000000000000000003D :10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD -:1053B000F5A0F7A2000000000000000000000000BF -:1053C0000808283C00000000FFFFFFFF000000006D -:1053D00000000000000000000000000000000000CD +:1053800000000000000000000000000000000F000E +:10539000CF0000000000000000000000000000003E +:1053A000000000000000000000000000BE1E141EEF +:1053B000C2C2FEFEBE141E1EE1E1F5F500000000B3 +:1053C00000000000000000000000000000000000DD +:1053D000000000000F000000A0E10A4B00000000E8 :1053E00000000000000000000000000000000000BD :1053F00000000000000000000000000000000000AD :10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:105420000008000000000000000000000000000074 -:10543000000000000000000000000000000000006C -:1054400000000000001400000000FEFFFFFF00004D -:10545000000000000000000000000000000000004C +:105410008F00CF000000000000000000000000002E +:105420000000000000000000000000000000BE1EA0 +:10543000141E02023E3EBE141E1EA0A0B4B4000004 +:10544000000000000000000000000000000000005C +:105450000000000000000F000000A0B40A1E0000C1 :10546000000000000000000000000000000000003C :10547000000000000000000000000000000000002C :10548000000000000000000000000000000000001C :10549000000000000000000000000000000000000C :1054A00000000000000000000000000000000000FC -:1054B0000000000082000F0F00000000000000004C +:1054B000FD5DA8083F3A3F3A2DAF2D053C3C3C3CF2 :1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC +:1054D00000000000000000000C0C3C33003C5F3C6E :1054E00000000000000000000000000000000000BC :1054F00000000000000000000000000000000000AC :10550000000000000000000000000000000000009B -:10551000000000000000000000000080000000000B -:1055200000000000800000000000000000000000FB -:10553000000000000000AA280F0F0000000000007B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:105560000000208020042000000000000000200037 -:10557000000000000000000000000000000000002B -:1055800020000000000020000000000000002000BB -:1055900000000000000000080400040004000000F7 -:1055A000041000030041A0082000000000050005D1 -:1055B0000010880000000005000000052041C00028 -:1055C000040020C0022002000200028202800200C9 -:1055D0000280020400118800880000020004100804 -:1055E00010208802000400000000000000000000FD -:1055F000004000000000000000000000200010003B -:105600000000000000002000000200000000000078 -:10561000000000000000000000000000000000C0CA -:10562000000000000000000000000000000000007A -:1056300000040001000000400000000000004000E5 -:10564000000000080003800180008000800280408C -:105650008002804080020500000000000000002160 -:10566000000000C100210080008000800080000058 -:10567000000000000000000000000000000000002A -:10568000000900000200000000000000820000008D -:1056900000000000001000000000040900000000ED -:1056A00000000000000000000000000000000004F6 -:1056B00000000100000001000000040000000004E0 -:1056C0000000000000000000004000C000A000003A -:1056D000038002800020002000000008000040003D -:1056E0000340212000A00200002000200020002014 -:1056F00000080000000000000000000000000000A2 -:105700000000000800080000000000000000000089 -:1057100000400084000800080000000800000000AD -:10572000000800C0000400000000000805000000A0 -:10573000008400101000000840080000000800105D -:10574000000210020010000000000003002100030E -:1057500004888220802000110085000009090000D3 -:105760008010A08882850041000000000000000039 -:105770000000000000000000000000000008000021 -:105780000000000000000000000000000000000019 -:10579000A00000000000880000000200900000004F -:1057A0009040A0000008000400000000000000037A -:1057B0000008000000000009400300000000000095 -:1057C00090000008900300031021000388040020CB -:1057D000008088208421004000A1004000210003B7 -:1057E0000008000088080040002100400000000080 +:10551000000000000000000000000000000000008B +:10552000000000000000000000000000000000007B +:105530000000FD5DA808303A303A2DAF2D05A0AF30 +:10554000A0AF00000000000000000000000000000C +:10555000000000000000000000000C0C3C3C003C7F +:10556000A03C000000000000000800000000000057 +:1055700000000005001000002000000000000000F6 +:1055800000040000000000000000A0100000000067 +:1055900000000880A1800400200000000000C0027C +:1055A00000000002000000000000000820000000D1 +:1055B0000000000020008400000000110000000036 +:1055C0002000020000000000020000042000000093 +:1055D0000004000288002002400084000000000057 +:1055E00008002000000000C0000000400040000053 +:1055F000000000000000400000400000000000002B +:10560000000000000000000000000000000000009A +:1056100000000000801008100000000000000000E2 +:105620000000000200000000004000000000000038 +:10563000000000000040000000400000009000005A +:1056400000000000400200000004004000020000D2 +:1056500000020002000000000890000000020002AA +:105660000004000000A0000000000000000000088E +:105670000010001000000000000240024000000086 +:10568000000000000000000000000000000000100A +:1056900000000200000001000000000000000040C7 +:1056A00000000000000000000000000000000003F7 +:1056B00000000200000002000000000000000010D6 +:1056C000000000400000000000000000000000009A +:1056D00000000000000000000000030000002000A7 +:1056E00000000000000002000000000000880084AC +:1056F00000840082000000100008008380118008F0 +:105700000000001000000002000000000000001077 +:105710000408040000000000400800000000000829 +:1057200000C00000000000000000000000000000B9 +:1057300000820408000000000000000800000000D3 +:105740000010000400000010000000000000000035 +:105750000090000800000000000000042084008485 +:105760008000008400000000008400000000002190 +:105770000000001000210000900000000000000563 +:10578000002100090040000000000021000000008E +:1057900000080005000000100000001000000000DC +:1057A00000000000000000000000000000000400F5 +:1057B00000000402000004000400000000000000DB +:1057C00000000000000000000000000800000000D1 +:1057D0000000000000000000000800009000000031 +:1057E00000009000000000000000880000000000A1 :1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000800000090 -:10581000000000080200000003000340050000A093 -:1058200005A00900020040000500000000000090F3 -:105830004140020000020000418404A041024100F6 -:105840000088000005A00300000800A04000090433 -:105850000009042040891100411000204108002067 -:1058600000000000400805000900050800080000CD -:105870000000000000000000000000000000C00068 -:1058800000000000000000000000C000C000000098 -:1058900000000000000000000000002100000000E7 -:1058A0009000000000000003000004000800000059 -:1058B00000008400000400002008200400100040C4 -:1058C0000000C000000000000040080000040000CC -:1058D0000020052005000103C000820000400810E0 -:1058E000C020004188C10000082082400800080450 -:1058F000000000A000000000000000080000000000 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000084000003 -:105920000084000000C0000000040000000000C06F -:10593000000000002000000000000004000800003B -:105940000000100000000000000000000000000047 -:1059500000000089020102A00284009000000009FA -:10596000004000900084001000041101009000002D -:105970000001000000000000000008000800000016 -:105980000000080000000000C0000000000000004F -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000004000B7 -:1059B00000000000400040004000004000044000A3 -:1059C0000800000000028440010208000000A0005E -:1059D0000008000040044002402000099010A0058B -:1059E0000020410420208400000002000020080064 -:1059F0000010010000000000000000000000000096 -:105A0000000000000000000000000000000800008E -:105A100008000000030800C0000000A0000800000B -:105A200000000000000000C000C0000800004004AA -:105A300000A000000000400005400000000805082C -:105A400000080000000000040300400010000000F7 -:105A50000000102000A000000882000000000500E7 -:105A60000582000904900000100000000000000101 -:105A70000000000004000000000000000000000022 -:105A80000004000800080000000000000000000002 -:105A900000000000200000000000000000000000E6 -:105AA000000000000000840000000041000000042D -:105AB0000000000000000000000082000400000060 -:105AC000C0000000000000000421022100042003A7 -:105AD000A000000000000000008082000880000894 -:105AE00000000308A12100C1044100210005C000FD -:105AF00001410041012100400000000000000000C1 -:105B00000000000000000000000000000000000095 -:105B10000000000000000000020002000000000081 -:105B2000000000000000000000C0000000000000B5 -:105B3000000000A000002000000000000000200085 -:105B400000000000000020840004000000000000AD -:105B500000884102000000C0000000400008004032 -:105B600000900000840002000040000021C00000FE -:105B700020C00804000020002001000000000000F8 -:105B80000000000000000000000000000000000015 +:105800000000000000000000000000000000000098 +:105810000000000000000000000000000001000087 +:105820000000000000000000000800000000000070 +:105830000000000000000400000000000000110053 +:105840000008000800000008000000A0000021047B +:105850000008030802100000000000000000110012 +:1058600004080300410000000000000004000000E4 +:1058700000000000820000000000000000000000A6 +:105880000000000000000000000000000000000018 +:105890000000000000000008000000000000000000 +:1058A00000110040000000000000000000000000A7 +:1058B00000000000000000000000000000000000E8 +:1058C00000000000080008000000000000000000C8 +:1058D000A000000010008200200000000000000076 +:1058E00008000008000000000000000008000000A0 +:1058F0000082000000A000C009A0200000000000FD +:1059000000840000000000000000000000A0000073 +:105910000000000400000000000000000000000083 +:10592000000000000000000000080000000000006F +:105930000000000000000000000000000000004027 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:10596000000000000000000000000000008202842F +:1059700000000000000000000000000002008200A3 +:10598000000200000000000000000008000000000D +:105990000000000000000000000000000000840083 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C000000000000000084000000000000000008F +:1059D0000000000000000000000000004000000087 +:1059E00000000000000000000000000000000000B7 +:1059F00000000002000000000000000000000000A5 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000040000000000000000000072 +:105A30000000000000000000000000000000000066 +:105A40000040008200A000C00000058800000000A7 +:105A5000210000880000000000000000000040005D +:105A60000000008820000008000000000000000086 +:105A700000100008000000000000002100410000AC +:105A800000000000000000000000000000000021F5 +:105A900000000021000400000000000000000000E1 +:105AA00000000000000000020000000000000004F0 +:105AB000000000090040000000000000000000009D +:105AC0000000000000000000000090000000000046 +:105AD000C000000000000000000000000000000006 +:105AE0000000000000004000000000000000000076 +:105AF000000000410004000005000000400000001C +:105B000000000000000000000000000000844004CD +:105B10000000000000000000000000000000000085 +:105B20000010000000100000000100000000000054 +:105B30000000000000000000000000000000000065 +:105B4000000000C000000000000000000000000095 +:105B50000000000000000000000000000000000045 +:105B6000000000000000000000000882000400089F +:105B70000000000000000000000000000000000025 +:105B8000000000000000000000000000000008000D :105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 +:105BA0000000000000000000000000A00004000948 :105BB00000000000000000000000000000000000E5 -:105BC00000000000A0020104881004020000000090 -:105BD00000000000C00288408382828488C0009058 -:105BE0004008001088C000900002C088000001003A -:105BF000040002000000000020000010000000006F +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000010100B3 +:105BF000A000000100000000000000000000000004 :105C00000000000000000000000000000000000094 -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C40000000000000008000038000000000000051 -:105C5000000000000000800010002100808085808E -:105C6000088080800080808000800000800000002C -:105C700003008000000011002100100000800010CF -:105C80000000000000800000000000000000000094 -:105C90000000000000000000000000000000000004 +:105C10008000000000000000000000000000000004 +:105C200000000000000000000000000000800004F0 +:105C300000850000000000000000000000000000DF +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C600000000000000000000000000000000040F4 +:105C700041090009000400000000000000000000CD +:105C80000000000000000000000000000000038091 +:105C90002000080004400000000000000000000098 :105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 -:105CC0000000000000000000000000418080008013 -:105CD00005000800050008009000A04005028800AB -:105CE000100088029080908080000000808080807A -:105CF00000000000000000800308A18403842085C8 -:105D00000000008800000008000000000000000003 -:105D10000000000000000000000000000000000083 +:105CB0000003000000800000000000000000000061 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF0000400200000000040000000000000000040 +:105D00000000000000000000000000000000000093 +:105D10000008000001000100000000000000000079 :105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 -:105D4000000000000000000000008400900110042A -:105D5000C008000000000100002040001082110077 -:105D60001120000010008588C19008000000848880 -:105D7000C090000000000000000800411108001160 -:105D80000002000000000800000000000000000009 -:105D90000000000000000000000000000000000003 +:105D3000000000000000000800000000000000005B +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D7000000000A001000000000100000000000081 +:105D80000000000000000000000000000000000013 +:105D90000000000000010001000100000000000000 :105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 -:105DC0000000000000000000000000000885002026 -:105DD000208410A100000000000000008288002044 -:105DE000A089032000400008900989C1000000023A -:105DF000109088C00000000300000005000184002E -:105E000010090001100000008000000000000000E8 -:105E10000000000000000000000000000000000082 +:105DB00000000800000000000800000000000000D3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF0000000000000010000C101000000000000E0 +:105E00000000000000000000000000000000000092 +:105E10000000000000030003002104020000000055 :105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000804092 -:105E50000041000280C1000000000000000000407E -:105E600000418020A10500A000828085908800006C -:105E700000000080808000090088000900410220A5 -:105E8000002100A104040000000000000000000048 -:105E90000000000000000000000000000000000002 +:105E30000000000080000000090080000000000059 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000002004105214005000074 +:105E80000000000000000000000000000000000012 +:105E90000000000000000280110021000902000043 :105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 :105EC00000000000000000000000000000000000D2 -:105ED000000400C08080800000000000000000106E -:105EE0000008808000808009801180888080000800 -:105EF000801180C1000000000000000000000000D0 -:105F0000900591104000090300000000000000000F -:105F10000000000000000000000000000000000081 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000002100400020004008D9 +:105F00000000000000000000000000000000000091 +:105F1000000000000000000000C0000001000000C0 :105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000000061 +:105F300000000000000000009000A000040002002B :105F40000000000000000000000000000000000051 -:105F500000000401A0A040088200009000000000A2 -:105F600000018200021082400200C08320890808DC -:105F70000001C0012088020284000000000000002F -:105F80000000C110890003004100480000E0070044 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F7000000000000000000000000184010001009A +:105F80000001000000000000000000000000000010 :105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 +:105FA00041000000000000000000000000000000B0 :105FB00000000000000000000000000000000000E1 :105FC00000000000000000000000000000000000D1 -:105FD000000000000000000000004200000000007F -:105FE000000000000000000000008400000000002D -:105FF0000700000000000000070000120000000081 -:1060000000000000000000E00700000000000000A9 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF000000000000000000000000000000000E0C1 +:10600000000042000000000000000000000000004E :106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 +:106030000000000000000000000000003030FF3FC2 :106040000000000000000000000000000000000050 -:106050000000000000000C0CAAAACF00CFFF000037 -:10606000000000000000F000F000AA0AAA02AFAF92 -:10607000F0FFF0AA3CF0ACAC303FAAAAF0F0000070 -:106080000000FFFF0000AAAA0F0F00FF00000000A1 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 :106090000000000000000000000000000000000000 :1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D000000000000000000000F00AFA550055FF23 -:1060E0000000000000000000F300F000AAAAAA824D -:1060F000A0A0000FF0AA3CF0ACAC303FF0F000FFE5 -:10610000000000000F0F0F0FAAAACFC000FF000071 +:1060B0000000000000000000000000000000303080 +:1060C0003030000000000000000000000000000070 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F :10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:106150000000000000000000000000C2C2C2C3FF37 -:106160003D3D0000000000000000000C0F0C00A2EC -:10617000A2A2FC0C35350F0F5555FC0C35353C3CB7 -:106180005555000000000000000000003C3C0000ED -:106190000F0F0000000000000000000000000000E1 +:1061400000A00000000000000000000000000000AF +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF :1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF :1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000FAFAFAD1 -:1061E000C3FFC3FF000000000000000000AC0FACC4 -:1061F00000F3F3F3FC0C3535FF000F0FFC0C3535C5 -:10620000FF003C3C000000000000000000003C3C9F -:1062100000000F0F05790A06850D05A0000000009B -:10622000000000000000000000000000000000006E +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:106220000000000000610006000D000000000000FA :10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:1062500000000000000000000000000000000061DD -:106260000006000D000000610006000D0000006146 -:106270003006000D00001061200E004D00081000D7 -:1062800020080040000800610006000D00001561B4 -:106290002A0F054D00A800000000000000000000CB -:1062A00000000000000000000000000000000000EE +:106240000000000000610006000D000000000000DA +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:1062800000000000000000610004000900000000A0 +:1062900000000000000000000000000000000000FE +:1062A000000000000000BCFFFCFF005000C0000028 :1062B00000000000000000000000000000000000DE :1062C00000000000000000000000000000000000CE :1062D00000000000000000000000000000000000BE -:1062E000000000008200C3C00000000000000000A9 -:1062F00000000000D580FDA800000000C30341019C -:10630000000000000000000000000000C000C38288 -:1063100080C082C3D7D71C1F00000000000000000F -:10632000000000000000000000000000000000006D +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:106300000000000000000000000004300F0F0F022A +:10631000000000000000000000000000000000007D +:1063200000000000000000001C000C00005000C035 :10633000000000000000000000000000000000005D :10634000000000000000000000000000000000004D :10635000000000000000000000000000000000003D -:10636000000000000000820000C0000000000000EB -:10637000000000000000D782FFAA00000000FF0F0D -:106380005505000000000000000000000000C000F3 -:106390000082A0F0AAFFD7D7DCDF000000000000D9 -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000FFFF0F02FE +:106390000F020000000000000000000000000000EC +:1063A00000000000000000000000000000000045A8 +:1063B0000055000000000000000000000000000088 :1063C00000000000000000000000000000000000CD :1063D00000000000000000000000000000000000BD :1063E00000000000000000000000000000000000AD -:1063F000FFFFFFFF00000000000030BA00000000B7 -:1064000055054101000000000000000000000000F0 -:106410000000000000000000F0F05040000000000C +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000C3FF0000CA +:106410000707070700000000000000000000000060 :10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C +:1064300000CF00CF000000000000000000000000BE +:1064400000000000000000000000000000F000F06C :10645000000000000000000000000000000000003C :10646000000000000000000000000000000000002C -:106470000000FEFFFFFF00000000000030BA000037 -:106480000000FF0FC3030000000000000000000038 -:1064900000000000000000000000F0F0F0C000006C +:10647000000000000000000000000000000000001C +:106480000000000000000000000000000000C0F05C +:106490000000D7D7D7D700000000000000000000A0 :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC @@ -157303,193 +157303,193 @@ :1064F000000000000000000000000000000000009C :10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B -:10652000000000002000000000000000000000004B -:1065300000000000008000000000000000000000DB -:106540000480000020000000080001800800048092 -:106550000000000000000004000000000000000037 -:1065600000030400C000040002000000000040001E -:10657000000000000000C000000000000000000457 -:1065800000000000200020002000000000000004A7 -:1065900000000200000400110000000000040000E0 -:1065A00000000000000000000000000000000002E9 -:1065B000000000000000004000000000000000009B -:1065C0000000802000000000000080000420800007 -:1065D000802000000000000000000000000000001B -:1065E000000000000000000000000000000040006B -:1065F0000000000000000000000000040000000097 -:106600000001000000000000000000000000000089 -:106610000000000000000000000000040000000076 -:1066200000000000000000000000C10000000000A9 -:106630000000000000000000000000000004000056 -:106640000000000000000000001000000000010039 -:106650000100000000000000000000000000020037 -:10666000000000000000010008000000040000001D -:1066700000030004000200000000008000882000E9 -:10668000210402040040004100000000000400005A -:1066900000000040000002410040000002000040F5 -:1066A00000000000004100820008000840080008C7 -:1066B00000080000000800000008000000000000C2 -:1066C00000000084000000820008000800080008A4 -:1066D0000408200000400908000800000000000431 -:1066E0000000000800000000200004080008000866 -:1066F000000800080000000100080082004000407F -:106700008000A00000090001200000080008000827 -:106710000010098400000082000800000040001002 -:106720000008000800040000000000000000000055 -:106730000000000000000000000000000040000316 -:106740000000000000000000000000000000000049 -:1067500001000000014000000003000000100002E2 -:1067600000210140004020400000090040000021BD -:10677000200400020000104000400003100004212B -:10678000002101030000004010050000014000212D -:1067900000110000204108212021012100020121D7 -:1067A0009021012184032009004100000000000025 -:1067B00000A00084000000000000000000000001B4 -:1067C00000000000000000000000000000000000C9 -:1067D0000000200000002000000000000000090070 -:1067E00000010000200000018001000020001100D5 -:1067F000080080000001200000010891000002A0B4 -:106800000000020820080000004100401110204054 -:10681000000000040000C00800008000200000000C -:106820002008400820000000800000000005000053 -:106830000000000000000000000000000800000050 -:1068400000000000000000000000000083090000BC -:1068500005000009000000000004C00083040000DF -:106860000080000000050140400901030000A14133 -:1068700000040085008308050005000000110005E4 -:106880000040000800400080C09100020091000517 -:1068900000C00011884140914085000800059040EB -:1068A000A0000900A00000C1000990090109000032 -:1068B0000000000000000000000000000000800058 -:1068C0000082000000000000000000000000040042 -:1068D000000084000000000000000001000008002B -:1068E0002090000200000000200180002000000035 -:1068F000200000C0004000400900008800A009847A -:1069000000900285008200820040004000010004E7 -:10691000090809050090008480400040408400C0C0 -:10692000218400C020840084210403C000A040080A -:106930000000000000000000000000000000000057 -:10694000080000000000000000080000000800002F -:10695000820000000000020000000002000090031E -:106960000805000540214000A0000040400200054D -:106970000000002100000021C003002190000882D7 -:10698000000800032000A021200540418808404164 -:10699000402140030020400521112000000040213B -:1069A000C02100030041C04040401040C002200907 -:1069B0000003000000C00000000000000000000014 -:1069C0000000800000000000000000000000000047 -:1069D00000000000000000000000000002000000B5 -:1069E00000008000002083008004000000000001FF -:1069F000000000000800000000000000020000008D -:106A000000020010114000000040000000000010D3 -:106A1000008290900040400002102000000800001A -:106A20008000000000080000000391014001000008 -:106A300000000500000800000021000000400000E8 -:106A4000000000000008000000000000000000003E -:106A50000000C000820000000000000001000000F3 -:106A60000121C021824000400008000841040004C8 -:106A7000000000000000830400040004C1040104BD -:106A80000104C004000400840004A0040104000404 -:106A9000000400040004010401050011010488043D -:106AA00090840104418403844104C0040004000470 -:106AB000C0400104002100000000000000000000B0 -:106AC00000000000000000000000000000000000C6 -:106AD0000000000000000000000000000000200096 -:106AE00000082000000000010001000000C082003A -:106AF00000820000001000002082000000002084BE -:106B0000020002020000080009400010008240104C -:106B10000000000000C000000240200000C0200073 -:106B200011C01104020002042040821011102184BF -:106B300000100385208400A00000010084000000F4 -:106B40000000000000000000000000000000000045 -:106B50000000000000000000001000880002000299 -:106B600010A00083880890880400200000008200A4 -:106B7000200400039010400800002091042100022E -:106B80000208200200200041040820100002000436 -:106B90000208201020020020A0082004002000028B -:106BA0008821209020400402080820C100039002A0 -:106BB00002202090A003908920090000100080008E -:106BC00000000000000000000000000000000000C5 -:106BD0000000000000000000000040000000000075 -:106BE0000000058921A100908000200080000000A5 -:106BF000800011802188008000900000400910A1D1 -:106C00000000008010000091000880801180118039 -:106C100000800080000000800900008008000380E0 -:106C2000000400100000000000030080000802A122 -:106C3000809180020400A188800980830000000008 -:106C4000000000000000000000000000000000083C -:106C500000800000000000000000000000000003B1 -:106C600080000080008009119080A1081000800041 -:106C7000C000908000009090808410C000008000D0 -:106C800080A1088083831000C1A189A000808000BA -:106C900080A180800080000309918083828003802E -:106CA00080A10009908000008090A0801180108059 -:106CB00009C1A09021C08280C1A14090A191000093 -:106CC0000000000000820000000000000000000042 -:106CD000000100880000000000000000000010001B -:106CE00002014000101000040201A002091140003E -:106CF0000800029010C002000883100340C1000089 -:106D0000102008C0911003C0020008C0100290C0FB -:106D1000020008C0040402C0020004C0040482C0CF -:106D2000084008C0020303C0100208C1821090C0CE -:106D3000029020C00302C1C0109008C1912021C060 -:106D40000000000000000000000000000000000043 -:106D50000000000000000000000000000000000033 -:106D6000100000880410040800010088040082005C -:106D70000008000300020004C0080110C003201036 -:106D8000000003080083C002209105080090C08322 -:106D9000201011090090C004201011080221C00227 -:106DA000200811090191C003841103080111C003D7 -:106DB000200211080003C003108883080005C08862 -:106DC0002002000900100020002000000000000048 -:106DD00000000000000000000000000000000000B3 -:106DE0000000800000800080808000080002001108 -:106DF00091110080009000100084C1911180808862 -:106E00001182000041910089C1901005C1801111CB -:106E100080851082C188001180800000C1800088B8 -:106E200080020411C188110880218089C1911183D9 -:106E3000A0A11004C190008391088509C19010831E -:106E4000821102900000000000000000000000001D -:106E50000000000080008000000000000000000032 -:106E6000000000000011808080000000040011106C -:106E7000050020000020008000000000A1201080FC -:106E80008280901100008911038090A102110020DE -:106E900000918080000080110000808000000011BF -:106EA000800000000000A1020300882102112102DD -:106EB000088085801111900202008802091090025A -:106EC0000480858010090000000000000000000020 -:106ED000000000000000C00010000000880000005A -:106EE0000000000000000000A02008880000000052 -:106EF0008810011000000000102000029000050022 -:106F000021820840100100000200218209A1100125 -:106F10000200200208404000100020080840400005 -:106F2000828810909002C000A10020900803900178 -:106F3000410091100902020110002088090240005E -:106F4000020020020904040100000000000000000B -:106F500000000000000000000082000007000000A8 -:106F600000000000000000000021000007000000F9 -:106F7000842100E007000000000000000000004243 -:106F8000820000E0000084420000500000E00000A9 -:106F900048420000000000004842000000000000DD -:106FA0004842000000E000004842810000E000008C -:106FB0004842810000E000004842810000E00000FB -:106FC0004842810000E0000048420000000000004C -:106FD000000000000000000000000000E766000064 -:106FE00000000000000000000000F0F0F0F0FF0FD3 -:106FF000000F66FF66FF6F6F6F6F7E427E423F66D7 -:107000006666727266663636FF000000FBB9622063 -:1070100036FF360078783C3C3C66F0F078787E1895 -:107020003CF066F0BDF9246036F66666FBE3382076 -:107030003CF066F0FBB9FFFF3666F66678783C3CBC -:107040003FFF3000FBB9FFFF3C66F0F0000000009E -:10705000000000000000000000000000C3006624E3 -:1070600000000000000000000000000000FF00FF22 -:10707000FF0F000F66006600606060607E427E4227 -:10708000306666667E426666FF00FF000000FFFF16 -:107090000000FFFF00007E183C3CF0F0F0F03C3CAC -:1070A0003C3CF0F0F0F0FFFF000036066666FFFFA4 -:1070B0000000F0F0F0F062200000366606667E18F0 -:1070C0003C3C6FFF600062200000F0F0F0F0000038 +:1065200000850083000000000080008000A000853E +:10653000000020000800000500000000000000002E +:106540000000000000000000000000000004000047 +:106550000000200088000000000000000000000093 +:106560000003000000000000000000000000000028 +:1065700000000000200020000000000000000000DB +:10658000000000000000000000000000000000000B +:1065900000000000200020000800000000000000B3 +:1065A00008004040004000000000002000200011D2 +:1065B000001000000000800000000000000000004B +:1065C00000000000000000000000000000000000CB +:1065D000000000002100000000000000000000009A +:1065E0000000000000020000000200400000400027 +:1065F000400000400000000000000000000000001B +:106600000000000000000000000000000002000286 +:1066100000000000000000000000800000000000FA +:1066200000008000008000800010000200000000D8 +:106630000000000000100090004100000000001069 +:106640000008000000000000000000000000004002 +:106650000000020000000000200000000000000018 +:10666000000000000000000000000000000000002A +:10667000000000000040000000000000000000409A +:106680000000000000000000000000000200000008 +:1066900000400000000000000300010002000000B4 +:1066A0000100010008000002000208820085008449 +:1066B00000080000000800850011008400080000A8 +:1066C00000000000000000000000000000000000CA +:1066D00000080082000800880000800000C0001050 +:1066E00000400040008200000000000000000000A8 +:1066F0000000000800000010000000000000000082 +:106700000000000000000000000000000000000089 +:10671000000000020000020800000800080000005D +:106720000000080008000000000300090005000048 +:1067300000050000000900400008000300090010E7 +:10674000000800000000000200400000002100409E +:106750000000000000000000000000000002000037 +:106760000000000000000000000000000000000029 +:10677000000000000000000000000400A000040071 +:1067800000000000100004001000000000000000E5 +:106790009000000000000000000000000000000069 +:1067A0000000000000000000002100880000000040 +:1067B0000088000041000000000000000088000088 +:1067C00000090000000800000000000000000300B5 +:1067D00000000000000000000000000000000800B1 +:1067E00000000000000000000000000000000000A9 +:1067F000000000000000000004000008000000008D +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:10682000002000000000000000000000C080A080E8 +:106830004100018000210000000000000000000075 +:1068400083090000000000000000000000000000BC +:106850008200000000000000004000000104000071 +:1068600000000000000400000000004000000000E4 +:106870000000000000000040000000400000000098 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A0000000001100000000000000000000004097 +:1068B00000408200404000840000000000A00090E2 +:1068C00000820800008400000010000000080000A2 +:1068D000000003000000000009000000090010048F +:1068E0000000000000000010002000400000000038 +:1068F0000000000000000000000000400000000454 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000002000000057 +:106920000000000000000000000000000000000067 +:10693000A000000040020040004100040800008365 +:106940000000000000C1000000080000000000007E +:106950000000000000000000000000000000000037 +:10696000000800000000000000000000000000001F +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A0000000000000000000000000029000000352 +:1069B0000221000000008001000100000000000032 +:1069C0000020000000000010008400000010000003 +:1069D00000000000000000000000000000000000B7 +:1069E00000000501000000000000000000000000A1 +:1069F0000000000000000000000000000010000087 +:106A00000000000000000000000000200000000066 +:106A10000000002000000000000000000004000052 +:106A20000000002000040000000000200000000022 +:106A30000400000000009000004000020040004000 +:106A400002080221008400200020002000000041F4 +:106A50000000001000000000000000000000000026 +:106A60000000000040020080000000000000004024 +:106A70000000000000000000000000000000000016 +:106A8000880000000000000000000000000000007E +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000002003C3 +:106AB00000000000000000000000200100010000B4 +:106AC00000000000000000200001000100010000A3 +:106AD0000000000000000000000000100000028420 +:106AE0002082000000008205020220400000000019 +:106AF00000000000000000000000000000C00200D4 +:106B00000000200000000000000000000000000065 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000110054 +:106B30000000000000000000020202894003A0A043 +:106B4000C0009000000040000140004000A000C0D4 +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000100000000000123 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 +:106BA0000000000000000000000040100010004045 +:106BB00002C0891000100010C00291801021809046 +:106BC00080918000800000000000040000000000B0 +:106BD00000000000000000000000000000000000B5 +:106BE000000000000000000000000010000821105C +:106BF000000800000000000000000000000000008D +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 +:106C200000000000000000000000000082000000E2 +:106C3000008000000400000000008000C1008841C6 +:106C4000891090A1800000800008808080000000F2 +:106C50000000808000000000000000000000000034 +:106C6000000000000000000000000000008009009B +:106C700005114100000500000000000000000000B8 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB0000004801000000000802100100000020489 +:106CC00009058440A00940004008400002088800EF +:106CD000C082409008040000000000000000000096 +:106CE0000000000000000000000000000000004064 +:106CF000000001010184000000000000000000000D +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D30000200022110C08804C00040902090880406 +:106D4000050800882020A0820108004008400010AB +:106D5000910200880402A002000000000000000070 +:106D60000000000000000000000000000000000023 +:106D70000000010000000000000000000000000012 +:106D80000001000000000000000000000000000002 +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 +:106DB0000000091000201020101011840010102075 +:106DC00002104188001100020090080000008000BD +:106DD00000000200000080008000000000000000B1 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000003001000080000000000000078 +:106E00000000000100000000000000000000000081 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E300000000000C180008000008000C1800000D0 +:106E40000000800091000504030002080011008585 +:106E50000000000080108089000000000000000099 +:106E60000000000000000000000000000000000022 +:106E700000000000100408001000000800000000DE +:106E80000000000000010000000000000000000001 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB000000000000000000200040000000080004C +:106EC0000088008000000202888988848201000115 +:106ED0000020001000000200A02000880000000038 +:106EE00000000000000000000000000000000000A2 +:106EF000000000000000010101000100000000008E +:106F00000000000000000001000000000000000080 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F3000000000000000000088008810200290C0BF +:106F400008008808900890000000000000008200FF +:106F50000000000007008200004100000700000060 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000810000E000000000B0 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000700CA +:106FC000480000000000070048122420BDBF24DB59 +:106FD000BD42000000006CFF6CF0990099FF0000BA +:106FE000000300000000000000000000000000009E +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:10704000000000000000000000000000DBDF424004 +:1070500020DFBF40000000006C0F6C00990099FF1A +:10706000000000030000000000000000000000001D +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 :1070D00000000000000000000000000000000000B0 :1070E00000000000000000000000000000000000A0 :1070F0000000000000000000000000000000000090 @@ -157497,495 +157497,495 @@ :10711000000000000000000000000000000000006F :10712000000000000000000000000000000000005F :10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000E781E1E1FFB9002006879F879090F6F64E -:1071800000000000240CE7CF00FF6C6C3C3C7E1E2E -:107190000000000CFFFCFFFFC7DF0F0F663C24045C -:1071A000FFDF00FF0CFC6666660F0F660F3C664E45 -:1071B000664E6660666F240CE7CFFFFFFF6C0446E7 -:1071C0009DDF08F80EFE6603663F006CFF6C666686 -:1071D0000CCF0000000000000000000000000000D4 -:1071E000000000000000000000000000000000009F -:1071F0000000C3C3C3C3FFFB006206879F870099DB -:1072000066FF000000000000FFFF00FF00FF3C3CA5 -:10721000181E00000006FFF60000041C0F0F0F0FE1 -:107220000004DBDF00FF06F66666663C0F0F0F0FFB -:107230006642667E666C666C0000FFFF0000006CB4 -:107240000000FFFF00FF00FF666666660000FFFFAC -:107250006666666600610006000D00000000000022 -:1072600000000000100000200000000000000000EE -:10727000000000000000002000000001006100226A -:107280008005000000610006002D100240618004AE -:1072900080291002000040618002802910024061B4 -:1072A0008006002D100240618006002D1002406112 -:1072B0008007002D10024061800480291002406187 -:1072C0008004802910024061800280251002406104 -:1072D0008002802510020000000040108020000085 +:1071400002102000008810840210200000881084A3 +:10715000F0F0E466FB04F30C00000000FC06FCF613 +:10716000FFFF303F3C18000000000000000000005E +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000F0F1B9920DF30CF000000000C06CD +:1071E0000CF6FFFFB9BF3C183C1C0000000000007B +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:107250000000000040618006002D000205000A08C1 +:10726000050000A005000A28051000A0000000008D +:10727000000000000000000000000000000000000E +:107280000000000000600007800500000000000012 +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D000000000000000FFFAF5F0202000F00000A0 :1072E000000000000000000000000000000000009E -:1072F0000000000000000000000000000000FFFA95 -:1073000005000F0FEB4100000000F000F0FF0FC37D -:107310000F005541FFEB0000C0E8FCE8F330F3300C -:1073200000000000FFF00F00000000000F0F0F0F23 -:10733000000000000FFF0F00C5F5053500033C3FBE -:10734000ACFC0C5C303F3535FF555755B2F0B2B24E -:10735000FF007545AABEAABF000000000104020894 +:1072F000000000000000000000000000000000008E +:10730000000000000000000000A0000000000000DD +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:107350000000000000000000FFFBF7F3202020F0F9 :10736000000000000000000000000000000000001D :10737000000000000000000000000000000000000D -:10738000FEFE04040F0F0F0F00000000F000F0FFDE -:107390000FFF0F3C1400BEAA0000F0F0F0F03030F8 -:1073A000F3F300000000FFF00F0000000000C3C373 -:1073B000C3C3000000000FFF0F00C5F50535C0C3B3 -:1073C000FCFFACFC0C5C303F353500555455AAAA87 -:1073D000AAAA55555555AA82AA80000000000000AF +:107380000000000000000000000000A0000000005D +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000F0C3F0C3000047 :1073E000000000000000000000000000000000009D :1073F000000000000000000000000000000000008D -:107400000000FF0FF000FFF000F00000000000FFA0 -:107410003C3C7D417D41AAAAF0F00000FFFF000046 -:10742000AA00AAFFA0F5A0F53F033F03000000005B -:10743000000000000000000000000F0F4D4D4D4DFA -:10744000AAAA3C3C0F0F0F0FAA00AAFF0F0F0F0FA5 -:107450003071F37105AF05AFACA0AFA30000000021 -:10746000000000000000000000000000000000001C +:1074000000000000000000000000000028000055FF +:1074100050500000000000000000000000000000CC +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000F0C3F0C3C6 +:1074600040000000000000000000000000000000DC :10747000000000000000000000000000000000000C -:1074800000000000FF0FF000FFF000F0000000001F -:1074900000FF3C3C7D417D41AAAAF0F0000000FFC6 -:1074A00000FFAA00AAFFA0F5A0F53F033F030000DC -:1074B00000000000000000000000FFFF0F0F4D4D16 -:1074C0004D4DAAAA3C3C55555555AA00AAFFC300EC -:1074D000FF3C3071F3712D2D2D2DACA0AFA300001A -:1074E000000000000000000000000000000000009C -:1074F000000200000000000000002000000000006A -:10750000000000000000000000000000000000007B -:10751000000002000008000000002000000300033B -:107520000100000000000004400000000004000012 -:1075300002000441000000080000040220000400D2 -:107540000000010400000209200002000200000007 -:1075500000002000000000000000200420002003A4 -:107560000000000000020000000000000000000019 -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB -:1075A0000000400040000000050110000000110133 -:1075B00000000000000000000000000000000000CB -:1075C000000000002001000000000000000000009A -:1075D00000000000000000000000000000010000AA -:1075E000000000000000000000002040200000809B -:1075F0000000000002000200004000000000000047 -:107600000210000000000000000000000000000068 -:107610000000000000000040000000000200000028 -:10762000A0000000000000400200000000000080F8 -:10763000000000040010000002000009010000002A -:10764000000020400041084100090000080300003C -:1076500000100041100000100009000500008240E9 -:1076600000080040000000000000000080848088C6 -:10767000000400400000008200080008000002082A -:1076800000080000020802000200020000000008DA -:1076900000000004000000000084001000840008C6 -:1076A000008400000000000800080008020800082C -:1076B000000400000085000000000084028820080B -:1076C00000080010800800080008000800080008F2 -:1076D00000840084000000000000001000880010FA -:1076E00000080010000800000005000000000080F5 -:1076F0000004000000080000000000000003000873 -:107700000000000000000000000000100000010068 -:1077100001000000000001000100014001400108DB -:1077200089009100214000008940214089030140E7 -:107730000104904011080103018321090021838382 -:10774000012120210108A121890041218821214115 -:1077500001210108010803218503212101412102A2 -:107760000121010901A100900000000000000000BB -:1077700000040011000000000000000000000000F4 -:107780000000000000000000000000000000008475 -:107790000208020000C00002020002020209020305 -:1077A0000200028202028201000002A082000202A4 -:1077B00002110283000002A002A04040821003A038 -:1077C000024002C0804002A002A04000020005006A -:1077D000820002000200028482A00200A0000200D7 -:1077E00082A002A002C0020400020000000000000B -:1077F000000000000008000000040000000000007D -:107800000000000000000000000000000000000078 -:10781000000040080000210002800100010000007B -:1078200041800000000000000000000000402040F7 -:1078300040002000004000000000000000030000A5 -:1078400000400004204000040041004100090040C5 -:1078500084C0000000004100200000008800A0005B -:1078600000000400A08000040204020000000000E8 -:107870000000000000000001000000010000000006 -:1078800000000000000010000000000000000000E8 -:1078900000080000000100002000000402000200B7 -:1078A0000000C004009000A000A0030800000091A8 -:1078B000890185048000408920040000208821007F -:1078C000009008A1000180050001000000A0200038 -:1078D00002910040208840820288028821A0200076 -:1078E000000840000408100400A18001A01000005E -:1078F0000000000000000000000000000000000583 -:107900000000000000000000000000030000000074 -:1079100000080000900800000080000090000000B7 -:1079200000000004000000000009200490A10000F5 -:10793000004000800000004100419088A04100808C -:1079400000400282401001212000908000904010F1 -:10795000004000030200000200050000008000213A -:1079600002A10204028000080002000000C000051D -:107970000200000000000000000000000000000005 -:107980000002000200A00000000000000000000053 -:107990000000000000A000A000A0004000020008BD -:1079A0002100200000010000090020000009200241 -:1079B000000000002104200203001188004005009F -:1079C00000401101004080002000218841402140FA -:1079D00080001191218885A0110011004100210231 -:1079E00020008002008380020008000121000002C4 -:1079F0001110000800000000000000000008000056 -:107A00000000000000000000000000030000000073 -:107A100000000000000000000000400000004000E6 -:107A20000008010000000000000000910221010098 -:107A300000000000000500002009000921040000EA -:107A400000114000880000210205200400210200EE -:107A500000830180012100214009029182218803D5 -:107A600000004041081102210004000404218209A1 -:107A7000000202850000000000000000000000007D +:1074800000000000000000000000000000005000AC +:1074900000555050000000000000000000000000F7 +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000010000000100000000000000000000009A +:1074F0000000200000000005000000000000000067 +:107500000000000000000000000440000005000032 +:107510000000010000000000000000000000000367 +:1075200005008800010000000000000020000000AD +:107530000000000000000000000000020000000049 +:107540000000000400000000000200000000000035 +:1075500000000020001100200000000000020000D8 +:107560000000040000000400000000000000000013 +:1075700000200000000000000000000000000000EB +:10758000000000000000000000000001800000007A +:1075900000000000400000000000000000000000AB +:1075A000000008000000040000400000000000008F +:1075B000100000000000400040000000000000003B +:1075C00000000000000008000000000000000000B3 +:1075D000000000000001080400010090000000000D +:1075E00000000080008000900020000000000000EB +:1075F0000000000000000000000000050000000086 +:107600000000000000000000000000400100000039 +:1076100002800000030003000300000000000200DD +:10762000000000000000000002200200000008002E +:107630000000020000000000020000000040000006 +:1076400000000000004000000000020000000000F8 +:10765000000002000000880001000200000000009D +:107660009000000000100020001000090000000041 +:10767000000000080000000000000000004000843E +:1076800000400008000000080000028400102008EC +:10769000008400020008C00004044010040004003C +:1076A00000080040000000000008000500880000FD +:1076B00000080000000000080008000402000008A4 +:1076C0000000008400000008000200000008020022 +:1076D000000200000000000200020800000000029A +:1076E000020000000000000500100000002000085B +:1076F00000410008000000080041000000000010E8 +:10770000000000080008000000000008000041021E +:107710000021000000000000900000000040000870 +:1077200000400005000400000008000000090000FF +:107730000000000000000000000000000000000049 +:107740001000000000000000000004000000000025 +:107750000400000000200000000000009000000075 +:10776000000000000000000000840088001000837A +:1077700000C0000800A000C00000000000A000C081 +:1077800000A0000000000000000000000000000851 +:10779000C001000000000000000000000008000020 +:1077A0000000009000040000000000000000000045 +:1077B00000080000000000000000000000000000C1 +:1077C00000000000000000000000000000000000B9 +:1077D0000000000020000200200000000000200047 +:1077E00000A0008800C002A000840000000000008B +:1077F0000000000000000000000000000000000089 +:1078000000000000000040000000004000000200F6 +:10781000000000090000010000000040880008008E +:107820000411000000000000000000000000000043 +:10783000000000000009000000000000000000003F +:107840000000000004000000000000000800080024 +:1078500000000000000000000000000000000040E8 +:107860000040000000000000000000000000008850 +:1078700000000000000000000000004000000000C8 +:1078800000000000000000000000000000000000F8 +:107890000000000000A00084400000000201000081 +:1078A00003008002410000002100000000000000F1 +:1078B00000000000001000000000000000000000B8 +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E00041000088000000000000000000000000CF +:1078F000000200000003000000000008000000007B +:107900000000000000000000000000000000000077 +:107910000000000000000041000000000000010025 +:10792000040001820040000300000000000000008D +:107930000000000000000041000000000000000006 +:107940000000000000000000000000000000000037 +:10795000000000000000000000000000080000001F +:1079600000000000000000000041000000000000D6 +:1079700000A008080010008400000084000000A09F +:1079800000000800000821080000000000000000BE +:1079900000000000000000000000000000000000E7 +:1079A00004A080000221020000000000000000008E +:1079B00000000000000000000000000000000000C7 +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000004000000000000A3 +:1079E00000000000008200A000A0110002C011846D +:1079F0001184000000210005004100210000000268 +:107A00004002000000110000000000000000000023 +:107A100000000000000000008800000088008800CE +:107A2000900001800008034000C00000000000003A +:107A300000400000000000000009000000090000F4 +:107A40000000000000000000000000000000000036 +:107A500000000000000000000000000082000000A4 +:107A60000000000000000000000000000000000016 +:107A700000001000000000000000000000000000F6 :107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 -:107AA000000000A010820084000000004008C00018 -:107AB00002C011C00000004000C02084000040044B -:107AC000000021828000400002008808C001000000 -:107AD000C0000004204002822000820002401120E9 -:107AE0000210020080882100A0C011000083000461 -:107AF00011000000A00400000000000000000000D1 -:107B000000009000000000000000000000000000E5 -:107B10000000000000000000000000000000010064 -:107B200000000000000003C000880004000001C045 -:107B3000018840000810000000C001000200001091 -:107B4000C0C0008800A0100008080002A00888A19A -:107B500002041010000882100308110208108202AB -:107B60000302040800821004C008000288C0A009B3 -:107B7000C1020008004008080000000000000000EA -:107B80000000000080000000000000000000000075 +:107A90000000000000000082000000000000000064 +:107AA0000000008204020090C0001140400010005D +:107AB000100000000000000800000000001000009E +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000000000000000096 +:107AF00000000000000000A00004009090020000C0 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000065 +:107B200011004001000010C0010190880008000011 +:107B30000000000000000000900000900088C0409D +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 +:107B6000000000000000000008A00000000010005D +:107B70000000000000000000008000800000808005 +:107B800000000000000000000000000000000000F5 :107B900000000000000000000000000000000000E5 -:107BA000110021000000000011802100008002006F -:107BB000118005008000800000000080400200006D -:107BC000001080800004000089028080040000A072 -:107BD000000880808080048080800880081000A0D9 -:107BE00080000900218000808000028000000040A9 -:107BF00000C0400404842080808300000000000056 -:107C00000000000200000011000000000000000061 +:107BA00004028809000300020080212100020080F5 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE000000000000000000000000880000000000D +:107BF00000000000000000000000800080118000F4 +:107C00000000000000000000000000000000000074 :107C10000000000000000000000000000000000064 -:107C2000000000410900000380800041094000037A -:107C3000808000410910804080800000000000002A -:107C4000110490020011000080048080800080C038 -:107C5000200040858040009100040080800008C121 -:107C6000A09080838000009109808480800005C0FE -:107C700040008085000303C08489808000000000EC -:107C800000000000000000000000000000000000F4 +:107C200000000000000009000900890011418540A2 +:107C3000910500000000000000000000000000416D +:107C40000004000000000000000000000000000030 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000008000001084 +:107C7000008000000000000000000000020002017F +:107C8000A000000000000000000000000000000054 :107C900000000000000000000000000000000000E4 -:107CA000000000000001A1000000C08800010101E7 -:107CB0000200C088008501010800C0880000900013 -:107CC00088000001C00090000200089110C0080068 -:107CD00084C01088C1C0080102C0900588C0080097 -:107CE00003C0401108C0080002C0C10808C0080055 -:107CF000C0C1A00408C0820002C1401008C000003A -:107D000000000000000000008800000001000000EA +:107CA00000000000008400000000000011A091010D +:107CB0001001C100000000000000000000000000F2 +:107CC000000000A000000000000000000000000014 +:107CD00000000000000000000000000000000000A4 +:107CE000000000000000000000000000000088000C +:107CF00000000040080000000000000000000088B4 +:107D000000000000208200000000000000000000D1 :107D10000000000000000000000000000000000063 -:107D200000000000000000008804001001A0001006 -:107D30008489000011C1C0088400001101C1000045 -:107D400002020108001182C000020308C0081002EC -:107D500011209103C009408203020208C01083026F -:107D600091080102C0831108C1100008C088820474 -:107D7000C1090103C0838208A102C008C0411108E3 -:107D800000000000000000000000000000000800EB +:107D2000000000000000000100000101000004004C +:107D30000105C10500C100000000000000000000B6 +:107D4000000800A0000808880000000000000000F3 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D70004002008800A000C00000000000000000D9 +:107D800000000000000000000000000000000000F3 :107D900000000000000000000000000000000000E3 -:107DA0000000000000000000000000000000410092 -:107DB00000098008001141C100918000004041C1CC -:107DC00000000080110300210090001009918080C4 -:107DD00004824180910380A1108241100091808033 -:107DE000C0824180110480A1118441840080800000 -:107DF000800241A0112080218082410000858040C6 -:107E000088000000000000000000000000000000EA +:107DA0000000000000000000002002210302000586 +:107DB00000001010212100C00000000000000000A1 +:107DC0000000000000800000000000000000000033 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000000000000000000000093 +:107DF0000000008000000000008000000000000083 +:107E000000000004000500800000000000000000E9 :107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000011400001 -:107E3000008080000011020000808000001100001E -:107E400000000000A1004000040008118000009024 -:107E500000000000842121108280901100008089A0 -:107E6000808080008421031141800411001180A1D1 -:107E70000080000221094009848082110040808036 -:107E800080008040000000000000000000000000B2 +:107E2000000000000000000000000821081103000D +:107E30000800A08004050400020900000000000002 +:107E400000000000804000008000000000000000F2 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E70000000000080400000000000000000000042 +:107E800000000000880000908282000000000000D6 :107E900000000000000000000000000000000000E2 -:107EA00000000000000000000000000000000011C1 -:107EB00001100010C000888900884010C000000533 -:107EC000101002000000C100830010100201C00069 -:107ED000880800C090000801020208088201020020 -:107EE0000808101008000801020320841001020095 -:107EF0000808C04004000500030240080801020011 -:107F00000808400408010000000000000000000014 -:107F100002E000000000000000000000000000007F -:107F20000000000000000000000000000000000051 -:107F300000E000008141000000E0000081410000FD -:107F400000E0000081410000820000E0000000002D -:107F5000000002E000008142600000E000004842B2 -:107F6000000000E000004842480000E000004842F5 -:107F70000000000000004842880000E00000484285 -:107F8000000000E000004842000000000000000087 +:107EA00000000000000000000000000001010001CF +:107EB00001000000C1408390918801010000000092 +:107EC00000000000000008004000900004000000D6 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000400888408829000000058 +:107F000000000000000000810000070000000000E9 +:107F10000000000000000000000000000000000061 +:107F200000000000000000000000000000008800C9 +:107F300000E0000000000011000007004100000008 +:107F400000000000000000000081000007000000A9 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000008100000700000079 +:107F800000000000000000000F0F0000C3C300004D :107F900000000000000000000000000000000000E1 :107FA00000000000000000000000000000000000D1 -:107FB0000000000000F0FFF000003CFF0000ACAC4F -:107FC00000003F3F0000FF3C00000000303F000089 -:107FD0003CF00000AA3CA020AFEFFFFBFFAABCBC16 -:107FE000FCBCAAACAA3CA020AFEFFFFBFFF0B0FFA7 -:107FF00030FFF0B2F0AA4FFF5FFF00A0FFAFCFFF4E -:108000008FFFAAAAAAF000708FFF000000000000F6 -:108010000000000000000000000000000000000060 +:107FB00000000000000000000000000000555050CC +:107FC00000000000000000000000554105413F3F57 +:107FD0003FBF0000000000000000000000000000A3 +:107FE0000000000000000000000000000000000091 +:107FF00000000000000000000000BED7BFD7A0BCFA +:10800000000000000000000000000F0FFFFFFFFF56 +:108010003C3C0000000000000000000000000000E8 :108020000000000000000000000000000000000050 -:1080300000000000000000F0FFF000003C00000025 -:10804000ACAC000030300000003C00000000303FCD -:1080500000003CF00000AA3C2020EFEF000800AA3E -:108060001C1C0C1CAAAAAA3C2020EFEF001000F058 -:10807000004F00CFF0F0F0AA00B000A000A8FFABC6 -:1080800000300070AAB2AAF00030CFFF000000005C -:1080900000000000000000000000000000000000E0 +:1080300000000000000000000000F0F000FF00550C +:10804000505000000000000000000000FFEBAFEB0C +:108050000F0F0FAF00000000000000000000000044 +:108060000000000000000000000000000000000010 +:10807000000000000000000000000000BED7FFFF6D +:10808000043CC3FF00000000000000003C053CF57C +:108090003C3C3C3C000000000000000000000000F0 :1080A00000000000000000000000000000000000D0 -:1080B000000000000000000055550000550F0000B2 -:1080C000FFAA0000FF3C00005555000000007D7D28 -:1080D00000000F0F0000550F00003D7D3D3D3C5559 -:1080E00035551F1F0B0B5F5F0A0AFFFA05003CFFA7 -:1080F000BFFFFFEBFFEA0FFFBFFFFFBA45000F55C1 -:108100005555FFABFFEBFF557555FEBEFEFE00005B -:10811000000000000000000000000000000000005F +:1080B0000000000000000000000000003030F0F080 +:1080C0000000AEAE00000000000000000000A2F3BF +:1080D000A2F300000000000000000000000000000B +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000FFFF82 +:108100000000FFFFFFFF00000000000000003C0532 +:108110003CF505AF05AF00000000000000000000C6 :10812000000000000000000000000000000000004F -:10813000000000000000000000000F0F0000550FBD -:10814000000055000000C3000000FF000000000018 -:10815000414100003C3C0000550F000038283838F1 -:108160003C5555555F1F0A0B4F0F0E0FFFEA1500C8 -:108170003C001000140015000F000100FFFA05007C -:108180000F554D5554001400005545550414040472 -:10819000000000000000000000650006000E200046 +:1081300000000000000000000000000000003030DF +:108140000000FF0000000000000000000000000030 +:10815000A2F3A2F3000000000000000000000000F5 +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:10818000FFFFFFFFFFFF7D7D0000000000000000FB +:1081900000000020000000000000000000000000BF :1081A00000000000000000000000000000000000CF -:1081B000000000000000000000400006002C120239 -:1081C00040C28006002C920240C28006002C92021F -:1081D000000040E380048029920240E78006002FDF -:1081E0003002406180048029100240618007002D28 -:1081F0001002406180048029100240618006002D39 -:108200001002406180048029100240618007002D27 -:108210001002000000000000000000000000AAAAF8 +:1081B000000000000000000000610004800D0000CD +:1081C0001061202E004D000500000000000000009E +:1081D000000000000020000000000000000000007F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:1082000000000000002000900000000000000000BE +:10821000000000000000000000000000000000005E :10822000000000000000000000000000000000004E -:108230000000000000000000000000000F0FFFFF22 -:10824000000000000F0FFFFF303F00005555AAAAA5 -:1082500000C300000FC30FC30000FFFF00000000B9 -:108260000F0FC3C3FC3CC000F0FFF5F50000000099 -:108270000F0FC3C3FFFF0000F0F0F0F0000000009C -:108280000000C3C3FCC03C00505F3C3C0000000049 -:10829000FF00FF00000000000000000000000000E0 -:1082A000AAAA00000000000000000000000000007A -:1082B00000000000000000000000000000000F0FA0 -:1082C0000000000000000F0F0000303F0000555577 -:1082D000AAAAFFC300000FFF0F000A5F0A5F000099 -:1082E00000000F0FC3C3FF3FC303000F05050000CD -:1082F00000000F0FC3C3033F033F00FF55550000AD -:108300000000FFFFC3C3FFC33F03505F3C3C0000BE -:1083100000000F0F0F0F0000000000000000000021 +:1082300000000000000000000000D7CF140C5535EE +:1082400055F528282828AA00AA00000000000000F0 +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B000000000000000000000000000D7CF140CF8 +:1082C000FFFFFFFF287D2878FFF5AAA0000000002F +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D :10832000000000000000000000000000000000004D :10833000000000000000000000000000000000003D -:108340000000F0F0000000000000F0F0000000006D -:108350000000F0F0000000007D417D41AAAA00FF6E -:1083600082BE82BE000000005C5C5C5CAA00AAFFCA -:1083700000000000000000005F505F50AAF0AAF06B -:1083800000000000FFAA55005C5C5C5CAAF0AAF04B -:1083900000C3FFC30F550F55000000000000000090 +:108340000080000000FF0A0F0A0F0100000000007B +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD :1083B00000000000000000000000000000000000BD -:1083C00000000000F0F0000000000000F0F00000ED -:1083D00000000000F0F0000000007D417D41AAAAED -:1083E00000FF82BE82BE000000005C5C5C5CAA00F4 -:1083F000AAFF00000000000000005F505F50AAF0DC -:10840000AAF000000000FFAA55005C5C5C5CAAF0CA -:10841000AAF000C3FFC30F550F5500000000000075 -:10842000000040000000000000000000000000000C -:1084300000004000000000000000000000000000FC -:10844000000020080000820000004000000000083A -:1084500000002005000001100000000304000100DE -:1084600000000002400300400000118020008480D2 -:108470000000008820000000881040800088000074 -:1084800000021002200000A000A020040490009030 -:108490000000000520000400000220000000000091 -:1084A00000000000000000020002000200020000C4 -:1084B00000000000000000000000000000000000BC -:1084C000000200000000000000000000009000001A -:1084D00000000088000040000400000000000000D0 -:1084E00004000000000900A00085000020040090A6 -:1084F00000020000001000840000000000200005C1 -:108500000000000100010300000500030001094113 -:108510000003000000040000000000010000000053 -:10852000000000000000000000000000000000004B -:108530000000000000000000000002000000000039 -:1085400085000000000000000000000000000000A6 -:108550000200000003000000000000000000000016 -:108560000000900000000000000800000000000073 -:108570008800000000000000000040000000000231 -:1085800000041004000000A00008001000100010FB -:10859000000021200588018400000000000801027D -:1085A00003000008000000000010000800080000A0 -:1085B000000000000010000000000000000800089B -:1085C0000000080800000000000400080208000085 -:1085D00003080000000002000000028400080008F8 -:1085E00000000000000800000000008400080008EF -:1085F00000000008000000820010000080840008D5 -:10860000008321018009000800050084000900C1E1 -:108610000001000888098202021100080008000415 -:10862000020100000000000000000008000000003F -:1086300000000000000000000000000000000041F9 -:108640000000000000000000000000080000000022 -:108650000000000000000000000020800000C100B9 -:1086600000030000004004800105000008040089A8 -:1086700001C0000000020002A02100210208000841 -:108680008800000308088820080290210404C00420 -:108690000000A0200083000900040240C003002164 -:1086A00000210002000000000000000000000000A7 -:1086B00000000000000000000000000000A0000812 +:1083C00000000000000000FF0000000000000000AE +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:108420000000000000000000000000000000040048 +:108430000000000000000000000400000000000038 +:108440000000000000000000000000030000000029 +:10845000000301000000010400000003010000000F +:10846000000000800000000000000000000000008C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000004000AC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000200000000000000000000BA +:1084C00000000000000000000000000000000000AC +:1084D0000004000020024000200000000000040012 +:1084E000000000000020000040400090400000001C +:1084F000000000000000000000000002000000007A +:108500000000000800000090000000900000000043 +:108510000000000000000000050200000000000054 +:108520000000000000000000000000000400000047 +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000900000009B +:1085500001400000000000000000200400000000B6 +:1085600004200000000000200000000002000000C5 +:1085700000000000000000000000000002000000F9 +:1085800000000000000000000000000000090000E2 +:108590000000000002000000000084000000040051 +:1085A00000100010000000080000000000000000A3 +:1085B00000000000030000000000001000080000A0 +:1085C0000088028800080208000000000000000087 +:1085D00000004001000000000000000080090000D1 +:1085E00000008001000000080009000000000000F9 +:1085F0000000000000000000000002000200000473 +:10860000000000000000000800080000000000005A +:108610000000000000000000000002000200000056 +:108620000000000820080008004100000800821037 +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:1086500000000000200000000000200000000000DA +:1086600000000000000000000000000900100021D0 +:1086700000090000000000000000000500000010DC +:108680000000000000000000000000000000880062 +:108690000000000000008800000000000000000052 +:1086A0009000000000840000000000C000000010E6 +:1086B00000000000000000000000000000000000BA :1086C00000000000000000000000000000000000AA -:1086D000000000000000000200A00008002000824E -:1086E00004000084000000828020088400A0800034 -:1086F0000010081100100010000800000010808415 -:108700000082030002820011000180010000841138 -:108710000001000000C100200000201180010000C5 -:108720000000000000100000000000000000000039 -:10873000000000000000000000000000040008002D -:1087400000000000000000000000000002008200A5 -:108750000000000000000000004101400080900087 -:1087600004080000000000002000001100000000CC -:108770000000000008100000000940210808001156 -:10878000400000009000C0001100000091C02004D3 -:10879000400500008200828508C109C10100010076 -:1087A0000041000308000005000000000000000078 +:1086D0000000000000000000000000020000000098 +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000008000000A00000002091 +:1087200000020088000000000000000000000000BF +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:10875000000020000000000400098800000500045B +:1087600000000000001000000000000000000000F9 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000040000D5 +:1087A00000000000000000000000000000000000C9 :1087B00000000000000000000000000000000000B9 :1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000020000002000000473 -:1087E0000000009000000000000000040040009025 -:1087F00000840804000480002000000404008000BD -:10880000000000A0000000000904900403004004E0 -:1088100000C111884004000800200010201004A0AE -:1088200002000090000400A0000000000000000012 -:108830000000000000000000000000000000000038 +:1087D000000000000000000009040000110000007B +:1087E00020012184030000000000000000000000C0 +:1087F0000000000400A00000000000400000000095 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:1088300000410000000000000000000000000000F7 :108840000000000000000000000000000000000028 -:1088500000000000000000009000A00000000000E8 -:1088600040000100000000A0004000000083000064 -:10887000A00801000089009008C121218221000880 -:108880000000A000008000808205028000C121005D -:108890004009010820000000A0200205082108006E -:1088A000002100A0C0404002A000C0100000000055 -:1088B000000000000084000000A000000000000094 +:108850000000000000000000000091080280A00855 +:1088600084002000A0000000040000000040000080 +:1088700000000009000000000000000000000000EF +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000310B5 +:1088B00000100000000000000000000000000000A8 :1088C00000000000000000000000000000000000A8 -:1088D000000000C000000000008400C00000000094 -:1088E00000A0808220000000000511100000001090 -:1088F000200200000400000203040010200000C059 -:10890000000000402000001011200000002008108E -:108910000410808804A00000000000010010800006 -:1089200080000000000300848000001000C00000F0 -:10893000000000000000000000000000000000082F +:1088D0000000000000000002008400004001204071 +:1088E0000801000200002100000000000000400418 +:1088F00000000000408800000000000000000000B0 +:108900000000000000000000000000000000000067 +:10891000000000000000000000000000000000084F +:1089200000000004000000000002008411A00040CC +:108930000000000000200004000000000000000013 :108940000000000000000000000000000000000027 -:1089500000000000000088000000004000000080CF -:1089600000000002000000040010040400000000E9 -:108970000020020400040010000000034010200446 -:1089800000204004000002000000002000410220FE -:1089900091410004214090009009000901210384C5 -:1089A0008204088940000205204000102021400870 +:1089500000000000000088000000840000002000EB +:10896000918000029000A000A000002100040000FF +:1089700000000005000000000000004000040000AE +:1089800000000000000000000000000000000040A7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 :1089B00000000000000000000000000000000000B7 :1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000000097 -:1089E000000800000000110000010000000000006D -:1089F00000000000000000000000000000008001F6 -:108A00000000030000020000218209820001000032 -:108A100041A110000000C08820000082402020906A -:108A20002002030588100302838400000000000078 +:1089D0000000000009000000000000820004000008 +:1089E00000000240090002004000000000022000D8 +:1089F0000000090005900300410000000000000095 +:108A00000000000000000000000000000000000066 +:108A10000000000000000000000000000000000056 +:108A20000000000000000000000000000000000046 :108A30000000000000000000000000000000000036 :108A40000000000000000000000000000000000026 -:108A5000000000A00088001000400000000000009E -:108A6000000001100004008804200084012188888F -:108A700000A1000000A0A110C0889004020889C0D5 -:108A800004A18200000083010201000100A0010096 -:108A90008288900402A08904034090824084009060 -:108AA000C002A002A0C110900082904110890090E5 -:108AB00082028808000000000000000000000000A2 +:108A50000000000000000000000000000000000016 +:108A600000000001C000010100010221080910827C +:108A700090090000088888040082000200000000BD +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 :108AC00000000000000000000000000000000000A6 -:108AD0000000000000800000000000000000000016 -:108AE000000000001100210000000000090003A1A7 -:108AF00000110040000000808380000080000080A2 -:108B0000020000A180110040412000050004008007 -:108B1000410000008000008003000400808000000D -:108B2000098020000000A0A10021101180204040F9 -:108B3000210500400083000000000000000000004C +:108AD0000000000000000000000000000000000096 +:108AE000000000000041000003110010801011A1DF +:108AF00000100003000000000080000000000000E3 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 :108B40000000000000000000000000000000000025 -:108B50000000000000000000002000800000000075 -:108B600000000000000000418908808300808080B0 -:108B7000C0009180210800001000091191000290AE -:108B800040008000A1800000108010001004A0832D -:108B9000100085118300410309088911A00241805A -:108BA00082080300100800001109C09009034083E7 -:108BB00020800903048040850000000000000000C0 +:108B50000000000000000000000000000000000015 +:108B6000000000000000118000001100C11008008A +:108B700008A0900021A00000000000088080800074 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 :108BC00000000000000000000000000000000000A5 -:108BD000000000000000000000000000000800008D -:108BE00000000000000000000201090308A0408806 -:108BF0000808090084100385000001100401A0008A -:108C0000840801900200A1A00000824090000201AF -:108C100009A100A00801A00011000000A001A1000E -:108C2000890410019088C0008288404003090082B6 -:108C300091110104000301A00008000000000000E1 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000490000100C1002F +:108BF000840288C1102089C1000090000801A002F1 +:108C000082000000000000000000000000000000E2 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 :108C40000000000000000000000000000000000024 -:108C50000000000000000000000084000000000090 -:108C6000000000000000000000004000889110108B -:108C7000414182000084048284A1000000010010B0 -:108C80000009100100100102008900C100000188E4 -:108C9000010900044000001010401001C002200033 -:108CA00090000001C090041010029002052103A161 -:108CB00010888220C01000890002111000000000FE +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000010100010100 +:108C70000101A1820088C0408884000000820000B9 +:108C8000008888880000000000000000000000004C +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 :108CC00000000000000000000000000000000000A4 :108CD0000000000000000000000000000000000094 -:108CE00000000000000000000000000080090040BB -:108CF00000024141000400210083008200000004C2 -:108D0000000400A1800200001109002100200002DF -:108D1000030320A111028008000500039105809142 -:108D200000210009034110850082000210098820FB -:108D300021824100050480901140110204100000BE +:108CE0000000000000000000000000000009030078 +:108CF0000909111141102005800004050000000041 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 :108D40000000000000000000000000000000000023 :108D50000000000000000000000000000000000013 -:108D6000000000000000000000000000000080047F -:108D70008091040000002009031109008400000014 -:108D8000029102009180400221000480040002113F -:108D900021032080208002400980048402210503F1 -:108DA000C089C000000009040080002000000040CD -:108DB000A1041010108009090421A1001000100363 +:108D6000000000000000000000000000000021845E +:108D700020000900101102859010808083000000FF +:108D800000058000008000000000000000000000DE +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 :108DC00000000000000000000000000000000000A3 :108DD0000000000000000000000000000000000093 -:108DE000100082001000840000000000000000005D -:108DF00010008821C01040000100A0820088890076 -:108E0000000010C00088084000000100100482002B -:108E10000001018800080040010111C04182018564 -:108E200000010341038800040001000800880002DB -:108E300000000582010441028300888382008900CA -:108E400041000000000000000000000000000000E1 +:108DE0000000000000000000000000000000000083 +:108DF0000189010000000001900202030284820048 +:108E000000000800A0900008200000000000000002 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 :108E50000000000000000000000000000000000012 :108E60000000000000000000000000000000000002 -:108E70000000000000E000008141842100E00700C4 -:108E800000000000000A000007008200500000E01F -:108E9000000000000000000000004100008200000F -:108EA00007004200000A00E007004100000000E067 -:108EB00007000000000000E00700000000000000C4 -:108EC0000000500000000000000000000000000052 +:108E70000000810000E000000000810000E0000030 +:108E800048420000008100000700000000000000D0 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 :108ED0000000000000000000000000000000000092 -:108EE000000000002040040200000000000000001C -:108EF000000000003F3FF90900F000FFE781E78133 -:108F0000F000F0FF0000FFFF0F0FF0FFF0FFF69002 -:108F1000F690F000F000000000000F0F00FFFFFFD0 -:108F200000FFF0FFF0FFFF00FFFFE7E7E7E70000CB -:108F30000000C300990F00000101018103C33C3C04 -:108F4000FF00990FC30000000000000000000000B7 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00002211000000003CFF66FF81C399FF0000B2 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 :108F50000000000000000000000000000000000011 -:108F60000000000000001080080100000000000068 -:108F70000000000000003030F90900F00000E78137 -:108F8000E781F000F0FF0000F0F00000F000F000DA -:108F9000F690F690F100F000000000000F0F00FFC7 -:108FA000FF000000F000F000FF0000002424242453 -:108FB00000000000C3FF990F0000000009990FFF97 -:108FC000F0F06666990FC3FF00000000000000008B +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F8000000100002211000000FF00FF81C399FFD3 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 :108FD0000000000000000000000000000000000091 :108FE0000000000000000000000000000000000081 :108FF0000000000000000000000000000000000071 @@ -157995,493 +157995,493 @@ :109030000000000000000000000000000000000030 :109040000000000000000000000000000000000020 :109050000000000000000000000000000000000010 -:1090600000000000000000000000FFFFFFF3000010 -:10907000000000000000000000003F3F3F3F9999C2 -:10908000FF00C387C381FFF300300000603CF93C60 -:109090000F0F0F0F000FF0FF0F660F6600000000AC -:1090A00000000000B4B4B4B4069F060600FF00FF41 -:1090B00060F9FFFFBCB08C80FFC300C30000080054 -:1090C000F3F391911CDF3CFF000000000000000062 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:10908000F0F000008214010802040000E1C1F9F9C7 +:10909000FF66FF6E000000000000000000000000FE +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 :1090D0000000000000000000000000000000000090 -:1090E000000000000000000000000000FFFFF3FF90 -:1090F0000000000000000000000000003F3F1B3F98 -:10910000C3C3F0F0C3E7C3E1FFDB00180000603C1D -:10911000F93C00FF9999000FF0FF0F660F66000001 -:109120000000800000002424BDBD069F9F9F3030BA -:10913000F3F360F90000BFB38F8399F099F09000CA -:109140000000FFFFFFFF3CFF3CFF000000000000AD +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:109100000000F0F082140000801040200000E1C157 +:10911000F9F9FF00FF0C0000000000000000000053 +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F :10915000000000000000000000000000000000000F :1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000040AF -:109180003006000C00010061402280050000000054 -:1091900000610026000D00008061000480090001CC -:1091A00000610006000D000000610026001D0000A7 -:1091B00000610027000D000005610A0F050D00A0E9 -:1091C00085615A0F051D00A000613006000D0000EA +:1091700000000000000000000000000000000020CF +:10918000000780011206006100028005080000004F +:1091900000000020000000000000000000000000AF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F :1091D000000000000000000000000000000000008F :1091E000000000000000000000000000000000007F :1091F000000000000000000000000000000000006F -:1092000000000F0FFFFF3CF010FB10FBDF8FD08042 -:1092100000008082A0AA3F3D0200FEC23E02F0F0A4 -:10922000F0F0FF1FFF1F00FF0043000400F40000E8 -:10923000AA00C300C3FFEB00A0A0000000000FC302 -:109240000055E3EB00000F0FC3C3E000EB00C300C9 -:10925000550F0000000000000000000000000000AA +:1092000000000000003CFFC3AA00AAAAEFEF000084 +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E +:10925000000000000000000000000000000000000E :1092600000000000000000000000000000000000FE :1092700000000000000000000000000000000000EE -:10928000000000000F0F00003CF000EB14FFFFFF98 -:1092900000000000C0C3F0FF3D3D0000FEC23E02E2 -:1092A000AAFF0055FF1FFFFF00FF005F0000000046 -:1092B0000010AA10C300C3FF2800A0A000000000F7 -:1092C0000FC3FF55F3FF00000F0FC3C3FF00FF00E4 -:1092D000C3FF550F00000000000000000000000068 +:10928000000034303434003CFFC3FF41FFFFEBEB00 +:10929000EBEB0000000000000000000000000000F8 +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000000000000000000000000000008E :1092E000000000000000000000000000000000007E :1092F000000000000000000000000000000000006E -:109300000000000000000000F0F000000CFC0CFC6D -:10931000FFF000F0000000000000DFDFDF555C5CC4 -:109320005C5CAA3CAA3CC3828283554105010000D3 -:109330000000F0FF3CA000000000AAA85455000067 -:109340000000283828380000C2FAAF82058280C0A9 -:10935000A0F0FF0FC3C300000000000000000000E9 +:109300000000000000000000C38228960DFF01FF4E +:10931000FFFF003F00000000000000000000000010 +:10932000000000000000000000000000000000003D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED -:1093800000000000000000000000F0F000000CFCF5 -:109390000CFCFFF000F000000000000000000000E6 -:1093A0005C5C5C5CAA3CAA3CC3C382C3FFC30F03E2 -:1093B000000000000FFF00A000000000AAAA555501 -:1093C0000000000000300030C2FAC2FAAFD705D763 -:1093D00082C3AAFFFFAAC3FF000000000000000034 -:1093E0000000000020000004000000000000000059 -:1093F000000000000000000040000000000002002B -:109400000000000020000000000001000200000039 -:109410000000000000000010000320000000000019 -:109420002000000040002000000084100010000018 -:109430000080000040080000000020850800008037 -:1094400004800000209084000080200000000000C4 -:1094500000808800200000000200000000000000E2 -:1094600000000000090000000000000000000000F3 -:1094700000000040000000000000000000000002AA -:1094800000000000000000000000000002000000DA -:10949000000040000000400000000000000000004C -:1094A00000000000000000080000000000000000B4 -:1094B00000000010001000000084000000108084F4 -:1094C0000004001005000010000000020008000069 -:1094D00000000010004000400000000000000000FC -:1094E00000000010000082000000001000000000DA -:1094F000000000000000000000000200000000006A -:109500000000000000000000000000000200000059 -:1095100000400040000000009000900000000000AB -:10952000000000000000000000000000001000002B -:109530000000000000000000000800100010008083 -:10954000000000000080000000000000001000008B -:1095500000000000000000000000004100000000CA -:1095600000000008000000000000000000C0000033 -:1095700000000000000000000000000000000000EB -:109580000000080800000000040000000000C00007 -:1095900004000401000100000000000000000000C1 -:1095A00000000000000800000000000000000000B3 -:1095B000000000000000040000000000000000881F -:1095C00000040000008400400000000800100008B3 -:1095D0000000008400840200000000080010001059 +:109380000000000000000808F7F73C3C00FF0DFF5C +:1093900001FFFFFF0030000000000000000000009F +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D +:1093E0000000000000000400000000000000000079 +:1093F000000000000000000000000000000000006D +:10940000000000000000200000000000000000003C +:1094100000000000000000000003000000000183C5 +:10942000010400000004000020000000000000040F +:109430000000000000000000000000000000000428 +:109440000400000000000000200000000002820074 +:109450000000000000050000000000000000000007 +:1094600000000000000000000000000000000000FC +:1094700000000000000000000004000000000000E8 +:1094800000000000080021000000000000000000B3 +:109490000000400000000004008400000002000002 +:1094A00010042040104000400000000000000000B8 +:1094B00000000000000000000000000400000000A8 +:1094C000000000040000000400040804000200047E +:1094D000000000040004000000040002000000007E +:1094E0000000040000000000000000000000000078 +:1094F000020000000000000000000000100000005A +:109500000000000000000000020000000004000055 +:10951000000000000000000000000000000000004B +:109520000009000400040400000000000000000026 +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:109550000200000002000000000000000000000007 +:10956000000804000008008404080008000000004F +:109570000000000002000010000800080008800041 +:1095800000080000000800000008000800000001BA +:10959000000000000300000804080508000800009F +:1095A000000004080001040911000408000800007C +:1095B0000000000400000000000400040004000497 +:1095C00000000004000000040000000400040090FB +:1095D0000000000000000000000000000000020089 :1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:109610000000000000000000004100000000000009 -:1096200000000000000020000010200000000000EA -:109630000000000000000000000500000000000322 -:1096400000080008081040000003004100410040ED -:1096500000050008000800050000000200400005A9 -:1096600000030000000000000000000000000000F7 -:1096700000000000000000000000000008000000E2 -:109680000000000000000000000000A000400020DA -:10969000110000000000000000A0000000C0000257 -:1096A0000002000000000000000000080088000820 -:1096B00002A0110000A00010000800A000A011A04E -:1096C00000A0008200A080A1A110000841080000B5 -:1096D0000000218400A000820002000221A041C0FD -:1096E00000A00002000000000000000000000000D8 -:1096F0000000000400000000000000000000000066 -:109700000000000000000000000000000000000059 -:109710000000000004000000000000000000000045 -:109720000000000000000010000000000000000029 -:109730000000000000002000000008084083000036 -:10974000A008904100002000000000410002A0118C -:109750000021400500000000010000000000002181 -:1097600000400000000000000000000000000000B9 +:1095F0000000000000000000000800000000000063 +:109600000000000000000000000000000200000355 +:1096100040000021000000000000000000002000C9 +:1096200000000240404000400404840000000000AC +:109630000008001000000000000000000000000012 +:109640000000000000000000000004000000000016 +:109650000000400000000000840000000400000042 +:1096600000000000000000000000001000000000EA +:1096700000000000000000000000000000000000EA +:1096800000000000000004000000000000000000D6 +:109690004000030004084000000000842000000295 +:1096A00000A0000040A18091000100010000000026 +:1096B00000000000000000000000000000000000AA +:1096C000000000000000000000000000000000009A +:1096D000000000000000000000000000000000008A +:1096E000000000000000000000000000000000007A +:1096F000000000000000000000000000000000006A +:109700000000000021040004000800082000000000 +:10971000008000002000008800840080000000001D +:109720000000000000000000000200000100000432 +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:109750000000000000000000000400000000000005 +:1097600000000010000000000000000000000000E9 :1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:109790000000000000000000000000000000400089 -:1097A00000000000000000000308000000000000AE -:1097B0000000008400A0000010C00084000000022F -:1097C000101040900000000000000010000000C0D9 -:1097D0000440004000A000000090108200000090B3 -:1097E00000000004000200C00000000000000000B3 +:10978000000000000000100100010001000121C0E4 +:109790000000004009000000000509050408400021 +:1097A000000000000090000000020001040010888A +:1097B00000C00000000000400000000000000000A9 +:1097C0000000000000000000000000000000000099 +:1097D0000000000000000000000000000000000089 +:1097E0000400000000000000000000000000000075 :1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:1098200000000000000000000000000000000080B8 -:1098300000800000000000000100000000000000A7 -:10984000000000000100000820C101000804000819 -:109850008200004100410841000000000000A0001B -:1098600000000008000000000005000000000000EB +:1098000000000000000000000000900000000000C8 +:10981000004002400000000582404000044000007B +:109820002040000000000005000000804100000012 +:1098300000000011000000000020000000000000F7 +:109840000000000000000000000000000000000018 +:109850000000000000000000000000000000000008 +:1098600000000000000000000000000000000000F8 :1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000010C8 -:10989000000000000000000000C002000010008472 -:1098A0000020000000000000000800000000000090 -:1098B000001020020000008400080808200000A01A -:1098C0000010008200000284008400022040A001F9 -:1098D000001000101100004020080040110020027C -:1098E000210800104084000803C0000800000000A8 -:1098F0000002000000000000000000000000000066 -:109900000000000000000000000000000000000057 -:109910000000000020000000000000000000000027 -:1099200000000080000000000002000000000000B5 -:109930000000000000000000000000000000000027 -:109940000208000000058800000820000041100007 -:1099500000218284090000210041400000004000F5 -:10996000000500100105004000020008000200028E +:1098800000000000000000000000000000000000D8 +:10989000000000050001000000001101000021018E +:1098A0000000410509884004049000000002C090B7 +:1098B000002005040000000000000020000000005F +:1098C0000000000000000000000000000000000098 +:1098D0000000000010000000000000000400000074 +:1098E00000000000000000000084000400000000F0 +:1098F0000000000000000000000000000000000068 +:1099000000000000000000000000000020000180B6 +:10991000010001002004000388050040C18001000F +:10992000010901400000C040004010400000010358 +:1099300000000000004000000040000000000000A7 +:109940000000000000000000000000000000000017 +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 :1099700000000000000000000000000000000000E7 :1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A0000000000004200000000000000000000093 -:1099B00000000000000000000000000000000000A7 -:1099C000000000000000000000002008000000006F -:1099D00003000000000420000000119011000000AE -:1099E000098200C000844008000000080000000058 +:1099900010082000200000C0000000000001100896 +:1099A00010C0101020A100000001000111010000F2 +:1099B0004000000200000001001000000000000054 +:1099C0000000000000000000000000000000000097 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 :1099F0000000000000000000000000000000000067 :109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A200000000490000000000000000000000000A2 -:109A30000000000084000000820000000000000020 +:109A1000010100010000000000C00008000000007B +:109A200000C100080101000000000008000000C0A3 +:109A30000000008382000801900000000000000088 :109A40000000000000000000000000000000000016 -:109A50000000C004001000A010C002A0008282908C -:109A60001090A090A010400482C0000000000000F0 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 :109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 -:109AA0000000000000800000000000000000000036 -:109AB0000000000000000000000080000000000026 +:109A90000000084111080941000900800000000091 +:109AA000000005C11121204000000000000000005E +:109AB000000000000041051100200010000000001F :109AC0000000000000000000000000000000000096 -:109AD00000000000800000000500000080800900F8 -:109AE00000000000890003808080800000000000EA +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B200000000000000000800040008000000000F5 -:109B30000000000000000000000000000000000025 -:109B40000000000080000000000000000000000095 -:109B50000000000000000409040984030000030061 -:109B600004028480C000000000218000000000008A +:109B10000000000002800800020041000000000078 +:109B200000008000208009000000410000000000CB +:109B30000000000000004100040020100583000028 +:109B40000000000000000000000000000000000015 +:109B50000000000000000000000000000000000005 +:109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 -:109BA000000000000000880000400001008200006A -:109BB00000000000000000000000000000000000A5 -:109BC00084000400000008000200C000A000C000E3 -:109BD00000000000000084000200A100A020A000FE -:109BE0008200A001A0020900A0008200A004C00021 +:109B900000000000000000080100000001000000BB +:109BA00000000000C00001040000000001080000E7 +:109BB0000008000008080000904000880001000331 +:109BC0000000000000000000000000000000000095 +:109BD0000000000000000000000000000000000085 +:109BE0000000000000000000000000000000000075 :109BF0000000000000000000000000000000000065 :109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 -:109C2000000000000000000000000000A090000004 -:109C30000000000000000000000000000004000020 -:109C40000002000000000000000000000000000111 -:109C50000100000000000001000000901010001042 -:109C60001182A00500040005A002C08300A00082AC -:109C7000A0C1000000000000000000000000000083 +:109C10000000000000000000000100000000000142 +:109C200000000008000000C000010108000000C1A1 +:109C30000000000882A000000000890001008501EA +:109C400001A1000000000000000000000000000072 +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 -:109C900000000000000000000000000000000000C4 -:109CA000000000000000000000000500000000802F -:109CB00000000000000000000000000000040000A0 -:109CC0000041000200000000000000000011000040 -:109CD00000040404000400210005040000000080CA -:109CE000008041000002000200A18009804000A124 -:109CF000008400410000000000000000000000009F +:109C90000000000000000000000000080009414131 +:109CA000004100000000000000800020092109029E +:109CB00000C105000000800000000000200808111D +:109CC000C0081008000000000000000000000000B4 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 :109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 -:109D200000000000000000000000000000118000A2 -:109D3000000000000000000000000000000000041F -:109D40000000000000000000000000000000000013 -:109D5000008000000000000400800000000080007F -:109D6000802180008000000000800000004000048E -:109D700000400000000000000000000000000000A3 +:109D10000000000000000000000000004189110068 +:109D2000110003000000000000000000C105110048 +:109D30004000094080000008800000000000412130 +:109D400009104100030300000000000000000000B3 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 :109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000001B2 -:109DB0002000000000000000000000000000000083 -:109DC0000001000000000000000000000000000092 -:109DD0000000008200A000000001008200A000003E -:109DE0000400108982049000104040C0908240011D -:109DF000A000A0210088000000000000000000007A +:109D900000000000000000000000000000000108BA +:109DA0000000000000000000000000088800C10260 +:109DB0000004890800000400000002A00000000068 +:109DC0009121000582000100000000000000000059 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 :109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E3000000000000700000000000000000000001B -:109E40000000000000000000000000000000000012 +:109E2000500000E000000000000000000000000002 +:109E3000500000E0000000000000000000000000F2 +:109E40000000500000E000000000000000000000E2 :109E50000000000000000000000000000000000002 -:109E60000000000000E0000081820000000000000F -:109E7000420000000000000042000000000000005E +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 :109E800000000000000000000000000000000000D2 :109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB000000000FF000000FF0000000000000000A4 -:109EC000000000000000000000000F0F0000000074 +:109EA00000000000000000000000C3C3C3C3FFFFA8 +:109EB0000F0FFFFF0F0FFFFF0F0F0F0FF0F00FF04F +:109EC0000FF000000F0FF0F00000FFFF0000000097 :109ED0000000000000000000000000000000000082 -:109EE00000000000CF450000CF004500000C00FC42 -:109EF0005541050100FFFF55004100000000000032 +:109EE0000000000000000000000000000000000072 +:109EF0000000000000000000000000000000000062 :109F00000000000000000000000000000000000051 :109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 -:109F30000000000000FF000000FF00000000000023 -:109F400000000000000000000000FFFF0F0F0000F5 +:109F2000000000000000000000000000C3C3C3C325 +:109F3000FFFF0F0FFFFF0F0FFFFF0F0F0F0FF0F0CF +:109F40000FF00FF000000F0FF0F0FFFF0000000017 :109F50000000000000000000000000000000000001 -:109F6000000000000000CF45CF45CFCF45450000A1 -:109F70000050FFC30F03FFFFFF5503410300000024 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 :109F800000000000000000000000000000000000D1 :109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 -:109FB0000000000000000000FF0000003C3C00002A -:109FC0000000000000000000000000000000000091 -:109FD00000000000F0F0C3C3000000005C5C000C57 -:109FE000000000000000555500000800E300F300E9 -:109FF000FFFF002BA200FF00B0B2F0F3010101004F +:109FA000000000000000000000000000000000FFB2 +:109FB000FFFF0000FFFF00FFFFFF555555553CC355 +:109FC0003CC3FFFF00000000FFFF0000969696963E +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000000000000061 :10A000000000000000000000000000000000000050 :10A010000000000000000000000000000000000040 :10A020000000000000000000000000000000000030 -:10A0300000000000000000000000FF0000003C3CA9 -:10A040000000000000000000000000000000000010 -:10A05000000000000000F0F0C3C30000000000009A -:10A06000000000000000AAAAFFFF00000800EB00AB -:10A07000FF00FFFF0003F300FF00BCBEFCFF010078 -:10A0800001000000000000000000000000000000CF +:10A0300000FFFFFFFFFFFFFF00FFFFFFAAAAAAAA82 +:10A040003CC33CC30000FFFF00000000FFFF9696EA +:10A0500096960000000000000000000000000000D4 +:10A0600000000000000000000000000000000000F0 +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000000D0 :10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B0000000000000000000000015002A0005401C -:10A0C00000A8000000000000000000000061000681 -:10A0D000000D00000000000000000000006100060C -:10A0E000000D000000610006000D00010061400746 -:10A0F000000D000000610006000D00000061000678 -:10A10000000D000000000000000000000000000042 +:10A0A000000000000000000000000000000180002F +:10A0B0000000400280000020920240828001802047 +:10A0C00090024000800000201002000040618006E5 +:10A0D00080210802000000000000000000000000D5 +:10A0E0000000000000000000000000000000000070 +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F :10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A150000000FF00C3C3000000000000000000007A -:10A160000000FF3CC300000000000FC30FC300004D -:10A170000000000000000000000000FF004300009D -:10A1800000003FC382C30000000000000000000088 +:10A1200000000000000000000000000041000101EC +:10A1300000C000C30000000000000000101050002C +:10A14000C0C000C000000000000000000000C3C349 +:10A1500038FAFFA0FF280000000000000000000007 +:10A1600000000000000000000000000000000000EF +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF :10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F -:10A1D00000000000FF00C3C30000000000000000FA -:10A1E00000000000FF3CC300000000000FC30FC3CD -:10A1F00000000000000000000000000000FF005F01 -:10A20000000000003FC382000000000000000000CA +:10A1A000000000000000000000000000000041006E +:10A1B000010100C0000000000000000000001010BD +:10A1C0005000000000C0000000000000000000007F +:10A1D000C0C03AFAFF00FF280000000000000000A5 +:10A1E000000000000000000000000000000000006F +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E :10A21000000000000000000000000000000000003E :10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000000000000FE +:10A23000F0003030000F0C0C0000000000000000A7 +:10A240005000F000828280800000000000000000CA +:10A250000000020040000A0A3E3E0000000000002C :10A2600000000000000000000000000000000000EE -:10A270000000000000003F033F03000000000F0546 -:10A2800003010000000000000000000000000000CA +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE :10A2900000000000000000000000000000000000BE :10A2A00000000000000000000000000000000000AE :10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E +:10A2C000000050000000000080800000000000003E +:10A2D000000000000200C0000A3E0A3E000000002C :10A2E000000000000000000000000000000000006E -:10A2F00000000000000000003F033F0300000000DA -:10A30000FF55C341000000000000000000000000F5 -:10A31000000000000000000000000000C00000007D -:10A320000000880020000000000000004000000045 -:10A3300000002000000000000000000020000000DD -:10A34000000000004000000000000000201000009D -:10A3500000002000000000000000000000000000DD -:10A360000400000000034005000000000000200081 -:10A3700000000000000000000000000900000000D4 -:10A38000400000100000000000000000000020005D -:10A390000000000800000000000000000000400075 -:10A3A00000000002000000000000000000000000AB -:10A3B000000000000000400000000000000000005D -:10A3C0004000000000000000008400000000400089 -:10A3D000000000000000000000000000000000007D -:10A3E00000000000000010000000008200000000DB -:10A3F0000000000000000000000000080000000055 -:10A40000000000000000000040000000000000000C -:10A41000000000000000000000000000000002003A +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000000000002D +:10A3300000000000000000000000000000002100FC +:10A340002000200400008800200020000000010000 +:10A3500084000100000300840000008488000000E5 +:10A3600000800004008000210080000000800000C8 +:10A3700000800000008000000000000000000000DD +:10A38000000000030080400000000000000000000A +:10A3900000000000000000000000000000000000BD +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000820080008000000000008000800000000B +:10A3D00004004000040000000021000000200000F4 +:10A3E00000000020000000200000002000000020ED +:10A3F00000000020000000200000400000000000DD +:10A40000000200040000000200000000000400043C +:10A41000000000020000000000000000000000003A :10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A440000000000000000000000004000000010007 -:10A4500000000200040001000000000000400000B5 -:10A460000500000090000000020000000000000055 -:10A4700001000000000002000100000000000000D8 -:10A480000200000900000000080000000041000078 -:10A4900003000000000000100200000000000000A7 -:10A4A00000000000000000000000040000000000A8 -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D0000200000000000000020000000000000078 -:10A4E0000000020000000000000080820000000068 -:10A4F0000000020000000000000002080000001040 -:10A50000000080100000000000008000000000003B -:10A5100000000200000000080000801000000000A1 +:10A430000000000000001000000000000400000008 +:10A44000000000000000020000000000000000000A +:10A4500000000000000000080000000000000000F4 +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000000000000000DC +:10A480000200040000000000000000000200820042 +:10A4900002000000000000000000000000000000BA +:10A4A00000000000000000000000000000000000AC +:10A4B0000000000000000000000800000000000094 +:10A4C0000000000000000000000000000400000088 +:10A4D0000800000000000000000800000000040068 +:10A4E000000000000000000000000000000000006C +:10A4F0000000000000000000000000080000000054 +:10A5000000840000000000000000000000000000C7 +:10A510000000000000000000000000080000000033 :10A52000000000000000000000000000000000002B :10A53000000000000000000000000000000000001B -:10A54000000000000000000000000000000090007B -:10A5500000000000000000000000000000000021DA -:10A5600000080021000500219003000000030021E5 -:10A570009010002100000021A01000100000C02158 -:10A5800000030021000500210008900000000021C8 -:10A590000003002100020021000000000041000033 +:10A5400000000000000000000000000000210000EA +:10A55000000000002000400000008400000090C1C6 +:10A560008800002088000021002100052000000054 +:10A570000003000000000011002100210000000085 +:10A580000000000500000002900200119000000091 +:10A59000000000099000000000080000000000001A :10A5A00000000000000000000000000000000000AB :10A5B000000000000000000000000000000000009B :10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E0000000000000A0000800000002008200C07F -:10A5F000000000000000001000000000410000000A -:10A60000000000000010000000840084210800C049 -:10A610000008001000C000010010008200C0000807 +:10A5D000000000000000000040004000098400006E +:10A5E00004040000000900000000000000A080003A +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000010001000009003F +:10A61000000000000000000000000000000000003A :10A62000000000000000000000000000000000002A :10A63000000000000000000000000000000000001A -:10A640000000000000000000000000000000080002 -:10A650000000000000000000A000000000008200D8 -:10A6600000000000000000000200080000000000E0 -:10A6700000000800000000040004000000000000CA -:10A68000080082000000000800000009000000002F -:10A6900000040800000000000000000000000000AE -:10A6A000000000000090000000000000000000001A +:10A640000004200020042000A00000000000010001 +:10A65000200000000000821100040000C000400043 +:10A660000000002020000091000000000000000019 +:10A67000000000000800000000000000C0000810FA +:10A6800000000000000000000000040004000000C2 +:10A6900000000000000000000000000000000000BA +:10A6A000004000000000000000000000000000006A :10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E00000000000000000000000000800A000C002 -:10A6F00000840000000000000000000002000000D4 -:10A70000000000000084000021A00090100400C0A0 -:10A71000000000100000000000A0008800A0001051 -:10A720000090000400000000000000000000000095 +:10A6C0000000000180008001800040000082000046 +:10A6D0002000A00420880200040000040000000004 +:10A6E0000000000000C18000002000880000000081 +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A7100000000084000000000000000003000300AF +:10A720000000000000000000000000000000000029 :10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000020000000000000000000D9 -:10A7600004000008000000000000000000030000DA -:10A7700000410021000000100010000582000010C0 -:10A780000241000000000000A0080000002100417C -:10A7900000000000820500020009004000100008CF -:10A7A00000000000000500000000000000000000A4 +:10A7400000000000000000000004000020000003E2 +:10A7500020102000002120000000C0100005000093 +:10A76000000000000000010000A101000100000045 +:10A7700008000800820000000003C00090000021D3 +:10A78000040000050000000082000000000000003E +:10A790000000001100000000002000000000000088 +:10A7A00000000000000000000000000000000000A9 :10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000008405 -:10A7D0000000000000080000000000000000000071 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000200000010000000000000000047 -:10A80000000000080000000000C000000008200850 -:10A81000008408002100000000000000000002A0E9 -:10A8200000840000000000000000000000020000A2 +:10A7C0000000000000000000001000C100008090A8 +:10A7D0000000800080000000800000000088110060 +:10A7E0000000008400000000209040042008208425 +:10A7F0004000000000000000000000000000000019 +:10A8000000008000000000000000000000000000C8 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 :10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000811000020000000BF -:10A860000000000400000021000000200000002182 -:10A870000005000000210000000500412003002128 -:10A880000021820002008811000000050021202123 -:10A89000000500030000000000040440010800213E -:10A8A00000080000000088112000000000000000E7 +:10A8400000000000000000002000000000000000E8 +:10A85000200020030000000020100009000000007C +:10A86000A0410000840900410000A0200000000475 +:10A870008204A000001100020802A00000000821CC +:10A880000800002100210000000000000000000579 +:10A8900008000000000000020000000000080000A6 +:10A8A00000080000000000000000000000000000A0 :10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000464 -:10A8F00000000084000000000004000000000000D0 -:10A9000000000000000000000084001000000000B3 -:10A9100000000000410000000000000000021000E4 -:10A9200000000010001000000900000400000000FA +:10A8C0000000000000000000000091C00088008827 +:10A8D0000000800080C0000000C0000400900088DC +:10A8E0000010000000000000000400000001000053 +:10A8F0000001000100000000000000000000000056 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000100000000000036 +:10A920000000000000000000000000100000000017 :10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A950000000000000000000000000000040008433 -:10A96000000200020002004000080208000088887F -:10A970000082000210100408008800080008C010BF -:10A98000008200A09010C0A00040000808100082C3 -:10A990000088000200080004008200C002101110AC -:10A9A00000820002C0A0849000200008100800006F +:10A940000000000000000000000000000100000006 +:10A950000000000000010400890000019182100441 +:10A9600010C0840402A0009000020082000009824E +:10A97000910800C0820500A000900808004000A0D7 +:10A9800000900002040000A00090000800000000F9 +:10A9900000000000000000000000100000000000A7 +:10A9A00000000000000000000000000000000000A7 :10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D00000000000000000000000000000000080F7 -:10A9E0000000000000000380008000800080000064 -:10A9F00000800080000080800080000000800080D7 -:10AA00009000008000800080800000800080800036 -:10AA100009000000000000800000008000000080AD -:10AA20008400218000000000000000000080808081 +:10A9C0000000000000000000000000000000110274 +:10A9D000091000410000001100101111000891023F +:10A9E00010A1001000008080008000000000000026 +:10A9F0001104032100058008008000808080000091 +:10AA00000080008000808000008000000080000046 +:10AA100000000000000000000000021000100020F4 +:10AA20000000000000000000000000000000000026 :10AA30000000000000000000000000000000000016 :10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA60000000001000820000800000210021800012 -:10AA7000000000000009000080000000004100808C -:10AA80008000000000210080000000008011802173 -:10AA900000000000802180800000000000208080F5 -:10AAA0000000000000410021000080000003008041 -:10AAB0008000000000000000000000000000000016 +:10AA500011001000100040410980000011408503E2 +:10AA6000880040A09100A0830000000080000080CA +:10AA70000000200004089100000010000000820087 +:10AA800011800000000080808000000080008000B5 +:10AA9000800000000000000000001180080010008D +:10AAA000210800000000000000000000000000007D +:10AAB0000000000000000000000000000000000096 :10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE00000000000000200A00000080000020011A9 -:10AAF000080000000000000202100804900010038B -:10AB000010A00800000088020208000202000802EB -:10AB1000080300000400100210A0A000900008022A -:10AB200010A088100000000200A100C00400100363 -:10AB300004A00884000000000000000000000000E5 +:10AAD00000000088000000000101201000000001BB +:10AAE000C10109A089C0912009C100000200A00095 +:10AAF00082900000009008010988A09001000200E7 +:10AB0000A040409010000000A01090000000020043 +:10AB1000A002900000000000000000000002010000 +:10AB20000000010000000000000000000000000024 +:10AB30000000000000000000000000000000000015 :10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB60000000000010880008000208020408000825 -:10AB7000000802080000C000002000020808C08889 -:10AB8000000000081008C00000200002020208882F -:10AB9000000800C00800081000100002C084200453 -:10ABA00000A000081100208800C00002C0A14000E1 -:10ABB0000020C00884080000000000000000000021 +:10AB500000000000000001010100000100000000F1 +:10AB60000000000105020003C109418302880002C0 +:10AB7000001000000000009001889021A1090288C7 +:10AB8000000300110102C0080008000010100202BA +:10AB90000002008802040000000000000000000124 +:10ABA00001000100000000000000000000000000A3 +:10ABB0000000000000000000000000000000000095 :10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE00000000000000000000080000000000000E5 -:10ABF0000000008000800000800000800000808055 -:10AC000080000000008090808000000000000000B4 -:10AC100080000000000080008000008000008000B4 -:10AC200000000000008009000011000400028041C3 -:10AC30008000008000800080000000000000000014 +:10ABD00000000000000000102010081000110011FB +:10ABE000091100040408C1801190A08511400000E3 +:10ABF0000000008000000000000408A0000511080B +:10AC00000002000300A111C08080008000008000CD +:10AC100080000000000080800000000000000000B4 +:10AC200000080809211100090000000000000000D0 +:10AC30000000000000000000000000000000000014 :10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000011000080008000D3 -:10AC70008000800080800000000000038000000051 -:10AC80000000000000800080800000000000000044 -:10AC90008000000080000080000080000000800034 -:10ACA0008000800000800000000000008000800024 -:10ACB0000000001100000080800000000000000083 +:10AC500000000000000000001004110011000000BE +:10AC60000080111103000808000410800280030016 +:10AC70000005008080000000000004859180200015 +:10AC800008080005008080800005800580800000A5 +:10AC9000000000050080808000000000000000002F +:10ACA000000040804000210005100000000000006E +:10ACB0000000000000000000000000000000000094 :10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE000000000000000000000009000A0004000F4 -:10ACF0000800100088020408880000008200880410 -:10AD000088024000820004084008A000840004106B -:10AD10002002A00082008810C01088000400820475 -:10AD20000402A0001000108210904000C000020039 -:10AD30000800040090008284C008A0000000000009 +:10ACD0000000000000000000000000020100000071 +:10ACE000000000C000010100010140034090908479 +:10ACF0004000100002C01002400000009040A10877 +:10AD000088C00901000002C0100888000200080283 +:10AD10000002900002008802040800000000000009 +:10AD20000000000000C00000010000010000000061 +:10AD30000000000000000000000000000000000013 :10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000410000000000000084000000FE -:10AD9000000000004200000000000000420000002F -:10ADA00000000000000A0000000000000000000099 -:10ADB0000000000000120000000000000000000081 +:10AD5000000000000000000000000000810000E092 +:10AD60000000000A820000E000008400810000E092 +:10AD70000000484200810000070088000000818137 +:10AD800000E007000000818100E0070088000081EA +:10AD900000000700410000810000070000000000E3 +:10ADA0000000000000000000000000004100000062 +:10ADB0000000000000000000000000000000000093 :10ADC0000000000000000000000000000000000083 :10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000FF3C28 -:10ADF000C30000F0003CB4B4B4B4FFF000000000A5 -:10AE0000B6BF262F00660000F0FFF0000066003C91 -:10AE10006060F9F966600099737043407E007E00BF -:10AE2000F0FF000F00FC000C3F3FF90900F300F3B6 -:10AE3000FBCB3B0BC399000FFFF00F00000FFF99F6 +:10ADE0000000000000000000000000000000000063 +:10ADF000000020041008030FC3FF839F839F0000FF +:10AE000066FF30FF3F0F3F0F89CF89CF030FC3FF8E +:10AE100000DBDBDB03030F0F009F9F9F030FC3FFCC +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 :10AE40000000000000000000000000000000000002 :10AE500000000000000000000000000000000000F2 :10AE600000000000000000000000000000000000E2 -:10AE7000B1B1B1B100F0003C66FF00990000003CA8 -:10AE80000000B0B92029000000F03C993C99006610 -:10AE9000003CE781E781666000007F7C4F4C0090BA -:10AEA00000903939393900FC000C3030F909003094 -:10AEB0000030F8C83808C399FF0F36363636FF0F12 -:10AEC000FF990000000000000000000000000000EA +:10AE70000000000140028001030FC3FF839F839FF6 +:10AE8000000000FF00FF6F0F0F0F89CF89CF030F66 +:10AE9000C3FF00DBDBDBC3C3FFFF009F9F9F030FEC +:10AEA000C3FF0000000000000000000000000000E0 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 :10AED0000000000000000000000000000000000072 :10AEE0000000000000000000000000000000000062 :10AEF0000000000000000000000000000000000052 @@ -158492,491 +158492,491 @@ :10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 :10AF600000000000000000000000000000000000E1 -:10AF700000000000FFFFCFFF00000000FF00EFEF28 -:10AF8000000000000000FFBFFFBF00000000FFFF47 -:10AF9000EFEFFF009999F0F0FFFF00000000FFFFC6 -:10AFA000BFBF81F381F3DFFFDFFFFFC300C3BDFF3E -:10AFB000FDFFF0C06040FFFF7F6F0000000066FFF4 -:10AFC00066FFC3C399990000000000000000000064 +:10AF70000000C3C3000082140500000500FF00FFAD +:10AF8000F606F6060000E3FF81999F9F9F9F00FF52 +:10AF900000FFF606F60600FF00FFC300FF3CFF6659 +:10AFA00000669900FF66000000000000000000003D +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 :10AFE0000000000000000000000000000000000061 -:10AFF0000000000000006666666600000000FF00BA -:10B00000FFFF3C3C66660000FFFF0000666600FF35 -:10B0100000FF00FFF0F0C3C3F0F0DBFF0F660F6628 -:10B02000FF00FF00BDF3BDF30000FFFFF099F099B2 -:10B0300024666466FFC3664200007F6F0000000064 -:10B0400026BF069FF0F0FF00000000000000000097 +:10AFF00000000000C3C382140000A00000A0FFFFF7 +:10B0000000C0F666F6060000E3FF81999F9FFF00EF +:10B01000FFFF00C0F666F606FFFF0090C300FFBD0D +:10B02000FF6660669900FFF6000000000000000067 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 :10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000300000000000A0 -:10B08000000030000000000100000000300000104F -:10B09000000100003000000000000000300000004F -:10B0A000000000003000000000010000300000003F -:10B0B0000000000030000000000000613006000DBC -:10B0C0000000000030000000000000000000000050 +:10B0600000000000000000000061000080010000FE +:10B0700000610000800112060061000080010800EC +:10B08000000000200000000000000061002080019E +:10B09000000100610026800900000000002000007F +:10B0A0000000000000200000000000000000000080 +:10B0B000000000610006000D00000000000000001C +:10B0C0000000000000000000000000000000000080 :10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F +:10B0E000000000000000000000005F5FFF0FF0F0B4 +:10B0F000F0F0FF17FF170AFA0CFC55555555F0F004 +:10B10000F0F0000000000000000000000F0FD71456 +:10B1100030F3F3F30000000030F230F300000000E1 :10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B14000C300C0000000000000000000000000007C +:10B1300000000000F0800000000000B000000000EF +:10B1400000000000000000000000000000000000FF :10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF +:10B160000000000000000000000000005050F0004F +:10B17000003CC3FF001700170AFA0CFC0F3C0F3C01 +:10B180000055AAFF000000000000000000000F0FA3 +:10B19000D71430F330300000000030F230F30000FC :10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C00000000000C00000000000000000000000BF +:10B1B000000000000000F0000000000000F00000AF +:10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E +:10B1E00000000000000000000000000000005555B5 +:10B1F000FF0F0000FFFFF5C5350528FF7DFFFFFFAE +:10B20000F5050000FFFF0000000000000000000046 +:10B210000F0FD7143A3F3A3F00000000FFAA3C2826 :10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E +:10B2300000000000000000000F4F0F4F0000C1C3CE :10B2400000000000000000000000000000000000FE :10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E +:10B270005555000F0CFC0CFCF5C5350528007D006C +:10B280000000F50530F330F300000000000000007E +:10B2900000000F0FD7143035303500000000FFAA32 +:10B2A0003C2800000000000000000000000000003A :10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D00000004000000000002000400000000000CE -:10B2E000200020000000400020002000000000009E -:10B2F00020042000000000000000200000000000EA -:10B3000020002000000000002000000000020000DB -:10B3100000090001040004000400000020000000F7 -:10B3200000002000200000000000000000000008D5 -:10B3300000000200200000000000000000000000EB -:10B3400000002000200800000000000000000008AD -:10B35000001000100000000000020000000040008B -:10B36000000000004000000200000000000000009B -:10B370000000000009000000000000004000000084 -:10B38000400000000000000000000000000040003D -:10B39000000000000000200000000000004010003D -:10B3A000400000000000100000000000000000004D -:10B3B000000200000000000000000000000000008B -:10B3C00040004000000040000000000000000000BD -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000200000000005B -:10B3F000000000000000000000000010001000002D -:10B400000000000000000000000004000000000038 -:10B410000200000000100000000000000000010019 -:10B42000000000000000001000000000000000000C -:10B4300000000000000001100000000000000100FA -:10B4400002000000000001000200000000000100F6 -:10B4500000000200000008000000000000000000E2 -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC -:10B4900000000400000000000000000000000000A8 -:10B4A000020000000000000000000000000000009A -:10B4B0000000000000000000020000000008000082 -:10B4C00002000000008400000200000000080000EC -:10B4D0000288001000100000910000000000000031 +:10B2C000C3C30000000000000000000000000000F8 +:10B2D00000000000000000000000000000008800E6 +:10B2E000000000000000000000000000000020003E +:10B2F000200000000000000000000000000020000E +:10B3000000081000000000000000012001082100DA +:10B310002000000300000000000000008800000082 +:10B320002008000800000000020040080000880813 +:10B33000200020000000004000080000008300857D +:10B340002085020500804085000400030080001174 +:10B350002091200400000000000000000000000018 +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000021000000AC +:10B38000000021000000000000000000200120005B +:10B39000200000000000000000000000000000008D +:10B3A000000000020000000000000000000040005B +:10B3B0000002000000000004008300000090000470 +:10B3C0000004000400000004020421010000000445 +:10B3D0000000A104809100000000000000000000B7 +:10B3E000000000000000000000000000000000005D +:10B3F00000000000000000000000A0000400900019 +:10B400000000000000000000000002000200208098 +:10B4100020002000000000000000000000000000EC +:10B4200000410000000000000000040000000000D7 +:10B430000000000000000000010000000000000902 +:10B440000000000401000080010082000000028072 +:10B450000100018000000000000000000400040062 +:10B4600000000000000000000000000004000000D8 +:10B4700000000400000000000000000000000000C8 +:10B4800000000000000002000000020000000000B8 +:10B490008004800080001100000000000000000017 +:10B4A000040000000000040002040000000000008E +:10B4B00004000400048400000000020400000000F6 +:10B4C0000000000800082008000420080008000010 +:10B4D0000004200020040000000000000000000024 :10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B510000000000000000000000000000000000823 -:10B52000000000000000000000000000000000001B -:10B5300000000008000000000000000000080000FB -:10B540000000000000210008000000000041004150 -:10B55000004100001041000300000000080000004E +:10B4F000000000000000000000000100000000004B +:10B500000000000020002000200004002000211086 +:10B51000214000050404040404000000C0000400ED +:10B5200040000000100000080000000000080000BB +:10B53000000000000000000000000000000000000B +:10B5400000000000000000090000000004000000EE +:10B5500000000000000000080008000800000000D3 :10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B590000000000000820000000000000000000029 -:10B5A00000C000000000000040100000030000A0E8 -:10B5B000008200000008000000A000000000100051 -:10B5C00008A000A00000100800000010000000000B -:10B5D000091000C000C00008000000000000820048 -:10B5E00000000000000082080000010000808208C6 -:10B5F000000001000080000000000000004010007A -:10B600000000000008000000000000000000000032 -:10B610000000080082000000000000000800000098 -:10B62000A000000002000000000000000000000078 -:10B6300082000000820008000000000000000000FE -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000001000020000004B5 -:10B670000001004020000004030000000000000062 -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A0000000000000C000000000000000000000DA -:10B6B000000000000000020000001000200000C098 -:10B6C0000082000000000800000000A00000000050 -:10B6D000000000C00000008400C00008000000005E -:10B6E00000000000000000009000000000000000CA -:10B6F00090000000000000000000000000000000BA -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B7200000000000000000000000002100200000D8 -:10B7300000000005000000000000000000080000FC -:10B7400000000000000000000021000508000000CB -:10B7500000410005000000000041C0410000000061 -:10B7600000000008000000000000000000000000D1 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000030000A0000000000090000076 -:10B7A00000000000000000000082000000A0000077 -:10B7B000000800042000000000080500000000C090 -:10B7C0000004000000000000000000A000000000D5 -:10B7D00000000584110200000088008400000500BC -:10B7E000000000000800000000000002000000004F -:10B7F0000200000000000000000000000000000047 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000080020 -:10B820000000000002000000000000000000000016 -:10B8300000000000001000110000000000000008DF -:10B8400000000000000000000000000000000400F4 -:10B85000000000000000004100000000000800415E -:10B860000004001100410041000000000000000041 -:10B870000040000000000000000000000000000088 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000200068 -:10B8C000200800000000000000000000004020A050 -:10B8D0000004008200002000008200000000000040 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000010000000000000001000000000046 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B9200000000000000000000000000090C00004C3 -:10B9300000044008000000000000000000000000BB -:10B9400000000000088884100082C0C0008200103F -:10B950000002080810100020008200A0118800C01A -:10B9600000088808C0C00084000400040000000033 -:10B970000000000011002100000000001100210063 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000800000000000000000000007 -:10B9C00000000000000000800080008000000000F7 -:10B9D0000080000080808080000000000000A080C7 -:10B9E00000000080008080000000000000000000D7 -:10B9F0000000000000000041090000030080004139 -:10BA000009000003008000000000000000000000AA -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000001180808000000000000000000075 -:10BA400000000000000000000000804000800000B6 -:10BA500000000003008000000000001100800000D2 -:10BA600080008040008080000000004000800000D6 -:10BA7000000000000000000000010100000000883C -:10BA8000000101000000008800000000000000002C -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB00000008400C00408A0040000000000000092 -:10BAC000000000000000000000000000100384825D -:10BAD00004000000000300A000020000000200A01B -:10BAE000000008001005004008000800900500A0B4 -:10BAF0008800000000000000000000008800000036 -:10BB000001000000880000000100000000000000AB -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000020C0004040040290000000000F -:10BB40000000000000000000000000000410008859 -:10BB500000000410900400040000101010880084FD -:10BB6000000004044000002004080408408800107D -:10BB70004004090400000000000000000000000074 -:10BB80000000410000000000000041000000000033 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000008000000000000005 -:10BBC00000000000000000000000000000000080F5 -:10BBD0000000000000800000000000008080800065 -:10BBE0000000000011008000000000800280800042 -:10BBF00000008000090000000000000000000000BC -:10BC00000011000004000000051100000000000009 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000800084 +:10B5700000000000000000000000000020000000AB +:10B580000000000000A0A1A0C1A0800000C08000B9 +:10B590008200A00021C0A1839101A120000000A091 +:10B5A000000000000000000000000000000000009B +:10B5B000000000000040000000000000004000000B +:10B5C000000000000200000000000000000000A0D9 +:10B5D00000200090000000000000000000000000BB +:10B5E000000000000000000000000000000000005B +:10B5F0000000000000000200020002000200020041 +:10B600000200200002000000020002000200000010 +:10B610000000000000104002000000410000000097 +:10B6200000000004000000400000040000000000D2 +:10B630000800000000000000000000000000000002 +:10B640008200000000000000010001002000010055 +:10B65000000003000900091000000000084000007D +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000008000800080008000CA +:10B680008010800080008004000080008000800026 +:10B690000900000000000000099000000000000008 +:10B6A00000000084000000000000030400400000CF +:10B6B000000000000000000000000000000000008A +:10B6C0000084030000000000000020002000800033 +:10B6D00020002100200020002000000000000000C9 +:10B6E0000800000000000000000000000000000052 +:10B6F000000000000000000000000000000000004A +:10B700000000000000000200200003000000000014 +:10B710000000888004030404C0000041040000000D +:10B72000000000000008000400000000000000000D +:10B730000000000000000000000000000000820087 +:10B740000000000082000000000000000000200057 +:10B750000000000020002000000200050000200082 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000080000C1 +:10B780000000000011000000800080A0A0A00000C8 +:10B79000000000841004001003010000008800A0D5 +:10B7A000400000000000110804040404048800089C +:10B7B0000084000040000000000000000040020083 +:10B7C000000000040204000000000000000000006F +:10B7D00080400488000280008000000004200000F7 +:10B7E00080000000000000000000000000000000D9 +:10B7F0000000000000000000000000000000000049 +:10B8000000000000000000842104008401000021E9 +:10B81000C000000000000200020300040202000554 +:10B8200000000000000000000008000400400000CC +:10B8300000040000000000000000000800000000FC +:10B8400000000000000000000000000000000040B8 +:10B85000080000000000C080A000004000000000C0 +:10B86000010000800000000800000000000000004F +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000004A00000042000F0 +:10B890000000000000000000800080000000800028 +:10B8A00041020000020000C0000000000000000093 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000041000000000037 +:10B8D0000000000000000000004000000000000028 +:10B8E0000000209008040304410000000000000054 +:10B8F0000000000000000000000000000000000048 +:10B90000000000C000000008000001C001000100AC +:10B91000A0C001C0000008C0000000C100840000F9 +:10B9200000010409419000000041000000000000F7 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B950000000000041C101000001000041C10100E0 +:10B960000001000041C101010001000100000000D0 +:10B9700000000000000000000000000000000000C7 +:10B980000000000000800000008000001189030416 +:10B990001141000011824009004100004091400522 +:10B9A0000011001000900290000900080000000043 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D000000000000000919108020009000391910D +:10B9E00003020009000591910810000900100000F1 +:10B9F0000000000000000000000000000000000047 +:10BA000000000000000000000000000080000900AD +:10BA10000400044085024000020011009140110022 +:10BA2000210011408800838008048800A1020000E2 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA50008000000000008000090011211111830303 +:10BA600009001021111190080900102111119010E6 +:10BA700000000000000000000000000000000000C6 +:10BA80000000000000000000000000000000C000F6 +:10BA9000880001000001C184000000000100C00016 +:10BAA000829000000001C10008C0050083409101A0 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000020000000000C00001880000010119 +:10BAE000C000014000000101C091010001000101FE +:10BAF000C101000000000000000000000000000084 +:10BB0000000000000000000000000000000800002D +:10BB100000C000000000000100C100C001000000E2 +:10BB200000C10000000000C000C104080002009134 +:10BB300008020000000000000000000000000000FB +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000100000000000000101D3 +:10BB6000000003C100000001000003C1000000014B +:10BB7000000103C100000000000000000000000000 +:10BB80000000000000000000000000000000008035 +:10BB90000000008000091004410800910002100913 +:10BBA000400000910009001141210091039009908B +:10BBB000038200840000000000000000000000007C +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000001055 +:10BBE000080900039191004000091010919100098B +:10BBF0000810000391910000000000000000000008 +:10BC000000000000000000000000000000008000B4 +:10BC100000000000000089040411040003088204ED +:10BC20000911088003088989111140000300C082AE +:10BC30009109110020080000000000000000000031 :10BC400000000000000000000000000000000000F4 -:10BC500000008000000000008000000000000000E4 -:10BC60000004800080008000000080800080800050 -:10BC70000020800000808000000000000000000024 -:10BC800000000001000001000000000100000000B1 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000088000488C004AC -:10BCC000A0000000000000000000000000000000D4 -:10BCD00000000400881020004000100040004000D8 -:10BCE00004009001200084000400820082080408FF -:10BCF000A000A00102001084080000000000000065 -:10BD00000000000000E000008141000000E00000B1 -:10BD10008141000000000000000000000000000061 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 +:10BC500000000000000000000000000000000000E4 +:10BC6000800011000280111180051100108009056B +:10BC70009005110908800900000000000000000084 +:10BC800000000000000000000000000000000000B4 +:10BC90000800000000880000C0010001C100010090 +:10BCA000C000040100080101C00800010000C1003B +:10BCB00091031108080000010000000000000000CE +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000C000010000840000C00001000084CA +:10BCF0000100C104010100840100000000000000F7 +:10BD00000000000000000000000000000000000033 +:10BD100000000000000000000000820000E00000C1 +:10BD20000000810000E000000000820000E0000050 +:10BD30000000818100E00700810000000000000099 :10BD400000000000000000000000000000000000F3 :10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD70000000000000000000000042000000000081 +:10BD600000000000480000E000000000810000E04A +:10BD700000000000810000E0000000000000000062 :10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB00000000000000000000000000000000FAACA -:10BDC0000FAAC317001700000000000000000000C9 -:10BDD000000000000000FFAA2D2D000000003C3CE8 -:10BDE000F0F03C3C00000C0CFCFC50501414050519 -:10BDF000F5F55000AAAAC3C300FF55FFC30F00000A +:10BD900000000000FFFF0000FFFF0F0FFFFF0F0F6D +:10BDA000FFFF0000FFFFFF00FFFFC3C3FFFFC3C390 +:10BDB000FFFFFF00AAAAAAAAA0E1B4F500000000B4 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000F0F0F0F00000FFFF0000AAAA000041 +:10BDF000FFFF0000AAAA0000FFFF0000AAAA00009F :10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000000000000022 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE4000FF3C003CFF173C17000000000000000012 -:10BE5000000000000000000055002D2D82823030CF -:10BE60005555FF00F0F0000005F505F5505014148D -:10BE70000CFC0CFC500000AAAAAAF0F055FFC30F5E +:10BE1000000000000000FFFF0000FFFF0F0FFFFF0A +:10BE20000F0FFFFFFFFFFFFFFF00FFFFC3C3FFFF79 +:10BE3000C3C3FFFFFF0000F0FFF0A0E1B4F5000076 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000F0F0F0F0000000000000AAAABE +:10BE7000000000000000AAAA000000000000AAAA1A :10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000FFEFFFFF000FF0FF00000000000088 -:10BED00000000000000000000000BFFFBFFF0000E6 -:10BEE0005F50DFFFFFFF00000000FFFFEFEF0000EB -:10BEF00000005555FFFFF0F0FFFFFFFF5555C3C38E -:10BF0000FFFF000000000000000000000000000033 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF40000000000055455555A3A3A3A30000000021 -:10BF50000000000000000000000000000000FFFFE3 -:10BF600000005F50DF00FF0000000000FF00FF0046 -:10BF7000000000000515AFBFC3C3AAAACFFF5555E7 -:10BF8000C0C0F0F00000000000000000004000060B -:10BF9000000C000000400006000C00000000000043 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000300000000000000041 +:10BE90000000000000000000F0F0FFFF0000FFFFC6 +:10BEA000C3C3FFFFC3C3FFFFF0F0FFFF0000FFFFAE +:10BEB00000FFFFFF3C3C00003C3C3C3CDFD01F103F +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000003C3C000055550000FFFF32 +:10BEF000000055550000FFFF000055550000FFFFF2 +:10BF00000000000000000000000000000000000031 +:10BF100000000000000000000000F0F0FFFFFFFF45 +:10BF2000FFFFC3C3FFFFC3C3FFFFF0F0FFFFFFFF2F +:10BF3000FFFF00FFFFFF3C3C00005555FF00DFD036 +:10BF40001F100000000000000000000000000000C2 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000003C3C000055550000AF +:10BF7000000000005555000000000000555500006D +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000040028000DF +:10BFA0000020920240E380008021920240E3800062 +:10BFB0008021920240E3800080218A0200610020FB +:10BFC00080050000000000000000000000000000EC :10BFD0000000000000000000000000000000000061 -:10BFE00030000010000100003000000000000000E0 -:10BFF00030000000000000003000001000000000D1 -:10C000003000000000000000000000000000000000 -:10C010003C3CFFFF00000000FF00FFFF00000000AD -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 +:10BFE000000000000000000000000020120240E3FA +:10BFF00080008021920240E380008021920240E391 +:10C00000800080219202000000000000000000007B +:10C010000000000000000000000000000000000020 +:10C020000000000000000FFF0F3CF0FCF3FFFF0FCB +:10C03000FF3CF8F8FBFB0F550F3CF0FCF3FF7D7D58 +:10C040007D0C3F3F3F0000000000000000000000AA :10C0500000000000000000000000000000000000E0 :10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000003C3C000000000000FF000000000029 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 +:10C07000CF0CCF0CF03CF03C7D2D7D2DC0FCFCFCAA +:10C080000F0F3C3C303F303F00000000000000003C +:10C0900000000000000000000000000000000000A0 +:10C0A00000000000000000000F000F3C000C030F18 +:10C0B000000F003C08080B0B0F550F3C000C030F42 +:10C0C0000C0C7D0C3F3FFF00000000000000000052 :10C0D0000000000000000000000000000000000060 :10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000F0F0000000000000F0F05F -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF +:10C0F000000055555555F000F0FF78287828C0C04D +:10C10000FCC0FF003C3C000FF0FF000000000000FE +:10C11000000000000000000000000000000000001F +:10C1200000000000000000000000FF55FF0F28F095 +:10C13000EBF0FF55FF0FA0AF3C3C3F303F3000F02D +:10C14000FFF0FF507C50FFFF30BA000000000000FD :10C1500000000000000000000000000000000000DF :10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C190000000000000000000F0F0000000000000BF -:10C1A000F0F00000000000000000000000000000AF -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F +:10C17000000000003F2B17033C3CA0F53F033F03AA +:10C1800014BEB4B4D70F140F0CFCFCFC000000006C +:10C19000000000000000000000000000000000009F +:10C1A0000000000000000000000000000055000F2B +:10C1B00028F0EBF00055000FA0AF3C3CFFF00F0063 +:10C1C0003CF03CF0D3505050FFFF303000000000F6 :10C1D000000000000000000000000000000000005F :10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C2000000000000000000000000000000004000EE -:10C2100000000000200020000000000020000000BE -:10C22000000020002000400000000000000084000A -:10C230000000000020002000000000002000880016 -:10C2400000000000020020000000000000000001CB -:10C25000200000000000200000000000000000009E -:10C2600020000000000000000000000000000000AE -:10C270004000000000002000000800000000000056 -:10C2800000000000000000000000000000000000AE -:10C290000000000000000000400000020002000258 -:10C2A000400200000000000000004000000000000C -:10C2B000200000000002000040000000000000001C -:10C2C000000000000000000000000000000000006E -:10C2D00000004000000000000000000000000040DE -:10C2E00000000000000000000000200040000000EE -:10C2F000000010000000000200020000000000002A -:10C3000000000000000000000000400040000000AD -:10C31000000000000000000000000000900000008D -:10C32000000000000000000000000000000000000D +:10C1F0000000000000003F2B17033C3CA0F53F3F30 +:10C20000030314BEB4B4D70F140F0CFC0C0C1000B5 +:10C21000000000000000000000000000020000001C +:10C2200000000000000000000000000000002000EE +:10C23000000000004000000000000000200000009E +:10C2400000000000000000000000000000030003E8 +:10C25000200000000000200000000000000020007E +:10C2600000000100000400000000000002040000C3 +:10C27000200000000000000000000000000020007E +:10C280000000000002000000888000820800030017 +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000020000000000008C +:10C2B00000000000000080000000000011000000ED +:10C2C00000000000000000000090000000C000001E +:10C2D000000000000000000000000000000000005E +:10C2E0000000000008000000000000000000000442 +:10C2F000000010000000000000000000000000002E +:10C30000000000000000000000000040004080002D +:10C310000800000000000000000000000000000015 +:10C320000008000000000000000000000000000005 :10C3300000000000000000000000000000000000FD -:10C3400000000000080000000000000000000000E5 +:10C3400002009000000000000000820000000000D9 :10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000050000000200C6 -:10C3700000000000000000000000050000000000B8 -:10C3800000000105000000000000000000000000A7 -:10C390000008000000000000000000000000000095 +:10C3600000000000001000000000000000030000BA +:10C3700000000000000000000000000000000000BD +:10C38000A000000000000000000000000200850086 +:10C39000000000000000000000000000000000009D :10C3A000000000000000000000000000000000008D -:10C3B0000000000004000000000000000000000079 -:10C3C000000000000000000000000000000000006D -:10C3D0000000000000000000000000000400000059 -:10C3E0000000000004000000000000000200000047 -:10C3F0000000000000000000004000840200000077 -:10C400000000000008000000000000100000000014 -:10C41000000000000000000000000000000000001C +:10C3B000000000000000000000000000000000007D +:10C3C000000000100000000000000000000000005D +:10C3D0000000000000000000040000000000000059 +:10C3E0000000020000000001040000000000000046 +:10C3F000000000000000000000000000000000003D +:10C4000000000000000000000000000000008000AC +:10C4100020000500050000000000000000000000F2 :10C42000000000000000000000000000000000000C :10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000400E8 -:10C450004000880000000000000000000000000014 -:10C4600000000000000000000000000000000000CC -:10C47000000000004000000000410000000000003B -:10C48000000088000000000000000000000800001C -:10C490000000000000000008000000000000000094 +:10C4400000000000000000000000000000000100EB +:10C450009000100000000000840090000000000028 +:10C46000900000000000000000000000000000003C +:10C47000004000400000000000000000000000003C +:10C48000000000000000A00000000000000000000C +:10C490000000000401900000000000000000000007 :10C4A000000000000000000000000000000000008C :10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D0000500000000000000000000000000000057 -:10C4E0000000000000000300000000000000000841 -:10C4F0000800000000000000000000000910040017 -:10C500000000000010000000000008000000000013 -:10C510000004000000000000000000000000000017 -:10C520000000000800000100008000000000000082 -:10C5300000000000000000000000100000000000EB -:10C5400000000000000000000000000000000800E3 -:10C550000800000000411000000000000000004042 -:10C56000000000000000000000000000A0400000EB -:10C570000000000000000000000000008200000039 -:10C58000000000000000000000000020004100004A -:10C59000000000000000000000000000000000009B -:10C5A0000000000000010000200000040000000066 -:10C5B0000000000000000000000000000000020079 +:10C4C000000000020000000000000000000000006A +:10C4D00008000000000000000000008800C000000C +:10C4E000000000000000000000000000000000004C +:10C4F000000000010001000000000000000000003A +:10C500000000000000A00000000000A000000000EB +:10C5100000200382000108110088000000000000D4 +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000040085200920400405000000000000C0 +:10C5600000000000000000000000000000000000CB +:10C57000000000000000008000000000000000003B +:10C5800000009000400000000000000000000000DB +:10C5900000000000900200400000000000000000C9 +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B :10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E00000000000000000000000000000000084C7 -:10C5F000000000C00000000000000000000000007B +:10C5D00000000000000280008000800000000004D5 +:10C5E000000000000000000000000000000040000B +:10C5F000000000000000000000200000000000001B :10C60000000000000000000000000000000000002A -:10C6100000000040000000000000000000000000DA -:10C62000000000009000000000000000000000007A +:10C6100000000000000021002100000021000000B7 +:10C62000000000000000000000000000000000000A :10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000800C2 -:10C6700000000000000000000010000000000000AA -:10C680000000000000000000000000000010004159 -:10C690000000000000000004000000000000000096 -:10C6A00000000000000000C000000000008400C086 -:10C6B00000000000008400000000000000000000F6 -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000010000000000000004A -:10C6E0000000000000080308030000000000000034 -:10C6F0000000000000000000000000000000000436 -:10C700000000000000000000100021000084000074 -:10C7100000081004000000400000400000840000F9 -:10C720000002000000000000000200000000000005 -:10C7300000000000000000020000000000000002F5 +:10C640000000000000000000000000000000880062 +:10C65000000000000000000088000400000000004E +:10C660000041000000000000840082000200000081 +:10C67000080008000005C005000404400020002058 +:10C6800000000000000000000000000000000000AA +:10C69000000000000000820000000000098000008F +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000C00000000000C0FA +:10C6C0000000000000000088402000000000000082 +:10C6D00000000000400040200088000480020900A3 +:10C6E00000000004000000000000000000008000C6 +:10C6F00000008000800000000000000180010001B7 +:10C70000000100840000000000000000000000A004 +:10C71000004000000000200000840300000008101A +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 :10C7400000000000000000000000000000000000E9 :10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000008000000C1 -:10C7700000000000000000000000000000100000A9 -:10C78000000200000800000000000000000000009F -:10C7900000410004004100400000000000000000D3 -:10C7A0000000000000000000000000000000000089 +:10C76000000000000040C0000000002000000000A9 +:10C770000000000040000000004000030000000036 +:10C780000008002000000000000008000011000068 +:10C7900000000000400040000000400000000000D9 +:10C7A0000000000300000000000000000000000086 :10C7B0000000000000000000000000000000000079 -:10C7C0000200000000000000000000000000000067 -:10C7D0000000000000000040000000000000000019 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000090009039 +:10C7E00000000000000040C0000020000000000029 +:10C7F0000000000000000000000000010000000038 +:10C800000000200100010000000000000000000006 :10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000010007 +:10C820000000000000000000000000000000000008 :10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C87000000000000000000008C00040001020047C -:10C880000000000000000000C08810820082C00884 -:10C8900000C00088000400840000000000000000C8 -:10C8A0000000000000000000000000000000000088 -:10C8B0001100210000000000000000000000000046 -:10C8C0000000000000000000000000000000000068 +:10C840000000000000000000010084000000000063 +:10C85000000000000000000000000000000008C10F +:10C860002088008502210000000000000000000078 +:10C8700020C00004000090400002001000100004DE +:10C880008989A010000202030000000000000000DF +:10C890000000000000000000000000000000000098 +:10C8A000C00040000201C0010000000000000000C4 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000041000000000027 :10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F00000000000000000000000800000800080B8 -:10C900000000000000000000000080808000008027 -:10C910000080110000000000000000000000000086 -:10C920000000000000000000000000000000000007 -:10C93000000000410900000300800000000000002A +:10C8E000A0C10021008380200000000000000000A3 +:10C8F00000000080008000000000008000000000B8 +:10C90000000091C1801000C1808300000000000081 +:10C910000000000000000000000000000000000017 +:10C9200000008500A105800200200000000000003A +:10C9300000000000000000000000000000000000F7 :10C9400000000000000000000000000000000000E7 :10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000080000041F6 -:10C9800000210000000000000000000080000011F5 -:10C9900080048000800080210080000000000000F2 -:10C9A0000000000000000000000000000000000087 -:10C9B00000000000000101000000008800000000ED +:10C960000000040008009140830300000000000064 +:10C9700000000000000080000000800000000011A6 +:10C9800000800000808000008000808300000000A4 +:10C990000000000000000000000000000000000097 +:10C9A00000000000800020002021C0830000000063 +:10C9B0000000000000000000000000000000000077 :10C9C0000000000000000000000000000000000067 :10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F000000000000000000000000000000008002F -:10CA0000A0030085040000000000000000004000BA -:10CA1000A004081108000800100420A01000000065 -:10CA20000000000000000000000000000000000006 -:10CA3000000000000000000088000000010000006D -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA80004090004004008504000000000000000009 -:10CA9000C09000820000C008208400A0000405842B -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000410035 +:10C9E00000000000838808001191900800000000FA +:10C9F000000000000000000010000240C000000025 +:10CA0000000000880000028810008400C090000030 +:10CA10000000000000000000000000000000000016 +:10CA200000000000000088401100C101C1A1000009 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000001E5 +:10CA500000010000000100000000000000000000D4 +:10CA6000000000000000200401A000900308000066 +:10CA7000000000000000000002900000000808C054 +:10CA8000020000000000820040100002919002C0ED +:10CA90000000000000000000000000000000000096 +:10CAA000000000000000000000890111008501C0A5 +:10CAB0000000000000000000000000000000000076 :10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000800000800000210000000000000004 -:10CB10000000000000800000A08000000000000075 -:10CB200009000000000000000000000000000000FC -:10CB300000000000000000000000000040110000A4 +:10CAD0000020004000410040000000000000000075 +:10CAE00000000000000000000000088008808900AD +:10CAF00000000000000000000000000000000080B6 +:10CB0000808080000000000080008000008089801C +:10CB10008080000000000000000000000000000015 +:10CB2000000000000000000000000021118200A1B0 +:10CB3000048500000000000000000000000000006C :10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB800000000000000080008000000000000000A5 -:10CB90000000000000008000000000000010008085 -:10CBA0000080000000000000000000000000000005 -:10CBB0000000000000000000000000000000010173 +:10CB500000000004000000000000000000000000D1 +:10CB6000000000000000000000000840911103894F +:10CB70000005000000000000000000008000000030 +:10CB8000000080008002801180000000000503800A +:10CB90001100030000000000000000000000000081 +:10CBA00000000000000000000000000010021180E2 +:10CBB00000800802000000000000000000000000EB :10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC0000000000000000C00002A08400040000003A -:10CC100000000000000082008888C000C000C00141 -:10CC2000C0208284400000000000000000000000DE -:10CC300000000000000000000000000000000000F4 -:10CC400000E0000081410000000000000000000042 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 -:10CC80000000000000000000000000000000420062 -:10CC90000000000000000000000000000000421240 +:10CBD0000000000000010000000000000000000054 +:10CBE000000000000000000000000000880520098F +:10CBF0000985880100000000000000000000C0005E +:10CC0000102008201000C001A000100088000000C3 +:10CC1000008801000000000000000000000000008B +:10CC20000000000000000000000000000000010102 +:10CC300001080010010100000000000000000000D9 +:10CC400000000000000000000000000000000000E4 +:10CC50000000000000000000000000005000000084 +:10CC60000000000000000000000000000000821131 +:10CC700000E00700000000000000000000000000CD +:10CC8000000000000000000000810000070000001C +:10CC9000818100E0070000000000000000000000AB :10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 +:10CCB000810000E00000880000000000000000008B :10CCC0000000000000000000000000000000000064 :10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD0000000000000000000000003C00272706068D -:10CD1000080800000000000000003F3F030390905F -:10CD200000003CFFF099003C00F000000000000013 -:10CD300000000000000000000000000000000000F3 +:10CCF00000660030F0F0F0F00000000000000000DE +:10CD00000000A0051D182442420060001424000009 +:10CD10000000000000001C201414000000000000AF +:10CD20000000000000000000000000000000000003 +:10CD3000000000000000FF00F39900000000000068 :10CD400000000000000000000000000000000000E3 :10CD500000000000000000000000000000000000D3 :10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD8000000000000000000000000000FFC3272793 -:10CD9000000008080000000000000000E724E7246D -:10CDA000000018183C00F099003C00F00000000062 -:10CDB0000000000000000000000000000000000073 +:10CD7000000000660030F4F4FFF000000000000046 +:10CD800000000000A0051D181881E766000024249B +:10CD900000000000000000003C002424000000000F +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000099990000000041 :10CDC0000000000000000000000000000000000063 :10CDD0000000000000000000000000000000000053 :10CDE0000000000000000000000000000000000043 @@ -158988,231 +158988,231 @@ :10CE400000000000000000000000000000000000E2 :10CE500000000000000000000000000000000000D2 :10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE9000FF00FFFF27270000000000000000000047 -:10CEA000F7FF070FF0FFC399FFDFFFFFFF99C38173 +:10CE700000000000000060003000FFFFFFFF000026 +:10CE80000000000000000000E74218240909009695 +:10CE900000008101000000000066006A0A0A040B1D +:10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 :10CEC0000000000000000000000000000000000062 :10CED0000000000000000000000000000000000052 :10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000FF00FDFD27270000000000000000CA -:10CF20000000FFFF0F0FF0FFC39966466666F090A2 -:10CF3000C0800000000000000000000000000000B1 -:10CF40000000000000000000000000400006000C8F +:10CEF0000000000000000000000000000008909802 +:10CF00000000000000000000000066008142099F50 +:10CF100096008101C30300000000006600660A0A53 +:10CF2000040B0000000000000000000000000000F2 +:10CF30000000000000000000000000000000990058 +:10CF400001000000000000000000000000000000E0 :10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000003000000000000000000061 -:10CFA0000000000000003000001000010000300010 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000FF0062 -:10CFD000FFFF000000000000000000000000000053 +:10CF6000000000610006000D00000000000000004D +:10CF70000000000000000000000000615024800557 +:10CF800000000000000000000000000060820000BF +:10CF900000008A0010000020000000000021002294 +:10CFA000804D0008000000000000000000000000AC +:10CFB000000000000000000000000000006100040C +:10CFC000809D00050000000000000000000000003F +:10CFD0000000000000000000000000000000000051 :10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 +:10CFF000000000000000000000000000AAAAAAAA89 :10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D05000FF000000000000000000000000000000D1 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 +:10D01000000000000000000000000000000004000C +:10D0200004000000000000000000000000000000FC +:10D030000000000000000000000000000000BEBE74 +:10D0400014140000000000000000000000000000B8 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000010000000000BF +:10D07000000000000000000000000000000000AA06 +:10D080000A0A00000000000000000000000000008C :10D090000000000000000000000000000000000090 :10D0A0000000000000000000000000000000000080 :10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D00000000000F0F00000000000000000000070 +:10D0C000FFAA55000008000000000000000000005A +:10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F +:10D1000000000000BABFAAAA000000000000000052 :10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF +:10D1200000003F00C30000000000000000000000FD :10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D15000000000000000F0F00000000000000000EF +:10D14000000000400040050000000000000000005A +:10D1500000000000000000000000000000000000CF :10D1600000000000000000000000000000000000BF :10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F +:10D18000000082000A00AAAFAAAA00000000000066 :10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F +:10D1A000000000000F003C00000000000000000034 :10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D00000002000400000000000000000000000EF -:10D1E00000000000400000000000000000000000FF -:10D1F00000002000200000000000100400000000DB -:10D200000000880000000000000000000000100086 -:10D2100000000000200000000000000000000000EE -:10D2200000000000200000000000000000001000CE -:10D2300000000000200000000000000000000000CE -:10D24000000000002000000000000000000040007E -:10D25000000040000000000000000000000020006E -:10D26000000000000000200000004000000000005E -:10D270000000000200000000100000040000000098 -:10D28000000000000002200040000000000000003C -:10D29000000000000000000020000000000000006E -:10D2A00010000000000000001000400040000000DE -:10D2B00040000000000000004000000000000000EE -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000001000000000000000002E -:10D2F000000000000000000000000000000000101E -:10D3000000400000000000000000000000000000DD -:10D3100000000000000000000000000904000009F7 -:10D3200000100000000000000000000000000000ED -:10D3300000000000000000000000000000000000ED -:10D3400004000000000000000000000000000000D9 +:10D1C00000000000004000400500000000000000DA +:10D1D000000000000000000000000000000000004F +:10D1E000000004000000000000002000000000001B +:10D1F000000000000000000000000000000000002F +:10D20000000020000000000000002000000300805B +:10D21000000000800084000000000000000000000A +:10D2200000000000000000000000000020040000DA +:10D2300000000000040500000000000400040002DB +:10D240000000000200000000210220002000000079 +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000200BC +:10D27000000400000000000000000000000000901A +:10D28000009000000000210000000090000000005D +:10D290000004000000020305080000000000000474 +:10D2A000000000000000000000000000000000017D +:10D2B00000001000000000020000000000000090CC +:10D2C00000400002000000000002A0008000800278 +:10D2D000000000000000020000000000000000004C +:10D2E000000000000200000000000000000000003C +:10D2F0000000000004000000000000000200000028 +:10D300000000000000000000900000008200040007 +:10D3100000002083820040000004000000000000A4 +:10D3200000000000000000000000000000004000BD +:10D3300004000000000000000000000000000000E9 +:10D340000000000002000000020000000000820057 :10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000005000000A8 +:10D3600000000000000004000000000000000000B9 +:10D3700000000000000000000000000004000000A9 :10D38000000000000000000000000000000000009D -:10D39000001000000000000000000000000000007D -:10D3A0000000000000000000000004000000000079 -:10D3B000000000000000000000000000000000006D -:10D3C0000000000000000000000004000000000059 -:10D3D0000000040000000000000000000000000049 +:10D390000000000080040400800000010200000082 +:10D3A000000000000000000000000000000000007D +:10D3B00080000000000000000000000000000400E9 +:10D3C000000000000000000000000000000000005D +:10D3D0000400000000000000000000000000000049 :10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D42000040000000400000000000000000088006C -:10D4300000000400000000000000000000000000E8 -:10D4400000000000000000000000000000000200DA -:10D4500000000000000000000000000000000000CC +:10D3F00000000000000000000000000040000000ED +:10D4000040000400000000000000000000000000D8 +:10D410004000400000008500000040804000000007 +:10D42000000000009000002000200000000000002C +:10D4300000000000020002080000000000210208B5 +:10D4400000000000000000000000100000080000C4 +:10D45000008020002000000000000000000000000C :10D4600000000000000000000000000000000000BC :10D4700000000000000000000000000000000000AC -:10D480000000000000000400000000000000000098 -:10D49000000000000000000000000000000000008C -:10D4A0000000000000000800000000000000000074 -:10D4B0000000000000000400210000004000000007 -:10D4C00000000088000000000000000000020000D2 -:10D4D000000000000000000000000000000000004C -:10D4E0000000000000000000000000000000080034 -:10D4F00000000000000000000000000000008200AA -:10D50000000000000000000000000000000000001B -:10D51000000000000040004000000000000000008B -:10D5200000000000000000410000000000000000BA -:10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB -:10D5500000000005000000000000000000000000C6 +:10D4800000000000000040004020000040000500B7 +:10D49000000000000000000010000000900210409A +:10D4A0000000000000000000000000C000000000BC +:10D4B00000A00010000000000008000000000000B4 +:10D4C000000000000000000000000000000000005C +:10D4D0000000000480008000000000000000000048 +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D5000000000000000000000000C0000000000457 +:10D5100000100000200020000000000000090000B2 +:10D5200000000000000000000000000000000000FB +:10D5300000100002000000200000000000000000B9 +:10D54000002100200000000000000000000000009A +:10D5500000040000000000000800000000000000BF :10D5600000000000000000000000000000000000BB -:10D5700000000000000000000200000000000000A9 -:10D580000000000000000000000000000000090092 -:10D59000000000000000000000000000000000008B +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000800080000000000000008B :10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B +:10D5B0000000040000000000000000000000000067 :10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B :10D5E000000000000000000000000000000000003B :10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A +:10D60000000000000000000040000000400000009A +:10D610000000040040002000000000000000002086 :10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA +:10D6300000000000080000000000000000000000E2 :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA -:10D660000000000000C00000000000840000000076 -:10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D690000000000000000000040000000000000086 -:10D6A000000000000000000000000000000000007A -:10D6B0000000000000000500000000000000000065 -:10D6C00008000000000805000200000000C0000083 -:10D6D000000000000000000000000000000000004A +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000008A2 +:10D68000000000000000000000000000000000C0DA +:10D69000000000000400C084098210900000000017 +:10D6A00000A000A000000000000000000300030034 +:10D6B00000A00000000000000000000000000000CA +:10D6C000000000000000000000000000000000005A +:10D6D0000000000000000000210800080000000019 :10D6E000000000000000000000000000000000003A -:10D6F0000000000000020000000000000000000028 +:10D6F000000000000000000000000000000000002A :10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 -:10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000100000000000D9 +:10D7100000000000000000002000000000000000E9 +:10D7200000000021001100000000000000000000C7 +:10D7300000200000000000000000000000000000C9 :10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000000C9 -:10D760000000000000000000000020000040000059 -:10D7700000200004000000100500000000880000E8 -:10D780002008000000000000000000000000000071 -:10D790000000000000000000000000000000000089 -:10D7A00000000000000000000000000000C00000B9 -:10D7B00000C00000000000000000000000000000A9 +:10D7500000000400000000000000000000000000C5 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000100000090070 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 :10D7E0000000000000000000000000000000000039 :10D7F0000000000000000000000000000000000029 :10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D8200000000000000000000000000000000000F8 +:10D8100000000000000000000000000000000900FF +:10D820008400000000000000010110000001000061 :10D8300000000000000000000000000000000000E8 :10D8400000000000000000000000000000000000D8 :10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 +:10D8600000000100000000000000000000000000B7 :10D8700000000000000000000000000000000000A8 :10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000000078 +:10D89000000000000000000000000000000000097F +:10D8A0008320001100000000000803210020001068 :10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 +:10D8C0000000080000000000000000000000000050 :10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 +:10D8E0000000000004000000000000000000000034 :10D8F0000000000000000000000000000000000028 :10D900000000000000000000000000000000000017 :10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 +:10D920004100210010110383000000801000080056 +:10D93000410900000000000000000000000000009D +:10D940000000020020002000410000000000000054 :10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 +:10D9600000000000000000080000000000000000AF :10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 :10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 +:10D9A000000000200100010101880000009000003B +:10D9B000000001A0000000000000000000000000C6 +:10D9C0000000000000000100000001000000000055 :10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000000037 +:10D9E0000000000000000000000100000000000036 :10D9F0000000000000000000000000000000000027 :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 -:10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 +:10DA20000000000000000100C00100010000000033 +:10DA300000010301000100000000000000000000E0 +:10DA400000000000000000010000000000010000D4 :10DA500000000000000000000000000000000000C6 -:10DA600000000000000000000000000000000000B6 +:10DA600000000000000000000800000000000000AE :10DA700000000000000000000000000000000000A6 :10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 -:10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 +:10DAA00000000000000000414009A0100311000028 +:10DAB00000414004A121001100000000000000000E +:10DAC000000000000000000000090000000000113C :10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 +:10DAE00000000000000000000000800000000400B2 :10DAF0000000000000000000000000000000000026 :10DB00000000000000000000000000000000000015 :10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 -:10DB500000000000000000000000000000000000C5 +:10DB2000000000000000000041040300100010414C +:10DB30000000208502002000040800000000000012 +:10DB40000000000000000000000000820000000053 +:10DB500000080000000000000000000000000000BD :10DB600000000000000000000000000000000000B5 :10DB700000000000000000000000000000000000A5 :10DB80000000000000000000000000000000000095 :10DB90000000000000000000000000000000000085 -:10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 +:10DBA000000000000000000000000105010001006D +:10DBB00001010000018800000100010100000000D7 +:10DBC00000000000000000000000000000C1000094 :10DBD0000000000000000000000000000000000045 :10DBE0000000000000000000000000000000000035 :10DBF0000000000000000000000000000000000025 :10DC00000000000000000000000000000000000014 :10DC10000000000000000000000000000000000004 -:10DC200000000000000000000000000000000000F4 -:10DC300000000000000000000000000000000000E4 -:10DC400000000000000000000000000000000000D4 -:10DC500000000000000000000000000000000000C4 +:10DC2000000000000000000000000000810000E093 +:10DC3000000000060000810000E00000000000007D +:10DC40000000000000000000000000000000810053 +:10DC500000E0000060000000000000000000000084 :10DC600000000000000000000000000000000000B4 -:10DC700000000000000000000000000000000000A4 +:10DC700000E00000000000000000000000000000C4 :10DC80000000000000000000000000000000000094 :10DC90000000000000000000000000000000000084 :10DCA0000000000000000000000000000000000074 @@ -159248,226 +159248,226 @@ :10DE80000000000000000000000000000000000092 :10DE90000000000000000000000000000000000082 :10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 -:10DED0000000000000000000000000000000000042 +:10DEB000000000000000006100068001000000007A +:10DEC0000060000280090000000000000000000067 +:10DED0000000000000000000006100068009000052 :10DEE0000000000000000000000000000000000032 -:10DEF0000000000000000000000000000000000022 +:10DEF000000000000000000000610007000D0000AD :10DF00000000000000000000000000000000000011 :10DF10000000000000000000000000000000000001 :10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000000000000E1 -:10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000000000000C1 -:10DF600000000000000000000000000000000000B1 +:10DF30000000000000000000C0004040FFFFFFFFA5 +:10DF40000000005C0000A8BCA8BC000000000000AD +:10DF50000000000000000000000000000000C3C33B +:10DF6000C3C300000000000000000000000000002B :10DF700000000000000000000000000000000000A1 :10DF80000000000000000000000000000000000091 :10DF90000000000000000000000000000000000081 :10DFA0000000000000000000000000000000000071 -:10DFB0000000000000000000000000000000000061 -:10DFC0000000000000000000000000000000000051 +:10DFB00000000000000000000000000000000080E1 +:10DFC000C3800000005C005C003CFCFC0000000022 :10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000000000000031 +:10DFE0000000FFFF00000000000000000000000033 :10DFF0000000000000000000000000000000000021 :10E000000000000000000000000000000000000010 :10E010000000000000000000000000000000000000 :10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 -:10E0400000000000000000000000000000000000D0 +:10E03000000000000000000000000000AA0A0A0A18 +:10E04000F4F0F4F50000FF1FFF145050F000000042 :10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 +:10E060000000555082820000000000000000000007 :10E0700000000000000000000000000000000000A0 :10E080000000000000000000000000000000000090 :10E090000000000000000000000000000000000080 :10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000000000060 -:10E0C0000000000000000000000000000000000050 +:10E0B0000000000000000000000000000000A000C0 +:10E0C0000000F4F0F4F00000FF0FFF00A0A0F0004B :10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 +:10E0E0000000000055558282000000000000000082 :10E0F0000000000000000000000000000000000020 -:10E1000000000000000000004000000000000200CD -:10E11000200001000000400000000000000000009E -:10E12000200000000000200020000000000020006F -:10E13000000040000000400000000000000000005F -:10E14000200000000000410000012000000000004D -:10E150000000000020000000880000000000000017 -:10E16000000020000000000000002000000000006F -:10E17000000000000000000002000000400000005D -:10E1800000000000000000008800100000000000F7 -:10E19000000040001000009000002000000000007F -:10E1A000000040000000000000000000000000002F -:10E1B00000002000000040000000100000000000EF -:10E1C000000000000040000002000000000000000D -:10E1D00000000000000040000040000010000000AF -:10E1E000000040000000400000000000100000009F -:10E1F000000000004000400000000000100080000F -:10E2000000000000000040000000000000000000CE -:10E2100000000200000800001000000800000000DC -:10E2200000000000020000000000000000000000EC +:10E10000000000000000000000000000000000000F +:10E1100000000000000020000000000000000000DF +:10E1200000000000000020000000000000000000CF +:10E130000000000000002000000000008800000037 +:10E1400000000000000020000001000000000000AE +:10E15000000000000000000020000000000000009F +:10E16000000000000000000020000000000000028D +:10E17000000000000000000420000000000000007B +:10E18000000000000000000020040000000000006B +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000400000000000000000001F +:10E1C000000000000000000000C00000000000008F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000002000000000000000000021B +:10E20000000000000000009000000000000000007E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000020000000000EC :10E2300000000000000000000000000000000000DE -:10E2400000000000000000000000000000000000CE -:10E250008800000002000000000000000200000032 -:10E260000000000000000000000002400410000058 -:10E27000000000000200000000000000820000001A -:10E280000000000004000000000000000200000088 -:10E2900000000000000000010000800000010000FC -:10E2A00000000000000080000000000000000000EE +:10E240000000000082000000820082000000000048 +:10E2500000000000000000000000000000000000BE +:10E2600004000000000000000000040000000000A6 +:10E27000000000000000020000000000000000009C +:10E280000200020002000000000008000000000080 +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E :10E2B000000000000000000000000000000000005E :10E2C000000000000000000000000000000000004E :10E2D000000000000000000000000000000000003E :10E2E000000000000000000000000000000000002E -:10E2F000000000000000040000000000000000001A +:10E2F000000000000000000000000000000000041A :10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000100FC +:10E3100000000000000000000000000000000000FD :10E3200000000000000000000000000000000000ED -:10E3300000000000000000000000000000110000CC -:10E3400000000000000000000000100000000000BD -:10E3500000000000000000000000000000000000BD -:10E36000000000000000000000000000000010009D -:10E370008800000000000000000000000000000015 -:10E3800000000000840000000000200000000000E9 +:10E330000000000000000000880000000000000055 +:10E340000000000090009000000084008400840021 +:10E350000000C000040000000000000000000000F9 +:10E360008200000000000000000000000003000028 +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D :10E39000000000000000000000000000000000007D -:10E3A0000400000000000000000000000000000069 +:10E3A000000000000000000000000000000000006D :10E3B000000000000000000000000000000000005D -:10E3C000000000000000000000000000000000004D -:10E3D000000000000000000000000000000000003D -:10E3E0000000080000000000000000000000000025 -:10E3F000000010000000000000000000000000000D +:10E3C0000000090009001100000020000000050005 +:10E3D000000000000020000000000000001000A06D +:10E3E0000000000000000000080000000000000025 +:10E3F000000000000000000000000000000000001D :10E40000000000000000000000000000000000000C -:10E41000000800000000000000000000880000006C -:10E42000088009000000000000000011000000004A -:10E4300000000000000000000000000000000000DC -:10E4400000000000000002000000000000000000CA -:10E4500000000800000000000000000000000000B4 -:10E4600000000000000000000000000004000000A8 -:10E47000000000000000000000000000820000001A -:10E48000000000000800C000000000000040000084 -:10E490000000000004000000000000000000000078 -:10E4A000000000202000000000000000000000002C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000200000000000000DA +:10E44000000000400000000000000000000000008C +:10E45000000020000000000000000000000000009C +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000004000005C +:10E48000000000000000000000000000000000008C +:10E490000004000000000000000000000000000078 +:10E4A000000000000000000000000000000000006C :10E4B000000000000000000000000000000000005C -:10E4C000000000000800040002000000000000003E -:10E4D0000500000000000000000003040000000030 -:10E4E0000000020000000090000400000000000096 -:10E4F000000000000000000000000000000000001C +:10E4C0000000100000000000000003000000000039 +:10E4D000009000008000000000000000000000002C +:10E4E000000000000000000000000000000000002C +:10E4F00000000000000040000000000000000000DC :10E50000000000000000000000000000000000000B -:10E51000000000000000000000000000900000006B -:10E5200000000000000000000200000008000000E1 +:10E5100020000000000000000000000000000000DB +:10E5200000000000000000000000000000000000EB :10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000000000000CB -:10E5500000000000000000000000000000000000BB +:10E540000000000000000000000000000000880043 +:10E550000000840000000000000000000000000037 :10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E580000000000008000000000000000000000083 +:10E570000000000000000000000000080000000093 +:10E58000000000000000000000000000000000008B :10E59000000000000000000000000000000000007B :10E5A000000000000000000000000000000000006B :10E5B000000000000000000000000000000000005B :10E5C000000000000000000000000000000000004B -:10E5D000000000000000000000000000000000003B -:10E5E000000000000000000000000000000000002B -:10E5F0000000000000000000000008000000000013 -:10E6000000000000000000000010000000000000FA -:10E6100000000000000000000000000000000000FA -:10E6200000000000020000000000000000000011D7 -:10E6300008090000000000000000000000000000C9 -:10E6400000000002000000000000000000000000C8 -:10E6500000000000000000000000000000000000BA +:10E5D00000004000050009000000000000100000DD +:10E5E00009002100000000000000000800000000F9 +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000040000000000000BA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E650000000000000000000000084000000000036 :10E6600000000000000000000000000000000000AA :10E67000000000000000000000000000000000009A :10E68000000000000000000000000000000000008A -:10E69000000000000000080000080000000000006A -:10E6A00000000000000080000000000000000000EA +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A :10E6B000000000000000000000000000000000005A :10E6C000000000000000000000000000000000004A -:10E6D0000040000000000000020040400000000078 -:10E6E000050000000000080000000090000000008D -:10E6F000000000000000000000000000000000001A -:10E700000000000000000000000000000000000009 +:10E6D00000000000200000002000000000000000FA +:10E6E000000000000000000000000000000000002A +:10E6F0000000000000000000000000000000000218 +:10E700000000040000000000000000000000000005 :10E7100000000000000000000000000000000000F9 -:10E720000000000000000000010090000000000058 -:10E730000000000000000000904000880040080237 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 :10E7400000000000000000000000000000000000C9 -:10E7500000000000000000000188008800000000A8 +:10E750000000000000000000000001002000000098 :10E7600000000000000000000000000000000000A9 :10E770000000000000000000000000000000000099 :10E780000000000000000000000000000000000089 :10E790000000000000000000000000000000000079 -:10E7A00000000000000000000000110080210000B7 +:10E7A0000000000000000000000000000000000069 :10E7B0000000000000000000000000000000000059 -:10E7C00000800000000000000000000000000000C9 -:10E7D0000000000000000000000010000000000029 +:10E7C0000000000000000000000000000000000049 +:10E7D00000000000000000000000000040000000F9 :10E7E0000000000000000000000000000000000029 :10E7F0000000000000000000000000000000000019 :10E800000000000000000000000000000000000008 :10E8100000000000000000000000000000000000F8 -:10E820000000000000000000000000000004008064 -:10E83000112100000005000000000000000000831E -:10E840008000000000000000000000000000000048 -:10E850000000000000000000000000000000002197 -:10E8600000000000000000000000000000000000A8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E850000000000000000000000000002000000098 +:10E860000300200000000000000000000000000085 :10E870000000000000000000000000000000000098 :10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000008000070 -:10E8A0000000000000000000000000000000000167 -:10E8B0000002010000C00000000000000000100085 -:10E8C000C08204A020020000000000000000000040 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 :10E8D0000000000000000000000000000000000038 -:10E8E0000084009000000000000000000000000014 +:10E8E0000000000000000000000000000000000028 :10E8F0000000000000000000000000000000000018 :10E900000000000000000000000000000000000007 -:10E910000000000000000000009000000000000166 +:10E9100000000000000000000000000000000000F7 :10E9200000000000000000000000000000000000E7 -:10E93000010008880801010000000000000000003C -:10E94000020200082040080800000000000000004B +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 :10E9500000000000000000000000000000000000B7 -:10E960000800000000008800000000000000000017 +:10E960000000000084010001000000000000000021 :10E970000000000000000000000000000000000097 :10E980000000000000000000000000000000000087 :10E990000000000000000000000000000000000077 :10E9A0000000000000000000000000000000000067 -:10E9B000000041008080800820000000000000006E -:10E9C00000008080000000008000000000000000C7 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 :10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 +:10E9E0000000004100200021001100000000000094 :10E9F0000000000000000000000000000000000017 :10EA00000000000000000000000000000000000006 :10EA100000000000000000000000000000000000F6 :10EA200000000000000000000000000000000000E6 -:10EA30000000000000111100008000000000000034 +:10EA300000000000000000000000000000000000D6 :10EA400000000000000000000000000000000000C6 :10EA500000000000000000000000000000000000B6 -:10EA600000000000000000000000000000000000A6 +:10EA60000000000000000010000000030000000093 :10EA70000000000000000000000000000000000096 :10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000040072 -:10EAA000090040001000000000000000000000000D -:10EAB0000000000000000001010000400000000014 -:10EAC00000000000000090004040C04090000000A6 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 :10EAD0000000000000000000000000000000000036 -:10EAE00000000000000090008800880088000000FE +:10EAE0000000000000000000000100000001000024 :10EAF0000000000000000000000000000000000016 :10EB00000000000000000000000000000000000005 :10EB100000000000000000000000000000000000F5 -:10EB200001000000000000000000000000000000E4 -:10EB30000000000000000000000000E0070082006C +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 :10EB400000000000000000000000000000000000C5 :10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 +:10EB60000000000000000000500000E00000000075 :10EB70000000000000000000000000000000000095 :10EB80000000000000000000000000000000000085 :10EB90000000000000000000000000000000000075 :10EBA0000000000000000000000000000000000065 :10EBB0000000000000000000000000000000000055 -:10EBC000F0F00000000000000000C300C3FF810C53 -:10EBD000BD0C00000000000000000000000000006C -:10EBE000000000000000000000001803183F0000B3 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 :10EBF0000000000000000000000000000000000015 :10EC00000000000000000000000000000000000004 :10EC100000000000000000000000000000000000F4 :10EC200000000000000000000000000000000000E4 :10EC300000000000000000000000000000000000D4 -:10EC40000000F0F00000000000000000990F990F94 -:10EC500081CFBDCF000000000000000000000000D8 -:10EC6000000000000000000000000000DB03DB3FAC +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 :10EC70000000000000000000000000000000000094 :10EC80000000000000000000000000000000000084 :10EC90000000000000000000000000000000000074 @@ -159481,475 +159481,475 @@ :10ED100000000000000000000000000000000000F3 :10ED200000000000000000000000000000000000E3 :10ED300000000000000000000000000000000000D3 -:10ED400000000000FFFF00000000000000000000C5 -:10ED50009F9F9090D299D200000000000000000018 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 :10ED600000000000000000000000000000000000A3 -:10ED700099990099000000000000000000000000C8 +:10ED70000000000000000000000000000000000093 :10ED80000000000000000000000000000000000083 :10ED90000000000000000000000000000000000073 :10EDA0000000000000000000000000000000000063 :10EDB0000000000000000000000000000000000053 :10EDC0000000000000000000000000000000000043 -:10EDD0000000F303F303D2FFD2660000000000003E +:10EDD0000000000000000000000000000000000033 :10EDE0000000000000000000000000000000000023 -:10EDF0000000FF996699000000000000000000007C +:10EDF0000000000000000000000000000000000013 :10EE00000000000000000000000000000000000002 :10EE100000000000000000000000000000000000F2 :10EE200000000000000000000000000000000000E2 :10EE300000000000000000000000000000000000D2 -:10EE40000000000005000A06054C00A800000000B4 -:10EE5000000000000000000000C0000000000000F2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 :10EE600000000000000000000000000000000000A2 -:10EE70000000000000003000000000000000000062 +:10EE700000000000006100068009000000000000A2 :10EE80000000000000000000000000000000000082 :10EE90000000000000000000000000000000000072 -:10EEA0000000000000000000000000000000006101 -:10EEB0000006000D0000000000000000000000003F -:10EEC0000000000000000000FF0000FF0000000044 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 :10EED0000000000000000000000000000000000032 :10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000000000000012 +:10EEF0000000000000000000000010FF15FF0000EF :10EF00000000000000000000000000000000000001 :10EF100000000000000000000000000000000000F1 :10EF200000000000000000000000000000000000E1 -:10EF3000008A8A8A00000000000000000000000033 -:10EF400000000000000000000000FF0000FF0000C3 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 :10EF500000000000000000000000000000000000B1 :10EF600000000000000000000000000000000000A1 -:10EF70000000000000000000000000000000000091 +:10EF700000000000000000000000000000FF05FF8E :10EF80000000000000000000000000000000000081 :10EF90000000000000000000000000000000000071 :10EFA0000000000000000000000000000000000061 -:10EFB000000000CFCFCF00000000000000000000E4 -:10EFC000000000000000000000000000FF0000FF43 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 :10EFD0000000000000000000000000000000000031 :10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 +:10EFF00000000000000000000000000000000014FD :10F000000000000000000000000000000000000000 :10F0100000000000000000000000000000000000F0 :10F0200000000000000000000000000000000000E0 :10F0300000000000000000000000000000000000D0 -:10F040000000000000000000000000000000FF00C1 -:10F0500000FF0000000000000000000000000000B1 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 :10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 +:10F08000001400000000000000000000000000006C :10F090000000000000000000000000000000000070 :10F0A0000000000000000000000000000000000060 :10F0B0000000000000000000000000000000000050 -:10F0C000000000000000000000000000C000000080 +:10F0C0000000000000000000000000000000000040 :10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F000000000000000000000000000840000008C -:10F1000040800004000400000000000000000080B7 -:10F11000000000000000108000000000000020003F -:10F12000400020000000400000000000000004003B -:10F13000400000000000400000000000000000054A -:10F1400040000000000088000000000000200000D7 -:10F150004000000040000000000000A0000000008F +:10F0E000000000000000000000000000020000001E +:10F0F000000000000000000000410100010040008D +:10F1000000000000000000030000000000002000DC +:10F110000000000000001000000004000000400497 +:10F1200000000000000000050000000000000000DA +:10F130000000000000042004000000000000200483 +:10F1400000000400000400040000000000000000B3 +:10F1500000000000000000000000000000000000AF :10F16000000000000000000000000000000000009F -:10F17000000040000000000000000000000000004F -:10F18000000000020001000100000000000000007B -:10F19000004010024000400000401000000000004D -:10F1A00000001000008200000000000000000000CD -:10F1B000000000000000000000000000400000000F -:10F1C00000002000400000000000000000000000DF -:10F1D000000000000000000000000000000002002D -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F200000000840003000000011000000100002045 -:10F2100000002008000000000000010000000000C5 -:10F2200000000000000000000000000000000000DE -:10F2300000000000020000000000000002000000CA -:10F240000000000000410200000002000000000079 -:10F2500000000000000000000000000000000000AE -:10F26000000800000008000800000008001000006E -:10F27000000000000000000000000000000000008E -:10F280000040000000840288000020C00000200030 -:10F2900000010000800000000000000004000000E9 -:10F2A0000008000000000000400000000000000016 -:10F2B000000000080008000000000000000000003E -:10F2C0000008000000000000000000000000000036 +:10F170000000000041000002008200022000200088 +:10F1800080020000000000020000000200020004F3 +:10F19000000000000000000200000000000000006D +:10F1A0008000000000080000000000004000400057 +:10F1B000000000000008000000A040000002000461 +:10F1C0000084000000000000008400000000000037 +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000002001D +:10F1F000000000030000000000000000000000000C +:10F20000820002000200022100000000000000084D +:10F2100000000000000000000000000000000000EE +:10F2200000000000000300000000000000000000DB +:10F2300000000000000000000000000000000200CC +:10F2400000000203000000000000000000000000B9 +:10F25000000800080000000000000000000000009E +:10F26000000000820000000000000000000000001C +:10F27000040800080000000000000000000000007A +:10F280000000000800000400000000000000000072 +:10F290000000000800080000000800000000000056 +:10F2A0000000000000080400000000000000000052 +:10F2B0000008000800080000000400000000000032 +:10F2C0000000000000080000008400820000000030 :10F2D000000000000000000000000000000000002E :10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F3000000000000000001000000002000000000DC -:10F31000000000000000004000410000000000006C -:10F3200000000000000000000000000000000000DD -:10F3300000000000100000000000000000000000BD -:10F3400000000000000000000000000000000000BD +:10F2F0000000000000000240000004000000410087 +:10F3000084009000840090000000040004000000CD +:10F310008200000040000400000000000000000027 +:10F3200000000000000000000000080000000000D5 +:10F33000200000000000000000000000000000218C +:10F340000403000000210021000000000000002153 :10F3500000000000000000000000000000000000AD -:10F360000000000003000300000000000000001087 +:10F36000000000000000000000000000000000009D :10F37000000000000000000000000000000000008D -:10F380000000090000000000100000000001000063 +:10F38000C0001100400021004100000000000020EA :10F39000000000000000000000000000000000006D -:10F3A000000000000000000000000000000000005D -:10F3B000000000000000000000000000100000003D +:10F3A00000000000000000000000000080000000DD +:10F3B00000008000000000000000000000000000CD :10F3C000000000000000000000000000000000003D -:10F3D000080800000000100082000000000000008B +:10F3D000000000000000000000000000000000002D :10F3E000000000000000000000000000000000001D -:10F3F00000000000000000000000000000000021EC -:10F400000000000000008811000001C00102A040BF -:10F4100088400000C0000100010000000020000042 -:10F4200000200000000000000000000000000000BC -:10F4300000000000000000000000000000000000CC -:10F4400000000800000000000000000000000000B4 -:10F450000000000000000000080008100300080081 -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F480000000000000000000000000000421040053 -:10F490000001000100000000200020080000000121 -:10F4A00000000001000000000000000000000082D9 -:10F4B000000000000000000000000000000000004C -:10F4C00000000000000000080000000000000082B2 +:10F3F000000000000000000000000000000000000D +:10F40000000084900000004000100009000000008F +:10F4100000000000000000041000000000000000D8 +:10F420000000000000000200820000040004000050 +:10F430000000002120040005000008040000000076 +:10F440000000A00082000000000082040000000014 +:10F4500000000000000000000000000000000000AC +:10F4600000000000000000000000000800A00000F4 +:10F470000000000000000000000000000000000884 +:10F480000000000000020000110000000000000069 +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B00000000000000080010008030000002000A0 +:10F4C00000000000000000000800000000000084B0 :10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C :10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000002100DA -:10F5100010000200890000000000A00400000003A9 -:10F520000011000000200020000000000004000086 -:10F5300000000000000000000000000000000008C3 -:10F5400000000000000000000000000000000000BB -:10F5500000000000000000000000000000C00000EB -:10F560000000000000000084000000000000000017 -:10F5700009000000008804000000000000000800EE -:10F58000000000001000000000000000000000006B -:10F5900010108988801002020000000000010000A5 -:10F5A0000000000000000001000100000000000059 -:10F5B000000000000000400000000000000000000B +:10F5000000000000000000000400A0040000000053 +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300008000000000800000000000000000000BB +:10F540000000000000000000820000000000000039 +:10F5500000000000400082020000000000000000E7 +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000040009000000052109201F +:10F5900000004100000000000000000040000000EA +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B :10F5C000000000000000000000000000000000003B -:10F5D00008A0000000000000000000000000000083 +:10F5D000000000000000000000010000000000002A :10F5E000000000000000000000000000000000001B -:10F5F0000002000000000000000000000000000009 -:10F6000000000000000000000000000000000200F8 -:10F610000000400004000000010400000020C020A1 -:10F6200001800109000000850011000000000002B7 -:10F6300000000000000000000000000000000000CA -:10F6400000000000000000000000000000000000BA -:10F65000000000000000080000000000000800009A +:10F5F000000000000000000000000000000000000B +:10F6000000000200000084008400000000000200EE +:10F6100002000004000000000000000000000000E4 +:10F6200000000000000000000000000000000000DA +:10F6300000000000200000000000000000040005A1 +:10F640000000402100000008000000210000000030 +:10F6500000000000000000000000000000000000AA :10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A -:10F680000000000000000000000000000000000872 -:10F69000000000A0001000000000040100000001B4 -:10F6A000000104040400000000200000000000002D -:10F6B0000008000000000000000000000000000042 +:10F680000000000000000000000000002100000059 +:10F690000000020000000000000000000000000068 +:10F6A000000000000000000000000000000000005A +:10F6B000000000000082000000080000008400013B :10F6C000000000000000000000000000000000003A -:10F6D000000800000000000400000000000000001E +:10F6D000000000000000000000000000000000002A :10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 -:10F7100000000000000000008800000000900003CE -:10F7200001C000200008000400C0004000C000909C -:10F7300000000000000000000000000000000000C9 -:10F7400000000000000000000000000000000000B9 -:10F7500000000000000000000000000000000000A9 +:10F700000000000000000000000000000000C00039 +:10F71000A1000800880000010000000100000000B6 +:10F7200000000000000000000000000000000000D9 +:10F73000000000000000000000080008008400082D +:10F7400000000001000000000000000000000000B8 +:10F750000000000000000000000001009000000018 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 :10F780000000000000000000000000000000000079 -:10F790000000000000000900000080000000008060 -:10F7A0000000118000804080000000800080000088 -:10F7B0000000000000000000000000000000000049 -:10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 +:10F790008020830800080008002000000002000507 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000800080000049 +:10F7C0000080000200210002000200000000000092 +:10F7D0000000000000000000000000000300000026 :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 :10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000208002800404BE -:10F8200041910000000500A000A0008000000085BC -:10F8300000040000000000000000000000000000C4 -:10F8400000000000000000000000000000000000B8 +:10F8100000001100080088000385000000000000BF +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000200000000B6 :10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 :10F870000000000000000000000000000000000088 :10F880000000000000000000000000000000000078 -:10F8900000000000000000000000000001400084A3 -:10F8A0000101010800000000000800110002000032 -:10F8B000000800850040000000000000000000007B -:10F8C0000000000000000000000000000000000038 +:10F890000000000090881100A00091880000000086 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C00000000000000000A0000000000001000097 :10F8D0000000000000000000000000000000000028 -:10F8E0000000000000000000000000000000000018 +:10F8E00000000000004000000000000000000000D8 :10F8F0000000000000000000000000000000000008 :10F9000000000000000000000000000000000000F7 -:10F9100000000000000000000000000000000009DE -:10F920000000C00101010000080002004000880042 -:10F930000500000040001000000000000000000072 -:10F9400000000000000000000000000000000000B7 +:10F9100000000000000000410120902100210000B3 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000001000100000001C4 +:10F94000C0000000000002000000000000000000F5 :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 -:10F990000000000000000000000000000000000067 -:10F9A00011A00004800504410000110080008000C7 -:10F9B00003000500000000008000000000000000BF -:10F9C0000000000000000000000000000000000037 +:10F99000000000000000000000880904002003119E +:10F9A0000000000005000000000000000000000052 +:10F9B0000000000000000000000000100010000027 +:10F9C0000008000000000000000000000900000026 :10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000000000000000017 +:10F9E0000000000900080003000200000000000001 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 -:10FA200000000900038290000300000080080040ED -:10FA300080000080000000020000000000000000C4 -:10FA400000000000000000000000000000000000B6 -:10FA500000000000000000000000000000000000A6 +:10FA10000000000000000000000041850800050013 +:10FA200003040000000000000000000000000000CF +:10FA300000000000000000000000000000000000C6 +:10FA40000000000000000000000000004005400031 +:10FA5000030009000000000000000000000000009A :10FA60000000000000000000000000000000000096 :10FA70000000000000000000000000000000000086 :10FA80000000000000000000000000000000000076 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000001000109910000000000900129 -:10FAB00082000800049020002001C00040000000E7 +:10FA900000000000000000000000000001080188D4 +:10FAA00000820001000000000000000000000000D3 +:10FAB0000000000000000000000000000000000046 :10FAC0000000000000000000000000000000000036 :10FAD0000000000000000000000000000000000026 :10FAE0000000000000000000000000000000000016 :10FAF0000000000000000000000000000000000006 :10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB2000000000000000000A006006000011000054 -:10FB30004182006006000000008200000600000014 +:10FB10000000000000000000000000000000810064 +:10FB200000E0000084000000000000000000000071 +:10FB300000000000000000000000000000000000C5 :10FB400000000000000000000000000000000000B5 -:10FB500000000000000000000000000000000000A5 +:10FB5000810000E000000000000000000000000044 :10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 :10FB90000000000000000000000000000000000065 -:10FBA0000000000000000000F0F000003C3C0000FD -:10FBB0000000D3D0131000000000E545E040000035 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 :10FBC0000000000000000000000000000000000035 :10FBD0000000000000000000000000000000000025 :10FBE0000000000000000000000000000000000015 :10FBF0000000000000000000000000000000000005 :10FC000000000000000000000000000000000000F4 :10FC100000000000000000000000000000000000E4 -:10FC200000000000000000000000F0F000003C3C7C -:10FC300000000000DFDC1F1C00000000EF4FEA4A5C +:10FC200000000000000001000000000000000000D3 +:10FC300000000000000000000000000000000000C4 :10FC400000000000000000000000000000000000B4 :10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 :10FC70000000000000000000000000000000000084 :10FC80000000000000000000000000000000000074 :10FC90000000000000000000000000000000000064 -:10FCA00000000000000000000000000000003C3CDC -:10FCB0000000555500003E3EFF0000000000F0CA65 -:10FCC000FFFF000000000000000000000000000036 -:10FCD0000000000000000000000000000000000024 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD00000820000000000000000000000000000A2 :10FCE0000000000000000000000000000000000014 :10FCF0000000000000000000000000000000000004 :10FD000000000000000000000000000000000000F3 :10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000000000D3 -:10FD30003C3C000055550000FEFEFF0000000000A6 -:10FD4000F0CA0000000000000000000000000000F9 -:10FD500000000000000000000000000000000000A3 +:10FD200000000000000000000000C0C0C2C00000D1 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD5000000200820000000000000000000000001F :10FD60000000000000000000000000000000000093 :10FD70000000000000000000000000000000000083 :10FD80000000000000000000000000000000000073 :10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000000000000000053 -:10FDB00015602A3E054000A800000561343FC50DCE -:10FDC00000A005003438050000A00000000000007D -:10FDD0000000000000000000000000000000000023 +:10FDA000000000000000000000610006800100016A +:10FDB00000610006000D00000000000000000000CF +:10FDC0000000000000000000000000610006000DBF +:10FDD0000000000000000000000000610002800D33 :10FDE0000000000000000000000000000000000013 -:10FDF0000000000000000000000000000000000003 +:10FDF000000000610006000D00000000000000008F :10FE000000000000000000000000000000000000F2 :10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000000000000D2 -:10FE3000000004010802003C303000000000000017 +:10FE20000000000000000000000000000000FFFFD4 +:10FE3000FFFF0000000000000000000000000000C4 :10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 +:10FE50003C3CF0F00000000000000000A0AAA0AAB6 :10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 +:10FE70000000000000000000003C55F00000000001 :10FE80000000000000000000000000000000000072 :10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000000000000000052 -:10FEB0000000000010402080003C303000000000B6 +:10FEA00000000000000000000000000050001010E2 +:10FEB00000104151000000000000000000000000A0 :10FEC0000000000000000000000000000000000032 -:10FED0000000000000000000000000000000000022 -:10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 +:10FED00000003C3CF0F00000000000000000E0EBFF +:10FEE000A0AA0000000000000000000000000000C8 +:10FEF00000000000000000000000FF3C55F0000082 :10FF000000000000000000000000000000000000F1 :10FF100000000000000000000000000000000000E1 :10FF200000000000000000000000000000000000D1 -:10FF300000000000000000000000003CF3F300009F +:10FF30000001AC00FFFF3C3C3C3C00000000000026 :10FF400000000000000000000000000000000000B1 :10FF500000000000000000000000000000000000A1 -:10FF60000000000000000000000000000000000091 +:10FF60000FAF2FAF000000000000000000000000F5 :10FF70000000000000000000000000000000000081 :10FF80000000000000000000000000000000000071 :10FF90000000000000000000000000000000000061 :10FFA0000000000000000000000000000000000051 -:10FFB000000000000000000000000000003CF3F31F +:10FFB000000000010C00FFFF00000C0C000000001E :10FFC0000000000000000000000000000000000031 :10FFD0000000000000000000000000000000000021 -:10FFE0000000000000000000000000000000000011 +:10FFE00000000FAF2FAF0000000000000000000075 :10FFF0000000000000000000000000000000000001 :020000040027D3 -:1000000000000000000000000000000000002000D0 +:1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 -:1000200000080000000000000000000000000000C8 -:1000300000000000000000000000000000000000C0 -:10004000110000030000000000000000000000009C -:1000500000000000000000000000000000000000A0 -:1000600000002080000000000000020000000000EE -:100070000000000000000000000000000000000080 -:10008000000020000000000000000000400000020E -:10009000009000A000A00000000000000000100080 -:1000A0001000100100000000000800000000100017 -:1000B000100010000000000000000004000010000C -:1000C00000002000000000000000000040000000D0 -:1000D00010001000100000000000000000004000B0 -:1000E0004000000000040000000200400084000006 -:1000F00010000000000040000000000000000000B0 -:1001000000000000A000000000000000000000004F -:100110000000000000008800000000000000000057 +:1000200020000000000000000000000000000000B0 +:1000300088004000000000000000000000000000F8 +:10004000200000030000000000000000000000008D +:100050000000200000000000000000000000000080 +:1000600000002080000000000000000000000000F0 +:1000700000002000000000000000000000008400DC +:100080000004000400000000000000000000000068 +:10009000000000000000000000000000000200005E +:1000A00010000000000000000000000000820000BE +:1000B00000000000000000000000009000000000B0 +:1000C00000008000000000000000000000000000B0 +:1000D0000000000000000000000000000000000020 +:1000E000000000000004000000000000000000000C +:1000F000000000000000000000000000008200007E +:1001000000040000000000000000000000000000EB +:1001100000000000000000000000000000000000DF :1001200000000000000000000000000000000000CF -:1001300000000000000000000200000000000000BD -:1001400000000009000000000000000000000000A6 -:100150000000000000000800000000000000020095 -:10016000000000000000000000000000100000007F -:1001700000000000000000000000000000008200FD -:10018000000000000000000000000000000000006F -:100190000000000000000000000800000000000057 -:1001A000000000000000000000000000000000004F -:1001B0000000000000000000000800000000000037 -:1001C0000000000000000000000000000000000827 -:1001D0000000000000000000000000080000000017 -:1001E00000000008000800080008000000000008E7 -:1001F000000000000084000000840008008400006B -:1002000000000008000800080008000000000000CE -:100210000000000000200000C000000000000000FE -:1002200000000000000090004000040000000000FA -:1002300000000000000000000000000000000000BE -:1002400000000000880000000021000000210021C3 -:100250000021000000000008000000080021000844 -:10026000002100000000000000000021002100210A -:1002700000210000000000210000002100210021D9 -:1002800000210021000000210000002100000000EA +:1001300000000000000000000000000000000000BF +:1001400000000005000300000000000000000000A7 +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:100170000000000000000000000900000000000076 +:100180000000000000050100000000080000000859 +:1001900000000084000000080008000800080008B3 +:1001A000000800000008000800080008000000081F +:1001B0000000000800000008008400080008000893 +:1001C0000008000800080008000000820008000085 +:1001D000000800000008000000080000000800827D +:1001E00000080008000800080008000000080000DF +:1001F0000008008400080008000800000008000053 +:1002000000080084020800082008002100210021C5 +:100210000021000000080000002100210021002131 +:100220000021000000080000002100210021002121 +:100230000021000000210000000400210021002115 +:1002400000214000002100000000000000210021EA +:10025000002100210008000300210000000300210C +:1002600000210021000000000021000500210021E4 +:100270000021002100210000004000040021002195 +:100280000021002100080000880000040000000098 :10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000200000000084000000008A -:1002D00011000500002000000000000000000000E8 -:1002E000000000000000000000000000000000000E -:1002F000008400000000000000000000000000007A -:10030000000000000000000000000000000082006B -:1003100082000000000000000000820000000000D9 -:1003200000000000000000000000000000000000CD -:100330000000000000000000000008000000004174 -:1003400000000000000000000000000000000000AD -:100350000000000900000000000000000011000083 +:1002A000000000000000000000000040000000000E +:1002B00004000400410004000400040000040000E5 +:1002C000000000000004000000000000000000002A +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000040A +:1002F00000000000000000000000000000000000FE +:100300000000000000000000050005000082000061 +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000020000000AD +:10033000000000000000000000000000004000007D +:100340000000000900000040000000020000000062 +:10035000000000000000A0000000000000000000FD :10036000000000000000000000000000000000008D -:10037000000000000000002100000000000000005C -:10038000000000000000000000000041000000002C -:10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D -:1003B000000000000000000010000000000000002D -:1003C0000000000000000000000000900088000015 -:1003D000000000000002000000000000400040900B -:1003E000000000000000000000000000004000824B -:1003F00000000000000000000000000000000000FD -:100400000000000000000000040000000000008266 -:1004100010000800000008000000000000001000AC -:10042000A000000000000004000000000000000028 -:100430000080000000000008000000000000000034 -:1004400000000000000000000000000000080000A4 -:100450000000000000000000000800000000000094 -:100460000000000000000000000000000000000884 -:100470000000000000000003000000000041000830 -:100480000000000000000000000000000000000864 -:10049000000000000000000000000000000000005C +:10037000000000000000000000000000000000007D +:100380008400840000000000000000000000000065 +:100390000008000000000000000000000000000055 +:1003A000000000000000000000000000008280004B +:1003B000000000000000000000000000000020001D +:1003C000000000000000000000A00000000000008D +:1003D0000000000000000000000000000000000815 +:1003E00000000000000000000000009000000090ED +:1003F000000000000000000000000000000040407D +:1004000000000000000000000000004000040000A8 +:1004100000000000000000000000000020000000BC +:1004200000000000000000000000000800000000C4 +:100430000040000004410000000000000000000037 +:1004400000000000000000000000000800000000A4 +:10045000000200000000000000000000000000009A +:10046000000000000021000000030000000800411F +:10047000000000210000000000000000000000005B +:10048000000000000000000000000000002100004B +:100490000000080300000000000000000000000051 :1004A000000000000000000000000000000000004C -:1004B0000000080400000000000000000000000030 -:1004C000000000000400000000000000090000001F -:1004D000030400000000009000840084000010006D -:1004E00000001010000000000000000000000000EC +:1004B00000000000000000000000000000C000007C +:1004C00000000000002002040420100000000000D2 +:1004D000000000000000000000000000000000001C +:1004E00000000000000008020000000003000000FF :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB -:10051000000000000000000008110000840000003E -:1005200002000000000000000000000000000000C9 -:1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000008A3 -:100550000021000800080000000000000000001159 -:100560000000000200100000000000000000000079 -:100570000008002100080008000000000000000042 -:100580000000000800000000000000000000000063 -:100590000008002100080008000000000000000022 +:1005100009000000000000000000000000050000CD +:10052000000000000041000000000000000000008A +:10053000002100000000000000000000000000009A +:10054000000000000000000000000000000000218A +:100550000021000008000000000000000000000072 +:10056000000000000000000000000000000000008B +:100570000021000000000000000000000000000555 +:10058000000000000000002100000000000000004A +:100590000008000000000000000000000000000053 :1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D0000000009000000000000040001102110027 +:1005C0000000000000000000004000000000008863 +:1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B -:1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA -:1006100000000000090000000000000100010001CE -:1006200000C00001040100C001830000050100407A -:1006300000820001400100C0000000002000000016 -:1006400000000000000000000000000000000002A8 -:10065000000000000000000000000000000020007A -:10066000000000000000000000000000000000008A +:1005F000000000900000000000000000000000006B +:10060000200000000000000000004000000000008A +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000101000002C6 +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000101000002A6 +:10065000000000000000000000000000000000009A +:100660000000000000000000000000000000010089 :100670000002000000000000000000000000000078 -:10068000000000000000000000000000000000006A -:1006900000020000000000000000000000410041D6 -:1006A000004100C000418041008810C140119041CC -:1006B000008000800041804100C0000011008000E7 -:1006C0000000000000000000000000000009090018 -:1006D0000000000000000000000000000000110009 -:1006E0008000000000000000000000000000000981 -:1006F00009000000000000000000000000000000F1 -:1007000000000000000000000000000000000009E0 -:10071000090000000000000000000000000041008F -:100720000300000000804100830000000800080072 -:100730004000000084004100C10000408000000033 -:100740002100000000000000000000000000410047 -:1007500040000082000000000000000000040001D2 -:100760000000210000000000000000000000000068 -:1007700041000300008200000000000000000011A2 -:100780000000090000000000000000000000000060 -:100790004100030000820000000000000000001182 -:1007A00001000100000000C00100C00000000000C6 -:1007B000200082080020C1009100C100004082009A +:100680000000000000000000000000000001010068 +:100690000002000000000000000000000000000058 +:1006A000000000000000000000000000000808003A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000808001A +:1006D000000000000000000000000000000000001A +:1006E00000000000000000000000000000000011F9 +:1006F00008000000000000000000000000000000F2 +:1007000000000000000000000000000000000808D9 +:1007100008000000000000000000000000000000D1 +:1007200010000000000000000000000000000300B6 +:10073000098000800000000000000000001100009F +:100740001000000000000000000000000000090090 +:10075000098000800000000000000000000200008E +:100760000000100000000000000000000000000079 +:10077000090082000080000000000000000000402E +:100780000000080000000000000000000000000061 +:1007900009008280008000000000000000000002CC +:1007A0000000000000000000000000000000000049 +:1007B0000200021000101000020000000000000003 :1007C0000000000000000000000000000000000029 -:1007D000020003100008C0008800000000000000B4 +:1007D00008000210001010000200000000000000DD :1007E0000000000000000000000000000000000009 -:1007F0000000020003100008C0888800000000000C -:1008000000000000000000000000000000000000E8 -:100810000000020003100008C088880000000000EB -:10082000000000C00001C0C100000000000102C0C3 -:1008300082200003000100C1000000000001000050 -:10084000000000000000C0000000000000000000E8 -:100850000000008800008800000000000000000088 -:100860000000000000000000C000000000000000C8 -:1008700000000000008800000000000000000000F0 +:1007F0000000020010C00010100002000000000005 +:1008000000010000000000000000000000000000E7 +:100810000000020020100010100002000000000084 +:1008200000000000000000000000000000000000C8 +:1008300000000004000000000000000000000000B4 +:1008400000000000000000000000000000000000A8 +:100850000000001000000000000000000000000088 +:100860000000000000000000000000000000000088 +:100870000000000000200000000000000000000058 :100880000000000000000000000000000000000068 -:1008900000000000008800000000000000000000D0 -:1008A000000000000080004180C100000000004105 -:1008B00080C1004000C1004100C1000000000041B3 -:1008C0000040000000000000800000000000000068 -:1008D000000000000000000000000900000000000F -:1008E0000000000000000000000080000000000088 -:1008F00000000000000000000000000009000000EF +:100890000000000000200000000000000000000038 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000009000000CE -:10092000000000000000C100800080C100004140C4 -:10093000800002004100C1418000801000004100A1 -:100940000000800041000000800000C100000000A5 -:1009500000000000000000C1800000110000000045 -:1009600000000000000000000000800000C1000046 -:1009700000000000000000000041800000110000A5 -:100980000000000000000000000080000091000056 -:100990000000000000000000004180000011000085 -:1009A0000000000000000000C1004000C0C10000C5 -:1009B0000100400089000100C1830200C001000065 -:1009C00001000000C00001000000400000C1000064 -:1009D0000000000000000000004182000000000054 -:1009E000000000000000000000000000400000C106 -:1009F0000000000000000000000000058200000070 -:100A000000000000000000000000000008000010CE -:100A1000000000000000000000000005820000004F +:1009100000000000000000000000000000000000D7 +:100920000000000000000010800000C10000000076 +:100930000000000000000041000000100000000066 +:100940000000000000000010800000C10000000056 +:100950000000000000000041000000100000000046 +:1009600000000000000000000010800000C1000036 +:100970000000000000000000004100000010000026 +:1009800000000000000000000008800000C100001E +:100990000000000000000000004100000010000006 +:1009A00000000000000000000000200000400000E7 +:1009B0000000000000000000001102000001000023 +:1009C00000000000000000000000200000400000C7 +:1009D000000000000000000000090200000100000B +:1009E00000000000000000000000000020000040A7 +:1009F00000000000000000000000002102000001D3 +:100A00000000000000000000000000002000004086 +:100A100000000000000000000000002102000001B2 :100A200000000000000000000000000000000000C6 -:100A30000042000000000000000081120048070092 +:100A300000000000000000000000810000E0000055 :100A4000480000000000000000000000000000005E -:100A500000110000000000000000810000E0000024 +:100A500000000000000000000000810000E0000035 :100A6000480000000000000000000000000000003E -:100A7000000000110000000000000000810000E004 +:100A7000000000000000000000000000810000E015 :100A8000000048000000000000000000000000001E :100A9000000000000000000000000000810000E0F5 :100AA00000004800000000000000000000000000FE @@ -159969,453 +159969,453 @@ :100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 -:100BB000757B000000000000000000000000000045 -:100BC0000000000000000000000000000000DEAE99 +:100BB000747B000000000000000000000000000046 +:100BC0000000000000000000000000000000DE2E19 :100BD000747B000000000000000000000000000026 :100BE0000000000000000000000000000000DE2EF9 :100BF0000000747B00000000000000000000000006 :100C000000000000000000000000000000000000E4 :100C1000DE2E747B000000000000000000000000D9 :100C200000000000000000000000000000000000C4 -:100C3000DE2E60C603000000000000000031E0006E -:100C40000000000000000C0000000000000000C0D8 -:100C50006306615603400000000000000230A0005F +:100C3000DE2E615603400000000000000230A000DC +:100C40000000000000000C4000000000000002C096 +:100C50006A86615603400000000000000230A000D8 :100C60000000000000000C4000000000000002C076 :100C70006A86000061560340000000000000023058 :100C8000A0000000000000000C4000000000000078 :100C900002C06A8661560340000000000000023076 :100CA000A0000000000000000C4000000000000058 :100CB00002C06A8600000000000000000000000082 -:100CC00000000000000000000000000040000000E4 +:100CC0000000000000000000020000000000000022 :100CD0000000000000000000000000000000000014 -:100CE0000000008000004000000000802000100094 -:100CF0000000008000020000000000000000000072 -:100D0000000000000080000020000000008821009A -:100D10000000000001800000000000000000000052 -:100D20000000000000000000200000000000200083 -:100D30000000400041000000000000000000000032 +:100CE000000000000000A080008000041011A0009F +:100CF00040000000000300000000000000000000B1 +:100D0000040000000000408011800840080020001E +:100D1000000002000200008000000000A088040023 +:100D2000200000000000008000800000880020807B +:100D30000008200420040000000000000000000063 :100D400000000000000000000000000000000000A3 -:100D500040004100000000000000000200000040D0 -:100D600010000002004000000000000000400002EF -:100D7000C000400000400000000000000000000033 -:100D800040400400004010400000000040000040CF -:100D9000100010020002404000004000000000006F -:100DA00040004000000000000000000000000000C3 -:100DB0000000000080008200000000000000000031 -:100DC0002000000000000000000000000000000003 +:100D50000000000000000000000000000000000093 +:100D600000000090000000000004200200010000CC +:100D7000000000000000000000A0000000000000D3 +:100D800000000000000000008008C010C0008000CB +:100D9000000000000000000040020000000000040D +:100DA00000000000000000000010002020041000DF +:100DB000001000840000000200000000000000009D +:100DC000000000000000000000000000000900001A :100DD0000000000000000000000000000000000013 -:100DE00000000000000000100000000000000000F3 -:100DF00000000000000000000000000000080000EB -:100E00000008000000000000000000009000000941 -:100E100000000000000000000000000000000000D2 -:100E200000000000000000000200000000000009B7 -:100E300000000000000400050000000000000000A9 -:100E4000000000000000000000000000000800009A -:100E50000000000000000000000000000000000092 -:100E60000000000000000000008400000088000076 -:100E7000000003000000000000000000000000016E -:100E80000000000100000000000000000008000851 -:100E9000000000000008000000000000000000004A -:100EA0000000000000000000000000000008000832 -:100EB0000000000800080001000000000000002100 -:100EC0000000000000000000000000080000000812 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF000000000000000000001040021000000804C -:100F00008800000000000000000000000021000038 -:100F1000000000000400002100001000002100007B -:100F20000000002000000021000800000021000057 -:100F3000000000000000004100210000000500004A -:100F4000000000000800080000000300000000008E -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000008000010010000000058 -:100F8000000400000000000000000000000000005D -:100F90000000000000000000000800000000000049 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000800000000000029 +:100DE000000000000200000082000100000001007D +:100DF000000000000000000000000040A000000310 +:100E0000020000000000000000000800000040098F +:100E10000041000000000000000000000000000988 +:100E200000000002000000000000000000000020A0 +:100E300000000000000000000000000000000000B2 +:100E40000200000800080000000000000008000880 +:100E50000008001000000008000800000000020068 +:100E6000000000080008000000000088200804843A +:100E70002008000000000008020800000000000038 +:100E80000000800000104008000000008000000802 +:100E9000800040080000000000080008000000007A +:100EA000000000100008000800000000000000081A +:100EB00000090008009000840008000800000021DC +:100EC0000000000000000000000000000000002101 +:100ED00000000000000000000000000000000021F1 +:100EE000000000000000000000000000000084106E +:100EF000400084000000000000000000000000002E +:100F0000820084410000000000050000000000098C +:100F1000000300030009000000000000000500219C +:100F2000000000000021000000000000000000217F +:100F300000000100000300000000C00000000000ED +:100F40000000000000000008000000000000000891 +:100F50000000000000000010000000080000000079 +:100F600000000000000000080000000000000090E9 +:100F700000008000000000040000000800000000E5 +:100F8000000000000000000821080200000000002E +:100F90000000000000000000000800000008000041 +:100FA00000000000000000004100040000000000FC +:100FB000000008000200000000000000000800829D :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 -:100FF000000000102000000001800000000301003C -:10100000000001000409118011800000004000046C -:1010100000000400000500000000000000000000C7 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000080000000000000000A8 -:101040004000002000A000000000000000000000A0 +:100FF0000011C0040002000400400000C000000016 +:1010000000000000820084000000000000000000DA +:10101000000000000005000001052000000008009D +:101020000000200000000000200000000000000080 +:101030000000080000000040000000000021000047 +:1010400000000000000000000000000000000000A0 :101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 -:101070000000000000C020000000100420000990C3 -:101080001000000010008000840882200000210071 -:10109000000000A0000000000000000000A0080008 -:1010A000000000A003000008000000000010000085 -:1010B0000000000000820000000800000588008495 -:1010C0000084008400000000000000000000000018 +:101070000000000000010001000000040000020068 +:1010800000000000000000400040000000000000E0 +:1010900000000000000000000000400020000000F0 +:1010A0000084000000000000000080000300000039 +:1010B00000000000000000000001004000000000EF +:1010C000020000000000000000000000000000001E :1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 -:1010F00000000000000000000420000300040004C1 -:101100000011010400000004040400000000A0001D -:10111000000000000000000000008200C00000008D -:101120000000000000000009000000030000900023 -:10113000002100000000000084000000C00000004A -:101140000000000500040000000000000000000096 -:1011500000000800009008000000080000000000E7 -:1011600000000088080000000000000000000000EF -:10117000000000000000000800080000001002014C -:1011800000010000100100000401800500000000C3 -:101190000000000000000000000800080000000837 -:1011A000000000000000000000000000000000003F -:1011B0000000000000000000000800080000000817 -:1011C000000000000000000100000000000000001E +:1010F00004000000000084004020040000004021A3 +:10110000000000000000000082000000000000005D +:10111000000082000005000008000000000000053B +:101120000005000300020000A00800080000000500 +:1011300000008200000082000000000008000000A3 +:101140000110000500000000000000000000000089 +:10115000000000000000000000A0110800000000D6 +:10116000000000000000000000000000000000007F +:101170000000000000000000001091A0000000002E +:10118000000000000000000000000000000000005F +:101190000000000000000000000000001108000036 +:1011A000000000000000000100000000000000003E +:1011B0000000000000000000000000101108000006 +:1011C000090008000000000000000000000000000E :1011D000000000000000000000000000000000000F :1011E00000000000000000000000000000000000FF -:1011F000000000000000000000000041200000008E -:101200002000000001000021000004C00240030093 -:1012100000800004002000000400000040050000E1 -:10122000000000210005000000210000000800006F -:1012300000000000000000000000000000000000AE -:10124000000001000100010001000000000000009A +:1011F00000000000000000000000000000000100EE +:1012000000000000000000000000C000000000001E +:101210000000C005000000000000004100100000B8 +:101220000005200508080000000400040004000573 +:1012300000048200000000080000A02100000180DE +:10124000000020100000000000000000000000006E :10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E -:10127000000000000000000000000000008200826A -:101280000000000000001000000000008041850107 -:10129000A00000040000000000000000000000C0EA -:1012A0000000210000A00000000004A000000000D9 -:1012B0000000000000A000200000000000A00000CE -:1012C0000008418220882000208220C00000000009 +:1012700000000000000000100000009000000804C2 +:1012800020000000410000000000000000000000FD +:10129000000000000000000000000000000000014D +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000002002C +:1012C000044000008000000000000000000000005A :1012D000000000000000000000000000000000000E :1012E00000000000000000000000000000000000FE -:1012F00000000000000000080000000200000004E0 -:10130000008800080000009000C1000200030000F7 -:1013100000000001A0900002000000880002000808 -:10132000000000020008000201001020000200007E -:1013300000000000000000000000000000000000AD -:101340000000000000000002108884200008000057 +:1012F00000000000000000000000000001010301E8 +:101300008400000000000000000000000000000851 +:101310000084000200020000000000000000040839 +:10132000A1401041081000000000840000000100EE +:101330000000A0000000000000000000000040A02D +:101340000090002090A0004100080010000800005C :10135000000000000000000000000000000000008D :10136000000000000000000000000000000000007D -:1013700000000000000000000080000000000000ED -:1013800000000000008000000000051100000000C7 -:10139000000000004011008020000000000000005C -:1013A00000800000000000800000080080000000B5 -:1013B000000000000000000000000000000000002D -:1013C0000000000000000000008089008200008012 +:101370000000000000000000000000000000040861 +:10138000904080000000000000000000000000000D +:1013900000800000000000000000000000000000CD +:1013A00082A1831180038082000010008000000071 +:1013B00004110021000900080000000000000000E6 +:1013C000808000800000000000900084008900837D :1013D000000000000000000000000000000000000D :1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000001100000000DC -:10140000000000110000000000090020110400008D -:1014100000000005000009210000000500A1008077 -:101420000000000000C000000000100002830280E5 -:10143000410000000000000000000000000000006B -:101440000000000000000000000021A02190118990 -:101450000883000000000000000000000000000001 +:1013F00000000000000000000000000000000000ED +:1014000011800300410008030000000000000000FC +:10141000000000000091000000000000000000003B +:101420000000000010838080418800000000000060 +:1014300000000000000000000000000000000000AC +:101440000000000000040009000000000009008204 +:10145000000000000000000000000000000000008C :10146000000000000000000000000000000000007C -:101470000000000000000000000000000088008460 -:101480000000000000880004000000000088000543 -:1014900000000000000000A001000004000000089F -:1014A00000040000000000080082000001000008A5 -:1014B0000002010000000000000000000000000029 -:1014C0000000000000000000000000000091010981 -:1014D00000900189000000000000000000000000F2 +:10147000000000000000000000000000000000006C +:10148000000000A00000000000210000000000009B +:1014900000000000000002C0200210000000000058 +:1014A0000000000002088989401085090000000042 +:1014B00000000084000000000000000000000000A8 +:1014C0000000000000000000008300000000000099 +:1014D00000100000000000000000000000000000FC :1014E00000000000000000000000000000000000FC -:1014F00000000000000000000000000040000000AC -:101500001000100000000000000020000200080091 -:1015100090000100000001000800400100000000F0 -:10152000000000009000000000000000200000000B -:101530000000000188000000000000000000000022 -:101540000000000000000000000000000000040097 -:1015500020000000880000000000000000000000E3 +:1014F00000000000000000000000000000000000EC +:1015000000000000000001000000000100000000D9 +:101510000000000000001000000000008300000038 +:1015200000000000000088090088004010890000C9 +:1015300000010000000000000000010001010000A7 +:1015400000000000000008020000009000101000E1 +:101550000000000008000000000000000000000083 :10156000000000000000000000000000000000007B -:1015700000000000000000000000000000008000EB -:10158000000000008000000000000000100080004B -:10159000800000110400000020008000800803008B -:1015A000000000000000000000000000000000003B -:1015B00000020009002100100000000000000000EF -:1015C000000000000000000000000000000000001B -:1015D0000020000300410411000000000000000092 +:10157000000000000000000000000000000000006B +:101580000000000000000003111000110002000024 +:101590000000000000000000800000000000A1002A +:1015A0000000000000000000808900C01140804160 +:1015B0000009004000090009002011000504041181 +:1015C000000000000000000080800000008000801B +:1015D000800003001100090000000000000000006E :1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB -:10160000000080000000000000008000000080005A -:1016100080008000000011000000000900408000F0 -:1016200011000004800000000000800000000000A5 -:101630008000000880008000001100000000000011 -:10164000000000000000000000000000000000009A -:101650000000410421000800A0110000000000006B +:10160000000000000000000021401000210003083D +:101610000000000000000000000080400002008088 +:10162000000000000000000000000480890090001D +:101630009003000000000000000000050000000012 +:101640000000000000000000000080050000800095 +:101650000000000500008000000000000000000005 :10166000000000000000000000000000000000007A :10167000000000000000000000000000000000006A -:101680000000200008000200020082008200040026 -:10169000080040009000C0000300000000000000AF -:1016A00090C0010002012000200002000800080094 -:1016B0004000080002880400400002000000000012 -:1016C000000000000000000000000000000000001A -:1016D00000000000050488009000080000000000E1 +:10168000000000000000000000000109200011001F +:101690000001000000000000000000000800848835 +:1016A0000240020000000000000000000402A00050 +:1016B0001000A0000000000000000000000000007A +:1016C000000000000000000000000000C000040056 +:1016D0001000840090000200840008000000000058 :1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:101710000000000041000060000000000000418265 -:101720000060060000000000000000000000000053 -:1017300000000000000000000000000000000000A9 -:101740000000000000000000000000000000000099 -:10175000000000000000000000E0000000000000A9 +:10170000000000000000000000000000810000E078 +:1017100000000000000000000000000000000000C9 +:101720000000000084000000000000000000000035 +:101730000000000000000000000000000000810028 +:1017400000E0000000000000000000000000008138 +:10175000000007000000810000E000000000000021 :101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 -:10178000000000000000CF410C41000000006B434E -:101790002A02000000007C704C40000000000000A5 -:1017A000F0F00000FFFF00001717C300000000006A -:1017B000C3004D4D000000001717C30000000000DB +:10178000000000000000000000000000000000F069 +:1017900000F0000000000000000000000000000059 +:1017A0000B01050500000000000000000000000023 +:1017B00000FF08FFB230B23000000000000000005F :1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 +:1017D00000AA0000287DFFFF8A8AF575000000003E :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 -:101800000000000000000000CF7D0C7D0000000003 -:101810007F573E16000000007F734F43000000001A -:101820000000F0F00000000000001717FF3C00006F -:101830000000FF3C4D4D000000001717FF3C00006A +:1018000000000000000000000000000000000000D8 +:1018100000F000F0000000000000000000000000E8 +:10182000000005050808000000000000000000009E +:10183000000005FF00FFFFFFC3C300000000000021 :101840000000000000000000000000000000000098 -:101850000000000000000000000000C00082000046 +:10185000000000AA0003287D00000000FFFF000038 :101860000000000000000000000000000000000078 :101870000000000000000000000000000000000068 -:1018800000000000000000000000BE3CBE3C000064 -:10189000000082FC82FC0000000030F030F000000C -:1018A0000000000000003C3C0000FFFFFCFCBEBE4E -:1018B00000000000FCFCBEBE00000000BEBEFCFC40 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A00000000000000080D0FF00FA0000000000EF +:1018B00000000000000040400003000000000000A5 :1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000082000086 +:1018D00000000000CFCFCF0C00000000E40FEC0FA1 :1018E00000000000000000000000000000000000F8 :1018F00000000000000000000000000000000000E8 -:10190000000000000000000000000000BEFFBEFF5D -:101910000000000082FC82FC0000000033F333F37F -:1019200000000000000000003C3C00000000FCFC47 -:10193000BEBE00000000FCFCBEBE00000000BEBE3B -:10194000FCFC00000000000000000000000000009F -:101950000000000000000000000000000000000285 -:101960000002000000000000000000000000000075 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:101920000000000000001010A0A0FFFFFAFA000065 +:101930000000000000000000400000030000000064 +:101940000000000000000000000000000000000097 +:101950000000000000000C0CCF0C00000000E40FA1 +:10196000E40F000000000000000000000000000084 :101970000000000000000000000000000000000067 :101980000000000000000000000000000000000057 -:1019900030000000000000003000000000000000E7 -:1019A0003007C00C0000000015002A3FC54C00A8FD -:1019B00000003000000000000000300000000000C7 -:1019C00000613006000D0000000000000000000073 -:1019D0000000000000000000000000000000000007 -:1019E00000613007000D0000000000000000000052 +:101990000000000000000061000480090000000059 +:1019A0000000000000000000000030000000000007 +:1019B000000000000000000000610006000D0001B2 +:1019C00000610006000D00000061000680090000B3 +:1019D0000000000000000000A00000200000000047 +:1019E00000610002800D0000000000000000000007 :1019F00000000000000000000000000000000000E7 :101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000003C3C00FF0000000000003C3C00FFC8 -:101A300000000000000000000000000000000000A6 -:101A4000000000000000F0FFF0FF000000000000B8 -:101A50000000000000000000000000000000000086 -:101A6000000000F0AAC3C30FFFFF00000000000049 +:101A10000000000000000000FF5D5D5D00BEF0FE04 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000555D000001559E +:101A40000C000000000081A181810000000000283E +:101A5000FFEB00000000000000000000000000009C +:101A60000000000000000000000000000000000076 :101A70000000000000000000000000000000000066 :101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA000000000003C3C00FF0000000000003C3C47 -:101AB00000FF000000000000000000000000000027 -:101AC0000000000000000000DFDF1F1F000000001A -:101AD0000000000000000000000000000000000006 -:101AE00000000000FFF0AAC3FFFFAAAA0000000048 +:101A900000000000000000000000FF0C0C0C0082A1 +:101AA000F0F2000000000000000000000000000054 +:101AB000000000000000000000000000555500007C +:101AC00000000C000000000083A3838300000000DE +:101AD0000028FFEB000000000000000000000000F4 +:101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 :101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B20000000000000000F0F00FF00000000000098 -:101B30000F0F00FF00000000000000000000000088 -:101B4000000000000000000000005F50C0C0000066 +:101B1000000000000000000000000000FF5500551C +:101B200000000004000000000000000000000000B1 +:101B30000000000000000000000000000000C3C31F +:101B4000C3C3A0A0F0F000000000000000003C3C77 :101B50000000000000000000000000000000000085 -:101B60000000000000000000000002160216000045 +:101B60000000000000000FDF0F1F00000000000059 :101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA00000000000000000000F0F00FF0000000018 -:101BB00000000F0F00FF0000000000000000000008 -:101BC0000000000000000000000000005F50CFCFC8 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000002021616C5 -:101BF00000000000000000000000000000000000E5 -:101C00000000400000000000200000000000200054 -:101C10000000000000000000000000000000008044 -:101C2000000020000000010021000200010020004F -:101C30000002000000000000004000000000000062 -:101C400002800000200000000100200000000000D1 -:101C500002800000000000000200020000000000FE -:101C60008980000020000000000021000000020028 -:101C70002000000000000000000000000000000044 -:101C8000000000000000000000000800000000004C -:101C90000000000000000000000000000000000044 -:101CA000004000000000000002000400800002006C -:101CB00000000000000000000000000140004000A3 -:101CC00000000040000000000000020000000000D2 -:101CD0000000004040000000000000008000000004 -:101CE00000000440000000000000000002000000AE -:101CF0008000000000000000000000000000000064 -:101D00000040000000000000000020000000000073 +:101B90000000000000000000000000000000FF55F1 +:101BA00000550000000000000000000000000000E0 +:101BB0000000000000000000000000000000000025 +:101BC00003C300C30000000000000000000000008C +:101BD000FD3C0000000000000000000000000000CC +:101BE00000000000000000000F0F0F0F00000000B9 +:101BF00000000000000000000000000000002000C5 +:101C000000000000000000000000000000000000D4 +:101C10000000C000000000000000000000002010D4 +:101C20000000400000000000000000000000020072 +:101C300000010040200084000000C00000000000FF +:101C40002000C000020000000000000000000000B2 +:101C50008400A000C0002000000000000000000080 +:101C6000200010002000000000008800000000108C +:101C700088000000000000000000000000000000DC +:101C80000000000000000000000000000000000054 +:101C900000004000000000002100000000000000E3 +:101CA0000000000000000000000000000000000034 +:101CB00000000000004000000000000000000000E4 +:101CC0000000000000000000000000000000000014 +:101CD00000000000000000000004000000080000F8 +:101CE00000000000200000080000000000000000CC +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 :101D100000000000000000000000000000000000C3 -:101D2000001000000000000000000000000000089B -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D6000000001000300000000000000000000006F -:101D7000008000000000000004000000004000009F -:101D80000000000000000000000000000000004013 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000001000000000000000000000000020020 -:101DC0000000000000000000000000000000000013 -:101DD000000000880040000000000000000000003B -:101DE00000000000040008000000000000000200E5 -:101DF00000000004000000000000000000000000DF -:101E00000000000008000800820008000000080030 -:101E10000000000000004000000000000000000082 -:101E20000000000000000000000000000080000032 -:101E3000000001000003028000000100000000001B -:101E4000004100000000000000000000000000054C -:101E50000000000000000000000000000000000082 -:101E6000000000000000002100000100000001410E -:101E7000000501000100000801050000000000004D -:101E8000000000000000000000000000000008004A -:101E90000000000000000000000000001100000031 -:101EA00000000000000000002000000010000020E2 -:101EB000000000000200000080040000200000007C -:101EC00000001000000000000000210000000000E1 -:101ED00003000000000000000000000000000000FF -:101EE00000000082000041000000000020001100FE -:101EF000200000002000020000000200040000009A +:101D200000100000000000000000000000000000A3 +:101D30000000000000000000000000210000000082 +:101D40000000000000000000000000090003000087 +:101D50000000000000000000000000000000100073 +:101D60000000001000000000000000000200000061 +:101D70000000000000000000000000000000000063 +:101D8000000000000000000000000008000000004B +:101D90000000000000400000000000000000000003 +:101DA000000000000000000000000008000000002B +:101DB0000000000000000000000000000000000023 +:101DC000000000000000000000000000000800000B +:101DD0000000000000000000000000000000000003 +:101DE00000400000000000000000000800080000A3 +:101DF00000000000004000000000000000000000A3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E2000000000000000000004000400400000006A +:101E300090001000000000000000000000030000FF +:101E40000000000000000000000000000000000092 +:101E50000000000000000008000000100400000066 +:101E6000000000000000000000000400000000006E +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000010001100100000000000800081 +:101EB0000000000000C005C000000000000000009D +:101EC000000000000000000000A000000000000072 +:101ED00000000000050000000082008200100000E9 +:101EE00000000000000000000300000000000000EF +:101EF00000000000000005000000000000000000DD :101F000000000000000000000000000000000000D1 :101F100000000000000000000000000000000000C1 -:101F20000000000000000000000000000000C000F1 -:101F3000880088000100100011001080000041009E -:101F4000008011002000A0000000000000008200BE -:101F50000000000000000000000000400800000039 -:101F60000400000000000000000000000000040069 -:101F7000200004000400C000000000000000000079 +:101F200000000000000000000000000000000011A0 +:101F3000000200000000000000000000000000009F +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000002000800100067 +:101F6000000000000000C000000000008241820963 +:101F700000400040000000000000000000000000E1 :101F80000000000000000000000000000000000051 :101F90000000000000000000000000000000000041 :101FA0000000000000000000000000000000000031 -:101FB000000000000000100080008200804000004F -:101FC00010000920A00280C00000000040000000B6 -:101FD00000C00000000000C0009000900040000021 -:101FE000000080020000000000000000000000006F -:101FF000C100800080008000410800000000020055 -:1020000000110000000000000000000000000000BF +:101FB0000000008900000000000020000000000078 +:101FC0000000000000000000000000000000000011 +:101FD00000000800000000000000000000000000F9 +:101FE00040000000000000000800000000000000A9 +:101FF0004000050000000900000000001000000083 +:1020000000000000000000000000000000000000D0 :1020100000000000000000000000000000000000C0 -:102020000000000000000000000000002000000090 -:102030002000040000410084000401000508044160 -:10204000000001080008002000040000000000005B -:102050000000000000000000000000000800000078 -:102060000000C08000800400040004000400040399 -:10207000000000200404200020000041C0002110C6 -:10208000202100000000000000000000000000000F -:102090000000000000000000090000000000000037 -:1020A000002000000000000000000000008400008C -:1020B0000000000080840000002141012008A008E9 -:1020C000800000000401000100A100850000000064 -:1020D0000300009000000000000000000002000863 -:1020E00000A02000002000208000800080008000F0 -:1020F00080000000000180018000800011080000C5 -:10210000A00880C0000000000000000000000000E7 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000080000000088 +:102050000000000000000000000000000000000080 +:102060000000000008030003000000080008000052 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000008000000000000000038 +:1020A0000000000000000000000000000000000030 +:1020B0000000118800A000080000000000000000DF +:1020C0000000000000000000008800000000000088 +:1020D0000000000009A00008000800020000000045 +:1020E00000000000000000000000000000000000F0 +:1020F0000000000000000000210800002000000097 +:1021000000000800000000000000000000000000C7 :1021100000000000000000000000000000000000BF :1021200000000000000000000000000000000000AF -:1021300000000000000300050000002102080088E4 -:10214000400204080000A0022040000410820002A7 -:10215000820500000002004100050000004100006F -:1021600000410040000000004000000004000000AA -:10217000C000C00004008800004100002041201180 -:102180002000C0100004000000000000000000005B +:10213000000020000000010000000000000000007E +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000010000000000000000000000000004F +:10218000000000000000000000000000000000004F :10219000000000000000000000000000000000003F :1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000080019E -:1021C0000020000080010000090080004003A120E1 -:1021D00000020000000000000000000009000000F4 -:1021E000000000000200000000000000000080006D -:1021F00000000000000088000000000000008000D7 -:1022000080008000000021010000000000000000AC +:1021B0000000000000000000209000000000020469 +:1021C00000000040020000000000000000020000CB +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F0000000000000000000000000881000000047 +:1022000000000000000000000000000000000000CE :1022100000000000000000000000000000000000BE :1022200000000000000000000000000000000000AE -:10223000000000880000000800C000200004000228 -:102240000000A00001000000000300C00020008288 -:1022500000040008008800000008000000040000DE -:10226000000400C000C000000008000000000000E2 -:10227000000040C000C0001004020202C0C00411EF -:10228000829002C01084A00800C10000000000007D +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E :10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E -:1022B0000000000000000000008000800000090015 -:1022C00000001100000002110000000011800083D6 -:1022D0000500000000800000000000800000008079 +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE :1022E00000000000000000000000000000000000EE -:1022F0000000000080800000000080800084000258 -:1023000082A08010008410100480002000000000D3 +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD :1023100000000000000000000000000000000000BD :1023200000000000000000000000000000000000AD -:102330000000000000000083000000000000008496 -:10234000000000001141800000830080000011099E -:1023500000830040008000000083000000000000B7 -:1023600000A0000000000000009000040000000039 -:10237000000000000000000080908040000000008D -:1023800085000210840085000400800083030000A3 +:10233000000000000000000000000000400020003D +:102340000440050000000000000000000000000044 +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D :10239000000000000000000000000000000000003D :1023A000000000000000000000000000000000002D -:1023B0000000000000000000000900100002000002 -:1023C0000008009000880101908800910002000040 -:1023D00001000008009000880000000900840082CD -:1023E0000000000800A000000000004100A0000064 -:1023F000000000880000008402000809A0C10288D3 -:1024000000024000C0C0040008A000000800C10194 +:1023B00000000000000000000000000000000120FC +:1023C000010001010000000000000000000000000A +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC -:10243000000000000000000010000000000010007C -:10244000900000001000080000902001040090009F -:102450000000A0004001880088000000000000008B -:102460004000040000000000880040000000000060 -:102470000000000000000200000020900010041086 -:1024800008C010020010000100C00808010801087F -:1024900000C000000000000000000000000000007C +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C :1024A000000000000000000000000000000000002C -:1024B000000000000000000000008000000000009C -:1024C00080008900000000000900098080110000E0 -:1024D000890000000500001180004000000000009D +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC :1024E00000000000000000000000000000000000EC -:1024F00000000000040000000000000010800080C8 -:10250000000080808089008209100011808440A131 -:1025100003910480000000000000000000000000A3 +:1024F00000000000000000000000000000000000DC +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB -:10253000000000000000000000000000800000001B -:102540000000800000008041000000000011000930 -:1025500011000000000000000302000000008000E5 -:10256000800000008000000000000000000000006B -:10257000000000000000000000080000000000044F -:1025800080080080800008408288C10011118440CA -:10259000048880000908000000000000000000001E +:10253000000000000000000000000000000000009B +:1025400000000000100011002100204000000000E9 +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:10258000000000000000000000000000000000004B +:10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B -:1025B0000000000000000000000000000000080013 -:1025C000040008000800840010010400020000005C -:1025D0000000000000000000A00084018200040050 -:1025E0000800040008000800040082004000040005 -:1025F000C000C000200040000000000100000000FA -:10260000820004C1C040080091101011028810001F -:1026100008A11083088810010000000000000000DD +:1025B000000000000000000000000000000000001B +:1025C0000000000000000104010001000101000002 +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA :1026200000000000000000000000000000000000AA :10263000000000000000000000000000000000009A -:10264000000000000000000041820060060042001F -:1026500088410060060042000000418200600600E0 +:102640000000000000000000820000E00000000028 +:10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A -:102670000000000000000000000000000000070053 -:1026800000000000000007000000000000E007005C -:102690000000000000E0000000000000000000005A +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A :1026A000000000000000000000000000000000002A :1026B000000000000000000000000000000000001A -:1026C0000000001BC31B000000000131C1F100002D -:1026D00000000000666600003C3C000001C10DCD1A -:1026E0000000000081BD0303000000008D8D003C50 -:1026F00000000000C300990F00000000000000006F -:1027000000000000082C4A6EFF664B4BFFB400B47B -:10271000F6F6060600CFCFCF8DCFFFFF00000000FA +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 :102730000000000000000000000000000000000099 -:10274000000000003C1BFF1B000000000D3DCDFD04 -:10275000000000000000666600003C3C000031F113 -:102760003DFD0000000081BD3F3F000000008D8D59 -:10277000C3FF00000000C3FF990F0000000000002D -:1027800000000000000089ADCBEF99004B4BFFB477 -:1027900000B4FCFC0C0C00CFCFCF8DCFFFFF0000AE +:102740000000000000000000000000000000000089 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 +:102790000000000000000000000000000000000039 :1027A0000000000000000000000000000000000029 :1027B0000000000000000000000000000000000019 :1027C0000000000000000000000000000000000009 @@ -160426,288 +160426,288 @@ :1028100000000000000000000000000000000000B8 :1028200000000000000000000000000000000000A8 :102830000000000000000000000000000000000098 -:1028400000000000000000005A185A1800000000A4 -:1028500000FF3D3D00000000666600000F0F000015 -:102860000000FFFFFD3D00000000BDBDFF3C00007B -:102870000000BDBDBDBD0000000000C3FF000000A2 -:10288000000000000000000000000F0FE700000F34 -:1028900070700CFCFCFC666FFF6FFFFFC3C3FFFF93 -:1028A000C3810000000000000000000000000000E4 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000000048 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 :1028B0000000000000000000000000000000000018 -:1028C00000000000000000000000DB99DB99000020 -:1028D000000000FFFDFD00000000666600000F0F15 -:1028E000000000000000FD3D00000000BDBDFF3CF9 -:1028F00000000000FF3CFF3C00000000FFC3FF00A1 -:102900000000000000000000000000000F0FE79929 -:10291000000F10100C0CFC0C00099909FFFFFFF0D0 -:10292000FFFFFFBD000000000000000000000000ED +:1028C0000000000000000000000000000000000008 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 :102930000000000000000000000000000000000097 -:102940000000000000000000000000000000300057 -:10295000000000000561343FC50D00A015002A3FAE -:10296000C54C00A800000500343FC50C00A00000C5 -:1029700030000000000000003000000000000000F7 -:1029800030000000000005000A08050000A0050056 -:102990003408059000A000610009000100004063B8 -:1029A00080010021920200000000000000000000F1 +:102940000000000000000000000000000000000087 +:102950000000000000610004800D00000000000085 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 :1029B0000000000000000000000000000000000017 :1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 -:1029E0000F0FF0F0000000000000FF00F0F000000A +:1029D000000000000000D717D41400000000000021 +:1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 :102A000000000000000000000000000000000000C6 -:102A10000000000000000000FF1700173A3A303FA6 -:102A2000FF003C3C30F330F30000000000000000E9 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 :102A30000000000000000000000000000000000096 :102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000000000076 -:102A600000000F0FF0F0000000000000FF00F0F089 +:102A50000000000000000000D717D41400000000A0 +:102A60000000000000000000000000000000000066 :102A70000000000000000000000000000000000056 :102A80000000000000000000000000000000000046 -:102A900000000000000000000000FF1700173A3A95 -:102AA000303FFF005555B2B2B2B200000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 :102AB0000000000000000000000000000000000016 :102AC0000000000000000000000000000000000006 -:102AD00000000000000000000000000000000000F6 -:102AE000000000000F0F3C3C000000000000FF0051 -:102AF0003C3C00000000000000000000000000005E +:102AD00000000000000000000000000000000040B6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 :102B000000000000000000000000000000000000C5 -:102B1000000000000000000000000000FF3C003C3E -:102B2000FA00FAFF5555FF3C3F3F3A3A00000000DB +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 :102B30000000000000000000000000000000000095 :102B40000000000000000000000000000000000085 :102B50000000000000000000000000000000000075 -:102B60000000000000000F0F3C3C000000000000CF -:102B7000FF003C3C000000000000000000000000DE +:102B60000050001000000000000000000000000005 +:102B70000000000000000000000000000000000055 :102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000FF0F27 -:102BA000000F500050FF5555003C30303A3A0000BD -:102BB00000000000200000002000000020000000B5 -:102BC0000000000000000000000000000000000005 -:102BD0000000000020004000200000002000000055 -:102BE00000000000000000000000000001000000E4 -:102BF0000000000000002084200020000000208051 -:102C00000000000000000080000000000000000044 -:102C10000000000000002000200020000000200034 -:102C2000000000000000000088000000000002001A -:102C30000000000000000000400040000000000014 -:102C40000000000000000000000040000002000042 -:102C500000004000000000000000400040000000B4 -:102C600000000000000000004000400000000200E2 -:102C70000000000000004000004000400000400252 -:102C80000040000040000000004040004000000004 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000020001000400040002004000041 +:102BC00000000000000000004000000000000000C5 +:102BD0000000000000002000408041802000100024 +:102BE00000800480A0800280218002800280000298 +:102BF00088800480848041004000880020002000FC +:102C00000000880020000000201084002000C00088 +:102C100088002000200088002000400020002000C4 +:102C20000000008020001000400020000000400054 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C500000000000000000000000004002400002F0 +:102C600000400040004000400040024000408040E2 +:102C70000000004000404040020000000000004012 +:102C80000000400000000000000000000000000004 :102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000200000000000000000002 -:102CD00008000000000000000000000000000000EC -:102CE00000000000000000000000020002000000E0 -:102CF00000000000000000000010000000000000C4 -:102D000000000000000000000009000000000000BA -:102D100000000000000000000800000002000000A9 -:102D20000000000000000000080000000000020099 -:102D30000000000000000000000000000000000093 -:102D4000000000000000000000080000000000007B +:102CA0000040100000400000000080000000000014 +:102CB000000000000000080000000000000000000C +:102CC0000000000000000000000000000000000004 +:102CD0000000000000000000000000000000900064 +:102CE00000000000010000108200820000000100CE +:102CF000000000000000000000108800000000003C +:102D000000000400000082000800820000000000B3 +:102D1000000000000000000008000000200020204B +:102D2000040420200404022004002010000090006D +:102D3000200900000000000000000000000000006A +:102D4000000000000000000000000400000000007F :102D50000000000000000000000000000000000073 -:102D6000000000000000000000080000000000005B -:102D70000000000000000000000000000000000053 -:102D800000000000000000000000008800000000BB -:102D900000880000000000000000000000000000AB -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000008000800000000013 -:102DC00000000000000000000000000800000000FB +:102D60002000000008000200000003000000000036 +:102D70000200090000000000000004000400000040 +:102D8000200000000000000000000000000009001A +:102D90000000000009004100000000000000800069 +:102DA0008001800180018001A0018000800000007E +:102DB000000080000084000000000000000000000F +:102DC0000000000000000000000000000000000003 :102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF0000000000000000000000000009000000043 -:102E000000000000000000000000000090410000F1 -:102E1000000084000000000000000000000000002E -:102E200000000000000000000000000000000000A2 -:102E300000000000000090000000002000200000C2 +:102DE0000000000002000000400000004000000061 +:102DF000840000000000000001000000000000004E +:102E00000000000000000000C00000000000000002 +:102E100000000000000000000000000000000800AA +:102E200000000100000000000000010000000000A0 +:102E30000000900000000000000000000000000002 :102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E6000000011000000000000000010000400102D -:102E700000000000008400000000000000000000CE -:102E8000000000000500000000000000000000003D -:102E90000500000000000000000040040000008267 -:102EA0000000000000000000000000A000400084BE -:102EB000000000C000C000C000C000000000000012 -:102EC0000000000000000000000000000000000002 +:102E5000000003000000000000000000000000006F +:102E60002100000000008000000000004000000081 +:102E70000000000000000000000002000000000050 +:102E80000000080000000000000008000000000032 +:102E90000000000008000000000800000000000022 +:102EA000000000000400000000000000020000001C +:102EB000000000000000000008A00000000000006A +:102EC00000000000080000000000000000000000FA :102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000040000000000000000000009B4 -:102F100000000000000000000000000000000000B1 -:102F20000000000010000000900000000000000001 -:102F300020000000000000008200000000000000EF +:102EE0000000010500400000A100020900050200E9 +:102EF0000200204088110100004000000040A100B5 +:102F000083800000820000000000A000C0000000DC +:102F1000820010008400040000000800000084000B +:102F20008200040020002000040020000000820035 +:102F3000200000400803840008000000000000009A :102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F8000000000000000000020040000000000001D -:102F900000000000000000000088000000000000A9 -:102FA00000000000000000000000000000000040E1 -:102FB0000000000000000000000000000000010010 +:102F50000000000000000000000000000000100061 +:102F600000000000020008852100020080840000AB +:102F70008984000000010000028809890000000126 +:102F800002000240000000000000000000000000FD +:102F90000000000000000000000000000000000031 +:102FA000000000000000C0008800800080000000D9 +:102FB000000000000000000000000082000000008F :102FC0000000000000000000000000000000000001 :102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 +:102FE0000000000000000080000000800000018060 :102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 +:1030000000000000000000000000100000000000B0 :1030100000000000000000000000000000000000B0 -:103020000000000000000000000000100000000090 -:103030000000000000000000000000000000000090 -:10304000040000000000000000000000000000007C -:10305000000000000500000000000000000000006B -:1030600000000088000000000000000000040000D4 -:1030700000000900000800C0000000080000000077 -:1030800000000004210000A0000000000000000477 -:103090000000000400000000100003000000000019 -:1030A00000000000000800080000050000000010FB -:1030B000008411C01110020800A000C0000000C070 -:1030C000008400000000000000200000000000005C +:1030200090000000000000000000000020200000D0 +:103030000400040000212000000000000000000047 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:1030600000000000000000000040000000400000E0 +:10307000024000040000000000000000000000000A +:103080000000000000000000001000000000000030 +:103090000000000000000000080000000000000028 +:1030A000000000000000000000000000000080019F +:1030B0000000800080000000800000000000000090 +:1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F000000000002000000000000000840000002C -:1031000000000000400000050002020040008805A9 -:103110000000A041000000040000000000000000CA -:10312000000000000000000000000000000000009F -:10313000000000000000000000000021400000002E -:103140000009000000000000000000010000000075 +:1030E00000001000000002000800010000000100C4 +:1030F00000000010010400400080004002C00040B9 +:10310000000000000000010000008300000000003B +:1031100000000000000000000000000000000000AF +:103120000000000008000000000000004000000057 +:10313000000001002000C000040400004000000066 +:10314000000000030000000000000000000000007C :10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:10319000000400000000000000000000000000002B +:10316000000000000000000000000000020000005D +:103170000284000020000200090500400000004019 +:1031800000000088000000000200000002000000B3 +:10319000000000000000000000000000000000002F :1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000C00090000000000000AF +:1031B0000000000004008000020080040000000005 +:1031C000000000000084000000000000000000007B :1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF -:1032000000040004000400010000000000080008A1 -:10321000000400000000000400040004000000009E +:1031E000000000000000000000000000000000C01F +:1031F00000000004000000C000000000000000C04B +:1032000000000000A0C0000000C00000000040C09E +:1032100000000000000000000000000000000000AE :10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000800080000000007E +:103230001091009110080220009100910285084031 +:1032400041084084008302020000000000000000EA :10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000008020000000000000000000000000008E +:1032700000800000008000000080000000000000CE +:10328000008000000000000000000080000000003E +:10329000000000000000000000000000000000002E :1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C000000000000000000000000000000080007E -:1032D00080800000000000000000000000000000EE +:1032B00000008011008800898000001100A0000437 +:1032C000800988A00021008880090000000000001B +:1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:10330000000000000090000000000000000000A08D -:1033100000000000000000A1000000000000000507 +:1032F00000008000000000008000000000000000CE +:1033000080000000000000008000000000000000BD +:10331000000080000000000000000000000000002D :10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D -:103350008400C09000000000000000000000000099 +:10333000000000000800410009118040000000006A +:10334000000080008800C18200110280000000009F +:10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:1033800000000000000000090084000000000000B0 -:10339000000800A0000000000008008200000000FB -:1033A0000084008200000000000000000000000017 -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D0000000029000C0000000000000000000009B +:1033700000000000080000000000C0000000000085 +:103380000000C000000000000000C00000000000BD +:1033900000000000C000000000000000000000006D +:1033A000000000000000000000000000000000001D +:1033B0000000000000000110080010019000000053 +:1033C00000000088C000020010C1044105C00000D8 +:1033D00000000000000000000000000000000000ED :1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000C00008000000F4 -:10341000C00000000000C000040000000000080020 -:103420000400000000001000000000000000000088 -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:10345000000000000080008000000000000000006C +:1033F00000000000000000000000000400C0080001 +:103400000008000000C000000000000000C0000034 +:1034100000000000000000C00000000000000000EC +:10342000000000000000000000000000000000009C +:103430000000000000000000004100100008100122 +:10344000008300409085088941020082C01020045A +:10345000000000000000000000000000000000006C :10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:1034900000000000000000000000800000000000AC -:1034A000000080000000000000000000000000009C -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000008011800500000000000000000000D6 +:1034700000000000000000000000000000000080CC +:10348000800000800000008000000000000000803C +:1034900000000000000000000080000000000000AC +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000008104020890B +:1034C0008011000800A0C0048011410000808880A5 +:1034D00040000000000000000000000000000000AC :1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000800080000000BB -:10351000000000000000000000008000000000002B -:10352000000000000000000000008000000000001B -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:1035500000000000C001200000000000000000008A +:1034F000000000000000000000000000800000004C +:10350000000080000000008000008000000000003B +:10351000000000008000000000000000000000002B +:10352000000000000000000000000000000000009B +:1035300000000000000000000000000000821100F8 +:103540000980111180050000000080008002808049 +:1035500000800011000000000000000000000000DA :10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:1035800000000000000000000000000040000400F7 -:10359000040004000000A0008400A0000800040053 -:1035A000820084000400040004008800040000007D -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000210000060000000000C4 +:103570000000000000000000000000000000080043 +:1035800000000000C000000000088400C000C0A0CF +:10359000000000000000C0000000008240000000A9 +:1035A000000000000000000000000000000000001B +:1035B0000000000000000000000000000000000506 +:1035C0000190000800009000200084C008000491D1 +:1035D0000402900420000000000000000000000031 :1035E00000000000000000000000000000000000DB :1035F00000000000000000000000000000000000CB :1036000000000000000000000000000000000000BA :1036100000000000000000000000000000000000AA :10362000000000000000000000000000000000009A :10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A -:103650000000000000000000000000FF000000FF6C +:10364000818100E007000000818100E007000000A8 +:10365000810000E00000484200000000000000007F :10366000000000000000000000000000000000005A :10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A -:10369000F434C4040000000000000C0CD714000037 -:1036A00000003C001717000000000FC35500000089 +:10368000FF00FF00FFFFFF00FFFFC3C3FFFF0F0F9F +:10369000FFFFFF00FFFF00000000FFFFC3C3FFFFAD +:1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000FF0000EB -:1036E00000FF0000000000000000000000000000DB +:1036C000000000000000FAFCFAFC28E82BEB0000E8 +:1036D000FFFF0000000000001122000000000000B9 +:1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000000000B9 -:103710000000F737C707000000000000CFCFD71424 -:1037200000000000FFC31717000000000FC355FF83 +:103700000000FF00FF00FFFFFF00FFFFC3C3FFFF3C +:103710000F0FFFFFFF00FFFFFFFF0000FFFFC3C30E +:10372000FFFFFFFF0000000000000000000000009D :103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 -:10375000000000000000000000000000FF0000006A -:1037600000FFFFFF0000000000000000000000005C +:1037400000000000000000000A0C0A0C28E82BEB27 +:10375000F03CF03C010000001122000000000000DD +:103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 -:10379000000000003EFE3EFE0000000000007C7CB9 -:1037A0007C7C00000000BEBE3C3C00000000FFFF2F -:1037B000AA0000000000000000000000000000005F -:1037C00000000000000000000000000000000000F9 -:1037D0000000000000000000000000000000FF00EA -:1037E000000000FFFFFF00000000000000000000DC +:1037800000000000F0F0FFFFC3C3FFFF0000FFFFD9 +:103790000000FFFFC3C3FFFFAAAAFFFF0000C3C3CF +:1037A000FFFFFFFF0000000000000000000000001D +:1037B0000000000000000000000000000000000009 +:1037C000000000000000FD5DA808550F550FFD5DCD +:1037D000A808000000000408102024008100000058 +:1037E00000000000000000000000000000000000D9 :1037F00000000000000000000000000000000000C9 -:1038000000000000000000000000000000000000B8 -:103810000000000000003EFE3EFE00000000000030 -:10382000FEFEFEFE00000000BEBEFFFF0000000026 -:10383000FFFFAAFF000000000000000000000000E1 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:10386000038203380C0082C000000000000000004A +:10380000000000000000F0F0FFFFC3C3FFFFFFFF58 +:10381000FFFFFFFFFFFFC3C3FFFFAAAAFFFF0000D8 +:10382000C3C3FFFF00000000000000000000000014 +:103830000000000000000000000000000000000088 +:103840000000000000000000FD5DA80855FF5500C5 +:10385000FD5DA808FFFF00000102408000240081F8 +:103860000000000000000000000000000000000058 :103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:1038900000000000000000000000300000000000F8 -:1038A00000000000300000000000000030000000B8 -:1038B00000000000300000000000000000000000D8 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 +:1038800000000000000000004002800000209202C2 +:10389000408280000020920240828000002092023C +:1038A00000004082800000208A020000000000002A +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000006100208001F6 +:1038D00000000061002280091206006100068005D8 +:1038E00008000000000000000000000000000000D0 :1038F00000000000000000000000000000000000C8 :1039000000000000000000000000000000000000B7 :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 +:10394000000000000000000000000000D717D7179B +:1039500028787D780000000028787D78000000003D :103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 :103980000000000000000000000000000000000037 :103990000000000000000000000000000000000027 :1039A0000000000000000000000000000000000017 :1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 +:1039C0000000000000000000000000000000D4140F +:1039D000D41428787D780000000028787D780000D5 :1039E00000000000000000000000000000000000D7 :1039F00000000000000000000000000000000000C7 :103A000000000000000000000000000000000000B6 @@ -160715,202 +160715,202 @@ :103A20000000000000000000000000000000000096 :103A30000000000000000000000000000000000086 :103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 +:103A5000FFAA5F0A787D787DFFC33F030000000066 +:103A600030303C30FAFABEBE00000000000000001A :103A70000000000000000000000000000000000046 :103A80000000000000000000000000000000000036 :103A90000000000000000000000000000000000026 :103AA0000000000000000000000000000000000016 :103AB0000000000000000000000000000000000006 :103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B00000000008000800080200000000100000014 -:103B10000020008000800080008000000000000085 -:103B20000100008001000080200000000000000073 -:103B30000000008000800080008000000000000085 -:103B40000000020000000000000020004000000013 -:103B500000008800C000000000000000000000001D -:103B600000002000000000000000040000004000F1 -:103B70000000000000000002000000000000000043 -:103B80000000000000200020002000900000040041 -:103B900000000001002000200020002000000000A4 -:103BA000000004004020040000200000000000008D -:103BB0000000000000200020002000200000400045 -:103BC00000000000000000000000000000000000F5 -:103BD0000002000000000040000000000000400063 -:103BE00000000000000000000000000000000000D5 -:103BF00004000000000000000000000000000200BF -:103C000004000000000000000000080000000000A8 -:103C100000000000000000000000000000000000A4 -:103C20000200000000000000000000000000000092 -:103C30000000000000000000000000000000004044 -:103C40000000000000000000000000000041000033 -:103C50000000000002000000000900000000000059 -:103C60000000000000000200000000000000000052 +:103AD0000000F5A0550078287828FCC03C000000C4 +:103AE0000000303C3C3C50501414000040000000EA +:103AF0001000900000000000200000000000000006 +:103B000000000000400000004000000040000000F5 +:103B10002000400000000000200084008400840099 +:103B20008400000020000000200000038800200026 +:103B30008400200020008400840020004000200039 +:103B40002000880088002000A100200088002000BC +:103B5000C100200020000000000020000000200024 +:103B60000008C00020000000C0002000000000008D +:103B70000000000000000000000000004000000005 +:103B800000000000004041C00000410000A020C033 +:103B900000C0000000C005C000C0000000A041C07F +:103BA00000C0000000000000000000000000000055 +:103BB00000000000000000000000000000004100C4 +:103BC00000000000000000000000020000000000F3 +:103BD00000000200000000000000090000000000DA +:103BE00010000000000000000000000000000000C5 +:103BF00000000000000000000000000000000000C5 +:103C00000000100000000200020008000200020094 +:103C10000209020000409040020090402000020093 +:103C20000041849020090000000000000000000016 +:103C300000000000001084100000000000000000E0 +:103C4000A020A000080004030000000008000000FD +:103C50000000000000000000000000000000000064 +:103C600000002000900000040000000000000000A0 :103C70000000000000000000000000000000000044 -:103C8000000000000000000000000000000800002C -:103C90000000000000000000000000000000000024 -:103CA000000000000000000000000000000800000C +:103C800000000000000000008000800000008000B4 +:103C900080008000800000010001800000018000A1 +:103CA00080000000004080000000000000000000D4 :103CB0000000000000000000000000000000000004 -:103CC000000000000000000000000000000000C034 +:103CC00000000001000080008000000000000000F3 :103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00020000000000000000000000000000000A4 +:103CE00000000000800000000001008400000000CF +:103CF0000084000000000000000000000000000040 :103D000000000000000000000000000000000000B3 -:103D1000040000000000000000000000000000009F -:103D20008200000001210000000090000000000857 -:103D30000000000001000141000000000000000040 -:103D400000008300000001000000000000000000EF -:103D500000009000000000000000000000000000D3 -:103D60000000000000000000000000000041000012 +:103D1000000000000000000088000000000000001B +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000001000000000072 +:103D500000000000C0080021002100210000000038 +:103D600000000088000000100010010800000000A2 :103D70000000000000000000000000000000000043 -:103D8000040000000000000000000000000000002F +:103D80000000000000000000000000000000000033 :103D90000000000000000000000000000000000023 -:103DA00000000000000004000000000000004100CE -:103DB00000000000000004000400000000000000FB -:103DC00000000000040000000400000000000000EB -:103DD00000000000000203000000000000000000DE -:103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E1000000000000400040000000000000000009A -:103E20000000000000000000000000000000000092 -:103E3000000000000400000000000000000000007E -:103E4000000000000000000004000000000004006A -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 +:103DA000000000000000040000000000000000000F +:103DB0000000000000000000000000000000000003 +:103DC00000000000000008000000000004004100A6 +:103DD00009000000000000000000080003000000CF +:103DE000080008000040080005880000200041008D +:103DF00000000800050000000000000000000000B6 +:103E0000000000000000000084000000000000002E +:103E1000000000000000000084000000000000001E +:103E20000000000090808804000400040040880026 +:103E30000000000000000000000000000000400042 +:103E400082000000000000000505000000000800DE +:103E500000000200C0000200080002000000C000D4 +:103E60000200000090000000840940000800820069 +:103E70000011080000000000000000000000000029 :103E80000000000000000000000000000000000032 -:103E90000000000000008000800000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB000000000000008800000000000000000007A -:103EC0000000000000000000000080000000000072 -:103ED00000000000000000040000000000000000DE -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 +:103E90000000000000000000000000000000000022 +:103EA00000000000008400400001000520C10991CD +:103EB0000000008200000000000000880000008870 +:103EC000000000000000000000008400000000006E +:103ED0000000000080000000800000008000000062 +:103EE0000000800000000000200000000000000032 +:103EF0000800009000080000000000000000000022 :103F000000000000000000000000000000000000B1 -:103F10000000000000000008000000000000008019 -:103F2000000000000000000000000000000004008D -:103F30000000000000000000000000000000000081 -:103F400000800000000000000000000000000000F1 -:103F50000080008000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F70000000000000000000000000000000000041 +:103F100000000000000000000000000000000000A1 +:103F200000000000900000001000000000000000F1 +:103F30000000000000000000000000000011000070 +:103F4000000000000000000000000000000004006D +:103F5000040004000483C000000000210080000071 +:103F60000000020800000080C080000000A0208047 +:103F700000800100000000000000000000000000C0 :103F80000000000000000000000000000000000031 :103F90000000000000000000000000000000000021 -:103FA00000200000000000100000000003000000DE -:103FB0008000000021000000000000000000000060 -:103FC00000000020000000000000000000000000D1 -:103FD00000000020002000000000000000000000A1 -:103FE00000000000000000A0000000000000000031 -:103FF00000100000000000C00000000000C0000031 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 +:103FD0000000000000000040000000000000004061 +:103FE000000000008000000003400040030000408B +:103FF00080400040020003000008030000080000A9 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 -:10402000002100000000000000000000000004006B -:10403000002100000000000000000000000000005F -:10404000000000410000000000000000000000002F -:1040500000000041000000000000000020000000FF +:104020000000000000000800000000000100008007 +:104030002004010401110000000000110000000034 +:104040000000000000000000000000000000000070 +:104050000000000000000000C00800000000000890 :104060000000000000000000000000000000000050 -:10407000000000000000000000000000040000003C +:104070000000000000000000000008000000000038 :104080000000000000000000000000000000000030 :104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B0008000000000000000000000000000000080 +:1040A00000000000000000000000000000842084E8 +:1040B00041048000208420880000210040C00300CB :1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000002000C0 -:1040E00000000000000021000000000000000000AF -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF -:104110000000000000000000000000C0009000004F -:10412000000000C000900000000000C000900000EF -:10413000000000C000900000000000C000900000DF -:104140000000000300C000900000000000C00090CC -:104150000000000000C0009000000000000000000F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F000000020002000000400000000000000007C +:1041000000080000000000000000000000000000A7 +:10411000000000000000000000000000002000007F +:10412000000000C000000000009000C001208800D6 +:10413000000001C10020900100010000000000000B +:10414000000000000000000000000000000000006F +:1041500000000000C08800900084020800C0000039 +:104160000008000000C000000000000000C00000C7 +:104170000010000000C08800900040000000000017 :10418000000000000000000000000000000000002F -:10419000000000000000000000000000118000800E -:1041A000000000000080008000000000008000800F -:1041B00000000000008000800000000000800080FF -:1041C000000000000000008000800000000000806F -:1041D000008000000000008000800000000000005F -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF +:10419000000000000000000000000000000000001F +:1041A000000000000080000000000000008003000C +:1041B0000000000011C000210004004000000000C9 +:1041C00000000000000000000000000000000000EF +:1041D00000000000000080000000008000800080DF +:1041E00000000000000000800000000000000080CF +:1041F000000000800000008040000000000000007F :1042000000000000000000000000000000000000AE :10421000000000000000000000000000000000009E -:10422000800000008080000080000000808000008E -:10423000800000008080000080000000808000007E -:10424000800000008080000000008000000080806E -:10425000000080000000808000008000000080805E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E +:10422000000000008000000000400000800000004E +:1042300000000000800005004140041182100000D1 +:10424000000000000000000000000000000000006E +:1042500000000000000000008000002000008080BE +:1042600000000000000080008000000000008000CE +:10427000000000100000800000000000000080032B :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E -:1042A000000082000000C090000082000000C0906A -:1042B000000082000000C090000082000000C0905A -:1042C000000082000000C09000000000820000009A -:1042D000C090000082000000C0900000820000003A -:1042E000C09000000000000000000000000000007E -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD +:1042A000000000000000C000000000000000C0008E +:1042B000000000000000C09000C000000101C1012A +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000880090000202C2 +:1042E0000890000000000000C00002000000000074 +:1042F000C000000000010000C000004020000000DD +:10430000C0010000000000000000000000000000EC :10431000000000000000000000000000000000009D -:10432000000000000000009000C0000000000090AD -:1043300000C000000000029000C0000000000090DB -:1043400000C000000000009000C00000000000005D -:10435000009000C000000000C09000C000000000FD -:10436000009000C0000000000000000000000000FD -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D +:10432000000000000000002000C00000000000208D +:1043300000C000000001002000C1000100010021B8 +:1043400001C10000000000000000000000000000AB +:10435000000000000000000000000000022000201B +:10436000000288C000900000000000C004000000AF +:10437000000800C000900000000000C02000000104 +:10438000000101C10000000000000000000000006A :10439000000000000000000000000000000000001D -:1043A000000000000000000000800080000000000D -:1043B00000800080000000000080008000000000FD -:1043C00000800080000000000080008000000000ED -:1043D00000000080008000000000008000800000DD -:1043E00000000080008000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC +:1043A000000000000000000000000080000000008D +:1043B000000000800000002000090091002003039D +:1043C0000004409100000000000000000000000018 +:1043D00000000000000000000000000000000000DD +:1043E00000800000008000000000000000808000CD +:1043F00000000000008000000000000000800000BD +:104400000008000511C000000000000000000000CE :10441000000000000000000000000000000000009C -:104420000000000000008000000900000000801172 -:10443000800200000000801180090000000080114F -:1044400080020000000080118009000000000000D0 -:1044500080118004000000008011804100000000F5 -:104460008011800200000000000000000000000039 -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C +:10442000000000000000000000000000000080000C +:10443000000000000000800000000000000080007C +:1044400011000400404000000000000000000000D7 +:10445000000000000000000000000000000000005C +:1044600080118080008000000000008000000000BB +:10447000800000000000000080000000000000003C +:104480008302110000004000000000000000000056 :10449000000000000000000000000000000000001C -:1044A000000000000000000090000000000000007C -:1044B000C001200000000000C0012000000000003A -:1044C000C001200000000000C0012000000000002A -:1044D0000000C001200000000000C001200000001A -:1044E0000000C001200100000000000000000000EA -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB +:1044A00000000000000000000000000000200000EC +:1044B000C000000000200000C000820000200000BA +:1044C000C000010001200101000000000000000008 +:1044D00000000000000000000000000000000000DC +:1044E00000000800A01008C01000900000020000AA +:1044F0000000C000200000000000C000000000908C +:104500000000C001090000000100000000000000E0 :10451000000000000000000000000000000000009B -:104520000000000000000000000000410000060044 -:1045300000000082000006000000002100000600CC -:10454000000000820000060000000082000006005B -:104550000000000000820000060000000042000091 -:1045600006000000008200000600000000000000BD +:10452000000000000000000000000000000000008B +:1045300000000000000000000000480000E0000053 +:104540000000500000E0000000000000000000003B +:10455000000000000000000000000000000000005B +:10456000000000000000000007008841000000007B :10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B +:1045800000000000810000E00000000000000000CA :10459000000000000000000000000000000000001B -:1045A000000000000000000000000000FFFF00000D -:1045B000FF000000FF000000FF000000FF000000FF -:1045C000FF000000FF000000FF000000FF000000EF -:1045D000FF0000000000FF000000FF000000FF00DF -:1045E0000000FF000000FF000000FF0000000000CE -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA +:1045A000000000000000000000000000000000000B +:1045B00000FFFFFF0000FFFF00FFFFFF00FFFFFF06 +:1045C00000FFFFFF0000FFFF00FFFFFF00000000F3 +:1045D00000000000000000000000000000000000DB +:1045E0000000000000006E0866004E4E00620000F1 +:1045F000FFFFC3C3FFFF00FFFFFF00FFFFFF00003F +:10460000FFFFC3C3FFFF00FFFFFF0000FFFF00002D :10461000000000000000000000000000000000009A -:104620000000000000000000000000000000FFFF8C -:104630000000FF000000FF000000FF000000FF007E -:104640000000FF000000FF000000FF000000FF006E -:104650000000FF0000000000FF000000FF0000005D -:10466000FF000000FF000000FF000000FF0000004E -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A +:10462000000000000000000000000000000000008A +:10463000000000FFFFFFFFFFFFFF00FFFFFF00FF85 +:10464000FFFF00FFFFFFFFFFFFFF00FFFFFF000076 +:10465000000000000000000000000000000000005A +:1046600000000000000000006E087E184E4E91F31E +:104670000000FFFFC3C3FFFF00FFFFFF00FFFFFFBE +:10468000FFFFFFFFC3C3FFFF00FFFFFFFFFFFFFFB1 :10469000000000000000000000000000000000001A :1046A000000000000000000000000000000000000A :1046B00000000000000000000000000000000000FA @@ -160921,49 +160921,49 @@ :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 -:104730000000000000FF00000F0F000000FF00005D -:104740000F0F000000FF00000F0F000000FF00002F -:104750000F0F000000FF00000F0F0000000000FF1F -:1047600000000F0F000000FF00000F0F000000FF0F -:10477000FFFFF0F00000000000000000000000005B -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 +:104730000000FF00FF00FFFF0000FFFFC3C3FFFFFB +:104740000000FFFFFF00FFFF0000FFFFFF00000071 +:10475000FFFF00000000000000000000000000005B +:104760000000000000000000000000005666424209 +:10477000C3CBC3CBFFFFF0F0FFFF9999FFFF000011 +:10478000FFFFC3C3FFFFF0F0FFFF0000FFFF0000CB +:1047900000000F0F000000000000000000000000FB :1047A0000000000000000000000000000000000009 -:1047B00000000000000000FF00000F0F000000FFDD -:1047C00000000F0F000000FF00000F0F000000FFAF -:1047D00000000F0F000000FF00000F0F000000009E -:1047E00000FF00000F0F000000FF00000F0F00008F -:1047F00000FFFFFFF0F000000000000000000000DC -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 +:1047B00000000000FF00FF00FFFFFFFFFFFFC3C37B +:1047C000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00F7 +:1047D00000000000000000000000000000000000D9 +:1047E000000000000000000000000000000056660D +:1047F0005666C3C3C3D3FFFFF0F0FFFF9999FFFFD5 +:10480000FFFFFFFFC3C3FFFFF0F0FFFFFFFFFFFF4E +:10481000FFFF00000F0F000000000000000000007C :104820000000000000000000000000000000000088 -:10483000000000000000030203380C0092C0038255 -:1048400003380C0092C0038203380C0092C003822C -:1048500003380C0092C0038203380C0092C00000A1 -:10486000038203380C0092C0038203380C0092C00C -:10487000038203380C0082C000000000000000002A -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 +:104830000000000000000000800000209202408282 +:1048400080000020920240E380068029920240E32B +:10485000800080218A0000000000000000000000AD +:104860000000000000000000000000000000000048 +:104870000000000000900000400280000020920232 +:10488000408280000020920240828000002092023C +:1048900040E3800480298A0200000000000000003C :1048A0000000000000000000000000000000000008 :1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 +:1048C000000000000000000000000000AAFAFFFA4B +:1048D000FD3DFD3DA0ACAFAC0000000000000000BD :1048E00000000000000000000000000000000000C8 :1048F00000000000000000000000000000000000B8 :1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 +:104910000000FFFF0000F0FFFAFA000000000000B6 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 +:104940000000000000000000000000000000005017 +:104950005550C101C101A0ACAFAC00000000000087 :104960000000000000000000000000000000000047 :104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 +:1049900000000000D714D714000F0A0A000000001E :1049A0000000000000000000000000000000000007 :1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 +:1049D00000000000D717D4147828787D000000006C :1049E00000000000000000000000000000000000C7 :1049F00000000000000000000000000000000000B7 :104A000000000000000000000000000000000000A6 @@ -160971,323 +160971,323 @@ :104A20000000000000000000000000000000000086 :104A30000000000000000000000000000000000076 :104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 +:104A5000000000000000D717D4147828787D0000EB :104A60000000000000000000000000000000000046 :104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 :104A90000000000000000000000000000000000016 -:104AA00000000000000000000000000000002000E6 -:104AB00000000000000000000000000000002000D6 -:104AC0000000000000000000400000004000200046 -:104AD00000800100008000000000008000802000B5 -:104AE0004080010041000080000020000000200004 -:104AF00021004100010000800000880000000080CB -:104B000020202080008020800000200000002080E5 -:104B10002000200000000000020020000000000033 -:104B20002000200000002000000000000000000025 -:104B300000000000400000000000000040000000F5 -:104B400000004000400040000000000000000002A3 -:104B50000000402004000020000000000020402051 -:104B600000000020040004000020000000004000BD -:104B70000000040004000400002000000000000009 -:104B80000020000140200020002000000000000064 -:104B900000200000000000000000000000000000F5 -:104BA0000000000000000000000000000000000005 -:104BB00000000000020000000000000000000000F3 +:104AA00000000000000000000000000004002000E2 +:104AB000020000000200000001000200400040006F +:104AC000400000000000000440000000200004003E +:104AD000000082800000000000000000208089802B +:104AE000820088000400000000030400040020008D +:104AF000200000002000880004008800000004005E +:104B00000400200020002000C00020000000200041 +:104B10002000040000002000040004000100408088 +:104B200009000000200020004000000000000000FC +:104B3000000080004000800000000200A100000092 +:104B400000000000400040000000000021000000C4 +:104B500000000000004000000000000000004002D3 +:104B60004002400040000000400000004000000003 +:104B70000000040000000000000000000000000031 +:104B800000000000000004000000000040000000E1 +:104B900000000000000200000000100000000800FB +:104BA0008010C00000000000000005400000000070 +:104BB00000000000000000000000000000000000F5 :104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000100000000000000000000000000000B5 +:104BD00000000000828802089004000400040041E4 +:104BE00008080000008982880008002000000000FA :104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C3000000000080000000000000000000000006C +:104C00001000000000000000080000100010080064 +:104C10000010000000100000000000100000010063 +:104C20000000000000008200000000000000000002 +:104C30000000000000000000000000000000000074 :104C40000000000000000000000000000000000064 -:104C5000000000080000000000000000000000004C -:104C60000000000000000000000000000000000044 -:104C7000000000000008000000000000000000002C -:104C80000000000000000000000000000000000024 -:104C9000000000000008000000000000000000000C -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 +:104C5000000000000000002180010001000100C1EF +:104C60000000000100000004000500010001000038 +:104C70000000000000000000000000000000000034 +:104C80000200000000000000000000000000000022 +:104C90000000000000000000000000000000000014 +:104CA0000400000800000000000000000000008870 +:104CB0000000000000000000000000000000008074 :104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000400D0 -:104CE000000000000041040000000021000000005E -:104CF000000004000405041000000000000500008E -:104D00000400040004000000000000000000000097 -:104D1000000004000400000000800000000000000B -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60008000000000000000800000000000000043 -:104D700000000000800080008000000000000000B3 -:104D800000008000800080000000000000000000A3 -:104D900000000000900080000000002000000000E3 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000010000000000000000000A3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 +:104CD0000000000000000000000000000000004193 +:104CE000000040008800882100000000001000043F +:104CF00000000000000000000003000000000005AC +:104D000000000000000000000000000000000000A3 +:104D1000000000000000000000000000080000008B +:104D2000000000000000000000000800000000007B +:104D300082000000000000000000000040000000B1 +:104D400000400000410041004100000040004100DF +:104D500041000000410041004100000041004100CD +:104D60004100000080000000000000000000000181 +:104D700000010000000000000000000003004100EE +:104D80000000000000000000000000000000000023 +:104D900005000008000000000000000005000500FC +:104DA00000000500000000000800080000000000EE +:104DB00000000800000000000000000000080200E1 +:104DC0000000000000080000020001000008820846 +:104DD00000000021000000008241084110A0108066 +:104DE0000009008300040005000900030888000092 +:104DF0001080010400000800000000000000000016 +:104E0000000000000000000000000800000000009A +:104E10000000C00000000000080082000000100038 +:104E20000000840008000805004100000000820026 +:104E300000008200000000000000000000000000F0 +:104E40008000000000000000000080000200000060 +:104E50000000000000000000000000C00000880901 +:104E6000000800000004020100000000000000052E +:104E70000000000804850000000000400000000061 +:104E80000000000000200000000000000000000002 :104E90000000000000000000000000000000000012 :104EA0000000000000000000000000000000000002 :104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE0000000000000000000008000000000000042 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000008000000000000011 -:104F20000000000000000000000000000000000081 +:104EC00040000000400040004000000000004000A2 +:104ED0004000000040004000400000004000400052 +:104EE0000400108020000000C0000000A008A00006 +:104EF000002000000004A020000000000000C0000E +:104F0000000000000000000500000000000000009C +:104F10000800000000000000000000000000000089 +:104F2000000090000000820000000000000000006F :104F30000000000000000000000000000000000071 :104F40000000000000000000000000000000000061 -:104F5000000000000000000000000000000000A0B1 -:104F6000000000000000000000000020000000A081 -:104F700000000000000000840000000000000000AD -:104F80000010000000000000000000000000000011 -:104F900000C0000000000000000000200000000031 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 +:104F50000000000000000000000000000000100041 +:104F6000000080008040880000C0000008000301AD +:104F7000000000010000000100010000210000000D +:104F80000000000000000000000000000384000892 +:104F90000000000005000000000005000000000007 +:104FA00000000000100000000500050000000300E4 +:104FB00000100000000000000000000000000000E1 :104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:10500000000000100000000000050000000000008B -:105010000240000000000000A009000000000000A5 +:104FE00000000000100010002000200000008400DD +:104FF0000000080010800108000001080000000403 +:105000000000000000400000000000000000000060 +:10501000000000400000000200000000000000004E :105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 +:10503000000000000000001100000003000000005C :105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 +:1050500000000000000000000000000000A00000B0 +:10506000000000100000800080C0820080A02000AE +:10507000000000000000802020010000100100005E :105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 :1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E000000000000000000000C000900000000070 -:1050F00000C000900000000000C000900000000010 -:10510000000300C000900000000000C000900000FC -:10511000000000C000900000000000C000900000EF -:10512000000000C00090000000000000000000002F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000080008000003F -:10517000000000800080000000000080008000002F -:10518000000000000080008000000000008000801F -:10519000000000000080008000000000008000800F -:1051A00000000000008000800000000000000000FF -:1051B00000000000000000000000000000000000EF +:1050B00000A0000000000000000000000000000050 +:1050C000000000000000000008C000000000000810 +:1050D00008C000000000000808C000000000000830 +:1050E00008C0000000000008000001008800000067 +:1050F0004103019000A108894101010082010000E3 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:105130000000080890044008908200000000000071 +:1051400000000000000000000000008000000000DF +:10515000000000800000000000000080000000004F +:1051600000000080000000000000000009000000B6 +:10517000020091C121210008801011410921000283 +:10518000001000000000000000000000000000000F +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B0000000000084808400808080800000000067 :1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00080008080000000008000808000000000AF -:10520000800080800000000000008000808000009E -:10521000000080008080000000008000808000008E -:10522000000080008080000000008000808000007E -:10523000000000000000000000000000000000006E +:1051D00000008000000000000000800000000000CF +:1051E0000000800000000000000080000200084075 +:1051F0001104C100910080A0418520858900C11063 +:105200008211C189000000000000000000000000C1 +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000A0000480040010800000B6 :10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:10526000000000000000000000000000000000003E -:1052700000008400C090000000008400C090000086 -:1052800000008400C0900000000000008400C09076 -:10529000000000008400C090000000008400C09066 -:1052A000000000008400C090000000008400C09056 -:1052B00000000000000000000000000000000000EE +:1052500008000000C000000008000000C0000000BE +:1052600008000000C000000008000000C0000000AE +:1052700000000100C100900084C1041090C088C0EB +:1052800004018501910900000000000000000000F9 +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B0000000000000000000090004020200850256 :1052C00000000000000000000000000000000000DE -:1052D00000000000000000000000000000000000CE -:1052E00000000000000000000000000000000000BE -:1052F00000000000009000C000000000029000C00C -:1053000000000000009000C00000000000000090BD -:1053100000C000000000009000C0000000000090ED -:1053200000C000000000009000C0000000000090DD -:1053300000C00000000000000000000000000000AD -:10534000000000000000000000000000000000005D -:10535000000000000000000000000000000000004D -:10536000000000000000000000000000000000003D -:1053700000000000000000800080000000000080AD -:10538000008000000000008000800000000000009D -:10539000008000800000000000800080000000000D -:1053A00000800080000000000080008000000000FD -:1053B00000800080000000000000000000000000ED -:1053C00000000000000000000000000000000000DD -:1053D00000000000000000000000000000000000CD -:1053E00000000000000000000000000000000000BD -:1053F0000000000080000002000000008011800218 -:1054000000000000801180020000000000008011F8 -:105410008009000000008011800900000000801158 -:105420008004000000008011800500000000801151 -:1054300080050000000000000000000000000000E7 -:10544000000000000000000000000000000000005C -:10545000000000000000000000000000000000004C -:10546000000000000000000000000000000000003C -:105470000000000000009000000000000000C001DB -:10548000200000000000C00120000000000000001B -:10549000C001200000000000C0012000000000004A -:1054A000C001200100000000C00120000000000039 -:1054B000C00120000000000000000000000000000B -:1054C00000000000000000000000000000000000DC +:1052D00000000000000000C000000000000000C04E +:1052E00000000000000000C000000000000000C03E +:1052F000000000010000010111050089C121051114 +:105300000002000101020101000000000000000095 +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:105330000000000000000000000005040005400817 +:10534000C0A10000000000000000000000000000FC +:1053500000000000000000000080000000000000CD +:10536000008000000000000000800000000000003D +:1053700000800008000300021141C1882003891049 +:1053800085A04084210309041141000000000000B1 +:10539000000000000000000000000000000000000D +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000010090010C4 +:1053C0000089000200000000000000000000000052 +:1053D000000000000000000000000000800000004D +:1053E00000000000800000000000000080000000BD +:1053F00000000000009100008000001003400580C4 +:10540000A1A11000C18411800280044000000000AE +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000007C +:1054300000000000000000000000000000000082EA +:1054400000210080000000000000000000000000BB +:105450000000000000000000080000000000C00084 +:10546000080000000000C000080000000000C000AC +:10547000080000000000C08984A04000C000840132 +:10548000C0080289A0009189A10283028301000063 +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000000000000000000000EC +:1054C0000008000400900000000000000000000040 :1054D00000000000000000000000000000000000CC :1054E00000000000000000000000000000000000BC -:1054F0000000000000000000008200000600000024 -:1055000000210000060000000082000006000000EC -:10551000000000820000060000000082000006007B -:1055200000000042000006000000000A0000060023 -:105530000000000A0000060000000000000000005B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:10556000000000000000000000000000000000003B -:10557000000000000000000000000000FFFF00002D -:1055800000FF000000FF000000FF000000FF00001F -:1055900000FF0000000000FF000000FF000000FF0F -:1055A000000000FF000000FF000000FF000000FFFF -:1055B000000000FF000000FF000000FF00000000EE -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB -:1055F0000000000000000000000000000000FFFFAD -:10560000000000FF000000FF000000FF000000FF9E -:10561000000000FF0000000000FF000000FF00008D -:1056200000FF000000FF000000FF000000FF00007E -:1056300000FF000000FF000000FF000000FF00006E -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:105670000000000000000000000000000000FF002B -:105680000000FF000000FF000000FF000000FF001E -:105690000000FF0000000000FF000000FF0000000D -:1056A000FF000000FF000000FF000000FF000000FE -:1056B000FF000000FF000000FF00000000FFFFFFF0 -:1056C00000000000000000000000000000000000DA +:1054F0000000000000000000821100E00700000032 +:10550000810000E000004842500A00E0070000006F +:10551000000000000000000000000000000000008B +:10552000000000000000000000000000000000007B +:10553000000000000000000000000000000000006B +:105540000000000000000700000000000000000054 +:1055500000000000000000000000FF00FF00FFFF4F +:105560005555FFFFFF00FFFF5555FFFFFF00FFFFF1 +:105570005555FFFFFF00FFFF5555C0FCFFFF000022 +:10558000000000000000240000243CFC3FFF002835 +:1055900000280000000000000000000000000000E3 +:1055A00000000000000000000000000000000000FB +:1055B00000000000000000000000000000000000EB +:1055C0000000000000000000FD00BD000000000021 +:1055D000000000000000000000000000FF00FF00CD +:1055E000FFFF5555FFFFFF00FFFF5555FFFFFF0071 +:1055F000FFFF5555FFFFFF00FFFF5555C0FC0000A2 +:1056000000000000010000008100008100C003C311 +:10561000002800280000000000000000000000003A +:10562000000000000000000000000000000000007A +:10563000000000000000000000000000000000006A +:1056400000000000000000000000FF00BF0000009C +:105650000000000000000000000000000000C3C3C4 +:10566000FFFFF0F0FFFFC3C3FFFFF0F0FFFFC3C376 +:10567000FFFFF0F0FFFFC3C3FFFF0F0F00000000AC +:105680000000AAAA000004080102040108020000A8 +:1056900000000BFF040400000000000000000000F8 +:1056A00000000000000000000000000000000000FA +:1056B00000000000000000000000000000000000EA +:1056C0000000000000000000F0F0F0F0006F002F7C :1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA -:10570000FF000000FF000000FF000000FF0000009D -:10571000FF000000FF0000000000FF000000FF008D -:105720000000FF000000FF000000FF000000FF007D -:105730000000FF000000FF000000FF00000000FF6D -:10574000FFFF00000000000000000000000000005B -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:105780000000030203380C0092C0038203380C00AF -:1057900092C0038203380C0092C0000003820338D9 -:1057A0000C0092C0038203380C0092C003820338BD -:1057B0000C0092C0038203380C0092C003820338AD -:1057C0000C0082C00000000000000000000000008B -:1057D00000000000000000000000000000000000C9 +:1056E000C3C3FFFFF0F0FFFFC3C3FFFFF0F0FFFFF6 +:1056F000C3C3FFFFF0F0FFFFC3C3FFFF0F0F0000A6 +:1057000000000000AAAA0000102040801040208065 +:10571000000000000FFF000000000000000000007B +:105720000000000000000000000000000000000079 +:105730000000000000000000000000000000000069 +:105740000000000000000000000000305000004F8A +:10575000000F00000000000000000000000000003A +:105760000000400280000020920240828000002061 +:1057700092020082000000009200008200000000FF +:105780008A00006000268000120600210002800DC1 +:105790000800000000208010000000000000000051 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000000000000000000000000000E9 +:1057C00000000000000000000000000005610A0E5B +:1057D000050D00A000000000000000000000000017 :1057E00000000000000000000000000000000000B9 :1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 +:1058000000000000000000007D5D705C03000000EF +:1058100003000000FC0CF5F57D7D50FA000000004F :105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 :105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 +:105850000000AA00EB0000000000000000000000B3 :105860000000000000000000000000000000000038 :105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 +:10588000000000000000000000000030705C00001C +:105890000000C3000000FC0C0505282850FA000099 :1058A00000000000000000000000000000000000F8 :1058B00000000000000000000000000000000000E8 :1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000000000000C8 +:1058D00000000000BA00BA00000000000000000054 :1058E00000000000000000000000000000000000B8 :1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 +:10590000000000000000000000000000D5D530D5E8 +:10591000F114F1F50000003CFC0CF5F5FF3CF0AA99 :105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 :105940000000000000000000000000000000000057 -:105950000000000000000000000000000000000047 +:1059500000000000000000000F0000000000000038 :105960000000000000000000000000000000000037 :105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 +:1059800000000000000000000000000000003030B7 +:1059900000F5F11414000000003CFC0C0505003C6F +:1059A000F0AA00000000000000000000000000005D :1059B00000000000000000000000000000000000E7 :1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000000000000000C7 +:1059D0000000000000000000000C000C00000000AF :1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 -:105A40000000000000000000000000000000000056 -:105A50000000000000000000000000000000000046 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 -:105A800000000000000200000000000000004000D4 -:105A90000000000000000000000000000000000006 +:1059F0000000000000000000000010000000000097 +:105A00000000000010000000000000000000000086 +:105A10000000000000000000000020000000000066 +:105A20000000000000002000000000000000000056 +:105A30000000000000004000000000000000000026 +:105A4000000000000000200000000000C000000076 +:105A50000000000000002000000000000000000026 +:105A60000000000000001000000000000000000026 +:105A700010000000200000001000000000004000A6 +:105A80000000000005000000000000000000000011 +:105A90000000000000020002000000000000000002 :105AA00000000000000000001000000000000000E6 -:105AB00000000000000000004000000000000000A6 -:105AC00000001000000000001000000000000000B6 -:105AD00000000000000000000000000000000000C6 -:105AE00000000000000000000000000000000000B6 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000002000000000000D4 +:105AD00000000000000000020000000021000000A3 +:105AE00000000000000000020000000000000000B4 +:105AF0000000000000000000000000100000000096 +:105B00000000000000000000000000000000001085 :105B10000000000000000000000000000000000085 -:105B2000100000000000080000000000000000005D -:105B30000000000000000000000000000000000065 +:105B20000021000000000000000000100000000044 +:105B30000010000000000000000000410000000014 :105B40000000000000000000000000000000000055 -:105B50000000000000000000020000000000000043 +:105B500000100040000000000000000000000000F5 :105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 +:105B7000000000080000000000000000000000001D :105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 +:105B90000000000200000000000000C000C0000083 :105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000010000000000000D5 -:105BC00000000000001000000000000000000000C5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 :105BD00000000000000000000000000000000000C5 :105BE00000000000000000000000000000000000B5 :105BF00000000000000000000000000000000000A5 -:105C00000000000000000000000000000200000092 +:105C00000000000000000000000000000000000094 :105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000100000000054 -:105C40000000000000000000000000000000000054 -:105C5000000000000000000000000008000000003C -:105C60000000000000000000000000000000000034 +:105C2000000500000000000000000000000000006F +:105C30000000000000000000000000000000000064 +:105C400000000000080000000000880000000000C4 +:105C500000000000840000000000000000000000C0 +:105C600000004000000000000000000000000000F4 :105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 +:105C900000000000000000001100110009000000D9 +:105CA0000000000000C000000000000000840000B0 +:105CB0000000000000C00000000000000000000024 +:105CC0004000000040004000000000000000000014 +:105CD0001000100010001000000000000000000084 :105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 -:105D00000000000000000040000000000000000053 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 +:105D0000000000000005001000100000004100002D +:105D10000000100000100000000000000011000052 +:105D2000000000000000000400000041000000002E :105D30000000000000000000000000000000000063 :105D40000000000000000000000000000000000053 :105D50000000000000000000000000000000000043 :105D60000000000000000000000000000000000033 :105D70000000000000000000000000000000000023 :105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 +:105D9000000000C000C000A009C00090000000008A +:105DA000000000000000001000C000880090008883 :105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 -:105DD00000A0000000000000000000000000000023 -:105DE00000000000000000000000000000000000B3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000040000AF :105DF00000000000000000000000000000000000A3 :105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 +:105E10000000000000000000000000000000200062 :105E20000000000000000000000000000000000072 :105E30000000000000000000000000000000000062 :105E40000000000000000000000000000000000052 @@ -161296,28 +161296,28 @@ :105E70000000000000000000000000000000000022 :105E80000000000000000000000000000000000012 :105E90000000000000000000000000000000000002 -:105EA00000000008000000000000000000000000EA -:105EB000000000A0000000000000000000840000BE -:105EC00000000000001000000000000000000000C2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 +:105EA00000000000008441C0038405C000C0210040 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED000000000000000000000880000000000003A +:105EE0000000000000000000110000000500090093 :105EF00000000000000000000000000000000000A2 :105F00000000000000000000000000000000000091 -:105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000000061 -:105F40000000000000000010000000000000000041 +:105F10000000000000100000000000100000000061 +:105F200000000000000000004000000000000041F0 +:105F30000000004100090000000000000000000017 +:105F4000000200000000000000000000000000004F :105F50000000000000000000000000000000000041 :105F60000000000000000000000000000000000031 :105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 -:105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 +:105F80000000000000000000000000080008000001 +:105F900000000090008400000000000000000000ED +:105FA0000000000011000900000020C0200020C0F7 +:105FB00011100000000000000000000000000000C0 :105FC00000000000000000000000000000000000D1 :105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 +:105FE0000000000000000000000000002000009001 +:105FF0000000004000000000000000000000000061 :106000000000000000000000000000000000000090 :106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 @@ -161472,435 +161472,435 @@ :106970000000000000000000000000000000000017 :106980000000000000000000000000000000000007 :1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 -:1069B00000000000200000000000000000000000B7 -:1069C00000000000000000000000000000000000C7 -:1069D0000000000020000000000000000000000097 -:1069E00000000002000000000000000000000000A5 -:1069F00000800000100020002000100000000000B7 -:106A00000000000000000000000000004000000046 -:106A100000000000200020002000200000000000F6 -:106A200000000000000040000000000040004000A6 -:106A30004000000040000000400000004000000056 -:106A40000090000000000000400000004000000036 -:106A50004000000040001000000000001000000096 -:106A600000000000000000000000000000004000E6 -:106A7000000000200000C000000080008000000036 +:1069A0000000000040000000200000000200000085 +:1069B0000000000002004100200000000000000074 +:1069C0000200020002008800200000000100000018 +:1069D000018400008800200020000000000000006A +:1069E0000000000300004000200020000000000024 +:1069F0000000020000002000200000000000000055 +:106A00000000000000000000000020000000000066 +:106A100000002000010001000080000000000000D4 +:106A20000000000000000000400010401000C00006 +:106A30004000000040008000020000000000400014 +:106A40000000800080008000400000004000020044 +:106A5000400020084000000000000000000000008E +:106A60000000000000000000000000000000000026 +:106A70000000000000004000000000000000410095 :106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000000080000000000BE -:106AD00000000000000000000000100000000200A4 -:106AE0000200000000000000400000000000000064 -:106AF000000000000000000020081004A08400082E -:106B00000000000000000000000000000200000083 -:106B10000200000000000000000000000200000071 -:106B20000000004000000000000000000000200005 -:106B30000000000000000000000000000000000055 -:106B40000000000000000040000000000000000005 +:106A90000000000010022000400000020000000082 +:106AA00000000000000000000000020000000100E3 +:106AB00000000100010001000000010001000100D0 +:106AC00001000100000000000010010001000000B2 +:106AD00000000040001000000000000900400040DD +:106AE0000000000000000000000000000000004066 +:106AF0000000000000000010000000000000000086 +:106B00000000000000000000000000000040000045 +:106B10000040000000400040000000000000404035 +:106B200000000040004000000000000000000000E5 +:106B30000200000002000200020000000200020049 +:106B40000200020002000000000009000200020032 :106B50000000000000000000000000000000000035 -:106B600000000000000000000000800000000000A5 -:106B7000000000000000000000008001800100090A -:106B80000001000000000000000000000000000004 -:106B900000000008000000000000000000000000ED -:106BA000000000000008008200000000000000005B -:106BB00000000000000000000000000000000000D5 -:106BC00000000000000000000000000000000000C5 -:106BD00000000000000000000000000000000000B5 -:106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000040000055 -:106C0000000000000000000000000009000000215A -:106C1000002100000000000000000000000000084B -:106C2000000800000000000000000000000000005C -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 +:106B60000000000000000000000000000000000025 +:106B70004000000000000000000000000000004095 +:106B80002000000000000000000000840000000061 +:106B900000000000004000000000004000400040F5 +:106BA0008000000000000000000000000000000065 +:106BB00000000200020002000200020002000200C7 +:106BC0000200020002210200020002000200020094 +:106BD0000200000040050010001000050000000049 +:106BE0000005000000000000000000000008000098 +:106BF000000000000000000500210000000000006F +:106C00000000001000000000001000000000000064 +:106C1000000000000000000000000000000800006C +:106C20000000000000000000000000000000000064 +:106C30000000000080008000800080008000800054 +:106C40008000800080008000800080008000800044 +:106C500080008000000080004100000000C00000B3 :106C60000000000000000000000000000000000024 :106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 +:106C800000000000000000000000000005000000FF +:106C900000000000000000000000040000000000F0 :106CA00000000000000000000000000000000000E4 :106CB00000000000000000000000000000000000D4 -:106CC00000000000000000000000000000000000C4 -:106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 +:106CC0000800080000000000000000000080010033 +:106CD000088000000000200000020000000000000A +:106CE0000000000000000000002100000000000083 :106CF0000000000000000000000000000000000094 -:106D000000800000000000040000000000000000FF -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 +:106D00000000001000000000000000000000000073 +:106D1000000008000000000000000000000000006B +:106D20000000000000001000000000000000000053 :106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 -:106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D800000000008000000000001000000000000FA -:106D900000000000000000000000000000000000F3 +:106D4000000000000000000000000090008420040B +:106D5000021000400010000000100889000000C070 +:106D6000090000C000000000000000000000080052 +:106D70000000080000000000000000000008000003 +:106D800000000008000800080000000000000000EB +:106D900000000020000000000000000000000000D3 :106DA00000000000000000000000000000000000E3 :106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 -:106DF000000000000000000000000000000800008B -:106E0000000000400008000000000000000000003A -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 +:106DC00000000000000000000000000000000010B3 +:106DD0000000000000000000840000050090018415 +:106DE000000500210000000000000040000000003D +:106DF000000500000000000000000000000000008E +:106E00000010000000000000000000000000000072 +:106E10000000000000000000080000000000C000AA +:106E20000000000000000800000400000000000056 :106E30000000000000000000000000000000000052 :106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 +:106E50000000000000000000000000000000000230 +:106E600020050000000000000000000000000000FD :106E70000000000000000000000000000000000012 -:106E80000000000000000001000000000000000001 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 +:106E80000000000000000000000000000000000002 +:106E900005000000000000000004000000000020C9 +:106EA00000000000000000000000080100000000D9 :106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 -:106F0000000000030000000000000000000000007E -:106F10000000000800080000000000000000000061 +:106EC00000000000000000000000000000000100C1 +:106ED0000000000500210000000500040000000083 +:106EE0000009010400040004000900080004000473 +:106EF000002100210004000000000000000000212B +:106F00000000000000000000000000400000000041 +:106F10000000000000000000000000000000000071 :106F20000000000000000000000000000000000061 :106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000040000001 -:106F50000000000000000000000000000000000031 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 +:106F400000000000000000000000000000841000AD +:106F50002010001009102010000000002000200068 +:106F600000000000200100000000080000000000F8 +:106F70000000000000000000000000000800000009 +:106F800000820000000000A00000000000000000DF +:106F900002100000000000000000000000000000DF :106FA00000000000000000000000000000000000E1 :106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 -:10700000000000000000000000000000010101007D -:10701000040000000000000000000000000000006C -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:10707000000000000000000000000000000000020E -:107080000011001100080000000000000000114184 -:10709000090900410010000000000000000000008D -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 +:106FC000000000C000020000000000C000C000007F +:106FD0000000100100850000000500000000000016 +:106FE0000008000001000000000041C0C00800844B +:106FF000C08200000000000000000000000000004F +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:10702000000000000000000000000000010000005F +:10703000210000000000000000000000000000002F +:107040000000000000800000000000000080000040 +:10705000000000008011100800090004000000007A +:10706000000000800000030000000000A00000807D +:107070000000008000000000000000000000000090 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000400DC +:1070B000210040000000000000000000000000006F +:1070C0000000000000000000000000008000000040 +:1070D0000000000080000000000000000000000030 +:1070E00000000000808011002100030084828000E5 +:1070F00000A180108080000000000000000000005F :10710000000000000000000000000000000000007F -:1071100008004100021141090000000000000000C9 +:10711000000000000000000000000000000000006F :10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F +:107130000483040000102000000000000000000094 +:107140000000000000000000840000000000C000FB +:107150000000000000000888900004840000000483 +:107160000000000400001010000001000000C189B0 +:10717000080088C0100408C00000000000000000E3 :1071800000000000000000000000000000000000FF -:1071900000000102000000010101000000000000E9 +:1071900000000000000000000000000000000000EF :1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F +:1071B00000000110010000010100000000000000BB +:1071C0000000000000000000000000880000000037 +:1071D00000C000840000000000C0010100010202A4 +:1071E0000101000200104000020000010000000048 +:1071F000000105100088C004888400000000000021 :10720000000000000000000000000000000000007E -:107210002000000000010001030001010000000047 +:10721000000000000000000000000000000000006E :10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E +:10723000000000000000400100010000000000000C :10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E -:1072800000000000000000000900100000000000E5 -:10729000000000000000001041030902114100003D +:10725000000000800000000000000080040800031F +:1072600020090411110000808000000000200000AF +:1072700000090011418000008000000000000000B3 +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE :1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE +:1072B00000000000000000040004000303200000A0 :1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E +:1072D000000000000000800000000000000000002E +:1072E00000000000000080020000800000004180DB +:1072F00011000400080400000000008000000000ED :10730000000000000000000000000000000000007D -:10731000000000000000000041804111090003103E +:10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D +:1073300000000000000000004004041141000011A2 :10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D +:107350000000000088000000C0000000C08800009D +:10736000840004000000000010000000082000005D +:107370000108000000840100A000A084A0084000D3 :1073800000000000000000000000000000000000FD -:1073900000000000000000000000014000010000AB -:1073A00001010000000000000000000000000000DB -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000010101010000C9 +:1073C00000010000000000000000000000000000BC :1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D -:10740000000000000000000000000000000000007C -:10741000000000000000000007000000000000E085 +:1073E0000000480000E00000000000000000000075 +:1073F0000000500000E0000000000000000000005D +:1074000048420000000000000000000000000000F2 +:10741000000000000000000000000000000000006C :10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C +:10743000000000000000000000000000000000E06C :10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C -:1074800000000000000000000000000000000000FC +:10745000000000000F0F0F0FFFFFC3C3FFFF0F0F50 +:10746000FFFFC3C3FF0000FF55AA55AA0F0FF0F09E +:107470003333333300000000000000000000000040 +:10748000408010200000000000000000000000000C :1074900000000000000000000000000000000000EC :1074A00000000000000000000000000000000000DC :1074B00000000000000000000000000000000000CC :1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C -:10750000000000000000000000000000000000007B +:1074D0000000000000000F0F0F0FFFFFC3C3FFFFEE +:1074E0000F0FFFFFC3C3FF0000FF55AA55AA0F0FE0 +:1074F000F0F03333333300000000000000000100DF +:10750000000001020408000000000000000000006C :10751000000000000000000000000000000000006B :10752000000000000000000000000000000000005B :10753000000000000000000000000000000000004B :10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB +:10755000000000000000000000FFFFFFC3C3FFFFAA +:1075600000FFFFFFFFFF00003CC33CC3CCCCCCCCF2 +:1075700096969696FFFF00000000000000000000B5 +:1075800004100140448800000000000000000000DA :1075900000000000000000000000000000000000EB :1075A00000000000000000000000000000000000DB :1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B -:10760000000000000000000000000000000000007A +:1075D0000000000000000000000000FFFFFFC3C328 +:1075E000FFFF00FFFFFF0000FFFF3CC33CC3CCCC0C +:1075F000CCCC969696960000FFFF00000000FFFF9F +:107600000000082002800000448800000000000004 :10761000000000000000000000000000000000006A :10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA -:1076900000000000000000610006000D0000000076 -:1076A00000000500000000000000000000000000D5 +:107650000000000000000000000000004002800068 +:10766000002092024082800000209002406180024F +:1076700080291002400080000020080200610006FE +:107680008001120600000000000008000000000059 +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA +:1076C00000000000000000610007000D0000000045 :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A -:1076F000000000000000000000000000000000008A -:107700000000000000000000000000000000000079 +:1076F000000030303F3000000000000000000000BB +:1077000000FF003CFF3C0000000000000000000003 :107710000000000000000000000000000000000069 -:1077200000000000000000000F3C55FFFF3CF0AAE5 +:107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 +:1077400000000000000000000FFAFFFAF7F4C7C4C1 :107750000000000000000000000000000000000029 :107760000000000000000000000000000000000019 -:107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 +:1077700000000000303F3F3F00000000000000001C +:107780000C0C00F30000FFFF0000000000000000F0 :1077900000000000000000000000000000000000E9 -:1077A000000000000000000000000F3C5500003CFD -:1077B000F0AA00000000000000000000000000002F -:1077C00000000000000000000000000000000000B9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C000000000000000000000000FFAFFFA0000B7 :1077D00000000000000000000000000000000000A9 :1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 -:107810000000000000000000000000000F0F0F0F2C -:107820000000000000000000000000001E1EFFAA73 -:1078300000FF55550000000000000000000000009F +:1077F0000000FFC33F030000000000000000000085 +:10780000000000000000343434D400000000000008 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 :107840000000000000000000000000000000000038 -:107850000000000000000000000000000000000028 +:10785000F7F73737000000000000000000000000CC :107860000000000000000000000000000000000018 -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000F8E4B -:1078A0000F0F0000000000000000000000001E1E7E -:1078B00055003C3CF0F0000000000000000000001B +:1078700000000000FCC03C00000000000000000010 +:107880000000000000000000343434340000000028 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 :1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000000000A8 -:1078E0000000200000000000000000000000000078 -:1078F0000000000000000000000020000000000068 -:107900000000200000000000000000000004000053 -:107910000000000000000000000000000000000067 -:107920000000000020000000000000000000000037 -:107930000000000000000000000000000000000047 -:1079400000000000C0000000000000000000000077 -:10795000000000008800000000000000000000009F -:1079600000000000000000000000002000000000F7 -:107970000000000000000000400000000090000037 +:1078D0000000F7F73737000000000000000000004C +:1078E0000000000000000000000000002000200058 +:1078F0000100000020000000000000000000000067 +:107900000000000000000000000082002000400095 +:107910000000000020000000000000000000000344 +:1079200088000000000000000000000000002000AF +:10793000218005800580018000000000000000001B +:1079400020000000000000000000000000002000F7 +:107950002000000000000000000000000000000007 +:107960000000000000020000100000000000000005 +:107970000000020000000000000000000000000005 :1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 +:107990000090000000000000000000000000000057 :1079A0000000400000000000000000000000000097 -:1079B00000000000000000000000000000000000C7 -:1079C0000000000000C000000000000000000000F7 -:1079D00000000000000000000000000000000000A7 +:1079B0000000020882088208022000000000000087 +:1079C00000000000000000000000000000000000B7 +:1079D0000000002000000000000000000000000087 :1079E0000000000000000000000000000000000097 -:1079F0000000000000000000000000000000020085 -:107A00000000000000000000000000000000000076 -:107A10000000000000000000000000000000000066 -:107A20000000000000000000000000000000000056 -:107A30000000000000000000000000000000000046 -:107A40000000000000000000000000000000000036 -:107A50000000000000000000000002000000000024 -:107A600000000000000000400000000000000000D6 +:1079F000000000000000000800000000000002007D +:107A00000000000000000000000000000000004036 +:107A10000000001000000000001000000000000046 +:107A2000000000000800000000000040000000000E +:107A3000000000000200020002000200001000002E +:107A40000200000000000000000000000000000034 +:107A500000000000000008400000000000000000DE +:107A60000000000000000000000000000000000016 :107A70000000000000000000000000000000000006 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 +:107A8000000000000000000000000000004000882E +:107A90000000004000000000004000400000000026 :107AA00000000000000000000000000000000000D6 -:107AB00000000000000000000000000000000000C6 +:107AB00000000000000000000000000800000010AE :107AC00000000000000000000000000000000000B6 -:107AD000000000000000000000000000000000089E -:107AE000000000080000000000000000000000008E +:107AD0000000000000000000000000400000000066 +:107AE0000000000000000000000000000000000096 :107AF0000000000000000000000000000000000086 -:107B00000000000000000000000000000000000075 -:107B10000000000000000000000000000000000065 +:107B00000000000001000000000000200000000054 +:107B10000000000000050000000000000000000060 :107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 +:107B300000000000000000002100010020001100F2 :107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 +:107B5000000000000000000000000000080000001D :107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 +:107B70000000000000000000000000000500000000 +:107B8000000000000000200000C000000001000014 :107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000002100B4 -:107BB00000000000000000020000000000000000C3 -:107BC00000000000000000080000000000000000AD -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000040000055 -:107BF0000000000000000000000000000040000045 -:107C00000011000000000000000000000000000063 -:107C10000000000000000000000000000040000024 -:107C20000000000000000000000000000000000054 -:107C30000000000000000000000000000000000044 -:107C40000000000000000000000000000000000034 -:107C500008400000000000000000000000000000DC -:107C60000000000000000000000084000000000090 -:107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD00000000000000000000000000000000000A4 +:107BA00000000002000000000000000000000000D3 +:107BB00000000000000000000000840020008000A1 +:107BC000A000000000000000000000000000000015 +:107BD0000000000000000300100000000000000092 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000020000000020063 +:107C00000000000000000000000000000000000074 +:107C1000000000000000000000000800000000005C +:107C200000000000200000000000000000008400B0 +:107C300084000000C10000000100000000000000FE +:107C40000000000000000000C00000000000000074 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000008000000084 +:107C80000000000000000040000000400040000034 +:107C9000000400000002004000000000114000004D +:107CA00000000000400000040000000000001190EF +:107CB000218200000000400000C00200000000908F +:107CC00000000008000000000000000000000000AC +:107CD0000000000000000000000000000000100094 :107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 +:107CF00000000000000090008400000090000000E0 +:107D0000000004000000000020000000000000004F +:107D10000405000000410000000000000000000019 :107D20000000000000000000000000000000000053 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 +:107D30000000900000000000880300410800880057 +:107D400000000000000008100041000000000000DA :107D50000000000000000000000000000000000023 :107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 -:107DB0000000000000000000000000C00000000003 -:107DC000000000000000000011000008000000009A -:107DD0002000000000000000000000000000000083 -:107DE0000000000000000000000000900000000003 +:107D700000000000000000000000000800000008F3 +:107D80000000000080000008000080C00084200087 +:107D90000000800000000000001000000000000053 +:107DA0000084000200080000000000000000000045 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000000000000000000B3 +:107DD00000000000000000000000000000000000A3 +:107DE000000000000500000000000000000000008E :107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E2000000000000000000000000000000008004A -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 +:107E000000000000050020002000004000090000E4 +:107E100000000020002000400020000000090000B9 +:107E20000000000000000000000400082000000026 +:107E300000000000000000000000008000000000C2 +:107E400084000000000000000000000000000000AE :107E50000000000000000000000000000000000022 :107E60000000000000000000000000000000000012 -:107E70000000000000000000000000000000000002 -:107E800008000000020000000000000400000000E4 -:107E900000000000000000000000000000000000E2 -:107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 -:107ED0000000000000000000000000400000000062 +:107E700000000000000000100000000000080000EA +:107E8000000000000000A000800080100000000042 +:107E9000000000000001004100000001000000009F +:107EA00000000000000000020000000000000004CC +:107EB000000000000000000021C00082401040C00F +:107EC00003C000C00090000000000000000000009F +:107ED00000000000000000000000000000000000A2 :107EE0000000000000000000000000000000000092 :107EF0000000000000000000000000000000000082 -:107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 +:107F0000000000000000024104908404C0039111AD +:107F1000002000C10804889000A00000008200003A :107F20000000000000000000000000000000000051 :107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 +:107F4000000004000001000100C1009000A1022116 :107F50000000000000000000000000000000000021 :107F60000000000000000000000000000000000011 :107F70000000000000000000000000000000000001 -:107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 +:107F800000000000000000008091048400040084D0 +:107F9000C01100800004808200000000000000008A :107FA00000000000000000000000000000000000D1 :107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 -:107FD00000000000000000000000000000000000A1 +:107FC0000000000400400010000300C10000112068 +:107FD0008010000000000000000000000000000011 :107FE0000000000000000000000000000000000091 :107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 -:108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:108050000000000000000000000000000000000020 +:1080000000000000000000000000410020001104FA +:10801000900340004190A0910080000000200004E7 +:1080200080000000000000000000000000000000D0 +:1080300000000000000000000000000000008000C0 +:1080400000000000000000400000000000000000F0 +:108050002000C1000000000000000000000000003F :108060000000000000000000000000000000000010 :108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 +:108080000000000000000000000000000088000068 +:108090000104C001058804C1910504C00000A001CD +:1080A00040A0900000000000000000000000000060 :1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 +:1080C000040004008200000000000004000088900A +:1080D00020000100C10000000000000000000000BE :1080E0000000000000000000000000000000000090 :1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F +:1081000000000000000000000000000000000888DF +:10811000000500910101098201C0C11003C11020B6 +:1081200000A000900382000000000000000000009A :10813000000000000000000000000000000000003F :10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F +:108150000000000241A100C100000000000000007A :10816000000000000000000000000000000000000F :1081700000000000000000000000000000000000FF :1081800000000000000000000000000000000000EF -:1081900000000000000000000000000000000000DF -:1081A00000000000000000000000000000000000CF +:108190008000030800851140C1910510A080911155 +:1081A00000000000008082000000000000000000CD :1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F +:1081C000000000000000000000000000200000008F +:1081D0000000002000C0102000C1000000000000CE :1081E000000000000000000000000000000000008F :1081F000000000000000000000000000000000007F :10820000000000000000000000000000000000006E -:10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E +:10821000000090111100008240408400A090048072 +:108220000303800000000080000000000000000048 :10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E +:10824000000000000000000000800000000280002C +:1082500000000000C18020118000201000000000FC :10826000000000000000000000000000000000000E :1082700000000000000000000000000000000000FE :1082800000000000000000000000000000000000EE -:1082900000000000000000000000000000000000DE -:1082A00000000000000000000000000000000000CE +:10829000000000009001A1008840C1910310050971 +:1082A000A184400190002090008482000000000022 :1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E +:1082C00000000000000000000090001000002001ED +:1082D000200004000000C140A1A0040040010000F3 :1082E000000000000000000000000000000000008E :1082F000000000000000000000000000000000007E :10830000000000000000000000000000000000006D -:10831000000000000000000000000000000000005D -:10832000000000000000000000000000000000004D +:10831000000000000000484200E00700000050009C +:1083200000E00000484200110000070000000000CB :10833000000000000000000000000000000000003D :10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D +:108350000000000000000000600600E007000000D0 :10836000000000000000000000000000000000000D :1083700000000000000000000000000000000000FD :1083800000000000000000000000000000000000ED -:1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD +:108390000000000000000000F9E178603636363653 +:1083A0000000000020104080E724E72466663F308C :1083B00000000000000000000000000000000000BD :1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D -:1083E000000000000000000000000000000000008D +:1083D00000009090909000000000F0003C00F00041 +:1083E000FF0000000000000000000000000000008E :1083F000000000000000000000000000000000007D :10840000000000000000000000000000000000006C -:10841000000000000000000000000000000000005C -:10842000000000000000000000000000000000004C -:10843000000000000000000000000000000000003C +:1084100000000000000000000000F9E178603F303B +:108420003F300000000104080201E7E724246666EB +:108430003F300000000000000000000000000000CD :10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C -:10846000000000000000000000000000000000000C +:10845000000000000000FF0000000000F0003C00F1 +:10846000F00000000000000000000000000000001C :1084700000000000000000000000000000000000FC :1084800000000000000000000000000000000000EC :1084900000000000000000000000000000000000DC @@ -161911,477 +161911,477 @@ :1084E000000000000000000000000000000000008C :1084F000000000000000000000000000000000007C :10850000000000000000000000000000000000006B -:10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B +:1085100000000000000000000000000000000CFC53 +:10852000FFFF0000000001020804100820047E3C48 +:108530007EFF00FF00FF00000000000000000000C0 :10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B +:1085500000000000000090900000000000000000FB +:10856000000F0C0C06062424000000000000000090 :1085700000000000000000000000000000000000FB :1085800000000000000000000000000000000000EB :1085900000000000000000000000000000000000DB -:1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000000000000000BB +:1085A0000CFC00000000FFFF804010208001400212 +:1085B000420042C30606F6F600000000000000007C :1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B +:1085D000000000000000000F909F0000000000005D +:1085E0000000000F0C0C0606242400000000000010 :1085F000000000000000000000000000000000007B :10860000000000000000000000000000000000006A :10861000000000000000000000000000000000005A -:10862000000000000000000000000000000000004A -:10863000000000000000000000000000000000003A +:10862000000000610020800112060061000080014E +:108630000800000000200000000000000000000012 :10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A +:108650000000000000000000000000008061000633 +:10866000000D0000100020298040000800000000DC :1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA +:1086A00000000000FFFF0000AAAAAAAAFF350035BB +:1086B000F0F0C3C300000000000000000000000054 :1086C00000000000000000000000000000000000AA :1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A +:1086E00000000000000055003C0000F0003C0000CD :1086F000000000000000000000000000000000007A :108700000000000000000000000000000000000069 :108710000000000000000000000000000000000059 -:108720000000000000000000000000000000000049 -:108730000000000000000000000000000000000039 +:10872000000000000000D714D71400FFF0F0FF3560 +:108730000035F0F0C3C3000000000000000000009E :108740000000000000000000000000000000000029 :108750000000000000000000000000000000000019 -:108760000000000000000000000000000000000009 +:10876000000000000000000055003C0000F0003C4C :1087700000000000000000000000000000000000F9 :1087800000000000000000000000000000000000E9 :1087900000000000000000000000000000000000D9 -:1087A00000000000000000000000000000000000C9 -:1087B00000000000000000000000000000000000B9 +:1087A00000000000000000003CF53C0580C1BCFD5D +:1087B0003C3C3C3CE800E8000000000000000000F9 :1087C00000000000000000000000000000000000A9 :1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000000000000089 -:1087F0000000000000000000000000000000000079 +:1087E0000000C30A000A000000000C0C0F0F00AAD2 +:1087F00000FF00000000000000000000000000007A :108800000000000000000000000000000000000068 :108810000000000000000000000000000000000058 -:108820000000000000000000000000000000000048 -:108830000000000000000000000000000000000038 +:10882000000000000000000000003CF53C0580C195 +:10883000BCFDF5F50505E8FFE8FF000000000000BD :108840000000000000000000000000000000000028 :108850000000000000000000000000000000000018 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000000000F8 +:1088600000000000C30A000A000000000C0C000019 +:1088700000AA00000000000000000000000000004E :1088800000000000000000000000000000000000E8 -:108890000000000000000000000000000000880050 -:1088A0000000000000002000200000000000880000 -:1088B0002000000000000000200020000000200038 -:1088C0004000000000002000200000000000200008 -:1088D0002000000000000000200020000000000038 -:1088E0002000200000000000200020000000000008 -:1088F00020002000000040000000200020050005AE -:1089000020002000000000002000200000000000E7 -:1089100020002000C00000000000200020004000D7 -:1089200000004000000040000000000000000000C7 +:1088900000000000000000000000000000000000D8 +:1088A00000000500000000000000000020000000A3 +:1088B00000008800000000000000000000004000F0 +:1088C0004000200000000000000000002000020026 +:1088D000020002000000000000000204000000008E +:1088E0002000200020000005000000000000200003 +:1088F0000000000004000000000000000000000074 +:108900000000000004000000000000000000200043 +:108910000000000020008400000000000000400073 +:1089200000004000020000004000000000000000C5 :108930000000400000004000000040000000400037 -:108940000000000400000000000000000000000023 -:1089500000000000000040000000000000000000D7 +:108940000000000000000000000000000000000027 +:1089500084008000A00000000000000080000000F3 :1089600040000000000000000000000000000000C7 -:1089700000000000000000004100000000000000B6 -:1089800000000000000000000000000000000000E7 -:1089900000000000000000000000000000000000D7 -:1089A0000000000000000000004000000000000087 +:1089700000000000000000000000000000000000F7 +:108980000000000000002000008200000002000043 +:1089900010000000000000000000000000000000C7 +:1089A00000000000000000000000000000000000C7 :1089B00000000000000000000000000000000000B7 :1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000000097 -:1089E0000000001000100010001000000000000047 -:1089F0000000000000000000000040000000000037 -:108A00000005000000000000000000000000000061 +:1089D0000100000000400000000000000000000056 +:1089E0000000000000000000000000000000000384 +:1089F0000000000002000000000000000000000075 +:108A0000000000080000000000000000000000005E :108A10000000000000000000000000000000000056 :108A20000000000000000000000000000000000046 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A600000000000000000000000000000000008FE -:108A7000000000000000000000000084808400006E -:108A80000084000000000000000000000000001052 -:108A900000000000000000000008000800000000C6 -:108AA00000000000000000000000000000000000C6 -:108AB00000000000000000000000000000000000B6 -:108AC0000000900000000000000000000000000016 -:108AD0000000000000000000000000000000000096 -:108AE0000000000000000000000000001000000076 -:108AF0000000000000000000000000000000000076 -:108B0000000000000000000000000000000800025B -:108B10000000000800050008000000000000000040 -:108B20000000000000000000000000000000000045 -:108B30000000000000000000000000000000000035 -:108B40000000000000000000000000000000000025 +:108A3000000000000008000000080008000000001E +:108A4000000800000000000000000000000000001E +:108A50000000020000080000000800840040000040 +:108A60000004000000000000000000000000000002 +:108A700000000000000000080000000800000000E6 +:108A8000001000080040000000000000008400000A +:108A90000010000000000008000000080040000076 +:108AA00000080010000001000000000000000100AC +:108AB00001000000000000000000000000000000B5 +:108AC0000010000000050000000000100010000071 +:108AD0000000000000000000000000100000010085 +:108AE0000100001000000000004101210000000210 +:108AF0000121000000000005000000100000000837 +:108B0000002100000010000000000800001000021A +:108B10000010000000000000000000000000001035 +:108B20000000000000000000020000000000000043 +:108B3000020002000000000000000000000041C030 +:108B400000004184001000C000840010000000C03C :108B50000000000000000000000000000000000015 -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000080000ED -:108B8000000000004100000000000000000800009C -:108B900000000000000000000000000000000900CC -:108BA00000000000000000000000080000000000BD +:108B600002A00200000000000000038202000000DA +:108B700003000200000021001000000000000000BF +:108B800000000000000000000000000000000000E5 +:108B900000002100000000000000000000000000B4 +:108BA00000000000000000000000000000000800BD :108BB00000000000000000000000000000000000B5 -:108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 -:108BF0001000000000000000000000000000000065 -:108C0000000400000003000300000000000000005A +:108BC000040000000400040004000000040004008D +:108BD00004000400040000000000A00004000400E1 +:108BE0000200000000000000000002000000008001 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 :108C10000000000000000000000000000000000054 -:108C2000000000000000000000000000000008003C -:108C3000080002001000000000000000000000001A -:108C40000020000000000000000000000000000004 -:108C5000000000000008000000000000000000000C -:108C600000000008000000080000000000000000F4 -:108C700000000000000000000000000000000000F4 -:108C80000000000000A0000000A0000000000000A4 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C4000000000080000000000000000000000001C +:108C500000000000000000400000000000000000D4 +:108C6000000080A000000000000800008008000054 +:108C700000020000000000000000000000000000F2 +:108C80000000000000A000400008000000000000FC :108C900000000000000000000000000000000000D4 -:108CA000000000000008000000A00000000000001C -:108CB00000000000000000000000000000000000B4 -:108CC00000000000000000000000000000000000A4 -:108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 -:108D000000000000820000000000000000000021C0 -:108D1000000800000000000000000000000000004B -:108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000080000000000000000DB +:108CA0000000000000A0000000080000008000009C +:108CB00000000000008000000000008000A1020011 +:108CC000008002000200010002000100000000001C +:108CD0000000002182000000820000008200A0004D +:108CE0000000000082000000900240000000000030 +:108CF00082C1820082000088A000010801000000FB +:108D00000000000000000000000000020000000061 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000004003 +:108D30000000000000000040000000000040004073 +:108D400080C0004080C0A10002008000020000003E +:108D500041C00000410000000000000000000000D1 +:108D60000000000000000000000000008000000083 +:108D7000000003400000000000404100020002002B +:108D800003000800080008000000000000000800C0 :108D900000000000000000000000000000000000D3 -:108DA00000000000000000000800000000000000BB -:108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE0000000000000000000000000000000000083 -:108DF0000000000000000000000000000000000073 -:108E00000000000000000000000000000000000062 -:108E1000000000080000000000000000000000004A -:108E20000000000000000000001000000000000032 -:108E300000000000000000000000000000880000AA -:108E40000000089008000000110000000000000071 +:108DA00000000000000000000000000000000000C3 +:108DB0000000000000000000000000000021000092 +:108DC00090000010000000210000000800000000DA +:108DD00000000000001100000040020400008200BA +:108DE0000000A000820082000000820082080000D3 +:108DF000000000008241000002030000000000416A +:108E00000021000200040002002100100000000008 +:108E1000000000000800000000000000000000004A +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E4000000000000008000000000000000000001A :108E50000000000000000000000000000000000012 -:108E600000000000000000000008000000000000FA -:108E700000000000000000000000000000000000F2 -:108E80000000000000000000000000A00000000042 -:108E90000000000000000000000000900000000042 -:108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 +:108E60000000000000080000008200000000000078 +:108E70000000000000000000000080000000000072 +:108E80000000000000000008000000820000000058 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000080000000000000000BA +:108EB000000000000000000000C0000000C0000032 +:108EC0000000000800C000080000000000C0000012 :108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 +:108EE0000000000040C004020082020402C000042E +:108EF00000C00210000040A0044082C002880302AB +:108F0000098200C1A08200000000000000000000F3 :108F10000000000000000000000000000000000051 :108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 +:108F300000000000000000000000000000000080B1 +:108F40000000000000800080008000000000008021 :108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F90002009002100030011000000000000000073 +:108F60000000000000008080000000808080808081 +:108F70000980000080800000800084008000800064 +:108F80008283820900400080000000000000000091 +:108F900000000000000000000000000000000000D1 :108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 -:108FF0000000000000000000000000000000000071 -:109000000000000000000000000000000000000060 +:108FB0000000000000000000000000000000800031 +:108FC00000000000000080000000000000008000A1 +:108FD0000000800000008000000000000000000091 +:108FE000000000000000000000008000000280007F +:108FF000830009090480408000002000410205042C +:10900000808000000083800080800000000000005D :109010000000000000000000000000000000000050 :109020000000000000000000000000000000000040 :109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 +:10904000C000000000000000C0000000C0000000E0 +:10905000C000000010000000C00000000000000080 +:1090600000000000000000000000020004000404F2 +:10907000C000020084000404C1C00000A10040C080 +:10908000040482A0A00002C040C008A000000000AC :1090900000000000000000000000000000000000D0 :1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000100000000004E +:1090B0000000000000000000000000000000008828 +:1090C000000000C0000000C0000000C00000000060 +:1090D000008800C002000000000400C00000000082 +:1090E00000000000000000000000000088400004B4 +:1090F000088202C088040008A0C104C00000C0A10A +:109100000040C008C010C0A1010209C1C0C00000D9 +:10911000000000000000000000000000000000004F :10912000000000000000000000000000000000003F :10913000000000000000000000000000000000002F -:10914000000000000000000000000000000000001F -:10915000000000000000000000000000000000000F -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF -:1091900000000000000000000000110005000200B7 +:10914000000000000080000000000000008000001F +:10915000000000000080000000000000008000000F +:10916000000000000000000000000000000000807F +:109170000000808080800040008580408089000061 +:10918000832000408080098909020205C1408009CE +:1091900000000000000000000000000000000000CF :1091A00000000000000000000000000000000000BF :1091B00000000000000000000000000000000000AF -:1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000000000008F +:1091C000000000000080000080008080000000009F +:1091D000800000000000000080000000000000008F :1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E +:1091F0008000800500000000800280C10080000027 +:1092000000000002808080800003002100A1000097 +:1092100080000000000000000000000000000000CE :10922000000000000000000000000000000000003E :10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E -:10925000000000000000000000000000000000000E +:1092400000000000000000080000C000100800003E +:109250000000C000000010000000C000000010006E :1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE +:1092700000000200040202C00000C0830408C040D5 +:1092800088000000400320100484A0000401820430 +:10929000C0C002000000000000000000000000004C :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE :1092C000000000000000000000000000000000009E :1092D000000000000000000000000000000000008E :1092E000000000000000000000000000000000007E :1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D +:109300000000008100000000000000005006000086 +:1093100000000000810600000000000000000000C6 :10932000000000000000000000000000000000003D :10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD +:1093400000000000000000000000FFFF0F0FFFFF03 +:10935000FF00FFFF0F0FFFFF0F0FFFFFFF00FFFFDB +:109360000F0FFFFFFF0000000000000000000000E2 +:109370000000000000005F5F0A5FFFFFE0EFFFFFFB +:10938000F5FFFFFFAAF300002B3FEBFFFCE8E8FC32 +:109390003CF53CFA8EBEB2BE0000000000000000AA :1093A00000000000000000000000000000000000BD :1093B00000000000000000000000000000000000AD -:1093C000000000000000000000000000000000009D -:1093D000000000000000000000000000000000008D -:1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C +:1093C000000000000000000000000000FFFF0F0F81 +:1093D000FFFFFF00FFFF0F0FFFFF0F0FFFFFFF005B +:1093E000FFFF0F0FFFFFFF00000000000000000064 +:1093F00000000000000000005F5F0A5FFFFFEFEF6A +:10940000FFFFC5CFFFFFFFF300003F2BFFEBFFEB9C +:10941000EBFFFFF5FFFACFFFF3FF000000000000B5 :10942000000000000000000000000000000000003C :10943000000000000000000000000000000000002C -:10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC +:1094400000000000000000000000F0F0F0F000005C +:10945000FFFFC3C3FFFFAAAAFFFF00FFFFFFF0F05B +:10946000FFFF0000FFFF0F0F0000000000000000E2 +:1094700000000000000000000000DFD0FFFFD70F59 +:10948000FFFFFCACFFFF5FF53C3C0000DDDDFF00B3 +:109490003F17FFD73FFF3FAA7DFF7DFF0000000081 :1094A00000000000000000000000000000000000BC :1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C -:1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B +:1094C000000000000000000000000000F0F0F0F0DC +:1094D000FFFFFFFFC3C3FFFFAAAAFFFF00FFFFFFBD +:1094E000F0F0FFFFFFFFFFFF0F0F00000000000084 +:1094F000000000000000000000000000DFDFFFFFB0 +:10950000D7FFFFFFFFAFFFFF5FF5FFFF0000DDDDCF +:10951000FFFF3F2BFFEBCFFFCFAA4DCF71F3000032 :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB -:1095A000000000000000000000610006000D000047 +:10955000800000209202408280000020920240821F +:109560008000002092024082800000208A020000D9 +:1095700000000000000000000000000000004002A9 +:1095800080000020920240E38006002D900200003F +:1095900040618006002D100240618006002D080207 +:1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B :1095E000000000000000000000000000000000007B :1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A +:109600000000000000000000000000000C000C0042 +:109610000000000000000202020200000000000042 +:10962000FF0000000000000000000000000000003B :10963000000000000000000000000000000000002A :10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A :1096600000000000000000000000000000000000FA :1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA +:1096800000000000000000000000000000000C00CE +:109690000CFF00000000000002023E3E000000003F +:1096A0000C0C0C0C0000000000000000000000008A :1096B00000000000000000000000000000000000AA :1096C000000000000000000000000000000000009A :1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A :1096F000000000000000000000000000000000006A :109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000141411 -:109730000010000000000000000000000000000019 +:10971000C3C3000F0000000000000C4D0C4D5000B2 +:10972000FAAA000000000000000000000000000095 +:109730000000000000000000000000000000000029 :109740000000000000000000000000000000000019 :109750000000000000000000000000000000000009 :1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 :1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000000000000B9 -:1097B0005050505000000000000000000000000069 +:1097900000000000000F0000000000000041004138 +:1097A0005000500000000000000000000000000019 +:1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 :1097D0000000000000000000000000000000000089 -:1097E0000000000000000000200000004000000019 -:1097F0000000200040000000000000000000000009 -:109800000000000000000000200000002000000018 -:109810000000200020000082000300000000000083 -:109820000000000000000000000000000000200018 -:109830000000000020002000008000000000000068 +:1097E0000000000000000000000000000000000079 +:1097F00000000000000000800000000000000000E9 +:109800000000000000000000000000000000000058 +:109810000000000000000080000340000000000085 +:109820000000000000000000000000000000000038 +:1098300000000000000000004100200000000000C7 :109840000000000000000000000000000000000018 -:109850000000000020002000008000000000000048 -:1098600000004000000000000000000000000000B8 -:1098700000000000000000000002000000000000E6 -:109880000000000000000000000040000000000098 +:1098500000000000000000002100000000000000E7 +:10986000000000C0000000000000004000000040B8 +:1098700000000000000000000004400000000000A4 +:10988000000000020000000000844088000000008A :1098900000000000000000000004000000000000C4 :1098A00000000000000000000000000000000000B8 -:1098B0000000000000400000000000040000000064 -:1098C0000000000000000000000000000000000098 -:1098D0000000000000000000000000040000000084 -:1098E00000000000000000000000900000000000E8 -:1098F00088000000000000000000000000000000E0 +:1098B00000000000000000000000200040820000C6 +:1098C0000000000000000000000000900000000008 +:1098D00000000000000000000000208400000000E4 +:1098E0000000000000000000000000000000000078 +:1098F0000000000000000000000000000000000068 :109900000000000000000000000000000000000057 :109910000000000000000000000000000000000047 :109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 +:109930000000000000000000000000050000000022 :109940000000000000000000000000000000000017 :109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 -:1099700000C0000000000000000000000000000027 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000800000000000000000000AF -:1099B0000000000000000000000000080008000097 -:1099C0000000000000C000000000000800000200CD -:1099D00000000000000000000008008400080000F3 -:1099E0000000000000000000000000050000000072 -:1099F0000000000000000000000000000000200047 -:109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000002125 +:1099600000000008000000000008000000000008DF +:10997000000000080000000800080084000000103B +:109980000000000800100000000800000000008433 +:10999000000000080010000800080000000000009F +:1099A000008400000008008400000008000000009F +:1099B0000000008800880000000840840000008447 +:1099C00000000010000800080000008200000000F5 +:1099D00000080000000000000008000000000084F3 +:1099E00000210021000000210000000300000021F0 +:1099F00000210021000000210000000000000021E3 +:109A000000210021000200080000000000050021E4 +:109A100000032021000000410000000000000021A0 :109A200000000021002100210021000000000000B2 -:109A30000021002100210021002100000000000081 -:109A40000021002100210021002100000000000071 -:109A5000002100210008002100210000000000007A +:109A3000002100210021002100210000000300007E +:109A40000008002100210021002100000008002161 +:109A50000004002100050021002100000000000892 :109A600000210000000000000000000000000000D5 -:109A700000000000000000000000000000000000E6 -:109A80008000000000000000000000000000000056 +:109A700000000000000000000000000000000010D6 +:109A800000000000000000C0000000000000000016 :109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000000B6 -:109AB000000000000800000000000000000000009E -:109AC0000000000000000000000000000000000096 -:109AD0000000090000080000000000000000000075 -:109AE00000000000000000008200000000000000F4 -:109AF0008211820000000000000000000000000051 +:109AA00000000000000000000008000000000000AE +:109AB000000000000008000000C0000000000000DE +:109AC000000000000000000000080000000000008E +:109AD000000000000008000000000000000000007E +:109AE0000000000000030000000000000000000073 +:109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 :109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 +:109B20000000000000000000000500000000000030 :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 -:109B700000000000000000000000000000000000E5 -:109B800000000000000000000000000000000000D5 +:109B700000000000000000000000000800000000DD +:109B80000000000000840000000000000000000051 :109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 +:109BA0000000000000840000000000000000000031 :109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 -:109BD000000000000000000000000000000800007D -:109BE0000000000000820000080000000000A0004B -:109BF000000008001000000000000000000000004D -:109C000000000005000000800000000000080000C7 +:109BD0000000000000000000000000000000000085 +:109BE00000000000000000840003000000080000E6 +:109BF0000000000000000003000800000021000039 +:109C0000000000030000000300080000000800003E :109C10000000000000000000000000000000000044 -:109C20000000000000000000000000000000000034 -:109C3000000000000008000000000000000000001C -:109C40000000000000000000000000000000000014 +:109C2000000000000000000800000000000000002C +:109C30000000000000210000000000000000000003 +:109C400000000000000000000021000200000000F1 :109C50000000000000000000000000000000000004 -:109C6000001100000000840000410000000000001E +:109C600000000000002100000003000000000010C0 :109C700000000000000000000000000000000000E4 -:109C800000000000000000000008000000000000CC -:109C900000000000000000000000000000000000C4 -:109CA00000000000000000000000000000000000B4 +:109C800000080000000000000000000000000000CC +:109C900000000000000000000000000000080000BC +:109CA000000000C0008400C000000000008400002C :109CB00000000000000000000000000000000000A4 :109CC0000000000000000000000000000000000094 :109CD0000000000000000000000000000000000084 -:109CE000080000000000000000000000000020004C -:109CF000080008008200A000080000000000000426 -:109D00000000000000000000000000000000004112 -:109D10000000000000000000000000000000000043 -:109D200000000000004000080008004000000000A3 -:109D3000000000000000000000080000000000001B -:109D400000000000000000080008000800000000FB +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D00000000000000080008002100000000000022 +:109D10000000002100000000000000000000000022 +:109D20000021000000080008000000000000000002 +:109D300000080000000800100021000000000000E2 +:109D400000000000000000080021000000000000EA :109D50000000000000000000000000000000000003 -:109D600000000000000000080021000800000000C2 -:109D700000000000000000000000210000000000C2 -:109D800000002100000000000000000000000000B2 +:109D600000000000000000080008000000000008DB +:109D700000000000000800000000000000000000DB +:109D800000000000000000000000000000000000D3 :109D900000000000000000000000000000000000C3 -:109DA0002000000000000000000000000000000093 +:109DA00000000000000000000000000000000000B3 :109DB00000000000000000000000000000000000A3 :109DC0000000000000000000000000000000000093 -:109DD0000000000000000000008200000000000001 -:109DE000000000000500000000000000000000006E -:109DF00000010001000100C00001000100C00121BC -:109E00000100010100A000100001000100C00000DD -:109E10000000200000000000000000000000000022 -:109E20000000000000020000000000000000000030 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E00000001000000C00000000000000000000091 +:109E10000000000000000000000000000000000042 +:109E20000001000000C00000000000000000000071 :109E30000000000000000000000000000000000022 -:109E40000000000000000002000000000000000010 +:109E400000000001000000C0000000000000000051 :109E50000000000000000000000000000000000002 -:109E600000000000000000020000000000000000F0 -:109E7000000000410041004100C000410041008558 -:109E8000104120410241000000800041004100C01B -:109E90000000110080000000000000000000000031 -:109EA0000000000910000000000000000000000099 +:109E600000000001010000C0000000000000000030 +:109E700000000000000000000000000000000000E2 +:109E800000000008090000000000000000000000C1 +:109E900000000000000000000000000000000000C2 +:109EA00000000008090000000000000000000000A1 :109EB00000000000000000000000000000000000A2 -:109EC0000000000000091000000000000000000079 +:109EC0000000000000080900000000000000000081 :109ED0000000000000000000000000000000000082 -:109EE0000000000000091000000000000000000059 -:109EF0000000000041000300000000804100C0009D -:109F00000000050005002180004084004100C100E0 -:109F10000000000000002100000000000000000020 -:109F20000000000002000900008080000000000026 -:109F30000000001000010000090000000000000007 -:109F40000000000000000200090000800000000086 -:109F500000000000000800004000000000000000B9 -:109F600000000000000002000980008000000000E6 -:109F700000000000001101000100000000C001000D -:109F8000C00000000000820084040041C100910074 -:109F9000C100004040000000000000000000000080 -:109FA000000000000000880002C000080800020055 +:109EE000000000000808030000000000000000005F +:109EF0000000000000001100000000000000000051 +:109F000000000000090003800080008000000000C5 +:109F10000000000900000300000000000000000035 +:109F20000000000009008200008000000000000026 +:109F3000000000090000000009000000000000000F +:109F40000000000000000900820000800000000006 +:109F500000000000000200001000000000000000EF +:109F600000000000000009008280008000800000E6 +:109F700000000000000900000000000000000000D8 +:109F80000000000000000200031000C010100200DA +:109F900000000000000000000100000000100000B0 +:109FA000000000000000020010C000C0100002000D :109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000880002C0000810002F -:109FD000020000000000000100000100000000007D -:109FE00000000000000000008800021000081000BF -:109FF000020000000000000000C00001C0C100001D -:10A000000000000100C004030003000100C10100C2 -:10A01000000000010000000000000000C00000007F -:10A0200000000000000000000088000000000000A8 +:109FC0000000000000000000020010C000C00400FB +:109FD000020000000000000000000000000000007F +:109FE00000000000000000000200201000C004106B +:109FF000020000000000000000000000000000005F +:10A000000000000000000000001000000000000040 +:10A010000000000000000000000000001000000030 +:10A020000000000000000000001000000000000020 :10A030000000000000000000000000000000000020 -:10A040000000000000000000000000880000000088 +:10A040000000000000000000000000100000000000 :10A050000000000000000000000000000000000000 -:10A060000000000000000000000000880000000068 -:10A07000000000000000000000000080004180C1DE -:10A080000000000000410083008200C1004100C1C7 -:10A09000200000000041004000000000000080009F +:10A0600000000000000000000000001000000000E0 +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000000D0 +:10A0900000000000000000000000000000000000C0 :10A0A00000000000000000000000000000000000B0 :10A0B00000000000000000000000000000000000A0 :10A0C0000000000000000000000000000000000090 :10A0D0000000000000000000000000000000000080 :10A0E0000000000000000000000000000000000070 -:10A0F000000000000000000000000000C10080001F -:10A1000080C100004100800002004100C141800088 -:10A110008005000041000000800041000000800038 -:10A1200000C100000000000000000000004100002D -:10A13000000400000000000000000000000000001B +:10A0F00000000000000000000000000000118000CF +:10A1000000C100000000000000000000004100004D +:10A1100000090000000000000000000000008000B6 +:10A1200000100000000000000000000000410000DE +:10A13000000200000000000000000000000000001D :10A1400080000091000000000000000000000041BD -:10A1500000000004000000000000000000000040BB -:10A1600080000084000000000000000000000041AA -:10A170000000000400000000000000000000C1001A -:10A180004000C0C1000001000200C1000100C189FF -:10A190008200C000000001000000C00001000000BB -:10A1A000400000C1000000000000000000000005A9 +:10A1500000000002000000000000000000000010ED +:10A16000800000C10000000000000000000000416D +:10A17000800000020000000000000000000000005D +:10A18000200000400000000000000000000000056A +:10A1900002000000000000000000000000000000BD +:10A1A000400000100000000000000000000000055A :10A1B000020000000000000000000000000000009D :10A1C0000000080000100000000000000000000077 :10A1D0000005020000000000000000000000000078 -:10A1E000000120000041000000000000000000000D -:10A1F0000005020000000000000000000000000058 -:10A20000000000000000004200000000000000000C -:10A210008112004807004800000000000000000014 -:10A22000000000000000001100000000000000001D -:10A23000810000E000004800000000000000000075 +:10A1E000000020000040000000000000000000000F +:10A1F0000005080000000000000000000000000052 +:10A20000000000000000000000000000000000004E +:10A21000810000E000004882000000000000000013 +:10A22000000000000000000000000000000000002E +:10A23000810000E0000048820000000000000000F3 :10A24000000000000000000000000000000000000E -:10A250000000810000E00000480000000000000055 +:10A250000000810000E000004882000000000000D3 :10A2600000000000000000000000000000000000EE -:10A270000000810000E00000480000000000000035 +:10A270000000810000E000004882000000000000B3 :10A2800000000000000000000000000000000000CE :10A2900000000000000000000000000000000000BE :10A2A00000000000000000000000000000000000AE @@ -162398,210 +162398,210 @@ :10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED :10A3700000000000000000000000000000000000DD -:10A38000000000000000757B0000000000000000DD +:10A38000000000000000747B0000000000000000DE :10A3900000000000000000000000000000000000BD -:10A3A00000000000DEAE747B000000000000000032 +:10A3A00000000000DE2E747B0000000000000000B2 :10A3B000000000000000000000000000000000009D :10A3C00000000000DE2E0000747B00000000000092 :10A3D000000000000000000000000000000000007D :10A3E000000000000000DE2E747B00000000000072 :10A3F000000000000000000000000000000000005D -:10A40000000000000000DE2E60C603000000000017 -:10A4100000000031E0000000000000000C0000001F -:10A420000000000000C06306615603400000000009 +:10A40000000000000000DE2E615603400000000046 +:10A4100000000230A0000000000000000C4000001E +:10A420000000000002C06A86615603400000000080 :10A4300000000230A0000000000000000C400000FE :10A440000000000002C06A86000061560340000060 :10A45000000000000230A0000000000000000C40DE :10A4600000000000000002C06A8661560340000040 :10A47000000000000230A0000000000000000C40BE -:10A4800000000000000002C06A86000040000000DA -:10A49000000000000000000000000000000020009C -:10A4A000000000000000000000000000200040004C -:10A4B000000000000000000000000080900000404C -:10A4C0000080A0000000000000000000000020004C -:10A4D0008800000000000000A00000000000000054 -:10A4E000020000000000000000000000000020004A -:10A4F0008800000000002000200020000400000070 -:10A50000200020000000000000000000000000000B -:10A51000400000004000000040000000400000003B +:10A4800000000000000002C06A860000000000809A +:10A49000208000000000000000000000000000001C +:10A4A000200000000000000000000000000000008C +:10A4B000200000000000000000000000000000007C +:10A4C000200000000000000000000002000000006A +:10A4D0000000200000000000000000040000000058 +:10A4E000000000000000000000000000000000006C +:10A4F000000000000080008000800080000000005C +:10A50000000000000000000000000000000000004B +:10A5100040400010400000004000000040004000AB :10A5200040000000000000000000000000000000EB -:10A53000000000004000000000000000402000007B -:10A5400000010908000000000000000000000000F9 -:10A5500000000000000040000000000000000000BB -:10A56000000080000000000000000000000000006B -:10A5700000000000000000008000800080008000DB -:10A5800000008000800000000000000000000000CB -:10A5900000000000000000000000000000000000BB -:10A5A0000000000800000000000000002000000083 -:10A5B000000000400000000000000000000010103B -:10A5C000401008020808000000000000000000031E -:10A5D000004000000000000000000000001100002A -:10A5E00004400000004000000000000000000005E2 -:10A5F000000000000040A01002100004002000C075 -:10A60000000000000209000000000000000000003F -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A6400080008000004100010000000000000000C8 -:10A6500000000000000000000000000800000000F2 -:10A6600000008000000800000000000800C000C0DA -:10A6700000000000000000000001000900010009C6 -:10A6800000050008000800000000000800000000AD -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA +:10A5300000000000000000000000000040000000DB +:10A540000000000000000000000000000000040007 +:10A5500000000000000000000000000000000000FB +:10A5600000000000000000000000000000000000EB +:10A5700000000000000000040004000400040000CB +:10A580000000000000004000400000000000021039 +:10A590000800084002100000000000000000000059 +:10A5A00000000000000900000000000000000000A2 +:10A5B000000000100000000000000000000000008B +:10A5C0000000000000090000000000000000000082 +:10A5D000000000000000000000000000000000007B +:10A5E000000000000000000000000000000000006B +:10A5F000000000000000000000000000000000005B +:10A600000000000000000009000000000000000041 +:10A6100080018000808480010000000000000000B4 +:10A620000000000800000008000800000000000012 +:10A630000000000000000000000000000000000812 +:10A6400000080008000800080008000000100000D2 +:10A6500000000000000800000000000000000008EA +:10A6600000080010000800080008000800000000B2 +:10A6700000000000000800000000000000000008CA +:10A680000008000000840008020800080000000024 +:10A690000000000000000000000000000000004179 +:10A6A000000000000000000800000002000000039D :10A6B000000000000000000000000000000000009A :10A6C000000000000000000000000000000000008A -:10A6D0000021000000000000000000000000000059 -:10A6E0000008001000000000000000000021000031 -:10A6F0000000000000000000000000000005000253 -:10A7000000410008000000000100000400000000FB -:10A710000000000900000000000008000000000028 -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000008000001 -:10A750000000000000000000000000820000000077 +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A7100000000000000009000082000000000000AE +:10A720000000000000000000000000000008000021 +:10A730000008000000000000000000000000000011 +:10A7400000080000000000000000000000080000F9 +:10A7500000100000000000000000000000000000E9 :10A7600000000000000000000000000000000008E1 -:10A77000000000A000000000000000000000000039 -:10A7800000010800000000000000020000010008B5 -:10A7900000000008000000000000000000000000B1 -:10A7A000000900000000000000090000080000008F -:10A7B0000000000000000000000000008200000017 -:10A7C0000000000000000000000008000000000081 -:10A7D0000000000000000000000000000800000071 -:10A7E000002100000000000800000040820000007E -:10A7F0000800000000000000000000800000008051 -:10A800008400000008801000010020800880000003 -:10A8100000000000018000030000000000000000B4 -:10A820000000000000000000000000000000000028 +:10A7700000000000000000000000000000000008D1 +:10A7800000000000000000000008000000000008B9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A8100000000000000000000000000000820000B6 +:10A8200000A0000000000000000000000000000088 :10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000008484 -:10A850000000000000000000000000000000008276 -:10A8600000000000000000000000000021000000C7 -:10A870000000000000000000000000000040008216 -:10A88000000200000082000480000800850400042B -:10A890000000000010000240000000000000000066 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A000000000000003000000000008000000009D +:10A8B0000000000000000000000000000008000090 :10A8C0000000000000000000000000000000000088 -:10A8D0000000000000080008000000000000000068 -:10A8E0000000000000000003400000000008080015 -:10A8F0000000000000000000000000000000200038 -:10A9000084000000400002204002404000208402F9 -:10A910000808000282100000820000000000000011 -:10A920000000000000000000080000000000008897 -:10A93000000000000000000000000800000000000F -:10A9400000000000000800000000000000000008F7 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000080000000000000000DF -:10A9700000080000000000000000000000A000002F -:10A98000000000000000000880012101000100011A -:10A9900000090001000100010000000003000000A8 -:10A9A00000000000000000000000000000000000A7 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000080000000000C00000000000C000D0 +:10A90000000008000000000000000000000500003A +:10A910000000000000000000000000000000000037 +:10A92000000000000000000000000000000000081F +:10A93000000000080000000000000000000000000F +:10A9400000000000000000000000000000000008FF +:10A9500000000008000000000000000000000000EF +:10A9600000000000000000000000000000000000E7 +:10A9700000080000000800000000000000000000C7 +:10A9800000000000000000000000000000000000C7 +:10A9900000A000000008000000000000000000000F +:10A9A000000000000000002100000021000800005D :10A9B0000000000000000000000000000000000097 :10A9C0000000000000000000000000000000000087 -:10A9D00000000000000000400040002100210000B5 -:10A9E0000000000000000000000010000000000057 +:10A9D0000000000000000000000000000000000077 +:10A9E0000000000000000000000000000000000067 :10A9F0000000000000000000000000000000000057 -:10AA00000000000008000000004000C0402000A03E -:10AA1000002000040004014000001000018000003C -:10AA20000000000000000000000000000000000026 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000500000000000031 +:10AA2000090000900000100000000000000000007D :10AA30000000000000000000000000000000000016 :10AA40000000000000000000000000000000000006 :10AA500000000000000000000000000000000000F6 -:10AA600000000000050000000000000000000000E1 -:10AA700000000000080000000004000000A000002A -:10AA800000000000000005000000410100058801F1 -:10AA900000050001410100012001000010000240FA -:10AAA00000000000000000000000000000000000A6 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA000000000C00082000000080000000000005C :10AAB0000000000000000000000000000000000096 :10AAC0000000000000000000000000000000000086 -:10AAD00000000110008800080008000000000000CD +:10AAD0000000000000000000000000000000000076 :10AAE0000000000000000000000000000000000066 :10AAF0000000000000000000000000000000000056 -:10AB0000000000009190001084089088C0C00010E0 -:10AB10000890A088002102030010009100000000AE -:10AB20000000000000000000000000000000000025 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB200000000000008000800000008000000000A5 :10AB30000000000000000000000000000000000015 :10AB40000000000000000000000000000000000005 -:10AB50000000000020000000008000000000000055 +:10AB500000000000000000000000000000000000F5 :10AB600000000000000000000000000000000000E5 :10AB700000000000000000000000000000000000D5 -:10AB80000000000000001000218080800000918003 -:10AB900008004180808011418390058300104000AF -:10ABA00000000000000000000000000000000000A5 +:10AB800000000000000000000000000000000000C5 +:10AB900000001100000000000000000000000000A4 +:10ABA0000000000000008000001000000000000015 :10ABB0000000000000000000000000000000000095 :10ABC0000000000000000000000000000000000085 -:10ABD000000000000000000008210500418800007E +:10ABD0000000000000000000000000000000000075 :10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000100000000045 -:10AC0000000000000000000080008009002100001A -:10AC10002000800890C090890011002000410003AE -:10AC20000000002100000000000000000000000003 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000003000000200000000000000000000011 +:10AC200000000000000000000800900100C00002C9 :10AC30000000000000000000000000000000000014 :10AC40000000000000000000000000000000000004 -:10AC50000000000000000000000201000120018946 +:10AC500000000000000000000000000000000000F4 :10AC600000000000000000000000000000000000E4 -:10AC7000000000000000000000000000000100884B -:10AC800000000000000000000000A00040001001D3 -:10AC90000090020810012185C190002000000000F2 -:10ACA00000010000000000000000000000000000A3 -:10ACB0000000000000000000000000000000000094 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA000000000000000000000008810008800087C +:10ACB000A0C0000000000000000000000000000034 :10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000010000000100054 -:10ACE000080000000000000000000000000000005C +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 :10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000002011009082 -:10AD10000008908908400009081021C0A001000027 -:10AD200005000200000000004000000000000000DC -:10AD30000000000000000000000000000000000013 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000200000001000000000030 +:10AD200000000000000000000000000000000080A3 +:10AD30000080808000000000000000000000000093 :10AD40000000000000000000000000000000000003 :10AD500000000000000000000000000000000000F3 -:10AD60008000000000000000000000000000000063 +:10AD600000000000000000000000000000000000E3 :10AD700000000000000000000000000000000000D3 -:10AD8000000000000000000000000000000000883B -:10AD9000002000A01008800300908088118280218C -:10ADA0002111900080000000000000000000000061 -:10ADB0000000000000000000000000000000000093 +:10AD800000000000000000000000000000000000C3 +:10AD9000000000000000000080000000080000002B +:10ADA00000000000000000000000000000008040E3 +:10ADB0000000008080000000000000000000000093 :10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000C109A9 -:10ADE000C100C00091100000000000000000000041 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 :10ADF0000000000000000000000000000000000053 -:10AE000080008000000080000000000000000000C2 -:10AE10000009808000C18000C12000A000008800DF -:10AE2000A103914190000300800300210000000075 -:10AE30000000000000000000000000000000000012 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE3000C00108100040A000000000000000000059 :10AE40000000000000000000000000000000000002 :10AE500000000000000000000000000000000000F2 -:10AE6000C100080040008800000000000000000051 +:10AE600000000000000000000000000000000000E2 :10AE700000000000000000000000000000000000D2 -:10AE80000000C000040020000200000000000000DC -:10AE90000000000082A01040080083008840882045 -:10AEA0000300C100A00003004000C0000000080033 -:10AEB000880000000000000000000000000000000A +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 :10AEC0000000000000000000000000000000000082 :10AED0000000000000000000000000000000000072 -:10AEE000000000000000430000000000000000001F +:10AEE0000000000000000000000000000000000062 :10AEF0000000000000000000000000000000000052 -:10AF000000000000000600004300000000000000F8 -:10AF1000000000000000000000000000818100C867 -:10AF200043008400500A00C84300000000210000D4 -:10AF300043000000000000000000000000000000CE +:10AF00000000000000000000000000000000000041 +:10AF1000000000000000000000000000000000E051 +:10AF20000000000000000000000000000000000021 +:10AF300000000000427E99990C0C0F0000000000F8 :10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 -:10AF6000000000004242000F00000000000000004E +:10AF600000000000000000000000000000000000E1 :10AF700000000000000000000000000000000000D1 -:10AF8000000000000000000034300000000000005D -:10AF9000000000000000F3C0F3C04FEF4F4FD98016 -:10AFA000FFFFFCC07E7EF0F0C0C00000000030302B -:10AFB0000000000000000000000000000000000091 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB000000000000000427EFF000C0C0F000000AB :10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 -:10AFE00000000000000042420F00000000000000CE +:10AFE0000000000000000000000000000000000061 :10AFF0000000000000000000000000000000000051 -:10B00000000000000000000004000010000000002C -:10B010000000000000000000F3F3F3F30207020257 -:10B020000000D980FCC0424200F0C0C00000000017 -:10B0300030303C3C00000000000000000000000038 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 :10B040000000000000000000000000000000000000 :10B0500000000000000000000000000000000000F0 :10B0600000000000000000000000000000000000E0 @@ -162609,495 +162609,495 @@ :10B0800000000000000000000000000000000000C0 :10B0900000000000000000000000000000000000B0 :10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 +:10B0B00000000000000000000000FF9918188080C8 +:10B0C0008080000000000000000000000000000080 :10B0D0000000000000000000000000000000000070 -:10B0E000000000000000000000000F0F0F0E000025 +:10B0E0000000000000000000000000000000000060 :10B0F0000000000000000000000000000000000050 :10B10000000000000000000000000000000000003F -:10B110000000000000000000000000006400666401 -:10B120000F270F272D2D99FF0F0F00FFFBDB8181CC -:10B13000000000000000000000000000000000000F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B130000000000000000000000000006600181879 :10B1400000000000000000000000000000000000FF :10B1500000000000000000000000000000000000EF -:10B160000000000000000000000000000F0F0F0FA3 +:10B1600000000000000000000000000000000000DF :10B1700000000000000000000000000000000000CF :10B1800000000000000000000000000000000000BF -:10B190000000000000000000000000000000FE664B -:10B1A000FFFE276627662D2D00663C3C6666FBDBAE -:10B1B000810000000000000000000000000000000E -:10B1C000000000000000000000000000000000007F +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B0000000000000000000000000000000A000EF +:10B1C000500000900001000000000000000000009E :10B1D000000000000000000000000000000000006F -:10B1E0000000000000000000000000000000A0615E -:10B1F0004006000D000000000000000000000000FC +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F :10B20000000000000000000000000000000000003E -:10B21000A00000300000000000000000000000005E -:10B2200000610006000D00010061203DC0490008DA -:10B23000A061403DC009000010000038000000007F +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000610007000D0000A9 +:10B23000000000000000000000000000000000000E :10B2400000000000000000000000000000000000FE :10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE -:10B270001400A0A00000000000000000000000007A +:10B2700000000000000000000000000000000000CE :10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE -:10B2A0000000000000008B8BEB8B41416969E46674 -:10B2B000667266663636FCFCFCFC0000000000008E +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E :10B2C000000000000000000000000000000000007E :10B2D000000000000000000000000000000000006E :10B2E000000000000000000000000000000000005E -:10B2F000000014000000000000000000000000003A +:10B2F000000000000000000000000000000000004E :10B30000000000000000000000000000000000003D :10B31000000000000000000000000000000000002D -:10B32000000000000000000082828B822828969690 -:10B33000E4E46672666C666C0303030300000000BD +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D :10B3400000000000000000000000000000000000FD :10B3500000000000000000000000000000000000ED :10B3600000000000000000000000000000000000DD -:10B370000000000000000000AA00F0000000000033 +:10B3700000000000000000000000000000000000CD :10B3800000000000000000000000000000000000BD :10B3900000000000000000000000000000000000AD :10B3A000000000000000000000000000000000009D -:10B3B00000000000003C00F0366C000000000000BF +:10B3B000000000000000000000000000000000008D :10B3C000000000000000000000000000000000007D :10B3D000000000000000000000000000000000006D :10B3E000000000000000000000000000000000005D -:10B3F00000000000000000000000AA00F0000000B3 +:10B3F000000000000000000000000000000000004D :10B40000000000000000000000000000000000003C :10B41000000000000000000000000000000000002C :10B42000000000000000000000000000000000001C -:10B43000000000000000003C00FF36690000000032 -:10B4400000000000000000000000000002000000FA -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B48000000040000000000000000000000000007C -:10B49000000000000000C0000000000000000000EC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C0000000000000000000040000000000C000B8 -:10B4D000000000000000400000000000000000002C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000002000010000800180DA +:10B4500020000000000000002000000000000000AC +:10B46000000000000000200020000000000000009C +:10B47000200000000000000020000000000000008C +:10B48000000000000000200000002000000000007C +:10B49000000020000000000000002000000000006C +:10B4A000000000000000000000002000000000007C +:10B4B000000020000000000000004000000000002C +:10B4C000000000000000000000000000400000023A +:10B4D00040100000000000000000400000000000DC :10B4E000000000000000000000004000000000001C -:10B4F000000000000000000000000000000000004C +:10B4F000000000000000000000004000000000000C :10B50000000000000000000000000000000000003B -:10B510000000000000000900000000000000000022 +:10B51000000000000000400000001000400000009B :10B52000000000000000000000000000000000001B :10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B550000000000000000000820000000000000069 +:10B5400000000000000000000000000040000000BB +:10B5500000000000000000000000000000000000EB :10B56000000000000000000000400000000000009B -:10B5700000000000000000000000000900000000C2 -:10B58000000000200000000011090000000300007E -:10B5900000000000000000000000000000000000AB -:10B5A000008000000000000240000089000200004E -:10B5B0000000000900020000000000090000000077 -:10B5C000000000000200000900000009000900005E -:10B5D0000000000000000008000000000000000063 -:10B5E00000000000000000000000000000000084D7 -:10B5F00000000000000000080084008400840000B7 -:10B6000000000000000100000000400000000000F9 -:10B610000000000000000000000800000000000022 -:10B620000000001000000008000180080010000960 -:10B630000000000000000001000800880000000079 -:10B6400000000000000000080000000800000008E2 -:10B6500000000000000000000000000800000008DA -:10B6600000000000000000000000000000000000DA +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B590008200000000000000000000100000000019 +:10B5A000000000400000000000000040000000001B +:10B5B000000000000000000000000000000000008B +:10B5C00002000000000000000000000000008000F9 +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000800000000000000000000000000083B +:10B6000000080000008400000008000000000000A6 +:10B610000040008400000000000000000000000066 +:10B620000040004000000000000000080000000092 +:10B630000000000000000008000000000000000002 +:10B6400000000008000000000000000800000000EA +:10B6500000000000000000000000000000000000EA +:10B6600000080005000000000000000200000000CB :10B6700000000000000000000000000000000000CA -:10B680000003000800000000000000200020000867 -:10B6900000000004000400000000000200000000A0 -:10B6A0000000000000210000000001000000000078 -:10B6B0000000000000200020000000A000A0009179 -:10B6C00000890000000000000000000000000000F1 -:10B6D000000000000000000000000000000000006A +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000008000000000000A2 +:10B6A0000000000000080000000000000000000092 +:10B6B000000000000000000000000000000000008A +:10B6C000000010000000000000000000000000006A +:10B6D0000000000000000000000000820084000064 :10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000040000A -:10B700000000000000000000009000044101000162 -:10B71000000900000001000100000000000000001E -:10B7200000000300000000000000000002002000F4 -:10B730001100000003004101410121000903112112 -:10B7400000200020008400000000000009004100EB -:10B7500005000000000000000000000000000000E4 +:10B6F0000000000800000000000000000000000042 +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B7300000000000000000004100000000000000C8 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000400000000000000000000E5 :10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000800000200000000BF -:10B780000000000000000000000000000000C08277 -:10B79000C0008400000000000000008000000000E5 -:10B7A0001000820082008400000000000080000081 -:10B7B0000800000000000000000800000000000079 -:10B7C00000000000000090000000000000000000E9 -:10B7D0000200000000000000000000000000000067 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000001000048 +:10B7F0000000000000000000000000000000000049 :10B800000000000000000000000000000000000038 -:10B810000003000000000000000000A00004000081 -:10B820000000000800000000000000000000001000 +:10B810000000000000000000000000000000000028 +:10B8200000000000000000000000000000000040D8 :10B830000000000000000000000000000000000008 -:10B8400000000000009000000000008405C000001F -:10B850000000910000000000000000000000000354 -:10B8600000000000000800000000000000000000D0 +:10B8400000000000000000000800000000000000F0 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000008D0 :10B8700000000000000000000000000000000000C8 -:10B88000000020009011200000020404820810052E -:10B8900000030420002000200000000088000000B9 -:10B8A00000040000000000000000000088004000CC -:10B8B0000800002182008202020082090420012087 -:10B8C00001020000008000A0008000000000840051 -:10B8D000000088000000840002000000000000005A -:10B8E00000000000000000000000000000000088D0 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000080000000000000080 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000009000008000057 +:10B8E0000000000000000000000000000000000058 :10B8F0000000000000000000000000000000000048 -:10B9000000000000800000008000000180850091A0 -:10B91000000800008001000100010000000000009C -:10B920000000000100000000000000000500000011 -:10B9300000048000000000000000800021848003DB -:10B9400004010401098803200821002011000500DA -:10B9500005000000009000000000800000080000CA -:10B960000040000000000000000000000000000097 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000002000200000008000030008EC -:10B9900000080000000040880020000800000000AF -:10B9A0000000000000000000000000000000840013 -:10B9B000000000000000024000000041820500007D -:10B9C00000020000002000200020000000A0000075 -:10B9D0000000000900000202C041000088000000D1 -:10B9E0000000000100000000000000000000000056 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B940000000000000900000000000000000000067 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000210000000000000008AE +:10B9700000000000000000080000000000000000BF +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 :10B9F0000000000000000000000000000000000047 -:10BA00000000000000000001000100000020000014 -:10BA100000000001000000008002000100010000A1 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 :10BA20000000000000000000000000000000000016 -:10BA3000090000000000000080010000000000007C -:10BA40004100000900000001000100010000002188 -:10BA50000000000000000000800000C0000000C0E6 -:10BA60000000009000000000000000000000000046 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000002000000000D6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000101C0000001000000000000000013 :10BA700000000000000000000000000000000000C6 -:10BA800000C091908208000000C000908810000063 -:10BA900000410010000810100210901000829088E1 -:10BAA0000000000004000100000000000000000091 -:10BAB000000000200090002008080104828202405B -:10BAC0004041004005904082202010C0009000209E -:10BAD0000202000000000000000000A002040100BB -:10BAE00000000000008000000000000000000000D6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE00000000402212100410020000000000000AD :10BAF0000000000000000000000000000000000046 -:10BB000000000080838080000000008041800000F1 -:10BB1000000000C100910089008900808000008041 -:10BB20008080000000008000030000000000000092 -:10BB300000000000000000000000800010830904E5 -:10BB40000090002111000380808000008080008030 -:10BB50000020808300000000000000000000800042 -:10BB600009000000000000110000000000000000BB +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB60000000000010008900020090880000000022 :10BB700000000000000000000000000000000000C5 -:10BB80000000000000000000800080801100110013 -:10BB90000211821180000002800200001080A103C7 -:10BBA000A083A0830000000800000008000000003F -:10BBB00000000000000080000000800000001180F4 -:10BBC0001088089109030900090080008989000094 -:10BBD0000041800480000000000000000000000020 -:10BBE0008000000000800000000100000000000054 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE00000000000000001088200A000048800009E :10BBF0000000000000000000000000000000000045 -:10BC0000000000000000000000008400C0908800D8 -:10BC100000000011C020100800001020080021C002 -:10BC200003018282889100000001000000000000F2 -:10BC3000000000000000000008000000A00002005A -:10BC40009002404091400801400200008400C190F1 -:10BC5000880000000820C0A00000000000000000D4 -:10BC6000000002820000008240000000909000006E +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000001000000010000D2 :10BC700000000000000000000000000000000000C4 -:10BC8000000000000000000000000008089000C153 -:10BC900000000010009000C090A0000890880802EA -:10BCA000909000840090C00200000000C0000000DE -:10BCB00000000000000000000000A01000100010B4 -:10BCC000A0100888008804C103C0004000880491C7 -:10BCD00000C0C0000040042000C0000000000000C0 -:10BCE0000000000000002020000480000000808090 -:10BCF0000000000000000000000000000000000044 -:10BD0000000000000000000000000009000900C160 -:10BD1000008500090002008200828080000091807E -:10BD20008080808000800080808000000000800093 -:10BD30000000030000000000000000000000008080 -:10BD40000000800000004182112189840010001051 -:10BD500000A11183000000800000008000000000AE -:10BD600000000000000000000000000080118000C2 -:10BD70008000000000000000000000000000000043 -:10BD80000000000000000000000000008011000220 -:10BD9000001100008891910909000003A121908001 -:10BDA00089800080C1008588918000030000000028 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE000000000000000000000000010090920080A +:10BCF0000010000000000000000000000000000034 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD60000000000000000000000000004120210051 +:10BD7000200005410000000000000000000000005D +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 :10BDB0000000000000000000000000000000000083 -:10BDC000000000800000A111030341009011410018 -:10BDD000038810001010801180088080000000008F -:10BDE0000000000000000000000000000000C00192 -:10BDF0002000900000000000000000000000000093 -:10BE000000000000000000000000000000009001A1 -:10BE1000080800010000C109201000000000A10175 -:10BE2000034089400008918885C09190A0010000DE +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE000000000000000000000000000000001044E +:10BDF0000010000000010000000000000000000032 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 :10BE30000000000000000000000000000000000002 -:10BE40000000000200080000050282834090030009 -:10BE500001A0014000200001C001202002020000DA -:10BE600000000000000000000400000020040000AA -:10BE70000006000043000000000000000000000079 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE70000000000000000041000000000000000081 :10BE800000000000000000000000000000000000B2 -:10BE90000021000043000000418200C84300000070 -:10BEA000600600C843000000821100C843008841BA -:10BEB0000000000000C80000410000000000000079 -:10BEC0000000000000000000000000060000430029 -:10BED00000000006000043000000000A00004300CC +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 :10BEE0000000000000000000000000000000000052 -:10BEF000000000F0F00FFF00FF0000000000000055 +:10BEF0000000000000000000000000000000000042 :10BF00000000000000000000000000000000000031 -:10BF10000000000000FF000000F0000000AA000088 -:10BF200000F0F0FFAAAA30F3F3F30000FFFF0F00C8 -:10BF30000F000000000000000000000000000000F2 -:10BF40000000000000000000000003CF040000001B -:10BF500000FF0F0F00000000003CFCC000F0AF5FCE -:10BF6000AAAAAA5500000000000000000F0FF0F080 -:10BF7000FF0000FF000000FFFF00FF0000000000C6 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 :10BF800000000000000000000000000000000000B1 -:10BF900000000000000000FF000000F0000000AA08 -:10BFA000000000F0000FAAAA3030F3301000FFFAB2 -:10BFB000000D000F00000000000000000000000065 -:10BFC0000000000000000000000003CFFFFF0000A1 -:10BFD00000003C3C000000000000003CC0FC00F001 -:10BFE000A0500000F0F000000000000000000F0F63 -:10BFF000F0F0FF0000FF00FF00FF00000000000065 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF000000000000000000000000000000500003C :10C000000000000000000000000000000000000030 -:10C010000000000000000F000000550000000F00AD -:10C020000000141400007FFF5DDFFFFF0000C2422C -:10C030000303AAAA0A0A0000000000000000000092 -:10C04000000000000000000008000C0CBEAAFFBEAB -:10C050000000304000EFD3D7C33C0F0F417D3C00C0 -:10C06000F3CF3C0096963C3C00000000000000002E -:10C07000FF0000FF0F0F0F0FFF00FF000000000088 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000005BB :10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000F000000550000003C -:10C0A0000F00000014140000222000007D417D419B -:10C0B00042420303AAAAAA280000000000000000D0 -:10C0C0000000000000000000000000000000280048 -:10C0D000AA280000000000EFD3D3C33C0F0F7D411E -:10C0E0003C00300C3C00FF0000000000000000009D -:10C0F0000000FF0000FFF0F0F0F0A00000300000B2 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000610006000DCC :10C10000000000000000000000000000000000002F -:10C11000000000000000000000000363033E0C0D5F -:10C1200092C003E3033CCC01C2C000610034C00DE7 -:10C13000000000410036C00D000000000061000753 -:10C14000000D0000000000000000000000000000E2 -:10C15000000000000061303E004D00010061033E20 -:10C160000C0D92C003E3033E0C0DC2C000000000A2 -:10C1700000000000400080000020100200000000CD -:10C1800000000000000000000000000000000000AF +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C17000000000000000000000000000FFFF0000C1 +:10C18000F5D5F5E50000000000000000000000000B :10C19000000000000000000000000000000000009F -:10C1A0000000000000FF00F0A3FBFFFFF555F000CA -:10C1B000000000000000AA050000000000000000D0 +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F :10C1C000000000000000000000000000000000006F -:10C1D000000000000000C3C3C3C30050AFFF005500 -:10C1E000055F741400000000000000000000000063 -:10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F00000000000000000000000000000001F0020 +:10C2000000F0F555F5A5000000000000000000005A :10C21000000000000000000000000000000000001E -:10C22000000001000000000F0000A0080000F5550C -:10C23000F0000000000000A0AA00000000000000C4 +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE :10C2400000000000000000000000000000000000EE -:10C250000000000000000000C3F7003400F50AFFF2 -:10C26000147D0FFF7D74000000000000000000003E +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE :10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE +:10C28000F3F3FFFF020F02020000000000000000B5 :10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000A0ACACAAEC -:10C2B0000000C0C00000000000000000FFD7DFC386 +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E :10C2C000000000000000000000000000000000006E -:10C2D00000000000000000000000005500018B8BF2 -:10C2E000EBEB00000000747414140C0C0C0C000038 +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E :10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D +:10C300000000C3C3CBCF00FF00000000000000000E :10C31000000000000000000000000000000000001D -:10C320000000000000000000000000000000AAACB7 -:10C33000AAAAC000C30000000000000000007FFFA8 -:10C34000FF410000000000000000000000000000AD -:10C3500000000000000000000000000055FF45CF75 -:10C360008B82EB8B000000007D7D74740C0C0C0C38 +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD :10C3700000000000000000000000000000000000BD -:10C38000000000000000C0000000000000000000ED -:10C39000000000000000000000000000200000007D -:10C3A000000000000000000000000000000000008D -:10C3B0000000000000000000000000000000C000BD -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000010000000000000000000000000000003C -:10C4000000000000000040000000400000000000AC -:10C41000000000000000000000004000000040009C +:10C3800000000000000000000000880040000000E5 +:10C39000000000002000200020000000000000003D +:10C3A000200000000000000000002000200000002D +:10C3B000000000002000200020000000000000001D +:10C3C000200000000002000000000000200020000B +:10C3D00000000000000020002000200000000000FD +:10C3E0000000000000030000000000000000010049 +:10C3F0000100008000802000200020000000840058 +:10C40000000000000000400040004000000000006C +:10C41000000000000000000000000000000000001C :10C4200000000000000040000000000000000000CC -:10C4300000000000000000000000000000002000DC -:10C4400041000000000000000000000000000000AB +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC :10C4500000000000000000000000000000000000DC :10C4600000000000000000000000000000000000CC -:10C4700000000400000000000000000000000000B8 -:10C48000000000000000000000000000001000009C -:10C490000000040000000000000082000010000006 -:10C4A000000000000000000008000800001000105C -:10C4B00000000000000000000880000000000008EC -:10C4C0000000000900000000000300100000000050 -:10C4D0000000000000000000001000000208001032 -:10C4E0000802020000000000000008000000001028 -:10C4F000008000800000000000000000000000003C -:10C500000000000000000000000000000000000823 -:10C510000000000000000008000000000000000013 -:10C520000000000000000000000000000000000803 -:10C5300000000000000000080000000800000000EB -:10C5400000000000000000000000000000000000EB -:10C5500000100000000800000008008800008001B2 -:10C5600000008011000000000000000080000000BA -:10C57000000000100020000000080000000800007B +:10C470000400040000200020000000000000000074 +:10C48000000000000000000000000000000000109C +:10C49000000000000000000000000000001000008C +:10C4A000000000000000000000000000000000107C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000001000000000000000000000000000002C +:10C500000000000000000800001000000000000013 +:10C510000004000000000000000000000000000017 +:10C52000000000000000000000000000000000000B +:10C5300000080000000000000008000800080000DB +:10C5400000000000000000000000000000000008E3 +:10C550000000000800000000000000880008004003 +:10C5600000000000000000000000000000000008C3 +:10C5700000000008000000000000000000080000AB :10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B +:10C59000400000000000000000000000000000005B :10C5A000000000000000000000000000000000008B :10C5B000000000000000000000000000000000007B -:10C5C0000000900088000000001000000000000043 -:10C5D00000000000000200040000820004000008C7 +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B :10C5E000000000000000000000000000000000004B -:10C5F0000000000000000480038005C004A10000CA -:10C6000000000000001000000041004082400000D7 -:10C61000000000000000000000000000000000001A +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000820082000800000E :10C62000000000000000000000000000000000000A -:10C630000000000040000000000020000000410059 -:10C640000088050040000000000000C0000000005D -:10C6500000A000000300000011000000090080009D -:10C66000000800000000000000100000001005108D -:10C67000008200824182000080208220822180206E -:10C6800000000000410041000000030003014101DF -:10C690000000000000000000000000040000000096 +:10C6300000080000000000000000000000000000F2 +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A :10C6A000000000000000000000000000000000008A -:10C6B0000000080000000000000000001000000062 -:10C6C000100800004000400000008400100000003E -:10C6D0000000000000800000000000008400000056 -:10C6E00000000000000000000000840008000000BE -:10C6F0000000000000000000000002000200040032 -:10C700000400A00000000000000000000000000085 +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D00000000000000000000000000000008400D6 +:10C6E00000000000000000000000000000008200C8 +:10C6F000000000000000000000000000000000003A +:10C70000000000000000C000000000000000000069 :10C710000000000000000000000000000000000019 :10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000800000000F1 -:10C740000000000100C08000808400A000C0419073 -:10C750001000000000000020030010000000000096 -:10C760000000000000004100000000000000000088 -:10C77000000000000000000000000000800080C0F9 -:10C7800080008000000000000000000000000000A9 -:10C790000002000000000000000000000000000097 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000908069 -:10C7C000010000C000000000000010000000000098 -:10C7D0001000100000000000040010200480000081 -:10C7E0008404C00004000011000500008400000063 -:10C7F000080000008400000000800000000004A089 -:10C8000090A001000340A000A000C00000100200A2 -:10C810008200820082000000000000000000000092 -:10C8200000000000000000000000000000200000E8 -:10C830000000000000000084000000000000000074 -:10C84000002004040020000003000900000000880C -:10C85000009000000500000009000000000080209A -:10C860000000000000008000040000000000000044 -:10C870000000031005A005000084001000C0210086 -:10C88000804100210400820100000000000000003F -:10C890008300000000000300000000000000000012 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000080008000000000000000079 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F00000000000000000000000A0000000000099 +:10C8000000000000A0000010000000000000000078 +:10C810000000000000000000000000000808000008 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800008000000000000000000000000000000A0 +:10C890000000000000000000000000000000000098 :10C8A0000000000000000000000000000000000088 :10C8B0000000000000000000000000000000000078 -:10C8C0000011000000000008018085C10000002167 -:10C8D0000000000000000010000000000100000047 -:10C8E0000008000000000000000400000000C0007C -:10C8F00000000000011001008480C0004000000022 -:10C9000000000411040200210005001000100000C6 -:10C910000021820002000000000000000000000072 -:10C9200000000000000000000000000800000000FF -:10C93000000000000000000000000082000000086D -:10C94000058400000000000000001008100205002F -:10C9500000080000000003000001000003000400C4 -:10C96000030003002000000003000000000000009E -:10C97000000000000000040004000020000080000F -:10C9800000000000800080010000000000000000A6 -:10C990000000000000008000000000000000000017 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000800000000000000000030 +:10C90000080000000000000000000000000000001F +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 :10C9A0000000000000000000000000000000000087 :10C9B0000000000000000000000000000000000077 -:10C9C00000000000000000000000000000008900DE -:10C9D000900000000000000000000000000010A017 -:10C9E00000880000084008C000900090201000005F -:10C9F000010084000000000000000000000088002A -:10CA0000000000C1002009C11004008988910000C5 -:10CA10000000000000000002000000C00000000054 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 :10CA20000000000000000000000000000000000006 :10CA300000000000000000000000000000000000F6 :10CA400000000000000000000000000000000000E6 -:10CA500008000000000000000000000000000000CE -:10CA600000800000000080000080000000000080C6 -:10CA70000000040080000000000000000000000032 -:10CA800000000000004000009089800900030011B0 -:10CA90000000000000000000008000000000000016 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 :10CAA0000000000000000000000000000000000086 :10CAB0000000000000000000000000000000000076 -:10CAC00000000000000000000000000000000080E6 -:10CAD00010000000200041030000800000008000E2 -:10CAE0000000800000418004000080000010808071 -:10CAF0000000000000000000800000000080000036 -:10CB00000000008000418000802000808021000023 -:10CB10008010000000000000000000008080000085 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 :10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000100000D5 -:10CB500000080000000000000101900004009000A7 -:10CB60000800000010000000A0401000A0002001FC -:10CB7000A0840008000088000000C0A0000000C0E1 -:10CB80000000009002021001A02008000208080026 -:10CB90000888C000000000000000000000008208BB -:10CBA0000000008400000000000000000000000001 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB80000000000000000000000000000000002085 +:10CB9000000000C0000000000000000000000000D5 +:10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 :10CBC0000000000000000000000000000000000065 -:10CBD0000200000000010000000000010000000051 -:10CBE00000000000000040880008004002889020FB -:10CBF00000104084039000010001000000010000CB -:10CC0000000004000000001001080010A01004083B -:10CC10000140200402C000000000000000000002EB -:10CC20000000404000000000000000000000000084 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC100000004000000000000000000000000000D4 +:10CC20000000000000000000000000000000000004 :10CC300000000000000000000000000000000000F4 :10CC400000000000000000000000000000000000E4 -:10CC50000000000000000009002000080041000062 -:10CC60000000000000000000000000000000800044 -:10CC700000000080008089000008000800000041DA -:10CC8000000000008000000000800980008080001B -:10CC90008000090004008080000000000000000007 -:10CCA0000080000080800000000000000000000004 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000300000000000000000000000000000091 +:10CCA0000000000000000000000000000000000084 :10CCB0000000000000000000000000000000000074 :10CCC0000000000000000000000000000000000064 -:10CCD000000000090000000008000410210003000B -:10CCE00000000080000000000000000000908000B4 -:10CCF0000000804080A000008000000000000000D4 -:10CD0000000000000008000000002100A08010804A -:10CD10000500A1400885910000000000000000000F -:10CD200000000040000000000000000000000000C3 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000110000000000000000000002 +:10CD20000000000000000000000000000000000003 :10CD300000000000000000000000000000000000F3 :10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000010000010100D0 -:10CD60000100000000C00020000000008800200337 -:10CD700010408800020020A090880200000000847B -:10CD800000A0000000000000000000002100A01032 -:10CD9000A1084000C100032041082000000000005D -:10CDA00000000000000104000082400000000000BC +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 :10CDB0000000000000000000000000000000000073 :10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000430000000000000010 -:10CDE00000000000000000000000410000000006FC -:10CDF000000043000000002100004300000000008C -:10CE0000000000000000000000004300600000007F -:10CE1000000000006000002100004300000000004E +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE1000000000000000000000000700000000000B :10CE20000000000000000000000000000000000002 :10CE300000000000000000000000000000000000F2 :10CE400000000000000000000000000000000000E2 :10CE500000000000000000000000000000000000D2 :10CE600000000000000000000000000000000000C2 -:10CE70008B9B00DB001F1B3FC2C202029999C3C3F8 +:10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 -:10CE9000C0C0BDBD46EF0267FC0C6F6F6C6CFF0F2E -:10CEA00000000000000000003CC33CC33CC33CC386 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 :10CEC0000000000000000000000000000000000062 :10CED0000000000000000000000000000000000052 :10CEE0000000000000000000000000000000000042 -:10CEF00000008FBF00FF1F1F1B3FC3C600060F0FA0 -:10CF000000FF000000000000000000000000000022 -:10CF100000003C00000046EF0267FC0C60606C6C97 -:10CF2000F00000000000000000003CC33CC33CC314 -:10CF30003CC30000000000000000000000000000F2 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 :10CF400000000000000000000000000000000000E1 :10CF500000000000000000000000000000000000D1 :10CF600000000000000000000000000000000000C1 @@ -163109,488 +163109,488 @@ :10CFC0000000000000000000000000000000000061 :10CFD0000000000000000000000000000000000051 :10CFE0000000000000000000000000000000000041 -:10CFF0003CFF3CFF0000FFFF3C7EFF66FF7E00FF22 -:10D000006F186666666600000000F0F06060000061 -:10D010000000000000002C2C2C2C099F099F0F0FF2 -:10D0200000FF9F9F24BD0000000000000000F0F002 -:10D030000F0F0F0F0F0F0000000000000000000096 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 :10D0400000000000000000000000000000000000E0 :10D0500000000000000000000000000000000000D0 :10D0600000000000000000000000000000000000C0 -:10D070000000002700030000FFFF0066FF00FF3CE8 -:10D08000000066183F3C3F3C000000006060F0F08C -:10D0900000000000000000002C2C2C2C099F081C14 -:10D0A0003C3C6666060624BD00000000000000004F -:10D0B000F0F00F0FF0F0F0F00000000000000000B2 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 :10D0C0000000000000000000000000000000000060 :10D0D0000000000000000000000000000000000050 -:10D0E00000000A08050000A000610006000D000015 -:10D0F00000000000000000000000000000380000F8 -:10D100000000000050380000000000610006000D23 -:10D11000000500000A08050000A000610006000DDF -:10D1200000011061203E004D0008000000000000DA -:10D1300000004000800000201002000000000000FD +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D12000000005000A08050000A000000000000043 +:10D1300000000000000000000000000000000000EF :10D1400000000000000000000000000000000000DF :10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000C000CAAFFFE -:10D17000003C000000000000000000000000000073 +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF :10D18000000000000000000000000000000000009F -:10D19000C2C2C1C100000000000000000901080077 -:10D1A00000000000AFFF0AFF0000000000000000C8 +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F :10D1B000000000000000000000000000000000006F :10D1C000000000000000000000000000000000005F :10D1D000000000000000000000000000000000004F -:10D1E0000000000000000000000000000303000039 -:10D1F000A000283C0000000000000000000000002B +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E -:10D21000000083834343000000000000000008007A -:10D2200008000000000000AF000A0000000000003D +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE :10D2300000000000000000000000000000000000EE :10D2400000000000000000000000000000000000DE :10D2500000000000000000000000000000000000CE :10D2600000000000000000000000000000000000BE -:10D270000000C30000C30000000000000000000028 +:10D2700000000000000000000000000000000000AE :10D28000000000000000000000000000000000009E :10D29000000000000000000000000000000000008E -:10D2A000A0A0A0A00000000074FC0000000000008E +:10D2A000000000000000000000000000000000007E :10D2B000000000000000000000000000000000006E :10D2C000000000000000000000000000000000005E :10D2D000000000000000000000000000000000004E :10D2E000000000000000000000000000000000003E -:10D2F00000000000C30000C30000000000000000A8 +:10D2F000000000000000000000000000000000002E :10D30000000000000000000000000000000000001D :10D31000000000000000000000000000000000000D -:10D320000000A0A0A0A000000000FFFF74FC00000F +:10D3200000000000000000000000000000000000FD :10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000002000000000001000000BA -:10D370000000000000000200200000000800000083 -:10D380000400000100000000200000000000000078 +:10D35000000000000000200000000000200020006D +:10D36000000000000000000000000080000000003D +:10D37000000000000000200000000000000020006D +:10D38000000000000000000000000000000000009D :10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D +:10D3A000000000000100000000000000000000007C :10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000000000005D +:10D3C000000000004000000000000000000000001D :10D3D000000000004000000000000000000000000D -:10D3E0000000000400000000800021000000080090 -:10D3F00000000000000000008000800000008300AA -:10D400000000800400000000000000000000000098 +:10D3E00000000000400000000000000000040000F9 +:10D3F000000000000000000000000000000020000D +:10D4000000000000000040000000000000000000DC :10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC +:10D4200000000000000040000000000000000000BC :10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000010020000000000020000000000B8 -:10D460000000000000101000040000040040000450 -:10D470000010001000800000008000000004000088 -:10D480000000000000800003000000000000000019 -:10D49000020000000000000000000000000000008A -:10D4A000000000000000000000000000000000007C +:10D44000000000000000820000000000000000005A +:10D4500000000010000000000000000000000400B8 +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000100000000100000000001000007B +:10D49000000000000010000000000000000000007C +:10D4A000000000000000000001000000000000007B :10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C +:10D4C000000000000010000000000000000000004C :10D4D000000000000000000000000000000000004C -:10D4E00000000084000000008000800000010011A6 -:10D4F0000001000100000004000000100000000115 -:10D5000000000000000000200000000000000000FB -:10D510000000800800000000001000000000000073 -:10D5200020100000000000000000000000C000000B -:10D5300000000008000000000000000000080008D3 -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000030000000000000000C8 -:10D560000000000000000000010000030005902101 -:10D570004000000200058402000004000184044011 -:10D58000040800400810C121000000000103000849 -:10D590002004000000100000009001800000000046 -:10D5A00040050800000008040000C0000000000062 -:10D5B0000800000001000000A000000000000000C2 +:10D4E000800000000000200000000000000000009C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000400000000000BB +:10D5300000000000000000000000000000000000EB +:10D54000000000000000000000004000000000009B +:10D55000900000000000000000000000000000003B +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B :10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000002000000000001B -:10D5F00000000000000003002100000080A02021A6 -:10D600008001C0040000800102000000000004004E -:10D6100010008300410200000000001004044000DC -:10D62000000008000800000003004000080000009F -:10D63000000040000000201000000000001000006A -:10D64000000000C00000000000000000000000001A +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D610000000090000000000000000000000000001 +:10D6200000000000000000000000000000000000FA +:10D630004100000000880000000000000000000021 +:10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA -:10D6600000000000010008000200000002000000AD -:10D6700088000000000000000005401000000000CD -:10D680000100A011000400000000820085000000DD -:10D690000000000020000000A000A0210000A00069 -:10D6A00000000000000000000020202020202000BA +:10D660000000000000000000000000000100C000F9 +:10D670000000C000000000000000000000000000EA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A :10D6B000000000000000000000000000000000006A :10D6C000000000000000000000000000000000005A -:10D6D000000000000000000000000000000000004A -:10D6E0000000000800000800800080A0000080000A -:10D6F00000000000000000000000008480010084A1 -:10D7000000002000000000010500000400000200ED -:10D710000000000021008000000000000000040064 -:10D7200010000000000000000000000180018001E6 -:10D730008000000000000000000000000000000069 +:10D6D0000000000003000000000000000000000047 +:10D6E0000000000000000000000000000000040036 +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000800F1 +:10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 -:10D750000000000000000000400000000000000089 -:10D76000000800000021000000000000202104004B -:10D7700002008800000000040002822100A1900243 -:10D7800008050000210002042089C0000000822159 -:10D790000280000000000000C020C1000002000064 -:10D7A00000001020400000114000A0000000000018 -:10D7B000880000000000C000400000000000008061 -:10D7C0000100010000000000000000000000000057 +:10D7500000000000000000000000000000000000C9 +:10D760000000000000000000000000004000000079 +:10D770004000000000000000A000000000000000C9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B000A0000000000000000000000000000000C9 +:10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 -:10D7E00000000000000000000000000000008000B9 -:10D7F0008000800000000000000100000000000424 -:10D80000000080000000A08880048004000021C087 -:10D8100000008520000000044190008520000900E0 -:10D8200005000500200511000008000800000000A8 -:10D83000000041000000000000C0050000000004DE -:10D840000004201020100000000000000000000074 -:10D8500000000000000000030000000000080000BD -:10D860000000000000000000000000000000002197 -:10D8700000000021000800030021100900800008BA -:10D880008441402101080000208400800104C0215F -:10D89000110400108420000090001100900021006D -:10D8A00000000009001020000000000082100000AD -:10D8B00000000000001001800000000008000000CF -:10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000000000000000000050043 -:10D8E00000000000410005000500000000000000ED -:10D8F00000000000000000000082000000000002A4 -:10D900000082000080002000000089050010200136 -:10D9100041000800000100010000000004000000B8 -:10D9200084000000000000018000000000004100B1 -:10D9300000000000000000000404000000000000DF +:10D7E0000000000000000000000000000000000039 +:10D7F00000008000000000000000000000000000A9 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D87000000000004000C0000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000800000070 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000008000000000000000050 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F00000000000000080000000000000000000A8 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 :10D9400000000000000000000000000000000000D7 :10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000089000C000025D -:10D970001010C1C0894000088240C0C0018202A0CE -:10D98000021010C000100020081041A001048800FF -:10D99000080890C000900090C000000041400121A4 -:10D9A000828420822090A0040488C04000000000EF -:10D9B00000000000000000009000000000000000D7 +:10D9600000000000000000000000000000000000B7 +:10D97000000000C000900000000000C00090000007 +:10D98000000000C000900000000000C000900000F7 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 :10D9C0000000000000000000000000000000000057 :10D9D0000000000000000000000000000000000047 -:10D9E00000000000000000000000000080000000B7 -:10D9F000000080808880898000808080118008807D -:10DA0000808000800090001000058009A09120888F -:10DA100000090009008000000000800000009085DF -:10DA20000310408300052000C180C08080000000FA -:10DA30000000000000000000000080000000000066 -:10DA400000000000000000000000080000000000CE +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000800080000000000380008024 +:10DA000000000000058000800000000040800080D1 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000100010000900000000000000000000AD :10DA500000000000000000000000000000000000C6 -:10DA60000000000000000000000000000000800036 -:10DA7000000000008000888009091111410309009D -:10DA800021C191A0C100100009000500A020840060 -:10DA9000A110020903000000800580008000000042 -:10DAA00041002121A00800021000202182A1034191 -:10DAB0000000000000000000100020000000100026 -:10DAC0000000000000000000000300000040000013 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000080800000A6 +:10DA8000000080008080000800008000808000008E +:10DA90000000800080800000000000000000000006 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 :10DAD0000000000000000000000000000000000046 :10DAE0000000000000000000000000000000000036 -:10DAF000880002009000080009400100018901012E -:10DB00002000040208A009081010200004000800EA -:10DB10000810044188050420900004000288900049 -:10DB20000000902021008508822001080800A10340 -:10DB30000101000000000000000000A001820000C0 -:10DB40000140000000000000000000000000000094 +:10DAF0000000000000000000000000000000C0A0C6 +:10DB0000000000008400C090000100008400C0906C +:10DB1000000000008400C090000000000000000031 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 :10DB500000000000000000000000000000000000C5 :10DB600000000000000000000000000000000000B5 -:10DB70000000C002000200081010888800200090F9 -:10DB80000391881000900085A084201000040003F9 -:10DB90004088C0910190038541080002A0840008DC -:10DBA0000120000090900021A084A1832090000516 -:10DBB0000021A0C100000000000000000001900052 -:10DBC0000401000000000000000000000000400010 +:10DB70000000000000000000000000010000009014 +:10DB800000C000000000009000C0000000000090F5 +:10DB900000C000000000009000C000000000000075 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000010000000000000054 :10DBD0000000000000000000000000000000000045 :10DBE0000000000000000000000000000000000035 -:10DBF0000000000080000000008000008090008095 -:10DC0000008989C10090000900909011000009006E -:10DC100003A100808408118305A191080080800081 -:10DC200000000900000000411108208920080000C0 -:10DC30000090002100820000000000000000404031 -:10DC400080218008000800000000000000000000A3 -:10DC50000000000040000000000000000000000084 +:10DBF0000000000000000000000000000011000014 +:10DC00000080008000000000008000800000000014 +:10DC10000080008000000000008000800000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000100000000000C4 +:10DC500000000000000000000000000000000000C4 :10DC600000000000000000000000000000000000B4 -:10DC7000000000000000000000800000000089900B -:10DC800091214180111100808000800080401000AF -:10DC9000098005000909A1C00809A0008021000829 -:10DCA000808000008000000020219005410010418C -:10DCB000038820C0C1002010000000000000000008 -:10DCC0000888100808000808000000000000000094 +:10DC7000000000000000000000000000000080081C +:10DC800000410000000080118003000000008011AE +:10DC900080030000000080118040000000000000B0 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 :10DCD0000000000000000000000000000000000044 :10DCE0000000000000000000000000000000000034 -:10DCF0000000000000000000000000A00020000064 -:10DD00001188890102849101888808101088A00177 -:10DD1000001000A000080000C1C1119041081001CE -:10DD2000A00082A02020100000002111830820A064 -:10DD3000830100C120A0100090000000000000003E -:10DD400000000121010001000000000000000000AF +:10DCF0000000000000000000000000000000000024 +:10DD00009000000100880000C00120000000000019 +:10DD1000C001200000000000C00120000000000041 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 :10DD500000000000000000000000000000000000C3 :10DD600000000000000000000000000000000000B3 :10DD700000000000000000000000000000000000A3 -:10DD80004200884100C843008100000000E04300D9 -:10DD90000000410000C800000000600000C843000F -:10DDA000840000810000430000210000484200C8B8 -:10DDB00043000012500A00C8430042060000000061 -:10DDC00000000000600000C84300000000000000E8 -:10DDD00000000000600000C800000000000000001B +:10DD800000000081000043008800004100004300C3 +:10DD90000000884100C8430000000041000043002B +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 :10DDE0000000000000000000000000000000000033 :10DDF0000000000000000000000000000000000023 -:10DE00004141515100C3FFFF00F020D00000B0B0ED -:10DE100000000000000000008080D58000001D1D73 -:10DE20003010FFFF000C00FC1F000F00000000007E -:10DE3000FFFFF402108F50005000FDFB04000000B3 +:10DE0000000000000000FFFF000000FF000000FF16 +:10DE1000000000FF000000FF000000FF000000FF06 +:10DE2000000000FF000000000000000000000000F3 +:10DE300000000000000000000000000000000000E2 :10DE400000000000000000000000000000000000D2 :10DE500000000000000000000000000000000000C2 :10DE600000000000000000000000000000000000B2 :10DE700000000000000000000000000000000000A2 -:10DE8000000055415555B0B03C3C00F000F000009A -:10DE9000B0F00010000000000000FFC3FFC300FF4F -:10DEA00000000000FFFD00AF00AFFF00FF0000001A -:10DEB000000038FFFC02708F50145014BFFF450063 +:10DE80000000000000000000FFFF000000FF000095 +:10DE900000FF000000FF000000FF000000FF000086 +:10DEA00000FF000000FF0000000000000000000074 +:10DEB0000000000000000000000000000000000062 :10DEC0000000000000000000000000000000000052 :10DED0000000000000000000000000000000000042 :10DEE0000000000000000000000000000000000032 :10DEF0000000000000000000000000000000000022 -:10DF00002C006D008282820255003C1C3C3C3C3C53 -:10DF10000014000C020082000C0CAAC33C14341440 -:10DF20004100410041C341C30F00000FEBEB010072 -:10DF300000005D7F557D4E4EB1B10055000F5F551D -:10DF40005F5500000000000000000000000000001D +:10DF00000000000000000000FF000000FFFF000014 +:10DF1000FF000000FF000000FF000000FF00000005 +:10DF2000FF00000000FFFFFF0000000000000000F5 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 :10DF500000000000000000000000000000000000C1 :10DF600000000000000000000000000000000000B1 :10DF700000000000000000000000000000000000A1 -:10DF80000000450045000A0A0A0A55003C1400003A -:10DF9000000000000000020283820000AAC3FCD738 -:10DFA000F4D71400000055FF50F00F00000FFBFFE6 -:10DFB000000000008200A200D84E27330F000C00A2 -:10DFC0005F555F55000000000000000000000000E9 +:10DF800000000000000000000000FF000000000092 +:10DF90000000FF000000FF000000FF000000FF0085 +:10DFA0000000FF00000000FFFFFF00000000000075 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 :10DFD0000000000000000000000000000000000041 :10DFE0000000000000000000000000000000000031 :10DFF0000000000000000000000000000000000021 -:10E00000000000000000000000100000006050341C -:10E01000C000000180602006000500000061500083 -:10E02000C0090000A5610A0CC50900A0800050309D -:10E030000000000000000061003FC001000080619E -:10E04000003FC099000000000000000000000561D2 -:10E050000A0CC50100A000000000000000000061E3 -:10E060000007C00D000000000000000000000000DC +:10E000000000000000000000000000000363032E79 +:10E010000C0D92C0038203280C0092C003E3032E70 +:10E020008C0D92C0038203280C0082C00000000007 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000610006000D000000004C +:10E0600000000000000000000000000000000000B0 :10E0700000000000000000000000000000000000A0 -:10E0800000000000000000000000000000000B0481 -:10E090000F0000003C0000000000CFFCCFFCC0C01F -:10E0A0004404FF00FF00FFFF0500C0C000C30000E4 -:10E0B000000000000000000082C0FBF0BEFEFFFF79 -:10E0C000553C0000FFF0FFFA0000000000000000D7 -:10E0D000FD01D414AA30ACAC000000000000000028 +:10E080000000000000000000000000000000000090 +:10E090000000C3C3C3C30000000000000000000074 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 :10E0E0000000000000000000000000000000000030 :10E0F0000000000000000000000000000000000020 :10E10000000000000000000000000000000000000F -:10E110000F000F003C3C003C000000000CD7CF1467 -:10E12000C0C00406FF00FF00FFFF05005555555510 -:10E1300000000000000000000000BAF0FBF0AAFAA6 -:10E14000FFFF0FFF0000FF00FFAA0000000000001B -:10E150000000FD01D414AA30ACAC000000000000A7 +:10E1100000000000C3C3C3C30000000000000000F3 +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF :10E1600000000000000000000000000000000000AF :10E17000000000000000000000000000000000009F :10E18000000000000000000000000000000000008F -:10E190000000000000001C1C201C000000007D7D11 -:10E1A00050FA004000005560553CF5A0F5A05F5FB7 -:10E1B0000A0A000000000000000000000F0307072B -:10E1C000AFBFAFBF00000000FF43D0400000000021 -:10E1D0000000000000000000E1E1FBFB0000000087 +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D0000000000000000000000000003FFF3FFFC3 :10E1E000000000000000000000000000000000002F :10E1F000000000000000000000000000000000001F :10E20000000000000000000000000000000000000E -:10E2100000000000000000002020003C0000000082 -:10E22000282850FA000080008A699029550055413D -:10E230000A820A82000000000000000000000C00BA -:10E2400007070F3F0F3F00000000FF7FD050000086 -:10E2500000000000000000000000A0A0101000005E -:10E2600000000000000000000000000000000000AE -:10E270000000000000000000000000000000880016 -:10E28000000000000000000000002000C0000000AE -:10E290001000000000000400000001000400040061 -:10E2A000400000000100000000000000000000002D -:10E2B00000004000000000000200080000200000F4 -:10E2C000000000000000000000000000000000004E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000300BB +:10E2600003000000000000000000000000000000AB +:10E27000000000000000000000000000000000009E +:10E28000200040000000000000000000000000002E +:10E29000000000000004000000000000000000007A +:10E2A000200020000000000000000000000000002E +:10E2B000000000000000000000000000000000005E +:10E2C000000000002000000000000000000000002E :10E2D000000000000000000000000000000000003E -:10E2E000000000000000000000000000000000002E +:10E2E00000000000840000000000000000000000AA :10E2F000000000000000000000000000000000001E -:10E30000000000004000000040000000800000000D -:10E310004000800000000000800000000400800039 -:10E32000C10080000000400000000000210020002B -:10E3300000000000C10041000000800080000001DA +:10E30000000000000000000000000000000000000D +:10E3100040000000000000000000000000000000BD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD :10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD :10E3600000000000000000000000000000000000AD :10E37000000000000000000000000000000000009D -:10E3800000000000000000100000000082000000FB -:10E3900000000000000000100010004000400000DD -:10E3A00002400002008000080000010000000000A0 -:10E3B00000000210020902100040004000000000AE -:10E3C0000010000300000800001000100000000012 -:10E3D000000000000000000000100000000000002D -:10E3E00000000000000000000000004002000000EB -:10E3F00000000000000000000010001000000000FD -:10E4000000000010000000000000000800000000F4 -:10E4100000000008000000000008000000010001EA -:10E4200000000009000100020001000820000000B7 -:10E4300000000008090800000009000000010000B9 -:10E4400000000008000000000000000000080000BC -:10E45000000000000008004000000008000000006C -:10E46000000000000008000000000000000800009C -:10E470000000000000080000000000400000000054 -:10E48000000000000008000000080000010001007A -:10E490000041000200000000000000000000000039 -:10E4A0000000000000050102010900409140000049 -:10E4B00000000000880001080011000082820011A5 -:10E4C00000800000000300000011000402000000B2 -:10E4D000820082002020888000820000008000806E -:10E4E000000000009000000000000000000000009C -:10E4F0000000880090009000000000000000000074 -:10E50000000000000000000000000088000004007F -:10E5100004000000000020000000000000000000D7 -:10E52000080000000800000240A040004101100166 -:10E5300000A0001000004102028800000002031148 -:10E540002100414009000300000021000800A10053 -:10E5500000002104000080010004002100000004EC -:10E56000000400000000080000900000000000000F -:10E57000000000000000000000000000000000009B +:10E380000000020002000210020000000000000075 +:10E39000000000000000000000100000000000006D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000010000000000000000000000004C +:10E3D000000000000000000000000010000000002D +:10E3E000000000000000000000000000000000002D +:10E3F00000000010000000000010000000000000FD +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E440000000000000000084000000000000000048 +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000200000000000000009A +:10E480000000000000000000000004000000000484 +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D0000000000000000000000800000000000034 +:10E4E000000000000000000000000000000000002C +:10E4F0000000000000000000000800000000000014 +:10E50000000000000000000000000000000000000B +:10E5100000010000000000000000000000000000FA +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E570000000000800820000000000000000000011 :10E58000000000000000000000000000000000008B -:10E5900000000000000001802100000000000100D8 -:10E5A000A18000000100008082000800040000003B -:10E5B00010800000000000008200000082000111B5 -:10E5C0008400088004808480840000000000000033 -:10E5D000C0000400000000000000000001800000F6 -:10E5E0000002000000000000000000000000000029 -:10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A -:10E6100000000000000000002004A0A0000000C0D6 -:10E620000800081000000400004000000000800006 -:10E63000000080080000000000000000000400004E -:10E64000400003000040C0402140000000000000E6 -:10E6500000002100850000000000000000001008FC -:10E660000000400100000000000000000000000069 +:10E59000000500880080018200800000000000006B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000C00000005B +:10E600000000000000000000000000000400000006 +:10E6100000840082000908041008000800000000BF +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA :10E67000000000000000000000000000000000009A :10E68000000000000000000000000000000000008A -:10E69000000088000000400000002000000000038F -:10E6A000C04100000102C0000000A00040050200BF -:10E6B00000800002010000000000400008004080CF -:10E6C000008084008280000000008411C0090000E6 -:10E6D000008000008804841100804085820840206A -:10E6E0000002010000000000000000000000000027 -:10E6F000000000000000000000000000000000001A -:10E700000000000000000000000000000000000009 -:10E7100000000000000000008000000080000000F9 -:10E72000000820000000080100000088000400002C -:10E73000080009020089101000000000009000008D -:10E7400003020802000203400500050000A00500C6 -:10E7500000000802080000040300092080200001D6 -:10E76000030100012000000003000000400220001F -:10E770000090000000000000000000000000000009 +:10E690000000000020000000000000040004000052 +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F00000000000080000000000C0000000000052 +:10E700000008000000000000000000000000000001 +:10E7100000000000000000040000000000010001F3 +:10E720000000000000000000000000000000008465 +:10E7300000080000000000000000000000000000D1 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000080000000000000000000000B1 +:10E7600000000000000000000000000000000000A9 +:10E77000000000A0020000000000000000000000F7 :10E780000000000000000000000000000000000089 -:10E7900000000020002000090000010004410109E0 -:10E7A00021880000C0218421A02100000000000079 -:10E7B000400000000021000001080000880008005F -:10E7C0000000100000009000008084034100C000A1 -:10E7D0000900000090000000C00000000000008060 -:10E7E00001000000000200A0000000020000000084 +:10E790000000000000000000000001800188010866 +:10E7A0000104000000000000000000000000000064 +:10E7B0000000000000000000000200000000000057 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 :10E7F0000000000000000000000000000000000019 :10E800000000000000000000000000000000000008 -:10E810000000000000010001000000000200800074 -:10E8200020008405000000C000000000000000007F -:10E8300000000300000000C00000100100000500FF -:10E8400000000000830000C00990030200000400E3 -:10E8500000000400000000000000050000000000AF -:10E8600000024000000000010003080000010090C9 -:10E87000080011000000000000000000000005007A -:10E88000000005000500000000000000000000007E -:10E8900000000000000000C000900088000001009F -:10E8A0000100000100000100000040000000020221 -:10E8B00000900004402000210103108500020000A8 -:10E8C00000000000000020A0000500A120C1892058 -:10E8D00000200004202000000001000000000001D2 -:10E8E000000900830888900900C100010090000918 +:10E810000000000000820084000000822008100533 +:10E8200020011001000000000000000000000000B6 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000177 +:10E8A00000018801000100000000000000000000DD +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 :10E8F0000000000000000000000000000000000018 :10E900000000000000000000000000000000000007 -:10E9100000000000000000000080008000000900EE -:10E9200010410500410800000900100080000000AF -:10E930008080000000800000004121A10088008448 -:10E94000000000001000000008100003412000211A -:10E9500089000000008000000000000200050005A2 -:10E96000000200C108A105030090009000104020A3 -:10E970000010000000000000000000000000000087 +:10E9100000000000000000000000000000000000F7 +:10E920000041000803020008000000000000000091 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 :10E980000000000000000000000000000000000087 -:10E9900000000000000000000000000000008000F7 -:10E9A000800000802100091110A0000080000000FC -:10E9B0000000800000908080000010801083408064 -:10E9C0001009004100000000000002009080820059 -:10E9D0004100A00002218521A000000000000003EA -:10E9E0000000008011000390118008002000410009 -:10E9F0000588C18000000000000000000000000049 +:10E990000000000000000000000000000000000077 +:10E9A0000000000003000200410000000000000021 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 :10EA00000000000000000000000000000000000006 :10EA100000000000000000000000000000000000F6 -:10EA20000800C088004001A0000100C020000400D0 -:10EA30009000A000020090C10404402000100002D9 -:10EA40000184004100010000000000000084100467 -:10EA5000A0008940400083000401C00000000000C5 -:10EA6000020100A08804901009C1888409100000E8 -:10EA700000000103C1A00000000000000000000031 +:10EA200000000000009001000100019000000000C3 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 :10EA80000000000000000000000000000000000086 :10EA90000000000000000000000000000000000076 -:10EAA0000040908800C000000188210001000002A1 -:10EAB0000088001100C14040009020044020000365 -:10EAC000010102030040000000000000000040902F -:10EAD0000002C005A0C0C0A0000220A0A0C000008D -:10EAE00000000000000000000091000141A0880328 -:10EAF00091010101890991910000000000000000CE +:10EAA0000000000000000001000000010001000063 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 :10EB00000000000000000000000000000000000005 :10EB100000000000000000000000000000000000F5 -:10EB2000000000808000008003100911911011097D -:10EB300003110084000800C18080000000800000F4 -:10EB400020881010C18800100000000000000000A4 -:10EB50008002419010A180918000008000800080A0 -:10EB6000000000004000110000000010000885882F -:10EB70000990411020101010081000000000000043 +:10EB2000000000000000000000080000000200419A +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 :10EB80000000000000000000000000000000000085 :10EB90000000000000000000000000000000000075 -:10EBA00000008011800900000000411110211100B7 -:10EBB00011020000000000800000800080090000B9 -:10EBC000800041080402908005020000000000005F -:10EBD000000021802010400021100000000900806A -:10EBE00000410000800080038000000088908802BF -:10EBF0000800800821802040200010100000000044 +:10EBA000000000000000000000004108100002000A +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 :10EC00000000000000000000000000000000000004 :10EC100000000000000000000000000000000000F4 -:10EC200000000000C00120008888000001100100E1 -:10EC300000880100000000200002000040000420C5 -:10EC40002020040001C19000030290000000000099 -:10EC500000000000850805210140C1010020008955 -:10EC60000082000100001000042004208200C0A1E6 -:10EC700010098890080191A09090900883010000ED +:10EC20000000000000000000000000000190010052 +:10EC300001000000000000000000000000000000D3 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 :10EC80000000000000000000000000000000000084 :10EC90000000000000000000000000000000000074 -:10ECA0000000000000000082000043000000484215 -:10ECB00000C84300002100000000000000000082A6 -:10ECC000000043004800418200C8430000000000EB -:10ECD00000C800005000600600C84300000000218A -:10ECE00000004380600600000006000043000000B2 -:10ECF000600600C843004100600600C84300880069 +:10ECA00000000000000000000000000000008100E3 +:10ECB00000C800000000000000000000000000008C +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 :10ED00000000000000000000000000000000000003 :10ED100000000000000000000000000000000000F3 -:10ED20000000000000000000F0000000F000000003 -:10ED3000000000000000F0F000000000F0000C00F7 -:10ED4000FFFF0000F431DC70CC55CC553CC33C3C9B -:10ED50000000000000000000FFFF3C002000A5A60E -:10ED600000000000000000660000343C340C00008D -:10ED700000006E7F0000C33C00FF5AAC3CCAFF009D -:10ED800000FF000000000000000000000000000084 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 :10ED90000000000000000000000000000000000073 -:10EDA00000000000000000000000F0000000F00083 -:10EDB0000000000000000000F0F000000000F00083 -:10EDC0000C00F6F40000F033D470CC5CCC5C3CC397 -:10EDD0003C3C0000000000000000FFFF3C00000081 -:10EDE000A5A6FFFFFFFF3030C3660000043C040C03 -:10EDF00000000000900000003CC3FF005AAC3CCA79 -:10EE0000FF0000FF00000000000000000000000004 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 :10EE100000000000000000000000000000000000F2 :10EE200000000000000000000000000000000000E2 :10EE300000000000000000000000000000000000D2 @@ -163601,494 +163601,494 @@ :10EE80000000000000000000000000000000000082 :10EE90000000000000000000000000000000000072 :10EEA0000000000000000000000000000000000062 -:10EEB000000F000000FF00000000FFFF0000000046 -:10EEC000000000000000C13CC43C669956A9300F08 -:10EED000CFF0FFFFFFFF0000000000000000003C3B -:10EEE000003C0F6F000022F08000FFFF30000000A8 -:10EEF000000000000000FFFF0DF7401FC9D97A593C -:10EF0000A6A6F5F5000066660000000000000000FF +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 :10EF100000000000000000000000000000000000F1 :10EF200000000000000000000000000000000000E1 -:10EF30000000000F000000000000000000000000C2 -:10EF400000000000140000140C3C2C3C655A659A2B -:10EF5000300FCFF0000000000000000000000000B3 -:10EF6000003C607C000000000BF0C000002030007E -:10EF70000000000000000000F6F60DF7401F3626E6 -:10EF800085A6A6A60A0AFFFF9999000000000000C6 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 :10EF90000000000000000000000000000000000071 :10EFA0000000000000000000000000000000000061 -:10EFB0000000038203380C00C2C005610A3FC5414E -:10EFC00000A800610006009D0001430083380C206A -:10EFD00010C24341833EC00D000000610007000DD8 -:10EFE00000000060303FC04D000080610036004DE1 -:10EFF000000800008061003E000D10C003E1033FE7 -:10F00000CC0110C00363033DC005020000000000F6 +:10EFB0000000000000000000000000000001C00090 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 :10F0100000000000000000000000000000000000F0 :10F0200000000000000000000000000000000000E0 -:10F030000000000000000000000000009C93353537 -:10F0400000003C000000000033F000080000000059 -:10F05000000000000000F3F3800880C800000000FA -:10F0600000000000001055553C3C3C0C0000000026 +:10F03000000000000000000000000000F000505040 +:10F040003C00AA00000000000000000000000000DA +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 -:10F0800000A09695696A3C0C3C3C333C3C3C00003B +:10F080000000000000000000000000000000000080 :10F090000000000000000000000000000000000070 :10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000969921 -:10F0C0003A3AC000FC000000000033F000000000ED -:10F0D00000000000000000FF5500000000C000001C -:10F0E000000000000000001055553C3C3C0C0000A6 +:10F0B0000000000000000000000000000000F00060 +:10F0C00050503C00AA0000000000000000000000BA +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 -:10F10000000000A0155DEAA23C0C3C3C333C3C3CBA +:10F1000000000000000000000000000000000000FF :10F1100000000000000000000000000000000000EF :10F1200000000000000000000000000000000000DF :10F1300000000000000000000000000000000000CF -:10F140005A5AFFFF00FF000000000000000000000E -:10F150000000000000000000C30002820000100058 -:10F160000000000000000000F5BFFFFF843F00200A -:10F1700000000000100438380000340C040C0000BB -:10F1800000003FF3C0CCC70000C742CAE7E70E4A01 -:10F190003236000000000000000000000000000007 +:10F140003030F000F000FF00000000000000000080 +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F :10F1A000000000000000000000000000000000005F :10F1B000000000000000000000000000000000004F -:10F1C0000000FFFF5A5A0A0A000000000000000079 -:10F1D00000000000000000000000C300440400FF25 -:10F1E00010FF0000000000000000FF055A007BC077 -:10F1F00000000000000001200402000034000400B0 -:10F200000000000003C0FFFFC7FFFFC7CA98EF2C34 -:10F2100058D0343C00000000000000000000000056 +:10F1C00000003030F000F0000000000000000000FF +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE :10F2200000000000000000000000000000000000DE -:10F2300000000000000000000000000000002000AE -:10F2400000000000000000000400040000000000B6 -:10F25000850084000000100000000200000084000F -:10F260000000000000000000000000048800010011 -:10F27000C0002000000000000000010000000000AD -:10F280000000000000000005000000000004000075 +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000080000000000000000B6 +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000400000000009A +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000200000005E :10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000000005E +:10F2A000000000000000000000000000200000003E :10F2B000000000000000000000000000000040000E -:10F2C00080000000000000000000800080000000BE -:10F2D000000020000000000080000000800000000E -:10F2E000000000000000000011000000000000000D -:10F2F000200000008000000000000000200000004E -:10F3000000000000000000000000000000000000FD +:10F2C00000000000000000000001000000004000FD +:10F2D000000000000000000000000000000000002E +:10F2E00000000000000000000000000000004000DE +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000020000FB :10F3100000000000000000000000000000000000ED :10F3200000000000000000000000000000000000DD -:10F3300000000000000000000000000000000000CD -:10F3400000000000000000000000000002000800B3 -:10F35000000000050904080000000000080000008B -:10F36000000000000011000000000000000000008C -:10F37000000000000000000000000000000000008D -:10F38000000300000000000000000000000000007A -:10F3900000000000000000000000000000000080ED -:10F3A00000800000000000000000000000000000DD -:10F3B00088000000000000000200000000000800BB -:10F3C000000000000000000000000000000000003D -:10F3D00000000000008420010000001000100082E6 -:10F3E0000088000000000000008400000000000011 -:10F3F000000000000000000000C00000000000004D +:10F33000400000000000000000000000000000008D +:10F34000020000000000000000000000008088882B +:10F3500000000000000000000000000000000000AD +:10F360000000000000000000000000000800000095 +:10F37000000000000800000000000000080000007D +:10F38000000100000200000000000000000000007A +:10F39000000000000000000000000000000000006D +:10F3A0000000000000000000000000000000080055 +:10F3B000000004000200000000000000000008003F +:10F3C0000800000000000000000000000000040829 +:10F3D000000500000000090000000000000400001B +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D :10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000020040AA -:10F4200000100010000000000000000000000000BC -:10F4300000000000000000000000000000080000C4 -:10F440000000000000000000002121000100000079 -:10F4500000200020000300000083002100030000C2 -:10F4600000000002000501210021401000030005FA -:10F47000000240000011090400102184C000C08077 -:10F480000100090800000000C00982092003C141F1 -:10F490008200001100000800000008800000000841 -:10F4A000000008000000050000808300010000004B -:10F4B0000400A000000000000000000000000000A8 -:10F4C000000000000000008200820000A0A00800F0 -:10F4D000000041010001008400002104210003829A -:10F4E000000000A0000100001000000000A041C0CA -:10F4F0000002080288020300A0890501A00500029D -:10F50000000420082000000000000000000080002F -:10F51000080000000300039000000000000200004B -:10F5200000000000800000008200002008001000A1 -:10F53000000080000000000000000000000000004B -:10F5400000000000000000000080200000002000FB -:10F55000C000000000000480000000000000000067 -:10F560000000000000000000C0000000A00000003B -:10F5700000000000000000000000C00008002000A3 -:10F58000900020002000210000000000000000008A -:10F590000000010004000400410000000000080019 -:10F5A00000802000200020002000000000800000DB -:10F5B00001800000000000000000000000000000CA -:10F5C0000000000000000000000000028084000035 -:10F5D00080A00090000000008002000000000000F9 -:10F5E0000008008200A000000000000000000000F1 -:10F5F00000A0000000000000000000C0000000C0EB -:10F600008000000080008008A00000000000400092 -:10F610004000410004008088830084000000000056 -:10F620000000000280008000C100C1000000002036 -:10F6300000000420000000000000000000000000A6 -:10F640000000000000000000000000000000210495 -:10F65000000020080021000004A005850000000033 -:10F66000204182080000C002002100410021082141 -:10F670000100402100000000C00000008200208046 -:10F6800084002090C0020208C120C02000000000B9 -:10F690000809A0002010018000000005008008007B -:10F6A00000000880088000000000A080000000200A -:10F6B000002082000108010000000080008000009E +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F44000000000000400008000000021000400040F +:10F450000004000800000000000000040000840018 +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C0000000000000000000000200000000000139 +:10F4D0000001000500010000000000000001000024 +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000040004000000B3 +:10F550000082008000000080000000000000000029 +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C00000000000000000000000038400C000C034 +:10F5D00000C0400800040000000400000300000018 +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F640000000000000000000000000008200000236 +:10F650000000004101880388918401880011820024 +:10F660000004000000000000000000000000000096 +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A :10F6C000000000000000000000000000000000003A -:10F6D000A00100408008000021008021C02000001F -:10F6E0000300800000090300000000020000410048 -:10F6F00008A0400400A00000000041000800000035 -:10F7000089040000880541088800200911010000D3 -:10F71000020003000000808508100000039003022F -:10F720000984050005020502000000000010030026 -:10F73000000100010000040104000000002000207E +:10F6D0000001000000001005A00910051005000041 +:10F6E0000000000100000000000000000000000019 +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 -:10F7500000052005004100040011004104200420A0 -:10F7600000030021400400210003000040210005A7 -:10F7700000000021000941210003000020000000DA -:10F78000010000C100090104C102000091404000D5 -:10F790000000000000090000000000000000000060 -:10F7A00082020000000008110000020200000000B8 -:10F7B0000000018000A008000020000000000009F7 -:10F7C0000009000000000000000000000000000030 -:10F7D0000000000080000000000100000000800127 -:10F7E0008001008200A009A100000000410000008B -:10F7F0000000000000000000C00000000000000049 -:10F8000021000200000403000804048300004000FB -:10F8100000020000000000000000210000000000C5 -:10F82000030203010800110000000800800000002E -:10F8300000000000044000118000002100000000D2 +:10F750000500890300800100040400080188018974 +:10F760000000000000020004000000000000000093 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D000000002000284094002000001110110052E +:10F7E00020200000000000000501000000000000D3 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 -:10F85000000000000001000111000001021100057C -:10F8600008000011004000108490001010100102E8 -:10F8700004A01010000000000000000000000000C4 -:10F880000800000041A10182A004A0850001110030 -:10F8900001010000000000000100820000000000E3 -:10F8A000000040000000000000000000000089018E -:10F8B000850090000800C0049090008290880000AD +:10F850000000000000050000040800010001000194 +:10F8600010010009000001009000000000000000ED +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 :10F8C0000000000000000000000000000000000038 -:10F8D000000000000000002100030803000811C020 -:10F8E000092080030011008040808080008000801B -:10F8F00003009180808000000000000000000000F4 -:10F900000900800000008989208200C000401009A1 -:10F910008800031100000000000002000000000049 +:10F8D0000000000000000008001100800021054128 +:10F8E0000511C10900A00000020080000000000016 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 :10F9200000000000000000000000000000000000D7 -:10F93000A0042040801180098080800000808080A9 +:10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 -:10F950000000000000000000090009030580090004 -:10F9600080008021000000804100219191820921C6 -:10F9700000000091008000000300410005024000EB -:10F980000000000000000000C000A0210904114197 -:10F9900011001180411008110000800000000000DB -:10F9A0008000000000800000000010002000200007 -:10F9B0002000418089009104890300808011919189 -:10F9C0008080000000000000000000000000000037 -:10F9D0000000000000000000000000880001010895 -:10F9E000000408001000000088A0040203C0099071 -:10F9F000004100000002000800400000000000007C -:10FA000001000000000000000000080211009088C2 -:10FA100088C1100201C00000010200000400820041 -:10FA200082000400000000020000008801000000C5 -:10FA30000000000020902000A0010201004002010F -:10FA40008309900800000040000000400000000012 -:10FA500000000000000000000000000000000100A5 -:10FA600001010100A00800A00108001040000000F2 -:10FA7000C001030110900010000304050000000104 -:10FA800000000001000100010000000040000189A9 -:10FA900041C103C1200091081100010100000000D4 -:10FAA00000000000000000000000C0010000000194 -:10FAB00000000000000000110110401000C09090F4 -:10FAC00000208408C1C100000000400000000000C8 -:10FAD0000000000000000000000000000000000224 -:10FAE0001111052111208089058411C1008980032D -:10FAF00000030002210280400003002000410010AA -:10FB00000010000000410020000400100009000067 -:10FB10000983032191889002918305030902000063 -:10FB20000003000300030005400000408040004047 -:10FB30000010002000000000009040911191008909 -:10FB4000800000808080A191400000000000000043 +:10F9500000000000000000001080090009004009BC +:10F960000280200009004140050021002000200005 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D000000000000000000000000008000400001B +:10F9E000C1C0018801400000014100000100000089 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 +:10FA200000000000000000000000000000000000D6 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA5000000000000000000000000000010100881C +:10FA6000830100820001010040030001000000004A +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD00000000000000000000000000000004040A6 +:10FAE00004118521049140204021419100410000F2 +:10FAF00000200020002000000000000000000000A6 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 :10FB500000000000000000000000000000000000A5 -:10FB600090809100A0008403000200C1008000008A -:10FB7000C18841808200020900008000000000006E -:10FB8000000800000000000200000000000000006B -:10FB900021801191840004032180092002000203C6 -:10FBA0000000004000800000000000000004000091 -:10FBB000000000000000000000050080119111000D -:10FBC0000903C11191000000111100200021000063 +:10FB60002103A1400880050341822041410089030F +:10FB7000000008400800030300000000000000002F +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000000000000035 :10FBD0000000000000000000000000000000000025 -:10FBE000000008C0080084000800C000A021A00890 -:10FBF0000000411102401002020102000800020050 -:10FC000082000088000000000000000000000000EA -:10FC10000000C140A11185028500004000000100E4 -:10FC20000100000000000002004000000000400150 -:10FC3000C00082000000000000000000004000033F -:10FC4000008200010501210088002101000100005F +:10FBE0000000C10410010110000101910191000009 +:10FBF00011000020010001000100000000000000D1 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000000000000000000000000000000D4 +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000000000000000000000000B4 :10FC500000000000000000000000000000000000A4 -:10FC600000000000410000C8000084000082000085 -:10FC700043008800810000C800008400410000C8E3 -:10FC800000000000810000C800000000000000002B -:10FC900000000000600000C80000000A600600C804 -:10FCA000430041000000810000C800000000000087 -:10FCB0000000430000060000000000000000600695 -:10FCC00000C843000000840600C84300828200068A -:10FCD00000004300000000000000000000000000E1 -:10FCE000000000000000007A00FD00000000F000AD -:10FCF00000F01000BA0055FF55EF0000000085002D -:10FD0000A5000014005500000000000000000000E5 -:10FD10000000000000004BCBCBCB005F00AA00002E -:10FD20000000F0F0000000000000000000000000F3 -:10FD3000C03FC03F000000000000000000000000C5 -:10FD400000000000AA0A0000F00FF80F0000A0A0B9 +:10FC6000000000000000000000000000418200C809 +:10FC700043004100600000C80000000000000000D8 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE000000000000000FF0000FF0F0FF0F03C3CA0 +:10FCF000000000FF00000000000000000000000005 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 :10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000006A00FA000000002F -:10FD70000F00000F1000BA005555557D000000001F -:10FD8000AF00AF005A5A0A0A00000000000000004D -:10FD900000000000000000004BFBCBFB0055000002 -:10FDA00000000000F0F00000000000000000000073 -:10FDB0000000C03FC03F0000000000000000000045 -:10FDC000000000000000AAAE0F0000FF00FF54FE7C +:10FD60000000000000000000FF0000FF0F0FF0F097 +:10FD70003C3C000000FF000000000000000000000C +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 :10FDD0000000000000000000000000000000000023 -:10FDE0000000000000000000000000000000000013 -:10FDF0000000FFC3FF3C00000000EFF5A0F00D0580 -:10FE00000D050F0F0F0F00000000000000000000A4 -:10FE1000000000000000000000000F0F0F0F0400A2 -:10FE200008000000FFFF00003C3C00000000000054 -:10FE30001494060000000000000000000000000014 -:10FE40000000000000000000000000005A5A5A5A4A -:10FE5000FFFF0FFF00000000000000000000000096 -:10FE60000000000000000000000000000000000092 -:10FE70000000000000C3003C75752020FFF0A0F0DA -:10FE8000080008000F4F0F0F0000000000000000E6 -:10FE9000000000000000000000000000EBFF4155E2 -:10FEA000100020000000000000003C3C00000000AA -:10FEB00000000000008100000000000000000000C1 -:10FEC00000000000000000000000F5555D5D5A5A7A -:10FED000525AFFFF0FFF000000000000000000006A -:10FEE00000000000000000000000000000000061B1 -:10FEF0000005C00900000061003E000D0000006127 -:10FF00003006C005000000613007C00C0000006131 -:10FF10000006800C000000610006000D000000617A -:10FF20000004C099000105612A3DC54900A80000F0 -:10FF300000610006C009000005610A0E050D00A061 -:10FF400000610006000D000000610030C0410000AB -:10FF500000610034C09100A005000A38050000A02F +:10FDE000000000000000000000000F0FF0F0FFFF17 +:10FDF000000000003C3C00005555000000000000E1 +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000F0FF0F094 +:10FE70000000FFFF00003C3C000055550000000062 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000406171 +:10FEF0008006002D080215002A39C54000A80061BF +:10FF00000006C0010000000000000000000000002A +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 :10FF60000000000000000000000000000000000091 -:10FF7000F0200020A0AC000000000000002800A835 -:10FF8000000CFF55FD7D7D7400000000AB69002072 -:10FF90000000000003033F3F00000000207AA0F0B3 -:10FFA000BE3CAE0CF000FA0AD4D7171400003000A3 -:10FFB0000000000000002000200000000000F0A56C -:10FFC000F0F00000000033333333F54DF54DFAAA5D -:10FFD000FCAFEB141400FFFF000000000000000065 +:10FF7000AAA8FFFC5140F7D53F3F5F503A3AF0FF47 +:10FF8000CF0CCF0CFAAAF0AF000000000000000078 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 :10FFE0000000000000000000000000000000000011 -:10FFF0000000F0200020A0AC0000000000009104F0 +:10FFF00000000000AAA85140F7D530305F503A3ACF :020000040028D2 -:100000000400000C0055838B838B00000000549685 -:10001000FFDF0000000003033F3F00000000207AE4 -:10002000A0FAAA00AA00F000F00000000000F00012 -:1000300030000000000000006A05600500000000BC -:10004000F0A5F0F0000000003333333305410541E3 -:100050000AAA0CA0EB141400FFFF0000000000002F +:10000000000FCF0CCF0C0AAA00A0000000000000D7 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 -:1000700000000000F0F090A07F838F739496949618 -:10008000000000000000000000FF555500000000C7 -:1000900000000000000000002F2FFFFF0000000004 -:1000A000000000000200020028FD00FD0505505080 -:1000B0000408102000000000000000000000000004 -:1000C00000000000000000000000A9AAAAAA75759F -:1000D0004545AAAC3FAC00000000AA55AA55000057 +:1000700000000000BEAA2800FF82FF8B3C3C5555C3 +:10008000F3F382BE000000000050005000000000AA +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 -:1000F000000000000000F0F0A0A0E08C107C1C1CB0 -:100100001C9C000000000000000030FF555500005E -:10011000000000000000000000002D2F3D3D000009 -:100120000000000000003E00020028FC00FC0A0A5B -:10013000A0A00102408000000000000000000000BC -:10014000000000000000000000000000A9AAAAAA08 -:100150007F4F7040AAAC30AC00000000AA55AA55F1 +:1000F000000000000000FFBEAA2882008B000F0F46 +:10010000FF00303082BE0000000050503C00000074 +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F -:10018000000000000000000000002000000000004F -:10019000000000000000000000000000000000005F -:1001A0000000000000000008000020000000000027 -:1001B0000400000000000000000200800000008039 -:1001C000000000000000000000000000200000000F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000045B +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F +:1001E00000000000000000000000001000000000FF :1001F00000000000000000000000400000000000BF :1002000000000000000000000000000000000000EE -:1002100000020000000000000000000000000000DC -:1002200000000000000000000000000000000000CE -:10023000000000000000000000000000002000009E -:100240000040000000000000000000A000000000CE +:1002100000000000000000000000000000000000DE +:1002200000010000000000000000000000000000CD +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E -:10028000080008000000020000000000000020003C -:100290000000000300000000000000000840020011 -:1002A000000008000000000000000800020000003C -:1002B000080008000000000000000000000300002B -:1002C0000000080000000000000000000080400066 -:1002D0000200010002000200000000000000000017 -:1002E00000000800090000000000000008000000F5 -:1002F00000000880088000000000000000000000EE +:100280000000080000000000000000000000000066 +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B0000000000000000000000000000001000835 +:1002C0000000000008000000000000000000000026 +:1002D0000000000000000000000000000800000016 +:1002E0000000080000000000000000000000000006 +:1002F0000000000000000000000002000000008874 :1003000000000000000000000000000000000000ED -:10031000800000100000000000000000000000004D -:100320000000008400000000000000000000000049 +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD -:10034000000000000000000000000000000000208D -:1003500080000000100800100000000000000000F5 -:100360000040000000000400000000000000000049 -:10037000000000000020002000000000000000003D -:100380000000000000080000000000000000000065 -:1003900000100009000000000000000000008200C2 -:1003A000000000000010000000000000C00000007D -:1003B0000280008001080000000000000000000032 -:1003C00000000088000004A004210000C000A0007C -:1003D000C0000000000800028202000020000000AF -:1003E00000000000000000200000000000000000ED +:10034000000000000008000800000000000000009D +:10035000000000000000000000000000000000009D +:10036000000800000004000400000000000000007D +:10037000000000000000000000000000000000007D +:10038000000000000080000010009120012001000A +:10039000000000000000000000000000000000005D +:1003A000000000000008000800000000000000003D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD -:1004000000050000000000000000001000100000C7 -:1004100000000000000000A000000000000000003C -:1004200000C0000000100088000000100000410023 -:1004300000008040000808C0000800000000000024 -:1004400000840000002000A0802180000000410006 -:1004500021004100030000010001000100008000B4 -:10046000000000002100000000010000000000006A +:10040000000000000000000200C000000401040120 +:1004100004000000050000000000000000000000D3 +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C -:10049000000008000000004000000000000500000F -:1004A00000000000008000000000000001000000CB -:1004B000C0000100000000000000000088000000F3 -:1004C0008200000000000480000091000400000091 -:1004D0004000820040000000000082000000000098 +:1004900020000180400084000000000000000000F7 +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C -:1004F000000000000000000040002000000000009C +:1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000040000000000000400C3 -:1005300000000000040000000000000000000000B7 -:10054000008800000000000000200000040080007F -:100550000000000000000000000000000000000893 +:100510000000000004084100050041000000080040 +:1005200000000300000000000000000000000000C8 +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B -:100570000000000000000000000088008000000073 -:10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A000000000009000000001000000000090002A -:1005B00000100000C000000001000000000040002A -:1005C000000300008200000300000400001004404B -:1005D00004A000000000820000C11000A000000084 -:1005E00020000000000082008200000000000000E7 -:1005F00001400000000000000000000008000008AA -:100600000000000000080008000500C0000000888D -:1006100000C0000000000002001000000088000080 -:1006200000000000000000880300400000100000EF -:100630000000000000000000000002A0110000C047 -:100640008084000000000082008200008000000121 -:1006500080A18021000000004100002080000000F7 -:1006600000008300000000000000210021000000C5 -:1006700000002084000000000000000000000000D6 -:100680000000000000000000000000000021002128 -:10069000000000000000000000000000000000005A -:1006A000000000000000000004000400000500003D -:1006B0000009000000100000000000000000000021 -:1006C0000000000000008800C000000900000000D9 -:1006D00000000200000200004000400040404000D6 -:1006E0000000000940000800820000000000000037 -:1006F00000000000000900000000000000020000EF -:1007000000000000000000000008000800000000D9 -:1007100000000000000000000000000000000000D9 -:1007200000000000000000000000800080000000C9 +:10057000000000000000000000000000000000007B +:1005800000000000000000000000000000030880E0 +:100590000000054000001080000000000000000086 +:1005A0000000000000000000000002000000000049 +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000C00084A6 +:10061000000200008201000480102100000000A000 +:1006200000A000000000000000000000000000002A +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:1006800000000000000000000000000000800141A8 +:1006900001000105880400890109009100000000A3 +:1006A0000009000000000000000000000000000041 +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000040A9 +:10071000020002000200000000200404002000008B +:100720000000000000000000400000000000030086 :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 -:100750000000000080000000000000000000000118 +:100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 -:100790000000000000000000000000000000000059 -:1007A0000000000100010001000000000000000046 -:1007B00000C000910000000000C000900000000098 -:1007C00041000000000002000000000000000000E6 -:1007D0000000C0C0008800888290004000A0000493 -:1007E00000020001A00085000000000000000001E0 -:1007F00000000000000040000000000000000000B9 -:100800000000C088909000089010000000000000D8 -:1008100000000000000000000000000000000000D8 -:100820000000000400200040004000000000000024 -:10083000000000800091000500050080008000009D -:1008400000008900100041000000000000000000CE -:100850000000000080800000008000800000000098 -:10086000008000800041C100030200000000001170 -:100870000008000300000500000000000000000068 -:100880000000000080008080008080800000000068 -:100890000000000000000000000000000000000058 -:1008A0000000000000000000000000108000800038 -:1008B0000000808080008000000080800000000434 -:1008C00000008000000000000004000000000000A4 -:1008D00000000000000080008041008000800000D7 -:1008E000008380800080418003002040410500801B -:1008F000000000000009000000008000000000006F -:100900000000000000001180A10091009183000010 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000040000000000000800BB -:1009300082000000C090080082000000C09000000B -:1009400004000000C0040000A000840100000000BA -:10095000000000000000000010008201A0040290CE -:10096000400082C00884820200C00100010001A092 -:10097000000400000000000000000000A0000000D3 -:10098000000000000000000002C009008500C091C6 -:100990000000000000000000000000000000000057 -:1009A0000000000000000000000001000000000046 -:1009B000000800000090000008080000019000C03E -:1009C00004040000009000C000C0008800C000C106 -:1009D00000000000000000000000901000209002C5 -:1009E0008288020000004000C00000010100820176 -:1009F00001010000000040000000000100C000C133 -:100A0000000100000000000000001010000800902D -:100A10008210000000000000000000000000000044 -:100A20000000000000000000000000004000000086 -:100A30000000008000000080000080802100118004 -:100A40000080000000000080008000110091000282 -:100A500000C1000000000000000000008080008055 -:100A60008000008080000000000080000020034122 -:100A7000412111410000030000000000004000037C -:100A800000020002000000000000000080800080E2 -:100A900000808080000000000000000000000000D6 -:100AA0000000000000000000000000002100041110 -:100AB00003002000000000410000000080118020A1 -:100AC00080000000801000200000000000000000F6 -:100AD0000000000000000000000000000000801185 -:100AE00000850080800000000000800000002009D8 -:100AF0004000050003052100040000000400000080 -:100B00000000000000000000000000000000008263 -:100B100009890980031100000000000000000000A6 -:100B200000000000000000000000000000000100C4 -:100B30000001010001000000000100000000C001F0 -:100B4000100140000000C001000100888800000082 -:100B500000A000A000000000000000000000000055 -:100B6000C001044002400800A000A0200482C00090 -:100B70000001000000000000010000000000000073 -:100B80000000000000A000000000000000000000C5 -:100B900000100089000800000000000000000000B4 -:100BA0000000000000000000000000000000000045 -:100BB000410002C800000000008200004300420023 -:100BC000000600C843000000008100004300000050 -:100BD000600000C8000000000000000000000000ED -:100BE0000000000600004300500000210000430008 -:100BF000600A600000C800005000840000C80000C7 -:100C00000000600000C84300000000000000000079 -:100C10000000818100E0070081000000000000006A -:100C200000000000000000000000000000000000C4 -:100C30000000000000000000000000000000C300F1 -:100C4000C30000F00000C300000000000000C3006B -:100C5000000000000000000C008100000000000007 -:100C600000000000F00030308100E700F0E8CCD454 +:1007900001080008A0000000C1900090008888882F +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000002080218000000000A1000080000076 +:1008200080800000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:10089000000000000900098009004000008080007D +:1008A0009111800000000000000000000000000026 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:100910000000000000000000A008000001C08240AC +:1009200090000901C010000000000000000000005D +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:1009900000000000000000000001000108090185BE +:1009A000409000409088C00300000000000000005C +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000040200028085C9 +:100A200020408000008080008091000000000000D5 +:100A300000000000000000000000000000000000B6 +:100A400003000000000000000000000000000000A3 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA00000000004410891801100111100000000B5 +:100AB00000000000000000000000000000400000F6 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B1000000000000000000000000000000004A031 +:100B2000000000C0A001890141408940010100008E +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000888100C843006006CB +:100BB0000000000000000000000000000000000035 +:100BC000810000C8000000000000000000000000DC +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000003C3CC3C3FF0000FFFFFFF0FF0FF0DC +:100C30000DB00000000000000000000000000000F7 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 :100C70000000000000000000000000000000000074 -:100C800000000000000000000F000F000000000046 -:100C900000000000000000008F40FF000000000086 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC000C300C30000F00000C30000003C3C000073 -:100CD000C300000000000000000000000000000051 -:100CE00000000000000090903030C100E700D0F01C -:100CF000ECCC00000000000000000000000000003C -:100D0000000000000000000000000F000F000000C5 -:100D100000000000000000000000CF00FF00000005 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA000000000003C3CC3C3FF0000FFFFFFF0FF5B +:100CB0000FF00FF000000000000000000000000036 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 :100D400000000000000000000000000000000000A3 @@ -164097,303 +164097,303 @@ :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC00000000000000003030000000000003F3F9F -:100DD000000000000000F0F000000000F600F60047 -:100DE000000000000000000000007DDB999500007D -:100DF000F071F0F0699689860000000000000000A4 +:100DA0000000000000000000FF0000FF0F0F0F0F09 +:100DB0000FF02FF03D6D0006000000000000000065 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 :100E000000000000000000000000000000000000E2 -:100E10000000000000000000000000F300F361612A -:100E200002F10000000000000000000000000000CF -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000303000000FF00009D -:100E50003F3F000000FF0000000000000000F6FF20 -:100E6000F6FF00000000000000000000569999996C -:100E70000000F08E0F0F708F62089B990000000039 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000FF0000FFF0F0E4 +:100E3000F0F000FF24FF3404000600000000000072 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 -:100E900000FF00FF000000000000000000FF04FB56 -:100EA000666600FF00000000000000000000000077 -:100EB00000000000000000000000000000610004CD -:100EC000C00D0000000000280C0012C003E3032A3C -:100ED0000C0D92C0038203280C00C2C00061000701 -:100EE000C09C000100000000000000000000100095 -:100EF00050380000000000003030000000000060AA -:100F00000007C009000000610004C00D000000617E -:100F10000006C009000000000000000000000061A1 -:100F20000036C005000800000000000000000000BE -:100F300000000000000000000000000000004F4F13 -:100F40000F0F000000000000000000000000000083 +:100E90000000000000000000000000000000000052 +:100EA000000000000000000000000000406180061B +:100EB000002D080200610034C00100A800000000FD +:100EC00000000000000000000000000000610006BB +:100ED000800D000000000000000000000000000085 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F3000000001000000EB140400FFFF00000000AF +:100F400000000000000000000000000000000000A1 :100F50000000000000000000000000000000000091 -:100F60000000CC0F00300000000000000000000076 +:100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 -:100F80005524000000AA00FFFF0000000000000040 -:100F9000000000000C004100000000000000000004 -:100FA0000400040000000000000000000000000039 -:100FB0000000000000000000000000000000000031 -:100FC00045EF05AF00000000000000000000000039 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000001010000EB140400FFFF00002E +:100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 -:100FE0000000000033F0FFCF000000000000000010 +:100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 -:1010000000008020090300CC0000C3D700140000BA -:101010000000000000000404820000000000000046 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 :1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:101040000000100000080000000000000000000088 -:1010500000000F0F0F0F0000000000000000000054 +:10103000000000000000C0D1C0D100000000AA558F +:10104000AA550000000000000000000000000000A1 +:101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 :101070000000000000000000000000000000000070 -:10108000000000000A0A00001CBF000F2A022A020A +:101080000000000000000000000000000000000060 :101090000000000000000000000000000000000050 -:1010A000000000000000000030CF004500000000FC -:1010B0000000000000000000000000000000000030 -:1010C0000000000010000008000000000000000008 -:1010D000000000000F0D0F0D0000000000000000D8 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000C0D1D1F300000000DB +:1010C000AA55AA5500000000000000000000000022 +:1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 -:1011000000000000000000000A0A1CBF000F2A02B5 -:101110002A020000000000000000000000000000A3 -:101120000000000000000000000030CF30CF0000C1 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF :1011300000000000000000000000000000000000AF -:10114000000000000000000000000010000000008F -:10115000000000000000000000000400000000008B -:10116000000000000000000000000000000000007F -:10117000000000000004000000000000000000006B -:10118000000000000000000400000000000000005B -:10119000000000000000000400000000000000004B +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:101160000008000000000000000000000000000077 +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F :1011A000000000000000000000000000000000003F -:1011B000000000000000000000000000000000002F +:1011B000000000000000000010000000000000001F :1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF +:1011D00000000000000000001000000000000000FF +:1011E00000000001000000000000000000000000FE :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE +:1012100000000000000000000000100000000000BE :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E -:10125000000000000000400000000200020000004A -:1012600000800000000000000000000000000000FE -:10127000000000000000000000000003000000006B +:1012500000000040110000004000000000000000FD +:10126000002000000000000000000000000000005E +:10127000000000000000000000000001000000006D :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E -:1012C0000000000800000000000000840000000092 -:1012D000000000000000000080000004000000008A -:1012E00000000004000000000000000800000000F2 -:1012F00000000000000000000000000800000000E6 -:101300000000000000000040000000000088000015 -:1013100000000000000000000000000000020000CB +:1012C000000000000000000000000000000000001E +:1012D000000000000000A0000000800000000000EE +:1012E00000000001000000000000000000000000FD +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD :1013200000000000000000000000000000000000BD :1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D -:101350000000000000000000000000000008000085 -:1013600088000000200000000000000000000000D5 -:10137000000000000000000000000000002000004D +:10134000000000000000000000000000400000005D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000112C +:1013A000000000000000000000000000000000003D :1013B000000000000000000000000000000000002D -:1013C00000000010001000000000000000000000FD -:1013D000000000000010000000000000008200205B -:1013E000000000000000800000000000000000007D -:1013F000000000000000000000C00000000000002D -:101400000000000000000800000000004100000093 +:1013C0000084000000000000000010000000800009 +:1013D0000000000000840000000000000000000089 +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:101450000040000000000040000000080000000004 -:10146000000000000000000000000000000000007C -:10147000010000000000C0000000010000000000AA -:10148000000000000000000000000000000000005C +:10144000000000400000000000008200900000004A +:10145000A0000800000000000000000040000000A4 +:101460000000000000000000040000000000000078 +:10147000C0000004000000000000000000000000A8 +:10148000010000000000000000000000000000005B :10149000000000000000000000000000000000004C :1014A000000000000000000000000000000000003C :1014B000000000000000000000000000000000002C :1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000100000B -:1014E00000000000000000000000000000000000FC -:1014F000000004A000000000000000000400000044 -:1015000000000000000000000000000000000000DB +:1014D000000000000000000000000000000000000C +:1014E000000000000000000000008000000000007C +:1014F00000000000000100000000000000000000EB +:1015000000000400000000000000000000000000D7 :1015100000000000000000000000000000000000CB :1015200000000000000000000000000000000000BB :1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:101550000000000000080000000000000000000083 -:1015600010000000200000000003000000800008C0 -:10157000000000004000000000000000A00000008B -:101580000000000000000000000000000800000053 +:10154000000000000000000000000000010000009A +:101550000000000001000000000000000000820008 +:10156000000000008200020000000000040490005F +:1015700082000400400000000000A000A000000065 +:101580000400000000000000000000000000000057 :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B :1015B000000000000000000000000000000000002B -:1015C0000000000000000000000000000000000813 -:1015D00000000000000000000000000000100000FB -:1015E00000008000008880840000000000000004EB -:1015F0000584000000008084000000C0000000009E -:101600000000000000000000000000000000008456 +:1015C00000000000000000000000000000004000DB +:1015D00000000088000004840000000000000000FB +:1015E00000000000000000008000000000008001FA +:1015F00000000000800080000000000000000000EB +:10160000000080000000000000000000000000005A :1016100000000000000000000000000000000000CA -:10162000000000000000000000A00000000000001A -:101630000000000000000000000000000084000026 -:101640000000000000000000000000030000000097 -:101650000000000000000000000000000800000082 -:10166000000000000000000000000000000000007A -:1016700000048420000000004000A10200000000DF -:101680000002A000000000000000000001000000B7 -:101690000000000000000000000200000000000048 +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:101650000400001100000000000000000000000075 +:101660004002080000000408000000000000002004 +:10167000000000000000C0004080C0020000000028 +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A -:1016C0000000000000000002000000000000000018 +:1016C000000000000000000000000000000000001A :1016D000000000000000000000000000000000000A -:1016E00000000000000000000000000000000000FA -:1016F0000000000100010000000080000400000064 -:1017000000000000000000000000000000000400D5 +:1016E00000000000000000000001000000000000F9 +:1016F0000000000000000000000080200001000049 +:1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 :101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 -:101760000000000000000000000000000000000079 -:1017700000000000000000C000900000000000C059 -:1017800000900000000000C0009000000000000079 -:1017900000C00090000000000000000000000000F9 +:10175000A1008200000001000000840000000000E1 +:101760000000000000000101000000010000014035 +:101770000040048290A0000000000000000040C073 +:1017800090900005400000C0000200000000000032 +:101790000000000000000000000000000000000049 :1017A0000000000000000000000000000000000039 :1017B0000000000000000000000000000000000029 :1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000000000000000000F9 -:1017F00003000000000000002080008000000000C6 -:1018000000800080000000000080008000000000D8 -:1018100000000080008000000000000000000000C8 +:1017D00000000200800000000400210080000000E2 +:1017E000000000000000000011412111000200056E +:1017F0000200218080008000000000000000000046 +:101800008380808300830003058000800000000047 +:1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 :1018300000000000000000000000000000000000A8 :101840000000000000000000000000000000000098 :101850000000000000000000000000000000000088 -:101860000000000000000000000000001000080060 -:101870004100000000000000000000000000000027 -:101880008080000000008000808000000000800058 -:1018900080800000000000008000808000000000C8 +:101860008080000000000000000000000000000078 +:1018700000000000000080058080000000000000E3 +:1018800080800000804100418080000080030000D3 +:1018900080000000000000000000000000000000C8 :1018A0000000000000000000000000000000000038 :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000100000000000000000000000000E7 -:101900000000C0A0000000008400C09000000000A3 -:101910008400C0900000000000008400C09000001F +:1018D0000000000000000000000000000400C00044 +:1018E0000000900400000000000000000000000064 +:1018F000000000000000000084000290880000004A +:101900000000C0A0000082000001C09000000200A2 +:101910000000C040000000000000000000000000C7 :1019200000000000000000000000000000000000B7 :1019300000000000000000000000000000000000A7 :101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000100010000000000010000000163 -:101980000000009000C000000000009000C00000B7 -:101990000000009000C0000000000000009000C0A7 +:101950000000000000000001000100010001000083 +:101960000000000000010000000000000000000175 +:10197000000000000001820000000001C001000022 +:10198000000200900001000000000190C0C0400271 +:101990000040C09002C000000000000000000000F5 :1019A0000000000000000000000000000000000037 :1019B0000000000000000000000000000000000027 :1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F0000004000500210041000900030010000060 -:101A000000110000008000800000000000800080C5 -:101A10000000000000800080000000000000008046 -:101A20000080000000000000000000000000000036 +:1019D0000000000000000000002000400020000285 +:1019E0000040004000000040000000000000000037 +:1019F0000020400041090041004000030002802017 +:101A000000090083008000410000210011808080D7 +:101A10008080008080808080000000000000000046 +:101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 :101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A700000000090000800000011000000000000BD -:101A8000000080000041000000008005000300000D -:101A900000008005000300000000000080050040F9 +:101A600000000020008000000000000000000000D6 +:101A7000000021022100000000000005008000009D +:101A80000000004000C100800000801180038080C1 +:101A90000000801180838000000000000000000032 :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF0000000000000900001000000010000000054 -:101B0000000000009000000100880000C0000000FC -:101B100000009000C0000000000088000000C0002D -:101B20000000000090000000000000000000000025 +:101AE000000000000001002000C000000000000015 +:101AF000000000000101000000000000000000A044 +:101B0000008200000000000300C00000C0012000AF +:101B100004040000C00140404088000000000000B4 +:101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B7000000000000000008100C843000000880051 -:101B800000C8000000000041000043008800008100 -:101B9000000043000000008100004300000000003E -:101BA0000081000043000000000000000000000071 +:101B600000000000000000820000430000000000B0 +:101B7000000000000000000000C80000000081819B +:101B800000C843000006818100C84300884200412C +:101B900000C8430000420041000043000042000032 +:101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 :101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000FFFF000000FFD7 -:101C100000003C3C000000FF00003C3C000000FFD6 -:101C2000000000003C3C000000FF0000000000003D +:101C0000000000000000000000000000000F000FB6 +:101C10000000F0FF0000AAAA000000FF000030F35F +:101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 :101C40000000000000000000000000000000000094 :101C50000000000000000000000000000000000084 :101C60000000000000000000000000000000000074 :101C70000000000000000000000000000000000064 -:101C8000000000000000000000000000FFFF000056 -:101C900000FF00003C3C000000FF00003C3C000056 -:101CA00000FF000000003C3C000000FF00000000BE +:101C8000000000000000FFFFFFFF00000000000F49 +:101C9000000F0000000F000000FF0000F0F0000047 +:101CA00030F3000000000000000000000000000011 :101CB0000000000000000000000000000000000024 :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D0000000000000000000000000000FF000000D4 -:101D1000FFFF0000FF000000FF000000FF000000C8 -:101D2000FF0000000000FF00000000FFFFFF0000B8 +:101CF000FAFA0000000000000000000000000000F0 +:101D00000000000072FFEFFE5500550000000000CB +:101D10007D7D0000F5050000FF000000FF5500007C +:101D2000F5F50000000000000000000000000000C9 :101D300000000000000000000000000000000000A3 :101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 :101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000FF0054 -:101D9000000000000000FF000000FF000000FF0046 -:101DA0000000FF0000000000FF00000000FFFFFF38 +:101D70000000FFFF30300000000000000000000005 +:101D8000000000000000D2FFFD7F5500FFAA000008 +:101D9000000028280000F50500000F0F0000005586 +:101DA0000000050500000000000000000000000029 :101DB0000000000000000000000000000000000023 :101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E00000560002E00090000006100068009200026 -:101E10000363032E0C0D92C0038203280C0092C0B2 -:101E2000038203280C0092C00000038203280C00E8 -:101E300082C0000000000000000000000000000060 +:101DE000000000000000000000610006000D00007F +:101DF00000610036000D000000000000000000003F +:101E000000610000000D000000610036C0190100F3 +:101E10000061002E8C0C12C003E3032A0C0D92C04B +:101E2000038203280C00C2C0000000000000000074 +:101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000003C0000F000000000CFC394 -:101E9000CFC300000000C3C3C3C3000000000000A4 +:101E700000000000000000003838000000000000F2 +:101E8000000000FF0000C30000C3000000000101CB +:101E90004100000000000303F3F300000000000015 :101EA0000000000000000000000000000000000032 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000003C0000F000000000A5 -:101F1000CFC3CFC300000000C3C3C3C30000000091 +:101EF000450000000000000008082828000000003D +:101F00000000000000FF00000000000000000000D2 +:101F1000A0000A00000000000303F3F3000000002B :101F200000000000000000000000000000000000B1 :101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 :101F50000000000000000000000000000000000081 :101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 -:101F800000000000000000000000F5F5000F000058 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 +:101F8000000000000000606083830000000000008B +:101F90000000000000000000000000000000FF0042 +:101FA000FF00000000000000000000000000000032 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 :101FD0000000000000000000000000000000000001 :101FE00000000000000000000000000000000000F1 :101FF00000000000000000000000000000000000E1 -:10200000000000000000000000000000FFFF0000D2 +:10200000000000000000000060608303000000008A :1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 +:102020007F007F00000000000000000000000000B2 :1020300000000000000000000000000000000000A0 :102040000000000000000000000000000000000090 :102050000000000000000000000000000000000080 @@ -164401,37 +164401,37 @@ :102070000000000000000000000000000000000060 :102080000000000000000000000000000000000050 :102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 +:1020A0000000001000000000000000000000000020 :1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000000000000010 :1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000200000000EE -:1020F00000000000000000000000000000000000E0 +:1020E00000000000000000000002000200000000EC +:1020F00000000000000000020000000000000000DE :1021000000000000000000000000000000000000CF :1021100000000000000000000000000000000000BF :1021200000000000000000000000000000000000AF :10213000000000000000000000000000000000009F :10214000000000000000000000000000000000008F :10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:1021800000000000000008000000000000008200C5 +:10216000000000000000000200000000000000006D +:1021700000000000000002000200004000400000DB +:10218000000000000000000000000000000000004F :10219000000000000000000000000000000000003F -:1021A00000000000000002000200004000000000EB -:1021B000000000000000000000000200000000001D +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F :1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000004000000FB -:1021E00000000000000000000000000000000400EB -:1021F00000000000000000000000000000000010CF -:1022000000000000000000000000000000000000CE -:1022100000000000000000000000400000000088F6 -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000400000005E -:102240000000000800000000000000000000000086 -:10225000000000000000000000000000400000003E -:102260000000000800000000000000000000000066 +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000080000C6 +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000080000A6 +:10223000000000000000000000000000000000009E +:102240000000000000000000000000000000000886 +:10225000000000000000000000000000000000007E +:102260000000000000000000000000000000000866 :10227000000000000000000000000000000000005E -:102280000008000000000000000000000000000046 +:1022800000000000000000008800000000000000C6 :10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E :1022B000000000000000000000000000000000001E @@ -164440,21 +164440,21 @@ :1022E00000000000000000000000000000000000EE :1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD -:102310000000000000000000000000001184000028 +:1023100000000000000000000000000000000000BD :1023200000000000000000000000000000000000AD :10233000000000000000000000000000000000009D :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D :10236000000000000000000000000000000000006D :10237000000000000000000000000000000000005D -:10238000000000000000000000400000000000000D -:1023900000040000000000000000000000400000F9 +:10238000000000000000000000000000000000004D +:102390000000000800000000000000000000000035 :1023A000000000000000000000000000000000002D -:1023B000000000000000000000000000000000001D +:1023B0000000000800000000000000000000000015 :1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD +:1023D00000000000000800000000000000000000F5 :1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD +:1023F00000000000000800000000000000000000D5 :1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC @@ -164472,18 +164472,18 @@ :1024E00000000000000000000000000000000000EC :1024F00000000000000000000000000000000000DC :1025000000000000000000000000000000000000CB -:1025100000000000000000000000000000000000BB -:102520000004008811000500000000000000000009 -:102530000000008400000000000000000084000093 -:10254000000021000000000000000000000000006A -:10255000000000002100000000000000000000005A +:10251000009000000000000000000000000000002B +:102520000000000000840000000000000000000027 +:10253000000000000000000000000000000000009B +:102540000000008400000000000000000000000007 +:10255000000000000000000000000000000000007B :10256000000000000000000000000000000000006B -:102570000000000000000000000000000400000057 +:10257000000000000000000000000000000000005B :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B -:1025A0000000000000000000000000000000000823 -:1025B0000000000000000000000000009002000089 -:1025C0000000000000000000000200000000900079 +:1025A000000000000000000000000000000000111A +:1025B000000000000000000000000000000000001B +:1025C0000000000000000000000000000000000209 :1025D00000000000000000000000000000000000FB :1025E00000000000000000000000000000000000EB :1025F00000000000000000000000000000000000DB @@ -164494,7 +164494,7 @@ :10264000000000000000000000000000000000008A :10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A -:102670000000020000000000000000000000000058 +:10267000000000000000000000000000000000005A :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A :1026A000000000000000000000000000000000002A @@ -164593,41 +164593,41 @@ :102C70000000000000000000000000000000000054 :102C80000000000000000000000000000000000044 :102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000020022 -:102CB000820400000000000000000000A0000000EE -:102CC00000000000000000000000000000002000E4 -:102CD00000040000000000000000000000000000F0 +:102CA0000000000000000000000400000000000020 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 :102CE00000000000000000000000000000000000E4 -:102CF0002000000400000000000000000080000030 -:102D000000000004000000000000000000000000BF -:102D100000000004000000000000000000000000AF -:102D200000000000000000000000000000000000A3 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000100000000A2 :102D30000000000000000000000000000000000093 :102D40000000000000000000000000000000000083 :102D50000000000000000000000000000000000073 :102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000002033 -:102D80000000000000010000000000000000000042 +:102D70000000004000000000000000000000000013 +:102D80000000000000000000000000000000000043 :102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000400040000093 -:102DC0000000020000000000000000000000000001 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000030000000000000000E0 +:102DA00000000000000002410000000000000000E0 +:102DB0000000000002000000000000000010000001 +:102DC0000000000000000000000000000000000003 +:102DD000040002000000000000800200000000006B +:102DE00000000040000000010000000000000000A2 :102DF00000000000000000000000000000000000D3 :102E000000000000000000000000000000000000C2 -:102E100000000000000002000000000000000000B0 -:102E20000000000002000000000800000000000890 -:102E3000000000000000004000000000030000004F -:102E4000000000000000000800080000000000086A -:102E50000000000000002000000000000000000052 -:102E60000000000000000008000000080000000052 -:102E7000000800000000000000000000000000004A -:102E80000000000000000000000800080000000032 -:102E9000000800000000000000000000000000002A -:102EA000000000000000000000040000000000001E -:102EB0000000000000000000000000000000000012 -:102EC00000000000010040000000000000000000C1 +:102E10000000000002000000000000400000000070 +:102E20000000000002000040000000000000000060 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000400000000032 +:102E6000000000000000000000000000000800005A +:102E70000000000000000000000000000000000052 +:102E8000000000000000000000000000000800003A +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000009000000000000000009 +:102EC00000000000000000030000000000000000FF :102ED00000000000000000000000000000000000F2 :102EE00000000000000000000000000000000000E2 :102EF00000000000000000000000000000000000D2 @@ -164635,72 +164635,72 @@ :102F100000000000000000000000000000000000B1 :102F200000000000000000000000000000000000A1 :102F30000000000000000000000000000000000091 -:102F400000000000000020008000000000000000E1 +:102F40000000000000000000000000000000000081 :102F50000000000000000000000000000000000071 :102F60000000000000000000000000000000000061 :102F70000000000000000000000000000000000051 :102F80000000000000000000000000000000000041 :102F90000000000000000000000000000000000031 :102FA0000000000000000000000000000000000021 -:102FB00000000000000000000000004000040000CD -:102FC000000000040000008000000100000000007C +:102FB0000000000000000000000000000000000011 +:102FC00000000000000000000800000000000000F9 :102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000800000000000000D9 -:102FF000000000000000000000008200000000004F +:102FE00000000000000000000000000000000000E1 +:102FF0000000004000000000000000000000000091 :1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000009A7 -:103020000000000000000040000000000000000060 +:1030100000000000000000000000000000000000B0 +:103020000000000000080000000000000000000098 :103030000000000000000000000000000000000090 -:103040000000000000000000000800002000000058 +:103040000000000000000000000000000000000080 :103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 +:10306000410000000000000000000000000000001F :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 :103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C00000000000000000002000000000000000E0 -:1030D00000000000000000000000000000000000F0 +:1030B00000000000000000002000000000000000F0 +:1030C0000000000000000000000000000000000000 +:1030D0000000000000080000000000008200000066 :1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF :1031100000000000000000000000000000000000AF :10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:1031400000000000000000000000800000040000FB +:10313000000000000000000000008000000000000F +:10314000410000000000000000000000000000003E :10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F :10318000000000000000000000000000000000003F :10319000000000000000000000000000000000002F :1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF +:1031B00000000000000000100020000000000010CF +:1031C00000050021002000000008000000000000B1 :1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE :1032100000000000000000000000000000000000AE :10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E +:10323000000000000000000020010001000000006C +:10324000000000000000000100000000000000007D :10325000000000000000000000000000000000006E -:10326000000000000800080000000000000000004E +:10326000000000000000000000000000000000005E :10327000000000000000000000000000000000004E -:103280000000000000000800000000000000000036 +:10328000000000000000000000000000000000003E :10329000000000000000000000000000000000002E -:1032A0000000000000000800000000000000000016 -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE +:1032A000000000000000000000000200000000001C +:1032B0000000000000000000000000A0000000006E +:1032C00000020000000000000000000000000000FC :1032D00000000000000000000000000000000000EE :1032E00000000000000000000000000000000000DE :1032F00000000000000000000000000000000000CE :1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D -:10335000000000002000000000000000000000004D +:10333000000000000000000000000000008000000D +:1033400000000080000000000000000000000000FD +:10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D @@ -164708,62 +164708,62 @@ :1033A000000000000000000000000000000000001D :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD -:1033D0000000000000000400210003004100000084 -:1033E00000000000000000000000000000000000DD +:1033D00000000000000000000000000000000000ED +:1033E000000000000000000000000000000080005D :1033F00000000000000000000000000000000000CD :1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC :10342000000000000000000000000000000000009C :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C -:10345000000000000000000001000000000001006A +:10345000000000000000000000000000000000006C :10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C +:10347000020000000000000000000000000000004A :10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C :1034A000000000000000000000000000000000001C :1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D0000000000000000000010000008800A000C3 +:1034C00000000000000000000000000000000200FA +:1034D00000000000000000000000000000000000EC :1034E00000000000000000000000000000000000DC :1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB -:10352000000001000000000000000000000000009A +:10352000000000000000000000000000000000009B :10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:103550000000000000000000000008000000000063 -:1035600080000000000000000000000000000000DB +:103540000000000003090005000300000000000067 +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B :10357000000000000000000000000000000000004B :10358000000000000000000000000000000000003B -:10359000000000000000000000000000000010001B -:1035A0000000000008000000000000000000000013 +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B :1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D0000000000000000000000000000000008863 +:1035C00000000000000000000000800080000000FB +:1035D00000410000000000000000000000000000AA :1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB +:1035F0000000000000000004000000800000000047 :1036000000000000000000000000000000000000BA :1036100000000000000000000000000000000000AA -:10362000004000000000000000000000000000005A +:10362000000000000000000000000000000000009A :10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000004000000000000000000000000000001A -:10367000000000000000000000000000000000004A +:10364000000000000000000000000000080008006A +:103650000000000100000000000000000000000069 +:10366000000000000000000000000000000000005A +:103670000000000000000000000100000040000009 :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000C8000022 -:1036E0000000810000C80000000000000000000091 +:1036C00000000000000000000000480000C84300A7 +:1036D0000000002100004300410000000000000045 +:1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 :1037100000000000000000000000000000000000A9 -:1037200000000000818100C843000000000000008C +:103720000000000000000000000000000000000099 :103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 +:103740000000000000000000000000000C0C0C0C49 :103750000000000000000000000000000000000069 :103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 @@ -164771,8 +164771,8 @@ :103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 +:1037C00000000000000000000000000000000C0CE1 +:1037D0000C0C0000000000000000000000000000D1 :1037E00000000000000000000000000000000000D9 :1037F00000000000000000000000000000000000C9 :1038000000000000000000000000000000000000B8 @@ -164788,15 +164788,15 @@ :1038A0000000000000000000000000000000000018 :1038B0000000000000000000000000000000000008 :1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 +:1038D0000000FFFFC3C30000000000000000000064 :1038E00000000000000000000000000000000000D8 :1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 +:10390000000000000000C3C3C3C3000000000000AB :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 :103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 +:1039500000000000FFFFC3C30000000000000000E3 :103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 :103980000000000000000000000000000000000037 @@ -164804,15 +164804,15 @@ :1039A0000000000000000000000000000000000017 :1039B0000000000000000000000000000000000007 :1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000610006000D0000006102 -:1039F000000680050000000000000000000000003C -:103A000000000000000000000000000000000000B6 +:1039D00000000000000000690006800920000000CF +:1039E0000028000000A0000000000000000000000F +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000010000B5 :103A100000000000000000000000000000000000A6 :103A20000000000000000000000000000000000096 -:103A300005610026800D000000000000000000006D +:103A30000000000000000000000000000000000086 :103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 +:103A5000000000000000000000000000CFC3CFC342 :103A60000000000000000000000000000000000056 :103A70000000000000000000000000000000000046 :103A80000000000000000000000000000000000036 @@ -164820,8 +164820,8 @@ :103AA0000000000000000000000000000000000016 :103AB0000000000000000000000000000000000006 :103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 +:103AD0000000000000000000000000000000CFC354 +:103AE000CFC3000000000000000000000000000044 :103AF00000000000000000000000000000000000C6 :103B000000000000000000000000000000000000B5 :103B100000000000000000000000000000000000A5 @@ -164830,7 +164830,7 @@ :103B40000000000000000000000000000000000075 :103B50000000000000000000000000000000000065 :103B60000000000000000000000000000000000055 -:103B7000000000000000000000FF30F30000000023 +:103B70000000000000000000000000000000000045 :103B80000000000000000000000000000000000035 :103B90000000000000000000000000000000000025 :103BA0000000000000000000000000000000000015 @@ -164838,80 +164838,80 @@ :103BC00000000000000000000000000000000000F5 :103BD00000000000000000000000000000000000E5 :103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000F0F030F30000C2 +:103BF00000000000000000000000000000000000C5 :103C000000000000000000000000000000000000B4 :103C100000000000000000000000000000000000A4 :103C20000000000000000000000000000000000094 :103C30000000000000000000000000000000000084 :103C40000000000000000000000000000000000074 :103C50000000000000000000000000000000000064 -:103C60000000200020002000200000002000200094 -:103C70000000000020002000000000000000820082 -:103C800000000000000000002000000020002000D4 -:103C900000000000200020000000000000002000C4 -:103CA0000000000000004000400020000000200054 -:103CB00020000000000020002000000000000000A4 -:103CC00020000000000000000000000000000000D4 +:103C600000000000000000008800000000000000CC +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 :103CD00000000000000000000000000000000000E4 :103CE00000000000000000000000000000000000D4 -:103CF000000000000300000000A000000000000021 +:103CF00000000000000000000000000000000000C4 :103D000000000000000000000000000000000000B3 -:103D1000000000000400000000000000000000009F +:103D100000000000000000000000000000000000A3 :103D20000000000000000000000000000000000093 -:103D3000000000000000040000000000000000007F +:103D30000000000000000000000000000000000083 :103D40000000000000000000000000000000000073 :103D50000000000000000000000000000000000063 -:103D60000000000000000000004000000000000013 -:103D70000000000000000040000000000000000003 -:103D80000000000000400040000000400000000073 -:103D90000000004002000000004000400000000061 -:103DA00000000000000000000000004000000000D3 -:103DB000000000000000020000400000004002007F -:103DC0000000000000000000000000400040000073 -:103DD0000000000000400000000000400040000023 -:103DE000000000000000000000000008004000008B -:103DF00003C00008000800000000000000080000E8 -:103E000000000000000000000000001000000000A2 -:103E1000000000080008000000000000000800008A -:103E20000000000000000000000000000000000092 -:103E3000000000000008000800000000000000086A -:103E40000000000000000000000000000000000072 -:103E5000000000000008000800000000000000084A -:103E60000000000000000000000000000000000052 +:103D60000000000000000000000000400000000013 +:103D7000000000050000000000000000000000003E +:103D80000000000000000000000000000000000033 +:103D9000000000000000000000000000840000009F +:103DA00000000000000000000000000000400000D3 +:103DB0000000000000000000000000000000000003 +:103DC0000000000000400000000000400000000073 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000008000000000000000000080000B3 +:103E000000000000000000000000000000000000B2 +:103E10000000000800000000000000000008000092 +:103E2000000000000008000000000000000000008A +:103E30000000000000080000000000000000000872 +:103E4000000000000000000800000000000000006A +:103E50000000000000080000000000000000000852 +:103E6000000000000000000800000000000000004A :103E70000000000000000000000000000000000042 -:103E8000000000000000C000000000000000000072 +:103E8000000000000000000800000000000000002A :103E90000000000000000000000000000000000022 :103EA0000000000000000000000000000000000012 :103EB0000000000000000000000000000000000002 :103EC00000000000000000000000000000000000F2 :103ED00000000000000000000000000000000000E2 :103EE00000000000000000000000000000000000D2 -:103EF0000000000000000000000040000000000082 +:103EF00000000000000000000000000000000000C2 :103F000000000000000000000000000000000000B1 :103F100000000000000000000000000000000000A1 :103F20000000000000000000000000000000000091 :103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000040000031 +:103F40000000000000000000000000000000000071 :103F50000000000000000000000000000000000061 :103F60000000000000000000000000000000000051 -:103F70000000000010000000000000000000000031 -:103F800000000000820000000000000000000000AF -:103F9000000000008200000000000000000000009F -:103FA000000000008200000000000000000000008F -:103FB000000000000000820000000000000000007F -:103FC000000000000000820000000000000000006F +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 :103FD00000000000000000000000000000000000E1 :103FE00000000000000000000000000000000000D1 -:103FF000000008000800100002000000000000009F -:1040000000000000000000000000000000040000AC -:104010000000080008000300050005000000000083 +:103FF00000000000000003000000000000000000BE +:1040000000000000000000000000000000000000B0 +:104010000000000000000800000000000000000098 :104020000000000000000000000000000000000090 -:10403000000000001000100003000000000000005D +:104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 -:10405000000000000800080003000000000000004D -:104060000000000000000000000000000000000050 +:104050000000000000000000000000000000000060 +:1040600000000000000011880000000000000000B7 :104070000000000000000000000000000000000040 -:1040800040000000000000000000000000000000F0 +:104080000000000000000000000000000000000030 :104090000000000000000000000000000000000020 :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 @@ -164919,30 +164919,30 @@ :1040D00000000000000000000000000000000000E0 :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 -:10410000000000C00000000000000000000000846B +:1041000000A000000000000000000000000000000F :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F :10413000000000000000000000000000000000007F -:1041400000000000000000000000000000840000EB +:10414000000000000000000000000000000000006F :10415000000000000000000000000000000000005F :10416000000000000000000000000000000000004F :10417000000000000000000000000000000000003F :10418000000000000000000000000000000000002F -:10419000000000000000000000020000000000001D +:10419000000000000000000000000000000000001F :1041A000000000000000000000000000000000000F :1041B00000000000000000000000000000000000FF :1041C00000000000000000000000000000000000EF -:1041D00000000000000000080000000000000000D7 +:1041D00000000000000000000000000000000000DF :1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000800B7 -:104200000004080008000000000408000800000086 -:10421000000000000000000008000000000008008E -:10422000008808880800000000200800080000003E -:104230000000000008000000000000000000000076 -:10424000080000880800080000000020080008009E -:104250000000000000000800000000000000000056 -:10426000080000880800080000000020080008007E -:104270000000000000000800000000000000000036 +:1041F0000000000000000000000000000088000037 +:104200000000000800000000000020000808000076 +:10421000000000000000000000000000000000009E +:10422000000000080000000000002000000800005E +:10423000000000000000000000000000000000007E +:10424000000000000008000000000000200000083E +:10425000000000000000000000000000000000005E +:10426000000000000008000000000000200000889E +:10427000000000000200000000000000000000003C :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E :1042A000000000000000000000000000000000000E @@ -165088,80 +165088,80 @@ :104B60000000000000000000000000000000000045 :104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 -:104B900000000000000000000000000020002000D5 -:104BA00000000000200000000000000000000000E5 -:104BB000000000000000000000002088200020000D -:104BC00000000000200000000000000000000000C5 -:104BD00000000000000000000000008800038800C2 -:104BE0002000000000002000000000000000000085 -:104BF000000000000000000000000000008800002D +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB0000000000000000000000000800000000075 +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000010000030000D1 +:104BE00000000000000000000000000000000000C5 +:104BF0000000000000000000000000000080000035 :104C000000000000000000000000000000000000A4 -:104C1000000000000000000000000000000800008C +:104C10000000000000000000000000008480000090 :104C20000000000000000000000000000000000084 :104C30000000000000000000000000000004000070 :104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000004000050 +:104C50000000000000000000000000002000000034 :104C60000000000000000000000000000000000044 :104C70000000000000000000000000000000000430 :104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000113 -:104CA00000000000001000100000000000000000E4 -:104CB0000000000000000000000000000000008074 -:104CC0000040004000000000000000000000000064 -:104CD0000000000000000000000000000000008054 +:104C90000000000000000000000000000000000410 +:104CA00000000000000000100000000000000000F4 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 :104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 -:104D00000080000000000000000000000000000023 +:104D00000000000000100000000000000000000093 :104D10000000000000000000000000000000000093 -:104D2000008000000900000000000000000000C03A -:104D300000000000000000000088000000000000EB -:104D40000008000000000400000000000000000057 -:104D50000000000000000000000000000000000053 -:104D60000408000000000000000000000000000037 -:104D70000000000000000000000000000000000033 -:104D8000000000080000000000000000000000001B -:104D900000000000000040000000000000000000D3 -:104DA00000000004000000000005002100000000D9 -:104DB000000000000000000000000041000088002A -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 +:104D20000000000000000000000000080000000873 +:104D30000008000000000000000800080200000059 +:104D40000200000000000000000800080008001039 +:104D500000080084000000080008000800000000AF +:104D600000000000000000000008008400080008A7 +:104D70000000000800000000000800080008000013 +:104D8000000000840008000000080000000800087F +:104D9000000000100000000000080084000800006F +:104DA0000084000800210021002100000000000014 +:104DB000000500000021002100210000000000008B +:104DC000000000000021002100210000000000037D +:104DD0000005000000030021002100000000000584 +:104DE0000000000000000021002100210000000060 +:104DF0000000000500000021002100210005000046 +:104E0000000000000000002100210021000000003F +:104E100000400000004100210021002100000000AE +:104E2000000800000000000000000000000000007A :104E30000000000000000000000000000000000072 -:104E4000000000000000000003000300000000005C +:104E40000000000000000000000000000000000062 :104E50000000000000000000000000000000000052 :104E60000000000000000000000000000000000042 :104E70000000000000000000000000000000000032 :104E80000000000000000000000000000000000022 :104E90000000000000000000000000000000000012 -:104EA000000000000000000082008200400082003C -:104EB00000008200820082008200400082008200A6 -:104EC00000008200820082008200C0000400820094 -:104ED00000008200820082008200400040008200C8 -:104EE00000008200820082000000820082008200B6 -:104EF00082000000820082008200000082008200A6 -:104F0000820000008200820082000800820082008D -:104F1000000000000000820082000000000000008D -:104F20000000000000000000000000000000000081 -:104F3000000000000000000000000000000005006C -:104F40000000000000000000000000000000000061 -:104F500000000000000040004000000000000000D1 -:104F60000000000000000000000000000000000041 -:104F700041000000000000000000000000000000F0 -:104F8000050000000000000000000000000000001C +:104EA0000000000000000000820000000000000080 +:104EB00000000000000000008200A0009000000040 +:104EC000000000000000000082008200820000005C +:104ED0000000000000000000400000000000000092 +:104EE0000000000000000000000082000000000040 +:104EF00000000000000000000000000000000000B2 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000088000000000009 +:104F20000000000000090000000000000000000078 +:104F30000000000000000000000000080000000069 +:104F40000000000000000000000000000000000859 +:104F50000008000000000000000000000000000049 +:104F600000000084000000000000000000000000BD +:104F70000000000000000000000000000000000031 +:104F8000000000000000000000820000000000009F :104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB000C00000008200C0000000000000000000EF -:104FC00000000000000000000800000000000000D9 -:104FD00000000000A0000000000000000000000031 -:104FE00000000000000000000000080000000800B1 -:104FF0000000C00000000000C00000000000000031 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 +:104FA00000080000000000000000001000000005E4 +:104FB00000000000000000000000000000000000F1 +:104FC00000000000000000000000000000000000E1 +:104FD000000000000000002100000000002100008F +:104FE00000000000000000000000000800000000B9 +:104FF0000000000000000000200000000000000091 +:10500000000000000000000000000000002100007F +:105010000005000000000000200002000005000064 +:10502000000000000000000000000000004100003F :105030000000000000000000000000000000000070 :105040000000000000000000000000000000000060 :105050000000000000000000000000000000000050 @@ -165170,95 +165170,95 @@ :105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 :1050A0000000000000000000000000000000000000 -:1050B0000000080000000800080000000004A00034 -:1050C00000000000000000000000000000000800D8 -:1050D000900008000000A000080000000000000090 -:1050E00000000000000000000000000000000400BC -:1050F0000000000008000000A00008000000000000 -:10510000C0000000000000000000000000000000DF -:105110001000000008000000A000080000000000CF -:10512000200000000000000000000000000000005F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000002005D +:1050B00000000000000000080000080800000000D8 +:1050C000000000000008000000080021002100008E +:1050D00000000000000000050000002100000008A2 +:1050E000000000000008000000080000002100058A +:1050F0000000000800040000002100000000000083 +:105100000000000000000008000000080021000866 +:10511000000800080000000000000000002100005E +:105120000000000000000000002100080000002135 +:105130000008000000000000000000000000000067 +:10514000000000000000000000000000000000005F :10515000000000000000000000000000000000004F :10516000000000000000000000000000000000003F :10517000000000000000000000000000000000002F :10518000000000000000000000000000000000001F :10519000000000000000000000000000000000000F :1051A00000000000000000000000000000000000FF -:1051B0000000000000010001000100C00001A0018A -:1051C00000C1018300000101004000040001000152 -:1051D00000C0000000010001000100C00001A001AA -:1051E00000C10083000041010082000200010001B3 -:1051F00000C00000000000010001000100C000012B -:10520000A00100C100830000000100400020000157 -:10521000000100C0000000010001000100C0000109 -:10522000A00100C1008300000001004000840001D3 -:10523000000100C0000000410041004100C00041E9 -:10524000004100C0104100410241000000800041C7 -:10525000004100C0000000410041004100C0004189 -:1052600000410090204100410241000000800041C7 -:10527000004100C00000000000410041004100C0AA -:1052800000410041009020410041404100000000E9 -:105290000041004100C0000000410041004100C049 -:1052A00000410041009020410041404100000000C9 -:1052B0000041004100C000004100030000000080E8 -:1052C0004100C00000000300200010000020830007 -:1052D0004100C10000000000410003000000008008 -:1052E0004100C000000003002000100000208300E7 -:1052F000C100C100002000000003410003000000C5 -:1053000000804100C00000000300200010000020C9 -:105310008500C100C1000020000041000300000022 -:1053200000804100C00000000300200010000020A9 -:105330008500C100C1000020000001000100000044 -:1053400000C00100C000000001004000A140008535 -:10535000C0000500C1000040400001000100000045 -:1053600000C00100C000000001004000A108004191 -:10537000C1004100C10000414000000001000100E7 -:10538000000000C00100C000000001004000A108B2 -:105390000009C0004100C1000041400001000100BF -:1053A000000000C00100C000000001004000A10892 -:1053B0000009C0004100C1000041400000C00001E0 -:1053C000C0C100000000000100C184A00005000170 -:1053D00000C10000000000010000000000C000014A -:1053E000C0C100000000000100C1C0A00005000114 -:1053F00000C100000000000100000000000000C02B -:105400000001C0C100000000000100C104A00005AF -:10541000000100C10000000000010000000000C009 -:105420000001C0C100000000000100C104A100058E -:10543000000100C100000000000100000000008029 -:10544000004180C100000000004100A0000300C135 -:10545000004100C100000000004100400000008049 -:10546000004180C100000000004100A0000500C113 -:10547000004100C1000000000041004000000000A9 -:105480000080004180C100000000004100A08003B6 -:1054900000C1004100C100000000004100400000C8 -:1054A0000080004180C100000000004100A0801089 -:1054B00000C1004100C100000000004100400000A8 -:1054C000C100800080C10000410080000200410056 -:1054D000C141000080400000410000008000410008 -:1054E000C100800080C10000410080000200410036 -:1054F000C1410000804000004100000080004100E8 -:105500000000C100800080C1000041008000020056 -:105510004100C141000080400000410000008000C7 -:105520004100C100800080C10000410080000200F5 -:105530004100C141000080400000410000008000A7 -:105540004100C1004000C0C100000100040085000E -:105550000100C1832000C001000001000000C00064 -:105560000100C1004000C0C1000001000400C100F2 -:105570000100C1832000C001000001000000C00044 -:1055800001000000C1004000C0C100000100040093 -:10559000C1000100C1832000C00100000100000023 -:1055A000C0000100C1004000C0C1000001000400B3 -:1055B000C1000100C1832000C00100000100000003 -:1055C000C0000100000000000000004200000000D8 -:1055D00000000000811200480700480000000000A1 -:1055E0000000000000000000000000420000000079 -:1055F0000000000081120048070048000000000081 -:105600000000000000000000000000000042000058 -:105610000000000000008112004807004800000060 -:105620000000000000000000000000000042000038 -:105630000000000000008112004807004800000040 +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000002000000000000DD +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000002000000000000BD +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000002000000009C +:10521000000000000000000000000000000000008E +:10522000000000000000000000000002000000007C +:10523000A0000000000000000000000000000000CE +:105240000000000000000009050000000000000050 +:10525000000000000000000000000000000000004E +:1052600000000000000000094000000000000000F5 +:10527000000000000000000000000000000000002E +:10528000000000000000000000090900000000000C +:10529000000000000000000000000000000000000E +:1052A00000000000000000000009030000000000F2 +:1052B00000000000000000000000400000000000AE +:1052C0000000000000000000400009000000000095 +:1052D00000000000000000090000090000000000BC +:1052E000000000000000000040008200000080007C +:1052F000800000000000001000000000040000001A +:105300000000000000000000000003008200008098 +:10531000800080000000000000110000110000006B +:1053200000000000000000000000030002000080F8 +:105330008000800000000000000300000100000069 +:1053400000000000000000000000C00002A000A05B +:10535000880088000000000000000000000000003D +:1053600000000000000000000000C00010A000408D +:10537000080008000000000000000000000001001C +:10538000000000000000000000000000C00010A0AD +:1053900000080800080000000000000000000000F5 +:1053A000000000000000000000000000C000C0A0DD +:1053B00000080800080000000000000100000000D4 +:1053C000000000000000000000000000008200005B +:1053D00000000000000000000000000000000000CD +:1053E000000000000000000000000000008200003B +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000405C +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000106C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000000000000000000000EC +:1054C0000040800000C1000000000000000000005B +:1054D0000041000000090000000000000000000082 +:1054E00000008000009100000000000000000000AB +:1054F0000041000000090000000000000000000062 +:105500000000000000040083000000000000000014 +:10551000000000410000001000000000000000003A +:1055200000000011800000C1000000000000000029 +:10553000000000C1000000040000000000000000A6 +:1055400000000001200000400000000000000000FA +:10555000000000C102000000000000000000000088 +:105560000000000008000010000000000000000023 +:10557000000000C102000000000000000000000068 +:105580000000000000008401008300000000000013 +:105590000000000000C10200000000000000000048 +:1055A000000000000000200000400000000000009B +:1055B00000000000001102000001000000000000D7 +:1055C00000000000000000000000000000000000DB +:1055D00000000000810000E0000048000000000022 +:1055E00000000000000000000000000000000000BB +:1055F00000000000810000E0000048000000000002 +:10560000000000000000000000000000000000009A +:10561000000000000000810000E0000048000000E1 +:10562000000000000000000000000000000000007A +:10563000000000000000810000E0000048000000C1 :10564000000000000000000000000000000000005A :10565000000000000000000000000000000000004A :10566000000000000000000000000000000000003A @@ -165275,110 +165275,110 @@ :105710000000000000000000000000000000000089 :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 -:1057400000000000000000000000757B0000000069 +:1057400000000000000000000000747B000000006A :105750000000000000000000000000000000000049 -:105760000000000000000000DEAE757B00000000BD +:105760000000000000000000DE2E747B000000003E :105770000000000000000000000000000000000029 -:105780000000000000000000DEAE0000757B00009D +:105780000000000000000000DE2E0000747B00001E :105790000000000000000000000000000000000009 -:1057A00000000000000000000000DEAE757B00007D +:1057A00000000000000000000000DE2E747B0000FE :1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000DEAE60C6030024 -:1057D0000000000000000031E000000000000000B8 -:1057E0000C0000000000000000C0630660C603005B -:1057F0000000000000000031E00000000000000098 -:105800000C0000000000000000C06306000060C63D -:1058100003000000000000000031E0000000000074 -:1058200000000C0000000000000000C0630660C61D -:1058300003000000000000000031E0000000000054 -:1058400000000C0000000000000000C06306000023 -:105850000000000020008800000000000000200080 -:105860000000000000000000000000002000000018 -:1058700000000000200020008800880000002000B8 +:1057C00000000000000000000000DE2E61560340D3 +:1057D0000000000000000230A000000000000000F7 +:1057E0000C4000000000000002C06A8661560340C1 +:1057F0000000000000000230A000000000000000D7 +:105800000C4000000000000002C06A8600006156E3 +:1058100003400000000000000230A0000000000073 +:1058200000000C4000000000000002C06A866156C3 +:1058300003400000000000000230A0000000000053 +:1058400000000C4000000000000002C06A8600005A +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 :105880000000000000000000000000000000000018 -:105890000000000000002000200020008400000024 -:1058A00020000000000000000000000000000000D8 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 :1058B00000000000000000000000000000000000E8 -:1058C00000040000000000000000000000000000D4 -:1058D00000000000000000000000000000000000C8 +:1058C00000000000000000000000000000000000D8 +:1058D00000000008000000000000000000000000C0 :1058E00000000000000000000000000000000000B8 :1058F00000000000000000000000000000000000A8 -:10590000000000000500050000000000000000008D +:105900000000000000000000000000000000000097 :105910000000000000000000000000000000000087 :105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 -:10594000000000000000000400040000000000004F -:105950000000000000050000000000000000000042 -:105960000000001000000000001001000000000016 -:10597000000800000000000000000000000000001F -:1059800000000040000000000000000000000000D7 -:1059900000000000000000400000000000000000C7 -:1059A00000000000000000000010000000000000E7 -:1059B00000000000000000000010001000000000C7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000800080000000800840082A9 -:1059E00000080004004000080008008440400082D5 -:1059F0000084001000820008000000100000000079 -:105A000000040084000000400010000800040000B2 -:105A1000000000080000000000100000001000005E -:105A2000000000080000000000080008001000004E -:105A3000000000000010000000000200000800004C -:105A400000000082000000000008000800000000C4 -:105A50000000000000000000001000000000000036 -:105A6000000000050008020000100000000000080F -:105A7000000000000000000000000010000800000E -:105A8000000000080000000000000000000000000E -:105A90000000000000050000000000000000000001 -:105AA00000000000000000000000000000000000F6 -:105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000000000D6 +:10594000000000040000000400040000000000004B +:1059500000000040004000000000000400000000C3 +:10596000000400000000000000000000000000082B +:105970000000000000000000000400000000000023 +:1059800000000000000000080010000000000000FF +:1059900000000000000000000000000800000000FF +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000001000000000C7 +:1059D000000000000000000800080008000800089F +:1059E0000004000800080008000800080000000883 +:1059F00000880008000000080008000800080008EF +:105A0000000000080088000800840008000000086A +:105A100000080008000000000008000800840008DA +:105A200000040000001000000008008800080000CA +:105A300000820082000800000084000800080008BE +:105A400000000000000000080004000000880000C2 +:105A500000000008000400000000000000000041F9 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000005000001 +:105AA00000000000000000000000000000000021D5 +:105AB00000000000000800000000000000000021BD +:105AC0000000000000410000000000080000000885 :105AD00000000000000000000000000000000000C6 -:105AE00003000000080000000000000000000000AB -:105AF000000000000000000000000000000008009E -:105B0000080000000300000000000000000000008A -:105B10000000000000000000000000000000000085 -:105B2000080008000000080003000000000000005A -:105B30000000000000000000000000000000000065 -:105B40000800080000000300000000000000000042 -:105B50000000000000000000000000000000000045 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000008401 +:105B2000000000000000000000000008000000006D +:105B300000000000000000A00000000000000000C5 +:105B4000000000000000000000000008000000004D +:105B5000000000080000000000000000000000003D :105B60000000000000000000000000000000000035 -:105B7000000000820400400000000000000000005F +:105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 -:105B900000000000000000000800000000000000FD +:105B90000000000000000000000000000000000005 :105BA00000000000000000000000000000000000F5 -:105BB00000000000000000004000000000000000A5 +:105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 -:105BD0000000004000000000000000000000000085 +:105BD00000000000000000000000000000000000C5 :105BE00000000000000000000000000000000000B5 -:105BF0000000000800031100000000000000000089 -:105C0000000000000000008400000082000000008E -:105C10000000000000000000000000000000000084 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000008202 :105C20000000000000000000000000000000000074 :105C30000000000000000000000000000000000064 :105C40000000000000000000000000000000000054 :105C50000000000000000000000000000000000044 -:105C6000000000000800000000000000000000002C -:105C70000000000000000100000000000000000023 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 -:105C900000000008000000000000000000000000FC -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000003F1 +:105CB00000000000001000000000000000000000D4 :105CC00000000000000000000000000000000000D4 :105CD00000000000000000000000000000000000C4 -:105CE0000000000000000000000000004100000073 -:105CF000080000000000000040000000000000005C -:105D00000000000000000000000003000000000090 -:105D1000080000000000000000000000000000007B -:105D2000000000000000000000000000080000006B -:105D3000000008000000000000000000000000005B -:105D40000000000000000000000000000800080043 -:105D5000000008000000000000000000000000003B +:105CE00000000000000000000000000000000000B4 +:105CF0000008000000000084000000000000000018 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 :105D60000000000000000000000000000000000033 -:105D70000000000000000021000000000000000002 -:105D80000000000000000000000000000000000013 -:105D900000000000000800000000000000000000FB -:105DA00000000000000000000000000800000000EB -:105DB00000000000000000000000000000000000E3 +:105D70000000000000000000000000000000000023 +:105D800000410000000000000000000000000000D2 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000210000000000000000000000000000C2 :105DC00000000000000000000000000000000000D3 :105DD00000000000000000000000000000000000C3 :105DE00000000000000000000000000000000000B3 @@ -165391,7 +165391,7 @@ :105E50000000000000000000000000000000000042 :105E60000000000000000000000000000000000032 :105E70000000000000000000000000000000000022 -:105E80000001000000000000000000000000000011 +:105E80000000000000000000000000000000000012 :105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 @@ -165399,7 +165399,7 @@ :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 :105EF00000000000000000000000000000000000A2 -:105F00000000002000000000000000000000000071 +:105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 :105F20000000000000000000000000000000000071 :105F30000000000000000000000000000000000061 @@ -165504,7 +165504,7 @@ :10656000000000000000000000000000000000002B :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B -:106590000000000000000000000000610006000D87 +:1065900000000000000000000000000000000000FB :1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB @@ -165529,7 +165529,7 @@ :1066F000000000000000000000000000000000009A :106700000000000000000000000000000000000089 :106710000000000000000000000000000000000079 -:1067200000FF00FF0000000000000000000000006B +:106720000000000000000000000000000000000069 :106730000000000000000000000000000000000059 :106740000000000000000000000000000000000049 :106750000000000000000000000000000000000039 @@ -165537,28 +165537,28 @@ :106770000000000000000000000000000000000019 :106780000000000000000000000000000000000009 :1067900000000000000000000000000000000000F9 -:1067A000000000FF00FF00000000000000000000EB +:1067A00000000000000000000000000000000000E9 :1067B00000000000000000000000000000000000D9 :1067C00000000000000000000000000000000000C9 :1067D00000000000000000000000000000000000B9 :1067E00000000000000000000000000000000000A9 :1067F0000000000000000000000000000000000099 :106800000000000000000000000000000000000088 -:106810000000000000000000000000000000040074 -:1068200000000000000000000000000000008400E4 -:106830000000000000000000000000000000200038 -:106840000400000000000000000000000000000044 -:106850002000000000000000000000000000000018 -:1068600020002000000000000000000000000000E8 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 +:106810000000000000000000000002000000000076 +:106820000000000000000000000000000000000068 +:106830000000000000000400000004000000000050 +:1068400000000000000088000000000000000000C0 +:1068500000000000000000002000000020000000F8 +:106860000000000000000000000000000000000028 +:1068700000000000000000002000000000000000F8 +:1068800000000000000000000010000000000000F8 :1068900000000000000000000000000000000000F8 :1068A00000000000000000000000000000000000E8 :1068B00000000000000000000000000000000000D8 :1068C00000000000000000000000000000000000C8 -:1068D00000000000000000000000000000000400B4 +:1068D00000000000000000000000000000000000B8 :1068E00000000000000000000000000000000000A8 -:1068F0000000200000000000000000000000000078 +:1068F0000000000000000000000000000000000098 :106900000000000000000000000000000000000087 :106910000000000000000000000000000000000077 :106920000000000000000000000000000000000067 @@ -165568,54 +165568,54 @@ :106960000000000000000000000000000000000027 :106970000000000000000000000000000000000017 :106980000000000000000000000000000000000007 -:1069900000000008000800080008000800080008BF -:1069A000000800100010000800080082000800081D -:1069B00000080008008800080088008200820008A3 -:1069C0000008000000080008000800000008000897 -:1069D0000008000000080008008400840008000887 -:1069E00000820008000000080008000800000008FD -:1069F00000080008000800840008000000080008E3 -:106A000000000008000000820008000800000008E4 -:106A1000004000080000000000000000000000210D -:106A20000000004100000000000000000000002104 -:106A3000000000000000000000000000000000084E -:106A4000000000000000080000210000000000001D -:106A5000000000000000000000000008000000002E -:106A600000000000000000000800080900210000EC -:106A70000000000000000000000000000003000013 -:106A800000000000000000000808080000000000EE +:106990000000004000840008000800820008000891 +:1069A000000800080008008400080008000800082B +:1069B000000800080008008400080008000800081B +:1069C00000080008000800400008008800080008CF +:1069D0000008000000080084000800080084000887 +:1069E000000800080008000800080008000000086F +:1069F00000080008000800840082008400000008ED +:106A0000000800080008000800080008000000084E +:106A1000004000080008000000000000000800001E +:106A20000000002100000021000000000000000024 +:106A3000000000030000002100050000000000002D +:106A4000000000000000002100080000000000001D +:106A5000000000000000000000080000000000002E +:106A60000000000000000000001000000000000313 +:106A70000000000000000000000000000000000016 +:106A800000000000000000000021000000100000D5 :106A900000000000000000000000000000000000F6 -:106AA00000000000000000000008000000000000DE -:106AB00000000000000000000008000000000008C6 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000000000000000000D6 :106AC00000000000000000000000000000000000C6 :106AD00000000000000000000000000000000000B6 :106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 -:106B00000000000000000000000000000084000001 +:106AF0000000000000000000000000080008000086 +:106B00000000000000000000000000000000000085 :106B10000000000000000000000000000100000074 :106B20000000000000000000000000000000000065 :106B30000000000000000000000000000000000055 -:106B40000000000000000000000000000100000044 +:106B40000000020000000000000000000100000042 :106B50000000000000000000000000000000000035 :106B60000000000000000100000000000000000024 -:106B70000000000000000000000000000000000015 -:106B80000000000000000000020000000000000003 +:106B7000000000000000000000000000A000000075 +:106B80000000000000000000000000008200000083 :106B900000000000000000000000000000000800ED -:106BA0000000000000000000000000C00000000025 -:106BB000000000000000004000000000000000A0F5 -:106BC00000080000000000000000000000000800B5 +:106BA00000000000030000000000000000000008DA +:106BB00000000000000000000000000000000000D5 +:106BC00000000000000000000800000000000800B5 :106BD00000000000000000000000000000000000B5 :106BE000000000000000000008000000000000009D :106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000003000000000071 +:106C00000000000000000000004008000000030039 +:106C10000000000000000004000000000000000868 :106C20000000000000000000000000000000000064 :106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 +:106C4000000800000000000000000000000000003C :106C50000000000000000000000000000000000034 :106C60000000000000000000000000000000000024 :106C70000000000000000000000000000000000014 -:106C800000000000000000000000000800000000FC +:106C800000000000000800000000000000000000FC :106C900000000000000000000000000000000000F4 :106CA00000000000000000000000000000000000E4 :106CB00000000000000000000000000000000000D4 @@ -165627,12 +165627,12 @@ :106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 :106D30000000000000000000000000000000000053 -:106D400000000000008000000000000000000000C3 +:106D40000000000000800000000000000040000083 :106D50000000000000000000000000000000000033 :106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 +:106D7000000000000000000000000000080000000B :106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000008EB +:106D900000000000000000000000000000000000F3 :106DA00000000000000000000000000000000000E3 :106DB00000000000000000000000000000000000D3 :106DC00000000000000000100000000000000000B3 @@ -165788,12 +165788,12 @@ :107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 :107740000000000000000000000000000000000039 -:107750000000000000000000000000000000000029 -:107760000000000000000008000000000000000011 -:107770000000000000000000000000000000000009 -:1077800000000000000800000000000000000000F1 -:107790000000880800000000000002000000000057 -:1077A00000000000000000000000000000000000D9 +:107750000000000000100000000000000000000019 +:107760000008000000080008000000000000000001 +:107770000000000000000000000000000000841075 +:1077800002000000000000000000000000000000F7 +:107790000000000000000000000000008800000061 +:1077A0002000200000080000000000000000000091 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 :1077D00000000000000000000000000000000000A9 @@ -165812,38 +165812,38 @@ :1078A00000000000000000000000000000000000D8 :1078B00000000000000000000000000000000000C8 :1078C00000000000000000000000000000000008B0 -:1078D0000008000000080000000800000008000880 -:1078E00000080088000800080008008800880010D0 -:1078F0000008000800080000000800080008004018 -:10790000000800000008000800080000000800004F -:107910000008000800100008000000080008000827 -:1079200000080008000000100040000800080008DF -:10793000000800080000000800080008000800080F -:10794000000800080000000800000084008400080F -:1079500000100000000000100041000000080010AE -:107960000000000000000000000000000000000017 -:107970000000000000000000000000000000000007 -:1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 -:1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C00000000000000000000000000000000000B7 +:1078D0000008000000840008000800880084000000 +:1078E0000008000800000084000800840000000870 +:1078F0000008001000080008000800080008000840 +:1079000000080084000000080008000800080000CB +:10791000000800080000000800080008000800082F +:10792000000800080008008400080084000800081F +:107930000008000800080008000800080008000807 +:107940000084008800080000000800080088008407 +:1079500000030000000000080021000000080000F3 +:1079600000000000000000100003000000000021E3 +:1079700000000000000000000003000000050021DE +:1079800000000000000000000000000000000021D6 +:1079900000000000000000080000000000000000DF +:1079A00000210000000000000000000000000000B6 +:1079B00000030000000000000010000000050000AF +:1079C00000000000000000000000000000000008AF :1079D00000000000000000000000000000000000A7 -:1079E0000000000000000000000000000000000097 -:1079F000000000080000000000000000000000007F -:107A0000000000080010000000000000000000005E +:1079E000000000080000000000000000000000008F +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 :107A10000000000000000000000000000000000066 -:107A20000000000000000000001000000000000046 +:107A20000000000000000000000000000000000056 :107A30000000000000000000000000000000000046 -:107A4000000000000000000000000000000000082E +:107A400000A000000000000000000000080000008E :107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 -:107A70000000000000000000000000000400000002 -:107A80000000000000000000000000008200000074 -:107A900000000000000000000000000000000000E6 +:107A600000000000000040000000000000000000D6 +:107A70000000000000000000000000000000A00066 +:107A800000000000000000000000000000000000F6 +:107A90000000000000000000A00000000000000046 :107AA00000000000000000000000000000000000D6 -:107AB00000000000000000000000000000000800BE -:107AC0000000000000000000000004002000000092 +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000800000008000000A6 :107AD00000000000000000000000000000000000A6 :107AE0000000000000000000000000000000000096 :107AF0000000000000000000000000000000000086 @@ -165853,30 +165853,30 @@ :107B30000000000000000000000000000000000045 :107B40000000000000000000000000000000000035 :107B50000000000000000000000000000000000025 -:107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 +:107B6000000000000000000800000000000000000D +:107B700000000000000000000000000000000010F5 +:107B800000000000000000000000000000000008ED :107B900000000000000000000000000000000000E5 :107BA00000000000000000000000000000000000D5 -:107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000080000000000AD -:107BD0000000000000000000C000000000000000E5 +:107BB0000000000000000000000000000000004184 +:107BC00000000000000000000000000000000000B5 +:107BD0000000080000000000A000000000000000FD :107BE0000000000000000000000000000000000095 :107BF0000000000000000000000000000000000085 :107C00000000000000000000000000000000000074 :107C10000000000000000000000000000000000064 :107C20000000000000000000000000000000000054 -:107C3000000000080000000000000000000000003C +:107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 :107C50000000000000000000000000000000000024 -:107C6000000800000000000000000000000000000C -:107C700000000000200000000000000000000000E4 +:107C6000000800000000000000000000000000020A +:107C70000000000000000000000000000000820082 :107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA0000000000000008200000000000000000052 +:107C9000000800000000820000000000000000005A +:107CA00000000000000000000000000000000000D4 :107CB00000000000000000000000000000000000C4 :107CC00000000000000000000000000000000000B4 -:107CD0000000000000008200000000000000000022 +:107CD0000008000040000800400000000000000014 :107CE0000000000000000000000000000000000094 :107CF0000000000000000000000000000000000084 :107D00000000000000000000000000000000000073 @@ -165896,7 +165896,7 @@ :107DE00000004100802141C1C100000580050080E4 :107DF000000080414141000000004100802141C15C :107E0000C100000580050080000080414141000064 -:107E100000004100802141C1C10040058005008073 +:107E100000004100802141C1C100000580050080B3 :107E2000000000008041414100000000410080212D :107E300041C1C10000058005008000000000000075 :107E40000000000000000000000000000000000032 @@ -165934,11 +165934,11 @@ :1080400041000000000000000000000000000000EF :108050000000000000000000000000000000000020 :10806000000000000000000000000000004100418E -:10807000C1C1004100040000020200004141008033 -:1080800080C1004100410041C1C100410005000024 +:10807000C1C1004100000000020200004141008037 +:1080800080C1004100410041C1C1004100400000E9 :10809000050540004141008080C100410041004190 -:1080A000C1C1004100000000020200000002414185 -:1080B000008080C1004100410041C1C10041000574 +:1080A000C1C1004100400000020200000002414145 +:1080B000008080C1004100410041C1C10041004039 :1080C00000000202000000000000000000000000AC :1080D00000000000000000000000000000000000A0 :1080E000000000000000000000000000000000018F @@ -165950,10 +165950,10 @@ :10814000000000000101000000000000000000002D :10815000000000000000000000000000000000001F :10816000000000000000000000000000000000000F -:108170000000000000004842818100000000000073 +:1081700000000000000048424842000000000000EB :1081800000000000220048420000000000004842B9 :108190008181000000000000000000002200484231 -:1081A000000000000000484288410000000000007C +:1081A0000000000000004842818100000000000043 :1081B0000000000000002200484200000000000013 :1081C0004842818100000000000000000000000023 :1081D000000000000000000000000000000000009F @@ -166051,7 +166051,7 @@ :1087900000000000000000000000000000000000D9 :1087A00000000000000000000000000000000000C9 :1087B00000000000000000000000000000000000B9 -:1087C0000000000000000000000010010000100187 +:1087C0000000000000000000000090010000000117 :1087D0000000000000000000000000000000000099 :1087E0000000000000000000000000000000000089 :1087F0000000000000000000000000000000000079 @@ -166060,15 +166060,15 @@ :108820000000000000000000000000000000000048 :108830000000000000000000000000000000000038 :108840000000000000000000000000000000000028 -:108850000000008000000000000000000000000098 +:108850000000000000000000000000000000000018 :108860000000000000000000000000000000000008 :1088700000000000000000000000000000000000F8 :1088800000000000000000000000000000000000E8 :1088900000000000000000000000000000000000D8 :1088A00000000000000000000000000000000000C8 :1088B00000000000000000000000000000000000B8 -:1088C0000000000000000000000000000000400068 -:1088D0000000400400000000000000000000000054 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000400200000000000000000000074 :1088E0000000000000000000000000000000000088 :1088F0000000000000000000000000000000000078 :108900000000000000000000000000000000000067 @@ -166076,7 +166076,7 @@ :108920000000000000000000000000000000000047 :108930000000000000000000000000000000000037 :108940000000000000000000000000000000000027 -:108950000000000000810000000000000000000096 +:108950000000000000000081000000000000000096 :108960000000000000000000000000000000000007 :1089700000000000000000000000000000000000F7 :1089800000000000000000000000000000000000E7 @@ -166104,23 +166104,23 @@ :108AE0000000000000000000000000000000000086 :108AF0000000000000000000000000000000000076 :108B00000000000000000000000000000000000065 -:108B10000000000000000008000800000008000835 -:108B20000008000800080008000000080008000015 -:108B300000080008000800080008000800080008F5 -:108B400000080084800800840008000800840000F9 +:108B10000000000000000008000800080008000035 +:108B2000000800080008000800000008000800080D +:108B30000000008400080008000800080008000881 +:108B40000008000880080084000000080084000875 :108B500000080008000800000008000800080008DD -:108B60000008000800080008000800080084000849 +:108B600000080008000800080008000000080000D5 :108B700000080008000800080008000800080008B5 -:108B80000008000800080008000800080084000829 -:108B900000080008000800080000000000000000B5 -:108BA00000000000000000000000000000050000C0 -:108BB000000200000000000000050000000300218A -:108BC0000004000000080000000000000000000891 -:108BD0000008000000210000000000050000000067 -:108BE000002100000000002100000000000000083B -:108BF000002100210000000300000000000000052B -:108C000000210021000000050000000900210000F3 -:108C100000210021000000210000000000000000F1 +:108B800000080008000800080008000800080008A5 +:108B900000840008008400080000000300000000BA +:108BA00000000000000000030000000000050009B4 +:108BB0000000000000000000002000000000000095 +:108BC0000000000000050021000800000000000275 +:108BD000000000000000000900000021000000214A +:108BE0000021000000000000000000210000002122 +:108BF0000008000000000000000000030000002149 +:108C00000000000000000021000000000000002122 +:108C10000000000800000008000000000000000044 :108C20000000000000000000000000000000000044 :108C30000000000000000000000000000000000034 :108C40000000000000000000000000000000000024 @@ -166145,30 +166145,30 @@ :108D700000000000000000000000000000000000F3 :108D800000000000000000000000000000000000E3 :108D900000000000000000000000000000000000D3 -:108DA00000000000000800000000000000000000BB -:108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000300000000A0 -:108DD000000800000000000000000000000000008B -:108DE0000000000000000000000000000000000083 +:108DA00000000000000000000008000000000000BB +:108DB00000000000000300000000000800000000A8 +:108DC00000000000000000000002000000000000A1 +:108DD0000000000000000000000000000000000093 +:108DE000000000000000000000000000000500007E :108DF0000000000000000000000000000000000073 -:108E00000000000000210000000000000000000041 -:108E10000000000000000000000000000000000052 +:108E00000000000000000000000000000000000062 +:108E1000000300000000002000000000000000002F :108E20000000000000000000000000000000000042 -:108E3000000000000008000000000000000000002A +:108E30000000000000000000000000000000000032 :108E40000000000000000000000000000000000022 :108E50000000000000000000000000000000000012 :108E60000000000000000000000000000000000002 :108E700000000000000000000000000000000000F2 :108E800000000000000000000000000000000000E2 :108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000210000A1 -:108EB0000000000000210000000000000021000070 -:108EC0000021000000000000000000000021000060 -:108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000002161 -:108EF0000000000000000000000000000000000072 -:108F00000000000000000021000000000000000040 -:108F10000000002100000000000000080000000028 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000050005A8 +:108EC0000008002100210003000000000000000055 +:108ED0000000000000000000002100000000000071 +:108EE0000000000000000000000000000000000082 +:108EF000000000000000000000080000000000006A +:108F0000000000000000000500000000000000213B +:108F10000000000000000000000000000000000051 :108F20000000000000000000000000000000000041 :108F30000000000000000000000000000000000031 :108F40000000000000000000000000000000000021 @@ -166193,20 +166193,20 @@ :1090700000000000000000000000000000000000F0 :1090800000000000000000000000000000000000E0 :1090900000000000000000000000000000000000D0 -:1090A0000000000000000000000000008000000040 -:1090B000000000028000000000000000000000002E -:1090C000000000020000000000000000000000009E +:1090A00000000000000000000000000000000000C0 +:1090B000000000020000000000000000800000002E +:1090C0000000000900000000000000000000000097 :1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000800000 -:1090F0000000000800020000000000000000000066 +:1090E0000000000000000000000000000000000080 +:1090F000000000000011000000000000000000005F :1091000000000000000080000000000000020000DD :10911000000000000000000000000000000000004F -:109120000000000000000000000000000000080037 -:109130000000000000000800000000000000A00087 +:10912000000000000000000000000000000002003D +:109130000000000000000200000000000000080025 :10914000000000000000000000000000000000001F -:1091500000000000000010000000000000000000FF +:10915000000000000000020000000000000000000D :1091600000000000000000000000000000000000FF -:1091700040000000000100000000000000000000AE +:1091700010000000000000000000000000000000DF :1091800000000000000000000800000000000000D7 :1091900000000000000000000000000000000000CF :1091A00000000000000000000000000000000000BF @@ -166219,7 +166219,7 @@ :10921000000000000000000000000000000000004E :10922000000000000000000000000000000000003E :10923000000000000000000000000000000000002E -:10924000000000000000000002000000000000001C +:10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E :1092600000000000000000000000000000000000FE :1092700000000000000000000000000000000000EE @@ -166227,15 +166227,15 @@ :1092900000000000000000000000000000000000CE :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE -:1092C0000000000000090000008000000000000015 -:1092D0000000000000000000000000000008000086 +:1092C000000000000002000000800000000000001C +:1092D000000000000000000000000000001000007E :1092E000000000000000000000000000000000007E :1092F000000000000002000000000000000000006C :10930000000000000000000000000000000000005D :10931000000000000000000000000000000000004D :10932000000000000000000000000000000000003D :10933000000000000000000000000000000000002D -:109340000000000000000000000000840000000099 +:1093400000000000000000000000004000000000DD :10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED @@ -166243,7 +166243,7 @@ :1093900000000000000000000000000000000000CD :1093A00000000000000000000000000000000000BD :1093B00000000000000000000000000000000000AD -:1093C0000000000000000000810000000000000715 +:1093C000000000000000000048000000000000074E :1093D000000000000000000000000000000000008D :1093E00081000000000000070000000000000000F5 :1093F000000000000000000000000000000000006D @@ -166342,33 +166342,33 @@ :1099C0000000000000000000000000000000000097 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 +:1099F0000000000000000000000000000004000063 :109A00000000000000000000000000000000000056 :109A10000000000000000000000000000000000046 :109A20000000000000000000000000000000000036 :109A30000000000000000000000000000000000026 -:109A40000000000000000000000000000000000016 -:109A50000000000000000000000000000000000006 -:109A600000080000000000000000000000000000EE -:109A700000000000000000000000000000000000E6 -:109A800000080000000000000000000000000000CE +:109A40000000000000000000000000000000000412 +:109A500000000008000000000000000000000000FE +:109A600000000000000000000008000000000000EE +:109A700000000008000000000000000000000000DE +:109A800000000008000000000008000000000000C6 :109A900000000000000800000000000000000000BE -:109AA00000000008000000000000000000000000AE -:109AB000000000000008000000000000000000009E -:109AC0000000000800000000000800000000000086 +:109AA000000000000008000000000008000800009E +:109AB000000000000008000000000008000800008E +:109AC0000000000800080000000000080008000076 :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B2000000000000000000000000008000000002D +:109B1000000000000000000000000000000000083D +:109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 -:109B700000000000000000080000000000000000DD -:109B800000000000000200000000000000000000D3 -:109B900000000000000000000000000000000000C5 +:109B700000000000000000000000000000000000E5 +:109B80000000000000000084000000000000000051 +:109B900000000000008400000000000000000084BD :109BA00000000000000000000000000000000000B5 :109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 @@ -166397,20 +166397,20 @@ :109D30000000000000000000000000000000000023 :109D40000000000000000000000000000000000013 :109D50000000000000000000000000000000000003 -:109D600000000000000000000000000000000000F3 +:109D600000000000000000000000000000000008EB :109D700000000000000000000000000000000000E3 :109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 -:109DA0000000000000A00000000000000000000013 +:109D900000000000000000080000000000000000BB +:109DA00000000000000000000000000000000000B3 :109DB00000000000000000000000000000000000A3 :109DC0000000000000000000000000000000000093 -:109DD000000000080000000000000000000000007B +:109DD0000000000000000000000000000000000083 :109DE0000000000000000000000000000000000073 :109DF0000000000000000000000000000000000063 :109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 +:109E10000000000000000000002100000000000021 +:109E2000000000000000000000080000000000002A +:109E3000000800000000000000000000000000001A :109E40000000000000000000000000000000000012 :109E50000000000000000000000000000000000002 :109E600000000000000000000000000000000000F2 @@ -166567,15 +166567,15 @@ :10A7D0000000000000000000000000000000000079 :10A7E0000000000000000000000000000000000069 :10A7F0000000000000000000000000000000000059 -:10A8000000000000000000000000000000008800C0 -:10A8100000004000000000000000000000000000F8 -:10A820000000200000000000000000000000000008 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 :10A830000000000000000000000000000000000018 :10A840000000000000000000000000000000000008 -:10A850004000400040000000000000000000000038 +:10A8500000000000000000000000000000000000F8 :10A8600000000000000000000000000000000000E8 -:10A870002000000000004000000000000000000078 -:10A8800000000000C00040000000000000000000C8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 :10A8900000000000000000000000000000000000B8 :10A8A00000000000000000000000000000000000A8 :10A8B0000000000000000000000000000000000098 @@ -166589,29 +166589,29 @@ :10A930000000000000000000000000000000000017 :10A940000000000000000000000000000000000007 :10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 +:10A9600000000000000000000008000000000000DF :10A9700000000000000000000000000000000000D7 :10A9800000000000000000000000000000000000C7 -:10A99000000000002000000000000000000800008F +:10A9900000000000000000000000000000000000B7 :10A9A00000000000000000000000000000000000A7 -:10A9B000000000000000000000000000000800008F -:10A9C0000000000000000000000000000000000087 -:10A9D000000000000000000000000000000000086F -:10A9E000000000000000000800000000000000005F -:10A9F000000000000000000000000000000000084F -:10AA0000000000000000000800000000000000003E -:10AA10000000000000000000000000000000000036 +:10A9B000000000080000000000000000000000840B +:10A9C000000000000084008400000000000000007F +:10A9D000000000000008000000000000000000006F +:10A9E0000000000000000000000800000008000057 +:10A9F00000000000008200080008000800000008B5 +:10AA000000000000000000000004000800820000B8 +:10AA10000000000000000000000200000000000034 :10AA20000000000000000000000000000000000026 -:10AA300000000000000000000000400000000000D6 +:10AA30000000000000000000000000020003000011 :10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 +:10AA500000000003000000000008000800000000E3 :10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 +:10AA700000000003000000000008000000000000CB :10AA800000000000000000000000000000000000C6 :10AA900000000000000000000000000000000000B6 :10AAA00000000000000000000000000000000000A6 :10AAB0000000000000000000000000000000000096 -:10AAC000000000000000000000080000000000007E +:10AAC0000000000000000000000000000000000086 :10AAD0000000000000000000000000000000000076 :10AAE0000000000000000000000000000000000066 :10AAF0000000000000000000000000000000000056 @@ -166624,23 +166624,23 @@ :10AB600000000000000000000000000000000000E5 :10AB700000000000000000000000000000000000D5 :10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000003000800AA -:10ABA00005000000000000000000000000000000A0 -:10ABB0000800000000000000000000000800000085 -:10ABC000080000000000000000000000000000007D -:10ABD000080000000000000000000000000010005D -:10ABE0001000100000001000000000000000000035 -:10ABF0000500000000000000000000000000080048 -:10AC00000800080010000000000000000000000024 -:10AC1000000000000000000000000000000008002C -:10AC200000000000C0000000000000000000000064 +:10AB900000000000000300000000000000000000B2 +:10ABA0000000000000000000000000000008000895 +:10ABB00000A000A000000000000000000000000055 +:10ABC00000000000000000000000000000A000A045 +:10ABD00000000008000000000000000000820000EB +:10ABE000000000000000000000000000000000A0C5 +:10ABF000000000000008000000000000000000004D +:10AC0000000000000000000000000000000000A0A4 +:10AC100000080000000000A000000000000000008C +:10AC20000000000000000000000000000000000024 :10AC30000000000000000000000000000000000014 -:10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 +:10AC40000000000000000000000000030000000001 +:10AC500000080000000000000000000000000000EC +:10AC600000000000000800000008000000030000D1 +:10AC700000000008000000000000000000000000CC +:10AC800000000000000000000008000000030000B9 +:10AC90000000004000000000000000000000000074 :10ACA00000000000000000000000000000000000A4 :10ACB0000000000000000000000000000000000094 :10ACC0000000000000000000000000000000000084 @@ -166656,15 +166656,15 @@ :10AD600000000000000000000000000000000000E3 :10AD700000000000000000000000000000000000D3 :10AD800000000000000000000000000000000000C3 -:10AD9000000000000000000084000000000000002F -:10ADA00000000000000000000000000000000000A3 -:10ADB000410000000000000005000000000000004D -:10ADC0000000000000000000000000000000000083 -:10ADD000000000000000000005000000000000006E -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 +:10AD900000000000000000000000000000000000B3 +:10ADA0000000000800000000000000000000000893 +:10ADB0000000000000000000000000000000000093 +:10ADC000000000080000000000000082000000A059 +:10ADD0000000000000000000000000000000000073 +:10ADE00000000000000800000008000800820000C9 +:10ADF00000A00000000000000000000000080000AB +:10AE000000000000000000080008000800820000A8 +:10AE100000A0000000000000000000000000000092 :10AE20000000000000000000000000000000000022 :10AE30000000000000000000000000000000000012 :10AE40000000000000000000000000000000000002 @@ -166820,79 +166820,79 @@ :10B7A0000000000000000000000000000000000099 :10B7B0000000000000000000000000000000000089 :10B7C0000000000000000000000000000000000079 -:10B7D0002000000000000000200000000000200009 +:10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 :10B7F0000000000000000000000000000000000049 -:10B8000000000000000000038800000000000000AD -:10B810000000000090000000000000000000000098 -:10B820000000000000000000000000000000000018 -:10B83000C000000020000000880000008800000018 -:10B8400000001000100000000000000000000000D8 +:10B80000000000092000000300000000000000000C +:10B810000000000000000000000000000000000028 +:10B8200000000000000020000000000000000000F8 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 :10B8500000000000000000000000000000000000E8 :10B8600000000000000000000000000000000000D8 :10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 +:10B880000000000000008000000000000000000038 :10B8900000000000000000000000000000000000A8 :10B8A0000000000000000000000000000000000098 :10B8B0000000000000000000000000000000000088 :10B8C0000000000000000000000000000000000078 :10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000110000000000000047 +:10B8E0000000000000000000100000000000000048 :10B8F0000000000000000000000000000000000048 -:10B900000000000000000000100000000000000027 +:10B900000000000000000000010000000000000036 :10B910000000000000000000000000000000000027 -:10B9200000000000000000000000200800000000EF +:10B920000000000000000000000010000000000007 :10B930000000000000000000000000000000000007 -:10B9400000000000000000000000200800000000CF +:10B9400000000004000000000000000000000008EB :10B9500000000000000000000000000000000000E7 -:10B9600000000000000000000084A00000000000B3 -:10B97000000000000000008400000084000020821D -:10B98000008400000000008400008000000000002F -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000008001000016 -:10B9B0000000000000000000000000000000000087 -:10B9C00000000000000000000000000080010004F2 -:10B9D0000000000000000000000800030008000054 -:10B9E000000000000000000000080021002100000D -:10B9F00000000021000000000021002100210000C3 -:10BA000000000005000000000005002100210000EA -:10BA10000003000000050000000000090004000908 -:10BA20000000000400000000000000000009000009 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000004000000000000000000000000000A6 -:10BA600000000800000000000000000000000000CE +:10B96000000000000000000800088000000000083F +:10B9700000000000000000000000000000000000C7 +:10B980000088000000080082000810000000008409 +:10B99000000800000000000000000000000000009F +:10B9A00000000000000000080000000880000008FF +:10B9B0000008000800080000000000100000000857 +:10B9C00000000000000000820000000800000000ED +:10B9D0000000000000000021002100000000000025 +:10B9E00000000000000000210021002100110008DB +:10B9F00000210021000000210021002100000000A2 +:10BA000000030021000000210021002100000000AF +:10BA10000021002100080000002100210021000079 +:10BA20000021002100000000002100210021000071 +:10BA30000021002100080000002100210021000059 +:10BA4000004100050000001100210021002100211B +:10BA500000000000000000000000000000000000E6 +:10BA600000A0000000000000000000000000000036 :10BA700000000000000000000000000000000000C6 -:10BA800000000800000000000000000000000000AE +:10BA8000000000A000000000000000000000000016 :10BA900000000000000000000000000000000000A6 -:10BAA0000000400000000000000000000000000056 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000021000000000000000000000055 -:10BAD000000082000000820082008200820082005A -:10BAE0000000820000000000820008008200820046 -:10BAF000000082004000000082008200820082007C -:10BB00000000C000000000008200080082008200E7 -:10BB100000800000000040000000820082008200DF -:10BB2000820000000000820000008200820082008B -:10BB30008200000040008200C0008200820082007B -:10BB4000820000004000000000008200A00082008F -:10BB50008200000000000000000000000000000063 +:10BAA0000000000000000000000000000000000096 +:10BAB000000000000000000000000000000000087E +:10BAC0000000000000000000000000000000000076 +:10BAD00000008200000000000000000000000000E4 +:10BAE000000008000000000000000000000000004E +:10BAF00000048200000000000000000000000000C0 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB300000008804880000000000000000000000F1 +:10BB400000000000000000000000000000000000F5 +:10BB500000000900000000000000000000000000DC :10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB8000000040000300400000000000000000A092 -:10BB900000000004000000000000000000000000A1 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC00000000000000041004000000000000000F4 -:10BBD0000000000000000000000000000000000065 -:10BBE0000800000000000000000800000000000045 -:10BBF0000000000000000000000000000000000045 -:10BC0000080000000000000000000000000000002C -:10BC10000000000000000000820000400000000062 -:10BC20000000000000000004000000000000000010 -:10BC300000000000100004000800000010000000D8 -:10BC40000400A00008000000000000000000000048 -:10BC500000000000000000000000000000000000E4 +:10BB700000000001000000000000000000000000C4 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA000000000000000000800000000000000008D +:10BBB0000000000000010000000000000000000084 +:10BBC000000000000000000800000000000000006D +:10BBD000000000001000000000080000000000004D +:10BBE0000000000000000000000000410000000014 +:10BBF000000200000000000000080000000000003B +:10BC00000000000000000000000000000000000331 +:10BC1000000300000000000000080008000000030E +:10BC2000000000000008000000000000000000000C +:10BC300000030000000000020000000800000003F4 +:10BC400000000000001000000000000000000000E4 +:10BC500000000000000000020000000000000000E2 :10BC600000000000000000000000000000000000D4 :10BC700000000000000000000000000000000000C4 :10BC800000000000000000000000000000000000B4 @@ -166901,14 +166901,14 @@ :10BCB0000000000000000000000000000000000084 :10BCC0000000000000000000000000000000000074 :10BCD0000000000000000000000000000000000064 -:10BCE000000000000000000000000000000000084C -:10BCF000000000090021000000000000000000001A -:10BD00000000000000000000000000000000002112 -:10BD100000000009000500030000000000000021F1 -:10BD200000000000000000000021000000000000F2 -:10BD30000000000000000000000000000000C00043 -:10BD4000000084000000C00000000000820000002D -:10BD500000000000000000000000000000000000E3 +:10BCE00088000000000000000000000000000008C4 +:10BCF000000000080000001000000000000000002C +:10BD0000880000000000000000000000000000416A +:10BD100000000008000000410005000000000000D5 +:10BD20000000880800008800880000000000000073 +:10BD300000410000000800000000000000000000BA +:10BD400000000000000088008800000000000000E3 +:10BD5000000000000003000500000080000000005B :10BD600000000000000000000000000000000000D3 :10BD700000000000000000000000000000000000C3 :10BD800000000000000000000000000000000000B3 @@ -166916,80 +166916,80 @@ :10BDA0000000000000000000000000000000000093 :10BDB0000000000000000000000000000000000083 :10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000162 -:10BDE0000001000100C00001000100C000210001AD -:10BDF0000001001000880001400100C000000001A7 -:10BE00000001000100C00001000100C0002100008D -:10BE10000101001000880001400100C00000000086 -:10BE200000010001000100C00001000100C001216B -:10BE300000000101002000880001400100C0000056 -:10BE400000010001000100C00001000100C000214C -:10BE500000000101000200020001400100C00000DA -:10BE600000410041004100C00041004100890841FB -:10BE700000022041000000000041804100C000009D -:10BE800000410041004100C00041004100890841DB -:10BE900000020241000000000041804100C000009B -:10BEA000000000410041004100C00041004100820B -:10BEB000104100080241000000000041804100C024 -:10BEC000000000410041004100C02041004100C18C -:10BED000084100400241000000800041804100C054 -:10BEE000000041000300000000804100C00000008D -:10BEF0000800200082000000A0004100C1000040B6 -:10BF0000800041000300000000804100C0000000EC -:10BF100008001000C000000088004100C10000407F -:10BF20008000000341000300000000804100C000C9 -:10BF3000000008001000C000000882004100C1009D -:10BF40000040800041000300000000804100C0006C -:10BF5000000005001000C0800000A0004100C100EA -:10BF60000040800001000100000000C00100C0008E -:10BF700000000100410009880090C0004100C1009C -:10BF80000040820001000100000000C00100C0006C -:10BF900000000100410008880090C0004100C1007D -:10BFA00000408200000001000100000000C001000C -:10BFB000C00000000100830040880090C1004100E3 -:10BFC000C1000040820001000100000000C001002B -:10BFD000C00000000000830004020090C000410087 -:10BFE000C1000040820000C00001C0C1000000008C -:10BFF000000100C102830009000100C1000000002F +:10BDD000000000000000000000000000000400015E +:10BDE0000001000100C00001000100C001050000C9 +:10BDF0000001000200100001000100C1000000016C +:10BE00000001000100C00001000100C001050000A8 +:10BE10000001000200080001000100C10000000054 +:10BE200000010001000100C00001000100C0010587 +:10BE300000000001000200080001000100C1000034 +:10BE400000010001000100C00001000100C0010567 +:10BE500000001001000200040001000100C1000008 +:10BE6000004100410041009000410041009010C19C +:10BE700000020441000000800041004100850000F4 +:10BE8000004100410041009000410041009010C17C +:10BE900000020241000000800041004100850000D6 +:10BEA000000000410041004100900041004100902D +:10BEB00010C1000202410000000000410041008565 +:10BEC000000000410041004100820041004100901B +:10BED00010410004094100000000004100410085BC +:10BEE00000004100030000000080410090000000BD +:10BEF000100004001000000090004100C10000800C +:10BF0000808041000300000000804100900000009C +:10BF1000100004001000000091004100C1000080EA +:10BF2000808000004100030000000080410090007C +:10BF30000000100004009000000090004100C100CB +:10BF400000808080410003000000008041009000DC +:10BF50000000100040008200000083004100C1008A +:10BF60000080808001000100000000C00100C000CE +:10BF7000000000008800049000C0C0008900C100DB +:10BF80000084101001000100000000C00100C0008A +:10BF9000000000008800049000C0C0008900C100BB +:10BFA00000841010000301000100000000C0010027 +:10BFB000C000000000008800049000C0C00089009C +:10BFC000C1000084101001000100000000C0010049 +:10BFD000C000000000008800049000C0C10089007B +:10BFE000C1000084101000C00001C0C100000000AA +:10BFF000000100C002100041000100C1000000006B :10C0000000010000000000C00001C0C100000000ED -:10C01000000100C102830009000100C1000000000E +:10C01000000100C020110041000100C1000000002B :10C02000000100000000000000C00001C0C10000CD -:10C030000000000100C188830009000100C1000068 +:10C030000000000100C020110011000100C100003B :10C04000000000010000000000C00001C0C10000AD -:10C050000000000100C182820009000100C100004F +:10C050000000000100C002110011000100C1000039 :10C0600000000001000000000080004180C10000CD -:10C07000000000410090030800C1004100C1000021 -:10C0800000000041004000000080004180C100002D -:10C09000000000410090030800C1004100C1000001 -:10C0A000000000410040000000000080004180C10D -:10C0B000000000000041009000030041004100C169 -:10C0C000000000000041004000000080004180C1ED -:10C0D000000000000041009080030041004100C1C9 -:10C0E00000000000004100400000C100800080C14D -:10C0F00000004100000005004100C1410000800235 +:10C070000000004100C100110041004100C100006A +:10C0800000000041001100000080004180C100005C +:10C090000000004100C100400041004100C100001B +:10C0A000000000410011000000000080004180C13C +:10C0B00000000000004100C1004000C1004100C17B +:10C0C000000000000041001100000080004180C11C +:10C0D00000000000004100C1004000C1004100C15B +:10C0E00000000000004100110000C100800080C17C +:10C0F00000004102000082004100C1C1000080092F :10C1000000004100000080004100C100800080C1AB -:10C1100000004100000005004100C141000080090D +:10C1100000004102000082004100C1C1800080098E :10C12000000041000000800041000000C1008000CC -:10C1300080C100004100000803004100C14100002F -:10C14000801000004100000080004100C10080001C -:10C1500080C100004100000803004100C14100000F -:10C16000800200004100000080004100C10040004A -:10C17000C0C100000100020003000100C1914000A5 +:10C1300080C100004102000082004100C1C18000B6 +:10C14000800500004100000080004100C100800027 +:10C1500080C100004102000002004100C1C1000096 +:10C16000800500004100000080004100C100400047 +:10C17000C0C100000100020008000100C109020066 :10C18000C000000001000000C0000100C10040002C -:10C19000C0C100000100100003000100C19188002F +:10C19000C0C100000100020008000100C109100038 :10C1A000C000000001000000C00001000000C1004C -:10C1B0004000C0C100000100880008000100C191DA -:10C1C0008800C000000001000000C0000100C100A4 -:10C1D0004000C0C100000100200090000100C1919A -:10C1E0002000C001000001000000C00001000000AC +:10C1B0004000C0C100000100020008000100C109E8 +:10C1C0001000C000000001000000C0000100C1001C +:10C1D0004000C0C100000100020040000100C10990 +:10C1E0000200C000000001000000C00001000000CB :10C1F000000000000042000000000000000081126A -:10C200000048070048000000000000000000000097 +:10C20000004107004800000000000000000000009E :10C210000000000000420000000000000000811249 -:10C220000048070048000000000000000000000077 +:10C22000004107004800000000000000000000007E :10C2300000000000000000420000000000000000BC -:10C2400081120048070048000000000000000000C4 +:10C2400081120041070048000000000000000000CB :10C25000000000000000004200000000000000009C -:10C2600081120048070048000000000000000000A4 +:10C2600081120041070048000000000000000000AB :10C2700000000000000000000000000000000000BE :10C2800000000000000000000000000000000000AE :10C29000000000000000000000000000000000009E @@ -167022,63 +167022,63 @@ :10C4400000000031E0000000000000000C000000CF :10C450000000000000C0630660C60300000000008A :10C4600000000031E0000000000000000C000000AF -:10C470000000000000C06306200000000000200053 -:10C480000000000000000000200088000000040000 -:10C4900000002000200020002000000000002000FC -:10C4A000000000000000000020002000000020002C -:10C4B000000020002000000000002000000000001C -:10C4C00020000000A000000000002000200000006C -:10C4D0002000000020002000000020000000880054 -:10C4E000200000002000C00000002000200000000C -:10C4F0002000840000002000000000000000000078 +:10C470000000000000C0630600000000000084000F +:10C48000000000000000000020000000000000008C +:10C49000000000000000000000000000000020007C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000020000000000007A +:10C4C000200000000000000000000000000000004C +:10C4D000000000000000000000000000000000005C +:10C4E000200000000000000000000000000000002C +:10C4F000000000000000000000000000000000003C :10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B +:10C510000000000000000000000000020000000019 :10C52000000000000000000000000000000000000B -:10C5300005000500050000002000000000000000CC +:10C5300000000000000000000000000000000000FB :10C5400000000000000000000000000000000000EB -:10C55000000000000000000041000000000000009A -:10C5600000000000000000000900000000000000C2 -:10C5700000000000050005000000000000000000B1 +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000040000000000000000000000000000B7 :10C5800000000000000000000000000000000000AB :10C59000000000000000000000000000000000009B -:10C5A0000000000000040000000002000000000085 -:10C5B00000009000000000000000000000000000EB -:10C5C000000000000000001100000000000000005A +:10C5A0000000000000000000000002000000000089 +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B :10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C600000000000000000000000000000008000022 -:10C6100000080000002000000000000000000000F2 -:10C620000000000000000000000000000084000086 -:10C63000000800000000000000840000000000006E -:10C6400000000000000000000000000000000000EA -:10C6500000000090009000000000000000000000BA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA +:10C5E0000000000000000000000000000200000049 +:10C5F0000000000000000000000000000200000039 +:10C600000000000000000008000000000000000022 +:10C6100000080008000800000000000800000000FA +:10C6200000000000000000080008000000000008F2 +:10C630000008000800080084000000080000000056 +:10C6400000000000000800000008001000000000CA +:10C6500000080008000800080000000200080000B0 +:10C66000000000000008000000080000000080003A +:10C670000008000800080008000000000008800012 :10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A -:10C6A0000000000000000000000004000000000086 -:10C6B0000000000000000000000000000000002159 -:10C6C0000000000000000000000000000002000068 -:10C6D0000011000000000000000000000000000049 -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C70000000000000000000008000000030000001E -:10C71000040000000000000000000000000800000D -:10C720000000000000000000080000000000000001 -:10C730000000000000C000000000000000A0000099 -:10C7400000000000000000000000080000000000E1 -:10C7500020000000000000040000000000000000B5 -:10C7600000904100110000000300080000000000DC -:10C7700003001100000000000000000000000000A5 -:10C780000000030000008200000000000000000024 +:10C690000000000000000000000000000021000079 +:10C6A0000021000000000000000000000009000060 +:10C6B0000009000000000000000000080000000069 +:10C6C0000000000000000000000000410000000029 +:10C6D000000000000040000000000000000000001A +:10C6E0000000000000000000000000410000000009 +:10C6F00000000000000000000009000200000041EE +:10C70000000200000084000000000000000000A003 +:10C71000000000A0000800080008000800000084D5 +:10C7200000000000008400001100000000000088EC +:10C730000000008800080008000800A000000000B9 +:10C7400000000000000000A0000011000000000038 +:10C7500000880000008800080008000800A0000011 +:10C76000008400000000000000000008000000003D +:10C770000000000000880008000800080008000011 +:10C780000000110000000000000000000000000098 :10C790000000000000000000000000000000000099 :10C7A0000000000000000000000000000000000089 :10C7B0000000000000000000000000000000000079 :10C7C0000000000000000000000000000000000069 -:10C7D00000000000000000000000C0000000000099 -:10C7E0000000C00000000000000000000000000089 -:10C7F00000000000C0000000000000000000000079 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0002000000000800100200000000080880070 :10C800000000000000000000000000000000000028 :10C810000000000000000000000000000000000018 :10C820000000000000000000000000000000000008 @@ -167086,154 +167086,154 @@ :10C8400000000000000000000000000000000000E8 :10C8500000000000000000000000000000000000D8 :10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 +:10C870000000800000000004200080000000000292 +:10C88000008200000500008400000000000000009D :10C890000000000000000000000000000000000098 :10C8A0000000000000000000000000000000000088 :10C8B0000000000000000000000000000000000078 :10C8C0000000000000000000000000000000000068 -:10C8D00000000000000000000400880000000000CC -:10C8E0004000000000000000000090000000000078 -:10C8F0000000000000000000000000000000000038 -:10C90000000000000800000000000000000000001F -:10C910000000008802000000000808200308000052 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0009000000000032000000088200400202198 +:10C900000004200020028804400400000000000011 +:10C9100000000008000011000000080800000000EE :10C920000000000000000000000000000000000007 -:10C93000000000880200000000A0080408080008A9 -:10C9400008000000000000000000000000000000DF -:10C9500000000000008840000520009008900804B6 -:10C960000004080000000000000000880000000033 -:10C97000000000000000080005000000080008009A -:10C98000000008000000000000000000000000009F -:10C990000000000000000000000000000000000097 +:10C9300011000008000011000000080800000000BD +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000800001100000002080000B4 +:10C9600000000000000000000000000000000000C7 +:10C970000000000000080000910000000508800091 +:10C980008000000180008000000191010000000093 +:10C99000000000000000000800000000000000008F :10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 +:10C9B000000800000000002100000000000000004E :10C9C0000000000000000000000000000000000067 :10C9D0000000000000000000000000000000000057 :10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 +:10C9F0000000000300000080000000000000008331 +:10CA0000C02104034020C000822100030000000078 :10CA10000000000000000000000000000000000016 :10CA20000000000000000000000000000000000006 :10CA300000000000000000000000000000000000F6 :10CA400000000000000000000000000000000000E6 :10CA500000000000000000000000000000000000D6 :10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 +:10CA700000000000000000000004000000000000B2 +:10CA800000200084800080010000000000002100E0 :10CA90000000000000000000000000000000000096 :10CAA0000000000000000000000000000000000086 :10CAB0000000000000000000000000000000000076 :10CAC0000000000000000000000000000000000066 :10CAD0000000000000000000000000000000000056 :10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 +:10CAF000000000000000000000000008101001828B +:10CB00000002000010008300000000100002210855 +:10CB10000090000000000000000000000000000085 :10CB20000000000000000000000000000000000005 :10CB300000000000000000000000000000000000F5 :10CB400000000000000000000000000000000000E5 :10CB500000000000000000000000000000000000D5 :10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 +:10CB700000000000000000000000000000808000B5 +:10CB80000880000000000900880000000880218063 +:10CB90000580000000000000000000000000000010 :10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 :10CBC0000000000000000000000000000000000065 :10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 +:10CBF0000000000000000000000000000000000233 +:10CC00000003000900800008008000080000000800 +:10CC1000008500900080000000000000000000007F :10CC20000000000000000000000000000000000004 :10CC300000000000000000000000000000000000F4 :10CC400000000000000000000000000000000000E4 :10CC500000000000000000000000000000000000D4 :10CC600000000000000000000000000000000000C4 :10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 +:10CC80000000008900100008000100C0000100023F +:10CC900000010010000400A00000000000000000DF :10CCA0000000000000000000000000000000000084 :10CCB0000000000000000000000000000000000074 :10CCC0000000000000000000000000000000000064 :10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 :10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 +:10CD000000000200080000001000000102001000F6 +:10CD1000010010014000100011010000000000009F :10CD20000000000000000000000000000000000003 :10CD300000000000000000000000000000000000F3 :10CD400000000000000000000000000000000000E3 :10CD500000000000000000000000000000000000D3 :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 +:10CD800000000000000080000000110002100010F0 +:10CD900080084108000880028003040800000000A9 :10CDA0000000000000000000000000000000000083 :10CDB0000000000000000000000000000000000073 :10CDC0000000000000000000000000000000000063 :10CDD0000000000000000000000000000000000053 :10CDE0000000000000000000000000000000000043 :10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 +:10CE00000000000000000000800000000000001092 +:10CE100000210000000000000000000000000000F1 :10CE20000000000000000000000000000000000002 :10CE300000000000000000000000000000000000F2 :10CE400000000000000000000000000000000000E2 :10CE500000000000000000000000000000000000D2 :10CE600000000000000000000000000000000000C2 :10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 +:10CE8000000000000000000002000200020002009A +:10CE9000000100000000000010000400100010005D :10CEA0000000000000000000000000000000000082 :10CEB0000000000000000000000000000000000072 :10CEC0000000000000000000000000000000000062 :10CED0000000000000000000000000000000000052 :10CEE0000000000000000000000000000000000042 :10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 +:10CF000000000000000000000000000000E0000041 +:10CF10000000000000E007004241000000E00000C7 :10CF20000000000000000000000000000000000001 :10CF300000000000000000000000000000000000F1 :10CF400000000000000000000000000000000000E1 :10CF500000000000000000000000000000000000D1 :10CF600000000000000000000000000000000000C1 :10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000000091 +:10CF8000000000000000000000000000EBEBC0FC0F +:10CF9000000000000000000000000000B2B23CFFF2 :10CFA0000000000000000000000000000000000081 :10CFB0000000000000000000000000000000000071 :10CFC0000000000000000000000000000000000061 :10CFD0000000000000000000000000000000000051 :10CFE0000000000000000000000000000000000041 :10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 +:10D0000000000000000000000000000000002828D0 +:10D01000C0FC000000000000000000000000B2B2F0 +:10D0200000C300000000000000000000000000003D :10D0300000000000000000000000000000000000F0 :10D0400000000000000000000000000000000000E0 :10D0500000000000000000000000000000000000D0 :10D0600000000000000000000000000000000000C0 :10D0700000000000000000000000000000000000B0 :10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000000000000090 -:10D0A0000000000000000000000000000000000080 +:10D090004D4D4D4D0000000000000000000000005C +:10D0A0005F0A5F0A000000000000000000000000AE :10D0B0000000000000000000000000000000000070 :10D0C0000000000000000000000000000000000060 :10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 :10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF +:10D110000000FFC33C000000000000000000000011 +:10D120000000BEBE1414000000000000000000005B :10D1300000000000000000000000000000000000EF :10D1400000000000000000000000000000000000DF :10D1500000000000000000000000000000000000CF :10D1600000000000000000000000000000000000BF :10D1700000000000000000000000000000000000AF :10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F +:10D190000000000000613007000D000005610A0F6B +:10D1A000050D00A000613007000D00000000000028 :10D1B000000000000000000000000000000000006F :10D1C000000000000000000000000000000000005F :10D1D000000000000000000000000000000000004F @@ -167241,7 +167241,7 @@ :10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E :10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE +:10D22000000000008000000000000000000000007E :10D2300000000000000000000000000000000000EE :10D2400000000000000000000000000000000000DE :10D2500000000000000000000000000000000000CE @@ -167249,7 +167249,7 @@ :10D2700000000000000000000000000000000000AE :10D28000000000000000000000000000000000009E :10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E +:10D2A0000000000000000000000000000000080076 :10D2B000000000000000000000000000000000006E :10D2C000000000000000000000000000000000005E :10D2D000000000000000000000000000000000004E @@ -167266,189 +167266,189 @@ :10D38000000000000000000000000000000000009D :10D39000000000000000000000000000000000008D :10D3A000000000000000000000000000000000007D -:10D3B000000000000002000000000000000000006B -:10D3C000000020000000000000001000000000002D +:10D3B000000000000000000000000000000000006D +:10D3C0000000040000000000000000000000000059 :10D3D000000000000000000000000000000000004D -:10D3E000000010000000000000002000000000000D -:10D3F00000008800000000000000000000000000A5 -:10D400000000100020000000884000002000000004 -:10D41000000000000000000000000000000000000C -:10D42000000020002000000000000000200000009C +:10D3E0000000200000000000C0004000000000001D +:10D3F000000000000002000000000000000000002B +:10D4000000000000200000000000200000000000DC +:10D410000000000088000000000000000000000084 +:10D42000000000000000040004002000880000004C :10D4300000000000000000000000000000000000EC :10D4400000000000000000000000000000000000DC :10D4500000000000000000000000000000000000CC :10D4600000000000000000000000000000000000BC :10D4700000000000000000000000000000000000AC -:10D48000000000002100000000000000210000005A +:10D48000000000000000000000000000000000009C :10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C +:10D4A000000000000000000080008000000000007C :10D4B000000000000000000000000000000000006C :10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E0000000000000000400000000000000000038 +:10D4D00000000000000082000000000000000000CA +:10D4E00000000000000000004000400000080000B4 :10D4F000000000000000000000000000000000002C -:10D50000000000000000000000100000000000000B +:10D50000000000000000000000000000000000001B :10D51000000000000000000000000000000000000B -:10D5200000000000000000000010000000000000EB +:10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB -:10D5400000000000000200000000000000000000D9 -:10D5500000000000000400000000000000000000C7 -:10D5600000000000000800000000000000000000B3 +:10D5400000000000000000080000000000000000D3 +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000080000800080000001B2 :10D5700000000000000000000000000000000000AB -:10D58000000000000000009000000000000000000B -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B0000000000000000000000000000000040067 -:10D5C0000000000000000000000008000000000053 +:10D58000000000080000000000080008000000087B +:10D590000000000000000000000003000000000088 +:10D5A00000000010000000000008008400000010CF +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B -:10D5E0000000000000000000000008000000000033 -:10D5F00000004000000000000000000000000000EB -:10D6000000000000000000000000400004000400D2 -:10D610008200400000000000000000000000000048 -:10D620000000000000000000000008008200000070 -:10D6300008000000000000000000000000000000E2 +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000009000000000000000000000007A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000020000000000110000D7 :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA :10D6600000000000000000000000000000000000BA :10D6700000000000000000000000000000000000AA -:10D680000000000041000000000000000000000059 -:10D69000000000201000000000000000000000005A -:10D6A0000000000003000000000000000000000077 -:10D6B000000000000000000000000000000000006A +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000020000000000000005A +:10D6B00000820082110000C0410800080000200024 :10D6C000000000000000000000000000000000005A -:10D6D000000000000000000000000000000000004A -:10D6E0000000000000000000000000000000080032 +:10D6D0000000000008000000000000000000000042 +:10D6E00000000000820000000000000000000000B8 :10D6F000000000000000000000000000000000002A -:10D700000000000004000000000000000000000015 -:10D71000000000000000C000000000000000000049 -:10D7200008000000000000000000000000000000F1 -:10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000000000D9 +:10D700000000000000000000000000000000000019 +:10D7100004000000000000000800000000000000FD +:10D7200000000000000000008200000088000000EF +:10D7300008000000880004008300010001000000D0 +:10D7400004000000000000000000000000000000D5 :10D7500000000000000000000000000000000000C9 :10D7600000000000000000000000000000000000B9 :10D7700000000000000000000000000000000000A9 :10D780000000000000000000000000000000000099 :10D790000000000000000000000000000000000089 :10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 +:10D7B00000000000000000008000040004000400DD +:10D7C00000008000000000000000000000000000D9 :10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000820000000000000000000000040092 -:10D810000400000004000000000000000000000000 +:10D7E0000000000000000000000000000000040035 +:10D7F000880004000000C0000000000000200000BD +:10D8000000200000000000000000000000000000F8 +:10D810000000000000000000000000000000000008 :10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 -:10D8500000080000000000000000000000000000C0 -:10D8600000000000000000000000000000000000B8 -:10D8700000080000000000000000000000000000A0 -:10D880000000000000000000000000000000000098 -:10D8900000000020000000004100000000004100E6 -:10D8A0000020000021000000000000000000000037 -:10D8B0000000000000000020000000000000000048 -:10D8C0000000000000000000000000000000000058 +:10D830000000000000000141200000000000200363 +:10D8400001000500080400000000000000000000C6 +:10D8500000000008000000000000000000000000C0 +:10D8600000000000000000000000000000080000B0 +:10D87000800000088008000000080000000000018F +:10D88000000000010000000000000000000000088F +:10D890000000000000080008000000080000000070 +:10D8A000000000000000000000000000000000C0B8 +:10D8B00000A00082000800C04002001000A0038801 +:10D8C00080082008A0000091000000000000000077 :10D8D0000000000000000000000000000000000048 :10D8E0000000000000000000000000000000000038 -:10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D9100000000000000000000000000000001000F7 +:10D8F0000400000004000000000000000000000020 +:10D9000000000020000000200000000000000000D7 +:10D910000000000000000000000000000000000007 :10D9200000000000000000000000000000000000F7 :10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 +:10D940000000400882080005820800000000000076 :10D9500000000000000000000000000000000000C7 :10D9600000000000000000000000000000000000B7 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 +:10D9700000008000000080000000000000000000A7 +:10D980000000000000010000000100000000000095 :10D990000000000000000000000000000000000087 :10D9A0000000000000000000000000000000000077 :10D9B0000000000000000000000000000000000067 :10D9C0000000000000000000000000000000000057 :10D9D0000000000000000000000000000000000047 :10D9E0000000000000000000000000000000000037 -:10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000000000000000016 +:10D9F0000000000000C000900000000000C19191F4 +:10DA00001000000100C000900000000000010000B4 :10DA10000000000000000000000000000000000006 :10DA200000000000000000000000000000000000F6 :10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 +:10DA400000000001000000000000000000000000D5 :10DA500000000000000000000000000000000000C6 :10DA600000000000000000000000000000000000B6 -:10DA700000000000000000000000000000000000A6 -:10DA80000000000000000000000000000000000096 +:10DA7000000000000000008000800000000000C1E5 +:10DA800083A180400010038000800000000000009F :10DA90000000000000000000000000000000000086 :10DAA0000000000000000000000000000000000076 :10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 +:10DAC00000090009000800400000000011000000EB :10DAD0000000000000000000000000000000000046 :10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 +:10DAF00000000000000000000000800000008080A6 +:10DB000003808000030080A100008000000080806E :10DB10000000000000000000000000000000000005 :10DB200000000000000000000000000000000000F5 :10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 +:10DB400000000000000000000080000300800008CA :10DB500000000000000000000000000000000000C5 :10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000000000000085 +:10DB70000000000000000000000000008200000023 +:10DB8000C09000C082000000C09100008200000030 +:10DB9000C090000000000000000000000000000035 :10DBA0000000000000000000000000000000000075 :10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 -:10DBD0000000000000000000000000000000000045 +:10DBC00000000000000000880000000800000008BD +:10DBD00000010088000000000000000000000000BC :10DBE0000000000000000000000000000000000035 :10DBF0000000000000000000000000000000000025 -:10DC00000000000000000000000000000000000014 -:10DC10000000000000000000000000000000000004 +:10DC0000909000C000010100909100C00000000051 +:10DC1000009000C0000000000000000000000000B4 :10DC200000000000000000000000000000000000F4 :10DC300000000000000000000000000000000000E4 -:10DC400000000000000000000000000000000000D4 -:10DC500000000000000000000000000000000000C4 +:10DC400000000000000000000100090000000000CA +:10DC500002000800000000000000000000000000BA :10DC600000000000000000000000000000000000B4 :10DC700000000000000000000000000000000000A4 -:10DC80000000000000000000000000000000000094 -:10DC90000000000000000000000000000000000084 +:10DC800000000080008000111041A0A10089000068 +:10DC90000000008000800000000000000000000084 :10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 -:10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 +:10DCC000000000000000000002000800C00000008A +:10DCD00002000000800010000000000000000000B2 :10DCE0000000000000000000000000000000000034 :10DCF0000000000000000000000000000000000024 -:10DD00000000000000000000000000000000000013 -:10DD10000000000000000000000000000000000003 +:10DD000080000008000000808511890505001100D1 +:10DD100080118020000000000000000000000000D2 :10DD200000000000000000000000000000000000F3 :10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000000000000C3 +:10DD40000000000000000000000000210021000091 +:10DD500000000000002000000000000000000000A3 :10DD600000000000000000000000000000000000B3 :10DD700000000000000000000000000000000000A3 -:10DD80000000000000000000000000000000000093 -:10DD90000000000000000000000000000000000083 +:10DD800000009000000000000082C001200100009F +:10DD90000000C001200000000000000000000000A2 :10DDA0000000000000000000000000000000000073 :10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000000000000053 -:10DDD0000000000000000000000000000000000043 +:10DDC0000000000000000000000000000001000052 +:10DDD0000000000000000001000000000000000042 :10DDE0000000000000000000000000000000000033 :10DDF0000000000000000000000000000000000023 -:10DE00000000000000000000000000000000000012 -:10DE10000000000000000000000000000000000002 +:10DE000000000000002100000600000000060000E5 +:10DE10000600820000410000060000000000000033 :10DE200000000000000000000000000000000000F2 :10DE300000000000000000000000000000000000E2 :10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 +:10DE5000000007000000000000E0070000000000D4 :10DE600000000000000000000000000000000000B2 :10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000000000092 -:10DE90000000000000000000000000000000000082 +:10DE8000000000000000FFFF0000FF000000FF0096 +:10DE90000000FF000000FF000000FF000000000085 :10DEA0000000000000000000000000000000000072 :10DEB0000000000000000000000000000000000062 :10DEC0000000000000000000000000000000000052 :10DED0000000000000000000000000000000000042 :10DEE0000000000000000000000000000000000032 :10DEF0000000000000000000000000000000000022 -:10DF00000000000000000000000000000000000011 -:10DF10000000000000000000000000000000000001 +:10DF00000000000000000000FFFF0000FF00000014 +:10DF1000FF000000FF000000FF000000FF00000005 :10DF200000000000000000000000000000000000F1 :10DF300000000000000000000000000000000000E1 :10DF400000000000000000000000000000000000D1 @@ -167463,32 +167463,32 @@ :10DFD0000000000000000000000000000000000041 :10DFE0000000000000000000000000000000000031 :10DFF0000000000000000000000000000000000021 -:10E000000000000000000000000000000000000010 -:10E010000000000000000000000000000000000000 -:10E0200000000000000000000000000000000000F0 +:10E00000000000000000000000000000000000FF11 +:10E0100000000F0F000000FF00000F0F000000FFC6 +:10E02000FFFFF0F000000000000000000000000012 :10E0300000000000000000000000000000000000E0 :10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 :10E0600000000000000000000000000000000000B0 :10E0700000000000000000000000000000000000A0 :10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 +:10E0900000FF00000F0F000000FF00000F0F000046 +:10E0A00000FFFFFFF0F00000000000000000000093 :10E0B0000000000000000000000000000000000060 :10E0C0000000000000000000000000000000000050 :10E0D0000000000000000000000000000000000040 :10E0E0000000000000000000000000000000000030 :10E0F0000000000000000000000000000000000020 :10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000000000FF -:10E1200000000000000000000000000000000000EF +:10E11000030203380C0092C003E3033E0C0D92C0CF +:10E12000038203380C0082C00000000000000000E1 :10E1300000000000000000000000000000000000DF :10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000000BF -:10E1600000000000000000000000000000000000AF +:10E150000000000000000000000005610A0E050D2F +:10E1600000A005610A0F050D00A0000000000000DE :10E17000000000000000000000000000000000009F :10E18000000000000000000000000000000000008F -:10E19000000000000000000000000000000000007F +:10E19000000000000000000000000000004000003F :10E1A000000000000000000000000000000000006F :10E1B000000000000000000000000000000000005F :10E1C000000000000000000000000000000000004F @@ -167497,15 +167497,15 @@ :10E1F000000000000000000000000000000000001F :10E20000000000000000000000000000000000000E :10E2100000000000000000000000000000000000FE -:10E2200000000000000000000000000000000000EE +:10E2200000010000000000000000000000000000ED :10E2300000000000000000000000000000000000DE :10E2400000000000000000000000000000000000CE :10E2500000000000000000000000000000000000BE :10E2600000000000000000000000000000000000AE :10E27000000000000000000000000000000000009E :10E28000000000000000000000000000000000008E -:10E29000000000000000000000000000000000007E -:10E2A000000000000000000000000000000000006E +:10E290000000000000000000000000000000F5C5C4 +:10E2A000A2A2C300C30000000000000000000000A4 :10E2B000000000000000000000000000000000005E :10E2C000000000000000000000000000000000004E :10E2D000000000000000000000000000000000003E @@ -167513,19 +167513,19 @@ :10E2F000000000000000000000000000000000001E :10E30000000000000000000000000000000000000D :10E3100000000000000000000000000000000000FD -:10E3200000000000000000000000000000000000ED +:10E32000B080F7F7C300C300000000000000000049 :10E3300000000000000000000000000000000000DD :10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD -:10E3600000000000000000000000000000000000AD +:10E36000000080000000000000000000000000002D :10E37000000000000000000000000000000000009D -:10E38000000000000000000000000010000000007D +:10E38000000000000000000000000000000000008D :10E39000000000000000000000000000000000007D -:10E3A000000000000000000000000010000000005D +:10E3A000000000000000000000000000000000006D :10E3B000000000000000000000000000000000005D :10E3C000000000000000000000000000000000004D -:10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D +:10E3D0000000000500000004000000000000000034 +:10E3E000000000000000100000000000000000001D :10E3F000000000000000000000000000000000001D :10E40000000000000000000000000000000000000C :10E4100000000000000000000000000000000000FC @@ -167533,7 +167533,7 @@ :10E4300000000000000000000000000000000000DC :10E4400000000000000000000000000000000000CC :10E4500000000000000000000000000000000000BC -:10E4600000000000000000000000000000000000AC +:10E46000000000000000000000000000000010009C :10E47000000000000000000000000000000000009C :10E48000000000000000000000000000000000008C :10E49000000000000000000000000000000000007C @@ -167545,28 +167545,28 @@ :10E4F000000000000000000000000000000000001C :10E50000000000000000000000000000000000000B :10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB +:10E52000000000900000000000000000000000005B :10E5300000000000000000000000000000000000DB :10E5400000000000000000000000000000000000CB :10E5500000000000000000000000000000000000BB :10E5600000000000000000000000000000000000AB :10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B +:10E580000000000000080000000000000000000083 :10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000C0000000AB +:10E5A000000000000000000000000000000000006B :10E5B000000000000000000000000000000000005B -:10E5C00000000000000090000000000000000000BB -:10E5D000C0008800000000000000000000000000F3 -:10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000001B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E0000000000000000000000000080000000023 +:10E5F0000000040004000000000000000000000013 :10E60000000000000000000000000000000000000A :10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000000000EA -:10E6300000000000000000000000000000000000DA +:10E6200000000000000000004000000000000000AA +:10E6300005000000000000000000000000000000D5 :10E6400000000000000000000000000000000000CA :10E6500000000000000000000000000000000000BA -:10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000000000000009A +:10E6600000000000000000000000000000080000A2 +:10E670000000000000000084000000000000000016 :10E68000000000000000000000000000000000008A :10E69000000000000000000000000000000000007A :10E6A000000000000000000000000000000000006A @@ -167574,7 +167574,7 @@ :10E6C000000000000000000000000000000000004A :10E6D000000000000000000000000000000000003A :10E6E000000000000000000000000000000000002A -:10E6F000000000000000000000000000000000001A +:10E6F00000000000000000000000000000004000DA :10E700000000000000000000000000000000000009 :10E7100000000000000000000000000000000000F9 :10E7200000000000000000000000000000000000E9 @@ -167585,21 +167585,21 @@ :10E770000000000000000000000000000000000099 :10E780000000000000000000000000000000000089 :10E790000000000000000000000000000000000079 -:10E7A0000000000000000000000000000000040065 +:10E7A0000000000000000000000000000000000069 :10E7B0000000000000000000000000000000000059 :10E7C0000000000000000000000000000000000049 -:10E7D00000009000000000000000000000000000A9 +:10E7D0000000000000000000000000000000000039 :10E7E0000000000000000000000000000000000029 :10E7F0000000000000000000000000000000000019 :10E800000000000000000000000000000000000008 :10E8100000000000000000000000000000000000F8 -:10E8200000000000000000000000000000000000E8 -:10E8300000000000000000000000000000000000D8 +:10E8200000000000000000000000000000000400E4 +:10E8300000000000100000001000000000000000B8 :10E8400000000000000000000000000000000000C8 -:10E8500000000000000000000000000000000000B8 +:10E8500000000000000000000000000000040000B4 :10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 -:10E880000000000000000000000000000000000088 +:10E8700000000000000000200008002000200084AC +:10E880000000008400A00000000000000000000064 :10E890000000000000000000000000000000000078 :10E8A0000000000000000000000000000000000068 :10E8B0000000000000000000000000000000000058 @@ -167714,32 +167714,32 @@ :10EF80000000000000000000000000000000000081 :10EF90000000000000000000000000000000000071 :10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC000000000000000000000000000000200003F -:10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 -:10F0200000000000000000000000000000000000E0 +:10EFB00088000000000000000000000000000000C9 +:10EFC0002000000000000000000000000000000021 +:10EFD0002000000000000000000000000000000011 +:10EFE0002000000000000000000000000000000001 +:10EFF00000002000000000000000000000000000F1 +:10F0000000002000000000000000000000000000E0 +:10F0100000002000000000000000000000000000D0 +:10F0200000002000000000000000000000000000C0 :10F0300000000000000000000000000000000000D0 -:10F0400000000000000000000000000000000000C0 +:10F0400000000000000000000000100000000000B0 :10F0500000000000000000000000000000000000B0 -:10F060000000000000000000000010000000000090 +:10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 -:10F08000000000020000000000000000004000003E -:10F090000000000000000000000000000000004030 -:10F0A0000040000000000000000000000000000020 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 :10F0B0000000000000000000000000000000000050 -:10F0C000000000000200000000000000000000003E +:10F0C0000000000002000000000008000000000036 :10F0D0000000000000000000000000000000000030 -:10F0E000000000000210000000000000000000000E +:10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 -:10F1000000000000000002100000000000000000ED +:10F1000000000000000000000000000000000000FF :10F1100000000000000000000000000000000000EF -:10F1200000000000000002100000000000000000CD +:10F1200000000000000000100000000000000000CF :10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000000000000000BF +:10F1400000820000008200000000000000000000BB :10F1500000000000000000000000000000000000AF :10F16000000000000000000000000000000000009F :10F17000000000000000000000000000000000008F @@ -167748,20 +167748,20 @@ :10F1A000000000000000000000000000000000005F :10F1B000000000000000000000000000000000004F :10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F -:10F1E000040000000000000000000000000000001B -:10F1F00000000000000000001000000000000000FF -:10F2000010000000000000000000000000000000EE +:10F1D000000000000000900000000000000000009F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE :10F2100000000000000000000000000000000000EE :10F2200000000000000000000000000000000000DE :10F2300000000000000000000000000000000000CE :10F2400000000000000000000000000000000000BE -:10F2500000000000000000000000000000000000AE +:10F25000000000000000000011000000000000009D :10F26000000000000000000000000000000000009E :10F27000000000000000000000000000000000008E :10F28000000000000000000000000000000000007E :10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000000005E +:10F2A000000000000000000000000000040000005A :10F2B000000000000000000000000000000000004E :10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E @@ -167771,13 +167771,13 @@ :10F3100000000000000000000000000000000000ED :10F3200000000000000000000000000000000000DD :10F3300000000000000000000000000000000000CD -:10F3400000000000000000000000000000000000BD +:10F3400000000000000000000800000000000000B5 :10F3500000000000000000000000000000000000AD :10F36000000000000000000000000000000000009D :10F37000000000000000000000000000000000008D :10F38000000000000000000000000000000000007D -:10F39000000000000000000000000000000000006D -:10F3A000000000000000000000000000000000005D +:10F39000020000000000000000000000000000006B +:10F3A0000400000000000000000000000000000059 :10F3B000000000000000000000000000000000004D :10F3C000000000000000000000000000000000003D :10F3D000000000000000000000000000000000002D @@ -167791,7 +167791,7 @@ :10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C :10F47000000000000000000000000000000000008C -:10F480000020000000200000000004000000000038 +:10F48000000000000000000000000000000000007C :10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C :10F4B000000000000000000000000000000000004C @@ -167960,47 +167960,47 @@ :10FEE0000000000000000000000000000000000012 :10FEF0000000000000000000000000000000000002 :10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000000000000000E1 +:10FF100000000000000000000000000000000002DF :10FF200000000000000000000000000000000000D1 :10FF300000000000000000000000000000000000C1 -:10FF400000000000000000000000000000000000B1 -:10FF500000000000000000000000000000000000A1 -:10FF6000000000000000000000000000000200008F -:10FF7000000200000000000000000000000000007F -:10FF8000000000000000000000020000000000006F +:10FF4000000000000000840000000000000000002D +:10FF5000000000020000840000000000000000001B +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF80000502000021000000000000000000000049 :10FF90000000000000000000000000000000000061 -:10FFA000000000000000000000000000000000024F -:10FFB0000000000000000000000000000000000041 +:10FFA0000000000000000000000000000000000051 +:10FFB000000000000000000000000000000200003F :10FFC0000000000000000000000000000000000031 -:10FFD0000000000000000000000000000000000021 +:10FFD000000000020000000000000000000000001F :10FFE0000000000000000000000000000000000011 :10FFF0000000000000000000000000000000000001 :020000040029D1 -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000200000000000000DE +:1000000000000000080000000000000008000000E0 +:1000100002000000000000000000000000000000DE :1000200000000000000000000000000000000000D0 :1000300000000000000000000000000000000000C0 :1000400000000000000000000000000000000000B0 :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:10009000000002000000000000000000000000005E +:100080000000000000008000000000000000800070 +:100090000000000000000000000000000000000060 :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 +:1000D000000000000200000000000000000000001E +:1000E000000000000200000000000000000000000E :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF +:10011000000084000000000000000000000000005B :1001200000000000000000000000000000000000CF :1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF +:1001400004000000000000000000000000000000AB :10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F +:100160000000000900000000000000000000000086 :10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F +:10018000000000000000000000820000008200006B :10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F @@ -168013,41 +168013,41 @@ :1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E +:100250000000000000000000000004000400040092 +:100260000500040001000100000000000000000083 :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E +:1002D000000000000000000000000000800080001E +:1002E0008000840080000400040000000000000082 :1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED -:1003100000000000000000000000000000000000DD +:1003000000000000000000000000000000004000AD +:100310000000400000000000000400000004000095 :1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D -:10036000000000000000000000000000000000008D +:100360000000000000000000040004000000820003 :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D -:10039000000000000000000000000000000000005D +:10039000000000000000000000000000002000003D :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D +:1003E000000000000000000000008000800000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC +:10041000000040000000000000000000000000009C :1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C +:100470000400040000000000000000000000000074 :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C @@ -168055,63 +168055,63 @@ :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C -:1004F00000000000000000000000000000000000FC +:1004F00000008000800000000000000000000000FC :1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB +:1005100000000000000000080010000800100004A7 +:1005200000020008000200000000000000000000BF :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB :10055000000000000000000000000000000000009B -:10056000000000000000000000000000000000008B -:10057000000000000000000000000000000000007B +:10056000000000000000000000C00090000000003B +:1005700000C000900000000000000000000000002B :10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B +:10059000000000000000000000000080000000805B +:1005A00000800080000000800000000000000000CB :1005B000000000000000000000000000000000003B :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B -:1005F00000000000000000000000000000000000FB +:1005E000000000000000000000000080008000000B +:1005F00000000080008000000000000000000000FB :1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA :10065000000000000000000000000000000000009A -:10066000000000000000000000000000000000008A -:10067000000000000000000000000000000000007A +:10066000000000000000000000008000000080008A +:1006700000008080000080000000808000000000FA :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000000000000000000000000FA +:1006E000000000000000000000000000900000007A +:1006F00082000000C090000082000000C090000056 :1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 +:100710000000000000000000000000000000820057 +:1007200000000000900040000000200008000000D1 :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 +:1007700000000000009000C000000000009000C0D9 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 +:1007A00000000000000000008000000000000000C9 :1007B0000000000000000000000000000000000039 :1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000000000000F9 -:1008000000000000000000000000000000000000E8 +:1007F0000000000000000080008000000000008079 +:100800000080000000000000000000000000000068 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 +:100860000000000000000000000000000000000286 +:100870000000000080118008000000008011800846 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 @@ -168119,32 +168119,32 @@ :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 +:1008F000000000000000C001200100000000C00155 +:1009000020010000000000000000000000000000C6 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 +:100970000000000007000000000000000700000069 +:100980000000000007000000000000000000000060 :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 +:1009F00000000000000000000000FF000000FF00F9 +:100A00000000FF000000FF000000000000000000E8 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 :100A50000000000000000000000000000000000096 :100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 +:100A7000000000000000000000000000FF00000077 +:100A8000FF000000FF000000FF0000000000000069 :100A90000000000000000000000000000000000056 :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 @@ -168154,30 +168154,30 @@ :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 +:100B200000000000000000000000000000001000B5 +:100B30000000000000004F4F0F0F000000000000F9 :100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 :100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 +:100B70000000000000000000000000000000FFFF77 +:100B8000000000FF00000F0F000000FF00000F0F2B :100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 +:100BB000D3DBDB9900000000280A000000000000E1 :100BC0000000000000000000000000000000000025 :100BD0000000000000000000000000000000000015 :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 +:100C0000FFFF000000FF00000F0F000000FF0000CA +:100C10000F0F0000000000000000000000000000B6 :100C200000000000000000000000000000000000C4 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 :100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 +:100C7000000000000000000000000000000000086C +:100C8000000010C0038203080C0092C00382030816 +:100C90000C0092C0000000000000000000000000F6 :100CA0000000000000000000000000000000000044 :100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 @@ -168217,21 +168217,21 @@ :100EE0000000000000000000000000000000000002 :100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000002CF -:100F200000000000000000000002000000000000BF -:100F300000000002000000000000000000000000AF -:100F4000000000000000000000000002000000009F -:100F50000000000000000000000040000000000051 -:100F60000000000040000002000200020002000237 -:100F7000000000020000000040020000000000002D -:100F800000000000000000000000400040000040A1 -:100F90000000000000000000000000000000000051 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F9000000000000000000000000000000000024F :100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC000000000000000000000000000000002100F -:100FD0000000000000000000000000000000000011 +:100FB000000000000000000000000000000002002F +:100FC0000000000000000000000000000000000021 +:100FD000020002000000000000000000000000000D :100FE0000000000000000000000000000000000001 -:100FF00000100000000000000000000000000000E1 +:100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 :1010100000100000000000000000000000000000C0 :1010200000000000000000000000000000000000C0 @@ -168250,15 +168250,15 @@ :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF :1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF +:1011200000000100000000000000000000000000BE :1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F +:10114000000000000000000000000500000000009A :10115000000000000000000000000000000000008F :10116000000000000000000000000000000000007F :10117000000000000000000000000000000000006F :10118000000000000000000000000000000000005F :10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F +:1011A00000000000400000000000000000000000FF :1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F :1011D000000000000000000000000000000000000F @@ -168282,15 +168282,15 @@ :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD +:10132000000000000000000000000080000000003D :1013300000000000000000000000000000000000AD :10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D +:101350000000050000000000000000000000000088 :10136000000000000000000000000000000000007D :10137000000000000000000000000000000000006D :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D +:1013A00000000000008400000000000000020000B7 :1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D :1013D000000000000000000000000000000000000D @@ -168298,7 +168298,7 @@ :1013F00000000000000000000000000000000000ED :1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC +:10142000000000000000000000000000000040027A :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C @@ -168307,7 +168307,7 @@ :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C :1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C +:1014B000000100000000000000000000000000002B :1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C :1014E00000000000000000000000000000000000FC @@ -168331,7 +168331,7 @@ :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA +:10163000000000000000000080000000000000002A :10164000000000000000000000000000000000009A :10165000000000000000000000000000000000008A :10166000000000000000000000000000000000007A @@ -168339,7 +168339,7 @@ :10168000000000000000000000000000000000005A :10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A -:1016B000000000000000000000000000000000002A +:1016B00000000000000000000000C000000000006A :1016C000000000000000000000000000000000001A :1016D000000000000000000000000000000000000A :1016E00000000000000000000000000000000000FA @@ -168363,16 +168363,16 @@ :1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 +:10183000000000000000000000000000000900009F +:101840000003000000000000000000000000000095 :101850000000000000000000000000000000000088 :101860000000000000000000000000000000000078 :101870000000000000000000000000000000000068 :101880000000000000000000000000000000000058 :101890000000000000000000000000000000000048 :1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 +:1018B0000000000000000000000000000000000127 +:1018C0000000000100000000000000000000000017 :1018D0000000000000000000000000000000000008 :1018E00000000000000000000000000000000000F8 :1018F00000000000000000000000000000000000E8 @@ -168404,7 +168404,7 @@ :101A90000000000000000000000000000000000046 :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 +:101AC0000000000000000000FFFF00000000000018 :101AD0000000000000000000000000000000000006 :101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 @@ -168412,7 +168412,7 @@ :101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 +:101B400000000000000000000000FFFF0000000097 :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 :101B70000000000000000000000000000000000065 @@ -168420,7 +168420,7 @@ :101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 +:101BC000000000000000000000610006000D120689 :101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 :101BF00000000000000000000000000000000000E5 @@ -168445,7 +168445,7 @@ :101D200000000000000000000000000000000000B3 :101D300000000000000000000000000000000000A3 :101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 +:101D5000000055555555000000000000000000002F :101D60000000000000000000000000000000000073 :101D70000000000000000000000000000000000063 :101D80000000000000000000000000000000000053 @@ -168453,23 +168453,23 @@ :101DA0000000000000000000000000000000000033 :101DB0000000000000000000000000000000000023 :101DC0000000000000000000000000000000000013 -:101DD00000000000000000000000000000040000FF -:101DE00000000000000000000000000000000000F3 +:101DD00000000000555555550000000000000000AF +:101DE00000000000000000000000200000000000D3 :101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 +:101E000000000000000000000000200000000000B2 :101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 +:101E20000000000000000000000000002000000092 :101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 +:101E40000000000000000000000000004000000052 +:101E5000000000000000000004000000000000007E :101E60000000000000000000000000000000000072 :101E70000000000000000000000000000000000062 -:101E80000000000000020000000000000000000050 +:101E80000000000200000000000000000000000050 :101E90000000000000000000000000000000000042 :101EA0000000000000000000000000000000000032 :101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 +:101EC0000000000000000000000000000002000010 +:101ED00000020002000000000000000200000000FC :101EE00000000000000000000000000000000000F2 :101EF00000000000000000000000000000000000E2 :101F000000000000000000000000000000000000D1 @@ -168477,40 +168477,40 @@ :101F200000000000000000000000000000000000B1 :101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 +:101F50000000000000100000000000100000000061 :101F60000000000000000000000000000000000071 :101F70000000000000000000000000000000000061 :101F80000000000000000000000000000000000051 -:101F9000000000000000000000000000040000003D +:101F90000000000000000000000000000000000041 :101FA0000000000000000000000000000000000031 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 :101FD0000000000000000000000000000000000001 :101FE00000000000000000000000000000000000F1 :101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 +:10200000400000004000000000000000040000004C +:1020100004000000000000000000000000000000BC :1020200000000000000000000000000000000000B0 :1020300000000000000000000000000000000000A0 :102040000000000000000000000000000000000090 :102050000000000000000000000000000000000080 :102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 +:10207000000000000000000000000000000004005C :102080000000000000000000000000000000000050 :102090000000000000000000000000000000000040 :1020A0000000000000000000000000000000000030 :1020B0000000000000000000000000000000000020 :1020C0000000000000000000000000000000000010 :1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 +:1020E0000000000000200000002000200000000090 :1020F00000000000000000000000000000000000E0 :1021000000000000000000000000000000000000CF :1021100000000000000000000000000000000000BF :1021200000000000000000000000000000000000AF :10213000000000000000000000000000000000009F :10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F +:102150000000000000000000080000000000000077 +:10216000000000000000000100000001000100006C :10217000000000000000000000000000000000005F :10218000000000000000000000000000000000004F :10219000000000000000000000000000000000003F @@ -168534,7 +168534,7 @@ :1022B000000000000000000000000000000000001E :1022C000000000000000000000000000000000000E :1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE +:1022E000000000000000000000000000000000806E :1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD :1023100000000000000000000000000000000000BD @@ -168543,7 +168543,7 @@ :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D :10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D +:10237000002000000000000000000000000000003D :10238000000000000000000000000000000000004D :10239000000000000000000000000000000000003D :1023A000000000000000000000000000000000002D @@ -168551,15 +168551,15 @@ :1023C000000000000000000000000000000000000D :1023D00000000000000000000000000000000000FD :1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD +:1023F00000C000900000000000000000000000008D :1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC -:10243000000000000000000000000000000000009C +:10243000000100000000000000000000000000009B :10244000000000000000000000000000000000008C :10245000000000000000000000000000000000007C :10246000000000000000000000000000000000006C -:10247000000000000000000000000000000000005C +:10247000000000800080000000000000000000005C :10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C :1024A000000000000000000000000000000000002C @@ -168567,7 +168567,7 @@ :1024C000000000000000000000000000000000000C :1024D00000000000000000000000000000000000FC :1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC +:1024F000000000000000800000008080000000005C :1025000000000000000000000000000000000000CB :1025100000000000000000000000000000000000BB :1025200000000000000000000000000000000000AB @@ -168575,7 +168575,7 @@ :10254000000000000000000000000000000000008B :10255000000000000000000000000000000000007B :10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B +:10257000000000000000000082000000C090000089 :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B @@ -168583,7 +168583,7 @@ :1025C000000000000000000000000000000000000B :1025D00000000000000000000000000000000000FB :1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB +:1025F000000000000000000000000000009000C08B :1026000000000000000000000000000000000000CA :1026100000000000000000000000000000000000BA :1026200000000000000000000000000000000000AA @@ -168591,15 +168591,15 @@ :10264000000000000000000000000000000000008A :10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A -:10267000000000000000000000000000000000005A -:10268000000000000000000000000000000000004A +:1026700000000000000000000000000000000080DA +:1026800000800000000000000000000000000000CA :10269000000000000000000000000000000000003A :1026A000000000000000000000000000000000002A :1026B000000000000000000000000000000000001A :1026C000000000000000000000000000000000000A :1026D00000000000000000000000000000000000FA :1026E00000000000000000000000000000000000EA -:1026F00000000000000000000000000000000000DA +:1026F0000000000000000000000000008011804089 :1027000000000000000000000000000000000000C9 :1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 @@ -168607,8 +168607,8 @@ :102740000000000000000000000000000000000089 :102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 +:102770000000000000000000000000000000C00198 +:102780002000000000000000000000000000000029 :102790000000000000000000000000000000000039 :1027A0000000000000000000000000000000000029 :1027B0000000000000000000000000000000000019 @@ -168616,7 +168616,7 @@ :1027D00000000000000000000000000000000000F9 :1027E00000000000000000000000000000000000E9 :1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 +:1028000000060000060000000000000000000000BC :1028100000000000000000000000000000000000B8 :1028200000000000000000000000000000000000A8 :102830000000000000000000000000000000000098 @@ -168624,7 +168624,7 @@ :102850000000000000000000000000000000000078 :102860000000000000000000000000000000000068 :102870000000000000000000000000000000000058 -:102880000000000000000000000000000000000048 +:102880000000FF000000FF0000000000000000004A :102890000000000000000000000000000000000038 :1028A0000000000000000000000000000000000028 :1028B0000000000000000000000000000000000018 @@ -168632,7 +168632,7 @@ :1028D00000000000000000000000000000000000F8 :1028E00000000000000000000000000000000000E8 :1028F00000000000000000000000000000000000D8 -:1029000000000000000000000000000000000000C7 +:1029000000000000FF000000FF00000000000000C9 :1029100000000000000000000000000000000000B7 :1029200000000000000000000000000000000000A7 :102930000000000000000000000000000000000097 @@ -168648,7 +168648,7 @@ :1029D00000000000000000000000000000000000F7 :1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 +:102A00000000000000000000000000FFFFFFF0F0E9 :102A100000000000000000000000000000000000B6 :102A200000000000000000000000000000000000A6 :102A30000000000000000000000000000000000096 @@ -168656,16 +168656,16 @@ :102A50000000000000000000000000000000000076 :102A60000000000000000000000000000000000066 :102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 +:102A800000000000000000000000000000FFFFFF49 +:102A9000F0F0000000000000000000000000000056 :102AA0000000000000000000000000000000000026 :102AB0000000000000000000000000000000000016 :102AC0000000000000000000000000000000000006 :102AD00000000000000000000000000000000000F6 :102AE00000000000000000000000000000000000E6 :102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 +:102B00000000000000000000000000000382033805 +:102B10000C0082C000000000000000000000000067 :102B200000000000000000000000000000000000A5 :102B30000000000000000000000000000000000095 :102B40000000000000000000000000000000000085 @@ -168711,25 +168711,25 @@ :102DC0000000000000000000000000000000000003 :102DD00000000000000000000000000000000000F3 :102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 +:102DF0000000000040000000000000000000000093 +:102E00004000000000000000000000000000000082 +:102E10000000000020000000000000000000000092 :102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 -:102E400000000002400000000000000040020000FE -:102E50000000000000000000000000000040000032 -:102E6000000010000002000000400000000200000E -:102E70000000000040004002000040000000000090 +:102E30000000000000000000000000000002000090 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 :102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 +:102E90000000000000000002000000000000000030 :102EA0000000000000000000000000000000000022 -:102EB0000000000000000000021000000000000000 +:102EB0000000000000000000020000000000000010 :102EC0000000000000000000000000000000000002 -:102ED00000000000000000000800000000000000EA +:102ED00000000000000000000000000000000000F2 :102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000021000000000C0 +:102EF00000000000000000000000001000000000C2 :102F000000000000000000000000000000000000C1 -:102F1000000000000000000000000210000000009F +:102F100000000000000000000000000000000000B1 :102F200000000000000000000000000000000000A1 :102F30000000000000000000000000000000000091 :102F40000000000000000000000000000000000081 @@ -168754,17 +168754,17 @@ :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 :103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 +:1030A000000000000000001100000000000000000F :1030B0000000000000000000000000000000000010 :1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 -:1030E00000400000000000000000000000000000A0 +:1030E00000000000000000000000000000000000E0 :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF :1031100000000000000000000000000000000000AF :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F +:10314000000000000000000000400000000000003F :10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F @@ -168801,7 +168801,7 @@ :10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D +:103390000000000000000000000000000500000028 :1033A000000000000000000000000000000000001D :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD @@ -168949,8 +168949,8202 @@ :103CA0000000000000000000000000000000000014 :103CB0000000000000000000000000000000000004 :103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000004000000000000E0 -:103CE00000000000000000040000000000000000D0 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000002000000000000000000000000A1 +:103D20000000000000000000000000000000008013 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000020000000000000000000041 +:103D800000900000000000000000000000000000A3 +:103D90000000000000000000000000000000000023 +:103DA000000000000000000000000000000400000F +:103DB0000040000000000000400000000000000083 +:103DC00000000000000000020002000000000000EF +:103DD00010000000000000000000000000000000D3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E300002000000004000400000000000000010F0 +:103E40000000000000100000000000000000000062 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E7000000400000000000000000200000000003C +:103E80000000000000000200000000000000000030 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000800000000001000100000000000080 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF0000000000000000000000040000000400042 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F4000000001000011000000030000000000005C +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC00000000000200000000000000000000000D1 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000400000000000000000000CD +:103FF0000000000000000000000000410000000080 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:10403000000000000000000000000000000001007F +:10404000000000000100000000000000000000006F +:1040500000000000000000000000000001000080DF +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C00004000000000020000000000000000000CC +:1040D00000000000000000000000000000002000C0 +:1040E00000040000000000000000000000000000CC +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:104140000000000000080000000000000000000364 +:1041500000000000000800030000900000080000BC +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000010000000000000000EE +:1041D00000000000000000000000000000000001DE +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000300006B +:104250000000000000090000000000000000000055 +:10426000000000000000000000040000200000002A +:104270000000080000000000000000000000000036 +:10428000000000000000000000000000000000002E +:1042900000000040000000000000000000000000DE +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00005000000000000000000000000000000D9 +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:1043400000000000000000900000000001000000DC +:10435000000000000000000000000000000000005D +:10436000000000000100000000000000000000004C +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C000000000000000000000800000000011005C +:1043D00021000000000000000000000000000000BC +:1043E000000000000000110021000000000000009B +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:1044400000000000000000000000008000110000DB +:104450000041090000090080000000000000000089 +:10446000000000000000000000410900000300807F +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000400000AC +:1044D0000002000101000000008800000000000050 +:1044E00000000000000000000000000301000000C8 +:1044F0000088000000000000000000000000000034 +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000089000000000880000000100000000003A +:1045600000000000000000000000000000008800C3 +:10457000000001000000000000000000000000003A +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000200E9 +:1045D000000080800000000000000000410000009A +:1045E00000000000000000000000000000000000CB +:1045F000000000004100000000000000000000007A +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:1046500000118000000000000000101100000000A8 +:10466000000000000000000000000000000000004A +:104670000000001100000000000000000000000029 +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000000000000000000000EA +:1046D0000000000120000088000000000001000030 +:1046E00000000000000000000000000000000000CA +:1046F00000000000000100000000000000000000B9 +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:10475000000000000000000007000000000000E072 +:104760000000814100000000000000000000000087 +:1047700000000000000000E0000081410000000097 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D0000000000000000000FF000000FF000000DB +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:1048500000000000000000000000FF000000FF005A +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:1049500000000000000000000000000000FF000058 +:10496000FFFF000000000000000000000000000049 +:104970000000000000000000000000000000000037 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D000000000000000000000000000000000FFD8 +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A600015002A00054000A800400006000C0000C8 +:104A70000000000000000000000000000000000036 +:104A800000400006000C00000000000000000000D4 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000000000D6 +:104AE000000000000000000000000000FF00FFFFC9 +:104AF00000000000000000000000000000000000B6 +:104B0000000000005555FFFF0000000000000000FD +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000000000000000000000000055 +:104B60000000000000000000000000000000FF0046 +:104B70000000000000000000000000000000000035 +:104B8000000000000000555500000000000000007B +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF0000000F0F0000000000000000000000000D5 +:104C000000000000000000000000F0F000000000C4 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C50000000000000000000000000000000000054 +:104C60000000000000000000000000000000000044 +:104C700000000000F0F00000000000000000000054 +:104C8000000000000000000000000000F0F0000044 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000000000400000000000A4 +:104CD00000020000000000000000000000000000D2 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D600040000000000000000000000040000000C3 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D900000000002010000000000410000000000CF +:104DA0000000000000000000000000000000000003 +:104DB00000000000000000000000000000000000F3 +:104DC00000000000004000000000000000000000A3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000001000000000000000000000B3 +:104DF00000000000000000000000000000000000B3 +:104E0000000000800184000000002000010001007B +:104E10000000008000000800000000008800000082 +:104E20000000000000000000000000000000000082 +:104E30000000000000000000000000000000000072 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000000032 +:104E80000000000000040421000000008000200059 +:104E900020000000000400080000000000000000E6 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000000000000000000F2 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000000000000000000000000C2 +:104EF00000000000000000000100000000000000B1 +:104F000000000000000000000000000000000000A1 +:104F10000000000000110000000000000000000080 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F70000000000000000000000020000000000011 +:104F8000000000000000000200000000000000001F +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00008000000000000000000000000000000E9 +:104FC00000000000000000000011000000000000D0 +:104FD00000000000000000000000000000000000D1 +:104FE0000000000000000000000000000000008041 +:104FF0000000000001001000080001000000000097 +:1050000000000000000000008200210020000000DD +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000040000030 +:105040000000000000000000000000000000000060 +:105050000040000000000000000000000000000010 +:105060000000000000000000000000000000000040 +:1050700000400000008404008000000020000000C8 +:10508000000000000000000000000000840080001C +:1050900000002100000000000000000000000000EF +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F0000000000000000020000000000000000090 +:105100000000000000000000000088008200000095 +:10511000000000000000000000000004400000004B +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000000000000000000005F +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F +:10517000000000000000000000010000000000002E +:105180000000008400000000008400000300000014 +:105190000000000000000000000000C000018000CE +:1051A000008400000000000000000000000000007B +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:1052000000000008000800000000000984020000FF +:105210008500000200000000000000008400000083 +:1052200000000080000000000000000003000000FB +:10523000000000000000000000000000000000006E +:10524000000000000000000000000300000000005B +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000008000800000000000000001E +:10528000000000000000000000000000000000001E +:105290000500080000000000000000000000000001 +:1052A00000000000030403000000010040000000B3 +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000002000000000000BC +:1052F000000000000000000000000000900000001E +:10530000000001000000000000000000000000009C +:10531000000090C0419041000090000041009000CA +:105320000000010140000101000040004000800039 +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000110080009C +:1053800000000000110021000000000000000000EB +:105390000000000020800300830000800300A100C3 +:1053A00041000000111000210310000580000008DA +:1053B00000020000000000000000000000000000EB +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:1054000000800000008000410900000900800000C9 +:10541000000000000000208021009100908000002A +:105420000500101109031080080010110800400049 +:10543000A0004085200000000000000000000000E7 +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:1054800000000020000000080089010000000088E2 +:10549000000000000000000090C0910041009188D1 +:1054A0000020000001010101014000000101010094 +:1054B00000010001000100010000000000000000E8 +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:105500000000010000888800000000008800000002 +:1055100001000000000000000000402100209089F0 +:1055200001880001000000000001000000000000F0 +:105530000000000200080008001000000000000049 +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:10558000000000004100008000000000000000005A +:10559000000041000000000000000000801000201A +:1055A0008010118000100005000300110000200091 +:1055B00020000000000000000000000000000000CB +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000000000000000000000BB +:1055F00000000000000000000000000000000000AB +:105600000000000000000011000000800000000009 +:1056100000110000000000000000000000004140F8 +:105620002121110020054100110020000010100070 +:10563000400040000003400088889090A0000000D7 +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:1056800000000000000000000001000000400000D9 +:105690000000000100000000000000000000000009 +:1056A0000120010201080000018800000000000143 +:1056B00001200000000000000000000000000000C9 +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000070092 +:105710008200000000E00000814100000000000065 +:10572000000000000060060084000000006000002F +:10573000000000000060000000000AFCFAFC00000D +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:10579000F0F0000000000000000000000000000029 +:1057A0000000000000000000838F000C00000000DB +:1057B0000000000000000000000000000A0CFA0CCD +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000000000000A9 +:105800000000000000000000000000000000000098 +:105810000000F0F0000000000000000000000000A8 +:1058200000000000000000000000838F000C00005A +:105830000000000000000000000000000000000068 +:105840000000FF55AA00000000000000000000005A +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:10589000000000000000FFFF00000000000000000A +:1058A00000000000000000003C3CFF3CAA0EAAB033 +:1058B00000000000000000000000000000000000E8 +:1058C000000000001E1E1E1E000000000000000060 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000000000000097 +:105910000000000000000000000000000000000087 +:1059200000000000000000000000000000C3000EA6 +:1059300000B00000000000000000000000000000B7 +:10594000000000610006000D0000000000000000E3 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000005000A00054000A800400006C5 +:1059A000000C000000000000000000000061500F2B +:1059B0000001000000610007000100000061000319 +:1059C00000050000000000003F3F0AFA0000000050 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20005555FFFF000000000000000000009EDF51 +:105A3000599A000A000A0A000A050D5D0808A5AA7D +:105A4000AAAA000000000000000030300AFA00009E +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA000000055550000000000000000000000004C +:105AB0009EDF599A151F151F0005F5FA08080D5DA0 +:105AC000A5AAAAAA00000000000000000000000033 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B2000000000000000F0F0000000000000000095 +:105B30000000000000000280028000000000AF0FA3 +:105B4000000FD278D070F000F000000000000000DC +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA0000000000000000000F0F000000000000015 +:105BB000000000000000000003C03FFC00000000E7 +:105BC000AF000000822880200000FF1400000000C9 +:105BD00000000000000000000000000000000000C5 +:105BE000000000000000008000000000C000000075 +:105BF000000000000082048000000080100000000F +:105C0000000000000000880000000000000000000C +:105C10000000000000001000000000004000000034 +:105C20000000000000000000880000008800000064 +:105C30000000000000040000000000000000000060 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000002000000000000014 +:105C70000000000000000002802000000020000062 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000800000000000800004 +:105CA00000004000000000000000000000000000B4 +:105CB00000000000000000000000000000000000E4 +:105CC00000020000000200020000000000000002CC +:105CD0000000000000004000000000000000000084 +:105CE0000000000000000000000040200000000054 +:105CF00088000000000000000000000240000000DA +:105D00000000000000000000000000000008040087 +:105D100000000000000000000000900040000010A3 +:105D2000001000000000000008000000200000003B +:105D3000000000000000000000000000040004005B +:105D4000040000000000000000000000000000004F +:105D500000000004000000008000000000000000BF +:105D600000000000000000000000000000850000AE +:105D700000820082009009000090000000898000ED +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000800083 +:105DA00000000000200000000000000000000000D3 +:105DB0000010000000000000000000000000800053 +:105DC000800080000008000000A000000008000023 +:105DD0000000000000080009000900080000002180 +:105DE0000000002100000000000000000000002072 +:105DF00000000021C0000000C000000000000020E2 +:105E00000000402000000000000000000000000032 +:105E10000000000000000000000000000000000082 +:105E2000000000000000000000000000000000086A +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000008800880000000032 +:105E60000000000000000000000000000000000032 +:105E70000001000000000000000000000000000021 +:105E80000001000080010000000000000000000090 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB000000000000000030041002100000000007D +:105EC0000800000000000800000021080900000090 +:105ED00000000000000000000000000004000000BE +:105EE00000000000000000000800000082000041E7 +:105EF000000004000000000000000000000000009E +:105F0000000083800000048000000000000000000A +:105F10000000820000008200000008000000000075 +:105F20000000002108000000820082000000000044 +:105F30000000000008000000820082000000000055 +:105F4000000090000000000084000000000000003D +:105F50000000000000000009000000080008000028 +:105F60000000000000000000000008000000000029 +:105F70000000000090000000100000001100000070 +:105F800000000000402000008020000000200000F1 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000008000000030000000000D6 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000011002100009000000000FF +:105FE00000000000000000110000000000000000A0 +:105FF000000000000000100000001000040000007D +:106000000800000000008400000000000000000004 +:106010000000000000000000000000000000000080 +:106020000000000000000000080000200000000048 +:106030000000000000000000080000000000000058 +:10604000A00004000400040005000100008082009C +:1060500000000000000000000800000000800000B8 +:10606000000011880088000000000000000000000F +:106070000000000000000000000000000000000020 +:106080000000800000000000000000000000000090 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000080000000000840000000000840000D0 +:1060C000000000000000000008008400040003201D +:1060D0000000210400004100030008000000084007 +:1060E00000000005000300000000000800000000A0 +:1060F000000000000000000000000180000000001F +:10610000C0000000C0000000000000A0000001204E +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:1061300000000000000000080000000082000000D5 +:106140000002C000A0000002000000008200000069 +:1061500000000000000040000000000000000000FF +:1061600000000000000000000000000000A000008F +:1061700000000000000000000000000004200000FB +:10618000100000000000000000840000002100005A +:1061900004010000000000000000000000000000FA +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000300CC +:1061D00000000300000000000000000000000000BC +:1061E0000000000000000100A0000000000000000E +:1061F00000000000000000000000000000A000906F +:1062000000900090402000A0004090088808914134 +:10621000838882850000000000000000000000006C +:10622000000000000003000000000000000001006A +:106230000000080000000000000000000000000056 +:1062400000000000000000000000000000000290BC +:10625000A0900000829000000000000000000040BC +:106260000082008400020000030000000000000023 +:10627000000000000000000000000000000010808E +:1062800000800000000000000000000000800041CD +:10629000A121908880830000000000000000000021 +:1062A00000000000000000000000000000000000EE +:1062B00041081040800800080000000000000000B5 +:1062C00000000000000000000000000000000000CE +:1062D000800080800000808000000000000000003E +:1062E00000000000008000800000000000000000AE +:1062F000000000000000000000000000000000009E +:1063000000000021000000008000800000088000E4 +:1063100020801111858489880000000000000000A1 +:10632000000000000000000000000000000000006D +:1063300000001080400041004140000000000000CB +:10634000000000000000000000000000000000004D +:10635000000080800091808080910000000000009B +:1063600000000000000300800000000000000000AA +:106370000084000000000000000000000000000099 +:10638000000000000000008400000200400008013E +:10639000080008042101A08403910000000000000F +:1063A00000000000000000000000000000000000ED +:1063B00000000000011000000000010000000000CB +:1063C00000000000000000000000000000000000CD +:1063D00000000000020240050284909100000000CD +:1063E00000000000000000A10004004000010001C6 +:1063F000000100000000000000000000000000009C +:1064000000000000900000000000880010900008CC +:10641000002082A002040040C1040220000000000D +:10642000000000000000000000000000000000006C +:106430000000000000000001000001000001000059 +:10644000000000000000000000000000000000004C +:1064500000000000000004020002909040A0000034 +:10646000000000000000C0000000A000C1000010FB +:106470000008000800050000000000000000000007 +:10648000000000000000000000000000000000000C +:1064900000800000808080C140C0C180A00000005A +:1064A00000000000000000000000000000000000EC +:1064B0000000000000000000000920210504034046 +:1064C00000000000000000000000000000000000CC +:1064D000000000000000000080800080808000003C +:1064E00000000000000000008000000000004000EC +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:106510000000009000800000C14090008580104184 +:10652000000000000000000000000000000000006B +:1065300000000000000000000000214008002100D1 +:1065400020400000000000000000000000000000EB +:1065500000000000000000000000410808084000A2 +:1065600003000000000000000000800080008000A8 +:10657000800000000000000000000000000000009B +:106580000000000000000000000010000200880071 +:106590000200000000A100C00000054082900440FD +:1065A0008801000000000000000000000000000062 +:1065B00000000000000000000000000001030100D6 +:1065C00001000000000000000000000000000000CA +:1065D000000000000000000000000000400089886A +:1065E0002040400000000000000000004000820049 +:1065F0000200020000000000000000000000000097 +:10660000000000000000000000000000000000008A +:10661000060000000000000000000006000000006E +:106620000600004100000000000000000000000023 +:10663000000000000000000000000000000000005A +:1066400000000000840000000000000000000000C6 +:1066500000000000000000000000000000000081B9 +:106660000000060000000000000000000000000024 +:1066700000000000500000000000000000000000CA +:106680000000000000000000000000000000FF8D7E +:106690003C8D0000000000000000FF8FF080FF9F95 +:1066A000FF96F0F0CCF300000000000000000000B6 +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E0000000B9EF0000E77F00000000000000009C +:1066F000FF3C7FBC00000000000000000000000024 +:106700000000000000000000000000000000000089 +:10671000C38D008D00000000000000000F8F00807E +:1067200040D00000E0F0E0F00000000000000000B9 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 +:10676000000000004610000080180000000000003B +:106770000000FF3CFF3C00000000000000000000A3 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:1068100000000000F7FFFFFF00000000C2C30000FF +:1068200080808080DFFFFFFF000002020000000088 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000060A09050000048 +:1068700000000000000066FF95FF0000000000001F +:106880000000000000000000000000000000000008 +:10689000000000000000F7F7FFF700000000000014 +:1068A000000000003C00DFDBFFFF000200020000F0 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E000000000000000000000662442408080405C +:1068F000000000000000000066FF66FF00000000CE +:1069000000610006000D0000000000000000000013 +:106910000000000000000000000000000000000077 +:10692000000000000000000080610006000D000073 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000610006000DD3 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000610E3E000D6D +:1069700000000000000000000000000030000000E7 +:10698000000000000000AF30AF3F0000000000003A +:1069900000000000000000000000000000000000F7 +:1069A000000000000000000000000A0ADFDA020216 +:1069B00002020000000000000000000000000000D3 +:1069C0000000000000000000000000005541000031 +:1069D0000000008000000000000000000000000037 +:1069E00000000000000000000000000083AF2C0049 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000A030A03F00000000D7 +:106A10000000000000000000000000000000000076 +:106A20000000000000000000000000000A0A8F8A39 +:106A30000000000000000000000000000000000056 +:106A400000000000000000000000000000005040B6 +:106A50000000140000000000000000000000000022 +:106A60000000000000000000000000000000AFAFC8 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA0000000000000000000000000000000F0F006 +:106AB000F0F0000C000C00000000000000000000DE +:106AC00000000000000000000000000000000000C6 +:106AD000F3A2F3F32800400F0000000000000000C4 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000000065 +:106B3000F8F0F0F000000A0A000000000000000079 +:106B40000000000000000000000000000000000045 +:106B50000000F3F3F3F32800000000000000000041 +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000400000001 +:106B900000000000000000000000000040000000B5 +:106BA0000000000000000000000000008400000061 +:106BB0008400000001000000000000002000000030 +:106BC00000000000000000000000000000002000A5 +:106BD0000000200000004000000000000000200035 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000002000000000000000200055 +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 +:106C3000000400000000020000000000000000004E +:106C40000000000000000000400000000000000004 +:106C500000000000000040000000000000000000F4 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C800000000000000000000000000200000400FE +:106C900000000400000004000000000804000400DC +:106CA00000000000040000000000040000000000DC +:106CB00000000000000000001000001004000000B0 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF00000000000000040004000000010004000C4 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000008400840084050000008000410011 +:106D300000902088000400040000850010098000F5 +:106D40000000000000000000000000000000000043 +:106D5000000000000000000000000000000000082B +:106D6000000000000008000000000000000000001B +:106D70000008000000000000800080000000000803 +:106D8000800000000008000011000000000000006A +:106D9000040800080400008000000000000000005B +:106DA00000000000000000000021000000050000BD +:106DB0000085000000200004001100000005000014 +:106DC00000000000000000000000000000000000C3 +:106DD00000080000000000000000000000000000AB +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000400000000000000000000008100822 +:106E100000000000000080080020000000000000CA +:106E20000000000000000000000000004000000022 +:106E300040000010091040000000410200900000D6 +:106E400000000000000000080000008200000000B8 +:106E5000000000000000000003000000000005002A +:106E600000000000000000820000000000000000A0 +:106E7000000000000000000000000000080000000A +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00008000008000200000000080008000000C0 +:106EB0008200000900008400000000400000010082 +:106EC0000000001100000000400000000000000071 +:106ED00000000000000000000000000000000000B2 +:106EE000000000000008A0000000000000000000FA +:106EF0000000000000000000000000000000000092 +:106F00000000000000080000000000000000000079 +:106F10000000000000000000000000000000000071 +:106F20000000000000000001000000000000000060 +:106F3000000000000000000000820000000100C00E +:106F4000020000000000000000000000000000003F +:106F50000000000000000010000000000000000021 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F90000000000000000000000000800000000071 +:106FA00001000000000000000000000000000800D8 +:106FB0000000400088000000018000000000820006 +:106FC000C0000080008000200021000000000000C0 +:106FD00000000000000000040000000000000000AD +:106FE00000000000000000000000000000000000A1 +:106FF00000000000000000000000821000000800F7 +:107000000000080000000000000000000000000078 +:107010000000000000000000000000000020000050 +:107020000008040800000400000000000000000048 +:107030000000000000020300090002020000080036 +:107040000904030000100310000000040000000009 +:107050000000000000000000000000000000000030 +:1070600000000000000000000000002021000000DF +:107070000000000000000000000000000000000010 +:1070800000000000000000000000000440000000BC +:1070900010000000000000000000000000000000E0 +:1070A000400000000021000000000000000000007F +:1070B0000000000000000000000088000000000048 +:1070C000004100000041000000000000000000003E +:1070D00000020000000000000000000000000000AE +:1070E0000000000000000800000000000000000098 +:1070F0000000000000000000000000000000000090 +:107100000000080000004000002100000000000016 +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000002004D +:1071400000000000000000000000000000880000B7 +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000050000000000EA +:1071A000000000C000900000000000000000C000CF +:1071B0000000000000000000000008822088C008D5 +:1071C000888200000000000000001010884083202A +:1071D000C0200000000000000000000000000000CF +:1071E000000000010000000000000000000000009E +:1071F000000000000000000000000000000000008F +:10720000000000000000000002000000000100007B +:1072100088000001000000000000000000000000E5 +:107220000000000000800080000000000000050059 +:107230000000000000000000000000000800A100A5 +:107240000000008000000000000000009100A1800C +:10725000900080000000000000000000000000001E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:10728000000000000000000010008000000000204E +:1072900005050003001000000000000000000000D1 +:1072A000000000000000000000008000808000005E +:1072B00000000000000000000000000000000000CE +:1072C000008000808000000000020080000080003C +:1072D000004100A1808000000000000000000000CC +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:107320000000000000000000000000008400C09089 +:10733000000000000000000000000000000000004D +:107340000800200888A0C000000000010004000020 +:10735000880088008403C0A0000000000000000036 +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A000000000000000000000000000000000904D +:1073B00000C000010000000100000000000000000B +:1073C0000000A090000200C002C000000000000009 +:1073D0000000C0900020C010C1C1000000000000EB +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000017B +:107410000001010000010000010100000000000067 +:10742000000000000000000000000000000000005C +:107430000080008000100002001000020000000028 +:107440000000000000080008004180A000000000CB +:1074500000000000804100040041A1C100000000C4 +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000009F3 +:107490000002000502030020020320100005000086 +:1074A000000000000000000000000000000080114B +:1074B000804000000000000000000000000000000C +:1074C00000000000000000108000000080000000AC +:1074D0000000800000008020000300000000000089 +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:10753000C00120000000000000000000000000006A +:107540000000000000000000000188A000C008004A +:10755000C00004000200820040002001889040002A +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000006000006000000000000000000BF +:1075C00000000000000000000000000600000600AF +:1075D00000000000000000000000600000600600E5 +:1075E0005006000000000000000000000000000045 +:1075F000000000000000000000000000000000008B +:10760000000000000000000000000000000000007A +:10761000000000000000000000000000000000006A +:10762000000000000000000000000000000000005A +:1076300000000000000000FF000000FF000000004C +:10764000000000000000000000000000BE82BE82BA +:107650003C7C55FF00AA14AA00000000AFAB050156 +:10766000000A03030000000000000000000000000A +:10767000000000000000000000000000000000000A +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B000000000000000000000FF000000FF0000CC +:1076C0000000000000000000000000000000BE827A +:1076D000BE823C7C05AF08AA08AA00000000FFFF9C +:1076E00055550008030300000000000000000000E2 +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 +:107730000000000000000000FF00000000FFFFFF4D +:107740000000000000000000000000000000000039 +:107750000E0E3EFE3535000A00000000000000005D +:1077600055FFFDFFF0F0FF3C0000000000000000AE +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000FF00000000FFCB +:1077C000FFFF0000000000000000000000000000BB +:1077D00000000202020201013A3A0000000000002B +:1077E000000000AAA8AA000000000000000000009D +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000382033888 +:107840000C0082C000610006000D00000000000076 +:107850000000000000613036020D000580000000CD +:10786000000000000061000FC09C00A500000000A7 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:107890000000000000000000000000000000006187 +:1078A0000006000D000000610006000D0000000051 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000F00000CE0000FA +:1078D0000000000000000000000055555555000054 +:1078E0000000000000000000000041410FCF000038 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 +:107910000000000000000000000000000000000067 +:1079200000000000FFFF5FF700000000DFDFFF3F07 +:107930000000000000000000000000000000000047 +:10794000000000000000000000000000F00000CA7D +:10795000000000000000000000000000FFFF3FFFEB +:1079600000000000000000000000000041410F0F77 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A000000000000000FFFFFFF700000000FFFFE5 +:1079B000FFFF0000000000000000000000000000C9 +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000000000000000000A7 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A2000000000000000000000000000FFFFFAFF5F +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA0000000000000000000000000000000F3FFE4 +:107AB000FFFF0000000000000000000000000000C8 +:107AC00000000000000000000400000000000002B0 +:107AD00000000000000000020000000000000000A4 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 +:107B00000000000000000002000000000000000073 +:107B10000000000000000000000000000000000065 +:107B20000000000000000000400000000000000015 +:107B300000000000000000008880008000000008B5 +:107B400000000000820000000000000000000000B3 +:107B500000002000000020000000000000000000E5 +:107B60000000000000000000000200000000000013 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000040000000B5 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000800080000B5 +:107BC0000001000800000000000004000000100890 +:107BD0001000000000000000100010000000000075 +:107BE0000000010000000000000000000000000094 +:107BF0000008000000000000000000000000000875 +:107C0000000000000000001000000000000800005C +:107C1000000800000000000000000000000000005C +:107C2000000000081000000000001000000000002C +:107C30001008100000000000000000008820040070 +:107C40000088102000000000000000080002000270 +:107C500000080008000000000000200800080000E4 +:107C6000000400000200000000000004000000000A +:107C70000008000800000000000000840008000068 +:107C800000000000000800000008001000000000D4 +:107C900000000008000800000000000800000008C4 +:107CA0000000000800000040000000080008000874 +:107CB0000000000800080000000000080000008527 +:107CC000800000080009000800000008000800000B +:107CD000000000000008000000000000000000009C +:107CE0000000000000000000000000000000000094 +:107CF0000000C0000000040300008210000000002B +:107D0000000000000041000000000000000800002A +:107D10000000000000000008840000004000100087 +:107D20000000000000000000000000000000000053 +:107D3000000000000000000800804000A0000000DB +:107D40000100000010000000000000000000010021 +:107D50000000000000000000000000000000000023 +:107D600000002100000003004000000000000000AF +:107D70000084080005004100800000000000004071 +:107D800000000000000400000000000000000000EF +:107D900000004100000000000000000000000000A2 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000002000000000A3 +:107DC0000000200000000000000000000000000093 +:107DD000200000000000000004000000000000007F +:107DE000000000000000000000000000001008007B +:107DF0000041000000000000000000000000000042 +:107E0000001100020000000000000000000000005F +:107E1000000000000000000000000000000400005E +:107E20000000000000000000000000000000000052 +:107E3000000000000400000000000000000000201E +:107E400000000000002100000020010000000000F0 +:107E50000100000000000000000000000000000021 +:107E600000000008000021000000000000000000E9 +:107E700000000008000000000000000000000000FA +:107E8000000000A000000000040000A000000000AE +:107E900000000008000000000000000000000000DA +:107EA00000000000000000000000000000A000082A +:107EB00010000000000000000000000000000000B2 +:107EC00000010000000000000000000120A00008E8 +:107ED0000000200000A000000000000000000000E2 +:107EE000000000000000000000000000000040084A +:107EF00000000008040000110000880000200000BD +:107F00000000000000000000000000000011000060 +:107F10001000000000000000000000000000000051 +:107F20000000000000000000000000000000000051 +:107F30000000000000000008000000000000000039 +:107F40000000400001000080000000000000000070 +:107F50000008000000000003000000000000000016 +:107F60000000080000000800000000000000000001 +:107F70004040200000200800000002000000040033 +:107F8000400009040300024000000000000000005F +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC000000000001100040000200000000000007C +:107FD00000000001000000000000000000000000A0 +:107FE0000000000008000000000000000000000089 +:107FF000200000000000000000000000000000055C +:108000000021002000000008000000000000000027 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000008000038 +:108040001000000000000000000000000000000020 +:108050000000000000030000000000090000000014 +:108060000000000000000010000000000008008276 +:108070000000000000000000000000C00000000040 +:1080800000000000000100000300000000080000E4 +:1080900000000000000000000000000000000000E0 +:1080A000000000000000000000000000000000824E +:1080B0000000000000080084000000000000000034 +:1080C000000000000000000000000000000000822E +:1080D0000000000800080000000000000000000090 +:1080E0000000000000000000000000000000000090 +:1080F000000000000000101000100008C008000080 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000035C +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000C0009000000000DF +:1081500000C00090000000000100000000000000CE +:10816000000000000000000000000000000000000F +:10817000000000000000000091800080008080006E +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000008000800000AF +:1081D0000000038000800000000911002100000061 +:1081E000000000000000000000000000000000008F +:1081F00000000000000000000000000000A180005E +:1082000000800000000000000000000000000000EE +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:1082400000000000000000000000000000008000AE +:108250000000808000098000111180800041090029 +:108260000009000000000000000000000000000005 +:10827000000000000000000000000000100002826A +:1082800040882008000000000000000000000000FE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000000AE +:1082D00082000000C090000082000100C0900001F8 +:1082E000010000000000000000000000000000008D +:1082F00000000000000000000000000000000490EA +:10830000002002081004000000000000000000002F +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:1083500000000000009000C000000200009101C079 +:108360000000880000000000000000000000000085 +:1083700000000000000000000000000000000000FD +:10838000000000800080008000000000000000006D +:1083900003000000000000000000000000000000DA +:1083A00000000000000000000000000000000000CD +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D0000000000000000080008000000000008815 +:1083E00008800000000000000900000000000000FC +:1083F000000000000000000000000000000000007D +:1084000000000041800080800000000000000000AB +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:108450000000000080080010000000008011911052 +:1084600000000000000000110000000000000000FB +:1084700000000000000000000000000000000000FC +:1084800000000000200110200808900000000000FB +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D0000000000000009000000100000000C0014A +:1084E0002101000000000000000100000000000069 +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000410A000020 +:1085100000000000000000820000060000000000D3 +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:108550000000000000000000008100000600000094 +:10856000004100E006000000000000E00000810083 +:1085700000000000000000000000000000000000FB +:10858000000000000000000009F909F94206429FBE +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D00000000000000000000000FFFF0000FF009E +:1085E0000000FF000000FF0000000000000000008D +:1085F000000000000000000000000000000000007B +:1086000000000000000000000000C0C0CFCFDB066B +:10861000DB9F0000000000000000000000000000E0 +:10862000000000000000000000000000000000004A +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000FFFF00001C +:10866000FF000000FF000000FF000000000000000D +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C00000000000000000000000000000000000AA +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000F30373 +:108710000909FFC300C300000000000000000000C2 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:10876000000000FF00000F0F000000FFFFFFF0F00F +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:10879000F303F9F999F099F00000000000000000DF +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000FF00000F0F000000FFFFFF6F +:1087F000F0F0000000000000000000000000000099 +:108800000000000000000000000000000000000068 +:1088100000000000000000C0000000000000000098 +:108820000000050000200000000000000000000023 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:1088600000000000030203380C0092C00382033EA4 +:108870000C0C82C000600006000C0000000000002C +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F000FF0000FF000000000000FFFF000000007C +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 +:108960000000000000000000000000000000000007 +:108970000000FF0000FF00000000000000000000F9 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000000B7 +:1089C00000000000000000000000000000000000A7 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F000000000003C3C00FF000000000000F0F020 +:108A00000000000000000000000000000000000066 +:108A10000000000000000000000000000000000056 +:108A20000000000000000000000000000000000046 +:108A30000000000000000000000000000000000036 +:108A40000000000000000000000000000000000026 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A70000000000000003C3C00FF0000000000007F +:108A8000F0F0000000000000000200020000000002 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000002000200000000B2 +:108AC00000000000000300000000000000000000A3 +:108AD0000000000000000000000000000000000096 +:108AE0000000000010000000000000000000000076 +:108AF00000000000880000000000020000000000EC +:108B000000000000218000001000000000000000B4 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B300000002100000000000000000000004000D4 +:108B400040000000000000000000000000000000E5 +:108B50000000000000000000000000000000000015 +:108B60000000000000008000000005000000000080 +:108B700000004100000000000000000000000000B4 +:108B800000000000000020080000100000000200AB +:108B9000100000001000820010000000000000081B +:108BA00000000000000800000000000000000000BD +:108BB00000000000000800000000000000000000AD +:108BC0000000000000040080000000000000000021 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000001000000075 +:108BF0000000A000A0000000000000000000000035 +:108C0000000000000000000000000008000800084C +:108C10000000000800080004000000080008000828 +:108C20000008000800000008000000080008000814 +:108C30000000000800080084000000080008000888 +:108C4000418200080000000400080000000800083D +:108C50000084000000080082000800080088000866 +:108C600000080000000800000008000010080008CC +:108C700000000000000800001004000800000008C8 +:108C800000080000000800000008000000050002C5 +:108C9000000200210021002100000000000000006F +:108CA00000000021842188218800000000050402C2 +:108CB00000210403002100210000000084000000C6 +:108CC000000200000021002100080400000000054F +:108CD0000002000000000021002100000000000050 +:108CE0000000000500000021002100000000000835 +:108CF00000020000000000210021000884000000A4 +:108D00000000000000000021002100000000000021 +:108D10000000000000000000000000000000000053 +:108D2000410041000300000000000900000800208D +:108D300000000000008400000000000000000000AF +:108D40000000000000000000000000000000000023 +:108D5000040000000000000000000000000000000F +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D9000000000000000A000000000000000000033 +:108DA00000000000000000000000000000050000BE +:108DB00000000000000000000000000900000000AA +:108DC000000500000000000000000000000000009E +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF000200000000000000000000008000000004B +:108E00000000000000000000000000000000000062 +:108E100000000000000000000000000000000990B9 +:108E2000000000000000000000000090050000109D +:108E300000000000000020000000000000002000F2 +:108E40000000000004000000000000000500000019 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E70000008800000000000000000000008000062 +:108E800000000000000000000000000000000000E2 +:108E90000000000000080008000000410000000081 +:108EA000A0080800000800080008000300030000F4 +:108EB000000301800008000800000041900020002D +:108EC00000089000000800080008000300000002ED +:108ED0000003010000000008000800090000000075 +:108EE0002000000000000041000800080000000011 +:108EF000000200000002000000000000000000006E +:108F0000000000009000004100080008000300413C +:108F10000003000800020000000000000000000044 +:108F20000000000000000000000000000000000041 +:108F300000000020100404002000000021001100A7 +:108F4000000000040000000000000000000000001D +:108F500000000000200000000000000000000000F1 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F8000000009080000000000080900000000843B +:108F9000000000000084000000000000C008000085 +:108FA00000080000000000000000000000000008B1 +:108FB0000008000300000800000000000008000096 +:108FC0000008000000080008000000000005000084 +:108FD0000008000300200003000000000000002142 +:108FE000000000080000000800000000000500006C +:108FF000000000080005002100000000000800003B +:10900000000000000000000000000000000500005B +:109010000000000800050000000200000000000041 +:109020000000000000000000000000000000000040 +:10903000000000000002000400000000000000002A +:1090400000000020000005040400000000004100B2 +:1090500041000000002000020000000000000000AD +:1090600000000000000005000000000000000000FB +:1090700000000000000000000000000000000002EE +:1090800000000000000000000082008200000000DC +:1090900000000000000000000000000000010001CE +:1090A000000100C00001000100C0009100000001AB +:1090B000000200040001C00100C000000001C00166 +:1090C000000100C10001000100C00091000000018A +:1090D000008400080001C00100C000000000000181 +:1090E000C001000100C10001000100C100910000A9 +:1090F0000001008800880001000100C0000000019C +:109100000001000100C00001100100C10091000039 +:109110000001008800040001000100C100000041BE +:109120000041004100821141004100C1104100098D +:109130000241000000000041804100890000004120 +:10914000804100410083004100410082104100093C +:109150000241008000800041804100890000000041 +:1091600000418041004100830041004100881041DE +:10917000000902410000000000410041008200009F +:1091800000410041004100900041804100831041B6 +:10919000000902410000000000410041008500007C +:1091A0004100030000000080410091000000110018 +:1091B0004100090000C0C0004100C10000808000E3 +:1091C00041000300000000804100910000001100F8 +:1091D0004100090000C091004100C10000808000F2 +:1091E00000004100030000000080410089000000F1 +:1091F00011000300828000009080C100C10000C007 +:1092000000004100030000000080410089000000D0 +:10921000110041000280009191004100C1000080D6 +:10922000000001000100000000C00100C0000000BB +:109230000000880088900011C1008900C10000086A +:10924000820001000100000000C00100C000000019 +:1092500000008800889000C1C0108900C10000088B +:109260008200000301000100000000C00100C000F6 +:10927000000000008800821000C0C1104100C10041 +:109280000085020201000100000000C00100C000D2 +:1092900000000000880088100002C0008900C100A2 +:1092A0000084101000C00001C0C1000000000001D7 +:1092B00000C008110011000100C100000000000101 +:1092C0000000000000C00001C0C10000000000015B +:1092D00000C002110011000100C1000000000001E7 +:1092E00000000000000000C00001C0C1000000003C +:1092F000000100C0101100C1000100C10000000009 +:1093000000010000000000C00001C0C1000000001A +:10931000000100C0101100C1000100C101000000E7 +:109320000001000000000080004180C1000000003A +:10933000004100C180830041004100C100000000E5 +:109340000041000900000080004180C100000000D1 +:10935000004100C184830041004100C104000000BD +:1093600000410009000000000080004180C10000B1 +:109370000000004100C104830041004100C1000021 +:1093800000000041000200000080004180C1000098 +:109390000000004100C104830041004100C14000C1 +:1093A0000000004100100000C100800080C10000EA +:1093B0004102001104004100C14100008010000082 +:1093C0004100000080004100C100800080C1000019 +:1093D0004102001189004100C141000080080000E5 +:1093E00041000000800041000000C100800080C1F9 +:1093F00000004102001184004100C14100008010C2 +:1094000000004100000080004100C100800080C1D8 +:1094100000004102001184004100C14100008005AC +:1094200000004100000080004100C1004000C0C1B8 +:1094300000000100020089000100C1038800C00093 +:10944000000001000000C0000100C1004000C0C1D8 +:1094500000000100020084000100C1038800C00177 +:10946000000001000000C00001000000C100400039 +:10947000C0C100000100020085000100C111880088 +:10948000C000000001000000C0000100C100400059 +:10949000C0C100000100020085000100C111C00030 +:1094A000C001000001000000C00001000000000039 +:1094B0000000004200000000000000008112004196 +:1094C000070048000000000000004200000000000B +:1094D0000000424200000000000000008112004134 +:1094E00007004821000000000000420000000000CA +:1094F0000000000042420000000000000000811255 +:1095000000410700480000000000000000000000CB +:109510000000000000420000000000000000811276 +:1095200000410700480000000000000000000000AB +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C000000000000000000000000000000000009B +:1095D000000000000000000000000000000000008B +:1095E000000000000000000000000000000000007B +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000000000003A +:109630000000757B0000000000000000000000003A +:10964000000000000000000000000000000000001A +:10965000DEAE757B0000000000000000000000008E +:1096600000000000000000000000000000000000FA +:10967000DEAE0000757B000000000000000000006E +:1096800000000000000000000000000000000000DA +:109690000000DEAE757B000000000000000000004E +:1096A00000000000000000000000000000000000BA +:1096B0000000DEAE60C603000000000000000031C4 +:1096C000E0000000000000000C00000000000000AE +:1096D00000C0630660C60300000000000000003107 +:1096E000E0000000000000000C000000000000008E +:1096F00000C06306000060C6030000000000000018 +:109700000031E0000000000000000C00000000003C +:10971000000000C0630660C60300000000000000F7 +:109720000031E0000000000000000C00000000001C +:10973000000000C0630600020002000000000000FC +:109740000000000800000000000000000000000011 +:10975000020000000080880000000008000004856E +:1097600000000000828800020000000000000000ED +:109770000000C040C0100002000000000000000017 +:109780002000010000800000000000000000000038 +:1097900000000000000000000000888000800080C1 +:1097A0004000000000008800008000000080018070 +:1097B0008800880000000000000000000000000099 +:1097C0000000000000000000000000000000000099 +:1097D0000000000000000040000000000000000049 +:1097E000001009000000001000014100000000000E +:1097F0000000000000011001000000000000000057 +:109800000000000004000002000010000000090039 +:1098100000000000000000000000000000404110B7 +:109820000004000000000000000000080000000428 +:1098300020080000000000000008000000000000F8 +:10984000020000001000A000000010000000040052 +:109850000000000000000000000000000000880878 +:10986000000020002140400082880000000000002D +:109870000408400000000000028000000800000012 +:10988000000004008800020000000008000000043E +:10989000000020050000000010001000080010006B +:1098A0000800080010001000000008000800000078 +:1098B0001000000000000000000000000000100880 +:1098C00000001008000800080084000800080000DC +:1098D0008008000000000000008400C000000008B4 +:1098E0000010000880088409801000100010000893 +:1098F00000088000800000000008001000008000C8 +:10990000000800088010000800080000000800009F +:109910000008000880400000000000080008000067 +:10992000000800100000000800080000900880C037 +:1099300000080008000000080000000800080000FF +:1099400000080041000000200000000000000000AE +:10995000000800000000C0000000000890000000A7 +:1099600000080121000520A10000042001000000E2 +:1099700001000010040000100000000000040000BE +:10998000000001080000000000000040040000008A +:10999000000000A1000200400000000500000005DA +:1099A00000080005000500040000A0000000000001 +:1099B00000000000000000000000000000000003A4 +:1099C000000000A0000000000000000800A000004F +:1099D0004100040000080000008200000084000034 +:1099E0000000000004000000044000080001020024 +:1099F0000082020000080000008300000008000848 +:109A0000000000004082000000000000000900008B +:109A10000000000800400009008500840000008468 +:109A2000000000004108000041850000000800021D +:109A30000000000000000008008400C000000000DA +:109A4000000000000000000000000000C00008004E +:109A50000800C000000041000800C00008008200AB +:109A60000800C0000000000000000000000000022C +:109A700088110000C0001000A000C000C000A003BA +:109A80008400000008008200830001008200C00002 +:109A9000C000C0008200820082002100000000009F +:109AA000000082000200000000000000C011C000A1 +:109AB0000000001100040000000000000000000091 +:109AC0000000000000000000000000000000000096 +:109AD000000000000000000002080000000000007C +:109AE000000004080000000000000000000000006A +:109AF0001100000000000000C10000000000000094 +:109B0000000000000000000000000484400000008D +:109B100000A00000000000000000410084000000E0 +:109B200000000000000080000000000000000800AD +:109B300000000000004000000000000000000000E5 +:109B400000000000000000000000A000000800006D +:109B500008000800000000000400000000000100F0 +:109B600082008220820582800000A0009008A00070 +:109B700000008200828000002000A000A0004000C1 +:109B80000800C00082080000C0008221C008041044 +:109B900000050405820008000000004001410000AB +:109BA00082088200820808000000A010C0000000A7 +:109BB0000000000000008200000000000000000023 +:109BC0000005000000080005000000000000000083 +:109BD0000008000011000084020800A000A000009E +:109BE000020003000000000000020000000000006E +:109BF0000008000011000010021080A00010008476 +:109C00000000000000000000000000000000000054 +:109C100080A0000880001100008200A00000021057 +:109C200000820000000000000000000000010000B1 +:109C300000002108000011000010031000A0000027 +:109C4000008200000000000000000000000000088A +:109C500000000000000000000000C0000000000044 +:109C60000010000020408200002082402002820874 +:109C7000820582000011A00021910000000910025D +:109C800000000000C010840000030000C000C005F8 +:109C9000002100200200C020000500210140000535 +:109CA0000021000000000240080300080241824039 +:109CB000001000100000C04000400008000001003B +:109CC000000000000000000000000008000000008C +:109CD0000000000000000000000000000000000084 +:109CE00000000000000000000000000000008000F4 +:109CF00000000000100000000040202000000000D4 +:109D000080000000000000010000000000000000D2 +:109D1000000000000001000000010000000004013C +:109D200000000000000000000000000000008000B3 +:109D30000001000000010000000000000000000021 +:109D400040000000000000000000000000000000D3 +:109D500000000000000000000000000000000204FD +:109D60000808000482080410000800A0C084020152 +:109D7000080000008200000100A041000201000173 +:109D800000000000000088A00082000308200003FB +:109D9000C0C0A008000810900088044000A0008205 +:109DA0000000009002000000000000000000000021 +:109DB00002A0002084A09040000084000000000069 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000000000000000000000083 +:109DE00083008080000080809180008000800000DF +:109DF0008041800500408009101140408200001021 +:109E0000054100210003000320880089008880406C +:109E1000000080808080008080800380800000803F +:109E200000800000098080000000000000000000A9 +:109E3000000083802180C08000000000000000003E +:109E40000000000000001100000000000000000001 +:109E50000000000000000000000000000000000002 +:109E600000000000000400800000000000210080CD +:109E70000000000000000000000040004188208534 +:109E8000839000008000000080800000000280803D +:109E90000000000080008902838391000500839107 +:109EA00083804080000010000800000000000000D7 +:109EB0000000000021000041A100A00080008000FF +:109EC00080000000020003051180418900000000AD +:109ED0000000000000000000000000000000000082 +:109EE00000000000000000000040000000000040F2 +:109EF00000A00000000000000000000008000004B6 +:109F00000108C005C0C082009000C0909000000110 +:109F1000A0401040000040100201030591004000E5 +:109F2000900385028810000001100100001000005D +:109F300000000000000011000001A120C0900200FC +:109F400002008200900000900100010201890000DF +:109F50000000000000000000000000000000000001 +:109F6000000000000000400000A082820002040205 +:109F7000008200C009C000900140908800000001EC +:109F80000101C101010100000000040000000210F5 +:109F90000188001002100000884000A090A1094034 +:109FA000C0A00004000002C0000000008290010177 +:109FB000000000000000000090410002000590C178 +:109FC0000000000000000000000000000000000190 +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000800000800000000071 +:109FF000800000800000848000000380A0801000AA +:10A00000000811038521110400000900C1000000AF +:10A0100080001000208080000000008000C180A12E +:10A020008900800000800000808005030005808991 +:10A03000111100000000000000000010008500A1C8 +:10A0400080910000000000000000000000000000FF +:10A0500000110000000000000000000000000000EF +:10A0600000000000000000000000800080080000E8 +:10A0700080008000800000008000000003110900C3 +:10A0800003001080110021001140410411A00900BB +:10A09000050080008000008000000000804082C039 +:10A0A00089804000000400C08080001000C00011C2 +:10A0B00000000002000000000000000080408080DE +:10A0C000008000000000000000000000C11010002F +:10A0D000100011110000000000000000000000004E +:10A0E0000000000000000000000000001000080157 +:10A0F00082000800080082009000080000000001B3 +:10A100000100010021C0C10889004100000101894E +:10A1100001000000C0008802C008C000000040002C +:10A12000020402842000404102200808020100C00D +:10A130000000008890000000000000000000020005 +:10A140008808C0020000000000100040000011005C +:10A150002100850041010000000000000000000017 +:10A1600000000000000000000000000000000006E9 +:10A1700000000600000000000000000000000006D3 +:10A1800000600600000060420060060042066006B3 +:10A190000060060000000000000000000000000059 +:10A1A0000081000006006000004100000600600021 +:10A1B0008100006007008400000000000000000033 +:10A1C000810000600000420000000000000000006C +:10A1D000810000E00000000000000000000000001E +:10A1E000000000000000000000000000000000006F +:10A1F0001104F0F7F0F0FFFF8ECF82C3FF00E1F50E +:10A2000000000000F000F0005050D250FFFF0000AE +:10A210000000000000000000F3000000FDF77FDFF9 +:10A2200000002800F80000000000DFDA00003030F5 +:10A23000C0C03C3C000000FF000000000000000027 +:10A2400000000000000000013030000000000000AD +:10A250000000DFFFDF7D00000000000000000000C4 +:10A2600000000000000000000000000000000000EE +:10A2700000005054F3F5F0F0F5FF8E0C8200FFFF64 +:10A28000A0A000000000F014F01400000000000086 +:10A2900000000000000000000000FF000808FEFBB6 +:10A2A000BFEF00000000F0001111399320250000DD +:10A2B0003030C0C03C3C000000FF00000000000047 +:10A2C0000000000000050000000030300000000029 +:10A2D00000000000FFFFFFFF000000000000000082 +:10A2E000000000000000000000000000000000006E +:10A2F000000000000000FFC3000000003E3E1616F4 +:10A300000000000000000000000000000000FF004E +:10A31000AAAA3C3C0000000042038241FFD5FFF5A1 +:10A32000001400410000FB3F0A0A02AA080000AF27 +:10A330000005041001400000FF000000FFFF0000C6 +:10A3400000000000000069C6696C001400000000F5 +:10A350000000FEFEF3FF000000000000000000000F +:10A3600000000000000000000000000000000000ED +:10A37000000000000000F0FF0000000000007F2A45 +:10A380005702000000000000000000000000000074 +:10A39000FF00AAAA3C3C0000000042038241A7FE45 +:10A3A000A7FE000000000000FBFFFAFA020008AA66 +:10A3B00000140014082002800000FF0000000000CC +:10A3C00000000000000000003C963C3C00008200C1 +:10A3D00000000000FFFFFFFF000000000000000081 +:10A3E000000000000000000000000000000000006D +:10A3F00000000000000000008000003800000400A1 +:10A40000000030000090000000610034000D0000EA +:10A4100000612A21C54900A80061003CC00D000868 +:10A42000A0610006000D000100000061503E000D1B +:10A43000000000610E3E009D000115612A06C5491D +:10A4400000A8000000000000000000610007C099A3 +:10A450000005000000000000000000410007C001EE +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000F03CF03C000074 +:10A490000000CF3C0F0044F4CCFCF000F00E0000B4 +:10A4A00000000000000000000000000004000400A4 +:10A4B00000F000F0000000000000000000000000BC +:10A4C0000000C3C300000000000000000000000006 +:10A4D000080802020000000000000000AF05C3C32E +:10A4E000FFFF00000000000000000000000000006E +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000F03CF03CF3 +:10A5100000000000FF000F0000F000F0F000F00E5F +:10A520000000000000000000000000000000040027 +:10A53000040000F000F00000000000000000000037 +:10A540000000002CC3EF000000000000000000002D +:10A5500000000F00000F0000000000000000AF0529 +:10A560003C3CFFFF00000000000000000000000075 +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000E0CB1 +:10A590000C0C00000000EBFF1400DFD7FFFFFF3CB6 +:10A5A000FFFF00000000C3010101000000000000E7 +:10A5B00000000000000000F000000000FCFFF3FFBE +:10A5C0000000000000A500A5000000000000000041 +:10A5D00000000000C3C300C3000000000000000032 +:10A5E000000000000020A05F00000000000000004C +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000000000000000004A +:10A610000C0C0C0C00000000FFFF00000F070F0FD8 +:10A62000FF3C8F8F00000000C3000000000000000E +:10A63000000000000000000000F000000000FFDF4C +:10A640000FDF00000000A500A500000000000000D2 +:10A65000000000000000C3C300C3000000000000B1 +:10A660000000000000000020A05F000000000000CB +:10A6700000000000000002002000000000000000B8 +:10A6800000000000000000000000000000000010BA +:10A69000000000000000200000009000000000000A +:10A6A0000000000000000000C000000000000000EA +:10A6B0000000000300000000200004000000000073 +:10A6C0000008000000000000000000000000000082 +:10A6D00084000000000000002000200000000000B6 +:10A6E00000000000840000000000000000000000E6 +:10A6F0002008000000000000000000000002000030 +:10A700000000000000000000000000000000000049 +:10A7100000000000000000020000000041004100B5 +:10A720000002000000000000000000000000000027 +:10A730000000000000000000000000000000000019 +:10A740000000009000000000000000000000000079 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000008000002000000200008000200A5 +:10A780000000900002000200000000000200000033 +:10A7900000008210000000000000000000000080A7 +:10A7A0000000040002008200000000008800000099 +:10A7B00000009000000000000000000000001000F9 +:10A7C0000000000000000000040000000000000085 +:10A7D0000000000000000000000000000000020077 +:10A7E0000200000010000040040000000000000013 +:10A7F0000000000004080000000200020000000841 +:10A8000000080000000800000000000000000088B0 +:10A810000000000400400000000000000000008272 +:10A820000010000080020000000000000000000096 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000080000000000088 +:10A8500000000000000000000000000000000000F8 +:10A860000088030000000008000000000000000055 +:10A870000000008200000000000000000000000056 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A000000000000000C000900000000000000058 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A9100000000000000000000200000000004100F4 +:10A9200000000000000041000000002004000000C2 +:10A930000400030000000000000000000000090403 +:10A94000000000840008000000000000000000007B +:10A950000000000000000008000003840300000065 +:10A960000000000000C00000000003000000000024 +:10A97000008400840000008400000000000000004B +:10A980000000000000000000000000201000000097 +:10A9900000000800000000000000000000000000AF +:10A9A00000000000400088000000000900110000C5 +:10A9B0000000000200000000000000020000000093 +:10A9C000A000000000000000000000004000400067 +:10A9D0000000000000000000000000004000000037 +:10A9E0000000100000000000000000000040000017 +:10A9F000000900000000000000000000000000004E +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000002100000000000000000000000000D5 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA90000000000000000000000000000000900026 +:10AAA0008200000000008200080000008400000016 +:10AAB00000000000A00000000000000000000000F6 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000363 +:10AAF000000000000008000000000000000000004E +:10AB00000000000000000000000000000000000045 +:10AB100000100000000000000084000000000000A1 +:10AB20001000004000000000000005844000000408 +:10AB3000401000040000210000000000410000203F +:10AB4000000240900000000000C000000000000073 +:10AB50000000000800204000000000880884000079 +:10AB60000000000021000000000021002100000082 +:10AB70000000030800000000030040000500000082 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000002000000008400C000000000005F +:10ABB000020000000004000000000000000082000D +:10ABC0000000000000000000000000000000000085 +:10ABD00008000000000200000000000000009000DB +:10ABE000000000004000820200000000000300009E +:10ABF0000000000000000000000000000000000055 +:10AC00000000000800080000000000000000000034 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000001000000000000000013 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB000000040200084000200A00000000000000E +:10ACC0000000000000000000000000010000000083 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000080000000008000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000300890000000007 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE3000000000000000000000000000000500000D +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB00000000000000000000000020000A08890D8 +:10AEC000030000000000000000000000000000007F +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000008000008011 +:10AF400000808800000000000000000000000000F9 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000040000000000000000000A1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000800011 +:10AFC0008000000080000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE000000000000000000000050000000000005C +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B04000C0000400A000020000000000000000009A +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000840000E00600000000000000000016 +:10B0D0000000000000000000000000000000000070 +:10B0E00000000000000000000000000000810000DF +:10B0F0000700000000000000000000000000000049 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000B42400006F606F600000000089 +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C0000000000000002D2409096F606F6000007E +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000002000005E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000060000F7 +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C0000000000000000000000000000000A0617C +:10B3D0000006800D000000000000000000000000DA +:10B3E000000000000000000000000000000000005D +:10B3F0000000000000000000050000200000000028 +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B6300020002000000000000000000000002000AA +:10B6400000000000000000000000000000000010EA +:10B6500000000000000000000000000000002000CA +:10B660000000000000000000000000000000881042 +:10B6700000000000000000000000000000000000CA +:10B68000200000000000000040000000000000005A +:10B690002000000000080000000000000000000082 +:10B6A000200000000000000020000000000000005A +:10B6B0002000000200020000000000020000000064 +:10B6C0000000000200000000000020000000000256 +:10B6D000000000080000000200040000000000005C +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000500000034 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B7300000000000020000000200200020000000C5 +:10B7400000000200020004000800040000000010D5 +:10B7500000000800000000000000001000001100C0 +:10B760000080200000000000000000000000040035 +:10B770008200000000000000001000000010000027 +:10B7800000000000000000000000000000000200B7 +:10B790000000000002000000000002000200820021 +:10B7A0000000000082008200020000000200000091 +:10B7B000000000000400000200000000020400007D +:10B7C000000200080000000000000000000000006F +:10B7D0000000000000000000000000000000000069 +:10B7E000A000000480000000000000000000000035 +:10B7F0000000000000000000000800000000000041 +:10B800000008000000000000000400000000000824 +:10B810000000000000000000000800000000000020 +:10B820000008000000000000000000000000000808 +:10B8300000000000000000000000000000000020E8 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B860001000400088000080000000000000000080 +:10B870009000000000000000000002000000000036 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000008000000040041000800000013 +:10B8E00000008000000000000402000000000000D2 +:10B8F0000000000000000000000000000000000048 +:10B900000020000000000000000000000000000017 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000011000000000006 +:10B930000000000000000000000000000000000007 +:10B94000000000000000C000000000000000000037 +:10B95000000000000000820000000000080000005D +:10B9600000000000000000000000100400000000C3 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000020000000000000000A5 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E00000000000000000000000000080000000D7 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000080000000000000000000000EE +:10BA500000000000000000000000080000000000DE +:10BA60000000000000000000000000000000008056 +:10BA700000080000000000080000000000000000B6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000002046 +:10BAE000000000000000000000000008000000004E +:10BAF0000002000000000000000000000000000044 +:10BB000000000000000000000000400000000000F5 +:10BB10000000000000000000000000200000000005 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000200000000000000000000000000025 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000020000000000000002 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000001000000000000B3 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD70000000000010000000001100800000000022 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF00000000000000000000000000000A00000A3 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE7000000000000000000000004000000101017F +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000110000001021 +:10BF000010410000000000000000000000000000E0 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF70000000000000000000000000000041000080 +:10BF80000000400000000000000000000000000071 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000140 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C080008100006000008800000000000000000047 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C300000000000000000000000000400006800C5B +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000003C3C35 +:10C390003C3CFF0000000000000000000000000026 +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C410003C3C3C3CFF00000000000000000000002D +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000003C3C0000000000000000000024 +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C510000000000000003C3C0000000000000000A3 +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000002000AB +:10C57000000000001000200020000000000000006B +:10C58000000000000000000000002000000020006B +:10C590000000000000000002200000040000000075 +:10C5A000000000000000000000002000000000006B +:10C5B000200000000000000000002000000000003B +:10C5C000000000000000000000000000200000004B +:10C5D00020000000400000000000200000000000DB +:10C5E00000000000000000000000000020000040EB +:10C5F00000000002000200000000400000000000F7 +:10C600000000000000000000000000020090000296 +:10C610000000000400000000000000000000000016 +:10C6200000000004000400000000000200020000FE +:10C6300000000000000000000000000000000000FA +:10C6400000004000000000000000000000000000AA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C670002000020000002002020004000800200048 +:10C680000200000000002000000000000000000088 +:10C690000000000000000000000000000000820018 +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D0000010000002000000000002000200001034 +:10C6E0000000000000000000000004000000000046 +:10C6F0000000040200040000020004020002000422 +:10C7000040020002000000000000000800000000DD +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000080000000001 +:10C7300000000000000000000000000000000000F9 +:10C7400000000008000000000000000000080000D9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000004000000000000000000080000BD +:10C770000000000000000020000000000000000099 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000004000000059 +:10C7A0004000000004000000000000000000000045 +:10C7B00000004000000000009000000000000000A9 +:10C7C0000000000090004000000000000000000099 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000004000000000045 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000080000000000000000000000 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C880000000000000040040000000000000000064 +:10C890000000000000000000000000000000000098 +:10C8A000000000090004000000000000000000007B +:10C8B0000000000000040000000000000000000074 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000004000000040000000040 +:10C8F0000000000000000000000000000000000038 +:10C90000000008000000020000000000000000001D +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA200000000000000000000800110000000004E9 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000020A6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB200000000000000000000000080000000000FD +:10CB300000000000000000040000000000000000F1 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000110000000000A4 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000C0000000CF +:10D1A00000008400000000000002200020000000B9 +:10D1B0000200200420000000000088002000000081 +:10D1C0008800000000000000000020002000000097 +:10D1D00020002002200004000000C0000000200009 +:10D1E000000000000000000000000000208420007B +:10D1F000000020002000200020000000200020026D +:10D2000000000000000000000000000020004000BE +:10D2100000000000200000002000000020000002AC +:10D2200000020000000000020000000000000002F8 +:10D2300000000000000000000000000200000000EC +:10D24000000000000002000000900000000000004C +:10D25000000000020000000000000040000000008C +:10D26000000000000000400000000002000000403C +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000100000000000000000000000000000007E +:10D2A0002000200020042002200002040200880048 +:10D2B000020088008400040000000000000020003C +:10D2C0000000000000000000030001000100200039 +:10D2D000000000000000000000000000000000004E +:10D2E00000000040000000000200000002000000FA +:10D2F00000000000000000000040000000000200EC +:10D3000002000200020002000040020002000000D1 +:10D3100000400200000000000000000000000000CB +:10D3200000004090040005840204408200102004A4 +:10D3300040040984200202000010000000022000C6 +:10D340000002000200000000000020002000200079 +:10D35000800000000000000000000000000000004D +:10D3600002000000000000000000000000000000BB +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A00000000000002100000020000000400000FC +:10D3B0000021002000040000002000000000000008 +:10D3C00000210000002100000000000000004000DB +:10D3D0000004000000040000000000000000000045 +:10D3E0000000000000000000000000000400000039 +:10D3F000000000000000000000000000000000002D +:10D4000000000000000000000000000000000040DC +:10D41000000000000000000000000000000000000C +:10D4200000000000000000080000000000000000F4 +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A0000000000000000000820082000000000078 +:10D4B000000000000000040000020000080000005E +:10D4C0000000080000000000000000000040000014 +:10D4D000000000000000000000000000000000004C +:10D4E00000400000000008000000000000000000F4 +:10D4F00000000040000000000000000000000000EC +:10D500000000000400000000000000000000000017 +:10D5100000000000000000000000000000000040CB +:10D5200000000000000000000000000000000300F8 +:10D5300000000000000004000000000000000000E7 +:10D5400000000000000000000000000000000200D9 +:10D5500008000000030000002000000000000000A0 +:10D5600009000000000000000000000000000000B2 +:10D5700000000000000000000000000000000000AB +:10D58000000000002000000000000000000000007B +:10D59000000000000000000000000000000000008B +:10D5A0000800000000000000000000000000200053 +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F0000000080000000000000000000000000023 +:10D60000000000000000000000000000000000001A +:10D610000000000000000000000000000000080002 +:10D62000000000000000080000000000C000000032 +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D65000000000000000000000000090000000003A +:10D6600000000000000000000000000000000000BA +:10D67000000000200000000000000000000000206A +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D7000000000005000000000000002100000000F3 +:10D710000000000000000000000000000000000009 +:10D720000000000000009000000000000000000069 +:10D7300000000000000000000000410000000300A5 +:10D7400000000000000000000000000000000000D9 +:10D750000000000000000000000000000040020087 +:10D760002040000000100000021000000000000037 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000110000000000000068 +:10D7B0002100000000000000000000000000000048 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000400009 +:10D7E0000100000000000000000000000000000038 +:10D7F00000000000000100000000000000000088A0 +:10D800000020002090200000000000000000000028 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000300000000000000000000000000B5 +:10D8700000000000000000000000000000000000A8 +:10D8800020800000000000000000000000000000F8 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E00000200000002000000000000000000000F8 +:10D8F0000000000000000000000000000000000028 +:10D900000000800000210000000000000000000076 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D9800000000000080088080090880000000000E7 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E00000000000000088000000010000000000AE +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000002002002000201020000084 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA60000000000000000000000000002000000096 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000008000000000000016 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000008000000095 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB800000000000000000000000000020008820CD +:10DB9000402088000000000000000000000000009D +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000045 +:10DBE00000000000000000000000000000000060D5 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC900055550F0FF0FFCF0F0000000000000000EF +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000FF00C3C3FFFFCF0F000000000000A2 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD900000000000FFEFFFEF1E1E1E1E000000002F +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE1000000000000000FFFF0000AAAA00000000B0 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000610007000D000000002D +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000030000010000141 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D00000000000000000004000001120002000AF +:10E0E000208008002002200288000002200020007A +:10E0F0002000000000082000000088002000200010 +:10E1000020000000208088802000C0802010200097 +:10E110000000000040002002000220002000200437 +:10E12000200420000000200020002000200020000B +:10E13000200000000000200020002000200020001F +:10E1400020002000000020002000200020002000EF +:10E1500020000000000020002004009000020000C9 +:10E16000000000208000000000000000000000000F +:10E17000000000000000000000000000008200001D +:10E18000000000000000000200100000001000016C +:10E190000000000000C00000000000008000C0007F +:10E1A00000010001000000000000009000000000DD +:10E1B000000010000000000000000000000000004F +:10E1C000000000000000000000000000000000004F +:10E1D00000000000000000000000000120032003F8 +:10E1E0008400021103022100840088002000200026 +:10E1F0008400020000000000000000000000000099 +:10E2000000000000000083000200000000800021E8 +:10E2100000000800000000000000000000000104F1 +:10E220000104200420040010000000000010000081 +:10E2300000000000000000000000000000000000DE +:10E2400000000000004000400000000000008200CC +:10E2500000000000010000000000000000000204B7 +:10E26000040841084008088404020204020802026B +:10E270000000000200000400000220020004200050 +:10E280000004000400040000400000840008004076 +:10E290000500000080A00000000000080900000048 +:10E2A0002001200180018001000100000000000821 +:10E2B000000000000000000000000008080400004A +:10E2C00005000008000400080002000000820008A9 +:10E2D000000000000008040400000084000040006A +:10E2E0000000000000200021008200000008000063 +:10E2F000000000000000001100030000000000000A +:10E3000004000000000000000800000002000000FF +:10E310000000A000000000000000000800099005B7 +:10E3200000000109010901080100000000000000CF +:10E330000000840000000008000000000021000030 +:10E3400000000008000000080000000000080000B5 +:10E3500000000000000000000000000000000000BD +:10E36000000000000000004000000010000000005D +:10E370000000000400000000000000000000000099 +:10E380000000410000000900000080000000800043 +:10E39000000000000000000003000000000000007A +:10E3A00000000000200020002000200000000000ED +:10E3B00000000000000000000000008400000000D9 +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E00000000000830200020020000200008220E2 +:10E3F000000000100020C000100004000000820097 +:10E4000000400400000000008200820000110000B3 +:10E4100040090205001000000000C00020000100BB +:10E42000204000000000000000000000004000004C +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000004000000000009000000000000AF +:10E46000000000400000080000000200040000005E +:10E47000000020001001000000000000000000006B +:10E480000000000000000000000000000000090083 +:10E490000800A0900800000100A003A0020088006E +:10E4A0004000A00021000000000000080000000063 +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000002000000000000003A +:10E4E0000000000000000000002000401000042098 +:10E4F00000022000020000200000000000110000C7 +:10E50000000008000000000000000000820000057C +:10E51000840000000000100000028400822100023C +:10E52000000000000000A00000000000000000004B +:10E530000000000300000000000000000040002177 +:10E5400000110000000000000000000000000008B2 +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000800000010000000000001A +:10E58000000000000000000000000000000000008B +:10E5900000000000000004900000000000000000E7 +:10E5A000000000000000000000000000000000006B +:10E5B0000000000000080988050000840000000039 +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F0000000000000000000000001000008000012 +:10E600000000000800000000000000000000000002 +:10E610008200000088000800408040400021000087 +:10E6200000004040000000000000008000000000EA +:10E630000800C0008208000500000008000000215A +:10E6400000000000000800000000000000030000BF +:10E6500000000000000000000000000000000000BA +:10E66000000000000000000000004000000000006A +:10E670000000000000000000000020000220000058 +:10E68000000000000000000000000000000000008A +:10E6900000000000000000820000214000A00040B7 +:10E6A0000002000021000000000003000004000040 +:10E6B0000000000000000000030000000300000054 +:10E6C0000200000000000000000000000000000048 +:10E6D00000000000000000000000000000400000FA +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000088C00088004084A0E6 +:10E700000000000000000000000000000000000009 +:10E71000000000000000000000C1C04082890289A2 +:10E72000C0C000200104820200010001200100009D +:10E7300000010000000000000000102000020000A6 +:10E7400008000000000000000000000000000000C1 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E7700000000000000000000000408000000000D9 +:10E780000000000000000000000000000000000089 +:10E79000000000000000000000000890C0A10085FB +:10E7A00000218080000040800080001100210011C5 +:10E7B0000000000000000000090000000000000050 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000011008000008000802167 +:10E800008080800000000000000000000000000088 +:10E81000000000000000000000000000A0004020F8 +:10E8200088A1C1888000800580210000038021002C +:10E8300011000002000000090000001100000000AB +:10E840000005808080000000000000000000000043 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000100000880000 +:10E88000020840A008900000000000000000000006 +:10E890000000000000000000000000000000081060 +:10E8A0001101898983084000820004A182C001020D +:10E8B0000100010000010000000000000000000055 +:10E8C00090002000A00408000000000000000000EC +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000002008 +:10E8F0000000000000000000000000000000000018 +:10E9000009400020909010C00000000000000000AE +:10E9100000000000000000000000000000000000F7 +:10E92000401100108511111088040020004021C002 +:10E930000000000001010001000000004000020092 +:10E940000100008800200010A0100000000000005E +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000010000000000000096 +:10E980000000C10000000080838000000000000043 +:10E990000000000000000000000000000000000077 +:10E9A0000000808921A008208908008000000080E4 +:10E9B00009800000202008040011000000008000F1 +:10E9C0000000100000000080008080800000000037 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000010000000000007 +:10EA000000000000804000208080800000000000A6 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000A1400284A1009009000800A19C +:10EA300080000000200040000400050000000000ED +:10EA400000000000000000088000000080000000BE +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000900006 +:10EA8000900010004000C00008888440080000008A +:10EA90000000000000000000000000000000000076 +:10EAA000000000000000C19190A141C0A100C00081 +:10EAB000888382888200002000000100000000009E +:10EAC00000000000000000001000A088209004005A +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000A00000600600095 +:10EB100000000000000000000000000000000000F5 +:10EB20000000000000000000000600000600840055 +:10EB300000000000000060006000006000000000B5 +:10EB40000000000000E000000000000000000000E5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000A000007000000500000E0000054 +:10EB800000001908000800000000F0F0F2F2939F66 +:10EB90000000000000000000000000000000000075 +:10EBA00000000000000000000000F300F766000015 +:10EBB0000000C3C340000000E7E7000000000000C1 +:10EBC000000000000000000000000000EFFF000057 +:10EBD000000B00DB0000000000000000000000004F +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000019000000000000000000C2F237 +:10EC1000939F0F0F000000000000000000000000A4 +:10EC2000000000000000000000000000F300910060 +:10EC30000000000340004000F0F0FF3F0000000033 +:10EC40000000000000000000000000000000E0F0F4 +:10EC500000000B0BDBDB00000000000000000000E8 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED1000EF0030000D0F0E0E00000000000000009C +:10ED200000000000000000000000000000000000E3 +:10ED300000812000C1C1C1F1CC9803030000000094 +:10ED400000000000000000000000000000000000C3 +:10ED50000000666600FFFF06FF0E000000000000D6 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED900000000F0030000C0C0E0E00000000000000 +:10EDA0000000000000000000000000000000000063 +:10EDB000000000007C3480808081FC98030366643E +:10EDC000FCFC00000000000000000000000000004B +:10EDD00000000000666600FFFF00FF0C000000005E +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000A5005A38059000A00000000086 +:10EE200000000000000000000000000000000000E2 +:10EE3000000000001061503E000D00000000500076 +:10EE40000090000000610002C001000000000061AD +:10EE50000007000D0000000000000000000000009E +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000020000000A000610006800D00000000CE +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000008280FFFF0041A041000030 +:10EEC0000000000000000F0F8F0F00A0FFAF000038 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000FFFF0041004151 +:10EF400000000000000000000F0F0F0F00A0FFAF37 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000041C300007D4D83 +:10EFC000202000000000000000005FFFF500303F3F +:10EFD000303F0000000000000000000000000000C2 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000040C00000D0 +:10F04000FFCF202000000000000000000AFFA00009 +:10F05000F00FF00F000000000000000000000000B2 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000008800040300022004880330 +:10F0A000040220030002C000C000200288080404FB +:10F0B000880404040004040004008200200400000A +:10F0C00000002080020000002000200085002000B9 +:10F0D00002000000000000022000200000002000CC +:10F0E00000008800200020000000200020002000F8 +:10F0F0002000000000000020000020000000200090 +:10F10000000020002000000000002000200020005F +:10F1100020020000000000000090000200000082B9 +:10F12000000200900000000000020000000000004B +:10F1300000000000000200000000000000020000CB +:10F14000000000000020400000000000000002005D +:10F15000000000000000000000000000000000822D +:10F16000000000000000000000000000000000009F +:10F17000000400000000000000012000000000006A +:10F18000000000000000000000000000000000007F +:10F1900000001000000000000000200520002003F7 +:10F1A0008800040004008400200004000400000023 +:10F1B00020210000000040002000200020009000DE +:10F1C00008000080044004004100000000008500A9 +:10F1D000200000000000000000000000000000000F +:10F1E0000000000000000003000004000000000018 +:10F1F00000000800000000000000001000000000F7 +:10F2000002000000000800000000000000000200F2 +:10F210000000000000000000000000000282090859 +:10F22000059041022008090004020904200000049E +:10F230000504040420002008A008090000844108F7 +:10F2400000008002001080040000840020A0000460 +:10F250002000000404000408209000000000410089 +:10F2600000900000000000000008000040000000C6 +:10F27000000000000004020000080008020800006E +:10F28000000800840008008400080008000800004E +:10F2900000000300000000000088000800080020B3 +:10F2A00002040009000400040040000000000021E6 +:10F2B000100800000000000000000005000000022F +:10F2C000000000000000000010008805020000049B +:10F2D00010000000000000210000000800210000D4 +:10F2E00000000008000800000008020000400008BC +:10F2F00000000000000000000000000000000040CE +:10F3000000000000000000000000000000000000FD +:10F3100000000000000300000008000000000000E2 +:10F3200000000584030000000088000200A0000027 +:10F3300000080000000000000000000000000000C5 +:10F3400003000500000000000000A1880000028802 +:10F350000084410005A0008200A000000000000819 +:10F360000000030009000300210009000000000163 +:10F3700000A00004000000000000000000000000E9 +:10F38000000000000000000000000000000000007D +:10F39000080000000000000800000000000000005D +:10F3A00000004002C0020220040200020809820993 +:10F3B0000402820408400020004000000000820592 +:10F3C0000020C000000000008400020002000000D5 +:10F3D0000011401000111000000400040809404012 +:10F3E0000000000000020000000000020000000019 +:10F3F000000000000000000000000000000000000D +:10F40000000000000000000000000040004000007C +:10F4100000000000004000000000000000020000AA +:10F4200000000040040800A04000020009000000A5 +:10F430004100000002000000000000000000000089 +:10F44000000000400300050020200000800080082C +:10F4500000000000000040000000000103900300D5 +:10F460000000400200000300000040000010000007 +:10F47000000000000000000000000000110000007B +:10F48000000000000000000000000000000000007C +:10F4900000000000029000000000000000000000DA +:10F4A000000000000000000000000000A0080000B4 +:10F4B000000000000000000000000000000000004C +:10F4C00010000000000004000000004000000800E0 +:10F4D0000000A080000000000000002000080011D3 +:10F4E000004100080040000000000000A0000008EB +:10F4F000014000000020000000000000000000406B +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000008000000002000050000000000AE +:10F530000000050405A00000000000000400000019 +:10F5400000000000000004000000040000000000B3 +:10F550001102080011404120000000820040058493 +:10F560000000000000000004000000000008110876 +:10F57000000008000088104110000000000000009A +:10F580000000000000000000020000000000000079 +:10F59000000000000000000000000000000000006B +:10F5A000000000000000200000000000000000003B +:10F5B00000000000000800000000000082000000C1 +:10F5C0000000000000000000000000008400200493 +:10F5D00000000000000000000000200000A1000268 +:10F5E000000000030005402140020000000040032D +:10F5F0000800000000000000000000800000000083 +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300003000000020000000000020000000000C3 +:10F640000340000000000000000002000000000075 +:10F65000000000000000000000000000C0000004E6 +:10F6600005820000210000000400400200000300A9 +:10F6700000000800408200040088030811200000F8 +:10F680000000000000000000080000000000000072 +:10F69000000000000000000000000000000000006A +:10F6A000000000000040000000000000000000001A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D00040000000000000400108400400C02088F5 +:10F6E00000880188021000000000000000000003F4 +:10F6F0000000000000000000001000A000040090C6 +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F750000000000000000000008041800000000068 +:10F7600000800000400080800000000000000000D9 +:10F770000000000000000000000000800000008089 +:10F7800000800000000000000000000000000000F9 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C00000000000000000000000410005000910DA +:10F7D000020000000000800000000000001000098E +:10F7E0008000804000910010000000000000000038 +:10F7F00000000000000000000000000000000010F9 +:10F8000080008000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000010000400020008200040000000001C0 +:10F860000488C0001000100810A100000000000073 +:10F8700000000000000000000000000000009000F8 +:10F88000A000041090000000000000000000000034 +:10F890000000000000100000000000000000000058 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000000000000000000000100216 +:10F8E00000C0008403C188889088008888000000D8 +:10F8F0000000000000000000000000000000000008 +:10F90000100000040090A08800000000000000002B +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F950000000000000001100000000000000000096 +:10F9600000110005008509C10000000000004000F2 +:10F970000000000000000000000000000000000087 +:10F980000000800000800080008000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D00000000080000000000040000200800000E5 +:10F9E00000008040009080008000000080008000C7 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000800000800000000000000000F6 +:10FA100000000000000400000000000000000000E2 +:10FA200000000000000000000000000000000000D6 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA50000000000000C000000000000000000020C6 +:10FA600000840000C00120A140028800880088882E +:10FA7000088888000000000000000000000000006E +:10FA8000000000000000C000880400A0000000008A +:10FA90000000000000000001000000000000000065 +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD00000000000000000000000000084000000A2 +:10FAE000000000000000000A0000060041000000C5 +:10FAF00000600000000000000000000000000000A6 +:10FB000000000000000000000006000006000000E9 +:10FB1000000000000000000000810000070000005D +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000C0C00000F0003C00E9 +:10FB7000CF0C1414020C020C000000000000000066 +:10FB800000000000000000000000AAAA00FF000F13 +:10FB9000F0FF000000000000000000000000000076 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000000000000000025 +:10FBE00000000000000000000000C0C05500F00050 +:10FBF0003C00CF0CD7D7020002000000000000003C +:10FC000000000000000000000000000000000000F4 +:10FC1000000FF0FF000000000000000000000000E6 +:10FC200000000000000000000000000000000000D4 +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC600000000000000000002828EBEBFFBBFFFFB6 +:10FC7000AA00AAAA5555FFFF5F0A5F0A000000000C +:10FC80000000000000000000000000000000FF7FF6 +:10FC90000F8FBEFF140000000000000000000000F5 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE000000000000000000000008ABA8ABAFFFF8E +:10FCF000FFBBAA0000005551FFFB28282828000060 +:10FD000000000000000000000000000000000000F3 +:10FD1000F0700080BEAF1450000000000000000032 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD600000610006000D000000000000000000001F +:10FD70001061403E004D000800613007001D000189 +:10FD80000000000000000000000000000000000073 +:10FD90000000A00040300000000000000000000053 +:10FDA000000000000020000000A000000000000093 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF000000000000000000FFAFC000000000000FE +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000F0A0C000000005D +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000043D74382000033 +:10FEF0000000000000000000000000000000000002 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000007FFF7FAAEA +:10FF70000000000000000000000000000000000081 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD00000000011A00220022002A0020402200260 +:10FFE0008803C003C040201120002000100020031F +:10FFF00020000400200020002000000000802000DD +:02000004002AD0 +:10000000C0030000001020102010A00000002000FD +:1000100020000002200000002000200084000000DA +:10002000200004000000000020002000200000004C +:10003000200020000000000320002000000000003D +:1000400020084000000000002010200020000000D8 +:100050002000200000020090048200400090004038 +:100060000000000200C000000000000000000000CE +:1000700000901000000200000000000000000010CE +:10008000040000020000400000000000000000002A +:10009000008400820000000000000000000000005A +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C00000000000200200000040000000000000CE +:1000D00000000000000020002000840084000400D4 +:1000E00020000403040020412020880002000000BA +:1000F000880000000400000000000005000004412A +:1001000020000000020008000800A000000000001D +:10011000000000000010000040000200000040004D +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000009B6 +:1001400000000000000004000000000000000000AB +:1001500000000000004100000204090809040984AD +:100160002000008409042084040404080404090411 +:1001700000040004000400040000208800000000C7 +:10018000008200084100000804000008000000840C +:1001900000104004000000080000C00080000000C3 +:1001A000800800000008000800080008000800009F +:1001B0000010000800840008000400000008000887 +:1001C0000082000000080004800800080008008485 +:1001D00000840008000200080000880288098804E2 +:1001E0000002C008880084110000000040200002C6 +:1001F00000080000000800410002000000000000AC +:1002000000004000000000004100C00008000005A0 +:10021000000000020000002100210000000000009A +:10022000000800400000900000100205C00000001F +:10023000000800210000000000400000000800004D +:100240000000000800000040000000000000000066 +:10025000000000000000000000000000008240409C +:10026000049000900488410200A000040020004097 +:100270000020000000000800000021000000000035 +:100280000300000090A000000200880000080000A9 +:10029000000000000488008400000000000000004E +:1002A000000000010000000000000083000000A02A +:1002B00000840000000000000000000000000000BA +:1002C000000000020000000000000000000000002C +:1002D00000000000000000000000000000004004DA +:1002E0000220A004C0208440020400090040020251 +:1002F0000009840204410402000000040000000020 +:10030000A000000082002000000000000205A00004 +:1003100000000000A0418200080000000000000072 +:1003200000000100000000800000000000800000CC +:100330000400040000000000000000000000400075 +:1003400008000040000000410040004000000000A4 +:100350000011000000000002004000000004000046 +:1003600021001100040021000300030040001100DF +:1003700003820000000000200508000000001000BB +:10038000210000000084000803000000200880A075 +:10039000210000004100110808001100058800C07C +:1003A0000000008202880000000241020390000465 +:1003B0000800000000000000000000100000000025 +:1003C0000000030003000000210000000084000082 +:1003D00000000320000000000000000000000000FA +:1003E000000000009000902100004000000000008C +:1003F00000080000000000000000000000000000F5 +:1004000000088200000000008800828020000000B8 +:100410009000000400090021C0040008000800004A +:100420001000000082000800A021A0090020042084 +:10043000001000100000002000000000000000007C +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000001104000000086F +:100470000000000000000000000000000000080074 +:100480000000000000880000000000000840040098 +:100490000004000208100310001000100400000007 +:1004A0000000000000001100000000080000000033 +:1004B000000000A105010000000000000000000095 +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E00000000000000000000021C000000000002B +:1004F000000000002000000000000000C0004000DC +:100500001000000000000000000084000000400017 +:100510000800000408000041A0090000004001009C +:1005200000009008820000008880900810004002BF +:1005300000400000000000840000000000000008EF +:100540000000000800001000000000000000000093 +:100550000000000000000000000000040000000097 +:100560000000000000000000032000040400204000 +:100570004000000021402002020003000000219002 +:10058000030004001120000005000010000000001E +:10059000000080002004410020002100009000891C +:1005A0000882402000041184000003021120800012 +:1005B00040040001000000000041000000000000B5 +:1005C0000000110000000000050000000000000015 +:1005D00000000800000020200000000000000000D3 +:1005E000000008C000002010000000000000000013 +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:10061000000008C1018390018401A004000400A02F +:100620000404000000000000000000020811018224 +:10063000A0A01083C18300040089C0030000000053 +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000008082410200040004808000808D +:1006A0000080000000000000000000000000C0C149 +:1006B00003210010802011110585000280880000B0 +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F000008000000000000000000000000000007A +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000008808000000000D1 +:1007200000080000000000000005000000000000BC +:100730008000212191000280410085A082919100DA +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:10077000000000C0000000000000000000000000B9 +:100780000000000000000000000000000000000069 +:1007900000000000000000008200080188C0100076 +:1007A0000000000000100000000000000008000031 +:1007B0000000A040A100A090410820902002A1A12B +:1007C0000400000000000000000000000000000025 +:1007D0000000000000000000000000000000000019 +:1007E00000400000000000000000000000000000C9 +:1007F00000000000000000000000000008000000F1 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000841000830102BE +:10082000011120900010008440A000000000000092 +:10083000000000004040018989A1108200040001ED +:1008400000C1C10000000000000000000000000026 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000041000000000037 +:100880000000000000000000000000000000000068 +:10089000000000000000000000000000004009A16E +:1008A00002050984000000800080080000000000AC +:1008B000000000000000004120208521021100807E +:1008C000000300021103000000000000000000000F +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000011C6 +:100920008080808000000000000080000000000047 +:100930008000000000000000020003801000024060 +:10094000000085918280830000000000000000000C +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A000200010A010408800900088001000C000B7 +:1009B000C0000200200010000000A100A0A0A1A023 +:1009C0008300820004030304830000000000000091 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A00008400000000000000000000000000000062 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000006082000000000000E4 +:100A300000000000000000000000000000000000B6 +:100A400000000000500000600000000A00000000EC +:100A50000000000000000000000000000000000096 +:100A6000000000000042000007000000000000003D +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA00000000000000B0B0B00000000018103C3DD +:100AB0000F0F4266F0F02060000000000000FFF31E +:100AC000F3FF0040C340FF0BFFFF000000000000E9 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000DBDBDBD9FFC0C009993A +:100B30000FFF0F0FFFFFF0F030F00000000000008B +:100B4000FFFCD3FF00400040FFFBFFFF008100815E +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C20000000000000000000000000000000424240 +:100C3000C3F318180C0C00000000000000000000B6 +:100C400000000000BFB08F8000002C0C3CC018F0EA +:100C5000FFF20000000000000000000000000000A3 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA00000000000000000000000000000FFFF0046 +:100CB0004242C3FF18990C0F000000000000000022 +:100CC000000000000000CFCFCFCF00003C3C3CC074 +:100CD00018F0424200000000000000000000000088 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000008061E2 +:100D30005006001D00000000400000000000000000 +:100D4000000000000000000000610006000D00012E +:100D500000613000C0110000000000000000000031 +:100D60000000000000000000000000000000000083 +:100D700000000020000000A00000000000000000B3 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000AF00FF000000000000000085 +:100DC0000000000000000000000020A275F7000AEB +:100DD000040E353C353CF000F0FF00000000000040 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E3000000000000000008300FF00000000000030 +:100E400000000000000000000000000020A275F774 +:100E5000000A000A353C353CF0F0F0F000000000DC +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB000000000003070C0C0000000000000000012 +:100EC00000000000000000000000000000002D2DC8 +:100ED000003C0A5F5F5FFCFF0C003C0C3CFC000028 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F30000000000000000D0D0D0D0000000000007D +:100F400000000000000000000000000000000000A1 +:100F5000052D003C0A5F5F5FFCFF0C003C0C3CFC75 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000A000000004008440000020000400C5 +:100FA0000440000000000040000000400000040871 +:100FB0002080210800080408A0201020A020A020E4 +:100FC0002000400000208804840000200020000051 +:100FD00000020000002040822020000020000000CD +:100FE0004004200000000000000000050000000494 +:100FF0000400008000002000000488000000C008F9 +:10100000C0C120000000000000008800880000002F +:101010008880000208020002000200C01000800266 +:1010200000400002004000400000000000020002FA +:10103000C0408020040040000002000100010001C7 +:1010400000010000000000C1008200000001410119 +:101050004100000000000083800300010000004008 +:10106000000000020000000000000000000000007E +:101070000000000000200000000000000000000050 +:101080000000004000000000000000000000000020 +:1010900000000040820084008400840005000100FC +:1010A00004000200820004210400842005000800DE +:1010B00000200220000000000000000002200400C8 +:1010C0000020822084000000002004000420000092 +:1010D00000000000000004002000040000050000E3 +:1010E0000000000000008800000000000000000078 +:1010F00000000000000002000040000500009040D9 +:101100000000000004000008000000000010004182 +:1011100000000000000004000300020000002000A6 +:101120002000000005000500800080000001040090 +:10113000040000000000040000000000000020097E +:1011400080080001200900000000000180008009E3 +:101150000000008200080000800000848008000871 +:1011600000080008000000080088000000080008CF +:1011700000080000000800080084000800080008BB +:1011800000C000084100800800400084008400087E +:1011900000080000000800084100880040008800A6 +:1011A000408005000400000000020005000500006A +:1011B000012000000088002000210005018001209E +:1011C000000000000000000000210400000800886A +:1011D000000000000008084000000588000004022C +:1011E000000500000020002100000008080800049D +:1011F00001050010000500210000000000000000B3 +:1012000000000021000000210080000300400010C9 +:101210000000002100000010002108040000090067 +:10122000000011200400C19000080400002000020A +:1012300000A0404100000220000100001100202019 +:10124000204103000000000000000082800010A088 +:101250000520000000100000000000000420110024 +:1012600080010420000000A00000008800000000B1 +:10127000000020000000000000000000000000004E +:101280000000000000000082008200020000000058 +:1012900000000000000000000000000020024009E3 +:1012A00000200810001140029005C1090020002014 +:1012B00090000220900000008204000400000180E1 +:1012C00082800800040010008200040090200405C1 +:1012D0008202000000058220000500020000044197 +:1012E0000800880900200000000000000000050040 +:1012F00000000000008008000000100090000000C6 +:1013000000000000000040024002840090098400B8 +:10131000000000000000840000000000000902003E +:101320000900110082000200028802002090028958 +:101330000200024021884000110000000900000066 +:1013400020200420000040000000040000A0000154 +:101350002100000020000300000111002100000016 +:1013600011A0000800002101212000400000000021 +:101370000200000000000840008400000288040011 +:1013800000000200000021000200020000000590A1 +:101390004100000000000000000400000000000008 +:1013A0000200040000008800000300030011012077 +:1013B00082022000A005040304084005A02040414B +:1013C00000030000002100000000000000000404F1 +:1013D0000408020000004021A0200041000040203D +:1013E00000000080000300000000002082000800D0 +:1013F0000000200082040040000000000000000007 +:101400000000000000000000000000000800840050 +:1014100084404020C008C008002100008200000075 +:1014200000028900A0A011404088040000080400C8 +:101430000400000000000000000000008000000127 +:101440008000000000044000000000900420000024 +:101450000040020000000004040000900020000092 +:10146000800100000002200004C0000000A0002055 +:101470000000098280000001000000000000000060 +:10148000000000000000000000000000000000005C +:1014900000000000800000000000000000000000CC +:1014A0000000000120000080880000000000010210 +:1014B0004100882182418221042082000000002016 +:1014C0004004000000200005004100200000040945 +:1014D000002100004000000040008800000088411A +:1014E00000008200000009040080010201C0081110 +:1014F000000200000810008001800380010000004D +:101500000000000002408203082100000800820061 +:10151000000000000800A00000000000A000000083 +:1015200000000000080409000210000420880008E0 +:101530000404040000C009002000000402040000AC +:10154000000180000000000100000000030100080D +:101550000000088802000000200040000000000099 +:101560000000000000200000200240042021200292 +:1015700000000400048200000020044084040402EF +:101580000000000021004100000080000040200019 +:1015900020200088000004000004000000000084F7 +:1015A0000000098800000000028400820002901000 +:1015B000901008080084088208C000900882081073 +:1015C000C0C14108910504A1C0C0000801080488F9 +:1015D00020C0001000000088404000080004A01057 +:1015E000C0089110020402080003A1A1010511A086 +:1015F00010020000000000000000000000000000D9 +:10160000000000000000000000000090000000202A +:10161000009008820082902020200000000000003E +:10162000000102400040844000040000000000006F +:10163000808000058009050900840080100080007A +:1016400000808088080583048008838000804080B3 +:10165000000000800080000000008080000000008A +:1016600000800088040200838011000020201121E6 +:1016700040080080000000000000000000000000A2 +:10168000400000000000000000000000000000001A +:101690000000000000001100000000000000000336 +:1016A00000030010C0002000800000800000000245 +:1016B00080000000001100898090800000008003FD +:1016C000008080800390050984888903800280104F +:1016D0000088800000000020000080000000000959 +:1016E00000820000820021080900031000000808A1 +:1016F00004C1208241200000000000000000804062 +:1017000000800010008000000000000000000000C9 +:1017100000000004000005002108408002080000CD +:101720000000000000009000A12102802010840031 +:10173000028810020210840088C00810C0009000C7 +:1017400010018210C0A0909020000502C00010017E +:1017500002019041C0009000A0010000C000840080 +:101760000008001100900590C1098488C1C10000E3 +:1017700005A00805C1418508000000000000000028 +:101780000200000200010004000000000000000050 +:1017900000000000000000000010010300A0014153 +:1017A00000000000000000000320030210A0894098 +:1017B0009084008288022008A0080208C008111046 +:1017C00002880009001108C140401190040511C1B0 +:1017D000020220080002A1C0100800100040C0C092 +:1017E00083100002002004C0A1040004030509C105 +:1017F0000000A105210890888485000000000000F9 +:1018000000002000208240000000000000000000D6 +:1018100000000000000000001000901000090021EE +:10182000021100000000000000000202000300415D +:10183000891191000000000080808280918090805A +:101840008880004000080082009080859105830414 +:10185000108880800080008002800000008000806E +:10186000008041000080000000804184201082A19F +:1018700082200000C12008C04102082000000000B2 +:1018800000000000050000008000030000000000D0 +:1018900000000000080000000000000000400010F0 +:1018A000002102A00000000041000000808500101F +:1018B00000A108C00000000900808000000000A016 +:1018C000800000008008002080000000898005C0A2 +:1018D00084000811800380C08080000080200040C8 +:1018E0000000000000000040000080000080204058 +:1018F000A0800040000010892040A00004040000E7 +:101900000000000000000002004000000000000095 +:1019100000000000000000000000000000001004B3 +:1019200011058500A00300080000000000001091D0 +:1019300090008500C01084008282029002000400A2 +:10194000080908028400C000020340208800C00487 +:10195000200805409101C000080840040200C001B1 +:10196000889090880400C00088008290020084A0C3 +:101970000404840420000000C109A1A00390850193 +:101980000000000000000000000100002000000036 +:101990000000000000000000000000000000000047 +:1019A00082008200830004000000000000000000AC +:1019B0008210898803080201000A00000600000066 +:1019C0000000006006004842000000000600000021 +:1019D0006000006006004200000000600600600039 +:1019E00000000000060000000000000006004800A3 +:1019F000000000000600410000000000006006003A +:101A00006000000000000000000000000060060010 +:101A100000000000000000000000001100000700AE +:101A2000000000810000070000000000000000002E +:101A300000000000000000000000000000000400A2 +:101A40005410FF00FF00C3C30A000000EFC30000F2 +:101A50007F55000055550000DF0F0000CA00000050 +:101A6000FF020000F0F000007F3C0E0E0A0AF1F5C4 +:101A70000E0AAEAE5151FFFFFBFF0000FFFFBFFF9C +:101A80000FCF4F4F0000000000000000F0F00000FA +:101A9000F0F0000000000000000000000000000066 +:101AA0000000000000550FC3F03CF03C00000000B7 +:101AB00000000000FCFCC0C010513879000A0CAADC +:101AC00000005010FF04FFF4C3C30A0F0000FFC35F +:101AD0000000FF550000D5DF00001F0F0000FFFFD2 +:101AE0000000FF0E0000FFF300007F3C0E0EFF0A17 +:101AF000F1F5F1F5FEAE0151000004000000000018 +:101B000040000FCF0F0F0000000000000000F0F0B9 +:101B10000000F0F0000000000000000000000000E5 +:101B2000000000000000FF550FC300AAFFAA00003C +:101B30000000000000007D417D411051387941C016 +:101B400040001000702000410343F0F8000040FF07 +:101B50000000E3EB0000A0FF0000F2FA0000C3F376 +:101B60000000A2FF0000FFFF0000D5D50000FF002D +:101B7000BF40C3C3C3C36C50AFAFFFFF0000000042 +:101B8000FFFFDFFF3C3CFDFD000000000000000007 +:101B90000000FFFF00003C3C0000000000000000CF +:101BA0003C3C4D4D00000000FFEFFFFF0000000037 +:101BB0000000000000000000FFAF3C3C7F734F437B +:101BC00041004000100050000F4F0F4FFAF8000086 +:101BD00043FF0000E3C3000030FF0000F2F000000C +:101BE000C3D7000002FF000082AA0000F5F5000044 +:101BF000FF00FF003C3C3C3C3C00FFFFDFFF2000BF +:101C00000000000020003C3CFDBC00000000000083 +:101C100000000000000000003C3C0000000000004C +:101C200000003C3C4D4D00000000FFEF00000000B4 +:101C300000000000000000000000FFFF3C3C7C7042 +:101C40004C4005000A38051000A00361030F0C0D7D +:101C500012C003E3030E0C0D92C003E3030FCC0D7F +:101C600092C003E3030F0C0D92C0038203080C0023 +:101C700092C0030003080C0090C00361030E0C0D1A +:101C800010C000000361030F0C0D00C00000000035 +:101C90000000000015612A0F054D00A8000000009B +:101CA0000000000005000020000000000061302658 +:101CB000000D00A000610006000D0000006130066C +:101CC000000D000100000000000000000000000006 +:101CD0000000000000000000FFEF55EFC34000408F +:101CE000F8300000000000000000000000000000CC +:101CF0000000000000000000000000005F0F5F0F08 +:101D00000F0F8F0F00002000FFFF030307040000E8 +:101D100000000000000000000000000000000000C3 +:101D2000000000000000000000000000000000E0D3 +:101D3000E0E0737F5353000000000000000000004B +:101D4000C2FA1B1F13170000000000000000000073 +:101D500000000000000000000000FFFFFFFFC000C7 +:101D6000000008000000000000000000000000006B +:101D7000000000000000000000000000000055000E +:101D800055000F0FCF0F00000000FFFFC3C3F7F493 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB00000EBEBEB737F5F5F0000000000000000B2 +:101DC000C2FAC2FAFBFFF3F70000000000000000B7 +:101DD00057FF020F0000000000000000000000009C +:101DE000C34000400200C2C000000000000000002C +:101DF00000000000000000000000000000000000E3 +:101E000080A082AA82FF82CF0000FFFFFFFF0100B7 +:101E1000000F0000000000000000000000000000B3 +:101E200000000000000000000000000000000000B2 +:101E3000000000000000B0F0F0F0CF0FCF0F000066 +:101E4000000000000000F0F0504000000000000022 +:101E5000000057FF070F0000000000000000000016 +:101E60000000C00000000000C000000000000000F2 +:101E70000000000000000000000000000000000062 +:101E80000000C0F0C3FF82C382C30000FF00FF5FF9 +:101E90005555000F00000000000000000000000089 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000B0F0F0F0CFFFCFFF06 +:101EC0000000000000000000F0F0F0C00040100032 +:101ED000001100008200000082000000880800411C +:101EE0000008840000000000400804808408040802 +:101EF00040080008000584080208100800000000DF +:101F000000000000000000402000208000030000CE +:101F10002000020002008400040500000000000010 +:101F20000000880000050000080000040000000018 +:101F30002000000084004000200000040004000095 +:101F400000000000000088000002000201800090F4 +:101F5000008221400002004040C00040104000C00C +:101F600000400040000040000004000400080000A1 +:101F70004000000000000000404000000900200078 +:101F80000000000000000000000000000008000049 +:101F90000000000000000000000000000000200021 +:101FA000000000000040000000008000000005006C +:101FB000000000001000000000020000000000000F +:101FC00000000000000000001000000000001004ED +:101FD00004000800044004000200040000000400A3 +:101FE0000440002000400000002000000400000029 +:101FF00000000000040004000000000000000000D9 +:1020000000000000000000000000000000000000D0 +:102010000000030001000500100001002100100075 +:10202000050001000100410008000100010010004E +:10203000410000000000000000000041000000001E +:10204000000002000000000000000000000000008E +:102050000000080000004000000004000000000034 +:10206000000000000000030002000000000000006B +:10207000000004000000000000000000000000005C +:1020800000C00008000000080000008200000008F6 +:1020900000000000900808088808800810008808E0 +:1020A0008008A08402084000A0088000028420006C +:1020B0008008A000000800080008000800000008D0 +:1020C0000008000000080000000800C000000088B0 +:1020D0000008000040008800040002001000840096 +:1020E000400000004000100000000400000000005C +:1020F00000002005000000000000000000000200B9 +:102100000000C000000084000000000090080000F3 +:10211000840000800000000000000000002100009A +:10212000000000000000000000000021001000007E +:1021300000080021002100000000004000210008EC +:10214000000000100008000000000000000800006F +:10215000000000000000000020000000000000203F +:102160000000002005080000040403900000001097 +:1021700005000002800409000000000000C000000B +:10218000000041000900000404001100090040C0E3 +:102190000500000020040000009000C000A0000026 +:1021A000039041880082030000000000000000004E +:1021B0000000000008000000000000000800080007 +:1021C00002000000000000904082110000000000AA +:1021D00000000000000000008809002088090000BD +:1021E00000090009002000408802000040209020E3 +:1021F0004010A002400010008200400082008200D7 +:10220000820090409000000000000000400000406C +:10221000840040000400C000000000040000080426 +:10222000004000000100080000020500010000203D +:1022300000000000010000000808820000004000CB +:1022400088000800000000000000000000000000FE +:10225000000040000000000000002000020000001C +:1022600020000000400000022002000400000000E6 +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000002000002E +:102290000000090000000000000000000401000030 +:1022A00000410000000002000000000120000400C6 +:1022B00000010008000040000000000100000004D0 +:1022C000000000000000000400000000000000000A +:1022D00000000000000008000000000000000000F6 +:1022E00000000000000000000000000000000000EE +:1022F00000000000000800000000000910000000BD +:1023000000000400000000000000020010000000B7 +:1023100000000000000000418200A0000000080052 +:1023200000001000000000000800822100000000F2 +:102330000004000000000002000000000002000095 +:10234000000000000000000000000000000000008D +:1023500000000000000000000000000000401088A5 +:1023600002901088044000900020100040000404F7 +:10237000008209100500401000C009C011000420AF +:10238000082000041100402009004004051000004E +:1023900000000904000011840020402011200000EA +:1023A0001100048804880020009000001100000043 +:1023B0000000090000000000000000000000000014 +:1023C00000000000080008000800092000000304C5 +:1023D0000000000008000000038805000088408815 +:1023E00000000000000002002000000020000000AB +:1023F000000040000009001100040000000040003F +:102400000000000090004002080082000800000068 +:1024100000000000000008210000820000004000D1 +:10242000000040118800820500030009000000211F +:102430008800000000000000000000020009000900 +:1024400000000000200090002000000040009000EC +:102450000000000000000000000400040000000074 +:102460000000004020C000041190090220400040FC +:10247000000000000200000000000000000000005A +:10248000000000000000000000000000000000004C +:102490000000000000880000200000000000000094 +:1024A000000000000000000000000000000000002C +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000400003000000B9 +:1024E0000000000000010001000100C00001000127 +:1024F00000C00009010011010082008800014001B4 +:1025000000C1000000010001000100C00001000145 +:1025100000C000090001000100400010000100019E +:1025200000C0000000020100C000000082C10100E4 +:1025300040000141C08283000001001004C001007E +:1025400040000140C00000010001000100C0000186 +:10255000000100C10005000001010040000200016F +:10256000000100C100000041004100410084004121 +:102570000041008402C120400241000000000041EF +:10258000804100840000004100410041008500417D +:10259000004100C005C1002005410000008000414D +:1025A0000041008900000000412085210000050352 +:1025B0004141004141908080200410400080800013 +:1025C0004120802141C08000004100410041008441 +:1025D00000410041008810C100400241000000009D +:1025E0000041004100840000410003000000008021 +:1025F00041008400000008000900918000808300F1 +:102600004100C10000048000410003000000008080 +:1026100041008800000008000200100000809000C7 +:102620004100C10000808000000020002103000064 +:1026300000004141204100410041108480210041BF +:1026400004002000A14100C08041410003000000BF +:10265000008041008500000009004100840000C0A6 +:1026600090004100C10000000000010001000000D6 +:1026700000C00100C00000000100880020820004AA +:10268000C1848300C10000858200010001000000B8 +:1026900000C00100C1000000010089008840000462 +:1026A000C0004100C1000008080000030100000153 +:1026B00000A000A0000101010001000190028220A1 +:1026C00000010010200020010082820101000100B1 +:1026D000000000C00100C00000000000820004C033 +:1026E0000005C000A100C1000084C00000C00001BE +:1026F000C0C100000000000100C0048200C1000150 +:1027000000C10000000000010001000000C0000145 +:10271000C0C100000000000100C0108300410001A2 +:1027200000C10000000000010000000000000008DF +:1027300000000185010000000000C182820000103D +:102740000000C020000000000000C100000000C028 +:102750000001C0C100000000000100C082A100858E +:10276000000100C100000000000100010000008025 +:10277000004180C100000000004100C18084004190 +:10278000004100C100000000004100040000008082 +:10279000004180C100000000004100C100C00041B4 +:1027A000004100C1000000000041000900000000DD +:1027B0000080000302C0410000000041C1C10000D0 +:1027C000008300410941000000000021C1400000D9 +:1027D0000080004180C100000000004100C10003F2 +:1027E0000041004100C10000000000410004000061 +:1027F000C100800080C1000041100040C0004100C5 +:10280000C1C10000802000004100000080004100A4 +:10281000C100800080C100004110004082004100E2 +:10282000C1C18000804000004100000080004100E4 +:102830000000A020800080C100004105804183C1CC +:1028400003C1092000A08080000041410041808038 +:1028500003C1C100800080C1000041040040C000ED +:102860004100C1C100008040000041000000800024 +:102870004100C1004000C0C100000100100109007A +:102880000100C1058400C001000001000000C0007B +:102890000100C1004000C0C100000100100105009E +:1028A0000100C1050200C000000001000000C000DE +:1028B000010000000205820040C100000000040188 +:1028C00004C101C1C089000982C0000000010001EB +:1028D00040C001C1C1004000C0C10000010184012D +:1028E00005000100C1092000C00000000100000037 +:1028F000C0000100000000000000004200000000D5 +:1029000000000000811200410700480000000000A4 +:102910000000000000000000000000420000000075 +:102920000000000081120041070048000000000084 +:10293000000000000000000000000000484200000D +:10294000000000004842821200E006000042000041 +:1029500000000000484200000000000000420000AB +:102960000000000000008112004107004800000044 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A700000000000000000000000757B0000000066 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000DEAE757B00000000BA +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000DEAE0000757B00009A +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000DEAE757B00007A +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000DEAE60C6030021 +:102B00000000000000000031E000000000000000B4 +:102B10000C0000000000000000C0630660C6030057 +:102B20000000000000000031E00000000000000094 +:102B30000C0000000000000000C06306000060DE22 +:102B400003400000000000000231E000000000002F +:102B500000000C4000000000000002C07B0660C6C0 +:102B600003000000000000000031E0000000000051 +:102B700000000C0000000000000000C06306000020 +:102B800040110000000000000000000000004008AC +:102B90000000000200000400040000000000C0006B +:102BA00000000000000000100402000000002000EF +:102BB000000040004021040000000000004000022E +:102BC000004000000000000400000000400000047D +:102BD0000000000020002000200000000000000491 +:102BE0000000840000040000000000000004000059 +:102BF0000100000000000083000000000000000849 +:102C000021C02140104010104040004021401002DF +:102C100003A000C040C000000000410000400002CE +:102C2000002040004004008200000000000000027C +:102C30000000000000C00000000000004000040090 +:102C40000000000000000000000000000000400044 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C7000000004000000210000100002000000001D +:102C80000000820002008200820084090200080025 +:102C9000820002000441002002210800000002100E +:102CA00008400200020000000200010001000300D1 +:102CB000010000000000000000000000000000090A +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000002000000000300000000CF +:102D000000000000000008001100080000000000A2 +:102D100000000200000000000000000000000000B1 +:102D20000000040004000000000000002008200053 +:102D30002000200800C00000000000000084000007 +:102D400000000008000000080008000000080584DA +:102D5000000000000288000005100000008405004B +:102D60000588000000080010008800000010001016 +:102D70000000000800084000000000000000000003 +:102D8000000000080004840088008400840084009F +:102D90004000040040004000100088001000840043 +:102DA0008800880000000000000802000000880081 +:102DB0000400C00088001000040000008808200003 +:102DC0004008000040000000080040081000880093 +:102DD0008408000001000005010000000010080048 +:102DE0000010000000000000000020000000004073 +:102DF000880800000400000000000500000000003A +:102E00000000000000000441000004000900400030 +:102E10000020058805000900000205A00000000050 +:102E200000840000000000000000000000104000CE +:102E30000000400000000000100210A01000001070 +:102E400008A00800008400000000008200000020AC +:102E50000000000020000800000002000000000048 +:102E6000000200A0000000080000000800000000B0 +:102E70000008000000002100000000008400001095 +:102E8000000000000000008200000040100400402C +:102E900000400004000400040009040900020000CE +:102EA0000000000000000004000482000000004058 +:102EB000000004000040000000000820000020097D +:102EC000C005000400000000000400000000000035 +:102ED00000040004000000000000000000000000EA +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000400000800000008000000BE +:102F0000080008000000C00082000000090009005D +:102F10000900000000880002029000020004004046 +:102F20000000000400000000200000000000080075 +:102F3000000000000000000000000000030000008E +:102F4000004000000000000000000000000003003E +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000004000002000200000002000800031 +:102F80000000110000000000000000201188000077 +:102F900084000000000000000000000000000000AD +:102FA0000000000000001000000000000000000011 +:102FB00000000000C00810000000000040000000F9 +:102FC00001000000000000000000000000210000DF +:102FD0000000000000000080000000000000000869 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:103000000000000004200100000000040000000097 +:103010001000200400000004410800000000000827 +:1030200000840400050000000008050000000008FE +:1030300000000000000010A0400800A004000008EC +:1030400000904008400400000020000000000088BC +:103050000000040000000020000204000800000836 +:1030600000000800008800002000000000000000B0 +:10307000000000000000000000000400000000004C +:1030800000A00000002080010400000400080000EF +:1030900000A0000000000000000000000000000090 +:1030A000000000000000000000000003000000001D +:1030B0000000000800000000000000000000000008 +:1030C00002000000000000000000000000000000FE +:1030D00000040000000000000021000000000000CB +:1030E0000008000000000000000000400000000098 +:1030F00000000000000000000200000000000000CE +:10310000000000000000008000000000000000003F +:103110000020000000880004008809C002000900A7 +:103120000004091000000000000000000000000082 +:10313000000000000000000000000000000000008F +:1031400000000000200000002000004000000004FB +:1031500020C000000000000000000000000000008F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:1031800000000000000000000040110000000800E6 +:1031900000000420110400000000000000000000F6 +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000001020100000000FB +:1031D00000000000000000010000010040000000AD +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:103240000000000008000000002011038020000999 +:10325000000000000000000000000000410000002D +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000001100000000002D +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000010000000040000000010000800D2 +:1032D00008C0000000000000000000000000000026 +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:10330000000000000000000000000000000000219C +:10331000000080000000000000000000000000002D +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000001000000000000001001006B +:10335000000000A1000000000000000000000000CC +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000010002D +:103390002008A090C008000000000000000000000D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000200000001000000FA +:1033D0000101A10100000000000000000000000049 +:1033E00000010000000100000000000000000000DB +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:10341000000000001000000000000000000000009C +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:1034400000000000000000000000800000001000EC +:103450000041040488200005000000000000000076 +:1034600000000004002100040040000000000000F3 +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000020000000800000000000000000008C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D0000000082104210300032000000000000078 +:1034E00000000000000200000000000000000000DA +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:103510000000000000110088808000000000000012 +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:103550000000000000210100000001000000000048 +:10356000000000000000000100000000000000005A +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B +:103590000000000000000001A0200808000000005A +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D000006000000000000000000000000000008B +:1035E0000000000000000000000000000000420099 +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000007000000A3 +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:10368000000000000000000000000000000000003A +:1036900000000000000000000000FF90FF9000000C +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000000000000000000000CA +:1037000000000000000000000000000000000000B9 +:10371000000000000000000000000000FF9FFF9F6D +:103720000000000000000000000000000000000099 +:103730000000000000000000000000000000000089 +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000000000000049 +:103780000000000000000000000000000000000039 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000FFF0FF0000000000000000AA +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000003C0099FF00000000000044 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000000F8 +:1038D0000000000000000000000000610007000D73 +:1038E000000000610006000D000000000000000064 +:1038F0000000000000610006000D00000000000054 +:1039000000000000000000000010000000000000A7 +:1039100000000000000000000000000000000000A7 +:103920000000000005000A08050000A500000000D6 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:1039600000000000000000FF00FDFFFD000000005F +:10397000000000000000000000008282A2A20000FF +:103980000000000000000000000000000000000037 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000000F7 +:1039D00000000000000000000000000000000000E7 +:1039E000000000000000AE0CAEFF000DFF0D000057 +:1039F000000000000000000000000000008220A283 +:103A000000000000000000000000000000000000B6 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000EB28CB0800F0A0F0F0 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000E320C300000010 +:103AF000A0A0000000000000000000000000000086 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000008800880075 +:103B40002000000040002000820088000011880052 +:103B5000C021822040000400880002000000000014 +:103B60000000040020000204000400000400200003 +:103B7000000020002040000020082000000300007A +:103B8000000000002000200020000000880020002D +:103B900020000000200088000000000082000400D7 +:103BA00004000000200004000400000420002000A5 +:103BB0000000000220410100C080C004208240209B +:103BC000402021201020092000200920102041C081 +:103BD0001040202000000020C00020200000208293 +:103BE00000000000000000900001100100C0000073 +:103BF0000000200000C000000000000000000000E5 +:103C0000000000000000100000C0004000000000A4 +:103C10000000004000000000400000000000000024 +:103C20000000000000000000000000000000000292 +:103C3000000000000001000020000004000100411D +:103C400002000209824090400821002100219000DA +:103C5000040000000040000005000000010000001A +:103C60000100010001000100000000000000000050 +:103C70000000000000000000000000000000000044 +:103C800000000000000082000008000000000000AA +:103C9000820000000000040000000000000000009E +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000840000000000000080 +:103CC00000000088000000100000020000400220F8 +:103CD000020002C0004000A00200040000400400F6 +:103CE0000000200020002000200002000000000052 +:103CF000000000000000000000000008200000009C +:103D000000000000030000000000000000000000B0 +:103D10000000000004000400030000000410040080 +:103D20000088048409000000040000080008000066 +:103D300000840004000000000000050000080000EE +:103D40000008000808108810040010050000004159 +:103D50008400900004008800A0000000040000001F +:103D600000000000080000000000C00084110000F6 +:103D70008800888000008800000090004003000058 +:103D800020000021000000000003000000000000EF +:103D90000000000800080000000010000000000003 +:103DA0000000000000000000000000000000000013 +:103DB00000000000000840000000000000000000BB +:103DC00000000021840004000400030000000090B3 +:103DD0000900400010002100080000000000210838 +:103DE0000000000000000000000000000000400093 +:103DF000020000000404020000000000002000088F +:103E0000000000000020000003000000000000008F +:103E1000000000000000000000840000000000001E +:103E20000000000000840008000000000000000006 +:103E3000412041000000000000000000000000845C +:103E400000000000000005400011C0110041820088 +:103E5000A0090000100000090000000000000000A0 +:103E60000000000000000100000000000000000051 +:103E700000000000080000001040004000000000AA +:103E80008400000000000205000000400040000027 +:103E9000000482000000000000001000000000008C +:103EA0000000080000000000080082000000000080 +:103EB0000000820000008421824082020002004152 +:103EC0000141A000A0004009880000000304008810 +:103ED0000090009003002188090000000084000485 +:103EE000000000040000000004000000000040008A +:103EF00000000000000400C00000090011884140DB +:103F000000040000008800008000000000000000A5 +:103F1000000002000000000000000000000000009F +:103F20000000000000000000000000000000000091 +:103F300000000000000000000008040003820002EE +:103F400041C0020000000000030005000000A000C6 +:103F5000A0000000000000000011000000000000B0 +:103F60000000000008000800000000000000080039 +:103F70000000000000000400000004000000000039 +:103F80000000000000000000000000000000000031 +:103F90000000000000080008000000000000000011 +:103FA0000000000000000000000000000000000011 +:103FB0000200A000000008000000000020008400B3 +:103FC00000000000C00000400000001100050500D6 +:103FD00005000000000000000000040400000000D4 +:103FE0002000000000004000080000000000000069 +:103FF0000000000000000000000021000800110087 +:104000000000050000840004000000000000000023 +:104010000000000040000000000000000000000060 +:10402000000000000084000000000000000000000C +:104030000000000000000000000000000000400040 +:104040000000080000000000000000000000000068 +:1040500082040000A0000000844100000800000469 +:10406000100008000004000000000004840010009C +:104070000000000008000000000000000000000038 +:10408000024002210005000000000000002100089D +:10409000000000000000000000040000000000001C +:1040A00000000000000000000000000800000808F8 +:1040B0000000000000000008000000000000840074 +:1040C0008400400040000000400008008408000018 +:1040D00000040084000009000082410441040884B7 +:1040E000000000000000042000002000000000008C +:1040F0000000000000000020000041A008020000B5 +:1041000000404100110008001100000000000900FB +:10411000090000000000000000000008000200008C +:10412000000000000000000000000000000000008F +:104130000000000000000000000000000000080077 +:10414000000000000000000000000000000011005E +:10415000000200010000000000000000000000005C +:10416000000000000000000000000000000004004B +:10417000000000000000000000000000000000003F +:1041800041000000000000000000000001400004A9 +:104190000040C00800010000000000000000000016 +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C0000000000000004082088200050020C0902E +:1041D0002004A0A0C0C000000000000000000000FB +:1041E00000000000000000000000000000000000CF +:1041F0008000000000000000000005000000020038 +:104200000900850000000000000000000000098097 +:10421000008000000080000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000090088021001000091C +:1042500080000880208000000000000000000000B6 +:10426000000000000000000000000000000000004E +:104270000000000000000080002000000005008019 +:1042800000000000000900800000000000000000A5 +:10429000000000A100080000000000000000000075 +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C0000000000000000000000020002182039197 +:1042D00002051188218840882003000000000000AA +:1042E00000000000000000000000000000000000CE +:1042F0000000000000020000008200000000000139 +:10430000000200000000000000A00000000000000B +:104310000000000000100088000000000000000005 +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:104340000000000000000000000000001040A1116B +:1043500009A089000891A11190C11001000000007E +:10436000000000000000000000000000000000004D +:104370000000000000000000840000000000900029 +:10438000000000000000100100000000000000001C +:1043900000000000040800100000C0080000000039 +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C000000000000000000000000000000090104D +:1043D00001A00104021004001004A08288A00000C3 +:1043E00000000000000000000000000000000000CD +:1043F00000000000000040000000800003000000FA +:10440000000000000500000900080000080200008C +:10441000000000000000800000000000008000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:104450000000100005000200801080C180031105DB +:10446000000000000000000000000000000000004C +:10447000000000000000000000000020000000001C +:10448000000000000000000000100000000000001C +:104490000000000000000000000580008000000017 +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000002100910005001004900988004100AF +:1044E0008820000000000000000000000000000024 +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:1045100000000000000000000000820004004000D5 +:104520008800000000000000000000000000000003 +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:104550000000000083888888C004400005C0041063 +:104560004082A000000000000000000000000000E9 +:10457000000000000000000000000000000000003B +:10458000060000000000006000000000810000E064 +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000E0000060820000000000000000000009 +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:1046100000000000000000000000000000003FF566 +:104620003F05FFFFFFFF000000000000000000004A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:104650000000000000000000FF00C3C30A30FA3071 +:1046600055C3000FFF0FFF0F000000000000000007 +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A00030F530050F0FC3C300000000000000000C +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000000000000000000000EA +:1046D0000000000000000000000055550F0F0A30D8 +:1046E000FA3055C3FF0FF5FFF50F00000000000082 +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000FFD7FFFF00000000000000000000B5 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:10475000000000000000000000000000FF2FFFFF2D +:10476000FCFC0C0CFFBEFF3C5C5C5C5C00000000D1 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A000000000000F0F0F0F0000000000000000CD +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D0000000000000000000000000000000FF2FAB +:1047E00000005F505F500F0F0F0FFFF00F00000031 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000005000A08050000A000618B +:104810000007000D000000610007800D000000008F +:104820000000000000000000300000100000000048 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:1048600000613006000D000100613007000D0000FE +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:1048900000000000000000000000000000002020D8 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E0000000EAEB00000000000080C082C3AA05BF +:1048F000AABE000000000000000000000000000050 +:1049000000000000000000000000000000000000A7 +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:1049600000000000FAFF000000000000A0F0AAFF15 +:10497000000500140000000000000000000000001E +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E0000000000000000000E0EB79795541000074 +:1049F0000000F0C050400000000000000000000077 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000E0EBE0EBFBFBFFEBD0 +:104A700000000000F0F0F0F0200021000000210014 +:104A80000000000000000000000085000000200081 +:104A90000000400000000400000000008200200030 +:104AA000000000000000008004000102C18420001A +:104AB00004000400040020000002400088002000E0 +:104AC00020008800000000008880000000004000F6 +:104AD000200404000000000020042000000020004A +:104AE000A000040004000000020400000000000414 +:104AF0008404C00000000004840005A0082041C018 +:104B00000820202000200020402000024020210218 +:104B1000094009000020002000002000400009009A +:104B2000099000A0000221900040210008004008E8 +:104B30000000009000084100008400000000009088 +:104B400000020002004000C000000002000000005F +:104B5000000000000000000000000000090000004C +:104B600000000000000000000000800000A0000025 +:104B700000000000000000000001000000200041D3 +:104B8000A0412040204101412040011090042041DB +:104B90002000200000000040000000000400000091 +:104BA00000C0000089000300040004008800000029 +:104BB00000000000020000000000000000000000F3 +:104BC00000000000000000000100010001000000E2 +:104BD00000000000000000000000000004000000D1 +:104BE00000000000000000000000000002000100C2 +:104BF000000000000000000000800000000000C075 +:104C00000000028880C0820820888000200000C147 +:104C100080208020804000400000000000008000D4 +:104C2000000000210500040804008010800000003E +:104C30000000000000000000000000000000000074 +:104C400000000000000000000008200420002000F8 +:104C50000008000000000000000000080000000044 +:104C6000000004080088001002080000000000088E +:104C7000208200002000000020000004000000004E +:104C8000C141101088214010100008001008400099 +:104C90000441002100050000008000000000000029 +:104CA000000000050000040005008841830040006A +:104CB0000000A0008400400000034000000040000D +:104CC0000000000040080008000000000000000094 +:104CD00000080000002000000000000000000000AC +:104CE00000000000000000000000000000000000C4 +:104CF000000000009000088090000109100084006E +:104D0000008040000000200080004100C100410000 +:104D10000000000000002100000021100000000041 +:104D20000000100000000000000002080000400029 +:104D30008000030800A000000000000080000000C8 +:104D400080000000000091A00000000000000000B2 +:104D50000000000000000000000000000000000053 +:104D600000000000000000000300400008000000F8 +:104D700000000500100003000804109020820000CD +:104D800000000004A000200082051180A0000000A7 +:104D90008241000020008200200020008200A0004C +:104DA00082000004830000000000A0058300004191 +:104DB000828200200040C000A00400008200A00207 +:104DC0008209040000000000000000000000200034 +:104DD00000000000000008000000080000000000C3 +:104DE000080000000000A0000800A000080000006B +:104DF0000000000084001100000001000800900283 +:104E0000A000000008000240020000002020000076 +:104E10000000001000408040004080408000000002 +:104E2000080000001100040000000000090010004C +:104E300009000002000003000000000000404102E1 +:104E40004000218800000000000000000200000077 +:104E500080000000000000020000000000000000D0 +:104E600003000000000000000040080003000000F4 +:104E700000000000000005002000030020001000DA +:104E800011882100000009000000080010108400B3 +:104E9000A000000000000085004100000005C040A7 +:104EA00000000000000000000400000082008200FA +:104EB00082800000400000000000840000000080AC +:104EC000C0200020000000000000000000000000E2 +:104ED000C0080000A000000000000000000000006A +:104EE00000000000000000000000000000000000C2 +:104EF00000000000000000000000000000000000B2 +:104F00000000000004001080048004000000000085 +:104F1000000003000000410000101000000000002D +:104F20000000000000000000000021000000000060 +:104F30000000210810009010000004000000000094 +:104F400000020090000000200000000000000000AF +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F7000000000000000000000000000108403900A +:104F800000020304051089A0202083020240024091 +:104F900000080000000040048204000308412009CA +:104FA0000000402008001021000402000800080052 +:104FB00000000080104040084000C0400000900009 +:104FC000200400048200000800022000000002000B +:104FD00002802000A000000000000000000000404F +:104FE00000000000000008000000080000000000B1 +:104FF0000000840000000000820000000800200083 +:10500000200808002000102000000000A000000080 +:105010000000000000000000000000000000000090 +:105020008000000000000000000000000000000000 +:10503000000000000020820080000010000000003E +:105040000800000003000300080200002000000028 +:105050002190030203042100000000000000000072 +:105060000000000000000000000000000000000040 +:10507000000000000000000008A0000000C00000C8 +:105080008000800008008000080100C000082100A6 +:1050900000A100094008888900A0A01000840084B5 +:1050A0000000000000000000000000000000000000 +:1050B000000800040084009008A0010820090808E6 +:1050C00008A1031002048202000001000800000091 +:1050D00000030000000100000000000000001000BC +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000A084000400A0E8 +:10510000002000000000000000000100000000007E +:10511000000002881111C0C100080080008040001A +:10512000000000000000400000000000000000003F +:105130000000008000800000008040820804001011 +:10514000808900C183090089808803000200000073 +:1051500000000000000500030040000300000800FC +:1051600040000000000000000000000000000000FF +:10517000000000000000000000000000000000002F +:105180000080000000000000080000001100210065 +:10519000050000000000000880000080002080085A +:1051A00000030000004000000002000200000008B0 +:1051B000000000008000800000808080900040A1FE +:1051C0000321C1048500A1208488088540000200D5 +:1051D000410020210000000000000000000500093F +:1051E000000000400000000000000000000000007F +:1051F00000000000000000000000000000000000AF +:1052000080410080000000400000004000000008D5 +:10521000008000080080880002C1A000020288010E +:10522000040008C1C00000C000000001000100002F +:10523000000100840000080082008488089041205A +:105240008804828309A004204100A004A002000079 +:105250000100000000010000009000000000008438 +:10526000000000000001000000000000000000003D +:10527000000000000000000000000000000000002E +:105280009000080500040400000000000000000079 +:105290000001000400010004028900884090080910 +:1052A000040008000000830000000400000001006A +:1052B0000000000000000000400000A00490080072 +:1052C000C1400085C109A0C0402101898441A121BC +:1052D00000000000A000000100000000000000002D +:1052E000000000004000000000000000000000007E +:1052F00000000000000000000000000000000000AE +:105300000000402000040404082000000400000005 +:105310000000000110008201000140081003828299 +:105320008388800080000000A00000008000000052 +:1053300040000000000000000000800000800080AD +:1053400080002010001008A1808880200310208495 +:1053500090030040004180050004000000000000B0 +:1053600041000000000500030005030500000000E7 +:10537000000000000000000000000000000000002D +:10538000000000008000000000000000000080001D +:105390000000050005208010000810408002000970 +:1053A000008000008005809180000000040009005A +:1053B000030008000000800000008000804080841E +:1053C0008000000021800440898010400388101173 +:1053D00091000810040000000800000200002108ED +:1053E0004008030040000000000000000000000032 +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000800000100C +:1054100000000000000000100004000000009001E7 +:10542000C0020208880008000410400400000000C8 +:1054300000000000010010000200A0000400C000F5 +:10544000A00490048800210204040808050084A038 +:10545000A1200208910001A000000000000000004F +:105460000101000001000000000000000000000039 +:10547000000000000000000000000000000000002C +:105480000000000000000000840004200820A000AC +:10549000000000000000000000000000000000000C +:1054A000000A00600600000000000060000000002C +:1054B000000000600000000000000000000000008C +:1054C000008100000600000000000000060000004F +:1054D00000000000000000000000000000000000CC +:1054E000000000000000000000000000006000005C +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:105510004100810000E000000000008100E0070081 +:1055200000003F003F003030F33000009FFF0000DC +:1055300000000000000000000000AFBFBFBF00007F +:1055400000005C3C96660FF00FF0814381C38DCF65 +:1055500000C302FB02FB008900CF00000000000036 +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:1055800000000000000000000000000099000FC3B0 +:105590000F9FFFF30000000000000000000000006B +:1055A000000000000F0F03030000F3F3FFFF9FFF55 +:1055B000000000000000000000000000EFFFFFFFFF +:1055C000000000005C3C96660FF00FF08103810341 +:1055D000BDFFC300026B92FB8989CFCF00000000A2 +:1055E00000000000000000000000000000000000BB +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000099FF02 +:105610000FC30F9FFFF30000000000000000000018 +:10562000000000000000000000000000000000007A +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:10569000000000000000000000000000000000000A +:1056A0000000000000000000FFF9FFF9FFFFB9B99A +:1056B0000701F7F191F799FF0000000000000000DA +:1056C0000000000000000000000000040F0F0F2B7E +:1056D000FFFFFFFFBDFFBDFF101C101C00FB00C340 +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:1057100000000F0FFFFF66660F0F00000000000083 +:1057200000000000000000000000FFFD0F0DFF0F53 +:10573000FF0F0F00EFE01076187E00000000000061 +:1057400000000000000000000000000000000F0F3B +:105750000F0F999FDBDFBDFFBDF6FFFF000000FBD1 +:1057600000FB00000000000000000000000000003E +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:10579000000000000F0FDBFF3C3C00000000000099 +:1057A00000000000000000000000000005610A3F4A +:1057B000050D00A000610007000D0000006100075A +:1057C000000D000000000000000000001000003884 +:1057D0000000000005614A0E059D00A00061000662 +:1057E000000D000000610006000D000000000061D7 +:1057F0000006000D000000610007000D0000000021 +:105800000000000000000000000000000000000098 +:1058100000000000000000003000000000000061F7 +:105820000007800D000005610A2F050D00A0000093 +:105830000000140054140000000000000000CFAF6E +:10584000AAAF0000000000000000000000000000FF +:10585000000000000000A3FF030F0F03050100C2BA +:1058600000FA3F7D3F7D0F0FFFFF0FFFFFFF00009E +:10587000AAF3AAF30000000000000000CF55005575 +:105880000000000000000000000000000000000018 +:105890000000000000000000000000000000000008 +:1058A000000000000000000000000000C0C0C3FFB6 +:1058B00000000000000040000000000000000000A8 +:1058C000FFF3AAFF0000000000000000000000003D +:1058D0000000000000000000FFFF0F0FFFC3554154 +:1058E000C2C2FAFAFFCFC3CF0000FFFF0F14FFFFC1 +:1058F00000000000FFFF0000000000000000CF5586 +:10590000FF55000000000000000000000000000043 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000C0C0F7 +:10593000003C10100000000000000000000000000B +:105940000000000000000000000000000000000057 +:10595000000000000000000000003CFCFFFC000014 +:10596000004055553F0F003F003F000000005F50D2 +:10597000535000003F03FFCF000000000000000074 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B0000000000050503000000000000000000017 +:1059C00000000000000000000000000000000000D7 +:1059D0000000000000000000000000003CFFFFFF8E +:1059E0000101000000003C00000F002F000000003B +:1059F0005F5F535F00003C00FFCF0000000000002D +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A3000000000000000000004000400000000005E +:105A400084000000840088000000000000000400C2 +:105A50002000040004000000000000000200880094 +:105A600000008800000020800000000002002005E7 +:105A7000208020802082000300800080000082803F +:105A8000880000000000000020000000000020004E +:105A90002000880002000200880000000000C00012 +:105AA000008084000000000020040000040020802A +:105AB0000000208020A02005094000A02020000236 +:105AC0000220104000A0094000400000002000001B +:105AD0000000000000000040414000820002000081 +:105AE00000401000000200000004000000008000E0 +:105AF000000000104010001000000902001011000A +:105B00000002400000000000000000000000000053 +:105B10000000000000000000000000000040000045 +:105B20000000001000020000000000010000000062 +:105B3000004000000020001100000041020082101F +:105B40009000904100210000004000400000000053 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000010004000400040028 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000002000000F3 +:105BB0000000000000000000A010A000004000C095 +:105BC0000040004000000040000000C0000000084D +:105BD00000000000000000000200000804000000B7 +:105BE000110000000000000000000200000000C0E2 +:105BF0000000040000000000000000C000000200DF +:105C00000500020002002000020002000208040059 +:105C100000000200000000880000000000000400F6 +:105C2000040804000000040204000000040800103E +:105C30000000000000000000000000000000000064 +:105C4000000010410000000000000441400000007E +:105C5000080000000000100000000000000000002C +:105C600000000000000040008800000000009000DC +:105C700000000000000088210200880000200000D1 +:105C8000000000000200000000080000000000000A +:105C900000080000000000000000000000000000FC +:105CA0000000000000000000000000000000900064 +:105CB0008400000041000000040088088402000005 +:105CC0000000000000000000000000C00000000014 +:105CD00000000000000000000000000000000000C4 +:105CE0000982050041000000110008000400410085 +:105CF0000082000041002100000800000000008830 +:105D0000000000000000890000000000000000000A +:105D10000000000000020000000000000000080079 +:105D2000000041000000200008000000000000000A +:105D30000000050000002000000080A000000040DE +:105D40000000080000000000000008000000000043 +:105D500000000800000008000000820000000800A9 +:105D6000000082110800080000020400000000008A +:105D7000901140020002C100000204000000000077 +:105D800000000000A0000011000008040000040052 +:105D9000000000008200C00000008200000000003F +:105DA00000000800000082000000000008008800D9 +:105DB0000000900020032000000000000800000008 +:105DC0009000C0040300000000000000000000007C +:105DD00000000000000000000000000000000000C3 +:105DE0000000000000000000020040000000000071 +:105DF00004000900200020002000000140000000F5 +:105E00000000000000000000000000000904000085 +:105E10000000000000000000000000000200000080 +:105E2000000000000000000000000000030021004E +:105E300000000000000400204100200000040000D9 +:105E40004000200000910000000000000000000061 +:105E50000000000000000000000000000000000042 +:105E6000000000000800A00000000000000040004A +:105E70000000A00008080000410000002010000001 +:105E800000000000044000000000000000000000CE +:105E900000200000080000000000000000000000DA +:105EA00000000800000000000000000000000800E2 +:105EB00000000000C0008280040082800000008397 +:105EC000820800842020834100840884008400002C +:105ED00000000000000000000004000000000000BE +:105EE000000000040000000000840000000000002A +:105EF00011000804008808C00420A0004088C100E8 +:105F00004100000000000300000000000008000045 +:105F1000040000000000000000000000000000007D +:105F20000000000000000000000000000000000071 +:105F30000000000000000000041000A009040000A0 +:105F4000000404000004808504020000000000003A +:105F500000000002000200410000000000000000FC +:105F60000000080000000000000000004000820067 +:105F700004000002A00000000800008410040000DB +:105F8000000582000000C000840400000021000021 +:105F900000000011000000000002000000000000EE +:105FA00000000000000000000000000040000000B1 +:105FB000000000000000020000000000040090004B +:105FC0000000000004210080401188000000000053 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF0000000000000000800000000002002200453 +:1060000000000010000000001100118400000000DA +:10601000000003000000000000000000000000007D +:106020000000000000000000000000000000000070 +:106030000000000000000000800240040988000009 +:10604000000000000000800000200000110000009F +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:10607000000000000000000800080088C0820085C1 +:106080000084900400101008000400C0C008000044 +:10609000002001A1080510A1000000000000000080 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C0008804008400A0000809A0208800040802B9 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000080008000000000A0 +:1061000000200000A00400090080008000008080C2 +:1061100000000041200480A00021000000000000D9 +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000008000000098000009180800002002B +:10615000808000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:1061700000000000000000000000000000C100213D +:106180000000409005040088090000000000800025 +:1061900000000000400021029110A010000000004B +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000011CE +:1061C0000000800000088084808800000002000237 +:1061D00000020000000000000000000000000000BD +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000108F +:10620000008900000190008300A1000090000000C0 +:10621000A0009000000040A00901A082050100003C +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:1062400000001088C000C0010211400320000001BE +:106250000041000300880000000000000000000072 +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000010020C +:1062800000000084C008041011200004080808A0C1 +:1062900000880000A0080000C0A101020091A00138 +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000008402408490848302EB +:1062D000059008A02084834000000000000000001A +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:106300000000000000800280004011804004888965 +:106310000000000000000080000080020290412187 +:1063200080400000000000000000000000000000AD +:10633000000000000000000000000000000000005D +:10634000000000000000000000000080800000004D +:106350004180C100808080004100000000000000FA +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:106380000000800080000000800040880000840041 +:10639000091100000080008000000000102090889B +:1063A00020000308000000000000000000000000C2 +:1063B00000000000000000000000000000000000DD +:1063C000000000000000800000000000000980893B +:1063D00080800000000200050000000000000000B6 +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:106400000000000008000800200004008402A00032 +:10641000A0008801000000A000C0000000008589E5 +:10642000A110C0880501000000000000000000006D +:10643000000000000000000000000000000000005C +:10644000000000000000100002022002C0008400D2 +:1064500004118210880088002000200088000000BD +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C +:1064900000E000000000000000000000000A000012 +:1064A000000000000000500000000000000000009C +:1064B00000000000000000000000000000000000DC +:1064C00000000000000000000000000000000000CC +:1064D000810000E000000082810000E00700820AE5 +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:106500000000000000000000FF550FC3FFFFFFFF69 +:10651000C3C3FF000FFFC3FF000000003030282876 +:1065200000003C3C3C3CCF00CF00000000000000DD +:10653000000000000000000000000000000000005B +:1065400000000000000000000000B23CB2FF0000AC +:1065500000000F0F5555DFCFDCCFC3410301FFC350 +:1065600055C3000000000000000000000000000013 +:10657000000000000000000000000000000000001B +:106580000000000000000000000000550FC3C3C35E +:10659000FF00AAAA0F0F0FFFC3FF000000000000BA +:1065A000282800003DBFBFBFCFCFCFCF00000000E5 +:1065B00000000000000000000000000000000000DB +:1065C000000000000000000000000000B200B2C3A4 +:1065D00000000000C3C3FF00DFCFDCCFFF550F0575 +:1065E000FFC3F0FF000000000000000000000000FA +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000FFF53C3C1E +:1066100000000000FFEFFFFF000000008587959756 +:10662000FF00FFAA000000000000C300FB00000004 +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000055005555FFFFFFEB7F7C4F4CA2F328 +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:106680000000000000000000000000000000FF55B6 +:106690003C3C00000000FFEF000000000000CDCFF8 +:1066A000DDDFFF3CFF3C00003C2C3C28FB00FB00F6 +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000550000000F0F0F0F73704340C3 +:1066E000FFFF0000000000000000000000000000AC +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 +:10671000000030000000000000613007000D0000A4 +:106720000000000000000000000080610006000D75 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000000000000000000000500613007800D0F +:10676000000105610A0F850D00A000000000000077 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000BCBCBFBF55C3EB +:1067A000FFFF000000000000000000000000E0EB20 +:1067B000E8E800FF0000000000000000000000000A +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:10681000000000000000000000000000BCBCBFBF82 +:1068200055C3FFFF00000000000000000000E0EB87 +:10683000E0EB282800FF000000000000000000003E +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:106890000000000000000000000000000000737312 +:1068A0007070B2B2C3C3000000000000000000001E +:1068B00020FF20FF00002F3F00000000000000002C +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:1069200043434040B2B200000000000000000000FD +:10693000000070FF20FF00002F2F0000000000006B +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:1069700000000400000000000400200000000000EF +:106980002000000000000400C00000000000000023 +:1069900000000000A00088000004208000800000AB +:1069A000008040000000840004000000000000009F +:1069B00000800002100020000004400020000000C1 +:1069C00000004000000000002000C00000000002A5 +:1069D0000000840000000000000010080500018095 +:1069E00001008402010021002100200088008400B1 +:1069F00089002002102000200020000010A00202C8 +:106A000000400020400209000020000000001000AB +:106A10004000000200000000000000000010001014 +:106A2000000000401090000000000000004008003E +:106A300000000040000000000000200200020000F2 +:106A40000000000000000000000000000000000046 +:106A50000000000000000900000000002002820089 +:106A60000440040000012000A040200080000084B9 +:106A7000000020A000010000000002000200004011 +:106A80000200000002002000204020102000020030 +:106A900000000200000000000000000000000000F4 +:106AA00000000010000000000000000001000400D1 +:106AB00004000000000000000000000000000000D2 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE000044002200440022000000040000000009A +:106AF00040000800022108000800044004000000D3 +:106B00000000000000400000800080008000820043 +:106B10000400000000000200000000000900030063 +:106B2000000000000501000000000000000002005D +:106B30000000000000000000000000000000000055 +:106B4000000000080000000000000000000000003D +:106B50000000000000000000000400000000000031 +:106B60000000808580098001800100000400000091 +:106B70002000800080008000800000009010000055 +:106B800000000000040040004000000000008800F9 +:106B900000000000000000000000000000000000F5 +:106BA0000000040082004000080010002000840063 +:106BB000400000000400C0000208000000000000C7 +:106BC0000400000000008800000400000000000035 +:106BD00000000000000000000000000000000000B5 +:106BE000000008000000000000000200900000000B +:106BF00084000000044100040000010000000000C7 +:106C00000000000000000000000000000000000084 +:106C1000000000004100090000000000000000002A +:106C20000000080000000020210080000082000019 +:106C3000000040202182000400A08220000000000B +:106C40000000000000000000000800040000000038 +:106C5000000000000000000000840000210000008F +:106C6000000000004000410000A0000040000020A3 +:106C700000A0410041000000000100002000004091 +:106C8000820000040000000000400004000000003A +:106C90000000080010000000A00000000004000038 +:106CA00000000000000000090004200500001000A2 +:106CB00000000004100000000000000000000000C0 +:106CC00000000000000000000000000000000002C2 +:106CD00008000000000000000000000000000000AC +:106CE0000800A000A000A0000800020002000200AE +:106CF00000000000C000C0410400000000000800C7 +:106D00000000000000000000000000000000000083 +:106D100000400000000000000000002000000820EB +:106D20000200020000000000008800000200400095 +:106D3000009000000090008840024000200000C049 +:106D4000000000000000080000000000000000003B +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000008000800023 +:106D70008800000000A000000000000000000000EB +:106D80008000000000000000000000000000100073 +:106D900000000000A0000000000000000000000053 +:106DA00000000000000010000000010000000000D2 +:106DB00008000000000000000800000000200000A3 +:106DC00000410000008000000000001100000000F1 +:106DD00000000000000000000000000000000000B3 +:106DE000000000008200080000000800C000400011 +:106DF0000000C08082000110048004802000000098 +:106E000082808200000000000000000000000000FE +:106E10000000000000000000000000000000000072 +:106E20000000000000040000000003000208000051 +:106E300000880002009000000082008800880200A4 +:106E400003041000000003020888210000900000E5 +:106E50000000000000000000000000000000000032 +:106E6000000000000000000000000000000000849E +:106E7000800000080020040820900004000491888D +:106E80000004000409900000000000000000400021 +:106E90000800040000000000C00000000000000026 +:106EA0000000000000000800000082000000A000B8 +:106EB0000000008020001004000000040000000218 +:106EC0000002400000000000000000000000000080 +:106ED00000000000000000000000000000000800AA +:106EE000000004000400040000000008000000008E +:106EF0000100000000004000000400050000A000A8 +:106F00002080820800000000000000000000000057 +:106F10000000001000000000000000000000000061 +:106F20000000000000000000000000000000004021 +:106F30000000000020100000009000900890110256 +:106F40000000200000000000000000000000000021 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F700000C002000000000000000001000000004E +:106F800000000004000000000000000000000000FD +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB000000040C084840084828200080010000227 +:106FC000008801C000A00040002000010001000076 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000088C0009088A0C01000000000C1 +:107000000000000010900111C08910020000000073 +:107010000000000000000000000000000000000070 +:10702000050000000000000000000000000000005B +:1070300000000000888000000000800000800080C8 +:1070400000800000100000000000000000000002AE +:1070500000080008004000000000000000000000E0 +:107060000000000000000000000000000000000020 +:107070000000000000008080108000000080000000 +:1070800000002000000000090283092080020000A7 +:1070900000000000000000000000000000000005EB +:1070A00000000010000000000000000000000000D0 +:1070B000000000000000000080218084000000002B +:1070C0008009008000000000002100000000000096 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F000000000000000000041800409038290832A +:1071000000020000004000008008000080908080A5 +:10711000000000000000000000000000000000006F +:10712000000000000001000000000000000000005E +:10713000000000000000000008000200A0A1000004 +:10714000900010C090A08200000000840040000069 +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:107170000000000000000000000000020200A088E3 +:10718000C190000100000000000008001000A003F2 +:1071900004040000000000000000000000000000E7 +:1071A000000000004000000000000000000000009F +:1071B00000000000000000000000880800A0000897 +:1071C00002C0A01000200020828290000000000079 +:1071D000C0000000000001000100000000000000ED +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000100414D +:1072000090A188C000004000000000000002211092 +:107210008205A0080000000000000000000000003F +:10722000000000000000000000000300000000005B +:10723000000000000000000000000000008000804E +:1072400000800080008000000000000000000000BE +:107250000000800000000000200008000000000086 +:10726000000000000000000000000000000000001E +:1072700000000000000000000000000000000040CE +:107280000090802180840000000000004000000386 +:1072900009C1000888910000000000000000000003 +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C000000000000000801080800000800000208E +:1072D000000080000000000000000000000000002E +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:1073000088111088C08008030002000000000000FF +:1073100080008000800000000000000000000000ED +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000008080820200004008820A010040085 +:10735000C001A00040008800000000000000000004 +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:107380000000C1A1A08941C0010000000000000070 +:107390000000100088A002020200000000000000AF +:1073A000000000000000000000000000006000007D +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D0000000000000000000000A000000000000A3 +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000007000041810000E0D3 +:1074100000000000000000E000000000000000008C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:1074400000000000BCB0BCB000CF0018C0CFC0CF5F +:10745000FFFF0CCF199999090000000000000000FF +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:10748000000000000000FFF066FFFFF066FF000054 +:107490000000000000000F1B8D9999F9009000007A +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C0000000000000000000000000CF00000606E1 +:1074D000F6F6FFFF0CCF1999090900000000000023 +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000F0660000F06600CF +:1075100000000000000000000F1B8D99B9FD1098BD +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000F93FF0003C0C4B +:1075D0003C0C0F0FFFFFFCFC06F6F010F0900000D3 +:1075E000000000000000000000000000000000009B +:1075F000000000000000000000000000000000008B +:1076000000000000000000000000000036360CFC06 +:107610000F66FF0F0000000000000000F4F7D0101C +:10762000839F000000000000000000000000000038 +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000F9FFF00052 +:10765000040404040F0FFFE70C0C06F6F010F00012 +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A +:10768000000000000000000000000000000036368E +:107690000CFC0F66000F0000000000000000F4F773 +:1076A000D010008300000000000000000000000077 +:1076B00000000000000000610007000D0000000055 +:1076C00000000000000000000000000000000000BA +:1076D0005000009000000000300000000001000099 +:1076E000300000000000000000610006000D0000F6 +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:107710001061200E004D000800610007800D000080 +:1077200080610007000D0001000000000000000063 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000000039 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000E0EBC3D71F1F00000000000046 +:1077A000000000000000A0AFA0AF0000000000003B +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:1078100000000000E0EBE0EBEBFF1F1F00000000AA +:10782000000000000000000030303F3F000000007A +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:1078600000000000000000000000000000003C2CB0 +:107870003C3C000000000000000000000000000090 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000AA8A0A0A0000A0 +:1078A000000000000000141414D4000000000000C8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 +:10791000000000000000000000000000AA8AAA8AFF +:107920000000000000000000141414D40000000047 +:107930000400C00000000000000000000000400043 +:1079400000000000000020000000000000002000F7 +:107950000000000000000000000000000400200003 +:1079600000000000000002000000000000002000F5 +:1079700000020000000000000200000400002000DF +:1079800088020000000088002000040000000000C1 +:1079900020000000000004000000048000004000FF +:1079A0002000080000000400840000000000000027 +:1079B00020001020402000200000100000020002E3 +:1079C0000004102040000000000200004000000001 +:1079D0000000000020000000000000040008400239 +:1079E000000000000000000080C040000000000017 +:1079F0000090000000000000000280000001000074 +:107A00000000000000000000400000000000000036 +:107A100000000000000000000000000080200000C6 +:107A200080008002800000000000000000000000D4 +:107A300000000000000000000000000090000000B6 +:107A400000000000004090000000900000000000D6 +:107A50000000000000000000000000000000000026 +:107A60000009000900000000000000000000000004 +:107A70000000000000000000000084000000000082 +:107A800000000000000000000000040000000000F2 +:107A900000000000000000000000000000000000E6 +:107AA000000000020000820000030000000000004F +:107AB0000000000004000040004000000040000002 +:107AC00000000000000000000000000000000200B4 +:107AD00000000000000000000004000000000000A2 +:107AE0000000000000000000000000000000000096 +:107AF000000000000000000005000000020000007F +:107B00000000000800000200040000000200040061 +:107B10000000040004080400040800000000000045 +:107B20000000000800110004040004000000000030 +:107B30000400040000080000001000000000000025 +:107B4000000000000000020000000400000000002F +:107B50000000000004000000000000000000000021 +:107B600004000000200000000000840090000000DD +:107B7000200004000000000000000000820240001D +:107B800000000000000400000008000000000000E9 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000001000000900000008800BC +:107BB0002000000000009000000000000000000015 +:107BC0000000000000000000400000000000000075 +:107BD00000000000000000000000000000000000A5 +:107BE000110021000200040000000000000000005D +:107BF0000320000400000008000000000000000056 +:107C0000000000000000000100000800000000006B +:107C10000000000000000000000000000000000064 +:107C20000000000000000000400000000008028882 +:107C300000000000000010004100000800000000EB +:107C400000400000080000000000004000000000AC +:107C5000000000008200000000000000000000039F +:107C60000000A0000000000000410241001184114A +:107C700000092011A0000000000004000000000026 +:107C80000000C00000200000000000000000000014 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB0000000000008000000C000000000000000FC +:107CC00000000000000000400000009000000000E4 +:107CD0000000000000000000000000000000098417 +:107CE0000000000000000000118800008004000077 +:107CF00000000020080000880000000000000000D4 +:107D0000000000000000000400000000000000006F +:107D10000000002000000000000000000000000043 +:107D2000000000000000080000000000000000004B +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D50000000000000000000000000000000000023 +:107D600000000000000004000041000000000000CE +:107D7000000000000000004100110021000082000E +:107D800000000000020000000000000000000004ED +:107D90000140002000000020000000000000000062 +:107DA00000000000000000000000000000000800CB +:107DB0000800000000000800A0000800000000000B +:107DC00000000000000800000000000000000000AB +:107DD000000000002100000000000800000000007A +:107DE000000000000000000000000000000800008B +:107DF00000404020200000004000008400A000005F +:107E000004000000000000000004008240000000A8 +:107E10000001200000000000000000000000000041 +:107E2000000000000000000000000000118800C0F9 +:107E3000408400840004410000000000000011881C +:107E40000400409000000000000000000000080056 +:107E50000000000000000000000000000000000022 +:107E600000001000080000000000000000410000B9 +:107E700000000000041100000000000000000000ED +:107E800000000021000000080000000000000000C9 +:107E900000000000000000000000000000000000E2 +:107EA000000000000000880000000000000000004A +:107EB00000000000900000000000002100400000D1 +:107EC000880000002000000000000000000000000A +:107ED00000000000000000000000000000000000A2 +:107EE00000000000000020C0000000002002000090 +:107EF000008841000900200400000020400000002C +:107F00000000000000000000000000000000000071 +:107F10000000000000080000000000000000000059 +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F7000900800100004900400040002008200C079 +:107F800000000000000000000000001000820082DD +:107F90000884000000000100000000000000000054 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000008000800000000000000000000081 +:108000000000000000000000000000000000000070 +:10801000000000000000000002000000000000005E +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:1080700000000000000080410021000000000020FE +:108080008080800000000000000000000000000070 +:1080900080020080000000030000000800000000D3 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000005000000000000000000BB +:1080C0000000008000000000000000000000000030 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000004000100400098400880017 +:10810000C08510A008000000000000000000000072 +:108110009000108508A0840000000000000100000D +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000002000000000000000000002D +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:108170000000000000000000C01000900000A004FB +:10818000C0C00088001004040000000000000000CF +:108190000000820000820082908400001000000035 +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000100000001BD +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000008080000000007F +:10820000800000000000008004000000000000006A +:10821000000000000000008000001100000080004D +:10822000000011000000000000000000000000003D +:108230000000000000000000000000000510000029 +:10824000002100000000000000000000000000000D +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000080020080FC +:108280000000000000088080008000000000000066 +:10829000000000000000000080000000000000005E +:1082A00000000000000000000000000000000000CE +:1082B0000000000000000000000000000000008836 +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F0000000000000000000000000000000080175 +:1083000082200404040004008820C084C00000000F +:1083100000000000000000008200889040824000C1 +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:1083400000900000000000001000100088000000F5 +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:10838000000000000000600000000000000000008D +:1083900000000000000000000000000000000000DD +:1083A0000000000000E000000000000000000000ED +:1083B00000000000000000000000000000000000BD +:1083C0000000818100E007000000000000000000C4 +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000070407F4FEBEBC0C0BE8203033F3FD4 +:10841000FF3C00000000000000000000FF00C3C39C +:1084200000FF0FFF0000000000000000000000003F +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000FFAA0F0A6A +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:10848000000000007F4F7F4F2828C0C0BE823F3FC2 +:108490003F3FFF3C00000000000000000000AAAACF +:1084A000F0F0FFFF0FFF00000000000000000000E0 +:1084B00000000000000000000000000000000000BC +:1084C0000000000000000000000000000000FFAA03 +:1084D0000F0A000000000000000000000000000083 +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000BEBE8EBE00000505FFFF9B +:108510000F0FF505F5050000000000000000000049 +:10852000FFCFFFFFFF003C3C000000000000000008 +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:108580000000000000000000BEBEBEBE0000303093 +:10859000BEFF0F0FFCFC0C0C0000000000000000F0 +:1085A00000005555555555550F0F000000000000AF +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000300000003A +:108610000000000030000000000100000000000029 +:1086200000000000000030000000000100610007B1 +:10863000000D00000000000000000000000000002D +:10864000000000000000000000000000056100269E +:108650008009000000000000000000000000000091 +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C00000000000000000000000000000000000AA +:1086D0000000003C003C0000000000000000000022 +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:1087500000000000003C003C0000000000000000A1 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:1088500000000000000000003C3C3C3C0000000028 +:108860000000000000000000000000000000880080 +:108870000000200000008800000020000000000030 +:10888000000000000000200000000200000088003E +:10889000888020000000000000002180000000000F +:1088A00000000004000000000000200000020000A2 +:1088B0002000000020000020000088202000000090 +:1088C0000000000440000000000000002000400004 +:1088D00020000000200010000000000084040000C0 +:1088E00000000000200000000000000420801000B4 +:1088F00000000000410000000000400000400002B5 +:1089000000004040000000000000000080C0410066 +:10891000000000100940000040900000020200002A +:108920000004000041000020008400020500000057 +:10893000000000000008000200010000000100002B +:108940000000000200000000000000000000000025 +:1089500000000000400000000000000000000000D7 +:1089600010000000000000000000000000000020D7 +:1089700000000010001000040000000000000000D3 +:1089800000000000000000000000000000000000E7 +:108990000200000000000000000000409000000005 +:1089A00000090000000000000000000000000000BE +:1089B00000000000000000000000000000000000B7 +:1089C000000000000000000000000010080000107F +:1089D0000010000000000000000000000000000087 +:1089E00000080000000000000008000000108800DF +:1089F0000000040000000000000000000000000073 +:108A00000000000000000400000000000000000062 +:108A100000000000000000000000000000000288CC +:108A20000200000000000000000000000000000044 +:108A3000110000000004000000000400000000001D +:108A400000000082000000000000000000000000A4 +:108A500000000000000000100008000000000000FE +:108A600008000200000000000000000000000000FC +:108A700000000000000000000000000000050000F1 +:108A8000400008000000000000000000000000009E +:108A900000000000000884000000000084000000C6 +:108AA0008400402100000800001184000000000044 +:108AB000040002410000000008080808000000004F +:108AC00000A0000004020000000000000000000000 +:108AD0000000000000000000000000000200000094 +:108AE0000000000004000000000000000000400042 +:108AF00000200480000000000000000000000000D2 +:108B000000000000800000000000000000000000E5 +:108B10000000000000000000000000000000000055 +:108B2000040000000000020080200000000000207F +:108B30000000000000200000000000000000008293 +:108B40000000002100008001000000000000000083 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B70000008000980200000000000000004000040 +:108B8000004000040040000000400200020002001B +:108B900000000000001008008400084100000400EC +:108BA000022000000000002100000000000400205E +:108BB00082000000A0000000000000000000000093 +:108BC00000000000000000000000000000000000A5 +:108BD0000000000000000000000000000000000095 +:108BE000000000000000080000000000000000007D +:108BF0000004000000000000040000C000000000AD +:108C000002000000000000000000002000400040C2 +:108C10000040000000000000000000000000030011 +:108C2000030000000000000000A000000090000011 +:108C3000000000400000000000C000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000002000000000012 +:108C600000000000000000000000000000A0000064 +:108C70000000000000000000000080000000000074 +:108C80000041000000000000000000000021000082 +:108C9000000020000000000000400000840084006C +:108CA00082000041C00008000041000800000000F0 +:108CB00000000000000900000000000000000000AB +:108CC0000000000000000000000000200000000084 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000002163 +:108CF0000000000000000000004000000000000034 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000204088000020000300000038 +:108D300000000040000004000000000000000000EF +:108D400000000400210020000000000000210000BD +:108D50000000000000000000000000000000000013 +:108D60000090000000000000002000A000000800AB +:108D70000000400000820008000000040020000005 +:108D800000040000000400000000000000000000DB +:108D9000004004000000000000000000000000008F +:108DA00000008200000082414040000000040020DA +:108DB0000040000004210000000000000400002129 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF000000000000000000000000400000000006F +:108E00000000000000000200000000000004000854 +:108E10000000000000000000000000000000000052 +:108E2000000000000000000000C0008421000000DD +:108E30000000000000000400030003000000000028 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000008280 +:108E7000001000080000000000000000800000005A +:108E800000000010000000000000000000000000D2 +:108E9000000000000000000000000000101000882A +:108EA00000880820A00800200008C0200288008454 +:108EB000A0C0028840A0008200A088080000000036 +:108EC00000000000000000000000000000000000A2 +:108ED0000100080000000000000000000000000089 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F100000000000000000000000000000000080D1 +:108F200000000000800080000000000080008080C1 +:108F300000000000800080800000000000000000B1 +:108F40000000000000000000000000000000000021 +:108F50000000100000000000000000000000000001 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F90008000000000000000000000000000000051 +:108FA00000000005008000008000804000000000FC +:108FB000800080900084800080000002001000008B +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000080040000000000000000000000008 +:1090200000000000000400A000000800100104047B +:109030000200080002401009040088002001080214 +:109040002000000000000000000000000000000000 +:109050000000000000000088000000880000000000 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000080000000800000000D0 +:1090900000000000000000000000000000000000D0 +:1090A0000000000010000002000002022010000476 +:1090B000000810A0409000A0049002A104400040CD +:1090C000000208C0000000000000000000000000D6 +:1090D0000000000000000000000008010101000085 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000010000004000000000001E +:10911000000000000000000000000000000000004F +:10912000000000000000800000800000000000003F +:1091300000000080808080200020002080900000BF +:10914000000000808000000000000000000000001F +:10915000000000000000000008400004000540047A +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF +:10918000000000000000000041000000800000001E +:10919000000000000000000000000080000000004F +:1091A00000000000000000000000000000000000BF +:1091B000800000210080800000000080000080000E +:1091C000800080800000000000000000000000001F +:1091D000000000000000000000000000004000004F +:1091E000000000000000000000000000000000007F +:1091F000000000000000000000000000000000006F +:109200000000000000000000000000080040000016 +:1092100000000000000000000000000000100084BA +:10922000000000000000000000001000880088001E +:1092300084000800C0A1A082080084008404C0400B +:1092400002000400881084A040000000000000001C +:10925000000000000000000000000000000000000E +:1092600000000000000000000000000000000000FE +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000010000DD +:1092900000000000000000000000000000000000CE +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000A00000000A4 +:1092C000000000000000000000000000000000009E +:1092D000000000000000000000000000000000008E +:1092E0000000070000000000000000000000000077 +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:109310000000070041000000000000000000000005 +:109320000000000000000000000000000000C00677 +:10933000CF06FFFFFFFFC366879FFFCF00CF06FF6B +:1093400006EC009F001C20202F2F008900CF00007A +:10935000000000000000000000000000000000000D +:1093600000000000000000000000000000000000FD +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B000C0F6CFF60F0F9999C3FF879FFF6600662F +:1093C00006C006E09F9F1C1C00300F3F8989CFCF4D +:1093D000000000000000000000000000000000008D +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000000000000004C +:10942000000000000000000000000000000000003C +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC +:1094A000000000000000000098989898000000005C +:1094B000000000003F3F3F3F00000000D0D0D00040 +:1094C000FFF8E7F826F026F0FF7F7F7F090009000C +:1094D0003C301810000000000000000000000000F8 +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000000000005B +:10951000000000000000000000000000000000004B +:10952000000000000000000000009B9B9B9B0000CF +:109530000000000000003F3F393F00000000DBDB7F +:10954000DB00E7F8E7F866F006F0FF7FFFFF3D3C41 +:10955000FDFC3C3C3C3C0000000000000000000022 +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B000000000000000000000003000000000007B +:1095C000000000000000000000613006001D0000E7 +:1095D000000000000010000100000000000000007A +:1095E0000000000000000000000005610A0E050DEB +:1095F00000A00000000000000000000000000000CB +:10960000000000000000000000000000000000005A +:109610000000000000000000000005000A0805002E +:1096200000A000000000000000000000000000009A +:10963000000000000000000000000000000000002A +:1096400000000000000000000000000000000030EA +:1096500034340000000000000000000000000000A2 +:1096600000000000000000000000000000000000FA +:1096700073733F3300000000000000000000000092 +:1096800000000000000000000000000000000000DA +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000000000000000000000000000000000AA +:1096C000000000000000000000000000000000009A +:1096D00000303434000000000000000000000000F2 +:1096E000000000000000000000000000000000007A +:1096F00000007F7FFFF3000000000000000000007A +:109700000000000000000000000000000000000059 +:109710000000000000000000000000000000000049 +:109720000000000000000000000000000000000039 +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:109750000000000000000000000000000000000009 +:1097600000000000000000000000000000000000F9 +:1097700000000000000000000000000000000000E9 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000000000000000000000000099 +:1097D0000000000000000000000000000000000089 +:1097E0000000000000000000000000000000000079 +:1097F0000000000000000000000000000000000069 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 +:109830002000000000000000840000000000000084 +:10984000000000000000000400080000000000000C +:10985000000000800880008000000000000200007E +:109860000800002000000000008400030400040041 +:1098700004001000000000000000000000020000D2 +:109880000000200000000000000040040400000070 +:109890002000840000802080008000800400000000 +:1098A0000000200000000000000020040000400034 +:1098B0000000000200024090000040000000000094 +:1098C0000000000000000000400000000000000058 +:1098D0000002000040108010001000900002000004 +:1098E0000000800000010000000200200000800055 +:1098F0008000C09000000020000000000000000078 +:109900000000000000000000000000000000000057 +:109910000000000000000004C1100004000410005A +:109920000000000009C0000000000000000000006E +:109930000040000000000102018000110000000052 +:10994000000400080000000000001000A00000005B +:109950000000000001000000900000000000000076 +:109960000000000000000000000000800000000077 +:1099700000000000000001000000000000000000E6 +:1099800004000000000000000000000000100000C3 +:1099900000000000000000000000000004030405B7 +:1099A00002000000000000000000000000000000B5 +:1099B0000010000000000000400140020000000014 +:1099C0000000000000000000000000000000008413 +:1099D000000000C00000028800000000000000003D +:1099E0000000000000080000000000000020000847 +:1099F00000000000008200000400000000000004DD +:109A000000000000000004820008000000020002C4 +:109A1000040800000010040004040088040000088A +:109A20000000000000000000008400000000004072 +:109A300000020021000000400000000000000021A2 +:109A40004021000400000000000000000021001080 +:109A500000100000000000000000000001410400B0 +:109A600001400400040000008400002102000008FE +:109A700000000000044000080400900004080000FA +:109A800000080000000500040004000400000000BD +:109A9000000800000000000000000000000220009C +:109AA0002000000000001000000000000000000086 +:109AB000000088020000000000000000000000001C +:109AC0000000800000000000000008000300030008 +:109AD0000008114005824100050000000004080054 +:109AE0000000020100C000840000000000000040EF +:109AF0000000000000000000000000000000000066 +:109B000000000020000000000001000100910000A2 +:109B10000000000000000000000000000000000045 +:109B200000008000000000000000000000000000B5 +:109B3000000000000000000000090000000040C01C +:109B4000400000004000000000000008000000008D +:109B5000000000008200000000000000080000007B +:109B60000080000800000221020902080000000035 +:109B700000000000000000000000000000000000E5 +:109B800000000000002100000000000000000000B4 +:109B900000000000000000000000000000000800BD +:109BA00000000003000300000000000000000000AF +:109BB00000000000000000000000000000000000A5 +:109BC000800280A0009000900000000000000000D3 +:109BD000100000000000000009002000100000003C +:109BE0000000001000A000000004000000000000C1 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000041000000410000000000410071 +:109C3000410000900000000000400000000090047F +:109C40008400000000000000000000000000000090 +:109C50000000A00000000800080000000000000054 +:109C600000000000000000000840000000000000AC +:109C70000002000000A00040000000000000000002 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000008000800B4 +:109CA00008000000C00000000000C0000002000228 +:109CB00000000000000000000000000000000000A4 +:109CC000000009000000000000000000000000008B +:109CD0000000000000000000001000100000000064 +:109CE000000000000020094040008800000400003F +:109CF0004100000000000021000000000000000002 +:109D0000000000000000050000200000002000000E +:109D1000000000000000000000000000000004003F +:109D20000000000000000000000000000000000033 +:109D30000000000000000000008800000088000013 +:109D400000080040000800000000000000000800BB +:109D500000000000000500000000000000210000DD +:109D600000000000000000200000000400040000CB +:109D70009000000000080000000800210000000022 +:109D80000005002100210021000500000000000066 +:109D9000000400000000000000210000000000009E +:109DA00000000000000000000000000000000000B3 +:109DB0000000000000000021000000000000000082 +:109DC000000000882000004000000000000020008B +:109DD0000000000000000000000000000000000083 +:109DE0000000000800000000000000002004200027 +:109DF0000000000000000000000000000000110052 +:109E0000000000000000000000080000000000004A +:109E10000000000100000000000000000000000041 +:109E20000000000000000000000000000000000032 +:109E3000000000000000000800000000000000001A +:109E40000200000000000000000000000000100000 +:109E50000001000000000000000000000000000001 +:109E6000000000C000900002000802C000C0008294 +:109E700008820084008200849040000000000000FE +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000100000000000000C1 +:109EA00000000000000000000000000001910120FF +:109EB00010C100C000000000000000000000000011 +:109EC0000000000000000000000000000004020488 +:109ED000000400020000000000000000000000007C +:109EE00000000000000000000080008000800000F2 +:109EF0000000800000000080000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000008000000000039 +:109F200000000000000000000000000000004011E0 +:109F300003A08005000200000000000000000000F7 +:109F400000000000000000000000000000002000F1 +:109F500021000800080200000000000000000000CE +:109F60000000000000000000004100800000000030 +:109F700000000000000000000003808000000000DE +:109F800000800000008000000000000000000000D1 +:109F900000000000000000000008000000080000B1 +:109FA00000000000000000000000000000000000B1 +:109FB0000300200011001103000000000000000059 +:109FC0000000000000000000000000000000000091 +:109FD000000001000100010100000000000000007D +:109FE00000000000000000000000008500A000004C +:109FF00008000000049008009000008508A08884F4 +:10A000000000000800000008000000000040000000 +:10A0100000840000000000000000000000000001BB +:10A020000000000000000000000000000000000030 +:10A030000000008800000100001000000000000087 +:10A040000000000000000000000000000000000010 +:10A0500000000000000001010000000000000000FE +:10A0600000000000000000000000C0C000820008E6 +:10A070000404A01000A000824188088400000010A1 +:10A0800005040000000008000000000000000000BF +:10A090004000000000000000000000000000080078 +:10A0A00000000100000000000000000000000000AF +:10A0B000000000008800010001010801000000000C +:10A0C0000000000000000000000000000000000090 +:10A0D0000000000000030003052104090000000047 +:10A0E0000000000000000000000000008000008070 +:10A0F00000000800008000800000098000000000CF +:10A1000000800900090000008000000000004000FD +:10A11000000000000000000000000000000000003F +:10A120000000000008000000000000000000000027 +:10A130000000000000000003102005059011000041 +:10A14000000000000000000000000000000000000F +:10A15000000000000000048004000400044000002F +:10A16000000000000000000000000000000080006F +:10A1700000008000800000008080008080000000DF +:10A1800000000080800000000005000000000000CA +:10A1900000020010000000000000000000000000AD +:10A1A00000090000000000000000000000000000A6 +:10A1B00000000000000000002090110010001010AE +:10A1C000000000000000000000000000000000008F +:10A1D000000000000000000000A0000000000001DE +:10A1E000000000000000000000000000000000006F +:10A1F00008009000020008000000A0A088848800E9 +:10A200002000A00284841000000000000000000074 +:10A21000000000000000000000000000000000003E +:10A22000000000000000000000000000000000002E +:10A230000000000000000000000000C0010000005D +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A27000000000000000000042000000000000009C +:10A2800000000000000000000000000000000700C7 +:10A290000000000000810000070000000000000036 +:10A2A00000000000810000E000000000000000004D +:10A2B000000000000000000000000000810000E03D +:10A2C0000000880000000000000000000000000006 +:10A2D000000000000000000000000000000000007E +:10A2E000000000000000000000000000000000006E +:10A2F00000000000FF3CC3003F3FFF3C28F828F867 +:10A300005F0F430FF303F3033C3CFF3C00000000EE +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000000000002D +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD +:10A3600000000000000000000000000000000000ED +:10A37000000000000000B2B2B2B23F3FFF3C28F83C +:10A3800028F85FFF43FFFAFA0A0AFFFFFF3C0000CC +:10A3900000000000000000000000000000000000BD +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000008D +:10A3D000000000000000000000000000000000007D +:10A3E000000000000000000000000000000000006D +:10A3F00000000000000000003F3F3F3F0000000061 +:10A40000C3C33C3CFF0014003F3F3F3AC3C3FFFFC0 +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A440000000FF3C171700000000000000000000A3 +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC +:10A47000000000000000000000003F3F2B3F0000F4 +:10A48000000043C32C3C140014003F3F3F3F0082B8 +:10A49000AAAA000000000000000000000000000068 +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000000000000000000000000009C +:10A4C00000000000C300171700000000000000009B +:10A4D000000000000000000000000000000000007C +:10A4E0000000000000610006000D000000000000F8 +:10A4F000000000000000000000000000000030002C +:10A5000000000000000050000000000000003000CB +:10A510000000000005000A08050000A0000005007A +:10A520000A28050000A000000000000000000061F3 +:10A530000007800D00000000000000000000000087 +:10A540000000000000000061000080010000000029 +:10A5500000000000000000000000000000000000FB +:10A560000000000000000030000000D700070000DD +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000000009B +:10A5C00000000000000000005F5FFF0F3CBC3CBFCC +:10A5D000000000000000000000000000000000007B +:10A5E00000000000000000000000000000FF00FF6D +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000000000000000004A +:10A61000000000000000000000000000000000003A +:10A62000000000000000000000000000000000002A +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000005454FC00A0A026 +:10A65000AFAF00000000000000000000000000009C +:10A660000000000000000000000000000000C341E6 +:10A6700003010000000000000000000000000000D6 +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000000AA +:10A6B000000000000000000000000000000000009A +:10A6C0000000000000000000000000003DFF3D050C +:10A6D0003C3EBCBE00000000000000000000000086 +:10A6E00000000000000000000000000000C00000AA +:10A6F000FF550F05000000000000000000000000F2 +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A74000000000000000000000000000000035F5DF +:10A750003505000FF0FF00000000000000000000C1 +:10A760000000000000000100000004000180400023 +:10A770004080000000000000000000000008018090 +:10A780001100200000800000000010000080000088 +:10A790000000000300800000000000000000000036 +:10A7A0000000000000020003000000A000840082FE +:10A7B0000000000000400400000200000000000053 +:10A7C0000000000000000000000000000004000085 +:10A7D00000000000000000000080008001A0018057 +:10A7E00000000000040000024000000041000802D8 +:10A7F0000002001000000000000200000000000045 +:10A800004010400000000002000000008000000432 +:10A8100000000082000000400000000000000090E6 +:10A820000020009000000003000000000041002014 +:10A8300010200000000000000000100000001000C8 +:10A840000000000000020000000000000000000204 +:10A850000090000000000000004000400020024185 +:10A8600002200000400000000000000900890000F4 +:10A8700000090000000000000000000000000000CF +:10A880000002004000100000000000000000000571 +:10A8900000000011000000000000000000000000A7 +:10A8A000000000080000000300000000000000009D +:10A8B0000000000000040000000000040000000090 +:10A8C000000000000008000000000004000000007C +:10A8D00000000005020000000200020001A002A02A +:10A8E00000A00000020000000000040800000002B8 +:10A8F00000040000000400400000008404002184E3 +:10A900000000008200080004000800080082000027 +:10A91000008800000000000000840000000000002B +:10A92000000000080004020400040004000000000D +:10A93000000000000000000000000082008200080B +:10A9400000000004048200820000000400100000E7 +:10A95000000400000010008200400000004002419E +:10A960008041004100080008000000840000000051 +:10A9700000000000000200020000042100000005A9 +:10A980000000000900000105000001020003200092 +:10A990000041C000000008040000900010030021E6 +:10A9A0000009840804000003000000040000000007 +:10A9B000000200080020000800218802820088119F +:10A9C0000040000800080000002100000000000016 +:10A9D000000000000009000000030000000000006B +:10A9E00001000200000000410402210004082100CF +:10A9F00011820000000800000000000000000000BC +:10AA0000000000A000000000100000004001000055 +:10AA100000000000000000000000410000000200F3 +:10AA2000000000000000000000000000000000081E +:10AA3000000040000000000100000000008800004D +:10AA400000000000000000000000000000000008FE +:10AA500000000000100000000000000000000000E6 +:10AA6000000004088000000800C0808284A08000EC +:10AA70008400080001800000A18000000200A008FE +:10AA800000008240000000000840A000000800C054 +:10AA900001004000000200200000822100000005AB +:10AAA0000004000000000004000000400000080056 +:10AAB0000020000000000000012100000000000054 +:10AAC000001000100000000000000008000000005E +:10AAD0000000000000000000000000210021000034 +:10AAE0000000000000000000004000900100004055 +:10AAF00000408440000040022040100820A02004B4 +:10AB000020A00084000400400000000800000000B5 +:10AB10000002080080000001009000000082000098 +:10AB200000A0000000A0000000000000000000A045 +:10AB3000000841A000000000000004A00000000880 +:10AB40000000008400000000000000000000000081 +:10AB500000000008000000080000000000000000E5 +:10AB6000000000A00000000800000001002002001A +:10AB7000000000002100000040000000100200035F +:10AB800000000000000200000000000000080400B7 +:10AB900008000000080000001011080482400005B1 +:10ABA00008040040100082020004000800080009A8 +:10ABB00010000000200000000000040000402005FC +:10ABC000000800000000000000000000000000007D +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000004025 +:10ABF0000080000000880000000080000508800040 +:10AC00000000000000020002000000000000000040 +:10AC1000000000000000000420000400000100000B +:10AC2000080008000000008800000000050040A0A7 +:10AC30000000000000000000000000008000000193 +:10AC400000400000000000000000009000000090A4 +:10AC50000008000000000000040000840000000064 +:10AC600000000900001000000800000000000000C3 +:10AC7000000100040000040500000008410220213A +:10AC80000108000500400021000020040800000029 +:10AC900084080021000000000000001000040000F3 +:10ACA000000000050000000800000008002120212D +:10ACB00020000000000000001003000000000080E1 +:10ACC0000000010000100008000000080000000063 +:10ACD0000021000000000000000000000000000053 +:10ACE0000000000000210000000000000000400003 +:10ACF0000000410000000000002040000000C08370 +:10AD000000041041008420000000104020000000DA +:10AD100002000308000000000000000041000004E1 +:10AD200000000082410200821082000800000082C0 +:10AD30004100008400A0000000200000000000008E +:10AD400000080800408400000500410004200000C5 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD70000000000002000000000000000000900041 +:10AD800000018400880100A000840004000000008D +:10AD90000000000000000000000040010000000171 +:10ADA00041008800000001040040000288C000004B +:10ADB00000000000000000000100A00000000000F2 +:10ADC00003102040108882040000000000000000F2 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF00088C00090000884C0080100000001200104 +:10AE00000008002100098009008000000080000087 +:10AE1000000000000000000000001110000400020B +:10AE20000041A1100009001009000080008000000E +:10AE30000000000000000000000010000000000002 +:10AE40000000A1808280800080800000000000005F +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000008080008000800000914100101120BF +:10AE80000002C08021008900094000000005000088 +:10AE900000000000000000000000058009054000DF +:10AEA00041114080080005110903000080210010B5 +:10AEB0000000000000000000000000000000000092 +:10AEC00000000000800080118010808000000000E1 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF00000000000000000008080808000000080D2 +:10AF00000021008009088900A00005010000000060 +:10AF100000A000000000000000000000000400008D +:10AF20000008010000080100010101898200088277 +:10AF300082208400000000000000000000000000EB +:10AF4000000000000000080008018402C09000001A +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF7000000000000000000004008488C090000071 +:10AF80000020000100C000C0010800090003080003 +:10AF90000000200088000000000000000000000009 +:10AFA0000000A10100000001000101000100C00437 +:10AFB0000000008484840000000000000000000005 +:10AFC00000000000000000000203001000919091BA +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF000000000000000000000000040900888C031 +:10B000000110400489A001C00009080941A1009075 +:10B0100080000000000000000000000000000000B0 +:10B0200000052140A1210020000811080511112070 +:10B03000800000000080030000000000000000000D +:10B04000004000100005000500000040000300055E +:10B0500003410000000000000000000000000000AC +:10B0600000000000000000000000000000000000E0 +:10B070000000000000000000000000000080808050 +:10B0800080802180828082000880412005000400A9 +:10B0900008028000800000000000000000000000A6 +:10B0A0000000C089C0002100050341020200030026 +:10B0B000111000040000800080000000000000006B +:10B0C00000000000000000000000000080100009E7 +:10B0D00080808000000000000000000000000000F0 +:10B0E0000000000000000000000000000000000060 +:10B0F00000000000000000000000000080118088B7 +:10B100008080000000020009000000000103000030 +:10B110000184010140000200020002000000000062 +:10B1200000000000400920008500000001820000AE +:10B1300000000101A001A0884008A000000000005C +:10B140000000000000000000000000000000C0003F +:10B1500088899082080000000000000000000000C4 +:10B1600000000000000000000000000000000000DF +:10B170000000000000000000000000000000C0010E +:10B18000208908088800000000000000000000007E +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000081001E +:10B1B00000E000000000000000000000500000005F +:10B1C000000000000000000000000000000000007F +:10B1D00000810000070000000000000000000000E7 +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B200000000000007000000818100E0070000212D +:10B21000000000000103090F008989890000000077 +:10B220000000000000000000FF00660000000000B9 +:10B2300000000000000000000FC366FF3CFF3C3C24 +:10B2400000000000000000000000000000000000FE +:10B250000000C30F99002C202020000000000000F7 +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000003F306C6CFFF066FF000000003CF0F7 +:10B2900066FF0000000081C399FF00CFCFCF000000 +:10B2A0000000000000000000000006000600000092 +:10B2B000000000000000000000000FC366003CFF1B +:10B2C000FFFF000000000000000000000000000080 +:10B2D00000000000C30F99FFEFE3EFEF0000000054 +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000003F306C6C00F0660000000000A0 +:10B310003CF066000000000000000000000000009B +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B390000000000000000000000000FF00FF0000AF +:10B3A000FF9F0000000000000000000000000000FF +:10B3B0000000000000000000000000000000FFBDD1 +:10B3C000FFFF3F3F24E700000000000000000000F6 +:10B3D00000000000000000009F3C063C9F9F24BD31 +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000036360CFC66660F0FDE +:10B4100000000000000000000000000000FF00F33A +:10B420000000FFFF0000000000000000000000001E +:10B43000000000000000000000000000000000000C +:10B440000F0F0F0F030324E70000000000000000AF +:10B4500000000000000000000000FFFF00000606E2 +:10B4600024BD0000000000000000000000000000FB +:10B4700000000000000000000000000000000000CC +:10B480000000000000000000000036360CFC0F0F2A +:10B4900000FF000000000000000000610006000D39 +:10B4A000000000000000000000000000000000009C +:10B4B000000000610006000D000000610006800130 +:10B4C000000000003000001000000000000000003C +:10B4D000000000610006000D00000000A0610026D1 +:10B4E000000D000800000000000000000000000047 +:10B4F000000000000000000000000000000000004C +:10B500000000000000000000000000001000200803 +:10B510000040000805610A2B809D00A00280000009 +:10B5200000FF00EF0000000000000000000000002D +:10B5300000000000F3A2F3F3EFEFEF00AAC3F00066 +:10B54000002880A8000000000000000000000000AB +:10B550000000000000000000C38F828F0000000088 +:10B56000000065AA55AA00000000000000000000CD +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B590000000000000000000000000000000080B98 +:10B5A000400400FF00EF0000000000000000000069 +:10B5B000000000000000F3F3F3F3FFFFFF00AAC355 +:10B5C000F0FFD7FFD5FD00000000000000000000E4 +:10B5D00000000000000000000000FF8FBE8F000090 +:10B5E00000000000559A55AA00000000000000006D +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B6200000E000EBCF45000000000000000000003B +:10B63000000000000000000054145414040404002E +:10B640000F0F270FFF3F003A00000000000000002E +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000FFF03535000051 +:10B6A0000000E0E0EBEBCF45CF45000000000000DC +:10B6B00000000000000000000000540054000800DA +:10B6C0000000F0F0E4F0FF35003000000000000062 +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000F003535B0 +:10B7200000000000000000000041008000000080D8 +:10B7300000000085000000004004008020000000A0 +:10B7400000002000000000080000008000000080D1 +:10B7500000040004008000000000008000000003DE +:10B7600000000004000300000000000000000020B2 +:10B7700000200010C0900020000000000400000025 +:10B780000000001000000000200020004000000029 +:10B79000000000000004000000000000000800009D +:10B7A0000000000000000000000000000002200077 +:10B7B000000241C0000200C0000011010002400070 +:10B7C0000002000080000000000000900004000063 +:10B7D000000400840001000400002000000400C0F8 +:10B7E000000000C000000000000000000002000097 +:10B7F00000010001000140210091000000900000C4 +:10B8000000000000000000000000C0008000800078 +:10B810000000000000000090000000000000000098 +:10B820000000404000000000000000100040004008 +:10B830000040004000400040004000400040004008 +:10B8400001401040004020400040004000400040C7 +:10B850000040004082400040004000400040004066 +:10B86000004000000040000000000040004000C018 +:10B87000004000000000824100000000000002843F +:10B8800000000005000000000000000000000408A7 +:10B890000004000000000000040900400000040053 +:10B8A00004040000040000000200000400C000893D +:10B8B0000003008900010001000500010001008370 +:10B8C000000120850009100580050001000100012C +:10B8D0000005000100050001000900010001000150 +:10B8E00004050005000800850008000000050005AB +:10B8F000004100014182000800080004000000002F +:10B900000020000400080084000800040000000873 +:10B9100000830084008800840008000000080008FC +:10B92000000000840008000000080084004000407F +:10B930000000080800410008C021020900822021FF +:10B9400000000000000300000021000800080003C0 +:10B9500000001000204188008921A01188092003DF +:10B9600000890021000300090005004000000021BB +:10B970000121004040080005002100A00005082129 +:10B9800000A1020500000000000500000021008861 +:10B990000021002100080008000800000008002124 +:10B9A0000021000800080000000800000008000155 +:10B9B00000011000000000000000000088080004E2 +:10B9C000800000820340000000000000208200A0F0 +:10B9D00000000500002080A0000020A00000000062 +:10B9E00080200004000000080000000000010000AA +:10B9F000000010820008000000080002000500009E +:10BA00008000002080A000820000000000000008EC +:10BA10000002000000000000000000000000000024 +:10BA200000A000000000080000000000000000006E +:10BA30000000000000004011004100410000000033 +:10BA400088000000000000000820002009410000DC +:10BA50004000000010110009A00000118200000445 +:10BA6000000020000000000008801080820000001C +:10BA7000000000000000004000000000000000097D +:10BA80000100000000000000002100000000001084 +:10BA90000000000000000000000000410000000065 +:10BAA000000000000000000900000000000000008D +:10BAB000000000A000C00010000200820008008208 +:10BAC000000000820082210011080008008420008C +:10BAD000000080A021828000000000C000820008D9 +:10BAE00000A10090000020C0000800400040008439 +:10BAF00000000000000000080040000000080000F6 +:10BB0000001020000000000000C0008400080000B9 +:10BB100000100000000000A00000000000C00000B5 +:10BB2000000000A00000000000A0000000000000D5 +:10BB300000000000000000000005100000002000D0 +:10BB40000000024000048820040500830002104029 +:10BB5000002120030040024000048411002100085D +:10BB6000000000210011001100080011082110211F +:10BB7000000800000000000091050008C0880011C6 +:10BB800000048200000301080008012101110041A6 +:10BB9000000000080003000500020004000000008F +:10BBA0000003000000110008000000000000000079 +:10BBB00000000000000000C0000402022100008814 +:10BBC0000000000000000000000000000004000071 +:10BBD0000000000000000000840200090088000846 +:10BBE0000000000420000000000000880000400069 +:10BBF0008088000100000000000002001188004061 +:10BC00004000000140100000020000000800040095 +:10BC100000000000000000000000000000010040E3 +:10BC200000000000000008000010000000A000005C +:10BC30000084000000000000000900210041824152 +:10BC400002414005402140004011022140410200D4 +:10BC50000021200300210000844100830105102100 +:10BC600000000008012100008321002183000080E2 +:10BC700040030000004188000000012182210208E9 +:10BC8000000001098203C10200000003000500005A +:10BC90000008000000030003001000000004000082 +:10BCA0000000004100000000000000000000000053 +:10BCB000000000000000000000000000210441001E +:10BCC0000000000000000000000000A011004184FE +:10BCD000008200008000008200A000080002020034 +:10BCE000000000A0000002A00000028400042084E4 +:10BCF00000408008009000080800000002000000DA +:10BD0000000821082000000004000000000000825C +:10BD10000000000000000000000000000000000122 +:10BD2000000000A00000200000040000000000004F +:10BD300000000000000000000000000811100002D8 +:10BD4000908820049111000982889005101010023B +:10BD5000058888200810000800889020C003019002 +:10BD60001002C002200908024083821090028488D9 +:10BD700001C08890400901880404A01000009002CE +:10BD8000028808C08210C00090000100820091006B +:10BD9000200000000800000000000000000000017A +:10BDA000000102010000000000000000000000008F +:10BDB0000000000000000000000000000000908073 +:10BDC00000000000000020042182000900028080A1 +:10BDD000000084000000808000800400000000C19A +:10BDE0002102001180110091901000848011110037 +:10BDF00000000300000091C1411100898011000082 +:10BE000011002100800091000000800004008000EB +:10BE10000900800000008000000000000000000019 +:10BE200000411110000800020000000000000000A6 +:10BE30000000000000000000000000000000000002 +:10BE4000A000A1C1A0820480C10082898908058068 +:10BE5000030805C0A088048080058090808500804C +:10BE60008880208883910904C1001088110410C0C3 +:10BE7000000400A000410080800080080041808014 +:10BE8000000080050020000080000040008080400D +:10BE90008000000000880089008000000000000091 +:10BEA0000000118041000802210400000000000091 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000850008C00909C0C008A009C01021F1 +:10BED00002C01000C0C1098308C0080008C00808DB +:10BEE00008C0114004C0080905820840A0C103032E +:10BEF00011C1880102C1880202100800200388894C +:10BF000020100000080002058888A0022000C084DC +:10BF1000040090880000004100050082000000003D +:10BF200000000000004000000100010000000000CF +:10BF30000000000000000000000000000000000001 +:10BF40000000000011880002C0898205111000085D +:10BF5000C0892004C1C10803C089829109020488F4 +:10BF6000C0881008050401102003C19109090003CD +:10BF7000C111A02189020488C010828204080188AE +:10BF8000891082030000C00200880410C0030090E2 +:10BF900040204004000200020082008800C000002F +:10BFA0000000000000000000010000000000000090 +:10BFB0000000000000000000000000000000000081 +:10BFC000000000000000C109000480210040C1847D +:10BFD0002188C02100004108800280218320C18087 +:10BFE000800080000580411103838908910841C0C9 +:10BFF00003038504101141000000800084809091AB +:10C0000040200509A0C1000091100021000280C15C +:10C01000110000008080200000800080000011805E +:10C0200000000000000000000002111010110010BC +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000002000000003CD +:10C05000A10240800200A0020089001000008005BB +:10C06000000280000000000041100980020011035E +:10C0700090849190048010100000000200000000E5 +:10C0800080008089000000000000004000000000E7 +:10C0900000000020000500800000800080110000EA +:10C0A0000000000000000000000008090811030063 +:10C0B0000800000000000000000000000000000078 +:10C0C0000000000000000000000020C0021088886E +:10C0D000040109C0A1028988100120040202888895 +:10C0E000100020000820888840000588881002027F +:10C0F0000300081009091182C00002008802101014 +:10C1000040000800080810100200000002010202AE +:10C11000101082000001002000100000C000040088 +:10C120008800880000000000000000000188010174 +:10C1300001000100000000000000000000000000FD +:10C1400000000000000000000000000000000000EF +:10C15000000048420000000000004842810000E06A +:10C1600000004842810000E000004842810000E0F9 +:10C1700000004812810000E000004842000000E09A +:10C180000000484200000000000041810000000063 +:10C19000000000005011480000E0070000000042CD +:10C1A0000000070000000000000000000000810007 +:10C1B00000E000000000000000000000000000009F +:10C1C00000000000000000000000000000000F0F51 +:10C1D0000F8FFF20FF000A3E0A0AFF20FF00000029 +:10C1E0000F0F8080FF8000820F8FFF00FF10282F2D +:10C1F000000F8080FF807D7D7C7DA0A0AFAF3F3FA2 +:10C200003E3FAEFFAAFF82828382F4F0000000006E +:10C2100003030203FF5500550000000028FA7DFAD1 +:10C22000F0FF3A3AAAFF3CF00000000000000000D6 +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000082202000000A0A0A0A20200000B4 +:10C2600000280F2F0000FF0000000F0F000010102B +:10C27000000F000F0000FF0028282C28A8A0ABAF5B +:10C2800030303430A200AA00D7D7D3D7FFFF0B0F2E +:10C290000000F3F3F7F3F7550455000000002850B1 +:10C2A0007D50000F3A3AAA003CF000000000000068 +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D0000000D350505000000500D35050500300D0 +:10C2E00000003030303010001000303030300300AB +:10C2F0000000F0F0000050000000FFD5FF550FFFD8 +:10C300000FDFFC7CFCFC0000FFFFF080F000F00081 +:10C31000F0FF000030B03030C3C3C3C300000000E2 +:10C320005FFC50FC00000000000000000000000066 +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000505050503C3C3D3C505050506C +:10C360005755555575303030FFFF1000753030305F +:10C3700057555555F4F014007C3C3C3C00150055D5 +:10C380000F000F080C2C0C0CC3C1C3CBF0FDF0FF49 +:10C39000F020F0F70000F3F1F3F30002FFF70000E4 +:10C3A00000005F0C500C00000000000000000000C6 +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D00000000000000040618006002D1002406156 +:10C3E0008006002D100240618007802D1002406100 +:10C3F0008007802D1002406180068021100240617C +:10C4000080008021100240618007002D10024061F1 +:10C410008006002D1002000040618006002D000201 +:10C4200005610A0F850D00A0A0000A28009000A059 +:10C430000000000000000000006100048005000012 +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000DF00FFFE +:10C46000EFFF000000EF00EF0000000000FF00EF12 +:10C470000000000000000000C0CFA0A0000010BA23 +:10C48000FDFDFD053CBA3CBA0000000000000000C4 +:10C4900000000000F0E8F0F00000000000004DB2E5 +:10C4A00055AA00000000000000000000000000008D +:10C4B0000000000000000000000003010350000025 +:10C4C000002000000000000000000000000000004C +:10C4D000000000000000000000000000000000DF7D +:10C4E00000FFEFFF000000FF00FF0000000000FF62 +:10C4F00000EF0000000000000000C0CFAFAFFFFF62 +:10C5000015BF0505FD0500AAFFFA000000000000A8 +:10C510000000000000000F170F0F000000000000D7 +:10C5200055AA55AA0000000000000000000000000D +:10C5300000000000000000000000000003010305EF +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C56000C303410100E0E0E007070700000000000E +:10C5700007070700000000000000000055AA5CA3A8 +:10C58000F3F330303DFF3D05E0EBFCFF0000000021 +:10C59000000000003C3C363C0000000000000000B1 +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000055AA7C +:10C5C00065A6303C303C0000000000000000000088 +:10C5D000000000000000000000000000000000005B +:10C5E0000000FF0F550500EBEBEBD7D7D70000009D +:10C5F0000000D7D7D700000000000000000055AAB7 +:10C6000055AAFFEB002835F53505000B3C3F00002F +:10C61000000000000000C3C3C6C30000000000000B +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400055AA55AA303CC03C000000000000000084 +:10C6500000000000000000000000000000000000DA +:10C66000000000000000000000000008000420009E +:10C67000000001000004000000040000010021008F +:10C6800020000000000020800000010800000100E0 +:10C6900000000000000000030080008000402080B7 +:10C6A00000030000000000002080000400080004D7 +:10C6B00000040000008000200020000400000000B2 +:10C6C00000050005000000200480008001000088B3 +:10C6D0000084000000040003880000000000000047 +:10C6E00082000000000000000000000000000000C8 +:10C6F000800000402000000000000000000010004A +:10C700002000800000000000800400020200000001 +:10C7100002000000000200000004002000040005E8 +:10C7200021040000000200000000002000010000C1 +:10C730000083000100001120000100010000000042 +:10C740000000000040000000000100100008100080 +:10C7500000040004000000000000000000000000D1 +:10C7600000040000000000050000000500000010AB +:10C77000000400000000008000000000000000082D +:10C780000000000004400000000000000000000065 +:10C79000000000000000000590001000002002A032 +:10C7A00001A001000000200800000000200000009F +:10C7B0000080820000100000000000000000000067 +:10C7C0000040000000000000009000000000010494 +:10C7D0002084008401040004100000000000000018 +:10C7E00000000000000000040084000800080004AD +:10C7F0000000000800000088000400100084000809 +:10C800000002000400080000000005880084000009 +:10C810000084000200080000000000000004001175 +:10C820008041024102100000800200840000800864 +:10C8300000080004000000C000820000000000109A +:10C8400000000008000800080010001000000004AC +:10C850002009800941091009000000840000000837 +:10C860000008000800080008C02100052021001071 +:10C87000000300400084000800210021002100087E +:10C8800001210021C00800114021000800210008FA +:10C89000002120050210104000210141A02141216A +:10C8A000200500402008020300000821002100218B +:10C8B0000021000000080040000800A10021002124 +:10C8C00000210005000000000005002100020021F9 +:10C8D00000101000000000020021000800090008FC +:10C8E0000021000000000000004000C000008300A4 +:10C8F0000300020005080004050800824100410011 +:10C90000210810200320088405000308000000A06F +:10C91000038800A08084800000000008040000A0BC +:10C9200004088000000080A08000000041842120D5 +:10C9300041A0030000A0000000400000002000A073 +:10C9400000000000000000000000000000000000E7 +:10C9500000000001000000080002000800000000C4 +:10C9600000000000000000000000000000000000C7 +:10C9700020110000000002000200000010008800EA +:10C980000200210002002000000202020200020058 +:10C990000000000000004000A0000000A100000016 +:10C9A0000005841103808200000902800000084114 +:10C9B0000000A1008200A00000000000900482009E +:10C9C0000000001100000000000300000000000053 +:10C9D00000000000084100880108000800880000ED +:10C9E000000800000004000000040000000000A097 +:10C9F000008480A00000001080C080000000A0A083 +:10CA000000A08000828480A080004008C0009000C8 +:10CA1000800000A000000000000000400000400076 +:10CA20000088009000008240030000C080200000C9 +:10CA30000008410820040000000021000008000058 +:10CA4000000000080090000800080000000000003E +:10CA500000C00000001000040009100100C100091E +:10CA6000000000080000000000900000020000002C +:10CA70000000004002040321000000212005A00462 +:10CA800000030000000020110010A00800050003B2 +:10CA900000210002828400838208C0830005820096 +:10CAA00001A100850100012100000221040504000C +:10CAB0000000000300800010010000008200000060 +:10CAC000A041000004000000000000000000000081 +:10CAD00008000041000000200000000000030000EA +:10CAE0000004000800000000000500000000000035 +:10CAF0000000000009C08001A008004000048590EB +:10CB0000408509880004219080840084000021A0D1 +:10CB1000008409A000080505004004100304090072 +:10CB200008000208040410A020A0000080C080A01B +:10CB3000A0A000000000001000A102A00200000060 +:10CB40000000038400C08008000003100000000003 +:10CB5000000003000308008400A100C000000000E2 +:10CB600000000001000000000000110000000000B3 +:10CB70000000000000219021002120080121002157 +:10CB80008204210500210200832100050021020406 +:10CB9000002100050021200340210021020500059D +:10CBA00010210000001000210021000521050408CB +:10CBB00082112008000020412000202120000010C8 +:10CBC000002000040000000000050000000200003A +:10CBD0000203000000050011000000210004000015 +:10CBE0000003000000100000000000000000000032 +:10CBF000000000000010000000000000800002A003 +:10CC000000A0008582000088800010002000000045 +:10CC100080010004000000000400200000008000EB +:10CC2000000080002000000100002000000004003F +:10CC30008300008800000000809080008000800059 +:10CC400003001100000000000000000003C02010DD +:10CC500003008000000000840000000000000000CD +:10CC600000000000000000000000000000040004BC +:10CC70000000000020002000020201A0020208883B +:10CC800011904120880888080303082040021008FA +:10CC9000C00908848809C008080341C088C010047E +:10CCA000001108000009104100030221028890824F +:10CCB00088C000900104C010000000C0008200087D +:10CCC00090C0000000000000000002200088000466 +:10CCD0009008000000000000000040C0001000406C +:10CCE000100401010100000000000000000000002D +:10CCF0000000000000000000000000002100000013 +:10CD000080008800A1800080008009419004800993 +:10CD1000008902C19104C08800898208A1058002AF +:10CD2000801102418011008880C0404141C00084D0 +:10CD3000808280800080020000000000008000806F +:10CD4000048080000000000004000000800000005B +:10CD500000000080000000000000000091800080C2 +:10CD60000080800011410921042000000000000023 +:10CD70000000000000000000000000000900028820 +:10CD8000028089849100039008918983410040A02A +:10CD90008488C188C080A0A004C1C190030009217B +:10CDA000419109030080800500808083C0800811C4 +:10CDB000C002C1020020800080C080800000000509 +:10CDC0000000802000800005000000050000000039 +:10CDD0000003008080008000000000000000800050 +:10CDE0000040801000802000410020114109000017 +:10CDF0000000000000000000000000000000898822 +:10CE000002C1100809C0088804C1850909C1048845 +:10CE10000383821109C109080840000911830388AE +:10CE2000024104090189841010888408080921201E +:10CE30004103A1008300000082001088C090000020 +:10CE400040000200A001A0900000000000000000CF +:10CE5000020010019002900408000000000002008F +:10CE6000A00090018402840801000000000101017B +:10CE700000000000000000000000000000000000B2 +:10CE800011100084C004111109100004C0020391A4 +:10CE900020109188C085110804100110C0081109E4 +:10CEA0000110000009021190051001101108100274 +:10CEB00004000100A008110300004040900489C054 +:10CEC0000000C0000800000810020000040000007C +:10CED0000000101000409004020800000000000054 +:10CEE0000000409000020002A08800000001010044 +:10CEF0000101000000000000000000000000000030 +:10CF00000000C102009080111183C10900838009D3 +:10CF10001103C102910291A11191410911828290E4 +:10CF20001185410210090310911141004080838056 +:10CF300004000002114191839120000000808000D4 +:10CF4000C18000000000800000800500000080001B +:10CF500000000500000000808000808000000000CC +:10CF6000000000000000008000008080001121030C +:10CF70000920114100000000000000000000000036 +:10CF8000000000004109058905008911C182840261 +:10CF900005808903218902000200900988A1A1006F +:10CFA00009A1830941041009050082112021911172 +:10CFB0004100030040890302030008028009008841 +:10CFC000000000000000000400000000000000005D +:10CFD0000000000000000011800000008000000040 +:10CFE0000000008000000004008000000000418478 +:10CFF00020110300400000000000000000000000BD +:10D0000000000000000003108983030208000908E3 +:10D0100010101108080103C090100202080009C195 +:10D0200082101009080003A0010211021000010182 +:10D0300010111004040001C0000411020300C0001C +:10D04000C0890404900000000000000200020000FB +:10D050000000000000000000100120401004080043 +:10D0600000000004000800001000100410880200F6 +:10D070000189000101000100000000000000000023 +:10D080000000000000000000810000E000004842B5 +:10D09000810000E000004842810000E0000084427E +:10D0A000880000E000008442810000E000004200AF +:10D0B000880000E000008400818100E00700840017 +:10D0C000810000E00700000A0000818100E0070005 +:10D0D0000000480000E000000000004200000700DF +:10D0E00000000000000000000000008100000700B8 +:10D0F0000000000000E00000000000000000000050 +:10D1000000000000000000000000FE0E7E7EBD2436 +:10D11000FF00F978FF3CBD2DB424FEF27E42B4B48A +:10D12000BD24F978FF3C3FFF366656566666C366F7 +:10D130003C995C3C5C3CCFFFC0000C0C0C0C00FF2D +:10D140000000FC0C6F60FFF066FF000000000000B4 +:10D1500000FF0000000000000000000076767E6600 +:10D16000FEFC66FC00000000000000000000000261 +:10D17000786078F900000000000000000000000066 +:10D18000000000000000000000000000F202424227 +:10D19000B4B4F0F0E160C300FF0FF0000E027E4275 +:10D1A000F0F0FF00E160C300300036669595999974 +:10D1B00066669999C5C3C5C330003FFFCFCFCFCFB7 +:10D1C00000FFFFFFFC0C6F6000F066000000000035 +:10D1D000000000FFFFFF0000000000000000F0F072 +:10D1E000FF00E6C066C00000000000000000000074 +:10D1F00000000000FFFF0000000000000000000031 +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000FF3CF636606F303F20E02FEF272724E772 +:10D2A000C3FFC6F606F63636C3FFC6F6E8E82B2BF4 +:10D2B000F00FB44BCA3ACA3A0404FBFB666699996C +:10D2C000F0F0C2FEE724CF0C36360CFC666600FF99 +:10D2D000000095569966F404FD0D00000000000062 +:10D2E000000000FC0FFF666E767E00000000FFFF6E +:10D2F000FFFFF6904242F0F0999900000000000014 +:10D30000000000000000000000000000000000001D +:10D310000000003C063666663C3C24E724E70F0F1D +:10D3200000FF003C063600FF3C3C003C0636F0F0B7 +:10D330000F0FF00FB44BC33CC33CF7F708080CFCCD +:10D34000F303F0F080BCFF00CF0C36360CFC00FF7E +:10D350000F0F000099669966FD04FD0400000000AF +:10D360000000000064646F6F000FF0FF0000000019 +:10D37000FFFFE7E7F690DBDBF0F0F03C0000000099 +:10D38000000000000000000000000000000000009D +:10D39000000000004061800680211002406180068C +:10D3A00080211002406180048029100240618004C5 +:10D3B00080291002406180028021100240618004B7 +:10D3C000802D000280610024801900001061200F70 +:10D3D000804D0008000000615027800D00000061B2 +:10D3E0000007800D00000000002000000000000089 +:10D3F00000000000000100005020000000000000BC +:10D40000000100000000000000000000000000001B +:10D41000000000000000E8E800C32000203CE8E82D +:10D42000003C002830305504FFFEEF20EF2C14BEE6 +:10D4300014BEE3EF202CE8E8003C2020202C3CF038 +:10D440003CF000000000D7D28782033F033F00007A +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D480003C0FFF3C3CFFF03C0000000000000000AF +:10D490000000000000000000E8E83CFFF7C3F7FFD1 +:10D4A000E8E8C3FFFFEBF3F30004AAFEEF20E3205C +:10D4B00005FF00FAEFEF2020E8E8C3FFEFEFE3EF0E +:10D4C000F5F0A0F000000000C7C2C7C207072F2F69 +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D5000000003C0F003C3C00F03C0000000000002C +:10D510000000000000000000000000000000FF3FCD +:10D52000A03000000000E1F5A0B482825F55FF3F0B +:10D530008282B2B20F55FFF30A0ABE82BE82FF3F5B +:10D54000003AF000EFEF0000000082825F55FFF329 +:10D550000A0A0000000000000000000000000000B7 +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D5800000000000F5055F5F3CFFF03C000000007C +:10D59000000000000000000000000000000000008B +:10D5A0005F3F003000000000FFFF0000BEBE50558E +:10D5B0000030D7D7B2B2555500305F5FAEAEA2A2F1 +:10D5C000FF350030F0FF040400000000BEBE5055DF +:10D5D00000305F5F0000000000000000000000005D +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000F50550503C00F03C000018 +:10D61000000000000000000000000000000000000A +:10D620000004000404040000210000082003000599 +:10D6300020110000000000000000001000080000A1 +:10D640000000008020040480008400020003002009 +:10D6500000050000000500000003000200000003B8 +:10D66000840000008200200800100080000000827A +:10D670000089000800108800000000800080002061 +:10D680000000000000050010000001000000008301 +:10D69000000000000000200800000000000000035F +:10D6A0000000000020000082400204000000000092 +:10D6B00000008000000040000000000000000000AA +:10D6C000000000000002000000042003000100042C +:10D6D00000900004000000000000000000904040A6 +:10D6E000000000000040009000C000000004004066 +:10D6F00000050004410000000000000000200020A0 +:10D7000000C10000000000000000000020004100F7 +:10D710000004000000000000000000000000000005 +:10D720000008000000000000000000000080000071 +:10D7300000112005000000000000001100000000A2 +:10D74000000400000000000000020000000010853E +:10D750000080000900000009000000000003000232 +:10D760000000000000000003000000000000002195 +:10D770008400000000000000000000000010000015 +:10D780000000001000000000000000000000200069 +:10D790000200020002000000000000000000000083 +:10D7A00000000000000800080008000800880020B1 +:10D7B00000840008800800040082000800000008BF +:10D7C00000C0000000080082000800020000000005 +:10D7D00000040002008400000084008800840084AB +:10D7E0000000000800000084009000100008000005 +:10D7F000008400840000000200020084000400098C +:10D800000008000000100088008400880088008460 +:10D8100080000000000800080008000000000082EE +:10D82000008400000000001000102021000000050E +:10D8300000002000000020008821004009000000B6 +:10D8400000000021A00200400408000002000000C7 +:10D85000820800082005000000000000000288087F +:10D860000041001000050000000300080041900581 +:10D87000200800052000000000212000008020205A +:10D8800000C1002000410000000500000008000069 +:10D89000004000200000000004000009000300090F +:10D8A00000210008000000000010411003102110AA +:10D8B0000010111000000010801020100010200037 +:10D8C0000010001003C00010001000100010001025 +:10D8D000001000A00010888221100010001000101D +:10D8E0000000000000C00090000000000000008266 +:10D8F0000000880000008000008400008000000418 +:10D90000800000100000002000000000000008005F +:10D9100000000002000800020000000000000008F3 +:10D920000000000000000090000000000000000265 +:10D93000000000000005040000020080000000104C +:10D9400000040000A00000000000840000000000AF +:10D950000000002000000021000000000000000383 +:10D9600000000009000000058800000000004011D0 +:10D9700000000400000000004000000002880002D7 +:10D980000089000004000000000000050000000005 +:10D9900000000000000400000080000000000108FA +:10D9A00000048411002100419000010000C0000823 +:10D9B00000000004000400008000000100040000DA +:10D9C00000010011000000A0000002A000000008FB +:10D9D00020042004000010000088000003C00000A4 +:10D9E000000800C000000000000000000000100857 +:10D9F0000000200000840000000000A011000009C9 +:10DA00000000000200000000000000000000000014 +:10DA10000000000000000000100000020000009064 +:10DA20000200000000000000000000000884000068 +:10DA300002210010002004000080014000000010BE +:10DA400000000100010000000000000000000000D4 +:10DA50000000000000000000204100040000000061 +:10DA600000050008000000000004000000000000A5 +:10DA700000000000040000000800C0410000004158 +:10DA8000000800000000000000200000000000006E +:10DA900008100000000090020000000000000000DC +:10DAA0000000000000110009002100040000000037 +:10DAB000028800C00084200041C000200411111021 +:10DAC000000002A02008208400080010200002842A +:10DAD00000880410020011A000008888000100885E +:10DAE000008400A00000000000000000008400008E +:10DAF0000000000000000000210000000000000005 +:10DB00000000000021000988000000000000000063 +:10DB100000000200000000000808000000000000F3 +:10DB200000000000000000080008000000000000E5 +:10DB30000000000000000021001000002000001084 +:10DB40000000004190040141C010200220000204A6 +:10DB50000202000000000000000804000040002055 +:10DB6000000400080008004100080002000800004E +:10DB70009000000000000000200800210000C0000C +:10DB800000008208000240030008881000410000E5 +:10DB900000000000000000000000004100880100BB +:10DBA00000000080000000000100000000210000D3 +:10DBB000000900050000000000002008000000909F +:10DBC0000000000000000001200000000000000034 +:10DBD0000000000000000000000000000000000045 +:10DBE00000000000000011000000000000C0000064 +:10DBF0000000000000000000000000000000000025 +:10DC00000000200000000001000000010000009062 +:10DC100000000000110000000000000000000302EE +:10DC200020C0000041040984400802A0050000C093 +:10DC30001108110000000000000000000000A0100A +:10DC4000000400A0C0080000000000000000000068 +:10DC5000000000000000000001008400000000003F +:10DC600000000800000000000000000000000000AC +:10DC700000000000000000000000000000000000A4 +:10DC8000000001000400000000010000010100008C +:10DC9000A0A09088008204040000000000000000A2 +:10DCA0000000000002000000000000000000000072 +:10DCB0000000000000000000000000000000000064 +:10DCC00080800000000000800000000009000000CB +:10DCD0000000000000000000000521058004001184 +:10DCE000110021008400000000000000000000007E +:10DCF0000000000000000000000000000000000024 +:10DD000000000000020084000000094100402010D3 +:10DD10000003808080000080008000000000000080 +:10DD2000000000001100801000030000000000004F +:10DD300000000000000000000000000000000000E3 +:10DD400000000000001100800000000900000040F9 +:10DD50000000000000000000000040002000020061 +:10DD60002109208904002008111000000000000093 +:10DD700000000000000000000000000000000000A3 +:10DD8000000000000009000000080000030040003F +:10DD900008004100800000400000800000000000FA +:10DDA00000000000400000001000000080000003A0 +:10DDB0008000800000000000800080000000000063 +:10DDC000000000000000000100080000000000004A +:10DDD00000010000000000000000000001A00000A1 +:10DDE000010001820090010001000001000000001C +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000010000000011 +:10DE1000010000000184A000C0014000900000004B +:10DE200000000000000000020000020000001000DE +:10DE30000001100008200000040008000800000095 +:10DE40000000000000000404001100C0C0A0000099 +:10DE500004000000010000000000000000000001BC +:10DE60000101840100010000080100010000000020 +:10DE700000000000000000000000000000000000A2 +:10DE800000000000002000000001C000200101018E +:10DE90000100400089000000C00200040090A004BE +:10DEA000000000000000000000010100000100006F +:10DEB0000000000002000000000000000000000060 +:10DEC00000000000000000000000008800100210A8 +:10DED0000000800000004100000000000000000081 +:10DEE00000212008090400040010801000200220F6 +:10DEF0000000000000000000000000000000000022 +:10DF0000000000000000008000004120801180041B +:10DF100008204100A1008800080000000080008067 +:10DF2000008000000000000000000010110400212B +:10DF300000000000000000000000000000000000E1 +:10DF40000000000000000000000080098000800048 +:10DF500000000004000000000000000000000000BD +:10DF600000000080090005000502020020000900F1 +:10DF7000400300000000000000000000000000005E +:10DF8000000000000000000000000000000200008F +:10DF90000000000000400000000000058004800038 +:10DFA0000000000000000000000000002104040048 +:10DFB000200021110000808080808000000000008F +:10DFC000000000000000000000000000C00082000F +:10DFD00090000400000000000000000000000000AD +:10DFE000000000000040000000000001008201006D +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E0100000000000000000A100000000000010004F +:10E020001002008440000000000000000000010118 +:10E03000008800900101040040400808080000002A +:10E0400000A000900000000000000000000000811F +:10E05000000007000000810000E00000000A00004E +:10E0600000000000000000000000000000000000B0 +:10E0700000E00000000000000000000000000000C0 +:10E080000000000000000000000000000000000090 +:10E09000810000E000004200880000E000008800ED +:10E0A00000810000070000000000000000000000E8 +:10E0B000810000E0000000000000000000000000FF +:10E0C0000000000000000000000000000000000050 +:10E0D0003C0017177141717D000000000000000036 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000C300287DF8FD00000000000092 +:10E1300000000000000000000000CF0C0000000004 +:10E1400000000000000000000000000000000000CF +:10E150000000FFC317175541557D00000000000067 +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A0000000000000000000287DF0F000000000EA +:10E1B000000000000000000000000000FFFF30F33E +:10E1C000000000000000000000000000000000004F +:10E1D000000000000F140FBE00000000000000004F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E22000000000000000FF141F1FFF07FF04000094 +:10E230000000000000000000000055FF55FF000036 +:10E240000000C3C341EB00000000A0A000F00000EC +:10E250000000000000000000FFFF000000000000C0 +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A0000000000000000000D7141717D7D714147F +:10E2B00000000000000000000000000055005500B4 +:10E2C0000000000000FF41EB00000000F5F5FFF04A +:10E2D0000000000000000000A0610026000D00000A +:10E2E00000610007800D0000000000000000000039 +:10E2F00000610006000D000000610007000D000035 +:10E30000000000000000000000000000000000000D +:10E310000000000000000000000000610007800D08 +:10E3200000000061000380050000000000200000E4 +:10E3300000000000000000000000006100048009EF +:10E34000000080000000000000010000000000004C +:10E350000000000000000000000000000000FF0FAF +:10E36000000F00000000000000000000000000009E +:10E3700000005D005D00FF0FAA5FF5FCF50C14FACC +:10E38000BEFA0000000000000000000000000000D5 +:10E39000000000000000000000000000000000007D +:10E3A000FA28FA7D000000000000000000000000D4 +:10E3B0000000000000000000000000002D052DAF4F +:10E3C0003C3C3C3C0000000000000000000000005D +:10E3D000000000000000000000000000000000003D +:10E3E000FF0F000F00000000000000000000000010 +:10E3F000000000000C000C00FF0FBE5F05FC050CC8 +:10E400001450BE500000000000000000000000009A +:10E4100000000000000000000000000000000000FC +:10E4200000005028507D00000000000000000000A7 +:10E4300000000000000000000000000000002D05AA +:10E440002DAFAFA0AFA00000000000000000000052 +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E4700000000000000080A0C0F0E1FFE10000000B +:10E48000000030AF3FAF00000000000000000000BF +:10E49000000000000000000000000000000000007C +:10E4A00000000000000000007D7DAF050AFA3F3F3C +:10E4B000000000000000000000000000000000005C +:10E4C000CACACACAC355C3550000000000000000F4 +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000082AAC3FF41FF4100AD +:10E500000000000030A03FA000000000000000005C +:10E5100000000000000000000000000000000000FB +:10E52000000000000000000000002828AF050AFAE3 +:10E53000303000000000000000000000000000007B +:10E540000000CACACACAC355C35500000000000073 +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000001003A +:10E5E0000000001100000003C00800040041000901 +:10E5F00000004003008500090008000000800000C2 +:10E600000011000040100000001000000000000099 +:10E610000080000000000000400020900003000087 +:10E620000000000000C10000001000020080000097 +:10E630000000000000080000880088058800000035 +:10E640000000000000000008000040000000000082 +:10E6500084000000000800000000000000850000A9 +:10E6600008000000000000C00090000000000890BA +:10E670000000000080900002000000002100000265 +:10E68000000000000000000000000000000000008A +:10E690000000000200000000000080008004000074 +:10E6A0000000000000020004000000000001004023 +:10E6B000419000C000000000410000C000040000C4 +:10E6C0000000000000C0000000000000000000008A +:10E6D0000000000000000000000000C00000000476 +:10E6E000000000000000000000000000000000002A +:10E6F0000008000000040011001100001080000854 +:10E7000000000000000900000000000010020108E5 +:10E710000003020300412002000002110208020867 +:10E720000000004000000000200300000210002153 +:10E730000000004000000000000000000000000099 +:10E740000000000000000000000000040000004184 +:10E75000000000100000000001C1004000000000A7 +:10E760000000000800000000008200000000000817 +:10E770000000000800000084000400000084000283 +:10E78000000400840084000000A0000000080009CC +:10E79000409000108000009000010088800080847C +:10E7A000808900000001000000088000000480044F +:10E7B0000008000800010010000800000010001010 +:10E7C00000100010001000840084000800410008C0 +:10E7D00003400084001000000084200400000000BA +:10E7E0000000028800000000000000080000000394 +:10E7F000842102080000000284000040000400029E +:10E8000000210004880000030011200200210021E3 +:10E81000002100000002004000000405000800087C +:10E820000002881100000008000300000008000238 +:10E830000010000300000000002100000000004064 +:10E840000000002100080005000800080021004128 +:10E850000040002101050000000500040005012121 +:10E8600000000002000200000000000000000000A4 +:10E8700000900082008400000005008400824008AF +:10E88000020000400000410000100000418800002C +:10E8900000100000000000A0000000000084000044 +:10E8A00000000001001000000500008200000000D0 +:10E8B000000021080000000000000000000000002F +:10E8C000090000000000000000000000090009002D +:10E8D00000000001000020080008000800090002F4 +:10E8E0004000000021000000000000000100400086 +:10E8F00001C000C000000000008000C000C000C0D7 +:10E9000000A100A10000218000A100C0008001A1A1 +:10E9100001850090084040C1008000800080008098 +:10E9200000850085108200C1000000800084004145 +:10E93000008808809080048204841088008000840D +:10E9400000820080009108890821108000800080EA +:10E9500000800084000400A182C001900080C08477 +:10E96000009100800880040004800000000008007E +:10E9700080000841004141A0008200400041004168 +:10E9800003410040004000A04040004000410040E2 +:10E9900040404040004000A1804000400040044012 +:10E9A00000400040004000030040000000400041E3 +:10E9B0000000004000400040004004401040004083 +:10E9C0000040004100400040004000001040004076 +:10E9D00000400040094000900340034002400040D6 +:10E9E0000041004000400040089008400041000005 +:10E9F00000000210040200080000000200100009DC +:10EA000000088404884040110004000000058800CC +:10EA100000044011001000100010822104000202C6 +:10EA200000000000000084001040100000000003FF +:10EA300000080040204084080003000840214008EE +:10EA40009010902100000040000082210040000052 +:10EA50000000000090A12041000000A140400010F3 +:10EA60000000C1022005A000C000211120400000CC +:10EA700000080000000100010010008200C1020037 +:10EA80000000000000000000000000000000000086 +:10EA900000A00008008810C0000040C00000000076 +:10EAA0000000000000000000000000014100000024 +:10EAB000000000000001859000C0000000C00000C0 +:10EAC000000010000000000400000000000400012D +:10EAD0000000000000000002800000000540050169 +:10EAE000001000002002800000000000A000800153 +:10EAF00000000000000400200100000500210000CB +:10EB00000005000301800021000300000121010332 +:10EB10000003000000000100008800A14121400026 +:10EB20000010000800002002014000000002000860 +:10EB3000000001042021C10300050008101000009E +:10EB4000000800210021C100000300A100400021B5 +:10EB500082A110000100004000212083008082215A +:10EB6000008011100240A10001040421900901401D +:10EB70000085000000000000000008C0000009003F +:10EB80000000000011A0400200000082000002000E +:10EB90000200000000820000408241400040400826 +:10EBA0000084008400A000080883408300820005E0 +:10EBB00003820000400480084000000000001100B3 +:10EBC000002000000082000040004000004020A122 +:10EBD000000000020008020800C100040004000256 +:10EBE00009002004401020012084020802002100B6 +:10EBF0002091000400A0000200200002000000009C +:10EC00009000000100C100898809000000C10021B6 +:10EC10000003000001C000108800000100C00000D7 +:10EC20001002020200C000002010000800C0A00076 +:10EC300082009002000008C101029000002002C082 +:10EC40000008000008840802880400402008022010 +:10EC5000001000020202084000200008020205C065 +:10EC60000011000308A110A0C10200028408049052 +:10EC70000503900240100080000000000000000921 +:10EC8000081000080008008800100085000910889E +:10EC900000830004000410A000A1001000080090F0 +:10ECA0000009008200000080000000000080008059 +:10ECB00090028000008000008090030300000000AC +:10ECC000118000800000000008001180008000809A +:10ECD000800000800000808008801180008000009B +:10ECE000A00900A10008900880022109009000847A +:10ECF0008800A1A0008400048000800900908000AA +:10ED000000000000000080000000800009009090DA +:10ED10008400030084008400000080110000800053 +:10ED2000000020100800820020000320050085005C +:10ED30000200880811009105000090008010030077 +:10ED400080118200202182002080800009A1908013 +:10ED500083800000008280808080000000A180917C +:10ED60008080908089919080C0890280059009916F +:10ED700089039180211089118903400002008410C9 +:10ED80001000000002000000C0000002820000002D +:10ED9000C003080001000390C08488001000000038 +:10EDA000C000900000010100C000010083000020AD +:10EDB000C020208208010000C000000003000801FC +:10EDC0000000C00809000300050008C0080002C0D8 +:10EDD000411003C0900002C0040408C0020010C02B +:10EDE000401004C0049010C0034009C04040A1C1BD +:10EDF000A00309C10440841184090903100100081B +:10EE000000089008001100000003008200080120A3 +:10EE1000100810C020080020008800C02010011039 +:10EE2000004008C000030000009004C088100010DB +:10EE3000004000C0888800C0010004C0000000211C +:10EE40000102000110C090080004C0400008210920 +:10EE50000021C008100209100008C00202032103AB +:10EE60000010C040201005110020C1030984094092 +:10EE70000003C103850810A0001183110908004098 +:10EE8000000000890010008802201108008900009D +:10EE9000031191899080008211100402008000808B +:10EEA000088904890080000800000002008000003A +:10EEB0000020008900800002200021090089000054 +:10EEC0000008111000210080008000808000008078 +:10EED000419000088080800041830000800920105C +:10EEE0004190008080800290C1880011C021848000 +:10EEF0004111000885881188041105088508918052 +:10EF00008004000000800000002000A0000000003D +:10EF1000A1802008A0800300808000000000000481 +:10EF200080080000008000008000000000800000D9 +:10EF30008088000000000003C189400021001110FA +:10EF40000000A10420001000081180008080000053 +:10EF5000001100028000808000008000008000001E +:10EF60000000000800808080000011020890020468 +:10EF70004003C109100005009108C10240100500BE +:10EF80009110100088A01040200000001020020204 +:10EF90009000C140901008089100C010880802003D +:10EFA0000000C000000090102000C00000021010FF +:10EFB0000200C0C0101000200000C110880009022B +:10EFC00001000000C101020205000101C090080219 +:10EFD0009002000008002020080840001000208255 +:10EFE0000202400090019082080802000400A18201 +:10EFF0000203400105000202A0C0090003008320B3 +:10F0000010100900000000000000000000000000D7 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F03000000000000000000000006000810000E00F +:10F04000000000000000810000E00000000000005F +:10F0500000000000004200000000000048420000E4 +:10F06000000000004842000000000000484281000B +:10F0700000E000004842810000E0000048428100BA +:10F0800000E00000000000000000000FFF0FC0CFF4 +:10F09000C0CFFF3C003CFC0C00003CF000006F6067 +:10F0A0000000F33000003C3C0000FCC00000FCFC11 +:10F0B0000000FF000000FF660000FC0C0000F0F004 +:10F0C0000000FCFC00000000FFF0000036360000ED +:10F0D000F0FF0000F960F8E07E7F1810F2F2F2F025 +:10F0E000FF00FF006666F072FF986700FD04FD04F4 +:10F0F00066667E42F0F0F0F0FFFFF9FBFF00FF00D4 +:10F10000FD0199992B2B2B0F00020000000FFF0F20 +:10F11000C0CFC0CFFF3C003CFC0C00003CF0000026 +:10F120006F600000F3300000F0F00000FCC0000051 +:10F13000C0C000003C3C000000660000FC0C000069 +:10F14000FF000000C0C00000000000F000003636E4 +:10F150000000F0000000F0F0F0F0FFFF0000B0B0A1 +:10F16000B0F0BD24BF2066666666FF00FF00FD04A8 +:10F17000FF0066667646F6F490D006040000E724A9 +:10F18000EF2002FE6666B2B2B2F00000000000009E +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F210000018007E00000000000066660000606FBD +:10F2200000000F0F0000F0FF0000427E0000FF66AC +:10F230000000FCFC00004E4E00003C3C00003F3F44 +:10F2400000006F6F00003C3C0000FCFC0000000070 +:10F25000663C00002D2D00003CFF666606F6FDFFB3 +:10F26000FCFF662466E70818FFFF3C6C3C6C667F79 +:10F2700066660F0C0FCF0818FE7E24E700FFF7F636 +:10F28000FFFFDF04CF0CF080F0FE728D728D000066 +:10F290000080000000600000000000000F0F000070 +:10F2A000606F000066660000000F0000427E0000F4 +:10F2B000006600000C0C00004E4E00006666000068 +:10F2C0003030000009090000666600000C0C0000E8 +:10F2D0000000663C00002D2D00003C00666646766E +:10F2E00000020003666466670000F7E73C3C3C6C84 +:10F2F000664066660F0D0F4F0000FFFF04F700FF2A +:10F300000000080920FB30F30F7F0F016699728D12 +:10F3100000610006000D000000610006002D1202D1 +:10F3200040E38006002D920240E38006002D920209 +:10F3300040E38006002D920240E38006002D9202F9 +:10F3400040E38006002D920240E38006802992026D +:10F35000000040E380048029920240E38006002DF3 +:10F36000100240618006002D100240618006002DD1 +:10F37000100240618006002D100240618002802949 +:10F3800010024061800680211002406180068021C9 +:10F39000100200000000C3FFC300000000000000D6 +:10F3A000000000000000550F550F00000000C30FC3 +:10F3B000C30F000000000F550F5500000000C3559B +:10F3C000C35500000000550F550F0303A0AF55FFB4 +:10F3D0003CFF00003C3C3C3C7D787D780000000018 +:10F3E0000000000000000000FCFCFCFC000000002D +:10F3F000003CC3FF000000003C3CFFFFAAAAAAAAF1 +:10F400003F303F3003F30A0A303000FF03030AFAAB +:10F4100010BA10BA00000000C3FFC30000000000D3 +:10F420000100000000800000550F550F0000000093 +:10F43000C30FC30F000000000F550F550000000060 +:10F44000C355C35500000000550F550FF3F3A0AF8F +:10F4500055003C0000000F00FFF02D282D28000073 +:10F46000000000000000000000000C0C0C0C00006C +:10F470000000003CC3FF000000003C3C000082BED6 +:10F48000A2AE3F303F3003F3FAFA3F3F00FFF3F301 +:10F490000AFA15BF15BF00000000000000000000C0 +:10F4A00000000000000000000000FF000000F50167 +:10F4B00005010000F0347D287D280000000000F0E8 +:10F4C0000FFF0F0FFF000000000000E800E8AAAAED +:10F4D000AAAAFF4FFFFF0000AAAA00FFD714D71463 +:10F4E000000000000A3FFA3F0000000000FFF0F0BB +:10F4F000000000000000000000000000000000000C +:10F500003C3CF0F05555CF0C0030C0F0E1F5A0B414 +:10F5100080A880A8353F303A0000000000000000BD +:10F52000000000800000000000000080FFFF00FFDE +:10F5300000000000000000345F5F0A0A00000000C5 +:10F5400000F00FFF0F0FFF00000000000028000078 +:10F5500000FF00FF4F4F4FFF0000AAAA00FFD71483 +:10F56000D714000000000A30FA300000000000FF4D +:10F57000F0F00000000000000000000000000000AB +:10F5800000003C3C00FF5555CF0CFFF3FCF0E1F5CB +:10F59000A0B4BFABBFAB353F303A08100004000049 +:10F5A000410500000000000000040003000200020A +:10F5B00082020000208020000000001000040004EF +:10F5C000008000000000000800040108009001080D +:10F5D00000080000200020000002000300000004DA +:10F5E00000000000000000000000000000002000FB +:10F5F00000000000020002000000000000002000E7 +:10F6000000000004000000000000000800002000CE +:10F6100084000000011001000000000080000001D3 +:10F620000000A08400000000000000010000008530 +:10F63000000100010000020400000000008400013D +:10F64000000100040000000000001000200100087C +:10F650002001000100000000000011010000000076 +:10F660000001000200000000000000000000000097 +:10F670008000000000008000A000000000000000EA +:10F6800080000000000100000000000000000000F9 +:10F690000000000000000200020000000000000066 +:10F6A0000000000000000000000000000100000059 +:10F6B00000800080000000000003010800040080BA +:10F6C000000000000000000000000000000000003A +:10F6D00000000040020000000000000800000000E0 +:10F6E0000000000000000000000000000005001005 +:10F6F0000000000002000000000000080000000000 +:10F7000000000008000000000005000000000200EA +:10F7100000000000000000000010000000000000D9 +:10F72000000000000000000000080000000002824D +:10F73000000000040004000000000000020021910D +:10F740000004000800002000009000820010000863 +:10F75000058400080001808400000084008200828B +:10F760000000000000080000000800100000020473 +:10F770000084000000080300000000080082000868 +:10F780000000008400840200000800000000000067 +:10F790000082008800880288020000080208001029 +:10F7A00002820080000400800000000000040000CD +:10F7B0000108200500080200000300218821002123 +:10F7C00000A1002100400010000800210004C00535 +:10F7D0000021001120050021001100210040210519 +:10F7E000A0210000000900049003C0210021002195 +:10F7F000000500030000000390000005A0050021A3 +:10F800000003012100050105000301090021000298 +:10F81000000000090040004000C100090021000074 +:10F82000900800020204410305040000001020A11A +:10F8300002082040A0A021020000000002000002F7 +:10F84000000800044100218400000000000040A1E5 +:10F8500011824004400089900082000011080008D5 +:10F86000C000400000000908000000000902090073 +:10F87000218441000910090800000900100041001E +:10F8800000000000200000002000050002000082AF +:10F89000000000000082000100A1214000000000E3 +:10F8A0000010110800090040004020004000004105 +:10F8B0000040010200000008000082052000014114 +:10F8C00000C0004108410900000082400841204179 +:10F8D00000402040884000400040000001000040FF +:10F8E00000C1004000400000000000110041004045 +:10F8F0000000000000410000000000840041008082 +:10F9000000008480080000C190000080000000001A +:10F9100084000000400000000000000000000080A3 +:10F9200000000000000000000001000103C0000012 +:10F9300000002001020020001182000000C083842A +:10F940000200020500100208400000000011000043 +:10F95000000000010001008300A10001008240902E +:10F960000001000420A100890000000000040090B4 +:10F9700000010088000000000900000020041100C0 +:10F98000000400020004090000040084000400A038 +:10F9900000000090009080840000000200900000B1 +:10F9A0000002000000000000008800000008820043 +:10F9B00000000200010490020000404000410204E7 +:10F9C00082000021410002400004850584000005FA +:10F9D000020300092103002101000003001000219F +:10F9E00040212021901000058803000040890091EB +:10F9F000400520000021002100210008000088832C +:10FA0000000820000021000200029003000800030B +:10FA10000103008000A100828221840200000021F5 +:10FA2000004100A1080008008321008000000000C0 +:10FA30000202000000082002000000108201409035 +:10FA40008205218200902040000809044004000043 +:10FA50004010038440002010000420000000000437 +:10FA60000000800000000008100800000000C040F6 +:10FA70002040A000850011000000100010000000D0 +:10FA80000504000805000000000005012100100029 +:10FA90002108020005040040054000A000A011005C +:10FAA0000000008400402100210002A02140000845 +:10FAB0000021004100000121208800212121004176 +:10FAC0000040840502080003020800210108020525 +:10FAD00002210002418201210104002100040003EF +:10FAE0000005002120000004008500000004000043 +:10FAF00000412111010501210040004001A1010246 +:10FB0000200300210084210500052011880300083E +:10FB10000003000500080004000400098289018038 +:10FB200088098804404190000004A01000210008CA +:10FB30000000000000000000020089040000A00096 +:10FB4000008800010090A0100000009000840202D4 +:10FB50008090800000C140410208208902C003C19A +:10FB600003C000000090880000910940098403C18F +:10FB700000000000A000028220000001000102023B +:10FB80000201000000000040820200C0800041002D +:10FB900020840090000000A000834004000000408A +:10FBA0000202000000000000000000000000000051 +:10FBB000000004000000890008000402082002027E +:10FBC000108505080008401002040402101102020A +:10FBD000100404080010C0881005040210910808E1 +:10FBE00082404002101088100240041003021002EC +:10FBF00008200000048802031020820204022088EA +:10FC000000021020044001C000028490051010037F +:10FC10000020102004400810880202C0040208409E +:10FC200005888420C00200080482840410A000100B +:10FC300000049010000000000400800011092180E1 +:10FC40000000000811800283C084A009000011A0F8 +:10FC5000000500020080000340048008000090407E +:10FC600080808003000082904080000000800800B7 +:10FC700040808000000000000008000080A000001C +:10FC800004000000800011A02021100080002080CE +:10FC900008100090800004A089A1008200000000EC +:10FCA0008080400080008000008000000000800014 +:10FCB00000800080008080050000800880808080B7 +:10FCC00000A180009183108810A0880282888000A3 +:10FCD00005912080008383080090081004808380B1 +:10FCE00000C08089C085100900918004808009408F +:10FCF00000C08082A18000009082008880C0A08027 +:10FD0000800080901000A0808080009188911180F8 +:10FD10008380008210098083008400888911C08359 +:10FD200080004082891080808000804080848080B4 +:10FD3000000000918080008008002000020110C0B7 +:10FD4000101020C0080808C183102183112102C1AE +:10FD500008C021C0050810C1080120C0A08802C049 +:10FD6000084020C1081083C0820020C010A182C0BA +:10FD7000020020C1081182C000000308A0C11011B8 +:10FD800010C0100002C0020282C0088820C008080B +:10FD900002C0084020C0020310C1108820C1042006 +:10FDA00011C1080020C00810828240000203080927 +:10FDB000080890008808840802080020082010081D +:10FDC000001091200008C1890409A0202011840896 +:10FDD00020909120A011C002830891201020C00221 +:10FDE000208309200010C10920A1912020C1C00258 +:10FDF000041103202011C0A00510000011200110E3 +:10FE0000C01104A009200002C00204080921001149 +:10FE1000C003200803200110C0831011892000C1F5 +:10FE2000C011048311200010C0400410C1040088D8 +:10FE300082831082C004008482040483000080C195 +:10FE40000084040041080009852102A0C1118088B6 +:10FE500000820810411000838003058541008080E6 +:10FE600080040203C109008585A1020241008008C7 +:10FE7000800409C141108085801140900000C110AC +:10FE8000118980A10009C100002080800091C10873 +:10FE90000989802100824110118980A10009410057 +:10FEA000000980A100884100000080A00011C0006E +:10FEB0000003802000001040000080C100C000024C +:10FEC00000000080000003211121020083029088BD +:10FED0008811828088020321218002211102800979 +:10FEE000001000808000052121000200830200082C +:10FEF00010000000008000040000000080080000E6 +:10FF00002110A1100880831100020000008000046D +:10FF1000A102100203800211C021210210800011F1 +:10FF2000A10940910080881100020000008000407B +:10FF3000802080080000000000020008808000008F +:10FF40001000000404408800908920040482090005 +:10FF500008C1110508084100020120020403100035 +:10FF600008002005900810000201200404901000F1 +:10FF7000C0012004020202900201200488A01001A6 +:10FF80000000910002040408110102002004044052 +:10FF900088000900200405A08801A10120040408AC +:10FFA00010011100051004A0830188002004041032 +:10FFB0001000080120058282C000A001020504048F +:10FFC0008800000000E000000042500000E0000057 +:10FFD0004842000000E000008142480000E00000CC +:10FFE0004842000000E000004842480000E00000F5 +:10FFF0004842000000E000004842480000E00000E5 +:02000004002BCF +:1000000048420000820000E000004842000000007A +:1000100000004842810000E000004842880000E003 +:1000200000004842810000E000004842000000005B +:1000300000004842000000000000420000000000F4 +:1000400000000000F3F30303FFAF00A0D5FD80A87C +:10005000AFA03F30000030A0FF3A003A7171417DFF +:10006000FF3A003A7171417DFF3A003A20200028A2 +:10007000FF3F00300535C5F55555553C2F2F072F4F +:10008000FF003F300000D3FB1038FF3A003AE1E1B7 +:1000900041EBAFA03F30E1E141EB00A00030D5FDE6 +:1000A00080A80FAA0F3CF330EB280F0F0F3CD5FDB3 +:1000B00080A800A00030D787D2828DD88D8DAA5518 +:1000C000AA557D788287F3F30303FF3F0030FFFFDB +:1000D0000000FF00FF00FFFF3FAFFFFF000055558E +:1000E0005555FFFF000055555555FFFF0000F7F728 +:1000F000D7FFFFAF00A055555555555555F007078B +:10010000072FFF00AFA00000FFFF0000FFFF00006F +:10011000C3C3C3C3FF00FF00C3C3C3C3FFAFFF3FDD +:10012000FFFF00000F0F0F0FFF00FF000F0F0FAAC0 +:10013000FFFF0000FFAFFF3F28782D7DD8D8D88D76 +:100140000CF3FC032878D787000000004D4D00FF1A +:10015000CFC3C5C30C001400350000000F55C3C346 +:10016000AFAAACAACF0CAAAA55F03CF04D4D00FFA7 +:10017000C5C5CFC00C0014005FC3C3C30F55C3C3B4 +:100180003CF0F0F04D00000000003CF0F0F03C5579 +:10019000F0F00CFC05F5FCF0C0F0C5C5C3C34D0084 +:1001A00000001E001EFF4D0000000F55C3C3450494 +:1001B00000003CF0F0F02830D7CFC3C33C3CAAF09D +:1001C000550F69C36933AA55F00F0000000000FF06 +:1001D00000FFC0C3C5C3CFFFD7FF35FFFFFFC3C3B9 +:1001E000C3C3A0AAACAAAAAAAAAAF0F0F0F000FF82 +:1001F00000FFC3C3C3C3CFFFD7FF50C3C3C3C3C331 +:10020000C3C355F0F0F04DFFFFFF000055F0F0F0D4 +:10021000F0F0F0F000FF00FFD4F0D4F0CFC0C3C383 +:100220004DFFFFFF0000FFFF4DFFFFFFC3C3C3C330 +:10023000EFAEFFFF55F0F0F0EBF3140C0AFAF50502 +:10024000AAC3553C69CC693CAA55C33C0061000770 +:10025000002D100240618004802910024061800757 +:10026000002D100240618004802910024061800747 +:10027000002D100240618004802910024000800798 +:10028000002C100240618007802D100200004061A8 +:1002900080048029100240618006002D1002406118 +:1002A000800480291002406180048029100240618E +:1002B00080048029100240618006002D10024061F8 +:1002C0008006002D100240618006002D0002000013 +:1002D0000000550F550FFF00FF0071F330B2F53FDE +:1002E000053FF0ACFFACFFFF0000C180FDBC00008B +:1002F000000055FF55003D3C0100F0F0F0F000001B +:10030000FF00F0F05500000000003030F3F3000073 +:10031000550C55CF7130F3B200000000F0F0FFFF34 +:1003200017D714D4FF3CF0F055555555C3C0FFFC0A +:10033000D7D71414AAAAF0F00000000000FFAAAA60 +:1003400000000000AF05AF0500000000C3C3FF00C0 +:1003500000000000550F550F0404FEFEF3F330308B +:10036000F530053000AC0FACAEA2AEA2C300FF3C2E +:100370000000000055FF5500FFFEC3C2D7FF002854 +:100380000000FF00F0F055FF0000000082BE82BEBA +:100390000000550C55CF7130F3B200000000F0F0B2 +:1003A000000017D714D4C300F0F00FFF00F00300D3 +:1003B0003F3C14D714D7FF00F0F00000000000FF0E +:1003C000AAAA00000000AF05AF0500000000C3C3EB +:1003D000FF000000000000000000FFFF0000555576 +:1003E000FFFFC0CFC0CFAAF03CFF3F033F0350FA4E +:1003F00050FAC0CFC0CFFF00C3C3FF00FF001414EA +:10040000BEBE0000FF003C3C000000000000AAAAA5 +:100410003C3C000028EB28EBC3C35555000000000E +:1004200000AAFFAA55FF5500FF0055550AFA0AFA1F +:10043000C355C355FFF00F00FF00555500000000E5 +:10044000F0AAF0AA00000000000000000000000078 +:100450000000000000000000000000003C3C3C3CAC +:100460000000AAAAC0CFC0CFAAF03C003F033F03C0 +:1004700050FA50FAC0CFC0CFFF00C3C33C3C3C3C55 +:100480001414BEBE0000FF003C3C00000000000051 +:10049000AAAA3C3C000028EB28EBC3C3555500003A +:1004A000000000AAFFAA55FF5500FF0055550AFAA3 +:1004B0000AFAC355C355FFF00F00FF005555000061 +:1004C0000000F0AAF0AA00000000000000000000F8 +:1004D0000000000000000000000000000003000019 +:1004E00000000000000000008400000400001180F3 +:1004F00010800008000800000000001000030091B8 +:1005000000000004000400000000000000000000E3 +:1005100000000000000000030188008800000000C7 +:1005200000000000020000000000000000000008C1 +:100530000010000900004000000000000000000062 +:100540000010020000200000000000000000000079 +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000100008A +:1005700090088008000100010000000000000082D7 +:10058000000400000911090100820082000000003F +:10059000000020000000000000001008110500000D +:1005A0000000000000000000000009000000000042 +:1005B00000000000000009008000090000000000A9 +:1005C00000000000000000010000400000000000EA +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:10060000000000000080000000001000000000005A +:100610000000000000000110008000000080008841 +:100620000000000800000000000000000041000081 +:1006300000410000008300800080000000000000F6 +:1006400000000000000000000000000000000000AA +:100650000000000000000000000000000000008218 +:10066000000000000000000000000000000000008A +:100670000000000000000000000000100200000068 +:10068000008400C000000004009000108008008278 +:100690000000000000C0020002840002000000040C +:1006A000000400A00000000000000000000000089E +:1006B00000000000000000040004000400000088A6 +:1006C000008400000008001000000000000000840A +:1006D0000084008400C00000000000080000010049 +:1006E000010021050000891091092100010001008D +:1006F000C111210000052100210521042108210844 +:1007000085050140910089210100830000412140BD +:10071000858501042100010440042121C1800000DD +:100720000100010201824180010001000121C1009C +:100730008300A108012101022141832183889100C6 +:100740008300010001050110004100050000C00008 +:100750000000C00500000021A0000000A000000073 +:1007600002020200021000080288020802080208C1 +:1007700002A0020802A000C082028202020182A03E +:1007800002A00208024002C002C0021002000000E3 +:10079000824002040201828202098009C0004040B6 +:1007A000000002C002A002040204028402A00200AF +:1007B0000284020202880200020002000282020891 +:1007C000020002100208028202A0000000000000E5 +:1007D000000000840084000000A000000000000071 +:1007E0000884000000000100020001000000000079 +:1007F000000000044100010001044000000011104D +:1008000011000100A10001000100004000408240F1 +:10081000824000058211010501090800090000005D +:1008200040000000C0000000010000000000A00027 +:1008300085000000820000000000010001000000AF +:100840000000008000000000000000000000000028 +:10085000080020000000020000000000000000006E +:1008600004000000000000000200800040040004BA +:10087000000000080001020402000203000800005A +:10088000820082000202020402880200009100013C +:100890000005000100840000020002C00004020004 +:1008A00000908020000002000088020202900000F8 +:1008B00000A00200000400000000000802A040C0E8 +:1008C000000000C000040000000000C000000000A4 +:1008D0000090000041000000000000000000000047 +:1008E0000000000000000000020000000000018580 +:1008F0000091880000A100000080000000000000BE +:10090000021101410000000982000080008584007E +:10091000401100410000C00000210000C00500821D +:100920004090410801000000C080110001880105CD +:10093000008300000080830402C101000100012146 +:1009400000030000001000808208000000000090FA +:1009500000A00085040000800000000000000041AD +:10096000000000000000000000108000000800846B +:10097000404000400088210202084104211020026A +:1009800009A0000020002100001005001102020251 +:10099000110000A010100000098811C0008821106B +:1009A000004180408210209000001104900810093E +:1009B000100000020000210220018502208440086E +:1009C00020000500000000000040001000A0000012 +:1009D00000020021001080000010008400000010C0 +:1009E0000000008400C003A003000100000000001C +:1009F0000210900000004021009001210041000001 +:100A00000200000810050000000400050010008826 +:100A10004103820900040010020401050885032136 +:100A2000024000044004000800040000C105100456 +:100A300010210084C0082004000400058204000482 +:100A400020210085004102210100200582000000D4 +:100A50000005000500040004000400052004004017 +:100A60002000001000030008000000000200000049 +:100A700000008000410000000000110202000000A0 +:100A80002002830409008000110840910900000041 +:100A90000002401040900000098891900210004030 +:100AA00040000040009089000005409000000210C6 +:100AB000C108A00000080000800100000000000044 +:100AC0000001000000040000A00010000000000071 +:100AD0000000000000000000000000000000000016 +:100AE000410000000000000000000000000000C005 +:100AF00000100088000200C000009088020200C0C0 +:100B000000080000C08809C10108C001008800C0B9 +:100B100001020000008484C101098400000900C0B2 +:100B200000080000C08808C1A084828882000000FC +:100B300011030540090282084002A010A008020823 +:100B400088400040A002820411038208040984093D +:100B5000C040000800080408008400100084040855 +:100B60000000000000000000000000000000000085 +:100B700000800080000000000080000000040000F1 +:100B8000008000800400000091C109A189080000D4 +:100B90000080030000000000009120C080090008D0 +:100BA0000080008004000000A0C191219003800516 +:100BB000000091C189218209808285C00080008067 +:100BC00080C04004008000030000C0410010058880 +:100BD00000834000008000808080000000800000D2 +:100BE0000080000000000000000000000000000085 +:100BF00000000000801100008000000000090000DB +:100C000080000005800000408000110088001180F5 +:100C1000C10900000800400080800300C1084011A5 +:100C20008288084190000211C1009000800080106D +:100C300021800000C10008890991C18900C0C0A1BC +:100C400080A0C083050000A18391808080008091F6 +:100C500080088080000000A1008080008000800962 +:100C600000408000000000000000000000000000C4 +:100C700000000000900010000000C0000000000014 +:100C8000A000C000000008000201C0000000090030 +:100C90000110C101100083000110C00800200800ED +:100CA0000189C009910008000010C100090010006E +:100CB00082A141C00000020091C0A02109C190089A +:100CC00010C0401008C11084C0C0401008C004000B +:100CD00010C0408308C0400004C0C01008000400D9 +:100CE0001000840508000000000000000000000063 +:100CF00000000000000000100010001000C0000400 +:100D0000000000C004C0C0008208008201C010843E +:100D10000009050001C100840002001110C1108803 +:100D20000109010000C10088C008000010C00011C6 +:100D30000809C0081082000011A00011C1021109A9 +:100D400005100104C009880921410110C0030809E8 +:100D50000504A105C108850811400004C009040963 +:100D60009008000800A0A0A0000000000000000003 +:100D70000000000000000000008000800080008073 +:100D80000009100002040080000000800080418003 +:100D900080004188090411C100000000008800C0E3 +:100DA000804020C00511059100008080000008806F +:100DB00000A005A0828408890000C100008389107A +:100DC00011C1C189110280A104C04104118980218F +:100DD0008084C180044084830880410000058082B3 +:100DE00085C08080008000000080000000000000BE +:100DF00000000000000000000000800000008000F3 +:100E000000008000000000000000800980108000C9 +:100E10000000C180C1110300830080000000800039 +:100E20000040A009C01103000808808980000080EC +:100E3000004180040440058000100000C190A19191 +:100E400009008300A10282808800801121090980A5 +:100E50000800C01180040000808080008000808035 +:100E60008080800000008000008000000000000002 +:100E7000000000000000000000000000C0000210A0 +:100E800008000000C000880200100200C0000888AE +:100E900010001000C188088501C00800C0000202CF +:100EA00008000001C1A0090901100101C0040800E7 +:100EB00090100001C001848890080000000009889B +:100EC00004110202090011000882091008019100B2 +:100ED000041003020901040010A00808080008001B +:100EE000828208080800C000A0840090C0000000B2 +:100EF00000000000000000000000000000000000F2 +:100F00000000000000000000000000000000810060 +:100F100000E00000000A000000E0000000210000E6 +:100F2000000000000000810000E0000000008100DF +:100F300000E00000420A810000E0000000420000E2 +:100F4000000000E000004842810000E0000048424C +:100F5000810000E000004842810000E000004842BB +:100F600000000000000048420011000007000000DF +:100F70000000000000000000000000000000000071 +:100F8000FF000000FCC00000FF3C0000FF0000006C +:100F9000F03C0000FF0F0000663C00006C6C00009D +:100FA00066F00000FC0C0000FF6600003636000012 +:100FB00066F000003F3F0000F0660000F9F860E0D6 +:100FC0000000FFFF67FF3636363CFF006764727231 +:100FD00072F0FF9867006E6E6E66FF00FF00F0F023 +:100FE000F0F066FE6602F0F0F0F0BDBD24243C0097 +:100FF0003F030000000000000000000000000000AF +:101000000000F0F00000FCC00000C30000003C3C09 +:101010000000F03C0000F0000000663C00006C6C3A +:10102000000066F00000FC0C000000660000363690 +:10103000000066F0000030300000F0660000F0F0C4 +:10104000F0F00000000064003C3C3C3CFF00FF006E +:10105000F0F0F0F0FF00FF00626262666764FF007C +:10106000E4E4E4F066666666E4E4E4F024BD24BDEE +:10107000FCC0FFC3000000000000000000000000F2 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000003C0F00006C6C0000BC +:101110004E4E000099FF0000FF3C000006F6000064 +:10112000FF3C00006F6F00003C6600002D2D0000AA +:10113000FF3C00006F6F0000663C0000FCFC0000FC +:10114000660F662466E70000FFFFE6FF08EF08EF82 +:1011500040667F66663666363C3C7F3C3C2D3C2DC7 +:101160000019E6FF20EF20EFFFFFE6FFF8E0F8E0D0 +:101170002600000000101010000000000000000019 +:10118000000000000000000000003C0F00006C6C3C +:1011900000004E4E000000660000003C000006F615 +:1011A0000000003C0000606000003C6600002D2D47 +:1011B0000000003C000060600000663C00000C0C79 +:1011C0000000660F6664666700000000001900FFFB +:1011D00008EF66666666666666363C3C103C3C3CDC +:1011E0003C2D0000FFFF00FF20EF00000019F0F091 +:1011F000F8E0FFFFD9FFFFDFDFDF000000000000A5 +:10120000000000000000000000004082800000207C +:10121000920240E38006002D920240E38007802D79 +:101220009202408280010020920240E38006002D5D +:10123000920240E380008021920240E380078025F3 +:10124000920240E38003802D1002000040008001E4 +:101250000020100240618004802910024061800457 +:101260008029100240618003802D100240618006B9 +:10127000002D00020000002000000000000000001F +:10128000000000000000000000000000000000005E +:101290000000000000000000C355C355000000001E +:1012A000000000003C0FFF3CF0FFAAF0000000002F +:1012B0000000FF007D5DFF0F3CBC3EBE0000000053 +:1012C00000000000F000F0005DFD5DFD00003F301B +:1012D000FF0FAAFF50FA5F555FFF2B28EBE81E14A3 +:1012E0001EBE2B28EBE800000000A0F5A0F50000D2 +:1012F0000000F0F000FF000000000000000000000F +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000C355C35500009D +:101320000000000000003C0F003CF000AAF00000AC +:101330000000FFFFFF00555D000F00F00FFF0000F1 +:10134000000000000000F000F000FFFF5DFD000065 +:101350003F30F000005550FA0A000AAA2B28EBE8AB +:101360001E141EBE2B28EBE800000000A0F5A0F51F +:1013700000000000F0F000FF00000000000000008E +:10138000000000000000000000000000000000005D +:1013900000000000000000000A0A0A0A0000000025 +:1013A0000000000000000000AF055F5FFCFC30F3B0 +:1013B000000000005F0A5F0A5FFF5F55BC3CBCBED7 +:1013C00000000000B2B2C3FF3F037D7D5555C3C38B +:1013D0000000FC0C3F3FF0FF3CF02828EBEB0F0F28 +:1013E00055550A0AFAFAC355C355AFAF7D28000018 +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000FAFAFAFA0000E4 +:1014200000000000000000000000AF050A0AC0C074 +:1014300030F3000000005F0A5F0A0EBE0E00F000ED +:10144000F0FF00000000B2B2003C3F03414155559F +:10145000C3C30000FC0C3030F0003CF02828EBEB5C +:101460000F0F55550A0AFAFAC355C35505057D28CD +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:101490000000000000000000000000000000000448 +:1014A000000000050000000800000005000000200A +:1014B0000000002010801020100010840000002088 +:1014C00000100000000000210008000000000000E3 +:1014D0000180010400030000000000000000000083 +:1014E00000100000000000800080000000800080EC +:1014F0000080000400000000000000000000000068 +:1015000000000000000000000000000000000000DB +:101510000000000000000000000000000008004083 +:1015200000000000000000000000000000000000BB +:10153000000100000001800880018000800500009B +:101540000001110000000000000000000000000089 +:10155000000004200401000000000008000020003A +:101560000000000000000000090400040000000466 +:10157000000400040009000000000000000000005A +:1015800000000084000000020000000000000000D5 +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000008000000000000000802B +:1015C000000000200000000000000080000000007B +:1015D000000000000000008000000020000000006B +:1015E000000000000000000000000000000000807B +:1015F000000000000000000000800000000000006B +:1016000000000000000000000000020000000000D8 +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000004000000000000A6 +:10164000000800000083000000840000002000006B +:1016500000000000000800080020000000000088D2 +:1016600000000000000000000000008400000000F6 +:101670000004008800000084000800040000000846 +:10168000000000000008000802080200000000003E +:101690000410051000080000000800080000008089 +:1016A000000000000000200090000005904104A10F +:1016B0000021042088000580000000082080108898 +:1016C00020210021C00021800002048888410003FD +:1016D000C0210003000300A1004120080000C00059 +:1016E0000000C021401000210008000000000000A0 +:1016F0000000C041000000080200000000050000DA +:1017000000000000000000000021000000000000B8 +:1017100000000000000000000008000000000000C1 +:10172000002000000000000200100000000800007F +:101730008020008480010000A004008200828308D1 +:1017400080048000008400008404000080042000E5 +:1017500000000088000000820004000080100000EB +:1017600000000088080080C14108000800C000C0D7 +:1017700003000000000800080010800000000008BE +:1017800000840084000000000084000000000000CD +:101790000000000000000000000000000000000049 +:1017A00000000000000000000000000000000080B9 +:1017B0000200000000000000008000000000048023 +:1017C0000000000010000080000000000000000089 +:1017D0000000000000000000000000000000000009 +:1017E00000000800000000000000000000000000F1 +:1017F00000000000000000000000010000000000E8 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:101830000020000400000000000000020000000082 +:10184000800400000000800000080000000000206C +:10185000008200C000820000002000900000001004 +:1018600000C0000000900000009000000000000098 +:101870000000000000000000000000001000000058 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000002010035 +:1018B000000001000000010000000000A000010085 +:1018C0000005012000030484000400A000000100C2 +:1018D00000052005000000830005010500822000AE +:1018E00001102184000000000841002101030000D4 +:1018F00000000008A08000000000A04100800080DF +:10190000000000880000000000000000000000004F +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000011A0000006 +:1019300004080010041000820400008800000082E7 +:101940000408000820A100C0802100C100210084FB +:10195000040200108302008200202100040800100D +:10196000A100048884210000110000080000080084 +:1019700000840000000021020300001000C00010DD +:1019800000080000000200840000000000000000C9 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000902087 +:1019B0000000000040000020204100000021902194 +:1019C00000000005000300208821002100210021E3 +:1019D00000210021022100200011900000210005BB +:1019E000000420040010004100000009000400046D +:1019F0000804400000000200400000110000000048 +:101A0000A0000000000000200000000200410020B3 +:101A10000008001000400000000000090000000065 +:101A200000000000000000000000000000000000B6 +:101A300000010000000000000000000000000000A5 +:101A40000000000000000000000000000000001086 +:101A5000000000000000008404010004200000A039 +:101A600000000000800000000000000000004000B6 +:101A700000A00000000000000000000000000000C6 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000084820030 +:101AB0000088820000A0001000A0002000A0000804 +:101AC000008400C000A100081002821001A10102E0 +:101AD000008582C001A1001084A100A00008004080 +:101AE00000880004A001110040090410000000005B +:101AF0000000000000000000000084000000000062 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B30000000008080000080000000000080008025 +:101B4000008000000000008409808009000511C1A8 +:101B500009210908001004C01080800200000080E4 +:101B600000800080000091200800808200000000BA +:101B70000000000000000000000000000000000065 +:101B80000000000009000000110000000900000032 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000480008000800000008008800099 +:101BC0000004000080008000110002418400000237 +:101BD000110009008500410911800021C000821117 +:101BE000000080008009800080000000C0008203A7 +:101BF00000000000000000000000000000000000E5 +:101C000000000005000000050000200921008200FE +:101C10004100000000000000000000000000000083 +:101C200000000000000000000000000000000000B4 +:101C3000000002001000A000080040001000A001F9 +:101C4000080004011000A00008000288A101A08281 +:101C5000020010C01000A182A1110204A000A10086 +:101C6000098404004000A00008000802020083006C +:101C700009010000C000A0000000000000000000FA +:101C800000000000000000008400040001000000CB +:101C900084008384000000000000000000000000B9 +:101CA0000000000000000000000000000000000034 +:101CB000000000000000000400028200C0000004D8 +:101CC000000808A082C0000000A00210C0000001AF +:101CD000A009088410000001010203851088008318 +:101CE000000910018840000802C0880000100104AB +:101CF000A041108900000000000100000001000068 +:101D0000000000010000000084000000000000004E +:101D1000A000000001000000000000000000000022 +:101D200000000000000000000000000000000000B3 +:101D30000000000000000000000000008000000023 +:101D400000000080800000000000000000800041D2 +:101D5000000480A0800980090003091011410011CE +:101D6000000309A1914000800080000000000010E5 +:101D7000034180A091840000000000400002002088 +:101D8000000000000002001100000000000005003B +:101D9000000000000000080000000000000000003B +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000200110080000090 +:101DC0000009000080008000000400808000800086 +:101DD000040909800400090041821100108080007C +:101DE00021040300848009008004008000000000BA +:101DF00021C0210084800400000000000080000059 +:101E000000000000000000000000000400000000CE +:101E1000000000800000000000050000000000003D +:101E200000000000000000000000000000000000B2 +:101E30000000000000000000000082000284028216 +:101E400004008400008408840400A00000080484C6 +:101E500010000000000884A00000018801A0040216 +:101E6000100083000184091000004000C010A0048D +:101E7000000001C120009110C0000000000000041B +:101E80000000000000000000000000000000000052 +:101E900000820000000200000004000000000000BA +:101EA0000000000000000000000000000000000032 +:101EB00000000000000000000000000000810000A1 +:101EC0000700000000810000070000000081000002 +:101ED00007000000818100E007004200008100E06F +:101EE00007000000818100E0070000000081000081 +:101EF00007000000484200E00700840000000000E6 +:101F00000000000000000000000000000000810050 +:101F100000E000000000480000E0000000000000B9 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000003C0F56 +:101F40003C00FFF0FFF00C0CFCFC00F0FFF0C0C008 +:101F5000FCFC00FF3C3CF0F0F0F0FF00FFFFB2B2F1 +:101F6000B2B2FF00FFFFF0F0FFFFF03CF03CF0F0FA +:101F700000FF30F330F3CF0CCF0C713071F3000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0003CFF3CF000F000F00C0CFCFC00F0FFF0DB +:101FD000C0C0FCFC00FF3C3CAAAAAAAA000000FF6B +:101FE000B2B2B2B2000000FF00000F0FF03CF03CB4 +:101FF000F0F000FF30F330F3CF0CCF0C7171717142 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000F5F5A0A0555555550F140F003505A6 +:1020500005053C053C00DFD58A803C053C002D058C +:1020600005050FD70F82BF8FB0800F0F0F0F55558B +:1020700055555FD70A82DFD5D7D72D2D2D2DFF0FD0 +:10208000000F000000000000E8E8E8E800000000A1 +:102090000000000000000000FF00FFFF0000000043 +:1020A000FF00FF0000000000000000000000000032 +:1020B0000000000000000000000000000000000020 +:1020C00000000000F5F5A0A00C00FFF30FFF0FEBE0 +:1020D000F5C5F5F53CFF3CFAD7D782823CFF3CFAC8 +:1020E000AF87AFAF0FC30FC3AFAFA0A0D7C382C33B +:1020F000FCC0F0F0D7D782828A8082822D2D2D2DD0 +:10210000FFC300C3000000000000E8E8E8E80000AA +:1021100000000000000000000000FF0000000000C0 +:102120000000FFFF000000000000000000000000B1 +:10213000000000000000000000000000000000009F +:1021400000000000000080000020000000000000EF +:1021500000200000000000000020000000000061DE +:102160000024800900000000002100000000006140 +:1021700000248009000080000020000000000061B1 +:10218000402480090000000000610006000D0000EE +:1021900000610006000D000000610007800D0000D6 +:1021A0000061000780050001000000000000000041 +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E000FFD400D4F0F0F0F0F5055F5F3CFFF03C69 +:1021F0000F0F0F0FAAAAAAAA0000000000000000FB +:102200000F0F0F0FC180FDBC00000000000000F0A8 +:10221000FFF00000000000FFAAAA0000000000007C +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:102260000000FFF000F0FF007D28F50550503C0015 +:10227000F03CBEAA82AACFFF0030000000000000A0 +:102280000000BEAA82AAC300FF3C000000000000BC +:1022900000F0FFF00000000000FFAAAA000000000C +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E000000000003F3F3030C0FCC0FCCF0C3F3F3F +:1022F000F0FF3CF0FFFF0000003CC3FF00000000C7 +:10230000000000005F5F0A0A00FF00FF00000000FD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000B2B2C3FF000087 +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:102360000000000000003F3F3030C0FCC0FCCF0C3C +:102370000303F0003CF00F0F0F0F003CC3FF000001 +:102380000000000000005F5F0A0A0000FFFF00007D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000B2B2003C8D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000009E4 +:1023F0000000000000000000000800000000008055 +:1024000000000000000900000000000000000000C3 +:1024100000010010000000000000000000000000AB +:1024200000000000000000000000000000000000AC +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:1024500000000000000000000088000000000000F4 +:102460000000000000000000000000000000030069 +:10247000000000000000000000000000000000005C +:102480000004000000000002000000000000000046 +:10249000000000000000000000020000000000003A +:1024A000000000000000000000000000000000002C +:1024B00000000000400000000000000000000000DC +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000000DC +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000000000000000000000009B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:102570000000000000080000000000000000000053 +:10258000000000840000048400000000000000003F +:102590000000000000080000000000000000000033 +:1025A000001000000000000000000000000000001B +:1025B0000000000000000008000000000000000013 +:1025C000000000000000000000000000000000000B +:1025D00000000000000000080000000000000000F3 +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:102600000000200082002000000000800000001078 +:1026100040000000A0410000000010100000000079 +:10262000400000000000000000000000000000006A +:102630000000000082000000000000000000000018 +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000C0000000000000000800000000A2 +:10267000000000820000000000000000000000C018 +:1026800000C0008480000010800000A000042184AD +:10269000001000000000000000000000001000001A +:1026A0000084800000000000000000000000000026 +:1026B000000000000000000000000000000000001A +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000200000000000000D8 +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000400000000000000A5 +:102730000000000000000000000000000000000099 +:102740000000000000000000000000000000000089 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 +:102790000000000000000000004000400040000079 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:102800000000000000000041000000000000000087 +:1028100000410000000001C10000000000000000B5 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:10286000000000000000000000C00084000000081C +:10287000000000C00000000000C0000000000000D8 +:10288000210000000000000000A000000084000003 +:10289000000000A000100000200400C0000000C0E4 +:1028A0000084000000000000001000000000000094 +:1028B0000000000000000000000000000084000094 +:1028C0000000000000000000000000000000000008 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000400000000200000000000B4 +:102900000000000000000000000000002000200087 +:1029100002000000002100402041004000000000B3 +:102920000041000000000000000000000040000026 +:102930000040002000000000000000000000000037 +:102940000000000000000002000000000000000085 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A10000000000088010001000000010400000126 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A900000000000110000040040020521040000B5 +:102AA00000400000000000000000000000000000E6 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B1000000000000000000020000402008005000A +:102B20000041000400000000000000000000000060 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B900000000000000000C0000001000100004033 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000010000B3 +:102C200000010000A0000001000000000000000002 +:102C30000000000100000000000100000000000092 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C900000000000000000000000000900111021E9 +:102CA000000400200041800900080000000000002E +:102CB00000000000002000090000004000000000AB +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D1000000000000000000000000000210404008A +:102D200009000910210440000900044000000000CF +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000010032 +:102DA0000000000000000189010000000101000096 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E2000810000E000000000810000E000000000E0 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000006100043A +:103130008009000000610004800900000000000018 +:1031400000000000000000610006000D000000000B +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000055CFFB +:1031B00055C02BEB28E8DF8AD5803C3C3C3C000026 +:1031C0000000000000000000000000003C3CF0F0A7 +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:1032300055C355C3EBEB2828D782D782FFF500A0F2 +:1032400000000000000000000000000000003C3C06 +:10325000F0F000000000000000000000000000008E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B00000003F3F3F3F00AAFFAAFFC33C00FAFACD +:1032C000FAFA00000000000000000000000000000A +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000303030300AAFFAAFFC33C0030 +:10334000505050500000000000000000000000003D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A00000000000000000000010200000000000ED +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000200000000000DD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000020000000BD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000004000400B4 +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000200008A +:10344000000000000000000000000000000000007C +:10345000000000000000000200000000000000006A +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:103560000000000000000000000002000000000059 +:10357000000000000000000000000000000000004B +:103580000000000002000000000000000000000039 +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:1036400000000000000000000000000000C000C0FA +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000000000000000000000CA +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000800000000000000A1 +:103720000000000000000000000000000000000099 +:103730000000000000000000000000000000000089 +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000000000000049 +:103780000000000000000000000000000000000039 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000088 +:1038400000000000000000000000000000000084F4 +:10385000001000C000000000000000000000000098 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000000000000040000000000000A8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000000000000000000000B7 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000000F7 +:1039D00000000000000000000000000000000000E7 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 :103CF00000000000000000000000000000000000C4 :103D000000000000000000000000000000000000B3 :103D100000000000000000000000000000000000A3 @@ -168958,11 +177152,11 @@ :103D30000000000000000000000000000000000083 :103D40000000000000000000000000000000000073 :103D50000000000000000000000000000000000063 -:103D6000000200000002000000000000000000004F -:103D70000000000000000000000000000002000041 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 :103D80000000000000000000000000000000000033 :103D90000000000000000000000000000000000023 -:103DA0000000000200000000000000000000000011 +:103DA0000000000000000000000000000000000013 :103DB0000000000000000000000000000000000003 :103DC00000000000000000000000000000000000F3 :103DD00000000000000000000000000000000000E3 @@ -168978,7 +177172,7 @@ :103E70000000000000000000000000000000000042 :103E80000000000000000000000000000000000032 :103E90000000000000000000000000000000000022 -:103EA000000000000000000004000000000000000E +:103EA0000000000000000000000000000000000012 :103EB0000000000000000000000000000000000002 :103EC00000000000000000000000000000000000F2 :103ED00000000000000000000000000000000000E2 @@ -169001,7 +177195,7 @@ :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 -:104010000000000000400000000000000000000060 +:1040100000000000000000000000000000000000A0 :104020000000000000000000000000000000000090 :104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 @@ -169055,9 +177249,9 @@ :10434000000000000000000000000000000000006D :10435000000000000000000000000000000000005D :10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D +:10437000000000000000000000000000020000003B :10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D +:1043900000000000000000000000000000004000DD :1043A000000000000000000000000000000000000D :1043B00000000000000000000000000000000000FD :1043C00000000000000000000000000000000000ED @@ -169073,14 +177267,14 @@ :10446000000000000000000000000000000000004C :10447000000000000000000000000000000000003C :10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C +:104490000000040000000000000000000000000018 :1044A000000000000000000000000000000000000C :1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC :1044D00000000000000000000000000000000000DC :1044E00000000000000000000000000000000000CC :1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB +:1045000000000000000000000000A000000000000B :10451000000000000000000000000000000000009B :10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B @@ -169128,7 +177322,7 @@ :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 :1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 +:1048000000000000000000000000000000000200A6 :104810000000000000000000000000000000000098 :104820000000000000000000000000000000000088 :104830000000000000000000000000000000000078 @@ -169209,22 +177403,22 @@ :104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 :104D000000000000000000000000000000000000A3 -:104D1000000000020000000000000000000200008F -:104D20000000000000000002000000000000400041 -:104D30000000000000004000000000000000000231 -:104D40000000000000004000000000000000000023 -:104D500000000000400000000000000200024002CD -:104D600040020002400000020000000000020000BB +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000000000000000000000000043 :104D70000000000000000000000000000000000033 :104D80000000000000000000000000000000000023 :104D90000000000000000000000000000000000013 -:104DA00000000010000000000000000000000000F3 +:104DA0000000000000000000000000000000000003 :104DB00000000000000000000000000000000000F3 :104DC00000000000000000000000000000000000E3 :104DD00000000000000000000000000000000000D3 -:104DE00000000000001000000000000000000000B3 +:104DE00000000000000000000000000000000000C3 :104DF00000000000000000000000000000000000B3 -:104E0000000000000800000000000000000000009A +:104E000000000000000000000000000000000000A2 :104E10000000000000000000000000000000000092 :104E20000000000000000000000000000000000082 :104E30000000000000000000000000000000000072 @@ -169253,14 +177447,14 @@ :104FA0000000000000000000000000000000000001 :104FB00000000000000000000000000000000000F1 :104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000400000000CD +:104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 :104FF00000000000000000000000000000000000B1 :1050000000000000000000000000000000000000A0 :105010000000000000000000000000000000000090 :105020000000000000000000000000000000000080 :105030000000000000000000000000000000000070 -:10504000000000000000000000000000020000005E +:105040000000000000000000000000000000000060 :105050000000000000000000000000000000000050 :105060000000000000000000000000000000000040 :105070000000000000000000000000000000000030 @@ -169304,14 +177498,14 @@ :1052D00000000000000000000000000000000000CE :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D +:105300000000000000000000040000000000000099 :10531000000000000000000000000000000000008D :10532000000000000000000000000000000000007D :10533000000000000000000000000000000000006D :10534000000000000000000000000000000000005D :10535000000000000000000000000000000000004D :10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D +:10537000000000000000000000000002000000002B :10538000000000000000000000000000000000001D :10539000000000000000000000000000000000000D :1053A00000000000000000000000000000000000FD @@ -169319,7 +177513,7 @@ :1053C00000000000000000000000000000000000DD :1053D00000000000000000000000000000000000CD :1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD +:1053F00000000400000000000000000000000200A7 :10540000000000000000000000000000000000009C :10541000000000000000000000000000000000008C :10542000000000000000000000000000000000007C @@ -169446,8 +177640,8 @@ :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 :105BD00000000000000000000000000000000000C5 -:105BE00000000004000000000000000000000000B1 -:105BF00000040000000000000000000000000000A1 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 :105C10000000000000000000000000000000000084 :105C20000000000000000000000000000000000074 @@ -169455,12 +177649,12 @@ :105C40000000000000000000000000000000000054 :105C50000000000000000000000000000000000044 :105C60000000000000000000000000000000000034 -:105C70000000000000000000000200000000000022 +:105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 :105C90000000000000000000000000000000000004 :105CA00000000000000000000000000000000000F4 :105CB00000000000000000000000000000000000E4 -:105CC0000000400000000000000000000000000094 +:105CC00000000000000000000000000000000000D4 :105CD00000000000000000000000000000000000C4 :105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 @@ -169469,15 +177663,15 @@ :105D20000000000000000000000000000000000073 :105D30000000000000000000000000000000000063 :105D40000000000000000000000000000000000053 -:105D50000000000000020000000000000000000041 +:105D50000000000000000000000000000000000043 :105D60000000000000000000000000000000000033 :105D70000000000000000000000000000000000023 :105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 :105DA00000000000000000000000000000000000F3 -:105DB00000000400000000000000000000000000DF +:105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 -:105DD0000000400000000000000000000000000083 +:105DD00000000000000000000000000000000000C3 :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 :105E00000000000000000000000000000000000092 @@ -169496,7 +177690,7 @@ :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 :105EF00000000000000000000000000000000000A2 -:105F0000000000000000000000000000000000028F +:105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 :105F20000000000000000000000000000000000071 :105F30000000000000000000000000000000000061 @@ -169537,22 +177731,22 @@ :10616000000000000000000000000000000000002F :10617000000000000000000000000000000000001F :10618000000000000000000000000000000000000F -:1061900000000000000000002000000000000000DF +:1061900000000000000000000000000000000000FF :1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF :1061C00000000000000000000000000000000000CF :1061D00000000000000000000000000000000000BF :1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F +:1061F000000040000000000000000000000000005F :10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E +:10621000000000002000000000000000000000005E :10622000000000000000000000000000000000006E -:10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E +:10623000000000002000000000000000000000003E +:1062400000000000880000000000000000000000C6 :10625000000000000000000000000000000000003E :10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E +:10627000000000000000000000000002000000001C +:1062800000000000000000004000000000020000CC :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE @@ -169561,8 +177755,8 @@ :1062E00000000000000000000000000000000000AE :1062F000000000000000000000000000000000009E :10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D -:10632000000000000000000000000000000000006D +:106310000000000000000000000004000000000079 +:106320000000000000000000000800000000000065 :10633000000000000000000000000000000000005D :10634000000000000000000000000000000000004D :10635000000000000000000000000000000000003D @@ -169572,7 +177766,7 @@ :1063900000000000000000000000000000000000FD :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD +:1063C00000000000000000000000001000000000BD :1063D00000000000000000000000000000000000BD :1063E00000000000000000000000000000000000AD :1063F000000000000000000000000000000000009D @@ -169596,7 +177790,7 @@ :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B +:10654000100000000000000000000000000000003B :10655000000000000000000000000000000000003B :10656000000000000000000000000000000000002B :10657000000000000000000000000000000000001B @@ -169699,8200 +177893,6 @@ :106B80000000000000000000000000000000000005 :106B900000000000000000000000000000000000F5 :106BA00000000000000000000000000000000000E5 -:106BB0000000000000000000000040004000000055 -:106BC00000000000000000000000000301000000C1 -:106BD0000000008000000000000000000000200015 -:106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000200075 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000210000000000000053 -:106C20002100000000000000000000000000000043 -:106C30004000000000000040000000004000000094 -:106C400000020000000040004000000000000200C0 -:106C50000000000000400000009000000000000064 -:106C60000090000000000000000000020000000092 -:106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000000000000000000D4 -:106CC00000000000000000000000000008000000BC -:106CD00000000100010000000000000000000000B2 -:106CE00000000000000000000000000000000200A2 -:106CF0000000000000000000000000000000000094 -:106D0000000000000000000000000000000008007B -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 -:106D5000000000000200020000000000000000002F -:106D60000000000000000000000000000000000023 -:106D7000000800000000000000000000000000000B -:106D80000000000000000000000000000000000003 -:106D900000400000000000000000000000000000B3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000002000000000001000000BF -:106ED00000000000010000000000000000000100B0 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F3000000000000000020000000000100000003F -:106F400000000000100000008000000000000400AD -:106F50000000000000000404000000000000000029 -:106F6000040000000000000000000000000000001D -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000020A1 -:106FD000000002000000002000000000000000008F -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:1070500000010000800000000001000000000000AE -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000005005A -:10713000000000000000050000000000000000004A -:10714000000000000000000000000000000000003F -:107150001000000011000000000000000000020804 -:10716000000000000000000000000000000000001F -:107170000000080000000000000000000000000007 -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D0000000000090000008000000009000000087 -:1071E0000088000000000090000000000000000087 -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000001100800000000000110080000C -:10726000000000000000400000800000000000005E -:10727000000000000000000000000000000000000E -:1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000080000000800000AE -:1072E000008000000080000000000080000000809E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000020000000C04D -:1073600000000020000000C000000000002000001D -:10737000000200000000000000000000000000000B -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D000000000000000000000000100008888009C -:1073E000010001000088880001000000000000008A -:1073F000909000000000000000000000000000006D -:10740000000000000000000000000000000000007C -:10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000410000806B -:107460000000090041000080000009000000200029 -:10747000000000800000000000000000000000008C -:1074800000000000000000000000000000000000FC -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC -:1074D000000000000000000000000000000000119B -:1074E000000000800000001100000080000000008B -:1074F00000118000000000000000000000000000FB -:10750000000000000000000000000000000000007B -:10751000000000000000000000000000000000006B -:10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:107560000001000000400000000100000040000099 -:107570000000000120000088000000000000000062 -:1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB -:1075E00000000000000007008221000000000700EA -:1075F00082210000000000000700000000000000E1 -:10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A -:10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A -:107660000000000000000000F0F00000000000003A -:10767000F0F00000000000FF000000FF000000002C -:1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA -:1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D00000000000000000000000000000000000AA -:1076E00000000000000000000000F0F000000000BA -:1076F0000000F0F00000000000FF000000FF0000AC -:107700000000000000000000000000000000000079 -:107710000000000000000000000000000000000069 -:107720000000000000000000000000000000000059 -:107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 -:107750000000000000000000000000000000000029 -:10776000000000000000000000000F0F0000FFFFFD -:1077700000003C3C0000FFFF00000000FF00000094 -:10778000FFFF0000000000000000000000000000FB -:1077900000000000000000000000000000000000E9 -:1077A00000000000000000000000000000000000D9 -:1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 -:1077D00000000000000000000000000000000000A9 -:1077E0000000000000000000000000000F0F00007B -:1077F000000000003C3C0000000000000000FF0012 -:107800000000000000000000000000000000000078 -:107810000000000000000000000000000000000068 -:107820000000000000000000000000000000000058 -:107830000000000000000000000000000000000048 -:107840000000000000000000000000000000000038 -:107850000000000000000000000000000000000028 -:1078600000000000000000000000000005002A00E9 -:10787000054000A805002A00054000A800001500EA -:107880002A00054000A800000000000000000000E1 -:1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000000000000000000098 -:1078F0000000000000000000000000000000000088 -:107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 -:107920000000000000000000000000000000000057 -:107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 -:107950000000000000000000000000000000000027 -:107960000000000000000000000000000000000017 -:107970000000000000000000000000000000000007 -:1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 -:1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C00000000000000000000000000000000000B7 -:1079D00000000000000000000000000000000000A7 -:1079E0000000000000000000000000000000000097 -:1079F0000000000000000000000000000000000087 -:107A00000000000000000000000000000000000076 -:107A10000000000000000000000000000000000066 -:107A20000000000000000000000000000000000056 -:107A30000000000000000000000000000000000046 -:107A40000000000000000000000000000000000036 -:107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 -:107A70000000000000000000000000000000000006 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 -:107AA00000000000000000000000000000000000D6 -:107AB00000000000000000000000000000000000C6 -:107AC0000000000000000000100000000000100096 -:107AD0000000008010000000000000000000000016 -:107AE00000000000400040000000000000032000F3 -:107AF00000008400200000000000001100000000D1 -:107B00000000000000000001200000000000000054 -:107B10002000000000002000000000000000000025 -:107B20000000000000000000000000000000000055 -:107B30002000000000002000000000000000000005 -:107B40000000000000000000000000000000000035 -:107B5000800000000008800000020000000000001B -:107B60000000000000000000000000000000000015 -:107B70000002000000000000000000000000000003 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000080000000000000000DD -:107BA0000000000000000000000000004000000095 -:107BB00000000000000000000400000000000000C1 -:107BC00000000000000000000000000000000000B5 -:107BD0000000000010000000000000000000000095 -:107BE0000000000000000000000000000000000095 -:107BF0000000000000000000000002000000000083 -:107C00000000000000000000000000000000000074 -:107C1000000000000000000000080000000000005C -:107C20000000000000000000000000000000000054 -:107C3000000000000000000000080000000000003C -:107C40000000000000000000000000000002000032 -:107C500000000000000080000000000000000000A4 -:107C60000000000000000000000000000000000014 -:107C70000000000000000000000000008000000084 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000800000000BC -:107CC00000000000000000000000000000000000B4 -:107CD00000000000010000000000000001000000A2 -:107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000090021000000000000000039 -:107D20000000000000000011000000000000000042 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 -:107D500000000000000004000000000000002000FF -:107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000000003 -:107D800000000000000000002000000000000000D3 -:107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 -:107DB00000000000000000000000000000000000C3 -:107DC00000000000000000000000000000000000B3 -:107DD000000000000000000000050000000000801E -:107DE0000080000000000000000000000000000013 -:107DF0000000000000000000400000000000000043 -:107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 -:107E500000000000000000000000000041000000E1 -:107E600005200540050000000000000000000000A3 -:107E700000000000000008000000210021000000B8 -:107E8000400000000000000000A000000000000012 -:107E900000000000000000000000000021002100A0 -:107EA00000000800000000000000000000000000CA -:107EB00000000000000000000000000000002100A1 -:107EC00000000000000000000000000000000000B2 -:107ED00000000000000020200400902000000000AE -:107EE0000000000000000000000000000000000092 -:107EF00000000000000000000000000084002000DE -:107F00000000C000040000000000000000000000AD -:107F10000000000000110000000000000000000050 -:107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000000000000001000020 -:107F60000000000000000000000000000000000011 -:107F70000000000000000000000000000000000001 -:107F8000000000000000000000000000000000846D -:107F900000900000000000840000000005000000C8 -:107FA000008400000000000000000000000000004D -:107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 -:107FD000000000000000000000000200000000009F -:107FE000000002000000000900200000000000095D -:107FF0000000000000000000100010000000000061 -:108000000000000000000000000000000000000070 -:108010000000001100000009080200000800000034 -:10802000000000020000000000000002000000004C -:108030000000000000000000000000000800000038 -:108040000000000000000000000000000000000030 -:1080500000000000000000000000000080000000A0 -:10806000000000008000000000000001000000008F -:108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:108090000000008800000000000000000000000058 -:1080A00000000000000000000000000000000000D0 -:1080B0000000000000880000000000000000000038 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0009000000800000100900000000000000067 -:1080F0000000000000000000000000000000000080 -:1081000000000000000000000000000000004040EF -:10811000008800208820000000000000000000000F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:1081600011008000000000001100802100000000CC -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000000000000EF -:1081900080800000000000000000000000000000DF -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E00000000000008000000080000500801121D8 -:1081F00000800005000000000000000000000000FA -:10820000000000000000000000000000000000006E -:1082100000008000008300020080000000000000D9 -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:108260000000000000000020000000C0000000022C -:1082700001000002000000000000000000000000FB -:1082800000000000000000000000000000000000EE -:1082900000000000080010828283880200000000B5 -:1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E -:1082E0000000000000000100008808000100890073 -:1082F00020880800010000000000000000000000CD -:10830000000000000000000000000000000000006D -:10831000000000000000C01000A0082002040000BF -:10832000000000000000000000000000000000004D -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D -:1083600000000000000000004100008080000900C3 -:10837000410000800009080000000000000000002B -:1083800000000000000000000000000000000000ED -:1083900000000000000000008080000000000000DD -:1083A00000000000000000000000000000000000CD -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D -:1083E00000000000000000000000001100000080FC -:1083F00000000011110000800000000000000000DB -:10840000000000000000000000000000000000006C -:1084100000000000000000000000000000000080DC -:10842000000000000000000000000000000000004C -:10843000000000000000000000000000000000003C -:10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C -:10846000000000000000000000000000000100000B -:10847000004000000001010000400000000000007A -:1084800000000000000000000000000000000000EC -:10849000000000000000000000000000200020207C -:1084A0004008840000000000000000000000000000 -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000000AC -:1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C -:1084F000000007008221000000E007008200000069 -:10850000000000000000000000000000000000006B -:10851000000000000000000000000000000000005B -:1085200000000000600000000000000000000000EB -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:10857000000000000000F0F0000000000000F0F03B -:1085800000000000000000000000000000000000EB -:1085900000000000000000000000000000000000DB -:1085A00009816F81004B994B000000000000000022 -:1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F0000000000000000000F0F00000000000009B -:10860000F0F000000000000000000000000000008A -:10861000000000000000000000000000000000005A -:10862000000009E76FE7664BFF4B00000000000009 -:10863000000000000000000000000000000000003A -:10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A -:1086700000000000000000000000000000000000FA -:1086800000000000000000000000000000000000EA -:1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A -:1086F0000000000000000F0F0000FFFF0000FFFF60 -:108700000000FFFF0000000000000000000000006B -:108710000000000000000000000000000000000059 -:108720000000000000000303F909F68190810000B9 -:108730000000000000000000000000000000000039 -:108740000000000000000000000000000000000029 -:108750000000000000000000000000000000000019 -:108760000000000000000000000000000000000009 -:1087700000000000000000000F0F000000000000DB -:1087800000000000000000000000000000000000E9 -:1087900000000000000000000000000000000000D9 -:1087A0000000000000000000F3F3F909F6E790E78D -:1087B00000000000000000000000000000000000B9 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000000000000089 -:1087F0000000000000000000000005002A00054005 -:1088000000A805002A06054C00A800000000000092 -:108810000000000000000000000000000000000058 -:10882000000000000000000000000000000000C088 -:108830000000000000000000000000000000000038 -:108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000000000F8 -:10888000000000000000FF0000FF000000000000EA -:1088900000000000000000000000000000000000D8 -:1088A00000000000000000000000000000000000C8 -:1088B00000000000000000000000000000000000B8 -:1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000000000000000000098 -:1088E0000000000000000000000000000000000088 -:1088F0000000000000000000000000000000000078 -:108900000000000000000000FF0000FF0000000069 -:108910000000000000000000000000000000000057 -:108920000000000000000000000000000000000047 -:108930000000000000000000000000000000000037 -:108940000000000000000000000000000000000027 -:108950000000000000000000000000000000000017 -:108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000000F7 -:1089800000000000000000000000FF0000FF0000E9 -:1089900000000000000000000000000000000000D7 -:1089A00000000000000000000000000000000000C7 -:1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000000097 -:1089E0000000000000000000000000000000000087 -:1089F0000000000000000000000000000000000077 -:108A0000000000000000000000000000FF0000FF68 -:108A10000000000000000000000000000000000056 -:108A20000000000000000000000000000000000046 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 -:108A700000000000000000000000000000000000F6 -:108A8000000000008400C000000010000000000092 -:108A900010000000400000000000000000008800FE -:108AA0000000000088000000000020008800A000F6 -:108AB000880000000000000000000000000020000E -:108AC00000000000000320008800000020002000BB -:108AD00020002000000000008800040000000000CA -:108AE0002000000000002000000000002000200006 -:108AF0000000200000000000000020000000000036 -:108B000020000000000000840000000000000000C1 -:108B1000000200000000000000000502000000004C -:108B200000001000000010004000000000000000E5 -:108B30001000100200000000000000000000000013 -:108B4000000000000000000000000000000000081D -:108B500000020008000800A000000008000000005B -:108B600000200000000000000000000000000000E5 -:108B700000000000000000004000000000000000B5 -:108B800000000000000000000000000000000000E5 -:108B900000000000000000000000000000000000D5 -:108BA00000000000000000000000000000000000C5 -:108BB00000000000000000000000000000000000B5 -:108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 -:108BF0000000000000000000020000000000000073 -:108C000000000000000000000080000000000000E4 -:108C100000080000000000000000000000000084C8 -:108C20000000000000000000000000000000000044 -:108C30000002000000000000000000000000000032 -:108C4000000000000000000000000000000800001C -:108C500000000008000000080008000000000008F4 -:108C600000000000000000000000000000080000FC -:108C70000000000800000008000800840000000850 -:108C800000000000000000000000000800030000D9 -:108C90000021000000000000C003000000210011BE -:108CA0008805000000000000000501000008000029 -:108CB00000030000000000000003000000000000AE -:108CC0004000000000000000000500000000000857 -:108CD0000000000300050000000088030000000001 -:108CE00000008800000000000000000500080008E7 -:108CF0000000000300080000000000030000000066 -:108D00000000000000000000000000080004000057 -:108D10002000200204C00400000000000000000049 -:108D20000000000000000000000000002000000023 -:108D300000000000000000004100080011200000B9 -:108D4000000000000000008440000000002000003F -:108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000001E2 -:108D90004000000000000000000082000000000011 -:108DA000C00000000000000040008200C0008400FD -:108DB0000800A0000000A0000000A0000000820049 -:108DC0008200A00000008200A000820000000000DD -:108DD0000000820082000000820082008200000009 -:108DE00040000000040000008200820082000000B9 -:108DF00082800000080000008200820082000000E3 -:108E0000000000000000000082000000820000005E -:108E1000000000A00000000000000000000000A012 -:108E20000000000000000000000000004100000001 -:108E30000000000000000000000000000000000032 -:108E40000000000000000000000000000000000022 -:108E50000000000000000000000000000000000012 -:108E600000000000030000000000000000000000FF -:108E700000000004000000000000000000000000EE -:108E800000000000000008000000000000000000DA -:108E900000000000C000000200202020000084002C -:108EA000000000110000000388218800000300007A -:108EB0000000102082000000C00000080000000830 -:108EC0000000000000000008002100000000000079 -:108ED0000000000800000800A000000008000000DA -:108EE0000808000000080000000800210000000041 -:108EF0000800000001000800820000000800C00017 -:108F00000808000000000000000800030000000046 -:108F10000021000000000000000000C000000090E0 -:108F2000000400000000000000000000000000003D -:108F300000000000800000000000000000000000B1 -:108F400000000000000000820000008800A0400037 -:108F500000000000000100000000000000002108E7 -:108F60000000000000000000000000000000000001 -:108F700000000000000010000000000000000000E1 -:108F800000000000000000000000000000000000E1 -:108F9000000000000000000000008421000000002C -:108FA000000010000000000010000000000000029F -:108FB0000002C000002108000000080000050800B1 -:108FC000820040008208000008000000000000004D -:108FD0000000080000212000000000030000000540 -:108FE0000000080000000808002100000000000048 -:108FF00000210000000000210000C000000000056A -:109000000000080000000808000000000000000048 -:109010000021000008030021000000000000000003 -:10902000000000000000000000000000000005003B -:10903000050000000000000000000000000000002B -:109040000000000000000000000000000000000020 -:109050000000000000000000800000000000000090 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000010001CE -:1090A000000100C00001400100C1000301000001F7 -:1090B000000800880001000100C10000000100015B -:1090C000000100C00001400100C100030000900148 -:1090D000000800200001000100C1000000000001A4 -:1090E0000001000100C00001000100C000030000F9 -:1090F0000001000800080001400100C1000000015B -:109100000001000100C00001000100C000030000D8 -:109110000001000800020001400100C10000004100 -:1091200000410041008500410041008320C1024010 -:1091300021410080000000410041009000000041FA -:1091400000410041008500410041008320C10040F2 -:109150000541008000000041004100900000000037 -:1091600000410041004100C00341004100C120C155 -:10917000004040410080000000418041009000001C -:1091800000410041004100C00541004100C120C133 -:10919000002040410080008000418041009000009C -:1091A0004100030000000080410085000000110024 -:1091B0008800828000908800C100C100000000008B -:1091C0004100030000000080410085000000040011 -:1091D0008800020000808300C100C1000000000080 -:1091E000000341000300000000804100C0000000B7 -:1091F0000900880002000080A0004100C1000010AA -:10920000800041000300000000804100C000000019 -:10921000090088000280008090004100C100001019 -:10922000800001000100000000C00100C00000003B -:109230000000090040100085C1900500C1000090A9 -:10924000200001000100000000C00100C00000007B -:109250000000050040C00004C1000500C1000090EE -:109260004000000001000100000000C00100C0003B -:1092700000000000050020C00004C0004100C10043 -:109280000091820001000100000000C00100C00048 -:1092900000000000050010080004C1004100C100EA -:1092A0000091820000C00001C0C100000000000168 -:1092B00000C110090091000100C100000000000180 -:1092C0000001000000C00001C0C10000000000015A -:1092D00000C110050091000100C100000000000164 -:1092E00000010000000000C00001C0C1000000003B -:1092F000000100C110830091000100C100000000C6 -:1093000000010001000000C00001C0C10000000019 -:10931000000100C110820091000100C100000000A6 -:109320000001000100000080004180C10000000039 -:109330000041009080830041004100C10000000016 -:109340000041001000000080004180C100000000CA -:109350000041009080820041004100C100000000F7 -:1093600000410010000000000080004180C10000AA -:1093700000000041009083820041004100C10000D4 -:1093800000000041001000000080004180C100008A -:1093900000000041009083C00041004100C1000076 -:1093A0000000004100100000C100800080C10000EA -:1093B0004108000341004100C141800080020000DB -:1093C0004100000080004100C100800080C1000019 -:1093D0004108000041004100C1410000800200003E -:1093E00041000000800041000000C100800080C1F9 -:1093F00000004100000305004100C141000080025F -:1094000000004100000080004100C100800080C1D8 -:1094100000004100000305004100C141000080023E -:1094200000004100000080004100C1004000C0C1B8 -:1094300000000100880002000100C1910400C00189 -:10944000000001000000C0000100C1004000C0C1D8 -:1094500000000100880002000100C1839000C001EB -:10946000000001000000C00001000000C100400039 -:10947000C0C100000100880003000100C18390000A -:10948000C001000001000000C0000100C100400058 -:10949000C0C100000100880003000100C1839000EA -:1094A000C000000001000000C0000100000000003A -:1094B000000000420000000000000000811200488F -:1094C000070048000000000000000000000000004D -:1094D000000000420000000000000000811200486F -:1094E000070048000000000000000000000000002D -:1094F0000000000000420000000000000000811297 -:1095000000480700480000000000000000000000C4 -:109510000000000000420000000000000000811276 -:1095200000480700480000000000000000000000A4 -:10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB -:1095C000000000000000000000000000000000009B -:1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A -:109630000000757B0000000000000000000000003A -:10964000000000000000000000000000000000001A -:10965000DEAE757B0000000000000000000000008E -:1096600000000000000000000000000000000000FA -:10967000DEAE0000757B000000000000000000006E -:1096800000000000000000000000000000000000DA -:109690000000DEAE757B000000000000000000004E -:1096A00000000000000000000000000000000000BA -:1096B0000000DEAE60C603000000000000000031C4 -:1096C000E0000000000000000C00000000000000AE -:1096D00000C0630660C60300000000000000003107 -:1096E000E0000000000000000C000000000000008E -:1096F00000C06306000060C6030000000000000018 -:109700000031E0000000000000000C00000000003C -:10971000000000C0630660C60300000000000000F7 -:109720000031E0000000000000000C00000000001C -:10973000000000C063060000000000008800000078 -:1097400020000000000000002000000000000000D9 -:109750002000000000000000840000002000000045 -:1097600020800000000000002000000040000000F9 -:109770002000880000000001000000000000200020 -:109780000000200000000000000020000000200079 -:109790000000200000000000000000000000200089 -:1097A0008800200000000000400020000000200091 -:1097B0000000200000000000000000020000000087 -:1097C0000000000000001000400000000000000049 -:1097D0000000000000000000000000000000000089 -:1097E0000000004000000000000000000000000039 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000004000000018 -:109810000000000000000000000000000000000048 -:1098200000000000000000000000000000004000F8 -:109830000000000005000000000000000000000023 -:109840000000000000000000000000000000000018 -:109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000002008400000000000012 -:1098D0000000000000000000000000000000000088 -:1098E0000000000000000000000000000000000078 -:1098F0000000000000000000001000000000000058 -:109900000000000000000000000000000000000057 -:1099100000000000008800000000000000000000BF -:109920000000000000000000000000000000000037 -:109930000000000000000000000000000000002007 -:10994000000040410000008000000100A100000074 -:1099500000000000000000000000000800000000FF -:1099600000000000000000000000000001000000F6 -:109970000000000084000000000000100000000053 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000100000B7 -:1099A00000000000000000000000000000000000B7 -:1099B0000000000000000000000000000010000097 -:1099C0000020049000000300000800202020040074 -:1099D0000000000000004100000000000000000046 -:1099E000000000000000080000000000000002006D -:1099F0000000000000000000000000000000000067 -:109A0000000000000000000008000000210000002D -:109A10001100000000000000000000000000000035 -:109A2000000000000000000008000300000000002B -:109A30000000000000000000000000C00000000066 -:109A40000000000000000000000000000080008016 -:109A50000180000000000000000000000000000085 -:109A60000000000000000000840000000000020070 -:109A70000100000000000000820000000000000063 -:109A80000000000000000000000082000000000054 -:109A90000000000000000000000082004000000004 -:109AA0000000000000000000A00082000000000094 -:109AB00000000000000000000000000000000000A6 -:109AC0000000000000000000000000000000000492 -:109AD0000020020400000000000000000000000060 -:109AE0000000000000000000000000000000000076 -:109AF00080000400000000000000000000000000E2 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B400000000000000000009000900090009100D4 -:109B500000000000100000000000000000000000F5 -:109B6000040000000000C0000000880000000000A9 -:109B700000000000000000000000000000000000E5 -:109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000000000000000A5 -:109BC0000000000000000000000000000000000095 -:109BD0000290080000A0800010880400080040885F -:109BE000000008000000000000000000000000006D -:109BF0000090080000A000042100080000000308F5 -:109C0000000008000000000000000000000000004C -:109C100000000090080000A0000000000800000004 -:109C20000300000008000000000000000000000029 -:109C300000000090080000A00000000008000300E1 -:109C40000300000008000000000000000000000009 -:109C500020000000000000000000000000090009D2 -:109C600000000000000000000000000000000000F4 -:109C700000000200000000000000000000000000E2 -:109C800000000000000000000000000000000800CC -:109C900000000000000000000000000000000000C4 -:109CA00000000000000000000800000000000000AC -:109CB00000000000000000000000000000000000A4 -:109CC0000000000000000000000000000000000094 -:109CD0000000000000000000000000000000000084 -:109CE0000000000000000000000000000000000074 -:109CF00000000000800000000000000000000000E4 -:109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 -:109D30000000000000000000000000000000000023 -:109D40000000000000000000000000000000000013 -:109D500000000000000001009088000000000000EA -:109D600000000000000000000000000000000000F3 -:109D70000000000000000000009000000000000053 -:109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000000B3 -:109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000000000000000093 -:109DD00000000000000000001100A10000000000D1 -:109DE0000000000000000000000000000000000073 -:109DF00000000000000000000000008000000000E3 -:109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 -:109E40000000000000000000000000000000000012 -:109E50000000000000000000000000030980000373 -:109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 -:109EC0000000000000000000000000000000000092 -:109ED000000000000000000000000000000001027F -:109EE00000000088000000000000000000000000EA -:109EF0000000000000000000000000000000002042 -:109F00000000002000000000000000000000000031 -:109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 -:109F30000000000000000000000000000000000021 -:109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000010000 -:109F60000888080000000000020000000000000057 -:109F700000000000000000000000000000000000E1 -:109F8000000002900000000000000000000000003F -:109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000000081 -:109FE00041008080800041000000800000000000EF -:109FF0000000000000000000000000000000000061 -:10A00000030000008080000000000000000000004D -:10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 -:10A030000000000000000000000000000000000020 -:10A040000000000000000000000000000000000010 -:10A050000000000000000000000000000000000000 -:10A060000000001108000080000000000000000057 -:10A0700000000000000000000000000000000000E0 -:10A08000000000118000000000000000000000003F -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 -:10A0C0000000000000000000000000000000000090 -:10A0D0000000000000000000000000000000000080 -:10A0E000000000000001000000400000000000002F -:10A0F0000000000000000000000000000000000060 -:10A1000000000000000120000088000000000000A6 -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A1500000000000000000000000000000000000FF -:10A16000000000000000000000E007008200000086 -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000070000000000C8 -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F -:10A1D000000000000000000000000000000000007F -:10A1E000000000000000000000000000F0F000008F -:10A1F000000000000000000000000000000000005F -:10A20000000000000000000000FF000000FF000050 -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000000000000FE -:10A260000000000000000000000000000000F0F00E -:10A2700000000000000000000000000000000000DE -:10A280000000000000000000000000FF000000FFD0 -:10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E0000000000000000000000000000000FF006F -:10A2F0000000FFFF00000000000000000000000060 -:10A300000000000000000000000000000000FF004E -:10A310000000FFFF0000000000000000000000003F -:10A32000000000000000000000000000000000002D -:10A33000000000000000000000000000000000001D -:10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD -:10A3600000000000000000000000000000000000ED -:10A37000FF000000000000000000000000000000DE -:10A3800000000000000000000000000000000000CD -:10A39000FF000000000000000000000000000000BE -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000000000000000006D -:10A3F00005402A06054C00A80000000000000000EF -:10A40000000000000000000000000000000000004C -:10A4100015002A00054000A8000000000000000010 -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC -:10A4600000000000000000000000000000000000EC -:10A4700000000000FF00FFFF0000000000000000DF -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000000000000000006C -:10A4F000000000000000FF0000000000000000005D -:10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000000000001B -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000000000FB -:10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000F0F000000000FB -:10A5800000000000000000000000000000000000CB -:10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB -:10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E000000000000000000000000000000000006B -:10A5F000000000000000000000000000F0F000007B -:10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000000FA -:10A6600000000000000000000000000000000000EA -:10A67000000000000000000000000800880000004A -:10A6800000000000000000000000000000000000CA -:10A69000000000000000000000002000000000009A -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000200000007A -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000000000006A -:10A6F0000000000021000000000000000000000039 -:10A700000000000000004000000000000000000009 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000200000000000027 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000002000040000000000000000000B7 -:10A7600000000000000000000000000000000000E9 -:10A770004000000000000000000000000000000099 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000002000000000000000000000097 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000200000000000000000077 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000210000000000000000047 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000002000000000B8 -:10A880000000000082000400000000000000000042 -:10A8900000000000000000000000000000000000B8 -:10A8A000000000000800000000000000000004009C -:10A8B0000000040004000000000000000000000090 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000100000000000000000000000000068 -:10A8E0000000000000000000000000000000000068 -:10A8F0000000000000000000000000000004000054 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000005000000200012 -:10A920000000110000000000000004000000000012 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 -:10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB000000000000000402C000C000C002000000FD -:10AB10000004008400900088000000000000000095 -:10AB20000000000000000900000000000800000014 -:10AB30000000008400000000000000000000000091 -:10AB400000000000000000000000000000000800FD -:10AB500000000000002000000000000000000000D5 -:10AB600000000000000000000000000000000800DD -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000020000B3 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000002000093 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC3000000000000000000000000000000005000F -:10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000000000000000000013 -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000000000000A2 -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000000000000000000000006B -:10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B630000000000200000000000200000000000006 -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000000000000DA -:10B6700000010000000000000000000000000000C9 -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B0000000100200000000000000000000000078 -:10B6C0000000000200000000000000000000000078 -:10B6D0000000000000000000100000020000000256 -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000400000000000000000000A -:10B700000000000000000000000000000000000039 -:10B7100000000000400000004000000000000000A9 -:10B7200000000000000000000000000000004000D9 -:10B730000000000000000000000000000000020007 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000020000000000000000000000D7 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000002000087 -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B8300000000000000000000000000040000000C8 -:10B84000000000000400000000000000000088006C -:10B8500000000000000000000000000000000000E8 -:10B860000080000000000100040000000000000053 -:10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D000090000000000000000000000000000005F -:10B8E0000000000800000000200000000000000030 -:10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B9600000000100000000000100000000000000D5 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000004000000000020000000000033 -:10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600001000400002000000000000000000000B1 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000040000000020000000000000000042 -:10BAE0000000020000000001002000000000000033 -:10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000009000000000000BC -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC60000000000000000000000090200000000024 -:10BC700001000000000000000000000000000000C3 -:10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE00000000000000000000000110080000000C3 -:10BCF0000000110021000000000000000000000012 -:10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD60000000000000000000000000000000008053 -:10BD70000000008000C109000009008000000000F0 -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000020000000C000030100000000880000D7 -:10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000000000000022 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE70000100008888000100000088000000010027 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000410000800000090000000000000078 -:10BF000041000000000000000000000000000000F0 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF7000000000000011000000800000000000111F -:10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000001000000400000000000 -:10C00000000100000000000000000000000000002F -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C070000000000000000000000000000700822116 -:10C08000000000E00000814100000000000000000E -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000F0F060 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C18000F0F00000000000000000000000000000CF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C20000FF000000FFFF0000000000000000000031 -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C280000000FF00000000000000000000000000AF -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000005002A00054000A800400006000CBF -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C380000000000000000000000000000000555503 -:10C39000FFFF00000000000000000000000000009F -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C410005555000000000000000000000000000072 -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C4900000000000F0F000000000000000000000BC -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C51000000000000000F0F000000000000000003B -:10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000010000000BB -:10C570002000000000020000200000000002000077 -:10C58000000000400000000000000000000000006B -:10C59000200000000000000020000000000000005B -:10C5A000000000000000000000000000000000008B -:10C5B000000020000000000000002000000000003B -:10C5C000000000000000000000000000000000006B -:10C5D000000020000000000000002000000000001B -:10C5E000000000000000000000000000000000004B -:10C5F00040000002000200000002000000000000F5 -:10C600000000000200000000000200000020000006 -:10C6100000000000000400020002004000020000D0 -:10C6200000000000000000000000000000400000CA -:10C6300000000000000010000002000000000000E8 -:10C6400040000000000000000000000000000000AA -:10C6500000000000000000000000100000000000CA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A -:10C6E0000210000000000000000000000000000038 -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000000000000C9 -:10C770000000000020000400000000000000000095 -:10C780000000200000000000000000000000000089 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C810000500000000000000000000000000000013 -:10C820000000000000000000000000000000000008 -:10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000040000000000000000000000000012 -:10CA200000000000008400000000008400000000FE -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000284 -:10CAB0000000000000020000000000000000000074 -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000000091 -:10CFA0000000000000000000000000000000000081 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000000000000090 -:10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000001100007E -:10D1A000200220000002000000002000000000001B -:10D1B00020002000000020002000000000000000EF -:10D1C00020002000000000000000200000000000FF -:10D1D00020002000000020002000000000000000CF -:10D1E00000002000200000000000000020000000DF -:10D1F00000002000200000002000200000000000AF -:10D2000000002000200000000000000020000000BE -:10D21000000020002000000020002000000000028C -:10D220000002000000000000000200020000009068 -:10D2300000000000000000020000000000000000EC -:10D2400000000000000000000000000000000000DE -:10D25000400000000000000000000000000000008E -:10D2600000000000000000000000000000000000BE -:10D27000400000004000000000000000000000002E -:10D28000000000000000000000004000000000005E -:10D29000000000000000000000000000000000008E -:10D2A00000000000000484000000000000000000F6 -:10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D -:10D3200000000000000000000004000000000000F9 -:10D3300000020000000400000002000000000004E1 -:10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000040000000000000003D -:10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000200000DC -:10D4300000000000000000000400002000000000C8 -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D500000000000000000000000000000000000813 -:10D51000000000000000000000000000000000000B -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA -:10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D69000000000000000000000000000000000008A -:10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000000000005A -:10D6D00000000000000000000000000000800000CA -:10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 -:10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000010B9 -:10D7600000000000000000000000000000000000B9 -:10D77000050000000000000000000500000000009F -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 -:10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 -:10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 -:10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 -:10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000000037 -:10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 -:10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 -:10DA600000000000000000000000000000000000B6 -:10DA700000000000000000000000000000000000A6 -:10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 -:10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 -:10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000000000000085 -:10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 -:10DBD0000000000000000000000000000000000045 -:10DBE0000000000000000000000000000000000035 -:10DBF0000000000000000000000000000000000025 -:10DC00000000000000000000000000000000000014 -:10DC10000000000000000000000000000000000004 -:10DC200000000000000000000000000000000000F4 -:10DC300000000000000000000000000000000000E4 -:10DC400000000000000000000000000000000000D4 -:10DC500000000000000000000000000000000000C4 -:10DC600000000000000000000000000000000000B4 -:10DC700000000000000000000000000000000000A4 -:10DC80000000000000000000000000000000000094 -:10DC90000000000000000000000000000000000084 -:10DCA0000000000000000000000000000000000074 -:10DCB0000000000000000000000000000000000064 -:10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 -:10DCE0000000000000000000000000000000000034 -:10DCF0000000000000000000000000000000000024 -:10DD00000000000000000000000000000000000013 -:10DD10000000000000000000000000000000000003 -:10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000000000000C3 -:10DD600000000000000000000000000000000000B3 -:10DD700000000000000000000000000000000000A3 -:10DD80000000000000000000000000000000000093 -:10DD90000000000000000000000000000000000083 -:10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000000000000053 -:10DDD0000000000000000000000000000000000043 -:10DDE0000000000000000000000000000000000033 -:10DDF0000000000000000000000000000000000023 -:10DE00000000000000000000000000000000000012 -:10DE10000000000000000000000000000000000002 -:10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000000000000000E2 -:10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000000000000B2 -:10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000000000092 -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 -:10DED0000000000000000000000000000000000042 -:10DEE0000000000000000000000000000000000032 -:10DEF0000000000000000000000000000000000022 -:10DF00000000000000000000000000000000000011 -:10DF10000000000000000000000000000000000001 -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000000000000E1 -:10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000000000000C1 -:10DF600000000000000000000000000000000000B1 -:10DF700000000000000000000000000000000000A1 -:10DF80000000000000000000000000000000000091 -:10DF90000000000000000000000000000000000081 -:10DFA0000000000000000000000000000000000071 -:10DFB0000000000000000000000000000000000061 -:10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000000000000031 -:10DFF0000000000000000000000000000000000021 -:10E000000000000000000000000000000000000010 -:10E010000000000000000000000000000000000000 -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 -:10E0400000000000000000000000000000000000D0 -:10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 -:10E0700000000000000000000000000000000000A0 -:10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000000000060 -:10E0C0000000000000000000000000000000000050 -:10E0D00000000000000000000000000220002002FC -:10E0E000200220002002200000002000200020004C -:10E0F0000000200020002000000000002000200080 -:10E10000200020002000200001002080200020842A -:10E1100000802000200020000001000000002000FE -:10E12000200020002000200020000000200020000F -:10E13000200000002000200020000000000020003F -:10E1400020002000200020002000000020002000EF -:10E15000200000002000200020000002000000003D -:10E16000000021000002000000000000000000008C -:10E17000000000000000000010000000000000008F -:10E180000000000000000002000002000004000285 -:10E190000004000800000000000000004000000033 -:10E1A000000000000000000000000002000000006D -:10E1B000000000000000000000020000000000005D -:10E1C000000000000000000000000000000000004F -:10E1D00000000000000000000000000020002000FF -:10E1E0008400880000000000000010000000000013 -:10E1F000000000000000000000000000000000001F -:10E20000000000000000000000000000000000000E -:10E21000200020000000000000000040000000007E -:10E2200000000000000000000000000000000000EE -:10E2300000000000000000000000000002100000CC -:10E2400000000000000000000000000010000000BE -:10E2500000000000000000000000000008400084F2 -:10E260000084400040080082400409044008000483 -:10E270000002000000040008000200040002000088 -:10E280000000000000840000000000000004000006 -:10E290000008890080000008000000000002000063 -:10E2A000000000000000000000000000000000006E -:10E2B000000000080000000800080000000000083E -:10E2C000000000000000000000000000000000004E -:10E2D000000000080000000800080000000000081E -:10E2E000000000000000000200000000000000210B -:10E2F00000030008000000000000000000000021F2 -:10E3000000000000000000000000000000000021EC -:10E3100000000000000001080000000000000108EB -:10E3200000000000000000000000000000000000ED -:10E3300000000000000000000000000000000000DD -:10E3400000000000000000000000000000000000CD -:10E3500000000000000000000000000000000000BD -:10E3600000000000000000000004000000000000A9 -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E390000000000000000000040000000000000079 -:10E3A000200000000000000000000000000000004D -:10E3B000000000000000000000000000000000005D -:10E3C000000000000000000000000000000000004D -:10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000001D -:10E400000000000000000000C0000000000000004C -:10E41000000000000080008000800100000000007B -:10E4200001000000000000000000000000000000EB -:10E4300000000000000000000000000000000000DC -:10E4400000000000000000000000000000000000CC -:10E4500000000000000000000000000000000000BC -:10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C -:10E48000000000000000000000000000000000008C -:10E490000000000000000004000400200200000052 -:10E4A000000020000000000000000000000000004C -:10E4B000000000000000000000000000000000005C -:10E4C000000000000000000000000000000000004C -:10E4D000000000000000000000000000000000003C -:10E4E000000000000000000000000000000000002C -:10E4F0000000000000000000A0000000000000007C -:10E50000000000000000C008000000000000000043 -:10E51000000000009000000000000000000000006B -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000000000000CB -:10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C000000000000000000000000000000000004B -:10E5D000000000000000000000000000000000003B -:10E5E000000000000000000000000000000000002B -:10E5F000000000001000000000000000000000000B -:10E60000000000000000000000000000000000000A -:10E6100000000000000000000000000000000000FA -:10E6200020000000000000000009000000000000C1 -:10E6300000000009000000000000000000000000D1 -:10E6400000000000000000000000000000000000CA -:10E6500000000000010000000000000000000000B9 -:10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000000000000009A -:10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A -:10E6A00000008000000000000000000000000000EA -:10E6B000000000000000000000000000000000005A -:10E6C000000000000000000000000000000000004A -:10E6D000000000000000080000000500000000002D -:10E6E000000000000000000000000000000000002A -:10E6F000000000000000000000000000000000001A -:10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000000F9 -:10E720000100902000000000010000000000000037 -:10E7300000000000000000000000000000000000D9 -:10E7400000000000000000000000000000000000C9 -:10E7500000000000000000000000000000000000B9 -:10E7600000000000000000000000000000000000A9 -:10E770000000000000000000000000000000000099 -:10E780000000000000000000000000000000000089 -:10E790000000000000000000000000000000000079 -:10E7A0000000110080800000000011002100000026 -:10E7B0000000000000000000000000000000000059 -:10E7C0000000000000000000000000000000000049 -:10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000000000000000000000029 -:10E7F0000000000000000000000000000000000019 -:10E800000000000000000000000000000000000008 -:10E8100000000000000000000000000000000000F8 -:10E82000000000000040008000400000004109009E -:10E83000000900800000000000000000000000004F -:10E8400000000000000000000000000000000000C8 -:10E8500000000000000000000000000000000000B8 -:10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 -:10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000000000078 -:10E8A00000000000000000010002000000880001DC -:10E8B00001000000008800000000000000000000CF -:10E8C0000000000000000000000000000000000048 -:10E8D00000000000000000000800080000008800A0 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 -:10E9200000000000000000000100888808000100CD -:10E93000000088000000010000000000000000004E -:10E9400000000000000000000000000000000000C7 -:10E9500000000000000000000000000000000000B7 -:10E9600000000000000000000000000000000000A7 -:10E970000000000000000000000000000000000097 -:10E980000000000000000000000000000000000087 -:10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000041000080800026 -:10E9B000080000000000000041000000000000000E -:10E9C0000000000000000000000000000000000047 -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 -:10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 -:10EA200000000000000000000000000000110000D5 -:10EA30000080000000000011050000000000000040 -:10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000000000B6 -:10EA600000000000000000000000000000000000A6 -:10EA70000000000000000000000000000000000096 -:10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000000076 -:10EAA0000000000000000000000000000000000165 -:10EAB0000000004000000000000100000000000015 -:10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE0000000000800080000000000000000000016 -:10EAF0000000000000000000000000000000000016 -:10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 -:10EB200000000000000000000000000000000000E5 -:10EB3000000002E007008200000000E000008141C8 -:10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000075 -:10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000F0F000000000000075 -:10EBC0000000000000000000000000000000000045 -:10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 -:10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 -:10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000F0F000000000F4 -:10EC400000000000000000000000000000000000C4 -:10EC500000000000000000000000000000000000B4 -:10EC600000000000000000000000000000000000A4 -:10EC70000000000000000000000000000000000094 -:10EC80000000000000000000000000000000000084 -:10EC90000000000000000000000000000000000074 -:10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 -:10ECC0000000000000000000000000000000000044 -:10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000000000024 -:10ECF0000000000000000000000000000000000014 -:10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 -:10ED3000000000000000000000FF0000FFFF0000D6 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000000083 -:10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000FF0000000054 -:10EDC0000000000000000000000000000000000043 -:10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 -:10EDF0008080000000000000000000000000000013 -:10EE00000000000000000000000000000000000002 -:10EE100000000000000000000000000000000000F2 -:10EE200000000000000000000000000000000000E2 -:10EE300000000000000000000000000005652A0638 -:10EE4000054F20A800400006000C00000000000054 -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 -:10EE70000000000000000000000000000000000092 -:10EE80000000000000000000000000000000000082 -:10EE90000000000000000000000000000000000072 -:10EEA0000000000000000000000000000000000062 -:10EEB0000000000000000000000000000000000052 -:10EEC00000000000000000000F0FFFFF0000000026 -:10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 -:10EEF0000000000000000000000000000000000012 -:10EF00000000000000000000000000000000000001 -:10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000000000000000000E1 -:10EF300000000000000000000000000000000000D1 -:10EF4000000000000000000000000F0F00000000A3 -:10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 -:10EF70000000000000000000000000000000000091 -:10EF80000000000000000000000000000000000081 -:10EF90000000000000000000000000000000000071 -:10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC0000000000000000000000000000000F0F061 -:10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 -:10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000000000000000D0 -:10F0400000000000000000000000000000000000C0 -:10F05000F0F00000000000000000000000000000D0 -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F0900000000000000000110000041188000008BA -:10F0A00000082000040800000000201100040000F7 -:10F0B0002000000000000000000800000000000028 -:10F0C00000002004200000000000200000000000DC -:10F0D0000000000000000000000000000000000030 -:10F0E00000000000200020000000000020000000C0 -:10F0F0000000000000000000000000000000000010 -:10F10000000000002000200000000000200000009F -:10F11000000000000000000000020002000000905B -:10F12000000200900000004000400000004000008D -:10F13000000000000000000000024000004000024B -:10F1400000020000000200020000000000000000B9 -:10F15000000000000000000000004000000040002F -:10F16000000000000000000000000000000000009F -:10F17000000000004000000000000000000000004F -:10F18000000000000000000000000000000000007F -:10F19000000000000000000000002000200020000F -:10F1A000840020000000000000002000000000009B -:10F1B000200020000000000000000000000000000F -:10F1C00020009000900000000000020000000000FD -:10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F2000000000000000000000000000000000000FE -:10F210000000000000000000000000000082000864 -:10F220004104200400040204000409040002000256 -:10F230000002000800900004000200040004000422 -:10F2400000040000000400080000000400040000A6 -:10F2500000040004000000000000000000000000A6 -:10F26000000800000000000000080000000000008E -:10F27000000000000000000000000000000000008E -:10F28000000800000000000000080000000000006E -:10F290000000000000000000000000000000C0406E -:10F2A000104040210011000000200000002100005B -:10F2B00040000008000000000000000000200000E6 -:10F2C000000000000000000000000000000000003E -:10F2D000000000000000000000000000000000002E -:10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F3000000000100000000000000000000000003F9 -:10F3100000000000000000110000000000000000DC -:10F3200000000000000000000000000000000020BD -:10F3300000080000000000000000000000000000C5 -:10F3400000000000000000000000000000000000BD -:10F3500000000000000000000000000000000000AD -:10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D -:10F38000000000002000000000000000000000005D -:10F39000000000000000000000000000000000006D -:10F3A000000000000008000800200000000000002D -:10F3B000000000000000000000000000000000004D -:10F3C000000000000000000000000000000000003D -:10F3D000000000000000000000000000000000002D -:10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D -:10F400000000000001000040010001820000000037 -:10F4100000000000000000000000000000000000EC -:10F4200000000000000000000008210000000800AB -:10F4300003000000000000000000000000000000C9 -:10F4400000000800000000000800000000000000AC -:10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F480000000000000002000000120002005000016 -:10F49000000000000000000000000000000000006C -:10F4A000000000000000000800000009000000004B -:10F4B0000000000000000000080000000000000044 -:10F4C000000000000000000000000000000000003C -:10F4D00000000000000000000000008000000000AC -:10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C -:10F500002000000000002000000000000004008037 -:10F5100000000000000000110000000000030000D7 -:10F5200000000008000000000000000000000000D3 -:10F5300000000000000000000000000000000000CB -:10F5400000000000000000000000000000000000BB -:10F550000000000000C000000090000000100084C7 -:10F560000000000000840000000000000000000017 -:10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000017A -:10F590000004000000000000000000000000000067 -:10F5A000000000000000000000000000000000005B -:10F5B000000000000000000000000000000000004B -:10F5C000000000000000000000000000000000003B -:10F5D000000000000000000000000000000000002B -:10F5E0000000000000000000000200000000000019 -:10F5F0000002000000000000000000000000000009 -:10F6000000000000000000000000000001000100F8 -:10F610000000018000090000000800000000000058 -:10F6200000000000000000000000000000000000DA -:10F6300004000000000000000000080000000000BE -:10F640000000000041000000080000000000000071 -:10F6500000000000000000000000000000000000AA -:10F660000000000000000800000000000000000092 -:10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000020005A -:10F69000200000002004000800000000000000001E -:10F6A0000000050000000000000000000000000055 -:10F6B000000000000000000000000000000000004A -:10F6C000000000000000000000000000000000003A -:10F6D000000000000000000000000000000000002A -:10F6E0000000000000000000000000000000000218 -:10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 -:10F71000909001108891080800000000000000008F -:10F7200000000000000000000000000000000000D9 -:10F7300000000000000000000000000000000000C9 -:10F7400000000000000000000000000000000000B9 -:10F7500000000000000000000000000000000000A9 -:10F760000000000000000000000000000000000099 -:10F770000000000000000000000000000000000089 -:10F780000000000000000000000000000000000079 -:10F790000000918021809010000000000000000017 -:10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000000000000000000000049 -:10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 -:10F7E0000000000000000000000000000000000019 -:10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F810000000000091828810918408000000000020 -:10F8200000000000000000000000000000000000D8 -:10F8300000000000000000000000000000000000C8 -:10F8400000000000000000000000000000000000B8 -:10F8500000000000000000000000000000000000A8 -:10F860000000000000000000000000000000000098 -:10F870000000000000000000000000000000000088 -:10F880000000000000000000000000000000000078 -:10F89000000000000000A1102001A1910000000064 -:10F8A0000000000000000000000000000000000058 -:10F8B0000000000000000000000000000000000048 -:10F8C0000000000000000000000000000000000038 -:10F8D0000000000000000000000000000000000028 -:10F8E0000000000000000000000000000000000018 -:10F8F0000000000000000000000000000000000008 -:10F9000000000000000000000000000000000000F7 -:10F9100000000000000000000811C190A09108093B -:10F9200000000000000000000000000000000000D7 -:10F9300000000000000000000000000000000000C7 -:10F9400000000000000000000000000000000000B7 -:10F9500000000000000000000000000000000000A7 -:10F960000000000000000000000000000000000097 -:10F970000000000000000000000000000000000087 -:10F980000000000000000000000000000000000077 -:10F990000000000000000000000080A191C1802054 -:10F9A000020800000000000000000000000000004D -:10F9B0000000000000000000000000000000000047 -:10F9C0000000000000000000000000000000000037 -:10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000000000000000017 -:10F9F0000000000000000000000000000000000007 -:10FA000000000000000000000000000000000000F6 -:10FA1000000000000000000000000000088080805E -:10FA200008809010000000000000000000000000AE -:10FA300000000000000000000000000000000000C6 -:10FA400000000000000000000000000000000000B6 -:10FA500000000000000000000000000000000000A6 -:10FA60000000000000000000000000000000000096 -:10FA70000000000000000000000000000000000086 -:10FA80000000000000000000000000000000000076 -:10FA900000000000000000000000000000008808D6 -:10FAA00002A088029000000000000000000000009A -:10FAB0000000000000000000000000000000000046 -:10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000000026 -:10FAE0000000000000000000000000000000000016 -:10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB200041000060000042000000000000000000F2 -:10FB300000000000000000000000000000000000C5 -:10FB400000000000000000000000000000000000B5 -:10FB500000000000000000000000000000000000A5 -:10FB60000000000000000000000000000000000095 -:10FB70000000000000000000000000000000000085 -:10FB80000000000000000000000000000000000075 -:10FB90000000000000000000000000000000000065 -:10FBA000000000000000EFF7DFFB00000000000095 -:10FBB0000000000000000000000000000000000045 -:10FBC0000000000000000000000000000000000035 -:10FBD0000000000000000000000000000000000025 -:10FBE0000000000000000000000000000000000015 -:10FBF0000000000000000000000000000000000005 -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 -:10FC20000000000001000000BFFD7FFF0000000099 -:10FC300000000000000000000000000000000000C4 -:10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000000000000000A4 -:10FC60000000000000000000000000000000000094 -:10FC70000000000000000000000000000000000084 -:10FC80000000000000000000000000000000000074 -:10FC90000000000000000000000000000000000064 -:10FCA000000000000000EFBFDF7F00000000000048 -:10FCB0000000000000000000000000000000000044 -:10FCC0000000000000000000000000000000000034 -:10FCD0000000000000000000000000000000000024 -:10FCE0000000000000000000000000000000000014 -:10FCF0000000000000000000000000000000000004 -:10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 -:10FD20000000000000000000F7FDFEFF20E020E0E2 -:10FD300000000000000000000000000000000000C3 -:10FD400000000000000000000000000000000000B3 -:10FD500000000000000000000000000000000000A3 -:10FD60000000000000000000000000000000000093 -:10FD70000000000000000000000000000000000083 -:10FD80000000000000000000000000000000000073 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000080610007C00D9E -:10FDB0000001000000000000000000000000000042 -:10FDC0000000000000000000000000000000000033 -:10FDD0000000000000000000000000000000000023 -:10FDE0000000000000000000000000000000000013 -:10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000000000000000F2 -:10FE100000000000000000000000000000000000E2 -:10FE2000000000000000000000000000BBBB77776E -:10FE300008000000000000000000000000000000BA -:10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 -:10FE80000000000000000000000000000000000072 -:10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000000000000BBBBDC -:10FEB00077771C0000000000000000000000000038 -:10FEC0000000000000000000000000000000000032 -:10FED0000000000000000000000000000000000022 -:10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 -:10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000000000000000E1 -:10FF200000000000000000000000000000000000D1 -:10FF3000A5A5A5A5FAAFF55F000000000000000030 -:10FF400000000000000000000000000000000000B1 -:10FF500000000000000000000000000000000000A1 -:10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 -:10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000000000000000000051 -:10FFB0000000A5A5A5A5F96FF69F000000000000B0 -:10FFC0000000000000000000000000000000000031 -:10FFD0000000200888040403000310020011040834 -:10FFE0008808200020000000000000000408000431 -:10FFF0002000000820000000004020000000000851 -:02000004002AD0 -:1000000000000000000000000000000020000000D0 -:100010002008000000002000000000080000000090 -:1000200000000000000000000000000000002000B0 -:100030000000200000002000000000000000A000E0 -:100040000000400000000000000000000000200050 -:10005000000020000002000000900090009000408E -:10006000000000000040009000020000000000407E -:100070000000000000000000000000000040004000 -:10008000000000024000000000000000000000002E -:10009000000000000000000000000002000000401E -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000004000 -:1000C0000000000000000000000000000000000030 -:1000D00000000000000004002000200004002000B8 -:1000E0002000200020000000000088002000000008 -:1000F00000000000000010000000000000000000F0 -:1001000000000000080020000000000000000000C7 -:1001100000000000000000000000000004000000DB -:1001200000000000000008000000000000000000C7 -:1001300000000000000000000000000000000000BF -:1001400008000000000004000000000000000000A3 -:100150000000000000000800098205820904200454 -:10016000000404040904050400040004040409084C -:100170000008200400820082200400000000090022 -:100180000004000400040004000000000000000857 -:1001900000900004000000000000000800000000C3 -:1001A000000020000000000400000000000000002B -:1001B00000080000000000000008400400000000EB -:1001C0000008800000000000800000000000000027 -:1001D00000080000000000000008100300000021DB -:1001E00000110408000800110009000000000002CE -:1001F00000040000000000000000000000000000FB -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:10023000000000000000000000000000200020007E -:100240002080200000000000010000800000000964 -:100250000000000300030040000000000000000058 -:1002600000900088008200000000000000000000F4 -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B00000000000000000000000000000C08000FE -:1002C0008000800480000000008402000020000004 -:1002D000000000000000000000000000000000021C -:1002E0000000C0008202000000000020002000008A -:1002F00000000000042000000000002000090000B1 -:1003000000000000000200000000000200000000E9 -:1003100000000000000000000000000000000000DD -:1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD -:10034000000001800000008000000000000000406C -:10035000000000000000000000000000000000009D -:100360000000110021002100030003000000000034 -:100370000000400000000000080000000800040029 -:100380000000000000000000000000000800000065 -:10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D -:1003B00000000000000000000000000000840000B9 -:1003C00000000000024000000004000000A0000047 -:1003D000000000000000000000000000000000001D -:1003E000000000400000000000A100020020820088 -:1003F00000020000000000000040000000000000BB -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:10043000000000000000000000000000200000009C -:100440000000000001802080000004800011902145 -:10045000000000000000000000000000000000009C -:100460000008000000000000000000040000000080 -:10047000000020000000000000000000000000005C -:10048000000000000000000000000000000000006C -:100490000000000008000000000000000000000054 -:1004A000000000000000000000000000000000004C -:1004B000000000000000000000000000000000003C -:1004C000000000000000201005040082000400006D -:1004D00000000000000000000000000021000000FB -:1004E0000000000002000000000800000000000002 -:1004F000000000008200000000000000000000007A -:1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB -:1005400000000000000000009000014000000100D9 -:100550000021002100400500000000090008000003 -:10056000000008000000100000000001040000006E -:1005700004000300110005000000410008022100F2 -:100580000000110000000000000000000800000052 -:10059000000000000000080000000800000000004B -:1005A000110000000000000000000000000000003A -:1005B0000008000000000000000000000000000033 -:1005C00000000000000000000000000040010000EA -:1005D0004000410000000001881000000000000001 -:1005E00000000000000000000000000085009000F6 -:1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA -:1006200000000000000000000000000300000000C7 -:1006300000000000000000000000000000000000BA -:1006400000000000000000000000000001010001A7 -:10065000A001000004918821009190090000000091 -:100660000000000000000000000000000000C100C9 -:1006700080000000000000000000000000000000FA -:10068000000000000000000000000000000000006A -:10069000000000000000000000000000000000005A -:1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A -:1006C0000000000000000000000000000000110811 -:1006D0002103091100038091000808108008000020 -:1006E000000000000000000000000000000000000A -:1006F0000080110011800000008000000000000058 -:1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:1007500010890800110210200000000880820000AB -:100760000000000000000000000000000000000089 -:100770000000008201000040000000C000000000F6 -:100780000000000000000000000000000000000069 -:100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000909011008900019000000000A0022C -:1007E0008210000000000000000000000000000077 -:1007F000000000000000C000010100000000000037 -:1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000000000D8 -:1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000000000A8 -:100850000000000000011101010100002082019050 -:100860000090C02000000000000000000000000018 -:100870000000000041000011801111410000000043 -:100880000000000000000000000000000000000068 -:100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D000000000000000002111100821022000008B -:1008E000400009008000000000000000000000003F -:1008F000000000000000000800050000009100005A -:1009000000050000000000000000000000000000E2 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:10095000000000000000000040808011210008110C -:1009600080008009000080000000000000000000FE -:1009700000000000000000000001000100000083F2 -:100980000000000100000000000000000000000066 -:100990000000000000000000000000000000000057 -:1009A0000000000000000000000000000000000047 -:1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000001C01021A1087C -:1009E0000101C000A0009082020000000000000091 -:1009F0000000000000000000000081000060000214 -:100A000084110000000000008100000000000000D0 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A500000000000000000000000000048000060EE -:100A6000000081000011006006000011000000007D -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 -:100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD00000000000000000000000000000000FF017 -:100AE0000FF0000000000F0F0000DDEEFFFF000020 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000FF00FF0000000000B0B0600FFFFDDEEA2 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C6000000000000000000004000400000000007C -:100C7000FF00000000000000000000000000000075 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE00000000000000000000000050005000000FA -:100CF00020000000000000000000000000000000D4 -:100D000000000000000000610006C000200000009C -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D6000000000000000000000610007C00D00014D -:100D7000A061003B000D00A000000000000000008A -:100D80000000000000000000000000000F0FA5A5FB -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE00000000000000000000000FFFFF7F71015F2 -:100DF000202A0000000000000000000000000000A9 -:100E00000000000000000000000000000000AAAA8E -:100E1000FF000000000000000000000000000000D3 -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E6000000000000000000000000000F7F7FFFF96 -:100E700004A408580000000000000000000000006A -:100E80000000000000000000000000000000000062 -:100E900055AA00FF00000000000000000000000054 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000101 -:100EF000400200000000DFFF555500000000000028 -:100F000000000000000000000000000000000000E1 -:100F1000000055AA00FF00000000000000000000D3 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000410082000001000CFFF00000000000057 -:100F80000000000000000000000000000000000061 -:100F90000100110004001100000004418400000061 -:100FA00000088403880800080008040800080008F6 -:100FB00000002000000020040000000400000008E1 -:100FC00000080008000800000004200000040004DD -:100FD00000010008200000040004000000000000E0 -:100FE0000000000000000000000000000000000001 -:100FF00000000000200000004000080088000800F9 -:101000000000000088000000000000000000400018 -:101010000000020202020002029000C00040000430 -:101020000004000240000040100400020000000024 -:1010300000000000000000000000000000000000B0 -:101040000000400000004000000000000000000020 -:101050000000000000000000000000000000100080 -:101060000000000000000000000000000000000080 -:101070000000000000000000000080008000000070 -:1010800080000000000000000000000000000000E0 -:1010900000000000840082000200840004000000C0 -:1010A00004008400000000000000000000000000B8 -:1010B000000000000000000000000021000000000F -:1010C0000000000000000000000000000000000020 -:1010D0000004000000000080000000000004000088 -:1010E0000000000000000000000000000000000000 -:1010F000000000000000A00000000002000000004E -:1011000008000000000000000000000000000000D7 -:10111000000000000000000005008000000000004A -:101120000000410000004100000000000400000039 -:10113000000000000000000000080000000000089F -:10114000000800080000008200000082000800087B -:10115000000800080008000000040008000800085B -:1011600000080008000800080008008400080008C3 -:1011700000080008000800080004008800090008B2 -:1011800000088008000800080004000000040008AF -:10119000000800080008000840008800880041009E -:1011A00084000000880000000000400000002000D3 -:1011B0000000020000000000000800000000000025 -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F000000000000100000001000000C008000025 -:1012000082808280000000000000000800000000D2 -:101210000000000000000000000000880000000046 -:101220000400000800080008000400A000000040BE -:101230000090000000000090000000000000000886 -:101240000008000000000000000000000000000096 -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:101270000000000000000400410004C00900050057 -:1012800000000320001000840000000000000000A7 -:10129000008400000000000000000000002000208A -:1012A00040040004000000000000000900000000ED -:1012B000000000000000000000000400000000002A -:1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E -:1012E00000000000000000000000000000000000FE -:1012F00000000000040004000400400000000002A0 -:101300004000000001020011000000000010000079 -:101310000000000000008400000000000000000049 -:101320001100040000001100110000000000000086 -:101330000000040009200000000000000000000080 -:101340001100080040001000000011000000000023 -:101350002100000241000000000000000000000029 -:10136000000008000000080010000000000000005D -:10137000000010000000800080008000800000005D -:1013800000018800000004011000000000000001BE -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000201D -:1013B00000000000820000000000000000000000AB -:1013C0000000000000000000A000000000008200FB -:1013D0000000000008000000000000000000000005 -:1013E00000000000000000000000000000000000FD -:1013F000000004000000000088200000000004003D -:10140000C0000180C0A005008380001000000080A3 -:1014100000000000000000000000000000000000CC -:10142000000000040008400002000040000004002A -:1014300004000000000000000000000000000000A8 -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:10148000800000000420002184024020032103206A -:10149000091000000000000000080000000000002B -:1014A000000000000000000000000000000000003C -:1014B0000009000000000000000000000000000023 -:1014C00000000020400000000000000000000800B4 -:1014D000000000009000000000000000000000007C -:1014E00000000000000000000000000000000003F9 -:1014F00000000000000000000000000000000000EC -:101500000005C000400000200041A00005080000C8 -:1015100000020009000000000008000000000000B8 -:101520000000100300000000000000000220000086 -:1015300000024000002040881100110000841100CA -:101540004102000000000000000000020000000056 -:101550000000080000000000080041000000210019 -:101560004100000011000000009000000000000099 -:10157000000000000000000000000000000000006B -:101580000000080000008000000100000000900141 -:10159000000000000000000000000000000000004B -:1015A00000000000000000000000009000000000AB -:1015B000000000000000000000000000000000002B -:1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E00000000000000000000002000000000000F9 -:1015F00000000000000000000000000000000000EB -:10160000000040C000900002000000C100900804EB -:10161000C00102880240000482A000000000000017 -:10162000000000000000000000000000008000003A -:1016300000000000000000000000000000000000AA -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:10168000000000008080008000800000029003A124 -:10169000808580098080800000808000000000003C -:1016A00000000000000000000000000000000080BA -:1016B000000000000000000000000000000000002A -:1016C000000000000000000000000000000000001A -:1016D000000000000000000000000000000000000A -:1016E00000000000000000000000000000000009F1 -:1016F00000000000000000000000000000000000EA -:101700000000000080000900804185C19180100028 -:1017100020009084A1A100000000800000000000D3 -:1017200000000000000000000000000000000000B9 -:101730000010000000900000000000000000000009 -:101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 -:101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:101780000000000000009000000040008503C090B1 -:101790000188000004C0C10500004000A000000056 -:1017A0000000000000000000000000000000000039 -:1017B0000000000088900000000000000000000011 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:101800000000000000000000000000000002009046 -:10181000C0C040010021C09100C1904000020040C2 -:1018200000040000000000000000000000000000B4 -:101830000000100000000080000000000000000018 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:1018800000000000000000000000000000000083D5 -:10189000008080808020110490A0008400000080DF -:1018A00000000080000000000000000000000000B8 -:1018B0000000000000118000008000000000000017 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000400000000000000000A8 -:101900000000000000000000000400000000801142 -:10191000808400000080C19183899000081000003D -:1019200000000000000000000000000000000000B7 -:10193000000000000000000120000008000000007E -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000100000000000066 -:1019800000000000000000000000000000900000C7 -:10199000C001200200000008C18520400488010128 -:1019A0008800900000008800000000000000000097 -:1019B0000000000000000000000000000700000020 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F0000000000000000000000081000060000006 -:101A0000000000000000000000000042000006008E -:101A10000000004200000600004200110000060025 -:101A20000042000000000000000000000000000074 -:101A30000000000000000000000000FF000000FFA8 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A9000000000000000AAFF0000A0AF0000A0AFFF -:101AA0000000F0FF00003C0000000000000000000B -:101AB00000000000000000000000000000FF000027 -:101AC00000FF000000000000000000000000000017 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B1000000000000000000000550000A0AF000021 -:101B2000A0AF0000000F00003C000001000000001A -:101B300000000000000000000000000000000000A5 -:101B4000FF000000FFFF0000000000000000000098 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000F5050000AF05000097 -:101BA000FF0F000055FF0000000000000F000F00B5 -:101BB0000000000000000000000000000000000025 -:101BC0000000FF0000000000000000000000000016 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C1000000000000000FFFF0000F5050000AF0518 -:101C20000000F0000000550000000C0000000F0054 -:101C30000F00000000000000000000000000000095 -:101C4000000015002A00054000A800000000000068 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000610006800D00000000000060 -:101C90000000000000000038000010C003E3033E15 -:101CA0000C0D92C003E3033E0C0DC2C00000000007 -:101CB0000010000000000000000000000000000014 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000F0F0F0F3C3C0000C0C000FF000080 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA000000000000F0F0F0F0C0CFF55828200FF88 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E2000000000000000C3000000FF00FF00FAF007 -:101E3000AAA0000000000000000000000000000058 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000C3000000FF00FF1061 -:101EB000FBF1ABA1000000000000000000000000EA -:101EC00000000000000000000000000000004000D2 -:101ED0004002A0000411100000001000044140085E -:101EE000000800088908048800084088C008200805 -:101EF000200820082000000800080000C00820007A -:101F000000000000000800080004209000022000EB -:101F1000200000002000200000030000000020003E -:101F20000000C0000000C000000088038800880096 -:101F30002000000000002000C000A000A0008803D6 -:101F40000000000000000000000000000000004051 -:101F5000104000000040004000C040400000000071 -:101F60000082000000001000400810020010400035 -:101F70000000000000000000000000200000000041 -:101F800000000002000000014001000100210000EB -:101F9000000000000000000000000000000000023F -:101FA00041000000000000000000100000022000BE -:101FB00000000000000000000000000000004000E1 -:101FC0000000000000000000000000000000000011 -:101FD00004000200020004000000000000000000F5 -:101FE00000000000000004000000000000000400E9 -:101FF00000000000000004000000000000000000DD -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:10203000114000000000000000000000000000004F -:102040008200000000000000000000000005000009 -:10205000104000000400000000000000000000002C -:10206000040000000000000000000000000000006C -:102070000000000000000000000000000000000060 -:10208000000004000008000800080008000800081C -:102090000008000000080008000800080000000810 -:1020A000008400000008000800080008000800087C -:1020B0000008A00800080008000800080000000848 -:1020C00000000000000400080008000800080008E4 -:1020D0000008800888000000000040004000040064 -:1020E000900000000000000088000005080000804B -:1020F000008000000000000000000000000000213F -:102100000000000000000000000000000080020548 -:10211000008000000000000000000000000000003F -:1021200000000000000000000000000000000000AF -:102130000040000900000021000000218440000050 -:1021400088038408400000210000002100000000F6 -:10215000002100000000400040000400000040900A -:1021600000000000000000000000000000008000EF -:10217000004000020000000000000000000000001D -:10218000000000000000000000000000000000103F -:10219000800000200000000000000000000000009F -:1021A000000000000000000000000000000000002F -:1021B00000004100000000000000000000000000DE -:1021C00000000002000400002100000000000000E8 -:1021D0000000000000000000884004000000000033 -:1021E00010000000000020408200A000A0000000BD -:1021F000A0000000A080820082000000A00000007B -:1022000000000000000000000000000000000000CE -:10221000A0000000000000000000A000000000007E -:10222000000000000000A0004000820084000000C8 -:1022300000009000A0008200000008008200000062 -:10224000080000008200000000400400820000003E -:1022500082000000820008000080200000000000D2 -:10226000020000000000000000002100400000000B -:10227000000000000000002000000000000000003E -:102280000000000008000000000000000000000046 -:10229000000000000000000000000000000000003E -:1022A0000000000000000000000000000800000026 -:1022B000000000000000000000000000000000001E -:1022C00000000000000000000000000008200000E6 -:1022D00008000000000000000000000400000000F2 -:1022E00000000000000000000000000000000000EE -:1022F000000000000000A00001000100000000003C -:10230000000000000000A000000000000800000025 -:102310000000000000000800000000000000A00015 -:1023200000000000000000000000000000000000AD -:1023300000000421000000000021000000008200D5 -:102340000000000000008200000000000000000803 -:10235000000000000000000000000000000010006D -:102360000904090000200000050000000000000032 -:102370000000000000000000000020000400000039 -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D -:1023B0000000000004000000008800000000000091 -:1023C0000084000000000584009005040000400027 -:1023D00000000000000000000000000000000000FD -:1023E000000000000400200088000420A00000007D -:1023F0009000040004209004000000210400200448 -:1024000000008200822020118200000000000000F5 -:10241000840000000000002008000005000000000B -:102420000000000008110800080082000000000001 -:10243000000200000800000000000420000200214B -:102440008200A000080000000800A00800000000B2 -:102450000002000000000021000008000000002130 -:102460000800000000001100000000000000000053 -:102470000500000000000000000000000000000057 -:10248000000000000000000000000000002000002C -:102490000000000000000200020000000000000038 -:1024A000000000000000000000000000000000002C -:1024B000000000000000000000000000000000001C -:1024C0000000000000000000008800000000000084 -:1024D00000000000000000000000000000000000FC -:1024E000000000000000C1000001C1820100C00026 -:1024F0000140C105C00105010082C0900000C0007C -:10250000018304000000C1000001C1820100C0007D -:102510000140C005C000C0010040C0820000C000F2 -:102520000185A000000100010001000100C00001C0 -:10253000820100C0008300010001000800020001C8 -:10254000040100C1000000010001000100C0000101 -:10255000820100C0008300010001000800020001A8 -:10256000400100C100000041C1410041C182414120 -:102570008041418984838020A00800808000004140 -:102580008041040380000041C1410041C1854141B7 -:10259000804141C0C0838305C10300808080004129 -:1025A000804110830000000000410041004100898B -:1025B00000410041008503C100102041008000005F -:1025C000004180410083000000410041004100853E -:1025D0002041004100C003C1001040410080008044 -:1025E00000410041008300004100094100C100009A -:1025F0004141A0410041094140C102410080100019 -:102600004100C14100C180204100404100C10000A3 -:102610004141A0410041094140C1204100828380E5 -:102620004100C14100C18090000241000300000050 -:1026300000804100A000000010000900820000009E -:1026400091004100C10000808000410003000000B3 -:1026500000804100A1000000100005000200000001 -:10266000A0004100C100008080000000000100C106 -:102670000000000141010083000104C1C14100C00C -:102680009100A000400100C182010000000100C1D2 -:102690000000000141010083000190C1A00900C1B8 -:1026A00083C0A000400100C18203000001000100BE -:1026B000000000C00100C000000000002000080869 -:1026C0000020C0002100C100008282000100010042 -:1026D000000000C00100C0000000000088002008C9 -:1026E0000088C0002100C10000828200004000007C -:1026F000C140000000000000C18310830082000080 -:10270000C140000000000000C000000000400000C8 -:10271000C183000000000000C183828300A000008C -:10272000C140000000000000C1000000000000C027 -:102730000001C0C100000000000100C1100400053C -:10274000000100C10000000000010001000000C005 -:102750000001C0C100000000000100C1C004002150 -:10276000000100C100000000000100000000008026 -:102770000041C1C1000000000041C1C00083004110 -:102780000041C1C10000000000218941000000801B -:102790000041C183000000000041C184008300416A -:1027A0000041C1C1000000000021A0410000000064 -:1027B0000080004180C1000000000041008380A033 -:1027C00000C1004100C10000000000410003000002 -:1027D0000080004180C1000000000041008380A013 -:1027E0000041004100C10000000000410041000024 -:1027F000C1C18009808300004100004105C103C1BF -:10280000C1C1008080C10000414100000080090377 -:10281000C1C0804180C100004100004105C103C129 -:10282000C141008080C100004141000280800382DC -:102830000000C100800080C10000410000051000C0 -:102840004100C141000080080000410000058000F7 -:102850004100C100800080C100004100000510005F -:102860004100C1410000800800004140000080009C -:10287000410040C10800408300000000820184C183 -:1028800001C14005C0C040C1000000010000C0C03F -:10289000008240C02001824000000000820104C18B -:1028A00001C1408340C040C100000001000140C0A0 -:1028B00001030000C1004000C0C10000010002008F -:1028C00089000100C1839000C000000001000000E9 -:1028D000C0000100C1004000C0C1000001000200B2 -:1028E00089000100C1839000C000000001000000C9 -:1028F000C00001000000000000004842000000008D -:1029000000004842484200600600484200000000C3 -:1029100000004842000000000000484200000000A3 -:1029200000004842484200600600484200000000A3 -:1029300000004842000000000000000000420000CB -:10294000000000000000811200480700480000005D -:102950000000000000000000000000000042000035 -:10296000000000000012811200480700480000002B -:102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:102990000000000000000000000000000000000037 -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 -:1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 -:102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000000000076 -:102A60000000000000000000000000000000000066 -:102A700000000000000000000000757B0000000066 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000DEAE757B00000000BA -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000DEAE0000757B00009A -:102AC0000000000000000000000000000000000006 -:102AD00000000000000000000000DEAE757B00007A -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000DEAE67E643407A -:102B00000000000000000231E000000000000000B2 -:102B10000C4000000000000002C267E667E6434088 -:102B20000000000000000231E00000000000000092 -:102B30000C4000000000000002C267E6000060C612 -:102B400003000000000000000031E0000000000071 -:102B500000000C0000000000000000C0630660C61A -:102B600003000000000000000031E0000000000051 -:102B700000000C0000000000000000C06306000020 -:102B800040004011410040004000000000004000B3 -:102B9000040000090000880800000440400404000C -:102BA000200020082008200800000000000020006D -:102BB00084000000000820008805000020000001BB -:102BC0000000400000000000000800008808000429 -:102BD00020002000000488082000200000002000C1 -:102BE00000002000000000000000000000000000C5 -:102BF0002002200000002000000000000000000073 -:102C000000404140000004000040000200000004B9 -:102C10000002000200020000050000000008000899 -:102C2000404000004000004000020000000200029E -:102C30000000000000000000200000000000000074 -:102C40000000000040000000000000000000000044 -:102C50000000000000000000000020000000000054 -:102C60000000000000000000000000000000200044 -:102C70000000000000000000000000000000000054 -:102C800000000200020082000200020000000000BA -:102C900000000000000000000040000000000000F4 -:102CA000000000000000000000000008000000100C -:102CB0000000044004000020082000000000000084 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000080000082000000E2 -:102CF0000000000000000000000090000000000044 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D200000000000000000000000020000000000A1 -:102D30000008000080008000000900010008000871 -:102D400000080008000000080000000800080084D7 -:102D5000000000040000000000000008000400085B -:102D60000008000400080008000000200304000818 -:102D700000020004008400000002000800040002B9 -:102D8000000200000008840005004100110010004E -:102D900000000000000040034000000800000000A8 -:102DA0000003000000080000000000000000000018 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000008000000000000000000000000EB -:102DE00000030000000000000000000000210000BF -:102DF00000000000000000000000000000210000B2 -:102E00000000000000000021000004000400200079 -:102E1000000004000000000000000000000000109E -:102E2000100000080000000000000000000000008A -:102E3000410003000000000000000000000000004E -:102E40000000000000000000000000002100000061 -:102E5000210021002100210000002100000800A025 -:102E6000000000000000000010004100050040408C -:102E7000210003002100000005000300000800A05D -:102E800000000008000000000000000400200140D5 -:102E90000020C00200000000000000401000000000 -:102EA00000000000400000000003000000000000DF -:102EB000040000000800880000000000000000007E -:102EC00000000000000008000000000000000000FA -:102ED000000008000000000000000000A00000004A -:102EE0000010000040000000000000008200000010 -:102EF00000000000000000000000000400000000CE -:102F00000000000040000000400000000000200120 -:102F1000200000010000000000000002000000008E -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000410000000000000000000000000808 -:102F80000000000000000000000000000000010040 -:102F900004000000100000000021000000210000DB -:102FA0000000018000000000000000000003000895 -:102FB0008200000800000000000000000000000087 -:102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000080000001000C9 -:102FF00000000000000000080003000000000000C6 -:1030000000000000000000080000000000000000B8 -:1030100004000900000091002100000000080000E9 -:103020000000100008100000000000000000000078 -:103030000000000000000000000000000000000090 -:103040000000000000000300000021000300000059 -:10305000000000000000000000000000000003006D -:10306000000800000800000003000000002000002D -:103070000040000000000000000040C00000080008 -:1030800000A000000800008408000000000000000C -:103090000000108000000080000000000000000917 -:1030A0000000000000000000000000000000000020 -:1030B000000000000000000000000200020000000C -:1030C0000000000008000000000000008200000076 -:1030D00008000000080008000800000008000000C8 -:1030E00000000000000000000000000000000000E0 -:1030F00000000800000008000000000000000000C0 -:1031000000000000000000000000000008000800AF -:1031100000020800802011000020200000000000B4 -:10312000000020000000000000000000020000007D -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F -:103170000000000000000004000000000004000047 -:10318000000000000000000000000000000000003F -:10319000000000000000010000000000000000002E -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF -:1031D00000000000000000020000000000000000ED -:1031E00000000000000000000000000000000000DF -:1031F0000000000000000000A0100020000288C0B5 -:1032000000000000000000000000000000000000BE -:10321000000000000000000011002100000000007C -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000008000000000804E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000041098000095B -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C000000000000000000000000000008000007E -:1032D000008000000000000000000000000000006E -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000020AE -:10330000008000000000000000000000000000003D -:10331000000000000000000000000000000101109B -:10332000000000020000000000000000000000009B -:10333000000000000000000000000000000000008D -:103340000000000000000000000000000000000479 -:10335000000000C0000000000000000000000000AD -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:10338000000000100000000000000000000000002D -:10339000000000000000000000000000000000002D -:1033A0008800100000000000020000000000000083 -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000004000000000000000000000000000AD -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000010900008009008880000000000000000F4 -:1034100000000000000000000000000000000000AC -:103420000200000080004100000080000000000059 -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:1034500005000000800000000000000000000000E7 -:10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:1034800000000000000000000080000000000000BC -:10349000000000000000000000000000000000002C -:1034A0000000000000110000080000000000000003 -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000020000000000000000000000000CC -:1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:10350000000000000000800000000000000000003B -:1035100000000000000000000000000000000000AB -:103520000000000000000001000001000000000099 -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:10355000000000000001000000000000000000006A -:10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:103580000000000000009000020010008400000015 -:10359000000000000000000000000000000000002B -:1035A000000000000000000000E0070481000000AF -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D000000000000000008200000704000A000054 -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000006000000B4 -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A -:10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A -:10367000000000000000000000000000000000004A -:10368000000000000000000000000000F0F01FFF3C -:103690001FFF00000000000000000000000000000C -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000000000000CA -:103700000000000000000000000000009090F0C0E9 -:103710000FFF3FFF0000000000000000000000005D -:103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 -:103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000000000000000000000000B8 -:1038100026009000000000000000000000000000F2 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:1038900000002600909900000000000000000000D9 -:1038A0000000000000000000000000000000000018 -:1038B000000005580A06050C04A0000000000000E6 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E000000005180A20050004A0000000000000E8 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 -:103910000000000000004000000000000000000067 -:103920000000000000000000000000000000000097 -:103930000000000000003C3CFFFF00000000000011 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 -:1039B00000000000000000003C3C0000000000008F -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A3000000000000000000000000000F0F00000A6 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000F0F026 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000002000000000000000040051 -:103B50000000000000000000000020000000000045 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000020000000000025 -:103B80000000000000000000000000000000000035 -:103B9000C0000000C00000000000000000000000A5 -:103BA000000000000000000000108400020000007F -:103BB000200000002008000000000000000000C0FD -:103BC000410000000040008210A000002000100012 -:103BD00000000020000000000000000000000000C5 -:103BE00000000000000000002000000000020000B3 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000200000000000000000000B2 -:103C10000000000000000000000000000000400064 -:103C20000000000000820000000000000000000012 -:103C30004000000000000000000000000000000044 -:103C400000410200004000090200022120408200E1 -:103C5000000000000200000000000000200004003E -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C900000400000000000000000000000000000E4 -:103CA000000800000000000000000000000000000C -:103CB000820800000000000000000000000000007A -:103CC000084000400000000002000000000000006A -:103CD0000208000020002000020000002000000078 -:103CE0000084004000000000000000000000000010 -:103CF0000040020000000000000000000000000082 -:103D000000000000040000000200000000000000AD -:103D10000000001000000000000000000000000093 -:103D20000000000000000000000000000000000093 -:103D3000000004000000000000000000000000007F -:103D40000000000808088800880010008400840033 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000800000800000000000000000033 -:103D80000000000000000000000000000000000033 -:103D9000000000000000000084000000840000001B -:103DA0000000000000000000000000000000000013 -:103DB0000000900040000000080000000800000023 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E200000004000000000000000000000002182AF -:103E300000820000000400000000000000000000FC -:103E40000000000000000000000900000000000069 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB00000000000000000000010000000000000F2 -:103EC000000000000000000000000000000000886A -:103ED00000000000000011000000000000000000D1 -:103EE000000000000000000000880000000000004A -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F200000000000000000000000000009000090F8 -:103F30000000000000400000000000000000000041 -:103F4000000000A0000000000000000000000000D1 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB00040000000000000000000000400000000BD -:103FC00000000000002100000000000000001004BC -:103FD000000000840020000000000000000000003D -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:104000000000008800000000000000000000000028 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:10403000090405000000200000000000000000004E -:104040000000000000000000000000000000000070 -:10405000000000000000000000000000000200005E -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B00008000000000000000000000000000000F8 -:1040C00001000000000000000021000000000000CE -:1040D00000000000090000000900000000000000CE -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000500000000000000BB -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:1041300000000000000000000000000000C00000BF -:1041400000000284000000000000000000000000E9 -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000002FD -:1041C00000880082000800000000000000000000DD -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:1042400000800000000000000000000000000000EE -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000300000000000000000000EB -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000009100880008000000004C -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C0000000000000000400000000008800000061 -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D000800000000000000000000000000000005C -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:104540000000000000000000000000008800900053 -:1045500082000800000000000000000000000000D1 -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000AFAFAFAF0000000000000000000000009E -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D0000000BEAABEFF00000000000000000000B5 -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:1047500000000000FFFFFFFC000000000000000060 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D000000000000000FFEBFFE800000000000008 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000030000000000028 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A700000000000000000000000C0000000400036 -:104A80000000000000000000008021000000000085 -:104A9000018000000000000800002000000020004D -:104AA00000000000000000204000000000000000A6 -:104AB00000000000000000000001000000000000F5 -:104AC0000000000000000000008020000000000046 -:104AD000040004000400000400040000C0000004FE -:104AE00000044080C0802004820400000000000414 -:104AF000000300008800000400002020092000209E -:104B0000000020000008000820A020042000202031 -:104B1000000002080000000000000000000000008B -:104B20000000000000000000000100002000000064 -:104B30000000000000000000000000000000000075 -:104B400000000000004000000000412000000000C4 -:104B500000008008800080000000000000000000CD -:104B60000000000080020020800000000000000023 -:104B70000000000000000000000000000200000033 -:104B800004000210000000000000000020002000CF -:104B90000004000400000000000000000800000005 -:104BA00000100010000000000000A0200000000025 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000300000000E2 -:104BD00000000000000000000000010000000000D4 -:104BE00000000000000000000120000000000000A4 -:104BF000000000000000000000000000000000C0F5 -:104C0000050082C0000000C0000000080200830808 -:104C10008000050111850010000000100008000050 -:104C2000000000000000000000080008000100086B -:104C30000000000004000000000000000008000068 -:104C4000000000000000000800000008000800004C -:104C50000008000000000000000000000400000840 -:104C6000000000000000000800000409000800081F -:104C700000080000000000040000000000000084A4 -:104C800000000000100010000000000800000000FC -:104C90000200080000000000000000000000010009 -:104CA00000000000000000080000000000000000FC -:104CB0000000000000000000004000000000004074 -:104CC00000000040000000000000000000000000A4 -:104CD000000800000000000000000000004100008B -:104CE000000000000000200000008800000000809C -:104CF0000041000000000000000000000000000073 -:104D0000000304001000000000000000000000008C -:104D1000000000080000000000000000000000008B -:104D2000040000000000000000000000000000007F -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000210042 -:104D5000000021000000000000000000000003002F -:104D60000000000000000000000000000000000043 -:104D7000000400000000000000000000000000002F -:104D800000000000822000200000008000000000E1 -:104D90000000000000000000000000000000000013 -:104DA000018001040000000000000000000000007D -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD0004000000000000020002001000100002031 -:104DE00000000000010000400000000300000080FF -:104DF0000200008400C1000000000000000000006C -:104E00000800000000000001000100000020000078 -:104E10000000004000002100000000000000000031 -:104E20000000202002000000000000000000000040 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E500000008000000000000001000104000400C8 -:104E600000010000000004A000C0000000000000DD -:104E700000100000000500100000000000000020ED -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000009000200062 -:104EA00000000000000010040000000000000000EE -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000020000D0 -:104EE00000000009900000000000C0000000000069 -:104EF0000000000004C0008000000000000000006E -:104F00000008A000000000000000100005000000E4 -:104F10000000000000000000000000000000000091 -:104F20008000000000000000800100000000000080 -:104F30000000000000000000000000000000000071 -:104F400000880000000000000000000000000000D9 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F700000000500098485200004000000000000F6 -:104F80000000000000000000000000000000000021 -:104F9000000000000200000000000000000000000F -:104FA00020000000000001000000000000000000E0 -:104FB00000090000000000000000000000210000C7 -:104FC00000000005000000000000002100000000BB -:104FD00008000000080000000000000000000000C1 -:104FE00000000000000000800141010000000000FE -:104FF0000000000084000000010000000000082103 -:1050000000000000000000000000000000000000A0 -:10501000020000000000000000000000000000820C -:1050200000008000000000002000000000000000E0 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000008200040000002004000400000092 -:10507000000000000000000000900400000000009C -:105080000000000000000800080000000000000010 -:105090000000000000000000000000000000000010 -:1050A000000000000000000001009000000200006D -:1050B00000000000000000008808002000900202AC -:1050C00000000000000000000000000000000000E0 -:1050D00000030000000000000000000100000000CC -:1050E000000040C000900010000000C000900000D0 -:1050F000000000000000000000004011011090912D -:105100008402000000000000000000000000000019 -:10511000000000000000000000000000000000008F -:10512000000000000000000000001100A10000804D -:10513000000000000000000000000280008000006D -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000001000102F -:10516000001000208080008000000000008000808F -:10517000000000000000000000000000A01021213D -:10518000801100200000000000000000000000006E -:10519000000000000000000000000000000000000F -:1051A0000000000000040000000200000008098068 -:1051B000001000000000000000000000800000005F -:1051C000800080800000000000000000000000005F -:1051D00000000000000000000000000000000000CF -:1051E00000000000801100008041804180800000AC -:1051F00000080000808000000000000000008080A7 -:10520000884180912105000000000000000000009E -:105210000000000000000000008400000084000086 -:10522000000000000000000100000001000000017B -:1052300001020001008800000000000000000800DA -:105240008800A0000890000000000000000000009E -:10525000000000000000000000000000000000004E -:105260000010880000009000000040008401C09001 -:10527000000088010000C0A0000000000000000045 -:1052800008404100A0A189000000000000000000CB -:10529000000000000000000001000000A00000006D -:1052A00000000000000000000000200000000000DE -:1052B00001008888080000000000020000000000D3 -:1052C000880800200090101000000000000000007E -:1052D00000000000000000000000000000000000CE -:1052E000000000000100000000000000001000901D -:1052F000C0C088890040C090C0C00000000000000D -:10530000000010820020018910030000000000004E -:10531000000000000000000000002000000000006D -:1053200000000000000000000000000080000000FD -:105330000400410000808000410000008000000067 -:10534000000000800080000000000000000000005D -:10535000000000000000000000000000000000004D -:105360000000000000000300110008000000000021 -:105370000080808000080080808080800000000025 -:1053800000000000802020000820009000000000A5 -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000050000F8 -:1053B0000000000000110000058000000000000057 -:1053C00000000000000200800080000000000000DB -:1053D00000000000000000000000000000000000CD -:1053E00000000000000021001002080008008011E9 -:1053F000000980000000801180848000000000000F -:10540000000000000000A04021000880880000008B -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C -:10543000000000000000000100000040000000002B -:10544000000000000000000000A000C000000000FC -:10545000000000000000000000000000000000004C -:10546000000000000000000001000000010000003A -:10547000C001101040000000C00140404088000002 -:1054800000000000000000000801C0C08902030005 -:10549000000000000000000000000000000000000C -:1054A000008200000704000000000000000000006F -:1054B000000002E000000000000000E007008200A1 -:1054C000000000000000000000820000060400410F -:1054D00000000000000000000000000000000000CC -:1054E0000000000000000000000000820000060034 -:1054F000000000820000060000420082000006005A -:105500000042000000000000000000820060060071 -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B -:10554000F0F000000000000000000000000030FB50 -:10555000303C0000000000000000000000000000DF -:10556000000000000000000000000000000000003B -:1055700000000000FFF000006F600000FF0000006E -:10558000F330000000000000000000000999090944 -:10559000909000900000000000000000000000005B -:1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C0000000F0F0000000000000000000000000FB -:1055D00070F8B0BA000000000000000000000000F9 -:1055E00000000000000000000000000000000000BB -:1055F00000000000000000F000006F600000F0F00C -:105600000000F33000000000000000000000899955 -:10561000898990D000D00000000000000000000048 -:10562000000000000000000000000000000000007A -:10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:10568000000000000000000000000000000000001A -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C0000F0F0000FFFF00000000000000000000BE -:1056D0005FFFEFFF676766660000000000000000E4 -:1056E00000000000000000000000000000000000BA -:1056F0000000000000000000F0F0000006F60000CE -:10570000069F000066660000F6F60000000000003C -:105710000000FFFFFF0000FF07070000000000007F -:105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 -:1057400000000F0F0000000000000000000000003B -:105750000000DFFEEFFF00670066000000000000B1 -:105760000000000000000000000000000000000039 -:1057700000000000000000000000F0F0000006F64D -:105780000000069F000000FF000006060000000069 -:10579000000000001000000000FF07FF00000000F4 -:1057A00000000000000000000000000005180A20B2 -:1057B000050004A0000000000000000000650006D5 -:1057C000000F200005402A06054C00A8000000003C -:1057D0000000000000000030000000000000000099 -:1057E00000000000000000000000000000000000B9 -:1057F0000000000000000061003E000D10C00382A8 -:1058000003380C0092C003E3033E0C0DC2C000003D -:1058100000000000000000610036000500000000EC -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 -:1058400000000000000000000F0FFFFF000000003C -:105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 -:105870000000000000000000A2AAF7FF00000000E6 -:10588000000000000000000000000000C3C3C3C30C -:105890000000000000000000FFFFFFFF28AA7DFFBE -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000000E8 -:1058C000000000000000000000000F0F00000000BA -:1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000AAA2FFF300006A -:105900000000000000000000000000000000C3C311 -:10591000C3C30000000000000000F353F5FF008245 -:1059200055D700000000000000000000000000004B -:105930000000000000000000000000000000000067 -:105940000000000000000000000000000000F0F077 -:105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 -:10597000000000000000000000000000E2E2E2E39E -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000106 -:1059A0000F0FFFFF000000000000000000000000DB -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D000F0F00000000000000000000000000000E7 -:1059E00000000000000000000000000000000000B7 -:1059F0000000000000000000000000000000005F48 -:105A000000DF0000000000000000000000000000B7 -:105A10000000000000000000000000000000000086 -:105A200000000F0FFFFF000000000000000000005A -:105A30000000000000000000200000000000000046 -:105A4000000000000000000000002000A000000096 -:105A500020000000200040002000000002000000A4 -:105A600000000000000000004000200000000000D6 -:105A7000200000000000000000002000000088005E -:105A8000000088004000010000002080200000008D -:105A9000000004000000000000000000000084007E -:105AA0000000C000C000C0000200020002000200AE -:105AB000000000000000000000A0002000A000A0E6 -:105AC0000020000000200000000000000000000096 -:105AD0000000004000020000000000000000000084 -:105AE00000000000000000000000000000020000B4 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000008000204000000020000095 -:105B10000000004080000002000040000000000083 -:105B200000000000000000000000800080008000F5 -:105B3000800040000000000000000241000004401E -:105B4000000000000000040004000000000000004D -:105B50000200000000000000020800000000040035 -:105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 -:105B8000000000000000000000000010880001007C -:105B900000000000000000000000050000080000F8 -:105BA000000000000000000000008208000000006B -:105BB000000000000000010000000200040004409A -:105BC000008802000400040000000000000800003B -:105BD0004000040405000000000004000008040068 -:105BE0000000048400000400000000080008000019 -:105BF0000000000800000000000000080000040889 -:105C00000000000020080000008200840008040852 -:105C100004000400008400000000000084100082E2 -:105C20000000000000840000000000000084000864 -:105C3000000000000000000002000000040000005E -:105C40000403000000000000000000000008000045 -:105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 -:105C7000000000000005000000000000000000001F -:105C80000000000000000002000000000000000012 -:105C90000000008000000000000004A000210100BE -:105CA00000008205004100080000000200024000E0 -:105CB000000000000000000500000000000000419E -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000000000000000000B4 -:105CF00000000000000000A0000000000000000004 -:105D00000000000000000000030000000000000090 -:105D100000840082002000A0000000008821000014 -:105D20000400410003000000080000000002000021 -:105D3000008800A00000000000A00000000000009B -:105D400000900000000000000000000000000000C3 -:105D50000000000000000000000000001000000033 -:105D600000000000000000000000000082000000B1 -:105D70000000000000000000080000008200000099 -:105D800008000000080000000000000000000005FE -:105D90000000030000000400000000000000A0203C -:105DA000400004400000080000000000001008054A -:105DB000000000100000820008000000C000000089 -:105DC000000000000088000000000000000000004B -:105DD0000000000000000000000000000082000041 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E0000000000000000000000000000030000008F -:105E100000000000900000008000000000000088EA -:105E200000910000800000000000000000000083DE -:105E300000844100004000820082000000A04184F4 -:105E4000030800000008000800000000000800032C -:105E5000000000000000000000000000000800003A -:105E6000000000000000000000000000000800002A -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000820090 -:105E900000000000C00082808200C02100210005B7 -:105EA000000004A10000000300410000004108417F -:105EB0000000000082000000000008000000001147 -:105EC0000003000000000040000000000088000007 -:105ED00000000000000000000084000000C000007E -:105EE0000000210000840084000000000000000089 -:105EF000000003080008000000200000000000006F -:105F00000000000000000000000000000000000091 -:105F10000000000000A000A00308000000000084B2 -:105F200000000000802000A00084000000000000AD -:105F300000000004080208020390000000000000B6 -:105F40000000000000000000000000000000000051 -:105F500000000000000000000000000088000000B9 -:105F60000000000900000000000000000000000226 -:105F7000000200000000000000000000000000001F -:105F80000000000000000000001000000000000001 -:105F900000000000080000000000000000030420D2 -:105FA0000003000500000021012100200000000086 -:105FB000004100020000001100000000000000216C -:105FC0000000000800008200000000100000000037 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 -:106000000000000000000000000000000000000090 -:1060100000000000000080000000000003000000FD -:106020008001000000840088008840024085000054 -:10603000000000C000000000080000080384000009 -:106040000800000005A0000008000000000000009B -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 -:10608000000000000000000000000000000000020E -:10609000000000000000000088C008088403101100 -:1060A000C005900900A1040802A005020010C082EA -:1060B00000000000000000000100000000000000DF -:1060C0008800008800900000000000000000000030 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:1061100000000000000000000000009090C089888E -:106120000008809080A100C000898080910000005C -:10613000808000000000000000002000000000003F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:10619000000000000000000000000000C180A10914 -:1061A000210209830000008000000003A000A0037A -:1061B000C080898000000000000000000000002175 -:1061C00000800000000000800008000000000000C7 -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E -:106210000000000000000000000000000000084036 -:106220001100030010890090001000000001890097 -:1062300091018508A090000000000000000000000F -:1062400000000084000800000040000100900000F1 -:10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE -:1062A000080900090010408940900188C000C0081A -:1062B0000420000400022002000000000000000092 -:1062C000000000000000000000020000400000008C -:1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D -:10632000000080A110890088009180004100410098 -:10633000008000200085008900C0000000000000EF -:10634000000000000000000000000080000080004D -:10635000000000000000000000000000000000003D -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD -:1063A00000000000410083A190801103830383005B -:1063B0004000040080000082008080020000000095 -:1063C0000000000000008000000000000008000045 -:1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C -:10641000000000000000000000000000000000007C -:106420000000000000000100020910109001A0000F -:1064300008000100000010900810408202010000D6 -:1064400000000000000040000200400004000001C5 -:1064500000A0009088000000000000A000000000E4 -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A000000000000000000000000060000000008C -:1064B000000000000600820000000000060000123C -:1064C00000000000000000000000000000000000CC -:1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B -:1065200000000000000000000000C3FFC3FF434F55 -:10653000434FFF00FFFFDFDF00002C2CFFFF103078 -:1065400003330000000000000000AAAAFDFF0000C5 -:1065500000003C3C3C3C96969696000000000000F3 -:10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB -:1065A000000000000000000000000000FCC0FCC073 -:1065B00003030F0FFF00FFFF49490000143C14FFC5 -:1065C000103000300000000000000000AAAAF8FA15 -:1065D000000000003C3C3C3C969696960000000073 -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:1066200000000000000000000000000000003FCF5C -:10663000A0A010001000F0FFF0FF00000000FFFF1E -:10664000C0FFFF3C503C00000000000000000000C4 -:10665000000000000000F00FF00FAAAAAAAA000094 -:106660000000FFFFFFFF000000000000000000002E -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00020C3A0A010000000D7FF14FF00000000BE -:1066C000FFFFE8FF000000000000000000000000E5 -:1066D0000000000000000000F00FF00F5555555568 -:1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 -:106730000000006150070009000100610E06000D15 -:10674000000000610006001D0000000000000000C5 -:106750000000000000000000000040008000002059 -:106760000002000000000000000200000000000025 -:106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 -:1067900000000000000000000000000000000000F9 -:1067A00000000000000000000000000000000000E9 -:1067B000000000003C0500C3AA00AF0F00000A0F54 -:1067C0000000000000000000FC00CC000000000001 -:1067D00000000000000000000000000000000000B9 -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 -:106830000000000000003C0A00C382008303E5E57D -:10684000E0E000000000000000000C000C00000070 -:106850000000000000000000000000000000000038 -:106860000000000000000000000000000000000028 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B000000000000000000000020000F0F0EB28E3 -:1068C000417D417D0000000000000000FFFFFFCF80 -:1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000000000000000000020000F0F075 -:10694000EB2883BF82BE0000000000000000AAAA5E -:10695000AA8A000000000000000000000000000003 -:106960000000000000000000000000000000000027 -:106970000000200020002000000000002000C000D7 -:10698000000000002000C000000000002000000007 -:1069900004080000200020000000C00020002000AB -:1069A000C0000000000020000000000020000000E7 -:1069B0002000000000008800200004000008000003 -:1069C00000000005000582004000840000002080D7 -:1069D000C000000088008800880020000000888037 -:1069E000002000204080008000202020008020A087 -:1069F00020200020004000000000000000080008E7 -:106A0000000000000008000800080000000000006E -:106A10000000000020000000000000000040000016 -:106A20000002000200000000000000000000400022 -:106A30000000000000000000000000000000000056 -:106A40000000000000000000000000000000000046 -:106A50000010000000000000000000000000000026 -:106A600000200001000100200020000100010020A2 -:106A70000421000100018200824000100010020089 -:106A800000000000000000000000041000100000E2 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000002000200000000000000E2 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000000000000000000C6 -:106AD0000000000000000000000000000000900026 -:106AE000032001000100000000000000000002007F -:106AF00000200000000000000040040004400040AE -:106B00000008040800000084008804080008000849 -:106B10000000000010000008040000000400040051 -:106B200000080008000000000008000800080040FD -:106B3000000000000010000800000000200000001D -:106B400040000004000800000000000800080008E1 -:106B500000000000000000000084000000000000B1 -:106B600000000485040804000088000800080508E7 -:106B70000000000100000000008400000000000090 -:106B80000000000000000000000000000000000005 -:106B900000000000000000000010000000000000E5 -:106BA00000000000000000000000000000000000E5 -:106BB00000000000000000000000000000000000D5 -:106BC00000000000000000000000000020000000A5 -:106BD000000000000000001000000008002100215B -:106BE000000000000000000000000108002100215A -:106BF0000000000500050021002100080000000041 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 -:106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C4000000000000000000000000000000820A07C -:106C500000A00088110000000000000000000000FB -:106C60000802080003000008000000000400000003 -:106C7000000200A000000000080003000000000067 -:106C800008000000000000000000000000000000FC -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 -:106CB00008000000000000000000000000000000CC -:106CC00000000000000000000000000000000000C4 -:106CD000C000C000C000C0000000C00000000000F4 -:106CE0000800080008000800000000000400000080 -:106CF00000000000080000009000000000000000FC -:106D00000000000000000000050005000000000079 -:106D10000008000000000000000000000008000063 -:106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 -:106D5000000000900500000040000000000000005E -:106D600000008004800080008900110000002000E5 -:106D70000000008400A000000084008800000000E3 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000008000800B3 -:106DD000080008000000000008000000002000007B -:106DE000002008000000001108009000400502008B -:106DF0000008000300A100A1838582200008000391 -:106E000000000105000000000000008800000000F4 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E4000000000000000000000000000000000083A -:106E500000A0000000A000000000000211000901D5 -:106E6000000000010000000000000000000080A001 -:106E700000000000000000040804200809010000D0 -:106E800000000000040000000000000000020000FC -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED0000000000000000000200020001000020060 -:106EE000004000200010002000000000C000000052 -:106EF0009009C000000000418321820001090105C2 -:106F00000009002100200021000000000000000016 -:106F10000000000000000000000003000500000069 -:106F2000000000000000000400000000000000005D -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 -:106F5000000000000000110000020000000000001E -:106F6000800000010001000100010000000000009D -:106F7000000011840082110020C0049000A00402CF -:106F800010000000000000010000000000000000F0 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000200000000BF -:106FD0000000000000000000000000004004000469 -:106FE0000008880011A0902090A0900404080002DE -:106FF00000109008C0030104081008C011C101046A -:10700000418410A0C0C000040010880200000000ED -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:1070500000000000000000000000000000008000B0 -:10706000000000800000908085800000808000800B -:10707000000000808080112010118011800440C128 -:10708000110888808080808000000080000000005F -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E0000400108400910000850085A010A091008C -:1070F0008000801180008000000000A180808080DE -:1071000000008010808880808000800500808000E2 -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:1071600000000100000800A0000088002041C1824A -:10717000A0900800104110840840020004C084045C -:10718000C0A090A010008485C0100800020010105C -:10719000C00000000000000000000000000000002F -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E00000000000080000040084820882C0000142 -:1071F00004C084C1900200024040880808110010B9 -:10720000C0400802C0040020021110C1040800821E -:10721000008810C000000000000000000000000016 -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:107260000000000000008000000000809180830585 -:107270000010801180C0C0000000008009808020C4 -:1072800003919191000480050502411009888080D6 -:1072900000800000028000000000000000000000EC -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE -:1072E000000000000000000080000011802180806C -:1072F0008004800880A18040000900048080000094 -:107300000002008200008000C109908900802000F6 -:10731000800000020080000000000000000000006B -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:107360000000000000000000000008000400080108 -:107370008208909184A19041A001020002028490B1 -:10738000A0000200002088020200C100108220023A -:107390000500C0000888048402000000000000000E -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F0000000000000000000060000000082000005 -:107400000600000000000000060048428400006002 -:10741000060084000000000006006000000000007C -:10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:1074600000000000000000000000000000000030EC -:10747000003096969696000000000000BD7E002029 -:1074800000E406030200E7E7EFEF0F6F0060DBDBCD -:107490000000C3C3000089FF000002C2000000001A -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000000099999696969F000000011800FFDB06 -:107500000020002406000200C3C3CFCF0FCF00C06D -:10751000DBD30000FFF7000008FF0000FFFF0000C2 -:10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B -:1075F000000000000906000000000000DFFB9F9B68 -:10760000F0F090903000640008008908FF383030B6 -:107610000000F0F10000FF900000DFC30000FFD089 -:107620000000FF81000000000000000000000000DA -:10763000000000000000000000000000000000004A -:10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A -:107670000000000000000906996600000000DFFB22 -:10768000009BF0F0109000006400080008083838F3 -:1076900030300000F8F90000FF300000C7C30000E0 -:1076A000FF100000FF0300000000000000000000C9 -:1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D00000000000000000000000000000000000AA -:1076E000000000000000000000000000000000009A -:1076F000000000000000000000613006000D0000E6 -:1077000005610A0E059D00A005000A38050000A0CD -:107710000361030E0C0D12C003A30309CC0D92C02C -:10772000038203080C0092C000000000000000006B -:107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 -:107750000000000000000000000000000000000029 -:107760000000000000000000000000000000000019 -:107770000000000000000000000000000000000009 -:107780000000000000000022440000000000000093 -:1077900000000000000008002B0041413CFF0C0EDF -:1077A00008080000000000000000000000000000C9 -:1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 -:1077D00000000000000000000000000000000000A9 -:1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 -:107800000000000000000000001122000000000045 -:1078100000000000000000000800280041413CFF7B -:107820000002000000000000000000000000000056 -:107830000000000000000000000000000000000048 -:107840000000000000000000000000000000000038 -:107850000000000000000000000000000000000028 -:107860000000000000000000000000000000000018 -:107870000000000000000000000000000000000008 -:1078800000000C0C0C0C000000000410082000008C -:1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000000000000000000098 -:1078F0000000000000000000000000000000000088 -:10790000000000000C0C0C0C000000000140028084 -:107910000000000000000000FC001010000000004B -:107920005555FF00000000000000000000000000AE -:1079300004000400000020008800880088008800FF -:107940008900400088000200C00088008800000014 -:10795000880088000400040520002000200020008A -:107960002000200020002000200000000000000077 -:107970000000200000002000200020008800880077 -:1079800020000000000000000400400010008800FB -:107990000000200000002000200020004000000027 -:1079A000880000008800C000400020000000200087 -:1079B00088000000000004000008004002004000B1 -:1079C0000040400080000000800000000000000037 -:1079D0000000000020000000000000000000000087 -:1079E0000002000000000000000000000000000095 -:1079F00000000000400000000040000000004000C7 -:107A00000000000040000000000000008000800036 -:107A10000000000000000000000000004000000026 -:107A200000000000000000000000800000000000D6 -:107A3000000000000000204088000000020002005A -:107A40002000004000000000000000000000A00036 -:107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 -:107A70000000000000000000000000000000000006 -:107A800000000000000000000000000000001000E6 -:107A90004000000010000000040000000000000092 -:107AA0002000200011000000000000000000000085 -:107AB00000000000084000002000000000080488CA -:107AC0000400020000100408040000000400040088 -:107AD0000400020000080000000000000008000090 -:107AE0000000000004000008040000000000000086 -:107AF000040000000010000000000000000000086A -:107B000000002082000000000010000000000000C3 -:107B10008900C10000008310000000000000000880 -:107B20000000A0008000A000000000000000000095 -:107B30000000200000000000000000000000000025 -:107B40000000000000000000000000000000A00095 -:107B50000000000000000000000000000000000025 -:107B60000000000800000000000000000000000508 -:107B70000000000000000000000000000000000005 -:107B800000000000010000004000000000000000B4 -:107B900000000080000002800021000000000000C2 -:107BA0000000000083A10000110800800000000018 -:107BB000000800000005000000080300080008009D -:107BC00000000000000008000000000000000000AD -:107BD000000000000000000000000800000000009D -:107BE000080000000000000000000000000000008D -:107BF0000000000000000000000000000000000085 -:107C000000000000000010000000800000000000E4 -:107C10000800008400040000800200000000000052 -:107C20000000000000000208000082010002008441 -:107C3000000000A00008008400A0004008008200AE -:107C400082000000A000080004000000A0008200E4 -:107C50000000000000000000000000000000000024 -:107C60000000000004000000000000000000000010 -:107C700000000000000008000800000000000000F4 -:107C8000000000000000C000000008000000A0008C -:107C90000000000000000800A000A000C00082005A -:107CA0000400000000008200000000000900000045 -:107CB000C0000000A00082000000000000000000E2 -:107CC00004000000000000000000000000000000B0 -:107CD0000800020000000300000000000200000095 -:107CE0000000000000000000000000000000000094 -:107CF000000000000400030000000000000000007D -:107D00000000000000000000000000000000000073 -:107D1000040000000000000000000004000000005B -:107D2000040000000400000000000000000010003B -:107D3000000000000000080000000000000000003B -:107D400000000000000000008200000082008200AD -:107D50000000000000000000000000000000000023 -:107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000000003 -:107D800000000000080000000000000000000000EB -:107D9000080008000000000008050100010020881C -:107DA0000104000000000000A00000000000082006 -:107DB00010080041000000000080000000000000EA -:107DC0000000002000000000000000000000000093 -:107DD00000000000000000000000000000000000A3 -:107DE0000000000000000000000000000000000093 -:107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000072 -:107E1000000000000082000000000084200020001C -:107E200083092001000241000008008402000000D4 -:107E3000000180A10010210041A0110200020000F9 -:107E4000000800A08200000000000000080082007E -:107E500000000800000000000000000000110021E8 -:107E60000000000000000000000000000000000012 -:107E70000000000000000000000000000000000002 -:107E800000000008000000000000000000004000AA -:107E900000000000000000000800C0000800000012 -:107EA000000000004021000304000000000000006A -:107EB000040000000420000000090009000900007F -:107EC00000030000000000000000000000000000AF -:107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000000000000000092 -:107EF0000000000000000000000000000000000082 -:107F00000000000000000000000000000000000071 -:107F100080000000000000000000000000000000E1 -:107F20000000000000000000000000000000000051 -:107F30000000800000002041000000000000000060 -:107F40000000000000000000000000000000000031 -:107F5000000000000000000004A121010000000456 -:107F60000000000000000000000000000000000011 -:107F70000000000000000000000000000000000001 -:107F800000000000000000000002000000000000EF -:107F900000000001010110000000000000000000CE -:107FA0000000000188000201000100000000000044 -:107FB000000010A0050402C100050001010102003B -:107FC00000010000000000000000000000000000B0 -:107FD000000000000000000000008082102100046A -:107FE0000080000000000000000000000000000011 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000400404001000020000000006 -:108020000000000011418002C103000200000000B6 -:10803000000000008088A04080200009000203406A -:108040008020000800000000000000000000000088 -:10805000000000000000000000000000000082009E -:10806000C08080210000000000000000000000002F -:108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000020400504052041A1000060 -:1080B00000000000000004002000910903020000FD -:1080C0000000000000800000000000000000000030 -:1080D000000000000000000000000000000000A000 -:1080E0000300A0A0820100000000000000000000CA -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000200001019001A1FB -:1081300000000000000000000300C108A0C01141C1 -:10814000000000000000000400000000000000002B -:10815000000000000000000000000000000000001F -:10816000084000040103200100000000000000009E -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000000000000EF -:1081900000000000000000000000000001010000DD -:1081A000000100000000000000000000210090001D -:1081B00001010000000000000000C0C0010840C133 -:1081C00010A10000010001010001000000000000FA -:1081D000000000000000000000000000000000009F -:1081E00000008020098005A10810000000000000A8 -:1081F000000000000000000000000000000000007F -:10820000000000000000000000000000000000006E -:10821000000000000000000000000000001120200D -:108220004141004100000000000000000004020580 -:108230000000104100000000000000004004108217 -:108240000008004100040840400200400000000017 -:10825000000000000000000000000000000000001E -:108260000000000009409080A0800521000000006F -:1082700000000000000000000000000000000000FE -:1082800000000000000000000000000000000000EE -:1082900000000000000000000000000000000004DA -:1082A0000000000000000000000000000000C1808D -:1082B00090000000800500000000000000004191D7 -:1082C00082042100C0000000000000000000000047 -:1082D000000000000000000000000000000000009E -:1082E00000000000000082A0030284402001000082 -:1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:10831000000000000000000000000000000000005D -:10832000000000000000000000000000000000004D -:1083300009400500000004000000000000000000EB -:10834000C1A12005A1C0080000000000000000003D -:10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D -:1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED -:1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD -:1083B000000000000060000000000000000000005D -:1083C00000000082006006000000000000000000C5 -:1083D000000000000000000000000000000000009D -:1083E0000000000000000000000000000008010084 -:1083F000010000000000000000000000000000007C -:10840000000000000000000000000000000000006C -:10841000000000000000000000000000000000005C -:10842000000000000000000000000000000000004C -:10843000000000000000C3820000000000000000F7 -:1084400000000000EAEACFCA14FF0FCF00000000CE -:10845000000000000000000000000000000000001C -:108460000000000000000000000000000000000804 -:1084700001000100000000000000000000000000FA -:1084800000000000000000000000000000000000EC -:1084900000000000000000000000000000000000DC -:1084A00000000000000000000000000000000000CC -:1084B00000000000000000000000000000000000BC -:1084C000000000000000EAEACFCA14FF0FCF00004E -:1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C -:1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B -:10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:108540000000000000000000040004C334B60082F4 -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:108570008282000000000A000000000000000000ED -:1085800000000000000000000000000000000000EB -:1085900000000000000000000000000000000000DB -:1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000040404C7008256 -:1085D0000082000000000000000000000000000019 -:1085E000000000000000000000000000000000008B -:1085F000000000614006000D0000000000000000C7 -:10860000000000000000000000000000000000006A -:10861000000000000000000000000000000000005A -:1086200000000000000000000000000000610006E3 -:10863000000D000000000000000000008061000745 -:10864000000D0000000000000000000005414A3C51 -:10865000050900A100610006000D000000000000F7 -:10866000000000000000000000000000000000000A -:108670000000000000000000FFFFFFFF00000000FE -:1086800000000000000000000000000000000000EA -:1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000000000CA -:1086B0000000BEF796F70000000000000000005523 -:1086C00000AA282830300000000000000000FFFF52 -:1086D0000FFFC3C30FFF00000000000000000000F8 -:1086E000000000000000000000000000000000008A -:1086F000000000000000000000803CFFFFFF0000C1 -:108700000000000000000000000000000000000069 -:108710000000000000000000000000000000000059 -:108720000000000000000000000000000000000049 -:1087300000000000FFFE82FE0000000000000000BC -:108740000000000028283030000000000000000079 -:1087500000FF3CFFFF410FFF0000000000A00020D1 -:108760000000000000000000000000000000000009 -:10877000000000000000000000000500FFFFFFFFF8 -:1087800000000000000000000000000000000000E9 -:1087900000000000000000000000000000000000D9 -:1087A00000000000000000000000000000000000C9 -:1087B0000000FC3FF7BF00000000000000000000C8 -:1087C000000028000F00003C4545000000000000AC -:1087D0000000FCC0D4C03CFF3CF0C3C3C3C30000D6 -:1087E0000000000000000000000000000000000089 -:1087F0000000000000000000000000000000F5FF85 -:10880000F5FF000000000000000000000000000074 -:108810000000000000000000000000000000000058 -:108820000000000000000000000000000000000048 -:10883000000000003C3CC30C0000000000000000F1 -:108840000000000028000F00000045450000000067 -:1088500000000000FCC0D4C03CFF3CFFAAF000F0C8 -:1088600000000000000000000000000000002000E8 -:1088700000000200000088000000000088000000E6 -:10888000200000000000840084000000840020001C -:108890000000840000002000000000000400000030 -:1088A0000400040000002000200084000000840078 -:1088B00020000000200000000000000088002000D0 -:1088C0000400200004008410200020002000880004 -:1088D00020000000880084000000840020002000A8 -:1088E0002000200084002008040004002000000074 -:1088F0000000000000000000000000000000000078 -:108900000000000000000000100000000000000057 -:108910000000000000000000400000000000000017 -:10892000000000000900000000000000000000003E -:10893000000000000900000000000000000000002E -:108940000000000000000000000000000000000027 -:1089500020000000000000000000000000000000F7 -:1089600000000000000000000000000040000000C7 -:1089700002000000021000100000000000000000D3 -:1089800002000200200000000000000000000000C3 -:108990000200000000000000000000000400004091 -:1089A00000000000000000000000000000000000C7 -:1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000800000000000887 -:1089E0000000000000000000000000000000000087 -:1089F0000000000000000000000000000000000077 -:108A0000000000000400040000000000040000005A -:108A10000000000004000000000000000000000052 -:108A20000000000000000000000000000000000046 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000400000002 -:108A700000000000000000000000000000000000F6 -:108A800000000000000000000000000000000000E6 -:108A900000000000000000000000000000000000D6 -:108AA00000000000000000000000000000000000C6 -:108AB00000000000000000000000000000000000B6 -:108AC00000000000000000000000000000000000A6 -:108AD0000000000000000000000000000000000096 -:108AE000000000000000200008000000000000005E -:108AF00000009000000000000000000000002100C5 -:108B00000300000003000800000000000000000057 -:108B10000000000000000000000000000000000055 -:108B20000000000000000000000000000000000045 -:108B30000000000000000000000000000000000035 -:108B40000000000000000000030021C04100000000 -:108B50000000000000000000000000000000000015 -:108B600000100000410000000000000000820084AE -:108B700000000800000000000800000000000000E5 -:108B800000000000000000000000000000000000E5 -:108B900000000000000000000000000000000800CD -:108BA00000000000000000000000000008000000BD -:108BB000000000000000C0000000080000000000ED -:108BC0000000000000000000000082000000000023 -:108BD000080000000000000000000000000000008D -:108BE000000000000000000900000000000000007C -:108BF000080000000000000040000000000000002D -:108C00000000000000000000000000000000000064 -:108C10000000000000000000000000000000000054 -:108C20000000000000000000000000000000000044 -:108C30000000000000000000000000000000000034 -:108C40000000000000000000000000000000000024 -:108C50000000000000000000000000000000000014 -:108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000000008000000BC -:108CB00000000000000000000000000000000000B4 -:108CC0000000000000000000000000008200000022 -:108CD0000000000000000000000000000000000094 -:108CE000000000000800000000000000000000007C -:108CF000000000000000000000080000000000006C -:108D0000000000000000000000000000000008005B -:108D1000210008000000000000000000000000002A -:108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D50000000000000000000000009000900000001 -:108D60000000000000000000210000000008008456 -:108D7000000800000084000800000000000000005F -:108D8000080000000000000000004000000000009B -:108D900000000000000000000000000000000000D3 -:108DA00000000000000000000000000000000000C3 -:108DB00000000000000000000000000000000000B3 -:108DC000000000000000000000000000080000009B -:108DD0000000000000000000000000000000000093 -:108DE0000000820000000000000000000000000001 -:108DF0000000000000000000000200000000082049 -:108E0000000800000000000000000000000000005A -:108E10000000000000000000000000000000000052 -:108E20000000000000000000000000000000000042 -:108E30000000000000000000000000000000000032 -:108E40000000000000000000000000000000000022 -:108E50000000000000000000000000000000000012 -:108E60000000000000000000000000000090000072 -:108E700000000000000000000000000000000000F2 -:108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 -:108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F900000000000000000000000000000000000D1 -:108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 -:108FF0000000000000000000000000000000000071 -:109000000000000000000000000000000000000060 -:109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 -:109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:10913000000000000000000000000000000000002F -:10914000000000000000000000000000000000001F -:10915000000000000000000000000000000000000F -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF -:1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000000000000AF -:1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000000000008F -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E -:10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E -:1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD -:1093C000000000000000000000000000000000009D -:1093D000000000000000000000000000000000008D -:1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C -:10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C -:10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C -:1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000000000003B -:10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB -:1095C000000000000000000000000000000000009B -:1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A -:10963000000000000000000000000000000000002A -:10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A -:1096D000000000000000000000000000000000008A -:1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000000000000B9 -:1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000020036 -:109830000000000000000400000000000400000020 -:1098400002002000000000000200000000002000D4 -:109850000400000000000000000001002000008063 -:1098600021002000000000000400000100000000B2 -:109870002000200000000000000088000000200000 -:109880000000200000000000000020000000000098 -:109890002000200004000400000020000000200040 -:1098A00000002008880004000000200040020000A2 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000200000000000096 -:1098D0000000000000000000000000001002000076 -:1098E00000081000000040000000000000004000E0 -:1098F0000000000000000000000000000000000068 -:109900000000000000004000040000020000000011 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000020035 -:109930000000000000000000000000000000000027 -:109940000000000000000000000000000000000017 -:109950000000020000000000000004000000000001 -:1099600010000000000000000000000000000000E7 -:1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000400B3 -:1099B0000000040004000000040004000200020093 -:1099C000000000000000000004000400040000008B -:1099D0000400040000000000040004002000000057 -:1099E00000008000000000000000000000000000F7 -:1099F000000000000400000000000000040000005F -:109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A20000400000000000000000000000000000032 -:109A30000000000000000000000000000000000026 -:109A4000000000000000000000000800000000000E -:109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000082008200C2 -:109AA00000000000000000000000000000000000B6 -:109AB00000000000000000000000000000000000A6 -:109AC0000000000000000000000000000000000096 -:109AD0000000000000000000000000000000000086 -:109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000000066 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B200000000000000000000000000000840000B1 -:109B30000000000000000000000000000000000025 -:109B40000000000000000000000000000000000015 -:109B50000000000000000000000000000000000005 -:109B600000000000000000000000000001000000F4 -:109B700000000000080000000000000000000000DD -:109B80000000000000000000004000000000000095 -:109B90000800040000000040000000000000000079 -:109BA000820000110000000800000000000000001A -:109BB00000000000000000000000000000000000A5 -:109BC0000000000000000000000000000000000095 -:109BD0000000000000000000000000000000000085 -:109BE0000000000000000000000000000000200055 -:109BF0000000000000000000000000000000000065 -:109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 -:109C200000000000000000000040000000000000F4 -:109C30000000000000000000000000000000000024 -:109C40000000000000000000000000000000000014 -:109C50000000000000000000000000000000000004 -:109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000000E4 -:109C800000000000000000000000000000000000D4 -:109C900000000000000000000000000000000000C4 -:109CA00000000000000000000000000000000000B4 -:109CB0000000000000000000000000100000000094 -:109CC0000000000000000000000000000000000094 -:109CD0000000000000000000000000000000000084 -:109CE0000000000000000000000000000000000074 -:109CF0000000000000000000000000000000000064 -:109D00000000000000000000000000000000000053 -:109D1000000000000000080021000000000000001A -:109D20000000000000000000000000000000000033 -:109D3000000000000000000000000008000000001B -:109D40000000000000000000000000000000000013 -:109D50000000000000000000000000000000000003 -:109D600000000000000000000000000000000000F3 -:109D700000000000000000000000000000000000E3 -:109D800000000000000000000000000000000000D3 -:109D900000000800000000000000000000000000BB -:109DA00000000000000000000000000000000000B3 -:109DB000000000000000000000000000000000089B -:109DC0000000000000000000000000000000000093 -:109DD0000000000000000000000000000000000083 -:109DE0000000000000000000000000000000000073 -:109DF0000000000000000000000000000000000063 -:109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E30000010008200000000000000000000000090 -:109E400000400000000000000000000000000000D2 -:109E50000000000000000000000000000000000002 -:109E600000000000000000000000000000000000F2 -:109E700000000100000000000000000000000000E1 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 -:109EC0000000000000000000000000000000000092 -:109ED0000000000000000000000000000000000082 -:109EE0000000000000000000000000000000000072 -:109EF0000000000011000021000000000000000030 -:109F00000000000000000000000000000000000051 -:109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 -:109F30000000000000000000000000000000000021 -:109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000000001 -:109F600000000000000000000000000000000000F1 -:109F700000000000000000080000110800000000C0 -:109F800000000000000000000000000000000000D1 -:109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000000081 -:109FE0000000000000000000000000000000000071 -:109FF0000000000000000000000000000100000060 -:10A000000000000000000000000000000000000050 -:10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 -:10A030000000000000000000000000000000000020 -:10A040000000000000000000000000000000000010 -:10A050000000000000000000000000000000000000 -:10A0600000000000000000000000000000000000F0 -:10A07000000000000000000000000000900000014F -:10A0800001000000000000000000000000000000CF -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 -:10A0C0000000000000000000000000000000000090 -:10A0D0000000000000000000000000000000000080 -:10A0E0000000000000000000000000000000000070 -:10A0F0000000000000000000000000000000000060 -:10A100000008100000000000000000000000000037 -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A1500000000000000000000000000000000000FF -:10A1600000000000000000000000000000000000EF -:10A1700000000000000000000000000000000000DF -:10A1800011000000000000000000000000000000BE -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F -:10A1D000000000000000000000000000000000007F -:10A1E000000000000000000000000000000000006F -:10A1F000000000000000000000000000000000005F -:10A20000000001000000000000000000000000004D -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE -:10A280000000000000E000000000000000000000EE -:10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E -:10A2F000000000000000000000000000000000005E -:10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D -:10A33000000000000000000000000000000000001D -:10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD -:10A3600000000000000000000000000000000000ED -:10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000000CD -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D -:10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC -:10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000000000000000006C -:10A4F000000000000000000000000000000000005C -:10A500000000000000000000000000000000000645 -:10A51000000C00000000000000000000000000002F -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000000000001B -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000000000FB -:10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000000000000000DB -:10A5800000000000000000000000000000000000CB -:10A59000FF0000FF000000000000000000000000BD -:10A5A00000000000000000000000000000000000AB -:10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E000000000000000000000000000000000006B -:10A5F000000000000000000000000000000000005B -:10A60000000000000000000000000000000000004A -:10A610000000FF0000FF000000000000000000003C -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000000FA -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000FF0000FF0000000000000000BC -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000000000049 -:10A71000000000000000FF0000FF0000000000003B -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000200000000400000000000000A5 -:10A7900000000000000000000400000000000000B5 -:10A7A0000000000020000000000020000000000069 -:10A7B0000000000000000000000020000000000079 -:10A7C0000000000000002000000020000000000049 -:10A7D0000000000000000000000020000000000059 -:10A7E0000000000000002000000000000000000049 -:10A7F0000000000000000000000000000000000059 -:10A800000000400000000000000000000000000008 -:10A810000000000000020002000000000000000034 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000010000000000000000000E8 -:10A8600000000000000000000000020000000000E6 -:10A8700000000200000000000000000000000200D4 -:10A8800000000000000000000800000000000000C0 -:10A8900000000000000000000000020002000000B4 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 -:10A8C0000000001000000000080000000000000070 -:10A8D0000000000000000000000000000000000078 -:10A8E0000800000000000000000000000000000060 -:10A8F0000000000000000000000000000000000058 -:10A900000000000000000000000000000000000047 -:10A91000040000000000040000000000000000002F -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 -:10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA70000000000000400000000000000000000096 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000002000000F3 -:10AB600000000000000000000090000000080090BD -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000400000000900008457 -:10AC30000000000000000000000000000000000014 -:10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000200000000000092 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000000000000000000013 -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD60000000000000C00290000020000008000069 -:10AD700000000000020000000000000000000000D1 -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000000000000A2 -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000000000000000000000006B -:10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B7200000000000000000002000000000000400F5 -:10B7300020000000200004000400000000000400BD -:10B7400000000400000000002000000000000400D1 -:10B750002000000020002000200000000000040065 -:10B760000400200000000000000020000000000095 -:10B770002000200000000000200020000000000049 -:10B7800020002000200000008800200000000000B1 -:10B790002000000000000000200020000000000049 -:10B7A00020002000200000400000000000000000F9 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D00040000000002040000000000000000000C9 -:10B7E0000000000000000000000000000000000059 -:10B7F0004000000000000000000000000000000009 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B8300002000040000000000000000000000000C6 -:10B8400000000200000000000000000000000000F6 -:10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 -:10B880000000400002000000024100000000000033 -:10B8900000000200020002000200000000000000A0 -:10B8A0000000000000000000040000000000000094 -:10B8B0000000040000000000000000000000000084 -:10B8C0000000040000000400000000000000000070 -:10B8D000000004000000000000000400040000005C -:10B8E0000000040020000000000000000000000034 -:10B8F0000000000000000000000000000000000048 -:10B9000000000000800000000000000000000000B7 -:10B91000000000008000090020000000000000007E -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000040000000A7 -:10B96000880000000000000000000000000000004F -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000021000076 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000400000000000000040000086 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000040000000000000004050000A9 -:10BA9000C0000000000000000000000000000000E6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000800000000000800000066 -:10BAD000000000000000000000000000080004005A -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000200000033 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB800000000000000008000000000000000000AD -:10BB900000000000000000000000000000050000A0 -:10BBA000000000000000000300400000000500004D -:10BBB000000000000008000000000000000000007D -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000040000000000000051 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC80000000000000000000000020000000000094 -:10BC900000000000000000000000880000400000DC -:10BCA000000000000000000000400041000000090A -:10BCB0000000000000000000004000000040000004 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000010000A2 -:10BDA000000000000000C088000400209082000015 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 -:10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000500110000000408 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA00000000000000000000000800000A00080F2 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000800848302 -:10BF30002010904000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA000000000000000000000000000000004107D -:10BFB00000821020A104000000000000000000002A -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C020000000090000000000000000000000000007 -:10C03000800000808000040000000000000000007C -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000800000000080000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F -:10C1300000000000100020C0900802000000000075 -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C230000000000000000000F0C500C5FF0F000F67 -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B00000000000000000000000FFC50FC555C3CE -:10C2C00055C3000000000000000000000000000056 -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D -:10C33000000000000000000000000000A3A300F0C7 -:10C34000AAC3F00000000000000000000000000090 -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B0000000000000000000000000000000A3A337 -:10C3C0000FFFAAC3F0FF0000000000000000000003 -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C -:10C4300000610006000D0000000000000000000088 -:10C440000000000000C0000000000000000000002C -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000410000000000000000003A -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000004100000000000000B9 -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000200000000000000000000000AA -:10C670000000000000000000000000008400000036 -:10C68000000084002000000000000000880000007E -:10C69000000084008400000000000400200000006E -:10C6A0000000C0000000200000000000000020008A -:10C6B0000000000020002000000088002000200072 -:10C6C000000020000000000000000000000020002A -:10C6D00000000000200020000000200020002000BA -:10C6E000000000000000000000000000400000000A -:10C6F0000000000000000000000000080000000032 -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C760000000000000400000000000000000000089 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000020000000000000000000000A7 -:10C790000200000000000000000000000000000097 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C00000000000000084000000000000000000E5 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 -:10C7F000000000000000004000400082000000082F -:10C800000000000000000000000000000000000028 -:10C81000000000000000000000000400000000080C -:10C820000000000200000000000000000000000006 -:10C8300000000000000000000000000000000000F8 -:10C8400000080000000000000000000000000000E0 -:10C8500000000000000000000000000000000000D8 -:10C8600000080000000000000000000000000000C0 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000800000000000000000000A0 -:10C890000000000000000000400000000000000058 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C95000080000000000000000000000008400004B -:10C9600000000000000000000000000000000000C7 -:10C970000040000000000000002100000000000056 -:10C98000000000000000000008000000000000009F -:10C990000000000000000000000000000000000097 -:10C9A0000000000300000000000000000000000084 -:10C9B000000000000000C0000000000000000000B7 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000100000000000000000E6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000004000082 -:10CAB000000000000800000000000000000000006E -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB200000000000090000000000000000000000FC -:10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000004D1 -:10CB60004000000000000000000000000000000085 -:10CB700000000000000000040000000000000000B1 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000002124 -:10CBF00000000000000000000500009000000000A0 -:10CC000000000000000000000000004000000000E4 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000000091 -:10CFA0000000000000000000000000000000000081 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000000000000090 -:10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE -:10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E -:10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000000000000FD -:10D3300000000000000000000000000000000000ED -:10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D -:10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC -:10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A -:10D6200000000000000000000000000000000000FA -:10D6300000000000000004000000000020000000C6 -:10D6400000000200000004000000040000000000D0 -:10D6500000000000000004000000000020000001A5 -:10D66000040004002000000004000400200000006A -:10D670000000000000000000880000000000200002 -:10D6800020002000200000002000200020000000DA -:10D6900088000000000000002000000004002000BE -:10D6A0000008000000000000000000000000000072 -:10D6B000000000000000000000001000004000001A -:10D6C000400000000000000000000000000000001A -:10D6D00000C000000000000040000000000000004A -:10D6E000000000000000000000000000000000003A -:10D6F0000000000000000000000000000000000228 -:10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000400000005 -:10D7200000000040000000000000000400040004AD -:10D7300000040000000000000000000000000000E5 -:10D7400000000000000000000000000000000200D7 -:10D750000000000000400000000000000000000089 -:10D7600000000000000000000000000000000000B9 -:10D770000000001000000000000000000000004158 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 -:10D7A0000000000000000000000000000001000177 -:10D7B0000001000100000000000000000000000067 -:10D7C0000000000800080000000800080000000039 -:10D7D00000000000000000080000000000000090B1 -:10D7E0000008000800000008000000080008000011 -:10D7F0000082000000000000008400000000000023 -:10D800000000000800080008008400080008000864 -:10D810000000000000000000000000000000000008 -:10D820000000000800820000002100000008000045 -:10D8300000000000000000000008000000000000E0 -:10D8400000080000000000000000000000000000D0 -:10D850000000000000004000000000000000000088 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000080000000090 -:10D890000000000000000000000000050000000083 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000080000000000000000000050 -:10D8D0000000000000000000000000000000000048 -:10D8E0000800000000000000000000000000000030 -:10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D960000080000000000000000000000000000037 -:10D97000000000000800000000000000000000009F -:10D98000000000000000000000000000A0000000F7 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 -:10D9B00000000000000000A00000000000000000C7 -:10D9C0000000000000000000000000000000000057 -:10D9D0000000000005000000000000000000000042 -:10D9E0000000002000000000000000000000008493 -:10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 -:10DA200000000000000000000000000002000000F4 -:10DA3000200000000000000000000009200000009D -:10DA400020020000000000000000000000000000B4 -:10DA500000000000000020000000000000000100A5 -:10DA60000000002000000000000000000000000096 -:10DA7000000000080000000000000000000000009E -:10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 -:10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE0000200000000010000000000000000000033 -:10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 -:10DB300000000008000020080000000000000000B5 -:10DB400000000000000000000011000000000000C4 -:10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000008AD -:10DB7000000000000000000000000000000800009D -:10DB8000000000000000000000000000080000008D -:10DB90000000000000000000000000000000000085 -:10DBA000000000000000000000000000000000086D -:10DBB0000000000000880000000000824100050015 -:10DBC000058200000000000041000000410000004C -:10DBD0000000000000000000050005000000000833 -:10DBE0000000000000000000000000000000000035 -:10DBF00000820000000000000000000000000000A3 -:10DC00000000000000000000000000000000000014 -:10DC10000000000000000000000000000000000004 -:10DC200000000000000000000000000000000000F4 -:10DC300000000000000000000000000000000000E4 -:10DC400000000000000000000000000000000000D4 -:10DC500000000000000000000000000000000000C4 -:10DC6000000000000000000090000008000000001C -:10DC700000000000000000000000000000000000A4 -:10DC80000000000000000000000000000000000094 -:10DC90000000000000000000000000000000000084 -:10DCA0000000000000000000000000000000000074 -:10DCB0000000000000000000000000000000000064 -:10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 -:10DCE0000000000000000000110080000080000023 -:10DCF0000000000000000000000000000000000024 -:10DD00000000000000000000000000000000000013 -:10DD10000000000000000000000000000000000003 -:10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000000000000000E3 -:10DD4000000000400000000500000000000000008E -:10DD500000000000000000000000000000000000C3 -:10DD60000000000000000000000000000080000033 -:10DD70000080000000000000000000000000000023 -:10DD80000000000000000000000000000000000093 -:10DD90000000000000000000000000000000000083 -:10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000010000000000000000000052 -:10DDD0000000000000000000000000000000000043 -:10DDE0000000000000000000000000000000002013 -:10DDF000000000C000000000000000000000000063 -:10DE00000000000000000000000000000000000012 -:10DE10000000000000000000000000000000000002 -:10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000000000000000E2 -:10DE4000000000000000000040008400000000000E -:10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000000000100B1 -:10DE70000088020001000000000000000000000017 -:10DE80000000000000000000000000000000000092 -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC00000000000000000000000800000000900C9 -:10DED0000000000000000000000000000000000042 -:10DEE0000000000000000000000000000000000032 -:10DEF00041000080800009000000000000000000D8 -:10DF00000000000000000000000000000000000011 -:10DF10000000000000000000000000000000000001 -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000000000000E1 -:10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000000000000C1 -:10DF600000000000000000000000000000000000B1 -:10DF70000000001100000080000000000000000010 -:10DF8000000000000500000000000000000000008C -:10DF90000000000000000000000000000000000081 -:10DFA0000000000000000000000000000000000071 -:10DFB0000000000000000000000000000000000061 -:10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000000000000031 -:10DFF00000000000000100000040000000000000E0 -:10E00000000000040000010000000000000000000B -:10E010000000000000000000000000000000000000 -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 -:10E0400000000000000000000000000000000000D0 -:10E0500002E00000000000000000000000000000DE -:10E0600000000000000000000000000000000000B0 -:10E0700000000000000000000000070082210000F6 -:10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000000000060 -:10E0C0000000000000000000000000000000000050 -:10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 -:10E0F000000000000000000000000000F0F0000040 -:10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000000000FF -:10E1200000000000000000000000000000000000EF -:10E1300000000000000000000000000000000000DF -:10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000000BF -:10E1600000000000000000000000000000000000AF -:10E170000000000000000000000000000000F0F0BF -:10E18000000000000000000000000000000000008F -:10E19000000000000000000000000000000000007F -:10E1A000000000000000000000000000000000006F -:10E1B000000000000000000000000000000000005F -:10E1C000000000000000000000000000000000004F -:10E1D000000000000000000000000000000000003F -:10E1E000000000000000000000000000000000002F -:10E1F00000000000000000000000000000000F0F01 -:10E200000000FFFF00000000000000000000000010 -:10E2100000000000000000000000000000000000FE -:10E2200000000000000000000000000000000000EE -:10E2300000000000000000000000000000000000DE -:10E2400000000000000000000000000000000000CE -:10E2500000000000000000000000000000000000BE -:10E2600000000000000000000000000000000000AE -:10E27000000000000000000000000000000000009E -:10E280000F0F000000000000000000000000000070 -:10E29000000000000000000000000000000000007E -:10E2A000000000000000000000000000000000006E -:10E2B000000000000000000000000000000000005E -:10E2C000000000000000000000000000000000004E -:10E2D000000000000000000000650006000F2000A4 -:10E2E000000000000000000000000000000000002E -:10E2F000000000000000000000000000000000001E -:10E3000005002A00054000A80000000000000000F1 -:10E3100000000000000000000000000000000000FD -:10E3200000000000000000000000000000000000ED -:10E3300000000000000000000000000000000000DD -:10E3400000000000000000000000000000000000CD -:10E3500000000000000000000000000000000000BD -:10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D -:10E3A000000000000000000000000000000000006D -:10E3B000000000000000000000000000000000005D -:10E3C000000000000000000000000000000000004D -:10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000001D -:10E40000000000000000000000000000000000000C -:10E4100000000000000000000000000000000000FC -:10E4200000000000000000000000000000000000EC -:10E4300000000000000000000000000000000000DC -:10E4400000000000000000000000000000000000CC -:10E4500000000000000000000000000000000000BC -:10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C -:10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C -:10E4C000000000000000000000000000000000004C -:10E4D000000000000000000000000000000000003C -:10E4E000000000000000000000000000000000002C -:10E4F000000000000000000000000000000000001C -:10E50000000000000000000000000000000000000B -:10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000000000000CB -:10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C000000000000000000000000000000000004B -:10E5D000000000000000000000000000000000003B -:10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A -:10E6100000000000000000000000000000030000F7 -:10E6200000000400000000000000000000000000E6 -:10E6300000000000000000000000000000000000DA -:10E6400000002000000000000000000000000000AA -:10E6500000000000000000000000000000000000BA -:10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000000000000009A -:10E680000000000000000000000000020002000086 -:10E69000000000000000000000000000000000007A -:10E6A000000000000000000000000000000000006A -:10E6B000000000000000000000000000000000005A -:10E6C000000000000000000000000040000000000A -:10E6D000000000000000000000000000000000003A -:10E6E0000000000000000000020000000000000028 -:10E6F00000000000020000000000000000080040D0 -:10E700000000000000000000008000C000800080C9 -:10E7100000000000000000000080008000A020C079 -:10E7200000000000000000000000000000000000E9 -:10E730000000000000000000000000000000004099 -:10E7400000000000000000000000000000000000C9 -:10E750000000100000000000000000000080000029 -:10E760000000000000000084000000840008000495 -:10E770000008000800080000000000840000008479 -:10E7800000080000000000000000004000210040E0 -:10E7900000400040004000840000002000200041B4 -:10E7A00080210000000800040000000000000000BC -:10E7B00000000084000000000000000000080008C5 -:10E7C0000008000000080008000800080008000811 -:10E7D0000000000880000008004000000010000455 -:10E7E000000800000084010001000008008800000B -:10E7F0000000000000110000008800090088008867 -:10E800000005012101030005002100210020000571 -:10E810000009000810200000002000400021000036 -:10E8200000082000000000000000000300000008B5 -:10E8300000000005000000000000000000000000D3 -:10E8400000000000002100000000000000000000A7 -:10E850000000040000210000000000000000000093 -:10E860000000000000040009100020000001000466 -:10E870000000000000000000000000040000000490 -:10E880000004030020001000000000000000000150 -:10E890004100000000C080010000000100010000F4 -:10E8A00000000000800000000000000000000000E8 -:10E8B0000000000000000000000000080000000050 -:10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000001880000000005010099 -:10E8F00000000100A0000000000000000000010076 -:10E900000080000000800000000000800080010006 -:10E91000000000000080010000000000010001086C -:10E92000008400040004000000000000000000005B -:10E9300000000000000000000000000000000000D7 -:10E9400000000000000000000000000000000000C7 -:10E9500000000000000000000000000000000100B6 -:10E96000008000840004000400000000000000009B -:10E970002000000020A000080000000000000000AF -:10E98000200000040000000800000000000800044F -:10E990002000000000000020040000000000208291 -:10E9A0000401004100090001000000000000000017 -:10E9B000000000000000000000000008000000004F -:10E9C0000000000000000000000000000000000047 -:10E9D0000000000000000000000000000000000037 -:10E9E00020000004000500010001000000000011EB -:10E9F000A000000310000011A011908020059000DD -:10EA0000A000400340009003900400080021201162 -:10EA1000A005000000050011A00000030040004018 -:10EA2000A0400000001100400003001100000000A1 -:10EA300000080000000800000008000000000000BE -:10EA400000000000000000000000000000000000C6 -:10EA50000000000000000000000000009000000026 -:10EA600000000000000000000000000000000000A6 -:10EA7000000000000000800000000000000880008E -:10EA80000000000000000000000000010001000084 -:10EA900080000000000000000000000000000001F5 -:10EAA0000001000100000000000100000000000063 -:10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000000000000026 -:10EAF0000040C004A00400020009C009A0080004EE -:10EB000001030104000000080008C1218200000385 -:10EB100000880008A009000800000003A00300000E -:10EB200000020020000000800004000400040080B7 -:10EB300000000000000000080000000000000000CD -:10EB400000000000000000080000000000000000BD -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 -:10EB700000000000000121004100000000840001AD -:10EB8000000110001001000041010001100003000D -:10EB9000410000040000000000010000000000002F -:10EBA00000000082000100000004000900010001D3 -:10EBB0000020000000000000000000000000000035 -:10EBC0000000000000000000000000000000000045 -:10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 -:10EBF0000000000001C088900182901001C0888848 -:10EC00000190C08301C000030102900801C0001000 -:10EC10000108108901C00090002020100000009021 -:10EC200000000000010000900000000000001090B3 -:10EC300000000000000000000000000000000000D4 -:10EC400000000000000000000000000000000000C4 -:10EC500000000000000000000000000000000000B4 -:10EC600000000000000001000000000000000000A3 -:10EC70000000000000000380002009800080038065 -:10EC80008000098000A00380000809001080038034 -:10EC90000000090080200380002000008080000028 -:10ECA0000080000000001100218000000000000032 -:10ECB0008080000000000000000000000000000054 -:10ECC0000000000000000000000000000000000044 -:10ECD0000000000000000000000000000000000034 -:10ECE00000000000000000001100210000000000F2 -:10ECF000000000000000000080088088110480806F -:10ED0000000880889104808000080089911080802C -:10ED10008009808811108080801080889108808010 -:10ED20000003000000000000004109800011000005 -:10ED300000110000000300000001000000000000BE -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED60000000000000000000000000410900000356 -:10ED700000800009000000090000080108C1C1006E -:10ED8000C0C0020110C11101C0C08800A0C00300B2 -:10ED9000C0C0020084C09100C0C0020002C11100C6 -:10EDA000C0C000000088000000C000010108000091 -:10EDB0000084880000880001008800000000000036 -:10EDC0000000000000000000000000000000000043 -:10EDD0000000000000000000000000000000000033 -:10EDE000000000000000000000000000000301001F -:10EDF00000000088000000000000000091201020AA -:10EE0000C08900C085081021C01000C01184088886 -:10EE1000C08900C021900890C02000C091841020BB -:10EE2000C08900C0000000000290000000008800BF -:10EE3000089000000000C0000290010000010000E6 -:10EE400000000000000000000000000000000000C2 -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 -:10EE700088000000010000000400000001004100C3 -:10EE8000000080881080C180008580000280418061 -:10EE90000000808810804100800080090880418047 -:10EEA000000080881080020000000080000009003F -:10EEB00000008080200004008000008040000001ED -:10EEC0000000000000000000000000000000000042 -:10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 -:10EEF00000000000000041000000000000000800C9 -:10EF00008002804090000080801011050000008089 -:10EF10008002800590000000800091400000008089 -:10EF2000800011058000000000118000000000003A -:10EF3000001190110000000000118000000000008E -:10EF400000010000000000000000000000000000C0 -:10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 -:10EF70000000000000110000000000000000000080 -:10EF80000000C000020041889008C0000900A002F3 -:10EF90004008C000200011880200C00003009088D3 -:10EFA0002008C0008900028890000001200000882D -:10EFB0000000000120010088000000012000000086 -:10EFC0000000000100000000000000000000000040 -:10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000001000000000000000010 -:10F0000000000000600043E042224842600043E00C -:10F0100042224842600043E042224842600043E00E -:10F0200042224842500043E0422248420006840007 -:10F0300007850000000684E007858100000686E061 -:10F0400007854200000000000000000000000000F2 -:10F0500000000000000000000000000000000000B0 -:10F0600000000000000000000000000000000000A0 -:10F07000000000000000000000E0000081410000EE -:10F0800002E000000000000000000000000000009E -:10F090000000000000000000000000000000000070 -:10F0A0000000000000000000000000000000000060 -:10F0B000FF000000FF000000FF000000FF00000054 -:10F0C000FF000000FF000000000000000000000042 -:10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000000FF -:10F1100000000000000000000000000000000000EF -:10F1200000000000000000000000000000000000DF -:10F130000000FF000000FF000000FF000000FF00D3 -:10F140000000FF000000FF000000000000000000C1 -:10F1500000000000000000000000000000000000AF -:10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F180000000000000000000000040084000008473 -:10F190002000400840000084200040084000008417 -:10F1A0002000400840000084200040084000008407 -:10F1B000200000000000000000000000000000002F -:10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F2000000000000000000000000000000000000FE -:10F2100000000000000000000000000000000000EE -:10F2200000000000000000000000000000000000DE -:10F230000000000000FF0000FFFF000000FF0000D2 -:10F24000FFFF000000FF00003C3C00000000000049 -:10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E -:10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000000005E -:10F2B00000000000000000FF00000000000000FF50 -:10F2C00000000000000000FF00003C3C00000000C7 -:10F2D000000000000000000000000000000000002E -:10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F3000000000000000000000000000000000000FD -:10F3100030040006800E300030040006800E3000FD -:10F3200030040006800E300030040006800E3000ED -:10F3300000040006800E280015182A20054004A8A5 -:10F3400015582A26054C04A8157D2A26054F24A801 -:10F3500000000000000000000000000000000000AD -:10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D -:10F38000000000400006000C000000650006000FB1 -:10F39000200000000F0F00FF00000000FF00F0F051 -:10F3A000000000000F0F00FF00000000FF0000FF42 -:10F3B00000000000FF0000FF00000000000000004F -:10F3C00000000000FF00FFFF000000000000000040 -:10F3D000000000000000000000000000000000002D -:10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D -:10F400000000000000005555FFFF00000000000054 -:10F410000000000000000F0F00FF00000000FF00D0 -:10F42000F0F0000000000F0F00FF00000000FF00E0 -:10F4300000FF00000000FF0000FF000000000000CF -:10F44000000000000000FF000000000000000000BD -:10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F4800000000000000000005555000000000000D2 -:10F490000000000000000000FF0000FF000000006E -:10F4A0003C3C00FF00000000FF0000FF00000000E7 -:10F4B0003C3C00FF00000000FF0000FF00000000D7 -:10F4C00000000000000000000000F0F0000000005C -:10F4D000000000000000000000000000000000002C -:10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C -:10F50000000000000000000000000000F0F000001B -:10F5100000000000000000000000FF0000FF0000ED -:10F5200000003C3C00FF00000000FF0000FF000066 -:10F5300000003C3C00FF00000000FF0000FF000056 -:10F54000000000000000000000000000F0F00000DB -:10F5500000000000000000000000000000000000AB -:10F56000000000000000000000000000000000009B -:10F57000000000000000000000000000000000008B -:10F580000000000000000000000000000000F0F09B -:10F59000000000000000000000000000000000006B -:10F5A000000000000000000000000000000000005B -:10F5B000000000000000200000000000000000002B -:10F5C00000000000000000000000008000000000BB -:10F5D000000000000000200000000001000000000A -:10F5E000000000000000000000000000000000001B -:10F5F00000000000000000002000000000000000EB -:10F6000000000000000000000000000000000000FA -:10F6100000000000000000002000000000000000CA -:10F6200000000000000000000000100010000000BA -:10F6300000000000000000000000000000000000CA -:10F640000000000040000000000000000008000072 -:10F6500000000000000000000000000000000000AA -:10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A -:10F69000000000000000000000000000100000005A -:10F6A000000000000000000000000000000000005A -:10F6B0000000000800000008020000000000000434 -:10F6C0000800000000000000000000000000000032 -:10F6D00000000000000020002080000420900000B6 -:10F6E000000000000000000000000010000000000A -:10F6F0000000000000000000000002000000020006 -:10F7000000000000000000000200000000000000F7 -:10F7100000000000000000000000000000000200E7 -:10F720000000008800880000004000000008000081 -:10F7300000080900000000080001000000080000A7 -:10F740000085008400880000008400840088008414 -:10F7500000880088000800088000800400098004F8 -:10F760000000000000000000000000000884000805 -:10F770000000000800000008000800000008000861 -:10F7800000080000008400000000000802080008D3 -:10F7900000080088000800080008000000080008B1 -:10F7A0000084000000000080000000080008000045 -:10F7B00000080000000000000000000000080080B9 -:10F7C000000800000000000000000003002000000E -:10F7D00000000208000300000000000400052000F3 -:10F7E00000080000000000000000000300080008FE -:10F7F00000000008000000000000000000000009F8 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000210000000000000000C7 -:10F82000000000000000009000080000000000A0A0 -:10F83000000000A002C0000811C0000009A011A033 -:10F840001104002000900088000000880000009053 -:10F850000000119080000000000000000001008402 -:10F860008000000000000000000000000000000018 -:10F870000000000000000000000000000000000088 -:10F880000000000000000000000000000000000078 -:10F890000000000000000000000000000000000068 -:10F8A00000000300030020009000000001000000A1 -:10F8B00000000000000000008200000000000000C6 -:10F8C0000000008001000000000000800100000036 -:10F8D0000000000000000000000001802180000006 -:10F8E0000000000000000000000000000000000018 -:10F8F0000000000000000000000000000000000008 -:10F9000000400000000000000000000000000000B7 -:10F9100000000000020002000000000000000000E3 -:10F920000000000000000000800000000000200037 -:10F9300000000000000000000000000000000000C7 -:10F9400000000000000820000000009000042000DB -:10F950000000000000080000000000842020822039 -:10F960000000000000000000000000000000000097 -:10F970000000000000000000000000000000000087 -:10F980000000000000000000000000000000000077 -:10F990000000000000000000000000000000000067 -:10F9A0000000000000A000000000010000880088A6 -:10F9B0000000000000000000000000000000000047 -:10F9C00000000100000000000180010000800080B4 -:10F9D0000000200000009000000000000000000077 -:10F9E00000050021000000110000000000000000E0 -:10F9F00000000000000000000003000000000008FC -:10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 -:10FA20000000000000000000000000001008210499 -:10FA300021041184008421840384218403840084AC -:10FA400021840084200408C009C01004100021048F -:10FA500000081184000021080000218400840000B7 -:10FA60000084008421000008000000A000000000C5 -:10FA70000000000003000000000000000000000083 -:10FA80000000000000000000000000000000000076 -:10FA900000000000000000000000000000C00000A6 -:10FAA000000000840000008400000000000000004E -:10FAB000100000091000000000008800000200098A -:10FAC00000020009000900092008000900020000E6 -:10FAD000100000001000000000000000000288007C -:10FAE00001000000010200110011000200020000EC -:10FAF00000000008000000410000000000000000BD -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB200000000000000000000000000000020000D3 -:10FB300000008000000080000000000000000000C5 -:10FB40000000000000000000000080010000000034 -:10FB500000008000000080000000000000000000A5 -:10FB60000000200000001000000000000000000065 -:10FB70000000000000000000000000000000000085 -:10FB80000000000000000000000000000000000075 -:10FB90000000000000000000000000000000000065 -:10FBA0000000000000000000000000000000000055 -:10FBB0000000010000000000000000000000000044 -:10FBC0000000000000000000000001000000000034 -:10FBD0000000010000000000000000000000000024 -:10FBE0000000010090000010000000000000000074 -:10FBF0000000000000000000000000000000000005 -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000000000000000000000000E4 -:10FC200000000000000000000000000000000000D4 -:10FC30000000000011000021000000000000000092 -:10FC40000000000000000000000000001100002182 -:10FC50000000000011000021000000000000000072 -:10FC6000000000001100A100008000000000000062 -:10FC70000000000000000000000000000000000084 -:10FC80000000000000000000000000000000000074 -:10FC90000000000000000000000000000000000064 -:10FCA0000000000000000000000000000000000054 -:10FCB0000000000000000008000011080000000023 -:10FCC0000000000000000000000000000000002014 -:10FCD00000001108000000200000112000000000BA -:10FCE0000000000000000008098000400000000241 -:10FCF00000000010000000000000000000000000F4 -:10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000000000D3 -:10FD300000000000000000000001000001010000C0 -:10FD400000000000000000000000000000000000B3 -:10FD500000000000010000000000000001000000A1 -:10FD60000000000000000000000301020001008804 -:10FD70000000000000000000000000000000000083 -:10FD80000000000000000000000000000000000073 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000001000000132 -:10FDC0000000000000000000000000000000000033 -:10FDD00000000000200000010000000020000001E1 -:10FDE0000000000000000000000001008888020000 -:10FDF0000000000002000000000000000000000001 -:10FE000000000000000000000000000000000000F2 -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000000000000D2 -:10FE300000000000000000000000000000000000C2 -:10FE4000000810000000000000000000000000009A -:10FE5000000000000000000000082000000000007A -:10FE600000082000000000000000000041000080A9 -:10FE700080001100000000000000090000000000E8 -:10FE80000000000000000000000000000000000072 -:10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000000000000000052 -:10FEB0000000000000000000000000000000000042 -:10FEC0001100000000000000000000000000000021 -:10FED00000000000000000001100000000000040D1 -:10FEE00011000000000000000000000000000011F0 -:10FEF0000000008000000000000000000000000082 -:10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000000000000000E1 -:10FF200000000000000000000000000000000000D1 -:10FF300000000000000000000000000000000000C1 -:10FF400000000100000000000000000000000000B0 -:10FF500000000000000000000000010000000000A0 -:10FF60000000010000000000000000000000000090 -:10FF70000001000000400000000000000000000040 -:10FF80000000000000000000000000000000000071 -:10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000000000000000000051 -:10FFB0000000000000000000000000000000000041 -:10FFC0000000500043E0002200000000000000009C -:10FFD00000000000000000000000500043E000228C -:10FFE0000000810043E0002200000000000000004B -:10FFF0000000000000E007008200000002E00000B6 -:02000004002BCF -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000000000000A0 -:100060000000000000000000000000000000000090 -:100070000000000000000000F0F0000000000000A0 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 -:1000F00000000000000000000000F0F00000000020 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:10017000000000000000000000000F0F0000FFFF63 -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F -:1001F0000000000000000000000000000F0F0000E1 -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000040006A4 -:10025000800E2000000000000000000000000000F0 -:100260000000000000040006800E200000040006CC -:10027000800E2000000000000000000005402A065B -:10028000054C00A800650006000F200000000000DB -:10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000FF0000FF00000000000000000000000020 -:1002E0000000000000000000FF0000FF0000000010 -:1002F000FF0000FF00000000000000000000000000 -:100300005555FFFF00000000000000000000000045 -:1003100000000000000000000000000000000000DD -:1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD -:1003400000000000000000000000000000000000AD -:100350000000FF0000FF000000000000000000009F -:1003600000000000000000000000FF0000FF00008F -:100370000000FF0000FF000000000000000000007F -:1003800000005555000000000000000000000000C3 -:10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D00000000000FF0000FF00000000000000001F -:1003E000000000000000000000000000FF0000FF0F -:1003F00000000000FF0000FF0000000000000000FF -:10040000000000000000F0F000000000000000000C -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC -:1004400000000000000000000000000000000000AC -:10045000000000000000FF0000FF0000000000009E -:100460000000000000000000000000000000FF008D -:1004700000FF00000000FF0000FF0000000000007F -:100480000000000000000000F0F00000000000008C -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B000000000000000000000000000000000003C -:1004C000000000000000000000000000000000002C -:1004D000000000000000000000000000000000001C -:1004E000000000000000000000000000000000000C -:1004F00000000005000000000000000000000000F7 -:1005000000000000000000000000000000000000EB -:1005100000000000000000030000000000000000D8 -:1005200000000000000000000000000800000000C3 -:1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000000AB -:10055000400000000000000000000000000000005B -:10056000000000000000000000000000000000008B -:10057000000000000000000000000000000000007B -:10058000000000000000000000000000000000006B -:100590000000000000080000000000000000000053 -:1005A000000000000000000000000000000000004B -:1005B00000000000000040000000000000000000FB -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B -:1005E00000000000200000000000000000000000EB -:1005F00000000000000000000000020000000000F9 -:1006000000001008100002001000000000000000B0 -:1006100000000000000000000000000000000000DA -:1006200000000000000000000810000000000000B2 -:1006300000000000000000000000000002000000B8 -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A -:1006600000000000000080000010000800000000F2 -:10067000000000000000001000000000000000006A -:1006800000000000800080000008801000000000D2 -:10069000000800000000000000000008000000004A -:1006A0000000000000000008000800080000000032 -:1006B000000000080000000800000008000800001A -:1006C000000800000000000800080084000000008E -:1006D0000088000800000084000000C0000800003E -:1006E00000000000000300040083A00000809000D0 -:1006F00000002000200090009021900000002000C9 -:100700000000900000000000000800100000000041 -:1007100000000000000000080000000000000000D1 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000080000A1 -:100750000000000000000000000000000008000091 -:100760000000000000000000000100040000000480 -:10077000050005000000030005000500050010004D -:10078000000000000000000000000000000000C0A9 -:100790000000000000000000000000000000000059 -:1007A0000000000000080000000000000000000041 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 -:1007E00000000000000000001000000400000004F1 -:1007F00000040000000000000000000000000000F5 -:100800000000000000000000000000000000008860 -:1008100001000000000000000000000400000000D3 -:1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000100000493 -:100860000100008000000000000000000001000006 -:100870000001001100000000000000000000000066 -:100880000000000000000000000000000000000068 -:100890000005200000000000000000000000000033 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000100008 -:1008E00000002000000400000000000000000000E4 -:1008F00002000008000000030000000000000000EB -:1009000000000000000800000000000000000000DF -:1009100001000004000000000000000000000000D2 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000900007 -:10096000000000000000000000002100008400845E -:1009700000000000000000000000000000C00000B7 -:10098000000009C000C011841184000000C0008470 -:100990000084200000C10084000000000084218445 -:1009A0000000000021000000000000000000000026 -:1009B0000000000000000000000000000000000037 -:1009C00000000000000000A0000000000000000087 -:1009D0000000000000000000000000000000000017 -:1009E00000000000000000000000000000002000E7 -:1009F00000000000000000040002000000000008E9 -:100A000000000000000000000000000000000000E6 -:100A10000002000400000000200200090000900015 -:100A200000040000000000020002000000000000BE -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000100000000000075 -:100A80000000000000000000000000000000000066 -:100A900000000000000100000000800000000000D5 -:100AA000000000000000000400040000000000003E -:100AB0000000000005000000000000000000000031 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000004000000000000000002 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000001000000000100000000D3 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000000000000000000010000000000000084 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B9000000000000000000011002100000800001B -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE00000000000000000000000110021000000D3 -:100BF0000000000000000000000000410000004173 -:100C000000000000000000000000000000000000E4 -:100C10000000000000000000000000900000000440 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C6000000000000000000000000000004109003A -:100C700000030080000000000000000000010000F0 -:100C80000001000000000000000000000000000063 -:100C90000000000000000000000000000010000044 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000103 -:100CF000010000000088000000000000000000006B -:100D000002000000000000000000000000000000E1 -:100D100000000000000000000000000000000000D3 -:100D200020000000010000000000000000000000A2 -:100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D700000008800000001000000000000000000EA -:100D80000000000000000300000000000000000060 -:100D90000000000000000000000000000000000053 -:100DA00000008000000008000000000000000000BB -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000004100000000000000B2 -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E200000000002001100000003000000000000AC -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E7000000000000000001104000000000000005D -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000001000000010000000040 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000001010000000000F0 -:100F0000000000000000000002E00000424200007B -:100F100000000000000000000000000000000000D1 -:100F2000000000000000000002E0000000000000DF -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000E000008141CF -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF -:1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F -:1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:10121000000000650006000F200000000000000034 -:1012200000000000000000000000000000000000BE -:10123000000000040006000E200000000000000076 -:10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:101280000000000000400006000C0000000000000C -:10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E -:1012B0000000000000005555FFFF00000000000086 -:1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E -:1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000F0FFFFF00000000C1 -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:101330000000000000000000555500000000000003 -:10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D -:10138000000000000000000000000F0F000000003F -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D -:1013B000000000000000000000000F0FAAAA0000BB -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:101400000000000000000000000000000000F0F0FC -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:101430000000000000000000000000000F0FAAAA3A -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000F0F000000000000000000000001000005C -:1014A000000000000000000000000000000000003C -:1014B0000000000400000000000000000000000028 -:1014C000020000000000000000000000000000001A -:1014D0000000000000030000000000000000000009 -:1014E00000002000000000000000000000000000DC -:1014F00004000000000000000000000000000000E8 -:1015000000002000000000000000000000000000BB -:1015100004000000000000000000000000000000C7 -:10152000000000000000000000000000000040403B -:1015300000000000000100000000000000000000AA -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:101570000000000000020000000000000000000069 -:10158000000000000000000000000000000000005B -:1015900000000000000000000000000000009000BB -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C0000000000008000010000000000000000003 -:1015D0000000080000000000000000000000000003 -:1015E00000000000000000000000000000000000FB -:1015F0000000820000000000000000000000000069 -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000010BA -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:101640000000000200000000000000000000000098 -:10165000000000000000000000000000000000008A -:101660000000000000000000000000080000000072 -:101670000000000000080000000000000000000062 -:10168000000800000000000000000008000000004A -:10169000000000000010000000000000000000003A -:1016A000000000000000000000000000000000003A -:1016B0000000000000001000C080000000000000DA -:1016C00000000000000000200000000000000000FA -:1016D00000000000000800000000010300000000FE -:1016E00000000000000000000000000000000000FA -:1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:101720000000000000001000100000000000040095 -:10173000040004000000000080A000080000000079 -:1017400000000000008400000000000000A0000075 -:101750000000000000000000000000000400000085 -:101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000010028 -:1017C0000000000000000000000000000000000019 -:1017D00000000000000000000008000001800180FF -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000808000100B7 -:101820000080000000000000000000000000000038 -:1018300000000000000000000000000000000000A8 -:101840002000000000000000000000000000000078 -:101850000000000000000000000000010000202047 -:101860000204000000000000000000000000000072 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000001000047 -:1018A0002000000400000000000000000000000014 -:1018B00000000000000000000000A0000180008087 -:1018C0000080008000000000000000000000000018 -:1018D00000000000000000009000900000000000E8 -:1018E00000001000000000000000000800000000E0 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:101910000000000000000000000000009000000037 -:1019200000000000000000000000000000000008AF -:10193000000000000000001000000000000020086F -:101940000004000400080000000000C0000000A027 -:101950000000000000840000000000000000000003 -:1019600000000000800000000000000000000000F7 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:10199000000000000000000000000000000000C087 -:1019A00000000000008400000000000000000000B3 -:1019B000000000000000080000000000000000001F -:1019C00000000000000000000000002000000000F7 -:1019D00000000000000000080000000000000002FD -:1019E000008001000000000000000000000000096D -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000500A1 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000004020000000000000000000000016 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC0000000000001000000000000000000000015 -:101AD0000000000000000000000000000000000006 -:101AE000000000000100900000C0000000000000A5 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000001000000000000000000B4 -:101B300000000000000000000000000000000000A5 -:101B40000000000000001100002100000000000063 -:101B50000000000000000000000000000000000085 -:101B60000000000000001100A100000000000000C3 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000110021000000000003 -:101BB0000000000000000000000000000000000025 -:101BC00000000000000000000008000011100000EC -:101BD0000000000000000000000000000000000005 -:101BE0000000000000000000000809800003000061 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C20000000000000000000000000410900000367 -:101C30000080000000000000000000000000000024 -:101C40000000000000000000000000000000010192 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000010102000070 -:101C700000880000000000000000000000000000DC -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000001010032 -:101CB000000000880000000000000000000000009C -:101CC000000000000000000000000000000008000C -:101CD0000001000000000000000000000000000003 -:101CE00000000000000000000000000001008888E3 -:101CF00008000000000000000200000000000000DA -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D3000880000000100000000000000000000001A -:101D40000000000000000000000000000000000093 -:101D50000000000808000000000000000000000073 -:101D60000000000000000000000000000000410032 -:101D700000808000410000000000800000000000A2 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB00000000000000041000000000000000000E2 -:101DC0000000000000000000000000000000000013 -:101DD00000001100000000000000000000000000F2 -:101DE00000000000000000000000000000000000F3 -:101DF0000011000000804000000000000000000012 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E30000000000040110000000000000000000051 -:101E40000000000000000000000000000000000092 -:101E50000000000001000000000000000000000081 -:101E60000000000000000000000000000000000072 -:101E70000000000100000040010000000000000020 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000101000000000000000020 -:101EC0000000000000000000000000000000000012 -:101ED00000000000480043E0002200000000000075 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000E0070082000000000079 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F3000000000000000000000E0000081410000FF -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F700000000000000000000000F0F00000000081 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF000000000000000000000000000F0F0000001 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000F0F000042 -:10208000FFFF000000000000000000000000000052 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000F0FC2 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000047B -:102160000006800E200000000000000000000000BB -:10217000000000000000000000000000000005401A -:102180002A06054C00A80000000000000000000026 -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C00000400006000C00000000000000000000BD -:1021D00000000000000000000000000000000000FF -:1021E0000000FF0000FF00000000000000000000F1 -:1021F00000000000000000000000000000000000DF -:1022000000003C3CFFFF0000000000000000000058 -:1022100000000000000000000000000000000000BE -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:1022400000000000FF00FFFF000000000000000091 -:10225000000000000000000000000000000000007E -:1022600000000000FF0000FF000000000000000070 -:10227000000000000000000000000000000000005E -:10228000000000003C3C00000000000000000000D6 -:10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000FF0000000000000000000F -:1022D00000000000000000000000000000000000FE -:1022E000000000000000FF0000FF000000000000F0 -:1022F00000000000000000000000000000000000DE -:102300000000000000000000F0F0000000000000ED -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD -:10233000000000000000000000000000000000009D -:1023400000000000000000000000F0F000000000AD -:10235000000000000000000000000000000000007D -:102360000000000000000000FF0000FF000000006F -:10237000000000000000000000000000000000005D -:1023800000000000000000000000F0F0000000006D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D -:1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000F0F000002D -:1023D00000000000000000000000000000000000FD -:1023E00000000000000000000010000000000000DD -:1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000000CC -:1024100000030000000000000000000000000000B9 -:1024200000000000000000000000000000000000AC -:10243000000000000000000000000000000000009C -:10244000000040000000000000000000000000004C -:10245000100000000000000000000000000000006C -:10246000100000000000000000000000000000005C -:10247000000000000000000000000000000000025A -:10248000004000000000000000000000000000000C -:10249000000000000000000000000000000000003C -:1024A00040000000000000000000000000000000EC -:1024B00000000000000000000000000040000002DA -:1024C00000000000000000000000000010000000FC -:1024D00000000000000000000000000002000000FA -:1024E00000000000000000000200000000000000EA -:1024F00000000000000000000000000000000000DC -:102500008200000000000000000000000000000049 -:1025100008100000000000000000000000000000A3 -:1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000000003B -:1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000010000000000000000000000EA -:1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA -:1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA -:10263000000000000000000000000000000000009A -:10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000200000000000000000004A -:10267000000000000000000000000000000000005A -:10268000000000000000000000000000000000004A -:10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A -:1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E0000000000001000000000400800000000065 -:1026F00000000000000000000000000000000000DA -:1027000000000000000000000000000000000000C9 -:10271000000000000008001101000080000000001F -:1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 -:102740000000000000000000000000000000000089 -:1027500000000000000000000000010010800000E8 -:102760000000000000001000000000000004000055 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:102790000000000000000001000020000004000014 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000020000004D5 -:1027E0000000000000009000000000000000000059 -:1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:102810000000000000009000000000000000000028 -:1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:102840000000000000000000000000000000000088 -:1028500000000000000000009000000000000000E8 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000001100000047 -:1028800000840000000000000000000000000000C4 -:1028900000000084000000C000C0000000000084B0 -:1028A00000840000000000000000000000000000A4 -:1028B0000000000000000000000000000000000018 -:1028C0000000000000000000000000000000000008 -:1028D0000000000000000000000000C00000000038 -:1028E0000084000000000000000000000000000064 -:1028F00000000000000000090000000000000000CF -:1029000000000000000000000000000200000000C5 -:1029100000000000000000000000000000090000AE -:1029200000000000000000000000000200020000A3 -:102930000000000000000000000000000000000097 -:102940000000000000000000000000000000000087 -:1029500000000000000000000000000000000080F7 -:102960000000000000000000000000000000000067 -:102970000000000020000000000000000500000032 -:102980000000000000000000000000000000000047 -:102990000000000000000000000000000000000037 -:1029A0000000000002000000000000000000000025 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000200000000000000F5 -:1029E00000080000000000000000000000000000DF -:1029F00001000000000000000000000000000000D6 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 -:102A200001000000000000000000000000000000A5 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000000000076 -:102A60000000010000000000000000000000000065 -:102A70000000110021000000000000000000000024 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA00000001100210000000000000000000000F4 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 -:102AD00000000000000000000000000000000000F6 -:102AE00000000000110021000000000000000000B4 -:102AF0000000000000410900000300800000000009 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 -:102B200000000000004109000003008000000000D8 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 -:102B60000000000000000041090000030080000098 -:102B70000000000000000085010000000088000047 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000085010000000088000017 -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD00000000000000000000000000000000000F5 -:102BE000000000000000000000010100000000885B -:102BF00000000000000000000000080000000100CC -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000000000B4 -:102C2000000000000000000000008800000001001B -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C600000000000000000000000000088000000DC -:102C700001000000000000000000000080000000D3 -:102C80004100000000000000000000000000000003 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB00041000000000000000000000000000000D3 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000000000000000000E4 -:102CF0000000410000000000000000000000001182 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D20000000000000000000000000000000001192 -:102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D60000000000000000000000000000000000063 -:102D7000041100000000000000000000000000003E -:102D80000001000000000000000000000000000042 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000001000000000000000000000000000012 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000000101000000000000000000000000D1 -:102E0000000000E000008141000000000000000020 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E3000000000E0000081410000000000000000F0 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000000062 -:102E70000000000000E000008141000000000000B0 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 -:103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 -:103100000000000000000000000000000040000679 -:10311000000C0000000000000000000000000000A3 -:10312000000000000000000000000000000000009F -:103130000000000000000000000000000040000649 -:10314000000C000000000000000000000000000073 -:10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000400F -:103180000006000C0000000000000000000000002D -:103190005555FFFF00000000000000000000000087 -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C0005555FFFF00000000000000000000000057 -:1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF -:103200000000FF00FFFF00000000000000000000C1 -:103210000000555500000000000000000000000004 -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:1032400000005555000000000000000000000000D4 -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:1032800000000000FF00000000000000000000003F -:10329000000000000000F0F000000000000000004E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C000000000000000F0F000000000000000001E -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:103300000000000000000000F0F0000000000000DD -:103310000000000000000000F0F0000000000000CD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:103340000000000000000000F0F00000000000009D -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:1033800000000000000000000000F0F0000000005D -:10339000000000000000010001000080008000002B -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000003FA -:1033D00000000000000010000000000000001000CD -:1033E000400000000000100040000000000000004D -:1033F000400000000000200000000000000010005D -:103400004000000000002000400000000080880014 -:10341000000000000000000010001000000800087C -:103420000000000000000000000000000000000498 -:1034300000000000000000000000009000000000FC -:10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:103480000000000000000000000000000000000834 -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000020000001A -:1034B0000800000002000000000000000000000002 -:1034C00000000000000000000000020002000000F8 -:1034D00002000000000000000000000000000000EA -:1034E00000000000000000000000000000000000DC -:1034F00000000200000000000000000002000000C8 -:10350000000000000000000000000010100010008B -:10351000000008080000000000000000000000009B -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:1035800000000000000000000000000000008000BB -:1035900080000000020100000000000000000000A8 -:1035A00000000000010000000000000000002000FA -:1035B000000040000000400000000000000000008B -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000200000000000000000007A -:10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A -:10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A0000000010001000080018000000000000017 -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F000000000000000004000000000000000008A -:1037000000000000000000000000080008000000A9 -:1037100000000000080000000000010000000000A0 -:103720000000000002000400002002200000000051 -:103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 -:103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 -:1037900000000000000000000000000020002000E9 -:1037A0000000900000000000000000000000000089 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:1038200000000000000000C00000000000000000D8 -:103830000000000000000000000000200000000068 -:103840000000000000000000000000000000000078 -:1038500000000000000000C0000000000084000024 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:10389000000000000000000000C0000000000084E4 -:1038A0000000000000000000000000000000000018 -:1038B00000000002000000090000000000000000FD -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00001000000000000000002000000000000D5 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 -:103910000000000000000000000090000000000017 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000004000063 -:103960000000200000000000000000000500000032 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000010016 -:1039B000900000A0000000000000000000000000D7 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000100000000000000000000000000000095 -:103A30001100002100000000000000000000000054 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA00000001100002100000000000000000000E4 -:103AB0000000000900801103000000000000000069 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 -:103B2000000000000004000011040000000000007C -:103B300000000000000000020101008800000000F9 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA0000000000000000001000001000000000013 -:103BB0000000000000000100208802000100000059 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 -:103BE00000000000000000000000000001000000D4 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C200000000000000000000000C00000010000D3 -:103C3000000000000000000008000080800908006B -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000410013 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 -:103CA000000000000000000000000000000000080C -:103CB000050000000000000000000011110000805D -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000110082 -:103D30000000000000000000000000000001010081 -:103D40000040000000000000000000000000000033 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000000000000013 -:103DB0000100000000000000000000000000000002 -:103DC00000E007000000000000000000000000000C -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 -:103DF00000E00000000A00000000000000000000D9 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E3000000000E0000000000000000000000000A2 -:103E400000000000F0F00000000000000000000092 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC000000000000000F0F0000000000000000012 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F40000000000000000F0F0000FFFF0000000055 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000F0F000000000000D3 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:10404000000000000000000005002A06054C00A842 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 -:10407000000000000000000000610006000D0000CC -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000006000CEE -:1040C000000000000000000000000000FF0000FFF2 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:104130000000000000000000000000000000FF0080 -:1041400000FF000000000000000000000000FF0071 -:1041500000FF000000000000000000000000000060 -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C000FF0000FF000000000000000000000000F1 -:1041D000FF0000FF000000000000000000000000E1 -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:104240000000FF0000FF0000000000000000000070 -:104250000000FF0000FF0000000000000000000060 -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000FF0000FF0000000000000000F0 -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000001000000000100000000AB -:10431000000010000000000002001000000000007B -:10432000000040000000000000000000000000004D -:1043300000002000400000000000200000000000FD -:10434000400020000000000000000000000000000D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000100000003D -:10437000000000000000000000000000000000003D -:10438000000000000000000010000000000000001D -:10439000000000000000000000000000000000001D -:1043A000000000000000400000000000000040008D -:1043B00000000000000000000000000010000000ED -:1043C00000000000000040000000000000000000AD -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000200CB -:1043F00000000000000002000200080002000000AF -:1044000000000000000001000100000001000000A9 -:10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:10443000020000000000000000000000200000005A -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:1044800000000000000000001000100000001000FC -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000010000000000000000000000000000009A -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:104550000000000000002000000000C0000000007B -:10456000000000000000000000000000000000004B -:1045700000000088000000000000000000000000B3 -:10458000000000000000000000000000000000002B -:104590000000040000000000000000000000000017 -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E000000001000080000000000000000000004A -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000100A9 -:104610000000008001000000000000000000000019 -:10462000000000000040000000000000000000004A -:10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:104660000000000020000004000000000000000026 -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:1046900002000000002020000000000000000000D8 -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E0009000010000000000000000000000000039 -:1046F00000000000000000000000000000000000BA -:104700000000000000000000000000000000900019 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:1047600000C00000108400840000008400000000ED -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D0000000000000000000000000000084000055 -:1047E00000000000000000000000000000000002C7 -:1047F00000020000000200000000000000000000B5 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:10482000000000000009000000000000000000007F -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 -:104860000000000000000000000002000000000046 -:104870000000000000000000000000000000000038 -:1048800000000000000000000000000000400000E8 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000010000000000C7 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000001009000000006 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000001100210015 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000001100802165 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 -:1049E0000000000000000000000000000000004186 -:1049F000090000030080000000000000000000002B -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000492 -:104A20000080114000800000000000000000000035 -:104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A700000010100000000880000000000000000AC -:104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA00000010002010100C0000000000000000041 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF000000000008800000001000000000000002D -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B2000000001008488080101000000000000006E -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B700000000000000000000000410000000000F4 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA00000000000410000808008080000000000B4 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000011040000000000A0 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C200000000000000000111100008000000000E2 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000010100000032 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA00000000000000000000001010000400000C2 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000E00000D4 -:104D000081410000000000000000000000000000E1 -:104D10000000000000000000000000000000000093 -:104D200000000000000000000000000000E007009C -:104D3000820A0000000000000000000000000000E7 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB0000000F0F000000000000000000000000013 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E300000000000F0F00000000000000000000092 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F3000000000000000FFFF000000000000000073 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000400006000C000000004E -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:1050300000000000000005000A06054C00A8000062 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 -:10508000000000000000000000000F0FFFFF000004 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000FF0000FF0000F2 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:105100000000000000000000000000000F0F000081 -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000FF0000FF71 -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F -:10519000F0F000000000000000000000000000002F -:1051A00000000000000000000000000000000000FF -:1051B0000000000000000000000000000000FF00F0 -:1051C00000FF0000000000000000000000000000E0 -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:105210000000F0F0000000000000000000000000AE -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000FF0000FF00000000000000000000000060 -:10525000000000000000000000000000000000004E -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE -:1052B00000800080000000040000000000004000AA -:1052C00000000000000000000001000000000000DD -:1052D00010000000000000000000000000000000BE -:1052E000200000000000000000000000000000009E -:1052F000200000000000000000004000000000004E -:10530000200040000000000000000000000000003D -:1053100000000000000000000040004000400000CD -:10532000000000000000000000000000000000007D -:105330000000000400040000000100000000000064 -:10534000000000000000000000000000100000004D -:10535000000000001000000000000000100000002D -:1053600000000000000000000040000010000000ED -:10537000000000001000000000000000100000000D -:1053800000000000100040000000000000000000CD -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD -:1053B00000000000000010000200200000000000BB -:1053C000000000000000004000000000000000009D -:1053D00000000000000000000000000000000000CD -:1053E00000000000000002000000000000000000BB -:1053F000000000000800000000000000080000009D -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C -:10543000000000000000000080000000800000006C -:10544000000000000000000000000000000000005C -:10545000000000000000000000000000000000004C -:10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000000000000000000000800000000000008C -:1054A00000000000000000000000000004000000F8 -:1054B00004000000000000000000000020000000C8 -:1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B -:10551000000000000000000000000040000000004B -:10552000000000000000000000000000000000007B -:1055300000000000000000000000000000008000EB -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:10556000000000000000000000000000000000003B -:10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B -:1055900000000000000000000000004000000100CA -:1055A000008001000000000000000000000000007A -:1055B00000000000000000000000000001000004E6 -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB -:1055F00000040000000000000000000000000000A7 -:10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:105620000400002004000000000000000000000052 -:10563000000000000000000000000000000020004A -:105640000001000000000000000000000000000059 -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:105670000000000400000000000000000000000026 -:10568000000000000000000000000000000000001A -:10569000000000000000000000000000900000007A -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 -:1057200000C0000000000084000000000000000035 -:105730000000002000000000000000000000000049 -:10574000000000000000000000000000000000C099 -:105750000000008400000000008400000000000041 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B00000020000000000000000000000000000E7 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000002C7 -:1057E00000000000000200000000000000000000B7 -:1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 -:105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000100200000000000D7 -:1058B00000000000000000000000000000000000E8 -:1058C0000000000000000000000000009000000048 -:1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 -:1059200000000000000000000000110080000000E6 -:105930000000000000000000000000000000000067 -:1059400000000000000000000000000000008000D7 -:105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 -:105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A0000000000000000000000000000020008057 -:1059B0000000008000000000000000000000000067 -:1059C0000000000000000000000000000041000096 -:1059D0000041000000000000000000000000000086 -:1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000175 -:105A300000020000008200000000000000000000E2 -:105A40000000000000000000000000000000000155 -:105A50000000000100000000000000000000000045 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000000000000F6 -:105AB00001000088880000000000000000000000D5 -:105AC00000000000000000000000000000000000D6 -:105AD0000000C00000000100000000000000000005 -:105AE00000000000000000000000000000000000B6 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 -:105B300000000800008000000000000000000000DD -:105B40000000000000000000000000000000000055 -:105B50000000000080000000400000000000000085 -:105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 -:105BB0000000000000110000008000000000000054 -:105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE00000000000000000000000000000000000B5 -:105BF00000000000000000000000000000000000A5 -:105C00000000000000000000000000000000000094 -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C30000000000000000001000000400000000023 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000000024 -:105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB0000000000000000000000000E007000000FD -:105CC00000000000000000000000000000000000D4 -:105CD0000000000000000000000002E00000484258 -:105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000F0F083 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 -:105DC000F0F00000000000000000000000000000F3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 -:105E400000000000FFFF0000000000000000000054 -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000000000000000000E2 -:105EC00000000000000000000000000000000000D2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 -:105F00000000000000000000000000000000000091 -:105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000000061 -:105F4000000005610A06054D00A8000000000000E1 -:105F50000000000000000000000000000000000041 -:105F6000000000650006000E200000000000000098 -:105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 -:105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE0000000000000000000AAAA0000000000005D -:105FF00000000000000000000000000000000000A1 -:106000000000000000000000000000000000000090 -:106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:1060600000000000000000000000AAAA00000000DC -:106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 -:106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:10611000000000000000000000000000000000007F -:10612000000000000000000000000000000000006F -:10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000000000000EF -:1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D000000040000000000020000000000000005F -:1061E00000000000000000000000000000000000AF -:1061F000000020000000000020000000000000005F -:10620000000000000000000000000000000000008E -:10621000000082002000000000002000000040007C -:1062200000000000C000000000000000000040006E -:1062300000004000200010000000200000002000AE -:10624000000000002000000000000000000000002E -:10625000000000C00000000000000000000000007E -:10626000000000000000000000000000000000002E -:1062700000000040000000000000000000000000DE -:1062800000000000000000000000000000004000CE -:1062900010000000000000001000000000000000DE -:1062A000100000000000000000000000400000009E -:1062B000100000400000000040000000000000024C -:1062C000400000000002000000000000000000008C -:1062D00002000000000000000000000000000000BC -:1062E00000000000000000000000000000000000AE -:1062F000000000000200000000000000000000009C -:10630000000000000000000000000000000000008D -:106310000000000004000000000000000000200059 -:10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:10635000000000000000000000000000000000003D -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C -:10641000000000000000000000000000000000007C -:10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC -:1064C00000000000000000000000000000000000CC -:1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C -:106500000000000000000000000000000200000089 -:10651000000000000000000000000000000020005B -:10652000002000000000000000000000000000004B -:10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B -:10657000000000001000000000000000000000000B -:106580000000000000000000000000000000020009 -:1065900000000000000000001000000000000000EB -:1065A00000000000000000C000000000000000002B -:1065B00000000000000010000000000000000000CB -:1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A -:10664000000000000000000000000000000000004A -:106650000000000000000000000000C0000000007A -:106660000084000000840000000000000000000022 -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E00000000000000000000000000200000002A6 -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 -:106710000000000002000000000000000000000077 -:106720000000000000002000000000000000000049 -:106730000000000000000000000000000000000059 -:106740000000000000000800000000000000000041 -:106750000000000000000000000000000000000039 -:106760000000000000000000050000000000020022 -:106770000000000000000000000000000000000019 -:1067800000000000000000000000400000000000C9 -:1067900000000000000002000500000000000000F2 -:1067A00021000000040000000300000000000000C1 -:1067B00021000000000000000300000000000000B5 -:1067C00000000000000000000800000000000000C1 -:1067D0002100000000000000000000000000000098 -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 -:106830000000000000000000000000000000000058 -:106840000000000000000000000000000000000048 -:106850000000000000000000000000000000000038 -:106860000000000000000000000000000000000028 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B00000000000000000000000000000000000D8 -:1068C00000000000000000000000000000000000C8 -:1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000000000000000000000000000057 -:106940000000000000000000000000000000000047 -:106950000000000000000000000000000000000037 -:106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 -:106980000000000000000000000000000000000007 -:1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 -:1069B00000000000000000000000000000000000D7 -:1069C00000000000000000000000000000000000C7 -:1069D00000000000000000000000000000000000B7 -:1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000000086 -:106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 -:106A40000000000000000000000000000000000046 -:106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 -:106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000000000000000000C6 -:106AD00000000000000000000000000000000000B6 -:106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 -:106B00000000000000000000000000000000000085 -:106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 -:106B30000000000000000000000000000000000055 -:106B40000000000000000000000000000000000045 -:106B50000000000000000000000000000000000035 -:106B60000000000000000000000000000000000025 -:106B70000000000000000000000000000000000015 -:106B80000000000000000000000000000000000005 -:106B900000000000000000000000000000000000F5 -:106BA00000000000000000000000000000000000E5 :106BB00000000000000000000000000000000000D5 :106BC00000000000000000000000000000000000C5 :106BD00000000000000000000000000000000000B5 @@ -177986,221 +177986,221 @@ :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F :10717000000000000000000000000000000000000F -:10718000000001000100010020004000000000009C -:107190000000000000000000880000000000000067 -:1071A000000000000000400000000000840000001B -:1071B00000000000000000002000000000000000AF -:1071C00000000001000000002080000040000000DE -:1071D000840000000000000000002000000000000B -:1071E00000000000000000002000400000008400BB +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F -:107200000000000004000400040000000000000072 -:1072100000000000000000000000000000000090DE -:10722000000000000000000000001000000000004E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000020000000001E -:10725000000000401000000000000040000000009E -:1072600000000000000040000000000000001000CE -:1072700040000040000040000000400000004000CE -:10728000000000000000020002000040004000007A +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000200000000000000000000000000004C +:10724000000000000000000000000002000000003C +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000010000000EE :1072900000000000000000000000000000000000EE :1072A00000000000000000000000000000000000DE -:1072B00000000000000010000000000000000200BC -:1072C00002000000020000000000000000000000BA -:1072D00000000000010000000000000000000000AD -:1072E000000000000000000001000000000040005D -:1072F0000200000000000000010000000000040087 -:107300000200020000000040800080000001000137 +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000080000B6 +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:107300000000000000000000000000000000000875 :10731000000000000000000000000000000000006D -:107320000008000000000000000000000000000055 -:1073300000000000000000008000000000080000C5 -:107340000008000800000008000000000000000025 -:1073500040000000000004000000000000000008E1 -:107360000000000800080000000804000000000001 -:107370000000000000000000000004000000000801 -:107380008000000800080000000800000000000065 -:1073900001000000000000000000000000000000EC -:1073A00000000000000800000000000000000000D5 +:107320000000000000000000000000000000000855 +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:107350000008000000000000000000000000000025 +:107360000000000000000000000000000000000815 +:107370000008000000000000000400000000000001 +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD :1073B00000000000000000000000000000000000CD -:1073C00001000000000000000000000000000000BC -:1073D0000000000000000041000000000000000567 +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD :1073E000000000000000000000000000000000009D :1073F000000000000000000000000000000000008D :10740000000000000000000000000000000000007C -:107410000000040000000000000000000000000068 +:10741000000000000000000000000000000000006C :10742000000000000000000000000000000000005C :10743000000000000000000000000000000000004C -:107440000000040000000000000000000000000038 +:10744000000000000000000000000000000000003C :10745000000000000000000000000000000000002C -:107460000000000004000000000000000000000018 +:10746000000000000000000000000000000000001C :10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC -:107490000000000084000000000000000000000068 +:1074900000000000000000000000000000000000EC :1074A00000000000000000000000000000000000DC -:1074B000000000000000000000000000000000408C -:1074C000000001800080002000200020002000003B -:1074D00000200020000200200020002000000020EA -:1074E000002000200020002000000020002000409C -:1074F00000000020002000000020002000200020CC -:1075000000000020002008008400000000000000AF -:107510000000000008000800100008000000000043 +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B :10752000000000000000000000000000000000005B -:1075300000000040100008000800400000000000AB -:1075400000010000202000400001000100010001B6 -:1075500000000001000108001001100108014000B6 -:107560001101000100010001000100000001000103 -:10757000000000000001080110000801400108019E -:1075800000010000000100010000000000000000F8 -:1075900000000000000000200000000000030000C8 -:1075A00000030003000000080000000000000000CD -:1075B0000008000000000000000020000000900013 -:1075C00000000000000000001004000000000000A7 -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B +:10753000000000000000000000000000000000004B +:1075400000000000000000000000008200000000B9 +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000000000000000BB +:1075D00000000000000300000008000000000000A0 +:1075E0000000000800000000000000000000000093 :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A -:107610000000000000000000000100000000000069 +:10761000000000000000000000000000000000006A :10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A -:1076400000000000000000000000800100000000B9 +:10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A :10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA -:1076A00000210009000000000000000000000000B0 +:1076900000000000000000000000000000080000E2 +:1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA -:1076C0002000000000000000010000000000000099 -:1076D00000000009000000000000000000000000A1 +:1076C00000000000000000000000000000000000BA +:1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A -:1076F00000802004000001000000A0000000010044 -:107700000000A000000000000000000000000000D9 +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 :107710000000000000000000000000000000000069 -:1077200000000000000000000000008800000000D1 -:107730000000004000000200000000000000000007 -:107740000082001000000000000020000000000087 -:107750000000000000000000000000000000000029 -:107760000000000000000000000000000000000019 -:1077700000000020000000000400000000000000E5 -:1077800004000000000000000000000000000000F5 -:107790000000000000000000000000009020000039 -:1077A0008200000000000000000000000000000057 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000841 +:107740000000000000000000000000000000000039 +:1077500000000000000000820000000000000000A7 +:107760000008000000000000000000000000000011 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000080000000000000000000000000000E1 +:1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 -:1077C0000000000000000000000001009000000028 -:1077D00000A000C0009000000000000300C0009066 -:1077E0000000000000C000900000000000C00090F9 -:1077F0000000000000C000900000000000C00090E9 -:107800000000000000C000900000000000C00090D8 -:107810000000000000000000000000001100808057 -:1078200000008000000000000000000000000000D8 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 :107830000000000000000000000000000000000048 -:107840000000000000000000000000001100A10086 -:1078500000000000008000800000000000000080A8 -:107860000080000000000080008000000000008018 -:107870000080000000000080008000000000008008 -:1078800000800000000000800080000000000080F8 -:107890000080000000000000000000000000000068 -:1078A0000080000000000000000000000000000058 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 :1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000008B0 -:1078D000098000100080000000008000808000000F -:1078E0000000000080008080000000008000808098 -:1078F0000000000080008080000000008000808088 -:107900000000000080008080000000008000808077 -:1079100000000000800080800000000000000000E7 -:1079200000000008000000840000000000000000CB +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 +:107910000000000000000000000000000000000067 +:107920000000000000000000000000000000000057 :107930000000000000000000000000000000000047 :107940000000000000000000000000000000000037 -:107950000001010200010002000000008400C0904C -:107960000000000000008400C090000000008400BF -:10797000C090000000008400C0900000000084005F -:10798000C090000000008400C0900000000084004F -:10799000C090000000008400C090000000000000C3 -:1079A00000000000000010000000000000000000C7 +:107950000000000000000000000000000000000027 +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 :1079B00000000000000000000000000000000000C7 :1079C00000000000000000000000000000000000B7 -:1079D00000000100888808000000000002000090FC -:1079E00000C0000000000000009000C00000000087 -:1079F000009000C000000000009000C000000000E7 -:107A0000009000C000000000009000C000000000D6 -:107A1000009000C000000000009000C000000000C6 -:107A200000000000110000008000000000000000C5 +:1079D00000000000000000000000000000000000A7 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 :107A30000000000000000000000000000000000046 :107A40000000000000000000000000000000000036 -:107A50000000000041000080800041000000800024 -:107A60000080008000000000000000800080000016 -:107A70000000008000800000000000800080000006 -:107A800000000080008000000000008000800000F6 -:107A900000000080008000000000008000800000E6 -:107AA00000000000000000110000808000000000C5 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000000000000000000D6 :107AB00000000000000000000000000000000000C6 :107AC00000000000000000000000000000000000B6 -:107AD0000000000000000011050000800000800090 -:107AE0000002000000000000801180020000000081 -:107AF0008011800400000000801180090000000057 -:107B0000801180040000000080118005000000004A -:107B10008011800500000000801180050000000039 -:107B2000000000000000000000010000084000000C +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000000055 :107B30000000000000000000000000000000000045 :107B40000000000000000000000000000000000035 -:107B500000000000000000000001000000400000E4 -:107B600090000000000000000000C00120000000A4 -:107B70000000C001200000000000C0012000000043 -:107B80000000C001200100000000C0012000000032 -:107B90000000C001200000000000C0012000000023 -:107BA00000000000000000000000000000000700CE +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 :107BB00000000000000000000000000000000000C5 :107BC00000000000000000000000000000000000B5 -:107BD00000000000000000000000000000E00700BE -:107BE0008200000A0000060000000000000A0000F9 -:107BF00006000000000A000006000000000A000065 -:107C000006000000000A00000600000000820000DC -:107C100006000000000A000006000000000A000044 -:107C2000060000000000000000000000F0F000006E -:107C3000FFFF000000000000000000000000000046 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 :107C50000000000000000000000000000000000024 -:107C6000F0F000000000FFFF000000FF0000000037 -:107C700000FF000000FF000000FF000000FF000008 -:107C800000FF000000FF000000FF000000FF0000F8 -:107C900000FF000000FF000000FF000000FF0000E8 -:107CA00000FF000000FF0000000000000000F0F0F6 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 :107CB00000000000000000000000000000000000C4 :107CC00000000000000000000000000000000000B4 :107CD00000000000000000000000000000000000A4 -:107CE0000000F0F000000000FFFF000000FF0000B7 -:107CF000000000FF000000FF000000FF000000FF88 -:107D0000000000FF000000FF000000FF000000FF77 -:107D1000000000FF000000FF000000FF000000FF67 -:107D2000000000FF000000FF000000000000000055 -:107D30000000FF000000FFFF000000000000000046 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 :107D40000000000000000000000000000000000033 :107D50000000000000000000000000000000000023 -:107D600000003C3C0000FFFFFF000000FF0000009F -:107D70000000FF000000FF000000FF000000FF0007 -:107D80000000FF000000FF000000FF000000FF00F7 -:107D90000000FF000000FF000000FF000000FF00E7 -:107DA0000000FF00000000FFFFFF000000000000D7 -:107DB00000000000FF0000000000000000000000C4 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 :107DC00000000000000000000000000000000000B3 :107DD00000000000000000000000000000000000A3 -:107DE000000000003C3C00000000FF000000FF001D -:107DF00000000000FF000000FF000000FF00000086 -:107E0000FF000000FF000000FF000000FF00000076 -:107E1000FF000000FF000000FF000000FF00000066 -:107E2000FF000000FF00000000FFFFFF0000000057 -:107E30000000000015182A00054005A800000000F9 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000000000000042 :107E40000000000000000000000000000000000032 :107E50000000000000000000000000000000000022 -:107E60000000000005402A06054C00A80302033864 -:107E70000C0092C00000038203380C0092C0038201 -:107E800003380C0092C0038203380C0092C00382B6 -:107E900003380C0092C0038203380C0092C00382A6 -:107EA00003380C0092C0038203380C0082C000002B +:107E60000000000000000000000000000000000012 +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 :107EB00000000000000000000000000000000000C2 :107EC00000000000000000000000000000000000B2 :107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000FF00FFFF0000000095 +:107EE0000000000000000000000000000000000092 :107EF0000000000000000000000000000000000082 :107F00000000000000000000000000000000000071 :107F10000000000000000000000000000000000061 @@ -178208,7 +178208,7 @@ :107F30000000000000000000000000000000000041 :107F40000000000000000000000000000000000031 :107F50000000000000000000000000000000000021 -:107F600000000000000000000000FF000000000012 +:107F60000000000000000000000000000000000011 :107F70000000000000000000000000000000000001 :107F800000000000000000000000000000000000F1 :107F900000000000000000000000000000000000E1 @@ -178216,7 +178216,7 @@ :107FB00000000000000000000000000000000000C1 :107FC00000000000000000000000000000000000B1 :107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000F0F0B1 +:107FE0000000000000000000000000000000000091 :107FF0000000000000000000000000000000000081 :108000000000000000000000000000000000000070 :108010000000000000000000000000000000000060 @@ -178225,181 +178225,181 @@ :108040000000000000000000000000000000000030 :108050000000000000000000000000000000000020 :108060000000000000000000000000000000000010 -:10807000F0F0000000000000000000000000000020 +:108070000000000000000000000000000000000000 :1080800000000000000000000000000000000000F0 :1080900000000000000000000000000000000000E0 :1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000002000A0 -:1080C00020002000000000000000880000000000E8 -:1080D0004000000000008800000000002180200017 -:1080E0002000200000008800000088000000000040 -:1080F000200000000000200000000000200000031D -:1081000020002000200000000000000020000000EF -:10811000000000000000000000000000000040001F -:1081200020002000200000000000000020000000CF -:10813000000000000000000000000000000020001F +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 +:1080D000000000000000000000000000210000007F +:1080E0000000000000000000000000000000000090 +:1080F000000000000000000000000000200000035D +:108100000000000000000000000008000000000067 +:10811000000000000000000000000000000021003E +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000020809F :10814000000000000000000000000000000000002F -:1081500000000900000000000000000000002008EE +:1081500000000000000000000000000000002000FF :10816000000000000000000000000000000000000F -:1081700000000000410010000000000000000000AE -:10818000000000000000000200004000000000406D -:10819000000000002000400000004000000010002F -:1081A000000040000000000000004000000000400F -:1081B000000040000000000000004000000000003F -:1081C000A00000000000000000000000000000000F +:1081700040000000000000000000000000000000BF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00020000000000000000000000000000000AF +:1081B00000000000000000000000000000000000BF +:1081C00000040000000000000000000000000000AB :1081D000000000000000000000000000000000009F -:1081E000000000400000000000000200020000004B -:1081F000020000000000000000000000000000007D +:1081E000000000000000000000000000000000008F +:1081F000A008000090000000000000000000000047 :10820000200000000000000000000000000000004E -:1082100000000000880000000000000020000000B6 -:108220000000200800000000000000000000000026 -:1082300040000000000000000000000000000000FE -:108240000000000000000000050000000000000029 -:1082500020000000000800000000000000000000F6 -:10826000000000000000000000000000000000000E -:1082700040000000000800000000000000000000B6 -:108280000000800000000000090000000000000065 -:108290000000400000000008000000000000000096 -:1082A00000000000A0090000000000000000000025 -:1082B000000040000000050805000000000000105C -:1082C000000000000010000000000000000000009E -:1082D000000000000000000000000000000000009E -:1082E000000000000000000000000000000000008E -:1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:10831000000000000000000000000003000000005A -:10832000000000000000000000000000000000004D -:10833000000000000000000000000000000000003D -:10834000000000000000010000000000000000002C +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000800000008000000001E +:108250000000008400000000000000000008000092 +:1082600000080008000000080000000800000000EE +:108270000000008400000000008400000084000072 +:10828000000880080000000000080000000800004E +:1082900000000000001000000000000000000000CE +:1082A00000000008000800000008000000080000AE +:1082B0000084000000080000000000000008000822 +:1082C000000000080008002100210021000000003B +:1082D000000000000000002100210021000000003B +:1082E000000000000021002100210021000000000A +:1082F000000000000004000900410002000000002E +:108300000000000000030000000000000003000067 +:108310000003000000000008000000000000000052 +:1083200000000000000000000021002100210021C9 +:1083300000000000000000000008000800210021EB +:1083400000000021000000210000000000000000EB :10835000000000000000000000000000000000001D :10836000000000000000000000000000000000000D -:1083700000000000000000C000000000000000003D +:1083700000000000000000000000000000000000FD :1083800000000000000000000000000000000000ED :1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD -:1083B000000000000000000000002100000000009C -:1083C0000000000000000000100082008200820017 -:1083D0008200820082008200820082004000000051 -:1083E00082008200820090008200820082001000E1 -:1083F0008200000082000840820082008200820029 -:108400008200000082008200820800008200820058 -:108410000000820000008200820000008200400014 -:108420000000820008008211820000008240820069 -:1084300000098200000082008200000082008200A9 -:108440000000820000008200820010000000000096 -:1084500000000000000000004000000005000800CF -:108460000300000000000000000000000000000009 -:1084700000000000000000000090400040000000EC -:1084800000000000000000000000000100000000EB -:1084900000000000000000000000000000000500D7 -:1084A00000000000000000000000000000000000CC +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D0000000000000000000000000000000000598 +:1083E0000000000000000008000000000000000085 +:1083F0000000000000000000000000030003000572 +:108400000005000000000000000000000000000067 +:1084100000000000000000000000000000008400D8 +:1084200000000000000000000000000000008200CA +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:108450000000000000000000000000080000000014 +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A000000000000000000000000082000000004A :1084B00000000000000000000000000000000000BC -:1084C0000000400000000000000000000000080064 -:1084D000000008000000000000000800000000008C -:1084E0000800000400000000004100000000080037 -:1084F0000000080000000000000010000000000064 -:108500000000000400000000000500000000000062 -:1085100008000000080000000000000010009000AB -:10852000000000000004000000080000000000003F -:108530000800000008000000000088001000900003 -:10854000000000050004000000000005000000001D +:1084C0000000000800000000000000000084000020 +:1084D00000080000000000000000900000210000E3 +:1084E0000000000800000008000500000005000072 +:1084F000000000000000000000001000000000006C +:108500000000000000000021000000000021000029 +:108510000000000800030000000002080000000046 +:10852000000000000000000800080000000000003B +:10853000000000050000000000000800000000002E +:108540000000000000000000000800000000000023 :10855000000000000000000000000000000000001B :10856000000000000000000000000000000000000B -:1085700000000000000000000084000000C00000B7 -:108580000000210000840000000000000000000046 +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB :1085900000000000000000000000000000000000DB :1085A00000000000000000000000000000000000CB -:1085B0000000000000000084000000000000000037 +:1085B00000000000000000000000000000000000BB :1085C00000000000000000000000000000000000AB -:1085D0000000000008004000A00082000000000031 -:1085E000000000000000000000000000000000117A -:1085F0000800000008001000A000820088000000B1 -:10860000000000090000000000000000000000025F -:1086100008080000000008218200A00008000000F7 -:10862000000020000000000000000000000000002A -:1086300000000800000008000000A0008200000008 -:1086400000400000000000000000000000000021C9 -:1086500000000041000000000000000000000000D9 -:108660000000000000000000008400000000000086 -:1086700011000000000000000000000000000000E9 +:1085D0000000000300000000000000000000000098 +:1085E0000000000000000000000000000000000883 +:1085F0000008001100080000000500000000000055 +:10860000000800000000000000000011000000034E +:108610000008000000110000000000000000000041 +:10862000000000000000000000000000000000004A +:108630000000000000000000000000000000000832 +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000000000001A +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA :1086A00000000000000000000000000000000000CA -:1086B00000001100000000000000000000000000A9 +:1086B00000000000000000000000000000000000BA :1086C00000000000000000000000000000000000AA -:1086D00000000000000000010001000100C00001D6 -:1086E000040100C0018300000101004000100001EE -:1086F000400100C0000000010001000100C00001B5 -:10870000040100C0018300000101004000080001D5 -:10871000400100C00000000000010001000100C095 -:108720000001040100C001830000010100400004B9 -:108730000001400100C0000000010001000100C074 -:108740000001040100C00183000001010040000895 -:108750000001400100C0000000410041004100C094 -:108760000041804100A010C14011104100800080F4 -:108770000041804100C0000000410041004100C0B4 -:108780000041804100A010C14011104100800080D4 -:108790000041804100C00000000000410041004154 -:1087A00000C00041804100A010C140111041008074 -:1087B00000800041804100C00000004100410041B4 -:1087C00000C000418041008810C14011104100806C -:1087D00000800041804100C0000041000300000013 -:1087E00000804100830000000500020040000000FE -:1087F000C0004100C10000408000410003000000B3 -:10880000008041008300000005000200020000001B -:1088100091004100C10000408000000341000300BE -:1088200000000080410083000000050002000200FB -:10883000000082004100C1000040800041000300B0 -:10884000000000804100830000000500020040009D -:10885000000091004100C1000040800001000100C3 -:10886000000000C00100C0000000000021000882DC -:108870000040C1009100C1000040820001000100E1 -:10888000000000C00100C0000000000021000940FD -:108890000020C0009100C1000040820000000100E3 -:1088A0000100000000C00100C00000000000210025 -:1088B00009400082C1009100C10000408200010017 -:1088C0000100000000C00100C00000000000210005 -:1088D00082080082C0009100C1000040820000C0F8 -:1088E0000001C0C100000000000102C0822000039E -:1088F000000100C10000000000010000000000C0F5 -:108900000001C0C100000000000102C0822000037D -:10891000000100C100000000000100000000000094 -:1089200000C00001C0C100000000000102C08220A0 -:108930000003000100C10000000000010000000071 -:1089400000C00001C0C100000000000102C0822080 -:108950000003000100C10000000000010000000051 -:108960000080004180C100000000004180C1004043 -:1089700000C1004100C103000000004100400000B0 -:108980000080004180C100000000004180C1004023 -:1089900000C1004100C10000000000410040000093 -:1089A00000000080004180C100000000004180C143 -:1089B000004000C1004100C1000000000041004033 -:1089C00000000080004180C100000000004180C123 -:1089D000000300C1004100C1000000000041004050 -:1089E0000000C100800080C1000041408000820082 -:1089F0004100C1C1800080100000410000008000E3 -:108A00004100C100800080C1000041408000820020 -:108A10004100C1C100008010000041000000800042 -:108A200041000000C100800080C100004140800082 -:108A300082004100C1C180008010000041000000A0 -:108A400080004100C100800080C1000041408000E2 -:108A500082004100C1C18000801000004100000080 -:108A600080004100C1004000C0C100000100400082 -:108A700005000100C1058200C001000001000000E6 -:108A8000C0000100C1004000C0C100000100400062 -:108A900005000100C1059000C001000001000000B8 -:108AA000C00001000000C1004000C0C10000010082 -:108AB000400005000100C1050200C00100000100E6 -:108AC0000000C0000100C1004000C0C10000010062 -:108AD000400011000100C1050200C00100000100BA -:108AE0000000C00001000000000000000042000083 -:108AF000000000000000811200480700480000004C -:108B00000000000000000000000000000042000023 -:108B1000000000000000811200480700480000002B -:108B20000000000000000000000000000000004203 -:108B3000000000000000000081120048070048000B -:108B400000000000000000000000000000000042E3 -:108B500000000000000000008112004807004800EB +:1086D0000000000000000000000000000000010099 +:1086E0000000000000000000000000C000000000CA +:1086F0000000000000000000000000000000010079 +:108700000000000000000001000000C000000000A8 +:108710000000000000000000000000000000000059 +:108720000000000000000000000101000002000045 +:108730000000000000000000000000000000000039 +:108740000000000000000000000101000002000025 +:108750000000000000000000000000000000000019 +:108760004100000000000000000202000080000044 +:1087700000000000000000000000000000000000F9 +:10878000410000000000000000080400008000001C +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000808000000B9 +:1087B00000000000000000000000000000000000B9 +:1087C0000000000000000000000000080800000099 +:1087D0000000000000000000000000000300000096 +:1087E0000080000080000000000011001180008067 +:1087F00000008000000000000041000003000000B5 +:108800000080000080000000000002001180008055 +:108810000000800000000000004100000000100087 +:1088200000000000000000000000000003002080A5 +:108830000080000000000000000000110000100097 +:1088400000000000000000000000000003004000E5 +:10885000008000000000000000000009000001008E +:10886000000000C000002000000000000200108294 +:108870000010028808000000000000010000010054 +:10888000000000C00000200000000000080010826E +:108890000010108808000000000000010000000027 +:1088A00000000000000000000000000000000800C0 +:1088B000028200101088020000000000000000008A +:1088C00000000000000000000000000000000200A6 +:1088D00002C00010100002000000000000000000B4 +:1088E0000000C000000000000000000000000002C6 +:1088F0000000080000000000000000000000000070 +:108900000000C0000000000000000000000000089F +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:108930000010000000000000000000000000000027 +:108940000000000000000000000000000000000027 +:1089500000200000000000000000000000000000F7 +:108960000000000080000000000000000000000087 +:1089700000800000800009000000000000000000EE +:108980000000000080000000000000000000000067 +:10899000008000000000090000000000000000004E +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000000B7 +:1089C00000000000000000000000000000000000A7 +:1089D0000000000000000000000000000000000097 +:1089E00000000000800000C1000000000000000046 +:1089F000000000C180000011000000000000000025 +:108A000000000000800000C1000000000000000025 +:108A1000000000C18000000900000000000000000C +:108A2000000000000010800000C1000000000000F5 +:108A300000000000004100000008000000000000ED +:108A4000000000000010800000C1000000000000D5 +:108A500000000000004100000010000000000000C5 +:108A6000000000000000400000C100000000000005 +:108A70000000000000418200000000000000000033 +:108A8000000000000000400000C1000000000000E5 +:108A90000000000000038200000000000000000051 +:108AA0000000000000000000200000400000000066 +:108AB00000000000000000090200000000000000AB +:108AC0000000000000000000200000400000000046 +:108AD0000000000000000011020000010000000082 +:108AE0000000000000000000000000000042000044 +:108AF000000000004800810000E000004800000085 +:108B000000000000004200000000000000420000E1 +:108B1000000000004800810000E000004800000064 +:108B20000000000000420000000000000000000003 +:108B30000000000000000000810000E0000048008C +:108B40000000000000000000000000000000000025 +:108B50000000000000000000810000E0000048006C :108B60000000000000000000000000000000000005 :108B700000000000000000000000000000000000F5 :108B800000000000000000000000000000000000E5 @@ -178416,190 +178416,190 @@ :108C30000000000000000000000000000000000034 :108C40000000000000000000000000000000000024 :108C50000000000000000000000000000000000014 -:108C6000000000000000000000000000757B000014 +:108C6000000000000000000000000000747B000015 :108C700000000000000000000000000000000000F4 -:108C800000000000000000000000DEAE757B000068 +:108C800000000000000000000000DE2E747B0000E9 :108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000DEAE0000757B48 +:108CA00000000000000000000000DE2E0000747BC9 :108CB00000000000000000000000000000000000B4 -:108CC000000000000000000000000000DEAE757B28 +:108CC000000000000000000000000000DE2E747BA9 :108CD0000000000000000000000000000000000094 -:108CE000000000000000000000000000DEAE60C6D2 -:108CF00003000000000000000031E0000000000060 -:108D000000000C0000000000000000C0630660C608 -:108D100003000000000000000031E000000000003F -:108D200000000C0000000000000000C0630600000E -:108D300060C603000000000000000031E0000000F9 -:108D4000000000000C0000000000000000C06306EE -:108D500060C603000000000000000031E0000000D9 -:108D6000000000000C0000000000000000C06306CE -:108D700000000000880088000000000020000000C3 -:108D80002000000020000000008000800000208003 -:108D900000000000200020008800000020000000EB -:108DA00020000000200000000000000000002180E2 -:108DB00000010000000000002180000000002000F1 -:108DC00000802100000020000000000000000000E2 -:108DD00021800100000000002080890000002000A8 -:108DE0000080200000002000008000000000000043 -:108DF0002000000000000000000000000000000053 -:108E00000000000000000500000000040004000055 -:108E1000000400000000000000000000000000004E -:108E20000000000000000000050005000000000038 -:108E300040100000000000000002080200000000D6 -:108E4000000000104000000000000400000040008E -:108E50000000401008000000400000024000000038 -:108E6000000000020000000040000002400000007E -:108E700040000000000000000000000000000000B2 -:108E800000000000000000000000000010001000C2 +:108CE000000000000000000000000000DE2E6156C1 +:108CF00003400000000000000231E000000000001E +:108D000000000C4000000000000002C06A866156AE +:108D100003400000000000000231E00000000000FD +:108D200000000C4000000000000002C06A86000045 +:108D3000615603400000000000000230A000000067 +:108D4000000000000C4000000000000002C06A8625 +:108D5000615603400000000000000230A000000047 +:108D6000000000000C4000000000000002C06A8605 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF000000800000000000000000000000000006B +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000200000000000000000000000000 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000001000100000000000C2 :108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000000000C2 +:108EA00000000000000010000000000000000000B2 :108EB00000000000000000000000000000000000B2 -:108EC0000000000000000000000000110000000091 -:108ED0000000000000000000000000000040000052 -:108EE000000000000840000000000000000000003A -:108EF0000000000000000000000000000000000072 -:108F000000000000000000000000000000008000E1 -:108F100080000000000000000000000000000000D1 -:108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 -:108F500000000000000000C0000000000000000051 -:108F600000000000000000020000000000000000FF -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F900000000000200000000000000000000000B1 +:108EC0000000000000000000000000090000000099 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000200000000000009000077 +:108EF00000000000000000000000000000880000EA +:108F00000000000000000000000000080008000051 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000100008000029 +:108F300000000000000000000084000000000000AD +:108F40000000000000000000000000080000000811 +:108F5000000000000000000000000000020000000F +:108F600000080008000000000000000800000008E1 +:108F700000000000000000040000000000000000ED +:108F800000210000000000000000000000000000C0 +:108F900000050000000000000000000000000000CC :108FA00000000000000000000000000000000000C1 :108FB00000000000000000000000000000000000B1 -:108FC000000000210000000400000000000000007C -:108FD000000000030000000000000000000000008E -:108FE0000005000000000004000000000004000074 -:108FF000000000000000000000210000000003004D -:109000000300080000000000000000000000000055 -:1090100000000000000080000000000000000800C8 -:109020000800030000000300000000000000000032 -:109030000000000000000000000000000000000030 -:109040000800080008000000000000000000000008 -:109050000000000000000000000000000000000010 -:1090600000000800030000000000000000000000F5 -:1090700000000000000000000000410000000000AF +:108FC000000000000000000000000003000000009E +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000041000000000000000040 +:108FF0000000004100000000000000000000000030 +:1090000000C00000000000000000000000000000A0 +:1090100000000084000000000000000000000000CC +:109020000000000000000000000000000000000040 +:109030000000008400000084000000000000000028 +:109040000000000000080200000000000000000016 +:10905000000000000020000000A000000000000050 +:109060000000000021A0000000000000000000003F +:1090700000000000000800000008000000000000E0 :1090800000000000000000000000000000000000E0 -:109090000000000040800004400000000000A0002C -:1090A000000000000000000000400040000400003C +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 :1090B00000000000000000000000000000000000B0 :1090C00000000000000000000000000000000000A0 -:1090D0000000000000004040000000000000000010 -:1090E0000004000000030000000000000000000079 -:1090F0000000000000000000000040000000000030 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 :10910000000000000000000000000000000000005F -:10911000000000000000000400010000000000004A +:10911000000000000000000000000000000000004F :10912000000000000000000000000000000000003F -:10913000000000000000000000000000000000002F -:10914000000000000000000000A00000000000007F -:10915000200000000000000000820000200000004D -:10916000000000000000000000000000000000A05F -:10917000000000002000000000000000000000A02F +:1091300000000000000000000000008400000000AB +:10914000000000000000000000000000000000001F +:10915000000000000000000000000000000000000F +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF :1091800000000000000000000000000000000000DF :1091900000000000000000000000000000000000CF -:1091A000000000000041000000000000000000007E +:1091A00000000000000000000000000000000000BF :1091B00000000000000000000000000000000000AF -:1091C000000000000000000000000002000000009D -:1091D000000000000000000000000000000000008F -:1091E0000000000000000000000300000000000379 -:1091F0000000040000080000000000000000000063 -:10920000000000000000000008000000000008004E -:10921000000008000000080000000000000000003E -:10922000080000000000000000000000000008002E -:10923000000008000300080000000000000000001B -:109240000800000000000000000000000000000016 -:1092500008000008080000000800000000000000EE -:1092600000000800000000000000000009000000ED -:1092700008000020080000000800000000000000B6 -:1092800000000800000000000000000000000000D6 -:10929000000000000000000000000000000040008E -:1092A00000000000000000000000000000000000BE +:1091C0000000000000000000000000000008000097 +:1091D000000000000000000000000000040000008B +:1091E0000008000000000000000000000000000077 +:1091F000000000000000000000000000000000006F +:1092000000000000000000000000000000000084DA +:109210000000000000000000000800000000000046 +:10922000000000000000000000000000000000003E +:10923000000000000008000000080000000000001E +:10924000000000000000000000000000000000001E +:1092500000000000000000900090002000000000CE +:1092600000000000000000000000000000000000FE +:1092700000000000000000A0110800000000000035 +:1092800000000000000000000000000000000000DE +:1092900000000000000000000008000000000000C6 +:1092A00000000000000800000000000000000000B6 :1092B00000000000000000000000000000000000AE -:1092C0000000000000000000000020000005002158 -:1092D0000000000000050000000000000021000365 -:1092E0000000040020000000000000000005000055 -:1092F000000000030021000000000000000000004A -:10930000000000000021000000000000000000003C +:1092C000000000000000002100000003000000007A +:1092D000000000000000000000000000000000008E +:1092E000000000000000C0000000000000000000BE +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D :10931000000000000000000000000000000000004D :10932000000000000000000000000000000000003D -:109330000200000000000000000000000000000427 -:1093400000002000000800000000000020002000B5 -:1093500000040004210000000000000020000004C0 -:1093600000400000000020000000000000002182FA -:1093700020000000000020A00020000800000000E5 -:1093800000000000000000A000000000000000003D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D +:1093600000000000000000000000000000000000FD +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD :1093900000000000000000000000000000000000CD -:1093A000000000009000000000000000000000002D +:1093A00000000000000000000000000000000000BD :1093B00000000000000000000000000000000000AD -:1093C00000000100100000000000010001009000FA -:1093D000000000000000000000000000000100008C -:1093E0000000000001000200000000000000040076 -:1093F000000000000001100100000000010010004A +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D :10940000000000000000000000000000000000005C :10941000000000000000000000000000000000004C -:1094200000000000000080000000000000000000BC +:10942000000000000000000000000000000000003C :10943000000000000000000000000000000000002C -:109440000000000004000000000000000400040010 -:1094500000000000000000000000000000090004FF -:1094600000200002000008000000000000002000B2 -:109470008000000000112008000400020000040029 +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC :1094800000000000000000000000000000000000DC :1094900000000000000000000000000000000000CC -:1094A000000000000040000000410000000000003B +:1094A00000000000000000000000000000000000BC :1094B00000000000000000000000000000000000AC -:1094C000000000000000000080008000000080001C -:1094D000000080008000000000000000800000000C -:1094E000000000000000000080000000800000007C -:1094F0000008000000000000000000000000000064 +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000000000008C +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C :10950000000000000000000000000000000000005B :10951000000000000000000000000000000000004B -:109520000000000000000001000000010000000039 +:10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B -:109540000000000000009000020084000884000079 -:109550000800900040000800900002008800080009 -:1095600000000000000000002000100010000800B3 -:109570000000000100880000000000000000000062 +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB :1095800000000000000000000000000000000000DB :1095900000000000000000000000000000000000CB -:1095A00000000000000000000000A000000000001B +:1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB -:1095C000000000000000000000000000000100009A +:1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B -:1095E0000100000000000100000000000001000177 -:1095F0000000000000000800000000000001100151 -:109600000000000000000001000000000000000059 +:1095E000000000000000000000000000000000007B +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A -:109630001100000000000000000000000000000019 -:1096400000000000000000000000000200210010E7 -:10965000000900000009001000410009000000009E -:1096600000000400000010001000000000110020A5 -:10967000000800090041000880200009004108049A -:1096800090100002002000020010000900000000FD +:10963000000000000000000000000000000000002A +:10964000000000000000000000000000000000001A +:10965000000000000000000000000000000000000A +:1096600000000000000000000000000000000000FA +:1096700000000000000000000000000000000000EA +:1096800000000000000000000000000000000000DA :1096900000000000000000000000000000000000CA :1096A00000000000000000000000000000000000BA -:1096B0000000001100000000000000000000000099 -:1096C0000000000000000000000000000008008012 -:1096D0000000000000000008008000000000000002 -:1096E00000800000000000000000000000000008F2 -:1096F00000000080000080000000000080000000EA +:1096B00000000000000000000000000000000000AA +:1096C000000000000000000000000000000000009A +:1096D000000000000000000000000000000000008A +:1096E000000000000000000000000000000000007A +:1096F000000000000000000000000000000000006A :109700000000000000000000000000000000000059 :109710000000000000000000000000000000000049 :109720000000000000000000000000000000000039 -:109730000000000000010000000000000000000028 -:109740000000000000000000000000000000000118 -:1097500000C000020000000000010010000800002E -:1097600000000082008800000000000000000000EF -:109770000001008400400000400002008400080056 +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:109750000000000000000000000000000000000009 +:1097600000000000000000000000000000000000F9 +:1097700000000000000000000000000000000000E9 :1097800000000000000000000000000000000000D9 :1097900000000000000000000000000000000000C9 :1097A00000000000000000000000000000000000B9 -:1097B000000002E000000082000000000000000045 +:1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 -:1097D0000000000000004100000000000000000048 +:1097D0000000000000000000000000000000000089 :1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 @@ -178609,7 +178609,7 @@ :109840000000000000000000000000000000000018 :109850000000000000000000000000000000000008 :1098600000000000000000000000000000000000F8 -:109870000000000000000000000000007D41030324 +:1098700000000000000000000000000000000000E8 :1098800000000000000000000000000000000000D8 :1098900000000000000000000000000000000000C8 :1098A00000000000000000000000000000000000B8 @@ -178617,253 +178617,253 @@ :1098C0000000000000000000000000000000000098 :1098D0000000000000000000000000000000000088 :1098E0000000000000000000000000000000000078 -:1098F00000000000000000000000000000007D41AA -:109900003F3F0000000000000000000000000000D9 +:1098F0000000000000000000000000000000000068 +:109900000000000000000000000000000000000057 :109910000000000000000000000000000000000047 :109920000000000000000000000000000000000037 :109930000000000000000000000000000000000027 :109940000000000000000000000000000000000017 -:10995000000000000000000000000303A0AF0000B2 -:10996000000000008282C0FC0000000003F30A0A2D -:1099700000000000000000000000000003F30A0ADD +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 :1099800000000000000000000000000000000000D7 :1099900000000000000000000000000000000000C7 :1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 -:1099D000000000000000000000000000F3F3A0AF52 -:1099E000000000000000BEBEC0FC0000000003F349 -:1099F000FAFA00000000000000000000000003F37D -:109A0000FAFA000000000000000000000000000062 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000000000000056 :109A10000000000000000000000000000000000046 :109A20000000000000000000000000000000000036 -:109A30000000000000000000000000640006000EAE -:109A400020000000000000000000000000000000F6 -:109A50000000000000000000000000610006000D92 -:109A60000000000000610006000D00000000000082 -:109A70000000000000610006000D0000006100060B -:109A8000000D000000610006000D000000610006EE -:109A9000000D000000610006000D00000000000045 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 :109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 -:109AC000AAAA000000000000000000000000000042 +:109AC0000000000000000000000000000000000096 :109AD0000000000000000000000000000000000086 -:109AE00003037D41000000000000C30017170000C1 +:109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 -:109B00000000CF0C414100000000D7140303000007 -:109B10000000CF0C4141000000000F00C5C500004F +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 :109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 -:109B40000000AAAA000000000000000000000000C1 +:109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 -:109B600000003F3F7D41000000000000FF3C171750 +:109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 -:109B800000000000CF0C7D7D00000000D7143F3F97 -:109B900000000000CF0C7D7D00000000FFF0C5C577 +:109B800000000000000000000000000000000000D5 +:109B900000000000000000000000000000000000C5 :109BA00000000000000000000000000000000000B5 :109BB00000000000000000000000000000000000A5 -:109BC00000000000AAAA0000000000000000000041 +:109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 -:109BF0000000000000000000000030F328280000F2 +:109BF0000000000000000000000000000000000065 :109C00000000000000000000000000000000000054 -:109C10000000E8E800C300000000000000000000B1 +:109C10000000000000000000000000000000000044 :109C20000000000000000000000000000000000034 :109C30000000000000000000000000000000000024 -:109C4000000000000000AAAA0000000000000000C0 +:109C40000000000000000000000000000000000014 :109C50000000000000000000000000000000000004 :109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000030F3EBEBEB +:109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 -:109C900000000000E8E83CFF0000000000000000B9 +:109C900000000000000000000000000000000000C4 :109CA00000000000000000000000000000000000B4 -:109CB000000000000000000000000000000088001C -:109CC0000000200000000000000020000000000054 -:109CD00000000000000000008200000000002000E2 -:109CE00000002000410000000000210000000000F2 -:109CF0000000010000800100000000000080010061 -:109D0000040040002080210000000000210001002C -:109D100000000000008001000000A000048000009E -:109D20002000200020802100000000802080000012 -:109D3000040000000000000000000000000000001F -:109D4000000004000000000000000400000000000B +:109CB0000000000000000000000020000000000084 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000020000000000064 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000002000000044 +:109D00000000000000000002000000000000000051 +:109D10000000000000000000000000002000000023 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D400000000000000000000000030000004000D0 :109D50000000000000000000000000000000000003 -:109D6000000000000000400000000400400000006F -:109D7000000000000400000240000000000010028B -:109D8000400000000000000240000000040040000D -:109D900040000000000000024000000000004002FF -:109DA0000000000000000002080000000410001085 +:109D600000000002000000000000000000000000F1 +:109D700000000000000200000000000000000000E1 +:109D800000000000000000000000000000000000D3 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 :109DB00000000000000000000000000000000000A3 -:109DC0009000000000000000000000000000000003 +:109DC0000000000082000000000000000000000011 :109DD0000000000000000000000000000000000083 -:109DE00000000000000000000000000000008200F1 -:109DF0000000000000000000000000000200000061 -:109E000008000000000000402000000000000000EA +:109DE000820082009000820000000000000000005D +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 :109E20000000000000000000000000000000000032 -:109E300000000000000000000000004000000000E2 -:109E400000000010000000000000000800000000FA -:109E500000000000000000000000000000000300FF -:109E600000000000000000000000000800000000EA -:109E700000000000000000000000000800000000DA -:109E800000000000000000000000000000080000CA -:109E900000000000000000000000000800000000BA -:109EA000000000000000200000000000000800008A +:109E30001000000000000000000000000000000012 +:109E400000000000000000C0000000000000000052 +:109E500000100000000000000000000000000000F2 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000020000000000000000000000D0 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 :109EB00000000000000000000000000000000000A2 -:109EC0000000000000008200000008000000000008 +:109EC0000000000000000000000000000000000092 :109ED0000000000000000000000000000000000082 -:109EE0000000000000000800000008000000000062 +:109EE000000000000400000000000000000000006E :109EF0000000000000000000000000000000000062 -:109F00000000000000000000080000000821000020 -:109F10000000000000000000000000000041000000 -:109F200000004040000000000800000008000000A1 -:109F300000410000000000000000000000000000E0 +:109F000000000000000004000400000090000000B9 +:109F10000000000000000000000000000000000041 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 :109F40000000000000000000000000000000000011 :109F50000000000000000000000000000000000001 :109F600000000000000000000000000000000000F1 -:109F700000000000000000000000000200000000DF -:109F800000000002090000004190000000000000F5 -:109F90000000410203000000000005020000000074 -:109FA000410000000000000000000002000200006C -:109FB000000000020000000000000400000000009B +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 :109FC0000000000000000000000000000000000091 :109FD0000000000000000000000000000000000081 -:109FE000000000000004000000000000000000006D -:109FF0000100000000000000000000000000000060 -:10A00000000000000000040000000000000000004C -:10A01000000000000000900000000400000090001C -:10A02000000000000000000000000400000000002C +:109FE000000000000000000000000000000400006D +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 +:10A010000000000000000000000000000000000040 +:10A020000000000000000000000000000000000030 :10A030000000000000000000000000000000000020 :10A040000000000000000000000000000000000010 :10A050000000000000000000000000000000000000 -:10A0600000000000000020000000000000000000D0 -:10A0700000000400000000000000000000000000DC -:10A080000000000000000000800000000000000050 -:10A0900000000000000009900000000080000000A7 -:10A0A00000000000009000000000000080000000A0 +:10A0600000000000000000000000000000000000F0 +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000000D0 +:10A0900000000000000000000000000000000000C0 +:10A0A00000000000000000000000000000000000B0 :10A0B00000000000000000000000000000000000A0 :10A0C0000000000000000000000000000000000090 :10A0D0000000000000000000000000000000000080 :10A0E0000000000000000000000000000000000070 -:10A0F000A0000000000000800000008000000100BF -:10A1000000800000002100004000080000800400E2 -:10A110000100A00000000005008004000080000095 -:10A1200040000080000900000100008000001000D5 -:10A130000100040004000000C00000000000000056 +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F +:10A11000000000000000000000000000000000003F +:10A12000000000000000000000000000000000002F +:10A13000000000000000000000000000000000001F :10A14000000000000000000000000000000000000F -:10A15000000000000000000000000000008400007B +:10A1500000000000000000000000000000000000FF :10A1600000000000000000000000000000000000EF -:10A17000000000000000000010200000102000007F -:10A1800004001020000000000000000000881020E3 -:10A190008000040000000000000000208004002077 -:10A1A000000000400020000000000400002010001B -:10A1B000000004008000800000000000000000009B +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A19000000040000400000000000000000000007B +:10A1A00000000000000000000000000000000000AF +:10A1B0000000000000080000000000000000000097 :10A1C000000000000000000000000000000000008F :10A1D000000000000000000000000000000000007F -:10A1E0000000000000000008000000002000000047 +:10A1E000000000000000000000000000000000006F :10A1F000000000000000000000000000000000005F -:10A2000000000041000000000021000000001005D7 -:10A2100000000041000000050021000000000009CE -:10A2200000001011008000000041A00000000000AC -:10A2300000000000000010001041000000000000BD +:10A20000000000000000000000000000000000004E +:10A21000000000000000000000000000000000003E +:10A22000000000000000000000000000000000002E +:10A23000000000000000000000000000000000001E :10A24000000000000000000000000000000000000E :10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000110000000200DB +:10A2600000000000000000000000000000000000EE :10A2700000000000000000000000000000000000DE :10A2800000000000000000000000000000000000CE -:10A2900008000000000000000000000000000000B6 -:10A2A000000000002004002000000000000000006A +:10A2900000000000000000000000000000000000BE +:10A2A00000000000000000000000000000000000AE :10A2B000000000000000000000000000000000009E :10A2C000000000000000000000000000000000008E :10A2D000000000000000000000000000000000007E :10A2E000000000000000000000000000000000006E -:10A2F00000000000000000000000000000C001900D -:10A3000020000001000300C00190A000000000C078 -:10A310000190C000000000C101912001000001C0B7 -:10A3200000904001000000C101908801000000C1C0 -:10A330000190A000000100C001904000000040001A -:10A3400000000000100000000000000000000000FD +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000000000002D +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D :10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED -:10A370000000000000000000000000000000008954 -:10A380002091001000080000008003800000000001 -:10A39000008911900008000900C020830008000215 -:10A3A000028911908010000900C00383000200049C -:10A3B00000C0038200100020408040808000000028 -:10A3C000800000000000000000000000000000000D +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A3900000000000000000000000000000000000BD +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000008D :10A3D000000000000000000000000000000000007D :10A3E000000000000000000000000000000000006D :10A3F000000000000000000000000000000000005D -:10A40000000080000000808000000000800000004C -:10A41000808000008000000080800000800000003C -:10A42000808000008000000080800000800000002C -:10A43000808000008000000080800000800000001C -:10A440008080000000048082800000000000000086 +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C :10A4500000000000000000000000000000000000FC :10A4600000000000000000000000000000000000EC :10A4700000000000000000000000000000000000DC -:10A480000000000082000000C09000000000820078 -:10A490000000C090000082000000C0900000820018 -:10A4A0000000C090000082000000C0900000820008 -:10A4B0000000C090000082000000C09000008200F8 -:10A4C0000000C0909000C0000211040000000000D5 +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000000000000000000000000009C +:10A4C000000000000000000000000000000000008C :10A4D000000000000000000000000000000000007C :10A4E000000000000000000000000000000000006C :10A4F000000000000000000000000000000000005C -:10A500000000000000000101019100C000000000F7 -:10A510000001009000C000000100009000C0000099 -:10A520000001009100C000000101029000C0000184 -:10A530000001009100C000000100009000C0000078 -:10A540000001009100C000C00004000400020000EF +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B +:10A53000000000000000000000000000000000001B +:10A54000000000000000000000000000000000000B :10A5500000000000000000000000000000000000FB :10A5600000000000000000000000000000000000EB :10A5700000000000000000000000000000000000DB -:10A580000000000000000009400810910089000050 -:10A5900000040008008800820009402041900089E2 -:10A5A0000004110808910082000904104183008909 -:10A5B00000400810108400840010100241880089B7 -:10A5C0000005001000C00084000000000080008032 +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000000009B +:10A5C000000000000000000000000000000000008B :10A5D000000000000000000000000000000000007B :10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B -:10A600000000000000000000804000210000000069 -:10A610000000801180410000000080118041000096 -:10A6200000008011804100000000801180200000A7 -:10A630000000801180200000000080118040000098 -:10A640000000801180400000000000000000800039 +:10A60000000000000000000000000000000000004A +:10A61000000000000000000000000000000000003A +:10A62000000000000000000000000000000000002A +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000000000000000000A :10A6500000000000000000000000000000000000FA :10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA -:10A680000000000000000000000090010000000039 -:10A6900000000000C001200100000000C0012001F6 -:10A6A00000000000C001200100000000C0012001E6 -:10A6B00000000000C001200100000000C0012000D7 -:10A6C00000000000C001200000000000C0000404E1 -:10A6D00002884000000000000000000000000000B0 +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000000AA +:10A6B000000000000000000000000000000000009A +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000000000000000000007A :10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000006000043 -:10A71000060000000000000A000006004200000AD7 -:10A720000000060042000006000006004200002172 -:10A730000000060000000082000006000000008209 -:10A74000000006000000008200000600000000007B +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 :10A7500000000000000000000000000000000000F9 :10A7600000000000000000000000000000000000E9 :10A7700000000000000000000000000000000000D9 -:10A780000000000000000000000000000000FFFFCB -:10A790000000FF0000000000FF000000FF000000BC -:10A7A000FF000000FF000000FF000000FF000000AD -:10A7B000FF000000FF000000FF000000FF0000009D -:10A7C000FF000000FF000000FF000000FF0000008D -:10A7D0000F9900C380B083B30000000000000000A8 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 :10A7E0000000000000000000000000000000000069 :10A7F0000000000000000000000000000000000059 :10A800000000000000000000000000000000000048 -:10A81000FFFF0000FF0000000000FF000000FF003D -:10A820000000FF000000FF000000FF000000FF002C -:10A830000000FF000000FF000000FF000000FF001C -:10A840000000FF000000FF000000FF000000FF000C -:10A8500000000F99FFC38CBC8FBF000000000000F8 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 :10A8600000000000000000000000000000000000E8 :10A8700000000000000000000000000000000000D8 :10A8800000000000000000000000000000000000C8 @@ -178875,292 +178875,292 @@ :10A8E0000000000000000000000000000000000068 :10A8F0000000000000000000000000000000000058 :10A900000000000000000000000000000000000047 -:10A9100000000000000000FF00000F0F000000001A -:10A9200000FF00000F0F000000FF00000F0F0000ED -:10A9300000FF00000F0F000000FF00000F0F0000DD -:10A9400000FF00000F0F000000FF00000F0F0000CD -:10A9500000FFFFFFF0F000000000D646D0400000EE +:10A910000000000000000000000000000000000037 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 :10A9600000000000000000000000000000000000E7 :10A9700000000000000000000000000000000000D7 :10A9800000000000000000000000000000000000C7 -:10A99000000000000000000000FF00000F0F00009A -:10A9A000000000FF00000F0F000000FF00000F0F6D -:10A9B000000000FF00000F0F000000FF00000F0F5D -:10A9C000000000FF00000F0F000000FF00000F0F4D -:10A9D000000000FFFFFFF0F000000000DF4FD9494A +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000000000077 :10A9E0000000000000000000000000000000000067 :10A9F0000000000000000000000000000000000057 :10AA00000000000000000000000000000000000046 -:10AA100000000000000000000363033E0C0D92C024 -:10AA2000000003E3033E0C0D92C003E3033E0C0D54 -:10AA300092C003E3033E0C0D92C003E3033E0C0DF2 -:10AA400092C003E3033E0C0D92C003E3033E0C0DE2 -:10AA500092C003E3033E0C0D82C000000000000022 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 :10AA600000000000000000000000000000000000E6 :10AA700000000000000000000000000000000000D6 :10AA800000000000000000000000000000000000C6 -:10AA90000000000000000000000000000000C300F3 -:10AAA000171700000000000014143F03000000000E -:10AAB0001414CF0C00000000C300171700000000A2 -:10AAC000D7140C0C000000003C004D4D00000000AD -:10AAD0005050F3030000000055000FC300000000B9 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 :10AAE0000000000000000000000000000000000066 :10AAF0000000000000000000000000000000000056 :10AB00000000000000000000000000000000000045 :10AB10000000000000000000000000000000000035 -:10AB2000FF3C1717000000000000D7D73F030000CC -:10AB30000000D7D7CF0C00000000FF3C1717000023 -:10AB40000000D714CFCF00000000FFC34D4D000020 -:10AB500000005F5FF3030000000055FF0FC300001B +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 :10AB600000000000000000000000000000000000E5 :10AB700000000000000000000000000000000000D5 :10AB800000000000000000000000000000000000C5 -:10AB9000000000000000000000000000000000AA0B -:10ABA000F0C30000000000000000000000000000F2 -:10ABB000B2B2003C0000000020A261E300000000EF -:10ABC000B2B2003C00000000E8E800C30000000052 -:10ABD000AAF0C30000000000000000000000000018 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 :10ABE0000000000000000000000000000000000065 :10ABF0000000000000000000000000000000000055 :10AC00000000000000000000000000000000000044 :10AC10000000000000000000000000000000000034 -:10AC2000FFAAF0C3000000000000000000000000C8 -:10AC30000000B2B2C3FF0000000034B675F7000098 -:10AC40000000B2B2C3FF00000000E8E83CFF0000D3 -:10AC50000000AAF0C3FF0000000000000000000098 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 :10AC600000000000000000000000000000000000E4 :10AC700000000000000000000000000000000000D4 :10AC800000000000000000000000000000000000C4 -:10AC900000000000000000001000000000000000A4 +:10AC90000000000000000000400000000000000074 :10ACA00000000000000000000000000000000000A4 :10ACB0000000000000000000000020000000000074 -:10ACC0000100000000000000000000000000000083 -:10ACD0000000408000004000000020000000000054 +:10ACC0000000000000110000000000000000000073 +:10ACD0000000C00000004000000020000000000054 :10ACE0000000000000000000000000000000000064 :10ACF0000000000000000000000000000000000054 :10AD00000000000000000000000000000000000043 -:10AD10000002000000000000000000000000000031 +:10AD10000000000000000000000200000000000031 :10AD20000000000000000000000000000000000023 -:10AD30000000000000000000100000020000000001 -:10AD400000000402000000000000000000000000FD -:10AD50000000400000024000000040000000000031 -:10AD600000000000000000000000000000000200E1 -:10AD700002000000000000000000000000000000D1 -:10AD80000000000000000000820000000000000041 -:10AD900000000000000000000000000000000000B3 -:10ADA000000000000000020002000000020000009D -:10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000800000000000000080073 -:10ADD0000000000000000200000000000000000071 -:10ADE000000000000000000002000200000000005F -:10ADF0000008000000000000000800000000000043 +:10AD30000000000200000000000000000000000011 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000020000000000000000000000D1 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000800000000000000AB +:10ADA00000000000000000000000000000000003A0 +:10ADB000000000000800200000000000000000006B +:10ADC0000000000000000000000000000000000083 +:10ADD000000000000000080000000000000000006B +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 :10AE00000000000000000000000000000000000042 -:10AE10000008000000000000000800000000000022 +:10AE100000000000000000000000800000000000B2 :10AE20000000000000000000000000000000000022 -:10AE30000000000200000000000000080000000008 +:10AE30000000000000000000800000000000000092 :10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000004000000000B2 -:10AE600000000000000000000000000000000000E2 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000004000000000000000000DE :10AE700000000000000000000000000000000000D2 :10AE800000000000000000000000000000000000C2 :10AE900000000000000000000000000000000000B2 :10AEA00000000000000000000000000000000000A2 -:10AEB00000000000000000000000C0000000008052 -:10AEC00000200400000000800000040000000000DA -:10AED0000000002000000080A02000200000008072 -:10AEE0008480040000000020040000200000008096 -:10AEF00000800000000000000000000000000000D2 +:10AEB0000000000000000002000000200000000070 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 :10AF00000000000000000000000000000000000041 :10AF10000000000000000000000000000000000031 -:10AF2000000000000000000005000000000000001C -:10AF3000000000000000000005820000000000008A -:10AF400000200501800000840020008280000000B5 -:10AF50001100000000010084002000010001000039 -:10AF6000002000208000008200838000000100009B -:10AF70000020002000000000000000000000000091 +:10AF20000000000000000000000000000000000021 +:10AF3000000000000000000000010000000100000F +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 :10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA0000000000000040004000000000000000099 -:10AFB0000000000000000000000000000000000091 +:10AF900000000000000000000000100000000000A1 +:10AFA000000000000000000000008200000000001F +:10AFB000000000000000000000800000000400808D :10AFC0000000000000000000000000000000000081 -:10AFD0000100000000000000000000000000000070 +:10AFD0000000000000000000000000000000000071 :10AFE0000000000000000000000000000000000061 :10AFF0000000000000000000000000000000000051 :10B000000000000000000000000000000000000040 :10B010000000000000000000000000000000000030 -:10B02000000000000000110000000000000000000F -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B05000000004000000000000000000009000005C +:10B020000000000000000000000000000000000020 +:10B03000000000000000000000000002000000010D +:10B0400000040500000000000000000000000000F7 +:10B0500000000000000000000000000000000000F0 :10B0600000000000000000000000000000000000E0 :10B0700000000000000000000000000000000000D0 :10B0800000000000000000000000000000000000C0 :10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000900000000000000000000000000000 -:10B0C000000000000020000000000000010000005F -:10B0D00000000000000000200000000000800000D0 -:10B0E000000000000000000000000000010000005F -:10B0F0000000000000200000000000200000000010 +:10B0A000000000002000000000000000000000116F +:10B0B000002190000000000084000000000000005B +:10B0C000000000000000000000110000000000006F +:10B0D000000000000000000000110000000000005F +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 :10B10000000000000000000000000000000000003F :10B11000000000000000000000000000000000002F :10B12000000000000000000000000000000000001F -:10B13000000000000084090000A0000000000000E2 -:10B1400000000010000000010500000000A0040045 -:10B15000000000A000A00500090100000000092077 -:10B160000000000200A005000000008400000400B0 -:10B170000000000200000001000000002185000026 +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B15000000000000090000000000000000000005F +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF :10B1800000000000000000000000000000000000BF :10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000200000000000000000000000000007D -:10B1D000000000410000000000200000040000000A -:10B1E00000004000000000000020A000000000005F -:10B1F0000000A000000802000000A0000000000005 +:10B1A000000010000000000000000000000000008F +:10B1B000002100000100000000000000000000006D +:10B1C000018000000000018000000000000000007D +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F :10B20000000000000000000000000000000000003E :10B21000000000000000000000000000000000002E -:10B220000000000000000000000011000004000009 -:10B2300002000000400000000000000000000000CC -:10B2400000000000000000000000000000000000FE -:10B25000000000000000000000000001000080006D -:10B2600000000000000000001100000100000000CC +:10B22000000000000000000000000000000000001E +:10B2300041000000000008000000000000000000C5 +:10B2400000000802000000002004000000000000D0 +:10B25000000000000000000000820000000000006C +:10B2600000000000000000000000000000000000DE :10B2700000000000000000000000000000000000CE :10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C00000000002000000000000000000C000902C -:10B2D0000000000000C000900000000000C00090CE -:10B2E0000000000000C00190C000000000C00090FD -:10B2F0000000000000C000900000000000C00090AE +:10B2A0000000000000000000000001A000080010E5 +:10B2B0000088000000000000000000000000000006 +:10B2C0000000000000009101C0010000000000002B +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E :10B30000000000000000000000000000000000003D :10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B34000000000000000000000000000000000807D -:10B3500000800000000000800080000000000080ED -:10B3600000800000000000800480000000000080D9 -:10B3700000800000000000800080000000000080CD -:10B38000008000000000000000000000000000003D +:10B32000000000000000000000000000118000800C +:10B330000500000000000000000000000000000008 +:10B3400000000000000000009003831100000000D6 +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD :10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000008000808000000000800080806D -:10B3E000000000008000808000000000800080805D -:10B3F000000000008000808000000000800080804D -:10B4000000000000800080800000000000000000BC +:10B3A000000000000000000000000000000000108D +:10B3B000002100C1000000000000000000000000AB +:10B3C00000000000000000002080088311110883A5 +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C :10B41000000000000000000000000000000000002C :10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B450000000000000008400C09000000000840094 -:10B46000C090000000008400C09000000000840034 -:10B47000C090000000008400C09000000000840024 -:10B48000C090000000008400C09000000000000098 +:10B430000000000000910000900088000000000063 +:10B440000000000000000000000000400041012159 +:10B4500000030000000000000000000000000000E9 +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC :10B4900000000000000000000000000000000000AC :10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C +:10B4B0000000C0001000000090000000000000002C :10B4C000000000000000000000000000000000007C -:10B4D0000000000000000000009000C0000000001C -:10B4E000009000C000000000009000C000000000BC -:10B4F000009100C100000000009000C000000000AA -:10B50000009000C000000000009000C0000000009B +:10B4D00085000101000000000000000000000000E5 +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B :10B51000000000000000000000000000000000002B :10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000008000800000EB -:10B5600000000080008000000000008000800004D7 -:10B5700000020090008400000000008000800000B5 -:10B5800000000080008000000000008000800000BB +:10B5300000000000800000000000900000000000FB +:10B5400000000000000000000000000000000008F3 +:10B55000081085081108000000000000000000002D +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB :10B5900000000000000000000000000000000000AB :10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B +:10B5B00000000000000080108011000080000000EA :10B5C000000000000000000000000000000000007B -:10B5D00000000000000000008000000900000000E2 -:10B5E00080118004000000008004002100000000A1 -:10B5F0008011800200000000801180050000000022 -:10B60000801180050000000080118005000000000E +:10B5D00000800040110091110000000000000000F8 +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A :10B61000000000000000000000000000000000002A :10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B65000000000000000000000009000000000005A -:10B660000000C001200000000000C0010000000038 -:10B670008800C001200100000000C001200000007F -:10B680000000C001200000000000C00120000000F8 +:10B630000000000000000000100020018800100041 +:10B6400000000088008800000000000000000000EA +:10B65000000020C0900021009100000000000000C8 +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA :10B6900000000000000000000000000000000000AA :10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000A000060 -:10B6E000060000000082000006000000008200004A -:10B6F000060000000082000006000000008200003A -:10B700000600000000820000060000000082000029 -:10B710000600000000000000000000000000000023 +:10B6B00000000000000000000000410000C8000081 +:10B6C0008182000000000000000000000000000077 +:10B6D00000000000418200C843004121000000003A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 :10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 +:10B7300000000000000000000000000024000024C1 :10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B76000FFFF000000FF000000FF000000FF0000DE -:10B770003C3C000000FF000000FF000000FF000054 -:10B7800000FF000000FF000000FF000000FF0000BD -:10B7900000FF000000FF00000000000000000000AB +:10B750000000000000002F28E9EB000000000000BE +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 :10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000FFFF000000FF000000FF000000FF5E -:10B7F00000003C3C000000FF000000FF000000FFD4 -:10B80000000000FF000000FF000000FF000000FF3C -:10B81000000000FF000000FF00000000000000002A +:10B7B0000000000000000000000000000000810008 +:10B7C00000810000000000000000000000000000F8 +:10B7D00000000000000000000D8082B600000000A4 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 :10B820000000000000000000000000000000000018 :10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 +:10B8400006000000000000000000000004040404E2 :10B8500000000000000000000000000000000000E8 -:10B860000000FF000000FF000000FF000000FF00DC -:10B870000000FF000000FF000000FF000000FF00CC -:10B880000000FF000000FF000000FF000000FF00BC -:10B890000000FF000000FF000000000000000000AA +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 :10B8A0000000000000000000000000000000000098 :10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 +:10B8C00000009000000000000000000000000000E8 :10B8D0000000000000000000000000000000000068 -:10B8E00000000000FF000000FF000000FF0000005B -:10B8F000FF000000FF000000FF000000FF0000004C -:10B90000FF000000FF000000FF000000FF0000003B -:10B91000FF000000FF000000FF000000000000002A +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 :10B920000000000000000000000000000000000017 :10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B96000000000000000030203380C0092C00382B4 -:10B9700003380C0092C0038203380C0092C003E32A -:10B98000033E0C0D92C0038203380C0092C0038268 -:10B9900003380C0092C0038203380C0092C00000F0 +:10B940000000000000610007C00D000000000000C2 +:10B950000000000000000000000000000000006186 +:10B960000A3FC50100A00000000000000000000028 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 :10B9A0000000000000000000000000000000000097 :10B9B0000000000000000000000000000000000087 :10B9C0000000000000000000000000000000000077 :10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 +:10B9E00044444444000100C1000000000000000085 :10B9F0000000000000000000000000000000000047 -:10BA0000000000004D4D3C00000000000000000060 +:10BA00000000000000000000000000000000000036 :10BA10000000000000000000000000000000000026 :10BA20000000000000000000000000000000000016 :10BA30000000000000000000000000000000000006 :10BA400000000000000000000000000000000000F6 :10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 +:10BA6000000088888888000200C2000000000000F2 :10BA700000000000000000000000000000000000C6 -:10BA80000000000000004D4DFFC30000000000005A +:10BA800000000000000000000000000000000000B6 :10BA900000000000000000000000000000000000A6 :10BAA0000000000000000000000000000000000096 :10BAB0000000000000000000000000000000000086 :10BAC0000000000000000000000000000000000076 :10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 +:10BAE000000000000F0F0F0F00000D080000000005 :10BAF0000000000000000000000000000000000046 :10BB00000000000000000000000000000000000035 :10BB10000000000000000000000000000000000025 @@ -179168,196 +179168,196 @@ :10BB30000000000000000000000000000000000005 :10BB400000000000000000000000000000000000F5 :10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 +:10BB60000000000000000F5A0F5A0000080D0000EE :10BB700000000000000000000000000000000000C5 :10BB800000000000000000000000000000000000B5 :10BB900000000000000000000000000000000000A5 :10BBA0000000000000000000000000000000000095 :10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD00001000000010000000100008000000000E2 -:10BBE0000000010001000001000000000000000052 -:10BBF0000000000000000000010000000400000040 -:10BC00000000000000000000010000000100010031 -:10BC10000000000000000000000000200000000004 -:10BC20000000000000088800000000000000000084 -:10BC30000000000000000000000000000000000004 +:10BBC0000000000020000000000000000000000055 +:10BBD0000000000000000000200000000000000045 +:10BBE0000000100020000000000000000000000025 +:10BBF0000000000000001000000000000000000035 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000002000000000000000000004 +:10BC20000000000000000000000000000000000014 +:10BC300000000000000000004000000000000000C4 :10BC400000000000000000000000000000000000F4 -:10BC50004000040000000400000004000020000078 -:10BC600000000000040004000000000000002102A9 -:10BC70000000000000000000000004000000800040 -:10BC8000000000000040000010000400000004005C -:10BC900004000000000000000000000000000000A0 +:10BC50000000000000000000000080000000000064 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 :10BCA0000000000000000000000000000000000094 :10BCB0000000000000000000000000000000000084 :10BCC0000000000000000000000000000000000074 -:10BCD0002000020000000000000000000000000042 -:10BCE0000000000000000000020000000000000052 -:10BCF0000000000000000000000000000200000042 -:10BD000000000000020000000000004000000000F1 -:10BD10000000000000000000020000000000000021 -:10BD2000000000000000000008000000000000000B +:10BCD00000000000200000000200000002008300BD +:10BCE0000000000000000000000000032000210010 +:10BCF00000000000000000000000000000004010F4 +:10BD000008002010000004000000000004000020D3 +:10BD10000000020000000000000000000000000021 +:10BD20000000000000000000000000000000000013 :10BD30000000000000000000000000000000000003 :10BD400000000000000000000000000000000000F3 -:10BD50000000800000000000000000000000000063 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA000000000000000000000000008000000008B +:10BD50000000000000008000000000000000000063 +:10BD60002000000000000000000002000000800031 +:10BD7000840000000000000000000000000000003F +:10BD8000800180008001000080000000000000822F +:10BD90000001000080000000000000000000000022 +:10BDA0000000000000000000000000000000000093 :10BDB0000000000000000000000000000000000083 :10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000001000000000062 -:10BDE0000000000000000000012100000000000031 -:10BDF000000001000100820000000421C0000000DA -:10BE000000000000000082000000004100008200ED -:10BE10000000040082000000000000000400820016 -:10BE2000000000000000000000000000000800000A +:10BDD00000000000000000000000000000000080E3 +:10BDE000008000000180010000200005000000002C +:10BDF0000108000000080000000000000000000032 +:10BE0000000004000000000000000000000000042A +:10BE10000000000400000004000900000011000000 +:10BE20000000000000000000000000000000000012 :10BE30000000000000000000000000000000000002 :10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000004000000DE -:10BE600000000000000000000000040000000000CE -:10BE7000000000000400040000000000800000003A -:10BE800000000300000000000000000000000000AF -:10BE9000000021008000210000000000000000A040 -:10BEA000000000000000000000000000000000088A +:10BE50000000000000000000000000000000008260 +:10BE6000000400040000080440002100210021001B +:10BE700000000400000000010000000000040000B9 +:10BE800000000000000000000000000000000000B2 +:10BE90000801000000010000000100000000000097 +:10BEA0000000000000000000000000000000000092 :10BEB0000000000000000000000000000000000082 :10BEC0000000000000000000000000000000000072 -:10BED000000000000000000000000400000020003E -:10BEE000004000000000010004800000000000008D -:10BEF0000000000004000000001004000400000026 -:10BF00000000040000000400A00004000000000085 -:10BF1000000004000000000000000000000000001D -:10BF20000000100000000000000000000000000001 +:10BED0000000000000000000000000000000000062 +:10BEE00000002000000000212000C000C000000071 +:10BEF000A020000082000000C00420040100000017 +:10BF0000C000000084000000820001000200000068 +:10BF1000000001000080008000000100000000001F +:10BF20000000000000000000000000000000000011 :10BF30000000000000000000000000000000000001 :10BF400000000000000000000000000000000000F1 -:10BF50000000000000000000000000008000000061 -:10BF6000000000000000000020008004000000002D -:10BF70000000000000008000000000008000800041 -:10BF80000000000080000000800000008000000031 -:10BF90000000000880000000000000000000000019 +:10BF500000000000000000000000000000000000E1 +:10BF6000000000008000000000008000410041004F +:10BF70004100210100000000410000018301040094 +:10BF800000000000000000000000000020A08082EF +:10BF900000840000208403204104210020000000D0 :10BFA0000000000000000000000000000000000091 -:10BFB0000000000800000000000000000000000079 +:10BFB0000000000000000000000000000000000081 :10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE00000000000900000800000A000000004009D -:10BFF000000082000000000000000000A000C0005F -:10C000000000000000000000000000000000000030 -:10C010000000008000080000000000000000000098 -:10C020000000000000000000000000000000000010 +:10BFD0000000000000000000000000000000400021 +:10BFE0000000400210000480208321841184C002DC +:10BFF000C020C000C0410000C080C0002000A000E0 +:10C00000000200054000C000000008004040200081 +:10C01000002040000940202000020000000200042F +:10C0200000110011000000000000000000000000EE :10C030000000000000000000000000000000000000 :10C0400000000000000000000000000000000000F0 :10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000020000000000000B0 -:10C07000830000000000000000000000000000003D -:10C08000000000000000000000000000000000842C -:10C09000000003840020000800000000030000846A -:10C0A00003000000000000A0000000000000008469 -:10C0B0000000000000000008000000000000000078 +:10C06000008200000083808400048004A005A009F1 +:10C07000000000000000000000002002410080825B +:10C080000088000100004000000000000000800166 +:10C090008000000180000401C001000000000001D8 +:10C0A000000100000000000000000000000000008F +:10C0B0000000000000000000000000000000000080 :10C0C0000000000000000000000000000000000070 :10C0D0000000000000000000000000000000000060 -:10C0E000000000000000200000110080010000009E -:10C0F000000000000021040000000000000000001B -:10C10000000000000000002104000000000000000A -:10C1100000000000040000410408000000020000CC -:10C1200000000000000000000021000000000000EE -:10C1300000000000000000000008000000000000F7 +:10C0E00000000000000000000000002120042004E7 +:10C0F00020080100C0000000C04100008200C00014 +:10C10000040204000002C105A000A0028400C005D2 +:10C11000840020000000A083A0210004000001840E +:10C12000008000840000000000000000000000000B +:10C1300000000000000000000000000000000000FF :10C1400000000000000000000000000000000000EF :10C1500000000000000000000000000000000000DF -:10C160000000000011000200000000000008200094 -:10C170000000058800000000000000000000000032 -:10C18000000000000000000000008000000000002F -:10C19000000000000000800000008000000000009F -:10C1A000000000000000000000000000000000008F +:10C16000000000000000000000000000000080014E +:10C17000800180012000000000000000000003900A +:10C1800000009101A1000501040000000001000071 +:10C1900000A00000808400000040080000010000B2 +:10C1A0002005004000050000000000000000000025 :10C1B000000000000000000000000000000000007F :10C1C000000000000000000000000000000000006F :10C1D000000000000000000000000000000000005F -:10C1E00000000000000000C000900000000001C03E -:10C1F00000900000000000C000900000000000035C -:10C2000000C000900000000000C00090000000008E -:10C2100000C000900000000000C00090000000007E -:10C2200000C00090000000000000000000000000BE +:10C1E00000000000000000000000020000000091BC +:10C1F00020024191008900000000010000000000C1 +:10C20000C041A0A0A08400A102C0000440004002E0 +:10C2100010A1020384059010880200080402101087 +:10C2200000000000001010100000000000000000DE :10C2300000000000000000000000000000000000FE :10C2400000000000000000000000000000000000EE :10C2500000000000000000000000000000000000DE -:10C2600000000000000000000080008000000000CE -:10C27000118021800000000000800080000000008C -:10C2800000000080008000000000008000800000AE -:10C29000000000800080000000001180008000008D -:10C2A000000000800080000000000000000000008E +:10C2600000000000000000000000090000000000C5 +:10C2700020908383C1A000A00004000505030005F1 +:10C28000000000C185C103910020C08300C080412F +:10C2900000C0808803888988000900020091828399 +:10C2A0000010110321031110801000000000000095 :10C2B000000000000000000000000000000000007E :10C2C000000000000000000000000000000000006E :10C2D000000000000000000000000000000000005E -:10C2E00000000000000000000000000080000000CE -:10C2F000808000088900000380800000800000002A -:10C30000808000000000800000008080000080002D -:10C31000000080800000800000008080000080001D -:10C32000000080800000800000008080000000008D +:10C2E00000000000000000000000088010000800AE +:10C2F000082111008383918389838000000000005E +:10C30000808000004000C1C108C020808000002162 +:10C3100000008000000088058800039000008389E9 +:10C32000081180094100038010031008000000007C :10C3300000000000000000000000000000000000FD :10C3400000000000000000000000000000000000ED :10C3500000000000000000000000000000000000DD -:10C36000000000000000000000000000000082004B -:10C370000000C090000183000000C0900000820017 -:10C380000000C0900000000082000000C09000008B -:10C3900082000000C090000082000000C0900000F9 -:10C3A00082000000C090000082000000C0900000E9 +:10C3600000000000000000000000000000100100BC +:10C3700000000001919002C1419003890200040075 +:10C3800010000402000040400240A1834108020066 +:10C3900000000000C000820203001120118802008A +:10C3A00008C011100488004000C0001000110000F7 :10C3B000000000000000000000000000000000007D :10C3C000000000000000000000000000000000006D :10C3D000000000000000000000000000000000005D :10C3E000000000000000000000000000000000004D -:10C3F0000000849000C000008800009001C0000090 -:10C400000000009000C0000000000000009000C08C -:10C4100000000000009000C000000000009000C07C -:10C4200000000000009000C000000000009000C06C +:10C3F0000000000000001001010000000301000027 +:10C40000000000000000000008400988C188008486 +:10C4100041400000000040C0C010000801100904A5 +:10C4200010100010C185910520009100111091910C :10C4300000000000000000000000000000000000FC :10C4400000000000000000000000000000000000EC :10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000900C3 -:10C4700000000000008000800000000000800280BA -:10C48000000000000080008000000000000000802C -:10C49000008000000000008000800000000000809C -:10C4A000008000000000008000800000000000808C -:10C4B00000800000000000000000000000000000FC +:10C4600000000000000000000000000000000000CC +:10C47000001100080009000980101010020091113D +:10C480000000100005000000000080404121C103B1 +:10C4900000C021050005000300C000A00200052027 +:10C4A00011918085090585A19189A1409105850596 +:10C4B000919000000000000000000000000000005B :10C4C000000000000000000000000000000000006C :10C4D000000000000000000000000000000000005C :10C4E000000000000000000000000000000000004C -:10C4F00000008000000200000000801180090000A0 -:10C5000000008011800200000000000080118009FE -:10C5100000000000801180020000000080118009EE -:10C5200000000000801180040000000080118020C5 -:10C5300000000000000000000000000000000000FB +:10C4F00000004109110208002003C1828009218047 +:10C500008903001000C1008000000000C003888380 +:10C5100008A180210000800300000000C121A100CB +:10C5200021809102C18090C010009111A19085409E +:10C530000580C011000000000000000000000000A5 :10C5400000000000000000000000000000000000EB :10C5500000000000000000000000000000000000DB :10C5600000000000000000000000000000000000CB -:10C57000000000009000000000000000C00120004A -:10C5800000000000C0012000000000000000C00109 -:10C59000200000000000C001200000000000C001D9 -:10C5A000200000000000C001200000000000C001C9 -:10C5B000200100000000000000000000000000005A +:10C5700000000000018801000000000103C09021BC +:10C58000A110090000000003000400000000C1C069 +:10C590001104A10308004000040040404000C10114 +:10C5A00002904184030010A002821010910121200A +:10C5B00002001010900100000000000000000000C8 :10C5C000000000000000000000000000000000006B :10C5D000000000000000000000000000000000005B :10C5E000000000000000000000000000000000004B -:10C5F00000E0000000000021000006000000000A2A -:10C6000000E0060000000006000006000000000038 -:10C610000006000006000000000600000600000002 -:10C62000008200000600000000410000060000003B -:10C630000082000006000000000000000000000072 +:10C5F000000000000000810000C800000000810071 +:10C6000000C800008481818100C8430088000000C8 +:10C61000484200C843008811004200004300000067 +:10C62000480000C800000000821100C8430048060E +:10C63000818100C843008400000000000000000069 :10C6400000000000000000000000000000000000EA :10C6500000000000000000000000000000000000DA :10C6600000000000000000000000000000000000CA -:10C670000000000000000000FFFF0000FF000000BD -:10C68000FF000000FF000000FF000000FF000000AE -:10C690000000FF000000FF000000FF000000FF009E -:10C6A0000000FF000000FF000000FF000000FF008E -:10C6B0000000FF000000FF0000000000000000007C +:10C6700000000000000000000000000000000000BA +:10C6800035CAFF00000000000000000000000000AC +:10C6900000006525000040D9BF26CC333CC33C3C9C +:10C6A0006666FF667878C009C0F9FF00FF00765E15 +:10C6B000256499669768FFFF0000000000000000F5 :10C6C000000000000000000000000000000000006A :10C6D000000000000000000000000000000000005A :10C6E000000000000000000000000000000000004A -:10C6F00000000000000000000000FFFF0000FF003D -:10C700000000FF000000FF000000FF000000FF002D -:10C7100000000000FF000000FF000000FF0000001C -:10C72000FF000000FF000000FF000000FF0000000D -:10C73000FF000000FF000000FF00000000000000FC +:10C6F000000000000000000000000000000000003A +:10C7000000005CC3FF00000000000000000000000B +:10C71000000000006664000040D9BF26CC333C3CDA +:10C72000C3C3999999007878CF09CFF9FE003C00EE +:10C730006656A5649966976800FFFF000000000038 :10C7400000000000000000000000000000000000E9 :10C7500000000000000000000000000000000000D9 :10C7600000000000000000000000000000000000C9 @@ -179370,366 +179370,366 @@ :10C7D0000000000000000000000000000000000059 :10C7E0000000000000000000000000000000000049 :10C7F0000000000000000000000000000000000039 -:10C8000000FF00000F0F000000FF00000F0F0000EE -:10C8100000FF00000F0F0000000000FF00000F0FDE -:10C82000000000FF00000F0F000000FF00000F0FCE -:10C83000000000FF00000F0F000000FFFFFFF0F0FE +:10C800000000000000005ADA5A662080002C000068 +:10C8100000000F0C0F0E00000F0C333F1DE23FC055 +:10C8200066FF3CA500003C3CDBC018C09D9D999F65 +:10C8300061666466355CCAA3DADADADAFFFFFFFF05 :10C8400000000000000000000000000000000000E8 :10C8500000000000000000000000000000000000D8 :10C8600000000000000000000000000000000000C8 :10C8700000000000000000000000000000000000B8 -:10C88000000000FF00000F0F000000FF00000F0F6E -:10C89000000000FF00000F0F0000000000FF00007C -:10C8A0000F0F000000FF00000F0F000000FF00004E -:10C8B0000F0F000000FF00000F0F000000FFFFFF40 -:10C8C000F0F0000000000000000000000000000088 +:10C8800000000000000000005A255A998800000CA2 +:10C89000000000000F010F0000000CCC3F0F52AD54 +:10C8A00040BF99003C5AFFFFC3C3DBFC18FC0404E3 +:10C8B000000609662966253CDAC3252525250000E2 +:10C8C0000000000000000000000000000000000068 :10C8D0000000000000000000000000000000000058 :10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000610006000DC4 -:10C900000000030203380C0092C003E2033E0C0C4B -:10C9100092C0038203380C0092C0000003820338E7 -:10C920000C0092C0038203380C0092C003820338CB -:10C930000C0092C0038203380C0092C003820338BB -:10C940000C0082C000000000000000000000000099 +:10C8F0000000000000000000000000000000000038 +:10C90000000000610004C00D000000413001C009BA +:10C9100000010061003BC00D10C0000003E1033BBB +:10C92000CC0110C00363033E000D8200A06100072C +:10C93000C00900004361833FCC2910C24361833D9D +:10C94000C00900000000000000000000000000001E :10C9500000000000000000000000000000000000D7 :10C9600000000000000000000000000000000000C7 :10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C99000FFFF000000000000000000000000000099 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 +:10C98000000000007D280303A0AFACA3000000005E +:10C99000101010100000000000000000000055FF03 +:10C9A0000F0F55A6956A00000000393C3C3C04047A +:10C9B000FF00820082C3C0C000304000C282A808CD +:10C9C000A808000000C300000000000000000000F4 :10C9D0000000000000000000000000000000000057 :10C9E0000000000000000000000000000000000047 :10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 +:10CA00000000000000007D280000A0AFA0AF1414BB +:10CA1000505014140000000000000000000000004E +:10CA200055FF0F0F956A966A00000000393C3C3CA8 +:10CA300004043939000000C30300F0FF4000C28243 +:10CA4000A8080808C000C0C30000000000000000E3 :10CA500000000000000000000000000000000000D6 :10CA600000000000000000000000000000000000C6 :10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA900000000000F0F000000000000000000000B6 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000000000066 +:10CA8000000000000000000000000000FF7FDFCF7A +:10CA9000AA2200006030CFCFFFAE000000000000EF +:10CAA00000005D7FA2948DA5725AFF003FC0000078 +:10CAB000000094949696000000A0A555E555A5AFFA +:10CAC000A5AF59590059953535CA0000000000003E :10CAD0000000000000000000000000000000000056 :10CAE0000000000000000000000000000000000046 :10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB1000000000000000F0F0000000000000000035 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 +:10CB00000000000000000000000000000000FEFF28 +:10CB1000FFCF002200003F9FC030AAEA00000000C3 +:10CB20000000000082008615E4331BCCFF003FC0EC +:10CB3000000000001C1C1C9C000000A0AFE5A5F537 +:10CB4000A500A5005555005535C565CA0000000073 :10CB500000000000000000000000000000000000D5 :10CB600000000000000000000000000000000000C5 :10CB700000000000000000000000000000000000B5 :10CB80000000000000000000000010000000000095 :10CB90000000000000000000000000000000000095 -:10CBA0000000000000010000000000002000000064 -:10CBB0000000000000000000000000004000000035 +:10CBA0000000000000000000000000002000000065 +:10CBB0000000000000000000000000000000000075 :10CBC0000000000000000000000000002000000045 -:10CBD0000000000000000000000000002000000035 +:10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 +:10CBF0000000000000000000000010000000000025 +:10CC00000000000010000000000000000000000014 :10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000002000002 -:10CC300000000000000000000000000040001000A4 -:10CC40004000400040000000000000000000000024 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000002F2 +:10CC400000C04000000000000000000000000000E4 :10CC500000000000000000020000000000000000D2 -:10CC60001000400000000000000000000000000074 -:10CC700000000000000000000000000000000000B4 -:10CC800002000200000000000000000000000000A0 -:10CC9000000000000000000002000200020002008C -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 +:10CC60000000400040000000000000000000000044 +:10CC700000000000000000000000000002000200B0 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000002000000000092 +:10CCA0000000000000000000000200002000020060 +:10CCB0002000000000000000000004000000000050 :10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000004000000000000014 -:10CCE000000000000000000000000000000000083C +:10CCD00000000000008002000000020000000000D0 +:10CCE0000000000000000000000000000000000044 :10CCF0000000000000000000000000000000000034 -:10CD0000000000000000000000000000000000081B -:10CD10000000000000000000000080008000800093 -:10CD20008000000000000000000000000000000083 -:10CD300000080000000000000000000000000000EB +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000800083 +:10CD30008000800000000000000000008000000073 :10CD400000000000000000000000000000000000E3 -:10CD500000080000000000000000000000000000CB +:10CD50000000000000000020800000000000000033 :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 :10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000001000000000092 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000004100000000000000000000000002 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000010082 +:10CDB000888008008280000000000000001000054C +:10CDC00000000021000000410400001100000000EC +:10CDD0000005000500000004008000800000000045 +:10CDE0000000000000000000000000000000000043 :10CDF0000000000000000000000000000000000033 :10CE00000000000000000000000000000000000022 -:10CE1000000000000000000000000000040000000E -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 +:10CE10000000000000000500000004000000000009 +:10CE20000000000000000000008200000000000080 +:10CE300002A00040800000404100000041000001CD +:10CE40000000000000000000000000000090000052 +:10CE50000000008400840000000400200020000086 :10CE600000000000000000000000000000000000C2 :10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000800000180018088 -:10CEA0000000000000000100000000000000000081 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 +:10CE90000000000000000000000000000000000092 +:10CEA00000000000000084000000000000000009F5 +:10CEB00000000002000090210109000000000000B5 +:10CEC000004100118421001100000000000000005A +:10CED0000000000000000000000000000000010051 :10CEE0000000000000000000000000000000000042 :10CEF0000000000000000000000000000000000032 :10CF00000000000000000000000000000000000021 -:10CF100000000000000000000000000100002020D0 -:10CF200002040000000000000400000000000000F7 -:10CF300000000000000000000000000000000000F1 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000004040000000000E9 :10CF400000000000000000000000000000000000E1 :10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 +:10CF600008000000000000000000000000000000B9 :10CF700000000000000000000000000000000000B1 :10CF800000000000000000000000000000000000A1 -:10CF9000000000000000000090009000020000006F +:10CF90000000000000000000000000000000000091 :10CFA0000000000000000000000000000000000081 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 +:10CFB00000000000000000C08800008082800000A7 +:10CFC0000008000000000000000001000000000058 +:10CFD000000000000000000082000000008001004E +:10CFE00001800100000000000000000000000000BF :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 -:10D01000000000000000000000000000000080840C -:10D020000000000000C000000000008400000000BC -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000C0000020 -:10D0500000000000000000000000000000A0000030 -:10D0600000000000000000000000000000000000C0 +:10D01000000000000000000000000000000005000B +:10D0200000200000000021000000000005000000BA +:10D0300000000000000000000011000000100010BF +:10D040000000000000000000000005A004A000C0D7 +:10D05000000000C00090008400000000210000409B +:10D060000200042008000000000000000000000092 :10D0700000000000000000000000000000000000B0 :10D0800000000000000000000000000000000000A0 :10D090000000000000000000000000000000000090 -:10D0A000000001000000000000090000000900006D -:10D0B000000000000002000000000000000000006E -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000000000000000040 +:10D0A00084000000000000000000000000000000FC +:10D0B000000000000000000000000000040000006C +:10D0C00004000040000000000009000201400000D0 +:10D0D000002000219000880040020000000088002D +:10D0E0008802000000200020000000000000000076 :10D0F0000000000000000000000000000000000030 :10D10000000000000000000000000000000000001F :10D11000000000000000000000000000000000000F -:10D1200000001100200000000000000000000000CE -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF +:10D1200000000000000000000000000000000000FF +:10D13000000000000000000000000000000080006F +:10D140000000800000010000000000000000040159 +:10D1500000000001000000000000000000000000CE +:10D1600000000000000000010001000000000000BD :10D1700000000000000000000000000000000000AF :10D18000000000000000000000000000000000009F :10D19000000000000000000000000000000000008F -:10D1A00000000000010090000000008400000090DA -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000C0AF +:10D1C0009082888382A008C00482000290044040BC +:10D1D000000200020804000000000000000000A09F +:10D1E000000800080082038200200082889000006E :10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E :10D21000000000000000000000000000000000000E -:10D220000000000000001100A1000000000000004C -:10D23000008000000000000000000000000000006E -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D240000289882008100011808080000080008002 +:10D25000808000000000800000000000000000004E +:10D260000000008000800000A1000080000000009D :10D2700000000000000000000000000000000000AE :10D28000000000000000000000000000000000009E :10D29000000000000000000000000000000000008E -:10D2A00000000000000000000008098000030000EA -:10D2B00000000000000000800000000000000000EE -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000002801010900082900000800000009A +:10D2D00000000000000400048000000000000000C6 +:10D2E000000000000080000000000000001100802D :10D2F000000000000000000000000000000000002E :10D30000000000000000000000000000000000001D :10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000101020000F9 -:10D330000088000000C000000002000000000000A3 -:10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D340000000000000C0A100A100C009A00008006A +:10D35000100090000400C0000402C00000000000A3 +:10D3600000000000000000040000000000000001B8 +:10D3700000040000000000000000000000000000A9 :10D38000000000000000000000000000000000009D :10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000010088886C -:10D3B0000800010001000000829000000000000051 -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C00000000000000082830183018382C0C0024C +:10D3D00000A000028308C0C0000200020804000090 +:10D3E000000000000000C0000000000004000082F7 +:10D3F0000082848204900000000000000000000011 :10D40000000000000000000000000000000000001C :10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000004100BB -:10D4300000808000200004000000808000000000C8 -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D44000000000000000000000081008022100C0D9 +:10D4500080000080000009800000000000008000C3 +:10D46000000000000000000000000000000080003C +:10D47000000000008000900000000000000000009C :10D48000000000000000000000000000000000009C :10D49000000000000000000000000000000000008C :10D4A000000000000000000000000000000000007C -:10D4B000001100000080000000118040000000000A -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C +:10D4B000000000000000000000000000000000006C +:10D4C00000000000000000000000A1082120400032 +:10D4D00088020000008000000000000900400000F9 +:10D4E00080000000000000000000000000000000BC +:10D4F000000080080008800000000000000000001C :10D50000000000000000000000000000000000001B :10D51000000000000000000000000000000000000B :10D5200000000000000000000000000000000000FB -:10D530000000000100000040000000012001008800 -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB +:10D5300000000000000000000000000000000000EB +:10D54000000000000000000000000000C120C00139 +:10D5500084A088010000008200020000C0000402D4 +:10D5600002020800000000000000000000000000AF +:10D5700000000000C0008201900082000000000056 :10D58000000000000000000000000000000000009B :10D59000000000000000000000000000000000008B :10D5A000000000000000000000000000000000007B -:10D5B00000000000000000E0070082000000000002 -:10D5C0000700000000000000000000000000000054 -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B +:10D5B000000000000000000000000000000000006B +:10D5C0000000000000000000000000000000884192 +:10D5D00000C84300820000000000000082000081BB +:10D5E00000004300000000000000000000000000F8 +:10D5F0000000000000000081000043000000000067 :10D60000000000000000000000000000000000001A :10D61000000000000000000000000000000000000A :10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000F0F0000000FF0B -:10D64000000000FF000000000000000000000000DB -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D65000FFCF003CCC0F000000000000AA3CAA3C19 +:10D660000400E3FFC1D13F2E0000000000000000D5 +:10D6700000000000000000000FC30F5A0020012826 :10D68000000000000000000000000000000000009A :10D69000000000000000000000000000000000008A :10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000F0F000008A -:10D6C00000FF000000FF000000000000000000005C -:10D6D000000000000000000000000000000000004A -:10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D00000000000003C33F0030000000000F000F8 +:10D6E000F0FF3C0080FF3E2EC0D100000000000093 +:10D6F000000000000000000000000F3CF099110045 +:10D7000040290000000000000000000000000000B0 :10D710000000000000000000000000000000000009 :10D7200000000000000000000000000000000000F9 -:10D730000000000000000000000000003C3C000071 -:10D74000FFFF0000FF000000FFFF000000000000DE -:10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D750000000000066CC040000000000FF0F5C5CCD +:10D76000FF000F0F2828D1D7A55AFF0000000000A6 +:10D770000000000016459655000000000000350529 :10D780000000000000000000000000000000000099 :10D790000000000000000000000000000000000089 :10D7A0000000000000000000000000000000000079 -:10D7B00000000000000000000000000000003C3CF1 -:10D7C000000000000000FF0000000000000000005A -:10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D000000000000000C69C0000FF00F0F0F00018 +:10D7E0005C5C3C3C5555BE284151A527827D00001C +:10D7F000000000000000288869A900000000000067 +:10D8000035050000000000000000000000000000DE :10D810000000000000000000000000000000000008 :10D8200000000000000000000000000000000000F8 -:10D830000000000000000000000000000000056083 -:10D840002A06054C00A815002A00054000A8000083 -:10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D850000000000000000000A061503DC09900A53C +:10D860000000500000100000000000380000000818 +:10D870000000000000000000000030000000000078 +:10D88000A0000038051000000000000000000000AB :10D890000000000000000000000000000000000088 :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 -:10D8C00000000000FFFF000000000000000000005A -:10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 +:10D8C0000000000000000000000000000000000058 +:10D8D00000000000000000000000FFFF5C0028FFC7 +:10D8E000F0FF000000000000000000000000000049 :10D8F0000000000000000000000000000000000028 :10D900000000000000000000000000000000000017 :10D910000000000000000000000000000000000007 :10D9200000000000000000000000000000000000F7 :10D9300000000000000000000000000000000000E7 :10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 +:10D95000000000000000000000000000FFFF0C00BD +:10D9600000FF00FF000000000000000000000000B9 :10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 :10D990000000000000000000000000000000000087 :10D9A0000000000000000000000000000000000077 :10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000F0F000000000000077 -:10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000000037 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000AA2A73 +:10D9E000002A0C0C0C0C00000000000000000000DD :10D9F0000000000000000000000000000000000027 :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 :10DA200000000000000000000000000000000000F6 :10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000F0F000000000F6 +:10DA400000000000000000000000000000000000D6 :10DA500000000000000000000000000000000000C6 -:10DA600000000000000000000000000000000000B6 +:10DA6000AA200020000A0F0A0000000000000000A9 :10DA700000000000000000000000000000000000A6 :10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 :10DAA0000000000000000000000000000000000076 :10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 +:10DAC000000000000000000000000000A0000000B6 :10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 +:10DAE0000000000000000000000000000000200016 +:10DAF0000400000000000000000000000000000022 :10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000400000000000A5 +:10DB100020000000000000000000000000000000E5 +:10DB200000004000000000000000000000000000B5 +:10DB300000000000000000000000000000000000E5 :10DB400000000000000000000000000000000000D5 -:10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000000B5 -:10DB70004102000000000000000000000000000062 -:10DB80000000100000000000000000000000000085 +:10DB500000020000000000020000000000000000C1 +:10DB60000000000000000000004000000000000075 +:10DB7000000000020004000200000000000200009B +:10DB80000000000000000000000000000000000095 :10DB90000000000000001000000000000000000075 :10DBA0000000000000000000000000000000000075 -:10DBB0000000000002000000000000000000000063 +:10DBB0000000000000000000020000000000000063 :10DBC0000000000000000000000000000000000055 :10DBD0000000000000000000000000000000000045 -:10DBE0000000000000000000000000000000000035 -:10DBF0000200000000000000000000000000000023 +:10DBE000000000000000000000000000080000002D +:10DBF0000000000000000000040000000000000021 :10DC00000000000000000000000000000000000014 :10DC10000000000000000000000000000000000004 -:10DC200000000000000000000000000000000000F4 +:10DC200000000000020000000000000000000000F2 :10DC300000000000000000000000000000000000E4 :10DC400000000000000000000000000000000000D4 :10DC500000000000000000000000000000000000C4 :10DC600000000000000000000000000000000000B4 :10DC700000000000000000000000000000000000A4 :10DC80000000000000000000000000000000000094 -:10DC90000000000000000000000000000000000084 +:10DC9000000800000000000000000000000000007C :10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 :10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 -:10DCE00000000000000000000000000000008800AC -:10DCF0000000000000000000000000000000000024 -:10DD00000000000000000000000000000000000013 +:10DCD0004000000040004000000000000000000084 +:10DCE00000000000000000000000000000008200B2 +:10DCF0000000000000000800000000000000A0007C +:10DD00000000A0000000000004000000000000006F :10DD10000000000000000000000000000000000003 :10DD200000000000000000000000000000000000F3 :10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000000000000C3 -:10DD600000000000000000000000000000000000B3 -:10DD700000000000000000000000000000000000A3 +:10DD40000000000000000000000040000000000093 +:10DD50000000000000000000400000000000000083 +:10DD60000000000040000000000000000000000073 +:10DD70000000000000084000000000000000041047 :10DD80000000000000000000000000000000000093 :10DD90000000000000000000000000000000000083 -:10DDA0000000000000000000000000000000000073 +:10DDA0000000002000000000000000000000000053 :10DDB0000000000000000000000000000000000063 :10DDC0000000000000000000000000000000000053 -:10DDD000000000000000000000000004000000003F -:10DDE0000000000000000000000000000000000033 -:10DDF0000000000000000000000000000000000023 -:10DE000000000000004000000000000000000000D2 +:10DDD00000000000000000000000000000400040C3 +:10DDE000204000400000000000410004000000004E +:10DDF000001000040004000000000000000000000B +:10DE00000000000000000000000000000000000012 :10DE10000000000000000000000000000000000002 :10DE200000000000000000000000000000000000F2 :10DE300000000000000000000000000000000000E2 :10DE400000000000000000000000000000000000D2 :10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000002000000B0 -:10DE70000000000000000000000000000000001092 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 :10DE80000000000000000000000000000000000092 :10DE90000000000000000000000000000000000082 :10DEA0000000000000000000000000000000000072 @@ -179743,26 +179743,26 @@ :10DF200000000000000000000000000000000000F1 :10DF300000000000000000000000000000000000E1 :10DF400000000000000000000000000000000000D1 -:10DF500000000084000000C000C000000000008439 -:10DF600000840000000000000084000000000000A9 -:10DF700000000000000000000000000000000000A1 -:10DF80000000000000000000000000000000000091 -:10DF90000000000000000000000000000000000081 -:10DFA0000000000000000000000000000000000071 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000400040044088008400000000D1 +:10DF80000800000000000000000000000000000089 +:10DF900010000000000000000000000000880000E9 +:10DFA00008840000000000000000000000000000E5 :10DFB0000000000000000000000000000000000061 :10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000000000009000038 -:10DFE000000000000000000000020002000000002D -:10DFF000000000020000000000000000000000001F -:10E000000000000000000000000000000000000010 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000080000029000000000000000000076 :10E010000000000000000000000000000000000000 -:10E0200000000000000000000000000000000000F0 +:10E0200000000000000000000000000200000000EE :10E0300000000000000000000000000000000000E0 :10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 -:10E06000000000001100000000000000000000009F -:10E070000000000000000000000000002000000080 -:10E080000000000000000040000000000000000050 +:10E0600000000000000000000000000000000000B0 +:10E070000000000000000000000000000020000080 +:10E080000000000000000000000000000000000090 :10E090000000000000000000000000000000000080 :10E0A0000000000000000000000000000000000070 :10E0B0000000000000000000000000000000000060 @@ -179920,76 +179920,76 @@ :10EA300000000000000000000000000000000000D6 :10EA400000000000000000000000000000000000C6 :10EA500000000000000000000000000000000000B6 -:10EA60000000000000000000000020000000000086 -:10EA70000000000000000000200000002000000056 -:10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000000175 -:10EAA00000800000000000000000000000000000E6 -:10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000200000000000000000044 -:10EAD0000000100000000000000000000000000026 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA800000000000C00000000000000000000000C6 +:10EA900000000000C00000000000000000000000B6 +:10EAA0000000000000002000000000000000000046 +:10EAB000000000000000C000000000000000000096 +:10EAC0000000000000002000000000000000000026 +:10EAD000000040004000C0000000000000000000F6 :10EAE0000000000000000000000000000000000026 :10EAF0000000000000000000000000000000000016 -:10EB00000000000000020000000000000002000001 +:10EB00000000000000000000000000000002000003 :10EB100000000000000000000000000000000000F5 -:10EB2000000000400000090010004040100040407C -:10EB300000000000000000020000000000000000D3 -:10EB40000000000000000000000000004000000085 -:10EB500000000000000000000000000010000000A5 -:10EB600000000200020000000000000000000000A1 -:10EB70000000000000000000000000000200000093 +:10EB200000000000000000020000000010000000D3 +:10EB300000000000000000000000000000000000D5 +:10EB40000000000000000000000000004000400045 +:10EB50000000000000000000000000004000000075 +:10EB600000000000000000000200000000000000A3 +:10EB70000000000000000000000000000000000095 :10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000002000000000073 -:10EBA0000200000000000000000000000000000063 -:10EBB0000000000000000000000002000000000053 -:10EBC0000000000000000000000000400000000005 -:10EBD00000000000000000000000000000400000F5 -:10EBE00000000000000000000000400000000000E5 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000020000000000000063 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000002000000000043 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 :10EBF0000000000000000000000000000000000015 -:10EC000000000000400000000000000000000000C4 +:10EC00000000000000000000000000000000000004 :10EC100000000000000000000000000000000000F4 -:10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000000000000000D4 -:10EC40000000000000000000000000004000000084 -:10EC500000000000000000000000000000000000B4 -:10EC6000000000000008000000000000000000009C +:10EC20000000000000000000000000C00000000024 +:10EC30000000000000C0000000C000002000000034 +:10EC400000000000000000000000000000000000C4 +:10EC50000000000000000000000000002000000094 +:10EC600000000000000000000000000000000000A4 :10EC70000000000000000000000000000000000094 :10EC80000000000000000000000000000000000084 :10EC90000000000000000000000000000000000074 -:10ECA0000000000000000000000000000000000064 -:10ECB000000000000000000000000000004000050F -:10ECC0000000000000000010000000000000000034 -:10ECD0000000000000000000000000000000000034 +:10ECA0000000000000000000000088008800000054 +:10ECB000C000000000000000000000000000000094 +:10ECC0000000000000000000000000000000000044 +:10ECD00000004000000000000000000000000000F4 :10ECE0000000000000000000000000000000000024 :10ECF0000000000000000000000000000000000014 :10ED00000000000000000000000000000000000003 :10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000004100A2 +:10ED200000000000000000000000000000000000E3 :10ED300000000000000000000000000000000000D3 :10ED400000000000000000000000000000000000C3 :10ED500000000000000000000000000000000000B3 :10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000000083 -:10ED90000000010000000100008000000000A00051 -:10EDA0000000000000400000000000000000000023 -:10EDB0000000000000000000000000000000000053 -:10EDC0000000000000000000000000400000000003 +:10ED70000040000000000000000000000000000053 +:10ED80000000000000000000000000030000000080 +:10ED90000000000000400000000000000000000033 +:10EDA0000000000000000000000000000000000063 +:10EDB000000000040000000000000000000000004F +:10EDC0000000000000000000000000000000000043 :10EDD0000000000000000000000000000000000033 -:10EDE00000000000000000400000000000000000E3 +:10EDE0000000000000000000000000000000000023 :10EDF0000000000000000000000000000000000013 :10EE00000000000000000000000000000000000002 -:10EE100000000000100000002000000400000000BE +:10EE1000000000000000008400000000000000006E :10EE200000000000000000000000000000000000E2 -:10EE300000000000000000000000000000000000D2 -:10EE400000000000000000000000000000000000C2 -:10EE500000000000020000000000000000000000B0 +:10EE30000000000002000000000000840000000448 +:10EE400000040004000000000000000000000000BA +:10EE500000000000000000000000000000000000B2 :10EE600000000000000000000000000000000000A2 :10EE70000000000000000000000000000000000092 :10EE80000000000000000000000000000000000082 -:10EE900000000000900000000000000000000000E2 -:10EEA000000000001000000000000000080000004A -:10EEB0000000000000000000000000000000002131 +:10EE9000000000000000000000000000000800006A +:10EEA0000000000000000000000000000000000062 +:10EEB0000000400000000000000000000000000012 :10EEC0000000000000000000000000000000000042 :10EED0000000000000000000000000000000000032 :10EEE0000000000000000000000000000000000022 @@ -179997,95 +179997,95 @@ :10EF00000000000000000000000000000000000001 :10EF100000000000000000000000000000000000F1 :10EF200000000000000000000000000000000000E1 -:10EF300000000000210000000000000000000000B0 +:10EF300000000000000000000004000000000000CD :10EF400000000000000000000000000000000000C1 -:10EF500000000000000000000000000000000000B1 +:10EF50000000000000000000000000000020000091 :10EF600000000000000000000000000000000000A1 :10EF70000000000000000000000000000000000091 :10EF80000000000000000000000000000000000081 -:10EF90000000000000000000000000000000080069 -:10EFA0000000000000000000000000000800C00099 -:10EFB0000000000000000000000000000011000040 -:10EFC0000000000000000000000000000000000041 -:10EFD0000000000800000000000000000000000029 +:10EF90000000000000000008000000000000000069 +:10EFA0000000000000080000000000000000000059 +:10EFB0000000000000000000000000000000000051 +:10EFC000000000000000000000040000000000003D +:10EFD0000000000000000000000000000000000031 :10EFE0000000000000000000000000000000000021 :10EFF0000000000000000000000000000000000011 :10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000020000000D0 +:10F0100000840000008200000008000000000000E2 :10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000000000000000D0 -:10F0400000000000000000000000000000000000C0 +:10F030000000000400002000000000040090000018 +:10F0400000000000200000000000000000000000A0 :10F0500000000000000000000000000000000000B0 :10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 :10F080000000000000000000000000000000000080 -:10F09000000000000000000000000000000001006F +:10F090000000000000000000000000000000000070 :10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000900804A0000282048C +:10F0B0000000000000000000000000000000000050 :10F0C0000000000000000000000000000000000040 :10F0D0000000000000000000000000000000000030 :10F0E0000000000000000000000000000000000020 :10F0F0000000000000000000000000000000000010 :10F1000000000000000000000000000000000000FF :10F1100000000000000000000000000000000000EF -:10F1200011002100000000000000000000000000AD -:10F13000000000000000000000000080800000804F +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF :10F1400000000000000000000000000000000000BF :10F1500000000000000000000000000000000000AF :10F16000000000000000000000000000000000009F :10F17000000000000000000000000000000000008F :10F18000000000000000000000000000000000007F :10F19000000000000000000000000000000000006F -:10F1A0000000004109000003000000000000000012 -:10F1B000000000000000000000000000000000A0AF -:10F1C000008000800000000000000000000000003F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F :10F1D000000000000000000000000000000000002F :10F1E000000000000000000000000000000000001F :10F1F000000000000000000000000000000000000F :10F2000000000000000000000000000000000000FE :10F2100000000000000000000000000000000000EE -:10F2200000000000000101000000000000000000DC -:10F2300000000000000000000000000000001000BE -:10F24000A0058804108200000000000000000000FB +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE :10F2500000000000000000000000000000000000AE :10F26000000000000000000000000000000000009E :10F27000000000000000000000000000000000008E :10F28000000000000000000000000000000000007E :10F29000000000000000000000000000000000006E -:10F2A00000000000000000008800000001000000D5 +:10F2A000000000000000000000000000000000005E :10F2B000000000000000000000000000000000004E -:10F2C0000810000240401002000000000000000092 +:10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E :10F2E000000000000000000000000000000000001E :10F2F000000000000000000000000000000000000E :10F3000000000000000000000000000000000000FD :10F3100000000000000000000000000000000000ED -:10F32000000000000000000000000000000041009C +:10F3200000000000000000000000000000000000DD :10F3300000000000000000000000000000000000CD -:10F34000000000800080008000000000000000003D +:10F3400000000000000000000000000000000000BD :10F3500000000000000000000000000000000000AD :10F36000000000000000000000000000000000009D :10F37000000000000000000000000000000000008D :10F38000000000000000000000000000000000007D :10F39000000000000000000000000000000000006D -:10F3A000000000000000000000000000001100004C +:10F3A000000000000000000000000000000000005D :10F3B000000000000000000000000000000000004D -:10F3C000000000000020808000000000000000001D +:10F3C000000000000000000000000000000000003D :10F3D000000000000000000000000000000000002D :10F3E000000000000000000000000000000000001D :10F3F000000000000000000000000000000000000D :10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC -:10F4200000000000000000000000000000000001DB +:10F4200000000000000000000000000000000000DC :10F4300000000000000000000000000000000000CC -:10F440000000000000008801020208029000000095 +:10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC :10F46000000000000000000000000000000000009C :10F47000000000000000000000000000000000008C :10F48000000000000000000000000000000000007C :10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C -:10F4B00000E00000810A00000000000000000000E1 +:10F4B000000000000000000000000000000000004C :10F4C000000000000000000000000000000000003C :10F4D000000000000000000000000000000000002C :10F4E000000000000000000000000000000000001C @@ -180094,24 +180094,24 @@ :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB :10F5300000000000000000000000000000000000CB -:10F54000000000000000000000000FFF0F00CF05CA -:10F55000C0050000000000000000000000000000E6 +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB :10F56000000000000000000000000000000000009B :10F57000000000000000000000000000000000008B :10F58000000000000000000000000000000000007B :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B :10F5B000000000000000000000000000000000004B -:10F5C00000000000000000000000000055C355C30B -:10F5D000CFF5C0F5000000000000000000000000B2 +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B :10F6000000000000000000000000000000000000FA :10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA :10F6300000000000000000000000000000000000CA -:10F640000000000000000000000000000000C00AF0 -:10F65000CF0A40E045E50000000000000000000087 +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA :10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A :10F68000000000000000000000000000000000007A @@ -180119,21 +180119,21 @@ :10F6A000000000000000000000000000000000005A :10F6B000000000000000000000000000000000004A :10F6C000000000000000000000000000000000003A -:10F6D000C0FACFFA4AEA4FEF000000000000000035 +:10F6D000000000000000000000000000000000002A :10F6E000000000000000000000000000000000001A :10F6F000000000000000000000000000000000000A :10F7000000000000000000000000000000000000F9 :10F7100000000000000000000000000000000000E9 :10F7200000000000000000000000000000000000D9 -:10F73000000000000000000000600006000C000057 +:10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 -:10F7500000000000000000C00000000000000000E9 +:10F7500000000000000000000000000000000000A9 :10F760000000000000000000000000000000000099 :10F770000000000000000000000000000000000089 :10F780000000000000000000000000000000000079 :10F790000000000000000000000000000000000069 :10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000000000000000000FFFF4B +:10F7B0000000000000000000000000000000000049 :10F7C0000000000000000000000000000000000039 :10F7D0000000000000000000000000000000000029 :10F7E0000000000000000000000000000000000019 @@ -180150,7 +180150,7 @@ :10F890000000000000000000000000000000000068 :10F8A0000000000000000000000000000000000058 :10F8B0000000000000000000000000000000000048 -:10F8C0000000F0F000000000000000000000000058 +:10F8C0000000000000000000000000000000000038 :10F8D0000000000000000000000000000000000028 :10F8E0000000000000000000000000000000000018 :10F8F0000000000000000000000000000000000008 @@ -180158,197 +180158,197 @@ :10F9100000000000000000000000000000000000E7 :10F9200000000000000000000000000000000000D7 :10F9300000000000000000000000000000000000C7 -:10F9400000000000F0F000000000000000000000D7 +:10F9400000000000000000000000000000000000B7 :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 :10F990000000000000000000000000000000000067 -:10F9A0000000000000002000000000000000000037 -:10F9B0000000000000002000000000000000000027 -:10F9C00000000000000020004000000000000000D7 -:10F9D0000000000000002000000000010000000006 -:10F9E00000000000000000002000000000000000F7 -:10F9F00000000000000000002000000000000000E7 -:10FA00004000000000000000200000000000000096 -:10FA100000000000000000002000000000000000C6 -:10FA20000000000040000000000000000000000096 +:10F9A0000000000000000000200000000000000037 +:10F9B00000000000000000008800000000000000BF +:10F9C0000000000000000000208000000000000097 +:10F9D0000100000000000000000000000000000026 +:10F9E00000000000000000000000200000000000F7 +:10F9F000000088000000000000000000000400007B +:10FA00000000000000000000000020004000000096 +:10FA100000002000000000000000000000000000C6 +:10FA200000000000000000000000000000000000D6 :10FA300000000000000000000000000000000000C6 -:10FA400000000000000000000000000000000000B6 -:10FA500000000000000000000000000000000000A6 -:10FA60000000000200000000000000000000000094 -:10FA70000000000000000000000000400000000046 -:10FA800000000000000000000090000000000000E6 +:10FA400000000000000000000000001000000000A6 +:10FA50000000040000000090000000000000000012 +:10FA600000000000000000000000410200000090C3 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 :10FA90000000000000000000000000000000000066 :10FAA0000000000000000000000000000000000056 :10FAB0000000000000000000000000000000000046 -:10FAC00000000000000010000008100010000000FE -:10FAD0000000000000000000000000000000000026 +:10FAC000400000000000000003400200024000412E +:10FAD00000000041000000000000000000000003E2 :10FAE0000000000000000000000000000000000016 -:10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 +:10FAF0000000004000000000000000400000000086 +:10FB000002000000000002000000000000000000F1 :10FB100000000000000000000000000000000000E5 :10FB200000000000000000000000000000000000D5 -:10FB300000000000000000000000000000000000C5 -:10FB40000000000000000000800000018000800034 -:10FB500000000000000000000000000000000000A5 -:10FB60000000000000000000000000000000000095 +:10FB300000000000000800000000000000000000BD +:10FB400000008000000000000000880080008000AD +:10FB500000000000004000C00000000000000000A5 +:10FB60000000000000000000000000880000008885 :10FB70000000000000000000000000000000000085 -:10FB800000000000000000840000000000000200EF -:10FB90000004000000000000000000000000000061 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 :10FBA0000000000000000000000000000000000055 :10FBB0000000000000000000000000000000000045 -:10FBC0000000000000000000000000000000000035 -:10FBD0000000000000000000000000000000000025 -:10FBE0000000000000000000000000000000000015 -:10FBF0000000000000000000000000000000000005 -:10FC000000040000000000080000000000000000E8 -:10FC100000000000000000000009000000000000DB +:10FBC00000008800000000000000900000004000DD +:10FBD000880000000000000000000000404000031A +:10FBE000002100008800A000400000000000840008 +:10FBF0000000000500000000000000000000000000 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 :10FC200000000000000000000000000000000000D4 :10FC300000000000000000000000000000000000C4 -:10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000000000000000A4 -:10FC60000000000000000000000000000084000010 -:10FC7000000000A0002000000000000000000000C4 +:10FC400000000800000000000000000000000000AC +:10FC50000000100000000000000000000000000094 +:10FC60000000000000000000000000000000000094 +:10FC70000000000010000000000000000000000074 :10FC80000000000000000000000000000000000074 -:10FC90000000000000000000000000000000000064 +:10FC90000000000010000000000000000000000054 :10FCA0000000000000000000000000000000000054 -:10FCB0000000000000000000000000000000000044 -:10FCC0000000000000000000000000000000000034 -:10FCD0000000008001800000000000000000000023 -:10FCE0000000000000000000000000000000000014 -:10FCF00000000000000000000000002100000000E3 -:10FD000000400000000000000000000000000000B3 -:10FD100000000000004000020000000000000000A1 +:10FCB000000000001000000000000008000000002C +:10FCC00000000000000000000000000000000040F4 +:10FCD0000800000000000004004000400000000098 +:10FCE0000020C00000000000004000400000A020F4 +:10FCF00000410000001000000000000000000000B3 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 :10FD200000000000000000000000000000000000D3 :10FD300000000000000000000000000000000000C3 :10FD400000000000000000000000000000000000B3 -:10FD50000000000000202020000000000000000043 -:10FD60000000000000000000000000000000000093 -:10FD70000000000000000000000000000000000083 -:10FD80002000000000000000100000000000000043 +:10FD500000018000000800000000200000000000FA +:10FD60000000000100000000000000000000000092 +:10FD70000001000000000001000000000000004041 +:10FD80000000000000000000000000000000000073 :10FD90000000000000000000000000000000000063 :10FDA0000000000000000000000000000000000053 :10FDB0000000000000000000000000000000000043 -:10FDC0000000000000000000200020000000900063 -:10FDD0000000000000000000000000000000000023 -:10FDE0000000000000000000000000000000000013 -:10FDF0000000000000000000000000000000000003 +:10FDC000000000000000000000000000000004002F +:10FDD00000000000020200040021000000000000FA +:10FDE000A00000004000020084000000000000406D +:10FDF000C000000000000000000000000000000043 :10FE000000000000000000000000000000000000F2 :10FE100000000000000000000000000000000000E2 :10FE200000000000000000000000000000000000D2 :10FE300000000000000000000000000000000000C2 :10FE400000000000000000000000000000000000B2 -:10FE5000000000C00000000000840000000000005E -:10FE60000000000000000000000000000000000092 -:10FE7000000400082100000000000000080000004D +:10FE50000000000000008000000000000000000022 +:10FE60000000000000000000000000000000400052 +:10FE70001100000000000000000000000000000071 :10FE80000000000000000000000000000000000072 :10FE90000000000000000000000000000000000062 :10FEA0000000000000000000000000000000000052 :10FEB0000000000000000000000000000000000042 -:10FEC0000000000000000000000000000000000032 -:10FED000000000000000020000000000000000021E -:10FEE000000000020000000000000000020000000E -:10FEF00000000000000000000000000000000008FA -:10FF000000000000000000000000000000000000F1 +:10FEC00000000000000000000000000000000180B1 +:10FED00001000000010000080021000808000000E7 +:10FEE0000000000000000000820000000800000088 +:10FEF00002000100000000000000000000090000F6 +:10FF000000000000000000400000000000000000B1 :10FF100000000000000000000000000000000000E1 :10FF200000000000000000000000000000000000D1 -:10FF300000000000000000000000000008000000B9 -:10FF400000000000000000000000000000000000B1 -:10FF500000000000410002008200000008000000D4 -:10FF60000000000000000000000000000000000091 -:10FF70000000000000000000050000000000080074 -:10FF8000000002000000000000040000000000006B -:10FF90000000000000000000000000000000080059 -:10FFA000000000000000000000000000000002004F +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000080000000000000000A9 +:10FF5000200220000000400000000000000080405F +:10FF6000000000002000000400000000000000006D +:10FF7000000000000400000000000000000000007D +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 :10FFB0000000000000000000000000000000000041 :10FFC0000000000000000000000000000000000031 -:10FFD0000000000000000000000001009000000090 -:10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 +:10FFD0000000000111019100000191C189019111FE +:10FFE00084910000000000000000C0C000820008F2 +:10FFF0008420000002A0000800081088040000000F :02000004002CCE -:1000000000000000000000000000000000000000F0 +:100000000000900000000000000000000000000060 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 :1000300000000000000000000000000000000000C0 :1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000011008021EE -:100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 +:1000500000000000001109408309002189918909ED +:100060001121800800000000000000000000008056 +:100070000000000000008080000000000000800000 +:1000800000000000800000000000000000000000F0 :100090000000000000000000000000000000000060 :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000917 -:1000E0000080112100000005000000000000000059 -:1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF +:1000D00000000000000040411100000441110880B0 +:1000E00009109111C1030000000000000000000091 +:1000F000000800800000000000008005800800006B +:10010000000000000000800000000000000000006F :1001100000000000000000000000000000000000DF :1001200000000000000000000000000000000000CF :1001300000000000000000000000000000000000BF :1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:100160000000000201000084000000000000000008 -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F +:10015000000000000000000001210000000001007C +:10016000884089004109C101000000000000002012 +:100170000000002000A00010000008004000A09037 +:100180008400C0000400040008000000000000001B :10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F :1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E00000000100908802010100000000000000F2 -:1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE +:1001D000000000000000000000000000C10000015D +:1001E000010190880090018503C10000000000001B +:1001F00000009090000884840220000040900004D9 +:100200008408C0A00002002000200082000000003E :1002100000000000000000000000000000000000DE :1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:100260000000000041000080800820000000000025 -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E +:100250000000000000000000000000000009110480 +:100260000021404100802180058591C100000000EF +:10027000000000000000000000008000000080007E +:10028000008000808000008000000000000000006E :10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000001111000080000000006C -:1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED +:1002D000000000000000000000000000000021807D +:1002E000080008001111098911000500881100108B +:1002F000000000000000800000100000000000006E +:10030000000800A100000000000000400000000004 :1003100000000000000000000000000000000000DD :1003200000000000000000000000000000000000CD :1003300000000000000000000000000000000000BD :1003400000000000000000000000000000000000AD :10035000000000000000000000000000000000009D -:10036000000000000000000000010100004000004B -:10037000000000000000000000000000000000007D -:10038000000000000000000000000000000000006D +:1003600001880000010000019189891091020301B8 +:10037000000100000000000040000800200088008C +:100380000000C001840204089000000000A00004E6 :10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D :1003C000000000000000000000000000000000002D :1003D000000000000000000000000000000000001D -:1003E00000000000000000000000000000E0070026 -:1003F000820000000000000000000000000000007B -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC +:1003E0000000480000C800004200600000C8000093 +:1003F0000000008100004300000000820000430074 +:10040000000000000006000043000006008200001B +:100410004300000000000000000000000000000099 :1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC :1004400000000000000000000000000000000000AC :10045000000000000000000000000000000000009C -:10046000000000000000000000000000000000008C -:100470000000F0F00000000000000000000000009C -:10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C +:10046000000000000000000000000000F8F8F8F8AC +:10047000F0F0666600000000000000006666666638 +:100480000E0E0F0C000081C30042818001000000AD +:10049000000003100FDF000000000000000000005B :1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C :1004C000000000000000000000000000000000002C :1004D000000000000000000000000000000000001C -:1004E000000000000000000000000000000000000C -:1004F00000000000F0F0000000000000000000001C -:1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB +:1004E00000000000000000000000000000006F6637 +:1004F0006060000064600000000000000000C0C3F5 +:10050000000002020300000080C280C2C3C2434256 +:1005100000000000F310FFDF0000000000000000FA :1005200000000000000000000000000000000000CB :1005300000000000000000000000000000000000BB :1005400000000000000000000000000000000000AB @@ -180362,31 +180362,31 @@ :1005C000000000000000000000000000000000002B :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B -:1005F000000000000000FFFF0000000000000000FD -:1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA +:1005F00000003C3C0000000F808000000000000074 +:10060000000000180018000000000000082CFFFF88 +:1006100024FF2CFF000000000000FFFF000000008E :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA :1006400000000000000000000000000000000000AA :10065000000000000000000000000000000000009A :10066000000000000000000000000000000000008A -:10067000000000000000000000000000000000007A -:10068000000000000000000000000000000000006A -:10069000000000000000000000000000000000005A +:10067000000000000E0EFCFC000F00000000000057 +:100680000000000000188098000000000000002416 +:10069000FFFF00FF08FF0000000000002F6F0000B8 :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000005000A06054C00A80000EC -:1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 +:1006E00000000000000000000000000000000060AA +:1006F0000007C00C000080605000C09000050000A2 +:100700000030000000A000000E38000000000000D3 +:100710000000003800000000000000380000000069 :1007200000000000000000000000000000000000C9 :1007300000000000000000000000000000000000B9 :1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 :100760000000000000000000000000000000000089 -:1007700000000000000000000000FF0000FF00007B +:10077000082008203C3C002438043C000000AA006B :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 @@ -180394,244 +180394,244 @@ :1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 :1007E0000000000000000000000000000000000009 -:1007F000000000000000000000000000FF0000FFFB -:1008000000000000000000000000000000000000E8 +:1007F0000000082C08283C3C00813C003C00AAAAD0 +:1008000000AA00000000000000000000000000003E :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 :1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 :100860000000000000000000000000000000000088 -:100870000000000000000000000000000000FF0079 -:1008800000FF000000000000000000000000000069 +:100870000000000004081020F0F06060383C040024 +:100880001C1C201C000000000000000000000000F4 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 :1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:10090000FF0000FF000000000000000000000000E9 +:1008F00000000000000004081020F0F009093C3C52 +:1009000000002020003C000000000000000000006B :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 -:100950000000000000000000000000002000000077 -:100960002000400000000000000020000000040003 -:100970002000000000000000000000000000000057 -:100980000000000000000000040020000000200023 -:1009900021000100010001000003000000004000F0 -:1009A0000000400040000000000020002000000087 -:1009B0000000000000004000400000004000204116 -:1009C00084000000400040000000200021004000A2 -:1009D0000080000000002000200000000000000057 -:1009E00000000000000000000000200000000000E7 -:1009F00000000000000000000000000000000002F5 -:100A000041000000000000000000000000000000A5 -:100A10000000100010001000100000000000000096 -:100A200000020000000000000000000000000000C4 -:100A30000002200000004000000000000000000054 -:100A40000000000000000000000000200000200066 -:100A500000000004400040004000000000000000D2 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000800000020005 +:100970000000000000000000000000000000C000B7 +:100980000000000000000000000000000000000067 +:100990000000000000000000000200000000000055 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C000040000000000000000000400000000001F +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000002000005 +:1009F00000000000000000020000000000000002F3 +:100A00000000000000900000000000000000000056 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000082008440004000000000004000F0 +:100A40004000000000004000000000C080004000A6 +:100A50004000000040004000400000000000000096 :100A60000000000000000000000000000000000086 -:100A70000000000002000200000000000000000072 -:100A80000000000000000000000000000000000066 -:100A90000200000000000000000000000000000054 -:100AA0000000000000000000000000000000000046 +:100A70000200020000000000000000000000000072 +:100A8000080000000000000000000000000000401E +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000020044 :100AB0000000000000000000000000000000000036 -:100AC0000000000000210000000000000000000005 +:100AC0000000000000000000000002000000000024 :100AD0000000000000000000000000000000000016 :100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000020000000D6 -:100B000000000000000000000000000000000000E5 +:100AF00000000040804000000000000000000000F6 +:100B00000000800000000000000000000000000065 :100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000500B0 +:100B300000000000000000000000000000000008AD :100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 +:100B50000000000800000000000000000000000885 :100B60000000000000000000000000000000000085 :100B70000000000000000000000000000000000075 -:100B800000000000008000000000000000000000E5 -:100B90000000000000000000000000000000010054 -:100BA0000000000088000000840000000000000039 +:100B800000040005001000040080000000000000C8 +:100B90000000000200000000000000000000000053 +:100BA000000000000400000000000400000000112C :100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 +:100BC00000000000000000000000000240000000E3 +:100BD0000000000000020000000000000000000013 :100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C0000000000000000000400C000000000000020 -:100C100000000000000000000000000000000000D4 -:100C200020000000000000000000000000000000A4 -:100C300000000000000000000000000000000000B4 +:100BF00000000000000000000000410000000000B4 +:100C000000000000000000010000000200000000E1 +:100C10004000008841020000410000000000000088 +:100C20000000000000000504052000000000000096 +:100C300000C00000000000000000000000000000F4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 -:100C600000000000000000000000C00000000000C4 -:100C700000000000000000000000820000000000F2 -:100C800000000000000000000000008000000000E4 -:100C900001000080000000000000000001000100D1 -:100CA0000080018000000000000000000000000043 -:100CB000000000000000000000000000900008009C +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000400000000034 +:100C80000000000000000000000000400000000420 +:100C90000000004000000000000000000000000014 +:100CA00000000000000000090000004000040000F7 +:100CB0000000000000000000000000000000000034 :100CC0000000000000000000000000000000000024 -:100CD0000000000000000000100000000000000004 -:100CE00000000000000000000000080041000800B3 -:100CF00010000000000000000000000000000000E4 -:100D000000000000000000000000080003040800CC -:100D10000800200000040000004000000200200045 -:100D2000040000200220000000000000100000006D -:100D300010001000000000000090000000000010F3 -:100D40000000000000000004000000000800400057 -:100D50000810080041000000000000000000000032 -:100D6000000000040000000000000000000000007F -:100D70000000000000000000000000000000000073 -:100D80000000000000009000000000000000900043 -:100D9000A100000000000000200000009000C00042 +:100CD00000000000000000400000000000000000D4 +:100CE0000000000000000000000000000000000004 +:100CF0000000000000000090000002000000000062 +:100D000000000000000000000000000000010900D9 +:100D1000000000000001000000000000008400004E +:100D200000020000000000000000000000000000C1 +:100D300000000000000000000000000000000000B3 +:100D400000A000840000000000000000000000007F +:100D5000000000000000000000000000000000088B +:100D6000000800000000000000000000000000007B +:100D70000000000000000000000040000000000033 +:100D8000400000000000000400000000000084009B +:100D900088008400C0000000000400020000000081 :100DA0000000000000000000000000000000000043 :100DB0000000000000000000000000000000000033 :100DC0000000000000000000000000000000000023 -:100DD0008200000000000000000000000000000091 +:100DD0000000000000000000000000000000000013 :100DE0000000000000000000000000000000000003 :100DF00000000000000000000000000000000000F3 -:100E0000000000000000000000000000000000C022 -:100E1000000010000000000000840000000000003E -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 +:100E000000000000000000000000000400000000DE +:100E100005044090090411040900040000000000CA +:100E200000000088000000A04000000000900504C1 +:100E300000000800000000000090210000000000F9 :100E400000000000000000000000000000000000A2 :100E50000000000000000000000000000000000092 -:100E600000000090000000000000000000000000F2 +:100E60000000000000000000000000000000000082 :100E70000000000000000000000000000000000072 -:100E80000000000000000000000000001000000052 -:100E90000000000000000000000000000000000052 -:100EA0000000000200000000000000000000000040 -:100EB0000000000900000000000000000000000029 +:100E800000000000000000000000000000008800DA +:100E9000000000000000000400000000000000004E +:100EA000000000000000000000000008000000003A +:100EB000000000000800000000000000000000002A :100EC0000000000000000000000000000000000022 -:100ED0000000000000008200000000000000000090 -:100EE00000000000000000000009000000000000F9 -:100EF0000000000000001000008800000000080052 -:100F00000800000000200000000000000800800031 -:100F10000000000000000000008800000000022027 -:100F200008000000080000000000000000000000B1 -:100F30000000000000000000000000880000000029 -:100F400008900800000011000000000000000000F0 -:100F50000000000000000000000000880000000009 -:100F600008000884000000200000000000000000CD +:100ED00000210000000000000000000000000000F1 +:100EE0000000000000000000000000000000000002 +:100EF000000000000004000000000000000000905E +:100F000000000000004000000000000000000000A1 +:100F10000000000000000000000000000000009041 +:100F200002880000088400000000000000000000AB +:100F30000000004000000040000000000000000031 +:100F40000000000800000000000000000000000099 +:100F50000000000000000000000000000000000091 +:100F60000000000800000000000000000000000079 :100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F9000010000000000000001000000000000004F -:100FA000000000000000000001002084000000019B +:100F80000088000800880002000000000000000047 +:100F9000840000020000A00200080084000200900B +:100FA0000000000000000000000000000000000041 :100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 -:10101000000011002100000000001100210000006C -:101020000000000000000000000009008000000037 -:1010300000080000000000000000000000000000A8 +:1010100000000000000000000080080800050090AB +:1010200000110000000000000000000000000000AF +:1010300000000000000000000000000000000000B0 :1010400000000000000000000000000000000000A0 :101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 :101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:1010900000000000004109000003000000410900B9 -:1010A00000030000000000000000000000080080B5 -:1010B000110300000000000000000000000000001C +:101080000000000008000841028002080000000083 +:10109000000000000000000900800000000000A126 +:1010A00000800000000000000000000000000000C0 +:1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 :1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000010100000000000001CC -:1011200001000000000000000000000000000000BE -:101130000002010000880000000000000000000024 +:101100000000000000000090019100A0000100001C +:101110000000000000000000000800A00000000027 +:1011200000040002000000000000000000000000B9 +:1011300000000000000000000000000000000000AF :10114000000000000000000000000000000000009F :10115000000000000000000000000000000000008F :10116000000000000000000000000000000000007F :10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:1011900000000000000000000000A00000000100AE -:1011A00000008800000001000000000000000000B6 -:1011B0000100C088020000000000000000000000E4 +:1011800000000000000000000288000200020800C9 +:10119000000000000000000000A0004004A02008A3 +:1011A00090000000010002000000000000000000AC +:1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F :1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000020000000DF -:1011F00001000000000000000000000000000000EE +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE -:10122000410000000000000020000000000000005D -:101230000000080080808009080000000000000015 +:10121000000000000000000000000000008000004E +:10122000000000001100030080000000000000002A +:1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E -:1012600000000000000000000000000000008000FE -:101270000000080000000000000000000000000066 -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000113D -:1012A000000000000000001100000000000000002D -:1012B000000000000011110000800000000000008C +:10126000000000000000000000000000200000005E +:10127000000000000000000000000000000000006E +:1012800000000000000000000000000008822100B3 +:10129000A100900800000000000000000000000015 +:1012A00080000000000000080000000000000000B6 +:1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E -:1012E00000000000000000000000000000000005F9 +:1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000010000000000000001000000000000BB -:10133000000000000000000101000040000000006B +:1013000000000000000000000000000000000210CB +:101310000000A10003000000000000000000100019 +:1013200002000200880020008800900000000000F9 +:1013300000000000000000000000000000000000AD :10134000000000000000000000000000000000009D :10135000000000000000000000000000000000008D :10136000000000000000000000000000000000007D :10137000000000000000000000000000000000006D :10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000E00000810A000000E00000810071 -:1013B0000000000000000000000000E007008200C4 +:10139000000000000000410000000000000000000C +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D :1013C000000000000000000000000000000000001D :1013D000000000000000000000000000000000000D :1013E00000000000000000000000000000000000FD -:1013F0000000000000E0000000000000000000000D +:1013F00000000000000007000000000000000000E6 :1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:101430000000000000000000000000000000F0F0CC +:1014100000002C2C2828000300030000000000001E +:10142000000055FF55CF00000060F0505050000004 +:1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C :10146000000000000000000000000000000000007C :10147000000000000000000000000000000000006C :10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C +:101490000000000000000000000300030000000046 +:1014A00000000000FFFFFFFF000000095505550583 :1014B000000000000000000000000000000000002C -:1014C000F0F000000000000000000000000000003C +:1014C000000000000000000000000000000000001C :1014D000000000000000000000000000000000000C :1014E00000000000000000000000000000000000FC :1014F00000000000000000000000000000000000EC :1015000000000000000000000000000000000000DB :1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000FF000000FFFF000000000000000000009E +:10152000000000000000D7FFD7FF000000003000DF +:10153000C0C000000000000000000000000000002B +:10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B :10156000000000000000000000000000000000007B :10157000000000000000000000000000000000006B :10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C0000000FF000000000000000000000000001C +:1015900000000000000000000A00000C0000000035 +:1015A0000000000000000000D7FFD7FF000000008F +:1015B0003838F0F0000000000000000000000000DB +:1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B :1015E00000000000000000000000000000000000FB :1015F00000000000000000000000000000000000EB :1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:101620000000000000000000000000600006000C48 -:10163000000000600006000C000000000000000038 -:10164000000005002A06054C00A80000000000006C +:101610000000000000000000000000613006000D26 +:10162000000000000000000000000000300000008A +:10163000000000613006000D000000000000000006 +:10164000000000000000000000000000000000009A :10165000000000000000000000000000000000008A :10166000000000000000000000000000000000007A -:101670000000000000000000000000000061000603 -:10168000000D00000000000000000000000000004D -:10169000000000000000000000000000000000004A +:101670000000000000000000000000000500000065 +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000004000000A :1016A000000000000000000000000000000000003A -:1016B000FFFF000000000000FFFF0000000000002E -:1016C000000000000000FF0000FF0000000000001C +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A :1016D000000000000000000000000000000000000A :1016E00000000000000000000000000000000000FA :1016F00000000000000000000000000000000000EA @@ -180639,198 +180639,198 @@ :1017100000000000000000000000000000000000C9 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 -:101740000000000000000000FF0000FF000000009B +:101740000000000000000000000000000000000099 :101750000000000000000000000000000000000089 :101760000000000000000000000000000000000079 :101770000000000000000000000000000000000069 :101780000000000000000000000000000000000059 :101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B00000000000F0F0000000000000F0F0000069 -:1017C000000000000000000000003C3C00FF0000A2 +:1017A00000000000DFFFD0FF00000000000000008C +:1017B0000000000000000000000200000000000027 +:1017C0000000000000000000000000000000000019 :1017D0000000000000000000000000000000000009 :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 :1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:10183000000000000000F0F0000000000000F0F0E8 -:101840000000000000000000000000003C3C00FF21 +:101820000000000000005F5F505F0000000000004B +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 :101850000000000000000000000000000000000088 :101860000000000000000000000000000000000078 :101870000000000000000000000000000000000068 :101880000000000000000000000000000000000058 -:1018900000000000200020002000200000002000A8 -:1018A0002000840020000000000000000000000074 -:1018B0000000210020000000200020000000200087 -:1018C00020002000000000000000000000000000D8 -:1018D0000000200000032000000020002000000085 -:1018E00020002000000000000000000000000000B8 -:1018F0000000000020002000000020002000000068 -:101900002000200000004000000000000000000057 -:1019100010000000000800000000000000000000AF +:101890000000000000000000000000000000000048 +:1018A0000000000088000000000000004000000070 +:1018B0000000010000000000000000000000000027 +:1018C00000000000000000000000000020000000F8 +:1018D0000000010000030000000000000000000004 +:1018E00000410000000000000008000000000000AF +:1018F00000000000010000000000000000000000E7 +:1019000000000000000000090000000000000000CE +:101910000000000000800000000000000000000047 :1019200000000000000000000000000000000000B7 -:101930000000000010000000000000000000000097 -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000022000000000004100000014 -:101970000000000000400000000000000000000027 -:101980000000000000000000000200000000000055 -:101990000000000000000001000000000000000046 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 +:101930000000000020000000000000000000000087 +:101940000000000000840000000000020000000011 +:101950000000000020000000000000000000000067 +:1019600000000000000000840082008800000000E9 +:1019700000080000000820004000000000000000F7 +:101980000000000000000000000200000000000253 +:101990000000000000000004000000000000000043 +:1019A000000000000000A0000000A000A000000057 +:1019B0000000A01000000000000000000000000077 :1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 -:1019E00000000000020000000000000000000000F5 -:1019F00000000000000000000000000000000000E7 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000001000000000000000D7 :101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A30000000000000100000000000000000000096 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 +:101A10000000000010000000000000000084000032 +:101A200000000000000000000000000000000008AE +:101A3000000000000084000000840000000000009E +:101A40000000000000000000000000000000008412 +:101A50000000000000000000400000000000000046 +:101A6000000000000000000000000000000000086E :101A70000000000000000000000000000000000066 -:101A80000000000000000000030000000000000053 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000001000000000025 -:101AC00000000000000000410000000000000000D5 -:101AD00000000000000000000000012100000000E4 -:101AE0000000C000000000410000000000410000B4 -:101AF00000000000000000000000000011090000CC -:101B000000000000000000000000A0000000000035 -:101B100000080000000000000000000000090000B4 +:101A8000000000000000000800000000000000024C +:101A900000000000000800000008004000210021B4 +:101AA0000021000000410000000000210021002171 +:101AB00000210000000000000000001000100021C4 +:101AC000C010000040000005900088410000004167 +:101AD0000000000000008400880000030000840073 +:101AE000900088034000000000000000000000009B +:101AF00090000000000000000021000000210021F3 +:101B00000021000000210000002100000021002130 +:101B1000002100000021000000030000002100005F :101B200000000000000000000000000000000000B5 -:101B30000000000000000000000000002000000085 -:101B40000000000000000000000000000000000095 -:101B50000000000000C000000000000020000000A5 +:101B300000000000000000000000000005000000A0 +:101B40000900000000000004000000000000000088 +:101B500000080000000000000590090000000000DF :101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000A000C5 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA00082008200820082000000820082008200A7 -:101BB0008240820082008200000082008200820057 -:101BC0008200820082008200000082008200820087 -:101BD000000000008200820000008200820082007B -:101BE00000000000000082008200000082008200ED -:101BF000820000000000820082002000820082003B -:101C0000820000000000820082000000820082004A -:101C100082000000000082008200A000820082009A -:101C20008200000000000000000000000000000032 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000400054 -:101C5000000008004000000000000000000000003C -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000004000000000000000000004 -:101CA00000000000080000000000A0000000080084 -:101CB0000000000000000000000000000000002103 -:101CC00000000000080000000000A0000000080064 -:101CD0000000000000000000000000000000000004 -:101CE000000010000000080000000000A00000003C -:101CF00008000000000000000000000000000000DC -:101D0000000300000003084100000005A0000000DF -:101D100008000000000000000000000000000000BB -:101D200000000000010000000000000000000000B2 -:101D300000000000000000000000000000000000A3 -:101D40000000000000C000000000000000C0000013 -:101D50000000008400000000000000C000000084BB -:101D600000840000808400000400000000000000E7 -:101D70000000000000000000000000000000000063 +:101B700000000000000000000000000000000082E3 +:101B80000000000000000000030000000000000052 +:101B90000008000000000000000000080000000035 +:101BA00088000000000000000000000000000003AA +:101BB000000300110004000000000000A00000006D +:101BC00000000000A0000000000400000000000071 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000100000E5 +:101BF00000000000000000000000080000000000DD +:101C000000000000000000000000000000000000D4 +:101C100000000005000000000000000000000000BF +:101C200000000000000000000000000000000000B4 +:101C30000000000000000040000000000000000064 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000400000080 +:101C600000000000000020100090000000040000B0 +:101C70000004000000000000000000000000000060 +:101C800000000084000000000000000000000000D0 +:101C9000000000000000000000080000000000003C +:101CA0000000000000000000000000000000000034 +:101CB000900000000000000000080000000000008C +:101CC000000084210000000000000000000000006F +:101CD0008200000000000000000000000000000082 +:101CE00000000000000000000000000300000000F1 +:101CF00000080000000000000000000000000000DC +:101D000000000000000300000000000800000000C8 +:101D100000210000000000000000000000000000A2 +:101D200000080000000300000000000000000000A8 +:101D300000000000000009000002000009900000FF +:101D400000000000050000900000000000004000BE +:101D5000000011044000000000020000000000002C +:101D600000880000000000000500000000000000E6 +:101D7000000000000500000000000000000000005E :101D80000000000000000000000000000000000053 -:101D900000000000000000000090000000000000B3 -:101DA00000000000000020000000080008000800FB -:101DB0000000A0000800000000000000000000007B -:101DC00000000000000008000000080008000800F3 -:101DD0000000A00008000000000000000002000059 -:101DE00000210000000008020000000200020800BC -:101DF00008020000000008000000000000000000D1 -:101E00000000000400050000080000000021080098 -:101E100008008200000008040000400000000000EC -:101E20000000000000210020080000000000000069 -:101E300000000000000000000000000000000000A2 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB000000000000000000082000000020000009F +:101DC00000000021400200000000000000000000B0 +:101DD00000000000000000000800000400000000F7 +:101DE00000000000000000000000000000000000F3 +:101DF00000040000002100000000000000000000BE +:101E000000000008000000080000000000000000C2 +:101E1000000500000021000000410000000000005B +:101E20000000000800210008000000000000000081 +:101E30000000000000000000000000000000004062 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 +:101E600000000000000400000084000009040000DD +:101E70000900020400000000000000000000020051 :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000001000130 -:101EB000000100C00001000100C00121010041013A -:101EC000008200100001000100C0000000010001BC -:101ED000000100C00001000100C00121010041011A -:101EE000008200080001000100C0000000000001A5 -:101EF0000001000100C00001000100C0012101003B -:101F0000010100A000040001000100C00000000168 -:101F10000001000100C00001000100C00121010119 -:101F20000501008200820001000100C000000041A4 -:101F30000041004100C000410041008510412041A6 -:101F40000241008000800041004100C000000041CB -:101F50000041004100C000410041008510412009BE -:101F60000241008000800041004100C000000000EC -:101F700000410041004100C0004100410085104186 -:101F800020410241000000000041004100C000006B -:101F900000410041004100C0004100410085104166 -:101FA00020100241000000800041004100C00000FC -:101FB00041000300000000804100C0000000050057 -:101FC0000800A10000108800C100C100002000002E -:101FD00041000300000000804100C0000000050037 -:101FE0000800A1800020A0004100C1000000000006 -:101FF000000341000300000000804100C000000019 -:1020000005000200A100004091004100C100000055 -:10201000000041000300000000804100C0000000FB -:1020200005000200A1000000C0004100C100000046 -:10203000000001000100000000C00100C00000001D -:102040000000200004C00041C0004100C100004168 -:10205000400001000100000000C00100C0000000BD -:102060000000200004400041C1009100C100004078 -:102070004000000001000100000000C00100C0009D -:1020800000000000030008840041C0009100C1006E -:102090000040400001000100000000C00100C0003D -:1020A00000000000030008C00040C1009100C10012 -:1020B0000040400000C00001C0C10000000000015D -:1020C00000C0A0030041000100C1010000000001A8 -:1020D0000000000000C00001C0C1000000000001BD -:1020E00000C002030041000100C100000000000127 -:1020F00000000000000000C00001C0C1000000009E -:10210000000100C004020011000100C10100000034 -:1021100000010000000000C00001C0C1000000007C -:10212000000100C084030041000108C1010000005B -:102130000001000000000080004180C1000000009C -:102140000041008300820041004100C120000000E6 -:102150000041004000000080004180C100000000FC -:102160000041008300820041004100C100000000E6 -:1021700000410040000000000080004180C10000DC -:10218000000000410083009000C1004100C1200018 -:1021900000000041004000000080004180C10000BC -:1021A000000000410083008200C1004180C1200086 -:1021B0000000004100400000C100800080C100001C -:1021C0004100800002004100C14180008005000004 -:1021D0004100000080004100C100800080C100007B -:1021E0004100800002004100C14100008005000064 -:1021F00041000000800041000000C100800080C15B -:1022000000004100800002004100C1C18000800543 -:1022100000004100000080004100C100800080C13A -:1022200000004100800002004100C1C18000800523 -:1022300000004100000080004100C1004000C0C11A -:10224000000001000200C1000100C1838200C00043 -:10225000000001000000C0000100C1004000C0C13A -:10226000000001000200C1000100C183C000C000E5 -:10227000000001000000C00001000000C10040009B -:10228000C0C1000001000200C1000100C1098200BC -:10229000C000000001000000C0000100C1004000BB -:1022A000C0C1000001000200C1000100C1058200A0 -:1022B000C000000001000000C0000100000000009C -:1022C00000000042000000000000000081120048F1 -:1022D00007004800000000000000000000000000AF -:1022E00000000042000000000000000081120048D1 -:1022F000070048000000000000000000000000008F -:1023000000000000004200000000000000008112F8 -:102310000048070048000000000000000000000026 -:1023200000000000004200000000000000008112D8 -:102330000048070048000000000000000000000006 +:101EA0000000000000000000000000000000000032 +:101EB0000000000001000000000000000001000020 +:101EC00000C0000000000000000000000000000052 +:101ED00000000000010000000000000001010100FE +:101EE00000C0000000000000000000000000000032 +:101EF00000000000000000000000000000000001E1 +:101F0000000000C000000000000000000000000011 +:101F100000000000000000000000000000000001C0 +:101F2000010000C0000000000000000000000000F0 +:101F30000000000000004100000000000000000858 +:101F40000900008000000000000000000000000008 +:101F5000000000000000410000000000000004201C +:101F600004000080000000000000000000000000ED +:101F70000000000000000000000000000000000061 +:101F80000008040000000000000000000000000045 +:101F90000000000000000000000000000000000041 +:101FA0000008030000000000000000000000000026 +:101FB000000003000000008000008000000000001E +:101FC000820082000000000080000000000000414C +:101FD00000000300000000800000800000000000FE +:101FE000020021800020000080000000000000416D +:101FF00000000000090000000000000000000000D8 +:1020000000000900048000800000000000000000C3 +:1020100000090000090000000000000000000000AE +:10202000000009000980008000800000000000001E +:10203000001000000100000000C0000020000000AF +:102040000000100010C000020200040000000000A8 +:10205000000100000100000000C00000200000009E +:1020600000000300C0400005C000040000000000A4 +:10207000000100000000000000000000000000005F +:10208000000000000200021000C01000020000006A +:102090000000000000000000000000000000000040 +:1020A000000000000200021000C01010020000003A +:1020B0000000000000000000C00000000000000060 +:1020C00000000000004000000800000000000000C8 +:1020D0000000000000000000C00000000000000040 +:1020E0000000000000400000400000000000000070 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000100000000000000000BF +:1021100000000000000000000000000000000000BF +:10212000000000000000001000000000000000009F +:10213000000000000000000000008000000000001F +:10214000000000000000008000008000000000008F +:1021500000000000000000000000800000000000FF +:1021600000000000000000800000000000000000EF +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B00000000000000000000000800000C10000DE +:1021C000000000000000000000C10000000400004A +:1021D00000000000000000000000800000C10000BE +:1021E000000000000000000000C10000000400002A +:1021F00000000000000000000000000080090083D3 +:102200000000000000000000000000410000000984 +:1022100000000000000000000000000080000091AD +:102220000000000000000000000000410000000964 +:10223000000000000000000000000000400000C19D +:10224000000000000000000000000003C0000001CA +:10225000000000000000000000000000400000C17D +:10226000000000000000000000000003C0000001AA +:102270000000000000000000000000000000080056 +:102280000083000000000000000000000091020038 +:102290000000000000000000000000000000080036 +:1022A0000010000000000000000000000005020017 +:1022B000000000000000000000000000000000001E +:1022C000000000420000000000004800810000E023 +:1022D0000000480000000000000000420000000074 +:1022E000000000420000000000004800810000E003 +:1022F0000000480000000000000000420000000054 +:10230000000000000000000000000000000081004C +:1023100000E0000048820000000000000000000013 +:10232000000000000000000000000000000081002C +:1023300000E00000488200000000000000000000F3 :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D :10236000000000000000000000000000000000006D @@ -180847,206 +180847,206 @@ :1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC :10243000000000000000000000000000000000009C -:102440000000757B0000000000000000000000009C +:102440000000747B0000000000000000000000009D :10245000000000000000000000000000000000007C -:10246000DEAE757B000000000000000000000000F0 +:10246000DE2E747B00000000000000000000000071 :10247000000000000000000000000000000000005C -:10248000DEAE0000757B00000000000000000000D0 +:10248000DE2E0000747B0000000000000000000051 :10249000000000000000000000000000000000003C -:1024A0000000DEAE757B00000000000000000000B0 +:1024A0000000DE2E747B0000000000000000000031 :1024B000000000000000000000000000000000001C -:1024C0000000DEAE60C60300000000000000003126 -:1024D000E0000000000000000C0000000000000010 -:1024E00000C0630660C60300000000000000003169 -:1024F000E0000000000000000C00000000000000F0 -:1025000000C06306000060C6030000000000000079 -:102510000031E0000000000000000C00000000009E -:10252000000000C0630660C6030000000000000059 -:102530000031E0000000000000000C00000000007E -:10254000000000C063060000000000008800880052 -:10255000000020000000000000000000200000003B -:10256000000000000000000000000000200000004B -:10257000000020000000000000000000200000001B -:1025800000000000880000010000000000002000A2 -:1025900000000000200000000000400010002000AB -:1025A00000000000000020000000000000002000EB -:1025B00000000000200000000000000020002000BB -:1025C00000000000000020000000000000000000EB +:1024C0000000DE2E615603400000000000000231D3 +:1024D000E0000000000000000C40000000000000D0 +:1024E00002C06A866156034000000000000002310D +:1024F000E0000000000000000C40000000000000B0 +:1025000002C06A860000615603400000000000001F +:102510000230A0000000000000000C40000000009D +:10252000000002C06A8661560340000000000000FF +:102530000230A0000000000000000C40000000007D +:10254000000002C06A8600000000000000000000D9 +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000100000005B +:10257000000000000000000000000000000000005B +:10258000000000000000000000000000000020002B +:10259000000000000000000000000000000010002B +:1025A000000000000000000000000000000020000B +:1025B00000000000000000000000000000002000FB +:1025C000000000000000000000000000000000000B :1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000020000E9 -:1025F00000000000000200000000000005000000D4 -:1026000005000500000000000000000000000002BE -:102610000000004010004000100000001000000208 -:1026200000000000400040000000000040004000AA -:10263000000040004000400000004020000040003A -:102640000000404005000000000000000200000003 -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A +:1025E00000000000000000000000000000000000EB +:1025F00000000000000200000000000000000000D9 +:1026000000000000000000000000000000000002C8 +:10261000000000401000400000000000100010000A +:1026200000000000400000000000000040004000EA +:1026300000004000409040000000400000004000CA +:10264000000000004000000000000000000000004A +:10265000020000000000000000000000A0000000D8 +:102660000400000000000000000000000000000066 :10267000000000000000000000000000000000005A -:10268000000000000000000000000000000000004A -:10269000000000000000000000000000000000003A -:1026A00000000040000000000000000000000000EA -:1026B000000000000000000000000000000000001A -:1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA +:102680000000008000C00080008000030100010005 +:102690000300010000000100010001000000000033 +:1026A0000000000900000000000000000000000021 +:1026B0000008004000800000000000000000000052 +:1026C00000001000100000000000000000000000EA +:1026D0000000004000000000000000000000008436 +:1026E000000080C0000000000000000000000000AA :1026F00000000000000000000000000000000000DA -:1027000000000000000000000000000000000000C9 -:1027100000000000000000000000000000000000B9 +:10270000000000000040000900200040000004001C +:102710000400040004000008040004000400000099 :1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 -:102740000000000000000010050000000000000074 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780000000000000001000000000000000000039 -:1027900090000000000000000000000000000000A9 +:102730000000000000000004000000000000000095 +:102740000008000000080008000000000000000071 +:102750000000000000000000000000000000400039 +:102760008800000001004000000000000008100088 +:1027700040100000000040000021400084000000E4 +:10278000840000000000010000A0000040000000E4 +:1027900000000000840000000002000000000000B3 :1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 +:1027B0000000000000000000000090000041000048 :1027C0000000000000000000000000000000000009 -:1027D00000000000000003000300000000000000F3 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000008000800000000000000C9 -:102800000000000000000000800000000000000048 -:1028100000000000000000000800000000000400AC -:102820000000000000000000001000000000000098 -:102830000000000000000000080000000000000090 -:102840000000000000000000000000000000000088 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000004000000000800000000DD +:1027F00000000000000000000000000000000000D9 +:1028000000000500000000001000000900000000AA +:1028100000000000000011000000000000000000A7 +:10282000000000000000000000000008000000A000 +:102830000000000000000000000000000000000098 +:10284000000000000000000000000008000000A0E0 :102850000000000000000000000000000000000078 -:102860000000000000000000000000000040000028 -:102870000000000000000000000000000000000058 -:102880000400000000000000000000000000010043 -:1028900000800000000000000000000000000000B8 +:1028600000000010000000030491000000000000C0 +:1028700000000000000000008200000000000000D6 +:1028800000000000000000008400008801800000BB +:1028900000800000000000000000000000000002B6 :1028A0000000000000000000000000000000000028 :1028B0000000000000000000000000000000000018 :1028C0000000000000000000000000000000000008 :1028D00000000000000000000000000000000000F8 -:1028E00000000000000000000000000000000000E8 +:1028E000000000A00001008400848020000800A0F7 :1028F00000000000000000000000000000000000D8 -:102900000000000000000000000000000040000087 -:102910002000000400000000000000000000000093 +:102900000000000000000084000000000021100210 +:1029100000840020000000000000410020000000B2 :1029200000000000000000000000000000000000A7 :102930000000000000000000000000000000000097 -:102940000000000000000000000000000000000087 -:102950000000000000000000000000000000000077 -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:1029800000000000000000000000000090000000B7 -:102990000000000000000000000000000000000037 -:1029A0000000000000000000000000000000000027 +:102940000000000000000004000000000000000083 +:102950000000000000000000000000000003000074 +:102960000000004100000000000000000100000025 +:102970000008004000000000000000000000080007 +:102980000000400040000011C00000000200840070 +:10299000A1000002A000000000000004A00000044C +:1029A0000002000000000000000000000000000025 :1029B0000000000000000000000000000000000017 :1029C0000000000000000000000000000000000007 :1029D00000000000000000000000000000000000F7 -:1029E00000000000080000000000080000000000D7 -:1029F00000000000000000000000000000000000D7 -:102A000000000000080000000000000000000000BE -:102A100000000000000003000000000000000000B3 -:102A2000000000000000080000000000000000009E -:102A30000000000800000000080000000000000086 -:102A4000000000000000080000000400000000007A -:102A5000210000100000000008000000000000003D -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 +:1029E0000000000000C00000000000A01100040072 +:1029F00000000000000002001000000000000000C5 +:102A00008000000040040000000000000000800082 +:102A1000000010000005000000000000400500005C +:102A20000001000000000000000009000008000094 +:102A3000000800000000000000000000000000008E +:102A4000000000000000000000000000000800007E +:102A5000000800000000000000000000000000006E +:102A60000040000000000000000000000000000026 +:102A70000100000000080008000510000000000030 +:102A80000004400000000000200000008400C0009E +:102A90008200102100088805A00200000004200028 +:102AA00000042009000000020000000000000000F7 :102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000004000000000002 -:102AD00000000000000000000000000002000000F4 +:102AC0000000000001000000000000000000000005 +:102AD00000000000000000000000000000000000F6 :102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000020000000000B3 -:102B200000000000000000000000000000000000A5 +:102AF00000000404000000000000000000000000CE +:102B000000000000800800000000000000000084B9 +:102B10000000030080000001000000010000000030 +:102B20008000000080000000000000000000110094 :102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 +:102B40000000000000002000000000000000000065 :102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B90000000000000000100000000000000000034 -:102BA0000000000000000000000000000000000025 +:102B600000000000000000000000000000009008CD +:102B700000880088901000000000000000000000A5 +:102B80000000000000000000000000010000C0087C +:102B90000021008420080000880004C0000000001C +:102BA000000082009001000000000400000000000E :102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 +:102BC0000000000000000000000000000000000104 :102BD00000000000000000000000000000000000F5 :102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C10000000000000000000110021000000000082 -:102C200000000000000000000000000000000000A4 +:102BF00000000000000080800000000000000000D5 +:102C0000000000000000000000080000001000208C +:102C100080090010008300201110A1048009000821 +:102C200000000000080820080008000080000000E4 :102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 +:102C40000000000000000000000000080020000854 +:102C50000010000000000000000000000000000064 :102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C900000000000000000000000004109000003E7 -:102CA00000800000000000000000000000000000A4 -:102CB0000000000000000000000000000000000014 +:102C7000000080000010008880800000000000003C +:102C800000000000000000000000000000080080BC +:102C9000000080000080808000001080850004001B +:102CA00041830000030004000300030300000080D0 +:102CB0000000008000000000000000000000000094 :102CC0000000000000000000000000000000000004 :102CD00000000000000000000000000000000000F4 :102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D10000000000000000000000000000089010029 -:102D2000000000880000000000000000000000001B -:102D30000000000000000000000000000000000093 +:102CF0000000000088009001888408900000000017 +:102D000000000000000000000000000000000001C2 +:102D1000001000000800200808A02040000210C099 +:102D2000000001090000002000C0000001A1000017 +:102D3000000200000004000000000000000000008D :102D40000000000000000000000000000000000083 :102D50000000000000000000000000000000000073 :102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 +:102D7000000000000000080800900010081000008B :102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA000880000000100000000000000000000009A -:102DB0000000000000000000000000000000000013 +:102D9000000000000000A00400200040A008000186 +:102DA00001000410000100000100010040010000CA +:102DB00000000000C0000000000000000000000053 :102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 +:102DD00000000100000000000000000000000000F2 :102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 +:102DF00000000000000000000000000000801180C2 :102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E20000000000000004100000000000000000061 -:102E30000000000000000000000000000000000092 +:102E100000001100080000008080000020808080F9 +:102E20000910410320A0004100000405400983214E +:102E300000400000000080000000000000000000D2 :102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 +:102E50000000000008000800000000000000000062 :102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 +:102E70000000000000000000000000008080808052 :102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000110000000000000000000011 -:102EB0000000000000000000000000000000000012 +:102E90000000800000000000000000100000008022 +:102EA00080002100201008000805000021202011CA +:102EB00004000504001000210000000000000000D4 :102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 +:102ED00000000000000800000000000000000000EA :102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000010000000000000000A0 -:102F30000000000000000000000000000000000091 +:102EF000000000000000000000000000080008A022 +:102F00008484200000000000000000000000000099 +:102F10000000000004008400080088002001202038 +:102F2000000204000102000100000100000001890C +:102F3000010000000001000000000000000000008F :102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 +:102F50000000000000000001000000000000000070 :102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 +:102F70000000000000000000000000000000001140 +:102F800000004300000000000000000000000000FE :102F90000000000000000000000000000000000031 -:102FA000000000000000000000E00000814100007F -:102FB0000000000000000000000000000000000011 +:102FA000000000008800410000C8430082000000CB +:102FB000410000C843000000000000004300001171 :102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 +:102FD0000000000000000000810000C800000000A8 :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 +:10300000FFFFE7FFCFDFDFDF000000000000000070 +:103010000000000000000000F0D0909000000000D0 +:1030200099FF81FF00069006000000000000FF00ED :103030000000000000000000000000000000000090 :103040000000000000000000000000000000000080 :103050000000000000000000000000000000000070 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 +:103080000000FF7EFDFF00000000000000000000C7 +:1030900000000000000000000000F0F0F0F0000070 +:1030A000000099FF81FF4242D24200000000000070 +:1030B000FF00000000000000000000000000000011 :1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 :1030E00000000000000000000000000000000000E0 @@ -181059,490 +181059,490 @@ :10315000000000000000000000000000000000006F :10316000000000000000000000000000000000005F :10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F +:10318000000000000000000002007C7F7C7C00004A :10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F +:1031A0000000000000002C0C2C2C464606060F0FD9 +:1031B00000000F0F000000000000000000000000F1 :1031C00000000000000000000000000000000000FF :1031D00000000000000000000000000000000000EF :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE +:103200000000000000000000000000003C3C3C3CCE :1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E +:103220000000000000000000200C202C46467666BE +:103230000F0F00000F0F0000000000000000000052 :10324000000000000000000000000000000000007E :10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E :10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E +:1032800000000000000000000000000000300010FE :10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000400006000C0000000000000000BC -:1032C00000000000000000000000000000000000FE +:1032A000000000610006000D000000613006000D06 +:1032B000000005612A0EC54C00A8000005610A0D3A +:1032C000C50900A000000A08050000A000000000D9 :1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE +:1032E0000000000000610002C00D000000000000AE :1032F00000000000000000000000000000000000CE :1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD :10332000000000000000000000000000000000009D -:103330000000000000005555FFFF000000000000E5 -:10334000000000000000000000000000000000007D +:10333000000000007F3E5F0AAF0F14000000808095 +:10334000BCBC30FF28FF00000000000000000000AF :10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D :10337000000000000000000000000000000000004D :10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D :1033A000000000000000000000000000000000001D -:1033B0000000000000000000555500000000000063 -:1033C00000000000000000000000000000000000FD +:1033B0000000000000003B3D0B050F0F1400000053 +:1033C000C380FFBC00FF28FF0000000000000000D9 :1033D00000000000000000000000000000000000ED :1033E00000000000000000000000000000000000DD :1033F00000000000000000000000000000000000CD :1034000000000000000000000000000000000000BC :1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000F0F00000AC -:10344000000000000000000000000000000000007C +:103420000000000000000000F0F0FFFF00000000BE +:10343000C3FF033F00000000878787AF0A0A040527 +:1034400000003C3C3C3CC00082000000000000004A :10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C +:103460000000000000000000000000C00424000074 :10347000000000000000000000000000000000004C :10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B0000000000000000000000000000000F0F02C -:1034C00000000000000000000000000000000000FC +:1034A00000000000000000000000A3A3AFAF000078 +:1034B00000000000000000000000D7D7D7FF0A0A74 +:1034C00000000000B2F3B2F3FC00BE0000000000F8 :1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC +:1034E00000000000000000000000000000C00427F1 :1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:10351000000000002000000000000000000000008B -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000000000000001000000000000000000007A -:10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000020000F9 -:1035D00000000000000010020000000000000000D9 -:1035E000000000000000000040000000000000009B +:10350000000000000000000000000000200000009B +:1035100008000000000000000000000000000000A3 +:1035200000000000000000008800000020000000F3 +:103530000200000000000000000000000000000089 +:1035400000000000000000008400200000002000B7 +:1035500000008400C0000000000000000000000027 +:1035600000000000880002000000000000002000B1 +:10357000000000000000400000000000000000000B +:1035800000000000200000000000000000004000DB +:1035900000008000000000000000000000000000AB +:1035A0000000000000000000008200000000000099 +:1035B000000080001000000000000000000000007B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000200004000000000000000A9 +:1035E00000000000000000000000000000000000DB :1035F00000000000000000000000000000000000CB -:103600002100000004000000000000000000000095 -:1036100000000000000000000000000000000000AA -:103620000000100000030004000000000000000083 -:103630000200000000000200000000000000000086 -:103640000000000000000000000200000000000078 +:1036000000000000000000000000000400040004AE +:103610000000080000008204820082008204000092 +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:103640000000000000000000000300000021000056 :10365000000000000000000000000000000000006A :10366000000000000000000000000000000000005A -:10367000000000000000000000000000000000004A -:103680000000000002000000000000000000000038 -:10369000000000000000000000000000000000002A -:1036A0000000000080000000000100000000000099 -:1036B0000000000000000200000000000000000008 +:10367000000001800100040004008200000000003E +:10368000000000000000000900000000000100012F +:103690000001000000000000000100000000000127 +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A :1036C00000000000000000000000000000000000FA :1036D00000000000000800000000000000000000E2 :1036E00000000000000000000000000000000000DA -:1036F00000000000000800000000000000000000C2 -:103700000000000000008000000000000000000039 -:1037100000000000000000000000000008000000A1 -:103720000000040000000000000000000000000095 -:103730000000000000080000000000000800000079 -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 +:1036F00000000000040404008900800000020000B3 +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 +:10372000000000000000000000040005002100056A +:103730000000000004008800000084000041000038 +:103740000000004100000000000000000000000038 +:1037500000000000900000000000000000000008D1 :103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 :103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 +:103790000000000000000000000000000000200009 :1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 +:1037B00000000000400080001000110005004100E2 +:1037C00000000500000009000000030000020000E6 :1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 +:1037E00000080000000000000000000000000000D1 +:1037F00000000800000000000000000000000000C1 :1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:103820000004000000000000000000000000000094 -:103830000000000000000000000000000000000088 -:1038400000000000000000000000000001000080F7 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000002018 -:103890000020000000000000008800000000000080 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000002000D8 -:1038D00000040000000000000000000000000000E4 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 +:103810000000010021000100A000002000000000C5 +:1038200000110000C00000000000000000000000C7 +:103830000000000000000000000000000880000000 +:1038400000000000000000800000000000000000F8 +:103850000000000000020000000000000000400026 +:10386000040000000000000000000000C000820012 +:103870000000000000000000004000000000000008 +:103880000800000000000000000000000000000030 +:10389000000000002000A000200000000001000047 +:1038A000000000000000118800000000000000007F +:1038B00000000000000000000000000400C0004004 +:1038C0000040000000C00088001000000000000060 +:1038D00000000000000040000000000000000000A8 +:1038E0000000000000000000000000880000000050 +:1038F0000000000000000000000000004100000087 :1039000000000000000000000000000000000000B7 -:1039100000010001000000000000000000000000A5 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000000000000000000090000080000067 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:10399000000008000000000000000000000000001F -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000C00000000000C000086F -:1039D0000000008400000000000000000000000063 -:1039E00000000000000000000000000000000000D7 +:103910000000000000000000200420004020C00043 +:103920001008040000000400000000040011000062 +:103930000003000000000003000000000008100069 +:1039400090000000000000000000000000000000E7 +:103950000000000000000000000000000011000056 +:1039600000000000000000000000A00000000000B7 +:103970000000000000000000080008000000000037 +:103980000000000000000020000000000000000017 +:1039900000000000000000000000800180008001A5 +:1039A0000000800180000200800000881189000072 +:1039B0000000000000000000000000000000009077 +:1039C00010880000000005000000000000000084D6 +:1039D00009000090050000000000110200040090A2 +:1039E00000000000000000000000000000001100C6 :1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A10000000000080000000000000000000000026 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000264 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 +:103A00000000008808040000000000000000000022 +:103A10000000000000000000200020000000000066 +:103A20000002C0040008000000040000000900209B +:103A30000000000000000000000000000000002165 +:103A40000000001100000000000000000000000065 +:103A50000000000000000000000000210000000045 +:103A6000000000000000080000000000000000004E +:103A7000000000000000000000000000080000003E :103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 +:103A900000000000000000008200800080000000A4 +:103AA000000000010001000100000001000000888A +:103AB00000010000000000000000000000400000C5 +:103AC0000000200002C00040000041000000000093 +:103AD0000000008200000000000000000000000064 +:103AE000000000000500000400004000000000008D +:103AF00005000000000000000000000000000000C1 +:103B00000000000000C000000000000000000000F5 :103B100000000000000000000000000000000000A5 -:103B20000000000000000000000000000000000095 -:103B30000000000000000100C000000000000000C4 -:103B40000000000000000000000000000000000075 -:103B50000000000001000000000000000000000064 +:103B20009001000000410004900200050202000222 +:103B30000010020200000000000000000000000071 +:103B40000000000001000000000000000000000074 +:103B50000000000000000000000000000000000065 :103B60000000000000000000000000000000000055 :103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B900000000000000009002000000002000000FA -:103BA0000000000000000000000000000000000015 -:103BB000000000000000000009008000000000007C -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000011002100000000000000B3 +:103B80000000000000000101200100000001000011 +:103B9000000000000000000000000000000000091C +:103BA00041098011000400C111038003001000804E +:103BB0000080110080800000000000000000000074 +:103BC00000000000000010000000000000000000E5 +:103BD00000000000000000000000000000000000E5 :103BE00000000000000000000000000000000000D5 :103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C1000000000000000000089008000000000009B -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000004109000003008097 +:103C000000000000000000001110801000400010B3 +:103C100000000000000000000000000000000000A4 +:103C2000108083009111109111808341A0900400B5 +:103C300080418004000280000000000000000000BD +:103C4000000000000000000000000008000000006C +:103C50008000800000000000000000000000000064 :103C60000000000000000000000000000000000054 :103C70000000000000000000000000000000000044 :103C80000000000000000000000000000000000034 -:103C900000000000000000000000000000008000A4 -:103CA0008080000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000101000000E2 -:103CE000008800000000000000000000000000004C +:103C900000800000000000000000000000000000A4 +:103CA00000001110830091002091100840000808C6 +:103CB00002000201020000000200000000000000FB +:103CC000000000000000000000000000000100886B +:103CD000000002000200A000C00000000000000080 +:103CE00000000000000000000000000000000000D4 :103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D1000000000000000000000000000080000009B -:103D20004000C08200000000000000000000000011 -:103D30000000000000000000000000000000000182 -:103D40000000010100000000000000000000000071 -:103D500000000000000000000000000000008800DB -:103D60000000010000000000000000000000000052 +:103D00000000000000000000000000000000004073 +:103D10000000008200000000000000000000000021 +:103D2000000000000000000110010100400000A0A0 +:103D30001001100090028890004000020000000076 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 :103D70000000000000000000000000000000000043 :103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000001013 -:103DA0000008840801C000000000000000000000BE -:103DB0000000000000000000000000000000000201 -:103DC0000008001011410000000000000000000089 +:103D9000000084000100000000000000000000009E +:103DA00000000000000000410011090511208003FF +:103DB00005A1000900028080008000001180000041 +:103DC00000000000000000000000000000000000F3 :103DD00000000000000000000000000000000000E3 -:103DE0000000000041000000000000000000000092 +:103DE00000000000000000000000000000000000D3 :103DF00000000000000000000000000000000000C3 :103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000080000080802180000000000000000071 -:103E30000000000000000000000000000000000082 +:103E100003000500880020000000000000000000F2 +:103E20000000000000000000418003910380101199 +:103E300090A1210009000309800880008080000013 :103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000201100000000000000000000000021 +:103E500080000000000000000000000000000000E2 +:103E60000000000000000000000000000000000052 :103E70000000000000000000000000000000000042 :103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000010100000000000000000000D0 +:103E90000000000000110000000000000000000011 +:103EA0000000000000000000000000C0019101843B +:103EB000010141A104040310100002010404029056 +:103EC00040000000000000000000000000000000B2 +:103ED0000000C0000400200090000000002000044A +:103EE00000000000000000000000000000000000D2 :103EF00000000000000000000000000000000000C2 :103F000000000000000000000000000000000000B1 :103F100000000000000000000000000000000000A1 -:103F2000000000000000000200000000000000008F -:103F30000000000000000000000000000000000081 -:103F400000000000000000E0000000210000000070 -:103F50000000000000000000000000000000000061 -:103F600000000000000000E00000814100000000AF +:103F2000000000000000000000000000418200C806 +:103F300043008100418200C843000000008100C8A6 +:103F400043006000000000000000000000000000CE +:103F500000000000004100004300000000000000DD +:103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA00000000000000000000000430000000000CE -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 +:103F9000000000000000410000C8430000000000D5 +:103FA0000000000000000000000000000000000011 +:103FB000000000000000555500000F0F0F0FFCFC23 +:103FC00000FFBAAABAAA000000000000000000002A +:103FD00000000000000004000002000000000000DB :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000FFFF92 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 +:104020000000000000000000000000000000000090 +:1040300000000000000000000210A0A00F0F0F0FF2 +:104040000C0C00003028F3EB000000000000000022 :104050000000000000000000000000000000000060 :104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 :104080000000000000000000000000000000000030 :104090000000000000000000000000000000000020 -:1040A00000000000000000000000000000009682F8 -:1040B000FBFB00000000000000000000000000000A -:1040C00000000000000000000000000000000000F0 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000F0F0F0FF3FB33710080B2 +:1040C00000D00FCF00CF5454F4F4000000000000E3 :1040D00000000000000000000000000000000000E0 :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 :1041000000000000000000000000000000000000AF :10411000000000000000000000000000000000009F :10412000000000000000000000000000000000008F -:10413000AA001400000000000000000000000000C1 -:10414000000000000000000000000000000000006F +:1041300000000000000000008F070F071838DECFD6 +:10414000001FE00F0F0C000C54540404000000008A :10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F +:10416000000000000000000000400000000000000F :10417000000000000000000000000000000000003F :10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F :1041A000000000000000000000000000000000000F -:1041B0000000AA0014000000000000000000000041 -:1041C000000000000000000000000000000000618E -:1041D00000060008000000000000000000000000D1 -:1041E000000000000000000000000000000000408F -:1041F0000006000C000000000000000000000000AD +:1041B00000000000000000610030C001000000614C +:1041C0000034C001000000610037000D0000000055 +:1041D00000000000000000000000000000001000CF +:1041E000003000000000000000000000000000009F +:1041F00000000000000000000000000000000000BF :1042000000000000000000000000000000000000AE :10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:1042300000000000059000A8000000000000000041 -:10424000000000000000000000000000000000006E -:1042500000000000FF0FAA3C00000000000000006A +:1042200005610A0AC50D00A00000000000000000A2 +:10423000000000000000000000005A1F7D00FF0089 +:1042400001F101010AC3FAFF0000000000000000B4 +:10425000000000000000000000000000000000005E :10426000000000000000000000000000000000004E -:104270000000FF00FFFF0000000000000000000041 +:10427000000000000000000000000000000000003E :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E :1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D000000000000000000FAA3C000000000000E9 +:1042B0000000000000000000000000005A0F7C0019 +:1042C000FE0001F101010A00FAFC000000000000FC +:1042D00000000000000000000000000000000000DE :1042E00000000000000000000000000000000000CE -:1042F00000000000FF0000000000000000000000BF +:1042F00000000000000000000000000000000000BE :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D :10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D +:104330000000000000000000000000000C0C0C0C4D +:10434000AA55000000410202000CFFFF000000001F :10435000000000000000000000000000000000005D :10436000000000000000000000000000000000004D -:104370000000000000000000F0F00000000000005D +:10437000000000000000000000000000000000003D :10438000000000000000000000000000000000002D :10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED +:1043A000000000000000C044C02400000000000025 +:1043B00000000000000000000000000000003C3C85 +:1043C000FF00AA51000000410202828EB2BE00002E :1043D00000000000000000000000000000000000DD :1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000F0F000000000DD +:1043F00000000000000000000000000000000000BD :1044000000000000000000000000000000000000AC :10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C +:104420000000000000000000C012C13300000000C6 :10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C +:10444000000000000000200000000000000000004C +:1044500001000000000010008800000000000000C3 +:104460000000080000002000000000000420008080 :10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000100000000000EC +:10448000000200800000008020800000000020006A +:104490008800000000000000C0000000000088004C +:1044A00000000000000000002000000000000000EC +:1044B00000000400040004000000000000002000D0 :1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000020000000000000000CA -:1044F000000000000000000000000000400040003C -:104500000000000000001000000200000000400059 -:104510004000000000004000400200004000400059 -:10452000400000004000000040000000400040004B -:1045300000000000000040004000000040000000BB -:10454000400000000000000000000000000000002B -:10455000000000000000000000000000000000005B +:1044D000000020000000000080000000000000023A +:1044E00000000000800000020000000000008001C9 +:1044F000001000000000000000000000400040002C +:10450000000000000004000000040004000040005F +:10451000000000000000400040000000400040009B +:10452000400000004000000040000000000040008B +:104530000000000080008000C0002000400000005B +:104540004000000000000000000000000002000029 +:1045500000850000010000000200828300000000CE :10456000000000000000000000000000000000004B :10457000000000000000000000000000000000003B -:10458000000000000000000000000000001000001B -:10459000000000000000000000000000000000001B +:104580000000000000030000000000000800000020 +:1045900000000000000000000000041000100000F7 :1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB +:1045B00000000000000008000000001000100000D3 +:1045C00000000000000000000000000000000001EA +:1045D00000000008000020000000000000040000AF :1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000020000000000B9 -:1046000000000000000000000000000000080000A2 -:104610000000000000080000000000000000000092 -:104620000000000000000000000000000008000082 -:104630000000000000080000000000000000000072 +:1045F00000000004000000000000000000000000B7 +:1046000000000000000000000000000000000000AA +:10461000000000000000000004000400000004008E +:104620000000040004000400000000000000000876 +:104630000000000000000000050000000000000075 :10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:104670000000000000080000000000000000000032 -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A +:104650000000000000800000840090009000000036 +:10466000820000000021000500108441004100404C +:10467000900000100420A000820000000000C00094 +:10468000000000000000820000000100080004009B +:104690004004000000800100001000000000000045 :1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000008C2 -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 +:1046B00000004000000008000800000000000000AA +:1046C00000000000000000000000000000001100D9 +:1046D00000820000000000080084000000820084C6 +:1046E00000A0000000A00000000000010000000089 +:1046F000050103000088C101000000000000000067 +:10470000080000000000000000000000020000009F +:1047100080000409000000100200000100000000F9 :104720000000000000000000000000000000000089 :104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000400000000000000000000009 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 +:104740000000000000001000410005000000000013 +:10475000000000004002000000000000000008000F +:10476000400000008200000000000000A0000010D7 +:1047700000400380000000100011A00000000005B0 +:10478000000000000020004000408220000000C027 +:104790000080000201800000000010000080000086 :1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 +:1047B00000000000080000000000000000000002EF +:1047C00000000000100000000000000000000000D9 +:1047D0000000000000008001000000000000050053 +:1047E00080008000020000000000000000000000C7 +:1047F00000C1008482400000000141000000000070 +:1048000000000000000000010001000100010000A4 +:104810000005002000011020000000000000002022 :104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 +:104830000000000000000000000000000000080070 :104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 +:10485000000000000000000000000000010800004F +:10486000008000000000100082099000000000009D +:10487000A0000800820584000800408000A00041DC +:104880000009000000008205000000000000000098 +:104890000000A00404A040044088000400040000BC +:1048A0000100000000000000000000000000000007 :1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E000000000000000000000000000000000A028 -:1048F00000000000000000000000000000000000B8 -:10490000000000000000000000C000000000008463 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000020000000015 -:1049A0000000000000000000000000000000000007 +:1048C0000000000000000000820000000000000066 +:1048D0000000000000000084100003000000100928 +:1048E00021000004008800A080A003000000000058 +:1048F0000000000080000000000085008010002102 +:104900000200000000000000030008000000110089 +:1049100003000000000100218001002100000000D0 +:104920000000040000000000000000200000000063 +:104930000000000000000000000000004000000037 +:1049400008880800000000000000000000000000CF +:104950000000000000000000000010000000400007 +:10496000000800000080000000000021830000001B +:10497000402100000000024102000340000000103E +:1049800000A000000000000000000009200000203E +:1049900000000040000000020010011000A00040D4 +:1049A0000000004000090040000900000000000075 :1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 +:1049C000880002000000000000000000000000005D :1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00002040000000000000000000000000000B1 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 +:1049E0008000000000000004000000040000080037 +:1049F00000004002000000008000800082010000F2 +:104A0000000100210000000000000000000008007C +:104A10000001000000830000050100010401000501 +:104A2000000100020001030000000000000000007F :104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 +:104A400000000000080000004000000021000000FD +:104A50000000000005000000000000000000000051 +:104A6000000100010001000101A02104408400C0F8 +:104A7000000000000000000002C041050808898312 +:104A800084C10005020408020000000000000000CC +:104A9000C0C0004000A0884000009040A0910010DD +:104AA000821002A0088200C0004000000000000048 :104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 +:104AC0000000000000000000000001C0048200841B +:104AD000C010000000000000000000000000000006 +:104AE000000000410002000200021182A1A180101A +:104AF00000004000000000000000808483038085E7 +:104B0000218880A0080380110085000000000000BB +:104B1000000080800080008000000000008980216B +:104B2000098080108080000000000000000000006C :104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 +:104B400000000000000000000000000010808080D5 +:104B50000080800000000000000000000000000055 +:104B60000000000000000000000000020200080336 +:104B70000200098300000009008000000000000915 +:104B800000A180008300A0418580C12100000000B9 +:104B900000000000000080038011808000004100C0 +:104BA000100011031080000080048080800000004D :104BB00000000000000000000000000000000000F5 :104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 +:104BD0000041000000800000000000000000000014 +:104BE0000000000000000010000000000000002095 +:104BF00001010000018900000000004000000000E9 +:104C00008800000902201004100102C0058900007C +:104C10000000000000000200100102C0C0100000EF +:104C2000001001000001000808000201A00282003B :104C30000000000000000000000000000000000074 :104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 +:104C500000000001000000C0000000000000000093 +:104C60000000000000000000000000000100000043 +:104C70008800000100001101000000000000000099 +:104C8000A010004110C18889029000049185090399 +:104C90000000000000000000880000C00810C008EC +:104CA000000108080010001009C0080000080008F2 +:104CB00004000000000000000000000000000000F0 :104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 +:104CD0000000C0400020C04000C0000000000000F4 +:104CE00000000000000000000000000000000900BB +:104CF0000000000000030009114000000000000057 +:104D000000008085200803038088802003A1C0A1C3 +:104D100089900000000000000000000000000080FA +:104D200091800001808000800000418080000000B0 :104D30000000000000000000000000000000000073 :104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 +:104D50000000000080800080808000800000000053 +:104D60000000000000000000000000002100100012 +:104D700004001000418421008900401000008000E0 +:104D800000008000800000A100008000A10990A127 +:104D90001100C0400000000000000000800980C138 +:104DA000008000000001410010411100030880084C +:104DB000000980000000000000000000000000006A :104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 +:104DD0000000000000008041800080208000000072 +:104DE00000000000000000000000000000000100C2 +:104DF00000000000000001C1000008004000880021 +:104E0000020082001000C00004A12020880041019F +:104E100002A1A1C005000000000000000000C000C9 +:104E200008104040020000010100000100000000E5 +:104E3000C001A0880288900000000000000000006F :104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 +:104E50000000000000000000C00120004000A00091 :104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 +:104E7000410000C800000000410000C800004200DE +:104E800000000000000000000021000043000000BE +:104E9000008200004300418100000000000000008B +:104EA00000820000430084120000418200C84300D9 +:104EB000428200810000430000000000000000006A :104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 +:104ED00000000000000000000000000000000700CB +:104EE0004842000000000000000000000000000038 :104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000000000000000000000000000000071 +:104F000000000B0BEFEB0000000000047E81C1C02D +:104F1000C3C3FFFDBDBDFDFDC1C100000000000019 +:104F200000003636FF0F0000000000000000000007 +:104F300071F05A99FF662020099909990000000034 :104F40000000000000000000000000000000000061 :104F50000000000000000000000000000000000051 :104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 +:104F70000000000000000000000000003030303071 +:104F8000000000000303F3F30000000000007E8136 +:104F9000F9F0FFFFFFFDBD00FF00FF000000000073 +:104FA000000000003636F00000000009000000009C +:104FB000000071965A66990020200999099900000D :104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 @@ -181553,495 +181553,495 @@ :105030000000000000000000000000000000000070 :105040000000000000000000000000000000000060 :105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 +:105060004108400000840100000000000000000032 :105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 +:10508000242F262F00000000000000000000000078 +:10509000C3C399000000000066FF06060F0D0F0F46 +:1050A00000000000000000000000E7E73C0F66FF82 +:1050B00000006956699600000000DB30183030307F +:1050C000F0F0000000000000000000000000000000 :1050D00000000000000000000000000000000000D0 :1050E00000000000000000000000000000000000C0 :1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F +:105100000000000F020F000000000000000000007F +:105110000000C3CB99000F0F090942C306060F0F09 +:105120000F0F00000000000000000F0024243C0FBF +:10513000660000006556659600000000DBF318F37A +:10514000303070300000000000000000000000005F :10515000000000000000000000000000000000004F :10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF +:105170000000000000000000000000000021000608 +:10518000C00D000000610002C00920000000000006 +:1051900000000000A0612036000D000100615036C3 +:1051A000000D00000000000000000000100050385A +:1051B0000000000800000061003BC09500A0A000B6 +:1051C0000038001000000000000000000000000097 :1051D00000000000000000000000000000000000CF :1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E +:1051F0000000000000000000000000000000FF03AD +:105200000F0F0000000000F4AAAA55FF555500003A +:1052100000000000000000000000C3D7C3870AAAF6 +:10522000FAAA80D500550000000000000000000030 +:1052300000000000000000001C0C663600000000AA :10524000000000000000000000000000000000005E :10525000000000000000000000000000000000004E :10526000000000000000000000000000000000003E :10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE +:10528000050005000000000000F00000F0F0F0F064 +:10529000000000000000000000000000FFFFFFFF12 +:1052A00003030303A0F5A0F50000000000000000C8 +:1052B000000000000000000000001C0C663600002A :1052C00000000000000000000000000000000000DE :1052D00000000000000000000000000000000000CE :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D -:10531000000000000000000000000000000000008D -:10532000000000000000000000000000000000007D -:10533000000000000000000000000000000000006D -:10534000000000000000000000000000000000005D +:1053000000000000C3C300000000FF0FFF000F07F4 +:105310004F0F0000000000000000AF22AF27000088 +:105320000000F7D775550FFF0BEB000000000000E1 +:105330000000000000000000000000003C3C3CC3F6 +:1053400020AAA0AA00000000000000000000000049 :10535000000000000000000000000000000000004D :10536000000000000000000000000000000000003D :10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED -:1053C00000000000000000000000000000000000DD +:105380000000000000C00C0000000000FF0FFF0044 +:105390000F070F070000000000000000F572F5770E +:1053A00000000000141414140FFF0BEB00000000A9 +:1053B00000000000000000000000000000003C3C75 +:1053C0003CC320AAA0AA00000000000000000000CA :1053D00000000000000000000000000000000000CD :1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD +:1053F0000000000000000000000000000000C000ED :10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C +:105410000000000010000000210000002004000037 :10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000016B -:10544000000000000000000000000000000000005C -:10545000000000000000000000000000000000004C +:10543000000000002000000020000000000000002C +:105440000000000000000000000000000000C0009C +:105450000000000000008800000000000000C00004 :10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C +:10547000000000804000008000004000400020004C :10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C +:1054900000000000000000000000200000000001EB :1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000002EA -:1054C00000000000000000000000000000000002DA -:1054D000000040000000000000000000000000008C -:1054E00000000000000000000000000000000000BC -:1054F00000000040000040000000004000004000AC +:1054B00000000000000200000000000000000000EA +:1054C000000040000000000000000000000000009C +:1054D00000000000000000000000000000000000CC +:1054E00000001000000000000000000000000000AC +:1054F000000000400010000000400000000000001C :10550000000000000000000000000000000000009B -:10551000001000000000000000000000000000007B -:10552000000000000000000000000000000000007B +:105510000200820002000200000000000200900071 +:10552000200000000000000000000000000000005B :10553000000000000000000000000000000000006B -:105540000000000200000000000000000000020057 -:10555000000000000000000000000000000000004B +:105540001000000300000000000000000000000048 +:1055500000030080000000000000000000000000C8 :10556000000000000000000000000000000000003B -:1055700000000000000000000000000040000000EB -:105580000041004100000000000000000000000099 +:1055700000100000C1000100010000000000020056 +:10558000000000000000000000000000000000001B :10559000000000000000000000000000000000000B -:1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C00004000000000000000000000000000000D7 -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB -:1055F000000000000000000000000000000080002B -:10560000000000000000000000000000000000009A -:10561000000000100000000000000000000000007A -:10562000000000000000000000000000000000007A -:10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:1056800020000000200000000000000000000000DA -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA +:1055A000000080000000000000000000000000007B +:1055B00000000008000000000000000000000000E3 +:1055C0000000000000000000008400820000410094 +:1055D00000000000002000000008000000000000A3 +:1055E00000000000004000000084000000000000F7 +:1055F0000000000000040200048204000000040017 +:105600000004040000000000000000000000000092 +:10561000000000000000000000000000000000008A +:105620000100000021800000000000084000000090 +:105630000000000000000000000000000000010069 +:105640000000002100000000000000080000200011 +:105650000000000000020000000000210000000027 +:1056600000000008000000000000004000000000F2 +:105670000000000000000800000000110100000010 +:10568000000000000080000000000000000000009A +:1056900021000000000000080000008400000084D9 +:1056A000000020820000A0040800020000000000AA +:1056B0000000000000A00000000000A000000000AA +:1056C000400000000000000000000000000000009A +:1056D0000090000000A00040040000000000000056 :1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA -:105700000000800009000000000000000000000010 -:105710000000000000000000000000400000000049 -:105720000100000000000000010000000000000077 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000001000008 -:1057A00000000400000000000000040000000000F1 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 +:1056F0000000000000000000410000000000020067 +:105700004000000000000010000000000000000049 +:105710000000000000000000000000000000000089 +:105720000011000000040000014100000000000022 +:105730000000000000000000000000000180018067 +:10574000018000800020C020012000000000000037 +:105750000000A000000000000000040000000000A5 +:1057600000000000000000000000820000000000B7 +:105770000000200000000000000000000000000009 +:10578000C000000200000000000000000000000057 +:105790000000000000000000000000000000000009 +:1057A0000000000040000001000020004100210036 +:1057B00000080000000000000000090000000420B4 +:1057C000042004200020000100010401000000006A +:1057D000000400000000000000000000800800003D :1057E00000000000000000000000000000000000B9 -:1057F00000000000000000000000000000000000A9 -:105800000000000000000000000800000000000090 +:1057F0000000000000000000110000000300000095 +:105800000000000000000000000000000000000098 :105810000000000000000000000000000000000088 -:105820000000002000000000000000200000000038 +:105820000000000000000000208000000000C040D8 :105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 -:105870000000000000000000000000000000000028 +:1058400000100000A0000003000000200000000085 +:105850000000000000000041000000000000000007 +:105860000000000000000000000008000000000030 +:10587000C000000000000000000000000000080060 :105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 -:1058A00000000000000100000000000000010000F6 -:1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 +:105890000000000000100000000000000084000074 +:1058A0000000008400A00000000080040000000050 +:1058B00000400008000400000000000011A04108A2 +:1058C00000000008000000000084008400A1000027 +:1058D0000000040000000002118400000088004065 +:1058E00000080000000000000800000000000000A8 :1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 -:1059200000000000000000000000008000000000F7 -:105930000000000000000000000000000000000067 -:105940000000000000000000000000000000000057 -:105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 -:105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000011400000A6 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000000000000000C7 +:1059000000900000000000000800000000000000FF +:105910000000840000000000000000000000000003 +:1059200000000000880000210000000020040000AA +:105930000104000000000009000000000000000059 +:1059400088000000010040800100011100C10180B9 +:10595000080000000011000900000009000000001C +:105960000000000200000000000000000000000035 +:105970000000000000000000000000000000900097 +:10598000000082000000000000000000000000098C +:1059900000200000000000000000000000000004E3 +:1059A0000000000000000000000000000000800176 +:1059B000000020010000000000880000000000003E +:1059C000008209020000040000200400049000206E +:1059D000042011C0000000000000000000000000D2 :1059E00000000000000000000000000000000000B7 :1059F00000000000000000000000000000000000A7 :105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A200000000000000000009000000000000000E6 -:105A3000900000C000000000000000000000000016 -:105A40000000000000000000000000000000000056 -:105A50000000000000000000000000000000000046 +:105A10000400000000000000000000000000000082 +:105A20000000000000000000000000000000000175 +:105A3000A0010800000100000000000000000000BC +:105A4000000000000000000800900082040410C064 +:105A500000900004000400000000000000000000AE :105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000001000100010000000000000000000003 -:105AA0000000000000000000110080000000000065 -:105AB0001100800000000000000000000000000055 -:105AC00000000000000000000000000000000000D6 -:105AD00000000000000000000000000000000000C6 +:105A80000000000000000000C0C000A000028282F0 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000210410800900400000000000000000E8 +:105AC00000000000000000000080008000008080D6 +:105AD00080800080008500000000000000000000C1 :105AE00000000000000000000000000000000000B6 :105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10000000001100100204000900000000000055 -:105B200000000000000000000000000000800000F5 -:105B300000800000008000000080000000000000E5 -:105B40000000000000000000000000000000000055 -:105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 +:105B00000000000000000000000080800000008015 +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B300000004100200510110403000000000000D7 +:105B400000000000000000000000000000008000D5 +:105B500080808000000980808080000000000000BC +:105B60000000000000008000000000800000000035 :105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 -:105B900000000000000900000000000000000000FC -:105BA00000000000000000000000000000000020D5 -:105BB000000000C000000020000000C00000000045 -:105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE00000000000000000000000000000000000B5 +:105B80000000000000000000000000000000804154 +:105B90000080800000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB0000000000000C0010000040001000000001F +:105BC000000000000000000000000000C000000015 +:105BD0008400C090080000000402C008000000001B +:105BE0000000000000002000820040002090000023 :105BF00000000000000000000000000000000000A5 -:105C00000000000000000000000000000000000094 -:105C10000000000000000000000000000000000084 -:105C200000000000000000000000000000008500EF -:105C30000088880001000100008888000100000041 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 +:105C0000000000000000000000000000000008008C +:105C10000401100804000000000000000000000063 +:105C20000000000000000000000000000000000074 +:105C3000000000000000000100010501010100005A +:105C40000000000000000000000000000000004014 +:105C50000010908200C0C0040002000400C00000D8 :105C60000000000000000000000000000000000034 :105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000100010002 +:105C900040200088080840C000000000000000000C :105CA00000000000000000000000000000000000F4 -:105CB0004100008000000900410000800000090050 +:105CB0000000000000000000000841030521112041 :105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 +:105CD00000800080800000808000038000800080C1 :105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 :105D00000000000000000000000000000000000093 -:105D1000000000000000000000000000000005007E -:105D2000040000000000000000000000000000006F -:105D30000000001100000080000000110000008041 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 +:105D10000000800000808080008000000000000003 +:105D20000000000000000000000000000000000073 +:105D300000000000000000000000210091000900A8 +:105D4000020300000000000000000000000000004E +:105D50000000000000A000000000801180A0800072 :105D60000000000000000000000000000000000033 :105D70000000000000000000000000000000000023 :105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 +:105D9000000000000000800900000000000000007A :105DA00000000000000000000000000000000000F3 -:105DB00000000000000100000040000000010000A1 -:105DC0000040000000000000000000000000000093 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 +:105DB00000000000000000000000000083901100BF +:105DC0000400C1000000000000000000000000000E +:105DD000000000000000000800820000C001200256 +:105DE0000488000000000000000000000000000027 +:105DF00000A000C000000000000000000000000043 :105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 +:105E100000000000000090000490A0A0820000009C :105E20000000000000000000000000000000000072 -:105E300000000000000000000000070082210000B8 -:105E400000000700822100000000000000000000A8 -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 +:105E30000000000000000000000000000000410021 +:105E400000C800000000000000000000000000008A +:105E500000000000000000820000430000000082FB +:105E6000000043006000000000000000000000008F +:105E7000008200004300000000000000000000005D :105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA000000000C80000000000000000000000002A -:105EB000000000000000000000000000F0F0000002 -:105EC00000000000F0F000000000000000000000F2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 +:105E900000000000000000000082000043006000DD +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC0000000404000000000000000000000000052 +:105ED000000000000000000000000000003CF0C3D3 +:105EE00000F0AF5F00AA3C5A000000000000000074 :105EF00000000000000000000000000000000000A2 :105F00000000000000000000000000000000000091 -:105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000F0F081 -:105F4000000000000000F0F0000000000000000071 -:105F50000000000000000000000000000000000041 -:105F60000000000000000000000000000000000031 +:105F100000000000000000000000000528A80004A8 +:105F2000FFEB000000000000000000000000000087 +:105F30000000000000000000000000000000000061 +:105F40000000001000100000000000000000000031 +:105F50000000000000000000000000000000003C05 +:105F6000F03C00F0A05000AA3C5A000000000000E5 :105F70000000000000000000000000000000000021 :105F80000000000000000000000000000000000011 -:105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB0000000000000000000000000000000FFFFE3 -:105FC0000000FFFF00000F0F0000FFFF00000000B7 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 +:105F900000000000000000000000000088118000E8 +:105FA0000000AA280000000000000000000000001F +:105FB00000000000000000000000000000000000E1 +:105FC00000000000000000000000000000000000D1 +:105FD000000000000000000000000000F3FC030CC3 +:105FE000C33CFF00303F0F00553CFF0000000000A5 +:105FF00000000000000000000000030B1F0F000065 :106000000000000000000000000000000000000090 :106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 +:106020000000FF5FFFFF0000000000000000000014 :106030000000000000000000000000000000000060 -:1060400000000000000000000F0F00000000000032 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000F3FC51 +:10606000030C555500003F300F00AA3C0000000013 +:106070000000000000000000000000000B0B0F0FEC :106080000000000000000000000000000000000010 :106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 +:1060A0000C0C3505F3F3F3F30000000000000000D2 :1060B00000000000000000000000000000000000E0 -:1060C00005002A00054000A805002A00054000A898 +:1060C000000000000000000000610004C0090000A2 :1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 +:1060E000000003380C0092C003E3033E0C0DC2C055 +:1060F0000000000000000000000000000030000070 :10610000000000000000000000000000000000008F :10611000000000000000000000000000000000007F -:106120000000000000000000000000610007000DFA +:1061200000008000503800900001000000000000D6 :10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F +:1061400000000000000000000000AC0CFF0C303A22 +:10615000F0FA000000000000000000000000000055 :10616000000000000000000000000000000000002F :10617000000000000000000000000000000000001F :10618000000000000000000000000000000000000F :1061900000000000000000000000000000000000FF :1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF +:1061C0000000000000000000000000000E0CFF0CAA +:1061D0003030F0F00000000000000000000000007F :1061E00000000000000000000000000000000000AF :1061F000000000000000000000000000000000009F :10620000000000000000000000000000000000008E :10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E +:1062400000000000000000000000000000001D1C15 +:106250001D1C00A05B5B00000000000000000000AF +:106260000000000000000000000000000000050524 +:106270000505000000000000000000000000000014 :10628000000000000000000000000000000000000E :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE -:1062B000FC0C3C3C0000000000000000000000005E +:1062B00000000000000000000000000000000000DE :1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE +:1062D0005D1C000000A05151000000000000000003 :1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E +:1062F000050505050000000000000000000000008A :10630000000000000000000000000000000000008D :10631000000000000000000000000000000000007D :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D -:10634000000000000000000000002000000000002D -:10635000000020000000000000000000000000001D -:10636000000000000000000000002000000000000D -:1063700000002000000000000000000000000000FD -:1063800000000000000000000000000020000000ED -:1063900000000000200000000000000000000000DD -:1063A00000000000000000000000000000000000ED -:1063B000000000001000000040000000000000008D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:106360008400840000000000000000000000000025 +:106370000000000000000005000000000000000018 +:1063800000000000200000000000000000000000ED +:1063900000000000000000000000000000004000BD +:1063A00000000000000004000000000000000000E9 +:1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD :1063D00000000000000000000000000000000000BD :1063E0000002000000001000100200000000000089 :1063F000000000000000400040000000000000001D -:1064000040004002000040024002404000004002C4 -:10641000000240400000400040000000000000007A -:10642000400040000000400000004000009040009C -:10643000000040000000800000008000000000001C -:10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:106470000000000008000000000000000000000212 -:10648000000000000000000000000000000000000C +:106400004000400200004002400040000000400206 +:1064100000024002000000004000000000000000F8 +:1064200000004000400040004000400000004000EC +:10643000400040000000400000000000000000009C +:1064400000040000000000000000000000800000C8 +:10645000020000000000000000000000000000003A +:1064600000410000000000000080000000800000EB +:106470000000000300000000008000000000000198 +:1064800000000000021000100000000000000000EA :1064900000000000000000000000000000000000FC -:1064A00000000000000000000000000000000000EC -:1064B00000000000001000200000000000000000AC -:1064C0000000004000000000000000000000000884 -:1064D00000000000000800000000000000000008AC -:1064E00000000000000000000000000000000008A4 -:1064F000000000000008000000000000000000088C -:10650000000000000000040000080000000000007F -:10651000000800000000000800000000000000006B -:10652000000800000000000000080000000000005B -:10653000000800000000000800010000000000004A -:106540000008000000000000000000000000000043 -:106550000000000000000000000000030000000038 -:10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB +:1064A00000000000001000100000000000000000CC +:1064B00000000000000002100200000000000000C8 +:1064C00000000000000002000000000000000020AA +:1064D00000000000000000000000000800000000B4 +:1064E0000400000000000000000000100000000296 +:1064F000000000000000000000000002000000009A +:106500000000000000840000000000000000000007 +:10651000000000000000000000000000000000007B +:10652000000000000000000000000000000000006B +:106530000400000000820090000000000000000045 +:106540000000000000400000000000000008000003 +:106550000008000000000000000000000000000033 +:1065600000000000004000000000000002020000E7 +:106570008200000000000000000500020002001080 +:1065800002000000000000000000080084009000ED +:1065900090059000000000080000000000000000CE +:1065A00000000000000000000000000008000000E3 :1065B00000000000000000000000000000000000DB -:1065C0000000010000840000000000000000000046 +:1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A +:1065E0000000000000000009000000000000800121 +:1065F0000300000000000000210000000001000175 +:1066000000018000000041000000000008000000C0 +:1066100000000084000000000000000810000000DE +:106620000000000000000000000000000000080062 :10663000000000000000000000000000000000005A -:106640000000000004000000000000000000000046 -:10665000000000000000000000000000000000003A -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A +:106640000002000000000000000000000000200028 +:1066500000000000000004000100040004400400E9 +:106660000400A000A100400000000000000088001D +:1066700020000000A10090000000000000000000C9 +:106680000002000200000000000000000000000006 :1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00000000000000000000800000000000000D2 -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E000000000900000000000000000000000001A -:1066F000000000000000000000000000000000009A +:1066A00000000000000000000000000000000400E6 +:1066B00000000000000000000000000000000000DA +:1066C00000210000000000000000000000000000A9 +:1066D0000000000000000000800004008000800036 +:1066E0008000800000000400000000840000000022 +:1066F000000000000000080003000000000000008F :106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 -:106730000000000000000000000000000000000059 -:106740000000000000000000000000000000000049 -:106750000000000000000000000000000000000039 -:106760000000000000000000000000000000000029 -:106770000008000000000000000000000000000011 -:106780000000000000000000000000000000000009 +:106710000002000000000000000000000000000077 +:106720000000000000000000000004000400000061 +:106730000000000000000400000000000000000055 +:10674000400000880000000000000003000000007E +:106750000000000000000000000800000000000031 +:106760000000000000000000000082000000820025 +:10677000820000000000000000000005A0000005ED +:106780000005000082000000002000000000000062 :1067900000000000000000000000000000000000F9 :1067A00000000000000000000000000000000000E9 -:1067B00000000000000000000000000000002000B9 -:1067C00000000000000004000000000200000000C3 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000000000000000000000000000C9 :1067D00000000000000000000000000000000000B9 -:1067E00000000084000000000000008400000000A1 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 +:1067E00000000000030000A000C000000000000046 +:1067F0000000000000000000008800000000000011 +:10680000000200000000000000A000850000000061 +:106810000000000000C00000000000841100000023 :106820000000000000000000000000000000000068 -:106830000000000000000000000000000000000058 -:1068400000000000000008008000000000000000C0 -:106850000000000000000021000000000000000017 -:106860000000000000000000000000000002000026 -:106870000000000000020000000000000000000016 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B00000000000000000000000000000000000D8 -:1068C00000000000000000000000000000210000A7 -:1068D00000000000000000000000000000000000B8 -:1068E0000000000000000000200000000000110077 -:1068F0000000000000000500000000000000000093 -:106900000000000000000000000000000000000087 +:106830000000000000000000000000000000210037 +:1068400020000004400000000000000000000000E4 +:106850000000000000100000000000000000000028 +:106860000000080002000000000000090000000015 +:106870002040200040000000200482090010004158 +:10688000200400004002000400000004002000007A +:1068900000040021000400020000000000000000CD +:1068A00000000000000800000000000000000000E0 +:1068B00000000000000000000800000000000000D0 +:1068C00000000000000000000000000000000000C8 +:1068D0000000000000000000000000000090000028 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000100000000000000000000000196 +:1069000000000000000000010000110240904089DA :106910000000000000000000000000000000000077 :106920000000000000000000000000000000000067 :106930000000000000000000000000000000000057 -:106940000000000000000000000000000000000047 +:106940000000000440000000030000A00000000060 :106950000000000000000000000000000000000037 -:106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 -:106980000000000000000000000000000000000007 -:1069900000000000000000000000000000000000F7 +:10696000000000C000900008000000C0009000A0DF +:106970000000000000000000000041A10120A089EB +:106980000402000000000800000010030005C0A180 +:106990008441000000000000000000000000000032 :1069A00000000000000000000000000000000000E7 :1069B00000000000000000000000000000000000D7 -:1069C00000000000008800040010000000C00090DB -:1069D000081000000000000000000000000000009F -:1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000000086 -:106A10000000000000000000000000000000000076 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000000000000000000000000B7 +:1069E0000000000000800080008000000080008027 +:1069F000000000000000000000000000C1C0048290 +:106A00000004009000001100800000004084050395 +:106A10000002002100000000000000000000000053 :106A20000000000000000000000000000000000066 :106A30000000000000000000000000000000000056 -:106A400000000000000000000000000000000080C6 -:106A5000098080000000000000000000000000002D -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 -:106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A600000000000000000008000000080800000A6 +:106A70000000000080800000000080008000820094 +:106A800082408404C140000000000000000080003B +:106A900004A1800089110000000000000000000037 :106AA00000000000000000000000000000000000E6 :106AB00000000000000000000000000000000000D6 -:106AC0000000000000000000000000918000800035 -:106AD000030010000500C18000000000000000005D -:106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 -:106B00000000000000000000000000000000000085 -:106B10000000000000000000000000000000000075 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000C0000082000000C09014 +:106AF000000000000000C0C0820084008400088202 +:106B000008C00800A090090000000000000000007C +:106B10000890C10840A0C0830000000000000000F1 :106B20000000000000000000000000000000000065 :106B30000000000000000000000000000000000055 -:106B400000000000000000000000000088C00800F5 -:106B50009000000000000100C1A000000000000043 -:106B60000000000000000000000000000000000025 -:106B70000000000000000000000000000000000015 -:106B80000000000000000000000000000000000005 -:106B900000000000000000000000000000000000F5 +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B6000000000000000000000000000004090084D +:106B700000C00000004090A000C000000000000025 +:106B80000000401001100005A010000100000001ED +:106B900000014020888583C105C10000000000007D :106BA00000000000000000000000000000000000E5 :106BB00000000000000000000000000000000000D5 -:106BC00000000000000000000000000010000000B5 -:106BD0000000110000000010009100C00000000043 -:106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE0000000000000000000000000000000008025 +:106BF0008080008000000080800000800000000095 +:106C00000000000000804185412180850020002196 +:106C1000002000400080800904218920000000003D :106C20000000000000000000000000000000000064 :106C30000000000000000000000000000000000054 :106C40000000000000000000000000000000000044 -:106C500000000000090000090021009100830000ED -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 +:106C50000000000000000000000000000000000034 +:106C6000000000000000000400210000000080007F +:106C700000028080000080110009800000000000F8 +:106C8000008000800000A10982000500404000094A +:106C9000000000000000210041030880C004000043 :106CA00000000000000000000000000000000000E4 :106CB00000000000000000000000000000000000D4 :106CC00000000000000000000000000000000000C4 -:106CD00000100080808000008011000200800040D1 -:106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 -:106D00000000000000000000000000000000000083 -:106D10000000000000000000000000000000000073 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000001000000000000A3 +:106CF0009000000008080000C001A0A0408800002B +:106D00000000000800080000030103000002010069 +:106D1000000000000000000041A004C1410804017F :106D20000000000000000000000000000000000063 :106D30000000000000000000000000000000000053 :106D40000000000000000000000000000000000043 -:106D5000000088000220408400009001101000080C -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 +:106D50000000000000000000000000000000000033 +:106D600000000000000000000000000000004300E0 +:106D70000000008200004300000000820000430089 +:106D8000000A0000000000000000000000000000F9 +:106D900050000000000000000000008200004300DE :106DA00000000000000000000000000000000000E3 :106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 -:106DD0000000000000820000430442000082000026 -:106DE0004300000000000000000000000000000060 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF00000000000F0F00000F0000000F0000000D3 +:106E0000F000000000000000000000000000000092 +:106E1000E747E74700000000000000000000000016 +:106E200010BC3CFF0000000000000000000000005B :106E30000000000000000000000000000000000052 :106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000FF0033 -:106E60000000F00000000000000000000000000032 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E7000000000000000F0F00000F0000000F00052 +:106E80000000F00000000000000000000000000012 +:106E900000994742E74700000000000000000002A0 +:106EA0000000003C10BC00000000000000000000DA :106EB00000000000000000000000000000000000D2 :106EC00000000000000000000000000000000000C2 -:106ED000000000000000000000000F0000000000A3 -:106EE000FF000000F00000000000000000000000B3 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 :106EF0000000000000000000000000000000000092 :106F00000000000000000000000000000000000081 :106F10000000000000000000000000000000000071 @@ -182050,404 +182050,404 @@ :106F40000000000000000000000000000000000041 :106F50000000000000000000000000000000000031 :106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 +:106F7000000000000000000000000000000F000002 +:106F80000F0F0000000F0000666600000000060002 +:106F9000060006000600FFCF3000000000000000E1 +:106FA0000000000000810F3C66FF000000000000B0 :106FB00000000000000000000000000000000000D1 :106FC00000000000000000000000000000000000C1 -:106FD0000000000000000000000000000F0F66FF2E -:106FE000FF60FF600000000F000066660000000008 -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000F82 +:10700000000000000000000F000000000000000071 +:107010000000000406000400FF03FC000000000064 +:1070200000000000000001000F3C660000000000AE :107030000000000000000000000000000000000050 :107040000000000000000000000000000000000040 -:1070500000000000000000000000000000000066CA -:1070600000000000FFFF0000000F00000000000013 -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:1070700000000000000000000008000000A0030263 +:1070800003380C0092C0038203380C00C2C0000019 +:1070900000000000000100610006000D0001006119 +:1070A0000006000D00000061303E000D00080000E9 :1070B00000000000000000000000000000000000D0 :1070C00000000000000000000000000000000000C0 :1070D00000000000000000000000000000000000B0 -:1070E00000003030000000000363033E0C0D92C02E +:1070E00000000000000000000000000000000000A0 :1070F0000000000000000000000000000000000090 :10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F +:107110000000000000000000EBEA00AAA0A000A010 +:107120000000000000040C1CFFFFC3C30000AF0AF6 :10713000000000000000000000000000000000004F :10714000000000000000000000000000000000003F :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F :10717000000000000000000000000000000000000F :1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF +:1071900000000000000000000000EBEAEBEA000045 +:1071A0000000000000003C3D3F7FC3C30143AF0A25 +:1071B000FFFF0000000000000000000000000000D1 :1071C00000000000000000000000000000000000BF :1071D00000000000000000000000000000000000AF :1071E000000000000000000000000000000000009F -:1071F000010000000000000000000000000000008E +:1071F000000000000000000000000000000000008F :10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E +:1072100000000000000000000000000000007A7A7A +:107220000202028A0000000000000000F3FFC0F02C +:10723000AAAAA0A0000000000000000000000000BA :10724000000000000000000000000000000000003E :10725000000000000000000000000000000000002E :10726000000000000000000000000000000000001E -:107270000000F7FFFCFC0000000000000000000020 +:10727000000000000000000000000000000000000E :1072800000000000000000000000000000000000FE :1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE +:1072A0002A7A0202028A0000000000000000F0F3C7 +:1072B00000C0FFFFFAFA000000000000000000001C :1072C00000000000000000000000000000000000BE :1072D00000000000000000000000000000000000AE :1072E000000000000000000000000000000000009E -:1072F00000000000F7FFFCFC0000000000000000A0 -:1073000000000000000000040000000000800000F9 +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D :10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:10733000000000000000000000010000000000004C +:107320000000000000000000000800000000000055 +:10733000000000000000000000000000000000004D :10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000008F5 +:107350000000000000000008000000000000000025 +:10736000000000000000000000000080000200009B +:107370000000000000000000000500000000000008 +:1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000010000000BD -:1073C00000020000000000000002000400000000B5 +:1073A000000000000000000200004000000000009B +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000002000000000000BB :1073D000000000000000000000000000000040006D -:1073E00040000000000040004000000000000000DD +:1073E000400000000000400040000000400200019A :1073F000000000000000000000000000000000008D -:10740000000000000000000000000000010001007A -:10741000000010000000020000000000000000005A -:107420000000000002000000000002000000000058 +:107400000000000000000200000002000200020074 +:10741000020000000000000000000000000000006A +:10742000000000000000000000000000000000005C :10743000000000000000000000000000000200004A -:107440000000000000000000000004000000000038 -:10745000000000000000000000000000000000002C -:1074600000000000000000000000080008002000EC -:107470000000000000000000020008000000000002 -:1074800000000000000000000000000000001000EC -:10749000100000008000000000000000000000005C +:10744000000000000000000000000000000000003C +:107450000000000000000000000008000000000024 +:10746000000000000000000000000000000002809A +:107470000000000000000000000008000000000004 +:1074800000000000000000000000000000000000FC +:10749000000000000000000000880008000000005C :1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC +:1074B00000000000000000000000001000000000BC :1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000800000000000000000000000000000000C +:1074D0000008000000000000040000000008000098 +:1074E000000000000000000000000000000800088C +:1074F000000200000000030000000084008400007F :10750000000000000000000000000000000000007B -:10751000000000000000000000000000000001006A -:10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B +:10751000000000000000000000000000000000006B +:10752000000000000000100000000000000000004B +:107530000000000000000000000000000000000249 +:107540000000000000000000000000000021000812 +:10755000000800000000000000000000000800001B :10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B +:10757000000040000000000090000080008000003B :1075800000000000000000000000000000000000FB :1075900000000000000000000000000000000000EB -:1075A00020000000000000000000000000000000BB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB +:1075A00000000000000000000000000000000000DB +:1075B0000000000000000084000000000000001037 +:1075C00000C10000110000000000000000000000E9 :1075D00000000000000000000000000000000000AB :1075E000000000000000000000000000000000009B -:1075F0000000000000000000000000000082000801 -:107600000000000800000000000000000000000072 -:107610000000000001000000008001800000000068 -:107620000100000000000000000000000000000059 +:1075F0000000000080000000000000000002000207 +:10760000000000000000000000000000000000007A +:107610000000000000000000000000040000400026 +:10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA -:107690000000000000000200000000202020000088 -:1076A00000002000000000000000000000000000BA -:1076B00000000000000000000000000000000000CA +:107670000000000000000400000000000000C10045 +:10768000C100A000A00000000000000000000000F9 +:1076900000000000090000000000000000000000E1 +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000080000000000000000C2 :1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A -:1076F000000000000000000000000000000000008A -:1077000000820000000000000000000000000000F7 -:1077100020000000900000000000000000000000B9 -:107720000008000000000000000000000000000051 +:1076F00000000000000000009100000000000000F9 +:107700000200020000000000000000000000000075 +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 +:107740000000000000080100000000000000000030 :107750000000000000000000000000000000000029 :107760000000000000000000000000000000000019 -:107770000000000000000000000000000000000009 -:1077800000000000000000000200000000000000F7 -:1077900000000000000000000000000000000000E9 -:1077A00000000001000000000000000000000000D8 -:1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 -:1077D00000000000000000000000000000000000A9 +:1077700000000000000000000000000004001020D5 +:1077800000000000000802210000000000000000CE +:107790000000000000000000000000000000008465 +:1077A000000000000000000800840000000000004D +:1077B000000000000300000000A000000000000026 +:1077C0000000000000000010088800000000000019 +:1077D00000000000000000A00008000800000000F9 :1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000881 -:10780000008400000000000000088000000000006C -:107810000000000000000000000000000000000068 -:10782000000000000000000000000009000000004F -:10783000000900000000000000000000000000003F -:107840000000000000000000000000000000000038 +:1077F0000000000000000000000000000000800009 +:107800008001000000000000800000000000000077 +:107810000000000200000000000000000000000066 +:107820000000000000000000000800000000000050 +:107830000000000200000000000000000000000046 +:1078400000004000000000000002000000000000F6 :107850000000000000000000000000000000000028 :107860000000000000000000000000000000000018 -:107870000000000000000000000000000000000008 -:1078800000000000000000080000000800000000E8 +:107870000000000000004000400002000200000084 +:1078800000000400040000000000000002000000EE :1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 +:1078A0000000000000000000200000002000000098 :1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 +:1078C000000000000000000000A011010000000006 :1078D00000000000000000000000000000000000A8 :1078E0000000000000000000000000000000000098 :1078F0000000000000000000000000000000000088 -:1079000000000000000000000082000000000008ED +:1079000000000000800080000000000000008000F7 :107910000000000000000000000000000000000067 -:1079200001009000000000000100000000000000C5 +:107920000000000000000000000000000000000057 :107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 +:10794000000000000000000010010100400184015F :107950000000000000000000000000000000000027 :107960000000000000000000000000000000000017 :107970000000000000000000000000000000000007 -:107980000000000000000000000000080082000865 -:1079900000020000000000000000000000000000E5 -:1079A00000001100802100000000110021000000F3 +:1079800000004005001000101010008800030001E6 +:1079900000010000000000000000000000000000E6 +:1079A00000000000000000000000000000000000D7 :1079B00000000000000000000000000000000000C7 -:1079C00000000000000000000000000000000000B7 -:1079D00000000000000000000000000000000000A7 +:1079C0000000000000000000000091102102802053 +:1079D000000800000000000000000000000000009F :1079E0000000000000000000000000000000000097 :1079F0000000000000000000000000000000000087 -:107A00000000000000000000020000000080008074 -:107A100000800000000000000000000000000000E6 -:107A200000000000000400801111008000410900E6 -:107A3000000900000000000000000000000000003D -:107A40000000000000000000000000000000000036 -:107A50000000000000000000000000000000000026 +:107A0000000000008041001000100010000211086A +:107A1000000800210000000000000000000000003D +:107A20000000000000000000000000000000000056 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000200000034 +:107A50008000210400000000000000000000000081 :107A60000000000000000000000000000000000016 :107A70000000000000000000000000000000000006 -:107A800000000000000000090000000000000000ED -:107A90000080000000000000000000000000000066 -:107AA00000000000000000010002010000080001C9 -:107AB00001000000000000000000000000000000C5 -:107AC00000000000000000000000000000000000B6 -:107AD00000000000000000000000000000000000A6 +:107A800000000000000080000000000580041100DC +:107A900009000500100000000000000000000000C8 +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000000000000C6 +:107AC000000000000000000000000000000091A085 +:107AD000C000A00001010000000000000000000044 :107AE0000000000000000000000000000000000096 :107AF0000000000000000000000000000000000086 -:107B00000000000000000000000000000000000075 -:107B1000000000080000000200000000000000005B -:107B200000000000000000000100048802010100C4 -:107B300000008800000001000000000000000000BC +:107B0000000000000000000010A01000A08204018E +:107B100000000088010002040000000000000000D6 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 :107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 +:107B500000110140850300C000000000000000008B :107B60000000000000000000000000000000000015 :107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B9000000040000000100008000000000000008D -:107BA000000000000000000000004100008080088C -:107BB000080000000000000041000000000000007C +:107B80000000000000000000000004100010018848 +:107B900010900011010041010002000000000000EF +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000000C5 :107BC00000000000000000000000000000000000B5 -:107BD00000000000000000000000000000000000A5 +:107BD0000000002120A1400800000000000000007B :107BE0000000000000000000000000000000000095 :107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 -:107C100000000000800000008000800000000000E4 -:107C20000000000000000000000000000011110032 -:107C300000800000000000110000000000000000B3 +:107C000000000000000000000000000080000500EF +:107C1000058003000088100283210002000000009C +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 -:107C50000000000000000000000000000000000024 +:107C50000000000010400400028002050000000047 :107C60000000000000000000000000000000000014 :107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000001D3 -:107CB0000100004000000000000100000000000082 +:107C800000000000000000000000000000002100D3 +:107C900040001100200021110040110002040000EA +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 :107CC00000000000000000000000000000000000B4 -:107CD00000000000000000000000000000000000A4 +:107CD0000000000000000001010200C000000000E0 :107CE0000000000000000000000000000000000094 :107CF0000000000000000000000000000000000084 :107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 +:107D100011001110101002000300C0010004010046 :107D20000000000000000000000000000000000053 -:107D3000000000E007008200000000E00000810A6F +:107D30000000000000000000000000000000000043 :107D40000000000000000000000000000000000033 -:107D50000000000000000000000000000000000023 +:107D50000000000000000000000000000000000A19 :107D60000000000000000000000000000000000013 :107D70000000000000000000000000000000000003 :107D800000000000000000000000000000000000F3 -:107D90000000000000C8000000000000000000001B +:107D90000000418200C84300000000000000000015 :107DA00000000000000000000000000000000000D3 -:107DB000000000000000F0F00000000000000000E3 +:107DB00000000000000000000000000000000000C3 :107DC00000000000000000000000000000000000B3 -:107DD00000000000000000000000000000000000A3 -:107DE0000000000000000000000000000000000093 +:107DD0000000000000000000000000000000514012 +:107DE000F7D50000000000000000000000000000C7 :107DF0000000000000000000000000000000000083 :107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 -:107E30000000000000000000F0F000000000000062 +:107E1000000000003C3AA03A00F30CFFFF0000FF16 +:107E2000C3C33C3C00000000000000000000000054 +:107E30000000000000000000000000000000000042 :107E40000000000000000000000000000000000032 :107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 +:107E60004040D5D5000000000000000000000000E8 :107E70000000000000000000000000000000000002 :107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 -:107EA00000000000000000000000000000000000D2 -:107EB000000000000000000000000000FFFF0000C4 +:107E90000000000000003C3AA03A080BF8FBFF008D +:107EA00000FFC3C33C3C00000000000000000000D5 +:107EB00000000000000000000000000000000000C2 :107EC00000000000000000000000000000000000B2 :107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000000000000000092 +:107EE00000001054105400000000000000000000CA :107EF0000000000000000000000000000000000082 :107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 -:107F20005429448800000000000000000000000008 +:107F10000000000000000000F75737573E343E34A1 +:107F2000FF0000FFFFFF0000000000000000000055 :107F30000000000000000000000000000000000041 :107F40000000000000000000000000000000000031 :107F50000000000000000000000000000000000021 -:107F60000000000000000000000000000000000011 +:107F60000000000075FD75FD00000000000000002D :107F70000000000000000000000000000000000001 :107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 -:107FA0000000D62956A900000000000000000000D3 -:107FB0000000000000000000000005000A06054C5B -:107FC00000A800600006000C000000000000000097 +:107F900000000000000000000000C45404547F2AC8 +:107FA0007520FF0000FF0000FFFF00000000000040 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000000000B1 :107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000000091 +:107FE000000000610006000D00000000000000001D :107FF0000000000000000000000000000000000081 :108000000000000000000000000000000000000070 -:1080100000000000000000000000000000610007F8 -:10802000000D000000003000000000000000000013 -:108030000000000000000000000000000000FF0041 -:1080400000FF000000000000FFFF00000000000033 +:108010000000000000000000000000000021003609 +:10802000C00D000040618006002D1002000000001D +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 :108050000000000000000000000000000000000020 -:108060000000000000000000000000000000000010 +:1080600000000000F500FFF5CBC1CBC1000000000F :108070000000000000000000000000000000000000 :1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 +:108090000000000000000000000000000000A0142C +:1080A000A0FF000000003C3C0C0CC0C0C0F300006E :1080B00000000000000000000000000000000000C0 -:1080C000FF0000FF000000000000000000000000B2 +:1080C00000000000000000000000000000000000B0 :1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000000000000000000090 +:1080E000000000000000D100FFD1EF40EF40000091 :1080F0000000000000000000000000000000000080 :10810000000000000000000000000000000000006F :10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F +:1081200000FFFFFF000000003C3C0C0CC0F3F3F329 :10813000000000000000000000000000000000003F -:108140000000FF0000FF000000000000F0F0000051 +:10814000000000000000000000000000000000002F :10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000000F +:108160000000000000000000C7DFD7FF2828AAAAEF :1081700000000000000000000000000000000000FF :1081800000000000000000000000000000000000EF :1081900000000000000000000000000000000000DF -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF -:1081C00000000000FF0000FF000000000000F0F0D1 +:1081A000000000C01DFD000000003C3400007C10F9 +:1081B000FD3400000000000000000000000000008E +:1081C00000000000000000000000000000000000AF :1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F +:1081E00000000000000000000000014341C32828F7 +:1081F000AAAA00000000000000000000000000002B :10820000000000000000000000000000000000006E :10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E -:1082300000000000000020002000000000000000FE -:10824000000020000000000000000000000000000E -:1082500000000000000020002000000000000000DE -:1082600000002000000000000000000000000000EE -:1082700000000000000200002000200000000000BC -:1082800000000000200000000000000000000000CE -:1082900000000000000000000000000000000000DE -:1082A000000000002000000010000000008000001E +:108220000000000000C0110100000000FFF53C3418 +:108230007C10FD3400000000000000000000000081 +:10824000000000000000001000000000000000001E +:10825000000000000000000000000400000000001A +:10826000000000000400000000000000000000000A +:1082700000000000000000000000000020000000DE +:1082800000000000000020000000020000000000CC +:1082900000000000000000000000000020000000BE +:1082A000000000000000000000000000000084004A :1082B00000000000000000000000000000000000BE :1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000002000000009C +:1082D000000000020000000000000002800000001A :1082E000400040000000000040004000000040004E -:1082F00040004000400000004002000040401000EC -:10830000400040000000000000004000400200006B -:10831000400000004000000040000000400000005D -:108320000000000000000000000080004000000489 -:1083300040000000000000000000000000000000FD -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D -:1083700000000000000000000002000000000000FB -:1083800000000000000000000000000000000000ED -:1083900000000000000000000000000000000800D5 -:1083A00008000000000000000000000000000800BD -:1083B000000000002000000000000000000000009D -:1083C000000000000000000000000008000000089D -:1083D000000000000008000800000000000000008D -:1083E000000000000000000000000008000000087D -:1083F000000000000008000800000000000000006D -:108400000000000000000000000000000008000064 -:108410000008000000000008000800000000000044 -:1084200000000000000000000000000000880000C4 -:1084300000080000000080880082000000000000AA +:1082F0004000400000000000400800004040100026 +:10830000000040000000000000004000400040026B +:1083100040004000400000004000400040000000DD +:1083200040000000000000000000000040000000CD +:10833000000000000000000000000000000000003D +:108340000000000000000000000000000200020029 +:10835000000000000000000000000000001000000D +:1083600000090000000000000000000008000800F4 +:1083700000000000000000000001000000000000FC +:1083800002000000000000000000000000000800E3 +:1083900008000000000000000000000000000000D5 +:1083A00008000000000000000000020000000800BB +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:10841000000000000008000000000000000800004C +:10842000000000000000000000000000000000004C +:1084300000000000008800000000000000000000B4 :10844000000000000000000000000000000000002C :10845000000000000000000000000000000000001C :10846000000000000000000000000000000000000C :1084700000000000000000000000000000000000FC :1084800000000000000000000000000000000000EC :1084900000000000000000000000000000000000DC -:1084A0000000000000000000000000000000880044 -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000C00000EC +:1084A00000000000000000000000000000000000CC +:1084B000000000009000000000000000000000002C +:1084C00000000000000000000000000000000000AC :1084D000000000000000000000000000000000009C :1084E000000000000000000000000000000000008C :1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B +:108500000008000000000000000000000000000063 :10851000000000000000000000000000000000005B :10852000000000000000000000000000000000004B -:10853000000000000000000000000000000020001B +:108530000800000000000000000200A000A000826F :10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B +:1085500000000000000040200000000000000000BB :10856000000000000000000000000000000000000B :1085700000000000000000000000000000000000FB :1085800000000000000000000000000000000000EB -:1085900000000000000000200000000000000000BB -:1085A00000000000080008000000000000000000BB -:1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000001000000BA +:1085C00005000000000000000000000000000000A6 +:1085D000000000000000000000000088000000888B :1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B +:1085F0000000000000000000000000080000000073 :10860000000000000000000000000000000000006A :10861000000000000000000000000000000000005A :10862000000000000000000000000000000000004A -:1086300000000000000000000000000000900000AA -:10864000000000000000000000000000000000002A +:108630000000000000000000000000000000020038 +:108640000000020000000000000000000000000028 :10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A +:1086600000000000000000000000000000410000C9 :1086700000000000000000000000000000000000FA -:1086800000000000000000000000000000000000EA +:10868000000000800000000000000000000000006A :1086900000000000000000000000000000000000DA :1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000C0000000840000000000840000D2 -:1086E0000000008400000000000000000000000006 -:1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000000069 +:1086B00000000000000000000000000000000100B9 +:1086C000000000800000000000000000000000002A +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A +:1086F0000000000000000000000000000000000872 +:108700000000000011100000000000000000000048 :108710000000000000000000000000000000000059 :108720000000000000000000000000000000000049 -:108730000000000000000000000000000000000039 -:1087400000C0000000000000000000000000000069 +:108730000000000000000000000000000888002089 +:10874000020000C000400090000000000000000097 :108750000000000000000000000000000000000019 -:108760000002000000000002000000000002000003 +:108760000000000000000000000000000000000009 :1087700000000000000000000000000000000000F9 :1087800000000000000000000000000000000000E9 :1087900000000000000000000000000000000000D9 :1087A00000000000000000000000000000000000C9 :1087B00000000000000000000000000000000000B9 :1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000000000000089 +:1087D0000000000000000000000000000010000089 +:1087E0000004000000000000000000000000000085 :1087F0000000000000000000000000000000000079 :108800000000000000000000000000000000000068 :108810000000000000000000000000000000000058 :108820000000000000000000000000000000000048 :108830000000000000000000000000000000000038 -:108840000000000000000000000000000000000028 +:108840000000000000020000000000000000000026 :108850000000000000000000000000000000000018 :108860000000000000000000000000000000000008 :1088700000000000000000000000000000000000F8 @@ -182455,7 +182455,7 @@ :1088900000000000000000000000000000000000D8 :1088A00000000000000000000000000000000000C8 :1088B00000000000000000000000000000000000B8 -:1088C00000000200000000010000000000000000A5 +:1088C000000000000000000004080082000000001A :1088D0000000000000000000000000000000000098 :1088E0000000000000000000000000000000000088 :1088F0000000000000000000000000000000000078 @@ -182463,7 +182463,7 @@ :108910000000000000000000000000000000000057 :108920000000000000000000000000000000000047 :108930000000000000000000000000000000000037 -:1089400000001000000000000040000400100004BF +:108940000000000000000000000000800080000027 :108950000000000000000000000000000000000017 :108960000000000000000000000000000000000007 :1089700000000000000000000000000000000000F7 @@ -182471,56 +182471,56 @@ :1089900000000000000000000000000000000000D7 :1089A00000000000000000000000000000000000C7 :1089B00000000000000000000000000000000000B7 -:1089C0000000000000000000000000800000001017 -:1089D0000010000000000000000000000000000087 +:1089C0000000000000000000000000000084000023 +:1089D0008080000000000000000000000000000097 :1089E0000000000000000000000000000000000087 -:1089F0000000000000000000000000000000000077 -:108A00000000000000000000000000000000000066 -:108A10000000000000000000000000000000000056 +:1089F0000000000000000000004000000000000037 +:108A0000000000000000000000008800A0008400BA +:108A100088000000000000000000000000000000CE :108A20000000000000000000000000000000000046 :108A30000000000000000000000000000000000036 -:108A400000000000000000000000000000400000E6 -:108A50000000000000000000000000000000000016 +:108A4000000000000000000000000000000000081E +:108A50000000080800000000000000000000000006 :108A60000000000000000000000000000000000006 :108A700000000000000000000000000000000000F6 :108A800000000000000000000000000000000000E6 :108A900000000000000000000000000000000000D6 :108AA00000000000000000000000000000000000C6 :108AB00000000000000000000000000000000000B6 -:108AC00000000000000000010000000000010000A4 -:108AD0000100000000000000000000000000000095 +:108AC00000000000000000000000000000000000A6 +:108AD0000000888800040000000000000000000082 :108AE0000000000000000000000000000000000086 :108AF0000000000000000000000000000000000076 :108B00000000000000000000000000000000000065 :108B10000000000000000000000000000000000055 :108B20000000000000000000000000000000000045 :108B30000000000000000000000000000000000035 -:108B40000000000000000000001000400040004154 -:108B500000004000000000000000000000000000D5 +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000000015 :108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 +:108B700000000000000000000000001100000000E4 :108B800000000000000000000000000000000000E5 :108B900000000000000000000000000000000000D5 :108BA00000000000000000000000000000000000C5 :108BB00000000000000000000000000000000000B5 :108BC00000000000000000000000000000000000A5 -:108BD00000000921114041000300000000000000D6 +:108BD0000000000000000000000000000000000095 :108BE0000000000000000000000000000000000085 :108BF0000000000000000000000000000000000075 :108C00000000000000000000000000000000000064 -:108C10000000000000000000000000000000000054 +:108C100000000000008400C0000000000000000010 :108C20000000000000000000000000000000000044 :108C30000000000000000000000000000000000034 :108C40000000000000000000000000000000000024 -:108C50000000000000010101000001000000000010 +:108C5000000000008400000000040000000000008C :108C60000000000000000000000000000000000004 :108C700000000000000000000000000000000000F4 -:108C800000000000000000000000000000000000E4 +:108C800043000000000000000000000000000000A1 :108C900000000000000000000000000000000000D4 :108CA00000000000000000000000000000000000C4 :108CB00000000000000000000000000000000000B4 :108CC00000000000000000000000000000000000A4 -:108CD00000E000000000480000C8000000000000A4 +:108CD0000000000000000000000000000000000094 :108CE0000000000000000000000000000000000084 :108CF0000000000000000000000000000000000074 :108D00000000000000000000000000000000000063 @@ -182528,7 +182528,7 @@ :108D20000000000000000000000000000000000043 :108D30000000000000000000000000000000000033 :108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 +:108D50000000000000000000FFFF0000FF0000FF17 :108D60000000000000000000000000000000000003 :108D700000000000000000000000000000000000F3 :108D800000000000000000000000000000000000E3 @@ -182536,8 +182536,8 @@ :108DA00000000000000000000000000000000000C3 :108DB00000000000000000000000000000000000B3 :108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE0000000000000000000000000000000000083 +:108DD000000000000000000000000000FFFFFF0096 +:108DE00000FF000000000000000000000000000084 :108DF0000000000000000000000000000000000073 :108E00000000000000000000000000000000000062 :108E10000000000000000000000000000000000052 @@ -182549,27 +182549,27 @@ :108E700000000000000000000000000000000000F2 :108E800000000000000000000000000000000000E2 :108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000000000C2 +:108EA00042474242000000000000000000000000B5 :108EB00000000000000000000000000000000000B2 :108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 +:108ED0000000000000000000000000000000F00F93 +:108EE000F00F0000FFFF0000000000000000000085 :108EF0000000000000000000000000000000000072 :108F00000000000000000000000000000000000061 :108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 +:108F2000000047E742E700000000000000000000EA :108F30000000000000000000000000000000000031 :108F40000000000000000000000000000000000021 :108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000001 +:108F6000F00FF00FFFFF0000000000000000000005 :108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 +:108F8000000000000000000000000008000000A039 :108F900000000000000000000000000000000000D1 :108FA00000000000000000000000000000000000C1 :108FB00000000000000000000000000000000000B1 :108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000610006000921 -:108FE000000000610004C00D00000000000000004F +:108FD0000000000000000000000000000000000091 +:108FE000000040008000002010020000000000008F :108FF0000000000000000000000000000000000071 :109000000000000000000000000000000000000060 :109010000000000000000000000000000000000050 @@ -182577,7 +182577,7 @@ :109030000000000000000000000000000000000030 :109040000000000000000000000000000000000020 :109050000000000000000000000000000000000010 -:10906000AAAA30F3FF0FFF0F00000000000000006D +:109060000000000000000000000000000000000000 :1090700000000000000000000000000000000000F0 :1090800000000000000000000000000000000000E0 :1090900000000000000000000000000000000000D0 @@ -182585,7 +182585,7 @@ :1090B00000000000000000000000000000000000B0 :1090C00000000000000000000000000000000000A0 :1090D0000000000000000000000000000000000090 -:1090E0000000000030F37D00FF00000000000000E1 +:1090E0000000000000000000000000000000000080 :1090F0000000000000000000000000000000000070 :10910000000000000000000000000000000000005F :10911000000000000000000000000000000000004F @@ -182593,7 +182593,7 @@ :10913000000000000000000000000000000000002F :10914000000000000000000000000000000000001F :10915000000000000000000000000000000000000F -:1091600000000000000000002505040000000000D1 +:1091600000000000000000000000000000000000FF :1091700000000000000000000000000000000000EF :1091800000000000000000000000000000000000DF :1091900000000000000000000000000000000000CF @@ -182601,48 +182601,48 @@ :1091B00000000000000000000000000000000000AF :1091C000000000000000000000000000000000009F :1091D000000000000000000000000000000000008F -:1091E0000000000000000000000025050400000051 +:1091E000000000000000000000000000000000007F :1091F000000000000000000000000000000000006F -:10920000200000000000000000000000000000003E -:10921000000200000000000000000000000000004C -:1092200020000000400000000000000000000000DE -:10923000000000000000000000000000000000002E -:1092400000002000000020000000000000000000DE -:10925000000000020000000000000000000000000C -:1092600000000000000020000000000000000000DE +:1092000000000000000000800000000000000000DE +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000000020000000000000000000000002C +:10924000000000000000000000000000000000001E +:10925000000000800000000000000000000000008E +:1092600000000000020000000000000008000000F4 :1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000002000000000000000000000000AC +:10928000000000000000000000104100000000008D +:1092900000000000100000000000000000000000BE +:1092A00000000000000000000002000000000000BC +:1092B00000000008000000000000000000000000A6 :1092C000000000020000000040004000000000001C -:1092D000400040000000000000000000000000000E +:1092D00040004000002010000000000000000000DE :1092E000000000000000400000000000000000003E :1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:109310000000000000000400040000000000000045 +:1093000000000000000000090000000982200000A9 +:10931000020000000000000000000000000000004B :10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000002000000000000000000000000001B +:10933000000000000200000100000000000000002A +:10934000000000000000000000000000000000001D :10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD -:1093700002000000000000000000000000000008E3 -:1093800000000000000000080008000000000000CD -:1093900000000000000000080008000000000008B5 -:1093A000000000000000000800080000000000822B -:1093B000000000000000000800000008000000009D -:1093C0000008000000000000000800080000000085 -:1093D0000000000000000000000800840000000001 -:1093E00000080000000000000008008800000000E5 -:1093F0000000000000000000000800000000000065 -:10940000000000000000000000210000000000003B -:109410000008000000000000004000000000000004 +:1093700000000040000000000000000000000000AD +:1093800000000000000000000000000000000001DC +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000009D +:1093D0000000000000000000000800000000000085 +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000100000000000005D +:10940000002100000000000000000000000000003B +:109410000005000000000000000000000000000047 :10942000000000000000000000000000000000003C :10943000000000000000000000000000000000002C :10944000000000000000000000000000000000001C :10945000000000000000000000000000000000000C -:1094600000000000000000000000002100030000D8 -:1094700000000000000000000000004000000000AC +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC :1094800000000000000000000000000000000000DC :1094900000000000000000000000000000000000CC :1094A00000000000000000000000000000000000BC @@ -182650,47 +182650,47 @@ :1094C000000000000000000000000000000000009C :1094D000000000000000000000000000000000008C :1094E000000000000000000000000000000000007C -:1094F00000000000000000840000000000000000E8 -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000004000110A +:1095100000400040000000000000000000000000CB :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B :10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB +:1095600000000000000000000400000000000000F7 +:1095700000000000000000008200880000000000E1 :1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB +:1095900002000000000000000000000000000000C9 :1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B -:1095D0000000008200000000000000000000000009 -:1095E00000A00000000000000000000000000000DB +:1095D000000000000000000000000000000000008B +:1095E000000000000000000000000000000000007B :1095F000000000000000000000000000000000006B -:109600000000000800000000000000000000000052 +:10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A :10963000000000000000000000000000000000002A :10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A -:1096600000000040000000000000000000000000BA +:1096600000000000000000000000000000000000FA :1096700000000000000000000000000000000000EA -:1096800000000020000000000000000000000000BA +:1096800000000000000000000000000000000000DA :1096900000000000000000000000000000000000CA :1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A +:1096B0000000000000C000000000000000000000EA +:1096C0000000000800000000000000000000000092 :1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A -:1096F0000000000000000000000000002100000049 -:109700000000000000000000000000000021000038 +:1096F000000000000000000000000000004000002A +:109700000000000000100000000000000000000049 :109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 +:1097200000000040004000000000000000000000B9 :109730000000000000000000000000000000000029 :109740000000000000000000000000000000000019 :109750000000000000000000000000000000000009 :1097600000000000000000000000000000000000F9 -:1097700000000000000008000000000000000000E1 +:1097700000000000000000000000000000000000E9 :1097800000000000000000000000000000000000D9 :1097900000000000000000000000000000000000C9 :1097A00000000000000000000000000000000000B9 @@ -182700,16 +182700,16 @@ :1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 +:1098100000000000000000000000C004000000A0E4 +:109820000008000000000000000000000000000030 :109830000000000000000000000000000000000028 :109840000000000000000000000000000000000018 :109850000000000000000000000000000000000008 :1098600000000000000000000000000000000000F8 :1098700000000000000000000000000000000000E8 :1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 +:109890000000000000000000000000008000000048 +:1098A00000800080000000000000000000000000B8 :1098B00000000000000000000000000000000000A8 :1098C0000000000000000000000000000000000098 :1098D0000000000000000000000000000000000088 @@ -182717,7 +182717,7 @@ :1098F0000000000000000000000000000000000068 :109900000000000000000000000000000000000057 :109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 +:109920000000808080800000000000000000000037 :109930000000000000000000000000000000000027 :109940000000000000000000000000000000000017 :109950000000000000000000000000000000000007 @@ -182725,15 +182725,15 @@ :1099700000000000000000000000000000000000E7 :1099800000000000000000000000000000000000D7 :1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 +:1099A0000000C0C084080890000000000000000013 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 +:1099F0000020000000000000000000000000000047 :109A00000000000000000000000000000000000056 :109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000036 +:109A200000004010000004C085200000000000007D :109A30000000000000000000000000000000000026 :109A40000000000000000000000000000000000016 :109A50000000000000000000000000000000000006 @@ -182741,7 +182741,7 @@ :109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 :109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000000B6 +:109AA000000000008000000000000900000000002D :109AB00000000000000000000000000000000000A6 :109AC0000000000000000000000000000000000096 :109AD0000000000000000000000000000000000086 @@ -182749,7 +182749,7 @@ :109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 :109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 +:109B200000000000000000040080008080000000B1 :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 @@ -182757,7 +182757,7 @@ :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 :109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 +:109BA000000000000000000004000020C084080045 :109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 @@ -182765,24 +182765,24 @@ :109BF0000000000000000000000000000000000065 :109C00000000000000000000000000000000000054 :109C10000000000000000000000000000000000044 -:109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 +:109C2000000000000000000000000082000043006F +:109C300042000000000000000000000000000000E2 :109C40000000000000000000000000000000000014 :109C50000000000000000000000000000000000004 :109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000000E4 +:109C700000000000000000000700000000000000DD :109C800000000000000000000000000000000000D4 :109C900000000000000000000000000000000000C4 -:109CA00000000000000000000000000000000000B4 -:109CB00000000000000000000000000000000000A4 +:109CA0000000000000000000000000004040000034 +:109CB0000000001400000000000000000000000090 :109CC0000000000000000000000000000000000094 :109CD0000000000000000000000000000000000084 :109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 :109D00000000000000000000000000000000000053 :109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 -:109D30000000000000000000000000000000000023 +:109D200000000000000000000000000000004040B3 +:109D3000000000000014000000000000000000000F :109D40000000000000000000000000000000000013 :109D50000000000000000000000000000000000003 :109D600000000000000000000000000000000000F3 @@ -182790,7 +182790,7 @@ :109D800000000000000000000000000000000000D3 :109D900000000000000000000000000000000000C3 :109DA00000000000000000000000000000000000B3 -:109DB00000000000000000000000000000000000A3 +:109DB0003C3C4D4DFAFAF0F00000000000000000BD :109DC0000000000000000000000000000000000093 :109DD0000000000000000000000000000000000083 :109DE0000000000000000000000000000000000073 @@ -182798,7 +182798,7 @@ :109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 :109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 +:109E3000000014140C0CFF00FF00000000000000E4 :109E40000000000000000000000000000000000012 :109E50000000000000000000000000000000000002 :109E600000000000000000000000000000000000F2 @@ -182806,12 +182806,12 @@ :109E800000000000000000000000000000000000D2 :109E900000000000000000000000000000000000C2 :109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 +:109EB0000000000000003030000001000000000041 :109EC0000000000000000000000000000000000092 :109ED0000000000000000000000000000000000082 :109EE0000000000000000000000000000000000072 :109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 +:109F00000000000000A000000000000000000000B1 :109F10000000000000000000000000000000000041 :109F20000000000000000000000000000000000031 :109F30000000000000000000000000000000000021 @@ -182847,62 +182847,62 @@ :10A11000000000000000000000000000000000003F :10A12000000000000000000000000000000000002F :10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F +:10A1400000000000000020000000000000000000EF :10A1500000000000000000000000000000000000FF :10A1600000004000000000000000000000000000AF :10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF +:10A1800010000000000000000000000000000000BF :10A1900000000000000000000000000000000000BF :10A1A00000000000000000000000000000000000AF :10A1B000000000000000000000000000000000009F :10A1C000000000000000000000001000100000006F -:10A1D0000000100010020000104010024002400079 -:10A1E00040000000100010004000100000000000BF -:10A1F00000000000100010400000100200024100AA -:10A20000000040400020100000000000000000009E -:10A21000000000000000100000001000000000001E -:10A2200000004000000000000000000000000000EE +:10A1D00000001000100200001040100240020000B9 +:10A1E00040000000100010000000100000000000FF +:10A1F000000000001000100240001002400010009B +:10A20000000040401020104000004000000000000E +:10A21000000000000000100000000000000000002E +:10A2200000002000000000000000400000000000CE :10A23000000000000000000000000000000000001E :10A24000000000000000000000000000000000000E :10A2500000000000000000000000000000000000FE -:10A2600000000000000000000200000000000000EC -:10A2700000000000000000000000000000000000DE +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000200000000000000DC :10A2800000000000000000000000000000000000CE :10A2900000000000000000000000000000000000BE :10A2A00000000000000000000000000000000000AE :10A2B000000000000000000000000000000000009E :10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000008000800006E -:10A2E0000000000000000000000000080000000066 -:10A2F0000000000000000000000000000084008852 -:10A3000000000000000000000000000000880000C5 -:10A310000000000000000000000000000008000035 -:10A3200000000000000000000000000000840000A9 +:10A2D000000000000000000000000000000000007E +:10A2E000000000000000000000000000000000006E +:10A2F000000000000000000000000000000000005E +:10A300000000000000000000000000080000000045 +:10A31000000000000000000000000000000000003D +:10A320000000000000000000000000080000000025 :10A33000000000000000000000000000000000001D :10A34000000000000000000000000000000000000D :10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED :10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000008C5 +:10A3800000000000000000000000000000000000CD :10A3900000000000000000000000000000000000BD :10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000840082000000088F -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000030000000000000000008A +:10A3D000001000000000000000000000000000006D :10A3E000000000000000000000000000000000006D -:10A3F00000000000000000840000000000000000D9 +:10A3F000000000000000000000000000000000005D :10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C +:10A410000300000000000000000000000000000039 :10A42000000000000000000000000000000000002C :10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC -:10A4600000000000000000000000000000000000EC +:10A4400000000000000000000000000000400000CC +:10A4500000000002000000000000000000000000FA +:10A4600000000000000000000000000000000008E4 :10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC +:10A480000000C0000000000000000000000000000C +:10A4900000080000000000000000000000000000B4 :10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C +:10A4B0000008004000400000000000000000000014 :10A4C000000000000000000000000000000000008C :10A4D000000000000000000000000000000000007C :10A4E000000000000000000000000000000000006C @@ -182911,36 +182911,36 @@ :10A51000000000000000000000000000000000003B :10A52000000000000000000000000000000000002B :10A53000000000000000000000000000000000001B -:10A540000000000000000008000000000000000003 -:10A5500000000000000800000000000000000000F3 +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB :10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000000000000000DB +:10A5700000000000000008000000000000000000D3 :10A5800000000000000000000000000000000000CB :10A5900000000000000000000000000000000000BB :10A5A00000000000000000000000000000000000AB :10A5B000000000000000000000000000000000009B :10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B +:10A5D000000000000010000000000000000000006B :10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B :10A60000000000000000000000000000000000004A :10A61000000000000000000000000000000000003A :10A62000000000000000000000000000000000002A :10A63000000000000000000000000000000000001A -:10A640000000000000000000000000030000000007 +:10A64000000000000000000000000000000000000A :10A6500000000000000000000000000000000000FA :10A6600000000000000000000000000000000000EA :10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000800000000C2 +:10A6800000000000000000000000000000000000CA :10A6900000000000000000000000000000000000BA :10A6A00000000000000000000000000000000000AA :10A6B000000000000000000000000000000000009A :10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A +:10A6D0000000000000000000000000040000000076 :10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A :10A700000000000000000000000000000000000049 -:10A710000000000000000000000000040000000035 +:10A710000000000000000000000000000000000039 :10A720000000000000000000000000000000000029 :10A730000000000000000000000000000000000019 :10A740000000000000000000000000000000000009 @@ -183041,39 +183041,39 @@ :10AD30000000000000000000000000000000000013 :10AD40000000000000000000000000000000000003 :10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000040000DF -:10AD700000000000000000000000000000000000D3 -:10AD800001000000000000000000000000040000BE -:10AD90000000000000000000000000000080000033 -:10ADA0000000000000800000000000000000000023 -:10ADB0000000000000000000000000000000000093 -:10ADC000000000000000000000000000000000047F -:10ADD0000000000000000000000000000000000073 +:10AD600000000000000000000000000000000000E3 +:10AD700000002000000000000000000000000000B3 +:10AD800000000000000000000000000000000000C3 +:10AD90000000200000000000000000000000000093 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000020000000000000000000000073 +:10ADC0000000000000000000000000000000000083 +:10ADD00000000000000000000000090000000080EA :10ADE0000000000000000000000000000000000063 :10ADF0000000000000000000000000000000000053 -:10AE00000000200000000000000000000000000022 -:10AE10000000000000000000000000000000001022 -:10AE200000000000400040100000000040004040D2 +:10AE00000000000000000000000000000002000040 +:10AE10000000000000000000000000000000000032 +:10AE200000000000400040000000000040004040E2 :10AE30000000000000000000000000000000000012 :10AE400000004000000000000000000000000000C2 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000002000000D0 +:10AE5000000000000000000000000000C000000032 +:10AE60000040000000000000080000000200000098 +:10AE700000000000000000000000000000000000D2 :10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000001000000000000000000000000A1 +:10AE900000000000000000000000000010000000A2 +:10AEA00000000002000000000000000000000000A0 :10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED000020002000200000000000000000002006A -:10AEE0000040000000080000000000080000000012 -:10AEF0000000000000000000000002000000000050 -:10AF00000000000800080000000000080000000029 -:10AF10000000000800000000000000000000000029 -:10AF20000000000800000008000000000008000009 -:10AF3000000002000004000000000000000000000B -:10AF400000000000000800080000000000080000E9 -:10AF500000000000000800000000000000000000E9 -:10AF600000000000000800000000000000000000D9 +:10AEC0000200000000000000000000000000000080 +:10AED00000000000000000000000000000004080B2 +:10AEE0000040000000100000001000000000000002 +:10AEF0000000000000C0000000000000000010087A +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000829 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF400000080000000000000000000000000000F9 +:10AF500000000000000000000000000000000000F1 +:10AF6000800200000000000000000000000000005F :10AF700000000000000000000000000000000000D1 :10AF800000000000000000000000000000000000C1 :10AF900000000000000000000000000000000000B1 @@ -183081,39 +183081,39 @@ :10AFB0000000000000000000000000000000000091 :10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 -:10AFE00000000000000000000000000000000084DD +:10AFE0000000000000000000000000000000000061 :10AFF0000000000000000000000000000000000051 :10B000000000000000000000000000000000000040 :10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000090017 +:10B020000000000000000000000000000000000020 :10B030000000000000000000000000000000000010 :10B040000000000000000000000000000000000000 :10B0500000000000000000000000000000000000F0 :10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000100BF -:10B090000000000000000000004000000000000070 +:10B07000000000000000000000000011004000403F +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 :10B0A00000000000000000000000000000000000A0 :10B0B0000000000000000000000000000000000090 -:10B0C000000000110000000000000000000000006F -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000080058 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000010000000000040000020 +:10B0E0000000000000000000000000000000000060 :10B0F0000000000000000000000000000000000050 :10B10000000000000000000000000000000000003F -:10B11000200000000000000000000000000000000F +:10B11000000000000000000000000000000000002F :10B12000000000000000000000000000000000001F :10B13000000000000000000000000000000000000F :10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF +:10B1500000000000000000000010000000000000DF :10B1600000000000000000000000000000000000DF :10B1700000000000000000000000000000000000CF :10B1800000000000000000000000000000000000BF :10B1900000000000000000000000000000000000AF -:10B1A000000000000000000088008800400000004F -:10B1B000000000040000000000000000000000008B +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F :10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F +:10B1E000000000000000000020000000020000003D :10B1F000000000000000000000000000000000004F :10B20000000000000000000000000000000000003E :10B21000000000000000000000000000000000002E @@ -183121,113 +183121,113 @@ :10B23000000000000000000000000000000000000E :10B2400000000000000000000000000000000000FE :10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE +:10B2600000000000000000000000800000008000DE :10B2700000000000000000000000000000000000CE -:10B2800000080000000000000000000000000000B6 +:10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE :10B2A000000000000000000000000000000000009E :10B2B000000000000000000000000000000000008E -:10B2C0000000000800000000000000000000000076 +:10B2C000000000000000000000000000000000007E :10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E +:10B2E0000000000000000000080000000000040052 :10B2F000000000000000000000000000000000004E -:10B30000000010000000000000000000000000002D -:10B31000000000000000000000000000020000002B +:10B3000000000204020020002000000000000000F5 +:10B31000000000000000000000000000000000002D :10B32000000000000000000000000000000000001D :10B33000000000000000000000000000000000000D :10B3400000000000000000000000000000000000FD :10B3500000000000000000000000000000000000ED :10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD +:10B37000800000000000000000000000000000004D :10B3800000000000000000000000000000000000BD :10B3900000000000000000000000000000000000AD :10B3A000000000000000000000000000000000009D -:10B3B0000000000000000000020000000000C000CB +:10B3B000000000000000000000000000000000008D :10B3C000000000000000000000000000000000007D :10B3D000000000000000000000000000000000006D :10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D +:10B3F00001C0A09100400008000000000000000013 :10B40000000000000000000000000000000000003C -:10B41000000000000000000020000000000000000C +:10B41000000000000000000000000000000000002C :10B42000000000000000000000000000000000001C -:10B43000000000000000000000008000000000008C -:10B44000800000000000000000000000000000007C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC :10B4500000000000000000000000000000000000EC :10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC +:10B470000000218080210085000000000000000005 :10B4800000000000000000000000000000000000BC -:10B49000000000000000000000000000000000416B +:10B4900000000000000000000000000000000000AC :10B4A000000000000000000000000000000000009C -:10B4B000000000000000800000000000000000000C +:10B4B000000000000000000000000000000000008C :10B4C000000000000000000000000000000000007C :10B4D000000000000000000000000000000000006C :10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C +:10B4F00000000000000000A10003000000000000A8 :10B50000000000000000000000000000000000003B :10B51000000000000000000000000000000000002B :10B52000000000000000000000000000000000001B -:10B530000000000000000800A00000000000000063 +:10B53000000000000000000000000000000000000B :10B5400000000000000000000000000000000000FB :10B5500000000000000000000000000000000000EB :10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB +:10B57000000000000000000000C00001000000000A :10B5800000000000000000000000000000000000BB :10B5900000000000000000000000000000000000AB -:10B5A0008800000000000000000000000000000013 -:10B5B000000000000000009000900008000800005B -:10B5C00000020008009000080000000000000000D9 +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B :10B5D000000000000000000000000000000000006B :10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B +:10B5F0000000000000000000080000000000200023 :10B60000000000000000000000000000000000003A :10B61000000000000000000000000000000000002A :10B62000000000000000000000000000000000001A :10B63000000000000000000000000000000000000A -:10B6400000000080000000000080000000000000FA +:10B6400000000000000000000000000000000000FA :10B6500000000000000000000000000000000000EA :10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA +:10B67000000000000000000000008000000000004A +:10B680002100000000000000000000000000000099 :10B6900000000000000000000000000000000000AA -:10B6A0000000000800000000000000000000000092 -:10B6B000000000000000000000000000000000800A +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A :10B6C000000000000000000000000000000000007A :10B6D000000000000000000000000000000000006A :10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 +:10B6F0000000000000000000000000008011A121F7 +:10B7000000008000000000000000000000000000B9 :10B710000000000000000000000000000000000029 :10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000009079 -:10B7400000100000000000000000000000000000E9 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 :10B7500000000000000000000000000000000000E9 :10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 +:10B770000000000000000000000000000000C00108 +:10B78000090002009000000000000000000000001E :10B7900000000000000000000000000000000000A9 -:10B7A000000000000000810000C800000000000050 +:10B7A0000000000000000000000000000000000099 :10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000673 +:10B7C0000000000000000000000000000000000079 :10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 :10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 +:10B80000001100C84300810000000000000000009B :10B810000000000000000000000000000000000028 :10B820000000000000000000000000000000000018 :10B830000000000000000000000000000000000008 -:10B8400000000000300000000000000000000000C8 +:10B8400000000000000000000000000000000000F8 :10B8500000000000000000000000000000000000E8 :10B8600000000000000000000000000000000000D8 :10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 +:10B880000000F03C3C3C0000000000000000000014 :10B8900000000000000000000000000000000000A8 :10B8A0000000000000000000000000000000000098 :10B8B0000000000000000000000000000000000088 -:10B8C0000000000000003000000000000000000048 -:10B8D0000001000000000000000000000000000067 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 :10B8E0000000000000000000000000000000000058 :10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 +:10B9000000000000F03CF0F000000000000000002B :10B910000000000000000000000000000000000027 :10B920000000000000000000000000000000000017 :10B930000000000000000000000000000000000007 @@ -183239,36 +183239,36 @@ :10B9900000000000000000000000000000000000A7 :10B9A0000000000000000000000000000000000097 :10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000090909090000037 +:10B9C0000000000000000000000000000000000077 :10B9D0000000000000000000000000000000000067 :10B9E0000000000000000000000000000000000057 :10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000000036 +:10BA0000000000000000000000240F0F00000000F4 :10BA10000000000000000000000000000000000026 :10BA20000000000000000000000000000000000016 :10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000099909990A4 +:10BA400000000000000000000000000000000000F6 :10BA500000000000000000000000000000000000E6 :10BA600000000000000000000000000000000000D6 :10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 +:10BA80000000000000000000000000240000000092 :10BA900000000000000000000000000000000000A6 :10BAA0000000000000000000000000000000000096 -:10BAB000000000610006800D000000000000000092 +:10BAB0000000000000000000000000000000000086 :10BAC0000000000000000000000000000000000076 :10BAD0000000000000000000000000000000000066 :10BAE0000000000000000000000000000000000056 :10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 +:10BB0000000000000000000000000000A0615A22B8 +:10BB1000000D000000000000000000000000000018 :10BB20000000000000000000000000000000000015 :10BB30000000000000000000000000000000000005 :10BB400000000000000000000000000000000000F5 :10BB500000000000000000000000000000000000E5 :10BB600000000000000000000000000000000000D5 :10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 +:10BB8000000000000000000000000000000000FFB6 +:10BB900000FF0000000000000000000000000000A6 :10BBA0000000000000000000000000000000000095 :10BBB0000000000000000000000000000000000085 :10BBC0000000000000000000000000000000000075 @@ -183276,7 +183276,7 @@ :10BBE0000000000000000000000000000000000055 :10BBF0000000000000000000000000000000000045 :10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 +:10BC100000FF00FF00000000000000000000000026 :10BC20000000000000000000000000000000000014 :10BC30000000000000000000000000000000000004 :10BC400000000000000000000000000000000000F4 @@ -183284,7 +183284,7 @@ :10BC600000000000000000000000000000000000D4 :10BC700000000000000000000000000000000000C4 :10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 +:10BC90000000000F000F0000000000000000000086 :10BCA0000000000000000000000000000000000094 :10BCB0000000000000000000000000000000000084 :10BCC0000000000000000000000000000000000074 @@ -183292,104 +183292,104 @@ :10BCE0000000000000000000000000000000000054 :10BCF0000000000000000000000000000000000044 :10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000200003 -:10BD20002000200020000000200020000000200053 -:10BD3000200020000000000000000000880020001B -:10BD40000000000020000000200020000000000093 -:10BD50002000200000000000400000000000000063 -:10BD6000200040004000200000002000200088004B -:10BD70000000200020000000000020000000000063 -:10BD800020002000200020000000200020000000F3 -:10BD90000000200020000000000000000000000063 +:10BD100000000000000F000F000000000000000005 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000100000000000000000000000E3 +:10BD500000000000100000000000000000000000D3 +:10BD600000000000000000000000000000000000D3 +:10BD70000000000010002000000000000000000093 +:10BD800000000000000000000000000000000000B3 +:10BD90000000000082000000000000000000000021 :10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000100010001000100043 -:10BDC0000000100200001000000000000000000051 -:10BDD0000000000010000000000000000000000053 -:10BDE00040024000000200000000000000000000CF -:10BDF0000000000000020000000000000000000041 -:10BE000040000000000000000000000000000000F2 -:10BE10000000000000000000000000000000000022 +:10BDB0000000000000000000100010020000100051 +:10BDC0000000100200000000000000000000000061 +:10BDD0000000000010000000100000000000000043 +:10BDE0004000400000024000200000000000000071 +:10BDF000000000000000000800000000000000003B +:10BE000000000000000000004000000000000000F2 +:10BE100000000000000000400000000000000000E2 :10BE20000000000000000000000000000000000012 :10BE30000000000000000000000000000000000002 :10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE80000000000000000040004000000000000032 -:10BE90000000000000000040000000000200000060 -:10BEA000000000000000000800080000000000087A -:10BEB0000008000000000000000800000000000072 -:10BEC000000000000000000800080000000000085A -:10BED0000008000000000000000800000000000052 -:10BEE0000000000000000000000800080000000042 -:10BEF000000800080000000000000008000000002A -:10BF00000000000000000000000800080000000021 -:10BF10000008000800000000000000080000000009 +:10BE50000000000010400000000000000000000092 +:10BE600000000000000000000000000300000000CF +:10BE70000000000000000000004000000000000082 +:10BE800000000000000000000000000000000000B2 +:10BE9000000000400000084000000000000000001A +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF000000800000084000000400008000000006E +:10BF000000000000000000000000004000000000F1 +:10BF100000080000000000000000000800C0000051 :10BF20000000000000000000000000000000000011 :10BF30000000000000000000000000000000000001 :10BF400000000000000000000000000000000000F1 :10BF500000000000000000000000000000000000E1 :10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 +:10BF700000000002000000000000000000000000BF +:10BF800000000000000000030000000000000000AE :10BF900000000000000000000000000000000000A1 :10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000080079 +:10BFB0000000000000000000000000000000000081 :10BFC0000000000000000000000000000000000071 :10BFD0000000000000000000000000000000000061 :10BFE0000000000000000000000000000000000051 :10BFF0000000000000000000000000000000000041 :10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 +:10C010000000000000000000000000000000080018 :10C020000000000000000000000000000000000010 -:10C030000000400000000000C00000000000000000 -:10C04000100000000000000082000000000000005E -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000080000000000C8 -:10C0700000000000000000000000000000000000C0 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000040A0 +:10C0600000000000000000000000000000000000D0 +:10C070000040000000000000000000000000000080 :10C0800000000000000000000000000000000000B0 :10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000080088 -:10C0B0000800100000000000000000000000000068 -:10C0C0000000000000000000000041000000080027 -:10C0D0000800030010000000110000000000000034 -:10C0E0000000000000001000000000000000000040 -:10C0F0001000100010000000000000000000000010 -:10C100000000000000000000080000000000000027 -:10C1100008000800100000000000000000000000FF -:10C120000000000000000000080000000000000007 -:10C1300000000000000008000000000000000000F7 -:10C14000000000000000820000000000000000006D +:10C0A0000010200000000000000000000000000060 +:10C0B0000000090000000000000000000000000077 +:10C0C000000000040000000000000000000000006C +:10C0D0000000000000000000000000000000000060 +:10C0E00000000000000000A00000000000000000B0 +:10C0F0000000000800000000000000000000000038 +:10C1000000000000000800840000000000000000A3 +:10C11000000000000000000000000000000000001F +:10C12000000000000004000000000000000000000B +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF :10C1500000000000000000000000000000000000DF :10C1600000000000000000000000000000000000CF :10C1700000000000000000000000000000000000BF :10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F +:10C19000000000000000000000000000000500009A :10C1A000000000000000000000000000000000008F :10C1B000000000000000000000000000000000007F :10C1C000000000000000000000000000000000006F -:10C1D00000000084000000000000000000000000DB -:10C1E0000000000000000400040000000500000042 -:10C1F000000005000000000000000000000000003A +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F :10C20000000000000000000000000000000000002E :10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E +:10C220000000000000000000080000000000000006 :10C2300000000000000000000000000000000000FE :10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000020000DC +:10C2500000000000000000000000000000000000DE :10C2600000000000000000000000000000000000CE :10C2700000000000000000000000000000000000BE :10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B00000000000000000000000080000020888E4 -:10C2C000080041000800080008000000000000000D -:10C2D000000000000000000000000800000008004E -:10C2E000080003000800080008000000000000002B -:10C2F0000000000000000000000000000800000036 -:10C30000080008000300000008000800000000000A -:10C31000000000000000000000000000080000080D -:10C3200008000800080000000800080000000000E5 +:10C29000000000000041000000000000000000005D +:10C2A000000000000000000000040000000000008A +:10C2B00000000000000000000000000000000088F6 +:10C2C00000000088208802000288000000000000B2 +:10C2D0000000000000000000000000000000000856 +:10C2E000000000080000200000080000000000001E +:10C2F000000000000000000000000000000000003E +:10C300000008000000A0000020000008000000005D +:10C31000000000000000000000000000000000001D +:10C3200000080000000000002000200800000000BD :10C3300000000000000000000000000000000000FD :10C3400000000000000000000000000000000000ED :10C3500000000000000000000000000000000000DD @@ -183536,80 +183536,80 @@ :10CC20000000000000000000000000000000000004 :10CC300000000000000000000000000000000000F4 :10CC400000000000000000000000000000000000E4 -:10CC5000000000000000000000008800000000004C -:10CC6000C00000000000000020008800200000003C -:10CC70000000000000002088C00020000000040028 -:10CC800020000000000000008800200020000000BC -:10CC90000000000000002008000320002000000029 -:10CCA0002000200000000000000020002000000004 -:10CCB0000000000000000400208820002000000088 -:10CCC0002000200000000000000000000000000024 -:10CCD000000000000000200020880000000000008C +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC70000000000000000080000000000000000034 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000100000300000000000090 +:10CCA0000000000000000000400000000000000044 +:10CCB00000000000000000000080000000000000F4 +:10CCC00000000000820000000000000000000000E2 +:10CCD00000000000000000000080000000000000D4 :10CCE0000000000000000000000000000000000044 -:10CCF000000000000000000000050000000000002F -:10CD000000000000000000000000000040004000A3 -:10CD1000000000004000400040090000000000004A +:10CCF0000000000000000000000400000000000030 +:10CD00000000000000000000000000004000409013 +:10CD10000000000040004000200000000000000073 :10CD20000000000000000000004000004000000083 -:10CD300000000000000000000000000800000000EB +:10CD300000000000000000000000000400000000EF :10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000800000000CB +:10CD500000000000000000000000000400000000CF :10CD600000000000000000000000000000000000C3 :10CD700000000000000000000000000000000000B3 :10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000800000000013 +:10CD90000000000000000000000000000000000093 :10CDA0000000000000000000000000000000000083 -:10CDB00000000000000000000000000000800000F3 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000040000000000080000093 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000100000000053 +:10CDD0000000000000000000000000000000000053 :10CDE0000000000000000000000000000000000043 -:10CDF0000000090000000000000000000008000022 -:10CE00000200000000000000000000000000000020 -:10CE1000000000000000000000000000000400000E -:10CE200000000000000000000000000000080000FA -:10CE300000000000000400000000000000000004EA -:10CE400000000000000000000000000000100000D2 -:10CE500000000000000000000000000000000004CE -:10CE600000110000000000000000000000000000B1 +:10CDF00000000000004000000000000000000000F3 +:10CE00000000000000000000000000000000000022 +:10CE100000000000000000000000000000400000D2 +:10CE200000000000000000000000000000040000FE +:10CE3000000000000000000800080000000000845E +:10CE400000000000000000000008000000080008CA +:10CE500000C000000000000800080000008400007E +:10CE600000000000000000000000000000000000C2 :10CE700000000000000000000000000000000000B2 -:10CE80000000900000000000000000000000000012 -:10CE90000000000000000000000088000000840086 -:10CEA0000000880000008800000000000000000072 -:10CEB0000000000000000000000000000000002151 -:10CEC0000000000000000000002100110000000828 -:10CED000000000000000000000080000000000004A -:10CEE0000000000000000000000000000000000042 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000002171 +:10CEA00000000021002100210021000000000008F6 +:10CEB00000090021004100210021000000210000A4 +:10CEC00000000021002100210021000000030000DB +:10CED00000210021002100210009000000000000C5 +:10CEE00082050000000000000000000000000000BB :10CEF0000000000000000000000000000000000032 :10CF00000000000000000000000000000000000021 -:10CF100000000000000000004000000009000000C8 +:10CF10000000000000000000000000000000000011 :10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 +:10CF30000000000000C000000084000000000000AD :10CF400000000000000000000000000000000000E1 :10CF500000000000000000000000000000000000D1 -:10CF60000000000000000800A0008200080082000D -:10CF70008200820000008200820082008200820023 -:10CF80008200820002008200820082008200820011 -:10CF900082088200900008000008820000008200E1 -:10CFA00082008200000082008200400082000000B7 -:10CFB00082008200820082000800000082000000DF -:10CFC0008200820082008200820040008200000015 -:10CFD0008200820082008200080000008200A0001F -:10CFE00082008200820000000000000000000000BB -:10CFF00000000000050008002100410000000000C2 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000008000000000000000500000000000084 +:10CFA000000300410000000000000000000000003D +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000008002000000000000000000029 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 -:10D010000000400040000800000000000000000088 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000005000000EB +:10D010000000000000000000000000000000000010 +:10D02000000000000000000000000000000000847C +:10D0300000000000000000000008000000000000E8 :10D0400000000000000000000000000000000000E0 :10D0500000000000000000000000000000000000D0 -:10D060000000000000000000A0000000C000000060 -:10D07000820000000000C00000000000000000006E -:10D080000000000000000000880000000000000018 -:10D090000000000000008800000000000000000008 -:10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C000000000000000A00000000000C000000000 -:10D0D0000000C00000000000000000000000000090 -:10D0E0000000000000000000080000000000000038 +:10D06000000000000082000000000000000000003E +:10D0700000000000000000000000000000000000B0 +:10D080000000000000000008000000000000000098 +:10D09000000000000000000500000000000000008B +:10D0A000000000000000000000000000000300007D +:10D0B0000000000800210000000000000000000047 +:10D0C0000000000000000000000000000000000060 +:10D0D000000000000003000000000010000000003D +:10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 :10D10000000000000000000000000000000000001F :10D11000000000000000000000000000000000000F @@ -183617,96 +183617,96 @@ :10D1300000000000000000000000000000000000EF :10D1400000000000000000000000000000000000DF :10D1500000000000000000000000000000000000CF -:10D16000000000000000000000000000000082003D -:10D170000000A0008400C0000000000000000000CB -:10D18000000000000000000000000800000008008F -:10D190000000A000080000000000200000000000C7 -:10D1A0000000000000000000000008000000000077 -:10D1B00008000000A00008000200000000000000BD -:10D1C000000008000000002100000000080000002E -:10D1D00008000000A0000800000000000000080097 -:10D1E000000000210000000000000000000000001E +:10D1600000000000000000000000000000000000BF +:10D17000000000000000000000000000200000008F +:10D18000000000000000004000000000000000005F +:10D19000000000000000000000000000000000008F +:10D1A0000000000800080000002100080000000046 +:10D1B0000000000000000000002100000008000046 +:10D1C000000000000000000800000008002100002E +:10D1D000000000000000000020030000000000002C +:10D1E0000000000000000008000000210005000011 :10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E +:10D21000000000000000000004000000000000000A :10D2200000000000000000000000000000000000FE :10D2300000000000000000000000000000000000EE :10D2400000000000000000000000000000000000DE :10D2500000000000000000000000000000000000CE :10D2600000000000000000000000000000000000BE -:10D2700000010001000100C00001A00100C0008306 -:10D2800000000001002000020001000100C00000B9 -:10D2900000010001000100C00001A00100C00083E6 -:10D2A00000000101002000040001000100C0000096 -:10D2B000000000010001000100C00001A00100C049 -:10D2C000018300000401004000820001000100C051 -:10D2D000000000010001000100C00001A00100C128 -:10D2E000018300000001004000900001000100C027 -:10D2F000000000410041004100C00041004100A089 -:10D30000054100410541000000800041004100C08E -:10D31000000000410041004100C00041004100A068 -:10D32000034100410241000000800041004100C073 -:10D330000000000000410041004100C000410041E8 -:10D3400000A010410041A0410000008000410041C8 -:10D3500000C0000000410041004100C00041004108 -:10D3600000C0104100412041000000000041004188 -:10D3700000C0000041000300000000804100C00028 -:10D380000000030020001000002090004100C100B8 -:10D390000000000041000300000000804100C000C8 -:10D3A0000000030020001000002082004100C100A6 -:10D3B0000000000000034100030000000080410065 -:10D3C000C0000000030002001000002084004100A3 -:10D3D000C100000000004100030000000080410087 -:10D3E000C000000003002000100000208300410066 -:10D3F000C1000000000001000100000000C00100A9 -:10D40000C00000000100A000A1400041C100410097 -:10D41000C1000040400001000100000000C0010008 -:10D42000C00000000100A000A1400041C100410077 -:10D43000C10000404000000001000100000000C0E9 -:10D440000100C000000001004100A1400009C1002E -:10D450000300C1000040400001000100000000C0C6 -:10D460000100C000000001004000A1400009C00010 -:10D470000300C1000040400000C00001C0C1000026 -:10D480000000000100C120A10005000100C1000052 -:10D49000000000010000000000C00001C0C1000049 -:10D4A0000000000100C120A00005000100C1000033 -:10D4B0000000000100000000000000C00001C0C129 -:10D4C00000000000000100C120A00005000100C113 -:10D4D0000000000000010000000000C00001C0C109 -:10D4E00000000000000100C120A00005000100C1F3 -:10D4F000000000000001000000000080004180C129 -:10D5000000000000004100A0004000C1004100C137 -:10D51000000000000041004000000080004180C188 -:10D5200000000000004100A0000500C1004100C152 -:10D5300000000000004100400000000000800041A9 -:10D5400080C100000000004100A0000500C10041B2 -:10D5500000C10000000000410040000000800041C8 -:10D5600080C100000000004100A0000500C1004192 -:10D5700000C100000000004100400000C100800028 -:10D5800080C100004100800002004100C1418000D4 -:10D59000802000004100000080004100C1008000A8 -:10D5A00080C100004102800082004100C141800032 -:10D5B0008020000041000000800041000000C10008 -:10D5C000800080C100004100800002004100C1C114 -:10D5D0000000802000004100000080004100C100E8 -:10D5E000800080C100004100800082004100C141F4 -:10D5F0000000802000004100000080004100C100C8 -:10D600004000C0C1000001000400C1000100C1834E -:10D610000200C001000001000000C0000100C100C4 -:10D620004000C0C100000101040041000100C183AD -:10D630000200C001000001000000C0000100000065 -:10D64000C1004000C0C1000001000400030001004F -:10D65000C1092000C001000001000000C00001005D -:10D66000C1004000C0C10000010004000900010029 -:10D67000C1832000C001000001000000C0000100C3 -:10D680000000000000000042000000000000000058 -:10D690008112004807004800000000000000000060 -:10D6A0000000000000000042000000000000000038 -:10D6B0008112004807004800000000000000000040 -:10D6C0000000000000000000004200000000000018 -:10D6D0000000811200480700480000000000000020 -:10D6E00000000000000000000042000000000000F8 -:10D6F0000000811200480700480000000000000000 +:10D2700000000000000000000100000000000000AD +:10D280000001000000C000000000000000000000DD +:10D29000000000000000000000000000000000008E +:10D2A000000000000002000000000000000000007C +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000200000000100000004C +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000200000000000000003C +:10D2F00000000000000000000000410000000000ED +:10D300000000002009000080000000000000000074 +:10D31000000000000000000000000000000000000D +:10D3200000000009020000000000000000000000F2 +:10D3300000000000000000000000000000000000ED +:10D3400000000000000904000000000000000000D0 +:10D3500000000000000000000000000000000000CD +:10D3600000000000000905000000000000000000AF +:10D3700000000000000003000000008000008000AA +:10D38000000000000200110000000000800000000A +:10D39000000000410000110000000000000000003B +:10D3A00000000000020008000000800000000000F3 +:10D3B0000000001100000000090000000000000053 +:10D3C00000000000000008001000000080000000C5 +:10D3D0000000000000030000090000000000000041 +:10D3E00000000000000004001000000080000000A9 +:10D3F00000000000001100000100000000C000005B +:10D40000200000000000C100C00400C0C0000400F3 +:10D41000000000000001000000000000000000000B +:10D42000000000000000C00003A000C008000200CF +:10D4300000000000000000000000000000000000EC +:10D440000000000000000000C10002A000C00800B1 +:10D4500002000000000000010000000000000000C9 +:10D460000000000000000000C10002A000A00800B1 +:10D47000880000000000000000000000C000000064 +:10D4800000000000000000000020A000A00000003C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000100000000000006C +:10D4B000000000000000000000000000000000006C +:10D4C0000000000000000000000000040000000058 +:10D4D000000000000000000000000000000000004C +:10D4E0000000000000000000000000040000000038 +:10D4F00000000000000000000000000000008000AC +:10D50000000000000000000000000080000000009B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D57000000000000000000000000000000080002B +:10D5800000C10000000000000000000000C1000019 +:10D5900000040000000000000000000000118000F6 +:10D5A00000C1000000000000000000000041000079 +:10D5B0000004000000000000000000000000000067 +:10D5C0008000009100000000000000000000004109 +:10D5D0000000000900000000000000000000000042 +:10D5E00080000091000000000000000000000041E9 +:10D5F0000000000900000000000000000000000022 +:10D60000400000C1000000000000000000000041D8 +:10D610008400000100000000000000000000000085 +:10D62000200000400000000000000000000000C1D9 +:10D630008800000000000000000000000000000062 +:10D6400000000800001000000000000000000000C2 +:10D6500000C1020000000000000000000000000007 +:10D6600000000800001000000000000000000000A2 +:10D6700000C10200000000000000000000000000E7 +:10D680000000000000000042000000000000480010 +:10D69000810000E00000480000000000000000429F +:10D6A000000000000000000000000000000000007A +:10D6B000810000E0000048000000000000000000C1 +:10D6C000000000000000000000000000000000005A +:10D6D0000000810000E000004800000000000000A1 +:10D6E000000000000000000000000000000000003A +:10D6F0000000810000E00000480000000000000081 :10D700000000000000000000000000000000000019 :10D710000000000000000000000000000000000009 :10D7200000000000000000000000000000000000F9 @@ -183723,116 +183723,116 @@ :10D7D0000000000000000000000000000000000049 :10D7E0000000000000000000000000000000000039 :10D7F0000000000000000000000000000000000029 -:10D80000000000000000757B000000000000000028 +:10D80000000000000000747B000000000000000029 :10D810000000000000000000000000000000000008 -:10D8200000000000DEAE757B00000000000000007C +:10D8200000000000DE2E747B0000000000000000FD :10D8300000000000000000000000000000000000E8 -:10D8400000000000DEAE0000757B0000000000005C +:10D8400000000000DE2E0000747B000000000000DD :10D8500000000000000000000000000000000000C8 -:10D86000000000000000DEAE757B0000000000003C +:10D86000000000000000DE2E747B000000000000BD :10D8700000000000000000000000000000000000A8 -:10D88000000000000000DEAE60C6030000000000E3 -:10D8900000000031E0000000000000000C0000006B -:10D8A0000000000000C0630660C603000000000026 -:10D8B00000000031E0000000000000000C0000004B -:10D8C0000000000000C06306000060C60300000006 -:10D8D000000000000031E0000000000000000C002B -:10D8E00000000000000000C0630660C603000000E6 -:10D8F000000000000031E0000000000000000C000B -:10D9000000000000000000C0630600000000880066 -:10D910008400200000002000000020000000000023 -:10D9200084000000840000002000000000002000AF -:10D9300020002000000088000000200000000000FF -:10D940000000840000000000200000000000000033 -:10D9500000002000200088000000000020000000DF -:10D960000000000020000000000020000000000077 -:10D9700000002000000000008800000020000000DF -:10D980000000000000000000000020000000000077 -:10D990000000000020000000000000000000000067 -:10D9A0000000000000900590000000000090009032 -:10D9B00000900040004000402040000040004040F7 -:10D9C0000540050005400000000000000000004088 -:10D9D0000040000000400040004000000000400007 -:10D9E00000400000000009000000000000000000EE -:10D9F00000400000004000000000000000000000A7 -:10DA0000000000000000090000000000000000000D -:10DA10000000000000000000000000000000000006 +:10D88000000000000000DE2E615603400000000092 +:10D8900000000231E0000000000000000C40000029 +:10D8A0000000000002C06A866156034000000000CC +:10D8B00000000230A0000000000000000C4000004A +:10D8C0000000000002C06A860000615603400000AC +:10D8D000000000000230A0000000000000000C402A +:10D8E00000000000000002C06A866156034000008C +:10D8F000000000000230A0000000000000000C400A +:10D9000000000000000002C06A8600000000000065 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000900090000000000090009037 +:10D9B0000090004000400040004000004000404017 +:10D9C0000090400000400000000000000000004007 +:10D9D0000040004000400040004000000040004087 +:10D9E00000400000000040000000000000000000B7 +:10D9F00000400000000040000000000000000000A7 +:10DA00000000000000000000000000000000000016 +:10DA100000000000000800000000000000000000FE :10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA500000000000000400000000000000040008B6 -:10DA60000005000000100010000800000000000089 -:10DA70000000000800050004000800000000000588 -:10DA80000000000500000000000000000000000091 -:10DA9000000800080000000000080008000000085E -:10DAA000000800000000000000000000000000006E -:10DAB00000840008000000000008000800000008C2 -:10DAC0000004000000000000000000000000000052 -:10DAD000000000080008000000000008000800081E -:10DAE0000004000800080008000800000008000802 -:10DAF0000008008200040010000800820008008472 -:10DB00000008000800080008000800080008008459 -:10DB100000080000000000000000000000000000FD +:10DA300000000010000000000000000000000000D6 +:10DA400000000000000800000000000000000000CE +:10DA500000000008000000100000000000000004AA +:10DA60000008000800080008000000000000000096 +:10DA70000000000000000000000000000008000599 +:10DA8000000000000008004100000000000000004D +:10DA90000008000000000004000800080000000862 +:10DAA0000000000000000008000000080008000856 +:10DAB000000800000000000800080008000000083E +:10DAC000000000000000000400000008000800083A +:10DAD000000000040000000000080008000800002A +:10DAE000000800840000008400840008000800088A +:10DAF00000080004000800100084000400080084EE +:10DB0000000800820008008800100084000800045B +:10DB100000100000000000000000000000000000F5 :10DB200000000000000000000000000000000000F5 -:10DB300000000008000000000000000000000000DD -:10DB400000000008000000000000000000000000CD -:10DB500000000000000000020008000000000000BB -:10DB600000000002000000000000000000000000B3 -:10DB7000000000000008000000000000000000009D -:10DB80000000000000000000001000000000000085 -:10DB9000000800210300000003000800030000004B -:10DBA0000800000000000000000000000800000065 -:10DBB0000000000000000000080003000300000057 -:10DBC000080000000000000000004000000000000D -:10DBD000000000000000000000000800030000003A -:10DBE000030008000000000000000000000000002A -:10DBF000000000000000000000000000030003001F -:10DC00000800030000000000000000000000000009 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000800000008000000000000B5 +:10DB600000080000000000000000000000000000AD +:10DB70000000000000050000000800080000000090 +:10DB8000000000000000000000000008000000008D +:10DB90000008000800000000000000000000000075 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000010000045 +:10DBD0000000000000000000000000000000000045 +:10DBE000000000000000000000000000000000082D +:10DBF00000000000000000840000000000000000A1 +:10DC0000000000000000000000000000000000A074 :10DC10000000000000000000000000000000000004 -:10DC20000000000000000000000000004000400074 -:10DC300000004000000000000000000000000000A4 -:10DC4000000000080000000000210021080000037F -:10DC50000808000800210000000000000000820009 -:10DC6000080000000000000000000000000082002A -:10DC7000080000004000000000000000000000005C -:10DC8000080000000000000000000000000000008C -:10DC9000080000000000000000000000000000007C -:10DCA00000840000000000000000000000000000F0 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000009DB +:10DC400000000000000000080000000000040000C8 +:10DC500000000005000500000000000000000000BA +:10DC600000000000000000000000000000000000B4 +:10DC70000000000000000000001000000000000094 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 -:10DCC000000000000000000000000000000000084C +:10DCC0000000000000000000000000000000000054 :10DCD0000000000000000000000000000000000044 :10DCE0000000000000000000000000000000000034 :10DCF0000000000000000000000000000000000024 -:10DD0000000000000000000800000000000000000B +:10DD00000000000000000000000000000000000013 :10DD10000000000000000000000000000000000003 :10DD200000000000000000000000000000000000F3 :10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000000000000C3 -:10DD600000000808000000000000000000000000A3 +:10DD400000000000000000000000000000000008CB +:10DD500000000008000000000000000000000000BB +:10DD600000000000000000000000000000000000B3 :10DD700000000000000000000000000000000000A3 -:10DD8000000008000000000000000000000000008B -:10DD90000000000000000000000000000300000080 -:10DDA000000000000000000000000000080000006B -:10DDB000080000000000000000000000000000401B -:10DDC0000000080000000000030000000800000040 -:10DDD0000000000040000000000000000000000003 -:10DDE00009000000100000000000410000000800D1 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC00000000000000000000000000000000082D1 +:10DDD00000840000000000000000000000000000BF +:10DDE00000000000000000C0000000000000000073 :10DDF0000000000000000000000000000000000023 -:10DE000000000000000008000000410000000800C1 -:10DE100000000900000000000000000000000000F9 -:10DE200000000000000000000000000000000021D1 +:10DE0000000000000000000000000000000000080A +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 :10DE300000000000000000000000000000000000E2 :10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000000000000B2 +:10DE500000000000000000000000002100000000A1 +:10DE6000000000000040000400000000000000006E :10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000000000092 +:10DE8000000000000000000000080000000000008A :10DE90000000000000000000000000000000000082 :10DEA0000000000000000000000000000000000072 :10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 -:10DED0000000000800080200000000000000000828 +:10DEC00000000000000000000000000000000082D0 +:10DED00000A0000000A0000000000000000000C042 :10DEE0000000000000000000000000000000000032 :10DEF0000000000000000000000000000000000022 :10DF00000000000000000000000000000000000011 @@ -183993,16 +183993,16 @@ :10E8B0000000000000000000000000000000000058 :10E8C0000000000000000000000000000000000048 :10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000400000024 -:10E8F0000000000000000000000004000000000014 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 :10E900000000000000000000000000000000000007 -:10E91000000000000000000000000000200088004F -:10E9200000000000000000000000000000000008DF +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000080000000000000000DF :10E9300000000000000000000000000000000000D7 :10E9400000000000000000000000000000000000C7 :10E9500000000000000000000000000000000000B7 :10E960000000000000000000000000004100410025 -:10E9700000000000410041004100000000000000D4 +:10E9700000000000410041C0000000000000000055 :10E980000000000000000000410000004100000005 :10E990000000000000000000000000000000000077 :10E9A0000000000000000000000000000000000067 @@ -184015,77 +184015,77 @@ :10EA100000000000000000000000000000000000F6 :10EA200000000000000000000000000000000000E6 :10EA300000000000000000000000000000000000D6 -:10EA4000000000000000000000000000000000883E -:10EA50000008000000080008000000080008000886 -:10EA60000008000800000008004000080000000046 -:10EA70000008000000080008000000080008000866 -:10EA800000080008000000080000008400000000EA -:10EA900000000008000000080008000000080082D4 -:10EAA00000080008008400080008000800080008AA -:10EAB00000080008008800840010000800400008DA -:10EAC00000400008000800080008000800080008CE +:10EA400000000000000000000000000000000008BE +:10EA50000008000000400008004000000008000816 +:10EA60000008000800080008000000000008000876 +:10EA7000000800000008000800000000000800086E +:10EA800000840008000800080000000000080000E2 +:10EA900000840008000000840008000000000084DA +:10EAA00000080000000800080084000800000008BA +:10EAB000000800080084008400080008000800081E +:10EAC0000008000800820008008400080008000810 :10EAD0000000000000000000000000000000000036 :10EAE0000000000000000000000000000000000026 :10EAF0000000000000000000000000000000000016 :10EB00000000000000009000000000000000000075 -:10EB100000000000000000000000000000210021B3 -:10EB20000003000900008200000000000021002115 -:10EB30000021000000000021000800000021000862 -:10EB4000002100000000081000100000002100005B +:10EB100000000000002100000000000000000000D4 +:10EB20000003002100030005002100000000000098 +:10EB30000021002100000008000800030000000080 +:10EB40000021002100000008000300000000000078 :10EB50000021000000000000000000000000000094 :10EB600000000000000000000000000000000000A5 :10EB70000000000000000000000000000000000095 :10EB80000000000000000000000000000000000085 -:10EB9000000000000000000000000000000000086D -:10EBA0000000000000000000000000020000000063 -:10EBB000000000000000000000000000000800004D -:10EBC000000000000008000000000000000000003D +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC000000000000000000000000000000800003D :10EBD0000000000000000000000000000000000035 :10EBE00001800000000000000000000000000000A4 :10EBF0000080000000000000010000000000000094 :10EC00000000000000000000000000000000000004 -:10EC1000010000000000000000000800000000806B -:10EC200000000000000001000000000000000000E3 -:10EC30000000000000000000000000800000000054 +:10EC100001000000000000000000000000000000F3 +:10EC20000000008000000100000000000000000063 +:10EC300000000000000000000000000000000000D4 :10EC400000000100000000000000000000000000C3 -:10EC500000000000000000000000000000000000B4 +:10EC500002000000000000000000000000080000AA :10EC6000000008100000000000000000000000008C -:10EC7000000000100000000000000800000000007C -:10EC800000002000000000000000200000000084C0 -:10EC900000A0080800080000000000000008008430 -:10ECA00000400000000000A002000000000000A0E2 -:10ECB0000000000000000000000000000010000044 -:10ECC00000000000080000400000000000000000FC +:10EC70000000001000000000000008000000090073 +:10EC800000002000000000000000200000000082C2 +:10EC900000000804000000000008000000A00008B8 +:10ECA00000820008001000080200000800000000B8 +:10ECB0000000000000000000000000000000000054 +:10ECC000000000000800000000000000000000003C :10ECD00000000040000000000000000000000000F4 :10ECE0000000000000000000000000000000000024 :10ECF0000000000000000000000000000000000014 :10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000008DB -:10ED300000000000000000000000000000000000D3 +:10ED100000000000000000000000000000000008EB +:10ED200000030000000000080000000000000021B7 +:10ED300000030008000000100000000000000000B8 :10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 +:10ED500000100000000000030000000000000000A0 :10ED600000000000000000000000000000000000A3 :10ED70000000000000000000000000000000000093 :10ED80000000000000000000000000000000000083 -:10ED9000000000000000000000000000050000006E +:10ED90000000000000000000000000000000000073 :10EDA0000000000000000000000000000000000063 :10EDB0000000000000000000000000000000000053 -:10EDC000000000000000000000000000000008003B +:10EDC0000000000000000000000000000000000043 :10EDD0000000000000000000000000000000000033 :10EDE0000000000000000000000000000000000023 :10EDF0000000000000000000000000000000000013 :10EE00000080000000000000008000000000000002 -:10EE10000000000000000000008000000000002151 -:10EE200000000100000000000000000000080000D9 -:10EE300000000000000000000000000000000000D2 +:10EE100000000000000000080000002100000000C9 +:10EE200000000000000000000000000000000000E2 +:10EE30000000000000000000000000400000000092 :10EE400000000000000000000000000000000000C2 :10EE500000000000000000000000000000000000B2 :10EE600000000000000000000000000000000000A2 :10EE70000000000000000000000000000000000092 -:10EE800000000010000000000000001000C00000A2 -:10EE900000001190090800900008001000A0000078 -:10EEA0000008000008000000000000000000000052 +:10EE80000000001000000000000000100000000062 +:10EE900009840000098409000200000020820000AB +:10EEA0000000000000000000000000000000000062 :10EEB0000000000000000000000000000000000052 :10EEC0000000000000000000000000000000000042 :10EED0000000000000000000000000000000000032 @@ -184199,7 +184199,7 @@ :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B :10F5B000000000000000000000000000000000004B -:10F5C000000000000000000000100000000000002B +:10F5C000000000000000000000000000000000003B :10F5D000001000000000000000000000000000001B :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B @@ -184235,20 +184235,20 @@ :10F7D0000000000000000000000000000000000029 :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000003801180D4 -:10F820000980018003004180058003800000000002 -:10F8300000000000000000058900418021800000D8 -:10F8400000000000000100080000000000000000AF -:10F850000000000000000000000000100000000098 -:10F860000000000800100000000000000000000080 -:10F870000000000000000000001000000005000073 +:10F8000000000000000000000000000000080000F0 +:10F8100000000000000000000000000503800580DB +:10F820000380018003001180058009800000000032 +:10F8300000000000000000008900038041800000FB +:10F8400000000000000100000000000000080000AF +:10F8500000000000000000050000000000000000A3 +:10F860000000000000100000000000000000000088 +:10F870000000000000000005000000000000001073 :10F880000000000000000000000000000000000078 :10F8900000000000000000000000000000009010C8 -:10F8A000821090201002900082049004A02000009A -:10F8B0000900000000000000090020A082041020C0 -:10F8C0002000200000000000202000002020000078 -:10F8D00000000000000000000000000020200000E8 +:10F8A0009010C010100290008820C010900400003A +:10F8B0000900000000000000090020A0C010900412 +:10F8C0002000200000000000200020002020000078 +:10F8D00009000000000000000000000020200000DF :10F8E00020000000000000000000000000000000F8 :10F8F0000000000000000000000000000000000008 :10F9000000000000000000000000000000000000F7 @@ -184259,35 +184259,35 @@ :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 -:10F980000000000000000000000000080000000867 -:10F99000000800080084000800840008000800082F -:10F9A00000080008008400080008000800000008A3 -:10F9B000008400080008000800000008000800108B -:10F9C000000800080008001000100000008400007B -:10F9D0000010008800100084008400840008008467 -:10F9E00000000084000800080000000000840008F7 -:10F9F00000000084000000080084000800080008DF -:10FA0000000800080008004000080008000000008E -:10FA100000000000000000080000000000000000DE -:10FA2000000000000000210841000005000009005E -:10FA300003001100000000050000000800000000A5 -:10FA4000000005212100000000000000000000056A -:10FA5000002100210010000000050008000800211E -:10FA60000003000800080010002100030021000826 -:10FA700000210000004100210021000000210021A0 -:10FA800000410000000300210008000500210000E3 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000000000000C00082000000000014 -:10FAB00090008800880000000000000000000000A6 -:10FAC000000000009000C0000000000000000000E6 +:10F9800000000000000000000000000800080084E3 +:10F99000000000840000000800840008000800083F +:10F9A000000800080084000000000008008400082F +:10F9B000000000080000000800000008000800081F +:10F9C000001000880008000000100000000800106F +:10F9D000008400840084000800840008000800847B +:10F9E00000080000008400080008000000C00008B3 +:10F9F00000840084008400080084000800100008CF +:10FA0000004000840008000800080000000000001A +:10FA100000000000000000000021000300000000C2 +:10FA20000010000000034100050300080000210051 +:10FA30000300030800000008000000080000001098 +:10FA40000000210000000000000000000000002174 +:10FA50000021000800000008004100080005000522 +:10FA60000008000500210003000000210003000839 +:10FA7000002100000008000800000008000000004D +:10FA80000010000800050021000000050000000033 +:10FA9000000000080000000000000000000000005E +:10FAA0000000000000000000A00090000000000026 +:10FAB0008200A000840000000000000000000000A0 +:10FAC00000000000840008000000000000000001A9 :10FAD0000000000000000000000000000000000026 -:10FAE00000000000000000100000000000000008FE +:10FAE0000000000000000000000000000000000016 :10FAF0000000000000000000000000000000000006 -:10FB000000000000000000000000000000000000F5 -:10FB100000000000000000000000000000000000E5 -:10FB200000000000000000000000040000000000D1 -:10FB30000000040040004000000000002000000021 -:10FB400000000000000000000000000000000000B5 +:10FB000000000000000000000000000000A0000055 +:10FB1000A000000000000000000000000000000045 +:10FB200000000000000000000000020000000000D3 +:10FB30000000400010004000000000000000000035 +:10FB40002000000000000000040000000000000091 :10FB500000000000000000000000000000000000A5 :10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 @@ -184295,36 +184295,36 @@ :10FB90000000000000000000000000000000000065 :10FBA00000000000000000000000000080000000D5 :10FBB00000000000800080008000000000000000C5 -:10FBC0000000000000000000000000000000000035 -:10FBD000000000010000000800000000000000001C +:10FBC00000000000000000000000800000000000B5 +:10FBD0000000000000100000000000000000000015 :10FBE0000000000000000000000000000000000015 :10FBF0000000000000000000000000000000000005 :10FC000000000000000000000000000000000000F4 :10FC100000000000000000000041000000000000A3 -:10FC2000000500000000000000410000000000008E -:10FC300000000000000000000000000000000000C4 +:10FC200000050000000000000003000000000008C4 +:10FC300000000000000000080000001000000000AC :10FC4000000000000000000000000080000300052C -:10FC50000000000000000003000500000008000094 -:10FC6000000300000041000500000000000000212A -:10FC7000000000000000000000100000000800006C +:10FC500000000021000000410008001000410000E9 +:10FC60000000000000210000000000000000000073 +:10FC70000000000000000000000000100010000064 :10FC80000000000000000000000000000000000074 -:10FC90000000002100000000000000000000000043 +:10FC90000000000000000000000000000000000064 :10FCA0000000000000000000000000000000000054 :10FCB0000000000000000000000000000000000044 -:10FCC0000000000000000000000000000010000024 +:10FCC000000000000000000000000000000800002C :10FCD0000000000000000000000000000000000024 -:10FCE0000000000000000000000000100000000004 +:10FCE0000000000000000000000000000000000014 :10FCF0000000000000000000000000000000000004 :10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 -:10FD200000000005000000000000000500020000C7 -:10FD30000000002100000000000000000000880812 -:10FD4000880000000000000000000021000000000A -:10FD500000040021000088000000001000110003D2 -:10FD60000021002100080000000000000008000041 -:10FD70000000000300000000000000000000000080 -:10FD80000000000000000000000000000000000073 -:10FD90000000002100000000000000000000000042 +:10FD10000000000000000000A00000000000000043 +:10FD200000000000000000000000000000020000D1 +:10FD3000000000000000000000000000000088003B +:10FD400000000000000000000000000002000000B1 +:10FD5000900800210008004100000003004100005D +:10FD60000010000000000000000000000000000083 +:10FD7000000800080000001000000000000500005E +:10FD8000000000000005000000000000004100002D +:10FD90000000000000000000001000000000000053 :10FDA0000000000000000000000000000000000053 :10FDB0000000000000000000000000000000000043 :10FDC0000000000000000000000000000000000033 @@ -184335,33 +184335,33 @@ :10FE100000000000000000000000000000000000E2 :10FE200000820000000020000040000000000000F0 :10FE30000082000000000000000000000000000040 -:10FE4000000000000000000000820000050000002B -:10FE5000000000000000840101C01000000000004C -:10FE6000000100820000000000000000000000000F +:10FE4000000000000000000000820000C00001006F +:10FE5000000000000000000101401100000000004F +:10FE60000000008200000000000000000000000010 :10FE70000000000000000101200000400000C00060 :10FE80000100000000000100C0000140C1000001AD :10FE9000840100820000C000010000000000111178 -:10FEA00000210000000011118021008000001111CC -:10FEB0000021000000000000000000000000000021 -:10FEC0000000000000000041004100000000C102ED -:10FED0004104000000000000004003118900000000 -:10FEE00000040020000000000000000000000000EE +:10FEA000002100000000111180210080000040416D +:10FEB0000041000000000000000000000000000001 +:10FEC000000000000000004100410000000002416D +:10FED000032100000000020000032091A0000000A8 +:10FEE0000041004100000000000000000000000090 :10FEF00000000000000000000202802100800000DD :10FF000080414141000000004100802141C1C10009 :10FF10000005800500800000804141410000000094 :10FF20004100000000000400410000000080830048 -:10FF3000410000000000040000000000000000007C +:10FF3000410000000002040000000000000000007A :10FF40000000000000000000410080000002850069 -:10FF500000808309002000000000404100040404E8 -:10FF600000004100000000028500000000000000C9 +:10FF5000000084C1000200000000104000000904FD +:10FF6000000041000000000204000000000000004A :10FF700000000000000000000000410000000080C0 :10FF800083000080C1C10041000000002141000049 -:10FF9000034141000000008083000080C1C1004196 +:10FF9000034141000000008483000080C1C1004192 :10FFA0000000010000000082040001000000004089 -:10FFB0008300010000000082040000000000000037 +:10FFB0008300010000000083040000000000000036 :10FFC00000000000000000000000C100C00000832D -:10FFD000040000082184000100020000010000016B -:10FFE0000100000001000000008204000000000089 +:10FFD000040000A0100900000084000000010000DF +:10FFE0000003000001000000008304000000000086 :10FFF0000000000000000000000000000100000000 :02000004002DCD :100000000040830000C040C100010000000000016A @@ -184369,43 +184369,43 @@ :1000200000010000000000000100000000000000CE :1000300001000000000000000100000000000000BE :1000400000000000000000000000000000000000B0 -:100050000100000000000000848300000000000098 -:10006000000000820001000000000100000000000C +:10005000010000000000000000040000000000009B +:10006000010000100001000000000100000000007D :100070000000C000000000000000000000000000C0 :1000800000000100000000000000C040000000006F :1000900000000100008200000000010000000000DC :1000A0000000C0400000000000004100000000000F :1000B00000004100000000000000410000000000BE :1000C0000000000000000000000000000000000030 -:1000D0000000410000000004004100050400000091 -:1000E000000040020280000000000000410000000B +:1000D00000004100000000090011001100000000B4 +:1000E0000000040500800000000000004100000046 :1000F0000000000080000000000000000000000080 :1001000000000000410000000041004180C10000EB :10011000000000004141008000000000410000009C -:100120000041004180C10000000000000202000008 -:1001300000000000090900000000000002020000A9 +:100120000041004180C10000000500000202000003 +:1001300000050000090900000000000002020000A4 :1001400000000000000000020000000000000000AD -:100150000000000002024000204000808084004037 -:100160000009001089820004000200000000020261 +:10015000000400000202400002000000004000090C +:100160000009000084820040000200050000020235 :10017000000000000000000000410000000000003E -:10018000000000020000040400004141008080C122 -:10019000004100410041C1C10041000900000202CC +:10018000000000020000414100004141008080C1A8 +:10019000004100410041C1C10041000000000202D5 :1001A00000004141008080C10041000000000101C9 :1001B000000000000000000000000000000001013D :1001C000000000000000000000000000000000002F -:1001D00000000000000001010100010100101040BA -:1001E0000001000000004085000000000000000049 +:1001D00000000001000001010100010000A00283F5 +:1001E00000000000000040C100000000000000000E :1001F00001010000000000000000000100000000FC -:10020000000000000000000000000000000100C02D +:10020000000000000001000000000000000100C02C :1002100040C100010001000140C1000100000000D8 -:1002200001010000000100C040C10001484200007F -:1002300000000000484200000000000048420000AA +:1002200001010000000100C040C100018181000007 +:1002300000000000818100000000000088410000F3 :1002400000000000000000000700000000000000A7 -:100250000000000048420000000000000000000014 -:100260000700900000000000000000000000821164 +:10025000000000008181000000000000000000009C +:100260000700420000000000000000230000818120 :10027000000000000000000000002200004200001A -:10028000000000000000818100000000000000006C -:100290000000220048420000000000004842818126 +:1002800000000000000048420000000000000000E4 +:100290000000220048420000000000004842821195 :1002A00000000000000000000000220048420000A2 :1002B000000000000000000000000000000000003E :1002C000000000000000000000000000000000002E @@ -184500,7 +184500,7 @@ :100850000000000000000000000000000000000098 :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 -:100880000000000000001001000000010000000056 +:1008800000000000000090010000000100000000D6 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 @@ -184508,7 +184508,7 @@ :1008D0000000000000000000000000000000000018 :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 +:1009000000000000000000002000000000000000C7 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 @@ -184516,17 +184516,17 @@ :100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 -:1009800000000000000000000000490000004004DA +:10098000000000000000000000000900000000045A :100990000000000000000000000000000000000057 :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 :1009D0000000A40000000000000000000000000073 :1009E0000000000000000000000000000000000007 -:1009F000000000000000000010000000E000000007 -:100A00000010004021000000000000000000000075 -:100A100000000000000000000100300000000000A5 -:100A20000000800000000000000000000000000046 +:1009F00000000000000000000000000000000000F7 +:100A00000010004001000000000000000000000095 +:100A10000000000000000000010090000000100035 +:100A2000000088010000000000000000000000003D :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 :100A50000000000000000000000000000000000096 @@ -184553,22 +184553,22 @@ :100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 :100BC0000000000000000000000000000000000025 -:100BD00000000008000800000008000800000000F5 -:100BE00000000008000000000008000000080000ED -:100BF00000000008000800000008000800000008CD -:100C000000000008000000000008000000080000CC -:100C100000000000000800080000000800080000B4 -:100C200000080000000800000000000800000008A4 -:100C30000000000000080008000000080008000094 -:100C40000008000000080000000000080000000884 -:100C50000000000000000000000000000000000094 -:100C6000000800000000000000000000000000007C +:100BD00000000008000800080008000000000008ED +:100BE00000000008000000080000000800000000ED +:100BF00000000008000800080008000000000008CD +:100C000000000008000000080000000800000000CC +:100C100000000000000800080008000800000000B4 +:100C200000080000000800000008000000080000A4 +:100C30000000000000080008000800080000000094 +:100C40000008000000080000000800000008000084 +:100C5000000800000000000000000000000000008C +:100C60000000000000000000000000000000000084 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 :100C90000000000000000000000000000000000054 :100CA000000000000000000000000000000500003F -:100CB000000000050000000000000000000000002F -:100CC0000000000000080003000000000003000016 +:100CB0000000000000090000000000000005000026 +:100CC0000000000000080000000000000008000014 :100CD000000000000008000000000000000000000C :100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 @@ -184599,25 +184599,25 @@ :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000800050000000015 -:100ED0000000000000000000000000080003000007 +:100EB000000000000000000000000008000000002A +:100EC000000000000000000000050000000000001D +:100ED0000000000000000000000000000000000012 :100EE0000000000000000000000000000000000002 :100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 +:100F40000000000000000000000000080000000099 :100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC00000210021000000030003000000000000D9 -:100FD00000210000000000080000000000000000E8 +:100FB00000210000000000000021000000000000EF +:100FC00000210000000000000021000000000000DF +:100FD00000210000002100000000000000000000CF :100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 @@ -184647,17 +184647,17 @@ :10118000000000000000000000000000000000005F :10119000000000000000000000000000000000004F :1011A000000000000000000000000000000000003F -:1011B0000008000000000000000200000000000025 +:1011B000000900000000000000090000000000001D :1011C0000000800000000000000900000000000096 -:1011D00000090000000000000008000000000000FE +:1011D00000110000000000000008000000000000F6 :1011E00000000000000000000000000000000000FF :1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE :1012100000000000000000000000000000000000CE :1012200000000000000000000000000000000000BE -:1012300000000001020000000000000000000000AB -:101240000000000008000000000000000000000096 -:10125000000000000200000000000001000000008B +:1012300000000000020000000000000000000000AC +:10124000000000001000000000000000000000008E +:1012500000000000A00000000000000100000000ED :10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E :10128000000000000000000000000000000000005E @@ -184776,7 +184776,7 @@ :101990000000000000000000000000000000000047 :1019A0000000000000000000000000000000000037 :1019B0000000000000000000000000000000000027 -:1019C00000000000000000000000400000000000D7 +:1019C0000000000000000000000000000000000017 :1019D0000000000000000000000000000000000007 :1019E00000000000000000000000000000000000F7 :1019F00000000000000000000000000000000000E7 @@ -184797,7 +184797,7 @@ :101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 :101B000000000000000000000000000000000000D5 -:101B100000040000000000000000000000000000C1 +:101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 @@ -184805,9 +184805,9 @@ :101B60000000000000000000000000000000000075 :101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 -:101B90000000004000000000000000000000000005 +:101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 -:101BB00000000040000000000000000000000000E5 +:101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 @@ -184822,7 +184822,7 @@ :101C70000000000000000000000000000000000064 :101C80000000000000000000000000000000000054 :101C90000000000000000000000000000000000044 -:101CA0000000000000000021000000000000000013 +:101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 @@ -184835,7 +184835,7 @@ :101D40000000000000000000000000000000000093 :101D50000000000000000000000000000000000083 :101D60000000000000000000000000000000000073 -:101D7000000000000000000008000000000000005B +:101D70000000000000000000000000000000000063 :101D80000000000000000000000000000000000053 :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 @@ -184850,18 +184850,18 @@ :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 -:101E60000000000200000000000000000000000070 -:101E70000000000000000000000000000000000062 -:101E8000000000000000000000000008000000004A +:101E60000000000000000000000000000000000072 +:101E700000000000008400000000000000000000DE +:101E800000000000000000000000008400000000CE :101E90000000000000000000000000000000000042 :101EA0000000000000000000000000000000000032 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 :101ED0000000000000000000000000000000000002 :101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 +:101EF00000000000000000000000000000000008DA :101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 +:101F100000000000000800000000000000000000B9 :101F200000000000000000000000000000000000B1 :101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 @@ -185019,12 +185019,12 @@ :1028C0000000000000000000000000000000000008 :1028D00000000000000000000000000000000000F8 :1028E00000000000000000000000000000000000E8 -:1028F000000000000000000000000000C000000018 -:102900000000000000000000000000004000000087 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 :1029100000000000000000000000000000000000B7 -:102920000000000000000000000000002000840003 +:1029200000000000000000000000000000000000A7 :102930000000000000000000000000000000000097 -:10294000C0000000000000000000000000000000C7 +:102940000000000000000000000000000000000087 :102950000000000000000000000000000000000077 :102960000000000000000000000000000000000067 :102970000000000000000000000000000000000057 @@ -185033,25 +185033,25 @@ :1029A0000000000000000000000000000000000027 :1029B0000000000000000000000000000000000017 :1029C0000000000000000000000000000000000007 -:1029D00000000003000000000000000000000000F4 -:1029E00000000000000000000000000000000003E4 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 :102A000000000000000000000000000000000000C6 :102A100000000000000000000000000000000000B6 :102A200000000000000000000000000000000000A6 :102A30000000000000000000000000000000000096 :102A40000000000000000000000000000000000086 -:102A500000000000000000000000008400000000F2 -:102A6000000800000000000000000000000000005E +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 :102A70000000000000000000000000000000000056 -:102A800000820000000000000000000000000000C4 +:102A80000000000000000000000000000000000046 :102A90000000000000000000000000000000000036 -:102AA0000000000000020000000000000000000024 -:102AB000000000000000000000000008000000000E -:102AC0000000000000000000000000000000000006 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000840000000000000000000082 :102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000210000C5 -:102AF00000000000000000000000000000050000D1 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 :102B000000000000000000000000000000000000C5 :102B100000000000000000000000000000000000B5 :102B200000000000000000000000000000000000A5 @@ -185061,7 +185061,7 @@ :102B60000000000000000000000000000000000065 :102B70000000000000000000000000000000000055 :102B80000000000000000000000000000000000045 -:102B9000000000000000000000000000000000082D +:102B90000000000000000000000000000000000035 :102BA0000000000000000000000000000000000025 :102BB0000000000000000000000000000000000015 :102BC0000000000000000000000000000000000005 @@ -185070,23 +185070,23 @@ :102BF00000000000000000000000000000000000D5 :102C000000000000000000000000000000000000C4 :102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 -:102C30000000000000000000C000000000000000D4 -:102C40000000000000000000820000000000000002 +:102C20000000000000000000000000008400000020 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 :102C50000000000000000000000000000000000074 :102C60000000000000000000000000000000000064 :102C70000000000000000000000000000000000054 :102C80000000000000000000000000000000000044 :102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB000000000000000000005004100400000008E -:102CC0000000000000000000000000000000000004 +:102CA000000000000000000000000000000800001C +:102CB000000000000000000000000000050003000C +:102CC00000000000000000000000000000A0000064 :102CD00000000000000000000000000000000000F4 :102CE00000000000000000000000000000000000E4 :102CF00000000000000000000000000000000000D4 :102D000000000000000000000000000000000000C3 :102D100000000000000000000000000000000000B3 -:102D2000000000000000000000000000000008009B +:102D200000000000000000000000000000000000A3 :102D30000000000000000000000000000000000093 :102D40000000000000000000000000000000000083 :102D50000000000000000000000000000000000073 @@ -185101,17 +185101,17 @@ :102DE00000000000000000000000000000000000E3 :102DF00000000000000000000000000000000000D3 :102E000000000000000000000000000000000000C2 -:102E100000080000000000000000000000000000AA -:102E20000000000000000080000000000000000022 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 :102E30000000000000000000000000000000000092 :102E40000000000000000000000000000000000082 :102E50000000000000000000000000000000000072 -:102E60000000000000000000000000A000000000C2 -:102E7000000800000000000000000000000000004A -:102E800000000000000000000000008400000000BE +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 -:102EA0000000000000000000001000000000000012 -:102EB0000000000000000000000000000000000012 +:102EA0000000000000000000000000000000000022 +:102EB000000000000000000000000000050000000D :102EC0000000000000000000000000000000000002 :102ED00000000000000000000000000000000000F2 :102EE00000000000000000000000000000000000E2 @@ -185268,96 +185268,96 @@ :103850000000000000000000000000000000000068 :103860000000000000000000000000000000000058 :103870000000000000000000000000000000000048 -:10388000000000000000A000000000000000000098 -:103890000000000000080000000000000000000020 -:1038A000000000000000880088000000A0008800E0 -:1038B000A0000000A01100000000A0008800C000CF -:1038C00000000003000000002000000000002000B5 -:1038D00000000000000020000000000020000000A8 -:1038E00000000000000000000000000000002000B8 -:1038F0000000000000002000000000002000000088 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000008000000000000 +:1038C0000000000290000000000000000000000066 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F0000000000084000000000000000000000044 :1039000000000000000000000000000000000000B7 :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 -:103930000000000011000000000000000000000076 +:103930000000000000000000000000000000000087 :103940000000000000000000000000000000000077 :103950000000000000000000000000000000000067 :103960000000000000000000000000000000000057 :103970000000000000000000000000000000000047 -:10398000000000000000000000080000000000032C +:103980000000000000000000000000000000000037 :103990000000000000000000000000000000000027 :1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C0000000000000800000000000000000000077 -:1039D00000000000000000000000000000000000E7 -:1039E0001010104020020410000000000000000031 +:1039B00000000000000000000000000000001000F7 +:1039C00002000404041000000000000000000000D9 +:1039D0000000000000000000900000000000000057 +:1039E00000000000000011000000000000000000C6 :1039F00000000000000000000000000000000000C7 -:103A00000000000000002008008400820000000088 -:103A10000000008400020008000000000000008494 -:103A20000084008400820084000000840000000004 -:103A300000000000000000840090009000000000E2 -:103A400000000000000000040000008400000000EE -:103A50000000000000000000200000000000000046 -:103A6000000080018001800180010000000400004E -:103A70000000000000000000000000040000000042 -:103A8000000000000000000080010021000400058B -:103A900000090005001100000000000800000000FF -:103AA0000000002100210021002100030021000965 -:103AB000002100040002001100090004002100049C -:103AC00000040000000000200009000000210008A0 -:103AD00000000000000000000000000000080000DE -:103AE00000000000000000000020000000000000B6 -:103AF00000000000000000000000000000000000C6 -:103B0000000000000000000000080021000000008C -:103B100000000000000000000000000000000002A3 +:103A000000000000000001000000000800000000AD +:103A100000000000000000000000000400000000A2 +:103A20000000000000000000000000840000000012 +:103A30000000000000000000000000000000000086 +:103A40008000800080018001000000000000000074 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000A000000000040000B2 +:103A70000000000000000000000000000000000046 +:103A8000000000000008000010000000000000001E +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB00000000000000000000000000000090000FD +:103AC00000000000000000000000000000110000E5 +:103AD00000000000000000400000000000000000A6 +:103AE0000000000000210021000000000000000094 +:103AF0000021000000210021000000000000000063 +:103B0000000500000021002100000000000000006E +:103B100000000000000000000000000000000000A5 :103B20000000000000000000000000000000000095 -:103B30000000000000000000000000044000000041 -:103B40000000000000000000000000200000000055 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 :103B50000000000000000000000000000000000065 -:103B60000000000000000000000003000000000052 +:103B600011000000000008000000000000004000FC :103B70000000000000000000000000000000000045 -:103B80000200000000000000000000000000000033 -:103B900000008400000000000000000000000000A1 -:103BA00000008200C000000000001000C080000083 -:103BB0000000000000000000C00000000000000045 -:103BC0000000000000000000000000000080000075 -:103BD00000000000000008000000000008000000D5 -:103BE00000000800000082000000080008800000BB -:103BF0000000000000008200A0008200820000009F -:103C0000840000008400820008008200820000001E -:103C10000000000041000000000000000000000063 -:103C20000082000000000084000000000000000886 -:103C300000000000000000000000000000A00300E1 -:103C400000820000000000000000000000000008EA +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000100008000000000000DD +:103BD0000000000000000000000000000000840061 +:103BE00000008400C0008400C000C000C00082004B +:103BF0000000820000008200C00000000000000001 +:103C00004000000000000000000000000000010073 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000100010000000072 :103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000002034 +:103C60000000000000000000000000000000000054 :103C70000000000000000000000000000000000044 -:103C80000000000021000000000000000000000013 -:103C90000000000000004000000090002000000034 -:103CA000000090000000000000210000000400005F -:103CB00000044008000008000400040000000000A8 -:103CC00000020000000000000000000000000000F2 -:103CD0000020000002004000000000000000000082 -:103CE0008800000000110000000400000000000037 -:103CF00000040004002082040211000000000800FB -:103D000000000000000000000000000000000000B3 +:103C80000000000000000000000000000000000034 +:103C90002000000000000000000000000000000004 +:103CA00000000000000000000000400000000000D4 +:103CB00000002000000000000000000000000000E4 +:103CC00000000000000400090000022000000000C5 +:103CD000002000002000004000050000000000005F +:103CE00000009000000040404000400040000008FC +:103CF000880000040800C0088200000900000000DD +:103D00000000A00000000000000000000000000211 :103D100000000000000000000000000000000000A3 :103D20000000000000000000000000000000000093 -:103D30000000000100000000000000000000000082 +:103D30000000000000000000000000000000000083 :103D40000000000000000000000000000000000073 :103D50000000000000000000000000000000000063 :103D60000000000000000000000000000000000053 :103D70000000000000000000000000000000000043 :103D80000000000000000000000000000000000033 -:103D90000000000000000005000084000000000397 -:103DA00000000021000000210000000000000005CC -:103DB000000300050008002100008221000000002F -:103DC00000000000C0000000000000000000000033 -:103DD00000000000000000000000000000000000E3 -:103DE000C000000000000000000000000000000013 -:103DF0000800000000000000A00000000800000013 -:103E0000C000C00000000000000000000000000032 -:103E10000000002100210000000000000000000060 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB000000000000000000000008400000000007F +:103DC000000084000000000000000000000000006F +:103DD00000000000000000000000000800000000DB +:103DE00000000000000300000000000000000000D0 +:103DF0000003000000000000000000000000C00000 +:103E0000820082008200000000000000000000002C +:103E1000000000000008000000000000000000009A :103E20000000000000000000000000000000000092 :103E30000000000000000000000000000000000082 :103E40000000000000000000000000000000000072 @@ -185365,79 +185365,79 @@ :103E60000000000000000000000000000000000052 :103E70000000000000000000000000000000000042 :103E80000000000000000000000000000000000032 -:103E9000000000000000000000000001000100011F -:103EA00000C10001000100C00089000000010008FD -:103EB00000100001880100C10000000100010001A4 -:103EC00000C00001000100C00041000000010084AA -:103ED00000040001000100C0000000020000C10059 -:103EE0000001C1820100C0000140C003C000C10147 -:103EF0000040C0820000C000019188000001000164 -:103F0000000100C00001000100C00021000100010B -:103F1000000800880001400100C00000004100418D -:103F20000041008800410041008508410002024133 -:103F300000800080004100410090000000410041ED -:103F4000004100C0004100410085084100100241CD -:103F5000008000800041004100A0000000000041FE -:103F6000C1410041C188414180414182A08385080F -:103F700088030080808000418041080300000041E8 -:103F80000041004100C0004100410085084100029D -:103F90000541008000000041804100C00000410058 -:103FA000030000000080410083000000100090002A -:103FB0000900000088004100C100000080004100AD -:103FC0000300000000804100830000000200100098 -:103FD0008280000883004100C1000000000000034F -:103FE0004100084100C100004141884100410841B1 -:103FF00090C108C100908380C100C14100C1801000 -:1040000041000300000000804100C00000000800E3 -:1040100010008200000088004100C10000408000C4 -:1040200001000100000000C00100C000000000000D -:10403000030084C000C0C1000300C10000888200EA -:1040400001000100000000C00100C00000000000ED -:104050000300401000C0C0080900C100002090000B -:1040600000000000000100C1000000014001000943 -:10407000000111C1091100C183C01000400100C13D -:10408000820101000100000000C00100C00000002A -:104090000100200008880090C1004100C1000040DC -:1040A000820000C00001C0C100000000000100C18A -:1040B00082100009000100C10000000000010001A1 -:1040C000000000C00001C0C100000000000100C0ED -:1040D000C0090009000100C100000000000100004B -:1040E0000000000000400000C1830000000000004C -:1040F000C14088C100020000C14000000000000073 -:10410000C000000000C00001C0C1000000000001AC -:1041100000C102830005000100C100000000000191 -:10412000000000000080004180C10000000000414C -:104130000090800200C1004100C100000000004169 -:10414000001000000080004180C10000000000411C -:1041500000C080080041004100C100000000004193 -:1041600000200000000000800041C183000000002A -:104170000041C190004000C10041C1C100000000E9 -:104180000021914100000080004180C1000000003A -:1041900000410082030300C1004100C10000000093 -:1041A000004100400000C103802180C10080410225 -:1041B000000541004100C1410000800200004100B3 -:1041C000000080004100C100800080C10000410863 -:1041D000000041004100C141000080080000410092 -:1041E0000000800041000000C188804180C10000C3 -:1041F0004141800890C140C1C141008080C10000A0 -:104200004141001180801011C100800080C1000078 -:104210004100001005004100C14100008020000065 -:104220004100000080004100C1014000C0C1008287 -:104230000100020102000100C1111000C0000000D5 -:1042400001000000C0000100C1004000C0C100002A -:104250000100100090000100C1911000C001000099 -:1042600001000000C0000100000040C020018240A9 -:1042700000000001100183C101C1402108C040C1FC -:1042800000000001000082C00020C1004000C0C149 -:1042900000000100200103000100C1912000C000C6 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB000000000000000000000000000C100000140 +:103EC000C1820100C0000140C011C000C001000457 +:103ED000C082010002000184900000010001000185 +:103EE000000100C00001000100C00121000000012C +:103EF000008400100001000100C100000001000169 +:103F0000000100C10001000100C0014100000001EA +:103F1000000400100001000100C1000000000000CA +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000041C1413E +:103F40000041C18341418041418883038010A00327 +:103F5000008080804141004110C10000000000410C +:103F600000410041008300410041009010410004E5 +:103F70004141008000800041004100850000004177 +:103F80000041004100A000410041009010410004A8 +:103F900005410080008000410041008500000000D4 +:103FA0000000000000000000000000000000000011 +:103FB00000000000000000000000000000004100C0 +:103FC000084100C100004141884100C1084188C149 +:103FD0000841009183804100C14100C1008300007D +:103FE0004100030000000080410083000000100039 +:103FF0000900080000088200C100C1000090808014 +:104000004100030000000080410083000000100018 +:1040100020000200000090004100C100008080806C +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040000000010100C10000000141010005010163 +:1040500040C1119100C083C01000400100C1101187 +:10406000000201000100000000C00100C1000000CA +:104070000088880021900088C0084100C1000085A8 +:10408000101001000100000000C00100C00000008D +:104090000000880041900020C0004100C100008461 +:1040A00010100000000000000000000000000000F0 +:1040B0000000000000000000000000000000000000 +:1040C000000000400000C183000000000000C18229 +:1040D000108300100000C140000000000000C0007C +:1040E0000000000000C00001C0C10000000000018D +:1040F00000C008110011000100C100000000000113 +:104100000000000000C00001C0C10000000000016C +:1041100000C020110083000100C100000000000168 +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:104140000000000000800041C18300000000004129 +:10415000C191808300C10041C1C100000000002165 +:10416000A041000000000080004180C1000000006C +:10417000004100C1000300C1004100C1080000006F +:104180000041001100000080004180C100000000DB +:10419000004100C100030041004100C100000000D7 +:1041A00000410011000000000000000000000000BD +:1041B00000000000000000000000000000000000FF +:1041C000000000000000C188804180C10000411053 +:1041D000004190C103C1C141008080C10000414144 +:1041E0000009808003110000C100800080C1000030 +:1041F0004102001088004100C14180008020000081 +:104200004100000080004100C100800080C100002A +:104210004102001088004100C1C1800080400000C0 +:10422000410000008000410000000000000000008C +:10423000000000000000000000000000000000007E +:10424000000000000000000040C12001824000008A +:104250000001880141C101C1400390C040C100007C +:104260000001000040C001080000C1004000C0C1C2 +:1042700000000100020102000100C1098200C0002B +:10428000000001000000C0000100C1004000C0C1EA +:1042900000000100020102000100C1050200C0008F :1042A000000001000000C00001000000000000004C -:1042B00000420000000000000000811200480700DA -:1042C00048000000000000000000000000000000A6 -:1042D00000420000000000000006811200480700B4 -:1042E0004800000000000000000000000000000086 -:1042F00000004842000000000000484282110060B7 -:104300000600484200000000000048420000000093 -:104310000000004200000000000000008112004880 +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00048420000000000004842418200600600A1 +:1042E00048420000000000004842000000000000BA +:1042F00000000042000000000000000081120041A8 +:10430000070048000000000000000000000000005E +:104310000000004200000000000000008112004187 :10432000070048000000000000000000000000003E :10433000000000000000000000000000000000007D :10434000000000000000000000000000000000006D @@ -185455,79 +185455,79 @@ :1044000000000000000000000000000000000000AC :10441000000000000000000000000000000000009C :10442000000000000000000000000000000000008C -:10443000757B00000000000000000000000000008C -:104440000000000000000000000000000000DEAEE0 +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C :10445000757B00000000000000000000000000006C :104460000000000000000000000000000000DEAEC0 :104470000000757B0000000000000000000000004C :10448000000000000000000000000000000000002C :10449000DEAE757B000000000000000000000000A0 :1044A000000000000000000000000000000000000C -:1044B000DEAE60C603000000000000000031E00036 -:1044C0000000000000000C0000000000000000C020 -:1044D000630660C603000000000000000031E00039 -:1044E0000000000000000C0000000000000000C000 -:1044F0006306000067E64340000000000000023150 -:10450000E0000000000000000C400000000000007F -:1045100002C267E660C60300000000000000003130 +:1044B000DEAE000000000000000000000000000070 +:1044C00000000000000000000000000000000000EC +:1044D000000067E643400000000000000231E000F9 +:1044E0000000000000000C4000000000000002C2BC +:1044F00067E6000060C60300000000000000003115 +:10450000E0000000000000000C00000000000000BF +:1045100000C0630660C60300000000000000003118 :10452000E0000000000000000C000000000000009F -:1045300000C063060000000000000000000800004A +:1045300000C0630600000000000000000000000052 :10454000000000000000000000000000000000006B -:1045500000000000000000000000000000009000CB -:10456000000000000800000000008400000040007F -:10457000400040000000400000000800C0000000B3 -:1045800020000000000020000000000000000000EB -:104590002000200020002000000000008800000013 +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000100000000000A00000000000000000007B +:10459000000000000000000000000000000000001B :1045A00000000000000020000000000000000000EB -:1045B000200020002000000000000000000000009B +:1045B00000000000000000000000000000000000FB :1045C00000000000000000000000000000000000EB :1045D00000000000000000000000000000000000DB -:1045E000000000000000000000000000410000008A +:1045E00000000000000000000000000000000000CB :1045F00000000000000000000000000000000000BB :1046000000000000000000000000000000000000AA :10461000000000000000000000000000000000009A :10462000000000000000000000000000000000008A -:104630000000050000000000000000000000000075 -:104640000200000000000000000000000000000068 +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A :10465000000000000000000000000000000000005A :10466000000000000000000000000000000000004A :10467000000000000000000000000000000000003A -:10468000000000000000000000000000000090009A +:10468000000000000000000000000000100000001A :10469000000000000000000000000000000000001A :1046A000000000000000000000000000000000000A -:1046B0000000000000000000000000000000008278 -:1046C0000008800200000000000800000000000058 -:1046D00000100000000000000000000000000000CA -:1046E00000840088000000000004000000000008B2 -:1046F000008800820084000000000000000000002C +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA :1047000000000000000000000000000000000000A9 -:104710000004000000000000000000000000000095 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000800000000000000000000000061 -:104750000000000000000000001100000000000048 -:104760000041000000000000000000000000000008 -:104770000000001100000000000000000000000028 -:1047800000400000000000000040000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000080000000000000000000879 +:104730000008000800000000000000000000000069 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:1047800000000080000000000000000000000000A9 :104790000000000000000000000000000000000019 :1047A0000000000000000000000000000000000009 :1047B00000000000000000000000000000000000F9 -:1047C00000000084000000000020000000000084C1 -:1047D000000000A00010008400080000000000009D -:1047E00000000002000000000000000000000000C7 -:1047F00000A003000020000000A000000000000056 -:104800000000000000004100000020000000000047 -:104810000000000000200000400000000000000038 -:1048200000000000080003821100000010002100B9 -:104830000000000000000008000000000000000070 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000110000000000C8 +:1047E000000011000040000009000000000000006F +:1047F0000000208800020004000000000004000007 +:1048000000000000001040400000200000001100E7 +:104810000000000800080008000000000000000080 +:104820000000000000004100410000000300000003 +:104830000000000800080008000000000008000058 :104840000000000000000000000000000000000068 :104850000000000000000000000000000000000058 -:1048600000000000C0000000000000000000000088 +:104860000000000000000000000000000000000048 :104870000000000000000000000000000000000038 :104880000000000000000000000000000000000028 -:104890000000000000000000080000000000000010 +:104890000000000000000000000000000000C00058 :1048A0000000000000000000000000000000000008 -:1048B00000000000A0000000000000004000000018 +:1048B00000000000000000000000000000000000F8 :1048C00000000000000000000000000000000000E8 :1048D00000000000000000000000000000000000D8 :1048E00000000000000000000000000000000000C8 @@ -185536,30 +185536,30 @@ :104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 -:104940000000000000000000A000080000000000BF -:10495000000000080000000200000041000000000C -:1049600000008800000000000000000000000000BF -:1049700000000040000000000000000002000000F5 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000040043 +:104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000011000000000000000000000000E6 -:1049C00000000000000000880000000000000090CF -:1049D0001100000000000000000000002090000016 -:1049E00011000090000000000000000000A0000284 -:1049F00000004000000002000000000005900002DE -:104A00000000210000000000000000000000000085 -:104A10000090040040200000110004040004110074 -:104A20000088400011000088000000000500000020 -:104A300000000800000000080802210800000088AB -:104A400000000000000000000003000000008200E1 -:104A50000000000000210000000000000008000825 -:104A6000000800000000000000030000000000003B -:104A700000000000000000000000000082000000B4 +:104990000000000000000000000000009000840003 +:1049A0000000000000000000040000000000000003 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000088000000004000FF +:1049F000008840900020410040040090002000000A +:104A00001100200000000000040000000000000071 +:104A10000008040011000020400000200088000071 +:104A20000000040000000000002000000000000062 +:104A3000000808001100000008000000000000004D +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 :104A80000000000000000000000000000000000026 :104A90000000000000000000000000000000000016 :104AA0000000000000000000000000000000000006 -:104AB00008000000100000000000000000000000DE +:104AB00000000000000000000000000000000000F6 :104AC00000000000000000000000000000000000E6 :104AD00000000000000000000000000000000000D6 :104AE00000000000000000000000000000000000C6 @@ -185569,7 +185569,7 @@ :104B20000000000000000000000000000000000085 :104B30000000000000000000000000000000000075 :104B40000000000000000000000000000000000065 -:104B500000000000409000400082101000000000A3 +:104B50000000000000000000000000000000000055 :104B60000000000000000000000000000000000045 :104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 @@ -185577,7 +185577,7 @@ :104BA0000000000000000000000000000000000005 :104BB00000000000000000000000000000000000F5 :104BC00000000000000000000000000000000000E5 -:104BD00000000000000080000080000080800000D5 +:104BD00000000000000000000000000000000000D5 :104BE00000000000000000000000000000000000C5 :104BF00000000000000000000000000000000000B5 :104C000000000000000000000000000000000000A4 @@ -185585,7 +185585,7 @@ :104C20000000000000000000000000000000000084 :104C30000000000000000000000000000000000074 :104C40000000000000000000000000000000000064 -:104C50000000000000000000000000910010800033 +:104C50000000000000000000000000000000000054 :104C60000000000000000000000000000000000044 :104C70000000000000000000000000000000000034 :104C80000000000000000000000000000000000024 @@ -185593,24 +185593,24 @@ :104CA0000000000000000000000000000000000004 :104CB00000000000000000000000000000000000F4 :104CC00000000000000000000000000000000000E4 -:104CD000000000000000000000002000208288107A -:104CE000108800000000000000000000000000002C +:104CD00000000000000000000000000000000000D4 +:104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 :104D000000000000000000000000000000000000A3 :104D10000000000000000000000000000000000093 :104D20000000000000000000000000000000000083 :104D30000000000000000000000000000000000073 :104D40000000000000000000000000000000000063 -:104D5000000000000000000000000000400200020F -:104D600008200440000000000000000000000000D7 +:104D50000000000000000000000000000000000053 +:104D60000000000000000000000000000000000043 :104D70000000000000000000000000000000000033 :104D80000000000000000000000000000000000023 :104D90000000000000000000000000000000000013 :104DA0000000000000000000000000000000000003 :104DB00000000000000000000000000000000000F3 :104DC00000000000000000000000000000000000E3 -:104DD0000000000000000000000000000000008053 -:104DE000008080008900000000000000000000003A +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 :104DF00000000000000000000000000000000000B3 :104E000000000000000000000000000000000000A2 :104E10000000000000000000000000000000000092 @@ -185618,7 +185618,7 @@ :104E30000000000000000000000000000000000072 :104E40000000000000000000000000000000000062 :104E50000000000000000000000000000000000052 -:104E60000000800080000000000000000000000042 +:104E60000000000000000000000000000000000042 :104E70000000000000000000000000000000000032 :104E80000000000000000000000000000000000022 :104E90000000000000000000000000000000000012 @@ -185626,7 +185626,7 @@ :104EB00000000000000000000000000000000000F2 :104EC00000000000000000000000000000000000E2 :104ED00000000000000000000000000000000000D2 -:104EE00000000400821010200400000000000000F8 +:104EE00000000000000000000000000000000000C2 :104EF00000000000000000000000000000000000B2 :104F000000000000000000000000000000000000A1 :104F10000000000000000000000000000000000091 @@ -185642,7 +185642,7 @@ :104FB00000000000000000000000000000000000F1 :104FC00000000000000000000000000000000000E1 :104FD00000000000000000000000000000000000D1 -:104FE000000000000000A707A202EB41EB41000017 +:104FE00000000000000000000000000000000000C1 :104FF00000000000000000000000000000000000B1 :1050000000000000000000000000000000000000A0 :105010000000000000000000000000000000000090 @@ -185650,7 +185650,7 @@ :105030000000000000000000000000000000000070 :105040000000000000000000000000000000000060 :105050000000000000000000000000000000000050 -:105060000000000000000000F757F2525F5F0A0ADC +:105060000000000000000000000000000000000040 :105070000000000000000000000000000000000030 :105080000000000000000000000000000000000020 :105090000000000000000000000000000000000010 @@ -185658,16 +185658,16 @@ :1050B00000000000000000000000000000000000F0 :1050C00000000000000000000000000000000000E0 :1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000C028C0EB82D7D4 -:1050F0005050000000000000000000000000000010 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 :10510000000000000000000000000000000000009F :10511000000000000000000000000000000000008F :10512000000000000000000000000000000000007F :10513000000000000000000000000000000000006F :10514000000000000000000000000000000000005F :10515000000000000000000000000000000000004F -:10516000000000000000000000000000FC28FCEB34 -:1051700082D7FAFA000000000000000000000000E2 +:10516000000000000000000000000000000000003F +:10517000000000000000000000000000000000002F :10518000000000000000000000000000000000001F :10519000000000000000000000000000000000000F :1051A00000000000000000000000000000000000FF @@ -185675,7 +185675,7 @@ :1051C00000000000000000000000000000000000DF :1051D00000000000000000000000000000000000CF :1051E00000000000000000000000000000000000BF -:1051F000000000C0000000000000000000000000EF +:1051F00000000000000000000000000000000000AF :10520000000000000000000000000000000000009E :10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E @@ -185715,64 +185715,64 @@ :10544000000000000000000000000000000000005C :10545000000000000000000000000000000000004C :10546000000000000000000000000000000000003C -:1054700000000000000000000000000000000040EC +:10547000000000020000000000000000000000002A :10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C +:10549000000000020000000000000000000000000A :1054A00000000000000000000000000000000000FC -:1054B00000010000000000000000000000000000EB -:1054C00000110000000000000000000000000000CB -:1054D00000000000000000000000000000000000CC -:1054E0008800000000020000000000000000000032 -:1054F000000000000000000000000000000021008B -:10550000000100000000000000000000000000009A +:1054B00000000000000000000002000000000000EA +:1054C00010000000000200000000000000020000C8 +:1054D00000000000000200000000000000000000CA +:1054E000000000000002C0000000000000000000FA +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B :10551000000000000000000000000000000000008B :10552000000000000000000000000000000000007B :10553000000000000000000000000000000000006B :10554000000000000000000000000000000000005B :10555000000000000000000000000000000000004B :10556000000000000000000000000000000000003B -:1055700000000000000000000000000000000080AB +:10557000000000000000000000000000000000002B :10558000000000000000000000000000000000001B :10559000000000000000000000000000000000000B -:1055A00000020000000000000000000000000000F9 -:1055B00000000000000000000000000000000010DB -:1055C00000100010001000000000000000000000AB +:1055A00008000800000000000000000082008200E7 +:1055B00000000000000000000000000000000000EB +:1055C00000000000000000000000000000000000DB :1055D00000000000000000000000000000000000CB -:1055E00000000000080000000000000000000000B3 +:1055E000000000000000400000000000000000007B :1055F00000000000000000000000000000000000AB -:105600000040000400000000000000000000000056 +:10560000000000000000000000000000000000009A :10561000000000000000000000000000000000008A :10562000000000000000000000000000000000007A -:105630000008000000000000000000000000000062 -:105640000000000800000000000000000000000052 -:1056500000000084000000000002000000000000C4 -:1056600000000084000000000000000000000000B6 -:105670000000000200000000002000000400000004 -:105680000000000000800200000000000000000098 -:105690000000000004000000040000000000000002 -:1056A0000000400800090400040004004000040059 -:1056B000400000000000000000000000400000006A -:1056C00004000000400040000400040040004000CE -:1056D00084000000000000000400900000000400AE -:1056E0000000000000080000820000000000000030 -:1056F0000000000000080000000008002100030076 -:1057000021000000000000400000000000840000B4 -:1057100000000000000800A00000000000000000E1 -:10572000000000000000008811000082000000005E -:105730000000000000000000090000000008000058 -:105740000000000000000000000000000020000039 -:105750000000000000000000040000000000000045 +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:105650000000000800000000000000000000000042 +:1056600000000000000804008000000000000000AE +:105670000000000200000000000000000000000028 +:10568000000000000000000000000000000000001A +:105690000400000000000000000000000000000006 +:1056A000000000000400000004000000C000000032 +:1056B000000000000000000000009000000000005A +:1056C00000000000000000000400900004008800BA +:1056D0004000400000000000000004000000000046 +:1056E00000000000000000000800000000000000B2 +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:105730000000000000040000002000000000002025 +:105740000000000000000000000000001104000044 +:105750000000000000000000000000000000000049 :105760000000000000000000000000000000000039 -:105770000000000000900000000000000000000099 -:105780000000000000000000000001000000000018 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 :105790000000000000000000000000000000000009 :1057A00000000000000000000000000000000000F9 :1057B00000000000000000000000000000000000E9 :1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000004000000C5 +:1057D00000000000000000000000000000000000C9 :1057E00000000000000000000000000000000000B9 :1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000400000094 +:105800000000000000000000000000000000000098 :105810000000000000000000000000000000000088 :105820000000000000000000000000000000000078 :105830000000000000000000000000000000000068 @@ -185780,24 +185780,24 @@ :105850000000000000000000000000000000000048 :105860000000000000000000000000000000000038 :105870000000000000000000000000000000000028 -:1058800000000400000000000040000000000000D4 +:105880000000000000000000000000000000000018 :105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000020C8 +:1058A00000000000000000000000000000000400F4 +:1058B00000000000000000000000000000000000E8 :1058C00000000000000000000000000000000000D8 :1058D00000000000000000000000000000000000C8 :1058E00000000000000000000000000000000000B8 :1058F00000000000000000000000000000000000A8 -:105900000000000000040000000041010004000449 -:105910000802000000000000000000000004400039 -:105920000500000000000000000000000000000072 -:105930000000000000000000000000000000000067 -:10594000090000000000000000000000112000001D -:10595000000000000000000000000088008800082F -:10596000008800000020000000000000000000008F -:105970000400000000900000000000000000000093 -:105980000000000000000003000000000000000014 -:1059900000000000000000000000000000000021E6 +:105900000000000000000000000000000000000097 +:105910000000000000000000000000000000002067 +:105920000000000000000020000002000000400411 +:1059300000000000000040000020000000080000FF +:105940000000000000000000000000000000000057 +:10595000000800900000000000000020000000008F +:105960000000000000000000000000000000000037 +:10597000000800000000000000000000000000001F +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 :1059A00000000000000000000000000000000000F7 :1059B00000000000000000000000000000000000E7 :1059C00000000000000000000000000000000000D7 @@ -185813,22 +185813,22 @@ :105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 :105A80000000000000000000000000000000000016 -:105A90000000009000000000000000000000000076 +:105A90000000000000000000000000000000000006 :105AA00000000000000000000000000000000000F6 :105AB00000000000000000000000000000000000E6 :105AC00000000000000000000000000000000000D6 :105AD00000000000000000000000000000000000C6 :105AE00000000000000000000000000000000000B6 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10000000000000800000000000000000000005 +:105AF00000000000000000000000000100010000A4 +:105B00000001000000000000000000000000000094 +:105B10000000000000000000000000000000000085 :105B20000000000000000000000000000000000075 :105B30000000000000000000000000000000000065 :105B40000000000000000000000000000000000055 :105B50000000000000000000000000000000000045 :105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 +:105B7000000000000000000000000000001000080D +:105B800000100008000000000000000000000000FD :105B90000000000000000000000000000000000005 :105BA00000000000000000000000000000000000F5 :105BB00000000000000000000000000000000000E5 @@ -185837,7 +185837,7 @@ :105BE00000000000000000000000000000000000B5 :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 -:105C100000000000000000000008000000900000EC +:105C10000000000000000000000000000000000084 :105C20000000000000000000000000000000000074 :105C30000000000000000000000000000000000064 :105C40000000000000000000000000000000000054 @@ -185845,23 +185845,23 @@ :105C60000000000000000000000000000000000034 :105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 -:105C900000000000000000000100000090900000E3 +:105C90000000000000000000000000000000000004 :105CA00000000000000000000000000000000000F4 :105CB00000000000000000000000000000000000E4 :105CC00000000000000000000000000000000000D4 :105CD00000000000000000000000000000000000C4 :105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D100000000000000000000000080000000080FB +:105D00000000000001000000000000000000000092 +:105D10000000000000000000000000000000000083 :105D20000000000000000000000000000000000073 :105D30000000000000000000000000000000000063 :105D40000000000000000000000000000000000053 :105D50000000000000000000000000000000000043 :105D60000000000000000000000000000000000033 :105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000011800072 +:105D800000000000000010002000000000000000E3 +:105D90000000000000000000000000000000000003 :105DA00000000000000000000000000000000000F3 :105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 @@ -185869,8 +185869,8 @@ :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 :105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000181 -:105E200020000088000000000000000000000000CA +:105E10000000000000000000000000000000000082 +:105E20000000000000000000000000000000000072 :105E30000000000000000000000000000000000062 :105E40000000000000000000000000000000000052 :105E50000000000000000000000000000000000042 @@ -185878,7 +185878,7 @@ :105E70000000000000000000000000000000000022 :105E80000000000000000000000000000000000012 :105E90000000000000000000000000000000000002 -:105EA00000000000070000000000000000000000EB +:105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 :105EC00000000000000000000000000000000000D2 :105ED00000000000000000000000000000000000C2 @@ -185886,7 +185886,7 @@ :105EF00000000000000000000000000000000000A2 :105F00000000000000000000000000000000000091 :105F10000000000000000000000000000000000081 -:105F200000000000FF000000FF0000000000000073 +:105F20000000000000000000000000000000000071 :105F30000000000000000000000000000000000061 :105F40000000000000000000000000000000000051 :105F50000000000000000000000000000000000041 @@ -185894,7 +185894,7 @@ :105F70000000000000000000000000000000000021 :105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 -:105FA000000000000000FF000000FF0000000000F3 +:105FA00000000000000000000000000000000000F1 :105FB00000000000000000000000000000000000E1 :105FC00000000000000000000000000000000000D1 :105FD00000000000000000000000000000000000C1 @@ -185910,7 +185910,7 @@ :106070000000000000000000000000000000000020 :106080000000000000000000000000000000000010 :106090000000000000000000000000000000000000 -:1060A000000000000000000000FF0000FFFF0000F3 +:1060A00000000000000000000000000000000000F0 :1060B00000000000000000000000000000000000E0 :1060C00000000000000000000000000000000000D0 :1060D00000000000000000000000000000000000C0 @@ -185918,7 +185918,7 @@ :1060F00000000000000000000000000000000000A0 :10610000000000000000000000000000000000008F :10611000000000000000000000000000000000007F -:106120000000000000000000000000FF0000000070 +:10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F :10614000000000000000000000000000000000004F :10615000000000000000000000000000000000003F @@ -185926,14 +185926,14 @@ :10617000000000000000000000000000000000001F :10618000000000000000000000000000000000000F :1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000015002A00B0 -:1061B000054000A8000000000000000000000000F2 +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF :1061C00000000000000000000000000000000000CF :1061D00000000000000000000000000000000000BF :1061E00000000000000000000000000000000000AF :1061F000000000000000000000000000000000009F :10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E +:1062100000000000000000610006000D000000000A :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E :10624000000000000000000000000000000000004E @@ -185957,7 +185957,7 @@ :10636000000000000000000000000000000000002D :10637000000000000000000000000000000000001D :10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD +:1063900000000000000000000000000000001010DD :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD @@ -185965,22 +185965,22 @@ :1063E00000000000000000000000000000000000AD :1063F000000000000000000000000000000000009D :10640000000000000000000000000000000000008C -:10641000000000000000000000000000000000007C +:10641000000000000000000000000000000000304C :10642000000000000000000000000000000000006C :10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C :10645000000000000000000000000000000000003C -:10646000000000000000000000000000000200002A -:10647000000000000000000200000000000000001A -:106480000000000400000000000000040000000004 -:1064900000000000000400000000000000000000F8 +:10646000000000000002000000000000000000002A +:10647000000000000000000000000000000000001C +:10648000000000000000000200000000000000000A +:1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC -:1064D000000000000000000000001000100010008C -:1064E000100000000000000000000000000000009C +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC :1064F000000000000000000000000000000000009C -:106500000000000000000000000000040800080077 +:10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B @@ -185990,32 +185990,32 @@ :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB +:1065A00000000000000300000000000000000000E8 :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000800000000A3 +:1065E00000000000000000000000000000000000AB :1065F000000000000000000000000000000000009B -:106600000000000000000000000000000004000086 +:10660000000000000000000000000000000000008A :10661000000000000000000000000000000000007A :10662000000000000000000000000000000000006A :10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A -:10666000000090000000000000000000000000009A -:10667000000000000000000000000000000000001A -:1066800000000000040000000000000004000400FE -:1066900088009000000000000000000000000000E2 +:106650000000000000000000000000000000040036 +:106660000000040000000000880088000000000016 +:106670008400000000000000040000000000020090 +:106680000000000000000000020000000000000008 +:1066900000000000000000000000000000000000FA :1066A00000000000000000000000000000000000EA :1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000408BE +:1066C00000000000000000000000000000000000CA :1066D00000000000000000000000000000000000BA :1066E00000000000000000000000000000000000AA :1066F000000000000000000000000000000000009A -:106700000000000000000000040000000000000085 +:106700000000000000000000000000000000000089 :106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 -:106730000000000000000000000000000000000059 +:106720000000000000000400000000000000000065 +:106730000000000000A000000000000000000000B9 :106740000000000000000000000000000000000049 :106750000000000000000000000000000000000039 :106760000000000000000000000000000000000029 @@ -186033,23 +186033,23 @@ :106820000000000000000000000000000000000068 :106830000000000000000000000000000000000058 :106840000000000000000000000000000000000048 -:106850000000000000000020000000000000000018 +:106850000000000000000000000000000000000038 :106860000000000000000000000000000000000028 :106870000000000000000000000000000000000018 :106880000000000000000000000000000000000008 :1068900000000000000000000000000000000000F8 :1068A00000000000000000000000000000000000E8 :1068B00000000000000000000000000000000000D8 -:1068C0000000000000000000000020840900008497 +:1068C00000000000000000000000000000000000C8 :1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000004A4 -:1068F0000000000000000000000000000400000094 -:106900000000000400000000000000000000000083 -:106910000000002000000000000000200002000035 -:106920000004000000000000000000000000000063 -:106930000000040000000000000010000000000043 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000008800000000000010 +:1069000000000000000000000000009000000000F7 +:10691000000000000400000004000000000000006F +:106920000000000000000000000000000000000067 +:1069300000000402000000882000000000000000A9 :106940000000000000000000000000000000000047 -:106950000000000000030000000200000000000032 +:106950000000000000000000000000000000000037 :106960000000000000000000000000000000000027 :106970000000000000000000000000000000000017 :106980000000000000000000000000000000000007 @@ -186163,54 +186163,54 @@ :107040000000000000000000000000000000000040 :107050000000000000000000000000000000000030 :107060000000000000000000000000000000000020 -:107070000000000000000000000000100000000000 +:107070000000000000000000000000000000000010 :107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 +:1070900000000000000200000000000000000000EE :1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 +:1070B00000000000000000000000000000000200CE :1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E000000000000000000000000000000400009C +:1070D0000000000000000000A000000000002000F0 +:1070E00000000000000000000000000000000000A0 :1070F0000000000000000000000000000000000090 -:10710000000000000004004000000000000000003B -:10711000000000000000000000000000000400C0AB +:10710000000000000000000000000000000000007F +:10711000000000000000000000020000000000026B :10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000400F -:10714000000000020000000000000000000000003D +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F :10717000000000000000000000000000000000000F :1071800000000000000000000000000000000000FF -:1071900000000000000000000000080008000010CF -:1071A00000100000000000000000000000000000CF -:1071B00000000000000000000000000002000200CB -:1071C000004000400000000000000000000000003F +:1071900000000000000000000000020002000200E9 +:1071A000004000000000000000000000000000009F +:1071B00000000000020000000000000000000000CD +:1071C00000000000000000000000000000000000BF :1071D00000000000000000000000000000000000AF -:1071E000000000400000000000000000000000005F +:1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F :10720000000000000000000000000000000000007E :10721000000000000000000000000000000000006E :10722000000000000000000000000000000000005E :10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E +:10724000000200000000000000000000000000003C :10725000000000000000000000000000000000002E -:10726000000000000000000000000400000000001A -:1072700004000400080000000000000000000000FE -:1072800000000400000000000000000000000000FA -:1072900004000000000000000000040000000400E2 -:1072A00000000000000000000000040000000000DA -:1072B00000000400040000000400040004000000BA -:1072C00000000000000000000000000000000000BE +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000400040000000000040000000000E2 +:1072A00000000400000000000000000000000000DA +:1072B00000000000000000000000040000000400C6 +:1072C00004000000000000000000000000000000BA :1072D00000000000000000000000000000000000AE :1072E000000000000000000000000000000000009E -:1072F000000000000000000000040000000000008A +:1072F000000000000000000000000000000000008E :10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D +:107310000000000000000000000004000000000069 :10732000000000000000000000000000000000005D :10733000000000000000000000000000000000004D -:10734000000000000000000000000000002000001D +:10734000000000000000000000000000000000003D :10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D +:10736000000000080000000800000000000000000D :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED @@ -186218,7 +186218,7 @@ :1073B00000000000000000000000000000000000CD :1073C00000000000000000000000000000000000BD :1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D +:1073E0000000000000000000000004000000000099 :1073F000000000000000000000000000000000008D :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C @@ -186235,14 +186235,14 @@ :1074C00000000000000000000000000000000000BC :1074D00000000000000000000000000000000000AC :1074E000000000000000000000000000000000009C -:1074F0000000000000000000000009000000000083 +:1074F000000000000000000000000000000000008C :10750000000000000000000000000000000000007B -:107510000000000000000000000000000004000067 -:10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000002000001B -:107550000900000000000000000000000000000022 -:10756000000000000000000000000000000000001B +:10751000000000000000000000000000000000006B +:10752000040040000000000000000008000000000F +:107530000000000000000000000004000000000047 +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:107560000000000000000000000400000000000017 :10757000000000000000000000000000000000000B :1075800000000000000000000000000000000000FB :1075900000000000000000000000000000000000EB @@ -186405,66 +186405,66 @@ :107F60000000000000000000000000000000000011 :107F70000000000000000000000000000000000001 :107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 +:107F900000000000000000000000000000000004DD :107FA00000000000000000000000000000000000D1 :107FB00000000000000000000000000000000000C1 :107FC00000000000000000000000000000000000B1 :107FD00000000000000000000000000000000000A1 :107FE0000000000000000000000000000000000091 -:107FF000000000000000000000000000000000027F -:108000000000000400020002000000000000000068 -:10801000000400000000000000000000000000005C -:10802000000000000002000200000000000000004C +:107FF000000200000000000000000002000000007D +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 :108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:10805000000000040000000000000000000000001C -:10806000000000000000000200000002000000020A -:1080700000000002000000000000000000000000FE -:1080800000000000000040000000000000000000B0 +:10804000000000000002000000000002000000002C +:10805000000000020000000000000002000000001C +:10806000000000000000000200000000000200000C +:1080700000020000000000020000000000000002FA +:1080800000000000000000000000000000000000F0 :1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000000000C0 +:1080A00000000000000000000000000000001000C0 +:1080B0001000202020000020000000000000000030 :1080C00000000000000000000000000000000000B0 :1080D00000000000000000000000000000000000A0 :1080E0000000000000000000000000000000000090 -:1080F0000000000000400000000000000000000040 +:1080F000000002000000000000000000000000007E :10810000000000000000000000000000000000006F :10811000000000000000000000000000000000005F -:10812000000000000000000002000000000000004D -:10813000000000000000000000000000000000003F +:10812000000000000000000000000000000000004F +:10813000800080008001800000010000000000003D :10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000000000000EF +:108150000000000000000000000000080000000017 +:108160000000000800000000000000000000000007 +:1081700000000000000000000000000000040000FB +:1081800000000010000000000000000000000000DF :1081900000000000000000000000000000000000DF :1081A00000000000000000000000000000000000CF :1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000004000000000000000000000000009B -:1081E000000000000000040000000000000000008B +:1081C00000000008000000000000000000000000A7 +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F :1081F000000000000000000000000000000000007F -:1082000000000000C00000000000000000000000AE +:10820000000000000000000000000000000000006E :10821000000000000000000000000000000000005E :10822000000000000000000000000000000000004E :10823000000000000000000000000000000000003E :10824000000000000000000000000000000000002E -:1082500000000000000000000000000040000000DE +:10825000000000000000000000000000000000001E :10826000000000000000000000000000000000000E :1082700000000000000000000000000000000000FE :1082800000000000000000000000000000000000EE :1082900000000000000000000000000000000000DE :1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE +:1082B000000000000020008000A0008000800080FE +:1082C000018000000120000000000000000000000C :1082D000000000000000000000000000000000009E :1082E000000000000000000000000000000000008E :1082F000000000000000000000000000000000007E :10830000000000000000000000000000000000006D :10831000000000000000000000000000000000005D :10832000000000000000000000000000000000004D -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D +:1083300000000000000000010020002100200020BB +:1083400000200420000004010000000000000000E4 :10835000000000000000000000000000000000001D :10836000000000000000000000000000000000000D :1083700000000000000000000000000000000000FD @@ -186472,31 +186472,31 @@ :1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD :1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD +:1083C000000000200000000000000000000000008D :1083D000000000000000000000000000000000009D :1083E000000000000000000000000000000000008D :1083F000000000000000000000000000000000007D -:108400000000000000000400000000000000000068 +:10840000000000000000000000000000000000006C :10841000000000000000000000000000000000005C :10842000000000000000000000000000000000004C -:10843000000000000200000000000000000000003A +:10843000000000000000000000000000000000003C :10844000000000000000000000000000000000002C :10845000000000000000000000000000000000001C :10846000000000000000000000000000000000000C :1084700000000000000000000000000000000000FC -:1084800000000000000000000000040000000000E8 +:1084800000000000000000000000000000000000EC :1084900000000000000000000000000000000000DC :1084A00000000000000000000000000000000000CC -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000000AC +:1084B000000000000000000001000000000001209A +:1084C00084200020010001800108018000000000DC :1084D000000000000000000000000000000000009C :1084E000000000000000000000000000000000008C :1084F000000000000000000000000000000000007C :10850000000000000000000000000000000000006B :10851000000000000000000000000000000000005B :10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B +:1085300000000000000000000000400000000000FB +:1085400004010001000104000420040004200000D4 :10855000000000000000000000000000000000001B :10856000000000000000000000000000000000000B :1085700000000000000000000000000000000000FB @@ -186504,89 +186504,89 @@ :1085900000000000000000000000000000000000DB :1085A00000000000000000000000000000000000CB :1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB +:1085C000000040C090900082000000C000900000B9 :1085D000000000000000000000000000000000009B :1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B +:1085F000000000010000000000000000000000007A :10860000000000000000000000000000000000006A :10861000000000000000000000000000000000005A :10862000000000000000000000000000000000004A :10863000000000000000000000000000000000003A -:10864000000000000000000000000000000000002A +:108640000000000080808900008000002080008001 :10865000000000000000000000000000000000001A :10866000000000000000000000000000000000000A :1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA :1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000000000000000000000000000009A +:1086B000000000000000000000000000000000803A +:1086C0000000000080410000081091C1C18000003E +:1086D00000210000800000000000000000000000F9 :1086E000000000000000000000000000000000008A :1086F000000000000000000000000000000000007A :108700000000000000000000000000000000000069 :108710000000000000000000000000000000000059 :108720000000000000000000000000000000000049 :108730000000000000000000000000000000000039 -:108740000000000000000000000000000000000029 -:108750000000000000000000000000000000000019 +:1087400000080000000090010000910184C1C19068 +:10875000200000000000C020000000000000000019 :108760000000000000000000000000000000000009 :1087700000000000000000000000000000000000F9 :1087800000000000000000000000000000000000E9 :1087900000000000000000000000000000000000D9 :1087A00000000000000000000000000000000000C9 :1087B00000000000000000000000000000000000B9 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 +:1087C0000000000000000000000000000090109079 +:1087D000C0C120200040C090C0C0000000000000C8 :1087E0000000000000000000000000000000000089 :1087F0000000000000000000000000000000000079 :108800000000000000000000000000000000000068 :108810000000000000000000000000000000000058 :108820000000000000000000000000000000000048 :108830000000000000000000000000000000000038 -:108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 +:108840000000000000000000000000000002001115 +:10885000008080C1000000808080808000000000D7 :108860000000000000000000000000000000000008 :1088700000000000000000000000000000000000F8 :1088800000000000000000000000000000000000E8 :1088900000000000000000000000000000000000D8 :1088A00000000000000000000000000000000000C8 :1088B00000000000000000000000000000000000B8 -:1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000000000000000000098 +:1088C00000000000000008000910080008008020D7 +:1088D00000210080000080118085800000000000E1 :1088E0000000000000000000000000000000000088 :1088F0000000000000000000000000000000000078 :108900000000000000000000000000000000000067 :108910000000000000000000000000000000000057 :108920000000000000000000000000000000000047 :108930000000000000000000000000000000000037 -:108940000000000000000000000000000000000027 -:108950000000000000000000000000000000000017 +:10894000000000000000000001000001008801009C +:10895000C008000000C09000C001404040880000F6 :108960000000000000000000000000000000000007 :1089700000000000000000000000000000000000F7 :1089800000000000000000000000000000000000E7 :1089900000000000000000000000000000000000D7 :1089A00000000000000000000000000000000000C7 :1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000000097 -:1089E0000000000000000000000000000000000087 +:1089C000000000000000000000000082000006001F +:1089D0000012002100600600004200820000060034 +:1089E0000042000000000000000000000000000045 :1089F0000000000000000000000000000000000077 :108A00000000000000000000000000000000000066 :108A10000000000000000000000000000000000056 :108A20000000000000000000000000000000000046 :108A30000000000000000000000000000000000036 :108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 +:108A500000000000666600006F600000FF0000007C +:108A6000F3300000000000000000000000000000E3 :108A700000000000000000000000000000000000F6 :108A800000000000000000000000000000000000E6 :108A900000000000000000000000000000000000D6 :108AA00000000000000000000000000000000000C6 :108AB00000000000000000000000000000000000B6 :108AC00000000000000000000000000000000000A6 -:108AD0000000000000000000000000000000000096 -:108AE0000000000000000000000000000000000086 +:108AD0000000000000003C3C00006F600000F0F06F +:108AE0000000F33000000000000000000000000063 :108AF0000000000000000000000000000000000076 :108B00000000000000000000000000000000000065 :108B10000000000000000000000000000000000055 @@ -186601,40 +186601,40 @@ :108BA00000000000000000000000000000000000C5 :108BB00000000000000000000000000000000000B5 :108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 +:108BD0000000000000000000000000000F66000020 +:108BE0000FFF000066660000E7E7000000000000DD :108BF0000000000000000000000000000000000075 :108C00000000000000000000000000000000000064 :108C10000000000000000000000000000000000054 :108C20000000000000000000000000000000000044 :108C30000000000000000000000000000000000034 :108C40000000000000000000000000000000000024 -:108C50000000000000000000000000000000000014 -:108C60000000000000000000000000000000000004 +:108C500000000000000000000000FFFF00000F66A1 +:108C6000000000F0000000FF0000242400000000CD :108C700000000000000000000000000000000000F4 :108C800000000000000000000000000000000000E4 :108C900000000000000000000000000000000000D4 :108CA00000000000000000000000000000000000C4 :108CB00000000000000000000000000000000000B4 :108CC00000000000000000000000000000000000A4 -:108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 +:108CD0000000000000000061003E000D10C003E233 +:108CE000033E0C0092C0038203380C00C2C0000097 :108CF0000000000000000000000000000000000074 :108D00000000000000000000000000000000000063 :108D10000000000000000000000000000000000053 :108D20000000000000000000000000000000000043 :108D30000000000000000000000000000000000033 :108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 +:108D50000000000000000000FF6F9FFF0000000007 +:108D600000000000F0F030300000000000000000C3 :108D700000000000000000000000000000000000F3 :108D800000000000000000000000000000000000E3 :108D900000000000000000000000000000000000D3 :108DA00000000000000000000000000000000000C3 :108DB00000000000000000000000000000000000B3 :108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE0000000000000000000000000000000000083 +:108DD00000000000000000000000F9FFFFF90000A3 +:108DE0000000000000000000303000000000000023 :108DF0000000000000000000000000000000000073 :108E00000000000000000000000000000000000062 :108E10000000000000000000000000000000000052 @@ -186642,7 +186642,7 @@ :108E30000000000000000000000000000000000032 :108E40000000000000000000000000000000000022 :108E50000000000000000000000000000000000012 -:108E60000000000000000000000000000000000002 +:108E60000000000000000000FFF0FFFF0000000015 :108E700000000000000000000000000000000000F2 :108E800000000000000000000000000000000000E2 :108E900000000000000000000000000000000000D2 @@ -186650,7 +186650,7 @@ :108EB00000000000000000000000000000000000B2 :108EC00000000000000000000000000000000000A2 :108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 +:108EE00000000000000000000000FFF0FF00000094 :108EF0000000000000000000000000000000000072 :108F00000000000000000000000000000000000061 :108F10000000000000000000000000000000000051 @@ -186659,63 +186659,63 @@ :108F40000000000000000000000000000000000021 :108F50000000000000000000000000000000000011 :108F60000000000000000000000000000000000001 -:108F700001000080004000800000000000000000B0 -:108F800000000000000000000000000000020000DF -:108F900000000000000000000001000000000000D0 -:108FA00000000000000000040000000000000000BD +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 :108FB00000000000000000000000000000000000B1 :108FC00000000000000000000000000000000000A1 -:108FD000000000000000000000000002000200008D +:108FD000000000000000000000000000000200008F :108FE0000000000000000000000000000000000081 -:108FF00000000200004000010040000000000000EE -:109000000000000000000004000400040000000450 -:10901000000000000000000000040000000000004C -:10902000000200000002000000901002009000000A -:109030000000000000000002000200000002000228 -:10904000000000000000000200000000000000021C +:108FF0000002000000000002000000000002000269 +:10900000000000000002000200020000000000005A +:10901000000200000000000000020000000000024A +:109020000000000200000000000200000002000238 +:109030000000000200000002000000020000000228 +:10904000000000000000000000000000000000021E :10905000000000000000000200000000000000000E -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000010001000000000C0 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000001000100000A0 +:1090600000000000000002000000000000000000FE +:1090700000000000000001000000000000000100EE +:1090800000000000000000000200021000000000CC +:1090900000000000020002000000000000000000CC +:1090A00000000000000000000000000000000000C0 :1090B00000000000000000000000000000000000B0 -:1090C000000000000000000000000000020000009E +:1090C000000000000000000000000000000002009E :1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F +:1090E0000000000000000000800000000000000000 +:1090F000000000000000000002000000000000006E +:10910000020000000000000000000000000000005D :10911000000000000000000000000000000000004F :10912000000000000000000000000000000000003F :10913000000000000000000000000000000000002F :10914000000000000000000000000000000000001F :10915000000000000000000000000000000000000F :1091600000000000000000000000000000000000FF -:1091700000000400000000000000000000000000EB -:1091800000000000000000000000000000000400DB -:1091900000000000000000000000000000000000CF +:1091700000000000000000000000000000040002E9 +:1091800000000000000000000000000000000000DF +:10919000000040000000000000000000000000008F :1091A00000000000000000000000000000000000BF :1091B00000000000000000000000000000000000AF :1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000000000008F -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E +:1091D000000000000000000000000400000000008B +:1091E0000000000000000000000000000900000076 +:1091F000000040000000000011000000000000041A +:10920000000100000000000000000000000000005D :10921000000000000000000000000000000000004E :10922000000000000000000000000000000000003E :10923000000000000000000000000000000000002E :10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE +:1092600000000000000000000000000000410000BD +:10927000004000400000000000000000000000006E :1092800000000000000000000000000000000000DE :1092900000000000000000000000000000000000CE :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE :1092C000000000000000000000000000000000009E -:1092D000000000000010000000000000000000007E +:1092D000000000000000000000000000000000008E :1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E +:1092F00000000001000100C00000000000000000AC :10930000000000000000000000000000000000005D :10931000000000000000000000000000000000004D :10932000000000000000000000000000000000003D @@ -186723,7 +186723,7 @@ :10934000000000000000000000000000000000001D :10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED +:1093700000000000000000000000004100000000AC :1093800000000000000000000000000000000000DD :1093900000000000000000000000000000000000CD :1093A00000000000000000000000000000000000BD @@ -186731,65 +186731,65 @@ :1093C000000000000000000000000000000000009D :1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C +:1093F00000000004090400A0000440000020000058 +:1094000000000000000000042184000000000000B3 :10941000000000000000000000000000000000004C :10942000000000000000000000000000000000003C :10943000000000000000000000000000000000002C :10944000000000000000000000000000000000001C :10945000000000000000000000000000000000000C :1094600000000000000000000000000000000000FC -:1094700000000000000000000000000000000000EC -:10948000000000000000000000000080000000005C -:1094900000000000000000000000000000000000CC +:10947000000000000080000001000000000000006B +:109480000009900000000000000000000000000043 +:1094900000000002000000000000000000000000CA :1094A00000000000000000000000000000000000BC :1094B00000000000000000000000000000000000AC :1094C000000000000000000000000000000000009C :1094D000000000000000000000000000000000008C :1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000002000003B -:109510000000000000000000000000000000050046 -:109520000000000005000000000000000000000036 +:1094F00000000000000000400000400000C000002C +:1095000000C0000000000000000000000900000092 +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B :10954000000000000000000000000000000000001B :10955000000000000000000000000000000000000B :1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:10958000000000000000000000000090000000004B +:10957000000000000000000001900004000008004E +:1095800000000000000000000000010000000000DA :1095900000000000000000000000000000000000CB :1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B :1095D000000000000000000000000000000000008B :1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B -:1096000000000000000000000000000000800000DA +:1095F000000000000000000000001004000800004F +:10960000000000000000000000000000200000003A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A :10963000000000000000000000000000000000002A :10964000000000000000000000000000000000001A :10965000000000000000000000000000000000000A :1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA +:109670000000000000000000000000000000218049 +:1096800008000811000000000000000000000000B9 :1096900000000000000000000000000000000000CA :1096A00000000000000000000000000000000000BA :1096B00000000000000000000000000000000000AA :1096C000000000000000000000000000000000009A :1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:1097000000000000000000000000000000008800D1 -:1097100000100000008800000000000000000000B1 +:1096F000000000000000000000000000000000A0CA +:109700000120010091900000000000000000000016 +:109710000000000000000000000000000000000049 :109720000000000000000000000000000000000039 :109730000000000000000000000000000000000029 :109740000000000000000000000000000000000019 :109750000000000000000000000000000000000009 :1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000909000000000000000000000A9 +:1097800000000000080400000000000000000000CD +:1097900000010001000000000000000000000000C7 :1097A00000000000000000000000000000000000B9 :1097B00000000000000000000000000000000000A9 :1097C0000000000000000000000000000000000099 @@ -186797,87 +186797,87 @@ :1097E0000000000000000000000000000000000079 :1097F0000000000000000000000000000000000069 :109800000000000000000000000000000000000058 -:1098100000000800000000800000000000000000C0 +:1098100000000020004000000009000000000000DF :109820000000000000000000000000000000000038 :109830000000000000000000000000000000000028 :109840000000000000000000000000000000000018 :109850000000000000000000000000000000000008 :1098600000000000000000000000000000000000F8 :1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 -:109890000000000000118000000000000000000037 +:109880000000000021801000098008020000000094 +:1098900000000000000000000000000000000000C8 :1098A00000000000000000000000000000000000B8 :1098B00000000000000000000000000000000000A8 :1098C0000000000000000000000000000000000098 :1098D0000000000000000000000000000000000088 :1098E0000000000000000000000000000000000078 :1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 -:109910000000000000000001200000000000000026 -:109920000000000000000000000000000000000037 +:1099000000000000000001C09000000801000000FD +:109910000000000000000000000000A000000000A7 +:1099200000820000000000000000000000000000B5 :109930000000000000000000000000000000000027 :109940000000000000000000000000000000000017 :109950000000000000000000000000000000000007 :1099600000000000000000000000000000000000F7 :1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000007000000C0 +:109980000000000000000000000000000000420095 +:1099900000000000000000000000000000000000C7 :1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 :1099F0000000000000000000000000000000000067 -:109A00000000000000000000000000000000000056 -:109A10000000000000000000000000FF000000FF48 +:109A00000000000000000000000000FF00FFFF0059 +:109A1000FF00000000000000000000000000000047 :109A20000000000000000000000000000000000036 :109A30000000000000000000000000000000000026 :109A40000000000000000000000000000000000016 :109A50000000000000000000000000000000000006 :109A600000000000000000000000000000000000F6 :109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000FF0000C7 -:109AA00000FF0000000000000000000000000000B7 +:109A800000000000000000000000000000FF00FFD8 +:109A900000FF00FF000000000000000000000000C8 +:109AA00000000000000000000000000000000000B6 :109AB00000000000000000000000000000000000A6 :109AC0000000000000000000000000000000000096 :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B2000FF0000003C3C00000000000000000000BE +:109B0000000000000000000000000000000000FF56 +:109B1000FF000000FFFF0000000000000000000048 +:109B20000000FFFFFFFF00000000555555550000E5 :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 -:109BA0000000FF0000003C3C00000000000000003E +:109B900000FFFF00FFFF00000000000000000000C9 +:109BA0000000000000000000000000005555555561 :109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 :109BF0000000000000000000000000000000000065 :109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 -:109C2000000015002A00054000A800000000000008 -:109C30000000000000000000000000000000000024 +:109C1000000040618006002D0002000000000000EE +:109C2000000000610006000D0002000000000000BE +:109C30000002000000000000000000000000000022 :109C40000000000000000000000000000000000014 :109C50000000000000000000000000000000000004 :109C600000000000000000000000000000000000F4 :109C700000000000000000000000000000000000E4 :109C800000000000000000000000000000000000D4 -:109C900000000000000000000000000000000000C4 -:109CA00000000000000000000000000000000000B4 +:109C90000000000000000A0A0000000000000000B0 +:109CA0000000000000000000000030300000000054 :109CB00000000000000000000000000000000000A4 :109CC0000000000000000000000000000000000094 :109CD0000000000000000000000000000000000084 :109CE0000000000000000000000000000000000074 :109CF0000000000000000000000000000000000064 :109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 +:109D100000000000000080008A0A0000000000002F :109D20000000000000000000000000000000000033 :109D30000000000000000000000000000000000023 :109D40000000000000000000000000000000000013 @@ -186885,7 +186885,7 @@ :109D600000000000000000000000000000000000F3 :109D700000000000000000000000000000000000E3 :109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 +:109D9000000000000000000000FF00000000A00024 :109DA00000000000000000000000000000000000B3 :109DB00000000000000000000000000000000000A3 :109DC0000000000000000000000000000000000093 @@ -186893,8 +186893,8 @@ :109DE0000000000000000000000000000000000073 :109DF0000000000000000000000000000000000063 :109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 +:109E10000000000000000000000000FF0000000043 +:109E2000F0AA000000000000000000000000000098 :109E30000000000000000000000000000000000022 :109E40000000000000000000000000000000000012 :109E50000000000000000000000000000000000002 @@ -186902,49 +186902,49 @@ :109E700000000000000000000000000000000000E2 :109E800000000000000000000000000000000000D2 :109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000001100000000A1 -:109EB00000000000000000000000000000800080A2 -:109EC0000080008000000000000000000000000092 -:109ED000000000000001000000000000000400007D +:109EA00000000000000000000004000000000000AE +:109EB0000000000000000000000010000000000092 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000000000000000000082 :109EE0000000000000000000000000000000000072 :109EF0000000000000000000000000000000000062 -:109F0000000000000000000000000000000400004D +:109F0000000200000000000040000000000000000F :109F10000000000000000000000000000000000041 -:109F2000000000000000000000000002000000022D -:109F30000000000000000000000000000000000819 -:109F400000080008000800000000000000000000F9 -:109F500000020000000200000000000000000002FB -:109F600000000002000200000002000200020000E7 -:109F70004090000000000000000000000000000011 -:109F80000000000000000040000000000000000091 +:109F20000000000000000000000000000000000031 +:109F3000000000000000000000000000000200001F +:109F4000000200000000000000000000000200000D +:109F500000000000000200000000000000000000FF +:109F600000000000000000000002000000020002EB +:109F700000000000000000000000000000000000E1 +:109F800000000002000000020000000000000000CD :109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 +:109FA000000000000100400000000100000000006F +:109FB00000000100000000000000000000000000A0 :109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000001071 +:109FD0000000000000000000000000000000000081 :109FE0000000000000000000000000000000000071 -:109FF0000000000000000000000000000000000061 +:109FF0000000002000200000000000000000000021 :10A000000000000000000000000000000000000050 :10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 -:10A03000000004000000000000000000000000001C +:10A02000000000000000400080000000020000006E +:10A03000000000000200000000000000000000001E :10A040000000000000000000000000000000000010 :10A050000000000000000000000000000000000000 :10A0600000000000000000000000000000000000F0 -:10A0700000000000000000000000000000000000E0 -:10A0800000000000000000000000000000020000CE +:10A0700000000000000100010000000000000000DE +:10A0800000000000000000000000000000000000D0 :10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 -:10A0C000000000000100000000000100000000008E -:10A0D000000000000400000000000000000000215B -:10A0E0000000000000000000000000000000000868 -:10A0F0000000000000000000000000000000000060 +:10A0A000000000000000000000000400000090809C +:10A0B0000000000000000000002000000000000080 +:10A0C0000000000000000000000000000000000090 +:10A0D0000000000000000000000000000000000080 +:10A0E0000000000000000000000000000000000070 +:10A0F000000000000000000000040000000000005C :10A10000000000000000000000000000000000004F :10A11000000000000000000000000000000000003F :10A12000000000000000000000000000000000002F -:10A1300000000000000000000000000000000020FF -:10A1400000000000000020000000000020000000CF +:10A130000008000000000000000000000000000017 +:10A14000000000000000000000000000000000000F :10A1500000000000000000000000000000000000FF :10A1600000000000000000000000000000000000EF :10A1700000000000000000000000000000000000DF @@ -186952,142 +186952,142 @@ :10A1900000000000000000000000000000000000BF :10A1A00000000000000000000000000000000000AF :10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000100008001808D -:10A1D000000000000000010000000000000000007E -:10A1E000000000000000000000000000000000006F -:10A1F000000000000000000000000000000000005F -:10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E +:10A1C000000000000000000000000000000000008F +:10A1D000000000000000000000000000000000007F +:10A1E0000000000000000000000000000020C0206F +:10A1F000002000200020C02000200000000082205D +:10A20000002000200020822000200020002082204A +:10A2100000200000002082200020002000200020DC +:10A22000002000000000000000000000000000000E :10A23000000000000000000000000000000000001E -:10A2400000000000000000000000000004000020EA -:10A2500002200000000000000400000000000000D8 -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000000009E -:10A2C00000000000200020009000000000000000BE -:10A2D000000000000040000000200000000000001E -:10A2E000000000000000000000000000000000006E -:10A2F000000000000000000000000000000000005E -:10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D -:10A330000000000000000084000000000000000099 -:10A340000500000000040000000000000000000004 -:10A3500000000000000000010000000100000000FB +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000001ED +:10A2700000010001000100010001000100000000D8 +:10A2800000010001000100010001000100010001C6 +:10A2900000010001000000010001000100010001B7 +:10A2A00000010001000000000000000001000000AB +:10A2B00000040080002000090000000000000000F1 +:10A2C000000000000000000000000000000000008E +:10A2D000000000000000000000000000000000007E +:10A2E0000000000000000000000000000800000066 +:10A2F00000000200A00000000000000000000000BC +:10A30000000040000000000000000000000000000D +:10A3100000009000000000000000000000000000AD +:10A32000000090000000000000000000000040104D +:10A330004000200405100000000000000020000084 +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD :10A3600000000000000000000000000000000000ED :10A3700000000000000000000000000000000000DD :10A3800000000000000000000000000000000000CD :10A3900000000000000000000000000000000000BD :10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000001100000000000000000000000000007C -:10A3D000000000000000000000000000000900096B +:10A3B0000000000000000000000000080011000282 +:10A3C0000000000000090004000000000000000080 +:10A3D000000000000000000000000000000000007D :10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D +:10A3F0000800010000000000000000000000000054 :10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A440000500000000000000000000000000000007 +:10A41000000000000000000000000100000000003B +:10A42000000000000000000000000000000000101C +:10A4300000000000090000000000000020010000F2 +:10A44000000100000000000000000000000000000B :10A4500000000000000000000000000000000000FC :10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000000DC +:10A4700000000000040000000000000000000000D8 :10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC +:10A4900000000000000000000000000004000000B8 :10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D0000000000001002000000000880000900043 -:10A4E000000000000000000000000000000000006C -:10A4F000000000000000000000000000000000005C -:10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000000000001B -:10A54000000000000000000000000000000000000B -:10A550000000000000000900800000000009110058 -:10A56000800000000000000000000000000000006B -:10A5700000000000000000000000000000000000DB -:10A5800000000000000000000000000000000000CB -:10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB -:10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B -:10A5D00000000000000000000003008011080000DF -:10A5E000000000800000008000000000000000006B -:10A5F000000000000000000000000000000000005B -:10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000020101F6 -:10A66000008800000020000000C000000000000082 -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A -:10A6D0000000000000000000000000000100C08831 -:10A6E0000200010003000088880001000000000053 +:10A4B00000000000000501099009080900000100E2 +:10A4C0000800000000000000000000000000000084 +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000000000000000000200006A +:10A4F00000000000000000C000900000000000C04C +:10A5000000900000000000C000900000000000C0AB +:10A5100000900000000000C000900000000000C09B +:10A5200000900000000000C000900000000000004B +:10A53000000000000000001008A100880088000052 +:10A540000300800000000000000000000000000088 +:10A5500000000000000000000000000000000000FB +:10A5600000000000000000000000000000000000EB +:10A5700000000000000000000080008000000000DB +:10A5800000800080000000000080008000000000CB +:10A5900000800080000000000080008000000000BB +:10A5A00000800080000000000080008000000000AB +:10A5B0000000000000000000110020100580900045 +:10A5C000000000000000808000000000000000008B +:10A5D000000000000000000000000000000000007B +:10A5E000000000000000000000000000000000006B +:10A5F00000000000000000000000000080000002D9 +:10A600008080000080000000808000008000000842 +:10A61000808000008000000080800000800000003A +:10A62000808000008000000080800000800000002A +:10A63000808000000000000000008800112001A0C0 +:10A640001184000000000000080800000000000065 +:10A6500000000000000000000000000000000000FA +:10A6600000000000000000000000000000000000EA +:10A670000000000000000000000000000000820058 +:10A680000000C090000082000000C0900000820026 +:10A690000000C090000082000000C0900000820016 +:10A6A0000000C090000082000000C0900000820006 +:10A6B0000000C09000000000000000001004002016 +:10A6C0000211001000000001000100010000000064 +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A :10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000800F1 -:10A760008080800903004100008000000900000093 +:10A700000000009000C000000000009000C00000A9 +:10A710000000009000C000000000009000C0000099 +:10A720000000009000C000000000009000C0000089 +:10A730000000009000C00000000000000000004188 +:10A74000119102A11008000000080008004100005B +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 :10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 +:10A7800000000000008000800000000000800080C9 +:10A7900000000000008000800000000000800080B9 +:10A7A00000000000008000800000000000800080A9 +:10A7B0000000000000800080000000000000000099 +:10A7C00000109000A1808809000000000000000037 :10A7D0000000000000000000000000000000000079 -:10A7E0000011111100800000001100000080000025 +:10A7E0000000000000000000000000000000000069 :10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A860000000000101000040000000010000004065 +:10A8000000008000000300000000801180030000B1 +:10A810000000801180400000000080118040000096 +:10A820000000801180400000000080118040000086 +:10A8300000008011804000000000000000000000C7 +:10A84000000004C0090009840801000000000000A5 +:10A850000000000000A00000000000000000000058 +:10A8600000000000000000000000000000000000E8 :10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 +:10A88000000000009000000000000000C001200057 +:10A8900000000000C001200000000000C0012000F6 +:10A8A00000000000C001200000000000C0012000E6 +:10A8B00000000000C00120000000000000000000B7 :10A8C0000000000000000000000000000000000088 :10A8D0000000000000000000000000000000000078 -:10A8E00000000000000000E00700820000000000FF -:10A8F00007008221000000000000000000000000AE -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A90000000000000000001100000600000000062A +:10A910000000060000000011000006000000000614 +:10A920000000060000000082000006000000000693 +:10A930000000060000000082000006000000000089 +:10A9400000000000000006003630333333330000CF :10A9500000000000000000000000000000000000F7 -:10A96000000000000000000000000000F0F0000007 -:10A9700000000000F0F000000000000000000000F7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000000000000D7 +:10A980000000000000000000FFFF0000FF000000CA +:10A99000FF000000FF000000FF000000FF000000BB +:10A9A000FF000000FF000000FF000000FF000000AB +:10A9B000FF000000FF000000FF000000FF0000009B +:10A9C00000000000000000000600060033333330B2 :10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000F0F087 -:10A9F000000000000000F0F0000000000000000077 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA000000000000000000000000FFFF0000FF0049 +:10AA10000000FF000000FF000000FF000000FF003A +:10AA20000000FF000000FF000000FF000000FF002A +:10AA30000000FF000000FF000000FF000000FF001A :10AA40000000000000000000000000000000000006 :10AA500000000000000000000000000000000000F6 :10AA600000000000000000000000000000000000E6 @@ -187096,121 +187096,121 @@ :10AA900000000000000000000000000000000000B6 :10AAA00000000000000000000000000000000000A6 :10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000003C3C0000EE -:10AAF000FFFF0000FFFF0000FFFF0000000000005C +:10AAC0000000000000000000000000000000303F17 +:10AAD00000000000000000000000FFFF0000000078 +:10AAE00066666666000000000000000000000000CE +:10AAF0000000000000000000000000000000000056 :10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000003C3C6D +:10AB100000FF00000F0F000000FF00000F0F0000FB +:10AB200000FF00000F0F000000FF00000F0F0000EB +:10AB300000FF00000F0F000000FF00000F0F0000DB +:10AB400000FF00000F0F0000000000000000303F79 +:10AB50000000C0C00000000000000000FFFF000077 +:10AB6000000066666666000000000000000000004D :10AB700000000000000000000000000000000000D5 :10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF00005002A06054C00A805002A00054000A80B +:10AB9000000000FF00000F0F000000FF00000F0F7B +:10ABA000000000FF00000F0F000000FF00000F0F6B +:10ABB000000000FF00000F0F000000FF00000F0F5B +:10ABC000000000FF00000F0F000000000000000068 +:10ABD00000613006000D000000610006000D00025B +:10ABE0000000000000000002000000000000000063 +:10ABF0000000000000000000000000000000000055 :10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC30000000000000000000000000000000000014 -:10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000FF0000FF0000000000000000D6 +:10AC10000000030203380C0092C0038203380C00CA +:10AC200092C0038203380C0092C0038203380C00E8 +:10AC300092C0038203380C0092C0038203380C00D8 +:10AC400092C0038203380C0092C000000000000094 +:10AC5000000000C000C0363734340000000050004F +:10AC60000A000000000000000000000000000000DA +:10AC700000000000000000000000000000000000D4 :10AC800000000000000000000000000000000000C4 :10AC900000000000000000000000000000000000B4 :10ACA00000000000000000000000000000000000A4 :10ACB0000000000000000000000000000000000094 :10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF000000000000000FF0000FF00000000000056 +:10ACD0000000000000C000C0F6F7F4F4000000001F +:10ACE00000A50000000000000000000000000000BF +:10ACF0000000000000000000000000000000000054 :10AD00000000000000000000000000000000000043 :10AD10000000000000000000000000000000000033 :10AD20000000000000000000000000000000000023 :10AD30000000000000000000000000000000000013 :10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 +:10AD500000000000000000000404C000F800000033 :10AD600000000000000000000000000000000000E3 -:10AD700000000000000000003C3C00FF000000005C +:10AD700000000000000000000000000000000000D3 :10AD800000000000000000000000000000000000C3 :10AD900000000000000000000000000000000000B3 :10ADA00000000000000000000000000000000000A3 :10ADB0000000000000000000000000000000000093 :10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 +:10ADD000000000000000000020000000C000F200A1 :10ADE0000000000000000000000000000000000063 -:10ADF000000000000000000000003C3C00FF0000DC +:10ADF0000000000000000000000000000000000053 :10AE00000000000000000000000000000000000042 :10AE10000000000000000000000000000000000032 :10AE20000000000000000000000000000000000022 :10AE30000000000000000000000000000000000012 :10AE40000000000000000000000000000000000002 -:10AE50000000000000000000000000800000000072 +:10AE500000000000000000000000000000000000F2 :10AE600000000000000000000000000000000000E2 :10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000004BE -:10AE900000040001000400000004000000000000A5 -:10AEA000000000040000000000000000000000009E -:10AEB000000400000000000000000000000000008E +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 :10AEC0000000000000000000000000000000000082 -:10AED00000000000000000400000000000080040EA -:10AEE0000000000000000000000000000000004022 -:10AEF0000000000000000000000000000040000012 -:10AF000000000000000000040000004000000000FD -:10AF1000000000000000000200000000000000022D -:10AF20000002000000020002000200000000000019 -:10AF3000000200000000000200020000000000000B +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000250 +:10AF000000020002009000020000000200020002A5 +:10AF1000000000020000000000000000000400002B +:10AF2000000000000000000200000002000200001B +:10AF3000000200000000000000000000000000000F :10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000800080000000000000000000000C1 -:10AF800000000000000000000000000000000200BF -:10AF9000020000100010000000000000000000008F -:10AFA00000000000000000000000000000000000A1 -:10AFB000020002000000000000000000000000008D -:10AFC00000000000000082000000000000000000FF +:10AF500000000000000000000000000000000100F0 +:10AF600001000100040004000400040004000100CA +:10AF70000100010009000400040004000020010099 +:10AF8000040001000400040004000020002003006D +:10AF9000030003000400000004000020040000205F +:10AFA000000000000000000002000000000000009F +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000800000000000000000000000018 +:10AFE00004000400040080008000800080008000D5 +:10AFF00004000400040004008000800080000001C0 +:10B00000040084000400800080008400000100012E +:10B0100004000400040080000000800000018000A3 +:10B02000000100000000000000000000000000001F :10B030000000000000000000000000000000000010 -:10B0400000000004000000000000000000000000FC +:10B040000000000000000000000000000000000000 :10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000100000000000000DF -:10B07000000000008400000000000000000000004C -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A000000000000000000000000400000040005C +:10B0600000000000880088009000900000000000B0 +:10B07000000000000021000020000000000000008F +:10B08000000000000021000000000000040000009B +:10B0900000000000000300000000000000000000AD +:10B0A00000000000000000000000000000000000A0 :10B0B0000000000000000000000000000000000090 :10B0C0000000000000000000000000000000000080 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000004000000040058 -:10B0F0000000000000000000000000000000000050 -:10B10000000000C00020000000000000000000005F +:10B0D000000000000000000000000000000002006E +:10B0E0000000200000000000000000000020009090 +:10B0F0000000002000000000000000000000000030 +:10B10000000000000000000000000000000000003F :10B11000000000000000000000000000000000002F :10B12000000000000000000000000000000000001F :10B13000000000000000000000000000000000000F :10B1400000000000000000000000000000000000FF :10B1500000000000000000000000000000000000EF -:10B1600000000000000001000000018000800000DD +:10B1600000000000000000000000000000000000DF :10B1700000000000000000000000000000000000CF :10B1800000000000000000000000000000000000BF :10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F +:10B1A0000000000000000000000000000000000996 :10B1B000000000000000000000000000000000008F :10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E0000000000000000000020000002020000419 +:10B1D0000000000000000009000000000000000066 +:10B1E000000000000000000000000000000000005F :10B1F000000000000000000000000000000000004F :10B20000000000000000000000000000000000003E :10B21000000000000000000000000000000000002E @@ -187218,154 +187218,154 @@ :10B23000000000000000000000000000000000000E :10B2400000000000000000000000000000000000FE :10B2500000000000000000000000000000000000EE -:10B2600000000000000090009000000000000000BE -:10B2700010090000000000000000000000000000B5 +:10B2600000000000000000000000000000000100DD +:10B2700000000000000000000000000000000000CE :10B2800000000000000000000000000000000000BE :10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E +:10B2A000000000000002000000000000000000009C :10B2B000000000000000000000000000000000008E :10B2C000000000000000000000000000000000007E :10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F00000008000000000000000000000000000CE -:10B30000000000000000000000C0000000080084F1 -:10B31000008800840000000000000084000000009D +:10B2E00000000000004000000000000000042000FA +:10B2F00040020988000000400020002000000000FB +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D :10B32000000000000000000000000000000000001D :10B33000000000000000000000000000000000000D :10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700001000000000000000000000900000000C3 -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000002000000020000A9 -:10B3A000000000000002000000000000000000009B +:10B3500000000004000000000000000000000000E9 +:10B36000000000900000000000000000000000004D +:10B3700000000000000000000000000000000000CD +:10B38000002100000000000000000000000000009C +:10B39000002100000000000000000000000000008C +:10B3A0000003000000000000010000000000000099 :10B3B000000000000000000000000000000000008D :10B3C000000000000000000000000000000000007D :10B3D000000000000000000000000000000000006D -:10B3E00000000000000000000082000000000000DB -:10B3F0000000200000000000000000000500000028 +:10B3E000000000000000000000000000000000005D +:10B3F00011000000200020000000000000000000FC :10B40000000000000000000000000000000000003C :10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C +:10B420000000000000000000000004000000000018 :10B43000000000000000000000000000000000000C :10B4400000000000000000000000000000000000FC :10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B47000000001009000000000000000000000003B -:10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C +:10B4600010000000000000000000000000000000CC +:10B47000000000C000900000000000C0009000002C +:10B48000000000C000900000000000C0009000001C +:10B49000000000C000900000000000C0009000000C +:10B4A000000000C0009000000000000300C00090F9 :10B4B000000000000000000000000000000000008C :10B4C000000000000000000000000000000000007C :10B4D000000000000000000000000000000000006C :10B4E000000000000000000000000000000000005C -:10B4F000000000001100A10000000000000000009A -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B +:10B4F000000000000080008000000000008000804C +:10B50000000000000080008000000000008000803B +:10B51000000000000080008000000000008000802B +:10B52000000000000080008000000000000000809B +:10B53000008000000000000000000000000000008B :10B5400000000000000000000000000000000000FB :10B5500000000000000000000000000000000000EB :10B5600000000000000000000000000000000000DB -:10B570000000000000000008098000030000000037 -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B +:10B5700000000000000040001000900088800000E3 +:10B5800000008000808000000000800080800000BB +:10B5900000008000808000000000800080800000AB +:10B5A000000080008080000000008000808000009B +:10B5B000000000008000808000000000000000000B :10B5C000000000000000000000000000000000007B :10B5D000000000000000000000000000000000006B :10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000010102000000083F -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A +:10B5F0000000000000000000010001008500C09074 +:10B60000000000008400C090000000008400C09092 +:10B61000000000008400C090000000008400C09082 +:10B62000000000008400C090000000008400C09072 +:10B630000000000000008400C09000000000000036 :10B6400000000000000000000000000000000000FA :10B6500000000000000000000000000000000000EA :10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000010088880800B1 -:10B6800000000000020000000000000000000000B8 -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A +:10B67000000000000000000000000000000000903A +:10B6800000C000000000009000C00000000000901A +:10B6900000C000000000009000C00000000000900A +:10B6A00000C000000000009000C0000000000090FA +:10B6B00000C0000000000000009000C0000000007A :10B6C000000000000000000000000000000000007A :10B6D000000000000000000000000000000000006A :10B6E000000000000000000000000000000000005A -:10B6F0000000000000000000000000004100008089 -:10B7000080004100000080000000000000000000F8 -:10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 +:10B6F000000000000000000000000000000000004A +:10B700000080008000000000008000800000000039 +:10B710000080008000000000008000800000000029 +:10B720000080008000000000008000800000000019 +:10B730000080008000000000000000800080000009 :10B7400000000000000000000000000000000000F9 :10B7500000000000000000000000000000000000E9 :10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000011B8 -:10B780000000108000000000000000000000000029 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 +:10B770000000000000000000000000000000800049 +:10B7800000020000002080118009000000008011EC +:10B79000800200000000801180090000000080117C +:10B7A000800200000000801180090000000080116C +:10B7B0008011000000000000801000210000000047 :10B7C0000000000000000000000000000000000079 :10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 :10B7F0000000000000000000000000000000000049 -:10B8000000010000014000000000000000000000F6 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 +:10B800009084000000000001C00120000000000042 +:10B81000C001200000000000C00120000000000066 +:10B82000C001200000000000C00120000000000056 +:10B83000C0012000000000000000C0000000000067 +:10B840009000000000000000000000000000000068 :10B8500000000000000000000000000000000000E8 :10B8600000000000000000000000000000000000D8 :10B8700000000000000000000000000000000000C8 -:10B880000000000000E0070082000000000000004F -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 +:10B8800000000082000006000000008200000600A8 +:10B890000000008200000600000000820000060098 +:10B8A0000000008200000600000000820000060088 +:10B8B000000000820000060000000000008200007E +:10B8C0000600000000000000000000000000000072 :10B8D0000000000000000000000000000000000068 :10B8E0000000000000000000000000000000000058 :10B8F0000000000000000000000000000000000048 -:10B900000000000000000000F0F000000000000057 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 +:10B90000000000000000FFFF000000FF000000FF3B +:10B91000000000FF000000FF000000FF000000FF2B +:10B92000000000FF000000FF000000FF000000FF1B +:10B93000000000FF000000FF000000FF000000000A +:10B940003C3C000000FF0000000000000000000080 :10B9500000000000000000000000000000000000E7 :10B9600000000000000000000000000000000000D7 :10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000F0F000000000D7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 +:10B980000000000000000000FFFF000000FF0000BA +:10B9900000FF000000FF000000FF000000FF0000AB +:10B9A00000FF000000FF000000FF000000FF00009B +:10B9B00000FF000000FF000000FF000000FF00008B +:10B9C00000003C3C000000FF000000000000000000 :10B9D0000000000000000000000000000000000067 :10B9E0000000000000000000000000000000000057 :10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000FFFF38 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 +:10BA00000000000000000000FF000000FF00000038 +:10BA1000FF000000FF000000FF000000FF0000002A +:10BA2000FF000000FF000000FF000000FF0000001A +:10BA3000FF000000FF000000FF000000FF0000000A +:10BA40000000FF00000000FFFFFF000000000000FA :10BA500000000000000000000000000000000000E6 :10BA600000000000000000000000000000000000D6 :10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 +:10BA800000000000000000000000FF000000FF00B8 +:10BA90000000FF000000FF000000FF000000FF00AA +:10BAA0000000FF000000FF000000FF000000FF009A +:10BAB0000000FF000000FF000000FF000000FF008A +:10BAC00000000000FF00000000FFFFFF000000007A :10BAD0000000000000000000000000000000000066 :10BAE0000000000000000000000000000000000056 :10BAF0000000000000000000000000000000000046 -:10BB000000000000000000000000000005400A06E0 -:10BB1000054C00A80000000000000000000000002C -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 +:10BB00000000000000000000000000000363033E8E +:10BB10000C0D92C0038203380C0092C003820338DC +:10BB20000C0092C0038203380C0092C003820338D9 +:10BB30000C0092C0038203380C0092C003820338C9 +:10BB40000C0092C00000038203380C0082C0000089 :10BB500000000000000000000000000000000000E5 :10BB600000000000000000000000000000000000D5 :10BB700000000000000000000000000000000000C5 :10BB800000000000000000000000000000000000B5 -:10BB90000F0FFFFF00000000000000000000000089 +:10BB900000000000000000000000000000000000A5 :10BBA0000000000000000000000000000000000095 :10BBB0000000000000000000000000000000000085 :10BBC0000000000000000000000000000000000075 @@ -187373,7 +187373,7 @@ :10BBE0000000000000000000000000000000000055 :10BBF0000000000000000000000000000000000045 :10BC00000000000000000000000000000000000034 -:10BC100000000F0F00000000000000000000000006 +:10BC10000000000000000000000000000000000024 :10BC20000000000000000000000000000000000014 :10BC30000000000000000000000000000000000004 :10BC400000000000000000000000000000000000F4 @@ -187381,7 +187381,7 @@ :10BC600000000000000000000000000000000000D4 :10BC700000000000000000000000000000000000C4 :10BC800000000000000000000000000000000000B4 -:10BC9000000000000000F0F00000000000000000C4 +:10BC900000000000000040801020000000000000B4 :10BCA0000000000000000000000000000000000094 :10BCB0000000000000000000000000000000000084 :10BCC0000000000000000000000000000000000074 @@ -187389,7 +187389,7 @@ :10BCE0000000000000000000000000000000000054 :10BCF0000000000000000000000000000000000044 :10BD00000000000000000000000000000000000033 -:10BD10000000000000000000F0F000000000000043 +:10BD10000000000000000000010204080000000014 :10BD20000000000000000000000000000000000013 :10BD30000000000000000000000000000000000003 :10BD400000000000000000000000000000000000F3 @@ -187397,192 +187397,192 @@ :10BD600000000000000000000000000000000000D3 :10BD700000000000000000000000000000000000C3 :10BD800000000000000000000000000000000000B3 -:10BD90000000000000000080008000000040000063 +:10BD9000000000000000020002000000000000009F :10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000172 +:10BDB000000000040000200000000000000000005F +:10BDC000C0000000000000000000000000000000B3 :10BDD0000000000000000000000000000000000063 -:10BDE000000000000000000400000000000000004F -:10BDF0000000000000000000000000000000000043 +:10BDE0000000040000000000000004040000000047 +:10BDF000000000000000000000000400000000003F :10BE00000000000000000000000000000000000032 -:10BE100000000000000000000040004000000001A1 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000200 -:10BE400000000000000000000000000000000000F2 -:10BE5000000000020000000000004002000000029C -:10BE600000000002000000020000008200820000CA -:10BE7000000040000002000000000002000200007C +:10BE10000000000000000000800080000000000022 +:10BE20000000000000000000009000000000000082 +:10BE300000000000000000000002000000000002FE +:10BE400000000000000000020000000000000002EE +:10BE500000000000000000000000000200000000E0 +:10BE6000000200008002000200000090800000003C +:10BE700000020002400000000000000080000000FE :10BE800000000000000000000000000000000000B2 -:10BE90000000000000000000000000000000004062 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC000000000000000080000000000000000006A -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF20000001000000000000000000000000000010 -:10BF300000000000000000000000000004000000FD -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA000000001000000000000000000000002008E -:10BFB000000000000000C0000000000000000000C1 -:10BFC0000000000000000000000000000000000071 +:10BE900000000000000000000000000000000000A2 +:10BEA0000100000000000000000000000000000091 +:10BEB0000000000000000000000000002000000062 +:10BEC000000000000000000001000100010000006F +:10BED0000000000000000000000000000000010061 +:10BEE000000000000100020000000000010000004E +:10BEF0000100000000000000000000000000000041 +:10BF000000000100000000000100400000000000EF +:10BF10000000080000000000000000000000000019 +:10BF2000000002000000000000000000000000000F +:10BF300004000000000004000000000000000400F5 +:10BF400000000000000000000000040004000400E5 +:10BF500000000004000000000000000000000000DD +:10BF600004000000000004000000000000000400C5 +:10BF700000000400000000000000000000000000BD +:10BF800000000000040000000000400080000008E5 +:10BF90000000000080000000000000000000000021 +:10BFA00004000080400002000000000000000000CB +:10BFB0000000000000080000000000210000000058 +:10BFC000000000000000000000000003000000006E :10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF000000004000000000000000000000000003D +:10BFE0000000002100000000000000000000000030 +:10BFF00000080040020000000000000000000000F7 :10C000000000000000000000000000000000000030 :10C010000000000000000000000000000000000020 -:10C0200000000000200000000000200000000000D0 -:10C030008000000000000000000000000000000080 +:10C020000000800000200000002000000020000030 +:10C0300000000000000000000000000000A0000060 :10C0400000000000000000000000000000000000F0 :10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 +:10C06000000000A000000000000000000000000030 :10C0700000000000000000000000000000000000C0 :10C0800000000000000000000000000000000000B0 :10C0900000000000000000000000000000000000A0 -:10C0A000000000000000000001800000000000000F -:10C0B000000000000000000001000000000000007F -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C120000000000000000000000004040000000007 -:10C1300000000000000000000000040000000000FB -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000090000F -:10C1A000000000009000008000000000000000007F -:10C1B000000000000000000004000020000000005B +:10C0A0000000000000000000000000000000000090 +:10C0B0000040000000000000000000000000000040 +:10C0C0000000000000000000000004000400040064 +:10C0D0000000000000000400040000000000000058 +:10C0E0000400040004000000040004000004000434 +:10C0F0000400040000000000000004000400040428 +:10C10000040004000400000004000000000000001F +:10C11000010400000000000000000000000000001A +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000080008000EF +:10C15000800000000000000080008000000003005C +:10C160000300830080008010001083008300000023 +:10C1700000008300830000000000030083008004AF +:10C180008000830083008000000080000000030026 +:10C190000300400003000300000003000000000053 +:10C1A0000000000002000000080000000080000005 +:10C1B000000000000020000000000000000000005F :10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C220000084000000C000C000080000048400007A -:10C2300000000000000000000000000000010000FD -:10C240000000000000000000000000000000008866 -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE +:10C1D000000000000000000000210000000000003E +:10C1E000000000000000000000000021000000002E +:10C1F000000000000000000000000000020000003D +:10C20000000000000000000000000000900082001C +:10C210000000000000000000000400110000000009 +:10C2200000000000000000004082C00020840020C8 +:10C230000000400000A0000000000000008400009A +:10C240000000000000A000000000000000840000CA +:10C2500000000000008200000000000000840000D8 +:10C26000000000000000008200000000000000004C +:10C27000210000000000000000000000000000009D :10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A00000000000880000000000000901000000FC -:10C2B0000000000200090002000000000000000071 -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C3200000000000000000000000000000002000ED -:10C3300000000000000000000000050000000000F8 +:10C290000000000000000000000000000000050099 +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000002100000000000000005D +:10C2C000000000000000002100000000000000004D +:10C2D000000000008400000300000000A021000016 +:10C2E000000000000080A100000390000000A021D9 +:10C2F0000000000000000800000000000000A00096 +:10C30000000000000000A00000000000000000008D +:10C31000000000000180000082000000000000001A +:10C32000000000000000000000000000000000000D +:10C3300000000000020000400200000000000000B9 :10C3400000000000000000000000000000000000ED :10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000001008C -:10C3B000909000000000000000000000000000005D -:10C3C000909000000000000000000000000000004D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C +:10C3600000000000000000200400000000000800A1 +:10C370002000000420000000000000042000030052 +:10C38000000000040004000000000004200000047D +:10C390002000000400040810080400000000200031 +:10C3A000080400002000000000000000000040C061 +:10C3B00000A0001088020000000000000000000043 +:10C3C000000000000000000000000000000000006D +:10C3D00000000000000000C000900000000000C04D +:10C3E000009000000000000300C00090000000006A +:10C3F00000C000900000000000C00090000000009D +:10C4000000C000900000000000C00090000000008C +:10C4100000C0009000000000A0900190A09010903B :10C42000000000000000000000000000000000000C -:10C43000110021800000000000000000000000004A -:10C44000110080000000000000000000000000005B -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C -:10C4A000000000000000000000000000000000008C -:10C4B0000000000809800003008000000000000068 -:10C4C000000000000080000000800000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B -:10C5300000000000000101040000000200000000F3 -:10C540000000000000000020000000C0000000000B -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B00000000000000000000800C0900100000022 -:10C5C0000000000000000100008888000100000059 +:10C4300080800000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000080008000000000DC +:10C4600000800080000000000000008000800000CC +:10C4700000000080008000000000008000800000BC +:10C4800000000080008000000000008000800000AC +:10C4900000000080008000000000800041000000DB +:10C4A000800000000000000000000000000000000C +:10C4B000000000008000002180000000000000005B +:10C4C000000000000000000000000000000000006C +:10C4D00000000000000000000000000080000000DC +:10C4E000808000008000000080800000000080004C +:10C4F000000080800000800000008080000080003C +:10C50000000080800000800000008080000080002B +:10C51000000080800000800000008080100021006A +:10C5200009801000000000008000000000000000F2 +:10C5300000000000100010001001C000000000000A +:10C5400000000000000000000000000000000000EB +:10C550000000000000000000000000000000820059 +:10C560000000C090000082000000C09000000000A9 +:10C5700082000000C090000082000000C090000017 +:10C5800082000000C090000082000000C090000007 +:10C5900082000000C090000082000000C0900100F6 +:10C5A0000100018801009000880004009000000054 +:10C5B0000000000000001010001000A003C00000E8 +:10C5C000000000000000000000000000000000006B :10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C630000000000000000000090080008080100061 -:10C640000000000000000000410000800000090020 +:10C5E0000000009000C000000000009000C00000AB +:10C5F00000000000009000C000000000009000C09B +:10C6000000000000009000C000000000009000C08A +:10C6100000000000009000C000000000009000C07A +:10C620000088008890900089000000000000000051 +:10C630000000000000000000808000000000A180D9 +:10C6400000000000000000000000000000000000EA :10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A -:10C6B00000000000000000000000001180000000E9 -:10C6C00000000000000000000000001100000080D9 +:10C6600000000000008000800000000000800080CA +:10C67000000000000000008000800000000000803A +:10C6800000800000000000800080000000000080AA +:10C69000008000000000008000800000000000809A +:10C6A0000080002000100090000400000000000046 +:10C6B00000000000000000000000000000830000F7 +:10C6C000000000000000000000000000000000006A :10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000012000D8 -:10C740000088000000000000000000000001000060 -:10C750000040000000000000000000000000000099 -:10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C00000E0070000110000000000000000000071 -:10C7D00000000700822100000000000000000000AF -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 +:10C6E0000000802000210000000080118005000073 +:10C6F000000000008011800500000000801180050E +:10C7000000000000801180050000000080118005FD +:10C7100000000000801180050000000080118005ED +:10C7200000000000808080119100082000000000BF +:10C730000000000000000000000000000000008277 +:10C7400000A0000000000000000000000000000049 +:10C7500000000000000000000000000000000000D9 +:10C76000000000009000000000000000C001200058 +:10C77000000000000000C001200000000000C00117 +:10C78000200000000000C001200000000000C001E7 +:10C79000200000000000C001200000000000C001D7 +:10C7A000200000000000C040A000110001000000B7 +:10C7B000000800840000000000000000000000826B +:10C7C0000000060000000000000000000000000063 +:10C7D0000000000000000000000000000000000059 +:10C7E000000000000000004200000600000000827F +:10C7F00000000600000000000042000006000000EB +:10C800000082000006000000008200000600000018 +:10C810000082000006000000000600000600000084 +:10C820000082000006000000000600000600600014 :10C8300000000000000000000000000000000000F8 -:10C840000000FF000000FF000000000000000000EA -:10C85000000000000000F0F00000000000000000F8 -:10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 -:10C8C00000000000FF000000FF000000000000006A -:10C8D0000000000000000000F0F000000000000078 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 +:10C8400000000000C3C3C606000000000000000096 +:10C8500000000000000000000000000000000000D8 +:10C860000000000000000000FFFF0000FF000000CB +:10C87000FF000000FF0000000000FF000000FF00BC +:10C880000000FF000000FF000000FF000000FF00AC +:10C890000000FF000000FF000000FF000000FF009C +:10C8A0000000FF000000FF00000066009060DF2035 +:10C8B000FF00000000000000000000000000000079 +:10C8C0000000000000000000C6060000000000009C +:10C8D0000000000000000000000000000000000058 +:10C8E00000000000000000000000FFFF0000FF004B +:10C8F0000000FF000000FF0000000000FF0000003B +:10C90000FF000000FF000000FF000000FF0000002B +:10C91000FF000000FF000000FF000000FF0000001B +:10C92000FF000000FF000000FF00000066009060B4 :10C9300000000000000000000000000000000000F7 :10C9400000000000000000000000000000000000E7 :10C9500000000000000000000000000000000000D7 @@ -187592,38 +187592,38 @@ :10C990000000000000000000000000000000000097 :10C9A0000000000000000000000000000000000087 :10C9B0000000000000000000000000000000000077 -:10C9C00000000000000000FF0000FFFF000000006A -:10C9D00000000000000000FF0000FFFF000000005A +:10C9C0000000000000006060000066F030300000F1 +:10C9D0000000000000000000000000000000000057 :10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA4000000000000000000000FF000000000000E7 -:10CA5000000000000000000000FF000000000000D7 +:10C9F00000FF00000F0F000000FF00000F0F0000FD +:10CA0000000000FF00000F0F000000FF00000F0FEC +:10CA1000000000FF00000F0F000000FF00000F0FDC +:10CA2000000000FF00000F0F000000FFFFFFF0F00C +:10CA30000000000C0000000000000000C4F4C7F774 +:10CA40000000000000000000606F3C3C66003030D9 +:10CA500000000000000000000000000000000000D6 :10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000015602A06054C70 -:10CAD00000A8000000000000000005002A0005403A -:10CAE00000A800000000000000000000000000009E -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 +:10CA7000000000FF00000F0F000000FF00000F0F7C +:10CA80000000000000FF00000F0F000000FF00008A +:10CA90000F0F000000FF00000F0F000000FF00005C +:10CAA0000F0F000000FF00000F0F000000FFFFFF4E +:10CAB000F0F00000000C0000000000000000043452 +:10CAC0000737000000000000000000005038009010 +:10CAD0000005000000000000000000000000000051 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000030203380C0092C0038203380C00CC +:10CB000092C00000038203380C0092C003820338F5 +:10CB10000C0092C0038203380C0092C003820338D9 +:10CB20000C0092C0038203380C0092C003820338C9 +:10CB30000C0082C01061003E000D000000000000EB :10CB400000000000000000000000000000000000E5 -:10CB5000FFFF0000000000000000000000000000D7 +:10CB500000000000000000000000000000000000D5 :10CB600000000000000000000000000000000000C5 :10CB700000000000000000000000000000000000B5 :10CB800000000000000000000000000000000000A5 :10CB90000000000000000000000000000000000095 :10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 +:10CBB000000000000000C0C0C0C0A03FAF3F0000A8 :10CBC0000000000000000000000000000000000065 :10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 @@ -187631,9 +187631,9 @@ :10CC00000000000000000000000000000000000024 :10CC10000000000000000000000000000000000014 :10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 +:10CC30000000000000000000C0C0C0C0A030AF3045 :10CC400000000000000000000000000000000000E4 -:10CC500000000000F0F000000000000000000000F4 +:10CC500000000000000000000000000000000000D4 :10CC600000000000000000000000000000000000C4 :10CC700000000000000000000000000000000000B4 :10CC800000000000000000000000000000000000A4 @@ -187641,444 +187641,444 @@ :10CCA0000000000000000000000000000000000084 :10CCB0000000000000000000000000000000000074 :10CCC0000000000000000000000000000000000064 -:10CCD000000000000000F0F0000000000000000074 +:10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 :10CCF0000000000000000000000000000000000034 :10CD00000000000000000000000000000000000023 :10CD10000000000000000000000000000000000013 :10CD20000000000000000000000000000000000003 :10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 -:10CD50000000000000000000000000000080000053 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000010000A2 -:10CD90000004000000000000000000040004000483 -:10CDA000000000040000000000000000000400007B -:10CDB0000000000000000000000000020000000071 -:10CDC000000000000000000200000000000000025F -:10CDD0000002000000000000000010000000004001 -:10CDE0000000000000000000100000000000000033 -:10CDF000000000000000100000000004000000001F -:10CE0000000000040000000000000000000000001E -:10CE1000000000000002000000020000000200020A -:10CE200000000000000000000000000200020000FE -:10CE300000020040000000000000000200000000AE -:10CE400000000002000000000000000200000000DE -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE7000000000000000000000000000080000109A -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000200000000000000000000000000000060 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000080000C9 -:10CF600000008900000000000000000000800000B8 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 +:10CD400040000000000000000000000000000000A3 +:10CD500000000000000000000004000000110000BE +:10CD600000000000040004000400000000000003B4 +:10CD7000040004000000000004000400040000009F +:10CD80000400040004000400040004000000040087 +:10CD90000400040004000400040004000400040073 +:10CDA0000400040004020000000000000000000075 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000100000000000000000000000000053 +:10CDD0000002000000000000000000000000000051 +:10CDE000008200000002800080008002000000003D +:10CDF00000048002800000000002800280028000A7 +:10CE0000000080008002800080008000800400001C +:10CE1000800080028000800280008000800280000C +:10CE2000800280028000809000000002000000026A +:10CE300000000002000020000000000000000000D0 +:10CE400000000002800000C000000002000000009E +:10CE500000000000000000000000000004000400CA +:10CE600000000000000009000000000004000100B4 +:10CE7000010001000800080000000000020002009C +:10CE80000000090000000010020002000000000085 +:10CE90000000400000000000010005000500000047 +:10CEA0004000010000000000400001000000000000 +:10CEB000410000000000000009000900000001001E +:10CEC00001000100410001001010010000000000FD +:10CED0004100000000000000000004000400000009 +:10CEE0000000000000000000080004000400000032 +:10CEF000040004000400000000000400040004001A +:10CF00000400000004000000000004080000040009 +:10CF100000000000800000000000400040004000D1 +:10CF20000400800040000000000080004008000075 +:10CF300000008800000000000000C000C0000000E9 +:10CF40004000400008008200080080010802000044 +:10CF50000000880000000000000000000000200029 +:10CF60000000880000000000000000000008000031 +:10CF7000000000110000000200000000000000009E +:10CF8000000000000000040000000000000000009D :10CF90000000000000000000000000000000000091 -:10CFA000000000000000000004000000000000007D -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000150 -:10CFE00000000000200000000000000000000040E1 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000002100000000000000000000000050 +:10CFC00000000011880001000000000000000000C7 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000A00000008800000000000019 :10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 +:10D00000050000000000000000000000000000001B :10D010000000000000000000000000000000000010 :10D020000000000000000000000000000000000000 -:10D0300000000000000000000004002000000000CC -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000018001800000000000000100BD -:10D0700000000000000001000000000000000000AF -:10D08000000000000100008000000000000000001F -:10D090000000000000000000000000000000000090 -:10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E00000000000000020200220000000000000DE -:10D0F0000400000000000000040000000000000028 -:10D1000000000000000020000004000000000000FB -:10D11000000000000000000000000000000000000F +:10D0300000000000000000000000000000000000F0 +:10D0400002000000000000001000000005000000C9 +:10D0500000000002000200000000000000000000CC +:10D0600000000000000000000000000000110000AF +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000A0000000C00040 +:10D090000800080000000000000000000000080078 +:10D0A0000000000000000800080000000000080068 +:10D0B0000000000008000800080000000800080048 +:10D0C0000000000008000800080008000800080030 +:10D0D0000800000000000000000000000000000048 +:10D0E000000000000200000000000000000000003E +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000004000B :10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF +:10D1300000000800000000000000000000000000E7 :10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000020000000AF -:10D16000900000000100000000001000000000001E -:10D17000002000000000000000200000000000006F -:10D18000000090000080000000000000000000008F +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000040000AB +:10D18000000000000400000000000000000000009B :10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D00000000000000000000000000000000084CB -:10D1E0000000000000C00200000040008084000039 -:10D1F00000000001000004000000000100840000A5 -:10D200000000000000000008000000000000000016 -:10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE -:10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000009010000000000B4 -:10D2700000000000000900020000000000000000A3 -:10D28000000000000000000200000000000000009C -:10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E -:10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000200000001E +:10D1A0000000A000080000400040C0000000000097 +:10D1B0000000000000000000000000000000080067 +:10D1C000000000000000080090000000C000018086 +:10D1D00083800185C10000090000000000000000FC +:10D1E00000000000000000A000000002000000009D +:10D1F000000000000000000000000000000000002F +:10D20000000000000000800000000000000000009E +:10D21000000000000000000000000002000000000C +:10D2200000000000000000000000000000A000005E +:10D2300000000000008400000000000000A00000CA +:10D24000000000000000000000000000009000004E +:10D2500010041040200820000000210203002000DC +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D280000100000000000000000004000000000099 +:10D2900001008400000000000000A0000800000061 +:10D2A00000000000A000000000000000A00000003E +:10D2B000000008000000000000000800000000213D +:10D2C0000000A000000000000000000000000000BE +:10D2D0000000000040000000010000090000000202 +:10D2E000000000000000000000000000000000003E :10D2F000000000000000000000000000000000002E -:10D300000000000000000000050000000000000018 -:10D310000500000000000000000000000000000008 +:10D300000000040000000000000000008000000099 +:10D310000000040000000000000000000400000005 :10D3200000000000000000000000000000000000FD -:10D3300000000000000000000000000000000000ED +:10D3300011001100000000000000000000000000CB :10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D36000000000000000000000000000010090002C -:10D370000000000800009000000000100000900075 -:10D38000000000000000000000000000010000009C -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D -:10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000011002C -:10D3F000A1000000000011008000000000001100EA -:10D40000800000000000000000000000000011008B -:10D4100021000000000000000000000000000000EB -:10D4200000000000000000000000000000000000FC -:10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D470000008098000090000000000800000008012 -:10D48000000000800000000000000000000000001C -:10D4900000410900000300800000000000000000BF -:10D4A000000000000000000000000000000000007C -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F0000000000101020000008800000020000080 -:10D5000000C0000000200000000800000000000033 -:10D510000000000101000000008800000000000081 -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D57000000000000100888802000000010002880D -:10D580008800010001000088880000000000000001 -:10D590000000000000008800000001000000000002 -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F0000000000000004100008080004100410068 -:10D600008080000009004100008000000000000050 -:10D6100000000000000000000000000041000000C9 -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA -:10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D670000000000000000000001100000080080011 -:10D680000011000000800000001100000080000078 -:10D690000000000000000000000010110000000069 -:10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000000000005A -:10D6D000000000000000000000000000000000004A -:10D6E000000000000000000000000000000000003A -:10D6F00000000000000000000000000100000040E9 -:10D700000000000100000040000000010000004097 -:10D710000000000000000000000000000001000008 -:10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D77000000000000000000000000000000000E0C9 -:10D780000700820000000000070082210000000066 -:10D79000070082000000000000000000000000E020 -:10D7A00000008141000000000000000000000000B7 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 +:10D350000000000000408000030008000000000002 +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000C000905D +:10D380000000000000C000900000000000C00090FD +:10D390000000000000C000900000000000C00090ED +:10D3A00000000000000300C101901000000000C157 +:10D3B00001918200000000C10091A0010001000164 +:10D3C000000108000000000000000800000000014B +:10D3D00000010800000009018901820088010000A5 +:10D3E0000000C0000000000000000000000000007D +:10D3F00000000000000000000000000000000080AD +:10D40000008000000000008000800000000000801C +:10D41000008000000000008000800000000000800C +:10D42000008000000000000000A040848010001078 +:10D4300000A008820010001000880388000200404D +:10D4400000404103001000100000410000000000F7 +:10D4500000404103001000109141A12191410020A2 +:10D46000000040000000000000000000000000007C +:10D4700000000000000000000000000000000000AC +:10D48000000000008000808000000000800080809C +:10D49000000000008000808000000000800080808C +:10D4A000000000008000808000000000000080007C +:10D4B0008080000000008000808800000000800064 +:10D4C00080808000000000020000000000000002D8 +:10D4D00000002000081010021000C180A11003916C +:10D4E000C1100000000380000000000000000000E8 +:10D4F000000000000000000000009000100002008A +:10D50000A000000000008400C09000000000840023 +:10D51000C090000000008400C09000000000840063 +:10D52000C090000000008400C090000000000000D7 +:10D530008400C090004000008400C0910000000002 +:10D540008400C090040004009001A0409000880076 +:10D55000880182000100000100C100401002A10109 +:10D56000C103C1008200200102A0A0400000000011 +:10D5700000000000000000000000000000000000AB +:10D580000000000000000000009000C0000000004B +:10D59000009000C000000000009000C000000000EB +:10D5A000009000C000000000109000C000000000CB +:10D5B0000000009000C000000000039000C10001C6 +:10D5C0000001089000C100000100400001010001BD +:10D5D000000100000001000001004000010100887E +:10D5E000018821C1010300000000000000010000CB +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000080008000001A +:10D61000000000800080000000000080008000000A +:10D6200000000080008000000000008000800000FA +:10D6300000044010119000C000034010109000C082 +:10D6400000080808C088008200410310081002404A +:10D65000000800080040004000410310081002408C +:10D6600000000900090511C10008001000100003A6 +:10D6700000000000000000000000000000000000AA +:10D680000020000000800000800000110000000069 +:10D6900080080021000000008011801000000000C0 +:10D6A00080200021000000008011800500000000A3 +:10D6B000000080118005000000008211900510001C +:10D6C0000400801180050000000000000000000040 +:10D6D00000000000000000000000800000000000CA +:10D6E00000204188109141802011000000020000BC +:10D6F000000000000000000000000000000000002A +:10D700000000000100100040000090000000000038 +:10D710000000C000000000009000C00120010000D7 +:10D720000000C000000000009000C00120000000C8 +:10D7300000000000C001200000000000C101200026 +:10D7400000000100C00120000000000000000010E7 +:10D7500000100000000000A00008000004401000BD +:10D7600010008801898888888888840190001011B9 +:10D770001010820000000000000000000000000007 +:10D780000000000000000000000000000082000017 +:10D790000600000000820000060000000082000079 +:10D7A00006000000008200000600000000210000CA +:10D7B00006000000000000820000060000000021BA +:10D7C000000006000000002100000600000000002C :10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 +:10D7E000000000000000842100600600000000002E :10D7F0000000000000000000000000000000000029 -:10D800000000F0F0000000000000F0F00000000058 -:10D810000000F0F000000000000000000000000028 -:10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 +:10D800000000000000000000000000000000000018 +:10D81000FFFF000000FF00003C3C000000FF000094 +:10D8200000FF000000FF00003C3C000000FF000083 +:10D8300000FF000000FF0000000000FF000000FFEC +:10D84000000000FF000000FF000000FF000000FFDC :10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D8800000000000F0F0000000000000F0F00000D8 -:10D8900000000000F0F000000000000000000000A8 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 -:10D8F0000000000000000000000000000000000028 -:10D90000000000003C3C0000FFFF00003C3C000029 -:10D91000FFFF000000000000FFFF0000000000000B -:10D9200000000000000000000000000000000000F7 -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000003C3C0000000000003C3CA7 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000000037 -:10D9F0000000000000000000000000000000000027 -:10DA000000000000000005402A06054C00A80500A3 -:10DA10002A00054000A805000A00054000A80000F3 -:10DA200000000000000000400006000C00000000A4 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 -:10DA600000000000000000000000000000000000B6 -:10DA700000000000000000000000000000000000A6 -:10DA8000000000000000000000003C3CFFFF000020 +:10D86000FA30FA3F000000003CFFAAF0B0B3BCBFA2 +:10D870003A0F3AFF00000000000000000000000026 +:10D880000000000000000000000000000000000098 +:10D890000000FFFF000000FF00003C3C000000FF14 +:10D8A000000000FF000000FF00003C3C000000FF03 +:10D8B000000000FF000000FF0000000000FF00006B +:10D8C00000FF000000FF000000FF000000FF00005C +:10D8D00000FF000000000000000000000000000049 +:10D8E00000000A300A3F000000003C00AAF08083DC +:10D8F0008C8F3A003AF000000000000000000000A9 +:10D9000000000000000000000000000000004400D3 +:10D910008800FF000000FF000000FF000000FF0083 +:10D920000000FF000000FF000000FF000000FF00FB +:10D930000000FF000000FF0000000000FF000000EA +:10D94000FF000000FF000000FF000000FF000000DB +:10D9500000FFFFFF00000000FFAA550000000000CC +:10D96000FF5C0F5C000000000000000000000000F1 +:10D9700000000A05000000002D2D2D2D00000000E4 +:10D980000000000000000000000000000000000097 +:10D9900000440088FF000000FF000000FF000000BE +:10D9A000FF000000FF000000FF000000FF0000007B +:10D9B000FF000000FF000000FF0000000000FF006B +:10D9C0000000FF000000FF000000FF000000FF005B +:10D9D000000000FFFFFF000000001E1E1E1E0000D2 +:10D9E0000000F05C005C000000000000000000008F +:10D9F000000014140A0500000000FFAA55000000F2 +:10DA00000000000000000000000000000000000016 +:10DA1000000000000000030203380C0092C00382E3 +:10DA200003380C0092C0038203380C0092C00382BA +:10DA300003380C0092C0038203380C0092C000002F +:10DA400003E3033E0C0D92C003E3033E0C0D92C0B2 +:10DA500003E3033E0C0D82C000610006000D0000D0 +:10DA600000610006000D000000610006000D0000CE +:10DA70000020003BC000000800610006000D00000F +:10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 -:10DAA00000000000000000000000FF00FFFF000079 +:10DAA0000000000000000000000000000000000076 :10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000003C3C00009D +:10DAC0000000000000000CAFFCAF5F3F5F3030FA99 +:10DAD0003FFA000000000E3ECEFE0000000030AF16 +:10DAE0003FAF00000000E0ECE3EF0000000030AFCB +:10DAF0003FAF0055044D5555AA5500000000FA30BF +:10DB0000FA3F0000000000000000000000000000DC :10DB10000000000000000000000000000000000005 -:10DB2000000000000000000000000000FF000000F6 +:10DB200000000000000000000000000000000000F5 :10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 -:10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB80000000000000000000000000000000000095 -:10DB9000F0F00000000000000000000000000000A5 +:10DB400000000000000000000CA0FCA0503F50307E +:10DB5000300A3F0A000000000232C2F2000000005A +:10DB600030A03FA000000000202C232F0000000068 +:10DB700030A03FA00055040C000000000000000091 +:10DB80000A300A3F00000000000000000000000012 +:10DB90000000000000000000000000000000000085 :10DBA0000000000000000000000000000000000075 -:10DBB000F0F0000000000000000000000000000085 -:10DBC0000000000000000000000000000000000055 -:10DBD0000000000000000000000000000000000045 -:10DBE0000000000000000000000000000000000035 -:10DBF0000000000000000000000000000000000025 +:10DBB0000000000000000000000000000000000065 +:10DBC000000000000000FD3DCD0D00000000FDCD77 +:10DBD0003D0D0000000055FF0F3C00000000DFDCA1 +:10DBE0001F1C000000000000000000000000DFDC3F +:10DBF0001F1C3CFFAAF01B00EB00F050309000000F :10DC00000000000000000000000000000000000014 -:10DC10000000F0F000000000000000000000000024 +:10DC10000000000000000000000000000000000004 :10DC200000000000000000000000000000000000F4 -:10DC30000000F0F000000000000000000000000004 -:10DC400000000000000000000000000000000000D4 -:10DC500000000000000000000000000000000000C4 -:10DC600000000000000000000000000000000000B4 -:10DC700000000000000000000000000000000000A4 +:10DC300000000000000000000000000000000000E4 +:10DC40000000000000000000F131C10100000000F0 +:10DC5000F1C131010000000055000F3C0000000040 +:10DC6000D3D01310000000000000000000000000EE +:10DC7000D3D013103C00AAF00F00140000A03030E5 :10DC80000000000000000000000000000000000094 -:10DC90000000000000000000000000000000000084 -:10DCA0000080000000000000008000000000000074 -:10DCB0000000000000000000000000000000000064 -:10DCC0000000000000000000000100000000000053 -:10DCD0000000000000000000000000000000000044 +:10DC90000000000000800000000000000002408042 +:10DCA0000800000000000403000000000000000065 +:10DCB0000000000000000000000000000002000062 +:10DCC0000000000000000000000000000000000054 +:10DCD0000200040004000000000400000000000036 :10DCE0000000000000000000000000000000000034 -:10DCF0000004000000000000000000000000000020 +:10DCF00000000000009100000080C0000000000053 :10DD00000000000000000000000000000000000013 -:10DD10000000000000000000000000000000000201 -:10DD200000000040000000000000000800000000AB -:10DD300000000000000000000000000000000000E3 -:10DD4000000240000002000000020000000000008D -:10DD500000000090000000900090000040900090B3 -:10DD60000090000000000000000000000000000023 -:10DD700000000000000000000000000000020000A1 +:10DD10000000000000000020000000900000000152 +:10DD20008010800000000090000000000000000251 +:10DD300000900000009000000000000000000000C3 +:10DD400000020000000000000002000000000000CF +:10DD50000000800080008000000000000090410072 +:10DD600000040004000000000000000000000000AB +:10DD70000000000000000020000000200000000063 :10DD80000000000000000000000000000000000093 -:10DD90000000000000000000000000000000000083 -:10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 -:10DDC000000000000400000000000000000000004F -:10DDD0000000000000000000000000000000000043 -:10DDE0000000000000000000000000000000000033 -:10DDF000000000000004000000000000000000001F -:10DE00000000000000000000000000000000000012 +:10DD90000000000000000000000002000000000081 +:10DDA0000000080000000100020000000000000068 +:10DDB000000500000000000004000000000000005A +:10DDC0000002000000000000000000000000000051 +:10DDD0000200000000000300110005000500010022 +:10DDE00000000000400000000000000000000000F3 +:10DDF0000000000040000000000000000080010062 +:10DE000011000000010000000003000000000000FD :10DE10000000000000000000000000000000000002 -:10DE200000000000000000000000000000000000F2 +:10DE200000000000900000000800800000000000DA :10DE300000000000000000000000000000000000E2 -:10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000000000000B2 -:10DE7000000000080000000000000000000000009A -:10DE80000000000000000000000000000000000092 -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000000000000000010071 -:10DEB0000000000000000100000000000000000061 -:10DEC0000000000000000000000000000000000052 -:10DED000000000000008000000000000000000003A -:10DEE0000000000000000000000000000000000032 -:10DEF0000000000000000000000000000000000022 -:10DF00000000000000000000000000000000000011 -:10DF1000000000000000000000C000000000000041 -:10DF200000000000000000000000000000000020D1 -:10DF300004000000000000002000000000000000BD -:10DF40000000000000A00000000000000000000031 -:10DF500000000000000000000000000000000000C1 -:10DF600000000000000000000000000000000000B1 -:10DF700000000000000000000000000000000000A1 -:10DF80000000000000000000000000000000000091 -:10DF90000000000000000000000000000000000081 +:10DE4000000000000002000000000000008400004C +:10DE50000008800000840000C0000208A000A000AC +:10DE600040000000000080000000000000000000F2 +:10DE70000008000000008000200020840000002036 +:10DE800040009082000040000004000000000000FC +:10DE90000000000000000000040004000000040076 +:10DEA00000001000000000000005900000000000CD +:10DEB0000008000000210000000000000000000039 +:10DEC0000021000000210000000000000000000010 +:10DED00000000003000000400000000000000000FF +:10DEE000002100000000000300000008880000007E +:10DEF000002100000021002100000000002000009F +:10DF000000210000002100210000000040219000BD +:10DF100000210000000000000000800080000000E0 +:10DF200080000002800000A000000020000200002D +:10DF300000000000040000000000000005080000D0 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000040000000000084FD +:10DF600000840000000000A000A0000000000000ED +:10DF700000000000000000A000A000000000000160 +:10DF800040000000410020A000A00000000080A090 +:10DF900000842000000000000000000000000000DD :10DFA0000000000000000000000000000000000071 -:10DFB0000000000000000000010000000000000060 -:10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000000000000000041 +:10DFB0000000000000000000000000000000000061 +:10DFC00000000000000004000000000090000000BD +:10DFD0000000000000000000000000000800000039 :10DFE0000000000000000000000000000000000031 -:10DFF0000000000000000000000000000000000021 -:10E000000000000000000000000000000000000010 +:10DFF000000000000000000000000000000000031E +:10E0000004200000002000000080000000800000CC :10E010000000000000000000000000000000000000 -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000200000000000C0 +:10E0200000000000000000000000000020080000C8 +:10E0300000000000000000A0000000080000000038 :10E0400000000000000000000000000000000000D0 -:10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 +:10E050000000000000000000000000000000800040 +:10E06000000000000000000000000000008200002E :10E0700000000000000000000000000000000000A0 -:10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000200000000000000000000040 -:10E0C0000000000000000000000000000000000050 -:10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 -:10E0F0000000000000000000000000000000000020 -:10E10000000000000000000000000000000000000F -:10E11000000000000000000000000084000000C0BB -:10E1200000000000000009840084000000000000DE -:10E1300000840000000000010084000000000000D6 -:10E1400000C000000000008400000000000000008B -:10E1500000000000000000000000000000000000BF -:10E1600000000000000000000000000000000000AF -:10E17000000000000000000000000000000000009F -:10E18000000000000000000000000000000000008F -:10E19000000000000000000000000000000000007F -:10E1A0000000000000090000000000000000000066 -:10E1B0000002000200000000000000020000000059 -:10E1C000000900020000000000090000000000003B -:10E1D000000200000000000000000000000000003D -:10E1E000000000000000000000000000000000002F -:10E1F000000000000000000000000000000000001F -:10E20000000000000000000000000000000000000E -:10E2100000000000000000000000000000000000FE +:10E0800000008001000000010000004000000010BE +:10E09000000021000000000000000000000000005F +:10E0A000000000000100000000000000000200006D +:10E0B000000000000000000200210000000000003D +:10E0C000000000000000000900000000000008003F +:10E0D0000800000000000800000000008200A0000E +:10E0E000C000002100080003000800200008000014 +:10E0F000820000000021C0000000000000000000BD +:10E1000008000000048040000400C000100500006A +:10E110000021004000850000000800000000000011 +:10E120000000000000000400000000000000008962 +:10E13000110000000000008400000000000000A0AA +:10E14000020000000500008421000000000000A083 +:10E15000000000000000000021000000000000009E +:10E16000004000000000110000900088000000A0A6 +:10E1700000A000000000200000000000000000A03F +:10E1800000A021002190002040008000218880A074 +:10E1900000A000880900000200000000000000004C +:10E1A000000000000000000000000000002100004E +:10E1B000400000000000000001800000000300009B +:10E1C000002190000000000000000000000000009E +:10E1D0000021900000000400C000000000000000CA +:10E1E000A000C0000400040004080000002100009A +:10E1F0000021002100000000040000004000040095 +:10E20000C000000000000400040004000000004002 +:10E210001002C000004000000008000004210000BF :10E2200000000000000000000000000000000000EE -:10E2300000000000000000000000000000000000DE +:10E2300000008000200000000000024000080000F4 :10E2400000000000000000000000000000000000CE -:10E2500000000000050000000000000000000000B9 -:10E2600000000000000000000000000000000000AE +:10E2500000000000000000000000000000000000BE +:10E26000000000000082000000000000000000002C :10E27000000000000000000000000000000000009E -:10E28000000000000000000000000000000000008E -:10E29000000000000000000000000000000000007E +:10E28000000000000000000000008000000000000E +:10E2900000018001000000010000000000000000FB :10E2A000000000000000000000000000000000006E -:10E2B0000000000000000000000090000088000046 -:10E2C000010000000000000000000000000000004D +:10E2B000000001008800000000880020008800089D +:10E2C000000000000000000000000000000000004E :10E2D000000000000000000000000000000000003E -:10E2E000000000000000000000000000000000002E -:10E2F000000000000000000000000000000000001E -:10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD -:10E3200000000000000000000000000000000000ED -:10E33000000000000000000000001100800000004C -:10E34000000011002100000000000000000000009B +:10E2E0000003000000100088008800018200000088 +:10E2F0008200000101009000000100000000000009 +:10E300000000000001009000000088A002020090C0 +:10E310001008029089048240C0210000040000001F +:10E3200000010000000000000000000000000000EC +:10E330000000110002004100000000000000000089 +:10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD -:10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D -:10E3A000000000000000000000000000000000006D -:10E3B00000000000000000000000000000000080DD -:10E3C00000000080004109000009008000000000FA +:10E360000000000000000000000000000010000994 +:10E3700003098005000404020002000800000000F8 +:10E380000000000000000400000000000080000009 +:10E39000000080808341C0828082801000418040E4 +:10E3A0000005000300000000000000000000000065 +:10E3B000000000001000110010000800000000081C +:10E3C00000800000000000000000000000000000CD :10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000001D -:10E40000000000000000000000000000000000000C -:10E4100000000000000000000000000000000000FC -:10E4200000000000000000000000000000000000EC -:10E4300000000000000000000000000000000000DC -:10E440000020000000C00001010000000088000062 +:10E3E00000000000000000000000008080008000AD +:10E3F0000080800580000000000000000000000098 +:10E40000000000000000000000000000000080008C +:10E4100000118080808080808080808580080080DE +:10E4200000000010000300000000000000000000D9 +:10E4300000880000008800000000010000000000CB +:10E4400000010010000000000000000000000000BB :10E4500000000000000000000000000000000000BC -:10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C +:10E4600000000000000000000200888890A0C000AA +:10E47000020000021000C0000000000000000000C8 :10E48000000000000000000000000000000000008C -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C -:10E4C0000100008808000100000088000000010031 +:10E4900088001001028482900202880802A0C00154 +:10E4A000004000000000000000000000000000002C +:10E4B0000000000040000000000100000200000118 +:10E4C0000800000000001000000000000000000034 :10E4D000000000000000000000000000000000003C -:10E4E000000000000000000000000000000000002C -:10E4F000000000000000000000000000000000001C -:10E50000000000000000000000000000000000000B -:10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB -:10E540000000410000808000090000000000000081 -:10E55000410000000000000000000000000000007A -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C00000000000001100000080000000000011A9 -:10E5D000100000000000000000000000000000002B -:10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A -:10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000000000EA -:10E6300000000000000000000000000000000000DA -:10E640000000000000000001000000400000000089 -:10E6500000010100000000000000000000000000B8 +:10E4E000000000000000000000001000001000020A +:10E4F00010A000400110010001C000010100000057 +:10E500000001000000000000000000010000000009 +:10E510000001100800040088880220020105011192 +:10E5200082C10000000001000000000000000000A7 +:10E530000000020000008000000000080010000839 +:10E54000004100000000000000000000000000008A +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000080000080AB +:10E570000000808008002080080041800008100210 +:10E58000410200030000000000000000000800023B +:10E59000000200038080008000000000001120883D +:10E5A00004A080C10000020008000200000000007A +:10E5B0000000000000090010000000000000000042 +:10E5C00000000010800080008000000000000000BB +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000080119A +:10E5F0000080008080000000008300000000000513 +:10E600000005000000000000000000000000000005 +:10E610000005000000000011800080800000110053 +:10E620008590200083002100020005000800000002 +:10E6300000000000000000000000000000000008D2 +:10E64000000000080001C000A0000400000000005D +:10E6500000000000000000000000000000000000BA :10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000000000000009A +:10E6700010009008004008000000000400000000A6 :10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A -:10E6A000000000000000000000000000000000006A -:10E6B000000000000000000000000000000000005A -:10E6C00000000000000000000000000007008221A0 -:10E6D000000000E000008141000000000000000098 +:10E690000000000000000000080008901040020088 +:10E6A00000001004008808000100000001000100C3 +:10E6B0000000000000000000000000000600000054 +:10E6C0008400006000000000000000000600000060 +:10E6D000000000000000000000000000000000003A :10E6E000000000000000000000000000000000002A -:10E6F000000000000000000000000000000000001A -:10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000000F9 -:10E7200000000000000000000000000000000000E9 +:10E6F00000000000000000000000000000600600B4 +:10E70000000A0000000000000000000000000000FF +:10E7100000000000000000000000000000000600F3 +:10E720000000600000600000000600000000000023 :10E7300000000000000000000000000000000000D9 -:10E7400000000000000000000000000000000000C9 -:10E75000F0F00000000000000000000000000000D9 +:10E7400000000000000000000000FFF0666600000E +:10E7500000000000000000000000000000000000B9 :10E7600000000000000000000000000000000000A9 -:10E770000000000000000000000000000000000099 -:10E780000000000000000000000000000000000089 -:10E790000000000000000000000000000000000079 -:10E7A0000000000000000000000000000000000069 +:10E7700000000000E72424E70F000F0F0000000056 +:10E780003030F0F000000000000000000000000049 +:10E79000000000000000000000000000FBFF999D49 +:10E7A000FF00C3C37E427E4261619F900000000073 :10E7B0000000000000000000000000000000000059 -:10E7C0000000000000000000000000000000000049 -:10E7D0000000F0F000000000000000000000000059 +:10E7C000000000000000000000000000FF0000004A +:10E7D0000000000000000000000000000000000039 :10E7E0000000000000000000000000000000000029 -:10E7F0000000000000000000000000000000000019 -:10E800000000000000000000000000000000000008 +:10E7F000000000000000E72424E70F000F0F0000D6 +:10E8000000003030000000000000000000000000A8 :10E8100000000000000000000000000000000000F8 -:10E8200000000000000000000000000000000000E8 +:10E82000A6A699990F0F7E427E42F0F06F6F00000E :10E8300000000000000000000000000000000000D8 :10E8400000000000000000000000000000000000C8 :10E8500000000000000000000000000000000000B8 @@ -188089,286 +188089,286 @@ :10E8A0000000000000000000000000000000000068 :10E8B0000000000000000000000000000000000058 :10E8C0000000000000000000000000000000000048 -:10E8D0000F0F0000FFFF000000000000000000001C +:10E8D0000000000000000000000000000000000038 :10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000000000000000000000000000000007 +:10E8F00000000000000000000000BC0CBC0C080080 +:10E90000FF0000000000003C006600000000000066 :10E9100000000000000000000000000000000000F7 -:10E9200000000000000000000000000000000000E7 -:10E9300000000000000000000000000000000000D7 -:10E9400000000000000000000000000000000000C7 -:10E9500000000F0F00000000000000000000000099 +:10E9200000000000000000000000303C303C3C8152 +:10E93000E7BD000000000000000000000000000033 +:10E940000000000000000000000000000000FFFFC9 +:10E95000FFFF0000000100000000000000000000B8 :10E9600000000000000000000000000000000000A7 :10E970000000000000000000000000000000000097 -:10E980000000000000000000000000000000000087 +:10E98000400000FF00000000003C006600000000A6 :10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000000000000000067 -:10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000000000000000047 -:10E9D0000000000005002A00054000A800400006D5 -:10E9E000000C00000000000000000000000000001B +:10E9A00000000000000406040404000670FF303C70 +:10E9B0003CC1E7BD000000000000000000000000B6 +:10E9C0000000000005000A08050000A00061000723 +:10E9D000C00C00001000000000000000000000005B +:10E9E0000000000000000000000000000000000027 :10E9F0000000000000000000000000000000000017 -:10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 -:10EA200000000000000000000000000000000000E6 -:10EA300000000000000000000000000000000000D6 +:10EA000030000000000505610A0F004D000800619C +:10EA10000006000D00000000000000000000006182 +:10EA20000006000D00000000000000100000006162 +:10EA30003006C09C000500610006000D00000000CB :10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000000000B6 -:10EA60000F0FFFFF0000000000000000000000008A +:10EA50000000CC00EE0000000000000000000000FC +:10EA600000000000000000000000000000000000A6 :10EA70000000000000000000000000000000000096 :10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000000076 -:10EAA0000000000000000000000000000000000066 -:10EAB0000000000000000000000000000000000056 +:10EA900000000000AF30AF3F0000000000000000A9 +:10EAA00000000000AF30AF3F000000000000000099 +:10EAB00000550055F0F000415500550000000000E1 :10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE00000000F0F00000000000000000000000008 +:10EAD00000000000CC004400000000000000000026 +:10EAE0000000000000000000000000000000000026 :10EAF0000000000000000000000000000000000016 :10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 -:10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000000000D5 +:10EB1000000000000000A030A03F00000000000046 +:10EB2000000000000000A030A03F00000000000036 +:10EB3000000082D780D5AAAA004155007F0F0000AF :10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 -:10EB6000000000000000F0F00000000000000000C5 +:10EB50000000000000000002008200000000000031 +:10EB600000000000000000000000000000000000A5 :10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000075 +:10EB8000000000000000000000000000FF5C0F5CBF +:10EB9000000000005CFF5C0F0000000000000000AF :10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 +:10EBB000000000005CFF5CF000000000FFFA5D5AFE :10EBC0000000000000000000000000000000000045 :10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000F0F000000000000045 +:10EBE0000000000000000000000000000000000025 :10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 +:10EC00000000000000000000000000000000F05CB8 +:10EC1000005C000000005CF05C00000000000000F0 :10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000000000000000D4 -:10EC400000000000000000000000000000000000C4 -:10EC500000000000000000000000000000000000B4 -:10EC60000000000000000000000000000000008024 -:10EC70000000000000000000000000000000000094 -:10EC8000000000040000000100000000000400007B -:10EC90000000000000000000000000040000000070 -:10ECA0000000000000040004000400000004000054 -:10ECB0000000000000000003000000000000000051 +:10EC30000000000000005C0F5C0000000000FFFA14 +:10EC40005F5A000000000000000000040000000007 +:10EC50000000000400000080000000800080000030 +:10EC60000000000400000000000000001000000090 +:10EC70000000000004000400040200000000000086 +:10EC80000000000000000000000004000000000080 +:10EC90004000000000000004000000000000000030 +:10ECA0000020002000000000000000000000000024 +:10ECB0000000A0000000000000000000C000402094 :10ECC0000000000000000000000000000000000044 -:10ECD00000000000000000000082000000000000B2 +:10ECD00000000000000000000020000000200020D4 :10ECE0000000000000000000000000000000000024 -:10ECF00000400000000000000000000000000000D4 -:10ED00000000000000000000000000900000000073 -:10ED10000000009000900090009000900090400053 -:10ED2000000000000040000000000002000200009F +:10ECF00000000090008200020090009000000002DE +:10ED0000009000040000000200000000000000006D +:10ED10000000800000000000000000900000009053 +:10ED2000008200010003000000000000000000005D :10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED6000000000000000020002000000000000009F -:10ED70000000000000000000000000000000000093 -:10ED8000000002000200000000000000000000007F -:10ED90000000000000000000000000000000000073 -:10EDA000000000000200020000040000000000005B -:10EDB0000000000000000000000002000000000051 -:10EDC000000000000000000000000800000000003B -:10EDD000000000000000000000000000000000082B -:10EDE000000000000000000000080000000000001B -:10EDF000000000000000000000000000000000080B -:10EE000000000000000000000004000000000000FE -:10EE100000000000000000000000000000000000F2 -:10EE200000040000000000000000000000000000DE +:10ED400000010000000000000000000000000000C2 +:10ED50000008000000000000020020002000200445 +:10ED60002000040005000004020002000200000070 +:10ED7000080004000200000002020200004000003F +:10ED8000000002000200020000000000020000007B +:10ED900002000000050000801000000000000000DC +:10EDA000000004000400040004000000040000004F +:10EDB000000000000400000000000400000000004B +:10EDC0000000040004000000040004000000000033 +:10EDD00000040000000000000000008880008000A7 +:10EDE0008300800000000200000000080000000016 +:10EDF00002000004000004000008000000000008F9 +:10EE00000000000804000400040004020000008464 +:10EE100000820000000040000004840400040000A0 +:10EE200000080008000800000000000000000000CA :10EE300000000000000000000000000000000000D2 -:10EE400000000000000000000000000000000000C2 -:10EE5000000000000000000000000400400040002E -:10EE6000000000000000000000000000880000001A -:10EE70000000000000000000000000000100000091 +:10EE400000080004000400020000000000000000B0 +:10EE500000000000000000000000000000000000B2 +:10EE6000040000000000000000000000000000009E +:10EE7000040000000000000000000000000000008E :10EE80000000000000000000000000000000000082 -:10EE90000000000000000000000000000000000072 -:10EEA0000000000000000000000000000000000062 -:10EEB0000000400000000000000000000000000012 -:10EEC0000000000000000000000000000000000042 +:10EE900000000000000000000080000000000000F2 +:10EEA000000300000400040002210000040004002C +:10EEB00000800000040004000009040004000400B5 +:10EEC00000000400000000000080040000000000BA :10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 -:10EEF000000000000000000000000000000004000E +:10EEE00000009104000000880088008200000000FB +:10EEF000000004080000008800000000000000007E :10EF00000000000000000000000000000000000001 -:10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000000000000000000E1 -:10EF300000000000000000000000000000000000D1 -:10EF400000000000000000000000000000000000C1 -:10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 -:10EF70000000000000000000000000000000000091 -:10EF80000000000000000000000000000000000081 +:10EF100000000000000000000000000209000000E6 +:10EF20000000000000008000800000000000800061 +:10EF30008000002000008000800008008000800029 +:10EF4000890000A0000000000000002080C0000038 +:10EF500000000000000000000008000000000000A9 +:10EF600000410040000000400000000000000000E0 +:10EF7000008200000000000000000000000000000F +:10EF8000000000030000000000000000000000007E :10EF90000000000000000000000000000000000071 -:10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC0000000000000000000000000000000000041 +:10EFA000C000000000400000C000000000000000A1 +:10EFB000820000000000000082000000000000004D +:10EFC000820000000000000082000000000000003D :10EFD0000000000000000000000000000000000031 -:10EFE0000000000000000000000000000000000021 -:10EFF0000000001000000000000000000000000001 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 +:10EFE00000080000000000000000004000000000D9 +:10EFF00000000010000000000000000000000008F9 +:10F0000000000008000000000000000000000000F8 +:10F0100000000200000000000000000000000000EE :10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000000000000000D0 +:10F0300000000000000000000000000000100000C0 :10F0400000000000000000000000000000000000C0 -:10F0500000000000000000000000000000000000B0 +:10F0500000000000000000000000000000000200AE :10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000002000000000000000000000000060 -:10F090000000000000000000000000000000000070 -:10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000000050 -:10F0C0000000000000000000000000000000000040 -:10F0D0000000000000000000000000000000000030 -:10F0E000000004000000000000000000000000001C -:10F0F0000000000000000004000000000484000084 -:10F1000000000000000100000000000000000000FE -:10F1100000000000000000000000000000000000EF -:10F1200000000000000000000000000000000000DF -:10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF -:10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F180000000000000000002000000000000000974 +:10F070000020000000110008001100000000000046 +:10F080000000000000030000000000080000000075 +:10F090000000000000200000000000000000080048 +:10F0A000008090800100A0800080008300000000AC +:10F0B0000008000000000040000000800000000088 +:10F0C00001000000000000000080008085000000BA +:10F0D00000000000A080010000000000000000000F +:10F0E0000000008400000084000011080000008877 +:10F0F00000000002000011040000000000000000F9 +:10F1000000200000000000000000000000000000DF +:10F1100000000000000000000000004002020000AB +:10F120000090002000200400082008200820000093 +:10F130000000400000000000000000000820000067 +:10F140000000048440C0000000C00020002004082B +:10F15000100800C00000002004840000000000002F +:10F160000000000000000000000000000008200077 +:10F17000000800050000000001110003000000006D +:10F18000002000000000000000000000000000005F :10F19000000000000000000000000000000000006F -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F2000000000500000000000000000000000000F9 +:10F1A0000000080000000000000000000000000057 +:10F1B000000000000100000000000000000000004E +:10F1C000000000000100000000000000002100001D +:10F1D00084000000000000000000000000000000AB +:10F1E00000000000000000000000000000000040DF +:10F1F00000000000000000000000080800000000FF +:10F2000000000000000000000000000800000000F6 :10F2100000000000000000000000000000000000EE :10F2200000000000000000000000000000000000DE -:10F2300000000000000000000000000000000000CE -:10F2400000000000000000000000000000000000BE +:10F2300000000000000004000000000000000000CA +:10F2400000000000000004000000000000000000BA :10F2500000000000000000000000000000000000AE :10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F280000000000000000000900000880000000066 -:10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000000005E -:10F2B000000000000000000000000000000000004E -:10F2C000000000000000000000000000000000003E -:10F2D000000000000000000000000000000000002E +:10F270000000010000000400010004001000000074 +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000036B +:10F2A000000000000000000000C10090000000000D +:10F2B00000C000900000000000C0009000000000AE +:10F2C00000C000900000000000C00090000000009E +:10F2D00000C000900000000000C00090000000008E :10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E -:10F30000000000000000000011008000000000006C +:10F2F000000000000800000000000800800000007E +:10F3000000000000000000000000000000000000FD :10F3100000000000000000000000000000000000ED -:10F3200000000000000000000000000000000000DD -:10F3300000000000000000000000000000000000CD -:10F3400000000000000000000000000000000000BD -:10F3500000000000000000000000000000000000AD +:10F320000000000000000000000000C100A000205C +:10F3300000200080008000000000008000800000AD +:10F3400000000080008000000000008000800000BD +:10F3500000000080008000000000008000800000AD :10F36000000000000000000000000000000000009D -:10F37000000000000000000000000000000000008D -:10F3800000000000000000000000000000800000FD -:10F3900000800000000000000000000000000000ED +:10F370000000000800800004008080000000800081 +:10F38000808000000000000000000000000000007D +:10F39000000000000000000000000000000000006D :10F3A000000000000000000000000000000000005D -:10F3B000000000000000000000000000000000004D -:10F3C000000000000000000000000000000000003D -:10F3D000000000000000000000000000000000002D -:10F3E000000000000000000000000000000000001D -:10F3F000000000000000000000000000000000000D -:10F4000000000000000000000000000000000020DC -:10F41000000000C00000000000000000000000002C -:10F4200000000000000000000000000000000000DC -:10F4300000000000000000000000000000000000CC -:10F4400000000000000000000000000000000000BC -:10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000000000000000008C -:10F48000000000000000000000000000000001007B -:10F4900000880800010000000000000000000000DB +:10F3B000800080910000000080008080000000003C +:10F3C000800080800000000080008080000000003D +:10F3D000800080800000000080008080000000002D +:10F3E000800080800000000000000000000000009D +:10F3F0000000000000000010000100028800C000B2 +:10F40000840008A0000000000000000000000000D0 +:10F4100000000000000000000000000000000000EC +:10F42000000000000000000000000000000000C01C +:10F4300000008400C090000000008400C090000024 +:10F4400000008400C090000000008400C090000014 +:10F4500000008400C090000000008400C090000004 +:10F4600000008400C09000000000000000000000C8 +:10F470000000000000000000C0001000000000902C +:10F4800000A00010012000000000000000000000AB +:10F49000000000000000000000000000000000006C :10F4A000000000000000000000000000000000005C -:10F4B000000000000000000000000000000000004C -:10F4C000000000000000000000000000000000003C -:10F4D000000000000000000000000000000000002C -:10F4E000000000000000000000000000000000001C -:10F4F000000000000000000000000000000000000C -:10F5000000000000000000000000000000000000FB -:10F5100041000080800009000000000000000000A1 +:10F4B00000000100019001C000000000009000C0A9 +:10F4C00000000000009000C000000000009000C09C +:10F4D00000000000009000C000000000209000C06C +:10F4E00000000000009000C00000000000000000CC +:10F4F00000000000000000000900800080000900FA +:10F500000010002000840210000000000000000035 +:10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB -:10F5300000000000000000000000000000000000CB -:10F5400000000000000000000000000000000000BB -:10F5500000000000000000000000000000000000AB -:10F56000000000000000000000000000000000009B -:10F57000000000000000000000000000000000008B -:10F58000000000000000000000000000000000007B -:10F5900000000011000000800000000000000000DA +:10F530000000000010000580108000000000008026 +:10F5400000800000000000800080000000000080BB +:10F5500000800000000000800080000000000080AB +:10F56000008000000000008000800000000000001B +:10F570000000000000000000000000000008000083 +:10F5800000000000000000800000000000000000FB +:10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B -:10F5B000000000000000000000000000000000004B -:10F5C000000000000000000000000000000000003B -:10F5D000000000000000000000000000000000002B -:10F5E000000000000000000000000000000000001B +:10F5B00000000000A1021103040003008011800379 +:10F5C0000000000080020040000000008011804028 +:10F5D0000000000080080040000000008011804012 +:10F5E00000000000801180400000000000000000CA :10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA -:10F6100000000000000100000040000000000000A9 +:10F600000000000000000000008400000000000076 +:10F6100000000000000000000000000000000000EA :10F6200000000000000000000000000000000000DA -:10F6300000000000000000000000000000000000CA -:10F6400000000000000000000000000000000000BA -:10F6500000000000000000000000000000000000AA -:10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A -:10F6900000000000000000000000070082210000C0 +:10F630000000000000009100010000000000C00177 +:10F64000200000000000C000000000009000C00189 +:10F65000200000000000C001000000009000C00178 +:10F66000200000000000C001200000000000000099 +:10F670000000000000000000000000000000410049 +:10F6800000600600500000000000000000000000C4 +:10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A -:10F6B000000000000000000000000000000000004A -:10F6C000000000000000000000000000000000003A -:10F6D000000000000000000000000000000000002A -:10F6E000000000000000000000000000000000001A +:10F6B00000000000000000008181006006000000E2 +:10F6C000008200000600000000810000060000002B +:10F6D000008200000600000000810000060000001B +:10F6E00000210000060000000006000006000000E7 :10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 -:10F71000000000000000000000000000F0F0000009 +:10F700000000000000000000000000000000812454 +:10F7100000000000000000000000000000000000E9 :10F7200000000000000000000000000000000000D9 -:10F7300000000000000000000000000000000000C9 -:10F7400000000000000000000000000000000000B9 -:10F7500000000000000000000000000000000000A9 -:10F760000000000000000000000000000000000099 -:10F770000000000000000000000000000000000089 -:10F780000000000000000000000000000000000079 -:10F790000000000000000000000000000000F0F089 +:10F73000000000000000000000000000FFFF0000CB +:10F7400000FF000000FF000000FF00003C3C000044 +:10F7500000FF000000FF000000FF00003C3C000034 +:10F7600000FF000000FF000000FF000000FF00009D +:10F7700000FF00000000000000000000000000008A +:10F7800000000000000000000000000000008124D4 +:10F790000000000000000000000000000000000069 :10F7A0000000000000000000000000000000000059 -:10F7B0000000000000000000000000000000000049 -:10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 -:10F7E0000000000000000000000000000000000019 -:10F7F0000000000000000000000000000000000009 +:10F7B0000000000000000000000000000000FFFF4B +:10F7C000000000FF000000FF000000FF00003C3CC4 +:10F7D000000000FF000000FF000000FF00003C3CB4 +:10F7E000000000FF000000FF000000FF000000FF1D +:10F7F000000000FF0000000000000000000000000A :10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000F0FCA -:10F820000000FFFF000000000000000000000000DA -:10F8300000000000000000000000000000000000C8 -:10F8400000000000000000000000000000000000B8 -:10F8500000000000000000000000000000000000A8 -:10F860000000000000000000000000000000000098 -:10F870000000000000000000000000000000000088 +:10F81000F3FFFFFF000000000000000000000000F8 +:10F8200000000000000000000000000000000000D8 +:10F830000000000000000000000000000000FF00C9 +:10F840000000FF000000FF000000FF000000FF00BC +:10F850000000FF000000FF000000FF000000FF00AC +:10F860000000FF000000FF000000FF000000FF009C +:10F870000000FF0000000000000000000000000089 :10F880000000000000000000000000000000000078 -:10F890000000000000000000000000000000000068 -:10F8A0000F0F00000000000000000000000000003A +:10F890000000CFFFFFFF000000000000000000009C +:10F8A0000000000000000000000000000000000058 :10F8B0000000000000000000000000000000000048 -:10F8C0000000000000000000000000000000000038 -:10F8D0000000000000000000000000000000000028 -:10F8E0000000000000000000000000000000000018 -:10F8F0000000000000000000000000000000000008 -:10F9000000000000000000000000000000000000F7 -:10F9100000000000000000000000000000000000E7 -:10F9200005002A00054000A80000000000000000BB +:10F8C000FF000000FF000000FF000000FF0000003C +:10F8D000FF000000FF000000FF000000FF0000002C +:10F8E000FF000000FF000000FF000000FF0000001C +:10F8F000FF000000FF00000000000000000000000A +:10F90000000000000000000005610A0FC50D00A006 +:10F9100000610006001D0001000000000000000062 +:10F9200000000000000000000000000000000000D7 :10F9300000000000000000000000000000000000C7 -:10F9400000000000000000000000000000000000B7 -:10F9500000000000000000000000000000000000A7 -:10F960000000000000000000000000000000000097 -:10F970000000000000000000000000000000000087 +:10F9400000000363033CCC0D92C0038203380C001B +:10F9500092C0038203380C0092C0038203380C006B +:10F9600092C0038203380C0092C0038203380C005B +:10F9700092C0038203380C0092C000000000000017 :10F980000000000000000000000000000000000077 -:10F990000000000000000000000000000000000067 +:10F99000000000000000040810200000000000002B :10F9A0000000000000000000000000000000000057 :10F9B0000000000000000000000000000000000047 -:10F9C0000000000000000000000000000000000037 +:10F9C000000000008080EB800000000000000000CC :10F9D0000000000000000000000000000000000027 :10F9E0000000000000000000000000000000000017 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 +:10FA10000000000000000000010240800000000023 :10FA200000000000000000000000000000000000D6 :10FA300000000000000000000000000000000000C6 -:10FA400000000000000000000000000000000000B6 +:10FA40000000000000000000EB00000000000000CB :10FA500000000000000000000000000000000000A6 :10FA60000000000000000000000000000000000096 :10FA70000000000000000000000000000000000086 @@ -188376,7 +188376,7 @@ :10FA90000000000000000000000000000000000066 :10FAA0000000000000000000000000000000000056 :10FAB0000000000000000000000000000000000046 -:10FAC0000000000000000000000000000000000036 +:10FAC00000000000000000000040000000000000F6 :10FAD0000000000000000000000000000000000026 :10FAE0000000000000000000000000000000000016 :10FAF0000000000000000000000000000000000006 @@ -188384,193 +188384,193 @@ :10FB100000000000000000000000000000000000E5 :10FB200000000000000000000000000000000000D5 :10FB300000000000000000000000000000000000C5 -:10FB400000000000000000000000000000000000B5 +:10FB40000000000000000000000001004004000070 :10FB500000000000000000000000000000000000A5 :10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 -:10FB900000000000000000000000008000000000E5 -:10FBA0000000000000000000000000000000000055 -:10FBB0000000000000000000000000000000000045 -:10FBC0000000000100000000000000000000000034 -:10FBD0000000000000000000000000000000000025 -:10FBE0000000000000000000000000000000000015 -:10FBF00000000000000000000000004100000000C4 -:10FC00000000000000000000000000000000008272 -:10FC100000000000000000000000000000400000A4 -:10FC200000000000000000000000000010000000C4 -:10FC300000000008000000000000000000000000BC -:10FC40000000000000004082000000000000008270 -:10FC50000000008200000082000000C0000000C020 -:10FC60000000000000000000008200000000008290 -:10FC70000082000000000000000000000000000002 +:10FB900000000000040000000080000000000000E1 +:10FBA00000000000000000008800000002000000CB +:10FBB0000000000000000004000000000000000041 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000500000000000020 +:10FBE0000000100400000000000500080000820072 +:10FBF0000000820000000000000000000000000083 +:10FC00004000200000000000000000000000000094 +:10FC100000000000008480000004002000000000BC +:10FC20000000000000000000000000000082000052 +:10FC300000000002000000000000000200000000C0 +:10FC40000000000200000000000000000000008230 +:10FC50000000000000820000008200080000000098 +:10FC60000000000000080084000000000000000008 +:10FC70000000000000000000000000000000000084 :10FC80000000000000000000000000000000000074 -:10FC900000000000000000000000000090000000D4 -:10FCA0000000000000000000000000000003000051 -:10FCB0000000000000000000000002000000000042 -:10FCC000000000000000000000080000000000002C +:10FC900000000000900000000000000000000000D4 +:10FCA0000000000000000800000002030000000047 +:10FCB0000400000000000000000000000000000040 +:10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 -:10FCE0000000000000000000000000000000000014 -:10FCF0000000000000000000000000000000000004 -:10FD0000000000000000000000000004000000905F -:10FD100000080008000000080000000000000008C3 -:10FD20000084000000000000000000080000000047 -:10FD300000080008000000080000000000000008A3 -:10FD400000000000000000000000000000080000AB -:10FD5000000000080008000000040000000000008F -:10FD600000100000000000000000000800820000F9 -:10FD7000000000820082000000000000000000007F -:10FD8000000000000000000000000000000800006B -:10FD90000002000000000000000000000000000061 -:10FDA00000000080000000000100000000000000D2 -:10FDB0000000000200000000000000000000000041 -:10FDC00000000000000000000040000000000000F3 -:10FDD00000000000880000009000900000008800F3 -:10FDE0008800880000000000000000000000000003 -:10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000000000000000F2 -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000800000000040000000000C6 -:10FE300000000000000000000000000000000000C2 -:10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 -:10FE800000000000008200000000000000000000F0 +:10FCE00004000400040004000400000000000008F8 +:10FCF0008200000000000000000000000000020080 +:10FD000004000400000002000000000400080000DD +:10FD100000000000000000000000000000080008D3 +:10FD200000000000000000848000000080100088B7 +:10FD300000000000000000000000000000020002BF +:10FD400000000000000000020000000800000000A9 +:10FD50000500000810000000000000080008000076 +:10FD60000000000000020000000000080008000081 +:10FD7000000000C000100000000000040004008229 +:10FD80000000000000000004000800000000000067 +:10FD9000000000000000000000000000050000005E +:10FDA00005000000A00000002008008800900084EA +:10FDB00000C18805004090030020002100210000C0 +:10FDC0000004000000080000000000000008000817 +:10FDD000000000000000080000000000000090008B +:10FDE0000000000000000000000000000000000013 +:10FDF0000003000000004000400000000008000078 +:10FE000000080000000000000000000000000000EA +:10FE1000000000000000000000000000000084005E +:10FE2000000084000000000000000000002000111D +:10FE30000020002000000000000000000000000082 +:10FE40000020000000000000000000000000000092 +:10FE5000030041000800000000080000000000004E +:10FE60000000000000000000000000000082000010 +:10FE70000000000000000000000040000000000042 +:10FE80000000000000000000000000000000000072 :10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000001800180000050 -:10FEB0000000000000000000000000000000000042 -:10FEC0000000000000000000000000000000000032 +:10FEA00000200011042000000005000000400000B8 +:10FEB0000010000000000000000000000000000032 +:10FEC000080000000000000000000000000000002A :10FED0000000000000000000000000000000000022 -:10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 +:10FEE00000000000000000000000000000000041D1 +:10FEF00000000000000000000000000400000004FA :10FF000000000000000000000000000000000000F1 -:10FF100000000000000000000000000000000000E1 -:10FF2000000000000000000000A0000020200204EB -:10FF300000000000000000001000000000000000B1 +:10FF10000000000000C0000000000000000000A081 +:10FF2000000000010008800900900000008800A186 +:10FF300000000001000004000900000000000000B3 :10FF400000000000000000000000000000000000B1 :10FF500000000000000000000000000000000000A1 -:10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000008205000082000068 -:10FF90000000000000000000000000000000000061 -:10FFA0000000000000009000900000000000000031 -:10FFB0001000000000000000000000000000000031 -:10FFC0000000000000000000000000000000000031 -:10FFD0000000000000000000000000000000000021 +:10FF60000000000000000000000000000000000889 +:10FF7000000000A0000000A0000000000010000031 +:10FF8000000800000000000000A0000000000000C9 +:10FF90000000000000000000000800000000000059 +:10FFA00000000000040000020000C0000005000284 +:10FFB000000400080104000000000000002100000F +:10FFC0000000000000080020000000000000000009 +:10FFD00040000000000000000000000000000000E1 :10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 +:10FFF00000000003000000000008000000000004F2 :02000004002ECC :1000000000000000000000000000000000000000F0 -:1000100000020000000000000000000000000000DE -:1000200000000000000000000000000000000000D0 -:100030004000800000000000000000000000000000 -:10004000000000A000000000000000000000000010 -:1000500000000000000000000000000000000000A0 -:100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:10009000000000000000000000000100000000005F -:1000A0000000000000000000000000000000000050 -:1000B0000100000000000000000001090000000035 -:1000C0000000000000000000000000000000000030 +:1000100000000000000000000000000000000000E0 +:100020000000000000828084001100C0000000A0D9 +:100030000082209000880200000002000000000002 +:1000400000000000000000000000000000000000B0 +:10005000000000000000000000000000000004009C +:100060000008100002000000000000A000000000D6 +:1000700000000000000000000000008221000000DD +:10008000000410000000000000000000210000003B +:100090000000000000000000000000000000000060 +:1000A000000000000000000004000000000000004C +:1000B000002100000010004000C100030000000803 +:1000C0000000000000000008000000000000000028 :1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 -:1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000008000000D7 -:1001200000000000000000000000000000000000CF -:100130000000200000000000000000000800000097 -:1001400000000000000005000000000000000000AA +:1000E00000000000000000000000004000080000C8 +:1000F0000000000000009008000000000000000068 +:10010000000000000000900000000000000000005F +:1001100000000000000000080000000000000000D7 +:10012000000000000000000000008000000000A0AF +:1001300000000000000000090001001000000000A5 +:10014000000000000000008200000000000000002D :10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000001009090000000000000000000001E -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F +:1001600000000000008400840000008200400008BD +:1001700000840000000000000000000000000000FB +:10018000000000000004000000000008000000085B +:1001900000840000000000000000000000000000DB +:1001A0000000000000000000000088100210008223 +:1001B00010900002000200A0101040080003000090 +:1001C00040000000000000000000000000000000EF +:1001D000000000000000000000000001000000001E :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF :1002000000000000000000000000000000000000EE :1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:10023000000000001100A10000000000000000000C -:1002400000000000000000000000000000000000AE +:10022000000000000000000000000000008000004E +:1002300000808080008000000080800088820008AC +:10024000004100400000000000000000000000002D :10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B00000000000000000080980000300000000AA -:1002C000000000000000000000000000000000002E +:1002A00000000000000000000000000000009000BE +:1002B0008880100091808000800080000000000095 +:1002C000001000848000000000000000000000001A :1002D000000000000000000000000000000000001E :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD :1003200000000000000000000000000000000000CD -:100330000000000000000000000101020000008831 -:1003400000000000000000000000000000000000AD +:10033000880083082088089008000400A0001000AE +:10034000900000000088C0000000000000000000D5 :10035000000000000000000000000000000000009D :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D :10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D -:1003B0000000000000000000000001008888080024 -:1003C000000000000200000000000000000000002B +:1003B00000001010001000821002C00200100002A5 +:1003C0008200001001A0001001C000000000000029 :1003D000000000000000000000000000000000001D :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC :1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC -:1004300000000000000000000000000041000080FB -:10044000800041000000800000000000000000006B +:10043000000000008080000000808080800000803C +:10044000000088000000038003801080000000008E :10045000000000000000000000000000000000009C :10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C -:1004B000000000000000000000000000000000112B -:1004C000000020800000000000000000000000008C +:1004B0000000000000000000000900000003000030 +:1004C0000009008000008021808080800000000002 :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB :1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB -:10054000000100000040000000000000000000006A +:1005300000000000000000000002020200020000B3 +:100540000000000200840000C001A0A040020200E0 :10055000000000000000000000000000000000009B :10056000000000000000000000000000000000008B :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B :1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C0000000000000E007008200000000000000C2 +:1005B0000000000000000000000000000000060035 +:1005C00000000000000000004200000000000600E3 :1005D000000000000000000000000000000000001B :1005E000000000000000000000000000000000000B :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:1006400000000000000000000000F0F000000000CA -:10065000000000000000000000000000000000009A +:1006300000000000000000000000000066FF66FFF0 +:100640000001C00000000000FCF0FCF0FFFFC666E7 +:10065000FFFF003C00000000000000000000000060 :10066000000000000000000000000000000000008A :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000F0F000004A -:1006D000000000000000000000000000000000001A +:1006B000000000000000000000000000000066FFD5 +:1006C00066FF00010000000000000000000000FFC5 +:1006D00066660F0F427E0000000000000000000070 :1006E000000000000000000000000000000000000A :1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 @@ -188585,24 +188585,24 @@ :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 :1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000FF0000FFFF2C -:1007D0000000000000000000000000000000000019 +:1007C0000000FCFCFFFFBDBFFFFFCFCFDFFF040435 +:1007D000FC0C00FF0000BDBDFFFF0000000000009A :1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000FF0000A9 -:100850000000000000000000000000000000000098 +:1008400000000000F8FCFBFFBFBFFFFFCFCF990007 +:100850000000000000FF0000BDBD999900000000ED :100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 -:1008C00000000000000000000000000000000540E3 -:1008D0002A06054C00A800000000000000000000EF +:1008C00000000000000000610E06001D0000000096 +:1008D00040000000000010610006009D00080000BC :1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 @@ -188610,7 +188610,7 @@ :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 -:1009500000000F0FFFFF000000000000000000007B +:100950000000000000000000000000000000000097 :100960000000000000000000000000000000000087 :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 @@ -188618,7 +188618,7 @@ :1009A0000000000000000000000000000000000047 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 -:1009D000000000000F0F00000000000000000000F9 +:1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 :1009F00000000000000000000000000000000000F7 :100A000000000000000000000000000000000000E6 @@ -188626,7 +188626,7 @@ :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 :100A400000000000000000000000000000000000A6 -:100A50000000000000000000F0F0000000000000B6 +:100A5000AABEAAFF0000000000000000B0003000A5 :100A60000000000000000000000000000000000086 :100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 @@ -188634,184 +188634,184 @@ :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 :100AC0000000000000000000000000000000000026 -:100AD00000000000000000000000F0F00000000036 -:100AE0000000000000000000000000000000000006 +:100AD0000000AABCAAFD00000000000000000332D4 +:100AE00000300000000000000000000000000000D6 :100AF00000000000000000000000000000000000F6 :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 :100B300000000000000000000000000000000000B5 -:100B40000000000000000000400000000000000065 -:100B50000000000000000000000000000000000095 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B8000000200000000000000000000000000085B -:100B9000000000000000000800000000000000004D -:100BA000000000000005000000000000000000112F -:100BB0000005000500000005000000000000000026 -:100BC000C00000080008000000000000000800004D -:100BD000000000000000000000020008000000000B -:100BE00000000000000000000008000000000000FD -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000001090000000820000C2 -:100C1000108400820082000000000000000000023A -:100C2000000200000084000200000000000000023A -:100C300000840000000000880000000000020002A4 -:100C400000000000000000000000000000000000A4 -:100C5000000000000000000500000000101011005E -:100C6000200208200000000000000000000000003A -:100C70000200000000000000000000000808104012 -:100C800040040820000000000000000000000000F8 -:100C90000000000000000000000000000000101034 -:100CA00002082002082000000000000000000000F0 -:100CB0000000000002000000000000000000000032 -:100CC000000000002000000800080008008200006A -:100CD0000008000800080008000800000000800963 -:100CE00082088009800100080008009000080000C8 -:100CF00000080008000800080008000000008083C9 -:100D00008009800980010000000800080000000838 -:100D100000000008001000080084008400000000AB -:100D2000800180858085800100820082000000842F -:100D3000000000840082008400840000000800009D -:100D400000000000000080020021000900210000D6 -:100D50000021000200000421040200000021000024 -:100D6000002100210000002104210020002000219A -:100D70000009000400020011000900000000000446 -:100D80000000000000200020000000009000000093 -:100D9000000000009003900084009000C0008800D4 -:100DA0000000000000000011000000210409000004 -:100DB0000000000000110003000000050005000015 -:100DC0000011000000110021000300A0000000003D -:100DD0000008000000000000008400000020000067 -:100DE0000200000000000000000000000000000001 -:100DF000040000000000000000A00002000000004D +:100B4000000000000004000000000000000200029D +:100B5000000000000002000200000000000200008F +:100B6000000000000008000000000000000200007B +:100B70000000000000000004000000000000000071 +:100B80000002000000000000000000000002000061 +:100B9000000000030000000000000000000000084A +:100BA000100200000000000000090000000000002A +:100BB00088020000000000000000000000000000AB +:100BC0001000000000020000000000000000000013 +:100BD000000000000000000000840000000000840D +:100BE000000000000000008400000000008200847B +:100BF00000900082000000000004000000000000DF +:100C0000000000000000000200000084000000005E +:100C100000840000008400020000000800000002C0 +:100C2000000080820000000200004100000000007F +:100C300000000000000000020000000000020002AE +:100C40000000800000000000000000000000000024 +:100C50000200020082000000820002000900110070 +:100C60002002082000000000020000000000000038 +:100C70000200020000000040040000000208020818 +:100C8000200204100000000000000000000004002A +:100C90000400040002000000000000000200000048 +:100CA000000004000200000000000000020000003C +:100CB00000000000000000000040000002000000F2 +:100CC000000010000200000200840008000000087C +:100CD000000800100008000000080008000890004C +:100CE0008208820980010000000200020002000464 +:100CF00004020000000200000002000200020001E5 +:100D00000403800380010000020000000084000052 +:100D100002000200000404000300000400020000BE +:100D200000000004000200000004000000000000B9 +:100D3000020000820000000000080008000800080F +:100D4000000000000802000000210003000000086D +:100D5000000000090000000088210021900000210F +:100D6000000000000000004040210040002100057C +:100D700000000000900500000003880090090000BA +:100D8000000988400008000000000000000000008A +:100D90000000000000000020000000009000004063 +:100DA0009021902100210021000000050002000098 +:100DB00000030021042100210000000000000000C9 +:100DC00000210021002100100000000000000000B0 +:100DD00000A0000000000200000000000000000071 +:100DE000004000040090000000000000000000909F +:100DF000000000A0000000A0000000820000000031 :100E000000000000000000000000000000000000E2 -:100E1000000000000090000000002000008211008F -:100E200000820000008200000000000000000000BE -:100E30000000000000000088000000000988009009 -:100E400000000000000000000000000000000000A2 +:100E100000000000000000000000000000080000CA +:100E200000000082000000820000000000000000BE +:100E300000000000000000000000000000000000B2 +:100E4000000000000000000000080000000000009A :100E50000000000000000000000000000000000092 -:100E60000000000000000000002000000000000062 -:100E70000000000000000000000000000000000072 -:100E800000000000000000000080000000000000E2 +:100E60000041000088000000002000000000000099 +:100E70000020004000000000000000000000000012 +:100E80000000000000100040008000000000000092 :100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000200000000022 +:100EA0000000880088000000000000002000000012 :100EB0000000000000000000000000000000000032 -:100EC0000000000000000000C0000000000800005A -:100ED000000000080000000000A00000000000006A -:100EE0000000000000000000000000010000000001 -:100EF0000000000000000000000000A00000000052 -:100F0000000000000000000000A000200000000021 +:100EC0000000000000000000000000000000000022 +:100ED000000800000000000000000000000000000A +:100EE000000000840000000000000001000000007D +:100EF00000000900000000000000000800000000E1 +:100F000000000000000000010009002000000000B7 :100F100000000000000000000000000000000000D1 -:100F200000080000000000000000000000010008B0 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000001A0 -:100F500000040003900000000020000020000000BA -:100F6000000000210000000000000400002100003B -:100F700040200000042000000000040000004000A9 -:100F8000C00004000000000000000000000000009D -:100F90000000000000000000000000008800400089 -:100FA00000000005002000000400000004040020F0 -:100FB0000020000000040000000800000004000001 -:100FC00000000000002004000000000020020000DB -:100FD00000200000000000000000000000000000F1 -:100FE00000000084000000C000C002000000008477 -:100FF000008400000000000000000000000000006D -:1010000000000000000000000000000000000000E0 +:100F20000000000000000000000000000000800041 +:100F3000000000C000000000000000000090000061 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000005000300000000000386 +:100F600000000000002100050000900000000000CB +:100F700000000005000000000000880000030000E1 +:100F8000900000080008004000000200000000116E +:100F9000000000080005000900000000000000003B +:100FA000000000080008000800030003000500031B +:100FB00000020008000800000041000000000008D6 +:100FC00000000008000800080003000300020003FE +:100FD00020000000000000000000000000000000F1 +:100FE00000000000000200020000000000000000FD +:100FF000000000000004409009000000000000888C +:1010000009000000000000000000000000000000D7 :1010100000000000000000000000000000000000D0 -:10102000008209904000090011000000000000004B +:1010200000000000000000A0000000000000000020 :1010300000000000000000000000000000000000B0 :1010400000000000000000000000000000000000A0 -:10105000000000000000C000000000001000C00000 -:101060000000000000000000000000030009000074 -:101070000000000000000000000200020800000064 -:1010800090000000000000000000000000000021AF -:101090000000000000000000000000000000000050 -:1010A00000008400000000000000000300000003B6 -:1010B00000000000000000000000000300008400A9 -:1010C0000000000000000000000000080000000315 -:1010D0000005000384000000000000000000000084 -:1010E00000000000000000000000000005000000FB -:1010F00000000000000000000000000000000000F0 +:10105000000080000003002100102041000000007B +:101060000000002100000000000500410011000008 +:101070000021001000000000000000038200002199 +:101080000000000300000000000500000000000058 +:10109000002100000000000000000000000000002F +:1010A00000080000000000000000000000080041EF +:1010B00000030041000000000005820882000008D3 +:1010C0000008000000000000000000000008000808 +:1010D0000003000008000000000000000000000005 +:1010E0000000000000000000000000000000000000 +:1010F00000000000200000000010000000000000C0 :1011000000000000000000000000000000000000DF :1011100000000000000000000000000000000000CF :1011200000000000000000000000000000000000BF -:1011300000000000000000000000000000000000AF +:10113000002000000000000000000000000000008F :10114000000000000000000000000000000000009F :1011500000000000000000000000C1000001C1828A -:101160000100C0000140C089C000C0010002C0826F -:101170000000C0000041200000002101000191900A -:101180000100C0000140C089C000C1010004C0824C -:101190000000C0000141200000030000C100000168 -:1011A000C1820100C0000140C189C000C10100042A -:1011B000C0820000C0000021100000018801000171 -:1011C00000C10001000100C100890101000100020D -:1011D00000100001400100C100000041C141004178 -:1011E000C1A04141804141A08903800885030000DE -:1011F000808008418041118300001141C1080041F5 -:1012000010084141804141A0900380108803008074 -:101210008080034180411083000000000041C141F3 -:101220000041C18841418041418290038910880377 -:101230000080808000418041030380000041004124 -:10124000004100830041004100850841081004412D -:1012500000000080004180410090000041000341F7 -:1012600000C10000414182410041084120C10441C8 -:10127000008083804100C14100C1801041002141B4 -:1012800000080000414188410041204102C1104155 -:10129000008083804100C14100C1800800024100FC -:1012A000084100C10000414188410041204108C17E -:1012B000904100808380C100C14100C1800841008D -:1012C00003000000008041008800000002808500CB -:1012D0009080008088004100C10000108000000064 -:1012E000010100C10002000140010003010102C12F -:1012F000900300C083C00200400100C182010000D1 -:10130000000100890000000141010009000191C1B4 -:10131000908900C083C00800400100C18201000024 -:101320000000010100C1000000014101008900012D -:1013300090C1038900C083C01000400100C1820138 -:1013400001000100000000C00100C1000000001009 -:10135000080008100040C1009100C1000091820007 -:10136000002000000340000000000000C182108344 -:1013700000100000C140000000000000C10000009B -:10138000004000004040010000000000C1820283D4 -:1013900000200000C140000000000000C00000006C -:1013A000000000400000C183000000000000C18276 -:1013B000028300100000C140000000000000C000D7 -:1013C000000000C00001C0C100000000000100C119 -:1013D000C0020003000100C1000000000001000184 -:1013E00000000000002141C1000000000041C19048 -:1013F000008300410041C1C1000000000021904174 -:10140000000000800021C1C1410000000041C182F4 -:10141000008300410041C1C1000000000021834160 -:101420000000000000800041C18300000000004176 -:10143000C190808300C10041C1C1000000000021B3 -:10144000894100000080004180C10000000000418F -:10145000009080040041004100C1000000000041F4 -:101460000010000020C18000800200004100804187 -:1014700011C103C1C1C1008080C100004141000809 -:101480008080080320C1800080C10000410300412A -:10149000C1C103C1C1C1808080C1000041410000C1 -:1014A000008008200000C188804180C100004110F8 -:1014B000804191C103C1C141008080C10000414110 -:1014C000000000802088C100800080C10000412011 -:1014D000000041004100C1410000800900004100BE -:1014E000000080004100A1C1400040020000000057 -:1014F000040120C101C1400510C040C1000000012D -:10150000000082C00110A1C1820040C100000000A3 -:10151000900102C101C1400502C040C100000001AC -:10152000000090C00108000040C12001824000007E -:101530000000200108C101C1401190C040C100005D -:101540000001000020C00003C1004000C0C1000035 -:101550000100880010000100C1919000C00000004F +:101160000100C0000140C105C001C1010002C082F0 +:101170000000C000018508000000C1000001C1821C +:10118000010010000140C182C101C0010088C0827D +:101190000000C0000021100000010001000100015A +:1011A00000C00001000100C100C100010001008871 +:1011B00000100001C00100C000000001000100019A +:1011C00000C00001000100C0000500000001000295 +:1011D00000100001C00100C000000041C1410041F9 +:1011E000C18241418041419084838040900300004E +:1011F000808000418041088380000041C14100415E +:10120000C18941418041419082909002A103000038 +:1012100080800041804111038000000000410041B6 +:10122000004100820041004100C010410004024121 +:101230000000008000418041008900000041004121 +:101240000041008200410041008510C100090241B7 +:1012500000000080004180410089000041001141F0 +:1012600000C100004141834100C1094102C1104158 +:10127000008283804100C14100C1801041001041C3 +:1012800000C100004141C04100C1084108C110C176 +:10129000008083804100C14100C1801000004100F6 +:1012A00003000000008041009100000011000900CF +:1012B0000900008084004100C100008080004100DE +:1012C0000300000000804100910000001100410077 +:1012D000090000C090004100C100008080000000B3 +:1012E000000100C10000000141010009000588C1A2 +:1012F000880300C083C01000400100C1829000003C +:10130000000100C10000000141010009000110C1FD +:10131000111100C083C01000400100C18201000211 +:1013200001000100000000C00100C000000000003A +:10133000880088C00010C0008900C1000008820039 +:1013400001000100000000C00100C000000000001A +:10135000880088C00011C0008900C1000008820018 +:1013600000400000C183000000000000C18204832F +:1013700000040000C140000000000000C0000000A8 +:1013800000400000C183000000000000C182028311 +:1013900000840000C140000000000000C100000007 +:1013A000000000C00001C0C100000000000100C03A +:1013B00008110011000100C1000000000001000040 +:1013C000000000C00001C0C100000000000100C01A +:1013D00008110011000100C101000000000100001F +:1013E000000000800041C183000000000041C19066 +:1013F000008300410041C1C109000000002191416A +:10140000100000800041C183000000000041C18243 +:10141000808300410041C1C10000000000219041D3 +:10142000000000000080004180C100000000004179 +:1014300000C1808300C1004100C1000000000041E4 +:10144000000900000080004180C100000000004150 +:1014500000C184830041004100C140000000004100 +:1014600000090000C191804180C100004108004195 +:1014700088C103C1C1C1808080C100004141000812 +:1014800080801083C190804180C1000041000041F4 +:1014900008C103C1C1C1008080C1000041410000FA +:1014A000808010830000C100800080C100004102E4 +:1014B000001102004100C14100008009000041000C +:1014C000000080004100C100800080C10000410296 +:1014D000001182004100C141000080050000410070 +:1014E00000008000410040C0200182400000000157 +:1014F000880141C101C1400982C040C10000000112 +:10150000000084C0018240C0200182400000000031 +:10151000880191C101C1400590C040C10000000197 +:10152000000002C000100000C1004000C0C1000067 +:101530000100020088000100C103C000C0000000DB +:1015400001000000C0000100C1004000C0C1000057 +:101550000100020084000100C1038800C0010000F6 :1015600001000000C000010000000000000048422F -:10157000000000000000484260060060060048428B -:101580000000000000004842000000000000481178 -:101590000000000000004842484200600600484247 +:10157000000000000000484282110060060048425E +:101580000000000000004842000000000000484247 +:10159000000000000000484241820060060048420E :1015A00000000000000048420000000000000000B1 -:1015B00048420000000000004842884100600600E8 -:1015C0004842000000000000484200000000000007 -:1015D00000420000000000000012811200480700D5 -:1015E00048000000000000000000000000000000B3 +:1015B000004200000000000000008112004107000E +:1015C0004800000000000000420000000000000091 +:1015D00000420000000000000000811200410700EE +:1015E0004800000000000000420000000000000071 :1015F00000000000000000000000000000000000EB :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA @@ -188840,436 +188840,436 @@ :10178000000000000C4000000000000002C267E6FC :1017900067E643400000000000000231E000000066 :1017A000000000000C4000000000000002C267E6DC -:1017B000000067E643400000000000000231E00046 -:1017C0000000000000000C4000000000000002C209 -:1017D00067E660C603000000000000000031E00082 +:1017B000000060C603000000000000000031E000EF +:1017C0000000000000000C0000000000000000C04D +:1017D000630660C603000000000000000031E00066 :1017E0000000000000000C0000000000000000C02D -:1017F000630600000002100000000008000800005E -:1018000000000000000800000000000000000000D0 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000001000000000000000000000000A7 -:101840000000000400000000000000000000000094 -:1018500000000004000000000000000000009000F4 -:101860000000000000009000080000000000900050 -:101870000000000000000000000000000000000167 -:101880000000000000000000000400001100000043 -:101890000002000000000000000000000000000046 -:1018A00000000000400000000000000800000008E8 -:1018B0000000000800000000000000000000000020 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000020000000000000000F6 -:1018F00000000000000000000000000000000000E8 -:1019000000001000000000000000000000000000C7 -:1019100000000000000000000000000000000000C7 -:101920000000000000110000000090000000020014 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:1019700000000000000000000002000800080084D1 -:1019800000840000800000000008000000840010B7 -:10199000000000080000000800000084008400002F -:1019A000000800000000000000100088000000088F -:1019B0000000000800000008000000000000000017 -:1019C000000000880000000000000000000000008F -:1019D0000088000000840000008400040000000073 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000410000A6 -:101A0000000010090000000001800000000000003C -:101A10000008002100000400000000000000004158 -:101A20000000001100000000000000000009000993 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A6000000000000000000800000040000000002E -:101A700000000000000000000000000000880020BE -:101A800041044000A0000000000020080000000801 -:101A900000A0111000820082000000000000000081 -:101AA000410011882000000000000000000000003C -:101AB000000409041190000000000000000000086C -:101AC000000011001100000000000000000000886C -:101AD0000000090209041188000000000000020053 -:101AE00002000000000000840084000000000000EC -:101AF000000000A0400000C0020000000000000044 -:101B000000000000000000000000008001800000D4 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 +:1017F0006306000000020000000300000002000079 +:1018000000000000000200000000000000000000D6 +:101810000000008040004084000000000000020042 +:10182000000000000000000400000000001188001B +:101830002000000000000000000400000000000084 +:101840002000000000000000000000000000000078 +:101850004102100000000000000000000000C00075 +:1018600008000204000000000000880000004000A2 +:101870000000200000000000000000000000000048 +:101880000000000000000000000000000002000056 +:10189000000000000002800080080000000000003E +:1018A0000000000000000000000200020000000034 +:1018B0002100800200000000000000000000000085 +:1018C0000000000000000090000000000000000088 +:1018D0000000C0018000000000000000000000C007 +:1018E00000008900800000000000000000000000EF +:1018F0000000000000000000000084000000000064 +:1019000000000000000000000000000002000000D5 +:1019100000000000010000000000000000000000C6 +:101920000000000000000000000090000000000027 +:10193000A000000000000000000002000000000005 +:1019400000000040020002000000000088000200C9 +:101950000000010020004004000000000000020020 +:10196000000000000800100000000000000000005F +:101970000000000000000000000200000000000065 +:1019800000020008008802840000038400100008A0 +:1019900000080000000002080000000000880000AD +:1019A0000000009000820000000011000000000410 +:1019B0000090000000000002000000002000000075 +:1019C0000000020000000000000000000000000015 +:1019D000040000084000000080010000000000003A +:1019E000000000080000A000000800080000000837 +:1019F0000000008400000000000000000000000063 +:101A000000000021000000000000000000000000B5 +:101A1000000000050000008000212000002190004F +:101A200010000021002100000011000000090080CA +:101A300000004008000900118400000000000000C0 +:101A40000000000000000021000000000000000075 +:101A5000000000000000004100000000000000083D +:101A6000000000030040840908000000000000009E +:101A700000000003000000000000000800000088D3 +:101A8000000800840000000000000000000000A02A +:101A900000100000008400020002000800000000A6 +:101AA00000848082008200000000000000000088A6 +:101AB0002010004080040000000000200000000012 +:101AC0000000000000820000000000000000000094 +:101AD000000000080000008800000000090000006D +:101AE0000000000000080001000880000000000065 +:101AF0000082000800000082000000840000000056 +:101B000000000000000000000000000000000000D5 +:101B100000000004000000000004000000000000BD +:101B20000000000000000000000040000000000075 :101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B700000000000000084000000000000000000E1 -:101B80000000000000000000000000000020022013 -:101B90000000000000000000000000000000000045 +:101B40000000000008000000C000020000000000CB +:101B50000000000000000000000204000800000473 +:101B6000000000000000A000000000000080000055 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B900000000000000020000000210000002000E4 :101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 +:101BB00000000000000000000000008200000000A3 :101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C00000000200000009000000000000000000024 -:101C10000040000000000000000000000000000084 -:101C20000800001100000980000200000000000010 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000040000024 -:101C800000000000000000000008200000A000008C -:101C90000000000202000000000000000088200098 -:101CA00005000000000000000810000000904188BE -:101CB00000000000400000880088050000040400C7 -:101CC000050000880000000000880000000020904F -:101CD0000004119000000900098800880400000435 -:101CE0000000200000880000000000400000008488 -:101CF0002084000800000200204000000490000042 -:101D00002000000011000003000800000000000097 -:101D100000000000000000000000000900000000BA -:101D200000000000000000000000000000000000B3 -:101D300000000000000000000000000000000000A3 +:101BD0000000000000000000000000010000000004 +:101BE00000010000000000000000000000040010E0 +:101BF00000040000000000000000000000000000E1 +:101C000000000000000000000000000000000000D4 +:101C1000000000000000004000080008A0000000D4 +:101C2000A000000000000000000000000000000311 +:101C3000004000000020000010030000000300042A +:101C40000000000000030800000000000000000089 +:101C500000030008020000408200000000000000B5 +:101C60000000000000000005004100050000000524 +:101C7000000800020000000000000000002000003A +:101C800000080000000000000000200000820008A2 +:101C9000000800A020000082008809000000204009 +:101CA000040000880000000009002000020200007B +:101CB000400200900200090000821182020020040C +:101CC000040000000000000000000000118800086F +:101CD000000000000084000800A0000000A0000038 +:101CE00000000000000000000000000000000008EC +:101CF000000000000000000800A00010000000002C +:101D000000000000000000000000000000000000D3 +:101D10000000000000030000200000002000000080 +:101D2000A0000000000000030000011101000000FD +:101D30000000002100000000000000000000000082 :101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D7000000000000000000000210003000000003F -:101D80000000000000000000000000000000000053 +:101D50000000000000000000000000000000001073 +:101D60000000018000000880000300000003002143 +:101D700000000004000000210000004000210000DD +:101D8000000000000800000000000000000000004B :101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 +:101DA0000000210000400000000020044000080066 :101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 +:101DC0000000000003000000000000000000000010 :101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 +:101DE00000000000042000000004000000000000CB :101DF00000000000000000000000000000000000E3 :101E000000000000000000000000000000000000D2 -:101E100000000100900000900000000000000000A1 -:101E200000000000000000000000000000000000B2 +:101E100000000000000000000000000000000000C2 +:101E20000000008800880008000000010001000098 :101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 +:101E400000000101880010000000000300000000F5 :101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 +:101E6000000000002020030500A082020000000006 +:101E7000000000000000008400A0008400000000BA :101E80000000000000000000000000000000000052 -:101E90000000000011008021000000000000000090 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000008000000041001061 +:101EB0000000002000000000000000000000000002 +:101EC000000000001041002140030000000000005D :101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 +:101EE00000000000000010C0A110008880880000E1 +:101EF0000000000000000000000000800000000062 :101F000000000000000000000000000000000000D1 -:101F1000000000000000000900801108000000001F -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 +:101F100000000000000000000000000000000000C1 +:101F200000000000000041000502100205001080C2 +:101F3000A10083000010000000000000000000006D +:101F4000000000000000080021000800200300003D :101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 +:101F600000000000000000008880204090800810E1 +:101F700000000000000000000000000900800000D8 :101F80000000000000000000000000000000000051 -:101F900000000000000000000001000201000088B5 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 +:101F90000000000000000000000000000000000041 +:101FA00000000000000000000000000800A0000089 +:101FB00091020500020090010000000000000000F6 +:101FC000000000000000000000900100000000017F :101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 +:101FE000000000000000000000000920884009A057 +:101FF000850100000000000000000000004000A07B :1020000000000000000000000000000000000000D0 -:1020100000000000000000000000010090880200A5 -:1020200001000000000000000000000000000000AF -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 +:1020100000000000000000000000000000000000C0 +:102020000000000000000000000090000000000020 +:10203000A0000000000001000000000000000000FF +:102040000000000000000000000000010000880106 :102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:10209000000000000000000000000000410000807F -:1020A000800908000000000000000000000000009F -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 +:102060000000000000000000000000001090018847 +:10207000008810880000000000000000C000000080 +:10208000004002000000000000000000000000000E +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B000000080000000000021000000000000007F +:1020C00000000000000000000000000000082002E6 +:1020D000802100100000000000000000000000004F +:1020E000000000000000000000000000000080115F +:1020F000081020108910000000000000000080007F :1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000011AE -:10212000110000800000000000000000000000001E -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000010410008000800080800002E +:1021400000000000000000000000000000002080EF +:102150001000200008110000000000000000000036 :10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F +:10217000C1820440A180830800000000000000002C +:1021800000000000800000000000000000000000CF :10219000000000000000000000000000000000003F -:1021A00000010100004000000000000000000000ED -:1021B000000000000000000000000000000000001F +:1021A000000000000000000000000000000000002F +:1021B00088108800100020000100019001880101B2 :1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF +:1021D00000400100000001010000000000000000BC :1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE +:1021F000000011A0040311A0A101000000000000D4 +:10220000000020008800080010000000000000000E :1022100000000000000000000000000000000000BE -:102220000000000000E00700820000000000000045 +:1022200000000000000000000000000000000000AE :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E +:10225000000000000060000000000000000000001E :10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E +:1022700000000000888100600600000000000000EF +:10228000000000000000000000004200000000000C :10229000000000000000000000000000000000003E -:1022A0000000000000000000F0F00000000000004E -:1022B000000000000000000000000000000000001E +:1022A000000000000000000000000000000000002E +:1022B0000000000000550FC30000000000000000F7 :1022C000000000000000000000000000000000000E :1022D00000000000000000000000000000000000FE :1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD +:1022F000000000000000BEBEBEBEF0F0F0F0000026 +:1023000000000000000000500050FF00FF0000002F :1023100000000000000000000000000000000000BD -:1023200000000000000000000000F0F000000000CD -:10233000000000000000000000000000000000009D +:1023200000000000000000000000000000000000AD +:10233000000000000000FF550FC300000000000077 :10234000000000000000000000000000000000008D :10235000000000000000000000000000000000007D :10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D +:102370000000000000000000BEBEBEFEBEFFBEBEEC +:10238000000000000000000000540050FF00FF00AB :10239000000000000000000000000000000000003D -:1023A000000000000000000000000F0F0000FFFF11 -:1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000AAF0000000000083 +:1023C0000000000042024302000000000000000084 :1023D00000000000000000000000000000000000FD :1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000000CC +:1023F000000000000000000000003F0F7F0F0040C1 +:1024000000000000000000000000F0F0F0F000000C :1024100000000000000000000000000000000000BC -:102420000000000000000000000000000F0F00008E -:10243000000000000000000000000000000000009C +:1024200000000000000000000000000000000000AC +:102430000000000000000000000000AAF0FF000003 :10244000000000000000000000000000000000008C :10245000000000000000000000000000000000007C :10246000000000000000000000000000000000006C -:10247000000000000000000000000000000000005C -:10248000000000000000000000000000000000004C +:102470000000000000000000000000003FAF3FAF80 +:10248000000000000000000000000000008000804C :10249000000000000000000000000000000000003C -:1024A00000000000000000000000000005002A06F7 -:1024B000054C00A800000000000000000000000023 -:1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC -:1025000000000000000000000000000000000000CB -:1025100000000000000000000000000000000000BB +:1024A000000000000000000000000000000000002C +:1024B0000000000000000000000000000061300685 +:1024C000000D000000610006000D0000000000008B +:1024D0000000000000000000000000000061000794 +:1024E00000090000000000000000000000000000E3 +:1024F000000000000000000000000000000000617B +:102500000E36800D000000000000000000000000FA +:10251000300000100000000000000000000000007B :1025200000000000000000000000000000000000AB -:10253000FF0000FF0000000000000000000000009D -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B +:10253000000000000000000000000000000000009B +:102540000000000000005050900400000000000057 +:10255000000000000000000000000000000040C07B +:102560008080FF00F7000000000000000000000075 :10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B +:1025800000554000CFCFFF00000000000000000019 :10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B -:1025B0000000FF0000FF000000000000000000001D -:1025C000000000000000000000000000000000000B +:1025B000000000000000000000000000000000001B +:1025C00000000000000000005050900000000000DB :1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB +:1025E00041C08082FF00F7000000000000000000F2 :1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA +:10260000000000550000FFFFFFFF00000000000079 :1026100000000000000000000000000000000000BA :1026200000000000000000000000000000000000AA -:1026300000000000FF0000FF00000000000000009C -:10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A +:10263000000000000000000000000000000000009A +:10264000000000000000AFFA2FF03C00003C00202A +:10265000002000000000000000000000000000005A +:10266000000055005F00057D0555000000000000DA :10267000000000000000000000000000000000005A -:10268000000000000000000000000000000000004A +:1026800000000000C282FAAA3C28282800000000AE :10269000000000000000000000000000000000003A :1026A000000000000000000000000000000000002A -:1026B000000000000000FF0000FF0000000000001C -:1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA +:1026B000000000000000000000000000000000001A +:1026C0000000000000000000A2F0FAFA0000000084 +:1026D00000200020000000000000000000000000BA +:1026E0000000000055005F00055505550000000082 :1026F00000000000000000000000000000000000DA -:1027000000000000000000000000000000000000C9 +:10270000000000000000FAAAFAAA1C000000000065 :1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 -:102730000010000400000000000000000000000085 -:102740000000400000000000000000000000000049 -:102750000000000200021000000000000000000065 -:102760000000000000000000000000000000000168 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 -:1027A0000000000000000000000000000000000029 -:1027B00000000000000000000090009000000000F9 -:1027C0000000000000000000000000000000000009 -:1027D00000000002000000000000000000000000F7 -:1027E00000000000000000000000000000000000E9 +:102720000000000000000000000000000000001198 +:102730000002000400040000000200020200000089 +:10274000000000040000000000020000840000807F +:102750004000008000040200000000002011000082 +:10276000000900000000000204000000000000005A +:10277000000000000200000200050004000020002C +:1027800004000000400000000000200000040000E1 +:1027900000000002200440000000000200000000D1 +:1027A0000002000020000000000000000000000007 +:1027B0000000000000000000000000000000000019 +:1027C00000000000000000000000004000000000C9 +:1027D00000088000000200010002000000000082EA +:1027E00000000002000000900000000000000090C7 :1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:1028100000000002000400000000000000000000B2 -:1028200000000000000000000000000008000000A0 -:102830000000000000000000000004000400080088 -:102840000400000000000000000000000000020082 -:10285000020000000000000000000800040000006A -:10286000080000000000000000000200020000005C -:102870000000000000000000000000000800080048 -:102880000800080000000000000000000200020034 -:1028900082000000000000000000000000000000B6 -:1028A0000000020000000000000000000000000026 -:1028B0000000020000000000000000000000000016 -:1028C000040400840000000000000000000000007C -:1028D00003020002000000040004000000000004E5 -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000002000B8 -:1029000000000000000000000000000000000000C7 -:1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000040000000000000093 -:1029400000080000000020000000000000009000CF -:102950000000880000408800000000000211000014 -:1029600000000400C000000000000000000084001F -:102970000000000000000000C00000000000020095 -:10298000000000009000000088000000000000002F -:102990000000000004000000000000001000000023 -:1029A0000000000004009000000000000000000093 -:1029B000000000000000000000000008000800C047 -:1029C00000000000008200A000000000400000A005 -:1029D00000000000000000400004000000000000B3 -:1029E00000000000000004200000000021000000A2 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000020000000000000A6 -:102A10000000000000000004000000000020000092 -:102A20000000000000000000110000A000000000F5 -:102A30000000004000000000000000000000000056 -:102A40000000001000000000011000000000000065 -:102A50000000000000000000000000000000000076 -:102A60000000000000100010000000000000000046 -:102A70000000000000000000000000000000000056 +:1028000000000000000000000000000000020000C6 +:1028100000000000000000000000000000000000B8 +:102820000000009000000000000000020000000016 +:102830000000000000000000000004002000040070 +:1028400004000000020000000040020002008200BC +:10285000030001000800000003000800040000104D +:10286000080000400000000000008240020002005A +:102870000000000002000000000000000200040050 +:102880000200000000000000000000000200020042 +:102890000000000002009003000990000200000008 +:1028A0000000020000000000200002000200000002 +:1028B0000200020000020004000000020004040400 +:1028C00000000008020000002100020800000000D3 +:1028D000000002004000020000002000040002008E +:1028E00004040004000000000008009000840000C0 +:1028F00000000000000000080000000400002008A4 +:102900000000008400000002000200040200040035 +:1029100004080200040004080810000000880008F1 +:102920000000000020002000000000000000040063 +:102930002008000800002000000000000000000047 +:10294000000000000000000000000008000000007F +:102950000400020000004000000090080080000019 +:102960000000000090004000000000020000000095 +:102970000000000000000000000000000000000057 +:102980000040000000000000000000000000000007 +:102990000020000000030000000000000000000014 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C00000000000000800400000000000000008B7 +:1029D0004000000000000400800200880084000421 +:1029E0000000000000820000000803000040030017 +:1029F000000000840000000000000020000800002B +:102A0000000800000000000000004100090005006F +:102A10000000000000000000008400004108008861 +:102A200000C00000000000000000000000000000E6 +:102A3000000800000000000000000000000000008E +:102A40000000000000000010001000C000000004A2 +:102A5000000000000000000000020008400000002C +:102A600020C000000000000800000000000000007E +:102A70000000000000040000000000000000000052 :102A80000000000000000000000000000000000046 :102A90000000000000000000000000000000000036 :102AA0000000000000000000000000000000000026 -:102AB0000000000000008400000000000000000092 -:102AC0000000000000000000000004000000000002 -:102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 +:102AB0000000000000000000000000000000000016 +:102AC00000000000080000000000000000040000FA +:102AD00020000000110000000000400002880000FB +:102AE000000480050000000000000200000003C098 +:102AF00000000300000000000000000000000000D3 :102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 +:102B1000000000000000119000000008000000000C :102B200000000000000000000000000000000000A5 :102B30000000000000000000000000000000000095 -:102B400000000000000000800000002000000000E5 -:102B50000040000000000000000000000000040031 -:102B60000011000020000000001100000000000023 -:102B70000000000000000000040000000000000051 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000273 +:102B600004090000008400000000000000000000D4 +:102B7000000800000000000000000000000000004D +:102B800000000000000000000020A0000000000085 +:102B90000000000000000000000000000200010032 +:102BA00000000040000000000000000000000000E5 :102BB0000000000000000000000000000000000015 -:102BC0000000002000C009004040042000010084F3 -:102BD0000000000000000090000000200000000045 -:102BE00004200000000000904000000000040000ED -:102BF0000020000008200004100400000000000075 -:102C00000000000000000004000404000000042094 -:102C10000000404004200920020400200088000039 -:102C200000000000000000000000000000000000A4 +:102BC0000000000000A02000000000000000000045 +:102BD0000000000020000090000800880088050028 +:102BE0004002200009022005000000000000000053 +:102BF00020000000000404040088090804200800E4 +:102C00000000004000000000004000000000000044 +:102C100000000084000000000000050205402008BC +:102C200040900000000000000000000000000008CC :102C30000000000000000000000000000000000094 -:102C40004004000000000000000000000000000040 -:102C50000000000000000000000200000000000072 -:102C60000000000000000000000000000000100054 +:102C40000000000000000000000000000000000084 +:102C500000000000010001000080000002000000F0 +:102C60004000000800000021008400080000000867 :102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 +:102C80000000000000000803000000000000000039 +:102C90000000000000000000000000000011000023 +:102CA000000000000000000000000008000000001C :102CB0000000000000000000000000000000000014 :102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000820000000000000082000000000000E0 -:102CF0004100050000000000050005000000000084 -:102D000000000000000000000000000000000000C3 +:102CD0000000000000002040204000040088800028 +:102CE0000084000000001102000021040000001018 +:102CF000000000000000000000000000000000884C +:102D000000000800000000000000000000000000BB :102D100000000000000000000000000000000000B3 :102D200000000000000000000000000000000000A3 :102D30000000000000000000000000000000000093 -:102D40000000000020000000000000000000000063 -:102D500090000000000800000000000000000000DB -:102D60000000000000000000000000000000000063 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000001000000000072 +:102D600000880088000890101000C0A01004000027 :102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 +:102D80000000000000000001000000000000000042 :102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 +:102DA00000000000C0000000000000000000000063 :102DB0000000000000000000000000000000000013 :102DC0000000000000000000000000000000000003 -:102DD0001100800000000000000000000000000062 -:102DE00000000000000000000000000000000000E3 +:102DD00000000000000000000000000004000000EF +:102DE0000000000000000080000005000080008559 :102DF00000000000000000000000000000000000D3 :102E000000000000000000000000000000000000C2 :102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 +:102E20000000200021000000000000000000000061 :102E30000000000000000000000000000000000092 :102E40000000000000000000000000000000000082 -:102E50000000000000800000008000000000000072 -:102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 +:102E50000000000000000000000000100000001052 +:102E60000000000080108080008008002088200082 +:102E7000C10300000000000000000000000000008E :102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 :102EA0000000000000000000000000000000000022 :102EB0000000000000000000000000000000000012 :102EC0000000000000000000000000000000000002 -:102ED0000000000000000020000000C00000000012 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 +:102ED00000000000000000000000000000010000F1 +:102EE00000010000A00010888408821000888382FE +:102EF00090008311000000000000000000000000AE :102F000000000000000000000000000000000000C1 :102F100000000000000000000000000000000000B1 :102F200000000000000000000000000000000000A1 :102F30000000000000000000000000000000000091 :102F40000000000000000000000000000000000081 -:102F5000000000000000010000888800010000005F -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 +:102F50000000000000000000000000000000000071 +:102F6000880002000100080000000000C0000011FD +:102F7000008201210191000000000000000000001B :102F80000000000000000000000000000000000041 :102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 +:102FA000000000000000000000000001000100001F :102FB0000000000000000000000000000000000011 :102FC0000000000000000000000000000000000001 -:102FD0000000000000000000410000800000090027 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 +:102FD00000000000000000000000000000000000F1 +:102FE0000000000000001000000000000000800051 +:102FF00000090021052011820000000000000000EF :1030000000000000000000000000000000000000C0 :1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 +:103020000000000000000000000000100010001070 :103030000000000000000000000000000000000090 :103040000000000000000000000000000000000080 -:1030500000000000000000000000001100000080DF -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 +:103050000000000000000000000000000000000070 +:103060000000000000000000000080000080000060 +:103070000000A121820090008003000000000000F9 :103080000000000000000000000000000000000040 :103090000000000000000000000000000000000030 :1030A0000000000000000000000000000000000020 :1030B0000000000000000000000000000000000010 :1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000010000EF -:1030E00000400000000000000000000000000000A0 -:1030F00000000000000000000000000000000000D0 +:1030D00000000000000000000000000000000000F0 +:1030E0000000000000000000000000000800881040 +:1030F0008810C000090189888410040000000000C5 :1031000000000000000000000000000000000000BF :1031100000000000000000000000000000000000AF :10312000000000000000000000000000000000009F :10313000000000000000000000000000000000008F :10314000000000000000000000000000000000007F :10315000000000000000000000000000000000006F -:1031600000000700822100000000000000000000B5 -:10317000000000000000000000000000000000004F +:10316000000000000000840000600000000000007B +:1031700000000000004200000060000000000000AD :10318000000000000000000000000000000000003F :10319000000000000000000000000000000000002F :1031A000000000000000000000000000000000001F :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF :1031D00000000000000000000000000000000000EF -:1031E000000000000000F0F00000000000000000FF -:1031F00000000000000000000000000000000000CF +:1031E00000000000000000000000000000000000DF +:1031F00009C0F9C0000000000F3F0030000030009F :1032000000000000000000000000000000000000BE :1032100000000000000000000000000000000000AE :10322000000000000000000000000000000000009E :10323000000000000000000000000000000000008E :10324000000000000000000000000000000000007E :10325000000000000000000000000000000000006E -:103260000000000000000000F0F00000000000007E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E +:10326000000000000000000000000000000000005E +:10327000000009CFF9CF00000000CFFFC0F0000030 +:10328000784800000000000000000000000000007E :10329000000000000000000000000000000000002E :1032A000000000000000000000000000000000001E :1032B000000000000000000000000000000000000E @@ -189283,49 +189283,49 @@ :10333000000000000000000000000000000000008D :10334000000000000000000000000000000000007D :10335000000000000000000000000000000000006D -:103360000000000000003C3C0000FFFF00000000E7 -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D +:10336000000000000000000000000000000000005D +:1033700000000000000003900390DFFF7F7F3030EB +:10338000F3F3090990900000000000000000000025 :10339000000000000000000000000000000000002D :1033A000000000000000000000000000000000001D :1033B000000000000000000000000000000000000D :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED -:1033E00000000000000000003C3C00000000000065 -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC +:1033E00000000000000000000000000000000000DD +:1033F0000000000000000000F390F390DFFFFFFFEB +:103400003030F3F30F0FFFF0000000000000000069 :1034100000000000000000000000000000000000AC :10342000000000000000000000000000000000009C :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C -:103460000000000000000000000005002A000540E8 -:1034700000A80000000000000000000000000000A4 -:10348000000000000000000000000000000000003C +:10346000000000000000000000000000000000005C +:10347000000000610007C00D0000000030000000E7 +:10348000000100613006000900010000000000009A :10349000000000000000000000000000000000002C :1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC +:1034B00000000000000000000000000000610006A5 +:1034C000000D0000000000000000000000000000EF :1034D00000000000000000000000000000000000EC :1034E00000000000000000000000000000000000DC :1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB +:10350000000000000A00000028AAA8AA000000008D :1035100000000000000000000000000000000000AB :10352000000000000000000000000000000000009B :10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B +:1035400000008A008A000000000000000000000067 :10355000000000000000000000000000000000006B :10356000000000000000000000000000000000005B :10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B +:1035800000000000000000000000AAAAAAAA000093 :10359000000000000000000000000000000000002B :1035A000000000000000000000000000000000001B :1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB +:1035C00000000000AAAAAAAA000000000000000053 :1035D00000000000000000000000000000000000EB :1035E00000000000000000000000000000000000DB :1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA +:103600000000000000000000C3C3C3C3008000200E :1036100000000000000000000000000000000000AA :10362000000000000000000000000000000000009A :10363000000000000000000000000000000000008A @@ -189333,349 +189333,349 @@ :10365000000000000000000000000000000000006A :10366000000000000000000000000000000000005A :10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A +:1036800000000000000000000000000000000080BA +:10369000002000000000000000000000000000000A :1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A :1036C00000000000000000000000000000000000FA :1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F00000040000000000000004000000000000C2 -:1037000000000000000000000000001001000000A8 -:1037100000400080000000000000000000000000E9 -:103720000000000000000000000000000001000098 -:103730000000000000000000000000000000000089 -:103740000000000000000000000000000004000075 -:103750000000000000000000000000000004000461 -:103760000000000400000000000000000002000053 +:1036E00000000000000000000000000000000002D8 +:1036F00000020004000000020000000000000000C2 +:1037000000000000000000000000000000000000B9 +:10371000020401000000000340000400000000005B +:103720000008000400008400020000030000000004 +:103730000000200400030000000020002000000022 +:103740000400000400008800208000800040840005 +:103750008802200004000200000000002000000099 +:103760000000000000002000200000000002000017 :103770000000000000000000000000000000000049 -:103780000000000000000000000000000000020037 -:1037900000000001004000000000000000000000E8 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 +:103780000000000000000000000000000000000039 +:103790000000000004000000000000000002000023 +:1037A0000000000200040000000080000002000091 +:1037B00000000000000000A0000000000000000069 +:1037C00000000000000000000000001000100001D8 +:1037D00000000000000000000000040000000000E5 :1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000002000000000000000000B6 -:1038100000000200000000000000000000000000A6 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000004000000000000000400000000000030 -:1038900000000000800000000000000000000000A8 -:1038A0000000000000000000000000000000000018 +:1037F0000000000084000000000000000000000045 +:103800008400000000000100000000000000110022 +:1038100002000000000004000000000000000000A2 +:103820000000400000008400008001000000000053 +:1038300000000000000000000000880800000000F8 +:10384000000000008800008000000200200000004E +:10385000028002008800000000000000000000005C +:103860000000000000000000020002000200000052 +:103870000000000000000004000000000000000044 +:103880000000000000000000020000000000000036 +:10389000820000000000000080000500020000041B +:1038A00000000000000000000900001008000000F7 :1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000080000F0 -:1038D00000040000000000000000000800000000DC -:1038E00000000000000000000000000000040000D4 -:1038F00000000000000000000000020000000000C6 -:10390000880000000000000000000000000000002F -:1039100000000000000000000000010000000000A6 -:10392000018001008800000000000400100804006D -:103930000008000000000000000000000008000077 -:1039400000009000000000000000000000000400E3 -:103950000400000000000000000000000000000063 -:103960000000000000000000000000000200000055 -:103970000000000000000000000000000000000047 -:1039800000000000000000000000000000400000F7 -:103990000000000000000000000000002000000007 -:1039A0000000040404000400000000000000000007 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000020000000000D5 +:1038C000008400000000000000020000040002006C +:1038D0000208001000000000000000000082040048 +:1038E0002008000000002000000000000000000090 +:1038F00004040200000000000000000000000000BE +:103900000000000000000000000000000000400077 +:103910000000000000020000000000A000210000E4 +:103920009000000000000000000500050240881023 +:103930000420040800000000000000000000000057 +:1039400000000008001001008900000300000000D2 +:10395000000008409005000000000000000000008A +:103960000000000000000000000000000021000036 +:1039700000000000000000000000000000820000C5 +:1039800000000040000000000000000040000000B7 +:10399000000411000000008800000084004100A025 +:1039A000000000A0000000000000000000208001D6 +:1039B000000080090000000000000000000000007E +:1039C0000000000003000000400040000000000074 +:1039D000000000000000000000080040000000009F +:1039E00000000008000000000000000000000000CF :1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A10000000000000000000000000000100008025 -:103A20000000000000000100000000000040000055 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 +:103A0000004100000000004000110009000000110A +:103A100000210011404104410000002008050480FD +:103A20000000000082118200000000000000000081 +:103A3000020040000400000000000000040000003C +:103A4000000082000000000000000000C000000034 +:103A500000000000000000000080000000000000E6 :103A60000000000000000000000000000000000056 -:103A7000000000000000000900000000000000003D +:103A70000000000000000000000000000000000046 :103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000200006 -:103AA000000800000000000002000000000000000C -:103AB0000000000000000000000000000000000006 +:103A90000000000000008000009000000000800096 +:103AA0008020000000A000000000000000000000D6 +:103AB00000008000000091000000000000000000F5 :103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 +:103AD00000000000000000000000000200080000DC :103AE00000000000000000000000000000000000D6 :103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B10000000000000000000000090000000010014 -:103B20000000000000080100000010040000000078 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 +:103B000000000000000000000008000000000400A9 +:103B1000000000000000000000040104000000009C +:103B20000000050300210000000800210000000043 +:103B300082000000010000000020000000000003DF +:103B40000000000000008200000082000021100040 +:103B5000000000000000000000020000000000085B +:103B60000000004000000000000000000000000015 :103B70000000000000000000000000000000000045 -:103B80000000200000000000000000000084002071 -:103B90000000000000000000040000000900000018 -:103BA000200000000400000120000000840100004B -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000200000D5 -:103BD00000000400000004000000000000200000BD -:103BE00000000000000000000000000000000002D3 +:103B80000000000000000000000000000000000035 +:103B90002000200409000008002000044004000068 +:103BA000400000028400000000000000002000002F +:103BB000000000000000020000880001000000007A +:103BC00000000000000000000000000000000000F5 +:103BD000A100000000000000030008000000000039 +:103BE00000000000000002080000000000000000CB :103BF00000000000000000000000000000000000C5 :103C000000000000000000000000000000000000B4 -:103C100000000000000000020000000000000000A2 -:103C2000000000000000008000A100000009000565 -:103C30000000000900090021000000000000000051 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 +:103C10000000000000000000000020000000000084 +:103C20000000000000000000002100410021000011 +:103C300000000000000082000000000000210021C0 +:103C400000000000000000210000820082008200CD +:103C50000000000040000000000000000000000024 +:103C60000000000000000000002100000000000033 :103C70000000000000000000000000000000000044 :103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 -:103CA0000000008200000000002000400000000032 +:103C900000000000000000000000000020004000C4 +:103CA0000000000000000000000000000000000014 :103CB0000000000000000000000000000000000004 :103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 +:103CD0000000000000008000000000000000000064 :103CE00000000000000000000000000000000000D4 :103CF00000000000000000000000000000000000C4 :103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000001000090000000000100901061 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 +:103D10000000000000A0001000840000000001105E +:103D200000200008C008001000C082100000000041 +:103D300000000000000000000000000011A00120B1 +:103D40004088208200030000000000000000000006 +:103D5000000000000000000000010000000040C062 +:103D6000040084A082840000000000000000000025 :103D70000000000000000000000000000000000043 :103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 -:103DA0000000000000001100218000000000110050 -:103DB000A100000000000000000000000000000062 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 +:103D900000000000000000000080000000000300A0 +:103DA0000300000000000080008000000000000010 +:103DB00000000000000000000000000000008980FA +:103DC00002808000000000000000000000000000F1 +:103DD00000000000000000000004051000050003C2 +:103DE0004080900080808000000000000000000003 :103DF00000000000000000000000000000000000C3 :103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E2000000000000000000000C009000009008040 -:103E300000400980001000000000000000000000A9 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 +:103E100000000000000000000000000200000000A0 +:103E2000020021114080008000000041808080005D +:103E30000000000000000000000000000000000082 +:103E400000008021008000800000000000000000D1 +:103E50000000000000000000000005000400050054 +:103E60004191000000008000808000000000000000 :103E70000000000000000000000000000000000042 :103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA00000000000000000000000880901880000F8 -:103EB0000008000101080001008800000000000067 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 +:103E90000000000000000000000000000090002072 +:103EA00000000008010801400088820008C11010CD +:103EB0009002000000000000000000000000000070 +:103EC000000000008200401082A0000000000000FE +:103ED00000000000000000000000000000020000E0 +:103EE000010001A0100000004000080200000000D6 :103EF00000000000000000000000000000000000C2 :103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000100880008 -:103F3000829001000100A08808000000000002003B -:103F40000000000000000000000000000000000071 +:103F10000000000000000000000000004000000061 +:103F2000C000100040000000C0000800C082001067 +:103F3000001002A0000002000000000000000000CD +:103F4000000000001002008900C088C000000000CE :103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 +:103F6000000101010000008400100001A011000008 :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000090008 -:103FB000000080804100410000808000410000003E -:103FC0008000000000000000000000000000000071 +:103F900000000000000000000000000000008000A1 +:103FA000000080008000800400008000000080008D +:103FB0000080000000800000800000000000000081 +:103FC0000000000000000080008800000085000064 :103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 +:103FE000000321100508100000400090000589849E :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:10403000001180110000000000110000028000004B -:104040000000000000000000000000000000000070 +:10402000800000000000800041000800080020041B +:104030000000800000008000000000000000000080 +:104040000000000000000000800000008000000070 :104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 +:1040600000002189050004004010000000000080CD :104070000000000000000000000000000000000040 :104080000000000000000000000000000000000030 :104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B000000000012000000000000001000000409E -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 +:1040A000000010009000C000100089020900090003 +:1040B0000900820004A01010400000000000000071 +:1040C00000000000000000000000C00082A00840C6 +:1040D00002000000000000000000000000000000DE +:1040E0000000000001890000000000000000001036 +:1040F00000020000000000000000000000000000BE :1041000000000000000000000000000000000000AF :10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:1041300000000000000000E007000006000000E0B2 -:1041400007008200000000000000000000000000E6 -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F +:10412000000000000000000000000042000000004D +:1041300000000042004200000600420000000000B3 +:10414000000000000000000000000000000000006F +:104150000600000000000000000000000000000059 +:1041600000000000000041000060000000000000AE :10417000000000000000000000000000000000003F :10418000000000000000000000000000000000002F :10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000FF000000FF0000000001 -:1041C0000000F0F00000000000000000000000000F -:1041D00000000000000000000000000000000000DF +:1041A0000000000000003C00171700000000DCD0F9 +:1041B0001C1000000000FFFFFFFFBFFA15500000B9 +:1041C000000000000000000000000000000000FAF5 +:1041D0000404FFB4FFFF0000000000000000000026 :1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF +:1041F00000000000CFCFCFCF000000000000000083 :1042000000000000000000000000000000000000AE :10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000FF000000FF000080 -:1042400000000000F0F0000000000000000000008E -:10425000000000000000000000000000000000005E +:104220000000000000000000FFC31717000000009E +:10423000DFD31F130000000014BE0F0FAFFA0550AC +:10424000000000000000000000000000000000006E +:10425000FFFF0404FFB4FF000000000000000000A6 :10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E +:104270000000000000008080CFCF000000000000A0 :10428000000000000000000000000000000000002E :10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B000000000000000000000000000FF000000FF -:1042C0003C3C0000FF000000FFFF00000000000079 -:1042D00000000000000000000000000000000000DE +:1042A00000000000000000000000A000A0AA000024 +:1042B000000094D594D500000000FFFFFFFF00969A +:1042C00000BE000000000000000000000000000030 +:1042D000000000000000AAFF0A5F000000000000CC :1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE +:1042F000000000001414303000FFAAFF000000008E :1043000000000000000000000000000000000000AD :10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:104330000000000000000000000000000000FF007E -:1043400000003C3C0000FF000000000000000000F6 -:10435000000000000000000000000000000000005D +:10432000000000000000000000000000A055A0FFF9 +:1043300000000000BCFDBCFD00000000FAFFCACF79 +:10434000458245AA000000000000000000000000B7 +:1043500000000000C2FFFEFF00550A5F00000000E1 :10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D +:104370000000000000001414303000C3AAC3000085 :10438000000000000000000000000000000000002D :10439000000000000000000000000000000000001D :1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000001540A8 -:1043C0002A06054C00A805402A06054C00A8000056 -:1043D00000000000000000000000000000000000DD +:1043B00030000000000000613006000D0000000029 +:1043C0003020000000A000000000000000000000FD +:1043D000000000000000A0610006004D0001000088 :1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD +:1043F00000600006C00D000000615006000D0000C6 :1044000000000000000000000000000000000000AC :10441000000000000000000000000000000000009C :10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:1044400000005555FFFF000000000F0FFFFF0000A8 -:10445000000000000000000000000000000000005C +:1044300000000000000000000F0504043C3C3C3C70 +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000A5A5A5A5C8 :10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C +:1044700000000C0F0F0F30003000000000004D4115 +:10448000CFC300000000000000000000000000009A :10449000000000000000000000000000000000001C :1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C0000000000055550000000000000F0F000024 -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB +:1044B000000000000000000000000F0504040000E0 +:1044C00000000000000000000000000000000000EC +:1044D0000000000000000000000000000000AAAA88 +:1044E000FFFF0000000000000000000000000000CE +:1044F00000000000040F0F0F00000000000000008B +:104500000C00CFC30000000000000000000000000D :10451000000000000000000000000000000000009B :10452000000000000000000000000000000000008B :10453000000000000000000000000000000000007B -:104540000000000000000000F0F00000000000008B -:10455000F0F000000000000000000000000000007B +:1045400014501450000000000000000000000000A3 +:10455000000000000000000000000000000000005B :10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B +:1045700000000000000000000D00FF3CC0C0000073 :10458000000000000000000000000000000000002B :10459000000000000000000000000000000000001B :1045A000000000000000000000000000000000000B :1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000F0F0000000000B -:1045D0000000F0F0000000000000000000000000FB +:1045C0000000551455140000000000000000000019 +:1045D00000000000000000000000000000000000DB :1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB +:1045F000000000000000000000000F00003C4040F0 :1046000000000000000000000000000000000000AA :10461000000000000000000000000000000000009A -:104620000000000000000000000000000002000484 -:10463000000000080002A0000000000000040000CC -:104640000000000000040000000000024000000024 -:1046500000000000400020020000000200020000F4 -:104660000000000200000000000000000000200028 -:1046700000000000000020002000000000000002F8 -:1046800000000000000000000000001100002002F7 -:1046900000000000000020000000000000020000F8 -:1046A00000000000000000000000000000001000FA -:1046B000000000900000000400040000000400005E -:1046C0000004009000001000009000040090000220 -:1046D0000000100200000000000000400000000088 -:1046E00000000000000000020002000000000002C4 -:1046F00000000000000000020000000000000002B6 -:10470000088200000090000200C000020040000289 -:104710000000000000000002000000000000000493 -:104720000000000000040002000000020000000081 -:1047300000000000000000000000820000000000F7 -:104740000000000000000000040000000000000065 -:1047500000000000000082000200000000000000D5 -:104760000000000000000000000000400000000009 -:104770000000000000000000000000000000000039 -:104780000000000010000040004000400040000019 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000004000200000000000000000000F3 -:1047C00000000002000000000200000200000000E3 -:1047D00000000000000000000002000000000000D7 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000400000000000000A4 -:104810000000000000000000000000000000200474 -:104820000000000000000082000000000000000006 -:1048300000000000000000004000020002004000F4 -:104840000000000004000000000000000000000064 -:104850000000040000000000400000000000040010 -:104860000000000000000000040010000000000034 -:10487000000000030000000004000400000000002D -:104880000000040000000000000004000000000020 -:104890000400000000000000000000000000000014 -:1048A0000000000000000000000000000000000008 -:1048B00002000000000000000000000000200000D6 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E000000000A000000000000000000000000028 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000400000000047 -:104930000000000000000000000000000004000073 -:104940000020000000000000000000000040000007 -:104950000000004000000000000000000000000017 -:1049600000200000000000000000000000400040A7 +:10462000000000000000000000040004000400047A +:10463000000000001002000200000002000200045E +:1046400000110004000010044000400000040400B9 +:1046500000000005200040000400000002000400EB +:104660000000C0000404200200002000200000021E +:1046700020000000000020002000000400002010A6 +:10468000020200042004000020002000200000029C +:1046900020001000100220020400000000040002AC +:1046A00088000000000000002000009000020000D0 +:1046B00000000000000008040004000000000004E6 +:1046C0000090000000000004000000000002000252 +:1046D00000020000000200020002000000020002CE +:1046E00000020000000200020000000000000002C2 +:1046F00005000000000000020002000000000002AF +:10470000000220000000000200020002000000027F +:104710000000000000020000000000040000000291 +:10472000000000000002000200020800000000007B +:104730008400000088000000020002000000000069 +:104740000000000000000000200000000041000008 +:10475000000000000000000000000408000000004D +:1047600000000000020002000008004000000000FD +:104770000008000000000000000000080000200009 +:104780000010000000000000000002040000000013 +:104790000000000000000005000000000000040010 +:1047A0000000000000000000000000000000000801 +:1047B0000090000200020400040020000000000439 +:1047C00000040000000000000402000000000404D7 +:1047D00000040000000000000000000000000000D5 +:1047E00004000000000000000400000000000000C1 +:1047F000000000000000000000080208000002089D +:1048000000000008000020000488000020080208C2 +:1048100000080008000004000408040800082084C0 +:1048200000000484200002000000200000040402B4 +:104830000000040000000000000000000000000074 +:104840000000000000000000900090000000000048 +:104850004000C00000000000000000000000000058 +:1048600002000008000002000200004000080000F2 +:104870000000020000000000000000000000000036 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A00000080008040300000000000200000000EF +:1048B0000040000000080000000000000000200090 +:1048C00000000000000011000000009000900000B7 +:1048D000000000100000000000000008000000A020 +:1048E0000000000000400000030000000000000085 +:1048F0000000000000080000000000200000000090 +:104900000000002000000000000000000000000087 +:10491000000000A0008200A00000000000000000D5 +:104920000000000000200000000000000000000067 +:104930000000000000000000000000000000000077 +:1049400000200000000000000000004100400005C1 +:1049500000400041000000000000200000100000A6 +:1049600000400040000000000000000000200004A3 :1049700000400000000000000000000000000000F7 :104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 +:104990000000000000000000000000000200000015 :1049A0000000000000000000000000000000000007 :1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 -:1049D00000000200000000000000000000000000D5 +:1049C00000000000000000040000000000001100D2 +:1049D000008800100040000000A00040000000001F :1049E00000000000000000000000000000000000C7 :1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000200000000000000000084 -:104A30000000000000000200000000000000000074 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 +:104A000002000000020000000000000000000000A2 +:104A1000000000000000000000A0000000000000F6 +:104A2000000000000400000000000000000008007A +:104A30000000000002000200000000000000000072 +:104A40000000000000000000000000000011000055 +:104A50000000000040000000000300000000000013 +:104A6000000000000000000800000000000000003E :104A70000000000000000000000000000000000036 -:104A8000000000000000000000080000000000001E +:104A80000000000000000000000000000000000026 :104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000090000000000000000000000DD -:104AD000000000840000020000C000000084008488 -:104AE0000000000021000000008400000000000021 -:104AF00010000000000000000000000000000000A6 -:104B00000000000000000000002000000000000085 -:104B10000000000000000000000000000000000095 +:104AA00000000000000000000008000000000000FE +:104AB00000000008000000000000000000000000EE +:104AC0000000000000000000000011004000110084 +:104AD00000000000008200040004000000840000C8 +:104AE0000000000000000040000000000000000086 +:104AF000000040080000000800080000000000005E +:104B0000000000000000000000000000080000009D +:104B1000001000C0000000000000000800000000BD :104B20000000000000000000000000000000000085 :104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B500000000000000000000000000000118800BC -:104B60000000000000000011000200000000000032 -:104B70000000000200000000000000000000000033 +:104B40000000000000000000000000000040000025 +:104B50000000000000000000000000000000004114 +:104B6000000000000000000800000000000000003D +:104B70000000000000000000000000000000000035 :104B80000000000000000000000000000000000025 :104B90000000000000000000000000000000000015 :104BA0000000000000000000000000000000000005 :104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000500000000000000000000000000D0 -:104BE00000000000000000000000000400000000C1 +:104BC000000000000010008400002000208200008F +:104BD00000002040020000000288000008040000DD +:104BE00000000400000000000000200000000000A1 :104BF00000000000000000000000000000000000B5 :104C000000000000000000000000000000000000A4 :104C10000000000000000000000000000000000094 @@ -189778,219 +189778,219 @@ :10522000000000000000000000000000000000007E :10523000000000000000000000000000000000006E :10524000000000000000000000000000000000005E -:1052500000000000000000000000840000000000CA -:10526000000000000000000000000000000400003A -:105270000000000000040004000000000000C00462 -:1052800000000000C000C00000000000C0000000DE -:10529000000000000000000000010000000000000D -:1052A0002000000000002000C000000000004000BE -:1052B000C0000000C000C000000000000000880026 -:1052C0002000000000000004200400000000200076 -:1052D000200000002000200000030090009000004B -:1052E00000000000000000000000000000000000BE -:1052F00000000000008200820000000000000000AA -:105300000000080000000000000000000000000095 -:1053100000000090000000000000000000000000FD +:10525000000000000000000084002000200000008A +:10526000000000000004020400000000000400042C +:1052700000000000C104C0000000C0000000880061 +:1052800040000000C0004000900040000004C0004A +:105290000400040020042000000000000200400080 +:1052A0002004200004002000C000200088008404A6 +:1052B000C00020002000200020008800200088047A +:1052C00020002000000004042000C00088038404A3 +:1052D0002000C000200040008400009000900000EA +:1052E000000000900090000080000000008200009C +:1052F00000000090000420000000000020000000DA +:105300000000000000000000000000000004008217 +:105310000004000000040000000400000000000081 :10532000000000000000000000000000000000007D -:105330000004000000000000000000000000000069 -:105340000000000000000000000000000004000059 -:105350000004000000000000000000000000000049 -:10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:105380000000000000000000000000000004000019 -:1053900000410000000000000000000000000000CC -:1053A00000000000000000000000000000000000FD -:1053B00000000000000400000000000800000000E1 -:1053C00000000000000000000000000000000000DD -:1053D00000000000000800000000000000002000A5 -:1053E000200020000000000000000000000000007D -:1053F00000000000000000000000000000000000AD -:10540000200000000000000000000000000000007C -:105410000000400000000200000000000008000042 -:10542000000000000000000000000000000000007C -:105430000000000000000004000000000000000860 -:105440000000000000000004000000002000000830 -:1054500000000000400005000004000400080904EA -:10546000000000000000000000000000010000003B -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000000FC +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:1053500000000000009000000000000000000000BD +:10536000000000000000000000000000000001003C +:105370009000000000000000000002000000000497 +:105380000000000000050004000000000000000014 +:105390000040000000000040000800000000000085 +:1053A00000000000000000000000000000000008F5 +:1053B00000000000000000090004000500050000D6 +:1053C00000000000000800000004000000050005C7 +:1053D0000008000000080005000800040008200084 +:1053E000000000002000000000002000000020005D +:1053F00004000000000010000000000080002000F9 +:105400000000200000000000000000000400000078 +:105410000000000000000084000000000000000008 +:10542000000000000008040000080000020800005E +:1054300000000008020802000008400809080208ED +:10544000000800040008020404080400208202048A +:1054500040084004208209042004040404820984D2 +:10546000000000000000000000000000000000003C +:1054700000000080000004008800900090002000E0 +:105480002005842100080000000000210000002108 +:1054900000090008000000000008000800000008E3 +:1054A00000000000000000000000000300000000F9 :1054B00000000000000000000000000000000000EC -:1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC -:1054E000000000000000000000000000000020009C -:1054F00000000000000000000000000000000000AC +:1054C00000000000000000000000000000000021BB +:1054D00000080000000000000000000000000021A3 +:1054E000004000000000000000000000000000007C +:1054F0000000000000040000800000000000000028 :10550000000000000000000000000000000000009B -:10551000000000000000000000000000000000008B +:10551000000000004100000000000000000000004A :10552000000000000000000000000000000000007B -:10553000000000000000000000004000000000002B -:1055400000900000000000000000000000000000CB +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B :10555000000000000000000000000000000000004B -:105560000000000400000000000200000000000035 -:1055700000000080000000000000000000000000AB -:105580000000000000000000000200000000000019 -:1055900000000011000000000040000000000000BA -:1055A00000000008000000000000000000080000EB -:1055B00000000000080800000000080000000008CB -:1055C0000000000082000000000000000000000059 -:1055D0000000000082000000000000000000000049 -:1055E00000000000000000000000000008000000B3 -:1055F00000000200000400000000000000000000A5 -:10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A -:10563000000000000000000000000000000000006A -:10564000000000080000000000000000000000084A -:105650000000000000000000000000080000000042 -:10566000000000002000000000000000000090008A -:105670000100000000000000000000000000000029 -:10568000000000000000000000000000000000001A -:105690000000000000000000000000000000000802 -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA +:1055600000000000000000020002000288000009A4 +:10557000000900000020000900090241001100009C +:1055800000092000000000090005040000000000E0 +:1055900000040800000000000000000000100000EF +:1055A000C000000000000000080000000000000033 +:1055B00000008200020040000800C0000800000057 +:1055C000000000008200000082000800820000004D +:1055D00000000200820008000800820000000000B5 +:1055E00000008200100009004100020000000000DD +:1055F0000000000000000005110008000900110073 +:1056000008A00000800000020088000400001000D4 +:105610000088000003000000000000080000008473 +:105620000000000000000000000800084100000821 +:105630000000000000000008000000000000000062 +:105640000000000002000000000000000000000058 +:1056500000000800020800000000000000A0000098 +:105660001000080008000800000000000000000012 +:105670000000000000000000000400200180200461 +:105680000100018000000004000000210000000073 +:105690000000000010000000000000000000820078 +:1056A0000000000000008200000000000000000078 +:1056B00000000000000000000800000000000000E2 +:1056C00000080000000000000000000000000000D2 +:1056D00000110000000000000000000000000000B9 :1056E00000000000000000000000000000000000BA -:1056F000000010000000000000000000000000009A -:105700000000000000000000000000000000000099 +:1056F0000000000200000000000000050001202062 +:1057000080012000200400000001000000000000D3 :105710000000000000000000000000000000000089 :105720000000000000000000000000000000000079 :105730000000000000000000000000000000000069 :105740000000000000000000000000000000000059 :105750000000000000000000000000000000000049 :105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000920 -:105780000000000000000000000000000000000019 -:105790000000000000030000000000000000000006 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 +:105770000000000000000000000000000000000425 +:10578000012100000008000500910000002100092F +:1057900000000000000800000008000000000000F9 +:1057A00000000000000000000000000000000005F4 +:1057B00000000000000000050000000000000005DF +:1057C00000000000000000030000000000000000D6 :1057D00000000000000000000000000000000000C9 :1057E00000000000000000000000000000000000B9 -:1057F00000000000000000000000000000000000A9 -:105800000000000005000000000000000008008407 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 +:1057F000000000000000008200840082000400829B +:10580000208920002004200400040004200400005B +:105810000004000000000000000000000000000084 +:105820000000000000000000000000080000000070 :105830000000000000000000000000000000000068 :105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 -:105870000000000000000000010000000000000027 -:105880000000000000000000000000000000000018 +:10585000000000000000000000000008020000003E +:105860000000000000000000000004000000000034 +:105870000000000000000000008400C000000010D4 +:105880000100200000000000009000000104001052 :105890000000000000000000000000000000000008 :1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000000E8 +:1058B00000010000000000000000000000000000E7 :1058C00000000000000000000000000000000000D8 :1058D00000000000000000000000000000000000C8 :1058E00000000000000000000000000000000000B8 -:1058F0000000000000000000000011002100000076 -:105900000000000000000000000000000000000097 +:1058F00000000000000000000000000000000000A8 +:10590000000011008000090000000080000040003D :105910000000000000000000000000000000000087 :105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 :105940000000000000000000000000000000000057 :105950000000000000000000000000000000000047 :105960000000000000000000000000000000000037 -:1059700000000000000000000000000000410900DD -:105980000003008000000000000000000000000094 -:105990000000000000000000000000000000000007 +:10597000000000000000000000000000000000081F +:10598000008000000008000000020000004000034A +:105990000004008000000000000000000000000083 :1059A00000000000000000000000000000000000F7 :1059B00000000000000000000000000000000000E7 :1059C00000000000000000000000000000000000D7 :1059D00000000000000000000000000000000000C7 :1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000001A6 -:105A0000010000000088000000000000000000000D -:105A10000000000000000000000000000000000086 +:1059F00000000000000000000000000000000000A7 +:105A000000110008000000000002000000900000EB +:105A10000089008400100000000000000000000069 :105A20000000000000000000000000000000000076 :105A30000000000000000000000000000000000066 :105A40000000000000000000000000000000000056 :105A50000000000000000000000000000000000046 :105A60000000000000000000000000000000000036 :105A70000000000000000000000000000000000026 -:105A8000000008000000010000000000000000000D -:105A90000000000000000000000000000000000006 +:105A800040000000C000100000002000C000010025 +:105A9000C000020000001000000000000000000034 :105AA00000000000000000000000000000000000F6 :105AB00000000000000000000000000000000000E6 :105AC00000000000000000000000000000000000D6 :105AD00000000000000000000000000000000000C6 :105AE00000000000000000000000000000000000B6 :105AF00000000000000000000000000000000000A6 -:105B000000000000800000004100000000000000D4 -:105B10000000000000000000000000000000000085 +:105B0000000080000000800000000900800080008C +:105B1000080080008000000002000000000000007B :105B20000000000000000000000000000000000075 :105B30000000000000000000000000000000000065 :105B40000000000000000000000000000000000055 :105B50000000000000000000000000000000000045 :105B60000000000000000000000000000000000035 :105B70000000000000000000000000000000000025 -:105B800000000000000008110000000000000000FC -:105B90000000000000000000000000000000000005 +:105B80000000000000008000000000000008000489 +:105B90000000000080000000000000000000000085 :105BA00000000000000000000000000000000000F5 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 :105BD00000000000000000000000000000000000C5 :105BE00000000000000000000000000000000000B5 :105BF00000000000000000000000000000000000A5 -:105C00000000000000000000010100000000000092 -:105C10000000000000000000000000000000000084 +:105C00000000000000000400100010001000000060 +:105C1000000000000000080002001000100000005A :105C20000000000000000000000000000000000074 :105C30000000000000000000000000000000000064 :105C40000000000000000000000000000000000054 :105C50000000000000000000000000000000000044 :105C60000000000000000000000000000000000034 :105C70000000000000000000000000000000000024 -:105C80000000000000000000000000E00000814172 -:105C90000000000000000000000000000000000004 +:105C800000000000000000000000000000000042D2 +:105C90004842006006000011480000600000480013 :105CA00000000000000000000000000000000000F4 :105CB00000000000000000000000000000000000E4 :105CC00000000000000000000000000000000000D4 :105CD00000000000000000000000000000000000C4 :105CE00000000000000000000000000000000000B4 :105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 +:105D0000000000000000000000003D0D3101000017 +:105D100000000000000000000000C707C4040000ED :105D20000000000000000000000000000000000073 :105D30000000000000000000000000000000000063 :105D40000000000000000000000000000000000053 :105D50000000000000000000000000000000000043 :105D60000000000000000000000000000000000033 :105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 +:105D8000000000000000000000000000FDCDF1C197 +:105D9000000000000000000000000000F737F434AD :105DA00000000000000000000000000000000000F3 :105DB00000000000000000000000000000000000E3 :105DC00000000000000000000000000000000000D3 :105DD00000000000000000000000000000000000C3 :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 +:105E00000000000000000000000000000000145529 +:105E100096D7000000000000000000000000404095 +:105E2000C2C20000000000000000000000000000EE :105E30000000000000000000000000000000000062 :105E40000000000000000000000000000000000052 :105E50000000000000000000000000000000000042 :105E60000000000000000000000000000000000032 :105E70000000000000000000000000000000000022 :105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA00000000000000000000000000000000000F2 +:105E90003C7DBEFF0000000000000000000000008C +:105EA0006868EAEA0000000000000000000000004E :105EB00000000000000000000000000000000000E2 :105EC00000000000000000000000000000000000D2 :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 :105EF00000000000000000000000000000000000A2 :105F00000000000000000000000000000000000091 -:105F1000000000400006000C00000000000000002F -:105F20000000000000000000000000000000000071 +:105F10000000000030000000000005610A3FC50DD0 +:105F200000A000613007C00D00000000000000006C :105F30000000000000000000000000000000000061 :105F40000000000000000000000000000000000051 :105F50000000000000000000000000000000000041 :105F60000000000000000000000000000000000031 :105F70000000000000000000000000000000000021 :105F80000000000000000000000000000000000011 -:105F9000000000000000FF00FFFF00000000000004 +:105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 :105FB00000000000000000000000000000000000E1 :105FC00000000000000000000000000000000000D1 @@ -189998,7 +189998,7 @@ :105FE00000000000000000000000000000000000B1 :105FF00000000000000000000000000000000000A1 :106000000000000000000000000000000000000090 -:106010000000000000000000FF0000000000000081 +:106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 :106030000000000000000000000000000000000060 :106040000000000000000000000000000000000050 @@ -190006,7 +190006,7 @@ :106060000000000000000000000000000000000030 :106070000000000000000000000000000000000020 :106080000000000000000000000000000000000010 -:10609000000000000000000000000000F0F0000020 +:106090000000000000000000000000000000000000 :1060A00000000000000000000000000000000000F0 :1060B00000000000000000000000000000000000E0 :1060C00000000000000000000000000000000000D0 @@ -190014,7 +190014,7 @@ :1060E00000000000000000000000000000000000B0 :1060F00000000000000000000000000000000000A0 :10610000000000000000000000000000000000008F -:106110000000000000000000000000000000F0F09F +:10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F :10614000000000000000000000000000000000004F @@ -190022,189 +190022,189 @@ :10616000000000000000000000000000000000002F :10617000000000000000000000000000000000001F :10618000000000000000000000000000000000000F -:1061900000000000000000000000A00002800000DD -:1061A00000000000000040004004400400084008D7 -:1061B00040044004880004A0408420A000000004A3 -:1061C0000004400088112000400020000000200052 -:1061D0002000200000032000200020002000C0003C -:1061E00000008800880020002000880020000000B7 -:1061F000200020002000200020042000200020009B -:106200008800200020000000200020002000000066 -:106210002000200020110090000400000000000475 -:106220000004000000000000000021000000000148 -:106230000005210500050090C005000421050000AF -:1062400040900090000400400000009000000040DA -:10625000000000000000000000000000000000043A -:1062600000000090009000040040214000900000D9 -:10627000004000400000000000400040000000001E -:1062800000000004000000000000400000000000CA -:1062900000000000000000000000000000000000FE -:1062A00000000000000002000000000000000000EC -:1062B0000141000000000000010000000000000893 -:1062C00000000000000000000000000000000000CE -:1062D00000000008000800000000000800000000A6 -:1062E0000000004000100000004000000008000412 -:1062F0000004004000400005000900040005000003 -:106300000000000800080004000800040000000469 -:106310000008000400040000000400000000000069 -:1063200000000400040000008000000000000500E0 -:10633000000020000000000000002000000000001D -:1063400000000004040009080008000000000084A8 -:10635000000800400004000000000000000000826F -:106360000084000800080040004000100004000005 -:10637000000800820004000840084004000800846F -:1063800040040908040440004084408420080004BC -:106390000982400440084008400440840000000096 -:1063A000000000000200400000002100000000008A -:1063B0000000000000004008000000000400008011 -:1063C000418000000200000000000000000000000A -:1063D0000005000000000000000000000000004078 -:1063E0000000000800030000000000210000000081 -:1063F000000000050008000040000021000000002F -:1064000040050000000000000000000800400000FF -:106410000008000000000000000000080008000064 -:106420000000000000008000000000008400000068 -:10643000000000000000000000000000400080009C -:106440000008042010000000000010000000000000 -:10645000000000000000000000000000000000003C -:106460000000000000001000000000000000080014 -:1064700000004100080000000000000000000000D3 -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A00000050002000000000104010020080002B5 -:1064B000C0000000000800000000010020000104EE -:1064C00004000004000800000008000000000000B4 -:1064D0000000000008000000000800041004100084 -:1064E000000000000000820000210000C000000544 -:1064F00000000008000410001000000082000000EE -:1065000000000000000082001000000000000000F9 -:106510000000000000000000A00000000000A0003B -:1065200000000000000000000000200004008200C5 -:1065300004000000000000000000000820008300AC -:1065400020008000000100000000000002000000A8 -:1065500000400000000000000000000000000000FB -:10656000000800000000000800000000001000000B -:106570000010000800000001000000000000000002 -:10658000000000A00000000000000000000000006B -:106590000000000000000000000003A00000000058 -:1065A00000000400000000000000000000002000C7 -:1065B00000A0000000050000000000000000000036 -:1065C0000000000000400000000300000003000382 -:1065D0000000000300080000000800210000000087 -:1065E000000000000000000000001000000000009B -:1065F000000010080000000000000000000000087B +:1061900000000000000000000000A0000411020048 +:1061A000A0000200001102044004400404800085A5 +:1061B0004084410488110004400420034000C004CE +:1061C00020044004041120042011200020000000BD +:1061D000200420040000200004042004880420007F +:1061E00020042004200420002000200020002000A3 +:1061F0000400200020002011200020002000201199 +:10620000888420082000C0008400200020004080F6 +:1062100008002100201100400004000000080000D8 +:106220000004000480001100400000000000800213 +:10623000000200082000008400000000000000842C +:10624000000000000000000000900004000000902A +:106250000004000800000000009000000000008220 +:10626000009000000000000000900004000000000A +:106270000090000400000000000000040000000086 +:106280000000000800000000009040000000000036 +:10629000800800004000090000000000000000002D +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000080000000000000000C6 +:1062D000004000400000000000000000000000003E +:1062E00000000000000000000000000400000000AA +:1062F0000000001000000000000300050000000581 +:10630000000500000005000000080008000000046F +:106310000000000000030000000005000000050070 +:106320000000020004000000000000000000000067 +:106330000000020000000200000005000000000054 +:106340000004004000000000000000040000000005 +:106350000000000000880084000000000008000029 +:106360000084000002080400050800080008000876 +:1063700000080008020800080008040002040008E1 +:10638000050804080204200804040404200420046E +:1063900005840404020440040204020400004000D6 +:1063A0004000000000000000000000000005200088 +:1063B000010001009000410008004010200300414E +:1063C0000021002100210021001000050008000824 +:1063D000002100A1020800080010000000000000D9 +:1063E0000005000800080000000000210000000077 +:1063F000000000400000000000000021000000003C +:106400000000004100000000000000410000000307 +:10641000000000020003000000080000000000006F +:1064200000000000000000000000000000000088E4 +:10643000800020A020A00000084080008000000014 +:10644000000041A000A000000000000008000000C3 +:1064500000000000004000000000000400000000F8 +:106460000000000000000800000000000000100014 +:10647000000000000000000000000000000000001C +:1064800000000000000000001000000000000000FC +:1064900003000000000800001000008200820000DD +:1064A00000210000000500000000000200408800FC +:1064B0008821000000000000008000000002004071 +:1064C0000000000200001000000400200004004052 +:1064D00000410000000082000004000000401000A5 +:1064E0000000000000100000004100000200001049 +:1064F0008200000000000021000000008200000077 +:1065000082001008020000000200000000000000ED +:1065100082001000000000000000C0204000C00009 +:10652000040000000000000000000008000000005F +:1065300000000008090009A000A004200208410092 +:10654000009041080000219000820800080010A07F +:1065500000000000000000A000A00000008400086F +:10656000009000000040000000000000000000005B +:106570000200000000000000000000000000020017 +:10658000000000080000000000000000048200007D +:10659000000002000000000002000200410088002C +:1065A000410010000000000000000000000000009A +:1065B00000000000000400000000020400000400CD +:1065C0000088050300000002000500110000000023 +:1065D000000800100000000000080000004100005A +:1065E000000000410000000000000000000000006A +:1065F000000000000000000000000000000000009B :10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:1066200000000000000000000000000000C00000AA -:1066300080000005000000000000000000000000D5 -:10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A +:106610000000000001000000820000008210000065 +:10662000400000080008000000000000000000001A +:106630000082000000000011000021008001000025 +:106640008002002082000000000000000000000026 +:10665000000000000000000000100000000000002A :10666000000000000000000000000000000000002A :10667000000000000000000000000000000000001A -:106680000000000002000000000000000000000008 -:1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00000080000000000000000000000090008C1 -:1066C0000011000000000000000000080100008030 -:1066D0000005000000000000002100000000000094 -:1066E0000000000000210000000000000000000089 -:1066F0000000000000000000000000000000010891 -:1067000000800000000500400008000000080000B4 -:106710000000000000410000020000000000100026 +:10668000000000000000000000000000000000000A +:1066900000000000000020000000000000000000DA +:1066A000000080000000000000000000000000006A +:1066B000000000008802000000800100002100218D +:1066C0000004004104000002002100210008000530 +:1066D0000008000000410003000000000000000866 +:1066E000000000050000000000000000000800009D +:1066F0000000000000080000000000000000000092 +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 :106720000000000000000000000000000000000069 -:106730000000000000400404020800000000000007 -:1067400000000000000002000040000000002000E7 -:106750000020084000082000001000000000000099 -:106760000000000402000000000000000000000023 -:106770000000000000000000000800000000000011 -:1067800020000004000000000000000000000000E5 -:1067900000000000000000000000000000000000F9 -:1067A00000000000000000000000004000000000A9 -:1067B00000000000000000000000000000000000D9 -:1067C00000000000000000000000000001000000C8 -:1067D00000000000000000000000000000000000B9 -:1067E00000000000000000000000000000000000A9 +:10673000000000000000202002200004200000A033 +:1067400000A00000049011040000000002000000FE +:1067500000400000004000000004000000000000B5 +:1067600000000000200020000000000000000000E9 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000800000000000000000000F1 +:1067A000400000000800040000000000000000009D +:1067B0000000000000C000000008000800A0000069 +:1067C00001020008C1C11020030284110000000072 +:1067D00000000000000000000000000000000010A9 +:1067E00000020002000000000000000000030000A2 :1067F0000000000000000000000000000000000099 :106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 -:106830000000000000001100000000000000000047 -:106840000000000000000000000000000000110037 -:106850002100000000000000000000000000000017 +:1068100000000000000000000100900000000000E7 +:106820000000000000000001100000000001000056 +:106830000000000000000000000000800080000058 +:10684000000040000080A1C1029141210021000010 +:106850000000000000000000000000000000000038 :106860000000000000000000000000000000000028 :106870000000000000000000000000000000000018 -:1068800000000000110000000000000000000000F7 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B000000000000000000000080080001100003F -:1068C000000000000000000011080000001100009E -:1068D00000090080004000000000000000000000EF -:1068E00000000000000000000000000000000000A8 +:106880000000000000000000000000000000000008 +:106890000000000000000000000041008000000037 +:1068A0000000000000000000002080080010000927 +:1068B00000000000000000000000001100000000C7 +:1068C0000002001100840000880002000384880098 +:1068D00000100000000000000000000000000000A8 +:1068E0000000009100000000000000000000000017 :1068F0000000000000000000000000000000000098 -:106900000000000000000002000000000000000085 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000000000000000000010020000036 -:1069400000880000000000000000010100000000BD -:106950000000000000100001001000000000000016 -:106960000000000000000000000000000000000027 +:106900000000000000000000000000000000000087 +:106910000000000000000000000010004100001115 +:1069200000000000000000000000028008001100CC +:10693000410300000000000000000000008800107B +:1069400000000000008800900000111090840108F1 +:10695000090400000000000000000000000000002A +:10696000000000000008000200000000000000001D :106970000000000000000000000000000000000017 :106980000000000000000000000000000000000007 -:1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 -:1069B000000000000000000000000000010002884C -:1069C00008000200000000000000000000000801B4 -:1069D00000000000010010000200010000000000A3 -:1069E00000000000000000000000000000000000A7 +:1069900000000000000000000000000001000000F6 +:1069A00000010000000000000000000000020000E4 +:1069B00000000101000000000000000004000000D1 +:1069C0000000A000C000020000000300890588A1AB +:1069D00011C1A0A0000000000000000000000000A5 +:1069E0000000000040000000C00082000000000025 :1069F0000000000000000000000000000000000097 -:106A00000000000000000000040000000000000082 -:106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A3000000000000000000000000000000008004E -:106A400000808000890000000000000000000000BD -:106A50008011000011000800800000000800000004 -:106A60000000000000000000000000000000000026 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000175 +:106A20000000000101010000000000000000000063 +:106A30000100000000000000000000000000000055 +:106A4000000000008000800000000000040010082A +:106A5000A188C021C0210900000000000000000042 +:106A60000000000000008000000080000000000026 :106A70000000000000000000000000000000000016 -:106A800000000000000000000000000000000900FD +:106A80000000000000000000000000000000000006 :106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC0000011000000800000000000000000000035 -:106AD00000000000000000000000000000000000B6 -:106AE00000000000000000000000000000000000A6 +:106AA0000010000000401141000000000000000044 +:106AB00000000300020003000000000000000000CE +:106AC00000000000800080000000000000000000C6 +:106AD000C089408209000908000000000000000091 +:106AE0000000000000000000000080000000000026 :106AF0000000000000000000000000000000000096 :106B00000000000000000000000000000000000085 :106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 -:106B30000000000000000000000000000000000055 -:106B40000000000100000040000000000000000004 -:106B50000000000000000000000000000000000035 -:106B60000000000000000000000000000000000025 -:106B70000000000000000000000000000000000015 +:106B20000000000000000000001100000000000054 +:106B300000004102030041000803000000000000C3 +:106B400000008200C00008000800A000A0000200B1 +:106B50000200092001098900030100000000000073 +:106B60000000000000000000000082001000020091 +:106B70000200000000000000000000000000000013 :106B80000000000000000000000000000000000005 :106B900000000000000000000000000000000000F5 -:106BA00000000000000000000000000000000000E5 -:106BB00000000000000000000000000000000000D5 -:106BC00000000000000002E00700000000000000DC -:106BD00000000000000002E000000000000002E0F1 -:106BE000070400000000000000000000000000009A -:106BF0000000000000000000000000000000000095 -:106C0000000000000000000000000000000048003C -:106C100000E0000000000000000000000000000094 -:106C20000000000000000000000000000000000064 +:106BA00000000000000000000000000100000000E4 +:106BB00000000000010200000000000000000000D2 +:106BC000000000000000000000000000480000601D +:106BD000000048008211006006008881000000006B +:106BE00000000000000000000000000000000000A5 +:106BF0000000004200000000000000000000000053 +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 +:106C2000000000000000500000600002840000002E :106C30000000000000000000000000000000000054 -:106C4000000000000000000000000000F0F0000064 -:106C50000000000000000000000000000000000034 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 +:106C400000000000000001310D3D00000000808CBC +:106C5000B0BC00000000000010108100FFF900002F +:106C6000000000000000000000000000000080B0F4 +:106C70008CBC0000000000000000000000000000CC :106C80000000000000000000000000000000000004 :106C900000000000000000000000000000000000F4 :106CA00000000000000000000000000000000000E4 :106CB00000000000000000000000000000000000D4 -:106CC0000000000000000000000000000000F0F0E4 -:106CD00000000000000000000000000000000000B4 +:106CC0000000000000000000C1F1CDFD0000000048 +:106CD000838FB3BF0000000000001010810099F9FD :106CE00000000000000000000000000000000000A4 -:106CF0000000000000000000000000000000000094 +:106CF00083B38FBF00000000000000000000000010 :106D00000000000000000000000000000000000083 :106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 @@ -190217,276 +190217,276 @@ :106D900000000000000000000000000000000000F3 :106DA00000000000000000000000000000000000E3 :106DB00000000000000000000000000000000000D3 -:106DC00000000000000000000000000066660000F7 -:106DD000FFFF0000000000000000000000000000B5 -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 +:106DC0000000000000000000000000003D3D0D0D2F +:106DD00000000000D0D04040000000000000C0C013 +:106DE00080800000000000000000000000000000A3 +:106DF00000000000BC8CBC8C000000000000000003 :106E00000000000000000000000000000000000082 :106E10000000000000000000000000000000000072 :106E20000000000000000000000000000000000062 :106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000666676 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 +:106E40000000000000000000000000000000FDFD48 +:106E5000CDCD00000000D9D94949000000000060F4 +:106E6000C0C08080000000000000000000000000A2 +:106E7000000000000000BF8FBF8F00000000000076 :106E80000000000000000000000000000000000002 :106E900000000000000000000000000000000000F2 :106EA00000000000000000000000000000000000E2 :106EB00000000000000000000000000000000000D2 :106EC00000000000000000000000000000000000C2 -:106ED00005652A06054F20A80000000000000000FC -:106EE00000640006000E2000057D0A06050E24A0A1 -:106EF0000000000000000000000000000000000092 +:106ED000000030000000000000613007C00D00001D +:106EE00005615A3FC50D00A1000000000000000030 +:106EF0000000000000000000000030000000000062 :106F00000000000000000000000000000000000081 -:106F10000000000000000000000000610007800D7C +:106F10000000000000000000000000000000000071 :106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 +:106F3000000000610006C00020000000000000000A +:106F4000000000610006000D0000000000000000CD :106F50000000000000000000000000000000000031 -:106F6000000000000000F0F0000000000000FFFF43 +:106F600000000000E0000000000000000000000041 :106F70000000000000000000000000000000000011 :106F80000000000000000000000000000000000001 :106F900000000000000000000000000000000000F1 :106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 +:106FB0000000000000000000FF0055AA00000000D3 +:106FC0000000000000F083500000000000000000FE :106FD00000000000000000000000000000000000B1 -:106FE0000000000000000000F0F0000000000000C1 +:106FE000000000000000E000004000000000000081 :106FF0000000000000000000000000000000000091 :107000000000000000000000000000000000000080 :107010000000000000000000000000000000000070 :107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 +:1070300000000000000000000000AAAAC3C3000076 +:1070400000000000000000F0835F0000000000006E :107050000000000000000000000000000000000030 -:10706000000000000000000000003C3C00000000A8 +:10706000000000000000E3E3282808000000000002 :107070000000000000000000000000000000000010 :107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 :1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 +:1070B000000000000000000000000000B1B1B1B10C +:1070C00000000000000000003828FFFF0A0A0C0042 :1070D00000000000000000000000000000000000B0 -:1070E0000000000000000000000000003C3C000028 +:1070E0000000000000000000FF0028280000000051 :1070F0000000000000000000000000000000000090 :10710000000000000000000000000000000000007F :10711000000000000000000000000000000000006F :10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:107150000000000000000000000000000000C0006F -:10716000000004000000C00000000000000000005B -:1071700000008800840084038400000000002003D5 -:107180000003880088002000000300008800000041 -:107190000000000020082000200020000400C000A3 -:1071A0002000C000200020002000C000C0004000DF -:1071B000C000C000200020002041C010200020009E -:1071C0002000C000C000C00020008808200020006F -:1071D000880384110000000000000000000000008F -:1071E0000000000000C000000000000000C000001F -:1071F00000000000000000004182000000000000CC -:1072000000C000820000000000C0000000C00000BC -:10721000000000000000000000000400000000006A -:10722000000000C0000000C0000000C0008200C0DC -:10723000000000C00000000000004100000000004D -:10724000000000000000000000000000000000003E -:1072500000000000008200000000000000000000AC +:107130000000000000000000000000000000B1B1ED +:10714000B1B10000000000000000383CFFFF0A0A57 +:10715000FF00000000008200000000000000C000EE +:1071600002000480000010000200210020008903BA +:107170000303020088008403C0038400C0032003CB +:10718000020000000008840020002000000500002C +:1071900020000000200020030003200320008803BB +:1071A0002003200300000000200004030200000070 +:1071B00088002000200002000408200020000403B2 +:1071C0002000200004000403200504050200041030 +:1071D0008803C003000000820082000000000082DB +:1071E000000080000008000080008000840080848F +:1071F000200020000000410000000000000000000E +:107200000000808200000000208200820000000058 +:10721000008200820000000000000000000000006A +:10722000200000000000000000000000000000003E +:1072300000000000000011000582000000001100A5 +:1072400000000400410091008000000000004100A7 +:1072500000000000054000000000000000000000E9 :10726000000000000000000000000000000000001E :10727000000000000000000000000000000000000E :1072800000000000000000000000000000000000FE :1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE +:1072A00000100004001000000000000000000000BA +:1072B00000000000000000000000000000040000CA +:1072C00000030000000000100000000000000000AB +:1072D00000000003000000000000000000000000AB :1072E000000000000000000000000000000000009E -:1072F000000000000000000000080000000000087E -:107300000008000000000000008400000008008465 -:107310000000000000080000000000840000008859 -:107320000008000800080008000800080082008427 -:10733000008400C000840082000800080084000867 -:107340000008000800080008000820842008410800 -:10735000208441084184040020080000900090002F -:10736000000000000000000000000000000000001D -:1073700000000000000900080000001000090000E3 -:1073800000000000000300000000000000000000FA -:1073900000410008904100000000000000090008C2 -:1073A0000000004100000000000000000009000093 -:1073B000000090000008000000090021000000000B -:1073C00000210021000000210000004100000021F8 -:1073D0000010000200000003000000210000000077 -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D -:1074000000000000000000000084000000000000F8 -:107410000000000000000000000000000000090063 -:1074200000000000000000000088000000000000D4 -:1074300000000000000000000000000000880000C4 -:10744000000000000000000000000000000000003C -:107450000000000000000000000000080000000024 -:1074600000000000000000080000000000004000D4 -:107470000400000000000000000000000000880080 -:107480009000000000000000A000000000000008C4 -:1074900000000000000000000000C000000000002C -:1074A0000000000000000000002100008400000433 -:1074B00000000000840000000000080082000000BE -:1074C00000000000820008050000000082000800A3 -:1074D000000000000000840000000000080082009E -:1074E00000000000200000000900118209A0000037 -:1074F00000C0000004080040000000880084000074 -:10750000000003820008008400900084000800004E -:10751000000040A0000000000000009000002000DB -:10752000000000C00000000000000082000003A076 -:1075300000A000900088000800C0000000080000C3 -:1075400000000000000800820000000003000000AE -:1075500000A00000000000A0000009004108000099 -:1075600040000000000000000000000000000000DB -:1075700000000021000000000008000000000000E2 -:1075800000000000000000000000000300080000F0 -:1075900000000003000000000208000000080000D6 -:1075A00000080000000000000008000000000000CB -:1075B00000000000000000000000000800000000C3 -:1075C00000000000000000000000000000000003B8 -:1075D0000000000000080000820000000000900091 -:1075E000000000000008000000000000000000840F -:1075F0000000002000080000000000000000000063 -:107600000000000000840084000000000000000072 -:10761000000000000000000000000000000000006A +:1072F000000000000000000000000000000000008E +:1073000000000000008421080008008800080084B4 +:1073100003080008000800080000000800080084B6 +:107320000008000800840008000800080084000825 +:107330000008000800080084000800880084008419 +:1073400000840008000000080008098400084108C3 +:1073500002082082000804040990000090008800C0 +:1073600000000000900088000000100010000000E5 +:107370000080000504200000000000000008000854 +:1073800000030008000500080000000000000041A4 +:1073900000080000000000210003000000000000C1 +:1073A00000080005000000100009000000000000B7 +:1073B0000021002100210021000000100008001021 +:1073C0000003001000210021001000000000002137 +:1073D00000100010000390210000000000000000D9 +:1073E000000000000000000000000000800080108D +:1073F00000000004000080010000008400084184B7 +:1074000000A0000800000010000000900000000034 +:107410000000000000C000000000000000000000AC +:1074200000000000000000000000000000900000CC +:10743000000000000000000000000000000000004C +:107440000000000000080300000000000000000031 +:10745000000000000000000000000808000000001C +:10746000000004400000000000000400880000004C +:1074700020000000000000000100C000000000002B +:1074800000000000010000000000000008000000F3 +:10749000C00000000000000008008400820000001E +:1074A000000000000000000000000000A0008200BA +:1074B00000000000400008000800000004008200F6 +:1074C000021008008200820000000000820082009A +:1074D000400082008200080090000200C00090007E +:1074E000040020000000040000201100000800003B +:1074F000004080820300040011000408040800001A +:107500000400400000C002A0219000080900000013 +:107510000000400000200000000000880000000083 +:10752000000000000300000005A00282001003001C +:10753000001000A002080000001000000210000867 +:10754000000000840508000004000000089000000E +:1075500004000000000000004000040000004000A3 +:107560000800000000000000000000000000000013 +:107570000000000400002021100800410005040064 +:107580000500000000000000000000000000821064 +:1075900000000800000000000041000000000000A2 +:1075A000000000000010000000400000000000008B +:1075B000000000000000000000000041000000008A +:1075C00000000000000000000000000000000010AB +:1075D00000000000000000000000040000000000A7 +:1075E000A000001100000000000000000000008466 +:1075F00000000000000900088000800020A00010AA +:1076000080A08408000000000000000000000000CE +:107610000000210000000000000000000000000049 :10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A :10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A +:10765000000000002000000000000000800000008A :10766000000000000000000000000000000000001A -:107670000000000000000000000200000000000008 -:107680000000000000000000020000030041002193 -:1076900000210000000800000008000300000000B6 -:1076A00000000000000000000000000000000000DA -:1076B00000000000000000000000000000000000CA +:107670000000000000000080200800000000001052 +:10768000C021000200004009040400080208002094 +:1076900000050041004100000041002100400000C1 +:1076A00000000000000000000000000008000000D2 +:1076B0000021000000000021000000000000000088 :1076C00000000000000000000000000000000000BA -:1076D00000000000000000050000000000000005A0 -:1076E0000000000000008403000000000400040803 -:1076F000008200A011000090000000A040004000A7 -:10770000009000A00000008400000000201000A0F5 -:107710000000119009001104080000202000000062 -:10772000008800000000008200000000000000004F -:1077300020100000000000100900000000080000F8 -:107740000000200000A00000000000000000000079 -:107750000000000000000000000000000000000029 -:107760000000000000000000000000000000000019 -:107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 -:1077900000000000000000000000000000000000E9 -:1077A00000000000000000000000000000000000D9 +:1076D0000010000000000000000000000400820014 +:1076E000002100000000A00000C0002000002000D9 +:1076F000009020002088000800040000000800041A +:1077000000080000200003900000000008100000A6 +:1077100000000000400400000402004000000000DF +:107720000088008208004120000000840000000062 +:107730000000000000000000000000000000000049 +:1077400000000000000000000040000000000000F9 +:1077500000000000000000000000000000008000A9 +:1077600000000000000000000020000000000000F9 +:107770000000000200000004000400C0C0000085FA +:107780000082000000000100000000C000000008AE +:1077900000080000000400040004000000000000D5 +:1077A00000000000000000000000000300000000D6 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 :1077D00000000000000000000000000000000000A9 :1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 -:107810000000000000000000000000000000000068 +:1077F0000000000000000000000000000000800009 +:1078000009110080000000000200000000000000DC +:1078100000800080000000800000000000000000E8 :107820000000000000000000000000000000000058 :107830000000000000000000000000000000000048 :107840000000000000000000000000000000000038 :107850000000000000000000000000000000000028 :107860000000000000000000000000000000000018 -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000000E8 +:1078700000000000000000000084008000000009FB +:1078800000C14002000000040000000900000000E8 +:107890000085000000000000009100800000000052 :1078A00000000000000000000000000000000000D8 :1078B00000000000000000000000000000000000C8 :1078C00000000000000000000000000000000000B8 :1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000000000000000000098 -:1078F0000000000000000000000000000000000088 -:107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 +:1078E0000000008000000000000000000000000018 +:1078F0000000000000000000000000080010000070 +:107900000000000801880000000000A0000000C086 +:1079100000000008008400000000000800080000CB :107920000000000000000000000000000000000057 :107930000000000000000000000000000000000047 :107940000000000000000000000000000000000037 :107950000000000000000000000000000000000027 -:107960000000000000000000000000000000000017 -:107970000000000000000000000000000000000007 -:1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 -:1079A00000000000000000000000000000000000D7 +:107960000000000000100000000200000000000005 +:107970000000000000000000000040000000C00007 +:107980001000840104001000C00001008200040007 +:107990000000080000000000A00040000000C0003F +:1079A00008000000000000000000000000000000CF :1079B00000000000000000000000000000000000C7 :1079C00000000000000000000000000000000000B7 :1079D00000000000000000000000000000000000A7 -:1079E0000000000000000000000000000000000097 -:1079F0000000000000000000000000000000000087 -:107A00000000000000000000000000000000000076 -:107A10000000000000000000000000000000000066 -:107A20000000000000000000000000000000000056 +:1079E0000000000000000000400000000000000057 +:1079F0000000000000000000000000008000000007 +:107A000080008000002000008000020004000000D0 +:107A100000000400800000000000800080000000E2 +:107A20008000800000000000000000000000000056 :107A30000000000000000000000000000000000046 :107A40000000000000000000000000000000000036 :107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 -:107A70000000000000000000000000000000000006 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 +:107A6000000000000000090000008000000000008D +:107A70000000000000000000000000000000800086 +:107A800000000000000000048000800011000000E1 +:107A90000005000000000000800080008000000061 :107AA00000000000000000000000000000000000D6 :107AB00000000000000000000000000000000000C6 :107AC00000000000000000000000000000000000B6 :107AD00000000000000000000000000000000000A6 -:107AE0000000000000000000000000000000000096 +:107AE0000000000000000000001000400000000046 :107AF0000000000000000000000000000000000086 -:107B00000000000000000000000000000000000075 -:107B10000000000000000000000000000000000065 -:107B20000000000000000000000000000000000055 +:107B00001000020004000400C00020008800C10032 +:107B100000000000000000008800020008000800CB +:107B2000820040000400040000000000000000008B :107B30000000000000000000000000000000000045 :107B40000000000000000000000000000000000035 :107B50000000000000000000000000000000000025 :107B60000000000000000000000000000000000015 :107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000000D5 +:107B800000000000000000000042840000600000CF +:107B900048004842006006000000000000000000AD +:107BA0000000000000000000004200000000000093 :107BB00000000000000000000000000000000000C5 :107BC00000000000000000000000000000000000B5 :107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000000095 -:107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 -:107C10000000000000000000000000000000000064 -:107C20000000000000000000000000000000000054 +:107BE000000000000000000000000000000A00008B +:107BF000060000000000000000000000000000007F +:107C000000000000DCD01C10000000004141CF0C3F +:107C1000000000000000000000000000CDC10D01C8 +:107C2000000000003D0D31010000000000000000D8 :107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 :107C50000000000000000000000000000000000024 :107C60000000000000000000000000000000000014 :107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 +:107C8000000000000000DFD31F13000000007D7D16 +:107C9000CF0C000000000000000000000000FDF11B +:107CA0003D3100000000FDCDF1C1000000000000EA :107CB00000000000000000000000000000000000C4 :107CC00000000000000000000000000000000000B4 :107CD00000000000000000000000000000000000A4 :107CE0000000000000000000000000000000000094 :107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 -:107D20000000000000000000000000000000000053 +:107D000000000000000000008080B0B00000000013 +:107D1000F5F54141000000000000000000000000F7 +:107D200002023232000000002CEC2CEC00000000BB :107D30000000000000000000000000000000000043 :107D40000000000000000000000000000000000033 :107D50000000000000000000000000000000000023 :107D60000000000000000000000000000000000013 :107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 +:107D8000000000000000000000008383B3B3000087 +:107D90000000F5F5EBEB0000000000000000000023 +:107DA0000000C2C2F2F2000000002FEF2FEF00002F :107DB00000000000000000000000000000000000C3 :107DC00000000000000000000000000000000000B3 :107DD00000000000000000000000000000000000A3 :107DE0000000000000000000000000000000000093 :107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 +:107E00000000000000000000000000000000300042 +:107E10000000000000003007C00C000005610A3FB0 +:107E2000C50D00A000003000000000000000300080 :107E30000000000000000000000000000000000042 :107E40000000000000000000000000000000000032 :107E50000000000000000000000000000000000022 :107E60000000000000000000000000000000000012 -:107E70000000000000000000000000000000000002 +:107E700000000000000005000A38050000A0000016 :107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 +:107E900000000000000000003C3C3C3C00000000F2 :107EA00000000000000000000000000000000000D2 :107EB00000000000000000000000000000000000C2 :107EC00000000000000000000000000000000000B2 @@ -190494,7 +190494,7 @@ :107EE0000000000000000000000000000000000092 :107EF0000000000000000000000000000000000082 :107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 +:107F1000000000000000000000003C3C3C3C000071 :107F20000000000000000000000000000000000051 :107F30000000000000000000000000000000000041 :107F40000000000000000000000000000000000031 @@ -190502,7 +190502,7 @@ :107F60000000000000000000000000000000000011 :107F70000000000000000000000000000000000001 :107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 +:107F90000000000000000000000000000F0F00FFC4 :107FA00000000000000000000000000000000000D1 :107FB00000000000000000000000000000000000C1 :107FC00000000000000000000000000000000000B1 @@ -190510,177 +190510,177 @@ :107FE0000000000000000000000000000000000091 :107FF0000000000000000000000000000000000081 :108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 +:1080100000000000000000000000000000000F0F42 +:1080200000FF000000000000000000000000000051 :108030000000000000000000000000000000000040 :108040000000000000000000000000000000000030 :108050000000000000000000000000000000000020 :108060000000000000000000000000000000000010 :108070000000000000000000000000000000000000 :1080800000000000000000000000000000000000F0 -:1080900021802180410000000980418021000000F2 -:1080A000018841802100080001881180090000003A -:1080B000838004C02084040001A000C00082040565 -:1080C000008000C000C0201088A004C020A00000D4 -:1080D00000002180218041802000018521800380D3 -:1080E00020058900898041C020008880898021C0C6 -:1080F0009005218021112110200509888800201079 -:108100001005208889050400890588880409201144 -:108110000000C010C04088080000C008A040C00097 -:1081200000000821A040C00080002011C040C00015 -:108130000020200820050003002020092021202104 -:108140000000000820212003000000092003004156 -:108150000000000004040404824000001004C02059 -:10816000C002000020A04020820300002020020264 -:108170000221000008200220C0000900A021040004 -:10818000A0008000002102008400100004210000F3 -:1081900004C000000000000000000000000000001B -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000800080000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000100000000001008E -:1081E000000000000000000000000000000000008F +:1080900001802100090000008490210021000000DF +:1080A0000090218041000100008421C021001000C7 +:1080B000888420A0208290000884208284A0000070 +:1080C0008884208220C0000000A020C08882000098 +:1080D00020102088208220A088002088208220A0D4 +:1080E00085002088208220820500888820C020A06A +:1080F0008910858820902080050020842080210020 +:1081000005108488208021008810888820852141DE +:10811000002040088408C00800000003C008C00810 +:1081200000000009C040A00008000009C009880044 +:108130000000000900050041000080090021200323 +:1081400000000009002100050000000900032021B3 +:1081500000000000001100210003000000110005D4 +:10816000000510000011002100211000000500038F +:108170000003100008050040000210200911004013 +:108180004000108400050440040000100005004079 +:10819000209000000000000000000000000000002F +:1081A000000000000000000000000000008000004F +:1081B00000000000000000800080000000800080BF +:1081C000008000000000000000000000000000002F +:1081D000000000000000000000000000000000009F +:1081E0000000000000000000000400000000000586 :1081F000000000000000000000000000000000007F -:10820000000000000000000000000000000000006E +:10820000000000000000000000040000000000006A :10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E -:1082300000000000000000000020004000080000D6 -:108240000000000000080008008400000084008492 -:1082500000080008000000080008000800080008E6 -:1082600008000008000800080008000800080008CE -:1082700000000008000800080008001000080008BE -:10828000000800080008200809082008090820083C -:108290002008000809080000040001002000000078 -:1082A00005000100000000000105040300100008A3 -:1082B00004000503200000210400402105080005FA -:1082C00000002088210800030500008804800008C1 -:1082D0000000000000800000000301050103010010 -:1082E0000010010321000300010305050100040043 -:1082F0000000102101210080001010210000002149 -:10830000011000100041010500030141000301219B -:108310000003000301000000000080000400800052 -:108320000000A00004000000000020008000000009 -:1083300000008000A000800000008000800082001B -:1083400000000000800282000000A0000002800403 -:108350000000000000000002000000001000020009 -:10836000040000000400820084001000900002005D -:108370008300000080084000030200008000000825 -:108380000800100041000800400003002000000029 -:10839000400000000000020000900000000000000B -:1083A000000000000000400000000000000000008D -:1083B000000004000000A000000000000000000019 -:1083C0000000820008009000000000000000000093 -:1083D0000000000000000000000000000000080095 -:1083E000400020000000C000040020002000080021 -:1083F0000400200010002000080004001000C0004D -:10840000C0000280C0008200C0000400C000400024 -:1084100004002000C000C100C000A1000000000056 -:10842000000000000010000000000000000000003C +:10822000000000000000000000000000000000103E +:108230000000000000000000000200200084002078 +:108240000004000400080008000800000008000006 +:108250000008000800000008000800080008008866 +:10826000000800000008000800080008008400085A +:1082700000080008001000080008000800840084BE +:10828000000800080082200820080408048404086C +:10829000200809080408000008000300200000006E +:1082A00004800480000000212088000500000021D7 +:1082B0000400000301080008040800A10085001064 +:1082C0000008008000A1000004410203040800032C +:1082D00020000000020300000000202000C000C0B9 +:1082E0000000208000A00082001020A100900088E3 +:1082F00000030441000000880021042100000188DF +:10830000000010C000000088000504100003018870 +:10831000002182000000010300008000C0008000F6 +:108320000000800480400000000080200000000069 +:108330000000C100000040100000C1000040000427 +:108340000000000000400040000080A0A0A080A02D +:108350000000800000A082A0000000008001000555 +:108360000005000080200041004100008020004006 +:1083700000040000820000000040000080000000B7 +:1083800002040000802041000004034080A000A0FF +:1083900040040010038400000400000000000000FE +:1083A000000000000000A0000000000088000400A1 +:1083B00000000400040082000000000040000000F3 +:1083C0000000040082000000020000000000000025 +:1083D000000088000000000010000000C000C00085 +:1083E000A000C000100040000000000002000000DB +:1083F00000000000880004000400000008000800DD +:10840000A000000082000800820004000200820038 +:10841000C000C00008000400A000A0000000000090 +:10842000000000000040000020000000000000826A :10843000000000000000000000000000000000003C -:10844000000000000082801000000000000000001A -:10845000000000000000000000000000000000001C -:10846000800080008000000000008000800000008C -:10847000800080008200800080000000800080007A -:1084800000000000802000000000000080000000CC -:1084900000000000800004002000030040000000F5 -:1084A0000080000000000008000300000005000834 -:1084B0000008004100000000000300050000000863 -:1084C0000008000000000000000000100000000094 -:1084D00000000000000800030090000000100000F1 -:1084E0000000000020000010004100080000001003 -:1084F000001000000005048000000041C00040039F -:1085000000212000822182000000A00002008200E1 -:108510000000C000C000A0000000002100212021B8 -:10852000000000080008000000000000000000003B -:108530000000000000000000000000000008000033 -:108540000000000000080000000000000000000023 -:108550000000000000000000000000040000000017 -:108560000000000000A0800008000000000000A043 -:108570000000000000A000008004001000000000C7 -:10858000801000008000000000000000000080005B -:108590000000000000000000000000000084000057 -:1085A00080000000000000000000002100000041E9 -:1085B0000200002100004008002100000408022100 -:1085C0000008000000410041000000210040004080 -:1085D000000000100000000000000011002000005A -:1085E0000000000000210010004100000000001009 -:1085F00000100041000000000000002100000010F9 -:108600000010002100008205000000410000002150 -:10861000000004000000000000000803000000004B -:10862000080004000000000000000000000000003E -:10863000000000000000000000000000000000003A -:10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A +:108440000000000000000000000000080000000024 +:10845000000000000000008200000000000000009A +:108460000000000000000800000000000000000004 +:10847000410000C0000000000000000000000000FB +:10848000000000000000000080000000000000006C +:10849000000000000010090003004100030000007C +:1084A0000180000000000008010300000000000837 +:1084B0000000042000000008002104050021000045 +:1084C00000030003000882080010A0000000000064 +:1084D00000000000C100A00002080200000000002F +:1084E0000005000000050021000800418800001080 +:1084F0000003000000000100000000100005004023 +:1085000000000041002104050800001000000400E4 +:10851000000000000000A000100000C100004000AA +:10852000000004040000000000001008000000002B +:108530000000000080C0000000000000800000007B +:10854000000000C00000000000000000000000006B +:1085500000000000000040000000000000000000DB +:10856000000000000000000000000000000000000B +:1085700000A0000000000000020000000000000059 +:10858000000000000000000080000000000000006B +:1085900080000000000000000000800000200000BB +:1085A000800000000000880000004011000002214F +:1085B000400004000000000300000000000020084C +:1085C00040000000000040080021000008000020DA +:1085D000000420200000000000000040000088048B +:1085E000000000000000002100000000001000005A +:1085F000000800410000000000040010000000001E +:108600000200000300000000000300000000000062 +:1086100000004021000000008200400020410000D6 +:1086200004004000000009000200000000000000FB +:108630000000020000000000000800000000000030 +:108640000200000000000000000000000000000028 +:108650000000000000000000000000000000020018 :108660000000000000010000000000000000000009 -:10867000000000000000000000100090000000104A +:108670000082000000000000000000000000000078 :1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA -:1086A0000000000080000100A001000100000100A6 -:1086B000A001000100000000820001010000000094 -:1086C00000000101000000010400000100000100A1 -:1086D0008200000100000000000001010000000015 -:1086E000000000000000000101000001000800017E -:1086F0000000C100008500010000C00001900001E1 -:1087000001000100001100000100C0010021000172 -:108710000100C00000C100010100C00000C1000153 -:108720000100C00000C10101400900030220020055 -:1087300004040005020500000041000040030000A1 -:10874000000200004002000000408000050300001D -:108750002011000040030000000900004005000057 -:10876000400900004041000000004041110300C1E9 -:1087700000410041830200200003024189020241BE -:1087800000030341100941C00000034180414183BF -:1087900000030341800041830003034180004183C3 -:1087A000000303418000418305030480040000C1ED -:1087B00080004100C0000084800004000300000429 -:1087C00000804100030000408000410920000009B2 -:1087D00000004004210000000000410809000002E0 +:1086A00000000000000000010201010100000000C4 +:1086B00000010001000000000000000000000000B8 +:1086C0001000000100000100000000000000000098 +:1086D0008200000100000100000001000000000114 +:1086E00000000100000000010000840100020101FF +:1086F0000000C101004100010000C1010140000172 +:1087000001008201002001000100C00100410001C0 +:108710000000C00000C100010000C00000C1000155 +:108720000000C00000C10001000800030320000099 +:1087300000020003100800000511000002050000FF +:108740000541800004020000020400000541000011 +:1087500000410000400300000241000040410000D1 +:1087600040080000204100000000044111030041C6 +:10877000034102418305008421032041830502C097 +:1087800021030341200500C103000541804100830E +:10879000000300418000008300030041800000834B +:1087A00000030041800000830003048004000000F7 +:1087B0008000200004000000808004020380008408 +:1087C00000800200A000000580004111A00000020E +:1087D00000804004A000000400004009850000095A :1087E0000000414102000040000000004100000084 -:1087F0000041090041000000004108004100000064 -:10880000004141004100000000410900410000001A -:1088100000410300412100800041038041000080AD -:1088200000410380410000800041038001401100AD -:108830000082100400002100008310840000A100C9 -:1088400000A002040000C1000041408400000510A7 -:10885000000000000101C000000000000000A000B6 -:10886000000000A0000185000001000000000100E0 -:108870000000000100820000000000010002000072 -:1088800000000001010000000000000100000000E5 -:108890000000000101000000008200010140000012 +:1087F0000041110041000000004140804140000064 +:1088000000414180414000800041118041020080D0 +:10881000004103804100008000410380410000804E +:1088200000410380410000800041038001C010002E +:10883000000810020100050000C040200100834034 +:10884000004090040000210000A182840000830009 +:108850000000000401018300000100040100020087 +:1088600000000000000141000001000000000100C4 +:108870000000000100840000000000010040000032 +:1088800000400001014000000082000100400000A3 +:108890000082000101400000008200010140000050 :1088A0000082000101400000008200010140000040 -:1088B00000000000000000000000C00000000000F8 -:1088C0000000840000000000000004000000000020 -:1088D00000008400000000000000C0000000000054 -:1088E0000000100000000000000084000082000072 -:1088F0000000000001010100000000000100010073 -:108900000000000001000001000000000100010162 -:1089100000000000C101000100000000C1000001D2 -:1089200000008200C100000000008200C1000000C1 -:108930000000000400000000000000000000000033 -:10894000000000000000090000000000000002001C -:108950000000000000000000000000000000000017 -:1089600000000000804100000000000000000080C6 -:10897000000000000021052004080000002105047B -:108980004011000000000311001000000000050469 -:10899000200300410000C141000300410000C1214B -:1089A000000321418000C100410000418000C1005E -:1089B00021001180001100800800008000800080EC -:1089C0001100000080800080110000800080008085 -:1089D0000400008000800000000000000080000013 -:1089E000000000C180000000000000048089000930 -:1089F00000000000000480000000000400410000AE -:108A0000000000090000000400000009000200212D -:108A100000200040410300410041000041030041AB -:108A20000041008041000005000000804100000579 -:108A30000000008000C00200008200000008C0406A -:108A40000008000000824082000800000040040886 -:108A500000840000004010080000000000A0044056 -:108A6000000000000041100400000000000520404C -:108A700000000000000000001000000000000001E5 -:108A8000040000000000000084000000000000005E -:108A900000000000000000010001000000000001D3 -:108AA00000010000008400000001000000820000BE -:108AB00000010000008200000000000042000000F1 +:1088B0000000840000000000000000000100000033 +:1088C00002000000010000000000000000000000A5 +:1088D0000000080000000000000000000000000090 +:1088E0000000820001000000000000000082000083 +:1088F0000000000001000000000000000000000176 +:108900000000000011000000000000000001000055 +:1089100001008200C101000100008200C1000001CD +:1089200000000000C100000000000000C1000000C5 +:1089300000000011000000000000000000004000E6 +:1089400000000000000040000000000000000400E3 +:108950000000000080000000000000000000000097 +:108960000000000000412000000000000000048022 +:108970000000000000040541040900000021091066 +:1089800009030000000083410009000000004105C8 +:10899000084104418000C141410300410000C14140 +:1089A000000300410000C100000000410000C100C0 +:1089B0000000098200210000030000008000008008 +:1089C00041000011008000801100000000000080C4 +:1089D000090000800000000000000082008000000C +:1089E000000000C180000000000000208089000518 +:1089F000000000000002001100000003004180029E +:108A00000000000200028004004000910004000504 +:108A100000030021410300410041000041030041E7 +:108A200000000000410000000000000041000000C4 +:108A300000000000004088000004010000A0820443 +:108A40000008000000C020200084000000C088C092 +:108A500000840000004040840000000000098420E1 +:108A600000000000004182C00000000000850220DC +:108A70000001000000000000C00000000001000133 +:108A8000820000000001000040000000008400009F +:108A900000010001000000010001000000000001D1 +:108AA00000010000000000000000000000000000C5 +:108AB0000000000000000000000000004200000074 :108AC0000000000000000000008400000000000022 :108AD0000000000000000000000000000000000096 :108AE00000600000000000000000000048000000DE @@ -191468,47 +191468,47 @@ :10BBC0000000000000000000000000000000000075 :10BBD0000000000000000000000000000000000065 :10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000020000000000025 -:10BC00001080200000000000000004000000000080 -:10BC10000000040000000000000000000000000020 -:10BC200000000000000040000000000000000000D4 -:10BC300000000000000040000000000000000000C4 -:10BC40001000000000000000000090000000000054 -:10BC50000000C000C00000002000A00000000000A4 -:10BC600000000000C0002000C0000000080002002A -:10BC7000880000000800020088000000800000002A -:10BC80000000802080000000000000008000000014 -:10BC90000000000080000000000000000000000024 -:10BCA0000000000000000000800000000000000014 +:10BBF0000000000000000000040010000000000031 +:10BC00001000080002000000040010000200000004 +:10BC1000880088000200000020002000880040000A +:10BC200088008800200040000000200020008800DC +:10BC300020002000200088000000200020002000BC +:10BC400020002000200020002000C0000000200074 +:10BC500020002000200020002000C000C0002000A4 +:10BC600020002000200020002000100040000200E2 +:10BC70004000880088008800880080008000000064 +:10BC800000008000800080000000800080008000B4 +:10BC90000000000000008000000000000000000024 +:10BCA0008000000000000000800000000000000094 :10BCB0000000000000000000000000000000000084 :10BCC0000000000000000000000000000000000074 :10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000800000002000C100F3 -:10BCF000C10000004000A000C0002000210005009D -:10BD000001000000010005000200000011002100F8 -:10BD100001000000012021000200000000000000DE -:10BD200000000100000020000000410000000000B1 +:10BCE000000000000000000000000000200009002B +:10BCF000A0002000400040002000200000002100A3 +:10BD000000000000000021000000000000002100F1 +:10BD10000000000000002100000000000000000002 +:10BD200000000000000000000000002000000000F3 :10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD60000000030000000500090041000000010080 -:10BD700021004100000005001100050001008400C1 -:10BD80009000020000002000900080000000A00051 -:10BD900090000200000020019000800000000000E0 -:10BDA000200000004000200000000000840000008F -:10BDB00020000000000000002000008200000000C1 -:10BDC0000000000000000000000000000000200053 -:10BDD0000000000000000000000000000000000063 -:10BDE000000800008400000090009000840000849F -:10BDF00004849000840000009000A000A0002000B7 +:10BD400000000000000000000008000800000000E3 +:10BD500000000000000000000000000000000008DB +:10BD60000000012000001100010005000000000596 +:10BD700011000500000504000400000000000000A0 +:10BD800084000000000000008400000000000900A2 +:10BD90008400000000000000840000000000090092 +:10BDA0000000000000000000000000000001000092 +:10BDB0000000000800000000000800000000000073 +:10BDC0000000000800000000000000040000090856 +:10BDD00000080908000800000000400800000000FA +:10BDE0000000008420010000840004848208008494 +:10BDF00000088808A00800008000800800000000FB :10BE00000000000000000000000000000000000032 -:10BE1000000000000000000000000000000800001A -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000008000000000000000000000000EA -:10BE500000000000000000000000000000000000E2 +:10BE10000000000000000000000000000000000022 +:10BE2000000000000000000500000000000000000D +:10BE300000000008000000000000000000000000FA +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000400000000000000000A2 :10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 +:10BE70000000000000210000000000000021000080 :10BE800000090000000000000000000000000000A9 :10BE900000000000000000000000000000000000A2 :10BEA0000000000000000000000000000000000092 @@ -191516,56 +191516,56 @@ :10BEC0000000000000000000000000000000000072 :10BED0000000000000000000000000000000000062 :10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000800050035 -:10BF00000000000000080100000000000000010027 -:10BF100000210000002000100000000001000010BF -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000005EC -:10BF500000000000000800000000000000000000D9 -:10BF600000000000000000000000000408000000C5 -:10BF70000104C100100800000100000400000000DE -:10BF8000010082000008000108000000000000001D -:10BF90000800000000000001000100000000100087 -:10BFA000000100000000000000000000000000840C -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 +:10BEF0000000000000000000000000000800080032 +:10BF00001000040010000800000000000500C1003F +:10BF10000000000011008300C00000210500100097 +:10BF200000000000C00082000000C00008000800FF +:10BF300000000400820082050000000082008200F0 +:10BF40000000C000000082008200000000008200AB +:10BF5000820000000000820000000000000082005B +:10BF60008200000000008200080000001000820033 +:10BF70008300840010008220832002008200C0859C +:10BF800008802000A0008000800000000000A000C9 +:10BF9000100000000000A0000800008200009000D7 +:10BFA000800800000000000000A000000000000069 +:10BFB00000080000800000080000000000000000F1 +:10BFC00000000000000000000000000000A00000D1 :10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000001000050 -:10BFF0000000040102000000000004000001000035 -:10C00000000004000000000000000000000000002C -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 +:10BFE00000002100000008000800000000008000A0 +:10BFF0000800100000000000000120010000000007 +:10C0000008088004800000002000000002000000FA +:10C01000000000000000C000000000000000000060 +:10C0200020000805000000000000000000000000E3 +:10C0300000000000000000000800000000000000F8 :10C0400000000000000000000000000000000000F0 :10C0500000000000000000000000000000000000E0 :10C0600000000000000000000000000000000000D0 -:10C0700010000000000000000000000000000000B0 -:10C0800000000000000000000000000000000000B0 +:10C07000000000002000000000000000A000000000 +:10C0800000000000000002000000800000008000AE :10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 +:10C0A0000000800080000000000000000000000090 :10C0B0000000000000000000000000000000000080 :10C0C0000000000000000000000000000000000070 :10C0D0000000000000000000000000000000000060 :10C0E0000000000000000000000000000000000050 -:10C0F00000008000000000000000000000000000C0 -:10C10000000000000000000000000000000000002F +:10C0F00000000000000080000000000000000000C0 +:10C1000000000000000000008000000000000000AF :10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000210000DE -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000008D7 -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF +:10C1200000000000010000080100000000000008FD +:10C1300000000100000000000000000800000000F6 +:10C1400000000000000000080000000000000000E7 +:10C1500000000000000000000000000000000000DF +:10C1600008000000000000000000000000000000C7 +:10C17000000001000000000011000180000000002C +:10C180000000010008000000090009000080000014 :10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F +:10C1A00000840008000004000508020000000000F0 +:10C1B000000000004000000000000000000000003F +:10C1C000000000000000000000000000030000006C :10C1D000000000000000000000000000000000005F :10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E +:10C1F00000000000020800000000080840040000E1 +:10C200004100000040000000000010000400000495 :10C210000100C000014000000100C000014000001A :10C220000100C000014000000100C0000141000009 :10C23000010000000040000001000000004000007C @@ -191712,192 +191712,192 @@ :10CB00000000000000000000000000000000000025 :10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000100010000000B5 -:10CB600000000000400040004000400000000000C5 -:10CB700000000000000340004000000020002000F2 -:10CB80000000000010002000200020002000000015 -:10CB900000000000000020001000880010002000AD -:10CBA00000000000200020004000200020000000C5 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 +:10CB300000000000000000000000000000000400F1 +:10CB400002000000840084001000020084008400C1 +:10CB50000000080084000000A00002004000200047 +:10CB600020004000200020002000200008000800D5 +:10CB700002002000000220000000200020008800A9 +:10CB8000C000880088002000200040002000C00075 +:10CB90008800200020008800840020002000200061 +:10CBA0002000C0002000880000002000200020009D +:10CBB0008400880010000000000000000000000059 +:10CBC00080008000000000000000000080000000E5 +:10CBD0000000000080000000000000008000000055 +:10CBE00000000000000000000000000000008000C5 +:10CBF0008000800000000000000000000000000035 :10CC00000000000000000000000000000000000024 :10CC10000000000000000000000000000000000014 -:10CC200000000000000000000000210010001000C3 -:10CC30002100400000000000000000000000000093 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000400040004000400C4 -:10CC600000000000000000000400040004000400B4 -:10CC700000000000000000000000000000000000B4 +:10CC2000000000000000000020002000090040007B +:10CC30004000100040002000000000000000000044 +:10CC400000000000000000000000000001000000E3 +:10CC5000000001000100010000004005000000008C +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000500000000000000000000AF :10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC000000000000500000000000000000000005F -:10CCD00000000000000000000000850080008000CF -:10CCE0008000000000000000000080008000800044 -:10CCF00080000000000000000000000000000000B4 -:10CD00000000000000000000000000000000000023 -:10CD1000000000000000000000000000000800000B -:10CD200000080000000000000000000000000500F6 -:10CD300005000000000005000008000800000000D9 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD7000000300000000000000000000000000218F -:10CD80000000002100000000000000000000012061 -:10CD90000120002000A000000000000000000000B2 -:10CDA0000000000300000000000000080000000078 -:10CDB0000000000000000000000000000000000073 +:10CC90000000000000000000000001000000010092 +:10CCA00085004000000000000000910021004100CC +:10CCB000010500000000A0090000000000000000C5 +:10CCC0000000000000000000000000000000100054 +:10CCD00000000000100010000200000080000000B2 +:10CCE000000000000000000000000000000000083C +:10CCF00000000000000000840000000000840084A8 +:10CD00000008000000080000000000000000000013 +:10CD100000080008000000080008000802080000E1 +:10CD20000808040880840008000400004084C084CF +:10CD3000A0084082000000882084008800000000D5 +:10CD400000000000000000000000000000000100E2 +:10CD500000000000000000000004000000090008BE +:10CD600000080021004100210021002100000040B6 +:10CD70000002000800100008000800080000000081 +:10CD8000000000000000000000080008000000088B +:10CD9000000800000000000000000000000000008B +:10CDA000000000000000000000000000000000087B +:10CDB000000800000000000500050005000000005C :10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 +:10CDD0002000000000000000000000010000000032 :10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE0000000000000008000000000000000000001A -:10CE100004010401000100210000000000000000E6 -:10CE200000000800000008000000040004000000EA -:10CE300000000800000000000000400000000000AA -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE9000000000000000040000000000000000008E -:10CEA0000000000010000000000000000000000072 -:10CEB000000010008200010000800000000000005F -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 +:10CDF0000000000000000001000000000000000032 +:10CE0000000000000000000008000000000000001A +:10CE10000000000000000000080008000000000002 +:10CE200000000000030000000000000000000000FF +:10CE300000000000000000000300100000000000DF +:10CE4000000000000000000000400500002000007D +:10CE50000100000820040000000000000100100094 +:10CE60000000000000000000000000000000820040 +:10CE700000000000000000000800000041098200DE +:10CE80000000C000000000000000080008000800CA +:10CE9000080082000000080000000000000082007E +:10CEA0000000080090000800000040000000820020 +:10CEB000000041001000A000010008000000080070 +:10CEC00000000000000000000000000182000001DE +:10CED000000020000001C10100000000008220A02D +:10CEE000A10000000000000000A00000000000A061 +:10CEF00000000000000000000000000000008200B0 :10CF00000000000000000000000000000000000021 -:10CF10000000000000000000800000000000000091 -:10CF20000000000000000000000000000000000001 -:10CF3000000000008000000020840004000000A029 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000003AE +:10CF10000000000000000000000000000000000011 +:10CF200000000000000000A08000000011000000D0 +:10CF300000000000200000000000200000000000B1 +:10CF4000000000820000000002000000000000005D +:10CF50000000020010009021020800000000000004 +:10CF60000008C011000800000000000000080000D8 +:10CF700000000000000000000000000000000800A9 :10CF80000000000000000008000000000000000099 -:10CF90000000000000000000000000000000000091 -:10CFA0000000000000080000000000000000000079 -:10CFB00000030000900000080000000000000000D6 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 +:10CF9000000000000000000000000000000082000F +:10CFA0000000000000000000000000000000000879 +:10CFB00000000000000000000800000400008200E3 +:10CFC00008000000900000000000000000000000C9 +:10CFD0000000000080008000000000000000000051 :10CFE0000000000000000000000000000000000041 :10CFF0000000000000000000000000000000000031 :10D000000000000000000000000000000000000020 :10D010000000000000000000000000000000000010 :10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 +:10D0300000000000000000000000000000010000EF :10D0400000080000000000000000000000000000D8 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D080000000000500000005000000000021000075 -:10D09000002100000000000000000000000000006F -:10D0A000000000000000002100000000000000005F -:10D0B0000000000000000000000000000000000070 -:10D0C0000008000000000041000000000000000017 -:10D0D000000000000000000000000000000200004E -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 +:10D0500001000000000002800008400800211100CB +:10D060001088000800210100000000410009002193 +:10D07000002100000021000000000000000000006E +:10D0800000000000000000000000000000000000A0 +:10D090000008000000000000000000000000000088 +:10D0A00000000000000000008200000000000000FE +:10D0B0000000000090080811000500000000002199 +:10D0C0000008C0110009002100000000000000005D +:10D0D00000000400000000A08020000100C100004A +:10D0E000A0008005000100002000000000000300F7 +:10D0F00000A0000000000000000000000000000090 :10D10000000000000000000000000000000000001F :10D11000000000000000000000000000000000000F -:10D1200000000000000000000008000000000000F7 -:10D130000000000000080000000000840000000063 +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF :10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F +:10D15000000000000000000000000090000090822D +:10D16000010800C001100004010200000000008856 +:10D170001008000200000000000000000000000095 +:10D180000000000000A0014020040008000300008F :10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000001006E -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E +:10D1A000000000000000000000000000000000027D +:10D1B0000082009004020000000000000000000156 +:10D1C00004008801000100000000000000000000D1 +:10D1D00000000000000000000000000000800000CF +:10D1E0000080408000102000000940000000000086 +:10D1F000100082800000000000000000000000001D +:10D20000000000000000008041800000008000005D :10D21000000000000000000000000000000000000E :10D2200000000000000000000000000000000000FE -:10D2300000000000000000000000000000000000EE -:10D2400011002100000000000000000000000000AC -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000800000008000000000000000009E +:10D230000000008000008080000200020009001051 +:10D240000011054040080020000000000000000020 +:10D2500000000000000000000000008000000080CE +:10D26000118900080003008011110008808200006D +:10D270000900001002001000000000000000000083 +:10D280000000000000000000000000081120210044 :10D29000000000000000000000000000000000008E -:10D2A00000000000008000000000000000000000FE -:10D2B000000000000000000000000000000000006E -:10D2C0000000004109000003008000000000000091 -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F00000000000008800000002000000000000A4 -:10D30000000000000008000000080000000000000D -:10D31000000000000000000000000000000000000D -:10D3200000000000000000C000000002000000003B -:10D3300000000000000000000000000000000000ED -:10D340000000000000010100000000880000000053 +:10D2A000000000000000000000000000000000007E +:10D2B00000008000000980008000000000000000E5 +:10D2C000000040880000090803080000000000007A +:10D2D00000000000000000000000000088080000BE +:10D2E000001001100003001100040100A088084094 +:10D2F0000000000000890010000000000000000095 +:10D30000000000000000000000000000000100A07C +:10D31000010000000000000000000000000000000C +:10D3200000000000000000000000000000000000FD +:10D3300000000000A0008800A08808820000000013 +:10D3400000000000011100000000010100000000C9 :10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D37000000000000000000010000000000000009D -:10D38000000000000000000002000000000000009B -:10D39000000000000000000000000000000000008D -:10D3A000000000000000010000004000000000003C -:10D3B000000000000000000000000000000000006D -:10D3C00000000000000000008800000001000000D4 -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F0000000000000000400000000000000000029 -:10D40000000000000000020000000000000000001A -:10D41000000000000000000000000000000000000C -:10D420000000000000000000080000008000000074 -:10D4300000000000000000000000000000000000EC -:10D44000000000000000000000000000000041009B +:10D3600004080000C000080100000200C000200105 +:10D370000000090040000001C00111010000000090 +:10D38000000000000000000000000000100000008D +:10D39000000010000000000000000000000000007D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000080000100008C1C00000CC +:10D3C00000000000000000008801000000010000D3 +:10D3D0000000000000000000000000000000090044 +:10D3E0000000008000008000801100000300800029 +:10D3F00080110000900080080003802111080000C7 +:10D40000000000000000000000000000000000100C +:10D4100000020004001000000000000000000000F6 +:10D4200000000000000000000000000000000000FC +:10D43000000000000000000000000080008002806A +:10D44000000008000200000000090002090908119C :10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC +:10D46000000000108000000080000000800000002C +:10D47000000280800000820088008308A100080369 :10D48000000000000000000000000000000000009C -:10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000011000000006B -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000001110003B -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B +:10D49000800080000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000008080006C +:10D4C0000000000000000000000020800911090099 +:10D4D000201000000000000000000000000000001C +:10D4E0000000000000009000000010000200080092 +:10D4F00002004000900402A008000400030009009C +:10D500000301000000000000000000000000000017 +:10D510000000C000100004008800000000000000AF :10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000001DA -:10D5500001000000000000000000000000000000CA -:10D5600000000000000000000000000000000000BB -:10D570000000000000000000000000000082000029 -:10D58000070400000000000000000000008200000E -:10D590000704000000000000000000000000000080 +:10D53000000000000000000000000000080090A0B3 +:10D5400084888800000000000000000001C0000185 +:10D5500000000100000000000000000000000000CA +:10D56000000000000006000006000000410000600E +:10D5700000004800600000600000480000000060FB +:10D580000000004200000000000000000000000059 +:10D59000000000000000000000005000000000003B :10D5A000000000000000000000000000000000007B -:10D5B000000007044200000000000000000000001E -:10D5C000000000000000000000000000000000005B -:10D5D00000E00000814100000000000000000000A9 -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A +:10D5B000000000000000000000000000000000006B +:10D5C0000000060000000000000000000000000055 +:10D5D00000E00000810000000000000000000000EA +:10D5E0000000000000000000F0F00000FF0008381C +:10D5F0000B3B00000000808CB0BC0000000008382D +:10D60000C8F800000000000000000000000000005A +:10D6100000000000000009090011000000000000E7 :10D6200000000000000000000000000000000000FA :10D6300000000000000000000000000000000000EA -:10D6400000000000000000000000000000000000DA +:10D64000FD00B900F000FFFF000000000000000036 :10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D69000000000000000000000000000000000008A +:10D6600000000000000000000000F0F00000FF00DB +:10D67000C8F8CBFB00000000838FB3BF00000000A0 +:10D680000B3BCBFB0000000000000000000000008E +:10D690000000000000000000090900000000000078 :10D6A000000000000000000000000000000000007A :10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000000000005A +:10D6C0000000FD64B9A1F0000F0F00000000000091 :10D6D000000000000000000000000000000000004A :10D6E000000000000000000000000000000000003A :10D6F000000000000000000000000000000000002A @@ -191907,276 +191907,276 @@ :10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 +:10D760000000000000000000000000003C3C000041 +:10D770000F0F0000D646D64600000000F060900073 +:10D7800000000000D010D0100000000000000000D9 +:10D79000000000000000000000000000FF06FF067F :10D7A0000000000000000000000000000000000079 :10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 +:10D7C0000000000000000F0F0000FFEFFFFF00004F :10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D8200000000000000000000000000000000000F8 +:10D7E00000000000000000000000000000003C3CC1 +:10D7F00000000F0F0000DF4FDF4F00000000F9694D +:10D80000990990009000D313D3130000000000008A +:10D8100000000000000000000000000000009FFE6B +:10D820009F660000000000000000000000000000F3 :10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 +:10D8400000000000000000000F0F0E00FF6FFFFF40 :10D8500000000000000000000000000000000000C8 :10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D88000000000000000000005180A20050004A0A8 -:10D89000000000000000000005180A20050004A098 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000005180A0005003C -:10D8C00004A00000000000000000000000000000B4 -:10D8D0000000000000000000000000400006000CF6 +:10D8700015002A38054000A800003007C00C000041 +:10D8800000003007C00C00000061300700090000F4 +:10D890000000000000000000000000000000000088 +:10D8A000A0610006000D0000000000000000000064 +:10D8B0000000000000000000000000000000000068 +:10D8C00000000000000000000000000000000090C8 +:10D8D000000000610006000D000000610007000D5F :10D8E0000000000000000000000000000000000038 -:10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 +:10D8F0000000000000000000000000005555F0F09E +:10D90000000000003C3CF0F0000000000300FAFAC8 +:10D91000FABA000000000000000000000000000053 +:10D920000000000000000000402000000000000097 :10D9300000000000000000000000000000000000E7 :10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000F0FA9 -:10D96000FFFF0000000000000000000000000000B9 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 +:10D95000000000000000000000000000FF0FF000C9 +:10D9600028FA7DFA0000000000000000000000001E +:10D9700000000000000000000000000000005555FD +:10D98000F0F0000000003C3CF0F00000000003005C +:10D99000F0F0F03000000000000000000000000087 +:10D9A0000000000000000000140040200000000003 :10D9B0000000000000000000000000000000000067 :10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E0000F0F000000000000000000000000000019 +:10D9D00000000000000000000000000000005C5C8F +:10D9E0005C5C28507D50000000000000000000003A :10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 -:10DA200000000000000000000000000000000000F6 +:10DA00003C3C3C3C00000000FF003C3C00000000AF +:10DA100000000000002800000000000000000000DE +:10DA2000000000000000000000000000FF000000F7 :10DA300000000000000000000000000000000000E6 :10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 -:10DA600000000000F0F000000000000000000000D6 +:10DA50000000000000000000C3AFC0F000000000A4 +:10DA60003F303F307D007D55000000000000000089 :10DA700000000000000000000000000000000000A6 -:10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 +:10DA800000003C3C3C3C00000000FF003C3C00002F +:10DA9000000000000000002800000000000000005E +:10DAA0000000000000000000000000000000FF0077 :10DAB0000000000000000000000000000000000066 :10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE000000000000000F0F0000000000000000056 +:10DAD00000000000000000000000C3AFCFFF000006 +:10DAE0000000F0F0000028002855000000000000B1 :10DAF0000000000000000000000000000000000026 -:10DB0000000088000000000000000000820000000B -:10DB10000000020004008800000000000000000077 -:10DB20000000200040000000000000002000000075 -:10DB3000000000032000400020000000000004005E -:10DB40000000000020002000000000000000200075 -:10DB50000000040000002000100000000000100081 -:10DB60000000A0000100000088000000000020006C -:10DB70000000200000000000000000000000000085 -:10DB80000000000000000000000000000000000095 -:10DB90000000000080000000000000000000000005 -:10DBA0000000100000000000000000000000000065 +:10DB00000000100004000000100000000400840069 +:10DB100000000400040088008400000088008800E1 +:10DB20000000040088008800200040004000200021 +:10DB30000000000020002000200020008800880055 +:10DB4000200000008800200020002000880020081D +:10DB50008800040010002000200520008800040038 +:10DB600000000000840088000400200084002000E1 +:10DB700040008400000000000000000000000000E1 +:10DB80000000000080000000000080000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 :10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 -:10DBD0000000000010000000000000000000100025 -:10DBE00000004100000002000000000010001000D2 -:10DBF0000000000000000000000000000000010024 -:10DC000020000100010004000000040004000000E6 -:10DC10000000000000000000000000000000000004 +:10DBC0002000000000000000000000000000000035 +:10DBD0000900000040000000040000004000200098 +:10DBE0002000200000002000200000002100200074 +:10DBF00000000400400000000000000000000000E1 +:10DC00000000000000000000000000000100000013 +:10DC10000000000001000000000000000200000001 :10DC200000000000000000000000000000000000F4 -:10DC300000000000040000000000000000000000E0 -:10DC400000000000000000000000000000000000D4 -:10DC500000000000000000000000000000000000C4 -:10DC60000200000000000000000000008210000020 -:10DC700000000800001090000000000000000000FC -:10DC800020008000200020008400040000008000AC -:10DC9000040004000000000004000900040000006B -:10DCA0000400040000000000000800000000000064 -:10DCB000000000000000000000000000000800005C -:10DCC000000000000000000000000008000000004C -:10DCD0000000000000000000000000000008030831 -:10DCE00000008000030000000000201020880400D5 -:10DCF0000000040004000400000000000000000018 +:10DC300000080000000000000000000000000000DC +:10DC400001000100200001000000000008000000A9 +:10DC5000000000000000000010000000A0051000FF +:10DC60000000000000000000000082000000001022 +:10DC70000410040008000000000000000000000084 +:10DC80000000000000000000000000000000020092 +:10DC90000000000000000200000000000000800002 +:10DCA0000000000800000000000000C000000000AC +:10DCB00000000008001000840000000800080000B8 +:10DCC000008420842008800020000010000800004C +:10DCD000000000080088000000000008000800089C +:10DCE00000080000000800000008400000080000D4 +:10DCF000008800C0001000000000000000000000CC :10DD00000000000000000000000000000000000013 -:10DD10000000000000000000000000000000000003 -:10DD200000000000000000000000000000000011E2 -:10DD300000000000000000000000000000000000E3 -:10DD400000080000000000000000000000000000CB -:10DD500000000000000000000000000008000000BB +:10DD100000000000000000000000000000080000FB +:10DD200000080008000000000002000800080000D1 +:10DD300000000008000000000009000000000000D2 +:10DD400000000000000000000000000800000000CB +:10DD500000000008000500000000000000000000B6 :10DD600000000000000000000000000000000000B3 -:10DD7000000000100003000300000021000000006C -:10DD80000000000000000000000000000000000093 -:10DD90000000000000000000000000000000000083 -:10DDA00000000000000000000084000000000000EF -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000000000000053 +:10DD70000010000000000000000000000000000093 +:10DD8000000000000000000000000000000000088B +:10DD9000000000000000000800080008000000006B +:10DDA0000000000000A00088008400A00000000027 +:10DDB00002000000000000000084000000000008D5 +:10DDC0000300000000080000000000000000080040 :10DDD0000000000000000000000000000000000043 -:10DDE0000000000000000000000000000000000033 -:10DDF00000000000000000000400000000002000FF -:10DE00000000000000000010000000000000000002 -:10DE1000202088200000000000000000000000001A -:10DE200000000000010000000000000000000000F1 -:10DE300004000000000000000000000000000000DE -:10DE400000000000000000000000002000000000B2 -:10DE500000000000000000000000000000000000C2 -:10DE600000000000080000000000000000000000AA -:10DE70000000A0000000A10002000000000001005E +:10DDE0000000210000000000000000000000000012 +:10DDF000000000A00000000000000800080800006B +:10DE00000000000000000000000000009000010081 +:10DE10004000910000000000A000A00000100000E1 +:10DE20008200C000000000000000000000000800A8 +:10DE3000A00000000000C00008000000000000007A +:10DE40008200000000000000100010001000000020 +:10DE500000000000000000000800000000000000BA +:10DE60000000100000000000000000000000C000E2 +:10DE7000840400000800000000410000000082004F :10DE80000000000000000000000000000000000092 -:10DE90000000000100010000000000000000000080 -:10DEA000000000000000040000000000000000006E -:10DEB000000000000000040000000000000000005E -:10DEC000000000000800000000000000000000004A +:10DE9000200000002000000000000000000000C082 +:10DEA000000000A0000000000000000000000000D2 +:10DEB0000000000000000000000000000000000062 +:10DEC000000000080000000000000000000000004A :10DED0000000000000000000000000000000000042 -:10DEE000000000000000000000000000080000002A -:10DEF000000000000000000004008000000000009E -:10DF0000040000000000000000000000000000000D -:10DF100000000008000000000000000020000000D9 -:10DF200000000000000000200000000000000000D1 -:10DF300000000000000000000000000000000000E1 -:10DF400000000000000000000000000000000000D1 +:10DEE0000000000000000000001000000000000022 +:10DEF000000000000010000000000000000000A072 +:10DF00000000000000000000000000000000000011 +:10DF10000000010000800000000000000000000080 +:10DF2000820000000000000000000000000000006F +:10DF300000000000080000000000C0000010000009 +:10DF4000000000000000820000000000000000004F :10DF500000000000000000000000000000000000C1 -:10DF600000000000020000000000000000000000AF -:10DF7000000000000000000000200005000000007C -:10DF80000020000000000000000000000000000071 -:10DF90000000000000000000000000000000000081 -:10DFA000000000000000000800A1000000000000C8 -:10DFB00000000000000000000090000000000000D1 +:10DF600000000000080000000000000000000000A9 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000889 +:10DF900000000000200000040002000000000084D7 +:10DFA00002000000020800A00002020000000000C1 +:10DFB00000000000000000000000000000840010CD :10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000800000000000039 -:10DFE0000000000000000000000000000000000031 -:10DFF0000000000000C000000000048500000000D8 -:10E00000000000010000000000000000000000000F -:10E010000000000000000000000000000000000000 -:10E0200000040000000000000000000000000000EC -:10E0300000000000000000000000002100000000BF -:10E0400000000000000000000000000000000000D0 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000008112000A0000800024E +:10DFF000000000000000000000000090008400C04D +:10E000000000000000C000000000000000008800C8 +:10E010000000000000000000100010000080000060 +:10E02000000500090041000000210041000000003F +:10E0300004000000000000000000000300000000D9 +:10E040000000000000000000000808004008C000B8 :10E0500000000000000000000000000000000000C0 -:10E06000000000000000001100000000000000009F -:10E0700000001000000084000008002100000008DB -:10E08000000000000002000400000000000000008A -:10E09000000000000000000000040000000000007C -:10E0A000000000000000000041000000000000002F -:10E0B000000000000500000000000000000000005B -:10E0C0000400000000000500000000000320000024 -:10E0D00000002000000005002000000008000000F3 -:10E0E00000840000000000000000000000000000AC +:10E060000000000008000000001000000000000098 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000008000000000000000088 +:10E0900000000000000000000000800280C00004BA +:10E0A0000000000000000000000000000000000070 +:10E0B00000000000000000000000000000820000DE +:10E0C00000000000008400000000000000000000CC +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 :10E0F0000000000000000000000000000000000020 :10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000000000FF -:10E12000000000000000000000000000900000005F +:10E1100000000000000000000000009000880105E1 +:10E120000002000200000008000400C00088000493 :10E1300000000000000000000000000000000000DF -:10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000000BF +:10E1400000000000000000000000000300000000CC +:10E15000000000000000400000000000000000007F :10E1600000000000000000000000000000000000AF -:10E1700000000000C0020008002008840000908811 -:10E1800000000000000090000000000000000000FF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F :10E19000000000000000000000000000000000007F -:10E1A00000000000000000000000000011008000DE +:10E1A000401100000000000000800000000000009E :10E1B000000000000000000000000000000000005F :10E1C000000000000000000000000000000000004F -:10E1D000000000000000000000000000000000003F +:10E1D000000000000000000000000500000000003A :10E1E000000000000000000000000000000000002F -:10E1F000000000000000000000800000800011000E -:10E2000080000000000011008000000000000000FD -:10E2100000000000000000080000000400000000F2 -:10E22000008000000000000000000000000000006E -:10E2300000800000008000000000000000000000DE +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000040BE +:10E22000008810840000000000830000000000004F +:10E2300000A000020000000000000000000000003C :10E2400000000000000000000000000000000000CE -:10E2500000000000000000000000000000000000BE +:10E2500000000000000000000003000000030000B8 :10E2600000000000000000000000000000000000AE -:10E27000000000000000000000000090000000808E -:10E28000000000800000008000000080000000808E -:10E29000000000000000000000010000000100007C -:10E2A00000000008000000C00000000000000000A6 -:10E2B00000000020000000C000000000000000007E +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000100090008000000000009008800408B +:10E2B000000000410082000000000000000000009B :10E2C000000000000000000000000000000000004E -:10E2D000000000000000000000000000000000003E +:10E2D000000000000000000000000000000000013D :10E2E000000000000000000000000000000000002E -:10E2F000000000000000000000000200908220905A -:10E30000040200000020000000C000000020000007 -:10E3100000C000000000000000000000100000002D -:10E32000000000000000820000000000000000006B -:10E3300000000100008888001100000000000000BB +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000C0001000090040000000C00014 +:10E330000200020000000000A00000000000000039 :10E3400000000000000000000000000000000000CD -:10E3500000000000000000000000000000000000BD +:10E3500000000000000000000000000000000400B9 :10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000901000C03D -:10E380000820202001000088880001008900008802 -:10E390008800010000000000000000000000800074 -:10E3A000000010004000000080000000000000009D -:10E3B0000000000041000080000009000000000093 +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A00000000000000080020000840080000000E7 +:10E3B000800000000000000000008000000000005D :10E3C000000000000000000000000000000000004D :10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000809D -:10E400000000000000004100008000000900410001 -:10E410000080000009000000000000000000000073 -:10E4200000000000000000000004000000000000E8 -:10E43000000000000000001100000080000000004B +:10E3E00080000000050000000000000000000000A8 +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000080000000000091000000DB +:10E43000000080000000000000000000000000005C :10E4400000000000000000000000000000000000CC :10E4500000000000000000000000000000000000BC :10E4600000000000000000000000000000000000AC :10E47000000000000000000000000000000000009C -:10E48000800000000000000000110000008000007B -:10E4900000110000008000000000000000000000EB -:10E4A000000000000000000000000001000000006B -:10E4B000000000000000000000010000004000001B +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A00000000000000000000400A00004000900BB +:10E4B0008200C00008000400C000200004008800A2 :10E4C000000000000000000000000000000000004C :10E4D000000000000000000000000000000000003C :10E4E000000000000000000000000000000000002C :10E4F000000000000000000000000000000000001C -:10E50000000008002002202002000001000000405E -:10E5100000000001000000400000000000000000BA -:10E520000000410002E000000000000000000700C1 -:10E5300000000000000000000000000000000700D4 -:10E540008221000000000000000000000000000028 +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E520000000000000000000000084000060000007 +:10E530004200000000000000004200000000000057 +:10E5400000000000000000000000000000000000CB :10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000000000000AB +:10E56000000000000000006000000000000000004B :10E57000000000000000000000000000000000009B :10E58000000000000000000000000000000000008B -:10E590000700822100000000070082210000000027 -:10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C000F0F000000000000000000000000000006B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000F434C4047B +:10E5B00000000000CDC10D01000000000303F505BF +:10E5C000000000000000000000000000000000004B :10E5D000000000000000000000000000000000003B :10E5E000000000000000000000000000000000002B :10E5F000000000000000000000000000000000001B -:10E6000000000000000003F50305C3550F000000E3 -:10E610000000F0F0000000000000F0F0000000003A -:10E6200000000000000000000000000000000000EA -:10E6300000000000000000000000000000000000DA -:10E640000000F0F0000000000000000000000000EA +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E620000000000000000000000000000000F737BC +:10E63000C70700000000FDF13D3100000000F3F3CA +:10E64000F5050000000000000000000000000000D0 :10E6500000000000000000000000000000000000BA :10E6600000000000000000000000000000000000AA :10E67000000000000000000000000000000000009A -:10E680000000000000000000F3F5F305C3550FFF84 -:10E6900000000000F0F0000000000000F0F00000BA +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A :10E6A000000000000000000000000000000000006A -:10E6B000000000000000000000000000000000005A -:10E6C000000055550000FFFF0000000000000000A2 +:10E6B00080D08ADA000000002C2CECEC0000000076 +:10E6C0000FFF0A0A00000000000000000000000028 :10E6D000000000000000000000000000000000003A :10E6E000000000000000000000000000000000002A :10E6F000000000000000000000000000000000001A -:10E700000000000000000000000001510B5B00AAA7 -:10E71000FFAA0000FF000000FFFF0000FFFF000055 -:10E72000FFFF0000000000000000000000000000EB -:10E7300000000000000000000000000000000000D9 -:10E74000000000005555000000000000000000001F +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E73000000080D08ADA000000002F2FEFEF0000E9 +:10E7400000000FFFFAFA00000000000000000000C7 :10E7500000000000000000000000000000000000B9 :10E7600000000000000000000000000000000000A9 :10E770000000000000000000000000000000000099 -:10E78000000000000000000000000000A1F1ABFB51 -:10E79000C3F0C3F00000FF00000000000000000014 -:10E7A00000000000000000000000000000650006FE -:10E7B000800F200005180A00050005A000000000D9 -:10E7C0000000000005002A00054000A8000000002D +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000003007C00C00000000300026 +:10E7C0000000000000003000000000000000000019 :10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000000000000000000000029 -:10E7F0000000000000000000000000000000000019 +:10E7E00000000000000000000000000000000061C8 +:10E7F0000007000D00000000000000000000000005 :10E800000000000000000000000000000000000008 -:10E81000000000C0000005002A00054000A8050017 -:10E820002A00054000A800000000000000000000D1 -:10E8300000000000000000000000000000000000D8 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000003C3CF0F00000000080 :10E8400000000000000000000000000000000000C8 :10E8500000000000000000000000000000000000B8 :10E8600000000000000000000000000000000000A8 @@ -192184,7 +192184,7 @@ :10E880000000000000000000000000000000000088 :10E890000000000000000000000000000000000078 :10E8A0000000000000000000000000000000000068 -:10E8B0000000000000000000000000000000000058 +:10E8B000000000000000000000003C3CF0F0000000 :10E8C0000000000000000000000000000000000048 :10E8D0000000000000000000000000000000000038 :10E8E0000000000000000000000000000000000028 @@ -192192,7 +192192,7 @@ :10E900000000000000000000000000000000000007 :10E9100000000000000000000000000000000000F7 :10E9200000000000000000000000000000000000E7 -:10E9300000000000000000000000000000000000D7 +:10E930000000000000000000000000000F0F00FFBA :10E9400000000000000000000000000000000000C7 :10E9500000000000000000000000000000000000B7 :10E9600000000000000000000000000000000000A7 @@ -192200,196 +192200,196 @@ :10E980000000000000000000000000000000000087 :10E990000000000000000000000000000000000077 :10E9A0000000000000000000000000000000000067 -:10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000000000000000047 +:10E9B00000000000000000000000000000000F0F39 +:10E9C00000FF000000000000000000000000000048 :10E9D0000000000000000000000000000000000037 :10E9E0000000000000000000000000000000000027 :10E9F0000000000000000000000000000000000017 :10EA00000000000000000000000000000000000006 :10EA100000000000000000000000000000000000F6 :10EA200000000000000000000000000000000000E6 -:10EA300000000000000000000000000000000000D6 -:10EA400000000000000000000400000000000100C1 -:10EA500001000100010000000000000000000000B3 -:10EA6000C0000000000000002000000000000003C3 -:10EA700000000000000000000000C00000000000D6 -:10EA8000040004000400000000002000000000005A -:10EA900088008800880000000000200000000000BE -:10EAA00000008400000000000000200000000000C2 +:10EA30000000000000008200000000000000000054 +:10EA40008205820000000000000084000000000039 +:10EA5000C0030400400020000400040004008800FB +:10EA6000200020008800C000C0002000000000003E +:10EA700000002008C000200020002000200020000E +:10EA800020002000200000002000200020000000C6 +:10EA900000002000200088001000C00000002000BE +:10EAA00020000000040004000000000000108800A6 :10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000000046 -:10EAD000020002000200020000000000000000002E -:10EAE00040004000000000000000000000000000A6 -:10EAF0000000000000000000000000000000000016 -:10EB000000008000C0008000000000000000000045 -:10EB100000000000400000000000000010000000A5 -:10EB20000000200020002000100000000000000075 -:10EB300000000000000000000000000000000000D5 -:10EB400000000000000000000000000004000000C1 -:10EB50000000000000000000000020002000200055 -:10EB6000200000000000000000000000A0000000E5 -:10EB70000000000010040008000000080000000071 -:10EB80000080208000842080008400840000000039 -:10EB90000000000000000000000000000000000075 -:10EBA0000000000000000000000000100000000055 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000000045 -:10EBD000000000000008000000000000800080002D -:10EBE0008000800000000002000000000000000023 -:10EBF0000000000000008009000100000009000082 -:10EC0000050000048904002180200021002100006B -:10EC100000000000000000080000000000080008DC -:10EC2000000000000008000000080000000000884C +:10EAC00000000000000000004100000000001000F5 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF00000000000000020000000000000000000F6 +:10EB00000000000000000000000000000000000005 +:10EB10000000000040000000200020002000200035 +:10EB200000000000200020881000200000002000CD +:10EB300021000000000000000000000000000000B4 +:10EB400000000000000000000100000000000000C4 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000100000000000000000000000000000094 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000001000000000000100040060 +:10EBA0000000000000000000001000100000000045 +:10EBB000000008000000000000000000000000004D +:10EBC0000000000000000000000002000000000043 +:10EBD0000000000000000000000000000000000035 +:10EBE000000000000000000000000000008800009D +:10EBF00000002008000000000000000000000000ED +:10EC000000080008000000080084000000840008DC +:10EC100000000084008800000008000000000400DC +:10EC20008088001000000410001000000000001098 :10EC300000000000000000000000000000000000D4 :10EC400000000000000000000000000000000000C4 -:10EC5000000000000000008000000100000800002B -:10EC60000000000000080008000000000100002172 -:10EC70000000000000000000000000000100000093 -:10EC80000004000400000008000000000000000074 -:10EC90000000000000000000000000030008000069 -:10ECA0000000000000000000000004000008000058 -:10ECB000040004000000000000000000000000004C -:10ECC000000000000000000000000000000000A0A4 -:10ECD000000000000000000000080000200000000C -:10ECE000000000000000008400010000000020007F -:10ECF00000000000000000000000000000002000F4 -:10ED00000000000100010000000000000000000001 -:10ED100000000000000000000000000000004000B3 -:10ED200005000000000000000000000800000000D6 +:10EC50002000000000000021100210000000000051 +:10EC6000000000080000000800080000000000008C +:10EC7000000000080000000000000000000000008C +:10EC80000000000000000000000000000000000084 +:10EC900000000000000000000000902100000010B3 +:10ECA00000000000040800000000002140000000F7 +:10ECB0000400001000000000000000000000000040 +:10ECC0000000000000000000000000000000000044 +:10ECD000000000840382000000000000000000002B +:10ECE0000000000000A0000000000000000000087C +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED2000000005000000800000000020000000003E :10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED60000188002100000000018000000000010077 -:10ED700000000000000000004000000090000000C3 -:10ED800088000080000000000000000082000800F1 -:10ED900082000000000000000000000000000000F1 -:10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000000000000053 -:10EDC00000000000000000000000000000000990AA -:10EDD0000000000000000000000000000000000033 -:10EDE00000000405000000000008022000000000F0 -:10EDF00020000000000000000000110000001100D1 -:10EE000000000900000400000000000000001100E4 -:10EE100000000000000000000000000000000000F2 -:10EE200000000000000000000000000000000000E2 -:10EE300000000000000000000000000000080000CA -:10EE400000000000000000000000000000000000C2 -:10EE5000000800000000900000000000900020006A -:10EE60000000400000000000000000200000000042 -:10EE70000000000000000000000000009000000002 -:10EE8000000000000000000000000000000300007F -:10EE90000000000800000000000000000000000367 -:10EEA0000000000000030000000300080000000054 -:10EEB000000000000000000800000000000000004A -:10EEC00000080000000000000000000000820000B8 -:10EED0000000000000000000000000000000000032 -:10EEE000000000000000008400000000000100009D -:10EEF000000000000400000000000000000000000E +:10ED40000000000000002000000000000010000093 +:10ED500000000008000000000000A000000000000B +:10ED6000C0000000000000000000000000000000E3 +:10ED7000000000000005000000000000000000008E +:10ED80000000000000000000000000000000000083 +:10ED900000000800000084000000000000000000E7 +:10EDA0000000000000000000000004000000A000BF +:10EDB000000000000000080000000000000000004B +:10EDC0000000000000000000000000000000000043 +:10EDD000000000000008000000000000000000002B +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000900000000083 +:10EE00000000000000000000000000000000000002 +:10EE100000080000000000000000000000000000EA +:10EE20000000000000000000000000008000000062 +:10EE300000000000000000000000000000000000D2 +:10EE40000000000000000000000000009000000032 +:10EE50000000000001009000000000000008000019 +:10EE60000002000000000000000800000000000098 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000008800840800000000000088000096 +:10EEE0000088000000820000000000000010000008 +:10EEF000000000000000000000080000000000000A :10EF00000000000000000000000000000000000001 :10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000000200020000000A1 -:10EF30001100000000000004008400000020000018 -:10EF4000008400000000000000000000000000003D -:10EF500000000000000000000000000000000000B1 -:10EF60000000000001000000000000400009000057 -:10EF70000002000800080008000800000021000945 -:10EF8000000000000000010000000000000800096F -:10EF900000009000000000000021000000080000B8 -:10EFA000000500000000000000210000000000003B -:10EFB0000000000000000000000000000000000051 -:10EFC000000000020000000000000000020000003D +:10EF200000000000000800000000000000000000D9 +:10EF300000000000000004000000000000000000CD +:10EF400000000000000000000000000000000000C1 +:10EF5000000000000000000000004000004100210F +:10EF60000000000000210000000000000000000080 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000008000000000000000079 +:10EF90000000000000000000000000000000000071 +:10EFA00000000000000000000000000000008200DF +:10EFB0000000000000000010000000000000000041 +:10EFC0000000000000000000000000000000000041 :10EFD0000000000000000000000000000000000031 -:10EFE0000000000000002000000000000001000000 -:10EFF00000000500002000000000000000000000EC -:10F0000000000000000000002000000000000000E0 -:10F0100000020000000000000000000000000000EE +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 :10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000000000000000D0 +:10F0300000000000000000000000040000000000CC :10F0400000000000000000000000000000000000C0 -:10F0500000000000000000000000000000000000B0 -:10F06000000000000000010000900000000000000F -:10F0700090000000000001000000000000000000FF -:10F080000000000000000000000000000000000080 +:10F05000000000000000000200100000000400009A +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F08000010000000000000300000000000000007C :10F090000000000000000000000000000000000070 :10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000000050 +:10F0B0000000200000000000000000000000000030 :10F0C0000000000000000000000000000000000040 -:10F0D0000000000000000000000000000000000030 -:10F0E000000000000000000011002180000000006E -:10F0F000110080000000000011002100000000004D -:10F1000000000000000000000000000000000000FF +:10F0D00000000000000000000000008000000000B0 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000002100000000000000000000000000DE :10F1100000000000000000000000000000000000EF :10F1200000000000000000000000000000000000DF :10F1300000000000000000000000000000000000CF :10F1400000000000000000000000000000000000BF -:10F1500000000000000000000000000000000000AF -:10F16000000000000000000000000008090000038B -:10F1700000000009008000090000004109000009AA -:10F1800000800000000000000000000002080000F5 -:10F190000003000000110000002000000009000032 -:10F1A000000200000000000000000000000000005D -:10F1B000000000000000000000000000000000004F +:10F1500000000000000000000000000000C000806F +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F180000000400009000400100000000000000022 +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B00000000000000000000000008000000000CF :10F1C000000000000000000000000000000000003F -:10F1D000000000000000000000000000000000002F -:10F1E0000000000000000000000000000003010219 -:10F1F000000000A0000000200000008800010100C5 -:10F200000000008800000000000000000000000175 -:10F2100000000000000000000000000100000000ED -:10F2200000C000000010000000000000000000000E -:10F2300000000000000000000000000000000000CE +:10F1D0000000000000000000000000000000000926 +:10F1E000000200000000000000000000000000001D +:10F1F000000000000000000000000000000000000F +:10F2000000000000010000000100000000000000FC +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F23000000000000000000000400000008200000C :10F2400000000000000000000000000000000000BE -:10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E -:10F27000080002900000030008880200000000005F -:10F2800088000000010000000000000000000000F5 -:10F2900000000800880001000000C000000000001D -:10F2A0000000C00088000000000000000000000016 -:10F2B000000000000000000000000000000000004E +:10F25000000000000000000000000000000040006E +:10F260000000C000C100000000000000000000001D +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000001000100007C +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B00000000000000000000000000090000000BE :10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E -:10F2E000000000000000000000000000000000001E -:10F2F000090080008080200041008080800009009B -:10F3000000000000000041000000000000000000BC -:10F31000000000098000C100030000008000000020 -:10F320004000110080000000050000000000000007 -:10F3300000000000000000000000000000000000CD +:10F2E00080000000800040000000000000000000DE +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000210011CB +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000200000000000AD :10F3400000000000000000000000000000000000BD :10F3500000000000000000000000000000000000AD -:10F36000000000000000000000000000000000009D -:10F37000000000118000000000000011000000806B -:10F380000000000009110000000000000000000063 -:10F39000000000000009004108000000000000001B +:10F36000000000008000000000000000000000001D +:10F37000000000000000000000000000000000008D +:10F380000000000000000000000000000900000074 +:10F39000004000000000000000000000000000002D :10F3A000000000000000000000000000000000005D -:10F3B000000000000000000000000000000000004D +:10F3B000000000000000000000000000000000024B :10F3C000000000000000000000000000000000003D :10F3D000000000000000000000000000000000002D -:10F3E000000000000000000000000000000000001D -:10F3F0000000000000012000008800000001000063 -:10F4000000400000000000010000000000000000BB -:10F4100000000000000000010000010000000000EA +:10F3E0000000000010008200C000040000000000C7 +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000040000F8 +:10F4100000000001000000000000000000000000EB :10F4200000000000000000000000000000000000DC :10F4300000000000000000000000000000000000CC :10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000000000000009C -:10F47000000000000000000000E007000000600045 -:10F4800002E007008200000000E00000814100006F -:10F490000000000000000000000001E00022000069 -:10F4A000000002E000004200000002E00704420009 +:10F46000000000000000000000000000004200005A +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000006000000000000000000000000000000C +:10F4A000000000000000000000000000000000005C :10F4B000000000000000000000000000000000004C -:10F4C000000000000000000000000000000000003C +:10F4C00000420000060000000000000000000000F4 :10F4D000000000000000000000000000000000002C -:10F4E000000000000000000000000000000000001C -:10F4F00000000000000000000000FF000000FF000E -:10F50000000000000000F0F000000000000000001B +:10F4E00000000000000000000C81CF81000000003F +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB :10F5100000000000000000000000000000000000EB :10F5200000000000000000000000000000000000DB :10F5300000000000000000000000000000000000CB :10F5400000000000000000000000000000000000BB :10F5500000000000000000000000000000000000AB -:10F56000000000000000000000000000000000009B -:10F57000000000000000000000000000FF0000008C -:10F58000FF00000000000000F0F00000000000009C +:10F56000000000000000000000000CBDCFBD000046 +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B :10F59000000000000000000000000000000000006B :10F5A000000000000000000000000000000000005B :10F5B000000000000000000000000000000000004B @@ -192403,489 +192403,489 @@ :10F6300000000000000000000000000000000000CA :10F6400000000000000000000000000000000000BA :10F6500000000000000000000000000000000000AA -:10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000FF8B -:10F680000000FFFF0000FFFF0000FFFF0000000080 +:10F6600000000000000000000000000000009918E9 +:10F670008100000000000000000000000000000009 +:10F68000000000000000000000000000000000007A :10F69000000000000000000000000000000000006A :10F6A000000000000000000000000000000000005A :10F6B000000000000000000000000000000000004A :10F6C000000000000000000000000000000000003A :10F6D000000000000000000000000000000000002A :10F6E000000000000000000000000000000000001A -:10F6F000000000000000000000000000000000000A -:10F7000000FF0000000000000000000000000000FA +:10F6F000DB5AC342000000000000000000000000D0 +:10F7000000000000000000000000000000000000F9 :10F7100000000000000000000000000000000000E9 :10F7200000000000000000000000000000000000D9 :10F7300000000000000000000000000000000000C9 :10F7400000000000000000000000000000000000B9 :10F7500000000000000000000000000000000000A9 :10F760000000000000000000000000000000000099 -:10F770000000000000000000000000000000000089 -:10F78000000015402A06054C00A805652A06854F8D -:10F7900020A800400006000C00000000000000004F -:10F7A0000000000000000006000C000000650006DC -:10F7B000000F2000057D0A06050F24A000000000B0 -:10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000000000000000029 +:10F770000000000030000000000000000000000059 +:10F780000000000000000000000000000000000079 +:10F7900000000000000000000000006100060009F9 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C00000000000000000000000000005000A38F2 +:10F7D000050000A000000000000000000000000084 :10F7E0000000000000000000000000000000000019 :10F7F0000000000000000000000000000000000009 -:10F800000000000000005555FFFF00000000000050 -:10F81000000000000000FF00FFFF000000000000EB -:10F8200000000000000000000F0F3C3C0000000042 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000FF00FFEA +:10F8200000FFFFFF000000000000000000000000DB :10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 :10F870000000000000000000000000000000000088 -:10F8800000000000000000005555000000000000CE -:10F890000000000000000000FF0000000000000069 -:10F8A000000000000000000000000F0F3C3C0000C2 +:10F880000000000000000000000000000000000078 +:10F89000000000000000000000000000000000FF69 +:10F8A00000FF0000FF00000000000000000000005A :10F8B0000000000000000000000000000000000048 :10F8C0000000000000000000000000000000000038 :10F8D0000000000000000000000000000000000028 :10F8E0000000000000000000000000000000000018 :10F8F0000000000000000000000000000000000008 -:10F90000000000000000000000000000F0F0000017 -:10F91000000000000000000000000000F0F0000007 -:10F92000000000000000000000000000FFFF3C3C61 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F92000000000000000282000000000000000008F :10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 -:10F980000000000000000000000000000000F0F097 -:10F990000000000000000000000000000000F0F087 -:10F9A0000000000000000000000000000000000057 -:10F9B0003C3C0000000000000000000000000000CF +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A000000000000000080000000000000000004F +:10F9B0000000000000000000000000000000000047 :10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 :10F9E0000000000000000000000000000000020015 -:10F9F000000000008200020002000000020000007F -:10FA0000000000008800840002008800000004005C -:10FA1000000000002000040020000000040040005E -:10FA200004000000200020002000200000038800C7 -:10FA30002000000084008800880020004000200092 -:10FA4000880020000000200020004000200020004E -:10FA500020008800200020002000880020020000F4 -:10FA60004000000000000000000000000000000056 -:10FA70000000000000000000000000000000000086 -:10FA80000000000000000000000000000000000076 -:10FA90002000000000000000000000000000000046 -:10FAA0000400000000000000000000000000000052 -:10FAB0000000000000020000000000000000000044 -:10FAC0000000000000000000000010000000000026 -:10FAD0000000000000000000000000000000000026 -:10FAE0000000000000000000000000000000000016 -:10FAF0000000000000000000200020002000200086 -:10FB000000008200820000000400020004000400E3 -:10FB10000000000090000000000000000000020053 -:10FB200004000000000000000400000000000000CD -:10FB300000001000100020002008200020002000FD -:10FB40002000200020002000200000000000000015 -:10FB50000000000000000210000000000000021081 -:10FB60000000080000000410000000000400000075 -:10FB70000000000000000000000080008000800005 -:10FB800080000000020000000000000000000000F3 -:10FB90000000000000000000000004002000000041 -:10FBA0000000000000000000000000000000000055 -:10FBB0000000000080008000800080018000800044 -:10FBC000800080008000A000800080000000000015 -:10FBD0000000000000000000000000080200020019 -:10FBE0000000000000000200020000880200020085 -:10FBF0000200000000000000000000000000000003 -:10FC000000000000000000000000000000000000F4 -:10FC100000000000000800000000010000000000DB -:10FC200000000000000000000000000000000000D4 -:10FC300000000000000000000000000000000000C4 -:10FC400000000000000000000000000000000000B4 +:10F9F00000000000040002000000000010000200EF +:10FA000000000400000002000000000000002000D0 +:10FA100088000400210021100400040520002000BB +:10FA200004050400010021000100000000000400A2 +:10FA300020082000040020002000200020002000DA +:10FA40001000200020000000000000004000200006 +:10FA5000880020002000200020000000000000009E +:10FA60001000000040001000000000002000000016 +:10FA70000000000000008000000000000000000006 +:10FA800000000000800000000000000000000000F6 +:10FA900000000000800004000400800080000000DE +:10FAA000000080008000040004000400000000004A +:10FAB0008000000000008000000000000000100036 +:10FAC000000010000000090000000000000000001D +:10FAD00010000000000000000000000020002020B6 +:10FAE0000000400020000000000000001040002046 +:10FAF0000000000000000000000001000400000001 +:10FB000000000000000000000100010001000000F2 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000040004000000AD +:10FB50000400000010000000000000000000000091 +:10FB60000000001000000010000000000200000073 +:10FB700000100000000000000000000004008000F1 +:10FB80000000000000000000000004000400040069 +:10FB90000000000000000000040000000000000061 +:10FBA00004000000000000000088000000000000C9 +:10FBB00000000000000800080000000800000088A5 +:10FBC000000000000008000000000000000000002D +:10FBD0000000000000080008000000100000000005 +:10FBE000020000000084000000000000001000007F +:10FBF0000000000000000000000000000000000005 +:10FC000000000000000000000000000000030000F1 +:10FC10000000000000880008002000000000000034 +:10FC200000000000010801030000000000000000C7 +:10FC30000000002000000000000000200000000084 +:10FC400000000000000000000003001000000000A1 :10FC500000000000000000000000000000000000A4 -:10FC600000000000A00000000000000000000000F4 -:10FC7000000000000008000000000000000000007C -:10FC80000000000000000000000000000000000074 -:10FC900000000000110000010000000020C0000072 -:10FCA000080000000000000000000000000000004C -:10FCB0000000000000000000000003000000000041 -:10FCC0000000000000000000000000000000000034 -:10FCD0000000000000821000000000000000000092 -:10FCE00000000000000000A000080000000000006C +:10FC6000000000000000000000000000080000008C +:10FC70000000000000000000000000000000000084 +:10FC800000000000000009000000000000000084E7 +:10FC90002100000000000020000000010000000022 +:10FCA0000008000000000400040000000000000044 +:10FCB00000004100000100000000000000A1000061 +:10FCC000000000000000000000000800000000002C +:10FCD00000000000000000004100080000000000DB +:10FCE0000000000000000000000000000000000014 :10FCF0000000000000000000000000000000000004 -:10FD0000A0000000000090000000000000000000C3 -:10FD100000000000000000000400000001000000DE -:10FD20000000004000000000820088000000000089 -:10FD3000040010000000000000000100A100C0004D -:10FD40000100000000000000000000000000820030 -:10FD5000000000000000080000000000000000009B -:10FD6000000000000000000000000800080008007B -:10FD70000000080008000800080000000000000063 -:10FD80000000000000000000000000000000000073 -:10FD90000000000002000000000000000000200041 -:10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000002000200003 -:10FDC000000020000800000000000000000000000B -:10FDD00000000000410000000000000000000000E2 -:10FDE000000000000000000008000000000000000B +:10FD000000000000000000000000000004000000EF +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300001000000000000000000000004000000BE +:10FD40000800000000000000000000008200000029 +:10FD5000000000080000000000000000000000009B +:10FD60000000001000000000000000040009004036 +:10FD70000000004000000000000000000000000043 +:10FD80000000000000000000000000C00000800033 +:10FD90000000000000000000000000000000000063 +:10FDA000000000000008000000000000000000004B +:10FDB00000000400000000000000000000008000BF +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE000000000000200000000000000000002000F :10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000000000000000F2 -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000008000000CA -:10FE300000000000000000000000C0000000000002 -:10FE400000000000000000001000000000000000A2 -:10FE5000A000000000000000000000000000000002 -:10FE60000003000000000008000000000000000087 +:10FE000000000000000000000000008000800000F2 +:10FE100000000000000300000000008000000080DF +:10FE200000000008000000000000000000050000C5 +:10FE300000000800000300000000000000000000B7 +:10FE400000000000000800000000000000000000AA +:10FE50000000000000000003080000000000000097 +:10FE60000000000000100000000000000000000082 :10FE70000000000000000000000000000000000082 -:10FE8000000000000000000000000000000000A0D2 -:10FE900000000000000000840000000000C000001E -:10FEA000000000000084000000000000008400004A -:10FEB00000000084000000840000000000C000007A -:10FEC000000000000000000800000000000000002A -:10FED000000000000000000800000000000000001A -:10FEE000000000000000000000000000000000080A +:10FE80000000000000000000000000000020002032 +:10FE9000000000A0000000000000000000200000A2 +:10FEA0000020000000000000000000000000000032 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000800000000000008000000000002 :10FEF0000000000000000000000000000000000002 -:10FF000002000000000000000000000000000000EF -:10FF100000000000000000000000000000000000E1 -:10FF200000090000000000000000000000090002BD -:10FF300000000000000000020000040000020000B9 -:10FF40000000000900000000000000000800880018 -:10FF5000000000000000000000000002000000009F -:10FF6000000000000000000084000000000000000D +:10FF000000000000000000000000000000000000F1 +:10FF1000000004050000410001000005000000048D +:10FF200000210005000000000000000800000000A3 +:10FF300000000005000000000003000500000000B4 +:10FF4000000000000005000000000000004100006B +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 :10FF70000000000000000000000000000000000081 :10FF80000000000000000000000000000000000071 -:10FF90000000000000000000000000000000000061 -:10FFA000000000000000000000000000000005004C +:10FF9000000000A080A00000C008040000000000D5 +:10FFA0002100000000000000000000000000000030 :10FFB0000000000000000000000000000000000041 :10FFC0000000000000000000000000000000000031 :10FFD0000000000000000000000000000000000021 -:10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 +:10FFE0000000000000000000000000080000000009 +:10FFF00000000000000008000000000000040010E5 :02000004002FCB -:1000000000000000000000000000000000000000F0 -:1000100000000000000000000000000000000000E0 -:1000200000000000010000000000000000000000CF -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 +:1000000000000000000000000000000000C00090A0 +:100010000000000000C000901000000000C0009030 +:100020000000000000C000900000000000C0009030 +:100030000000000000C000900000000000C0009020 +:1000400000000000000300C000900000000000005D :1000500000000000000000000000000000000000A0 :100060000000000000000000000000000000000090 :100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 -:1000A000000000000000110021000000000000001E -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 +:1000800000000000000000000000000000000080F0 +:10009000008000000000048021800000000000803B +:1000A0000080000000000080008000000000008050 +:1000B0000080000000000080008000000000008040 +:1000C00000800000000000000080008000000000B0 :1000D0000000000000000000000000000000000020 :1000E0000000000000000000000000000000000010 :1000F0000000000000000000000000000000000000 :1001000000000000000000000000000000000000EF -:1001100000050000000400000000000000000000D6 -:1001200000000000000000000041090000090080FC -:1001300000000000000000000000000000000000BF -:100140000000000000000000000000C000000003EC -:10015000000000020000000200000009000000058D +:1001100000000000800080800000000080008080DF +:1001200000000000800080800000000080008080CF +:1001300000000000800080800000000080008080BF +:1001400000000000800080800000000000008000AF +:10015000808000000000000000000000000000009F :10016000000000000000000000000000000000008F :10017000000000000000000000000000000000007F :10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000001010000004D -:1001B00000880000000000000000000000000000B7 -:1001C000000000000000000000000000009000009F -:1001D000000000000001000000010000000000001D +:100190000000000000008400C09000000000840007 +:1001A000C090000000008400C090000000008400A7 +:1001B000C090000000008400C09000000000840097 +:1001C000C090000000008400C0900000000000000B +:1001D0008400C0900000000000000000000000004B :1001E000000000000000000000000000000000000F :1001F00000000000000000000000000000000000FF :1002000000000000000000000000000000000000EE -:1002100000000000000020000000010000000000BD -:100220000000000000000000000000000000880046 -:1002300000000100000000000000000000000000BD -:1002400000000000000000000000000000000000AE -:1002500040000001010000008400000000000000D8 -:10026000400000000000000000000000000000004E +:100210000000000000000000009000C0000000008E +:10022000009000C000000000009000C0000000002E +:10023000009000C000000000009000C0000000001E +:10024000009000C000000000009000C0000000000E +:100250000000009000C0000000000000000000004E +:10026000000000000000000000000000000000008E :10027000000000000000000000000000000000007E :10028000000000000000000000000000000000006E -:1002900000000000000000008000000020000000BE -:1002A000000000000000000000000000000000004E -:1002B00000000000410000000000000000000000FD -:1002C000000000000000000000000000000000002E -:1002D0000000000000080200000000000000030011 -:1002E000000000000000030000000000000000000B +:10029000000000000000000000000080008000025C +:1002A000000200A000890000000000800080000023 +:1002B000000000800080000000000080008000003E +:1002C000000000800080000000000080008000002E +:1002D000000000000080008000000000000000001E +:1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED -:1003100000000000000000000004000000000000D9 -:1003200000000000000000000000000000000000CD -:1003300000000011040000000000000000000000A8 -:1003400000000000000000000000000000000000AD -:100350000000000000110000000300000000000089 +:10031000000000000000000080020021000000003A +:1003200080118011000000008011002100000000F9 +:100330008011800200000000801180110000000088 +:1003400080118011000000008011002100000000D9 +:10035000000080118002000000000000000000008A :10036000000000000000000000000000000000008D :10037000000000000000000000000000000000007D :10038000000000000000000000000000000000006D -:10039000000000000000000000000001000000005C -:1003A000000000000000000000000000000000004D -:1003B000000000000001000000000000000000003C -:1003C000000000000000000000000000000000002D -:1003D000000000000000000100000001000000001B +:1003900000000000000000000000900000000000CD +:1003A0000000C001200000000000C00000000000AC +:1003B0009000C001200000000000C00120000000EB +:1003C0000000C001200000000000C000000000008C +:1003D00088000000C00120000000000000000000B4 :1003E000000000000000000000000000000000000D :1003F00000000000000000000000000000000000FD :1004000000000000000000000000000000000000EC -:10041000000000000000000000000000000002E0FA -:1004200000000000000000000000000000000000CC -:1004300000000000000000E000008141000000001A -:1004400000000000000000000000000000000000AC -:10045000000000000000000002E0000000000000BA -:1004600002E000000000000002E0000000000000C8 +:10041000000000000000000000000000004200009A +:10042000060000000042000006000000004200003C +:10043000060000000042000006000000004200002C +:10044000060000000042000006000000004200001C +:10045000060000000000004200000600000000004E +:10046000000000000000000000000000000000008C :10047000000000000000000000000000000000007C :10048000000000000000000000000000000000006C :10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B000000000000000000000000000000000003C -:1004C000000000000000000000000000000000002C -:1004D000000000000000000000000000000000001C +:1004A000FFFF000000FF000000FF000000FF000051 +:1004B0003C3C000000FF000000FF000000FF0000C7 +:1004C00000FF000000FF000000FF000000FF000030 +:1004D0003C3C000000FF0000000000FF000000FFA7 :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC :1005000000000000000000000000000000000000EB :1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000000AB -:10055000000000000000000000000000000000009B -:10056000000000000000000000000000000000008B +:100520000000FFFF000000FF000000FF000000FFD0 +:1005300000003C3C000000FF000000FF000000FF46 +:10054000000000FF000000FF000000FF000000FFAF +:1005500000003C3C000000FF0000000000FF000025 +:1005600000FF00000000000000000000000000008C :10057000000000000000000000000000000000007B :10058000000000000000000000000000000000006B :10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B +:1005A0000000FF000000FF000000FF000000FF004F +:1005B0000000FF000000FF000000FF000000FF003F +:1005C0000000FF000000FF000000FF000000FF002F +:1005D0000000FF000000FF0000000000FF0000001E +:1005E00000FFFFFF0000000000000000000000000E :1005F00000000000000000000000000000000000FB :1006000000000000000000000000000000000000EA :1006100000000000000000000000000000000000DA -:1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A -:10066000000000000000000000000000000000008A +:1006200000000000FF000000FF000000FF000000CD +:10063000FF000000FF000000FF000000FF000000BE +:10064000FF000000FF000000FF000000FF000000AE +:10065000FF000000FF000000FF0000000000FF009E +:10066000000000FFFFFF000000000000000000008D :10067000000000000000000000000000000000007A :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A -:1006A00000000000000000650006000F20000000B0 -:1006B00000000000000000000000000000000040FA -:1006C0000006000C00000000000000000000000018 -:1006D000000000000000000000000000000000001A -:1006E00000440006000E200000650006000F2000F8 -:1006F00000650006000F2000000000000000000060 +:1006A000000000000000030203380C0092C003E3C6 +:1006B000033E0C0D92C0038203380C0092C00382EB +:1006C00003380C0092C0038203380C0092C00382EE +:1006D00003380C0092C0038203380C0092C0000063 +:1006E000038203380C0082C00000000000000000FC +:1006F00000000000000000000000000000000000FA :1007000000000000000000000000000000000000E9 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000F0FFFFF000000000000000000008D +:1007300000000000000800080000000000000000A9 +:1007400000000000000000000000000000000000A9 :100750000000000000000000000000000000000099 -:1007600000000000555500FF0000000000000000E0 +:100760000000000000000000000000000000000089 :100770000000000000000000000000000000000079 :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C000000000000F0F000000000000000000000B +:1007B0000000000000000800000000000000000031 +:1007C0000000000000000000000000000000000029 :1007D0000000000000000000000000000000000019 -:1007E000000000000000555500FF00000000000060 +:1007E0000000000000000000000000000000000009 :1007F00000000000000000000000000000000000F9 :1008000000000000000000000000000000000000E8 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 :1008300000000000000000000000000000000000B8 -:100840000000000000000000F0F0000000000000C8 +:1008400000000000000000000000000000000000A8 :100850000000000000000000000000000000000098 -:1008600000000000000000000000AAAA0000000034 +:100860000000000000000000000000000000000088 :100870000000000000000000000000000000000078 :100880000000000000000000000000000000000068 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 :1008B0000000000000000000000000000000000038 -:1008C00000000000000000000000F0F00000000048 +:1008C0000000000000000000000000000000000028 :1008D0000000000000000000000000000000000018 -:1008E000000000000000000000000000AAAA0000B4 +:1008E0000000000000000000000000000000000008 :1008F00000000000000000000000000000000000F8 :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:100940000000000000000000010085000080008021 -:100950000000000000000000000000000000000097 -:100960000000000000000000000100002000000066 -:1009700000000000000000000000840000000000F3 -:1009800000000000040000000400840020000000BB -:1009900000000000000000000000200000008400B3 -:1009A0000000000000000000000000000000000047 -:1009B0000000000000000000000000000000000037 -:1009C00000000000000000000000020002000040E3 -:1009D00000400000000000000000000000000000D7 -:1009E00000000000000000000000000000004000C7 -:1009F00000000000000000000002000000004000B5 -:100A000000000000000000000000000000020000E4 -:100A100000020000000200020000000000001002BE -:100A20000002000000000000000000400000000084 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000002000200A2 -:100A5000020002000000000000000000021002106E -:100A60000200021000000000000000000000000072 -:100A7000000000000000840084000000000000006E +:100930000000000000000000000005800100010030 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000020000000000077 +:100960000000000000000000000000000000000087 +:100970000000000000000000040000000000000073 +:100980000000000000000000000000000000000067 +:100990000200000000000000200000000000000035 +:1009A00000000080A0000080108000000000000017 +:1009B000000000000000000000000000840440006F +:1009C00040000000000000000000000000000000E7 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000002000D7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A20000000000000020000210841020000000058 +:100A300000000000000000000000000004000000B2 +:100A40000000000000000020002000200000004006 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 :100A80000000000000000000000000000000000066 -:100A90000000000000100000000000000000000046 -:100AA000080008000800000000000000000000002E -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000001000100000000000000000D6 +:100A90000000000002000200000000000000000052 +:100AA0000000000000000410000000000000000032 +:100AB00000000000000000000000000000008000B6 +:100AC0000000000000000000000100010001000023 +:100AD0000000000004000000000000000000000012 +:100AE000000000000000000000C000000000000046 +:100AF00000000000000800000000000000000000EE :100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 +:100B100000000000001000000000000000000000C5 +:100B200000000000020000000000000000000000C3 :100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000003000000000000000000000092 -:100B60000021000000000000000000000000000064 -:100B70000000001000000000000000000000000065 +:100B400000000000000000000000000000000003A2 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 :100B80000000000000000000000000000000000065 -:100B90000000000000000400000000000000000051 -:100BA0000000000000000000400000000000000005 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD00000000000000020000000000000000000F5 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000400000000000000000041 +:100BB0002000000000000000000000000000110004 +:100BC000000000000000000000000000000800001D +:100BD0000000000000000000000000000000000015 :100BE0000000000000000000000000000000000005 :100BF00000000000000000000000000000000000F5 :100C000000000000000000000000000000000000E4 -:100C100000000400000000000000000000000000D0 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000010000000000000001000000000092 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000001100B3 +:100C30000000800000000000000000000000000034 +:100C4000000000200020002000200020008000057F +:100C50000000010000000000000000000000000093 :100C60000000000000000000000000000000000084 :100C70000000000000000000000000000000000074 :100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB0000800000008000000000000000000000024 -:100CC0000000000000000000000000000000000024 -:100CD00000000000040000A000000008040820003C +:100C90000000000000000000000000000010000044 +:100CA0000000000000000000020000000000000042 +:100CB0008811000500800000000000000000000016 +:100CC00000000000000100010001000100010020FF +:100CD0000000000004000000000000000000000010 :100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 +:100D10000000000000000000009000000000000043 :100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D5000020000000020000000000000000010045D +:100D3000000000020090000400000000000000001D +:100D4000000000000000040000000000002000007F +:100D5000000000200000002000000000000800004B :100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 :100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD000000080000000000100840000000000848A -:100DE0008001000000000000000000000000000082 -:100DF00000000000000000000000000000000000F3 -:100E0000000000840000000000000000000000005E +:100DA0000000000000000000000020000000000023 +:100DB000000000000400000000000000000000002F +:100DC00000000000000000008000000000000001A2 +:100DD000050000000001000000010000000000000C +:100DE00021000000000000000000000000000000E2 +:100DF000000000840000000000000000000000006F +:100E000000000000000000000000000000000000E2 :100E100000000000000000000000000000000000D2 :100E200000000000000000000000000000000000C2 :100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E6000000800040000000900020000000000006B -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000002000060 +:100E4000000000000000000000000000010000059C +:100E5000000900000004000500209000000000418F +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000270 +:100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 +:100EA00000000000000000000000000000009000B2 :100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000082000000000000000090 -:100EE00000000000000800000000000005000000F5 +:100EC00000000000000000000000000000004000E2 +:100ED0000000000000000000000000010000000011 +:100EE0000000000000000000000000000000000002 :100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 +:100F3000404000000000000000000000020000002F :100F400000000000000000000000000000000000A1 -:100F500000000000000000000000900000080000F9 -:100F600001000090000000000000000000000000F0 +:100F500040C085908200000101C0009000000000A8 +:100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 +:100F8000000300000000000000000000000000005E :100F90000000000000000000000000000000000051 :100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 +:100FB00000000000000000000000000101018801A5 :100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000011008000008000 -:100FE000000011002180000000000000000000004F +:100FD00000008980119180090011048021800000A7 +:100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 :1010000000000000000000000000000000000000E0 :1010100000000000000000000000000000000000D0 :1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000008010 -:10106000000000800041090000100080000800001E +:101030000000000000000000000000000941214005 +:10104000004000030000000000000000000000005D +:10105000000080009100904183C180A10000002128 +:101060000080808000000000000000000000000000 :101070000000000000000000000000000000000070 :101080000000000000000000000000000000000060 :101090000000000000000000000000000000000050 :1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000020000000C000890190000100200001E4 +:1010B0000000000000000000000000000000080028 +:1010C00008000800102000000000000000000000E0 +:1010D000040000009000080241008441C091840097 +:1010E000000000C0C0A000000000000000000000E0 :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF :1011100000000000000000000000000000000000CF :1011200000000000000000000000000000000000BF :1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:1011600001000088880001000100080002900000D2 -:10117000000002000000000000000000000000006D +:10114000009000000000010000000000000000000E +:101150000000000000000000080800010091C0C16C +:1011600084840040C090C0C0000000000000000067 +:10117000000000000000000000000000000000006F :10118000000000000000000000000000000000005F :10119000000000000000000000000000000000004F :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000004100008000000900090080008080AC -:1011F000410000008000000000000000000000002E +:1011C000000000000001000100000000000000001D +:1011D000000000000000000000008089004011C0F5 +:1011E000808500000080808080800000000000007A +:1011F00000000000000000000000000000000000EF :1012000000000000000000000000000000000000DE :1012100000000000000000000000000000000000CE :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E -:10126000000000000011000000800000001180114B +:10124000000000000005211009211103000000002A +:10125000000000000000004100000000C0911120CB +:10126000A0210810801180A00000000000000000F4 :10127000000000000000000000000000000000006E :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E -:1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E -:1012E00000000000000000010000004000000001BC -:1012F0002001008800000000000000000000000045 +:1012C0000000000000000802200040001110000093 +:1012D0000000000000000000000100000000C191BB +:1012E000010140010101C00120410088000000000F +:1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD :1013100000000000000000000000000000000000CD :1013200000000000000000000000000000000000BD :1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D -:1013600000000000000000000000000007008221D3 -:10137000000000E007008100000000000000000005 +:101340000000000000000000012000000100010179 +:101350000000000000000000004200000600420003 +:101360000042006006000042004200000600004209 +:10137000000000000000000000000000000000006D :10138000000000000000000000000000000000005D :10139000000000000000000000000000000000004D :1013A000000000000000000000000000000000003D :1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D +:1013C0000000000000000000000088000060000035 :1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F000F0F00000FF000000FF000000000000000F +:1013E0000000F6F60000E724000066660000F33017 +:1013F00000000000000000000000000000000000ED :1014000000000000000000000000000000000000DC :1014100000000000000000000000000000000000CC :1014200000000000000000000000000000000000BC :1014300000000000000000000000000000000000AC :10144000000000000000000000000000000000009C :10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:101470000000F0F00000FF000000FF00000000008E +:101460000000000090900000E7240000FF00000052 +:10147000F330000000000000000000000000000049 :10148000000000000000000000000000000000005C :10149000000000000000000000000000000000004C :1014A000000000000000000000000000000000003C @@ -192900,276 +192900,276 @@ :1015300000000000000000000000000000000000AB :10154000000000000000000000000000000000009B :10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:101570000F0F0000FFFF000000FF0000FFFF000052 +:10156000000000000000F0F00000666600000CCFF4 +:10157000000066660000E7E70000000000000000D1 :10158000000000000000000000000000000000005B :10159000000000000000000000000000000000004B :1015A000000000000000000000000000000000003B :1015B000000000000000000000000000000000002B :1015C000000000000000000000000000000000001B :1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB -:1015F00000000F0F00000000000000FF00000000CE +:1015E0000000000000000000F0F0000000FF00001C +:1015F0000CCF000000FF00002424000000000000C9 :1016000000000000000000000000000000000000DA :1016100000000000000000000000000000000000CA :1016200000000000000000000000000000000000BA :1016300000000000000000000000000000000000AA :10164000000000000000000000000000000000009A :10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:101670000000000005002A00054000A815402A06C9 -:10168000054C00A800000000000000000000000061 +:101660000000000000000038000010C003E3033C4D +:101670000C0D92C003E3033E0C0DC2C0000000003D +:10168000000000000000000000000000000000005A :10169000000000000000000000000000000000004A :1016A000000000000000000000000000000000003A :1016B000000000000000000000000000000000002A :1016C000000000000000000000000000000000001A -:1016D000000000000000000000000000000000000A -:1016E00000000000000000000000000000000000FA -:1016F00000000000000000000000000000000000EA -:101700005555FFFF00000000000000000000000031 +:1016D00000000000000000610006800D0000000016 +:1016E00000000000000000000000000000003E3488 +:1016F000FF000000200000000000000000000000CB +:1017000000000000000000000000000000000000D9 :1017100000000000000000000000000000000000C9 :1017200000000000000000000000000000000000B9 :1017300000000000000000000000000000000000A9 :101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 +:101750000000000000000000000000000000800009 :101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:1017800000005555000000000000000000000000AF +:10177000BE14FF000000000000000000FFFFFFFF9C +:101780000000000000000000000000000000000059 :101790000000000000000000000000000000000049 :1017A0000000000000000000000000000000000039 :1017B0000000000000000000000000000000000029 :1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 +:1017D00000000000000000000000000000200000E9 :1017E00000000000000000000000000000000000F9 :1017F00000000000000000000000000000000000E9 -:10180000000000000000F0F00000000000000000F8 +:1018000000000000000000000000000000000000D8 :1018100000000000000000000000000000000000C8 :1018200000000000000000000000000000000000B8 :1018300000000000000000000000000000000000A8 :101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000F0F000000000000078 +:10185000000000000000000000000000FF00FF0585 +:10186000FFFFFFFF0000000000000000000000007C +:101870000000000000C000C00200020000000000E4 +:101880000000000000000000000000000000000058 :101890000000000000000000000000000000000048 :1018A0000000000000000000000000000000000038 :1018B0000000000000000000000000000000000028 :1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 +:1018D00000000000000000000000000000003C00CC +:1018E00014F5FEFFFFFF00000000000000000000F4 :1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000400C3 -:1019200000000000000000010000000000000000B6 -:1019300000000000000000000000000000000000A7 -:101940002000000000000000000000000000000077 -:101950000000000000000000000000000000000087 -:101960002000000000000000000000000000000057 +:1019000004000000000000000000000002000400CD +:1019100004000400000000000000000004000000BB +:101920002000000004000002000000000000200071 +:101930000000000000000100000000000000200086 +:1019400010000000000020800000000000002100C6 +:10195000000000000000000008000000000020005F +:101960000000000040002100000000000000000016 :101970000000000000000000000000000000000067 -:101980000000000000000000000004000000000053 -:101990000000030000020000000000000000000042 -:1019A0000000040000000200000000000000000031 -:1019B00000000000000021001000000000000000F6 -:1019C000000000000000000200000000040200000F -:1019D000000200020000000000000000000200C041 -:1019E0000002000240004000000000000000000073 -:1019F00000000000020000000000020000000000E3 -:101A00000200900000009000900000000000000024 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000020000000000000025 +:1019C0000000000000000000004000004002000095 +:1019D0000200000000000000100080004000000035 +:1019E00000000000000000000200000000000000F5 +:1019F0000000000000000000000090000000000057 +:101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 -:101A200000100400000000000200000000000000A0 -:101A300000000000000000000000000000000000A6 -:101A40000010000000000000001000000000000076 -:101A5000001000000200000000000000000008006C -:101A60000000000000000200000002100000000062 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000200000000000000A4 +:101A40000000000000000000000000000000000096 +:101A5000000000000000000000000004040000007E +:101A600004090080000000000000000400000000E5 :101A70000000000000000000000000000000000066 -:101A80000200000000000000000000000000000054 +:101A80000000000000000000000000000000000056 :101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 +:101AA000000000000000000000000000000000082E :101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000004000400000000000000EE +:101AC0000000000000000000000000000000001006 +:101AD0000000000000000000000000000004800082 +:101AE0000000800000100000000000000000000066 :101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000010000000000000000000000C4 +:101B000000000000000000000000000000000008CD +:101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 +:101B4000000000000000000000050000002100026D +:101B50000008000500000000000000000021002037 +:101B60000000000500100000000000050021000535 +:101B70000000000000000000000000000000400025 :101B80000000000000000000000000000000000055 -:101B90000000000000002000000000000000000025 +:101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 :101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 +:101BE000000000004000400102C0000000000000B2 +:101BF00040000000000000000000000000000000A5 :101C000000000000000000000000000000000000D4 -:101C100000000000000001800180000000000000C2 -:101C200000000002000000000000000000000000B2 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000004000000000000034 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C900000000000000000002020022000000000E2 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C3000000000000000000000000000080000009C +:101C4000080000080000000000400000000008003C +:101C5000000000000040000000400040000082083A +:101C6000000010000003000400040100000000094F +:101C7000000000050000000000000000000000005F +:101C80000000000000C00000000000000000000094 +:101C90000000000000000000000000000000000044 :101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 :101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000002000B3 -:101D100000009000000001800000000010000000A2 +:101CE00000A000A0000000820200000004000040EC +:101CF0000000000010A00000000000000000000034 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 :101D200000000000000000000000000000000000B3 :101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D900000C000000000008410402100000080848A +:101D40000000080000000000000000000000000883 +:101D500000000000820000000000002100000000E0 +:101D6000000000050000002100000000002000002D +:101D7000000000000000000800000000000000005B +:101D8000000000000004000011A00000000000009E +:101D9000000000000000218400000000000000009E :101DA0000000000000000000000000000000000033 :101DB0000000000000000000000000000000000023 :101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 +:101DE00000000000000000000000000000000001F2 +:101DF0000000080000041000038200000000000042 :101E000000000000000000000000000000000000D2 -:101E10000000000088000000000000000100000039 -:101E200000020000000000090002000000000000A5 +:101E10009000000000000000000000000000000032 +:101E200000020000000000000000000000000000B0 :101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 +:101E40000000000000000000000000000021002150 +:101E50000005000000000000000300000003000572 +:101E600000210000000400210021001000000110EA +:101E70000000000000040009004000050000000010 :101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000202002 -:101EA0000000000000002000000000000000000012 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 +:101ED0000000000000000000000000000000008280 +:101EE00000A0001000000000000000001000000032 +:101EF0000401008400000000020000200000000037 :101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000100C0 -:101F20009000000000000000000000000000000021 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 :101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 +:101F40000000000000000000C088004000020008FF +:101F50000000000000000000408800820002101015 +:101F6000088810100008820800000000000000002F +:101F7000081000080000A008C08840A000028202EB :101F80000000000000000000000000000000000051 :101F90000000000000000000000000000000000041 -:101FA0001100A1000000000000000000000000007F +:101FA0000000000000000000000000000000000031 :101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 +:101FC0000000000000000000000080800080000091 +:101FD0000000000000000000000000800080000001 +:101FE0008000808080800080800000000000000071 +:101FF00000008080008000000080808000000000E1 +:102000008000000000000000000000000000000050 :1020100000000000000000000000000000000000C0 -:102020000000000809800009000000000000000016 +:1020200000000000000000000000000000000000B0 :1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 +:1020400000000000000000000000000000000091FF +:1020500000890000000000000000000080000090E7 +:1020600000800080000080C100000000000000002F +:1020700000000000000080000000800000000088D8 +:1020800000008000000000000000000000000000D0 :102090000000000000000000000000000000000040 -:1020A00000000000000101020000008800000000A4 +:1020A0000000000000000000000000000000000030 :1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF +:1020C0000000000000000000000000000000900080 +:1020D000020800C09000000000000000000008009E +:1020E000880800080010020010090010000000001D +:1020F00000000000000084009002C00408100000EE +:10210000A00900900800000000000000000000008E :1021100000000000000000000000000000000000BF -:10212000000000000000C1008888020000000000DC -:10213000020000000000000000000000000000009D +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F :10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F +:102150000202001000020302000000000000000064 +:10216000080800200002100010020002000882008F +:102170000000000000000000009000080200880835 +:10218000100000A00002080800000000000000008D :10219000000000000000000000000000000000003F -:1021A00000000000000000004100008080004100AD -:1021B000000080000000000000000000000000009F +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F :1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE +:1021D000000000000000000021800000000000005E +:1021E000000080800080000000000080000000806F +:1021F000900000000000000000001080008000003F +:10220000008000000000000080800000000000004E :1022100000000000000000000000000000000000BE -:10222000000000000000000000000011100000800D +:1022200000000000000000000000000000000000AE :10223000000000000000000000000000000000009E :10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E +:10225000000000008000000000800000000000007E +:1022600000000000000480000080000000008002E8 +:1022700080808000000000000000000000008084DA +:10228000000080000000800000000000000000004E :10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000100002D -:1022B00000400000000000000000000000000000DE +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E :1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD +:1022D0000000000000000800880002080200000062 +:1022E000000000000000040188100210100010001F +:1022F00088021084080000000000000000000000B8 +:102300000809880008000400888802100200000004 :1023100000000000000000000000000000000000BD :1023200000000000000000000000000000000000AD -:1023300000E0070082000000000000000000000034 +:10233000000000000000000000000000000000009D :10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D +:10235000000000000000000000000000000042211A :10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D +:10237000000000000000420000000000000000001B +:102380000000000007000000000000000000420004 :10239000000000000000000000000000000000003D :1023A000000000000000000000000000000000002D -:1023B00000000000F0F0000000000000000000003D +:1023B000000000000000000000000000000000001D :1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD -:1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000000CC -:1024100000000000000000000000000000000000BC +:1023D00000000000000000000000F232C202FFC74F +:1023E000BEC70000000000000000343704070000F2 +:1023F00000005555C3C3FF05FF05000000000000A5 +:1024000000003F7D3F7DACACF0F0383B080BF0FFA7 +:10241000FF050000000000000000000000000000B8 :1024200000000000000000000000000000000000AC -:10243000000000000000F0F00000000000000000BC +:10243000000000000000000000000000000000009C :10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C -:10247000000000000000000000000000000000005C -:10248000000000000000000000000000000000004C -:10249000000000000000000000000000000000003C +:10245000000000000000000000000000FE3ECE0E64 +:10246000FFC7BEC70000000000000000F4F7C4C7AB +:102470008230823000FFF0F0F3FFF3FF0000000035 +:10248000000000003F7D3F7DACAC0000F8FBC8CBF6 +:10249000FFFFFF050000000000000000000000003A :1024A000000000000000000000000000000000002C -:1024B000000000000000FFFF0000FFFF0000000020 +:1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC -:1025000000000000000000000000000000000000CB -:1025100000000000000000000000000000000000BB +:1024D0000000000000000000000000000000FFEF0E +:1024E0005545FFFFFFFF00000000000000005545BC +:1024F000FFEFFFFFFFFFDFFFDFFF575757570000DA +:10250000000000000000BE3CBEFF55001E1EFFEF95 +:102510003C2CAFAF0F0F00000000000000000000D7 :1025200000000000000000000000000000000000AB :10253000000000000000000000000000000000009B :10254000000000000000000000000000000000008B :10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000000003B +:10256000FFFF5555C0C0CFCF0000000000000000A5 +:102570005555FFFFE8E8E8E8FFFF0000F7F7F7F739 +:102580000000000000000000BE3CBEFF55001E1E03 +:10259000FFFF3C3CAFAFFFFF000000000000000069 :1025A000000000000000000000000000000000002B -:1025B000000000000000000005402A06054C00A8AD +:1025B000000000000000000000000000000000001B :1025C000000000000000000000000000000000000B :1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA -:1026100000000000000000000000000000000000BA +:1025E00000000000300000100000000000000000AB +:1025F000000000003000001000010000300000105A +:102600000001000000000000000005000A080500AD +:1026100000A00000300000100001000000000000D9 :1026200000000000000000000000000000000000AA -:10263000000000000000000000000000FF00FFFF9D +:10263000000000000000000000000000000000009A :10264000000000000000000000000000000000008A :10265000000000000000000000000000000000007A :10266000000000000000000000000000000000006A @@ -193177,7 +193177,7 @@ :10268000000000000000000000000000000000004A :10269000000000000000000000000000000000003A :1026A000000000000000000000000000000000002A -:1026B0000000000000000000000000000000FF001B +:1026B000000000000000000000000000000000001A :1026C000000000000000000000000000000000000A :1026D00000000000000000000000000000000000FA :1026E00000000000000000000000000000000000EA @@ -193186,7 +193186,7 @@ :1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 :102730000000000000000000000000000000000099 -:102740000000F0F0000000000000000000000000A9 +:102740000000000000000000000000000000000089 :102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 :102770000000000000000000000000000000000059 @@ -193194,7 +193194,7 @@ :102790000000000000000000000000000000000039 :1027A0000000000000000000000000000000000029 :1027B0000000000000000000000000000000000019 -:1027C00000000000F0F00000000000000000000029 +:1027C0000000000000000000000000000000000009 :1027D00000000000000000000000000000000000F9 :1027E00000000000000000000000000000000000E9 :1027F00000000000000000000000000000000000D9 @@ -193203,115 +193203,115 @@ :1028200000000000000000000000000000000000A8 :102830000000000000000000000000000000000098 :102840000000000000000000000000000000000088 -:102850000000000000020000000000000000000076 -:102860004000000000000000000000000000000028 -:102870000000000000000000000000000000000058 -:102880000000200000000000000000000000000028 -:102890000000000000000000000000000000000038 -:1028A0000000200000000000000000000000000008 +:102850000000000000000000040000000000000074 +:102860000000000040000000000000000000000028 +:102870000000000000000000000020000000000038 +:102880000000400020000000000000800000000068 +:10289000000000000000C0000000200000008200D6 +:1028A000C000848000000000000000000000000064 :1028B0000000000000000000000000000000000018 -:1028C0000000000000000000000000000000000008 -:1028D00000000000000010020000000000000000E6 -:1028E00000000000000000004000000000000000A8 +:1028C0000002000000000000000000000000000006 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 :1028F00000000000000000000000000000000000D8 -:1029000000000000000000000000000000000002C5 -:10291000000000000000100200000002000200029F -:102920000090000000000000000000000000000017 +:102900000000000000000000000000000040000087 +:1029100000000000000000020002000200020000AF +:102920000000100000100000000000000000000087 :102930000000000000000000000000000000000097 -:10294000000000000000080008000000080000006F +:102940000000000000000000000000000000000087 :102950000000000000000000000000000000000077 -:102960000000000000000000020000000000000065 -:102970000000000000000000000000000000001047 -:102980000000000000000000000000000000000047 -:10299000000000000000000000000000080000002F -:1029A0000000000000000000000000000000000027 +:102960000000000000000000000000000000000067 +:10297000000000000000000800000000000000004F +:10298000000000000000000000000008000000003F +:102990000000000000000000000000110000000026 +:1029A00000000041000400000000000000000000E2 :1029B0000000000000000000000000000000000017 :1029C0000000000000000000000000000000000007 :1029D00000000000000000000000000000000000F7 :1029E00000000000000000000000000000000000E7 -:1029F0000000000000000000000000000040000097 +:1029F00000000000000000000000000000000000D7 :102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 -:102A200000000000000000000000000000000000A6 +:102A10000000000800000000000800000010000096 +:102A200000000000000400C00000000000000000E2 :102A30000000000000000000000000000000000096 :102A40000000000000000000000000000000000086 :102A50000000000000000000000000000000000076 :102A60000000000000000000000000000000000066 :102A70000000000000000000000000000000000056 :102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA00000004000000000000000000000000000E6 +:102A9000000000000021000800000000000000030A +:102AA00000000041880584001000000000000000C4 :102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000C00000000046 -:102AD0000000000000000084000000000000000072 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 :102AE00000000000000000000000000000000000E6 :102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000004000000B1 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B500000000000000000400040004000000000B5 +:102B000000080000000000000000000000000002BB +:102B100000A0008800A00082000200000020000049 +:102B200000000000000000A0000000844000000041 +:102B30000000000000000041001000100010000024 +:102B40000010000000000000000000000000000075 +:102B50000000000000000000000000000000000075 :102B60000000000000000000000000000000000065 :102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000010000000000000000015 +:102B8000000000000000000000000008000000003D +:102B90000000004000000000004100400000000074 +:102BA00000000000001000000008000200080008FB :102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD0000000000009000000000000840000004028 -:102BE00000000000000000000000004000000000A5 -:102BF00000000000000000000000000000000000D5 -:102C00000040000000000000000000000000000084 -:102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 -:102C30000000000000000000000000000000000094 +:102BC00000040004000400040000000400000000F1 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000001000C5 +:102C00000000000000000000000000A000A00584FB +:102C10001000100000000000000000080008000084 +:102C2000000000880008008200100084008410A0CA +:102C30001084000000000000000000000000000000 :102C40000000000000000000000000000000000084 :102C50000000000000000000000000000000000074 :102C60000000000000000000000000000000000064 :102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000084000080 -:102CD00000C000000000000000840084000000002C +:102C80001000000000000000000000000000000034 +:102C900000000000000000000000100000400000E4 +:102CA0000000004000000000000000410020004043 +:102CB00000000000000000000000000000C0000054 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 :102CE00000000000000000000000000000000000E4 :102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D5000000000000000000900000000000000006A -:102D60000000000200020000000800000000000057 +:102D000000000502110000000000000000000000AB +:102D10000040000000000000000000000000000073 +:102D200000000000000000C000000000008400005F +:102D300040880004000000000000000000000000C7 +:102D400000000000008000000010000000000000F3 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 :102D70000000000000000000000000000000000053 :102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000200000000000000000000000000F1 -:102DE00011000000000000000000000000000000D2 +:102D90000000000000081000000000000008000013 +:102DA000000000009000000500000000000000216D +:102DB00000032000000408020000000000000000E2 +:102DC0000000008400002010000000000004050046 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 :102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 +:102E000000000008000000000008000041000084ED +:102E100000000000000000080000000000080000A2 +:102E200021000010000841000000008400082184F7 +:102E300000081184000800040040000000000000A9 :102E40000000000000000000000000000000000082 :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 :102E70000000000000000000000000000000000052 :102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 +:102E9000000000000000000000000000008800C0EA +:102EA0000004908800000000000000000000000006 :102EB0000000000000000000000000000000000012 :102EC0000000000000000000000000000000000002 :102ED00000000000000000000000000000000000F2 :102EE00000000000000000000000000000000000E2 :102EF00000000000000000000000000000000000D2 :102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 +:102F10000000000000000000000000000000008031 :102F200000000000000000000000000000000000A1 :102F30000000000000000000000000000000000091 :102F40000000000000000000000000000000000081 @@ -193320,23 +193320,23 @@ :102F70000000000000000000000000000000000051 :102F80000000000000000000000000000000000041 :102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 +:102FA000000000918084800000000000000000000C +:102FB0000000000000000000000080008000800091 +:102FC0000000000000000000080004000000840071 :102FD00000000000000000000000000000000000F1 :102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 :1030000000000000000000000000000000000000C0 :1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 +:1030200000000000004010840804000000000000C0 +:1030300000000000000000000000C0000800840044 +:103040000820000000000000000000000000000058 :103050000000000000000000000000000000000070 :103060000000000000000000000000000000000060 :103070000000000000000000000000000000000050 :103080000000000000000000000000000000000040 :103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 +:1030A00000000000404000C0C00402C0000000005A :1030B0000000000000000000000000000000000010 :1030C0000000000000000000000000000000000000 :1030D00000000000000000000000000000000000F0 @@ -193344,7 +193344,7 @@ :1030F00000000000000000000000000000000000D0 :1031000000000000000000000000000000000000BF :1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F +:10312000000000000000808000000000020000009D :10313000000000000000000000000000000000008F :10314000000000000000000000000000000000007F :10315000000000000000000000000000000000006F @@ -193352,17 +193352,17 @@ :10317000000000000000000000000000000000004F :10318000000000000000000000000000000000003F :10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F +:1031A000000000000000000000008000800000001F :1031B000000000000000000000000000000000000F :1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF +:1031D0000000000000880000000000000000000067 :1031E00000000000000000000000000000000000DF :1031F00000000000000000000000000000000000CF :1032000000000000000000000000000000000000BE :1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E +:1032200000000000000000000000900088C084C082 +:10323000840000000000000000000000000000000A +:103240000000000000080002000000000000000074 :10325000000000000000000000000000000000006E :10326000000000000000000000000000000000005E :10327000000000000000000000000000000000004E @@ -193376,8 +193376,8 @@ :1032F00000000000000000000000000000000000CE :1033000000000000000000000000000000000000BD :1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D +:103320000000000000000000000000000000D9D0F4 +:10333000DFD6C00300030000000000000000000012 :10334000000000000000000000000000000000007D :10335000000000000000000000000000000000006D :10336000000000000000000000000000000000005D @@ -193385,7 +193385,7 @@ :10338000000000000000000000000000000000003D :10339000000000000000000000000000000000002D :1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D +:1033B00049404F46C000000000000000000000002F :1033C00000000000000000000000000000000000FD :1033D00000000000000000000000000000000000ED :1033E00000000000000000000000000000000000DD @@ -193396,28 +193396,28 @@ :10343000000000000000000000000000000000008C :10344000000000000000000000000000000000007C :10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C +:10346000CCCC0000000000000000000000000000C4 :10347000000000000000000000000000000000004C :10348000000000000000000000000000000000003C :10349000000000000000000000000000000000002C :1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C +:1034B00000000000FFFF6666FFFFFFFF0000000046 :1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC +:1034D000F300910000000000000000000000000068 +:1034E000CCCC000000000000000000000000000044 :1034F00000000000000000000000000000000000CC :1035000000000000000000000000000000000000BB :1035100000000000000000000000000000000000AB :10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B +:10353000000000000000FFDF6646FF996600000003 :10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B +:103550000000F3F391910000000000000000000063 :10356000000000000000000000000000000000005B :10357000000000000000000000000000000000004B :10358000000000000000000000000000000000003B :10359000000000000000000000000000000000002B :1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B +:1035B00000000000000000000000300000100001CA :1035C00000000000000000000000000000000000FB :1035D00000000000000000000000000000000000EB :1035E00000000000000000000000000000000000DB @@ -193452,8712 +193452,518 @@ :1037B0000000000000000000000000000000000009 :1037C00000000000000000000000000000000000F9 :1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 +:1037E0000000000000000000000000000200008057 :1037F00000000000000000000000000000000000C9 -:1038000000000000040000000000000000000000B4 +:103800000000000000000000000000002000000098 :1038100000000000000000000000000000000000A8 -:103820000001000000000000000000000000000097 -:103830000000000000000000000000000000000088 -:103840000000000000000200000000000000020074 -:1038500000001000000082000000000002000000D4 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 +:103820000002000000000000000002000000000094 +:103830000000000001008400C00000000000C00083 +:10384000C1800000010000004000200000000000D6 +:1038500020000000010000000080400000804000C7 +:1038600000840000000000000000000000000000D4 +:103870000020000000000000000000000000000028 :103880000000000000000000000000000000000038 :103890000000000000000000000000000000000028 -:1038A00000000000000000000040000000000000D8 -:1038B00000000000000000000000000000400000C8 -:1038C00000000000000000000000000000004000B8 -:1038D0004000000240000000000000000000000066 -:1038E00000000000000000000000000002000200D4 -:1038F00002000200000000000000000000000000C4 -:1039000000000000000000000000901020002000D7 -:103910002000200002000100000000000000000064 -:103920000000000000000200020008000000020089 -:10393000000000000000020000000800000000007D -:103940000000000000000000000000000000000077 -:10395000000000000800020000000000000000005D -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:1039800000000000000000000000000000008000B7 -:103990008000800080000000200000000000000087 -:1039A0000000000000000000000000000000000017 -:1039B00000000000001000000000000000000000F7 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A3000004100000000A0000000000000000000A5 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B00000000000090400200004000400000004122 -:103B1000020000000000000000000040000400005F -:103B20000004000400400000000000050000000048 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B9000000000000000000000000008000000011C -:103BA0000000000100010000000000000000000013 -:103BB00000000000000000000000000021000040A4 -:103BC00000000000000000400000000000000000B5 -:103BD00000000000000000000000000000000000E5 -:103BE00000000000020000000000000000000000D3 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 -:103D3000000000000000000000000800004000003B -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D8000000000000000000002000200000000002F -:103D90000000020000000000000000000000000021 -:103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000200000001 -:103DC00000000200020000000000020002000000EB -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F2000000000000040000000020000000400004B -:103F30000040000000000000000000000000000041 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA000000000000000000000000001000000010F -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:10402000000000000000000000004000000001004F -:10403000000004000000000000000000000000007C -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B00020000000000000000200000000000000DE -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000010000000000000000000006F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000002E000000000810002E00000000039 -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B0000000000000000000000000650006000F82 -:1044C000200000650006800F2000000000000000B2 -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000001000058 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000100000000000000000000000000019 -:104790000000000000000000000084000000000095 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000010000000D9 -:1047D00010000000000000000000000000000000C9 -:1047E00000000000000000000000000000020000C7 -:1047F00000000000000000000000000000020000B7 -:10480000000200020002000000020002000000009E -:104810000002000200020000000000000000000092 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:1048400000000000000000008200000000000000E6 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:1048900000000000004000000000000000000000D8 -:1048A0000000000000000000000000000008000000 -:1048B00000000000000200000000000000000000F6 -:1048C00000000000000000000000000000020000E6 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000001000000000B8 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:10491000000000000000000000000000000800008F -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000002126 -:10497000000000000000000000000000000000082F -:104980000000000000000000000000000000000027 -:104990000000000000000000000000009000000087 -:1049A0000000900000000000000000000000000077 -:1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000004D3 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A3000000000000000000000090000000000006D -:104A400000000009000500050000004000400000D3 -:104A5000000000040004000000400040004000404E -:104A6000000000000000010000000005000500003B -:104A700000410009000000000041000900000000A2 -:104A80000000000000000000000000000000000026 -:104A90000000000500050000000500000000000007 -:104AA0000000000000050000000000000000000001 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000004000000000A6 -:104AD00002000000000000000000000000000000D4 -:104AE00000000000000000000800000000000000BE -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000400000000000000000000000081 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B900000000000200000000000000000000000F5 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C5000000000000041000800000000000000000B -:104C60000000000000000000040000000000000040 -:104C700000000000000000000000004000400000B4 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA00000000008000800000040000000000000B4 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000110000000000000000000000D3 -:104CD0000000004000000000000000040000000090 -:104CE0000000000000000000000080000000000044 -:104CF0000000000021001100000000000000110071 -:104D00000000000000001100000200000000000090 -:104D10000000000000000000000000000000000093 -:104D20004100000000000000020805000000000033 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000200C1 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E700000000041000000000000000000000000F1 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000100000000000000000000B1 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000001000030 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000001B0 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:1050700000000000000000008041800080008000EF -:10508000000100000000000000000000000000001F -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000C0012000C0000F -:10510000A0000001000000000000000000000000FE -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:1051800007004800000000000000000000000000D0 -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE -:1052D00000000000000000000000000000000000CE -:1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:10530000000040004000008000000000000000009D -:10531000000000000000000000000000000000008D -:10532000000000000000000000000000000000007D -:10533000000000000000000000000000000000006D -:10534000000000000000000000000000000000005D -:10535000000000000000000000000000000000004D -:10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED -:1053C00000000000000000000000000000000000DD -:1053D00000000000000000000000000000000000CD -:1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000006C -:10544000000000000000000000000000000000005C -:10545000000000000000000000000000000000004C -:10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC -:1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:10556000000000000000000000000000000000003B -:10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B -:10559000000000000000000000000000000000000B -:1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000000000AB -:10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A -:10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:10568000000000000000000000000000000000001A -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 -:105710000000000000000000000000030000000086 -:105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000000040000000000009 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:1057800000000000000000000040000000000000D9 -:1057900000004000000000000000000000000000C9 -:1057A00000000000000000001000000200000000E7 -:1057B00000000000000000001000100200001000B7 -:1057C0000090000000020002000000000000000045 -:1057D0004184000000400040000000000000000084 -:1057E00000000000000000000000000000000000B9 -:1057F00000000000080000000000000000000000A1 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 -:105830000000000000000000000001000000000067 -:105840000000000000000000004000000000000018 -:105850000000000000000000000000400000000008 -:105860000000000000000000000000000000000038 -:105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000800000000000020000000C0 -:1058C00000000000000000000000000000000000D8 -:1058D0000000000000400000000000000000000088 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 -:105920000000000000000000000000000000000077 -:105930000000000000000000000000000000000067 -:105940000000000000000000000000000000002136 -:105950000080012100000000000000000000001095 -:10596000000000080000000000000000000000002F -:105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000004200000000000000000000000A3 -:1059E0002000000000000000000000000000000097 -:1059F0000200000000000000000000000000004164 -:105A0000000000000100000001000000000500008F -:105A10000000010000000000000000000000000085 -:105A20000000000000000000000000000000000076 -:105A300000000000C00000000000000000000000A6 -:105A40000100200001000100000000000000000033 -:105A50000000000000000000000000000100010044 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000020021000000020001 -:105A800000000000000020000000200000000000D6 -:105A900005004184080000040000410000000000EF -:105AA00000040000000020000000000000200000B2 -:105AB00010000000000000000000000000000000D6 -:105AC00000002000800020002000000000000000F6 -:105AD000000000000000000000000000008810002E -:105AE0002000000000000000020000000000000094 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000110011200053 -:105B10000000000000000400000000000000000081 -:105B20000000000020000000000000020000000053 -:105B30000009A0000000900000000000000020000C -:105B40000009000000000000000920000000000023 -:105B500000002000001120110000000000080004D7 -:105B60000000200000000000000000000000000015 -:105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 -:105B90008000000000000000000000000000000085 -:105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000000000000000E5 -:105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000001C4 -:105BE0000001000000A00000000000840000000090 -:105BF00000000000000000000200000000000000A3 -:105C0000000000000000028020000300020000806D -:105C10000000000001000000000000000002000081 -:105C2000000800000000000000000000020000006A -:105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000010053 -:105C500000000000000000000080000000000000C4 -:105C6000008001000109008000050000000500001F -:105C70000000000000000000000000000000000024 -:105C800000880000000000002004808220820004C0 -:105C90000004219000002084000000900500050011 -:105CA0000004000020002000020005000500008222 -:105CB0000000418800000500000000880000050089 -:105CC00000824188000005000082410000000500BC -:105CD0002000000000824182000000080082418212 -:105CE00000C041041000200009080000000041002D -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000A100000000C2 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000100000042 -:105D60000000000001000000000000000000000032 -:105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000020000E1 -:105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000001100B2 -:105DE0002100000000001100002100000000000060 -:105DF00000000000000000000000000000000000A3 -:105E0000000000000000000000000000000000048E -:105E10000000000400000005000000050000000074 -:105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000260 -:105E40000000000000000000000000000000000052 -:105E500000400000004000000000000000000000C2 -:105E6000004109000009008000090000110900003C -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 -:105E90000001000000010000000000000000000000 -:105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000000000000000000E2 -:105EC00000010000000000000000000000000000D1 -:105ED00000000001000000000000000000000000C1 -:105EE0000000000101000000008800000000010027 -:105EF00000000000000000000000000000000000A2 -:105F00000000000000000000000000000000000091 -:105F100000000000400000000100000084000000BC -:105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000000061 -:105F40000000000000000000000000000000000051 -:105F5000000000000000020000000000000000003F -:105F6000000000000000A00000000100000002008E -:105F70000001000000000000000000000000000020 -:105F80000000000000000000000000000000000011 -:105F900000000000000000000000040000000000FD -:105FA00000000500000000000000000000000000EC -:105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000002000000BF -:105FE0000000000000000000000000004100000070 -:105FF0000000000802000000000000000000000097 -:106000000000000000000000000000000000000090 -:106010000000000000000008000000000000000870 -:106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:1060600000000000000000000040211100000000BE -:1060700000201100000000000000000000000000EF -:106080000000000000000000000000000000000010 -:1060900000000000000000000001000000000000FF -:1060A00000010000000000000000000000000000EF -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000010000AF -:1060F000000000000100000000000000000000009F -:10610000000000000000000000000000000000008F -:1061100000000000000000000000810002E000001C -:106120000000810002E0000000000000000000000C -:10613000000000000000000000000000000000005F -:106140000000000000000088070048000000000078 -:10615000000000000000000000000000000002E05D -:10616000000000000000000000000000000000E04F -:1061700000008141810043E0002200000000000097 -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000000000000EF -:1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E -:10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D -:10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:10635000000000000000000000000000000000003D -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD -:1063A0000000000000650006800F20000065000668 -:1063B000800F20000000000000000000000000002E -:1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E00000000000000000650006000F2000000013 -:1063F00000000000000000400006000C0000000447 -:106400000006800E200000000000000000000000D8 -:10641000000000000000000000000000000000007C -:10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:1064700000000000000000000000FF00FFFF00001F -:106480000000FF0000FF000000000000000000000E -:1064900000000000000000000000000000000000FC -:1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC -:1064C00000000000000000000000000000000000CC -:1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000FF0000009D -:1065000000000000FF0000FF00000000000000008D -:10651000000000000000000000000000000000007B -:10652000000000000000000000000000000000006B -:10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:10658000F0F000000000FF0000FF0000000000002D -:1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB -:1065B00000000000000000000000000000000000DB -:1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:106600000000F0F000000000FF0000FF00000000AC -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A -:106630000000000001430000000000000000000016 -:10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A -:10666000CC84010105000986021A13A45E00100003 -:1066700010144400C040888002000004040000148C -:1066800008000000000000000400400000000000BE -:1066900000000000000000000000000000000000FA -:1066A00000000000000000002000000000000000CA -:1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000003000000000000B7 -:1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 -:1067200000000000000000000000800000000000E9 -:106730000000000000000000000000000000000059 -:1067400000000000000000000000000200820000C5 -:106750000000000000000000000000000000000039 -:106760000000000000000000000000000000000029 -:106770000000000000000000000000000000000019 -:1067800000000000000200000090009000020000E5 -:1067900000020002000240000000000000000000B3 -:1067A00000000000000000000000040000000100E4 -:1067B00000000000000000000000000000000000D9 -:1067C00000000000000000000000000000000000C9 -:1067D00000000000000001000000000000000000B8 -:1067E0000000000000008200000000000041820064 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000880 -:106810000000000000000000000000000000000078 -:1068200000000000000000000000000080000002E6 -:106830002000000000000000000000000000000038 -:106840000000000000000000000000000000000048 -:106850000000000000000000200000000000000018 -:10686000008200080000000000820000000000001C -:106870000000000000000000000000000000000018 -:1068800000000010000000000000000000000000F8 -:1068900000100000000000000000000000000000E8 -:1068A00000000000000000000000000000000000E8 -:1068B00000000000000000000000000000000008D0 -:1068C00001000002010001000000001100000000B2 -:1068D0000004014001000000000840000100000029 -:1068E0000000008000110100000000000000010015 -:1068F0000000000000000100000400800000000013 -:10690000000000080000008000000021000000A13D -:10691000000800850000000000000008000000885A -:10692000000800000000000000000000000000005F -:106930000000000000000000000000000000000057 -:1069400000012000000020002000000000000000E6 -:1069500000000001100020000000000100001000F5 -:106960000000000000040000100000000000000013 -:1069700020000000000000001000000100040000E2 -:1069800000000000000100000004000000004100C1 -:1069900000040001000400000000000000000000EE -:1069A00000040000000000000000000000000000E3 -:1069B000000000000005001100000000A000A08001 -:1069C000A000A100004000000000000800000080BE -:1069D0008200010000000000A000A0048800100058 -:1069E000100000000000000800008400000088047F -:1069F000009100000100880800040005000000006C -:106A00000004A000000000040080A00001000000BD -:106A10000011000000800008000083400100000019 -:106A20000000000000000000000000000000000066 -:106A300000000000000000040000000000840000CE -:106A4000000800002000000020400000004100007D -:106A500020082000200000C000000000000100000D -:106A600000000000008800000041009000002100AC -:106A70000001000800002000000900910000000053 -:106A8000000000010000000000030008400020009A -:106A90000000000000000004008300081000200037 -:106AA00000000000000000020000000000000000E4 -:106AB0000000900000200000000090000000200076 -:106AC0002000001120040000010091082000900027 -:106AD0002005900000000000080020002000C000F9 -:106AE000000400418200C000000000009004840007 -:106AF000008020009080A0000000000400008200C0 -:106B0000008010119011A000028020210005A00833 -:106B10000005010091008200002190009004820293 -:106B2000000020002000A000200400000000000061 -:106B30000000000000000000000000000000000055 -:106B4000000080000002000100001000200300008F -:106B50000000800000000000000000008000000035 -:106B60000000000100000000000000000000000123 -:106B70000000000800000004000000000001000008 -:106B80000000000880000000000000080000000075 -:106B900000000000100020000000000000000001C4 -:106BA0000000008480008000000000010000000060 -:106BB0000000000000000000000000002000200095 -:106BC0002000200000820004880088020008880855 -:106BD0009000000201080109200982080082840255 -:106BE000000000080009C009C000100400000000F7 -:106BF000A00984002004000800090000200800000B -:106C0000C009820000090000C009A00800040002B9 -:106C10008404880288080088010888088808000819 -:106C2000C0088240000800210000A002000200000D -:106C300000000000000000000000000000A0800034 -:106C4000808480008582000800014100000000A0CF -:106C50000000200041C010A02000800000010008BA -:106C60000082000000010000000000008001000020 -:106C700000840000000000A100010082000021014A -:106C800000A000000300000000000084000100A13B -:106C9000000000010000410309041000030000840B -:106CA00000A00000000000A10000058421000000F9 -:106CB00000000000000000000000000000000000D4 -:106CC00000C090C001C010C001C084A10182900822 -:106CD00001C000880184042001C0828801848220D0 -:106CE00001C00009C184102001C088200190888360 -:106CF000000001C088900190908301C000210140F4 -:106D0000089001C088100190108301C0888801900C -:106D1000108301C000110108901001C00088010813 -:106D2000042001C088900190048301C000A00108E4 -:106D30001002000000000000000011000000000030 -:106D4000100008800080098080800380000809808E -:106D500011800380000009118000038000050900F4 -:106D60008000038000C089008000038080000980CB -:106D70001190000003808000098000A003800010B3 -:106D800009009000038080000980809003808000CB -:106D9000098080A00380001009800000038000208B -:106DA0000980910003808000098080A0038000009A -:106DB000098080800000000000000000000000004A -:106DC000000000008009808080408080800900826F -:106DD00011048080800980849102808080408984B1 -:106DE0008040808380042084000480000020009084 -:106DF000112080800003000480851140808080087D -:106E000080C011408080800880A09140808000096F -:106E100000A0910980008011008811088080000482 -:106E20000089910480800011008591208080800974 -:106E30008084000980800000000000000000000045 -:106E4000000000000000020084828201C0C0020035 -:106E500090830301C0C0840008C10500C0C00200C7 -:106E600008C10200C0C10801A1830201C0909000C6 -:106E700082C08900C0C00000900102834101C0C0EF -:106E8000020108C09101C0C0020184C01101C0C04C -:106E9000900010C01100C0900200A0C19100C0C0BD -:106EA0008801A0C00500C0C0A000A0C10501C0C0ED -:106EB000020010831000C0C00000000000000000AD -:106EC0000000000000000000009020C0C0C000C012 -:106ED000C0200888C08901C0C1200410C08801C03A -:106EE00091844004C08800C0C08484C0828801C0EE -:106EF00085880491C08800C0000184208403C004F8 -:106F000001C091842090C08900C021902090C002CF -:106F100000C085101021201001C011848890C08904 -:106F200000C0C1208420C08801C091C110C0C00829 -:106F300000C0C0908490C02000C00000000000008D -:106F40000000000000000000000041008080808000 -:106F50000980410080008088048041000080808991 -:106F600008804180008080854080C18000000080D2 -:106F70000480C1008005800020800001C1000085E0 -:106F800080800280418080008088058041208000D0 -:106F900080800580C180008500004180C1800000A4 -:106FA0008088108041000000808304804110000030 -:106FB00080801080C1000000800009800000000077 -:106FC00000000000000000000000000080048002BB -:106FD000800080008041001010000000801091109F -:106FE000008000808010802000808080800400105D -:106FF0009180808080089121000000800001804104 -:107000009120000000808004110500000000800431 -:10701000914000000080800211050000008080097E -:1070200080059000000080099140808080008000F1 -:107030001140000000008009000580008000000071 -:107040000000000000000000000000000000C0017F -:10705000C000C088C000C001C000A188A000C0015D -:107060002100C0080808C0012000C0040208C001B7 -:10707000900040C00208C0000900900810080001FC -:10708000C0010900A0404008C0010900208882001A -:10709000C001090090884008C0000900A002400813 -:1070A000C000020041889000C000050040020200BC -:1070B000C0008900A0882000C0008800408802002D -:1070C0000000000000000000004100000704000074 -:1070D000410002E042000042810043E0422281423E -:1070E000600043E042224842600043E042224842BE -:1070F000410043E04222840A810043E042224842A8 -:107100000000810043E042228142600043E04222CD -:107110004842600043E042224842600043E042228D -:10712000480A600043E042224842600043E04222B5 -:107130004842600043E042224842600002E04200D0 -:107140008442000000000000000000000000000079 -:10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:1072500000000000000040084000008420004008BA -:1072600040000084200040084000008420004008C6 -:1072700040000084200040084000008420004008B6 -:1072800040000084200000004008400000842000EE -:107290004008400000842000400840000084200096 -:1072A0004008400000842000400840000084200086 -:1072B0004008400000842000400840000084200076 -:1072C0004008400000842000000000000000000092 -:1072D00000000000FFFFFFFF0000000000000000B2 -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000FFFFFFFF00000000000031 -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D0000000000000000030000010D03065000602 -:1073E000800F300030040006800E300030040006AC -:1073F000800E300030040006800E3000300400069D -:10740000800E300030040006800E30000000300492 -:107410000006800E300030040006800E300030047C -:107420000006800E300030040006800E300030046C -:107430000006800E300030040006800E300030045C -:107440000006800E300030650006800F300000001E -:10745000000000000000000000000000000000002C -:1074600000000000000000000F0F00FF00000000FF -:10747000FF0000FF00000000FFFF00FF0000000011 -:107480000F0FAAAA00000000FF00F0F000000000AB -:107490000000FF00F0F000000000FF0000FF00000F -:1074A0000000FF003C3C00000000FF00F0F0000086 -:1074B00000000F0F00FF00000000FF0000FF0000B1 -:1074C0000000FF003C3C0000000000000000000045 -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000F0F00FF00007F -:1074F0000000FF0000FF00000000000000FF00008F -:1075000000000F0FAAAA00000000FF00F0F000002A -:1075100000000000FF00F0F000000000FF0000FF8E -:1075200000000000FF003C3C00000000FF00F0F005 -:10753000000000000F0F00FF00000000FF0000FF30 -:1075400000000000FF003C3C0000000000000000C4 -:10755000000000000000000000000000000000002B -:10756000000000000000000000000000FF0000FF1D -:10757000000000000F0F00FF00000000FF00F0F00F -:1075800000000000FF00F0F0000000003C3C00FFA5 -:107590000000000000003C3C00FF00000000FF0075 -:1075A00000FF000000003C3C00FF000000003C3CED -:1075B00000FF00000000FF0000FF00000000FF00CF -:1075C00000FF000000003C3C00FF00000000000045 -:1075D00000000000000000000000000000000000AB -:1075E0000000000000000000000000000000FF009C -:1075F00000FF000000000F0F00FF00000000FF0070 -:10760000F0F000000000FF00F0F0000000003C3C43 -:1076100000FF0000000000003C3C00FF00000000F4 -:10762000FF0000FF000000003C3C00FF00000000E5 -:107630003C3C00FF00000000FF0000FF00000000D5 -:10764000FF0000FF000000003C3C00FF00000000C5 -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A -:10767000000000000000000090000000000000007A -:1076800000000000000000000000000000000000FA -:1076900000000000000000030000000000000000E7 -:1076A00000000000000000000000000000000000DA -:1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D0000000080040000000000000000000000062 -:1076E000000000000000000000000000000000009A -:1076F000000000000000100000000000000010006A -:107700000000000000000000000000000000410038 -:107710000000000000000000000000000000000069 -:107720000000000000000000000000000000000059 -:107730000000000000000000000000000000000049 -:1077400000001000100000001040000000000000C9 -:107750000000000000000000000000000000000029 -:107760000000020000000000000000000000000017 -:107770000000000000000000000000000000000009 -:1077800000000000000000000400000000000000F5 -:107790000000000090000000000000000000020057 -:1077A0000040000000009000000000000000000009 -:1077B0000040000008000000000000000000000081 -:1077C00000000000000000000000020002030000B2 -:1077D00000000000000000000000000000000000A9 -:1077E0000000000080000000000000000000000019 -:1077F0000000000000000000000000000000000089 -:1078000000000000000000000000800000000000F8 -:10781000008200000088000000000000000000005E -:1078200000000000000000880000000000000000D0 -:107830000000000000000000000000000000000048 -:107840000000000000000008001000000000001010 -:1078500000000000000000000010001000100000F8 -:107860000000000000000000000000000100000017 -:107870000000008000000000000000800000000008 -:1078800000000000000000000100000000000000F7 -:1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 -:1078B0000000000001800000000000000000000047 -:1078C0000000000004000000002100000000000093 -:1078D000000300000000000000100000000800008D -:1078E0000000000000000000000000000000200078 -:1078F00021000000002000002000000000201100F6 -:107900000000008811001100000004880000110030 -:107910002100210021002100030000881100000047 -:1079200000000088080000002184210811000000E8 -:1079300000820008110008040000009020000000F0 -:10794000000021A01184000811C00084000000087C -:1079500000842100200011000000210021A00082ED -:1079600000A000000000000000000040004001C036 -:1079700001C00000000000000100000088000100BC -:1079800000800000880000000080900000000000DF -:1079900000C000008800000040000000000000005F -:1079A00000000000000000000000000000050000D2 -:1079B000000900000005880500000100010000002A -:1079C00001000000000000000000008000800000B6 -:1079D000000000C0000000000000000000000000E7 -:1079E0000480000000000000000000000000000013 -:1079F0002020022000000000000004000000000021 -:107A000020000040000000000000002002000200F2 -:107A1000020000050000000000000000000000005F -:107A200000000000000000840000000000000000D2 -:107A30000008000000000000000000842084100006 -:107A400000002000000000000000000000200004F2 -:107A50000090000000050000000000000000000091 -:107A600000008040000220000000900000000000A4 -:107A70000000000010002100000000000180000054 -:107A800000410000104101110000008000000100D1 -:107A9000008000A000009000000001000000000035 -:107AA00000800080010000000000000000000000D5 -:107AB000000000000000000001000000000801803C -:107AC0002000000001000004000000000020000071 -:107AD0000000008000A00020000000000000000066 -:107AE0000100000000000183000000000000000011 -:107AF0000000008400008000020000C00008022096 -:107B00002100210021848084048400C0002000849E -:107B1000200003040005210000000300080200000B -:107B200040900004210420900000118403C009004B -:107B30000300118421840900218420000000210118 -:107B40001004210021C0088420011184030821852C -:107B5000008400C0000400051101110000840084AD -:107B600011C004A0000000840220000000000000FA -:107B7000000089000100000000008800044088091E -:107B80000000218801000000018088000100000938 -:107B9000020205088902040004090040000288026C -:107BA0000041010000000000C000000088008800C3 -:107BB0000000100000400000880000021040200873 -:107BC0000000000288210008880800080100000069 -:107BD0000009000088890020002100028808880030 -:107BE00000000008008004408802008000000000BF -:107BF00000000000100020000000000000008001D4 -:107C000000000000104020000000040400000400F8 -:107C100000000000820002008000820000000000DE -:107C20000000000020000000000000000000020032 -:107C30000000000000000000000000000000808242 -:107C4000800100000000000000000000000002822F -:107C500000000000000000400000000000000000E4 -:107C60000000000000000040800100000020000033 -:107C70000000000000000100900000000000000073 -:107C800000900000000001009000000000040000CF -:107C900000000000000000000020000000000000C4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00001000000000000000100000000000000B2 -:107CD0000000900000000000000090000082000002 -:107CE0000000000000000000000000900000000004 -:107CF00000000000000000001100A10000000000D2 -:107D000000000080000000001100A1000000000041 -:107D100000000000000000001100008000000000D2 -:107D20000000000000000000000000000000000053 -:107D30000000000000000000000000000000000043 -:107D400000001100002100000000110021000000CF -:107D50000000110080000000000011008000000001 -:107D60000000000000000000000000000080000093 -:107D70000000000000000000000000080980000969 -:107D800000000000008000000080000809000011D1 -:107D90000080000000800000000000088000000952 -:107DA0000080000000000000000000080000000843 -:107DB00000000000000000000000000000000000C3 -:107DC0000000000000090000110900000041090046 -:107DD000001000800000008000000080000800808B -:107DE000000800000000000000000000000000008B -:107DF000000000000000000000000000000101027F -:107E0000000000880000001000000010000101A028 -:107E1000000000020000000800000084000190043F -:107E2000000000080000000000000000000000004A -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000001000000000130 -:107E500001000001008800000020000000C00001B7 -:107E60000020000100200000000000000000880049 -:107E700000880000008800000000000000000500ED -:107E8000888802000000000002004090000001000D -:107E900088882000000000000200400000000090E0 -:107EA000080040000000000000000000000000008A -:107EB00020000000000000000000000000000000A2 -:107EC00000000000000000000000080000010000A9 -:107ED0000000880000000100C100008802000100CD -:107EE0000100048890000100000000000000000074 -:107EF000010000008290000000000000000000006F -:107F0000410000808000410000008000808000006F -:107F1000410000800000410005008000800000005A -:107F200005808000800005000000000000000000C7 -:107F30000000000000002000000000000000000021 -:107F400000000000000000000000000080000008A9 -:107F50000900000000000000410041000080800096 -:107F60000900410000800000200000000000000027 -:107F700000002000000080800000000000000000E1 -:107F80000000001100000080040000090000000053 -:107F9000000000110400008000000020000000002C -:107FA00000000009000000000000000000000000C8 -:107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000001100A0 -:107FD000000000000004211100000000001100005A -:107FE0000080000000110000008000000000000080 -:107FF00000000000001180080000000000000000E8 -:10800000000000000001000000400000000000002F -:108010000088000000010000004000000001000096 -:108020000000000000000000000000000000000050 -:108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:10805000010000000000000000010000000000011D -:10806000000000400000000100000040000000008F -:1080700000000000000000012001000000000000DE -:10808000000000000000000000E007008200008205 -:10809000040007810000000000E007008200008269 -:1080A000000007000000410002E00700000000009F -:1080B000000000000000410002E00000000000009D -:1080C00000000000000000000000000000000000B0 -:1080D000500043E000220000000000E00000814169 -:1080E0000000000007008221500002E0070082002B -:1080F0000000000000000000000A8400078100006A -:10810000000000000000000000000000F0F000008F -:108110000000000000FF000000000000F0F0000080 -:108120000000000000000000000000003C3C0000D7 -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:10816000000000000000F0F0000000000000F0F04F -:108170000000000000000000000000FF000000FF01 -:108180000000000000000000000000000000F0F00F -:1081900000000000000000FF000000000000F0F000 -:1081A00000000000000000000000000000003C3C57 -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E0000000000000000000F0F0000000000000AF -:1081F000F0F00000000000000000000000FF0000A0 -:1082000000FF000000000000000000000000FFFF71 -:108210000000FFFF0000FF000000FFFF00003C3CEB -:108220000000FFFF00000000000000000000FF0051 -:1082300000000F0F00000000000000000000000020 -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:108260000000000000000000FFFF0000FFFF000012 -:108270000F0F0000FFFF00000000000000000000E2 -:10828000FF0000003C3C0000000000000000000077 -:108290000000000000000000FF00000000000000DF -:1082A0003C3C000000000000000000000000000056 -:1082B000FF0000000F0F00000000000000000000A1 -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E -:1082E000000000000000000000000000000000008E -:1082F00000000F0F00000000000000000000000060 -:108300000000FF0000003C3C0000000000000000F6 -:1083100005402A06054C00A800082A20054005A8AB -:1083200005402A06054C00A805180A20050005A0EE -:10833000057D2A06854F25A80000000000000000EA -:1083400000650006800F2000000000000000000013 -:108350000000000000000000000000040006800E85 -:10836000200000400006000C000005002A00054027 -:1083700000A805652A06854F20A80000000000001F -:10838000000015182A20054005A800000000000084 -:10839000000000003C3CFFFF000000000000000067 -:1083A00000000000FF00FFFF0000000000000000D0 -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D0000000000000000000000000000000FF009E -:1083E00000FF00000000FF00FFFF00000000000091 -:1083F000000000000000000000000000000000007D -:10840000000000000000000000000000000000006C -:108410000000000000003C3C0000000000000000E4 -:10842000000000000000FF0000000000000000004D -:10843000000000000000000000000000000000003C -:10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C -:10846000FF0000FF00000000FF000000000000000F -:1084700000000000000000000000000000000000FC -:1084800000000000000000000000000000000000EC -:1084900000000000000000000000F0F000000000FC -:1084A00000000000000000000000F0F000000000EC -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000000AC -:1084D000000000000000000000000000000000009C -:1084E0000000FF0000FF000000000000F0F00000AE -:1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B -:10851000000000000000000000000000F0F000007B -:10852000000000000000000000000000F0F000006B -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:1085600000000000FF0000FF000000000000F0F02D -:1085700000000000000000000000000000000000FB -:1085800000000000000000000000000000000000EB -:1085900000000000000000000000000000000000DB -:1085A00000000000000000000000000000000000CB -:1085B0000000000004000000000000001100110095 -:1085C00000000000000000000000000000000000AB -:1085D000000000030000000900000000000000008F -:1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000001007A -:108600000008000000000000000000000000000062 -:10861000000000000000000000000000000000005A -:108620000000000000000002000000000000000048 -:108630000000000000000000000000000000A00298 -:10864000A002000000020000000000000000000086 -:10865000000000000000000000000000000000001A -:108660000000000200000000000000000000000008 -:1086700000000002000000020002000200000002F0 -:1086800002020000000000020002000200000000E0 -:1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000000000CA -:1086B000200020002000100000000000000000004A -:1086C0000000000500000000000000000000900015 -:1086D0000000000008000000000000000000000092 -:1086E00000000041000990000000000000000000B0 -:1086F000000000000000000000000000000000007A -:108700000200000000400200000000000000000025 -:10871000000000080000000400000000000000004D -:108720000000000000000000000000000000000049 -:108730000000800080008000800000000000000039 -:108740000000000000000000000000000000000029 -:108750000000000000000000000000000000000019 -:108760000000000000000000000000000000000009 -:1087700000000000000000000000000000000000F9 -:1087800000008000000000018000000000000000E8 -:1087900000000000000100000001000000000000D7 -:1087A0000000000000000000000088000000000041 -:1087B00000000000000000000000000000000005B4 -:1087C0000000A08000000000010000000000000088 -:1087D0000000000990000011A0000000000000004F -:1087E0000000000000000000080000000000000081 -:1087F0000000000000000000A000000000000000D9 -:108800009000000000000021000040004000000037 -:1088100000030000008000040000000000000000D1 -:10882000000000C000000000000000000000000088 -:10883000110000C0000000000000008400000000E3 -:10884000000000000008000000001000000005000B -:108850000000050000000000009000000000000083 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000C000C078 -:10888000000000A011000000000000000000000037 -:1088900000000000000000040001000000000000D3 -:1088A00000000000000000000000000000090004BB -:1088B00000040000000000000000000000000000B4 -:1088C0000000010000800005000500090100000013 -:1088D0000000000000000000000000000000000098 -:1088E0000000000000000000000000000000000088 -:1088F00000000000000000000000000001000080F7 -:108900000000000000000000000000000000010066 -:108910000000000000000000000000000000000057 -:108920000000000000000000000000000000000047 -:1089300000000000000000000000000000880000AF -:10894000000000002000000400000000008420005F -:108950000000000000000000000000000000000017 -:10896000000000000000000000880000000000007F -:1089700000000000000000000000000000002000D7 -:1089800000040000000000000000000000000000E3 -:1089900004000000000000000000000000000000D3 -:1089A00000000000000000000000000000000000C7 -:1089B00000000000000000000000000000000000B7 -:1089C0009000000000000000000000800000000097 -:1089D0000000000084000000000000000000000013 -:1089E0000000000000000000000000000000000087 -:1089F00000000000000000000000900000000000E7 -:108A00000000000000000000000000000000000066 -:108A100000000000000000000000000000000088CE -:108A2000008000800084000000C000000000000002 -:108A3000008400840084000000A000840000000086 -:108A4000008400C021840000008400C000040000F5 -:108A500000A000840000000000000000418400002D -:108A60000090000000000084088400002100000045 -:108A700008840000000000000084000000842184BD -:108A8000210000840000001000C0000000C000842D -:108A90002100008400080084000000C000C000A085 -:108AA00000040004000400000000000000000009B1 -:108AB0000000000000000000000000020002880921 -:108AC00000000000000290040000000200040040CA -:108AD00000000021000900020002000284040000DE -:108AE00000000000900000000004000000000000F2 -:108AF0000004002000000000200088042000000086 -:108B000000080004000000024004880000029000F9 -:108B1000000000000000000000040000000400004D -:108B200000118800000000000000000000000000AC -:108B30000000000000000000000000000000000035 -:108B40000000000000000000000000000000000025 -:108B50001100000000000000000000000000000004 -:108B60000000000000000000000000000000000005 -:108B70000000000000000000000000840000000071 -:108B800000000001000000000000000000000000E4 -:108B900000000000000000000000000000000000D5 -:108BA00000000000000000000000000000000000C5 -:108BB00000000000000000000000000000000000B5 -:108BC00000000000000000000000010000000000A4 -:108BD0000000010000000000000000000000000094 -:108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000000000000000075 -:108C00000000000001000000000000000000000063 -:108C100000000000000000900000000000000000C4 -:108C200000000000000000009000000000000000B4 -:108C30000000000000000000000000000000000034 -:108C400000000000000000000000000011002100F2 -:108C500000000000110000210000000000000000E2 -:108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 -:108C800000000000000011002100000000000000B2 -:108C90000000000000000000008000000000000054 -:108CA0000000000000000000000080000000000044 -:108CB00000000000000000000000000000000000B4 -:108CC0000000000000000000090000410000004119 -:108CD0000900000300000009000011090000000065 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 -:108D00000000000000000000004109000003008096 -:108D100000000000000000000000000000000080D3 -:108D20000000000000000000000200000041000000 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000001000001000021 -:108D50000001010000000000000000000100000010 -:108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000101000000E1 -:108D900000880000000000000000000000840000C7 -:108DA00000040000000000000000000000000001BE -:108DB00000000000000000000000000000000000B3 -:108DC000000000000000000000000000C0000000E3 -:108DD0000100000088000000000000000800000101 -:108DE0000100000000000000000000000000000082 -:108DF0000000000000000000000000000000000073 -:108E000000000000000000000000000000008800DA -:108E10000000010000000000000000000000000051 -:108E2000829000000000000000000000000002002E -:108E30000000010000000000000000000000000031 -:108E40000000000000000000000000000009000019 -:108E50000000200000000000000009000000800069 -:108E600000084100000000000000000000000000B9 -:108E700000000000000000000000000000000000F2 -:108E800000000000000000000000000000000000E2 -:108E9000000000004100000000000000000005008C -:108EA00000008080000000000000000000000000C2 -:108EB0000000000041000000000000000000000071 -:108EC0000000000000000000000000000000000999 -:108ED000002100000000000000110000000000025E -:108EE0001100000000000000000000000000000071 -:108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 -:108F1000000002110000000000000000000000003E -:108F20000011804000000000000000000000000070 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 -:108F5000000100000000000000000001000000000F -:108F60000000010000000000000000000000000000 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F900000000000000100000000000000000000D0 -:108FA0000000000120010088000000000000000017 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000E000000081000000E0000050 -:108FE0008100810043E00022000A00000000000030 -:108FF0000000000000000000000000000000000071 -:109000000000000000000000000000000000000060 -:1090100000000000000000E00000814100000000AE -:109020000000000000000000070000000000000039 -:1090300000000000000002E000000042000000000C -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 -:1090A0000000000000000000FF000000FF000000C2 -:1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F -:1091200000000000000000000000FF000000FF0041 -:10913000000000000000000000000000000000002F -:10914000000000000000000000000000000000001F -:10915000000000000000000000000000000000000F -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF -:1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000000000000AF -:1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000000000008F -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E -:1092200000000000000000000000000000FF00003F -:10923000FFFF000000000000000000000000000030 -:10924000000000000000000000000000000000001E -:10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE -:1092A000000000000000000000000000000000FFBF -:1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E -:1092D000000000000000000000000000000000602E -:1092E0000006000C000000600006000C00000004F6 -:1092F0000006800E200000000000000000000000BA -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:1093200000400006000C00000000000000000000EB -:1093300015002A00054000A8000000000000000001 -:1093400000650006000E2000000000000000000084 -:10935000000000000000000000000000000000000D -:10936000000000003C3C000000000000FFFF000087 -:109370000000FF0000FF00000000000000000000EF -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A00000000000FF00FFFF0000000000000000C0 -:1093B00000000000000000000000000000000000AD -:1093C000000000000000AAAA000000000000000049 -:1093D000000000000000000000000000000000008D -:1093E0000000000000003C3C000000000000000005 -:1093F00000000000FF0000FF00000000000000006F -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C -:10942000000000000000FF0000000000000000003D -:10943000000000000000000000000000000000002C -:109440000000000000000000AAAA000000000000C8 -:10945000000000000000000000000000000000000C -:109460000000000000000000F0F00000000000001C -:10947000F0F000000000FF0000FF0000000000000E -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000000000000000000F0F000000000DC -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C -:1094D000000000000000000000000000000000008C -:1094E00000000000000000000000F0F0000000009C -:1094F0000000F0F000000000FF0000FF000000008E -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000F0F000005B -:10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B -:10955000000000000000000020002000200020008B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000030000000000000000000000000000C8 -:1095A000000000000000000000000080008000803B -:1095B000008000000000000000000000000000002B -:1095C000400000000000000000000000000000005B -:1095D000000000000000000000008000800080000B -:1095E00080000000000000000000000000000000FB -:1095F000000000000000000000000000002000004B -:109600000000000000000000050000000000000055 -:10961000000000000000000000000000004000000A -:1096200000020000000000000000000000400040B8 -:109630000040004010000000000000020002000096 -:1096400040000000000000000000000000000000DA -:109650000000000000000000000000008200820006 -:1096600082008200000000000000000000000000F6 -:1096700000000000100000000009000000000000D1 -:1096800000000000000000000010000000000000CA -:109690000000000000000000000000100000820038 -:1096A0000000820000008200820000000000000034 -:1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A -:1096D000000000000000000000000000000000008A -:1096E000000000000000000000000000000000007A -:1096F00000000000000080000000000000000000EA -:109700000000000000000000000000000000000059 -:1097100000000000008800000000000000000000C1 -:109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900082000000820000000000000000000000C5 -:1097A00000000000000000000000000000000000B9 -:1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000008000000080000000000000048 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 -:109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000000F8 -:1098700000000040000000000000000800000000A0 -:109880000100008008000000080000040000000043 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 -:1098B0000000000000000000000001000180000026 -:1098C0000000000000000000000000000000000098 -:1098D0000000000000000000000000000000000088 -:1098E0000000000000000000000000001000000068 -:1098F0000000000000000000000000000000000068 -:109900000000200000040000000000000000000033 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:1099300000000000000000000000000020000404FF -:109940000000000000000000000000000000000017 -:109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 -:109970000000000000000000000000000000900057 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 -:1099B0000000900000000000900000000000000087 -:1099C0001000000000000000000000000000000087 -:1099D0000000000000000000000000000000000087 -:1099E0000000000000000000000000000000000077 -:1099F00000000000000000C0110000000000000096 -:109A000000C0000000000084000000000000000012 -:109A1000008400000000000000000000002004009E -:109A20000000000000000000000000000000000036 -:109A30000000000000000000000000C00000000066 -:109A40000084800000000000000800840000000086 -:109A50000000008400000000000000000000000082 -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A900000020009000000000000000200000000B9 -:109AA00000000000000000000000000000000000B6 -:109AB000000000000000000088000000000000001E -:109AC0000000000000000010000000020000000084 -:109AD0000000000000040000000000000002000080 -:109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000000066 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B40000000000000000000000000000000000015 -:109B50000000000000000000000000000000000005 -:109B600000000000000000000000000000000000F5 -:109B700000000000000000000000000000000000E5 -:109B800000000000000000000100000000000000D4 -:109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000000000000000A5 -:109BC0000000010090900000000000000000000074 -:109BD0000000000000000000000000000000000085 -:109BE0000000000000000000000000000000000075 -:109BF0000000000000000000000000000000000065 -:109C00000000000000000000000011002100000022 -:109C10000000000000000000000000000000000044 -:109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 -:109C40000000000011002180000000000000000062 -:109C50000000000000000000000000000000000004 -:109C600000000000000000000000000000000000F4 -:109C700000000000000400000004000000000000DC -:109C8000000000000000000000000000004109008A -:109C900000030000000000000000000000000000C1 -:109CA00000000000000000000000000000000000B4 -:109CB00000000000000000000000000000000000A4 -:109CC00000000000000000C10980000300800000C7 -:109CD0000000000000000000000000000000000084 -:109CE0000000000000000000000000000000000074 -:109CF0000000000000000001000000010000000062 -:109D00000000000000000000000000000000000152 -:109D10000100000000000000000000000000000042 -:109D20000000000000000000000000000000000033 -:109D30000000000000000000000000000000000023 -:109D40000000000000000000000901040000000203 -:109D50000000000000000000000000000000000003 -:109D600000000000000000000000000000000000F3 -:109D7000000000000000000000008400000001005E -:109D800000000000000000000000000000000000D3 -:109D9000000088000000000000000000000000003B -:109DA00000000000000000000000000000000000B3 -:109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000001008800C090BA -:109DD0000000000002000000000000000000000081 -:109DE0000000000000000000000000000000000073 -:109DF0000000000000000000000000000000000063 -:109E0000040000000000000000000000000000004E -:109E10000000000000000000090000000000000039 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 -:109E40000000000000000000000000000900000009 -:109E50008080410000008000000000000000000041 -:109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000110000000000000000B1 -:109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 -:109EC0000000000000000000000000000000001181 -:109ED00080110000000000000000000000000000F1 -:109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 -:109F10000000000000000000000100000000000040 -:109F20000000000000000000000000000000000031 -:109F30000000000000000000000000000000000021 -:109F40000000000000000000000000000000000011 -:109F50000001200100880000000000000000000057 -:109F600000000000000000000000000000000000F1 -:109F700000000000000000000000000000000000E1 -:109F8000410002E0000000000000000000000000AE -:109F90000000000000000000000000E00000810060 -:109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000000000000000091 -:109FD0000000000000E00700811100000000000008 -:109FE0000000000000000000000000000000000071 -:109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 -:10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 -:10A030000000000000000000000000000000000020 -:10A040000000000000000000000000000000000010 -:10A050000000000000FF000000FF00000000000002 -:10A0600000000000000000000000000000000000F0 -:10A0700000000000000000000000000000000000E0 -:10A0800000000000000000000000000000000000D0 -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 -:10A0C0000000000000000000000000000000000090 -:10A0D00000000000000000FF000000FF0000000082 -:10A0E0000000000000000000000000000000000070 -:10A0F0000000000000000000000000000000000060 -:10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A1500000000000000000000000FF000000FFFF02 -:10A1600000000000000000000000000000000000EF -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F -:10A1D000000000000000000000000000FF00000080 -:10A1E000000000000000000000000000000000006F -:10A1F000000000000000000000000000000000005F -:10A200000000000000000000000000650006800F54 -:10A21000200000000000000000000000000000001E -:10A22000000000600006000C0000000000000000BC -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000015402A0679 -:10A26000054C00A8000000000000000000000000F5 -:10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE -:10A2A0000000000000000000FFFF000000000000B0 -:10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E0005555FFFF000000000000000000000000C6 -:10A2F000000000000000000000000000000000005E -:10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D -:10A33000000000000000000000000000000000001D -:10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD -:10A360000000555500000000000000000000000043 -:10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000000CD -:10A3900000000000000000000000000000000000BD -:10A3A000000000000000000000000000F0F00000CD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000F0F000000000000000008D -:10A3F000000000000000000000000000000000005D -:10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A420000000000000000000000000000000F0F04C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC -:10A460000000000000000000F0F00000000000000C -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C0000000000000000000000000000003000089 -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000000000000000006C -:10A4F000000000000000000000000000000000005C -:10A50000000000000000000000000000000000004B -:10A510000000000000000000000000020000000237 -:10A52000000000000000000000000000000000002B -:10A530000000000000000000000000000000000219 -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000000000FB -:10A5600000000000000000000000000000000000EB -:10A5700000000000000000000002000000000000D9 -:10A580000002000000901002000200000000000025 -:10A5900000000000000000000000020000000200B7 -:10A5A000100000000100000000000000000000009A -:10A5B0000000000000000000820082000041000056 -:10A5C000000000000000000000000800080000007B -:10A5D000000000000000000000000040000000003B -:10A5E000000000400000000000000000000000101B -:10A5F000000000000000000000000000000000005B -:10A60000000000000000000000000000000000004A -:10A6100000000000000000000000000080000000BA -:10A6200000008000000002000000000000000000A8 -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000000FA -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B0000010000000000000000400000000000086 -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E0000000000000000000000000000000000862 -:10A6F000000000000000000000000000000000005A -:10A7000000000000401040000000000000000000B9 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A7700000010000000000000000000000000000D8 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A000010001000100010400000000010001801F -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000180018000000000000057 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000200020002000200000000004200084 -:10A8300040040000000000000000000000000000D4 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A870000000000000000000202004040000000090 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A00000002000000000000003900000400004B1 -:10A8B0000040100000000000000000000000000048 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F0000000900090000100000000001000000027 -:10A900000005000000000000000000000000000042 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000A00000000087 -:10A9300000000000800400000000000000C00000D3 -:10A940000000008400000000000000000000000083 -:10A9500000000000000000000000000000000000F7 -:10A96000000000000000000000A000000000000047 -:10A9700000000000000000C002000000008480848D -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0002000010000000000000000000000000076 -:10A9C0000000000000000000000000000002000085 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000100000056 -:10AA00000000000000000002000200000010000032 -:10AA10000000000000000000000000000000000036 -:10AA200000000000000000000000000000004100E5 -:10AA30000000800020000000000000000000000076 -:10AA40000000000000000000000000000000000006 -:10AA500005000000000000000000000000000000F1 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000002000B6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000C000C00220908800000000DC -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000010055 -:10AB000090000000000000000000000000000000B5 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB300000001000000010800080000000000000F5 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB80001100A10000000000000000000000000013 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000011000000080000000809800003008068 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000100000000000064 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000809800003008000000000000030 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC300000000000000000010000208521C0080085 -:10AC400088C00000000000000000000000000000BC -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000101020000001000000000B0 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB00000000000000010000000000009888890DB -:10ACC000C008008300000200000000000000000037 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000001000063 -:10ACF0000000000000000000000000000000000054 -:10AD000000000000000001008888880000000000AA -:10AD10000200000000000000000000000000000031 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000800000001100410041 -:10AD4000001080214141050080000000000000004B -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000001E2 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000004100008000004100C1 -:10AD90000000800000000000000000000000000033 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000001000000000000083 -:10ADC0008000801080008000000000000000000073 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000001000000000000000000000000000052 -:10AE000000000000000000000000001100000080B1 -:10AE10000200000000000000000000000000000030 -:10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000000012 -:10AE40000000C000C000C020C000000000000000E2 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000001000000000000000000000000D1 -:10AE800000000000000000000000000000010000C1 -:10AE90000040000000000000000000000000000072 -:10AEA00000000000000000000000000000000000A2 -:10AEB000000000000000000000000000810000E031 -:10AEC00000000000000000E04200484200000000D6 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF100000E00700820000000000000000000000C8 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF9000000000000000F0F00000000000000000D1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000F0F000000000000050 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B0400000000000000000000000400840000084F4 -:10B0500020000000000000000000000000000000D0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000FFFFFFFF0000000084 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B1100000000000000000000000FFFF0000000031 -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000FFFFFFFF000003 -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000610007C00D100634 -:10B1D00030400006000C08000000000000000000E5 -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B210000000000000000000000005400A06054C88 -:10B2200000A8000000000000000000000000000076 -:10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000000000FE -:10B2500000000000555500FFA0A000000000000005 -:10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000003C3C36 -:10B2A000FFFF0000000000000000000000000000A0 -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000555500FFA0A00000000085 -:10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B320003C3C0000000000000000000000000000A5 -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000F0F0000000000D -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A00000000000F0F000000000000000000000BD -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000F0F000008D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B42000000000000000F0F000000000000000003C -:10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000100000000BB -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000020000000000005A -:10B4F000000200000000000000000000000000004A -:10B5000000000000000040000000000000000000FB -:10B51000000000000000000000000000000000002B -:10B5200000000000000000000000400010000000CB -:10B530000002000000020002000000020000000003 -:10B54000000000000000400040000000000000007B -:10B5500000000000000002000000000000000000E9 -:10B5600000000800010002000000000000000000D0 -:10B5700000000010000000000000000000000000BB -:10B580000000080000000000004000000000000073 -:10B5900000000000000000000000000000000000AB -:10B5A0000000000000000000020000000000000099 -:10B5B000000000000000000000000000000000008B -:10B5C0000200000000000000000000000000000079 -:10B5D000000000000000000000000000000000006B -:10B5E00000000000000002008000000000000000D9 -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B6100000000000004000000000000000000000EA -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B65000000000000000000000000000000000806A -:10B6600000000000000000000000000000000000DA -:10B6700000000011000000000100000000000000B8 -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000200020002A -:10B6E0001104200000880082000000840000000493 -:10B6F000000000000000000000002000000000002A -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B760000000000000800000000000000000000059 -:10B7700000000000010000080000010000000000BF -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000004000000000000000000000000059 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000040000000000000000039 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000004000000000000000451 -:10B7F0000000000000000400000100002000000024 -:10B8000000000000000000400000000000000000F8 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 -:10B8500000000000000000000000000000000000E8 -:10B860009000000000000000000000000000000444 -:10B870000000002000000020000000000008000080 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000840000008800C01104000473 -:10B8F00011850004000000000001000000000000AD -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000008493 -:10B93000000000C000C0000000000084008400007F -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B9600000000000000001000000000000000009CD -:10B9700000000000000000000000000200020000C3 -:10B9800000000000000000000000000900040000AA -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B000000000000000000000090000000000007E -:10B9C0000000000000020002000000000000000073 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000100000000000000047 -:10B9F00000000000000000000000000000820500C0 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000010000000000D5 -:10BA70000000009000200010001000009000000066 -:10BA800000000100000000000000000000000000B5 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000001100210024 -:10BAF0000000000011800080110000001100800093 -:10BB00000000000011002100000000000000000003 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB60000000000000000000000000000000004194 -:10BB70000900000300800008000200080000000027 -:10BB800000800000000000410900000900000000E2 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000001010000000088000100030083000034 -:10BC0000000000200000008400010100000000008E -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000A00000000100C000080000005B -:10BC8000900001000088880000000000880000008B -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000041008000000083 -:10BD000000008800410000800000000000000000EA -:10BD1000000009000000000000000000000000001A -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000411000000000008A6 -:10BD80000011000000000011000000800000000011 -:10BD90000011000000000000000000000000000092 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000010000000042 -:10BE000082011001100082000001000000400000CB -:10BE10000000000100000000000000000000000021 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000E00000E2 -:10BE80008141810000E00000810000000000070007 -:10BE90008200000000E000008100000000000000BF -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF000000000000FC0AFCFA000000000000000035 -:10BF1000F0F0000000000000000000000000000041 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF80000000000000000C0A0CFA00000000000095 -:10BF90000000F0F0000000000000000000000000C1 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C0000000000000000000007F7C73700000000052 -:10C01000000000000000FFFF000000000000000022 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C08000000000000000000000004F4C4340000092 -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C100000000000000400006000C00000061300745 -:10C11000C00D000005000A00054000A800600006F0 -:10C12000000C000000000000000000000000000003 -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C180000000000000000000FF00FFFF00000000B2 -:10C19000000000000000000000000000000000009F -:10C1A0000000FFFF00000000000000000000000091 -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C2000000000000000000000000FF00000000002F -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C280000000000000000000000000000000F0F0CE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000F0F00000000000000000AE -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000F0F000000000000000000000000000003D -:10C320000000000000000000F0F00000000000002D -:10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD -:10C390000000000200020000000000000000000099 -:10C3A000000000000000001100000011000000006B -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000100000000000000006C -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C41000000000000000000000000002000000001A -:10C42000000000000000000000000000000000000C -:10C4300000000002000200000002000000000000F6 -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000020000000000000000DA -:10C460000000000000000002000000020040000286 -:10C4700000000002000200000000000200020002B2 -:10C4800000000000000000000000000000000000AC -:10C4900000001000020000008200100400000200F2 -:10C4A000C0000000000008000000020000000000C2 -:10C4B000000000000000000000000000000000007C -:10C4C000000002000000000000000000000000006A -:10C4D000000000000000000000100200000000004A -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000200000000003A -:10C50000000000000000000000000000000000002B -:10C51000000000008000800000000000800100009A -:10C52000800000000000000000000000000000008B -:10C5300004000000000000000000000000000000F7 -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C57000000040000000000000000000000000007B -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A00040002000410004000000000000000004E2 -:10C5B0000000000410000000000000000000000067 -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F0000000000000000000000000000000040037 -:10C6000004000000000040000000000000000000E6 -:10C610000000000000000000000000000000008298 -:10C6200000A0000000A0200000000090009000008A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C690000000000000000000000000000000010099 -:10C6A0000089000000000100000000000000000000 -:10C6B00000400040000000000100000000000000F9 -:10C6C000000000000000000000000010000000005A -:10C6D000004000000000000000000000000000001A -:10C6E000000000000000000000000000000000004A -:10C6F00000000000000000000000000000400000FA -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C7200020000004000000002000000000000000C5 -:10C7300000000000000100000000040000000000F4 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000100000000000000000C9 -:10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 -:10C790000000000000000000000000009000000009 -:10C7A0000000000040000000000088400000000978 -:10C7B0000000000000000000000000200000000059 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C81000000000000000000000000000000000C058 -:10C820000040000000040082000000900090000022 -:10C8300000000000000000841100000000850000DE -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000100000087 -:10C8B000000000000000000901110000000000005D -:10C8C0000002000000000002000000000000000064 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C9200000000000000000000000000000002000E7 -:10C9300000000000000002000200040000000000EF -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 -:10C9A000000000000000010000000000000000C0C6 -:10C9B00000C000029088000000000000000000009D -:10C9C00090000000000400000000000000000000D3 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA200000000000000000001100210000000000D4 -:10CA30001080008000800000000000000000000066 -:10CA40001100800000000000000000000000000055 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000410900000339 -:10CAB00000008008098000090080000000000000DC -:10CAC0000000000000800000008000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000100000000000000000000000045 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000001010003 -:10CB300000000000100103C0100088C000000000C9 -:10CB40000000000800000020000000C000000000FD -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB00088000000000009888820C00800200000CC -:10CBC0000000000000000100008888000100000053 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000001000000000000000044 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC30000000000000000400412000808000090086 -:10CC4000000000000000000041000080000009001A -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000001000000000000C3 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB00000000000001100000000801080118000C2 -:10CCC000800000080021000000000011000000802A -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000010000000043 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD3000000000000000000100000000C000C00072 -:10CD4000C002C00000000000000000000001000060 -:10CD50000040000000000000000000000000000093 -:10CD600000000000000000000000000000010000C2 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 -:10CDA0000000000000000000000000000000000083 -:10CDB000000000000000000000E000008100000012 -:10CDC00000E04200484200060000070000000000AA -:10CDD00000000700822100000000000000000000A9 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE5000000000000000F0F00000000000000000F2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000F0F000000000000072 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000400840000084200000000000B5 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000000091 -:10CFA0000000000000000000000000000000000081 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000FFFFFFFF0000000000000000000065 -:10CFD0000000000000003C3C0000FFFF00000000DB -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000000FFFFFFFF0000000000000000E4 -:10D0500000000000000000003C3C00000000000058 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000000000000090 -:10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C000000000600006000C100630600006000C36 -:10D0D000080000000038000000A005002A000540FC -:10D0E00000A8000000000000000000000000000098 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D140000000000000000000FFFF000000000000E1 -:10D150003C3C000000000000000000000000000057 -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D00000003C3C000000000000000000000000D7 -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE -:10D2300000000000000000000000000000000000EE -:10D24000000000000000000000000000F0F00000FE -:10D2500000000000F0F000000000000000000000EE -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E -:10D2B000000000000000000000000000000000006E -:10D2C0000000000000000000000000000000F0F07E -:10D2D000000000000000F0F000000000000000006E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000000000000FD -:10D3300000000000000000000000000000000000ED -:10D3400000000000000000000000000000000000DD -:10D3500000030000000000000000000000000000CA -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000001000000000000000000009C -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D -:10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F00040000000000000000000000000000000ED -:10D40000000200000000000000000000000000001A -:10D4100000000000400200000000000000000000CA -:10D42000000000000000004000000000000000902C -:10D4300040904000000000000000000000000000DC -:10D4400000000000000000000000000000000000DC -:10D4500002000200020002000200000008000000BA -:10D4600001000000000000000000000000000400B7 -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D490000000020000000200000002000200000084 -:10D4A000000000000000000000000000000000007C -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D00000000000000000000000800000000000CC -:10D4E00000004000000000000000000000000000FC -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB -:10D550000000000000000000000000000000880043 -:10D56000200000009000000090000000000000007B -:10D57000000000000000001000000000000000009B -:10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000110000000000200000001A -:10D5E0000000000000900090008200000000000099 -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA -:10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA -:10D6600000000000000001000009000000000000B0 -:10D67000004000000000000000000000000000006A -:10D68000000000000000000000000000000000009A -:10D69000000000000000000000000000000000008A -:10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000000000006A -:10D6C0000004000000000000000000000000000056 -:10D6D000000000000000000000000000000000004A -:10D6E0000000000000000000040000000000000036 -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000C00000000059 -:10D710000000000000000000000000000000000405 -:10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000000C9 -:10D76000000000000000000004200400001100116F -:10D770000000000000110000000000000000000098 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 -:10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 -:10D7D00000000000000000000000000000C0008405 -:10D7E0000000008400000090040211850088008879 -:10D7F000418841000000000000000000008400009B -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 -:10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000009000000020000AD -:10D870000000002100020000000000000000000085 -:10D880000000000000000002000000000000000096 -:10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000082008234 -:10D8F00000000000110000000000200000000000F7 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 -:10D9200005000000000000000000000000000000F2 -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D96000000000000000000000000000000090081F -:10D9700000000000000100000000000000000000A6 -:10D980000000000000000000000000000000000097 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000110026 -:10D9F0008080000000000008000300030000000019 -:10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 -:10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 -:10DA600000000000000000000000000000000000B6 -:10DA700000000080000000800000000000000000A6 -:10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 -:10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF000000000000020000000C000000000000046 -:10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 -:10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000000B5 -:10DB70000000000001000088880001000000000093 -:10DB80000100000000000000000000000000000094 -:10DB90000000000000000000000000000000000085 -:10DBA0000000000000000000000000000000000075 -:10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 -:10DBD0000000000000000000000000000000000045 -:10DBE0000000000000000000000000000000000035 -:10DBF000000000000000410000800000090000005B -:10DC000000002000000000000000000000000000F4 -:10DC10000000000000000000000000000000000004 -:10DC200000000000000000000000000000000000F4 -:10DC300000000000000000000000000000000000E4 -:10DC400000000000000000000000000000000000D4 -:10DC500000000000000000000000000000000000C4 -:10DC600000000000000000000000000000000000B4 -:10DC70000000000000000000001100000080000013 -:10DC80000000000000000000000000000000000094 -:10DC90000000000000000000000000000000000084 -:10DCA0000000000000000000000000000000000074 -:10DCB0000000000000000000000000000000000064 -:10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 -:10DCE0000000000000000000000000000000000034 -:10DCF00000000000000000000000000100000040E3 -:10DD00000000000000000000000000000000000013 -:10DD10000000000000000000000000000000000003 -:10DD200000000000000000000000000000000000F3 -:10DD300000000000000000000000000000000000E3 -:10DD400000000000000000000000000000000000D3 -:10DD500000000000000000000000000000000000C3 -:10DD600000000000000000000000000000000000B3 -:10DD700000000000000000000000000000000000A3 -:10DD800007008221000000000000000000000000E9 -:10DD90000000000000000000000000000000000083 -:10DDA0000000000000000000000000000000000073 -:10DDB0000000000000000000000000000000000063 -:10DDC0000000000000000000000000000000000053 -:10DDD0000000000000000000000000000000000043 -:10DDE0000000000000000000000000000000000033 -:10DDF0000000000000000000000000000000000023 -:10DE00000000F0F000000000000000000000000032 -:10DE10000000000000000000000000000000000002 -:10DE200000000000000000000000000000000000F2 -:10DE300000000000000000000000000000000000E2 -:10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000000000000B2 -:10DE700000000000000000000000000000000000A2 -:10DE800000000000F0F000000000000000000000B2 -:10DE90000000000000000000000000000000000082 -:10DEA0000000000000000000000000000000000072 -:10DEB0000000000000000000000000000000000062 -:10DEC0000000000000000000000000000000000052 -:10DED0000000000000000000000000000000000042 -:10DEE0000000000000000000000000000000000032 -:10DEF0000000000000000000000000000000000022 -:10DF000000000000FF000000FFFF00000000000014 -:10DF10000000000000000000000000000000000001 -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000000000000000000000E1 -:10DF400000000000000000000000000000000000D1 -:10DF500000000000000000000000000000000000C1 -:10DF600000000000000000000000000000000000B1 -:10DF700000000000000000000000000000000000A1 -:10DF8000000000000000FF00000000000000000092 -:10DF90000000000000000000000000000000000081 -:10DFA0000000000000000000000000000000000071 -:10DFB0000000000000000000000000000000000061 -:10DFC0000000000000000000000000000000000051 -:10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000000000000031 -:10DFF0000000000000000000000000000000000021 -:10E0000000000000000005002A00054000A8006193 -:10E010000006000D000000000000000000000000ED -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 -:10E0400000000000000000000000000000000000D0 -:10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 -:10E0700000000000000000000000000000000000A0 -:10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000000080 -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000000000060 -:10E0C0000000000000000000000000000000000050 -:10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 -:10E0F0000000000000000000000000000000000020 -:10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000000000FF -:10E1200000000000000000000000000000000000EF -:10E1300000000000000000000000000000000000DF -:10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000000BF -:10E1600000000000000000000000000000000000AF -:10E17000000000000000000000000000000000009F -:10E18000000000000000000000000000000000008F -:10E190000000000000F0000000000000000000008F -:10E1A000000000000000000000000000000000006F -:10E1B000000000000000000000000000000000005F -:10E1C000000000000000000000000000000000004F -:10E1D000000000000000000000000000000000003F -:10E1E000000000000000000000000000000000002F -:10E1F000000000000000000000000000000000001F -:10E20000000000000000000000000000000000000E -:10E2100000000000000000000000000000000000FE -:10E2200000000000000000000000000000000000EE -:10E2300000000000000000000000000000000000DE -:10E2400000000000000000000000000000000000CE -:10E2500000000000000000000000000000000000BE -:10E2600000000000000000000000000000000000AE -:10E27000000000000000000000000000000000009E -:10E28000000000000000000000000000000000008E -:10E2900000800000000000000020000000000000DE -:10E2A000000000000020000000000000000000004E -:10E2B000000000000000000000000000000000005E -:10E2C000000300000000000000000000000000004B -:10E2D000000000000000000000000000000000003E -:10E2E000000000000000000000000000000000002E -:10E2F000000000000000040000000000000000001A -:10E30000000000000000000000000000000000828B -:10E3100000000008000000001000000100000000E4 -:10E3200000000000000000010000000000000000EC -:10E33000000000900000000000000000000000004D -:10E3400000000000000000000000000000000000CD -:10E35000000000000000000040000000000000007D -:10E36000000000000000000000000000009000001D -:10E3700000000000009000000040009000900000AD -:10E38000000000000000000000000000000002008B -:10E390000000040002000100050000000000000071 -:10E3A0000000000000000000000000000200020069 -:10E3B00000000000020000000000000082000200D7 -:10E3C000000000000000020000000000000000004B -:10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000001D -:10E40000000000000000000000000000000000000C -:10E4100000000000800000001000900000000000DC -:10E4200000000000000000000000000000000000EC -:10E43000000000000000800000000000000000005C -:10E440000004000000000000800000000000000048 -:10E4500000000000000000000000000000000000BC -:10E4600000000000000000000000000000000000AC -:10E47000000000000000000000000000000000009C -:10E48000000000000000000000000000000000008C -:10E4900000000000000004000000040000800400F0 -:10E4A00000008880000082000011040000000400C9 -:10E4B0000011000000000000000000000002000049 -:10E4C000000000000100000000000000000000004B -:10E4D000000000000000000000000000000000003C -:10E4E000000000000000000000000000000000002C -:10E4F000000000000000000000000000000000001C -:10E5000040000000000000000000000000000000CB -:10E5100000000000000000008000000080000020DB -:10E5200080000000002000000000000080000000CB -:10E53000800000000000000000000000000000005B -:10E5400000000000000004000000000000000000C7 -:10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E5900000000000000000000000040400800000F3 -:10E5A00000080000008000000105000000200000BD -:10E5B000002000200000000000000000000000001B -:10E5C0000000010300400000000001000000000006 -:10E5D000000000000100000000000000000000003A -:10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A -:10E610000000000000000000000000008200002058 -:10E6200000000001000000040000200000000001C4 -:10E6300000000001000100000000000000000000D8 -:10E64000000004000400000100000040040000007D -:10E6500000000000000004000000000000000000B6 -:10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000000000000009A -:10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A -:10E6A00001000040020000000121012000040020C0 -:10E6B0000111000000000000001100000000000037 -:10E6C000000000000020000000000000001000001A -:10E6D000000000000000002000000000000000001A -:10E6E000000000000000000000000000000000002A -:10E6F000000000000000000000000000000000001A -:10E700000000000000000000000000000000000009 -:10E7100000000010000000000000000000000000E9 -:10E7200000000482000000840084040020090085A9 -:10E7300011010400000000000000000000000000C3 -:10E7400000000000000000010000000000000000C8 -:10E7500000000000000000000001000000000000B8 -:10E7600000000000000000000000000000000000A9 -:10E770000000000000000000000000000000000099 -:10E780000000000000000000000000000000000089 -:10E790000000000000000000000000000000000079 -:10E7A0000000000001000183000001800000000063 -:10E7B0000020008200000083002100000000000013 -:10E7C0000000000000000000000000000000000049 -:10E7D0000000000000000000000900000000000030 -:10E7E0000000000000000000000000000000000029 -:10E7F0000000000000000000000000000000000019 -:10E800000000000000000000000000000000000008 -:10E8100000000000000000000000000000000000F8 -:10E8200000000000000010001020000010200088F0 -:10E830000000000120042000002000001100000062 -:10E8400000000000050000000000000000000000C3 -:10E8500000000000000000000000000000000000B8 -:10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 -:10E88000200000000500000000000000000005005E -:10E890000000000000000000000000000000000078 -:10E8A000000000000000000001C100900000000115 -:10E8B00000C000900000000000C0009000000000B8 -:10E8C00000000000000000000000900000000000B8 -:10E8D0000000900000000084000000009004000090 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 -:10E920000000000000000000000011C11180004143 -:10E9300000080080008009000000008000800000C6 -:10E940000000000000000000000011008000000036 -:10E9500000000000800000000000000011008000A6 -:10E9600000000000000000000000000000000000A7 -:10E970000000000000000000000000000000000097 -:10E980000000000000000000000000000000000087 -:10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000080001000C10016 -:10E9B0000911C1910040800000118080000080009A -:10E9C00000008080000000000000000000000080C7 -:10E9D00000000080000000800000008000010000B6 -:10E9E0000080000000800000000000000000000027 -:10E9F0000000000000000000000000000000000017 -:10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 -:10EA20000000000000000000000000009000010055 -:10EA300082000001C190000182000000C09000002F -:10EA400082000000C09000000000000000000000F4 -:10EA50000020000000C000000008000000C000000E -:10EA600000000020000000C00000000000000000C6 -:10EA70000000000000000000000000000000000096 -:10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000000076 -:10EAA0000000000000000000000000001000000056 -:10EAB00000000001019001C100008800009000C02A -:10EAC00000000000009000C00000000000000000F6 -:10EAD000050000888800010001000088880001000E -:10EAE0000000010000888800010000000000000014 -:10EAF0000000000000000000000000000000000016 -:10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 -:10EB20000000000000000000000000000000800065 -:10EB3000000000020803408811C1000000000080AE -:10EB4000088000000000008000800000000000003D -:10EB5000000041000080000009004100008000002A -:10EB600009000000410000800000090000000000D2 -:10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000075 -:10EBA000000000000000000000000000000000095C -:10EBB00000000000C111911108004011801180096E -:10EBC00000000000801180410000000000000000F3 -:10EBD0000000000000110000008000000011000093 -:10EBE0000080000000000011000000800000000014 -:10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 -:10EC200000000000000000000000000000000000E4 -:10EC3000000000000000C101210001000100C0012E -:10EC4000200000000000C0012001000000000000C2 -:10EC50000000000000000001000000400000000172 -:10EC60000000004000000000000100000040000023 -:10EC70000000000000000000000000000000000094 -:10EC80000000000000000000000000000000000084 -:10EC90000000000000000000000000000000000074 -:10ECA0000000000000000000000000000000000064 -:10ECB0000021000007000000418200E00700000082 -:10ECC0000006004807000000008200000700410025 -:10ECD000000000000000000000000000070082218A -:10ECE0000000000007008221000000000000070073 -:10ECF0008221000000000000000000000000000071 -:10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 -:10ED300000000000000000000000FF000000FF00D5 -:10ED40000000FF000000FF000000FF000000FF00C7 -:10ED500000000000000000000000000000000000B3 -:10ED6000F0F0000000000000F0F0000000000000E3 -:10ED70000000F0F0000000000000000000000000B3 -:10ED80000000000000000000000000000000000083 -:10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 -:10EDB000000000000000000000000000FF00000054 -:10EDC000FF000000FF000000FF000000FF00000047 -:10EDD000FF00000000000000000000000000000034 -:10EDE0000000F0F0000000000000F0F00000000063 -:10EDF00000000000F0F00000000000000000000033 -:10EE00000000000000000000000000000000000002 -:10EE100000000000000000000000000000000000F2 -:10EE200000000000000000000000000000000000E2 -:10EE300000000000000000000000000000000000D2 -:10EE400000000000000000000000000000000000C2 -:10EE500000000000000000000000000000000000B2 -:10EE600000000000000000000000000000000000A2 -:10EE70000000000000000000000000000000000092 -:10EE80000000000000000000000000000000000082 -:10EE90000000000000000000000000000000000072 -:10EEA0000000000000000000000000000000000062 -:10EEB0000000000000000000000000000000FFFF54 -:10EEC000000000FF00000F0F000000FF00000F0F08 -:10EED000000000FF00000F0F000000000000000015 -:10EEE000FFFF0000FFFF00003C3C0000FFFF0000B0 -:10EEF000000000FF0000FFFF000000000000000015 -:10EF00000000000000000000000000000000000001 -:10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000000000000000000E1 -:10EF300000000000000000000000000000000000D1 -:10EF4000FFFF000000FF00000F0F000000FF0000A7 -:10EF50000F0F000000FF00000F0F00000000000076 -:10EF6000000000000000000000003C3C0000000029 -:10EF70000000000000FF0000000000000000000092 -:10EF80000000000000000000000000000000000081 -:10EF90000000000000000000000000000000000071 -:10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000003819 -:10EFC000000010C003820338CC0092C003E3033F6B -:10EFD0000C0D92C0038203380C008AC000000000B0 -:10EFE0000000000005002A00054000A805002A00D6 -:10EFF000054000A8000005002A00054000A8000008 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 -:10F0200000000000000000000000000000000000E0 -:10F0300000000000000000000000000000000000D0 -:10F04000000000000000CFCFFF00F0F0C3FF000081 -:10F0500000000000000000000000000000000000B0 -:10F0600000000000000000000000000000000000A0 -:10F070000000000000000000000000000000000090 -:10F080000000000000000000000000000000000080 -:10F090000000000000000000000000000000000070 -:10F0A0000000000000000000000000000000000060 -:10F0B0000000000000000000000000000000000050 -:10F0C00000000000000000000C0CFF00F0F0003C0D -:10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000000000000010 -:10F1000000000000000000000000000000000000FF -:10F1100000000000000000000000000000000000EF -:10F1200000000000000000000000000000000000DF -:10F1300000000000000000000000000000000000CF -:10F1400000000000000000000000D7D70F0FF0F013 -:10F15000287D00000000000000000000000000000A -:10F16000000000000000000000000000000000009F -:10F17000000000000000000000000000000000008F -:10F18000000000000000000000000000000000007F -:10F19000000000000000000000000000000000006F -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000000000000000000000004F -:10F1C00000000000000000000000000014140F0FF9 -:10F1D000F0F0287D000000000000000000000000AA -:10F1E000000000000000000000000000000000001F -:10F1F000000000000000000000000000000000000F -:10F2000000000000000000000000000000000000FE -:10F2100000000000000000000000000000000000EE -:10F2200000000000000000000000000000000000DE -:10F2300000000000000000000000000000000000CE -:10F2400000000000000000000000000000000000BE -:10F2500000000000000000800100008000000000AD -:10F26000000088808800000000000000000000000E -:10F2700000000000000090000000000000000003FB -:10F2800000000000200020004000000000000000FE -:10F29000000000000000000001000100C08000002C -:10F2A000000000002000200000009000008000000E -:10F2B000000000000000000000000000000000004E -:10F2C000000000000000000000000000000000003E -:10F2D0000000000000000000000220000004000008 -:10F2E0000000000000080000000000000000000016 -:10F2F00000000000000000000000000040000000CE -:10F3000000000000000000000000000000000000FD -:10F310000000400000000000000020002000000469 -:10F32000000000000020000000200082000000100B -:10F3300000000000000000000000000000000000CD -:10F3400000000000000000000000020000000000BB -:10F350000000900000000200840002000000000095 -:10F360000004100010000000100000000000000069 -:10F37000000010000000000000001000000000026B -:10F3800000800000000000000000000000000000FD -:10F390000000000008000000000000001040100005 -:10F3A00000080008000000000000000000800000CD -:10F3B0000100010002000000000000000008000041 -:10F3C000000000000000000000000000000000003D -:10F3D000000000000000000000000000000000002D -:10F3E0000000000180008000000080000400000098 -:10F3F000000000008000000000000000800000000D -:10F4000000010002000000000000000000000000F9 -:10F410000000000000008000008400000000800068 -:10F42000800000010001000000000000000000401A -:10F4300000000400040000000000000000000000C4 -:10F4400000000000000000000000000000000000BC -:10F4500000000000000000000000000000000000AC -:10F46000000000000000000000000011010000008A -:10F470000000000000000000000800000000000084 -:10F4800000000080000000000000000000000000FC -:10F490000008000000000000000000000000000064 -:10F4A0000000000000000000000000050100000056 -:10F4B000880082000000010000000000000400003D -:10F4C000000000000000000000000000000000003C -:10F4D00000000000000000000000000000880000A4 -:10F4E00000000000000000000000000000002000FC -:10F4F000000000000000000000000000000000000C -:10F5000000000000000200000000000000000000F9 -:10F5100000000000000000000000000000000000EB -:10F5200000000000000000000000000000002000BB -:10F5300000000000000000000800000000000001C2 -:10F5400000000000000000000000000000000000BB -:10F5500000000041000000000000000000009000DA -:10F5600090000000000000000000000000000011FA -:10F57000000000000000000000000000000001404A -:10F5800000800000000000000000000000000000FB -:10F5900000000000000000000000C00000000000AB -:10F5A0000000000008008400C0008300000000800C -:10F5B00000002000000000400000080001000000E2 -:10F5C000000000800000000000800000000000003B -:10F5D000000000000000000000000000000000002B -:10F5E000008800880000000000000000000000000B -:10F5F0000300030000000000000000000000000005 -:10F6000020000004000000000000000000000000D6 -:10F6100000000800080010001000000000000000BA -:10F6200000000000000000000000050020000000B5 -:10F630000004080088000800030100009100040095 -:10F6400000000000000400000000080200000000AC -:10F6500000000000000000000000000000000000AA -:10F660000000000090000100000000000000000009 -:10F6700000000000000000000000000090000000FA -:10F68000000000000000000000000000000000007A -:10F6900090000000000000000000000000000000DA -:10F6A0000000000000001000000002000004000044 -:10F6B00000000000000000000000000000009000BA -:10F6C0000000000000008200000000000020000098 -:10F6D000000000000000000000000000000000002A -:10F6E00000C0000000A0098840000000008400085D -:10F6F0002100000000900004400000000000000015 -:10F7000000000000000000840000000000000084F1 -:10F710000000000000000000008400000000000065 -:10F7200000000000000000000000000000000001D8 -:10F7300000000000000000000000000000000000C9 -:10F7400000000000000000000000000000000001B8 -:10F7500000000000000000000000000000000000A9 -:10F760000000000000000000000088800000000091 -:10F77000000000000021000200000000000000095D -:10F780000000000000000000000000000000000079 -:10F790000002000000000000000000020000000065 -:10F7A0000000000200000000000000000000000057 -:10F7B0000000000000000000000000000000000940 -:10F7C0000000010000000000000000000000000038 -:10F7D0000000000000000000000000000000000029 -:10F7E00000000000119000000090000000020000E6 -:10F7F0000000000000000000000000000000000009 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 -:10F8200000000000000000000000000000000000D8 -:10F8300000000000000000000000000000000000C8 -:10F840000000000040000000000000000000000078 -:10F8500000000000000000000000000000000000A8 -:10F860000000000000000000000000000000010196 -:10F870000000000000000100000000000000000087 -:10F880000000000000000100000000000000000077 -:10F8900000008200000000000000000000000000E6 -:10F8A0000000000000000000000000000000000058 -:10F8B0000100000000010000000000000000000046 -:10F8C00001000000000084000000000000000000B3 -:10F8D0000000000000000000000000000000000028 -:10F8E0000000000000000000000000000000000018 -:10F8F0001108000900410000110000210000000073 -:10F9000000000000000000001100210000000000C5 -:10F9100000000000000000000000000000000000E7 -:10F9200000000000000000000000000000000000D7 -:10F93000000011002100000800000000000000008D -:10F9400000000900000000000000000000000000AE -:10F9500000000000000000000000000000000000A7 -:10F960000000000000000000000000000000000097 -:10F9700000000041000000400000000800001120CD -:10F98000000000000000000000000041090000032A -:10F990000080100002000000410000020000000092 -:10F9A0000000000000000000000000000000000057 -:10F9B0000000000000C10000004100000000000045 -:10F9C0000041000000000000800080800000000076 -:10F9D00000030000111100000000400000000000C2 -:10F9E0000000000000000000000000000000000017 -:10F9F0000000000000010000000100000001000004 -:10FA000001010000000000000000000000010100F2 -:10FA1000000000880000000000000100000000005D -:10FA200000000000000000000000000000000000D6 -:10FA300000000010000000110000000100000000A4 -:10FA4000000000010000400000004000C0900000E5 -:10FA500000000000000001000000000000000000A5 -:10FA60000000000000000000000000000000000096 -:10FA70000000000000000000210000000100000064 -:10FA80002000000001000000000000000000000055 -:10FA900088000000010000000000000100000000DC -:10FAA0000000000000000000000000000000000056 -:10FAB00000000000000000000000C0000000000086 -:10FAC000000008000000010000880021C04000C1C3 -:10FAD000010000000000010000000002A0900000F2 -:10FAE0000000000000000000000000000000000016 -:10FAF00000000000000000000000C1000000410004 -:10FB0000000080000009200000000000000000004C -:10FB10000000000000004100000000000021000083 -:10FB200000000000000000000000000000000000D5 -:10FB30000000000000000000000000008000000045 -:10FB40000300000080000002111000000009800086 -:10FB500000A141000000000008000000008080803B -:10FB60000000000000000000000000000000000095 -:10FB70000000000000000000000000040000000081 -:10FB80000000000411000000000000000000000060 -:10FB90000000000000110400000000000000000050 -:10FBA000000800000000000000000000000000004D -:10FBB0000000000000000000000000000000001134 -:10FBC0000000000300000000000000000000000032 -:10FBD0000000000000000020000000000000000005 -:10FBE0000000000000000000000000000000000015 -:10FBF0000000000000000000000000000001000004 -:10FC000000000000000101000000000000000000F2 -:10FC100000000000000000010000000000000000E3 -:10FC200000000001000000000000000000000000D3 -:10FC300000000000000000000200000000000000C2 -:10FC400000010000000100000000000000000000B2 -:10FC50000000004000000000000100000000000063 -:10FC60000000000000000000000000000000000094 -:10FC70000000000000000000000000000000000084 -:10FC800000E00000600A000000E00000000000004A -:10FC9000000000000000000000E0000081410000C2 -:10FCA0000000000000000000000000000000000054 -:10FCB0000000000000000000000000000000000044 -:10FCC000000002E000004842000000E000000021C7 -:10FCD0000000000042000041418200E0420050006C -:10FCE000002100E00700000000000000000000000C -:10FCF0000000000000000000000000000000000004 -:10FD000000000000000000000000000000000000F3 -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000000000D3 -:10FD30000000000000000000000000550055000019 -:10FD400000000000000000000000000000000000B3 -:10FD5000000000000000F0003C3C0000000000003B -:10FD6000000000000000F0FFF0FF000000000000B5 -:10FD70000000000000000000000000000000000083 -:10FD80000000000000000000000000000000000073 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000000055005599 -:10FDC0000000000000000000000000000000000033 -:10FDD0000000000000000000F00000000000000033 -:10FDE0000000000000000000F0FFF0FF0000000035 -:10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000000000000000F2 -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000000000000D2 -:10FE300000000000000000000000000000000000C2 -:10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 -:10FE80000000000000000000000000000000000072 -:10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000000000000000052 -:10FEB0000000000000000000000000000000000042 -:10FEC0000000000000000000000000000000000032 -:10FED0000000000000000000000000003C00C30023 -:10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 -:10FF0000000000000000000000610006000D00007D -:10FF100000000006000C00000000000000000000CF -:10FF200000400006000C000000610006000D00000B -:10FF300000000000000000000000000000000000C1 -:10FF40000000000000000000000000040006000E99 -:10FF50002000006100060009000000610006059D08 -:10FF600000050561002E800D000000610026000DD7 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 -:10FF900000000000FF0000FF000000000000000063 -:10FFA000000000000F0FFFFF00000000000000AA8B -:10FFB00000AA000000000000000000000000000097 -:10FFC0000000000000000000000000000000555587 -:10FFD000FFFF0000000000000000FF000000000024 -:10FFE0000F0F0000000000000000000000000000F3 -:10FFF0000000000000000000000000000000000001 -:020000040030CA -:1000000000000000000000000000000000000000F0 -:10001000000000000000FF0000FF000000000000E2 -:100020000000000000000F0F0000000000000000B2 -:1000300000AA00AA0000000000000000000000006C -:1000400000000000000000000000000000000000B0 -:10005000555500000000000000000000FF000000F7 -:1000600000000F0F00000000000000000000000072 -:100070000000000000000000000000000000000080 -:10008000000000000000000000000000000050FA26 -:100090005050000000000000FF0000FF00000000C2 -:1000A00000000000000000000000F0F00000000070 -:1000B0000000808020200000000000000000000000 -:1000C0000000000000000000000000000000000030 -:1000D00000000F0FAAAA00000000000000000000AE -:1000E0000000000000000000000000000000000010 -:1000F000000000003C3C0000000000000000000088 -:1001000000000000000000000000000000000000EF -:1001100050FA5050000000000000FF0000FF0000F7 -:10012000000000000000000000000000F0F00000EF -:10013000000000008080202000000000000000007F -:1001400000000000000000000000000000000000AF -:10015000000000000F0FAAAA00000000000000002D -:10016000000000000000000000000000000000008F -:100170000000000000003C3C000000000000000007 -:10018000000000000000000000000000000000006F -:100190000000000000000000000040000402C00059 -:1001A00000000000000000000000000000008800C7 -:1001B0000000000000000000880000032000200074 -:1001C0002000000000000003000000000000840088 -:1001D0008800000000000000000020002000200037 -:1001E000200000000000000040000000000084002B -:1001F00000000000000000000000210000000000DE -:100200000000000000000000008400840000008462 -:1002100000000004000000000000000000000000DA -:10022000000000000000008200400000008200008A -:1002300000000000000000000000000000000000BE -:100240000000400000000000000000A000000000CE -:10025000000000000000000000000040000000203E -:10026000000000A0050000A000A000A000C000A0A9 -:1002700000A000900000000000000000100000003E -:100280000000000000000200020090009000020048 -:10029000000002000000000000000200100000004A -:1002A000000000000000000000000000000000004E -:1002B000000000000000824000000000100000006C -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000010000E -:1002E000000000000000000000000000000000000E -:1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED -:10031000000000000000000000000000000080005D -:1003200000000000000000000000000000000000CD -:1003300000000000009000000000000800008000A5 -:100340000000000000840000000000000000000029 -:100350000000000000000000000000000088000015 -:10036000800000000000000000000000000000000D -:10037000000000002000000000000000000000005D -:10038000000000000000000000000000000000006D -:100390000000000000008400400000000000000297 -:1003A0000004900000080003002100040003000086 -:1003B000000000009000000000110000000000009C -:1003C000000000000000000000000000000000002D -:1003D000000000000000001100000000000000000C -:1003E0000000000000000000000000000000C0004D -:1003F0000000000000008800000088008800C000A5 -:1004000000000100000000000000000000000000EB -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC -:1004400000000004000000000000000000000000A8 -:10045000000000000000000009000800000000008B -:1004600000C00000000000000500000000000000C7 -:100470000000000000C0008200000000000000003A -:100480000000000020000000000000000005000047 -:10049000000084050005000000000000C00000000E -:1004A00010008200A004000000000404820000008C -:1004B000820082008400C0000000820082030000ED -:1004C00082008200C004000082000000C0008200A0 -:1004D0000000820082000000A000840084008200EE -:1004E000000082008200C00482008200820082003C -:1004F00000008200000084008200840082008200EC -:10050000C0008200A0008200000000000000000087 -:1005100000000000000000000000000000000000DB -:10052000000000900000000100000000000000003A -:1005300000000000000000000000000000000000BB -:1005400000000000000000010000000000000000AA -:100550000000000000000000034003000000000055 -:10056000000000000000000000010000000000008A -:1005700000000000000003880300400008000000A5 -:10058000000000000000000000000000000000006B -:1005900000009000000000000000000000000008C3 -:1005A000000000000000000000111000000000002A -:1005B0000000000040020000200040030000000492 -:1005C00000000000000000094011000008000000C9 -:1005D0000800000000000000000000009000000083 -:1005E000820400000000000000000011080000006C -:1005F0000800000000000000100000000008820059 -:1006000008040000000000000000001100000000CD -:1006100000000000000000000000000000040000D6 -:1006200040000020008400080000000000000000DE -:100630000400000000000000000000C000000000F6 -:100640000084000000040000000000000000000022 -:10065000000000000000000000000000000000009A -:100660000000000000000000000000000084000006 -:1006700000000000000000000082000009C00084AB -:10068000000000C0000000000000000000000000AA -:10069000000000000000000000000000004000001A -:1006A000000000049009002100210000000000402B -:1006B0000000040000000000000000000000000036 -:1006C00000000000000000000005000282000000A1 -:1006D000000008218200A00010000000840000003B -:1006E0000000000082000000000000000000080080 -:1006F000000008004000A00200000000000002000E -:1007000000000000080000000002000000000800D7 -:1007100000000000000000000000000000002000B9 -:100720000000009000000290000000002000000087 -:100730002000000000000004000000000000000095 -:100740000000000041000000000000000000050063 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:100770000000000000000000000000000000110068 -:100780000000000000000000000000000000000069 -:10079000000000010001000100C10001000100C0D3 -:1007A000000900000101000200900001000100C1E9 -:1007B000000000010001000100C00001000100C0B4 -:1007C000014100000101002000880001000100C17A -:1007D0000000000000010001000100C00001040150 -:1007E00000C00183000001010040009000010201EF -:1007F00000C0000000010001000100C00001040170 -:1008000000C001830000010100400004000102015A -:1008100000C000000041004100410088004100414B -:1008200000A010C100111041000000000041004173 -:100830000085000000410041004100C0004100412E -:1008400000C01041001110410000000000410041B3 -:1008500000850000000000410041004100C000414F -:10086000804100C010C10511084100800000004116 -:1008700080410085000000410041004100C000416E -:10088000804100C010C14011104100800080004133 -:10089000804100850000410003000000008041000D -:1008A000900000000200900041800002A000410082 -:1008B000C1000080000041000300000000804100F2 -:1008C000A00000002000900009800000840041008A -:1008D000C100008000000003410003000000008010 -:1008E00041008300000005000200418000108800E4 -:1008F0004100C10000808000410003000000008032 -:1009000041008300000005000200208000008200FA -:100910004100C1000080800001000100000000C013 -:100920000100C00000000000080010080088C0009E -:100930000300C1000084080801000100000000C09D -:100940000100C00000000000020010100088C1007B -:100950009100C100008408080000010001000000AF -:1009600000C00100C0000000000041008210002112 -:10097000C1009100C10000048200010001000000DC -:1009800000C00100C00000000000210088100040ED -:10099000C1009100C1000004820000C00001C0C17C -:1009A00000000000000100C004900011000100C11F -:1009B0000100000000010000000000C00001C0C1F3 -:1009C00000000000000102C082880089000100C10F -:1009D00000000000000100000000000000C0000155 -:1009E000C0C100000000000102C08288008900012F -:1009F000C0C10000000000010000000000C00001B4 -:100A0000C0C100000000000102C0824000030001DC -:100A100000C1000000000001000000000080004153 -:100A200080C100000000004100C1000200C100417F -:100A300000C10800000000410008000000800041E3 -:100A400080C100000000004180C100080041004159 -:100A500000C100000000004100080000000000800C -:100A6000004180C100000000004180C10040004101 -:100A7000004180C10000000000410005000000802E -:100A8000004180C100000000004180C1002000C181 -:100A9000004100C100000000004100050000C1004D -:100AA000800080C100004108000084004100C14175 -:100AB0008000800800004100000080004100C1006B -:100AC000800080C100004140800082004100C1419F -:100AD0000000801000004100000080004100000084 -:100AE000C100800080C100004140800082004100C0 -:100AF000C11080008005000041000000800041001E -:100B0000C100800080C1000041408000820041009F -:100B1000C141000080100000410000008000410041 -:100B2000C1004000C0C100000100880008000100B1 -:100B3000C1898200C001000001000000C000010066 -:100B4000C1004000C0C100000100400005000100DC -:100B5000C1099000C000000001000000C0000100B9 -:100B60000000C1004000C0C10000010040000500BD -:100B70000100C1212000C000000001000000C000F1 -:100B80000100C1004000C0C100000100400005009C -:100B90000100C1418200C001000001000000C0004E -:100BA0000100000000000000004200000000000002 -:100BB000000081120048070048000000000000000B -:100BC00000000000000000000042000000000000E3 -:100BD00000008112004807004800000000000000EB -:100BE00000000000000000000000004200000000C3 -:100BF00000000000841200480700004200000000CE -:100C000000000000000000000000004200000000A2 -:100C100000000000811200480700480000000000AA -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D20000000000000000000757B000000000000D3 -:100D300000000000000000000000000000000000B3 -:100D4000000000000000DEAE757B00000000000027 -:100D50000000000000000000000000000000000093 -:100D6000000000000000DEAE0000757B0000000007 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000DEAE757B00000000E7 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000DEAE60C6030000008E -:100DB000000000000031E0000000000000000C0016 -:100DC00000000000000000C0630660C603000000D1 -:100DD000000000000031E0000000000000000C00F6 -:100DE00000000000000000C06306000060C60300B1 -:100DF0000000000000000031E000000000000000E2 -:100E00000C0000000000000000C0630660C6030084 -:100E10000000000000000031E000000000000000C1 -:100E20000C0000000000000000C06306000000008D -:100E300000000000000000000000000000000000B2 -:100E4000000008000000000000000000000000009A -:100E50000000020000000000C000000008000000C8 -:100E6000A00000000000000000004000000300009F -:100E700000000000400000000000200000002000F2 -:100E80000000400000000000000000002000000002 -:100E9000000000002000881000002000000020005A -:100EA0000000200000000000000000002000000002 -:100EB00000000000000000000000000000000090A2 -:100EC000008200828000000000000000000000009E -:100ED00000000000000000000000400000000000D2 -:100EE00000000000000021002102000000000000BE -:100EF0004100000000001000000000000040000061 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000500000000000000BC -:100F300000000000000000000200020002000200A9 -:100F4000020000000040000000000000000000005F -:100F5000000000000000000000000000000000048D -:100F60001000000000000000000000000000000071 -:100F70000000100000000000000000000000001051 -:100F8000001002000000000000000000000000004F -:100F9000000000000000000000200400000000002D -:100FA000000400000000001000100000000000001D -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE00000008004000000840090009000000000D9 -:100FF0000000000080000000000000000000000071 -:1010000000000000000000000000000000000000E0 -:10101000000000000000000000000001800000004F -:1010200000000001000000000000000000000000BF -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:10105000000000000000000000110000040000007B -:1010600000000000000000000080010000000002FD -:101070000000000000000005000000040000000067 -:101080000000000000000000000000000000000060 -:1010900000000000000000000005002000200020EB -:1010A0000020000000000000000000000000000020 -:1010B000000000000000000000000200000000002E -:1010C0000000200009000088000000A000080008BF -:1010D0000000050000000000410000881100000031 -:1010E000000020000000000000820004040400044E -:1010F000000100820000000000000000400000002D -:101100000000030041000000000000840000000017 -:1011100000001000000000000000000000010301BA -:101120000301210100000000000000000000000099 -:1011300000000000000000000000000000000000AF -:1011400000000000000900000091000000110000F4 -:10115000000000000000000000000000000000008F -:1011600000000021000000000500010501000180D1 -:10117000008085000080A0000000A00000000100A9 -:10118000088000000000004000000000100008007F -:1011900040004000000004000400010001000100C4 -:1011A00001000000002000000000000000004000DE -:1011B00040000000000000000000000000000000EF -:1011C00000002000000000000010002000000000CF -:1011D0000000000000880000000000000000000087 -:1011E0000000000000000010000084000400040063 -:1011F000040400200400002000820000000000829F -:10120000200000040000000000000000000000407A -:10121000880000000000000080008000040004003E -:1012200004C00400000000010000000000000000F5 -:1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E -:1012500000000000000000008400200000000000EA -:1012600000000000000000000000900000000400EA -:101270000400000000110000000090800000000049 -:1012800000040020400000100000000000000000EA -:10129000000000000000000000000000000000004E -:1012A00004008200040000000000000000000000B4 -:1012B00000000000000000000000000000000088A6 -:1012C000000000000000000000000288000002088A -:1012D000004009080090000200000000000000002B -:1012E00000000000020000900000050000000288DD -:1012F000820480A000000000000000001020000018 -:101300000000000000001000009000000800000035 -:101310001000100409880090000000000000080080 -:1013200000008000000088000000000008000000AD -:101330000800008408000000000000000000080011 -:10134000000000000000000020000000000000007D -:10135000000000800000000000000000000000000D -:10136000000000000000000000000000000000007D -:101370000000010000000800040001020009000054 -:10138000000000000000000000000040000000001D -:101390008200000000000000000000210021000089 -:1013A00000000400820004000000018001040080AD -:1013B0000100000000000000010000000002002009 -:1013C00000200000000000000000000000000000FD -:1013D00000000000001000000000000000000000FD -:1013E0000000009000004104110000000000000017 -:1013F000000000002000200000000000400100006C -:1014000000000000000000000000000000000000DC -:101410000000000000840000000000000000000048 -:101420000000000080000000800000000420040094 -:101430004120040000000000000004000000000043 -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:101470000000000001C000900000000001C10090C9 -:101480000001000100000100000000000000000059 -:1014900000000000000010400008000202400000B0 -:1014A00000000000000000C000900000000000C02C -:1014B000019040000000000000000000000000005B -:1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F0000000000000001180218000000000108822 -:1015000000830020001100001100210000000000F5 -:10151000000000000000000000000080000000004B -:1015200000000000000000000080008000000000BB -:10153000038521A10005004000000000000000001C -:10154000000000000000000000000000000000009B -:10155000000000000000000000008000000080008B -:10156000000000000000000000000000000000007B -:101570000000000000000000000809000003808057 -:10158000008000008000808000030041090000030B -:1015900000800000000000000000000000000000CB -:1015A000000000000000800080800000000080003B -:1015B0008080030004008300888000000000000099 -:1015C000800000000000000000000000000000009B -:1015D00000000000000000000000880090C08800AB -:1015E00090C00000000000000000000000000000AB -:1015F00000000000000000000000000101000000E9 -:10160000C088000200008400C090000000010100BA -:101610000000008800000000000000000000000042 -:1016200000000000000000008400C09000000000E6 -:101630008400C090000001008400C1900000000000 -:101640000000080000000000000000000000000092 -:10165000000000000000000000000000000000008A -:10166000A0000000000000000000000000000000DA -:101670000000000000000000000000000000A000CA -:10168000889001C000000000019001C0000000002F -:101690008800000001000000000000000000089029 -:1016A000000200020488000000000090000000001A -:1016B0000000049000C000000001009100C0000084 -:1016C000000000000000000000000000000000001A -:1016D0000000000000000000000000000000050005 -:1016E00000000000000000000000000000000000FA -:1016F00000000000000000000000000000000000EA -:10170000000000804180000021001180088000005E -:101710000000000000004100000000000000000088 -:1017200080000000000080800000000000800000B9 -:1017300000000000008000800003030840A100C0FA -:101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 -:1017600000080004008000000000000000000000ED -:101770000000000000000000000000000000000069 -:101780008002211100800000A111800300004000B0 -:101790000000000000110000040000000000000034 -:1017A0000000000000000000000000000000000039 -:1017B00000008011800000000000A11184000000E2 -:1017C0000010000000000080000000000000000089 -:1017D0000000000000000000000000000000000009 -:1017E0000000000000100090000000000000000059 -:1017F00000000000000000000000000000000000E9 -:1018000000009000000000080000C101200100005D -:1018100000000000000000010000000000000000C7 -:1018200000000000000000000000000000000000B8 -:1018300000000000C001200000000000C191210054 -:10184000000000010000000000080000000000008F -:101850000000000000000000000000000000000088 -:1018600000000000008100000700000000000000F0 -:101870000000000000000000000000000000000068 -:1018800000000000002100E0420000410041000093 -:10189000420000000000000000E000008141000064 -:1018A00000000000000000000000000000000082B6 -:1018B0000000420000000021000042000000000A79 -:1018C000004842000000000000004200000000004C -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:101900000000000000000000FFFF000000FF0000DA -:1019100000FF000000FF00000000000000000000C9 -:101920000000000000000000000000000E000E009B -:101930000000000000FF00FF000000FF000000FFAB -:10194000000000FF000000FF000000000000000099 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:1019800000000000000000000000FFFF000000FF5A -:10199000000000FF000000FF000000000000000049 -:1019A00000000000000000000000000000000E0029 -:1019B0000F0F0000000000FF00FF000000FF00000C -:1019C00000FF000000FF000000FF0000000000001A -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000001EFFDA -:1019F0001E55000000000000000000000000000074 -:101A000000000000000000000000FF000000FFFFD9 -:101A10000000FF000000FF000000000000000000C8 -:101A2000000000000000000000000000FFFF0005B3 -:101A30000000000000000000FF000000FF000000A8 -:101A4000FF000000FF000000FF0000000000000099 -:101A50000000FFFF00000000000000000000000088 -:101A60000000000000000000000000000000000076 -:101A70001EAA1E0000000000000000000000000080 -:101A8000000000000000000000000000FF00000057 -:101A900000000000FF000000FF0000000000000048 -:101AA00000000000000000000000000000000C0C1E -:101AB0000C0C0000000000000000FF000000FF0010 -:101AC0000000FF000000FF000000FF000000000019 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000500F1 -:101AF0000A38050000A000000000000000000000FF -:101B00000000000000000000000000000000034290 -:101B1000033E0C0C92C003E3033E0C0D8AC0000090 -:101B200000400006000C0000000000000000000063 -:101B30000000400000000000000000300C0012C057 -:101B4000038203300C0092C003E303360C098AC001 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000FF00FFFF00002828000000000000F8 -:101BA000000000003C3CFFFF0000000000000000BF -:101BB0000000000000000000000000000000000025 -:101BC00000000000000000000000FF000000FFFF18 -:101BD000FFFF000000000000000000000000000007 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000000000FF000000000028280000000075 -:101C20000000000000003C3C00000000000000003C -:101C300000000000000000000000000000000000A4 -:101C4000000000000000000000000000FF00000095 -:101C50007C7D3C3C00000000000000000000000013 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000F0F00000000000085C -:101CA00000000000000000000000F0F00000000054 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000FFFF16 -:101CD000FFFFE000F0F00000000000000000000046 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000F0F000000000E3 -:101D2000000000000000000000000000F0F00000D3 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D5000FF3D3C3CA000F0F000000000000000004F -:101D60000000000000000000000000000000000073 -:101D700000000000000000000000000000800000E3 -:101D8000000000000000A0000000020000000011A0 -:101D900000000000000000000000000001009000B2 -:101DA0000100000000000000000100000000000031 -:101DB0000000000000000000000000000000000023 -:101DC00020000000000000004000000000000000B3 -:101DD0000000000000000000000000000000000003 -:101DE00020000000000000002000000000000000B3 -:101DF0000000000011000000000011000000004081 -:101E00000000000000000000100000008000000042 -:101E100000000000000000000000000000000400BE -:101E200000001000000000000000000000000000A2 -:101E30000000000000000000000009000000000099 -:101E4000000000000000000005000000000000008D -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E700000009000000003008200820084009000B7 -:101E800002000000000000000000820000000200CC -:101E900002000200020002000000000088000400AE -:101EA0000400000000400300000082000000020067 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000200000000000000E0 -:101F000000000000000000000000000000000000D1 -:101F10008000800080000000000000000000000041 -:101F20008000800000000001400000000000000070 -:101F30000000000400040000000000000000000099 -:101F4000000000000000000000000000000003008E -:101F50000000000000000000000800000000000079 -:101F60000008000000000000000800000000000061 -:101F70000000000000000000000020000000000041 -:101F800000009000C000200000000000000040039E -:101F90000280000401880000000020000000000012 -:101FA00082009000000020000000400000000800B7 -:101FB0000000840000000000000000080000000095 -:101FC00000000008000300000800000000000000FE -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000800000000000000E9 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000211000000000000840084B5 -:102010000000800400000204000000000000000036 -:1020200000000000118200000000410000000000DC -:1020300000000000000000000000000000000000A0 -:10204000000000000000000000000002000000008E -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:10207000000000000000000000000004000000005C -:1020800000000040000000000000C0000000000050 -:10209000000000000200008000000080001000002E -:1020A00000000000004000030000010000400000AC -:1020B0000080C000000000000000000000000000E0 -:1020C00000000000000000000011000000000000FF -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:10210000000000000000004000000000000000008F -:1021100000000000000080000040000000040000FB -:1021200000000000000000000000000004000000AB -:10213000000000020000000000000000000000009D -:10214000000000C0000000000000000000000000CF -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000400000000000040000000000000000000B -:102190000000000000009000000402000104008024 -:1021A0000000000000004000040004009000000057 -:1021B0000188000000040100000000000821000068 -:1021C000000400000000000000000000000000000B -:1021D00000000008000000000000000000000000F7 -:1021E000000001000000000000800000000000006E -:1021F00000000000000000000000000000020000DD -:10220000000000C00000090000020000098800A0D2 -:10221000000000000000000020000000800002001C -:10222000004041840000000000C0800080040000E5 -:10223000008410090084000140C00000000000007C -:102240000084000041000000000000000000400089 -:10225000000040900000000000C0050000000000E9 -:102260000000000040000000008800100000000096 -:10227000000021000000000000000000000000003D -:10228000000000000000000000000000000000004E -:102290000000000000000003000000000000000833 -:1022A0000008000000000000000000000009040019 -:1022B0000000400020002005410000020000002135 -:1022C000000200000000000000000002000000000A -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000040000000AE -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD -:1023300080000000800080888000C0004101000013 -:10234000000000002100000000000000000000006C -:10235000000000000000000000000000000000007D -:102360000000000000000000000211021102898834 -:10237000000000001100000000000000000000004C -:10238000000000000000000000000000000000004D -:1023900000C008C00090C00800000000000000005D -:1023A00001C00090000808C000000000000000000C -:1023B00000000100880000001010000401900410CB -:1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD -:1023E0000000000000000000000000A1000182A128 -:1023F000A0C100000000000000000000000000007C -:1024000000000000000000000000000000000000CC -:1024100000000880808000008000000000000000B4 -:102420000000118000800400000000000000000097 -:10243000000000002000000000008080000041003B -:10244000808000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000002000400C -:1024700000200040000000000000000000000000FC -:10248000000000000000000000000000000000004C -:1024900000000000000080808002000000000000BA -:1024A0000000000080418008008380800000000060 -:1024B00000000000000000800000000004022190E5 -:1024C0000882419000010000008000000000000030 -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000002000CC -:1024F0000000A0002000000000000000000000001C -:1025000000000000000000000000000000000000CB -:10251000000000000000020040C0820010C0000067 -:10252000000000000000400182000040C090000058 -:1025300000000000000000000008000000840021EE -:102540000182009101410000000000040000000031 -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:1025700083008200A1008300000000000000000032 -:10258000000000000000000000000000000000004B -:10259000000000000000000009880010C0840090C6 -:1025A00000000000000000000040A0A0908482C055 -:1025B0000000000000000000000000000401000115 -:1025C000100382042003919000010000000000002D -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F000000000A1000101A1A0C000000000000037 -:1026000000000000000000000000000000000000CA -:1026100000000000000000000000410000000080F9 -:1026200008000000000000000000008000008000A2 -:10263000888000000000000000000420000300115A -:1026400000088020008080A1828000010500000039 -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:102670000000000000022102022100000000000012 -:10268000000000000000000000000000000000004A -:102690000000000000000000000000008000800436 -:1026A0008080800000000000000000008011001108 -:1026B0008000000000000000000000000000001189 -:1026C0000000000090090821080088200001000097 -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F0000000000000000002008000000040000018 -:1027000000000000000000000000000000000000C9 -:102710000000000000000000000000000000C000F9 -:10272000C000C002C0000000000000000000C001A6 -:10273000A0C14040000000000000000000000000B8 -:1027400000000000000009091100110091000001C3 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000100A00082000135 -:102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 -:1027A0000000000042004806000000000000000099 -:1027B00000820048070081000000000000000000C7 -:1027C000008200004200000060000048000000811C -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 -:102830000000FF66F0F0FFF03C3C000000000000EC -:1028400000000000000000000000FEBCDA98FFF667 -:102850007E7E00000000000000000000000000007C -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 -:102880000000000000000000000000000000000048 -:102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 -:1028B000000000009900F0F00F003C3C0000000018 -:1028C000000000000000000000000000E6A4C2803C -:1028D000FFFF7E7E000000000000000000000000FE -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 -:10290000000000C300000000000000000000000004 -:1029100000000000000000000000000000000000B7 -:10292000000000000000400840000084200000007B -:102930000000000000000000000000000000000097 -:102940000000000000000000000000000000000087 -:102950000000000000000000000000000000000077 -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:102990000000000000000000000000000000000037 -:1029A00000000000FFFFFFFF00000000000000002B -:1029B000000000000000000000FF1E1E0F0F7E7EC2 -:1029C0000000000000000000000000000000000007 -:1029D0001E1E99FFFFFFFFFF000000000000000027 -:1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 -:102A000000002222828200004043000000000000FB -:102A100000000000000000000000000000000000B6 -:102A2000000000000000FFFFFFFF000000000000AA -:102A30000000000000000000000000FF1E1E0F0F3D -:102A40004242000000000000000000000000000002 -:102A500000001E1E0066FFFFFFFF000000000000D8 -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A800000000000222282820000000000000000FE -:102A90000000000000000000000000000000000036 -:102AA00000000000000000000000100630000000E0 -:102AB0000000080000000000000000001061203746 -:102AC000004D0008000000000000000005610A3E03 -:102AD000050D00A000610007C0CD0000000000004F -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000610006000D0000000051 -:102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B50000000B4AAB4FF000000003CFF3CFF0000EE -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 -:102B800000000000000000000000000000400040C5 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD00000000000B400B455080000003CFF3CFFBA -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C00000000000000000000000000000000004084 -:102C10000040000000000000000000000000000074 -:102C200000000000000000000000000000000000A4 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000002001C4005F -:102C900041823C3C000000000000000000000000F9 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000141010000000000000000000000000B0 -:102CF00000000000000000000000000000000000D4 -:102D00000000000000000000000000000000555519 -:102D1000D58041823C3C0000000000000000000023 -:102D200000000000000000000000000000000000A3 -:102D30000000000000000000000200000000000091 -:102D40000009000000100000000500000000000065 -:102D5000000000000100000000000420010000004D -:102D6000000000000420000201200100010000001A -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC00000000000400000000000000000000000C3 -:102DD000000000000000040000000000800104006A -:102DE0000000000000008501000004010400040050 -:102DF0000000000040000000000000000000000093 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E2000000000000000000000000000000008009A -:102E30000000000000000000000000000000020090 -:102E4000020002000000000000000000020000007C -:102E50000200000000000000040002000400040062 -:102E600004000440040008000800000011000100F4 -:102E700004800400020000000000000000000000C8 -:102E80000000000002000200000008000000000036 -:102E900008000800000000410000000004000000DD -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000200000000 -:102ED00000000000000000000000800000008000F2 -:102EE000800080008000800000000000000084005E -:102EF0000400802080008000000000000000000826 -:102F000000000000000000000000000000000008B9 -:102F100000000000000000080000000000008040E9 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40002000000000000000000000000000000061 -:102F500000000000000000000000000000000080F1 -:102F600000200400000004000400008000000000B5 -:102F70000000000004000400000000000000000049 -:102F80000000000008000000000000000000000039 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB00000000000000000000000002000000000F1 -:102FC00000200000000000200000009000880000A9 -:102FD00000000000000800000900000000000000E0 -:102FE000022000018000000082008000002000001C -:102FF00000000008008280828000000000000000C5 -:1030000000000000000000000400000000000000BC -:103010000020000000000000000000000000000090 -:1030200000000000000000000000000000000000A0 -:10303000000000000000000000000040000000044C -:103040000000000400000004000000000000000078 -:103050000000000000000000000000000000000070 -:1030600000000020000000000000000000000089B7 -:10307000008200000000000001000080000000004D -:1030800000000100004000000000000000000000FF -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C00000000000004000000000000000000000C0 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000100000000000000000000DF -:1030F000002000200000000000002000000400006C -:1031000000000000040000000000000000000000BB -:1031100000000000000000000000000000000000AF -:10312000008800880000000000000000000000008F -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F -:1031600000000000000000000080000000000000DF -:1031700000000000900000000000000000001000AF -:103180000008001100200000000000000000000006 -:10319000000000000000000000000000000000002F -:1031A000000000000000008000000000000000009F -:1031B000000000000000000000000000000000000F -:1031C000000004000000000004000902402000008C -:1031D00000000000000000C000000000009000009F -:1031E00000000000000000000008002000C0008473 -:1031F000400404004004000400000000000000003F -:10320000800000000000000100000000000000003D -:1032100000000000000000000800000000000000A6 -:10322000000000000000000000020000000000009C -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:103260000000000000000000000000000005000059 -:1032700000000000880900000002000000000100BA -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C0000000000000C0000000000000000000003E -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:10330000200000000000000000000000000000009D -:10331000000000000010000000000000000000009D -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000C09D -:1033700000900000000000C000900000000000006D -:1033800001C00090000000000000900000840000D8 -:10339000000000000000000000000000000000002D -:1033A000000000000000000000018501C0010000D5 -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD -:1033F00000800080000000000080008000000000CD -:1034000000001180218000000000110080000000F9 -:1034100000000000000000000000000000000000AC -:1034200000000000000000000000004021200020FB -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C -:1034700080000000000080008080000000008000CC -:103480008080000300080900800380800000008025 -:1034900000000080000000000000000000000000AC -:1034A00000000000000000000000000000004000DC -:1034B00020000300000000000000000000000000E9 -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC -:1034F00000009000000000008400C0900000000068 -:103500008400C0900000000101008400C090000011 -:103510000020000000C000000000000000000000CB -:10352000000000000000000000000000000000A0FB -:10353000A100A10001000000000000000000000048 -:10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:1035700000000000000000000000009000C00000FB -:103580000000009000C0000000008800009000C013 -:103590000100028888000100000000000000000017 -:1035A000000000000000000000000000000000001B -:1035B0000001010100010001000000000000000006 -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000800080CB -:10360000000000000080008000000000000000803A -:10361000418041008080000009000000000000009F -:10362000000000000000000000000000000000009A -:1036300000000021044000210021000000000000E3 -:10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A -:103670000000000000040000000080118004000031 -:1036800000008011804000000000000080118405CF -:103690000000000000110000008000000000000099 -:1036A000000000000000000000000000000000001A -:1036B000000000000040000000804000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F000000000000000000100000000C0012001E7 -:1037000000000000C0012001000000000000C00116 -:103710002000000000000001000000400000000048 -:103720000000000000000000000000000000000099 -:1037300000000000000000A1008400400100000023 -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 -:103770000000000000000042000042000000004283 -:10378000000042000000000A0000420000000000AB -:10379000000A00E042000000000000000700822153 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C000000A0000070000000000000000000000E8 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:10380000000000FF000000FF000000FF000000FFBC -:103810000000000000FF000000FF00000000F0F0CA -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000000000FF000000FF000000FF00003B -:1038900000FF0000000000FF000000FF000000002B -:1038A000F0F0000000000000000000000000000038 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:10390000FFFF0000FF000000FF000000FF000000BC -:10391000FF0000000000FF000000FF0000000000AA -:103920000F0F0000FFFF000000000000000000007B -:103930000000000000000000000000000000000087 -:10394000000000F000F00000000000000000000097 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:103980000000FFFF0000FF000000FF000000FF003C -:103990000000FF0000000000FF000000FF0000002A -:1039A00000000F0F000000000000000000000000F9 -:1039B0000000000000000000000000000000000007 -:1039C00000000000AAAAAAAA00000000000000004F -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000038000010C0038203380C0092C090 -:103A1000038203380C0092C0000003C2033E0C0C6A -:103A20008AC005002A00054000A800000000000030 -:103A30000000000000000000000000000000000086 -:103A4000000000610006000D0000050000200000DD -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000FF0027 -:103AA000FFFF000000000000000000000000000018 -:103AB0000000000000000000000000000000000006 -:103AC0000000000041414141040E545E000000002E -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 -:103B2000FF00000000000000000000000000000096 -:103B30000000000000000000000000000000000085 -:103B40000000000000004141414100000000000071 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA00000000000F0F00000000000000000000035 -:103BB0000000000000000000000000000000000005 -:103BC0000000000000000000A5F5A0000F0F0F0F7F -:103BD00000000000000000000000000000000000E5 -:103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C2000000000000000F0F00000000000000000B4 -:103C30000000000000000000000000000000000084 -:103C400000000000000000000000A5F5A000FF0F2C -:103C50000F0F000000000000000000000000000046 -:103C60000000000000000000000000000000000054 -:103C70004000000000000000000000000000000004 -:103C80000400000000000000000000000000000030 -:103C90000000000000000000000000000000000024 -:103CA0000000000300000000000000000000000011 -:103CB00000000000000000050005000000000000FA -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF0000000000000000000000000900000000034 -:103D000000008000000000400000000000000000F3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 -:103D30000000000040000000000000000000000043 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000020051 -:103D70000200020002000200000002000000000039 -:103D80000400000002000000000000000000080025 -:103D90000000000000000000820090009000004041 -:103DA0000000000000000000000000000000000013 -:103DB00000000400000000000000000000000000FF -:103DC00000000000000002000000000000000000F1 -:103DD00000000000000004000000000000000000DF -:103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000001000000000000000000000000000091 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000020000000000000090004000000070 -:103E800040000400000000000400000004000400E2 -:103E9000040084000000000008000000000004008E -:103EA00000000000900088000000000000000000FA -:103EB00000000000100000000000000000001000E2 -:103EC00000000200000000000000000000000041AF -:103ED00000410000000000000000000000000000A1 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F00000000000000880020000000000000000009 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F400000000000800000000000000000000000F1 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F700000000000000000410000000000040000FC -:103F800000000000000000000000004000000000F1 -:103F9000000000000000000000000000000000041D -:103FA00000000000010000400000000009000000C7 -:103FB0000000000000000000000000000000000001 -:103FC00000000021000000000000000000000000D0 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000020000000000000000000A1 -:1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000400000000000000040088 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:1040500000000000000000C00000000000000000A0 -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A00000000000000000200000000000000020D0 -:1040B0000000000000000000000000000000000000 -:1040C000000082000000000000000000000000006E -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000040000000000000000000400A7 -:10411000000000200000000010000000000000006F -:1041200000001000000000000001000000840000FA -:10413000000100C00000000000000084000000003A -:1041400002000000008400000000000000000000E9 -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000010000000000000000000E -:1041B00000000000000000000009000000000000F6 -:1041C00000000000000200000000000000000002EB -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000900000000000000000000000000A5 -:10421000000000000000000000000000000000009E -:10422000200000000000000002000000000000006C -:10423000000000000000004000000000000000003E -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000900000007E -:1042B00000880000900000000000000000000000E6 -:1042C000000000000000000000000000009000025C -:1042D00000020000000000000000000000000000DC -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:104310000000000008000000000000000000000095 -:1043200000000000000000000000000011008000FC -:1043300000000000110080000000000000000000EC -:1043400000000000000000000000000000000080ED -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000000000800000009D -:1043A000000000000000000000000000000000000D -:1043B00000800000008000000080000000800000FD -:1043C00000000000000000000000000000000000ED -:1043D000000000410000000000000000000000009C -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:104410000000000000000000000088000000900084 -:10442000000000000000000000000000000000008C -:1044300000000020000000C000000020000000C0BC -:10444000000000000000000000000000000000006C -:1044500000000000008500020000000000000000D5 -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B0000000010000888800010085000088880055 -:1044C00001000000000000000000000000000000EB -:1044D00000000000C000000000008200000000009A -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:1045300000000000410000800000090041000080F0 -:104540000000090000000000000000000000000062 -:1045500000000000000000000000000080000000DB -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B0000000000000000011000000800000001159 -:1045C000000000800000000000000000000000006B -:1045D000000000000000000000000010000080004B -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:104630000000000000000000000100000040000039 -:104640000001000000400000000000000000000029 -:1046500000000000000000000000C0000800020090 -:1046600082000000000000000000000000000000C8 -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A00000000041000007000000000000000000C2 -:1046B00000000000000000000000000000000700F3 -:1046C000822100000000070082210000000000009D -:1046D000000000000000000000000000410000E0B9 -:1046E000000060000000000000000000000000006A -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000F0F0000000000000F0F000000000A9 -:104750000000000000000000000000000000FFFF5B -:10476000898100000000000000000000000000003F -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000F0F0000000000000F0F0000029 -:1047D00000000000000000000000000000000000D9 -:1047E000FFFF0901000000000000000000000000C1 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A00000000000000000000000000000000F0FEA -:1048B000FFFF0000000000000000000000000000FA -:1048C00000003C3C0000FFFF0000FFFF0000FFFF76 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000FFFFFFFF0000000000000000CC -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 -:104930000F0FFFFF0000000000000000000000005B -:10494000000000003C3C00000000000000000000EF -:104950000000000000000000000000000000000057 -:10496000000000000000666666F60000000000001F -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000300000000000000000000000000000C7 -:1049C00000000000000005002A00054000A80500C6 -:1049D0002A00054000A800000000000000000000C0 -:1049E000000000000000000000613006C00D000063 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C500000000000000000000000018000000004CF -:104C600000010000000000800004000000000000BF -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA00000000000000000000000000000004000C4 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000002000000000000E2 -:104CD00000000000000000000000000008020000CA -:104CE00000010000000000000004000100000000BE -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000001000020071 -:104D30000208100002000000000000000000000057 -:104D4000000000000000000000000000080000005B -:104D5000000000000400000000000000000000004F -:104D600000400000000000002000100020000000B3 -:104D7000000000000000040004000000000000002B -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000800083 -:104DB0000000000180000000000000000000000072 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000001000000000000800000008000C2 -:104DF0000000000000000000004000000000000073 -:104E0000000000000000000000000000000800009A -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000004000000032 -:104E40000000000000000000000000000000000062 -:104E50000000004000000000000000000000000012 -:104E60000800400020008200000020000000000038 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000400000000000A2 -:104ED00000000000000000000000000000000000D2 -:104EE0000000800000008000000000008000000042 -:104EF00000000000000000000000000000000000B2 -:104F00000000000000000010000000000000000091 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F300000000000004000080000014000040000E4 -:104F4000000400000000000000000000000000005D -:104F500000000000004000000000C1000040000010 -:104F60000000000000110000000400040000000028 -:104F70000000000400000000000000000000000429 -:104F800000000000000000000010004100000000D0 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000001000020000000D0 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000010000000004002000AC -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000100000000000000000000B0 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000004000000000000050 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:10505000040000000000000000000000002000002C -:10506000000000000000000000000100200000001F -:1050700000000000002020040004000000000000E8 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B0000000000000000000000000880000000068 -:1050C00000000000000000000000000000A0000040 -:1050D00000000000000000000000000000000001CF -:1050E0000000000800000000008400000884800028 -:1050F00000840000000000008001000100000000AA -:10510000000000000000000000900000000000000F -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:105170000000000200000004000400000002000023 -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E0000000000000000000000000000088000037 -:1051F00000000000000000000201000100000000AB -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000010000000000000000000000000000005D -:10525000000000000000000000000000000000004E -:1052600000009000000000A000000000000000000E -:1052700000A0100800900040000001002000000085 -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE -:1052C00000001100002100000000000000000000AC -:1052D00000000000000000000000000000000000CE -:1052E000000011008000000000000000000000002D -:1052F0000000008080000880000000001100800095 -:105300000800000000000000000000000000000095 -:10531000000000000000000000000000000000008D -:10532000000000000000000000000000000000007D -:10533000000000000000000000000000000000006D -:105340000000000000200000110400000000000028 -:10535000000000000000000000000000000000004D -:10536000000000000000008000000080000000003D -:105370000000000009800910118303C00003001021 -:1053800000000041000000000000000000000000DC -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED -:1053C00000000000000000010000010100000000DA -:1053D00000000000000000000000000000000000CD -:1053E00000000000000000000020000000C00000DD -:1053F00000000000000000A00001018501880000FD -:10540000000100000001000000000000000000009A -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000006C -:10544000000000000000000000002000000101003A -:10545000000000000000000000000000000000004C -:10546000000000000000000001000088880001002A -:105470000000000000000000080000009000900004 -:1054800000000000C000000000000000000000005C -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC -:1054C0000000000000000000000000008000000854 -:1054D00002000000000000000000000000000000CA -:1054E00000000000000000000000410000800000FB -:1054F0000900000000000000000080000000000023 -:10550000A100000003008000000021000300000053 -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B -:105540000000000000000000000000000004110046 -:10555000000000000000000000000000000000004B -:10556000000000000000000000000000001100002A -:10557000008000000000000000000000C1082100C1 -:10558000A100111100000020001100000000000027 -:10559000000000000000000000000000000000000B -:1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000001DA -:1055D00001000000000000000000000000000000CA -:1055E00000000000000000000000000000000001BA -:1055F0000000004000000000000000000000C100AA -:1056000020001100910000000000000100000000D7 -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A -:10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:10565000000000E00000000000000000000000006A -:10566000000000000000000000000000000000003A -:105670000000000007008221000000000000000080 -:105680008400004800000000000081000048000085 -:105690008281000000000000000000000000000007 -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F000000000000000F0F00000000000000000CA -:105700000000FFDF000000000000000000000000BB -:105710000000000000000000000000000000000089 -:105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000000000000F0F000000000000049 -:1057800000000000FFFF0300000000000000000018 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 -:1057F00000000000000000003C3C0000FFFF000033 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 -:10587000000000000000000000003C3C00000000B0 -:1058800000000000000000002000000000000000F8 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D0000000000000000000000000000006000CB6 -:1058E00000000000000000000000000000000000B8 -:1058F0000000000000000000000005002A00054034 -:1059000000A80000000000000000A0610007800D5A -:105910000000000000610007800D00000000000092 -:105920000000000000000000000000000000000077 -:105930000000000000000000000000000000000067 -:105940000000000000000000000000000000000057 -:105950000000000000000000000000000000FF0048 -:1059600000FF000000000000000000000000000038 -:105970000000000000000000000000000000000027 -:105980000000000000000000000000000400030010 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000000000000000C7 -:1059E000FF0000FF000000000000000000000000B9 -:1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 -:105A40000000000000000000000000000000000056 -:105A50000000000000000000000000000000000046 -:105A60000000FF0000FF0000000000000000000038 -:105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000001000000000000000000000005 -:105AA00000000000000000000000000000000000F6 -:105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000000000D6 -:105AD00000000000000000000000000000000000C6 -:105AE00000000000FF0000FF0000000000000000B8 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10000000000000000100000000000000000084 -:105B20000000000000000000000000000000000075 -:105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B50000000000000000000000000001000000035 -:105B60000000000000000000000000000000000035 -:105B70000000000400000000000000000000000021 -:105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 -:105BB00000000000000000080000000000000000DD -:105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE00000000000000000000000000400000000B1 -:105BF0000000410000000000000000022000000042 -:105C00000000000000000000000000000000000094 -:105C10000000000000001000000000004000000034 -:105C20000000100000000000000000000000000064 -:105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 -:105C600000000000000000400000020000000000F2 -:105C70000000000000000000000000000000020022 -:105C800000000200000002000040000000000000D0 -:105C9000020000000000000084000000000000007E -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000002000041 -:105D60000000000000000000000000000000000033 -:105D7000000000000000900000009000840000007F -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 -:105DB0000000000000000000000082000000000061 -:105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000009000000000079 -:105E20001000000000000000000000000000000062 -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000000000000032 -:105E700000000000004000400000000000000000A2 -:105E800000000000000000000800000000400000CA -:105E900000000040000000000011000000000000B1 -:105EA00000000000000000000000000000001000E2 -:105EB00000000000000000000000000000000000E2 -:105EC00000000000000000000000000000000000D2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 -:105EF0000000000000000000000000000040000062 -:105F00000000000000000000000000000000000091 -:105F1000000000000000000000000300020002007A -:105F200000000000004000000000000000400000F1 -:105F300000000088000000000000000000002000B9 -:105F400000000000000000000000000000C0000091 -:105F50000000000000000000000000000000000041 -:105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 -:105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF000000000000000000000020000008400001B -:106000000000000000000000000000000000000090 -:1060100000000000000000000000000000840000FC -:10602000000000000000050010000000000000005B -:10603000000000000000050000000000000000005B -:106040000000000009000000000000000000000047 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 -:10608000000000000000000200000000000000000E -:106090000000000000000000000000000000000000 -:1060A00000000000000000020000000000000000EE -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F0000000000000000000000020000000000080 -:106100002000004000000200050000000000000424 -:10611000000000000000000000000010000000006F -:10612000000000040000000000002000000000004B -:10613000054000000000000000000000000000001A -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000000000000EF -:1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E -:10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D -:10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:10635000000000000000000000000000000000003D -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C -:10641000000000000000000000000000000000007C -:10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC -:1064C00000000000000000000000000000000000CC -:1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B -:10652000000000000000000000000000000000006B -:10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB -:1065B00000000000000000000000000000000000DB -:1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A -:10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 -:106730000000000000000000000000000000000059 -:106740000000000000000000000000000000000049 -:106750000000000000000000000000000000000039 -:106760000000000000000000000000000000000029 -:106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 -:1067900000000000000000000000000000000000F9 -:1067A00000000000000000000000000000000000E9 -:1067B00000000000000000000000000000000000D9 -:1067C00000000000000000000000000000000000C9 -:1067D00000000000000000000000000000000000B9 -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 -:106830000000000000000000000000000000000058 -:106840000000000000000000000000000000000048 -:106850000000000000000000000000000000000038 -:106860000000000000000000000000000000000028 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B00000000000000000000000000000000000D8 -:1068C00000000000000000000000000000000000C8 -:1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000000000000000000000000000057 -:106940000000000000000000000000000000000047 -:106950000000000000000000000000000000000037 -:106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 -:106980000000000000000000000000000000000007 -:1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 -:1069B00000000000000000000000000000000000D7 -:1069C00000000000000000000000000000000000C7 -:1069D00000000000000000000000000000000000B7 -:1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000000086 -:106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 -:106A40000000000000000000000000000000000046 -:106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 -:106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000000000000000000C6 -:106AD00000000000000000000000000000000000B6 -:106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 -:106B00000000000000000000000000000000000085 -:106B10000000000000000000000000000000000075 -:106B20000000000000800000000000800080008065 -:106B300004800000000000000000000000000000D1 -:106B40000000000000000000000000000000000045 -:106B500020000080844182008200000300000000C9 -:106B60000000000000000000000000000000000025 -:106B70000000000000002000000020800000000055 -:106B8000000000000000000088000000000000007D -:106B900000000000000020000000200000000000B5 -:106BA00000000000000200080000000200080008C9 -:106BB0000008800800000000000000000000000045 -:106BC00000000000000000000000000000000000C5 -:106BD0000000000000400000000000000000000075 -:106BE00000000000000000000000000000000000A5 -:106BF0000000000200000000000000000040000053 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 -:106C200000000440000082000041020082000100D8 -:106C30000000000001000040000010000000000003 -:106C4000020000000200000801000808000800001F -:106C5000100010000000000084000221024100002A -:106C600000000000000000000040000000000000E4 -:106C7000000000000000000002000200000002000E -:106C80000000000002000200000000000000000000 -:106C900000000000000000000000000000000000F4 -:106CA0000000000000000000000011008000000053 -:106CB00010000000000010000001000000000000B3 -:106CC00000000000000000000001100000010201AF -:106CD00000008000800000000000000000C00000F4 -:106CE00000000000000000000200000000000000A2 -:106CF0000000000000000000000000000000000094 -:106D00000000000000000000400000000000000043 -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 -:106D300001000000000090000000000000000000C2 -:106D40000000400000000000000000000000000003 -:106D50000000000000000000010000008800A0000A -:106D60000000000000000000A00000000000000083 -:106D70000000000000000000000000000000000013 -:106D800000000000000000000000000000050000FE -:106D900000000000000000000000000000000000F3 -:106DA00000000000000000000000000000000000E3 -:106DB000110004002000002000000000000000007E -:106DC00000000000000000000000000000000000C3 -:106DD0000000000010000000000020000000000083 -:106DE0000000210000000000000000000000000082 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E3000000000800000000800080008004000403A -:106E400000000000010000000000000000008400BD -:106E500000008400010000080000008001C0000064 -:106E6000000084000000000000000000000400009A -:106E70000000000082000000000000000000000090 -:106E800000000000080000000000000000000000FA -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000002000000001000100010000AF -:106EC00000000000000004000000000000000000BE -:106ED0000000000000002000000100000020020867 -:106EE00000400040000000C0000000400000020020 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F200000000000000000000000000000009000D1 -:106F300000000400040090000400000000000000B5 -:106F40000000000000000020200000000000000001 -:106F5000000000000200900000000040000000005F -:106F6000842000410000000000000000000000003C -:106F700000000000900000008200000000000000FF -:106F800004000800000000000000000000000000F5 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000800080000000800000000090C1 -:106FC0000000008800000000000100000000000038 -:106FD00000000000000000000000000000011000A0 -:106FE00000000001000000000000000000000000A0 -:106FF0000000000000000000000000000000000091 -:1070000041008000000000000000000000000000BF -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000C08000000000000010 -:1070400000000009008000000000000000000000B7 -:107050000000000000000000000000000000000030 -:1070600000001000100000000000A009000900004E -:107070000000000000000000000000000000000010 -:1070800000000000000004000000000000000000FC -:1070900000000000000000000000000000000000F0 -:1070A00000400000000000000000000000000000A0 -:1070B00000000000000000000000000800000000C8 -:1070C00000000000020005080000000000000000B1 -:1070D00000000000410000000082000000000000ED -:1070E000004002000200000000000000000000005C -:1070F0000000000000000000000000000000000090 -:1071000000000000000000008000000000000300FC -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:107130000000000000000000000001009020A000FE -:107140000000010100008400000100009000000028 -:1071500000C000000000000000000100000000006E -:1071600000000100900400000000411082880082AD -:10717000C008000000000000000000000000000047 -:1071800000000000000000000000000090048402E5 -:1071900000840082000000000000000000000000E9 -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000009008080C6 -:1071C00000000000114100210000000811008000B3 -:1071D000000000000000000000000000110000217D -:1071E00000000000110080210000000002000000EB -:1071F000000080000000000000000000000000000F -:1072000000000000000000000000000000008000FE -:10721000008000000080000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000008000000000418005000811C10000001E -:10725000008000000080000000000000000000042A -:107260000000111100000004008011110000000056 -:1072700080400000008000030000000000000000CB -:10728000000000000000000000000000000000807E -:107290000009000000800000000000000000000065 -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000002000000A0000200000101910087 -:1072D00000000020000000C00000000000000000CE -:1072E0000001000001000000000100020100008810 -:1072F00020002083829084820000000000000000B3 -:10730000000000000000000000000000000000007D -:1073100000020001008200A0000000000000000048 -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000001010089080101010001010088011C -:107350000101010000888800010000000000000019 -:1073600000000000C000000100000100C088900083 -:10737000000090100002848284840000000000005D -:1073800000000000000000000000000000000000FD -:1073900008000000029000004090C00000000000C3 -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000411000898005114100104003B9 -:1073D0000305114141000080000009000000000089 -:1073E00000000000000000000008030041000080D1 -:1073F00000090900000000800000000000000000FB -:10740000000000000000000000000000000000007C -:10741000000000000000000000000080800000006C -:10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:1074400000000000000000110004008080004104E2 -:107450001011410003000011000000800000000036 -:1074600000000000000000001100000000000011FA -:10747000110000800000000000000000000000007B -:1074800000000000000000000000000000000000FC -:107490000004002100000000001000000000800037 -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000001000000408800F3 -:1074D00001A10101000801000001000000400000BE -:1074E000000000000000000000000100000000009B -:1074F0000001010000400000840040088220840058 -:10750000000000000000000000000000000000007B -:10751000000000010000000000000401840084005D -:107520000400000000000000000000000000000057 -:10753000000000000000000000000000000000004B -:1075400000000000000000000000410000E04200D8 -:107550008200602100E0070000000000000007003A -:1075600082210000000000000000000000E0000098 -:107570000000000000E007008200000000000000A2 -:107580000082000000000000000000000000000079 -:1075900000000000000600000700000081210048F4 -:1075A0004200000600000000000000000000000093 -:1075B00000000000000000000000000000000000CB -:1075C0000000000000000000000000003C3C000043 -:1075D000F0F00000000000000000000000000000CB -:1075E000F0F00000000000000000000000000000BB -:1075F0000000000000000000F0F00000DC1CD010D3 -:10760000C355000F00000000000000000000000053 -:10761000000000000000000000000000000000303A -:10762000A0B028EB28EB00000000000000000000E4 -:10763000000000000000000000000000000000004A -:1076400000000000000000000000000000003C3CC2 -:107650000000F0F00000000000000000000000004A -:107660000000F0F00000000000000000000000003A -:1076700000000000000000000000F0F00000DF1F2C -:10768000D313C355FF0F00000000000000000000EE -:1076900000000000000000000000000000000000EA -:1076A0000030A0B028EB28EB000000000000000034 -:1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D0000000FF000000FFFF00000000FFFFFFFFB1 -:1076E00000003C3C0000FFFF000000000000000024 -:1076F00000000000000000000000FF000000FFFF8D -:10770000010B515B00F0C3AA000000000000000064 -:107710000000000000000000000000000000000069 -:1077200000000F0F0D01000000000000000000002D -:107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 -:1077500000000000FF000000000000000000FFFF2C -:10776000000000003C3C00000000000000000000A1 -:10777000000000000000000000000000FF0000000A -:107780000000A1ABF1FBFFF0C3AA00000000000065 -:1077900000000000000000000000000000000000E9 -:1077A000000000000C000D010000000000000000BF -:1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 -:1077D0000000000015612A0EC54800A80000003016 -:1077E000C000000005002A00054000A800000000BD -:1077F0000000000000000006000C000005002A0642 -:10780000054C00A80000000000C0000000000000BF -:107810000000000000000000000000000000000068 -:107820000038050000A000653026801D0000000023 -:107830000000000000000000000000000000000048 -:107840000000000000000000000000000000000038 -:107850000000000000000000000000FF3A3A5F0A4C -:107860003C3C00FF3A3A000000000000000000002D -:107870000000000000000000FF0000FF000000000A -:10788000FF0000FF000000000000000000000000FA -:1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000FF3A3A35 -:1078E0005F0A3C3C00FF3A3A000000000000000044 -:1078F00000000000000000000000FF0000FF00008A -:107900000000FF0000FF0000000000000000000079 -:107910000000000000000000000000000000000067 -:107920000000000000000000000000000000000057 -:107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 -:107950000000000000000000000000000000000027 -:1079600000003C3CFF003C3C0FFF0000000000001A -:10797000000000000000000000000000FF0000FF09 -:1079800000000000FF0000FF0000000000000000F9 -:1079900000000000000000000000000000000000E7 -:1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C00000000000000000000000000000000000B7 -:1079D00000000000000000000000000000000000A7 -:1079E000000000005555FF003C3C00F00000000086 -:1079F0000000000000000000000000000000FF0088 -:107A000000FF00000000FF0000FF00000000000079 -:107A10000000000000000000000000000000000066 -:107A20000000000000000000000000000000000056 -:107A30000000000000000000000000000000000046 -:107A40000000000000000000000000000000000036 -:107A50000000000000000000000000000000000026 -:107A600000008200408000000000000000800080D4 -:107A700000800020008000800080828000200000C4 -:107A80000000200000000000028001000200000051 -:107A900000000000000000010000000000000000E5 -:107AA00000000000200000000000000000000000B6 -:107AB00000000000000000000000000000000000C6 -:107AC0000000000020000000000000000000000096 -:107AD000000000008800000000000000000000001E -:107AE0000000000000000020000000000000002056 -:107AF0000020002000910020002000200020000134 -:107B000000004100000040000000000804000000E8 -:107B10000000000000000000000000000000000065 -:107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 -:107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 -:107B600000001000020800C1100000000000020028 -:107B700000000010020000000200000000000000F1 -:107B800000000200000000000000000000001000E3 -:107B900000080000000000000000000000000000DD -:107BA00000000000000000000000000000000000D5 -:107BB00000000000000000000000020000000000C3 -:107BC00000000000000000000000020000000000B3 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000080000001000883400000000841 -:107BF0000000000000000000000000000000000085 -:107C000000000000000000000000000000001188DB -:107C100080000001000000000000000000000000E3 -:107C20000000000000004000000000000000000014 -:107C30000000000000000000000000000000000044 -:107C40000000000000000000000000000004000030 -:107C50000000000000000000000000000000000024 -:107C60000000000000000000000000000100000013 -:107C700000000000000000000009000000000008F3 -:107C80000000008000000000000000000000000074 -:107C900000000000000000000000000000000000E4 -:107CA0000000000000000000000000000000004094 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD00000000000000000000000000000000000A4 -:107CE0000000000000000000000000000000200074 -:107CF0000000000000000020000000000000000064 -:107D00000901000040040000000000000000030022 -:107D1000100000001100210000000000000000041D -:107D200000000082000000000000000000000000D1 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 -:107D50000000000000000000000000000000000023 -:107D600000000000000000000000000000000040D3 -:107D700008040040000800000000000000000000AF -:107D800082000000000000000080000000000000F1 -:107D900000410041004000000140000000000000E0 -:107DA0000000000000000000000000000000004093 -:107DB00000020000000000000000000000000000C1 -:107DC00000000000000000000000000000000000B3 -:107DD0001000000000000000000000000000000093 -:107DE0000000000000000000000000000040000053 -:107DF0000004000000900088000000000000000067 -:107E000000000000000000002000000400000082CC -:107E100000000000118800000000200000000000A9 -:107E2000000000000000100000000800000000003A -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 -:107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 -:107E700000110000010000A10102208001000000AB -:107E80000009000090000000000000001000000049 -:107E90000000000000000008000000000000004199 -:107EA00000000000000000000000000000000000D2 -:107EB000000000000000000800000000000040007A -:107EC00000000000000001000000000000000000B1 -:107ED00000000000000000000000000000000000A2 -:107EE00000000000000000000000000000C00000D2 -:107EF000000000000088040000200400002004208E -:107F0000000000000000008400000000000080006D -:107F10000000000000C00084000121000000008477 -:107F200010000900000404A0000000880000000008 -:107F30000000000000000000000000000000000041 -:107F40000000100000000000200000000000000001 -:107F50000000000000000000000000000000000021 -:107F60000000000000000000000000000000000011 -:107F700000000000000000000000000000000009F8 -:107F800000000000000000000000000001000000F0 -:107F9000000200008804000008000000000000004B -:107FA00000020000000000000002000000000000CD -:107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 -:107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000000091 -:107FF000008200000000000020900040000000000F -:108000000500050000000000000005000000200041 -:10801000000000000000000008000000000011C087 -:10802000020000000000000000000000000000004E -:108030000000000000000000000008000000000038 -:108040000800000008000000000000000000000020 -:108050000000000000000000000008000000000018 -:108060000000000000000000000000000000000010 -:10807000000000000000010090000000000000C0AF -:1080800000900000000000C000900000000001C04F -:10809000009000000000000000000000000001004F -:1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000000000000000000090 -:1080F000000000000000000011000021000000004E -:10810000008000800000000000800080000000006F -:10811000118021800000000000000000000000002D -:10812000110000210000000000000000000000001D -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000000F -:1081700000000000000000000000000800001103E3 -:10818000800000008000001080800000800000005F -:10819000808000088900000380800000000000004B -:1081A000000000040000114000000000000000007A -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000100007E -:1082000001019000000082000000C0900000820088 -:108210000000C090000183000000C090000000003A -:10822000000000000001000001010000000000004B -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE -:1082800010001000010000000000109000C000006D -:108290000000009000C00000A000209000C000007E -:1082A000020000000000000010200091000000000B -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E -:1082E000000000000000000000000000000000008E -:1082F000000000000000000000000000000000007E -:1083000000008000800908000000000080800080DC -:10831000000000000080008000000000008041801C -:1083200000008000000000000000800000880400C1 -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D -:1083700000000000000000000000000000000000FD -:108380000000000011020000000080118041000088 -:1083900000008011800800000000801189080000A2 -:1083A00000000000000000000000000011000000BC -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D -:1083E000000000000000000000000000000000008D -:1083F000000000000000000000000000000000007D -:10840000000000000000010000000000C00120008A -:1084100000000000C001200100000000C001200198 -:10842000000000000000000000000000000001004B -:10843000000000000000000000000000000000003C -:10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C -:10846000000000000000000000000000000000000C -:1084700000000000000000000000000000000000FC -:10848000000000000000002100E0070000000011D3 -:1084900000000700000000060000070000000021A7 -:1084A00000E0070000000000000000000000008263 -:1084B00000E00700000000000000000000000000D5 -:1084C00000000000000000000000000000000000AC -:1084D0000000000000000000500000080000000044 -:1084E000000000000000000000000000000000008C -:1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B -:10851000FF000000FF000000FF000000FF0000005F -:10852000FF000000FF00000000000000000000004D -:1085300000000000FFF0FFF000000000000000005D -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000000FB -:1085800000000000000000000000000000000000EB -:108590000000FF000000FF000000FF000000FF00DF -:1085A0000000FF000000FF000000000000000000CD -:1085B000000000000000FFF0FFF0000000000000DD -:1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B -:10860000000000000000000000000000000000006A -:10861000000000000000000000000000000000005A -:10862000000000000000000000000000000000004A -:10863000000000000000000000000000000000003A -:10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A -:1086700000000000000000000000000000000000FA -:1086800000000000000000000000000000000000EA -:1086900000000000FFFF000000FF00000F0F0000BF -:1086A00000FF00000F0F000000FF00000F0F000090 -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A -:1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000000069 -:10871000000000000000FFFF000000FF00000F0F3E -:10872000000000FF00000F0F000000FF00000F0F0F -:108730000000000000000000000000000000000039 -:108740000000000000000000000000000000000029 -:108750000000000000000000000000000000000019 -:108760000000000000000000000000000000000009 -:1087700000000000000000000000000000000000F9 -:1087800000000000000000000000000000000000E9 -:1087900000000000003E000C10C0038203380C00F3 -:1087A00092C0038203380C0092C003C2033E0C0C3B -:1087B0008AC0000000000000000000000036000C2D -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000610086A00D000000000000F5 -:1087F0000000000000000000000000000000000079 -:108800000000000000000000000000000000000068 -:10881000000000000000FF0000FF0000000000005A -:108820000000000000000000000000000000FF0049 -:10883000FFFF000000000000000000000000FF003B -:1088400000FF000000000000000000000000000029 -:108850000000000000000000000000000000000018 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000000000E8 -:108890000000000000000000FF0000FF00000000DA -:1088A00000000000000000000000000000000000C8 -:1088B000FF000000000000000000000000000000B9 -:1088C000FF0000FF000000000000000000000000AA -:1088D0000000000000000000000000000000000098 -:1088E0000000000000000000000000000000000088 -:1088F0000000000000000000000000000000000078 -:108900000000000000000000000000000000000067 -:1089100000000000000000000000FF0000FF000059 -:108920000000000000000000000000000000000047 -:1089300000000000F0F00000000000000000000057 -:108940000000FF0000FF0000000000000000000029 -:108950000000000000000000000000000000000017 -:108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000000F7 -:1089800000000000000000000000000000000000E7 -:10899000000000000000000000000000FF0000FFD9 -:1089A00000000000000000000000000000000000C7 -:1089B000000000000000F0F00000000000000000D7 -:1089C00000000000FF0000FF0000000000000000A9 -:1089D0000000000000000000000000000000000097 -:1089E0000000000000000000000000000000000087 -:1089F0000000000000000000000000000000000077 -:108A00000000000000000000000000000000000066 -:108A10000000000000000000000000002000000036 -:108A200000000000000000000000000090000000B6 -:108A30000000008001000100200041002000000033 -:108A40000000000000000000000082008410000010 -:108A500000000400000100000000000040000000D1 -:108A6000000000000000020002000000000088007A -:108A700000000000200000000000C000000088008E -:108A80000000000000002000200000000000200086 -:108A900000000000200000000000000000000000B6 -:108AA00000000000000000000000000000000000C6 -:108AB00000000000000420002000A10020020000AF -:108AC00000000000000000000000000000000000A6 -:108AD0000000000000000000000000200000000076 -:108AE0000000000000000000000000000000200066 -:108AF0000000000000000000000000000000000076 -:108B00000000000000000000000000000000040061 -:108B10000000000000000000000000000000000055 -:108B2000020002000000020000000000000000003F -:108B30000000040000000000000000000000000031 -:108B400000090000001000100000000000000000FC -:108B500000000000000000000000000000000040D5 -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B800000000000000000000000000000000000E5 -:108B900000000000000000000000000000000000D5 -:108BA0000000008800000008000000C000C000C0F5 -:108BB000000800100000001000100000000000007D -:108BC00000000000000000A0000002000000000003 -:108BD00000C00000040000000020000000000000B1 -:108BE0000000200000000000050000000000000060 -:108BF0000000000000000000000000000000000075 -:108C00000000200000000000000000000000000044 -:108C10000000002000000000000000000000000034 -:108C20000041000000000000010001000000000001 -:108C3000000041000000000000000000880000006B -:108C40000000000000000000000000000000000024 -:108C50000000000000000000C000900000000000C4 -:108C60000000000000000000000000000000000004 -:108C700000000000C0000000000000000000000034 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000200004000000A0 -:108CB000000000000400000000200400000000008C -:108CC000090000000000000010000000000000008B -:108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 -:108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000000000053 -:108D200000410000000000008811000000C08840E1 -:108D300000000000000000048200000000000000AD -:108D400000040000000400040040000000000000D7 -:108D500000090009000000004000000000000000C1 -:108D60000000000000400004004008000000000077 -:108D7000000000000000900000000800000000005B -:108D8000000000000000000000008400000000005F -:108D900000000000000000000000000000000000D3 -:108DA00000000000000000000000000000000020A3 -:108DB0000091000400000000000100040000008297 -:108DC000030804010000000104010000000000008D -:108DD00000001188000000000000000200000000F8 -:108DE000002000000000000005001000030000004B -:108DF0000000000000000000000000000000000073 -:108E00000000000000000000050008000300410011 -:108E10000000000000000000000000000000000052 -:108E200000000000000000009000000001000100B0 -:108E30000000040400000000C01100000000000059 -:108E400004000000000000412000000000000000BD -:108E5000000000000000000000008400000000008E -:108E600000000000000000000000000000001000F2 -:108E700000000000000000000000000000000000F2 -:108E80000000000000000000000082000000000060 -:108E90000000000000000000000000000000820050 -:108EA000000000000000008400000000000010101E -:108EB000200000000091000000000000000000847D -:108EC0000000800400C000000000800405000000D5 -:108ED0000000000000000000000000020084080004 -:108EE000000000000000000000000004000000007E -:108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 -:108F300000400000000001000000000900090000DE -:108F4000000000000009000000090100000000000E -:108F50000000000000000000000000000000000011 -:108F600000000000000000020000000000000000FF -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F900000000000000000000000000000000000D1 -:108FA000000000000000000000000082000000003F -:108FB000000009C100880008100002000004200021 -:108FC0000008000000000000000000002000000079 -:108FD00000000300008800020000200011000900CA -:108FE000000400000000000000000000000000007D -:108FF0000000000040000088000200001140020054 -:10900000110004080000000000000800000000003B -:1090100000000000050000880000000008000800B3 -:109020000000002000000000000008000000000018 -:109030000000000001009000000000880000000017 -:1090400000000000010090008400000001002000EA -:109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B0000000000000001100A100000000000000FE -:1090C0000000000000000900A10080000000110065 -:1090D0008000080000000000000000000000000008 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:109130000000000000000000004009800010000056 -:10914000000000000000000080001180000011807D -:10915000001000800041000000000000000000003E -:1091600000000000000000000000000000000000FF -:1091700000010000000000000000000000000000EE -:1091800000000000000000000000000000000000DF -:1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000101020001AA -:1091C00000880000000000000084880001C000004A -:1091D000014000010002000100000000000000004A -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000010008889D -:1092400008000000000000000000000190018801FB -:10925000C08501010000C000000000000000000007 -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B000000000000000000000000000000041006D -:1092C00080808000110000000000000900082110CB -:1092D000800380A10911000080000000210003002C -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:109340000011040000800000000800000000000080 -:109350000091002100000003001000110000000037 -:1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD -:1093C000000000010000004000000001000000005B -:1093D0000000002100000000000100010001000069 -:1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C -:10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C -:1094400000000000000000E007008200008100E052 -:1094500007000000600600484200811181000048BA -:1094600000008281000000000000000000000000F9 -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC -:1094C00000000000000000000000F0F000000000BC -:1094D0000000000000000000000000FF000000008D -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000000000003B -:10953000000000000000000000000000000000002B -:10954000000000000000000000000000F0F000003B -:1095500000000000000000000000000000FF00000C -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB -:1095C0000000000000000000000000003C3C000023 -:1095D000FFFF00000000000000000000FFFF00008F -:1095E0003C3C000000000000000000000000000003 -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A -:10963000000000000000000000000000000000002A -:1096400000000000000000000000000000003C3CA2 -:10965000000000000000000000000000000000000A -:1096600000003C3C00000000000000000000000082 -:1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA -:1096C0000000000000000000000000000000054055 -:1096D0002A06054C00A800610026000921A00561AA -:1096E0002A36C54900A800610007800D000000006F -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000FF00FFFF00000000000000FFFFFF0F -:10976000000000000004FFFF0000000000000000F7 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000000000000B9 -:1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 -:1097D00000000000FF00000000000000000000FF8B -:1097E000FFFF000000000000FFFF0000000000007D -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 -:109850000000000000000000F0F000000000000028 -:1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000000000098 -:1098D00000000000000000000000F0F000000000A8 -:1098E0000000000000000000000000000A0A000064 -:1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 -:109940000000000000000000000000000000000017 -:10995000000000000000000000000000000088007F -:1099600000000000000000000000000000000000F7 -:1099700000008800880002000000000000000000D5 -:109980000200820000000000020000008800880041 -:109990000003880004002000200088008800820066 -:1099A0000000C000000000000000000000000000F7 -:1099B00020022000200020002000000020002000C5 -:1099C0000000200000000000000000000000000077 -:1099D0002002000000000000000000000000000065 -:1099E0000000000000000000000000000000004037 -:1099F00010004000000000000000400000000000D7 -:109A00000000020000000000000202000000000050 -:109A10000000000000020000000000004100000003 -:109A20000000000000000000000000000000000036 -:109A30001000000000000000000000000000000016 -:109A400000000000000000000000000040020000D4 -:109A500000000000000000000000900090000200E4 -:109A600000008200000082000000000000000000F2 -:109A700000000205000000000000000000000000DF -:109A80000000000000000000000090000000000046 -:109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000000B6 -:109AB0000000000010000000000000000000000096 -:109AC0000000000000000000000000000000000096 -:109AD0000000000010000000000000000000000076 -:109AE000000000000000000000000000000000086E -:109AF00000000008002000840000008400000088AE -:109B0000000000000000000000C0000000880040CD -:109B100000000084000000000000000000000000C1 -:109B20000000000000000000000000000000000035 -:109B300000000000000080000000000000000000A5 -:109B40000000000000000000000000000000000015 -:109B500000000000000080000008002100210041FA -:109B600000080000000000090000002100030000C0 -:109B7000000000000000908900210021C0030010B7 -:109B80000041000000000005002100050021000048 -:109B90000000000000002000000004050000000597 -:109BA00000000000000500050000000000000000AB -:109BB000C0000000000000000000000000000000E5 -:109BC0000000000000000000000000000000000095 -:109BD0000000000000000000000000000000000085 -:109BE0000000000000000000000000000000000075 -:109BF0000000000000000000080800000000000055 -:109C0000000000000000000008000000000000004C -:109C100000000000000003028000000000000000BF -:109C20000000000000000000000000000000000034 -:109C30000000000000000000080000000300000019 -:109C40000000000000000000000000000000000014 -:109C50000000000000000000000000000000000004 -:109C60000000000000000011200500000000900925 -:109C700088000000000000008200040000090000CD -:109C8000000340000000A00082004011A005000079 -:109C90000000820440008200840084000000000074 -:109CA0000400000082000000A00082058200080974 -:109CB0000811900082000000820082008204A0004F -:109CC0008200820082000000820082008200A000E8 -:109CD0008200820082000000820082008204000074 -:109CE000000000080000000000000004000000C0A8 -:109CF00000080000008400000000000000000000D8 -:109D0000000000A000000000000000000300204050 -:109D10000000000000000000000000000000000043 -:109D2000000000000000000005000004000000002A -:109D30000000000000000000000000000000000122 -:109D40000000000000000000000000000000000013 -:109D500003004000000000000000000000000001BF -:109D600000000000000000000000000000000000F3 -:109D7000000000000003000800080005000020218A -:109D800000008200000000000000A00500000000AC -:109D90000000000000000000000000000000008043 -:109DA0000000820000000000A0008400820000008B -:109DB00000000000000000000000000000000000A3 -:109DC0000000080000000000A000000008000000E3 -:109DD000000000000000000000000000000800007B -:109DE00000000000000000C0000000102100000082 -:109DF0000090000400042100110000000000000099 -:109E0000850040000000000021000000000000006C -:109E10000000000000000000000000000000000042 -:109E2000000800000000000000000000000000002A -:109E30000000000000000000000000000000000022 -:109E40000000000000000000000000000000000012 -:109E50000000000000000000000000000000000002 -:109E60000000000000058800000000000003000062 -:109E70009000000000000009001100050021000012 -:109E800000088405000002408200024040000000FB -:109E90000000200000000004000000040040002139 -:109EA0000021820000000000080008000800820570 -:109EB0000000200400000009001100090000082033 -:109EC000000000000800000008000800080008006A -:109ED000A0000800000000000000000000000000DA -:109EE000000000000800000000000000000000006A -:109EF0000000000000002000000000001100000031 -:109F00000000000000000000000000000000000051 -:109F1000210000002100119000000000000000025C -:109F20000000000000000000000000000000000031 -:109F30000000000000000000000000002100000000 -:109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000000001 -:109F6000000000000000000000010001000100C02E -:109F70000001000100C00185000100010002000293 -:109F80000001000100C1000000010001000100C14A -:109F90000001000100C001410001850100820004B0 -:109FA0000001000100C000000000000100010001EC -:109FB00000C00001000100C0018301000101008414 -:109FC00000080001000100C00000000100010001C4 -:109FD00000C00001000100C00183010041010082B6 -:109FE00000100001000100C00000004100410041DC -:109FF00000840041004100894041000811410000F7 -:10A000000000004100410088000000410041004183 -:10A01000008203410041008540410020034100804F -:10A0200000800041004100A000000000004100410C -:10A03000004100C0004100410085404120412041D5 -:10A04000008000000041004100C0000000410041CC -:10A05000004100C000410041008510412041024103 -:10A06000008000800041004100C00000410003006A -:10A070000000008041008900000009008200020009 -:10A08000009184004100C1000080000041000300F5 -:10A09000000000804100A1000000050084000200D3 -:10A0A0000080A0004100C10000000000000341004A -:10A0B0000300000000804100850000000500A000B2 -:10A0C000210000108800C100C100002000004100F4 -:10A0D0000300000000804100C000000005001000E7 -:10A0E000A1000010A000C100C1000020000001007C -:10A0F0000100000000C00100C0000000000040009E -:10A1000084C00008C0000500C10000C08800010034 -:10A110000100000000C00100C000000000000900B4 -:10A12000A0C00008C1840500C1000020200000007C -:10A1300001000100000000C00100C000000000009C -:10A14000080040C000A1C1A04100C1000041400082 -:10A1500001000100000000C00100C000000000007C -:10A16000410004C00041C0004100C1000041400066 -:10A1700000C00001C0C100000000000100C0A0112B -:10A180000009000100C10000000000010001000002 -:10A1900000C00001C0C100000000000100C0A10318 -:10A1A0000089000100C10000000000010000000063 -:10A1B000000000C00001C0C100000000000100C09C -:10A1C00020030005000100C10000000000010000A4 -:10A1D000000000C00001C0C100000000000100C07C -:10A1E00020030005000100C1010000000001000083 -:10A1F00000000080004180C100000000004100C15B -:10A20000008800C1004100C10000000000410008BA -:10A2100000000080004180C100000000004100C13A -:10A2200002880041004100C1000000000041002000 -:10A23000000000000080004180C1000000000041DB -:10A24000008300A000C1004100C1000000000041E7 -:10A25000004000000080004180C10000000000417B -:10A26000008300A000C1004100C1200000000041A7 -:10A2700000400000C100800080C1000041040000D7 -:10A2800004004100C14100008010000041000000B6 -:10A2900080004100C100800080C100004102804078 -:10A2A00003004100C1418000800200004100000025 -:10A2B000800041000000C100800080C1000041001A -:10A2C000800002004100C141000080050000410003 -:10A2D000000080004100C100800080C100004100FA -:10A2E000800002004100C141800080050000410063 -:10A2F000000080004100C1004000C0C1000001001A -:10A30000C000C1000100C1110200C0000000010036 -:10A310000000C0000100C1004000C0C100000101F8 -:10A320008200C1000100C1050800C000000001005A -:10A330000000C00001000000C1004000C0C10000DA -:10A3400001000200C1000100C183C000C000000084 -:10A3500001000000C0000100C1004000C0C10000B9 -:10A3600001000200C1000100C1838200C0000000A2 -:10A3700001000000C00001000000000000000042D9 -:10A3800000000000000000008112004807004800A3 -:10A3900000000000000000820000000000000042F9 -:10A3A0000000000000000000811200480700480083 -:10A3B000000000000000000000000000000000009D -:10A3C0000042000000000000000081120048070069 -:10A3D0004800000000000000000000000000000035 -:10A3E0000042000000000000000081120048070049 -:10A3F0004800000000000000000000000000000015 -:10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC -:10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000000000000000006C -:10A4F0000000000000000000000000000000757B6C -:10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000DEAE757BBF -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000DEAE00008F -:10A54000757B00000000000000000000000000001B -:10A550000000000000000000000000000000DEAE6F -:10A56000757B0000000000000000000000000000FB -:10A570000000000000000000000000000000DEAE4F -:10A5800060C603000000000000000031E000000091 -:10A59000000000000C0000000000000000C0630686 -:10A5A00060C603000000000000000031E000000071 -:10A5B000000000000C0000000000000000C0630666 -:10A5C000000060C603000000000000000031E00051 -:10A5D0000000000000000C0000000000000000C0AF -:10A5E000630660C603000000000000000031E000C8 -:10A5F0000000000000000C0000000000000000C08F -:10A60000630600000000000000008200000000005F -:10A610000000000000000000210000000000000019 -:10A62000000000000000A00000002000000000006A -:10A630000000000082000000200000000000000078 -:10A64000000000030000000000000000880000007F -:10A650000000000000002000000020008800000032 -:10A6600000000000000000000000000000000000EA -:10A670008800000000002000000020000000000012 -:10A6800000000000000000000000000000020000C8 -:10A690000000000200000002000020000000410055 -:10A6A00000000000000000000000000000000000AA -:10A6B0000000000000000000000005004000000055 -:10A6C000000000000000000000000000000000008A -:10A6D0000000000000000000000000020000000078 -:10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000020003A -:10A700000500000000000000000090400000020072 -:10A71000020000400040000000001000000008009F -:10A7200000000800208000000200000000009041AE -:10A730000000000000008200020000000000840011 -:10A740000200000002000000000000000000000005 -:10A7500000000000000000000000000000000000F9 -:10A760000000020000000040000000000040020065 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A79000808480880001008900000008000000001B -:10A7A0000010000000008004000000000000020013 -:10A7B0000088000000000000000000C0021000003F -:10A7C00000A00000000000000000040000000000E5 -:10A7D0000000000004000000000000000000000075 -:10A7E0000000004000000000000000000000000029 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000004107 -:10A8100000000000004100000000000000000000F7 -:10A820002100000800000000C00000000000A0009F -:10A83000A000000000000000000000000000000078 -:10A840000000000000000000000000000100000007 -:10A8500008000000000000000000000000000000F0 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A000000084000010000000C000000000000054 -:10A8B0000000000000000000000000000000000098 -:10A8C000410021000000000000000000000008001E -:10A8D00000000088410003000000000000000000AC -:10A8E0000000000000000000000000000000000068 -:10A8F00000000000410000000000000021000000F6 -:10A900000000000000000000000000000000000047 -:10A91000000000000000000400000004010000002E -:10A920000000000000200000000000402010000097 -:10A9300000000000000008090000000900000000FD -:10A940000011000000094008000000400003000062 -:10A95000004001000100008008000000000000002D -:10A9600000000009000004000000000004000000D6 -:10A9700000000000000000000000000000000000D7 -:10A980000000000000000400400000000000000083 -:10A9900000000000000000000000000000000400B3 -:10A9A0000000000000000001000000000000800026 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000108000800000400000000000062 -:10A9E0000000000000000000000000000000000067 -:10A9F000000000000000000000000800000000004F -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000020000009000000000000000000094 -:10AA30000480000000000000000000000000000092 -:10AA40008200000000000000000082000000000002 -:10AA50009000000000000000004000000005000021 -:10AA60000000000000000000000000008200000064 -:10AA700000000000000000000000000008000000CE -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000080000AE -:10AAA00000000000000000080000219000080000E5 -:10AAB00000008004000000000000000000C0000052 -:10AAC0000000000000000084000000000000000002 -:10AAD0000000000000000000000000010000000075 -:10AAE00000000000000000000800000000880000D6 -:10AAF0000000000000000000000000000000000056 -:10AB000000000300000000000800000041000000F9 -:10AB10000000000000002000000000000000000015 -:10AB200000000000200000000000000900090000F3 -:10AB300000001000C0000000000000000000000045 -:10AB40000000000082000000000000000000000083 -:10AB50000011000000000000010000000080000063 -:10AB600000000000000000000002000000000000E3 -:10AB70000000000000000000000000000000820053 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA0000200000002000200000000000000050496 -:10ABB0000000000000000000200000000004200051 -:10ABC0000000000002000000000000000000000083 -:10ABD000000000000000000000000400000000046D -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000900000000000000000000094 -:10AC30000000010000000000000000000000000013 -:10AC40000000000000000000000000000000000004 -:10AC50000000000000000000000000001190002033 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA0000000000000000080000000000000000024 -:10ACB0000000000010000000000000000000000084 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000A100D3 -:10ACE00000800000000000000000000000000000E4 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD200000000000000000000000000000800000A3 -:10AD30000000000000000000000000000080000093 -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000003F0 -:10AD600000000000000300000000000000000000E0 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA0000000000000000000000000040000000897 -:10ADB0000000000000000090000000000000000201 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE000000000000000000400000000000000005F -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE2000000000000000000000000000000008908A -:10AE30000000000000000000010000000000000011 -:10AE40000000000002000000000000000000000000 -:10AE500000000000000000000000000000000000F2 -:10AE6000000000000000C090000000000000000092 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA000000000000000000000000000050000009D -:10AEB0008080000000000000000041000000000051 -:10AEC00000004100000080000000000000000000C1 -:10AED0000000000000000000000000000000000072 -:10AEE000000000000000000080800000080000005A -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000001110 -:10AF30008000000000000000000000000000000091 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF60000000000000000000800800110000000048 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA00000000000000000000000000000000000A1 -:10AFB00000012000008800000000000000000000E8 -:10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE00000000000000000000000C0018400840098 -:10AFF00084000000000000000000000000000000CD -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B0300000000000000007000000410000E04200A6 -:10B040000082604100E007000000000000000000F6 -:10B0500000000000000000000000000000000000F0 -:10B06000000000000000000000000000008100E07F -:10B07000420041000000000000000000000000004D -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B000000000000000FF000000FF000000000092 -:10B0C0000000000000000000000000000000000080 -:10B0D0000000000000000000000000000000000070 -:10B0E000000000000000000000000000000000045C -:10B0F000000290909090000000000000000000000E -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B130000000000000000000FF000000FF00000011 -:10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B170000004000290909090000000000000000089 -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B230000000000000000000000000FF0000FFFF11 -:10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B27000000000000000FF000000000000000000CF -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B00000000000000000000000000000FF00008F -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F0000000000000000000FF000000000000004F -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B3300000000000000000000000000000001500F8 -:10B340002A00054000A800610006C00D00A00061B1 -:10B350000036C00D00A0000000000000000000004A -:10B3600000000000000000000000000000000000DD -:10B370000000000000000000A061002E001D000081 -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000106B -:10B5D00000000000000000800000000000000000EB -:10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B -:10B600000003000000000000000000000000000037 -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B630000000840000000000000000000000000086 -:10B6400000000000000000000000000000000000FA -:10B650001000400000000000000441000000000055 -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000002C8 -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000400000005A -:10B6B000000000000000000000000000000000008A -:10B6C00000000000000000000000000002008200F6 -:10B6D0008200004000008200000000000000020024 -:10B6E00000000200000000008204000000000000D2 -:10B6F00000008200820000000200820000000000C2 -:10B7000000000000000000000000000000800000B9 -:10B7100000008200000082008200000000000000A3 -:10B720000000000002000000000000000000000017 -:10B730000000000002000000000000000000000007 -:10B740000000000082000000000000000000000077 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000100000000D8 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000004B5 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000300000000000000000096 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D00000000000000001000000200090000000B8 -:10B7E0000000000000000000100000000000002128 -:10B7F0000000000000000000000000000000002029 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B8200040000000000000000000000000000000D8 -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 -:10B85000000000000000000004000000890000005B -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 -:10B8800000010000000000000000000000000000B7 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D000000000000088004001800180000400009A -:10B8E000010000080000000000000000000000004F -:10B8F0000000000000000000000000000000000048 -:10B900000000200000000000000000000000000017 -:10B910000000000000000000000000000100000026 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B95000000000000000004111002020020800014A -:10B9600000002000000100000000000000000000B6 -:10B9700000000000000000000000000000000000C7 -:10B980000000000080000000000000000000000037 -:10B9900000000000000000000000000000000400A3 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000090009000000000000000000443 -:10B9E00000000000008000000000001000000405BE -:10B9F0000000000000200000000000000000000027 -:10BA00000000000000000400000000000000000032 -:10BA10000000000000000000008000000000002086 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA6000008500000000090800200000000100001F -:10BA7000A100000000000001000000000000000024 -:10BA80000000000000000000800000000000000036 -:10BA900000C000000000008400000304000000005B -:10BAA0000001000000040000000000000000000091 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000010065 -:10BAE00000000000008000800009108200000000BB -:10BAF00004000000000000050000000800400009EC -:10BB00000000000000000000000000000000000035 -:10BB10000000000500000000000000009020000070 -:10BB2000000200040000000000000000000000000F -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB50000000000000000082000000000000000063 -:10BB600020000000000009080008020080200000FA -:10BB70000000800000000000000000000500000040 -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000001A4 -:10BBA0000000000040010000000000000000000054 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE00001009000000000A00100000040000001E2 -:10BBF000000000000000000000C0009100000001F3 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000082000000000000000000000092 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000001100A1000000000011004100800050 -:10BC70000009000000000000000000910091000594 -:10BC800000110000000000000000000000000000A3 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000080980001000000841090061 -:10BCF0000041418000000000800080801100210090 -:10BD0000A000A08000000000000000000000000073 -:10BD100000000080000000000000000000010000A2 -:10BD200000000000800011000000000308800000F7 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD60000000000000000001010200010088010144 -:10BD7000010000010110000000008400C0900100DB -:10BD800001008500C19000000000000000000000DC -:10BD9000000000000008000000000000000000009B -:10BDA00000000000000090000000000000010104FD -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000010088880800010039 -:10BDF00000008800A0000101000000000090000089 -:10BE000000000000009000C00000000000000000E2 -:10BE10000000000000000000000002000000000020 -:10BE20000000000000000000010000000000880089 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE60000000000000000000000041000080800091 -:10BE7000410000110000800011410000000000801E -:10BE8000000000000300418000800000000000006E -:10BE900000000000000000004100000080000000E1 -:10BEA0000000000000000000000040000000000052 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000011200021 -:10BEF0000080000000092111000000020000000085 -:10BF000000000000891180000400104000000000C3 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000800000000091 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000001D0 -:10BF700001000040000000910001000000000000EE -:10BF8000000000000000C08520000100000100004A -:10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000008000089 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF000000000E007008206840043E00722812160 -:10C0000000420000420000000042004842000000E0 -:10C010000000000000000000000000E00700000039 -:10C0200000000000000000000000004200E00700E7 -:10C030000000001100E00700000000000000000008 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C07000000000000000F0F00000000000000000E0 -:10C0800000000000000000FF00FF000000FF0000B3 -:10C0900000FF0000000000000000000000000000A1 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000F0F000000000000060 -:10C10000000000000000000000FF00FF000000FF32 -:10C11000000000FF00000000000000000000000020 -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000003C3C0000FFFF000049 -:10C1800000000000000000000000FF000000FF00B1 -:10C190000000FF00000000000000000000000000A0 -:10C1A000000000000000000000000000000000008F -:10C1B00000000000FFFFFFFF000000000000000083 -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000003C3C00000000C7 -:10C20000000000000000000000000000FF0000002F -:10C21000FF000000FF000000000000000000000020 -:10C22000000000000000000000000000000000000E -:10C23000000000000000FFFF000000000000000000 -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C270000000000000000000000005402A06054CF8 -:10C2800000A800040006C00A21A0000000300C0035 -:10C2900012C003E303320C058AC000000000000056 -:10C2A000000000610006000D00A00000000000007A -:10C2B0000000000000610026000D00000061002663 -:10C2C000050500A0000000000000000000000000C4 -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F0000000000000000000000000000000FF003F -:10C30000FFFF00000000FF00AAAAC3C30000000056 -:10C310000000000030303F3F00000000000000003F -:10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C38000FF00000000000000FF00AAAA000000005B -:10C3900000000000000030303F3F000000000000BF -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C4000000000000F0F0000000003C3CF0F0FFFFF6 -:10C410000000000000000000500149D60000002884 -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C440000000000000000000C3C300000000000066 -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C48000000000000000F0F0000000003C3CF0F074 -:10C49000BEBE0000000000000000000001C050000F -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C00000000000000000000000C3C300000000E6 -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C5000000000000000000000180000000000000AA -:10C510000000000000000080000000020000000099 -:10C52000000000800000000000000000000000008B -:10C5300000000000000000000000000000030000F8 -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C580000000000000000000000002100000000099 -:10C59000000000000000000000400000000000005B -:10C5A000000000000010210000000000000000005A -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C6000000000000000000008200000000000000A8 -:10C610000000000000000000000000000000820098 -:10C620000000000000000000820000008200000006 -:10C6300000008200000082000000000000000000F6 -:10C6400000000000000000000000000000000000EA -:10C650000000000082000000000000000000000058 -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C68000000900000000000000000200000000009F -:10C690000200000000000000000000000000000098 -:10C6A000000000000000000000000000000000008A -:10C6B0000000000000000000040000000000000076 -:10C6C0000000000000000000040000000000000066 -:10C6D0000000001004000000000000000000040042 -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000010000000000A00000040000000064 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000002000C9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 -:10C790000000000000001100000000000000000088 -:10C7A0000000000020000000000000000000000069 -:10C7B0000000000000080000000000000000000071 -:10C7C0000000000000000000000000000000000069 -:10C7D00080000000000000000000000000000000D9 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C8000000000000000000000041000000000000E7 -:10C810000000004001000080000000000000000453 -:10C820000000004001000000000000000040000087 -:10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C850000000000000000000008000000000000058 -:10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000002000000400000000000074 -:10C8A0000001000000002004000000002100000141 -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000004000000000000000064 -:10C8D0000000000000000000000000040000000054 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000900000000000000000000400004043 -:10C920000000400000101000020040000000C000A5 -:10C9300000000004000000000000000000000000F3 -:10C9400000000000000000000000000000000000E7 -:10C950000000000090000000000000000000000047 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 -:10C980000000000000000000000000000000008423 -:10C99000000000C000C0008421000084008440002A -:10C9A00021010084000000008000800000000000E1 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D00000000000000000000000000000000084D3 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA1000000088000000000001090800000000007C -:10CA2000001140000002018201000300C00200006A -:10CA300000000000000900000000000000000000ED -:10CA400000000000000000000000000000002000C6 -:10CA500000000000000000002000000000000000B6 -:10CA600000000000000000000002000000000000C4 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000010000000008204 -:10CAA00000000000110009000804200020400000E0 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000020000000000046 -:10CAD00000000000000000000000800000000000D6 -:10CAE0000000000000000000001000000000000036 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB1000000000000000000000000000010008000C -:10CB200000000000000040000000000000000000C5 -:10CB30000000C00000000000000000000000000035 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000010000000001D3 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000110084 -:10CBA00021000000000000008000000000000000E4 -:10CBB00000001000800000000000000000000000E5 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000004100000014 -:10CBE0000011000000000000000000000000000034 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC200000410900000300808000800080098080AE -:10CC30000008000000090080000000008000800063 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000003000000000000D1 -:10CC60000000000000000083000000000000000041 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA00000000001010000000088C000C000C001B9 -:10CCB000C0820201900008002002080090000200DB -:10CCC000C0000000000000000000000000000000A4 -:10CCD0000000000000000000000000000000000054 -:10CCE00000000000000000000090000000000000B4 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000008800889001000000000161 -:10CD30000000000000108890400800200000000063 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000010000D2 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 -:10CDA00000000000000000000000008041000000C2 -:10CDB000004000000020008000058000030000000B -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000152 -:10CDE00000000000000005000000000041000500F8 -:10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE2000000000000000000000000011840000006D -:10CE30000000001100000000000800100080000049 -:10CE400000000005008000800000000000000000DD -:10CE500000000000000000000000000000000000D2 -:10CE600000010004000000000000001100000000AC -:10CE70008000000000000000000000000000000032 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 -:10CEA00000000000000000000000000000019100F0 -:10CEB00088000000000000A000840001000000C005 -:10CEC000000000000000000400020000000000005C -:10CED0000000000000000000000000000000000052 -:10CEE000000000010001000000000000000100003F -:10CEF00000009000000000000000000000000000A2 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 -:10CF2000000000000000000000000000002100E000 -:10CF300012008141000000E04200000000000048B3 -:10CF40004200000600000000420000000000000057 -:10CF500000000000000000000000000000000000D1 -:10CF60000000000000008100004800000021500087 -:10CF700000E00700000000000000000000000000CA -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000000091 -:10CFA00000000000000000000000000000000C0C69 -:10CFB0000C0C00FF00FF000000000000000000005B -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF00018181818000000000000000000000000D1 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 -:10D030000C0C0C0C00FF00FF0000000000000000C2 -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D070000000181818180000000000000000000050 -:10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000000000000090 -:10D0A0000000000000000000000000000000000080 -:10D0B00000000000000000000000000000000080F0 -:10D0C0002006000000000084208000000000008096 -:10D0D000200200000000000000000000000000002E -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE -:10D23000000000000000000080400026000C0000FC -:10D24000306100060009000530610007000C000C89 -:10D25000300000000000000000000000000000009E -:10D2600000000000000000000000000000000000BE -:10D27000000000610007800D000000610002800DC9 -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E -:10D2B0000000000000000000000000000F0FFFFF52 -:10D2C00000000000000000000F0F00000000F0F060 -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000000000000FD -:10D3300000000000000000000000000000000F0FCF -:10D34000000000000000000000000F0F00000000BF -:10D35000F0F00000000000000000000000000000ED -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D -:10D3B000000000000000000000000000000000006D -:10D3C0000000F0F00000000000000000000000007D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000FFFFFFFF00000000000000000000000020 -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC -:10D4300000000000000000000000000000000000EC -:10D4400000000000F0F000000000000000000000FC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D480000000FFFF0000000000000000000000009E -:10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F0000000000000000000000000030000000029 -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000040000000AB -:10D5400000000000000000000000000021000000BA -:10D5500000000000000000000002000000000000C9 -:10D5600000000000000000000000000000000000BB -:10D570000000004000000000000000020000004029 -:10D58000000000000000000000000000000000009B -:10D590000000000000004000004000000004000007 -:10D5A000000000000000000000000000000000007B -:10D5B0000000000000000002000000000004000065 -:10D5C0000000000002000200000000000200000055 -:10D5D0000200901082000000000000000000000027 -:10D5E000000000000000000000000000000000003B -:10D5F0000000000002000000000000000000000029 -:10D60000000000000000000000000000000000001A -:10D610000000000000000000040000000200000004 -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000100000000004D6 -:10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D69000000000000000000000008000000080008A -:10D6A0000200000000000000000000000000000078 -:10D6B00004000000000000000000000080000000E6 -:10D6C0000001000000000000000000000000000059 -:10D6D0000100000000000000000000000000000049 -:10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D7100000000000000088000000900000000000F1 -:10D7200000000000000000000000000000000000F9 -:10D7300000210000000000000000000000000000C8 -:10D7400000210000000000000000000000000000B8 -:10D750000000200000000000000040000000000069 -:10D760000000000000000084000000000000000035 -:10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 -:10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 -:10D7D00000400000000000040000000001200000E4 -:10D7E00000000000004000000000000000000000F9 -:10D7F0000000000000000000000001800180000027 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000100008087 -:10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D840000000000000000040000000000000000098 -:10D850000000000000000000110000000000200196 -:10D860000000000000901100000000000000000017 -:10D870000000400000000000000000002020040420 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000200068 -:10D8A0000004000000000000000000000000000074 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 -:10D8F0000000000000009000900000000000000008 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000090000000000077 -:10D9200000000000001100000000000000000000E6 -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 -:10D95000000000C00090000000840004008400006B -:10D9600000000000210000200084000021000000D1 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 -:10D990000000000000C000000000000000000000C7 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000008800880037 -:10D9E000010900020000A009000000000000000082 -:10D9F00000000002000000000002000000000180A2 -:10DA0000010000000000000000000000000900000C -:10DA10000000000000000000000000000000000006 -:10DA200001000000000000000000000000000000F5 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA50000000000000000000200020000000110075 -:10DA600000901000000020000000000000000500F1 -:10DA700000000000000005000000000000000000A1 -:10DA80001040200000000000000000000000000026 -:10DA90000000000000000000000000000000000086 -:10DAA00000001000008200000000000000000000E4 -:10DAB0000000000000000500000000000000000061 -:10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000010090000000000000000000000084 -:10DB10000000000000000000000000000000000005 -:10DB200000000000010000000000000000000000F4 -:10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000100D4 -:10DB5000880000000000000000000000000000003D -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB8000000000001100A1000000000000000000E3 -:10DB90000000000000000000000000000000000085 -:10DBA0000000000000001100210000000000000043 -:10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 -:10DBD000090000000000000000000000000000003C -:10DBE0000000000000000000000000000000000035 -:10DBF0000000000000000000000000000000000025 -:10DC00000000000000000008098000030000000080 -:10DC10000000000000000000000000000000000004 -:10DC200000000000000000000041090000030000A7 -:10DC30000000001000800000000000000000000054 -:10DC400000000000000000000000000000000000D4 -:10DC500000000000000000000000000000000000C4 -:10DC6000000000000000000000000000000000882C -:10DC700000000000000000000000000000000000A4 -:10DC8000000000000000000000010102000000048C -:10DC90000000000000000000000000000000000084 -:10DCA0000000000000000000000000010100000072 -:10DCB00000000000000000880000000000000000DC -:10DCC0000000000000000000000000000000000054 -:10DCD0000000000000000000000000000000000044 -:10DCE0000000000000000000010000000000000132 -:10DCF0000000000000000000000000000000000024 -:10DD0000000000000000000000000100888888007A -:10DD10000000000000000000000000000000000003 -:10DD2000000000000000000000000000000088006B -:10DD300000000100000000000000000000000000E2 -:10DD400000000000000000000000000000000000D3 -:10DD500000000000000000010000010100000000C0 -:10DD600000000000000000000000080000000000AB -:10DD7000002005000000000000000000000000007E -:10DD800000000000000000000000000041000080D2 -:10DD9000000009000000000000000000000000007A -:10DDA0000000000000000000000000000000000073 -:10DDB0000000000040000000000000000000000023 -:10DDC0000000000000000000000000000000000053 -:10DDD00000000000000000100003000211410000DC -:10DDE000000000000000000000000000000000042F -:10DDF0000000000000000000000000000000000023 -:10DE00000000000000000000000000000000001101 -:10DE10000000008000000000000000000000000082 -:10DE200000000000000000000000000000000000F2 -:10DE300000000011000000008011800000000000C0 -:10DE400000000000000000000000000000000000D2 -:10DE500000000000000000000000000000000000C2 -:10DE600000000000000000000000000000000000B2 -:10DE700000010000000000000000000000000000A1 -:10DE80000000000000000000000000000000000092 -:10DE90000001000000400000000000000000000041 -:10DEA0000000000000000000000000000000000072 -:10DEB00000000000000100000000C001200002007E -:10DEC0001000000000000000000000000000000042 -:10DED0000000000000000000000000000000000042 -:10DEE00000000000000000000000480000E000000A -:10DEF0000000810A00E007000000000000000000B0 -:10DF00000000000000000000000000000000000011 -:10DF10000000000000E00700820000000000000098 -:10DF200000000000000000000000000000000000F1 -:10DF300000000000000000E0000081000000000080 -:10DF400007000000000000000000000000000000CA -:10DF5000000000000000000000000000000000E0E1 -:10DF600000000000000000000000000000000000B1 -:10DF700000000000000000000000000000000000A1 -:10DF80000000000000000000000000000000000091 -:10DF90000000000000000000F0F0000000000000A1 -:10DFA0000000000000000000000000000000000071 -:10DFB00000000000000000000000000000003A3AED -:10DFC000000F000000000000000000000000000042 -:10DFD0000000000000000000000000000000000041 -:10DFE0000000000000000000000000000000000031 -:10DFF0000000000000000000000000000000000021 -:10E000000000000000000000000000000000000010 -:10E0100000000000000000000000F0F00000000020 -:10E0200000000000000000000000000000000000F0 -:10E0300000000000000000000000000000000000E0 -:10E040003A3AF0FF0000000000000000000000006D -:10E0500000000000000000000000000000000000C0 -:10E0600000000000000000000000000000000000B0 -:10E0700000000000000000000000000000000000A0 -:10E080000000000000000000000000000000000090 -:10E090000000000000000000000000000000FFFF82 -:10E0A0000000000000000000000000000000000070 -:10E0B0000000000000000000000000000000000060 -:10E0C0000000000000000000000000000000000050 -:10E0D0000000000000000000000000000000000040 -:10E0E0000000000000000000000000000000000030 -:10E0F0000000000000000000000000000000000020 -:10E10000000000000000000000000000000000000F -:10E1100000000000000000000000000000000000FF -:10E1200000000000000000000000000000000000EF -:10E1300000000000000000000000000000000000DF -:10E1400000000000000000000000000000000000CF -:10E1500000000000000000000000000000000000BF -:10E1600000000000000000000000000000000000AF -:10E170000000000000610006C00D000000610036D4 -:10E18000C00C00A000000000000000000000000023 -:10E1900000000000000000000000000005600A060A -:10E1A000054C00A800000000000000000000000076 -:10E1B00000000000000000000000000000000060FF -:10E1C0000006000C0000100000000000000000002D -:10E1D000000000000000000000000000000000003F -:10E1E00000000000000000610006000800000000C0 -:10E1F000000000000000000000000000000000001F -:10E20000000000FF0000000000000000000000000F -:10E2100000000000000000000000000000000000FE -:10E220000000FFFF000000000000000000000000F0 -:10E2300000000000000000000000000000000000DE -:10E2400000000000FFFF00000000000000000000D0 -:10E2500000000000000000000000000000000000BE -:10E26000000000000000000000000000FFC3F055A7 -:10E27000000000000000000000000000000000009E -:10E280000000000000FF000000000000000000008F -:10E29000000000000000000000000000000000007E -:10E2A000000000000000000000000000000000006E -:10E2B000000000000000000000000000000000005E -:10E2C000000000000000000000000000000000004E -:10E2D000000000000000000000000000000000003E -:10E2E000000000000000000000000000000000C36B -:10E2F000F0550000000000000000000000000000D9 -:10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD -:10E32000000000000000F0F000000000000000000D -:10E3300000000000000000000000000000000000DD -:10E340000000000000000000F0F0000000000000ED -:10E3500000000000000000000000000000000000BD -:10E3600000000000000000000000000000000000AD -:10E37000000000000000000000000000000000009D -:10E38000000000000000000000000000000000008D -:10E39000000000000000000000000000000000007D -:10E3A0000000000000000000F0F00000000000008D -:10E3B000000000000000000000000000000000005D -:10E3C00000000000000000000000F0F0000000006D -:10E3D000000000000000000000000000000000003D -:10E3E000000000000000000000000000000000002D -:10E3F000000000000000000000000000000000809D -:10E40000000000000080000000800000000000000C -:10E4100000000000000000000000000000000000FC -:10E42000000000000000400000000000000040006C -:10E4300002000000000000030000000000000000D7 -:10E44000000000000000000020000000008000002C -:10E45000200020000000000000000000000000007C -:10E46000000000000000000020000000000000008C -:10E47000200000000000000000000000000000007C -:10E480000008000000000008000000080000000074 -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C -:10E4C000000000000000000000000000000000400C -:10E4D000000000000000000000000000000000003C -:10E4E000000000000000000000000000000000002C -:10E4F000000000000000000000000000000002001A -:10E5000000000200020810000000000000000200ED -:10E5100000000200000000000200000002000000F5 -:10E5200000000200000002000000020002000000E3 -:10E530000000020000400000000000000000000099 -:10E5400000000000000000000000000000000100CA -:10E5500004000000000000000000000000000000B7 -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000180000000000000000A -:10E590000000000004000000000004000000000073 -:10E5A00000000000000000008000000000000000EB -:10E5B000000000000000000000000000000000005B -:10E5C0000000000004000000000000000000000047 -:10E5D00002000000000000000040000000000400F5 -:10E5E0000000000000000000040000000000000027 -:10E5F000000000000000000000000000000000001B -:10E600000000000000000000820000000000040084 -:10E61000000000008900000000004000C10004006C -:10E62000000000000000A00000000000000000004A -:10E6300000000000000000000000000000000000DA -:10E6400000000000000000000000000000000000CA -:10E6500000000000000000000000000001000000B9 -:10E66000004000000000000000000000000000006A -:10E67000000000000000000000000000000000009A -:10E68000000000000000000000000000000000008A -:10E6900080000000000020000000000000002000BA -:10E6A00080000000000000000000000000000000EA -:10E6B000000000000000000000000000000000005A -:10E6C000000000000000000000000000000000004A -:10E6D0000000000000000000000000000000040036 -:10E6E0000000008300000000008200000000000025 -:10E6F000000000000000000000000000000000001A -:10E700000000000000000000000001000100008087 -:10E71000018000000005000020004005A0840140A9 -:10E720008400040000000000000000000000000061 -:10E730000000010000000100008000000000000057 -:10E7400000000000000000000000000000000000C9 -:10E750000000000000000000010001800000000037 -:10E7600000000100000000000000010000000000A7 -:10E770000000000000000000000000000000000099 -:10E780000000000000000000000000002000040065 -:10E79000002002040000000000000000008400408F -:10E7A00020000000800000000000000000000000C9 -:10E7B0000000000010000000200000040000000025 -:10E7C0000000004000000000000000000000000009 -:10E7D0000000000000000000000020000404000011 -:10E7E0000000000004000000000000000400000021 -:10E7F0000000000000000000000000000000000019 -:10E8000000000000000000000000900090000000E8 -:10E8100000000000002088000000000088000000C8 -:10E820000000A008000004000000A000820000001A -:10E830000000000090000000000000000000000048 -:10E8400000000000000000000000000000000000C8 -:10E8500000000000000090000100000000000080A7 -:10E86000010000000003000000000008002000007C -:10E87000000000000005000800000000000000008B -:10E880000000000000000000000000000000000088 -:10E89000038400000000000100000000000000846C -:10E8A00000000000000100008000000000000000E7 -:10E8B0000084000000C000C000000000008400844C -:10E8C0000000000000000000000000000000000048 -:10E8D000000000000000000000C0020000000084F2 -:10E8E00000400200000000000000000000000001E5 -:10E8F0000000000000000000000000000000000018 -:10E9000000000000000000000008200000000000DF -:10E9100000000000000000000000000988009000D6 -:10E92000000000000104C089000205200000A009C9 -:10E930000002004000000000000000090102000089 -:10E9400000000000000800020002000000000000BB -:10E9500000000000000000000000000000000000B7 -:10E96000000000000000000000020000000000099C -:10E970000000004000000000000000100000000047 -:10E9800000080000000000000000000000820000FD -:10E99000000000000088000000000000000000905F -:10E9A0001100000000002000004000008401000071 -:10E9B0002000000000010000000000000000209086 -:10E9C00000000088000000000000000000000000BF -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 -:10EA000000000000000000000800000000000000FE -:10EA10000000000000000100208400000001000050 -:10EA2000000090000000010084000100C00100000F -:10EA3000000000000000009002400002820201007D -:10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000000000B6 -:10EA60000100009000000000000090000000000085 -:10EA70000000900000000000000000000000000006 -:10EA80000000000000000000000000000000000086 -:10EA900000000000000000000900800000000008E5 -:10EAA0000000000084000000110021000300800924 -:10EAB00000000000000000000000808000808080D6 -:10EAC0001100210000000000000000000000000014 -:10EAD0000000000000000000000000000000000036 -:10EAE00000001100218000000000000080000000F4 -:10EAF0000000110080000000000000000000000085 -:10EB00000000000000000000000000000000000005 -:10EB1000000000000000000000000005008011203F -:10EB200000000000000000090000800889000009C2 -:10EB300000000000000000000000800000830020B2 -:10EB400000000008090000030000000000000000B1 -:10EB500000000001000000000000000000000000B4 -:10EB600000000000004109000003000000000080D8 -:10EB70000000008000000080000000800000000015 -:10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000273 -:10EBA00001010088000000000000000008010500CD -:10EBB000080020080000000000000000040040825F -:10EBC00020002040000101000000000000000000C3 -:10EBD0000000000000000000000000000000000035 -:10EBE00000000000000000010102000000A0000081 -:10EBF00000080000000800000020000000080000DD -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000100F3 -:10EC2000C088900001000100000000000000000802 -:10EC30008804100200200000000000000000020410 -:10EC400000400820002000008800000001000000B3 -:10EC500000000000000000010000000000000000B3 -:10EC6000000000000000000001008800C0900000CB -:10EC70000100008888000000010000888800000072 -:10EC80000000000000000000000000000000000084 -:10EC90000000000000000000000000000000000074 -:10ECA0000800808300002000080000000000110020 -:10ECB00000800080008009000900000000000000C2 -:10ECC000C080000000000000000000000000030001 -:10ECD0000000000000000000000100000000000033 -:10ECE000000000000000000000000900000000809B -:10ECF0001100410000800000000041000080000081 -:10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED20000000001111000080000000000000000041 -:10ED30000000000921040080000000000000000025 -:10ED400000008040000980800000000000090000F1 -:10ED500000000000000000000000000100000000B2 -:10ED60000000000000000000000000000011801101 -:10ED700000000000001100000080000000110000F1 -:10ED80000080000000000000000000000000000003 -:10ED90000000000000000000000000000000000073 -:10EDA0000000000000010100004000000000000021 -:10EDB000000000000001000100C000000000000091 -:10EDC000000000908400200040044000000000008B -:10EDD0000000000000000000000000000001000032 -:10EDE0000000000000000000000000000000000122 -:10EDF0002001008800000001000000400000000128 -:10EE000000000040000000000000000000000000C2 -:10EE100000000000000000000000000000000000F2 -:10EE2000000000000000000000E007008200000079 -:10EE300000480700000000000048420000060006ED -:10EE40000000070000000000000042000000000079 -:10EE500000E00000000000000000000000000000D2 -:10EE600000000000000000000000000000000000A2 -:10EE7000000000E0070081000000000007008200A1 -:10EE800000000000070082000000000000000000F9 -:10EE90000000000000000000000000000000000072 -:10EEA0000000000000000000000000000000F0F082 -:10EEB0000000000000000000000000000000000052 -:10EEC0000000000000000000000000000000000042 -:10EED0000000000000000000000000000000000032 -:10EEE0000000000000000000000000000000000022 -:10EEF00000000000FF000000FF0000000000000014 -:10EF0000F0F0000000000000F0F000000000000041 -:10EF100000000000000000000000000000000000F1 -:10EF200000000000000000000000000000000000E1 -:10EF3000F0F00000000000000000000000000000F1 -:10EF400000000000000000000000000000000000C1 -:10EF500000000000000000000000000000000000B1 -:10EF600000000000000000000000000000000000A1 -:10EF7000000000000000FF000000FF000000000093 -:10EF80000000F0F0000000000000F0F000000000C1 -:10EF90000000000000000000000000000000000071 -:10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000000051 -:10EFC00000842080000000000000000000084000D5 -:10EFD000008420000000000000000000000000008D -:10EFE0000000000000000000000000000000000021 -:10EFF0000000000000000000000000000000000011 -:10F000000000000000000000000000000000000000 -:10F0100000000000000000000000000000000000F0 -:10F02000000000000000000000000000000000FFE1 -:10F030000000FFFF000000000000000000000000D2 -:10F0400000000000000000000000000000000000C0 -:10F0500000000000000000000000000000000000B0 -:10F0600000000000000000000000000000000000A0 -:10F07000000000000000000000FF0000FFFF000093 -:10F0800000000000FFFF000000000000FFFF000084 -:10F090000000000000000000000000000000000070 -:10F0A0000000000000000000000000000000000060 -:10F0B00000FF000000000000000000000000000051 -:10F0C0000000000000000000000000000000000040 -:10F0D0000000000000000000000000000000000030 -:10F0E0000000000000000000000000000000000020 -:10F0F0000000000000000000000000FF0000000011 -:10F1000000000000000000000000000000000000FF -:10F1100000000000000000000000000000000000EF -:10F1200000000000000000000000000000000000DF -:10F13000000005002A06054C00A805610017000C18 -:10F14000000030000007000C000C0500003000003B -:10F1500000003000000000C0000000600006000C4D -:10F16000000000000000000000000000000000009F -:10F1700000000000000000000000000015602A06EA -:10F18000054C00A805000A00054000A805000A007B -:10F19000054000A800000000000000000000000082 -:10F1A000000000000000000000000000000000005F -:10F1B000000000000000FF00F0F000000000000070 -:10F1C000AAAA00000000FF00FFFF000000000000EE -:10F1D000000000000000000000000000000000002F -:10F1E000FFFF000000000000000000000000000021 -:10F1F000000000000000000000000000000000000F -:10F200000000FFFF00000000000000000000000000 -:10F2100000000000000000000000000000000000EE -:10F2200000000000000000000000000000000000DE -:10F230000000000000000000FF00F0F000000000EF -:10F240000000AAAA00000000FF000000000000006B -:10F2500000000000000000000000000000000000AE -:10F26000000000000000000000000000000000009E -:10F27000000000000000000000000000000000008E -:10F28000000000000000000000000000000000007E -:10F29000000000000000000000000000000000006E -:10F2A000000000000000000000000000000000005E -:10F2B000000000000000000000003C3C00FF0000D7 -:10F2C000000000000000000000003C3CF0F00000E6 -:10F2D000000000000000000000000000000000002E -:10F2E00000000000F0F0000000000000000000003E -:10F2F000000000000000000000000000000000000E -:10F30000000000000000F0F000000000000000001D -:10F3100000000000000000000000000000000000ED -:10F3200000000000000000000000000000000000DD -:10F330000000000000000000000000003C3C00FF56 -:10F340000000000000000000000000003C3CF0F065 -:10F3500000000000000000000000000000000000AD -:10F36000000000000000F0F00000000000000000BD -:10F37000000000000000000000000000000000008D -:10F380000000000000000000F0F00000000000009D -:10F39000000000000000000000000000000000006D -:10F3A000000000000000000000000000000000005D -:10F3B000000000000000000000000000000000004D -:10F3C00000000000000000000000008000000000BD -:10F3D000000000000000000000000000000000002D -:10F3E000000000000000010000000000000000001C -:10F3F000000000000001000000000000000000000C -:10F4000000000000000000000000000000000000FC -:10F4100000000000000000000000000000000000EC -:10F4200000000000000400000000000000000000D8 -:10F4300000000000000000000000000000000000CC -:10F44000000000020000000000000000002000009A -:10F45000000000000000000000000000000040006C -:10F46000000000000000000002000000000000009A -:10F47000000000020000000000000000000000008A -:10F4800040000000400000000000000000000000FC -:10F49000000000000000000000000000000000006C -:10F4A000000000000000000000000000000000005C -:10F4B0000000000000000000000000000800000044 -:10F4C0000200020002000000000002000000000034 -:10F4D000000000000000000000000000020000002A -:10F4E0000000000000000200030000000200030012 -:10F4F000000000000000000000000000000000000C -:10F5000000000000000002000000020002000000F5 -:10F5100000000000000000000000000000000000EB -:10F5200000000000000000000800000000000000D3 -:10F5300000000000000000000800000000000000C3 -:10F5400000000000000000000000000000000000BB -:10F5500000000000000000000000000000000000AB -:10F560000000000000000000000002000000800019 -:10F570000200000000000000000000000000000089 -:10F58000000000000000000000000000000000007B -:10F590000000000000000000000002000000000069 -:10F5A000000000000000000000000000000000005B -:10F5B000000000000000000000000000000000004B -:10F5C0000000000000000000000000000400000037 -:10F5D0000000A0000000000000000000000000008B -:10F5E000000000000000000000000000000000001B -:10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA -:10F6100000000000000000000000000000000000EA -:10F6200000000000000000000000000000000000DA -:10F6300000000000000000000000000000000000CA -:10F6400000000000000000000000000000000000BA -:10F650000000000021000000000000000000000089 -:10F660000000059005000000000000000000000000 -:10F67000000000000000000000000000000000008A -:10F68000000000000000000000000000000000007A -:10F69000000000000000000000000000000000006A -:10F6A000000000000000000000000000000000005A -:10F6B000000000000000000000000000000000004A -:10F6C0000000000000000000000000000020010019 -:10F6D0000000000000000004000000000000000422 -:10F6E000000000000000000000000000000000001A -:10F6F0000000000001400180000000000000000048 -:10F7000000000000000000000000000000000000F9 -:10F7100000000000000000000000000000000000E9 -:10F7200000000000000000000000000000000000D9 -:10F7300000000000000000000000000000000000C9 -:10F740000020000000000000000000000000000099 -:10F75000200000000000090000010000004000003F -:10F760000084000000880000008800000000000005 -:10F770000000000000002000040400000000000061 -:10F780000000000000000000000000000000000079 -:10F790000000000000000000000000000000000069 -:10F7A0000000000000000000000000000000000059 -:10F7B0000000020000000000000021000000000026 -:10F7C0000000000000000000000000000000000039 -:10F7D0000000000000000000000001000000000028 -:10F7E0000000000000000000000000000000000019 -:10F7F0000000900000000000000000000000000079 -:10F8000000000000000000000000000000000000F8 -:10F8100000000000000000000000000000000000E8 -:10F8200000000000000000000000000000000000D8 -:10F8300000000000000000000000000000000000C8 -:10F840000000000000000000000000C000C00084B4 -:10F85000218400000084008400C01100200000000A -:10F860000000008400000000000000000000008490 -:10F870000000000021C00000000000840000000023 -:10F880000000000000000000000000000000000078 -:10F8900000000000000000C00000000000840084A0 -:10F8A0000000000000000084000000000000008450 -:10F8B0000000000000000000000000000000000048 -:10F8C00000000000000000000000880000000000B0 -:10F8D0000000000000002000000200020000010201 -:10F8E000000900000000001100000000000284096F -:10F8F00000000000000000001009000000000000EF -:10F9000000020000000200000000000000000000F3 -:10F9100000000000000000000000000000000000E7 -:10F9200000000000000000020002000000000000D3 -:10F9300000020000000000000402000000000000BF -:10F9400000000000000000000000000000000000B7 -:10F950000000000000040000880000000000090012 -:10F9600020840000000000000040000000000000B3 -:10F970000000000000000000000080000000000007 -:10F980000000000000000000000000000000000077 -:10F990000000000000000000000000000000000067 -:10F9A0000000000000000000000000000000000057 -:10F9B0000000000000000000000000000000000047 -:10F9C00000000000008800000000020400000000A9 -:10F9D0000000000000000000000000000000000027 -:10F9E0000000000000000000000000000000000017 -:10F9F0000000000000000000000000000100009076 -:10FA000000000000000000000000000000000000F6 -:10FA100000000000000000000000000000000000E6 -:10FA200000000000000000000000000000000000D6 -:10FA300000000000000000000000000000000000C6 -:10FA400000000000000000000000000000000000B6 -:10FA500000000000000000000000000000000000A6 -:10FA60000000000000000000000000000000000096 -:10FA70000000000000000000000000000000110075 -:10FA800021800000000000000000000000000000D5 -:10FA90000000000000000000000000000000000066 -:10FAA0000000000000000000000000000000000056 -:10FAB0000000000000000000000000000000000046 -:10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000000000000000026 -:10FAE0000000000000000000000000000000000016 -:10FAF0000000000000000000000000000000000006 -:10FB000000410900000300000000000000000000A8 -:10FB100000000000000000000000000000000000E5 -:10FB200000000000000000000000000000000000D5 -:10FB300000000000000000000000000000000000C5 -:10FB400000000000000000000000000000000000B5 -:10FB500000000000000000000000000000000000A5 -:10FB60000000000004000000000000000000000091 -:10FB70000000000000000000000000000000000085 -:10FB80000000000101C0000000C0000000000000F3 -:10FB90000000000000000000000000000000000065 -:10FBA0000000000000000000000000000000000055 -:10FBB0000000000000000000000000000000000045 -:10FBC0000000000000000000000000000000000035 -:10FBD0000000000000000000000000000000000124 -:10FBE0000000000100000000000001000000000013 -:10FBF0000000000000000000000000000000000005 -:10FC000000000000000088002090000000000000BC -:10FC100000000000000000000000000000000000E4 -:10FC200000000000000000000000000000000000D4 -:10FC300000000000000000000000000000000000C4 -:10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000000000000000A4 -:10FC6000004000100011000000000000040000002F -:10FC70000000000000000000000000000000000084 -:10FC80000000000000000900000080800400050062 -:10FC90000000000000000000000000000000000064 -:10FCA0000000000000000000000000000000000054 -:10FCB0000000000000000000000000000000000044 -:10FCC0000000000000000000000000000000000034 -:10FCD0000000000000000000000000000000000024 -:10FCE0000008000000000000000400000000000008 -:10FCF0000000000000000000000000000000000004 -:10FD00000000000000000000001180110000000051 -:10FD100000000000000000000000000000000000E3 -:10FD200000000000000000000000000000000000D3 -:10FD300000000000000000000000000000000000C3 -:10FD400000000000000000000000000000000000B3 -:10FD500000000000000000000000000000000000A3 -:10FD6000000000010000000000000001008800C049 -:10FD70000000000000000000000000000000000083 -:10FD800000000000000000000000000120010088C9 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000000000000043 -:10FDC0000000000000000000000000000000000033 -:10FDD0000000000000000000000000000000000023 -:10FDE00000000000810000E000000000810A00E047 -:10FDF00007000000000000000000000000000000FC -:10FE0000000000000000000000000000000000E012 -:10FE1000070081000000000000000000000000005A -:10FE200000000000000000000000000000000000D2 -:10FE300000000000000000000000000000000000C2 -:10FE400000000000000000000000000000000000B2 -:10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 -:10FE8000000000000000000000000000000000FF73 -:10FE9000000000FF00000000000000000000000063 -:10FEA0000000000000000000000000000000000052 -:10FEB0000000000000000000000000000000000042 -:10FEC0000000000000000000000000000000000032 -:10FED0000000000000000000000000000000000022 -:10FEE0000000000000000000000000000000000012 -:10FEF0000000000000000000000000000000000002 -:10FF000000000000000000000000000000000000F1 -:10FF100000FF000000FF00000000000000000000E3 -:10FF200000000000000000000000000000000000D1 -:10FF300000000000000000000000000000000000C1 -:10FF400000000000000000000000000000000000B1 -:10FF500000000000000000000000000000000000A1 -:10FF60000000000000000000000000000000000091 -:10FF70000000000000000A0A0A0A00000000000059 -:10FF80000000000000000000000000000000000071 -:10FF900000000000FF000000FFFF00000000000064 -:10FFA0000000000000000000000000000000000051 -:10FFB0000000000000000000000000000000000041 -:10FFC0000000000000000000000000000000000031 -:10FFD0000000000000000000000000000000000021 -:10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 -:020000040031C9 -:1000000000000000000000000000000000000000F0 -:10001000000000000000FF000000000000000000E1 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000000000000A0 -:10006000000000000000000000000000000000612F -:100070000006C009000000610036C00D000000004D -:100080000000000000000000000000000000000070 -:1000900000000000000015602A06054C00A80000C2 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 -:1000F0000000000000F0FFF0000000000000000021 -:1001000000000000000000000000000000000000EF -:10011000000000000000000000000000FFFF0000E1 -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:1001700000000000000000F0FFF0000000000000A0 -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F -:1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE -:10022000F0F00000000000000000000000000000EE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A0000000F0F00000000000000000000000006E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E -:1002F000000020002000000000000000000020009E -:10030000000000000000000000000000000000806D -:10031000000020002000000000000000000020007D -:1003200000000000000000000000000000000000CD -:10033000000100002000200000000000000000007C -:10034000200000000000000000000000000000008D -:10035000000000002000200000000000000000005D -:10036000200000000000000000000000000000006D -:10037000000000000000000000000000000000007D -:1003800000820000000000000000000000000000EB -:10039000004040000000000000004000000000009D -:1003A000000000000000000000000000000000004D -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D -:1003F00000000000000000000000000002001000EB -:1004000020002000000000000000000000000000AC -:1004100000000000000000000000000002000000DA -:1004200002000400000002000000020000000000C2 -:1004300000000000000100000000000000000000BB -:1004400000000000000000000200000004000000A6 -:100450000000000000000000040000000000000098 -:100460000000000000000400000000000000000088 -:100470000400000000000000000000000000000078 -:1004800080008000800000000000000000000000EC -:100490000000000000000000000000000000040058 -:1004A00000000000000000820000000800000000C2 -:1004B000000800080000000000000000000000002C -:1004C000000000000000000000080000000800001C -:1004D000000000080008000000000000000000000C -:1004E00000000000000000000008000000080000FC -:1004F00000000008000800000000000000000000EC -:10050000000000000000000000000000008000105B -:1005100000000008A0088241002100000000000047 -:100520000000000000008200000800000000000041 -:1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000000AB -:10055000000000000000000000000000000000009B -:10056000000000000000000000000000000000008B -:10057000000000000000000000000000000000007B -:10058000000000000000000000000000000000105B -:1005900000010000000021004100000000000000F8 -:1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B -:1005F00000000000000000000000000000000000FB -:1006000000000000000000000000040000000004E2 -:100610000009010200000000000282410000000009 -:1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A -:10066000000000000000000000000000000000008A -:10067000000000000000000000000000000000007A -:1006800000000000000000000000000080000000EA -:100690000000210020000000000000000000000019 -:1006A000000000000000000000100000000000003A -:1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000040000000000000000000BA -:1007000000000000000000000000000000000000E9 -:1007100020210000000090000000000000000041C7 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:1007800000000000000000000000000000840000E5 -:1007900000000000000000880000000000000000D1 -:1007A0000000000000002100000000000000000028 -:1007B00000C0000000000084008400000000000071 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 -:1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000000000000F9 -:1008000000000000000000000000000000000000E8 -:10081000900004000008900590084000000000408F -:1008200002000000000000000000000000000000C6 -:1008300000000000000000000000000000000000B8 -:1008400000020002000000000000000000000000A4 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 -:1008900000000000800000000000000000000900CF -:1008A0000001A00003400000000000000000000064 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000009000090110040000000000000000000FD -:1009100000000000100000000010A0400082C00491 -:1009200000C004400082C00400000000000000007D -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 -:1009900000000000000089000000000004800080CA -:1009A0008000008000800000800000000000000047 -:1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000000000000000017 -:1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 -:100A10000000000000000000000080000000000056 -:100A20000020800000008000800580800000000021 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000010000A5 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A900000000000000002000000000090000200C2 -:100AA000A0C0A001040084000400040004020000AF -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000001D4 -:100B2000C01000A100A00083C084000400040004E1 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000001000000000000000000000000000094 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000100002000241 -:100BA0000041808000210000001180000080008052 -:100BB00000800000000000000000000000000000B5 -:100BC0000000000000000000000000000000000025 -:100BD0000000000100000000000000000000000014 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000090000CB -:100C200000000000000000040000000000000004BC -:100C30000080000000000000000000000000000034 -:100C400000000000000000000000000000000000A4 -:100C50000000000000010000000000000000000093 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA000000000C0000000000001008800000000FB -:100CB000000100C000000000000000000000000073 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000001000000000000000013 -:100CE0000000000000000000000000000000000004 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D2000814200C807000000480000E04200418204 -:100D3000000000004200600600000000000000000B -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000020838 -:100EB00000000084200001080000008420000000E1 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F20000000000000000000000000003C3CFFFF4B -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB000C3C30000000000000000000000000000AB -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:101020000000000000000000000000000061003728 -:10103000C008000000610006C00900003000400048 -:101040000000000C00000000000000000000000094 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B0000000CDAA578200000000F0F0FFFF000002 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF -:1011300000000000CDAA57820000000000000F0F41 -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F -:1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000000BE -:1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E -:1012B000000000000000000000000000100000001E -:1012C000000000000000010000000000000000001D -:1012D0000000000000000000000088002000000066 -:1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000020002000AE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000002000AD -:101320000000000000000000008000000000000439 -:1013300000000000000000000000000000000000AD -:101340000000000000000000020000900002000009 -:10135000000000000000000000000000000000008D -:1013600000000000000000004000000040000002FB -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A00000000000000000000000004000000000FD -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000002000000DA -:10141000004000000000000000000000000000008C -:1014200000000000000000000000000000000200BA -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:101460000000000000080000000000000000000074 -:101470000000000000000000000000000400000068 -:10148000000000000008000800000000000000004C -:10149000000000000008000000000000000800003C -:1014A000000000000008000800000000000000002C -:1014B0000000000000080000000000000000000024 -:1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C -:1014E00000000000000800030000000000000000F1 -:1014F00000000000000800000000000000000000E4 -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000000000000000000080000000000840F -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:1015700000820000000000000000000000000000E9 -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B0000000000000000000000008000000000023 -:1015C0000040004000000004824000000040000095 -:1015D000000000000000A009000200000000000060 -:1015E00000000000000000000000000000000004F7 -:1015F00000400000000000000000000000000000AB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000800040000000000AE -:1016300000000000000000000000000000000000AA -:10164000000000000000000000000000000000009A -:101650000000200009001100000000000000000050 -:10166000000000000000000000000000000000007A -:101670000000000000000000000000000000040066 -:10168000000000000000000000000000000000005A -:10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B0000000000000000000000000000000040026 -:1016C000000000000000000000000000C000080052 -:1016D0000000C000A0000000000000000000002189 -:1016E00000410000000500000000000000000000B4 -:1016F00000000000000000000000000000400000AA -:1017000000000000000000080000000000000000D1 -:1017100000000000000000000000000000000000C9 -:101720000400000000000000000000000000C000F5 -:1017300000000000C00000000000000000000000E9 -:101740000000000000000000000000000000000099 -:101750000000000000000004000000000000000085 -:101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D000080082000000020000000000000000007D -:1017E00000020000000000000000000000000000F7 -:1017F00000210000000000000000000000000000C8 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000002840000000002 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000C0C088 -:1018E00000A00002840200000000000000000000D0 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940002020002000A08284000000000000000091 -:101950000000000000000000000000000000000087 -:101960000000000000800080000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C00000002000000000000000000000000000F7 -:1019D0000000000000000000000000000000000007 -:1019E0000000000000C08000008000000000000037 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A400000000000000000A00080800000000000F6 -:101A50000000000000000000000000000000000086 -:101A6000000000009000C083108290100000000071 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC00000000000000020002082104008C000003C -:101AD0000000000000000000000000000000000006 -:101AE000000000000000040200A0040820A0000084 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B400000000000000000001002002040081040CB -:101B50000000000000000000000000000000000085 -:101B600000000000000000008080000080000000F5 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000800000000095 -:101BD0000000000000000000000000000000000005 -:101BE0000000000000000000000080208000008055 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000008014 -:101C50000000000000000000000000000000000084 -:101C600000000000000000000000000010012088BB -:101C700040400200000000000000000000000000E2 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000A00074 -:101CD0008810A08802000000000000000000000042 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000FFF0F00ABA10B010000000000000000EE -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000D782D782EA4AE040000000000000FD -:101DE00000000000000000000000000000000000F3 -:101DF000000055C355C3FBF15B510000000000001B -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E5000000000005F5F0A0AEF4FE5450000000048 -:101E60000000000000000000000000000000000072 -:101E700000000000F000C3AA0AFA0AFA00000000FD -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED000000000000000F000C3AA202C232F000007 -:101EE00000000000000000000000000000000000F2 -:101EF000000000000000F0FFC3AAC0C0CFCF000068 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000F0FFC3AAE0ECE3EF87 -:101F60000000000000000000000000000000000071 -:101F700000000000000000000000000000C00000A1 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD000000000000000000000000000000000C041 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000840084000000C6 -:1022100000000000000000000000000000000000BE -:10222000000000000000000000000000200020006E -:10223000000000000000000000000000000000009E -:10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E -:10227000000000000000000000000000400000001E -:10228000000000004000000000000000000000000E -:10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE -:1022F000000000000000004000400000000000005E -:1023000000000000000000000000000000000000CD -:10231000000000000000000000000000000000407D -:1023200000000000000004000000000000000000A9 -:10233000000000000000000000000000000000009D -:10234000000000000200000000000000000000008B -:10235000000000000000000000000000000000007D -:10236000000000000000000000000000000000006D -:10237000000000000000000000000000020000005B -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000002000000000000000000000000002B -:1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D -:1023D00000000000400000000000000000000000BD -:1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000000CC -:1024100000000000000000000000000000000000BC -:1024200000000000000000000000000000000000AC -:10243000000000000000000000000000000000009C -:10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C -:10247000000000000000000000000000000000005C -:102480000000000000000000000003000000000049 -:10249000000000000000000000000000000000003C -:1024A000000000000000000000000000000000002C -:1024B000000000000000000000000000000000001C -:1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000003000300000000000000E6 -:1024F0000000000000000000000000400800000094 -:10250000000000000000000000000000000000408B -:1025100000000000004000000040000000000040FB -:10252000000000000000000000000000000000406B -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B -:10255000000000000000000008000800000000006B -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:1025800000000000000000000900200020402000A2 -:102590000000000000002004000000000000000017 -:1025A00000000000004000000200000000000000E9 -:1025B000000000000000000000000000000000001B -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA -:1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA -:10263000000000000000000000000000000000009A -:10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:10267000000000000000000000000000000000005A -:10268000000000000000000000000000000000004A -:102690000000000000000000118840000000000061 -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A -:1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F00000000000000000000000000400020000D4 -:1027000000000000000000000000000000000000C9 -:1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 -:102740000000000000000000000000000000000089 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:1027900000000000110000000000000020004004C4 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C00000000000000000000000400000000000C9 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:102840000000000000000000000000000000000088 -:102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 -:102880000000000000000000000000000000000048 -:102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 -:1028B0000000000000000000000000000000000018 -:1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000000000F8 -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 -:1029000000000000000000000000000000000000C7 -:1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:102940000000000000000000000000000000000087 -:102950000000000000000000000000000000000077 -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:102990000000000000000000000000000000000037 -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 -:1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 -:102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000000000076 -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 -:102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD00000000000000000000000000000000000F5 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E20000000820000000000000000000000000020 -:102E30000000000000000000000000000000000092 -:102E40000000000000000000020000000000000080 -:102E5000020000000000000000000001000000006F -:102E6000000000000000000000002004000000003E -:102E70000000000000000000000000000000400012 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA000000000000000000000020002000000001E -:102EB0000000000000000000000000000000000012 -:102EC0000000000040000000400000000000000082 -:102ED0000000000000000000009000000000000062 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F2000000002000041044100200080020008006F -:102F30000000004000000000000000000000000051 -:102F40000000000000000000000000000000000081 -:102F50000000000000410000000000000000000030 -:102F60000000000000000000000000000010000051 -:102F70000000000000000000000000000000000051 -:102F8000000000000000000000000000000002003F -:102F9000000000000000000000000000000002002F -:102FA0000000000000000000804000010340830892 -:102FB000800800C0000100000000000000000000C8 -:102FC00000000000000000000000000000000040C1 -:102FD00000400000020000000000000000000008A7 -:102FE00000000008000000000008000000000200CF -:102FF00000080000000000000000000000000000C9 -:1030000000080008000000000008000000000000A8 -:10301000200400000000000000000000000000008C -:103020000008000000000000000000000000000098 -:1030300000000000000000000000A00000000200EE -:1030400082020008000000000008000000000000EC -:103050000008000000000000000000000000000068 -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A000000082000000000000000000000000009E -:1030B0000000000000000000000000000000000010 -:1030C0008000000000000000000000000000000080 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF -:103120000000000000000000000000000004000497 -:1031300000400040100400080040000000000000B3 -:10314000000000000000000000000000000000007F -:1031500000000000004000000000000000400002ED -:10316000000000000000000000000000000000005F -:1031700000000000000000090000004000000020E6 -:10318000000000000000000000000000000000003F -:10319000000000000000100000000000000000001F -:1031A000000000000000000000000000000000001F -:1031B000000000000004000000000000000000000B -:1031C00000000000000000000000000002000000FD -:1031D00000000000000000000000000020000000CF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000010000000AE -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000400000000008A -:103240000005000000000000000000000000000079 -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000800000008E -:1032C0000000000000000000000400A0000000005A -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:103330000000000000000000000000000000042168 -:103340000000000000210040000000000008000014 -:10335000000000410002000000000000000000002A -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B00000000000000000000000000020000000ED -:1033C0008000000400000000000100000000000078 -:1033D00000000000000000000800000000000000E5 -:1033E0000040000000000004000000000000000099 -:1033F00000000000000000000000000000000000CD -:1034000008000200000000000800000000000000AA -:1034100000000000000000000000000000000000AC -:103420000800000000000000000000000000000094 -:103430000000000000000000000000C00090000438 -:10344000000200000000000000000082A040008296 -:103450000208000000000000000000000000000062 -:10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000008000800C -:1034C0000000000000000000000000000500008077 -:1034D000008080800000000000000000000000006C -:1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:1035400000110080000000000010000000000000DA -:1035500000A10002000000000000000000000000C8 -:10356000000000000000000000000000000000005B -:10357000000000000000000100000000000000004A -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C0000000000000880000000000000000000073 -:1035D0000400A0828201848200000000000000003C -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A -:10363000000000000000000000000000000000008A -:1036400000000800000000008800000000000000EA -:10365000000005C000A0848200840000000000007B -:10366000000000000000000000000000000000005A -:103670000000000000000000000000010000000049 -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000800000000000800009000000F1 -:1036D00000000000C1000000000000000000000029 -:1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000000010000C9 -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 -:103740000000000000008011800000008000800068 -:1037500000000000000000200002808080000000C7 -:103760000000000000000000000000000000000059 -:103770000000000000000000000000000000000148 -:103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C0000000000000000000C0012000040008000C -:1037D000C0008800880010008201A001400208009B -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000010000000000000000000000000000B7 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000070071 -:103850000000000A00000700000000000000420015 -:103860004200000000000000000000000000000016 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C0000000000000000000000000003F30F6F69D -:1038D000000000000C0C0FFF0000000000000000C2 -:1038E00000000000000000000000000000000000D8 +:1038A0000000000000000000000000008000000098 +:1038B0000090000000C04000000000000000000078 +:1038C0000000200400004000000080000000000014 +:1038D0000900C1000040400000000002000040025A +:1038E0000000410200000000000000000000000095 :1038F00000000000000000000000000000000000C8 :1039000000000000000000000000000000000000B7 :1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:1039400000000000000000000000000000003F3008 -:103950000606000000000C0C00F000000000000053 -:103960000000000000000000000000000000000057 +:103920000000000000000000000000000000004057 +:103930000040000000000040004000400040004007 +:1039400000400040004000091040004000000040DE +:1039500000000040004000400040000001400040E6 +:103960000040004000400000000000000000000097 :103970000000000000000000000000000000000047 :103980000000000000000000000000000000000037 :103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000084000008420000000000000000000EB -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 +:1039A000000000000000000000000008000000000F +:1039B00000010001000000080001000100010001F9 +:1039C00000010001000100010000000500010000ED +:1039D00000010000000100110001000100040201CB +:1039E00000010009000100090000000000000000C3 +:1039F00000000000000003000000000000000000C4 +:103A00000011000900030021000000000000000078 +:103A1000000000000000000800000000000000009E :103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A500000006C6C0FFF0000000000000000000080 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 +:103A30000000000000000000020000000002004042 +:103A40000021002100050021001100400021000894 +:103A50000240002100400021000400008405904045 +:103A60000041000800218421A02100000000000086 +:103A70000000000000000000A000000000000000A6 :103A80000000000000000000000000000000000036 :103A90000000000000000000000000000000000026 :103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD000000000006C6C00F000000000000000001E -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 +:103AB0000200000000000000000000000000000004 +:103AC00040090000000000000000000000010000AC +:103AD000000000010082410100000001000041409F +:103AE000410108000000000021000000000000006B +:103AF0000000000000000000010000800000000045 :103B000000000000000000000000000000000000B5 :103B100000000000000000000000000000000000A5 :103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B50000000000000001000200000000000A50090 -:103B60000030000000003000000000C00000000035 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 +:103B30000000000000000000000020002000000045 +:103B40000000A00000000021004020800040000490 +:103B5000C0400004A004004100418803200000058B +:103B600000000000820000100000080000000000BB +:103B70000000000000000000000020000020000005 +:103B800000C0000000000000000000000000000075 :103B90000000000000000000000000000000000025 :103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 -:103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 +:103BB000000000A00000000000A0000080008000C5 +:103BC00000A00000000000A002A000A080040010DF +:103BD0000000000000A00000000000000000808243 +:103BE00000A003A0080000A0000800A00010000032 +:103BF000200000000000900000002000000400846D :103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 +:103C1000000000080000000000000000000000009C :103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 +:103C30000000200000000000000000000000000460 +:103C400000020003000084002000000340008221E5 +:103C500000020003C0218408202100000000102180 +:103C600010418441901008080040001000080040F6 +:103C7000900800000000000000000000800000012B +:103C80000021000000000000000000000000000013 :103C90000000000000000000000000000000000024 :103CA0000000000000000000000000000000000014 :103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 +:103CC0000000004000000000000000000000800034 +:103CD0000000000002080000030000400000000097 +:103CE000000000000000000000000000008800004C +:103CF0000008080000000000000000000100210092 +:103D000000800100000000410009001100000000D7 :103D100000000000000000000000000000000000A3 :103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 +:103D30000000000000000000000000210000000062 +:103D40000000090021081021000084000005000582 +:103D5000C00084218305000584210021000500089E +:103D60002011C1A1014100210021100010050021F6 +:103D7000020500210805008200000000000020C0AC +:103D8000A0C0110420C000002100000000000000BD :103D90000000000000000000000000000000000023 :103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD0000000000000000000000000008200000061 -:103DE00000000000000000000000000000000000D3 -:103DF0004000000000008200000000008800000079 -:103E000002000000020000000000000000000200AC -:103E10002000000000000000000000000000200062 -:103E20004000200000002000880000008800000002 -:103E30002000200000000000000000000200C00080 -:103E400020002000880020002000000020008800C2 -:103E50002000200000000000000010000000000012 -:103E60000000400000000000000000000000000012 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 +:103DB00000000084000000000082000000000000FD +:103DC00000000500200020A100000000000000000D +:103DD0000000000800002008000000080010000893 +:103DE000000000042004200800000004000000007F +:103DF00000002000090020880000000000000000F2 +:103E0000109000A0A1A188A0000000000000000008 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000100000000000081 +:103E400000000000C100400000000505001100094D +:103E5000200910100108082010081010020204099F +:103E60000408101001041088020440410008C088B2 +:103E70000808408501084088020400000000000096 +:103E800000009110008040900083000000000000BE :103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000020010 +:103EA0000000000000000000000000000000000012 :103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000410000000000400040004000000000D1 -:103EF00000080000000000000000000000000000BA -:103F00000000000000400000004000000000000031 -:103F10000000000000410000000000000000000060 +:103EC00000000000090021008000000010080088A8 +:103ED00000840090008008808000808000118510A0 +:103EE00080838082918021800000000080C0108447 +:103EF00000040284809010830009C0840000000048 +:103F00000000000091882140848284110003000099 +:103F100000000000000000000000000000000000A1 :103F20000000000000000000000000000000000091 :103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000008000000000000000049 -:103F700000080000008400C00000000000C008002D -:103F800000000000000000C000000000020000006F -:103F90000008008400000000000000000000000095 -:103FA00000000000000000080000000000080008F9 -:103FB00000000040000002080000000000000000B7 -:103FC00000000000000800080000000000080008D1 -:103FD00000000000000000080000000000000000D9 -:103FE0000000000000410000000000000000000090 -:103FF0000000000000000000000000000000900031 -:1040000000000000000000080003000000000000A5 +:103F400000000000000082801000081188830080BB +:103F500080A0008080848880108982118988020076 +:103F600088C102A00088898010A1109189841080E6 +:103F700085C1918990A00900408909A0888000002E +:103F8000000000000000919104032008900300004D +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC000000000000000000010409000030109C143 +:103FD000200810C0084008C0114088C0049111C1D9 +:103FE00010C011C0030990C0104088C0401109C022 +:103FF000040808C0080410C0201011C0C00408C084 +:104000000000000000000000C0892188C00908905D :1040100000000000000000000000000000000000A0 -:104020000000000000000008000000000000000088 +:104020000000000000000000000000000000000090 :104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 -:1040600090000000000000000000000000000000C0 -:104070000000000000000000000000A000000000A0 -:104080000084000000000000008400000000000028 -:104090000000000000000000000000000000000020 +:104040000000000000000000000000C0001100039C +:104050000101A1100010C008040805900010C00262 +:10406000101091040002C109020983020010C089E6 +:10407000820411030009C189820811100008C08957 +:10408000080900000000000000008021908309A1C1 +:10409000820000000000000000000000000000009E :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F0000000000000000000880000000000000038 -:10410000000000000000000082000000000000002D -:104110000000900000008800000000402000000027 -:104120000000820000000000820000000000820009 -:1041300000000000000000000000000000008200FD -:10414000A0000000000000000000080000000000C7 -:10415000000000000000000000000000000000005F -:10416000000000000000000000002000000000002F -:10417000110000000000000000000000000020040A -:1041800000000020200000100004080000000000D3 -:1041900000004002000009000200000000000000D2 -:1041A00000000002080000000000002005001000D0 -:1041B0000300410000000000000000000000008833 -:1041C00000000000000000000000000005000800E2 -:1041D00003000500000000000000000000000000D7 -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000008000000000000000000088E -:104220000000000000000000000000000000080086 +:1040C0000000000000000000000000000010008858 +:1040D000008311084180110082808080C11000900F +:1040E0008010000341000920C0A180824190008916 +:1040F00080108011C18420C084218083410204800B +:104100008421A0C00000000000000000A110204198 +:10411000A080030300000000000000000000000079 +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000008041822C +:10415000119005000203A10004008080C00041020C +:10416000838010001108A109040041800010410261 +:10417000029108001111210090880000C011210255 +:1041800040804100C0040000000000000000A104C5 +:104190008904A0C00400000000000000000000002E +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000008E7 +:1041D0000184001001020001110002020808090018 +:1041E00009201010038811011100029088080801AD +:1041F000A190881089880500A10808038888090013 +:10420000110890828888090000000000000000006A +:10421000484200600600410A000000000000000063 +:10422000000000000000000000000000000000008E :10423000000000000000000000000000000000007E :10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:104270000000000000000000000000000000000836 -:1042800000A000000000000000000000000000008E -:10429000000000000000000000000000000000001E +:104250000000810000E000000042000000000000BB +:104260004842810000E000004842000000000000D9 +:104270004842810000E000004842000000000000C9 +:10428000484200000000000048420000000000001A +:10429000000060000000BEFFFFFF00000000000003 :1042A000000000000000000000000000000000000E :1042B00000000000000000000000000000000000FE :1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:104310000000000300000000000000080000000092 +:1042D00000000000000000000CFC0CFCFFFF008050 +:1042E000C3E3C3C38282F2823C3E000A0F2F0F0F4A +:1042F0005575555500820F8FBCA03C0000820F8F72 +:10430000BCA03C000A0A0ACBBA30AA000000000098 +:104310000000000000000000FAFFFFFF00000000A6 :10432000000000000000000000000000000000008D :10433000000000000000000000000000000000007D -:10434000020000000000000000000000000000006B -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:1043700000000000000002080088000000000000AB -:1043800000080900000000000000000020000000FC -:1043900000000000000020400000020011000000AA -:1043A00009080300004000000000000008000000B1 -:1043B0000000000000000000080000000888030062 -:1043C0000000034011000888000000000000000009 -:1043D000000000000000000008000002088808003B -:1043E0000200082003000800000002000000000096 -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C +:10434000000000000000000000000000000000006D +:10435000000000000000000000000CFC0CFC0080CD +:10436000008000A00000828282823C3C0000002885 +:1043700000000030000000000F0F3C003C00000077 +:104380000F0F3C003C000A0A0A0AAA00AA0000001B +:104390000000000000004040C24077EFFFFF000037 +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000028282F2836 +:1043E00001FF00FFF000F414CB0A0A0A08080000DD +:1043F00003005755D3C35000F141F00000000404FE +:10440000D350505003000000BA30303000000C0090 +:1044100000000000000000007C7CFE7CFFFE77EFC7 :10442000000000000000000000000000000000008C :10443000000000000000000000000000000000007C :10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C +:10445000000000000000000000000000000028280C +:10446000282801010000F000F0000A0A0A0AFF08EB +:10447000FF0000005555C3C30000F000F000FF002E +:10448000FF04505050505755555530303030555529 +:104490005D5500000000000000000061303FC00DCD +:1044A00000A100000000000000000000000000006B :1044B00000000000000000000000000000000000FC :1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B +:1044D0000000000000000000000000000061000675 +:1044E0008021100240618006002D1002406180068C +:1044F0008021100240618006002D1002406180067C +:104500008021100240618006002D1002406180066B +:10451000002D100200000000000000007F80FF005E +:104520000081008100000000000000000000000089 :10453000000000000000000000000000000000007B :10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B +:10455000000000000000000000000000000000F06B +:10456000C3AA2000203CBEFF00000000000000FFA6 +:10457000F0F0FFFB3038F5FF000000000000C0C085 +:10458000A0AF00281038BEFF000000FF0043FEFF70 +:10459000000000D700FF0000000000000000807F46 +:1045A00000FF00810081000000000000000000000A :1045B00000000000000000000000000000000000FB :1045C00000000000000000000000000000000000EB :1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A +:1045E000FFF0C3AAEFC3EFFFFFFF000000000000D1 +:1045F000C3C3AAAACFCB0008FFFF0000000500003C +:10460000CFCFA0AFD7FFD3FBFFFF000000FF005FBD +:10461000FEFF000000FF00FF00000000000000009F +:10462000000000000408102000000000000000004E :10463000000000000000000000000000000000007A :10464000000000000000000000000000000000006A :10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A +:104660000000000000000010A0B000E000EB00001F +:10467000000000000000EFFFA0B080A082AA0100AF +:104680000100000000007FFF20F000C200FA0707D1 +:1046900007008082A0AACF004500000000000000B3 +:1046A0000000000080800102408000000000000047 :1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 +:1046E00000000000000000005F1FFFBFE0E0EBEBF8 +:1046F00000000000000000004F5F0010C0F0C3FF8A +:1047000001000100000000007F0F2000C2C2FAFA81 +:10471000D7D7D700C0C3F0FFCFCF4545000000007A :104720000000000000000000000000000000000089 :104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 +:104740000000000000000000000000000100000068 +:104750000000000000000000010000000003000055 +:104760000000000000000000000020000100000028 +:104770000000000001000000C00000000200000076 +:104780000000000000000000000401000100000023 +:10479000000000000000018801004080208200002D :1047A0000000000000000000000000000000000009 :1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 +:1047C00000000000000000000000000000000200E7 +:1047D00000000000000000000000200000000000B9 +:1047E0000000000000000000000000008000200029 +:1047F0001100000000002000000000000000800008 +:104800000000000000000000000000002000200068 +:104810000000009000000000200310008008080540 :104820000000000000000000000000000000000088 :104830000000000000000000000000000000000078 :104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 +:104850000000000000000000000001000000000057 :104860000000000000000000000000000000000048 :104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 +:104880000000000000000000000000080000000020 +:104890000100000000080008000000000000000007 :1048A0000000000000000000000000000000000008 :1048B00000000000000000000000000000000000F8 :1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 +:1048D00000000008000000000008000802000000BE +:1048E00000080000000000000008000000000000B8 +:1048F00000000000000800000000000800080000A0 +:104900000000000800000000000800840000000013 +:1049100000001000000800840000080800080004DF +:104920000008000800000000000000000400000073 +:1049300000000080000000000000000000080000EF :104940000000000000000000000000000000000067 :104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 +:1049600000000000000000210100000000080021FC +:104970000004010000030021012100210041000981 +:10498000010801000040002100080021004100054D +:1049900000000008000300210021202100210080E8 +:1049A0004000848810400000000000001182800058 +:1049B00000000000002000080000000000000000CF :1049C00000000000000000000000000000000000E7 :1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 +:1049E00000000000000000000000020000000008BD +:1049F000110005002000030000A00202030003C014 +:104A00000000208220A0004000A000A000A0030819 +:104A1000118841000008110009A000A083000310C4 +:104A20000008A1C003048390000000000000000003 +:104A30004000000000000100000000000000000035 :104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 +:104A50000000000000000000000000400000000016 +:104A60000000000000402021000000410021204003 +:104A70002000000000000000000000000000208076 +:104A80002000000020000080000000000000200046 +:104A9000200000400000081189000041001020059E +:104AA000200000C000808400000000000000000022 +:104AB00000008000000000000490000000000000E2 :104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 +:104AD00000000000000000000000000000010000D5 +:104AE0000000000000000001800000000000000045 +:104AF000800180000000000011000300008200001F +:104B000080048000008200000004000040A000A09B +:104B100089A0890800840084008420C0001005104A +:104B2000800480000040004021A0008400000000BC +:104B3000000000000180058001A00180000000004D +:104B4000000000080000000000000000000000005D :104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 +:104B600000000000200040000004000000000041A0 +:104B700040000004000900A10000000400A1204141 +:104B80000200002102050000000400A1002100082D +:104B9000000882210004010001009004004100414E +:104BA000004100212010000008880000002100843E +:104BB0000000000000C00410840208030802000086 +:104BC000000000000000030000000084000000005E :104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 +:104BE0000000000000000000800000010000000044 +:104BF000000080000001000005400000008500402A +:104C00000082001002828400008805090940218486 +:104C100000001110030011090200020200A1058426 +:104C200000000010000880840200090400001184C4 +:104C300000008800000000000003000000000000E9 +:104C40000040000400020005000000000000000811 +:104C5000000000000008000000000000000000004C +:104C600000000000000000000000000000050090AF +:104C7000000000210011002100A100050221000513 +:104C8000000502210008002182850080010400083F +:104C900000050021000501210108000000030010AB +:104CA00000050121C121882100050000000500C187 +:104CB00001050000000000000000000000000000EE :104CC00000000000000000000000000000000000E4 :104CD00000000000000000000000000000000000D4 :104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D200000000000000084000000000000000000FF -:104D30008800880084008800000000000000000057 -:104D400088000000000020000000820000008800B1 -:104D500088008880000320000000000000000000A0 -:104D60000000200000008400820088002000000075 -:104D70000000040021880000880000000000880076 -:104D800000000000000020000000200000000000E3 -:104D900000000000200800000000000000000000EB -:104DA0000000009000000000000000000000400033 -:104DB0000000404000000000000000000000000073 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000800000000000000000000CB -:104DE00000000000000000000000200000000000A3 -:104DF000000000000000100400000000000000009F -:104E000000000000000000000000000000000000A2 -:104E10000000000000002001000000000000000071 -:104E20000000000000000000000000000000000082 -:104E3000000000000000000500000000000000006D -:104E40000000000000000000000000000000000062 +:104CF00000400000000000000000004000008000B4 +:104D0000000000008000000000000004414002019B +:104D1000090000000090200002A002402082201024 +:104D2000090000A002C002A00000050000C00008A9 +:104D3000004002840000000000000000C0A09001BC +:104D4000A0C1000100000000000000000000000001 +:104D50000000000000000000000000000000000053 +:104D600000000000C0000000000002000910000860 +:104D700040880202000103101090400282080408DB +:104D800091A0880888040210010888028808020996 +:104D9000008900099008409003108202880804C02E +:104DA00021100808100802101110020490080809C8 +:104DB000008590089008000000000000000011111C +:104DC000800400030011000000000000000000004B +:104DD00000000000000000000000000000000000D3 +:104DE000000000000000800000000000000089803A +:104DF000108080000000000009809000800080800A +:104E00000080210080800000000021808000008060 +:104E100091C10010009100899100218080000080E4 +:104E20001100A100808080801180A180000011808D +:104E300088C12182858300840000000000000000FA +:104E400091008411848404A0000000000000000090 :104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E700000000040000000000000000000000000F2 -:104E80000000000000000000000000000000000022 -:104E90000000000000400000008000000000001042 -:104EA00000000000000000000000000000C0000042 -:104EB0000000008800080000002000840000008836 -:104EC00000000000000000000000000000000000E2 -:104ED0000000000000A0000800000000000000002A -:104EE00000000000000000000000000000000000C2 -:104EF0000000000000000000002000000000000092 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000040008002164 -:104F20000005002100000000000200000000002138 -:104F300000000021000000000000100900210021F5 -:104F400000410010000000000000000500030021E7 -:104F50000000000000000000000020000000000031 -:104F600000050000000000000000000000410000FB -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB0000000000000000000000000008000000071 -:104FC00000000000000000000000000000000000E1 -:104FD000000000000000000000000300800000004E +:104E60000000000000000000000000008000008042 +:104E7000888082880991098900008880C188898298 +:104E80008983A09188900991098391800291109162 +:104E90008988058002A18980918809800282829197 +:104EA0008989890009A109919083118009A18991BB +:104EB0008989A004C084A084C19100000000000082 +:104EC000000008040511A140A10900000000000035 +:104ED00000000000000000000000000000000000D2 +:104EE0000000000000000000000090000200080028 +:104EF00088C0091010C1020889C00000091008C14B +:104F0000200809C1091011C1880889C1104002C0D8 +:104F1000900909C1900802C0080808C1034002C0F6 +:104F2000084109C008904082A10808C102400282DD +:104F3000419109C009A111C0090909C00000000080 +:104F4000000000000085012011A101010000000007 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000010002011 +:104F70000088000809100004C08810900000031089 +:104F80000082C0021108C1080020C0A00908031057 +:104F90000088C0021108C1100120C00810080310C9 +:104FA0000020C0021109900800A0C00911080210D9 +:104FB0000088C00391089111A003C10911090000E4 +:104FC000000000000000024003A1042104080000CA +:104FD00000000000000000000000000000000000D1 :104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000008000000A9 -:10500000000003000000000000000000000000009D -:105010000000000000000000000000000000000090 -:105020000000000000002000000020002000900090 -:1050300000002000000082000000820082000400C6 -:10504000000000000000820000008200400090008C -:105050000000000000008200400082009000080074 -:1050600000000000A000040082008200A000820076 -:10507000A000000082000000820082008200820006 -:1050800082000000A000A000820082008200820056 -:1050900082000000820000008200900082008200F6 -:1050A000820000000000000000000000000000007E -:1050B0000088000000000000000000000000000860 -:1050C00000000000000000000000000000000000E0 -:1050D0000300000000004000000000000000081075 -:1050E00008000000000000000000000000000000B8 -:1050F000000000000000000000000000210000008F -:105100000000000008000000000000000000000097 -:10511000080000000800000000000000000000007F -:10512000000004000000000000000000000000007B -:10513000000000000000000000000000000000412E -:10514000000000A1000000000000000000000000BE -:105150000000000000000000000000000000A0416E -:10516000000082210000C0000000C000000000001C -:10517000C00000000000000000000000000000006F -:10518000000000000000000000000000000000001F -:105190000000000000000000080000000000000007 -:1051A00000000000A000000000000000000000005F -:1051B00000000000000000000000000000000000EF -:1051C00000000000000400000000000000000000DB -:1051D00000000000000000000000000000000000CF +:104FF000008000000080C1020021800900830000C1 +:1050000041020091800211834189008980109191B1 +:1050100041020010801011824100118083800080C5 +:105020004102009080021183418900098085099026 +:1050300041020002800589904120210482A004C120 +:105040000000000000000000A09140894080200383 +:105050000000000000000000000000000000000050 +:105060000000000000000000000000000000000040 +:105070000002000000000000C18904000880111037 +:1050800000004104030003008910C19082090580DB +:105090008903410483050900890388890300090005 +:1050A00082084102100909809104C1400800418032 +:1050B00089114104204103109105C108201103000A +:1050C000A091000000000000000091C1A1A089088B +:1050D000C10000000000000000000000000000000F +:1050E00000000000000000000000000000000000C0 +:1050F0000000000000100020000009088810890846 +:10510000C100000003028910100208000908821083 +:1051100011080801038883041004080109A0A010E5 +:1051200005C00801C1108911108409000991890482 +:1051300010080800030220111188090109038911D0 +:105140001120091100000000000000000011000003 +:105150000600410000000000000000000000000008 +:10516000000000000000000000000000000000003F +:10517000000000000000000000004242820000E049 +:10518000000048420000810000E000004842820028 +:1051900000E000004842810000E000004842480072 +:1051A00000E000004842480000E000004842820061 +:1051B00000E000000042810000E0000082420000A8 +:1051C00000E0000048420000000000000000FFFF77 +:1051D000FFFFF7FBF7FB00000000000000000000ED :1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:105220000000000000000008000000050008000069 -:105230000000000400040000000000040000000062 -:10524000004100080408820040008200A000A00283 -:10525000A0000000000000000000080000000004A2 -:105260000004400208080000000008000800A00038 -:105270004002A0000005000020008800000400009B -:10528000000000000800042008000800A000000042 -:10529000A000A000000000000000000000000000CE -:1052A0000800C0000000080004000000000000002A -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE +:1051F00000000000000000000000BFBFBF20BD2D68 +:10520000FF0FB4BDB4240000F978FF3CBDFFB4F03B +:10521000F978FF3CE4E4E724F0F0E724BDFFB4F0C4 +:10522000F978FF3C36663FFFF978E1603FFF36666C +:10523000F9E1FFC3E7FFE4F0F0F07E42B4F0BDFF18 +:10524000F978FF3CB4F0BDFF000000000000000052 +:10525000FFFFFFFEF7FBF7FB00000000000000006F +:10526000000000000000000000000000000000003E +:1052700000000000000000000000000020BF20200F +:10528000B424F000F0FFF0000000E160C30024004F +:10529000B4F0E160C300F0F0FF00E724E72424004D +:1052A000B4F0E160C30036663000FF3CC30030005C +:1052B000366678603C002400E4F07E427E42B4F022 +:1052C0002400E160C300B4F02400000000000000EE :1052D00000000000000000000000000000000000CE :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE :10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D -:10532000000000000000000000002100000100015A -:10533000000100C10001000100C100850000000162 -:10534000000200100001000100C100000001000186 -:10535000000100C00001A00100C0014100010101E5 -:10536000008200100001000100C1000000000001E7 -:105370000001000100C00001A00100C00183000085 -:105380000101002000840001000100C000000001B4 -:105390000001000100C00001A00100C00183000065 -:1053A0000101002000200001000100C000000041B8 -:1053B0000041004100840041004100844041001050 -:1053C0001141000000800041004100A000000041A8 -:1053D0000041004100C00041004100C004410040C4 -:1053E0000341000000800041004100A000000000D7 -:1053F00000410041004100C00041004100854041A2 -:1054000000412041000000000041004100C00000B8 -:1054100000410041004100C00041004100A0404166 -:1054200000410841000000000041004100C00000B0 -:1054300041000300000000804100890000001000CE -:1054400002000280008084004100C1000000800052 -:1054500041000300000000804100850000000300BF -:1054600008001180008084004100C100000080001D -:10547000000341000300000000804100850000009F -:1054800003000200400000A085004100C1000000B0 -:10549000000041000300000000804100C000000047 -:1054A0000300020010000020A0004100C100000025 -:1054B000000001000100000000C00100C000000069 -:1054C00000008400A0080008C0000300C10000A084 -:1054D000080001000100000000C00100C000000041 -:1054E0000100A100A0080008C0848300C10000A042 -:1054F0000800000001000100000000C00100C00021 -:1055000000000100A10083400009C0004100C1006B -:105510000040400001000100000000C00100C00088 -:1055200000000100A100A1820041C1004100C100B2 -:105530000040400000C00001C0C1000000000001A8 -:1055400000C0A0890009000100C1000000000001A6 -:105550000001000000C00001C0C100000000000107 -:1055600000C104830009000100C100000000000127 -:1055700000010000000000C00001C0C100000000E8 -:10558000000100C140A00021000100C10000000096 -:1055900000010000000000C00001C0C100000000C8 -:1055A000000100C120A00003000100C100000000B4 -:1055B0000001000000000080004180C100000000E8 -:1055C000004100C1000300C1004100C10000000013 -:1055D0000041002000000080004180C10000000068 -:1055E000004100A080A000C1004100C100000000F7 -:1055F00000410020000000000080004180C1000048 -:105600000000004100A000030041004100C1000073 -:1056100000000041004000000080004180C1000007 -:105620000000004100A000050041004100C103004E -:105630000000004100400000C100800080C1000067 -:105640004104004002004100C141000080400000D0 -:105650004100000080004100C100800080C10000C6 -:105660004140804082004100C1C1000080400000F4 -:1056700041000000800041000000C100800080C1A6 -:1056800000004140800082004100C1C10000804014 -:1056900000004100000080004100C100800080C186 -:1056A00000004100800002004100C1C18000804034 -:1056B00000004100000080004100C1004000C0C166 -:1056C000000001018401C1000100C1050200C00108 -:1056D000000001000000C0000100C1004000C0C186 -:1056E00000000100200105000100C1050200C00109 -:1056F000000001000000C00001000000C1004000E7 -:10570000C0C100000100200003000100C1058400A9 -:10571000C001000001000000C0000100C100400005 -:10572000C0C1000001000400C1000100C1058200E9 -:10573000C001000001000000C000010000000000E6 -:10574000000000420000000000000000811200483C -:1057500007004800000000000000000000000000FA -:10576000000000420000000000000000811200481C -:1057700007004800000000000000000000000000DA -:105780000000000000420000000000000000811244 -:105790000048070048000000000000000000000072 -:1057A0000000000000420000000000000000811224 -:1057B0000048070048000000000000000000000052 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000000F0FF0F07FFFEFFF00000000E3 +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000FFF63C362427E4E724E72727000006360B +:10539000C6F624E7272766FF6CFC24E427E706C649 +:1053A00036F6F7F704F73CFF36F63C36FFF60636DE +:1053B000C6F6F7F704F7C3C6FFF624E72727427EB1 +:1053C0000F0FFFF63C36C3FFC6F6FFE70F270000BE +:1053D0000000000000000F0FF0F0FFFFFFFF0000D3 +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000063C36000FF0FF00FF0F0F000009 +:10541000003CC3FF00FF0F0F00990C9C00F00FFF32 +:1054200000C33CFF040404F700C306C63C36000674 +:10543000003CC3FF040404F700063C3600FF0F0FD6 +:10544000427E427E00063C36003C063600240F2792 +:10545000000000000000000005610A3E050D00A0EC +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:105480000000000000201002406180068021100210 +:10549000000040618006802110024061800680216A +:1054A0001002406180068021100240618004802546 +:1054B0001002406180068021100240618006802138 +:1054C0001002406180068021100240008007002CFD +:1054D00010020000000000000000EFFEDFFD969FBC +:1054E00099F900000000000000000000000000002A +:1054F00000000000000000000000000000000000AC +:1055000000000000000000000000C0CFA0A0EFEFEE +:1055100020E0000000C3B2B2EFEF202CC0C082BE7A +:105520002020202C30F382822020202CF5A0F4F4BF +:1055300000000000F0F000FF00102838B2B2003C7C +:1055400000300838F0F000FF00300838FFE1FFFFBE +:10555000FFFF4DFF0000000000000000FEEFFFDF36 +:10556000969F99F900000000000000000000000074 +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000C0CFAFAF2E +:10559000EF2F202000003CFFB2B2EFE32020FCFC04 +:1055A00082BEEFEFE3EF30F3BEBEEFEFE3EFF5A027 +:1055B000E0E000000000C3C3AAAAD7D3FFFBB2B249 +:1055C000C3FFC7F7CFFFC3C3AAAAC7F7CFFFFFE147 +:1055D000000000004DFF000000000000000000007F +:1055E00040007EDBFFFF0000000000000000000024 +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A +:1056100000003F3A303A0000000000003F3A303AC4 +:10562000000000007D78287800000000FFAF30A067 +:10563000C0FC828200A0303000000000FF3FA0309C +:105640000000000000300838000000000BFB08F8E4 +:1056500000005555FFFF4DFF000000000000000056 +:1056600000000000FFFFDBFD000000000000000064 +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:1056900000000000FFFF0000000000000000FFFF0E +:1056A000000000000000FFFF000000000000CFAF7E +:1056B00000A0C0FCBEBEFFAF3F3F000000005F3F48 +:1056C000003000000000C7F7CFFF00000000FFFF20 +:1056D000000000C0555500004DFF00000000000014 +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000080000000000000091 +:105710000000000000000000000000020000000087 +:105720000000000000000000000000000000000871 +:10573000400000800000000001050105000000801D +:1057400011000100010021000100200800000010EC +:10575000010505030000000000000000000000003B +:105760000000000000000000000000000000000039 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:105790000000000000000000000000000000080001 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000000200000000200020000000A7 +:1057C0001010200020002000C00020048082000073 +:1057D00000002000A0000000000000000000000009 :1057E00000000000000000000000000000000000B9 :1057F00000000000000000000000000000000000A9 :105800000000000000000000000000000000000098 @@ -202169,247 +193975,247 @@ :105860000000000000000000000000000000000038 :105870000000000000000000000000000000000028 :105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 +:1058900000000000000000000000000000001000F8 +:1058A00000000008000000080000000000000000E8 :1058B00000000000000000000000000000000000E8 -:1058C0000000757B000000000000000000000000E8 -:1058D00000000000000000000000000000000000C8 -:1058E000DEAE757B0000000000000000000000003C +:1058C0000088000800000008000000000000000040 +:1058D00000000008000400000008000000000000B4 +:1058E00000000000000000000000000000000000B8 :1058F00000000000000000000000000000000000A8 -:10590000DEAE0000757B000000000000000000001B +:105900000000000800000008000000000000000087 :105910000000000000000000000000000000000087 -:105920000000DEAE757B00000000000000000000FB -:105930000000000000000000000000000000000067 -:105940000000DEAE60C60300000000000000003171 -:10595000E0000000000000000C000000000000005B -:1059600000C0630660C603000000000000000031B4 -:10597000E0000000000000000C000000000000003B -:1059800000C06306000060C60300000000000000C5 -:105990000031E0000000000000000C0000000000EA -:1059A000000000C0630660C60300000000000000A5 -:1059B0000031E0000000000000000C0000000000CA -:1059C000000000C0630600000000000000000000AE -:1059D00000000000000000000000000000000000C7 -:1059E00000000000000000000000000000000000B7 -:1059F00000000000000004000000000000000200A1 -:105A0000000000000400000000000000840084008A -:105A100000000000880000002000000002000000DC -:105A20002000000000002000000000000000200016 -:105A3000840000002000000088000000200000001A -:105A40002000000000002000000000000000000016 -:105A50004000000000000000000000000000000006 +:105920000000000000000000000000000000000077 +:10593000000008000000000010000000000040000F +:1059400000000000000000000000900420000100A2 +:1059500000030103000902000100C1090000C000AA +:105960000008A0000000000000000000000000008F +:105970000000000000A0000000A0000000000000E7 +:105980000000000000000000000000000000000017 +:1059900000000200000000000000000000100010E5 +:1059A00000000040000040104110000000100010F6 +:1059B000001000100010001041100010000800102E +:1059C00000C0001000100010001000002111001095 +:1059D0002010411020100084000204100410001058 +:1059E0000010001000100000000000000000000087 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000100010000056 +:105A30000000000002000000000000000000000064 +:105A40000000200082002000000000000000000094 +:105A500001000000000000000000008020000000A5 :105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000050021 +:105A70000000000000000000000000000000000026 :105A80000000000000000000000000000000000016 :105A90000000000000000000000000000000000006 :105AA00000000000000000000000000000000000F6 :105AB00000000000000000000000000000000000E6 -:105AC00000000900000000000000000000000000CD -:105AD00000000000000000000000000800000004BA -:105AE00000000000000000000000000000000000B6 +:105AC00000000000000000000000000000000000D6 +:105AD0000000200000000900000002840010808205 +:105AE0002102000400020084000000000000000009 :105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 :105B10000000000000000000000000000000000085 -:105B2000000000000000000000000000000000086D -:105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B500000820082008200080000000800000000AF -:105B60000088000800840004000000000008000015 -:105B70000000000000080008000000080008000005 -:105B8000008800C0000000000000000000000008C5 -:105B900000000000000000080008000000080008E5 -:105BA00000000000000000000000000000000008ED -:105BB00000000000000000080008000000080008C5 -:105BC00000000000000000000000000000000008CD -:105BD0000000000000410021000000000003000060 -:105BE00000000000000000100000000000000000A5 -:105BF0000000000000000010000000000000000095 -:105C00000000000000000000000000000000000094 +:105B200000000000000090000000000200000000E3 +:105B30000000400000000003C00008000008200032 +:105B40000000000000000000010301000000000848 +:105B500000802100900090002000000000009008CC +:105B6000090810800010004104830180000000003B +:105B7000000000C00084000000000084000000005D +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000084000081 +:105BA0000000118400840088000400080000020442 +:105BB00000040004000020C0001000C000840002A7 +:105BC000111000C00082411011C0200220100002FC +:105BD00020080004200802000008800811040000CA +:105BE000000020C0A00402820008A12004200000C0 +:105BF0000000000000000000000000000000004065 +:105C00000000000000020000000000000000000092 :105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 -:105C600000000000008400080000000000000000A8 +:105C2000000000000000001100000000000800005B +:105C30000011000000000000000000000000000053 +:105C40000000000000000003000000000000200031 +:105C5000001000100000000088080005001040102F +:105C60000004001104080400004100100041040079 :105C70000000000000000000000000000000000024 :105C80000000000000000000000000000000000014 -:105C900000000000000000000000210000000300E0 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000008000800000000000800CC -:105CC00021000000000000000000000000000000B3 -:105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 -:105D0000000004000000000000000000000040004F +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000001000000000E4 +:105CB00000000000000000000000000000000010D4 +:105CC00000000000000000000000000000000000D4 +:105CD0008000000000000000000000002004200000 +:105CE00000000000410082888000000400000000E5 +:105CF0008000000000000000000000000000000024 +:105D00000000000000000000000000000000000093 :105D10000000000000000000000000000000000083 :105D20000000000000000000000000000000000073 -:105D300000000000400000000000000040000000E3 -:105D400000000000080000004000000040000000CB -:105D500000000000000010820010000000000000A1 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 +:105D30000000000000000000000000110000000052 +:105D40000000000000000000040000000000A100AE +:105D50004000000000A0418404840084000101018F +:105D60000801000102C00582C188100402C000C001 +:105D700000C0C09000000000000000000000000013 :105D80000000000000000000000000000000000013 :105D90000000000000000000000000000000000003 :105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 -:105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000008BB -:105DE00000000000000000000000000800000000AB -:105DF00000000000000000000000000000000000A3 +:105DB0000000000000020000000000000090000051 +:105DC00000000000000000000300000000000400CC +:105DD0002100800000000000A10000000000002061 +:105DE0000403820200020080218011008000808074 +:105DF0000000000000800000000000000000000023 :105E00000000000000000000000000000000000092 :105E10000000000000000000000000000000000082 :105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E600000A0000000000000000000000000000092 -:105E700000A0000000000000000000000000000082 -:105E80000010000000000000000000000000000002 +:105E30000000000000000000000000000000001052 +:105E40000000000000000000000004000300020049 +:105E50000980040040110903090020000911090309 +:105E60000402040040401121898008009140A0856F +:105E70008000000000008000000000000000000022 +:105E80000000000000000000000000000000000012 :105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 -:105EC000000000000000000000000300000000844B -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 -:105EF0000000000000000010000000000000000092 +:105EC00000010000000000000000000000000000D1 +:105ED0000100004000000101010100040100000177 +:105EE000010101030000010000050204890008010E +:105EF000839102000400A0000800000000000000E0 :105F00000000000000000000000000000000000091 -:105F100000000000000000000000000082000000FF +:105F10000000000000000000000000000000000081 :105F20000000000000000000000000000000000071 :105F30000000000000000000000000000000000061 -:105F4000000004000000000000000000000000004D -:105F50000000000000000000000900000000000038 -:105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 +:105F40000000000000000000000000000001000050 +:105F5000A001000000010000040001018400000015 +:105F60000001830000004000010100014005002005 +:105F700090081189C0040282900483100000000080 :105F80000000000000000000000000000000000011 :105F90000000000000000000000000000000000001 :105FA00000000000000000000000000000000000F1 :105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 +:105FC0000000000000000000000000000000004091 +:105FD00000418002000000200009000411030004B9 +:105FE000000400209109001010044021402080206E +:105FF0000089808991830000808080008980000072 :106000000000000000000000000000000000000090 :106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 :106030000000000000000000000000000000000060 :106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 +:10605000000000000000000241840304200004034B +:1060600041404021050004400921082104000308A3 +:106070004189032104800441000200C100000000A6 :106080000000000000000000000000000000000010 :106090000000000000000000000000000000000000 :1060A00000000000000000000000000000000000F0 :1060B00000000000000000000000000000000000E0 :1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 +:1060D000000000000000000000000141010001007C +:1060E0000001010301000100000100A10100010005 +:1060F000010101C0010200400000000000A00004F6 :10610000000000000000000000000000000000008F :10611000000000000000000000000000000000007F :10612000000000000000000000000000000000006F :10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F +:1061400000000000000000880A0048000000000075 +:10615000000000000000000000000000810000E0DE +:1061600000000000480000E000000000480000E0DF +:1061700000000000821100E00700420000810000E2 +:106180000700000000000000000000000000000008 :1061900000000000000000000000000000000000FF :1061A00000000000000000000000000000000000EF :1061B00000000000000000000000000000000000DF :1061C00000000000000000000000000000000000CF :1061D00000000000000000000000000000000000BF :1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E +:1061F000000000000000000000003F3F30300000C1 +:1062000000002F2B2F3F00000000000000000000C6 :10621000000000000000000000000000000000007E :10622000000000000000000000000000000000006E :10623000000000000000000000000000000000005E :10624000000000000000000000000000000000004E :10625000000000000000000000000000000000003E :10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E +:10627000000000000000000000000000FFAF00A0D0 +:1062800000000000070307170000000000000000E6 :1062900000000000000000000000000000000000FE :1062A00000000000000000000000000000000000EE :1062B00000000000000000000000000000000000DE :1062C00000000000000000000000000000000000CE :1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D +:1062E00000000000000000000000000002000000AC +:1062F0000000000000000000000030F328285FCFFD +:1063000050C0F0F000FFAFA3ACA000000000000000 :10631000000000000000000000000000000000007D :10632000000000000000000000000000000000006D :10633000000000000000000000000000000000005D :10634000000000000000000000000000000000004D :10635000000000000000000000000000000000003D -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D +:106360000000000000000000000000000000A0008D +:1063700000000000000000000000000030F3EBEB24 +:10638000C3C3C3C3C3C3AAAAAEA2AEA20000000087 :1063900000000000000000000000000000000000FD :1063A00000000000000000000000000000000000ED :1063B00000000000000000000000000000000000DD :1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C +:1063D000000000000000000000000000000000615C +:1063E0000006000D00000061000680010000006151 +:1063F00000068001000000610007800D00000061C0 +:106400005026800100000000502000000000000025 :10641000000000000000000000000000000000007C :10642000000000000000000000000000000000006C :10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C :10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C +:10646000000000000000000000C3B2B200A0282815 +:10647000E1E100550030083800FF007D005F004F6B +:1064800028EB3030000028780000000000000000F9 :1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC :1064D00000000000000000000000000000000000BC -:1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B +:1064E000000000000000400040003CFFB2B2FFF599 +:1064F0007D7DE1E1AAFFC7F7CFFF00FF007800FF35 +:1065000000CF28EBF3F3FFFF7D78000000000000D0 :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B +:106560000000000000000000050000000000000026 +:106570001FBF10B000000000F3F330302B2BEBEB0B +:10658000CF45000000000000414D717D000000007B :1065900000000000000000000000000000000000FB :1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A +:1065E00000000000000000000000050000000000A6 +:1065F00000005FFF00A000000000D7FF0028E0EFD0 +:10660000E0EFCF45CF45000000004545757500001F :10661000000000000000000000000000000000007A :10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A +:106630000000000001430000000000000000000016 :10664000000000000000000000000000000000004A :10665000000000000000000000000000000000003A -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A +:10666000CC840101050009860A1A13A45E001000FB +:1066700010100000C04088800200000404000014D4 +:10668000080000000000000004006000040000009A :1066900000000000000000000000000000000000FA :1066A00000000000000000000000000000000000EA :1066B00000000000000000000000000000000000DA :1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA +:1066D00000000000000000000002000000000000B8 :1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 +:1066F0000000000000000000000000080010000082 +:106700000000000000000000000300800080008006 +:106710000080000000830000000000000000000076 :106720000000000000000000000000000000000069 -:106730000000000000000000000000000000000059 +:106730000000000000000002000000000000000057 :106740000000000000000000000000000000000049 :106750000000000000000000000000000000000039 :106760000000000000000000000000000000000029 :106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 -:1067900000000000000000000000000000000000F9 +:10678000000000000000000000000084000400047D +:106790000002000400820010000000000000000061 :1067A00000000000000000000000000000000000E9 :1067B00000000000000000000000000000000000D9 :1067C00000000000000000000000000000000000C9 @@ -202424,170 +194230,170 @@ :106850000000000000000000000000000000000038 :106860000000000000000000000000000000000028 :106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 +:1068800000000000000000000088000000880000F8 +:1068900000000000000800000000000800000000E8 :1068A00000000000000000000000000000000000E8 :1068B00000000000000000000000000000000000D8 :1068C00000000000000000000000000000000000C8 :1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000000A8 +:1068E0000000000000000000000000000000840024 :1068F0000000000000000000000000000000000098 :106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 +:10691000000000000000200000000200000000084D +:10692000000800000000000000000000000000005F :106930000000000000000000000000000000000057 :106940000000000000000000000000000000000047 :106950000000000000000000000000000000000037 :106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 -:106980000000000000000000000000000100000006 -:1069900001800190000000000000000000000000E5 -:1069A00000000000000000000000000000000000E7 +:106970000000008200000000000000000010000085 +:106980000000000000000000001000000084000073 +:106990000008008200880084800000820000000857 +:1069A000001000880000000000000000000000004F :1069B00000000000000000000000000000000000D7 -:1069C00000000000000100000000000000000000C6 +:1069C00000000000000000000000000000000000C7 :1069D00000000000000000000000000000000000B7 :1069E00000000000000000000000000000000000A7 :1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000040082 -:106A10000000104004100000000000000000000012 -:106A20000000000000000000000000000000000066 +:106A00000000000000000000000000000000200066 +:106A1000900088000000000000000000000000005E +:106A20000000000001000000000000000000000065 :106A30000000000000000000000000000000000056 :106A40000000000000000000000000000000000046 -:106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 +:106A50000000000000000000200000000000000016 +:106A60000000000020000000000000000084000082 +:106A70000008002000080090000000000000000056 :106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 +:106A900000000000000000002000000000000000D6 +:106AA0000000000000A040200000000000000000E6 :106AB00000000000000000000000000000000000D6 :106AC00000000000000000000000000000000000C6 :106AD00000000000000000000000000000000000B6 -:106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 -:106B0000000000000000000000000008000000403D -:106B100000080040000800080000004000080000D5 -:106B20000008000800080000000800080008000035 -:106B300000840008008200080008000800840008A3 -:106B4000008200840008000800080000000800849B -:106B50000000000800080000000800080008000805 -:106B60000008008400080008000800080008000869 -:106B700000000008000800000008004000080008AD -:106B8000000800000008000800080040000000089D -:106B900000000000000000000000C0030000000032 -:106BA00000000000000300000008000000000000DA +:106AE00000000000000000000000000000000100A5 +:106AF000000000000000000000000000000000088E +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000A008CD +:106B2000000000000003A00200410000000000007F +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B6000000200000000008800000000000000009B +:106B70000800000000000000000000000000008489 +:106B800000000000000000080000000000080000F5 +:106B900000000008008800C000A000C000820010B3 +:106BA00000000010000000000000000000000000D5 :106BB00000000000000000000000000000000000D5 -:106BC00000000008000000000000000000000000BD -:106BD000000800000000001000000000000000009D -:106BE00000050000000000000000000000000000A0 -:106BF0000000000000050000001000000000000080 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000A000080008C4 -:106C20000000000000000000000000000000000064 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000000000000000000A5 +:106BF000000000000000000000000008000000008D +:106C0000000000000000000000080000000000007C +:106C100000000000000090000000200000000008BC +:106C200020004000000000000010000000050000EF :106C30000000000000000000000000000000000054 :106C40000000000000000000000000000000000044 :106C50000000000000000000000000000000000034 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 +:106C60000000000000000000000020902000000054 +:106C700000042000200000000000000000000000D0 :106C80000000000000000000000000000000000004 :106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 +:106CA000000000000000000800000000000000A03C :106CB00000000000000000000000000000000000D4 -:106CC0000080000000000000000000000000000044 +:106CC00000000000000000000000000000000000C4 :106CD00000000000000000000000000000000000B4 -:106CE00000000000000001000000000000000000A3 +:106CE00000000000000000000000000000000000A4 :106CF0000000000000000000000000000000000094 -:106D00000000000000000000000000000000010082 -:106D100000000000008200000000000800000000E9 -:106D20000040000000000000000000000000000023 -:106D30000000000000000000000000000000000053 -:106D400000000040000800000000000800000000F3 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000010001018300000082A0104000105B +:106D30000804000000000000000000000000000047 +:106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 -:106D6000000000000000000008000000000000001B +:106D60000000000000000000000000000000000023 :106D70000000000000000000000000000000000013 :106D80000000000000000000000000000000000003 -:106D90000800000082000000000000000021000048 -:106DA00000000000000000000008000000000000DB -:106DB00000000000000000000000000800000000CB +:106D900000000000000000000000000000000000F3 +:106DA0000000000020042108040500090080000004 +:106DB00000808000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 :106DD00000000000000000000000000000000000B3 :106DE00000000000000000000000000000000000A3 :106DF0000000000000000000000000000000000093 :106E00000000000000000000000000000000000082 :106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 +:106E200000000000000008021100054111A100113E +:106E3000800480808000000000000000000000004E :106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 :106E60000000000000000000000000000000000022 :106E70000000000000000000000000000000000012 :106E80000000000000000000000000000000000002 -:106E9000000000000000000000000000840000006E -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 +:106E900000000000000000000000000000000000F2 +:106EA000000000000000000001030000010000A03D +:106EB00002000400A00482000000000000000000A6 :106EC00000000000000000000000000000000000C2 :106ED00000000000000000000000000000000000B2 -:106EE0000000000000000080000000000000000022 -:106EF00000000000002100800000000000000000F1 -:106F00000000000000000000000800000000000079 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 :106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000008000000000000000000000000000039 +:106F2000000000000000000000000001050000005B +:106F30000100100200C00088A088000000000000CE +:106F40000000000000000000000000000000000041 :106F50000000000000000000000000000000000031 -:106F60000000000000000000001000000000000011 -:106F70000000000000000000001000000000000001 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 :106F80000000000000000000000000000000000001 :106F900000000000000000000000000000000000F1 -:106FA00000000000010120010000000000000000BE -:106FB00000000000000000000000000000000000D1 +:106FA0000000000000000000000000000021202080 +:106FB0000411401080A000040002800000000000C6 :106FC00000000000000000000000000000000000C1 :106FD00000000000000000000000000000000000B1 :106FE00000000000000000000000000000000000A1 :106FF0000000000000000000000000000000000091 :107000000000000000000000000000000000000080 :107010000000000000000000000000000000000070 -:10702000000000000000114180020020004000002C -:107030000000000000000000000000000000000050 +:107020000000000000000000000000000000050457 +:1070300004000000024000000010808000000000FA :107040000000000000000000000000000000000040 :107050000000000000000000000000000000000030 :107060000000000000000000000000000000000020 :107070000000000000000000000000000000000010 :107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000002000800080C0 -:1070B00000000000000000000000000000000000D0 +:1070A00000000000000000000000000000000000E0 +:1070B00000210100000000008400024008828200DC :1070C00000000000000000000000000000000000C0 :1070D00000000000000000000000000000000000B0 :1070E00000000000000000000000000000000000A0 :1070F0000000000000000000000000000000000090 :10710000000000000000000000000000000000007F :10711000000000000000000000000000000000006F -:10712000000000000000000000002000000000043B -:1071300000820000000000000000000000000000CD +:10712000000000000000000000000000000000005F +:107130000000810000E000000000000000000000EE :10714000000000000000000000000000000000003F :10715000000000000000000000000000000000002F :10716000000000000000000000000000000000001F :10717000000000000000000000000000000000000F :1071800000000000000000000000000000000000FF :1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000100DE -:1071B00002000000000000000000000000000000CD -:1071C00000000000000000000000000000000000BF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000041D143D3A7 +:1071C0000083009F0000000000000000000000009D :1071D00000000000000000000000000000000000AF :1071E000000000000000000000000000000000009F :1071F000000000000000000000000000000000008F :10720000000000000000000000000000000000007E :10721000000000000000000000000000000000006E :10722000000000000000000000000000000000005E -:1072300010008300000000000000000000000000BB -:10724000000000000000000000000000000000003E +:1072300000000000000000000000000000006DFDE4 +:107240006FFF83839F9F000000000000000000008C :10725000000000000000000000000000000000002E :10726000000000000000000000000000000000001E :10727000000000000000000000000000000000000E :1072800000000000000000000000000000000000FE :1072900000000000000000000000000000000000EE :1072A00000000000000000000000000000000000DE -:1072B00080008000000000000000000000000000CE +:1072B00000000000000000000000000000000000CE :1072C00000000000000000000000000000000000BE :1072D00000000000000000000000000000000000AE :1072E000000000000000000000000000000000009E @@ -202595,150 +194401,150 @@ :10730000000000000000000000000000000000007D :10731000000000000000000000000000000000006D :10732000000000000000000000000000000000005D -:107330000000C0004000200020000000000000000D -:10734000000000000000000000000000000000003D +:10733000000000000000000000000000000000004D +:1073400000000000000000F900F100000000000053 :10735000000000000000000000000000000000002D :10736000000000000000000000000000000000001D :10737000000000000000000000000000000000000D :1073800000000000000000000000000000000000FD :1073900000000000000000000000000000000000ED :1073A00000000000000000000000000000000000DD -:1073B00000000000000000E00700000000000000E6 -:1073C00000000000000000000000000000000000BD +:1073B00000000000000000000000000000000000CD +:1073C000000000003F2FFFEF00FF00F3000000006F :1073D00000000000000000000000000000000000AD :1073E000000000000000000000000000000000009D :1073F000000000000000000000000000000000008D :10740000000000000000000000000000000000007C :10741000000000000000000000000000000000006C :10742000000000000000000000000000000000005C -:10743000000000000000AAF03CFF00000000000077 -:10744000000000000000000000000000000000003C +:1074300000000000000000000000000000000061EB +:107440000007800D000000610006000D0000000034 :10745000000000000000000000000000000000002C :10746000000000000000000000000000000000001C :10747000000000000000000000000000000000000C :1074800000000000000000000000000000000000FC :1074900000000000000000000000000000000000EC :1074A00000000000000000000000000000000000DC -:1074B0000000000000000000AAF03C0000000000F6 -:1074C00000000000000000000000000000000000BC +:1074B00000000000000000000000000000000000CC +:1074C0007D003C00F5FFA50F000000000FC30FC3B7 :1074D00000000000000000000000000000000000AC :1074E000000000000000000000000000000000009C :1074F000000000000000000000000000000000008C :10750000000000000000000000000000000000007B :10751000000000000000000000000000000000006B :10752000000000000000000000000000000000005B -:107530000000000000000000000000000000C3C3C5 -:10754000C3C30000000000000000000000000000B5 -:10755000000000000000000000000000000000002B +:10753000000000000000000000000000000000004B +:10754000000055000000FDFFAD0F000000000FC35C +:107550000FC3000000000000000000000000000059 :10756000000000000000000000000000000000001B :10757000000000000000000000000000000000000B :1075800000000000000000000000000000000000FB :1075900000000000000000000000000000000000EB :1075A00000000000000000000000000000000000DB :1075B00000000000000000000000000000000000CB -:1075C000C3C3C3C3000000000000000000000000AF +:1075C0000000000080A0C0F00AFA03F300000000F1 :1075D00000000000000000000000000000000000AB :1075E000000000000000000000000000000000009B :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A :10762000000000000000000000000000000000005A -:107630000000000000000000000000000000102119 -:107640000002000D00A0000000000000000000008B +:10763000000000000000000000000000000000004A +:1076400000000000000082AAC3FF0AFA0FFF00003A :10765000000000000000000000000000000000002A -:10766000000000000000000000000010000000000A +:10766000000000000000000000000000000000001A :10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA +:1076900000000020000000030000000001000000C6 +:1076A00000000000000000080000000000000000D2 :1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D00000000000000000000000000000000000AA +:1076C00000000000000000000000000000000009B1 +:1076D0000000400004204000000000000000000006 :1076E000000000000000000000000000000000009A :1076F000000000000000000000000000000000008A :107700000000000000000000000000000000000079 -:107710000000000000000000000000000000000069 +:107710000000000000010000000000000000200048 :107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 :107740000000000000000000000000000000000039 -:107750000000000000000000000000000000000029 +:1077500000004000000080018000000000000000E8 :107760000000000000000000000000000000000019 :107770000000000000000000000000000000000009 :1077800000000000000000000000000000000000F9 :1077900000000000000000000000000000000000E9 :1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 -:1077C000000000000F0FFF0000000000000000009C -:1077D00000000000000000000000000000000000A9 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000010000000000A8 :1077E0000000000000000000000000000000000099 :1077F0000000000000000000000000000000000089 :107800000000000000000000000000000000000078 :107810000000000000000000000000000000000068 :107820000000000000000000000000000000000058 :107830000000000000000000000000000000000048 -:107840000000000000003C3C555500000000000016 -:107850000000000000000000000000000000000028 +:107840000000000000000000000000000008000030 +:107850000000000000000000000000000200000026 :107860000000000000000000000000000000000018 :107870000000000000000000000000000000000008 :1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 +:1078900000000000000000000000000020000000C8 +:1078A0009000900021002000000000000000000077 +:1078B0000000000000000000000090000000000038 :1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000000000A8 -:1078E0000000000000080000000000090000000087 +:1078D00002000000000000000000000000000000A6 +:1078E0000000000000000000000000000000000098 :1078F0000000000000000000000000000000000088 :107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 -:107920000000000000000000000000000000000057 +:1079100000000000000000000000000000000088DF +:1079200000000000000020008000000000000000B7 :107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 -:107950000000000000000000000000000000000027 -:107960000000000000000000000000000000000017 +:107940000000000000000000000000002100000016 +:10795000000002000000000000840000000002009F +:1079600000A0000000000000000000000000000077 :107970000000000000000000000000000000000007 :1079800000000000000000000000000000000000F7 :1079900000000000000000000000000000000000E7 :1079A00000000000000000000000000000000000D7 :1079B00000000000000000000000000000000000C7 :1079C00000000000000000000000000000000000B7 -:1079D00000000000000000000000000000000000A7 +:1079D000000000000000000008000000000000009F :1079E0000000000000000000000000000000000097 :1079F0000000000000000000000000000000000087 :107A00000000000000000000000000000000000076 :107A10000000000000000000000000000000000066 :107A20000000000000000000000000000000000056 :107A30000000000000000000000000000000000046 -:107A400000000000000000840000000000000008AA -:107A50000084000800000008000800080008000872 -:107A6000000800080084000800000000000800086A -:107A700000080084000000080084000800080008D6 -:107A800000080008000000000008000000080008CE -:107A900000080008000000080008000800080008AE -:107AA000000800080008000800080000000800089E -:107AB0000008000800080008000800080008000886 -:107AC00000080084000800080041000000100008C1 -:107AD000000000080000000000210000000000007D -:107AE0000000002100000000002100000000000054 -:107AF000000000210000000800410000000000001C -:107B00000000002100210000000000000021000012 -:107B10000000000000050008000000000010000048 -:107B20000000000000000000000000000005000050 +:107A40000000000000000000000000000000000036 +:107A500000000000000000000000800000000000A6 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA000000000000080000000000000000400054D +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE00000000800900002000000000000000000FC +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000065 +:107B20000000000000000020000000000000000134 :107B30000000000000000000000000000000000045 -:107B400000000000000000000000030008004100E9 -:107B500008002100000000000000000000000000FC -:107B60000000000000000000000000000000000015 -:107B700000000000000000000000000000080000FD -:107B800000000000000000000008000000000000ED +:107B40000000000000000000000000000000000035 +:107B500000000008008400000000000000A00008F1 +:107B60000000008480000000801000000000000081 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 :107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000000D5 -:107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000000000000000B5 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000000095 +:107BA00000000000000090000000000000410011F3 +:107BB00000040000000000000000002000000000A1 +:107BC00000000000000000000000000000000200B3 +:107BD0000000000000000000000000008800000815 +:107BE00000000000880000210000000800000000E4 :107BF0000000000000000000000000000000000085 :107C00000000000000000000000000000000000074 :107C10000000000000000000000000000000000064 -:107C200000000000000000000000000088000000CC +:107C20000000000000000000000000000000000054 :107C30000000000000000000000000000000000044 :107C40000000000000000000000000000000000034 :107C50000000000000000000000000000000000024 @@ -202746,147 +194552,147 @@ :107C70000000000000000000000000000000000004 :107C800000000000000000000000000000000000F4 :107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 +:107CA000000000000000C0C000100084C0100000F0 +:107CB00000000100040000000000000000000000BF :107CC00000000000000000000000000000000000B4 -:107CD000000800000000000000000000000000009C -:107CE0000000000000000000000000000000000094 +:107CD00000000000000000000000000000000000A4 +:107CE000000000000000000010C000880008001024 :107CF0000000000000000000000000000000000084 :107D00000000000000000000000000000000000073 -:107D1000000000000000000000000000000000055E -:107D2000000000000000000500000000000000004E -:107D3000000800000000000000000000000000003B +:107D10000000000000000000000000000000000063 +:107D20000000000000000000808000800080000053 +:107D300000000000210080000000000000000000A2 :107D40000000000000000000000000000000000033 -:107D50000000000000000000000003000000000020 -:107D60000000000000000000000000000000000013 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000800000008013 :107D70000000000000000000000000000000000003 :107D800000000000000000000000000000000000F3 :107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 -:107DB00000000000000000000000000000000000C3 +:107DA0000000000000000000000080000000000053 +:107DB0000080000020800400044009410000000011 :107DC00000000000000000000000000000000000B3 -:107DD000000000000810000000000041000000004A +:107DD00000000000000000000000000000000000A3 :107DE0000000000000000000000000000000000093 -:107DF00000000000880000000000000000000000FB +:107DF0000000000000000000000000000000000083 :107E00000000000000000000000000000000000072 :107E10000000000000000000000000000000000062 -:107E20000005000500050000002100050005000018 -:107E30000000400288110000000500000000000062 -:107E40000005000000000000000500000000000028 -:107E5000000800000000000000000000000000001A +:107E20000000000000000000000000000800A000AA +:107E3000A0000490000001100100000101010000F9 +:107E40000000000000000000000000000000000032 +:107E50000000000000000000000000000000000022 :107E60000000000000000000000000000000000012 :107E70000000000000000000000000000000000002 :107E800000000000000000000000000000000000F2 :107E900000000000000000000000000000000000E2 -:107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 +:107EA000000000000000000000000000000040088A +:107EB000008290048888000000000001000001009A :107EC00000000000000000000000000000000000B2 -:107ED0000000000000000000C000C100000100829E -:107EE0000100C00001000083C000C1000001008249 -:107EF0000100C00001000083C000C1000001008239 -:107F00000100C00001000083C000C1000001008228 -:107F10000100C00001000083000000000001008596 -:107F20000000000000010085000000000001008545 -:107F300000000000400000830001000000010085F7 -:107F400000000000000100850000000000000000AB -:107F5000000000000000000000008041C14100035B -:107F6000008041008021410000838041C141000325 -:107F7000008041008021410000838041C141000315 -:107F8000008041048021410000838041C141000301 -:107F90000080410080214100008300000041000377 -:107FA000008500090011000300850009001100038D -:107FB000008500090041804100820040004100032B -:107FC000008500050041000300850040000000001E -:107FD00000000000000000000000000080C1C1415E -:107FE00000410300000000410000804180C1C14108 -:107FF00000410300000000410000804180C1C141F8 -:1080000000410300008080410004804180C1C141E3 -:1080100000410300000000410000804100004100D9 -:1080200000000085898041000000008089804100B7 -:1080300080000080898941000000008283004100A7 -:1080400000000085858041000000008540000000A0 -:10805000000000000000000000000000000040C11F -:10806000400100010100000000010000820140C148 -:10807000400100010100000000010000820140C138 -:10808000400100010100000440010000820140C1E4 -:108090004001000101000000000100008201000019 -:1080A00001000000008508080100000000840808A5 -:1080B000C100C000008408080100000000838300A4 -:1080C000010000000084040401000000008540401D +:107ED00000000000000000000000000000000000A2 +:107EE000000000000000000000000008000400087E +:107EF0004010000890108802000000000000000000 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 +:107F30008080000080000080000000040020000419 +:107F4000110400000000000000000000000000001C +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000080000091 +:107F700000808005008080890090000000000000E3 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB0000000000000800080000000004108100068 +:107FC0004100090200000000000000000000000065 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF000000000000002000000000000000000007F +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:1080300000000000000000A0000800000000010592 +:10804000000000000001000000000000000000002F +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:1080700000000000000000010000000000000000FF +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B0000000000000000042000007005000000027 +:1080C000820000E00000002100000000000000002D :1080D00000000000000000000000000000000000A0 -:1080E00000000000C100C00000000000000000000F -:1080F00000000000C100C0000000000000000000FF -:1081000000000000C100C0000000000000400000AE -:1081100000000000C100C0000000000000000000DE -:10812000000000000000010008080000000001003D -:10813000080800100000010008080000000001000D -:10814000C0C00000000001000404000000000100A5 -:10815000404000000000000000000000000000009F -:10816000000000410041C1418000000000000041CA -:10817000000000410041C1418000000000000041BA -:10818000000000410041C14180000000002100C109 -:10819000000000410041C14180000000000000419A -:1081A000000000000000000041008080000000008E -:1081B00041008080008000004100808000000000BD -:1081C000410000000000000041008080000000002D -:1081D000410000000000000000000000000000005E -:1081E0000000000080410080C1C100C10041004189 -:1081F000C1C103C180410080C1C100C10041004133 -:10820000C1C103C180410080C1C100C10041004122 -:10821000C1C103C180410080C1C100C10041004112 -:10822000C1C103C1000200000000090900000000F4 -:108230000000090900000011000009894100000048 -:108240000000020200000000000005050000000020 -:10825000000040400000000000000000000000009E -:10826000000000000000400100C040C100C100014A -:10827000000140C101C1400100C040C100C1000176 -:10828000000140C101C1400100C040C100C1000166 -:10829000000140C101C1400100C040C100C1000156 -:1082A000000140C101C1000000000000000000000A -:1082B000000000000000000000000000004001007D -:1082C00000000000010100000000000000000000AC +:1080E0000000000000000000000000000000000090 +:1080F00000000000000000000081000007000000F8 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000005F +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000FFF32830F5 +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:10817000000000000000FF0F000F00000000C1FD24 +:1081800080BC0000000000000000000000000000B3 +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B0000000000000000000000000000000D7F3F5 +:1081C000003000000000000000000000000000007F +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F0000000000000000000FF0F000F0000000062 +:10820000C1FD80BC00000000000000000000000074 +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000C3F0AA00E1 +:108240008E8EBEAA000000000000000000000000AA +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:108270000000000000000000000000000000C0C07E +:10828000A0AF00000000000000000000000000009F +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B0000000000000000000000000000000C3F00B +:1082C000AAFF8E8E82AA00000000000000000000BD :1082D000000000000000000000000000000000009E -:1082E00000000000000000000000000022004842E2 -:1082F0000000000000004842000000002200484248 -:108300000000000000004842000000002200484237 -:108310000000000000004842000000002200484227 -:108320000000000000004842000048420000000039 -:1083300000004842000000000000000000000000B3 -:108340000000484200000000000048420000000019 -:108350000000484200000000000000000000000093 +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000CFCFA0AF00000000000000000000000080 +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:1083400000005020000000000000006100068001D5 +:10835000000000000000000000000000000000001D :10836000000000000000000000000000000000000D :1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED +:10838000000000615026000D000000000000000009 :1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD :1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D -:1083E000000000000000000000000000000000018C -:1083F00008800000000000000010000000000001E4 -:10840000010000000000000000000000000000006B -:1084100000800000000000000000000000000000DC -:1084200040000000000000000060000000000000AC -:10843000000014A894AA0000000014A894AA000048 -:10844000000014A814A80000000014A894AA0000BA -:10845000000014A894AA0000000014A894AA000028 +:1083C000000000000000000000000000003CB2B20D +:1083D0000030283000000000000000000000000015 +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:108400000000000000000000FFC300C300000000E7 +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:108440000000000000000000000000000000C3FF6A +:10845000B2B2D7F3FFF300000000000000000000FC :10846000000000000000000000000000000000000C :1084700000000000000000000000000000000000FC -:1084800000000000000000000000000000000000EC +:1084800000000000000000000000FFC300C3000067 :1084900000000000000000000000000000000000DC :1084A00000000000000000000000000000000000CC -:1084B0000020000000000400002000000000040074 -:1084C0000020000000000400002000000000040064 -:1084D0000020000000000400002000000000040054 +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D00000000000C1FD80BC0000000000000000A2 :1084E000000000000000000000000000000000008C :1084F000000000000000000000000000000000007C :10850000000000000000000000000000000000006B :10851000000000000000000000000000000000005B :10852000000000000000000000000000000000004B -:1085300000001004008001002008100400800100E9 -:1085400020081004008001002008100400800100B1 -:1085500020081004008001002008100400800100A1 -:1085600020080000000000000000000000000000E3 +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000FFFF00000000000000001D +:10856000000000000000000000000000000000000B :1085700000000000000000000000000000000000FB :1085800000000000000000000000000000000000EB :1085900000000000000000000000000000000000DB @@ -202899,18 +194705,18 @@ :10860000000000000000000000000000000000006A :10861000000000000000000000000000000000005A :10862000000000000000000000000000000000004A -:1086300000000000000003008000040000000300B0 -:10864000800004000000030080000400000003001C -:10865000800004000000030080000400000003000C -:108660008000040000000000000000000000000086 +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000000000001A +:108660000000000000000000000000080000000002 :1086700000000000000000000000000000000000FA :1086800000000000000000000000000000000000EA :1086900000000000000000000000000000000000DA :1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000C1DB89DB686 -:1086C0000000000C1DB89DB6000000040DB88DB36D -:1086D0000000000C1DB89DB60000000C1DB89DB632 -:1086E0000000000C1DB89DB6000000000000000056 +:1086B00000000000000000000000000000000000BA +:1086C00000000000000000000000000000000000AA +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A :1086F000000000000000000000000000000000007A :108700000000000000000000000000000000000069 :108710000000000000000000000000000000000059 @@ -202919,44 +194725,44 @@ :108740000000000000000000000000000000000029 :108750000000000000000000000000000000000019 :108760000000000000000000000000000000000009 -:1087700000000000000000000000000000000000F9 -:1087800000000000000000000000000000000000E9 -:1087900000000000000000000000000000000000D9 +:1087700000000008000000000000000000080000E9 +:108780000000000000000000000000000000008465 +:1087900000000084008400000000000000000000D1 :1087A00000000000000000000000000000000000C9 -:1087B0000000000000000000000000000000009029 -:1087C0009A000000000000909A0000000000009055 -:1087D0009A000000000000909A0000000000009045 -:1087E0009A000000000000909A00000000000000C5 -:1087F000000000000000000000000000FFFFFFFF7D -:10880000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 -:10881000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 -:10882000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 -:10883000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 -:10884000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 -:10885000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 -:10886000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 -:10887000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 -:10888000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 -:10889000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 -:1088A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 -:1088B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 -:1088C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 -:1088D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 -:1088E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 -:1088F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000008000000000008000000000000000069 +:108800000000000000000000000000000000000068 +:108810000000000001000100000000000000000056 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:10886000000000A00000000000A0000000000000C8 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000002000200200000080000AC +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 :108900000000000000000000000000000000000067 -:108910000000000000000000000000000000000057 +:108910000000000000000000010001000000000055 :108920000000000000000000000000000000000047 :108930000000000000000000000000000000000037 -:10894000000010010008000100000000000000000D +:108940000000000000000000000000000000000027 :108950000000000000000000000000000000000017 :108960000000000000000000000000000000000007 :1089700000000000000000000000000000000000F7 :1089800000000000000000000000000000000000E7 -:1089900000000000000000000000000000000000D7 +:1089900000000000000000000000020002000000D3 :1089A00000000000000000000000000000000000C7 :1089B00000000000000000000000000000000000B7 -:1089C0000000000000000012000000000000000095 +:1089C00000000000000000000000000000000000A7 :1089D0000000000000000000000000000000000097 :1089E0000000000000000000000000000000000087 :1089F0000000000000000000000000000000000077 @@ -202964,23 +194770,23 @@ :108A10000000000000000000000000000000000056 :108A20000000000000000000000000000000000046 :108A30000000000000000000000000000000000036 -:108A4000000000000000400000244004000000007E -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 +:108A40000000000000000000000000000000000026 +:108A5000000000000000000000000000000800000E +:108A600000000000000000000008000000000000FE :108A700000000000000000000000000000000000F6 -:108A800000000000000000000000000000000000E6 -:108A900000000000000000000000000000000000D6 -:108AA00000000000000000000000000000000000C6 +:108A800000080000000000000000000000000000DE +:108A9000000000000000000000000000000000A036 +:108AA000000000880000000000000000000000003E :108AB00000000000000000000000000000000000B6 -:108AC0000000000000000000000000000000008125 -:108AD0008181818100000000000000000000000092 +:108AC00000000000000000000000000000000000A6 +:108AD0000000000000000000000000000000000096 :108AE0000000000000000000000000000000000086 :108AF0000000000000000000000000000000000076 :108B00000000000000000000000000000000000065 :108B10000000000000000000000000000000000055 :108B20000000000000000000000000000000000045 :108B30000000000000000000000000000000000035 -:108B40000000000000000000000100000000000024 +:108B40000000000000000000000000000000000025 :108B50000000000000000000000000000000000015 :108B60000000000000000000000000000000000005 :108B700000000000000000000000000000000000F5 @@ -203005,29 +194811,29 @@ :108CA00000000000000000000000000000000000C4 :108CB00000000000000000000000000000000000B4 :108CC00000000000000000000000000000000000A4 -:108CD000000800000000000000000000000000008C +:108CD0000000000000000000000000000000000094 :108CE0000000000000000000000000000000000084 -:108CF0000008000000000008000000000000000064 -:108D000000000000000000080000000800840000CF +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 :108D10000000000000000000000000000000000053 -:108D20000000000000000000000000000000000043 +:108D200000000000000000000000000000008000C3 :108D30000000000000000000000000000000000033 -:108D40000000000000000021000000000000000002 -:108D5000000000000000000000080000000000000B -:108D600000000000000000050008000000000000F6 -:108D700000000000000800000000000000000000EB +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 :108D800000000000000000000000000000000000E3 :108D900000000000000000000000000000000000D3 -:108DA00000000000000000000000000000000000C3 -:108DB00000000000000000000000000000000000B3 +:108DA00000000000000000000000100002000000B1 +:108DB000C0000000000000000000000000000000F3 :108DC00000000000000000000000000000000000A3 :108DD0000000000000000000000000000000000093 :108DE0000000000000000000000000000000000083 :108DF0000000000000000000000000000000000073 :108E00000000000000000000000000000000000062 :108E10000000000000000000000000000000000052 -:108E20000000000000000000000000000000000042 -:108E30000000000000000000000000000000000032 +:108E20000000000000000000000000000000001032 +:108E30000004000800000000000000000000000026 :108E40000000000000000000000000000000000022 :108E50000000000000000000000000000000000012 :108E60000000000000000000000000000000000002 @@ -203035,7 +194841,7 @@ :108E800000000000000000000000000000000000E2 :108E900000000000000000000000000000000000D2 :108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 +:108EB0000000000000800000000000000000000032 :108EC00000000000000000000000000000000000A2 :108ED0000000000000000000000000000000000092 :108EE0000000000000000000000000000000000082 @@ -203047,27 +194853,27 @@ :108F40000000000000000000000000000000000021 :108F50000000000000000000000000000000000011 :108F60000000000000000000000000000000000001 -:108F700000000000000500000000000000050000E7 -:108F800000000008000000000000000800000000D1 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 :108F900000000000000000000000000000000000D1 :108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 +:108FB00000000000000000040000000000000000AD :108FC00000000000000000000000000000000000A1 :108FD0000000000000000000000000000000000091 :108FE0000000000000000000000000000000000081 -:108FF0000000000000000008000000000000000069 +:108FF0000000000000000000000000000000000071 :109000000000000000000000000000000000000060 :109010000000000000000000000000000000000050 :109020000000000000000000000000000000000040 -:109030000000000000000000000000000008000028 +:109030000000000000000000000000000000000030 :109040000000000000000000000000000000000020 :109050000000000000000000000000000000000010 :109060000000000000000000000000000000000000 -:1090700000000000000000000000000800000000E8 -:1090800000030000000000000003000000000000DA +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 :1090900000000000000000000000000000000000D0 :1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 +:1090B00000000000000000000000F0FFF0000000D1 :1090C00000000000000000000000000000000000A0 :1090D0000000000000000000000000000000000090 :1090E0000000000000000000000000000000000080 @@ -203075,7 +194881,7 @@ :10910000000000000000000000000000000000005F :10911000000000000000000000000000000000004F :10912000000000000000000000000000000000003F -:10913000000000000000000000000000000000002F +:10913000000000000000000000000000F0FFF00050 :10914000000000000000000000000000000000001F :10915000000000000000000000000000000000000F :1091600000000000000000000000000000000000FF @@ -203091,24 +194897,24 @@ :10920000000000000000000000000000000000005E :10921000000000000000000000000000000000004E :10922000000000000000000000000000000000003E -:1092300000000000000000000000000080000000AE -:10924000000000000000000000000000000000001E +:10923000000000000000000000000000000000002E +:1092400000003C3C000000000000000000000000A6 :10925000000000000000000000000000000000000E -:1092600000000000000000000000000000020000FC -:10927000000000000000800000000002001100005B -:1092800000000000001100000000000000000000CD +:1092600000000000000000000000000000000000FE +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE :1092900000000000000000000000000000000000CE :1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000800A6 -:1092C000000000000000000000000000000002009C +:1092B00000000000000000000000000000000000AE +:1092C000000000000F0F0000000000000000000080 :1092D000000000000000000000000000000000008E :1092E000000000000000000000000000000000007E -:1092F000020000000000000040000000000000002C -:10930000A0000000000000000000000000000000BD +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D :10931000000000000000000000000000000000004D :10932000000000000000000000000000000000003D :10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D +:1093400000000000002012020000000000000000E9 :10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED @@ -203126,7 +194932,7 @@ :10943000000000000000000000000000000000002C :10944000000000000000000000000000000000001C :10945000000000000000000000000000000000000C -:1094600000000000000000000000000000020000FA +:1094600000000000000000000000000000000000FC :1094700000000000000000000000000000000000EC :1094800000000000000000000000000000000000DC :1094900000000000000000000000000000000000CC @@ -203140,8 +194946,8 @@ :10951000000000000000000000000000000000004B :10952000000000000000000000000000000000003B :10953000000000000000000000000000000000002B -:109540000000000000000000000000000000000714 -:109550000000000000000000000000000000000704 +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B :1095600000000000000000000000000000000000FB :1095700000000000000000000000000000000000EB :1095800000000000000000000000000000000000DB @@ -203149,16 +194955,16 @@ :1095A00000000000000000000000000000000000BB :1095B00000000000000000000000000000000000AB :1095C000000000000000000000000000000000009B -:1095D000000000000000000000000000000000008B +:1095D0000008000000000000000000000000000083 :1095E000000000000000000000000000000000007B :1095F000000000000000000000000000000000006B :10960000000000000000000000000000000000005A :10961000000000000000000000000000000000004A :10962000000000000000000000000000000000003A -:10963000000000000000000C00000000000000001E +:10963000000000000040004000000000400040002A :10964000000000000000000000000000000000001A -:109650000001000000000000000000000000000009 -:1096600000010000000000000000000000000000F9 +:10965000000000000000000000000000000000000A +:1096600000000000000000000000000000000000FA :1096700000000000000000000000000000000000EA :1096800000000000000000000000000000000000DA :1096900000000000000000000000000000000000CA @@ -203173,8 +194979,8 @@ :109720000000000000000000000000000000000039 :109730000000000000000000000000000000000029 :109740000000000000000000000000000000000019 -:1097500000000000100400000000000000000000F5 -:1097600000000000100400000000000000000000E5 +:109750000000000000000000000000000000000009 +:1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 :1097800000000000000000000000000000000000D9 :1097900000000000000000000000000000000000C9 @@ -203189,7 +194995,7 @@ :109820000000000000000000000000000000000038 :109830000000000000000000000000000000000028 :109840000000000000000000000000000000000018 -:109850000000000000000000000000000000000008 +:109850000000000000000000000000840000000084 :1098600000000000000000000000000000000000F8 :1098700000000000000000000000000000000000E8 :1098800000000000000000000000000000000000D8 @@ -203197,32 +195003,32 @@ :1098A00000000000000000000000000000000000B8 :1098B00000000000000000000000000000000000A8 :1098C0000000000000000000000000000000000098 -:1098D0000000000000000000000400000000000084 -:1098E0000000000000000000000400000000000074 +:1098D0000000000000000000000000000000000088 +:1098E0000000000000000000000000000000000078 :1098F0000000000000000000000000000000000068 -:1099000000000000000080000000000400000000D3 -:10991000000000040000800000000004000080003F +:109900000000000000000000000000000000000057 +:109910000000000000000000000000000000000047 :109920000000000000000000000000000000000037 :109930000000000000000000000000000000000027 :109940000000000000000000000000000000000017 :109950000000000000000000000000000000000007 :1099600000000000000000000000000000000000F7 :1099700000000000000000000000000000000000E7 -:1099800000000002000000000000000000000000D5 -:109990004000000200000000400000020000000043 -:1099A0004000000000000000000000000000000077 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 -:1099D0000000000000000000000000000080800087 -:1099E0000000000000000000000000000080800077 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 :1099F0000000000000000000000000000000000067 -:109A00000000000000000000100000000000000046 -:109A10008000000000000000900000000000000036 -:109A200090000000000000000000000000000000A6 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000000036 :109A30000000000000000000000000000000000026 :109A40000000000000000000000000000000000016 :109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000000F6 +:109A60000000008400000000000000000000000072 :109A700000000000000000000000000000000000E6 :109A800000000000000000000000000000000000D6 :109A900000000000000000000000000000000000C6 @@ -203247,19 +195053,19 @@ :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 -:109BF00000000000000000000000008400080000D9 +:109BF0000000000000000000000000000000000065 :109C00000000000000000000000000000000000054 -:109C100000000000000000000000000000000084C0 +:109C10000000000000000000000000000000000044 :109C20000000000000000000000000000000000034 :109C30000000000000000000000000000000000024 :109C40000000000000000000000000000000000014 :109C50000000000000000000000000000000000004 :109C600000000000000000000000000000000000F4 :109C700000000000000000000000000000000000E4 -:109C80000000000000000000000000000000004094 +:109C800000000000000000000000000000000000D4 :109C900000000000000000000000000000000000C4 :109CA00000000000000000000000000000000000B4 -:109CB000000800000000000000000000000000009C +:109CB00000000000000000000000000000000000A4 :109CC0000000000000000000000000000000000094 :109CD0000000000000000000000000000000000084 :109CE0000000000000000000000000000000000074 @@ -203270,13 +195076,13 @@ :109D30000000000000000000000000000000000023 :109D40000000000000000000000000000000000013 :109D50000000000000000000000000000000000003 -:109D600000080008000000000000000000000000E3 +:109D600000000000000000000000000000000000F3 :109D700000000000000000000000000000000000E3 -:109D800000210008000000000000000000000000AA +:109D800000000000000000000000000000000000D3 :109D900000000000000000000000000000000000C3 -:109DA0000000000000210000000000000000000092 +:109DA00000000000000000000000000000000000B3 :109DB00000000000000000000000000000000000A3 -:109DC0000000000000210000000000000000000072 +:109DC0000000000000000000000000000000000093 :109DD0000000000000000000000000000000000083 :109DE0000000000000000000000000000000000073 :109DF0000000000000000000000000000000000063 @@ -203394,7 +195200,7 @@ :10A4F000000000000000000000000000000000005C :10A50000000000000000000000000000000000004B :10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B +:10A520000000000000000000000000020000000029 :10A53000000000000000000000000000000000001B :10A54000000000000000000000000000000000000B :10A5500000000000000000000000000000000000FB @@ -203409,7 +195215,7 @@ :10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B :10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A +:10A61000100000000000000000000000000000002A :10A62000000000000000000000000000000000002A :10A63000000000000000000000000000000000001A :10A64000000000000000000000000000000000000A @@ -203485,25 +195291,25 @@ :10AAA00000000000000000000000000000000000A6 :10AAB0000000000000000000000000000000000096 :10AAC0000000000000000000000000000000000086 -:10AAD0000003000000000000000000000000000073 +:10AAD0000000000000000000000000000000000076 :10AAE0000000000000000000000000000000000066 :10AAF0000000000000000000000000000000000056 :10AB00000000000000000000000000000000000045 :10AB10000000000000000000000000000000000035 :10AB20000000000000000000000000000000000025 -:10AB300000000000000000080000000000080008FD -:10AB40000000000000040000000000000000000001 -:10AB50000000000000000000000800000000008469 -:10AB600000080000000000000000000000000000DD -:10AB700000000000000000000008000000000000CD -:10AB800000040000000000000000000000000000C1 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 :10AB900000000000000000000000000000000000B5 :10ABA00000000000000000000000000000000000A5 :10ABB0000000000000000000000000000000000095 :10ABC0000000000000000000000000000000000085 :10ABD0000000000000000000000000000000000075 :10ABE0000000000000000000000000000000000065 -:10ABF0000002000000000000000000000000000053 +:10ABF0000000000000000000000000000000000055 :10AC00000000000000000000000000000000000044 :10AC10000000000000000000000000000000000034 :10AC20000000000000000000000000000000000024 @@ -203522,11 +195328,11 @@ :10ACF0000000000000000000000000000000000054 :10AD00000000000000000000000000000000000043 :10AD10000000000000000000000000000000000033 -:10AD2000000000000008000800000000000800000B +:10AD20000000000000000000000000000000000023 :10AD30000000000000000000000000000000000013 -:10AD400000000000000800080000000000000000F3 +:10AD40000000000000000000000000000000000003 :10AD500000000000000000000000000000000000F3 -:10AD600000000000000000A000080000000000003B +:10AD600000000000000000000000000000000000E3 :10AD700000000000000000000000000000000000D3 :10AD800000000000000000000000000000000000C3 :10AD900000000000000000000000000000000000B3 @@ -203554,13 +195360,13 @@ :10AEF0000000000000000000000000000000000052 :10AF00000000000000000000000000000000000041 :10AF10000000000000000000000000000000000031 -:10AF20000000000000000008000000000000000019 +:10AF20000000000000000000000000000000000021 :10AF30000000000000000000000000000000000011 -:10AF400000000000000000080000000000000000F9 +:10AF40000000000000000000000000000000000001 :10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000008000000000000D9 +:10AF600000000000000000000000000000000000E1 :10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000008000000000008B1 +:10AF800000000000000000000000000000000000C1 :10AF900000000000000000000000000000000000B1 :10AFA00000000000000000000000000000000000A1 :10AFB0000000000000000000000000000000000091 @@ -203642,17 +195448,17 @@ :10B4700000000000000000000000000000000000CC :10B4800000000000000000000000000000000000BC :10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C +:10B4A000000000000000000040000000000000005C :10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C +:10B4C000000000000000000020000000000000005C :10B4D000000000000000000000000000000000006C :10B4E000000000000000000000000000000000005C :10B4F000000000000000000000000000000000004C :10B50000000000000000000000000000000000003B :10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B +:10B52000400040000000400040000000000000001B :10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB +:10B5400000000000000000004000000000000000BB :10B5500000000000000000000000000000000000EB :10B5600000000000000000000000000000000000DB :10B5700000000000000000000000000000000000CB @@ -203719,9 +195525,9 @@ :10B9400000000000000000000000000000000000F7 :10B9500000000000000000000000000000000000E7 :10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000003C4 +:10B9700000000000000000000000000000000000C7 :10B9800000000000000000000000000000000000B7 -:10B990000005000000000000000000000000100092 +:10B9900000000000000000000000000000000000A7 :10B9A0000000000000000000000000000000000097 :10B9B0000000000000000000000000000000000087 :10B9C0000000000000000000000000000000000077 @@ -203730,65 +195536,65 @@ :10B9F0000000000000000000000000000000000047 :10BA00000000000000000000000000000000000036 :10BA10000000000000000000000000000000000026 -:10BA20008000000000000000000000000000000096 +:10BA20000000000000000000000000000000000016 :10BA30000000000000000000000000000000000006 :10BA400000000000000000000000000000000000F6 :10BA500000000000000000000000000000000000E6 -:10BA600001000000000000000000000000000000D5 +:10BA600000000000000000000000000000000000D6 :10BA700000000000000000000000000000000000C6 -:10BA800001000003000000000000000000000000B2 +:10BA800000000000000000000000000000000000B6 :10BA900000000000000000000000000000000000A6 :10BAA0000000000000000000000000000000000096 -:10BAB000000000000000000000000000000800007E +:10BAB0000000000000000000000000000000000086 :10BAC0000000000000000000000000000000000076 :10BAD0000000000000000000000000000000000066 -:10BAE0000000100000000000000000000000000046 -:10BAF000000000000000000800080000000800002E -:10BB000000082000000300080084000000000084FA -:10BB1000000000000000000000080008000000080D -:10BB20000004000800000082000400000000000083 -:10BB30000000000800000000008400840000008471 -:10BB40000084000800080000000000000000000061 -:10BB500000000000000000000000000000210000C4 -:10BB6000002100030021000000210000002100004E -:10BB7000002100210021000000050000002100003C -:10BB80000021002100210003000000210005002108 -:10BB9000000000210021002100000005000000211C -:10BBA00000050021002100080008004000000021DD -:10BBB000000000080021000000000000000000213B -:10BBC0000000000800020008000000000000000063 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 :10BBD0000000000000000000000000000000000065 :10BBE0000000000000000000000000000000000055 :10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000300000000000031 -:10BC10000000000000000000000000000002000022 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 :10BC20000000000000000000000000000000000014 -:10BC300000000000000000000008000000000000FC +:10BC30000000000000000000000000000000000004 :10BC400000000000000000000000000000000000F4 :10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000100000000000000D3 +:10BC600000000000000000000000000000000000D4 :10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000100000000000000B3 +:10BC800000000000000000000000000000000000B4 :10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000001000000000093 +:10BCA0000000000000000000000000000000000094 :10BCB0000000000000000000000000000000000084 :10BCC0000000000000000000000000000000000074 :10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000020000000000034 +:10BCE0000000000000000000000000000000000054 :10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000010000000000023 +:10BD00000000000000000000000000000000000033 :10BD10000000000000000000000000000000000023 -:10BD200000000000000000000000000020000000F3 +:10BD20000000000000000000000000000000000013 :10BD30000000000000000000000000000000000003 :10BD400000000000000000000000000000000000F3 :10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000003000000000008C8 -:10BD700000080000000000000000000000000000BB -:10BD8000002100000000000000080000000000008A +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 :10BD900000000000000000000000000000000000A3 -:10BDA0000000000500000000000000050000000089 -:10BDB000000000000200000000000200000000007F -:10BDC0000000000500000008000000000000204006 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 :10BDD0000000000000000000000000000000000063 :10BDE0000000000000000000000000000000000053 :10BDF0000000000000000000000000000000000043 @@ -203797,15 +195603,15 @@ :10BE20000000000000000000000000000000000012 :10BE30000000000000000000000000000000000002 :10BE400000000000000000000000000000000000F2 -:10BE50008000000000000000000000000000000062 -:10BE600000000000000800080000000800000008B2 -:10BE700000000005000000000000000800000000B5 -:10BE8000000000000008000800000008000500088D -:10BE90000000000000050008000000000021000074 -:10BEA000000800000000000800080000000800086A -:10BEB0000008000000050008000000000003C000AA -:10BEC00000000000000000210021000000210021EE -:10BED00000080080000000000000000000000000DA +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 :10BEE0000000000000000000000000000000000052 :10BEF0000000000000000000000000000000000042 :10BF00000000000000000000000000000000000031 @@ -203813,80 +195619,80 @@ :10BF20000000000000000000000000000000000011 :10BF30000000000000000000000000000000000001 :10BF400000000000000000000000000000000000F1 -:10BF500000000000080800010001000100C000010D -:10BF6000C00100C00189010000010084000400013B -:10BF7000000100C0000000010001000100C000013C -:10BF8000C00100C001890100000100200010000173 -:10BF9000000100C00000000000010001000100C01D -:10BFA0000001C00100C001890100000100840010EF -:10BFB0000001000100C0000000010001000100C0FC -:10BFC0000101C00100C0018901001001008400824C -:10BFD0000001000100C10000004100410041008259 -:10BFE0000041804100901041410902410080000061 -:10BFF00000410041008200000041004100410082F8 -:10C0000000418041009010414109094100800080B9 -:10C010000041004100820000000000410041004159 -:10C02000008200418041009010414109024100809E -:10C0300000800041004100820000004100410041B9 -:10C0400000820841804100C11041410985410080C2 -:10C050000080004100410085000041000300000015 -:10C060000080410089000000030041002100000918 -:10C070009180C100C1000080000041000300000069 -:10C0800000804100890000000300410021000009F8 -:10C090008200C141C10000A1000000034141030032 -:10C0A00000000080410089000000030041002100E1 -:10C0B00000099080C100C100008000004100030021 -:10C0C000000000804100890000000300C100210041 -:10C0D00000099080C100C100008000000100010043 -:10C0E000000000C00100C000000001000400840442 -:10C0F00000C0C0C00900C1000084020201000100AC -:10C10000000000C00100C000000001000400840421 -:10C1100000C0C0000900C10000840202000001014B -:10C120000100000000C00100C00000000100040088 -:10C13000840400C0C0C00900C100008402020100E4 -:10C140000100000000C00100C0000000010002006A -:10C1500084C000C0C1C00900C1000084101000C02C -:10C160000001C0C100000000000100C0C010008537 -:10C17000000100C10000000000010000000000C03C -:10C180000001C0C100000000000100C0C010008517 -:10C19000000100C1000000000001000000000000DC -:10C1A00000C00001C0C100000000000100C0C010BC -:10C1B0000003000100C100000000000100000000B9 -:10C1C00000C00001C0C100000000000100C0C0109C -:10C1D0000003000100C10000000000010000000099 -:10C1E0000080004180C10000000000410082800208 -:10C1F0000041004100C100000000004100020000B9 -:10C200000080004180C100000000004100918002D8 -:10C210000041004100C10000000000410002000098 -:10C2200000000080004180C100000000004100913A -:10C2300080020041004100C10000000000410002F6 -:10C2400000000080004180C100000000004100911A -:10C2500080020041004100C10000000000410010C8 -:10C260000000C100800080C1000041000000880083 -:10C270004100C10000008008000041000000800073 -:10C280004100C100800080C1000041000000880022 -:10C290004100C10000008008000041000000800053 -:10C2A00041000000C100800080C10000410000008A -:10C2B00088004100C100000080080000410000002B -:10C2C00080004100C100800080C1000041000000EA -:10C2D00088004100C100000080080000410000000B -:10C2E00080414100C1004000C0C1000001000200C7 -:10C2F00009000100C1101000C00100000100000091 -:10C30000C0000100C1004000C0C1000001000200E7 -:10C3100009000100C1101000C00100000100000070 -:10C32000C00001000000C1004000C0C100000100C9 -:10C33000020009000100C1101000C001000001004E -:10C340000000C0000100C1004000C0C100000100A9 -:10C35000020009000100C1101000C001000001002E -:10C360000000C001010000000000000000420000C9 -:10C3700000000000C813411200480700C4830000F9 -:10C38000000000000000000000000000004200006B -:10C3900000000000C813411200480700C40000005C -:10C3A0000000000000000000000000000000C1428A -:10C3B000000000000000C813411200480700C483B9 -:10C3C000000000000000000000000000000000422B -:10C3D000000000000000C813411200480700C48399 -:10C3E000000000000000001300000000000000003A +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D :10C3F000000000000000000000000000000000003D :10C40000000000000000000000000000000000002C :10C41000000000000000000000000000000000001C @@ -203902,30 +195708,30 @@ :10C4B000000000000000000000000000000000007C :10C4C000000000000000000000000000000000006C :10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000757B00005C +:10C4E000000000000000000000000000000000004C :10C4F000000000000000000000000000000000003C -:10C5000000000000000000000000DEAE757B0000AF +:10C50000000000000000000000000000000000002B :10C51000000000000000000000000000000000001B -:10C5200000000000000000000000DEAE0000757B8F +:10C52000000000000000000000000000000000000B :10C5300000000000000000000000000000000000FB -:10C54000000000000000000000000000DEAE757B6F +:10C5400000000000000000000000000000000000EB :10C5500000000000000000000000000000000000DB -:10C56000000000000000000000000000DEAE60C619 -:10C5700003000000000000000031E00000000000A7 -:10C5800000000C0000000000000000C0630660C650 -:10C5900003000000000000000031E0000000000087 -:10C5A00000000C0000000000000000C06306000056 -:10C5B00060C603000000000000000031E000000041 -:10C5C000000000000C0000000000000000C0630636 -:10C5D00060C603000000000000000031E000000021 -:10C5E000000000000C0000000000000000C0630616 +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B :10C5F000000000000000000000000000000000003B :10C60000000000000000000000000000000000002A -:10C610000000000000008400000000000000000096 +:10C61000000000000000000000000000000000001A :10C62000000000000000000000000000000000000A -:10C6300000000000000000002000000000000000DA -:10C64000000800000000000088000000000000005A -:10C6500000000000000000002000000000000000BA +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA :10C6600000000000000000000000000000000000CA :10C6700000000000000000000000000000000000BA :10C6800000000000000000000000000000000000AA @@ -203945,37 +195751,37 @@ :10C7600000000000000000000000000000000000C9 :10C7700000000000000000000000000000000000B9 :10C7800000000000000000000000000000000000A9 -:10C790000000000000000000000000000000000891 -:10C7A0000000000000840000000000000008008479 -:10C7B0000010000000000000000000000000000069 -:10C7C0000008000000000000000000000000000859 -:10C7D00000000084000000000000000000000000D5 -:10C7E00000820000000000040000000000000008BB -:10C7F0000000001000000000000000000000000029 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 :10C800000000000000000000000000000000000028 -:10C8100000000000000000000000002100000021D6 -:10C8200000000000000000000000000500000021E2 -:10C8300000000000000000210000000000000000D7 -:10C84000002100210000000000090000000000009D -:10C8500000210005000000000000000000000000B2 -:10C86000000800000021000000000000000000009F -:10C8700000000000000900000000000000000000AF -:10C8800000000000000000000000000000A0000008 -:10C890000008000800080000000000000000000080 -:10C8A0000000000000000000000000000084000004 -:10C8B000000800A0001000000000000000000000C0 -:10C8C00000000000000000000000000000000084E4 -:10C8D0000000000800840008008400000000000040 -:10C8E0000000000000080000000000000000000040 -:10C8F000000000080084001011000000000000008B +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 :10C900000000000000000000000000000000000027 :10C910000000000000000000000000000000000017 :10C920000000000000000000000000000000000007 :10C9300000000000000000000000000000000000F7 -:10C9400000000000400000000000000000000000A7 +:10C9400000000000000000000000000000000000E7 :10C9500000000000000000000000000000000000D7 -:10C96000000000000000000000000000A000000027 -:10C9700000000000080088000000000082000000A5 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 :10C9800000000000000000000000000000000000A7 :10C990000000000000000000000000000000000097 :10C9A0000000000000000000000000000000000087 @@ -203985,30 +195791,30 @@ :10C9E0000000000000000000000000000000000047 :10C9F0000000000000000000000000000000000037 :10CA00000000000000000000000000000000000026 -:10CA10000000000000800000000000000000000096 +:10CA10000000000000000000000000000000000016 :10CA20000000000000000000000000000000000006 -:10CA30000000000000800000000000000000000076 +:10CA300000000000000000000000000000000000F6 :10CA400000000000000000000000000000000000E6 -:10CA50000000000000000080000000000000000056 +:10CA500000000000000000000000000000000000D6 :10CA600000000000000000000000000000000000C6 -:10CA7000000800000000008000000000000000002E -:10CA8000000000000000000000000008000011008D -:10CA9000000800000000001000A0000000000000DE -:10CAA000000000000000000000000008000011006D -:10CAB00000A000000000001000A000000000000026 -:10CAC000000000000000000000000000000800005E -:10CAD0001100008800000000001000A0000000000D -:10CAE000000000000000000000000000000200A0A4 -:10CAF0001100008800000000201000A000000000CD +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 :10CB00000000000000000000000000000000000025 :10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000008ED +:10CB300000000000000000000000000000000000F5 :10CB400000000000000000000000000000000000E5 :10CB500000000000000000000000000000000000D5 -:10CB60000021000000000003000000084000000059 +:10CB600000000000000000000000000000000000C5 :10CB700000000000000000000000000000000000B5 -:10CB80000000900000000000000000000000000015 +:10CB800000000000000000000000000000000000A5 :10CB90000000000000000000000000000000000095 :10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 @@ -204144,10 +195950,10 @@ :10D3D000000000000000000000000000000000004D :10D3E000000000000000000000000000000000003D :10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C +:10D40000000000000000000000004000400000009C +:10D41000400040004000000000000000000000004C :10D4200000000000000000000000000000000000FC -:10D4300000000000000000000000000000000000EC +:10D4300000004000000000000000000000000000AC :10D4400000000000000000000000000000000000DC :10D4500000000000000000000000000000000000CC :10D4600000000000000000000000000000000000BC @@ -204165,12 +195971,12 @@ :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB :10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000040000000000C7 -:10D56000000000000000000000004000000000007B -:10D57000000000000000000000000000200000008B -:10D58000000000000000000000000000200040003B -:10D5900000000000000000000008000088000000FB -:10D5A000001000000000001000000000000000005B +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B :10D5B000000000000000000000000000000000006B :10D5C000000000000000000000000000000000005B :10D5D000000000000000000000000000000000004B @@ -204189,12 +195995,12 @@ :10D6A000000000000000000000000000000000007A :10D6B000000000000000000000000000000000006A :10D6C000000000000000000000000000000000005A -:10D6D0000000000000000000000000000000000842 +:10D6D000000000000000000000000000000000004A :10D6E000000000000000000000000000000000003A :10D6F000000000000000000000000000000000002A -:10D700000008000000000000000000000000000011 -:10D7100000000000000000000000000000100000F9 -:10D7200000080000000000000000000000000000F1 +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 :10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 @@ -204210,15 +196016,15 @@ :10D7F0000000000000000000000000000000000029 :10D800000000000000000000000000000000000018 :10D810000000000000000000000000000000000008 -:10D82000000000000000000000A000000000000058 -:10D830000000008400000000000000000000000064 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 :10D8400000000000000000000000000000000000D8 :10D8500000000000000000000000000000000000C8 :10D8600000000000000000000000000000000000B8 :10D8700000000000000000000000000000000000A8 -:10D880000000000000000000040000000000000094 -:10D890000000000000000000820000000000000006 -:10D8A0000000000000000000000000000000C000B8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 :10D8C0000000000000000000000000000000000058 :10D8D0000000000000000000000000000000000048 @@ -204234,16 +196040,16 @@ :10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 :10D990000000000000000000000000000000000087 -:10D9A000000000000000000000000000080000006F +:10D9A0000000000000000000000000000000000077 :10D9B0000000000000000000000000000000000067 -:10D9C000000000000000000000000008000000004F +:10D9C0000000000000000000000000000000000057 :10D9D0000000000000000000000000000000000047 -:10D9E000000000000000000000000008000000002F +:10D9E0000000000000000000000000000000000037 :10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000800000008000006 +:10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 -:10DA200000000000000000000010000000080000DE -:10DA300000000000000000000000000000200000C6 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 :10DA400000000000000000000000000000000000D6 :10DA500000000000000000000000000000000000C6 :10DA600000000000000000000000000000000000B6 @@ -204251,8 +196057,8 @@ :10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 :10DAA0000000000000000000000000000000000076 -:10DAB00000000000000000000000000084000000E2 -:10DAC000080000000000000000000000000000004E +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 :10DAD0000000000000000000000000000000000046 :10DAE0000000000000000000000000000000000036 :10DAF0000000000000000000000000000000000026 @@ -204385,7 +196191,7 @@ :10E2E000000000000000000000000000000000002E :10E2F000000000000000000000000000000000001E :10E30000000000000000000000000000000000000D -:10E3100000000000000000000000000000000000FD +:10E3100000000000000000000000000000000002FB :10E3200000000000000000000000000000000000ED :10E3300000000000000000000000000000000000DD :10E3400000000000000000000000000000000000CD @@ -204400,7 +196206,7 @@ :10E3D000000000000000000000000000000000003D :10E3E000000000000000000000000000000000002D :10E3F000000000000000000000000000000000001D -:10E40000000000000000000000000000000000000C +:10E40000000000000200000000000000000000000A :10E4100000000000000000000000000000000000FC :10E4200000000000000000000000000000000000EC :10E4300000000000000000000000000000000000DC @@ -204422,7 +196228,7 @@ :10E5300000000000000000000000000000000000DB :10E5400000000000000000000000000000000000CB :10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000200000000A9 +:10E5600000000000000000000000000000000000AB :10E57000000000000000000000000000000000009B :10E58000000000000000000000000000000000008B :10E59000000000000000000000000000000000007B @@ -204462,7 +196268,7 @@ :10E7B0000000000000000000000000000000000059 :10E7C0000000000000000000000000000000000049 :10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000000090000000000000020 +:10E7E0000000000000000000000000000000000029 :10E7F0000000000000000000000000000000000019 :10E800000000000000000000000000000000000008 :10E8100000000000000000000000000000000000F8 @@ -204473,7 +196279,7 @@ :10E8600000000000000000000000000000000000A8 :10E870000000000000000000000000000000000098 :10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000000000078 +:10E890000000000000000040000000000000000038 :10E8A0000000000000000000000000000000000068 :10E8B0000000000000000000000000000000000058 :10E8C0000000000000000000000000000000000048 @@ -204614,15 +196420,15 @@ :10F1300000000000000000000000000000000000CF :10F1400000000000000000000000000000000000BF :10F1500000000000000000000000000000000000AF -:10F16000000000000000000000001000000000008F +:10F16000000000000000000000000000000000009F :10F17000000000000000000000000000000000008F -:10F18000000000000000000000002000000000005F +:10F18000000000000000000000000000000000007F :10F19000000000000000000000000000000000006F :10F1A000000000000000000000000000000000005F :10F1B000000000000000000000000000000000004F -:10F1C000000000000000000000001000000000002F +:10F1C000000000000000000000000000000000003F :10F1D000000000000000000000000000000000002F -:10F1E00000000000000000000000000000004000DF +:10F1E000000000000000000000000000000000001F :10F1F000000000000000000000000000000000000F :10F2000000000000000000000000000000000000FE :10F2100000000000000000000000000000000000EE @@ -204639,9 +196445,9 @@ :10F2C000000000000000000000000000000000003E :10F2D000000000000000000000000000000000002E :10F2E000000000000000000000000000000000001E -:10F2F000000000000000000000000000000000000E +:10F2F00000004000400000004000400040000000CE :10F3000000000000000000000000000000000000FD -:10F3100000000000000000000000000000000000ED +:10F3100000000000000000000000000040000000AD :10F3200000000000000000000000000000000000DD :10F3300000000000000000000000000000000000CD :10F3400000000000000000000000000000000000BD @@ -204658,7 +196464,7 @@ :10F3F000000000000000000000000000000000000D :10F4000000000000000000000000000000000000FC :10F4100000000000000000000000000000000000EC -:10F4200000000000000000000000000000000000DC +:10F4200000000000000000000000000000040000D8 :10F4300000000000000000000000000000000000CC :10F4400000000000000000000000000000000000BC :10F4500000000000000000000000000000000000AC @@ -204688,18 +196494,18 @@ :10F5D000000000000000000000000000000000002B :10F5E000000000000000000000000000000000001B :10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA -:10F6100000000000000000000000000000001000DA -:10F6200000000000000000000000000000000000DA +:10F600000000000000820000000000000000000078 +:10F6100000000000000000000000000000000000EA +:10F620000000000000000082000000000000000058 :10F6300000000000000000000000000000000000CA -:10F6400000000000000000000000000000000000BA +:10F6400000000000000000900000000000840000A6 :10F6500000000000000000000000000000000000AA :10F66000000000000000000000000000000000009A :10F67000000000000000000000000000000000008A :10F68000000000000000000000000000000000007A -:10F69000000000000000000000000000000000006A +:10F690000000000000000008000000000000000062 :10F6A000000000000000000000000000000000005A -:10F6B000000000000000000000000000000000004A +:10F6B000000000000000004000000000000000000A :10F6C000000000000000000000000000000000003A :10F6D000000000000000000000000000000000002A :10F6E000000000000000000000000000000000001A @@ -204723,7 +196529,7 @@ :10F8000000000000000000000000000000000000F8 :10F8100000000000000000000000000000000000E8 :10F8200000000000000000000000000000000000D8 -:10F8300000000000000000000000000000000000C8 +:10F8300000000000000000000000000000080000C0 :10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 @@ -204848,7 +196654,7 @@ :10FFD0000000000000000000000000000000000021 :10FFE0000000000000000000000000000000000011 :10FFF0000000000000000000000000000000000001 -:020000040032C8 +:020000040030CA :1000000000000000000000000000000000000000F0 :1000100000000000000000000000000000000000E0 :1000200000000000000000000000000000000000D0 @@ -204876,11 +196682,11 @@ :10018000000000000000000000000000000000006F :10019000000000000000000000000000000000005F :1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F +:1001B000000000000000000000000003000000003C :1001C000000000000000000000000000000000002F :1001D000000000000000000000000000000000001F :1001E000000000000000000000000000000000000F -:1001F00000000000000000000000000000000000FF +:1001F00000000000000000000000200000000000DF :1002000000000000000000000000000000000000EE :1002100000000000000000000000000000000000DE :1002200000000000000000000000000000000000CE @@ -204888,32 +196694,32 @@ :1002400000000000000000000000000000000000AE :10025000000000000000000000000000000000009E :10026000000000000000000000000000000000008E -:10027000000000000000000000000000000000007E +:1002700000000000000000000000000080000000FE :10028000000000000000000000000000000000006E :10029000000000000000000000000000000000005E :1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E +:1002B000000000000000000000000000010000003D :1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E +:1002D00000000000000000000000000000002000FE :1002E000000000000000000000000000000000000E :1002F00000000000000000000000000000000000FE :1003000000000000000000000000000000000000ED :1003100000000000000000000000000000000000DD :1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD +:10033000000000000000000000000000000020009D :1003400000000000000000000000000000000000AD -:10035000000000000000000000000000000000009D -:10036000000000000000000000000000000000008D -:10037000000000000000000000000000000000007D -:10038000000000000000000000000000000000006D +:10035000000000000000000000000008000000088D +:1003600080080000000800000008000000000000F5 +:1003700000000000000000000088000800000008E5 +:100380000008000000000000000000000000000065 :10039000000000000000000000000000000000005D :1003A000000000000000000000000000000000004D :1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D -:1003F00000000000000000000000000000000000FD -:1004000000000000000000000000000000000000EC +:1003C0000021000000210021002100210000000088 +:1003D0000000002100210021002100080000000091 +:1003E0000000002100210021002100000000000089 +:1003F0000000000800210021002100000000000092 +:1004000000000002000000000000000000000000EA :1004100000000000000000000000000000000000DC :1004200000000000000000000000000000000000CC :1004300000000000000000000000000000000000BC @@ -204925,7 +196731,7 @@ :10049000000000000000000000000000000000005C :1004A000000000000000000000000000000000004C :1004B000000000000000000000000000000000003C -:1004C000000000000000000000000000000000002C +:1004C0000000000800000000000000000000000024 :1004D000000000000000000000000000000000001C :1004E000000000000000000000000000000000000C :1004F00000000000000000000000000000000000FC @@ -204941,11 +196747,11 @@ :10059000000000000000000000000000000000005B :1005A000000000000000000000000000000000004B :1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B -:1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA +:1005C0000000000800050000000500000000000019 +:1005D00000000000000000001000001100000000FA +:1005E00000000000000800000000000000000008FB +:1005F000000000000000000090000000000000006B +:1006000000000000000800000000000000000000E2 :1006100000000000000000000000000000000000DA :1006200000000000000000000000000000000000CA :1006300000000000000000000000000000000000BA @@ -204957,11 +196763,11 @@ :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A :1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000000000000000000000000FA -:1007000000000000000000000000000000000000E9 +:1006C0000000000000000005000000080008000015 +:1006D0000003000800000008000000000000000007 +:1006E00000000000000000000000000000030008FF +:1006F00000110000000000000000000000000000E9 +:1007000000000000000000000005000000030008D9 :1007100000000000000000000000000000000000D9 :1007200000000000000000000000000000000000C9 :1007300000000000000000000000000000000000B9 @@ -204972,78 +196778,78 @@ :100780000000000000000000000000000000000069 :100790000000000000000000000000000000000059 :1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 -:1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000000000000F9 -:1008000000000000000000000000000000000000E8 +:1007B0000000000000000000000001000000000038 +:1007C00000000000000000C0000000000000000069 +:1007D0000000000000000000000000000100000018 +:1007E000000000000000000000C000000000000049 +:1007F00000000000000000000000000001000000F8 +:10080000000000000000000000C000000000000028 :1008100000000000000000000000000000000000D8 :1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 +:100830000000000000000000000000004100000077 +:100840000000000000020200008000000000000024 +:100850000000000000000000000000000000410057 +:100860000000000000000002020000800000000004 +:100870000000000000000000000000000000410037 +:1008800000000000000000020200008000000000E4 :100890000000000000000000000000000000000058 :1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 +:1008B00000000000000000000300000000800000B5 +:1008C0008000000000001000900000800000000088 +:1008D0000000000000410000000003000000008054 +:1008E00000008000000000001000100000800000E8 +:1008F00080000000000000410000030000000080B4 +:1009000000008000000000008200048000800000E1 +:100910000000000000000041000000000000000096 :1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 -:100990000000000000000000000000000000000057 +:10093000000000000000000000000100000000C0F6 +:10094000000020000000000002001004001002005F +:100950000200000000000001000000000100000093 +:1009600000C0000020000000000002001104001080 +:10097000020008000000000000010000010000006B +:1009800000C00000200000000000080010820010DD +:1009900002880400000000000001000000000000C8 :1009A0000000000000000000000000000000000047 -:1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000027 +:1009B0000000000000000000000000000000C00077 +:1009C0000000000000000000000000080000080017 :1009D0000000000000000000000000000000000017 -:1009E0000000000000000000000000000000000007 +:1009E000C0000000000000000000000000900000B7 :1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 +:100A0000C000000000000000000000000002000024 :100A100000000000000000000000000000000000D6 :100A200000000000000000000000000000000000C6 :100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 +:100A400080000000000000000000000000800000A6 +:100A5000800009000000000000000000000000000D +:100A60000000800000000000000000000000000006 +:100A7000000000000900000000000000000000006D +:100A80000000800000000000000000000000008066 +:100A9000000000000900000000000000000000004D :100AA0000000000000000000000000000000000046 :100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 +:100AC000800000C10000000000000000000000C124 +:100AD0008000001100000000000000000000000085 +:100AE0000000800000C100000000000000000000C5 +:100AF00000C18000000900000000000000000000AC +:100B00000000800000C100000000000000000000A4 +:100B1000004180000009000000000000000000000B :100B200000000000000000000000000000000000C5 :100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 +:100B40000000400000C100000000000000000000A4 +:100B500000418200000000000000000000000000D2 +:100B600000000000400000C1000000000000000084 +:100B700000000003820000000000000000000000F0 +:100B800000000000400000C1000000000000000064 +:100B9000000000898200000000000000000000004A :100BA0000000000000000000000000000000000045 :100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C200000000000000000000000000000000000C4 +:100BC00000000000000000000042000000000000E3 +:100BD0004800810000E00000480000000000000024 +:100BE0000042000000000000000000420000000081 +:100BF00000004800810000E0000048000000000004 +:100C00000000004200000000000000420000000060 +:100C100000004800810000E00000480000000000E3 +:100C20000000004200000000000000000000000082 :100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 @@ -205061,21 +196867,21 @@ :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 +:100D40000000000000000000747B000000000000B4 :100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 +:100D6000000000000000DE2E0000747B0000000088 :100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 +:100D80000000000000000000DE2E747B0000000068 :100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 +:100DA0000000000000000000DE2E00000000000037 :100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000000000C2 +:100DC0000000000000000000000061560340000029 +:100DD000000000000231E0000000000000000C40B4 +:100DE00000000000000002C06A8600006156034057 +:100DF0000000000000000231E000000000000000E0 +:100E00000C4000000000000002C06A8661560340EA +:100E10000000000000000231E000000000000000BF +:100E20000C4000000000000002C06A8600000000C4 :100E300000000000000000000000000000000000B2 :100E400000000000000000000000000000000000A2 :100E50000000000000000000000000000000000092 @@ -205083,12 +196889,12 @@ :100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 :100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 +:100EA000000000000008000000000000000000003A :100EB0000000000000000000000000000000000032 :100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 +:100ED00040004000000040004000400000000000D2 :100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 +:100EF00000000000000000000000400000000000B2 :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 @@ -205099,32 +196905,32 @@ :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 :100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 +:100FA0000000000000000008000000000000000039 :100FB0000000000000000000000000000000000031 :100FC0000000000000000000000000000000000021 :100FD0000000000000000000000000000000000011 :100FE0000000000000000000000000000000000001 :100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 +:10100000000000000000000000000084000000005C :1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 +:10102000000000000000000000000000008400003C :1010300000000000000000000000000000000000B0 :1010400000000000000000000000000000000000A0 :101050000000000000000000000000000000000090 :101060000000000000000000000000000000000080 :101070000000000000000000000000000000000070 :101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 +:101090000000000000000000000000000008000048 :1010A0000000000000000000000000000000000040 :1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 -:1010D00000000000000000004000000000000000D0 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000004000000000000000B0 -:1011000000000000000000000000000000000000DF -:1011100000000000000200000000000000000000CD +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000008008474 +:1010F00000000000000000000000000000000000F0 +:10110000000000000000000000000000000000A03F +:1011100000080000000000000000000000000000C7 :1011200000000000000000000000000000000000BF -:1011300000000000000000000000000000000000AF +:1011300000A000000000000000000000000000000F :10114000000000000000000000000000000000009F :10115000000000000000000000000000000000008F :10116000000000000000000000000000000000007F @@ -205145,7 +196951,7 @@ :10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E :10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E +:10128000000000000000000000000000000200005C :10129000000000000000000000000000000000004E :1012A000000000000000000000000000000000003E :1012B000000000000000000000000000000000002E @@ -205154,17 +196960,17 @@ :1012E00000000000000000000000000000000000FE :1012F00000000000000000000000000000000000EE :1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:1013300000000000000000000000000000000000AD +:1013100020000000000002000000000000000000AB +:101320000000000000000000000000000084000039 +:10133000000000880000000800000000000000001D :10134000000000000000000000000000000000009D :10135000000000000000000000000000000000008D :10136000000000000000000000000000000000007D :10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D +:10138000000000030000000000000000000000005A :10139000000000000000000000000000000000004D :1013A000000000000000000000000000000000003D -:1013B000000000000000000000000000000000002D +:1013B0000000000000000008000000000000000025 :1013C000000000000000000000000000000000001D :1013D000000000000000000000000000000000000D :1013E00000000000000000000000000000000000FD @@ -205324,14 +197130,14 @@ :101D80000000000000000000000000000000000053 :101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 +:101DB000000000000000000004000000000000001F :101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 +:101DD00000000000000000002000000000000000E3 :101DE00000000000000000000000000000000000F3 :101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 +:101E000000000000000000020000000000000000D0 :101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 +:101E200000000000000003000000000000000000AF :101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 :101E50000000000000000000000000000000000082 @@ -205339,11 +197145,11 @@ :101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 :101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 +:101EA00000000000000000008200000000000000B0 :101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 +:101EC0000000000000000000000000001000000002 :101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 +:101EE00000000000000000000000000010000000E2 :101EF00000000000000000000000000000000000E2 :101F000000000000000000000000000000000000D1 :101F100000000000000000000000000000000000C1 @@ -205351,7 +197157,7 @@ :101F300000000000000000000000000000000000A1 :101F40000000000000000000000000000000000091 :101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 +:101F60000000000000000000000000000000004031 :101F70000000000000000000000000000000000061 :101F80000000000000000000000000000000000051 :101F90000000000000000000000000000000000041 @@ -205365,8 +197171,8 @@ :1020100000000000000000000000000000000000C0 :1020200000000000000000000000000000000000B0 :1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:10205000000000040000000000000000000000007C +:10204000000000000000000000000084000000000C +:102050000000000000000000000000000000000080 :102060000000000000000000000000000000000070 :102070000000000000000000000000000000000060 :102080000000000000000000000000000000000050 @@ -205400,13 +197206,13 @@ :10224000000000000000000000000000000000008E :10225000000000000000000000000000000000007E :10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E +:102270000008000000000000000000000000000056 :10228000000000000000000000000000000000004E :10229000000000000000000000000000000000003E :1022A000000000000000000000000000000000002E :1022B000000000000000000000000000000000001E :1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE +:1022D00000000000000000000000000000080000F6 :1022E00000000000000000000000000000000000EE :1022F00000000000000000000000000000000000DE :1023000000000000000000000000000000000000CD @@ -205577,13 +197383,13 @@ :102D50000000000000000000000000000000000073 :102D60000000000000000000000000000000000063 :102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 +:102D80000000000000000000000000000010000033 :102D90000000000000000000000000000000000033 :102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 +:102DB0000000000000000000000040004000000093 +:102DC0004000400040000000000000000000000043 :102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 +:102DE00000004000000000000000000000000000A3 :102DF00000000000000000000000000000000000D3 :102E000000000000000000000000000000000000C2 :102E100000000000000000000000000000000000B2 @@ -205612,10 +197418,10 @@ :102F80000000000000000000000000000000000041 :102F90000000000000000000000000000000000031 :102FA0000000000000000000000000000000000021 -:102FB000000000000000000000000000000200000F -:102FC00040000000000000000000000000000000C1 -:102FD00000000000000000000000000000000002EF -:102FE00000004000000000000000000000000000A1 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 :102FF00000000000000000000000000000000000D1 :1030000000000000000000000000000000000000C0 :1030100000000000000000000000000000000000B0 @@ -205821,9 +197627,9 @@ :103C90000000000000000000000000000000000024 :103CA0000000000000000000000000000000000014 :103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 +:103CC00000000200000000000000000000000000F2 :103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 +:103CE00000002000000000000000000000000000B4 :103CF00000000000000000000000000000000000C4 :103D000000000000000000000000000000000000B3 :103D100000000000000000000000000000000000A3 @@ -206075,9 +197881,9 @@ :104C70000000000000000000000000000000000034 :104C80000000000000000000000000000000000024 :104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 +:104CA00000000000400040000000400040004000C4 :104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 +:104CC00000000000000000000000000040000000A4 :104CD00000000000000000000000000000000000D4 :104CE00000000000000000000000000000000000C4 :104CF00000000000000000000000000000000000B4 @@ -206107,13 +197913,13 @@ :104E70000000000000000000000000000000000032 :104E80000000000000000000000000000000000022 :104E90000000000000000000000000000000000012 -:104EA00000000000000000000000100000000000F2 +:104EA0000000000000000000000000000000000002 :104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000010000000D2 +:104EC00000000000000000000000000000000000E2 :104ED00000000000000000000000000000000000D2 :104EE00000000000000000000000000000000000C2 :104EF00000000000000000000000000000000000B2 -:104F0000100000000000000010020000000000007F +:104F000000000000000000000000000000000000A1 :104F10000000000000000000000000000000000091 :104F20000000000000000000000000000000000081 :104F30000000000000000000000000000000000071 @@ -206178,7 +197984,8201 @@ :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE :10530000000000000000000000000000000000009D -:105310000000000000A000000000000000000000ED +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:10552000000000000000000000000000000000007B +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A00000000000000000000000000000000000FB +:1055B00000000000000000000000000000000000EB +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000000000000000000000BB +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A +:10561000000000000000000000000000000000008A +:10562000000000000000000000000000000000007A +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:10569000000000000000000000000000000000000A +:1056A00000000000000000000000000000000000FA +:1056B00000000000000000000000000000000000EA +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:105730000000000000000000000000000000000069 +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000000000000000000000000000E9 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000000000000A9 +:105800000000000000000000000000000000000098 +:105810000000000000000000000000000000000088 +:105820000000000000000000000000000000000078 +:105830000000000000000000000000000000000068 +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000000000E8 +:1058C00000000000000000000000000000000000D8 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000000000000097 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10000000000000000000000000000000000085 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000200000000A3 +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00002000000000000000000000000000000D2 +:105CD00000000000000000000000000000000000C4 +:105CE00002000000000000000000000000000000B2 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E20000000000000000000000000000000000072 +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F20000000000000000040000000000000000031 +:105F30000000000000000000000000000000000061 +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000000000000000A1 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000000000000000000000D0 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000000000000000000000CD +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:10642000000000000000000000000000000000006C +:10643000000000000000000000000000000000005C +:10644000000000000000000000000000000000004C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C +:1064900000000000000000000000000000000000FC +:1064A00000000000000000000000000000000000EC +:1064B00000000000000000000000000000000000DC +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:10651000000000000000000000000000000000007B +:10652000000000000000000000000000000000006B +:10653000000000000000000000000000000000005B +:10654000000000000000000000000000000000004B +:10655000000000000000000000000000000000003B +:10656000000000000000000000000000000000002B +:10657000000000000000000000000000000000001B +:10658000000000000000000000000000000000000B +:1065900000000000000000000000000000000000FB +:1065A00000000000000000000000000000000000EB +:1065B00000000000000000000000000000000000DB +:1065C00000000000000000000000000000000000CB +:1065D00000000000000000000000000000000000BB +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A00000000000000000000000000000000000EA +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000000069 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000076 +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 +:106BA00000000000000000000000000000000000E5 +:106BB0000000000000004000000000000000000095 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000000000000000000000000095 +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000000000000000043 +:106D50000000000000000000000000000000000033 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000000000C3 +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E500000000000000000000000004100000000F1 +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000000000000000BB +:1075D00000000000000000000000000000000000AB +:1075E000000000000000000000000000000000009B +:1075F000000000000000000000000000000000008B +:10760000000000000000000000000000000000007A +:10761000000000000000000000000000000000006A +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00000000000000000000000000000000000BA +:1076D00000000000000000000000000000000000AA +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000000039 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 +:107910000000000000000000000000000000000067 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 +:107950000000000000000000000000000000000027 +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000000C7 +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000000000000000000A7 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA0000000000000004000000000000000000096 +:107AB00000000000000000000000000000000000C6 +:107AC0000000000000004000000000000000000076 +:107AD000000000000000880000000000000000001E +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B400000000000000000000000400000000000F5 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000000054 +:107C3000000000080000000000000000000000003C +:107C40000000000000000000000000000000000034 +:107C5000000000080000000000000000000000001C +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000080000000000000000DB +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000008000000000000BB +:107DC00000000000000000000000000000000000B3 +:107DD0000000080000000000000800000000000093 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000000000000042 +:107E40000000000000000000000000000000000032 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000000000000000000000B2 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000005F +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000000000000000000CD +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:10862000000000000000000000000000000000004A +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000000000001A +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C00000000000000000000000000000000000AA +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 +:108960000000000000000000000000000000000007 +:1089700000000000000000000000000000000000F7 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000000B7 +:1089C00000000000000000000000000000000000A7 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 +:108A10000000000000000000000000000000000056 +:108A20000000000000000000000000000000000046 +:108A30000000000000000000000000000000000036 +:108A400000000000000000008200000000000000A4 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA0004000000000000000000000000000000086 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000003000000000000000000000000E2 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC00000000000000000000000000000000000A5 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C000000000000008200000000000000000000E2 +:108C10000008000800000000000000000000000044 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 +:108C600000000000000000080000000000000000FC +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000A000000000F3 +:108DE0000000000000000000000000000000000083 +:108DF000000000000000000000080000000000006B +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000800000000CA +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000200071 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000800000800000000000000000000000050 +:1090100000000000000000000000008200000000CE +:109020000000000800000000000000000000000038 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:10915000000000000000000000000000000000000F +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F +:1091D000000000000000000000000000000000008F +:1091E000000000000000000000000000000000007F +:1091F000000000000000000000000000000000006F +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E +:10925000000000000000000000000000000000000E +:1092600000000000000000000000000000000000FE +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE +:1092900000000000000000000000000000000000CE +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000000000000000000000000000008E +:1092E000000000000000000000000000000000007E +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:10931000000000000000000000000000000000004D +:10932000000000000000000000000000000000003D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D +:1093600000000000000000000000000000000000FD +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000000000000004C +:10942000000000000000000000000000000000003C +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC +:1094A00000000000000000000000000000000000BC +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000000000008C +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000000000005B +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C000000000000000000000000000000000009B +:1095D000000000000000000000000000000000008B +:1095E000000000000000000000000000000000007B +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000000000003A +:10963000000000000000000000000000000000002A +:10964000000000000000000000000000000000001A +:10965000000000000000000000000000000000000A +:1096600000000000000000000000000000000000FA +:1096700000000000000000000000000000000000EA +:1096800000000000000000000000000000000000DA +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000000000000000000000000000000000AA +:1096C000000000000000000000000000000000009A +:1096D000000000000000000000000000000000008A +:1096E000000000000000000000000000000000007A +:1096F000000000000000000000000000000000006A +:109700000000000000000000000000000000000059 +:109710000000000000000000000000000000000049 +:109720000000000000000000000000000000000039 +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:109750000000000000000000000000000000000009 +:1097600000000000000000000000000000000000F9 +:1097700000000000000000000000000000000000E9 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000000000000000000000000099 +:1097D0000000000000000000000000000000000089 +:1097E0000000000000000000000000000000000079 +:1097F0000000000000000000000000000000000069 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 +:109830000000000000000000000000000000000028 +:109840000000000000000000000000000000000018 +:109850000000000000000000000000000000000008 +:1098600000000000000000000000000000000000F8 +:1098700000000000000000000000000000000000E8 +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000000000000000000000000098 +:1098D0000000000000000000000000000000000088 +:1098E0000000000000000000000000000000000078 +:1098F0000000000000000000000000000000000068 +:109900000000000000000000000000000000000057 +:109910000000000000000000000000000000000047 +:109920000000000000000000000000000000000037 +:109930000000000000000000000000000000000027 +:109940000000000000000000000000000000000017 +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000100D6 +:1099900000030000000000000000000000000000C4 +:1099A00000000000000000000000000000000000B7 +:1099B00001000000000000000000000000000000A6 +:1099C0000000000000000000000000000000000097 +:1099D0000100000000000000000000000000000086 +:1099E0000000000000000000000000000000004037 +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000000000000056 +:109A10002000000000000000000000000000000026 +:109A20000000000000000000000000000000000036 +:109A300000002000400000000000000000000000C6 +:109A40000000000000000000000000000000000016 +:109A500000002000000000000000000000000000E6 +:109A600000000000000000000000000000000000F6 +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B2000000000000000000000000000000800002D +:109B30000000000000000040000000840000000061 +:109B4000000000000000000000000000000800000D +:109B50000084000000000040000000000000000041 +:109B600000000000000000000000000000000000F5 +:109B700000000000000000000000000000000000E5 +:109B800000000000000000000000000000000000D5 +:109B90000000000000000021000000210021002141 +:109BA000000000000000000300210021000300214C +:109BB000000000000000000000210021000800213A +:109BC0000000000000000000002100090005002145 +:109BD0000000000000000000002100000000000064 +:109BE0000000000000000000000000000000000075 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000082000092 +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000000000E4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D40000000000000000000000000000000000013 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000000000000000000000D3 +:109D900000000000000800000000000000000008B3 +:109DA000000000000000000000030000000000416F +:109DB0000000000000210008000000080000000072 +:109DC000000800000000000000000000000000008B +:109DD000000000000000000800000021000000005A +:109DE000000800000000000000000000000000006B +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000000000000000012 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000030005BA +:109EA0000021000000000000000800000000000089 +:109EB00000000000000000000000000000000000A2 +:109EC00000050000000000000021000000008800E4 +:109ED0000000000000000000000000000000000082 +:109EE000000800000000000000000000000000006A +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900001000000000000000000000000C0000000 +:109FA00000000000000000000000000000000000B1 +:109FB000000001000000000000000000000000C0E0 +:109FC0000000000000000000000000000000000091 +:109FD000000001000000000000000001000000C0BF +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 +:10A010000000410000000000000000020900008074 +:10A020000000000000000000000000000000000030 +:10A0300000000000410000000000000000020900D4 +:10A040000080000000000000000000000000000090 +:10A0500000000000410000000000000000080900AE +:10A060000080000000000000000000000000000070 +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000300CD +:10A09000000000800000800000000000820011002D +:10A0A00000800000000000000000004100000000EF +:10A0B000030000000080000080000000000082001B +:10A0C000110000000000000000000000004100003E +:10A0D00003000000008000008000000000008200FB +:10A0E00082000000000000000000000000410000AD +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F +:10A110000100000000C0000020000000000010004E +:10A120000410000802001000000000000001000000 +:10A1300000000100000000C000002000000000003E +:10A14000100010C00002020010000000000000011A +:10A1500000000100000000C000002000000000001E +:10A16000100010C0000202001000000000000001FA +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A1900000000000C00000000000000000000000FF +:10A1A00000080000000000000000000000000000A7 +:10A1B000000000000000C0000000000000000000DF +:10A1C000000000820000000000000000000000000D +:10A1D000000000000000C0000000000000000000BF +:10A1E000000000040000000000000000000000006B +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A2100000000000000080000000000000000000BE +:10A2200000000080000000000000000000000000AE +:10A23000000000000000000080000000000000009E +:10A24000000000000080000000000000000000008E +:10A25000000000000000000080000000000000007E +:10A26000000000000080000000000000000000006E +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A29000000000000000800000C10000000000007D +:10A2A0000000000000410000000400000000000069 +:10A2B0000000000000000000800000C1000000005D +:10A2C00000000004000000418000000400000000C5 +:10A2D0000000000000000000800000C1000000003D +:10A2E00000000000000000418000000400000000A9 +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A310000000000000000000400000C1000000003C +:10A3200000000000000000A1020000010000000089 +:10A3300000000000000000000000400000C100001C +:10A34000000000000000000000A11000000100005B +:10A3500000000000000000000000400000C10000FC +:10A3600000000000000000000011100000010000CB +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A39000000000000000000000000000000000427B +:10A3A0000000000000004800810000E000004800BC +:10A3B000000000000000004200000000000000005B +:10A3C00000420000000000004800810000E00000A2 +:10A3D00048000000000000000042000000000000F3 +:10A3E00000420000000000004800810000E0000082 +:10A3F00048000000000000000042000000000000D3 +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000000000000000000000000009C +:10A4C000000000000000000000000000000000008C +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000000000000000000000006C +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A510000000000000000000000000000000747B4C +:10A52000000000000000000000000000000000002B +:10A53000000000000000000000000000DE2E00000F +:10A54000747B00000000000000000000000000001C +:10A550000000000000000000000000000000DE2EEF +:10A56000747B0000000000000000000000000000FC +:10A570000000000000000000000000000000DE2ECF +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A000615603400000000000000231E00000009E +:10A5B000000000000C4000000000000002C06A869D +:10A5C0000000615603400000000000000231E0007E +:10A5D0000000000000000C4000000000000002C06D +:10A5E0006A86615603400000000000000231E0006E +:10A5F0000000000000000C4000000000000002C04D +:10A600006A8600000000000000000000000000005A +:10A61000000000000000000000000000000000003A +:10A62000000000000000000000000000000000002A +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000000000000FA +:10A6600000000000000000000000000000000000EA +:10A6700000000000000000000000000000000000DA +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000000AA +:10A6B000000000000000000000000000000000009A +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000008000000000000000000000000000051 +:10A800000008000000000000000000000000000040 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000008000000000000000000000000E0 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000820000000000840000000082 +:10A8D0000000000000000000000000000000000078 +:10A8E00000000000000000100000000000840000D4 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000082000000000084000041 +:10A910000000000000000000000000000000000037 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000000000077 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000002100000000D5 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB0000000000000000000000080000000000003D +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000008ED +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000000008CD +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B6200000000000000000000000400000000000DA +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500010000000000000000000000000000000DA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B69000000000004000000000000000000000006A +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000020000000000000000000000000000B +:10C51000000000000000000000000000000000001B +:10C5200000002000000000000000000000000000EB +:10C5300000000000000000000000000000000000FB +:10C5400000000000200000000000000000000000CB +:10C55000000000000000400000000000000000009B +:10C5600000000000200000000000000000000000AB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000008C2 +:10C6700000000000000000000008000000000000B2 +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000300000000000000000025 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000001000000000000000A8 +:10C8800000000800000000000000000000000000A0 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000010000000000000003C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000020000000000000000C +:10D50000000000000000000000000000000000001B +:10D5100000000000000040000000200000000000AB +:10D5200000000000000000000000000000000000FB +:10D5300000000000000020000000200000000000AB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D57000000000000000000000000000000040006B +:10D58000000000000000000000000000000000009B +:10D59000000000000000400000000000000000004B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000400000000000000000002B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000010DA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000010000000100000000000004A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000100000D8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000080000000800000000000066 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E4000000000000000000000000000000004000CC +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E44000000000000000000000000000000040008C +:10E4500000000000000001000000000000000000BB +:10E46000000000000000000000000000400000006C +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C0000000090000000000000000000000000043 +:10E4D00080000000000000000200000000000000BA +:10E4E00000000000000000000000000000008000AC +:10E4F00020000000000000000000000000000000FC +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000001000DB +:10E5300000000000000000000000000200000000D9 +:10E5400000000000000000000000000200001000B9 +:10E55000002000200000000000000000000000007B +:10E56000000000100000000000000000000000009B +:10E570000000000400000000000000000000000097 +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000100004A +:10E5D0008000008300010000000000000000000037 +:10E5E000000000000000000000000000000000002B +:10E5F000000000000001000000000000000000001A +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E650000000000000000000000000000000002199 +:10E6600000000000000000000000000000000008A2 +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F0000000000000000000000011000000000009 +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000080000000000D1 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E760000000008000000000000000000000000029 +:10E77000000000000085000000000000000000A173 +:10E780000000010000000000000000000000000088 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E00000000000004000000000000000000000E9 +:10E7F0000000000000000002000000840000000093 +:10E8000000200000040000000000000000000000E4 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E850000000000000000000000000000800002090 +:10E860000000000000000021000000000000000087 +:10E870000000000000000000000004000000000094 +:10E88000002000080000000500000000000000005B +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D00000000000000000000000000000008000B8 +:10E8E0000001000000000000000000000000000027 +:10E8F0000000000000000000000000008000000098 +:10E900000000000100000000000000000000000006 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E960000020000000000000001000400000000037 +:10E970000000000000000000000000000000000097 +:10E980000000000000100021001000210000000025 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000100000000000000000001000025 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000008000000AE +:10EA6000C10020008800080000C0009000009090C5 +:10EA70000000000000000000000000000000000096 +:10EA800000C101111000000100C000900000080842 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD00000000000000000000000000011008000A5 +:10EAE00000008900A100000080000080008000007C +:10EAF0008080000000000000000000000000000016 +:10EB000000000088219100110011008000800000A9 +:10EB100080800000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000800000000000008000000000A5 +:10EB70000000800000000000000000000000000015 +:10EB8000000000000900C111900289C1000080004E +:10EB90000000808000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE000000000000000880000000000008200001B +:10EBF0000000000090000000000000000000000085 +:10EC0000000000000000008810008400C191000096 +:10EC100082000000C00800000000000000000000AA +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC6000000000000001000000C00088841101C104 +:10EC70004000000090900000000000000000000034 +:10EC8000000000000000000000100000019002C120 +:10EC900000000000009000C0000000000000000024 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000004000000008000200110000804009 +:10ECF00021C18000000080800000000000000000B2 +:10ED000000000000000000000000009121021190AE +:10ED100089880000000000800080000000000000E2 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED8000000000000000000000000000C191090325 +:10ED90001100084180118011000080000000000077 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF000000000C000000000000000000000000053 +:10EE00000000000000000000000000000000911160 +:10EE1000000100000101C00120000088080000007E +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE7000000000C8430042000006000043000000FC +:10EE80000000000000000000000000000000000082 +:10EE9000008200C84300001200820000430000000E +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF000000000000000FF7F08080000000000FF85 +:10EF000000FF000000000000000000000000000002 +:10EF10000000FFFF00003C0000003C000000FF007C +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000FF7F88880000000003 +:10EF8000FF00FF0000000000000000000000000083 +:10EF900000000000000000003C0000003C000000F9 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F08000003C3CC3FFFF0000000000000000000047 +:10F090000000000000000000000000660000000FFB +:10F0A0000000003C00000F0F000000000000000006 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F00000000000000000000000000000003C3C98 +:10F100003C3C000000FFFFFF00000000000000008A +:10F110000000000000000000000000000066000089 +:10F12000000F0000003C0000000000000000000094 +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F170000000000000610006000D000000610006B4 +:10F18000059C00A0000050300000000000000000BE +:10F190000000000000000000000000000363033EC8 +:10F1A0000C0992C0038203380C00C2C000000000AA +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F0000000000000000000000000FF14BE00003E +:10F200000000003C28280000000000000000000072 +:10F210000000000000000000000000000000A0A0AE +:10F220003C20000020000000000000000000000062 +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000282800000000000000002E +:10F29000000000000000000000000000000000006E +:10F2A00000003C0000000000000000000000000022 +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F32000000000000000000000F0000000000000ED +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A00000000000000000800010001000000000BD +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F4400000000002000000000000000000000000BA +:10F4500000000000000000000000000000000000AC +:10F46000000000000000400000000000000000005C +:10F47000000000000000000000000000000000008C +:10F4800040004000000000000000000000000000FC +:10F49000000000000000000000000000000000006C +:10F4A000400000000000000000000000000000001C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F52000000000000000900000000000000000004B +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000010000000004B +:10F5B00000C0000000000000000800000000000083 +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F690000000000000000000000000000008000062 +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000008000800003A +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000000000000000002A +:10F6E000000000000000000000000000000000001A +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000050000000000080000BC +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F89000000000000000000800000000000800C098 +:10F8A0000000000000000000000000000000000058 +:10F8B00000C0000000000000000400C00084000040 +:10F8C00000000000000800840000000000000000AC +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000080000000000000000AF +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 +:10FA200000000000000000000000000000000000D6 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000000000000000000000000016 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000000000000000025 +:10FBE0000000000000000000000000000000000015 +:10FBF0000000000000000000000000000000000005 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000000000000000000000000000000D4 +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000000012 +:10FEF0000000000000000000000000000000000002 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000000001 +:020000040031C9 +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000004000000000003D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000800000000000000080008000000A4 +:1004400000000000000000000000000008000000A4 +:100450000000000000000000000000000800000094 +:10046000000000000000820000000000000000000A +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000400000000F6 +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000001000000000E8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000200009B +:10135000400000000000000000000000000000004D +:1013600000000000000000004000400000000000FD +:10137000000000000000000000000000000000006D +:10138000000000000000000000004000000000001D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000002000000000000000000000000EB +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:101420000000000020000000000000050000000097 +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A00000000000000080000000000000000000BC +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:101520000000000000000000000088000000000033 +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:101630000011000000000000000000000000000099 +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B0000000000000000000000400000000000026 +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000001000100010000A4 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B000000000000000000000000008001000040B +:1019C0000002000000000000000000000000000015 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000001000000000000000000000094 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC00000000000040040000000000000000000D1 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000C800000000CB +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD000000000610002000D000000000000000091 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:10215000000000000000000010000000000000006F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F000000000000000000000004000000000009F +:10220000000020000000000020000000000000008E +:10221000000000000000000000002000000000009E +:10222000000020000000000020000000000000006E +:10223000000000000000000000000000200000007E +:10224000000000002000000000002000000000004E +:10225000000000000000000000000000000000007E +:10226000000000002000000000000000000000004E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:10234000000002000000000000000000000000008B +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000000AC +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000000DC +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000000000000000000000009B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:102570000000000000000800000000000000000053 +:10258000000000000000000000000000000000004B +:10259000000000000000000000000000000000003B +:1025A00000000000000000000000000000400000EB +:1025B000000000000000000000000000000000001B +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B000000000000000000000000000000000001A +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000800E2 +:1026F00000C000000000000000000000000000001A +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000000000000000000099 +:102740000000000000000000000000000000000089 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 +:102790000000000000000000000000000000000039 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000000048 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C0000000000000000000000000000000000008 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:102940000000000000000000000000000000000087 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90002000000000000000000000000000000012 +:102EA0000000000000000000000200001000000010 +:102EB0000000000000000000000000000000000012 +:102EC0000000000040004000000000000000000082 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000040000000000000000000A2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F10000000800000000000000000000000000031 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F4000000000000000000010002000000400004D +:102F5000000000000000000000000000000000036E +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000010000000000021 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000080008000000100 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000008000000080000000000000000C1 +:103000000000000800000008001000000000004060 +:1030100000000008000000C00000000000000000E8 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:10305000000000000000000000000000000000214F +:103060000000000000080000000800080000000048 +:103070000008000000000000000000000000000048 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:1031900000000000000000000000000500000080AA +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000400000000000000000000000000009A +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000200000021000000212A +:10326000002100000000000000000000000000003D +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:10329000000000000000000000009000000000009E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000001000000000000ED +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:103350000000000000000100000000000000000864 +:103360000000000800210000000000000000000034 +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A0000000000000000000000000080000000015 +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000400000000000000E9 +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:1034500000000000000000000000000000008800E4 +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000011001100CA +:1034E000410000000000000000000000000000009B +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:103550000000000000000000000000000000090062 +:1035600003030980090000000000000000000000C3 +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A0000000000000000000000000000003000018 +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000101001000020000000000000000C7 +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:103660000000000000000401000100000000000054 +:10367000000000000000000000000000000000004A +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E000000000000009000000051141000000007A +:1036F00000000000000000000000000000000000CA +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 +:103730000000000020000000000000000000000069 +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:1037600000000000000080098011000080030000BC +:103770000000000000000000000000000000000049 +:103780000000000000000000000000000000000039 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E0000000000000000000100020008800100110 +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000000068 +:1038600000000000000000000000842100C84300A8 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B00000000000480000C80000000000000000F8 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000000000000000000000B7 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000001047 +:103970000002000000000000000000000000000045 +:103980000000000000000000000000000000000037 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000000F7 +:1039D00000000000000000000000000000000000E7 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B700000000000000000610037C00800000000E5 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000000000000000000005 +:103BC00000610006800D0000000000000000000001 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF000000000000000000000000000BE7D7D000D +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000C34140 +:103C8000C3C30000000000000000000000000000AE +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D00000204121200000000000000000000000089 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000020412120000000000000000000009 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF0004000000000000000000000000000000083 +:103E000000000000000000000000000000000000B2 +:103E10002000000000000000000000000000000082 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000010000000000052 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F00000000000000000000000000800000000031 +:103F10000000000000000000000000400001000060 +:103F20000000004000400000000000000000000011 +:103F30000000000000400000000000000000000041 +:103F40000000000000400000000000000000000031 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000020000011 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB00000080000000000000000000000000000F9 +:103FC00000000000000000000000000000000000F1 +:103FD00000400000000000000000000000000000A1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 +:1040D000000041000000000000000000000000009F +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:1041600000000000000000000000000000840000CB +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:104210000000000000000000000800000000000096 +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:1042400000000000000000000000A00000000000CE +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000020000000000001C +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D0000000000000000000000000C0000000001E +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000800000000B6 +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:104340000000000000000800000000000000000065 +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A0000000000000A0000000000000000000006B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000011000000000000000078 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000004300000045 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000006 +:104AB000000000000008000000A00000000000004E +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000000000D6 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000000000000000000000000055 +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C50000000000000000000000000000000000054 +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA00000000000000000000000000000004000C3 +:104DB0004000004000000000000000000000000073 +:104DC00000000000000000000000000000004000A3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E20000000000000000000000000000000000082 +:104E30000000000000000000000000000000000072 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000000032 +:104E800000000000000000000000004000000000E2 +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000010000000000000E2 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000000000000000000000000C2 +:104EF00000000008000000000000000000000000AA +:104F000000000000000000000000000000000000A1 +:104F10000000000800000000000000000000000089 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F70000000000000000000000000000000000031 +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000000000000000000000F1 +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000800000000000000000000C9 +:104FE00000000000000000000000000000000000C1 +:104FF00000000000000000000000000000000000B1 +:1050000000000000000000000000000000000000A0 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000000000070 +:105040000000000000000000000000000000000060 +:105050000000000000000000000000000000000050 +:105060000000000000000000000000000000000040 +:105070000000000000000000000000000000000030 +:105080000000000000000000000000000000000020 +:105090000000000000000000000000000000000010 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:10511000000000000000000400000000000000008B +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000000000000000000005F +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F +:10517000000000000000000000000000000000002F +:10518000000000000000000000000000000000001F +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:10552000000000000000000000000000000000007B +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A00000000000000000000000000000000000FB +:1055B00000000000000000000000000000000000EB +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000000000000000000000BB +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A +:10561000000000000000000000000000000000008A +:10562000000000000000000000000000000000007A +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:10569000000000000000000000000000000000000A +:1056A00000000000000000000000000000000000FA +:1056B00000000000000000000000000000000000EA +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:105730000000000000000000000000000000000069 +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000000000000000000000000000E9 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000000000000A9 +:105800000000000000000000000000000000000098 +:105810000000000000000000000000000000000088 +:105820000000000000000000000000000000000078 +:105830000000000000000000000000000000000068 +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000000000E8 +:1058C00000000000000000000000000000000000D8 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000000000000097 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50004000000000000000000000000000000006 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000005000000000000C1 +:105AE00000080000000000000000000800000000A6 +:105AF0000008000800000000001000000000000086 +:105B00000000000000000000000000000000000095 +:105B1000000000080000000000000000000000007D +:105B20000000001000000000000000000000000065 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000004000051 +:105B500000000008000000080000000800820008A3 +:105B60000008000000040008000800040000000015 +:105B7000000000840000000800000004000000088D +:105B800000100010000800080008000800000008CD +:105B900000000000001000080008000000080000DD +:105BA0000040000000080008000800080008000885 +:105BB00000000000000800080008000000080000C5 +:105BC00000000000000800040008000800080000B1 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000080000AD +:105BF00000000000000000000000000000000000A5 +:105C0000000000000008000000000000000000008C +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000001000000000000000000033 +:105D6000000000000000000000000000000800002B +:105D700000000000008200000000000000000000A1 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E0000000000000008000000000000000000008A +:105E10000000000000000000000000000000000082 +:105E20000000000000000000000000000000000072 +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F20000000000000000000000000000000000071 +:105F30000000000000000000000000000000000061 +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000080000D9 +:105FC000000000000000000000C000000000000011 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000000000000000A1 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000000000000000000000D0 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000000000000000000000CD +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:10642000000000000000000000000000000000006C +:10643000000000000000000000000000000000005C +:10644000000000000000000000000000000000004C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C +:1064900000000000000000000000000000000000FC +:1064A00000000000000000000000000000000000EC +:1064B00000000000000000000000000000000000DC +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC +:1064E00000000000000000000000000000000000AC +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:10651000000000000000000000000000000000007B +:10652000000000000000000000000000000000006B +:10653000000000000000000000000000000000005B +:10654000000000000000000000000000000000004B +:10655000000000000000000000000000000000003B +:10656000000000000000000000000000000000002B +:10657000000000000000000000000000000000001B +:10658000000000000000000000000000000000000B +:1065900000000000000000000000000000000000FB +:1065A00000000000000000000000000000000000EB +:1065B00000000000000000000000000000000000DB +:1065C00000000000000000000000000000000000CB +:1065D00000000000000000000000000000000000BB +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A00000000000000000000000000000000000EA +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000000069 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:10698000000000000000000000000000890001007D +:1069900000800180000000000000000000000000F6 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000100000000000000000000C6 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000040082 +:106A1000020000400802000000000000000000002A +:106A20000000000000000000000000000000200046 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B0000000000000000000000000000000800007D +:106B100000840000008200000000000800080084DB +:106B200000080088008400080008000800080084AD +:106B300000080008000000400000000800080008ED +:106B40000008000800000008000800000084000899 +:106B500000080008000800080000000800080008FD +:106B600000080008000800000008000800100008E5 +:106B70000084000800080008000000080008000861 +:106B80000008000800080000008200080000002142 +:106B900000080003000000030000000000000021C6 +:106BA00000000005000000000000000000000005DB +:106BB00000080000000000080000000800000000BD +:106BC00000090000000000000000000000000008B4 +:106BD0000000000000000000000000000000002194 +:106BE000000000000000000000000000000000089D +:106BF0000000000000000000000000000000000095 +:106C0000000000090000000000000000000000007B +:106C10000000000000000000000000000000000074 +:106C2000000000000000000800000000000000005C +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000001000000000000000000A3 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000010082 +:106D100000000008000000000000000800000084DF +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 +:106D4000000000A0000000000000000000000000A3 +:106D50000000000000000000000000000000000033 +:106D6000000000000000000008000000009000008B +:106D70000000000000000000000000000000000013 +:106D80000000000000000000000000000000000003 +:106D900008000000000000000000000000000000EB +:106DA000000800000041000000000000000000009A +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000000000C3 +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E00000000000000000000000000000000000082 +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E9000000000000000000084000000000000006E +:106EA00000000000000000000000000000080000DA +:106EB00000000000000000210000000000000000B1 +:106EC0000000004000000000000000000000000082 +:106ED00000000000000000000000000000000000B2 +:106EE0000000000000000080000000000000000022 +:106EF0000000000000000080000000000000000012 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 +:106F20000008000000000000000000000000000059 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000001000000000000011 +:106F70000000000000000000001000000000000001 +:106F800000000000000000000900000000000000F8 +:106F900000000000000002000000000000000000EF +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000004000000000000000000020 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A000000000000000000000000002808080005E +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000002000200140409E +:10713000C00000000000000000000000000000008F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000001DE +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000001000000000000000000000000000003E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00080058000000000000000000000000000C9 +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:107330000000C0002020402090000000000000005D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000700000000000000C6 +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000B4B4AAFF0000000000003B +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B0000000000000000000B4B40055000000000F +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:1075300000000000000000000000000000003CFF10 +:107540000F550000000000000000000000000000D7 +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C0003C000F550000000000000000000000001B +:1075D00000000000000000000000000000000000AB +:1075E000000000000000000000000000000000009B +:1075F000000000000000000000000000000000008B +:10760000000000000000000000000000000000007A +:10761000000000000000000000000000000000006A +:10762000000000000000000000000000000000005A +:1076300000000000000000000000000000001061D9 +:107640000006000D00050000000000000000000022 +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C000000000000F0F0F0F00000000000000007E +:1076D00000000000000000000000000000000000AA +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000049 +:107740000000000000000F0F0F0F000000000000FD +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 +:1078D0000010000000000000000000000000000098 +:1078E0000000000000000000000900000000000887 +:1078F0000000000000000000000000000000000880 +:107900000000000000000000000000000000000077 +:107910000000000000000000000000000000000067 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 +:107950000000000000000000000000000000000027 +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000000C7 +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000000000000000000A7 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000000000000000000046 +:107A4000000000000000000000000088000000842A +:107A5000000000000084000800080008000800087A +:107A600000000008001000000008000800000008E6 +:107A70000084000800000008000800080008000852 +:107A800000840008008400000008000800080000CE +:107A90000008000000080084000800080008000832 +:107AA0000008000800080084000800080008000022 +:107AB000000800000008000800080008000800088E +:107AC000000800080084008400410008000800103D +:107AD0000003002100080000000000000000002159 +:107AE0000010000800000008000000000000002155 +:107AF0000000000000000000000000000000002165 +:107B0000000000080000000000000000000000006D +:107B10000010000000050000000800000000000048 +:107B20000000000000000000000800000005000048 +:107B30000000000000000000002100000000000024 +:107B40000000000000000000004108000882410021 +:107B50000800000000000000000000000084000099 +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C200000000000000000000000000088000000CC +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD0000000000000000021000800080000000073 +:107CE0000000000000000010000000000000000084 +:107CF000000800000000000000000000000000007C +:107D00000000000000000000000000000000000073 +:107D1000000000000000000000000000000000055E +:107D2000000000000000000500000000000000004E +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D5000000000000000000000000800000000001B +:107D6000000000000000000008000000000000000B +:107D70000000000000000000000000000000000003 +:107D800000000000000000000010000000000000E3 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000000001000000000A3 +:107DD000000000000011000000030000000000008F +:107DE0000000000000000000000000000000000390 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 +:107E20000005000500050000002100050005000018 +:107E30000000400288110000000500000000000062 +:107E40000009000000000000000000000000900099 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000000000000000000000B2 +:107ED0000000000000000000C000C100000100829E +:107EE0000100C00001000083C000C1000001008249 +:107EF0000100C00001000083C000C1000001008239 +:107F00000000C00001000083C000C1000001008229 +:107F10000100C00001000083000000000001008596 +:107F20000000000000010085000000000001008545 +:107F300000000000400000830001000000010085F7 +:107F400000000000000100850000000000000000AB +:107F5000000000000000000000008041C14100035B +:107F6000008041008021410000838041C141000325 +:107F7000008041008021410000838041C141000315 +:107F8000008000418041410000838041C1410003E5 +:107F90000080410080214100008300000041000377 +:107FA000008500090011000300850009001100038D +:107FB000008500090041804100820040004100032B +:107FC000008500050041000300850040000000001E +:107FD00000000000000000000000000080C1C1415E +:107FE00000410300000000410000804180C1C14108 +:107FF00000410300000000410000804180C1C141F8 +:1080000000410300000000410041804180C1C141A6 +:1080100000410300000000410000804100004100D9 +:1080200000000085898041000000008089804100B7 +:1080300080000080898941000000008283004100A7 +:1080400000000085858041000000008540000000A0 +:10805000000000000000000000000000000040C11F +:10806000400100010100000000010000820140C148 +:10807000400100010100000000010000820140C138 +:10808000400100010100000204010001820140C121 +:108090004001000101000000000100008201000019 +:1080A00001000000008508080100000000840808A5 +:1080B000C100C000008408080100000000838300A4 +:1080C000010000000084040401000000008540401D +:1080D00000000000000000000000000000000000A0 +:1080E00000000000C100C00000000000000000000F +:1080F00000000000C100C0000000000000000000FF +:1081000000000000C100C0000000000000400000AE +:1081100000000000C100C0000000000000000000DE +:10812000000000000000010008080000000001003D +:108130000808000400000100080800000000010019 +:10814000C0C00000000001000404000000000100A5 +:10815000404000000000000000000000000000009F +:10816000000000410041C1418000000000000041CA +:10817000000000410041C1418000000000000041BA +:10818000000000410041C14180000000002100C109 +:10819000000000410041C14180000000000000419A +:1081A000000000000000000041008080000000008E +:1081B000410080800000000041008080000000003D +:1081C000410000000000000041008080000000002D +:1081D000410000000000000000000000000000005E +:1081E0000000000080410080C1C100C10041004189 +:1081F000C1C103C180410080C1C100C10041004133 +:10820000C1C103C180410080C1C100C10041004122 +:10821000C1C103C180410080C1C100C10041004112 +:10822000C1C103C1000200000000090900000000F4 +:108230000000090900000004000009894100000055 +:108240000000020200000000000005050000000020 +:10825000000040400000000000000000000000009E +:10826000000000000000400100C040C100C100014A +:10827000000140C101C1400100C040C100C1000176 +:10828000000140C101C1400100C040C100C1000166 +:10829000000140C101C1400100C040C100C1000156 +:1082A000000140C101C1000000000000000000000A +:1082B000000000000000000000000000004001007D +:1082C00000000000010100000000000000000000AC +:1082D000000000000000000000000000000000009E +:1082E00000000000000000000000000022004842E2 +:1082F0000000000000004842000000002200484248 +:108300000000000000004842000000002200484237 +:108310000000000000004842000000002200484227 +:108320000000000000004842000048420000000039 +:1083300000004842000000000000000000000000B3 +:108340000000484200000000000048420000000019 +:108350000000500A000000000000000000000000C3 +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000000000000000000CD +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000018C +:1083F00008800000000000000010000000000001E4 +:10840000010000000000000000000000000000006B +:1084100000800000000000000000000000000000DC +:1084200040000000000000000060000000000000AC +:10843000000014A894AA0000000014A894AA000048 +:10844000000014A814A80000000014A894AA0000BA +:10845000000014A894AA0000000014A894AA000028 +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B0000020000000000400002000000000040074 +:1084C0000020000000000400002000000000040064 +:1084D0000020000000000400002000000000040054 +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:1085300000001004008001002008100400800100E9 +:1085400020081004008001002008100400800100B1 +:1085500020081004008001002008100400800100A1 +:1085600020080000000000000000000000000000E3 +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:10862000000000000000000000000000000000004A +:1086300000000000000003008000040000000300B0 +:10864000800004000000030080000400000003001C +:10865000800004000000030080000400000003000C +:108660008000040000000000000000000000000086 +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000C1DB89DB686 +:1086C0000000000C1DB89DB6000000040DB88DB36D +:1086D0000000000C1DB89DB60000000C1DB89DB632 +:1086E0000000000C1DB89DB6000000000000000056 +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B0000000000000000000000000000000009029 +:1087C0009A000000000000909A0000000000009055 +:1087D0009A000000000000909A0000000000009045 +:1087E0009A000000000000909A00000000000000C5 +:1087F000000000000000000000000000FFFFFFFF7D +:10880000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10881000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10882000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10883000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10884000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10885000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10886000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10887000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10888000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:10889000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:1088A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:1088B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:1088C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:1088D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:1088E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:1088F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000100100000001000000000000000015 +:108950000000000000000000000000000000000017 +:108960000000000000000000000000000000000007 +:1089700000000000000000000000000000000000F7 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000000B7 +:1089C00000000000000000000000000000000000A7 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 +:108A10000000000000000000000000000000000056 +:108A20000000000000000000000000000000000046 +:108A30000000000000000000000000000000000036 +:108A40000000000000000000000000040000000022 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000100000000000024 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC00000000000000000000000000000000000A5 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD000000800000000000000000000000000008C +:108CE0000000000000000000000000000000000084 +:108CF0000008000000000008000000000000000064 +:108D00000008000000080000000000000000000053 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000021000000000000000002 +:108D5000000000000000000000080000000000000B +:108D600000000000000000080000000000000000FB +:108D700000030000000000050000000000000000EB +:108D800000000000000000000000000800000000DB +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000080008E1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000008000028 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:1090600000000000000000000000000000000008F8 +:1090700000000000000000000000000000000005EB +:1090800000000000000000210000000800000000B7 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:10915000000000000000000000000000000000000F +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F +:1091D000000000000000000000000000000000008F +:1091E000000000000000000000000000000000007F +:1091F000000000000000000000000000000000006F +:10920000000000000000000000000000000000005E +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:1092300000000000000000000000000080000000AE +:10924000000000000000000000000000000000001E +:10925000000000000000000000000000000000000E +:10926000000000000000000000000000000280007C +:10927000000000000000000000000000000280006C +:1092800000000000001100000000000000000000CD +:1092900000000000000000000000000000000000CE +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000000000800A6 +:1092C000000000000000000000000000000002009C +:1092D000000000000000000000000000000000008E +:1092E000000000000000000000000000000000007E +:1092F0000800000000000000020000000000000064 +:109300000800000000000000000000000000000055 +:10931000000000000000000000000000000000004D +:10932000000000000000000000000000000000003D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D +:1093600000000000000000000000000000000000FD +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000000000000004C +:10942000000000000000000000000000000000003C +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000020000FA +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC +:1094A00000000000000000000000000000000000BC +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000000000008C +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000000000005B +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:109540000000000000000000000000000000000714 +:109550000000000000000000000000000000000704 +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C000000000000000000000000000000000009B +:1095D000000000000000000000000000000000008B +:1095E000000000000000000000000000000000007B +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000000000003A +:10963000000000000000000C00000000000000001E +:10964000000000000000000000000000000000001A +:109650000001000000000000000000000000000009 +:1096600000010000000000000000000000000000F9 +:1096700000000000000000000000000000000000EA +:1096800000000000000000000000000000000000DA +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000000000000000000000000000000000AA +:1096C000000000000000000000000000000000009A +:1096D000000000000000000000000000000000008A +:1096E000000000000000000000000000000000007A +:1096F000000000000000000000000000000000006A +:109700000000000000000000000000000000000059 +:109710000000000000000000000000000000000049 +:109720000000000000000000000000000000000039 +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:1097500000000000100400000000000000000000F5 +:1097600000000000100400000000000000000000E5 +:1097700000000000000000000000000000000000E9 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000000000000000000000000099 +:1097D0000000000000000000000000000000000089 +:1097E0000000000000000000000000000000000079 +:1097F0000000000000000000000000000000000069 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 +:109830000000000000000000000000000000000028 +:109840000000000000000000000000000000000018 +:109850000000000000000000000000000000000008 +:1098600000000000000000000000000000000000F8 +:1098700000000000000000000000000000000000E8 +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000000000000000000000000098 +:1098D0000000000000000000000400000000000084 +:1098E0000000000000000000000400000000000074 +:1098F0000000000000000000000000000000000068 +:1099000000000000000080000000000400000000D3 +:10991000000000040000800000000004000080003F +:109920000000000000000000000000000000000037 +:109930000000000000000000000000000000000027 +:109940000000000000000000000000000000000017 +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 +:1099800000000002000000000000000000000000D5 +:109990004000000200000000400000020000000043 +:1099A0004000000000000000000000000000000077 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000000000000000000000000000097 +:1099D0000000000000000000000000000080800087 +:1099E0000000000000000000000000000080800077 +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000100000000000000046 +:109A10008000000000000000900000000000000036 +:109A200090000000000000000000000000000000A6 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B20000000000000000000000000000000000035 +:109B30000000000000000000000000000000000025 +:109B40000000000000000000000000000000000015 +:109B50000000000000000000000000000000000005 +:109B600000000000000000000000000000000000F5 +:109B700000000000000000000000000000000000E5 +:109B800000000000000000000000000000000000D5 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 +:109BC0000000000000000000000000000000000095 +:109BD0000000000000000000000000000000000085 +:109BE0000000000000000000000000000000000075 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000000000E4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D40000000000000000000000000000000000013 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000000000000000000000D3 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000000000000000012 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000000000000000000082 +:109EE0000000000000000000000000000000000072 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 +:109FC0000000000000000000000000000000000091 +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 +:10A010000000000000000000000000000000000040 +:10A020000000000000000000000000000000000030 +:10A030000000000000000000000000000000000020 +:10A040000000000000000000000000000000000010 +:10A050000000000000000000000000000000000000 +:10A0600000000000000000000000000000000000F0 +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000000D0 +:10A0900000000000000000000000000000000000C0 +:10A0A00000000000000000000000000000000000B0 +:10A0B00000000000000000000000000000000000A0 +:10A0C0000000000000000000000000000000000090 +:10A0D0000000000000000000000000000000000080 +:10A0E0000000000000000000000000000000000070 +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F +:10A11000000000000000000000000000000000003F +:10A12000000000000000000000000000000000002F +:10A13000000000000000000000000000000000001F +:10A14000000000000000000000000000000000000F +:10A1500000000000000000000000000000000000FF +:10A1600000000000000000000000000000000000EF +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A1900000000000000000000000000000000000BF +:10A1A00000000000000000000000000000000000AF +:10A1B000000000000000000000000000000000009F +:10A1C000000000000000000000000000000000008F +:10A1D000000000000000000000000000000000007F +:10A1E000000000000000000000000000000000006F +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A21000000000000000000000000000000000003E +:10A22000000000000000000000000000000000002E +:10A23000000000000000000000000000000000001E +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000000000000BE +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000000000000000008E +:10A2D000000000000000000000000000000000007E +:10A2E000000000000000000000000000000000006E +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000000000002D +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A3900000000000000000000000000000000000BD +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000008D +:10A3D000000000000000000000000000000000007D +:10A3E000000000000000000000000000000000006D +:10A3F000000000000000000000000000000000005D +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000000000000000000000000009C +:10A4C000000000000000000000000000000000008C +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000000000000000000000006C +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B +:10A53000000000000000000000000000000000001B +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB +:10A5600000000000000000000000000000000000EB +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000000009B +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000000000000000000007B +:10A5E000000000000000000000000000000000006B +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000000000000000004A +:10A61000000000000000000000000000000000003A +:10A62000000000000000000000000000000000002A +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000000000000FA +:10A6600000000000000000000000000000000000EA +:10A6700000000000000000000000000000000000DA +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000000AA +:10A6B000000000000000000000000000000000009A +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000000000077 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000020000D3 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000010000000000000000000000000051 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000080000D9 +:10AF700000000000080000000000000000000000C9 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA9000000000000000000000000000090003009A +:10BAA0000500080000000000000000000000000089 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000900095 +:10BB20009000A00080000000000000000000000065 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000020001100000000002044 +:10BBB0000000000000030000000000400000000042 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000200200000000072 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000010001000011 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000002000000000002000000AF +:10BD90000000000000000400000000008800000314 +:10BDA000000000000004000300000000002000006C +:10BDB0000000002100000000000000000000000062 +:10BDC000000000080000000000000000000000006B +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE90000000000000000000C000000000000000E2 +:10BEA000000000000000000000000011000000057C +:10BEB000000000000000000800000000000000007A +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000020000C1000001C1829A +:10BFA0000100C0000140C191C100C1000084C082F5 +:10BFB0000100C0000085200000000000000000001B +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C01000000000000000000000000041C14100419C +:10C02000C1834141804141838803C1108821008040 +:10C030008080414180210883000000000000000052 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C09000000000000000000000000000410011410D +:10C0A00000C10000414191410041204102C10841CD +:10C0B000008083004100A14100C180100000000009 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000100C10000000140010089000108C1B8 +:10C13000908900C0830802002001004082080000AE +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A00000400000C183000000000000C18208833D +:10C1B00000020000C140000000000000000000007C +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000800041C183000000000041C1887F +:10C23000808300C10041C1C1000000000021024113 +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A00000000000C191804180C1000041080041B0 +:10C2B000C1C103C1C141008080C100002041000014 +:10C2C000808020100000000000000000000000003E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C3200000000000000040C020018240000000002A +:10C33000080104C101C1400390C040C100000101D7 +:10C340000000104000890000000000000000000014 +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A0000000000000000000000000000000484203 +:10C3B0000000000000004842484200600600484279 +:10C3C0000000000000004800000000000000000025 +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B +:10C520000000000000000000000000000000757B1B +:10C5300000000000000000000000000000000000FB +:10C54000000000000000000000000000DEAE00005F +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B00067E643400000000000000231E000000098 +:10C5C000000000000C4000000000000002C267E60E +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000110000000000000000000000000057 +:10C8D00000004020090000000000000000000000EF +:10C8E00000900000000000000000000000000000B8 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000004000000000000D2 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC00000000000000000000000000000820400E0 +:10CAD000409000004000400400200000008800005A +:10CAE000000000000400000000000400000000003E +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D570000000000000110000000000020000000098 +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D680000000000000000000000000000000820018 +:10D6900082000000000000000000040004000400FC +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D78000880040004000400040000000040000000D +:10D790000000400004000000000000000000000045 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000090000000000400000082 +:10DA1000000000000000000000000088000040003E +:10DA200000000000040000000000000000000000F2 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E0000000000400000000000000000000000027 +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E74000900000002000040090000400040000007D +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C000000000000000040000000000040000003F +:10E9D0000000000000000000000000200000000017 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000040000000000000000000000001B +:10F1F0000000000000000000000000040002000009 +:10F2000000000000000200000000000000000000FC +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F0000000000000000000000002000200020008 +:10F3000002000000000000000000000000000000FB +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F360000000000000000000000000000400000099 +:10F37000040004000400040000000000000000007D +:10F3800090004000000000000000000000000000AD +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F00000000000000000000000000000200000ED +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F0000000000000000000000000040000000007 +:10F6000000000020000000000000000000000000DA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000000000000000002A +:10F6E000000000000000000000000000000000001A +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 +:10FA200000000000000000000000000000000000D6 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000000000000000000000000016 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000000000000000025 +:10FBE0000000000000000000000000000000000015 +:10FBF0000000000000000000000000000000000005 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000000000000000000000000000000D4 +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000000012 +:10FEF0000000000000000000000000000000000002 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000000001 +:020000040032C8 +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:10012000000000020000000000000000000000903D +:1001300000020000000000000002000000000002B9 +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:10054000000000000000002000000000000000008B +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:10106000000000000000000000000004000000007C +:101070000000000000000000000000000000000070 +:10108000000000040000000000000000000000005C +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E00000000002000400000000000000020000F8 +:1010F00000000000000400000000000200000000EA +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:101180000000020002000400000000000000000057 +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000200020000000000EB +:1012000000000000040004000200040000000000D0 +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000400000003E +:10127000000000000000000000000000040000006A +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000200000000BE +:1020200000020000000200000002000200000000A8 +:10203000008200000000000000000000000000001E +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B00040000000000000000000000000000000DF +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000000AC +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000000DC +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000000000000000000000009B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:10258000000000000000000000000000000000004B +:10259000000000000000000000000000000000003B +:1025A000000000000000000000000000000000002B +:1025B000000000000000000000000000000000001B +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B000000000000000000000000000000000001A +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000000000000000000099 +:102740000000000000000000000000000000000089 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 +:102790000000000000000000000000000000000039 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000000048 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C0000000000000000000000000000000000008 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:102940000000000000000000000000000000000087 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000000D3 +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F6000000000000000000000000000000400005D +:102F70000000000000040000000000000004000049 +:102F8000000000000000000000000000000400003D +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD000000000000000000000400000000200901F +:102FE00000020002000000040002000000000000D7 +:102FF00000040000000000000004000000000000C9 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000400040000000000000000000400B3 +:1031100004000400040000000000000000000000A3 +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000040000000000000000005B +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000020AF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000000000000000000000CA +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 +:103730000000000000000000000000000000000089 +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000000000000049 +:103780000000000000000000000000000000000039 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 +:1037B0000000000000000000000000000000000009 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000000000000000000000B7 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000000F7 +:1039D00000000000000000000000000000000000E7 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F1000000000000000000200000000000000009F +:103F2000000000000002000000000002000200008B +:103F3000000000020000000000000000000000007F +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040000000000000000000000000000000000070 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000090000000000080 +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000000000000000000000000000000000E8 +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A000000000000000000000000000000000000A6 +:104A10000000000000000000000000000000000096 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000000000D6 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000000000000000000000000055 +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C50000000000000000000000000000000000054 +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000003 +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E20000000000000000000000000000000000082 +:104E30000000000000000000000000000000000072 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E6000000000000000000000000000000000043E +:104E70000000000000000004000400000000000426 +:104E8000000200000000000400000000000000001C +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000000000000000000F2 +:104EC00000001000000000000000000000000000D2 +:104ED00000000000000000020000000000000000D0 +:104EE00000020000000000000004000000000002BA +:104EF00000000000000000000000000000000000B2 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000000000000000091 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F7000000000000000000000000200000000002F +:104F80000000000000000000000004000400000019 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000000000000000000000F1 +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000000000000000000000000D1 +:104FE00000000000000000000000000000000000C1 +:104FF00000000000000000000200020000000000AD +:1050000000000000000000000000000000000000A0 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000000000070 +:105040000000000000000000000000000000000060 +:105050000000000000000000000000000000000050 +:10506000040000000000000000000000000000003C +:105070000000000000000000000000000000000030 +:105080000000000000000000000000000000000020 +:105090000000000000000000000000000000000010 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000000000000000000005F +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F +:10517000000000000000000000000000000000002F +:10518000000000000000000000000000000000001F +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000000000000000000BE +:1052F000000000400000000000000000000000006E +:10530000000000000000000000000000000000009D +:10531000000000000000000000000000000000008D :10532000000000000000000000000000000000007D :10533000000000000000000000000000000000006D :10534000000000000000000000000000000000005D @@ -206353,8 +206353,8 @@ :105DD00000000000000000000000000000000000C3 :105DE00000000000000000000000000000000000B3 :105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 +:105E00000000000000000000000000000000009002 +:105E1000000000000090000000900000000400045A :105E20000000000000000000000000000000000072 :105E30000000000000000000000000000000000062 :105E40000000000000000000000000000000000052 @@ -206365,7 +206365,7 @@ :105E90000000000000000000000000000000000002 :105EA00000000000000000000000000000000000F2 :105EB00000000000000000000000000000000000E2 -:105EC00000000000000000100000000000000000C2 +:105EC00000000000000000000000000000000000D2 :105ED00000000000000000000000000000000000C2 :105EE00000000000000000000000000000000000B2 :105EF00000000000000000000000000000000000A2 @@ -206599,15 +206599,15 @@ :106D30000000000000000000000000000000000053 :106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 -:106D60000000000000000000000000000000000023 -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 +:106D6000000000000000000000000004000000001F +:106D7000000400000000000000040000000000000B +:106D800000040004000000000000000000000000FB :106D900000000000000000000000000000000000F3 :106DA00000000000000000000000000000000000E3 -:106DB0000040000000000000000000000000000093 +:106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 -:106DD0000000004000000000000000000000000073 -:106DE00000000000000000000000000000000000A3 +:106DD0000090009000900090000000000002000071 +:106DE000000000000000000000000004000000009F :106DF0000000000000000000000000000000000093 :106E00000000000000000000000000000000000082 :106E10000000000000000000000000000000000072 @@ -206615,20 +206615,20 @@ :106E30000000000000000000000000000000000052 :106E40000000000000000000000000000000000042 :106E50000000000000000000000000000000000032 -:106E6000000000000008000000000000000000001A -:106E7000000000000000000000000008000000000A -:106E80000000000000000000000000000000000002 +:106E6000000000000000000000000000000800001A +:106E70000000000000000000000000000000000012 +:106E800004000400000400000000000000000000F6 :106E900000000000000000000000000000000000F2 :106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 +:106EB00000000000000000000000000000080000CA :106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000008000000000000000079 +:106ED00000000000000000000000000000000008AA +:106EE000000000000000000000080000000000009A +:106EF000000000000000000000000000000000048E +:106F0000000000000000000000040000000000007D :106F10000000000000000000000000000000000071 -:106F20000000000000000000000000400000000021 -:106F30000000000000000000000000000000000051 +:106F20000000000000000000000000210000000040 +:106F3000000000000000000000000003000000004E :106F40000000000000000000000000000000000041 :106F50000000000000000000000000000000000031 :106F60000000000000000000000000000000000021 @@ -206643,12 +206643,12 @@ :106FF0000000000000000000000000000000000091 :107000000000000000000000000000000000000080 :10701000000000000000000000000000000000214F -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 +:107020000000000800000000000000000000000058 +:10703000000000000000000000000000000000034D +:107040000000000800000000000000000000000038 :107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 +:107060000000000000080000000000000000000018 +:107070000000000000000000000000000000000808 :107080000000000000000000000000000000000000 :1070900000000000000000000000000000000000F0 :1070A00000000000000000000000000000000000E0 @@ -206656,13 +206656,13 @@ :1070C00000000000000000000000000000000000C0 :1070D00000000000000000000000000000000000B0 :1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 +:1070F0000008000000000000000000000000000088 :10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F +:107110000008000000000000000000000000000067 :10712000000000000000000000000000000000005F :10713000000000000000000000000000000000004F :10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F +:107150000008000000000000000000000000000027 :10716000000000000000000000000000000000001F :10717000000000000000000000000000000000000F :1071800000000000000000000000000000000000FF @@ -206843,41 +206843,41 @@ :107C70000000000000000000000000000000000004 :107C800000000000000000000000000000000000F4 :107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 +:107CA00000000000000200040000000000000000CE :107CB00000000000000000000000000000000000C4 :107CC00000000000000000000000000000000000B4 :107CD00000000000000000000000000000000000A4 :107CE0000000000000000000000000000000000094 :107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 -:107D20000000000000000000000000000000000053 +:107D000000000000000000000000008200000000F1 +:107D10000000000000000000000800000000000457 +:107D2000000400000000000400000000000000004B :107D30000000000000000000000000000000000043 :107D40000000000000000000000000000000000033 :107D50000000000000000000000000000000000023 -:107D6000000000000000000000000000000000080B +:107D60000000000000000000000000000000000013 :107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000008EB -:107D900000000000000000000000000000040000DF -:107DA00000000000000000000000000300000000D0 -:107DB00000000000000000050000000000040000BA +:107D800000000000000000000000000000030000F0 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000400000000CF +:107DB00000000003000000000000000000000000C0 :107DC00000000000000000000000000000000000B3 :107DD00000000000000000000000000000000000A3 :107DE0000000000000000000000000000000000093 -:107DF00000000008000000000082000400000008ED -:107E0000000000080000000000000000000000006A -:107E1000000000080008000000000000008400844A -:107E2000000800000008000000000000000800003A -:107E30000008001000080000000400000084008218 -:107E400000040000008200000000000000000000AC +:107DF0000000008400000000000000840000000873 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000800000008000052 +:107E20000008000000040000000800080004000032 +:107E300000820000000000000004000000040000B8 +:107E4000000400000000000000000000000000002E :107E50000000000000000000000000000000000022 -:107E600000000000000000210000000000000000F1 -:107E700000000000000000050000000000000000FD -:107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 -:107EA0000000000000000000000000000040002171 -:107EB00000080000000000000000000000000008B2 -:107EC00000000000000000000000000000000000B2 +:107E600000000000000000000000000000210002EF +:107E700000000000000000000000000000080000FA +:107E800000000000000800000000000000000008E2 +:107E9000880000000000900000009000000000003A +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000020000000000000000B0 :107ED00000000000000000000000000000000000A2 :107EE0000000000000000000000000000000000092 :107EF0000000000000000000000000000000000082 @@ -206895,21 +206895,21 @@ :107FB00000000000000000000000000000000000C1 :107FC00000000000000000000000000000000000B1 :107FD00000000000000000000000000000000000A1 -:107FE0000008000000000008000000080000000079 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000080000000068 -:108010000000000000080000000000000000000058 -:10802000000800A000080008000000000000000098 -:108030000008000000000000000000000000100028 -:108040000000000000A00008000000000000000088 +:107FE0000000000800A000000000000000000000E9 +:107FF00000000000000000000082000000000000FF +:10800000000000A0000000000000000000000000D0 +:1080100000000082000000000000000000000000DE +:108020000000000000C00000000000000000000090 +:1080300000000008000000000000000000A0000098 +:1080400000000000000800820000000000000000A6 :108050000000000000000000000000000000000020 :108060000000000000000000000000000000000010 :108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 +:1080800000080000000000000000000000000000E8 +:1080900000000008000000000000000800000000D0 :1080A00000000000000000000000000000000000D0 :1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 +:1080C000000300000008000000000000000000089D :1080D00000000000000000000000000000000000A0 :1080E0000000000000000000000000000000000090 :1080F0000000000000000000000000000000000080 @@ -206920,20 +206920,20 @@ :10814000000000000000000000000000000000002F :10815000000000000000000000000000000000001F :10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000800000000E7 -:1081900000000000000000000000000000000000DF +:1081700000000000000001000000000000000000FE +:1081800000000000000000000000000000000100EE +:1081900000000000000000000100000000000000DE :1081A00000000000000000000000000000000000CF :1081B00000000000000000000000000000000000BF :1081C00000000000000000000000000000000000AF :1081D000000000000000000000000000000000009F -:1081E0000000000800A000000000000800000000DF -:1081F000000000000000000000000000000000007F -:1082000000000008008400000000000800000000DA -:10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E +:1081E0000000000800000000000000A000000008DF +:1081F0000000000000000000080000000000000077 +:108200000000000000000000000000080000000066 +:1082100008820008000000000000080800000000BC +:108220000000000000000000000000000008000046 :10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E +:1082400000820000008200000000000000C000006A :10825000000000000000000000000000000000001E :10826000000000000000000000000000000000000E :1082700000000000000000000000000000000000FE @@ -207090,94 +207090,94 @@ :108BE0000000000000000000000000000000000085 :108BF0000000000000000000000000000000000075 :108C00000000000000000000000000000000000064 -:108C100000000000000000000000018000000000D3 -:108C2000000000000000000000000000000800003C -:108C300000000000000000000000018000010000B2 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 :108C40000000000000000000000000000000000024 :108C50000000000000000000000000000000000014 :108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 +:108C700000000004000400000000000400000000E8 :108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000020080000AC +:108C900000000000000000000000000000000000D4 :108CA00000000000000000000000000000000000C4 -:108CB000000000000000000000000000100400019F -:108CC00000000000000000000000000000000000A4 -:108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 -:108CF000000000080000000000000008000800005C +:108CB0000000000000840000000000000000000030 +:108CC000000000000000000000000082008400009E +:108CD0000000000000840000000000000000000010 +:108CE0000000000200000000000000000000000082 +:108CF000000000000000000800000000000000006C :108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000000000053 +:108D10000000000000000000010001000100090047 :108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D4000000100000008000000000000000000001A -:108D500000000000000000000000110003000500FA -:108D600008000000001000000000000000000000EB -:108D700000000003000000000000090003002100C3 -:108D800009000000000000000000000000000000DA -:108D900000000000000000000000000000000000D3 -:108DA00000000000000000000000000000000000C3 -:108DB0000000000000840000008400080008008219 -:108DC0000084000100080004000000000000000012 -:108DD000001000000008000800000000880890084B -:108DE000A00880000008000800000008000000083B -:108DF0000008000800080008000000009008900823 -:108E00008408840000000000000000000000000052 -:108E10000000000000000000000000000000002131 -:108E20000005000800020002000000000005000527 -:108E30000021000000000000000000000008000009 -:108E400000030021000100020008000000030000F0 -:108E500000000010000800050000000000000021D4 -:108E60000000002100210021000900050000002170 -:108E70000000000900210041000000400000002126 -:108E800000020002002100000000000000000000BD +:108D3000000000000000000001000100010005002B +:108D40000000000000000000000000000000000023 +:108D500000000000000000000000110011002100D0 +:108D600008000000000000000000000000000200F9 +:108D700000000000000000000000110011000500CC +:108D800003000000000000000000000000000000E0 +:108D900000000000000000000000100002002000A1 +:108DA000840000000000000000000000000000003F +:108DB0000000000000000008000808001084040003 +:108DC000880000000084000000000008000000008F +:108DD0000000000000000008001000088800820861 +:108DE00084888000000000000084008400080008DF +:108DF00000100000000400080008008488008208B9 +:108E0000A0080800000000000000000000000000B2 +:108E100000000000000000000000002100210021EF +:108E2000002100210008002100210021000200098A +:108E300000210003000000210021002100000000AB +:108E40000021000000000021002100210005000099 +:108E500000219008840020118803002100000000F8 +:108E600000050008000000000000000800000000ED +:108E70000000001000090000000000030040000096 +:108E800000210000000000000000000000000000C1 :108E900000000000000000000000000000000000D2 :108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 -:108EC0000000000800000001000000000000000099 -:108ED0000000000000000000000000000000000092 +:108EB0000000000000000090000000000000000022 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000200000000000090 :108EE0000000000000000000000000000000000082 -:108EF0000000000000000002000000000000000070 +:108EF000000000000000000000000040000000082A :108F00000000000000000000000000000000000061 :108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 +:108F2000010001000120000000000000000000001E :108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 +:108F4000010001000102000000000000000000001C :108F50000000000000000000000000000000000011 :108F600000000000000000020020000000000000DF :108F700000000000000000000000000000000000F1 -:108F800000000000000000020000000000000000DF +:108F80000000000000000140002000000000000080 :108F900000000000000000000000000000000000D1 -:108FA00000000000000000000000000800000000B9 -:108FB00000000000000000000000000800000000A9 -:108FC00000000000000000A0000000000000000001 -:108FD0000000000800000000000000000000000089 -:108FE000000000000000000000010001000000106F -:108FF0000008000000000000000000000000000069 -:10900000000000000000000000010000000000005F -:10901000000000000000002100000000000000032C -:1090200000000000000800080000000090000000A0 -:109030002000000000000005000000000000000506 -:10904000000000000000000000000002000000001E -:109050000005000000000000000000080000000003 -:1090600000000000000000050000000000000000FB -:1090700000000004000000000000004000030000A9 -:10908000004000210000000020002000000000003F +:108FA0000000080010004001000000000000000068 +:108FB00000000000000000000000000000000000B1 +:108FC0000000100002082001000000000000000066 +:108FD000000000000000000800A0000000000000E9 +:108FE000000000000000000000A1000100080000D7 +:108FF0000000000000000000000800000000000069 +:10900000000000000000000040000001000000001F +:10901000000000000000000000000003000000004D +:109020000021000000009000000000050000000585 +:10903000001100000000000000000002000000001D +:109040000005000000000000000000050000000511 +:10905000000590050000000000000000000000086E +:10906000004000080000000502000000000500406C +:1090700000000000000200000005000000080000E1 +:109080000000000000000005004000000005000096 :1090900000000000000000000000000000000000D0 :1090A00000000000000000000000000000000000C0 :1090B00000000000000000000000000000000000B0 :1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 +:1090D00000000000000000000000000000001184FB +:1090E00000000082000000000000000000000000FE :1090F0000000000000000000000000000000000070 :10910000000000000000000000000000000000005F :1091100000000000000000008800000000000000C7 -:1091200000000008000300080021000500080000FE -:1091300000000008000500008800C00000080000D2 -:10914000001100080005002100000008000800418F -:109150000000000000000000000000000008000007 -:109160000000000000000021000000050041000098 -:1091700000000003000000210003000000000003C5 -:1091800000000000000000000000000000210000BE +:109120000000000000080008000500080000000022 +:1091300000030000004100080000000500000000DE +:1091400000000008000800080011002100080000CD +:109150000000000000000008880800080003000369 +:1091600000030000000000100008000300050000DC +:1091700000000003000800000021000000050000BE +:1091800000000000000300000010000300050000C4 :1091900000000000000000000000000000000000CF :1091A00000000000000000000000000000000000BF :1091B00000000000000000000000000000000000AF @@ -207186,76 +207186,76 @@ :1091E000000000000000000000000000000000007F :1091F000000000000000000000000000000000006F :10920000000000000000000000000000000000005E -:109210000000000000010001000100C00001C001C9 -:1092200000C000890100040100400082000100012B -:1092300000C0000000010001000100C00001C001E9 -:1092400000C00003000100010020008800010001AF -:1092500000C1000000020000C1000001C182010045 -:10926000C0000140C089C000C0010010C0820000E1 -:10927000C000001190000000C1000001C182010087 -:10928000C0000141C089C000C0010002C0820000CE -:10929000C0000011900000410041004100910041D8 -:1092A0008041008409414109024100800080004161 -:1092B0000041008200000041004100410091004156 -:1092C0008041008909C10040054100800000004143 -:1092D00000410085000000000041C1410041C190F3 -:1092E0004141804141828403800882030080808064 -:1092F00000418041080300000041C1410041C1908C -:1093000041418041418884038008820300008080BD -:1093100000418041088300004100030000000080FC -:1093200041008900000003000500C10000419000D9 -:109330004100C100008000004100030000000080E7 -:1093400041009000000003000500418000418900B9 -:109350004141C1000080808000014100024100C104 -:109360000000414182410041084120C1024100808A -:1093700083804100C14100C180084100114100C10A -:109380000000414182410041204120C10441008050 -:1093900083804100C14100C180080100010000003C -:1093A00000C00100C00000000100840008C000C12E -:1093B000C0000500C100008402020100010000009D -:1093C00000C00100C000000001008800881000C13A -:1093D000C0000501C1000084101000000000000161 -:1093E00000C10000000140010011010102C110890B -:1093F00000C083C01000400100C1820100000001D4 -:1094000000C10000000140010011000102C11089EB -:1094100000C083C08200400100C1820100C0000181 -:10942000C0C100000000000100C0C0030003000133 -:1094300000C10000000000010000000000C00001A9 -:10944000C0C100000000000100C0C0020103000113 -:1094500000C100000000000100000000000000400A -:109460000000C183000000000000C18210830004DE -:109470000000C140000000000000C00100000040EA -:109480000000C183000000000000C18210830002C0 -:109490000000C140000000000000C100000000808A -:1094A000004180C1000000000041008980030041AC -:1094B000004100C1000000000041000200000080E7 -:1094C000004180C100000000004100918021414125 -:1094D000004100C100000000004100110000000038 -:1094E00000800041C183000000000041C18400836E -:1094F00000410041C1C1000000000041890300009B -:1095000000800041C183000000000041C190008341 -:1095100000410041C1C10000000000219041000055 -:10952000C100804180C10080410000051100410060 -:10953000C1000000800900004100000080004100DF -:10954000C100800080C100004102000041004100D4 -:10955000C1000000801000004100000080004100B8 -:109560000000C182804180C100004100004109C16A -:1095700003C1C141008080C10000411000418080D2 -:109580001089C191804180C100004100004111C19A -:1095900003C1C141008080C10000414100008080C2 -:1095A0001003C1004001C0C100820100100102008F -:1095B0000100C1101000C000000001000000C00048 -:1095C0000100C1004000C0C10000010010001000F7 -:1095D0000100C1101000C000000001000000C00028 -:1095E0000100000040C02001824000000000040192 -:1095F00010C101C1409188C040C1000000000001BD -:1096000040C0011040C02001824000000000020163 -:1096100002C101C1409188C040C1000000010000AA -:1096200010C00188000000000000D04200000000CF -:109630000000C813411200480700C12300000000C9 -:1096400000000000000000000000004200000000D8 -:109650000000C813411200480700D023000000009A -:109660000000C100000000000000000048420000AF +:10921000000000000000C1000001C1820100C00088 +:109220000140C021C001C0010002C0820000C00096 +:10923000000910000000C1000001C1820100C0004F +:109240000140C021C001C0010002C0820100C00075 +:109250000005880000030000C1000001C182010078 +:10926000C0000140C121C001C0010002C082000055 +:10927000C000001188000000C1000001C18201008F +:10928000C0000140C109C000C1010010C08200003F +:10929000C000000510000041C1410041C1824141B0 +:1092A0008041418984038040910300008080004117 +:1092B0008041108380000041C1410041C182414191 +:1092C00080414189840380409103000080804141B6 +:1092D00080211103000000000041C1410041C1890B +:1092E0004141804141898803804091030000808092 +:1092F00000418041080300000041C1410041C18498 +:1093000041418041419084838004880300808080B3 +:1093100000418041100300004100114100C10000E4 +:10932000414182410041094184C102C100848380DE +:109330004100C14100C180404100034100C1000023 +:10934000414190410041094104C102C10084838030 +:109350004100A14100C1804100004100034100C122 +:109360000000414183410041094104C110C1008412 +:1093700083804100C14100C180104100094100C10A +:1093800000004141C0410041404109C110410080FD +:1093900083804100C14100C180080000000100C17C +:1093A0000000000140010011000109C1044100C199 +:1093B00083C01000400100C182010000010100C112 +:1093C0000002000140010011000111C1904100C1E3 +:1093D00083C0100020010040820100000000010154 +:1093E00000C10002000140010011000110C18941CB +:1093F00000C183C01000400100C1820000000001D4 +:1094000000C10000000141010089010110C1880371 +:1094100000C083C01000400100C182010040000074 +:10942000C183000000000000C18202830010000020 +:10943000C140000000000000C0000000002000004B +:109440000340000000000000C182108300100000F3 +:10945000C1400000000000000100000000000010FA +:1094600000000340000000000000C18204830010DF +:109470000000C140000000000000C00101000040E9 +:109480000000C140000000000000C182048300C051 +:109490000000C140000000000000C000000000808B +:1094A0000041C183000000000041C19000830041E1 +:1094B0000041C1C1000000000021904100000000F7 +:1094C000002141C1000000000041C19080830041A3 +:1094D0000041C1C100000000002110410000000057 +:1094E0000000002141C1000000000041C1828083D2 +:1094F00000410041C1C1000000000041C105410020 +:1095000000800041C1C1000000000041C190008303 +:1095100000410041C1C1000000000021894100005C +:10952000C191804180C100004100004108C103C1D8 +:10953000C1C1008080C1000041410000008003885B +:1095400020C18000800200004100004108C103C129 +:10955000C1C1008080C10000204100008080111046 +:10956000000020C18000800200004100004108C1CD +:1095700003C1C1C1808080C1000041100011808002 +:109580000203C1C18000809100004108004188C1F0 +:1095900003C1C1C1008080C10000414100000080C2 +:1095A000101040C02001824000000000020103C1F1 +:1095B00001C1400502C040C100000001000088C098 +:1095C0000011A1C14000400200000000880103C159 +:1095D00001C1400902C040C100000101000010406B +:1095E00000C10000A1C1400040020000000088014D +:1095F00011C101C1400910C040C1000000000000BD +:1096000082C0001040C108004010000000010201AB +:1096100041C101C1401102C040C100000001000071 +:1096200090C0010800000000000048420000000057 +:109630000000484248420060060048420000000026 +:109640000000484200000000000048420000000006 +:109650000000484248420060060048420000000006 +:109660000000481200000000000000004842000016 :1096700000000000484248420060060048420000E6 :1096800000000000484200000000000048420000C6 :1096900000000000484248420060060048420000C6 @@ -207283,11 +207283,11 @@ :1097F0000000000000000000000000000000000069 :1098000000000000000000000000DEAE757B0000DC :109810000000000000000000000000000000000048 -:1098200000000000000000000000DEAE60C6030083 -:109830000000000000000031E00000000000000017 -:109840000C0000000000000000C0630660C60300BA -:109850000000000000000031E000000000000000F7 -:109860000C0000000000000000C06306000067E676 +:1098200000000000000000000000DEAE67E64340DC +:109830000000000000000231E00000000000000015 +:109840000C4000000000000002C267E667E64340EB +:109850000000000000000231E000000000000000F5 +:109860000C4000000000000002C267E6000067E64E :1098700043400000000000000231E0000000000052 :1098800000000C4000000000000002C267E667E62E :1098900043400000000000000231E0000000000032 @@ -207296,51 +207296,51 @@ :1098C0000000000000000000000000000000000098 :1098D0000000000000000000000000000000000088 :1098E0000000000000000000000000000000000078 -:1098F0000000000000000008000000000000000060 +:1098F0000000000000000000000000000000000068 :109900000000000000000000000000000000000057 -:109910000000000000000000001000000000000037 -:109920000000000000080000000000000000080027 +:10991000000000000000000000000000000400043F +:10992000000000000004000400000000000000002F :109930000000000000000000000000000000000027 :109940000000000000000000000000000000000017 :109950000000000000000000000000000000000007 :1099600000000000000000000000000000000000F7 :1099700000000000000000000000000000000000E7 :1099800000000000000000000000000000000000D7 -:1099900000000800000000000000000000000000BF +:1099900000000000000000000000000000000000C7 :1099A00000000000000000000000000000000000B7 :1099B00000000000000000000000000000000000A7 :1099C0000000000000000000000000000000000097 :1099D0000000000000000000000000000000000087 :1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 +:1099F00000000000000000008400000000000000E3 :109A00000000000000000000000000000000000056 :109A10000000000000000000000000000000000046 :109A20000000000000000000000000000000000036 :109A30000000000000000000000000000000000026 :109A40000000000000000000000000000000000016 -:109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000010E6 -:109A700000000000000000000008000000000010CE -:109A800000000000000000080000000000000000CE -:109A9000008800000000000000100084000800089A -:109AA0000000000000000008008400040000000026 -:109AB000000000000008000000000000000000009E -:109AC0000000000000000000000000000000004155 -:109AD000000000000000000000080000000000215D -:109AE0000000000000000000000000000000000571 -:109AF000000000000000000000000008000000005E -:109B00000000000000000000000300000000000052 -:109B100000000000004100000000000800000000FC -:109B20000000000000000011000000000003000021 -:109B300001000000004100000000000000000000E3 -:109B40000000000000000000000000A00000000075 -:109B500000A000080010000000000000000000004D -:109B60000008008200000000008800A000C0000083 -:109B700000840010008400000000000000000008C5 -:109B800000082010000000A00000000000080008ED -:109B900000100002000000000040000800880000E3 -:109BA00040002000000000A00000000000A000080D -:109BB00000080284000000002000000000000000F7 +:109A500000000000050005000500000000000000F7 +:109A60000000008400000084008400000010000852 +:109A7000000000080000050005880000000000004C +:109A8000000000820000000000000000008200884A +:109A90000008000000100000000000880000000026 +:109AA00000000000000000000000000000000000B6 +:109AB000008800000000000000000000000000001E +:109AC0000000000000000000000000000000010095 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF00000000000002100000000002100410000E3 +:109B000000800000000000110000000900000000BB +:109B10000000000000000000000000000000000045 +:109B200000000000000000000000004000000000F5 +:109B300000000040000000000000000000001100D4 +:109B40000000000000000000000000080008000005 +:109B50000208000000000008000000080084110056 +:109B60000000000000000000008200A000A000082B +:109B700000100000000000080000000000000000CD +:109B8000110000400000000000000000008800C03C +:109B900000020082000000000010000800A0008207 +:109BA00000880000000000000040000000080008DD +:109BB000000800A0000000000008000000000000F5 :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 @@ -207358,29 +207358,29 @@ :109CA00000000000000000000000000000000000B4 :109CB00000000000000000000000000000000000A4 :109CC0000000000000000000000000000000000094 -:109CD0000000008000000000000000000000000004 -:109CE000000000000000000000000000000000086C -:109CF00000000080000000000000000000410000A3 -:109D00000000000000000000000000000000000053 -:109D1000000000000000000000000000000000083B -:109D20000000000000000000000000000000000033 -:109D300000000000000000000000000800400200D9 -:109D4000000000000000000000A000000000000073 -:109D5000000000000010000000C000000000000033 -:109D6000000000000000000000C000000000000033 -:109D700000820084001000000000000000000000CD -:109D800000000000000000000000000800000000CB -:109D90000040200000A0008800000000000011002A -:109DA00000A00000000000082000000800000000E3 -:109DB0000084200000840088000000A01100200022 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000041000000000000000000000003000020 +:109D0000000000000008000000000000000000004B +:109D10000000000000000010001100000000000022 +:109D20000000000000000002000000210000000010 +:109D3000000000000000000000080000000000001B +:109D4000000000000000000000000000000000080B +:109D50000000000000000000008800080000000271 +:109D6000000000002000000000000000000800A02B +:109D7000200000000000000000082000000000009B +:109D80000000000000000008200000820000000227 +:109D90000090200000820000000000880000000009 +:109DA000000000000000000000000008000800089B +:109DB0000008000000820088000000000000400051 :109DC0000090000000000000000000000000000003 :109DD0000000000000000000000000000000000083 -:109DE0000000000000000000000000000000000073 -:109DF000000000000000000000000000000800005B -:109E00000000000000210000000800000000000029 +:109DE0000000000000000000000000000000000370 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 :109E10000000000000000000000000000000000042 :109E20000000000000000000000000000000000032 -:109E3000000000000000000000000003000000051A +:109E30000000000000000000000000000000000022 :109E40000000000000000000000000000000000012 :109E50000000000000000000000000000000000002 :109E600000000000000000000000000000000000F2 @@ -207496,13 +207496,13 @@ :10A54000000000000000000000000000000000000B :10A5500000000000000000000000000000000000FB :10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000000000000000DB +:10A5700000000000000000000000000000100000CB :10A5800000000000000000000000000000000000CB :10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB +:10A5A000000000000000000000000000000000109B :10A5B000000000000000000000000000000000009B :10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000106B +:10A5D000000000000000000000000000000000007B :10A5E000000000000000000000000000000000006B :10A5F000000000000000000000000000000000005B :10A60000000000000000000000000000000000004A @@ -207537,21 +207537,21 @@ :10A7D0000000000000000000000000000000000079 :10A7E0000000000000000000000000000000000069 :10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000001008 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000004000000000000E4 +:10A8000000000000000082000000000000000000C6 +:10A810000000040004000400040000000000000028 +:10A8200000000000000082000000000000000000A6 +:10A8300000000000040004002000200000000000D0 +:10A840000000000000000000820000000000000482 +:10A8500000000000040804000000000000040000E4 +:10A8600000000000000000000000000000000000E8 :10A8700000000000000000000000000000000000D8 :10A8800000000000000000000000000000000000C8 :10A8900000000000000000000000000000000000B8 :10A8A00000000000000000000000000000000000A8 :10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 +:10A8C0000000000000040000000000000000000084 :10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000800000000000000000060 +:10A8E0000000000000000000000000000000000068 :10A8F0000000000000000000000000000000000058 :10A900000000000000000000000000000000000047 :10A910000000000000000000000000000000000037 @@ -207562,28 +207562,28 @@ :10A9600000000000000000000000000000000000E7 :10A9700000000000000000000000000000000000D7 :10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000030084 -:10A9D0000300000000000000000004000400040068 -:10A9E0000008000000000000000400000000030850 -:10A9F000000800000000000000000000000000004F +:10A9900000000000000000080000000000000000AF +:10A9A0000000000000000000000000002000000087 +:10A9B000000000000008000000082000200804003B +:10A9C0000408000000000000000400000000200057 +:10A9D00003000008000800000008200020042000F8 +:10A9E000200400000004000400040200020020040F +:10A9F0000004000000000000000000000000000053 :10AA00000000000000000000000000000000000046 :10AA10000000000000000000000000000000000036 :10AA20000000000000000000000000000000000026 :10AA30000000000000000000000000000000000016 -:10AA400000000000200000000000000000000000E6 -:10AA50009000000000000000000002000000000064 -:10AA600000000000200000000000000000000000C6 -:10AA700002000000000000000000000000000000D4 +:10AA40000000000000000000000000000000000006 +:10AA50008800000000000000000000000000000866 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 :10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000080000000000000008000076 -:10AAD0000000000000000010000000000000000066 -:10AAE00000000040000800000000000000400000DE +:10AA9000000000000000000000000084000000082A +:10AAA000000000000000000000000008000000009E +:10AAB000000000000000000800000000000000008E +:10AAC00000000082000000000000000800080000F4 +:10AAD000000000000008000000000000000000006E +:10AAE000000000000008000000000000000000005E :10AAF0000000000000000000000000000000000056 :10AB00000000000000000000000000000000000045 :10AB10000000000000000000000000000000000035 @@ -207591,7 +207591,7 @@ :10AB30000000000000000000000000000000000015 :10AB40000000000000000000000000000000000005 :10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 +:10AB600000000000002000000000000000000000C5 :10AB700000000000000000000000000000000000D5 :10AB800000000000000000000000000000000000C5 :10AB900000000000000000000000000000000000B5 @@ -207600,31 +207600,31 @@ :10ABC0000000000000000000000000000000000085 :10ABD0000000000000000000000000000000000075 :10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 +:10ABF0000000000000002000000000000000000035 :10AC00000000000000000000000000000000000044 :10AC10000000000000000000000000000000000034 :10AC20000000000000000000000000000000000024 :10AC30000000000000000000000000000000000014 -:10AC40000000000000000000000000000000000004 +:10AC400000000000000000000000000000000008FC :10AC500000000000000000000000000000000000F4 :10AC600000000000000000000000000000000000E4 :10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA0000000000000000000000000000000001094 +:10AC800000000008000000000000000000000000BC +:10AC90000000000000000084000000000000000030 +:10ACA000000000080000000000000000000000009C :10ACB0000000000000000000000000000000000094 -:10ACC0000000000000000000000000000000000084 -:10ACD00000000000008400000000000800000000E8 -:10ACE00000000084000000000000000000000000E0 -:10ACF000000000000284000000A00000000000002E +:10ACC000000000000008000000000000000000007C +:10ACD000000000840200020000A00000000000400C +:10ACE0000000000000000000000000000000000064 +:10ACF000000000000008000000000000000000004C :10AD00000000000000000000000000000000000043 :10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 +:10AD20000008000000000000000000000008000013 :10AD30000000000000000000000000000000000013 :10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000008EB -:10AD600000000000000000000000000000080000DB -:10AD700000000000000000000000000000000008CB +:10AD500000000000000000000000000000080000EB +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 :10AD800000000000000000000000000000000000C3 :10AD900000000000000000000000000000000000B3 :10ADA00000000000000000000000000000000000A3 @@ -207633,7 +207633,7 @@ :10ADD0000000000000000000000000000000000073 :10ADE0000000000000000000000000000000000063 :10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 +:10AE00002000000000000000000000000000000022 :10AE10000000000000000000000000000000000032 :10AE20000000000000000000000000000000000022 :10AE30000000000000000000000000000000000012 @@ -207789,20 +207789,20 @@ :10B7900000000000000000000000000000000000A9 :10B7A0000000000000000000000000000000000099 :10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 +:10B7C0000000000000000000100000000000000069 :10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000000000000000000000059 +:10B7E0000000000000000000000010000000000049 :10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000300000000000035 -:10B810000000000000000000000800000000000020 -:10B820000000000000000000000000000000000018 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000004000400000000000010 :10B830000000000000000000000000000000000008 :10B8400000000000000000000000000000000000F8 :10B8500000000000000000000000000000000000E8 :10B8600000000000000000000000000000000000D8 :10B8700000000000000000000000000000000000C8 :10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 +:10B8900000080000000000000000000000000000A0 :10B8A0000000000000000000000000000000000098 :10B8B0000000000000000000000000000000000088 :10B8C0000000000000000000000000000000000078 @@ -207814,28 +207814,28 @@ :10B920000000000000000000000000000000000017 :10B930000000000000000000000000000000000007 :10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A000000000000000000800000000000000008F +:10B9500000000000000000000000000000000400E3 +:10B9600004000400000000000000000000000000CF +:10B9700020000000000000000000000000000000A7 +:10B9800004000400000000000000000000000000AF +:10B990002000000000000000000000000000000087 +:10B9A0000000000000000000000000000000000097 :10B9B0000000000000000000000000000000000087 :10B9C0000000000000000000000000000000000077 :10B9D0000000000000000000000000000000000067 :10B9E0000000000000000000000000000000000057 :10B9F0000000000000000000000000000000000047 :10BA00000000000000000000000000000000000036 -:10BA10000000000000000000900000000000000096 -:10BA20000000000000000000000000000000000016 +:10BA10000000000000000000000000000000000026 +:10BA200000000000000000000000000000002000F6 :10BA30000000000000000000000000000000000006 :10BA400000000000000000000000000000000000F6 :10BA500000000000000000000000000000000000E6 :10BA600000000000000000000000000000000000D6 :10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000800000000AE +:10BA800000000000000000000000000000000000B6 :10BA900000000000000000000000000000000000A6 -:10BAA000000000000000000000000008000000008E +:10BAA0000000000000000000000000000000000096 :10BAB0000000000000000000000000000000000086 :10BAC0000000000000000000000000000000000076 :10BAD0000000000000000000000000000000000066 @@ -207852,7 +207852,7 @@ :10BB800000000000000000000000000000000000B5 :10BB900000000000000000000000000000000000A5 :10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 +:10BBB0000000000011000000000000000000000074 :10BBC0000000000000000000000000000000000075 :10BBD0000000000000000000000000000000000065 :10BBE0000000000000000000000000000000000055 @@ -207866,7 +207866,7 @@ :10BC600000000000000000000000000000000000D4 :10BC700000000000000000000000000000000000C4 :10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000002000000000000A2 +:10BC90000000000000002000000000000000000084 :10BCA0000000000000000000000000000000000094 :10BCB0000000000000000000000000000000000084 :10BCC0000000000000000000000000000000000074 @@ -208036,16 +208036,16 @@ :10C700000000000000000000000000000000000029 :10C710000000000000000000000000000000000019 :10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000800000000D1 -:10C7600000000008000000000000000000000000C1 +:10C7300000000000000000000000000000000200F7 +:10C7400002000200020000000000000800080000D3 +:10C750000000820000000008000800000000000047 +:10C76000000802002040000000000000000000005F :10C7700000000000000000000000000000000000B9 :10C7800000000000000000000000000000000000A9 :10C790000000000000000000000000000000000099 :10C7A0000000000000000000000000000000000089 :10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 +:10C7C0000000000000000000000000080000000061 :10C7D0000000000000000000000000000000000059 :10C7E0000000000000000000000000000000000049 :10C7F0000000000000000000000000000000000039 @@ -208061,9 +208061,9 @@ :10C890000000000000000000000000000000000098 :10C8A0000000000000000000000000000000000088 :10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E000000000000400040004000200000000003A +:10C8C0000000000000000000040000000000000064 +:10C8D0000000000000000000040000000000000054 +:10C8E0000000000004000400040004000000000038 :10C8F0000000000000000000000000000000000038 :10C900000000000000000000000000000000000027 :10C910000000000000000000000000000000000017 @@ -208078,7 +208078,7 @@ :10C9A0000000000000000000000000000000000087 :10C9B0000000000000000000000000000000000077 :10C9C0000000000000000000000000000000000067 -:10C9D0000000000000080008000000000000000047 +:10C9D000000800000000000000000000000000004F :10C9E0000000000000000000000000000000000047 :10C9F0000000000000000000000000000000000037 :10CA00000000000000000000000000000000000026 @@ -208087,16 +208087,16 @@ :10CA300000000000000000000000000000000000F6 :10CA400000000000000000000000000000000000E6 :10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 +:10CA600000000000000000000000080000000000BE :10CA700000000000000000000000000000000000B6 :10CA800000000000000000000000000000000000A6 :10CA90000000000000000000000000000000000096 :10CAA0000000000000000000000000000000000086 :10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000200020062 -:10CAD0000200020000000000000000000000000052 -:10CAE000040004000000000000000000000002003C -:10CAF0000200000000000000000000000000000034 +:10CAC000040000000000000000000000040004005A +:10CAD0000000040000000000000000000000000052 +:10CAE0000200040000000000000000000200080036 +:10CAF000080002000000000000000000000000002C :10CB00000000000000000000000000000000000025 :10CB10000000000000000000000000000000000015 :10CB20000000000000000000000000000000000005 @@ -208110,7 +208110,7 @@ :10CBA0000000000000000000000000000000000085 :10CBB0000000000000000000000000000000000075 :10CBC0000000000000000000000000000000000065 -:10CBD000000000000000000000000000000000084D +:10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 :10CBF0000000000000000000000000000000000035 :10CC00000000000000000000000000000000000024 @@ -208128,7 +208128,7 @@ :10CCC0000000000000000000000000000000000064 :10CCD0000000000000000000000000000000000054 :10CCE0000000000000000000000000000000000044 -:10CCF00000000000004000000000000000000000F4 +:10CCF00000000000000000400000000000000000F4 :10CD00000000000000000000000000000000000023 :10CD10000000000000000000000000000000000013 :10CD20000000000000000000000000000000000003 @@ -208230,11 +208230,11 @@ :10D3200000000000000000000000000000000000FD :10D3300000000000000000000000000000000000ED :10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D37000000000000000840084008400840000009D -:10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D +:10D3500000000000000004000400020000000000C3 +:10D360000000000000000400000084000000000035 +:10D370000000880000008400840020008400000079 +:10D3800000004000000088000000200000000000B5 +:10D390008800000000000000000000000000000005 :10D3A000000000000000000000000000000000007D :10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D @@ -208257,8 +208257,8 @@ :10D4D000000000000000000000000000000000004C :10D4E000000000000000000000000000000000003C :10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D510000500050000000000000000000000000001 +:10D5000000000000000000000000000020000900F2 +:10D5100005000500090000004000000000000000B8 :10D5200000000000000000000000000000000000FB :10D5300000000000000000000000000000000000EB :10D5400000000000000000000000000000000000DB @@ -208279,9 +208279,9 @@ :10D6300000000000000000000000000000000000EA :10D6400000000000000000000000000000000000DA :10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA +:10D660000000000000000000000000000000A0001A :10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A +:10D6800000000400080000000000A000A00000004E :10D69000000000000000000000000000000000008A :10D6A000000000000000000000000000000000007A :10D6B000000000000000000000000000000000006A @@ -208290,8 +208290,8 @@ :10D6E000000000000000000000000000000000003A :10D6F000000000000000000000000000000000002A :10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000090000 -:10D7200000000000000000000000000000000000F9 +:10D7100000000000000000000000000021000000E8 +:10D7200009000000000000000000000000000000F0 :10D7300000000000000000000000000000000000E9 :10D7400000000000000000000000000000000000D9 :10D7500000000000000000000000000000000000C9 @@ -208299,7 +208299,7 @@ :10D7700000000000000000000000000000000000A9 :10D780000000000000000000000000000000000099 :10D790000000000000000000000000000000000089 -:10D7A0000000000000000000000000000000000079 +:10D7A0000000080000000000000000000000000071 :10D7B0000000000000000000000000000000000069 :10D7C0000000000000000000000000000000000059 :10D7D0000000000000000000000000000000000049 @@ -208311,10 +208311,10 @@ :10D8300000000000000000000000000000000000E8 :10D8400000000000000000000000000000000000D8 :10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 +:10D8600000000000000000000000000000000400B4 :10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 +:10D88000000000000000000000000800040000008C +:10D890000000000000000000000004000000000084 :10D8A0000000000000000000000000000000000078 :10D8B0000000000000000000000000000000000068 :10D8C0000000000000000000000000000000000058 @@ -212175,14 +212175,14 @@ :10C9A0000000000000000000000000000000000087 :10C9B0000000000000000000000000000000000077 :10C9C0000000000000000000000000000000000067 -:10C9D000000000080000000000000000000000004F +:10C9D0000000000000000000000000000000000057 :10C9E0000000000000000000000000000000000047 :10C9F0000000000000000000000000000000000037 :10CA00000000000000000000000000000000000026 :10CA10000000000000000000000000000000000016 :10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000210000D5 -:10CA400000000000000000000000000000080000DE +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 :10CA500000000000000000000000000000000000D6 :10CA600000000000000000000000000000000000C6 :10CA700000000000000000000000000000000000B6 @@ -212205,7 +212205,7 @@ :10CB800000000000000000000000000000000000A5 :10CB90000000000000000000000000000000000095 :10CBA0000000000000000000000000000000000085 -:10CBB000000000A000820000000000000000000053 +:10CBB0000000000000000000000000000000000075 :10CBC0000000000000000000000000000000000065 :10CBD0000000000000000000000000000000000055 :10CBE0000000000000000000000000000000000045 @@ -212213,7 +212213,7 @@ :10CC00000000000000000000000000000000000024 :10CC10000000000000000000000000000000000014 :10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000080000EC +:10CC300000000000000000000000000000000000F4 :10CC400000000000000000000000000000000000E4 :10CC500000000000000000000000000000000000D4 :10CC600000000000000000000000000000000000C4 @@ -212433,7 +212433,7 @@ :10D9C0000000000000000000000000000000000057 :10D9D0000000000000000000000000000000000047 :10D9E0000000000000000000000000000000000037 -:10D9F0000000000000020000000000000000000025 +:10D9F0000000000000000000000000000000000027 :10DA00000000000000000000000000000000000016 :10DA10000000000000000000000000000000000006 :10DA200000000000000000000000000000000000F6 @@ -212463,7 +212463,7 @@ :10DBA0000000000000000000000000000000000075 :10DBB0000000000000000000000000000000000065 :10DBC0000000000000000000000000000000000055 -:10DBD0000000000000000000000000000000200025 +:10DBD0000000000000000000000000000000000045 :10DBE0000000000000000000000000000000000035 :10DBF0000000000000000000000000000000000025 :10DC00000000000000000000000000000000000014 @@ -212505,7 +212505,7 @@ :10DE400000000000000000000000000000000000D2 :10DE500000000000000000000000000000000000C2 :10DE600000000000000000000000000000000000B2 -:10DE7000000000000004000000000000000000009E +:10DE700000000000000000000000000000000000A2 :10DE80000000000000000000000000000000000092 :10DE90000000000000000000000000000000000082 :10DEA0000000000000000000000000000000000072 @@ -212513,7 +212513,7 @@ :10DEC0000000000000000000000000000000000052 :10DED0000000000000000000000000000000000042 :10DEE0000000000000000000000000000000000032 -:10DEF0000000000000000010000000000000000012 +:10DEF0000000000000000000000000000000000022 :10DF00000000000000000000000000000000000011 :10DF10000000000000000000000000000000000001 :10DF200000000000000000000000000000000000F1 @@ -212529,7 +212529,7 @@ :10DFC0000000000000000000000000000000000051 :10DFD0000000000000000000000000000000000041 :10DFE0000000000000000000000000000000000031 -:10DFF000000000000000000000000000000400001D +:10DFF0000000000000000000000000000000000021 :10E000000000000000000000000000000000000010 :10E010000000000000000000000000000000000000 :10E0200000000000000000000000000000000000F0 @@ -212537,7 +212537,7 @@ :10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 :10E0600000000000000000000000000000000000B0 -:10E07000000000000000000000000000000000039D +:10E0700000000000000000000000000000000000A0 :10E080000000000000000000000000000000000090 :10E090000000000000000000000000000000000080 :10E0A0000000000000000000000000000000000070 @@ -212554,7 +212554,7 @@ :10E1500000000000000000000000000000000000BF :10E1600000000000000000000000000000000000AF :10E17000000000000000000000000000000000009F -:10E18000000000020000000000000000000000008D +:10E18000000000000000000000000000000000008F :10E19000000000000000000000000000000000007F :10E1A000000000000000000000000000000000006F :10E1B000000000000000000000000000000000005F @@ -212677,8 +212677,8 @@ :10E900000000000000000000000000000000000007 :10E9100000000000000000000000000000000000F7 :10E9200000000000000000000000000000000000E7 -:10E9300000000000000000000000000400000000D3 -:10E9400000000000000000000000000000080000BF +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 :10E9500000000000000000000000000000000000B7 :10E9600000000000000000000000000000000000A7 :10E970000000000000000000000000000000000097 @@ -212691,9 +212691,9 @@ :10E9E0000000000000000000000000000000000027 :10E9F0000000000000000000000000000000000017 :10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000080000EE -:10EA20000000000000000000008400000000000062 -:10EA30000000000000000000000000000040000096 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 :10EA400000000000000000000000000000000000C6 :10EA500000000000000000000000000000000000B6 :10EA600000000000000000000000000000000000A6 @@ -212733,7 +212733,7 @@ :10EC80000000000000000000000000000000000084 :10EC90000000000000000000000000000000000074 :10ECA0000000000000000000000000000000000064 -:10ECB000000000000000000000000008000000004C +:10ECB0000000000000000000000000000000000054 :10ECC0000000000000000000000000000000000044 :10ECD0000000000000000000000000000000000034 :10ECE0000000000000000000000000000000000024 @@ -213150,7 +213150,7 @@ :10068000000000000000000000000000000000006A :10069000000000000000000000000000000000005A :1006A000000000000000000000000000000000004A -:1006B0000000000000000000000000000004000432 +:1006B000000000000000000000000000000000003A :1006C000000000000000000000000000000000002A :1006D000000000000000000000000000000000001A :1006E000000000000000000000000000000000000A @@ -213647,7 +213647,7 @@ :10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B :1025B000000000000000000000000000000000001B -:1025C0000000000000000004000400000000000003 +:1025C000000000000000000000000000000000000B :1025D00000000000000000000000000000000000FB :1025E00000000000000000000000000000000000EB :1025F00000000000000000000000000000000000DB @@ -213907,7 +213907,7 @@ :1035D00000000000000000000000000000000000EB :1035E00000000000000000000000000000000000DB :1035F00000000000000000000000000000000000CB -:1036000000000000000000000800000000000000B2 +:1036000000000000000000000000000000000000BA :1036100000000000000000000000000000000000AA :10362000000000000000000000000000000000009A :10363000000000000000000000000000000000008A @@ -216570,9 +216570,9 @@ :10DC400000000000000000000000000000000000D4 :10DC500000000000000000000000000000000000C4 :10DC600000000000000000000000000000000000B4 -:10DC70000000000000000000400000000000000064 +:10DC700000000000000000000000000000000000A4 :10DC80000000000000000000000000000000000094 -:10DC90000000000000000000400000000000000044 +:10DC90000000000000000000000000000000000084 :10DCA0000000000000000000000000000000000074 :10DCB0000000000000000000000000000000000064 :10DCC0000000000000000000000000000000000054 @@ -216580,7 +216580,7 @@ :10DCE0000000000000000000000000000000000034 :10DCF0000000000000000000000000000000000024 :10DD00000000000000000000000000000000000013 -:10DD100000000000000000000000200000000000E3 +:10DD10000000000000000000000000000000000003 :10DD200000000000000000000000000000000000F3 :10DD300000000000000000000000000000000000E3 :10DD400000000000000000000000000000000000D3 @@ -216831,8 +216831,8 @@ :10EC90000000000000000000000000000000000074 :10ECA0000000000000000000000000000000000064 :10ECB0000000000000000000000000000000000054 -:10ECC0000000000000000000000000000000000044 -:10ECD00000000000000040000000000000000000F4 +:10ECC00000000000000000000000000040004000C4 +:10ECD0000000400040004000000000000000000074 :10ECE0000000000000000000000000000000000024 :10ECF0000000000000000000000000000000000014 :10ED00000000000000000000000000000000000003 @@ -217063,19 +217063,19 @@ :10FB100000000000000000000000000000000000E5 :10FB200000000000000000000000000000000000D5 :10FB300000000000000000000000000000000000C5 -:10FB40004000000000000000000000000000000075 +:10FB400000000000000000000000000000000000B5 :10FB500000000000000000000000000000000000A5 -:10FB60000000400000000000000000000000000055 +:10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 -:10FB80000000400000000000000000000000000035 +:10FB80000000000000000000000000000000000075 :10FB90000000000000000000000000000000000065 :10FBA0000000000000000000000000000000000055 :10FBB0000000000000000000000000000000000045 :10FBC0000000000000000000000000000000000035 :10FBD0000000000000000000000000000000000025 -:10FBE00000000000200000000000000000000000F5 +:10FBE0000000000000000000000000000000000015 :10FBF0000000000000000000000000000000000005 -:10FC000000000000200000000000000000000000D4 +:10FC000000000000000000000000000000000000F4 :10FC100000000000000000000000000000000000E4 :10FC200000000000000000000000000000000000D4 :10FC300000000000000000000000000000000000C4 @@ -217083,11 +217083,11 @@ :10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 :10FC70000000000000000000000000000000000084 -:10FC8000000000000008000000000000000000105C +:10FC80000000000000000000000000000000000074 :10FC90000000000000000000000000000000000064 :10FCA0000000000000000000000000000000000054 :10FCB0000000000000000000000000000000000044 -:10FCC0000000000000000004000000000000000030 +:10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 :10FCE0000000000000000000000000000000000014 :10FCF0000000000000000000000000000000000004 @@ -217109,14 +217109,14 @@ :10FDF0000000000000000000000000000000000003 :10FE000000000000000000000000000000000000F2 :10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000000080000CA +:10FE200000000000000000000000000000000000D2 :10FE300000000000000000000000000000000000C2 :10FE400000000000000000000000000000000000B2 :10FE500000000000000000000000000000000000A2 :10FE60000000000000000000000000000000000092 :10FE70000000000000000000000000000000000082 -:10FE8000000000000000000000000000000000086A -:10FE9000000000080000000000000000000000005A +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 :10FEA0000000000000000000000000000000000052 :10FEB0000000000000000000000000000000000042 :10FEC0000000000000000000000000000000000032 @@ -217319,7 +217319,7 @@ :100B000000000000000000000000000000000000E5 :100B100000000000000000000000000000000000D5 :100B200000000000000000000000000000000000C5 -:100B30000000000000000000000040000000000075 +:100B300000000000000000000000000000000000B5 :100B400000000000000000000000000000000000A5 :100B50000000000000000000000000000000000095 :100B60000000000000000000000000000000000085 @@ -217327,33 +217327,33 @@ :100B80000000000000000000000000000000000065 :100B90000000000000000000000000000000000055 :100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 +:100BB0000000000000004000400000004000400035 :100BC00040000000000000000000000000000000E5 :100BD0000000000000000000000000000000000015 :100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000300030000EF -:100C000000000000000000000008000000000000DC +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 :100C100000000000000000000000000000000000D4 :100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000003B1 +:100C300000000000000000000000000000000000B4 :100C400000000000000000000000000000000000A4 :100C50000000000000000000000000000000000094 :100C60000000000000000000000000000000000084 -:100C7000000000000000000000000000000000086C -:100C80000000000800000008000800000008000044 -:100C90000000000400080000000000000000000048 -:100CA0000008000000080000000800080008000814 -:100CB00000000008000000840000000000000000A8 -:100CC0000008000000080000008200080010000872 -:100CD00000000010000000080000000000000000FC +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 :100CE0000000000000000000000000000000000004 :100CF00000000000000000000000000000000000F4 :100D000000000000000000000000000000000000E3 :100D100000000000000000000000000000000000D3 :100D200000000000000000000000000000000000C3 :100D300000000000000000000000000000000000B3 -:100D400000000000000000000003000000000000A0 -:100D5000000000080000000000000000000000008B +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 :100D60000000000000000000000000000000000083 :100D70000000000000000000000000000000000073 :100D80000000000000000000000000000000000063 @@ -217371,21 +217371,21 @@ :100E400000000000000000000000000000000000A2 :100E50000000000000000000000000000000000092 :100E60000000000000000000000000000000000082 -:100E7000000800000000000000000008000800005A +:100E70000000000000000000000000000000000072 :100E80000000000000000000000000000000000062 -:100E90000000000000000000000800000008000042 +:100E90000000000000000000000000000000000052 :100EA0000000000000000000000000000000000042 -:100EB00000820000000000000000000000000008A8 -:100EC000000000000000000000A000000000000082 -:100ED0000008000000A00000000000000008000062 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 :100EE0000000000000000000000000000000000002 :100EF00000000000000000000000000000000000F2 :100F000000000000000000000000000000000000E1 :100F100000000000000000000000000000000000D1 :100F200000000000000000000000000000000000C1 :100F300000000000000000000000000000000000B1 -:100F40000021000000000000000000000000000080 -:100F50000000000000000008000000000000000089 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 :100F60000000000000000000000000000000000081 :100F70000000000000000000000000000000000071 :100F80000000000000000000000000000000000061 @@ -217402,14 +217402,14 @@ :1010300000000000000000000000000000000000B0 :1010400000000000000000000000000000000000A0 :101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000878 -:101070000000000800000008000000000008000058 -:101080000000000000000000000000000000000858 -:101090000000000800000008000800000008000030 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 :1010A0000000000000000000000000000000000040 -:1010B0000008000000080000000800080000000808 +:1010B0000000000000000000000000000000000030 :1010C0000000000000000000000000000000000020 -:1010D000000800000008008200000008000000086E +:1010D0000000000000000000000000000000000010 :1010E0000000000000000000000000000000000000 :1010F00000000000000000000000000000000000F0 :1011000000000000000000000000000000000000DF @@ -217558,54 +217558,54 @@ :1019F00000000000000000000000000000000000E7 :101A000000000000000000000000000000000000D6 :101A100000000000000000000000000000000000C6 -:101A20000000000000000000000021000000000095 +:101A200000000000000000000000000000000000B6 :101A300000000000000000000000000000000000A6 -:101A4000000000000000000000000008000300008B +:101A40000000000000000000000000000000000096 :101A50000000000000000000000000000000000086 -:101A60000000000000000000000000002100000055 +:101A60000000000000000000000000000000000076 :101A70000000000000000000000000000000000066 -:101A800000000000000000000000000020800000B6 +:101A80000000000000000000000000000000000056 :101A90000000000000000000000000000000000046 -:101AA00000000000000000000000000090000000A6 +:101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 -:101AC00000000000000000000000000020000000F6 +:101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 -:101AE0000000000000000000000000000000900066 +:101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 -:101B0000000000000000000000000000000040088D +:101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 :101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000110084 +:101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 -:101B70000004000000000000000000000000000061 -:101B8000000000000000000000000000000008004D -:101B90000004000000000000000000000000000041 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 -:101BC000000000000000000800000008000800827B -:101BD000A000000000000000000000080008000055 -:101BE0000008008200000082000800000008008455 -:101BF00000080008008400000000001000840000BD -:101C00000084000000000000008400000084000048 -:101C100000100008000000000000000000000000AC -:101C20000000000000000000000000210021000072 -:101C300000000021002100210005002100210000FA -:101C400000080021002100210000002100210000E7 -:101C500000080021000000080021002100210021CF -:101C600000000008002100000021000500210021E3 -:101C70000000000800210021002100000021004197 -:101C800000050021002100210021000000210005A5 -:101C9000000000090021000000000000000000001A +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 :101CA0000000000000000000000000000000000034 :101CB0000000000000000000000000000000000024 -:101CC000000000000008000200000000000000000A +:101CC0000000000000000000000000000000000014 :101CD0000000000000000000000000000000000004 :101CE00000000000000000000000000000000000F4 :101CF00000000000000000000000000000000000E4 -:101D000000000000000000000002000000000000D1 -:101D100000080000000000000000000000000000BB +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 :101D200000000000000000000000000000000000B3 :101D300000000000000000000000000000000000A3 :101D40000000000000000000000000000000000093 @@ -217613,23 +217613,23 @@ :101D60000000000000000000000000000000000073 :101D70000000000000000000000000000000000063 :101D80000000000000000000000000000000000053 -:101D90000000000000000000200000000000000023 +:101D90000000000000000000000000000000000043 :101DA0000000000000000000000000000000000033 :101DB0000000000000000000000000000000000023 -:101DC000000000000000000000000000000800000B +:101DC0000000000000000000000000000000000013 :101DD0000000000000000000000000000000000003 :101DE00000000000000000000000000000000000F3 :101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000400000000CE -:101E1000000000000000000000088000000000003A +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 :101E200000000000000000000000000000000000B2 -:101E30000008004100000000000000400000000019 +:101E300000000000000000000000000000000000A2 :101E40000000000000000000000000000000000092 -:101E500000080041000000000000004000000000F9 +:101E50000000000000000000000000000000000082 :101E60000000000000000000000000000000000072 -:101E700000000008000000000003000000400041D6 +:101E70000000000000000000000000000000000062 :101E80000000000000000000000000000000000052 -:101E900000000021000000080010000000400000C9 +:101E90000000000000000000000000000000000042 :101EA0000000000000000000000000000000000032 :101EB0000000000000000000000000000000000022 :101EC0000000000000000000000000000000000012 @@ -217639,14 +217639,14 @@ :101F000000000000000000000000000000000000D1 :101F100000000000000000000000000000000000C1 :101F200000000000000000000000000000000000B1 -:101F30000000000000210000000800080008000563 -:101F4000000500000000000800080000002100005B -:101F50000000000000110005000800080000000853 -:101F60000000000500000000000000080000000064 -:101F70000000000000000011000500080021001012 -:101F80000008000500000000000000210000000023 -:101F900000000000000400110005002100000008FE -:101FA0000008000000000000000000000000000029 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 :101FB0000000000000000000000000000000000021 :101FC0000000000000000000000000000000000011 :101FD0000000000000000000000000000000000001 @@ -217654,80 +217654,80 @@ :101FF00000000000000000000000000000000000E1 :1020000000000000000000000000000000000000D0 :1020100000000000000000000000000000000000C0 -:102020000000000000010001000100C000010401E7 -:1020300000C101850001000100100008000100013D -:1020400000C0000000010001000100C0000100010B -:1020500000C001090001040100100082000100011C -:1020600000C00000000000010001000100C00001EC -:10207000000100C00109000100010010000400017E -:10208000000100C0000000010001000100C00001CB -:10209000000100C001090001000100100010000152 -:1020A000000100C1000000410041004100820041E8 -:1020B00000410083404100081141000000800041C0 -:1020C00000410082000000410041004100820041C7 -:1020D0000041008940C1000811410000008000411A -:1020E00000410082000000000041004100410082E8 -:1020F00000410041008940C100081141000000007A -:102100000041004100820000004100410041008286 -:1021100000410041008940C10008114100000080D9 -:1021200000410041008800004100030000000080E1 -:1021300041009100000008008800820000C090006B -:10214000C100C100008000004100030000000080C9 -:1021500041009100000008008800820000408200D9 -:10216000C100C10000800000000341000300000026 -:1021700000804100840000000800880082000040C8 -:102180009100C100C1000080000041000300000078 -:1021900000804100C000000008008800020000919B -:1021A0008400C100C10000800000010001000000A7 -:1021B00000C00100C00000000100410008C000098B -:1021C000C0000900C10000840202010001000000FB -:1021D00000C00100C00000000100410008C00089EB -:1021E000C0000900C10000840202000001000100DB -:1021F000000000C00100C00000000100410008C054 -:102200000089C0000900C100008402020100010031 -:10221000000000C00100C10000000100410084C0B6 -:102220000008C0000900C10000C0880000C0000113 -:10223000C0C100000000000100C010100009000132 -:1022400000C10000000000010000000000C000010B -:10225000C0C100000000000100C010100009000112 -:1022600000C100000000000100000000000000C0EC -:102270000001C0C100000000000100C010100009F2 -:10228000000100C10000000000010000000000C0CB -:102290000001C0C100000000000100C0841000095E -:1022A000000100C1000000000001000100000080EA -:1022B000004180C100000000004100C1008200C157 -:1022C000004100C100000000004100020000008049 -:1022D000004180C100000000004100C1008200C137 -:1022E000004100C1000000000041000200000000A9 -:1022F0000080004180C100000000004100C1008258 -:1023000000C1004100C100000000004100020000C7 -:102310000080004180C100000000004100C1008237 -:1023200000C1004100C100000000004100080000A1 -:10233000C100800080C10000410200009000410007 -:10234000C141000080040000410000008000410005 -:10235000C100800080C10000410200001000410067 -:10236000C1410000801000004100000080004100D9 -:102370000000C100800080C1000041020000100088 -:102380004100C141000080100000410000008000B9 -:102390004100C100800080C1000041040000100025 -:1023A0004100C14100008010000041000000800099 -:1023B0004100C1004000C0C100000100C000080091 -:1023C0000100C1110200C000000001000000C000B7 -:1023D0000100C1004000C0C100000100C0000200B7 -:1023E0000100C1110200C000000001000000C00097 -:1023F00001000000C1004000C0C100000100C00099 -:1024000002000100C1110200C00000000100000034 -:10241000C0000100C1004000C0C100000100C000B8 -:1024200004000100C1110200C00000000100000012 -:10243000C000010000000000000000420000000099 -:102440000000000081120048070048000000000062 -:10245000000000000000000000000042000000003A -:102460000000000081120048070048000000000042 -:10247000000000000000000000000000004200001A -:102480000000000000008112004807004800000022 -:1024900000000000000000000000000000420000FA -:1024A0000000000000008112004807004800000002 -:1024B000000000000082000000000000000000009A +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000000AC +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C +:1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C :1024D00000000000000000000000000000000000FC :1024E00000000000000000000000000000000000EC @@ -217743,39 +217743,39 @@ :10258000000000000000000000000000000000004B :10259000000000000000000000000000000000003B :1025A000000000000000000000000000000000002B -:1025B00000000000000000000000757B000000002B +:1025B000000000000000000000000000000000001B :1025C000000000000000000000000000000000000B -:1025D0000000000000000000DEAE757B000000007F +:1025D00000000000000000000000000000000000FB :1025E00000000000000000000000000000000000EB -:1025F0000000000000000000DEAE0000757B00005F +:1025F00000000000000000000000000000000000DB :1026000000000000000000000000000000000000CA -:1026100000000000000000000000DEAE757B00003E +:1026100000000000000000000000000000000000BA :1026200000000000000000000000000000000000AA -:1026300000000000000000000000DEAE60C60300E5 -:102640000000000000000031E00000000000000079 -:102650000C0000000000000000C0630660C603001C -:102660000000000000000031E00000000000000059 -:102670000C0000000000000000C06306000060C6FF -:1026800003000000000000000031E0000000000036 -:1026900000000C0000000000000000C0630660C6DF -:1026A00003000000000000000031E0000000000016 -:1026B00000000C0000000000000000C063060000E5 +:10263000000000000000000000000000000000009A +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B000000000000000000000000000000000001A :1026C000000000000000000000000000000000000A :1026D00000000000000000000000000000000000FA :1026E00000000000000000000000000000000000EA :1026F00000000000000000000000000000000000DA -:1027000000000000000000000000000000050000C4 +:1027000000000000000000000000000000000000C9 :1027100000000000000000000000000000000000B9 :1027200000000000000000000000000000000000A9 -:102730000000000000001000000000000000000089 +:102730000000000000000000000000000000000099 :102740000000000000000000000000000000000089 :102750000000000000000000000000000000000079 :102760000000000000000000000000000000000069 :102770000000000000000000000000000000000059 :102780000000000000000000000000000000000049 -:1027900000000000000000000000400000004000B9 +:1027900000000000400040000000400040004000F9 :1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 +:1027B00000000000000000000000000040000000D9 :1027C0000000000000000000000000000000000009 :1027D00000000000000000000000000000000000F9 :1027E00000000000000000000000000000000000E9 @@ -217786,29 +217786,29 @@ :102830000000000000000000000000000000000098 :102840000000000000000000000000000000000088 :102850000000000000000000000000000000000078 -:102860000000000000000000000000000008000060 -:102870000000000800000008000800000000000040 -:102880000000000000000000000000000000000840 -:10289000000000000008000000080008008400108C -:1028A000008400000000000000000000000000089C -:1028B0000000000000080000000800840000000084 -:1028C0000000008800000000000000000000000080 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000000048 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C0000000000000000000000000000000000008 :1028D00000000000000000000000000000000000F8 :1028E00000000000000000000000000000000000E8 -:1028F0000041000000000000000000000000000097 -:1029000000000000000000000000000000210000A6 -:102910000000000000210000000000000021000075 -:10292000000000000008000000000000002100413D -:10293000000000080000000000000000004100004E +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 :102940000000000000000000000000000000000087 -:10295000000000000000000000000000000800105F -:10296000001000A000840000000000000000000033 -:102970000000000000000000000000000008000847 -:102980000008000800A0000000000000000000A0F7 -:10299000000000000000000000000000000000082F -:1029A00000A0001000A000080000000000000000CF -:1029B000000000000000000000000000000000A077 -:1029C0000000000800A000C000000000000000009F +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 :1029D00000000000000000000000000000000000F7 :1029E00000000000000000000000000000000000E7 :1029F00000000000000000000000000000000000D7 @@ -217833,17 +217833,17 @@ :102B200000000000000000000000000000000000A5 :102B30000000000000000000000000000000000095 :102B40000000000000000000000000000000000085 -:102B50000000000000000000000800000000000865 -:102B6000000000080000000000000000000000005D -:102B70000000000000000000000800000000000845 -:102B80000000000800A0000000000000000000009D -:102B9000000000000000000000000008000000002D -:102BA00000080000000800A0000000000000000075 -:102BB000000000000000000000000008000000000D -:102BC00000080000000800000000000000000000F5 -:102BD00000080000000000000000000000000000ED +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 :102BE00000000000000000000000000000000000E5 -:102BF00000000000000000100000000000000000C5 +:102BF00000000000000000000000000000000000D5 :102C000000000000000000000000000000000000C4 :102C100000000000000000000000000000000000B4 :102C200000000000000000000000000000000000A4 @@ -218014,11 +218014,11 @@ :10367000000000000000000000000000000000004A :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A -:1036A0000000000000000000000000080000000012 +:1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000100000EA +:1036C00000000000000000000000000000000000FA :1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000100000CA +:1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 :1037100000000000000000000000000000000000A9 @@ -218026,14 +218026,14 @@ :103730000000000000000000000000000000000089 :103740000000000000000000000000000000000079 :103750000000000000000000000000000000000069 -:103760000000000000000000000000000000100049 +:103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 :103780000000000000000000000000000000000039 :103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 :1037C00000000000000000000000000000000000F9 -:1037D00004000000000000000000000000000000E5 +:1037D00000000000000000000000000000000000E9 :1037E00000000000000000000000000000000000D9 :1037F00000000000000000000000000000000000C9 :1038000000000000000000000000000000000000B8 @@ -218041,7 +218041,7 @@ :103820000000000000000000000000000000000098 :103830000000000000000000000000000000000088 :103840000000000000000000000000000000000078 -:103850000000001000000000000000000000000058 +:103850000000000000000000000000000000000068 :103860000000000000000000000000000000000058 :103870000000000000000000000000000000000048 :103880000000000000000000000000000000000038 @@ -218262,15 +218262,15 @@ :1045F00000000000000000000000000000000000BB :1046000000000000000000000000000000000000AA :10461000000000000000000000000000000000009A -:10462000000000004000000000000000000000004A +:10462000100000000000000000000000000000007A :10463000000000000000000000000000000000007A :10464000000000000000000000000000000000006A :10465000000000000000000000000000000000005A :10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:1046800000000000400000004000000000000000AA +:1046700000000000000000000000000000004000FA +:10468000400000004000400040000000000000002A :10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A +:1046A00000000000000040000000000000000000CA :1046B00000000000000000000000000000000000FA :1046C00000000000000000000000000000000000EA :1046D00000000000000000000000000000000000DA @@ -218279,7 +218279,7 @@ :1047000000000000000000000000000000000000A9 :104710000000000000000000000000000000000099 :104720000000000000000000000000000000000089 -:104730000000001000000000000008000010000051 +:104730000000000000000000000000000000000079 :104740000000000000000000000000000000000069 :104750000000000000000000000000000000000059 :104760000000000000000000000000000000000049 @@ -218531,15 +218531,15 @@ :1056C00000000000000000000000000000000000DA :1056D00000000000000000000000000000000000CA :1056E00000000000000000000000000000000000BA -:1056F000000000000000000000000010000000009A +:1056F00000000000000000000000000000000000AA :105700000000000000000000000000000000000099 :105710000000000000000000000000000000000089 :105720000000000000000000000000000000000079 -:105730000000000000000000000002000000000067 +:105730000000000000000000000000000000000069 :105740000000000000000000000000000000000059 :105750000000000000000000000000000000000049 :105760000000000000000000000000000000000039 -:105770000000000000000000000002000000000027 +:105770000000000000000000000000000000000029 :105780000000000000000000000000000000000019 :105790000000000000000000000000000000000009 :1057A00000000000000000000000000000000000F9 @@ -218754,27 +218754,27 @@ :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC :1064D00000000000000000000000000000000000BC -:1064E000000000000000000000000000400000006C +:1064E00000000000000000000000000000000000AC :1064F000000000000000000000000000000000009C -:10650000000000000000000000000000400020002B +:10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B -:1065600000000000000000000000000040000000EB +:10656000000000000000400040000000400040002B :1065700040000000000000000000000000000000DB :10658000000000000000000000000000000000000B :1065900040000000000000000000000000000000BB -:1065A00000000000000000000000000200000000E9 +:1065A00000000000000000000000000000000000EB :1065B00000000000000000000000000000000000DB :1065C00000000000000000000000000000000000CB :1065D00000000000000000000000000000000000BB :1065E00000000000000000000000000000000000AB :1065F000000000000000000000000000000000009B :10660000000000000000000000000000000000008A -:10661000000000000000000000000000001000006A -:10662000000000000000001000000000000000005A +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A :10663000000000000000000000000000000000005A :10664000000000000000000000000000000000004A :10665000000000000000000000000000000000003A @@ -218807,7 +218807,7 @@ :106800000000000000000000000000000000000088 :106810000000000000000000000000000000000078 :106820000000000000000000000000000000000068 -:106830000000000000000000080008000000000048 +:106830000000000000000000000000000000000058 :106840000000000000000000000000000000000048 :106850000000000000000000000000000000000038 :106860000000000000000000000000000000000028 @@ -219008,9 +219008,9 @@ :1074900000000000000000000000000000000000EC :1074A00000000000000000000000000000000000DC :1074B00000000000000000000000000000000000CC -:1074C00002000000000000000000000000000000BA +:1074C00000000000000000000000000000000000BC :1074D00000000000000000000000000000000000AC -:1074E000200000000000000000000000000000007C +:1074E000000000000000000000000000000000009C :1074F000000000000000000000000000000000008C :10750000000000000000000000000000000000007B :10751000000000000000000000000000000000006B @@ -219018,7 +219018,7 @@ :10753000000000000000000000000000000000004B :10754000000000000000000000000000000000003B :10755000000000000000000000000000000000002B -:1075600000020000400000000000000000000000D9 +:10756000000000000000000000000000000000001B :10757000000000000000000000000000000000000B :1075800000000000000000000000000000000000FB :1075900000000000000000000000000000000000EB @@ -219026,13 +219026,13 @@ :1075B00000000000000000000000000000000000CB :1075C00000000000000000000000000000000000BB :1075D00000000000000000000000000000000000AB -:1075E0000000000008000000000000000000000093 +:1075E000000000000000000000000000000000009B :1075F000000000000000000000000000000000008B :10760000000000000000000000000000000000007A :10761000000000000000000000000000000000006A :10762000000000000000000000000000000000005A :10763000000000000000000000000000000000004A -:1076400000000000000004004000000000000000F6 +:10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A :10767000000000000000000000000000000000000A @@ -219248,29 +219248,29 @@ :1083900000000000000000000000000000000000DD :1083A00000000000000000000000000000000000CD :1083B00000000000000000000000000000000000BD -:1083C000000000000000000000000000000040006D -:1083D000400000000000000000000000000000005D +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D :1083E000000000000000000000000000000000008D -:1083F000200020000000000000000000000000003D +:1083F000000000000000000000000000000000007D :10840000000000000000000000000000000000006C -:10841000200020000000000000000000100000000C +:10841000000000000000000000000000000000005C :10842000000000000000000000000000000000004C :10843000000000000000000000000000000000003C :10844000000000000000000000000000000000002C -:10845000000000000000400040004000000000005C +:1084500040004000000040004000400000000000DC :10846000000000000000000000000000000000000C -:10847000000000000000000040004000000000007C +:1084700000000000000000000000400000000000BC :1084800000000000000000000000000000000000EC -:1084900000000000000000000000000000000000DC +:1084900000000000000200000000000000000000DA :1084A00000000000000000000000000000000000CC :1084B00000000000000000000000000000000000BC :1084C00000000000000000000000000000000000AC :1084D000000000000000000000000000000000009C :1084E000000000000000000000000000000000008C :1084F000000000000000000000000000000000007C -:108500000000000000000800000000000000000063 -:108510000800000000000000000000000000000053 -:108520000000000000000000000000000800020041 +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B :10853000000000000000000000000000000000003B :10854000000000000000000000000000000000002B :10855000000000000000000000000000000000001B @@ -219500,19 +219500,19 @@ :10935000000000000000000000000000000000000D :1093600000000000000000000000000000000000FD :1093700000000000000000000000000000000000ED -:1093800000000000000000000000100000000000CD +:1093800000000000000000000000000000000000DD :1093900000000000000000000000000000000000CD -:1093A000000000000000000040000000200000005D +:1093A00000000000000000000000000000000000BD :1093B00000000000000000000000000000000000AD -:1093C0000000000000000000000004002000000079 -:1093D000000000000000000000008800880000007D +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D :1093E000000000000000000000000000000000007D :1093F000000000000000000000000000000000006D :10940000000000000000000000000000000000005C :10941000000000000000000000000000000000004C -:10942000000000000000000000000000000010002C +:10942000000000000000000000000000000000003C :10943000000000000000000000000000000000002C -:10944000000000000000000000000000000010000C +:10944000000000000000000000000000000000001C :10945000000000000000000000000000000000000C :1094600000000000000000000000000000000000FC :1094700000000000000000000000000000000000EC @@ -219553,15 +219553,15 @@ :1096A00000000000000000000000000000000000BA :1096B00000000000000000000000000000000000AA :1096C000000000000000000000000000000000009A -:1096D0000000000000001000040000000000000076 +:1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A -:1096F0000000000000000800000000000000000062 +:1096F000000000000000000000000000000000006A :109700000000000000000000000000000000000059 :109710000000000000000000000000000000000049 :109720000000000000000000000000000000000039 :109730000000000000000000000000000000000029 :109740000000000000000000000000000000000019 -:109750000000000000000000080000000000000001 +:109750000000000000000000000000000000000009 :1097600000000000000000000000000000000000F9 :1097700000000000000000000000000000000000E9 :1097800000000000000000000000000000000000D9 @@ -219743,22 +219743,22 @@ :10A2800000000000000000000000000000000000CE :10A2900000000000000000000000000000000000BE :10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000010008E +:10A2B000000000000000000000000000000040005E :10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E +:10A2D000000000000000000000000000000020005E :10A2E000000000000000000000000000000000006E :10A2F000000000000000000000000000000000005E -:10A3000000000000000000000000000000008400C9 +:10A30000200000000000000000000000000000002D :10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D +:10A3200020000000000040000000000000000000CD :10A3300000000000000000000000100040000000CD -:10A34000400010004000000000000000000000007D +:10A3400010001000400000000000000000000000AD :10A3500000000000000000000000000000000000FD -:10A3600020001000000000000000000000000000BD +:10A3600000001000000000000000000000000000DD :10A3700000000000000000000000000000000000DD :10A3800000000000000000000000000000000000CD -:10A39000000000000000000000000000000000407D -:10A3A00000000000000000000000000000000000AD +:10A3900000000000000000000000000000000000BD +:10A3A000000010000000000000000000000000009D :10A3B000000000000000000000000000000000009D :10A3C000000000000000000000000000000000008D :10A3D000000000000000000000000000000000007D @@ -219948,11 +219948,11 @@ :10AF500000000000000000000000000000000000F1 :10AF600000000000000000000000000000000000E1 :10AF700000000000000000000000000000000000D1 -:10AF80000000000000004000000000000000000081 +:10AF800000000000000000000000000000000000C1 :10AF900000000000000000000000000000000000B1 -:10AFA0000000000000000000400000000000000061 +:10AFA00000000000000000000000000000000000A1 :10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000040000000000000000041 +:10AFC0000000000000000000000000000000000081 :10AFD0000000000000000000000000000000000071 :10AFE0000000000000000000000000000000000061 :10AFF0000000000000000000000000000000000051 @@ -219960,16 +219960,16 @@ :10B010000000000000000000000000000000000030 :10B020000000000000000000000000000000000020 :10B030000000000000000000000000000000000010 -:10B0400000000000000000001000004000000000B0 +:10B040000000000000000000000000000000000000 :10B0500000000000000000000000000000000000F0 :10B0600000000000000000000000000000000000E0 :10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000800000000B8 +:10B0800000000000000000000000000000000000C0 :10B0900000000000000000000000000000000000B0 -:10B0A0000000000000000000000000000008000098 +:10B0A00000000000000000000000000000000000A0 :10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000001008000860 -:10B0D0000008000000000000000000000000000068 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 :10B0E0000000000000000000000000000000000060 :10B0F0000000000000000000000000000000000050 :10B10000000000000000000000000000000000003F @@ -219987,13 +219987,13 @@ :10B1C000000000000000000000000000000000007F :10B1D000000000000000000000000000000000006F :10B1E000000000000000000000000000000000005F -:10B1F0000008000000000000000000000000000047 +:10B1F000000000000000000000000000000000004F :10B20000000000000000000000000000000000003E -:10B210000008000000000000000000000000000026 +:10B21000000000000000000000000000000000002E :10B22000000000000000000000000000000000001E -:10B2300000000008000800080000000000000000F6 +:10B23000000000000000000000000000000000000E :10B2400000000000000000000000000000000000FE -:10B2500000000008000800080000000000000000D6 +:10B2500000000000000000000000000000000000EE :10B2600000000000000000000000000000000000DE :10B2700000000000000000000000000000000000CE :10B2800000000000000000000000000000000000BE @@ -220033,7 +220033,7 @@ :10B4A000000000000000000000000000000000009C :10B4B000000000000000000000000000000000008C :10B4C000000000000000000000000000000000007C -:10B4D0000000000000000008000000000000000064 +:10B4D000000000000000000000000000000000006C :10B4E000000000000000000000000000000000005C :10B4F000000000000000000000000000000000004C :10B50000000000000000000000000000000000003B @@ -220203,8 +220203,8 @@ :10BF400000000000000000000000000000000000F1 :10BF500000000000000000000000000000000000E1 :10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000001000B1 -:10BF800000000000000200000000000000000000AF +:10BF700000000000000000000000000000020000BF +:10BF800000000000000010000000000000000000A1 :10BF900000000000000000000000000000000000A1 :10BFA0000000000000000000000000000000000091 :10BFB0000000000000000000000000000000000081 @@ -220213,22 +220213,22 @@ :10BFE0000000000000000000000000000000000051 :10BFF0000000000000000000000000000000000041 :10C000000000000000000000000000000000000030 -:10C010000000000800000000000000000000000018 +:10C010000000000000000000000000000000000020 :10C020000000000000000000000000000000000010 :10C030000000000000000000000000000000000000 -:10C0400000000008000000000000000000080000E0 -:10C05000008400000008000000080000000000004C -:10C0600000000008000800000000000000000008B8 -:10C0700000400084000000080000000800000000EC -:10C08000000000040008000000000000000000089C -:10C0900000840000001000100000000800000000F4 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 :10C0A0000000000000000000000000000000000090 :10C0B0000000000000000000000000000000000080 -:10C0C0000002000800020000000000000000000064 -:10C0D0000008000800000000000000000000000050 -:10C0E000000000000002000000000000000000004E -:10C0F0000000000000050008000000000000000033 -:10C10000000000000002000000000000000000002D +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F :10C11000000000000000000000000000000000001F :10C12000000000000000000000000000000000000F :10C1300000000000000000000000000000000000FF @@ -220245,22 +220245,22 @@ :10C1E000000000000000000000000000000000004F :10C1F000000000000000000000000000000000003F :10C20000000000000000000000000000000000002E -:10C210000000000000000000000800000000000016 +:10C21000000000000000000000000000000000001E :10C22000000000000000000000000000000000000E -:10C2300000000000000000A0000800A0000800842A -:10C24000008400000000000000000000000000006A -:10C250000000000000000000000800820000000054 -:10C260000000000000000000000000A000A000008E -:10C270000000000000000000000800A00082000094 -:10C28000000000000000000000000000000000901E -:10C29000000000000000000000A0000000080040B6 -:10C2A000004000000000000000000000000000004E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E :10C2B000000000000000000000000000000000007E :10C2C000000000000000000000000000000000006E :10C2D000000000000000000000000000000000005E -:10C2E0000000000000000000000000000008000046 +:10C2E000000000000000000000000000000000004E :10C2F000000000000000000000000000000000003E -:10C3000000000000000000000000000000400000ED +:10C30000000000000000000000000000000000002D :10C31000000000000000000000000000000000001D :10C32000000000000000000000000000000000000D :10C3300000000000000000000000000000000000FD @@ -220272,21 +220272,21 @@ :10C39000000000000000000000000000000000009D :10C3A000000000000000000000000000000000008D :10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000002100212B -:10C3D000000000000000000000000000000000213C +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D :10C3E000000000000000000000000000000000004D :10C3F000000000000000000000000000000000003D -:10C4000000000000000000000040000000000000EC +:10C40000000000000000000000000000000000002C :10C41000000000000000000000000000000000001C :10C42000000000000000000000000000000000000C -:10C4300000000008000000000000000000080000EC -:10C4400000A0000000000000000800000000000044 -:10C450000000000800000000008400000008000048 -:10C4600000000000000000000008000000000000C4 -:10C4700000000000000800000000000000000008AC -:10C4800000000000000000000000000800000000A4 -:10C49000000000000008000000000000000000088C -:10C4A0000000000000000000000000080000000084 +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C :10C4B000000000000000000000000000000000007C :10C4C000000000000000000000000000000000006C :10C4D000000000000000000000000000000000005C @@ -220434,53 +220434,53 @@ :10CDB0000000000000000000000000000000000073 :10CDC0000000000000000000000000000000000063 :10CDD0000000000000000000000000000000000053 -:10CDE00000000000000000000000000000000180C2 +:10CDE0000000000000000000000000000000000043 :10CDF0000000000000000000000000000000000033 -:10CE000000000000000000000000000000000180A1 -:10CE1000000300000000000000000000000000000F +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 :10CE20000000000000000000000000000000000002 -:10CE30000180000000000000000000000000000071 +:10CE300000000000000000000000000000000000F2 :10CE400000000000000000000000000000000000E2 -:10CE50000180000000000000000000000000000051 +:10CE500000000000000000000000000000000000D2 :10CE600000000000000000000000000000000000C2 -:10CE7000200800000000000000000000000000008A +:10CE700000000000000000000000000000000000B2 :10CE800000000000000000000000000000000000A2 -:10CE9000100400000000000000000000000000007E +:10CE90000000000000000000000000000000000092 :10CEA0000000000000000000000000000000000082 -:10CEB000000010040000000000000000000000005E +:10CEB0000000000000000000000000000000000072 :10CEC0000000000000000000000000000000000062 -:10CED000000010040000000000000000000000003E +:10CED0000000000000000000000000000000000052 :10CEE0000000000000000000000000000000000042 :10CEF0000000000000000000000000000000000032 :10CF00000000000000000000000000000000000021 :10CF10000000000000000000000000000000000011 -:10CF200000000000000300000000000000000000FE -:10CF300000000000000400000000000000000000ED +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 :10CF400000000000000000000000000000000000E1 -:10CF500000000000000400000000000000000000CD +:10CF500000000000000900000000000000000000C8 :10CF600000000000000000000000000000000000C1 :10CF700000000000000000000000000000000000B1 -:10CF80000000000000000000000800000000000891 -:10CF90000008000800000000000000000000000081 -:10CFA000000000000088008400820008008400085F -:10CFB0000008000800840000008400000000000059 -:10CFC0000000000000000000000000080084008451 -:10CFD0000008000800000000000000000000000041 -:10CFE0000000000000000000000000000000002120 -:10CFF0000021002100080021000000210021002163 -:10D00000002100210021000800000021000800216B -:10D01000002100210021002100000008002100055E -:10D020000021002100210005002100000021000056 -:10D0300000210021002100210021002100210021E8 -:10D04000002100210021002100090021002100050C -:10D050000010001000050021000800000000000082 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000008000000000000C8 :10D0600000000000000000000000000000000000C0 :10D0700000000000000000000000000000000000B0 -:10D080000000000000000008000000A000000000F8 +:10D0800000000000000000000000000000000000A0 :10D090000000000000000000000000000000000090 -:10D0A00000000000000000000000008800000000F8 +:10D0A0000000000000000000000000000000000080 :10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000A000000000C0 +:10D0C0000000000000000000000000000000000060 :10D0D0000000000000000000000000000000000050 :10D0E0000000000000000000000000000000000040 :10D0F0000000000000000000000000000000000030 @@ -220488,25 +220488,25 @@ :10D11000000000000000000000000000000000000F :10D1200000000000000000000000000000000000FF :10D1300000000000000000000000000000000000EF -:10D1400000000008000000000000000000000000D7 -:10D1500000050000000000000000000004000000C6 +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF :10D1600000000000000000000000000000000000BF :10D1700000000000000000000000000000000000AF -:10D180000000000000000000000000000000000897 +:10D18000000000000000000000000000000000009F :10D19000000000000000000000000000000000008F :10D1A000000000000000000000000000000000007F -:10D1B0000004000400000000000000000000000067 +:10D1B000000000000000000000000000000000006F :10D1C000000000000000000000000000000000005F -:10D1D0000000000000000000000000080000000047 +:10D1D000000000000000000000000000000000004F :10D1E000000000000000000000000000000000003F -:10D1F00000000000000000000000000000000040EF +:10D1F000000000000000000000000000000000002F :10D20000000000000000000000000000000000001E -:10D2100000000000000800080000000300080040B3 -:10D2200000000041000000000000000000000000BD -:10D2300000000000000000000008000000050000E1 -:10D24000004000000000000000000000200000007E -:10D2500000000000000000090021000000000000A4 -:10D26000004000000000000000000000000000007E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE :10D2700000000000000000000000000000000000AE :10D28000000000000000000000000000000000009E :10D29000000000000000000000000000000000008E @@ -220515,95 +220515,95 @@ :10D2C000000000000000000000000000000000005E :10D2D000000000000000000000000000000000004E :10D2E000000000000000000000000000000000003E -:10D2F00000000000000000080005004100080008D0 -:10D30000002100000005000000000000880300006C -:10D3100000000000000000080021000300080008D1 -:10D3200000000041000000050000000000000003B4 -:10D330000000004100000000000800080000000894 -:10D34000000800000010000500410000000000037C -:10D35000000000000000000000080021000000089C -:10D3600000100005000000000000000000000000A8 +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD :10D3700000000000000000000000000000000000AD :10D38000000000000000000000000000000000009D :10D39000000000000000000000000000000000008D :10D3A000000000000000000000000000000000007D :10D3B000000000000000000000000000000000006D :10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000010001000100C07A -:10D3F0000001000100C001090001040100020082D7 -:10D400000101200100C0000000010001000100C076 -:10D410000001000100C001050000000100400008FB -:10D420000101200100C00000000000010001000116 -:10D4300000C00001000100C0010500000001000261 -:10D4400000080101200100C00000000100010001EE -:10D4500000C00001000100C0010300000401000839 -:10D4600000820101200100C0000000410041004194 -:10D47000008200410041008904C1004011410000C8 -:10D4800000804041804100C1000000410041004156 -:10D4900000820041004100820441110411410080DA -:10D4A00000804041804100C1000000000041004177 -:10D4B0000041008200410041008904410004114103 -:10D4C000000000804041804100C100000041004157 -:10D4D00000410082004100410089044100111141D6 -:10D4E000008000804041804100C1000041000300F5 -:10D4F0000000008041008900000002000400048058 -:10D5000000008400C100C1000080800041000300D1 -:10D510000000008041008900000009000500028031 -:10D5200000009100C100C1000080800000034100A4 -:10D530000300000000804100890000000200080094 -:10D54000028000009100C100C10000808000410005 -:10D550000300000000804100890000000200030079 -:10D560000200000084004100C10000808000010032 -:10D570000100000000C00100C000000000008800A1 -:10D5800088080088C0000900C10000408200010036 -:10D590000100000000C00100C00000000000880081 -:10D5A00088080088C0000900C10000408200000017 -:10D5B00001000100000000C00100C00000000000E8 -:10D5C000850084080088C0000900C1000040820076 -:10D5D00001000100000000C00100C00000000000C8 -:10D5E000840084880088C0000300C10000408200DD -:10D5F00000C00001C0C100000000000100C0100315 -:10D600000009000100C1000000000001000000004E -:10D6100000C00001C0C100000000000100C01003F4 -:10D620000009000100C1000000000001000000002E -:10D63000000000C00001C0C100000000000100C0E7 -:10D6400010030009000100C10000000000010000FB -:10D65000000000C00001C0C100000000000100C0C7 -:10D6600010890009000100C1000000000001000055 -:10D6700000000080004180C100000000004100C1A6 -:10D68000000300C1004100C1000000000041004152 -:10D6900000000080004180C100000000004100C186 -:10D6A000000300C1004100C1000000000041004132 -:10D6B000000000000080004180C100000000004127 -:10D6C00000C1000300C1004100C100000000004192 -:10D6D000004100000080004180C1000000000041C6 -:10D6E00000C1000300C1004100C100000000004172 -:10D6F00000410000C100800080C1000041020040E4 -:10D7000010004100C1410000804000004140000085 -:10D7100080004100C100800080C100004102004043 -:10D7200090004100C14100008040000041400000E5 -:10D73000800041000000C100800080C10000410263 -:10D74000004010004100C141000080400000414005 -:10D75000000080004100C100800080C10000410243 -:10D76000004010004100C1410000804000004140E5 -:10D77000000080004100C1004000C0C10000010065 -:10D78000020104000100C1110200C00100000101FA -:10D790000000C0000100C1004000C0C10000010045 -:10D7A000020108000100C1110200C00100000101D6 -:10D7B0000000C00001000000C1004000C0C1000026 -:10D7C0000100020104000100C1110200C0010000BB -:10D7D00001010000C0000100C1004000C0C1000004 -:10D7E0000100020104000100C1050200C0010000A7 -:10D7F00001010000C0000100000000000000004224 -:10D8000000000000000000008112004807004800EE -:10D8100000000000000000000000000000000042C6 -:10D8200000000000000000008112004807004800CE +:10D3D00000000000000000A00000000000000000AD +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 :10D8300000000000000000000000000000000000E8 -:10D8400000420000000000000000811200480700B4 -:10D850004800000000000000000000000000000080 -:10D860000042000000000000000081120048070094 -:10D870004800000000000000000000000000000060 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 :10D880000000000000000000000000000000000098 :10D890000000000000000000000000000000000088 :10D8A0000000000000000000000000000000000078 @@ -220619,31 +220619,31 @@ :10D9400000000000000000000000000000000000D7 :10D9500000000000000000000000000000000000C7 :10D9600000000000000000000000000000000000B7 -:10D970000000000000000000000000000000757BB7 +:10D9700000000000000000000000000000000000A7 :10D980000000000000000000000000000000000097 -:10D99000000000000000000000000000DEAE757B0B +:10D990000000000000000000000000000000000087 :10D9A0000000000000000000000000000000000077 -:10D9B000000000000000000000000000DEAE0000DB -:10D9C000757B000000000000000000000000000067 -:10D9D0000000000000000000000000000000DEAEBB -:10D9E000757B000000000000000000000000000047 -:10D9F0000000000000000000000000000000DEAE9B -:10DA000060C603000000000000000031E0000000DC -:10DA1000000000000C0000000000000000C06306D1 -:10DA200060C603000000000000000031E0000000BC -:10DA3000000000000C0000000000000000C06306B1 -:10DA4000000060C603000000000000000031E0009C -:10DA50000000000000000C0000000000000000C0FA -:10DA6000630660C603000000000000000031E00013 -:10DA70000000000000000C0000000000000000C0DA -:10DA8000630600000000000000000000000000002D +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 :10DA90000000000000000000000000000000000086 :10DAA0000000000000000000000000000000000076 :10DAB0000000000000000000000000000000000066 :10DAC0000000000000000000000000000000000056 :10DAD0000000000000000000000000000000000046 :10DAE0000000000000000000000000000000000036 -:10DAF000000000000000000000000008000000001E +:10DAF0000000000000000000000000000000000026 :10DB00000000000000000000000000000000000015 :10DB10000000000000400000000000400040000045 :10DB200000000000000000000000000000000000F5 @@ -220651,7 +220651,7 @@ :10DB400000000000000000000000000000000000D5 :10DB500000000000000000000000000000000000C5 :10DB600000000000000000000000000000000000B5 -:10DB70000000000000000000000000000000400065 +:10DB70000000000000000000000000000040000065 :10DB80000000000000000000000000000000000095 :10DB90000000000000000000000000000000000085 :10DBA0000000000000000000000000000000000075 @@ -220660,80 +220660,80 @@ :10DBD0000000000000000000000000000000000045 :10DBE0000000000000000000000000000000000035 :10DBF0000000000000000000000000000000000025 -:10DC0000000000000000000500000000000000000F +:10DC0000000000000008000000000000000000000C :10DC10000000000000000000000000000000000004 :10DC200000000000000000000000000000000000F4 -:10DC300000080000000000000000000000080000D4 -:10DC40000000000000000000000000000000008450 -:10DC500000000088008800000000000000000008AC -:10DC60000000008400000000000000000000000030 -:10DC70000000000000000000000000000000001094 -:10DC80000084000800000000000000000000000008 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 :10DC90000000000000000000000000000000000084 -:10DCA000000000000000000000000000000000086C -:10DCB000000000410008000000000000000000001B +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 :10DCC0000000000000000000000000000000000054 -:10DCD00000210000000000410000000000000000E2 -:10DCE000002100000008000000000000000000000B -:10DCF00000210000001000000000000000000000F3 -:10DD000000080000002100000010000000000000DA +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF000000000000000000000000000000800001C +:10DD0000000000000000000000000008000000000B :10DD10000000000000000000000000000000000003 -:10DD20000008000200A00000000000000000000049 +:10DD200000000000000000000000000000000000F3 :10DD300000000000000000000000000000000000E3 -:10DD400000080002000800000000000000000000C1 +:10DD400000000000000000000000000000000000D3 :10DD500000000000000000000000000000000000C3 -:10DD600000000008000800A0000000000000000003 -:10DD7000000000000000000000000000000000841F -:10DD80000000001000A000000000000000000000E3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 :10DD90000000000000000000000000000000000083 :10DDA0000000000000000000000000000000000073 :10DDB0000000000000000000000000000000000063 :10DDC0000000000000000000000000000000000053 :10DDD0000000000000000000000000000000000043 :10DDE0000000000000000000000000000000000033 -:10DDF00000000000000800080008000000210000EA -:10DE00000000000000000000000000000000000012 +:10DDF00000210005000000050011000000050021C1 +:10DE0000000000000000000000080000000000000A :10DE10000000000000000000000000000000000002 :10DE200000000000000000000000000000000000F2 :10DE300000000000000000000000000000000000E2 :10DE400000000000000000000000000000000000D2 :10DE500000000000000000000000000000000000C2 :10DE600000000000000000000000000000000000B2 -:10DE700000000000000000000000000000000000A2 -:10DE80000000000000000000000000000010000082 -:10DE90000010000000000000000000000000000072 +:10DE7000000000000000000000080000000000009A +:10DE80000000000000080000000000000008000082 +:10DE90000000000000000000000000000000000082 :10DEA0000000000000000000000000000000000072 :10DEB0000000000000000000000000000000000062 :10DEC0000000000000000000000000000000000052 :10DED0000000000000000000000000000000000042 :10DEE0000000000000000000000000000000000032 -:10DEF000000000000000000000000000000000081A -:10DF00000000000800000000000000000000000009 -:10DF100000000000000000000000000000080000F9 -:10DF2000000000000000008400A0000000000000CD -:10DF300000000000000000000000000000080000D9 -:10DF4000000000000000008400A0000000000000AD -:10DF5000000000000000000000000000000000A021 -:10DF60000000000000000000000000A00000000011 -:10DF7000000000000000000000000000000000A001 -:10DF8000000000000000000000C0000800080000C1 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 :10DF90000000000000000000000000000000000081 :10DFA0000000000000000000000000000000000071 -:10DFB0000021000000000000000000000000000040 +:10DFB0000000000000000000000000000000000061 :10DFC0000000000000000000000000000000000051 -:10DFD0000021000000000000000000000000000020 +:10DFD0000000000000000000000000000000000041 :10DFE0000000000000000000000000000000000031 :10DFF0000000000000000000000000000000000021 -:10E0000000000000000000000021000000000000EF -:10E0100000080000000000000000000000000000F8 +:10E0000000000008000000080000000000080000F8 +:10E010000000000000000000000000000000000000 :10E0200000000000000000000000000000000000F0 :10E0300000000000000000000000000000000000E0 :10E0400000000000000000000000000000000000D0 :10E0500000000000000000000000000000000000C0 :10E0600000000000000000000000000000000000B0 -:10E07000000000000000000000000082000000829C -:10E08000000000840000000000000000000000000C -:10E090002000000000080000000000000000000058 +:10E070000000000000000000000000080000000098 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 :10E0A0000000000000000000000000000000000070 :10E0B0000000000000000000000000000000000060 :10E0C0000000000000000000000000000000000050 @@ -220890,12 +220890,12 @@ :10EA300000000000000000000000000000000000D6 :10EA40000000000000000000C00000000000C00046 :10EA500000000000000000000000000000000000B6 -:10EA6000000000000000000020000000000020085E +:10EA60000000000000000000200000000000200066 :10EA70000000000000000000000000000000000096 :10EA80000000000000000000000020000000000066 -:10EA90002010000000000000000000000000000046 +:10EA90002000000000000000000000000000000056 :10EAA0000000000000000000000000000000000066 -:10EAB0000010000000000000000000000000000046 +:10EAB0000000000000000000000000000000000056 :10EAC0000000000000000000000000000000000046 :10EAD0000000000000000000000000000000000036 :10EAE0000000000000000000000000000000000026 @@ -220915,24 +220915,24 @@ :10EBC0000000000000000000000000000000000045 :10EBD0000000000000000000000000000000000035 :10EBE0000000000000000000000000000000000025 -:10EBF0000000000000000000000000000000000015 -:10EC000000000000001000000000000000000000F4 -:10EC100000000000000000100000000000000000E4 -:10EC200000000000000000000000000000080000DC -:10EC300000000000000000000000000000000008CC -:10EC400000000088008800000000000000000000B4 +:10EBF000000000000000000000000000000000080D +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000080000000000000000000000000000DC +:10EC300000000000000000000000000000000000D4 +:10EC4000000800820000000000000000000000003A :10EC500000000000000000000000000000000000B4 :10EC600000000000000000000000000000000000A4 :10EC70000000000000000000000000000000000094 :10EC80000000000000000000000000000000000084 :10EC90000000000000000000000000000000000074 :10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 -:10ECC000000000080000000000000000000000003C +:10ECB0000000000000000000000000000008000844 +:10ECC000000000000000000800000000000000003C :10ECD0000000000000000000000000000000000034 -:10ECE000000000000000000000080000000000001C +:10ECE0000000000000000000000000000000000024 :10ECF0000000000000000000000000000000000014 -:10ED000000000000000000000010000000000000F3 +:10ED00000000000000000000000000000000000003 :10ED100000000000000000000000000000000000F3 :10ED200000000000000000000000000000000000E3 :10ED300000000000000000000000000000000000D3 @@ -220942,25 +220942,25 @@ :10ED70000000000000000000000000000000000093 :10ED80000000000000000000010000000000000082 :10ED90000000000000000000000000000000000073 -:10EDA000000000000000000000000000000000085B -:10EDB0000000000000080000000800000800A0009B -:10EDC00000000000000000000000000082000000C1 +:10EDA0000000000000000000000000000000000063 +:10EDB00000210000000008000041000008000000E1 +:10EDC0000000000000008200000800008200000037 :10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 +:10EDE000000000000000000800000000000000001B :10EDF0000000000000000000000000000000000013 :10EE000000000000000000000000080000000000FA -:10EE100000000000000800000000000000000000EA -:10EE200000000000000000080000000000000000DA -:10EE3000000000002000009000A0008400000000FE -:10EE4000000800C0008800840000000800000008DE +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000082008400A000101C +:10EE4000000800A000820084000000000000000014 :10EE500000000000000000000000000000000000B2 :10EE600000000000000000000000000000000000A2 :10EE70000000000000000000000000000000000092 :10EE80000000000000000000000000000000000082 :10EE90000000000000000000000000000000000072 :10EEA0000000000000000000000000000000000062 -:10EEB0000000000000000000000000080000000347 -:10EEC000000000000008000000000000000000003A +:10EEB000000000000008000000000000000000004A +:10EEC0000000000000000000000800000021000019 :10EED0000000000000000000000000000000000032 :10EEE0000000000000000000000000000000000022 :10EEF0000000000000000000000000000000000012 @@ -220975,17 +220975,17 @@ :10EF80000080000000000000000000000000000001 :10EF90000080000000000000000000800000000071 :10EFA0000000000000000000000000000000000061 -:10EFB0000000000000000000000000000000080049 -:10EFC00000000000000000000021000000410000DF -:10EFD0000000000000210000000000000000000010 +:10EFB0000000000000000000000000000000000051 +:10EFC00000000000000000000041002100210000BE +:10EFD0000000000000080000000000000000000029 :10EFE0000000000000000000000000000000000021 :10EFF0000000000000000000000000000000000011 :10F0000000000010000000000000000000000000F0 :10F0100000000010000000000000000000100000D0 :10F0200000000000000000000000000000000000E0 -:10F0300000000008000800000000098200000082B3 -:10F040000000090002080084000020000000000009 -:10F0500000000000090000000000000000000000A7 +:10F0300000000008008200C00000009000A000084E +:10F0400000000008008400840000000000000000B0 +:10F0500000000000000000000000000000000000B0 :10F0600000000000000000000000000000000000A0 :10F070000000000000000000000000000000000090 :10F080000000000000000000000000000000000080 @@ -221131,16 +221131,16 @@ :10F9400000000000000000000000000000000000B7 :10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 -:10F9700000000000000000000000000020001180D6 -:10F9800000002080410041800000000088008800C5 +:10F9700000000000000000000000000010004180B6 +:10F980000000048041002180000000008800880001 :10F990000000880088000000000000002000200017 :10F9A00000002000200000000000000020002000D7 :10F9B00000002000200000000000000000022000E5 :10F9C00020000000200020000000000000002000B7 :10F9D00020000000200020000000000000002000A7 -:10F9E00020000080200001000000008000000000D6 -:10F9F0000000000000000100000000000080800006 -:10FA0000A010000080409000A0080000000000004E +:10F9E00020000080200021000000008000000000B6 +:10F9F00000000000200001000000000000808000E6 +:10FA00008804000080409000900200000000000088 :10FA100000000000000000000000000000000000E6 :10FA200000000000000000002000000000000000B6 :10FA300000000000000000000000000000000000C6 @@ -221159,20 +221159,20 @@ :10FB000000000000000000000000000000000000F5 :10FB100000000000000000000000000000000000E5 :10FB200000000000000000000000000000000000D5 -:10FB3000000000000000000000000000000000883D -:10FB400000000000000800000000000000000000AD -:10FB500000000000000000000000000000000000A5 -:10FB60000000000000080000000000000000000885 -:10FB70000000000000000000000000000000000085 -:10FB80000000000001000000000001000000000073 -:10FB90000000000000210000000000000000000341 -:10FBA000000000000008000000000000000000004D +:10FB300000000000000000000000000800000000BD +:10FB400000000000000000000000000000000000B5 +:10FB5000000000000000000000000000000800009D +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000088008479 +:10FB80000000001001000000000001000000000063 +:10FB90000000000000410000000000000000000024 +:10FBA0000000000000000000000000000000000055 :10FBB0000000000000000000000000000000000045 :10FBC000000500210000000000050000000000000A -:10FBD00000000000004100000000000000000000E4 -:10FBE0000000000000000000000000000000000015 -:10FBF000000800000010000300080021004100057B -:10FC000000030008000540000000000004000000A0 +:10FBD0000000000000210000000000000000000004 +:10FBE0000008000000080000000000000000000005 +:10FBF00000000000001100000021000500050021A8 +:10FC00000000002100004000000000002000000073 :10FC100000000000000000000000000000000000E4 :10FC200000000000000000000000000000000000D4 :10FC300000000000000000000000000000000000C4 @@ -221180,15 +221180,15 @@ :10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 :10FC70000000000000000000000000000000000084 -:10FC800000000000410000001000400000000800DB +:10FC80000800000000000000020010000000080052 :10FC9000A0000000000000000000000000000000C4 :10FCA0000000000000000000000000000000000054 :10FCB0000000000000000000000000000000000044 :10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 :10FCE0000000000000000000000000000000000014 -:10FCF00000000000000000000000A0000000000064 -:10FD000000000800000000000000800080000000EB +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000800080000000F3 :10FD10008000000000000000000000000000000063 :10FD200000000000000000000000000000000000D3 :10FD300000000000000000000000000000000000C3 @@ -221196,15 +221196,15 @@ :10FD500000000000000000000000000000000000A3 :10FD60000000000000000000000000000000000093 :10FD70000000000000000000000000000000000083 -:10FD80000000000000000000000000000000000073 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000300000000000800000008000040 +:10FD8000000800000000000000000000000000006B +:10FD90000000000000000000000000000041000022 +:10FDA000000000000008000000000000000000004B :10FDB0000000000000000000002100000000000022 :10FDC000000000030000000000050000000000002B :10FDD0000000000000000000000000000000000023 :10FDE0000000000000000000000000000000000013 -:10FDF00000000000000000210005000800030808C2 -:10FE0000000300030808000800080000C008000004 +:10FDF0000000000800000041000000000008082189 +:10FE0000000300210021000800000008C0000000DD :10FE100000000000000000000000000000000000E2 :10FE200000000000000000000000000000000000D2 :10FE300000000000000000000000000000000000C2 @@ -221213,95 +221213,95 @@ :10FE60000000000000000000000000000000000092 :10FE70000000000000000000000000000000000082 :10FE80000000000000000000000000000000000072 -:10FE9000020000000000000000000021000000003F -:10FEA0000000000000000000000000000000000052 +:10FE9000200000000000000000000003000000003F +:10FEA000000000030000000000000000000000004F :10FEB0000000000000000000000000000000000042 :10FEC0000000002100000000000000000000000011 -:10FED0000000000000054002880000000008A000AB -:10FEE000A00000000005A000A00000000021880084 -:10FEF0008800000000000000000008080009000061 -:10FF00000000002100410008000000000000000087 -:10FF10000000800000000000000000000000000061 +:10FED0000000000000054002880000000021A00092 +:10FEE000A00000000005A000A00088000008880015 +:10FEF00000000000000000000000000800030010E7 +:10FF000000030008000800000008000000000005D1 +:10FF10000008800000000000000000000000000059 :10FF200000000000000000000000000000000000D1 :10FF300000000000000000000000000000000000C1 :10FF400000000000000000000000000000000000B1 :10FF500000000000000000000000000000000000A1 -:10FF60000000000000000000000000000000000091 +:10FF60000000000000000000000000000000000889 :10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 +:10FF800000000000000000000000008200000000EF :10FF90000000000000000000000000000000000061 :10FFA0000000000000000000000000000000000051 :10FFB0000000000000000000000000000000000041 :10FFC00000400001000000000000000000002000D0 :10FFD000004000010000000040000083000100001C :10FFE0000001008500000000000100850000000005 -:10FFF0000001008500004001010000000005100024 +:10FFF000000100850000100002000000000902015D :020000040036C4 -:10000000C00000000011C000C10000010082C0005B +:10000000C00001000011C000C10000010082C0005A :10001000C100010000830000090000000000000092 -:1000200011000000000000000000000000000000BF +:1000200009000000000000000000000000000000C7 :10003000000000000000000000000000000011119E :1000400000110082004000000000000000001111BB :100050008021008900400000004180410082004072 :1000600000410003008500050041000300850005F4 -:10007000004100030085000589400309001100C10B -:1000800080418402040000838041C141000300805C +:10007000004100030085000584051109004100C10D +:1000800009408421050000838041C14100030080B4 :100090008041C141410000830000000000000000D9 :1000A0000000000000000000000000000000000050 :1000B0000000000000000000000000000000000040 :1000C000410000000080020000000000000000006D :1000D0004100000000808300000041000000008219 :1000E00083004100000000858580410000000085FC -:1000F00085804100000000858580000202410004E7 -:100100000800090011040004804180C1C141004180 -:100110000300828041C100418041000000000000D6 +:1000F000858041000000008585808040034100002C +:10010000030002001109000080C180C1C14100410B +:100110000300898041C100418041000000000000CF :1001200000000000000000000000000000000000CF :1001300000000000000000000000000000000000BF :10014000000001000000004002000000000000006C :1001500000000100000000408300000001000000DA :1001600000838300010000000085040401000000FA -:100170000084040401000000008404040408040155 -:1001800000010084008400000001820140C14001A0 +:1001700000840404010000000084040408038501D5 +:1001800000000184000400000000820940C1400119 :100190000001010040C000C1000182010000000018 :1001A000000000000000000000000000000000004F :1001B000000000000000000000000000000000003F :1001C00000000000000000000100C0C000000000AE :1001D00000000000000000000100C0C0000000009E :1001E00000000100C0C00000000001000404000085 -:1001F000000001000404000000008300040400016A -:1002000000000000820000000001840101000000E5 -:100210000000C100C00000000200C0000000000299 +:1001F000000001000404000000009100040400015C +:1002000000000001830000000000840000000000E6 +:100210000000C100C00000000000C001000000029A :1002200000000000000000000000000000000000CE :1002300000000000000000000000000000000000BE :10024000000000000000000000004100020000006B :10025000000000000000000000004100020000005B :10026000000000004100000000000000410080800C -:10027000000000004100808000000000C10080807C -:100280000020000411418200000800030002400029 -:1002900000410041C1418000002100418041000037 +:1002700000000000410080800000000041008080FC +:10028000004000040405C100000800410004000013 +:1002900000410041C141800000080041800300008E :1002A000000000000000000000000000000000004E :1002B000000000000000000000000000000000003E :1002C00000000000000000000000000002820000AA :1002D000000000000000000000000000098900008C :1002E00000020000000002020000000000000505FE -:1002F00000000000000005050000000000020505E8 -:1003000000008041000282050041C0410091C1828D -:10031000200480410080C1C100C141410041C1C1F0 +:1002F00000000000000005050000000000000505EA +:1003000000000004001140850041044000C103408A +:10031000044080410080C1C100C1411100C183C1BE :1003200003C1000000000000000000000000000009 :1003300000000000000000000000000000000000BD :100340000000000000000000000000000000008429 :100350000000000000000000000000000000008419 :10036000000000000000000001010000000000008B :10037000000000000000000000000000000000007D -:10038000000000001001000004C100A14101004074 -:1003900082080102400100C040C100C1A001000567 -:1003A00040C101C10000000000000000000000008A +:100380000000000008010000030800C1C1010021B5 +:1003900003110085400100C040C100C1840000215C +:1003A00083C101C100000000000000000000000047 :1003B000000000000000000000000000000000003D :1003C00000000000000000000000000048420000A3 :1003D00000000000000000000000000000420000DB :1003E00000000000000048420000000000004842F9 :1003F00000000000000048420000000000008421CE -:1004000000000000000088000000070048420000D3 +:1004000000000000000081000000070048420000DA :1004100000C80000484200000000220048420000DE :100420000000000048420000000000000000000042 :1004300000000000000000000000000000000000BC @@ -221317,7 +221317,7 @@ :1004D0000000000014A894AA000000000000000022 :1004E0000000000014A814AA00000000000014A8D6 :1004F00094AA0000000014A894AA0000000014A808 -:1005000094AA0000000014A894AA00000000418CE6 +:1005000094AA0000000014A894AA00000000C18C66 :1005100000000000004A22B00000000000C954881A :100520000000000000015CC00000000000000000AE :1005300000000000000000000000000000000000BB @@ -227537,295 +227537,295 @@ :1089800000000000000000000000000000000000E7 :1089900000000000000000000000000000000000D7 :1089A00000000000000000000000000000000000C7 -:1089B000000000000000002C00333002C000002E38 -:1089C000EC0BBBB2EEECBBBB0000000000000000F3 +:1089B00000000000000000000000000000000000B7 +:1089C00000000000000000000000000000000000A7 :1089D0000000000000000000000000000000000097 :1089E0000000000000000000000000000000000087 -:1089F000000000000000000000000000000014C0A3 -:108A00000003000000000000000000000000000063 +:1089F0000000000000000000000000000000000077 +:108A00000000000000000000000000000000000066 :108A10000000000000000000000000000000000056 :108A20000000000000000000000000000000000046 :108A30000000000000000000000000000000000036 -:108A400000000000000000400000017F4400011011 -:108A50000080008010008000000085C073FE1C00B4 -:108A60007F00000010002000038A00800605011D21 -:108A7000800FF730FF0F7473E07CF00700000000F8 +:108A40000000000000000000000000000000000026 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A700000000000000000000000000000000000F6 :108A800000000000000000000000000000000000E6 :108A900000000000000000000000000000000000D6 -:108AA0000000000000000000000000000000008046 -:108AB0001C0000100020000000000000000000006A -:108AC0000000040208100000400000004000008088 -:108AD00000100000000000000000038038200000AB -:108AE000010700001C0021001C0000700000240091 -:108AF00000000000A181C004050008020038000049 -:108B00000000000A0007000000781FFE010200308C -:108B1000034640100B0108800000024000000000E6 -:108B200000000000000000000000000080000000C5 -:108B30002A000000000300103E00000000C00000FA -:108B400080000000000000000000000000000001A4 -:108B50005D0052880D45000000000000000000008C -:108B60000000000000000000036803E0001FFA2876 -:108B7000240084000814C200000388841034000913 -:108B80002E1211024612088097C40C02024880047B -:108B900004240000044000009248008010C400003B -:108BA0005040004000200100002000048010080117 -:108BB0000000000010900000000400C00090003091 -:108BC00001018280000080180002C00C8001CB04EB -:108BD0000110000002B00000A8800A020000C210CC -:108BE00050588015000400804028000AA010084258 -:108BF000160010000350004008400000E000000094 -:108C0000000404000000020000000000000000005A -:108C1000000000000000000008102500003F01FED9 -:108C200018A3002133C00381000092000004808259 -:108C3000108A00406E3ED8422000848C22642500B9 -:108C400000308202805118110888808001E452406F -:108C50000800801040814000020081409490420052 -:108C60004004000444000000006C281007C12540A7 -:108C70000000010202000482000304000000100151 -:108C800000C05000011132000850000FB466880F78 -:108C9000B6068801E41043B12E800B5D51208C593B -:108CA000DC2048030921678001890151C5D64000B5 -:108CB00000600020000116600010C4C00880091286 -:108CC00021092020280005825000DF44C08000C414 -:108CD000C000804184228910000888C00070001004 -:108CE0002C300003D08104222A10888900100B80C8 -:108CF000000600020000400000312101208020C257 -:108D0000450012200181047400454C010008B9009F -:108D10000500000004150000000020110000000AFA -:108D2000B0018B902CAC040000404200031D2013C6 -:108D3000642014080260A110110003000002D00C8E -:108D4000400000000000000200808001000041009F -:108D5000100004000000000010002208221C000087 -:108D6000000080500000802E600170E00200400092 -:108D7000020C0040C0100029803063020052020043 -:108D8000043C18084500004D800400000004004326 -:108D90006000947318170000801100502008000034 -:108DA000B90140D4E0001030452C009428080C0C88 -:108DB00044001330000020140C000000F0300806BE -:108DC0000000000000400000040C0A000FE000005A -:108DD00008C00000000810100340090C1040801863 -:108DE00032000040803FC00002F1180C8E0B046876 -:108DF000460190BF840008000402000202A84B0153 -:108E00002C40400992214014160331806000130069 -:108E1000174004C0080001851007812C0A804140DA -:108E20005800094902C100008281200454051D80B8 -:108E30000020A008500E0020000000040000401098 -:108E4000000000000058401A00000A2002CC3848F8 -:108E5000440222080102000030CC076D0130111DD0 -:108E60005400000000400002000408000408420111 -:108E700000400000000002800000020000163620C2 -:108E800081BD4001B0029030BC897E0290D8C834C8 -:108E900002458004800980B01400114D6441C20075 -:108EA0008057131F0DE012BA847C800053001DE12F -:108EB0001500188C02080A001012000000000000C3 -:108EC00000000008008009000008000000200000E9 -:108ED00000001100028000000000000000000040BF -:108EE0000000000030030000000000000121F00E2F -:108EF00000A00010820000B0024090412811000044 -:108F0000019188282000604D04C3C02440000870EF -:108F1000400911050002000400008003AB8001013C -:108F2000008004000001C0C30003B0835480010C22 -:108F30000000000608000328D0928D10040820309D -:108F400091C0C5020102011341089026400040086B -:108F5000692213A8581208114A39030BC0054500AD -:108F6000000000002010308802280040A00000000F -:108F70000028E00000000000280018000000C17078 -:108F80009C94050AE7C41001E004743303154208F9 -:108F9000A00008000000000B40000C00004000048E -:108FA000001040000000002000050400001000A098 -:108FB0000000002100E00000241309050A008100E0 -:108FC000181304424200020000000000000041208B -:108FD000062853960F8802EF61402000630000804E -:108FE000000098A411A503054037C202A00318236E -:108FF00011084410004C8040022040000000000096 -:10900000000C40081D00000C00500202020000A9E4 -:109010005000000000000B41240000000122060067 -:109020000042FC09C020000001309C000000001339 -:1090300089C0000000100010048504100548780065 -:10904000021C003220046002000000400000010009 -:10905000000000000A0000020070070CFE033C3014 -:109060005280387E1830063E4301C84E400000044E -:1090700000000000000000400000000100000000AF -:1090800000040900010000400400001300200084D7 -:1090900000200000002000000EC000FF0E07E3B813 -:1090A0007C0000277B000070000080E633400C86C7 -:1090B000500440F800100000000020102040000183 -:1090C0000F272010DC10200B030002A0000000007E -:1090D000000000000040000001000000000000004F -:1090E000880000000A00001E10F040333F000061BD -:1090F000103CF03C3840C001F00000B8781E1FC1A1 -:109100000380206000FF00000F8000001C020010A0 -:109110000100080300000028042004842048904433 -:109120008924488244811224244822448224411202 -:10913000108908049102112048444489044882247B -:109140002048904921048909249091200849044825 -:1091500048912021101121224482244122441224CA -:109160001122491220912008421122424222244811 -:109170002244048904489244882448224482244199 -:10918000224490840912008420908490890842012E -:1091900021124484244822448224408844EFFD3D27 -:1091A000DF4FFEF347FC31FF37FFCFF311C37CFFE6 -:1091B0001F3FFF8FA620FF0CFCFE386FC3BFF03FA0 -:1091C000E0FFDE17FE43C1C3F35048031015CC0087 -:1091D0006000102A8002A287AA80025400000000CA -:1091E000000000000010A010040000E000001000CB +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC00000000000000000000000000000000000A5 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:10915000000000000000000000000000000000000F +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F +:1091D000000000000000000000000000000000008F +:1091E000000000000000000000000000000000007F :1091F000000000000000000000000000000000006F :10920000000000000000000000000000000000005E -:10921000000000000000000003FF00FFFF3FFFCF41 -:10922000FFF3FFFCFFFF3FFFCFFFF3FFFCFFFF3F1C -:10923000FFCFFFF3FFFCFFFF3FFFCFFFF00AFC0073 -:109240000000100000000000080000000000000006 +:10921000000000000000000000000000000000004E +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E +:10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E -:1092600000000000000000000000000000003FFFC0 -:10927000CFFFF3FFFCFFFF3FFFCFFFF3FFFCFFFF3C -:109280003FFFCFFFF00AFC000000100000000000CC -:1092900008000000000000000000000000000000C6 +:1092600000000000000000000000000000000000FE +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE +:1092900000000000000000000000000000000000CE :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE :1092C000000000000000000000000000000000009E -:1092D00000000000000000000000044D0155504453 -:1092E000C411112AA84AAAA2AAA8AAAA04444111F0 -:1092F0001044441111044441111044441111044418 -:1093000041111044441111044441111044441111FD -:1093100004444111104444111104444111104444C7 -:109320001111154441151044441111044441111008 -:1093300044441111044441111044441111044441A6 -:1093400011104444111104444111104444111104FA -:10935000444111104444111104444111104444117A -:109360001104444111104444111100004E0000004A -:1093700000002001F888008021F800020081001020 -:1093800040000020800002004100000000000000BA -:1093900000000104E820001D00000410180007F878 -:1093A00000B84000000000000000000000000000C5 +:1092D000000000000000000000000000000000008E +:1092E000000000000000000000000000000000007E +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:10931000000000000000000000000000000000004D +:10932000000000000000000000000000000000003D +:10933000000000000000000000000000000000002D +:10934000000000000000000000000000000000001D +:10935000000000000000000000000000000000000D +:1093600000000000000000000000000000000000FD +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD :1093B00000000000000000000000000000000000AD :1093C000000000000000000000000000000000009D -:1093D000000000000200002100000000000000006A -:1093E0000000000000802000000000020002A00237 -:1093F00040000000020000040000000001500000D6 -:109400000000000000000E00000000000038000016 -:109410000000000000300000801003840000000005 -:1094200007800000000000000000000000000000B5 -:109430000000000000000000A00108000000000083 +:1093D000000000000000000000000000000000008D +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000000000000004C +:10942000000000000000000000000000000000003C +:10943000000000000000000000000000000000002C :10944000000000000000000000000000000000001C -:1094500000000000000E0000001C000000000000E2 -:1094600000000000800000000001C00000000000BB -:10947000000E000000000000000000C00000800896 -:109480000100100080100100100200A00000000E7A -:10949000000000200000840000048200000040085A -:1094A000E0000001241210004000188001000002BA -:1094B000020000000020000004000C00820081E88F -:1094C000170440801300000000000000400000006E -:1094D000000020000000300000001C00700380002D -:1094E000000000000018000000030C004000000312 -:1094F0000000000000000018000000000000000054 -:1095000000000000000000000000030180000000D7 -:1095100000000180000000000000000000000000CA -:109520000000000000000000000001000030C0004A -:109530000000000000000000000386080000020098 -:1095400000400000200000000004000000000000B7 -:109550000000000010080000000000002000800053 -:1095600000000011000100000002000210002000B5 -:1095700002000000080000000011000000000100CF -:109580000000020000000000400000000000001089 -:1095900000000400F00002000000040000000000D1 -:1095A0000600000000004000001000000000000065 -:1095B0000000080000000800000400000000020095 -:1095C0000080000000010002010000000000000017 -:1095D00000008000000000000000000010000000FB -:1095E00000800000200800100000000000000004BF -:1095F0000000000000000000000200000000080061 -:10960000000000000000000000800420200008018D -:109610000000000000000000000000080000000042 -:1096200000000000040000000001000000410000F4 -:109630000000060000000000001001000000008093 -:109640000000000000000000000024000C000200E8 -:1096500001000400000000060200186C0900000070 -:10966000000C0031800000003000000000180018DD -:1096700000300000000030061800000000C30000A9 -:1096800001C000000C3300000000000008001000C2 -:109690000900000000000000000000C0000380007E -:1096A0000000000000C0003000304000000000005A -:1096B0000004000000000000000000000000200086 -:1096C000000000000000000000002000004000003A +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC +:1094A00000000000000000000000000000000000BC +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000000000008C +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000000000005B +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C000000000000000000000000000000000009B +:1095D000000000000000000000000000000000008B +:1095E000000000000000000000000000000000007B +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000000000003A +:10963000000000000000000000000000000000002A +:10964000000000000000000000000000000000001A +:10965000000000000000000000000000000000000A +:1096600000000000000000000000000000000000FA +:1096700000000000000000000000000000000000EA +:1096800000000000000000000000000000000000DA +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000000000000000000000000000000000AA +:1096C000000000000000000000000000000000009A :1096D000000000000000000000000000000000008A :1096E000000000000000000000000000000000007A -:1096F0000000000008000000000000000000000062 +:1096F000000000000000000000000000000000006A :109700000000000000000000000000000000000059 -:109710000000000000080000000000000000000041 +:109710000000000000000000000000000000000049 :109720000000000000000000000000000000000039 -:1097300000002800000000000000000040000100C0 -:1097400014000000000000000800000100010000FB -:109750000020000004000000000000020C0C0020AB -:109760000002403040C03020050C0000038008207B -:109770000081600F400400080000600010880001B4 -:1097800081D01168001000000040000000000000BF -:109790003C00060000C00000000006800000002021 -:1097A0002000000000003000000010000000000059 -:1097B000000000000000018080002004000001047F -:1097C000000062001080200000008000F400110200 -:1097D0002002D00000A460300848020000100020E1 -:1097E00000030C0C000000040000200001F0100039 -:1097F0000080060000400000000002000000005051 -:109800000004000000100800028160000203290823 -:1098100000010030000000140CC000800C00000E9D -:1098200000E0C018000030002E0040010040003869 -:1098300020180040000000000000000180008000AF -:10984000100C010000000400000600008000100061 -:109850000000000000090800001000000014300C97 -:10986000038000001600080200000010000B000436 -:10987000400020488022204071E0060000000000E7 -:10988000000000000000000000000680000800004A -:1098900000000000000B400000000000A8000800CD -:1098A00040000000E800440010042680002C401016 -:1098B000010000E08200180A000005001C31480881 -:1098C00018010008C0010084081508000008601095 -:1098D000600C006E0000001DC0470C00000020045A -:1098E00008000D00101D024041C301C300C3000069 -:1098F00000400000010002000030000800000400E9 -:109900000420000600100000003C00800000000061 -:1099100000000700E10384000000BC002040C2A05A -:109920001000000000018000041000008000100CF6 -:109930000C200000C0000000000004000000000037 -:1099400000C00000018020001009800000000130EC -:109950009800000000130180006002000008180059 -:10996000020480003C0047C00000000C00000180A1 -:109970000040060005400200005000000000040006 -:10998000000C00C0020000000400000040000800BD -:10999000000004000000C000600018018000E060CA -:1099A00000031800000806024004900021508000C7 -:1099B0003203C000A00000000180020420500D000E -:1099C0000180202F80FFF00000C1018002006001B3 -:1099D000000C040201B80012BB000040000000208F -:1099E00000000506C00000400000822000000210B8 -:1099F0000000000000000400010160720E20E40E6F -:109A000041C01C8020390408CA1050209000570023 -:109A1000004E2A0020000403020004060002004059 -:109A200000004000C0010008030001008040020067 -:109A30004000010008004000A4007C1004230694AC -:109A40002068D0468D3468C146811A343468234674 -:109A50008234611A108D0804518A11A06844468D21 -:109A60000468C2342068D068A1068D0D145051A03E -:109A70000845046848D1A0211811A123468A346101 -:109A8000A3441A3411A34D1A30D1A0084211A343A4 -:109A9000423234682346068D0468D3468C346823EA -:109AA000468A3461A344D0840D1A0084205084D0A7 -:109AB0008D284201A1134684346823468A34608885 -:109AC00044E6FF24FFCE7F33CC78756F10AF8BE771 -:109AD00043F1085EC703DE8F72E003CCEB7F3F707B -:109AE000C1FEF3DBFCDBFD04FF42120001044CA0CD -:109AF0001017CC0010511064112C6F0A03E0416460 -:109B0000000000000000000000DEB00000000000C7 -:109B10000000400000000000000000000000000005 +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:109750000000000000000000000000000000000009 +:1097600000000000000000000000000000000000F9 +:1097700000000000000000000000000000000000E9 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000000000000000000000000099 +:1097D0000000000000000000000000000000000089 +:1097E0000000000000000000000000000000000079 +:1097F0000000000000000000000000000000000069 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 +:109830000000000000000000000000000000000028 +:109840000000000000000000000000000000000018 +:109850000000000000000000000000000000000008 +:1098600000000000000000000000000000000000F8 +:1098700000000000000000000000000000000000E8 +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000000000000000000000000098 +:1098D0000000000000000000000000000000000088 +:1098E0000000000000000000000000000000000078 +:1098F0000000000000000000000000000000000068 +:109900000000000000000000000000000000000057 +:109910000000000000000000000000000000000047 +:109920000000000000000000000000000000000037 +:109930000000000000000000000000000000000027 +:109940000000000000000000000000000000000017 +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000000000000000000000000000097 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 :109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 -:109B600000020000000000000000000008000000EB +:109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 :109B900000000000000000000000000000000000C5 -:109BA00000000000000000000002000000000000B3 -:109BB000000000000800000000000000000000009D +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 :109BE0000000000000000000000000000000000075 @@ -228268,149 +228268,149 @@ :10B730000000000000000000000000000000000009 :10B7400000000000000000000000000000000000F9 :10B7500000000000000000000000000000000000E9 -:10B76000000000000000000000000020C0222002B5 -:10B7700000000004440111104444111100000000B5 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 :10B7800000000000000000000000000000000000B9 :10B7900000000000000000000000000000000000A9 :10B7A0000000000000000000000000000000000099 -:10B7B0000000008000020000000000000000000007 +:10B7B0000000000000000000000000000000000089 :10B7C0000000000000000000000000000000000079 :10B7D0000000000000000000000000000000000069 :10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000004800010000 -:10B800000002200120880080EC20640638064811E0 -:10B8100081E0E0E078000608E7004F1C000400002B -:10B820000E00011D040FE720CC0E7471807C100601 -:10B8300000000020000000013800000000000000AF -:10B840000000000000000000008000100000000068 -:10B8500000200000001000000001000000000805AA -:10B86000000000083DA8340FC02370000000000055 -:10B87000000000009400040020214000500000005F -:10B8800040000000000002000000000001820020D3 -:10B890000001250000000800A1000009002002842A -:10B8A00000002400400000008010020450C000028C -:10B8B00044040000000000200000870018040ED897 -:10B8C0000004005000020000800108000000000099 -:10B8D000E4180000008A2000002288000000000018 -:10B8E00000006000000800000310E020F1000000EC -:10B8F000000000008000000006810001C0920112DB -:10B9000049080021025052800D45000040200400EB -:10B910004000008004004008008000810C0383C8C0 -:10B920000001F22004008580020486000002000865 -:10B9300080010801241210004002088011800002DA -:10B94000020020C280200008040000008200008164 -:10B9500014040EA010000097E6206A8268020D0011 -:10B96000A3A200080330A00800001000400200005D -:10B970000000000200000000008000845010100849 -:10B980000B01CB0401801C2000069181048000146F -:10B990007E0C02C0088830001600C4000201B80006 -:10B9A00024204000A0A00004034031000846F18D8F -:10B9B00020C06D05A0CC000000BC014100000000CB -:10B9C000000000000000000000020008000000006D -:10B9D0000000004C188000211BC0038000000008FC -:10B9E00008A00000100800C0660CD0422000848827 -:10B9F000004401000120020280101810000880009D -:10BA000071E40000091400C00001000002000104FC -:10BA100000000244000000504000000004682010B4 -:10BA20000180050000000000010404000000000087 -:10BA30000000000000C0400000101880005000030B -:10BA40003466080334020801C40042A12C000B5DD7 -:10BA500053504C41DC000007812165400101015138 -:10BA600085DC01A00046582010010260E05040D95A -:10BA700000800970210900200807048240D0544446 -:10BA800040000044404680418002090000080880D0 -:10BA90000070010008300001908104202810080186 -:10BAA00000100B805806090200004000003101051B -:10BAB000308020C2050012200081047400454C0132 -:10BAC000010828090500804004150400024420D91B -:10BAD00090C0010AB0010B102CAC2C000000060035 -:10BAE0000118040360100008026000000B08100039 -:10BAF000400000000002C138010300B210800000C5 -:10BB000000040000000200F8801C02C108000000D0 -:10BB10000104000000000000000000000801000314 -:10BB2000A3981CBD00040E00230210008002100226 -:10BB300000000000040000008100000C4000000034 -:10BB4000000C10434018460000000820C0100040C0 -:10BB50000000000480100094400000004108001024 -:10BB600000C80C00000000000020000000000000E1 -:10BB700032000801C0000000404200000403080138 -:10BB8000012400000800001400001000050020003F -:10BB90000014022800000000002200000C90180889 -:10BBA000020A00080004420E040000000000000029 -:10BBB0000028080000000040000000000000000015 -:10BBC00040000000156604C00C0001801401012033 -:10BBD0000080404050000001000100000081000092 -:10BBE000000000000400000000000002000000004F -:10BBF0000002C21050040020040C000002000820C3 -:10BC00000081200C40011008000000001088000195 -:10BC1000811011080010000C6A409232048051F823 -:10BC2000040B02A0104068408A36B28FB400003482 -:10BC300022000000011D4040380210142C00540066 -:10BC4000C090001402608800800820841000110554 -:10BC5000640062001008000500401040C41010008D -:10BC6000000010400080000000580000001000009C -:10BC7000000000000002EE24000100800D00002002 -:10BC80004400113E6006AA528080000000000000BF -:10BC90000000000000000000020008C000002000BA -:10BCA0000001008004022014000010802000000821 -:10BCB000008000000000000028004001000000207B -:10BCC000200001400244412020200B006000A10020 -:10BCD0001020010035600040E08000008818100846 -:10BCE000AA83A00025FF3E1805DD500008140005BA -:10BCF0002A000040100008020000001000080004A4 -:10BD00004000004801220000510000A44871301199 -:10BD10009C0000004400001100C0008000080200E8 -:10BD20009008080000084001200000402800090099 -:10BD30000001C0008800440090442080002440108E -:10BD400001000080800A080000000140100100008E -:10BD5000000010000000000000100000198000002A -:10BD600000084028000840110044000000002004A2 -:10BD700008000100101102C0410001000000000095 -:10BD800022400140002C00000C044000013820201B -:10BD9000D10034400001A8E00001030D0237800209 -:10BDA000A00004008102040090000C00037A0E0A37 -:10BDB0002008441C443C000425501270005C000024 -:10BDC00000000000D4014401000310310C308C311C -:10BDD00011010080100000001008048240000100E2 -:10BDE00080482400001000048000020000000000D1 -:10BDF00002000001000004000040000000200000DC -:10BE000001F150008015000206401002007047004A -:10BE100002000000028010001830063C40020802B8 -:10BE20000007C44540100A880280040000448000D6 -:10BE3000000000021A0008100000000001000000CD -:10BE40002000000080000000000000000E8000CCF8 -:10BE50000807C0306407F0170002C0404180000EA0 -:10BE600030400C06100000E800000000000141F026 -:10BE700000000400070000401C008200000FCD00FD -:10BE8000003C18000180020C0101004208208408D7 -:10BE900041001080202104080A31D0021801800CD2 -:10BEA000C04801912080C3042000C409900000060E -:10BEB000601819890060006404CC00008630001806 -:10BEC0001800242141000A008000101004240C8472 -:10BED00020C9904C9924C9824C91326464C8264C84 -:10BEE0008264C1321099080493021320C84C4C9903 -:10BEF00004C9826420C990C9210C99092490932413 -:10BF0000084904C849932021301321264C8264C378 -:10BF1000264C326413264932619324084213264684 -:10BF2000426264C8264C0C9904C9924C9864C92694 -:10BF30004C8264C3264C90841932408420908490B3 -:10BF40009908424321324C8464C9264C8264C088DB -:10BF50004C00D21D248590908400C10D1882409C15 -:10BF6000232588AA880045C84A104E1C0022020AD0 -:10BF7000405160A488CA2E092A41110003444C2074 -:10BF800010174C007000108200020006F08001843F -:10BF9000000000000FFF03FFFC18BF0000000000BE -:10BFA0000000400000000000000000000000000051 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 :10BFB0000000000000000000000000000000000081 :10BFC0000000000000000000000000000000000071 :10BFD0000000000000000000000000000000000061 :10BFE0000000000000000000000000000000000051 -:10BFF0000002000000000000000000000800000037 +:10BFF0000000000000000000000000000000000041 :10C000000000000000000000000000000000000030 :10C010000000000000000000000000000000000020 :10C020000000000000000000000000000000000010 -:10C0300000000000000000000002000000000000FE -:10C0400000000000080000000000000000000000E8 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 :10C0500000000000000000000000000000000000E0 :10C0600000000000000000000000000000000000D0 :10C0700000000000000000000000000000000000C0 @@ -230170,155 +230170,155 @@ :102E000000000000000000000000000000000000C2 :102E100000000000000000000000000000000000B2 :102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000003062 -:102E40000020200300000015140545415150545442 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 :102E70000000000000000000000000000000000052 -:102E800000000000000008800002000000000000B8 +:102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 :102EA0000000000000000000000000000000000022 :102EB0000000000000000000000000000000000012 -:102EC000000000000000000000000000000000C042 -:102ED0008088005044860200028010A390000410F5 -:102EE000000088630001C081001450C01C00AA4487 -:102EF000088A139246A7223304142122000218C024 -:102F000000304000020008A890BAFC02CA05940CE8 -:102F10008913280418220230488C123044700012A1 -:102F2000040091C0D4BCA49A0B044C22007420610C -:102F300010232705308255C4888020C8445910507A -:102F4000880411086781285054140F7532B88264C0 -:102F5000B0284841000014048000815024112089C9 -:102F6000420440023CC11A04000790434010040888 -:102F70001E40028000002408390030402001E43463 -:102F8000700000024041924110111802090208022B -:102F90002880200204200A0100545880040108827D -:102FA0000080020000800432C00100088800400058 -:102FB00040445800858000040D10801200200086D7 -:102FC0004039C8002002F2448AAE2800080000867A -:102FD000E8003400000080013908568403450800E9 -:102FE000A0500800A00A01400A002014014000027D -:102FF000802C11041044410C80C00463E1149E0134 -:1030000012080CD010E0E040280001460D83CED419 -:1030100089012A09884240331005A829920A4022D2 -:10302000C05C10821802051010FC7010101B4D8936 -:10303000BB100A60EA51135940F500D0C00982184C -:10304000018C0220048889600002004240009061E7 -:10305000081C7A4002809090030E11A24258A3915E -:103060000451002966C40002414082210408080876 -:1030700022440C867038B800A8E259485B50209270 -:10308000CD2941AD2018A11F8E02404210802C2076 -:1030900000020000000000000000000000001040DE -:1030A0000840002600A3000450F2161124040890E2 -:1030B0004C5450102641803010C4A4072102044112 -:1030C00056405A84A10004080AB643AB5C489800F5 -:1030D000A4031E002A10CA0A04C802061291B444AE -:1030E0000200C188328211309481008C4330A18269 -:1030F0006800A63B200806428000481210004E21BE -:10310000E012600228092C40D2506CC00B19034217 -:103110008042C240007CD5000044D5920028B8927D -:1031200008208C22A019E0B82210800CC89286ECEE -:103130002894020D4A28826038C0B639D1894943A3 -:10314000E07017CA0C5B050B1008D807D72AA081BE -:103150000160EA2094D032104CA24034A071252C9A -:10316000A288C5930A14820C00264B2000644413E5 -:103170001708C7C91860D0001BF0000003CA323F0F -:10318000283D12010F0F5EF047144A05181186857D -:10319000B002089AE82031881FC10370011A3E0965 -:1031A000493C420C6093292E3A47280007048520A9 -:1031B000003C809143409049830C0FC40900D0002B -:1031C000A0592983482103851824B41685040922AF -:1031D000957440C328AB8210D027844CB41424804B -:1031E000FF106650001B082000800019142299353A -:1031F000800EA0406400C014100200F17040500026 -:10320000401029080602D0B0219A08C3010342A346 -:1032100000B4EC0471481823626061322C19411922 -:10322000420D0C14B3199AC52C1052102C6B26ADFC -:103230004C75A32C2426443509C4432170A0814831 -:1032400005C4801201080006882945412540D8247C -:1032500080C00C040A50C00714400A081001013055 -:1032600020C0D14F208CC791B15848D28218730D1D -:103270008481D31CE9A4045E44B9D04014A51A0B80 -:103280005840D19328B08103143380C1D38C14C12A -:103290007302A9000903B968448202814D1410C168 -:1032A000B838DB39FC408400099434A81E5404DD8E -:1032B000A029005EA30EEEC021620088041901015E -:1032C00008A9208850004800080200024888080029 -:1032D000202B082020C824280021080EFC500000C4 -:1032E00004B219840603800D3405C613180A1001B0 -:1032F0001868859300000A51A31C04820118A202D9 -:10330000B250111802C80180048082242C00000EE3 -:1033100000050630A01806B023404900A00D0000AB -:1033200040198848E74202880304020600682160C9 -:1033300080180229920904718410000026030A10E3 -:1033400040800080003441011100CCB8B235006CDF -:103350008A2EC3D4A47E18010986D842B16C0140DC -:1033600010000A0883500C673902434040320000C5 -:10337000291010A30283028C80C501112809206343 -:10338000282476B4044380002027C0901000010553 -:103390009090C2200901004C4004D0A04C20A330E2 -:1033A00030821C0182F081B30088C2010000D0ACE1 -:1033B000200D1B8020400C30080B206200600000B4 -:1033C000085A431C280412A01C60154001E8811F04 -:1033D000A20614495919A100E4900C78000E10853A -:1033E000039A722E2819B00430000003C02058A19F -:1033F000204A480720008480000830C0C71000041D -:103400002C002400087703154C812600C504080110 -:103410000100300100080000A1E540847D08B001F2 -:1034200000004020004C0502080C700A8022D604DF -:1034300007821481072080600104424000002002BE -:10344000200200800B0040404A1008018408200838 -:1034500038083100910D3A01C39C89C400008C47A3 -:1034600043F9FC520C0BE2088001ADE8125201E96D -:103470004A7A7247BCD88008400108005A00D0023E -:103480003830004481D7F859E621010E61421DEC25 -:10349000628303E888D8F2001414E618120FF803C8 -:1034A000CC5896FF1C8803072100802604041E4F79 -:1034B0002082608441E432080608701E48405504AA -:1034C0004042D0020048602400928011E1688008E8 -:1034D00081143308E2F04C0070222840C501129894 -:1034E000685F3B18BF026023A07080510E540D77B7 -:1034F000C2FB14B92233D207C27105FC08030106CE -:103500000566004014925012EC040151260001801F -:103510000E80011280008888412100008020808078 -:10352000118102000002401000000000800E000126 -:103530004C20000006200180004500A00000880803 -:1035400003024A4008080014802A0003A04E6401C8 -:10355000B10019C010C08614182440824200100027 -:103560008008010010010020400011020A07000835 -:10357000404300088000000080C00000014B40086C -:1035800002940000000020000000A5A004000E002E -:10359000000050000075102883CC9FA00910008205 -:1035A0000002040000408004082040820400102033 -:1035B00020400204002040100008000081000100AB -:1035C00040040408004080200040804100040808B6 -:1035D00020808100000800400081000010010002EE -:1035E0000400204102041020010208102081000084 -:1035F000000102020020204002040408004082046E -:10360000082040020400204102048000081000004D -:103610000080008008000001001204002040020425 -:1036200000204088049A672F92CEA071CCB0D4E6D7 -:1036300010A1884D4143081B0804028221801F4CC1 -:103640000A40082281E4025EE0CC97015500C0C028 -:1036500000000D40000ECC0030000000501115415C -:103660003D401EBC0F203FFC0000F0000010200079 -:103670000040000000007800000000000000000092 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A :1036B000000000000000000000000000000000000A -:1036C00000000000000200000000000000000010E8 -:1036D0000280000000000000000000000000000068 +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA :1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000020000B7 -:103710000000000000000010028000000000000017 +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 :103730000000000000000000000000000000000089 :103740000000000000000000000000000000000079 :103750000000000000000000000000000000000069 -:103760000000001000002001000000155005544129 -:10377000551055440000000000000000000000004B +:103760000000000000000000000000000000000059 +:103770000000000000000000000000000000000049 :103780000000000000000000000000000000000039 :103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 @@ -230326,437 +230326,437 @@ :1037C00000000000000000000000000000000000F9 :1037D00000000000000000000000000000000000E9 :1037E00000000000000000000000000000000000D9 -:1037F000000029D280A2A1F064411420008002239D -:1038000090008C4000000C6300004082000050C813 -:103810000C40D2442887139244A32230040431027E -:10382000000318C000104000220008A090989C04DB -:10383000C8040800891010042202082040881020C3 -:1038400048080319000911109020241A084D4C2231 -:10385000804094E1142284867082548000102850A5 -:1038600004100050886411084581B4501814465063 -:1038700005908264A000180300000480000000206E -:1038800004102080460400043C921A080007B0830C -:10389000402006901FC00680C000004B190618008B -:1038A0002021EC04500C0000002F90410010180261 -:1038B000510010004000204B0420C20C1100048075 -:1038C000100008801080020000800824000103100E -:1038D0000000400C044860C00304000006000039EA -:1038E00011800082000108002102D24026CD05048B -:1038F000880010844400340000008880082812A545 -:10390000064D0811A1102802A01A0440220280507E -:103910000400000800082000208001290044A6516E -:103920000800808002080414021540310400118A46 -:1039300008428020895103008A4A50B21025441D54 -:1039400005002012005408821804090050201400B9 -:103950001010340B86C0046441530C410833000A34 -:103960000029801800CC0522CC0075A70100849E98 -:10397000000080A308180A40408091B007041DA1F0 -:10398000C34CA0B0C0C30C002C4A02006D480618FE -:103990000100004220520C005230B4049282B98CD3 -:1039A00095090990056B01BD80C2691D8B404200DD -:1039B0004098220400000000000000000000000009 -:1039C00000000800080102E20120001808C03002CF -:1039D00004044C10404C60020600009000C080229D -:1039E000000220094600080430700440CA34232B2A -:1039F000244018042200501002180C0A00C00012C3 -:103A000011D93048100AC900030202303004000CFA -:103A1000010000001010221300412461808412F084 -:103A2000008009104003200510010C8040100C801C -:103A30000B81004805060200084C890009008982B4 -:103A4000130C30120024040081010408010C21042D -:103A5000063204006C941087480880A278013B1459 -:103A60008489C941501002CC0C180007029018013B -:103A7000131B400140723004084020024400001033 -:103A800000B0200C0000890000140004128603001E -:103A9000000040030708C0C8002204C00638100018 -:103AA00000E6301B00202411890242004020400122 -:103AB00010190292324808130402618003010200C7 -:103AC00023003B0880D4A01208000C138F04A840E8 -:103AD00078F880C1011D006161000009A11800048F -:103AE0004800D100303C39D2480841000825DC1B91 -:103AF00089484963B564D49128298C194127441C0D -:103B0000712125817B9038481089211000001059BF -:103B10000422D83D020A20007C004134011180A01B -:103B20006008700A86203100500040000080028248 -:103B3000400342C10000860032008003402C413225 -:103B400002980089026D0880D2120080008203C0B2 -:103B5000400230CB80603202042244124145009280 -:103B60001480900005840452400010201A000C01BB -:103B70001100E804D12D06400440D02504080002BD -:103B8000000141800084414C2080039081540090CA -:103B9000000042041180A00021C4264683EA10429E -:103BA0006088820130021CB0210004222112CC4026 -:103BB00040000489492026012A0128500090228CC7 -:103BC000412C1050A80048075C04A000A100042864 -:103BD00009000409014A40D00208404001720088EF -:103BE0004411151000013099444040000900400084 -:103BF0000080001000210430200250080021588865 -:103C00008230000014A208800C0201082000D42396 -:103C1000044008010004A0B900080A01800204E879 -:103C2000003C300EF600301806890188088201C376 -:103C30002C22953046816220E04080C03268CD045D -:103C4000A33D0088F400A80D0380400806843302D9 -:103C500080220160040A07093300103020000103AC -:103C60002F0006C0000020A4002000001800459886 -:103C700040600077400C03DE9C1088010481400006 -:103C80006C40202008420A023179A8592922D10724 -:103C900021000E00602002108241400460450100B6 -:103CA000420A40010040141030010001202C041988 -:103CB00000020901580000000180100080046130FA -:103CC000940123082080AC000110024401840220EA -:103CD000A0C048082C259200388100B8292404008F -:103CE000012211100C008318280808821010B02639 -:103CF00004400811028840010222010008002184CA -:103D00003021204B008A7206042CE00410000000D1 -:103D10009020000A14484806A0008000000400001B -:103D200043800004200028000001019888810008D9 -:103D30004204080022005001011108000104000C97 -:103D40002000C40201002A48405935460C182120A1 -:103D50002020C608418111000650C100000C42A17C -:103D60000050000221130085000360F04A11140086 -:103D70004A00220030003A1480053E00A78088B037 -:103D8000008E8C42139B6CD2150E40CC0020D0903C -:103D9000902620C200DC80874000001005001440FF -:103DA0000330941409510024029B5850BA22014454 -:103DB00002525A70012200E040C0B11004C4441500 -:103DC0008180C403F294A50C1500820810018022A2 -:103DD000040200804440004462880400020C120087 -:103DE0008801140010008100900060C50080001060 -:103DF000000880108100000C8060A040B202082002 -:103E0000C40090B458215B1CFF0370338150847947 -:103E10001E070D40E3F304392233D0414281068866 -:103E2000810200140900000898C8121B6C00910060 -:103E300018500614060000040064200200003082BE -:103E4000C3208840020202000000809000000002AF -:103E5000810C40000C8000020E1000800345C080E1 -:103E60001611010103004AC8001E0818000D0010B9 -:103E7000800400011108598013004A920490828442 -:103E800040A004200000400400800800141011022B -:103E90000A87000810530011850000A1008000006F -:103EA00001D3000003A1A800000020000000E98069 -:103EB000000010D40000700000500000918C9CE0C5 -:103EC00003100082000006000060C0060C3060C3D2 -:103ED000060018303060030600306018000C000047 -:103EE000C18801806004060C0060C0300060C061C1 -:103EF00080060C0C30C0C180000C006000C1800046 -:103F000018018003060830618304183001830C18FF -:103F100030C1800000018303003030600306060CCE -:103F20000060C3060C306003060830618304C000E3 -:103F30000C18000000C000C00C2000018013060017 -:103F400030600306083060CC0425AA0820842C12B7 -:103F5000805895DA0008022943B0008EC020300353 -:103F60009380E200361C11620204028D04500B049F -:103F70004C43C3C000000010000E4C0000000001C4 -:103F8000403004049870020CF0303FFFC000F00095 -:103F90000010800000000000000000000000000091 +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000000000000000000000B7 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000000F7 +:1039D00000000000000000000000000000000000E7 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 :103FD00000000000000000000000000000000000E1 -:103FE000000000000000000000820000000100004E -:103FF000000000000380000000000000000000003E +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 :104020000000000000000000000000000000000090 -:10403000008200000001000000000000038000007A +:104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 :104050000000000000000000000000000000000060 :104060000000000000000000000000000000000050 :104070000000000000000000000000000000000040 -:1040800000000000000000000004400200000010DA -:1040900000040041445451150000000000000000DD +:104080000000000000000000000000000000000030 +:104090000000000000000000000000000000000020 :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000900E7 -:1040D00000040000000000000000000000000000DC +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000000000000000000000E0 :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 :1041000000000000000000000000000000000000AF -:104110000000000000002B66022BA14300020030CB -:10412000488037805948A81400040020800040428D -:104130000010140292012408280000C4842182087F -:1041400020040000AA0008214010040520A008A0B7 -:10415000203A7C2DD2090B0204221630B3202C4CBD -:104160004013104C6027182460C1281288D0440ADC -:10417000056C4D0480168CE824009446F412D63861 -:10418000309118C201252080480E2808818804A398 -:104190009A88E0BA1DDF0BE6200AF8410000008093 -:1041A000120102440493249A48C00054A8E00A096A -:1041B0000005429142A405001508028A90080404F3 -:1041C000591482409101508050A90080411990EB10 -:1041D000FCBFD13013801042440016580404898873 -:1041E000828008CA84110202420044103B622910F6 -:1041F00000A08252402822392041400084A08848F3 -:104200000803C060920400F0E718094BBC42303844 -:1042100096080A0300C0500360003002000200014B -:104220001100800801840040A000800881021180F4 -:104230008810811011021220013022CA20818B398E -:104240000007BBF2AA0CC4C8075FC80530A5180058 -:104250009E1A004022000B44814022000248E05098 -:10426000002044080A004420C0089020010A0700EA -:10427000C1416C07912078069021955483132C122C -:104280008874C112444FA53B31C98E300DB80A085D -:10429000152800217215A471020A2645B4729414DF -:1042A00054DD108E42861094B87B4B0BD680FEB145 -:1042B0005ED8328728D3CDA0F069A0E0823744C30E -:1042C000C6801C08158405C00A918094DCC80C3A8D -:1042D000A080AE10142C2E200072CFF082C00C28CB -:1042E000103C0042A533DA94328822C3890F211A88 -:1042F0000CD42029948601530044025A20088208D5 -:10430000A25F00002820444930015000930124009E -:104310008E24002204442804208210120A804008BF -:10432000140100011013E0004B0053C110110700ED -:10433000C0102CFA860180088C243828044A0EA369 -:10434000D088126E0C0749021142081382323801DC -:104350008012B000B2BA23D50C20800890411C080E -:1043600012411C0043C03E2130204064C05068AF61 -:1043700044240940C6138464002006AC0F6AA01BC5 -:10438000507A0028D94940839020874205C00028F0 -:104390005305B0494E0001003000080C0D5800A034 -:1043A000400210901497C03802081E10198409109A -:1043B000268C08040140A054712D1C42D032AC243C -:1043C000E883233882114148A82072041D43DF414D -:1043D0008E4480430123C5A5A0501096FC35634947 -:1043E000E20300C08A39030B02344068D046450D11 -:1043F00051482A415200807B155BC03D6380B05814 -:10440000BB0C14067E02D824210F39870A6401945C -:104410008C28943A90000B81AD6875C909BF8099CA -:10442000602F509E68002CC0FF410044644B15096A -:104430000719411A242C1B0144CAB00298008810A5 -:1044400021C000A1600150580032B404A0320080A5 -:1044500008DC08D00014101F58DD113E5D432A739C -:1044600041486D000012080120F448CAD918CBC495 -:1044700070933F5C857F32F0446032503CAA8404E4 -:1044800002CAF88381706B0B14AC48271110F42812 -:104490003615900E4AB1EB1CE680040CC10502D122 -:1044A0000041750A028E5DC3B58C61B600334D8242 -:1044B00042CBB8731B0301C49FC3BA982DF70CCC31 -:1044C00082FC214580F6DE158A4C15A081002AB0B9 -:1044D000060589BC40DEE067253AF84E21F3A80CBA -:1044E0002DB132CE0301011EA0E200057488F383D2 -:1044F000CB60C4DB2D114CBD02C4B05A8A0AC0483F -:10450000630032B0D7002D6085A420BE1C8418053E -:1045100008401C4258C83C9F10900FAE11A018E9EB -:104520001336280392B23110C0AD39D20F4C51A4CA -:104530008C042524858367E107E40F5213FAC2AE89 -:10454000D201B851FE0E830650200F44400818BB1C -:10455000C08312C480150000824888A258444210CB -:1045600010044DD800421062292240CC12A0D0681D -:10457000C2B4333700ECB0A010DCC312730B50E1AF -:104580006534AB520A818A2C629CCCB4910D0684AE -:104590008692EF6862812A888E5E43DE98A0BA39DF -:1045A0001C07801102800A0A00300C5001544000A0 -:1045B0000F14C9000480383042010908CA4800922B -:1045C000100A982DD44899F04E04F3E70D76C6AC46 -:1045D0000105140A4B2EAA490A21A0E8146A080909 -:1045E0008A04C2B04C809301B300E8C2414C084039 -:1045F000088088C1A006401860080040208009306B -:1046000020BB384201C0001D0431F704298A8021F3 -:10461000B600420B04C20294530BC0727120618138 -:104620006C206BA4B8F12AC54041F1110CE31626A9 -:10463000EDCCB261A31002002B1004F81134DC6140 -:10464000960D0203A8B0738CA7031FEF810092455B -:1046500068A51F20E04C13004884CA990895493387 -:10466000C30548AF3825DC076E701CAC9A9F0585E2 -:10467000C001422020C5CE24838D008166701D5666 -:10468000307CC26441D32C0AC9165ACE104005486A -:1046900020441C168ECB22CB38CB3B02A2013260C9 -:1046A0000180C040001C8CA1239E0C510C20498E1F -:1046B0000622C400009820C2098002010008BF073A -:1046C000F14FC6028508414815838401209738536D -:1046D000BA01CE0502605C400EA2076F8E85601B9A -:1046E000243141084888CE0260F8BE8C14E2853A35 -:1046F00083E388836133A080542036707A8A054230 -:10470000C16F13A0A07ADA3847CB1E701DB0E1E963 -:104710001602056201673CEF3E04EDC003E1879C91 -:10472000B5470F58C43D40B20081DB103EC4404342 -:10473000A140C00106B20C4040F0E4748037D1477C -:1047400079714F082C6C0806810020AA04155A00C4 -:10475000C00882037950DE542E5A8D6482C56C6A7B -:10476000261D9C02C18002C4041200AA040101207B -:1047700054000000CA04806105200180020002810B -:1047800040800002A908A2020002020865F113C3DA -:10479000400052207814052293002D830A400049DE -:1047A000300604896208481C2302380380704708D9 -:1047B000C10E2204402080001004942280800A014F -:1047C000008CAAA111200005524040255214B54486 -:1047D0000250901402AA242005294014B4BAE21F02 -:1047E000380CC5736F5C25AF0A700778636AC4170D -:1047F0006E337ACF07E01DB4B9761B37063D631FD1 -:10480000A0ECDC2EE1CEA9836A6497EC0A72C43571 -:104810006262D477A3262E4EFCF2C19894CC267205 -:10482000C6CDA2131899881BB68EBD71BB34D8B9FA -:10483000159B4FDEB0C5F8D4C205DBCB5431B77041 -:10484000635637AC4976F3362CB57E1B760CB561D2 -:10485000FBF4FD4C0E5D89C403E184FD4E3A23094F -:10486000AA93F624BD7E3BF78EB57088E48D242391 -:104870005A8EA43100541592060D03414172600115 -:10488000C4101642A280CB040E6415478200424930 -:10489000142D84075C40000001000D1000090FFE7C -:1048A000300000104011110B410019F00000000011 -:1048B0000FFF03FFFC420F0000000060000030000B +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 :1048C00000000000000000000000000000000000E8 :1048D00000000000000000000000000000000000D8 -:1048E000000000000000000000CC0033330CCCC3FB -:1048F0003330CCCC33330CCCC33330CCCC33330C4F -:10490000CCC33330CCCC33330CCCC3333002CC00EB -:104910000000000000000000004000000000000057 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 +:104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 -:1049300000000000000000000000000000000CCC9F -:10494000C33330CCCC33330CCCC33330CCCC333347 -:104950000CCCC3333002CC0000000000000000008B -:104960000040000000000000000000000000000007 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000000047 :104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 :104990000000000000000000000000000000000017 -:1049A0000000000000000000000000008040400007 -:1049B0000000001010051511010051510000000009 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 :1049D00000000000000000000000000000000000D7 :1049E00000000000000000000000000000000000C7 -:1049F00000000800000400000000000000000000AB +:1049F00000000000000000000000000000000000B7 :104A000000000000000000000000000000000000A6 :104A10000000000000000000000000000000000096 :104A20000000000000000000000000000000000086 -:104A3000000000000000000000000142008B214443 -:104A40008040012000C202920C00C01400024C44BD -:104A5000000170020014C4809001FA0C018E32A68D -:104A600046A54040040F310200031100007CB00055 -:104A7000021008A0B19D840CCA050E4A08321C849D -:104A800002060039049E51780C2203045201495059 -:104A9000909035341906403200D040019026A00392 -:104AA00000C0D6048C142A9CCC541241880D312AA3 -:104AB0004C8964504C200AD816C002882008044152 -:104AC00000000405800201B02E9025E0440040342F -:104AD00008410E0802012081C1A0400804800A8616 -:104AE0008020246859041000E320485CD06802024A -:104AF000480592E908BC38220900102247000C033F -:104B000004048C88E1132000141318824090904014 -:104B1000744228268001321070004E18384C9322BF -:104B20000D3808900790405B01E018881419DD04E7 -:104B3000F10278D0878A0500804010001028B02844 -:104B4000A280010015008008010C0002A080100165 -:104B500080020300180100200200020600112080DC -:104B60002080210D000881405340182C125E0084E3 -:104B70001111C0002412114C0A032480010014C238 -:104B80000002E01C90019D2214863110A0140C013B -:104B9000102409105040209670246A409021404013 -:104BA0009311085684720005509D8118070830F152 -:104BB0000F80001020004521200090A6002A0AC87E -:104BC0001950B65460A62A80448740B63049701503 -:104BD000490159E092AC16C6324580140108D098BC -:104BE0000F21040240120D181F4312884A05725FFC -:104BF000AC8D1F2BD98295A23B686A0000420FF250 -:104C000082A00C08103E0042AD30214418D82A2062 -:104C10008980A072C0C3750000071812E1642310D8 -:104C20001A220B0920508872730E6C494A218C5845 -:104C3000D30500004FA48203C4053801280AD0928E -:104C40008A0804601B4445612052106121281B041E -:104C5000411124D0315808288982502D1836A725B3 -:104C600011CF0880848C528E081CC0C21352004998 -:104C700010020606C532C614A2360F510C1EA2231E -:104C800018515A231B4512837290390400A08020CA -:104C9000A020080402004900805204044888108BB8 -:104CA000482AC3027C59E308C5034403809026C008 -:104CB000253889B142D04869731C66C0A9A21A2060 -:104CC000C5C625000E1192C2C894292E1147104066 -:104CD00024044C2634B70511C18C80686C0B180372 -:104CE0008AA2C4A42B58285C0822A33B4C3F17225D -:104CF00008C35B4008445369024B00125340A08331 -:104D0000CC2F110E43134640CEB0020C0074024F5C -:104D10001033821E10CC88C1A268840300340001C5 -:104D20008190800B412044041C4090002000388278 -:104D300040004184082C951AA0414B019D70D4017C -:104D4000002F8100412F001C60052CC0F7A0030438 -:104D5000100B14010044107360888201064B60B090 -:104D600081044249308041A04095801029002504EB -:104D700049B00840308200804600020BC4258008FC -:104D800082404103E81C5B080722CE6D3224982A3A -:104D9000001208406400BC48007122040064025004 -:104DA0001422150024400010140458000488816067 -:104DB000511514482419484904A14140106002A12A -:104DC000045490979CC8102410050D230E007627DC -:104DD000249201B08002841200311001C1400144CC -:104DE000500408D001EC3149E080000E80004810EA -:104DF000B100448021508A0000009009440030092D -:104E00002053AD2049A400A941404040A0281B03E5 -:104E10005E41AE10E1845C520800821D2341904245 -:104E2000520848414210029884401950C021300A6B -:104E3000545441180A0081410180725A180000320E -:104E4000C114280846365C0211B00CA0D5A008E0B9 -:104E50000D120000400C2C2C46066CC183605524BA -:104E6000016783860020D044AC07C8447DA0040CB1 -:104E7000504804800C0203045001000E100004523C -:104E8000485C0E201C21035400025C6B80192149F0 -:104E900080405268468E22328CFCE13080CA473214 -:104EA000A2000CE08800100528800A080214E8B867 -:104EB000D00082828790450800880101000841D413 -:104EC000802018270104A6500290401816840E0472 -:104ED00083104842D90240088000933C5080000172 -:104EE000C10122009420A008B00110815008303088 -:104EF0000500024400A204A02118E8070800A10050 -:104F00000A212CA00A1F422D48B293063384C0F117 -:104F10000820184C1ED38895012044005A12640BB7 -:104F2000A6A00134329238160990A10910900526E6 -:104F300038008421110C00190048861102880001F4 -:104F40004022010801020800440000028A8D60032B -:104F50005C403D300A460D019CC0A0D4390D072AA3 -:104F600022860018C100C9003CD0343020CC0B355B -:104F7000848DF3F290F11030E041002028044E823D -:104F800028270018211C000C2026A40022C03988E4 -:104F9000A0C1050408C080000440C63523810EA1CD -:104FA0000C107D0009C246A12150200860165287CE -:104FB0004A01514C025024004208620860086829E6 -:104FC000E2013282018087D932C4CD2D439A2C7000 -:104FD000BE0040496020C480260233C0009CD03708 -:104FE0000020801005800001010040C114808DCB9D -:104FF000009B984682021044002230401A040101AE -:105000000186210024AB400802C8CA810118C68C61 -:1050100015080B28C0058420010224020402004068 -:1050200060C02040020C1204000090245500812032 -:1050300000906B470026001400620C40140424000A -:1050400006612044B0100802CC0010B04C011B11C6 -:105050003E004003A14010011E0F8F66A0F00431F6 -:10506000433FF00F407315080C00204203840201F7 -:1050700064105032D2030910000000000E000144F9 -:10508000016C18001801A004EC00D0E00C02020032 -:105090000007010000000010B204805005004148E4 -:1050A0000A2801809020C0000400000003033B0098 -:1050B00075F530A10F9040103414200A9200A98297 -:1050C000010010881010838800260080900B0100DA -:1050D00016016024044002000AA4001610200202F7 -:1050E000E2000000180008500120011802400010E2 -:1050F0008220A002010090108C00200000054002D8 -:1051000080D81000028105B0009401AB0620078210 -:105110004270D8A70E3E60CB76819E3C3A70232722 -:10512000063E709A380C880AFD8A398270A4E60E11 -:105130000678C23E0270E879A8368F8EBFE3FD8004 -:1051400090AC0E6088C9A2429829C203A7083661B4 -:10515000E3E49E3E09C34E9A30F980906609A303AA -:10516000A2323E606326268F8A68C3660C3A7003BB -:10517000A7083A71E3E4C88E0D9E080602EC8CD9AC -:105180008F20E009A393E7803E7823E78C3E708868 -:10519000A4BCE51D10CD677140BCB48E1098461BB1 -:1051A00042110838440600CBA38022C0A6051D1278 -:1051B000818BD393D40370047B028280010000446E -:1051C00000004C00100000555415544B2CA014B096 -:1051D000FFC03FFFC000F0000000A000000000A0E2 -:1051E000000070000000000000000000000000004F +:104A30000000000000000000000000000000000076 +:104A40000000000000000000000000000000000066 +:104A50000000000000000000000000000000000056 +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90000000000000000000000000000000000016 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000000000000000000000000000000000D6 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 +:104B10000000000000000000000000000000000095 +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000000000000000000000000055 +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B90000000000000000000000000000000000015 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000000000000000000000E5 +:104BD00000000000000000000000000000000000D5 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000000000000094 +:104C20000000000000000000000000000000000084 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C50000000000000000000000000000000000054 +:104C60000000000000000000000000000000000044 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0000000000000000000000000000000000004 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 +:104CE00000000000000000000000000000000000C4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D20000000000000000000000000000000000083 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000000000000000000000000043 +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA0000000000000000000000000000000000003 +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE00000000000000000000000000000000000C3 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E20000000000000000000000000000000000082 +:104E30000000000000000000000000000000000072 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E60000000000000000000000000000000000042 +:104E70000000000000000000000000000000000032 +:104E80000000000000000000000000000000000022 +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000002 +:104EB00000000000000000000000000000000000F2 +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000000000000000000000000C2 +:104EF00000000000000000000000000000000000B2 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000000000000000091 +:104F20000000000000000000000000000000000081 +:104F30000000000000000000000000000000000071 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F70000000000000000000000000000000000031 +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000000000000000000000F1 +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000000000000000000000000D1 +:104FE00000000000000000000000000000000000C1 +:104FF00000000000000000000000000000000000B1 +:1050000000000000000000000000000000000000A0 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000000000000070 +:105040000000000000000000000000000000000060 +:105050000000000000000000000000000000000050 +:105060000000000000000000000000000000000040 +:105070000000000000000000000000000000000030 +:105080000000000000000000000000000000000020 +:105090000000000000000000000000000000000010 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C00000000000000000000000000000000000E0 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000000000000000000005F +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F +:10517000000000000000000000000000000000002F +:10518000000000000000000000000000000000001F +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF :1051F00000000000000000000000000000000000AF :10520000000000000000000000000000000000009E :10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E -:1052300000020000000010000000000001800000DB +:10523000000000000000000000000000000000006E :10524000000000000000000000000000000000005E :10525000000000000000000000000000000000004E :10526000000000000000000000000000000000003E -:10527000000000000000000000020000000010001C -:10528000000000000180000000000000000000009D +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E :10529000000000000000000000000000000000000E :1052A00000000000000000000000000000000000FE :1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000010CE -:1052D000000000010000001110044441111044447A +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE :10530000000000000000000000000000000000009D @@ -230764,286 +230764,286 @@ :10532000000000000000000000000000000000007D :10533000000000000000000000000000000000006D :10534000000000000000000000000000000000005D -:10535000000000000000000000000000000000400D -:1053600048080040000200012080008000208000EA -:10537000000000000000000200000000000000002B -:10538000000000800001000000000000000000009C -:105390000000000000000100000800000001008083 -:1053A00000020100020000020000800200008000F4 -:1053B0000001000280000400000040000000000026 -:1053C00000000000000000000008040000200000B1 -:1053D000000400080100000000100400000000109C -:1053E00040100004400000000010020024902480BF -:1053F00041804004080002080001088040200000AD -:105400000420008080000000090410008010420485 -:1054100010080000040092EBC8BC80000B80100153 -:105420004400000104008408801120008401080069 -:1054300000000000000008120000021040000008F8 -:10544000204400000080000000080000001000E878 -:1054500000105D4010000000801800000003100ADA -:1054600000001000000800000004001010000100FF -:105470002002002004004002004004004008088090 -:1054800000006028608000210008C50002C482007E -:10549000175E800C9000000124121040400008901C -:1054A0000100020202002040002000080400000069 -:1054B000820000801404008050400050082020002A -:1054C00050220000802A08028010200200BED12C49 -:1054D000460231F000000000000000004040901043 -:1054E000400000000041100440040000000000A43F -:1054F00000004000000002800088048000000800D6 -:10550000008000002A32240842800808102006008B -:1055100008000090A848101209029280144421004B -:1055200002420FF6C2A00C08103A0040B512080C57 -:1055300000813C000000F20200C049204006A17238 -:105540003340820C1D300A0B301858C8D000C80AEE -:105550002D31A550140C00408124002200040804C1 -:10556000200010035AE010491BA60D41625328B3D6 -:105570004B095306041166E82B500D58C8CA12682F -:105580008464B11698006D80800009802FDB4496FA -:10559000520610D28033430A2D12CB342AB2008A2D -:1055A00088393130305F4B3032474B42012816206A -:1055B0001101C0A2A20350202224020090529E504A -:1055C000010031B08A2AA018001E000088C9299164 -:1055D0000008074835B4CAA56109544912001E4A9B -:1055E000AE01010420680D388318A29A18961A2B70 -:1055F00018035940A18C6923241186981195A46D34 -:105600006D0F594B63806458E0030F2E081100485A -:10561000C460432F9280C101ACEC355A262B098817 -:10562000E0C130B40318C181F28191C046B60203D3 -:1056300003948063D075C631418C0C405210240114 -:105640002010020181040400010004041A00D000AB -:10565000290004020040A04400920200C080A490EF -:105660004200908109200000029240258002924071 -:1056700039000000010C000000000019102011008A -:105680000A002000000008002080000061000010D7 -:105690000002340000000A08048000008A0000189C -:1056A000542580389A41A313CC900C0000220802A4 -:1056B0001080002A0010084190C0A8089021220400 -:1056C00003CC8275D4C40700000A888090C46A04A1 -:1056D0003CA8C011227148494012220240A2031086 -:1056E0002002108981A6200888824404000000015D -:1056F0009C8066F01131012E01E3A0335827C600CB -:105700008232000020041DF202EE33FD2090460C90 -:10571000958E0090C10CB4060308003400102802D6 -:105720000414344CE073AB001AC40EA04101C00451 -:105730008C814105540DA3D23A4009D2290040BDC5 -:10574000024004327E024A000550000000001110A1 -:1057500000A020011442401048020420040CC000A4 -:10576000022908200001200C0030080A93100000D4 -:1057700094AA0640840000000014080405000020DC -:1057800000000000000A0001000000400208108232 -:105790004100002800000880000000000080100088 -:1057A0004204000240000000000241048005002085 -:1057B0000800294C90206A48020413020462002069 -:1057C000C4080208130014600080080000480204A6 -:1057D0008000000000200000010004040080008020 -:1057E000010C43D40020800081020141028010009E -:1057F00000000000000000000002800002001830DD -:10580000000C2000400102011010821DF1001980DF -:10581000000030080080000000200402A82CE201F3 -:105820000800A0E0382000400000022000A0000096 -:105830003300E0C0142001400000804000804000A0 -:10584000A8001000008000002000000001000009F6 -:10585000081507000200100010000A0000000011E7 -:10586000028840454020004A0022822001100800A2 -:10587000400191010400040000400000000000000D -:1058800020680022000000000000000008A00000C6 -:10589000080001010004924A00805008E00428003A -:1058A00000245090090008008000880080008100DA -:1058B00010010000000001000800020000100000BC -:1058C0000081040104081C080000021000442000AC -:1058D00000020004080041005A1102414108210859 -:1058E00020082000004000000180800000000C0023 -:1058F000228A0410040000480022D400120200C0D2 -:1059000008A8008500273C2781CE063024CC03C0A0 -:105910000000040360210C2802000E000242D000A7 -:105920001A2426410106B0EBA42311026C000001E9 -:1059300024002000250206288223CC99F73A010092 -:1059400093319F40E0920933C9FC1201240A8A2155 -:105950000E0082906F902208002C0414101508A1EC -:105960004C006400006020B0000000004040104483 -:1059700000000800080000012560058006000800FE -:105980004020001102008540408006040001000014 -:1059900000008000001052000800A9400000000034 -:1059A0000500000020001000800020004020004082 -:1059B00000020000000000000007F00000000001ED -:1059C00000200000000000000004000000000000B3 -:1059D0000000002004000400000000000004000893 -:1059E0009100004080000000000000000001004025 -:1059F0000800800801001000002000000A000000DC -:105A0000100000000008000100000000000000007D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:10552000000000000000000000000000000000007B +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A00000000000000000000000000000000000FB +:1055B00000000000000000000000000000000000EB +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000000000000000000000BB +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A +:10561000000000000000000000000000000000008A +:10562000000000000000000000000000000000007A +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:10569000000000000000000000000000000000000A +:1056A00000000000000000000000000000000000FA +:1056B00000000000000000000000000000000000EA +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:105730000000000000000000000000000000000069 +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000000000000000000000000000E9 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000000000000A9 +:105800000000000000000000000000000000000098 +:105810000000000000000000000000000000000088 +:105820000000000000000000000000000000000078 +:105830000000000000000000000000000000000068 +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000000000E8 +:1058C00000000000000000000000000000000000D8 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000000000000097 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A00000000000000000000000000000000000096 :105A10000000000000000000000000000000000086 -:105A2000000000000000040001020800800011AB2B -:105A300000210000000000408104080040800004B4 -:105A40000000000000000000000000002000000036 -:105A50000000C08100000000000000000000000005 -:105A600000001020084104084810202100102120C7 -:105A70004082040020400000000000000000000000 -:105A80000000000000000000200000810408104019 -:105A900080040820408204002040108400000000A0 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 :105AA00000000000000000000000000000000000F6 -:105AB0000000008840925022014E8D3001B0240534 -:105AC00027248922439270DC413C280534807900E8 -:105AD00072012212028A0380282406020800C0C034 -:105AE000F100089C00080C00200000540534C40696 -:105AF000E4C000C4000000000000000000089000A6 -:105B00000400000000000000000000000000000091 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 :105B10000000000000000000000000000000000085 :105B20000000000000000000000000000000000075 :105B30000000000000000000000000000000000065 :105B40000000000000000000000000000000000055 -:105B50000000000000020000000000000000000043 +:105B50000000000000000000000000000000000045 :105B60000000000000000000000000000000000035 :105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000002000003 +:105B90000000000000000000000000000000000005 :105BA00000000000000000000000000000000000F5 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 :105BD00000000000000000000000000000000000C5 :105BE00000000000000000000000000000000000B5 -:105BF0000000000000444000000000000000000021 +:105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 :105C10000000000000000000000000000000000084 :105C20000000000000000000000000000000000074 -:105C3000000000000000000000000100000400005F +:105C30000000000000000000000000000000000064 :105C40000000000000000000000000000000000054 :105C50000000000000000000000000000000000044 :105C60000000000000000000000000000000000034 :105C70000000000000000000000000000000000024 -:105C8000000000400200007C880299004C800080E7 -:105C900000488002000003908000380200000200EB -:105CA00040000000030000800C01013A001F8E2C10 -:105CB0000008E4E000FCA360001880000008000079 -:105CC00000010080000201000200000200008002CA -:105CD0000000800000010002800000000000400081 -:105CE0000000000000000000000000002008040286 -:105CF000002000000000000001000000001004006F -:105D00000000001040000000400000000000000003 -:105D100020800400020040041C12800800039280CE -:105D2000002000940E480000800010010014100FA5 -:105D30008C00E48420080001012002AAC8AC80087D -:105D40000A8110004490DEE132D6844A80DFE00010 -:105D500024052908421000C020000802000002109B -:105D600040000018200400000000000008020000AD -:105D7000000400683E10554454800000800000007C -:105D80000002500A0000100000020000200C529592 -:105D9000154501402002002004004002004004009C -:105DA00040080900010861E260B9F92B77C8C50015 -:105DB00006F48A001556C2043020002924125241EC -:105DC000444008B8B3821F120260304684B0000A13 -:105DD00044C10400BB00C1A011858100514008D01E -:105DE00000286D0992600040A24A282080184002D5 -:105DF00030B6C52C1600B1D021240400160C0800C2 -:105E0000400134610035A80D80B1CC4C1A2008291E -:105E10000462002230003010400132008418F44641 -:105E200001840982C181D04BAA106EC9469346787D -:105E300001501ADF08002094F84C103219428AB041 -:105E40001D449000001A4000000000000000000007 -:105E50000000E31010983E08824CF3CE3062C92453 -:105E600070C6B57333E8820C1D304F0F311A58D805 -:105E7000DF3DCACE2D31A5F85E9E1BC1816CB0E21C -:105E800000B548352B4110E3DAE8304B1BA60DE195 -:105E9000E35368B3EB0B53460C11E6E86B780958F3 -:105EA000CCCE527DC4E5D9169F86ED8050081B8C60 -:105EB0000FDF84C2114410FAE232530F2DE2DB3CB3 -:105EC00036B63C9D8AF9313F709F4B3F72CF4B43B2 -:105ED000AFDC976B3D9BCEFFF327D473FA34768209 -:105EE0009B73FAD0035B39B28FFEF3FDA83E03002B -:105EF00008492F90000CED0835B4CAF5616974E9C2 -:105F0000300FFF4ABE010114712C0DF98359A3DB38 -:105F1000DCD69A3B59435B60E5AC7D3325598698C6 -:105F2000319DA46D6D07594BE3802F7CE14F0F6EBF -:105F300008BB2251C0E0532FB684C181ADFC355E51 -:105F4000262B09A8E1C3F0BC931AC241FEE097C01A -:105F5000CEB6210B438080F3D074C631C18F57F188 -:105F60005BB4440326800200811F48164829BCCB3D -:105F7000B2707EA4410026A08417D05EC4498A3145 -:105F80005F0F1240420CB82E18584A62204EDC9B1C -:105F90008F3C49042871F4A004740441075D428BCE -:105FA00030DD233CB74160E009000908021B444092 -:105FB000F15000634504FA0308D1021CC4F5351CF6 -:105FC0008B5E4139D407191008050213C8B43C860A -:105FD00005AA480630A61810062520029140400068 -:105FE000BA8020000BDC0075DCD7132894489F6032 -:105FF00088446A243C6840B922F9484F44122282FE -:1060000040A203B0281E10D983A6200888A6441CED -:10601000480004119EC066F413B1012E30A3A035D0 -:10602000F827E4480230000082083FF242EFB3FD57 -:106030002C91662C958E00D241ECB5071BC8803F91 -:10604000B3312812041D37CEE073AB001ACC0EA07A -:10605000C101C085AC81E925540FA3F23A4009D2B1 -:106060003BD042BD0241043F7E0FFF8049D18210E8 -:10607000B2CE2870C5240003188440100040184197 -:10608000210867FE109008A7D1DE28895E16A609B0 -:1060900001A0BFF89CEA0ED9415051281C240900E8 -:1060A00001400020000000001408020100400040F0 -:1060B000020812824100444851221EF18341109A85 -:1060C000C4931A03DFCE998270BC783F049F46DCEC -:1060D000D0C718E32B2669C594315F68D0D6333B0F -:1060E0000FE692B294ECD11A73005FE01200383CD4 -:1060F0000C880004A21CCC2A1C21B686F7900698B6 -:10610000918225E6425C620DB0A0AA000106D3414F -:1061100026A010000009000000000000000280021C -:1061200038022800000D00000531F05350188A197C -:10613000D7401F80040030121121420E93A3145344 -:10614000A33CE60DB5A3B5ECDA2C03E240C990A55B -:10615000002A04349000B001EC24056B06A08840AE -:10616000008264076812B5C776C000442000000CA6 -:10617000490000493C11173C1486787152EC929A00 -:106180001326475380A9685540200088CC2226F862 -:10619000527E2A43C4E2B30704C8E53B00C58AE047 -:1061A000680002D02268007FE1776080B109EA4C84 -:1061B0000963BBB8A80F09630515B35ABC6CB53F9A -:1061C000EE844A0249045EF22F2ECE32C0008800CF -:1061D0008034040026501C8C8D8101004800020090 -:1061E0000020000000C90401308004631E7309050B -:1061F00041C9A4084824520E7C90450CDA55004150 -:106200004069906984698400088841E00008F79932 -:106210003051479E6164043DC530094B7FA3BC20CB -:10622000378F000149BC80B5A8273B2721CC863099 -:1062300024CC83C01480040360200C2800008E004E -:106240000762D0301A240645050690EB742311022C -:106250006C000A112400A000214306A882A3FC9927 -:10626000E732810093319E5028120933C9E502813B -:10627000242AB8390E08CA906DD8E208143C095493 -:10628000301508A54E006680400022B000000000D6 -:106290000A8010D64097AF1D3AC7707127EC41F8BD -:1062A000000006644320F8C79A00A94805007A0058 -:1062B00030980E80C011322260154A001B8BAB4013 -:1062C00000000000200004304001D0910022224054 -:1062D00040F000401D020C00000F43260000013C6E -:1062E000160000710020E3FC35DC490CB034844812 -:1062F000000060400800228024A10003404483265F -:106300005C3A483EB74004C0800000000000000036 -:1063100000000010020020020040040000080000FD -:106320004A10005410A083266A4601539270FBFD68 -:1063300000C98004000004000000000FC40064D401 -:106340000200000200000220000001000102080219 -:106350000000256904260094204810448104088028 -:106360004081020424482240820441121081080422 -:106370001102112008444481044882242048104816 -:1063800021048901041010200841044848102021EC -:10639000101121204482244120400224112049026E -:1063A00000912008421022424222044820400481E9 -:1063B0000448924488244822448224402040108487 -:1063C000090200842010849089084200210244843C -:1063D000244822448224408844645E044C0CADF37B -:1063E0008238E165043B0ECE11A04082872246CD63 -:1063F00042004288213B035040B0F184CC984C00CD -:106400008F4292800100055C05498C0001044045E3 -:10641000142324C5281002B0FFC03FFFC000F000C5 -:106420000052A005500000000000700000000000B5 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E20000000000000000000000000000000000072 +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F20000000000000000000000000000000000071 +:105F30000000000000000000000000000000000061 +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000000000000000A1 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000000000000000000000D0 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000000000000000000000CD +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:10642000000000000000000000000000000000006C :10643000000000000000000000000000000000005C :10644000000000000000000000000000000000004C :10645000000000000000000000000000000000003C :10646000000000000000000000000000000000002C -:10647000000000000000000000020000000000001A -:106480000000000008000000000000000000000004 +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C :1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC -:1064C00000020000000000000000000008000000C2 +:1064C00000000000000000000000000000000000CC :1064D00000000000000000000000000000000000BC :1064E00000000000000000000000000000000000AC :1064F000000000000000000000000000000000009C @@ -231057,871 +231057,871 @@ :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B :1065900000000000000000000000000000000000FB -:1065A00000000000000006404A0100000002000157 -:1065B000698025C001688000000000000000000222 -:1065C0000000000000000000000000800C0100003E -:1065D00028000000FF000003E000040700A0060000 -:1065E000031A5C00811990C070E32180033400C35A -:1065F0000330C0C30000C00078016E01D8005BEF1B -:1066000034004DDDF3800CEEEF1C0044F7724F3C7C -:1066100021BC3E42007B700000000000010000032E -:10662000D0102F3D21EC8DFAF002BC00400000009C -:10663000020202042AAC156403DA50041C12840816 -:1066400000039A80802000940E68040080001001EE -:10665000001410008010E68422080001052002AA20 -:10666000C8AC84000A8C5000440400E9009084887F -:1066700080112000A4010800000000004140080033 -:106680000000021040000008200000000000000090 -:10669000100B4044001400687E1455409400880894 -:1066A000C00400000003520A00001000000A0000AD -:1066B000200C529515450940201280282512504281 -:1066C0008250250C504A09A081C860EA6098392B95 -:1066D0000748C52092C4821C1556C00CB0000003A8 -:1066E00064321040C08009904104020283102040AF -:1066F000002000080D000401820081AD150C018806 -:10670000514808D0002A6FC9F2600040AACA282860 -:10671000C038600230B6D52C5602B1D122400638BE -:106720002888C1A17021140144000001000000006C -:1067300000040108000C21A10400002080020202D4 -:106740003188042800004D00808804003E3AB48857 -:106750004280000C90000000080000B8A84A101207 -:106760000B828281B4442118001A4000000000000E -:10677000000000000002E318349C3E088240F20250 -:10678000006249202046A1723340021C1D300A09D4 -:10679000703858C8D0004848AD33A550561C084141 -:1067A0008104B020008500052B0010C37AE8004B5F -:1067B0003BA60D41225728B34B0B570600112EE87C -:1067C0002B501959C8CA12688424911698067C90D7 -:1067D00050081B8D0FDF84C2114494D28A36430ABD -:1067E0002D03CB3432F2009D88393130101D6B30CF -:1067F000124D6B42AFDC97601589CE2BB265C43069 -:10680000AA2472028952AAC0810931B382BEF3FC64 -:10681000003E03022A482D908008050837B4CAA517 -:10682000E1695449320FFE4ABE010104336D0D394E -:10683000831CA29A189E1A2B18037940A18C6923F5 -:10684000241186980396B4EDED07794FE3C1257CBA -:10685000E0030FFE08110040D0E0432FB684C19141 -:10686000BDEC355E262F0988E1C7B0BC1318C241C4 -:10687000F6A195C0CEF6310B03808073D07CD63163 -:10688000C18D15D15234660324900301811D4C360D -:10689000C908A60B3A607EA4898026AC0587D05E25 -:1068A000C4498A315F0F1250420CBB0E1E184A6257 -:1068B000204EDCFB8F3C49442871F4A04974000051 -:1068C00004110009100045203A0010C3FF802C0776 -:1068D000000000C8210044400006900108D12208B1 -:1068E00004D414158A164018540320100801061009 -:1068F00098903C0005AA480610821000000020086D -:106900009260002090800800039E0073DCC5130095 -:106910000008880083446A043E2A401922F9484F3F -:10692000C5122202C0A20330281F10CB81AE2088DE -:10693000A8A64404480000019E80A6F011B5806E10 -:1069400030A3A0395827CC022A30000000001DF3E4 -:106950000247B3FD2010472C958F0092410CB407DD -:1069600003080034001028020414144CF0728380D1 -:106970009ACC0E204101C0848C814D04010DA3D21C -:106980003E4009D2315242B40243C43A7E02EA8008 -:106990004DD0823482462858C524030318866018D7 -:1069A00046419861250C67FE129008A7D287280DF2 -:1069B0005E1000080101200096AA0E01C5511128A1 -:1069C00000344A15054D4420221082C01408020DDF -:1069D000C1508040433C3282E140447C80020891B7 -:1069E0000000102100905000424C80024000010045 -:1069F0000102408E8005803008006DC4D8206A4CAA -:106A00009000110004420002D40090081102544288 -:106A100012EC2E101CCC00058254CC681C21B686CA -:106A2000F792AE9C918725E6435C620DB0A4AA0064 -:106A30000106FF4326A83299021101581006008072 -:106A400000128C023AC2A900021D29080571925158 -:106A500080D0021D65401F802400201A11A1480E1D -:106A600093B81413AB3DE201AC222DECFA2C2BE0D1 -:106A7000035FB03144280234D00CA0017C2411C83B -:106A800006A88040A0832403A8015C46E88382C452 -:106A9000287C3E05C93E022088951A3C16C270F338 -:106AA0005AA49A9F2320455380C968C5402000CA34 -:106AB000CF328470535E0201400091003000001517 -:106AC00012000160000082802078490200B2A0001C -:106AD0000029400C5023BFBCA80F09100026120A41 -:106AE000A824D4288004EA015924729029264E3221 -:106AF000D288884EF5348500365100888DA1013941 -:106B00004BC182CF4835290001C904012408BCEBE0 -:106B10001EF7021541CDA408D024D206EDB0450CD5 -:106B2000DA550261416921692069200008C041618C -:106B30000000F40930114B80201C003DC03E194B71 -:106B40007FA29400378B000009A820B500273F27BB -:106B5000A1CE863024CC43C00051842F62231CAACE -:106B6000C5208E0C0253D4041E270765050790EB41 -:106B7000A4231116EC095001BE04219521424F387F -:106B800082A30C99F73A810093319F50A8120933E0 -:106B9000C9F50281242ABA23CE08CA906F90E20870 -:106BA000143C0D5432B508A54E00668C43E0A2B0EB -:106BB000454222208AD0904200000800080400418B -:106BC0002560018006000801402000110203AD4944 -:106BD0007D207A00307C0E92C011B22260154A20CE -:106BE0001B8BAB435C08D70231788C306201FC51BF -:106BF000A0162E42C0F00244001200FF0E0000005A -:106C00007C07F00068000001002000001410010063 -:106C100080848002A9269E0E141133A434A1058B12 -:106C20004004800000000028910000C0C000000067 -:106C3000004004E0000140500A00A00A0140140096 -:106C4000002800004A0000001800040000080A01A3 -:106C50002400000538000801F00000BFFA3E9FC183 -:106C600003F0000000FF00010FBD001E9C3DF02C52 -:106C70008BCF5E70A7EC35000421009420081040F3 -:106C800089244800408102042408204482044102EF -:106C90001089080411021120084040810448820430 -:106CA000200890482104810904101020084104485C -:106CB00048902021101121204082244022400224AB -:106CC00011204912001020084211204042020408FD -:106CD00022440089040810408004082040820401F6 -:106CE0002240108401020084201084108108420098 -:106CF0002110448404082040822400884442CD208E -:106D00003B8A50E3502C0C0C00018060C3A000486B -:106D100082080A0E238011C0E28E3908C156E3A012 -:106D2000245260001A001000010004A0000DCC00E5 -:106D300011140051450C340264400040F0203FFF24 -:106D4000C000F000005AB007800000000000900072 +:1065A00000000000000000000000000000000000EB +:1065B00000000000000000000000000000000000DB +:1065C00000000000000000000000000000000000CB +:1065D00000000000000000000000000000000000BB +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A00000000000000000000000000000000000EA +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000000069 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000076 +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000000D5 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000000000000000000000000095 +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 :106D60000000000000000000000000000000000023 :106D70000000000000000000000000000000000013 :106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000030000F0 -:106DA00000000000000000000800000000000000DB +:106D900000000000000000000000000000000000F3 +:106DA00000000000000000000000000000000000E3 :106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 :106DD00000000000000000000000000000000000B3 -:106DE00000000000000300000000000000000000A0 -:106DF000080000000000000000000000000000008B +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 :106E00000000000000000000000000000000000082 :106E10000000000000000000000000000000000072 :106E20000000000000000000000000000000000062 -:106E3000000000000000000000003FCF8FFFF3FCC7 -:106E4000FCFFFF2AABCAAAA2AAA8AAAA3FFFCFFFAB -:106E5000F3FFFCFFFF3FFFCFFFF3FFFCFFFF3FFF10 -:106E6000CFFFF3FFFCFFFF3FFFCFFFF3FFFCFFFF70 -:106E70003FFFCFFFF3FFFCFFFF3FFFCFFFF3FFFC20 -:106E8000FFFF37FFCFFFF3FFFCFFFF3FFFCFFFF315 -:106E9000FFFCFFFF3FFFCFFFF3FFFCFFFF3FFFCFF4 -:106EA000FFF3FFFCFFFF3FFFCFFFF3FFFCFFFF3FC0 -:106EB000FFCFFFF3FFFCFFFF3FFFCFFFF3FFFCFF20 -:106EC000FF3FFFCFFFF3FFFCFFFF1102CF54D223A0 -:106ED00044086423F8CC42B067FC096700F300580B -:106EE000C000247C8028670CC3B0828450D012027A -:106EF0004098018EF8EA413D00C416301FA81FF8E3 -:106F000003FFCC40908800904C066A810A10D54857 -:106F1000440B102A808AA02A9002A40001020122B8 -:106F20000100001008808022004800011022400269 -:106F300000812224024A052146408040842011001D -:106F40004401304249C02808004482928007A4408E -:106F5000400000840E01093C4100080201758008D0 -:106F60004032033014480F006040899020388181FE -:106F7000014A408508384180A0720394181014A477 -:106F800007B0801004004103A04023008000001ED1 -:106F90000005001002200018E8210A8421000C20BE -:106FA0002220109240210021000841308004080076 -:106FB00000808008071E009121BC04000100020A25 -:106FC00000414060B680050A8043E24804921112F5 -:106FD000490E202000244A10119441C060638C386F -:106FE000C70671838C70C718718E08E30120427E3A -:106FF00040000620008084000004E2022080409AC5 -:10700000E0128411BD1A118468431CE481412002FE -:107010000A4B01800025883007022C92C2588BFA57 -:107020001F1640C0330000800000024044C00090A2 -:10703000000020000110310000009C08F0078000D3 -:107040001008408600180010010B0C20611061032D -:107050000000018001000938001A22000000000031 -:1070600028CA0000010000000000030182120C0089 -:1070700050000180202020000002000001080124AF -:107080000001640482404000409003860034C00048 -:10709000000000000000000000038608010200005C -:1070A0004003000004040002108000000000000003 -:1070B0000000000010080000000000002000800018 -:1070C0000000003200000008000000000000000086 -:1070D00000000000080000000001000000000100A6 -:1070E000000002000000008040008000000000104E -:1070F00000000400F93080000000040000200000BF -:107100000600200000004000401000004000000089 -:1071100000000800000008000000200120400C448E -:10712000401000834000000C00010000000002003D -:107130000440000000000020100200006F0000006A -:10714000008000082008000000000000000000048B -:107150000000000000020000000200000208080019 -:10716000080000000000000000800420200008014A -:1071700000200800000000010200000000000000E4 -:1071800000020000040000010001040400410002AC -:10719000000006000000000000100CF800000000D5 -:1071A0000000010000000200000034040C000A028C -:1071B00001000400000000060201186C1D0000011F -:1071C000002C40B184090620F040424000182058AD -:1071D00000B00000210870961801090200C30000E9 -:1071E00003C002068C3300000800000808020F01EB -:1071F000028014020000802002020CC00203800002 -:107200001002008800C8087000B0200080921900A9 -:1072100041000020006000000000010000000000AC -:107220000308000400100000000000000600000138 -:10723000A0000004058002210020010400100000CD +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E :10724000000000000000000000000000000000003E -:107250000000000008000000000000002000000006 -:1072600000000600000008400000000004000210BA -:1072700000001100000000000020080001000100D3 -:1072800000000000044300C11000000020020800BC -:1072900000000000000000000008000000000100E5 -:1072A0000000000000000000000800001003004083 -:1072B0000000004624004D00000000020C0C40E8D5 -:1072C000A0234C32E1C872324F3C080007800820EE -:1072D0000097E03F400001080000600410880005AE -:1072E00081D011682090900008400000000000A3A9 -:1072F0003C000E0020CA0088003226889020003012 -:1073000020000000000070000008100000000000D5 -:107310000300000000000180800020040000010440 -:10732000000062103000044000000001FC0030004A -:10733000044BF00104B46070006841281110000093 -:1073400020070C4C000236040800200001F0100059 -:1073500000800600004026004C00162405294871D4 -:10736000200500108410284102906000920F398897 -:1073700000014033601F02140DC100801C08428EC2 -:1073800010E3C01800493024AE005085400000389A -:107390002498104005006040204049098000800189 -:1073A000100C01100104008080060800800090008D -:1073B0001802821040400200820C000000143001CC -:1073C0000B8120501610882609010912000B0004B9 -:1073D00043081F480022000071C006000010200072 -:1073E000000000000000000000000680000800000F -:1073F00000000000000B400000000000A800080092 -:1074000040000000E8024400120626C0047C401040 -:10741000010000E08306BC16A20203881CB3C10071 -:1074200038000300C0010000001D080008880002A9 -:10743000601C022E0000003DC0474C940600200452 -:1074400008008F0014BD074843D303D300D30000C6 -:107450000448021000188000003008000168001085 -:107460000021C00600512930001800210000030847 -:10747000EC000700E903A40000002800000440001D -:1074800011C10800C401A00C488000C40080000C99 -:107490000C004000880000000003F0100800003FCE -:1074A00018D0000221800000100980000000013087 -:1074B000980000000013018000601218000A3800D4 -:1074C000024CB0003D1047C16000000C0200138068 -:1074D0004012460015C80260405180400087881164 -:1074E0000CCC40C184400082000008004030E054D1 -:1074F0008108D4007800C03860E418098008E17081 -:1075000000039C0000080683DC04F70021528A88EF -:107510003247C440A0144D0803800E0CEB743D00AC -:10752000C1FAF0FF80FFFF0201C17D8232CC7E03F1 -:10753000008FC47A21BA3CB7FB0121C1F0F060E0B2 -:1075400000000D1ECF0C00C00081822000094612F1 -:10755000A408092000890C449103E4F21E21E40EE2 -:1075600043C03C8420791DBBCF38F3E3B418FF112E -:10757000514FFE20610C0403065C861600B2B44035 -:1075800005014000FC032E480B00195AC04293E14C -:10759000400891048A025011B4947E1004250C8492 -:1075A00020C9904C9924C9824C91326464C8264CFD -:1075B0008264C1321099080493021320C84C4C997C -:1075C00004C9826420C990C9210C9909249093248C -:1075D000084904C849932021301321264C8264C3F2 -:1075E000264C3264132649326193240842132646FE -:1075F000426264C8264C0C9904C9924C9864C9260E -:107600004C8264C3264C908419324084209084902C -:107610009908424321324C8464C9264C8264C08854 -:107620004C397A2A61CA90A29A54D4170204812D47 -:1076300053B02002C410518A76C00004F2AA164A40 -:107640004134F3C018F62505A2021210000047F4D9 -:107650001017CC005100102015007F4BBBA040CC70 -:107660000F203FFC0000F00000FFF00000000000D1 -:1076700000001000000000000000000000000000FA +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000000000000000BB +:1075D00000000000000000000000000000000000AB +:1075E000000000000000000000000000000000009B +:1075F000000000000000000000000000000000008B +:10760000000000000000000000000000000000007A +:10761000000000000000000000000000000000006A +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A +:10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA :1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA -:1076C0000002000000000000000000400800000070 +:1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A :1076F000000000000000000000000000000000008A -:107700000000000000000000000200000000000077 -:107710000000004008000000000000000000000021 +:107700000000000000000000000000000000000079 +:107710000000000000000000000000000000000069 :107720000000000000000000000000000000000059 :107730000000000000000000000000000000000049 :107740000000000000000000000000000000000039 -:107750000000000000000000000000000000002801 -:1077600000000002800000266409999266649999DD +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 :107770000000000000000000000000000000000009 :1077800000000000000000000000000000000000F9 :1077900000000000000000000000000000000000E9 -:1077A00000000000000010000000000000000000C9 +:1077A00000000000000000000000000000000000D9 :1077B00000000000000000000000000000000000C9 :1077C00000000000000000000000000000000000B9 :1077D00000000000000000000000000000000000A9 -:1077E0000000000000000000000000000000007722 -:1077F000C800007F00002401208800800C20DBC02E -:1078000026064000619910016601C0000043CE1CAD -:1078100000043ECFCFF1900184000010AA000001C7 -:107820004000200500000CDF80601C00000000000C -:1078300000000000000000000000000000A4001490 -:1078400080048001202880040014070032014038A1 -:1078500001000A0A1C00011011BC3E00008F73FFDA -:10786000AC7C0F3E3E0F19F1280C11843002081930 -:1078700000000C004020000A300176608C3621B2F6 -:10788000C18212D0F8320A02E10F082156842190F9 -:107890003C27051A1218000107010709C133E26CE1 -:1078A00001333DFC8421F0C364365034230000C111 -:1078B00000008D223F7802230040504288039C0044 -:1078C0000002F000184321800F65D06480D9761241 -:1078D00041CF9F3139F00EF00048470080101CCC9A -:1078E0000C041C4314234020A6BB12F7486503E494 -:1078F0002C6DFE2DB6C9FFD018A8290002B24C3F4E -:10790000B3D87887B03D0F487B03B0F40F61189E61 -:10791000C00401E8041848280400D40000848388C7 -:1079200006180168800004112417388450010C8067 -:10793000813525370E20021848F08B324400118023 -:10794000A3800681140500A5108C4448080B11047F -:10795000C2B1E2800810111140C421D4C40010004B -:1079600040C20601880060F50000003A0080002057 -:10797000D022000410D001206130010084C82226EA -:10798000383A63000042D822971044E7215300029E -:10799000002A44419004020204038410C0100E48DF -:1079A000C3180020403780200200057020000141EC -:1079B00000000000000000000000000000020008BD -:1079C0000000264C004500A000A1651024021320F1 -:1079D000A9000D4415538E291009000404124D0806 -:1079E0002CA090000028000700138047840B080B90 -:1079F0005808AA8281D0C1E90AAAC105200120A99C -:107A00000029010A706122A8207102A042A201206F -:107A1000100A95165140040000001B2800C04D00BC -:107A20000000084010308A8081C04A940010124043 -:107A3000050CA0A284040B2285400B203290432029 -:107A40000080040080A08010010940092880078C74 -:107A500045092654800042400021A7242001E62148 -:107A60001084404000B2800021AD10D56038E002A3 -:107A70003F22432C492001448A9011867002400A1B -:107A8000D60C08822068E00A0285C6F840800420EF -:107A90002010080100000080842204B98C9050421C -:107AA000C0002438084021230440ADC012E10E6E0E -:107AB000605544010A018000A010300C9814390A66 -:107AC000CC1B900004209A004AC828D080002D4882 -:107AD000000906A453830440002018C00612A00029 -:107AE0000B6103000002D04868BD0A01460C2F401C -:107AF000C02000040009C00140BC08000320BD00F4 -:107B00000010C00001110066000003000060322D6B -:107B10002DCE60001C5010420618C0B0C02DEC23C2 -:107B20000B0262443BD00110030000080000024930 -:107B300094454007048108A26340912B304782118D -:107B400092510490F920C38A30220300A50E15013A -:107B5000800142968028060C0A8570408504CC8BF3 -:107B6000054D0000411100620A00450901810040F5 -:107B700050A412A007005090080246020080C29153 -:107B8000C01418A005E9C0001017A4318321518545 -:107B9000426106245E3B1126C42101299046221031 -:107BA0002A02A233648030640C25040822C60460D3 -:107BB000B419D80CA1F0110C031024144801203181 -:107BC0000010C10842018300080C24420204014055 -:107BD000832368240004040006200A10C10008D68C -:107BE000000000020002C21050040020040C00102B -:107BF00002000B680081640C6005100800000000A2 -:107C0000108810018110110A0819BA0091476140CB -:107C10008B08020207900A0E6045941F54000280F0 -:107C2000000044202C140620C1394005C000112852 -:107C30003C892A901008C8A0240102008161A03468 -:107C4000452B11042141628010CE264E096002426C -:107C5000C434110064401140008010042059416672 -:107C600082100400F20000008CC110040088100093 -:107C7000010900CC084600008C0111202B2C10C8F3 -:107C80000109080180909008420D020F8A201034EB -:107C9000C08820830A8100014011D6160109C680E0 -:107CA0004014082810800101800A0027A8004381A1 -:107CB0000003802023E000440DA80243DCC5F4103B -:107CC000040082921200A9440280099B12383008F5 -:107CD000C313F282AA005A70C2000144C8002228CD -:107CE000C0160D3AC20833B2510088CE0100031A03 -:107CF000000C0C04CD2220CAD822BAE45133110062 -:107D0000C00D030A0057653B8847CEC0502C008841 -:107D1000190F042A2367701EF90841C089A0B0B06A -:107D20002BFD2A2900E401F08804440290C420803D -:107D30000024401001000080800088000004514AA7 -:107D40001081415020542F20020000C04410420EE8 -:107D5000020061D002081C280000001100C40000CD -:107D60000001200408000100101102C041000100C0 -:107D700010001000084962801FF8939E2180866ED3 -:107D800040C00450261FCB005F800BBC41240CF583 -:107D900004000022FC01042081420600204CF1C0B6 -:107DA0002000C0E513D00042B80002825801A8802C -:107DB00008013C10000420208026100064012F429E -:107DC00041405012080204014002F80090080000EF -:107DD0000010090080000001009000000000020176 -:107DE00000000000020001A000000400504000005C -:107DF000001B020F70000810000010D4024340E97D -:107E000000E5863FFD80FF03DE8CAAFF3E08805818 -:107E100053F1C04C1D180C08180014241D2D001817 -:107E20000010800240940000018200000100004028 -:107E300001000040A00400028000008198205190C1 -:107E400000C000AA040021A85407F001530000203C -:107E5000000000800000000000000078000000002A -:107E60000000183050010CC00A004047C8008601CD -:107E70002400030000000009100043E00109004B4A -:107E800008309609612212C0212504080A00100456 -:107E900018004033200800602000AEA011F80479DB -:107EA00050E2E025501415440250FC1C3CAA3170ED -:107EB00085281014148448020443210081C0101046 -:107EC00004220C8420C9904C9924C9824C913264BC -:107ED00064C8264C8264C1321099080493021320AE -:107EE000C84C4C9904C9826420C990C9210C9909D5 -:107EF00024909324084904C8499320213013212653 -:107F00004C8264C3264C32641326493261932408A0 -:107F100042132646426264C8264C0C9904C9924C0E -:107F20009864C9264C8264C3264C908419324084DC -:107F3000209084909908424321324C8464C9264C95 -:107F40008264C0884C89961126C595118024E599D4 -:107F5000020681AE4290204A4B105C013480AE0094 -:107F6000D3A50510808CC1C914B93905284080807B -:107F70000244480810154C00400010A0003D2A8F14 -:107F80001E7002E8FFC03FFFC000F0000018B00004 -:107F900000000000000040000000000000000000A1 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 +:107910000000000000000000000000000000000067 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 +:107950000000000000000000000000000000000027 +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000000C7 +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000000000000000000A7 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000000000000000000B3 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000000000000042 +:107E40000000000000000000000000000000000032 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000000000000000000000B2 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 :107FA00000000000000000000000000000000000D1 :107FB00000000000000000000000000000000000C1 :107FC00000000000000000000000000000000000B1 :107FD00000000000000000000000000000000000A1 -:107FE000000000000002000000000000000000008F -:107FF0000800000000000000000000000000000079 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 :108000000000000000000000000000000000000070 :108010000000000000000000000000000000000060 -:10802000000000000000000000000000000200004E -:108030000000000000000000080000000000000038 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 :108040000000000000000000000000000000000030 :108050000000000000000000000000000000000020 :108060000000000000000000000000000000000010 :108070000000000000000000000000000000000000 -:108080000000046D41555046C411112EEC4BBBB29B -:10809000EEECBBBB044441111044441111044441B3 -:1080A00011104444111104444111104444111104AD -:1080B000444111104444111104444111104444112D -:1080C0001104444111104444111115444115104448 -:1080D000441111044441111044441111044441114C -:1080E000104444111104444111104444111104443A -:1080F0004111104444111104444111104444111120 -:1081000004444111104444111104444111104444E9 -:10811000111106BD4E0100FC98B5BF0DFF09AD4120 -:10812000E9F8768E3FFD4B93F3FFF8F9FF038E4994 -:10813000EFF35D3887052D5D8F62B13FEC7FAE3F79 -:10814000FF0AE4F3F8FCA7FF1CB8C7BF63737C27E2 -:10815000B138974E74E12E9099F427DD0F7743DD07 -:1081600024BD4937FC4CFE817C6CFFEF36370FDDB8 -:10817000F3A37CFEEF1D1BCDFF724F7C7FB43A7FD3 -:1081800088DF73BF78FFEE3FBACEDBB3F6ECFBBD02 -:1081900035EFCDEFB002FC404800088B73F2F6C417 -:1081A0009E7E33F5CBDA33F3BC9EDC07E987DE73C2 -:1081B0009F9C34F61F7F4E7E72959831B733AE0F79 -:1081C0005F91F7E8E7E729598FAB71E7E87EB63CA6 -:1081D000178FCCF33AFCDFE03FFE4EE750CEF4635E -:1081E000A30EF549CE73F1CCDD5F276D8FDEF1CEA6 -:1081F000ACF7BE0757CBB7737B747FF338EF4F4CA8 -:10820000C25FF8EDFE2EBCC4DEB29D986F7D3AF5DC -:108210004FBDC1B5FC6DEE2DB6CFDFD2BFF873C533 -:108220002F678EFF93DCF8CFB93B9F4CFB93B9F4DB -:108230009F7335BECFFF91CF9C7FFD1AFFCF7BB2DE -:10824000B6F80DFC0F3EC768E16030FE4025EE81B8 -:1082500095F07128F6BE3DFDC5F452BFECDA331738 -:10826000E9CDDF613DA0F56D27E9C7AF83BEDCEF47 -:10827000FF1FDFCDEFF3F7F87EFD37BFC6EDF3FD4F -:10828000FCFF7E377EC3F7F3A774F7FF3EDDCBFF1D -:10829000B2B7AC7BD637AC4FBFF3DE5CFA763B7D32 -:1082A00045EF61DF746DF735FDCFFDE2BFB4FBEE46 -:1082B0003FDFC7BFD37FFC7F952EDBC7AD73CEF406 -:1082C000DBFC3EDFC6B5F36E54B7EE2DD6CD2D7177 -:1082D000ABB8B5590039C000000000000000000034 -:1082E0000003F7B876BC3EDD86FCF3ED7CEFDF36AD -:1082F000FFCEF7F37FF8DEBD3BFF4FF761B6FCDB47 -:10830000FF3DDAC6DBF36FFC6EDE1B9D4B6FF2DFC9 -:10831000ACBBDD3BDF4DADE2F7ECBBD7377FCFFE2B -:10832000E1B6DC7FFF17B6CFEEF2EDDCDFFF1B55C9 -:108330008DFF73FF6CED7B2DFF86DB52F27C377D6A -:108340001FFFCBEBB1CED4FFEF36D7CF7FF1B7FC19 -:10835000156D3DB50AFBF3FF74EEB63F768AB6F1B4 -:10836000EED4FFEB2E9B4FDDD3EEBC57DD1BF6CFDB -:108370007BB375BCDB5B2D7B8DDDD3FDA8FFFF1BC5 -:108380006B47F6F3F1B4FAF72B6FCFF2D1F7ACF7F6 -:10839000EB3FFDCF7FF3DFD8D76D3FEDC7FDE3EFB8 -:1083A000FC6DBF17FDC6B6B3F77CFF772D7BCDFF05 -:1083B000B36B58DADA36B686B771BBACFD6F1FFE09 -:1083C0004DBB72DFD8FDDB3FF78FFBD35B587FF7E8 -:1083D0003FF6CB7B53B6DC6FDB3ABF47AD61BEBC2B -:1083E000BD6D3F1ECEBF71DDACEEFA2EF6CB5BB39A -:1083F000ADAC6BFA3FDBC5FD52FF6CB6DD2BFBCF9E -:10840000EDF2BEFCCAFF2EAC859FF37BECFFB837C4 -:108410003FCFFFF1EF7C6B3F167BCFF773FDBCFFC7 -:108420007F3FFFCCF7F3FFF8EDFB2CEF0FFFE3B638 -:10843000A0FD763EFDCD71F3FFFCB7FF2EBBCFCD87 -:10844000D2FFFCF75F3FEECBBFD1B734EFF535BDC0 -:10845000CD7EC1FDDC4D7F172C8F56D3DBB4BEF72C -:1084600035AF47DEF1B77CD5EE25F78ABB6357B44D -:10847000EFDE2DFBC95B73DE48DBBF3ADF4DF760F3 -:10848000AB4CEEBB3B6B4AADF2FBACDFF51EF68EA0 -:10849000EDF377B86EDF3BDBCFEF63DEF4B6EE1DB6 -:1084A0006D4EF6F3D75CEABE3BFF8B7D72B7B42D01 -:1084B000FB3FADCB6AF1BD68DF7B2AADCDBDE2BF2E -:1084C000DCD76536EE8DB663DEFC7B7D1AEEC76BBE -:1084D000B3F76C769E1DF3CEDBF17ADCD76F3DF7F8 -:1084E0008EDFA3BD74DFBE3B758B576156ECBB7747 -:1084F0001AD34B6BC3AEFCEDD53DB5C8CEA1DE742F -:10850000BAEF2BEFCF5EE326088EB22956C5B8E14D -:10851000B54477FF3BD6C7DFF37F5CC7BE2EAE45C1 -:108520006DF1FFF86B552FFAC6EDE2F7DC3B671DE6 -:10853000F78FF7F1BFD8D7F73BF78DFED1BFFC37E8 -:10854000FF376D4DBAF2EEF4FDB737778B7DB1BBD7 -:10855000F4736F3BBDCBFFD1B7BCFDBF2DDD87FBF7 -:1085600073EAFCDFB73F568B6DD1B5A4DBD72EFB8A -:108570004BB5D2BA70EDDB176EC6CBB273ECF6BE5C -:108580001DD786D5A26FDC6BDF1BFF8FFEF3EADC05 -:10859000B3BF376ECFFBB1FDB8DF6F3FFECDFFB28B -:1085A000FF7CABF92E72C3DA71BFB4BDEF3D7ECF55 -:1085B000BFF3F5FC3F733FFECF7EF37EF8EFDC2E7A -:1085C000BEC7FF72FF7C995F3BFDCF7FD39BF87BDB -:1085D0005F3DA74EFDF3DFDCF7FF3FBB4FFFB2DF90 -:1085E000FCDFFE3FEF4F57F3FBDCF6BB37FF4FBF1F -:1085F000F37FFCF7D737EDC7FF73FEECDFFF3FFDDE -:10860000CEFFF2EBB4EEFD3FF7C66FF3EFFCDDFDFE -:1086100033B64F6EE377BCBABE1DE3C7EFD1F7DCCC -:10862000ABEF3F7BCDEB63B7BCEEED3FBBCFEFE2F3 -:10863000FBFCFF7F1F97CDFDF3F7F4FFFD37BFCEA7 -:10864000DBE3BFBCD7FF36FFCFFBE1F574ECEB37C4 -:108650007F88F793D9A8AF6E36EEC7F753FD506FFA -:108660007D3CDD43FF715EDCDFB73C7BC7EFB1DFF4 -:108670005CB7FF1FB74EEBF0F6ECBCDF3EF78B5E4E -:10868000F3AF9CB9D82EF74AF5B22CACA5CE1AB6EA -:108690008DE7B1E7B4E7B71559CADFE1BFFC7FBF8B -:1086A0003F7BC7DED3F6DCEFEF3FFF87FF916BFC2C -:1086B0006DFD1FFDC757B072FCF77F2FF2CFCBB116 -:1086C0006EECFFD536F9CFFFF3F6B4F7EF3DCF8E62 -:1086D000F531AFFCFD5B3DBF4F7F22EFD06FBB3666 -:1086E000FD4FFF62DB7CDFFF3EE74DD573EEF8DD2B -:1086F000FB3DDB4DBBB1DFB8DDB71BBBCDFBB1DB59 -:1087000074FBBF3AEF8D5EF2EF7CC75A3E7DCFEF30 -:10871000F2B7F8BF7E3BDFCF7BF0DFBC6F623FBDBF -:108720008BFEE19754FFB73FF3CFFFF25A9C7E7D5B -:108730003F7DC6FDB3CDFCEEBD1F3E8BBFB1FDFC42 -:10874000FF7F3FB3CAB3F266E86F392DB7CF562328 -:108750007EECDFBB3DFDCC31739BECD5FF371E4378 -:10876000BDD373B47DD90FFF0F8F632FFCFFF13D95 -:108770007EC787F0C710E3FD35DC4D0EB3F8845A91 -:10878000BF2EFE4E1D11B7B4FBAB37EFC076D36FD3 -:10879000DC3EDF376EC69FB149B4F44F1F6247FA23 -:1087A00023DD787F6F36FECFEDF2DFD8FBBF26CC1E -:1087B000C073D074C8E3D72EEE4E2BD2B670FFFF35 -:1087C0003FE9CCEFF3D7DCFFFF3FDFCFC7F3F4FC8B -:1087D00077FF2BEF8FFFF23FDCBDFF2FFECDF7724F -:1087E000EFEC7CFB0420008420081040810408008A -:1087F0004081020404082040820401021081080420 -:1088000010021020084040810408020420081008CB -:108810002100810104101020084104084810202183 -:108820000010212040820400204002041020410258 -:10883000001020084210204042020408204000811D -:108840000408104080040820408204002040108466 -:10885000010200842010841081084200210040841D -:10886000040820408204008840000000000000004E +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000005F +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000000000000000000CD +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:10862000000000000000000000000000000000004A +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000000000001A +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C00000000000000000000000000000000000AA +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 :1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000000010D8 -:108890000000000000000000000200000000002AAC -:1088A00000080808A8204088000000000000000020 -:1088B00000CE1017FC0000E00000400000000000A7 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 :1088C00000000000000000000000000000000000A8 :1088D0000000000000000000000000000000000098 -:1088E0000000000003FF00FFFF3FFFCFFFF3FFFC8E -:1088F000FFFF3FFFCFFFF3FFFCFFFF3FFFCFFFF383 -:10890000FFFCFFFF3FFFCFFFF00AFC00000010005C -:10891000000000001820000000000000000000001F +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 :108920000000000000000000000000000000000047 -:10893000000000000000000000003FFFCFFFF3FF39 -:10894000FCFFFF3FFFCFFFF3FFFCFFFF3FFFCFFF29 -:10895000F00AFC00000010000000000018200000D9 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 :108960000000000000000000000000000000000007 :1089700000000000000000000000000000000000F7 :1089800000000000000000000000000000000000E7 :1089900000000000000000000000000000000000D7 -:1089A0000000000000000008000000008000002619 -:1089B0006409999266649999000000000000000023 +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000000B7 :1089C00000000000000000000000000000000000A7 :1089D0000000000000000000000000000000000097 -:1089E0000000000000000000000000000000100077 +:1089E0000000000000000000000000000000000087 :1089F0000000000000000000000000000000000077 :108A00000000000000000000000000000000000066 :108A10000000000000000000000000000000000056 :108A20000000000000000000000000000000000046 -:108A3000000000000000007E00000305E8DEBB1619 -:108A4000068AD5A2EC008316150E0C15E154F0E24F -:108A50005504168AF7406140880630EE0001D04385 -:108A600084101012000F7570007C60002E000A0048 -:108A7000701DB4453A019F4881033EA01208041DB1 -:108A80004007501D4411510284848091A4848004C5 -:108A900002420200002420100001210F08009180F2 -:108AA0008841008ACC08800C101C7039C300EDF09E -:108AB0003E0081461A13013100001080400000057D -:108AC000880289106EB835C50C0051CD3C2C4A295E -:108AD0001DC7E0914E68B9621E80C053A35FC854A1 -:108AE0009F04F484DAC3D81C2F692180081072EB2C -:108AF00088B8A2311B8712A0457844B33E728738EC -:108B0000A11764210337598EF7B35EB4EA161A7FB2 -:108B1000CE6AD293549AB529ABC2C5928C585B5D8C -:108B20000130088841E0088D6A3359480810AAC806 -:108B3000A9461D1E8B32125E846DC02DB6C027D390 -:108B4000D6945ADA3DD5CB0F10560860AC04C14616 -:108B50000AC0AC14C1582602807D62B1ECBC9525D8 -:108B600079CEA7D14B44935111468A1002B8C06503 -:108B70002416B3424EF2A8B083E8176E468BA15973 -:108B800064695018A587E2708E94788018F4822C5E -:108B900090532CA7EF04D2C0A7C0113C16AC1BCE3B -:108BA000883E4032F8BFE33E8680353242989BEDE6 -:108BB0000D00C1E782AC00811529E08404E1EF8853 -:108BC0009C0A01800278220898389912E0812612C6 -:108BD0004A58113328D8801C015564144213600987 -:108BE000161077702B6F0827029001201420203474 -:108BF000160D49612B80C051000A000000000000E2 -:108C00000000000000001050B94825268B0A025AC7 -:108C1000A4148A2A54C5E98216F4461A015C01504C -:108C2000B2587CA9F60850016151A37011212C881B -:108C30004491B32AD0C35E031B8EE2D17A340883F9 -:108C4000182B0EEA125B0C16FF025B0B8232160821 -:108C50000FBA28D2C85DF2DEB46C2030AB832D2071 -:108C600004BC499E0E7BCE8181D518BFC01A214E0F -:108C70003EF2C16C44B01E9108715157346E5817C2 -:108C8000360E5850B094AFD524AD02CDD2F6108B2D -:108C9000CC257B461581321015AD370944D6D27EDE -:108CA00054FE943D1C4B2653C0907EF525854FF90C -:108CB000618A04F0AD22BCC7794117E422AA1E42A2 -:108CC000C16FE26998961F016F8A5841DE345FA137 -:108CD0000C39445791A56C6969225A4B8B7239241F -:108CE00016B11A068355C129207F6507E3CF5DC001 -:108CF0002D6812352CFB4E3E026B48AB681CA80455 -:108D000035822A9C25B53E0EC697325DA454632E4B -:108D1000B4CD83C32EEC8EE62328877241D5908B89 -:108D20006A35E500F743A10003D424550AA1218444 -:108D3000345514128AC5D550E724B5422A800EDA7C -:108D4000E354C451252B55446320BDF45220153102 -:108D500042CC71CA20289A3C14CAC0910254DA034A -:108D600030C509B12199C418AC24150C0631D0C8FE -:108D7000200206CF88CF507790960A044100082041 -:108D80002020835A3A1703C2B28930148206B28473 -:108D90000C0152D076CA34A9026521850404251D30 -:108DA000614459110414C948051803514034040D95 -:108DB000F01E024426E0FA002448160D0D5022044D -:108DC0004CCB09209284BA312650492A3DD6CD9108 -:108DD00020128804A23401050C01911C4B2A044E78 -:108DE0004ECCD218C8A40004CD829191C8D0814D38 -:108DF0002D02C18C8284045421018C880951B94808 -:108E000005000E714E9E2321448AD11D948C44206E -:108E10000208197B2EE1422D820934D5D5355DC576 -:108E20007062E6B882740523426363AA2014EA1ACA -:108E300094050143F938380D3C060F3EB19230E8F5 -:108E4000C5300E8849F2000055CC07F14B12F31CD7 -:108E50007440B12ED4470980DFEC4B8304F8CBF388 -:108E6000727A3CC6F91022C182F1715030CE13BB28 -:108E700004AA011030B59E34B2CDFF429B449B360C -:108E800008E4887CF28AEC4DD61459C430935628F5 -:108E90005550113885868034848E541A53011C2114 -:108EA00048008A492E9E0A1A01B7D88D012CF383F7 -:108EB0007233BB48D5570A374404C2965829A000DC -:108EC000950D2E827C1049F214A44504A24348D289 -:108ED0009400A54A44500A681C340630401D818B1A -:108EE0003C34151A58022BA2182C62840546844182 -:108EF000A0A0449C303E6881D22027A0D4213EDC33 -:108F0000CBD3B108BC113C2A138BEA6141E0119824 -:108F1000081F818FD318BC6A113BBC48AA20CD8C96 -:108F2000133C03F20203A14D10D8C63F904AA5F1AD -:108F3000993C35F204CA8C957308DC2ED20D010BD6 -:108F4000A2B2E148742419990E859349DCB1120844 -:108F5000A10932224B00F8F70D984092C21604FF87 -:108F6000C70CFA0E05D34B082CFE0CC48D1DE00572 -:108F70009C7326393F0540A0AAC4579739770A9AAF -:108F8000E0B54858862B464723421AC8C7D10A9DE8 -:108F90000994526D68C0E725C5C30CA11840016152 -:108FA00013108C030150A0DAE5353A854AD08100D0 -:108FB00096D110EC4828C028C028C22A808C0E0206 -:108FC00092C82DC518010C67629D480F020AE00186 -:108FD000A02011A4B44009630552509628F2400A1B -:108FE000418105820660D6AA2A180045C1339866D9 -:108FF000B23B054951002128B2492AD9092A828465 -:1090000010B6012A1A85992269A4E9592680828915 -:10901000212454C50000410098A050080413098A77 -:10902000050080413043DC0C0942B02160300A2C3D -:1090300000A280158113A4981B3CDD0AE4A14C0416 -:109040003004080940882288A84B1A2AABC2AA21FA -:1090500048E826550A544D76D2AD643ED422B281FA -:10906000EFD224548A5623444501128B3480421097 -:10907000510180412E70051C180A40040068100040 -:109080000A0028044E02984011C202000007A1887D -:10909000000000082B0803110820005028200201BE -:1090A000024100180430BC0C0C023544C5EC3230CF -:1090B0000C9D2370504EEA189148EE015104BC8477 -:1090C0000BE4021E43261C82B02B0540560160AC07 -:1090D00064C1376E0AB5D00C50C5C03FEC4001F1F9 -:1090E00028A8005400720D00037918108220800314 -:1090F0000100390080003C8D8005600280460E131F -:109100002046218012080155042408842089104833 -:109110009104890048912244448824488244812251 -:1091200010910804120212208848489104890244D0 -:109130002089108821089101041012240841048814 -:1091400049122021201221244882448224482244AA -:1091500012244122411224084212244442424488EB -:109160002448089104891048904489244882448204 -:109170002448108411224084201084109108424217 -:1091800021204884448924488244808848ECB204E1 -:1091900035CC10308050D90B0004010DA214001002 -:1091A000450340048D604C9884282540810051007F -:1091B00054903A088942021000444BDC1017CC004E -:1091C000000010DD402877CA47200190F0203FFFC3 -:1091D000C000F0000010A0000000000000007000BF +:108A30000000000000000000000000000000000036 +:108A40000000000000000000000000000000000026 +:108A50000000000000000000000000000000000016 +:108A60000000000000000000000000000000000006 +:108A700000000000000000000000000000000000F6 +:108A800000000000000000000000000000000000E6 +:108A900000000000000000000000000000000000D6 +:108AA00000000000000000000000000000000000C6 +:108AB00000000000000000000000000000000000B6 +:108AC00000000000000000000000000000000000A6 +:108AD0000000000000000000000000000000000096 +:108AE0000000000000000000000000000000000086 +:108AF0000000000000000000000000000000000076 +:108B00000000000000000000000000000000000065 +:108B10000000000000000000000000000000000055 +:108B20000000000000000000000000000000000045 +:108B30000000000000000000000000000000000035 +:108B40000000000000000000000000000000000025 +:108B50000000000000000000000000000000000015 +:108B60000000000000000000000000000000000005 +:108B700000000000000000000000000000000000F5 +:108B800000000000000000000000000000000000E5 +:108B900000000000000000000000000000000000D5 +:108BA00000000000000000000000000000000000C5 +:108BB00000000000000000000000000000000000B5 +:108BC00000000000000000000000000000000000A5 +:108BD0000000000000000000000000000000000095 +:108BE0000000000000000000000000000000000085 +:108BF0000000000000000000000000000000000075 +:108C00000000000000000000000000000000000064 +:108C10000000000000000000000000000000000054 +:108C20000000000000000000000000000000000044 +:108C30000000000000000000000000000000000034 +:108C40000000000000000000000000000000000024 +:108C50000000000000000000000000000000000014 +:108C60000000000000000000000000000000000004 +:108C700000000000000000000000000000000000F4 +:108C800000000000000000000000000000000000E4 +:108C900000000000000000000000000000000000D4 +:108CA00000000000000000000000000000000000C4 +:108CB00000000000000000000000000000000000B4 +:108CC00000000000000000000000000000000000A4 +:108CD0000000000000000000000000000000000094 +:108CE0000000000000000000000000000000000084 +:108CF0000000000000000000000000000000000074 +:108D00000000000000000000000000000000000063 +:108D10000000000000000000000000000000000053 +:108D20000000000000000000000000000000000043 +:108D30000000000000000000000000000000000033 +:108D40000000000000000000000000000000000023 +:108D50000000000000000000000000000000000013 +:108D60000000000000000000000000000000000003 +:108D700000000000000000000000000000000000F3 +:108D800000000000000000000000000000000000E3 +:108D900000000000000000000000000000000000D3 +:108DA00000000000000000000000000000000000C3 +:108DB00000000000000000000000000000000000B3 +:108DC00000000000000000000000000000000000A3 +:108DD0000000000000000000000000000000000093 +:108DE0000000000000000000000000000000000083 +:108DF0000000000000000000000000000000000073 +:108E00000000000000000000000000000000000062 +:108E10000000000000000000000000000000000052 +:108E20000000000000000000000000000000000042 +:108E30000000000000000000000000000000000032 +:108E40000000000000000000000000000000000022 +:108E50000000000000000000000000000000000012 +:108E60000000000000000000000000000000000002 +:108E700000000000000000000000000000000000F2 +:108E800000000000000000000000000000000000E2 +:108E900000000000000000000000000000000000D2 +:108EA00000000000000000000000000000000000C2 +:108EB00000000000000000000000000000000000B2 +:108EC00000000000000000000000000000000000A2 +:108ED0000000000000000000000000000000000092 +:108EE0000000000000000000000000000000000082 +:108EF0000000000000000000000000000000000072 +:108F00000000000000000000000000000000000061 +:108F10000000000000000000000000000000000051 +:108F20000000000000000000000000000000000041 +:108F30000000000000000000000000000000000031 +:108F40000000000000000000000000000000000021 +:108F50000000000000000000000000000000000011 +:108F60000000000000000000000000000000000001 +:108F700000000000000000000000000000000000F1 +:108F800000000000000000000000000000000000E1 +:108F900000000000000000000000000000000000D1 +:108FA00000000000000000000000000000000000C1 +:108FB00000000000000000000000000000000000B1 +:108FC00000000000000000000000000000000000A1 +:108FD0000000000000000000000000000000000091 +:108FE0000000000000000000000000000000000081 +:108FF0000000000000000000000000000000000071 +:109000000000000000000000000000000000000060 +:109010000000000000000000000000000000000050 +:109020000000000000000000000000000000000040 +:109030000000000000000000000000000000000030 +:109040000000000000000000000000000000000020 +:109050000000000000000000000000000000000010 +:109060000000000000000000000000000000000000 +:1090700000000000000000000000000000000000F0 +:1090800000000000000000000000000000000000E0 +:1090900000000000000000000000000000000000D0 +:1090A00000000000000000000000000000000000C0 +:1090B00000000000000000000000000000000000B0 +:1090C00000000000000000000000000000000000A0 +:1090D0000000000000000000000000000000000090 +:1090E0000000000000000000000000000000000080 +:1090F0000000000000000000000000000000000070 +:10910000000000000000000000000000000000005F +:10911000000000000000000000000000000000004F +:10912000000000000000000000000000000000003F +:10913000000000000000000000000000000000002F +:10914000000000000000000000000000000000001F +:10915000000000000000000000000000000000000F +:1091600000000000000000000000000000000000FF +:1091700000000000000000000000000000000000EF +:1091800000000000000000000000000000000000DF +:1091900000000000000000000000000000000000CF +:1091A00000000000000000000000000000000000BF +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F +:1091D000000000000000000000000000000000008F :1091E000000000000000000000000000000000007F :1091F000000000000000000000000000000000006F :10920000000000000000000000000000000000005E :10921000000000000000000000000000000000004E -:10922000000000000000000000000000000200003C -:1092300000000000000000400800000000000000E6 +:10922000000000000000000000000000000000003E +:10923000000000000000000000000000000000002E :10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E :1092600000000000000000000000000000000000FE -:1092700000000000000200000000000000000040AC -:1092800008000000000000000000000000000000D6 +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE :1092900000000000000000000000000000000000CE :1092A00000000000000000000000000000000000BE :1092B00000000000000000000000000000000000AE -:1092C0000000000000000000000000040011100079 -:1092D0004000000888022220888822220000000026 +:1092C000000000000000000000000000000000009E +:1092D000000000000000000000000000000000008E :1092E000000000000000000000000000000000007E :1092F000000000000000000000000000000000006E :10930000000000000000000000000000000000005D -:109310000000044000010000000000000000000008 +:10931000000000000000000000000000000000004D :10932000000000000000000000000000000000003D :10933000000000000000000000000000000000002D :10934000000000000000000000000000000000001D -:109350000000000000000000000001C284000020A6 -:109360004C020420948002A0A090C14000B04001B3 -:10937000400040AA00000008052000000000018015 -:1093800004030014400C0029FF000053F810A2470A -:109390000010800000281801000101800002030075 -:1093A00003000006000180060001800000010000AB -:1093B0009000000000004C0060000060030000000E -:1093C0003000040400982C200060000800200000F9 -:1093D0000100100040100C1000808870C000148242 -:1093E00040000004400001102080040042054006B7 -:1093F0001032000C000214C0003001900850000030 -:10940000C008000501261800A0208514000C00806B -:1094100002B0120800800002880019006480000B6E -:109420000404C01C901100182C210A8421000C2077 -:1094300002000C02402103184808402C2444080074 -:10944000000000080514000100A8000000104102FF -:1094500000405060B2810100880290CE0408940858 -:1094600020848880002C52901345099120D2182125 -:10947000A40A43421E41A43443480906812870646B -:1094800070D0052B80C084000004820010404094FE -:10949000500080112C1211C448431CB081410202BB -:1094A0000A4A60D00025883805020802825001C2AD -:1094B0001A04400052CC10100020224894800090E2 -:1094C00080321903049111C380008908A805400067 -:1094D0000000408600100010400A181001004042B1 -:1094E00000410184410001100018222400004000C6 -:1094F000200A028001A8048000000A0102920C00E8 -:109500007B10B5086AA2200801002400090801B0F8 -:10951000A849701E0B02C28056C4020400228000BB -:1095200000000000000000000001040001200041D4 -:10953000024000022444802210C4141000080000DD -:10954000040000081108001000000008240080003A -:10955000100012C18A2400E104244024204110217B -:109560008A00000808800001035120800A08410099 -:10957000000102202000020840000001C00080120B -:1095800000002480A25028A000004400000800022F -:10959000E400800000024800669600088000000099 -:1095A00000194900004549028108BC0935128E6F37 -:1095B000F0014023EA34048E8153AA400040188809 -:1095C00006FEA3ED0001FF002008C900600C0F1883 -:1095D0001490000520085009103FEA0081F00004B3 -:1095E000200000100000001000D2002800414B4075 -:1095F0000084000000000200009CA42525214949A8 -:1096000040E00D506000040004080001004000012B -:1096100082074B00A4F4000D00090080A04120DA6D -:10962000C00044005AC0034842920D09051180F25F -:1096300054101431010E07405310040508000202B3 -:109640008100000000000CC41201504811002200EB -:10965000000B502D4C6482106F4F59208434F0164B -:1096600008214A406166684CB73D64804AB2D480A4 -:1096700002B5280A0822002D10201108020000005F -:109680006D001806000080002302508002011000C7 -:1096900010000318428000200320400100421111F5 -:1096A0000C81029002A000000000090000050000EB -:1096B0002224000A80600000120020000AD4002347 -:1096C000D4C600201D488A60814006050C60401009 -:1096D00010004000000000000000400000000000FA -:1096E0000200000008000010000000004880045440 -:1096F0000000020200A014355800C44022100420CB -:1097000002003752026A11C0285066081102029006 -:109710000140B402136A827530302802800C04C202 -:10972000A002AB00088002004108400188006104EB -:109730005404A0B2680000803980019500430053B2 -:109740002A037B0481701C00080102100838802164 -:10975000300840308180608001280000010008202E -:109760000096600A401000080000400094AA0245DC -:1097700001901148200498140C480000000000805B -:109780002C0A0E0121CA00C800383682C1200818F0 -:10979000000108800000E000008010004204000387 -:1097A0004500000000024104800500200800294413 -:1097B00090204A480000194044420000A4010008DB -:1097C000194094400000482001084050111000004A -:1097D00000220808010226881134108440A5522076 -:1097E0000066850001C22441488030200C6B420293 -:1097F000212024252902C00100004800101E10A0CD -:1098000000014023001A0211498100801808290430 -:109810001049801000292411A40040054000203088 -:10982000089010400A002060206050091000A0013C -:1098300004280150018480408084080028009000A2 -:1098400018810080200D0C00011200000811222E4A -:10985000010010401410922601200913808A40450F -:10986000422821088022206070B00C000011D02115 -:10987000240004000000000000000C8120680002A9 -:1098800000000000000A50000080000028000900CD -:109890004804924AC802140882040C00004C5090FC -:1098A00009000840810898108400020889224200BB -:1098B0005000010A880C32C54820E718248167113E -:1098C0004014086400000029824228100408004463 -:1098D0000800C9005A990449428A028A008A000095 -:1098E000000A47000610100000200200206000005F -:1098F0000010704C9FB3B5185312032008A80085C0 -:109900005C410A2141090400000400000000000835 -:10991000015000484401028422425040222426582B -:109920000808B02824040000600260012400A0267A -:10993000098306A8A103CC00C423000000100C601A -:109940003000000180C603000040001B00049000AE -:1099500004A4200028014291C20400080202290048 -:109960000190641000000100020410C00001001109 -:10997000CA484081252C01E0180000404320200106 -:109980009B14894030108230502414110000404054 -:10999000001252000800AD400404460000000C0014 -:1099A0001046945000162E00E36008600A0309FF79 -:1099B0000F80C0847CF8010201C4458106A04202E8 -:1099C00030884C0A2024040000016101101060C09E -:1099D0000400081C8F0C00000000000891084AD108 -:1099E0008000080000800084000204A014014004EC -:1099F00002802804005000808A0140541011421156 -:109A0000810400210000F38239518013F23434C7FD -:109A1000781E1FCC8470A8C409FF1A1A0FF8403CA6 -:109A20001C101100830E182012C049000427008466 -:109A300020081040892408024081020404082240C2 -:109A400082044112108108049002102008444489C5 -:109A50000408820420081009210089012490912023 -:109A60000849040848912021001021204082240147 -:109A700022400224102249020010200842112042F4 -:109A8000420204082040008104081040800408209D -:109A900040820401204490840112008420908410AC -:109AA000810842012100408404082040820400888B -:109AB00040C17C00090820E31348181731DC471126 -:109AC00091A31C1C860190CC512000802182040DA2 -:109AD0004210A1E5109BC1068801110003004DDC76 -:109AE00001088C00214500041024384C30C003CC00 -:109AF000000000000FFF03FFFC94AF000000000017 -:109B00000000D00000000000000000000000000085 +:10935000000000000000000000000000000000000D +:1093600000000000000000000000000000000000FD +:1093700000000000000000000000000000000000ED +:1093800000000000000000000000000000000000DD +:1093900000000000000000000000000000000000CD +:1093A00000000000000000000000000000000000BD +:1093B00000000000000000000000000000000000AD +:1093C000000000000000000000000000000000009D +:1093D000000000000000000000000000000000008D +:1093E000000000000000000000000000000000007D +:1093F000000000000000000000000000000000006D +:10940000000000000000000000000000000000005C +:10941000000000000000000000000000000000004C +:10942000000000000000000000000000000000003C +:10943000000000000000000000000000000000002C +:10944000000000000000000000000000000000001C +:10945000000000000000000000000000000000000C +:1094600000000000000000000000000000000000FC +:1094700000000000000000000000000000000000EC +:1094800000000000000000000000000000000000DC +:1094900000000000000000000000000000000000CC +:1094A00000000000000000000000000000000000BC +:1094B00000000000000000000000000000000000AC +:1094C000000000000000000000000000000000009C +:1094D000000000000000000000000000000000008C +:1094E000000000000000000000000000000000007C +:1094F000000000000000000000000000000000006C +:10950000000000000000000000000000000000005B +:10951000000000000000000000000000000000004B +:10952000000000000000000000000000000000003B +:10953000000000000000000000000000000000002B +:10954000000000000000000000000000000000001B +:10955000000000000000000000000000000000000B +:1095600000000000000000000000000000000000FB +:1095700000000000000000000000000000000000EB +:1095800000000000000000000000000000000000DB +:1095900000000000000000000000000000000000CB +:1095A00000000000000000000000000000000000BB +:1095B00000000000000000000000000000000000AB +:1095C000000000000000000000000000000000009B +:1095D000000000000000000000000000000000008B +:1095E000000000000000000000000000000000007B +:1095F000000000000000000000000000000000006B +:10960000000000000000000000000000000000005A +:10961000000000000000000000000000000000004A +:10962000000000000000000000000000000000003A +:10963000000000000000000000000000000000002A +:10964000000000000000000000000000000000001A +:10965000000000000000000000000000000000000A +:1096600000000000000000000000000000000000FA +:1096700000000000000000000000000000000000EA +:1096800000000000000000000000000000000000DA +:1096900000000000000000000000000000000000CA +:1096A00000000000000000000000000000000000BA +:1096B00000000000000000000000000000000000AA +:1096C000000000000000000000000000000000009A +:1096D000000000000000000000000000000000008A +:1096E000000000000000000000000000000000007A +:1096F000000000000000000000000000000000006A +:109700000000000000000000000000000000000059 +:109710000000000000000000000000000000000049 +:109720000000000000000000000000000000000039 +:109730000000000000000000000000000000000029 +:109740000000000000000000000000000000000019 +:109750000000000000000000000000000000000009 +:1097600000000000000000000000000000000000F9 +:1097700000000000000000000000000000000000E9 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A00000000000000000000000000000000000B9 +:1097B00000000000000000000000000000000000A9 +:1097C0000000000000000000000000000000000099 +:1097D0000000000000000000000000000000000089 +:1097E0000000000000000000000000000000000079 +:1097F0000000000000000000000000000000000069 +:109800000000000000000000000000000000000058 +:109810000000000000000000000000000000000048 +:109820000000000000000000000000000000000038 +:109830000000000000000000000000000000000028 +:109840000000000000000000000000000000000018 +:109850000000000000000000000000000000000008 +:1098600000000000000000000000000000000000F8 +:1098700000000000000000000000000000000000E8 +:1098800000000000000000000000000000000000D8 +:1098900000000000000000000000000000000000C8 +:1098A00000000000000000000000000000000000B8 +:1098B00000000000000000000000000000000000A8 +:1098C0000000000000000000000000000000000098 +:1098D0000000000000000000000000000000000088 +:1098E0000000000000000000000000000000000078 +:1098F0000000000000000000000000000000000068 +:109900000000000000000000000000000000000057 +:109910000000000000000000000000000000000047 +:109920000000000000000000000000000000000037 +:109930000000000000000000000000000000000027 +:109940000000000000000000000000000000000017 +:109950000000000000000000000000000000000007 +:1099600000000000000000000000000000000000F7 +:1099700000000000000000000000000000000000E7 +:1099800000000000000000000000000000000000D7 +:1099900000000000000000000000000000000000C7 +:1099A00000000000000000000000000000000000B7 +:1099B00000000000000000000000000000000000A7 +:1099C0000000000000000000000000000000000097 +:1099D0000000000000000000000000000000000087 +:1099E0000000000000000000000000000000000077 +:1099F0000000000000000000000000000000000067 +:109A00000000000000000000000000000000000056 +:109A10000000000000000000000000000000000046 +:109A20000000000000000000000000000000000036 +:109A30000000000000000000000000000000000026 +:109A40000000000000000000000000000000000016 +:109A50000000000000000000000000000000000006 +:109A600000000000000000000000000000000000F6 +:109A700000000000000000000000000000000000E6 +:109A800000000000000000000000000000000000D6 +:109A900000000000000000000000000000000000C6 +:109AA00000000000000000000000000000000000B6 +:109AB00000000000000000000000000000000000A6 +:109AC0000000000000000000000000000000000096 +:109AD0000000000000000000000000000000000086 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 :109B10000000000000000000000000000000000045 :109B20000000000000000000000000000000000035 :109B30000000000000000000000000000000000025 :109B40000000000000000000000000000000000015 -:109B500000020000000000000000000008000000FB +:109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 :109B800000000000000000000000000000000000D5 -:109B900000000000000000000002000000000000C3 -:109BA00000000000080000000000000000000000AD +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 :109BB00000000000000000000000000000000000A5 :109BC0000000000000000000000000000000000095 :109BD0000000000000000000000000000000000085 @@ -234275,433 +234275,433 @@ :102E80000000000000000000000000000000000042 :102E90000000000000000000000000000000000032 :102EA0000000000000000000000000000000000022 -:102EB000000000000000000000000000000005F21B -:102EC000CC0000B054230C29B4810AA140B0A54C19 -:102ED000000042028000244380020C498A00102036 -:102EE000040101D00C43A02A002A4821FF0480A03D -:102EF0001828801810000414004A40210121828201 -:102F0000448305108240210A0442810A200088205F -:102F100078416800C0405B8A0420481140020840A4 -:102F20008A101040A0424A6443C804600072A22084 -:102F300060AB883621C81A2240380E29254C809073 -:102F4000E00004464000008C08024D9078E407241D -:102F50008185738C603A91289D4C0C823C60A9D489 -:102F60003034C97181DB502524245180B07303545F -:102F70008F181DB506B2438E48E480038E0C5103B2 -:102F80004624000F11C68498C0998018AC290A8580 -:102F900029400D28824018C908794231601E512805 -:102FA000B10020404204000A259C448100BB8428D3 -:102FB0003E18F1C290414560B6C021988003918BC4 -:102FC000F4498C09248D92303D2442151B0401A440 -:102FD00042C25825842E4B02584184B04B090896B2 -:102FE0000BE0607C648004213788C522B4248A1CED -:102FF0001C72C59CD140B4B12C1211C549435CB8B8 -:10300000814123820A4B31E20025AA3D050B8AC289 -:10301000825063C23ED4418052688095543A274121 -:1030200056C1E0D0E8431D204190338288B6592430 -:10303000E80741D0244046B63890C1B0700A3862E3 -:10304000411468021C0011D883442B71411B627823 -:10305000406D842129CAF300210C0F08385FCA1182 -:1030600003BB8C587A18250C63E1AA88922800DCEF -:103070000DADA3F6AC4D7616DB42C7805ED43304AB -:10308000002B800000000000000000000003652805 -:10309000459038900480F0CB444C5826908A80703C -:1030A00070A002B11F06450C5028C80A471D0ACC63 -:1030B000AF02AC281C920040804C42782804D10416 -:1030C000A40015034CE8205E2BE0C4A1826538F013 -:1030D000AA1E6500C8118AF83928100941C4421493 -:1030E0008885C3178380F490A0300CC10DD90400EB -:1030F0001100802A8C04070464A34F0862D21D28A3 -:103100008ACB030740996B0742C56BC249083C0351 -:103110003301CC66E20960276226820CC2538A60C2 -:10312000831230BB8E6B2008A815FC02024E199248 -:10313000703C679A16BC0855A0085CAB92300E0232 -:10314000A5F001143441247907412155609A382FA4 -:1031500041016960458C144705638783A296B4A535 -:10316000A525694D65A12C58614A0297482222DEA7 -:1031700090C09A318683C810B4AC70BB20CD09884A -:10318000F04130B6D022440252A101E8C2D62D0B44 -:103190000131C1625C18C43911C456605210640711 -:1031A0000A90020381004C26D90A868DBA0156C8BE -:1031B00099000AA8050B422F440922246F4F42416F -:1031C0000854BA161C224A64210B6894D73D09089A -:1031D0008CB2D4A08BB600860BAA40091091470888 -:1031E0008F40100302803DAA0A2A8008B36AACA56A -:1031F000520B5A8131012224C6A1252C03E881807B -:1032000080031D000806041098342E9605A84D0E64 -:103210001122180006050000124000201A000800C4 -:103220000B8E00629495130085080E200A0828244E -:10323000361240B810EA489785102082810005B008 -:1032400008122152800A0108883484196D40040153 -:103250009E80865013B2824E0020A01C1027680A60 -:103260000020000002000FD30356314028004328FD -:10327000918F00D01944E40603C2007711200802A0 -:10328000041006803012C18088CC0300C308C0003F -:10329000AC0069062106A0F26C40038421920196DD -:1032A000404300DB2F0BDB440DD14C44328C08181B -:1032B0000828402130024030C1806021252C27FEA3 -:1032C00013000825909F600E5C18004800A15FF86D -:1032D0009EAA0905C791115C643EDE09084144417C -:1032E000B61084A72FCC0FBDA0EBB0EDC43B7E8AF7 -:1032F000D9A080B8812008D6824060A204E258029A -:1033000043CF1A0263287810010A4546C10500A080 -:103310002B282D4598306A4C020015C0064300004A -:10332000E400020C15C0964202805C2C10484681D5 -:103330001154404A9C32BA0AE3823614221004C85F -:1033400083A67301A034CD15434276516CE811A1D8 -:1033500025294000600300908402A4C12251CD00C1 -:10336000384A30A08C594062600F1815488560803B -:103370003808201C12C18A1713A92477AD11660DD5 -:10338000653235343ED61842450020F2AC6D48090E -:10339000584CB401143845720104C3E2A0D5A80406 -:1033A000AD04910419D28200ED400201872C52A293 -:1033B000AC952A010344795015908BA623044953F8 -:1033C00000EA78D54238A148072204307398244295 -:1033D0000112B284000888261B048980C288A4C414 -:1033E000286C0D8710C4C054910AC3485202262489 -:1033F0002AA80B9C41A6120AD80AD40C8204AC124B -:10340000116C58D00D088C44916E58152E308308DD -:103410001B235200D42003408C04131010121008F8 -:103420000C858501C49CA02D2CE70339B04EB8B1A2 -:1034300014008406AD20C90C5F99064943AE33AE33 -:1034400024AE241551489A8100187420006203DECE -:10345000B1629085C811C84D1533FD381FB70021E2 -:1034600088A820C5FC010E21C18B04014804001569 -:103470001481050001C424A9C501060CCA62D4C484 -:103480004326064909109028A46822169143F403A4 -:10349000FE08223F3982462CA3230C00D72B024181 -:1034A00020100D60B024120180D6030240C2BA3948 -:1034B0008E01F0D287FC14522A50CEB9E0950888CC -:1034C0006E00FF004810E43840022420816091140F -:1034D0001487A01108C840812120510000000081FC -:1034E0004020F0C58308B54A3D01BB38507C16A189 -:1034F0004AA2D044887A732DAC44FD611ECC47B2F9 -:1035000011280C207156BC4198143C43433029408B -:103510002B0201FF0182C28180FFF03A65C740F1B2 -:10352000C6B0010324100900800480080009710955 -:103530000000E2E47E020E9D8F4C900A0028100CE1 -:10354000D98D54508828284002820154201304E069 -:103550005C05C08C0B80B814027000008A62801079 -:1035600018928015590801B18440FBFE3A588093A7 -:10357000F0B0B0400000400F00012C5449FF185833 -:10358000004010004029900C83821C509084598286 -:1035900004230484204890448104080040810204EC -:1035A0002408204482040102108108041002102023 -:1035B000084040810408020420081008210081010D -:1035C0000410102008410408481020210010212078 -:1035D0004082040020400204102041020010200814 -:1035E000421020404202040820400081040810409C -:1035F000800408204082040020409084011200844E -:1036000020108410810842002100408404082040DA -:103610008204008840FFF33FF7CFFFF0C3FCF99F1F -:103620002F5FC7FF9342F4FF0F3EFFCFB710FF0C91 -:10363000FF3F3C77C3BFF00DF0FFFE03FF43D1C354 -:10364000F3044D5F10528C0061405015010A568200 -:10365000B27042380000000000000000009CB00082 -:1036600000000000000060000000000000000000FA +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A :10367000000000000000000000000000000000004A :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A -:1036B0000000000000020000000000000000000008 -:1036C00008000000000000000000000000000000F2 +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000000000000000FA :1036D00000000000000000000000000000000000EA :1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000000020000C8 -:1037000000000000000000000800000000000000B1 +:1036F00000000000000000000000000000000000CA +:1037000000000000000000000000000000000000B9 :1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 :103730000000000000000000000000000000000089 :103740000000000000000000000000000000000079 -:103750000000000100222001000000111000444080 -:103760000000400000000000000000000000000019 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 :103780000000000000000000000000000000000039 -:1037900000000000000000000000008000060000A3 +:103790000000000000000000000000000000000029 :1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 :1037C00000000000000000000000000000000000F9 :1037D00000000000000000000000000000000000E9 -:1037E00000002040082380472002000120C00090F4 -:1037F00008208800000800800000100A00108000E7 -:1038000000212400012A248480010000000102001C -:10381000F000200200040007000009010018044C19 -:10382000C209080800221000220000400110000018 -:103830000002120800010002820004201008004467 -:10384000009000022004040201100C80000000001F -:103850008000008100040208090000000810041024 -:1038600000800600400800060000008000120020D2 -:103870002EBE35F44108500408200A084001088192 -:103880004020030004220280800800261A04100051 -:1038900092904204500800800811A2EBE8BEB900E3 -:1038A0001B8010004610205908008408C201201C0B -:1038B0003021020421000C2003A00824042002105F -:1038C000600800283088008001008008020880001D -:1038D000830010E88010DD48B002121C00080605C5 -:1038E00001511012000030000808000280900040D2 -:1038F00020108200A00400404800800400800800DE -:10390000801010800011A0882090BB210008C541C4 -:1039100052E4C215175E880D90900081F20E20438C -:10392000A0008A5C002002000200605000400008F5 -:103930000E002010C288098014060080404000500C -:1039400008200002C0220004802A080281302002E0 -:10395000008D8119070230B2009800000020040099 -:103960000010C01042000A4000409204448400024B -:10397000800400A408C04808120002800088048067 -:1039800000000C00008000802A322400000019088A -:10399000350007000290001804A0080B088A900266 -:1039A000946C29083F820FEB73DFFCFFFF3DFFCFD4 -:1039B000DAF2080C22813922008FE20240C069014C -:1039C0004C040010334081401D30080B2058586CC7 -:1039D000D100C10B0D31A540840524440F240126DC -:1039E00044002F00000412010A00102813A60D0144 -:1039F000605B28B34E284206040176E82B402EE88F -:103A0000CACA926804603506984069808000400008 -:103A10000810C080400220D3803AA30AAD12C334FC -:103A200022B0028801393130305F4B30300703401B -:103A30001028101410000022A253408C06000240EF -:103A400086121E4021A432040A2AA0007010002809 -:103A50003CC92201000007692124CA8C4008540196 -:103A600042000642A001000420400D12031AB21ABF -:103A700018861A0B1A0A1000A82469A322958698A2 -:103A80005181A06D6D0B100222022008C1092AA8E5 -:103A90008E230249E078432FFB8052012CA0350889 -:103AA0002622048460400090261A4101831152C4EA -:103AB00044B4020103969109D034D73640840C40B7 -:103AC0007218041120140209A004800123000404C8 -:103AD0000A00D000290228C3406001842830951ACA -:103AE000800009838D20D04103A500804085000C13 -:103AF000A00024C052000100450D001040000099B4 -:103B000054150001080AA00000000800208000B041 -:103B1000610000100000340400424BC0148808000B -:103B20008800015B54F08018590182B3CCD0410069 -:103B30000A42082002C4802A012A280C91F0284851 -:103B400090A1200005EC82107CE604042088880106 -:103B5000C0E47F413828C0012260080140332A02B6 -:103B600010228850A102100D81A22009A8C254265B -:103B700080810101E0A055B11100058C80C3B8F32C -:103B80003827D200860246B0008C00100AB801DD4A -:103B900010F8FE0C808E4390E51CB404060908A4BE -:103BA0000011209BE43A3C4E6071EA2010100A8814 -:103BB00000A1D00400A14415740CA9C23B5049389F -:103BC000283044BF41410438D400C008245220A00A -:103BD0000000011040A020945002591B4002042311 -:103BE000F8DCF8041E290007900100E040314A8803 -:103BF0000110060084C008C18400100000100806EF -:103C00000540002340200040040A0000000000009E -:103C1000020C1245210111241000088004810200C9 -:103C200000009000000400000000020000020100FB -:103C30000015080108002048002368080224130228 -:103C4000006A2126C40802089309106104901A4CE6 -:103C500002488B0860880400E10400000000552C35 -:103C600004800080010C43D40020800081000140CA -:103C7000028000000000088001104000000AC0001F -:103C80000200183000002000400502001000840BE4 -:103C9000F000198100007E880082000000200402EC -:103CA000002EA200000028E0302100040004422081 -:103CB00000A003003300E0C014200040200080403A -:103CC00000804008A80000000080003020000000B4 -:103CD00001000009000407002A00100000002A0269 -:103CE00000088001028040080520004800200220D2 -:103CF000511008004201D149440006000241010070 -:103D000000000080006801220080000020084000C0 -:103D100018B00400200001110000824080A0442857 -:103D2000E004380002A0588009000A12C0000820F0 -:103D30000000890010012424000A07000810020076 -:103D40000010C6000981040104083C0800800290AC -:103D500000542042891202883C1100108800225031 -:103D6000010821082808202220423000018080001C -:103D700000048C00229B0C50140000080020C4009A -:103D8000C20200C00828028400052A35014C0660E2 -:103D9000809401620000040040335C6812020E004F -:103DA0000240D000048006400081F06AA400000AAE -:103DB000468000012408A2002402063A82128C10D8 -:103DC000F33A000006510F44E0800061C2FC12206B -:103DD0000C0E88231F0682B16D906308002D00141D -:103DE000121708A1DC026400006020F430000841D2 -:103DF000C04112B0A0001B003E000003A040C10162 -:103E000006800C4000F004310213C5414041060019 -:103E100000000000010080800010520008000840EF -:103E20000020000805200000200010008000200075 -:103E3000C0200040000200F0000001107807F104EB -:103E40006A0404010420000401000000000400A032 -:103E50000000004016110120040004200090000022 -:103E60005C040008010200021044028021000000EE -:103E700000010840080080080100100000A01102A5 -:103E8000020000000020000022080041000CC8FCD5 -:103E900001000801E2080039E2389E070390801013 -:103EA00000F00001080D40069C10000001000823EE -:103EB000C03011AB0620015C421C00A000061008B7 -:103EC0006102800002183040030801821040080A95 -:103ED0001045306214C0E08302000108021C200C6F -:103EE0006120C3008C12284084020A100C30421357 -:103EF000002843100185080070C0850028008184D7 -:103F000000184084C40800002603040010802041EB -:103F1000020810A0000E1010C18108105000390CCA -:103F20000384084402080039000480085000A100FE -:103F30000E183081010C108800F7DF36FFCBEF63DD -:103F4000C3ECE8DD3DFFCFFE93E3DCFF8F2FFF8D59 -:103F5000D7507F0CFF3F3E37C1DFF01FF8FFFE0751 -:103F6000BF03C0C3F1000C03000BCFFE3000000103 -:103F70001004514EA5A0113C0000000000000000FC -:103F80000018900004000060000020000000000005 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000000000000000000000B7 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000000F7 +:1039D00000000000000000000000000000000000E7 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F30000000000000000000000000000000000081 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 :103F90000000000000000000000000000000000021 :103FA0000000000000000000000000000000000011 -:103FB0000000000003F000FC033F00CFC033F00C12 -:103FC000FC033F00CFC033F00CFC033F00CFC033F5 -:103FD000F00CFC033F00CFC0300A0C0000000000D2 +:103FB0000000000000000000000000000000000001 +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000000000000E1 :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 -:10400000000000000000000000003F00CFC033F0BF -:104010000CFC033F00CFC033F00CFC033F00CFC0CB -:10402000300A0C000000000000000000000000004A +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 :104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 :104050000000000000000000000000000000000060 :104060000000000000000000000000000000000050 -:1040700000000000000000100026600100000001A8 -:1040800010040000111040000000000000000000BB +:104070000000000000000000000000000000000040 +:104080000000000000000000000000000000000030 :104090000000000000000000000000000000000020 :1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000098077 -:1040C00000060000000000000000000000000000EA +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 :1040D00000000000000000000000000000000000E0 :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 -:104100000000000000000A44002A80D700030000DD -:1041100000C024105000880400000080800060402F -:1041200000100402920104080D2024800001000800 -:10413000000E0202CC0020218078A00604000D00B1 -:1041400001182400D0090040002200A002000C0148 -:1041500001004001000242080200020182985C0056 -:10416000004840000004C00000002602000004A037 -:104170001005021C0000000000040038010240A2EB -:104180000810041000840600400800400000008071 -:1041900000000240249024804882406428E06A089D -:1041A00000854081432015031500028C800C080413 -:1041B000190410004101500850C800C0841992EB46 -:1041C000C8BCB900EB8211E04400789004008E98DE -:1041D000821134C2B81188481080824000E408324D -:1041E000C004A2104001280820445802118890847D -:1041F00008404040001000EA7800DD489A021014A0 -:1042000086080800011810020000301200000000AB -:104210004290462A00800000A04008000002008072 -:10422000080080100100020205202048209107317B -:10423000080D6E72A4C84FE8175E88050268000377 -:10424000B61B144261200954081002898100C05035 -:104250000000440802004020C00C1180100206003B -:1042600040404C780920300480221D8080AE0C0232 -:104270008036C11204CD911946C83EB04C98080052 -:10428000014204004050C07A02018C406042DE6C62 -:10429000C22634040921C0AC4050C500140002817C -:1042A0002088459900200C60308000212A33060CBC -:1042B00010000C809FC007304A9002CBACE8133B43 -:1042C00069C8A620003824003F82001F33DFF0DFDA -:1042D000EF3DFF8DCBE21884220119480927E23A0D -:1042E0000CD76D219085A930B3408CD62DB0C8561F -:1042F000128C58ECF00397075DB0E544B70C03420D -:10430000CF24032644341F300006100152687191F7 -:104310000DB60D0AC0D9A8B34E1189861C62D36CA4 -:10432000AB4228C60ACA926084C9353ED848434287 -:1043300080B408A039174FBD200260D2813A230211 -:104340002D106B34330902C6023D31B0644E9730F4 -:10435000E5C6976241683E3D310780C6E21058C30A -:1043600074000280141384504D503B9B8C4AA00271 -:104370000010002451092111005006E938F4CB8EB9 -:1043800031999409030006CA20031F04A66A0D0888 -:10439000CB1EA21A98B11B231E0A8550A80C61AB34 -:1043A00009B18ED830D5681A1A02CDC033A08E0854 -:1043B000C8002C160240014A2C20732468834E2129 -:1043C00066A8371926398CADC2890023EB39F9C0AC -:1043D0000211D044050E0209031691279013031809 -:1043E00051840E4040302410301FC009C2E4A400A4 -:1043F000911C04041D80D0006002399382B00184B6 -:104400000831D532800009C3ADA0416129EB80118C -:104410004007009CE00025C1F7000040640F014602 -:104420000244029480751131700FB0810284D4026D -:10443000228C01B5E3420C31A0307604C0125680C4 -:10444000388A0A004C0000DBFCF00629E140E0233A -:1044500044C41E3200620A2A32CD40A5D10A34C4B7 -:10446000A0D23F8048F225C0446172306066C70D1B -:104470001080080361A015902C050E267055E46885 -:10448000100AFF404F91E30C43C006A444E7A07E0E -:104490007442310880862C607E88774120B105B651 -:1044A000404018D02037904DDCC2E3D871CC0CDEF0 -:1044B0008BFE33DFF0A08A021402B7A0801C5018D4 -:1044C0000D19088400010098352B3E832401EA2051 -:1044D0006DE51EAB0002D2480C495F17F44536016A -:1044E00058A090F82830889F430D0C78A200C2484D -:1044F0003320CCA04448211581A0613C1CC0591533 -:104500000200880014C847021855C308102000ECA8 -:1045100020300885751047C0041B294B071C808478 -:104520008444200425C0002300002058000A000114 -:10453000400000100201594F6903520C44C80100A9 -:104540004C01011374A2253A46856652EB589CA291 -:104550002EE88301233D54AAD419AB4F01428E00AB -:104560000B0C074784385064801E0A01C749043188 -:10457000ED581A4E2200820A60080088C520900279 -:104580002100CC4862C102198E0E43DC5C20A000E1 -:104590009D0301E0028000000000C80001500000FF -:1045A000000160005C0018383000000085A292C84D -:1045B0009000892CF0001FC3913873D0080A01A223 -:1045C0006221002A683CEA01062005E0DA2103297D -:1045D000051C43D020E84B04730C60C229401341F2 -:1045E0000AA0C440A081407F0805408640828F34E5 -:1045F00040400262820C0229C4A0CF013C403050EE -:10460000748064000498003D321600083120410691 -:104610009363A7F0F834395246ADF3030430360CF7 -:1046200070448A925020118A30288A20E1499C8067 -:1046300091140443CCA38844540F2501023593DF21 -:10464000C0B12A28E40C11012284F98C3DEA091337 -:10465000410408A42010F80340006424051E0584CA -:104660000800020080C0C600C18504010760DD505B -:104670001E048240009020D28922408C341239B02E -:10468000EC993810CC08200830083B00800153001A -:10469000A78093D0008DCE6F439B2C78F51040847B -:1046A0001820C480113533C2001C920300957A3F54 -:1046B000070C09E017AC0680085000C100BB5C681D -:1046C000922012040250C0780CA40641C0C5F37FAA -:1046D00000B18D082000C0800488820C140C805228 -:1046E000803980D5EC3250081AF37E4C678301EB99 -:1046F000C5ECB250340010257FC700B01D106161B9 -:10470000028C0022107E34405D04440001E00074FD -:10471000300018C8C20372B8E0011B11FE4040030C -:10472000806050191E0F8F64E0F12438813BD0095E -:104730004803360810400400054400011080520070 -:104740001380A900000000000E200C22000014724B -:1047500002162EC0C57010400C0202CC08070110D2 -:104760006400002002048071052001E002000000C6 -:10477000500000A80000004003010B0804000020C6 -:1047800000B01002FC4E4509B10284825044101062 -:1047900021544060020800040000084084104108D1 -:1047A000410213060220801410008022C000000184 -:1047B000804C30C4212380099240500198261987EB -:1047C000001091C004CC2428060C40061810800468 -:1047D00001000821403001AB21384227232A5433FD -:1047E0006619364F92A1CF9C993219F2059733CFB3 -:1047F000B464DA25CCCD9CA3329073E62936479376 -:104800004322542B9A33A44673E3C488CA7D2126DD -:104810000E6CA308CCB4D939F38B9330E990C895CA -:104820000CF9044D9244A8D2342CD98993919B2041 -:1048300079B232244F265113E4913219728F9320AA -:10484000C99055E9264C8CA303E46865662EB48CA8 -:104850008A41536895221972099F20885001BA082D -:10486000A10C4B328250B85B0E50C43B90A0E4CAFE -:104870008030B00A1410788090190035000E93042F -:10488000801068024000C0C0F0000844000E0FFF16 -:10489000200000154129054FADA018B80000000008 -:1048A000000000000000A000040000400000000024 +:1041000000000000000000000000000000000000AF +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:10414000000000000000000000000000000000006F +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D00000000000000000000000000000000000DF +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000000000AE +:10421000000000000000000000000000000000009E +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000000000000000000000000005E +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:10431000000000000000000000000000000000009D +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:10435000000000000000000000000000000000005D +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000000000000000001D +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D00000000000000000000000000000000000DD +:1043E00000000000000000000000000000000000CD +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:10441000000000000000000000000000000000009C +:10442000000000000000000000000000000000008C +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:10446000000000000000000000000000000000004C +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A000000000000000000000000000000000000C +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:10456000000000000000000000000000000000004B +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A000000000000000000000000000000000000B +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E00000000000000000000000000000000000CB +:1045F00000000000000000000000000000000000BB +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:10462000000000000000000000000000000000008A +:10463000000000000000000000000000000000007A +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:10467000000000000000000000000000000000003A +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000000000000000000000000000000000FA +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F00000000000000000000000000000000000BA +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000000000000000000000000079 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:104770000000000000000000000000000000000039 +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B00000000000000000000000000000000000F9 +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F00000000000000000000000000000000000B9 +:1048000000000000000000000000000000000000A8 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:104830000000000000000000000000000000000078 +:104840000000000000000000000000000000000068 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 :1048B00000000000000000000000000000000000F8 :1048C00000000000000000000000000000000000E8 -:1048D0000000000000000000030F00C3C330F0CC54 -:1048E0003C330F0CC3C330F0CC3C330F0CC3C3308C -:1048F000F0CC3C330F0CC3C330F0CC3C30020C0086 -:10490000000010000000000018000000000000007F +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:1049000000000000000000000000000000000000A7 :104910000000000000000000000000000000000097 -:10492000000000000000000000000000000030F067 -:10493000CC3C330F0CC3C330F0CC3C330F0CC3C39F -:1049400030F0CC3C30020C000000100000000000F1 -:10495000180000000000000000000000000000003F +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 :104960000000000000000000000000000000000047 :104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 @@ -234856,144 +234856,144 @@ :1052D00000000000000000000000000000000000CE :1052E00000000000000000000000000000000000BE :1052F00000000000000000000000000000000000AE -:105300000000000000000800000000000000000095 +:10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D :10532000000000000000000000000000000000007D :10533000000000000000000000000000000000006D -:1053400000000000000000000000000000002040FD -:1053500048A2204000020001208000800020800040 -:1053600000008000000000020000000000000000BB -:1053700000000080000100000000000000000000AC -:105380000000000000000100000900000001008092 -:105390000002010002000002000080020000800004 -:1053A0000001000280000400000040000000000036 -:1053B00000000000000004000008040000200000BD -:1053C000000400080100000000100410008000101C -:1053D00040000000400000000010020024902480E3 -:1053E0004180400408048208000108804020002415 -:1053F0000420008080009000090410008010420406 -:1054000010080009040092EBC8BC80000B8010005B -:105410004400000904008408801120008401080071 -:1054200000000000200008004000021040000018AA -:10543000204008000000000000080000001000E804 -:1054400000105D4010000000801800000203100AE8 -:1054500000001000000820000004001010000100EF -:10546000200200200400400200400400400808819F -:1054700000006028608000210008C50002C482008E -:10548000175E800C9000000124121040400008902C -:105490001100020202002040002000080400000069 -:1054A000820000801404008050400050082020003A -:1054B00050220000802A08028010200200BED12C59 -:1054C000460231F000000000000000004000901093 -:1054D000400000000040900440040000000000A4D0 -:1054E00000004000000002800088048000000800E6 -:1054F000008000002A3224084280080811000600BB -:1055000008000090A848101A090282801444210063 -:105510000002000000400020800400020822000871 -:1055200000803C000000F20200C049204006A17249 -:105530003340820C1D300A0B301858C8D000C80AFE -:105540002D31A550940C0040812400220004080451 -:10555000200010035AE010491BA60D41625328B3E6 -:105560004B095306041166E82B500D58C8CA12683F -:105570008464B11698086D80800009802FDB449602 -:10558000520630D28033430A2D12CB34AAB2008A9D -:1055900088393130305F4B3032474B42012816207A -:1055A0001101C0A2A20350202224020090529E505A -:1055B000210031B08A2AA018001E000088492991D4 -:1055C0000008074835B4CAA56109544912001E4AAB -:1055D000AE01010020680D388318A29A18961A2B84 -:1055E00018035940A18C6923241186981195A46D44 -:1055F0006D07594B63802458E0030F2E08110048B3 -:10560000C060432F9280C101ACEC355A262B09882B -:10561000E08030B40318C181F28191C046B6020324 -:1056200003948063D074C631418C0C405210240125 -:105630002010020181040400010004041A00D000BB -:10564000090004000000A04400D202004080B49091 -:10565000420090010820000002D240258002D24082 -:1056600039000000010C000000000019502011005A -:105670000A002000000008002080000261000010E5 -:105680000002340040000208148000008A00001864 -:105690007405001008010213C8900C0000220802D3 -:1056A000108080000000000090400000900020006A -:1056B00003CC0275D4C4470000088802C0447A00B5 -:1056C0003C2840112271484940132A0250A2031479 -:1056D000A102108981A6A02888824404000101014A -:1056E0009CA066F11131012E80ABE0B15C27C400B3 -:1056F0001230408000801DF202EE33FD2098D60C5F -:1057000094CE4890C10CB486031808344018B88B66 -:105710004434344DE473AB201AC40EA84101D04484 -:105720008C814105540DABD2BA4009D2290040BD4D -:10573000024104327E024A000550000000000110C0 -:10574000002020011002401040000020040C400006 -:10575000020008200081200C4030080801100000E1 -:1057600094AA08C1851011080014080405400020FF -:1057700000000000040A02010040004002081282FA -:105780004100002800000880000000000080100098 -:105790004204000240000000000241048005002095 -:1057A0000800294890206A4802041302046A202055 -:1057B000C408022893001460008008000048020416 -:1057C00080111010002000000100040400800080FF -:1057D000010C43D4002080008102014102801000AE -:1057E00000000000000000000002800002001830ED -:1057F00000042000400102011010821DF1001980F8 -:10580000000030080080000000200402A82CE20103 -:105810000800A0E0382000400000022000A00000A6 -:105820003300E0C0142001400000804000804000B0 -:10583000A800100000800000200000000100000906 -:10584000081507000200100010000A0000000011F7 -:10585000028840454020004A002282204110080072 -:10586000400191010400040000400000000000001D -:1058700020680022000000000000000008A00000D6 -:10588000080001010004924A00805008E00428004A -:1058900000201080080008000000880080008100BF -:1058A00010010000000001000800020000100000CC -:1058B0000081040104081C080000021000042000FC -:1058C00000020000000040004A00024101082108D7 -:1058D00020082000004000000180800000000C0033 -:1058E000228A0410040000480022D400120200C0E2 -:1058F00008A8008500273C2781CE063024CC03C0B1 -:105900000000040360210C2802000E000242D000B7 -:105910001A2426410106B0EBA42311026C000001F9 -:1059200024002000250206288223CC99F73A0100A2 -:1059300093319F40E0920933C9FC1201240A8A2165 -:105940000E0082906F902208002C0414101508A1FC -:105950004C006400006020B0000000004040104493 -:10596000000008000800000125600580060008000E -:105970004020001102008540408006040001000024 -:1059800000008000001052000800A9400000000044 -:105990000500000020001000800020004020004092 -:1059A00000020000000000000007F00000000201FB -:1059B0000020800030400000000400000020400073 -:1059C000080000200400040000000000000400089B -:1059D0009100004080000000000000000001004035 -:1059E00008008008010010000020000002000000F4 -:1059F000000000000008000100000000000000009E +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000000000000000000008C +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:10545000000000000000000000000000000000004C +:10546000000000000000000000000000000000003C +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:10549000000000000000000000000000000000000C +:1054A00000000000000000000000000000000000FC +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E00000000000000000000000000000000000BC +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:10552000000000000000000000000000000000007B +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000000000000000000000000000003B +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A00000000000000000000000000000000000FB +:1055B00000000000000000000000000000000000EB +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000000000000000000000BB +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A +:10561000000000000000000000000000000000008A +:10562000000000000000000000000000000000007A +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:10566000000000000000000000000000000000003A +:10567000000000000000000000000000000000002A +:10568000000000000000000000000000000000001A +:10569000000000000000000000000000000000000A +:1056A00000000000000000000000000000000000FA +:1056B00000000000000000000000000000000000EA +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F00000000000000000000000000000000000AA +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:105730000000000000000000000000000000000069 +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 +:105770000000000000000000000000000000000029 +:105780000000000000000000000000000000000019 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B00000000000000000000000000000000000E9 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000000000000000000000A9 +:105800000000000000000000000000000000000098 +:105810000000000000000000000000000000000088 +:105820000000000000000000000000000000000078 +:105830000000000000000000000000000000000068 +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000000000000028 +:105880000000000000000000000000000000000018 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000000000E8 +:1058C00000000000000000000000000000000000D8 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900000000000000000000000000000000000097 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:105940000000000000000000000000000000000057 +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:105980000000000000000000000000000000000017 +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C00000000000000000000000000000000000D7 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 :105A00000000000000000000000000000000000096 -:105A1000000000000010040001020820800011AB0B -:105A2000042606942068D0060C3060C34600183463 -:105A30003060030600306118008D0804F18A11A05F -:105A40006844060C0468C2342068D069A1068D0D34 -:105A500034D0C180000C006000C180211811A12346 -:105A6000468A3461A344183009930D9930D9B08C1B -:105A70006319B3436333366C1366264C8264C326C2 -:105A80004C36643366CB3661B364D8C60C99084291 -:105A900012C840C84C2C2109B19366C4366C3366D9 -:105AA000CB36608824459120058260C041A44139ED -:105AB000230000040002304D020D1908C26084C4A6 -:105AC00084100F00820220C11C90E40434400000C6 -:105AD00000040108000B0C0010500045100FE04BB3 -:105AE000BCF00250000000000FFF03FFFC18BF00D5 -:105AF0000400000000001000000000000000000092 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A40000000000000000000000000000000000056 +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000000000000016 +:105A90000000000000000000000000000000000006 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000000000D6 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 :105B10000000000000000000000000000000000085 :105B20000000000000000000000000000000000075 -:105B3000000000000000003FFF0FFFF3FFFCFFFF2D -:105B40003FFFCFFFF00AFC00000010000000000043 -:105B5000080000000000000000000000000000003D +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B50000000000000000000000000000000000045 :105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000003FE6 -:105B8000FF0FFFF3FFFCFFFF3FFFCFFFF00AFC001A -:105B900000001000000000000800000000000000ED +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 :105BA00000000000000000000000000000000000F5 :105BB00000000000000000000000000000000000E5 :105BC00000000000000000000000000000000000D5 @@ -235002,144 +235002,144 @@ :105BF00000000000000000000000000000000000A5 :105C00000000000000000000000000000000000094 :105C10000000000000000000000000000000000084 -:105C2000000000000000000000000800000000006C +:105C20000000000000000000000000000000000074 :105C30000000000000000000000000000000000064 :105C40000000000000000000000000000000000054 :105C50000000000000000000000000000000000044 :105C60000000000000000000000000000000000034 -:105C70000000204048882040000200012000000071 -:105C800000208000000080000000000200000000F2 -:105C90000000000000000080000100000000000083 -:105CA00000000000000000000000010000082000CB -:105CB00000010080000201000200000200008002DA -:105CC000000080000001000080000400000040008F -:105CD00000000000000000000000040000080400B4 -:105CE0000020000000040008010000000010041063 -:105CF00000800010400000000000000001100200C1 -:105D0000249024804180400408400208000108805B -:105D100040200200042000808000000209041000DE -:105D20008010420410080000044092EBC8BC8200BE -:105D30004B80101044000001040084088011A084EE -:105D4000860108000000000000000810400002105A -:105D500040000008204008000080000000080020EB -:105D6000001000E800105D401020000080180000C6 -:105D70000403100A001210000008000000040810BC -:105D80001000010020020420040040020040040032 -:105D90004008088000006028608000210008C500DD -:105DA00002C48200175E800C9000000124100040A5 -:105DB00040000090000002000000204000000008A9 -:105DC0000400000080000080140400805040005057 -:105DD0000820200050220000802A080280102002A3 -:105DE00000BED12C460A31F0000000000002040081 -:105DF0004000D0104000000000409004400400002B -:105E0000000000A400004000000002800088048020 -:105E100000000800008000002A32240842800808A0 -:105E20001100060008000092A848101A490282805A -:105E3000144421003DC20009339FF0D77F39FFCDC4 -:105E400042C0000800003C000000020200D04928C7 -:105E500040040110334080000D30080A30185848C3 -:105E6000D000C00A2D31A5409404004081240022B6 -:105E700000040804200010010A00100819A60D01F2 -:105E8000425328B34A084306040146682B400008E1 -:105E9000C8CA12608060A51698086D8180000982CA -:105EA0002FF94496520630D2800003082D12CB30D1 -:105EB000AAB2000A80193130305F4B3030474B4274 -:105EC00001281620110080A2A003502022240000E7 -:105ED00090529E50210010800A2AA018000A00004B -:105EE00000890101000807481534CA854101540999 -:105EF00012001C4A8A01000420680D100318A21A1F -:105F000008141A2318035140A08460232011869896 -:105F10001111A04D4D03514A62000058C0000828DD -:105F2000000000088460030B9280400008A0350048 -:105F300026020000C0C1000003084101D28191C0C7 -:105F40000626020101948023501106310184084085 -:105F500052102000201002018104040001000404FA -:105F60001A00D00009000C000000B00400D20600A6 -:105F70008080B490420090010820000002D34025A8 -:105F80008002D24039000000010C0000000000191E -:105F9000142211000A0020000000080020800000E8 -:105FA00061000010000234000000020804800000BC -:105FB0008A0000595403021008010213C8900C0013 -:105FC0000022082210800000000000009040000025 -:105FD0009000200003CC0275D4C40700000888029A -:105FE000C0447A003C2844132271584940322202AE -:105FF00040A203102002108981A62009888254043F -:10600000000000019C8066F11131012E00ABE0B16F -:106010005C27C4001230408000801DF202EE33FD88 -:106020002098D60D94CE4890C10CB40603180834BD -:106030004018B88B4434344DE473AB203AC40EA0FE -:106040004121C0048CA14005544DA3523B5049F25C -:106050002900C4BD025104327E024A0005500000EE -:10606000000001100020200110024010400000201C -:10607000040C4000020008200081200C4030080879 -:106080000110000094AA08C185101108001408042A -:106090000540002000000000040A0201004000400A -:1060A0000208128249000028090008800000000050 -:1060B0000080100042040002400000400002410441 -:1060C000800500200800294C90206A480204130231 -:1060D000046A2020C408022893001460808009000C -:1060E00000480204C02000110020000001600404E8 -:1060F00000800080010C43D4002080008102014117 -:10610000028010000000000000000000000280007B -:106110000200183000042000400102011010821D0E -:10612000F1001981008034080080008000240402FE -:10613000A82CE281000020E038200040000002206E -:1061400000A000003300E0C01420014000008040A7 -:1061500000804000A8001000008000002000000027 -:1061600001000009081507000200100010000A02D3 -:1061700000000011028840454020004A0022822091 -:1061800011100800400191010400040000400000CB -:106190000000008020600022000000000008400095 -:1061A00008A00000200009010004924A88805408D9 -:1061B000E0042800002450900900080080008800B6 -:1061C00080008100100100000000010008000200B2 -:1061D000001000000081040105081C280000029046 -:1061E0000044200000020004080151505A112241CD -:1061F0004108210828082800004000000180800094 -:1062000000000C00228A0410040000480022D40080 -:10621000120200C008A8008500273C2781CE063066 -:1062200024CC03C00000040360210C2802000E00EF -:106230000242D0001A2426410106B0EBA423110229 -:106240006C00000124002000250206288223CC993E -:10625000F73A010093319F40E0920933C9FC1201E3 -:10626000240A8A210E0082906F902208002C0414C8 -:10627000101508A14C006400006020B00000000070 -:1062800040401044000008000A000001256005801D -:1062900006000800402000110210854040810604DD -:1062A0000001000000008000001052000800A9401A -:1062B0000000000005000000200010008000200009 -:1062C0004020004000020000000000000007F00035 -:1062D00000000201002080003040000000040000A7 -:1062E000002040000800002004000400000000001E -:1062F0000004000891000040800000000000000041 -:10630000000100400800800801001000002000008B -:106310000200000000000000000800010000000072 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000000000000004 +:105CA00000000000000000000000000000000000F4 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000000000C4 +:105CE00000000000000000000000000000000000B4 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20000000000000000000000000000000000073 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA00000000000000000000000000000000000F3 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00000000000000000000000000000000000B3 +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E20000000000000000000000000000000000072 +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000000000B2 +:105EF00000000000000000000000000000000000A2 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F20000000000000000000000000000000000071 +:105F30000000000000000000000000000000000061 +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F70000000000000000000000000000000000021 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB00000000000000000000000000000000000E1 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF00000000000000000000000000000000000A1 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:106030000000000000000000000000000000000060 +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:106070000000000000000000000000000000000020 +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B00000000000000000000000000000000000E0 +:1060C00000000000000000000000000000000000D0 +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000000000A0 +:10610000000000000000000000000000000000008F +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:10614000000000000000000000000000000000004F +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:10618000000000000000000000000000000000000F +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C00000000000000000000000000000000000CF +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:10620000000000000000000000000000000000008E +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:10624000000000000000000000000000000000004E +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000000000000000000E +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C00000000000000000000000000000000000CE +:1062D00000000000000000000000000000000000BE +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:10630000000000000000000000000000000000008D +:10631000000000000000000000000000000000007D :10632000000000000000000000000000000000006D -:106330000000000000000000001000000102082022 -:10634000800011AB0426029420285002041420433C -:1063500042800814102021428214210E1085080466 -:10636000F08A10A02840C2040224411212244825B9 -:1063700090224485B6C2D8D08C6D062C4C58B210F1 -:1063800088089031624B1620B16089121081040E8A -:10639000104080080010A14142121428014202045A -:1063A000042041428410280102081020A14050849A -:1063B0000489084212C8404844246308908122405E -:1063C000122411224B122088205A7E29858A60636C -:1063D0008038D1E7086E8BAD0320845D8201E486AE -:1063E0004410818C102A0C47C011A2C130B6ED01B7 -:1063F000BE42928001040C4400044C013100044070 -:10640000142B8403D89003BCFFC03FFFC000F000F2 -:1064100000081000040200800000200000000000BE +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:10635000000000000000000000000000000000003D +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000000000000000000000000000000000FD +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000000000000000000000CD +:1063D00000000000000000000000000000000000BD +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C :10642000000000000000000000000000000000006C :10643000000000000000000000000000000000005C -:106440000000000003FF00FFFF3FFFCFFFF3FFFC52 -:10645000FFFF3FFFCFFFF3FFFCFFFF0000C0000086 -:10646000000000000000000000020000000000002A +:10644000000000000000000000000000000000004C +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C :10647000000000000000000000000000000000001C :10648000000000000000000000000000000000000C -:10649000000000000000000000003FFFCFFFF3FFFE -:1064A000FCFFFF0000C00000000000000000000032 -:1064B00000020000000000000000000000000000DA +:1064900000000000000000000000000000000000FC +:1064A00000000000000000000000000000000000EC +:1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC :1064D00000000000000000000000000000000000BC :1064E00000000000000000000000000000000000AC @@ -235153,285 +235153,285 @@ :10656000000000000000000000000000000000002B :10657000000000000000000000000000000000001B :10658000000000000000000000000000000000000B -:106590000000000000002C8000AA20008800980065 -:1065A0000480048000004000000041000000100052 -:1065B0000011000000020810222009090242100008 -:1065C00000010400FF004003E00400070800021679 -:1065D00042400008203000422440008420D009813D -:1065E00006604181084042087A006C400A105B4A0C -:1065F000250801991310880CC81884408660001083 -:106600002124120200026326708BCC37104C8121AA -:106610000028000000020008000000004000000AFE -:10662000200254808A2C1164800A138100480002E1 -:10663000A90000201C0822400005407022910002A1 -:10664000040104069C00004407022910004040A2F7 -:10665000C82C8800428D4400106C800033D2044264 -:1066600000002884100529008423208480D9024951 -:106670000A5A4084049690020302041120406721C4 -:106680002080C5221243A0683E04144031000484D7 -:10669000810012B100000121E0454A051441565025 -:1066A0001D0021000822042C120840841021080833 -:1066B00041001080082120104AC000010C20002059 -:1066C0007708C50012C4821C051683210000002132 -:1066D0002412520050802880210211320204020A42 -:1066E000C0A2120344858240AA20608530C5801074 -:1066F000108C0007E60300000011E0000800110004 -:10670000400800C028B640250D0869D10230023883 -:106710003C22C5A1305060000A22020C5D30060008 -:106720003801000204800002302832148001FC602D -:10673000901030463ADFC0542129E0D8800400028E -:10674000041106300400104D0294A00054040020EF -:106750001001151209009820000800000000000038 -:106760000000000000006910329D3A088240F2C02B -:106770002040C9200046A07233A0020C19360F0138 -:10678000100858C8D61C08002930A578C40C088900 -:1067900000043040008040000300004252E000410D -:1067A0000B26CDE020110833AB011106C01022C822 -:1067B0000B780F5048CE527C040411149B8E440178 -:1067C0000008120C2DDD8454534430EAC033C30654 -:1067D0002DA0433C8C101C930839313700080A3730 -:1067E00002080A4086A414400609420992040000E7 -:1067F000880032020112200021012130809C93EC9C -:10680000001FFF00A8C0B09000046A1020A4CAF0C6 -:10681000226804E1003FEC422FF3010401140D68EB -:106820008359A3CB58021A0359020800E50C7D23B3 -:106830000411849B80800428280E0801A300612C89 -:10684000E00327D60C110040C44041258280C101DD -:10685000044835F226E109084141902484188081DA -:10686000A00044888C140002061100C18465D22067 -:10687000408801110000041202840208211B00025A -:106880004001A8C9827026002102020200430008CC -:10689000400000000F0F00000004008601004A6263 -:1068A00000000800073C00040030D4A0443004413C -:1068B000034C428264DF020035400030006000A0DB -:1068C00006180C02802800230804424169D10B04F9 -:1068D0005620040C88484018246180399EC1A3903A -:1068E0008E900C00002000061082902A2034084B65 -:1068F00090E0A808822122040148805040C1530042 -:10690000080A80C2D1C47E0138A8C4032271184984 -:1069100040332A0250A20314A102108981A6A0A923 -:106920008882541400010101D42022B11131002CBD -:1069300081EBF4A75C278640B23244A0228408A0F1 -:10694000002C22BD0858F40584CC4A00404C308409 -:1069500002380A206038B88BC43C10CFC4702A209B -:1069600032440C280063904404A1210054490B6078 -:10697000935049520880C72102110C21540111087B -:106980004000823082461840C080001644445115B1 -:106990000802044120C8A7FE102908A5D08028C8F5 -:1069A0005C04A40A92A09FF8188800314110511A83 -:1069B000480A2108C24561209780520007F183BE32 -:1069C0001061F815DA0002C0008044405002061140 -:1069D00001000218C0111A01184899A01084784FBC -:1069E00014910258D0D218430326C18402105720B4 -:1069F00040D22028090CA29084A04132A0041900A2 -:106A00008000110C08888004621CCC389D00B28282 -:106A1000E690000011021004400100200046013EF3 -:106A200060000010010C01D800000100000200808D -:106A300000000400184000C0000000000011900099 -:106A40001000801010001E8100800D0021080287B8 -:106A500083840002213C6203242205A4D2240BC0BB -:106A600000C0020280850400440C830060004108DD -:106A70000020090A4219B40341001440011060408B -:106A800085000108440152618090080084420100A1 -:106A9000518401DA1002061000681C9448000008B6 -:106AA00083222040502000008840011010C2013392 -:106AB0000906CCC00BCCA0D4090D04981266607EE8 -:106AC000D908CB0C004333302BFC0AEC85806020C6 -:106AD00098640433088450014884623023224212AF -:106AE000C00008A800342C0022403CAC858B003844 -:106AF000030000C5480021020040605011800421BD -:106B00002C63098131408008C824520E7C11115C2D -:106B100090512050402090208C208C0008804160B3 -:106B200040007409300143800004002DC0100901A9 -:106B30007F8000002581200001000030002988317D -:106B400005881440251403C00000040360200420BD -:106B50000000160000008000180004018186013842 -:106B6000002311026C00000000000000200A040055 -:106B7000023208A2C320210094522C0402120945BB -:106B800082C04021280688201E040190551002086A -:106B9000002C0004101D08C0CC0044000000007050 -:106BA000000001000A840002000000000000000054 -:106BB00000000000008200004000000000002808E3 -:106BC0000500380010180680401112026004000011 -:106BD00013830000000000001228050001080030A7 -:106BE000180A820114421110040800FF0E0102006D -:106BF0007C0000386C008070010001F8000000008B -:106C000000000000000414040200100471A022C15E -:106C100000204326001A4812264400204220221059 -:106C200022108131000400002002004004004008CE -:106C3000008000000A0000001080000428000112FB -:106C40000200FBF838200041F04040BFFA3E9FCEE2 -:106C500003F0101420FF20200FBD001E9C004002F6 -:106C60000001000040000041042000842008104082 -:106C700081040800408102040408204082040102CB -:106C8000108108041002102008404081040802040A -:106C90002008100821008101041010200841040878 -:106CA00048102021001021204082040020400204CE -:106CB0001020410200102008421020404202040827 -:106CC0002040008104081040800408204082040015 -:106CD00020401084010200842010841081084200AA -:106CE00021004084040820408204008840FDFF2EDB -:106CF000FFCE55B3DC30FD9F080681AFC3B080DE08 -:106D0000CF024DCF77D00ECCF7AF3750C1FDF3EDAA -:106D1000DCFB3D00AB42121002040FFC05488C0066 -:106D200011554077551FF543F5F042A800000000CB -:106D3000000000000010A007F80000000000400064 +:1065900000000000000000000000000000000000FB +:1065A00000000000000000000000000000000000EB +:1065B00000000000000000000000000000000000DB +:1065C00000000000000000000000000000000000CB +:1065D00000000000000000000000000000000000BB +:1065E00000000000000000000000000000000000AB +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A +:10662000000000000000000000000000000000006A +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:10666000000000000000000000000000000000002A +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A00000000000000000000000000000000000EA +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E00000000000000000000000000000000000AA +:1066F000000000000000000000000000000000009A +:106700000000000000000000000000000000000089 +:106710000000000000000000000000000000000079 +:106720000000000000000000000000000000000069 +:106730000000000000000000000000000000000059 +:106740000000000000000000000000000000000049 +:106750000000000000000000000000000000000039 +:106760000000000000000000000000000000000029 +:106770000000000000000000000000000000000019 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B00000000000000000000000000000000000D9 +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:106820000000000000000000000000000000000068 +:106830000000000000000000000000000000000058 +:106840000000000000000000000000000000000048 +:106850000000000000000000000000000000000038 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000000000000000000087 +:106910000000000000000000000000000000000077 +:106920000000000000000000000000000000000067 +:106930000000000000000000000000000000000057 +:106940000000000000000000000000000000000047 +:106950000000000000000000000000000000000037 +:106960000000000000000000000000000000000027 +:106970000000000000000000000000000000000017 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F0000000000000000000000000000000000097 +:106A00000000000000000000000000000000000086 +:106A10000000000000000000000000000000000076 +:106A20000000000000000000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40000000000000000000000000000000000046 +:106A50000000000000000000000000000000000036 +:106A60000000000000000000000000000000000026 +:106A70000000000000000000000000000000000016 +:106A80000000000000000000000000000000000006 +:106A900000000000000000000000000000000000F6 +:106AA00000000000000000000000000000000000E6 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF0000000000000000000000000000000000096 +:106B00000000000000000000000000000000000085 +:106B10000000000000000000000000000000000075 +:106B20000000000000000000000000000000000065 +:106B30000000000000000000000000000000000055 +:106B40000000000000000000000000000000000045 +:106B50000000000000000000000000000000000035 +:106B60000000000000000000000000000000000025 +:106B70000000000000000000000000000000000015 +:106B80000000000000000000000000000000000005 +:106B900000000000000000000000000000000000F5 +:106BA00000000000000000000000000000000000E5 +:106BB00000000000000000000000000000000000D5 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000000000000000000A5 +:106BF0000000000000000000000000000000000095 +:106C00000000000000000000000000000000000084 +:106C10000000000000000000000000000000000074 +:106C20000000000000000000000000000000000064 +:106C30000000000000000000000000000000000054 +:106C40000000000000000000000000000000000044 +:106C50000000000000000000000000000000000034 +:106C60000000000000000000000000000000000024 +:106C70000000000000000000000000000000000014 +:106C80000000000000000000000000000000000004 +:106C900000000000000000000000000000000000F4 +:106CA00000000000000000000000000000000000E4 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF0000000000000000000000000000000000094 +:106D00000000000000000000000000000000000083 +:106D10000000000000000000000000000000000073 +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 :106D40000000000000000000000000000000000043 :106D50000000000000000000000000000000000033 :106D60000000000000000000000000000000000023 :106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000002000001 -:106D900000000000000000400800000000000000AB +:106D80000000000000000000000000000000000003 +:106D900000000000000000000000000000000000F3 :106DA00000000000000000000000000000000000E3 :106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 -:106DD0000000000000020000000000000000004071 -:106DE000080000000000000000000000000000009B +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 :106DF0000000000000000000000000000000000093 :106E00000000000000000000000000000000000082 :106E10000000000000000000000000000000000072 -:106E20000000000000000000000004710144404721 -:106E300004111115544555515554555504444111EB -:106E400010444411110444411110444411110444EC -:106E500041111044441111044441111044441111D2 -:106E6000044441111044441111044441111044449C -:106E7000111109044114104444111104444111102A -:106E8000444411110444411110444411110444417B -:106E900011104444111104444111104444111104CF -:106EA000444111104444111104444111104444114F -:106EB0001104444111104444111122654A89206C87 -:106EC00098B6070D6F81ADC1C968B284008D888303 -:106ED0008000F8CB000084488E610428010024C49F -:106EE0008D31803A2007A220FF0A20E3E01C0487AE -:106EF00004B045D921112406900992CE142325808F -:106F00001A04064B0D12C34B0430C1067801FA0374 -:106F1000F80CFFA5140643557280681AAB14034899 -:106F20008D524F64212C364288FA72A94CAFAA3E8A -:106F3000ABCA5AB260BC3F1C20E4C49BF012A40050 -:106F4000400000095212A6C43EFE37F543CA7076CF -:106F50009C16CA0D40839AD143B410B60E6A028EB5 -:106F6000D00498319B16BA09D390E6EC50ED004955 -:106F70008D21B3EFE8FEB63C1F8098F16E905FE97B -:106F80000C0CC42DD0DFE063A70B7D094A50D1481B -:106F90005D462D248586B35AE861AE0D74C99322EF -:106FA000593018D238EB4A6CC25458EDFE32FDC449 -:106FB000D4B29D98E73C0A454FBF501E1C003000DC -:106FC000000A0002A2FC52D531458B40A0568868C9 -:106FD000AD02D1468AD0AD14D15A1DA2851FF0EA68 -:106FE000F0DFBD2B8848C50016F48A1C1F7EC76CD5 -:106FF000B12030DF6436FAC1D45069B8D7AE3E460E -:1070000046F460DD2CFA311AADCD5561BFA0D5A58F -:1070100035AD8187515290FFF834A6C9D5E3C0D869 -:10702000D4FF2AA78331232610BFF73F560AB1F3B6 -:10703000A774E64F36CF4F79F011F43BC232A84D1A -:107040009F719E1478043B7844AF61F7346D7314DC -:10705000BDC7FEE29198BEE63ED7CD9CC3AFEC5EC5 -:10706000BE36FCCB67B30E3C512436CD8A95E3FE89 -:10707000FCECFE3FDFCF8FD2BDFCB92800134000EF -:1070800000000000000000000002E73876B83ED99A -:10709000849CF34754EC5B36FF8EF7F37F788AAD20 -:1070A0001FFA4B0F713AF8DBDB2DDA8EAFF3AF58D6 -:1070B0005C8E13448B6FA0BF2C3F0D3F7A4539A3E4 -:1070C000FFE4315D3BFF4D61E3777CFF7F1D774F30 -:1070D0004C51EEFC7F581B59CDFB73EFE4EDFB17D1 -:1070E000FD86FD90D2783FED0FFFC4C291CE94DFB4 -:1070F000AA36D7CF7D73DF7432F62CBD8ABB73FB03 -:1071000074FF6B3B76C76BF32BDC77AB3993CDF613 -:10711000E3E3F077773F66CDFAF3DFF0935A3DF083 -:107120008F6BE3F9A83FFF1A2A4F6FF17128B76BF5 -:1071300037BFCEB5E14F7C7D723FFF4EBFF101DC22 -:10714000616D3DBD87BDE2FA5CDEBE3FBDC77BE33E -:10715000B7FCEF772D5BC7FDB3BFB4EDED177B4FE9 -:10716000E7A12EFCE56F0FFE4C3B22D9D0FDCB2FC3 -:10717000F78AF393BDFC7D7B2F6F4BFAF1F7FCF69A -:10718000031AC341FFE1BFD4DEF60F1BCB96D16BD0 -:10719000F0FCD637658F5EE37F9C641325100209EF -:1071A00091144CA6452245065A40D8B4C9022CACCD -:1071B000859DF177ACFF9232FDCDFFF1CF7CFB3B9B -:1071C0001E7B8F9473FF54FFFD37FFC8FFF17F587C -:1071D000CDDF2CCF0F7DE3BF30FD370E3EC961F10F -:1071E00002983E622AA8C2C8E39A0C751B0EF68B61 -:1071F0002BD0A30885D531918A16C159D4454211A7 -:107200000C8D1693D9B4ACC535AF4B5ED1A63C10EE -:107210000E2120089B604020B080280003DE03F58B -:10722000DCD73F28D7489F208B4C6E253E2A4099BB -:10723000A2FB48D941122282E0A357B0281239DBC1 -:107240008BAE2188A8B6C6056D40C291DCD46EFC19 -:107250001B710B6F00A3B039F82FEC420A300420E9 -:1072600080081DF34AFFF3FD34D1672C958F02D0BF -:10727000D7BCB5661BCEC17F93112812861C354E34 -:10728000F073EB809ACE2FB4CDCFE0B4FC95C5352A -:10729000750FA3D23E4C2BF63B5242FF4363DC7E7C -:1072A000FE3EEE48CFD1DE74AAE12BD8C776E127A7 -:1072B000188E501942C0B8E1B54C77DF3A920CF7FE -:1072C000F3977CCDD63E2E4909F13FF0F7EA0EF94F -:1072D0008570733B583F2D1CE74DF331AF9852F743 -:1072E00017FB8BEF5167F857DA3F7ACFF990CCFC58 -:1072F000D9353CD5027D9010C0D15000F34E888323 -:1073000057245902048743FE8047987309227DCC95 -:10731000FCA17E6C42973FF34EE790BAD4CD431E5A -:107320007FC65EE212EC3EBC1DC88205A27FDC6B0C -:10733000D729D787BFF3769C908025E6415CF3D5AB -:1073400080A9CA3F838A6FF15ED092392630C2D8B5 -:107350007195B43DEF1FEAC99AB3383C364D2D4EB6 -:10736000C34573119810C61FF5451F801408391ABC -:1073700013A54B4E13BADC62BB3DE6075DE0FFE8A8 -:10738000FA293FF2053F226DA0F34A0EFB4FE0F1D0 -:10739000FCA4B5D833F7885411A34C03FA12FC436C -:1073A0009EA29224734002858B0CB2ABB8DD1F0104 -:1073B00076C276535BDC9A3F23264F538289605D09 -:1073C000C62DA3CA6FB2922C53530F33CC61F1B1C7 -:1073D000B4C2053E1BCFAFE0ABC0EAF52BFF0DFA00 -:1073E00053F7C079F529DB8058E3BFBCABCF0BFF67 -:1073F0008DC4F26AB8ECD53CE304BA12D8A45ED2CC -:107400002926CE36D304882EA1348D00B6511CDC3B -:107410008DA30F0248E3821A1035CE01198B8C21FF -:10742000B488BCAA3EF60B1763ED34B9D82ED74EFC -:10743000FCB0450CDFD70251414DB14DA44DA41510 -:10744000514AD36119E4DC0F3D11CF90A3FE4C7B70 -:10745000C431FF4B7E23F6447FCB0CDC8FEB20B591 -:1074600008673F27A1CE86316CCC03D502280E13C6 -:1074700061F39CE8C71C8F8CF743D1C49F7D3ED538 -:107480000527B0EBF46B33226D47F1612C08A27F26 -:107490003F4346B8A2A7FC99F73E8B45B3319FD036 -:1074A000E8B61B33C9FD128B64ABBF23CF0C8AB285 -:1074B000EF98E75A346D0D5C52B7C8B55C3B6683F4 -:1074C00038603AB42F601A9DCB5A71D714979F3306 -:1074D0003AC4CF437FEC6F8527404CD950ECEC7712 -:1074E0009F1BB7C97B817E3CB26F2D208AA2A2660A -:1074F00068377B041BCBEF6240A8902B2DFDC81191 -:107500006319FCC5BA353C02ECA172E4051300FF17 -:107510000E0141207C07F13C7A0686714520C3FCB0 -:107520003558090483EC804ABF226A4A1C11A7A07F -:10753000C70035AA4054C2295C34102EDB829CE07F -:10754000C194900C194045E8005578516A16A2CABA -:107550002D42D4580AA8224442238020C863962A88 -:10756000E6082AC11430FBFD3D284825F2504CBFE7 -:10757000FF3F9FCF07F2943412FF28270FBFC03F71 -:107580009C1C9C24CFC37E32E4A435AB00200000B9 -:10759000000000000000000000010200040820407C -:1075A00082040102108108001000000000000000A9 -:1075B0000408020420081008210081010410102092 -:1075C00008410408481020210010212040820400B6 -:1075D000204000000000000000000000000000004B +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E50000000000000000000000000000000000032 +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E900000000000000000000000000000000000F2 +:106EA00000000000000000000000000000000000E2 +:106EB00000000000000000000000000000000000D2 +:106EC00000000000000000000000000000000000C2 +:106ED00000000000000000000000000000000000B2 +:106EE00000000000000000000000000000000000A2 +:106EF0000000000000000000000000000000000092 +:106F00000000000000000000000000000000000081 +:106F10000000000000000000000000000000000071 +:106F20000000000000000000000000000000000061 +:106F30000000000000000000000000000000000051 +:106F40000000000000000000000000000000000041 +:106F50000000000000000000000000000000000031 +:106F60000000000000000000000000000000000021 +:106F70000000000000000000000000000000000011 +:106F80000000000000000000000000000000000001 +:106F900000000000000000000000000000000000F1 +:106FA00000000000000000000000000000000000E1 +:106FB00000000000000000000000000000000000D1 +:106FC00000000000000000000000000000000000C1 +:106FD00000000000000000000000000000000000B1 +:106FE00000000000000000000000000000000000A1 +:106FF0000000000000000000000000000000000091 +:107000000000000000000000000000000000000080 +:107010000000000000000000000000000000000070 +:107020000000000000000000000000000000000060 +:107030000000000000000000000000000000000050 +:107040000000000000000000000000000000000040 +:107050000000000000000000000000000000000030 +:107060000000000000000000000000000000000020 +:107070000000000000000000000000000000000010 +:107080000000000000000000000000000000000000 +:1070900000000000000000000000000000000000F0 +:1070A00000000000000000000000000000000000E0 +:1070B00000000000000000000000000000000000D0 +:1070C00000000000000000000000000000000000C0 +:1070D00000000000000000000000000000000000B0 +:1070E00000000000000000000000000000000000A0 +:1070F0000000000000000000000000000000000090 +:10710000000000000000000000000000000000007F +:10711000000000000000000000000000000000006F +:10712000000000000000000000000000000000005F +:10713000000000000000000000000000000000004F +:10714000000000000000000000000000000000003F +:10715000000000000000000000000000000000002F +:10716000000000000000000000000000000000001F +:10717000000000000000000000000000000000000F +:1071800000000000000000000000000000000000FF +:1071900000000000000000000000000000000000EF +:1071A00000000000000000000000000000000000DF +:1071B00000000000000000000000000000000000CF +:1071C00000000000000000000000000000000000BF +:1071D00000000000000000000000000000000000AF +:1071E000000000000000000000000000000000009F +:1071F000000000000000000000000000000000008F +:10720000000000000000000000000000000000007E +:10721000000000000000000000000000000000006E +:10722000000000000000000000000000000000005E +:10723000000000000000000000000000000000004E +:10724000000000000000000000000000000000003E +:10725000000000000000000000000000000000002E +:10726000000000000000000000000000000000001E +:10727000000000000000000000000000000000000E +:1072800000000000000000000000000000000000FE +:1072900000000000000000000000000000000000EE +:1072A00000000000000000000000000000000000DE +:1072B00000000000000000000000000000000000CE +:1072C00000000000000000000000000000000000BE +:1072D00000000000000000000000000000000000AE +:1072E000000000000000000000000000000000009E +:1072F000000000000000000000000000000000008E +:10730000000000000000000000000000000000007D +:10731000000000000000000000000000000000006D +:10732000000000000000000000000000000000005D +:10733000000000000000000000000000000000004D +:10734000000000000000000000000000000000003D +:10735000000000000000000000000000000000002D +:10736000000000000000000000000000000000001D +:10737000000000000000000000000000000000000D +:1073800000000000000000000000000000000000FD +:1073900000000000000000000000000000000000ED +:1073A00000000000000000000000000000000000DD +:1073B00000000000000000000000000000000000CD +:1073C00000000000000000000000000000000000BD +:1073D00000000000000000000000000000000000AD +:1073E000000000000000000000000000000000009D +:1073F000000000000000000000000000000000008D +:10740000000000000000000000000000000000007C +:10741000000000000000000000000000000000006C +:10742000000000000000000000000000000000005C +:10743000000000000000000000000000000000004C +:10744000000000000000000000000000000000003C +:10745000000000000000000000000000000000002C +:10746000000000000000000000000000000000001C +:10747000000000000000000000000000000000000C +:1074800000000000000000000000000000000000FC +:1074900000000000000000000000000000000000EC +:1074A00000000000000000000000000000000000DC +:1074B00000000000000000000000000000000000CC +:1074C00000000000000000000000000000000000BC +:1074D00000000000000000000000000000000000AC +:1074E000000000000000000000000000000000009C +:1074F000000000000000000000000000000000008C +:10750000000000000000000000000000000000007B +:10751000000000000000000000000000000000006B +:10752000000000000000000000000000000000005B +:10753000000000000000000000000000000000004B +:10754000000000000000000000000000000000003B +:10755000000000000000000000000000000000002B +:10756000000000000000000000000000000000001B +:10757000000000000000000000000000000000000B +:1075800000000000000000000000000000000000FB +:1075900000000000000000000000000000000000EB +:1075A00000000000000000000000000000000000DB +:1075B00000000000000000000000000000000000CB +:1075C00000000000000000000000000000000000BB +:1075D00000000000000000000000000000000000AB :1075E000000000000000000000000000000000009B -:1075F0000000000000000000010200842010841040 -:107600008108420021004084040820408204008850 -:1076100040F7EF16FECDFF73C2FCF9DE1EDFC7FF99 -:1076200093C1ECF30F37FFCFB710FB0CFF3F3E7752 -:10763000C3FFF01FF8FBFA07FF43D0C3F1000C0BA8 -:1076400000080FFF2040045040198C426C50026C1F -:107650000000000000000000004A9000040200004A -:1076600000003000000000000000000000000000EA +:1075F000000000000000000000000000000000008B +:10760000000000000000000000000000000000007A +:10761000000000000000000000000000000000006A +:10762000000000000000000000000000000000005A +:10763000000000000000000000000000000000004A +:10764000000000000000000000000000000000003A +:10765000000000000000000000000000000000002A +:10766000000000000000000000000000000000001A :10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA :1076900000000000000000000000000000000000EA :1076A00000000000000000000000000000000000DA -:1076B00000020000000000000000000000000000C8 +:1076B00000000000000000000000000000000000CA :1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A -:1076F0000000000000000000000200000000000088 +:1076F000000000000000000000000000000000008A :107700000000000000000000000000000000000079 :107710000000000000000000000000000000000069 :107720000000000000000000000000000000000059 @@ -238362,149 +238362,149 @@ :102DE00000000000000000000000000000000000E3 :102DF00000000000000000000000000000000000D3 :102E000000000000000000000000000000000000C2 -:102E10000000000000000000000000000000046846 -:102E2000410000468411112664499992666499997B -:102E3000044441111044441111044441111044440C -:102E40001111044441111044441111044441111062 -:102E500044441111044441111044441111044441EB -:102E60001110444411111004411010444411110474 -:102E700044411110444411110444411110444411BF -:102E800011044441111044441111044441111044EF -:102E900044111104444111104444111104444111DE -:102EA000104444111104444111104444111102CD45 -:102EB0000001002C009201040380A1C04800D284CC -:102EC0003FED4880B3FF28527F008400A2C145082F -:102ED000810425848123000B8452A212FF0A20233F -:102EE000E0E80087040045A9211924069009168C02 -:102EF00010222D001A24065A0916825A04BC811782 -:102F0000840D1280A42C24211217424480A17492B3 -:102F100024050B8D491002201C08041C88A5109163 -:102F200008142208890240923614D488104445952A -:102F300040004882400000011000A040208204119F -:102F400008004074808449094080409123A41422E1 -:102F50000102030E9004881092049209C380102C81 -:102F600048E90048880922082082363C180090F081 -:102F700044105FE108088A28801114630703DC48C5 -:102F80004210D0405D0629348584B25240612E093A -:102F90002089932219B018D018610A4CC000580536 -:102FA000C01241000AB20018E610084447BE105A89 -:102FB000002030208200010282D4005034008302BD -:102FC000A10620620C10C40624C20C40C4181C08C0 -:102FD0000417E1A0E08FF8310807BE90000C87E0ED -:102FE000104000041020000F6437BC40C03009902E -:102FF00007BC220F46A020402C7801082C4051210C -:1030000097801480102C062FD0424C900120B004E1 -:1030100010401728840208900234C03A0469E11E67 -:1030200000C007200004114002450A06C2A49028EF -:103030009410A400220200000012082400220020A4 -:103040000000010008C602000A08840004000828E5 -:1030500010C600262A102C08C280000848840000F0 -:1030600088005094A8FAD4128D4EA2C1945C0459E1 -:1030700000020000000000000000000000001080BE -:1030800010080204803C0022088100101F0002800A -:1030900000105C00240100F8108C000000001008F3 -:1030A0007400C00430400144C0022028801C041C6D -:1030B000620C980109048B880C80001F02C1A0805B -:1030C0001408C18022E30320A007020C4001200263 -:1030D000A008803A000226C2002C1A9C10E00F299A -:1030E000A1C654050100800000026800239B00195E -:1030F000800000000431DD000445DD03038C68809E -:103100001B00813221414062372C2041A0E0CF409A -:10311000580014C80322200000C00019610A0B6087 -:103120001088150C1CD00007309ED00C59000205E9 -:10313000C000DECCA10000144004401000B3002801 -:103140000485CDD012F0020008000A0000F4EC372C -:103150003731CFC9D0B096F45C241400050050017B -:10316000081D000041033802E6A40009001982F39B -:10317000A2756C934800790453802B44FB9B010D8E -:103180008108A03E5092341725040C43F6180FEB2B -:10319000114BC7F4D3E02080040004005782C01014 -:1031A00043FD00048090E104049B122240C0E6D05D -:1031B0002000B1210A400591339A40B080039B4022 -:1031C00018000B58200C04250000A11BB0080302B6 -:1031D00046CC10010B9C9CA200000385232A0C0006 -:1031E0000030100A8600970828141080460000045A -:1031F000884268172C8952D003808061300508D03E -:10320000801040C5E820D78AA9631794555E05FB56 -:10321000C28573A8DCCCAC1A4E0DEA60A140868F43 -:103220000D614A14D000E400300CD40C2C5110086D -:1032300046C00A004C4142565C002A00000EF2E2F1 -:10324000499C0C5A2840081342B414315B18C5C17C -:103250006AD1BD685D73155E8E4251C2F056661A22 -:103260005B02B6B00710BE7A0B6C473530D66C6681 -:103270009A0CC442AB82935C4DA332574D806338A5 -:10328000985E531C0084F49368ACB08121010894CB -:1032900081ED2052AA124A4041504A10802009D59F -:1032A000026263031004E2181605804090081019AA -:1032B0002846CF7822A03408E014000C6CF00000FF -:1032C000F5BF200B013C33899005080020C0901009 -:1032D000080800230408024140560042002A138FC8 -:1032E000535226080C942980083D01003081313862 -:1032F00062046052C20481802842C075802FC47865 -:103300009C013B4EB1E0DAE8C98135200456C00883 -:103310008480C91B3500145071488A82089F00447C -:103320000237D821522843818F7144400004028023 -:103330000C0442000821A0001D0B024104809800EB -:103340000109808100999010842BB040053208005B -:10335000150C16760207010C68E54433420080F232 -:10336000C364A941081C05604030CC28F0004141ED -:10337000000062200D01005905240062A0654A008A -:103380001003A00307E02340200080C1108000F05C -:103390002820100000829E2865490AF0831C5000F6 -:1033A000087BC20D60003010B000C6020190013FE2 -:1033B000619CC06FF425610D20E35124D8111138B0 -:1033C0000028B00080240000A0000000103051A2AE -:1033D00034EA800200001400003C64828000000097 -:1033E0007C003D00024C128F8C001E08800C0900EE -:1033F0008004D19C19C009018195884CF02C54435C -:10340000624018D880951D0108220200008000004B -:1034100091810401026000F0000080430160208877 -:1034200040061106080261A87E5318E7CC08000880 -:103430001008130000004700B86C18960F088200AF -:1034400021104842231F84C81FA29EEC13421C1D5A -:103450000EFF9087B0D1482913084D8002249400B4 -:10346000222800180282101EA81C430A52437ABC6C -:10347000267D07E24249922C2404882060099B6142 -:103480002D747D9913260F79D04F0C44CC26580CFF -:1034900008904CC86581008984CCB2581011150180 -:1034A0002184842004E8610000100012A006F012BC -:1034B00010393A4F720039142A2018BD020AF0411F -:1034C00040EE902E3983BF337D302F9D217DC23C4D -:1034D000F0EDC46D260B9BC18AA002CC9F42250251 -:1034E00000000000001042000800A941382009092E -:1034F0000C8D40010000144443112800402100C0FD -:1035000051C202FF0E0E21087C00000502000201DC -:103510000020800401400004134C00501622820257 -:10352000090105108408102000120000DC000509C4 -:10353000910285408194D40F1D20424A02C8380D63 -:1035400001101A01A0320340D90622C40A208020AB -:10355000D0608022460020410030F3803C88402922 -:10356000F1838887791E1FCC0072442414FF01C4A4 -:103570000FB8B01C1C888E047502A912092C01001A -:1035800004230084200810408104080044810224A0 -:1035900024482040820401021081080410021020F7 -:1035A00008404481040802042008104821008101D9 -:1035B00004101120084104084890202110112120F6 -:1035C0004082040020400204102241022010200802 -:1035D00042102042420204082040008104081040AA -:1035E000800408204082040020409084010200846E -:1035F00020108410810842012110408404082040DA -:103600008204008840268E007E04121383A48C4816 -:1036100033908428D0C33840001DC80033E0D20066 -:10362000CA743320832403406C4209044601C1C09C -:10363000F0004020051C4C00704110C104038C8F29 -:10364000B490006000000000000000000010A00026 -:10365000000000000000200000000000000000004A +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF00000000000000000000000000000000000D2 +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0000000000000000000000000000000000001 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000000000000000000000000000000000C0 +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:103040000000000000000000000000000000000080 +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000000000000000000000000040 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C0000000000000000000000000000000000000 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:1031000000000000000000000000000000000000BF +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:10314000000000000000000000000000000000007F +:10315000000000000000000000000000000000006F +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:10318000000000000000000000000000000000003F +:10319000000000000000000000000000000000002F +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D00000000000000000000000000000000000EF +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000000000000000000000000000000000AE +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000000000000000000000000000006E +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:1033100000000000000000000000000000000000AD +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:10342000000000000000000000000000000000009C +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000000000000000000000000000005C +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A000000000000000000000000000000000001C +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000000000000000000000DC +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000000000000000009B +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:10356000000000000000000000000000000000005B +:10357000000000000000000000000000000000004B +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A000000000000000000000000000000000001B +:1035B000000000000000000000000000000000000B +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F00000000000000000000000000000000000CB +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:10363000000000000000000000000000000000008A +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A :10366000000000000000000000000000000000005A :10367000000000000000000000000000000000004A :10368000000000000000000000000000000000003A :10369000000000000000000000000000000000002A -:1036A0000000000000020000000000000000000018 -:1036B0000800000000000000000000000000000002 +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A :1036C00000000000000000000000000000000000FA :1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000020000D8 -:1036F00000000000000000000800000000000000C2 +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000000000000000000000CA :1037000000000000000000000000000000000000B9 :1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 @@ -238518,139 +238518,139 @@ :1037A0000000000000000000000000000000000019 :1037B0000000000000000000000000000000000009 :1037C00000000000000000000000000000000000F9 -:1037D000000000F54A00007C0002100168800080B3 -:1037E0000968D680000440008000200300038000A8 -:1037F00000830C3800002DCD8F239002280800286C -:10380000FF000003E020064700B80083002A4C00B8 -:10381000000100800002010002000002000080029E -:10382000000080000001800180008004000044004E -:1038300020000020010000001000032401B83C001B -:10384000007B719B08A006003BC61B8240102F0C1A -:10385000204408524012AC424000008062122244D0 -:103860002AAE157443C052859C1A8A0C40039AC133 -:10387000542C00D40E6A08D0B00110012B161E0281 -:103880009411E68431EF29518521F2AAE8AE800037 -:103890000A8A5403544400290C52C40DD0D1E000CC -:1038A000840108000002200000490B4A445242D81B -:1038B000E014900C70CE3C6163442620000A420064 -:1038C000001718E83E187DC0140204008D383054EB -:1038D0000803508FFC28B428A28A89801D24001078 -:1038E00012000153A1C2B82B85085702B853857046 -:1038F000578A38AE002061AA6CA8782B7448C5009E -:1039000036E4821C1556804CB00000012412104091 -:1039100040000890010417120200205848200109B5 -:10392000040097408200A4A015040188514080DA69 -:10393000BA38250152600250A04A392084902347AA -:1039400088B6D52C5602B1D0000040850008001082 -:1039500040211400442400498DF00400C860000890 -:103960000580002E7068E70008C0B302800875E685 -:103970001BDF0996C08388192A1A76C942834EB87C -:1039800000501C0DCA95B090AC49143A99028BC1F5 -:10399000345401100012400000000000000000003C -:1039A0000002820800903C9006C4F20200604D20A4 -:1039B0002046A1723B40020C1F700A0930185CC8F7 -:1039C000D00048082DB1A5505C0E084D8B4CB06658 -:1039D0002C8549052B0010C35AE000491BEE0F410E -:1039E000225328BB4B09530E001126F82BD00B583D -:1039F000C8EA13688424B116D804EC8050000DE0A6 -:103A00000FDB44C2100410D2C232438A2F52CBB40F -:103A100022B200888839B1B0105D4B30124D4B6234 -:103A2000A51C17601589C22BB225C030AA26720EBC -:103A30008952ABCC030B35B08ABEF3FC803E030049 -:103A40000849AF91600C0F5A35B6CAA5616954494F -:103A5000300FFE4ABE010114602D0F388398A29EDC -:103A6000B8961A2B9C035962A1ACE9232413C7F81A -:103A70000194A46D6D07594B63802558E0030FFE38 -:103A800048910042C040512F9280C341ACEC7F5A14 -:103A9000362B09A8E1C1F0B48318C203F28095E087 -:103AA00056B60C134F82D0E3D074CE31438C45F020 -:103AB0005A90260124800300810744000821B48223 -:103AC00032106A24098024800004D25484FDAA356F -:103AD000D0003F41C268B008081B002220FED09BE6 -:103AE0008800FD04284100200147008C0411012DAD -:103AF0001000010C8A886021E22009400820C08063 -:103B00006347A0441302B0801050022CC5612018F6 -:103B10008A5801395407001008010292CB903C06E4 -:103B200005AA4C0210840C102C05000090400000E7 -:103B3000BA00200003CC007DD4C603080A089840D0 -:103B4000884C6A303C28401122FB48CB4412228228 -:103B500041A20330280631D981A6210888B6C415B0 -:103B60006D4000119C8066F01339002E10A3A03523 -:103B7000D827C4000230040002081DF242EF33FDD2 -:103B80002810460C948E00D349CCB4060B2C003C74 -:103B900022302802841514CCE073AB001AC40E2026 -:103BA000C113C005AC81E105540FA3F23A400BD616 -:103BB0002B8040FD024344777F0F5F0005501400C7 -:103BC00008010290043402011002601044411020E8 -:103BD000040C4000028008200081200D40180008DD -:103BE0000100200094AA00018150112C40172C09DB -:103BF000524F65409580141415F983B350493854D9 -:103C00009C095A8249008828012108E082419001DC -:103C1000008010024786020260280028000A4484BF -:103C2000810500200808294494206B4802561F8A09 -:103C30000F620290D42002081D825F4002A4281067 -:103C4000004C801480100000423104040901041467 -:103C5000009024C0015E63C580A0CB2BA3025361FA -:103C600026E01340000100500014000842168A09A3 -:103C7000828038F402053988080100150031121DD0 -:103C8000454159802400200A00A040080028144221 -:103C9000AA2CE3012103B0E8B92802400C48806156 -:103CA0007C60F8109840A291142481400082C8D909 -:103CB00042AA9002EA06B106C8C242E02A040D05F3 -:103CC000C93420492815173F0280727212009B46A2 -:103CD00003204113808974454C30A1CA0422A6B048 -:103CE000517E02018083922400C8A52E13C58B82C9 -:103CF000EA8862DC226A09FE31C5C0D4B109C880F5 -:103D00005B400404A95009F70454337AB848751E7F -:103D100084842A00002450900900082082208842D0 -:103D2000800801001411040408000D004805120069 -:103D300000175A1C048987812008B86A008400157E -:103D40004045240000000004080045005A150261A7 -:103D50004149014900490005104886000788F7904D -:103D60000011CF9C616E947DC8320B4B9523FCB043 -:103D70001F8B03C089A800C740273D27A1CE8630EE -:103D800064CCD3D134C084CF63F52CEB00008E809B -:103D90006273D4C03B253E75050EB0EBA4233116EB -:103DA000FD42AE03F600A02A394306ACA2A3FC995B -:103DB000F73A810093319F50A8120933C9F5028167 -:103DC000242A8A210E088A906F90A208142C855507 -:103DD000501508A54C00748C081062B00540038093 -:103DE000005611C0408FAE0CF8C7307327FC01F9A4 -:103DF00018000AA443E00011221C9540C011462877 -:103E00002C0108208220A02008594A092C0CBB4212 -:103E1000400890022150802063095001B8002040E2 -:103E200070B26274091A08FF0E0243047C07F000A6 -:103E30006E00000100206000000C000000B4004A89 -:103E4000A9002000040080204C0215024000404FD1 -:103E5000480A4028F900046080000000000004C007 -:103E6000000140500A00A00A014014000028000090 -:103E70004A00000018009726400C0B510000000576 -:103E80003DE80CE5F0D440BFFA3E9FC183F2F40058 -:103E900072FF2A218FBD101E9C0C91040BCA481082 -:103EA000A5C0350000000000000000000000000078 -:103EB00000000000000000000000000000000004FE -:103EC0000002102008404081040802042008100865 -:103ED000210081010410102008410408481020210D -:103EE00000102120408204002040020410204102E2 -:103EF00000102008421020404202040820400081A7 -:103F000004081040800408204082040020401084EF -:103F100001020084201084108108420021004084A6 -:103F200004082040820400884000000000000000D7 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000000000000000000000000000C9 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000088 +:103840000000000000000000000000000000000078 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880000000000000000000000000000000000038 +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C00000000000000000000000000000000000F8 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000000000000000000000B7 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:103990000000000000000000000000000000000027 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000000000F7 +:1039D00000000000000000000000000000000000E7 +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A100000000000000000000000000000000000A6 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A50000000000000000000000000000000000066 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A90000000000000000000000000000000000026 +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD00000000000000000000000000000000000E6 +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000000000000000000000A5 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B50000000000000000000000000000000000065 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000000000000025 +:103BA0000000000000000000000000000000000015 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000000000E5 +:103BE00000000000000000000000000000000000D5 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20000000000000000000000000000000000094 +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C60000000000000000000000000000000000054 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA0000000000000000000000000000000000014 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE00000000000000000000000000000000000D4 +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D20000000000000000000000000000000000093 +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30000000000000000000000000000000000082 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB0000000000000000000000000000000000002 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 :103F30000000000000000000000000000000000081 :103F40000000000000000000000000000000000071 -:103F50000000000000000000000343FF01100440C7 -:103F6000543B3B0E278000EC0000000000000000E6 -:103F7000005AB00004020000000030000000000001 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 :103F90000000000000000000000000000000000021 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 -:103FC00000000000000000000002000000000000EF -:103FD00000000000080000000000000000000000D9 +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000000000000E1 :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 -:104010000002000000000000000000000800000096 +:1040100000000000000000000000000000000000A0 :104020000000000000000000000000000000000090 :104030000000000000000000000000000000000080 :104040000000000000000000000000000000000070 @@ -239971,8 +239971,8 @@ :1092700000000000000000000000000000000000EE :1092800000000000000000000000000000000000DE :1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE +:1092A00000000000000000000000001000000001AD +:1092B000000000111004444111104444000000005B :1092C000000000000000000000000000000000009E :1092D000000000000000000000000000000000008E :1092E000000000000000000000000000000000007E @@ -239980,139 +239980,139 @@ :10930000000000000000000000000000000000005D :10931000000000000000000000000000000000004D :10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD -:1093C000000000000000000000000000000000009D -:1093D000000000000000000000000000000000008D -:1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C -:10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C -:10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C -:1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000000000003B -:10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB -:1095C000000000000000000000000000000000009B -:1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A -:10963000000000000000000000000000000000002A -:10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A -:1096D000000000000000000000000000000000008A -:1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000000000000B9 -:1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 -:109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000000000098 -:1098D0000000000000000000000000000000000088 -:1098E0000000000000000000000000000000000078 -:1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 -:109940000000000000000000000000000000000017 -:109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 -:1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 -:1099B00000000000000000000000000000000000A7 -:1099C0000000000000000000000000000000000097 -:1099D0000000000000000000000000000000000087 -:1099E0000000000000000000000000000000000077 +:10933000000000000000000000000040480800405D +:10934000000200012080008000208000000000005A +:10935000000000020000000000000000000000808B +:1093600000010000000000000000000000000000FC +:109370000000010000080000000100800002010060 +:1093800002000002000080020000800000010002D4 +:109390008000040000004000000000000000000009 +:1093A0000000000000080400002000000004000885 +:1093B0000100000000100400000000104010000434 +:1093C00040000000001002002490248041804004EE +:1093D00008000208000108804020000004200080EE +:1093E00080000000090410008010420410080000F2 +:1093F000040092EBC8BC80000B8010014400000107 +:10940000040084088011200084010800000000008E +:109410000000081200000210400000082044000074 +:109420000080000000080000001000E800105D400F +:1094300010000000801800000003100A0000100057 +:1094400000080000000400101000010020020020AD +:10945000040040020040040040080880000060282A +:10946000608000210008C50002C48200175E800CE5 +:1094700090000001241210404000089001000202F8 +:10948000020020400020000804000000820000804C +:10949000140400805040005008202000502200009A +:1094A000802A08028010200200BED12C460231F032 +:1094B000000000000000000040409010400000004C +:1094C0000041100440040000000000A4000040001F +:1094D0000000028000880480000008000080000076 +:1094E0002A32240842800808102006000800009054 +:1094F000A8481012090292801444210002420FF67B +:10950000C2A00C08103A0040B512080C00813C00C3 +:109510000000F20200C049204006A1723340820CD4 +:109520001D300A0B301858C8D000C80A2D31A5507C +:10953000140C0040812400220004080420001003C1 +:109540005AE010491BA60D41625328B34B0953063C +:10955000041166E82B500D58C8CA12688464B1160D +:1095600098006D80800009802FDB4496520610D24F +:109570008033430A2D12CB342AB2008A8839313025 +:10958000305F4B3032474B42012816201101C0A2F8 +:10959000A20350202224020090529E50010031B0BC +:1095A0008A2AA018001E000088C9299100080748CF +:1095B00035B4CAA56109544912001E4AAE0101041E +:1095C00020680D388318A29A18961A2B1803594050 +:1095D000A18C6923241186981195A46D6D0F594BA8 +:1095E00063806458E0030F2E08110048C460432FC5 +:1095F0009280C101ACEC355A262B0988E0C130B409 +:109600000318C181F28191C046B6020303948063BE +:10961000D075C631418C0C4052102401201002013B +:1096200081040400010004041A00D000290004028F +:109630000040A04400920200C080A49042009081AB +:10964000092000000292402580029240390000006B +:10965000010C000000000019102011000A00200079 +:1096600000000800208000006100001000023400AB +:1096700000000A08048000008A0000185425803881 +:109680009A41A313CC900C00002208021080002AFB +:109690000010084190C0A8089021220403CC8275D4 +:1096A000D4C40700000A888090C46A043CA8C01192 +:1096B000227148494012220240A203102002108960 +:1096C00081A6200888824404000000019C8066F086 +:1096D0001131012E01E3A0335827C6008232000069 +:1096E00020041DF202EE33FD2090460C958E009072 +:1096F000C10CB40603080034001028020414344CD2 +:10970000E073AB001AC40EA04101C0048C81410576 +:10971000540DA3D23A4009D2290040BD0240043280 +:109720007E024A00055000000000111000A0200138 +:109730001442401048020420040CC00002290820F2 +:109740000001200C0030080A9310000094AA064083 +:109750008400000000140804050000200000000040 +:10976000000A0001000000400208108241000028A9 +:109770000000088000000000008010004204000289 +:109780004000000000024104800500200800294C30 +:1097900090206A480204130204620020C4080208F0 +:1097A00013001460008008000048020480000000DC +:1097B000002000000100040400800080010C43D45C +:1097C00000208000810201410280100000000000A2 +:1097D000000000000002800002001830000C200091 +:1097E000400102011010821DF100198000003008B4 +:1097F0000080000000200402A82CE2010800A0E084 +:10980000382000400000022000A000003300E0C02B +:10981000142001400000804000804000A80010009B +:10982000008000002000000001000009081507006A +:109830000200100010000A000000001102884045DC +:109840004020004A002282200110080040019101BE +:109850000400040000400000000000002068002216 +:10986000000000000000000008A000000800010146 +:109870000004924A00805008E00428000024509020 +:1098800009000800800088008000810010010000AD +:109890000000010008000200001000000081040127 +:1098A00004081C080000021000442000000200040C +:1098B000080041005A1102414108210820082000F7 +:1098C000004000000180800000000C00228A04108B +:1098D000040000480022D400120200C008A800853D +:1098E00000273C2781CE063024CC03C000000403AF +:1098F00060210C2802000E000242D0001A242641EA +:109900000106B0EBA42311026C000001240020002A +:10991000250206288223CC99F73A010093319F4013 +:10992000E0920933C9FC1201240A8A210E008290B8 +:109930006F902208002C0414101508A14C0064003C +:10994000006020B00000000040401044000008000B +:109950000800000125600580060008004020001175 +:1099600002008540408006040001000000008000E5 +:10997000001052000800A94000000000050000008F +:109980002000100080002000402000400002000065 +:10999000000000000007F0000000000100200000AF +:1099A0000000000000040000000000000000002093 +:1099B00004000400000000000004000891000040C2 +:1099C0008000000000000000000100400800800846 +:1099D00001001000002000000A000000100000003C +:1099E000000800010000000000000000000000006E :1099F0000000000000000000000000000000000067 -:109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000036 -:109A30000000000000000000000000000000000026 -:109A40000000000000000000000000000000000016 -:109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000000B6 -:109AB00000000000000000000000000000000000A6 -:109AC0000000000000000000000000000000000096 -:109AD0000000000000000000000000000000000086 +:109A00000000040001020800800011AB00210000EA +:109A100000000040810408004080000400000000B5 +:109A20000000000000000000200000000000C081D5 +:109A300000000000000000000000000000001020F6 +:109A40000841040848102021001021204082040011 +:109A500020400000000000000000000000000000A6 +:109A6000000000002000008104081040800408204D +:109A7000408204002040108400000000000000002C +:109A8000000000000000000000000000000000884E +:109A900040925022014E8D3001B0240527248922A6 +:109AA000439270DC413C2805348079007201221217 +:109AB000028A0380282406020800C0C0F100089C26 +:109AC00000080C00200000540534C406E4C000C4A3 +:109AD00000000000000000000008900004000000EA :109AE0000000000000000000000000000000000076 :109AF0000000000000000000000000000000000066 :109B00000000000000000000000000000000000055 :109B10000000000000000000000000000000000045 :109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 +:109B30000002000000000000000000000000000023 :109B40000000000000000000000000000000000015 :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 -:109B700000000000000000000000000000000000E5 +:109B700000000000000000000002000000000000E3 :109B800000000000000000000000000000000000D5 :109B900000000000000000000000000000000000C5 :109BA00000000000000000000000000000000000B5 @@ -241296,139 +241296,139 @@ :10E5400000000000000000000000000000000000CB :10E5500000000000000000000000000000000000BB :10E5600000000000000000000000000000000000AB -:10E570000000000000000000000000000000007427 -:10E58000020000849037BF0C48898981C948820EF7 -:10E59000001440138000E0C200000E49CE8000004D -:10E5A000000020CC00019102284800240008E4E08B -:10E5B00000FC05201CA00414601A1401302197826D -:10E5C00004032F0003C0011E0447811E00058000C4 -:10E5D0007801E8038800DB0E0400411112000808EE -:10E5E000881000448440015C000804018878022CF3 -:10E5F000506BE8378388DBA1D0382F040047013205 -:10E600004012B0004000000B12105484B4D0268099 -:10E61000824062763C12CE0BA98792B1D3B030967D -:10E620001E4D409EC29518211F15B8048B80E4C46E -:10E63000930B00110122B34D00D000300D0454E0C3 -:10E6400054FC00A10D168048901FC0000409290148 -:10E650008C63F10CFC1E2C2E8E94A31648A52A1B4D -:10E6600025C5A3531A347BF320820D000245A00078 -:10E670004030C10000001188A2412AA5013A513B57 -:10E68000E46DDA2DB6C35FD282D473D03D67877F45 -:10E69000334EE8EE9D21DD0EE9D29DD0DD3B093AF7 -:10E6A00048BBF0A3F0C8BD219580840204248200F9 -:10E6B0001A680524316030D1241252C155C068B89F -:10E6C000338227E2022462F18422321C850C44202A -:10E6D000822090A031640028517898355C262AC0A9 -:10E6E000B581E0B098B62E0F40694043F00187191C -:10E6F0001800C0028530A1861408004A40B13413C6 -:10E700001603800D1941DE103220324841E140707D -:10E71000402D1735C5014E62343C0E2828034908A8 -:10E7200081D85044AB14348E46908C48032818523C -:10E730000C24A2D2F84E123249038EF13F4400510C -:10E740003FD34FFFF3FFFCFFFF3FFFCFFFF0E3346A -:10E750005228024980080003440C1206D088400069 -:10E76000440000B1064E00081008A0032100000874 -:10E7700026408A00100008508200B07B00854805C2 -:10E780002B0011C12C08001C08C9C001026134C44F -:10E79000001C6109C00102303400020841110080F0 -:10E7A00088C1C2132002258052783AAC0004C4000C -:10E7B00001C800004A00844050424C403292013D62 -:10E7C00082C2424060D3490060CF499227DCA14316 -:10E7D000338880E66067782762267040D2419A705D -:10E7E000001B1482066373E42821FF00200FDF035F -:10E7F000102C0F791499050520285808303FE28025 -:10E8000091F200043500301104240030A092252C30 -:10E810002401494110A0004401404247B097A4257B -:10E8200025014949C4A00C740148000004A22291AA -:10E8300000A08A10240E0290A5A400AD09C940A032 -:10E84000B04360DA1022424056A00358CA923319EE -:10E85000011590B274101411910516D352344E1351 -:10E86000048007088102480418234D42321048A44E -:10E8700003820A240487211EE8141202DFCFC51187 -:10E880008D6CD90E1A10CA6643135C42EF3F144CCC -:10E89000CF71F4A0847428020411010910245528B2 -:10E8A000228850B0A2402FAD24800C8021FBE45080 -:10E8B000180894403101010C4240059502508141F5 -:10E8C000004C0B010480008000002004058A4F00EA -:10E8D0004105080004010008000040003A802000C3 -:10E8E00002C400259406000801001940080804210C -:10E8F000040000100008401480000080010064A0A3 -:10E9000000182052020000000814001809400010EE -:10E910004AC0444002820B02200014100000600034 -:10E92000280000200208155243FA914020410308B4 -:10E93000300202D1910085030902035CA10000109E -:10E94000800104002003E90008800300C34C40015B -:10E95000A800E1077406A092280000A43BD0019F04 -:10E960004041189F2A0FFFC883F14C400800003235 -:10E970000434C3251008F219144510809148100181 -:10E9800008800820008620C94030AE480000A00062 -:10E990009CEA0FE10150913A142E280D414E44A1FA -:10E9A0000FC89637173D8A4FD0438862E30B5ACA87 -:10E9B000596080C820021EB70340108200F0140086 -:10E9C000DBCF840347800410000F40ACA205202455 -:10E9D000281069C494204A4850D231794FC79020FA -:10E9E0009409100C1346546000242A30111C044072 -:10E9F00000111002812905040123AA08222D308864 -:10EA00008055C3B010BCE215C382ACD3589812B184 -:10EA10002C63425261252435AD12E8CE0890ADA892 -:10EA200032650908C019001B601E12114746448058 -:10EA300014182902322C400900201431A20044038A -:10EA4000600220284C8A31E24F03323AF8BD582E3A -:10EA50009700E1606C2445D8063581C781922C016E -:10EA600039129C40ABF26004BF7C17080527F0CB3D -:10EA700018111633948275F15BB402B210040C5174 -:10EA800002A948454228028AC832846852582A425C -:10EA90004C02B1933CC2493B08CFEEE08BCCDAA3E9 -:10EAA000217D447BD37760ABFD09F94408819190C7 -:10EAB000AAA50B6B88A7B20AAC803409BB04DA9113 -:10EAC00010847C920D000CA493158863800008408C -:10EAD000851002004A0228634E8923991407FF0B10 -:10EAE000230F6D71A00000222000000573C934B906 -:10EAF000482C764EFDB0450CDFD500F1404D004D61 -:10EB0000004D001049025C40028081A820120C06D2 -:10EB1000F33A0890002B404A4023F430520A014057 -:10EB200008B80095604001002100840108004404F9 -:10EB300010500848019398CA86208008235255A097 -:10EB400002272A540400900034480210000698035B -:10EB5000EC0CA36915404AA8A0815400040282412C -:10EB600020000050282412000005028240A000016D -:10EB7000000C88428080A4521441015A0000000415 -:10EB80002202228840B0620825420E00013011C0E6 -:10EB9000140A1A09A986206125E811D10A000CE49B -:10EBA00042A1443F1302A14BDD107F10395C0E805F -:10EBB000C8923224C07D6B2D194AFB6268C0DD30DB -:10EBC0002078840002915010260232015CE07354D8 -:10EBD000491B0400000F430200000000160006015C -:10EBE000002000000410010090848002A920280861 -:10EBF0001010B38037A323E34030100050049A284C -:10EC0000B1849C418024300103400538011448122E -:10EC1000622624C24C40C498228926CC4A739000B4 -:10EC20001003942EC0420BD10020FBF900E8000035 -:10EC3000034190000501000E40007414000020C83C -:10EC40000002E201000470070BC648106608259216 -:10EC5000040100842008104081040800408102045F -:10EC60000408204082040102108108001000000006 +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 :10EC70000000000000000000000000000000000094 :10EC80000000000000000000000000000000000084 -:10EC900000000000000002041020410200102008C3 -:10ECA0004210204042020408204000810408104025 -:10ECB0008004082040820400204010840102008467 -:10ECC0002010841081084200210040840408204064 -:10ECD0008204008840DEFF3BFDCF6F33CD9CF4EF14 -:10ECE000212F8BEF43F2103DC70E6E8FF6C005CC7F -:10ECF000FF7F2D72C29AB3C9B4B7FF00FF031300A0 -:10ED000001040DD4000E8FFF104404011438714526 -:10ED10007960020400000000000000000052A00022 -:10ED200004020000000020000000000000000000BD +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 :10ED300000000000000000000000000000000000D3 :10ED400000000000000000000000000000000000C3 :10ED500000000000000000000000000000000000B3 :10ED600000000000000000000000000000000000A3 -:10ED70000000000000020000000000000000000091 +:10ED70000000000000000000000000000000000093 :10ED80000000000000000000000000000000000083 :10ED90000000000000000000000000000000000073 :10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000000002000051 +:10EDB0000000000000000000000000000000000053 :10EDC0000000000000000000000000000000000043 :10EDD0000000000000000000000000000000000033 :10EDE0000000000000000000000000000000000023 @@ -242020,295 +242020,295 @@ :10127000000000000000000000000000000000006E :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E -:1012A0000000045001000045041111111044444194 -:1012B00011104444044441111044441111044441A8 -:1012C00011104444111104444111104444111104FB -:1012D000444111104444111104444111104444117B -:1012E00011044441111044441111080441101044E8 -:1012F000441111044441111044441111044441119A -:101300001044441111044441111044441111044487 -:10131000411110444411110444411110444411116D -:101320000444411110444411110444411110444437 -:1013300011110340480181002000202121C823F21F -:10134000102080100001842401FE0002000410809F -:1013500010002040000A00800E05024044000000FA -:10136000F00009020000408700004F00039DBC060A -:10137000C23D988E3C7331001BFE07E20FF883E2FA -:1013800004BA811704093F83FC2C7FFF3A174FFFF3 -:10139000F3E17CFFFF3F0BCFFFF007BC01FD3E9068 -:1013A00001CFF0000000000001000003FC10599E76 -:1013B00032F7CFFD90005C4648000000800002003C -:1013C00020810408098F438438B220000B0748802D -:1013D0001C2065911D20407080A0044D4004004FEA -:1013E000CC11C20C05480A00443C020810811720A9 -:1013F000B80053F0450430FB01028A48A211146B77 -:10140000AE13FF4210832010E1380800000A0210DA -:1014100050028008280040818408E3201469005DA0 -:10142000C31000927E12594C5E300418F102000085 -:1014300042F91002E0000000000800001F10D6A8CA -:101440000D4D000000000000000200000000000040 -:10145000000002800369A02C2088303D0005AF9079 -:101460001A0CD7E41041400C92050803F63FFE4ADF -:10147000F0208BD4693B0207C7B4000010FA440087 -:101480001F800003EFAC0187140F82A7D04000D764 -:10149000E62043807020010482B20809083220004F -:1014A00010D0110162C316C00924003012458A8091 -:1014B0004294B00052101480A002002000021834A0 -:1014C0008A0681810C12001A620000034F801021ED -:1014D00000208CA0508160203C246440C080000C1F -:1014E000088000000842011D88C8311629CAAA8058 -:1014F000F4C4054D00208000000000000000000042 -:10150000000314C802940000001000A20023200071 -:10151000210000808000200820000008B25C0084C8 -:10152000620020097001C00043410440C090822045 -:101530000045300528025081703404001C0000C1B1 -:10154000104B800000004B800101170080002B5AD7 -:10155000C20000000430043800040EA2840400829B -:1015600010000F69A00344000102C8008002E000DF -:1015700032BA088C8004000018315C0018015C024B -:10158000755801901384892222718C302200410405 -:101590008840888058880181022260E000E63E0190 -:1015A00071081D40E018059915C0006570FEC0085F -:1015B000392B820CD072334C282C00128846101024 -:1015C0000017002000015D100090010818040801B8 -:1015D00001D0AC7575015D4B589294505C20194256 -:1015E0000500100028202105288000C0AF840008D5 -:1015F000000B809183F3A8902B08C9405610BD4082 -:1016000042BB04018344A07BD0423519B10184C0A0 -:101610005CF42DD1306B86E8D1E20411041004048F -:101620001790D1104B7A121582BAD02D5000401865 -:1016300020010012009005710AE041009000047C36 -:10164000100C00411880220C059C1000082080D14D -:10165000900401030A001073FC78DC2311040AE5EE -:1016600003000000A00201008402550028BC1800FD -:10167000CA0000825C4835172C895A902298527112 -:1016800008020080004A50C5E020178EC0731794EE -:10169000505E05CBC4A570A878C1A812200D884063 -:1016A000A160864105654A052224E407C00AF60EBA -:1016B0006F12881862CF080DC277605EFC89281609 -:1016C0001206E2E24F9C24521014402770B41431E9 -:1016D0005B1515C16F81A5645D7104568247C253C5 -:1016E000A057640A5002B6B201080C7B02280634E7 -:1016F00020162C62880C0442AB82055C48C7381760 -:101700004540E2BA9CDB37048A0C36933AECB98048 -:1017100025C04AB020EFD8027E135B880510000078 -:1017200005102417892811A51892D21B5384E9208B -:10173000055C001A0256CFF843A17C0CF610D00DC0 -:101740006C00C0009DBB2703833C339D8016402C5A -:10175000C2C7F330448469F8040002A172406800F3 -:101760008A3EA3CFF502003C6C8029800800010866 -:101770004000B10D420000500000248B2C32430188 -:101780008024740E88012B4E81A06F489929100087 -:1017900004524148C4009809100C145074D812EF38 -:1017A0000A5B8000A03820200C2000000102AB0C56 -:1017B00000810980052C12004020100001043B43E9 -:1017C0000280C100129480881208484210229000C2 -:1017D00073030240050036540183020C84E8003D87 -:1017E0002A0081C2EB24A90D20D88360409A4C00C6 -:1017F0007802C0432A000860280622C1074FF12161 -:1018000024200B0100818800172803C82080804015 -:10181000E0048010A8181C0AAA81F2C4E17C3F945D -:10182000CB0B411008BFA215030830737D04AF072E -:1018300011D0013E20BED05FF824004F8173F064C8 -:10184000F5B30484000480485C21000004C0100348 -:10185000241001802278826000000000023C4400D5 -:10186000280040007C001C030201120FC8005F0822 -:10187000900C79800824D39C39E203898140082D9B -:1018800079105D4218214C5C1017008480F2800AA8 -:10189000A05210204185100042685CFC01000053FA -:1018A000004608000830608C581269A0FA191AD551 -:1018B000CD8201821082130000402000B800004059 -:1018C000008C0000001820000000748C002214001E -:1018D00002121C0208A8120500956E2DD34F4FA0CE -:1018E00002A47C0001588011039B5856C0314882E5 -:1018F0004212D03004AC005A4A41526EA000880116 -:101900002009D0B02C34AD9D00A502F281490054CD -:10191000FC3F580C0A914FE8F58100A9C4FEB3586A -:1019200014584300604496C02E807800221C043274 -:101930002024702B6029214031F075A88A310520C0 -:1019400000648020000000000003003021008100BE -:10195000214D8000F00000010227C5054010000065 -:101960000280040000008048001252121804A501F1 -:101970003A004E8105854C13A1809458D517260056 -:1019800001610000000800F0000000007807F0008E -:1019900080000001002000000B200281434D400028 -:1019A0001627FF0F0D01696C2414060D80020260DA -:1019B00020008708100000E281C0E40E1E6043F2A0 -:1019C00003C120660920CC0CC1901980F8330408AB -:1019D0000A84102898040000008820022280F00069 -:1019E00000000C09E0000000781E3E00000000002E -:1019F00004F00001880000003C9EFC37D64FB33055 -:101A0000CBFC11100424088420891048910489001B -:101A10004891224444882448824481221091080439 -:101A200012021220884848910489024420891088B3 -:101A30002108910104101224084104884912202130 -:101A40002012212448824482244822441224412224 -:101A500041122408421224444242448824480891F6 -:101A60000489104890448924488244822448108480 -:101A70001122408420108410910842422120488481 -:101A8000448924488244808848640704AAC0C54128 -:101A9000C550E8803984010E82139894460B884122 -:101AA0008170E048840D04500308112DD0012201FB -:101AB0000101C1C0F0104200101D4C002000108038 -:101AC000000A020FCA80001C000000000000000095 -:101AD0000018B000000000000000700000000000CE +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 :101AE00000000000000000000000000000000000F6 :101AF00000000000000000000000000000000000E6 :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 -:101B200000000000000000000002000000000000B3 -:101B3000000000000800000000000000000000009D +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 -:101B7000000200000000000000000000080000005B +:101B70000000000000000000000000000000000065 :101B80000000000000000000000000000000000055 :101B90000000000000000000000000000000000045 :101BA0000000000000000000000000000000000035 :101BB0000000000000000000000000000000000025 -:101BC0000000000000000001004440000000000090 +:101BC0000000000000000000000000000000000015 :101BD0000000000000000000000000000000000005 :101BE00000000000000000000000000000000000F5 :101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000100D3 -:101C100000040000000000000000000000000000C0 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 :101C200000000000000000000000000000000000B4 :101C300000000000000000000000000000000000A4 :101C40000000000000000000000000000000000094 -:101C500000000000000000404A00000000020001F7 -:101C600068800081C968A00C000400030000C0C2A5 -:101C700000000C498E000C38000000800C01003878 -:101C800028178E00FF08E0E3E0DC040700A0000056 -:101C90000008000130010080000201000200000283 -:101CA00000008002000080000001000080000000B1 -:101CB00000004000000000000000000400000018C8 -:101CC000608C26038021100000000000010000014C -:101CD0009090240020208012F002A082400000009A -:101CE000020202042AAC156401C05104000012086B -:101CF00000000A8248200000002802A080000000A6 -:101D0000081410008010028456080000050082AA02 -:101D1000C8AC80000A8058006E0080C1206284CA6E -:101D200080132000840108000000000040400811DA -:101D30000008021044020008220000000080000099 -:101D4000000A400000144068FE14554014000000D2 -:101D5000800000000003500A00001100000A00008B -:101D6000200C5295154501402002802805005002A4 -:101D700080504500500A08A002C0612A6081C0213D -:101D80001308C50012C4821C1556800CB000000157 -:101D900024121040400008902182020202002040DC -:101DA0000020000804000400820080A015040088C0 -:101DB00051CC0010002322C078120000C8832808EC -:101DC0004230208200B6D52C5602B1D0000000006F -:101DD0000008000040211400440000010201CC0C66 -:101DE00008000108000C21A104000020B00A0280B4 -:101DF000318804080400CD0082A824003E30A48865 -:101E00006BE1066C01002287080001B8A84A783708 -:101E10000B8282A114E401100012400000000000B7 -:101E2000000000000002820800903C000000F20E5A -:101E30003040C9245086B5723348021C1DB00A09CF -:101E4000311858D8D101CACE2D31A5D05C9E13C00F -:101E5000816C02E20034583420411023FAE8004B30 -:101E60001BB60D41235328B34B0B5306001126EC30 -:101E70002B500958C8CA1269C4E5D1169804ED80E0 -:101E8000500009800FDB04C2100410D2EA32430A6A -:101E90002D42CB3426B600888AF93130709F4B3002 -:101EA00072C74B430908962B3913CCF6E3435463AE -:101EB000723406809273DA50035239B28F6AA019D5 -:101EC000A81E000028492B90801C0D8835B4CAA597 -:101ED0006149544910001E4AAE010114702C0D399D -:101EE000831CA29A98D61A2B18435B60A1AC692375 -:101EF00025518698319FA46D6D07594B63802E58EC -:101F0000E14F0FFE08BB2251C0E0532FB684C191B0 -:101F1000ADFC355E262B09A8E1C3F0BC931AC201C3 -:101F2000FEE097C046B6310B43A081F3D874D6319A -:101F3000C1CF56605BB4260124000300811C04025B -:101F40004000040B12604C240980000000040014BF -:101F500080020200500000B0000890080810000045 -:101F600000025062880002C00841000001440000E5 -:101F700004110009100001000A00000290001C1F5B -:101F80000002000031005C4040029800005102183D -:101F9000044004158B100038D403101008050213F8 -:101FA000C8B40C820020080AB0A00810060520085A -:101FB00090600000980000000B9C0071D4D40300D6 -:101FC0000448880089446A243C2840192271484901 -:101FD000C1122202C0A203102003109B81AE200870 -:101FE00088824404000000019C80E6F01335806E76 -:101FF00000A3A035D827C4002A30000000081DF235 -:10200000024633FD2C90472C958E00D041ECB4064F -:102010000308003402302802041414CCE072830058 -:102020001ACC0EA0C101C084AC814924000FA3F2D8 -:102030003A4009D2210042B4024104327E0A4A00E9 -:10204000055000000000001004240201100260107E -:1020500044411020040C4000028008200081200D23 -:10206000401000080100200094AA000181501128AE -:1020700000140814A44002002210C3C0140A020D68 -:102080008170C441413C3282E1C0003C00000880C4 -:102090000201108204821000460400024010001861 -:1020A00000024084800500A02800294590206B484C -:1020B0000000110004420000D40000081102544046 -:1020C00000A42810004C000480100000002104042B -:1020D0000102EC04000520800154420000E6820069 -:1020E00001022C43818C120000010050000400000A -:1020F000001288000280A900020D290800010011C9 -:102100000010021D454039800400200A00A040084C -:1021100000201402AA2CE201000020EC382C04401C -:102120000304002000200200B000A4001434014089 -:1021300011408060A0C20000AC00100088818000C7 -:1021400068FB220003EA00000815120022801080BC -:1021500012000A020000001100894045402000489A -:10216000002200205150020081E2D20334004000DE -:1021700000400000200002802A6800238000000048 -:102180000009424009400000A80009010537D20AB1 -:10219000B800550880042A00002450900900082047 -:1021A0008200884280000100141100000800010034 -:1021B0004801020000150800118904012008002AC6 -:1021C0000000001540452400000000040800450000 -:1021D0005A150261414901490049000000400000D0 -:1021E000001080000010080220980010052CB04A52 -:1021F00000229500120E002108BC8085AC273D27E7 -:10220000A1CE863024CC03C000110403E0210C28A9 -:10221000C5208E0C8742D20C1A260745050690EB86 -:10222000F42711026C0150012C002015214247288F -:1022300092A30C99F73A810093319F50A812093369 -:10224000C9F50281242A8A210E088A906F90A2087B -:10225000142C0554101508A54C00648003E022B02E -:1022600005400200005010D44097AF010AC400415D -:1022700027EC419800000E644020F8D79A0385416E -:1022800078204240206408128000A02000114A20DB -:102290008808AB424000900021508000220150008D -:1022A000A000200040A00244141200FF0E0D0020E8 -:1022B0007C07F03C68068071C53001FC0080080C8A -:1022C0003084044AA90020400401112014000502B2 -:1022D000400000041C000828950698408034300017 -:1022E00003000518000140500A00A00A0140140034 -:1022F000002800004A6380001803140880080A813F -:102300000000FBFD38018805F00000BFFA3E9FCFBA -:1023100003F000D402FF00010FBD001E9C006020EE -:1023200089025E00A4003500042006842068D0469F -:10233000851428C342811A14142823428234210AA6 -:1023400010850804D18A10A06844468D04684214A0 -:102350002028D029A1028D0D34D0D1A0084D0468C9 -:1023600048D1A0210811A123428A3421A1441A1482 -:1023700011A34D1A10D0A0084210A14342123428D4 -:102380002342028D0428514284142821428A1420B9 -:10239000A140D084051A008420D084D08528420032 -:1023A000A1034684346823468A34608844C2BD242D -:1023B000A942CD034E7C310B0416C5B31090409E4C -:1023C0004F221487600080CC01212D50010C3189EF -:1023D000B4C19400BD01C1C00204097C000C8C0092 -:1023E000501500051527D1032DB000540F303FFCC8 -:1023F0000000F000005AB0066000000000008000FD +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD :1024000000000000000000000000000000000000CC :1024100000000000000000000000000000000000BC :1024200000000000000000000000000000000000AC :10243000000000000000000000000000000000009C -:10244000000000000000000000000000000200008A -:102450000000000000000000080000000000000074 +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C :10246000000000000000000000000000000000006C :10247000000000000000000000000000000000005C :10248000000000000000000000000000000000004C -:10249000000000000002000000000000000000003A -:1024A0000800000000000000000000000000000024 +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C :1024B000000000000000000000000000000000001C :1024C000000000000000000000000000000000000C :1024D00000000000000000000000000000000000FC @@ -242897,149 +242897,149 @@ :104940000000000000000000000000000000000067 :104950000000000000000000000000000000000057 :104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 +:104970000000000000000000000000110004000121 +:1049800000000011100444411110444400000000D4 :104990000000000000000000000000000000000017 :1049A0000000000000000000000000000000000007 :1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 +:1049C00000000800000400000000000000000000DB :1049D00000000000000000000000000000000000D7 :1049E00000000000000000000000000000000000C7 :1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF +:104A00000000000000000000000028404802204094 +:104A1000000200012080008008209080000000003B +:104A20000000000200008000000004000000248458 +:104A300081010000000000000000000000000000F4 +:104A40000000010000180408C20110001002200438 +:104A5000220408000000004008420208020102404F +:104A600082100401010042406000001203000002B5 +:104A700009000400000000000820000800042208CB +:104A800081024080081004100080040040000040B3 +:104A9000000008000150224024922490018040042C +:104AA00008400A080001088140200200042002801A +:104AB000800000001904100080104204500800001B +:104AC000040192EBE8BEA8000B80120044000081B4 +:104AD0000400840880112800A400000000000000E9 +:104AE000410008160000021040000008204C002081 +:104AF0000080000008080062101000E8C010DD40CF +:104B0000B10000148018080000411002008030003D +:104B1000010800000000000000004000A02000008C +:104B20000000000000000000000011800013A088B9 +:104B3000A088B8230008C50002C40000175EC00C9E +:104B40009020000360321040C00000900104020277 +:104B50000200605008B00008044040209B0010850F +:104B6000040C00805040005008202000502200001B +:104B7000802A08028010200200BFC13C060231F0EA +:104B800001340208164408217000B01040088A0061 +:104B90004040960440050002802180A4004041006E +:104BA00000000280008804800000080000800000EF +:104BB0002A32240842800C00110006000290008274 +:104BC00024281238400A8680940021083D82000F74 +:104BD000717FF0DF6F07FF8DC2F0000880403C005E +:104BE000000C120200D049284007A972B344820E7B +:104BF0000D300A0AB35858C8D000C80B2D312550C3 +:104C0000950D004080240022500408042002120266 +:104C100052E0104111A60D41401208334B0112061B +:104C2000041146680B500310CACB126000642116B1 +:104C300098084D808000098022024414420200D26C +:104C40009000CB08AD128B3002A2020888193130D7 +:104C500030434330B34743400108163400014080DD +:104C6000804250000224004014521450050015B038 +:104C7000880AA018540E000424090B910008024869 +:104C800005A4CAA16101444102001E4A8E0101042B +:104C9000286A0D2A831CA29A08941A2B1C02500021 +:104CA000B12C6023241586981115804C4C0F1102ED +:104CB00023800008E2862D2E845000088060030BBC +:104CC00092C0C100ACEC3552260B09A8408150A41B +:104CD00003088181F28191C044A4020201948043BF +:104CE000505112210088080000002000201002010D +:104CF00081040400010004041A00D00029000C04FF +:104D00000080B10400D216028080B490420091016C +:104D10000A20000002D340258002D2403900000062 +:104D2000010C000000000019502211000A082000A8 +:104D300000000800208000806100001000023400A4 +:104D400040000300149412808A00001954458030FA +:104D50008A410293C8900D0002620803108080020D +:104D60000000000890E00848900020000168827070 +:104D700048C4470820088802D4C47A403CACC41315 +:104D8000227118494033220240A28350A102108DA3 +:104D900081A6A0098882550400010901D4A073B13D +:104DA0001131012E80A3E0315827D40402300000D5 +:104DB000000008A202AC22FD0090C604948C4010B2 +:104DC000E00CB0040B1808344018B88B4434344D50 +:104DD000E471AA203A440EA00121C0048CA141052F +:104DE000544DA3D2335009522900C42D024104323C +:104DF0007E00480005400000000001100020202532 +:104E00001002501040000020950C400102000820C4 +:104E10000001204C403008088110000094AA08C905 +:104E2000851011080014280425400021000000000E +:104E3000000A000140000050020910C34900002888 +:104E400000000880000002000080100042040022E0 +:104E50004000004010024104801500200800A94CC9 +:104E60009220684802041302046A2020C408022821 +:104E70009300046010800A2000480204C010000063 +:104E8000002800000100040400800080010C43D4CD +:104E9000002080008102014102801000000000001B +:104EA0000010000000028000020018300000200006 +:104EB000400102001000801DF000198100803008C0 +:104EC0000080000000200402282CA2000800A0C0DE +:104ED000382000400004022000A002003300E0C09F +:104EE000142001400000804000804000A800000025 +:104EF00000800020200000000100000908050700D4 +:104F00002200100000000A00000000110288404545 +:104F10004420004A00228220011008004021910113 +:104F20000400040000400000000000802060002217 +:104F3000000000000008400008A00000200001015F +:104F40000004924A08845008E0042800402450904D +:104F500009044800800008000000A1009001002022 +:104F60000008010008000200001000000081040198 +:104F700004081C0800000291004420000002000008 +:104F8000000151504A112241010821082808280037 +:104F9000004000004180800000008C00229A0C50EC +:104FA000040000480022D400120200C008A80085B6 +:104FB000002FBE3780CE027025DC03C00000040342 +:104FC00060231C2802000E000242D0001E2426513D +:104FD0000187B0EBA42311026C0000012400200023 +:104FE000250A06B88233CC99F73A01009773BF407F +:104FF000E0920977CBFC12212C0A8A210E048290C0 +:105000007F906208002C0414101508A14C00640065 +:10501000006020B0200008804042101000001900FD +:105020003E000003A16801010600080040F00431C1 +:105030001213C5414001060000000000000080007E +:10504000001052000800A940000000000700000006 +:1050500020001000800020004020004000020000DE +:10506000000000200007F000000002010020800086 +:1050700030400000000400400020404008000020B4 +:105080000400040000000000180400089100004221 +:105090000200021020108001000500402802804814 +:1050A0000500500800A002000A00000000000000F7 +:1050B00000080001000000000000002000000000C7 +:1050C00000000000000000001000000000000000D0 +:1050D0000010000001000820802011AB042206040B +:1050E0002078C0460C327CCB27C099383664030642 +:1050F000003C6018000D0002C98F0992742466CE2E +:105100000078C0300060C0618026CD8DB2F2C990B9 +:105110008C6C046848D1E0211C01811326CF3261D8 +:10512000F3A49B3601E34C1A30E18000420993035B +:105130006131326413A6060C0070C3860C34681308 +:10514000264B3661D324C8460E1E008420D084D05E +:105150008D242109D09366C4366C23468A34608836 +:105160004445B3327D03A300CC24707B08690A4711 +:105170000260846C8E02FB8AE65061C0ED6F2135BF +:10518000C01391C984977D055B030300010000549F +:105190000008CFFF300000001429914BF19002B8B5 +:1051A0000F203FFC0000F000001810000402006017 +:1051B00000001000000000000000000000000000DF :1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E +:1051D00000000000000000000000000003FF00FFCE +:1051E000FF0000C00000000000003FFF0FFFF3FFC2 +:1051F000FCFFFF0000C00000000000003FFF0FFFA9 +:10520000F00AFC0000000000000000001020000078 :10521000000000000000000000000000000000008E :10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E +:1052300000003FFF0FFFF3FFFCFFFF0000C0000076 +:10524000000000003FFF0FFFF00AFC00000000001C +:10525000000000001020000000000000000000001E :10526000000000000000000000000000000000003E :10527000000000000000000000000000000000002E :10528000000000000000000000000000000000001E @@ -243048,143 +243048,4240 @@ :1052B00000000000000000000000000000000000EE :1052C00000000000000000000000000000000000DE :1052D00000000000000000000000000000000000CE -:1052E00000000000000000000000000000000000BE +:1052E00000000000000008000000000000000000B6 :1052F00000000000000000000000000000000000AE :10530000000000000000000000000000000000009D :10531000000000000000000000000000000000008D -:10532000000000000000000000000000000000007D -:10533000000000000000000000000000000000006D -:10534000000000000000000000000000000000005D -:10535000000000000000000000000000000000004D -:10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED -:1053C00000000000000000000000000000000000DD -:1053D00000000000000000000000000000000000CD -:1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000006C -:10544000000000000000000000000000000000005C -:10545000000000000000000000000000000000004C -:10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC -:1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:10556000000000000000000000000000000000003B -:10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B -:10559000000000000000000000000000000000000B -:1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000000000AB -:10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A -:10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:10568000000000000000000000000000000000001A -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 -:105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 -:1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 -:105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 -:105920000000000000000000000000000000000077 -:105930000000000000000000000000000000000067 -:105940000000000000000000000000000000000057 -:105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 -:105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000000000000000C7 +:10532000000000000000000000000000000020401D +:1053300048A2204000020001208000800020800060 +:1053400000008000000000020000000000000000DB +:1053500000000080000100000000000000000000CC +:1053600000000000000001000009000000010080B2 +:105370000002010002000002000080020000800024 +:105380000001000280000400000040000000000056 +:1053900000000000000004000008040000200000DD +:1053A000000400080100000000100410008000103C +:1053B0004000000040000000001002002490248003 +:1053C0004180400408048208000108804020002435 +:1053D0000420008080009000090410008010420426 +:1053E00010080009040092EBC8BC80000B8010007C +:1053F0004400000904008408801120008401080092 +:1054000000000000200008004000021040000018CA +:10541000204008000000000000080000001000E824 +:1054200000105D4010000000801800000203100A08 +:10543000000010000008200000040010100001000F +:1054400020020020040040020040040040080881BF +:1054500000006028608000210008C50002C48200AE +:10546000175E800C9000000124121040400008904C +:105470001100020202002040002000080400000089 +:10548000820000801404008050400050082020005A +:1054900050220000802A08028010200200BED12C79 +:1054A000460231F0000000000000000040009010B3 +:1054B000400000000040900440040000000000A4F0 +:1054C0000000400000000280008804800000080006 +:1054D000008000002A3224084280080811000600DB +:1054E00008000090A848101A090282801444210084 +:1054F0000002000000400020800400020822000892 +:1055000000803C000000F20200C049204006A17269 +:105510003340820C1D300A0B301858C8D000C80A1E +:105520002D31A550940C0040812400220004080471 +:10553000200010035AE010491BA60D41625328B306 +:105540004B095306041166E82B500D58C8CA12685F +:105550008464B11698086D80800009802FDB449622 +:10556000520630D28033430A2D12CB34AAB2008ABD +:1055700088393130305F4B3032474B42012816209A +:105580001101C0A2A20350202224020090529E507A +:10559000210031B08A2AA018001E000088492991F4 +:1055A0000008074835B4CAA56109544912001E4ACB +:1055B000AE01010020680D388318A29A18961A2BA4 +:1055C00018035940A18C6923241186981195A46D64 +:1055D0006D07594B63802458E0030F2E08110048D3 +:1055E000C060432F9280C101ACEC355A262B09884C +:1055F000E08030B40318C181F28191C046B6020345 +:1056000003948063D074C631418C0C405210240145 +:105610002010020181040400010004041A00D000DB +:10562000090004000000A04400D202004080B490B1 +:10563000420090010820000002D240258002D240A2 +:1056400039000000010C000000000019502011007A +:105650000A00200000000800208000026100001005 +:105660000002340040000208148000008A00001884 +:105670007405001008010213C8900C0000220802F3 +:10568000108080000000000090400000900020008A +:1056900003CC0275D4C4470000088802C0447A00D5 +:1056A0003C2840112271484940132A0250A2031499 +:1056B000A102108981A6A02888824404000101016A +:1056C0009CA066F11131012E80ABE0B15C27C400D3 +:1056D0001230408000801DF202EE33FD2098D60C7F +:1056E00094CE4890C10CB486031808344018B88B87 +:1056F0004434344DE473AB201AC40EA84101D044A5 +:105700008C814105540DABD2BA4009D2290040BD6D +:10571000024104327E024A000550000000000110E0 +:10572000002020011002401040000020040C400026 +:10573000020008200081200C403008080110000001 +:1057400094AA08C18510110800140804054000201F +:1057500000000000040A020100400040020812821A +:1057600041000028000008800000000000801000B8 +:1057700042040002400000000002410480050020B5 +:105780000800294890206A4802041302046A202075 +:10579000C408022893001460008008000048020436 +:1057A000801110100020000001000404008000801F +:1057B000010C43D4002080008102014102801000CE +:1057C000000000000000000000028000020018300D +:1057D00000042000400102011010821DF100198018 +:1057E000000030080080000000200402A82CE20124 +:1057F0000800A0E0382000400000022000A00000C7 +:105800003300E0C0142001400000804000804000D0 +:10581000A800100000800000200000000100000926 +:10582000081507000200100010000A000000001117 +:10583000028840454020004A002282204110080092 +:10584000400191010400040000400000000000003D +:1058500020680022000000000000000008A00000F6 +:10586000080001010004924A00805008E00428006A +:1058700000201080080008000000880080008100DF +:1058800010010000000001000800020000100000EC +:105890000081040104081C0800000210000420001C +:1058A00000020000000040004A00024101082108F7 +:1058B00020082000004000000180800000000C0053 +:1058C000228A0410040000480022D400120200C002 +:1058D00008A8008500273C2781CE063024CC03C0D1 +:1058E0000000040360210C2802000E000242D000D8 +:1058F0001A2426410106B0EBA42311026C0000011A +:1059000024002000250206288223CC99F73A0100C2 +:1059100093319F40E0920933C9FC1201240A8A2185 +:105920000E0082906F902208002C0414101508A11C +:105930004C006400006020B00000000040401044B3 +:10594000000008000800000125600580060008002E +:105950004020001102008540408006040001000044 +:1059600000008000001052000800A9400000000064 +:1059700005000000200010008000200040200040B2 +:1059800000020000000000000007F000000002011B +:105990000020800030400000000400000020400093 +:1059A00008000020040004000000000000040008BB +:1059B0009100004080000000000000000001004055 +:1059C0000800800801001000002000000200000014 +:1059D00000000000000800010000000000000000BE :1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 -:105A40000000000000000000000000000000000056 -:105A50000000000000000000000000000000000046 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000000000000F6 -:105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000000000D6 -:105AD00000000000000000000000000000000000C6 +:1059F000000000000010040001020820800011AB2C +:105A0000042606942068D0060C3060C34600183483 +:105A10003060030600306118008D0804F18A11A07F +:105A20006844060C0468C2342068D069A1068D0D54 +:105A300034D0C180000C006000C180211811A12366 +:105A4000468A3461A344183009930D9930D9B08C3B +:105A50006319B3436333366C1366264C8264C326E2 +:105A60004C36643366CB3661B364D8C60C990842B1 +:105A700012C840C84C2C2109B19366C4366C3366F9 +:105A8000CB36608824459120058260C041A441390D +:105A9000230000040002304D020D1908C26084C4C6 +:105AA00084100F00820220C11C90E40434400000E6 +:105AB00000040108000B0C0010500045100FE04BD3 +:105AC000BCF00250000000000FFF03FFFC18BF00F5 +:105AD00004000000000010000000000000000000B2 :105AE00000000000000000000000000000000000B6 :105AF00000000000000000000000000000000000A6 :105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 -:105B30000000000000000000000000000000000065 +:105B1000000000000000003FFF0FFFF3FFFCFFFF4D +:105B20003FFFCFFFF00AFC00000010000000000063 +:105B3000080000000000000000000000000000005D :105B40000000000000000000000000000000000055 -:105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 +:105B50000000000000000000000000000000003F06 +:105B6000FF0FFFF3FFFCFFFF3FFFCFFFF00AFC003A +:105B7000000010000000000008000000000000000D +:105B80000000000000000000000000000000000015 +:105B90000000000000000000000000000000000005 +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C0000000000000000000000000800000000008C +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C50000000204048882040000200012000000091 +:105C60000020800000008000000000020000000012 +:105C700000000000000000800001000000000000A3 +:105C800000000000000000000000010000082000EB +:105C900000010080000201000200000200008002FA +:105CA00000008000000100008000040000004000AF +:105CB00000000000000000000000040000080400D4 +:105CC0000020000000040008010000000010041083 +:105CD00000800010400000000000000001100200E1 +:105CE000249024804180400408400208000108807C +:105CF00040200200042000808000000209041000FF +:105D00008010420410080000044092EBC8BC8200DE +:105D10004B80101044000001040084088011A0840E +:105D2000860108000000000000000810400002107A +:105D3000400000082040080000800000000800200B +:105D4000001000E800105D401020000080180000E6 +:105D50000403100A001210000008000000040810DC +:105D60001000010020020420040040020040040052 +:105D70004008088000006028608000210008C500FD +:105D800002C48200175E800C9000000124100040C5 +:105D900040000090000002000000204000000008C9 +:105DA0000400000080000080140400805040005077 +:105DB0000820200050220000802A080280102002C3 +:105DC00000BED12C460A31F00000000000020400A1 +:105DD0004000D0104000000000409004400400004B +:105DE000000000A400004000000002800088048041 +:105DF00000000800008000002A32240842800808C1 +:105E00001100060008000092A848101A490282807A +:105E1000144421003DC20009339FF0D77F39FFCDE4 +:105E200042C0000800003C000000020200D04928E7 +:105E300040040110334080000D30080A30185848E3 +:105E4000D000C00A2D31A5409404004081240022D6 +:105E500000040804200010010A00100819A60D0112 +:105E6000425328B34A084306040146682B40000801 +:105E7000C8CA12608060A51698086D8180000982EA +:105E80002FF94496520630D2800003082D12CB30F1 +:105E9000AAB2000A80193130305F4B3030474B4294 +:105EA00001281620110080A2A00350202224000007 +:105EB00090529E50210010800A2AA018000A00006B +:105EC00000890101000807481534CA8541015409B9 +:105ED00012001C4A8A01000420680D100318A21A3F +:105EE00008141A2318035140A084602320118698B7 +:105EF0001111A04D4D03514A62000058C0000828FE +:105F0000000000088460030B9280400008A0350068 +:105F100026020000C0C1000003084101D28191C0E7 +:105F200006260201019480235011063101840840A5 +:105F3000521020002010020181040400010004041A +:105F40001A00D00009000C000000B00400D20600C6 +:105F50008080B490420090010820000002D34025C8 +:105F60008002D24039000000010C0000000000193E +:105F7000142211000A002000000008002080000008 +:105F800061000010000234000000020804800000DC +:105F90008A0000595403021008010213C8900C0033 +:105FA0000022082210800000000000009040000045 +:105FB0009000200003CC0275D4C4070000088802BA +:105FC000C0447A003C2844132271584940322202CE +:105FD00040A203102002108981A62009888254045F +:105FE000000000019C8066F11131012E00ABE0B190 +:105FF0005C27C4001230408000801DF202EE33FDA9 +:106000002098D60D94CE4890C10CB40603180834DD +:106010004018B88B4434344DE473AB203AC40EA01E +:106020004121C0048CA14005544DA3523B5049F27C +:106030002900C4BD025104327E024A00055000000E +:10604000000001100020200110024010400000203C +:10605000040C4000020008200081200C4030080899 +:106060000110000094AA08C185101108001408044A +:106070000540002000000000040A0201004000402A +:106080000208128249000028090008800000000070 +:106090000080100042040002400000400002410461 +:1060A000800500200800294C90206A480204130251 +:1060B000046A2020C408022893001460808009002C +:1060C00000480204C0200011002000000160040408 +:1060D00000800080010C43D4002080008102014137 +:1060E000028010000000000000000000000280009C +:1060F0000200183000042000400102011010821D2F +:10610000F10019810080340800800080002404021E +:10611000A82CE281000020E038200040000002208E +:1061200000A000003300E0C01420014000008040C7 +:1061300000804000A8001000008000002000000047 +:1061400001000009081507000200100010000A02F3 +:1061500000000011028840454020004A00228220B1 +:1061600011100800400191010400040000400000EB +:1061700000000080206000220000000000084000B5 +:1061800008A00000200009010004924A88805408F9 +:10619000E0042800002450900900080080008800D6 +:1061A00080008100100100000000010008000200D2 +:1061B000001000000081040105081C280000029066 +:1061C0000044200000020004080151505A112241ED +:1061D00041082108280828000040000001808000B4 +:1061E00000000C00228A0410040000480022D400A1 +:1061F000120200C008A8008500273C2781CE063087 +:1062000024CC03C00000040360210C2802000E000F +:106210000242D0001A2426410106B0EBA423110249 +:106220006C00000124002000250206288223CC995E +:10623000F73A010093319F40E0920933C9FC120103 +:10624000240A8A210E0082906F902208002C0414E8 +:10625000101508A14C006400006020B00000000090 +:1062600040401044000008000A000001256005803D +:1062700006000800402000110210854040810604FD +:106280000001000000008000001052000800A9403A +:106290000000000005000000200010008000200029 +:1062A0004020004000020000000000000007F00055 +:1062B00000000201002080003040000000040000C7 +:1062C000002040000800002004000400000000003E +:1062D0000004000891000040800000000000000061 +:1062E00000010040080080080100100000200000AC +:1062F0000200000000000000000800010000000093 +:10630000000000000000000000000000000000008D +:106310000000000000000000001000000102082042 +:10632000800011AB0426029420285002041420435C +:1063300042800814102021428214210E1085080486 +:10634000F08A10A02840C2040224411212244825D9 +:1063500090224485B6C2D8D08C6D062C4C58B21011 +:1063600088089031624B1620B16089121081040EAA +:10637000104080080010A14142121428014202047A +:10638000042041428410280102081020A1405084BA +:106390000489084212C8404844246308908122407E +:1063A000122411224B122088205A7E29858A60638C +:1063B0008038D1E7086E8BAD0320845D8201E486CE +:1063C0004410818C102A0C47C011A2C130B6ED01D7 +:1063D000BE42928001040C4400044C013100044090 +:1063E000142B8403D89003BCFFC03FFFC000F00013 +:1063F00000081000040200800000200000000000DF +:10640000000000000000000000000000000000008C +:10641000000000000000000000000000000000007C +:106420000000000003FF00FFFF3FFFCFFFF3FFFC72 +:10643000FFFF3FFFCFFFF3FFFCFFFF0000C00000A6 +:10644000000000000000000000020000000000004A +:10645000000000000000000000000000000000003C +:10646000000000000000000000000000000000002C +:10647000000000000000000000003FFFCFFFF3FF1E +:10648000FCFFFF0000C00000000000000000000052 +:1064900000020000000000000000000000000000FA +:1064A00000000000000000000000000000000000EC +:1064B00000000000000000000000000000000000DC +:1064C00000000000000000000000000000000000CC +:1064D00000000000000000000000000000000000BC +:1064E0000000000000000010002660010000000114 +:1064F0001004000011104000000000000000000027 +:10650000000000000000000000000000000000008B +:10651000000000000000000000000000000000007B +:1065200000000000000000000000000000000980E2 +:106530000006000000000000000000000000000055 +:10654000000000000000000000000000000000004B +:10655000000000000000000000000000000000003B +:10656000000000000000000000000000000000002B +:106570000000000000000A44002A80D70003000049 +:1065800000C024105000880400000080800060409B +:1065900000100402920104080D202480000100086C +:1065A000000E0202CC0020218078A00604000D001D +:1065B00001182400D0090040002200A002000C01B4 +:1065C00001004001000242080200020182985C00C2 +:1065D000004840000004C00000002602000004A0A3 +:1065E0001005021C0000000000040038010240A257 +:1065F00008100410008406004008004000000080DD +:1066000000000240249024804882406428E06A0808 +:1066100000854081432015031500028C800C08047E +:10662000190410004101500850C800C0841992EBB1 +:10663000C8BCB900EB8211E04400789004008E9849 +:10664000821134C2B81188481080824000E40832B8 +:10665000C004A210400128082044580211889084E8 +:1066600008404040001000EA7800DD489A0210140B +:106670008608080001181002000030120000000017 +:106680004290462A00800000A040080000020080DE +:1066900008008010010002020520204820910731E7 +:1066A000080D6E72A4C84FE8175E880502680003E3 +:1066B000B61B144261200954081002898100C050A1 +:1066C0000000440802004020C00C118010020600A7 +:1066D00040404C780920300480221D8080AE0C029E +:1066E0008036C11204CD911946C83EB04C980800BE +:1066F000014204004050C07A02018C406042DE6CCE +:10670000C22634040921C0AC4050C50014000281E7 +:106710002088459900200C60308000212A33060C27 +:1067200010000C809FC007304A9002CBACE8133BAE +:1067300069C8A620003824003F82001F33DFF0DF45 +:10674000EF3DFF8DCBE21884220119480927E23A78 +:106750000CD76D219085A930B3408CD62DB0C8568A +:10676000128C58ECF00397075DB0E544B70C034278 +:10677000CF24032644341F30000610015268719163 +:106780000DB60D0AC0D9A8B34E1189861C62D36C10 +:10679000AB4228C60ACA926084C9353ED8484342F3 +:1067A00080B408A039174FBD200260D2813A23027D +:1067B0002D106B34330902C6023D31B0644E973060 +:1067C000E5C6976241683E3D310780C6E21058C376 +:1067D00074000280141384504D503B9B8C4AA002DD +:1067E0000010002451092111005006E938F4CB8E25 +:1067F00031999409030006CA20031F04A66A0D08F4 +:10680000CB1EA21A98B11B231E0A8550A80C61AB9F +:1068100009B18ED830D5681A1A02CDC033A08E08BF +:10682000C8002C160240014A2C20732468834E2194 +:1068300066A8371926398CADC2890023EB39F9C017 +:106840000211D044050E0209031691279013031874 +:1068500051840E4040302410301FC009C2E4A4000F +:10686000911C04041D80D0006002399382B0018421 +:106870000831D532800009C3ADA0416129EB8011F8 +:106880004007009CE00025C1F7000040640F01466E +:106890000244029480751131700FB0810284D402D9 +:1068A000228C01B5E3420C31A0307604C012568030 +:1068B000388A0A004C0000DBFCF00629E140E023A6 +:1068C00044C41E3200620A2A32CD40A5D10A34C423 +:1068D000A0D23F8048F225C0446172306066C70D87 +:1068E0001080080361A015902C050E267055E468F1 +:1068F000100AFF404F91E30C43C006A444E7A07E7A +:106900007442310880862C607E88774120B105B6BC +:10691000404018D02037904DDCC2E3D871CC0CDE5B +:106920008BFE33DFF0A08A021402B7A0801C50183F +:106930000D19088400010098352B3E832401EA20BC +:106940006DE51EAB0002D2480C495F17F4453601D5 +:1069500058A090F82830889F430D0C78A200C248B8 +:106960003320CCA04448211581A0613C1CC059159E +:106970000200880014C847021855C308102000EC14 +:1069800020300885751047C0041B294B071C8084E4 +:106990008444200425C0002300002058000A000180 +:1069A000400000100201594F6903520C44C8010015 +:1069B0004C01011374A2253A46856652EB589CA2FD +:1069C0002EE88301233D54AAD419AB4F01428E0017 +:1069D0000B0C074784385064801E0A01C7490431F4 +:1069E000ED581A4E2200820A60080088C5209002E5 +:1069F0002100CC4862C102198E0E43DC5C20A0004D +:106A00009D0301E0028000000000C800015000006A +:106A1000000160005C0018383000000085A292C8B8 +:106A20009000892CF0001FC3913873D0080A01A28E +:106A30006221002A683CEA01062005E0DA210329E8 +:106A4000051C43D020E84B04730C60C2294013415D +:106A50000AA0C440A081407F0805408640828F3450 +:106A600040400262820C0229C4A0CF013C40305059 +:106A7000748064000498003D3216000831204106FD +:106A80009363A7F0F834395246ADF3030430360C63 +:106A900070448A925020118A30288A20E1499C80D3 +:106AA00091140443CCA38844540F2501023593DF8D +:106AB000C0B12A28E40C11012284F98C3DEA0913A3 +:106AC000410408A42010F80340006424051E058436 +:106AD0000800020080C0C600C18504010760DD50C7 +:106AE0001E048240009020D28922408C341239B09A +:106AF000EC993810CC08200830083B008001530086 +:106B0000A78093D0008DCE6F439B2C78F5104084E6 +:106B10001820C480113533C2001C920300957A3FBF +:106B2000070C09E017AC0680085000C100BB5C6888 +:106B3000922012040250C0780CA40641C0C5F37F15 +:106B400000B18D082000C0800488820C140C805293 +:106B5000803980D5EC3250081AF37E4C678301EB04 +:106B6000C5ECB250340010257FC700B01D10616124 +:106B7000028C0022107E34405D04440001E0007469 +:106B8000300018C8C20372B8E0011B11FE40400378 +:106B9000806050191E0F8F64E0F12438813BD009CA +:106BA00048033608104004000544000110805200DC +:106BB0001380A900000000000E200C2200001472B7 +:106BC00002162EC0C57010400C0202CC080701103E +:106BD0006400002002048071052001E00200000032 +:106BE000500000A80000004003010B080400002032 +:106BF00000B01002FC4E4509B102848250441010CE +:106C0000215440600208000400000840841041083C +:106C1000410213060220801410008022C0000001EF +:106C2000804C30C421238009924050019826198756 +:106C3000001091C004CC2428060C400618108004D3 +:106C400001000821403001AB21384227232A543368 +:106C50006619364F92A1CF9C993219F2059733CF1E +:106C6000B464DA25CCCD9CA3329073E629364793E1 +:106C70004322542B9A33A44673E3C488CA7D212649 +:106C80000E6CA308CCB4D939F38B9330E990C89536 +:106C90000CF9044D9244A8D2342CD98993919B20AD +:106CA00079B232244F265113E4913219728F932016 +:106CB000C99055E9264C8CA303E46865662EB48C14 +:106CC0008A41536895221972099F20885001BA0899 +:106CD000A10C4B328250B85B0E50C43B90A0E4CA6A +:106CE0008030B00A1410788090190035000E93049B +:106CF000801068024000C0C0F0000844000E0FFF82 +:106D0000200000154129054FADA018B80000000073 +:106D1000000000000000A00004000040000000008F +:106D20000000000000000000000000000000000063 +:106D30000000000000000000000000000000000053 +:106D40000000000000000000030F00C3C330F0CCBF +:106D50003C330F0CC3C330F0CC3C330F0CC3C330F7 +:106D6000F0CC3C330F0CC3C330F0CC3C30020C00F1 +:106D700000001000000000001800000000000000EB +:106D80000000000000000000000000000000000003 +:106D9000000000000000000000000000000030F0D3 +:106DA000CC3C330F0CC3C330F0CC3C330F0CC3C30B +:106DB00030F0CC3C30020C0000001000000000005D +:106DC00018000000000000000000000000000000AB +:106DD00000000000000000000000000000000000B3 +:106DE00000000000000000000000000000000000A3 +:106DF0000000000000000000000000000000000093 +:106E0000000000000000000000000001000440003D +:106E10000000000000000000000000000000000072 +:106E20000000000000000000000000000000000062 +:106E30000000000000000000000000000000000052 +:106E40000000000000000000000000000000000042 +:106E5000000000000004000000000000000000002E +:106E60000000000000000000000000000000000022 +:106E70000000000000000000000000000000000012 +:106E80000000000000000000000000000000000002 +:106E9000000000000000000000002A444881004C6F +:106EA00000020001208024800820800000088080EB +:106EB0000000000A001000000021000821200080CE +:106EC000000100000000020000002000000000009F +:106ED0000400010121182408D00910000022200418 +:106EE000020000400110000000021000000100003C +:106EF00080000420100840040090800020048402D8 +:106F00000010040000000000802000810004000840 +:106F100009400000081004100080040040000041F7 +:106F20000000048008100A40649024804180400CD6 +:106F300048000A2814490881406088002420828182 +:106F40008142400219045180805242045018142496 +:106F5000044192EBC8BCA4015B8010004400004DCA +:106F60000400840880912000B401000000000000AB +:106F7000218018804000023140000118A040080024 +:106F80000000000008080000001004E84010DD4088 +:106F9000900000180018084801AB100A008030006B +:106FA0000008000002C4001010004100A0220020D0 +:106FB00004004002004004004008088000006020F7 +:106FC000609101210008C50002C40000175E892DF0 +:106FD00092A9040320320040C00008904100020240 +:106FE0000011615000000008000040A100001300E3 +:106FF000341000904040005008202000D0220000B3 +:10700000802A0802823020020009911841020820DB +:1070100000040208024408217040901040008A4099 +:107020004040962444850400002000A4004241080A +:107030000200028000800480000000402080008068 +:107040000A33240050000C08110006000A900010BA +:10705000AC60003A090A96808044B1080002000240 +:107060004020000880020000B910080C00803800A1 +:10707000000CE21200D06909400410103340800176 +:107080001D30080BA0505848D000C00A0D31A54053 +:10709000040400000A040022040408042002100171 +:1070A0008A00100813A60D01725A28B34A086A060E +:1070B000040166E80B402E60C8CB12688462B116EA +:1070C00098086D818080488007C94002100610D260 +:1070D00090328B0AAD10CB34A8320282003D3130A1 +:1070E00030430B3030470B4200081020112480B28F +:1070F000A2035020200002001012145025A43000DA +:107100000808A01A041A0000AC492801000003482E +:107110002524CA814201440112001E4A2A010004AA +:1071200028720D020B1CB21A18061A231C031940F0 +:10713000B0046923229186985111A0494903504A0D +:1071400062826018C0012A280C058148E460632F20 +:107150009A804201A8A03508262A00A040806090AD +:10716000271C01098081D0C00634020102948021CD +:107170009035D63041840C005210200121100201BC +:1071800081040400010004045A00D00049000406F0 +:1071900080D0B10408D216028080B490C620D1A15C +:1071A0000A61000042D34025A002D2407B000000CB +:1071B000010D000000000019102011000A08200035 +:1071C00000000800208000806100001000003400F2 +:1071D00040000B00049410008A00001B7465001826 +:1071E00018012393CD904D000862080312CC80084B +:1071F0001810004990E000089000200001EC825037 +:107200005CC20700020A8802D4C47A0038AC441376 +:107210002275184940332A4242A203142002108DDD +:1072200081B62029808244040001010194A076F1F6 +:10723000113109AC81EBE0215C27C4000230000071 +:1072400000000CF202EE32BD2090C60D848C40008E +:10725000C00CB486031C09344018B8034414344CE1 +:10726000C071AB0032C40EA00101C004048140050E +:10727000544983C01A504952280044BD02110432B7 +:107280007E024A00040000000000111000A020113E +:107290001442411C48000020148C50000A000827AA +:1072A0008001200C00320A008110000084EA08C826 +:1072B00084000000001428042500002100000000C4 +:1072C000040A020140400050020812434101102804 +:1072D000000008804400024400841000420400239F +:1072E000400000401002410400050020080008088A +:1072F000000128000204131204EA20224048022858 +:10730000130414E080800B000008020480000010C9 +:10731000422000000101440C00800080010C43D495 +:107320000020800081020141028010000000000066 +:10733000011000000002C000020018300000200010 +:10734000400002001000801DF00019810080340808 +:107350000084008000240402282CE2010800A0E040 +:10736000382000400004022000A00200330060C06A +:10737000142000400000804000804000A800100061 +:10738000008000202000000001000009080507001F +:107390002200100000000A000000000102804045A9 +:1073A0004420004200208220111008004221D141D7 +:1073B0000411060004400000000000802068022242 +:1073C000000000000008400008A0000000000801C4 +:1073D0000000804200805008E00428000024509003 +:1073E00009000A00800008800000810010010000F0 +:1073F00000000D00080002000010C6001181040109 +:1074000014881C0800000B9000442000000A0000B3 +:10741000000150504A1002414108B108A408A42AB2 +:10742000A24500004180800000008C00229A0C5090 +:10743000040000480022D000120220C008A00085ED +:10744000002FBA2705CC1632B4CC03EA0800040397 +:1074500060331CE802000E000242D0001E240E41E0 +:107460000187B1FB002311026C0000012400A00081 +:10747000250A463882239C99E73201009773BE4063 +:1074800060920977CBEC12212C0E8A211E04839086 +:107490006F906208002C0414101508A14C006400C1 +:1074A000006020B020000880C04211900000190048 +:1074B0003E000003A1E00101068208C000F0043391 +:1074C0000213C541400106000000000000008000DA +:1074D000001052000800A940000000000700000052 +:1074E000210810009A002000C4201040040200006F +:1074F000000101200007F0040204800105200004BF +:107500000000000000040000000202020001002050 +:107510000400140000004000440400089100806250 +:1075200002041210211080090001084008008008A0 +:1075300001001000002020040000000010200022A4 +:10754000020800410030F304012000000240400620 +:10755000781E0009006090040000202000304018D0 +:107560000010000001000822802011AB000001087B +:1075700002043861C10C08004101830C0E1C20413B +:107580000000018508C08C04100010221420204047 +:1075900004000204220C181C310000030C122810F5 +:1075A0008C630408482022508018332081000C008E +:1075B00030A0810230208206001830846310000061 +:1075C000C6030A041060000000180060C0060C200A +:1075D0000004000030A02846000000800218C418F3 +:1075E000C11040002100204002040000000000887B +:1075F000200000000000000000000000000000006B +:10760000000000000000000000000000000000007A +:10761000000000000000000000000000000000006A +:10762000000A43FF010000540534404D24A000909F +:10763000000000000000000000181000040000C05E +:10764000000010000000000000000000000000002A +:10765000000000000000000000000000000000002A +:1076600000000000000000000000000003FF00FF19 +:10767000FF0000C00003FFF0FFFF0000C00003FF99 +:10768000F0FFFF0000C00003FFF0FFFF0000C0009C +:10769000000AF000000000000000000008000000E8 +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00000000000C00003FFF0FFFF0000C0000347 +:1076D000FFF0FFFF0000C000000AF0000000000003 +:1076E0000000000008000000000000000000000092 +:1076F000000000000000000000000000000000008A +:107700000000000000000000000000000000000079 +:107710000000000000000000000000000000000069 +:107720000000000000000000000000000000000059 +:107730000000000000000000000000000000000049 +:107740000000000000000000000000000000000039 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:107800000000000000000000000000000000000078 +:107810000000000000000000000000000000000068 +:107820000000000000000000000000000000000058 +:107830000000000000000000000000000000000048 +:107840000000000000000000000000000000000038 +:107850000000000000000000000000000000000028 +:107860000000000000000000000000000000000018 +:107870000000000000000000000000000000000008 +:1078800000000000000000000000000000000000F8 +:1078900000000000000000000000000000000000E8 +:1078A00000000000000000000000000000000000D8 +:1078B00000000000000000000000000000000000C8 +:1078C00000000000000000000000000000000000B8 +:1078D00000000000000000000000000000000000A8 +:1078E0000000000000000000000000000000000098 +:1078F0000000000000000000000000000000000088 +:107900000000000000000000000000000000000077 +:107910000000000000000000000000000000000067 +:107920000000000000000000000000000000000057 +:107930000000000000000000000000000000000047 +:107940000000000000000000000000000000000037 +:107950000000000000000000000000000000000027 +:107960000000000000000000000000000000000017 +:107970000000000000000000000000000000000007 +:1079800000000000000000000000000000000000F7 +:1079900000000000000000000000000000000000E7 +:1079A00000000000000000000000000000000000D7 +:1079B00000000000000000000000000000000000C7 +:1079C00000000000000000000000000000000000B7 +:1079D00000000000000000000000000000000000A7 +:1079E0000000000000000000000000000000000097 +:1079F0000000000000000000000000000000000087 +:107A00000000000000000000000000000000000076 +:107A10000000000000000000000000000000000066 +:107A20000000000000000000000000000000000056 +:107A30000000000000000000000000000000000046 +:107A40000000000000000000000000000000000036 +:107A50000000000000000000000000000000000026 +:107A60000000000000000000000000000000000016 +:107A70000000000000000000000000000000000006 +:107A800000000000000000000000000000000000F6 +:107A900000000000000000000000000000000000E6 +:107AA00000000000000000000000000000000000D6 +:107AB00000000000000000000000000000000000C6 +:107AC00000000000000000000000000000000000B6 +:107AD00000000000000000000000000000000000A6 +:107AE0000000000000000000000000000000000096 +:107AF0000000000000000000000000000000000086 +:107B00000000000000000000000000000000000075 +:107B10000000000000000000000000000000000065 +:107B20000000000000000000000000000000000055 +:107B30000000000000000000000000000000000045 +:107B40000000000000000000000000000000000035 +:107B50000000000000000000000000000000000025 +:107B60000000000000000000000000000000000015 +:107B70000000000000000000000000000000000005 +:107B800000000000000000000000000000000000F5 +:107B900000000000000000000000000000000000E5 +:107BA00000000000000000000000000000000000D5 +:107BB00000000000000000000000000000000000C5 +:107BC00000000000000000000000000000000000B5 +:107BD00000000000000000000000000000000000A5 +:107BE0000000000000000000000000000000000095 +:107BF0000000000000000000000000000000000085 +:107C00000000000000000000000000000000000074 +:107C10000000000000000000000000000000000064 +:107C20000000000000000000000000000000000054 +:107C30000000000000000000000000000000000044 +:107C40000000000000000000000000000000000034 +:107C50000000000000000000000000000000000024 +:107C60000000000000000000000000000000000014 +:107C70000000000000000000000000000000000004 +:107C800000000000000000000000000000000000F4 +:107C900000000000000000000000000000000000E4 +:107CA00000000000000000000000000000000000D4 +:107CB00000000000000000000000000000000000C4 +:107CC00000000000000000000000000000000000B4 +:107CD00000000000000000000000000000000000A4 +:107CE0000000000000000000000000000000000094 +:107CF0000000000000000000000000000000000084 +:107D00000000000000000000000000000000000073 +:107D10000000000000000000000000000000000063 +:107D20000000000000000000000000000000000053 +:107D30000000000000000000000000000000000043 +:107D40000000000000000000000000000000000033 +:107D50000000000000000000000000000000000023 +:107D60000000000000000000000000000000000013 +:107D70000000000000000000000000000000000003 +:107D800000000000000000000000000000000000F3 +:107D900000000000000000000000000000000000E3 +:107DA00000000000000000000000000000000000D3 +:107DB00000000000000000000000000000000000C3 +:107DC00000000000000000000000000000000000B3 +:107DD00000000000000000000000000000000000A3 +:107DE0000000000000000000000000000000000093 +:107DF0000000000000000000000000000000000083 +:107E00000000000000000000000000000000000072 +:107E10000000000000000000000000000000000062 +:107E20000000000000000000000000000000000052 +:107E30000000000000000000000000000000000042 +:107E40000000000000000000000000000000000032 +:107E50000000000000000000000000000000000022 +:107E60000000000000000000000000000000000012 +:107E70000000000000000000000000000000000002 +:107E800000000000000000000000000000000000F2 +:107E900000000000000000000000000000000000E2 +:107EA00000000000000000000000000000000000D2 +:107EB00000000000000000000000000000000000C2 +:107EC00000000000000000000000000000000000B2 +:107ED00000000000000000000000000000000000A2 +:107EE0000000000000000000000000000000000092 +:107EF0000000000000000000000000000000000082 +:107F00000000000000000000000000000000000071 +:107F10000000000000000000000000000000000061 +:107F20000000000000000000000000000000000051 +:107F30000000000000000000000000000000000041 +:107F40000000000000000000000000000000000031 +:107F50000000000000000000000000000000000021 +:107F60000000000000000000000000000000000011 +:107F70000000000000000000000000000000000001 +:107F800000000000000000000000000000000000F1 +:107F900000000000000000000000000000000000E1 +:107FA00000000000000000000000000000000000D1 +:107FB00000000000000000000000000000000000C1 +:107FC00000000000000000000000000000000000B1 +:107FD00000000000000000000000000000000000A1 +:107FE0000000000000000000000000000000000091 +:107FF0000000000000000000000000000000000081 +:108000000000000000000000000000000000000070 +:108010000000000000000000000000000000000060 +:108020000000000000000000000000000000000050 +:108030000000000000000000000000000000000040 +:108040000000000000000000000000000000000030 +:108050000000000000000000000000000000000020 +:108060000000000000000000000000000000000010 +:108070000000000000000000000000000000000000 +:1080800000000000000000000000000000000000F0 +:1080900000000000000000000000000000000000E0 +:1080A00000000000000000000000000000000000D0 +:1080B00000000000000000000000000000000000C0 +:1080C00000000000000000000000000000000000B0 +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F0000000000000000000000000000000000080 +:10810000000000000000000000000000000000006F +:10811000000000000000000000000000000000005F +:10812000000000000000000000000000000000004F +:10813000000000000000000000000000000000003F +:10814000000000000000000000000000000000002F +:10815000000000000000000000000000000000001F +:10816000000000000000000000000000000000000F +:1081700000000000000000000000000000000000FF +:1081800000000000000000000000000000000000EF +:1081900000000000000000000000000000000000DF +:1081A00000000000000000000000000000000000CF +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000000AF +:1081D000000000000000000000000000000000009F +:1081E000000000000000000000000000000000008F +:1081F000000000000000000000000000000000007F +:10820000000000000000000000000000000000006E +:10821000000000000000000000000000000000005E +:10822000000000000000000000000000000000004E +:10823000000000000000000000000000000000003E +:10824000000000000000000000000000000000002E +:10825000000000000000000000000000000000001E +:10826000000000000000000000000000000000000E +:1082700000000000000000000000000000000000FE +:1082800000000000000000000000000000000000EE +:1082900000000000000000000000000000000000DE +:1082A00000000000000000000000000000000000CE +:1082B00000000000000000000000000000000000BE +:1082C00000000000000000000000000000000000AE +:1082D000000000000000000000000000000000009E +:1082E000000000000000000000000000000000008E +:1082F000000000000000000000000000000000007E +:10830000000000000000000000000000000000006D +:10831000000000000000000000000000000000005D +:10832000000000000000000000000000000000004D +:10833000000000000000000000000000000000003D +:10834000000000000000000000000000000000002D +:10835000000000000000000000000000000000001D +:10836000000000000000000000000000000000000D +:1083700000000000000000000000000000000000FD +:1083800000000000000000000000000000000000ED +:1083900000000000000000000000000000000000DD +:1083A00000000000000000000000000000000000CD +:1083B00000000000000000000000000000000000BD +:1083C00000000000000000000000000000000000AD +:1083D000000000000000000000000000000000009D +:1083E000000000000000000000000000000000008D +:1083F000000000000000000000000000000000007D +:10840000000000000000000000000000000000006C +:10841000000000000000000000000000000000005C +:10842000000000000000000000000000000000004C +:10843000000000000000000000000000000000003C +:10844000000000000000000000000000000000002C +:10845000000000000000000000000000000000001C +:10846000000000000000000000000000000000000C +:1084700000000000000000000000000000000000FC +:1084800000000000000000000000000000000000EC +:1084900000000000000000000000000000000000DC +:1084A00000000000000000000000000000000000CC +:1084B00000000000000000000000000000000000BC +:1084C00000000000000000000000000000000000AC +:1084D000000000000000000000000000000000009C +:1084E000000000000000000000000000000000008C +:1084F000000000000000000000000000000000007C +:10850000000000000000000000000000000000006B +:10851000000000000000000000000000000000005B +:10852000000000000000000000000000000000004B +:10853000000000000000000000000000000000003B +:10854000000000000000000000000000000000002B +:10855000000000000000000000000000000000001B +:10856000000000000000000000000000000000000B +:1085700000000000000000000000000000000000FB +:1085800000000000000000000000000000000000EB +:1085900000000000000000000000000000000000DB +:1085A00000000000000000000000000000000000CB +:1085B00000000000000000000000000000000000BB +:1085C00000000000000000000000000000000000AB +:1085D000000000000000000000000000000000009B +:1085E000000000000000000000000000000000008B +:1085F000000000000000000000000000000000007B +:10860000000000000000000000000000000000006A +:10861000000000000000000000000000000000005A +:10862000000000000000000000000000000000004A +:10863000000000000000000000000000000000003A +:10864000000000000000000000000000000000002A +:10865000000000000000000000000000000000001A +:10866000000000000000000000000000000000000A +:1086700000000000000000000000000000000000FA +:1086800000000000000000000000000000000000EA +:1086900000000000000000000000000000000000DA +:1086A00000000000000000000000000000000000CA +:1086B00000000000000000000000000000000000BA +:1086C00000000000000000000000000000000000AA +:1086D000000000000000000000000000000000009A +:1086E000000000000000000000000000000000008A +:1086F000000000000000000000000000000000007A +:108700000000000000000000000000000000000069 +:108710000000000000000000000000000000000059 +:108720000000000000000000000000000000000049 +:108730000000000000000000000000000000000039 +:108740000000000000000000000000000000000029 +:108750000000000000000000000000000000000019 +:108760000000000000000000000000000000000009 +:1087700000000000000000000000000000000000F9 +:1087800000000000000000000000000000000000E9 +:1087900000000000000000000000000000000000D9 +:1087A00000000000000000000000000000000000C9 +:1087B00000000000000000000000000000000000B9 +:1087C00000000000000000000000000000000000A9 +:1087D0000000000000000000000000000000000099 +:1087E0000000000000000000000000000000000089 +:1087F0000000000000000000000000000000000079 +:108800000000000000000000000000000000000068 +:108810000000000000000000000000000000000058 +:108820000000000000000000000000000000000048 +:108830000000000000000000000000000000000038 +:108840000000000000000000000000000000000028 +:108850000000000000000000000000000000000018 +:108860000000000000000000000000000000000008 +:1088700000000000000000000000000000000000F8 +:1088800000000000000000000000000000000000E8 +:1088900000000000000000000000000000000000D8 +:1088A00000000000000000000000000000000000C8 +:1088B00000000000000000000000000000000000B8 +:1088C00000000000000000000000000000000000A8 +:1088D0000000000000000000000000000000000098 +:1088E0000000000000000000000000000000000088 +:1088F0000000000000000000000000000000000078 +:108900000000000000000000000000000000000067 +:108910000000000000000000000000000000000057 +:108920000000000000000000000000000000000047 +:108930000000000000000000000000000000000037 +:108940000000000000000000000000000000000027 +:108950000000000000000000000000000000000017 +:108960000000000000000000000000000000000007 +:1089700000000000000000100004000100000000E2 +:1089800000000000000000000000000000000000E7 +:1089900000000000000000000000000000000000D7 +:1089A00000000000000000000000000000000000C7 +:1089B00000000000000000000000000000000900AE +:1089C00000000000000000000000000000000000A7 +:1089D0000000000000000000000000000000000097 +:1089E0000000000000000000000000000000000087 +:1089F0000000000000000000000000000000000077 +:108A000000000000000008404888204000020001EB +:108A1000218000C0002080800004808000000002CF +:108A2000000080000001040801202484810100006E +:108A3000000002000000200000000000040001010E +:108A400021192400D0091000102220000204004047 +:108A5000011000400002000000010200800004211B +:108A60001000404460800002230400020110040052 +:108A7000000000008820008900042208890240804C +:108A80000810041000800400400000000000008076 +:108A900041D00200249224904180400408000A083A +:108AA00000010881402000000420028080000000B6 +:108AB000190410008010420450080000040192EBD9 +:108AC000E8BE80000B8010004400004904008408C8 +:108AD00080112000840108000000000040000820F0 +:108AE00000000210400000082040002001000000AB +:108AF00000090062101000E880105D40B100001C09 +:108B000000180004000110020002300000080000FC +:108B10000000080000000000A000040000000000A9 +:108B2000000000000000008000002008208180215B +:108B30000008C50002C48200175EC00C900000024D +:108B4000402210408000081001000206060020406C +:108B50000020000800000000020000000400008067 +:108B6000504000500820200050220000802A0802B7 +:108B70008030200200BFF13E470239F000000000C3 +:108B800000000000404090104000000000409004B1 +:108B900048040000000000A4000040000000028023 +:108BA0000088048000000800008000002A322408A9 +:108BB00042810A281100060508000090A868101AD2 +:108BC000090B82821444212002020FF480000C0859 +:108BD00000000000B510000C80613D220000020280 +:108BE00000C0690040040010334080000D30080AC6 +:108BF0003018584CD000C00A2D31A54094040044D0 +:108C00008124002250040804200012110A001008D8 +:108C100019A60D01425328B34A08430604014468CB +:108C20002B4004088ACA12608062A10698406981BC +:108C3000804021002FD94096520610D280010308AF +:108C40002D12833008A0004A051D3130B05F43303B +:108C50003043434001201020000000808002500873 +:108C6000000000001412145021041004080AA01877 +:108C7000000A0000000908010000064811B4CA8477 +:108C80006201540116001E4A8A01002420F00D00E2 +:108C90000318A20A08861A0B18021940A0046023C0 +:108CA000201186981195846C680B19032280444822 +:108CB000C0002828000000088460030B9280400058 +:108CC000A8A43508260A000060C120D0030841810D +:108CD000D28191C046A60201019480235010063132 +:108CE00001840800521020012010020181040400B8 +:108CF000010004041A00D00049000C008010B104E7 +:108D000000D216028080B4904200902108600000DA +:108D100002D340258002D24039000000010C00003F +:108D200000000019142211000A08200000000800A9 +:108D300020800082610000100002340000000A0060 +:108D4000048000808A000019740580311C81A313FF +:108D5000CD900C000222080310800028182000008B +:108D60009140A0409000320001CC027054E407080A +:108D700002088802C1447E013C28441322715849EC +:108D800040322A4252A20B14200214A981B62009B3 +:108D900080C2542680800001DC8066F11131092EEA +:108DA00000ABF0A15C2784401A3044A000800CE2A4 +:108DB00002AE33BD00D8F60D94CE4A80C10C340605 +:108DC0000A0C01240010B80B841C344EE471AA2054 +:108DD0001A440CA04001800404A14105540903C0B9 +:108DE0001A5049D22800402D021004327C0048005D +:108DF000840000000800131000B0A031144A411490 +:108E00004A0284A0948CD001022908278081200C7A +:108E100000300A0A1310000094EA08C18510111AE4 +:108E2000001608040540002000000000040A0201AA +:108E30000040004002081283410000280000088022 +:108E40000000000000800000420400024400000016 +:108E500000024104000500200800284C90212A4807 +:108E600002041B02446A2022400902289B04046079 +:108E700080C80B0000480204C01000000028000059 +:108E80000100440400800080010C43D400208000D5 +:108E9000810201410280100000000000001000006B +:108EA0000002800002001830800020004001020013 +:108EB0001000801DF000198100803D080084000032 +:108EC00000200402282CE2010800A0E03820004025 +:108ED0000004022000A002003300E0C01420014082 +:108EE0000000804000804000A800100000800020AA +:108EF00020000000010000090815070022001000F2 +:108F000010000A02000000110288404D4420004A6F +:108F100000028220111008004001910104000400A9 +:108F200000400000000000802060002200000000DF +:108F30000000400008A00000200001010004924A47 +:108F400008805008E00428000024509009000A001E +:108F500080000800000081001001000000000500F2 +:108F600008000200001000000181040105081C082F +:108F70000000021102042000000200040801505009 +:108F80005A0002410108210820082000004000008A +:108F90004180800000008C00229A0C5004000048A0 +:108FA0000022D400120220C008A80085002FBE377E +:108FB00085CE167025DC03C00000040360231C2846 +:108FC00002001E000242D0001E2426418107B1FB90 +:108FD000A42311026C0000012400200025020638A1 +:108FE0008223CCBBF73A210093319F44E2920933AC +:108FF000C9FC5201240A8A210E0482906F906208F3 +:10900000002C0414101508A14C006400006020B06E +:109010002000088040421010000019003E000003AC +:10902000A16001030600080040F004310213C541AD +:1090300040010600000000080000800000105200FF +:109040000800A940000000000700000020001000F8 +:1090500080002000442010400402000000010100B4 +:109060000007F004820082010120800430400000EB +:10907000000400400022424208010128040014209C +:10908000001040000004000891008042000410001D +:1090900001000008000108400800800801001000DD +:1090A0000020000002000000002000220208004111 +:1090B0000000000000200000004040000000000010 +:1090C0000000100000002020000000000010000040 +:1090D00001000820802011AB0027009000081080BC +:1090E000000418024081020C04081020430200878B +:1090F00018C08402B80108121C6021C104000204D7 +:10910000200810092100810220908000000802043C +:109110000C1812108018301020C102003060830A31 +:10912000002041000010200042000000000204085E +:1091300000402040821400A040021C3060C30600A2 +:10914000102038C2010000842090841081000000AB +:109150000000408404083060C10600882080182286 +:109160006546EDD200082501002008024070000C81 +:10917000C310200160A0CC806A632210C098B1891E +:109180008814F4007D40D0C0000405100001CFFE1B +:1091900010400404050D0147592003FCF0303FFF47 +:1091A000C000F0000008B0000400006000003000C3 +:1091B00000000000000000000000000000000000AF +:1091C000000000000000000000000000000000009F +:1091D000000000000000000000000000003FFF0F42 +:1091E000FFF3FFFCFFFF3FFFCFFFF3FFFCFFFF009C +:1091F00000C00000000000000000000000020000AD +:109200000000100000000000180000000000000036 +:10921000000000000000000000000000000000004E +:1092200000000000000000000000000000003FFF00 +:10923000CFFFF3FFFCFFFF0000C0000000000000B4 +:10924000000000000002000000001000000000000C +:1092500018000000000000000000000000000000F6 +:1092600000000000000000000000000000000000FE +:1092700000000000000000000000000000000000EE +:1092800000000000000000000000000000000000DE +:1092900000000000000000000000000000000000CE +:1092A00000000000000000000000000000000000BE +:1092B00000000000000000000000000000000000AE +:1092C000000000000000000000000000000000009E +:1092D000000000000000000000000000000000008E +:1092E000000000000000000000000000000000007E +:1092F000000000000000000000000000000000006E +:10930000000000000000000000000000000000005D +:10931000000000000000000000000000000000004D +:109320000000000000000000000006404A010000AC +:1093300000020001698025C0016880000000000073 +:10934000000000020000000000000000000000809B +:109350000C01000028000000FF000003E0000407EB +:1093600000A00600031A5C00811990C070E3218000 +:10937000033400C30330C0C30000C00078016E0195 +:10938000D8005BEF34004DDDF3800CEEEF1C0044A1 +:10939000F7724F3C21BC3E42007B70000000000091 +:1093A00001000003D0102F3D21EC8DFAF002BC002B +:1093B00040000000020202042AAC156403DA5004E3 +:1093C0001C12840800039A80802000940E68040018 +:1093D00080001001001410008010E68422080001B3 +:1093E000052002AAC8AC84000A8C5000440400E99D +:1093F0000090848880112000A40108000000000073 +:109400004140080000000210400000082000000059 +:1094100000000000100B4044001400687E1455400A +:1094200094008808C00400000003520A00001000E5 +:10943000000A0000200C5295154509402012802892 +:10944000251250428250250C504A09A081C860EA7A +:109450006098392B0748C52092C4821C1556C00C51 +:10946000B000000364321040C08009904104020241 +:1094700083102040002000080D000401820081AD0F +:10948000150C0188514808D0002A6FC9F2600040CD +:10949000AACA2828C038600230B6D52C5602B1D1ED +:1094A000224006382888C1A170211401440000011F +:1094B0000000000000040108000C21A104000020AD +:1094C000800202023188042800004D0080880400D8 +:1094D0003E3AB4884280000C90000000080000B8BA +:1094E000A84A10120B828281B4442118001A40004D +:1094F00000000000000000000002E318349C3E0859 +:109500008240F202006249202046A1723340021CD0 +:109510001D300A09703858C8D0004848AD33A550EE +:10952000561C08418104B020008500052B0010C3A3 +:109530007AE8004B3BA60D41225728B34B0B570648 +:1095400000112EE82B501959C8CA126884249116AC +:1095500098067C9050081B8D0FDF84C2114494D272 +:109560008A36430A2D03CB3432F2009D88393130DC +:10957000101D6B30124D6B42AFDC97601589CE2BFE +:10958000B265C430AA2472028952AAC0810931B3DB +:1095900082BEF3FC003E03022A482D908008050895 +:1095A00037B4CAA5E1695449320FFE4ABE0101042D +:1095B000336D0D39831CA29A189E1A2B180379401B +:1095C000A18C6923241186980396B4EDED07794F99 +:1095D000E3C1257CE0030FFE08110040D0E0432FDB +:1095E000B684C191BDEC355E262F0988E1C7B0BCB9 +:1095F0001318C241F6A195C0CEF6310B03808073DB +:10960000D07CD631C18D15D152346603249003012C +:10961000811D4C36C908A60B3A607EA4898026AC11 +:109620000587D05EC4498A315F0F1250420CBB0ED1 +:109630001E184A62204EDCFB8F3C49442871F4A07E +:109640004974000004110009100045203A0010C3BD +:10965000FF802C07000000C8210044400006900154 +:1096600008D1220804D414158A1640185403201077 +:109670000801061098903C0005AA480610821000C8 +:10968000000020089260002090800800039E007374 +:10969000DCC513000008880083446A043E2A401990 +:1096A00022F9484FC5122202C0A20330281F10CB56 +:1096B00081AE2088A8A64404480000019E80A6F040 +:1096C00011B5806E30A3A0395827CC022A30000093 +:1096D00000001DF30247B3FD2010472C958F009228 +:1096E000410CB40703080034001028020414144C81 +:1096F000F07283809ACC0E204101C0848C814D048D +:10970000010DA3D23E4009D2315242B40243C43AC1 +:109710007E02EA804DD0823482462858C524030355 +:109720001886601846419861250C67FE129008A7BC +:10973000D287280D5E1000080101200096AA0E01B4 +:10974000C551112800344A15054D4420221082C00D +:109750001408020DC1508040433C3282E140447CF9 +:10976000800208910000102100905000424C8002BD +:10977000400001000102408E8005803008006DC469 +:10978000D8206A4C9000110004420002D4009008D6 +:109790001102544212EC2E101CCC00058254CC68ED +:1097A0001C21B686F792AE9C918725E6435C620D3C +:1097B000B0A4AA000106FF4326A83299021101585D +:1097C0001006008000128C023AC2A900021D29086E +:1097D0000571925180D0021D65401F802400201A1F +:1097E00011A1480E93B81413AB3DE201AC222DEC4D +:1097F000FA2C2BE0035FB03144280234D00CA001D6 +:109800007C2411C806A88040A0832403A8015C46DC +:10981000E88382C4287C3E05C93E022088951A3C14 +:1098200016C270F35AA49A9F2320455380C968C575 +:10983000402000CACF328470535E02014000910084 +:10984000300000151200016000008280207849027B +:1098500000B2A0000029400C5023BFBCA80F091083 +:109860000026120AA824D4288004EA015924729000 +:1098700029264E32D288884EF5348500365100882C +:109880008DA101394BC182CF4835290001C904019E +:109890002408BCEB1EF7021541CDA408D024D20643 +:1098A000EDB0450CDA55026141692169206920005B +:1098B00008C041610000F40930114B80201C003DBC +:1098C000C03E194B7FA29400378B000009A820B539 +:1098D00000273F27A1CE863024CC43C00051842FDF +:1098E00062231CAAC5208E0C0253D4041E270765D0 +:1098F000050790EBA4231116EC095001BE04219535 +:1099000021424F3882A30C99F73A810093319F503E +:10991000A8120933C9F50281242ABA23CE08CA90B5 +:109920006F90E208143C0D5432B508A54E00668CC9 +:1099300043E0A2B0454222208AD0904200000800B5 +:109940000804004125600180060008014020001144 +:109950000203AD497D207A00307C0E92C011B22204 +:1099600060154A201B8BAB435C08D70231788C30E2 +:109970006201FC51A0162E42C0F00244001200FF0A +:109980000E0000007C07F0006800000100200000CD +:109990001410010080848002A9269E0E141133A4A5 +:1099A00034A1058B4004800000000028910000C015 +:1099B000C0000000004004E0000140500A00A00A7E +:1099C00001401400002800004A00000018000400B4 +:1099D00000080A012400000538000801F00000BF5B +:1099E000FA3E9FC103F0000000FF00010FBD001E02 +:1099F0009C3DF02C8BCF5E70A7EC350004210094C9 +:109A00002008104089244800408102042408204492 +:109A1000820441021089080411021120084040818B +:109A20000448820420089048210481090410102071 +:109A300008410448489020211011212040822440F0 +:109A40002240022411204912001020084211204017 +:109A500042020408224400890408104080040820BF +:109A600040820401224010840102008420108410EE +:109A70008108420021104484040820408224008888 +:109A80004442CD203B8A50E3502C0C0C00018060F6 +:109A9000C3A0004882080A0E238011C0E28E390854 +:109AA000C156E3A0245260001A001000010004A077 +:109AB000000DCC0011140051450C340264400040EC +:109AC000F0203FFFC000F000005AB0078000000007 +:109AD00000009000000000000000000000000000F6 +:109AE0000000000000000000000000000000000076 +:109AF0000000000000000000000000000000000066 +:109B00000000000000000000000000000000000055 +:109B10000000000000000000000000000000000045 +:109B2000000300000000000000000000080000002A +:109B30000000000000000000000000000000000025 +:109B40000000000000000000000000000000000015 +:109B50000000000000000000000000000000000005 +:109B600000000000000000000003000000000000F2 +:109B700000000000080000000000000000000000DD +:109B800000000000000000000000000000000000D5 +:109B900000000000000000000000000000000000C5 +:109BA00000000000000000000000000000000000B5 +:109BB00000000000000000000000000000000000A5 +:109BC0000000000000000000000000000000000095 +:109BD0000000000000000000000000000000000085 +:109BE0000000000000000000000000000000000075 +:109BF0000000000000000000000000000000000065 +:109C00000000000000000000000000000000000054 +:109C10000000000000000000000000000000000044 +:109C20000000000000000000000000000000000034 +:109C30000000000000000000000000000000000024 +:109C40000000000000000000000000000000000014 +:109C50000000000000000000000000000000000004 +:109C600000000000000000000000000000000000F4 +:109C700000000000000000000000000000000000E4 +:109C800000000000000000000000000000000000D4 +:109C900000000000000000000000000000000000C4 +:109CA00000000000000000000000000000000000B4 +:109CB00000000000000000000000000000000000A4 +:109CC0000000000000000000000000000000000094 +:109CD0000000000000000000000000000000000084 +:109CE0000000000000000000000000000000000074 +:109CF0000000000000000000000000000000000064 +:109D00000000000000000000000000000000000053 +:109D10000000000000000000000000000000000043 +:109D20000000000000000000000000000000000033 +:109D30000000000000000000000000000000000023 +:109D40000000000000000000000000000000000013 +:109D50000000000000000000000000000000000003 +:109D600000000000000000000000000000000000F3 +:109D700000000000000000000000000000000000E3 +:109D800000000000000000000000000000000000D3 +:109D900000000000000000000000000000000000C3 +:109DA00000000000000000000000000000000000B3 +:109DB00000000000000000000000000000000000A3 +:109DC0000000000000000000000000000000000093 +:109DD0000000000000000000000000000000000083 +:109DE0000000000000000000000000000000000073 +:109DF0000000000000000000000000000000000063 +:109E00000000000000000000000000000000000052 +:109E10000000000000000000000000000000000042 +:109E20000000000000000000000000000000000032 +:109E30000000000000000000000000000000000022 +:109E40000000000000000000000000000000000012 +:109E50000000000000000000000000000000000002 +:109E600000000000000000000000000000000000F2 +:109E700000000000000000000000000000000000E2 +:109E800000000000000000000000000000000000D2 +:109E900000000000000000000000000000000000C2 +:109EA00000000000000000000000000000000000B2 +:109EB00000000000000000000000000000000000A2 +:109EC0000000000000000000000000000000000092 +:109ED0000000000000000000000000000000000082 +:109EE0000000000000000000000000000000000072 +:109EF0000000000000000000000000000000000062 +:109F00000000000000000000000000000000000051 +:109F10000000000000000000000000000000000041 +:109F20000000000000000000000000000000000031 +:109F30000000000000000000000000000000000021 +:109F40000000000000000000000000000000000011 +:109F50000000000000000000000000000000000001 +:109F600000000000000000000000000000000000F1 +:109F700000000000000000000000000000000000E1 +:109F800000000000000000000000000000000000D1 +:109F900000000000000000000000000000000000C1 +:109FA00000000000000000000000000000000000B1 +:109FB00000000000000000000000000000000000A1 +:109FC0000000000000000000000000000000000091 +:109FD0000000000000000000000000000000000081 +:109FE0000000000000000000000000000000000071 +:109FF0000000000000000000000000000000000061 +:10A000000000000000000000000000000000000050 +:10A010000000000000000000000000000000000040 +:10A020000000000000000000000000000000000030 +:10A030000000000000000000000000000000000020 +:10A040000000000000000000000000000000000010 +:10A050000000000000000000000000000000000000 +:10A0600000000000000000000000000000000000F0 +:10A0700000000000000000000000000000000000E0 +:10A0800000000000000000000000000000000000D0 +:10A0900000000000000000000000000000000000C0 +:10A0A00000000000000000000000000000000000B0 +:10A0B00000000000000000000000000000000000A0 +:10A0C0000000000000000000000000000000000090 +:10A0D0000000000000000000000000000000000080 +:10A0E0000000000000000000000000000000000070 +:10A0F0000000000000000000000000000000000060 +:10A10000000000000000000000000000000000004F +:10A11000000000000000000000000000000000003F +:10A12000000000000000000000000000000000002F +:10A13000000000000000000000000000000000001F +:10A14000000000000000000000000000000000000F +:10A1500000000000000000000000000000000000FF +:10A1600000000000000000000000000000000000EF +:10A1700000000000000000000000000000000000DF +:10A1800000000000000000000000000000000000CF +:10A1900000000000000000000000000000000000BF +:10A1A00000000000000000000000000000000000AF +:10A1B000000000000000000000000000000000009F +:10A1C000000000000000000000000000000000008F +:10A1D000000000000000000000000000000000007F +:10A1E000000000000000000000000000000000006F +:10A1F000000000000000000000000000000000005F +:10A20000000000000000000000000000000000004E +:10A21000000000000000000000000000000000003E +:10A22000000000000000000000000000000000002E +:10A23000000000000000000000000000000000001E +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A2900000000000000000000000000000000000BE +:10A2A00000000000000000000000000000000000AE +:10A2B000000000000000000000000000000000009E +:10A2C000000000000000000000000000000000008E +:10A2D000000000000000000000000000000000007E +:10A2E000000000000000000000000000000000006E +:10A2F000000000000000000000000000000000005E +:10A30000000000000000000000000000000000004D +:10A31000000000000000000000000000000000003D +:10A32000000000000000000000000000000000002D +:10A33000000000000000000000000000000000001D +:10A34000000000000000000000000000000000000D +:10A3500000000000000000000000000000000000FD +:10A3600000000000000000000000000000000000ED +:10A3700000000000000000000000000000000000DD +:10A3800000000000000000000000000000000000CD +:10A3900000000000000000000000000000000000BD +:10A3A00000000000000000000000000000000000AD +:10A3B000000000000000000000000000000000009D +:10A3C000000000000000000000000000000000008D +:10A3D000000000000000000000000000000000007D +:10A3E000000000000000000000000000000000006D +:10A3F000000000000000000000000000000000005D +:10A40000000000000000000000000000000000004C +:10A41000000000000000000000000000000000003C +:10A42000000000000000000000000000000000002C +:10A43000000000000000000000000000000000001C +:10A44000000000000000000000000000000000000C +:10A4500000000000000000000000000000000000FC +:10A4600000000000000000000000000000000000EC +:10A4700000000000000000000000000000000000DC +:10A4800000000000000000000000000000000000CC +:10A4900000000000000000000000000000000000BC +:10A4A00000000000000000000000000000000000AC +:10A4B000000000000000000000000000000000009C +:10A4C000000000000000000000000000000000008C +:10A4D000000000000000000000000000000000007C +:10A4E000000000000000000000000000000000006C +:10A4F000000000000000000000000000000000005C +:10A50000000000000000000000000000000000004B +:10A51000000000000000000000000000000000003B +:10A52000000000000000000000000000000000002B +:10A53000000000000000000000000000000000001B +:10A54000000000000000000000000000000000000B +:10A5500000000000000000000000000000000000FB +:10A5600000000000000000000000000000000000EB +:10A5700000000000000000000000000000000000DB +:10A5800000000000000000000000000000000000CB +:10A5900000000000000000000000000000000000BB +:10A5A00000000000000000000000000000000000AB +:10A5B000000000000000000000000000000000009B +:10A5C000000000000000000000000000000000008B +:10A5D000000000000000000000000000000000007B +:10A5E000000000000000000000000000000000006B +:10A5F000000000000000000000000000000000005B +:10A60000000000000000000000000000000000004A +:10A61000000000000000000000000000000000003A +:10A62000000000000000000000000000000000002A +:10A63000000000000000000000000000000000001A +:10A64000000000000000000000000000000000000A +:10A6500000000000000000000000000000000000FA +:10A6600000000000000000000000000000000000EA +:10A6700000000000000000000000000000000000DA +:10A6800000000000000000000000000000000000CA +:10A6900000000000000000000000000000000000BA +:10A6A00000000000000000000000000000000000AA +:10A6B000000000000000000000000000000000009A +:10A6C000000000000000000000000000000000008A +:10A6D000000000000000000000000000000000007A +:10A6E000000000000000000000000000000000006A +:10A6F000000000000000000000000000000000005A +:10A700000000000000000000000000000000000049 +:10A710000000000000000000000000000000000039 +:10A720000000000000000000000000000000000029 +:10A730000000000000000000000000000000000019 +:10A740000000000000000000000000000000000009 +:10A7500000000000000000000000000000000000F9 +:10A7600000000000000000000000000000000000E9 +:10A7700000000000000000000000000000000000D9 +:10A7800000000000000000000000000000000000C9 +:10A7900000000000000000000000000000000000B9 +:10A7A00000000000000000000000000000000000A9 +:10A7B0000000000000000000000000000000000099 +:10A7C0000000000000000000000000000000000089 +:10A7D0000000000000000000000000000000000079 +:10A7E0000000000000000000000000000000000069 +:10A7F0000000000000000000000000000000000059 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A820000000000000000000000000000000000028 +:10A830000000000000000000000000000000000018 +:10A840000000000000000000000000000000000008 +:10A8500000000000000000000000000000000000F8 +:10A8600000000000000000000000000000000000E8 +:10A8700000000000000000000000000000000000D8 +:10A8800000000000000000000000000000000000C8 +:10A8900000000000000000000000000000000000B8 +:10A8A00000000000000000000000000000000000A8 +:10A8B0000000000000000000000000000000000098 +:10A8C0000000000000000000000000000000000088 +:10A8D0000000000000000000000000000000000078 +:10A8E0000000000000000000000000000000000068 +:10A8F0000000000000000000000000000000000058 +:10A900000000000000000000000000000000000047 +:10A910000000000000000000000000000000000037 +:10A920000000000000000000000000000000000027 +:10A930000000000000000000000000000000000017 +:10A940000000000000000000000000000000000007 +:10A9500000000000000000000000000000000000F7 +:10A9600000000000000000000000000000000000E7 +:10A9700000000000000000000000000000000000D7 +:10A9800000000000000000000000000000000000C7 +:10A9900000000000000000000000000000000000B7 +:10A9A00000000000000000000000000000000000A7 +:10A9B0000000000000000000000000000000000097 +:10A9C0000000000000000000000000000000000087 +:10A9D0000000000000000000000000000000000077 +:10A9E0000000000000000000000000000000000067 +:10A9F0000000000000000000000000000000000057 +:10AA00000000000000000000000000000000000046 +:10AA10000000000000000000000000000000000036 +:10AA20000000000000000000000000000000000026 +:10AA30000000000000000000000000000000000016 +:10AA40000000000000000000000000000000000006 +:10AA500000000000000000000000000000000000F6 +:10AA600000000000000000000000000000000000E6 +:10AA700000000000000000000000000000000000D6 +:10AA800000000000000000000000000000000000C6 +:10AA900000000000000000000000000000000000B6 +:10AAA00000000000000000000000000000000000A6 +:10AAB0000000000000000000000000000000000096 +:10AAC0000000000000000000000000000000000086 +:10AAD0000000000000000000000000000000000076 +:10AAE0000000000000000000000000000000000066 +:10AAF0000000000000000000000000000000000056 +:10AB00000000000000000000000000000000000045 +:10AB10000000000000000000000000000000000035 +:10AB20000000000000000000000000000000000025 +:10AB30000000000000000000000000000000000015 +:10AB40000000000000000000000000000000000005 +:10AB500000000000000000000000000000000000F5 +:10AB600000000000000000000000000000000000E5 +:10AB700000000000000000000000000000000000D5 +:10AB800000000000000000000000000000000000C5 +:10AB900000000000000000000000000000000000B5 +:10ABA00000000000000000000000000000000000A5 +:10ABB0000000000000000000000000000000000095 +:10ABC0000000000000000000000000000000000085 +:10ABD0000000000000000000000000000000000075 +:10ABE0000000000000000000000000000000000065 +:10ABF0000000000000000000000000000000000055 +:10AC00000000000000000000000000000000000044 +:10AC10000000000000000000000000000000000034 +:10AC20000000000000000000000000000000000024 +:10AC30000000000000000000000000000000000014 +:10AC40000000000000000000000000000000000004 +:10AC500000000000000000000000000000000000F4 +:10AC600000000000000000000000000000000000E4 +:10AC700000000000000000000000000000000000D4 +:10AC800000000000000000000000000000000000C4 +:10AC900000000000000000000000000000000000B4 +:10ACA00000000000000000000000000000000000A4 +:10ACB0000000000000000000000000000000000094 +:10ACC0000000000000000000000000000000000084 +:10ACD0000000000000000000000000000000000074 +:10ACE0000000000000000000000000000000000064 +:10ACF0000000000000000000000000000000000054 +:10AD00000000000000000000000000000000000043 +:10AD10000000000000000000000000000000000033 +:10AD20000000000000000000000000000000000023 +:10AD30000000000000000000000000000000000013 +:10AD40000000000000000000000000000000000003 +:10AD500000000000000000000000000000000000F3 +:10AD600000000000000000000000000000000000E3 +:10AD700000000000000000000000000000000000D3 +:10AD800000000000000000000000000000000000C3 +:10AD900000000000000000000000000000000000B3 +:10ADA00000000000000000000000000000000000A3 +:10ADB0000000000000000000000000000000000093 +:10ADC0000000000000000000000000000000000083 +:10ADD0000000000000000000000000000000000073 +:10ADE0000000000000000000000000000000000063 +:10ADF0000000000000000000000000000000000053 +:10AE00000000000000000000000000000000000042 +:10AE10000000000000000000000000000000000032 +:10AE20000000000000000000000000000000000022 +:10AE30000000000000000000000000000000000012 +:10AE40000000000000000000000000000000000002 +:10AE500000000000000000000000000000000000F2 +:10AE600000000000000000000000000000000000E2 +:10AE700000000000000000000000000000000000D2 +:10AE800000000000000000000000000000000000C2 +:10AE900000000000000000000000000000000000B2 +:10AEA00000000000000000000000000000000000A2 +:10AEB0000000000000000000000000000000000092 +:10AEC0000000000000000000000000000000000082 +:10AED0000000000000000000000000000000000072 +:10AEE0000000000000000000000000000000000062 +:10AEF0000000000000000000000000000000000052 +:10AF00000000000000000000000000000000000041 +:10AF10000000000000000000000000000000000031 +:10AF20000000000000000000000000000000000021 +:10AF30000000000000000000000000000000000011 +:10AF40000000000000000000000000000000000001 +:10AF500000000000000000000000000000000000F1 +:10AF600000000000000000000000000000000000E1 +:10AF700000000000000000000000000000000000D1 +:10AF800000000000000000000000000000000000C1 +:10AF900000000000000000000000000000000000B1 +:10AFA00000000000000000000000000000000000A1 +:10AFB0000000000000000000000000000000000091 +:10AFC0000000000000000000000000000000000081 +:10AFD0000000000000000000000000000000000071 +:10AFE0000000000000000000000000000000000061 +:10AFF0000000000000000000000000000000000051 +:10B000000000000000000000000000000000000040 +:10B010000000000000000000000000000000000030 +:10B020000000000000000000000000000000000020 +:10B030000000000000000000000000000000000010 +:10B040000000000000000000000000000000000000 +:10B0500000000000000000000000000000000000F0 +:10B0600000000000000000000000000000000000E0 +:10B0700000000000000000000000000000000000D0 +:10B0800000000000000000000000000000000000C0 +:10B0900000000000000000000000000000000000B0 +:10B0A00000000000000000000000000000000000A0 +:10B0B0000000000000000000000000000000000090 +:10B0C0000000000000000000000000000000000080 +:10B0D0000000000000000000000000000000000070 +:10B0E0000000000000000000000000000000000060 +:10B0F0000000000000000000000000000000000050 +:10B10000000000000000000000000000000000003F +:10B11000000000000000000000000000000000002F +:10B12000000000000000000000000000000000001F +:10B13000000000000000000000000000000000000F +:10B1400000000000000000000000000000000000FF +:10B1500000000000000000000000000000000000EF +:10B1600000000000000000000000000000000000DF +:10B1700000000000000000000000000000000000CF +:10B1800000000000000000000000000000000000BF +:10B1900000000000000000000000000000000000AF +:10B1A000000000000000000000000000000000009F +:10B1B000000000000000000000000000000000008F +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F000000000000000000000000000000000004F +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B23000000000000000000000000000000000000E +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B2700000000000000000000000000000000000CE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B000000000000000000000000000000000008E +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F000000000000000000000000000000000004E +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000000000000000000D +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B3700000000000000000000000000000000000CD +:10B3800000000000000000000000000000000000BD +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B000000000000000000000000000000000008D +:10B3C000000000000000000000000000000000007D +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B40000000000000000000000000000000000003C +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000000000000000000000000000000000FC +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B4800000000000000000000000000000000000BC +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C000000000000000000000000000000000007C +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B50000000000000000000000000000000000003B +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B5400000000000000000000000000000000000FB +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B5800000000000000000000000000000000000BB +:10B5900000000000000000000000000000000000AB +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C000000000000000000000000000000000007B +:10B5D000000000000000000000000000000000006B +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B61000000000000000000000000000000000002A +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000000000000000000000000000000000EA +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B6900000000000000000000000000000000000AA +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D000000000000000000000000000000000006A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B710000000000000000000000000000000000029 +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B7500000000000000000000000000000000000E9 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B7900000000000000000000000000000000000A9 +:10B7A0000000000000000000000000000000000099 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D0000000000000000000000000000000000069 +:10B7E0000000000000000000000000000000000059 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820000000000000000000000000000000000018 +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000000000000000000000000000000000D8 +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A0000000000000000000000000000000000098 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000000000000000000000000058 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B920000000000000000000000000000000000017 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B9600000000000000000000000000000000000D7 +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000000000000097 +:10B9B0000000000000000000000000000000000087 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E0000000000000000000000000000000000057 +:10B9F0000000000000000000000000000000000047 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30000000000000000000000000000000000006 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000000000000000000000000000000000C6 +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB0000000000000000000000000000000000086 +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000000000000000000000000046 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB30000000000000000000000000000000000005 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB700000000000000000000000000000000000C5 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000000000000085 +:10BBC0000000000000000000000000000000000075 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF0000000000000000000000000000000000045 +:10BC00000000000000000000000000000000000034 +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC400000000000000000000000000000000000F4 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000000000000000000000000000000000B4 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC0000000000000000000000000000000000074 +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000000000000000000000000033 +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000000000000000000000F3 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD800000000000000000000000000000000000B3 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000000000000073 +:10BDD0000000000000000000000000000000000063 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE00000000000000000000000000000000000032 +:10BE10000000000000000000000000000000000022 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE500000000000000000000000000000000000E2 +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000000000000000000000000000000000A2 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED0000000000000000000000000000000000062 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000000000000000000000000021 +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000000000000000000000E1 +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF900000000000000000000000000000000000A1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000000000000061 +:10BFE0000000000000000000000000000000000051 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C010000000000000000000000000000000000020 +:10C020000000000000000000000000000000000010 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C0600000000000000000000000000000000000D0 +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A0000000000000000000000000000000000090 +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E0000000000000000000000000000000000050 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C12000000000000000000000000000000000000F +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000000000000000000000CF +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000000000000000008F +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E000000000000000000000000000000000004F +:10C1F000000000000000000000000000000000003F +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C22000000000000000000000000000000000000E +:10C2300000000000000000000000000000000000FE +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C2700000000000000000000000000000000000BE +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B000000000000000000000000000000000007E +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000000000000000000000000000003E +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C3300000000000000000000000000000000000FD +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000000000000000000000BD +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000000000000000007D +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F000000000000000000000000000000000003D +:10C40000000000000000000000000000000000002C +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000000000FC +:10C4400000000000000000000000000000000000EC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C4800000000000000000000000000000000000AC +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C000000000000000000000000000000000006C +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000000000000000000000000000002B +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C5400000000000000000000000000000000000EB +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000000000000000000000AB +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000000000000000006B +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C60000000000000000000000000000000000002A +:10C61000000000000000000000000000000000001A +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000000000EA +:10C6500000000000000000000000000000000000DA +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C69000000000000000000000000000000000009A +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C710000000000000000000000000000000000019 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C7500000000000000000000000000000000000D9 +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C790000000000000000000000000000000000099 +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D0000000000000000000000000000000000059 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000000000000018 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000000000000000000000000000000000C8 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0000000000000000000000000000000000088 +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E0000000000000000000000000000000000048 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C920000000000000000000000000000000000007 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C9600000000000000000000000000000000000C7 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A0000000000000000000000000000000000087 +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E0000000000000000000000000000000000047 +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000000000000006 +:10CA300000000000000000000000000000000000F6 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000000000C6 +:10CA700000000000000000000000000000000000B6 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0000000000000000000000000000000000076 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF0000000000000000000000000000000000036 +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB300000000000000000000000000000000000F5 +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB700000000000000000000000000000000000B5 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB0000000000000000000000000000000000075 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF0000000000000000000000000000000000035 +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC300000000000000000000000000000000000F4 +:10CC400000000000000000000000000000000000E4 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000000000B4 +:10CC800000000000000000000000000000000000A4 +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0000000000000000000000000000000000064 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD00000000000000000000000000000000000023 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD400000000000000000000000000000000000E3 +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD800000000000000000000000000000000000A3 +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC0000000000000000000000000000000000063 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE00000000000000000000000000000000000022 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE400000000000000000000000000000000000E2 +:10CE500000000000000000000000000000000000D2 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000000000A2 +:10CE90000000000000000000000000000000000092 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0000000000000000000000000000000000052 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF10000000000000000000000000000000000011 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF500000000000000000000000000000000000D1 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000000000000000000000000091 +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD0000000000000000000000000000000000051 +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D010000000000000000000000000000000000010 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D0500000000000000000000000000000000000D0 +:10D0600000000000000000000000000000000000C0 +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D090000000000000000000000000000000000090 +:10D0A0000000000000000000000000000000000080 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0000000000000000000000000000000000040 +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000000000000000000000000000000000FF +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D1600000000000000000000000000000000000BF +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A000000000000000000000000000000000007F +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E000000000000000000000000000000000003F +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D2200000000000000000000000000000000000FE +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D2600000000000000000000000000000000000BE +:10D2700000000000000000000000000000000000AE +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F000000000000000000000000000000000002E +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000000000000000000000000000000000ED +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D3700000000000000000000000000000000000AD +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B000000000000000000000000000000000006D +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000000000000000000000000000000000EC +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D4700000000000000000000000000000000000AC +:10D48000000000000000000000000000000000009C +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B000000000000000000000000000000000006C +:10D4C000000000000000000000000000000000005C +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D50000000000000000000000000000000000001B +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000000000000000000000000000000000DB +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000000000000000000000000000009B +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C000000000000000000000000000000000005B +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D60000000000000000000000000000000000001A +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D6400000000000000000000000000000000000DA +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D68000000000000000000000000000000000009A +:10D69000000000000000000000000000000000008A +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C000000000000000000000000000000000005A +:10D6D000000000000000000000000000000000004A +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710000000000000000000000000000000000009 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000000000000000000000000000000000C9 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D790000000000000000000000000000000000089 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000000000000000000000000049 +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D810000000000000000000000000000000000008 +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D8500000000000000000000000000000000000C8 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000000000000088 +:10D8A0000000000000000000000000000000000078 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D0000000000000000000000000000000000048 +:10D8E0000000000000000000000000000000000038 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D9200000000000000000000000000000000000F7 +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000000000000000000000000000000000B7 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A0000000000000000000000000000000000077 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000000000000000000000000037 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000000000000000000000F6 +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA600000000000000000000000000000000000B6 +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000000000000076 +:10DAB0000000000000000000000000000000000066 +:10DAC0000000000000000000000000000000000056 +:10DAD0000000000000000000000000000000000046 +:10DAE0000000000000000000000000000000000036 +:10DAF0000000000000000000000000000000000026 +:10DB00000000000000000000000000000000000015 +:10DB10000000000000000000000000000000000005 +:10DB200000000000000000000000000000000000F5 +:10DB300000000000000000000000000000000000E5 +:10DB400000000000000000000000000000000000D5 +:10DB500000000000000000000000000000000000C5 +:10DB600000000000000000000000000000000000B5 +:10DB700000000000000000000000000000000000A5 +:10DB80000000000000000000000000000000000095 +:10DB90000000000000000000000000000000000085 +:10DBA0000000000000000000000000000000000075 +:10DBB0000000000000000000000000000000000065 +:10DBC0000000000000000000000000000000000055 +:10DBD0000000000000000000000000000000000045 +:10DBE0000000000000000000000000000000000035 +:10DBF0000000000000000000000000000000000025 +:10DC00000000000000000000000000000000000014 +:10DC10000000000000000000000000000000000004 +:10DC200000000000000000000000000000000000F4 +:10DC300000000000000000000000000000000000E4 +:10DC400000000000000000000000000000000000D4 +:10DC500000000000000000000000000000000000C4 +:10DC600000000000000000000000000000000000B4 +:10DC700000000000000000000000000000000000A4 +:10DC80000000000000000000000000000000000094 +:10DC90000000000000000000000000000000000084 +:10DCA0000000000000000000000000000000000074 +:10DCB0000000000000000000000000000000000064 +:10DCC0000000000000000000000000000000000054 +:10DCD0000000000000000000000000000000000044 +:10DCE0000000000000000000000000000000000034 +:10DCF0000000000000000000000000000000000024 +:10DD00000000000000000000000000000000000013 +:10DD10000000000000000000000000000000000003 +:10DD200000000000000000000000000000000000F3 +:10DD300000000000000000000000000000000000E3 +:10DD400000000000000000000000000000000000D3 +:10DD500000000000000000000000000000000000C3 +:10DD600000000000000000000000000000000000B3 +:10DD700000000000000000000000000000000000A3 +:10DD80000000000000000000000000000000000093 +:10DD90000000000000000000000000000000000083 +:10DDA0000000000000000000000000000000000073 +:10DDB0000000000000000000000000000000000063 +:10DDC0000000000000000000000000000000000053 +:10DDD0000000000000000000000000000000000043 +:10DDE0000000000000000000000000000000000033 +:10DDF0000000000000000000000000000000000023 +:10DE00000000000000000000000000000000000012 +:10DE10000000000000000000000000000000000002 +:10DE200000000000000000000000000000000000F2 +:10DE300000000000000000000000000000000000E2 +:10DE400000000000000000000000000000000000D2 +:10DE500000000000000000000000000000000000C2 +:10DE600000000000000000000000000000000000B2 +:10DE700000000000000000000000000000000000A2 +:10DE80000000000000000000000000000000000092 +:10DE90000000000000000000000000000000000082 +:10DEA0000000000000000000000000000000000072 +:10DEB0000000000000000000000000000000000062 +:10DEC0000000000000000000000000000000000052 +:10DED0000000000000000000000000000000000042 +:10DEE0000000000000000000000000000000000032 +:10DEF0000000000000000000000000000000000022 +:10DF00000000000000000000000000000000000011 +:10DF10000000000000000000000000000000000001 +:10DF200000000000000000000000000000000000F1 +:10DF300000000000000000000000000000000000E1 +:10DF400000000000000000000000000000000000D1 +:10DF500000000000000000000000000000000000C1 +:10DF600000000000000000000000000000000000B1 +:10DF700000000000000000000000000000000000A1 +:10DF80000000000000000000000000000000000091 +:10DF90000000000000000000000000000000000081 +:10DFA0000000000000000000000000000000000071 +:10DFB0000000000000000000000000000000000061 +:10DFC0000000000000000000000000000000000051 +:10DFD0000000000000000000000000000000000041 +:10DFE0000000000000000000000000000000000031 +:10DFF0000000000000000000000000000000000021 +:10E000000000000000000000000000000000000010 +:10E010000000000000000000000000000000000000 +:10E0200000000000000000000000000000000000F0 +:10E0300000000000000000000000000000000000E0 +:10E0400000000000000000000000000000000000D0 +:10E0500000000000000000000000000000000000C0 +:10E0600000000000000000000000000000000000B0 +:10E0700000000000000000000000000000000000A0 +:10E080000000000000000000000000000000000090 +:10E090000000000000000000000000000000000080 +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E0000000000000000000000000000000000030 +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD +:10E3400000000000000000000000000000000000CD +:10E3500000000000000000000000000000000000BD +:10E3600000000000000000000000000000000000AD +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED70000000000000000000000000000000000093 +:10ED80000000000000000000000000000000000083 +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000000000000000002A +:10F6E000000000000000000000000000000000001A +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F890000000000000000000000000000000000068 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000000000000000000000000028 +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000000000000000000000E7 +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 +:10FA200000000000000000000000000000000000D6 +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA60000000000000000000000000000000000096 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA0000000000000000000000000000000000056 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000000000000000000000000016 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000000000000000000000D5 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB60000000000000000000000000000000000095 +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000000000000055 +:10FBB0000000000000000000000000000000000045 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000000000000000025 +:10FBE0000000000000000000000000000000000015 +:10FBF0000000000000000000000000000000000005 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000000000000000000000000000000D4 +:10FC300000000000000000000000000000000000C4 +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC70000000000000000000000000000000000084 +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000000000000000000000000004 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000000000000000000000C3 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD70000000000000000000000000000000000083 +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000000000000043 +:10FDC0000000000000000000000000000000000033 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF0000000000000000000000000000000000003 +:10FE000000000000000000000000000000000000F2 +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE400000000000000000000000000000000000B2 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE80000000000000000000000000000000000072 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC0000000000000000000000000000000000032 +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000000012 +:10FEF0000000000000000000000000000000000002 +:10FF000000000000000000000000000000000000F1 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000000000000000000000B1 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF80000000000000000000000000000000000071 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000000000000031 +:10FFD0000000000000000000000000000000000021 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000000001 +:02000004003CBE +:1000000000000000000000000000000000000000F0 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:1020000000000000000000000000000000000000D0 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:102040000000000000000000000000000000000090 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:102080000000000000000000000000000000000050 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000000000000010 +:1020D0000000000000000000000000000000000000 +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000000000CF +:1021100000000000000000000000000000000000BF +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:10215000000000000000000000000000000000007F +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:10219000000000000000000000000000000000003F +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D00000000000000000000000000000000000FF +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:1022100000000000000000000000000000000000BE +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:10225000000000000000000000000000000000007E +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000000000000000003E +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D00000000000000000000000000000000000FE +:1022E00000000000000000000000000000000000EE +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000000000BD +:1023200000000000000000000000000000000000AD +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:10236000000000000000000000000000000000006D +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A000000000000000000000000000000000002D +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E00000000000000000000000000000000000ED +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:1024200000000000000000000000000000000000AC +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:10246000000000000000000000000000000000006C +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C +:1024A000000000000000000000000000000000002C +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC +:1024E00000000000000000000000000000000000EC +:1024F00000000000000000000000000000000000DC +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000000000AB +:10253000000000000000000000000000000000009B +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:10257000000000000000000000000000000000005B +:10258000000000000000000000000000000000004B +:10259000000000000000000000000000000000003B +:1025A000000000000000000000000000000000002B +:1025B000000000000000000000000000000000001B +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F00000000000000000000000000000000000DB +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:10263000000000000000000000000000000000009A +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:10267000000000000000000000000000000000005A +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B000000000000000000000000000000000001A +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F00000000000000000000000000000000000DA +:1027000000000000000000000000000000000000C9 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:102730000000000000000000000000000000000099 +:102740000000000000000000000000000000000089 +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780000000000000000000000000000000000049 +:102790000000000000000000000000000000000039 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C0000000000000000000000000000000000009 +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:1028000000000000000000000000000000000000C8 +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000000000000000000000000088 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:102880000000000000000000000000000000000048 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C0000000000000000000000000000000000008 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:1029000000000000000000000000000000000000C7 +:1029100000000000000000000000000000000000B7 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:102940000000000000000000000000000000000087 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000000000037 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000000000000000000000000000000000F7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000000000000000000000000000000000F6 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000000000000000000000B5 +:102B200000000000000000000000000000000000A5 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0000000000000000000000000000000000025 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000000000000000000000000064 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA0000000000000000000000000000000000024 +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE00000000000000000000000000000000000E4 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D200000000000000000000000000000000000A3 +:102D30000000000000000000000000000000000093 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000000000000000000000000000063 +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0000000000000000000000000000000000013 +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000000000000000000000000000000030A3 +:102E00000020200300000015140545415150545482 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E400000000000000008800002000000000000F8 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000000000000000000000000052 +:102E8000000000000000000000000000000000C082 +:102E90008088005044860200028010A39000041035 +:102EA000000088630001C081001450C01C00AA44C7 +:102EB000088A139246A7223304142122000218C064 +:102EC00000304000020008A890BAFC02CA05940C29 +:102ED0008913280418220230488C123044700012E2 +:102EE000040091C0D4BCA49A0B044C22007420614D +:102EF00010232705308255C4888020C844591050BB +:102F0000880411086781285054140F7532B8826400 +:102F1000B028484100001404800081502411208909 +:102F2000420440023CC11A040007904340100408C8 +:102F30001E40028000002408390030402001E434A3 +:102F4000700000024041924110111802090208026B +:102F50002880200204200A010054588004010882BD +:102F60000080020000800432C00100088800400098 +:102F700040445800858000040D1080120020008617 +:102F80004039C8002002F2448AAE280008000086BA +:102F9000E800340000008001390856840345080029 +:102FA000A0500800A00A01400A00201401400002BD +:102FB000802C11041044410C80C00463E1149E0174 +:102FC00012080CD010E0E040280001460D83CED45A +:102FD00089012A09884240331005A829920A402213 +:102FE000C05C10821802051010FC7010101B4D8977 +:102FF000BB100A60EA51135940F500D0C00982188D +:10300000018C022004888960000200424000906127 +:10301000081C7A4002809090030E11A24258A3919E +:103020000451002966C400024140822104080808B6 +:1030300022440C867038B800A8E259485B502092B0 +:10304000CD2941AD2018A11F8E02404210802C20B6 +:10305000000200000000000000000000000010401E +:103060000840002600A3000450F216112404089022 +:103070004C5450102641803010C4A4072102044152 +:1030800056405A84A10004080AB643AB5C48980035 +:10309000A4031E002A10CA0A04C802061291B444EE +:1030A0000200C188328211309481008C4330A182A9 +:1030B0006800A63B200806428000481210004E21FE +:1030C000E012600228092C40D2506CC00B19034258 +:1030D0008042C240007CD5000044D5920028B892BE +:1030E00008208C22A019E0B82210800CC89286EC2F +:1030F0002894020D4A28826038C0B639D1894943E4 +:10310000E07017CA0C5B050B1008D807D72AA081FE +:103110000160EA2094D032104CA24034A071252CDA +:10312000A288C5930A14820C00264B200064441325 +:103130001708C7C91860D0001BF0000003CA323F4F +:10314000283D12010F0F5EF047144A0518118685BD +:10315000B002089AE82031881FC10370011A3E09A5 +:10316000493C420C6093292E3A47280007048520E9 +:10317000003C809143409049830C0FC40900D0006B +:10318000A0592983482103851824B41685040922EF +:10319000957440C328AB8210D027844CB41424808B +:1031A000FF106650001B082000800019142299357A +:1031B000800EA0406400C014100200F17040500066 +:1031C000401029080602D0B0219A08C3010342A387 +:1031D00000B4EC0471481823626061322C19411963 +:1031E000420D0C14B3199AC52C1052102C6B26AD3D +:1031F0004C75A32C2426443509C4432170A0814872 +:1032000005C4801201080006882945412540D824BC +:1032100080C00C040A50C00714400A081001013095 +:1032200020C0D14F208CC791B15848D28218730D5D +:103230008481D31CE9A4045E44B9D04014A51A0BC0 +:103240005840D19328B08103143380C1D38C14C16A +:103250007302A9000903B968448202814D1410C1A8 +:10326000B838DB39FC408400099434A81E5404DDCE +:10327000A029005EA30EEEC021620088041901019E +:1032800008A9208850004800080200024888080069 +:10329000202B082020C824280021080EFC50000004 +:1032A00004B219840603800D3405C613180A1001F0 +:1032B0001868859300000A51A31C04820118A20219 +:1032C000B250111802C80180048082242C00000E24 +:1032D00000050630A01806B023404900A00D0000EC +:1032E00040198848E742028803040206006821600A +:1032F00080180229920904718410000026030A1024 +:1033000040800080003441011100CCB8B235006C1F +:103310008A2EC3D4A47E18010986D842B16C01401C +:1033200010000A0883500C67390243404032000005 +:10333000291010A30283028C80C501112809206383 +:10334000282476B4044380002027C0901000010593 +:103350009090C2200901004C4004D0A04C20A33022 +:1033600030821C0182F081B30088C2010000D0AC21 +:10337000200D1B8020400C30080B206200600000F4 +:10338000085A431C280412A01C60154001E8811F44 +:10339000A20614495919A100E4900C78000E10857A +:1033A000039A722E2819B00430000003C02058A1DF +:1033B000204A480720008480000830C0C71000045D +:1033C0002C002400087703154C812600C504080151 +:1033D0000100300100080000A1E540847D08B00133 +:1033E00000004020004C0502080C700A8022D60420 +:1033F00007821481072080600104424000002002FF +:10340000200200800B0040404A1008018408200878 +:1034100038083100910D3A01C39C89C400008C47E3 +:1034200043F9FC520C0BE2088001ADE8125201E9AD +:103430004A7A7247BCD88008400108005A00D0027E +:103440003830004481D7F859E621010E61421DEC65 +:10345000628303E888D8F2001414E618120FF80308 +:10346000CC5896FF1C8803072100802604041E4FB9 +:103470002082608441E432080608701E48405504EA +:103480004042D0020048602400928011E168800828 +:1034900081143308E2F04C0070222840C5011298D4 +:1034A000685F3B18BF026023A07080510E540D77F7 +:1034B000C2FB14B92233D207C27105FC080301060E +:1034C0000566004014925012EC0401512600018060 +:1034D0000E800112800088884121000080208080B9 +:1034E000118102000002401000000000800E000167 +:1034F0004C20000006200180004500A00000880844 +:1035000003024A4008080014802A0003A04E640108 +:10351000B10019C010C08614182440824200100067 +:103520008008010010010020400011020A07000875 +:10353000404300088000000080C00000014B4008AC +:1035400002940000000020000000A5A004000E006E +:10355000000050000075102883CC9FA00910008245 +:103560000002040000408004082040820400102073 +:1035700020400204002040100008000081000100EB +:1035800040040408004080200040804100040808F6 +:10359000208081000008004000810000100100022E +:1035A00004002041020410200102081020810000C4 +:1035B00000010202002020400204040800408204AE +:1035C000082040020400204102048000081000008E +:1035D0000080008008000001001204002040020466 +:1035E00000204088049A672F92CEA071CCB0D4E618 +:1035F00010A1884D4143081B0804028221801F4C02 +:103600000A40082281E4025EE0CC97015500C0C068 +:1036100000000D40000ECC0030000000501115419C +:103620003D401EBC0F203FFC0000F00000102000B9 +:1036300000400000000078000000000000000000D2 +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000000000000000000000000000004A +:103680000000000000020000000000000000001028 +:1036900002800000000000000000000000000000A8 +:1036A000000000000000000000000000000000001A +:1036B000000000000000000000000000000000000A +:1036C00000000000000000000000000000020000F8 +:1036D0000000000000000010028000000000000058 +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000000000000000000000CA +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 +:10372000000000008040400000000010100515114E +:1037300001005151000000000000000000000000E6 +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:10376000000000000000000000000800000400004D +:103770000000000000000000000000000000000049 +:103780000000000000000000000000000000000039 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 +:1037B00000000142008B21448040012000C202929F +:1037C0000C00C01400024C44000170020014C480BC +:1037D0009001FA0C018E32A646A54040040F31023A +:1037E00000031100007CB000021008A0B19D840C01 +:1037F000CA050E4A08321C8402060039049E51781C +:103800000C2203045201495090903534190640327D +:1038100000D040019026A00300C0D6048C142A9C3E +:10382000CC541241880D312A4C8964504C200AD85E +:1038300016C002882008044100000405800201B07F +:103840002E9025E04400403408410E0802012081FA +:10385000C1A0400804800A86802024685904100012 +:10386000E320485CD0680202480592E908BC38228F +:103870000900102247000C0304048C88E113200087 +:103880001413188240909040744228268001321010 +:1038900070004E18384C93220D3808900790405B0A +:1038A00001E018881419DD04F10278D0878A050038 +:1038B000804010001028B028A28001001500800868 +:1038C000010C0002A08010018002030018010020FA +:1038D00002000206001120802080210D0008814096 +:1038E0005340182C125E00841111C0002412114C98 +:1038F0000A032480010014C20002E01C90019D22F2 +:1039000014863110A0140C01102409105040209688 +:1039100070246A409021404093110856847200053B +:10392000509D8118070830F10F80001020004521BC +:10393000200090A6002A0AC81950B65460A62A8012 +:10394000448740B630497015490159E092AC16C61B +:10395000324580140108D0980F21040240120D183E +:103960001F4312884A05725FAC8D1F2BD98295A226 +:103970003B686A0000420FF282A00C08103E004231 +:10398000AD30214418D82A208980A072C0C37500A8 +:1039900000071812E16423101A220B0920508872C4 +:1039A000730E6C494A218C58D30500004FA4820342 +:1039B000C4053801280AD0928A0804601B44456176 +:1039C0002052106121281B04411124D031580828AD +:1039D0008982502D1836A72511CF0880848C528EED +:1039E000081CC0C21352004910020606C532C61494 +:1039F000A2360F510C1EA22318515A231B451283C5 +:103A00007290390400A08020A02008040200490020 +:103A1000805204044888108B482AC3027C59E3086A +:103A2000C5034403809026C0253889B142D0486937 +:103A3000731C66C0A9A21A20C5C625000E1192C229 +:103A4000C894292E1147104024044C2634B7051180 +:103A5000C18C80686C0B18038AA2C4A42B58285C04 +:103A60000822A33B4C3F172208C35B40084453691C +:103A7000024B00125340A083CC2F110E431346403B +:103A8000CEB0020C0074024F1033821E10CC88C1DD +:103A9000A2688403003400018190800B412044041B +:103AA0001C4090002000388240004184082C951A68 +:103AB000A0414B019D70D401002F8100412F001CBB +:103AC00060052CC0F7A00304100B14010044107310 +:103AD00060888201064B60B081044249308041A079 +:103AE000409580102900250449B0084030820080AC +:103AF0004600020BC425800882404103E81C5B0895 +:103B00000722CE6D3224982A001208406400BC4877 +:103B10000071220400640250142215002440001099 +:103B20001404580004888160511514482419484928 +:103B300004A14140106002A1045490979CC8102435 +:103B400010050D230E007627249201B08002841206 +:103B500000311001C1400144500408D001EC31494A +:103B6000E080000E80004810B100448021508A009F +:103B700000009009440030092053AD2049A400A959 +:103B800041404040A0281B035E41AE10E1845C52DE +:103B90000800821D23419042520848414210029879 +:103BA00084401950C021300A545441180A00814100 +:103BB0000180725A18000032C114280846365C028F +:103BC00011B00CA0D5A008E00D120000400C2C2C68 +:103BD00046066CC183605524016783860020D0446B +:103BE000AC07C8447DA0040C504804800C020304B8 +:103BF0005001000E10000452485C0E201C2103549A +:103C000000025C6B8019214980405268468E223246 +:103C10008CFCE13080CA4732A2000CE0880010051D +:103C200028800A080214E8B8D000828287904508EC +:103C300000880101000841D4802018270104A65003 +:103C40000290401816840E0483104842D90240089E +:103C50008000933C50800001C10122009420A00804 +:103C6000B0011081500830300500024400A204A0C9 +:103C70002118E8070800A1000A212CA00A1F422DE4 +:103C800048B293063384C0F10820184C1ED388959F +:103C9000012044005A12640BA6A001343292381657 +:103CA0000990A1091090052638008421110C0019F3 +:103CB0000048861102880001402201080102080024 +:103CC000440000028A8D60035C403D300A460D01CD +:103CD0009CC0A0D4390D072A22860018C100C90053 +:103CE0003CD0343020CC0B35848DF3F290F1103081 +:103CF000E041002028044E8228270018211C000CD7 +:103D00002026A40022C03988A0C1050408C0800074 +:103D10000440C63523810EA10C107D0009C246A1C6 +:103D200021502008601652874A01514C025024004D +:103D30004208620860086829E2013282018087D95E +:103D400032C4CD2D439A2C70BE0040496020C480FF +:103D5000260233C0009CD03700208010058000016F +:103D6000010040C114808DCB009B98468202104414 +:103D7000002230401A0401010186210024AB4008D2 +:103D800002C8CA810118C68C15080B28C0058420FA +:103D9000010224020402004060C02040020C120410 +:103DA000000090245500812000906B4700260014ED +:103DB00000620C401404240006612044B010080284 +:103DC000CC0010B04C011B113E004003A14010017B +:103DD0001E0F8F66A0F00431433FF00F40731508AB +:103DE0000C0020420384020164105032D2030910F7 +:103DF000000000000E000144016C18001801A0042E +:103E0000EC00D0E00C0202000007010000000010EE +:103E1000B2048050050041480A2801809020C0006B +:103E20000400000003033B0075F530A10F90401023 +:103E30003414200A9200A98201001088101083888F +:103E400000260080900B010016016024044002004F +:103E50000AA4001610200202E20000001800085018 +:103E600001200118024000108220A00201009010E1 +:103E70008C0020000005400280D81000028105B0AF +:103E8000009401AB062007824270D8A70E3E60CB9B +:103E900076819E3C3A702327063E709A380C880A39 +:103EA000FD8A398270A4E60E0678C23E0270E87977 +:103EB000A8368F8EBFE3FD8090AC0E6088C9A24209 +:103EC0009829C203A7083661E3E49E3E09C34E9ACF +:103ED00030F980906609A303A2323E606326268FE4 +:103EE0008A68C3660C3A7003A7083A71E3E4C88E87 +:103EF0000D9E080602EC8CD98F20E009A393E78081 +:103F00003E7823E78C3E7088A4BCE51D10CD677118 +:103F100040BCB48E1098461B42110838440600CBB2 +:103F2000A38022C0A6051D12818BD393D4037004F5 +:103F30007B0282800100004400004C00100000550C +:103F40005415544B2CA014B0FFC03FFFC000F0002C +:103F50000000A000000000A00000700000000000B1 +:103F60000000000000000000000000000000000051 +:103F70000000000000000000000000000000000041 +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA00000000000000000000002000000001000FF +:103FB0000000000001800000000000000000000080 +:103FC00000000000000000000000000000000000F1 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF000000200000000100000000000018000002E +:1040000000000000000000000000000000000000B0 +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:10404000000000000000002C00333002C000002EF1 +:10405000EC0BBBB2EEECBBBB0000000000000000AC +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:10408000000000000000000000000000000014C05C +:10409000000300000000000000000000000000001D +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C00000000000000000000000000000000000F0 +:1040D00000000000000000400000017F44000110CB +:1040E0000080008010008000000085C073FE1C006E +:1040F0007F00000010002000038A00800605011DDB +:10410000800FF730FF0F7473E07CF00700000000B1 +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:1041300000000000000000000000000000000080FF +:104140001C00001000200000000000000000000023 +:104150000000040208100000400000004000008041 +:104160000010000000000000000003803820000064 +:10417000010700001C0021001C000070000024004A +:1041800000000000A181C004050008020038000002 +:104190000000000A0007000000781FFE0102003046 +:1041A000034640100B0108800000024000000000A0 +:1041B000000000000000000000000000800000007F +:1041C0002A000000000300103E00000000C00000B4 +:1041D000800000000000000000000000000000015E +:1041E0005D0052880D450000000000000000000046 +:1041F0000000000000000000036803E0001FFA2830 +:10420000240084000814C2000003888410340009CC +:104210002E1211024612088097C40C020248800434 +:1042200004240000044000009248008010C40000F4 +:1042300050400040002001000020000480100801D0 +:104240000000000010900000000400C0009000304A +:1042500001018280000080180002C00C8001CB04A4 +:104260000110000002B00000A8800A020000C21085 +:1042700050588015000400804028000AA010084211 +:10428000160010000350004008400000E00000004D +:104290000004040000000200000000000000000014 +:1042A000000000000000000008102500003F01FE93 +:1042B00018A3002133C00381000092000004808213 +:1042C000108A00406E3ED8422000848C2264250073 +:1042D00000308202805118110888808001E4524029 +:1042E000080080104081400002008140949042000C +:1042F0004004000444000000006C281007C1254061 +:10430000000001020200048200030400000010010A +:1043100000C05000011132000850000FB466880F31 +:10432000B6068801E41043B12E800B5D51208C59F4 +:10433000DC2048030921678001890151C5D640006E +:1043400000600020000116600010C4C0088009123F +:1043500021092020280005825000DF44C08000C4CD +:10436000C000804184228910000888C000700010BD +:104370002C300003D08104222A10888900100B8081 +:10438000000600020000400000312101208020C210 +:10439000450012200181047400454C010008B90059 +:1043A0000500000004150000000020110000000AB4 +:1043B000B0018B902CAC040000404200031D201380 +:1043C000642014080260A110110003000002D00C48 +:1043D0004000000000000002008080010000410059 +:1043E000100004000000000010002208221C000041 +:1043F000000080500000802E600170E0020040004C +:10440000020C0040C01000298030630200520200FC +:10441000043C18084500004D8004000000040043DF +:1044200060009473181700008011005020080000ED +:10443000B90140D4E0001030452C009428080C0C41 +:1044400044001330000020140C000000F030080677 +:104450000000000000400000040C0A000FE0000013 +:1044600008C00000000810100340090C104080181C +:1044700032000040803FC00002F1180C8E0B04682F +:10448000460190BF840008000402000202A84B010C +:104490002C40400992214014160331806000130023 +:1044A000174004C0080001851007812C0A80414094 +:1044B0005800094902C100008281200454051D8072 +:1044C0000020A008500E0020000000040000401052 +:1044D000000000000058401A00000A2002CC3848B2 +:1044E000440222080102000030CC076D0130111D8A +:1044F00054000000004000020004080004084201CB +:10450000004000000000028000000200001636207B +:1045100081BD4001B0029030BC897E0290D8C83481 +:1045200002458004800980B01400114D6441C2002E +:104530008057131F0DE012BA847C800053001DE1E8 +:104540001500188C02080A0010120000000000007C +:1045500000000008008009000008000000200000A2 +:104560000000110002800000000000000000004078 +:104570000000000030030000000000000121F00EE8 +:1045800000A00010820000B00240904128110000FD +:10459000019188282000604D04C3C02440000870A9 +:1045A000400911050002000400008003AB800101F6 +:1045B000008004000001C0C30003B0835480010CDC +:1045C0000000000608000328D0928D100408203057 +:1045D00091C0C50201020113410890264000400825 +:1045E000692213A8581208114A39030BC005450067 +:1045F000000000002010308802280040A0000000C9 +:104600000028E00000000000280018000000C17031 +:104610009C94050AE7C41001E004743303154208B2 +:10462000A00008000000000B40000C000040000447 +:10463000001040000000002000050400001000A051 +:104640000000002100E00000241309050A00810099 +:104650001813044242000200000000000000412044 +:10466000062853960F8802EF614020006300008007 +:10467000000098A411A503054037C202A003182327 +:1046800011084410004C804002204000000000004F +:10469000000C40081D00000C00500202020000A99E +:1046A0005000000000000B41240000000122060021 +:1046B0000042FC09C020000001309C0000000013F3 +:1046C00089C000000010001004850410054878001F +:1046D000021C0032200460020000004000000100C3 +:1046E000000000000A0000020070070CFE033C30CE +:1046F0005280387E1830063E4301C84E4000000408 +:104700000000000000000040000000010000000068 +:104710000004090001000040040000130020008490 +:1047200000200000002000000EC000FF0E07E3B8CC +:104730007C0000277B000070000080E633400C8680 +:10474000500440F80010000000002010204000013C +:104750000F272010DC10200B030002A00000000037 +:104760000000000000400000010000000000000008 +:10477000880000000A00001E10F040333F00006176 +:10478000103CF03C3840C001F00000B8781E1FC15A +:104790000380206000FF00000F8000001C0200105A +:1047A00001000803000000280420048420489044ED +:1047B00089244882448112242448224482244112BC +:1047C0001089080491021120484444890448822435 +:1047D00020489049210489092490912008490448DF +:1047E0004891202110112122448224412244122484 +:1047F00011224912209120084211224242222448CB +:104800002244048904489244882448224482244152 +:1048100022449084091200842090849089084201E7 +:1048200021124484244822448224408844EFFD3DE0 +:10483000DF4FFEF347FC31FF37FFCFF311C37CFF9F +:104840001F3FFF8FA620FF0CFCFE386FC3BFF03F59 +:10485000E0FFDE17FE43C1C3F35048031015CC0040 +:104860006000102A8002A287AA8002540000000083 +:10487000000000000010A010040000E00000100084 +:104880000000000000000000000000000000000028 +:104890000000000000000000000000000000000018 +:1048A000000000000000000003FF00FFFF3FFFCFFB +:1048B000FFF3FFFCFFFF3FFFCFFFF3FFFCFFFF3FD6 +:1048C000FFCFFFF3FFFCFFFF3FFFCFFFF00AFC002D +:1048D00000001000000000000800000000000000C0 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000003FFF7A +:10490000CFFFF3FFFCFFFF3FFFCFFFF3FFFCFFFFF5 +:104910003FFFCFFFF00AFC00000010000000000085 +:10492000080000000000000000000000000000007F +:104930000000000000000000000000000000000077 +:104940000000000000000000000000000000000067 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000100000200116 +:10497000000000155005544155105544000000003A +:104980000000000000000000000000000000000027 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C00000000000000000000000000000000000E7 +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F0000000000000000000000029D280A2A1F009 +:104A0000644114200080022390008C4000000C635D +:104A100000004082000050C80C40D2442887139206 +:104A200044A3223004043102000318C000104000E7 +:104A3000220008A090989C04C80408008910100463 +:104A4000220208204088102048080319000911108C +:104A50009020241A084D4C22804094E11422848630 +:104A6000708254800010285004100050886411088F +:104A70004581B4501814465005908264A000180374 +:104A80000000048000000020041020804604000480 +:104A90003C921A080007B083402006901FC0068091 +:104AA000C000004B190618002021EC04500C000037 +:104AB000002F904100101802510010004000204BC0 +:104AC0000420C20C11000480100008801080020035 +:104AD00000800824000103100000400C044860C05E +:104AE0000304000006000039118000820001080064 +:104AF0002102D24026CD05048800108444003400F1 +:104B000000008880082812A5064D0811A11028026F +:104B1000A01A04402202805004000008000820006F +:104B2000208001290044A651080080800208041456 +:104B3000021540310400118A084280208951030087 +:104B40008A4A50B21025441D0500201200540882E4 +:104B500018040900502014001010340B86C004649F +:104B600041530C410833000A0029801800CC05226B +:104B7000CC0075A70100849E000080A308180A409D +:104B8000408091B007041DA1C34CA0B0C0C30C006D +:104B90002C4A02006D4806180100004220520C0009 +:104BA0005230B4049282B98C95090990056B01BD0D +:104BB00080C2691D8B404200409822040000000022 +:104BC000000000000000000000000800080102E2F0 +:104BD0000120001808C0300204044C10404C600250 +:104BE0000600009000C08022000220094600080450 +:104BF00030700440CA34232B244018042200501083 +:104C000002180C0A00C0001211D93048100AC9005D +:104C1000030202303004000C0100000010102213C7 +:104C200000412461808412F00080091040032005B7 +:104C300010010C8040100C800B810048050602001A +:104C4000084C890009008982130C301200240400EA +:104C500081010408010C2104063204006C941087C1 +:104C6000480880A278013B148489C941501002CCC5 +:104C70000C18000702901801131B40014072300409 +:104C8000084020024400001000B0200C0000890001 +:104C90000014000412860300000040030708C0C887 +:104CA000002204C00638100000E6301B002024114A +:104CB0008902420040204001101902923248081334 +:104CC000040261800301020023003B0880D4A0128B +:104CD00008000C138F04A84078F880C1011D006102 +:104CE00061000009A11800044800D100303C39D20D +:104CF000480841000825DC1B89484963B564D49104 +:104D000028298C194127441C712125817B90384822 +:104D100010892110000010590422D83D020A2000F9 +:104D20007C004134011180A06008700A86203100A7 +:104D30005000400000800282400342C10000860013 +:104D400032008003402C413202980089026D0880B5 +:104D5000D2120080008203C0400230CB8060320259 +:104D600004224412414500921480900005840452AC +:104D7000400010201A000C011100E804D12D06405B +:104D80000440D02504080002000141800084414C09 +:104D90002080039081540090000042041180A00004 +:104DA00021C4264683EA10426088820130021CB08A +:104DB000210004222112CC40400004894920260110 +:104DC0002A0128500090228C412C1050A80048073E +:104DD0005C04A000A100042809000409014A40D095 +:104DE00002084040017200884411151000013099FA +:104DF00044404000090040000080001000210430C1 +:104E000020025008002158888230000014A2088037 +:104E10000C0201082000D423044008010004A0B9BA +:104E200000080A01800204E8003C300EF600301849 +:104E300006890188088201C32C22953046816220B0 +:104E4000E04080C03268CD04A33D0088F400A80D86 +:104E5000038040080684330280220160040A0709A7 +:104E600033001030200001032F0006C0000020A4F2 +:104E7000002000001800459840600077400C03DED9 +:104E80009C108801048140006C40202008420A02E6 +:104E90003179A8592922D10721000E006020021083 +:104EA0008241400460450100420A40010040141064 +:104EB00030010001202C04190002090158000000F3 +:104EC0000180100080046130940123082080AC0030 +:104ED0000110024401840220A0C048082C25920041 +:104EE000388100B829240400012211100C00831815 +:104EF000280808821010B0260440081102884001DA +:104F000002220100080021843021204B008A720611 +:104F1000042CE004100000009020000A1448480609 +:104F2000A00080000004000043800004200028004E +:104F30000001019888810008420408002200500105 +:104F4000011108000104000C2000C40201002A48DD +:104F5000405935460C1821202020C60841811100F7 +:104F60000650C100000C42A1005000022113008530 +:104F7000000360F04A1114004A00220030003A1485 +:104F800080053E00A78088B0008E8C42139B6CD2B7 +:104F9000150E40CC0020D090902620C200DC8087E7 +:104FA00040000010050014400330941409510024FF +:104FB000029B5850BA22014402525A70012200E06A +:104FC00040C0B11004C444158180C403F294A50C00 +:104FD0001500820810018022040200804440004431 +:104FE00062880400020C1200880114001000810085 +:104FF000900060C500800010000880108100000C47 +:105000008060A040B2020820C40090B458215B1C0C +:10501000FF037033815084791E070D40E3F3043998 +:105020002233D04142810688810200140900000821 +:1050300098C8121B6C00910018500614060000045A +:105040000064200200003082C32088400202020077 +:105050000000809000000002810C40000C800002E3 +:105060000E1000800345C0801611010103004AC8DC +:10507000001E0818000D001080040001110859805E +:1050800013004A920490828440A00420000040044F +:1050900000800800141011020A8700081053001144 +:1050A000850000A10080000001D3000003A1A8003A +:1050B000000020000000E980000010D40000700013 +:1050C00000500000918C9CE003100082000006005C +:1050D0000060C0060C3060C3060018303060030664 +:1050E00000306018000C0000C18801806004060CCC +:1050F0000060C0300060C06180060C0C30C0C18010 +:10510000000C006000C180001801800306083061B7 +:105110008304183001830C1830C180000001830320 +:10512000003030600306060C0060C3060C306003DC +:10513000060830618304C0000C18000000C000C0E5 +:105140000C2000018013060030600306083060CC9C +:105150000425AA0820842C12805895DA0008022918 +:1051600043B0008EC02030039380E200361C1162F1 +:105170000204028D04500B044C43C3C00000001015 +:10518000000E4C0000000001403004049870020C36 +:10519000F0303FFFC000F000001080000000000071 +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000820000000100000000000003800000A9 +:10520000000000000000000000000000000000009E +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:1052300000000000000000000082000000010000EB +:1052400000000000038000000000000000000000DB +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000100E +:1052900000440000000000111004444111100444B7 +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000004000000000000CA +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:10531000000000000000000000000000000000404D +:105320004023204800020000000000000000800030 +:10533000000800000000000A000000000020000833 +:105340000000008009510000000000000000000083 +:10535000000000000400015121580400D20900009F +:105360000022000022080C40011000000C42000046 +:105370000201004280000400100840040090C000B8 +:1053800020048202001244000000004089200081B5 +:10539000248420088100000008100410008004000C +:1053A0004000004100000480001200002EBC35E4E3 +:1053B0004000500408400A084001008140200000DD +:1053C0000402028080000022180410000200400045 +:1053D00050080000080182EBC8BCAC000B80100034 +:1053E0004610008100008408C099200014000800C5 +:1053F0000000000041400834C400021060000008B2 +:10540000300818200180000000414A62100050E876 +:105410003E10DD40B4000010001C0000009010029F +:1054200000003000480000000010000000100000E4 +:10543000A00000004000000000000000000000008C +:1054400000002008209101050008410012C0001C46 +:10545000175EC0050208400160301042C0008A900B +:10546000000002000200605000200008040000005C +:1054700000000000100000104040005008202000F4 +:1054800090220000802A080280200002003BD13CCC +:105490004008016001200001140200004000B090AB +:1054A000000018C00040922444841002000540A46B +:1054B00008D040080600028100C80490000008409F +:1054C0002000000002320008000019083500060024 +:1054D0000A92021A8CE00A0B41881082146C202078 +:1054E00000420FF482A00C00903A00002902080448 +:1054F000009105220000E01200C00000C00400106E +:10550000804480021400000B920000000100800B18 +:1055100004008000410110000B2400221404080440 +:10552000204202210A0010080A80000172100000C7 +:105530004A000000040172A02000284A4800100818 +:1055400004403002004C018082004102281044D205 +:10555000408A0012903A080A00124804389202CE9B +:1055600000300000204F0100A10701020068102256 +:10557000003480808242500406240F409452DE5052 +:1055800025B02484080A80182C1A000088C92A0132 +:1055900000000348349000012241400916001A0A15 +:1055A000AA0100042866001000008000188000088E +:1055B0000003014000240928029402005011840CC9 +:1055C0000C0A01000000644001490AF80827A259AA +:1055D000C07D432F82804201A4A000080029000062 +:1055E0008188A000071B0141D31197C05494020188 +:1055F000029480219034C63241840C023218040196 +:1056000020140201A10410000100040418009000FD +:105610000000088602C091041850130A8000108010 +:10562000CDA04101032F8400C0C3400420004040AE +:10563000FF000800000B0000000000195420310199 +:105640000208200000000800208000826100001095 +:105650000006340108D00A00148000008A00001BF4 +:10566000546580181801A313C8900D000262080643 +:1056700012C690220000080094C0A04890012004A7 +:1056800001EC02505CC75708000A8802D4440200AB +:105690003824C403227558494003220250828310E3 +:1056A000A10210AD81A6A02880C200260001010041 +:1056B00054207350113101AC00A000A15800C40067 +:1056C0001232408400000CF202EE32E02090C60854 +:1056D000148C0010E00CB0840B1800344010388A91 +:1056E00000242441C001AB0032440EA00121C004BB +:1056F00004814005DC0923521B5049520804C4BDF3 +:105700000251043076020A011010000000003190AE +:10571000012020314880411C00020C008108D0008B +:10572000003108278000200000320A09811018008B +:10573000946208C105101108004408060500002104 +:1057400000002018040A020100400040020540C584 +:105750002801100400000880000202000080800080 +:10576000420000224000020000024124801100207B +:105770000000A848902142000204131304E2102202 +:10578000004C0208D30014E010480820044802042A +:10579000C000001000200000118040080080008040 +:1057A000000C43D4002080008102014102801008D7 +:1057B00000000000011000000002C00000001830CE +:1057C000000000004001020010008019F0001900E4 +:1057D000008034000100028000240402202CE2003A +:1057E0000800A0C0182000048004022000A00200CD +:1057F000330060C000000040000088400080400886 +:10580000680010080080002020000000010000094E +:10581000081007002000100000000208000202012A +:10582000028040590020000A000282204010080037 +:105830004205D10944011600044000000000008028 +:105840002020002000000000000800002CA0000024 +:10585000280000010000904288840408E004080049 +:105860004804129028264A00000000800010A00082 +:105870000000200005000400080002000000C6002F +:105880000101040105001C200000028100802000AD +:1058900000020004488151545A01200140082008A8 +:1058A00028082800800000000180800000808C21F2 +:1058B000229B0C500400004000225400000020C035 +:1058C0000808000100273C37858E147025DC03C0D2 +:1058D000010200036013184802001040000210008B +:1058E0001A200001018620EBA4B355036E8000014D +:1058F0002400A0002502062802338C99F73A2100E3 +:105900009773BF40E0920937C9FC1221240E882109 +:105910000E0083907D906208002C0014101D08E199 +:10592000CC006400006020B020000880C402109801 +:1059300008001B003E000003A160010106820C402C +:1059400040F004310013C141400106000000000096 +:1059500000000000001052000800A94000000000F4 +:10596000060001000000100000002000C4201040CC +:10597000040200000001002000000000E804800193 +:1059800005200000000008040000000000020242A0 +:105990000400000004001000000060000004000883 +:1059A00091028062021412100110800900040800A4 +:1059B000200200400400400800802204080000008B +:1059C0001820002202000041003008F801200820C1 +:1059D0000240403982208006039090101000202160 +:1059E000000D40068010000001000820002001ABDF +:1059F0000020015A100830A1C204080860C0000C41 +:105A00000A1420808102110400428C000001185009 +:105A1000180020400018010210000004100182004C +:105A20008A002000842304100C28702004385200BF +:105A3000010306102040810230208185001020845F +:105A4000632060802500001010E101820E143041B7 +:105A5000000E0C20C1070A10208019460000084ED5 +:105A600070000038C208060831800000020420409F +:105A70008506008800BEFF3B7BC7FF13CC18FCEFF8 +:105A8000020D435FC3D0203F4412224BB78007C4AE +:105A9000BE7D0D3780EFD3CDF4FFFF137F030300EE +:105AA00001000D5400088C0000000441511E5541B6 +:105AB00061601210000000000000000000100010E3 +:105AC000040200C0000030000000000000000000E0 +:105AD00000000000000000000000000000000000C6 +:105AE00000000000000000000000000000000000B6 +:105AF000000000FFFC0000CFFFC0000CFFFC000016 +:105B0000CFFFC0000CFFFC0000CFFFC0000CFFFC6B +:105B10000000CFFFC0020C000000000000000000E9 +:105B2000080000000000000000000000000000006D +:105B30000000000000000000000000000000000065 +:105B40000000000000000000CFFFC0000CFFFC00C0 +:105B500000CFFFC0000CFFFC0000CFFFC0020C0014 +:105B6000000000000000000008000000000000002D :105B70000000000000000000000000000000000025 :105B80000000000000000000000000000000000015 :105B90000000000000000000000000000000000005 @@ -243198,432 +247295,432 @@ :105C10000000000000000000000000000000000084 :105C20000000000000000000000000000000000074 :105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000000024 -:105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 -:105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000000000000000000E2 -:105EC00000000000000000000000000000000000D2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 -:105F00000000000000000000000000000000000091 -:105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000000061 -:105F40000000000000000000000000000000000051 -:105F50000000000000000000000000000000000041 -:105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 -:105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 -:106000000000000000000000000000000000000090 -:106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 -:106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:10611000000000000000000000000000000000007F -:10612000000000000000000000000000000000006F -:10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000000000000EF -:1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E -:10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D -:10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:10635000000000000000000000000000000000003D -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD +:105C4000000005F2CC0000B054230C29B4810AA155 +:105C500040B0A54C000042028000244380020C4961 +:105C60008A001020040101D00C43A02A002A4821F8 +:105C7000FF0480A01828801810000414004A402156 +:105C800001218282448305108240210A0442810A54 +:105C90002000882078416800C0405B8A04204811B9 +:105CA000400208408A101040A0424A6443C8046081 +:105CB0000072A22060AB883621C81A2240380E2913 +:105CC000254C8090E00004464000008C08024D9076 +:105CD00078E407248185738C603A91289D4C0C826E +:105CE0003C60A9D43034C97181DB50252424518013 +:105CF000B07303548F181DB506B2438E48E4800379 +:105D00008E0C51034624000F11C68498C099801848 +:105D1000AC290A8529400D28824018C908794231EA +:105D2000601E5128B10020404204000A259C448195 +:105D300000BB84283E18F1C290414560B6C021984E +:105D40008003918BF4498C09248D92303D244215B7 +:105D50001B0401A442C25825842E4B02584184B032 +:105D60004B0908960BE0607C648004213788C522CB +:105D7000B4248A1C1C72C59CD140B4B12C1211C52C +:105D800049435CB8814123820A4B31E20025AA3D98 +:105D9000050B8AC2825063C23ED44180526880950E +:105DA000543A274156C1E0D0E8431D204190338248 +:105DB00088B65924E80741D0244046B63890C1B08F +:105DC000700A3862411468021C0011D883442B7198 +:105DD000411B6278406D842129CAF300210C0F0811 +:105DE000385FCA1103BB8C587A18250C63E1AA8866 +:105DF000922800DC0DADA3F6AC4D7616DB42C780D1 +:105E00005ED43304002B800000000000000000007E +:105E100000036528459038900480F0CB444C582608 +:105E2000908A807070A002B11F06450C5028C80AE5 +:105E3000471D0ACCAF02AC281C920040804C42782F +:105E40002804D104A40015034CE8205E2BE0C4A173 +:105E5000826538F0AA1E6500C8118AF83928100931 +:105E600041C442148885C3178380F490A0300CC1CC +:105E70000DD904001100802A8C04070464A34F0884 +:105E800062D21D288ACB030740996B0742C56BC2BB +:105E900049083C033301CC66E20960276226820C84 +:105EA000C2538A60831230BB8E6B2008A815FC0297 +:105EB000024E1992703C679A16BC0855A0085CAB5C +:105EC00092300E02A5F00114344124790741215586 +:105ED000609A382F41016960458C144705638783B8 +:105EE000A296B4A5A525694D65A12C58614A0297D3 +:105EF000482222DE90C09A318683C810B4AC70BBB1 +:105F000020CD0988F04130B6D022440252A101E8E8 +:105F1000C2D62D0B0131C1625C18C43911C4566060 +:105F2000521064070A90020381004C26D90A868D1C +:105F3000BA0156C899000AA8050B422F4409222429 +:105F40006F4F42410854BA161C224A64210B6894D0 +:105F5000D73D09088CB2D4A08BB600860BAA4009A5 +:105F6000109147088F40100302803DAA0A2A80083A +:105F7000B36AACA5520B5A8131012224C6A1252C4B +:105F800003E8818080031D000806041098342E96D3 +:105F900005A84D0E11221800060500001240002031 +:105FA0001A0008000B8E00629495130085080E20DD +:105FB0000A082824361240B810EA48978510208233 +:105FC000810005B008122152800A01088834841922 +:105FD0006D4004019E80865013B2824E0020A01CAA +:105FE0001027680A0020000002000FD3035631403A +:105FF00028004328918F00D01944E40603C200779B +:1060000011200802041006803012C18088CC0300E1 +:10601000C308C000AC0069062106A0F26C400384EE +:1060200021920196404300DB2F0BDB440DD14C4401 +:10603000328C08180828402130024030C18060218D +:10604000252C27FE13000825909F600E5C18004841 +:1060500000A15FF89EAA0905C791115C643EDE09A4 +:1060600008414441B61084A72FCC0FBDA0EBB0ED82 +:10607000C43B7E8AD9A080B8812008D6824060A225 +:1060800004E2580243CF1A0263287810010A4546F9 +:10609000C10500A02B282D4598306A4C020015C080 +:1060A00006430000E400020C15C0964202805C2CFE +:1060B000104846811154404A9C32BA0AE382361491 +:1060C000221004C883A67301A034CD154342765133 +:1060D0006CE811A125294000600300908402A4C14E +:1060E0002251CD00384A30A08C594062600F1815FB +:1060F000488560803808201C12C18A1713A92477AC +:10610000AD11660D653235343ED61842450020F299 +:10611000AC6D4809584CB401143845720104C3E20F +:10612000A0D5A804AD04910419D28200ED4002016B +:10613000872C52A2AC952A010344795015908BA666 +:106140002304495300EA78D54238A1480722043095 +:10615000739824420112B284000888261B048980A7 +:10616000C288A4C4286C0D8710C4C054910AC348C7 +:10617000520226242AA80B9C41A6120AD80AD40C43 +:106180008204AC12116C58D00D088C44916E5815D5 +:106190002E3083081B235200D42003408C0413109C +:1061A000101210080C858501C49CA02D2CE7033922 +:1061B000B04EB8B114008406AD20C90C5F990649F1 +:1061C00043AE33AE24AE241551489A810018742092 +:1061D000006203DEB1629085C811C84D1533FD38E9 +:1061E0001FB7002188A820C5FC010E21C18B040126 +:1061F000480400151481050001C424A9C501060C3A +:10620000CA62D4C44326064909109028A4682216FD +:106210009143F403FE08223F3982462CA3230C004D +:10622000D72B024120100D60B024120180D603024A +:1062300040C2BA398E01F0D287FC14522A50CEB92E +:10624000E09508886E00FF004810E43840022420E2 +:10625000816091141487A01108C840812120510049 +:10626000000000814020F0C58308B54A3D01BB38DD +:10627000507C16A14AA2D044887A732DAC44FD61AB +:106280001ECC47B211280C207156BC4198143C43D7 +:10629000433029402B0201FF0182C28180FFF03A86 +:1062A00065C740F1C6B001032410090080048008CE +:1062B000000971090000E2E47E020E9D8F4C900AF5 +:1062C0000028100CD98D545088282840028201548F +:1062D000201304E05C05C08C0B80B8140270000031 +:1062E0008A62801018928015590801B18440FBFE23 +:1062F0003A588093F0B0B0400000400F00012C5499 +:1063000049FF1858004010004029900C83821C500F +:106310009084598204230484204890448104080016 +:1063200040810204240820448204010210810804F0 +:1063300010021020084040810408020420081008C0 +:106340002100810104101020084104084810202178 +:10635000001021204082040020400204102041024D +:106360000010200842102040420204082040008112 +:1063700004081040800408204082040020409084DB +:106380000112008420108410810842002100408402 +:10639000040820408204008840FFF33FF7CFFFF05D +:1063A000C3FCF99F2F5FC7FF9342F4FF0F3EFFCF5F +:1063B000B710FF0CFF3F3C77C3BFF00DF0FFFE03AB +:1063C000FF43D1C3F3044D5F10528C006140501560 +:1063D000010A5682B270423800000000000000003E +:1063E000009CB00000000000000060000000000001 :1063F000000000000000000000000000000000009D :10640000000000000000000000000000000000008C :10641000000000000000000000000000000000007C :10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C +:10643000000000000000000000020000000000005A +:106440000000000008000000000000000000000044 :10645000000000000000000000000000000000003C :10646000000000000000000000000000000000002C :10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C +:106480000002000000000000000000000800000002 :1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC :1064B00000000000000000000000000000000000DC :1064C00000000000000000000000000000000000CC -:1064D00000000000000000000000000000000000BC -:1064E0000000000000000011000400010000001185 -:1064F000100444411110444400000000000000005A +:1064D0000000000000000001002220010000001167 +:1064E00010004440000040000000000000000000D8 +:1064F000000000000000000000000000000000009C :10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B -:106520000000000000000000000000000000080063 -:106530000004000000000000000000000000000057 +:1065100000000000000000000000000000000080FB +:106520000006000000000000000000000000000065 +:10653000000000000000000000000000000000005B :10654000000000000000000000000000000000004B :10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B -:106570000000000000002840480220400002000106 -:1065800020800080082090800000000000000002B1 -:10659000000080000000040000002484810100004D -:1065A00000000000000000000000000000000100EA -:1065B00000180408C2011000100220042204080080 -:1065C000000000400842020802010240821004015B -:1065D00001004240600000120300000209000400B4 -:1065E000000000000820000800042208810240800A -:1065F0000810041000800400400000400000080063 -:1066000001502240249224900180400408400A084E -:106610000001088140200200042002808000000068 -:10662000190410008010420450080000040192EB8D -:10663000E8BEA8000B80120044000081040084081A -:1066400080112800A400000000000000410008168E -:106650000000021040000008204C002000800000D4 -:1066600008080062101000E8C010DD40B1000014FE -:10667000801808000041100200803000010800006E -:106680000000000000004000A0200000000000000A -:1066900000000000000011800013A088A088B8232B -:1066A0000008C50002C40000175EC00C9020000363 -:1066B00060321040C00000900104020202006050ED -:1066C00008B00008044040209B001085040C0080A6 -:1066D000504000500820200050220000802A08026C -:1066E0008010200200BFC13C060231F001340208D4 -:1066F000164408217000B01040088A0040409604FB -:1067000040050002802180A400404100000002807A -:106710000088048000000800008000002A3224085D -:1067200042800C00110006000290008224281238DA -:10673000400A8680940021083D82000F717FF0DFBF -:106740006F07FF8DC2F0000880403C00000C120271 -:1067500000D049284007A972B344820E0D300A0ABE -:10676000B35858C8D000C80B2D312550950D0040A6 -:1067700080240022500408042002120252E010413A -:1067800011A60D41401208334B0112060411466850 -:106790000B500310CACB12600064211698084D807C -:1067A0008000098022024414420200D29000CB08EB -:1067B000AD128B3002A202088819313030434330C9 -:1067C000B347434001081634000140808042500026 -:1067D0000224004014521450050015B0880AA01875 -:1067E000540E000424090B910008024805A4CAA114 -:1067F0006101444102001E4A8E010104286A0D2AEB -:10680000831CA29A08941A2B1C025000B12C6023FE -:10681000241586981115804C4C0F11022380000816 -:10682000E2862D2E845000088060030B92C0C100C8 -:10683000ACEC3552260B09A8408150A40308818195 -:10684000F28191C044A4020201948043505112216C -:1068500000880800000020002010020181040400CC -:10686000010004041A00D00029000C040080B104C7 -:1068700000D216028080B490420091010A200000EC -:1068800002D340258002D24039000000010C0000F4 -:1068900000000019502211000A0820000000080022 -:1068A00020800080610000100002340040000300DE -:1068B000149412808A000019544580308A41029352 -:1068C000C8900D00026208031080800200000008DA -:1068D00090E00848900020000168827048C4470892 -:1068E00020088802D4C47A403CACC41322711849F1 -:1068F0004033220240A28350A102108D81A6A0093C -:106900008882550400010901D4A073B11131012E10 -:1069100080A3E0315827D40402300000000008A210 -:1069200002AC22FD0090C604948C4010E00CB00430 -:106930000B1808344018B88B4434344DE471AA2045 -:106940003A440EA00121C0048CA14105544DA3D2AC -:10695000335009522900C42D024104327E00480000 -:1069600005400000000001100020202510025010FA -:1069700040000020950C4001020008200001204C3E -:10698000403008088110000094AA08C98510110839 -:10699000001428042540002100000000000A000126 -:1069A00040000050020910C3490000280000088080 -:1069B000000002000080100042040022400000405D -:1069C00010024104801500200800A94C922068485C -:1069D00002041302046A2020C40802289300046001 -:1069E00010800A2000480204C010000000280000A7 -:1069F0000100040400800080010C43D400208000CA -:106A0000810201410280100000000000001000001F -:106A10000002800002001830000020004001020047 -:106A20001000801DF00019810080300800800000F7 -:106A300000200402282CA2000800A0C0382000403A -:106A40000004022000A002003300E0C01420014036 -:106A50000000804000804000A8000000008000206E -:106A600020000000010000090805070022001000B6 -:106A700000000A0000000011028840454420004A3E -:106A8000002282200110080040219101040004002E -:106A90000040000000000080206000220000000094 -:106AA0000008400008A00000200001010004924AF4 -:106AB00008845008E004280040245090090448004D -:106AC000800008000000A1009001002000080100E3 -:106AD00008000200001000000081040104081C08E6 -:106AE000000002910044200000020000000151500B -:106AF0004A1122410108210828082800004000000E -:106B00004180800000008C00229A0C500400004854 -:106B10000022D400120200C008A80085002FBE3752 -:106B200080CE027025DC03C00000040360231C2813 -:106B300002000E000242D0001E2426510187B0EB55 -:106B4000A42311026C00000124002000250A06B8CD -:106B50008233CC99F73A01009773BF40E0920977EE -:106B6000CBFC12212C0A8A210E0482907F906208AD -:106B7000002C0414101508A14C006400006020B023 -:106B80002000088040421010000019003E00000361 -:106B9000A16801010600080040F004311213C5414C -:106BA00040010600000000000000800000105200BC -:106BB0000800A940000000000700000020001000AD -:106BC0008000200040200040000200000000002063 -:106BD0000007F000000002010020800030400000AB -:106BE0000004004000204040080000200400040091 -:106BF000000000001804000891000042020002108A -:106C0000201080010005004028028048050050083F -:106C100000A002000A0000000000000000080001BF -:106C20000000000000000020000000000000000044 -:106C30000000000010000000000000000010000034 -:106C400001000820802011AB042206042078C046F1 -:106C50000C327CCB27C0993836640306003C6018A0 -:106C6000000D0002C98F0992742466CE0078C030EE -:106C70000060C0618026CD8DB2F2C9908C6C046832 -:106C800048D1E0211C01811326CF3261F3A49B3649 -:106C900001E34C1A30E18000420993036131326410 -:106CA00013A6060C0070C3860C346813264B36619D -:106CB000D324C8460E1E008420D084D08D24210900 -:106CC000D09366C4366C23468A3460884445B33218 -:106CD0007D03A300CC24707B08690A470260846CA2 -:106CE0008E02FB8AE65061C0ED6F2135C01391C959 -:106CF00084977D055B030300010000540008CFFF6B -:106D0000300000001429914BF19002B80F203FFC95 -:106D10000000F000001810000402006000001000E5 +:1065600000000000000020400823804720020001B6 +:1065700020C0009008208800000800800000100A59 +:106580000010800000212400012A248480010000E2 +:1065900000010200F00020020004000700000901D1 +:1065A0000018044CC2090808002210002200004014 +:1065B0000110000000021208000100028200042005 +:1065C00010080044009000022004040201100C8016 +:1065D00000000000800000810004020809000000A3 +:1065E000081004100080060040080006000000802B +:1065F000001200202EBE35F44108500408200A087D +:106600004001088140200300042202808008002607 +:106610001A04100092904204500800800811A2EB66 +:10662000E8BEB9001B8010004610205908008408FD +:10663000C201201C3021020421000C2003A00824E8 +:1066400004200210600800283088008001008008C3 +:1066500002088000830010E88010DD48B002121CA0 +:106660000008060501511012000030000808000261 +:106670008090004020108200A00400404800800468 +:1066800000800800801010800011A0882090BB219D +:106690000008C54152E4C215175E880D9090008134 +:1066A000F20E2043A0008A5C00200200020060502D +:1066B000004000080E002010C288098014060080E7 +:1066C0004040005008200002C0220004802A080236 +:1066D00081302002008D8119070230B2009800003D +:1066E000002004000010C01042000A400040920444 +:1066F00044840002800400A408C0480812000280FC +:106700000088048000000C00008000802A322400F1 +:1067100000001908350007000290001804A0080BBB +:10672000088A9002946C29083F820FEB73DFFCFF0C +:10673000FF3DFFCFDAF2080C22813922008FE202FE +:1067400040C069014C040010334081401D30080BEB +:106750002058586CD100C10B0D31A540840524444C +:106760000F24012644002F00000412010A00102803 +:1067700013A60D01605B28B34E284206040176E89B +:106780002B402EE8CACA926804603506984069809A +:10679000800040000810C080400220D3803AA30A45 +:1067A000AD12C33422B0028801393130305F4B3032 +:1067B000300703401028101410000022A253408C10 +:1067C0000600024086121E4021A432040A2AA000BC +:1067D000701000283CC92201000007692124CA8CDE +:1067E0004008540142000642A001000420400D125E +:1067F000031AB21A18861A0B1A0A1000A82469A3E1 +:10680000229586985181A06D6D0B100222022008FE +:10681000C1092AA88E230249E078432FFB80520148 +:106820002CA035082622048460400090261A4101DD +:10683000831152C444B4020103969109D034D7366F +:1068400040840C407218041120140209A004800135 +:10685000230004040A00D000290228C340600184F8 +:106860002830951A800009838D20D04103A500802F +:106870004085000CA00024C052000100450D00100E +:106880004000009954150001080AA000000008000B +:10689000208000B0610000100000340400424BC0B2 +:1068A000148808008800015B54F08018590182B3F5 +:1068B000CCD041000A42082002C4802A012A280CB8 +:1068C00091F0284890A1200005EC82107CE6040499 +:1068D00020888801C0E47F413828C0012260080177 +:1068E00040332A0210228850A102100D81A22009F3 +:1068F000A8C2542680810101E0A055B11100058C89 +:1069000080C3B8F33827D200860246B0008C00104E +:106910000AB801DD10F8FE0C808E4390E51CB4042B +:10692000060908A40011209BE43A3C4E6071EA205D +:1069300010100A8800A1D00400A14415740CA9C24B +:106940003B504938283044BF41410438D400C00886 +:10695000245220A00000011040A020945002591B96 +:1069600040020423F8DCF8041E290007900100E02F +:1069700040314A880110060084C008C1840010001C +:10698000001008060540002340200040040A0000D3 +:1069900000000000020C12452101112410000880A3 +:1069A00004810200000090000004000000000200CA +:1069B00000020100001508010800204800236808B3 +:1069C00002241302006A2126C408020893091061F8 +:1069D00004901A4C02488B0860880400E10400000F +:1069E0000000552C04800080010C43D4002080005E +:1069F000810001400280000000000880011040007A +:106A0000000AC0000200183000002000400502000B +:106A10001000840BF000198100007E8800820000C5 +:106A200000200402002EA200000028E03021000413 +:106A30000004422000A003003300E0C01420004006 +:106A40002000804000804008A80000000080003046 +:106A50002000000001000009000407002A001000C7 +:106A600000002A020008800102804008052000483A +:106A700000200220511008004201D14944000600C4 +:106A80000241010000000080006801220080000037 +:106A90002008400018B004002000011100008240CE +:106AA00080A04428E004380002A0588009000A129F +:106AB000C00008200000890010012424000A0700FB +:106AC000081002000010C6000981040104083C08F7 +:106AD0000080029000542042891202883C1100106C +:106AE0008800225001082108280820222042300076 +:106AF0000180800000048C00229B0C5014000008D0 +:106B00000020C400C20200C00828028400052A3503 +:106B1000014C0660809401620000040040335C6810 +:106B200012020E000240D000048006400081F06A8C +:106B3000A400000A468000012408A2002402063AAC +:106B400082128C10F33A000006510F44E08000617D +:106B5000C2FC12200C0E88231F0682B16D906308C0 +:106B6000002D0014121708A1DC026400006020F45C +:106B700030000841C04112B0A0001B003E000003DD +:106B8000A040C10106800C4000F004310213C54151 +:106B9000404106000000000001008080001052000B +:106BA0000800084000200008052000002000100018 +:106BB00080002000C0200040000200F00000011012 +:106BC0007807F1046A0404010420000401000000B5 +:106BD000000400A000000040161101200400042061 +:106BE000009000005C0400080102000210440280D2 +:106BF000210000000001084008008008010010008A +:106C000000A0110202000000002000002208004144 +:106C1000000CC8FC01000801E2080039E2389E07B8 +:106C20000390801000F00001080D40069C10000049 +:106C300001000823C03011AB0620015C421C00A0FB +:106C4000000610086102800002183040030801822B +:106C50001040080A1045306214C0E08302000108A9 +:106C6000021C200C6120C3008C12284084020A10F0 +:106C70000C304213002843100185080070C08500C5 +:106C80002800818400184084C40800002603040002 +:106C900010802041020810A0000E1010C1810810C1 +:106CA0005000390C038408440208003900048008AD +:106CB0005000A1000E183081010C108800F7DF365B +:106CC000FFCBEF63C3ECE8DD3DFFCFFE93E3DCFFDA +:106CD0008F2FFF8DD7507F0CFF3F3E37C1DFF01F56 +:106CE000F8FFFE07BF03C0C3F1000C03000BCFFE8B +:106CF000300000011004514EA5A0113C000000001E +:106D00000000000000189000040000600000200057 +:106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D4000000000000000000003FF00FFFF0000C083 -:106D50000000000000003FFF0FFFF3FFFCFFFF00FB -:106D600000C00000000000003FFF0FFFF00AFC0021 -:106D700000000000000000001020000000000000E3 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000003FFFB5 -:106DA0000FFFF3FFFCFFFF0000C000000000000029 -:106DB0003FFF0FFFF00AFC00000000000000000091 -:106DC0001020000000000000000000000000000093 +:106D3000000000000000000003F000FC033F00CF53 +:106D4000C033F00CFC033F00CFC033F00CFC033F1A +:106D500000CFC033F00CFC033F00CFC0300A0C0062 +:106D60000000000000000000000000000000000023 +:106D70000000000000000000000000000000000013 +:106D800000000000000000000000000000003F00C4 +:106D9000CFC033F00CFC033F00CFC033F00CFC033A +:106DA0003F00CFC0300A0C000000000000000000CF +:106DB00000000000000000000000000000000000D3 +:106DC00000000000000000000000000000000000C3 :106DD00000000000000000000000000000000000B3 :106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 +:106DF0000000000000000000000000280000000269 +:106E00008000002664099992666499990000000048 :106E10000000000000000000000000000000000072 :106E20000000000000000000000000000000000062 :106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 +:106E40000000100000000000000000000000000032 :106E50000000000000000000000000000000000032 :106E60000000000000000000000000000000000022 :106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 -:106F50000000000000000000000000000000000031 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E -:1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D -:10740000000000000000000000000000000000007C -:10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C -:1074800000000000000000000000000000000000FC -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C -:10750000000000000000000000000000000000007B -:10751000000000000000000000000000000000006B -:10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B -:10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A +:106E8000000000000000000000000077C800007F44 +:106E900000002401208800800C20DBC02606400072 +:106EA000619910016601C0000043CE1C00043ECF72 +:106EB000CFF1900184000010AA00000140002005DD +:106EC00000000CDF80601C000000000000000000DB +:106ED000000000000000000000A4001480048001F5 +:106EE00020288004001407003201403801000A0AFB +:106EF0001C00011011BC3E00008F73FFAC7C0F3EE4 +:106F00003E0F19F1280C11843002081900000C0002 +:106F10004020000A300176608C3621B2C18212D046 +:106F2000F8320A02E10F0821568421903C27051A05 +:106F30001218000107010709C133E26C01333DFC5F +:106F40008421F0C364365034230000C100008D2238 +:106F50003F7802230040504288039C000002F0006A +:106F6000184321800F65D06480D9761241CF9F31BC +:106F700039F00EF00048470080101CCC0C041C4374 +:106F800014234020A6BB12F7486503E42C6DFE2DA8 +:106F9000B6C9FFD018A8290002B24C3FB3D87887F1 +:106FA000B03D0F487B03B0F40F61189EC00401E8A8 +:106FB000041848280400D400008483880618016857 +:106FC000800004112417388450010C808135253746 +:106FD0000E20021848F08B3244001180A3800681F5 +:106FE000140500A5108C4448080B1104C2B1E280BE +:106FF0000810111140C421D4C400100040C2060181 +:10700000880060F50000003A00800020D0220004D3 +:1070100010D001206130010084C82226383A630074 +:107020000042D822971044E721530002002A44412D +:107030009004020204038410C0100E48C3180020FC +:107040004037802002000570200001410000000050 +:107050000000000000000000000200080000264CB4 +:10706000004500A000A1651024021320A9000D44D2 +:1070700015538E291009000404124D082CA090000D +:107080000028000700138047840B080B5808AA82C9 +:1070900081D0C1E90AAAC105200120A90029010A5D +:1070A000706122A8207102A042A20120100A951648 +:1070B0005140040000001B2800C04D0000000840A3 +:1070C00010308A8081C04A9400101240050CA0A2A2 +:1070D00084040B2285400B20329043200080040062 +:1070E00080A08010010940092880078C450926549A +:1070F000800042400021A7242001E6211084404066 +:1071000000B2800021AD10D56038E0023F22432C50 +:10711000492001448A9011867002400AD60C0882E8 +:107120002068E00A0285C6F840800420201008018B +:1071300000000080842204B98C905042C0002438A2 +:10714000084021230440ADC012E10E6E6055440199 +:107150000A018000A010300C9814390ACC1B900052 +:1071600004209A004AC828D080002D48000906A4AF +:1071700053830440002018C00612A0000B610300D6 +:107180000002D04868BD0A01460C2F40C020000410 +:107190000009C00140BC08000320BD000010C00071 +:1071A00001110066000003000060322D2DCE60004A +:1071B0001C5010420618C0B0C02DEC230B026244D4 +:1071C0003BD001100300000800000249944540072D +:1071D000048108A26340912B3047821192510490A0 +:1071E000F920C38A30220300A50E150180014296C2 +:1071F0008028060C0A8570408504CC8B054D000064 +:10720000411100620A0045090181004050A412A00A +:1072100007005090080246020080C291C01418A0D6 +:1072200005E9C0001017A43183215185426106246D +:107230005E3B1126C4210129904622102A02A23366 +:10724000648030640C25040822C60460B419D80C8C +:10725000A1F0110C03102414480120310010C108C2 +:1072600042018300080C2442020401408323682465 +:107270000004040006200A10C10008D60000000225 +:107280000002C21050040020040C001002000B6821 +:107290000081640C600510080000000010881001D7 +:1072A0008110110A0819BA00914761408B08020247 +:1072B00007900A0E6045941F54000280000044208D +:1072C0002C140620C1394005C00011283C892A90A1 +:1072D0001008C8A0240102008161A034452B1104CC +:1072E0002141628010CE264E09600242C434110052 +:1072F000644011400080100420594166821004004F +:10730000F20000008CC1100400881000010900CCBC +:10731000084600008C0111202B2C10C8010908011F +:1073200080909008420D020F8A201034C08820837C +:107330000A8100014011D6160109C68040140828B0 +:1073400010800101800A0027A800438100038020EB +:1073500023E000440DA80243DCC5F410040082922F +:107360001200A9440280099B12383008C313F2822C +:10737000AA005A70C2000144C8002228C0160D3A63 +:10738000C20833B2510088CE0100031A000C0C046D +:10739000CD2220CAD822BAE451331100C00D030A0D +:1073A0000057653B8847CEC0502C0088190F042A2F +:1073B0002367701EF90841C089A0B0B02BFD2A29AF +:1073C00000E401F08804440290C4208000244010AE +:1073D00001000080800088000004514A1081415063 +:1073E00020542F20020000C04410420E020061D041 +:1073F00002081C280000001100C400000001200445 +:1074000008000100101102C041000100100010002E +:10741000084962801FF8939E2180866E40C0045008 +:10742000261FCB005F800BBC41240CF5040000221A +:10743000FC01042081420600204CF1C02000C0E580 +:1074400013D00042B80002825801A88008013C1005 +:10745000000420208026100064012F424140501279 +:10746000080204014002F800900800000010090022 +:1074700080000001009000000000020100000000F8 +:10748000020001A00000040050400000001B020F99 +:1074900070000810000010D4024340E900E5863F68 +:1074A000FD80FF03DE8CAAFF3E08805853F1C04CDC +:1074B0001D180C08180014241D2D0018001080023F +:1074C00040940000018200000100004001000040E3 +:1074D000A0040002800000819820519000C000AA02 +:1074E000040021A85407F001530000200000008090 +:1074F00000000000000000780000000000001830CC +:1075000050010CC00A004047C80086012400030057 +:1075100000000009100043E00109004B0830960903 +:10752000612212C0212504080A001004180040330B +:10753000200800602000AEA011F8047950E2E02598 +:10754000501415440250FC1C3CAA317085281014BC +:10755000148448020443210081C0101004220C84CA +:1075600020C9904C9924C9824C91326464C8264C3D +:107570008264C1321099080493021320C84C4C99BC +:1075800004C9826420C990C9210C990924909324CC +:10759000084904C849932021301321264C8264C332 +:1075A000264C32641326493261932408421326463E +:1075B000426264C8264C0C9904C9924C9864C9264E +:1075C0004C8264C3264C908419324084209084906D +:1075D0009908424321324C8464C9264C8264C08895 +:1075E0004C89961126C595118024E599020681AE35 +:1075F0004290204A4B105C013480AE00D3A50510A8 +:10760000808CC1C914B939052840808002444808DB +:1076100010154C00400010A0003D2A8F1E7002E89B +:10762000FFC03FFFC000F0000018B00000000000E5 +:10763000000040000000000000000000000000000A :10764000000000000000000000000000000000003A :10765000000000000000000000000000000000002A :10766000000000000000000000000000000000001A :10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA +:1076800000020000000000000000000008000000F0 :1076900000000000000000000000000000000000EA :1076A00000000000000000000000000000000000DA :1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D00000000000000000000000000000000000AA +:1076C00000000000000000000002000000000000B8 +:1076D00000000000080000000000000000000000A2 :1076E000000000000000000000000000000000009A :1076F000000000000000000000000000000000008A :107700000000000000000000000000000000000079 @@ -245530,4103 +249627,6 @@ :10EDD0000000000000000000000000000000000033 :10EDE0000000000000000000000000000000000023 :10EDF0000000000000000000000000000000000013 -:10EE000000000451014440450411111110444441D3 -:10EE1000111044440444411110444411110444416C -:10EE200011104444111104444111104444111104BF -:10EE3000444111104444111104444111104444113F -:10EE400011044441111044441111090441141044A7 -:10EE5000441111044441111044441111044441115E -:10EE6000104444111104444111104444111104444C -:10EE70004111104444111104444111104444111132 -:10EE800004444111104444111104444111104444FC -:10EE9000111100604E00018030632019F88B188337 -:10EEA00011F8A01800F186260000001B800618C388 -:10EEB00018B030600C0B00F00045E2602860180DBF -:10EEC00000018980188067F830B8C0000046C06033 -:10EED00003018000C1830030830020004000100047 -:10EEE0006000182000C10010C0C000000060400099 -:10EEF00000060000000030000002D8C0C20100E19E -:10EF000001300000200000000180060000D02663D0 -:10EF10000F1800026002A04040000080C200000400 -:10EF200030C10608075060060001B00C02003EC266 -:10EF30000030400D00F80800C020346860361840EA -:10EF400080100F84800C02034786030C10C1000060 -:10EF50000C001802678020010000C18CF19980002C -:10EF6000A419080318C0031800000C0000000318BF -:10EF70007800000C3C0060C0C60C0006000E0000CB -:10EF8000001C00120019E181800033008003200082 -:10EF90000001D00210000000000E00016000842F6C -:10EFA000000800C00000800801001000801001006F -:10EFB000100203A00000300E30C0002780008463E0 -:10EFC000ED249A0118614C0CF3CD78812612104B78 -:10EFD0004300DA98090002820200F0601020640CFD -:10EFE00014080C00820481E8170449805361B010B2 -:10EFF0001030240B50000844C1432C600C03320332 -:10F0000000001D00700380006CC00C00019800001F -:10F0100040031CC6400C18C30000307006CC26D933 -:10F02000CB01D070C8D70C2B03000311606C0E19F4 -:10F0300000200B01808000002B19B58C5BC2198861 -:10F04000300101B00C6302D3A848131A6902828010 -:10F05000144461000033C000000000000000000004 -:10F0600000038668CC6001B30D80001BC018300D12 -:10F0700080091C00C00C21E30600C00CD369803657 -:10F080000103278DA602980019B336508ED841B0DF -:10F090007864A324A4C357318C18643C28C00001B1 -:10F0A000936D30C0003C6D0019019A303000302B58 -:10F0B00043000001D893C6130041B4B0F6C06CC33E -:10F0C0000000040000198C003E0C0C00C0034C0032 -:10F0D00022D6036887860200C8916900C9C5698283 -:10F0E0001908001E113680222009602C22368D80DE -:10F0F000C6408B6086F618864A232003FC00000673 -:10F10000060C09000168050A16980005A008580AAF -:10F1100016000200800020343CC320130C001010A5 -:10F1200000DA602C00416B60008000CC13C6030045 -:10F13000629EB4A5A501694D4C83045003D800001C -:10F14000C06EA3B43082BE000C400630B4B4C00818 -:10F15000000D0080B04D20D03027460A5AF30160E0 -:10F1600042D200110160C322581804110906F4604C -:10F170005350E4010C3002018100DC6DB31E060621 -:10F180001A0059EC890019F84F0C02379800610CED -:10F190003000000318D8DE183C36000CC0033006DF -:10F1A000D80000098CC3000499C639984C33106DFF -:10F1B0001000CD018A009100000069001966001856 -:10F1C000314000CCF00B99860020606080C3233270 -:10F1D000023193030000000000020C00300C618C2F -:10F1E0000FD8CC29836C080014030000460000608F -:10F1F0001800180008B6002014360021B0000C10CA -:10F200000E180060060601F8018E40B00F0001C123 -:10F210008300CCE01830257600181100087D812B82 -:10F22000FFC00C0008809540060040C20000001896 -:10F230000000780E01000004000026530352114024 -:10F2400020000328100300D03100C40231800016D2 -:10F2500001000000010006003002C580889803000C -:10F26000C1004002A8004906AB06A0922C00068C03 -:10F27000353600966041001A2A0AEA019DD330CC47 -:10F280006D91061A0C3D9021101A403040C031A0FB -:10F29000050C0000038008200281600F413958C826 -:10F2A0000003600096AA18018DD3116800740C3316 -:10F2B00000480C036034AC0C3C0C460183C0006079 -:10F2C0000009DE824D0199A8A36908CC46C2B0E6C8 -:10F2D0000CC6D006430600036C600300032A4D866B -:10F2E0008005A0B468002D4498236A4C162C1B8618 -:10F2F000C6630166F41B160C1B82D6620AA46C312D -:10F3000033480C8300D020C600330C0C010001B43C -:10F3100066602CD983F67303E4B0DE0103C240417A -:10F3200000C0620338C60656C3646C673912C980D0 -:10F330006280EF0062C3290984C102F0040029152C -:10F340006CCC00800C00303E06E0C818303034C071 -:10F350002E034C010310303828180046C00001B0BD -:10F360000028000198C0BC00143C0D660880C260F3 -:10F3700000C6000CAC0C130C00C001802800000378 -:10F38000012001966C153300038CD80016003A0258 -:10F39000266CC0D1908B60454032824814220C30DC -:10F3A00077D826C60306D0EC60199A0456001111CE -:10F3B0008400068020680B0700888800022B40012B -:10F3C00076104444A80009104006120AE899D40CAB -:10F3D000D045AEB2332C58D10D198CECB2001802C6 -:10F3E000000181049C314000186000C6CC196330D4 -:10F3F000B075083060099601EC0CE1AE018C461D39 -:10F40000C25F3C633119ACC58B604D005B1D02418E -:10F4100041CF61CF60CF603FF347B0030080016010 -:10F4200000F60477F083B0801820004E0032D4003C -:10F43000DA1A004288A860C500000700E1038403CF -:10F44000D800403F1D930144000C60891123804186 -:10F450008362540043260B6C0C109000B4D8661DD8 -:10F4600083C00083F688220001C0CB2C8181140068 -:10F47000140B86C360000170B86C36000017038659 -:10F48000C0E062078048D80382848CF73CC34FD821 -:10F4900003E0040C010621808E21A600C55722023C -:10F4A0008550133CFC006200000C00C021B0C1007C -:10F4B0000200058340021083623005460063C300EA -:10F4C000600018678FE6E0ED9CFB7B3FEC48FF7225 -:10F4D000419C906621508066F233F80BA00030C644 -:10F4E00061B0A26460130D000188002780FFF10065 -:10F4F00080CD04818E3062010EBC4389E1BDC4021F -:10F50000BB18004010128A280E560506C0C1B0581C -:10F510002060B22CD9803050184000C00006040092 -:10F5200061316072CE2CE58E59C19CB026390488B9 -:10F53000CAC6106C90061700008E2A01ACC00003EA -:10F5400006030586000C044005016000C403018029 -:10F55000C3000602804282216063011809804CC00A -:10F56000A4007D9604200084200810408104080037 -:10F570004081020404082040820401021081080432 -:10F5800010021020084040810408020420081008DE -:10F590002100810104101020084104084810202196 -:10F5A000001021204082040020400204102041026B -:10F5B0000010200842102040420204082040008130 -:10F5C0000408104080040820408204002040108479 -:10F5D0000102008420108410810842002100408430 -:10F5E0000408204082040088400000000000000061 -:10F5F000000000000000000000000000000000000B -:10F6000000000000000000000000000000000000FA -:10F610000000000000004000101D4000005410D009 -:10F62000141ADA0C46F043B8000000000000000095 -:10F6300000DEB000000000000000400000000000FC -:10F6400000000000000000000000000000000000BA -:10F6500000000000000000000000000000000000AA -:10F66000000000000000000000000000000000009A -:10F67000000000000000000000000000000000008A -:10F680000000000000000000000200000000000078 -:10F690000000000008000000000000000000000062 -:10F6A000000000000000000000000000000000005A -:10F6B000000000000000000000000000000000004A -:10F6C000000000000000000000000000000000003A -:10F6D0000002000000000000000000000800000020 -:10F6E000000000000000000000000000000000001A -:10F6F000000000000000000000000000000000000A -:10F7000000000000000000000000000000000000F9 -:10F7100000000000000000000000000000000000E9 -:10F720000000000000000001000440000000000094 -:10F7300000000000000000000000000000000000C9 -:10F7400000000000000000000000000000000000B9 -:10F7500000000000000000000000000000000000A9 -:10F760000000000000000000000000000000000099 -:10F770000004000000000000000000000000000085 -:10F780000000000000000000000000000000000079 -:10F790000000000000000000000000000000000069 -:10F7A0000000000000000000000000000000000059 -:10F7B0000000000000002A444881004C00020001C3 -:10F7C0002080248008208000000880800000000A3B -:10F7D000001000000021000821200080000100002E -:10F7E00000000200000020000000000004000101F1 -:10F7F00021182408D0091000002220040200004033 -:10F800000110000000021000000100008000042030 -:10F8100010084004009080002004840200100400BE -:10F820000000000080200081000400080940000062 -:10F830000810041000800400400000410000048013 -:10F8400008100A40649024804180400C48000A2837 -:10F85000144908814060880024208281814240024E -:10F86000190451808052420450181424044192EB30 -:10F87000C8BCA4015B8010004400004D0400840853 -:10F8800080912000B4010000000000002180188059 -:10F890004000023140000118A040080000000000B4 -:10F8A00008080000001004E84010DD409000001837 -:10F8B0000018084801AB100A008030000008000062 -:10F8C00002C4001010004100A022002004004002E9 -:10F8D0000040040040080880000060206091012181 -:10F8E0000008C50002C40000175E892D92A9040318 -:10F8F00020320040C0000890410002020011615017 -:10F9000000000008000040A1000013003410009027 -:10F910004040005008202000D0220000802A080229 -:10F9200082302002000991184102082000040208D8 -:10F93000024408217040901040008A4040409624C4 -:10F9400044850400002000A4004241080200028017 -:10F950000080048000000040208000800A332400E2 -:10F9600050000C08110006000A900010AC60003A2C -:10F97000090A96808044B108000200024020000875 -:10F9800080020000B910080C00803800000CE21260 -:10F9900000D0690940041010334080011D30080B6D -:10F9A000A0505848D000C00A0D31A5400404000002 -:10F9B0000A04002204040804200210018A0010082E -:10F9C00013A60D01725A28B34A086A06040166E8B4 -:10F9D0000B402E60C8CB12688462B11698086D8106 -:10F9E0008080488007C94002100610D290328B0AEE -:10F9F000AD10CB34A8320282003D313030430B30A1 -:10FA000030470B4200081020112480B2A20350207E -:10FA1000200002001012145025A430000808A01A7B -:10FA2000041A0000AC492801000003482524CA81BB -:10FA30004201440112001E4A2A01000428720D02EC -:10FA40000B1CB21A18061A231C031940B0046923B0 -:10FA5000229186985111A0494903504A6282601848 -:10FA6000C0012A280C058148E460632F9A80420176 -:10FA7000A8A03508262A00A040806090271C010914 -:10FA80008081D0C006340201029480219035D630A6 -:10FA900041840C0052102001211002018104040055 -:10FAA000010004045A00D0004900040680D0B104CB -:10FAB00008D216028080B490C620D1A10A6100004D -:10FAC00042D34025A002D2407B000000010D00007F -:10FAD00000000019102011000A0820000000080092 -:10FAE00020800080610000100000340040000B0006 -:10FAF000049410008A00001B7465001818012393F9 -:10FB0000CD904D000862080312CC800818100049FF -:10FB100090E000089000200001EC82505CC20700D9 -:10FB2000020A8802D4C47A0038AC441322751849FA -:10FB300040332A4242A203142002108D81B62029AC -:10FB4000808244040001010194A076F1113109ACD6 -:10FB500081EBE0215C27C4000230000000000CF2C1 -:10FB600002EE32BD2090C60D848C4000C00CB486DD -:10FB7000031C09344018B8034414344CC071AB0062 -:10FB800032C40EA00101C00404814005544983C061 -:10FB90001A504952280044BD021104327E024A0024 -:10FBA000040000000000111000A020111442411CAC -:10FBB00048000020148C50000A0008278001200C07 -:10FBC00000320A008110000084EA08C884000000A6 -:10FBD000001428042500002100000000040A02018E -:10FBE00040400050020812434101102800000880E4 -:10FBF00044000244008410004204002340000040FE -:10FC00001002410400050020080008080001280037 -:10FC10000204131204EA202240480228130414E0CC -:10FC200080800B00000802048000001042200000C9 -:10FC30000101440C00800080010C43D400208000AE -:10FC4000810201410280100000000000011000004C -:10FC50000002C00002001830000020004000020036 -:10FC60001000801DF000198100803408008400809D -:10FC700000240402282CE2010800A0E03820004003 -:10FC80000004022000A00200330060C014200040E5 -:10FC90000000804000804000A8001000008000208C -:10FCA00020000000010000090805070022001000E4 -:10FCB00000000A000000000102804045442000428C -:10FCC00000208220111008004221D14104110600B9 -:10FCD00004400000000000802068022200000000B4 -:10FCE0000008400008A00000000008010000804259 -:10FCF00000805008E00428000024509009000A0009 -:10FD000080000880000081001001000000000D004C -:10FD1000080002000010C6001181040114881C08AC -:10FD200000000B9000442000000A00000001505029 -:10FD30004A1002414108B108A408A42AA2450000C3 -:10FD40004180800000008C00229A0C500400004882 -:10FD50000022D000120220C008A00085002FBA2780 -:10FD600005CC1632B4CC03EA0800040360331CE867 -:10FD700002000E000242D0001E240E410187B1FB9A -:10FD8000002311026C0000012400A000250A46385F -:10FD900082239C99E73201009773BE4060920977F5 -:10FDA000CBEC12212C0E8A211E0483906F906208E6 -:10FDB000002C0414101508A14C006400006020B051 -:10FDC00020000880C0421190000019003E0000038E -:10FDD000A1E00101068208C000F004330213C5410E -:10FDE00040010600000000000000800000105200EA -:10FDF0000800A940000000000700000021081000D2 -:10FE00009A002000C42010400402000000010120DC -:10FE10000007F00402048001052000040000000037 -:10FE2000000400000002020200010020040014008F -:10FE30000000400044040008910080620204121097 -:10FE4000211080090001084008008008010010000E -:10FE500000202004000000001020002202080041C1 -:10FE60000030F3040120000002404006781E000923 -:10FE700000609004000020200030401800100000B6 -:10FE800001000822802011AB000001080204386143 -:10FE9000C10C08004101830C0E1C204100000185AB -:10FEA00008C08C041000102214202040040002041A -:10FEB000220C181C310000030C1228108C6304085B -:10FEC000482022508018332081000C0030A081028D -:10FED000302082060018308463100000C6030A0434 -:10FEE0001060000000180060C0060C200004000034 -:10FEF00030A02846000000800218C418C11040003D -:10FF000021002040020400000000008820000000C2 -:10FF100000000000000000000000000000000000E1 -:10FF200000000000000000000000000000000000D1 -:10FF3000000000000000000000000000000A43FF75 -:10FF4000010000540534404D24A000900000000042 -:10FF50000000000000181000040000C000001000A5 -:10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF8000000000000000000003FF00FFFF0000C0B1 -:10FF90000003FFF0FFFF0000C00003FFF0FFFF00C1 -:10FFA00000C00003FFF0FFFF0000C000000AF000E7 -:10FFB0000000000000000000080000000000000039 -:10FFC0000000000000000000000000000000000031 -:10FFD0000000000000000000000000000000000021 -:10FFE000C00003FFF0FFFF0000C00003FFF0FFFFB1 -:10FFF0000000C000000AF000000000000000000047 -:02000004003CBE -:1000000008000000000000000000000000000000E8 -:1000100000000000000000000000000000000000E0 -:1000200000000000000000000000000000000000D0 -:1000300000000000000000000000000000000000C0 -:1000400000000000000000000000000000000000B0 -:1000500000000000000000000000000000000000A0 -:100060000000000000000000000000000000000090 -:100070000000000000000000000000000000000080 -:100080000000000000000000000000000000000070 -:100090000000000000000000000000000000000060 -:1000A0000000000000000000000000000000000050 -:1000B0000000000000000000000000000000000040 -:1000C0000000000000000000000000000000000030 -:1000D0000000000000000000000000000000000020 -:1000E0000000000000000000000000000000000010 -:1000F0000000000000000000000000000000000000 -:1001000000000000000000000000000000000000EF -:1001100000000000000000000000000000000000DF -:1001200000000000000000000000000000000000CF -:1001300000000000000000000000000000000000BF -:1001400000000000000000000000000000000000AF -:10015000000000000000000000000000000000009F -:10016000000000000000000000000000000000008F -:10017000000000000000000000000000000000007F -:10018000000000000000000000000000000000006F -:10019000000000000000000000000000000000005F -:1001A000000000000000000000000000000000004F -:1001B000000000000000000000000000000000003F -:1001C000000000000000000000000000000000002F -:1001D000000000000000000000000000000000001F -:1001E000000000000000000000000000000000000F -:1001F00000000000000000000000000000000000FF -:1002000000000000000000000000000000000000EE -:1002100000000000000000000000000000000000DE -:1002200000000000000000000000000000000000CE -:1002300000000000000000000000000000000000BE -:1002400000000000000000000000000000000000AE -:10025000000000000000000000000000000000009E -:10026000000000000000000000000000000000008E -:10027000000000000000000000000000000000007E -:10028000000000000000000000000000000000006E -:10029000000000000000000000000000000000005E -:1002A000000000000000000000000000000000004E -:1002B000000000000000000000000000000000003E -:1002C000000000000000000000000000000000002E -:1002D000000000000000000000000000000000001E -:1002E000000000000000000000000000000000000E -:1002F00000000000000000000000000000000000FE -:1003000000000000000000000000000000000000ED -:1003100000000000000000000000000000000000DD -:1003200000000000000000000000000000000000CD -:1003300000000000000000000000000000000000BD -:1003400000000000000000000000000000000000AD -:10035000000000000000000000000000000000009D -:10036000000000000000000000000000000000008D -:10037000000000000000000000000000000000007D -:10038000000000000000000000000000000000006D -:10039000000000000000000000000000000000005D -:1003A000000000000000000000000000000000004D -:1003B000000000000000000000000000000000003D -:1003C000000000000000000000000000000000002D -:1003D000000000000000000000000000000000001D -:1003E000000000000000000000000000000000000D -:1003F00000000000000000000000000000000000FD -:1004000000000000000000000000000000000000EC -:1004100000000000000000000000000000000000DC -:1004200000000000000000000000000000000000CC -:1004300000000000000000000000000000000000BC -:1004400000000000000000000000000000000000AC -:10045000000000000000000000000000000000009C -:10046000000000000000000000000000000000008C -:10047000000000000000000000000000000000007C -:10048000000000000000000000000000000000006C -:10049000000000000000000000000000000000005C -:1004A000000000000000000000000000000000004C -:1004B000000000000000000000000000000000003C -:1004C000000000000000000000000000000000002C -:1004D000000000000000000000000000000000001C -:1004E000000000000000000000000000000000000C -:1004F00000000000000000000000000000000000FC -:1005000000000000000000000000000000000000EB -:1005100000000000000000000000000000000000DB -:1005200000000000000000000000000000000000CB -:1005300000000000000000000000000000000000BB -:1005400000000000000000000000000000000000AB -:10055000000000000000000000000000000000009B -:10056000000000000000000000000000000000008B -:10057000000000000000000000000000000000007B -:10058000000000000000000000000000000000006B -:10059000000000000000000000000000000000005B -:1005A000000000000000000000000000000000004B -:1005B000000000000000000000000000000000003B -:1005C000000000000000000000000000000000002B -:1005D000000000000000000000000000000000001B -:1005E000000000000000000000000000000000000B -:1005F00000000000000000000000000000000000FB -:1006000000000000000000000000000000000000EA -:1006100000000000000000000000000000000000DA -:1006200000000000000000000000000000000000CA -:1006300000000000000000000000000000000000BA -:1006400000000000000000000000000000000000AA -:10065000000000000000000000000000000000009A -:10066000000000000000000000000000000000008A -:10067000000000000000000000000000000000007A -:10068000000000000000000000000000000000006A -:10069000000000000000000000000000000000005A -:1006A000000000000000000000000000000000004A -:1006B000000000000000000000000000000000003A -:1006C000000000000000000000000000000000002A -:1006D000000000000000000000000000000000001A -:1006E000000000000000000000000000000000000A -:1006F00000000000000000000000000000000000FA -:1007000000000000000000000000000000000000E9 -:1007100000000000000000000000000000000000D9 -:1007200000000000000000000000000000000000C9 -:1007300000000000000000000000000000000000B9 -:1007400000000000000000000000000000000000A9 -:100750000000000000000000000000000000000099 -:100760000000000000000000000000000000000089 -:100770000000000000000000000000000000000079 -:100780000000000000000000000000000000000069 -:100790000000000000000000000000000000000059 -:1007A0000000000000000000000000000000000049 -:1007B0000000000000000000000000000000000039 -:1007C0000000000000000000000000000000000029 -:1007D0000000000000000000000000000000000019 -:1007E0000000000000000000000000000000000009 -:1007F00000000000000000000000000000000000F9 -:1008000000000000000000000000000000000000E8 -:1008100000000000000000000000000000000000D8 -:1008200000000000000000000000000000000000C8 -:1008300000000000000000000000000000000000B8 -:1008400000000000000000000000000000000000A8 -:100850000000000000000000000000000000000098 -:100860000000000000000000000000000000000088 -:100870000000000000000000000000000000000078 -:100880000000000000000000000000000000000068 -:100890000000000000000000000000000000000058 -:1008A0000000000000000000000000000000000048 -:1008B0000000000000000000000000000000000038 -:1008C0000000000000000000000000000000000028 -:1008D0000000000000000000000000000000000018 -:1008E0000000000000000000000000000000000008 -:1008F00000000000000000000000000000000000F8 -:1009000000000000000000000000000000000000E7 -:1009100000000000000000000000000000000000D7 -:1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 -:100990000000000000000000000000000000000057 -:1009A0000000000000000000000000000000000047 -:1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000000000000000017 -:1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 -:100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF -:1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F -:1011A000000000000000000000000000000000003F -:1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000000BE -:1012300000000000000000000000000000000000AE -:10124000000000000000000000000000000000009E -:10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E -:10128000000000000000000000000000000000005E -:10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E -:1012B000000000000000000000000000000000002E -:1012C000000000000000000000000000000000001E -:1012D000000000000000000000000000000000000E -:1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C -:1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB -:1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A -:10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B000000000000000000000000000000000002A -:1016C000000000000000000000000000000000001A -:1016D000000000000000000000000000000000000A -:1016E00000000000000000000000000000000000FA -:1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 -:101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 -:101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 -:101AA0000000000000000000000000000000000036 -:101AB0000000000000000000000000000000000026 -:101AC0000000000000000000000000000000000016 -:101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 -:101B000000000000000000000000000000000000D5 -:101B100000000000000000000000000000000000C5 -:101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 -:101B40000000000000000000000000000000000095 -:101B50000000000000000000000000000000000085 -:101B60000000000000000000000000000000000075 -:101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE -:1022100000000000000000000000000000000000BE -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E -:10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD -:10233000000000000000000000000000000000009D -:10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D -:10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D -:1023B000000000000000000000000000000000001D -:1023C000000000000000000000000000000000000D -:1023D00000000000000000000000000000000000FD -:1023E00000000000000000000000000000000000ED -:1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000000CC -:1024100000000000000000000000000000000000BC -:1024200000000000000000000000000000000000AC -:10243000000000000000000000000000000000009C -:10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C -:10247000000000000000000000000000000000005C -:10248000000000000000000000000000000000004C -:10249000000000000000000000000000000000003C -:1024A000000000000000000000000000000000002C -:1024B000000000000000000000000000000000001C -:1024C000000000000000000000000000000000000C -:1024D00000000000000000000000000000000000FC -:1024E00000000000000000000000000000000000EC -:1024F00000000000000000000000000000000000DC -:1025000000000000000000000000000000000000CB -:1025100000000000000000000000000000000000BB -:1025200000000000000000000000000000000000AB -:10253000000000000000000000000000000000009B -:10254000000000000000000000000000000000008B -:10255000000000000000000000000000000000007B -:10256000000000000000000000000000000000006B -:10257000000000000000000000000000000000005B -:10258000000000000000000000000000000000004B -:10259000000000000000000000000000000000003B -:1025A000000000000000000000000000000000002B -:1025B000000000000000000000000000000000001B -:1025C000000000000000000000000000000000000B -:1025D00000000000000000000000000000000000FB -:1025E00000000000000000000000000000000000EB -:1025F00000000000000000000000000000000000DB -:1026000000000000000000000000000000000000CA -:1026100000000000000000000000000000000000BA -:1026200000000000000000000000000000000000AA -:10263000000000000000000000000000000000009A -:10264000000000000000000000000000000000008A -:10265000000000000000000000000000000000007A -:10266000000000000000000000000000000000006A -:10267000000000000000000000000000000000005A -:10268000000000000000000000000000000000004A -:10269000000000000000000000000000000000003A -:1026A000000000000000000000000000000000002A -:1026B000000000000000000000000000000000001A -:1026C000000000000000000000000000000000000A -:1026D00000000000000000000000000000000000FA -:1026E00000000000000000000000000000000000EA -:1026F00000000000000000000000000000000000DA -:1027000000000000000000000000000000000000C9 -:1027100000000000000000000000000000000000B9 -:1027200000000000000000000000000000000000A9 -:102730000000000000000000000000000000000099 -:102740000000000000000000000000000000000089 -:102750000000000000000000000000000000000079 -:102760000000000000000000000000000000000069 -:102770000000000000000000000000000000000059 -:102780000000000000000000000000000000000049 -:102790000000000000000000000000000000000039 -:1027A0000000000000000000000000000000000029 -:1027B0000000000000000000000000000000000019 -:1027C0000000000000000000000000000000000009 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000000000000000000000000000E9 -:1027F00000000000000000000000000000000000D9 -:1028000000000000000000000000000000000000C8 -:1028100000000000000000000000000000000000B8 -:1028200000000000000000000000000000000000A8 -:102830000000000000000000000000000000000098 -:102840000000000000000000000000000000000088 -:102850000000000000000000000000000000000078 -:102860000000000000000000000000000000000068 -:102870000000000000000000000000000000000058 -:102880000000000000000000000000000000000048 -:102890000000000000000000000000000000000038 -:1028A0000000000000000000000000000000000028 -:1028B0000000000000000000000000000000000018 -:1028C0000000000000000000000000000000000008 -:1028D00000000000000000000000000000000000F8 -:1028E00000000000000000000000000000000000E8 -:1028F00000000000000000000000000000000000D8 -:1029000000000000000000000000000000000000C7 -:1029100000000000000000000000000000000000B7 -:1029200000000000000000000000000000000000A7 -:102930000000000000000000000000000000000097 -:102940000000000000000000000000000000000087 -:102950000000000000000000000000000000000077 -:102960000000000000000000000000000000000067 -:102970000000000000000000000000000000000057 -:102980000000000000000000000000000000000047 -:102990000000000000000000000000000000000037 -:1029A0000000000000000000000000000000000027 -:1029B0000000000000000000000000000000000017 -:1029C0000000000000000000000000000000000007 -:1029D00000000000000000000000000000000000F7 -:1029E00000000000000000000000000000000000E7 -:1029F00000000000000000000000000000000000D7 -:102A000000000000000000000000000000000000C6 -:102A100000000000000000000000000000000000B6 -:102A200000000000000000000000000000000000A6 -:102A30000000000000000000000000000000000096 -:102A40000000000000000000000000000000000086 -:102A50000000000000000000000000000000000076 -:102A60000000000000000000000000000000000066 -:102A70000000000000000000000000000000000056 -:102A80000000000000000000000000000000000046 -:102A90000000000000000000000000000000000036 -:102AA0000000000000000000000000000000000026 -:102AB0000000000000000000000000000000000016 -:102AC0000000000000000000000000000000000006 -:102AD00000000000000000000000000000000000F6 -:102AE00000000000000000000000000000000000E6 -:102AF00000000000000000000000000000000000D6 -:102B000000000000000000000000000000000000C5 -:102B100000000000000000000000000000000000B5 -:102B200000000000000000000000000000000000A5 -:102B30000000000000000000000000000000000095 -:102B40000000000000000000000000000000000085 -:102B50000000000000000000000000000000000075 -:102B60000000000000000000000000000000000065 -:102B70000000000000000000000000000000000055 -:102B80000000000000000000000000000000000045 -:102B90000000000000000000000000000000000035 -:102BA0000000000000000000000000000000000025 -:102BB0000000000000000000000000000000000015 -:102BC0000000000000000000000000000000000005 -:102BD00000000000000000000000000000000000F5 -:102BE00000000000000000000000000000000000E5 -:102BF00000000000000000000000000000000000D5 -:102C000000000000000000000000000000000000C4 -:102C100000000000000000000000000000000000B4 -:102C200000000000000000000000000000000000A4 -:102C30000000000000000000000000000000000094 -:102C40000000000000000000000000000000000084 -:102C50000000000000000000000000000000000074 -:102C60000000000000000000000000000000000064 -:102C70000000000000000000000000000000000054 -:102C80000000000000000000000000000000000044 -:102C90000000000000000000000000000000000034 -:102CA0000000000000000000000000000000000024 -:102CB0000000000000000000000000000000000014 -:102CC0000000000000000000000000000000000004 -:102CD00000000000000000000000000000000000F4 -:102CE00000000000000000000000000000000000E4 -:102CF00000000000000000000000000000000000D4 -:102D000000000000000000000000000000000000C3 -:102D100000000000000000000000000000000000B3 -:102D200000000000000000000000000000000000A3 -:102D30000000000000000000000000000000000093 -:102D40000000000000000000000000000000000083 -:102D50000000000000000000000000000000000073 -:102D60000000000000000000000000000000000063 -:102D70000000000000000000000000000000000053 -:102D80000000000000000000000000000000000043 -:102D90000000000000000000000000000000000033 -:102DA0000000000000000000000000000000000023 -:102DB0000000000000000000000000000000000013 -:102DC0000000000000000000000000000000000003 -:102DD00000000000000000000000000000000000F3 -:102DE00000000000000000000000000000000000E3 -:102DF00000000000000000000000000000000000D3 -:102E000000000000000000000000000000000000C2 -:102E100000000000000000000000000000000000B2 -:102E200000000000000000000000000000000000A2 -:102E30000000000000000000000000000000000092 -:102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 -:103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A -:10363000000000000000000000000000000000008A -:10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A -:10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA -:1036D00000000000000000000000000000000000EA -:1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000000000000CA -:1037000000000000000000000000000000000000B9 -:1037100000000000000000000000000000000000A9 -:103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 -:103740000000000000000000000000000000000079 -:103750000000000000000000000000000000000069 -:103760000000000000000000000000000000000059 -:103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 -:103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000000000000000000051 -:103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 -:103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 -:103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 -:103FF00000000000000000000000000000000000C1 -:1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 -:104870000000000000000000000000000000000038 -:104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 -:1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 -:104920000000000000000000000000000000000087 -:104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F -:1051A00000000000000000000000000000000000FF -:1051B00000000000000000000000000000000000EF -:1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF -:1051F00000000000000000000000000000000000AF -:10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E -:10524000000000000000000000000000000000005E -:10525000000000000000000000000000000000004E -:10526000000000000000000000000000000000003E -:10527000000000000000000000000000000000002E -:10528000000000000000000000000000000000001E -:10529000000000000000000000000000000000000E -:1052A00000000000000000000000000000000000FE -:1052B00000000000000000000000000000000000EE -:1052C00000000000000000000000000000000000DE -:1052D00000000000000000000000000000000000CE -:1052E00000000000000000000000000000000000BE -:1052F00000000000000000000000000000000000AE -:10530000000000000000000000000000000000009D -:10531000000000000000000000000000000000008D -:10532000000000000000000000000000000000007D -:10533000000000000000000000000000000000006D -:10534000000000000000000000000000000000005D -:10535000000000000000000000000000000000004D -:10536000000000000000000000000000000000003D -:10537000000000000000000000000000000000002D -:10538000000000000000000000000000000000001D -:10539000000000000000000000000000000000000D -:1053A00000000000000000000000000000000000FD -:1053B00000000000000000000000000000000000ED -:1053C00000000000000000000000000000000000DD -:1053D00000000000000000000000000000000000CD -:1053E00000000000000000000000000000000000BD -:1053F00000000000000000000000000000000000AD -:10540000000000000000000000000000000000009C -:10541000000000000000000000000000000000008C -:10542000000000000000000000000000000000007C -:10543000000000000000000000000000000000006C -:10544000000000000000000000000000000000005C -:10545000000000000000000000000000000000004C -:10546000000000000000000000000000000000003C -:10547000000000000000000000000000000000002C -:10548000000000000000000000000000000000001C -:10549000000000000000000000000000000000000C -:1054A00000000000000000000000000000000000FC -:1054B00000000000000000000000000000000000EC -:1054C00000000000000000000000000000000000DC -:1054D00000000000000000000000000000000000CC -:1054E00000000000000000000000000000000000BC -:1054F00000000000000000000000000000000000AC -:10550000000000000000000000000000000000009B -:10551000000000000000000000000000000000008B -:10552000000000000000000000000000000000007B -:10553000000000000000000000000000000000006B -:10554000000000000000000000000000000000005B -:10555000000000000000000000000000000000004B -:10556000000000000000000000000000000000003B -:10557000000000000000000000000000000000002B -:10558000000000000000000000000000000000001B -:10559000000000000000000000000000000000000B -:1055A00000000000000000000000000000000000FB -:1055B00000000000000000000000000000000000EB -:1055C00000000000000000000000000000000000DB -:1055D00000000000000000000000000000000000CB -:1055E00000000000000000000000000000000000BB -:1055F00000000000000000000000000000000000AB -:10560000000000000000000000000000000000009A -:10561000000000000000000000000000000000008A -:10562000000000000000000000000000000000007A -:10563000000000000000000000000000000000006A -:10564000000000000000000000000000000000005A -:10565000000000000000000000000000000000004A -:10566000000000000000000000000000000000003A -:10567000000000000000000000000000000000002A -:10568000000000000000000000000000000000001A -:10569000000000000000000000000000000000000A -:1056A00000000000000000000000000000000000FA -:1056B00000000000000000000000000000000000EA -:1056C00000000000000000000000000000000000DA -:1056D00000000000000000000000000000000000CA -:1056E00000000000000000000000000000000000BA -:1056F00000000000000000000000000000000000AA -:105700000000000000000000000000000000000099 -:105710000000000000000000000000000000000089 -:105720000000000000000000000000000000000079 -:105730000000000000000000000000000000000069 -:105740000000000000000000000000000000000059 -:105750000000000000000000000000000000000049 -:105760000000000000000000000000000000000039 -:105770000000000000000000000000000000000029 -:105780000000000000000000000000000000000019 -:105790000000000000000000000000000000000009 -:1057A00000000000000000000000000000000000F9 -:1057B00000000000000000000000000000000000E9 -:1057C00000000000000000000000000000000000D9 -:1057D00000000000000000000000000000000000C9 -:1057E00000000000000000000000000000000000B9 -:1057F00000000000000000000000000000000000A9 -:105800000000000000000000000000000000000098 -:105810000000000000000000000000000000000088 -:105820000000000000000000000000000000000078 -:105830000000000000000000000000000000000068 -:105840000000000000000000000000000000000058 -:105850000000000000000000000000000000000048 -:105860000000000000000000000000000000000038 -:105870000000000000000000000000000000000028 -:105880000000000000000000000000000000000018 -:105890000000000000000000000000000000000008 -:1058A00000000000000000000000000000000000F8 -:1058B00000000000000000000000000000000000E8 -:1058C00000000000000000000000000000000000D8 -:1058D00000000000000000000000000000000000C8 -:1058E00000000000000000000000000000000000B8 -:1058F00000000000000000000000000000000000A8 -:105900000000000000000000000000000000000097 -:105910000000000000000000000000000000000087 -:105920000000000000000000000000000000000077 -:105930000000000000000000000000000000000067 -:105940000000000000000000000000000000000057 -:105950000000000000000000000000000000000047 -:105960000000000000000000000000000000000037 -:105970000000000000000000000000000000000027 -:105980000000000000000000000000000000000017 -:105990000000000000000000000000000000000007 -:1059A00000000000000000000000000000000000F7 -:1059B00000000000000000000000000000000000E7 -:1059C00000000000000000000000000000000000D7 -:1059D00000000000000000000000000000000000C7 -:1059E00000000000000000000000000000000000B7 -:1059F00000000000000000000000000000000000A7 -:105A00000000000000000000000000000000000096 -:105A10000000000000000000000000000000000086 -:105A20000000000000000000000000000000000076 -:105A30000000000000000000000000000000000066 -:105A40000000000000000000000000000000000056 -:105A50000000000000000000000000000000000046 -:105A60000000000000000000000000000000000036 -:105A70000000000000000000000000000000000026 -:105A80000000000000000000000000000000000016 -:105A90000000000000000000000000000000000006 -:105AA00000000000000000000000000000000000F6 -:105AB00000000000000000000000000000000000E6 -:105AC00000000000000000000000000000000000D6 -:105AD00000000000000000000000000000000000C6 -:105AE00000000000000000000000000000000000B6 -:105AF00000000000000000000000000000000000A6 -:105B00000000000000000000000000000000000095 -:105B10000000000000000000000000000000000085 -:105B20000000000000000000000000000000000075 -:105B30000000000000000000000000000000000065 -:105B40000000000000000000000000000000000055 -:105B50000000000000000000000000000000000045 -:105B60000000000000000000000000000000000035 -:105B70000000000000000000000000000000000025 -:105B80000000000000000000000000000000000015 -:105B90000000000000000000000000000000000005 -:105BA00000000000000000000000000000000000F5 -:105BB00000000000000000000000000000000000E5 -:105BC00000000000000000000000000000000000D5 -:105BD00000000000000000000000000000000000C5 -:105BE00000000000000000000000000000000000B5 -:105BF00000000000000000000000000000000000A5 -:105C00000000000000000000000000000000000094 -:105C10000000000000000000000000000000000084 -:105C20000000000000000000000000000000000074 -:105C30000000000000000000000000000000000064 -:105C40000000000000000000000000000000000054 -:105C50000000000000000000000000000000000044 -:105C60000000000000000000000000000000000034 -:105C70000000000000000000000000000000000024 -:105C80000000000000000000000000000000000014 -:105C90000000000000000000000000000000000004 -:105CA00000000000000000000000000000000000F4 -:105CB00000000000000000000000000000000000E4 -:105CC00000000000000000000000000000000000D4 -:105CD00000000000000000000000000000000000C4 -:105CE00000000000000000000000000000000000B4 -:105CF00000000000000000000000000000000000A4 -:105D00000000000000000000000000000000000093 -:105D10000000000000000000000000000000000083 -:105D20000000000000000000000000000000000073 -:105D30000000000000000000000000000000000063 -:105D40000000000000000000000000000000000053 -:105D50000000000000000000000000000000000043 -:105D60000000000000000000000000000000000033 -:105D70000000000000000000000000000000000023 -:105D80000000000000000000000000000000000013 -:105D90000000000000000000000000000000000003 -:105DA00000000000000000000000000000000000F3 -:105DB00000000000000000000000000000000000E3 -:105DC00000000000000000000000000000000000D3 -:105DD00000000000000000000000000000000000C3 -:105DE00000000000000000000000000000000000B3 -:105DF00000000000000000000000000000000000A3 -:105E00000000000000000000000000000000000092 -:105E10000000000000000000000000000000000082 -:105E20000000000000000000000000000000000072 -:105E30000000000000000000000000000000000062 -:105E40000000000000000000000000000000000052 -:105E50000000000000000000000000000000000042 -:105E60000000000000000000000000000000000032 -:105E70000000000000000000000000000000000022 -:105E80000000000000000000000000000000000012 -:105E90000000000000000000000000000000000002 -:105EA00000000000000000000000000000000000F2 -:105EB00000000000000000000000000000000000E2 -:105EC00000000000000000000000000000000000D2 -:105ED00000000000000000000000000000000000C2 -:105EE00000000000000000000000000000000000B2 -:105EF00000000000000000000000000000000000A2 -:105F00000000000000000000000000000000000091 -:105F10000000000000000000000000000000000081 -:105F20000000000000000000000000000000000071 -:105F30000000000000000000000000000000000061 -:105F40000000000000000000000000000000000051 -:105F50000000000000000000000000000000000041 -:105F60000000000000000000000000000000000031 -:105F70000000000000000000000000000000000021 -:105F80000000000000000000000000000000000011 -:105F90000000000000000000000000000000000001 -:105FA00000000000000000000000000000000000F1 -:105FB00000000000000000000000000000000000E1 -:105FC00000000000000000000000000000000000D1 -:105FD00000000000000000000000000000000000C1 -:105FE00000000000000000000000000000000000B1 -:105FF00000000000000000000000000000000000A1 -:106000000000000000000000000000000000000090 -:106010000000000000000000000000000000000080 -:106020000000000000000000000000000000000070 -:106030000000000000000000000000000000000060 -:106040000000000000000000000000000000000050 -:106050000000000000000000000000000000000040 -:106060000000000000000000000000000000000030 -:106070000000000000000000000000000000000020 -:106080000000000000000000000000000000000010 -:106090000000000000000000000000000000000000 -:1060A00000000000000000000000000000000000F0 -:1060B00000000000000000000000000000000000E0 -:1060C00000000000000000000000000000000000D0 -:1060D00000000000000000000000000000000000C0 -:1060E00000000000000000000000000000000000B0 -:1060F00000000000000000000000000000000000A0 -:10610000000000000000000000000000000000008F -:10611000000000000000000000000000000000007F -:10612000000000000000000000000000000000006F -:10613000000000000000000000000000000000005F -:10614000000000000000000000000000000000004F -:10615000000000000000000000000000000000003F -:10616000000000000000000000000000000000002F -:10617000000000000000000000000000000000001F -:10618000000000000000000000000000000000000F -:1061900000000000000000000000000000000000FF -:1061A00000000000000000000000000000000000EF -:1061B00000000000000000000000000000000000DF -:1061C00000000000000000000000000000000000CF -:1061D00000000000000000000000000000000000BF -:1061E00000000000000000000000000000000000AF -:1061F000000000000000000000000000000000009F -:10620000000000000000000000000000000000008E -:10621000000000000000000000000000000000007E -:10622000000000000000000000000000000000006E -:10623000000000000000000000000000000000005E -:10624000000000000000000000000000000000004E -:10625000000000000000000000000000000000003E -:10626000000000000000000000000000000000002E -:10627000000000000000000000000000000000001E -:10628000000000000000000000000000000000000E -:1062900000000000000000000000000000000000FE -:1062A00000000000000000000000000000000000EE -:1062B00000000000000000000000000000000000DE -:1062C00000000000000000000000000000000000CE -:1062D00000000000000000000000000000000000BE -:1062E00000000000000000000000000000000000AE -:1062F000000000000000000000000000000000009E -:10630000000000000000000000000000000000008D -:10631000000000000000000000000000000000007D -:10632000000000000000000000000000000000006D -:10633000000000000000000000000000000000005D -:10634000000000000000000000000000000000004D -:10635000000000000000000000000000000000003D -:10636000000000000000000000000000000000002D -:10637000000000000000000000000000000000001D -:10638000000000000000000000000000000000000D -:1063900000000000000000000000000000000000FD -:1063A00000000000000000000000000000000000ED -:1063B00000000000000000000000000000000000DD -:1063C00000000000000000000000000000000000CD -:1063D00000000000000000000000000000000000BD -:1063E00000000000000000000000000000000000AD -:1063F000000000000000000000000000000000009D -:10640000000000000000000000000000000000008C -:10641000000000000000000000000000000000007C -:10642000000000000000000000000000000000006C -:10643000000000000000000000000000000000005C -:10644000000000000000000000000000000000004C -:10645000000000000000000000000000000000003C -:10646000000000000000000000000000000000002C -:10647000000000000000000000000000000000001C -:10648000000000000000000000000000000000000C -:1064900000000000000000000000000000000000FC -:1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC -:1064C00000000000000000000000000000000000CC -:1064D0000000000000000010004400000000001157 -:1064E00010044441111004440000000000000000AA -:1064F000000000000000000000000000000000009C -:10650000000000000000000000000000000000008B -:10651000000000000000000000000000000000007B -:106520000004000000000000000000000000000067 -:10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:10656000000000000000004040232048000200001E -:106570000000000000008000000800000000000A89 -:106580000000000000200008000000800951000009 -:1065900000000000000000000000000004000151A5 -:1065A00021580400D20900000022000022080C40FB -:1065B000011000000C4200000201004280000400B3 -:1065C000100840040090C000200482020012440021 -:1065D0000000004089200081248420088100000000 -:1065E00008100410008004004000004100000480F6 -:1065F000001200002EBC35E44000500408400A0898 -:10660000400100814020000004020280800000223E -:10661000180410000200400050080000080182EB3E -:10662000C8BCAC000B80100046100081000084083C -:10663000C099200014000800000000004140083408 -:10664000C40002106000000830081820018000001B -:1066500000414A62100050E83E10DD40B4000010D6 -:10666000001C0000009010020000300048000000F4 -:106670000010000000100000A0000000400000001A -:10668000000000000000000000002008209101052B -:106690000008410012C0001C175EC005020840013E -:1066A00060301042C0008A9000000200020060507A -:1066B000002000080400000000000000100000108E -:1066C000404000500820200090220000802A08024C -:1066D00080200002003BD13C400801600120000105 -:1066E000140200004000B090000018C00040922446 -:1066F00044841002000540A408D04008060002812E -:1067000000C8049000000840200000000232000889 -:1067100000001908350006000A92021A8CE00A0BE4 -:1067200041881082146C202000420FF482A00C00DB -:10673000903A000029020804009105220000E012AE -:1067400000C00000C0040010804480021400000B50 -:10675000920000000100800B040080004101100045 -:106760000B24002214040804204202210A0010080D -:106770000A800001721000004A000000040172A0AB -:106780002000284A4800100804403002004C0180D4 -:1067900082004102281044D2408A0012903A080A2E -:1067A00000124804389202CE00300000204F010051 -:1067B000A107010200681022003480808242500448 -:1067C00006240F409452DE5025B02484080A801815 -:1067D0002C1A000088C92A010000034834900001E7 -:1067E0002241400916001A0AAA0100042866001076 -:1067F00000008000188000080003014000240928E0 -:10680000029402005011840C0C0A01000000644044 -:1068100001490AF80827A259C07D432F828042010E -:10682000A4A00008002900008188A000071B0141E6 -:10683000D31197C054940201029480219034C6323F -:1068400041840C023218040120140201A10410003A -:1068500001000404180090000000088602C09104A2 -:106860001850130A80001080CDA04101032F84002E -:10687000C0C3400420004040FF000800000B00009F -:106880000000001954203101020820000000080017 -:1068900020800082610000100006340108D00A0048 -:1068A000148000008A00001B546580181801A3138F -:1068B000C8900D000262080612C69022000008006F -:1068C00094C0A0489001200401EC02505CC7570816 -:1068D000000A8802D44402003824C40322755849AF -:1068E0004003220250828310A10210AD81A6A0288D -:1068F00080C200260001010054207350113101AC08 -:1069000000A000A15800C4001232408400000CF224 -:1069100002EE32E02090C608148C0010E00CB08427 -:106920000B1800344010388A00242441C001AB0009 -:1069300032440EA00121C00404814005DC09235229 -:106940001B5049520804C4BD0251043076020A01AA -:106950001010000000003190012020314880411CBF -:1069600000020C008108D0000031082780002000C0 -:1069700000320A0981101800946208C1051011083C -:10698000004408060500002100002018040A020146 -:1069900000400040020540C52801100400000880A6 -:1069A000000202000080800042000022400002003D -:1069B00000024124801100200000A84890214200DC -:1069C0000204131304E21022004C0208D30014E066 -:1069D0001048082004480204C000001000200000F5 -:1069E0001180400800800080000C43D4002080000B -:1069F0008102014102801008000000000110000027 -:106A00000002C00000001830000000004001020039 -:106A100010008019F000190000803400010002808D -:106A200000240402202CE2000800A0C0182000046A -:106A30008004022000A00200330060C0000000407B -:106A40000000884000804008680010080080002096 -:106A500020000000010000090810070020001000BD -:106A60000000020800020201028040590020000AD2 -:106A700000028220401008004205D109440116009E -:106A800004400000000000802020002000000000E2 -:106A9000000800002CA00000280000010000904227 -:106AA00088840408E00408004804129028264A005C -:106AB000000000800010A00000002000050004007D -:106AC000080002000000C6000101040105001C20AE -:106AD000000002810080200000020004488151541F -:106AE0005A012001400820082808280080000000E2 -:106AF0000180800000808C21229B0C50040000400B -:106B000000225400000020C00808000100273C3784 -:106B1000858E147025DC03C0010200036013184841 -:106B200002001040000210001A200001018620EB34 -:106B3000A4B355036E8000012400A000250206289E -:106B400002338C99F73A21009773BF40E0920937DE -:106B5000C9FC1221240E88210E0083907D906208CA -:106B6000002C0014101D08E1CC006400006020B06F -:106B700020000880C402109808001B003E0000039B -:106B8000A160010106820C4040F004310013C141B4 -:106B9000400106000000000000000000001052004C -:106BA0000800A940000000000600010000001000DD -:106BB00000002000C420104004020000000100205A -:106BC00000000000E8048001052000000000080427 -:106BD0000000000000020242040000000400100057 -:106BE000000060000004000891028062021412108C -:106BF0000110800900040800200200400400400841 -:106C00000080220408000000182000220200004139 -:106C1000003008F801200820024040398220800618 -:106C20000390901010002021000D400680100000FD -:106C300001000820002001AB0020015A100830A1FB -:106C4000C204080860C0000C0A14208081021104EC -:106C500000428C000001185018002040001801026A -:106C600010000004100182008A0020008423041018 -:106C70000C287020043852000103061020408102C5 -:106C80003020818500102084632060802500001062 -:106C900010E101820E143041000E0C20C1070A10D1 -:106CA000208019460000084E70000038C20806080F -:106CB00031800000020420408506008800BEFF3BB2 -:106CC0007BC7FF13CC18FCEF020D435FC3D0203FFE -:106CD0004412224BB78007C4BE7D0D3780EFD3CD61 -:106CE000F4FFFF137F03030001000D5400088C0024 -:106CF00000000441511E5541616012100000000067 -:106D00000000000000100010040200C0000030006D -:106D10000000000000000000000000000000000073 -:106D20000000000000000000000000000000000063 -:106D30000000000000000000000000FFFC0000CF89 -:106D4000FFC0000CFFFC0000CFFFC0000CFFFC00E8 -:106D500000CFFFC0000CFFFC0000CFFFC0020C0002 -:106D6000000000000000000008000000000000001B -:106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D9000CFFFC0000CFFFC0000CFFFC0000CFFFCC9 -:106DA0000000CFFFC0020C00000000000000000047 -:106DB00008000000000000000000000000000000CB -:106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 -:106F50000000000000000000000000000000000031 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E -:1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D -:10740000000000000000000000000000000000007C -:10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C -:1074800000000000000000000000000000000000FC -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C -:10750000000000000000000000000000000000007B -:10751000000000000000000000000000000000006B -:10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB -:1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B -:10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A -:10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A -:10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A -:10767000000000000000000000000000000000000A -:1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA -:1076B00000000000000000000000000000000000CA -:1076C00000000000000000000000000000000000BA -:1076D00000000000000000000000000000000000AA -:1076E000000000000000000000000000000000009A -:1076F000000000000000000000000000000000008A -:107700000000000000000000000000000000000079 -:107710000000000000000000000000000000000069 -:107720000000000000000000000000000000000059 -:107730000000000000000000000000000000000049 -:107740000000000000000000000000000000000039 -:107750000000000000000000000000000000000029 -:107760000000000000000000000000000000000019 -:107770000000000000000000000000000000000009 -:1077800000000000000000000000000000000000F9 -:1077900000000000000000000000000000000000E9 -:1077A00000000000000000000000000000000000D9 -:1077B00000000000000000000000000000000000C9 -:1077C00000000000000000000000000000000000B9 -:1077D00000000000000000000000000000000000A9 -:1077E0000000000000000000000000000000000099 -:1077F0000000000000000000000000000000000089 -:107800000000000000000000000000000000000078 -:107810000000000000000000000000000000000068 -:107820000000000000000000000000000000000058 -:107830000000000000000000000000000000000048 -:107840000000000000000000000000000000000038 -:107850000000000000000000000000000000000028 -:107860000000000000000000000000000000000018 -:107870000000000000000000000000000000000008 -:1078800000000000000000000000000000000000F8 -:1078900000000000000000000000000000000000E8 -:1078A00000000000000000000000000000000000D8 -:1078B00000000000000000000000000000000000C8 -:1078C00000000000000000000000000000000000B8 -:1078D00000000000000000000000000000000000A8 -:1078E0000000000000000000000000000000000098 -:1078F0000000000000000000000000000000000088 -:107900000000000000000000000000000000000077 -:107910000000000000000000000000000000000067 -:107920000000000000000000000000000000000057 -:107930000000000000000000000000000000000047 -:107940000000000000000000000000000000000037 -:107950000000000000000000000000000000000027 -:107960000000000000000000000000000000000017 -:107970000000000000000000000000000000000007 -:1079800000000000000000000000000000000000F7 -:1079900000000000000000000000000000000000E7 -:1079A00000000000000000000000000000000000D7 -:1079B00000000000000000000000000000000000C7 -:1079C00000000000000000000000000000000000B7 -:1079D00000000000000000000000000000000000A7 -:1079E0000000000000000000000000000000000097 -:1079F0000000000000000000000000000000000087 -:107A00000000000000000000000000000000000076 -:107A10000000000000000000000000000000000066 -:107A20000000000000000000000000000000000056 -:107A30000000000000000000000000000000000046 -:107A40000000000000000000000000000000000036 -:107A50000000000000000000000000000000000026 -:107A60000000000000000000000000000000000016 -:107A70000000000000000000000000000000000006 -:107A800000000000000000000000000000000000F6 -:107A900000000000000000000000000000000000E6 -:107AA00000000000000000000000000000000000D6 -:107AB00000000000000000000000000000000000C6 -:107AC00000000000000000000000000000000000B6 -:107AD00000000000000000000000000000000000A6 -:107AE0000000000000000000000000000000000096 -:107AF0000000000000000000000000000000000086 -:107B00000000000000000000000000000000000075 -:107B10000000000000000000000000000000000065 -:107B20000000000000000000000000000000000055 -:107B30000000000000000000000000000000000045 -:107B40000000000000000000000000000000000035 -:107B50000000000000000000000000000000000025 -:107B60000000000000000000000000000000000015 -:107B70000000000000000000000000000000000005 -:107B800000000000000000000000000000000000F5 -:107B900000000000000000000000000000000000E5 -:107BA00000000000000000000000000000000000D5 -:107BB00000000000000000000000000000000000C5 -:107BC00000000000000000000000000000000000B5 -:107BD00000000000000000000000000000000000A5 -:107BE0000000000000000000000000000000000095 -:107BF0000000000000000000000000000000000085 -:107C00000000000000000000000000000000000074 -:107C10000000000000000000000000000000000064 -:107C20000000000000000000000000000000000054 -:107C30000000000000000000000000000000000044 -:107C40000000000000000000000000000000000034 -:107C50000000000000000000000000000000000024 -:107C60000000000000000000000000000000000014 -:107C70000000000000000000000000000000000004 -:107C800000000000000000000000000000000000F4 -:107C900000000000000000000000000000000000E4 -:107CA00000000000000000000000000000000000D4 -:107CB00000000000000000000000000000000000C4 -:107CC00000000000000000000000000000000000B4 -:107CD00000000000000000000000000000000000A4 -:107CE0000000000000000000000000000000000094 -:107CF0000000000000000000000000000000000084 -:107D00000000000000000000000000000000000073 -:107D10000000000000000000000000000000000063 -:107D20000000000000000000000000000000000053 -:107D30000000000000000000000000000000000043 -:107D40000000000000000000000000000000000033 -:107D50000000000000000000000000000000000023 -:107D60000000000000000000000000000000000013 -:107D70000000000000000000000000000000000003 -:107D800000000000000000000000000000000000F3 -:107D900000000000000000000000000000000000E3 -:107DA00000000000000000000000000000000000D3 -:107DB00000000000000000000000000000000000C3 -:107DC00000000000000000000000000000000000B3 -:107DD00000000000000000000000000000000000A3 -:107DE0000000000000000000000000000000000093 -:107DF0000000000000000000000000000000000083 -:107E00000000000000000000000000000000000072 -:107E10000000000000000000000000000000000062 -:107E20000000000000000000000000000000000052 -:107E30000000000000000000000000000000000042 -:107E40000000000000000000000000000000000032 -:107E50000000000000000000000000000000000022 -:107E60000000000000000000000000000000000012 -:107E70000000000000000000000000000000000002 -:107E800000000000000000000000000000000000F2 -:107E900000000000000000000000000000000000E2 -:107EA00000000000000000000000000000000000D2 -:107EB00000000000000000000000000000000000C2 -:107EC00000000000000000000000000000000000B2 -:107ED00000000000000000000000000000000000A2 -:107EE0000000000000000000000000000000000092 -:107EF0000000000000000000000000000000000082 -:107F00000000000000000000000000000000000071 -:107F10000000000000000000000000000000000061 -:107F20000000000000000000000000000000000051 -:107F30000000000000000000000000000000000041 -:107F40000000000000000000000000000000000031 -:107F50000000000000000000000000000000000021 -:107F60000000000000000000000000000000000011 -:107F70000000000000000000000000000000000001 -:107F800000000000000000000000000000000000F1 -:107F900000000000000000000000000000000000E1 -:107FA00000000000000000000000000000000000D1 -:107FB00000000000000000000000000000000000C1 -:107FC00000000000000000000000000000000000B1 -:107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000000091 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 -:108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:108050000000000000000000000000000000000020 -:108060000000000000000000000000000000000010 -:108070000000000000000000000000000000000000 -:1080800000000000000000000000000000000000F0 -:1080900000000000000000000000000000000000E0 -:1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000000000000000000090 -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000000000000EF -:1081900000000000000000000000000000000000DF -:1081A00000000000000000000000000000000000CF -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F -:10820000000000000000000000000000000000006E -:10821000000000000000000000000000000000005E -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:10826000000000000000000000000000000000000E -:1082700000000000000000000000000000000000FE -:1082800000000000000000000000000000000000EE -:1082900000000000000000000000000000000000DE -:1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C00000000000000000000000000000000000AE -:1082D000000000000000000000000000000000009E -:1082E000000000000000000000000000000000008E -:1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:10831000000000000000000000000000000000005D -:10832000000000000000000000000000000000004D -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D -:1083700000000000000000000000000000000000FD -:1083800000000000000000000000000000000000ED -:1083900000000000000000000000000000000000DD -:1083A00000000000000000000000000000000000CD -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D -:1083E000000000000000000000000000000000008D -:1083F000000000000000000000000000000000007D -:10840000000000000000000000000000000000006C -:10841000000000000000000000000000000000005C -:10842000000000000000000000000000000000004C -:10843000000000000000000000000000000000003C -:10844000000000000000000000000000000000002C -:10845000000000000000000000000000000000001C -:10846000000000000000000000000000000000000C -:1084700000000000000000000000000000000000FC -:1084800000000000000000000000000000000000EC -:1084900000000000000000000000000000000000DC -:1084A00000000000000000000000000000000000CC -:1084B00000000000000000000000000000000000BC -:1084C00000000000000000000000000000000000AC -:1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C -:1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B -:10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000000FB -:1085800000000000000000000000000000000000EB -:1085900000000000000000000000000000000000DB -:1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B -:10860000000000000000000000000000000000006A -:10861000000000000000000000000000000000005A -:10862000000000000000000000000000000000004A -:10863000000000000000000000000000000000003A -:10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A -:1086700000000000000000000000000000000000FA -:1086800000000000000000000000000000000000EA -:1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A -:1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000000069 -:108710000000000000000000000000000000000059 -:108720000000000000000000000000000000000049 -:108730000000000000000000000000000000000039 -:108740000000000000000000000000000000000029 -:108750000000000000000000000000000000000019 -:108760000000000000000000000000000000000009 -:1087700000000000000000000000000000000000F9 -:1087800000000000000000000000000000000000E9 -:1087900000000000000000000000000000000000D9 -:1087A00000000000000000000000000000000000C9 -:1087B00000000000000000000000000000000000B9 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000000000000089 -:1087F0000000000000000000000000000000000079 -:108800000000000000000000000000000000000068 -:108810000000000000000000000000000000000058 -:108820000000000000000000000000000000000048 -:108830000000000000000000000000000000000038 -:108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000000000E8 -:1088900000000000000000000000000000000000D8 -:1088A00000000000000000000000000000000000C8 -:1088B00000000000000000000000000000000000B8 -:1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000000000000000000098 -:1088E0000000000000000000000000000000000088 -:1088F0000000000000000000000000000000000078 -:108900000000000000000000000000000000000067 -:108910000000000000000000000000000000000057 -:108920000000000000000000000000000000000047 -:108930000000000000000000000000000000000037 -:108940000000000000000000000000000000000027 -:108950000000000000000000000000000000000017 -:108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000000F7 -:1089800000000000000000000000000000000000E7 -:1089900000000000000000000000000000000000D7 -:1089A00000000000000000000000000000000000C7 -:1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000000097 -:1089E0000000000000000000000000000000000087 -:1089F0000000000000000000000000000000000077 -:108A00000000000000000000000000000000000066 -:108A10000000000000000000000000000000000056 -:108A20000000000000000000000000000000000046 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 -:108A700000000000000000000000000000000000F6 -:108A800000000000000000000000000000000000E6 -:108A900000000000000000000000000000000000D6 -:108AA00000000000000000000000000000000000C6 -:108AB00000000000000000000000000000000000B6 -:108AC00000000000000000000000000000000000A6 -:108AD0000000000000000000000000000000000096 -:108AE0000000000000000000000000000000000086 -:108AF0000000000000000000000000000000000076 -:108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B20000000000000000000000000000000000045 -:108B30000000000000000000000000000000000035 -:108B40000000000000000000000000000000000025 -:108B50000000000000000000000000000000000015 -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B800000000000000000000000000000000000E5 -:108B900000000000000000000000000000000000D5 -:108BA00000000000000000000000000000000000C5 -:108BB00000000000000000000000000000000000B5 -:108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000000000000000075 -:108C00000000000000000000000000000000000064 -:108C10000000000000000000000000000000000054 -:108C20000000000000000000000000000000000044 -:108C30000000000000000000000000000000000034 -:108C40000000000000000000000000000000000024 -:108C50000000000000000000000000000000000014 -:108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 -:108CC00000000000000000000000000000000000A4 -:108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 -:108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000000000053 -:108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000000E3 -:108D900000000000000000000000000000000000D3 -:108DA00000000000000000000000000000000000C3 -:108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE0000000000000000000000000000000000083 -:108DF0000000000000000000000000000000000073 -:108E00000000000000000000000000000000000062 -:108E10000000000000000000000000000000000052 -:108E20000000000000000000000000000000000042 -:108E30000000000000000000000000000000000032 -:108E40000000000000000000000000000000000022 -:108E50000000000000000000000000000000000012 -:108E60000000000000000000000000000000000002 -:108E700000000000000000000000000000000000F2 -:108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 -:108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F900000000000000000000000000000000000D1 -:108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 -:108FF0000000000000000000000000000000000071 -:109000000000000000000000000000000000000060 -:109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 -:109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D0000000000000000000000000000000000090 -:1090E0000000000000000000000000000000000080 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:10911000000000000000000000000000000000004F -:10912000000000000000000000000000000000003F -:10913000000000000000000000000000000000002F -:10914000000000000000000000000000000000001F -:10915000000000000000000000000000000000000F -:1091600000000000000000000000000000000000FF -:1091700000000000000000000000000000000000EF -:1091800000000000000000000000000000000000DF -:1091900000000000000000000000000000000000CF -:1091A00000000000000000000000000000000000BF -:1091B00000000000000000000000000000000000AF -:1091C000000000000000000000000000000000009F -:1091D000000000000000000000000000000000008F -:1091E000000000000000000000000000000000007F -:1091F000000000000000000000000000000000006F -:10920000000000000000000000000000000000005E -:10921000000000000000000000000000000000004E -:10922000000000000000000000000000000000003E -:10923000000000000000000000000000000000002E -:10924000000000000000000000000000000000001E -:10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E -:1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD -:1093C000000000000000000000000000000000009D -:1093D000000000000000000000000000000000008D -:1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C -:10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C -:10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C -:1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000000000003B -:10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB -:1095C000000000000000000000000000000000009B -:1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A -:10963000000000000000000000000000000000002A -:10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A -:1096D000000000000000000000000000000000008A -:1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000000000000B9 -:1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 -:109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000000000098 -:1098D0000000000000000000000000000000000088 -:1098E0000000000000000000000000000000000078 -:1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 -:109940000000000000000000000000000000000017 -:109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 -:1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 -:1099B00000000000000000000000000000000000A7 -:1099C0000000000000000000000000000000000097 -:1099D0000000000000000000000000000000000087 -:1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 -:109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000036 -:109A30000000000000000000000000000000000026 -:109A40000000000000000000000000000000000016 -:109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000000B6 -:109AB00000000000000000000000000000000000A6 -:109AC0000000000000000000000000000000000096 -:109AD0000000000000000000000000000000000086 -:109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000000066 -:109B00000000000000000000000000000000000055 -:109B10000000000000000000000000000000000045 -:109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B40000000000000000000000000000000000015 -:109B50000000000000000000000000000000000005 -:109B600000000000000000000000000000000000F5 -:109B700000000000000000000000000000000000E5 -:109B800000000000000000000000000000000000D5 -:109B900000000000000000000000000000000000C5 -:109BA00000000000000000000000000000000000B5 -:109BB00000000000000000000000000000000000A5 -:109BC0000000000000000000000000000000000095 -:109BD0000000000000000000000000000000000085 -:109BE0000000000000000000000000000000000075 -:109BF0000000000000000000000000000000000065 -:109C00000000000000000000000000000000000054 -:109C10000000000000000000000000000000000044 -:109C20000000000000000000000000000000000034 -:109C30000000000000000000000000000000000024 -:109C40000000000000000000000000000000000014 -:109C50000000000000000000000000000000000004 -:109C600000000000000000000000000000000000F4 -:109C700000000000000000000000000000000000E4 -:109C800000000000000000000000000000000000D4 -:109C900000000000000000000000000000000000C4 -:109CA00000000000000000000000000000000000B4 -:109CB00000000000000000000000000000000000A4 -:109CC0000000000000000000000000000000000094 -:109CD0000000000000000000000000000000000084 -:109CE0000000000000000000000000000000000074 -:109CF0000000000000000000000000000000000064 -:109D00000000000000000000000000000000000053 -:109D10000000000000000000000000000000000043 -:109D20000000000000000000000000000000000033 -:109D30000000000000000000000000000000000023 -:109D40000000000000000000000000000000000013 -:109D50000000000000000000000000000000000003 -:109D600000000000000000000000000000000000F3 -:109D700000000000000000000000000000000000E3 -:109D800000000000000000000000000000000000D3 -:109D900000000000000000000000000000000000C3 -:109DA00000000000000000000000000000000000B3 -:109DB00000000000000000000000000000000000A3 -:109DC0000000000000000000000000000000000093 -:109DD0000000000000000000000000000000000083 -:109DE0000000000000000000000000000000000073 -:109DF0000000000000000000000000000000000063 -:109E00000000000000000000000000000000000052 -:109E10000000000000000000000000000000000042 -:109E20000000000000000000000000000000000032 -:109E30000000000000000000000000000000000022 -:109E40000000000000000000000000000000000012 -:109E50000000000000000000000000000000000002 -:109E600000000000000000000000000000000000F2 -:109E700000000000000000000000000000000000E2 -:109E800000000000000000000000000000000000D2 -:109E900000000000000000000000000000000000C2 -:109EA00000000000000000000000000000000000B2 -:109EB00000000000000000000000000000000000A2 -:109EC0000000000000000000000000000000000092 -:109ED0000000000000000000000000000000000082 -:109EE0000000000000000000000000000000000072 -:109EF0000000000000000000000000000000000062 -:109F00000000000000000000000000000000000051 -:109F10000000000000000000000000000000000041 -:109F20000000000000000000000000000000000031 -:109F30000000000000000000000000000000000021 -:109F40000000000000000000000000000000000011 -:109F50000000000000000000000000000000000001 -:109F600000000000000000000000000000000000F1 -:109F700000000000000000000000000000000000E1 -:109F800000000000000000000000000000000000D1 -:109F900000000000000000000000000000000000C1 -:109FA00000000000000000000000000000000000B1 -:109FB00000000000000000000000000000000000A1 -:109FC0000000000000000000000000000000000091 -:109FD0000000000000000000000000000000000081 -:109FE0000000000000000000000000000000000071 -:109FF0000000000000000000000000000000000061 -:10A000000000000000000000000000000000000050 -:10A010000000000000000000000000000000000040 -:10A020000000000000000000000000000000000030 -:10A030000000000000000000000000000000000020 -:10A040000000000000000000000000000000000010 -:10A050000000000000000000000000000000000000 -:10A0600000000000000000000000000000000000F0 -:10A0700000000000000000000000000000000000E0 -:10A0800000000000000000000000000000000000D0 -:10A0900000000000000000000000000000000000C0 -:10A0A00000000000000000000000000000000000B0 -:10A0B00000000000000000000000000000000000A0 -:10A0C0000000000000000000000000000000000090 -:10A0D0000000000000000000000000000000000080 -:10A0E0000000000000000000000000000000000070 -:10A0F0000000000000000000000000000000000060 -:10A10000000000000000000000000000000000004F -:10A11000000000000000000000000000000000003F -:10A12000000000000000000000000000000000002F -:10A13000000000000000000000000000000000001F -:10A14000000000000000000000000000000000000F -:10A1500000000000000000000000000000000000FF -:10A1600000000000000000000000000000000000EF -:10A1700000000000000000000000000000000000DF -:10A1800000000000000000000000000000000000CF -:10A1900000000000000000000000000000000000BF -:10A1A00000000000000000000000000000000000AF -:10A1B000000000000000000000000000000000009F -:10A1C000000000000000000000000000000000008F -:10A1D000000000000000000000000000000000007F -:10A1E000000000000000000000000000000000006F -:10A1F000000000000000000000000000000000005F -:10A20000000000000000000000000000000000004E -:10A21000000000000000000000000000000000003E -:10A22000000000000000000000000000000000002E -:10A23000000000000000000000000000000000001E -:10A24000000000000000000000000000000000000E -:10A2500000000000000000000000000000000000FE -:10A2600000000000000000000000000000000000EE -:10A2700000000000000000000000000000000000DE -:10A2800000000000000000000000000000000000CE -:10A2900000000000000000000000000000000000BE -:10A2A00000000000000000000000000000000000AE -:10A2B000000000000000000000000000000000009E -:10A2C000000000000000000000000000000000008E -:10A2D000000000000000000000000000000000007E -:10A2E000000000000000000000000000000000006E -:10A2F000000000000000000000000000000000005E -:10A30000000000000000000000000000000000004D -:10A31000000000000000000000000000000000003D -:10A32000000000000000000000000000000000002D -:10A33000000000000000000000000000000000001D -:10A34000000000000000000000000000000000000D -:10A3500000000000000000000000000000000000FD -:10A3600000000000000000000000000000000000ED -:10A3700000000000000000000000000000000000DD -:10A3800000000000000000000000000000000000CD -:10A3900000000000000000000000000000000000BD -:10A3A00000000000000000000000000000000000AD -:10A3B000000000000000000000000000000000009D -:10A3C000000000000000000000000000000000008D -:10A3D000000000000000000000000000000000007D -:10A3E000000000000000000000000000000000006D -:10A3F000000000000000000000000000000000005D -:10A40000000000000000000000000000000000004C -:10A41000000000000000000000000000000000003C -:10A42000000000000000000000000000000000002C -:10A43000000000000000000000000000000000001C -:10A44000000000000000000000000000000000000C -:10A4500000000000000000000000000000000000FC -:10A4600000000000000000000000000000000000EC -:10A4700000000000000000000000000000000000DC -:10A4800000000000000000000000000000000000CC -:10A4900000000000000000000000000000000000BC -:10A4A00000000000000000000000000000000000AC -:10A4B000000000000000000000000000000000009C -:10A4C000000000000000000000000000000000008C -:10A4D000000000000000000000000000000000007C -:10A4E000000000000000000000000000000000006C -:10A4F000000000000000000000000000000000005C -:10A50000000000000000000000000000000000004B -:10A51000000000000000000000000000000000003B -:10A52000000000000000000000000000000000002B -:10A53000000000000000000000000000000000001B -:10A54000000000000000000000000000000000000B -:10A5500000000000000000000000000000000000FB -:10A5600000000000000000000000000000000000EB -:10A5700000000000000000000000000000000000DB -:10A5800000000000000000000000000000000000CB -:10A5900000000000000000000000000000000000BB -:10A5A00000000000000000000000000000000000AB -:10A5B000000000000000000000000000000000009B -:10A5C000000000000000000000000000000000008B -:10A5D000000000000000000000000000000000007B -:10A5E000000000000000000000000000000000006B -:10A5F000000000000000000000000000000000005B -:10A60000000000000000000000000000000000004A -:10A61000000000000000000000000000000000003A -:10A62000000000000000000000000000000000002A -:10A63000000000000000000000000000000000001A -:10A64000000000000000000000000000000000000A -:10A6500000000000000000000000000000000000FA -:10A6600000000000000000000000000000000000EA -:10A6700000000000000000000000000000000000DA -:10A6800000000000000000000000000000000000CA -:10A6900000000000000000000000000000000000BA -:10A6A00000000000000000000000000000000000AA -:10A6B000000000000000000000000000000000009A -:10A6C000000000000000000000000000000000008A -:10A6D000000000000000000000000000000000007A -:10A6E000000000000000000000000000000000006A -:10A6F000000000000000000000000000000000005A -:10A700000000000000000000000000000000000049 -:10A710000000000000000000000000000000000039 -:10A720000000000000000000000000000000000029 -:10A730000000000000000000000000000000000019 -:10A740000000000000000000000000000000000009 -:10A7500000000000000000000000000000000000F9 -:10A7600000000000000000000000000000000000E9 -:10A7700000000000000000000000000000000000D9 -:10A7800000000000000000000000000000000000C9 -:10A7900000000000000000000000000000000000B9 -:10A7A00000000000000000000000000000000000A9 -:10A7B0000000000000000000000000000000000099 -:10A7C0000000000000000000000000000000000089 -:10A7D0000000000000000000000000000000000079 -:10A7E0000000000000000000000000000000000069 -:10A7F0000000000000000000000000000000000059 -:10A800000000000000000000000000000000000048 -:10A810000000000000000000000000000000000038 -:10A820000000000000000000000000000000000028 -:10A830000000000000000000000000000000000018 -:10A840000000000000000000000000000000000008 -:10A8500000000000000000000000000000000000F8 -:10A8600000000000000000000000000000000000E8 -:10A8700000000000000000000000000000000000D8 -:10A8800000000000000000000000000000000000C8 -:10A8900000000000000000000000000000000000B8 -:10A8A00000000000000000000000000000000000A8 -:10A8B0000000000000000000000000000000000098 -:10A8C0000000000000000000000000000000000088 -:10A8D0000000000000000000000000000000000078 -:10A8E0000000000000000000000000000000000068 -:10A8F0000000000000000000000000000000000058 -:10A900000000000000000000000000000000000047 -:10A910000000000000000000000000000000000037 -:10A920000000000000000000000000000000000027 -:10A930000000000000000000000000000000000017 -:10A940000000000000000000000000000000000007 -:10A9500000000000000000000000000000000000F7 -:10A9600000000000000000000000000000000000E7 -:10A9700000000000000000000000000000000000D7 -:10A9800000000000000000000000000000000000C7 -:10A9900000000000000000000000000000000000B7 -:10A9A00000000000000000000000000000000000A7 -:10A9B0000000000000000000000000000000000097 -:10A9C0000000000000000000000000000000000087 -:10A9D0000000000000000000000000000000000077 -:10A9E0000000000000000000000000000000000067 -:10A9F0000000000000000000000000000000000057 -:10AA00000000000000000000000000000000000046 -:10AA10000000000000000000000000000000000036 -:10AA20000000000000000000000000000000000026 -:10AA30000000000000000000000000000000000016 -:10AA40000000000000000000000000000000000006 -:10AA500000000000000000000000000000000000F6 -:10AA600000000000000000000000000000000000E6 -:10AA700000000000000000000000000000000000D6 -:10AA800000000000000000000000000000000000C6 -:10AA900000000000000000000000000000000000B6 -:10AAA00000000000000000000000000000000000A6 -:10AAB0000000000000000000000000000000000096 -:10AAC0000000000000000000000000000000000086 -:10AAD0000000000000000000000000000000000076 -:10AAE0000000000000000000000000000000000066 -:10AAF0000000000000000000000000000000000056 -:10AB00000000000000000000000000000000000045 -:10AB10000000000000000000000000000000000035 -:10AB20000000000000000000000000000000000025 -:10AB30000000000000000000000000000000000015 -:10AB40000000000000000000000000000000000005 -:10AB500000000000000000000000000000000000F5 -:10AB600000000000000000000000000000000000E5 -:10AB700000000000000000000000000000000000D5 -:10AB800000000000000000000000000000000000C5 -:10AB900000000000000000000000000000000000B5 -:10ABA00000000000000000000000000000000000A5 -:10ABB0000000000000000000000000000000000095 -:10ABC0000000000000000000000000000000000085 -:10ABD0000000000000000000000000000000000075 -:10ABE0000000000000000000000000000000000065 -:10ABF0000000000000000000000000000000000055 -:10AC00000000000000000000000000000000000044 -:10AC10000000000000000000000000000000000034 -:10AC20000000000000000000000000000000000024 -:10AC30000000000000000000000000000000000014 -:10AC40000000000000000000000000000000000004 -:10AC500000000000000000000000000000000000F4 -:10AC600000000000000000000000000000000000E4 -:10AC700000000000000000000000000000000000D4 -:10AC800000000000000000000000000000000000C4 -:10AC900000000000000000000000000000000000B4 -:10ACA00000000000000000000000000000000000A4 -:10ACB0000000000000000000000000000000000094 -:10ACC0000000000000000000000000000000000084 -:10ACD0000000000000000000000000000000000074 -:10ACE0000000000000000000000000000000000064 -:10ACF0000000000000000000000000000000000054 -:10AD00000000000000000000000000000000000043 -:10AD10000000000000000000000000000000000033 -:10AD20000000000000000000000000000000000023 -:10AD30000000000000000000000000000000000013 -:10AD40000000000000000000000000000000000003 -:10AD500000000000000000000000000000000000F3 -:10AD600000000000000000000000000000000000E3 -:10AD700000000000000000000000000000000000D3 -:10AD800000000000000000000000000000000000C3 -:10AD900000000000000000000000000000000000B3 -:10ADA00000000000000000000000000000000000A3 -:10ADB0000000000000000000000000000000000093 -:10ADC0000000000000000000000000000000000083 -:10ADD0000000000000000000000000000000000073 -:10ADE0000000000000000000000000000000000063 -:10ADF0000000000000000000000000000000000053 -:10AE00000000000000000000000000000000000042 -:10AE10000000000000000000000000000000000032 -:10AE20000000000000000000000000000000000022 -:10AE30000000000000000000000000000000000012 -:10AE40000000000000000000000000000000000002 -:10AE500000000000000000000000000000000000F2 -:10AE600000000000000000000000000000000000E2 -:10AE700000000000000000000000000000000000D2 -:10AE800000000000000000000000000000000000C2 -:10AE900000000000000000000000000000000000B2 -:10AEA00000000000000000000000000000000000A2 -:10AEB0000000000000000000000000000000000092 -:10AEC0000000000000000000000000000000000082 -:10AED0000000000000000000000000000000000072 -:10AEE0000000000000000000000000000000000062 -:10AEF0000000000000000000000000000000000052 -:10AF00000000000000000000000000000000000041 -:10AF10000000000000000000000000000000000031 -:10AF20000000000000000000000000000000000021 -:10AF30000000000000000000000000000000000011 -:10AF40000000000000000000000000000000000001 -:10AF500000000000000000000000000000000000F1 -:10AF600000000000000000000000000000000000E1 -:10AF700000000000000000000000000000000000D1 -:10AF800000000000000000000000000000000000C1 -:10AF900000000000000000000000000000000000B1 -:10AFA00000000000000000000000000000000000A1 -:10AFB0000000000000000000000000000000000091 -:10AFC0000000000000000000000000000000000081 -:10AFD0000000000000000000000000000000000071 -:10AFE0000000000000000000000000000000000061 -:10AFF0000000000000000000000000000000000051 -:10B000000000000000000000000000000000000040 -:10B010000000000000000000000000000000000030 -:10B020000000000000000000000000000000000020 -:10B030000000000000000000000000000000000010 -:10B040000000000000000000000000000000000000 -:10B0500000000000000000000000000000000000F0 -:10B0600000000000000000000000000000000000E0 -:10B0700000000000000000000000000000000000D0 -:10B0800000000000000000000000000000000000C0 -:10B0900000000000000000000000000000000000B0 -:10B0A00000000000000000000000000000000000A0 -:10B0B0000000000000000000000000000000000090 -:10B0C0000000000000000000000000000000000080 -:10B0D0000000000000000000000000000000000070 -:10B0E0000000000000000000000000000000000060 -:10B0F0000000000000000000000000000000000050 -:10B10000000000000000000000000000000000003F -:10B11000000000000000000000000000000000002F -:10B12000000000000000000000000000000000001F -:10B13000000000000000000000000000000000000F -:10B1400000000000000000000000000000000000FF -:10B1500000000000000000000000000000000000EF -:10B1600000000000000000000000000000000000DF -:10B1700000000000000000000000000000000000CF -:10B1800000000000000000000000000000000000BF -:10B1900000000000000000000000000000000000AF -:10B1A000000000000000000000000000000000009F -:10B1B000000000000000000000000000000000008F -:10B1C000000000000000000000000000000000007F -:10B1D000000000000000000000000000000000006F -:10B1E000000000000000000000000000000000005F -:10B1F000000000000000000000000000000000004F -:10B20000000000000000000000000000000000003E -:10B21000000000000000000000000000000000002E -:10B22000000000000000000000000000000000001E -:10B23000000000000000000000000000000000000E -:10B2400000000000000000000000000000000000FE -:10B2500000000000000000000000000000000000EE -:10B2600000000000000000000000000000000000DE -:10B2700000000000000000000000000000000000CE -:10B2800000000000000000000000000000000000BE -:10B2900000000000000000000000000000000000AE -:10B2A000000000000000000000000000000000009E -:10B2B000000000000000000000000000000000008E -:10B2C000000000000000000000000000000000007E -:10B2D000000000000000000000000000000000006E -:10B2E000000000000000000000000000000000005E -:10B2F000000000000000000000000000000000004E -:10B30000000000000000000000000000000000003D -:10B31000000000000000000000000000000000002D -:10B32000000000000000000000000000000000001D -:10B33000000000000000000000000000000000000D -:10B3400000000000000000000000000000000000FD -:10B3500000000000000000000000000000000000ED -:10B3600000000000000000000000000000000000DD -:10B3700000000000000000000000000000000000CD -:10B3800000000000000000000000000000000000BD -:10B3900000000000000000000000000000000000AD -:10B3A000000000000000000000000000000000009D -:10B3B000000000000000000000000000000000008D -:10B3C000000000000000000000000000000000007D -:10B3D000000000000000000000000000000000006D -:10B3E000000000000000000000000000000000005D -:10B3F000000000000000000000000000000000004D -:10B40000000000000000000000000000000000003C -:10B41000000000000000000000000000000000002C -:10B42000000000000000000000000000000000001C -:10B43000000000000000000000000000000000000C -:10B4400000000000000000000000000000000000FC -:10B4500000000000000000000000000000000000EC -:10B4600000000000000000000000000000000000DC -:10B4700000000000000000000000000000000000CC -:10B4800000000000000000000000000000000000BC -:10B4900000000000000000000000000000000000AC -:10B4A000000000000000000000000000000000009C -:10B4B000000000000000000000000000000000008C -:10B4C000000000000000000000000000000000007C -:10B4D000000000000000000000000000000000006C -:10B4E000000000000000000000000000000000005C -:10B4F000000000000000000000000000000000004C -:10B50000000000000000000000000000000000003B -:10B51000000000000000000000000000000000002B -:10B52000000000000000000000000000000000001B -:10B53000000000000000000000000000000000000B -:10B5400000000000000000000000000000000000FB -:10B5500000000000000000000000000000000000EB -:10B5600000000000000000000000000000000000DB -:10B5700000000000000000000000000000000000CB -:10B5800000000000000000000000000000000000BB -:10B5900000000000000000000000000000000000AB -:10B5A000000000000000000000000000000000009B -:10B5B000000000000000000000000000000000008B -:10B5C000000000000000000000000000000000007B -:10B5D000000000000000000000000000000000006B -:10B5E000000000000000000000000000000000005B -:10B5F000000000000000000000000000000000004B -:10B60000000000000000000000000000000000003A -:10B61000000000000000000000000000000000002A -:10B62000000000000000000000000000000000001A -:10B63000000000000000000000000000000000000A -:10B6400000000000000000000000000000000000FA -:10B6500000000000000000000000000000000000EA -:10B6600000000000000000000000000000000000DA -:10B6700000000000000000000000000000000000CA -:10B6800000000000000000000000000000000000BA -:10B6900000000000000000000000000000000000AA -:10B6A000000000000000000000000000000000009A -:10B6B000000000000000000000000000000000008A -:10B6C000000000000000000000000000000000007A -:10B6D000000000000000000000000000000000006A -:10B6E000000000000000000000000000000000005A -:10B6F000000000000000000000000000000000004A -:10B700000000000000000000000000000000000039 -:10B710000000000000000000000000000000000029 -:10B720000000000000000000000000000000000019 -:10B730000000000000000000000000000000000009 -:10B7400000000000000000000000000000000000F9 -:10B7500000000000000000000000000000000000E9 -:10B7600000000000000000000000000000000000D9 -:10B7700000000000000000000000000000000000C9 -:10B7800000000000000000000000000000000000B9 -:10B7900000000000000000000000000000000000A9 -:10B7A0000000000000000000000000000000000099 -:10B7B0000000000000000000000000000000000089 -:10B7C0000000000000000000000000000000000079 -:10B7D0000000000000000000000000000000000069 -:10B7E0000000000000000000000000000000000059 -:10B7F0000000000000000000000000000000000049 -:10B800000000000000000000000000000000000038 -:10B810000000000000000000000000000000000028 -:10B820000000000000000000000000000000000018 -:10B830000000000000000000000000000000000008 -:10B8400000000000000000000000000000000000F8 -:10B8500000000000000000000000000000000000E8 -:10B8600000000000000000000000000000000000D8 -:10B8700000000000000000000000000000000000C8 -:10B8800000000000000000000000000000000000B8 -:10B8900000000000000000000000000000000000A8 -:10B8A0000000000000000000000000000000000098 -:10B8B0000000000000000000000000000000000088 -:10B8C0000000000000000000000000000000000078 -:10B8D0000000000000000000000000000000000068 -:10B8E0000000000000000000000000000000000058 -:10B8F0000000000000000000000000000000000048 -:10B900000000000000000000000000000000000037 -:10B910000000000000000000000000000000000027 -:10B920000000000000000000000000000000000017 -:10B930000000000000000000000000000000000007 -:10B9400000000000000000000000000000000000F7 -:10B9500000000000000000000000000000000000E7 -:10B9600000000000000000000000000000000000D7 -:10B9700000000000000000000000000000000000C7 -:10B9800000000000000000000000000000000000B7 -:10B9900000000000000000000000000000000000A7 -:10B9A0000000000000000000000000000000000097 -:10B9B0000000000000000000000000000000000087 -:10B9C0000000000000000000000000000000000077 -:10B9D0000000000000000000000000000000000067 -:10B9E0000000000000000000000000000000000057 -:10B9F0000000000000000000000000000000000047 -:10BA00000000000000000000000000000000000036 -:10BA10000000000000000000000000000000000026 -:10BA20000000000000000000000000000000000016 -:10BA30000000000000000000000000000000000006 -:10BA400000000000000000000000000000000000F6 -:10BA500000000000000000000000000000000000E6 -:10BA600000000000000000000000000000000000D6 -:10BA700000000000000000000000000000000000C6 -:10BA800000000000000000000000000000000000B6 -:10BA900000000000000000000000000000000000A6 -:10BAA0000000000000000000000000000000000096 -:10BAB0000000000000000000000000000000000086 -:10BAC0000000000000000000000000000000000076 -:10BAD0000000000000000000000000000000000066 -:10BAE0000000000000000000000000000000000056 -:10BAF0000000000000000000000000000000000046 -:10BB00000000000000000000000000000000000035 -:10BB10000000000000000000000000000000000025 -:10BB20000000000000000000000000000000000015 -:10BB30000000000000000000000000000000000005 -:10BB400000000000000000000000000000000000F5 -:10BB500000000000000000000000000000000000E5 -:10BB600000000000000000000000000000000000D5 -:10BB700000000000000000000000000000000000C5 -:10BB800000000000000000000000000000000000B5 -:10BB900000000000000000000000000000000000A5 -:10BBA0000000000000000000000000000000000095 -:10BBB0000000000000000000000000000000000085 -:10BBC0000000000000000000000000000000000075 -:10BBD0000000000000000000000000000000000065 -:10BBE0000000000000000000000000000000000055 -:10BBF0000000000000000000000000000000000045 -:10BC00000000000000000000000000000000000034 -:10BC10000000000000000000000000000000000024 -:10BC20000000000000000000000000000000000014 -:10BC30000000000000000000000000000000000004 -:10BC400000000000000000000000000000000000F4 -:10BC500000000000000000000000000000000000E4 -:10BC600000000000000000000000000000000000D4 -:10BC700000000000000000000000000000000000C4 -:10BC800000000000000000000000000000000000B4 -:10BC900000000000000000000000000000000000A4 -:10BCA0000000000000000000000000000000000094 -:10BCB0000000000000000000000000000000000084 -:10BCC0000000000000000000000000000000000074 -:10BCD0000000000000000000000000000000000064 -:10BCE0000000000000000000000000000000000054 -:10BCF0000000000000000000000000000000000044 -:10BD00000000000000000000000000000000000033 -:10BD10000000000000000000000000000000000023 -:10BD20000000000000000000000000000000000013 -:10BD30000000000000000000000000000000000003 -:10BD400000000000000000000000000000000000F3 -:10BD500000000000000000000000000000000000E3 -:10BD600000000000000000000000000000000000D3 -:10BD700000000000000000000000000000000000C3 -:10BD800000000000000000000000000000000000B3 -:10BD900000000000000000000000000000000000A3 -:10BDA0000000000000000000000000000000000093 -:10BDB0000000000000000000000000000000000083 -:10BDC0000000000000000000000000000000000073 -:10BDD0000000000000000000000000000000000063 -:10BDE0000000000000000000000000000000000053 -:10BDF0000000000000000000000000000000000043 -:10BE00000000000000000000000000000000000032 -:10BE10000000000000000000000000000000000022 -:10BE20000000000000000000000000000000000012 -:10BE30000000000000000000000000000000000002 -:10BE400000000000000000000000000000000000F2 -:10BE500000000000000000000000000000000000E2 -:10BE600000000000000000000000000000000000D2 -:10BE700000000000000000000000000000000000C2 -:10BE800000000000000000000000000000000000B2 -:10BE900000000000000000000000000000000000A2 -:10BEA0000000000000000000000000000000000092 -:10BEB0000000000000000000000000000000000082 -:10BEC0000000000000000000000000000000000072 -:10BED0000000000000000000000000000000000062 -:10BEE0000000000000000000000000000000000052 -:10BEF0000000000000000000000000000000000042 -:10BF00000000000000000000000000000000000031 -:10BF10000000000000000000000000000000000021 -:10BF20000000000000000000000000000000000011 -:10BF30000000000000000000000000000000000001 -:10BF400000000000000000000000000000000000F1 -:10BF500000000000000000000000000000000000E1 -:10BF600000000000000000000000000000000000D1 -:10BF700000000000000000000000000000000000C1 -:10BF800000000000000000000000000000000000B1 -:10BF900000000000000000000000000000000000A1 -:10BFA0000000000000000000000000000000000091 -:10BFB0000000000000000000000000000000000081 -:10BFC0000000000000000000000000000000000071 -:10BFD0000000000000000000000000000000000061 -:10BFE0000000000000000000000000000000000051 -:10BFF0000000000000000000000000000000000041 -:10C000000000000000000000000000000000000030 -:10C010000000000000000000000000000000000020 -:10C020000000000000000000000000000000000010 -:10C030000000000000000000000000000000000000 -:10C0400000000000000000000000000000000000F0 -:10C0500000000000000000000000000000000000E0 -:10C0600000000000000000000000000000000000D0 -:10C0700000000000000000000000000000000000C0 -:10C0800000000000000000000000000000000000B0 -:10C0900000000000000000000000000000000000A0 -:10C0A0000000000000000000000000000000000090 -:10C0B0000000000000000000000000000000000080 -:10C0C0000000000000000000000000000000000070 -:10C0D0000000000000000000000000000000000060 -:10C0E0000000000000000000000000000000000050 -:10C0F0000000000000000000000000000000000040 -:10C10000000000000000000000000000000000002F -:10C11000000000000000000000000000000000001F -:10C12000000000000000000000000000000000000F -:10C1300000000000000000000000000000000000FF -:10C1400000000000000000000000000000000000EF -:10C1500000000000000000000000000000000000DF -:10C1600000000000000000000000000000000000CF -:10C1700000000000000000000000000000000000BF -:10C1800000000000000000000000000000000000AF -:10C19000000000000000000000000000000000009F -:10C1A000000000000000000000000000000000008F -:10C1B000000000000000000000000000000000007F -:10C1C000000000000000000000000000000000006F -:10C1D000000000000000000000000000000000005F -:10C1E000000000000000000000000000000000004F -:10C1F000000000000000000000000000000000003F -:10C20000000000000000000000000000000000002E -:10C21000000000000000000000000000000000001E -:10C22000000000000000000000000000000000000E -:10C2300000000000000000000000000000000000FE -:10C2400000000000000000000000000000000000EE -:10C2500000000000000000000000000000000000DE -:10C2600000000000000000000000000000000000CE -:10C2700000000000000000000000000000000000BE -:10C2800000000000000000000000000000000000AE -:10C29000000000000000000000000000000000009E -:10C2A000000000000000000000000000000000008E -:10C2B000000000000000000000000000000000007E -:10C2C000000000000000000000000000000000006E -:10C2D000000000000000000000000000000000005E -:10C2E000000000000000000000000000000000004E -:10C2F000000000000000000000000000000000003E -:10C30000000000000000000000000000000000002D -:10C31000000000000000000000000000000000001D -:10C32000000000000000000000000000000000000D -:10C3300000000000000000000000000000000000FD -:10C3400000000000000000000000000000000000ED -:10C3500000000000000000000000000000000000DD -:10C3600000000000000000000000000000000000CD -:10C3700000000000000000000000000000000000BD -:10C3800000000000000000000000000000000000AD -:10C39000000000000000000000000000000000009D -:10C3A000000000000000000000000000000000008D -:10C3B000000000000000000000000000000000007D -:10C3C000000000000000000000000000000000006D -:10C3D000000000000000000000000000000000005D -:10C3E000000000000000000000000000000000004D -:10C3F000000000000000000000000000000000003D -:10C40000000000000000000000000000000000002C -:10C41000000000000000000000000000000000001C -:10C42000000000000000000000000000000000000C -:10C4300000000000000000000000000000000000FC -:10C4400000000000000000000000000000000000EC -:10C4500000000000000000000000000000000000DC -:10C4600000000000000000000000000000000000CC -:10C4700000000000000000000000000000000000BC -:10C4800000000000000000000000000000000000AC -:10C49000000000000000000000000000000000009C -:10C4A000000000000000000000000000000000008C -:10C4B000000000000000000000000000000000007C -:10C4C000000000000000000000000000000000006C -:10C4D000000000000000000000000000000000005C -:10C4E000000000000000000000000000000000004C -:10C4F000000000000000000000000000000000003C -:10C50000000000000000000000000000000000002B -:10C51000000000000000000000000000000000001B -:10C52000000000000000000000000000000000000B -:10C5300000000000000000000000000000000000FB -:10C5400000000000000000000000000000000000EB -:10C5500000000000000000000000000000000000DB -:10C5600000000000000000000000000000000000CB -:10C5700000000000000000000000000000000000BB -:10C5800000000000000000000000000000000000AB -:10C59000000000000000000000000000000000009B -:10C5A000000000000000000000000000000000008B -:10C5B000000000000000000000000000000000007B -:10C5C000000000000000000000000000000000006B -:10C5D000000000000000000000000000000000005B -:10C5E000000000000000000000000000000000004B -:10C5F000000000000000000000000000000000003B -:10C60000000000000000000000000000000000002A -:10C61000000000000000000000000000000000001A -:10C62000000000000000000000000000000000000A -:10C6300000000000000000000000000000000000FA -:10C6400000000000000000000000000000000000EA -:10C6500000000000000000000000000000000000DA -:10C6600000000000000000000000000000000000CA -:10C6700000000000000000000000000000000000BA -:10C6800000000000000000000000000000000000AA -:10C69000000000000000000000000000000000009A -:10C6A000000000000000000000000000000000008A -:10C6B000000000000000000000000000000000007A -:10C6C000000000000000000000000000000000006A -:10C6D000000000000000000000000000000000005A -:10C6E000000000000000000000000000000000004A -:10C6F000000000000000000000000000000000003A -:10C700000000000000000000000000000000000029 -:10C710000000000000000000000000000000000019 -:10C720000000000000000000000000000000000009 -:10C7300000000000000000000000000000000000F9 -:10C7400000000000000000000000000000000000E9 -:10C7500000000000000000000000000000000000D9 -:10C7600000000000000000000000000000000000C9 -:10C7700000000000000000000000000000000000B9 -:10C7800000000000000000000000000000000000A9 -:10C790000000000000000000000000000000000099 -:10C7A0000000000000000000000000000000000089 -:10C7B0000000000000000000000000000000000079 -:10C7C0000000000000000000000000000000000069 -:10C7D0000000000000000000000000000000000059 -:10C7E0000000000000000000000000000000000049 -:10C7F0000000000000000000000000000000000039 -:10C800000000000000000000000000000000000028 -:10C810000000000000000000000000000000000018 -:10C820000000000000000000000000000000000008 -:10C8300000000000000000000000000000000000F8 -:10C8400000000000000000000000000000000000E8 -:10C8500000000000000000000000000000000000D8 -:10C8600000000000000000000000000000000000C8 -:10C8700000000000000000000000000000000000B8 -:10C8800000000000000000000000000000000000A8 -:10C890000000000000000000000000000000000098 -:10C8A0000000000000000000000000000000000088 -:10C8B0000000000000000000000000000000000078 -:10C8C0000000000000000000000000000000000068 -:10C8D0000000000000000000000000000000000058 -:10C8E0000000000000000000000000000000000048 -:10C8F0000000000000000000000000000000000038 -:10C900000000000000000000000000000000000027 -:10C910000000000000000000000000000000000017 -:10C920000000000000000000000000000000000007 -:10C9300000000000000000000000000000000000F7 -:10C9400000000000000000000000000000000000E7 -:10C9500000000000000000000000000000000000D7 -:10C9600000000000000000000000000000000000C7 -:10C9700000000000000000000000000000000000B7 -:10C9800000000000000000000000000000000000A7 -:10C990000000000000000000000000000000000097 -:10C9A0000000000000000000000000000000000087 -:10C9B0000000000000000000000000000000000077 -:10C9C0000000000000000000000000000000000067 -:10C9D0000000000000000000000000000000000057 -:10C9E0000000000000000000000000000000000047 -:10C9F0000000000000000000000000000000000037 -:10CA00000000000000000000000000000000000026 -:10CA10000000000000000000000000000000000016 -:10CA20000000000000000000000000000000000006 -:10CA300000000000000000000000000000000000F6 -:10CA400000000000000000000000000000000000E6 -:10CA500000000000000000000000000000000000D6 -:10CA600000000000000000000000000000000000C6 -:10CA700000000000000000000000000000000000B6 -:10CA800000000000000000000000000000000000A6 -:10CA90000000000000000000000000000000000096 -:10CAA0000000000000000000000000000000000086 -:10CAB0000000000000000000000000000000000076 -:10CAC0000000000000000000000000000000000066 -:10CAD0000000000000000000000000000000000056 -:10CAE0000000000000000000000000000000000046 -:10CAF0000000000000000000000000000000000036 -:10CB00000000000000000000000000000000000025 -:10CB10000000000000000000000000000000000015 -:10CB20000000000000000000000000000000000005 -:10CB300000000000000000000000000000000000F5 -:10CB400000000000000000000000000000000000E5 -:10CB500000000000000000000000000000000000D5 -:10CB600000000000000000000000000000000000C5 -:10CB700000000000000000000000000000000000B5 -:10CB800000000000000000000000000000000000A5 -:10CB90000000000000000000000000000000000095 -:10CBA0000000000000000000000000000000000085 -:10CBB0000000000000000000000000000000000075 -:10CBC0000000000000000000000000000000000065 -:10CBD0000000000000000000000000000000000055 -:10CBE0000000000000000000000000000000000045 -:10CBF0000000000000000000000000000000000035 -:10CC00000000000000000000000000000000000024 -:10CC10000000000000000000000000000000000014 -:10CC20000000000000000000000000000000000004 -:10CC300000000000000000000000000000000000F4 -:10CC400000000000000000000000000000000000E4 -:10CC500000000000000000000000000000000000D4 -:10CC600000000000000000000000000000000000C4 -:10CC700000000000000000000000000000000000B4 -:10CC800000000000000000000000000000000000A4 -:10CC90000000000000000000000000000000000094 -:10CCA0000000000000000000000000000000000084 -:10CCB0000000000000000000000000000000000074 -:10CCC0000000000000000000000000000000000064 -:10CCD0000000000000000000000000000000000054 -:10CCE0000000000000000000000000000000000044 -:10CCF0000000000000000000000000000000000034 -:10CD00000000000000000000000000000000000023 -:10CD10000000000000000000000000000000000013 -:10CD20000000000000000000000000000000000003 -:10CD300000000000000000000000000000000000F3 -:10CD400000000000000000000000000000000000E3 -:10CD500000000000000000000000000000000000D3 -:10CD600000000000000000000000000000000000C3 -:10CD700000000000000000000000000000000000B3 -:10CD800000000000000000000000000000000000A3 -:10CD90000000000000000000000000000000000093 -:10CDA0000000000000000000000000000000000083 -:10CDB0000000000000000000000000000000000073 -:10CDC0000000000000000000000000000000000063 -:10CDD0000000000000000000000000000000000053 -:10CDE0000000000000000000000000000000000043 -:10CDF0000000000000000000000000000000000033 -:10CE00000000000000000000000000000000000022 -:10CE10000000000000000000000000000000000012 -:10CE20000000000000000000000000000000000002 -:10CE300000000000000000000000000000000000F2 -:10CE400000000000000000000000000000000000E2 -:10CE500000000000000000000000000000000000D2 -:10CE600000000000000000000000000000000000C2 -:10CE700000000000000000000000000000000000B2 -:10CE800000000000000000000000000000000000A2 -:10CE90000000000000000000000000000000000092 -:10CEA0000000000000000000000000000000000082 -:10CEB0000000000000000000000000000000000072 -:10CEC0000000000000000000000000000000000062 -:10CED0000000000000000000000000000000000052 -:10CEE0000000000000000000000000000000000042 -:10CEF0000000000000000000000000000000000032 -:10CF00000000000000000000000000000000000021 -:10CF10000000000000000000000000000000000011 -:10CF20000000000000000000000000000000000001 -:10CF300000000000000000000000000000000000F1 -:10CF400000000000000000000000000000000000E1 -:10CF500000000000000000000000000000000000D1 -:10CF600000000000000000000000000000000000C1 -:10CF700000000000000000000000000000000000B1 -:10CF800000000000000000000000000000000000A1 -:10CF90000000000000000000000000000000000091 -:10CFA0000000000000000000000000000000000081 -:10CFB0000000000000000000000000000000000071 -:10CFC0000000000000000000000000000000000061 -:10CFD0000000000000000000000000000000000051 -:10CFE0000000000000000000000000000000000041 -:10CFF0000000000000000000000000000000000031 -:10D000000000000000000000000000000000000020 -:10D010000000000000000000000000000000000010 -:10D020000000000000000000000000000000000000 -:10D0300000000000000000000000000000000000F0 -:10D0400000000000000000000000000000000000E0 -:10D0500000000000000000000000000000000000D0 -:10D0600000000000000000000000000000000000C0 -:10D0700000000000000000000000000000000000B0 -:10D0800000000000000000000000000000000000A0 -:10D090000000000000000000000000000000000090 -:10D0A0000000000000000000000000000000000080 -:10D0B0000000000000000000000000000000000070 -:10D0C0000000000000000000000000000000000060 -:10D0D0000000000000000000000000000000000050 -:10D0E0000000000000000000000000000000000040 -:10D0F0000000000000000000000000000000000030 -:10D10000000000000000000000000000000000001F -:10D11000000000000000000000000000000000000F -:10D1200000000000000000000000000000000000FF -:10D1300000000000000000000000000000000000EF -:10D1400000000000000000000000000000000000DF -:10D1500000000000000000000000000000000000CF -:10D1600000000000000000000000000000000000BF -:10D1700000000000000000000000000000000000AF -:10D18000000000000000000000000000000000009F -:10D19000000000000000000000000000000000008F -:10D1A000000000000000000000000000000000007F -:10D1B000000000000000000000000000000000006F -:10D1C000000000000000000000000000000000005F -:10D1D000000000000000000000000000000000004F -:10D1E000000000000000000000000000000000003F -:10D1F000000000000000000000000000000000002F -:10D20000000000000000000000000000000000001E -:10D21000000000000000000000000000000000000E -:10D2200000000000000000000000000000000000FE -:10D2300000000000000000000000000000000000EE -:10D2400000000000000000000000000000000000DE -:10D2500000000000000000000000000000000000CE -:10D2600000000000000000000000000000000000BE -:10D2700000000000000000000000000000000000AE -:10D28000000000000000000000000000000000009E -:10D29000000000000000000000000000000000008E -:10D2A000000000000000000000000000000000007E -:10D2B000000000000000000000000000000000006E -:10D2C000000000000000000000000000000000005E -:10D2D000000000000000000000000000000000004E -:10D2E000000000000000000000000000000000003E -:10D2F000000000000000000000000000000000002E -:10D30000000000000000000000000000000000001D -:10D31000000000000000000000000000000000000D -:10D3200000000000000000000000000000000000FD -:10D3300000000000000000000000000000000000ED -:10D3400000000000000000000000000000000000DD -:10D3500000000000000000000000000000000000CD -:10D3600000000000000000000000000000000000BD -:10D3700000000000000000000000000000000000AD -:10D38000000000000000000000000000000000009D -:10D39000000000000000000000000000000000008D -:10D3A000000000000000000000000000000000007D -:10D3B000000000000000000000000000000000006D -:10D3C000000000000000000000000000000000005D -:10D3D000000000000000000000000000000000004D -:10D3E000000000000000000000000000000000003D -:10D3F000000000000000000000000000000000002D -:10D40000000000000000000000000000000000001C -:10D41000000000000000000000000000000000000C -:10D4200000000000000000000000000000000000FC -:10D4300000000000000000000000000000000000EC -:10D4400000000000000000000000000000000000DC -:10D4500000000000000000000000000000000000CC -:10D4600000000000000000000000000000000000BC -:10D4700000000000000000000000000000000000AC -:10D48000000000000000000000000000000000009C -:10D49000000000000000000000000000000000008C -:10D4A000000000000000000000000000000000007C -:10D4B000000000000000000000000000000000006C -:10D4C000000000000000000000000000000000005C -:10D4D000000000000000000000000000000000004C -:10D4E000000000000000000000000000000000003C -:10D4F000000000000000000000000000000000002C -:10D50000000000000000000000000000000000001B -:10D51000000000000000000000000000000000000B -:10D5200000000000000000000000000000000000FB -:10D5300000000000000000000000000000000000EB -:10D5400000000000000000000000000000000000DB -:10D5500000000000000000000000000000000000CB -:10D5600000000000000000000000000000000000BB -:10D5700000000000000000000000000000000000AB -:10D58000000000000000000000000000000000009B -:10D59000000000000000000000000000000000008B -:10D5A000000000000000000000000000000000007B -:10D5B000000000000000000000000000000000006B -:10D5C000000000000000000000000000000000005B -:10D5D000000000000000000000000000000000004B -:10D5E000000000000000000000000000000000003B -:10D5F000000000000000000000000000000000002B -:10D60000000000000000000000000000000000001A -:10D61000000000000000000000000000000000000A -:10D6200000000000000000000000000000000000FA -:10D6300000000000000000000000000000000000EA -:10D6400000000000000000000000000000000000DA -:10D6500000000000000000000000000000000000CA -:10D6600000000000000000000000000000000000BA -:10D6700000000000000000000000000000000000AA -:10D68000000000000000000000000000000000009A -:10D69000000000000000000000000000000000008A -:10D6A000000000000000000000000000000000007A -:10D6B000000000000000000000000000000000006A -:10D6C000000000000000000000000000000000005A -:10D6D000000000000000000000000000000000004A -:10D6E000000000000000000000000000000000003A -:10D6F000000000000000000000000000000000002A -:10D700000000000000000000000000000000000019 -:10D710000000000000000000000000000000000009 -:10D7200000000000000000000000000000000000F9 -:10D7300000000000000000000000000000000000E9 -:10D7400000000000000000000000000000000000D9 -:10D7500000000000000000000000000000000000C9 -:10D7600000000000000000000000000000000000B9 -:10D7700000000000000000000000000000000000A9 -:10D780000000000000000000000000000000000099 -:10D790000000000000000000000000000000000089 -:10D7A0000000000000000000000000000000000079 -:10D7B0000000000000000000000000000000000069 -:10D7C0000000000000000000000000000000000059 -:10D7D0000000000000000000000000000000000049 -:10D7E0000000000000000000000000000000000039 -:10D7F0000000000000000000000000000000000029 -:10D800000000000000000000000000000000000018 -:10D810000000000000000000000000000000000008 -:10D8200000000000000000000000000000000000F8 -:10D8300000000000000000000000000000000000E8 -:10D8400000000000000000000000000000000000D8 -:10D8500000000000000000000000000000000000C8 -:10D8600000000000000000000000000000000000B8 -:10D8700000000000000000000000000000000000A8 -:10D880000000000000000000000000000000000098 -:10D890000000000000000000000000000000000088 -:10D8A0000000000000000000000000000000000078 -:10D8B0000000000000000000000000000000000068 -:10D8C0000000000000000000000000000000000058 -:10D8D0000000000000000000000000000000000048 -:10D8E0000000000000000000000000000000000038 -:10D8F0000000000000000000000000000000000028 -:10D900000000000000000000000000000000000017 -:10D910000000000000000000000000000000000007 -:10D9200000000000000000000000000000000000F7 -:10D9300000000000000000000000000000000000E7 -:10D9400000000000000000000000000000000000D7 -:10D9500000000000000000000000000000000000C7 -:10D9600000000000000000000000000000000000B7 -:10D9700000000000000000000000000000000000A7 -:10D980000000000000000000000000000000000097 -:10D990000000000000000000000000000000000087 -:10D9A0000000000000000000000000000000000077 -:10D9B0000000000000000000000000000000000067 -:10D9C0000000000000000000000000000000000057 -:10D9D0000000000000000000000000000000000047 -:10D9E0000000000000000000000000000000000037 -:10D9F0000000000000000000000000000000000027 -:10DA00000000000000000000000000000000000016 -:10DA10000000000000000000000000000000000006 -:10DA200000000000000000000000000000000000F6 -:10DA300000000000000000000000000000000000E6 -:10DA400000000000000000000000000000000000D6 -:10DA500000000000000000000000000000000000C6 -:10DA600000000000000000000000000000000000B6 -:10DA700000000000000000000000000000000000A6 -:10DA80000000000000000000000000000000000096 -:10DA90000000000000000000000000000000000086 -:10DAA0000000000000000000000000000000000076 -:10DAB0000000000000000000000000000000000066 -:10DAC0000000000000000000000000000000000056 -:10DAD0000000000000000000000000000000000046 -:10DAE0000000000000000000000000000000000036 -:10DAF0000000000000000000000000000000000026 -:10DB00000000000000000000000000000000000015 -:10DB10000000000000000000000000000000000005 -:10DB200000000000000000000000000000000000F5 -:10DB300000000000000000000000000000000000E5 -:10DB400000000000000000000000000000000000D5 -:10DB500000000000000000000000000000000000C5 -:10DB600000000000000000000000000000000000B5 -:10DB700000000000000000000000000000000000A5 -:10DB80000000000000000000000000000000000095 -:10DB90000000000000000000000000000000000085 -:10DBA0000000000000000000000000100004000160 -:10DBB0000000000000000000000000000000000065 -:10DBC0000000000000000000000000000000000055 -:10DBD0000000000000000000000000000000000045 -:10DBE0000000000000000000000000000000000035 -:10DBF000000009000000000000000000000000001C -:10DC00000000000000000000000000000000000014 -:10DC10000000000000000000000000000000000004 -:10DC200000000000000000000000000000000000F4 -:10DC3000000000000000000000000840488820406C -:10DC400000020001218000C000208080000480804C -:10DC5000000000020000800000010408012024846C -:10DC60008101000000000200000020000000000010 -:10DC70000400010121192400D00910001022200005 -:10DC800002040040011000400002000000010200F8 -:10DC90008000042110004044608000022304000240 -:10DCA0000110040000000000882000890004220800 -:10DCB0008902408008100410008004004000000029 -:10DCC0000000008041D00200249224904180400452 -:10DCD00008000A080001088140200000042002809A -:10DCE0008000000019041000801042045008000059 -:10DCF000040192EBE8BE80000B8010004400004954 -:10DD00000400840880112000840108000000000045 -:10DD100040000820000002104000000820400020C1 -:10DD20000100000000090062101000E880105D4052 -:10DD3000B100001C001800040001100200023000B5 -:10DD4000000800000000080000000000A00004001F -:10DD5000000000000000000000000080000020081B -:10DD6000208180210008C50002C48200175EC00C1B -:10DD700090000002402210408000081001000206BE -:10DD80000600204000200008000000000200000003 -:10DD90000400008050400050082020005022000065 -:10DDA000802A08028030200200BFF13E470239F08D -:10DDB0000000000000000000404090104000000003 -:10DDC0000040900448040000000000A4000040004F -:10DDD000000002800088048000000800008000002D -:10DDE0002A32240842810A28110006050800009002 -:10DDF000A868101A090B82821444212002020FF431 -:10DE000080000C0800000000B510000C80613D226D -:10DE10000000020200C0690040040010334080008E -:10DE20000D30080A3018584CD000C00A2D31A540DA -:10DE3000940400448124002250040804200012119C -:10DE40000A00100819A60D01425328B34A084306D8 -:10DE5000040144682B4004088ACA12608062A1064B -:10DE600098406981804021002FD94096520610D2F7 -:10DE7000800103082D12833008A0004A051D3130AF -:10DE8000B05F433030434340012010200000008049 -:10DE900080025008000000001412145021041004E5 -:10DEA000080AA018000A000000090801000006483E -:10DEB00011B4CA846201540116001E4A8A0100246A -:10DEC00020F00D000318A20A08861A0B1802194048 -:10DED000A0046023201186981195846C680B1903A7 -:10DEE00022804448C0002828000000088460030BFA -:10DEF00092804000A8A43508260A000060C120D006 -:10DF000003084181D28191C046A602010194802379 -:10DF10005010063101840800521020012010020127 -:10DF200081040400010004041A00D00049000C0020 -:10DF30008010B10400D216028080B490420090217B -:10DF40000860000002D340258002D2403900000062 -:10DF5000010C000000000019142211000A08200022 -:10DF600000000800208000826100001000023400E0 -:10DF700000000A00048000808A00001974058031C6 -:10DF80001C81A313CD900C000222080310800028EE -:10DF9000182000009140A0409000320001CC027097 -:10DFA00054E4070802088802C1447E013C28441357 -:10DFB0002271584940322A4252A20B14200214A95D -:10DFC00081B6200980C2542680800001DC8066F181 -:10DFD0001131092E00ABF0A15C2784401A3044A017 -:10DFE00000800CE202AE33BD00D8F60D94CE4A801C -:10DFF000C10C34060A0C01240010B80B841C344EEA -:10E00000E471AA201A440CA04001800404A1410537 -:10E01000540903C01A5049D22800402D021004327E -:10E020007C004800840000000800131000B0A031FC -:10E03000144A41144A0284A0948CD0010229082772 -:10E040008081200C00300A0A1310000094EA08C1F5 -:10E050008510111A00160804054000200000000079 -:10E06000040A020100400040020812834100002817 -:10E070000000088000000000008000004204000250 -:10E080004400000000024104000500200800284C64 -:10E0900090212A4802041B02446A202240090228D7 -:10E0A0009B04046080C80B0000480204C0100000FC -:10E0B000002800000100440400800080010C43D4CB -:10E0C0000020800081020141028010000000000059 -:10E0D00000100000000280000200183080002000C4 -:10E0E000400102001000801DF000198100803D08F1 -:10E0F0000084000000200402282CE2010800A0E0B7 -:10E10000382000400004022000A002003300E0C0DC -:10E11000142001400000804000804000A800100052 -:10E120000080002020000000010000090815070001 -:10E130002200100010000A02000000110288404D69 -:10E140004420004A00028220111008004001910181 -:10E150000400040000400000000000802060002255 -:10E16000000000000000400008A0000020000101A5 -:10E170000004924A08805008E004280000245090CF -:10E1800009000A0080000800000081001001000062 -:10E1900000000500080002000010000001810401D9 -:10E1A00005081C08000002110204200000020004FF -:10E1B000080150505A00024101082108200820009F -:10E1C000004000004180800000008C00229A0C502A -:10E1D000040000480022D400120220C008A80085D4 -:10E1E000002FBE3785CE167025DC03C00000040367 -:10E1F00060231C2802001E000242D0001E2426417B -:10E200008107B1FBA42311026C000001240020004F -:10E21000250206388223CCBBF73A210093319F4474 -:10E22000E2920933C9FC5201240A8A210E04829029 -:10E230006F906208002C0414101508A14C006400B3 -:10E24000006020B02000088040421010000019003B -:10E250003E000003A16001030600080040F0043105 -:10E260000213C541400106000000000800008000C4 -:10E27000001052000800A940000000000700000044 -:10E280002000100080002000442010400402000004 -:10E29000000101000007F0048200820101208004D7 -:10E2A00030400000000400400022424208010128E2 -:10E2B0000400142000104000000400089100804277 -:10E2C0000004100001000008000108400800800858 -:10E2D00001001000002000000200000000200022C9 -:10E2E0000208004100000000002000000040400043 -:10E2F00000000000000010000000202000000000CE -:10E300000010000001000820802011AB00270090C1 -:10E3100000081080000418024081020C040810203C -:10E320004302008718C08402B80108121C6021C192 -:10E3300004000204200810092100810220908000BE -:10E34000000802040C1812108018301020C10200BE -:10E350003060830A002041000010200042000000CD -:10E360000002040800402040821400A040021C303B -:10E3700060C30600102038C2010000842090841081 -:10E38000810000000000408404083060C10600885D -:10E39000208018226546EDD20008250100200802E1 -:10E3A0004070000CC310200160A0CC806A63221072 -:10E3B000C098B1898814F4007D40D0C000040510D5 -:10E3C0000001CFFE10400404050D0147592003FC55 -:10E3D000F0303FFFC000F0000008B0000400006013 -:10E3E00000003000000000000000000000000000FD -:10E3F000000000000000000000000000000000001D -:10E40000000000000000000000000000000000000C -:10E41000003FFF0FFFF3FFFCFFFF3FFFCFFFF3FFC6 -:10E42000FCFFFF0000C00000000000000000000032 -:10E4300000020000000010000000000018000000B2 -:10E4400000000000000000000000000000000000CC -:10E4500000000000000000000000000000000000BC -:10E4600000003FFFCFFFF3FFFCFFFF0000C00000F4 -:10E47000000000000000000000020000000010008A -:10E480000000000018000000000000000000000074 -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C -:10E4B000000000000000000000000000000000005C -:10E4C000000000000000000000000000000000004C -:10E4D000000000000000000000000000000000003C -:10E4E000000000000000000000000000000000002C -:10E4F000000000000000000000000000000000001C -:10E50000000000000000000000000000000000000B -:10E5100000000000000000000000000000000000FB -:10E5200000000000000000000000000000000000EB -:10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000000000000CB -:10E5500000000000000000000000000000000000BB -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E58000000000000000000000000000000000008B -:10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000000000006B -:10E5B000000000000000000000000000000000005B -:10E5C000000000000000000000000000000000004B -:10E5D000000000000000000000000000000000003B -:10E5E000000000000000000000000000000000002B -:10E5F000000000000000000000000000000000001B -:10E60000000000000000000000000000000000000A -:10E6100000000000000000000000000000000000FA -:10E6200000000000000000000000000000000000EA -:10E6300000000000000000000000000000000000DA -:10E6400000000000000000000000000000000000CA -:10E6500000000000000000000000000000000000BA -:10E6600000000000000000000000000000000000AA -:10E67000000000000000000000000000000000009A -:10E68000000000000000000000000000000000008A -:10E69000000000000000000000000000000000007A -:10E6A000000000000000000000000000000000006A -:10E6B000000000000000000000000000000000005A -:10E6C000000000000000000000000000000000004A -:10E6D000000000000000000000000000000000003A -:10E6E000000000000000000000000000000000002A -:10E6F000000000000000000000000000000000001A -:10E700000000000000000000000000000000000009 -:10E7100000000000000000000000000000000000F9 -:10E7200000000000000000000000000000000000E9 -:10E7300000000000000000000000000000000000D9 -:10E7400000000000000000000000000000000000C9 -:10E7500000000000000000000000000000000000B9 -:10E7600000000000000000000000000000000000A9 -:10E770000000000000000000000000000000000099 -:10E780000000000000000000000000000000000089 -:10E790000000000000000000000000000000000079 -:10E7A0000000000000000000000000000000000069 -:10E7B0000000000000000000000000000000000059 -:10E7C0000000000000000000000000000000000049 -:10E7D0000000000000000000000000000000000039 -:10E7E0000000000000000000000000000000000029 -:10E7F0000000000000000000000000000000000019 -:10E800000000000000000000000000000000000008 -:10E8100000000000000000000000000000000000F8 -:10E8200000000000000000000000000000000000E8 -:10E8300000000000000000000000000000000000D8 -:10E8400000000000000000000000000000000000C8 -:10E8500000000000000000000000000000000000B8 -:10E8600000000000000000000000000000000000A8 -:10E870000000000000000000000000000000000098 -:10E880000000000000000000000000000000000088 -:10E890000000000000000000000000000000000078 -:10E8A0000000000000000000000000000000000068 -:10E8B0000000000000000000000000000000000058 -:10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 -:10E9200000000000000000000000000000000000E7 -:10E9300000000000000000000000000000000000D7 -:10E9400000000000000000000000000000000000C7 -:10E9500000000000000000000000000000000000B7 -:10E9600000000000000000000000000000000000A7 -:10E970000000000000000000000000000000000097 -:10E980000000000000000000000000000000000087 -:10E990000000000000000000000000000000000077 -:10E9A0000000000000000000000000000000000067 -:10E9B0000000000000000000000000000000000057 -:10E9C0000000000000000000000000000000000047 -:10E9D0000000000000000000000000000000000037 -:10E9E0000000000000000000000000000000000027 -:10E9F0000000000000000000000000000000000017 -:10EA00000000000000000000000000000000000006 -:10EA100000000000000000000000000000000000F6 -:10EA200000000000000000000000000000000000E6 -:10EA300000000000000000000000000000000000D6 -:10EA400000000000000000000000000000000000C6 -:10EA500000000000000000000000000000000000B6 -:10EA600000000000000000000000000000000000A6 -:10EA70000000000000000000000000000000000096 -:10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000000076 -:10EAA0000000000000000000000000000000000066 -:10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000000046 -:10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000000000000026 -:10EAF0000000000000000000000000000000000016 -:10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 -:10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000000000D5 -:10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000075 -:10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000000045 -:10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 -:10EBF0000000000000000000000000000000000015 -:10EC00000000000000000000000000000000000004 -:10EC100000000000000000000000000000000000F4 -:10EC200000000000000000000000000000000000E4 -:10EC300000000000000000000000000000000000D4 -:10EC400000000000000000000000000000000000C4 -:10EC500000000000000000000000000000000000B4 -:10EC600000000000000000000000000000000000A4 -:10EC70000000000000000000000000000000000094 -:10EC80000000000000000000000000000000000084 -:10EC90000000000000000000000000000000000074 -:10ECA0000000000000000000000000000000000064 -:10ECB0000000000000000000000000000000000054 -:10ECC0000000000000000000000000000000000044 -:10ECD0000000000000000000000000000000000034 -:10ECE0000000000000000000000000000000000024 -:10ECF0000000000000000000000000000000000014 -:10ED00000000000000000000000000000000000003 -:10ED100000000000000000000000000000000000F3 -:10ED200000000000000000000000000000000000E3 -:10ED300000000000000000000000000000000000D3 -:10ED400000000000000000000000000000000000C3 -:10ED500000000000000000000000000000000000B3 -:10ED600000000000000000000000000000000000A3 -:10ED70000000000000000000000000000000000093 -:10ED80000000000000000000000000000000000083 -:10ED90000000000000000000000000000000000073 -:10EDA0000000000000000000000000000000000063 -:10EDB0000000000000000000000000000000000053 -:10EDC0000000000000000000000000000000000043 -:10EDD0000000000000000000000000000000000033 -:10EDE0000000000000000000000000000000000023 -:10EDF0000000000000000000000000000000000013 :10EE00000000000000000000000000000000000002 :10EE100000000000000000000000000000000000F2 :10EE200000000000000000000000000000000000E2 @@ -250065,149 +250065,149 @@ :1009200000000000000000000000000000000000C7 :1009300000000000000000000000000000000000B7 :1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 +:100950000000000000000000000000000000002077 +:10096000C02220020000000444011110444411116F :100970000000000000000000000000000000000077 :100980000000000000000000000000000000000067 :100990000000000000000000000000000000000057 -:1009A0000000000000000000000000000000000047 +:1009A00000000000000000800002000000000000C5 :1009B0000000000000000000000000000000000037 :1009C0000000000000000000000000000000000027 :1009D0000000000000000000000000000000000017 :1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 -:100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF -:1011300000000000000000000000000000000000AF -:10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F -:10118000000000000000000000000000000000005F -:10119000000000000000000000000000000000004F +:1009F000480001000002200120880080EC206406ED +:100A00003806481181E0E0E078000608E7004F1C56 +:100A1000000400000E00011D040FE720CC0E7471CD +:100A2000807C10060000002000000001380000005B +:100A30000000000000000000000000000080001026 +:100A40000000000000200000001000000001000075 +:100A500000000805000000083DA8340FC023700006 +:100A6000000000000000000094000400202140006D +:100A700050000000400000000000020000000000E4 +:100A8000018200200001250000000800A1000009EB +:100A900000200284000024004000000080100204B6 +:100AA00050C0000244040000000000200000870045 +:100AB00018040ED800040050000200008001080055 +:100AC00000000000E4180000008A200000228800D6 +:100AD0000000000000006000000800000310E0209B +:100AE000F10000000000000080000000068100010D +:100AF000C092011249080021025052800D450000A9 +:100B00004020040040000080040040080080008174 +:100B10000C0383C80001F2200400858002048600D3 +:100B20000002000880010801241210004002088021 +:100B300011800002020020C2802000080400000092 +:100B40008200008114040EA010000097E6206A8243 +:100B500068020D00A3A200080330A00800001000E6 +:100B6000400200000000000200000000008000843D +:100B7000501010080B01CB0401801C20000691814D +:100B8000048000147E0C02C0088830001600C400E7 +:100B90000201B80024204000A0A00004034031005E +:100BA0000846F18D20C06D05A0CC000000BC0141BD +:100BB000000000000000000000000000000200082B +:100BC000000000000000004C188000211BC00380C2 +:100BD0000000000808A00000100800C0660CD04209 +:100BE00020008488004401000120020280101810B7 +:100BF0000008800071E40000091400C0000100003A +:100C00000200010400000244000000504000000007 +:100C100004682010018005000000000001040400A9 +:100C2000000000000000000000C04000001018801C +:100C3000005000033466080334020801C40042A1D6 +:100C40002C000B5D53504C41DC00000781216540B6 +:100C50000101015185DC01A000465820100102600D +:100C6000E05040D900800970210900200807048263 +:100C700040D0544440000044404680418002090076 +:100C800000080880007001000830000190810420F5 +:100C90002810080100100B805806090200004000CF +:100CA00000310105308020C205001220008104744B +:100CB00000454C0101082809050080400415040086 +:100CC000024420D990C0010AB0010B102CAC2C00BA +:100CD0000000060001180403601000080260000014 +:100CE0000B081000400000000002C138010300B2F0 +:100CF0001080000000040000000200F8801C02C107 +:100D000008000000010400000000000000000000D6 +:100D100008010003A3981CBD00040E00230210006C +:100D20008002100200000000040000008100000C9E +:100D300040000000000C104340184600000008204E +:100D4000C01000400000000480100094400000002B +:100D50004108001000C80C00000000000020000046 +:100D60000000000032000801C00000004042000006 +:100D70000403080101240000080000140000100012 +:100D800005002000001402280000000000220000DE +:100D90000C901808020A00080004420E040000002B +:100DA00000000000002808000000004000000000D3 +:100DB0000000000040000000156604C00C00018027 +:100DC000140101200080404050000001000100009B +:100DD000008100000000000004000000000000028C +:100DE000000000000002C21050040020040C0000AB +:100DF000020008200081200C4001100800000000C3 +:100E000010880001811011080010000C6A40923215 +:100E1000048051F8040B02A0104068408A36B28F5B +:100E2000B400003422000000011D404038021014BC +:100E30002C005400C09000140260880080082084B8 +:100E40001000110564006200100800050040104009 +:100E5000C410100000001040008000000058000086 +:100E600000100000000000000002EE2400010080DD +:100E70000D0000204400113E6006AA528080000050 +:100E8000000000000000000000000000020008C098 +:100E900000002000000100800402201400001080E7 +:100EA0002000000800800000000000002800400131 +:100EB00000000020200001400244412020200B00BF +:100EC0006000A1001020010035600040E0800000BB +:100ED00088181008AA83A00025FF3E1805DD5000E1 +:100EE000081400052A00004010000802000000104D +:100EF000000800044000004801220000510000A446 +:100F0000487130119C0000004400001100C00080B6 +:100F1000000802009008080000084001200000407E +:100F2000280009000001C00088004400904420808F +:100F30000024401001000080800A080000000140E9 +:100F40001001000000001000000000000010000070 +:100F500019800000000840280008401100440000EB +:100F60000000200408000100101102C0410001002F +:100F70000000000022400140002C00000C04400052 +:100F800001382020D10034400001A8E00001030D09 +:100F900002378002A00004008102040090000C00CF +:100FA000037A0E0A2008441C443C000425501270A9 +:100FB000005C000000000000D40144010003103177 +:100FC0000C308C31110100801000000010080482E8 +:100FD000400001008048240000100004800002004E +:100FE00000000000020000010000040000400000BA +:100FF0000020000001F150008015000206401002A0 +:101000000070470002000000028010001830063C0B +:10101000400208020007C44540100A88028004000C +:1010200000448000000000021A00081000000000C8 +:10103000010000002000000080000000000000000F +:101040000E8000CC0807C0306407F0170002C040D3 +:101050004180000E30400C06100000E80000000047 +:10106000000141F000000400070000401C00820065 +:10107000000FCD00003C18000180020C010100426D +:101080000820840841001080202104080A31D00281 +:101090001801800CC04801912080C3042000C409BD +:1010A00090000006601819890060006404CC0000FC +:1010B000863000181800242141000A00800010101A +:1010C00004240C8420C9904C9924C9824C91326428 +:1010D00064C8264C8264C13210990804930213201C +:1010E000C84C4C9904C9826420C990C9210C990943 +:1010F00024909324084904C84993202130132126C1 +:101100004C8264C3264C326413264932619324080E +:1011100042132646426264C8264C0C9904C9924C7C +:101120009864C9264C8264C3264C9084193240844A +:10113000209084909908424321324C8464C9264C03 +:101140008264C0884C00D21D248590908400C10D1B +:101150001882409C232588AA880045C84A104E1C46 +:101160000022020A405160A488CA2E092A411100B7 +:1011700003444C2010174C0070001082000200063F +:10118000F0800184000000000FFF03FFFC18BF0087 +:10119000000000000000400000000000000000000F :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F :1011C000000000000000000000000000000000001F :1011D000000000000000000000000000000000000F -:1011E00000000000000000000000000000000000FF -:1011F00000000000000000000000000000000000EF +:1011E00000000000000200000000000000000000FD +:1011F00008000000000000000000000000000000E7 :1012000000000000000000000000000000000000DE :1012100000000000000000000000000000000000CE -:1012200000000000000000000000000000000000BE -:1012300000000000000000000000000000000000AE +:1012200000000000000000000000000000020000BC +:1012300000000000000000000800000000000000A6 :10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E :10126000000000000000000000000000000000007E @@ -250659,140 +250659,140 @@ :102E40000000000000000000000000000000000082 :102E50000000000000000000000000000000000072 :102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 -:103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B +:102E7000000000000000000000000000000000F55D +:102E80004A00007C00021001688000800968D6803A +:102E900000044000800020030003800000830C3801 +:102EA00000002DCD8F23900228080028FF0000038A +:102EB000E020064700B80083002A4C000001008093 +:102EC00000020100020000020000800200008000F9 +:102ED00000018001800080040000440020000020E8 +:102EE000010000001000032401B83C00007B719B2E +:102EF00008A006003BC61B8240102F0C204408523D +:102F00004012AC4240000080621222442AAE157486 +:102F100043C052859C1A8A0C40039AC1542C00D499 +:102F20000E6A08D0B00110012B161E029411E6841F +:102F300031EF29518521F2AAE8AE80000A8A5403B4 +:102F4000544400290C52C40DD0D1E0008401080083 +:102F50000002200000490B4A445242D8E014900C71 +:102F600070CE3C6163442620000A4200001718E836 +:102F70003E187DC0140204008D3830540803508F71 +:102F8000FC28B428A28A89801D2400101200015355 +:102F9000A1C2B82B85085702B8538570578A38AE3E +:102FA000002061AA6CA8782B7448C50036E4821C06 +:102FB0001556804CB00000012412104040000890CB +:102FC000010417120200205848200109040097400C +:102FD0008200A4A015040188514080DABA38250186 +:102FE00052600250A04A39208490234788B6D52CDD +:102FF0005602B1D0000040850008001040211400A6 +:10300000442400498DF00400C86000080580002EAB +:103010007068E70008C0B302800875E61BDF0996F8 +:10302000C08388192A1A76C942834EB800501C0DF5 +:10303000CA95B090AC49143A99028BC1345401102E +:1030400000124000000000000000000000028208A2 +:1030500000903C9006C4F20200604D202046A17210 +:103060003B40020C1F700A0930185CC8D0004808A9 +:103070002DB1A5505C0E084D8B4CB0662C854905D2 +:103080002B0010C35AE000491BEE0F41225328BB0E +:103090004B09530E001126F82BD00B58C8EA1368C1 +:1030A0008424B116D804EC8050000DE00FDB44C23C +:1030B000100410D2C232438A2F52CBB422B20088FD +:1030C0008839B1B0105D4B30124D4B62A51C1760B2 +:1030D0001589C22BB225C030AA26720E8952ABCCFC +:1030E000030B35B08ABEF3FC803E03000849AF9164 +:1030F000600C0F5A35B6CAA561695449300FFE4AB3 +:10310000BE010114602D0F388398A29EB8961A2B29 +:103110009C035962A1ACE9232413C7F80194A46D60 +:103120006D07594B63802558E0030FFE489100421C +:10313000C040512F9280C341ACEC7F5A362B09A876 +:10314000E1C1F0B48318C203F28095E056B60C13C7 +:103150004F82D0E3D074CE31438C45F05A90260193 +:1031600024800300810744000821B48232106A24BD +:10317000098024800004D25484FDAA35D0003F4148 +:10318000C268B008081B002220FED09B8800FD0406 +:10319000284100200147008C0411012D1000010C72 +:1031A0008A886021E22009400820C0806347A0444B +:1031B0001302B0801050022CC56120188A580139C2 +:1031C0005407001008010292CB903C0605AA4C025D +:1031D00010840C102C05000090400000BA00200064 +:1031E00003CC007DD4C603080A089840884C6A3096 +:1031F0003C28401122FB48CB4412228241A20330DA +:10320000280631D981A6210888B6C4156D40001161 +:103210009C8066F01339002E10A3A035D827C40077 +:103220000230040002081DF242EF33FD2810460C64 +:10323000948E00D349CCB4060B2C003C22302802DB +:10324000841514CCE073AB001AC40E20C113C00562 +:10325000AC81E105540FA3F23A400BD62B8040FD20 +:10326000024344777F0F5F0005501400080102906D +:10327000043402011002601044411020040C40008C +:10328000028008200081200D401800080100200065 +:1032900094AA00018150112C40172C09524F65400F +:1032A0009580141415F983B3504938549C095A82F7 +:1032B00049008828012108E0824190010080100225 +:1032C0004786020260280028000A44848105002005 +:1032D0000808294494206B4802561F8A0F62029006 +:1032E000D42002081D825F4002A42810004C8014E4 +:1032F000801000004231040409010414009024C02D +:10330000015E63C580A0CB2BA302536126E013406E +:10331000000100500014000842168A09828038F427 +:1033200002053988080100150031121D45415980F8 +:103330002400200A00A0400800281442AA2CE3011F +:103340002103B0E8B92802400C4880617C60F81085 +:103350009840A291142481400082C8D942AA9002C8 +:10336000EA06B106C8C242E02A040D05C934204964 +:103370002815173F0280727212009B4603204113EA +:10338000808974454C30A1CA0422A6B0517E020146 +:103390008083922400C8A52E13C58B82EA8862DC44 +:1033A000226A09FE31C5C0D4B109C8805B4004045B +:1033B000A95009F70454337AB848751E84842A004A +:1033C00000245090090008208220884280080100D3 +:1033D0001411040408000D004805120000175A1CBF +:1033E000048987812008B86A0084001540452400BC +:1033F00000000004080045005A15026141490149D6 +:1034000000490005104886000788F7900011CF9CFE +:10341000616E947DC8320B4B9523FCB01F8B03C0AB +:1034200089A800C740273D27A1CE863064CCD3D1E0 +:1034300034C084CF63F52CEB00008E806273D4C05F +:103440003B253E75050EB0EBA4233116FD42AE03BD +:10345000F600A02A394306ACA2A3FC99F73A8100F2 +:1034600093319F50A8120933C9F50281242A8A2179 +:103470000E088A906F90A208142C8555501508A547 +:103480004C00748C081062B005400380005611C0D7 +:10349000408FAE0CF8C7307327FC01F918000AA45E +:1034A00043E00011221C9540C01146282C01082041 +:1034B0008220A02008594A092C0CBB4240089002E7 +:1034C0002150802063095001B800204070B262741E +:1034D000091A08FF0E0243047C07F0006E00000189 +:1034E00000206000000C000000B4004AA900200089 +:1034F000040080204C0215024000404F480A40283A +:10350000F900046080000000000004C00001405089 +:103510000A00A00A01401400002800004A00000030 +:1035200018009726400C0B51000000053DE80CE503 +:10353000F0D440BFFA3E9FC183F2F40072FF2A210B +:103540008FBD101E9C0C91040BCA4810A5C03500FD :10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB +:103560000000000000000000000000040002102025 +:10357000084040810408020420081008210081014D +:1035800004101020084104084810202100102120B8 +:103590004082040020400204102041020010200854 +:1035A00042102040420204082040008104081040DC +:1035B000800408204082040020401084010200841E +:1035C000201084108108420021004084040820401B +:1035D000820400884000000000000000000000009D :1035E00000000000000000000000000000000000DB :1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA -:1036100000000000000000000000000000000000AA -:10362000000000000000000000000000000000009A +:1036000000000000000343FF01100440543B3B0E48 +:10361000278000EC0000000000000000005AB0000D +:103620000402000000003000000000000000000064 :10363000000000000000000000000000000000008A :10364000000000000000000000000000000000007A :10365000000000000000000000000000000000006A :10366000000000000000000000000000000000005A -:10367000000000000000000000000000000000004A -:10368000000000000000000000000000000000003A +:103670000000000000020000000000000000000048 +:103680000800000000000000000000000000000032 :10369000000000000000000000000000000000002A :1036A000000000000000000000000000000000001A -:1036B000000000000000000000000000000000000A -:1036C00000000000000000000000000000000000FA +:1036B0000000000000000000000000000002000008 +:1036C00000000000000000000800000000000000F2 :1036D00000000000000000000000000000000000EA :1036E00000000000000000000000000000000000DA :1036F00000000000000000000000000000000000CA @@ -250806,432 +250806,432 @@ :103770000000000000000000000000000000000049 :103780000000000000000000000000000000000039 :103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 -:103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 +:1037A00000000074020000849037BF0C48898981B2 +:1037B000C948820E001440138000E0C200000E4988 +:1037C000CE800000000020CC000191022848002497 +:1037D0000008E4E000FC05201CA00414601A140199 +:1037E0003021978204032F0003C0011E0447811E6D +:1037F000000580007801E8038800DB0E0400411119 +:1038000012000808881000448440015C000804018C +:103810008878022C506BE8378388DBA1D0382F04DE +:10382000004701324012B0004000000B12105484D7 +:10383000B4D02680824062763C12CE0BA98792B12A +:10384000D3B030961E4D409EC29518211F15B80466 +:103850008B80E4C4930B00110122B34D00D00030E3 +:103860000D0454E054FC00A10D168048901FC000C8 +:10387000040929018C63F10CFC1E2C2E8E94A316D6 +:1038800048A52A1B25C5A3531A347BF320820D00BB +:103890000245A0004030C10000001188A2412AA5C5 +:1038A000013A513BE46DDA2DB6C35FD282D473D0B6 +:1038B0003D67877F334EE8EE9D21DD0EE9D29DD036 +:1038C000DD3B093A48BBF0A3F0C8BD2195808402D6 +:1038D000042482001A680524316030D1241252C1B8 +:1038E00055C068B8338227E2022462F18422321C78 +:1038F000850C4420822090A03164002851789835AE +:103900005C262AC0B581E0B098B62E0F40694043CE +:10391000F00187191800C0028530A1861408004AFA +:1039200040B134131603800D1941DE1032203248A5 +:1039300041E14070402D1735C5014E62343C0E28E0 +:103940002803490881D85044AB14348E46908C48E3 +:10395000032818520C24A2D2F84E123249038EF1D9 +:103960003F4400513FD34FFFF3FFFCFFFF3FFFCF2A +:10397000FFF0E3345228024980080003440C120689 +:10398000D0884000440000B1064E00081008A00393 +:103990002100000826408A00100008508200B07BF9 +:1039A000008548052B0011C12C08001C08C9C00166 +:1039B000026134C4001C6109C001023034000208F5 +:1039C0004111008088C1C2132002258052783AAC90 +:1039D0000004C40001C800004A00844050424C402A +:1039E0003292013D82C2424060D3490060CF499289 +:1039F00027DCA143338880E6606778276226704021 +:103A0000D2419A70001B1482066373E42821FF00E0 +:103A1000200FDF03102C0F79149905052028580872 +:103A2000303FE28091F20004350030110424003070 +:103A3000A092252C2401494110A000440140424796 +:103A4000B097A42525014949C4A00C740148000081 +:103A500004A2229100A08A10240E0290A5A400AD19 +:103A600009C940A0B04360DA1022424056A0035872 +:103A7000CA923319011590B274101411910516D31E +:103A800052344E13048007088102480418234D4223 +:103A9000321048A403820A240487211EE81412026B +:103AA000DFCFC5118D6CD90E1A10CA6643135C4264 +:103AB000EF3F144CCF71F4A0847428020411010963 +:103AC00010245528228850B0A2402FAD24800C80AD +:103AD00021FBE450180894403101010C4240059547 +:103AE00002508141004C0B01048000800000200442 +:103AF000058A4F004105080004010008000040004D +:103B00003A80200002C400259406000801001940F4 +:103B10000808042104000010000840148000008000 +:103B2000010064A0001820520200000008140018D0 +:103B3000094000104AC0444002820B0220001410C9 +:103B400000006000280000200208155243FA91404E +:103B500020410308300202D1910085030902035C71 +:103B6000A1000010800104002003E9000880030088 +:103B7000C34C4001A800E1077406A092280000A4ED +:103B80003BD0019F4041189F2A0FFFC883F14C4052 +:103B9000080000320434C3251008F21914451080BF +:103BA0009148100108800820008620C94030AE48A6 +:103BB0000000A0009CEA0FE10150913A142E280D5C +:103BC000414E44A10FC89637173D8A4FD0438862B3 +:103BD000E30B5ACA596080C820021EB70340108206 +:103BE00000F01400DBCF840347800410000F40ACCA +:103BF000A2052024281069C494204A4850D2317963 +:103C00004FC790209409100C1346546000242A30AA +:103C1000111C044000111002812905040123AA0887 +:103C2000222D30888055C3B010BCE215C382ACD3BE +:103C3000589812B12C63425261252435AD12E8CE5A +:103C40000890ADA832650908C019001B601E12114A +:103C50004746448014182902322C400900201431B0 +:103C6000A2004403600220284C8A31E24F03323A1A +:103C7000F8BD582E9700E1606C2445D8063581C701 +:103C800081922C0139129C40ABF26004BF7C170872 +:103C90000527F0CB18111633948275F15BB402B28C +:103CA00010040C5102A948454228028AC83284688F +:103CB00052582A424C02B1933CC2493B08CFEEE035 +:103CC0008BCCDAA3217D447BD37760ABFD09F9442B +:103CD00008819190AAA50B6B88A7B20AAC80340921 +:103CE000BB04DA9110847C920D000CA493158863B8 +:103CF00080000840851002004A0228634E892399FB +:103D00001407FF0B230F6D71A00000222000000597 +:103D100073C934B9482C764EFDB0450CDFD500F19F +:103D2000404D004D004D001049025C40028081A8CA +:103D300020120C06F33A0890002B404A4023F4303E +:103D4000520A014008B8009560400100210084013A +:103D50000800440410500848019398CA862080083F +:103D6000235255A002272A54040090003448021020 +:103D700000069803EC0CA36915404AA8A0815400E2 +:103D80000402824120000050282412000005028213 +:103D900040A00001000C88428080A4521441015AC6 +:103DA000000000042202228840B0620825420E0072 +:103DB000013011C0140A1A09A986206125E811D121 +:103DC0000A000CE442A1443F1302A14BDD107F1016 +:103DD000395C0E80C8923224C07D6B2D194AFB627B +:103DE00068C0DD3020788400029150102602320134 +:103DF0005CE07354491B0400000F43020000000004 +:103E000016000601002000000410010090848002CA +:103E1000A92028081010B38037A323E340301000F6 +:103E200050049A28B1849C41802430010340053815 +:103E300001144812622624C24C40C498228926CC20 +:103E40004A7390001003942EC0420BD10020FBF95E +:103E500000E80000034190000501000E40007414CA +:103E6000000020C80002E201000470070BC64810E1 +:103E7000660825920401008420081040810408008F +:103E800040810204040820408204010210810800DD +:103E90001000000000000000000000000000000012 :103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 -:103F30000000000000000000000000000000000081 -:103F40000000000000000000000000000000000071 +:103EB0000000000000000000000002041020410289 +:103EC00000102008421020404202040820400081D7 +:103ED0000408104080040820408204002040108420 +:103EE00001020084201084108108420021004084D7 +:103EF000040820408204008840DEFF3BFDCF6F3382 +:103F0000CD9CF4EF212F8BEF43F2103DC70E6E8F47 +:103F1000F6C005CCFF7F2D72C29AB3C9B4B7FF00BB +:103F2000FF03130001040DD4000E8FFF10440401A1 +:103F300014387145796002040000000000000000A0 +:103F40000052A00004020000000020000000000059 :103F50000000000000000000000000000000000061 :103F60000000000000000000000000000000000051 :103F70000000000000000000000000000000000041 :103F80000000000000000000000000000000000031 -:103F90000000000000000000000000000000000021 +:103F9000000000000000000000020000000000001F :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 :103FC00000000000000000000000000000000000F1 :103FD00000000000000000000000000000000000E1 -:103FE00000000000000000000000000000000000D1 +:103FE00000020000000000000000000000000000CF :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 :104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 +:10403000000000000000000000044002000000102A +:10404000000400414454511500000000000000002D :104050000000000000000000000000000000000060 :104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 +:104070000000000000000000000000000000090037 +:10408000000400000000000000000000000000002C :104090000000000000000000000000000000000020 :1040A0000000000000000000000000000000000010 :1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 -:104860000000000000000000000000000000000048 +:1040C0000000000000002B66022BA143000200301C +:1040D000488037805948A8140004002080004042DE +:1040E0000010140292012408280000C484218208D0 +:1040F00020040000AA0008214010040520A008A008 +:10410000203A7C2DD2090B0204221630B3202C4C0D +:104110004013104C6027182460C1281288D0440A2C +:10412000056C4D0480168CE824009446F412D638B1 +:10413000309118C201252080480E2808818804A3E8 +:104140009A88E0BA1DDF0BE6200AF84100000080E3 +:10415000120102440493249A48C00054A8E00A09BA +:104160000005429142A405001508028A9008040443 +:10417000591482409101508050A90080411990EB60 +:10418000FCBFD130138010424400165804048988C3 +:10419000828008CA84110202420044103B62291046 +:1041A00000A08252402822392041400084A0884843 +:1041B0000803C060920400F0E718094BBC42303895 +:1041C00096080A0300C0500360003002000200019C +:1041D0001100800801840040A00080088102118045 +:1041E0008810811011021220013022CA20818B39DF +:1041F0000007BBF2AA0CC4C8075FC80530A51800A9 +:104200009E1A004022000B44814022000248E050E8 +:10421000002044080A004420C0089020010A07003A +:10422000C1416C07912078069021955483132C127C +:104230008874C112444FA53B31C98E300DB80A08AD +:10424000152800217215A471020A2645B47294142F +:1042500054DD108E42861094B87B4B0BD680FEB195 +:104260005ED8328728D3CDA0F069A0E0823744C35E +:10427000C6801C08158405C00A918094DCC80C3ADD +:10428000A080AE10142C2E200072CFF082C00C281B +:10429000103C0042A533DA94328822C3890F211AD8 +:1042A0000CD42029948601530044025A2008820825 +:1042B000A25F0000282044493001500093012400EF +:1042C0008E24002204442804208210120A80400810 +:1042D000140100011013E0004B0053C1101107003E +:1042E000C0102CFA860180088C243828044A0EA3BA +:1042F000D088126E0C07490211420813823238012D +:104300008012B000B2BA23D50C20800890411C085E +:1043100012411C0043C03E2130204064C05068AFB1 +:1043200044240940C6138464002006AC0F6AA01B15 +:10433000507A0028D94940839020874205C0002840 +:104340005305B0494E0001003000080C0D5800A084 +:10435000400210901497C03802081E1019840910EA +:10436000268C08040140A054712D1C42D032AC248C +:10437000E883233882114148A82072041D43DF419D +:104380008E4480430123C5A5A0501096FC35634997 +:10439000E20300C08A39030B02344068D046450D61 +:1043A00051482A415200807B155BC03D6380B05864 +:1043B000BB0C14067E02D824210F39870A640194AD +:1043C0008C28943A90000B81AD6875C909BF80991B +:1043D000602F509E68002CC0FF410044644B1509BB +:1043E0000719411A242C1B0144CAB00298008810F6 +:1043F00021C000A1600150580032B404A0320080F6 +:1044000008DC08D00014101F58DD113E5D432A73EC +:1044100041486D000012080120F448CAD918CBC4E5 +:1044200070933F5C857F32F0446032503CAA840434 +:1044300002CAF88381706B0B14AC48271110F42862 +:104440003615900E4AB1EB1CE680040CC10502D172 +:104450000041750A028E5DC3B58C61B600334D8292 +:1044600042CBB8731B0301C49FC3BA982DF70CCC81 +:1044700082FC214580F6DE158A4C15A081002AB009 +:10448000060589BC40DEE067253AF84E21F3A80C0A +:104490002DB132CE0301011EA0E200057488F38322 +:1044A000CB60C4DB2D114CBD02C4B05A8A0AC0488F +:1044B000630032B0D7002D6085A420BE1C8418058F +:1044C00008401C4258C83C9F10900FAE11A018E93C +:1044D0001336280392B23110C0AD39D20F4C51A41B +:1044E0008C042524858367E107E40F5213FAC2AEDA +:1044F000D201B851FE0E830650200F44400818BB6D +:10450000C08312C480150000824888A2584442101B +:1045100010044DD800421062292240CC12A0D0686D +:10452000C2B4333700ECB0A010DCC312730B50E1FF +:104530006534AB520A818A2C629CCCB4910D0684FE +:104540008692EF6862812A888E5E43DE98A0BA392F +:104550001C07801102800A0A00300C5001544000F0 +:104560000F14C9000480383042010908CA4800927B +:10457000100A982DD44899F04E04F3E70D76C6AC96 +:104580000105140A4B2EAA490A21A0E8146A080959 +:104590008A04C2B04C809301B300E8C2414C084089 +:1045A000088088C1A00640186008004020800930BB +:1045B00020BB384201C0001D0431F704298A802144 +:1045C000B600420B04C20294530BC0727120618189 +:1045D0006C206BA4B8F12AC54041F1110CE31626FA +:1045E000EDCCB261A31002002B1004F81134DC6191 +:1045F000960D0203A8B0738CA7031FEF81009245AC +:1046000068A51F20E04C13004884CA9908954933D7 +:10461000C30548AF3825DC076E701CAC9A9F058532 +:10462000C001422020C5CE24838D008166701D56B6 +:10463000307CC26441D32C0AC9165ACE10400548BA +:1046400020441C168ECB22CB38CB3B02A201326019 +:104650000180C040001C8CA1239E0C510C20498E6F +:104660000622C400009820C2098002010008BF078A +:10467000F14FC602850841481583840120973853BD +:10468000BA01CE0502605C400EA2076F8E85601BEA +:10469000243141084888CE0260F8BE8C14E2853A85 +:1046A00083E388836133A080542036707A8A054280 +:1046B000C16F13A0A07ADA3847CB1E701DB0E1E9B4 +:1046C0001602056201673CEF3E04EDC003E1879CE2 +:1046D000B5470F58C43D40B20081DB103EC4404393 +:1046E000A140C00106B20C4040F0E4748037D147CD +:1046F00079714F082C6C0806810020AA04155A0015 +:10470000C00882037950DE542E5A8D6482C56C6ACB +:10471000261D9C02C18002C4041200AA04010120CB +:1047200054000000CA04806105200180020002815B +:1047300040800002A908A2020002020865F113C32A +:10474000400052207814052293002D830A4000492E +:10475000300604896208481C230238038070470829 +:10476000C10E2204402080001004942280800A019F +:10477000008CAAA111200005524040255214B544D6 +:104780000250901402AA242005294014B4BAE21F52 +:10479000380CC5736F5C25AF0A700778636AC4175D +:1047A0006E337ACF07E01DB4B9761B37063D631F21 +:1047B000A0ECDC2EE1CEA9836A6497EC0A72C435C2 +:1047C0006262D477A3262E4EFCF2C19894CC267256 +:1047D000C6CDA2131899881BB68EBD71BB34D8B94B +:1047E000159B4FDEB0C5F8D4C205DBCB5431B77092 +:1047F000635637AC4976F3362CB57E1B760CB56123 +:10480000FBF4FD4C0E5D89C403E184FD4E3A23099F +:10481000AA93F624BD7E3BF78EB57088E48D2423E1 +:104820005A8EA43100541592060D03414172600165 +:10483000C4101642A280CB040E6415478200424980 +:10484000142D84075C40000001000D1000090FFECC +:10485000300000104011110B410019F00000000061 +:104860000FFF03FFFC420F0000000060000030005B :104870000000000000000000000000000000000038 :104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 -:1048B00000000000000000000000000000000000F8 -:1048C00000000000000000000000000000000000E8 +:10489000000000000000000000CC0033330CCCC34B +:1048A0003330CCCC33330CCCC33330CCCC33330C9F +:1048B000CCC33330CCCC33330CCCC3333002CC003C +:1048C00000000000000000000040000000000000A8 :1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 -:1049000000000000000000000000000000000000A7 -:104910000000000000000000000000000000000097 +:1048E00000000000000000000000000000000CCCF0 +:1048F000C33330CCCC33330CCCC33330CCCC333398 +:104900000CCCC3333002CC000000000000000000DB +:104910000040000000000000000000000000000057 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 :104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 +:1049500000000000000000000000000100444000D2 :104960000000000000000000000000000000000047 :104970000000000000000000000000000000000037 :104980000000000000000000000000000000000027 :104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 +:1049A0000000010000040000000000000000000002 :1049B00000000000000000000000000000000000F7 :1049C00000000000000000000000000000000000E7 :1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 -:104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F -:10519000000000000000000000000000000000000F +:1049E0000000000000000000000000404A0000003D +:1049F0000002000168800081C968A00C0004000367 +:104A00000000C0C200000C498E000C38000000807D +:104A10000C01003828178E00FF08E0E3E0DC0407F3 +:104A200000A0000000080001300100800002010029 +:104A3000020000020000800200008000000100006F +:104A400080000000000040000000000000000004A2 +:104A500000000018608C2603802110000000000078 +:104A6000010000019090240020208012F002A0821A +:104A700040000000020202042AAC156401C0510487 +:104A80000000120800000A8248200000002802A04E +:104A900080000000081410008010028456080000F6 +:104AA000050082AAC8AC80000A8058006E0080C150 +:104AB000206284CA801320008401080000000000E6 +:104AC00040400811000802104402000822000000C3 +:104AD00000800000000A400000144068FE145540A9 +:104AE00014000000800000000003500A00001100C4 +:104AF000000A0000200C5295154501402002802834 +:104B00000500500280504500500A08A002C0612AEA +:104B10006081C0211308C50012C4821C1556800C88 +:104B2000B0000001241210404000089021820202CF +:104B3000020020400020000804000400820080A041 +:104B40001504008851CC0010002322C07812000008 +:104B5000C88328084230208200B6D52C5602B1D036 +:104B60000000000000080000402114004400000183 +:104B70000201CC0C08000108000C21A10400002057 +:104B8000B00A0280318804080400CD0082A8240005 +:104B90003E30A4886BE1066C01002287080001B852 +:104BA000A84A78370B8282A114E401100012400059 +:104BB00000000000000000000002820800903C009D +:104BC0000000F20E3040C9245086B5723348021CF2 +:104BD0001DB00A09311858D8D101CACE2D31A5D03F +:104BE0005C9E13C0816C02E20034583420411023D3 +:104BF000FAE8004B1BB60D41235328B34B0B530669 +:104C0000001126EC2B500958C8CA1269C4E5D11608 +:104C10009804ED80500009800FDB04C2100410D20C +:104C2000EA32430A2D42CB3426B600888AF9313065 +:104C3000709F4B3072C74B430908962B3913CCF643 +:104C4000E3435463723406809273DA50035239B2EC +:104C50008F6AA019A81E000028492B90801C0D887F +:104C600035B4CAA56149544910001E4AAE01011469 +:104C7000702C0D39831CA29A98D61A2B18435B60AE +:104C8000A1AC692325518698319FA46D6D07594BBE +:104C900063802E58E14F0FFE08BB2251C0E0532F16 +:104CA000B684C191ADFC355E262B09A8E1C3F0BCEA +:104CB000931AC201FEE097C046B6310B43A081F3C0 +:104CC000D874D631C1CF56605BB4260124000300EE +:104CD000811C04024000040B12604C240980000077 +:104CE0000004001480020200500000B00008900888 +:104CF0000810000000025062880002C00841000055 +:104D00000144000004110009100001000A00000223 +:104D100090001C1F0002000031005C40400298001F +:104D200000510218044004158B100038D4031010F1 +:104D300008050213C8B40C820020080AB0A00810AD +:104D40000605200890600000980000000B9C007190 +:104D5000D4D403000448880089446A243C284019BC +:104D600022714849C1122202C0A203102003109BE5 +:104D700081AE200888824404000000019C80E6F097 +:104D80001335806E00A3A035D827C4002A30000058 +:104D900000081DF2024633FD2C90472C958E00D062 +:104DA00041ECB4060308003402302802041414CC89 +:104DB000E07283001ACC0EA0C101C084AC814924EA +:104DC000000FA3F23A4009D2210042B4024104325A +:104DD0007E0A4A0005500000000000100424020171 +:104DE0001002601044411020040C40000280082092 +:104DF0000081200D401000080100200094AA00014D +:104E00008150112800140814A44002002210C3C0CD +:104E1000140A020D8170C441413C3282E1C0003C61 +:104E20000000088002011082048210004604000283 +:104E30004010001800024084800500A02800294589 +:104E400090206B480000110004420000D4000008CC +:104E50001102544000A42810004C000480100000EF +:104E6000002104040102EC040005208001544200EA +:104E700000E6820001022C43818C120000010050E8 +:104E800000040000001288000280A900020D290819 +:104E9000000100110010021D454039800400200A65 +:104EA00000A0400800201402AA2CE201000020EC1F +:104EB000382C04400304002000200200B000A400AD +:104EC0001434014011408060A0C20000AC0010000A +:104ED0008881800068FB220003EA000008151200A8 +:104EE0002280108012000A02000000110089404553 +:104EF00040200048002200205150020081E2D203ED +:104F00003400400000400000200002802A68002396 +:104F1000800000000009424009400000A80009018B +:104F20000537D20AB800550880042A0000245090A2 +:104F3000090008208200884280000100141100004E +:104F40000800010048010200001508001189040151 +:104F50002008002A0000001540452400000000043D +:104F6000080045005A150261414901490049000005 +:104F7000004000000010800000100802209800107F +:104F8000052CB04A00229500120E002108BC808535 +:104F9000AC273D27A1CE863024CC03C000110403EA +:104FA000E0210C28C5208E0C8742D20C1A2607451A +:104FB000050690EBF42711026C0150012C0020151E +:104FC0002142472892A30C99F73A810093319F50D0 +:104FD000A8120933C9F50281242A8A210E088A9071 +:104FE0006F90A208142C0554101508A54C0064807D +:104FF00003E022B005400200005010D44097AF01FA +:105000000AC4004127EC419800000E644020F8D704 +:105010009A03854178204240206408128000A02035 +:1050200000114A208808AB424000900021508000C7 +:1050300022015000A000200040A00244141200FFF2 +:105040000E0D00207C07F03C68068071C53001FC25 +:105050000080080C3084044AA9002040040111207B +:1050600014000502400000041C0008289506984022 +:105070008034300003000518000140500A00A00AE7 +:1050800001401400002800004A638000180314083F +:1050900080080A810000FBFD38018805F00000BF90 +:1050A000FA3E9FCF03F000D402FF00010FBD001EA7 +:1050B0009C00602089025E00A40035000420068464 +:1050C0002068D046851428C342811A14142823422C +:1050D0008234210A10850804D18A10A06844468DC4 +:1050E000046842142028D029A1028D0D34D0D1A00B +:1050F000084D046848D1A0210811A123428A342117 +:10510000A1441A1411A34D1A10D0A0084210A143B3 +:10511000421234282342028D04285142841428214B +:10512000428A1420A140D084051A008420D084D063 +:1051300085284200A1034684346823468A34608867 +:1051400044C2BD24A942CD034E7C310B0416C5B325 +:105150001090409E4F221487600080CC01212D507A +:10516000010C3189B4C19400BD01C1C00204097CA5 +:10517000000C8C00501500051527D1032DB00054EC +:105180000F303FFC0000F000005AB0066000000045 +:10519000000080000000000000000000000000008F :1051A00000000000000000000000000000000000FF :1051B00000000000000000000000000000000000EF :1051C00000000000000000000000000000000000DF :1051D00000000000000000000000000000000000CF -:1051E00000000000000000000000000000000000BF +:1051E00000020000000000000000000008000000B5 :1051F00000000000000000000000000000000000AF :10520000000000000000000000000000000000009E :10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E -:10523000000000000000000000000000000000006E +:10522000000000000000000000020000000000007C +:105230000000000008000000000000000000000066 :10524000000000000000000000000000000000005E :10525000000000000000000000000000000000004E :10526000000000000000000000000000000000003E @@ -255039,295 +255039,295 @@ :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 :1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 -:1040E00000000000000000000000000000000000D0 -:1040F00000000000000000000000000000000000C0 -:1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F -:10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F -:10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E -:10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC -:10441000000000000000000000000000000000009C -:10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C -:10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 +:104020000000000000000471014440470411111514 +:1040300054455551555455550444411110444411AB +:10404000110444411110444411110444411110441D +:10405000441111044441111044441111044441110C +:104060001044441111044441111044441111090435 +:1040700041141044441111044441111044441111DD +:1040800004444111104444111104444111104444AA +:104090001111044441111044441111044441111000 +:1040A0004444111104444111104444111104444189 +:1040B00011104444111122654A89206C98B6070DED +:1040C0006F81ADC1C968B284008D88838000F8CB50 +:1040D000000084488E610428010024C48D31803A98 +:1040E0002007A220FF0A20E3E01C048704B045D982 +:1040F00021112406900992CE142325801A04064B20 +:104100000D12C34B0430C1067801FA03F80CFFA569 +:10411000140643557280681AAB1403488D524F64DD +:10412000212C364288FA72A94CAFAA3EABCA5AB2C9 +:1041300060BC3F1C20E4C49BF012A40040000009B6 +:104140005212A6C43EFE37F543CA70769C16CA0DBD +:1041500040839AD143B410B60E6A028ED0049831CF +:104160009B16BA09D390E6EC50ED00498D21B3EFD0 +:10417000E8FEB63C1F8098F16E905FE90C0CC42DF0 +:10418000D0DFE063A70B7D094A50D1485D462D245E +:104190008586B35AE861AE0D74C99322593018D29E +:1041A00038EB4A6CC25458EDFE32FDC4D4B29D982F +:1041B000E73C0A454FBF501E1C003000000A0002B9 +:1041C000A2FC52D531458B40A0568868AD02D1463D +:1041D0008AD0AD14D15A1DA2851FF0EAF0DFBD2BA5 +:1041E0008848C50016F48A1C1F7EC76CB12030DFDA +:1041F0006436FAC1D45069B8D7AE3E4646F460DDA5 +:104200002CFA311AADCD5561BFA0D5A535AD81874A +:10421000515290FFF834A6C9D5E3C0D8D4FF2AA7DD +:104220008331232610BFF73F560AB1F3A774E64F38 +:1042300036CF4F79F011F43BC232A84D9F719E14D6 +:1042400078043B7844AF61F7346D7314BDC7FEE268 +:104250009198BEE63ED7CD9CC3AFEC5EBE36FCCB9C +:1042600067B30E3C512436CD8A95E3FEFCECFE3F4D +:10427000DFCF8FD2BDFCB928001340000000000042 +:10428000000000000002E73876B83ED9849CF3476E +:1042900054EC5B36FF8EF7F37F788AAD1FFA4B0F35 +:1042A000713AF8DBDB2DDA8EAFF3AF585C8E134436 +:1042B0008B6FA0BF2C3F0D3F7A4539A3FFE4315DE2 +:1042C0003BFF4D61E3777CFF7F1D774F4C51EEFC48 +:1042D0007F581B59CDFB73EFE4EDFB17FD86FD9076 +:1042E000D2783FED0FFFC4C291CE94DFAA36D7CF6C +:1042F0007D73DF7432F62CBD8ABB73FB74FF6B3B9E +:1043000076C76BF32BDC77AB3993CDF6E3E3F0772D +:10431000773F66CDFAF3DFF0935A3DF08F6BE3F908 +:10432000A83FFF1A2A4F6FF17128B76B37BFCEB580 +:10433000E14F7C7D723FFF4EBFF101DC616D3DBD01 +:1043400087BDE2FA5CDEBE3FBDC77BE3B7FCEF771B +:104350002D5BC7FDB3BFB4EDED177B4FE7A12EFC7E +:10436000E56F0FFE4C3B22D9D0FDCB2FF78AF3939C +:10437000BDFC7D7B2F6F4BFAF1F7FCF6031AC341AE +:10438000FFE1BFD4DEF60F1BCB96D16BF0FCD63726 +:10439000658F5EE37F9C64132510020991144CA67F +:1043A000452245065A40D8B4C9022CAC859DF17708 +:1043B000ACFF9232FDCDFFF1CF7CFB3B1E7B8F9497 +:1043C00073FF54FFFD37FFC8FFF17F58CDDF2CCFBF +:1043D0000F7DE3BF30FD370E3EC961F102983E62AA +:1043E0002AA8C2C8E39A0C751B0EF68B2BD0A30823 +:1043F00085D531918A16C159D44542110C8D169339 +:10440000D9B4ACC535AF4B5ED1A63C100E21200807 +:104410009B604020B080280003DE03F5DCD73F28F6 +:10442000D7489F208B4C6E253E2A4099A2FB48D945 +:1044300041122282E0A357B0281239DB8BAE2188CB +:10444000A8B6C6056D40C291DCD46EFC1B710B6F23 +:1044500000A3B039F82FEC420A30042080081DF385 +:104460004AFFF3FD34D1672C958F02D0D7BCB566D7 +:104470001BCEC17F93112812861C354EF073EB8042 +:104480009ACE2FB4CDCFE0B4FC95C535750FA3D22D +:104490003E4C2BF63B5242FF4363DC7EFE3EEE4831 +:1044A000CFD1DE74AAE12BD8C776E127188E501938 +:1044B00042C0B8E1B54C77DF3A920CF7F3977CCD68 +:1044C000D63E2E4909F13FF0F7EA0EF98570733BAD +:1044D000583F2D1CE74DF331AF9852F717FB8BEF88 +:1044E0005167F857DA3F7ACFF990CCFCD9353CD5F3 +:1044F000027D9010C0D15000F34E8883572459029A +:10450000048743FE8047987309227DCCFCA17E6C12 +:1045100042973FF34EE790BAD4CD431E7FC65EE28A +:1045200012EC3EBC1DC88205A27FDC6BD729D78761 +:10453000BFF3769C908025E6415CF3D580A9CA3F05 +:10454000838A6FF15ED092392630C2D87195B43D1E +:10455000EF1FEAC99AB3383C364D2D4EC34573114F +:104560009810C61FF5451F801408391A13A54B4E25 +:1045700013BADC62BB3DE6075DE0FFE8FA293FF2D3 +:10458000053F226DA0F34A0EFB4FE0F1FCA4B5D825 +:1045900033F7885411A34C03FA12FC439EA29224D1 +:1045A000734002858B0CB2ABB8DD1F0176C2765327 +:1045B0005BDC9A3F23264F538289605DC62DA3CAD8 +:1045C0006FB2922C53530F33CC61F1B1B4C2053E9C +:1045D0001BCFAFE0ABC0EAF52BFF0DFA53F7C07964 +:1045E000F529DB8058E3BFBCABCF0BFF8DC4F26A6B +:1045F000B8ECD53CE304BA12D8A45ED22926CE3654 +:10460000D304882EA1348D00B6511CDC8DA30F027B +:1046100048E3821A1035CE01198B8C21B488BCAACC +:104620003EF60B1763ED34B9D82ED74EFCB0450CCF +:10463000DFD70251414DB14DA44DA415514AD3616C +:1046400019E4DC0F3D11CF90A3FE4C7BC431FF4B2E +:104650007E23F6447FCB0CDC8FEB20B508673F2729 +:10466000A1CE86316CCC03D502280E1361F39CE8F1 +:10467000C71C8F8CF743D1C49F7D3ED50527B0EB77 +:10468000F46B33226D47F1612C08A27F3F4346B89B +:10469000A2A7FC99F73E8B45B3319FD0E8B61B33F8 +:1046A000C9FD128B64ABBF23CF0C8AB2EF98E75AD7 +:1046B000346D0D5C52B7C8B55C3B668338603AB464 +:1046C0002F601A9DCB5A71D714979F333AC4CF43AA +:1046D0007FEC6F8527404CD950ECEC779F1BB7C916 +:1046E0007B817E3CB26F2D208AA2A26668377B0454 +:1046F0001BCBEF6240A8902B2DFDC8116319FCC5A0 +:10470000BA353C02ECA172E4051300FF0E01412012 +:104710007C07F13C7A0686714520C3FC35580904B4 +:1047200083EC804ABF226A4A1C11A7A0C70035AAA1 +:104730004054C2295C34102EDB829CE0C194900C62 +:10474000194045E8005578516A16A2CA2D42D4583E +:104750000AA8224442238020C863962AE6082AC178 +:104760001430FBFD3D284825F2504CBFFF3F9FCF42 +:1047700007F2943412FF28270FBFC03F9C1C9C24D3 +:10478000CFC37E32E4A435AB00200000000000005F +:104790000000000000010200040820408204010221 +:1047A000108108001000000000000000040802044E +:1047B000200810082100810104101020084104087D +:1047C00048102021001021204082040020400000D9 :1047D00000000000000000000000000000000000D9 :1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 -:104850000000000000000000000000000000000058 +:1047F00000000000010200842010841081084200A3 +:1048000021004084040820408204008840F7EF160D +:10481000FECDFF73C2FCF9DE1EDFC7FF93C1ECF3D0 +:104820000F37FFCFB710FB0CFF3F3E77C3FFF01FE2 +:10483000F8FBFA07FF43D0C3F1000C0B00080FFF91 +:104840002040045040198C426C50026C0000000063 +:1048500000000000004A9000040200000000300048 :104860000000000000000000000000000000000048 :104870000000000000000000000000000000000038 :104880000000000000000000000000000000000028 :104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 +:1048A0000000000000000000000000000002000006 :1048B00000000000000000000000000000000000F8 :1048C00000000000000000000000000000000000E8 :1048D00000000000000000000000000000000000D8 :1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 +:1048F00000000000000200000000000000000000B6 :1049000000000000000000000000000000000000A7 :104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 :104930000000000000000000000000000000000077 -:104940000000000000000000000000000000000067 -:104950000000000000000000000000000000000057 -:104960000000000000000000000000000000000047 -:104970000000000000000000000000000000000037 -:104980000000000000000000000000000000000027 -:104990000000000000000000000000000000000017 -:1049A0000000000000000000000000000000000007 -:1049B00000000000000000000000000000000000F7 -:1049C00000000000000000000000000000000000E7 -:1049D00000000000000000000000000000000000D7 -:1049E00000000000000000000000000000000000C7 -:1049F00000000000000000000000000000000000B7 -:104A000000000000000000000000000000000000A6 -:104A10000000000000000000000000000000000096 -:104A20000000000000000000000000000000000086 -:104A30000000000000000000000000000000000076 -:104A40000000000000000000000000000000000066 -:104A50000000000000000000000000000000000056 -:104A60000000000000000000000000000000000046 -:104A70000000000000000000000000000000000036 -:104A80000000000000000000000000000000000026 -:104A90000000000000000000000000000000000016 -:104AA0000000000000000000000000000000000006 -:104AB00000000000000000000000000000000000F6 -:104AC00000000000000000000000000000000000E6 -:104AD00000000000000000000000000000000000D6 -:104AE00000000000000000000000000000000000C6 -:104AF00000000000000000000000000000000000B6 -:104B000000000000000000000000000000000000A5 -:104B10000000000000000000000000000000000095 -:104B20000000000000000000000000000000000085 -:104B30000000000000000000000000000000000075 -:104B40000000000000000000000000000000000065 -:104B50000000000000000000000000000000000055 -:104B60000000000000000000000000000000000045 -:104B70000000000000000000000000000000000035 -:104B80000000000000000000000000000000000025 -:104B90000000000000000000000000000000000015 -:104BA0000000000000000000000000000000000005 -:104BB00000000000000000000000000000000000F5 -:104BC00000000000000000000000000000000000E5 -:104BD00000000000000000000000000000000000D5 -:104BE00000000000000000000000000000000000C5 -:104BF00000000000000000000000000000000000B5 -:104C000000000000000000000000000000000000A4 -:104C10000000000000000000000000000000000094 -:104C20000000000000000000000000000000000084 -:104C30000000000000000000000000000000000074 -:104C40000000000000000000000000000000000064 -:104C50000000000000000000000000000000000054 -:104C60000000000000000000000000000000000044 -:104C70000000000000000000000000000000000034 -:104C80000000000000000000000000000000000024 -:104C90000000000000000000000000000000000014 -:104CA0000000000000000000000000000000000004 -:104CB00000000000000000000000000000000000F4 -:104CC00000000000000000000000000000000000E4 -:104CD00000000000000000000000000000000000D4 -:104CE00000000000000000000000000000000000C4 -:104CF00000000000000000000000000000000000B4 -:104D000000000000000000000000000000000000A3 -:104D10000000000000000000000000000000000093 -:104D20000000000000000000000000000000000083 -:104D30000000000000000000000000000000000073 -:104D40000000000000000000000000000000000063 +:10494000000000000000000000003FCF8FFFF3FCDC +:10495000FCFFFF2AABCAAAA2AAA8AAAA3FFFCFFFC0 +:10496000F3FFFCFFFF3FFFCFFFF3FFFCFFFF3FFF25 +:10497000CFFFF3FFFCFFFF3FFFCFFFF3FFFCFFFF85 +:104980003FFFCFFFF3FFFCFFFF3FFFCFFFF3FFFC35 +:10499000FFFF37FFCFFFF3FFFCFFFF3FFFCFFFF32A +:1049A000FFFCFFFF3FFFCFFFF3FFFCFFFF3FFFCF09 +:1049B000FFF3FFFCFFFF3FFFCFFFF3FFFCFFFF3FD5 +:1049C000FFCFFFF3FFFCFFFF3FFFCFFFF3FFFCFF35 +:1049D000FF3FFFCFFFF3FFFCFFFF1102CF54D223B5 +:1049E00044086423F8CC42B067FC096700F3005820 +:1049F000C000247C8028670CC3B0828450D012028F +:104A00004098018EF8EA413D00C416301FA81FF8F7 +:104A100003FFCC40908800904C066A810A10D5486C +:104A2000440B102A808AA02A9002A40001020122CD +:104A3000010000100880802200480001102240027E +:104A400000812224024A0521464080408420110032 +:104A50004401304249C02808004482928007A440A3 +:104A6000400000840E01093C4100080201758008E5 +:104A70004032033014480F00604089902038818113 +:104A8000014A408508384180A0720394181014A48C +:104A900007B0801004004103A04023008000001EE6 +:104AA0000005001002200018E8210A8421000C20D3 +:104AB000222010924021002100084130800408008B +:104AC00000808008071E009121BC04000100020A3A +:104AD00000414060B680050A8043E248049211120A +:104AE000490E202000244A10119441C060638C3884 +:104AF000C70671838C70C718718E08E30120427E4F +:104B000040000620008084000004E2022080409AD9 +:104B1000E0128411BD1A118468431CE48141200213 +:104B20000A4B01800025883007022C92C2588BFA6C +:104B30001F1640C0330000800000024044C00090B7 +:104B4000000020000110310000009C08F0078000E8 +:104B50001008408600180010010B0C206110610342 +:104B60000000018001000938001A22000000000046 +:104B700028CA0000010000000000030182120C009E +:104B800050000180202020000002000001080124C4 +:104B90000001640482404000409003860034C0005D +:104BA0000000000000000000000386080102000071 +:104BB0004003000004040002108000000000000018 +:104BC000000000001008000000000000200080002D +:104BD000000000320000000800000000000000009B +:104BE00000000000080000000001000000000100BB +:104BF0000000020000000080400080000000001063 +:104C000000000400F93080000000040000200000D3 +:104C1000060020000000400040100000400000009E +:104C200000000800000008000000200120400C44A3 +:104C3000401000834000000C000100000000020052 +:104C40000440000000000020100200006F0000007F +:104C500000800008200800000000000000000004A0 +:104C6000000000000002000000020000020808002E +:104C7000080000000000000000800420200008015F +:104C800000200800000000010200000000000000F9 +:104C900000020000040000010001040400410002C1 +:104CA000000006000000000000100CF800000000EA +:104CB0000000010000000200000034040C000A02A1 +:104CC00001000400000000060201186C1D00000134 +:104CD000002C40B184090620F040424000182058C2 +:104CE00000B00000210870961801090200C30000FE +:104CF00003C002068C3300000800000808020F0100 +:104D0000028014020000802002020CC00203800016 +:104D10001002008800C8087000B0200080921900BE +:104D200041000020006000000000010000000000C1 +:104D3000030800040010000000000000060000014D +:104D4000A0000004058002210020010400100000E2 :104D50000000000000000000000000000000000053 -:104D60000000000000000000000000000000000043 -:104D70000000000000000000000000000000000033 -:104D80000000000000000000000000000000000023 -:104D90000000000000000000000000000000000013 -:104DA0000000000000000000000000000000000003 -:104DB00000000000000000000000000000000000F3 -:104DC00000000000000000000000000000000000E3 -:104DD00000000000000000000000000000000000D3 -:104DE00000000000000000000000000000000000C3 -:104DF00000000000000000000000000000000000B3 -:104E000000000000000000000000000000000000A2 -:104E10000000000000000000000000000000000092 -:104E20000000000000000000000000000000000082 -:104E30000000000000000000000000000000000072 -:104E40000000000000000000000000000000000062 -:104E50000000000000000000000000000000000052 -:104E60000000000000000000000000000000000042 -:104E70000000000000000000000000000000000032 -:104E80000000000000000000000000000000000022 -:104E90000000000000000000000000000000000012 -:104EA0000000000000000000000000000000000002 -:104EB00000000000000000000000000000000000F2 -:104EC00000000000000000000000000000000000E2 -:104ED00000000000000000000000000000000000D2 -:104EE00000000000000000000000000000000000C2 -:104EF00000000000000000000000000000000000B2 -:104F000000000000000000000000000000000000A1 -:104F10000000000000000000000000000000000091 -:104F20000000000000000000000000000000000081 -:104F30000000000000000000000000000000000071 -:104F40000000000000000000000000000000000061 -:104F50000000000000000000000000000000000051 -:104F60000000000000000000000000000000000041 -:104F70000000000000000000000000000000000031 -:104F80000000000000000000000000000000000021 -:104F90000000000000000000000000000000000011 -:104FA0000000000000000000000000000000000001 -:104FB00000000000000000000000000000000000F1 -:104FC00000000000000000000000000000000000E1 -:104FD00000000000000000000000000000000000D1 -:104FE00000000000000000000000000000000000C1 -:104FF00000000000000000000000000000000000B1 -:1050000000000000000000000000000000000000A0 -:105010000000000000000000000000000000000090 -:105020000000000000000000000000000000000080 -:105030000000000000000000000000000000000070 -:105040000000000000000000000000000000000060 -:105050000000000000000000000000000000000050 -:105060000000000000000000000000000000000040 -:105070000000000000000000000000000000000030 -:105080000000000000000000000000000000000020 -:105090000000000000000000000000000000000010 -:1050A0000000000000000000000000000000000000 -:1050B00000000000000000000000000000000000F0 -:1050C00000000000000000000000000000000000E0 -:1050D00000000000000000000000000000000000D0 -:1050E00000000000000000000000000000000000C0 -:1050F00000000000000000000000000000000000B0 -:10510000000000000000000000000000000000009F -:10511000000000000000000000000000000000008F -:10512000000000000000000000000000000000007F -:10513000000000000000000000000000000000006F -:10514000000000000000000000000000000000005F -:10515000000000000000000000000000000000004F -:10516000000000000000000000000000000000003F -:10517000000000000000000000000000000000002F -:10518000000000000000000000000000000000001F +:104D6000000000000800000000000000200000001B +:104D700000000600000008400000000004000210CF +:104D800000001100000000000020080001000100E8 +:104D900000000000044300C11000000020020800D1 +:104DA00000000000000000000008000000000100FA +:104DB0000000000000000000000800001003004098 +:104DC0000000004624004D00000000020C0C40E8EA +:104DD000A0234C32E1C872324F3C08000780082003 +:104DE0000097E03F400001080000600410880005C3 +:104DF00081D011682090900008400000000000A3BE +:104E00003C000E0020CA0088003226889020003026 +:104E100020000000000070000008100000000000EA +:104E20000300000000000180800020040000010455 +:104E3000000062103000044000000001FC0030005F +:104E4000044BF00104B460700068412811100000A8 +:104E500020070C4C000236040800200001F010006E +:104E600000800600004026004C00162405294871E9 +:104E7000200500108410284102906000920F3988AC +:104E800000014033601F02140DC100801C08428ED7 +:104E900010E3C01800493024AE00508540000038AF +:104EA000249810400500604020404909800080019E +:104EB000100C0110010400808006080080009000A2 +:104EC0001802821040400200820C000000143001E1 +:104ED0000B8120501610882609010912000B0004CE +:104EE00043081F480022000071C006000010200087 +:104EF0000000000000000000000006800008000024 +:104F000000000000000B400000000000A8000800A6 +:104F100040000000E8024400120626C0047C401055 +:104F2000010000E08306BC16A20203881CB3C10086 +:104F300038000300C0010000001D080008880002BE +:104F4000601C022E0000003DC0474C940600200467 +:104F500008008F0014BD074843D303D300D30000DB +:104F6000044802100018800000300800016800109A +:104F70000021C0060051293000180021000003085C +:104F8000EC000700E903A400000028000004400032 +:104F900011C10800C401A00C488000C40080000CAE +:104FA0000C004000880000000003F0100800003FE3 +:104FB00018D000022180000010098000000001309C +:104FC000980000000013018000601218000A3800E9 +:104FD000024CB0003D1047C16000000C020013807D +:104FE0004012460015C80260405180400087881179 +:104FF0000CCC40C184400082000008004030E054E6 +:105000008108D4007800C03860E418098008E17095 +:1050100000039C0000080683DC04F70021528A8804 +:105020003247C440A0144D0803800E0CEB743D00C1 +:10503000C1FAF0FF80FFFF0201C17D8232CC7E0306 +:10504000008FC47A21BA3CB7FB0121C1F0F060E0C7 +:1050500000000D1ECF0C00C0008182200009461206 +:10506000A408092000890C449103E4F21E21E40EF7 +:1050700043C03C8420791DBBCF38F3E3B418FF1143 +:10508000514FFE20610C0403065C861600B2B4404A +:1050900005014000FC032E480B00195AC04293E161 +:1050A000400891048A025011B4947E1004250C84A7 +:1050B00020C9904C9924C9824C91326464C8264C12 +:1050C0008264C1321099080493021320C84C4C9991 +:1050D00004C9826420C990C9210C990924909324A1 +:1050E000084904C849932021301321264C8264C307 +:1050F000264C326413264932619324084213264613 +:10510000426264C8264C0C9904C9924C9864C92622 +:105110004C8264C3264C9084193240842090849041 +:105120009908424321324C8464C9264C8264C08869 +:105130004C397A2A61CA90A29A54D4170204812D5C +:1051400053B02002C410518A76C00004F2AA164A55 +:105150004134F3C018F62505A2021210000047F4EE +:105160001017CC005100102015007F4BBBA040CC85 +:105170000F203FFC0000F00000FFF00000000000E6 +:10518000000010000000000000000000000000000F :10519000000000000000000000000000000000000F :1051A00000000000000000000000000000000000FF :1051B00000000000000000000000000000000000EF :1051C00000000000000000000000000000000000DF -:1051D00000000000000000000000000000000000CF +:1051D0000002000000000000000000400800000085 :1051E00000000000000000000000000000000000BF :1051F00000000000000000000000000000000000AF :10520000000000000000000000000000000000009E -:10521000000000000000000000000000000000008E -:10522000000000000000000000000000000000007E +:10521000000000000000000000020000000000008C +:105220000000004008000000000000000000000036 :10523000000000000000000000000000000000006E :10524000000000000000000000000000000000005E :10525000000000000000000000000000000000004E @@ -255624,295 +255624,295 @@ :10648000000000000000000000000000000000000C :1064900000000000000000000000000000000000FC :1064A00000000000000000000000000000000000EC -:1064B00000000000000000000000000000000000DC -:1064C00000000000000000000000000000000000CC +:1064B000000000000000000800000000800000262E +:1064C0006409999266649999000000000000000038 :1064D00000000000000000000000000000000000BC :1064E00000000000000000000000000000000000AC -:1064F000000000000000000000000000000000009C +:1064F000000000000000000000000000000010008C :10650000000000000000000000000000000000008B :10651000000000000000000000000000000000007B :10652000000000000000000000000000000000006B :10653000000000000000000000000000000000005B -:10654000000000000000000000000000000000004B -:10655000000000000000000000000000000000003B -:10656000000000000000000000000000000000002B -:10657000000000000000000000000000000000001B -:10658000000000000000000000000000000000000B -:1065900000000000000000000000000000000000FB -:1065A00000000000000000000000000000000000EB -:1065B00000000000000000000000000000000000DB -:1065C00000000000000000000000000000000000CB -:1065D00000000000000000000000000000000000BB -:1065E00000000000000000000000000000000000AB -:1065F000000000000000000000000000000000009B -:10660000000000000000000000000000000000008A -:10661000000000000000000000000000000000007A -:10662000000000000000000000000000000000006A -:10663000000000000000000000000000000000005A -:10664000000000000000000000000000000000004A -:10665000000000000000000000000000000000003A -:10666000000000000000000000000000000000002A -:10667000000000000000000000000000000000001A -:10668000000000000000000000000000000000000A -:1066900000000000000000000000000000000000FA -:1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E00000000000000000000000000000000000AA -:1066F000000000000000000000000000000000009A -:106700000000000000000000000000000000000089 -:106710000000000000000000000000000000000079 -:106720000000000000000000000000000000000069 -:106730000000000000000000000000000000000059 -:106740000000000000000000000000000000000049 -:106750000000000000000000000000000000000039 -:106760000000000000000000000000000000000029 -:106770000000000000000000000000000000000019 -:106780000000000000000000000000000000000009 -:1067900000000000000000000000000000000000F9 -:1067A00000000000000000000000000000000000E9 -:1067B00000000000000000000000000000000000D9 -:1067C00000000000000000000000000000000000C9 -:1067D00000000000000000000000000000000000B9 -:1067E00000000000000000000000000000000000A9 -:1067F0000000000000000000000000000000000099 -:106800000000000000000000000000000000000088 -:106810000000000000000000000000000000000078 -:106820000000000000000000000000000000000068 -:106830000000000000000000000000000000000058 -:106840000000000000000000000000000000000048 -:106850000000000000000000000000000000000038 -:106860000000000000000000000000000000000028 -:106870000000000000000000000000000000000018 -:106880000000000000000000000000000000000008 -:1068900000000000000000000000000000000000F8 -:1068A00000000000000000000000000000000000E8 -:1068B00000000000000000000000000000000000D8 -:1068C00000000000000000000000000000000000C8 -:1068D00000000000000000000000000000000000B8 -:1068E00000000000000000000000000000000000A8 -:1068F0000000000000000000000000000000000098 -:106900000000000000000000000000000000000087 -:106910000000000000000000000000000000000077 -:106920000000000000000000000000000000000067 -:106930000000000000000000000000000000000057 -:106940000000000000000000000000000000000047 -:106950000000000000000000000000000000000037 -:106960000000000000000000000000000000000027 -:106970000000000000000000000000000000000017 -:106980000000000000000000000000000000000007 -:1069900000000000000000000000000000000000F7 -:1069A00000000000000000000000000000000000E7 -:1069B00000000000000000000000000000000000D7 -:1069C00000000000000000000000000000000000C7 -:1069D00000000000000000000000000000000000B7 -:1069E00000000000000000000000000000000000A7 -:1069F0000000000000000000000000000000000097 -:106A00000000000000000000000000000000000086 -:106A10000000000000000000000000000000000076 -:106A20000000000000000000000000000000000066 -:106A30000000000000000000000000000000000056 -:106A40000000000000000000000000000000000046 -:106A50000000000000000000000000000000000036 -:106A60000000000000000000000000000000000026 -:106A70000000000000000000000000000000000016 -:106A80000000000000000000000000000000000006 -:106A900000000000000000000000000000000000F6 -:106AA00000000000000000000000000000000000E6 -:106AB00000000000000000000000000000000000D6 -:106AC00000000000000000000000000000000000C6 -:106AD00000000000000000000000000000000000B6 -:106AE00000000000000000000000000000000000A6 -:106AF0000000000000000000000000000000000096 -:106B00000000000000000000000000000000000085 -:106B10000000000000000000000000000000000075 -:106B20000000000000000000000000000000000065 -:106B30000000000000000000000000000000000055 -:106B40000000000000000000000000000000000045 -:106B50000000000000000000000000000000000035 -:106B60000000000000000000000000000000000025 -:106B70000000000000000000000000000000000015 -:106B80000000000000000000000000000000000005 -:106B900000000000000000000000000000000000F5 -:106BA00000000000000000000000000000000000E5 -:106BB00000000000000000000000000000000000D5 -:106BC00000000000000000000000000000000000C5 -:106BD00000000000000000000000000000000000B5 -:106BE00000000000000000000000000000000000A5 -:106BF0000000000000000000000000000000000095 -:106C00000000000000000000000000000000000084 -:106C10000000000000000000000000000000000074 -:106C20000000000000000000000000000000000064 -:106C30000000000000000000000000000000000054 -:106C40000000000000000000000000000000000044 -:106C50000000000000000000000000000000000034 -:106C60000000000000000000000000000000000024 -:106C70000000000000000000000000000000000014 -:106C80000000000000000000000000000000000004 -:106C900000000000000000000000000000000000F4 -:106CA00000000000000000000000000000000000E4 -:106CB00000000000000000000000000000000000D4 -:106CC00000000000000000000000000000000000C4 -:106CD00000000000000000000000000000000000B4 -:106CE00000000000000000000000000000000000A4 +:10654000000000000000007E00000305E8DEBB162E +:10655000068AD5A2EC008316150E0C15E154F0E264 +:106560005504168AF7406140880630EE0001D0439A +:1065700084101012000F7570007C60002E000A005D +:10658000701DB4453A019F4881033EA01208041DC6 +:106590004007501D4411510284848091A4848004DA +:1065A00002420200002420100001210F0800918007 +:1065B0008841008ACC08800C101C7039C300EDF0B3 +:1065C0003E0081461A130131000010804000000592 +:1065D000880289106EB835C50C0051CD3C2C4A2973 +:1065E0001DC7E0914E68B9621E80C053A35FC854B6 +:1065F0009F04F484DAC3D81C2F692180081072EB41 +:1066000088B8A2311B8712A0457844B33E72873800 +:10661000A11764210337598EF7B35EB4EA161A7FC7 +:10662000CE6AD293549AB529ABC2C5928C585B5DA1 +:106630000130088841E0088D6A3359480810AAC81B +:10664000A9461D1E8B32125E846DC02DB6C027D3A5 +:10665000D6945ADA3DD5CB0F10560860AC04C1462B +:106660000AC0AC14C1582602807D62B1ECBC9525ED +:1066700079CEA7D14B44935111468A1002B8C06518 +:106680002416B3424EF2A8B083E8176E468BA15988 +:1066900064695018A587E2708E94788018F4822C73 +:1066A00090532CA7EF04D2C0A7C0113C16AC1BCE50 +:1066B000883E4032F8BFE33E8680353242989BEDFB +:1066C0000D00C1E782AC00811529E08404E1EF8868 +:1066D0009C0A01800278220898389912E0812612DB +:1066E0004A58113328D8801C01556414421360099C +:1066F000161077702B6F0827029001201420203489 +:10670000160D49612B80C051000A000000000000F6 +:106710000000000000001050B94825268B0A025ADC +:10672000A4148A2A54C5E98216F4461A015C015061 +:10673000B2587CA9F60850016151A37011212C8830 +:106740004491B32AD0C35E031B8EE2D17A3408830E +:10675000182B0EEA125B0C16FF025B0B8232160836 +:106760000FBA28D2C85DF2DEB46C2030AB832D2086 +:1067700004BC499E0E7BCE8181D518BFC01A214E24 +:106780003EF2C16C44B01E9108715157346E5817D7 +:10679000360E5850B094AFD524AD02CDD2F6108B42 +:1067A000CC257B461581321015AD370944D6D27EF3 +:1067B00054FE943D1C4B2653C0907EF525854FF921 +:1067C000618A04F0AD22BCC7794117E422AA1E42B7 +:1067D000C16FE26998961F016F8A5841DE345FA14C +:1067E0000C39445791A56C6969225A4B8B72392434 +:1067F00016B11A068355C129207F6507E3CF5DC016 +:106800002D6812352CFB4E3E026B48AB681CA80469 +:1068100035822A9C25B53E0EC697325DA454632E60 +:10682000B4CD83C32EEC8EE62328877241D5908B9E +:106830006A35E500F743A10003D424550AA1218459 +:10684000345514128AC5D550E724B5422A800EDA91 +:10685000E354C451252B55446320BDF45220153117 +:1068600042CC71CA20289A3C14CAC0910254DA035F +:1068700030C509B12199C418AC24150C0631D0C813 +:10688000200206CF88CF507790960A044100082056 +:106890002020835A3A1703C2B28930148206B28488 +:1068A0000C0152D076CA34A9026521850404251D45 +:1068B000614459110414C948051803514034040DAA +:1068C000F01E024426E0FA002448160D0D50220462 +:1068D0004CCB09209284BA312650492A3DD6CD911D +:1068E00020128804A23401050C01911C4B2A044E8D +:1068F0004ECCD218C8A40004CD829191C8D0814D4D +:106900002D02C18C8284045421018C880951B9481C +:1069100005000E714E9E2321448AD11D948C442083 +:106920000208197B2EE1422D820934D5D5355DC58B +:106930007062E6B882740523426363AA2014EA1ADF +:1069400094050143F938380D3C060F3EB19230E80A +:10695000C5300E8849F2000055CC07F14B12F31CEC +:106960007440B12ED4470980DFEC4B8304F8CBF39D +:10697000727A3CC6F91022C182F1715030CE13BB3D +:1069800004AA011030B59E34B2CDFF429B449B3621 +:1069900008E4887CF28AEC4DD61459C4309356280A +:1069A0005550113885868034848E541A53011C2129 +:1069B00048008A492E9E0A1A01B7D88D012CF3830C +:1069C0007233BB48D5570A374404C2965829A000F1 +:1069D000950D2E827C1049F214A44504A24348D29E +:1069E0009400A54A44500A681C340630401D818B2F +:1069F0003C34151A58022BA2182C62840546844197 +:106A0000A0A0449C303E6881D22027A0D4213EDC47 +:106A1000CBD3B108BC113C2A138BEA6141E0119839 +:106A2000081F818FD318BC6A113BBC48AA20CD8CAB +:106A3000133C03F20203A14D10D8C63F904AA5F1C2 +:106A4000993C35F204CA8C957308DC2ED20D010BEB +:106A5000A2B2E148742419990E859349DCB1120859 +:106A6000A10932224B00F8F70D984092C21604FF9C +:106A7000C70CFA0E05D34B082CFE0CC48D1DE00587 +:106A80009C7326393F0540A0AAC4579739770A9AC4 +:106A9000E0B54858862B464723421AC8C7D10A9DFD +:106AA0000994526D68C0E725C5C30CA11840016167 +:106AB00013108C030150A0DAE5353A854AD08100E5 +:106AC00096D110EC4828C028C028C22A808C0E021B +:106AD00092C82DC518010C67629D480F020AE0019B +:106AE000A02011A4B44009630552509628F2400A30 +:106AF000418105820660D6AA2A180045C1339866EE +:106B0000B23B054951002128B2492AD9092A828479 +:106B100010B6012A1A85992269A4E959268082892A +:106B2000212454C50000410098A050080413098A8C +:106B3000050080413043DC0C0942B02160300A2C52 +:106B400000A280158113A4981B3CDD0AE4A14C042B +:106B50003004080940882288A84B1A2AABC2AA210F +:106B600048E826550A544D76D2AD643ED422B2810F +:106B7000EFD224548A5623444501128B34804210AC +:106B8000510180412E70051C180A40040068100055 +:106B90000A0028044E02984011C202000007A18892 +:106BA000000000082B0803110820005028200201D3 +:106BB000024100180430BC0C0C023544C5EC3230E4 +:106BC0000C9D2370504EEA189148EE015104BC848C +:106BD0000BE4021E43261C82B02B0540560160AC1C +:106BE00064C1376E0AB5D00C50C5C03FEC4001F10E +:106BF00028A8005400720D00037918108220800329 +:106C00000100390080003C8D8005600280460E1333 +:106C10002046218012080155042408842089104848 +:106C20009104890048912244448824488244812266 +:106C300010910804120212208848489104890244E5 +:106C40002089108821089101041012240841048829 +:106C500049122021201221244882448224482244BF +:106C60001224412241122408421224444242448800 +:106C70002448089104891048904489244882448219 +:106C8000244810841122408420108410910842422C +:106C900021204884448924488244808848ECB204F6 +:106CA00035CC10308050D90B0004010DA214001017 +:106CB000450340048D604C98842825408100510094 +:106CC00054903A088942021000444BDC1017CC0063 +:106CD000000010DD402877CA47200190F0203FFFD8 +:106CE000C000F0000010A0000000000000007000D4 :106CF0000000000000000000000000000000000094 :106D00000000000000000000000000000000000083 :106D10000000000000000000000000000000000073 :106D20000000000000000000000000000000000063 -:106D30000000000000000000000000000000000053 -:106D40000000000000000000000000000000000043 +:106D30000000000000000000000000000002000051 +:106D400000000000000000400800000000000000FB :106D50000000000000000000000000000000000033 :106D60000000000000000000000000000000000023 :106D70000000000000000000000000000000000013 -:106D80000000000000000000000000000000000003 -:106D900000000000000000000000000000000000F3 +:106D800000000000000200000000000000000040C1 +:106D900008000000000000000000000000000000EB :106DA00000000000000000000000000000000000E3 :106DB00000000000000000000000000000000000D3 :106DC00000000000000000000000000000000000C3 -:106DD00000000000000000000000000000000000B3 -:106DE00000000000000000000000000000000000A3 -:106DF0000000000000000000000000000000000093 -:106E00000000000000000000000000000000000082 -:106E10000000000000000000000000000000000072 -:106E20000000000000000000000000000000000062 -:106E30000000000000000000000000000000000052 -:106E40000000000000000000000000000000000042 -:106E50000000000000000000000000000000000032 -:106E60000000000000000000000000000000000022 -:106E70000000000000000000000000000000000012 -:106E80000000000000000000000000000000000002 -:106E900000000000000000000000000000000000F2 -:106EA00000000000000000000000000000000000E2 -:106EB00000000000000000000000000000000000D2 -:106EC00000000000000000000000000000000000C2 -:106ED00000000000000000000000000000000000B2 -:106EE00000000000000000000000000000000000A2 -:106EF0000000000000000000000000000000000092 -:106F00000000000000000000000000000000000081 -:106F10000000000000000000000000000000000071 -:106F20000000000000000000000000000000000061 -:106F30000000000000000000000000000000000051 -:106F40000000000000000000000000000000000041 -:106F50000000000000000000000000000000000031 -:106F60000000000000000000000000000000000021 -:106F70000000000000000000000000000000000011 -:106F80000000000000000000000000000000000001 -:106F900000000000000000000000000000000000F1 -:106FA00000000000000000000000000000000000E1 -:106FB00000000000000000000000000000000000D1 -:106FC00000000000000000000000000000000000C1 -:106FD00000000000000000000000000000000000B1 -:106FE00000000000000000000000000000000000A1 -:106FF0000000000000000000000000000000000091 -:107000000000000000000000000000000000000080 -:107010000000000000000000000000000000000070 -:107020000000000000000000000000000000000060 -:107030000000000000000000000000000000000050 -:107040000000000000000000000000000000000040 -:107050000000000000000000000000000000000030 -:107060000000000000000000000000000000000020 -:107070000000000000000000000000000000000010 -:107080000000000000000000000000000000000000 -:1070900000000000000000000000000000000000F0 -:1070A00000000000000000000000000000000000E0 -:1070B00000000000000000000000000000000000D0 -:1070C00000000000000000000000000000000000C0 -:1070D00000000000000000000000000000000000B0 -:1070E00000000000000000000000000000000000A0 -:1070F0000000000000000000000000000000000090 -:10710000000000000000000000000000000000007F -:10711000000000000000000000000000000000006F -:10712000000000000000000000000000000000005F -:10713000000000000000000000000000000000004F -:10714000000000000000000000000000000000003F -:10715000000000000000000000000000000000002F -:10716000000000000000000000000000000000001F -:10717000000000000000000000000000000000000F -:1071800000000000000000000000000000000000FF -:1071900000000000000000000000000000000000EF -:1071A00000000000000000000000000000000000DF -:1071B00000000000000000000000000000000000CF -:1071C00000000000000000000000000000000000BF -:1071D00000000000000000000000000000000000AF -:1071E000000000000000000000000000000000009F -:1071F000000000000000000000000000000000008F -:10720000000000000000000000000000000000007E -:10721000000000000000000000000000000000006E -:10722000000000000000000000000000000000005E -:10723000000000000000000000000000000000004E -:10724000000000000000000000000000000000003E -:10725000000000000000000000000000000000002E -:10726000000000000000000000000000000000001E -:10727000000000000000000000000000000000000E -:1072800000000000000000000000000000000000FE -:1072900000000000000000000000000000000000EE -:1072A00000000000000000000000000000000000DE -:1072B00000000000000000000000000000000000CE -:1072C00000000000000000000000000000000000BE -:1072D00000000000000000000000000000000000AE -:1072E000000000000000000000000000000000009E -:1072F000000000000000000000000000000000008E -:10730000000000000000000000000000000000007D -:10731000000000000000000000000000000000006D -:10732000000000000000000000000000000000005D -:10733000000000000000000000000000000000004D -:10734000000000000000000000000000000000003D -:10735000000000000000000000000000000000002D -:10736000000000000000000000000000000000001D -:10737000000000000000000000000000000000000D -:1073800000000000000000000000000000000000FD -:1073900000000000000000000000000000000000ED -:1073A00000000000000000000000000000000000DD -:1073B00000000000000000000000000000000000CD -:1073C00000000000000000000000000000000000BD -:1073D00000000000000000000000000000000000AD -:1073E000000000000000000000000000000000009D -:1073F000000000000000000000000000000000008D -:10740000000000000000000000000000000000007C -:10741000000000000000000000000000000000006C -:10742000000000000000000000000000000000005C -:10743000000000000000000000000000000000004C -:10744000000000000000000000000000000000003C -:10745000000000000000000000000000000000002C -:10746000000000000000000000000000000000001C -:10747000000000000000000000000000000000000C -:1074800000000000000000000000000000000000FC -:1074900000000000000000000000000000000000EC -:1074A00000000000000000000000000000000000DC -:1074B00000000000000000000000000000000000CC -:1074C00000000000000000000000000000000000BC -:1074D00000000000000000000000000000000000AC -:1074E000000000000000000000000000000000009C -:1074F000000000000000000000000000000000008C -:10750000000000000000000000000000000000007B -:10751000000000000000000000000000000000006B -:10752000000000000000000000000000000000005B -:10753000000000000000000000000000000000004B -:10754000000000000000000000000000000000003B -:10755000000000000000000000000000000000002B -:10756000000000000000000000000000000000001B -:10757000000000000000000000000000000000000B -:1075800000000000000000000000000000000000FB -:1075900000000000000000000000000000000000EB -:1075A00000000000000000000000000000000000DB -:1075B00000000000000000000000000000000000CB -:1075C00000000000000000000000000000000000BB +:106DD00000000000000000000000046D4155504616 +:106DE000C411112EEC4BBBB2EEECBBBB0444411101 +:106DF000104444111104444111104444111104443D +:106E00004111104444111104444111104444111122 +:106E100004444111104444111104444111104444EC +:106E2000111115444115104444111104444111102D +:106E300044441111044441111044441111044441CB +:106E4000111044441111044441111044441111041F +:106E5000444111104444111104444111104444119F +:106E60001104444111104444111106BD4E0100FCAF +:106E700098B5BF0DFF09AD41E9F8768E3FFD4B9304 +:106E8000F3FFF8F9FF038E49EFF35D3887052D5DB9 +:106E90008F62B13FEC7FAE3FFF0AE4F3F8FCA7FF3F +:106EA0001CB8C7BF63737C27B138974E74E12E902E +:106EB00099F427DD0F7743DD24BD4937FC4CFE8173 +:106EC0007C6CFFEF36370FDDF3A37CFEEF1D1BCD8F +:106ED000FF724F7C7FB43A7F88DF73BF78FFEE3F4D +:106EE000BACEDBB3F6ECFBBD35EFCDEFB002FC4024 +:106EF0004800088B73F2F6C49E7E33F5CBDA33F389 +:106F0000BC9EDC07E987DE739F9C34F61F7F4E7EB4 +:106F100072959831B733AE0F5F91F7E8E7E72959DB +:106F20008FAB71E7E87EB63C178FCCF33AFCDFE01D +:106F30003FFE4EE750CEF463A30EF549CE73F1CC7D +:106F4000DD5F276D8FDEF1CEACF7BE0757CBB77391 +:106F50007B747FF338EF4F4CC25FF8EDFE2EBCC45C +:106F6000DEB29D986F7D3AF54FBDC1B5FC6DEE2D3B +:106F7000B6CFDFD2BFF873C52F678EFF93DCF8CF93 +:106F8000B93B9F4CFB93B9F49F7335BECFFF91CFB4 +:106F90009C7FFD1AFFCF7BB2B6F80DFC0F3EC76891 +:106FA000E16030FE4025EE8195F07128F6BE3DFD92 +:106FB000C5F452BFECDA3317E9CDDF613DA0F56DC2 +:106FC00027E9C7AF83BEDCEFFF1FDFCDEFF3F7F894 +:106FD0007EFD37BFC6EDF3FDFCFF7E377EC3F7F3C2 +:106FE000A774F7FF3EDDCBFFB2B7AC7BD637AC4F13 +:106FF000BFF3DE5CFA763B7D45EF61DF746DF735FC +:10700000FDCFFDE2BFB4FBEE3FDFC7BFD37FFC7F08 +:10701000952EDBC7AD73CEF4DBFC3EDFC6B5F36E59 +:1070200054B7EE2DD6CD2D71ABB8B5590039C0008F +:1070300000000000000000000003F7B876BC3EDD51 +:1070400086FCF3ED7CEFDF36FFCEF7F37FF8DEBD95 +:107050003BFF4FF761B6FCDBFF3DDAC6DBF36FFCAD +:107060006EDE1B9D4B6FF2DFACBBDD3BDF4DADE257 +:10707000F7ECBBD7377FCFFEE1B6DC7FFF17B6CF8B +:10708000EEF2EDDCDFFF1B558DFF73FF6CED7B2D0A +:10709000FF86DB52F27C377D1FFFCBEBB1CED4FFF6 +:1070A000EF36D7CF7FF1B7FC156D3DB50AFBF3FF87 +:1070B00074EEB63F768AB6F1EED4FFEB2E9B4FDD31 +:1070C000D3EEBC57DD1BF6CF7BB375BCDB5B2D7BF2 +:1070D0008DDDD3FDA8FFFF1B6B47F6F3F1B4FAF784 +:1070E0002B6FCFF2D1F7ACF7EB3FFDCF7FF3DFD8BB +:1070F000D76D3FEDC7FDE3EFFC6DBF17FDC6B6B31F +:10710000F77CFF772D7BCDFFB36B58DADA36B68686 +:10711000B771BBACFD6F1FFE4DBB72DFD8FDDB3F0F +:10712000F78FFBD35B587FF73FF6CB7B53B6DC6F13 +:10713000DB3ABF47AD61BEBCBD6D3F1ECEBF71DD4A +:10714000ACEEFA2EF6CB5BB3ADAC6BFA3FDBC5FD14 +:1071500052FF6CB6DD2BFBCFEDF2BEFCCAFF2EACAE +:10716000859FF37BECFFB8373FCFFFF1EF7C6B3FA0 +:10717000167BCFF773FDBCFF7F3FFFCCF7F3FFF823 +:10718000EDFB2CEF0FFFE3B6A0FD763EFDCD71F3D6 +:10719000FFFCB7FF2EBBCFCDD2FFFCF75F3FEECB9E +:1071A000BFD1B734EFF535BDCD7EC1FDDC4D7F17C6 +:1071B0002C8F56D3DBB4BEF735AF47DEF1B77CD5A5 +:1071C000EE25F78ABB6357B4EFDE2DFBC95B73DE98 +:1071D00048DBBF3ADF4DF760AB4CEEBB3B6B4AADD3 +:1071E000F2FBACDFF51EF68EEDF377B86EDF3BDB1E +:1071F000CFEF63DEF4B6EE1D6D4EF6F3D75CEABE5C +:107200003BFF8B7D72B7B42DFB3FADCB6AF1BD6800 +:10721000DF7B2AADCDBDE2BFDCD76536EE8DB66330 +:10722000DEFC7B7D1AEEC76BB3F76C769E1DF3CE4A +:10723000DBF17ADCD76F3DF78EDFA3BD74DFBE3B99 +:10724000758B576156ECBB771AD34B6BC3AEFCED15 +:10725000D53DB5C8CEA1DE74BAEF2BEFCF5EE326E5 +:10726000088EB22956C5B8E1B54477FF3BD6C7DFD3 +:10727000F37F5CC7BE2EAE456DF1FFF86B552FFA5C +:10728000C6EDE2F7DC3B671DF78FF7F1BFD8D7F704 +:107290003BF78DFED1BFFC37FF376D4DBAF2EEF4F0 +:1072A000FDB737778B7DB1BBF4736F3BBDCBFFD19F +:1072B000B7BCFDBF2DDD87FB73EAFCDFB73F568B04 +:1072C0006DD1B5A4DBD72EFB4BB5D2BA70EDDB1771 +:1072D0006EC6CBB273ECF6BE1DD786D5A26FDC6B43 +:1072E000DF1BFF8FFEF3EADCB3BF376ECFFBB1FDD0 +:1072F000B8DF6F3FFECDFFB2FF7CABF92E72C3DA71 +:1073000071BFB4BDEF3D7ECFBFF3F5FC3F733FFED1 +:10731000CF7EF37EF8EFDC2EBEC7FF72FF7C995F55 +:107320003BFDCF7FD39BF87B5F3DA74EFDF3DFDCBA +:10733000F7FF3FBB4FFFB2DFFCDFFE3FEF4F57F3DE +:10734000FBDCF6BB37FF4FBFF37FFCF7D737EDC74A +:10735000FF73FEECDFFF3FFDCEFFF2EBB4EEFD3F2F +:10736000F7C66FF3EFFCDDFD33B64F6EE377BCBAC3 +:10737000BE1DE3C7EFD1F7DCABEF3F7BCDEB63B7CF +:10738000BCEEED3FBBCFEFE2FBFCFF7F1F97CDFDD7 +:10739000F3F7F4FFFD37BFCEDBE3BFBCD7FF36FF0B +:1073A000CFFBE1F574ECEB377F88F793D9A8AF6E8C +:1073B00036EEC7F753FD506F7D3CDD43FF715EDC59 +:1073C000DFB73C7BC7EFB1DF5CB7FF1FB74EEBF019 +:1073D000F6ECBCDF3EF78B5EF3AF9CB9D82EF74AD4 +:1073E000F5B22CACA5CE1AB68DE7B1E7B4E7B71568 +:1073F00059CADFE1BFFC7FBF3F7BC7DED3F6DCEFBE +:10740000EF3FFF87FF916BFC6DFD1FFDC757B0720B +:10741000FCF77F2FF2CFCBB16EECFFD536F9CFFF63 +:10742000F3F6B4F7EF3DCF8EF531AFFCFD5B3DBF1A +:107430004F7F22EFD06FBB36FD4FFF62DB7CDFFF5B +:107440003EE74DD573EEF8DDFB3DDB4DBBB1DFB85C +:10745000DDB71BBBCDFBB1DB74FBBF3AEF8D5EF23A +:10746000EF7CC75A3E7DCFEFF2B7F8BF7E3BDFCF50 +:107470007BF0DFBC6F623FBD8BFEE19754FFB73FEF +:10748000F3CFFFF25A9C7E7D3F7DC6FDB3CDFCEE6F +:10749000BD1F3E8BBFB1FDFCFF7F3FB3CAB3F26699 +:1074A000E86F392DB7CF56237EECDFBB3DFDCC31E5 +:1074B000739BECD5FF371E43BDD373B47DD90FFF4B +:1074C0000F8F632FFCFFF13D7EC787F0C710E3FDF0 +:1074D00035DC4D0EB3F8845ABF2EFE4E1D11B7B4E5 +:1074E000FBAB37EFC076D36FDC3EDF376EC69FB1A4 +:1074F00049B4F44F1F6247FA23DD787F6F36FECF21 +:10750000EDF2DFD8FBBF26CCC073D074C8E3D72E12 +:10751000EE4E2BD2B670FFFF3FE9CCEFF3D7DCFF86 +:10752000FF3FDFCFC7F3F4FC77FF2BEF8FFFF23F76 +:10753000DCBDFF2FFECDF772EFEC7CFB0420008456 +:107540002008104081040800408102040408204003 +:1075500082040102108108041002102008404081BA +:1075600004080204200810082100810104101020E2 +:107570000841040848102021001021204082040006 +:107580002040020410204102001020084210204038 +:1075900042020408204000810408104080040820B2 +:1075A00040820400204010840102008420108410D6 +:1075B00081084200210040840408204082040088A1 +:1075C000400000000000000000000000000000007B :1075D00000000000000000000000000000000000AB -:1075E000000000000000000000000000000000009B -:1075F000000000000000000000000000000000008B -:10760000000000000000000000000000000000007A -:10761000000000000000000000000000000000006A +:1075E000000000000000001000000000000000008B +:1075F000000200000000002A00080808A8204088B7 +:10760000000000000000000000CE1017FC0000E0A9 +:10761000000040000000000000000000000000002A :10762000000000000000000000000000000000005A -:10763000000000000000000000000000000000004A -:10764000000000000000000000000000000000003A -:10765000000000000000000000000000000000002A -:10766000000000000000000000000000000000001A +:1076300000000000000000000000000003FF00FF49 +:10764000FF3FFFCFFFF3FFFCFFFF3FFFCFFFF3FF45 +:10765000FCFFFF3FFFCFFFF3FFFCFFFF3FFFCFFF2C +:10766000F00AFC00000010000000000018200000DC :10767000000000000000000000000000000000000A :1076800000000000000000000000000000000000FA -:1076900000000000000000000000000000000000EA -:1076A00000000000000000000000000000000000DA -:1076B00000000000000000000000000000000000CA +:1076900000003FFFCFFFF3FFFCFFFF3FFFCFFFF3F3 +:1076A000FFFCFFFF3FFFCFFFF00AFC0000001000CF +:1076B0000000000018200000000000000000000092 :1076C00000000000000000000000000000000000BA :1076D00000000000000000000000000000000000AA :1076E000000000000000000000000000000000009A @@ -256355,149 +256355,149 @@ :10923000000000000000000000000000000000002E :10924000000000000000000000000000000000001E :10925000000000000000000000000000000000000E -:1092600000000000000000000000000000000000FE -:1092700000000000000000000000000000000000EE -:1092800000000000000000000000000000000000DE -:1092900000000000000000000000000000000000CE -:1092A00000000000000000000000000000000000BE -:1092B00000000000000000000000000000000000AE -:1092C000000000000000000000000000000000009E -:1092D000000000000000000000000000000000008E -:1092E000000000000000000000000000000000007E -:1092F000000000000000000000000000000000006E -:10930000000000000000000000000000000000005D -:10931000000000000000000000000000000000004D -:10932000000000000000000000000000000000003D -:10933000000000000000000000000000000000002D -:10934000000000000000000000000000000000001D -:10935000000000000000000000000000000000000D -:1093600000000000000000000000000000000000FD -:1093700000000000000000000000000000000000ED -:1093800000000000000000000000000000000000DD -:1093900000000000000000000000000000000000CD -:1093A00000000000000000000000000000000000BD -:1093B00000000000000000000000000000000000AD -:1093C000000000000000000000000000000000009D -:1093D000000000000000000000000000000000008D -:1093E000000000000000000000000000000000007D -:1093F000000000000000000000000000000000006D -:10940000000000000000000000000000000000005C -:10941000000000000000000000000000000000004C -:10942000000000000000000000000000000000003C -:10943000000000000000000000000000000000002C -:10944000000000000000000000000000000000001C -:10945000000000000000000000000000000000000C -:1094600000000000000000000000000000000000FC -:1094700000000000000000000000000000000000EC -:1094800000000000000000000000000000000000DC -:1094900000000000000000000000000000000000CC -:1094A00000000000000000000000000000000000BC -:1094B00000000000000000000000000000000000AC -:1094C000000000000000000000000000000000009C -:1094D000000000000000000000000000000000008C -:1094E000000000000000000000000000000000007C -:1094F000000000000000000000000000000000006C -:10950000000000000000000000000000000000005B -:10951000000000000000000000000000000000004B -:10952000000000000000000000000000000000003B -:10953000000000000000000000000000000000002B -:10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB -:1095A00000000000000000000000000000000000BB -:1095B00000000000000000000000000000000000AB -:1095C000000000000000000000000000000000009B -:1095D000000000000000000000000000000000008B -:1095E000000000000000000000000000000000007B -:1095F000000000000000000000000000000000006B -:10960000000000000000000000000000000000005A -:10961000000000000000000000000000000000004A -:10962000000000000000000000000000000000003A -:10963000000000000000000000000000000000002A -:10964000000000000000000000000000000000001A -:10965000000000000000000000000000000000000A -:1096600000000000000000000000000000000000FA -:1096700000000000000000000000000000000000EA -:1096800000000000000000000000000000000000DA -:1096900000000000000000000000000000000000CA -:1096A00000000000000000000000000000000000BA -:1096B00000000000000000000000000000000000AA -:1096C000000000000000000000000000000000009A -:1096D000000000000000000000000000000000008A -:1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 -:109720000000000000000000000000000000000039 -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 -:1097900000000000000000000000000000000000C9 -:1097A00000000000000000000000000000000000B9 -:1097B00000000000000000000000000000000000A9 -:1097C0000000000000000000000000000000000099 -:1097D0000000000000000000000000000000000089 -:1097E0000000000000000000000000000000000079 -:1097F0000000000000000000000000000000000069 -:109800000000000000000000000000000000000058 -:109810000000000000000000000000000000000048 -:109820000000000000000000000000000000000038 -:109830000000000000000000000000000000000028 -:109840000000000000000000000000000000000018 -:109850000000000000000000000000000000000008 -:1098600000000000000000000000000000000000F8 -:1098700000000000000000000000000000000000E8 -:1098800000000000000000000000000000000000D8 -:1098900000000000000000000000000000000000C8 -:1098A00000000000000000000000000000000000B8 -:1098B00000000000000000000000000000000000A8 -:1098C0000000000000000000000000000000000098 -:1098D0000000000000000000000000000000000088 -:1098E0000000000000000000000000000000000078 -:1098F0000000000000000000000000000000000068 -:109900000000000000000000000000000000000057 -:109910000000000000000000000000000000000047 -:109920000000000000000000000000000000000037 -:109930000000000000000000000000000000000027 -:109940000000000000000000000000000000000017 -:109950000000000000000000000000000000000007 -:1099600000000000000000000000000000000000F7 -:1099700000000000000000000000000000000000E7 -:1099800000000000000000000000000000000000D7 -:1099900000000000000000000000000000000000C7 -:1099A00000000000000000000000000000000000B7 -:1099B00000000000000000000000000000000000A7 -:1099C0000000000000000000000000000000000097 -:1099D0000000000000000000000000000000000087 -:1099E0000000000000000000000000000000000077 -:1099F0000000000000000000000000000000000067 -:109A00000000000000000000000000000000000056 -:109A10000000000000000000000000000000000046 -:109A20000000000000000000000000000000000036 -:109A30000000000000000000000000000000000026 -:109A40000000000000000000000000000000000016 -:109A50000000000000000000000000000000000006 -:109A600000000000000000000000000000000000F6 -:109A700000000000000000000000000000000000E6 -:109A800000000000000000000000000000000000D6 -:109A900000000000000000000000000000000000C6 -:109AA00000000000000000000000000000000000B6 +:10926000000000000000000000000468410000460B +:1092700084111126644999926664999904444111B4 +:109280001044441111044441111044441111044488 +:10929000411110444411110444411110444411116E +:1092A0000444411110444411110444411110444438 +:1092B00011111004411010444411110444411110C3 +:1092C0004444111104444111104444111104444117 +:1092D000111044441111044441111044441111046B +:1092E00044411110444411110444411110444411EB +:1092F0001104444111104444111102CD0001002C0D +:10930000009201040380A1C04800D2843FED488050 +:10931000B3FF28527F008400A2C145088104258440 +:109320008123000B8452A212FF0A2023E0E8008769 +:10933000040045A9211924069009168C10222D003D +:109340001A24065A0916825A04BC8117840D128009 +:10935000A42C24211217424480A1749224050B8D61 +:10936000491002201C08041C88A51091081422082A +:10937000890240923614D4881044459540004882B2 +:10938000400000011000A040208204110800407439 +:10939000808449094080409123A414220102030ED5 +:1093A0009004881092049209C380102C48E9004868 +:1093B000880922082082363C180090F044105FE1B2 +:1093C00008088A28801114630703DC484210D04043 +:1093D0005D0629348584B25240612E09208993228A +:1093E00019B018D018610A4CC0005805C0124100CD +:1093F0000AB20018E610084447BE105A0020302078 +:109400008200010282D4005034008302A10620624F +:109410000C10C40624C20C40C4181C080417E1A098 +:10942000E08FF8310807BE90000C87E01040000480 +:109430001020000F6437BC40C030099007BC220FD9 +:1094400046A020402C7801082C40512197801480A0 +:10945000102C062FD0424C900120B0041040172849 +:10946000840208900234C03A0469E11E00C007205B +:109470000004114002450A06C2A490289410A400DA +:109480002202000000120824002200200000010037 +:1094900008C602000A0884000400082810C6002636 +:1094A0002A102C08C28000084884000088005094CC +:1094B000A8FAD4128D4EA2C1945C04590002000097 +:1094C00000000000000000000000108010080204EE +:1094D000803C0022088100101F00028000105C0008 +:1094E000240100F8108C0000000010087400C00473 +:1094F00030400144C0022028801C041C620C9801EA +:1095000009048B880C80001F02C1A0801408C18050 +:1095100022E30320A007020C40012002A008803AA9 +:10952000000226C2002C1A9C10E00F29A1C6540587 +:109530000100800000026800239B001980000000E9 +:109540000431DD000445DD03038C68801B0081329B +:1095500021414062372C2041A0E0CF40580014C880 +:109560000322200000C00019610A0B601088150C4E +:109570001CD00007309ED00C59000205C000DECC84 +:10958000A10000144004401000B300280485CDD091 +:1095900012F0020008000A0000F4EC373731CFC99E +:1095A000D0B096F45C24140005005001081D0000A2 +:1095B00041033802E6A40009001982F3A2756C93F6 +:1095C0004800790453802B44FB9B010D8108A03E89 +:1095D0005092341725040C43F6180FEB114BC7F4C7 +:1095E000D3E02080040004005782C01043FD000433 +:1095F0008090E104049B122240C0E6D02000B121FB +:109600000A400591339A40B080039B4018000B58E4 +:10961000200C04250000A11BB008030246CC100159 +:109620000B9C9CA200000385232A0C000030100A2A +:1096300086009708281410804600000488426817A6 +:109640002C8952D003808061300508D0801040C53D +:10965000E820D78AA9631794555E05FBC28573A8D5 +:10966000DCCCAC1A4E0DEA60A140868F0D614A1425 +:10967000D000E400300CD40C2C51100846C00A0075 +:109680004C4142565C002A00000EF2E2499C0C5A02 +:109690002840081342B414315B18C5C16AD1BD68B3 +:1096A0005D73155E8E4251C2F056661A5B02B6B00B +:1096B0000710BE7A0B6C473530D66C669A0CC442E4 +:1096C000AB82935C4DA332574D806338985E531C38 +:1096D0000084F49368ACB0812101089481ED20529C +:1096E000AA124A4041504A10802009D50262630301 +:1096F0001004E21816058040900810192846CF780B +:1097000022A03408E014000C6CF00000F5BF200B20 +:10971000013C33899005080020C090100808002300 +:109720000408024140560042002A138F5352260873 +:109730000C942980083D0100308131386204605268 +:10974000C20481802842C075802FC4789C013B4EA2 +:10975000B1E0DAE8C98135200456C0088480C91B0D +:109760003500145071488A82089F00440237D8217E +:10977000522843818F714440000402800C0442004F +:109780000821A0001D0B024104809800010980817E +:1097900000999010842BB04005320800150C167605 +:1097A0000207010C68E54433420080F2C364A9411A +:1097B000081C05604030CC28F000414100006220C8 +:1097C0000D01005905240062A0654A001003A003A2 +:1097D00007E02340200080C1108000F02820100006 +:1097E00000829E2865490AF0831C5000087BC20D48 +:1097F00060003010B000C6020190013F619CC06F54 +:10980000F425610D20E35124D81111380028B0004F +:1098100080240000A0000000103051A234EA800231 +:1098200000001400003C6482800000007C003D00C9 +:10983000024C128F8C001E08800C09008004D19C01 +:1098400019C009018195884CF02C5443624018D806 +:1098500080951D0108220200008000009181040112 +:10986000026000F00000804301602088400611067D +:10987000080261A87E5318E7CC08000810081300FE +:1098800000004700B86C18960F088200211048426B +:10989000231F84C81FA29EEC13421C1D0EFF90873D +:1098A000B0D1482913084D800224940022280018C2 +:1098B0000282101EA81C430A52437ABC267D07E28E +:1098C0004249922C2404882060099B612D747D9963 +:1098D00013260F79D04F0C44CC26580C08904CC856 +:1098E0006581008984CCB25810111501218484202F +:1098F00004E8610000100012A006F01210393A4F7F +:10990000720039142A2018BD020AF04140EE902E50 +:109910003983BF337D302F9D217DC23CF0EDC46D76 +:10992000260B9BC18AA002CC9F42250200000000AA +:10993000001042000800A941382009090C8D40019F +:109940000000144443112800402100C051C202FF0E +:109950000E0E21087C000005020002010020800498 +:1099600001400004134C0050162282020901051028 +:109970008408102000120000DC00050991028540D7 +:109980008194D40F1D20424A02C8380D01101A01DB +:10999000A0320340D90622C40A208020D060802251 +:1099A000460020410030F3803C884029F1838887BD +:1099B000791E1FCC0072442414FF01C40FB8B01CE0 +:1099C0001C888E047502A912092C0100042300844E +:1099D00020081040810408004481022424482040CB +:1099E0008204010210810804100210200840448102 +:1099F00004080204200810482100810104101120ED +:109A000008410408489020211011212040820400C0 +:109A1000204002041022410220102008421020425F +:109A200042020408204000810408104080040820FD +:109A300040820400204090840102008420108410A1 +:109A400081084201211040840408204082040088DB +:109A500040268E007E04121383A48C483390842801 +:109A6000D0C33840001DC80033E0D200CA74332090 +:109A7000832403406C4209044601C1C0F000402029 +:109A8000051C4C00704110C104038C8FB490006021 +:109A900000000000000000000010A0000000000016 +:109AA0000000200000000000000000000000000096 :109AB00000000000000000000000000000000000A6 :109AC0000000000000000000000000000000000096 :109AD0000000000000000000000000000000000086 :109AE0000000000000000000000000000000000076 -:109AF0000000000000000000000000000000000066 +:109AF000000200000000000000000000080000005C :109B00000000000000000000000000000000000055 :109B10000000000000000000000000000000000045 :109B20000000000000000000000000000000000035 -:109B30000000000000000000000000000000000025 -:109B40000000000000000000000000000000000015 +:109B30000000000000000000000200000000000023 +:109B4000000000000800000000000000000000000D :109B50000000000000000000000000000000000005 :109B600000000000000000000000000000000000F5 :109B700000000000000000000000000000000000E5 @@ -258257,442 +258257,442 @@ :1009000000000000000000000000000000000000E7 :1009100000000000000000000000000000000000D7 :1009200000000000000000000000000000000000C7 -:1009300000000000000000000000000000000000B7 -:1009400000000000000000000000000000000000A7 -:100950000000000000000000000000000000000097 -:100960000000000000000000000000000000000087 -:100970000000000000000000000000000000000077 -:100980000000000000000000000000000000000067 -:100990000000000000000000000000000000000057 -:1009A0000000000000000000000000000000000047 -:1009B0000000000000000000000000000000000037 -:1009C0000000000000000000000000000000000027 -:1009D0000000000000000000000000000000000017 -:1009E0000000000000000000000000000000000007 -:1009F00000000000000000000000000000000000F7 -:100A000000000000000000000000000000000000E6 -:100A100000000000000000000000000000000000D6 -:100A200000000000000000000000000000000000C6 -:100A300000000000000000000000000000000000B6 -:100A400000000000000000000000000000000000A6 -:100A50000000000000000000000000000000000096 -:100A60000000000000000000000000000000000086 -:100A70000000000000000000000000000000000076 -:100A80000000000000000000000000000000000066 -:100A90000000000000000000000000000000000056 -:100AA0000000000000000000000000000000000046 -:100AB0000000000000000000000000000000000036 -:100AC0000000000000000000000000000000000026 -:100AD0000000000000000000000000000000000016 -:100AE0000000000000000000000000000000000006 -:100AF00000000000000000000000000000000000F6 -:100B000000000000000000000000000000000000E5 -:100B100000000000000000000000000000000000D5 -:100B200000000000000000000000000000000000C5 -:100B300000000000000000000000000000000000B5 -:100B400000000000000000000000000000000000A5 -:100B50000000000000000000000000000000000095 -:100B60000000000000000000000000000000000085 -:100B70000000000000000000000000000000000075 -:100B80000000000000000000000000000000000065 -:100B90000000000000000000000000000000000055 -:100BA0000000000000000000000000000000000045 -:100BB0000000000000000000000000000000000035 -:100BC0000000000000000000000000000000000025 -:100BD0000000000000000000000000000000000015 -:100BE0000000000000000000000000000000000005 -:100BF00000000000000000000000000000000000F5 -:100C000000000000000000000000000000000000E4 -:100C100000000000000000000000000000000000D4 -:100C200000000000000000000000000000000000C4 -:100C300000000000000000000000000000000000B4 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000000000000000000084 -:100C70000000000000000000000000000000000074 -:100C80000000000000000000000000000000000064 -:100C90000000000000000000000000000000000054 -:100CA0000000000000000000000000000000000044 -:100CB0000000000000000000000000000000000034 -:100CC0000000000000000000000000000000000024 -:100CD0000000000000000000000000000000000014 -:100CE0000000000000000000000000000000000004 -:100CF00000000000000000000000000000000000F4 -:100D000000000000000000000000000000000000E3 -:100D100000000000000000000000000000000000D3 -:100D200000000000000000000000000000000000C3 -:100D300000000000000000000000000000000000B3 -:100D400000000000000000000000000000000000A3 -:100D50000000000000000000000000000000000093 -:100D60000000000000000000000000000000000083 -:100D70000000000000000000000000000000000073 -:100D80000000000000000000000000000000000063 -:100D90000000000000000000000000000000000053 -:100DA0000000000000000000000000000000000043 -:100DB0000000000000000000000000000000000033 -:100DC0000000000000000000000000000000000023 -:100DD0000000000000000000000000000000000013 -:100DE0000000000000000000000000000000000003 -:100DF00000000000000000000000000000000000F3 -:100E000000000000000000000000000000000000E2 -:100E100000000000000000000000000000000000D2 -:100E200000000000000000000000000000000000C2 -:100E300000000000000000000000000000000000B2 -:100E400000000000000000000000000000000000A2 -:100E50000000000000000000000000000000000092 -:100E60000000000000000000000000000000000082 -:100E70000000000000000000000000000000000072 -:100E80000000000000000000000000000000000062 -:100E90000000000000000000000000000000000052 -:100EA0000000000000000000000000000000000042 -:100EB0000000000000000000000000000000000032 -:100EC0000000000000000000000000000000000022 -:100ED0000000000000000000000000000000000012 -:100EE0000000000000000000000000000000000002 -:100EF00000000000000000000000000000000000F2 -:100F000000000000000000000000000000000000E1 -:100F100000000000000000000000000000000000D1 -:100F200000000000000000000000000000000000C1 -:100F300000000000000000000000000000000000B1 -:100F400000000000000000000000000000000000A1 -:100F50000000000000000000000000000000000091 -:100F60000000000000000000000000000000000081 -:100F70000000000000000000000000000000000071 -:100F80000000000000000000000000000000000061 -:100F90000000000000000000000000000000000051 -:100FA0000000000000000000000000000000000041 -:100FB0000000000000000000000000000000000031 -:100FC0000000000000000000000000000000000021 -:100FD0000000000000000000000000000000000011 -:100FE0000000000000000000000000000000000001 -:100FF00000000000000000000000000000000000F1 -:1010000000000000000000000000000000000000E0 -:1010100000000000000000000000000000000000D0 -:1010200000000000000000000000000000000000C0 -:1010300000000000000000000000000000000000B0 -:1010400000000000000000000000000000000000A0 -:101050000000000000000000000000000000000090 -:101060000000000000000000000000000000000080 -:101070000000000000000000000000000000000070 -:101080000000000000000000000000000000000060 -:101090000000000000000000000000000000000050 -:1010A0000000000000000000000000000000000040 -:1010B0000000000000000000000000000000000030 -:1010C0000000000000000000000000000000000020 -:1010D0000000000000000000000000000000000010 -:1010E0000000000000000000000000000000000000 -:1010F00000000000000000000000000000000000F0 -:1011000000000000000000000000000000000000DF -:1011100000000000000000000000000000000000CF -:1011200000000000000000000000000000000000BF +:100930000000000000000000000000000000045162 +:100940000144404504111111104444411110444424 +:100950000444411110444411110444411110444411 +:100960001111044441111044441111044441111067 +:1009700044441111044441111044441111044441F0 +:10098000111044441111090441141044441111047C +:1009900044411110444411110444411110444411C4 +:1009A00011044441111044441111044441111044F4 +:1009B00044111104444111104444111104444111E3 +:1009C00010444411110444411110444411110060B9 +:1009D0004E00018030632019F88B188311F8A0189D +:1009E00000F186260000001B800618C318B0306096 +:1009F0000C0B00F00045E2602860180D00018980B2 +:100A0000188067F830B8C0000046C060030180005D +:100A1000C1830030830020004000100060001820D7 +:100A200000C10010C0C000000060400000060000CF +:100A3000000030000002D8C0C20100E10130000017 +:100A4000200000000180060000D026630F1800027D +:100A50006002A04040000080C200000430C10608CF +:100A6000075060060001B00C02003EC20030400D8D +:100A700000F80800C02034686036184080100F84E9 +:100A8000800C02034786030C10C100000C00180202 +:100A9000678020010000C18CF1998000A41908032F +:100AA00018C0031800000C00000003187800000CA8 +:100AB0003C0060C0C60C0006000E0000001C0012C6 +:100AC0000019E18180003300800320000001D00282 +:100AD00010000000000E00016000842F000800C01C +:100AE000000080080100100080100100100203A027 +:100AF0000000300E30C0002780008463ED249A018E +:100B000018614C0CF3CD78812612104B4300DA9813 +:100B1000090002820200F0601020640C14080C002E +:100B2000820481E8170449805361B0101030240B0F +:100B300050000844C1432C600C03320300001D0028 +:100B4000700380006CC00C000198000040031CC6BC +:100B5000400C18C30000307006CC26D9CB01D070F1 +:100B6000C8D70C2B03000311606C0E1900200B0179 +:100B7000808000002B19B58C5BC21988300101B050 +:100B80000C6302D3A848131A6902828014446100DE +:100B90000033C00000000000000000000003866871 +:100BA000CC6001B30D80001BC018300D80091C0003 +:100BB000C00C21E30600C00CD36980360103278DE9 +:100BC000A602980019B336508ED841B07864A32499 +:100BD000A4C357318C18643C28C00001936D30C009 +:100BE000003C6D0019019A303000302B43000001A9 +:100BF000D893C6130041B4B0F6C06CC30000040023 +:100C000000198C003E0C0C00C0034C0022D6036877 +:100C100087860200C8916900C9C569821908001E4B +:100C2000113680222009602C22368D80C6408B60D0 +:100C300086F618864A232003FC000006060C0900ED +:100C40000168050A16980005A008580A1600020057 +:100C5000800020343CC320130C00101000DA602CFC +:100C600000416B60008000CC13C60300629EB4A5F7 +:100C7000A501694D4C83045003D80000C06EA3B495 +:100C80003082BE000C400630B4B4C008000D0080B5 +:100C9000B04D20D03027460A5AF3016042D20011ED +:100CA0000160C322581804110906F4605350E4018E +:100CB0000C3002018100DC6DB31E06061A0059ECEF +:100CC000890019F84F0C02379800610C30000003BE +:100CD00018D8DE183C36000CC0033006D8000009D6 +:100CE0008CC3000499C639984C33106D1000CD01A7 +:100CF0008A0091000000690019660018314000CC9C +:100D0000F00B99860020606080C323320231930388 +:100D10000000000000020C00300C618C0FD8CC29C0 +:100D2000836C0800140300004600006018001800DF +:100D300008B6002014360021B0000C100E18006018 +:100D4000060601F8018E40B00F0001C18300CCE01F +:100D50001830257600181100087D812BFFC00C008B +:100D600008809540060040C2000000180000780E80 +:100D70000100000400002653035211402000032804 +:100D8000100300D03100C4023180001601000000C1 +:100D9000010006003002C58088980300C1004002AF +:100DA000A8004906AB06A0922C00068C35360096AA +:100DB0006041001A2A0AEA019DD330CC6D91061ACF +:100DC0000C3D9021101A403040C031A0050C0000AD +:100DD000038008200281600F413958C80003600079 +:100DE00096AA18018DD3116800740C3300480C03C7 +:100DF0006034AC0C3C0C460183C000600009DE820C +:100E00004D0199A8A36908CC46C2B0E60CC6D0062D +:100E1000430600036C600300032A4D868005A0B4DE +:100E200068002D4498236A4C162C1B86C663016605 +:100E3000F41B160C1B82D6620AA46C3133480C8357 +:100E400000D020C600330C0C010001B466602CD920 +:100E500083F67303E4B0DE0103C2404100C06203C5 +:100E600038C60656C3646C673912C9806280EF00C9 +:100E700062C3290984C102F0040029156CCC0080EA +:100E80000C00303E06E0C818303034C02E034C0150 +:100E90000310303828180046C00001B000280001B7 +:100EA00098C0BC00143C0D660880C26000C6000CEF +:100EB000AC0C130C00C00180280000030120019637 +:100EC0006C153300038CD80016003A02266CC0D192 +:100ED000908B60454032824814220C3077D826C669 +:100EE0000306D0EC60199A045600111184000680A4 +:100EF00020680B0700888800022B400176104444CC +:100F0000A80009104006120AE899D40CD045AEB2E8 +:100F1000332C58D10D198CECB20018020001810459 +:100F20009C314000186000C6CC196330B0750830A1 +:100F300060099601EC0CE1AE018C461DC25F3C637A +:100F40003119ACC58B604D005B1D024141CF61CFB3 +:100F500060CF603FF347B0030080016000F6047784 +:100F6000F083B0801820004E0032D400DA1A00421C +:100F700088A860C500000700E1038403D800403F53 +:100F80001D930144000C6089112380418362540049 +:100F900043260B6C0C109000B4D8661D83C00083F0 +:100FA000F688220001C0CB2C81811400140B86C36B +:100FB00060000170B86C360000170386C0E062075D +:100FC0008048D80382848CF73CC34FD803E0040CDC +:100FD000010621808E21A600C55722028550133CB0 +:100FE000FC006200000C00C021B0C10002000583BB +:100FF00040021083623005460063C300600018673A +:101000008FE6E0ED9CFB7B3FEC48FF72419C9066D5 +:1010100021508066F233F80BA00030C661B0A264A4 +:1010200060130D000188002780FFF10080CD04814E +:101030008E3062010EBC4389E1BDC402BB18004082 +:1010400010128A280E560506C0C1B0582060B22C76 +:10105000D9803050184000C0000604006131607231 +:10106000CE2CE58E59C19CB026390488CAC6106CB6 +:1010700090061700008E2A01ACC000030603058607 +:10108000000C044005016000C4030180C300060297 +:10109000804282216063011809804CC0A4007D96C3 +:1010A00004200084200810408104080040810204CC +:1010B000040820408204010210810804100210205C +:1010C0000840408104080204200810082100810122 +:1010D000041010200841040848102021001021208D +:1010E0004082040020400204102041020010200829 +:1010F00042102040420204082040008104081040B1 +:1011000080040820408204002040108401020084F2 +:1011100020108410810842002100408404082040EF +:101120008204008840000000000000000000000071 :1011300000000000000000000000000000000000AF :10114000000000000000000000000000000000009F -:10115000000000000000000000000000000000008F -:10116000000000000000000000000000000000007F -:10117000000000000000000000000000000000006F +:1011500000004000101D4000005410D0141ADA0C9A +:1011600046F043B8000000000000000000DEB000C0 +:10117000000000000000400000000000000000002F :10118000000000000000000000000000000000005F :10119000000000000000000000000000000000004F :1011A000000000000000000000000000000000003F :1011B000000000000000000000000000000000002F -:1011C000000000000000000000000000000000001F -:1011D000000000000000000000000000000000000F +:1011C000000000000002000000000000000000001D +:1011D0000800000000000000000000000000000007 :1011E00000000000000000000000000000000000FF :1011F00000000000000000000000000000000000EF -:1012000000000000000000000000000000000000DE -:1012100000000000000000000000000000000000CE +:1012000000000000000000000000000000020000DC +:1012100000000000000000000800000000000000C6 :1012200000000000000000000000000000000000BE :1012300000000000000000000000000000000000AE :10124000000000000000000000000000000000009E :10125000000000000000000000000000000000008E -:10126000000000000000000000000000000000007E -:10127000000000000000000000000000000000006E +:101260000000000400111000400000088802222045 +:10127000888822220000000000000000000000001A :10128000000000000000000000000000000000005E :10129000000000000000000000000000000000004E -:1012A000000000000000000000000000000000003E +:1012A00000000000000000000000044000010000F9 :1012B000000000000000000000000000000000002E :1012C000000000000000000000000000000000001E :1012D000000000000000000000000000000000000E :1012E00000000000000000000000000000000000FE -:1012F00000000000000000000000000000000000EE -:1013000000000000000000000000000000000000DD -:1013100000000000000000000000000000000000CD -:1013200000000000000000000000000000000000BD -:1013300000000000000000000000000000000000AD -:10134000000000000000000000000000000000009D -:10135000000000000000000000000000000000008D -:10136000000000000000000000000000000000007D -:10137000000000000000000000000000000000006D -:10138000000000000000000000000000000000005D -:10139000000000000000000000000000000000004D -:1013A000000000000000000000000000000000003D -:1013B000000000000000000000000000000000002D -:1013C000000000000000000000000000000000001D -:1013D000000000000000000000000000000000000D -:1013E00000000000000000000000000000000000FD -:1013F00000000000000000000000000000000000ED -:1014000000000000000000000000000000000000DC -:1014100000000000000000000000000000000000CC -:1014200000000000000000000000000000000000BC -:1014300000000000000000000000000000000000AC -:10144000000000000000000000000000000000009C -:10145000000000000000000000000000000000008C -:10146000000000000000000000000000000000007C -:10147000000000000000000000000000000000006C -:10148000000000000000000000000000000000005C -:10149000000000000000000000000000000000004C -:1014A000000000000000000000000000000000003C -:1014B000000000000000000000000000000000002C -:1014C000000000000000000000000000000000001C -:1014D000000000000000000000000000000000000C -:1014E00000000000000000000000000000000000FC -:1014F00000000000000000000000000000000000EC -:1015000000000000000000000000000000000000DB -:1015100000000000000000000000000000000000CB -:1015200000000000000000000000000000000000BB -:1015300000000000000000000000000000000000AB -:10154000000000000000000000000000000000009B -:10155000000000000000000000000000000000008B -:10156000000000000000000000000000000000007B -:10157000000000000000000000000000000000006B -:10158000000000000000000000000000000000005B -:10159000000000000000000000000000000000004B -:1015A000000000000000000000000000000000003B -:1015B000000000000000000000000000000000002B -:1015C000000000000000000000000000000000001B -:1015D000000000000000000000000000000000000B -:1015E00000000000000000000000000000000000FB -:1015F00000000000000000000000000000000000EB -:1016000000000000000000000000000000000000DA -:1016100000000000000000000000000000000000CA -:1016200000000000000000000000000000000000BA -:1016300000000000000000000000000000000000AA -:10164000000000000000000000000000000000009A -:10165000000000000000000000000000000000008A -:10166000000000000000000000000000000000007A -:10167000000000000000000000000000000000006A -:10168000000000000000000000000000000000005A -:10169000000000000000000000000000000000004A -:1016A000000000000000000000000000000000003A -:1016B000000000000000000000000000000000002A -:1016C000000000000000000000000000000000001A -:1016D000000000000000000000000000000000000A -:1016E00000000000000000000000000000000000FA -:1016F00000000000000000000000000000000000EA -:1017000000000000000000000000000000000000D9 -:1017100000000000000000000000000000000000C9 -:1017200000000000000000000000000000000000B9 -:1017300000000000000000000000000000000000A9 -:101740000000000000000000000000000000000099 -:101750000000000000000000000000000000000089 -:101760000000000000000000000000000000000079 -:101770000000000000000000000000000000000069 -:101780000000000000000000000000000000000059 -:101790000000000000000000000000000000000049 -:1017A0000000000000000000000000000000000039 -:1017B0000000000000000000000000000000000029 -:1017C0000000000000000000000000000000000019 -:1017D0000000000000000000000000000000000009 -:1017E00000000000000000000000000000000000F9 -:1017F00000000000000000000000000000000000E9 -:1018000000000000000000000000000000000000D8 -:1018100000000000000000000000000000000000C8 -:1018200000000000000000000000000000000000B8 -:1018300000000000000000000000000000000000A8 -:101840000000000000000000000000000000000098 -:101850000000000000000000000000000000000088 -:101860000000000000000000000000000000000078 -:101870000000000000000000000000000000000068 -:101880000000000000000000000000000000000058 -:101890000000000000000000000000000000000048 -:1018A0000000000000000000000000000000000038 -:1018B0000000000000000000000000000000000028 -:1018C0000000000000000000000000000000000018 -:1018D0000000000000000000000000000000000008 -:1018E00000000000000000000000000000000000F8 -:1018F00000000000000000000000000000000000E8 -:1019000000000000000000000000000000000000D7 -:1019100000000000000000000000000000000000C7 -:1019200000000000000000000000000000000000B7 -:1019300000000000000000000000000000000000A7 -:101940000000000000000000000000000000000097 -:101950000000000000000000000000000000000087 -:101960000000000000000000000000000000000077 -:101970000000000000000000000000000000000067 -:101980000000000000000000000000000000000057 -:101990000000000000000000000000000000000047 -:1019A0000000000000000000000000000000000037 -:1019B0000000000000000000000000000000000027 -:1019C0000000000000000000000000000000000017 -:1019D0000000000000000000000000000000000007 -:1019E00000000000000000000000000000000000F7 -:1019F00000000000000000000000000000000000E7 -:101A000000000000000000000000000000000000D6 -:101A100000000000000000000000000000000000C6 -:101A200000000000000000000000000000000000B6 -:101A300000000000000000000000000000000000A6 -:101A40000000000000000000000000000000000096 -:101A50000000000000000000000000000000000086 -:101A60000000000000000000000000000000000076 -:101A70000000000000000000000000000000000066 -:101A80000000000000000000000000000000000056 -:101A90000000000000000000000000000000000046 +:1012F000000001C2840000204C020420948002A05F +:10130000A090C14000B04001400040AA0000000889 +:10131000052000000000018004030014400C002997 +:10132000FF000053F810A2470010800000281801A9 +:101330000001018000020300030000060001800696 +:1013400000018000000100009000000000004C003F +:1013500060000060030000003000040400982C20AE +:1013600000600008002000000100100040100C1078 +:1013700000808870C000148240000004400001100A +:1013800020800400420540061032000C000214C008 +:101390000030019008500000C00800050126180028 +:1013A000A0208514000C008002B01208008000020A +:1013B000880019006480000B0404C01C9011001800 +:1013C0002C210A8421000C2002000C024021031869 +:1013D0004808402C244408000000000805140001BF +:1013E00000A800000010410200405060B2810100DE +:1013F000880290CE0408940820848880002C5290A3 +:101400001345099120D21821A40A43421E41A43455 +:10141000434809068128706470D0052B80C0840081 +:101420000004820010404094500080112C1211C41E +:1014300048431CB0814102020A4A60D00025883826 +:1014400005020802825001C21A04400052CC10105A +:10145000002022489480009080321903049111C327 +:1014600080008908A8054000000040860010001098 +:10147000400A18100100404200410184410001105F +:101480000018222400004000200A028001A80480E5 +:1014900000000A0102920C007B10B5086AA2200825 +:1014A00001002400090801B0A849701E0B02C28087 +:1014B00056C402040022800000000000000000006A +:1014C0000001040001200041024000022444802267 +:1014D00010C41410000800000400000811080010D7 +:1014E0000000000824008000100012C18A2400E1DE +:1014F00004244024204110218A00000808800001B3 +:10150000035120800A084100000102202000020847 +:1015100040000001C000801200002480A25028A0DA +:101520000000440000080002E400800000024800BF +:101530006696000880000000001949000045490235 +:101540008108BC0935128E6FF0014023EA34048E05 +:101550008153AA400040188806FEA3ED0001FF0059 +:101560002008C900600C0F181490000520085009CD +:10157000103FEA0081F0000420000010000000107D +:1015800000D2002800414B4000840000000002000F +:10159000009CA4252521494940E00D50600004002D +:1015A000040800010040000182074B00A4F4000D74 +:1015B00000090080A04120DAC00044005AC003485E +:1015C00042920D09051180F254101431010E0740AA +:1015D00053100405080002028100000000000CC442 +:1015E0001201504811002200000B502D4C64821053 +:1015F0006F4F59208434F01608214A406166684CC8 +:10160000B73D64804AB2D48002B5280A0822002D72 +:1016100010201108020000006D0018060000800074 +:1016200023025080020110001000031842800020A5 +:1016300003204001004211110C81029002A0000021 +:1016400000000900000500002224000A806000005C +:10165000120020000AD40023D4C600201D488A604E +:10166000814006050C6040101000400000000000A2 +:101670000000400000000000020000000800001010 +:1016800000000000488004540000020200A014354D +:101690005800C4402210042002003752026A11C0D0 +:1016A00028506608110202900140B402136A827544 +:1016B00030302802800C04C2A002AB000880020077 +:1016C00041084001880061045404A0B26800008011 +:1016D00039800195004300532A037B0481701C006C +:1016E0000801021008388021300840308180608075 +:1016F00001280000010008200096600A4010000840 +:101700000000400094AA024501901148200498145A +:101710000C480000000000802C0A0E0121CA00C8FD +:1017200000383682C1200818000108800000E0005F +:101730000080100042040003450000000002410444 +:10174000800500200800294490204A4800001940E4 +:1017500044420000A40100081940944000004820C1 +:1017600001084050111000000022080801022688DC +:101770001134108440A552200066850001C2244126 +:10178000488030200C6B4202212024252902C00110 +:1017900000004800101E10A000014023001A021192 +:1017A000498100801808290410498010002924115B +:1017B000A400400540002030089010400A0020603E +:1017C000206050091000A0010428015001848040CD +:1017D000808408002800900018810080200D0C00F3 +:1017E000011200000811222E010010401410922650 +:1017F00001200913808A4045422821088022206068 +:1018000070B00C000011D021240004000000000082 +:1018100000000C812068000200000000000A500057 +:1018200000800000280009004804924AC8021408F9 +:1018300082040C00004C5090090008408108981068 +:1018400084000208892242005000010A880C32C537 +:101850004820E7182481671140140864000000291B +:1018600082422810040800440800C9005A9904491B +:10187000428A028A008A0000000A4700061010000F +:1018800000200200206000000010704C9FB3B518CB +:101890005312032008A800855C410A214109040075 +:1018A00000040000000000080150004844010284C8 +:1018B00022425040222426580808B0282404000060 +:1018C000600260012400A026098306A8A103CC00C1 +:1018D000C423000000100C603000000180C603002B +:1018E0000040001B0004900004A420002801429145 +:1018F000C2040008020229000190641000000100E7 +:10190000020410C000010011CA484081252C01E0EA +:1019100018000040432020019B1489403010823081 +:101920005024141100004040001252000800AD4045 +:101930000404460000000C001046945000162E00CF +:10194000E36008600A0309FF0F80C0847CF801028D +:1019500001C4458106A0420230884C0A20240400BC +:1019600000016101101060C00400081C8F0C000011 +:101970000000000891084AD180000800008000841F +:10198000000204A0140140040280280400500080DA +:101990008A01405410114211810400210000F38299 +:1019A00039518013F23434C7781E1FCC8470A8C418 +:1019B00009FF1A1A0FF8403C1C101100830E182062 +:1019C00012C049000427008420081040892408021E +:1019D000408102040408224082044112108108045C +:1019E0009002102008444489040882042008100949 +:1019F0002100890124909120084904084891202160 +:101A00000010212040822401224002241022490299 +:101A100000102008421120424202040820400081A8 +:101A2000040810408004082040820401204490846F +:101A3000011200842090841081084201210040841A +:101A4000040820408204008840C17C00090820E38B +:101A50001348181731DC471191A31C1C860190CC48 +:101A6000512000802182040D4210A1E5109BC10687 +:101A70008801110003004DDC01088C0021450004A1 +:101A80001024384C30C003CC000000000FFF03FFCF +:101A9000FC94AF00000000000000D0000000000037 :101AA0000000000000000000000000000000000036 :101AB0000000000000000000000000000000000026 :101AC0000000000000000000000000000000000016 :101AD0000000000000000000000000000000000006 -:101AE00000000000000000000000000000000000F6 -:101AF00000000000000000000000000000000000E6 +:101AE00000000000000000000002000000000000F4 +:101AF00000000000080000000000000000000000DE :101B000000000000000000000000000000000000D5 :101B100000000000000000000000000000000000C5 :101B200000000000000000000000000000000000B5 -:101B300000000000000000000000000000000000A5 +:101B3000000200000000000000000000080000009B :101B40000000000000000000000000000000000095 :101B50000000000000000000000000000000000085 :101B60000000000000000000000000000000000075 :101B70000000000000000000000000000000000065 -:101B80000000000000000000000000000000000055 -:101B90000000000000000000000000000000000045 -:101BA0000000000000000000000000000000000035 -:101BB0000000000000000000000000000000000025 -:101BC0000000000000000000000000000000000015 -:101BD0000000000000000000000000000000000005 -:101BE00000000000000000000000000000000000F5 -:101BF00000000000000000000000000000000000E5 -:101C000000000000000000000000000000000000D4 -:101C100000000000000000000000000000000000C4 -:101C200000000000000000000000000000000000B4 -:101C300000000000000000000000000000000000A4 -:101C40000000000000000000000000000000000094 -:101C50000000000000000000000000000000000084 -:101C60000000000000000000000000000000000074 -:101C70000000000000000000000000000000000064 -:101C80000000000000000000000000000000000054 -:101C90000000000000000000000000000000000044 -:101CA0000000000000000000000000000000000034 -:101CB0000000000000000000000000000000000024 -:101CC0000000000000000000000000000000000014 -:101CD0000000000000000000000000000000000004 -:101CE00000000000000000000000000000000000F4 -:101CF00000000000000000000000000000000000E4 -:101D000000000000000000000000000000000000D3 -:101D100000000000000000000000000000000000C3 -:101D200000000000000000000000000000000000B3 -:101D300000000000000000000000000000000000A3 -:101D40000000000000000000000000000000000093 -:101D50000000000000000000000000000000000083 -:101D60000000000000000000000000000000000073 -:101D70000000000000000000000000000000000063 -:101D80000000000000000000000000000000000053 -:101D90000000000000000000000000000000000043 -:101DA0000000000000000000000000000000000033 -:101DB0000000000000000000000000000000000023 -:101DC0000000000000000000000000000000000013 -:101DD0000000000000000000000000000000000003 -:101DE00000000000000000000000000000000000F3 -:101DF00000000000000000000000000000000000E3 -:101E000000000000000000000000000000000000D2 -:101E100000000000000000000000000000000000C2 -:101E200000000000000000000000000000000000B2 -:101E300000000000000000000000000000000000A2 -:101E40000000000000000000000000000000000092 -:101E50000000000000000000000000000000000082 -:101E60000000000000000000000000000000000072 -:101E70000000000000000000000000000000000062 -:101E80000000000000000000000000000000000052 -:101E90000000000000000000000000000000000042 -:101EA0000000000000000000000000000000000032 -:101EB0000000000000000000000000000000000022 -:101EC0000000000000000000000000000000000012 -:101ED0000000000000000000000000000000000002 -:101EE00000000000000000000000000000000000F2 -:101EF00000000000000000000000000000000000E2 -:101F000000000000000000000000000000000000D1 -:101F100000000000000000000000000000000000C1 -:101F200000000000000000000000000000000000B1 -:101F300000000000000000000000000000000000A1 -:101F40000000000000000000000000000000000091 -:101F50000000000000000000000000000000000081 -:101F60000000000000000000000000000000000071 -:101F70000000000000000000000000000000000061 -:101F80000000000000000000000000000000000051 -:101F90000000000000000000000000000000000041 -:101FA0000000000000000000000000000000000031 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000000000000011 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF00000000000000000000000000000000000E1 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000000000000000000000000000B0 -:1020300000000000000000000000000000000000A0 -:102040000000000000000000000000000000000090 -:102050000000000000000000000000000000000080 -:102060000000000000000000000000000000000070 -:102070000000000000000000000000000000000060 -:102080000000000000000000000000000000000050 -:102090000000000000000000000000000000000040 -:1020A0000000000000000000000000000000000030 -:1020B0000000000000000000000000000000000020 -:1020C0000000000000000000000000000000000010 -:1020D0000000000000000000000000000000000000 -:1020E00000000000000000000000000000000000F0 -:1020F00000000000000000000000000000000000E0 -:1021000000000000000000000000000000000000CF -:1021100000000000000000000000000000000000BF -:1021200000000000000000000000000000000000AF -:10213000000000000000000000000000000000009F -:10214000000000000000000000000000000000008F -:10215000000000000000000000000000000000007F -:10216000000000000000000000000000000000006F -:10217000000000000000000000000000000000005F -:10218000000000000000000000000000000000004F -:10219000000000000000000000000000000000003F -:1021A000000000000000000000000000000000002F -:1021B000000000000000000000000000000000001F -:1021C000000000000000000000000000000000000F -:1021D00000000000000000000000000000000000FF -:1021E00000000000000000000000000000000000EF -:1021F00000000000000000000000000000000000DF -:1022000000000000000000000000000000000000CE -:1022100000000000000000000000000000000000BE -:1022200000000000000000000000000000000000AE -:10223000000000000000000000000000000000009E -:10224000000000000000000000000000000000008E -:10225000000000000000000000000000000000007E -:10226000000000000000000000000000000000006E -:10227000000000000000000000000000000000005E -:10228000000000000000000000000000000000004E -:10229000000000000000000000000000000000003E -:1022A000000000000000000000000000000000002E -:1022B000000000000000000000000000000000001E -:1022C000000000000000000000000000000000000E -:1022D00000000000000000000000000000000000FE -:1022E00000000000000000000000000000000000EE -:1022F00000000000000000000000000000000000DE -:1023000000000000000000000000000000000000CD -:1023100000000000000000000000000000000000BD -:1023200000000000000000000000000000000000AD -:10233000000000000000000000000000000000009D -:10234000000000000000000000000000000000008D -:10235000000000000000000000000000000000007D -:10236000000000000000000000000000000000006D -:10237000000000000000000000000000000000005D -:10238000000000000000000000000000000000004D -:10239000000000000000000000000000000000003D -:1023A000000000000000000000000000000000002D -:1023B000000000000000000000000000000000001D +:101B80000000000000000450010000450411111184 +:101B90001044444111104444044441111044441180 +:101BA00011044441111044441111044441111044E2 +:101BB00044111104444111104444111104444111D1 +:101BC00010444411110444411110444411110804FB +:101BD00041101044441111044441111044441111A6 +:101BE000044441111044441111044441111044446F +:101BF00011110444411110444411110444411110C5 +:101C0000444411110444411110444411110444414D +:101C1000111044441111034048018100200020218B +:101C200021C823F2102080100001842401FE00024C +:101C30000004108010002040000A00800E050240C1 +:101C400044000000F00009020000408700004F003F +:101C5000039DBC06C23D988E3C7331001BFE07E21B +:101C60000FF883E204BA811704093F83FC2C7FFF3D +:101C70003A174FFFF3E17CFFFF3F0BCFFFF007BCAC +:101C800001FD3E9001CFF0000000000001000003C4 +:101C9000FC10599E32F7CFFD90005C4648000000D2 +:101CA0008000020020810408098F438438B220009C +:101CB0000B0748801C2065911D20407080A0044DBA +:101CC0004004004FCC11C20C05480A00443C0208F5 +:101CD00010811720B80053F0450430FB01028A48F8 +:101CE000A211146BAE13FF4210832010E1380800DC +:101CF000000A021050028008280040818408E32076 +:101D00001469005DC31000927E12594C5E300418B5 +:101D1000F102000042F91002E0000000000800009B +:101D20001F10D6A80D4D00000000000000020000AA +:101D300000000000000002800369A02C2088303DD4 +:101D40000005AF901A0CD7E41041400C920508032F +:101D5000F63FFE4AF0208BD4693B0207C7B400006F +:101D600010FA44001F800003EFAC0187140F82A714 +:101D7000D04000D7E62043807020010482B20809D9 +:101D80000832200010D0110162C316C009240030AF +:101D900012458A804294B00052101480A0020020A4 +:101DA000000218348A0681810C12001A62000003B6 +:101DB0004F80102100208CA0508160203C24644082 +:101DC000C080000C088000000842011D88C8311640 +:101DD00029CAAA80F4C4054D00208000000000003C +:101DE00000000000000314C802940000001000A2CC +:101DF000002320002100008080002008200000082F +:101E0000B25C0084620020097001C00043410440BC +:101E1000C0908220004530052802508170340400B3 +:101E20001C0000C1104B800000004B800101170016 +:101E300080002B5AC20000000430043800040EA2B7 +:101E40008404008210000F69A00344000102C8004E +:101E50008002E00032BA088C8004000018315C0077 +:101E600018015C02755801901384892222718C300C +:101E7000220041048840888058880181022260E065 +:101E800000E63E0171081D40E018059915C0006587 +:101E900070FEC008392B820CD072334C282C0012F3 +:101EA000884610100017002000015D100090010806 +:101EB0001804080101D0AC7575015D4B589294501F +:101EC0005C2019420500100028202105288000C050 +:101ED000AF840008000B809183F3A8902B08C940C1 +:101EE0005610BD4042BB04018344A07BD04235194B +:101EF000B10184C05CF42DD1306B86E8D1E20411CD +:101F0000041004041790D1104B7A121582BAD02D08 +:101F10005000401820010012009005710AE04100B5 +:101F20009000047C100C00411880220C059C1000CD +:101F3000082080D1900401030A001073FC78DC2390 +:101F400011040AE503000000A0020100840255000C +:101F500028BC1800CA0000825C4835172C895A90AA +:101F60002298527108020080004A50C5E020178E66 +:101F7000C0731794505E05CBC4A570A878C1A81291 +:101F8000200D8840A160864105654A052224E407AA +:101F9000C00AF60E6F12881862CF080DC277605E15 +:101FA000FC8928161206E2E24F9C245210144027A6 +:101FB00070B414315B1515C16F81A5645D71045651 +:101FC0008247C253A057640A5002B6B201080C7B84 +:101FD0000228063420162C62880C0442AB82055C71 +:101FE00048C738174540E2BA9CDB37048A0C369361 +:101FF0003AECB98025C04AB020EFD8027E135B8846 +:102000000510000005102417892811A51892D21B6D +:102010005384E920055C001A0256CFF843A17C0CDA +:10202000F610D00D6C00C0009DBB2703833C339D90 +:102030008016402CC2C7F330448469F8040002A122 +:10204000724068008A3EA3CFF502003C6C80298074 +:10205000080001084000B10D420000500000248B30 +:102060002C3243018024740E88012B4E81A06F48CE +:102070009929100004524148C4009809100C1450CA +:1020800074D812EF0A5B8000A03820200C200000DA +:102090000102AB0C00810980052C120040201000C9 +:1020A00001043B430280C100129480881208484218 +:1020B0001022900073030240050036540183020C85 +:1020C00084E8003D2A0081C2EB24A90D20D883605A +:1020D000409A4C007802C0432A000860280622C1BA +:1020E000074FF12124200B0100818800172803C825 +:1020F00020808040E0048010A8181C0AAA81F2C445 +:10210000E17C3F94CB0B411008BFA215030830734C +:102110007D04AF0711D0013E20BED05FF824004FF0 +:102120008173F064F5B30484000480485C210000EE +:1021300004C0100324100180227882600000000097 +:10214000023C4400280040007C001C030201120FE6 +:10215000C8005F08900C79800824D39C39E2038979 +:102160008140082D79105D4218214C5C10170084C5 +:1021700080F2800AA05210204185100042685CFC69 +:1021800001000053004608000830608C581269A016 +:10219000FA191AD5CD820182108213000040200066 +:1021A000B8000040008C0000001820000000748C73 +:1021B0000022140002121C0208A8120500956E2DC0 +:1021C000D34F4FA002A47C0001588011039B5856A6 +:1021D000C03148824212D03004AC005A4A41526E9B +:1021E000A00088012009D0B02C34AD9D00A502F2DA +:1021F00081490054FC3F580C0A914FE8F58100A931 +:10220000C4FEB35814584300604496C02E80780032 +:10221000221C04322024702B6029214031F075A843 +:102220008A31052000648020000000000003003097 +:1022300021008100214D8000F00000010227C5052A +:10224000401000000280040000008048001252127A +:102250001804A5013A004E8105854C13A1809458BD +:10226000D517260001610000000800F00000000002 +:102270007807F00080000001002000000B200281A0 +:10228000434D40001627FF0F0D01696C2414060D05 +:102290008002026020008708100000E281C0E40E86 +:1022A0001E6043F203C120660920CC0CC190198046 +:1022B000F83304080A8410289804000000882002DB +:1022C0002280F00000000C09E0000000781E3E00B3 +:1022D0000000000004F00001880000003C9EFC3774 +:1022E000D64FB330CBFC1110042408842089104849 +:1022F00091048900489122444488244882448122E0 +:10230000109108041202122088484891048902445E +:1023100020891088210891010410122408410488A2 +:102320004912202120122124488244822448224438 +:102330001224412241122408421224444242448879 +:102340002448089104891048904489244882448292 +:1023500024481084112240842010841091084242A5 +:1023600021204884448924488244808848640704A2 +:10237000AAC0C541C550E8803984010E82139894E3 +:10238000460B88418170E048840D04500308112DEC +:10239000D00122010101C1C0F0104200101D4C000B +:1023A00020001080000A020FCA80001C00000000FC +:1023B000000000000018B0000000000000007000E5 :1023C000000000000000000000000000000000000D :1023D00000000000000000000000000000000000FD :1023E00000000000000000000000000000000000ED :1023F00000000000000000000000000000000000DD -:1024000000000000000000000000000000000000CC -:1024100000000000000000000000000000000000BC +:1024000000000000000000000000000000020000CA +:1024100000000000000000000800000000000000B4 :1024200000000000000000000000000000000000AC :10243000000000000000000000000000000000009C :10244000000000000000000000000000000000008C -:10245000000000000000000000000000000000007C -:10246000000000000000000000000000000000006C +:10245000000000000002000000000000000000007A +:102460000800000000000000000000000000000064 :10247000000000000000000000000000000000005C :10248000000000000000000000000000000000004C :10249000000000000000000000000000000000003C @@ -258851,433 +258851,433 @@ :102E200000000000000000000000000000000000A2 :102E30000000000000000000000000000000000092 :102E40000000000000000000000000000000000082 -:102E50000000000000000000000000000000000072 -:102E60000000000000000000000000000000000062 -:102E70000000000000000000000000000000000052 -:102E80000000000000000000000000000000000042 -:102E90000000000000000000000000000000000032 -:102EA0000000000000000000000000000000000022 -:102EB0000000000000000000000000000000000012 -:102EC0000000000000000000000000000000000002 -:102ED00000000000000000000000000000000000F2 -:102EE00000000000000000000000000000000000E2 -:102EF00000000000000000000000000000000000D2 -:102F000000000000000000000000000000000000C1 -:102F100000000000000000000000000000000000B1 -:102F200000000000000000000000000000000000A1 -:102F30000000000000000000000000000000000091 -:102F40000000000000000000000000000000000081 -:102F50000000000000000000000000000000000071 -:102F60000000000000000000000000000000000061 -:102F70000000000000000000000000000000000051 -:102F80000000000000000000000000000000000041 -:102F90000000000000000000000000000000000031 -:102FA0000000000000000000000000000000000021 -:102FB0000000000000000000000000000000000011 -:102FC0000000000000000000000000000000000001 -:102FD00000000000000000000000000000000000F1 -:102FE00000000000000000000000000000000000E1 -:102FF00000000000000000000000000000000000D1 -:1030000000000000000000000000000000000000C0 -:1030100000000000000000000000000000000000B0 -:1030200000000000000000000000000000000000A0 -:103030000000000000000000000000000000000090 -:103040000000000000000000000000000000000080 -:103050000000000000000000000000000000000070 -:103060000000000000000000000000000000000060 -:103070000000000000000000000000000000000050 -:103080000000000000000000000000000000000040 -:103090000000000000000000000000000000000030 -:1030A0000000000000000000000000000000000020 -:1030B0000000000000000000000000000000000010 -:1030C0000000000000000000000000000000000000 -:1030D00000000000000000000000000000000000F0 -:1030E00000000000000000000000000000000000E0 -:1030F00000000000000000000000000000000000D0 -:1031000000000000000000000000000000000000BF -:1031100000000000000000000000000000000000AF -:10312000000000000000000000000000000000009F -:10313000000000000000000000000000000000008F -:10314000000000000000000000000000000000007F -:10315000000000000000000000000000000000006F -:10316000000000000000000000000000000000005F -:10317000000000000000000000000000000000004F -:10318000000000000000000000000000000000003F -:10319000000000000000000000000000000000002F -:1031A000000000000000000000000000000000001F -:1031B000000000000000000000000000000000000F -:1031C00000000000000000000000000000000000FF -:1031D00000000000000000000000000000000000EF -:1031E00000000000000000000000000000000000DF -:1031F00000000000000000000000000000000000CF -:1032000000000000000000000000000000000000BE -:1032100000000000000000000000000000000000AE -:10322000000000000000000000000000000000009E -:10323000000000000000000000000000000000008E -:10324000000000000000000000000000000000007E -:10325000000000000000000000000000000000006E -:10326000000000000000000000000000000000005E -:10327000000000000000000000000000000000004E -:10328000000000000000000000000000000000003E -:10329000000000000000000000000000000000002E -:1032A000000000000000000000000000000000001E -:1032B000000000000000000000000000000000000E -:1032C00000000000000000000000000000000000FE -:1032D00000000000000000000000000000000000EE -:1032E00000000000000000000000000000000000DE -:1032F00000000000000000000000000000000000CE -:1033000000000000000000000000000000000000BD -:1033100000000000000000000000000000000000AD -:10332000000000000000000000000000000000009D -:10333000000000000000000000000000000000008D -:10334000000000000000000000000000000000007D -:10335000000000000000000000000000000000006D -:10336000000000000000000000000000000000005D -:10337000000000000000000000000000000000004D -:10338000000000000000000000000000000000003D -:10339000000000000000000000000000000000002D -:1033A000000000000000000000000000000000001D -:1033B000000000000000000000000000000000000D -:1033C00000000000000000000000000000000000FD -:1033D00000000000000000000000000000000000ED -:1033E00000000000000000000000000000000000DD -:1033F00000000000000000000000000000000000CD -:1034000000000000000000000000000000000000BC -:1034100000000000000000000000000000000000AC -:10342000000000000000000000000000000000009C -:10343000000000000000000000000000000000008C -:10344000000000000000000000000000000000007C -:10345000000000000000000000000000000000006C -:10346000000000000000000000000000000000005C -:10347000000000000000000000000000000000004C -:10348000000000000000000000000000000000003C -:10349000000000000000000000000000000000002C -:1034A000000000000000000000000000000000001C -:1034B000000000000000000000000000000000000C -:1034C00000000000000000000000000000000000FC -:1034D00000000000000000000000000000000000EC -:1034E00000000000000000000000000000000000DC -:1034F00000000000000000000000000000000000CC -:1035000000000000000000000000000000000000BB -:1035100000000000000000000000000000000000AB -:10352000000000000000000000000000000000009B -:10353000000000000000000000000000000000008B -:10354000000000000000000000000000000000007B -:10355000000000000000000000000000000000006B -:10356000000000000000000000000000000000005B -:10357000000000000000000000000000000000004B -:10358000000000000000000000000000000000003B -:10359000000000000000000000000000000000002B -:1035A000000000000000000000000000000000001B -:1035B000000000000000000000000000000000000B -:1035C00000000000000000000000000000000000FB -:1035D00000000000000000000000000000000000EB -:1035E00000000000000000000000000000000000DB -:1035F00000000000000000000000000000000000CB -:1036000000000000000000000000000000000000BA +:102E500000000000000000000000000000002C80C6 +:102E600000AA200088009800048004800000400030 +:102E700000004100000010000011000000020810D6 +:102E8000222009090242100000010400FF00400353 +:102E9000E00400070800021642400008203000420B +:102EA0002440008420D00981066041810840420806 +:102EB0007A006C400A105B4A250801991310880CAF +:102EC000C818844086600010212412020002632684 +:102ED000708BCC37104C81210028000000020008C4 +:102EE000000000004000000A200254808A2C116477 +:102EF000800A138100480002A90000201C0822401B +:102F00000005407022910002040104069C00004468 +:102F100007022910004040A2C82C8800428D4400BE +:102F2000106C800033D20442000028841005290070 +:102F30008423208480D902490A5A4084049690024E +:102F400003020411204067212080C5221243A0689B +:102F50003E04144031000484810012B100000121BC +:102F6000E0454A05144156501D0021000822042C5A +:102F70001208408410210808410010800821201008 +:102F80004AC000010C2000207708C50012C4821C32 +:102F90000516832100000021241252005080288051 +:102FA000210211320204020AC0A2120344858240A7 +:102FB000AA20608530C58010108C0007E603000051 +:102FC0000011E00008001100400800C028B64025AC +:102FD0000D0869D1023002383C22C5A13050600092 +:102FE0000A22020C5D300600380100020480000253 +:102FF000302832148001FC60901030463ADFC05413 +:103000002129E0D880040002041106300400104D8C +:103010000294A00054040020100115120900982009 +:10302000000800000000000000000000000069101F +:10303000329D3A088240F2C02040C9200046A0726A +:1030400033A0020C19360F01100858C8D61C08000E +:103050002930A578C40C0889000430400080400065 +:103060000300004252E000410B26CDE0201108335E +:10307000AB011106C01022C80B780F5048CE527C0D +:10308000040411149B8E44010008120C2DDD84549D +:10309000534430EAC033C3062DA0433C8C101C932C +:1030A0000839313700080A3702080A4086A414405C +:1030B0000609420992040000880032020112200031 +:1030C00021012130809C93EC001FFF00A8C0B0902C +:1030D00000046A1020A4CAF0226804E1003FEC4218 +:1030E0002FF3010401140D688359A3CB58021A036E +:1030F00059020800E50C7D230411849B808004287C +:10310000280E0801A300612CE00327D60C11004013 +:10311000C44041258280C101044835F226E10908F6 +:103120004141902484188081A00044888C140002BE +:10313000061100C18465D2204088011100000412EC +:1031400002840208211B00024001A8C982702600E7 +:103150002102020200430008400000000F0F00009F +:103160000004008601004A6200000800073C0004D9 +:103170000030D4A044300441034C428264DF02009A +:1031800035400030006000A006180C0280280023A3 +:103190000804424169D10B045620040C88484018A9 +:1031A000246180399EC1A3908E900C0000200006FF +:1031B0001082902A2034084B90E0A8088221220433 +:1031C0000148805040C15300080A80C2D1C47E012A +:1031D00038A8C4032271184940332A0250A20314AC +:1031E000A102108981A6A0A98882541400010101BE +:1031F000D42022B11131002C81EBF4A75C2786404A +:10320000B23244A0228408A0002C22BD0858F40544 +:1032100084CC4A00404C308402380A206038B88B95 +:10322000C43C10CFC4702A2032440C280063904460 +:1032300004A1210054490B60935049520880C721D2 +:1032400002110C21540111084000823082461840BE +:10325000C0800016444451150802044120C8A7FE4E +:10326000102908A5D08028C85C04A40A92A09FF861 +:10327000188800314110511A480A2108C2456120BE +:103280009780520007F183BE1061F815DA0002C082 +:10329000008044405002061101000218C0111A01BA +:1032A000184899A01084784F14910258D0D218432E +:1032B0000326C1840210572040D22028090CA29076 +:1032C00084A04132A00419008000110C08888004F9 +:1032D000621CCC389D00B282E690000011021004FE +:1032E000400100200046013E60000010010C01D8A2 +:1032F000000001000002008000000400184000C02F +:1033000000000000001190001000801010001E81CD +:1033100000800D002108028783840002213C6203A3 +:10332000242205A4D2240BC000C002028085040020 +:10333000440C8300600041080020090A4219B403CC +:1033400041001440011060408500010844015261B1 +:103350008090080084420100518401DA10020610B6 +:1033600000681C9448000008832220405020000080 +:103370008840011010C201330906CCC00BCCA0D488 +:10338000090D04981266607ED908CB0C00433330D7 +:103390002BFC0AEC8580602098640433088450017B +:1033A0004884623023224212C00008A800342C0056 +:1033B00022403CAC858B0038030000C54800210248 +:1033C00000406050118004212C6309813140800845 +:1033D000C824520E7C11115C905120504020902046 +:1033E0008C208C00088041604000740930014380CB +:1033F0000004002DC01009017F80000025812000FD +:10340000010000300029883105881440251403C0CC +:10341000000004036020042000001600000080006B +:103420001800040181860138002311026C0000009D +:1034300000000000200A0400023208A2C32021007C +:1034400094522C040212094582C04021280688208B +:103450001E04019055100208002C0004101D08C025 +:10346000CC00440000000070000001000A8400024B +:1034700000000000000000000000000000820000CA +:1034800040000000000028080500380010180680E1 +:1034900040111202600400001383000000000000CD +:1034A0001228050001080030180A82011442111088 +:1034B000040800FF0E0102007C0000386C008070E0 +:1034C000010001F8000000000000000000041404E6 +:1034D0000200100471A022C100204326001A4812E5 +:1034E00026440020422022102210813100040000D6 +:1034F0002002004004004008008000000A00000094 +:1035000010800004280001120200FBF8382000415E +:10351000F04040BFFA3E9FCE03F0101420FF202061 +:103520000FBD001E9C004002000100004000004151 +:103530000420008420081040810408004081020417 +:1035400004082040820401021081080410021020A7 +:10355000084040810408020420081008210081016D +:1035600004101020084104084810202100102120D8 +:103570004082040020400204102041020010200874 +:1035800042102040420204082040008104081040FC +:10359000800408204082040020401084010200843E +:1035A000201084108108420021004084040820403B +:1035B0008204008840FDFF2EFFCE55B3DC30FD9F16 +:1035C000080681AFC3B080DECF024DCF77D00ECCDE +:1035D000F7AF3750C1FDF3EDDCFB3D00AB421210FD +:1035E00002040FFC05488C0011554077551FF54328 +:1035F000F5F042A800000000000000000010A00745 +:10360000F800000000004000000000000000000082 :1036100000000000000000000000000000000000AA :10362000000000000000000000000000000000009A :10363000000000000000000000000000000000008A :10364000000000000000000000000000000000007A -:10365000000000000000000000000000000000006A -:10366000000000000000000000000000000000005A +:103650000000000000020000000000000000004028 +:103660000800000000000000000000000000000052 :10367000000000000000000000000000000000004A :10368000000000000000000000000000000000003A -:10369000000000000000000000000000000000002A -:1036A000000000000000000000000000000000001A +:103690000000000000000000000000000002000028 +:1036A00000000000000000400800000000000000D2 :1036B000000000000000000000000000000000000A :1036C00000000000000000000000000000000000FA :1036D00000000000000000000000000000000000EA :1036E00000000000000000000000000000000000DA -:1036F00000000000000000000000000000000000CA +:1036F0000000000000444000000000000000000046 :1037000000000000000000000000000000000000B9 :1037100000000000000000000000000000000000A9 :103720000000000000000000000000000000000099 -:103730000000000000000000000000000000000089 +:103730000000000000000000000001000004000084 :103740000000000000000000000000000000000079 :103750000000000000000000000000000000000069 :103760000000000000000000000000000000000059 :103770000000000000000000000000000000000049 -:103780000000000000000000000000000000000039 -:103790000000000000000000000000000000000029 -:1037A0000000000000000000000000000000000019 -:1037B0000000000000000000000000000000000009 -:1037C00000000000000000000000000000000000F9 -:1037D00000000000000000000000000000000000E9 -:1037E00000000000000000000000000000000000D9 -:1037F00000000000000000000000000000000000C9 -:1038000000000000000000000000000000000000B8 -:1038100000000000000000000000000000000000A8 -:103820000000000000000000000000000000000098 -:103830000000000000000000000000000000000088 -:103840000000000000000000000000000000000078 -:103850000000000000000000000000000000000068 -:103860000000000000000000000000000000000058 -:103870000000000000000000000000000000000048 -:103880000000000000000000000000000000000038 -:103890000000000000000000000000000000000028 -:1038A0000000000000000000000000000000000018 -:1038B0000000000000000000000000000000000008 -:1038C00000000000000000000000000000000000F8 -:1038D00000000000000000000000000000000000E8 -:1038E00000000000000000000000000000000000D8 -:1038F00000000000000000000000000000000000C8 -:1039000000000000000000000000000000000000B7 -:1039100000000000000000000000000000000000A7 -:103920000000000000000000000000000000000097 -:103930000000000000000000000000000000000087 -:103940000000000000000000000000000000000077 -:103950000000000000000000000000000000000067 -:103960000000000000000000000000000000000057 -:103970000000000000000000000000000000000047 -:103980000000000000000000000000000000000037 -:103990000000000000000000000000000000000027 -:1039A0000000000000000000000000000000000017 -:1039B0000000000000000000000000000000000007 -:1039C00000000000000000000000000000000000F7 -:1039D00000000000000000000000000000000000E7 -:1039E00000000000000000000000000000000000D7 -:1039F00000000000000000000000000000000000C7 -:103A000000000000000000000000000000000000B6 -:103A100000000000000000000000000000000000A6 -:103A20000000000000000000000000000000000096 -:103A30000000000000000000000000000000000086 -:103A40000000000000000000000000000000000076 -:103A50000000000000000000000000000000000066 -:103A60000000000000000000000000000000000056 -:103A70000000000000000000000000000000000046 -:103A80000000000000000000000000000000000036 -:103A90000000000000000000000000000000000026 -:103AA0000000000000000000000000000000000016 -:103AB0000000000000000000000000000000000006 -:103AC00000000000000000000000000000000000F6 -:103AD00000000000000000000000000000000000E6 -:103AE00000000000000000000000000000000000D6 -:103AF00000000000000000000000000000000000C6 -:103B000000000000000000000000000000000000B5 -:103B100000000000000000000000000000000000A5 -:103B20000000000000000000000000000000000095 -:103B30000000000000000000000000000000000085 -:103B40000000000000000000000000000000000075 -:103B50000000000000000000000000000000000065 -:103B60000000000000000000000000000000000055 -:103B70000000000000000000000000000000000045 -:103B80000000000000000000000000000000000035 -:103B90000000000000000000000000000000000025 -:103BA0000000000000000000000000000000000015 -:103BB0000000000000000000000000000000000005 -:103BC00000000000000000000000000000000000F5 -:103BD00000000000000000000000000000000000E5 -:103BE00000000000000000000000000000000000D5 -:103BF00000000000000000000000000000000000C5 -:103C000000000000000000000000000000000000B4 -:103C100000000000000000000000000000000000A4 -:103C20000000000000000000000000000000000094 -:103C30000000000000000000000000000000000084 -:103C40000000000000000000000000000000000074 -:103C50000000000000000000000000000000000064 -:103C60000000000000000000000000000000000054 -:103C70000000000000000000000000000000000044 -:103C80000000000000000000000000000000000034 -:103C90000000000000000000000000000000000024 -:103CA0000000000000000000000000000000000014 -:103CB0000000000000000000000000000000000004 -:103CC00000000000000000000000000000000000F4 -:103CD00000000000000000000000000000000000E4 -:103CE00000000000000000000000000000000000D4 -:103CF00000000000000000000000000000000000C4 -:103D000000000000000000000000000000000000B3 -:103D100000000000000000000000000000000000A3 -:103D20000000000000000000000000000000000093 -:103D30000000000000000000000000000000000083 -:103D40000000000000000000000000000000000073 -:103D50000000000000000000000000000000000063 -:103D60000000000000000000000000000000000053 -:103D70000000000000000000000000000000000043 -:103D80000000000000000000000000000000000033 -:103D90000000000000000000000000000000000023 -:103DA0000000000000000000000000000000000013 -:103DB0000000000000000000000000000000000003 -:103DC00000000000000000000000000000000000F3 -:103DD00000000000000000000000000000000000E3 -:103DE00000000000000000000000000000000000D3 -:103DF00000000000000000000000000000000000C3 -:103E000000000000000000000000000000000000B2 -:103E100000000000000000000000000000000000A2 -:103E20000000000000000000000000000000000092 -:103E30000000000000000000000000000000000082 -:103E40000000000000000000000000000000000072 -:103E50000000000000000000000000000000000062 -:103E60000000000000000000000000000000000052 -:103E70000000000000000000000000000000000042 -:103E80000000000000000000000000000000000032 -:103E90000000000000000000000000000000000022 -:103EA0000000000000000000000000000000000012 -:103EB0000000000000000000000000000000000002 -:103EC00000000000000000000000000000000000F2 -:103ED00000000000000000000000000000000000E2 -:103EE00000000000000000000000000000000000D2 -:103EF00000000000000000000000000000000000C2 -:103F000000000000000000000000000000000000B1 -:103F100000000000000000000000000000000000A1 -:103F20000000000000000000000000000000000091 +:10378000000000400200007C880299004C8000800C +:103790000048800200000390800038020000020010 +:1037A00040000000030000800C01013A001F8E2C35 +:1037B0000008E4E000FCA36000188000000800009E +:1037C00000010080000201000200000200008002EF +:1037D00000008000000100028000000000004000A6 +:1037E00000000000000000000000000020080402AB +:1037F0000020000000000000010000000010040094 +:103800000000001040000000400000000000000028 +:1038100020800400020040041C12800800039280F3 +:10382000002000940E480000800010010014100FCA +:103830008C00E48420080001012002AAC8AC8008A2 +:103840000A8110004490DEE132D6844A80DFE00035 +:1038500024052908421000C02000080200000210C0 +:1038600040000018200400000000000008020000D2 +:10387000000400683E1055445480000080000000A1 +:103880000002500A0000100000020000200C5295B7 +:1038900015450140200200200400400200400400C1 +:1038A00040080900010861E260B9F92B77C8C5003A +:1038B00006F48A001556C204302000292412524111 +:1038C000444008B8B3821F120260304684B0000A38 +:1038D00044C10400BB00C1A011858100514008D043 +:1038E00000286D0992600040A24A282080184002FA +:1038F00030B6C52C1600B1D021240400160C0800E7 +:10390000400134610035A80D80B1CC4C1A20082943 +:103910000462002230003010400132008418F44666 +:1039200001840982C181D04BAA106EC946934678A2 +:1039300001501ADF08002094F84C103219428AB066 +:103940001D449000001A400000000000000000002C +:103950000000E31010983E08824CF3CE3062C92478 +:1039600070C6B57333E8820C1D304F0F311A58D82A +:10397000DF3DCACE2D31A5F85E9E1BC1816CB0E241 +:1039800000B548352B4110E3DAE8304B1BA60DE1BA +:10399000E35368B3EB0B53460C11E6E86B78095818 +:1039A000CCCE527DC4E5D9169F86ED8050081B8C85 +:1039B0000FDF84C2114410FAE232530F2DE2DB3CD8 +:1039C00036B63C9D8AF9313F709F4B3F72CF4B43D7 +:1039D000AFDC976B3D9BCEFFF327D473FA3476822E +:1039E0009B73FAD0035B39B28FFEF3FDA83E030050 +:1039F00008492F90000CED0835B4CAF5616974E9E7 +:103A0000300FFF4ABE010114712C0DF98359A3DB5D +:103A1000DCD69A3B59435B60E5AC7D3325598698EB +:103A2000319DA46D6D07594BE3802F7CE14F0F6EE4 +:103A300008BB2251C0E0532FB684C181ADFC355E76 +:103A4000262B09A8E1C3F0BC931AC241FEE097C03F +:103A5000CEB6210B438080F3D074C631C18F57F1AD +:103A60005BB4440326800200811F48164829BCCB62 +:103A7000B2707EA4410026A08417D05EC4498A316A +:103A80005F0F1240420CB82E18584A62204EDC9B41 +:103A90008F3C49042871F4A004740441075D428BF3 +:103AA00030DD233CB74160E009000908021B4440B7 +:103AB000F15000634504FA0308D1021CC4F5351C1B +:103AC0008B5E4139D407191008050213C8B43C862F +:103AD00005AA480630A6181006252002914040008D +:103AE000BA8020000BDC0075DCD7132894489F6057 +:103AF00088446A243C6840B922F9484F4412228223 +:103B000040A203B0281E10D983A6200888A6441C12 +:103B1000480004119EC066F413B1012E30A3A035F5 +:103B2000F827E4480230000082083FF242EFB3FD7C +:103B30002C91662C958E00D241ECB5071BC8803FB6 +:103B4000B3312812041D37CEE073AB001ACC0EA09F +:103B5000C101C085AC81E925540FA3F23A4009D2D6 +:103B60003BD042BD0241043F7E0FFF8049D182100D +:103B7000B2CE2870C52400031884401000401841BC +:103B8000210867FE109008A7D1DE28895E16A609D5 +:103B900001A0BFF89CEA0ED9415051281C2409000D +:103BA0000140002000000000140802010040004015 +:103BB000020812824100444851221EF18341109AAA +:103BC000C4931A03DFCE998270BC783F049F46DC11 +:103BD000D0C718E32B2669C594315F68D0D6333B34 +:103BE0000FE692B294ECD11A73005FE01200383CF9 +:103BF0000C880004A21CCC2A1C21B686F7900698DB +:103C0000918225E6425C620DB0A0AA000106D34174 +:103C100026A0100000090000000000000002800241 +:103C200038022800000D00000531F05350188A19A1 +:103C3000D7401F80040030121121420E93A3145369 +:103C4000A33CE60DB5A3B5ECDA2C03E240C990A580 +:103C5000002A04349000B001EC24056B06A08840D3 +:103C6000008264076812B5C776C000442000000CCB +:103C7000490000493C11173C1486787152EC929A25 +:103C80001326475380A9685540200088CC2226F887 +:103C9000527E2A43C4E2B30704C8E53B00C58AE06C +:103CA000680002D02268007FE1776080B109EA4CA9 +:103CB0000963BBB8A80F09630515B35ABC6CB53FBF +:103CC000EE844A0249045EF22F2ECE32C0008800F4 +:103CD0008034040026501C8C8D81010048000200B5 +:103CE0000020000000C90401308004631E73090530 +:103CF00041C9A4084824520E7C90450CDA55004175 +:103D00004069906984698400088841E00008F79957 +:103D10003051479E6164043DC530094B7FA3BC20F0 +:103D2000378F000149BC80B5A8273B2721CC8630BE +:103D300024CC83C01480040360200C2800008E0073 +:103D40000762D0301A240645050690EB7423110251 +:103D50006C000A112400A000214306A882A3FC994C +:103D6000E732810093319E5028120933C9E5028160 +:103D7000242AB8390E08CA906DD8E208143C0954B8 +:103D8000301508A54E006680400022B000000000FB +:103D90000A8010D64097AF1D3AC7707127EC41F8E2 +:103DA000000006644320F8C79A00A94805007A007D +:103DB00030980E80C011322260154A001B8BAB4038 +:103DC00000000000200004304001D0910022224079 +:103DD00040F000401D020C00000F43260000013C93 +:103DE000160000710020E3FC35DC490CB034844837 +:103DF000000060400800228024A100034044832684 +:103E00005C3A483EB74004C080000000000000005B +:103E10000000001002002002004004000008000022 +:103E20004A10005410A083266A4601539270FBFD8D +:103E300000C98004000004000000000FC40064D426 +:103E4000020000020000022000000100010208023E +:103E5000000025690426009420481044810408804D +:103E60004081020424482240820441121081080447 +:103E7000110211200844448104488224204810483B +:103E80002104890104101020084104484810202111 +:103E90001011212044822441204002241120490293 +:103EA000009120084210224242220448204004810E +:103EB00004489244882448224482244020401084AC +:103EC0000902008420108490890842002102448461 +:103ED000244822448224408844645E044C0CADF3A0 +:103EE0008238E165043B0ECE11A04082872246CD88 +:103EF00042004288213B035040B0F184CC984C00F2 +:103F00008F4292800100055C05498C000104404508 +:103F1000142324C5281002B0FFC03FFFC000F000EA +:103F20000052A005500000000000700000000000DA :103F30000000000000000000000000000000000081 :103F40000000000000000000000000000000000071 :103F50000000000000000000000000000000000061 :103F60000000000000000000000000000000000051 -:103F70000000000000000000000000000000000041 -:103F80000000000000000000000000000000000031 +:103F7000000000000000000000020000000000003F +:103F80000000000008000000000000000000000029 :103F90000000000000000000000000000000000021 :103FA0000000000000000000000000000000000011 :103FB0000000000000000000000000000000000001 -:103FC00000000000000000000000000000000000F1 +:103FC00000020000000000000000000008000000E7 :103FD00000000000000000000000000000000000E1 :103FE00000000000000000000000000000000000D1 :103FF00000000000000000000000000000000000C1 :1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:104040000000000000000000000000000000000070 -:104050000000000000000000000000000000000060 -:104060000000000000000000000000000000000050 -:104070000000000000000000000000000000000040 -:104080000000000000000000000000000000000030 -:104090000000000000000000000000000000000020 -:1040A0000000000000000000000000000000000010 -:1040B0000000000000000000000000000000000000 -:1040C00000000000000000000000000000000000F0 -:1040D00000000000000000000000000000000000E0 +:10401000000000000000044D01555044C411112A55 +:10402000A84AAAA2AAA8AAAA044441111044441169 +:10403000110444411110444411110444411110442D +:10404000441111044441111044441111044441111C +:1040500010444411110444411110444411111544F9 +:1040600041151044441111044441111044441111EC +:1040700004444111104444111104444111104444BA +:104080001111044441111044441111044441111010 +:104090004444111104444111104444111104444199 +:1040A00011104444111100004E00000000002001D6 +:1040B000F888008021F800020081001040000020F4 +:1040C0008000020041000000000000000000010428 +:1040D000E820001D00000410180007F800B8400098 :1040E00000000000000000000000000000000000D0 :1040F00000000000000000000000000000000000C0 :1041000000000000000000000000000000000000AF -:10411000000000000000000000000000000000009F -:10412000000000000000000000000000000000008F -:10413000000000000000000000000000000000007F -:10414000000000000000000000000000000000006F -:10415000000000000000000000000000000000005F +:10411000020000210000000000000000000000007C +:1041200000802000000000020002A0024000000009 +:104130000200000400000000015000000000000028 +:1041400000000E0000000000003800000000000029 +:104150000030000080100384000000000780000091 :10416000000000000000000000000000000000004F -:10417000000000000000000000000000000000003F +:1041700000000000A0010800000000000000000096 :10418000000000000000000000000000000000002F -:10419000000000000000000000000000000000001F -:1041A000000000000000000000000000000000000F -:1041B00000000000000000000000000000000000FF -:1041C00000000000000000000000000000000000EF -:1041D00000000000000000000000000000000000DF -:1041E00000000000000000000000000000000000CF -:1041F00000000000000000000000000000000000BF -:1042000000000000000000000000000000000000AE -:10421000000000000000000000000000000000009E -:10422000000000000000000000000000000000008E -:10423000000000000000000000000000000000007E -:10424000000000000000000000000000000000006E +:10419000000E0000001C00000000000000000000F5 +:1041A000800000000001C00000000000000E0000C0 +:1041B00000000000000000C00000800801001000A6 +:1041C00080100100100200A00000000E000000207E +:1041D000000084000004820000004008E0000001AC +:1041E00024121000400018800100000202000000AC +:1041F0000020000004000C00820081E817044080C9 +:10420000130000000000000040000000000020003B +:104210000000300000001C0070038000000000005F +:104220000018000000030C00400000030000000024 +:104230000000001800000000000000000000000066 +:104240000000000000000301800000000000018069 :10425000000000000000000000000000000000005E -:10426000000000000000000000000000000000004E -:10427000000000000000000000000000000000003E -:10428000000000000000000000000000000000002E -:10429000000000000000000000000000000000001E -:1042A000000000000000000000000000000000000E -:1042B00000000000000000000000000000000000FE -:1042C00000000000000000000000000000000000EE -:1042D00000000000000000000000000000000000DE -:1042E00000000000000000000000000000000000CE -:1042F00000000000000000000000000000000000BE -:1043000000000000000000000000000000000000AD -:10431000000000000000000000000000000000009D -:10432000000000000000000000000000000000008D -:10433000000000000000000000000000000000007D -:10434000000000000000000000000000000000006D -:10435000000000000000000000000000000000005D -:10436000000000000000000000000000000000004D -:10437000000000000000000000000000000000003D -:10438000000000000000000000000000000000002D -:10439000000000000000000000000000000000001D -:1043A000000000000000000000000000000000000D -:1043B00000000000000000000000000000000000FD -:1043C00000000000000000000000000000000000ED -:1043D00000000000000000000000000000000000DD -:1043E00000000000000000000000000000000000CD -:1043F00000000000000000000000000000000000BD -:1044000000000000000000000000000000000000AC +:1042600000000000000001000030C000000000005D +:10427000000000000003860800000200004000006B +:10428000200000000004000000000000000000000A +:104290001008000000000000200080000000001155 +:1042A00000010000000200021000200002000000D7 +:1042B00008000000001100000000010000000200E2 +:1042C000000000004000000000000010000004009A +:1042D000F0000200000004000000000006000000E2 +:1042E0000000400000100000000000000000080076 +:1042F0000000080000040000000002000080000030 +:104300000001000201000000000000000000800029 +:10431000000000000000000010000000008000000D +:104320002008001000000000000000040000000051 +:104330000000000000020000000008000000000073 +:1043400000000000008004202000080100000000A0 +:104350000000000000000008000000000000000055 +:104360000400000000010000004100000000060001 +:1043700000000000001001000000008000000000AC +:1043800000000000000024000C00020001000400F6 +:10439000000000060200186C09000000000C00314B +:1043A00080000000300000000018001800300000FD +:1043B000000030061800000000C3000001C000002B +:1043C0000C3300000000000008001000090000008D +:1043D00000000000000000C000038000000000009A +:1043E00000C0003000304000000000000004000069 +:1043F000000000000000000000002000000000009D +:10440000000000000000200000400000000000004C :10441000000000000000000000000000000000009C :10442000000000000000000000000000000000008C -:10443000000000000000000000000000000000007C +:104430000800000000000000000000000000000074 :10444000000000000000000000000000000000006C -:10445000000000000000000000000000000000005C -:10446000000000000000000000000000000000004C -:10447000000000000000000000000000000000003C -:10448000000000000000000000000000000000002C -:10449000000000000000000000000000000000001C -:1044A000000000000000000000000000000000000C -:1044B00000000000000000000000000000000000FC -:1044C00000000000000000000000000000000000EC -:1044D00000000000000000000000000000000000DC -:1044E00000000000000000000000000000000000CC -:1044F00000000000000000000000000000000000BC -:1045000000000000000000000000000000000000AB -:10451000000000000000000000000000000000009B -:10452000000000000000000000000000000000008B -:10453000000000000000000000000000000000007B -:10454000000000000000000000000000000000006B -:10455000000000000000000000000000000000005B -:10456000000000000000000000000000000000004B -:10457000000000000000000000000000000000003B -:10458000000000000000000000000000000000002B -:10459000000000000000000000000000000000001B -:1045A000000000000000000000000000000000000B -:1045B00000000000000000000000000000000000FB -:1045C00000000000000000000000000000000000EB -:1045D00000000000000000000000000000000000DB -:1045E00000000000000000000000000000000000CB -:1045F00000000000000000000000000000000000BB -:1046000000000000000000000000000000000000AA -:10461000000000000000000000000000000000009A -:10462000000000000000000000000000000000008A -:10463000000000000000000000000000000000007A -:10464000000000000000000000000000000000006A -:10465000000000000000000000000000000000005A -:10466000000000000000000000000000000000004A -:10467000000000000000000000000000000000003A -:10468000000000000000000000000000000000002A -:10469000000000000000000000000000000000001A -:1046A000000000000000000000000000000000000A -:1046B00000000000000000000000000000000000FA -:1046C00000000000000000000000000000000000EA -:1046D00000000000000000000000000000000000DA -:1046E00000000000000000000000000000000000CA -:1046F00000000000000000000000000000000000BA -:1047000000000000000000000000000000000000A9 -:104710000000000000000000000000000000000099 -:104720000000000000000000000000000000000089 -:104730000000000000000000000000000000000079 -:104740000000000000000000000000000000000069 -:104750000000000000000000000000000000000059 -:104760000000000000000000000000000000000049 -:104770000000000000000000000000000000000039 -:104780000000000000000000000000000000000029 -:104790000000000000000000000000000000000019 -:1047A0000000000000000000000000000000000009 -:1047B00000000000000000000000000000000000F9 -:1047C00000000000000000000000000000000000E9 -:1047D00000000000000000000000000000000000D9 -:1047E00000000000000000000000000000000000C9 -:1047F00000000000000000000000000000000000B9 -:1048000000000000000000000000000000000000A8 -:104810000000000000000000000000000000000098 -:104820000000000000000000000000000000000088 -:104830000000000000000000000000000000000078 -:104840000000000000000000000000000000000068 +:104450000008000000000000000000000000000054 +:104460000000000000000000000000000000280024 +:1044700000000000000000004000010014000000E7 +:104480000000000008000001000100000020000002 +:1044900004000000000000020C0C0020000240306C +:1044A00040C03020050C0000038008200081600F10 +:1044B00040040008000060001088000181D01168ED +:1044C0000010000000400000000000003C0006005A +:1044D00000C0000000000680000000202000000056 +:1044E000000030000000100000000000000000008C +:1044F0000000018080002004000001040000620030 +:104500001080200000008000F40011022002D00082 +:1045100000A46030084802000010002000030C0CCA +:10452000000000040000200001F0100000800600E0 +:1045300000400000000002000000005000040000E5 +:104540000010080002816000020329080001003009 +:10455000000000140CC000800C00000E00E0C01829 +:10456000000030002E0040010040003820180040BC +:10457000000000000000000180008000100C01001D +:104580000000040000060000800010000000000091 +:1045900000090800001000000014300C0380000027 +:1045A0001600080200000010000B00044000204824 +:1045B0008022204071E006000000000000000000A2 +:1045C000000000000000068000080000000000005D +:1045D000000B400000000000A800080040000000A0 +:1045E000E800440010042680002C4010010000E088 +:1045F0008200180A000005001C3148081801000854 +:10460000C00100840815080000086010600C006EEE +:104610000000001DC0470C000000200408000D0031 +:10462000101D024041C301C300C300000040000050 +:104630000100020000300008000004000420000611 +:1046400000100000003C0080000000000000070097 +:10465000E10384000000BC002040C2A01000000064 +:1046600000018000041000008000100C0C200000ED +:10467000C0000000000004000000000000C00000B6 +:104680000180200010098000000001309800000027 +:10469000001301800060020000081800020480007E +:1046A0003C0047C00000000C0000018000400600F4 +:1046B000054002000050000000000400000C00C093 +:1046C0000200000004000000400008000000040098 +:1046D0000000C000600018018000E06000031800C6 +:1046E0000008060240049000215080003203C00000 +:1046F000A00000000180020420500D000180202F46 +:1047000080FFF00000C1018002006001000C040283 +:1047100001B80012BB0000400000002000000506A8 +:10472000C0000040000082200000021000000000D5 +:1047300000000400010160720E20E40E41C01C80E4 +:1047400020390408CA10502090005700004E2A005B +:1047500020000403020004060002004000004000A4 +:10476000C001000803000100804002004000010079 +:1047700008004000A4007C10042306942068D04662 +:104780008D3468C146811A34346823468234611AF4 +:10479000108D0804518A11A06844468D0468C23403 +:1047A0002068D068A1068D0D145051A008450468FA +:1047B00048D1A0211811A123468A3461A3441A3498 +:1047C00011A34D1A30D1A0084211A34342323468DC +:1047D0002346068D0468D3468C346823468A3461A8 +:1047E000A344D0840D1A0084205084D08D28420127 +:1047F000A1134684346823468A34608844E6FF2443 +:10480000FFCE7F33CC78756F10AF8BE743F1085E36 +:10481000C703DE8F72E003CCEB7F3F70C1FEF3DB9A +:10482000FCDBFD04FF42120001044CA01017CC0079 +:1048300010511064112C6F0A03E041640000000065 +:104840000000000000DEB00000000000000040009A :104850000000000000000000000000000000000058 :104860000000000000000000000000000000000048 :104870000000000000000000000000000000000038 :104880000000000000000000000000000000000028 -:104890000000000000000000000000000000000018 -:1048A0000000000000000000000000000000000008 +:104890000000000000000000000000000002000016 +:1048A0000000000000000000080000000000000000 :1048B00000000000000000000000000000000000F8 :1048C00000000000000000000000000000000000E8 :1048D00000000000000000000000000000000000D8 -:1048E00000000000000000000000000000000000C8 -:1048F00000000000000000000000000000000000B8 +:1048E00000000000000200000000000000000000C6 +:1048F00008000000000000000000000000000000B0 :1049000000000000000000000000000000000000A7 :104910000000000000000000000000000000000097 :104920000000000000000000000000000000000087 @@ -263630,14 +263630,14 @@ :1058C00000110006800100000011000680010000A8 :1058D0000011000680010000001100060701000011 :1058E0000024000B80010000001100068001000070 -:1058F00000110006800100000011000607010000F1 -:105900000024000B070100000024000B0701000029 -:105910000024000B070100000024000B0000000021 +:1058F00000110006800100000011000600000000F9 +:1059000000000000070100000024000B0701000058 +:105910000024000B00000000000000000000000058 :105920000000000000000000000000000000000077 :105930000000000000000000000000000000000067 :10594000000000000000000000000000070100004F -:105950000024000B070100000024000B07010000D9 -:105960000024000B070100000024000B07010000C9 +:105950000024000B00000000000000000701000010 +:105960000024000B00000000000000000701000000 :105970000024000B070100000024000B07010000B9 :105980000024000B070100000024000B07010000A9 :105990000024000B070100000024000B0701000099 @@ -263822,13 +263822,13 @@ :1064C00000000000000000000000000000000000CC :1064D00000000000000000000000000000000000BC :1064E00000000000000000000000000000000000AC -:1064F0000000000000000000000000000000001F7D -:1065000055D1200020002000200020002000200085 +:1064F0000000000000000000000000000000003468 +:10650000D3F02000200020002000200020002000E8 :10651000200020002000200020002000200020007B :10652000200020002000200020002000200020006B :10653000200030A1000A30A100032000200020002C :10654000200030A1000A30A1000530E100FF30C179 -:1065500000813002001EBA1730A1000D200020007B +:1065500000813002002817FC30A1000D200020002F :10656000200020002000200020002000200020002B :086570002000200020002000A3 :00000001FF diff --git a/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.prm b/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.prm index 87f2b8da57..92c592d563 100644 --- a/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.prm +++ b/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.prm @@ -1,9 +1,9 @@ -PROMGEN: Xilinx Prom Generator P.20131013 -Copyright (c) 1995-2013 Xilinx, Inc. All rights reserved. +PROMGEN: Xilinx Prom Generator O.76xd +Copyright (c) 1995-2011 Xilinx, Inc. All rights reserved. -promgen -w -p mcs -c FF -o /homes/maatalla/openair/openair0/express-mimo2/backup_houssem/express-mimo2/grlib-gpl-1.1.0-b4113/designs/express-mimo2//exmimo2_prom -s 8192 -u 0000 express-mimo2.bit -spi +promgen -w -p mcs -c FF -o /homes/kaltenbe/Devel/openair/openairinterface5g/targets/ARCH/EXMIMO/BITSTREAM//exmimo2_prom -s 8192 -u 0000 express-mimo2.bit -spi -PROM /homes/maatalla/openair/openair0/express-mimo2/backup_houssem/express-mimo2/grlib-gpl-1.1.0-b4113/designs/express-mimo2/exmimo2_prom.prm map: Tue Jun 16 16:10:48 2015 +PROM /homes/kaltenbe/Devel/openair/openairinterface5g/targets/ARCH/EXMIMO/BITSTREAM/exmimo2_prom.prm map: Tue Jan 3 11:49:20 2017 Calculating PROM checksum with fill value ff @@ -11,7 +11,7 @@ Format Mcs86 (32-bit) Size 8192K PROM start 0000:0000 PROM end 007f:ffff -PROM checksum 41521d58 +PROM checksum 416ab633 Addr1 Addr2 Date File(s) - 0000:0000 0040:6577 Jun 16 16:10:43 2015 express-mimo2.bit + 0000:0000 0040:6577 Jan 3 10:48:16 2017 express-mimo2.bit diff --git a/targets/ARCH/EXMIMO/BITSTREAM/express-mimo2.bit b/targets/ARCH/EXMIMO/BITSTREAM/express-mimo2.bit index 6807fe5a8c..416f4d519e 100644 Binary files a/targets/ARCH/EXMIMO/BITSTREAM/express-mimo2.bit and b/targets/ARCH/EXMIMO/BITSTREAM/express-mimo2.bit differ diff --git a/targets/ARCH/EXMIMO/BITSTREAM/express-mimo2.msk b/targets/ARCH/EXMIMO/BITSTREAM/express-mimo2.msk index edbb63f913..15e0524b47 100644 Binary files a/targets/ARCH/EXMIMO/BITSTREAM/express-mimo2.msk and b/targets/ARCH/EXMIMO/BITSTREAM/express-mimo2.msk differ diff --git a/targets/ARCH/EXMIMO/DEFS/COPYING b/targets/ARCH/EXMIMO/DEFS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/DEFS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/DEFS/openair_device.h b/targets/ARCH/EXMIMO/DEFS/openair_device.h old mode 100755 new mode 100644 index 2be7b7f088..f2f20d38ff --- a/targets/ARCH/EXMIMO/DEFS/openair_device.h +++ b/targets/ARCH/EXMIMO/DEFS/openair_device.h @@ -1,40 +1,31 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef OPENAIR_DEVICE_H #define OPENAIR_DEVICE_H // Maximum number of concurrently supported cards -// -#define MAX_CARDS 8 -#define INIT_ZEROS {0, 0, 0, 0, 0, 0, 0, 0}; +#define MAX_CARDS 16 +#define INIT_ZEROS {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /** PCIe subsystem configuration Space diff --git a/targets/ARCH/EXMIMO/DEFS/pcie_interface.h b/targets/ARCH/EXMIMO/DEFS/pcie_interface.h index 713480b40b..cfc3934668 100644 --- a/targets/ARCH/EXMIMO/DEFS/pcie_interface.h +++ b/targets/ARCH/EXMIMO/DEFS/pcie_interface.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** pcie_interface.h diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/COPYING b/targets/ARCH/EXMIMO/DRIVER/eurecom/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h old mode 100755 new mode 100644 index ffba2d61c4..c4adf28b82 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/defs.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __DEFS_H__ #define __DEFS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c index eb23d1afb8..7cf5c95ecb 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/exmimo_fw.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** exmimo_fw.c * @@ -201,7 +193,7 @@ int exmimo_assign_shm_vars(int card_id) int exmimo_allocate_rx_tx_buffers(int card_id) { size_t size; - int j,i; + int j; dma_addr_t dma_addr_dummy; // Round up to the next PAGE_SIZE (typ. 4096 bytes) size = (ADAC_BUFFERSZ_PERCHAN_B >> PAGE_SHIFT) + 1; @@ -251,8 +243,6 @@ int exmimo_allocate_rx_tx_buffers(int card_id) */ int exmimo_memory_alloc(int card) { - int i; - if ( bigshm_init( card ) ) { printk("exmimo_memory_alloc(): bigshm_init failed for card %d.\n", card); return -ENOMEM; diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h old mode 100755 new mode 100644 index 90d1eaa64c..5fc557e400 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/extern.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __EXTERN_H__ #define __EXTERN_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c old mode 100755 new mode 100644 index 4427f4c8af..b5ef864b30 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/fileops.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** fileops.c * @@ -179,6 +171,8 @@ int openair_device_ioctl(struct inode *inode,struct file *filp, unsigned int cmd int tmp; + unsigned int user_args[4]; + static unsigned int update_firmware_command; static unsigned int update_firmware_address; static unsigned int update_firmware_length; @@ -277,14 +271,18 @@ int openair_device_ioctl(struct inode *inode,struct file *filp, unsigned int cmd printk("[openair][IOCTL] : openair_DUMP_CONFIG(%d): exmimo_pci_kvirt[%d].exmimo_config_ptr = %p (phys %08x)\n", (int)arg, (int)arg, exmimo_pci_kvirt[(int)arg].exmimo_config_ptr, p_exmimo_pci_phys[(int)arg]->exmimo_config_ptr); - /*printk("EXMIMO_CONFIG: freq0 %d Hz, freq1 %d Hz, freqtx0 %d Hz, freqtx1 %d Hz, \nRX gain0 %d dB, RX Gain1 %d dB\n", + printk("[openair][IOCTL]: EXMIMO_CONFIG: freq0 %u Hz, freq1 %u Hz, freqtx0 %u Hz, freqtx1 %u Hz, \nRX gain0 %d dB, RX Gain1 %d dB, autocal (%d,%d,%d,%d)\n", exmimo_pci_kvirt[(int)arg].exmimo_config_ptr->rf.rf_freq_rx[0], exmimo_pci_kvirt[(int)arg].exmimo_config_ptr->rf.rf_freq_rx[1], exmimo_pci_kvirt[(int)arg].exmimo_config_ptr->rf.rf_freq_tx[0], exmimo_pci_kvirt[(int)arg].exmimo_config_ptr->rf.rf_freq_tx[1], exmimo_pci_kvirt[(int)arg].exmimo_config_ptr->rf.rx_gain[0][0], - exmimo_pci_kvirt[(int)arg].exmimo_config_ptr->rf.rx_gain[1][0]); - */ + exmimo_pci_kvirt[(int)arg].exmimo_config_ptr->rf.rx_gain[1][0], + exmimo_pci_kvirt[(int)arg].exmimo_config_ptr->rf.do_autocal[0], + exmimo_pci_kvirt[(int)arg].exmimo_config_ptr->rf.do_autocal[1], + exmimo_pci_kvirt[(int)arg].exmimo_config_ptr->rf.do_autocal[2], + exmimo_pci_kvirt[(int)arg].exmimo_config_ptr->rf.do_autocal[3]); + exmimo_send_pccmd((int)arg, EXMIMO_CONFIG); @@ -328,15 +326,38 @@ int openair_device_ioctl(struct inode *inode,struct file *filp, unsigned int cmd acknowledge with no limit */ #define MAX_IOCTL_ACK_CNT 500 - update_firmware_command = *((unsigned int*)arg); + /* 'arg' is an unsigned long and is supposed to be big enough + * to hold an address - this hypothesis is okay for i386 and x86_64 + * maybe not somewhere else + * this will probably fail with older kernels + * (works with 3.17 on x86_64) + */ + tmp = copy_from_user(&user_args, (void*)arg, 4*sizeof(unsigned int)); + if (tmp) { + printk("[openair][IOCTL] UPDATE_FIRMWARE: error copying parameters to kernel-space (%d bytes uncopied).\n", tmp); + return -1; + } + + update_firmware_command = user_args[0]; switch (update_firmware_command) { case UPDATE_FIRMWARE_TRANSFER_BLOCK: - update_firmware_address = ((unsigned int*)arg)[1]; - update_firmware_length = ((unsigned int*)arg)[2]; + update_firmware_address = user_args[1]; + update_firmware_length = user_args[2]; + + /* This is totally wrong on x86_64: a pointer is 64 bits and + * unsigned int is 32 bits. The userspace program has to ensure + * that its buffer address fits into 32 bits. + * If it proves a too strong requirement, we may change things + * in the future. + * The compiler emits a warning here. Do not remove this warning! + * This is to clearly remember this problem. + * If you require the compilation to work with zero warning, + * consider this one as an exception and find a proper workaround. + */ + update_firmware_ubuffer = user_args[3]; - update_firmware_ubuffer = (unsigned int*)((unsigned int*)arg)[3]; update_firmware_kbuffer = (unsigned int*)kmalloc(update_firmware_length * 4 /* 4 because kmalloc expects bytes */, GFP_KERNEL); @@ -390,8 +411,8 @@ int openair_device_ioctl(struct inode *inode,struct file *filp, unsigned int cmd case UPDATE_FIRMWARE_CLEAR_BSS: - update_firmware_bss_address = ((unsigned int*)arg)[1]; - update_firmware_bss_size = ((unsigned int*)arg)[2]; + update_firmware_bss_address = user_args[1]; + update_firmware_bss_size = user_args[2]; sparc_tmp_0 = update_firmware_bss_address; sparc_tmp_1 = update_firmware_bss_size; @@ -411,8 +432,8 @@ int openair_device_ioctl(struct inode *inode,struct file *filp, unsigned int cmd case UPDATE_FIRMWARE_START_EXECUTION: - update_firmware_start_address = ((unsigned int*)arg)[1]; - update_firmware_stack_pointer = ((unsigned int*)arg)[2]; + update_firmware_start_address = user_args[1]; + update_firmware_stack_pointer = user_args[2]; sparc_tmp_0 = update_firmware_start_address; sparc_tmp_1 = update_firmware_stack_pointer; diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c index c8b9217ce3..cd21d94cb1 100644 --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/irq.c @@ -1,32 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** irq.c - IRQ Handler: IRQ from Leon to PCIe/Kernel: exmimo_irq_handler - sends received packets to userspace diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c b/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c old mode 100755 new mode 100644 index ce699a1b4f..18dc9d846e --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/module_main.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** module_main.c (was: device.c) * diff --git a/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h b/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h old mode 100755 new mode 100644 index 7220946e6b..7c21bc25fc --- a/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h +++ b/targets/ARCH/EXMIMO/DRIVER/eurecom/vars.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __VARS_H__ #define __VARS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/COPYING b/targets/ARCH/EXMIMO/DRIVER/exmimo3/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h old mode 100755 new mode 100644 index ffba2d61c4..c4adf28b82 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/defs.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __DEFS_H__ #define __DEFS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c index 1cc6abf9f7..c6ffcb859b 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/exmimo_fw.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** exmimo_fw.c * diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h old mode 100755 new mode 100644 index 90d1eaa64c..5fc557e400 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/extern.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __EXTERN_H__ #define __EXTERN_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c old mode 100755 new mode 100644 index 4427f4c8af..84bb838097 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/fileops.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** fileops.c * diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c index c8b9217ce3..cd21d94cb1 100644 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/irq.c @@ -1,32 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** irq.c - IRQ Handler: IRQ from Leon to PCIe/Kernel: exmimo_irq_handler - sends received packets to userspace diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c b/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c old mode 100755 new mode 100644 index b25ff1cfa8..3bc6f73766 --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/module_main.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** module_main.c (was: device.c) * diff --git a/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h b/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h old mode 100755 new mode 100644 index 7220946e6b..7c21bc25fc --- a/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h +++ b/targets/ARCH/EXMIMO/DRIVER/exmimo3/vars.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __VARS_H__ #define __VARS_H__ diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/COPYING b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c index 2a25dd39fe..e41b9bf6e9 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_dev.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "em1_drv.h" diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c index b22b224e04..1abd44b019 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "em1_drv.h" diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h index f19f0cfc42..82cb69baba 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_drv.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef USER_APP diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c index 15f4deacd2..6d5fa38ce4 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_fifos.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "em1_drv.h" diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c index 8ade1d69a0..a2d4dccfb2 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_ioctl.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "em1_drv.h" diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c index c2860f0b18..48b17bbf2f 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_mmap.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "em1_drv.h" diff --git a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c index 478f8bb363..bf1be1a68f 100644 --- a/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c +++ b/targets/ARCH/EXMIMO/DRIVER/telecomparistech/em1_rw.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "em1_drv.h" diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/COPYING b/targets/ARCH/EXMIMO/USERSPACE/LIB/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c index 5fbe19eacd..46ad06f67e 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/example.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include "openair0_lib.h" diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c index 84b2d8e8e2..449ac0a8e0 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "openair0_lib.h" #include "gain_control.h" diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h index c71b51550e..78f6173f3b 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/gain_control.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #define TARGET_RX_POWER 50 // Target digital power for the AGC #define TARGET_RX_POWER_MAX 53 // Maximum digital power for AGC diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c index 427cd47be8..7d23cdeb89 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** openair0_lib : API to interface with ExpressMIMO-1&2 kernel driver * @@ -36,21 +28,42 @@ * 28.01.2013: Initial version */ -#include -#include -#include -#include -#include +#define _GNU_SOURCE #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "openair0_lib.h" #include "openair_device.h" #include "common_lib.h" + +#include + + #define max(a,b) ((a)>(b) ? (a) : (b)) + +//#define DEBUG_EXMIMO + exmimo_pci_interface_bot_virtual_t openair0_exmimo_pci[MAX_CARDS]; // contains userspace pointers for each card -char *bigshm_top[MAX_CARDS] = INIT_ZEROS; +char *bigshm_top[MAX_CARDS]; int openair0_fd; int openair0_num_antennas[MAX_CARDS]; @@ -66,6 +79,15 @@ static uint32_t rf_vcocal[4] = {910,910,910,910}; static uint32_t rf_vcocal_850[4] = {2015, 2015, 2015, 2015}; static uint32_t rf_rxdc[4] = {32896,32896,32896,32896}; + + +extern volatile int oai_exit; + + +void kill_watchdog(openair0_device *); +void create_watchdog(openair0_device *); +void rt_sleep(struct timespec *,long ); + unsigned int log2_int( unsigned int x ) { unsigned int ans = 0 ; @@ -104,7 +126,8 @@ int openair0_open(void) //printf("bigshm_top_kvirtptr (MAX_CARDS %d): %p %p %p %p\n", MAX_CARDS,bigshm_top_kvirtptr[0], bigshm_top_kvirtptr[1], bigshm_top_kvirtptr[2], bigshm_top_kvirtptr[3]); - + for( card=0; card < MAX_CARDS; card++) + bigshm_top[card] = NULL; for( card=0; card < openair0_num_detected_cards; card++) { bigshm_top[card] = (char *)mmap( NULL, @@ -247,16 +270,460 @@ int openair0_stop_without_reset(int card) #define MY_RF_MODE (RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX) #define RF_MODE_BASE (LNA1ON + RFBBNORM) +void rt_sleep(struct timespec *ts,long tv_nsec) { + + clock_gettime(CLOCK_MONOTONIC, ts); + + ts->tv_nsec += tv_nsec; + + if (ts->tv_nsec>=1000000000L) { + ts->tv_nsec -= 1000000000L; + ts->tv_sec++; + } + + clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, ts, NULL); + +} +static void *watchdog_thread(void *arg) { + + int policy, s, j; + struct sched_param sparam; + char cpu_affinity[1024]; + cpu_set_t cpuset; + exmimo_state_t *exm=((openair0_device *)arg)->priv; + openair0_config_t *cfg=&((openair0_device *)arg)->openair0_cfg[0]; + + volatile unsigned int *daq_mbox = openair0_daq_cnt(); + unsigned int mbox,diff; + int first_acquisition; + struct timespec sleep_time,wait; + + int ret; + + + wait.tv_sec=0; + wait.tv_nsec=50000000L; + + /* Set affinity mask to include CPUs 1 to MAX_CPUS */ + /* CPU 0 is reserved for UHD threads */ + /* CPU 1 is reserved for all TX threads */ + /* Enable CPU Affinity only if number of CPUs >2 */ + CPU_ZERO(&cpuset); + +#ifdef CPU_AFFINITY + if (get_nprocs() > 2) + { + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_setaffinity_np"); + printf("Error setting processor affinity"); + } + } +#endif //CPU_AFFINITY + + /* Check the actual affinity mask assigned to the thread */ + + s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_getaffinity_np"); + printf("Error getting processor affinity "); + } + memset(cpu_affinity,0,sizeof(cpu_affinity)); + for (j = 0; j < CPU_SETSIZE; j++) + if (CPU_ISSET(j, &cpuset)) + { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } + + memset(&sparam, 0 , sizeof (sparam)); + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); + policy = SCHED_FIFO ; + + s = pthread_setschedparam(pthread_self(), policy, &sparam); + if (s != 0) + { + perror("pthread_setschedparam : "); + printf("Error setting thread priority"); + } + s = pthread_getschedparam(pthread_self(), &policy, &sparam); + if (s != 0) + { + perror("pthread_getschedparam : "); + printf("Error getting thread priority"); + + } + + printf("EXMIMO2 Watchdog TX thread started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n", + sched_getcpu(), + syscall(__NR_gettid), + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + sparam.sched_priority, + cpu_affinity ); + + + mlockall(MCL_CURRENT | MCL_FUTURE); + + exm->watchdog_exit = 0; + exm->ts = 0; + exm->last_mbox = 0; + + if (cfg->sample_rate==30.72e6) { + exm->samples_per_tick = 15360; + exm->samples_per_frame = 307200; + } + else if (cfg->sample_rate==23.04e6) { + exm->samples_per_tick = 11520; + exm->samples_per_frame = 230400; + } + else if (cfg->sample_rate==15.36e6) { + exm->samples_per_tick = 7680; + exm->samples_per_frame = 153600; + } + else if (cfg->sample_rate==7.68e6) { + exm->samples_per_tick = 3840; + exm->samples_per_frame = 76800; + } + else if (cfg->sample_rate==3.84e6) { + exm->samples_per_tick = 1920; + exm->samples_per_frame = 38400; + } + else if (cfg->sample_rate==1.92e6) { + exm->samples_per_tick = 960; + exm->samples_per_frame = 19200; + } + else { + printf("Unknown sampling rate %f, exiting \n",cfg->sample_rate); + exm->watchdog_exit=1; + } + + first_acquisition=1; + printf("Locking watchdog for first acquisition\n"); + ret = pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); + // main loop to keep up with DMA transfers from exmimo2 + + unsigned long long cnt_diff0=0; + while ((!oai_exit) && (!exm->watchdog_exit)) { + + if (exm->daq_state == running) { + + // grab time from MBOX + mbox = daq_mbox[0]; + + if (mboxlast_mbox) { // wrap-around + diff = 150 + mbox - exm->last_mbox; + } + else { + diff = mbox - exm->last_mbox; + } + exm->last_mbox = mbox; + + if (first_acquisition==0) + { + ret = pthread_mutex_timedlock(&exm->watchdog_mutex,&wait); + if(ret) + { +// exm->watchdog_exit = 1; + printf("watchdog_thread pthread_mutex_timedlock error = %d\n", ret); + continue; + } + } + + exm->ts += (diff*exm->samples_per_frame/150) ; + + + if ((exm->daq_state == running) && + (diff > 16)&& + (first_acquisition==0)) {// we're too late so exit + exm->watchdog_exit = 1; + printf("exiting, too late to keep up - diff = %d\n", diff); + } + first_acquisition=0; + + if ((exm->daq_state == running) && + (diff == 0)) { + cnt_diff0++; + if (cnt_diff0 == 10) { + exm->watchdog_exit = 1; + printf("exiting, HW stopped %llu\n", cnt_diff0); + } + } + else + cnt_diff0=0; + + if ((exm->daq_state == running) && + (exm->wait_first_read==0) && + (exm->ts - exm->last_ts_rx > exm->samples_per_frame)) { + exm->watchdog_exit = 1; + printf("RX Overflow, exiting (TS %llu, TS last read %llu)\n", + (long long unsigned int)exm->ts,(long long unsigned int)exm->last_ts_rx); + } + // printf("ts %lu, last_ts_rx %lu, mbox %d, diff %d\n",exm->ts, exm->last_ts_rx,mbox,diff); + + if ( !ret ) + pthread_mutex_unlock(&exm->watchdog_mutex); + } + else { + first_acquisition=1; + } + rt_sleep(&sleep_time,250000L); + } + + oai_exit=1; + printf("Exiting watchdog\n"); + return NULL; +} + +void create_watchdog(openair0_device *dev) { + + exmimo_state_t *priv = dev->priv; + priv->watchdog_exit=0; +#ifndef DEADLINE_SCHEDULER + priv->watchdog_sched_param.sched_priority = sched_get_priority_max(SCHED_FIFO); + pthread_attr_setschedparam(&priv->watchdog_attr,&priv->watchdog_sched_param); + pthread_attr_setschedpolicy(&priv->watchdog_attr,SCHED_FIFO); + pthread_create(&priv->watchdog,&priv->watchdog_attr,watchdog_thread,dev); +#else + pthread_create(&priv->watchdog,NULL,watchdog_thread,dev); +#endif + pthread_mutex_init(&priv->watchdog_mutex,NULL); + + +} + +int trx_exmimo_start(openair0_device *device) { + + exmimo_state_t *exm=device->priv; + + printf("Starting ...\n"); + openair0_config(device->openair0_cfg,0); + openair0_start_rt_acquisition(0); + printf("Setting state to running\n"); + exm->daq_state = running; + exm->wait_first_read = 1; + return(0); +} + +int trx_exmimo_write(openair0_device *device,openair0_timestamp ptimestamp, void **buff, int nsamps, int cc, int flags) { + + + return(nsamps); +} + + + +int trx_exmimo_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { + + exmimo_state_t *exm=device->priv; + openair0_config_t *cfg=&device->openair0_cfg[0]; + openair0_timestamp old_ts=0,ts,diff; + struct timespec sleep_time; + unsigned long tv_nsec; + int i; + int n,n1,n2,ntot,first_len; + int ret; + + // struct timespec wait; + // wait.tv_sec=0; + // wait.tv_nsec=50000000L; + + if (exm->watchdog_exit == 1) + return(0); + + if (exm->daq_state == idle) { + tv_nsec=(unsigned long)((double)(nsamps)*1e9/cfg->sample_rate); + return(0); + } + + ret = pthread_mutex_lock(&exm->watchdog_mutex); + + switch (ret) { + case EINVAL: +#ifdef DEBUG_EXMIMO + printf("trx_exmimo_read: mutex_timedlock returned EINVAL\n"); +#endif + return(0); + break; + case ETIMEDOUT: +#ifdef DEBUG_EXMIMO + printf("trx_exmimo_read: mutex_timedlock returned ETIMEDOUT\n"); +#endif + return(0); + break; + case EAGAIN: +#ifdef DEBUG_EXMIMO + printf("trx_exmimo_read: mutex_timedlock returned EAGAIN\n"); +#endif + return(0); + break; + case EDEADLK: +#ifdef DEBUG_EXMIMO + printf("trx_exmimo_read: mutex_timedlock returned EDEADLK\n"); +#endif + return(0); + break; + } + + ts = exm->ts; + if (exm->wait_first_read==1) { + exm->wait_first_read=0; + exm->last_ts_rx = ts; + } + + pthread_mutex_unlock(&exm->watchdog_mutex); + // dump_frame_parms(frame_parms[0]); + + if (nsamps > (exm->samples_per_frame>>1)) { + n1 = nsamps>>1; + n2 = nsamps-n1; + } + else { + n1=nsamps; + n2=0; + } + +#ifdef DEBUG_EXMIMO + printf("Reading %d samples, ts %lu (%d), last_ts_rx %lu (%lu)\n",nsamps,ts,ts%exm->samples_per_frame,exm->last_ts_rx,exm->last_ts_rx+nsamps); +#endif + for (n=n1,ntot=0;ntotlast_ts_rx + n) && + (exm->watchdog_exit==0)) { + + diff = exm->last_ts_rx+n - ts; // difference in samples between current timestamp and last RX received sample + // go to sleep until we should have enough samples (1024 for a bit more) +#ifdef DEBUG_EXMIMO + printf("portion %d samples, ts %lu, last_ts_rx %lu (%lu) => sleeping %u us\n",n,ts,exm->last_ts_rx,exm->last_ts_rx+n, + (unsigned int)((double)(diff+1024)*1e6/cfg->sample_rate)); +#endif + tv_nsec=(unsigned long)((double)(diff+3840)*1e9/cfg->sample_rate); + // tv_nsec = 500000L; + old_ts = ts; + rt_sleep(&sleep_time,tv_nsec); +#ifdef DEBUG_EXMIMO + printf("back\n"); +#endif + // get new timestamp, in case we have to sleep again + pthread_mutex_lock(&exm->watchdog_mutex); + ts = exm->ts; + pthread_mutex_unlock(&exm->watchdog_mutex); + if (old_ts == ts) { + printf("ts stopped, returning\n"); + return(0); + } + } + + + + if (cfg->mmapped_dma == 0) { // if buff is not the dma buffer, do a memcpy, otherwise do nothing + for (i=0;ilast_ts_rx % exm->samples_per_frame)); +#endif + if ((n+(exm->last_ts_rx%exm->samples_per_frame))samples_per_frame) { + memcpy(buff[i]+(ntot*sizeof(int)), + (void*)(openair0_exmimo_pci[0].adc_head[i]+(exm->last_ts_rx % exm->samples_per_frame)), + n*sizeof(int)); + } + else { + first_len = (exm->samples_per_frame-(exm->last_ts_rx%exm->samples_per_frame)); +#ifdef DEBUG_EXMIMO + printf("split: first_len %d, remainder %d\n",first_len,n-first_len); +#endif + memcpy(buff[i]+(ntot*sizeof(int)), + (void*)(openair0_exmimo_pci[0].adc_head[i]+(exm->last_ts_rx % exm->samples_per_frame)), + first_len*sizeof(int)); + memcpy(buff[i]+(ntot+first_len)*sizeof(int), + (void*)openair0_exmimo_pci[0].adc_head[i], + (n-first_len)*sizeof(int)); + } + } + } + pthread_mutex_lock(&exm->watchdog_mutex); + exm->last_ts_rx += n; + pthread_mutex_unlock(&exm->watchdog_mutex); + if (n==n1) { + *ptimestamp=exm->last_ts_rx; + } + ntot+=n; + } + + + + + return(nsamps); +} + +void trx_exmimo_end(openair0_device *device) { + + exmimo_state_t *exm=device->priv; + + exm->daq_state = idle; + openair0_stop(0); + +} + +int trx_exmimo_get_stats(openair0_device* device) { + + return(0); + +} + +int trx_exmimo_reset_stats(openair0_device* device) { + + return(0); + +} + +int trx_exmimo_stop(openair0_device* device) { + + exmimo_state_t *exm=device->priv; + + printf("Stopping ...\n"); + exm->daq_state = idle; + openair0_stop(0); + + return(0); + +} + +int trx_exmimo_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) { + + openair0_set_frequencies(device,openair0_cfg,0); + return(0); +} + +int trx_exmimo_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { + + return(0); + +} + +void kill_watchdog(openair0_device *device) { + + exmimo_state_t *exm=(exmimo_state_t *)device->priv; + exm->watchdog_exit=1; + +} + int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { // Initialize card // exmimo_config_t *p_exmimo_config; exmimo_id_t *p_exmimo_id; int ret; + exmimo_state_t *exm = (exmimo_state_t *)malloc(sizeof(exmimo_state_t)); + int card,ant; ret = openair0_open(); - - + if ( ret != 0 ) { if (ret == -1) printf("Error opening /dev/openair0"); @@ -276,22 +743,58 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[0]); } - // p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr; - p_exmimo_id = openair0_exmimo_pci[0].exmimo_id_ptr; + for (card=0; cardboard_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev); + printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", card, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev); - // check if the software matches firmware - if (p_exmimo_id->board_swrev!=BOARD_SWREV_CNTL2) { - printf("Software revision %d and firmware revision %d do not match. Please update either the firmware or the software!\n",BOARD_SWREV_CNTL2,p_exmimo_id->board_swrev); - return(-1); + // check if the software matches firmware + if (p_exmimo_id->board_swrev!=BOARD_SWREV_CNTL2) { + printf("Software revision %d and firmware revision %d do not match. Please update either the firmware or the software!\n",BOARD_SWREV_CNTL2,p_exmimo_id->board_swrev); + return(-1); + } } device->type = EXMIMO_DEV; + // Add stuff that was in lte-softmodem here + + // + device->trx_start_func = trx_exmimo_start; + device->trx_end_func = trx_exmimo_end; + device->trx_read_func = trx_exmimo_read; + device->trx_write_func = trx_exmimo_write; + device->trx_get_stats_func = trx_exmimo_get_stats; + device->trx_reset_stats_func = trx_exmimo_reset_stats; + device->trx_stop_func = trx_exmimo_stop; + device->trx_set_freq_func = trx_exmimo_set_freq; + device->trx_set_gains_func = trx_exmimo_set_gains; + device->openair0_cfg = openair0_cfg; + device->priv = (void *)exm; + + + printf("EXMIMO2: Getting addresses for memory-mapped DMA\n"); + for (card=0; cardframing.multicard_syncmode=SYNCMODE_SLAVE; /* device specific */ - openair0_cfg[card].txlaunch_wait = 1;//manage when TX processing is triggered - openair0_cfg[card].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered openair0_cfg[card].iq_txshift = 4;//shift openair0_cfg[card].iq_rxrescale = 15;//rescale iqs + if (openair0_cfg[card].sample_rate==30.72e6) { resampling_factor = 0; rx_filter = RXLPF10; @@ -361,41 +864,76 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) #endif for (ant=0; ant<4; ant++) { + p_exmimo_config->rf.rf_freq_rx[ant] = 0; + p_exmimo_config->rf.rf_freq_tx[ant] = 0; + p_exmimo_config->rf.rf_mode[ant] = 0; + p_exmimo_config->rf.rx_gain[ant][0] = 0; + p_exmimo_config->rf.tx_gain[ant][0] = 0; + + openair0_cfg[card].rxbase[ant] = (int32_t*)openair0_exmimo_pci[card].adc_head[ant]; + openair0_cfg[card].txbase[ant] = (int32_t*)openair0_exmimo_pci[card].dac_head[ant]; + if (openair0_cfg[card].rx_freq[ant] || openair0_cfg[card].tx_freq[ant]) { ACTIVE_RF += (1<rf.rf_mode[ant] = RF_MODE_BASE; p_exmimo_config->rf.do_autocal[ant] = 1;//openair0_cfg[card].autocal[ant]; - printf("card %d, antenna %d, autocal %d\n",card,ant,openair0_cfg[card].autocal[ant]); + printf("card %d, antenna %d, autocal %d\n",card,ant,p_exmimo_config->rf.do_autocal[ant]); } - if (openair0_cfg[card].tx_freq[ant]) { + if (openair0_cfg[card].tx_freq[ant]>0) { p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX + TXLPFNORM + TXLPFEN + tx_filter); p_exmimo_config->rf.rf_freq_tx[ant] = (unsigned int)openair0_cfg[card].tx_freq[ant]; p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg[card].tx_gain[ant]; + printf("openair0 : programming card %d TX antenna %d (freq %u, gain %d)\n",card,ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]); + printf("Setting TX buffer to all-RX\n"); + + for (i=0;i<307200;i++) { + ((uint32_t*)openair0_exmimo_pci[card].dac_head[ant])[i] = 0x00010001; + } } - if (openair0_cfg[card].rx_freq[ant]) { + if (openair0_cfg[card].rx_freq[ant]>0) { p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX + RXLPFNORM + RXLPFEN + rx_filter); - p_exmimo_config->rf.rf_freq_rx[ant] = (unsigned int)openair0_cfg[card].rx_freq[ant]; - p_exmimo_config->rf.rx_gain[ant][0] = (unsigned int)openair0_cfg[card].rx_gain[ant]; - printf("openair0 : programming card %d RX antenna %d (freq %u, gain %d)\n",card,ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]); switch (openair0_cfg[card].rxg_mode[ant]) { default: case max_gain: p_exmimo_config->rf.rf_mode[ant] += LNAMax; + if (rxg_max[ant] >= (int)openair0_cfg[card].rx_gain[ant]) { + p_exmimo_config->rf.rx_gain[ant][0] = 30 - (rxg_max[ant] - (int)openair0_cfg[card].rx_gain[ant]); //was measured at rxgain=30; + } + else { + printf("openair0: RX RF gain too high, reduce by %d dB\n", (int)openair0_cfg[card].rx_gain[ant]-rxg_max[ant]); + exit(-1); + } break; case med_gain: p_exmimo_config->rf.rf_mode[ant] += LNAMed; + if (rxg_med[ant] >= (int)openair0_cfg[card].rx_gain[ant]) { + p_exmimo_config->rf.rx_gain[ant][0] = 30 - (rxg_med[ant] - (int)openair0_cfg[card].rx_gain[ant]); //was measured at rxgain=30; + } + else { + printf("openair0: RX RF gain too high, reduce by %d dB\n", (int)openair0_cfg[card].rx_gain[ant]-rxg_med[ant]); + exit(-1); + } break; case byp_gain: p_exmimo_config->rf.rf_mode[ant] += LNAByp; + if (rxg_byp[ant] >= (int)openair0_cfg[card].rx_gain[ant]) { + p_exmimo_config->rf.rx_gain[ant][0] = 30 - (rxg_byp[ant] - (int)openair0_cfg[card].rx_gain[ant]); //was measured at rxgain=30; + } + else { + printf("openair0: RX RF gain too high, reduce by %d dB\n", (int)openair0_cfg[card].rx_gain[ant]-rxg_byp[ant]); + exit(-1); + } break; } + printf("openair0 : programming card %d RX antenna %d (freq %u, gain %d)\n",card,ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]); + } else { p_exmimo_config->rf.rf_mode[ant] = 0; p_exmimo_config->rf.do_autocal[ant] = 0; @@ -404,7 +942,7 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) p_exmimo_config->rf.rf_local[ant] = rf_local[ant]; p_exmimo_config->rf.rf_rxdc[ant] = rf_rxdc[ant]; - if (( p_exmimo_config->rf.rf_freq_tx[ant] >= 850000000) && ( p_exmimo_config->rf.rf_freq_tx[ant] <= 865000000)) { + if (( p_exmimo_config->rf.rf_freq_tx[ant] >= 790000000) && ( p_exmimo_config->rf.rf_freq_tx[ant] <= 865000000)) { p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal_850[ant]; p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD; } else if (( p_exmimo_config->rf.rf_freq_tx[ant] >= 1900000000) && ( p_exmimo_config->rf.rf_freq_tx[ant] <= 2000000000)) { @@ -417,7 +955,7 @@ int openair0_config(openair0_config_t *openair0_cfg, int UE_flag) } if (openair0_cfg[card].duplex_mode==duplex_mode_FDD) { - p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD; + p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD;// + TXRXSWITCH_LSB + TXRXSWITCH_LSB + ACTIVE_RF+ ACTIVE_RF; printf("!!!!!setting FDD (tdd_config=%d)\n",p_exmimo_config->framing.tdd_config); } else { @@ -448,6 +986,9 @@ int openair0_reconfig(openair0_config_t *openair0_cfg) return(-1); } +#ifdef DEBUG_EXMIMO + printf("Reconfiguration of gains/frequencies\n"); +#endif for (card=0; cardrf.rf_freq_tx[ant] = (unsigned int)openair0_cfg[card].tx_freq[ant]; p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg[card].tx_gain[ant]; - //printf("openair0 : programming TX antenna %d (freq %u, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]); +#ifdef DEBUG_EXMIMO + printf("openair0 - %d : programming TX antenna %d (freq %u, gain %d)\n",card,ant,p_exmimo_config->rf.rf_freq_tx[ant],p_exmimo_config->rf.tx_gain[ant][0]); +#endif } + if (openair0_cfg[card].rx_freq[ant]) { p_exmimo_config->rf.rf_freq_rx[ant] = (unsigned int)openair0_cfg[card].rx_freq[ant]; p_exmimo_config->rf.rx_gain[ant][0] = (unsigned int)openair0_cfg[card].rx_gain[ant]; - //printf("openair0 : programming RX antenna %d (freq %u, gain %d)\n",ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]); - +#ifdef DEBUG_EXMIMO + printf("openair0 - %d : programming RX antenna %d (freq %u, gain %d)\n",card,ant,p_exmimo_config->rf.rf_freq_rx[ant],p_exmimo_config->rf.rx_gain[ant][0]); +#endif switch (openair0_cfg[card].rxg_mode[ant]) { default: case max_gain: diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h index 0abb27dee2..9211e67ec5 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h +++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** openair0_lib : API to interface with ExpressMIMO kernel driver * @@ -42,6 +34,30 @@ #include "pcie_interface.h" #include "openair_device.h" #include "common_lib.h" +#include +#include +#include + +typedef enum { + idle=0, + waiting_for_synch, + running +} exmimo_daq_state_t; + +typedef struct { + pthread_t watchdog; + pthread_attr_t watchdog_attr; + struct sched_param watchdog_sched_param; + pthread_mutex_t watchdog_mutex; + int watchdog_exit; + int wait_first_read; + exmimo_daq_state_t daq_state; + openair0_timestamp ts; + openair0_timestamp last_ts_rx; + int samples_per_tick; + int samples_per_frame; + int last_mbox; +} exmimo_state_t; // Use this to access shared memory (configuration structures, adc/dac data buffers, ...) // contains userspace pointers diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/COPYING b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h index 238c4ee606..ed847cbd9e 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elf.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*============================================================================ File: elf.h Include file for ELF file. Defines both 32-/64-bit files. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h index dfd16118c6..d1d790d236 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/elftypes.h @@ -1,32 +1,3 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - /*============================================================================ File: elftypes.h Include file for Elf types. Define elf types for Elf structures. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c index 692742c7cf..1b2445fa72 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* C Header file for updatefw tool. @@ -41,6 +33,7 @@ #include #include #include +#include #include #include "openair_device.h" @@ -239,6 +232,18 @@ void find_and_transfer_section(char* section_name, unsigned int verboselevel) { /* Dynamically allocate a chunk of memory to store the section into. */ section_content = (char*)malloc(elf_Shdr.sh_size); + /* Fail if the address returned by malloc does not fit in 32 bits. + * The kernel driver gets this address as 32 bits and uses it to copy + * from userspace. If the address does not fit into 32 bits the kernel + * will copy garbage or fail to copy completely. + * To be reworked if things do not work on some setups. + */ + if (sizeof(char*) > 4 && (((uintptr_t)section_content)>>32)) { + fprintf(stderr, "FATAL ERROR: an internal serious problem has been encountered.\n"); + fprintf(stderr, "Contact the authors so as to solve this issue.\n"); + exit(-1); + } + if (!section_content) { fprintf(stderr, "Error: could not dynamically allocate %d bytes for section %s.\n", elf_Shdr.sh_size, SecNameStnTable + elf_Shdr.sh_name); @@ -281,6 +286,13 @@ void find_and_transfer_section(char* section_name, unsigned int verboselevel) { ioctl_params[0] = UPDATE_FIRMWARE_TRANSFER_BLOCK; ioctl_params[1] = elf_Shdr.sh_addr; ioctl_params[2] = elf_Shdr.sh_size / 4; + /* This is wrong on x86_64 because a pointer is 64 bits and + * an unsigned int is only 32 bits. + * The compiler emits a warning, but the test + * above on the value of section_content makes it work + * (hopefully). + * To be changed if things do not work. + */ ioctl_params[3] = (unsigned int)((unsigned int*)section_content); //invert4(ioctl_params[1]); //invert4(ioctl_params[2]); diff --git a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h index ea2abec216..a167263969 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h +++ b/targets/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* C Header file for updatefw tool. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/COPYING b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/Makefile b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/Makefile index c9c5f82819..77b3d41f25 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/Makefile +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/Makefile @@ -1,5 +1,5 @@ CC = gcc -CFLAGS = -DUSER_MODE -DEXMIMO -g +CFLAGS = -DEXMIMO -g XTRA_CFLAGS = -msse -msse2 -mssse3 -fPIC #ifndef OPENAIR0_DIR diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc index a007618e43..21bab68d95 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/gpib_send.cc @@ -1,32 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - // Maxime Guillaud - created Wed May 10 19:23:30 CEST 2006 // see http://www.gnu.org/software/octave/doc/interpreter/Dynamically-Linked-Functions.html#Dynamically-Linked-Functions // and http://octave.sourceforge.net/coda/c58.html diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h new file mode 100644 index 0000000000..7b95444163 --- /dev/null +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf.h @@ -0,0 +1,22 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +volatile int oai_exit=0; diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc index 4d0eef921b..ccfe306ef6 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_config_exmimo.cc @@ -1,32 +1,24 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - // Matthias Ihmig, based on code from Maxime Guillaud - created 28.01.2013 // see http://www.gnu.org/software/octave/doc/interpreter/Dynamically-Linked-Functions.html#Dynamically-Linked-Functions // and http://wiki.octave.org/wiki.pl?CodaTutorial @@ -36,6 +28,7 @@ #include #include "pcie_interface.h" +#include "oarf.h" extern "C" { #include "openair0_lib.h" diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc index 708910b4f7..79facd431f 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_get_frame.cc @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // Maxime Guillaud - created Fri May 12 16:20:04 CEST 2006 // Matthias Ihmig, 2013 @@ -42,6 +34,7 @@ extern "C" { #include "openair0_lib.h" } +#include "oarf.h" #define FCNNAME "oarf_get_frame" @@ -178,7 +171,7 @@ DEFUN_DLD (oarf_get_frame, args, nargout,"Get frame") printf("Info : Only resampling_factor of channel 0 is taken into account for copying received frame for all the other chains\n"); - ComplexMatrix dx (FRAME_LENGTH_COMPLEX_SAMPLES*4, numant*openair0_num_detected_cards); + ComplexMatrix dx (FRAME_LENGTH_COMPLEX_SAMPLES*4, MAX_ANTENNAS*openair0_num_detected_cards); /* // set the tx buffer to 0x00010001 to put switch in rx mode for (aa=0; aa. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // Matthias Ihmig, 2013 // see http://www.gnu.org/software/octave/doc/interpreter/Dynamically-Linked-Functions.html#Dynamically-Linked-Functions @@ -39,6 +31,7 @@ extern "C" { #include "openair0_lib.h" } +#include "oarf.h" #define FCNNAME "oarf_get_num_detected_cards" diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc index 75cdef67b2..1ebe3aeb4e 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_send_frame.cc @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // Matthias Ihmig, 2013 // Maxime Guillaud - created Fri May 12 16:20:04 CEST 2006 @@ -41,6 +33,7 @@ extern "C" { #include "openair0_lib.h" } +#include "oarf.h" #define FCNNAME "oarf_send_frame" diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc index 03b4b5324d..b2d73c8329 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop.cc @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // Matthias Ihmig, 2013 // Florian Kaltenberger - created 2010-01-22 @@ -40,6 +32,7 @@ extern "C" { #include "openair0_lib.h" } +#include "oarf.h" #define FCNNAME "oarf_stop" diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc index 058a8bba3e..05188405e6 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/oarf_stop_without_reset.cc @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ // Riadh Ghaddab - created 2013-10-24 // see http://www.gnu.org/software/octave/doc/interpreter/Dynamically-Linked-Functions.html#Dynamically-Linked-Functions @@ -39,6 +31,7 @@ extern "C" { #include "openair0_lib.h" } +#include "oarf.h" #define FCNNAME "oarf_stop_without_reset" diff --git a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m index ad33d26123..77da351118 100644 --- a/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m +++ b/targets/ARCH/EXMIMO/USERSPACE/OCTAVE/txsig.m @@ -1,4 +1,4 @@ -fc = 1907600000; +fc = 2560000000 %fc = 1907600000; %fc = 859.5e6; @@ -6,7 +6,7 @@ rxgain=0; txgain=0; eNB_flag = 0; card = 0; -active_rf = [1 1 1 1]; +active_rf = [1 0 0 0]; autocal = [1 1 1 1]; resampling_factor = [2 2 2 2]; limeparms; @@ -38,14 +38,14 @@ rffe_band = B19G_TDD*[1 1 1 1]; oarf_config_exmimo(card, freq_rx,freq_tx,tdd_config,syncmode,rxgain,txgain,eNB_flag,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal,resampling_factor); %oarf_config_exmimo(1, freq_rx,freq_tx,tdd_config,syncmode,rxgain,txgain,eNB_flag,rf_mode,rf_rxdc,rf_local,rf_vcocal,rffe_rxg_low,rffe_rxg_final,rffe_band,autocal,resampling_factor); -amp = pow2(14)-1; +amp = pow2(10)-1; n_bit = 16; length = 307200/pow2(resampling_factor(1)); s = zeros(length,4); -select = 1; +select = 7; switch(select) @@ -73,7 +73,8 @@ case 3 case 4 pss0_f0=[0,0,0,0,0,0,0,0,0,0,32767,0,-26120,-19785,11971,-30502,-24020,-22288,32117,6492,31311,9658,-16384,-28378,25100,-21063,-7292,-31946,20429,25618,14948,29158,11971,-30502,31311,9658,25100,-21063,-16384,28377,-24020,22287,32117,6492,-7292,31945,20429,25618,-26120,-19785,-16384,-28378,-16384,28377,-26120,-19785,-32402,4883,31311,-9659,32117,6492,-7292,-31946,32767,-1,25100,-21063,-24020,22287,-32402,4883,-32402,4883,-24020,22287,25100,-21063,32767,-1,-7292,-31946,32117,6492,31311,-9659,-32402,4883,-26120,-19785,-16384,28377,-16384,-28378,-26120,-19785,20429,25618,-7292,31945,32117,6492,-24020,22287,-16384,28377,25100,-21063,31311,9658,11971,-30502,14948,29158,20429,25618,-7292,-31946,25100,-21063,-16384,-28378,31311,9658,32117,6492,-24020,-22288,11971,-30502,-26120,-19785,32767,0,0,0,0,0,0,0,0,0,0,0]; - pss0_f = pss0_f0(1:2:length(pss0_f0)) + sqrt(-1)*pss0_f0(2:2:length(pss0_f0)); + %pss0_f = pss0_f0(1:2:length(pss0_f0)) + sqrt(-1)*pss0_f0(2:2:length(pss0_f0)); + pss0_f = pss0_f0(1:2:size(pss0_f0,2)) + sqrt(-1)*pss0_f0(2:2:size(pss0_f0,2)); pss0_f = [0 pss0_f(37:72) zeros(1,512-73) pss0_f(1:36)]; pss0_t = ifft(pss0_f); @@ -84,10 +85,15 @@ case 4 pss0_t_fp_re = floor(real(8192*pss0_t/pss0_max)); pss0_t_fp_im = floor(imag(8192*pss0_t/pss0_max)); + %keyboard; s(38400+(1:length(pss0_t_fp_re)),1) = 2*floor(pss0_t_fp_re) + 2*sqrt(-1)*floor(pss0_t_fp_im); s(38400+(1:length(pss0_t_fp_re)),2) = 2*floor(pss0_t_fp_re) + 2*sqrt(-1)*floor(pss0_t_fp_im); s(38400+(1:length(pss0_t_fp_re)),3) = 2*floor(pss0_t_fp_re) + 2*sqrt(-1)*floor(pss0_t_fp_im); s(38400+(1:length(pss0_t_fp_re)),4) = 2*floor(pss0_t_fp_re) + 2*sqrt(-1)*floor(pss0_t_fp_im); + %s(38400+(1:size(pss0_t_fp_re,2)),1) = 2*floor(pss0_t_fp_re) + 2*sqrt(-1)*floor(pss0_t_fp_im); + %s(38400+(1:size(pss0_t_fp_re,2)),2) = 2*floor(pss0_t_fp_re) + 2*sqrt(-1)*floor(pss0_t_fp_im); + %s(38400+(1:size(pss0_t_fp_re,2)),3) = 2*floor(pss0_t_fp_re) + 2*sqrt(-1)*floor(pss0_t_fp_im); + %s(38400+(1:size(pss0_t_fp_re,2)),4) = 2*floor(pss0_t_fp_re) + 2*sqrt(-1)*floor(pss0_t_fp_im); case 5 x=1:length; @@ -108,7 +114,9 @@ case 6 s(:,1) = OFDM_TX_FRAME(num_carriers,num_zeros,prefix_length,num_symbols_frame,preamble_length); s(:,1) = floor(amp*(s(:,1)./max([real(s(:,1)); imag(s(:,1))]))); - + +case 7 + s(:,1) = floor(txs0); otherwise error('unknown case') diff --git a/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/LimeSDR.ini similarity index 85% rename from targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini rename to targets/ARCH/LMSSDR/LimeSDR.ini index a0793ad395..778e7969ce 100644 --- a/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_10MHz_rx19dB_txfull.ini +++ b/targets/ARCH/LMSSDR/LimeSDR.ini @@ -1,1128 +1,1128 @@ -[reference_clocks] -sxr_ref_clk_mhz=30.72 -sxt_ref_clk_mhz=30.72 -[lms7002_registers_b] -0x03A0=0x0000 -0x054E=0x0000 -0x02D0=0x0000 -0x0386=0x0000 -0x054F=0x0000 -0x0389=0x0000 -0x040F=0x0000 -0x04E3=0x0000 -0x0385=0x0000 -0x0315=0x0000 -0x0384=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0381=0x0000 -0x0366=0x0000 -0x0365=0x0000 -0x0364=0x0000 -0x0325=0x0000 -0x035E=0x0000 -0x035D=0x0000 -0x0442=0x0000 -0x0452=0x0000 -0x0299=0x0000 -0x0359=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x040E=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x0356=0x0000 -0x0348=0x0000 -0x0498=0x0000 -0x0490=0x0000 -0x02CD=0x0000 -0x050D=0x0000 -0x0353=0x0000 -0x0351=0x0000 -0x048F=0x0000 -0x0445=0x0000 -0x0350=0x0000 -0x03A6=0x0000 -0x0293=0x0000 -0x034E=0x0000 -0x035C=0x0000 -0x034D=0x0000 -0x034B=0x0000 -0x011A=0x2E02 -0x0455=0x0000 -0x034A=0x0000 -0x035B=0x0000 -0x0505=0x0000 -0x0345=0x0000 -0x035F=0x0000 -0x0597=0x0000 -0x0586=0x0000 -0x0484=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0561=0x0000 -0x0344=0x0000 -0x0343=0x0000 -0x0342=0x0000 -0x0380=0x0000 -0x0327=0x0000 -0x025E=0x0000 -0x04DA=0x0000 -0x04C2=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x0289=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x0396=0x0000 -0x0284=0x0000 -0x010C=0x88FD -0x044C=0x0000 -0x0355=0x0000 -0x025C=0x0000 -0x0515=0x0000 -0x0361=0x0000 -0x0205=0x0000 -0x025B=0x0000 -0x04C5=0x0000 -0x04E2=0x0000 -0x025A=0x0000 -0x0256=0x0000 -0x0240=0x0020 -0x0367=0x0000 -0x05A3=0x0000 -0x0502=0x0000 -0x0258=0x0000 -0x0255=0x0000 -0x040C=0x0000 -0x028B=0x0000 -0x0253=0x0000 -0x024E=0x0000 -0x0346=0x0000 -0x0280=0x0000 -0x0285=0x0000 -0x024A=0x0000 -0x0261=0x0000 -0x0249=0x0000 -0x04CD=0x0000 -0x040A=0x0000 -0x0556=0x0000 -0x0243=0x0000 -0x051D=0x0000 -0x0494=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x038F=0x0000 -0x0241=0x0000 -0x0488=0x0000 -0x0251=0x0000 -0x020B=0x4000 -0x0108=0x9442 -0x04A0=0x0000 -0x0116=0x8180 -0x02CC=0x0000 -0x039A=0x0000 -0x0112=0xC0E6 -0x0307=0x0000 -0x038C=0x0000 -0x0282=0x0000 -0x0321=0x0000 -0x0507=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x02E1=0x0000 -0x0517=0x0000 -0x0481=0x0000 -0x02D5=0x0000 -0x0259=0x0000 -0x0527=0x0000 -0x02DD=0x0000 -0x0209=0x0000 -0x0297=0x0000 -0x0400=0x0081 -0x0104=0x0088 -0x0103=0x0A12 -0x0347=0x0000 -0x02D8=0x0000 -0x0457=0x0000 -0x0306=0x0000 -0x02D1=0x0000 -0x04C8=0x0000 -0x0546=0x0000 -0x0440=0x0020 -0x045E=0x0000 -0x031D=0x0000 -0x039C=0x0000 -0x02D2=0x0000 -0x010E=0x2040 -0x02A0=0x0000 -0x0544=0x0000 -0x029C=0x0000 -0x055A=0x0000 -0x0295=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x020A=0x0080 +[file_info] +type=lms7002m_minimal_config +version=1 +[lms7002_registers_a] +0x0020=0xFFFD +0x0021=0x0E9F +0x0022=0x07FF +0x0023=0x5550 +0x0024=0xB1E4 +0x0025=0x0101 +0x0026=0x0101 +0x0027=0xB1E4 +0x0028=0x0101 +0x0029=0x0101 +0x002A=0x0086 +0x002B=0x0038 +0x002C=0x0000 +0x002D=0x0000 +0x002E=0x0000 +0x002F=0x3840 +0x0081=0x0000 +0x0082=0x8001 +0x0084=0x0400 +0x0085=0x0001 +0x0086=0x4101 +0x0087=0x0000 +0x0088=0x04B0 +0x0089=0x1090 +0x008A=0x0514 +0x008B=0x2100 +0x008C=0x267B +0x0092=0x0001 +0x0093=0x0000 +0x0094=0x0000 +0x0095=0x0000 +0x0096=0x0000 +0x0097=0x0000 +0x0098=0x0000 +0x0099=0x6565 +0x009A=0x658C +0x009B=0x6565 +0x009C=0x658C +0x009D=0x6565 +0x009E=0x658C +0x009F=0x658C +0x00A0=0x6565 +0x00A1=0x6565 +0x00A2=0x6565 +0x00A3=0x6565 +0x00A4=0x6565 +0x00A5=0x6565 +0x00A6=0x0001 +0x00A7=0x6565 +0x00A8=0x0000 +0x00A9=0x0000 +0x00AA=0x0000 +0x00AB=0x0040 +0x00AC=0x0000 +0x00AD=0x03FF +0x00AE=0x0000 +0x0100=0x7409 +0x0101=0x7800 0x0102=0x3180 -0x0120=0xB9FF -0x0388=0x0000 -0x0318=0x0000 -0x02A7=0x0000 -0x0200=0x0081 -0x0594=0x0000 -0x02C5=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x0395=0x0000 -0x058D=0x0000 -0x02D7=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x039B=0x0000 -0x049E=0x0000 -0x02DB=0x0000 -0x0357=0x0000 -0x02C2=0x0000 -0x0514=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x0493=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x0397=0x0000 -0x02E3=0x0000 -0x049C=0x0000 -0x040D=0x0000 -0x0281=0x0000 -0x048C=0x0000 -0x049A=0x0000 -0x0119=0x18CB +0x0103=0x0612 +0x0104=0x0088 +0x0105=0x0011 +0x0106=0x318C +0x0107=0x318C +0x0108=0x2826 +0x0109=0x6104 +0x010A=0x17BD +0x010C=0x8865 +0x010D=0x01DC +0x010E=0x120D 0x010F=0x3042 -0x02A6=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 -0x0324=0x0000 -0x038E=0x0000 -0x02E7=0x0000 -0x034F=0x0000 -0x04E0=0x0000 +0x0110=0x0BFF +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x0302 +0x0114=0x00D0 +0x0115=0x0009 +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x5286 +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0x2000 +0x011E=0x06E4 +0x011F=0x3640 +0x0120=0xB9FF +0x0121=0x33FC +0x0122=0x033F 0x0123=0x267B -0x0497=0x0000 -0x0459=0x0000 -0x0394=0x0000 -0x04A5=0x0000 -0x04D9=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x0508=0x0000 -0x0443=0x0000 -0x0301=0x0000 -0x0548=0x0000 -0x04D2=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x029A=0x0000 -0x051F=0x0000 -0x0309=0x0000 -0x0585=0x0000 -0x03A5=0x0000 -0x02D3=0x0000 -0x0451=0x0000 -0x0390=0x0000 -0x0562=0x0000 -0x02C4=0x0000 -0x029E=0x0000 -0x031E=0x0000 -0x04C0=0x0000 -0x04DC=0x0000 -0x04DE=0x0000 -0x058B=0x0000 -0x04DB=0x0000 -0x04D0=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x054B=0x0000 -0x02C7=0x0000 -0x05A0=0x0000 -0x044B=0x0000 -0x0100=0x3409 -0x04CA=0x0000 -0x0446=0x0000 -0x02E4=0x0000 -0x04E4=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x04D4=0x0000 -0x0504=0x0000 -0x04CE=0x0000 -0x02DE=0x0000 -0x0399=0x0000 -0x050C=0x0000 -0x02A5=0x0000 -0x04CC=0x0000 -0x03A1=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x040B=0x7FFF -0x0283=0x0000 -0x048E=0x0000 -0x0580=0x0000 -0x0409=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0589=0x0000 -0x038D=0x0000 -0x0487=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0567=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0254=0x0000 -0x0405=0x0000 -0x0387=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0360=0x0000 -0x0559=0x0000 -0x0456=0x0000 -0x0453=0x0000 -0x02E2=0x0000 -0x044D=0x0000 -0x0441=0x0000 -0x02C3=0x0000 -0x04C1=0x0000 -0x04D3=0x0000 -0x0444=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0296=0x0000 -0x0555=0x0000 -0x0349=0x0000 -0x0109=0x61C1 -0x04A2=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x048D=0x0000 -0x059A=0x0000 -0x0407=0x0000 -0x02C0=0x0000 -0x0499=0x0000 -0x0543=0x0000 -0x04C9=0x0000 -0x02CA=0x0000 -0x0404=0x0000 -0x0560=0x0000 -0x02C1=0x0000 -0x04D8=0x0000 -0x0403=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x04C4=0x0000 -0x010D=0x009E -0x0402=0x07FF -0x055E=0x0000 -0x03A7=0x0000 -0x0520=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x0300=0x0000 -0x0587=0x0000 -0x044E=0x0000 -0x055B=0x0000 -0x02E5=0x0000 -0x0114=0x008D -0x0323=0x0000 -0x0320=0x0000 -0x0503=0x0000 -0x0513=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x0549=0x0000 -0x0552=0x0000 -0x0509=0x0000 -0x0521=0x0000 -0x0286=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x058F=0x0000 -0x0557=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x049F=0x0000 -0x0522=0x0000 -0x0545=0x0000 -0x0551=0x0000 -0x0312=0x0000 -0x055D=0x0000 -0x0298=0x0000 -0x055F=0x0000 -0x011D=0x9555 -0x039E=0x0000 -0x0547=0x0000 -0x0598=0x0000 -0x0449=0x0000 -0x0564=0x0000 -0x0242=0x0000 -0x0525=0x0000 -0x0523=0x0000 -0x0565=0x0000 0x0124=0x0000 -0x0563=0x0000 -0x024D=0x0000 -0x05A5=0x0000 -0x0566=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x054C=0x0000 -0x0582=0x0000 -0x0599=0x0000 -0x0511=0x0000 -0x0506=0x0000 -0x0595=0x0000 -0x0584=0x0000 -0x058C=0x0000 -0x05A6=0x0000 -0x051E=0x0000 -0x050F=0x0000 -0x0590=0x0000 -0x0596=0x0000 -0x05A7=0x0000 -0x058A=0x0000 -0x059D=0x0000 -0x0485=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x0245=0x0000 -0x0310=0x0000 -0x058E=0x0000 -0x05A2=0x0000 -0x054D=0x0000 -0x020C=0x7FFF -0x031F=0x0000 -0x0292=0x0000 -0x059F=0x0000 -0x0583=0x0000 -0x0317=0x0000 +0x0200=0x0081 +0x0201=0x07FF +0x0202=0x0744 +0x0203=0x0FE9 +0x0204=0xFDDC +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0170 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x8000 +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 0x0244=0x0000 -0x0554=0x0000 -0x0593=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0519=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 0x024F=0x0000 -0x0524=0x0000 -0x0518=0x0000 -0x0354=0x0000 -0x0526=0x0000 -0x031B=0x0000 -0x050E=0x0000 -0x0516=0x0000 -0x02CB=0x0000 0x0250=0x0000 -0x031C=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 0x028F=0x0000 -0x051A=0x0000 -0x055C=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x8081 +0x0401=0x07FF +0x0402=0x07D9 +0x0403=0x0FF9 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0003 +0x040B=0x000F +0x040C=0x00F8 +0x040D=0x0000 +0x040E=0x0000 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x2B55 +0x0443=0x5540 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 0x050A=0x0000 0x050B=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x04E5=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 0x0512=0x0000 -0x0206=0x0000 -0x0550=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0541=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x05DC -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xAD41 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x02A4=0x0000 -0x0540=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 -0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x039D=0x0000 -0x0500=0x0000 -0x0450=0x0000 -0x011F=0x3680 -0x030C=0x0000 -0x04DF=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D4=0x0000 -0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0383=0x0000 -0x0202=0x07FF -0x054A=0x0000 -0x0401=0x07FF -0x0341=0x0000 -0x0287=0x0000 -0x034C=0x0000 -0x0501=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 0x051B=0x0000 -0x0121=0x356A -0x0115=0x0009 -[lms7002_registers_a] -0x0107=0x318C -0x02D4=0x0000 -0x0082=0x8001 -0x0209=0x0000 -0x02CA=0x0000 -0x04C9=0x0000 -0x0120=0xB9FF -0x0388=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x0208=0x0170 -0x0340=0x0000 -0x0094=0x0000 -0x0244=0x0000 -0x0317=0x0000 -0x00A9=0x8000 -0x0115=0x0009 -0x039A=0x0000 -0x0112=0x3171 -0x048C=0x0000 -0x0023=0x5550 -0x0587=0x1D10 -0x04C0=0x0000 -0x031E=0x0000 -0x0205=0x0000 -0x0361=0x0000 -0x051F=0xAB08 -0x029A=0x0000 -0x0396=0x0000 -0x0284=0x0000 -0x02CE=0x0000 -0x02D9=0x0000 -0x038B=0x0000 -0x044F=0x0000 -0x0367=0x0000 -0x0240=0x0028 -0x05A3=0x0000 -0x0105=0x0007 -0x009B=0x6565 -0x0400=0x0101 -0x02DB=0x0000 -0x0357=0x0000 -0x0104=0x0088 -0x0103=0x0A12 -0x0457=0x0000 -0x0347=0x0000 -0x02D8=0x0000 -0x010C=0x8865 -0x0086=0x4101 -0x0202=0x0794 -0x0383=0x0000 -0x020B=0x4000 -0x0108=0xFC26 -0x0098=0x0000 -0x0117=0x100C -0x0027=0x05E4 -0x00A7=0x6565 -0x024A=0x0000 -0x0029=0x0101 -0x00AD=0x03FF -0x0540=0x5009 -0x02A4=0x0000 -0x02DE=0x0000 -0x002E=0x0000 -0x0261=0x0000 -0x00AB=0x0040 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 0x0564=0x0000 -0x00A8=0x0000 -0x0517=0xC89D -0x0481=0x0000 -0x02C1=0x0000 -0x0301=0x0000 -0x00A5=0x6565 -0x0515=0x2E45 -0x025C=0x0000 -0x009F=0x658C -0x0519=0x4049 -0x054B=0xF7A3 -0x02C7=0x0000 -0x038C=0x0000 -0x0307=0x0000 -0x0282=0x0000 -0x0289=0x0000 -0x011C=0xAD41 -0x0562=0xF524 -0x0025=0x0101 -0x02CC=0x0000 -0x0116=0x8180 -0x0597=0xFDFB -0x035F=0x0000 -0x002F=0x3840 -0x0589=0xEA5F -0x00A2=0x6565 -0x0099=0x6565 -0x0310=0x0000 -0x040C=0x40F8 -0x028B=0x0000 -0x0253=0x0000 -0x00AC=0x2000 -0x002D=0xFFFF -0x00A6=0x0001 -0x054D=0xF7A3 -0x002C=0x0000 -0x0249=0x0000 -0x04CD=0x0000 -0x0401=0x07FF -0x00A4=0x6565 -0x054A=0x8184 -0x038F=0x0000 -0x008C=0x267B -0x0241=0x0000 -0x0356=0x0000 -0x00A1=0x6565 -0x0260=0x0000 -0x0453=0x0000 -0x008A=0x0491 -0x048F=0x0000 -0x0445=0x0000 -0x0350=0x0000 -0x00AA=0x0000 -0x034C=0x0000 -0x0501=0xFDFB -0x0490=0x0000 -0x02CD=0x0000 -0x050D=0x0F45 -0x0353=0x0000 -0x0024=0x50D8 -0x04E5=0x0000 -0x0512=0x196B -0x0247=0x0000 -0x045C=0x0000 -0x024B=0x0000 -0x0395=0x0000 -0x011F=0x3680 -0x039D=0x0000 -0x0500=0xF61D -0x02C9=0x0000 -0x05A1=0x0000 -0x02A6=0x0000 -0x0119=0x18DF -0x010F=0x3042 -0x04CB=0x0000 -0x0391=0x0000 -0x0113=0x03C3 -0x0326=0x0000 -0x028E=0x0000 -0x0106=0x3182 -0x0524=0x3347 -0x009D=0x6565 -0x0294=0x0000 -0x0026=0x0101 -0x0110=0x0BFF -0x0122=0x033F -0x0381=0x0000 -0x009C=0x658C +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 0x05A0=0x0000 -0x0482=0x0000 -0x030E=0x0000 -0x0203=0x2F99 -0x0095=0x0000 -0x0111=0x0099 -0x0256=0x0000 -0x0089=0x0048 -0x0085=0x0001 -0x0088=0x04F0 -0x0459=0x0000 -0x0394=0x0000 -0x010E=0x0285 -0x02A0=0x0000 -0x002B=0x4032 -0x039C=0x0000 -0x02D2=0x0000 -0x0581=0xC89D -0x045D=0x0000 -0x0245=0x0000 -0x002A=0x0086 -0x0118=0x018C -0x02E0=0x0000 -0x0489=0x0000 -0x04A7=0x0000 -0x039E=0x0000 -0x011D=0x2AAA -0x02E1=0x0000 -0x0259=0x0000 -0x02D5=0x0000 -0x051D=0x4F91 -0x0243=0x0000 -0x0556=0xA2B5 -0x040A=0x1000 +0x05A1=0x0000 0x05A2=0x0000 -0x020C=0x8000 -0x020A=0x0080 -0x0102=0x3180 -0x034F=0x0000 -0x0303=0x0000 -0x0306=0x0000 -0x0255=0x0000 -0x0300=0x0000 -0x044E=0x0000 -0x0309=0x0000 -0x0585=0xDAA2 -0x0527=0xACB9 -0x044A=0x0000 -0x04A4=0x0000 -0x048A=0x0000 -0x0392=0x0000 -0x030B=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 0x05A7=0x0000 -0x0252=0x0000 -0x0204=0xC016 -0x0308=0x0000 -0x0588=0xE6C7 -0x0321=0x0000 -0x0507=0xFCFE -0x0312=0x0000 -0x050B=0xF5EF -0x0360=0x0000 -0x0021=0x0E9F -0x04C2=0x0000 -0x030D=0x0000 -0x040E=0x0003 -0x0316=0x0000 -0x031F=0x0000 -0x030C=0x0000 -0x04DF=0x0000 -0x0318=0x0000 +[lms7002_registers_b] +0x0100=0x3409 +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0612 +0x0104=0x0088 +0x0105=0x0007 +0x0106=0x3182 +0x0107=0x318C +0x0108=0x9442 +0x0109=0x61C1 +0x010A=0x104C +0x010C=0x88FD +0x010D=0x019C +0x010E=0x2040 +0x010F=0x3042 +0x0110=0x0BF4 +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x03C3 +0x0114=0x00D0 +0x0115=0x0009 +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x5280 +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0x1555 +0x011E=0x0747 +0x011F=0x3640 +0x0120=0xB9FF +0x0121=0x360C +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0101 +0x0201=0x05BD +0x0202=0x0779 +0x0203=0x0F9E +0x0204=0xBCC2 +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0070 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x7FFF +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 0x02CB=0x0000 -0x045E=0x0000 -0x0440=0x0024 -0x031D=0x0000 -0x058D=0xF5EF +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 0x02D7=0x0000 -0x0380=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 0x0342=0x0000 0x0343=0x0000 -0x0566=0x0906 -0x0345=0x0000 -0x049C=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x035B=0x0000 -0x0505=0x00D8 -0x028D=0x0000 -0x02A1=0x0000 -0x028F=0x0000 -0x031C=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x0596=0x0A94 -0x0354=0x0000 -0x0518=0xEFF2 -0x035C=0x0000 -0x034D=0x0000 0x0344=0x0000 -0x0561=0xAB08 -0x0096=0x0000 -0x010D=0x01DC -0x04C4=0x0000 -0x0351=0x0000 -0x0311=0x0000 -0x02D6=0x0000 -0x02D1=0x0000 -0x0546=0x8D44 -0x04C8=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0522=0xDB10 -0x049F=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x0359=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x0341=0x0000 -0x0287=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0580=0xEFF2 -0x0409=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x0514=0xE7E2 -0x039B=0x0000 -0x0101=0x7800 -0x0558=0x5009 -0x02C6=0x0000 -0x051B=0xB77F -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x0406=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x034B=0x0000 -0x011A=0x2E14 -0x029F=0x0000 -0x030A=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0560=0x174B -0x0404=0x0000 -0x00A0=0x6565 -0x0547=0xD7B7 -0x0454=0x0000 -0x0448=0x0000 -0x0327=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0510=0xE6C7 -0x0302=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0365=0x0000 -0x048E=0x0000 -0x0022=0x07FF -0x0283=0x0000 -0x044B=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x04E4=0x0000 -0x02E4=0x0000 -0x03A5=0x0000 -0x040B=0x000F -0x0366=0x0000 -0x0443=0x0000 -0x0508=0xEF99 -0x00A3=0x6565 -0x02E2=0x0000 -0x044D=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x0493=0x0000 +0x0345=0x0000 0x0346=0x0000 -0x024E=0x0000 -0x055E=0xDB10 -0x0402=0x07D9 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 0x0384=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0480=0x0000 -0x0567=0x4049 -0x04CA=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x0105 +0x0401=0x07FF +0x0402=0x079B +0x0403=0x0FF5 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0000 +0x040B=0x7FFF +0x040C=0x00FC +0x040D=0x0000 +0x040E=0x0002 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x0000 +0x0443=0x0000 +0x0444=0x0000 +0x0445=0x0000 0x0446=0x0000 0x0447=0x0000 -0x0460=0x0000 -0x0559=0xACB9 -0x0456=0x0000 -0x0441=0x0000 -0x0444=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x049E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 -0x038E=0x0000 -0x0403=0x0013 -0x04D8=0x0000 -0x029B=0x0000 -0x0491=0x0000 -0x03A1=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x0407=0x0000 -0x0258=0x0000 -0x0502=0x0A94 -0x038A=0x0000 -0x0362=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x0385=0x0000 -0x0315=0x0000 -0x040D=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x0405=0x0000 -0x0254=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x0487=0x0000 -0x038D=0x0000 -0x035E=0x0000 -0x03A7=0x0000 -0x0520=0x174B +0x0448=0x0000 0x0449=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0387=0x0000 -0x0386=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 0x0452=0x0000 -0x0299=0x0000 -0x0084=0x0400 -0x0498=0x0000 -0x0348=0x0000 -0x02D0=0x0000 -0x054E=0x8184 -0x03A0=0x0000 -0x009A=0x658C -0x055D=0xA6B5 -0x0298=0x0000 -0x0364=0x0000 -0x0081=0x0000 -0x0325=0x0000 -0x040F=0x43E4 -0x04E3=0x0000 -0x050E=0x17DC -0x0516=0x150F -0x0389=0x0000 -0x054F=0x18C9 -0x0304=0x0000 -0x04D5=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0296=0x0000 -0x0555=0xBD96 -0x0349=0x0000 -0x0484=0x0000 -0x0586=0x196B -0x0281=0x0000 -0x0200=0x0301 -0x0594=0xF40D -0x02C5=0x0000 -0x0319=0x0000 -0x0121=0x3652 -0x025B=0x0000 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x029C=0x0000 -0x008B=0x2756 -0x02A3=0x0000 -0x05A4=0x0000 -0x02A7=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 0x0483=0x0000 -0x0201=0x07FF -0x02C2=0x0000 -0x02C4=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0093=0x0000 -0x02D3=0x0000 -0x0494=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x0251=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 0x0496=0x0000 -0x04C3=0x0000 -0x0100=0xB409 -0x04CC=0x0000 -0x02A5=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 0x049A=0x0000 0x049B=0x0000 -0x0097=0x0000 -0x011E=0x061D -0x0285=0x0000 -0x0280=0x0000 -0x0020=0xFFFD -0x02DD=0x0000 -0x0297=0x0000 -0x044C=0x0000 -0x0355=0x0000 -0x04A0=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0526=0xBE2A -0x0092=0x0001 -0x031B=0x0000 -0x0541=0x4C24 -0x0543=0xBD96 -0x02C0=0x0000 -0x0499=0x0000 -0x0513=0xDAA2 -0x0549=0x18C9 -0x0552=0x8D44 -0x0521=0x5852 -0x0509=0x0605 -0x0286=0x0000 -0x024F=0x0000 -0x04E0=0x0000 -0x0545=0x364E -0x0551=0xD7B7 -0x055F=0x5852 -0x009E=0x658C -0x0598=0xF61D -0x0123=0x067B -0x0497=0x0000 -0x04A5=0x0000 -0x0565=0xB77F -0x0124=0x0000 -0x0592=0x0DF1 -0x0591=0xFCFE -0x0548=0x79FA -0x04D2=0x0000 -0x0599=0x0000 -0x0511=0x1D10 -0x0506=0x0DF1 -0x0595=0x00BC -0x0584=0xE7E2 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x058C=0xEA50 -0x0450=0x0000 -0x058A=0x17DC -0x059D=0x0000 -0x0485=0x0000 -0x058E=0x1316 -0x0550=0x79FA -0x0554=0x6901 -0x0593=0x00D8 -0x0553=0x364E -0x0542=0xA2B5 -0x0563=0x4F91 -0x024D=0x0000 -0x055A=0xBE2A -0x0295=0x0000 -0x028A=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x054C=0x7FFF -0x0582=0x150F -0x0109=0x8CC1 -0x04A2=0x0000 -0x0292=0x0000 -0x0583=0x2E45 -0x059F=0x0000 -0x0525=0x57AC -0x0523=0xA6B5 -0x0206=0x0000 -0x051A=0x0906 -0x055C=0x3347 -0x05A6=0x0000 -0x050F=0xEA5F -0x051E=0xF524 -0x050A=0x1316 -0x04C7=0x0000 +0x049C=0x0000 0x049D=0x0000 -0x050C=0xEA50 -0x0087=0x0000 -0x0399=0x0000 -0x0495=0x0000 -0x0246=0x0000 -0x0503=0x00BC -0x0320=0x0000 -0x0323=0x0000 -0x055B=0x57AC -0x0114=0x0110 -0x02E5=0x0000 -0x04E7=0x0000 -0x04D0=0x0000 -0x04E6=0x0000 -0x00AE=0x0000 -0x0544=0x6901 -0x04DE=0x0000 -0x058B=0x0F45 -0x0028=0x0101 -0x029E=0x0000 -0x04DC=0x0000 -0x04D9=0x0000 -0x058F=0x0605 -0x0557=0x4C24 -0x04DB=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x04D4=0x0000 -0x0504=0xF40D -0x02C3=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 0x04C1=0x0000 -0x04D3=0x0000 -0x0590=0xEF99 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 0x05A5=0x0000 -[file_info] -version=1 -type=lms7002m_minimal_config +0x05A6=0x0000 +0x05A7=0x0000 +[reference_clocks] +sxt_ref_clk_mhz=30.72 +sxr_ref_clk_mhz=30.72 diff --git a/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/LimeSDR_above_1p8GHz.ini old mode 100644 new mode 100755 similarity index 79% rename from targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini rename to targets/ARCH/LMSSDR/LimeSDR_above_1p8GHz.ini index f47d3bf433..56ff352737 --- a/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_10MHz_rx19dB_txfull.ini +++ b/targets/ARCH/LMSSDR/LimeSDR_above_1p8GHz.ini @@ -1,1128 +1,1128 @@ -[reference_clocks] -sxr_ref_clk_mhz=30.72 -sxt_ref_clk_mhz=30.72 -[lms7002_registers_b] -0x05A7=0x0000 -0x05A5=0x0000 -0x05A2=0x0000 -0x05A0=0x0000 -0x0599=0x0000 -0x0598=0x0000 -0x0596=0x0000 -0x0594=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x0590=0x0000 -0x058E=0x0000 -0x058C=0x0000 -0x059D=0x0000 -0x058A=0x0000 -0x0589=0x0000 -0x0587=0x0000 -0x0585=0x0000 -0x0595=0x0000 -0x0584=0x0000 -0x059F=0x0000 -0x0583=0x0000 -0x0582=0x0000 -0x0567=0x0000 -0x0566=0x0000 -0x0565=0x0000 -0x0564=0x0000 -0x0563=0x0000 -0x0562=0x0000 -0x055F=0x0000 -0x055D=0x0000 -0x055A=0x0000 -0x058F=0x0000 -0x0557=0x0000 -0x0593=0x0000 -0x0554=0x0000 -0x0552=0x0000 -0x0551=0x0000 -0x0550=0x0000 -0x054D=0x0000 -0x054C=0x0000 -0x0549=0x0000 -0x0547=0x0000 -0x0546=0x0000 -0x0545=0x0000 -0x0544=0x0000 -0x0543=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0541=0x0000 -0x0527=0x0000 -0x0526=0x0000 -0x0524=0x0000 -0x0525=0x0000 -0x0523=0x0000 -0x0521=0x0000 -0x055C=0x0000 -0x051A=0x0000 -0x0519=0x0000 -0x0518=0x0000 -0x0514=0x0000 -0x0513=0x0000 -0x0511=0x0000 -0x05A6=0x0000 -0x051E=0x0000 -0x050F=0x0000 -0x0516=0x0000 -0x050E=0x0000 -0x050C=0x0000 -0x050B=0x0000 -0x050A=0x0000 -0x0509=0x0000 -0x0507=0x0000 -0x0506=0x0000 -0x0503=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x0512=0x0000 -0x04E5=0x0000 -0x04E4=0x0000 -0x0321=0x0000 -0x0320=0x0000 -0x0323=0x0000 -0x031B=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x031F=0x0000 -0x0360=0x0000 -0x0312=0x0000 -0x0310=0x0000 -0x0245=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x0307=0x0000 -0x0282=0x0000 -0x038C=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x0301=0x0000 -0x0309=0x0000 -0x0300=0x0000 -0x044E=0x0000 -0x034F=0x0000 -0x055B=0x0000 -0x0114=0x008D -0x02E5=0x0000 -0x02E4=0x0000 -0x02E1=0x0000 -0x02D5=0x0000 -0x0259=0x0000 -0x0517=0x0000 -0x0481=0x0000 -0x030B=0x0000 -0x0392=0x0000 -0x02DE=0x0000 -0x02DD=0x0000 -0x0297=0x0000 -0x0209=0x0000 -0x0400=0x0081 -0x02D8=0x0000 -0x0104=0x0088 -0x0103=0x0A12 -0x0347=0x0000 -0x0457=0x0000 -0x058D=0x0000 -0x02D7=0x0000 -0x02D1=0x0000 -0x04C8=0x0000 -0x02D3=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x0306=0x0000 -0x04A4=0x0000 -0x044A=0x0000 -0x054B=0x0000 -0x02C7=0x0000 -0x02C1=0x0000 -0x031D=0x0000 -0x0440=0x0020 -0x045E=0x0000 -0x02C4=0x0000 -0x02C2=0x0000 -0x02DB=0x0000 -0x0357=0x0000 -0x0201=0x07FF -0x0483=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x02A1=0x0000 -0x028D=0x0000 -0x02D2=0x0000 -0x039C=0x0000 -0x02A0=0x0000 -0x010E=0x2040 -0x030A=0x0000 -0x029F=0x0000 -0x029C=0x0000 -0x029E=0x0000 -0x011D=0x9555 -0x039E=0x0000 -0x0296=0x0000 -0x0555=0x0000 -0x0349=0x0000 -0x0295=0x0000 -0x010D=0x009E -0x04C4=0x0000 -0x0292=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x020A=0x0080 -0x0102=0x3180 -0x0388=0x0000 -0x0120=0xB9FF -0x0317=0x0000 -0x0244=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x010F=0x3042 -0x0119=0x18CB -0x02A6=0x0000 -0x051F=0x0000 -0x029A=0x0000 -0x049A=0x0000 -0x059E=0x0000 -0x04D7=0x0000 -0x0318=0x0000 -0x02A7=0x0000 -0x0200=0x0081 -0x02C5=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x05DC -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xAD41 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x0540=0x0000 -0x02A4=0x0000 -0x0485=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 -0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0x0000 -0x039D=0x0000 -0x011F=0x3680 -0x030C=0x0000 -0x04DF=0x0000 -0x0281=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D4=0x0000 -0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0100=0x3409 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x024D=0x0000 -0x0202=0x07FF -0x0383=0x0000 -0x054A=0x0000 -0x0401=0x07FF -0x0206=0x0000 -0x0124=0x0000 -0x0341=0x0000 -0x0287=0x0000 -0x0501=0x0000 -0x034C=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x051B=0x0000 -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x0121=0x356A -0x0115=0x0009 -0x0112=0xC0E6 -0x039A=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x04A0=0x0000 -0x0108=0x9442 -0x020B=0x4000 -0x0251=0x0000 -0x0488=0x0000 -0x0241=0x0000 -0x038F=0x0000 -0x02DC=0x0000 -0x024C=0x0000 -0x0494=0x0000 -0x051D=0x0000 -0x0243=0x0000 -0x0556=0x0000 -0x040A=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x0261=0x0000 -0x024A=0x0000 -0x0285=0x0000 -0x0280=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x024F=0x0000 -0x0253=0x0000 -0x0255=0x0000 -0x0502=0x0000 -0x0258=0x0000 -0x0298=0x0000 -0x05A3=0x0000 -0x0367=0x0000 -0x0240=0x0020 -0x0256=0x0000 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x025B=0x0000 -0x020C=0x7FFF -0x0205=0x0000 -0x0361=0x0000 -0x0515=0x0000 -0x025C=0x0000 -0x0355=0x0000 -0x044C=0x0000 -0x010C=0x88FD -0x0284=0x0000 -0x0396=0x0000 -0x0286=0x0000 -0x028F=0x0000 -0x031C=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x0289=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x040C=0x0000 -0x028B=0x0000 -0x0450=0x0000 -0x0352=0x0000 -0x028C=0x0000 -0x04C2=0x0000 -0x025E=0x0000 -0x04DA=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0561=0x0000 -0x0344=0x0000 -0x0586=0x0000 -0x0484=0x0000 -0x0345=0x0000 -0x0505=0x0000 -0x035B=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E02 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x0351=0x0000 -0x0353=0x0000 -0x050D=0x0000 -0x02CD=0x0000 -0x0490=0x0000 -0x0354=0x0000 -0x0348=0x0000 -0x0498=0x0000 -0x0356=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x040E=0x0000 -0x0522=0x0000 -0x049F=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0449=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x0597=0x0000 -0x035F=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0381=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x054F=0x0000 -0x0389=0x0000 -0x04E3=0x0000 -0x040F=0x0000 -0x0386=0x0000 -0x054E=0x0000 -0x02D0=0x0000 -0x03A0=0x0000 -0x0387=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x0395=0x0000 -0x038D=0x0000 -0x02E7=0x0000 -0x0324=0x0000 -0x038E=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0459=0x0000 -0x0394=0x0000 -0x0123=0x267B -0x0497=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x0399=0x0000 -0x039B=0x0000 -0x0248=0x0000 -0x039F=0x0000 -0x049E=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x0520=0x0000 -0x03A7=0x0000 -0x055E=0x0000 -0x0402=0x07FF -0x0403=0x0000 -0x04D8=0x0000 -0x0560=0x0000 -0x0404=0x0000 -0x0254=0x0000 -0x0405=0x0000 -0x0407=0x0000 -0x0580=0x0000 -0x0409=0x0000 -0x040B=0x7FFF -0x040D=0x0000 -0x0441=0x0000 -0x0508=0x0000 -0x0443=0x0000 -0x0444=0x0000 -0x04CA=0x0000 -0x0446=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x044B=0x0000 -0x02E2=0x0000 -0x044D=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x0453=0x0000 -0x0559=0x0000 -0x0456=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x0480=0x0000 -0x045F=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0358=0x0000 -0x048B=0x0000 -0x048C=0x0000 -0x0283=0x0000 -0x048E=0x0000 -0x029B=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x0493=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x02C0=0x0000 -0x0499=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x049C=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x0109=0x61C1 -0x04A2=0x0000 -0x04A5=0x0000 -0x04A6=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x031E=0x0000 -0x04C0=0x0000 -0x02CA=0x0000 -0x04C9=0x0000 -0x02C3=0x0000 -0x04C1=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x02A5=0x0000 -0x04CC=0x0000 -0x04CE=0x0000 -0x025F=0x0000 -0x04CF=0x0000 -0x04D0=0x0000 -0x0548=0x0000 -0x04D2=0x0000 -0x04D3=0x0000 -0x0504=0x0000 -0x04D4=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x04D9=0x0000 -0x04DB=0x0000 -0x04DC=0x0000 -0x058B=0x0000 -0x04DE=0x0000 -0x04E0=0x0000 -0x02A2=0x0000 -0x03A1=0x0000 -0x04E1=0x0000 -[lms7002_registers_a] -0x05A7=0x0000 -0x05A5=0x0000 -0x05A2=0x0000 -0x0599=0x0000 -0x0598=0xF61D -0x0596=0x0A94 -0x0594=0xF40D -0x0592=0x0DF1 -0x0591=0xFCFE -0x0590=0xEF99 -0x058E=0x1316 -0x058C=0xEA50 -0x059D=0x0000 -0x058A=0x17DC -0x0585=0xDAA2 -0x0595=0x00BC -0x0584=0xE7E2 -0x059F=0x0000 -0x0583=0x2E45 -0x0582=0x150F -0x0567=0x4049 -0x0566=0x0906 -0x0565=0xB77F -0x0563=0x4F91 -0x055F=0x5852 -0x055D=0xA6B5 -0x055A=0xBE2A -0x058F=0x0605 -0x0557=0x4C24 -0x0593=0x00D8 -0x0554=0x6901 -0x0552=0x8D44 -0x0551=0xD7B7 -0x0550=0x79FA -0x054C=0x7FFF -0x0549=0x18C9 -0x0547=0xD7B7 -0x0546=0x8D44 -0x0545=0x364E -0x0544=0x6901 -0x0543=0xBD96 -0x0553=0x364E -0x0542=0xA2B5 -0x0541=0x4C24 -0x0527=0xACB9 -0x0526=0xBE2A -0x0525=0x57AC -0x0523=0xA6B5 -0x0521=0x5852 -0x055C=0x3347 -0x051A=0x0906 -0x0518=0xEFF2 -0x0514=0xE7E2 -0x0513=0xDAA2 -0x0511=0x1D10 -0x05A6=0x0000 -0x051E=0xF524 -0x050F=0xEA5F -0x0516=0x150F -0x050E=0x17DC -0x050C=0xEA50 -0x050B=0xF5EF -0x050A=0x1316 -0x0509=0x0605 -0x0507=0xFCFE -0x0506=0x0DF1 -0x0503=0x00BC -0x04E7=0x0000 -0x04E6=0x0000 -0x04E4=0x0000 -0x04E0=0x0000 -0x058B=0x0F45 -0x04DE=0x0000 -0x04DC=0x0000 -0x04DB=0x0000 -0x04D9=0x0000 -0x04D8=0x0000 -0x059E=0x0000 -0x04D7=0x0000 -0x0504=0xF40D -0x04D4=0x0000 -0x04D3=0x0000 -0x0548=0x79FA -0x04D2=0x0000 -0x04D1=0x0000 -0x04D0=0x0000 -0x04CE=0x0000 -0x04C8=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x04C4=0x0000 -0x04C2=0x0000 -0x04A7=0x0000 -0x04A6=0x0000 -0x04A5=0x0000 -0x04A1=0x0000 -0x04A0=0x0000 -0x0522=0xDB10 -0x049F=0x0000 -0x049E=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x049B=0x0000 -0x049A=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x0494=0x0000 -0x02D3=0x0000 -0x02D1=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x0096=0x0000 -0x04C1=0x0000 -0x02C3=0x0000 -0x02C4=0x0000 -0x02C2=0x0000 -0x0499=0x0000 -0x02C0=0x0000 -0x0201=0x07FF -0x0483=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x008B=0x2756 -0x02A1=0x0000 -0x028D=0x0000 -0x029C=0x0000 -0x029E=0x0000 -0x0297=0x0000 -0x0296=0x0000 -0x0555=0xBD96 -0x0349=0x0000 -0x010D=0x015C -0x02CF=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x0021=0x0E9F -0x0450=0x0000 -0x0558=0x5009 -0x02C6=0x0000 -0x0101=0x7800 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x0121=0x3652 -0x0285=0x0000 -0x0280=0x0000 -0x0319=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x025D=0x0000 -0x030F=0x0000 -0x0406=0x0000 -0x02C5=0x0000 -0x0200=0x0301 -0x0281=0x0000 -0x04A2=0x0000 -0x0109=0x8CC1 -0x0355=0x0000 -0x044C=0x0000 -0x025B=0x0000 -0x0298=0x0000 -0x0502=0x0A94 -0x0258=0x0000 -0x0255=0x0000 -0x04D6=0x0000 -0x0257=0x0000 -0x0252=0x0000 -0x0204=0xC016 -0x024F=0x0000 -0x04CC=0x0000 -0x02A5=0x0000 -0x0497=0x0000 -0x0123=0x067B -0x0495=0x0000 -0x0246=0x0000 -0x051D=0x4F91 -0x0243=0x0000 -0x0556=0xA2B5 -0x040A=0x1000 -0x025A=0x0000 -0x0242=0x0000 -0x020C=0x8000 -0x0251=0x0000 -0x02DD=0x0000 -0x0020=0xFFFD -0x0488=0x0000 -0x020A=0x0080 -0x0102=0x3180 -0x04C6=0x0000 -0x0207=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0206=0x0000 -0x00A3=0x6565 -0x02E2=0x0000 -0x044D=0x0000 -0x0292=0x0000 -0x002A=0x0086 -0x0245=0x0000 -0x0581=0xC89D -0x045D=0x0000 -0x024D=0x0000 -0x002B=0x4032 -0x02A0=0x0000 -0x010E=0x0285 -0x0286=0x0000 -0x009E=0x658C -0x0088=0x04F0 -0x0085=0x0001 -0x0295=0x0000 -0x0089=0x0048 -0x0256=0x0000 -0x0093=0x0000 -0x0092=0x0001 -0x031B=0x0000 -0x0111=0x0099 -0x0095=0x0000 -0x02A7=0x0000 -0x0203=0x2F99 -0x030E=0x0000 -0x0482=0x0000 -0x05A0=0x0000 -0x009C=0x658C -0x0381=0x0000 -0x0122=0x033F -0x0110=0x0BFF -0x0100=0xB409 -0x0028=0x0101 -0x0026=0x0101 -0x0524=0x3347 -0x009D=0x6565 -0x0294=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0xF61D -0x039D=0x0000 -0x011F=0x3680 -0x0395=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0247=0x0000 -0x0512=0x196B -0x04E5=0x0000 -0x0024=0x50D8 -0x0353=0x0000 -0x050D=0x0F45 -0x02CD=0x0000 -0x0490=0x0000 -0x0501=0xFDFB -0x034C=0x0000 -0x00AA=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x008A=0x0491 -0x0453=0x0000 -0x0124=0x0000 -0x0260=0x0000 -0x00A1=0x6565 -0x0356=0x0000 -0x0241=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x002C=0x0000 -0x038F=0x0000 -0x008C=0x267B -0x0459=0x0000 -0x0394=0x0000 -0x054D=0xF7A3 -0x00A6=0x0001 -0x002D=0xFFFF -0x00AC=0x2000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x40F8 -0x0099=0x6565 -0x0310=0x0000 -0x00A2=0x6565 -0x0589=0xEA5F -0x002F=0x3840 -0x0597=0xFDFB -0x035F=0x0000 -0x0562=0xF524 -0x0025=0x0101 -0x011C=0xAD41 -0x011D=0x2AAA -0x039E=0x0000 -0x0289=0x0000 -0x0282=0x0000 -0x0307=0x0000 -0x038C=0x0000 -0x0087=0x0000 -0x0399=0x0000 -0x054B=0xF7A3 -0x02C7=0x0000 -0x0519=0x4049 -0x009F=0x658C -0x0515=0x2E45 -0x025C=0x0000 -0x00A5=0x6565 -0x0301=0x0000 -0x02C1=0x0000 -0x0259=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x0517=0xC89D -0x0481=0x0000 -0x00A8=0x0000 -0x02D2=0x0000 -0x039C=0x0000 -0x0564=0x0000 -0x00AB=0x0040 -0x0261=0x0000 -0x002E=0x0000 -0x02DE=0x0000 -0x0540=0x5009 -0x02A4=0x0000 -0x0485=0x0000 -0x0489=0x0000 -0x00AD=0x03FF -0x024A=0x0000 -0x0029=0x0101 -0x0097=0x0000 -0x011E=0x061D -0x00AE=0x0000 -0x00A7=0x6565 -0x020B=0x4000 -0x0098=0x0000 -0x0108=0xFC26 -0x0027=0x05E4 -0x0117=0x100C -0x0383=0x0000 -0x0202=0x0794 -0x054A=0x8184 -0x00A4=0x6565 -0x0401=0x07FF -0x0086=0x4101 -0x010C=0x8865 -0x02D8=0x0000 -0x0347=0x0000 -0x0457=0x0000 -0x0103=0x0A12 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0101 -0x009B=0x6565 -0x0105=0x0007 -0x05A3=0x0000 -0x0240=0x0028 -0x0367=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x0284=0x0000 -0x0396=0x0000 -0x051F=0xAB08 -0x029A=0x0000 -0x0361=0x0000 -0x0205=0x0000 -0x0119=0x18DF -0x02A6=0x0000 -0x010F=0x3042 -0x04C0=0x0000 -0x031E=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x0587=0x1D10 -0x0023=0x5550 -0x048C=0x0000 -0x0112=0x3171 -0x039A=0x0000 -0x0320=0x0000 -0x0323=0x0000 -0x0115=0x0009 -0x00A9=0x8000 -0x0244=0x0000 -0x0094=0x0000 -0x0317=0x0000 -0x0208=0x0170 -0x0340=0x0000 -0x058D=0xF5EF -0x02D7=0x0000 -0x04A3=0x0000 -0x029D=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x04C9=0x0000 -0x02CA=0x0000 -0x0209=0x0000 -0x0082=0x8001 -0x0107=0x318C -0x02D4=0x0000 -0x02CE=0x0000 -0x02D9=0x0000 -0x02E4=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x0118=0x018C -0x02E0=0x0000 -0x055B=0x57AC -0x0114=0x0110 -0x02E5=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x034F=0x0000 -0x0300=0x0000 -0x044E=0x0000 -0x0510=0xE6C7 -0x0302=0x0000 -0x0303=0x0000 -0x04D5=0x0000 -0x0304=0x0000 -0x0306=0x0000 -0x04A4=0x0000 -0x044A=0x0000 -0x049C=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x0588=0xE6C7 -0x0308=0x0000 -0x048A=0x0000 -0x0309=0x0000 -0x029F=0x0000 -0x030A=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x04DF=0x0000 -0x030C=0x0000 -0x02D6=0x0000 -0x0311=0x0000 -0x024E=0x0000 -0x0346=0x0000 -0x0312=0x0000 -0x051B=0xB77F -0x010A=0x104C -0x0461=0x0000 -0x0313=0x0000 -0x0360=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x040E=0x0003 -0x030D=0x0000 -0x0316=0x0000 -0x031F=0x0000 -0x0318=0x0000 -0x0287=0x0000 -0x0341=0x0000 -0x028F=0x0000 -0x031C=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x031D=0x0000 -0x0440=0x0024 -0x045E=0x0000 -0x0321=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0561=0xAB08 -0x0344=0x0000 -0x0586=0x196B -0x0484=0x0000 -0x0345=0x0000 -0x0505=0x00D8 -0x035B=0x0000 -0x0498=0x0000 -0x0084=0x0400 -0x0348=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E14 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0351=0x0000 -0x0354=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0449=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x038A=0x0000 -0x0362=0x0000 -0x0081=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x054F=0x18C9 -0x0389=0x0000 -0x04E3=0x0000 -0x040F=0x43E4 -0x0386=0x0000 -0x054E=0x8184 -0x009A=0x658C -0x02D0=0x0000 -0x03A0=0x0000 -0x0387=0x0000 -0x038D=0x0000 -0x02E7=0x0000 -0x0324=0x0000 -0x038E=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x039B=0x0000 -0x0248=0x0000 -0x039F=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x03A1=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x0520=0x174B -0x03A7=0x0000 -0x055E=0xDB10 -0x0402=0x07D9 -0x0403=0x0013 -0x0560=0x174B -0x00A0=0x6565 -0x0404=0x0000 -0x0254=0x0000 -0x0405=0x0000 -0x0407=0x0000 -0x0580=0xEFF2 -0x0409=0x0000 -0x040B=0x000F -0x040D=0x0000 -0x0441=0x0000 -0x0508=0xEF99 -0x0443=0x0000 -0x0444=0x0000 -0x04CA=0x0000 -0x0446=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x044B=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x0559=0xACB9 -0x0456=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x0480=0x0000 -0x045F=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0283=0x0000 -0x0022=0x07FF -0x048E=0x0000 -0x029B=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x0493=0x0000 -[file_info] -version=1 -type=lms7002m_minimal_config +[file_info] +type=lms7002m_minimal_config +version=1 +[lms7002_registers_a] +0x0020=0xFFFD +0x0021=0x0E9F +0x0022=0x07FF +0x0023=0x5550 +0x0024=0xB1E4 +0x0025=0x0101 +0x0026=0x0101 +0x0027=0xB1E4 +0x0028=0x0101 +0x0029=0x0101 +0x002A=0x0086 +0x002B=0x0038 +0x002C=0x0000 +0x002D=0x0000 +0x002E=0x0000 +0x002F=0x3840 +0x0081=0x0000 +0x0082=0x8003 +0x0084=0x0400 +0x0085=0x0001 +0x0086=0x4101 +0x0087=0x0000 +0x0088=0x04B0 +0x0089=0x1090 +0x008A=0x0514 +0x008B=0x2102 +0x008C=0x267B +0x0092=0x0001 +0x0093=0x0000 +0x0094=0x0000 +0x0095=0x0000 +0x0096=0x0000 +0x0097=0x0000 +0x0098=0x0000 +0x0099=0x6565 +0x009A=0x658C +0x009B=0x6565 +0x009C=0x658C +0x009D=0x6565 +0x009E=0x658C +0x009F=0x658C +0x00A0=0x6565 +0x00A1=0x6565 +0x00A2=0x6565 +0x00A3=0x6565 +0x00A4=0x6565 +0x00A5=0x6565 +0x00A6=0x000F +0x00A7=0x6565 +0x00A8=0x0000 +0x00A9=0x0000 +0x00AA=0x0000 +0x00AB=0x0040 +0x00AC=0x0000 +0x00AD=0x03FF +0x00AE=0x0000 +0x0100=0x3409 +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0612 +0x0104=0x0088 +0x0105=0x0011 +0x0106=0x318C +0x0107=0x318C +0x0108=0x2826 +0x0109=0x6104 +0x010A=0x17BD +0x010C=0x8865 +0x010D=0x015A +0x010E=0x0000 +0x010F=0x3042 +0x0110=0x0BFF +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x0303 +0x0114=0x00D0 +0x0115=0x0009 +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x528C +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0x2000 +0x011E=0x06E4 +0x011F=0x3640 +0x0120=0xB9FF +0x0121=0x341C +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0081 +0x0201=0x07FF +0x0202=0x07FF +0x0203=0x0000 +0x0204=0x0000 +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0170 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x8000 +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x8081 +0x0401=0x07FF +0x0402=0x07FF +0x0403=0x0000 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0003 +0x040B=0x000F +0x040C=0x00F8 +0x040D=0x0000 +0x040E=0x0000 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x2B55 +0x0443=0x5540 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[lms7002_registers_b] +0x0100=0x340F +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0612 +0x0104=0x0088 +0x0105=0x001F +0x0106=0x3182 +0x0107=0x318C +0x0108=0x9442 +0x0109=0x61C1 +0x010A=0x104C +0x010C=0x88FF +0x010D=0x001E +0x010E=0x2040 +0x010F=0x3042 +0x0110=0x0BF4 +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x03C3 +0x0114=0x00D0 +0x0115=0x000F +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x5280 +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0x1555 +0x011E=0x0747 +0x011F=0x3640 +0x0120=0xB9FF +0x0121=0x360C +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0101 +0x0201=0x07FF +0x0202=0x07FF +0x0203=0x0000 +0x0204=0x0000 +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x01F0 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x7FFF +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x0105 +0x0401=0x07FF +0x0402=0x07FF +0x0403=0x0000 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0000 +0x040B=0x7FFF +0x040C=0x00FF +0x040D=0x0000 +0x040E=0x0002 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x0000 +0x0443=0x0000 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[reference_clocks] +sxt_ref_clk_mhz=30.72 +sxr_ref_clk_mhz=30.72 diff --git a/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/LimeSDR_above_1p8GHz_1v4.ini old mode 100644 new mode 100755 similarity index 79% rename from targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini rename to targets/ARCH/LMSSDR/LimeSDR_above_1p8GHz_1v4.ini index a3c1aa2e6f..9503891fb9 --- a/targets/ARCH/LMSSDR/enb_sodera_highband_5MHz_rx19dB_txfull.ini +++ b/targets/ARCH/LMSSDR/LimeSDR_above_1p8GHz_1v4.ini @@ -1,1128 +1,1128 @@ -[reference_clocks] -sxr_ref_clk_mhz=30.72 -sxt_ref_clk_mhz=30.72 -[lms7002_registers_b] -0x03A0=0x0000 -0x054E=0x0000 -0x02D0=0x0000 -0x0386=0x0000 -0x054F=0x0000 -0x0389=0x0000 -0x040F=0x0000 -0x04E3=0x0000 -0x0385=0x0000 -0x0315=0x0000 -0x0384=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0381=0x0000 -0x0366=0x0000 -0x0365=0x0000 -0x0364=0x0000 -0x0325=0x0000 -0x035E=0x0000 -0x035D=0x0000 -0x0442=0x0000 -0x0452=0x0000 -0x0299=0x0000 -0x0359=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x040E=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x0356=0x0000 -0x0348=0x0000 -0x0498=0x0000 -0x0490=0x0000 -0x02CD=0x0000 -0x050D=0x0000 -0x0353=0x0000 -0x0351=0x0000 -0x048F=0x0000 -0x0445=0x0000 -0x0350=0x0000 -0x03A6=0x0000 -0x0293=0x0000 -0x034E=0x0000 -0x035C=0x0000 -0x034D=0x0000 -0x034B=0x0000 -0x011A=0x2E02 -0x0455=0x0000 -0x034A=0x0000 -0x035B=0x0000 -0x0505=0x0000 -0x0345=0x0000 -0x035F=0x0000 -0x0597=0x0000 -0x0586=0x0000 -0x0484=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0561=0x0000 -0x0344=0x0000 -0x0343=0x0000 -0x0342=0x0000 -0x0380=0x0000 -0x0327=0x0000 -0x025E=0x0000 -0x04DA=0x0000 -0x04C2=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x0289=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x0396=0x0000 -0x0284=0x0000 -0x010C=0x88FD -0x044C=0x0000 -0x0355=0x0000 -0x025C=0x0000 -0x0515=0x0000 -0x0361=0x0000 -0x0205=0x0000 -0x025B=0x0000 -0x04C5=0x0000 -0x04E2=0x0000 -0x025A=0x0000 -0x0256=0x0000 -0x0240=0x0020 -0x0367=0x0000 -0x05A3=0x0000 -0x0502=0x0000 -0x0258=0x0000 -0x0255=0x0000 -0x040C=0x0000 -0x028B=0x0000 -0x0253=0x0000 -0x024E=0x0000 -0x0346=0x0000 -0x0280=0x0000 -0x0285=0x0000 -0x024A=0x0000 -0x0261=0x0000 -0x0249=0x0000 -0x04CD=0x0000 -0x040A=0x0000 -0x0556=0x0000 -0x0243=0x0000 -0x051D=0x0000 -0x0494=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x038F=0x0000 -0x0241=0x0000 -0x0488=0x0000 -0x0251=0x0000 -0x020B=0x4000 -0x0108=0x9442 -0x04A0=0x0000 -0x0116=0x8180 -0x02CC=0x0000 -0x039A=0x0000 -0x0112=0xC0E6 -0x0307=0x0000 -0x038C=0x0000 -0x0282=0x0000 -0x0321=0x0000 -0x0507=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x02E1=0x0000 -0x0517=0x0000 -0x0481=0x0000 -0x02D5=0x0000 -0x0259=0x0000 -0x0527=0x0000 -0x02DD=0x0000 -0x0209=0x0000 -0x0297=0x0000 -0x0400=0x0081 -0x0104=0x0088 -0x0103=0x0A12 -0x0347=0x0000 -0x02D8=0x0000 -0x0457=0x0000 -0x0306=0x0000 -0x02D1=0x0000 -0x04C8=0x0000 -0x0546=0x0000 -0x0440=0x0020 -0x045E=0x0000 -0x031D=0x0000 -0x039C=0x0000 -0x02D2=0x0000 -0x010E=0x2040 -0x02A0=0x0000 -0x0544=0x0000 -0x029C=0x0000 -0x055A=0x0000 -0x0295=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x020A=0x0080 -0x0102=0x3180 -0x0120=0xB9FF -0x0388=0x0000 -0x0318=0x0000 -0x02A7=0x0000 -0x0200=0x0081 -0x0594=0x0000 -0x02C5=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x0395=0x0000 -0x058D=0x0000 -0x02D7=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x039B=0x0000 -0x049E=0x0000 -0x02DB=0x0000 -0x0357=0x0000 -0x02C2=0x0000 -0x0514=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x0493=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x0397=0x0000 -0x02E3=0x0000 -0x049C=0x0000 -0x040D=0x0000 -0x0281=0x0000 -0x048C=0x0000 -0x049A=0x0000 -0x0119=0x18CB -0x010F=0x3042 -0x02A6=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 -0x0324=0x0000 -0x038E=0x0000 -0x02E7=0x0000 -0x034F=0x0000 -0x04E0=0x0000 -0x0123=0x267B -0x0497=0x0000 -0x0459=0x0000 -0x0394=0x0000 -0x04A5=0x0000 -0x04D9=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x0508=0x0000 -0x0443=0x0000 -0x0301=0x0000 -0x0548=0x0000 -0x04D2=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x029A=0x0000 -0x051F=0x0000 -0x0309=0x0000 -0x0585=0x0000 -0x03A5=0x0000 -0x02D3=0x0000 -0x0451=0x0000 -0x0390=0x0000 -0x0562=0x0000 -0x02C4=0x0000 -0x029E=0x0000 -0x031E=0x0000 -0x04C0=0x0000 -0x04DC=0x0000 -0x04DE=0x0000 -0x058B=0x0000 -0x04DB=0x0000 -0x04D0=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x054B=0x0000 -0x02C7=0x0000 -0x05A0=0x0000 -0x044B=0x0000 -0x0100=0x3409 -0x04CA=0x0000 -0x0446=0x0000 -0x02E4=0x0000 -0x04E4=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x04D4=0x0000 -0x0504=0x0000 -0x04CE=0x0000 -0x02DE=0x0000 -0x0399=0x0000 -0x050C=0x0000 -0x02A5=0x0000 -0x04CC=0x0000 -0x03A1=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x040B=0x7FFF -0x0283=0x0000 -0x048E=0x0000 -0x0580=0x0000 -0x0409=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0589=0x0000 -0x038D=0x0000 -0x0487=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0567=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0254=0x0000 -0x0405=0x0000 -0x0387=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0360=0x0000 -0x0559=0x0000 -0x0456=0x0000 -0x0453=0x0000 -0x02E2=0x0000 -0x044D=0x0000 -0x0441=0x0000 -0x02C3=0x0000 -0x04C1=0x0000 -0x04D3=0x0000 -0x0444=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0296=0x0000 -0x0555=0x0000 -0x0349=0x0000 -0x0109=0x61C1 -0x04A2=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x048D=0x0000 -0x059A=0x0000 -0x0407=0x0000 -0x02C0=0x0000 -0x0499=0x0000 -0x0543=0x0000 -0x04C9=0x0000 -0x02CA=0x0000 -0x0404=0x0000 -0x0560=0x0000 -0x02C1=0x0000 -0x04D8=0x0000 -0x0403=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x04C4=0x0000 -0x010D=0x009E -0x0402=0x07FF -0x055E=0x0000 -0x03A7=0x0000 -0x0520=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x0300=0x0000 -0x0587=0x0000 -0x044E=0x0000 -0x055B=0x0000 -0x02E5=0x0000 -0x0114=0x008D -0x0323=0x0000 -0x0320=0x0000 -0x0503=0x0000 -0x0513=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x0549=0x0000 -0x0552=0x0000 -0x0509=0x0000 -0x0521=0x0000 -0x0286=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x058F=0x0000 -0x0557=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x049F=0x0000 -0x0522=0x0000 -0x0545=0x0000 -0x0551=0x0000 -0x0312=0x0000 -0x055D=0x0000 -0x0298=0x0000 -0x055F=0x0000 -0x011D=0xAAAA -0x039E=0x0000 -0x0547=0x0000 -0x0598=0x0000 -0x0449=0x0000 -0x0564=0x0000 -0x0242=0x0000 -0x0525=0x0000 -0x0523=0x0000 -0x0565=0x0000 -0x0124=0x0000 -0x0563=0x0000 -0x024D=0x0000 -0x05A5=0x0000 -0x0566=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x054C=0x0000 -0x0582=0x0000 -0x0599=0x0000 -0x0511=0x0000 -0x0506=0x0000 -0x0595=0x0000 -0x0584=0x0000 -0x058C=0x0000 -0x05A6=0x0000 -0x051E=0x0000 -0x050F=0x0000 -0x0590=0x0000 -0x0596=0x0000 -0x05A7=0x0000 -0x058A=0x0000 -0x059D=0x0000 -0x0485=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x0245=0x0000 -0x0310=0x0000 -0x058E=0x0000 -0x05A2=0x0000 -0x054D=0x0000 -0x020C=0x7FFF -0x031F=0x0000 -0x0292=0x0000 -0x059F=0x0000 -0x0583=0x0000 -0x0317=0x0000 -0x0244=0x0000 -0x0554=0x0000 -0x0593=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0519=0x0000 -0x024F=0x0000 -0x0524=0x0000 -0x0518=0x0000 -0x0354=0x0000 -0x0526=0x0000 -0x031B=0x0000 -0x050E=0x0000 -0x0516=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x031C=0x0000 -0x028F=0x0000 -0x051A=0x0000 -0x055C=0x0000 -0x050A=0x0000 -0x050B=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x04E5=0x0000 -0x0512=0x0000 -0x0206=0x0000 -0x0550=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0541=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x0AA7 -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xA941 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x02A4=0x0000 -0x0540=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 -0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x039D=0x0000 -0x0500=0x0000 -0x0450=0x0000 -0x011F=0x3600 -0x030C=0x0000 -0x04DF=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D4=0x0000 -0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0383=0x0000 -0x0202=0x07FF -0x054A=0x0000 -0x0401=0x07FF -0x0341=0x0000 -0x0287=0x0000 -0x034C=0x0000 -0x0501=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x051B=0x0000 -0x0121=0x31FA -0x0115=0x0009 -[lms7002_registers_a] -0x0107=0x318C -0x02D4=0x0000 -0x0082=0x8001 -0x0209=0x0000 -0x02CA=0x0000 -0x04C9=0x0000 -0x0120=0xB9FF -0x0388=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x0208=0x0170 -0x0340=0x0000 -0x0094=0x0000 -0x0244=0x0000 -0x0317=0x0000 -0x00A9=0x8000 -0x0115=0x0009 -0x039A=0x0000 -0x0112=0x3171 -0x048C=0x0000 -0x0023=0x5550 -0x0587=0x1D10 -0x04C0=0x0000 -0x031E=0x0000 -0x0205=0x0000 -0x0361=0x0000 -0x051F=0xAB08 -0x029A=0x0000 -0x0396=0x0000 -0x0284=0x0000 -0x02CE=0x0000 -0x02D9=0x0000 -0x038B=0x0000 -0x044F=0x0000 -0x0367=0x0000 -0x0240=0x0028 -0x05A3=0x0000 -0x0105=0x0007 -0x009B=0x6565 -0x0400=0x0101 -0x02DB=0x0000 -0x0357=0x0000 -0x0104=0x0088 -0x0103=0x0612 -0x0457=0x0000 -0x0347=0x0000 -0x02D8=0x0000 -0x010C=0x8865 -0x0086=0x4101 -0x0202=0x0794 -0x0383=0x0000 -0x020B=0x4000 -0x0108=0xFC26 -0x0098=0x0000 -0x0117=0x100C -0x0027=0x05E4 -0x00A7=0x6565 -0x024A=0x0000 -0x0029=0x0101 -0x00AD=0x03FF -0x0540=0x5009 -0x02A4=0x0000 -0x02DE=0x0000 -0x002E=0x0000 -0x0261=0x0000 -0x00AB=0x0040 -0x0564=0x0000 -0x00A8=0x0000 -0x0517=0xC89D -0x0481=0x0000 -0x02C1=0x0000 -0x0301=0x0000 -0x00A5=0x6565 -0x0515=0x2E45 -0x025C=0x0000 -0x009F=0x658C -0x0519=0x4049 -0x054B=0xF7A3 -0x02C7=0x0000 -0x038C=0x0000 -0x0307=0x0000 -0x0282=0x0000 -0x0289=0x0000 -0x011C=0xA941 -0x0562=0xF524 -0x0025=0x0101 -0x02CC=0x0000 -0x0116=0x8180 -0x0597=0xFDFB -0x035F=0x0000 -0x002F=0x3840 -0x0589=0xEA5F -0x00A2=0x6565 -0x0099=0x6565 -0x0310=0x0000 -0x040C=0x40F8 -0x028B=0x0000 -0x0253=0x0000 -0x00AC=0x2000 -0x002D=0xFFFF -0x00A6=0x0001 -0x054D=0xF7A3 -0x002C=0x0000 -0x0249=0x0000 -0x04CD=0x0000 -0x0401=0x07FF -0x00A4=0x6565 -0x054A=0x8184 -0x038F=0x0000 -0x008C=0x267B -0x0241=0x0000 -0x0356=0x0000 -0x00A1=0x6565 -0x0260=0x0000 -0x0453=0x0000 -0x008A=0x0491 -0x048F=0x0000 -0x0445=0x0000 -0x0350=0x0000 -0x00AA=0x0000 -0x034C=0x0000 -0x0501=0xFDFB -0x0490=0x0000 -0x02CD=0x0000 -0x050D=0x0F45 -0x0353=0x0000 -0x0024=0x50D8 -0x04E5=0x0000 -0x0512=0x196B -0x0247=0x0000 -0x045C=0x0000 -0x024B=0x0000 -0x0395=0x0000 -0x011F=0x3600 -0x039D=0x0000 -0x0500=0xF61D -0x02C9=0x0000 -0x05A1=0x0000 -0x02A6=0x0000 -0x0119=0x18DF -0x010F=0x3042 -0x04CB=0x0000 -0x0391=0x0000 -0x0113=0x03C3 -0x0326=0x0000 -0x028E=0x0000 -0x0106=0x3182 -0x0524=0x3347 -0x009D=0x6565 -0x0294=0x0000 -0x0026=0x0101 -0x0110=0x0BFF -0x0122=0x033F -0x0381=0x0000 -0x009C=0x658C -0x05A0=0x0000 -0x0482=0x0000 -0x030E=0x0000 -0x0203=0x2F99 -0x0095=0x0000 -0x0111=0x0099 -0x0256=0x0000 -0x0089=0x00A0 -0x0085=0x0001 -0x0088=0x0530 -0x0459=0x0000 -0x0394=0x0000 -0x010E=0x0285 -0x02A0=0x0000 -0x002B=0x4038 -0x039C=0x0000 -0x02D2=0x0000 -0x0581=0xC89D -0x045D=0x0000 -0x0245=0x0000 -0x002A=0x0086 -0x0118=0x018C -0x02E0=0x0000 -0x0489=0x0000 -0x04A7=0x0000 -0x039E=0x0000 -0x011D=0xAAAA -0x02E1=0x0000 -0x0259=0x0000 -0x02D5=0x0000 -0x051D=0x4F91 -0x0243=0x0000 -0x0556=0xA2B5 -0x040A=0x1000 -0x05A2=0x0000 -0x020C=0x8000 -0x020A=0x0080 -0x0102=0x3180 -0x034F=0x0000 -0x0303=0x0000 -0x0306=0x0000 -0x0255=0x0000 -0x0300=0x0000 -0x044E=0x0000 -0x0309=0x0000 -0x0585=0xDAA2 -0x0527=0xACB9 -0x044A=0x0000 -0x04A4=0x0000 -0x048A=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x05A7=0x0000 -0x0252=0x0000 -0x0204=0xC016 -0x0308=0x0000 -0x0588=0xE6C7 -0x0321=0x0000 -0x0507=0xFCFE -0x0312=0x0000 -0x050B=0xF5EF -0x0360=0x0000 -0x0021=0x0E9F -0x04C2=0x0000 -0x030D=0x0000 -0x040E=0x0003 -0x0316=0x0000 -0x031F=0x0000 -0x030C=0x0000 -0x04DF=0x0000 -0x0318=0x0000 -0x0250=0x0000 -0x02CB=0x0000 -0x045E=0x0000 -0x0440=0x0024 -0x031D=0x0000 -0x058D=0xF5EF -0x02D7=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0566=0x0906 -0x0345=0x0000 -0x049C=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x035B=0x0000 -0x0505=0x00D8 -0x028D=0x0000 -0x02A1=0x0000 -0x028F=0x0000 -0x031C=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x0596=0x0A94 -0x0354=0x0000 -0x0518=0xEFF2 -0x035C=0x0000 -0x034D=0x0000 -0x0344=0x0000 -0x0561=0xAB08 -0x0096=0x0000 -0x010D=0x00DE -0x04C4=0x0000 -0x0351=0x0000 -0x0311=0x0000 -0x02D6=0x0000 -0x02D1=0x0000 -0x0546=0x8D44 -0x04C8=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0522=0xDB10 -0x049F=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x0359=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x0341=0x0000 -0x0287=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0580=0xEFF2 -0x0409=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x0514=0xE7E2 -0x039B=0x0000 -0x0101=0x7800 -0x0558=0x5009 -0x02C6=0x0000 -0x051B=0xB77F -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x0406=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x034B=0x0000 -0x011A=0x2E14 -0x029F=0x0000 -0x030A=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0560=0x174B -0x0404=0x0000 -0x00A0=0x6565 -0x0547=0xD7B7 -0x0454=0x0000 -0x0448=0x0000 -0x0327=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0510=0xE6C7 -0x0302=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0365=0x0000 -0x048E=0x0000 -0x0022=0x07FF -0x0283=0x0000 -0x044B=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x04E4=0x0000 -0x02E4=0x0000 -0x03A5=0x0000 -0x040B=0x000F -0x0366=0x0000 -0x0443=0x0000 -0x0508=0xEF99 -0x00A3=0x6565 -0x02E2=0x0000 -0x044D=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x0493=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x055E=0xDB10 -0x0402=0x07D9 -0x0384=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0480=0x0000 -0x0567=0x4049 -0x04CA=0x0000 -0x0446=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x0559=0xACB9 -0x0456=0x0000 -0x0441=0x0000 -0x0444=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x049E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 -0x038E=0x0000 -0x0403=0x0013 -0x04D8=0x0000 -0x029B=0x0000 -0x0491=0x0000 -0x03A1=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x0407=0x0000 -0x0258=0x0000 -0x0502=0x0A94 -0x038A=0x0000 -0x0362=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x0385=0x0000 -0x0315=0x0000 -0x040D=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x0405=0x0000 -0x0254=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x0487=0x0000 -0x038D=0x0000 -0x035E=0x0000 -0x03A7=0x0000 -0x0520=0x174B -0x0449=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0387=0x0000 -0x0386=0x0000 -0x0452=0x0000 -0x0299=0x0000 -0x0084=0x0400 -0x0498=0x0000 -0x0348=0x0000 -0x02D0=0x0000 -0x054E=0x8184 -0x03A0=0x0000 -0x009A=0x658C -0x055D=0xA6B5 -0x0298=0x0000 -0x0364=0x0000 -0x0081=0x0000 -0x0325=0x0000 -0x040F=0x43E4 -0x04E3=0x0000 -0x050E=0x17DC -0x0516=0x150F -0x0389=0x0000 -0x054F=0x18C9 -0x0304=0x0000 -0x04D5=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0296=0x0000 -0x0555=0xBD96 -0x0349=0x0000 -0x0484=0x0000 -0x0586=0x196B -0x0281=0x0000 -0x0200=0x0301 -0x0594=0xF40D -0x02C5=0x0000 -0x0319=0x0000 -0x0121=0x3760 -0x025B=0x0000 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x029C=0x0000 -0x008B=0x278A -0x02A3=0x0000 -0x05A4=0x0000 -0x02A7=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x02C2=0x0000 -0x02C4=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0093=0x0000 -0x02D3=0x0000 -0x0494=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x0251=0x0000 -0x0488=0x0000 -0x0496=0x0000 -0x04C3=0x0000 -0x0100=0x3409 -0x04CC=0x0000 -0x02A5=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 -0x049A=0x0000 -0x049B=0x0000 -0x0097=0x0000 -0x011E=0x0A2A -0x0285=0x0000 -0x0280=0x0000 -0x0020=0xFFFD -0x02DD=0x0000 -0x0297=0x0000 -0x044C=0x0000 -0x0355=0x0000 -0x04A0=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0526=0xBE2A -0x0092=0x0001 -0x031B=0x0000 -0x0541=0x4C24 -0x0543=0xBD96 -0x02C0=0x0000 -0x0499=0x0000 -0x0513=0xDAA2 -0x0549=0x18C9 -0x0552=0x8D44 -0x0521=0x5852 -0x0509=0x0605 -0x0286=0x0000 -0x024F=0x0000 -0x04E0=0x0000 -0x0545=0x364E -0x0551=0xD7B7 -0x055F=0x5852 -0x009E=0x658C -0x0598=0xF61D -0x0123=0x067B -0x0497=0x0000 -0x04A5=0x0000 -0x0565=0xB77F -0x0124=0x0000 -0x0592=0x0DF1 -0x0591=0xFCFE -0x0548=0x79FA -0x04D2=0x0000 -0x0599=0x0000 -0x0511=0x1D10 -0x0506=0x0DF1 -0x0595=0x00BC -0x0584=0xE7E2 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x058C=0xEA50 -0x0450=0x0000 -0x058A=0x17DC -0x059D=0x0000 -0x0485=0x0000 -0x058E=0x1316 -0x0550=0x79FA -0x0554=0x6901 -0x0593=0x00D8 -0x0553=0x364E -0x0542=0xA2B5 -0x0563=0x4F91 -0x024D=0x0000 -0x055A=0xBE2A -0x0295=0x0000 -0x028A=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x054C=0x7FFF -0x0582=0x150F -0x0109=0x8CC1 -0x04A2=0x0000 -0x0292=0x0000 -0x0583=0x2E45 -0x059F=0x0000 -0x0525=0x57AC -0x0523=0xA6B5 -0x0206=0x0000 -0x051A=0x0906 -0x055C=0x3347 -0x05A6=0x0000 -0x050F=0xEA5F -0x051E=0xF524 -0x050A=0x1316 -0x04C7=0x0000 -0x049D=0x0000 -0x050C=0xEA50 -0x0087=0x0000 -0x0399=0x0000 -0x0495=0x0000 -0x0246=0x0000 -0x0503=0x00BC -0x0320=0x0000 -0x0323=0x0000 -0x055B=0x57AC -0x0114=0x0110 -0x02E5=0x0000 -0x04E7=0x0000 -0x04D0=0x0000 -0x04E6=0x0000 -0x00AE=0x0000 -0x0544=0x6901 -0x04DE=0x0000 -0x058B=0x0F45 -0x0028=0x0101 -0x029E=0x0000 -0x04DC=0x0000 -0x04D9=0x0000 -0x058F=0x0605 -0x0557=0x4C24 -0x04DB=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x04D4=0x0000 -0x0504=0xF40D -0x02C3=0x0000 -0x04C1=0x0000 -0x04D3=0x0000 -0x0590=0xEF99 -0x04CE=0x0000 -0x05A5=0x0000 -[file_info] -version=1 -type=lms7002m_minimal_config +[file_info] +type=lms7002m_minimal_config +version=1 +[lms7002_registers_a] +0x0020=0xFFFD +0x0021=0x0E9F +0x0022=0x07FF +0x0023=0x5550 +0x0024=0xB1E4 +0x0025=0x0101 +0x0026=0x0101 +0x0027=0xB1E4 +0x0028=0x0101 +0x0029=0x0101 +0x002A=0x0086 +0x002B=0x0038 +0x002C=0x0000 +0x002D=0x0000 +0x002E=0x0000 +0x002F=0x3840 +0x0081=0x0000 +0x0082=0x800B +0x0084=0x0400 +0x0085=0x0001 +0x0086=0x4101 +0x0087=0x0000 +0x0088=0x04B0 +0x0089=0x1090 +0x008A=0x0514 +0x008B=0x2136 +0x008C=0x267B +0x0092=0x0001 +0x0093=0x0000 +0x0094=0x0000 +0x0095=0x0000 +0x0096=0x0000 +0x0097=0x0000 +0x0098=0x0000 +0x0099=0x6565 +0x009A=0x658C +0x009B=0x6565 +0x009C=0x658C +0x009D=0x6565 +0x009E=0x658C +0x009F=0x658C +0x00A0=0x6565 +0x00A1=0x6565 +0x00A2=0x6565 +0x00A3=0x6565 +0x00A4=0x6565 +0x00A5=0x6565 +0x00A6=0x000F +0x00A7=0x6565 +0x00A8=0x0000 +0x00A9=0x0000 +0x00AA=0x0000 +0x00AB=0x0040 +0x00AC=0x0000 +0x00AD=0x03FF +0x00AE=0x0000 +0x0100=0x3409 +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0612 +0x0104=0x0088 +0x0105=0x0011 +0x0106=0x318C +0x0107=0x318C +0x0108=0x218C +0x0109=0x6104 +0x010A=0x17BD +0x010C=0x8865 +0x010D=0x00DE +0x010E=0x0000 +0x010F=0x30C6 +0x0110=0x0BFF +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x0303 +0x0114=0x00D0 +0x0115=0x0009 +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x528C +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0x2000 +0x011E=0x06E4 +0x011F=0x3640 +0x0120=0xB9FF +0x0121=0x341C +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0081 +0x0201=0x07FF +0x0202=0x07FF +0x0203=0x0000 +0x0204=0x0000 +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0170 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x8000 +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x8081 +0x0401=0x07FF +0x0402=0x07FF +0x0403=0x0000 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0003 +0x040B=0x000F +0x040C=0x00F8 +0x040D=0x0000 +0x040E=0x0000 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x2B55 +0x0443=0x5540 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[lms7002_registers_b] +0x0100=0x340F +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0612 +0x0104=0x0088 +0x0105=0x001F +0x0106=0x3182 +0x0107=0x318C +0x0108=0x9442 +0x0109=0x61C1 +0x010A=0x104C +0x010C=0x88FF +0x010D=0x001E +0x010E=0x2040 +0x010F=0x3042 +0x0110=0x0BF4 +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x03C3 +0x0114=0x00D0 +0x0115=0x000F +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x5280 +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0x1555 +0x011E=0x0747 +0x011F=0x3640 +0x0120=0xB9FF +0x0121=0x360C +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0101 +0x0201=0x07FF +0x0202=0x07FF +0x0203=0x0000 +0x0204=0x0000 +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x01F0 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x7FFF +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x0105 +0x0401=0x07FF +0x0402=0x07FF +0x0403=0x0000 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0000 +0x040B=0x7FFF +0x040C=0x00FF +0x040D=0x0000 +0x040E=0x0002 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x0000 +0x0443=0x0000 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[reference_clocks] +sxt_ref_clk_mhz=30.72 +sxr_ref_clk_mhz=30.72 diff --git a/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/LimeSDR_below_1p8GHz.ini old mode 100644 new mode 100755 similarity index 79% rename from targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini rename to targets/ARCH/LMSSDR/LimeSDR_below_1p8GHz.ini index 0243742f32..dda51f7f27 --- a/targets/ARCH/LMSSDR/enb_sodera_lowband_Wrx_5MHz_rx19dB_txfull.ini +++ b/targets/ARCH/LMSSDR/LimeSDR_below_1p8GHz.ini @@ -1,1128 +1,1128 @@ -[file_info] -type=lms7002m_minimal_config -version=1 -[lms7002_registers_a] -0x0493=0x0000 -0x0492=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x048E=0x0000 -0x0022=0x07FF -0x0283=0x0000 -0x0487=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0460=0x0000 -0x0447=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0456=0x0000 -0x0559=0xACB9 -0x0451=0x0000 -0x0390=0x0000 -0x044B=0x0000 -0x0448=0x0000 -0x0454=0x0000 -0x0446=0x0000 -0x04CA=0x0000 -0x0444=0x0000 -0x0443=0x0000 -0x0508=0xEF99 -0x0441=0x0000 -0x040D=0x0000 -0x040B=0x000F -0x0409=0x0000 -0x0580=0xEFF2 -0x0407=0x0000 -0x0405=0x0000 -0x0254=0x0000 -0x0404=0x0000 -0x00A0=0x6565 -0x0560=0x174B -0x0403=0x009C -0x0402=0x07FF -0x055E=0xDB10 -0x03A7=0x0000 -0x0520=0x174B -0x03A5=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x03A2=0x0000 -0x051C=0x0000 -0x048D=0x0000 -0x059A=0x0000 -0x03A1=0x0000 -0x02A2=0x0000 -0x04E1=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x039B=0x0000 -0x0408=0x0000 -0x0398=0x0000 -0x0393=0x0000 -0x0305=0x0000 -0x038E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 -0x038D=0x0000 -0x0387=0x0000 -0x03A0=0x0000 -0x02D0=0x0000 -0x009A=0x658C -0x054E=0x8184 -0x0386=0x0000 -0x040F=0x0000 -0x04E3=0x0000 -0x0389=0x0000 -0x054F=0x18C9 -0x0385=0x0000 -0x0315=0x0000 -0x0384=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0366=0x0000 -0x0365=0x0000 -0x0364=0x0000 -0x0325=0x0000 -0x0081=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x035E=0x0000 -0x035D=0x0000 -0x0442=0x0000 -0x0449=0x0000 -0x035A=0x0000 -0x02C8=0x0000 -0x0452=0x0000 -0x0299=0x0000 -0x0359=0x0000 -0x0358=0x0000 -0x048B=0x0000 -0x0354=0x0000 -0x0351=0x0000 -0x03A6=0x0000 -0x0293=0x0000 -0x034E=0x0000 -0x035C=0x0000 -0x034D=0x0000 -0x034B=0x0000 -0x011A=0x2E03 -0x0455=0x0000 -0x034A=0x0000 -0x0348=0x0000 -0x0084=0x0400 -0x0498=0x0000 -0x035B=0x0000 -0x0505=0x00D8 -0x0345=0x0000 -0x0484=0x0000 -0x0586=0x196B -0x0344=0x0000 -0x0561=0xAB08 -0x0343=0x0000 -0x0342=0x0000 -0x0380=0x0000 -0x0327=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x0321=0x0000 -0x045E=0x0000 -0x0440=0x0024 -0x031D=0x0000 -0x0363=0x0000 -0x031A=0x0000 -0x031C=0x0000 -0x028F=0x0000 -0x0341=0x0000 -0x0287=0x0000 -0x0318=0x0000 -0x031F=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x040E=0x0000 -0x0352=0x0000 -0x028C=0x0000 -0x0360=0x0000 -0x0313=0x0000 -0x0461=0x0000 -0x010A=0x184C -0x051B=0xB77F -0x0312=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x0311=0x0000 -0x02D6=0x0000 -0x030C=0x0000 -0x04DF=0x0000 -0x030B=0x0000 -0x0392=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x0309=0x0000 -0x048A=0x0000 -0x0308=0x0000 -0x0588=0xE6C7 -0x0397=0x0000 -0x02E3=0x0000 -0x049C=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x0306=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x0303=0x0000 -0x0302=0x0000 -0x0510=0xE6C7 -0x044E=0x0000 -0x0300=0x0000 -0x034F=0x0000 -0x045B=0x0000 -0x02E6=0x0000 -0x00A3=0x6565 -0x04DA=0x0000 -0x025E=0x0000 -0x020A=0x0000 -0x0102=0x3180 -0x020C=0x8000 -0x05A2=0x0000 -0x040A=0x1000 -0x0556=0xA2B5 -0x0243=0x0000 -0x051D=0x4F91 -0x0259=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x011D=0xFEEE -0x039E=0x0000 -0x0252=0x0000 -0x0204=0xFFAD -0x0255=0x0000 -0x0281=0x0000 -0x0200=0x0301 -0x0594=0xF40D -0x02C5=0x0000 -0x0406=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0319=0x0000 -0x0121=0x313C -0x0101=0x7800 -0x025B=0x0000 -0x02C6=0x0000 -0x0558=0x5009 -0x0021=0x0E9F -0x04C2=0x0000 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x0296=0x0000 -0x029C=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x008B=0x278A -0x02A3=0x0000 -0x05A4=0x0000 -0x02A7=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x02C2=0x0000 -0x02C4=0x0000 -0x044D=0x0000 -0x02E2=0x0000 -0x02D1=0x0000 -0x0546=0x8D44 -0x04C8=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0096=0x0000 -0x0093=0x0000 -0x0250=0x0000 -0x02CB=0x0000 -0x02D3=0x0000 -0x0494=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x0251=0x0000 -0x0488=0x0000 -0x0496=0x0000 -0x04C3=0x0000 -0x0100=0xB409 -0x04CC=0x0000 -0x02A5=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 -0x049A=0x0000 -0x049B=0x0000 -0x0097=0x0000 -0x011E=0x0663 -0x0285=0x0000 -0x0280=0x0000 -0x049E=0x0000 -0x0020=0xFFFD -0x02DD=0x0000 -0x0297=0x0000 -0x049F=0x0000 -0x0522=0xDB10 -0x044C=0x0000 -0x0355=0x0000 -0x04A0=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0526=0xBE2A -0x0092=0x0001 -0x031B=0x0000 -0x0541=0x4C24 -0x0518=0xEFF2 -0x0543=0xBD96 -0x02C0=0x0000 -0x0499=0x0000 -0x04A1=0x0000 -0x058D=0xF5EF -0x02D7=0x0000 -0x0513=0xDAA2 -0x0549=0x18C9 -0x0552=0x8D44 -0x0521=0x5852 -0x0509=0x0605 -0x0286=0x0000 -0x024F=0x0000 -0x04E0=0x0000 -0x0545=0x364E -0x0349=0x0000 -0x0555=0xBD96 -0x04E4=0x0000 -0x02E4=0x0000 -0x0551=0xD7B7 -0x055D=0xA6B5 -0x0298=0x0000 -0x055F=0x5852 -0x009E=0x658C -0x0547=0xD7B7 -0x0598=0xF61D -0x0123=0x267B -0x0497=0x0000 -0x04A5=0x0000 -0x0565=0xB77F -0x0124=0x0000 -0x0592=0x0DF1 -0x0591=0xFCFE -0x0548=0x79FA -0x04D2=0x0000 -0x0599=0x0000 -0x0511=0x1D10 -0x0506=0x0DF1 -0x0595=0x00BC -0x0584=0xE7E2 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x058C=0xEA50 -0x0450=0x0000 -0x0596=0x0A94 -0x05A7=0x0000 -0x058A=0x17DC -0x059D=0x0000 -0x0485=0x0000 -0x058E=0x1316 -0x0550=0x79FA -0x0554=0x6901 -0x0593=0x00D8 -0x0542=0xA2B5 -0x0553=0x364E -0x0563=0x4F91 -0x024D=0x0000 -0x0567=0x4049 -0x055A=0xBE2A -0x0295=0x0000 -0x0566=0x0906 -0x028A=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x054C=0x7FFF -0x0582=0x150F -0x0585=0xDAA2 -0x0109=0x03C1 -0x04A2=0x0000 -0x0292=0x0000 -0x059F=0x0000 -0x0583=0x2E45 -0x050E=0x17DC -0x0516=0x150F -0x0523=0xA6B5 -0x0525=0x57AC -0x0206=0x0000 -0x051A=0x0906 -0x055C=0x3347 -0x0514=0xE7E2 -0x050F=0xEA5F -0x05A6=0x0000 -0x051E=0xF524 -0x050A=0x1316 -0x04C7=0x0000 -0x049D=0x0000 -0x0527=0xACB9 -0x050C=0xEA50 -0x0087=0x0000 -0x0399=0x0000 -0x050B=0xF5EF -0x0507=0xFCFE -0x010D=0x01DC -0x04C4=0x0000 -0x0495=0x0000 -0x0246=0x0000 -0x0503=0x00BC -0x0320=0x0000 -0x0323=0x0000 -0x02E5=0x0000 -0x055B=0x57AC -0x0114=0x0170 -0x04D8=0x0000 -0x04E7=0x0000 -0x04D0=0x0000 -0x04E6=0x0000 -0x00AE=0x0000 -0x0544=0x6901 -0x0258=0x0000 -0x0502=0x0A94 -0x04DE=0x0000 -0x058B=0x0F45 -0x0028=0x0101 -0x029E=0x0000 -0x04DC=0x0000 -0x04D9=0x0000 -0x0557=0x4C24 -0x058F=0x0605 -0x04DB=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x04D4=0x0000 -0x0504=0xF40D -0x02C3=0x0000 -0x04C1=0x0000 -0x04D3=0x0000 -0x0590=0xEF99 -0x04CE=0x0000 -0x05A5=0x0000 -0x04A7=0x0000 -0x0489=0x0000 -0x02E0=0x0000 -0x0118=0x218C -0x002A=0x0086 -0x0245=0x0000 -0x045D=0x0000 -0x0581=0xC89D -0x02D2=0x0000 -0x039C=0x0000 -0x002B=0x4032 -0x02A0=0x0000 -0x010E=0x070C -0x0394=0x0000 -0x0459=0x0000 -0x0088=0x0530 -0x0085=0x0001 -0x0089=0x00A0 -0x0256=0x0000 -0x0111=0x0099 -0x0095=0x0000 -0x0203=0x2F6C -0x030E=0x0000 -0x0482=0x0000 -0x05A0=0x0000 -0x009C=0x658C -0x0381=0x0000 -0x0122=0x033F -0x0110=0x0BFF -0x0026=0x0101 -0x0294=0x0000 -0x009D=0x6565 -0x0524=0x3347 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x0391=0x0000 -0x04CB=0x0000 -0x010F=0x3042 -0x0119=0x529F -0x02A6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0xF61D -0x039D=0x0000 -0x011F=0x3680 -0x0395=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0247=0x0000 -0x0512=0x196B -0x04E5=0x0000 -0x0024=0x50D8 -0x0353=0x0000 -0x050D=0x0F45 -0x02CD=0x0000 -0x0490=0x0000 -0x0501=0xFDFB -0x034C=0x0000 -0x00AA=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x008A=0x0491 -0x0453=0x0000 -0x0260=0x0000 -0x00A1=0x6565 -0x0356=0x0000 -0x0241=0x0000 -0x008C=0x267B -0x038F=0x0000 -0x054A=0x8184 -0x00A4=0x6565 -0x0401=0x07ED -0x04CD=0x0000 -0x0249=0x0000 -0x002C=0x0100 -0x054D=0xF7A3 -0x00A6=0x0001 -0x002D=0xFFFF -0x00AC=0x2000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x40F8 -0x0310=0x0000 -0x0099=0x6565 -0x00A2=0x6565 -0x0589=0xEA5F -0x002F=0x3840 -0x035F=0x0000 -0x0597=0xFDFB -0x0116=0x8180 -0x02CC=0x0000 -0x0025=0x0101 -0x0562=0xF524 -0x011C=0xAD41 -0x0289=0x0000 -0x0282=0x0000 -0x0307=0x0000 -0x038C=0x0000 -0x02C7=0x0000 -0x054B=0xF7A3 -0x0519=0x4049 -0x009F=0x658C -0x025C=0x0000 -0x0515=0x2E45 -0x00A5=0x6565 -0x0301=0x0000 -0x02C1=0x0000 -0x0481=0x0000 -0x0517=0xC89D -0x00A8=0x0000 -0x0564=0x0000 -0x00AB=0x0040 -0x0261=0x0000 -0x002E=0x0000 -0x02DE=0x0000 -0x02A4=0x0000 -0x0540=0x5009 -0x00AD=0x03FF -0x0029=0x0101 -0x024A=0x0000 -0x00A7=0x6565 -0x0027=0x05E4 -0x0117=0x1939 -0x0098=0x0000 -0x0108=0xFC26 -0x020B=0x0000 -0x0383=0x0000 -0x0202=0x07F9 -0x0086=0x4101 -0x010C=0x8865 -0x02D8=0x0000 -0x0347=0x0000 -0x0457=0x0000 -0x0103=0x0A12 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0101 -0x009B=0x6565 -0x0105=0x0007 -0x05A3=0x0000 -0x0240=0x0028 -0x0367=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D9=0x0000 -0x02CE=0x0000 -0x0284=0x0000 -0x0396=0x0000 -0x029A=0x0000 -0x051F=0xAB08 -0x0361=0x0000 -0x0205=0x0000 -0x031E=0x0000 -0x04C0=0x0000 -0x0587=0x1D10 -0x0023=0x5550 -0x048C=0x0000 -0x0112=0x20E5 -0x039A=0x0000 -0x0115=0x0009 -0x00A9=0x8000 -0x0317=0x0000 -0x0244=0x0000 -0x0094=0x0000 -0x0340=0x0000 -0x0208=0x0170 -0x04A3=0x0000 -0x029D=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x04C9=0x0000 -0x02CA=0x0000 -0x0209=0x0000 -0x0082=0x8001 -0x02D4=0x0000 -0x0107=0x318C -[lms7002_registers_b] -0x04E1=0x0000 -0x03A1=0x0000 -0x02A2=0x0000 -0x04E0=0x0000 -0x04DE=0x0000 -0x058B=0x0000 -0x04DC=0x0000 -0x04DB=0x0000 -0x04D9=0x0000 -0x04D5=0x0000 -0x0304=0x0000 -0x04D4=0x0000 -0x0504=0x0000 -0x04D3=0x0000 -0x04D2=0x0000 -0x0548=0x0000 -0x04D0=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x04CE=0x0000 -0x04CC=0x0000 -0x02A5=0x0000 -0x04C6=0x0000 -0x0207=0x0000 -0x04C1=0x0000 -0x02C3=0x0000 -0x04C9=0x0000 -0x02CA=0x0000 -0x04C0=0x0000 -0x031E=0x0000 -0x04D6=0x0000 -0x0257=0x0000 -0x04A6=0x0000 -0x04A5=0x0000 -0x04A2=0x0000 -0x0109=0x61C1 -0x049D=0x0000 -0x04C7=0x0000 -0x049C=0x0000 -0x0397=0x0000 -0x02E3=0x0000 -0x0499=0x0000 -0x02C0=0x0000 -0x0496=0x0000 -0x04C3=0x0000 -0x0493=0x0000 -0x04A1=0x0000 -0x0492=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x048E=0x0000 -0x0283=0x0000 -0x048C=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0487=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0460=0x0000 -0x0447=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0456=0x0000 -0x0559=0x0000 -0x0453=0x0000 -0x0451=0x0000 -0x0390=0x0000 -0x044D=0x0000 -0x02E2=0x0000 -0x044B=0x0000 -0x0448=0x0000 -0x0454=0x0000 -0x0446=0x0000 -0x04CA=0x0000 -0x0444=0x0000 -0x0443=0x0000 -0x0508=0x0000 -0x0441=0x0000 -0x040D=0x0000 -0x040B=0x7FFF -0x0409=0x0000 -0x0580=0x0000 -0x0407=0x0000 -0x0405=0x0000 -0x0254=0x0000 -0x0404=0x0000 -0x0560=0x0000 -0x04D8=0x0000 -0x0403=0x0000 -0x0402=0x07FF -0x055E=0x0000 -0x03A7=0x0000 -0x0520=0x0000 -0x03A5=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x03A2=0x0000 -0x051C=0x0000 -0x048D=0x0000 -0x059A=0x0000 -0x049E=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x039B=0x0000 -0x0399=0x0000 -0x0408=0x0000 -0x0398=0x0000 -0x0497=0x0000 -0x0123=0x267B -0x0394=0x0000 -0x0459=0x0000 -0x0393=0x0000 -0x0305=0x0000 -0x038E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 -0x038D=0x0000 -0x0395=0x0000 -0x038A=0x0000 -0x0362=0x0000 -0x0387=0x0000 -0x0200=0x0081 -0x0594=0x0000 -0x02C5=0x0000 -0x02A7=0x0000 -0x0318=0x0000 -0x0544=0x0000 -0x049A=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x020A=0x0080 -0x0102=0x3180 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x0295=0x0000 -0x055A=0x0000 -0x029C=0x0000 -0x010E=0x2040 -0x02A0=0x0000 -0x010F=0x3042 -0x02A6=0x0000 -0x0119=0x18CB -0x02D2=0x0000 -0x039C=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x02C2=0x0000 -0x045E=0x0000 -0x031D=0x0000 -0x0440=0x0020 -0x02C4=0x0000 -0x04D1=0x0000 -0x02CF=0x0000 -0x02C1=0x0000 -0x02C7=0x0000 -0x054B=0x0000 -0x02D3=0x0000 -0x04C8=0x0000 -0x02D1=0x0000 -0x0546=0x0000 -0x0306=0x0000 -0x02D7=0x0000 -0x058D=0x0000 -0x0457=0x0000 -0x02D8=0x0000 -0x0347=0x0000 -0x0103=0x0A12 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0081 -0x0209=0x0000 -0x0297=0x0000 -0x02DD=0x0000 -0x029E=0x0000 -0x02DE=0x0000 -0x0527=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x0259=0x0000 -0x0481=0x0000 -0x0517=0x0000 -0x029A=0x0000 -0x051F=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x0507=0x0000 -0x0321=0x0000 -0x034F=0x0000 -0x0296=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x038C=0x0000 -0x0307=0x0000 -0x0282=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x04C4=0x0000 -0x010D=0x009E -0x0300=0x0000 -0x0587=0x0000 -0x044E=0x0000 -0x0309=0x0000 -0x0585=0x0000 -0x02E5=0x0000 -0x055B=0x0000 -0x0114=0x008D -0x0323=0x0000 -0x0320=0x0000 -0x0503=0x0000 -0x0513=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x0549=0x0000 -0x0552=0x0000 -0x0509=0x0000 -0x0521=0x0000 -0x0286=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x0557=0x0000 -0x058F=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x0545=0x0000 -0x0349=0x0000 -0x0555=0x0000 -0x02E4=0x0000 -0x04E4=0x0000 -0x0551=0x0000 -0x0312=0x0000 -0x055D=0x0000 -0x0298=0x0000 -0x055F=0x0000 -0x011D=0x699D -0x039E=0x0000 -0x0547=0x0000 -0x0598=0x0000 -0x0449=0x0000 -0x0564=0x0000 -0x0242=0x0000 -0x0525=0x0000 -0x0523=0x0000 -0x0565=0x0000 -0x0124=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x0563=0x0000 -0x024D=0x0000 -0x0567=0x0000 -0x05A5=0x0000 -0x0566=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x054C=0x0000 -0x0582=0x0000 -0x0599=0x0000 -0x0511=0x0000 -0x0506=0x0000 -0x0301=0x0000 -0x0595=0x0000 -0x0584=0x0000 -0x058C=0x0000 -0x051E=0x0000 -0x05A6=0x0000 -0x050F=0x0000 -0x0590=0x0000 -0x05A0=0x0000 -0x0596=0x0000 -0x05A7=0x0000 -0x0562=0x0000 -0x058A=0x0000 -0x059D=0x0000 -0x0485=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x0245=0x0000 -0x0310=0x0000 -0x058E=0x0000 -0x05A2=0x0000 -0x054D=0x0000 -0x020C=0x7FFF -0x0589=0x0000 -0x0522=0x0000 -0x049F=0x0000 -0x031F=0x0000 -0x0292=0x0000 -0x059F=0x0000 -0x0583=0x0000 -0x0543=0x0000 -0x0317=0x0000 -0x0244=0x0000 -0x0554=0x0000 -0x0593=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0519=0x0000 -0x024F=0x0000 -0x0524=0x0000 -0x0518=0x0000 -0x0354=0x0000 -0x0526=0x0000 -0x031B=0x0000 -0x050E=0x0000 -0x0516=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x031C=0x0000 -0x028F=0x0000 -0x051A=0x0000 -0x055C=0x0000 -0x0514=0x0000 -0x050A=0x0000 -0x050C=0x0000 -0x050B=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x04E5=0x0000 -0x0512=0x0000 -0x0206=0x0000 -0x0550=0x0000 -0x0360=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0541=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x06B9 -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xAD41 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x02A4=0x0000 -0x0540=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 -0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x039D=0x0000 -0x0500=0x0000 -0x0450=0x0000 -0x011F=0x3680 -0x030C=0x0000 -0x04DF=0x0000 -0x0281=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x038B=0x0000 -0x044F=0x0000 -0x02D4=0x0000 -0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0100=0x3409 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0383=0x0000 -0x0202=0x07FF -0x054A=0x0000 -0x0401=0x07FF -0x0341=0x0000 -0x0287=0x0000 -0x034C=0x0000 -0x0501=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x051B=0x0000 -0x0121=0x333C -0x0115=0x0009 -0x0112=0xC0E6 -0x039A=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x04A0=0x0000 -0x0108=0x9442 -0x020B=0x4000 -0x0251=0x0000 -0x0488=0x0000 -0x0241=0x0000 -0x038F=0x0000 -0x02DC=0x0000 -0x024C=0x0000 -0x0494=0x0000 -0x051D=0x0000 -0x0243=0x0000 -0x0556=0x0000 -0x040A=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x0261=0x0000 -0x024A=0x0000 -0x0285=0x0000 -0x0280=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x0000 -0x0255=0x0000 -0x0258=0x0000 -0x0502=0x0000 -0x05A3=0x0000 -0x0367=0x0000 -0x0240=0x0020 -0x0256=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x025B=0x0000 -0x0205=0x0000 -0x0361=0x0000 -0x0515=0x0000 -0x025C=0x0000 -0x0355=0x0000 -0x044C=0x0000 -0x010C=0x88FD -0x0284=0x0000 -0x0396=0x0000 -0x0363=0x0000 -0x031A=0x0000 -0x0289=0x0000 -0x028A=0x0000 -0x04DD=0x0000 -0x059C=0x0000 -0x0352=0x0000 -0x028C=0x0000 -0x04C2=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0344=0x0000 -0x0561=0x0000 -0x035A=0x0000 -0x02C8=0x0000 -0x0484=0x0000 -0x0586=0x0000 -0x0597=0x0000 -0x035F=0x0000 -0x0345=0x0000 -0x0505=0x0000 -0x035B=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E02 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x0351=0x0000 -0x0353=0x0000 -0x050D=0x0000 -0x02CD=0x0000 -0x0490=0x0000 -0x0498=0x0000 -0x0348=0x0000 -0x0356=0x0000 -0x030D=0x0000 -0x0316=0x0000 -0x040E=0x0000 -0x04A3=0x0000 -0x029D=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0381=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x04E3=0x0000 -0x040F=0x0000 -0x0389=0x0000 -0x054F=0x0000 -0x0386=0x0000 -0x02D0=0x0000 -0x054E=0x0000 -0x03A0=0x0000 -[reference_clocks] -sxt_ref_clk_mhz=30.72 -sxr_ref_clk_mhz=30.72 +[file_info] +type=lms7002m_minimal_config +version=1 +[lms7002_registers_a] +0x0020=0xFFFD +0x0021=0x0E9F +0x0022=0x07FF +0x0023=0x5550 +0x0024=0xB1E4 +0x0025=0x0101 +0x0026=0x0101 +0x0027=0xB1E4 +0x0028=0x0101 +0x0029=0x0101 +0x002A=0x0086 +0x002B=0x0038 +0x002C=0x0000 +0x002D=0x0000 +0x002E=0x0000 +0x002F=0x3840 +0x0081=0x0000 +0x0082=0x8003 +0x0084=0x0400 +0x0085=0x0001 +0x0086=0x4101 +0x0087=0x0000 +0x0088=0x04B0 +0x0089=0x1090 +0x008A=0x0514 +0x008B=0x2102 +0x008C=0x267B +0x0092=0x0001 +0x0093=0x0000 +0x0094=0x0000 +0x0095=0x0000 +0x0096=0x0000 +0x0097=0x0000 +0x0098=0x0000 +0x0099=0x6565 +0x009A=0x658C +0x009B=0x6565 +0x009C=0x658C +0x009D=0x6565 +0x009E=0x658C +0x009F=0x658C +0x00A0=0x6565 +0x00A1=0x6565 +0x00A2=0x6565 +0x00A3=0x6565 +0x00A4=0x6565 +0x00A5=0x6565 +0x00A6=0x000F +0x00A7=0x6565 +0x00A8=0x0000 +0x00A9=0x0000 +0x00AA=0x0000 +0x00AB=0x0040 +0x00AC=0x0000 +0x00AD=0x03FF +0x00AE=0x0000 +0x0100=0x3409 +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0A12 +0x0104=0x0088 +0x0105=0x0011 +0x0106=0x318C +0x0107=0x318C +0x0108=0x2826 +0x0109=0x6104 +0x010A=0x17BD +0x010C=0x8865 +0x010D=0x01DC +0x010E=0x0000 +0x010F=0x3042 +0x0110=0x0BFF +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x0303 +0x0114=0x00D0 +0x0115=0x0009 +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x528C +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0xC000 +0x011E=0x068F +0x011F=0x3680 +0x0120=0xB9FF +0x0121=0x3234 +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0081 +0x0201=0x07FF +0x0202=0x07FF +0x0203=0x0000 +0x0204=0x0000 +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0170 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x8000 +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x8081 +0x0401=0x07FF +0x0402=0x07FF +0x0403=0x0000 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0003 +0x040B=0x000F +0x040C=0x00F8 +0x040D=0x0000 +0x040E=0x0000 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x2B55 +0x0443=0x5540 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[lms7002_registers_b] +0x0100=0x340F +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0612 +0x0104=0x0088 +0x0105=0x001F +0x0106=0x3182 +0x0107=0x318C +0x0108=0x9442 +0x0109=0x61C1 +0x010A=0x104C +0x010C=0x88FF +0x010D=0x001E +0x010E=0x2040 +0x010F=0x3042 +0x0110=0x0BF4 +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x03C3 +0x0114=0x00D0 +0x0115=0x000F +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x5280 +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0xC000 +0x011E=0x06F3 +0x011F=0x3680 +0x0120=0xB9FF +0x0121=0x346C +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0101 +0x0201=0x07FF +0x0202=0x07FF +0x0203=0x0000 +0x0204=0x0000 +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x01F0 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x7FFF +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x0105 +0x0401=0x07FF +0x0402=0x07FF +0x0403=0x0000 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0000 +0x040B=0x7FFF +0x040C=0x00FF +0x040D=0x0000 +0x040E=0x0002 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x0000 +0x0443=0x0000 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[reference_clocks] +sxt_ref_clk_mhz=30.72 +sxr_ref_clk_mhz=30.72 diff --git a/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/LimeSDR_below_1p8GHz_1v4.ini old mode 100644 new mode 100755 similarity index 79% rename from targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini rename to targets/ARCH/LMSSDR/LimeSDR_below_1p8GHz_1v4.ini index 34ce70c888..7c94b3dd5b --- a/targets/ARCH/LMSSDR/enb_sodera_lowband_Lrx_5MHz_rx19dB_txfull.ini +++ b/targets/ARCH/LMSSDR/LimeSDR_below_1p8GHz_1v4.ini @@ -1,1128 +1,1128 @@ -[reference_clocks] -sxr_ref_clk_mhz=30.72 -sxt_ref_clk_mhz=30.72 -[lms7002_registers_b] -0x05A7=0x0000 -0x05A5=0x0000 -0x05A2=0x0000 -0x05A0=0x0000 -0x0599=0x0000 -0x0598=0x0000 -0x0596=0x0000 -0x0594=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x0590=0x0000 -0x058E=0x0000 -0x058C=0x0000 -0x059D=0x0000 -0x058A=0x0000 -0x0589=0x0000 -0x0587=0x0000 -0x0585=0x0000 -0x0595=0x0000 -0x0584=0x0000 -0x059F=0x0000 -0x0583=0x0000 -0x0582=0x0000 -0x0567=0x0000 -0x0566=0x0000 -0x0565=0x0000 -0x0564=0x0000 -0x0563=0x0000 -0x0562=0x0000 -0x055F=0x0000 -0x055D=0x0000 -0x055A=0x0000 -0x058F=0x0000 -0x0557=0x0000 -0x0593=0x0000 -0x0554=0x0000 -0x0552=0x0000 -0x0551=0x0000 -0x0550=0x0000 -0x054D=0x0000 -0x054C=0x0000 -0x0549=0x0000 -0x0547=0x0000 -0x0546=0x0000 -0x0545=0x0000 -0x0544=0x0000 -0x0543=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0541=0x0000 -0x0527=0x0000 -0x0526=0x0000 -0x0524=0x0000 -0x0525=0x0000 -0x0523=0x0000 -0x0521=0x0000 -0x055C=0x0000 -0x051A=0x0000 -0x0519=0x0000 -0x0518=0x0000 -0x0514=0x0000 -0x0513=0x0000 -0x0511=0x0000 -0x05A6=0x0000 -0x051E=0x0000 -0x050F=0x0000 -0x0516=0x0000 -0x050E=0x0000 -0x050C=0x0000 -0x050B=0x0000 -0x050A=0x0000 -0x0509=0x0000 -0x0507=0x0000 -0x0506=0x0000 -0x0503=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x0512=0x0000 -0x04E5=0x0000 -0x04E4=0x0000 -0x0321=0x0000 -0x0320=0x0000 -0x0323=0x0000 -0x031B=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x031F=0x0000 -0x0360=0x0000 -0x0312=0x0000 -0x0310=0x0000 -0x0245=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x0307=0x0000 -0x0282=0x0000 -0x038C=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x0301=0x0000 -0x0309=0x0000 -0x0300=0x0000 -0x044E=0x0000 -0x034F=0x0000 -0x055B=0x0000 -0x0114=0x008D -0x02E5=0x0000 -0x02E4=0x0000 -0x02E1=0x0000 -0x02D5=0x0000 -0x0259=0x0000 -0x0517=0x0000 -0x0481=0x0000 -0x030B=0x0000 -0x0392=0x0000 -0x02DE=0x0000 -0x02DD=0x0000 -0x0297=0x0000 -0x0209=0x0000 -0x0400=0x0081 -0x02D8=0x0000 -0x0104=0x0088 -0x0103=0x0A12 -0x0347=0x0000 -0x0457=0x0000 -0x058D=0x0000 -0x02D7=0x0000 -0x02D1=0x0000 -0x04C8=0x0000 -0x02D3=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x0306=0x0000 -0x04A4=0x0000 -0x044A=0x0000 -0x054B=0x0000 -0x02C7=0x0000 -0x02C1=0x0000 -0x031D=0x0000 -0x0440=0x0020 -0x045E=0x0000 -0x02C4=0x0000 -0x02C2=0x0000 -0x02DB=0x0000 -0x0357=0x0000 -0x0201=0x07FF -0x0483=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x02A1=0x0000 -0x028D=0x0000 -0x02D2=0x0000 -0x039C=0x0000 -0x02A0=0x0000 -0x010E=0x2040 -0x030A=0x0000 -0x029F=0x0000 -0x029C=0x0000 -0x029E=0x0000 -0x011D=0x699D -0x039E=0x0000 -0x0296=0x0000 -0x0555=0x0000 -0x0349=0x0000 -0x0295=0x0000 -0x010D=0x009E -0x04C4=0x0000 -0x0292=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x020A=0x0080 -0x0102=0x3180 -0x0388=0x0000 -0x0120=0xB9FF -0x0317=0x0000 -0x0244=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x010F=0x3042 -0x0119=0x18CB -0x02A6=0x0000 -0x051F=0x0000 -0x029A=0x0000 -0x049A=0x0000 -0x059E=0x0000 -0x04D7=0x0000 -0x0318=0x0000 -0x02A7=0x0000 -0x0200=0x0081 -0x02C5=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x06B9 -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xAD41 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x0540=0x0000 -0x02A4=0x0000 -0x0485=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 -0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0x0000 -0x039D=0x0000 -0x011F=0x3680 -0x030C=0x0000 -0x04DF=0x0000 -0x0281=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D4=0x0000 -0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0100=0x3409 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x024D=0x0000 -0x0202=0x07FF -0x0383=0x0000 -0x054A=0x0000 -0x0401=0x07FF -0x0206=0x0000 -0x0124=0x0000 -0x0341=0x0000 -0x0287=0x0000 -0x0501=0x0000 -0x034C=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x051B=0x0000 -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x0121=0x333C -0x0115=0x0009 -0x0112=0xC0E6 -0x039A=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x04A0=0x0000 -0x0108=0x9442 -0x020B=0x4000 -0x0251=0x0000 -0x0488=0x0000 -0x0241=0x0000 -0x038F=0x0000 -0x02DC=0x0000 -0x024C=0x0000 -0x0494=0x0000 -0x051D=0x0000 -0x0243=0x0000 -0x0556=0x0000 -0x040A=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x0261=0x0000 -0x024A=0x0000 -0x0285=0x0000 -0x0280=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x024F=0x0000 -0x0253=0x0000 -0x0255=0x0000 -0x0502=0x0000 -0x0258=0x0000 -0x0298=0x0000 -0x05A3=0x0000 -0x0367=0x0000 -0x0240=0x0020 -0x0256=0x0000 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x025B=0x0000 -0x020C=0x7FFF -0x0205=0x0000 -0x0361=0x0000 -0x0515=0x0000 -0x025C=0x0000 -0x0355=0x0000 -0x044C=0x0000 -0x010C=0x88FD -0x0284=0x0000 -0x0396=0x0000 -0x0286=0x0000 -0x028F=0x0000 -0x031C=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x0289=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x040C=0x0000 -0x028B=0x0000 -0x0450=0x0000 -0x0352=0x0000 -0x028C=0x0000 -0x04C2=0x0000 -0x025E=0x0000 -0x04DA=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0561=0x0000 -0x0344=0x0000 -0x0586=0x0000 -0x0484=0x0000 -0x0345=0x0000 -0x0505=0x0000 -0x035B=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E02 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x0351=0x0000 -0x0353=0x0000 -0x050D=0x0000 -0x02CD=0x0000 -0x0490=0x0000 -0x0354=0x0000 -0x0348=0x0000 -0x0498=0x0000 -0x0356=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x040E=0x0000 -0x0522=0x0000 -0x049F=0x0000 -0x029D=0x0000 -0x04A3=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0449=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x0597=0x0000 -0x035F=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0381=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x054F=0x0000 -0x0389=0x0000 -0x04E3=0x0000 -0x040F=0x0000 -0x0386=0x0000 -0x054E=0x0000 -0x02D0=0x0000 -0x03A0=0x0000 -0x0387=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x0395=0x0000 -0x038D=0x0000 -0x02E7=0x0000 -0x0324=0x0000 -0x038E=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0459=0x0000 -0x0394=0x0000 -0x0123=0x267B -0x0497=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x0399=0x0000 -0x039B=0x0000 -0x0248=0x0000 -0x039F=0x0000 -0x049E=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x0520=0x0000 -0x03A7=0x0000 -0x055E=0x0000 -0x0402=0x07FF -0x0403=0x0000 -0x04D8=0x0000 -0x0560=0x0000 -0x0404=0x0000 -0x0254=0x0000 -0x0405=0x0000 -0x0407=0x0000 -0x0580=0x0000 -0x0409=0x0000 -0x040B=0x7FFF -0x040D=0x0000 -0x0441=0x0000 -0x0508=0x0000 -0x0443=0x0000 -0x0444=0x0000 -0x04CA=0x0000 -0x0446=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x044B=0x0000 -0x02E2=0x0000 -0x044D=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x0453=0x0000 -0x0559=0x0000 -0x0456=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x0480=0x0000 -0x045F=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0358=0x0000 -0x048B=0x0000 -0x048C=0x0000 -0x0283=0x0000 -0x048E=0x0000 -0x029B=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x04A1=0x0000 -0x0493=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x02C0=0x0000 -0x0499=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x049C=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x0109=0x61C1 -0x04A2=0x0000 -0x04A5=0x0000 -0x04A6=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x031E=0x0000 -0x04C0=0x0000 -0x02CA=0x0000 -0x04C9=0x0000 -0x02C3=0x0000 -0x04C1=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x02A5=0x0000 -0x04CC=0x0000 -0x04CE=0x0000 -0x025F=0x0000 -0x04CF=0x0000 -0x04D0=0x0000 -0x0548=0x0000 -0x04D2=0x0000 -0x04D3=0x0000 -0x0504=0x0000 -0x04D4=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x04D9=0x0000 -0x04DB=0x0000 -0x04DC=0x0000 -0x058B=0x0000 -0x04DE=0x0000 -0x04E0=0x0000 -0x02A2=0x0000 -0x03A1=0x0000 -0x04E1=0x0000 -[lms7002_registers_a] -0x05A7=0x0000 -0x05A5=0x0000 -0x05A2=0x0000 -0x0599=0x0000 -0x0598=0xF61D -0x0596=0x0A94 -0x0594=0xF40D -0x0592=0x0DF1 -0x0591=0xFCFE -0x0590=0xEF99 -0x058E=0x1316 -0x058C=0xEA50 -0x059D=0x0000 -0x058A=0x17DC -0x0585=0xDAA2 -0x0595=0x00BC -0x0584=0xE7E2 -0x059F=0x0000 -0x0583=0x2E45 -0x0582=0x150F -0x0567=0x4049 -0x0566=0x0906 -0x0565=0xB77F -0x0563=0x4F91 -0x055F=0x5852 -0x055D=0xA6B5 -0x055A=0xBE2A -0x058F=0x0605 -0x0557=0x4C24 -0x0593=0x00D8 -0x0554=0x6901 -0x0552=0x8D44 -0x0551=0xD7B7 -0x0550=0x79FA -0x054C=0x7FFF -0x0549=0x18C9 -0x0547=0xD7B7 -0x0546=0x8D44 -0x0545=0x364E -0x0544=0x6901 -0x0543=0xBD96 -0x0553=0x364E -0x0542=0xA2B5 -0x0541=0x4C24 -0x0527=0xACB9 -0x0526=0xBE2A -0x0525=0x57AC -0x0523=0xA6B5 -0x0521=0x5852 -0x055C=0x3347 -0x051A=0x0906 -0x0518=0xEFF2 -0x0514=0xE7E2 -0x0513=0xDAA2 -0x0511=0x1D10 -0x05A6=0x0000 -0x051E=0xF524 -0x050F=0xEA5F -0x0516=0x150F -0x050E=0x17DC -0x050C=0xEA50 -0x050B=0xF5EF -0x050A=0x1316 -0x0509=0x0605 -0x0507=0xFCFE -0x0506=0x0DF1 -0x0503=0x00BC -0x04E7=0x0000 -0x04E6=0x0000 -0x04E4=0x0000 -0x04E0=0x0000 -0x058B=0x0F45 -0x04DE=0x0000 -0x04DC=0x0000 -0x04DB=0x0000 -0x04D9=0x0000 -0x04D8=0x0000 -0x059E=0x0000 -0x04D7=0x0000 -0x0504=0xF40D -0x04D4=0x0000 -0x04D3=0x0000 -0x0548=0x79FA -0x04D2=0x0000 -0x04D1=0x0000 -0x04D0=0x0000 -0x04CE=0x0000 -0x04C8=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x04C4=0x0000 -0x04C2=0x0000 -0x04A7=0x0000 -0x04A6=0x0000 -0x04A5=0x0000 -0x04A1=0x0000 -0x04A0=0x0000 -0x0522=0xDB10 -0x049F=0x0000 -0x049E=0x0000 -0x04C7=0x0000 -0x049D=0x0000 -0x049B=0x0000 -0x049A=0x0000 -0x04C3=0x0000 -0x0496=0x0000 -0x0494=0x0000 -0x02D3=0x0000 -0x02D1=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x0096=0x0000 -0x04C1=0x0000 -0x02C3=0x0000 -0x02C4=0x0000 -0x02C2=0x0000 -0x0499=0x0000 -0x02C0=0x0000 -0x0201=0x07FF -0x0483=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x008B=0x278A -0x02A1=0x0000 -0x028D=0x0000 -0x029C=0x0000 -0x029E=0x0000 -0x0297=0x0000 -0x0296=0x0000 -0x0555=0xBD96 -0x0349=0x0000 -0x010D=0x015C -0x02CF=0x0000 -0x0291=0x0000 -0x02DF=0x0000 -0x0290=0x0000 -0x0021=0x0E9F -0x0450=0x0000 -0x0558=0x5009 -0x02C6=0x0000 -0x0101=0x7800 -0x059C=0x0000 -0x04DD=0x0000 -0x028A=0x0000 -0x0121=0x313C -0x0285=0x0000 -0x0280=0x0000 -0x0319=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x025D=0x0000 -0x030F=0x0000 -0x0406=0x0000 -0x02C5=0x0000 -0x0200=0x0301 -0x0281=0x0000 -0x04A2=0x0000 -0x0109=0x03C1 -0x0355=0x0000 -0x044C=0x0000 -0x025B=0x0000 -0x0298=0x0000 -0x0502=0x0A94 -0x0258=0x0000 -0x0255=0x0000 -0x04D6=0x0000 -0x0257=0x0000 -0x0252=0x0000 -0x0204=0xFFAD -0x024F=0x0000 -0x04CC=0x0000 -0x02A5=0x0000 -0x0497=0x0000 -0x0123=0x267B -0x0495=0x0000 -0x0246=0x0000 -0x051D=0x4F91 -0x0243=0x0000 -0x0556=0xA2B5 -0x040A=0x1000 -0x025A=0x0000 -0x0242=0x0000 -0x020C=0x8000 -0x0251=0x0000 -0x02DD=0x0000 -0x0020=0xFFFD -0x0488=0x0000 -0x020A=0x0000 -0x0102=0x3180 -0x04C6=0x0000 -0x0207=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0206=0x0000 -0x00A3=0x6565 -0x02E2=0x0000 -0x044D=0x0000 -0x0292=0x0000 -0x002A=0x0086 -0x0245=0x0000 -0x0581=0xC89D -0x045D=0x0000 -0x024D=0x0000 -0x002B=0x4032 -0x02A0=0x0000 -0x010E=0x070C -0x0286=0x0000 -0x009E=0x658C -0x0088=0x0530 -0x0085=0x0001 -0x0295=0x0000 -0x0089=0x00A0 -0x0256=0x0000 -0x0093=0x0000 -0x0092=0x0001 -0x031B=0x0000 -0x0111=0x0099 -0x0095=0x0000 -0x02A7=0x0000 -0x0203=0x2F6C -0x030E=0x0000 -0x0482=0x0000 -0x05A0=0x0000 -0x009C=0x658C -0x0381=0x0000 -0x0122=0x033F -0x0110=0x0BFF -0x0100=0xB409 -0x0028=0x0101 -0x0026=0x0101 -0x0524=0x3347 -0x009D=0x6565 -0x0294=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0xF61D -0x039D=0x0000 -0x011F=0x3680 -0x0395=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0247=0x0000 -0x0512=0x196B -0x04E5=0x0000 -0x0024=0x50D8 -0x0353=0x0000 -0x050D=0x0F45 -0x02CD=0x0000 -0x0490=0x0000 -0x0501=0xFDFB -0x034C=0x0000 -0x00AA=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x008A=0x0491 -0x0453=0x0000 -0x0124=0x0000 -0x0260=0x0000 -0x00A1=0x6565 -0x0356=0x0000 -0x0241=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x002C=0x0100 -0x038F=0x0000 -0x008C=0x267B -0x0459=0x0000 -0x0394=0x0000 -0x054D=0xF7A3 -0x00A6=0x0001 -0x002D=0xFFFF -0x00AC=0x2000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x40F8 -0x0099=0x6565 -0x0310=0x0000 -0x00A2=0x6565 -0x0589=0xEA5F -0x002F=0x3840 -0x0597=0xFDFB -0x035F=0x0000 -0x0562=0xF524 -0x0025=0x0101 -0x011C=0xAD41 -0x011D=0xFEEE -0x039E=0x0000 -0x0289=0x0000 -0x0282=0x0000 -0x0307=0x0000 -0x038C=0x0000 -0x0087=0x0000 -0x0399=0x0000 -0x054B=0xF7A3 -0x02C7=0x0000 -0x0519=0x4049 -0x009F=0x658C -0x0515=0x2E45 -0x025C=0x0000 -0x00A5=0x6565 -0x0301=0x0000 -0x02C1=0x0000 -0x0259=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x0517=0xC89D -0x0481=0x0000 -0x00A8=0x0000 -0x02D2=0x0000 -0x039C=0x0000 -0x0564=0x0000 -0x00AB=0x0040 -0x0261=0x0000 -0x002E=0x0000 -0x02DE=0x0000 -0x0540=0x5009 -0x02A4=0x0000 -0x0485=0x0000 -0x0489=0x0000 -0x00AD=0x03FF -0x024A=0x0000 -0x0029=0x0101 -0x0097=0x0000 -0x011E=0x0663 -0x00AE=0x0000 -0x00A7=0x6565 -0x020B=0x0000 -0x0098=0x0000 -0x0108=0xFC26 -0x0027=0x05E4 -0x0117=0x1939 -0x0383=0x0000 -0x0202=0x07F9 -0x054A=0x8184 -0x00A4=0x6565 -0x0401=0x07ED -0x0086=0x4101 -0x010C=0x8865 -0x02D8=0x0000 -0x0347=0x0000 -0x0457=0x0000 -0x0103=0x0A12 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0101 -0x009B=0x6565 -0x0105=0x0007 -0x05A3=0x0000 -0x0240=0x0028 -0x0367=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x0284=0x0000 -0x0396=0x0000 -0x051F=0xAB08 -0x029A=0x0000 -0x0361=0x0000 -0x0205=0x0000 -0x0119=0x529F -0x02A6=0x0000 -0x010F=0x3042 -0x04C0=0x0000 -0x031E=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x0587=0x1D10 -0x0023=0x5550 -0x048C=0x0000 -0x0112=0x20E5 -0x039A=0x0000 -0x0320=0x0000 -0x0323=0x0000 -0x0115=0x0009 -0x00A9=0x8000 -0x0244=0x0000 -0x0094=0x0000 -0x0317=0x0000 -0x0208=0x0170 -0x0340=0x0000 -0x058D=0xF5EF -0x02D7=0x0000 -0x04A3=0x0000 -0x029D=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x04C9=0x0000 -0x02CA=0x0000 -0x0209=0x0000 -0x0082=0x8001 -0x0107=0x318C -0x02D4=0x0000 -0x02CE=0x0000 -0x02D9=0x0000 -0x02E4=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x0118=0x218C -0x02E0=0x0000 -0x055B=0x57AC -0x0114=0x0170 -0x02E5=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x034F=0x0000 -0x0300=0x0000 -0x044E=0x0000 -0x0510=0xE6C7 -0x0302=0x0000 -0x0303=0x0000 -0x04D5=0x0000 -0x0304=0x0000 -0x0306=0x0000 -0x04A4=0x0000 -0x044A=0x0000 -0x049C=0x0000 -0x02E3=0x0000 -0x0397=0x0000 -0x0588=0xE6C7 -0x0308=0x0000 -0x048A=0x0000 -0x0309=0x0000 -0x029F=0x0000 -0x030A=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x04DF=0x0000 -0x030C=0x0000 -0x02D6=0x0000 -0x0311=0x0000 -0x024E=0x0000 -0x0346=0x0000 -0x0312=0x0000 -0x051B=0xB77F -0x010A=0x184C -0x0461=0x0000 -0x0313=0x0000 -0x0360=0x0000 -0x028C=0x0000 -0x0352=0x0000 -0x040E=0x0000 -0x030D=0x0000 -0x0316=0x0000 -0x031F=0x0000 -0x0318=0x0000 -0x0287=0x0000 -0x0341=0x0000 -0x028F=0x0000 -0x031C=0x0000 -0x031A=0x0000 -0x0363=0x0000 -0x031D=0x0000 -0x0440=0x0024 -0x045E=0x0000 -0x0321=0x0000 -0x059B=0x0000 -0x0322=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0561=0xAB08 -0x0344=0x0000 -0x0586=0x196B -0x0484=0x0000 -0x0345=0x0000 -0x0505=0x00D8 -0x035B=0x0000 -0x0498=0x0000 -0x0084=0x0400 -0x0348=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E03 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0351=0x0000 -0x0354=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x02C8=0x0000 -0x035A=0x0000 -0x0449=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x038A=0x0000 -0x0362=0x0000 -0x0081=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x054F=0x18C9 -0x0389=0x0000 -0x04E3=0x0000 -0x040F=0x0000 -0x0386=0x0000 -0x054E=0x8184 -0x009A=0x658C -0x02D0=0x0000 -0x03A0=0x0000 -0x0387=0x0000 -0x038D=0x0000 -0x02E7=0x0000 -0x0324=0x0000 -0x038E=0x0000 -0x0305=0x0000 -0x0393=0x0000 -0x0398=0x0000 -0x0408=0x0000 -0x039B=0x0000 -0x0248=0x0000 -0x039F=0x0000 -0x04E1=0x0000 -0x02A2=0x0000 -0x03A1=0x0000 -0x059A=0x0000 -0x048D=0x0000 -0x051C=0x0000 -0x03A2=0x0000 -0x03A3=0x0000 -0x03A4=0x0000 -0x03A5=0x0000 -0x0520=0x174B -0x03A7=0x0000 -0x055E=0xDB10 -0x0402=0x07FF -0x0403=0x009C -0x0560=0x174B -0x00A0=0x6565 -0x0404=0x0000 -0x0254=0x0000 -0x0405=0x0000 -0x0407=0x0000 -0x0580=0xEFF2 -0x0409=0x0000 -0x040B=0x000F -0x040D=0x0000 -0x0441=0x0000 -0x0508=0xEF99 -0x0443=0x0000 -0x0444=0x0000 -0x04CA=0x0000 -0x0446=0x0000 -0x0454=0x0000 -0x0448=0x0000 -0x044B=0x0000 -0x0390=0x0000 -0x0451=0x0000 -0x0559=0xACB9 -0x0456=0x0000 -0x0314=0x0000 -0x0458=0x0000 -0x02DA=0x0000 -0x045A=0x0000 -0x0447=0x0000 -0x0460=0x0000 -0x0480=0x0000 -0x045F=0x0000 -0x0486=0x0000 -0x0487=0x0000 -0x0283=0x0000 -0x0022=0x07FF -0x048E=0x0000 -0x029B=0x0000 -0x0491=0x0000 -0x0492=0x0000 -0x0493=0x0000 -[file_info] -version=1 -type=lms7002m_minimal_config +[file_info] +type=lms7002m_minimal_config +version=1 +[lms7002_registers_a] +0x0020=0xFFFD +0x0021=0x0E9F +0x0022=0x07FF +0x0023=0x5550 +0x0024=0xB1E4 +0x0025=0x0101 +0x0026=0x0101 +0x0027=0xB1E4 +0x0028=0x0101 +0x0029=0x0101 +0x002A=0x0086 +0x002B=0x0038 +0x002C=0x0000 +0x002D=0x0000 +0x002E=0x0000 +0x002F=0x3841 +0x0081=0x0000 +0x0082=0x800B +0x0084=0x0400 +0x0085=0x0001 +0x0086=0x4101 +0x0087=0x0000 +0x0088=0x04B0 +0x0089=0x1090 +0x008A=0x0514 +0x008B=0x2138 +0x008C=0x267B +0x0092=0x0001 +0x0093=0x0000 +0x0094=0x0000 +0x0095=0x0000 +0x0096=0x0000 +0x0097=0x0000 +0x0098=0x0000 +0x0099=0x6565 +0x009A=0x658C +0x009B=0x6565 +0x009C=0x658C +0x009D=0x6565 +0x009E=0x658C +0x009F=0x658C +0x00A0=0x6565 +0x00A1=0x6565 +0x00A2=0x6565 +0x00A3=0x6565 +0x00A4=0x6565 +0x00A5=0x6565 +0x00A6=0x000F +0x00A7=0x6565 +0x00A8=0x0000 +0x00A9=0x0000 +0x00AA=0x0000 +0x00AB=0x0040 +0x00AC=0x0000 +0x00AD=0x03FF +0x00AE=0x0000 +0x0100=0x3409 +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0A12 +0x0104=0x0088 +0x0105=0x0011 +0x0106=0x318C +0x0107=0x318C +0x0108=0x298C +0x0109=0x6104 +0x010A=0x17BD +0x010C=0x8865 +0x010D=0x015A +0x010E=0x0000 +0x010F=0x30C6 +0x0110=0x0BFF +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x0303 +0x0114=0x00D0 +0x0115=0x0009 +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x528C +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0xC000 +0x011E=0x068F +0x011F=0x3680 +0x0120=0xB9FF +0x0121=0x3234 +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0081 +0x0201=0x07FF +0x0202=0x07FF +0x0203=0x0000 +0x0204=0x0000 +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x0170 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x8000 +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x8081 +0x0401=0x07FF +0x0402=0x07FF +0x0403=0x0000 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0003 +0x040B=0x000F +0x040C=0x00F8 +0x040D=0x0000 +0x040E=0x0000 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x2B55 +0x0443=0x5540 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[lms7002_registers_b] +0x0100=0x340F +0x0101=0x7800 +0x0102=0x3180 +0x0103=0x0612 +0x0104=0x0088 +0x0105=0x001F +0x0106=0x3182 +0x0107=0x318C +0x0108=0x9442 +0x0109=0x61C1 +0x010A=0x104C +0x010C=0x88FF +0x010D=0x001E +0x010E=0x2040 +0x010F=0x3042 +0x0110=0x0BF4 +0x0111=0x0083 +0x0112=0x9407 +0x0113=0x03C3 +0x0114=0x00D0 +0x0115=0x000F +0x0116=0x8180 +0x0117=0x1217 +0x0118=0x018C +0x0119=0x5280 +0x011A=0x3E03 +0x011C=0xAD41 +0x011D=0xC000 +0x011E=0x06F3 +0x011F=0x3680 +0x0120=0xB9FF +0x0121=0x346C +0x0122=0x033F +0x0123=0x267B +0x0124=0x0000 +0x0200=0x0101 +0x0201=0x07FF +0x0202=0x07FF +0x0203=0x0000 +0x0204=0x0000 +0x0205=0x0000 +0x0206=0x0000 +0x0207=0x0000 +0x0208=0x01F0 +0x0209=0x0000 +0x020A=0x0080 +0x020B=0x0000 +0x020C=0x7FFF +0x0240=0x0020 +0x0241=0x0000 +0x0242=0x0000 +0x0243=0x0000 +0x0244=0x0000 +0x0245=0x0000 +0x0246=0x0000 +0x0247=0x0000 +0x0248=0x0000 +0x0249=0x0000 +0x024A=0x0000 +0x024B=0x0000 +0x024C=0x0000 +0x024D=0x0000 +0x024E=0x0000 +0x024F=0x0000 +0x0250=0x0000 +0x0251=0x0000 +0x0252=0x0000 +0x0253=0x0000 +0x0254=0x0000 +0x0255=0x0000 +0x0256=0x0000 +0x0257=0x0000 +0x0258=0x0000 +0x0259=0x0000 +0x025A=0x0000 +0x025B=0x0000 +0x025C=0x0000 +0x025D=0x0000 +0x025E=0x0000 +0x025F=0x0000 +0x0260=0x0000 +0x0261=0x0000 +0x0280=0x0000 +0x0281=0x0000 +0x0282=0x0000 +0x0283=0x0000 +0x0284=0x0000 +0x0285=0x0000 +0x0286=0x0000 +0x0287=0x0000 +0x0288=0x0000 +0x0289=0x0000 +0x028A=0x0000 +0x028B=0x0000 +0x028C=0x0000 +0x028D=0x0000 +0x028E=0x0000 +0x028F=0x0000 +0x0290=0x0000 +0x0291=0x0000 +0x0292=0x0000 +0x0293=0x0000 +0x0294=0x0000 +0x0295=0x0000 +0x0296=0x0000 +0x0297=0x0000 +0x0298=0x0000 +0x0299=0x0000 +0x029A=0x0000 +0x029B=0x0000 +0x029C=0x0000 +0x029D=0x0000 +0x029E=0x0000 +0x029F=0x0000 +0x02A0=0x0000 +0x02A1=0x0000 +0x02A2=0x0000 +0x02A3=0x0000 +0x02A4=0x0000 +0x02A5=0x0000 +0x02A6=0x0000 +0x02A7=0x0000 +0x02C0=0x0000 +0x02C1=0x0000 +0x02C2=0x0000 +0x02C3=0x0000 +0x02C4=0x0000 +0x02C5=0x0000 +0x02C6=0x0000 +0x02C7=0x0000 +0x02C8=0x0000 +0x02C9=0x0000 +0x02CA=0x0000 +0x02CB=0x0000 +0x02CC=0x0000 +0x02CD=0x0000 +0x02CE=0x0000 +0x02CF=0x0000 +0x02D0=0x0000 +0x02D1=0x0000 +0x02D2=0x0000 +0x02D3=0x0000 +0x02D4=0x0000 +0x02D5=0x0000 +0x02D6=0x0000 +0x02D7=0x0000 +0x02D8=0x0000 +0x02D9=0x0000 +0x02DA=0x0000 +0x02DB=0x0000 +0x02DC=0x0000 +0x02DD=0x0000 +0x02DE=0x0000 +0x02DF=0x0000 +0x02E0=0x0000 +0x02E1=0x0000 +0x02E2=0x0000 +0x02E3=0x0000 +0x02E4=0x0000 +0x02E5=0x0000 +0x02E6=0x0000 +0x02E7=0x0000 +0x0300=0x0000 +0x0301=0x0000 +0x0302=0x0000 +0x0303=0x0000 +0x0304=0x0000 +0x0305=0x0000 +0x0306=0x0000 +0x0307=0x0000 +0x0308=0x0000 +0x0309=0x0000 +0x030A=0x0000 +0x030B=0x0000 +0x030C=0x0000 +0x030D=0x0000 +0x030E=0x0000 +0x030F=0x0000 +0x0310=0x0000 +0x0311=0x0000 +0x0312=0x0000 +0x0313=0x0000 +0x0314=0x0000 +0x0315=0x0000 +0x0316=0x0000 +0x0317=0x0000 +0x0318=0x0000 +0x0319=0x0000 +0x031A=0x0000 +0x031B=0x0000 +0x031C=0x0000 +0x031D=0x0000 +0x031E=0x0000 +0x031F=0x0000 +0x0320=0x0000 +0x0321=0x0000 +0x0322=0x0000 +0x0323=0x0000 +0x0324=0x0000 +0x0325=0x0000 +0x0326=0x0000 +0x0327=0x0000 +0x0340=0x0000 +0x0341=0x0000 +0x0342=0x0000 +0x0343=0x0000 +0x0344=0x0000 +0x0345=0x0000 +0x0346=0x0000 +0x0347=0x0000 +0x0348=0x0000 +0x0349=0x0000 +0x034A=0x0000 +0x034B=0x0000 +0x034C=0x0000 +0x034D=0x0000 +0x034E=0x0000 +0x034F=0x0000 +0x0350=0x0000 +0x0351=0x0000 +0x0352=0x0000 +0x0353=0x0000 +0x0354=0x0000 +0x0355=0x0000 +0x0356=0x0000 +0x0357=0x0000 +0x0358=0x0000 +0x0359=0x0000 +0x035A=0x0000 +0x035B=0x0000 +0x035C=0x0000 +0x035D=0x0000 +0x035E=0x0000 +0x035F=0x0000 +0x0360=0x0000 +0x0361=0x0000 +0x0362=0x0000 +0x0363=0x0000 +0x0364=0x0000 +0x0365=0x0000 +0x0366=0x0000 +0x0367=0x0000 +0x0380=0x0000 +0x0381=0x0000 +0x0382=0x0000 +0x0383=0x0000 +0x0384=0x0000 +0x0385=0x0000 +0x0386=0x0000 +0x0387=0x0000 +0x0388=0x0000 +0x0389=0x0000 +0x038A=0x0000 +0x038B=0x0000 +0x038C=0x0000 +0x038D=0x0000 +0x038E=0x0000 +0x038F=0x0000 +0x0390=0x0000 +0x0391=0x0000 +0x0392=0x0000 +0x0393=0x0000 +0x0394=0x0000 +0x0395=0x0000 +0x0396=0x0000 +0x0397=0x0000 +0x0398=0x0000 +0x0399=0x0000 +0x039A=0x0000 +0x039B=0x0000 +0x039C=0x0000 +0x039D=0x0000 +0x039E=0x0000 +0x039F=0x0000 +0x03A0=0x0000 +0x03A1=0x0000 +0x03A2=0x0000 +0x03A3=0x0000 +0x03A4=0x0000 +0x03A5=0x0000 +0x03A6=0x0000 +0x03A7=0x0000 +0x0400=0x0105 +0x0401=0x07FF +0x0402=0x07FF +0x0403=0x0000 +0x0404=0x0000 +0x0405=0x0000 +0x0406=0x0000 +0x0407=0x0000 +0x0408=0x0000 +0x0409=0x0000 +0x040A=0x0000 +0x040B=0x7FFF +0x040C=0x00FF +0x040D=0x0000 +0x040E=0x0002 +0x040F=0x0000 +0x0440=0x0020 +0x0441=0x0000 +0x0442=0x0000 +0x0443=0x0000 +0x0444=0x0000 +0x0445=0x0000 +0x0446=0x0000 +0x0447=0x0000 +0x0448=0x0000 +0x0449=0x0000 +0x044A=0x0000 +0x044B=0x0000 +0x044C=0x0000 +0x044D=0x0000 +0x044E=0x0000 +0x044F=0x0000 +0x0450=0x0000 +0x0451=0x0000 +0x0452=0x0000 +0x0453=0x0000 +0x0454=0x0000 +0x0455=0x0000 +0x0456=0x0000 +0x0457=0x0000 +0x0458=0x0000 +0x0459=0x0000 +0x045A=0x0000 +0x045B=0x0000 +0x045C=0x0000 +0x045D=0x0000 +0x045E=0x0000 +0x045F=0x0000 +0x0460=0x0000 +0x0461=0x0000 +0x0480=0x0000 +0x0481=0x0000 +0x0482=0x0000 +0x0483=0x0000 +0x0484=0x0000 +0x0485=0x0000 +0x0486=0x0000 +0x0487=0x0000 +0x0488=0x0000 +0x0489=0x0000 +0x048A=0x0000 +0x048B=0x0000 +0x048C=0x0000 +0x048D=0x0000 +0x048E=0x0000 +0x048F=0x0000 +0x0490=0x0000 +0x0491=0x0000 +0x0492=0x0000 +0x0493=0x0000 +0x0494=0x0000 +0x0495=0x0000 +0x0496=0x0000 +0x0497=0x0000 +0x0498=0x0000 +0x0499=0x0000 +0x049A=0x0000 +0x049B=0x0000 +0x049C=0x0000 +0x049D=0x0000 +0x049E=0x0000 +0x049F=0x0000 +0x04A0=0x0000 +0x04A1=0x0000 +0x04A2=0x0000 +0x04A3=0x0000 +0x04A4=0x0000 +0x04A5=0x0000 +0x04A6=0x0000 +0x04A7=0x0000 +0x04C0=0x0000 +0x04C1=0x0000 +0x04C2=0x0000 +0x04C3=0x0000 +0x04C4=0x0000 +0x04C5=0x0000 +0x04C6=0x0000 +0x04C7=0x0000 +0x04C8=0x0000 +0x04C9=0x0000 +0x04CA=0x0000 +0x04CB=0x0000 +0x04CC=0x0000 +0x04CD=0x0000 +0x04CE=0x0000 +0x04CF=0x0000 +0x04D0=0x0000 +0x04D1=0x0000 +0x04D2=0x0000 +0x04D3=0x0000 +0x04D4=0x0000 +0x04D5=0x0000 +0x04D6=0x0000 +0x04D7=0x0000 +0x04D8=0x0000 +0x04D9=0x0000 +0x04DA=0x0000 +0x04DB=0x0000 +0x04DC=0x0000 +0x04DD=0x0000 +0x04DE=0x0000 +0x04DF=0x0000 +0x04E0=0x0000 +0x04E1=0x0000 +0x04E2=0x0000 +0x04E3=0x0000 +0x04E4=0x0000 +0x04E5=0x0000 +0x04E6=0x0000 +0x04E7=0x0000 +0x0500=0x0000 +0x0501=0x0000 +0x0502=0x0000 +0x0503=0x0000 +0x0504=0x0000 +0x0505=0x0000 +0x0506=0x0000 +0x0507=0x0000 +0x0508=0x0000 +0x0509=0x0000 +0x050A=0x0000 +0x050B=0x0000 +0x050C=0x0000 +0x050D=0x0000 +0x050E=0x0000 +0x050F=0x0000 +0x0510=0x0000 +0x0511=0x0000 +0x0512=0x0000 +0x0513=0x0000 +0x0514=0x0000 +0x0515=0x0000 +0x0516=0x0000 +0x0517=0x0000 +0x0518=0x0000 +0x0519=0x0000 +0x051A=0x0000 +0x051B=0x0000 +0x051C=0x0000 +0x051D=0x0000 +0x051E=0x0000 +0x051F=0x0000 +0x0520=0x0000 +0x0521=0x0000 +0x0522=0x0000 +0x0523=0x0000 +0x0524=0x0000 +0x0525=0x0000 +0x0526=0x0000 +0x0527=0x0000 +0x0540=0x0000 +0x0541=0x0000 +0x0542=0x0000 +0x0543=0x0000 +0x0544=0x0000 +0x0545=0x0000 +0x0546=0x0000 +0x0547=0x0000 +0x0548=0x0000 +0x0549=0x0000 +0x054A=0x0000 +0x054B=0x0000 +0x054C=0x0000 +0x054D=0x0000 +0x054E=0x0000 +0x054F=0x0000 +0x0550=0x0000 +0x0551=0x0000 +0x0552=0x0000 +0x0553=0x0000 +0x0554=0x0000 +0x0555=0x0000 +0x0556=0x0000 +0x0557=0x0000 +0x0558=0x0000 +0x0559=0x0000 +0x055A=0x0000 +0x055B=0x0000 +0x055C=0x0000 +0x055D=0x0000 +0x055E=0x0000 +0x055F=0x0000 +0x0560=0x0000 +0x0561=0x0000 +0x0562=0x0000 +0x0563=0x0000 +0x0564=0x0000 +0x0565=0x0000 +0x0566=0x0000 +0x0567=0x0000 +0x0580=0x0000 +0x0581=0x0000 +0x0582=0x0000 +0x0583=0x0000 +0x0584=0x0000 +0x0585=0x0000 +0x0586=0x0000 +0x0587=0x0000 +0x0588=0x0000 +0x0589=0x0000 +0x058A=0x0000 +0x058B=0x0000 +0x058C=0x0000 +0x058D=0x0000 +0x058E=0x0000 +0x058F=0x0000 +0x0590=0x0000 +0x0591=0x0000 +0x0592=0x0000 +0x0593=0x0000 +0x0594=0x0000 +0x0595=0x0000 +0x0596=0x0000 +0x0597=0x0000 +0x0598=0x0000 +0x0599=0x0000 +0x059A=0x0000 +0x059B=0x0000 +0x059C=0x0000 +0x059D=0x0000 +0x059E=0x0000 +0x059F=0x0000 +0x05A0=0x0000 +0x05A1=0x0000 +0x05A2=0x0000 +0x05A3=0x0000 +0x05A4=0x0000 +0x05A5=0x0000 +0x05A6=0x0000 +0x05A7=0x0000 +[reference_clocks] +sxt_ref_clk_mhz=30.72 +sxr_ref_clk_mhz=30.72 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt deleted file mode 100644 index c331185e17..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -set(si5351_src_files - Si5351C.cpp -) -set(CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -std=c++11 -fPIC" -) - - -add_library(Si5351C STATIC ${si5351_src_files}) -target_include_directories(Si5351C PUBLIC ../lms7002m ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(Si5351C LMS7002M) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp deleted file mode 100644 index 88bcb74f3d..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.cpp +++ /dev/null @@ -1,872 +0,0 @@ -/** -@file Si5351C.cpp -@author Lime Microsystems -@brief Configuring of Si5351C -*/ - -#include "Si5351C.h" -#include "lmsComms.h" -#include -#include -#include -#include -#include -#include -#include -#include -using namespace std; - -#define Log(msg, type) cout << (msg) << endl; - -/// Splits float into fraction integers A + B/C -void realToFrac(const float real, int &A, int &B, int &C) -{ - A = (int)real; - B = (int)((real - A) * 1048576 + 0.5); - C = 1048576; - - int a = B; - int b = C; - int temp; - while( b!= 0) // greatest common divider - { - temp = a % b; - a = b; - b = temp; - } - B = B/a; - C = C/a; -} - -/// Default configuration -const unsigned char Si5351C::m_defaultConfiguration[] = -{ 0,0x00, - 1,0x00, - 2,0x08, - 3,0x00, - 4,0x00, - 5,0x00, - 6,0x00, - 7,0x00, - 8,0x00, - 9,0x00, - 10,0x00, - 11,0x00, - 12,0x00, - 13,0x00, - 14,0x00, - 15,0x04, - 16,0x4F, - 17,0x4F, - 18,0x4F, - 19,0x4F, - 20,0x4F, - 21,0x4F, - 22,0x0F, - 23,0x0F, - 24,0x00, - 25,0x00, - 26,0x00, - 27,0x80, - 28,0x00, - 29,0x0B, - 30,0x2F, - 31,0x00, - 32,0x00, - 33,0x00, - 34,0x00, - 35,0x00, - 36,0x00, - 37,0x00, - 38,0x00, - 39,0x00, - 40,0x00, - 41,0x00, - 42,0x00, - 43,0x01, - 44,0x00, - 45,0x0D, - 46,0x00, - 47,0x00, - 48,0x00, - 49,0x00, - 50,0x00, - 51,0x01, - 52,0x00, - 53,0x0D, - 54,0x00, - 55,0x00, - 56,0x00, - 57,0x00, - 58,0x00, - 59,0x01, - 60,0x00, - 61,0x0D, - 62,0x00, - 63,0x00, - 64,0x00, - 65,0x00, - 66,0x00, - 67,0x01, - 68,0x00, - 69,0x0D, - 70,0x00, - 71,0x00, - 72,0x00, - 73,0x00, - 74,0x00, - 75,0x01, - 76,0x00, - 77,0x0D, - 78,0x00, - 79,0x00, - 80,0x00, - 81,0x00, - 82,0x00, - 83,0x01, - 84,0x00, - 85,0x0D, - 86,0x00, - 87,0x00, - 88,0x00, - 89,0x00, - 90,0x1E, - 91,0x1E, - 92,0x00, - 93,0x00, - 94,0x00, - 95,0x00, - 96,0x00, - 97,0x00, - 98,0x00, - 99,0x00, -100,0x00, -101,0x00, -102,0x00, -103,0x00, -104,0x00, -105,0x00, -106,0x00, -107,0x00, -108,0x00, -109,0x00, -110,0x00, -111,0x00, -112,0x00, -113,0x00, -114,0x00, -115,0x00, -116,0x00, -117,0x00, -118,0x00, -119,0x00, -120,0x00, -121,0x00, -122,0x00, -123,0x00, -124,0x00, -125,0x00, -126,0x00, -127,0x00, -128,0x00, -129,0x00, -130,0x00, -131,0x00, -132,0x00, -133,0x00, -134,0x00, -135,0x00, -136,0x00, -137,0x00, -138,0x00, -139,0x00, -140,0x00, -141,0x00, -142,0x00, -143,0x00, -144,0x00, -145,0x00, -146,0x00, -147,0x00, -148,0x00, -149,0x00, -150,0x00, -151,0x00, -152,0x00, -153,0x00, -154,0x00, -155,0x00, -156,0x00, -157,0x00, -158,0x00, -159,0x00, -160,0x00, -161,0x00, -162,0x00, -163,0x00, -164,0x00, -165,0x00, -166,0x00, -167,0x00, -168,0x00, -169,0x00, -170,0x00, -171,0x00, -172,0x00, -173,0x00, -174,0x00, -175,0x00, -176,0x00, -177,0x00, -178,0x00, -179,0x00, -180,0x00, -181,0x30, -182,0x00, -183,0xD2, -184,0x60, -185,0x60, -186,0x00, -187,0xC0, -188,0x00, -189,0x00, -190,0x00, -191,0x00, -192,0x00, -193,0x00, -194,0x00, -195,0x00, -196,0x00, -197,0x00, -198,0x00, -199,0x00, -200,0x00, -201,0x00, -202,0x00, -203,0x00, -204,0x00, -205,0x00, -206,0x00, -207,0x00, -208,0x00, -209,0x00, -210,0x00, -211,0x00, -212,0x00, -213,0x00, -214,0x00, -215,0x00, -216,0x00, -217,0x00, -218,0x00, -219,0x00, -220,0x00, -221,0x0D, -222,0x00, -223,0x00, -224,0x00, -225,0x00, -226,0x00, -227,0x00, -228,0x00, -229,0x00, -230,0x00, -231,0x00, -232,0x00}; - -// --------------------------------------------------------------------------- -Si5351C::Si5351C() -{ - memset(m_newConfiguration, 0, 255); - for(unsigned int i=0; iIsOpen() ) - { - return FAILED; - } - LMScomms::TransferStatus status; - status = device->TransferPacket(pkt); - if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) - { - return FAILED; - } - return SUCCESS; -} - -// --------------------------------------------------------------------------- -/** - @brief Sets connection manager to use for data transferring Si5351C - @param mng connection manager for data transferring -*/ -void Si5351C::Initialize(LMScomms *mng) -{ - assert(mng != nullptr); - device = mng; -} - -/** - @brief Loads register values for Si5356A from file - @param FName input filename -*/ -bool Si5351C::LoadRegValuesFromFile(string FName) -{ - fstream fin; - fin.open(FName.c_str(), ios::in); - - const int len = 1024; - char line[len]; - - int addr; - int value; - - while(!fin.eof()) - { - fin.getline(line, len); - if( line[0] == '#') - continue; - if( strcmp(line, "#END_PROFILE") == 0) - break; - sscanf(line, "%i,%x",&addr,&value); - m_newConfiguration[addr] = value; - } - - fin.close(); - return false; -}; - -/** @brief Calculates multisynth dividers and VCO frequencies - @param clocks output clocks configuration - @param plls plls configurations - @param Fmin lowest VCO frequency - @param Fmax highest VCO frequency -*/ -void Si5351C::FindVCO(Si5351_Channel *clocks, Si5351_PLL *plls, const unsigned long Fmin, const unsigned long Fmax) -{ - int clockCount = 8; - //reset output parameters - for(int i=0; i availableFrequenciesPLLA; //all available frequencies for VCO - map< unsigned long, int> availableFrequenciesPLLB; //all available frequencies for VCO - - //if clk6 or clk7 is used make available frequencies according to them - if(clocks[6].powered || clocks[7].powered) - { - set clk6freqs; - set clk7freqs; - set sharedFreqs; - unsigned int mult = 6; - if(!clk6satisfied) - { - unsigned long freq = clocks[6].outputFreqHz; - while(freq <= Fmax && mult <= 254) - { - freq = clocks[6].outputFreqHz*mult; - if(freq >= Fmin && freq <= Fmax) - { - clk6freqs.insert(freq); - } - mult += 2; - } - } - mult = 6; - if(!clk7satisfied) - { - unsigned long freq = clocks[7].outputFreqHz; - while(freq <= Fmax && mult <= 254) - { - freq = clocks[7].outputFreqHz*mult; - if(freq >= Fmin && freq <= Fmax) - { - clk7freqs.insert(freq); - } - mult += 2; - } - } - bool canShare = false; - //find if clk6 and clk7 can share the same pll - for (set::iterator it6=clk6freqs.begin(); it6!=clk6freqs.end(); ++it6) - { - for (set::iterator it7=clk7freqs.begin(); it7!=clk7freqs.end(); ++it7) - { - if(*it6 == *it7) - { - canShare = true; - sharedFreqs.insert(*it6); - } - } - } - if(canShare) //assign PLLA for both clocks - { - clocks[6].pllSource = 0; - clocks[7].pllSource = 0; - pllAused = true; - for (set::iterator it=sharedFreqs.begin(); it!=sharedFreqs.end(); ++it) - { - availableFrequenciesPLLA.insert( pair (*it, 0) ); - } - clk6satisfied = true; - clk7satisfied = true; - } - else //if clocks 6 and 7 can't share pll, assign pllA to clk6 and pllB to clk7 - { - if(!clk6satisfied) - { - clocks[6].pllSource = 0; - clk6satisfied = true; - pllAused = true; - for (set::iterator it6=clk6freqs.begin(); it6!=clk6freqs.end(); ++it6) - { - availableFrequenciesPLLA.insert( pair(*it6, 0) ); - } - } - if(!clk7satisfied) - { - clocks[7].pllSource = 1; - clk7satisfied = true; - pllBused = true; - for (set::iterator it7=clk7freqs.begin(); it7!=clk7freqs.end(); ++it7) - { - availableFrequenciesPLLB.insert( pair (*it7, 0) ); - } - } - } - } - - //PLLA stage, find all clocks that have integer coefficients with PLLA - //if pllA is not used by clk6 or clk7, fill available frequencies according to clk1-clk5 clocks - if( availableFrequenciesPLLA.size() == 0 && !pllAused) - { - for(int i=0; i<6; ++i) - { - unsigned long freq = clocks[i].outputFreqHz > Fmin ? clocks[i].outputFreqHz : (clocks[i].outputFreqHz*((Fmin/clocks[i].outputFreqHz) + ((Fmin%clocks[i].outputFreqHz)!=0))); - while(freq >= Fmin && freq <= Fmax) - { - //add all output frequency multiples that are in VCO interval - availableFrequenciesPLLA.insert( pair (freq, 0)); - freq += clocks[i].outputFreqHz; - } - } - } - - unsigned int bestScore = 0; //score shows how many outputs have integer dividers - //calculate scores for all available frequencies - unsigned long bestVCOA = 0; - for (map::iterator it=availableFrequenciesPLLA.begin(); it!=availableFrequenciesPLLA.end(); ++it) - { - for(int i=0; i<8; ++i) - { - if(clocks[i].outputFreqHz == 0 || !clocks[i].powered) - continue; - - if( (it->first % clocks[i].outputFreqHz) == 0) - { - it->second = it->second+1; - } - } - if(it->second >= bestScore) - { - bestScore = it->second; - bestVCOA = it->first; - } - } - //scores calculated - //cout << "PLLA stage: " << endl; - //cout << "best score: " << bestScore << " best VCO: " << bestVCOA << endl; - plls[0].VCO_Hz = bestVCOA; - plls[0].feedbackDivider = (double)bestVCOA/plls[0].inputFreqHz; - - for(int i=0; i Fmin ? clocks[i].outputFreqHz : (clocks[i].outputFreqHz*((Fmin/clocks[i].outputFreqHz) + ((Fmin%clocks[i].outputFreqHz)!=0))); - while(freq >= Fmin && freq <= Fmax) - { - availableFrequenciesPLLB.insert( pair (freq, 0)); - freq += clocks[i].outputFreqHz; - } - } - } - - bestScore = 0; - //calculate scores for all available frequencies - unsigned long bestVCOB = 0; - for (map::iterator it=availableFrequenciesPLLB.begin(); it!=availableFrequenciesPLLB.end(); ++it) - { - for(int i=0; i<8; ++i) - { - if(clocks[i].outputFreqHz == 0 || !clocks[i].powered) - continue; - - if( (it->first % clocks[i].outputFreqHz) == 0) - { - it->second = it->second+1; - } - } - if(it->second >= bestScore) - { - bestScore = it->second; - bestVCOB = it->first; - } - } - //scores calculated -// cout << "PLLB stage: " << endl; -// cout << "best score: " << bestScore << " best VCO: " << bestVCOB << endl; - if(bestVCOB == 0) //just in case if pllb is not used make it the same frequency as plla - bestVCOB = bestVCOA; - plls[1].VCO_Hz = bestVCOB; - plls[1].feedbackDivider = (double)bestVCOB/plls[0].inputFreqHz; - for(int i=0; i> 8; - m_newConfiguration[addr+1] = MSX_P3; - - m_newConfiguration[addr+2] = 0; - m_newConfiguration[addr+2] |= (MSX_P1 >> 16 ) & 0x03; - m_newConfiguration[addr+3] = MSX_P1 >> 8; - m_newConfiguration[addr+4] = MSX_P1; - - m_newConfiguration[addr+5] = 0; - m_newConfiguration[addr+5] = (MSX_P2 >> 16) & 0x0F; - m_newConfiguration[addr+5] |= (MSX_P3 >> 16) << 4; - - m_newConfiguration[addr+6] = MSX_P2; - m_newConfiguration[addr+7] = MSX_P2 >> 8; - } - else if( CLK[i].outputFreqHz <= 160000000) // AVAILABLE ONLY ON 0-5 MULTISYNTHS - { - Log("Si5351C - clock configuring for more than 150 MHz not implemented\n", LOG_ERROR); - return FAILED; - } - } - else // CLK6 and CLK7 only integer mode - { - if(CLK[i].outputFreqHz <= 150000000) - { - if(i==6) - { - m_newConfiguration[90] = DivA; - if(DivA%2 != 0) - { - Log("Si5351C - CLK6 multisynth divider is not even integer\n", LOG_ERROR); - return FAILED; - } - } - else - { - m_newConfiguration[91] = DivA; - if(DivA%2 != 0) - { - Log("Si5351C - CLK7 multisynth divider is not even integer\n", LOG_ERROR); - return FAILED; - } - } - } - else if( CLK[i].outputFreqHz <= 160000000) // AVAILABLE ONLY ON 0-5 MULTISYNTHS - { - Log("Si5351C - clock configuring for more than 150 MHz not implemented\n", LOG_ERROR); - return FAILED; - } - } - } - - //configure pll - //set input clk source - m_newConfiguration[15] = m_newConfiguration[15] & 0xF3; - m_newConfiguration[15] |= (PLL[0].CLK_SRC & 1) << 2; - m_newConfiguration[15] |= (PLL[1].CLK_SRC & 1) << 3; - for(int i=0; i<2; ++i) - { - addr = 26+i*8; - if(PLL[i].feedbackDivider < 15 || PLL[i].feedbackDivider > 90) - { - Log("Si5351C - VCO frequency divider out of range [15:90].\n", LOG_ERROR); - return FAILED; - } - if( PLL[i].VCO_Hz < 600000000 || PLL[i].VCO_Hz > 900000000) - { - Log("Si5351C - Can't calculate valid VCO frequency.\n", LOG_ERROR); - return FAILED; - } - ss.clear(); - ss.str(string()); - ss << "Si5351C : VCO" << (i==0 ? "A" : "B") << " = " << PLL[i].VCO_Hz/1000000.0 << " MHz"; - - //calculate MSNx_P1, MSNx_P2, MSNx_P3 - int MSNx_P1; - int MSNx_P2; - int MSNx_P3; - - int DivA; - int DivB; - int DivC; - realToFrac(PLL[i].feedbackDivider, DivA, DivB, DivC); - ss << " Feedback Divider " << DivA << " " << DivB << "/" << DivC << endl; - Log(ss.str(), LOG_INFO); - - MSNx_P1 = 128 * DivA + floor(128 * ( (float)DivB/DivC)) - 512; - MSNx_P2 = 128 * DivB - DivC * floor( 128 * DivB/DivC ); - MSNx_P3 = DivC; - - m_newConfiguration[addr+4] = MSNx_P1; - m_newConfiguration[addr+3] = MSNx_P1 >> 8; - m_newConfiguration[addr+2] = MSNx_P1 >> 16; - - m_newConfiguration[addr+7] = MSNx_P2; - m_newConfiguration[addr+6] = MSNx_P2 >> 8; - m_newConfiguration[addr+5] = 0; - m_newConfiguration[addr+5] = (MSNx_P2 >> 16) & 0x0F; - - m_newConfiguration[addr+5] |= (MSNx_P3 >> 16) << 4; - m_newConfiguration[addr+1] |= MSNx_P3; - m_newConfiguration[addr] |= MSNx_P3 >> 8; - } - return SUCCESS; -} - -/** @brief Sets output clock parameters - @param id clock id 0-CLK0 1-CLK1 ... - @param fOut_Hz output frequency in Hz - @param enabled is this output powered - @param inverted invert clock -*/ -void Si5351C::SetClock(unsigned char id, unsigned long fOut_Hz, bool enabled, bool inverted) -{ - if( id < 8) - { - if(fOut_Hz < 8000 || fOut_Hz > 160000000) - { - stringstream ss; - ss << "Si5351C - CLK" << (int)id << " output frequency must be between 8kHz and 160MHz. fOut_MHz = " << fOut_Hz/1000000.0 << endl; - Log(ss.str(), LOG_ERROR); - return; - } - CLK[id].powered = enabled; - CLK[id].inverted = inverted; - CLK[id].outputFreqHz = fOut_Hz; - } -} - -/** @brief Sets PLL input frequency - @param id PLL id 0-PLLA 1-PLLB - @param CLKIN_Hz clock input in Hz -*/ -void Si5351C::SetPLL(unsigned char id, unsigned long CLKIN_Hz, int CLK_SRC) -{ - if (id < 2) - { - PLL[id].inputFreqHz = CLKIN_Hz; - PLL[id].CLK_SRC = CLK_SRC; - } -} - -/** @brief Resets configuration registers to default values -*/ -void Si5351C::Reset() -{ - memset(m_newConfiguration, 0, 255); - for(unsigned int i=0; iTransferPacket(pkt); - if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) - { - return stat; - } - - stat.sys_init = (pkt.inBuffer[0] >> 7); - stat.lol_b = (pkt.inBuffer[0] >> 6) & 0x1; - stat.lol_a = (pkt.inBuffer[0] >> 5) & 0x1; - stat.los = (pkt.inBuffer[0] >> 4) & 0x1; - stat.sys_init_stky = (pkt.inBuffer[1] >> 7); - stat.lol_b_stky = (pkt.inBuffer[1] >> 6) & 0x1; - stat.lol_a_stky = (pkt.inBuffer[1] >> 5) & 0x1; - stat.los_stky = (pkt.inBuffer[1] >> 4) & 0x1; - return stat; -} - -Si5351C::Status Si5351C::ClearStatus() -{ - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_SI5351_WR; - pkt.outBuffer.push_back(1); - pkt.outBuffer.push_back(0x0); - LMScomms::TransferStatus status; - status = device->TransferPacket(pkt); - if (status != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) - return FAILED; - return SUCCESS; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h deleted file mode 100644 index 971a2d1d69..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/Si5351C/Si5351C.h +++ /dev/null @@ -1,100 +0,0 @@ -/** -@file Si5351C.h -@brief Header for Si5351C.cpp -@author Lime Microsystems -*/ - -#ifndef SI5351C_MODULE -#define SI5351C_MODULE - -#include -#include -using namespace std; -//--------------------------------------------------------------------------- - -enum eSi_CLOCK_INPUT -{ - Si_CLKIN, - Si_XTAL, - Si_CMOS -}; - -struct Si5351_Channel -{ - Si5351_Channel() : outputDivider(1), outputFreqHz(1), multisynthDivider(1), pllSource(0), - phaseOffset(0), powered(true), inverted(false), int_mode(false) {}; - int outputDivider; - unsigned long outputFreqHz; - float multisynthDivider; - int pllSource; - float phaseOffset; - bool powered; - bool inverted; - bool int_mode; -}; - -struct Si5351_PLL -{ - Si5351_PLL() : inputFreqHz(0), VCO_Hz(0), feedbackDivider(0), CLKIN_DIV(1), CLK_SRC(1) {} - unsigned long inputFreqHz; - float VCO_Hz; - float feedbackDivider; - int CLKIN_DIV; - int CLK_SRC; //0-XTAL, 1-CLKIN -}; - -class LMScomms; -class Si5351C -{ -public: - enum Status - { - SUCCESS, - FAILED, - }; - - struct StatusBits - { - StatusBits() : sys_init(0), sys_init_stky(0), lol_b(0), lol_b_stky(0), lol_a(0), lol_a_stky(0), los(0), los_stky(0) - { - - } - int sys_init; - int sys_init_stky; - int lol_b; - int lol_b_stky; - int lol_a; - int lol_a_stky; - int los; - int los_stky; - }; - - StatusBits GetStatusBits(); - Status ClearStatus(); - - Si5351C(); - ~Si5351C(); - void Initialize(LMScomms *mng); - bool LoadRegValuesFromFile(string FName); - - void SetPLL(unsigned char id, unsigned long CLKIN_Hz, int CLK_SRC); - void SetClock(unsigned char id, unsigned long fOut_Hz, bool enabled = true, bool inverted = false); - - Status UploadConfiguration(); - Status ConfigureClocks(); - void Reset(); - -private: - void FindVCO(Si5351_Channel *clocks, Si5351_PLL *plls, const unsigned long Fmin, const unsigned long Fmax); - LMScomms *device; - - Si5351_PLL PLL[2]; - Si5351_Channel CLK[8]; - - static const unsigned char m_defaultConfiguration[]; - unsigned char m_newConfiguration[255]; - - -}; - -#endif // SI5351C_MODULE diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/CMakeLists.txt deleted file mode 100644 index 4613e9ce72..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/CMakeLists.txt +++ /dev/null @@ -1,63 +0,0 @@ -cmake_minimum_required(VERSION 2.8) -set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE TYPE INTERNAL FORCE) -project("lms7api") -#include modules for finding FFTW and CyAPI -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") -cmake_policy(SET CMP0015 OLD) -if(${CMAKE_MAJOR_VERSION} GREATER 2) - cmake_policy(SET CMP0043 NEW) -endif() -ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS) -if(CMAKE_COMPILER_IS_GNUCXX) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fPIC") -endif() - -# set up include-directories -include_directories( - "${PROJECT_SOURCE_DIR}" - "${PROJECT_BINARY_DIR}" - cpp-feather-ini-parser - ) - -set(LMS7002M_src_files - LMS7002M.cpp - LMS7002M_parameters.cpp - LMS7002M_statuses.cpp - LMS7002M_filtersCalibration.cpp - lmsComms.cpp - LMS7002M_RegistersMap.cpp -) - -set(ENABLE_USB_CONNECTION "YES" CACHE BOOL INTERNAL) -set(ENABLE_SPI_CONNECTION "NO" CACHE BOOL INTERNAL) -set(CONNECTION_MANAGER_DIR connectionManager) -set(connectionManager_src_files - ${CONNECTION_MANAGER_DIR}/ConnectionManager.cpp - ${CONNECTION_MANAGER_DIR}/ConnectionCOM.cpp - ${CONNECTION_MANAGER_DIR}/ConnectionManager.h - ${CONNECTION_MANAGER_DIR}/ConnectionCOM.h -) -if(ENABLE_USB_CONNECTION) - list(APPEND connectionManager_src_files ${CONNECTION_MANAGER_DIR}/ConnectionUSB.cpp ${CONNECTION_MANAGER_DIR}/ConnectionUSB.h) - add_definitions(-DENABLE_USB_CONNECTION) -endif() -if(ENABLE_SPI_CONNECTION) - list(APPEND connectionManager_src_files ${CONNECTION_MANAGER_DIR}/ConnectionSPI.cpp ${CONNECTION_MANAGER_DIR}/ConnectionSPI.h) - add_definitions(-DENABLE_SPI_CONNECTION) -endif() - -add_library(LMS7002M STATIC ${LMS7002M_src_files} ${connectionManager_src_files}) -target_include_directories(LMS7002M PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -if(WIN32 AND ENABLE_USB_CONNECTION) - find_package(CyAPI REQUIRED) - LINK_DIRECTORIES(${CYAPI_LIBRARIES}) - include_directories(${CYAPI_INCLUDE_DIRS}) - set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI) - target_link_libraries(LMS7002M ${CONNECTION_MANAGER_LIBS}) -endif() -if(UNIX AND ENABLE_USB_CONNECTION) - set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread) - target_link_libraries(LMS7002M ${CONNECTION_MANAGER_LIBS}) -endif() - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.cpp deleted file mode 100644 index ded70e114f..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.cpp +++ /dev/null @@ -1,2612 +0,0 @@ -/** -@file LMS7002M.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Implementation of LMS7002M transceiver configuring -*/ - -#include "LMS7002M.h" -#include -#include -#include "lmsComms.h" -#include "INI.h" -#include -#include -#include -#include "LMS7002M_RegistersMap.h" - -#include -#include - -float_type LMS7002M::gVCO_frequency_table[3][2] = { { 3800, 5222 }, { 4961, 6754 }, {6306, 7714} }; -float_type LMS7002M::gCGEN_VCO_frequencies[2] = {2000, 2700}; - -///define for parameter enumeration if prefix might be needed -#define LMS7param(id) id - -//module addresses needs to be sorted in ascending order -const uint16_t LMS7002M::readOnlyRegisters[] = { 0x002F, 0x008C, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x0123, 0x0209, 0x020A, 0x020B, 0x040E, 0x040F }; -const uint16_t LMS7002M::readOnlyRegistersMasks[] = { 0x0000, 0x0FFF, 0x007F, 0x0000, 0x0000, 0x0000, 0x0000, 0x003F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; - -/** @brief Simple logging function to print status messages - @param text message to print - @param type message type for filtering specific information -*/ -void LMS7002M::Log(const char* text, LogType type) -{ - switch(type) - { - case LOG_INFO: - printf("%s\n", text); - break; - case LOG_WARNING: - printf("Warning: %s\n", text); - break; - case LOG_ERROR: - printf("ERROR: %s\n", text); - break; - case LOG_DATA: - printf("DATA: %s\n", text); - break; - } -} - -LMS7002M::LMS7002M() : controlPort(NULL), mRegistersMap(new LMS7002M_RegistersMap()) -{ - mRefClkSXR_MHz = 30.72; - mRefClkSXT_MHz = 30.72; -} - -/** @brief Creates LMS7002M main control object, it requires LMScomms to communicate with chip - @param controlPort data connection for controlling LMS7002 chip registers -*/ -LMS7002M::LMS7002M(LMScomms* controlPort) : - controlPort(controlPort), mRegistersMap(new LMS7002M_RegistersMap()) -{ - mRefClkSXR_MHz = 30.72; - mRefClkSXT_MHz = 30.72; - - //memory intervals for registers tests and calibration algorithms - MemorySectionAddresses[LimeLight][0] = 0x0020; - MemorySectionAddresses[LimeLight][1] = 0x002F; - MemorySectionAddresses[EN_DIR][0] = 0x0081; - MemorySectionAddresses[EN_DIR][1] = 0x0081; - MemorySectionAddresses[AFE][0] = 0x0082; - MemorySectionAddresses[AFE][1] = 0x0082; - MemorySectionAddresses[BIAS][0] = 0x0084; - MemorySectionAddresses[BIAS][1] = 0x0084; - MemorySectionAddresses[XBUF][0] = 0x0085; - MemorySectionAddresses[XBUF][1] = 0x0085; - MemorySectionAddresses[CGEN][0] = 0x0086; - MemorySectionAddresses[CGEN][1] = 0x008C; - MemorySectionAddresses[LDO][0] = 0x0092; - MemorySectionAddresses[LDO][1] = 0x00A7; - MemorySectionAddresses[BIST][0] = 0x00A8; - MemorySectionAddresses[BIST][1] = 0x00AC; - MemorySectionAddresses[CDS][0] = 0x00AD; - MemorySectionAddresses[CDS][1] = 0x00AE; - MemorySectionAddresses[TRF][0] = 0x0100; - MemorySectionAddresses[TRF][1] = 0x0104; - MemorySectionAddresses[TBB][0] = 0x0105; - MemorySectionAddresses[TBB][1] = 0x010A; - MemorySectionAddresses[RFE][0] = 0x010C; - MemorySectionAddresses[RFE][1] = 0x0114; - MemorySectionAddresses[RBB][0] = 0x0115; - MemorySectionAddresses[RBB][1] = 0x011A; - MemorySectionAddresses[SX][0] = 0x011C; - MemorySectionAddresses[SX][1] = 0x0124; - MemorySectionAddresses[TxTSP][0] = 0x0200; - MemorySectionAddresses[TxTSP][1] = 0x020C; - MemorySectionAddresses[TxNCO][0] = 0x0240; - MemorySectionAddresses[TxNCO][1] = 0x0261; - MemorySectionAddresses[TxGFIR1][0] = 0x0280; - MemorySectionAddresses[TxGFIR1][1] = 0x02A7; - MemorySectionAddresses[TxGFIR2][0] = 0x02C0; - MemorySectionAddresses[TxGFIR2][1] = 0x02E7; - MemorySectionAddresses[TxGFIR3a][0] = 0x0300; - MemorySectionAddresses[TxGFIR3a][1] = 0x0327; - MemorySectionAddresses[TxGFIR3b][0] = 0x0340; - MemorySectionAddresses[TxGFIR3b][1] = 0x0367; - MemorySectionAddresses[TxGFIR3c][0] = 0x0380; - MemorySectionAddresses[TxGFIR3c][1] = 0x03A7; - MemorySectionAddresses[RxTSP][0] = 0x0400; - MemorySectionAddresses[RxTSP][1] = 0x040F; - MemorySectionAddresses[RxNCO][0] = 0x0440; - MemorySectionAddresses[RxNCO][1] = 0x0461; - MemorySectionAddresses[RxGFIR1][0] = 0x0480; - MemorySectionAddresses[RxGFIR1][1] = 0x04A7; - MemorySectionAddresses[RxGFIR2][0] = 0x04C0; - MemorySectionAddresses[RxGFIR2][1] = 0x04E7; - MemorySectionAddresses[RxGFIR3a][0] = 0x0500; - MemorySectionAddresses[RxGFIR3a][1] = 0x0527; - MemorySectionAddresses[RxGFIR3b][0] = 0x0540; - MemorySectionAddresses[RxGFIR3b][1] = 0x0567; - MemorySectionAddresses[RxGFIR3c][0] = 0x0580; - MemorySectionAddresses[RxGFIR3c][1] = 0x05A7; - - mRegistersMap->InitializeDefaultValues(LMS7parameterList); -} - -LMS7002M::~LMS7002M() -{ - -} - -/** @brief Sends reset signal to chip, after reset enables B channel controls - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::ResetChip() -{ - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_LMS7002_RST; - pkt.outBuffer.push_back(LMS_RST_PULSE); - controlPort->TransferPacket(pkt); - if (pkt.status == STATUS_COMPLETED_CMD) - { - Modify_SPI_Reg_bits(LMS7param(MIMO_SISO), 0); //enable B channel after reset - return LIBLMS7_SUCCESS; - } - else - return LIBLMS7_FAILURE; -} - -liblms7_status LMS7002M::LoadConfigLegacyFile(const char* filename) -{ - ifstream f(filename); - if (f.good() == false) //file not found - { - f.close(); - return LIBLMS7_FILE_NOT_FOUND; - } - f.close(); - uint16_t addr = 0; - uint16_t value = 0; - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel - liblms7_status status; - typedef INI ini_t; - ini_t parser(filename, true); - if (parser.select("FILE INFO") == false) - return LIBLMS7_FILE_INVALID_FORMAT; - - string type = ""; - type = parser.get("type", "undefined"); - stringstream ss; - if (type.find("LMS7002 configuration") == string::npos) - { - ss << "File " << filename << " not recognized" << endl; - return LIBLMS7_FILE_INVALID_FORMAT; - } - - int fileVersion = 0; - fileVersion = parser.get("version", 0); - - vector addrToWrite; - vector dataToWrite; - if (fileVersion == 1) - { - if (parser.select("Reference clocks")) - { - mRefClkSXR_MHz = parser.get("SXR reference frequency MHz", 30.72); - mRefClkSXT_MHz = parser.get("SXT reference frequency MHz", 30.72); - } - - if (parser.select("LMS7002 registers ch.A") == true) - { - ini_t::sectionsit_t section = parser.sections.find("LMS7002 registers ch.A"); - - uint16_t x0020_value = 0; - Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel - for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) - { - sscanf(pairs->first.c_str(), "%hx", &addr); - sscanf(pairs->second.c_str(), "%hx", &value); - if (addr == LMS7param(MAC).address) //skip register containing channel selection - { - x0020_value = value; - continue; - } - addrToWrite.push_back(addr); - dataToWrite.push_back(value); - } - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - - //parse FCW or PHO - if (parser.select("NCO Rx ch.A") == true) - { - char varname[64]; - int mode = Get_SPI_Reg_bits(LMS7param(MODE_RX)); - if (mode == 0) //FCW - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "FCW%02i", i); - SetNCOFrequency(LMS7002M::Rx, i, parser.get(varname, 0.0)); - } - } - else - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "PHO%02i", i); - SetNCOPhaseOffset(LMS7002M::Rx, i, parser.get(varname, 0.0)); - } - } - } - if (parser.select("NCO Tx ch.A") == true) - { - char varname[64]; - int mode = Get_SPI_Reg_bits(LMS7param(MODE_TX)); - if (mode == 0) //FCW - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "FCW%02i", i); - SetNCOFrequency(LMS7002M::Tx, i, parser.get(varname, 0.0)); - } - } - else - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "PHO%02i", i); - SetNCOPhaseOffset(LMS7002M::Tx, i, parser.get(varname, 0.0)); - } - } - } - status = SPI_write(0x0020, x0020_value); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - } - - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - - if (parser.select("LMS7002 registers ch.B") == true) - { - addrToWrite.clear(); - dataToWrite.clear(); - ini_t::sectionsit_t section = parser.sections.find("LMS7002 registers ch.B"); - for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) - { - sscanf(pairs->first.c_str(), "%hx", &addr); - sscanf(pairs->second.c_str(), "%hx", &value); - addrToWrite.push_back(addr); - dataToWrite.push_back(value); - } - Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - - //parse FCW or PHO - if (parser.select("NCO Rx ch.B") == true) - { - char varname[64]; - int mode = Get_SPI_Reg_bits(LMS7param(MODE_RX)); - if (mode == 0) //FCW - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "FCW%02i", i); - SetNCOFrequency(LMS7002M::Rx, i, parser.get(varname, 0.0)); - } - } - else - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "PHO%02i", i); - SetNCOPhaseOffset(LMS7002M::Rx, i, parser.get(varname, 0.0)); - } - } - } - if (parser.select("NCO Tx ch.A") == true) - { - char varname[64]; - int mode = Get_SPI_Reg_bits(LMS7param(MODE_TX)); - if (mode == 0) //FCW - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "FCW%02i", i); - SetNCOFrequency(LMS7002M::Tx, i, parser.get(varname, 0.0)); - } - } - else - { - for (int i = 0; i < 16; ++i) - { - sprintf(varname, "PHO%02i", i); - SetNCOPhaseOffset(LMS7002M::Tx, i, parser.get(varname, 0.0)); - } - } - } - } - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - return LIBLMS7_SUCCESS; - } - else - return LIBLMS7_FILE_INVALID_FORMAT; - return LIBLMS7_FAILURE; -} - -/** @brief Reads configuration file and uploads registers to chip - @param filename Configuration source file - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::LoadConfig(const char* filename) -{ - ifstream f(filename); - if (f.good() == false) //file not found - { - f.close(); - return LIBLMS7_FILE_NOT_FOUND; - } - f.close(); - uint16_t addr = 0; - uint16_t value = 0; - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel - - liblms7_status status; - typedef INI ini_t; - ini_t parser(filename, true); - if (parser.select("file_info") == false) - { - //try loading as legacy format - status = LoadConfigLegacyFile(filename); - Modify_SPI_Reg_bits(MAC, 1); - return status; - } - string type = ""; - type = parser.get("type", "undefined"); - stringstream ss; - if (type.find("lms7002m_minimal_config") == string::npos) - { - ss << "File " << filename << " not recognized" << endl; - return LIBLMS7_FILE_INVALID_FORMAT; - } - - int fileVersion = 0; - fileVersion = parser.get("version", 0); - - vector addrToWrite; - vector dataToWrite; - - if (fileVersion == 1) - { - if(parser.select("lms7002_registers_a") == true) - { - ini_t::sectionsit_t section = parser.sections.find("lms7002_registers_a"); - - uint16_t x0020_value = 0; - Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel - for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) - { - sscanf(pairs->first.c_str(), "%hx", &addr); - sscanf(pairs->second.c_str(), "%hx", &value); - if (addr == LMS7param(MAC).address) //skip register containing channel selection - { - x0020_value = value; - continue; - } - addrToWrite.push_back(addr); - dataToWrite.push_back(value); - } - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - status = SPI_write(0x0020, x0020_value); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - } - - if (parser.select("lms7002_registers_b") == true) - { - addrToWrite.clear(); - dataToWrite.clear(); - ini_t::sectionsit_t section = parser.sections.find("lms7002_registers_b"); - for (ini_t::keysit_t pairs = section->second->begin(); pairs != section->second->end(); pairs++) - { - sscanf(pairs->first.c_str(), "%hx", &addr); - sscanf(pairs->second.c_str(), "%hx", &value); - addrToWrite.push_back(addr); - dataToWrite.push_back(value); - } - Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS && status != LIBLMS7_NOT_CONNECTED) - return status; - } - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - - parser.select("reference_clocks"); - mRefClkSXR_MHz = parser.get("sxr_ref_clk_mhz", 30.72); - mRefClkSXT_MHz = parser.get("sxt_ref_clk_mhz", 30.72); - } - - Modify_SPI_Reg_bits(MAC, 1); - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - return LIBLMS7_SUCCESS; -} - -/** @brief Reads all registers from chip and saves to file - @param filename destination filename - @return 0-success, other failure -*/ -liblms7_status LMS7002M::SaveConfig(const char* filename) -{ - liblms7_status status; - typedef INI<> ini_t; - ini_t parser(filename, true); - parser.create("file_info"); - parser.set("type", "lms7002m_minimal_config"); - parser.set("version", 1); - - char addr[80]; - char value[80]; - - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - - vector addrToRead; - for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) - for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) - addrToRead.push_back(addr); - vector dataReceived; - dataReceived.resize(addrToRead.size(), 0); - - parser.create("lms7002_registers_a"); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - for (uint16_t i = 0; i < addrToRead.size(); ++i) - { - dataReceived[i] = Get_SPI_Reg_bits(addrToRead[i], 15, 0, false); - sprintf(addr, "0x%04X", addrToRead[i]); - sprintf(value, "0x%04X", dataReceived[i]); - parser.set(addr, value); - } - - parser.create("lms7002_registers_b"); - addrToRead.clear(); //add only B channel addresses - for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) - for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) - if (addr >= 0x0100) - addrToRead.push_back(addr); - - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - for (uint16_t i = 0; i < addrToRead.size(); ++i) - { - dataReceived[i] = Get_SPI_Reg_bits(addrToRead[i], 15, 0, false); - sprintf(addr, "0x%04X", addrToRead[i]); - sprintf(value, "0x%04X", dataReceived[i]); - parser.set(addr, value); - } - - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //retore previously used channel - - parser.create("reference_clocks"); - parser.set("sxt_ref_clk_mhz", mRefClkSXT_MHz); - parser.set("sxr_ref_clk_mhz", mRefClkSXR_MHz); - parser.save(filename); - return LIBLMS7_SUCCESS; -} - -/** @brief Returns reference clock in MHz used for SXT or SXR - @param Tx transmitter or receiver selection -*/ -float_type LMS7002M::GetReferenceClk_SX(bool tx) -{ - return tx ? mRefClkSXT_MHz : mRefClkSXR_MHz; -} - -/** @return Current CLKGEN frequency in MHz - Returned frequency depends on reference clock used for Receiver -*/ -float_type LMS7002M::GetFrequencyCGEN_MHz() -{ - float_type dMul = (mRefClkSXR_MHz/2.0)/(Get_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN))+1); //DIV_OUTCH_CGEN - uint16_t gINT = Get_SPI_Reg_bits(0x0088, 13, 0); //read whole register to reduce SPI transfers - uint32_t gFRAC = ((gINT & 0xF) * 65536) | Get_SPI_Reg_bits(0x0087, 15, 0); - return dMul * (((gINT>>4) + 1 + gFRAC/1048576.0)); -} - -/** @brief Returns TSP reference frequency - @param tx TxTSP or RxTSP selection - @return TSP reference frequency in MHz -*/ -float_type LMS7002M::GetReferenceClk_TSP_MHz(bool tx) -{ - float_type cgenFreq = GetFrequencyCGEN_MHz(); - float_type clklfreq = cgenFreq/pow(2.0, Get_SPI_Reg_bits(LMS7param(CLKH_OV_CLKL_CGEN))); - if(Get_SPI_Reg_bits(LMS7param(EN_ADCCLKH_CLKGN)) == 0) - return tx ? clklfreq : cgenFreq/4.0; - else - return tx ? cgenFreq : clklfreq/4.0; -} - -/** @brief Sets CLKGEN frequency, calculations use receiver'r reference clock - @param freq_MHz desired frequency in MHz - @return 0-succes, other-cannot deliver desired frequency -*/ -liblms7_status LMS7002M::SetFrequencyCGEN(const float_type freq_MHz) -{ - float_type dFvco; - float_type dFrac; - int16_t iHdiv; - - //VCO frequency selection according to F_CLKH - iHdiv = (int16_t)((gCGEN_VCO_frequencies[1]/ 2) / freq_MHz) - 1; - dFvco = 2*(iHdiv+1) * freq_MHz; - - //Integer division - uint16_t gINT = (uint16_t)(dFvco/mRefClkSXR_MHz - 1); - - //Fractional division - dFrac = dFvco/mRefClkSXR_MHz - (uint32_t)(dFvco/mRefClkSXR_MHz); - uint32_t gFRAC = (uint32_t)(dFrac * 1048576); - - Modify_SPI_Reg_bits(LMS7param(INT_SDM_CGEN), gINT); //INT_SDM_CGEN - Modify_SPI_Reg_bits(0x0087, 15, 0, gFRAC&0xFFFF); //INT_SDM_CGEN[15:0] - Modify_SPI_Reg_bits(0x0088, 3, 0, gFRAC>>16); //INT_SDM_CGEN[19:16] - Modify_SPI_Reg_bits(LMS7param(DIV_OUTCH_CGEN), iHdiv); //DIV_OUTCH_CGEN - - return TuneVCO(VCO_CGEN); -} - -/** @brief Performs VCO tuning operations for CLKGEN, SXR, SXT modules - @param module module selection for tuning 0-cgen, 1-SXR, 2-SXT - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::TuneVCO(VCO_Module module) // 0-cgen, 1-SXR, 2-SXT -{ - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - int8_t i; - uint8_t cmphl; //comparators - int16_t csw_lowest = -1; - uint16_t addrVCOpd; // VCO power down address - uint16_t addrCSW_VCO; - uint16_t addrCMP; //comparator address - uint8_t lsb; //SWC lsb index - uint8_t msb; //SWC msb index - - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel - - if(module != VCO_CGEN) //set addresses to SX module - { - Modify_SPI_Reg_bits(LMS7param(MAC), module); - addrVCOpd = LMS7param(PD_VCO).address; - addrCSW_VCO = LMS7param(CSW_VCO).address; - lsb = LMS7param(CSW_VCO).lsb; - msb = LMS7param(CSW_VCO).msb; - addrCMP = LMS7param(VCO_CMPHO).address; - } - else //set addresses to CGEN module - { - addrVCOpd = LMS7param(PD_VCO_CGEN).address; - addrCSW_VCO = LMS7param(CSW_VCO_CGEN).address; - lsb = LMS7param(CSW_VCO_CGEN).lsb; - msb = LMS7param(CSW_VCO_CGEN).msb; - addrCMP = LMS7param(VCO_CMPHO_CGEN).address; - } - // Initialization - Modify_SPI_Reg_bits (addrVCOpd, 2, 1, 0); //activate VCO and comparator - if (Get_SPI_Reg_bits(addrVCOpd, 2, 1) != 0) - return LIBLMS7_VCO_IS_POWERED_DOWN; - if(module == VCO_CGEN) - Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO_CGEN), 1); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time - else - Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO), 1); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time - Modify_SPI_Reg_bits (addrCSW_VCO , msb, lsb , 0); //Set SWC_VCO<7:0>=<00000000> - - i=7; - while(i>=0) - { - Modify_SPI_Reg_bits (addrCSW_VCO, lsb + i, lsb + i, 1); // CSW_VCO=1 - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - cmphl = (uint8_t)Get_SPI_Reg_bits(addrCMP, 13, 12); - if ( (cmphl&0x01) == 1) // reduce CSW - Modify_SPI_Reg_bits (addrCSW_VCO, lsb + i, lsb + i, 0); // CSW_VCO=0 - if( cmphl == 2 && csw_lowest < 0) - csw_lowest = Get_SPI_Reg_bits(addrCSW_VCO, msb, lsb); - --i; - } - if(csw_lowest >= 0) - { - uint16_t csw_highest = Get_SPI_Reg_bits(addrCSW_VCO, msb, lsb); - if(csw_lowest == csw_highest) - { - while(csw_lowest>=0) - { - Modify_SPI_Reg_bits(addrCSW_VCO, msb, lsb, csw_lowest); - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - if(Get_SPI_Reg_bits(addrCMP, 13, 12) == 0) - { - ++csw_lowest; - break; - } - else - --csw_lowest; - } - } - Modify_SPI_Reg_bits(addrCSW_VCO, msb, lsb, csw_lowest+(csw_highest-csw_lowest)/2); - } - if (module == VCO_CGEN) - Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO_CGEN), 0); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time - else - Modify_SPI_Reg_bits(LMS7param(SPDUP_VCO), 0); //SHORT_NOISEFIL=1 SPDUP_VCO_ Short the noise filter resistor to speed up the settling time - cmphl = (uint8_t)Get_SPI_Reg_bits(addrCMP, 13, 12); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore previously used channel - if(cmphl == 2) - return LIBLMS7_SUCCESS; - else - return LIBLMS7_FAILURE; -} - -/** @brief Returns given parameter value from chip register - @param param LMS7002M control parameter - @param fromChip read directly from chip - @return parameter value -*/ -uint16_t LMS7002M::Get_SPI_Reg_bits(const LMS7Parameter ¶m, bool fromChip) -{ - return Get_SPI_Reg_bits(param.address, param.msb, param.lsb, fromChip); -} - -/** @brief Returns given parameter value from chip register - @param address register address - @param msb most significant bit index - @param lsb least significant bit index - @param fromChip read directly from chip - @return register bits from selected interval, shifted to right by lsb bits -*/ -uint16_t LMS7002M::Get_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, bool fromChip) -{ - return (SPI_read(address, fromChip) & (~(~0<<(msb+1)))) >> lsb; //shift bits to LSB -} - -/** @brief Change given parameter value - @param param LMS7002M control parameter - @param fromChip read initial value directly from chip - @param value new parameter value -*/ -liblms7_status LMS7002M::Modify_SPI_Reg_bits(const LMS7Parameter ¶m, const uint16_t value, bool fromChip) -{ - return Modify_SPI_Reg_bits(param.address, param.msb, param.lsb, value, fromChip); -} - -/** @brief Change given parameter value - @param address register address - @param value new bits value, the value is shifted left by lsb bits - @param fromChip read initial value directly from chip -*/ -liblms7_status LMS7002M::Modify_SPI_Reg_bits(const uint16_t address, const uint8_t msb, const uint8_t lsb, const uint16_t value, bool fromChip) -{ - uint16_t spiDataReg = SPI_read(address, fromChip); //read current SPI reg data - uint16_t spiMask = (~(~0 << (msb - lsb + 1))) << (lsb); // creates bit mask - spiDataReg = (spiDataReg & (~spiMask)) | ((value << lsb) & spiMask);//clear bits - return SPI_write(address, spiDataReg); //write modified data back to SPI reg -} - -/** @brief Modifies given registers with values applied using masks - @param addr array of register addresses - @param masks array of applied masks - @param values array of values to be written - @param start starting index of given arrays - @param stop end index of given arrays -*/ -liblms7_status LMS7002M::Modify_SPI_Reg_mask(const uint16_t *addr, const uint16_t *masks, const uint16_t *values, uint8_t start, uint8_t stop) -{ - liblms7_status status; - uint16_t reg_data; - vector addresses; - vector data; - while (start <= stop) - { - reg_data = SPI_read(addr[start], true, &status); //read current SPI reg data - reg_data &= ~masks[start];//clear bits - reg_data |= (values[start] & masks[start]); - addresses.push_back(addr[start]); - data.push_back(reg_data); - ++start; - } - if (status != LIBLMS7_SUCCESS) - return status; - SPI_write_batch(&addresses[0], &data[0], addresses.size()); - return status; -} - -/** @brief Sets SX frequency - @param Tx Rx/Tx module selection - @param freq_MHz desired frequency in MHz - @param refClk_MHz reference clock in MHz - @return 0-success, other-cannot deliver requested frequency -*/ -liblms7_status LMS7002M::SetFrequencySX(bool tx, float_type freq_MHz, float_type refClk_MHz) -{ - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - const uint8_t sxVCO_N = 2; //number of entries in VCO frequencies - const float_type m_dThrF = 5500; //threshold to enable additional divider - uint8_t ch; //remember used channel - float_type VCOfreq; - int8_t div_loch; - int8_t sel_vco; - bool canDeliverFrequency = false; - uint16_t integerPart; - uint32_t fractionalPart; - int8_t i; - - //find required VCO frequency - for (div_loch = 6; div_loch >= 0; --div_loch) - { - VCOfreq = (1 << (div_loch + 1)) * freq_MHz; - if ((VCOfreq >= gVCO_frequency_table[0][0]) && (VCOfreq <= gVCO_frequency_table[2][sxVCO_N - 1])) - { - canDeliverFrequency = true; - break; - } - } - if (canDeliverFrequency == false) - return LIBLMS7_CANNOT_DELIVER_FREQUENCY; - - integerPart = (uint16_t)(VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))) - 4); - fractionalPart = (uint32_t)((VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))) - (uint32_t)(VCOfreq / (refClk_MHz * (1 + (VCOfreq > m_dThrF))))) * 1048576); - - ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - Modify_SPI_Reg_bits(LMS7param(MAC), tx + 1); - Modify_SPI_Reg_bits(LMS7param(INT_SDM), integerPart); //INT_SDM - Modify_SPI_Reg_bits(0x011D, 15, 0, fractionalPart & 0xFFFF); //FRAC_SDM[15:0] - Modify_SPI_Reg_bits(0x011E, 3, 0, (fractionalPart >> 16)); //FRAC_SDM[19:16] - Modify_SPI_Reg_bits(LMS7param(DIV_LOCH), div_loch); //DIV_LOCH - Modify_SPI_Reg_bits(LMS7param(EN_DIV2_DIVPROG), (VCOfreq > m_dThrF)); //EN_DIV2_DIVPROG - - //find which VCO supports required frequency - Modify_SPI_Reg_bits(LMS7param(PD_VCO), 0); // - Modify_SPI_Reg_bits(LMS7param(PD_VCO_COMP), 0); // - int cswBackup = Get_SPI_Reg_bits(LMS7param(CSW_VCO)); //remember to restore previous tune value - canDeliverFrequency = false; - int tuneScore[] = { -128, -128, -128 }; //best is closest to 0 - for (sel_vco = 0; sel_vco < 3; ++sel_vco) - { - Modify_SPI_Reg_bits(LMS7param(SEL_VCO), sel_vco); - liblms7_status status = TuneVCO(tx ? VCO_SXT : VCO_SXR); - int csw = Get_SPI_Reg_bits(LMS7param(CSW_VCO), true); - tuneScore[sel_vco] = -128 + csw; - if (status == LIBLMS7_SUCCESS) - canDeliverFrequency = true; - } - if (abs(tuneScore[0]) < abs(tuneScore[1])) - { - if (abs(tuneScore[0]) < abs(tuneScore[2])) - sel_vco = 0; - else - sel_vco = 2; - } - else - { - if (abs(tuneScore[1]) < abs(tuneScore[2])) - sel_vco = 1; - else - sel_vco = 2; - } - Modify_SPI_Reg_bits(LMS7param(SEL_VCO), sel_vco); - Modify_SPI_Reg_bits(LMS7param(CSW_VCO), cswBackup); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore used channel - if (tx) - mRefClkSXT_MHz = refClk_MHz; - else - mRefClkSXR_MHz = refClk_MHz; - if (canDeliverFrequency == false) - return LIBLMS7_CANNOT_DELIVER_FREQUENCY; - return TuneVCO( tx ? VCO_SXT : VCO_SXR); //Rx-1, Tx-2 -} - -/** @brief Returns currently set SXR/SXT frequency - @return SX frequency MHz -*/ -float_type LMS7002M::GetFrequencySX_MHz(bool Tx, float_type refClk_MHz) -{ - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember previously used channel - float_type dMul; - if(Tx) - Modify_SPI_Reg_bits(LMS7param(MAC), 2); // Rx mac = 1, Tx max = 2 - else - Modify_SPI_Reg_bits(LMS7param(MAC), 1); // Rx mac = 1, Tx max = 2 - uint16_t gINT = Get_SPI_Reg_bits(0x011E, 13, 0); // read whole register to reduce SPI transfers - uint32_t gFRAC = ((gINT&0xF) * 65536) | Get_SPI_Reg_bits(0x011D, 15, 0); - - dMul = (float_type)refClk_MHz / (1 << (Get_SPI_Reg_bits(LMS7param(DIV_LOCH)) + 1)); - //Calculate real frequency according to the calculated parameters - dMul = dMul * ((gINT >> 4) + 4 + (float_type)gFRAC / 1048576.0) * (Get_SPI_Reg_bits(LMS7param(EN_DIV2_DIVPROG)) + 1); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore used channel - return dMul; -} - -/** @brief Loads given DC_REG values into registers - @param tx TxTSP or RxTSP selection - @param I DC_REG I value - @param Q DC_REG Q value -*/ -liblms7_status LMS7002M::LoadDC_REG_IQ(bool tx, int16_t I, int16_t Q) -{ - if(tx) - { - Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), I); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_TXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), Q); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_TXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(DC_BYP_TXTSP), 0); //DC_BYP - } - else - { - Modify_SPI_Reg_bits(LMS7param(DC_REG_RXTSP), I); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDI_RXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(DC_REG_TXTSP), Q); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(TSGDCLDQ_RXTSP), 0); - Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); //DC_BYP - } - return LIBLMS7_SUCCESS; -} - -/** @brief Sets chosen NCO's frequency - @param tx transmitter or receiver selection - @param index NCO index from 0 to 15 - @param freq_MHz desired NCO frequency - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::SetNCOFrequency(bool tx, uint8_t index, float_type freq_MHz) -{ - if(index > 15) - return LIBLMS7_INDEX_OUT_OF_RANGE; - float_type refClk_MHz = GetReferenceClk_TSP_MHz(tx); - uint16_t addr = tx ? 0x0240 : 0x0440; - uint32_t fcw = (uint32_t)((freq_MHz/refClk_MHz)*4294967296); - SPI_write(addr+2+index*2, (fcw >> 16)); //NCO frequency control word register MSB part. - SPI_write(addr+3+index*2, fcw); //NCO frequency control word register LSB part. - return LIBLMS7_SUCCESS; -} - -/** @brief Returns chosen NCO's frequency in MHz - @param tx transmitter or receiver selection - @param index NCO index from 0 to 15 - @param fromChip read frequency directly from chip or local registers - @return NCO frequency in MHz -*/ -float_type LMS7002M::GetNCOFrequency_MHz(bool tx, uint8_t index, const float_type refClk_MHz, bool fromChip) -{ - if(index > 15) - return LIBLMS7_INDEX_OUT_OF_RANGE; - uint16_t addr = tx ? 0x0240 : 0x0440; - uint32_t fcw = 0; - fcw |= SPI_read(addr + 2 + index * 2, fromChip) << 16; //NCO frequency control word register MSB part. - fcw |= SPI_read(addr + 3 + index * 2, fromChip); //NCO frequency control word register LSB part. - return refClk_MHz*(fcw/4294967296.0); -} - -/** @brief Sets chosen NCO phase offset angle when memory table MODE is 0 -@param tx transmitter or receiver selection -@param angle_deg phase offset angle in degrees -@return 0-success, other-failure -*/ -liblms7_status LMS7002M::SetNCOPhaseOffsetForMode0(bool tx, float_type angle_deg) -{ - uint16_t addr = tx ? 0x0241 : 0x0441; - uint16_t pho = (uint16_t)(65536 * (angle_deg / 360 )); - SPI_write(addr, pho); - return LIBLMS7_SUCCESS; -} - -/** @brief Sets chosen NCO's phase offset angle - @param tx transmitter or receiver selection - @param index PHO index from 0 to 15 - @param angle_deg phase offset angle in degrees - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::SetNCOPhaseOffset(bool tx, uint8_t index, float_type angle_deg) -{ - if(index > 15) - return LIBLMS7_INDEX_OUT_OF_RANGE; - uint16_t addr = tx ? 0x0244 : 0x0444; - uint16_t pho = (uint16_t)(65536*(angle_deg / 360)); - SPI_write(addr+index, pho); - return LIBLMS7_SUCCESS; -} - -/** @brief Returns chosen NCO's phase offset angle in radians - @param tx transmitter or receiver selection - @param index PHO index from 0 to 15 - @return phase offset angle in degrees -*/ -float_type LMS7002M::GetNCOPhaseOffset_Deg(bool tx, uint8_t index) -{ - uint16_t addr = tx ? 0x0244 : 0x0444; - uint16_t pho = SPI_read(addr+index); - float_type angle = 360*pho/65536.0; - return angle; -} - -/** @brief Uploads given FIR coefficients to chip - @param tx Transmitter or receiver selection - @param GFIR_index GIR index from 0 to 2 - @param coef array of coefficients - @param coefCount number of coefficients - @return 0-success, other-failure - - This function does not change GFIR*_L or GFIR*_N parameters, they have to be set manually -*/ -liblms7_status LMS7002M::SetGFIRCoefficients(bool tx, uint8_t GFIR_index, const int16_t *coef, uint8_t coefCount) -{ - uint8_t index; - uint8_t coefLimit; - uint16_t startAddr; - if (GFIR_index == 0) - startAddr = 0x0280; - else if (GFIR_index == 1) - startAddr = 0x02C0; - else - startAddr = 0x0300; - - if (tx == false) - startAddr += 0x0200; - if (GFIR_index < 2) - coefLimit = 40; - else - coefLimit = 120; - if (coefCount > coefLimit) - return LIBLMS7_TOO_MANY_VALUES; - vector addresses; - for (index = 0; index < coefCount; ++index) - addresses.push_back(startAddr + index + 24 * (index / 40)); - SPI_write_batch(&addresses[0], (uint16_t*)coef, coefCount); - return LIBLMS7_SUCCESS; -} - -/** @brief Returns currently loaded FIR coefficients - @param tx Transmitter or receiver selection - @param GFIR_index GIR index from 0 to 2 - @param coef array of returned coefficients - @param coefCount number of coefficients to read - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::GetGFIRCoefficients(bool tx, uint8_t GFIR_index, int16_t *coef, uint8_t coefCount) -{ - liblms7_status status = LIBLMS7_FAILURE; - uint8_t index; - uint8_t coefLimit; - uint16_t startAddr; - if(GFIR_index == 0) - startAddr = 0x0280; - else if (GFIR_index == 1) - startAddr = 0x02C0; - else - startAddr = 0x0300; - - if (tx == false) - startAddr += 0x0200; - if (GFIR_index < 2) - coefLimit = 40; - else - coefLimit = 120; - if (coefCount > coefLimit) - return LIBLMS7_TOO_MANY_VALUES; - - std::vector addresses; - for (index = 0; index < coefCount; ++index) - addresses.push_back(startAddr + index + 24 * (index / 40)); - uint16_t spiData[120]; - memset(spiData, 0, 120 * sizeof(uint16_t)); - if (controlPort->IsOpen()) - { - status = SPI_read_batch(&addresses[0], spiData, coefCount); - for (index = 0; index < coefCount; ++index) - coef[index] = spiData[index]; - } - else - { - const int channel = Get_SPI_Reg_bits(LMS7param(MAC), false) > 1 ? 1 : 0; - for (index = 0; index < coefCount; ++index) - coef[index] = mRegistersMap->GetValue(channel, addresses[index]); - status = LIBLMS7_SUCCESS; - } - - return status; -} - -/** @brief Write given data value to whole register - @param address SPI address - @param data new register value - @return 0-succes, other-failure -*/ -liblms7_status LMS7002M::SPI_write(uint16_t address, uint16_t data) -{ - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - - if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1 && address >= 0x0100) - mRegistersMap->SetValue(1, address, data); - else - mRegistersMap->SetValue(0, address, data); - - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_LMS7002_WR; - pkt.outBuffer.push_back(address >> 8); - pkt.outBuffer.push_back(address & 0xFF); - pkt.outBuffer.push_back(data >> 8); - pkt.outBuffer.push_back(data & 0xFF); - controlPort->TransferPacket(pkt); - if (pkt.status == STATUS_COMPLETED_CMD) - return LIBLMS7_SUCCESS; - else - return LIBLMS7_FAILURE; -} - -/** @brief Reads whole register value from given address - @param address SPI address - @param status operation status(optional) - @param fromChip read value directly from chip - @return register value -*/ -uint16_t LMS7002M::SPI_read(uint16_t address, bool fromChip, liblms7_status *status) -{ - if (controlPort == NULL) - { - if (status) - *status = LIBLMS7_NO_CONNECTION_MANAGER; - } - if (controlPort->IsOpen() == false || fromChip == false) - { - if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1 && address >= 0x0100) - return mRegistersMap->GetValue(1, address); - else - return mRegistersMap->GetValue(0, address); - } - - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_LMS7002_RD; - pkt.outBuffer.push_back(address >> 8); - pkt.outBuffer.push_back(address & 0xFF); - if (controlPort->TransferPacket(pkt) == LMScomms::TRANSFER_SUCCESS) - { - if (status) - *status = (pkt.status == STATUS_COMPLETED_CMD ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE); - return (pkt.inBuffer[2] << 8) | pkt.inBuffer[3]; - } - else - return 0; -} - -/** @brief Batches multiple register writes into least ammount of transactions - @param spiAddr spi register addresses to be written - @param spiData registers data to be written - @param cnt number of registers to write - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::SPI_write_batch(const uint16_t* spiAddr, const uint16_t* spiData, uint16_t cnt) -{ - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_LMS7002_WR; - uint32_t index = 0; - for (uint32_t i = 0; i < cnt; ++i) - { - pkt.outBuffer.push_back(spiAddr[i] >> 8); - pkt.outBuffer.push_back(spiAddr[i] & 0xFF); - pkt.outBuffer.push_back(spiData[i] >> 8); - pkt.outBuffer.push_back(spiData[i] & 0xFF); - - if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1) - mRegistersMap->SetValue(1, spiAddr[i], spiData[i]); - else - mRegistersMap->SetValue(0, spiAddr[i], spiData[i]); - - } - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - controlPort->TransferPacket(pkt); - if (pkt.status == STATUS_COMPLETED_CMD) - return LIBLMS7_SUCCESS; - else - return LIBLMS7_FAILURE; -} - -/** @brief Batches multiple register reads into least amount of transactions - @param spiAddr SPI addresses to read - @param spiData array for read data - @param cnt number of registers to read - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::SPI_read_batch(const uint16_t* spiAddr, uint16_t* spiData, uint16_t cnt) -{ - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_LMS7002_RD; - uint32_t index = 0; - for (uint32_t i = 0; i < cnt; ++i) - { - pkt.outBuffer.push_back(spiAddr[i] >> 8); - pkt.outBuffer.push_back(spiAddr[i] & 0xFF); - } - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - LMScomms::TransferStatus status = controlPort->TransferPacket(pkt); - if (status != LMScomms::TRANSFER_SUCCESS) - return LIBLMS7_FAILURE; - - for (uint32_t i = 0; i < cnt; ++i) - { - spiData[i] = (pkt.inBuffer[2*sizeof(uint16_t)*i + 2] << 8) | pkt.inBuffer[2*sizeof(uint16_t)*i + 3]; - if ((mRegistersMap->GetValue(0, LMS7param(MAC).address) & 0x0003) > 1) - mRegistersMap->SetValue(1, spiAddr[i], spiData[i]); - else - mRegistersMap->SetValue(0, spiAddr[i], spiData[i]); - } - return pkt.status == STATUS_COMPLETED_CMD ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; - /* - for(int i=0; iGetValue(0, LMS7param(MAC).address) & 0x0003) > 1) - mRegistersMap->SetValue(1, spiAddr[i], spiData[i]); - else - mRegistersMap->SetValue(0, spiAddr[i], spiData[i]); - } - return LIBLMS7_SUCCESS;*/ -} - -/** @brief Performs registers test by writing known data and confirming readback data - @return 0-registers test passed, other-failure -*/ -liblms7_status LMS7002M::RegistersTest() -{ - char chex[16]; - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - liblms7_status status; - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - - //backup both channel data for restoration after test - vector ch1Addresses; - for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) - for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) - ch1Addresses.push_back(addr); - vector ch1Data; - ch1Data.resize(ch1Addresses.size(), 0); - - //backup A channel - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - status = SPI_read_batch(&ch1Addresses[0], &ch1Data[0], ch1Addresses.size()); - if (status != LIBLMS7_SUCCESS) - return status; - - vector ch2Addresses; - for (uint8_t i = 0; i < MEMORY_SECTIONS_COUNT; ++i) - for (uint16_t addr = MemorySectionAddresses[i][0]; addr <= MemorySectionAddresses[i][1]; ++addr) - if (addr >= 0x0100) - ch2Addresses.push_back(addr); - vector ch2Data; - ch2Data.resize(ch2Addresses.size(), 0); - - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - status = SPI_read_batch(&ch2Addresses[0], &ch2Data[0], ch2Addresses.size()); - if (status != LIBLMS7_SUCCESS) - return status; - - //test registers - ResetChip(); - Modify_SPI_Reg_bits(LMS7param(MIMO_SISO), 0); - Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); - Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - - stringstream ss; - - //check single channel memory sections - vector modulesToCheck = { AFE, BIAS, XBUF, CGEN, LDO, BIST, CDS, TRF, TBB, RFE, RBB, SX, - TxTSP, TxNCO, TxGFIR1, TxGFIR2, TxGFIR3a, TxGFIR3b, TxGFIR3c, - RxTSP, RxNCO, RxGFIR1, RxGFIR2, RxGFIR3a, RxGFIR3b, RxGFIR3c, LimeLight }; - const char* moduleNames[] = { "AFE", "BIAS", "XBUF", "CGEN", "LDO", "BIST", "CDS", "TRF", "TBB", "RFE", "RBB", "SX", - "TxTSP", "TxNCO", "TxGFIR1", "TxGFIR2", "TxGFIR3a", "TxGFIR3b", "TxGFIR3c", - "RxTSP", "RxNCO", "RxGFIR1", "RxGFIR2", "RxGFIR3a", "RxGFIR3b", "RxGFIR3c", "LimeLight" }; - - const uint16_t patterns[] = { 0xAAAA, 0x5555 }; - const uint8_t patternsCount = 2; - - bool allTestSuccess = true; - - for (unsigned i = 0; i < modulesToCheck.size(); ++i) - { - bool moduleTestsSuccess = true; - uint16_t startAddr = MemorySectionAddresses[modulesToCheck[i]][0]; - uint16_t endAddr = MemorySectionAddresses[modulesToCheck[i]][1]; - uint8_t channelCount = startAddr >= 0x0100 ? 2 : 1; - for (int cc = 1; cc <= channelCount; ++cc) - { - Modify_SPI_Reg_bits(LMS7param(MAC), cc); - sprintf(chex, "0x%04X", startAddr); - ss << moduleNames[i] << " [" << chex << ":"; - sprintf(chex, "0x%04X", endAddr); - ss << chex << "]"; - if (startAddr >= 0x0100) - ss << " Ch." << (cc == 1 ? "A" : "B"); - ss << endl; - for (uint8_t p = 0; p < patternsCount; ++p) - moduleTestsSuccess &= RegistersTestInterval(startAddr, endAddr, patterns[p], ss) == LIBLMS7_SUCCESS; - } - allTestSuccess &= moduleTestsSuccess; - } - - //restore register values - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - SPI_write_batch(&ch1Addresses[0], &ch1Data[0], ch1Addresses.size()); - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - SPI_write_batch(&ch2Addresses[0], &ch2Data[0], ch2Addresses.size()); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - - fstream fout; - fout.open("registersTest.txt", ios::out); - fout << ss.str() << endl; - fout.close(); - - return allTestSuccess ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; -} - -/** @brief Performs registers test for given address interval by writing given pattern data - @param startAddr first register address - @param endAddr last reigster address - @param pattern data to be written into registers - @return 0-register test passed, other-failure -*/ -liblms7_status LMS7002M::RegistersTestInterval(uint16_t startAddr, uint16_t endAddr, uint16_t pattern, stringstream &ss) -{ - vector addrToWrite; - vector dataToWrite; - vector dataReceived; - vector dataMasks; - - for (uint16_t addr = startAddr; addr <= endAddr; ++addr) - { - addrToWrite.push_back(addr); - } - dataMasks.resize(addrToWrite.size(), 0xFFFF); - for (uint16_t j = 0; j < sizeof(readOnlyRegisters)/sizeof(uint16_t); ++j) - for (uint16_t k = 0; k < addrToWrite.size(); ++k) - if (readOnlyRegisters[j] == addrToWrite[k]) - { - dataMasks[k] = readOnlyRegistersMasks[j]; - break; - } - - dataToWrite.clear(); - dataReceived.clear(); - for (uint16_t j = 0; j < addrToWrite.size(); ++j) - { - if (addrToWrite[j] == 0x00A6) - dataToWrite.push_back(0x1 | pattern & ~0x2); - else if (addrToWrite[j] == 0x0084) - dataToWrite.push_back(pattern & ~0x19); - else - dataToWrite.push_back(pattern & dataMasks[j]); - } - dataReceived.resize(addrToWrite.size(), 0); - liblms7_status status; - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS) - return status; - status = SPI_read_batch(&addrToWrite[0], &dataReceived[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS) - return status; - bool registersMatch = true; - char ctemp[16]; - for (uint16_t j = 0; j < dataToWrite.size(); ++j) - { - if (dataToWrite[j] != (dataReceived[j] & dataMasks[j])) - { - registersMatch = false; - sprintf(ctemp, "0x%04X", addrToWrite[j]); - ss << "\t" << ctemp << "(wr/rd): "; - sprintf(ctemp, "0x%04X", dataToWrite[j]); - ss << ctemp << "/"; - sprintf(ctemp, "0x%04X", dataReceived[j]); - ss << ctemp << endl; - } - } - if (registersMatch) - { - sprintf(ctemp, "0x%04X", pattern); - ss << "\tRegisters OK (" << ctemp << ")\n"; - } - return registersMatch ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; -} - -/** @brief Parameters setup instructions for Tx calibration - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::CalibrateTxSetup(float_type bandwidth_MHz) -{ - //Stage 2 - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - uint8_t sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); - uint8_t sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); - - //rfe - //reset RFE to defaults - SetDefaults(RFE); - if (sel_band1_trf == 1) - Modify_SPI_Reg_bits(LMS7param(SEL_PATH_RFE), 3); //SEL_PATH_RFE 3 - else if (sel_band2_trf == 1) - Modify_SPI_Reg_bits(LMS7param(SEL_PATH_RFE), 2); - else - return LIBLMS7_BAND_NOT_SELECTED; - - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTRX_RFE), 1); // EN_NEXTTX_RFE 1 - - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), 8); //G_RXLOOPB_RFE 8 - Modify_SPI_Reg_bits(0x010C, 4, 3, 0); //PD_MXLOBUF_RFE 0, PD_QGEN_RFE 0 - Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), 10); //CCOMP_TIA_RFE 10 - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), 2600); //CFB_TIA_RFE 2600 - Modify_SPI_Reg_bits(LMS7param(ICT_LODC_RFE), 31); //ICT_LODC_RFE 31 - Modify_SPI_Reg_bits(LMS7param(PD_LNA_RFE), 1); - - //RBB - //reset RBB to defaults - SetDefaults(RBB); - Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 0); //PD_LPFL_RBB 0 - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 0); //RCC_CTL_LPFL_RBB 0 - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), 1500); //C_CTL_LPFL_RBB 1500 - Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB), 22); //G_PGA_RBB 22 - - //TRF - //reset TRF to defaults - //SetDefaults(TRF); - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 0); //L_LOOPB_TXPAD_TRF 0 - Modify_SPI_Reg_bits(LMS7param(EN_LOOPB_TXPAD_TRF), 1); //EN_LOOPB_TXPAD_TRF 1 - Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 0); //EN_G_TRF 0 - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); //EN_NEXTTX_TRF 1 - Modify_SPI_Reg_bits(LMS7param(LOSS_LIN_TXPAD_TRF), 0); //LOSS_LIN_TXPAD_TRF 5 - Modify_SPI_Reg_bits(LMS7param(LOSS_MAIN_TXPAD_TRF), 0); //LOSS_MAIN_TXPAD_TRF 5 - - //TBB - //reset TBB to defaults - /*SetDefaults(TBB); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 9); //CG_IAMP_TBB 9 - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); //ICT_IAMP_FRP_TBB 1 - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); //ICT_IAMP_GG_FRP_TBB 6 - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), 125); //RCAL_LPFH_TBB 0 - */ - //AFE - //reset AFE to defaults - uint8_t isel_dac_afe =(uint8_t) Get_SPI_Reg_bits(LMS7param(ISEL_DAC_AFE)); - SetDefaults(AFE); - Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); //PD_RX_AFE2 0 - Modify_SPI_Reg_bits(LMS7param(ISEL_DAC_AFE), isel_dac_afe); - - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); - //BIAS - uint16_t backup = Get_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS)); - SetDefaults(BIAS); - Modify_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS), backup); //RP_CALIB_BIAS - - //XBUF - Modify_SPI_Reg_bits(0x0085, 2, 0, 1); //PD_XBUF_RX 0, PD_XBUF_TX 0, EN_G_XBUF 1 - - //CGEN - //reset CGEN to defaults - SetDefaults(CGEN); - //power up VCO - Modify_SPI_Reg_bits(LMS7param(PD_VCO_CGEN), 0); - - if (SetFrequencyCGEN(122.88) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - if (TuneVCO(VCO_CGEN) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - - //SXR - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - SetDefaults(SX); - float_type SXTfreqMHz = GetFrequencySX_MHz(Tx, mRefClkSXT_MHz); - - float_type SXRfreqMHz = SXTfreqMHz - bandwidth_MHz / 4 - 1; - if (SetFrequencySX(Rx, SXRfreqMHz, mRefClkSXR_MHz) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - if (TuneVCO(VCO_SXR) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - - //SXT - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - Modify_SPI_Reg_bits(LMS7param(PD_LOCH_T2RBUF), 1); //PD_LOCH_T2RBUF 1 - if (SetFrequencySX(Tx, SXTfreqMHz, mRefClkSXT_MHz) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - if (TuneVCO(VCO_SXT) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - - //TXTSP - SetDefaults(TxTSP); - Modify_SPI_Reg_bits(0x0200, 3, 2, 0x3); //TSGMODE 1, INSEL 1 - Modify_SPI_Reg_bits(0x0208, 6, 4, 0x7); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 - LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - Modify_SPI_Reg_bits(0x0440, 4, 0, 0); //TX SEL[3:0] = 0 & MODE = 0 - - float_type offset = 0.2; - if (bandwidth_MHz == 8) - { - //SXR - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - SetDefaults(SX); - float_type SXTfreqMHz = GetFrequencySX_MHz(Tx, mRefClkSXT_MHz); - - float_type sxrFreq = SXTfreqMHz - bandwidth_MHz / 4 - 1 - offset; - if (SetFrequencySX(Rx, sxrFreq, mRefClkSXR_MHz) != LIBLMS7_SUCCESS) - return LIBLMS7_FAILURE; - SetNCOFrequency(Tx, 0, bandwidth_MHz / 4 + offset); - } - else - SetNCOFrequency(Tx, 0, bandwidth_MHz / 4); - - //RXTSP - SetDefaults(RxTSP); - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); //AGC_MODE 1 - Modify_SPI_Reg_bits(0x040C, 7, 0, 0xBF); - Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); - Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 0); //Decimation HBD ratio - Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 0x7); //agc_avg iq corr - - return LIBLMS7_SUCCESS; -} - -/** @brief Flips the CAPTURE bit and returns digital RSSI value -*/ -uint32_t LMS7002M::GetRSSI() -{ - Modify_SPI_Reg_bits(LMS7param(CAPTURE), 0); - Modify_SPI_Reg_bits(LMS7param(CAPTURE), 1); - return (Get_SPI_Reg_bits(0x040F, 15, 0) << 2) | Get_SPI_Reg_bits(0x040E, 1, 0); -} - -/** @brief Sets Rx Dc offsets by converting two's complementary numbers to sign and magnitude -*/ -void LMS7002M::SetRxDCOFF(int8_t offsetI, int8_t offsetQ) -{ - uint16_t valToSend = 0; - if (offsetI < 0) - valToSend |= 0x40; - valToSend |= labs(offsetI); - valToSend = valToSend << 7; - if (offsetQ < 0) - valToSend |= 0x40; - valToSend |= labs(offsetQ); - SPI_write(0x010E, valToSend); -} - -/** @brief Calibrates Transmitter. DC correction, IQ gains, IQ phase correction - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::CalibrateTx(float_type bandwidth_MHz) -{ - liblms7_status status; - Log("Tx calibration started", LOG_INFO); - BackupAllRegisters(); - - int16_t iqcorr = 0; - uint16_t gcorrq = 0; - uint16_t gcorri = 0; - uint16_t dccorri; - uint16_t dccorrq; - int16_t corrI = 0; - int16_t corrQ = 0; - uint32_t minRSSI_i; - uint32_t minRSSI_q; - uint32_t minRSSI_iq; - int16_t i; - int16_t offsetI = 0; - int16_t offsetQ = 0; - - const short firCoefs[] = - { - -2531, - -517, - 2708, - 188, - -3059, - 216, - 3569, - -770, - -4199, - 1541, - 4886, - -2577, - -5552, - 3909, - 6108, - -5537, - -6457, - 7440, - 6507, - -9566, - -6174, - 11845, - 5391, - -14179, - -4110, - 16457, - 2310, - -18561, - 0, - 20369, - -2780, - -21752, - 5963, - 22610, - -9456, - -22859, - 13127, - 22444, - -16854, - -21319, - 20489, - 19492, - -23883, - -17002, - 26881, - 13902, - -29372, - -10313, - 31226, - 6345, - -32380, - -2141, - 32767, - -2141, - -32380, - 6345, - 31226, - -10313, - -29372, - 13902, - 26881, - -17002, - -23883, - 19492, - 20489, - -21319, - -16854, - 22444, - 13127, - -22859, - -9456, - 22610, - 5963, - -21752, - -2780, - 20369, - 0, - -18561, - 2310, - 16457, - -4110, - -14179, - 5391, - 11845, - -6174, - -9566, - 6507, - 7440, - -6457, - -5537, - 6108, - 3909, - -5552, - -2577, - 4886, - 1541, - -4199, - -770, - 3569, - 216, - -3059, - 188, - 2708, - -517, - -2531 - }; - - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - //Stage 1 - uint8_t sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); - uint8_t sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); - Log("Setup stage", LOG_INFO); - status = CalibrateTxSetup(bandwidth_MHz); - if (status != LIBLMS7_SUCCESS) - goto TxCalibrationEnd; //go to ending stage to restore registers - - //Stage 3 - //Calibrate Rx DC - Log("Rx DC calibration", LOG_INFO); - { - uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C }; - uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses - uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD }; - - Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3); - } - - for (i = 0; i<6; ++i) - { - FindMinRSSI(LMS7param(DCOFFI_RFE), offsetI, &offsetI, 3, 2, 32 >> i); - FindMinRSSI(LMS7param(DCOFFQ_RFE), offsetQ, &offsetQ, 3, 2, 32 >> i); - } - SetRxDCOFF((int8_t)offsetI, (int8_t)offsetQ); - Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); // DC_BYP 0 - - sel_band1_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF)); - sel_band2_trf = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)); - //B - Modify_SPI_Reg_bits(0x0100, 0, 0, 1); //EN_G_TRF 1 - if (sel_band1_trf == 1) - { - Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_1_RFE), 0); //PD_RLOOPB_1_RFE 0 - Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB1_RFE), 0); //EN_INSHSW_LB1 0 - } - if (sel_band2_trf == 1) - { - Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); //PD_RLOOPB_2_RFE 0 - Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); // EN_INSHSW_LB2 0 - } - FixRXSaturation(); - - Modify_SPI_Reg_bits(LMS7param(GFIR3_BYP_RXTSP), 0); //GFIR3_BYP 0 - Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2); - Modify_SPI_Reg_bits(LMS7param(GFIR3_L_RXTSP), 7); - Modify_SPI_Reg_bits(LMS7param(GFIR3_N_RXTSP), 7); - - SetGFIRCoefficients(Rx, 2, firCoefs, sizeof(firCoefs) / sizeof(int16_t)); - - Log("IQ correction stage", LOG_INFO); - Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), 2047); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), 2047); - - Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), 0); - - Log("I gain", LOG_INFO); - minRSSI_i = FindMinRSSI_Gain(LMS7param(GCORRI_TXTSP), &gcorri); - - Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), 2047); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), 2047); - - Log("Q gain", LOG_INFO); - minRSSI_q = FindMinRSSI_Gain(LMS7param(GCORRQ_TXTSP), &gcorrq); - - if (minRSSI_i < minRSSI_q) - gcorrq = 2047; - else - gcorri = 2047; - - Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq); - - Log("Phase", LOG_INFO); - iqcorr = 0; - for (uint8_t i = 0; i<9; ++i) - minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_TXTSP), iqcorr, &iqcorr, 3, 1, 256 >> i); - - Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq); - Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), iqcorr); - - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz)-1, mRefClkSXR_MHz); - if (status != LIBLMS7_SUCCESS) - goto TxCalibrationEnd; //go to ending stage to restore registers - - //C - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); - - Log("TX LO calibration", LOG_INFO); - - //Calibrate Tx DC - for (uint8_t i = 0; i<7; ++i) - { - FindMinRSSI(LMS7param(DCCORRI_TXTSP), corrI, &corrI, 3, 1, 64 >> i); - FindMinRSSI(LMS7param(DCCORRQ_TXTSP), corrQ, &corrQ, 3, 1, 64 >> i); - } - - dccorri = Get_SPI_Reg_bits(LMS7param(DCCORRI_TXTSP)); - dccorrq = Get_SPI_Reg_bits(LMS7param(DCCORRQ_TXTSP)); - - // Stage 4 -TxCalibrationEnd: - Log("Restoring registers state", LOG_INFO); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - RestoreAllRegisters(); - if (status != LIBLMS7_SUCCESS) - { - Log("Tx calibration failed", LOG_WARNING); - return status; - } - - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - Modify_SPI_Reg_bits(LMS7param(DCCORRI_TXTSP), dccorri); - Modify_SPI_Reg_bits(LMS7param(DCCORRQ_TXTSP), dccorrq); - Modify_SPI_Reg_bits(LMS7param(GCORRI_TXTSP), gcorri); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_TXTSP), gcorrq); - Modify_SPI_Reg_bits(LMS7param(IQCORR_TXTSP), iqcorr); - - Modify_SPI_Reg_bits(LMS7param(DC_BYP_TXTSP), 0); //DC_BYP - Modify_SPI_Reg_bits(0x0208, 1, 0, 0); //GC_BYP PH_BYP - Log("Tx calibration finished", LOG_INFO); - return LIBLMS7_SUCCESS; -} - -/** @brief Performs Rx DC offsets calibration -*/ -void LMS7002M::CalibrateRxDC_RSSI() -{ - int16_t i; - int16_t offsetI = 0; - int16_t offsetQ = 0; - uint16_t requiredRegs[] = { 0x0400, 0x040A, 0x010D, 0x040C }; - uint16_t requiredMask[] = { 0x6000, 0x3007, 0x0040, 0x00FF }; //CAPSEL, AGC_MODE, AGC_AVG, EN_DCOFF, Bypasses - uint16_t requiredValue[] = { 0x0000, 0x1007, 0x0040, 0x00BD }; - - Modify_SPI_Reg_mask(requiredRegs, requiredMask, requiredValue, 0, 3); - for (i = 0; i<6; ++i) - { - FindMinRSSI(LMS7param(DCOFFI_RFE), offsetI, &offsetI, 3, 2, 32 >> i); - FindMinRSSI(LMS7param(DCOFFQ_RFE), offsetQ, &offsetQ, 3, 2, 32 >> i); - } - Modify_SPI_Reg_bits(LMS7param(EN_DCOFF_RXFE_RFE), 1); - SetRxDCOFF((int8_t)offsetI, (int8_t)offsetQ); - Modify_SPI_Reg_bits(LMS7param(DC_BYP_RXTSP), 0); // DC_BYP 0 -} - -/** @brief Tries to detect and fix gains if Rx is saturated - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::FixRXSaturation() -{ - uint8_t g_rxloopb = 0; - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb); - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 3); - - int8_t lLoopb = 3; - const uint32_t rssi_saturation_level = 0xD000; - while (g_rxloopb < 15) - { - g_rxloopb += 1; - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb); - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 3); - if (GetRSSI() < rssi_saturation_level) - { - for (lLoopb = 3; lLoopb >= 0; --lLoopb) - { - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), lLoopb); - if (GetRSSI() > rssi_saturation_level) - { - ++lLoopb; - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), lLoopb); - goto finished; - } - } - } - else - { - g_rxloopb -= 1; - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), g_rxloopb); - break; - } - } -finished: - return GetRSSI() < rssi_saturation_level ? LIBLMS7_SUCCESS : LIBLMS7_FAILURE; -} - -uint32_t LMS7002M::FindMinRSSI(const LMS7Parameter ¶m, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult) -{ - return FindMinRSSI(param.address, param.msb, param.lsb, startValue, result, scanWidth, twoCompl, stepMult); -} - -/** @brief Searches for minimal RSSI value while changing given address bits -@param addr address of parameter being changed -@param msb most significant bit index -@param lsb least significant bit index -@param startValue initial value where to start search -@param result found minimal parameter value will be set here -@param twoCompl varying parameter value is treated as two's complement -@return found minimal RSSI value -*/ -uint32_t LMS7002M::FindMinRSSI(const uint16_t addr, const uint8_t msb, const uint8_t lsb, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult) -{ - if (scanWidth < 1) - return ~0; - int minI; - int min = startValue; - int globMin = 0; - uint32_t minRSSI = ~0; - unsigned int *rssiField = new unsigned int[scanWidth]; - int minRSSIindex; - int i; - int maxVal; - int minVal = 0; - if (twoCompl) - { - maxVal = (~(~0x0 << (msb - lsb + 1))) / 2; - minVal = -(~(~0x0 << (msb - lsb + 1))) / 2 - 1; - } - else - maxVal = (~(~0x0 << (msb - lsb + 1))); - - Modify_SPI_Reg_bits(addr, msb, lsb, startValue); - - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); - - minRSSIindex = 0; - for (i = 0; i maxVal) - currentValue = maxVal; - if (twoCompl == 2) - { - uint16_t valToSend = 0; - if (currentValue < 0) - valToSend |= 0x40; - valToSend |= labs(currentValue); - Modify_SPI_Reg_bits(addr, msb, lsb, valToSend); - } - else - Modify_SPI_Reg_bits(addr, msb, lsb, currentValue); - - rssiField[i] = GetRSSI(); - } - minI = min; - minRSSIindex = 0; - for (i = 0; i maxVal) - minI = maxVal; - else if (minI < minVal) - minI = minVal; - globMin = minI; - } - min = minI; - - Modify_SPI_Reg_bits(addr, msb, lsb, min); - - *result = min; - return minRSSI; -} - -/** @brief Sets given module registers to default values - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::SetDefaults(MemorySection module) -{ - liblms7_status status = LIBLMS7_SUCCESS; - vector addrs; - vector values; - for(uint32_t address = MemorySectionAddresses[module][0]; address <= MemorySectionAddresses[module][1]; ++address) - { - addrs.push_back(address); - values.push_back(mRegistersMap->GetDefaultValue(address)); - } - status = SPI_write_batch(&addrs[0], &values[0], addrs.size()); - return status; -} - -/** @brief Parameters setup instructions for Rx calibration - @param bandwidth_MHz filter bandwidth in MHz - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::CalibrateRxSetup(float_type bandwidth_MHz) -{ - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - - //rfe - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); // EN_NEXTTX_TRF 0 - - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), 15); //G_RXLOOPB_RFE 15 - Modify_SPI_Reg_bits(0x010C, 4, 3, 0); //PD_MXLOBUF_RFE 0, PD_QGEN_RFE 0 - Modify_SPI_Reg_bits(0x010C, 1, 1, 0); //PD_TIA 0 - Modify_SPI_Reg_bits(0x010C, 7, 7, 1); //PD_LNA 1 - - Modify_SPI_Reg_bits(0x0110, 4, 0, 31); //ICT_LO_RFE 31 - Modify_SPI_Reg_bits(0x010D, 4, 1, 0xFF); // all short switches are enabled - - //RBB - Modify_SPI_Reg_bits(0x0115, 15, 14, 0); //Loopback switches disable - Modify_SPI_Reg_bits(0x0119, 15, 15, 0); //OSW_PGA 0 - - //TRF - //reset TRF to defaults - SetDefaults(TRF); - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 0); //L_LOOPB_TXPAD_TRF 0 - Modify_SPI_Reg_bits(LMS7param(EN_LOOPB_TXPAD_TRF), 1); //EN_LOOPB_TXPAD_TRF 1 - Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 0); //EN_G_TRF 0 - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); //EN_NEXTTX_TRF 1 - Modify_SPI_Reg_bits(LMS7param(LOSS_LIN_TXPAD_TRF), 0); //LOSS_LIN_TXPAD_TRF 5 - Modify_SPI_Reg_bits(LMS7param(LOSS_MAIN_TXPAD_TRF), 0); //LOSS_MAIN_TXPAD_TRF 5 - - //TBB - //reset TBB to defaults - SetDefaults(TBB); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 9); //CG_IAMP_TBB 9 - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); //ICT_IAMP_FRP_TBB 1 - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); //ICT_IAMP_GG_FRP_TBB 6 - - //AFE - //reset AFE to defaults - SetDefaults(AFE); - Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); //PD_RX_AFE2 - if (ch == 2) - { - Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); //PD_TX_AFE2 - } - //BIAS - uint16_t backup = Get_SPI_Reg_bits(0x0084, 10, 6); - SetDefaults(BIAS); - Modify_SPI_Reg_bits(0x0084, 10, 6, backup); //RP_CALIB_BIAS - - //XBUF - Modify_SPI_Reg_bits(0x0085, 2, 0, 1); //PD_XBUF_RX 0, PD_XBUF_TX 0, EN_G_XBUF 1 - - //CGEN - //reset CGEN to defaults - SetDefaults(CGEN); - //power up VCO - Modify_SPI_Reg_bits(0x0086, 2, 2, 0); - - liblms7_status status = SetFrequencyCGEN(122.88); - if (status != LIBLMS7_SUCCESS) - return status; - - // //SXR - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - float_type SXRfreqMHz = GetFrequencySX_MHz(Rx, mRefClkSXR_MHz); - - //SXT - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - Modify_SPI_Reg_bits(LMS7param(PD_LOCH_T2RBUF), 1); //PD_LOCH_t2RBUF 1 - status = SetFrequencySX(Tx, SXRfreqMHz + bandwidth_MHz / 4, mRefClkSXT_MHz); - if ( status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - - //TXTSP - SetDefaults(TxTSP); - Modify_SPI_Reg_bits(0x0200, 3, 2, 0x3); //TSGMODE 1, INSEL 1 - //Modify_SPI_Reg_bits(0x0208, 6, 4, 0xFFFF); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 - Modify_SPI_Reg_bits(0x0208, 6, 6, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 - Modify_SPI_Reg_bits(0x0208, 5, 5, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 - Modify_SPI_Reg_bits(0x0208, 4, 4, 1); //GFIR3_BYP 1, GFIR2_BYP 1, GFIR1_BYP 1 - LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); - SetNCOFrequency(Tx, 0, 0); - - //RXTSP - SetDefaults(RxTSP); - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); //AGC_MODE 1 - Modify_SPI_Reg_bits(0x040C, 7, 7, 0x1); //CMIX_BYP 1 - Modify_SPI_Reg_bits(0x040C, 6, 6, 0x0); //AGC_BYP 0 - Modify_SPI_Reg_bits(0x040C, 5, 5, 1); // - Modify_SPI_Reg_bits(0x040C, 4, 4, 1); // - Modify_SPI_Reg_bits(0x040C, 3, 3, 1); // - Modify_SPI_Reg_bits(0x040C, 2, 2, 1); // DC_BYP - Modify_SPI_Reg_bits(0x040C, 1, 1, 1); // - Modify_SPI_Reg_bits(0x040C, 0, 0, 1); // - - Modify_SPI_Reg_bits(LMS7param(CAPSEL), 0); - Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2); - Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 0x7); //agc_avg iq corr - return LIBLMS7_SUCCESS; -} - -/** @brief Calibrates Receiver. DC offset, IQ gains, IQ phase correction - @return 0-success, other-failure -*/ -liblms7_status LMS7002M::CalibrateRx(float_type bandwidth_MHz) -{ - liblms7_status status; - uint32_t minRSSI_i; - uint32_t minRSSI_q; - int16_t iqcorr_rx = 0; - uint32_t minRSSI_iq; - int16_t dcoffi; - int16_t dcoffq; - - const int16_t firCoefs[] = - { - -2531, - -517, - 2708, - 188, - -3059, - 216, - 3569, - -770, - -4199, - 1541, - 4886, - -2577, - -5552, - 3909, - 6108, - -5537, - -6457, - 7440, - 6507, - -9566, - -6174, - 11845, - 5391, - -14179, - -4110, - 16457, - 2310, - -18561, - 0, - 20369, - -2780, - -21752, - 5963, - 22610, - -9456, - -22859, - 13127, - 22444, - -16854, - -21319, - 20489, - 19492, - -23883, - -17002, - 26881, - 13902, - -29372, - -10313, - 31226, - 6345, - -32380, - -2141, - 32767, - -2141, - -32380, - 6345, - 31226, - -10313, - -29372, - 13902, - 26881, - -17002, - -23883, - 19492, - 20489, - -21319, - -16854, - 22444, - 13127, - -22859, - -9456, - 22610, - 5963, - -21752, - -2780, - 20369, - 0, - -18561, - 2310, - 16457, - -4110, - -14179, - 5391, - 11845, - -6174, - -9566, - 6507, - 7440, - -6457, - -5537, - 6108, - 3909, - -5552, - -2577, - 4886, - 1541, - -4199, - -770, - 3569, - 216, - -3059, - 188, - 2708, - -517, - -2531 - }; - - Log("Rx calibration started", LOG_INFO); - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - Log("Saving registers state", LOG_INFO); - BackupAllRegisters(); - uint8_t sel_path_rfe = (uint8_t)Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE)); - if (sel_path_rfe == 1 || sel_path_rfe == 0) - return LIBLMS7_BAD_SEL_PATH; - - Log("Setup stage", LOG_INFO); - status = CalibrateRxSetup(bandwidth_MHz); - if (status != LIBLMS7_SUCCESS) - goto RxCalibrationEndStage; - - Log("Rx DC calibration", LOG_INFO); - CalibrateRxDC_RSSI(); - dcoffi = Get_SPI_Reg_bits(LMS7param(DCOFFI_RFE)); - dcoffq = Get_SPI_Reg_bits(LMS7param(DCOFFQ_RFE)); - Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 1); - - if (sel_path_rfe == 2) - { - Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); - Modify_SPI_Reg_bits(0x0103, 10, 10, 1); - Modify_SPI_Reg_bits(0x0103, 11, 11, 0); - Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); - } - if (sel_path_rfe == 3) - { - Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_1_RFE), 0); - Modify_SPI_Reg_bits(0x0103, 11, 11, 1); - Modify_SPI_Reg_bits(0x0103, 10, 10, 0); - Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB1_RFE), 0); - } - - Modify_SPI_Reg_bits(0x040C, 7, 7, 0); //CMIX_BYP 0 - Modify_SPI_Reg_bits(0x040C, 2, 0, 0); //DC_BYP 0, GC_BYP 0, PH_BYP 0 - Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1); //CMIX_GAIN 1 +6 db - Modify_SPI_Reg_bits(0x040C, 13, 13, 1); //CMIX_SC 1 - - FixRXSaturation(); - - Modify_SPI_Reg_bits(0x040C, 5, 5, 0); //GFIR3_BYP 0 - Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), 2); - Modify_SPI_Reg_bits(LMS7param(GFIR3_L_RXTSP), 7); - Modify_SPI_Reg_bits(LMS7param(GFIR3_N_RXTSP), 7); - - SetGFIRCoefficients(Rx, 2, firCoefs, sizeof(firCoefs) / sizeof(int16_t)); - - SetNCOFrequency(Rx, 0, bandwidth_MHz / 4 + 1); - Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), 2047); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), 2047); - - Log("IQ correction stage", LOG_INFO); - iqcorr_rx = 0; - for (int i = 0; i<9; ++i) - minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_RXTSP), iqcorr_rx, &iqcorr_rx, 3, 1, 256 >> i); - Modify_SPI_Reg_bits(LMS7param(IQCORR_RXTSP), iqcorr_rx); - - uint16_t mingcorri; - Log("I gain", LOG_INFO); - minRSSI_i = FindMinRSSI_Gain(LMS7param(GCORRI_RXTSP), &mingcorri); - - Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), 2047); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), 2047); - - Log("Q gain", LOG_INFO); - uint16_t mingcorrq; - minRSSI_q = FindMinRSSI_Gain(LMS7param(GCORRQ_RXTSP), &mingcorrq); - - if (minRSSI_i < minRSSI_q) - mingcorrq = 2047; - else - mingcorri = 2047; - - Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), mingcorri); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), mingcorrq); - - Log("Phase", LOG_INFO); - for (int i = 0; i<9; ++i) - minRSSI_iq = FindMinRSSI(LMS7param(IQCORR_RXTSP), iqcorr_rx, &iqcorr_rx, 3, 1, 256 >> i); - -RxCalibrationEndStage: - Log("Restoring registers state", LOG_INFO); - RestoreAllRegisters(); - if (status != LIBLMS7_SUCCESS) - { - Log("Rx calibration failed", LOG_WARNING); - return status; - } - - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - SetRxDCOFF((int8_t)dcoffi, (int8_t)dcoffq); - Modify_SPI_Reg_bits(LMS7param(EN_DCOFF_RXFE_RFE), 1); - Modify_SPI_Reg_bits(LMS7param(GCORRI_RXTSP), mingcorri); - Modify_SPI_Reg_bits(LMS7param(GCORRQ_RXTSP), mingcorrq); - Modify_SPI_Reg_bits(LMS7param(IQCORR_RXTSP), iqcorr_rx); - Modify_SPI_Reg_bits(0x040C, 2, 0, 0); //DC_BYP 0, GC_BYP 0, PH_BYP 0 - Modify_SPI_Reg_bits(0x0110, 4, 0, 31); //ICT_LO_RFE 31 - Log("Rx calibration finished", LOG_INFO); - return LIBLMS7_SUCCESS; -} - -const uint16_t backupAddrs[] = { - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, - 0x0029, 0x002A, 0x002B, 0x002C, 0x002E, 0x0081, 0x0082, 0x0084, 0x0085, - 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x0092, 0x0093, 0x0094, - 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, - 0x009F, 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, - 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0100, 0x0101, 0x0102, 0x0103, - 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, 0x010A, 0x010C, 0x010D, 0x010E, - 0x010F, 0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, - 0x0119, 0x011A, 0x011C, 0x011D, 0x011E, 0x011F, 0x0120, 0x0121, 0x0122, 0x0123, - 0x0124, 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, - 0x0240, 0x0242, 0x0243, 0x0400, 0x0401, 0x0402, - 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, - 0x0440, 0x0442, 0x0443 }; -uint16_t backupRegs[sizeof(backupAddrs) / 2]; -const uint16_t backupSXAddr[] = { 0x011C, 0x011D, 0x011E, 0x011F, 0x01200, 0x0121, 0x0122, 0x0123, 0x0124 }; -uint16_t backupRegsSXR[sizeof(backupSXAddr) / 2]; -uint16_t backupRegsSXT[sizeof(backupSXAddr) / 2]; - -/** @brief Stores chip current registers state into memory for later restoration -*/ -void LMS7002M::BackupAllRegisters() -{ - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - SPI_read_batch(backupAddrs, backupRegs, sizeof(backupAddrs) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); // channel A - SPI_read_batch(backupSXAddr, backupRegsSXR, sizeof(backupRegsSXR) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), 2); // channel B - SPI_read_batch(backupSXAddr, backupRegsSXT, sizeof(backupRegsSXR) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); -} - -/** @brief Sets chip registers to state that was stored in memory using BackupAllRegisters() -*/ -void LMS7002M::RestoreAllRegisters() -{ - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - SPI_write_batch(backupAddrs, backupRegs, sizeof(backupAddrs) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); // channel A - SPI_write_batch(backupSXAddr, backupRegsSXR, sizeof(backupRegsSXR) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), 2); // channel B - SPI_write_batch(backupSXAddr, backupRegsSXT, sizeof(backupRegsSXR) / sizeof(uint16_t)); - Modify_SPI_Reg_bits(LMS7param(MAC), ch); -} - -/** @brief Searches for minimal digital RSSI value by changing given gain parameter - @param param LMS7002M gain correction parameter - @param foundValue returns value which achieved minimal RSSI - @return minimal found RSSI value -*/ -uint32_t LMS7002M::FindMinRSSI_Gain(const LMS7Parameter ¶m, uint16_t *foundValue) -{ - uint32_t RSSI = ~0 - 2; - uint32_t prevRSSI = RSSI + 1; - uint8_t decrement = 2; - uint16_t gcorr = 2047; - while (gcorr > 1024) - { - Modify_SPI_Reg_bits(param, gcorr); - RSSI = GetRSSI(); - if (RSSI < prevRSSI) - { - prevRSSI = RSSI; - *foundValue = gcorr; - gcorr -= decrement; - decrement *= 2; - } - else - { - if (decrement == 2) - break; - gcorr -= decrement; - decrement = 2; - } - } - return prevRSSI; -} - -/** @brief Reads all chip configuration and checks if it matches with local registers copy -*/ -bool LMS7002M::IsSynced() -{ - if (controlPort->IsOpen() == false) - return false; - bool isSynced = true; - liblms7_status status; - - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - - vector addrToRead = mRegistersMap->GetUsedAddresses(0); - vector dataReceived; - dataReceived.resize(addrToRead.size(), 0); - - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); - if (status != LIBLMS7_SUCCESS) - { - isSynced = false; - goto isSyncedEnding; - } - - //mask out readonly bits - for (uint16_t j = 0; j < sizeof(readOnlyRegisters) / sizeof(uint16_t); ++j) - for (uint16_t k = 0; k < addrToRead.size(); ++k) - if (readOnlyRegisters[j] == addrToRead[k]) - { - dataReceived[k] &= readOnlyRegistersMasks[j]; - break; - } - - //check if local copy matches chip - for (uint16_t i = 0; i < addrToRead.size(); ++i) - { - if (dataReceived[i] != mRegistersMap->GetValue(0, addrToRead[i])) - { - isSynced = false; - goto isSyncedEnding; - } - } - - addrToRead.clear(); //add only B channel addresses - addrToRead = mRegistersMap->GetUsedAddresses(1); - - //mask out readonly bits - for (uint16_t j = 0; j < sizeof(readOnlyRegisters) / sizeof(uint16_t); ++j) - for (uint16_t k = 0; k < addrToRead.size(); ++k) - if (readOnlyRegisters[j] == addrToRead[k]) - { - dataReceived[k] &= readOnlyRegistersMasks[j]; - break; - } - - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); - if (status != LIBLMS7_SUCCESS) - return false; - //check if local copy matches chip - for (uint16_t i = 0; i < addrToRead.size(); ++i) - if (dataReceived[i] != mRegistersMap->GetValue(1, addrToRead[i])) - { - isSynced = false; - break; - } - -isSyncedEnding: - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore previously used channel - return isSynced; -} - -/** @brief Writes all registers from host to chip - -When used on Novena board, also changes gpios to match rx path and tx band selections -*/ -liblms7_status LMS7002M::UploadAll() -{ - if (controlPort == NULL) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); //remember used channel - - liblms7_status status; - - vector addrToWrite; - vector dataToWrite; - - uint16_t x0020_value = mRegistersMap->GetValue(0, 0x0020); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); //select A channel - - addrToWrite = mRegistersMap->GetUsedAddresses(0); - //remove 0x0020 register from list, to not change MAC - addrToWrite.erase( find(addrToWrite.begin(), addrToWrite.end(), 0x0020) ); - for (auto address : addrToWrite) - dataToWrite.push_back(mRegistersMap->GetValue(0, address)); - - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - status = LIBLMS7_SUCCESS; - if (status != LIBLMS7_SUCCESS) - return status; - //after all channel A registers have been written, update 0x0020 register value - status = SPI_write(0x0020, x0020_value); - if (status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - if (status != LIBLMS7_SUCCESS) - return status; - - addrToWrite = mRegistersMap->GetUsedAddresses(1); - dataToWrite.clear(); - for (auto address : addrToWrite) - { - dataToWrite.push_back(mRegistersMap->GetValue(1, address)); - } - Modify_SPI_Reg_bits(LMS7param(MAC), 2); //select B channel - status = SPI_write_batch(&addrToWrite[0], &dataToWrite[0], addrToWrite.size()); - if (status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //restore last used channel - - //in case of Novena board, need to update GPIO - if(controlPort->GetInfo().device == LMS_DEV_NOVENA) - { - uint16_t regValue = SPI_read(0x0706) & 0xFFF8; - //lms_gpio2 - tx output selection: - // 0 - TX1_A and TX1_B (Band 1), - // 1 - TX2_A and TX2_B (Band 2) - regValue |= Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)) << 2; //gpio2 - //RX active paths - //lms_gpio0 | lms_gpio1 RX_A RX_B - // 0 0 => no active path - // 1 0 => LNAW_A LNAW_B - // 0 1 => LNAH_A LNAH_B - // 1 1 => LNAL_A LNAL_B - switch(Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE))) - { - //set gpio1:gpio0 - case 0: regValue |= 0x0; break; - case 1: regValue |= 0x2; break; - case 2: regValue |= 0x3; break; - case 3: regValue |= 0x1; break; - } - SPI_write(0x0706, regValue); - } - return LIBLMS7_SUCCESS; -} - -/** @brief Reads all registers from the chip to host - -When used on Novena board, also updates gpios to match rx path and tx band selections -*/ -liblms7_status LMS7002M::DownloadAll() -{ - if (controlPort == nullptr) - return LIBLMS7_NO_CONNECTION_MANAGER; - if (controlPort->IsOpen() == false) - return LIBLMS7_NOT_CONNECTED; - liblms7_status status; - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC), false); - - vector addrToRead = mRegistersMap->GetUsedAddresses(0); - vector dataReceived; - dataReceived.resize(addrToRead.size(), 0); - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); - if (status != LIBLMS7_SUCCESS) - return status; - - for (uint16_t i = 0; i < addrToRead.size(); ++i) - { - uint16_t adr = addrToRead[i]; - uint16_t val = dataReceived[i]; - mRegistersMap->SetValue(0, addrToRead[i], dataReceived[i]); - } - - addrToRead.clear(); //add only B channel addresses - addrToRead = mRegistersMap->GetUsedAddresses(1); - dataReceived.resize(addrToRead.size(), 0); - - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - status = SPI_read_batch(&addrToRead[0], &dataReceived[0], addrToRead.size()); - if (status != LIBLMS7_SUCCESS) - return status; - for (uint16_t i = 0; i < addrToRead.size(); ++i) - mRegistersMap->SetValue(1, addrToRead[i], dataReceived[i]); - - Modify_SPI_Reg_bits(LMS7param(MAC), ch); //retore previously used channel - - //in case of Novena board, update GPIO - if(controlPort->GetInfo().device == LMS_DEV_NOVENA) - { - uint16_t regValue = SPI_read(0x0706) & 0xFFF8; - //lms_gpio2 - tx output selection: - // 0 - TX1_A and TX1_B (Band 1), - // 1 - TX2_A and TX2_B (Band 2) - regValue |= Get_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF)) << 2; //gpio2 - //RX active paths - //lms_gpio0 | lms_gpio1 RX_A RX_B - // 0 0 => no active path - // 1 0 => LNAW_A LNAW_B - // 0 1 => LNAH_A LNAH_B - // 1 1 => LNAL_A LNAL_B - switch(Get_SPI_Reg_bits(LMS7param(SEL_PATH_RFE))) - { - //set gpio1:gpio0 - case 0: regValue |= 0x0; break; - case 1: regValue |= 0x2; break; - case 2: regValue |= 0x3; break; - case 3: regValue |= 0x1; break; - } - SPI_write(0x0706, regValue); - } - - return LIBLMS7_SUCCESS; -} - -/** @brief Configures interfaces for desired frequency - Sets interpolation and decimation, changes MCLK sources and TSP clock dividers accordingly to selected interpolation and decimation -*/ -liblms7_status LMS7002M::SetInterfaceFrequency(float_type cgen_freq_MHz, const uint8_t interpolation, const uint8_t decimation) -{ - Modify_SPI_Reg_bits(LMS7param(HBD_OVR_RXTSP), decimation); - Modify_SPI_Reg_bits(LMS7param(HBI_OVR_TXTSP), interpolation); - liblms7_status status = SetFrequencyCGEN(cgen_freq_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - - if (decimation == 7 || decimation == 0) //bypass - { - Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), 0); - Modify_SPI_Reg_bits(LMS7param(RXDIVEN), false); - Modify_SPI_Reg_bits(LMS7param(MCLK2SRC), 3); - } - else - { - uint8_t divider = (uint8_t)pow(2.0, decimation); - if (divider > 1) - Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), (divider / 2) - 1); - else - Modify_SPI_Reg_bits(LMS7param(RXTSPCLKA_DIV), 0); - Modify_SPI_Reg_bits(LMS7param(RXDIVEN), true); - Modify_SPI_Reg_bits(LMS7param(MCLK2SRC), 1); - } - if (interpolation == 7 || interpolation == 0) //bypass - { - Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), 0); - Modify_SPI_Reg_bits(LMS7param(TXDIVEN), false); - Modify_SPI_Reg_bits(LMS7param(MCLK1SRC), 2); - } - else - { - uint8_t divider = (uint8_t)pow(2.0, interpolation); - if (divider > 1) - Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), (divider / 2) - 1); - else - Modify_SPI_Reg_bits(LMS7param(TXTSPCLKA_DIV), 0); - Modify_SPI_Reg_bits(LMS7param(TXDIVEN), true); - Modify_SPI_Reg_bits(LMS7param(MCLK1SRC), 0); - } - return status; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h deleted file mode 100644 index 81234c28a3..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M.h +++ /dev/null @@ -1,177 +0,0 @@ -/** -@file LMS7002M.h -@author Lime Microsystems (www.limemicro.com) -@brief LMS7002M transceiver configuration interface -*/ - -#ifndef LMS7API_H -#define LMS7API_H - -#include "LMS7002M_statuses.h" -#include "LMS7002M_parameters.h" -#include "typedefs.h" - -#include - -class LMScomms; -class LMS7002M_RegistersMap; - -class LMS7002M -{ -public: - enum - { - Rx, Tx - }; - - LMS7002M(); - LMS7002M(LMScomms* controlPort); - virtual ~LMS7002M(); - - ///@name Registers writing and reading - liblms7_status UploadAll(); - liblms7_status DownloadAll(); - bool IsSynced(); - - liblms7_status ResetChip(); - liblms7_status LoadConfig(const char* filename); - liblms7_status SaveConfig(const char* filename); - ///@} - - ///@name Registers writing and reading - uint16_t Get_SPI_Reg_bits(const LMS7Parameter ¶m, bool fromChip = true); - uint16_t Get_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, bool fromChip = true); - liblms7_status Modify_SPI_Reg_bits(const LMS7Parameter ¶m, const uint16_t value, bool fromChip = true); - liblms7_status Modify_SPI_Reg_bits(uint16_t address, uint8_t msb, uint8_t lsb, uint16_t value, bool fromChip = true); - liblms7_status SPI_write(uint16_t address, uint16_t data); - uint16_t SPI_read(uint16_t address, bool fromChip = true, liblms7_status *status = 0); - liblms7_status RegistersTest(); - ///@} - - ///@name Transmitter, Receiver calibrations - liblms7_status CalibrateRx(float_type bandwidth_MHz); - liblms7_status CalibrateTx(float_type bandwidth_MHz); - ///@} - - ///@name Filters tuning - enum TxFilter - { - TX_LADDER, TX_REALPOLE, TX_HIGHBAND - }; - enum RxFilter - { - RX_TIA, RX_LPF_LOWBAND, RX_LPF_HIGHBAND - }; - liblms7_status TuneTxFilter(TxFilter filterType, float_type bandwidth_MHz); - liblms7_status TuneTxFilterLowBandChain(float_type ladder_bw_MHz, float_type realpole_bw_MHz); - liblms7_status TuneRxFilter(RxFilter filterType, float_type bandwidth_MHz); - ///@} - - ///@name CGEN and PLL - float_type GetReferenceClk_SX(bool tx); - float_type GetFrequencyCGEN_MHz(); - liblms7_status SetFrequencyCGEN(float_type freq_MHz); - float_type GetFrequencySX_MHz(bool tx, float_type refClk_MHz); - liblms7_status SetFrequencySX(bool tx, float_type freq_MHz, float_type refClk_MHz); - ///VCO modules available for tuning - enum VCO_Module - { - VCO_CGEN, VCO_SXR, VCO_SXT - }; - liblms7_status TuneVCO(VCO_Module module); - ///@} - - ///@name TSP - liblms7_status LoadDC_REG_IQ(bool tx, int16_t I, int16_t Q); - liblms7_status SetNCOFrequency(bool tx, uint8_t index, float_type freq_MHz); - float_type GetNCOFrequency_MHz(bool tx, uint8_t index, float_type refClk_MHz, bool fromChip = true); - liblms7_status SetNCOPhaseOffsetForMode0(bool tx, float_type angle_Deg); - liblms7_status SetNCOPhaseOffset(bool tx, uint8_t index, float_type angle_Deg); - float_type GetNCOPhaseOffset_Deg(bool tx, uint8_t index); - liblms7_status SetGFIRCoefficients(bool tx, uint8_t GFIR_index, const int16_t *coef, uint8_t coefCount); - liblms7_status GetGFIRCoefficients(bool tx, uint8_t GFIR_index, int16_t *coef, uint8_t coefCount); - float_type GetReferenceClk_TSP_MHz(bool tx); - ///@} - - liblms7_status SetInterfaceFrequency(float_type cgen_freq_MHz, const uint8_t interpolation, const uint8_t decimation); - - ///enumeration to indicate module registers intervals - enum MemorySection - { - LimeLight = 0, EN_DIR, AFE, BIAS, XBUF, CGEN, LDO, BIST, CDS, - TRF, TBB, RFE, RBB, SX, TxTSP, - TxNCO, TxGFIR1, TxGFIR2, TxGFIR3a, TxGFIR3b, TxGFIR3c, - RxTSP, RxNCO, RxGFIR1, RxGFIR2, RxGFIR3a, RxGFIR3b, RxGFIR3c, - MEMORY_SECTIONS_COUNT - }; - virtual liblms7_status SetDefaults(MemorySection module); - LMScomms* GetControlPort() const { return controlPort;}; - - static const float_type gLadder_lower_limit; - static const float_type gLadder_higher_limit; - static const float_type gRealpole_lower_limit; - static const float_type gRealpole_higher_limit; - static const float_type gHighband_lower_limit; - static const float_type gHighband_higher_limit; - - static const float_type gRxTIA_higher_limit; - static const float_type gRxTIA_lower_limit_g1; - static const float_type gRxTIA_lower_limit_g23; - static const float_type gRxLPF_low_lower_limit; - static const float_type gRxLPF_low_higher_limit; - static const float_type gRxLPF_high_lower_limit; - static const float_type gRxLPF_high_higher_limit; - - static float_type gVCO_frequency_table[3][2]; - static float_type gCGEN_VCO_frequencies[2]; - - //protected: - LMS7002M_RegistersMap *mRegistersMap; - static const uint16_t readOnlyRegisters[]; - static const uint16_t readOnlyRegistersMasks[]; - - uint16_t MemorySectionAddresses[MEMORY_SECTIONS_COUNT][2]; - ///@name Algorithms functions - void BackupAllRegisters(); - void RestoreAllRegisters(); - uint32_t GetRSSI(); - void SetRxDCOFF(int8_t offsetI, int8_t offsetQ); - uint32_t FindMinRSSI_Gain(const LMS7Parameter ¶m, uint16_t *foundValue); - uint32_t FindMinRSSI(const LMS7Parameter ¶m, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult = 1); - uint32_t FindMinRSSI(const uint16_t addr, const uint8_t msb, const uint8_t lsb, const int16_t startValue, int16_t *result, const uint8_t scanWidth, const uint8_t twoCompl, int8_t stepMult = 1); - void CalibrateRxDC_RSSI(); - liblms7_status CalibrateTxSetup(float_type bandwidth_MHz); - liblms7_status CalibrateRxSetup(float_type bandwidth_MHz); - liblms7_status FixRXSaturation(); - void FilterTuning_AdjustGains(); - liblms7_status TuneTxFilterSetup(TxFilter type, float_type cutoff_MHz); - liblms7_status TuneRxFilterSetup(RxFilter type, float_type cutoff_MHz); - liblms7_status RFE_TIA_Calibration(float_type TIA_freq_MHz); - liblms7_status RxLPFLow_Calibration(float_type RxLPFL_freq_MHz); - liblms7_status RxLPFHigh_Calibration(float_type RxLPFH_freq_MHz); - - liblms7_status RegistersTestInterval(uint16_t startAddr, uint16_t endAddr, uint16_t pattern, std::stringstream &ss); - liblms7_status SPI_write_batch(const uint16_t* spiAddr, const uint16_t* spiData, uint16_t cnt); - liblms7_status SPI_read_batch(const uint16_t* spiAddr, uint16_t* spiData, uint16_t cnt); - liblms7_status Modify_SPI_Reg_mask(const uint16_t *addr, const uint16_t *masks, const uint16_t *values, uint8_t start, uint8_t stop); - ///@} - ///Reference clock used for Receiver frequency calculations - float_type mRefClkSXR_MHz; - ///Reference clock used for Transmitter frequency calculations - float_type mRefClkSXT_MHz; - - enum LogType - { - LOG_INFO, - LOG_WARNING, - LOG_ERROR, - LOG_DATA - }; - virtual void Log(const char* text, LogType type); - - ///port used for communicating with LMS7002M - LMScomms* controlPort; - - liblms7_status LoadConfigLegacyFile(const char* filename); -}; -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp deleted file mode 100644 index 8c870ffcc0..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "LMS7002M_RegistersMap.h" -#include "LMS7002M_parameters.h" - -LMS7002M_RegistersMap::LMS7002M_RegistersMap() -{ - -} - -LMS7002M_RegistersMap::~LMS7002M_RegistersMap() -{ - -} - -uint16_t LMS7002M_RegistersMap::GetDefaultValue(uint16_t address) const -{ - std::map::const_iterator iter = mChannelA.find(address); - if( iter != mChannelA.end()) - return iter->second.defaultValue; - else - return 0; -} - -void LMS7002M_RegistersMap::InitializeDefaultValues(const std::vector parameterList) -{ - for(auto parameter : parameterList) - { - uint16_t regValue = mChannelA[parameter->address].defaultValue; - mChannelA[parameter->address].defaultValue = regValue | (parameter->defaultValue << parameter->lsb); - mChannelA[parameter->address].value = mChannelA[parameter->address].defaultValue; - if(parameter->address >= 0x0100) - mChannelB[parameter->address].value = mChannelA[parameter->address].value; - } -} - -void LMS7002M_RegistersMap::SetValue(uint8_t channel, const uint16_t address, const uint16_t value) -{ - if(channel == 0) - mChannelA[address].value = value; - else if(channel == 1) - mChannelB[address].value = value; -} - -uint16_t LMS7002M_RegistersMap::GetValue(uint8_t channel, uint16_t address) const -{ - const std::map *regMap; - if(channel == 0) - regMap = &mChannelA; - else if(channel == 1) - regMap = &mChannelB; - std::map::const_iterator iter; - iter = regMap->find(address); - if (iter != regMap->end()) - return iter->second.value; - else - return 0; -} - -std::vector LMS7002M_RegistersMap::GetUsedAddresses(const uint8_t channel) const -{ - std::vector addresses; - if(channel == 0) - for(auto iter : mChannelA) - addresses.push_back(iter.first); - else if(channel == 1) - for(auto iter : mChannelB) - addresses.push_back(iter.first); - return addresses; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h deleted file mode 100644 index 5ccda752db..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_RegistersMap.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef LMS7002M_REGISTERS_MAP_H -#define LMS7002M_REGISTERS_MAP_H - -#include -#include -#include - -struct LMS7Parameter; - -class LMS7002M_RegistersMap -{ -public: - struct Register - { - uint16_t value; - uint16_t defaultValue; - uint16_t mask; - }; - - LMS7002M_RegistersMap(); - ~LMS7002M_RegistersMap(); - - uint16_t GetValue(uint8_t channel, uint16_t address) const; - void SetValue(uint8_t channel, const uint16_t address, const uint16_t value); - - void InitializeDefaultValues(const std::vector parameterList); - uint16_t GetDefaultValue(uint16_t address) const; - std::vector GetUsedAddresses(const uint8_t channel) const; - -protected: - std::map mChannelA; - std::map mChannelB; -}; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_filtersCalibration.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_filtersCalibration.cpp deleted file mode 100644 index 2f3d38c1b5..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_filtersCalibration.cpp +++ /dev/null @@ -1,861 +0,0 @@ -/** -@file LMS7002M_filtersCalibration.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Implementation of LMS7002M transceiver filters calibration algorithms -*/ - -#include "LMS7002M.h" -#include - -///define for parameter enumeration if prefix might be needed -#define LMS7param(id) id - -const float_type LMS7002M::gLadder_lower_limit = 2; -const float_type LMS7002M::gLadder_higher_limit = 16; -const float_type LMS7002M::gRealpole_lower_limit = 0.8; -const float_type LMS7002M::gRealpole_higher_limit = 3.2; -const float_type LMS7002M::gHighband_lower_limit = 28; -const float_type LMS7002M::gHighband_higher_limit = 70; - -const float_type LMS7002M::gRxTIA_higher_limit = 60; -const float_type LMS7002M::gRxTIA_lower_limit_g1 = 1.5; -const float_type LMS7002M::gRxTIA_lower_limit_g23 = 0.5; -const float_type LMS7002M::gRxLPF_low_lower_limit = 1; -const float_type LMS7002M::gRxLPF_low_higher_limit = 20; -const float_type LMS7002M::gRxLPF_high_lower_limit = 20; -const float_type LMS7002M::gRxLPF_high_higher_limit = 70; - -liblms7_status LMS7002M::TuneTxFilterSetup(LMS7002M::TxFilter type, float_type cutoff_MHz) -{ - Modify_SPI_Reg_bits(LMS7param(EN_G_RFE), 0); - Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 0); - - //RBB - SetDefaults(RBB); - Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 1); - Modify_SPI_Reg_bits(LMS7param(INPUT_CTL_PGA_RBB), 3); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), 20); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), 20); - Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), 3); - - //TBB - SetDefaults(TBB); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); - - //AFE - uint8_t isel_dac_afe = (uint8_t)Get_SPI_Reg_bits(0x0082, 15, 13); - SetDefaults(AFE); - if (Get_SPI_Reg_bits(LMS7param(MAC)) == 2) - { - Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); //PD_RX_AFE2 0 - Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); //PD_RX_AFE2 0 - } - Modify_SPI_Reg_bits(0x0082, 15, 13, isel_dac_afe); - - //BIAS - uint8_t rpcalib_bias = (uint8_t)Get_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS)); - SetDefaults(BIAS); - Modify_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS), rpcalib_bias); - - //XBUF - Modify_SPI_Reg_bits(LMS7param(PD_XBUF_RX), 0); - Modify_SPI_Reg_bits(LMS7param(PD_XBUF_TX), 0); - Modify_SPI_Reg_bits(LMS7param(EN_G_XBUF), 1); - - //CGEN - SetDefaults(CGEN); - - //txtsp - SetDefaults(TxTSP); - Modify_SPI_Reg_bits(LMS7param(TSGMODE_TXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(INSEL_TXTSP), 1); - Modify_SPI_Reg_bits(0x0208, 6, 4, 7); - LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); - float_type txNCOfreq = 0.05; - SetNCOFrequency(Tx, 0, txNCOfreq); - - //rxtsp - SetDefaults(RxTSP); - SetNCOFrequency(Rx, 0, txNCOfreq - 1); - - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); - Modify_SPI_Reg_bits(0x040C, 6, 3, 0x07); - - Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 7); - Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1); - - return LIBLMS7_SUCCESS; -} - - -liblms7_status LMS7002M::TuneTxFilter(LMS7002M::TxFilter type, float_type cutoff_MHz) -{ - liblms7_status status; - float_type lowLimit = 0; - float_type highLimit = 1000; - uint32_t rssi = 0; - int8_t dir; - uint8_t ccal_lpflad_tbb; - uint32_t rssi_value_100k; - int16_t rcal; - - float_type ncoFreq = 0.05; - float_type cgenFreq; - uint8_t loopb_tbb; - uint8_t cg_iamp_tbb = 1; - uint8_t bypladder_tbb; - uint8_t pd_lpfh_tbb; - uint8_t pd_lpflad_tbb; - uint8_t pd_lpfs5; - uint8_t en_g_tbb = 1; - uint8_t pd_iamp_tbb = 0; - uint8_t tstin_tbb = 0; - - BackupAllRegisters(); - //float_type userCLKGENfreq = GetFrequencyCGEN_MHz(); - - status = TuneTxFilterSetup(type, cutoff_MHz); - if (status != LIBLMS7_SUCCESS) - goto TxFilterTuneEnd; - cgenFreq = cutoff_MHz * 20; - if (cgenFreq < 60) - cgenFreq = 60; - if (cgenFreq > 640) - cgenFreq = 640; - if (type == TX_LADDER) - { - loopb_tbb = 2; - bypladder_tbb = 0; - pd_lpfh_tbb = 1; - pd_lpflad_tbb = 0; - pd_lpfs5 = 1; - lowLimit = gLadder_lower_limit; - highLimit = gLadder_higher_limit; - } - else if (type == TX_REALPOLE) - { - loopb_tbb = 3; - bypladder_tbb = 1; - pd_lpfh_tbb = 1; - pd_lpflad_tbb = 1; - pd_lpfs5 = 0; - lowLimit = gRealpole_lower_limit; - highLimit = gRealpole_higher_limit; - } - else if (type == TX_HIGHBAND) - { - loopb_tbb = 3; - bypladder_tbb = 0; - pd_lpfh_tbb = 0; - pd_lpflad_tbb = 1; - pd_lpfs5 = 1; - lowLimit = gHighband_lower_limit; - highLimit = gHighband_higher_limit; - } - if (cutoff_MHz == cgenFreq / 16) - cgenFreq -= 10; - - if (cutoff_MHz < lowLimit || cutoff_MHz > highLimit) - { - status = LIBLMS7_FREQUENCY_OUT_OF_RANGE; - goto TxFilterTuneEnd; - } - - status = SetFrequencyCGEN(cgenFreq); - if (status != LIBLMS7_SUCCESS) - goto TxFilterTuneEnd; - - Modify_SPI_Reg_bits(LMS7param(LOOPB_TBB), loopb_tbb); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), cg_iamp_tbb); - Modify_SPI_Reg_bits(LMS7param(BYPLADDER_TBB), bypladder_tbb); - Modify_SPI_Reg_bits(LMS7param(TSTIN_TBB), tstin_tbb); - Modify_SPI_Reg_bits(LMS7param(PD_LPFH_TBB), pd_lpfh_tbb); - Modify_SPI_Reg_bits(LMS7param(PD_LPFIAMP_TBB), pd_iamp_tbb); - Modify_SPI_Reg_bits(LMS7param(PD_LPFLAD_TBB), pd_lpflad_tbb); - Modify_SPI_Reg_bits(LMS7param(PD_LPFS5_TBB), pd_lpfs5); - Modify_SPI_Reg_bits(LMS7param(EN_G_TBB), en_g_tbb); - - //B - //LADDER coefficients - float_type p1, p2, p3, p4, p5; - switch (type) - { - case TX_LADDER: - p1 = 1.29858903647958E-16; - p2 = -0.000110746929967704; - p3 = 0.00277593485991029; - p4 = 21.0384293169607; - p5 = -48.4092606238297; - break; - case TX_REALPOLE: - p1 = 1.93821841029921E-15; - p2 = -0.0429694461214244; - p3 = 0.253501254059498; - p4 = 88.9545445989649; - p5 = -48.0847491316861; - break; - case TX_HIGHBAND: - p1 = 1.10383E-06; - p2 = -0.0002108; - p3 = 0.019049487; - p4 = 1.433174459; - p5 = -47.69507793; - break; - } - rcal = (int16_t)(pow(cutoff_MHz, 4)*p1 + pow(cutoff_MHz, 3)*p2 + pow(cutoff_MHz, 2)*p3 + cutoff_MHz * p4 + p5); - if (rcal < 0) - rcal = 0; - if (rcal > 255) - rcal = 255; - - if (type == TX_REALPOLE) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - else if (type == TX_LADDER) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), rcal); - else if (type == TX_HIGHBAND) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), rcal); - - FilterTuning_AdjustGains(); - - rssi_value_100k = (uint32_t)( GetRSSI()*0.707 ); - - SetNCOFrequency(Tx, 0, cutoff_MHz); - SetNCOFrequency(Rx, 0, cutoff_MHz - 1); - - for (ccal_lpflad_tbb = 31; ccal_lpflad_tbb > 0; --ccal_lpflad_tbb) - { - Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ccal_lpflad_tbb); - rssi = GetRSSI(); - if (rssi > rssi_value_100k && ccal_lpflad_tbb == 31) - break; //skip this search, continue to advanced search - if (rssi > rssi_value_100k) - { - status = LIBLMS7_SUCCESS; - goto TxFilterTuneEnd; //found correct value - } - } - - - //advanced search for c and r values - status = LIBLMS7_FAILURE; - dir = ccal_lpflad_tbb == 31 ? -1 : 1; - while (rcal > 0 && rcal < 255) - { - rcal += 5 * dir; - if (rcal < 0 && rcal > 255) - break; - if (type == TX_REALPOLE) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - else if (type == TX_LADDER) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), rcal); - else if (type == TX_HIGHBAND) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), rcal); - SetNCOFrequency(Tx, 0, ncoFreq); - SetNCOFrequency(Rx, 0, ncoFreq - 1); - Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), 16); - rssi_value_100k = GetRSSI(); - SetNCOFrequency(Tx, 0, cutoff_MHz); - SetNCOFrequency(Rx, 0, cutoff_MHz - 1); - for (ccal_lpflad_tbb = 31; ccal_lpflad_tbb > 0; --ccal_lpflad_tbb) - { - Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ccal_lpflad_tbb); - rssi = GetRSSI(); - if (rssi > rssi_value_100k*0.707 && ccal_lpflad_tbb == 31) - break; //skip c search, need to change r value - if (rssi > rssi_value_100k*0.707) - { - status = LIBLMS7_SUCCESS; - goto TxFilterTuneEnd; - } - } - } - - //end -TxFilterTuneEnd: - RestoreAllRegisters(); - if (status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ccal_lpflad_tbb); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); - - if (type == TX_REALPOLE) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - else if (type == TX_LADDER) - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), rcal); - else if (type == TX_HIGHBAND) - { - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFH_TBB), rcal); - Modify_SPI_Reg_bits(0x0105, 4, 0, 0x7); //set powerdowns - } - return LIBLMS7_SUCCESS; -} - -void LMS7002M::FilterTuning_AdjustGains() -{ - uint8_t cg_iamp_tbb; - uint32_t rssi = 0; - const uint32_t rssi_required = 0x8400; - uint8_t g_pga_rbb = (uint8_t)Get_SPI_Reg_bits(LMS7param(G_PGA_RBB)); - - while (g_pga_rbb < 31) - { - cg_iamp_tbb = 0; - while (cg_iamp_tbb < 63 && rssi < rssi_required) - { - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), cg_iamp_tbb); - rssi = GetRSSI(); - if (rssi > rssi_required) - return; - ++cg_iamp_tbb; - } - g_pga_rbb += 6; - if (g_pga_rbb > 31) - g_pga_rbb = 31; - Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB), g_pga_rbb); - } -} - -liblms7_status LMS7002M::TuneTxFilterLowBandChain(float_type bandwidth, float_type realpole_MHz) -{ - uint32_t rssi; - uint32_t rssi_value_10k; - bool prevRSSIbigger; - int16_t rcal; - float_type p1,p2,p3,p4,p5; - float_type ncoFreq = 0.05; - float_type cgenFreq; - BackupAllRegisters(); - - liblms7_status status = TuneTxFilter(TX_LADDER, bandwidth); - uint8_t ladder_c_value = (uint8_t)Get_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB)); - uint8_t ladder_r_value = (uint8_t)Get_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB)); - status = TuneTxFilterSetup(TX_LADDER, bandwidth); - - if (bandwidth < gLadder_lower_limit || bandwidth > gLadder_higher_limit) - { - status = LIBLMS7_FREQUENCY_OUT_OF_RANGE; - goto TxFilterLowBandChainEnd; - } - - //realpole calibration - //float userCLKGENfreq = GetFrequencyCGEN(); - - cgenFreq = realpole_MHz * 20; - if (cgenFreq < 60) - cgenFreq = 60; - if (cgenFreq > 640) - cgenFreq = 640; - - if (realpole_MHz < gRealpole_lower_limit || realpole_MHz > gRealpole_higher_limit) - { - status = LIBLMS7_FREQUENCY_OUT_OF_RANGE; - goto TxFilterLowBandChainEnd; - } - - status = SetFrequencyCGEN(cgenFreq); - if (status != LIBLMS7_SUCCESS) - goto TxFilterLowBandChainEnd; - - Modify_SPI_Reg_bits(LMS7param(LOOPB_TBB), 3); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(BYPLADDER_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(TSTIN_TBB), 0); - Modify_SPI_Reg_bits(LMS7param(PD_LPFH_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(PD_LPFIAMP_TBB), 0); - Modify_SPI_Reg_bits(LMS7param(PD_LPFLAD_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(PD_LPFS5_TBB), 0); - Modify_SPI_Reg_bits(LMS7param(EN_G_TBB), 1); - - //B - p1 = 1.93821841029921E-15; - p2 = -0.0429694461214244; - p3 = 0.253501254059498; - p4 = 88.9545445989649; - p5 = -48.0847491316861; - rcal = (int16_t)(pow(realpole_MHz, 4)*p1 + pow(realpole_MHz, 3)*p2 + pow(realpole_MHz, 2)*p3 + realpole_MHz * p4 + p5); - if (rcal < 0) - rcal = 0; - if (rcal > 255) - rcal = 255; - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - - FilterTuning_AdjustGains(); - - rssi_value_10k = GetRSSI(); - SetNCOFrequency(Tx, 0, realpole_MHz); - SetNCOFrequency(Rx, 0, realpole_MHz - 1); - - prevRSSIbigger = GetRSSI() > rssi_value_10k*0.707; - status = LIBLMS7_FAILURE; //assuming r value is not found - while (rcal >= 0 && rcal < 256) - { - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - SetNCOFrequency(Tx, 0, ncoFreq); - SetNCOFrequency(Rx, 0, ncoFreq - 1); - rssi_value_10k = (uint32_t)( GetRSSI()*0.707 ); - - SetNCOFrequency(Tx, 0, realpole_MHz); - SetNCOFrequency(Rx, 0, realpole_MHz - 1); - - rssi = GetRSSI(); - if (rssi > rssi_value_10k) - --rcal; - else - { - if (prevRSSIbigger) - { - --rcal; - status = LIBLMS7_SUCCESS; - goto TxFilterLowBandChainEnd; - } - ++rcal; - } - prevRSSIbigger = rssi > rssi_value_10k; - } - - //end -TxFilterLowBandChainEnd: - RestoreAllRegisters(); - if (status != LIBLMS7_SUCCESS) - return status; - - Modify_SPI_Reg_bits(LMS7param(CCAL_LPFLAD_TBB), ladder_c_value); - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFLAD_TBB), ladder_r_value); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); - Modify_SPI_Reg_bits(LMS7param(RCAL_LPFS5_TBB), rcal); - Modify_SPI_Reg_bits(0x0105, 4, 0, 0x11); //set powerdowns - - return LIBLMS7_SUCCESS; -} - -liblms7_status LMS7002M::TuneRxFilter(RxFilter filter, float_type bandwidth_MHz) -{ - liblms7_status status; - uint16_t cfb_tia_rfe; - uint16_t c_ctl_lpfl_rbb; - uint8_t ccomp_tia_rfe; - uint8_t rcomp_tia_rfe; - uint8_t c_ctl_lpfh_rbb; - uint8_t ict_pga_out; - uint8_t ict_pga_in; - uint8_t r_ctl_lpf_rbb; - uint8_t c_ctl_pga_rbb; - uint8_t rcc_ctl_lpfl_rbb; - uint8_t rcc_ctl_lpfh_rbb; - float_type lowerLimit; - float_type higherLimit; - if (filter == RX_TIA) - { - lowerLimit = Get_SPI_Reg_bits(LMS7param(G_TIA_RFE)) == 1 ? gRxTIA_lower_limit_g1 : gRxTIA_lower_limit_g23; - higherLimit = gRxTIA_higher_limit; - } - else if (filter == RX_LPF_LOWBAND) - { - lowerLimit = gRxLPF_low_lower_limit; - higherLimit = gRxLPF_low_higher_limit; - } - else if (filter == RX_LPF_HIGHBAND) - { - lowerLimit = gRxLPF_high_lower_limit; - higherLimit = gRxLPF_high_higher_limit; - } - if (bandwidth_MHz < lowerLimit || bandwidth_MHz > higherLimit) - return LIBLMS7_FREQUENCY_OUT_OF_RANGE; - - BackupAllRegisters(); - - status = TuneRxFilterSetup(filter, bandwidth_MHz); - if (status != LIBLMS7_SUCCESS) - goto RxFilterTuneEnd; - - if (filter == RX_TIA) - status = RFE_TIA_Calibration(bandwidth_MHz); - else if (filter == RX_LPF_LOWBAND) - status = RxLPFLow_Calibration(bandwidth_MHz); - else if (filter == RX_LPF_HIGHBAND) - status = RxLPFHigh_Calibration(bandwidth_MHz); - - cfb_tia_rfe = Get_SPI_Reg_bits(LMS7param(CFB_TIA_RFE)); - c_ctl_lpfl_rbb = Get_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB)); - ccomp_tia_rfe = (int8_t)Get_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE)); - rcomp_tia_rfe = (int8_t)Get_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE)); - c_ctl_lpfh_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB)); - ict_pga_out = (int8_t)Get_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB)); - ict_pga_in = (int8_t)Get_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB)); - r_ctl_lpf_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(R_CTL_LPF_RBB)); - c_ctl_pga_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB)); - rcc_ctl_lpfl_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB)); - rcc_ctl_lpfh_rbb = (int8_t)Get_SPI_Reg_bits(LMS7param(RCC_CTL_LPFH_RBB)); - -RxFilterTuneEnd: - RestoreAllRegisters(); - if (status != LIBLMS7_SUCCESS) - return status; - - if (filter == RX_TIA) - { - Modify_SPI_Reg_bits(LMS7param(ICT_TIAMAIN_RFE), 2); - Modify_SPI_Reg_bits(LMS7param(ICT_TIAOUT_RFE), 2); - Modify_SPI_Reg_bits(LMS7param(RFB_TIA_RFE), 16); - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), cfb_tia_rfe); - Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), ccomp_tia_rfe); - Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), rcomp_tia_rfe); - Modify_SPI_Reg_bits(0x010c, 1, 0, 0x1); - } - else if (filter == RX_LPF_LOWBAND) - { - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), rcc_ctl_lpfl_rbb); - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), c_ctl_lpfl_rbb); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), ict_pga_out); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), ict_pga_in); - Modify_SPI_Reg_bits(LMS7param(R_CTL_LPF_RBB), r_ctl_lpf_rbb); - Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), c_ctl_pga_rbb); - Modify_SPI_Reg_bits(0x0115, 3, 0, 0x9); - Modify_SPI_Reg_bits(0x0118, 15, 13, 0x1); - } - else if (filter == RX_LPF_HIGHBAND) - { - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFH_RBB), rcc_ctl_lpfh_rbb); - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB), c_ctl_lpfh_rbb); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), ict_pga_out); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), ict_pga_in); - Modify_SPI_Reg_bits(LMS7param(R_CTL_LPF_RBB), r_ctl_lpf_rbb); - Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), c_ctl_pga_rbb); - Modify_SPI_Reg_bits(0x0115, 3, 0, 0x5); - Modify_SPI_Reg_bits(0x0118, 15, 13, 0x0); - } - return LIBLMS7_SUCCESS; -} - -liblms7_status LMS7002M::TuneRxFilterSetup(RxFilter type, float_type cutoff_MHz) -{ - liblms7_status status; - uint8_t ch = (uint8_t)Get_SPI_Reg_bits(LMS7param(MAC)); - - //RFE - uint8_t g_tia_rfe = (uint8_t)Get_SPI_Reg_bits(LMS7param(G_TIA_RFE)); - SetDefaults(RFE); - Modify_SPI_Reg_bits(LMS7param(SEL_PATH_RFE), 2); - - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTRX_RFE), 1); - else - Modify_SPI_Reg_bits(LMS7param(EN_NEXTRX_RFE), 0); - - Modify_SPI_Reg_bits(LMS7param(G_RXLOOPB_RFE), 8); - Modify_SPI_Reg_bits(LMS7param(PD_RLOOPB_2_RFE), 0); - Modify_SPI_Reg_bits(LMS7param(EN_INSHSW_LB2_RFE), 0); - Modify_SPI_Reg_bits(LMS7param(PD_MXLOBUF_RFE), 0); - Modify_SPI_Reg_bits(LMS7param(PD_QGEN_RFE), 0); - Modify_SPI_Reg_bits(LMS7param(ICT_TIAMAIN_RFE), 2); - Modify_SPI_Reg_bits(LMS7param(ICT_TIAOUT_RFE), 2); - Modify_SPI_Reg_bits(LMS7param(RFB_TIA_RFE), 16); - Modify_SPI_Reg_bits(LMS7param(G_TIA_RFE), g_tia_rfe); - - //RBB - SetDefaults(RBB); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_OUT_RBB), 20); - Modify_SPI_Reg_bits(LMS7param(ICT_PGA_IN_RBB), 20); - Modify_SPI_Reg_bits(LMS7param(C_CTL_PGA_RBB), 3); - - //TRF - SetDefaults(TRF); - Modify_SPI_Reg_bits(LMS7param(L_LOOPB_TXPAD_TRF), 0); - Modify_SPI_Reg_bits(LMS7param(EN_LOOPB_TXPAD_TRF), 1); - if (ch == 2) - Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 1); - else - Modify_SPI_Reg_bits(LMS7param(EN_NEXTTX_TRF), 0); - Modify_SPI_Reg_bits(LMS7param(SEL_BAND1_TRF), 0); - Modify_SPI_Reg_bits(LMS7param(SEL_BAND2_TRF), 1); - - //TBB - SetDefaults(TBB); - Modify_SPI_Reg_bits(LMS7param(CG_IAMP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_FRP_TBB), 1); - Modify_SPI_Reg_bits(LMS7param(ICT_IAMP_GG_FRP_TBB), 6); - - //AFE - SetDefaults(AFE); - if (ch == 2) - { - Modify_SPI_Reg_bits(LMS7param(PD_TX_AFE2), 0); - Modify_SPI_Reg_bits(LMS7param(PD_RX_AFE2), 0); - } - //BIAS - uint8_t rp_calib_bias = (uint8_t)Get_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS)); - SetDefaults(BIAS); - Modify_SPI_Reg_bits(LMS7param(RP_CALIB_BIAS), rp_calib_bias); - - //XBUF - Modify_SPI_Reg_bits(LMS7param(PD_XBUF_RX), 0); - Modify_SPI_Reg_bits(LMS7param(PD_XBUF_TX), 0); - Modify_SPI_Reg_bits(LMS7param(EN_G_TRF), 1); - - //CLKGEN - SetDefaults(CGEN); - - //SXR - Modify_SPI_Reg_bits(LMS7param(MAC), 1); - SetDefaults(SX); - status = SetFrequencySX(Rx, 499.95, mRefClkSXR_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(PD_VCO), 0); - - //SXT - Modify_SPI_Reg_bits(LMS7param(MAC), 2); - SetDefaults(SX); - status = SetFrequencySX(Tx, 500, mRefClkSXT_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - Modify_SPI_Reg_bits(LMS7param(PD_VCO), 0); - - Modify_SPI_Reg_bits(LMS7param(MAC), ch); - //TxTSP - SetDefaults(TxTSP); - Modify_SPI_Reg_bits(LMS7param(TSGMODE_TXTSP), 1); - Modify_SPI_Reg_bits(LMS7param(INSEL_TXTSP), 1); - Modify_SPI_Reg_bits(0x0208, 8, 8, 1); - Modify_SPI_Reg_bits(0x0208, 6, 4, 0x7); - LoadDC_REG_IQ(Tx, (int16_t)0x7FFF, (int16_t)0x8000); - SetNCOFrequency(Tx, 0, 0); - - //RxTSP - SetDefaults(RxTSP); - Modify_SPI_Reg_bits(LMS7param(AGC_MODE_RXTSP), 1); - Modify_SPI_Reg_bits(0x040C, 5, 3, 0x7); - Modify_SPI_Reg_bits(LMS7param(AGC_AVG_RXTSP), 7); - Modify_SPI_Reg_bits(LMS7param(CMIX_GAIN_RXTSP), 1); - - float_type sxtfreq = GetFrequencySX_MHz(Tx, mRefClkSXT_MHz); - float_type sxrfreq = GetFrequencySX_MHz(Rx, mRefClkSXR_MHz); - SetNCOFrequency(Rx, 0, sxtfreq - sxrfreq - 1); - return LIBLMS7_SUCCESS; -} - -liblms7_status LMS7002M::RFE_TIA_Calibration(float_type TIA_freq_MHz) -{ - liblms7_status status; - bool prevRSSIbigger; - uint8_t ccomp_tia_rfe_value; - int16_t rcomp_tia_rfe; - float_type cgenFreq = TIA_freq_MHz * 20; - uint32_t rssi; - uint32_t rssi_value_50k; - //RFE - uint8_t g_tia_rfe = (uint8_t)Get_SPI_Reg_bits(LMS7param(G_TIA_RFE)); - int16_t cfb_tia_rfe_value; - if (g_tia_rfe == 1) - cfb_tia_rfe_value = (uint16_t)(5400 / TIA_freq_MHz - 15); - else if (g_tia_rfe > 1) - cfb_tia_rfe_value = (uint16_t)(1680 / TIA_freq_MHz - 10); - else - return LIBLMS7_FAILURE; - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), cfb_tia_rfe_value); - - if (g_tia_rfe == 1) - ccomp_tia_rfe_value = (uint8_t)(cfb_tia_rfe_value / 100 + 1); - else if (g_tia_rfe > 1) - ccomp_tia_rfe_value = (uint8_t)(cfb_tia_rfe_value / 100); - else - return LIBLMS7_FAILURE; - if (ccomp_tia_rfe_value > 15) - ccomp_tia_rfe_value = 15; - - Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), ccomp_tia_rfe_value); - - rcomp_tia_rfe = (int16_t)(15 - cfb_tia_rfe_value * 2 / 100); - if (rcomp_tia_rfe < 0) - rcomp_tia_rfe = 0; - Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), rcomp_tia_rfe); - - //RBB - Modify_SPI_Reg_bits(LMS7param(INPUT_CTL_PGA_RBB), 2); - Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 1); - - //CLKGEN - if (cgenFreq < 60) - cgenFreq = 60; - if (cgenFreq > 640) - cgenFreq = 640; - - if (cgenFreq / 16 == TIA_freq_MHz) - status = SetFrequencyCGEN(cgenFreq - 10); - else - status = SetFrequencyCGEN(cgenFreq); - if (status != LIBLMS7_SUCCESS) - return status; - - FilterTuning_AdjustGains(); - - rssi_value_50k = (uint32_t)( GetRSSI() * 0.707 ); - status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - TIA_freq_MHz, mRefClkSXR_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - SetNCOFrequency(Rx, 0, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - GetFrequencySX_MHz(Rx, mRefClkSXR_MHz) - 1); - - prevRSSIbigger = GetRSSI() > rssi_value_50k; - while (cfb_tia_rfe_value >= 0 && cfb_tia_rfe_value < 4096) - { - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), cfb_tia_rfe_value); - rssi = GetRSSI(); - if (rssi > rssi_value_50k) - ++cfb_tia_rfe_value; - else - { - --cfb_tia_rfe_value; - if (prevRSSIbigger) - return LIBLMS7_SUCCESS; //found correct value - } - prevRSSIbigger = rssi > rssi_value_50k; - } - return LIBLMS7_FAILURE; -} - -liblms7_status LMS7002M::RxLPFLow_Calibration(float_type RxLPFL_freq_MHz) -{ - liblms7_status status; - uint32_t rssi; - uint32_t rssi_value_50k; - int32_t c_ctl_lpfl_rbb; - bool prevRSSIbigger; - float_type cgenFreq_MHz = RxLPFL_freq_MHz * 20; - //RFE - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), 15); - Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), 1); - Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), 15); - Modify_SPI_Reg_bits(LMS7param(G_TIA_RFE), 1); - - //RBB - c_ctl_lpfl_rbb = (int32_t)(2160 / RxLPFL_freq_MHz - 103); - if (c_ctl_lpfl_rbb < 0) - c_ctl_lpfl_rbb = 0; - if (c_ctl_lpfl_rbb > 2047) - c_ctl_lpfl_rbb = 2047; - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), c_ctl_lpfl_rbb); - - if (RxLPFL_freq_MHz >= 15) - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 5); - else if (RxLPFL_freq_MHz >= 10) - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 4); - else if (RxLPFL_freq_MHz >= 5) - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 3); - else if (RxLPFL_freq_MHz >= 3) - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 2); - else if (RxLPFL_freq_MHz >= 1.4) - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 1); - else - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFL_RBB), 0); - - //CLKGEN - if (cgenFreq_MHz < 60) - cgenFreq_MHz = 60; - if (cgenFreq_MHz > 640) - cgenFreq_MHz = 640; - if (cgenFreq_MHz / 16 == RxLPFL_freq_MHz) - status = SetFrequencyCGEN(cgenFreq_MHz - 10); - else - status = SetFrequencyCGEN(cgenFreq_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - - FilterTuning_AdjustGains(); - - rssi_value_50k = (uint32_t)( GetRSSI() * 0.707 ); - status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - RxLPFL_freq_MHz, mRefClkSXR_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - SetNCOFrequency(Rx, 0, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - GetFrequencySX_MHz(Rx, mRefClkSXR_MHz) - 1); - - prevRSSIbigger = GetRSSI() > rssi_value_50k; - while (c_ctl_lpfl_rbb >= 0 && c_ctl_lpfl_rbb < 2048) - { - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFL_RBB), c_ctl_lpfl_rbb); - rssi = GetRSSI(); - if (rssi > rssi_value_50k) - ++c_ctl_lpfl_rbb; - else - { - --c_ctl_lpfl_rbb; - if (prevRSSIbigger) - return LIBLMS7_SUCCESS; //found correct value - } - prevRSSIbigger = rssi > rssi_value_50k; - } - return LIBLMS7_FAILURE; -} - -liblms7_status LMS7002M::RxLPFHigh_Calibration(float_type RxLPFH_freq_MHz) -{ - liblms7_status status; - int16_t c_ctl_lpfh_rbb; - int16_t rcc_ctl_lpfh_rbb; - float_type cgenFreq = RxLPFH_freq_MHz * 20; - uint32_t rssi; - uint32_t rssi_value_50k; - bool prevRSSIbigger; - //RFE - Modify_SPI_Reg_bits(LMS7param(CFB_TIA_RFE), 15); - Modify_SPI_Reg_bits(LMS7param(CCOMP_TIA_RFE), 1); - Modify_SPI_Reg_bits(LMS7param(RCOMP_TIA_RFE), 15); - Modify_SPI_Reg_bits(LMS7param(G_TIA_RFE), 1); - - //RBB - c_ctl_lpfh_rbb = (int16_t)(6000 / RxLPFH_freq_MHz - 50); - if (c_ctl_lpfh_rbb < 0) - c_ctl_lpfh_rbb = 0; - if (c_ctl_lpfh_rbb > 255) - c_ctl_lpfh_rbb = 255; - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB), c_ctl_lpfh_rbb); - - rcc_ctl_lpfh_rbb = (int16_t)(RxLPFH_freq_MHz / 10 - 3); - if (rcc_ctl_lpfh_rbb < 0) - rcc_ctl_lpfh_rbb = 0; - Modify_SPI_Reg_bits(LMS7param(RCC_CTL_LPFH_RBB), rcc_ctl_lpfh_rbb); - - Modify_SPI_Reg_bits(LMS7param(INPUT_CTL_PGA_RBB), 1); - Modify_SPI_Reg_bits(LMS7param(PD_LPFL_RBB), 1); - Modify_SPI_Reg_bits(LMS7param(PD_LPFH_RBB), 0); - - //CLKGEN - if (cgenFreq < 60) - cgenFreq = 60; - if (cgenFreq > 640) - cgenFreq = 640; - if (cgenFreq / 16 == RxLPFH_freq_MHz) - status = SetFrequencyCGEN(cgenFreq - 10); - else - status = SetFrequencyCGEN(cgenFreq); - if (status != LIBLMS7_SUCCESS) - return status; - - FilterTuning_AdjustGains(); - - rssi_value_50k = (uint32_t)( GetRSSI() * 0.707); - status = SetFrequencySX(Rx, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - RxLPFH_freq_MHz, mRefClkSXR_MHz); - if (status != LIBLMS7_SUCCESS) - return status; - SetNCOFrequency(Rx, 0, GetFrequencySX_MHz(Tx, mRefClkSXT_MHz) - GetFrequencySX_MHz(Rx, mRefClkSXR_MHz) - 1); - - prevRSSIbigger = GetRSSI() > rssi_value_50k; - while (c_ctl_lpfh_rbb >= 0 && c_ctl_lpfh_rbb < 256) - { - Modify_SPI_Reg_bits(LMS7param(C_CTL_LPFH_RBB), c_ctl_lpfh_rbb); - rssi = GetRSSI(); - if (rssi > rssi_value_50k) - ++c_ctl_lpfh_rbb; - else - { - --c_ctl_lpfh_rbb; - if (prevRSSIbigger) - return LIBLMS7_SUCCESS; //found correct value - } - prevRSSIbigger = rssi > rssi_value_50k; - } - return LIBLMS7_FAILURE; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.cpp deleted file mode 100644 index b28887d776..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.cpp +++ /dev/null @@ -1,601 +0,0 @@ -/** -@file LMS7002M_parameters.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Definition of LMS7002M transceiver control parameters registers -*/ - -#include "LMS7002M_parameters.h" - -std::vector LMS7parameterList; - -const struct LMS7Parameter LRST_TX_B = { 0x0020, 15, 15, 1, "LRST_TX_B", "Resets all the logic registers to the default state for Tx MIMO channel B" }; -const struct LMS7Parameter MRST_TX_B = { 0x0020, 14, 14, 1, "MRST_TX_B", "Resets all the configuration memory to the default state for Tx MIMO channel B" }; -const struct LMS7Parameter LRST_TX_A = { 0x0020, 13, 13, 1, "LRST_TX_A", "Resets all the logic registers to the default state for Tx MIMO channel A" }; -const struct LMS7Parameter MRST_TX_A = { 0x0020, 12, 12, 1, "MRST_TX_A", "Resets all the configuration memory to the default state for Tx MIMO channel A" }; -const struct LMS7Parameter LRST_RX_B = { 0x0020, 11, 11, 1, "LRST_RX_B", "Resets all the logic registers to the default state for Rx MIMO channel B" }; -const struct LMS7Parameter MRST_RX_B = { 0x0020, 10, 10, 1, "MRST_RX_B", "Resets all the configuration memory to the default state for Rx MIMO channel B" }; -const struct LMS7Parameter LRST_RX_A = { 0x0020, 9, 9, 1, "LRST_RX_A", "Resets all the logic registers to the default state for Rx MIMO channel A" }; -const struct LMS7Parameter MRST_RX_A = { 0x0020, 8, 8, 1, "MRST_RX_A", "Resets all the configuration memory to the default state for Rx MIMO channel A" }; -const struct LMS7Parameter SRST_RXFIFO = { 0x0020, 7, 7, 1, "SRST_RXFIFO", "RX FIFO soft reset (LimeLight Interface)" }; -const struct LMS7Parameter SRST_TXFIFO = { 0x0020, 6, 6, 1, "SRST_TXFIFO", "TX FIFO soft reset (LimeLight Interface)" }; -const struct LMS7Parameter RXEN_B = { 0x0020, 5, 5, 1, "RXEN_B", "Power control for Rx MIMO channel B" }; -const struct LMS7Parameter RXEN_A = { 0x0020, 4, 4, 1, "RXEN_A", "Power control for Rx MIMO channel A" }; -const struct LMS7Parameter TXEN_B = { 0x0020, 3, 3, 1, "TXEN_B", "Power control for Tx MIMO channel B" }; -const struct LMS7Parameter TXEN_A = { 0x0020, 2, 2, 1, "TXEN_A", "Power control for Tx MIMO channel A" }; -const struct LMS7Parameter MAC = { 0x0020, 1, 0, 3, "MAC", "Selects MIMO channel for communication" }; -const struct LMS7Parameter TX_CLK_PE = { 0x0021, 11, 11, 1, "TX_CLK_PE", "Pull up control of TX_CLK pad" }; -const struct LMS7Parameter RX_CLK_PE = { 0x0021, 10, 10, 1, "RX_CLK_PE", "Pull up control of RX_CLK pad" }; -const struct LMS7Parameter SDA_PE = { 0x0021, 9, 9, 1, "SDA_PE", "Pull up control of SDA pad" }; -const struct LMS7Parameter SDA_DS = { 0x0021, 8, 8, 0, "SDA_DS", "Driver strength of SDA pad" }; -const struct LMS7Parameter SCL_PE = { 0x0021, 7, 7, 1, "SCL_PE", "Pull up control of SCL pad" }; -const struct LMS7Parameter SCL_DS = { 0x0021, 6, 6, 0, "SCL_DS", "Driver strength of SCL pad" }; -const struct LMS7Parameter SDIO_DS = { 0x0021, 5, 5, 0, "SDIO_DS", "Driver strength of SDIO pad" }; -const struct LMS7Parameter SDIO_PE = { 0x0021, 4, 4, 1, "SDIO_PE", "Pull up control of SDIO pad" }; -const struct LMS7Parameter SDO_PE = { 0x0021, 3, 3, 1, "SDO_PE", "Pull up control of SDO pad" }; -const struct LMS7Parameter SCLK_PE = { 0x0021, 2, 2, 1, "SCLK_PE", "Pull up control of SCLK pad" }; -const struct LMS7Parameter SEN_PE = { 0x0021, 1, 1, 1, "SEN_PE", "Pull up control of SEN pad" }; -const struct LMS7Parameter SPIMODE = { 0x0021, 0, 0, 1, "SPIMODE", "SPI communication mode" }; -const struct LMS7Parameter DIQ2_DS = { 0x0022, 11, 11, 0, "DIQ2_DS", "Driver strength of DIQ2 pad" }; -const struct LMS7Parameter DIQ2_PE = { 0x0022, 10, 10, 1, "DIQ2_PE", "Pull up control of DIQ2 pad" }; -const struct LMS7Parameter IQ_SEL_EN_2_PE = { 0x0022, 9, 9, 1, "IQ_SEL_EN_2_PE", "Pull up control of IQ_SEL_EN_2 pad" }; -const struct LMS7Parameter TXNRX2_PE = { 0x0022, 8, 8, 1, "TXNRX2_PE", "Pull up control of TXNRX2 pad" }; -const struct LMS7Parameter FCLK2_PE = { 0x0022, 7, 7, 1, "FCLK2_PE", "Pull up control of FCLK2 pad" }; -const struct LMS7Parameter MCLK2_PE = { 0x0022, 6, 6, 1, "MCLK2_PE", "Pull up control of MCLK2 pad" }; -const struct LMS7Parameter DIQ1_DS = { 0x0022, 5, 5, 0, "DIQ1_DS", "Pull up control of MCLK2 pad" }; -const struct LMS7Parameter DIQ1_PE = { 0x0022, 4, 4, 1, "DIQ1_PE", "Pull up control of DIQ1 pad" }; -const struct LMS7Parameter IQ_SEL_EN_1_PE = { 0x0022, 3, 3, 1, "IQ_SEL_EN_1_PE", "Pull up control of IQ_SEL_EN_1 pad" }; -const struct LMS7Parameter TXNRX1_PE = { 0x0022, 2, 2, 1, "TXNRX1_PE", "Pull up control of TXNRX1 pad" }; -const struct LMS7Parameter FCLK1_PE = { 0x0022, 1, 1, 1, "FCLK1_PE", "Pull up control of FCLK1 pad" }; -const struct LMS7Parameter MCLK1_PE = { 0x0022, 0, 0, 1, "MCLK1_PE", "Pull up control of MCLK1 pad" }; -const struct LMS7Parameter DIQDIRCTR2 = { 0x0023, 15, 15, 0, "DIQDIRCTR2", "DIQ2 direction control mode" }; -const struct LMS7Parameter DIQDIR2 = { 0x0023, 14, 14, 1, "DIQDIR2", "DIQ2 direction" }; -const struct LMS7Parameter DIQDIRCTR1 = { 0x0023, 13, 13, 0, "DIQDIRCTR1", "DIQ1 direction control mode" }; -const struct LMS7Parameter DIQDIR1 = { 0x0023, 12, 12, 1, "DIQDIR1", "DIQ1 direction" }; -const struct LMS7Parameter ENABLEDIRCTR2 = { 0x0023, 11, 11, 0, "ENABLEDIRCTR2", "ENABLE2 direction control mode" }; -const struct LMS7Parameter ENABLEDIR2 = { 0x0023, 10, 10, 1, "ENABLEDIR2", "ENABLE2 direction" }; -const struct LMS7Parameter ENABLEDIRCTR1 = { 0x0023, 9, 9, 0, "ENABLEDIRCTR1", "ENABLE1 direction control mode" }; -const struct LMS7Parameter ENABLEDIR1 = { 0x0023, 8, 8, 1, "ENABLEDIR1", "ENABLE1 direction." }; -const struct LMS7Parameter MOD_EN = { 0x0023, 6, 6, 1, "MOD_EN", "LimeLight interface enable" }; -const struct LMS7Parameter LML2_FIDM = { 0x0023, 5, 5, 0, "LML2_FIDM", "Frame start ID selection for Port 2 when LML_MODE2 = 0" }; -const struct LMS7Parameter LML2_TXNRXIQ = { 0x0023, 4, 4, 1, "LML2_TXNRXIQ", "TXIQ/RXIQ mode selection for Port 2 when LML_MODE2 = 0" }; -const struct LMS7Parameter LML2_MODE = { 0x0023, 3, 3, 1, "LML2_MODE", "Mode of LimeLight Port 2" }; -const struct LMS7Parameter LML1_FIDM = { 0x0023, 2, 2, 0, "LML1_FIDM", "Frame start ID selection for Port 1 when LML_MODE1 = 0" }; -const struct LMS7Parameter LML1_TXNRXIQ = { 0x0023, 1, 1, 0, "LML1_TXNRXIQ", "TXIQ/RXIQ mode selection for Port 1 when LML_MODE1 = 0" }; -const struct LMS7Parameter LML1_MODE = { 0x0023, 0, 0, 1, "LML1_MODE", "Mode of LimeLight Port 1" }; -const struct LMS7Parameter LML1_S3S = { 0x0024, 15, 14, 3, "LML1_S3S", "Sample source in position 3, when Port 1 is RF2BB" }; -const struct LMS7Parameter LML1_S2S = { 0x0024, 13, 12, 2, "LML1_S2S", "Sample source in position 2, when Port 1 is RF2BB" }; -const struct LMS7Parameter LML1_S1S = { 0x0024, 11, 10, 1, "LML1_S1S", "Sample source in position 1, when Port 1 is RF2BB" }; -const struct LMS7Parameter LML1_S0S = { 0x0024, 9, 8, 0, "LML1_S0S", "Sample source in position 0, when Port 1 is RF2BB" }; -const struct LMS7Parameter LML1_BQP = { 0x0024, 7, 6, 3, "LML1_BQP", "BQ sample position in frame, when Port 1 is BB2RF" }; -const struct LMS7Parameter LML1_BIP = { 0x0024, 5, 4, 2, "LML1_BIP", "BI sample position in frame, when Port 1 is BB2RF" }; -const struct LMS7Parameter LML1_AQP = { 0x0024, 3, 2, 1, "LML1_AQP", "AQ sample position in frame, when Port 1 is BB2RF" }; -const struct LMS7Parameter LML1_AIP = { 0x0024, 1, 0, 0, "LML1_AIP", "AI sample position in frame, when Port 1 is BB2RF" }; -const struct LMS7Parameter LML1_BB2RF_PST = { 0x0025, 15, 8, 1, "LML1_BB2RF_PST", "Number of clock cycles to wait before data drive stop after burst stop is detected in JESD207 mode on Port 1 and Port 1 BB2RF" }; -const struct LMS7Parameter LML1_BB2RF_PRE = { 0x0025, 7, 0, 1, "LML1_BB2RF_PRE", "Number of clock cycles to wait before data drive start after burst start is detected in JESD207 mode on Port 1 and Port 1 BB2RF" }; -const struct LMS7Parameter LML1_RF2BB_PST = { 0x0026, 15, 8, 1, "LML1_RF2BB_PST", "Number of clock cycles to wait before data capture stop after burst stop is detected in JESD207 mode on Port 1 and Port 1 is RF2BB" }; -const struct LMS7Parameter LML1_RF2BB_PRE = { 0x0026, 7, 0, 1, "LML1_RF2BB_PRE", "Number of clock cycles to wait before data capture start after burst start is detected in JESD207 mode on Port 1 and Port 1 RF2BB" }; -const struct LMS7Parameter LML2_S3S = { 0x0027, 15, 14, 3, "LML2_S3S", "Sample source in position 3, when Port 2 is RF2BB" }; -const struct LMS7Parameter LML2_S2S = { 0x0027, 13, 12, 2, "LML2_S2S", "Sample source in position 2, when Port 2 is RF2BB" }; -const struct LMS7Parameter LML2_S1S = { 0x0027, 11, 10, 1, "LML2_S1S", "Sample source in position 1, when Port 2 is RF2BB" }; -const struct LMS7Parameter LML2_S0S = { 0x0027, 9, 8, 0, "LML2_S0S", "Sample source in position 0, when Port 2 is RF2BB" }; -const struct LMS7Parameter LML2_BQP = { 0x0027, 7, 6, 3, "LML2_BQP", "BQ sample position in frame, when Port 2 is BB2RF" }; -const struct LMS7Parameter LML2_BIP = { 0x0027, 5, 4, 2, "LML2_BIP", "BI sample position in frame, when Port 2 is BB2RF" }; -const struct LMS7Parameter LML2_AQP = { 0x0027, 3, 2, 1, "LML2_AQP", "AQ sample position in frame, when Port 2 is BB2RF" }; -const struct LMS7Parameter LML2_AIP = { 0x0027, 1, 0, 0, "LML2_AIP", "AI sample position in frame, when Port 2 is BB2RF" }; -const struct LMS7Parameter LML2_BB2RF_PST = { 0x0028, 15, 8, 1, "LML2_BB2RF_PST", "Number of clock cycles to wait before data drive stop after burst stop is detected in JESD207 mode on Port 2 and Port 2 BB2RF" }; -const struct LMS7Parameter LML2_BB2RF_PRE = { 0x0028, 7, 0, 1, "LML2_BB2RF_PRE", "Number of clock cycles to wait before data drive start after burst start is detected in JESD207 mode on Port 2 and Port 2 BB2RF" }; -const struct LMS7Parameter LML2_RF2BB_PST = { 0x0029, 15, 8, 1, "LML2_RF2BB_PST", "Number of clock cycles to wait before data capture stop after burst stop is detected in JESD207 mode on Port 2 and Port 2 RF2BB" }; -const struct LMS7Parameter LML2_RF2BB_PRE = { 0x0029, 7, 0, 1, "LML2_RF2BB_PRE", "Number of clock cycles to wait before data capture start after burst start is detected in JESD207 mode on Port 2 and Port 2 RF2BB" }; -const struct LMS7Parameter FCLK2_DLY = { 0x002A, 15, 14, 0, "FCLK2_DLY", "" }; -const struct LMS7Parameter FCLK1_DLY = { 0x002A, 13, 12, 0, "FCLK1_DLY", "" }; -const struct LMS7Parameter RX_MUX = { 0x002A, 11, 10, 0, "RX_MUX", "RxFIFO data source selection" }; -const struct LMS7Parameter TX_MUX = { 0x002A, 9, 8, 0, "TX_MUX", "Port selection for data transmit to TSP" }; -const struct LMS7Parameter TXRDCLK_MUX = { 0x002A, 7, 6, 2, "TXRDCLK_MUX", "TX FIFO read clock selection" }; -const struct LMS7Parameter TXWRCLK_MUX = { 0x002A, 5, 4, 0, "TXWRCLK_MUX", "TX FIFO write clock selection" }; -const struct LMS7Parameter RXRDCLK_MUX = { 0x002A, 3, 2, 1, "RXRDCLK_MUX", "RX FIFO read clock selection" }; -const struct LMS7Parameter RXWRCLK_MUX = { 0x002A, 1, 0, 2, "RXWRCLK_MUX", "RX FIFO write clock selection" }; -const struct LMS7Parameter FCLK2_INV = { 0x002B, 15, 15, 0, "FCLK2_INV", "FCLK2 clock inversion" }; -const struct LMS7Parameter FCLK1_INV = { 0x002B, 14, 14, 0, "FCLK1_INV", "FCLK1 clock inversion" }; -const struct LMS7Parameter MCLK2DLY = { 0x002B, 13, 12, 0, "MCLK2DLY", "MCLK2 clock internal delay" }; -const struct LMS7Parameter MCLK1DLY = { 0x002B, 11, 10, 0, "MCLK1DLY", "MCLK1 clock internal delay" }; -const struct LMS7Parameter MCLK2SRC = { 0x002B, 5, 4, 1, "MCLK2SRC", "MCLK2 clock source" }; -const struct LMS7Parameter MCLK1SRC = { 0x002B, 3, 2, 0, "MCLK1SRC", "MCLK1 clock source" }; -const struct LMS7Parameter TXDIVEN = { 0x002B, 1, 1, 0, "TXDIVEN", "TX clock divider enable" }; -const struct LMS7Parameter RXDIVEN = { 0x002B, 0, 0, 0, "RXDIVEN", "RX clock divider enable" }; -const struct LMS7Parameter TXTSPCLKA_DIV = { 0x002C, 15, 8, 255, "TXTSPCLKA_DIV", "TxTSP clock divider, used to produce MCLK(1/2). Clock division ratio is 2(TXTSPCLKA_DIV + 1)"}; -const struct LMS7Parameter RXTSPCLKA_DIV = { 0x002C, 7, 0, 255, "RXTSPCLKA_DIV", "RxTSP clock divider, used to produce MCLK(1/2). Clock division ratio is 2(RXTSPCLKA_DIV + 1)"}; -const struct LMS7Parameter MIMO_SISO = { 0x002E, 15, 15, 0, "MIMO_SISO", "MIMO channel B enable control" }; -const struct LMS7Parameter VER = { 0x002F, 15, 11, 7, "VER", "" }; -const struct LMS7Parameter REV = { 0x002F, 10, 6, 1, "REV", "" }; -const struct LMS7Parameter MASK = { 0x002F, 5, 0, 0, "MASK", "" }; -const struct LMS7Parameter EN_DIR_LDO = { 0x0081, 3, 3, 0, "EN_DIR_LDO", "" }; -const struct LMS7Parameter EN_DIR_CGEN = { 0x0081, 2, 2, 0, "EN_DIR_CGEN", "" }; -const struct LMS7Parameter EN_DIR_XBUF = { 0x0081, 1, 1, 0, "EN_DIR_XBUF", "" }; -const struct LMS7Parameter EN_DIR_AFE = { 0x0081, 0, 0, 0, "EN_DIR_AFE", "" }; -const struct LMS7Parameter ISEL_DAC_AFE = { 0x0082, 15, 13, 4, "ISEL_DAC_AFE", "Controls the peak current of the DAC output current" }; -const struct LMS7Parameter MODE_INTERLEAVE_AFE = { 0x0082, 12, 12, 0, "MODE_INTERLEAVE_AFE", "time interleaves the two ADCs into one ADC" }; -const struct LMS7Parameter MUX_AFE_1 = { 0x0082, 11, 10, 0, "MUX_AFE_1", "Controls the MUX at the input of the ADC channel 1" }; -const struct LMS7Parameter MUX_AFE_2 = { 0x0082, 9, 8, 0, "MUX_AFE_2", "Controls the MUX at the input of the ADC channel 2" }; -const struct LMS7Parameter PD_AFE = { 0x0082, 5, 5, 0, "PD_AFE", "Power down control for the AFE current mirror in BIAS_TOP" }; -const struct LMS7Parameter PD_RX_AFE1 = { 0x0082, 4, 4, 0, "PD_RX_AFE1", "Power down control for the ADC of channel 1" }; -const struct LMS7Parameter PD_RX_AFE2 = { 0x0082, 3, 3, 1, "PD_RX_AFE2", "Power down control for the ADC of channel 2" }; -const struct LMS7Parameter PD_TX_AFE1 = { 0x0082, 2, 2, 0, "PD_TX_AFE1", "Power down control for the DAC of channel 1" }; -const struct LMS7Parameter PD_TX_AFE2 = { 0x0082, 1, 1, 1, "PD_TX_AFE2", "Power down control for the DAC of channel 2" }; -const struct LMS7Parameter EN_G_AFE = { 0x0082, 0, 0, 1, "EN_G_AFE", "Enable control for all the AFE power downs" }; -const struct LMS7Parameter MUX_BIAS_OUT = { 0x0084, 12, 11, 0, "MUX_BIAS_OUT", "Test mode of the BIAS_TOP" }; -const struct LMS7Parameter RP_CALIB_BIAS = { 0x0084, 10, 6, 16, "RP_CALIB_BIAS", "Calibration code for rppolywo. This code is set by the calibration algorithm: BIAS_RPPOLY_calibration" }; -const struct LMS7Parameter PD_FRP_BIAS = { 0x0084, 4, 4, 0, "PD_FRP_BIAS", "Power down signal for Fix/RP block" }; -const struct LMS7Parameter PD_F_BIAS = { 0x0084, 3, 3, 0, "PD_F_BIAS", "Power down signal for Fix" }; -const struct LMS7Parameter PD_PTRP_BIAS = { 0x0084, 2, 2, 0, "PD_PTRP_BIAS", "Power down signal for PTAT/RP block" }; -const struct LMS7Parameter PD_PT_BIAS = { 0x0084, 1, 1, 0, "PD_PT_BIAS", "Power down signal for PTAT block" }; -const struct LMS7Parameter PD_BIAS_MASTER = { 0x0084, 0, 0, 0, "PD_BIAS_MASTER", "Enable signal for central bias block" }; -const struct LMS7Parameter SLFB_XBUF_RX = { 0x0085, 8, 8, 0, "SLFB_XBUF_RX", "Self biasing digital contol SLFB_XBUF_RX" }; -const struct LMS7Parameter SLFB_XBUF_TX = { 0x0085, 7, 7, 0, "SLFB_XBUF_TX", "Self biasing digital contol SLFB_XBUF_TX" }; -const struct LMS7Parameter BYP_XBUF_RX = { 0x0085, 6, 6, 0, "BYP_XBUF_RX", "Shorts the Input 3.3V buffer in XBUF" }; -const struct LMS7Parameter BYP_XBUF_TX = { 0x0085, 5, 5, 0, "BYP_XBUF_TX", "Shorts the Input 3.3V buffer in XBUF" }; -const struct LMS7Parameter EN_OUT2_XBUF_TX = { 0x0085, 4, 4, 0, "EN_OUT2_XBUF_TX", "Enables the 2nd output of TX XBUF. This 2nd buffer goes to XBUF_RX. This should be active when only 1 XBUF is to be used" }; -const struct LMS7Parameter EN_TBUFIN_XBUF_RX = { 0x0085, 3, 3, 0, "EN_TBUFIN_XBUF_RX", "Disables the input from the external XOSC and buffers the 2nd input signal (from TX XBUF 2nd output) to the RX. This should be active when only 1 XBUF is to be used" }; -const struct LMS7Parameter PD_XBUF_RX = { 0x0085, 2, 2, 0, "PD_XBUF_RX", "Power down signal PD_XBUF_RX" }; -const struct LMS7Parameter PD_XBUF_TX = { 0x0085, 1, 1, 0, "PD_XBUF_TX", "Power down signal PD_XBUF_TX" }; -const struct LMS7Parameter EN_G_XBUF = { 0x0085, 0, 0, 1, "EN_G_XBUF", "Enable control for all the XBUF power downs" }; -const struct LMS7Parameter SPDUP_VCO_CGEN = { 0x0086, 15, 15, 0, "SPDUP_VCO_CGEN", "Bypasses the noise filter resistor for fast setlling time. It should be connected to a 1us pulse" }; -const struct LMS7Parameter RESET_N_CGEN = { 0x0086, 14, 14, 1, "RESET_N_CGEN", "A pulse should be used in the start-up to reset ( 1-normal operation)" }; -const struct LMS7Parameter EN_ADCCLKH_CLKGN = { 0x0086, 11, 11, 1, "EN_ADCCLKH_CLKGN", "Selects if F_CLKH or F_CLKL is connected to FCLK_ADC" }; -const struct LMS7Parameter EN_COARSE_CKLGEN = { 0x0086, 10, 10, 0, "EN_COARSE_CKLGEN", "Enable signal for coarse tuning block" }; -const struct LMS7Parameter EN_INTONLY_SDM_CGEN = { 0x0086, 9, 9, 0, "EN_INTONLY_SDM_CGEN", "Enables INTEGER-N mode of the SX " }; -const struct LMS7Parameter EN_SDM_CLK_CGEN = { 0x0086, 8, 8, 1, "EN_SDM_CLK_CGEN", "Enables/Disables SDM clock. In INT-N mode or for noise testing, SDM clock can be disabled" }; -const struct LMS7Parameter PD_CP_CGEN = { 0x0086, 6, 6, 0, "PD_CP_CGEN", "Power down for Charge Pump" }; -const struct LMS7Parameter PD_FDIV_FB_CGEN = { 0x0086, 5, 5, 0, "PD_FDIV_FB_CGEN", "Power down for feedback frequency divider" }; -const struct LMS7Parameter PD_FDIV_O_CGEN = { 0x0086, 4, 4, 0, "PD_FDIV_O_CGEN", "Power down for forward frequency divider of the CGEN block" }; -const struct LMS7Parameter PD_SDM_CGEN = { 0x0086, 3, 3, 0, "PD_SDM_CGEN", "Power down for SDM" }; -const struct LMS7Parameter PD_VCO_CGEN = { 0x0086, 2, 2, 0, "PD_VCO_CGEN", "Power down for VCO" }; -const struct LMS7Parameter PD_VCO_COMP_CGEN = { 0x0086, 1, 1, 0, "PD_VCO_COMP_CGEN", "Power down for VCO comparator" }; -const struct LMS7Parameter EN_G_CGEN = { 0x0086, 0, 0, 1, "EN_G_CGEN", "Enable control for all the CGEN power downs" }; -const struct LMS7Parameter FRAC_SDM_CGEN_LSB = { 0x0087, 15, 0, 0x0400, "FRAC_SDM_CGEN_LSB", "" }; -const struct LMS7Parameter INT_SDM_CGEN = { 0x0088, 13, 4, 120, "INT_SDM_CGEN", "" }; -const struct LMS7Parameter FRAC_SDM_CGEN_MSB = { 0x0088, 3, 0, 0, "FRAC_SDM_CGEN_MSB", "" }; -const struct LMS7Parameter REV_SDMCLK_CGEN = { 0x0089, 15, 15, 0, "REV_SDMCLK_CGEN", "Reverses the SDM clock" }; -const struct LMS7Parameter SEL_SDMCLK_CGEN = { 0x0089, 14, 14, 0, "SEL_SDMCLK_CGEN", "Selects between the feedback divider output and Fref for SDM" }; -const struct LMS7Parameter SX_DITHER_EN_CGEN = { 0x0089, 13, 13, 0, "SX_DITHER_EN_CGEN", "Enabled dithering in SDM" }; -const struct LMS7Parameter CLKH_OV_CLKL_CGEN = { 0x0089, 12, 11, 0, "CLKH_OV_CLKL_CGEN", "FCLKL here is ADC clock. FCLKH is the clock to the DAC and if no division is added to the ADC as well" }; -const struct LMS7Parameter DIV_OUTCH_CGEN = { 0x0089, 10, 3, 4, "DIV_OUTCH_CGEN", "" }; -const struct LMS7Parameter TST_CGEN = { 0x0089, 2, 0, 0, "TST_CGEN", -"Controls the test mode of the SX\n\ -0 - TST disabled; RSSI analog outputs enabled if RSSI blocks active and when all PLL test signals are off\n\ -1 - tstdo[0] = ADC clock; tstdo[1] = DAC clock; tstao = High impedance;\n\ -2 - tstdo[0] = SDM clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 60kOhm resistor;\n\ -3 - tstdo[0] = Reference clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 10kOhm resistor;\n\ -4 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = High impedance;\n\ -5 - tstdo[0] = Charge pump Down signal; tstdo[1] = Charge pump Up signal; tstao = High impedance;\n\ -6 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 60kOhm resistor;\n\ -7 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 10kOhm resistor;\n\ -if TST_SX[2] = 1 --> VCO_TSTBUF active generating VCO_TST_DIV20 and VCO_TST_DIV40"}; -const struct LMS7Parameter REV_CLKDAC_CGEN = { 0x008A, 14, 14, 0, "REV_CLKDAC_CGEN", "Inverts the clock F_CLKL" }; -const struct LMS7Parameter CMPLO_CTRL_CGEN = { 0x008A, 27, 14, 0, "CMPLO_CTRL_CGEN", "" }; -const struct LMS7Parameter REV_CLKADC_CGEN = { 0x008A, 13, 13, 0, "REV_CLKADC_CGEN", "Inverts the clock F_CLKL" }; -const struct LMS7Parameter REVPH_PFD_CGEN = { 0x008A, 12, 12, 0, "REVPH_PFD_CGEN", "Reverse the pulses of PFD. It can be used to reverse the polarity of the PLL loop (positive feedback to negative feedback)" }; -const struct LMS7Parameter IOFFSET_CP_CGEN = { 0x008A, 11, 6, 20, "IOFFSET_CP_CGEN", "Scales the offset current of the charge pump, 0-->63. This current is used in Fran-N mode to create an offset in the CP response and avoide the non-linear section" }; -const struct LMS7Parameter IPULSE_CP_CGEN = { 0x008A, 5, 0, 20, "IPULSE_CP_CGEN", "Scales the pulse current of the charge pump" }; -const struct LMS7Parameter ICT_VCO_CGEN = { 0x008B, 13, 9, 16, "ICT_VCO_CGEN", "Scales the VCO bias current from 0 to 2.5xInom" }; -const struct LMS7Parameter CSW_VCO_CGEN = { 0x008B, 8, 1, 128, "CSW_VCO_CGEN", "" }; -const struct LMS7Parameter COARSE_START_CGEN = { 0x008B, 0, 0, 0, "COARSE_START_CGEN", "Control signal for coarse tuning algorithm (SX_SWC_calibration)" }; -const struct LMS7Parameter COARSE_STEPDONE_CGEN = { 0x008C, 15, 15, 0, "COARSE_STEPDONE_CGEN", "" }; -const struct LMS7Parameter COARSEPLL_COMPO_CGEN = { 0x008C, 14, 14, 0, "COARSEPLL_COMPO_CGEN", "" }; -const struct LMS7Parameter VCO_CMPHO_CGEN = { 0x008C, 13, 13, 0, "VCO_CMPHO_CGEN", "" }; -const struct LMS7Parameter VCO_CMPLO_CGEN = { 0x008C, 12, 12, 0, "VCO_CMPLO_CGEN", "" }; -const struct LMS7Parameter CP2_CGEN = { 0x008C, 11, 8, 6, "CP2_CGEN", "Controls the value of CP2 (cap from CP output to GND) in the PLL filter" }; -const struct LMS7Parameter CP3_CGEN = { 0x008C, 7, 4, 7, "CP3_CGEN", "Controls the value of CP3 (cap from VCO Vtune input to GND) in the PLL filter" }; -const struct LMS7Parameter CZ_CGEN = { 0x008C, 3, 0, 11, "CZ_CGEN", "Controls the value of CZ (Zero capacitor) in the PLL filter" }; -const struct LMS7Parameter EN_LDO_DIG = { 0x0092, 15, 15, 0, "EN_LDO_DIG", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIGGN = { 0x0092, 14, 14, 0, "EN_LDO_DIGGN", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIGSXR = { 0x0092, 13, 13, 0, "EN_LDO_DIGSXR", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIGSXT = { 0x0092, 12, 12, 0, "EN_LDO_DIGSXT", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIVGN = { 0x0092, 11, 11, 0, "EN_LDO_DIVGN", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIVSXR = { 0x0092, 10, 10, 0, "EN_LDO_DIVSXR", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_DIVSXT = { 0x0092, 9, 9, 0, "EN_LDO_DIVSXT", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_LNA12 = { 0x0092, 8, 8, 0, "EN_LDO_LNA12", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_LNA14 = { 0x0092, 7, 7, 0, "EN_LDO_LNA14", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_MXRFE = { 0x0092, 6, 6, 0, "EN_LDO_MXRFE", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_RBB = { 0x0092, 5, 5, 0, "EN_LDO_RBB", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_RXBUF = { 0x0092, 4, 4, 0, "EN_LDO_RXBUF", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TBB = { 0x0092, 3, 3, 0, "EN_LDO_TBB", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TIA12 = { 0x0092, 2, 2, 0, "EN_LDO_TIA12", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TIA14 = { 0x0092, 1, 1, 0, "EN_LDO_TIA14", "Enables the LDO" }; -const struct LMS7Parameter EN_G_LDO = { 0x0092, 0, 0, 1, "EN_G_LDO", "Enable control for all the LDO power downs" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TLOB = { 0x0093, 15, 15, 0, "EN_LOADIMP_LDO_TLOB", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TPAD = { 0x0093, 14, 14, 0, "EN_LOADIMP_LDO_TPAD", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TXBUF = { 0x0093, 13, 13, 0, "EN_LOADIMP_LDO_TXBUF", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_VCOGN = { 0x0093, 12, 12, 0, "EN_LOADIMP_LDO_VCOGN", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXR = { 0x0093, 11, 11, 0, "EN_LOADIMP_LDO_VCOSXR", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXT = { 0x0093, 10, 10, 0, "EN_LOADIMP_LDO_VCOSXT", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LDO_AFE = { 0x0093, 9, 9, 0, "EN_LDO_AFE", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_CPGN = { 0x0093, 8, 8, 0, "EN_LDO_CPGN", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_CPSXR = { 0x0093, 7, 7, 0, "EN_LDO_CPSXR", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TLOB = { 0x0093, 6, 6, 0, "EN_LDO_TLOB", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TPAD = { 0x0093, 5, 5, 0, "EN_LDO_TPAD", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_TXBUF = { 0x0093, 4, 4, 0, "EN_LDO_TXBUF", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_VCOGN = { 0x0093, 3, 3, 0, "EN_LDO_VCOGN", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_VCOSXR = { 0x0093, 2, 2, 0, "EN_LDO_VCOSXR", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_VCOSXT = { 0x0093, 1, 1, 0, "EN_LDO_VCOSXT", "Enables the LDO" }; -const struct LMS7Parameter EN_LDO_CPSXT = { 0x0093, 0, 0, 0, "EN_LDO_CPSXT", "Enables the LDO" }; -const struct LMS7Parameter EN_LOADIMP_LDO_CPSXT = { 0x0094, 15, 15, 0, "EN_LOADIMP_LDO_CPSXT", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIG = { 0x0094, 14, 14, 0, "EN_LOADIMP_LDO_DIG", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIGGN = { 0x0094, 13, 13, 0, "EN_LOADIMP_LDO_DIGGN", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXR = { 0x0094, 12, 12, 0, "EN_LOADIMP_LDO_DIGSXR", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXT = { 0x0094, 11, 11, 0, "EN_LOADIMP_LDO_DIGSXT", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIVGN = { 0x0094, 10, 10, 0, "EN_LOADIMP_LDO_DIVGN", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXR = { 0x0094, 9, 9, 0, "EN_LOADIMP_LDO_DIVSXR", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXT = { 0x0094, 8, 8, 0, "EN_LOADIMP_LDO_DIVSXT", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_LNA12 = { 0x0094, 7, 7, 0, "EN_LOADIMP_LDO_LNA12", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_LNA14 = { 0x0094, 6, 6, 0, "EN_LOADIMP_LDO_LNA14", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_MXRFE = { 0x0094, 5, 5, 0, "EN_LOADIMP_LDO_MXRFE", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_RBB = { 0x0094, 4, 4, 0, "EN_LOADIMP_LDO_RBB", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_RXBUF = { 0x0094, 3, 3, 0, "EN_LOADIMP_LDO_RXBUF", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TBB = { 0x0094, 2, 2, 0, "EN_LOADIMP_LDO_TBB", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TIA12 = { 0x0094, 1, 1, 0, "EN_LOADIMP_LDO_TIA12", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_TIA14 = { 0x0094, 0, 0, 0, "EN_LOADIMP_LDO_TIA14", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter BYP_LDO_TBB = { 0x0095, 15, 15, 0, "BYP_LDO_TBB", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_TIA12 = { 0x0095, 14, 14, 0, "BYP_LDO_TIA12", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_TIA14 = { 0x0095, 13, 13, 0, "BYP_LDO_TIA14", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_TLOB = { 0x0095, 12, 12, 0, "BYP_LDO_TLOB", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_TPAD = { 0x0095, 11, 11, 0, "BYP_LDO_TPAD", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_TXBUF = { 0x0095, 10, 10, 0, "BYP_LDO_TXBUF", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_VCOGN = { 0x0095, 9, 9, 0, "BYP_LDO_VCOGN", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_VCOSXR = { 0x0095, 8, 8, 0, "BYP_LDO_VCOSXR", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_VCOSXT = { 0x0095, 7, 7, 0, "BYP_LDO_VCOSXT", "Bypass signal for the LDO" }; -const struct LMS7Parameter EN_LOADIMP_LDO_AFE = { 0x0095, 2, 2, 0, "EN_LOADIMP_LDO_AFE", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_CPGN = { 0x0095, 1, 1, 0, "EN_LOADIMP_LDO_CPGN", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_CPSXR = { 0x0095, 0, 0, 0, "EN_LOADIMP_LDO_CPSXR", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter BYP_LDO_AFE = { 0x0096, 15, 15, 0, "BYP_LDO_AFE", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_CPGN = { 0x0096, 14, 14, 0, "BYP_LDO_CPGN", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_CPSXR = { 0x0096, 13, 13, 0, "BYP_LDO_CPSXR", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_CPSXT = { 0x0096, 12, 12, 0, "BYP_LDO_CPSXT", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIG = { 0x0096, 11, 11, 0, "BYP_LDO_DIG", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIGGN = { 0x0096, 10, 10, 0, "BYP_LDO_DIGGN", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIGSXR = { 0x0096, 9, 9, 0, "BYP_LDO_DIGSXR", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIGSXT = { 0x0096, 8, 8, 0, "BYP_LDO_DIGSXT", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIVGN = { 0x0096, 7, 7, 0, "BYP_LDO_DIVGN", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIVSXR = { 0x0096, 6, 6, 0, "BYP_LDO_DIVSXR", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIVSXT = { 0x0096, 5, 5, 0, "BYP_LDO_DIVSXT", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_LNA12 = { 0x0096, 4, 4, 0, "BYP_LDO_LNA12", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_LNA14 = { 0x0096, 3, 3, 0, "BYP_LDO_LNA14", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_MXRFE = { 0x0096, 2, 2, 0, "BYP_LDO_MXRFE", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_RBB = { 0x0096, 1, 1, 0, "BYP_LDO_RBB", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_RXBUF = { 0x0096, 0, 0, 0, "BYP_LDO_RXBUF", "Bypass signal for the LDO" }; -const struct LMS7Parameter SPDUP_LDO_DIVSXR = { 0x0097, 15, 15, 0, "SPDUP_LDO_DIVSXR", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIVSXT = { 0x0097, 14, 14, 0, "SPDUP_LDO_DIVSXT", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_LNA12 = { 0x0097, 13, 13, 0, "SPDUP_LDO_LNA12", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_LNA14 = { 0x0097, 12, 12, 0, "SPDUP_LDO_LNA14", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_MXRFE = { 0x0097, 11, 11, 0, "SPDUP_LDO_MXRFE", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_RBB = { 0x0097, 10, 10, 0, "SPDUP_LDO_RBB", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_RXBUF = { 0x0097, 9, 9, 0, "SPDUP_LDO_RXBUF", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TBB = { 0x0097, 8, 8, 0, "SPDUP_LDO_TBB", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TIA12 = { 0x0097, 7, 7, 0, "SPDUP_LDO_TIA12", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TIA14 = { 0x0097, 6, 6, 0, "SPDUP_LDO_TIA14", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TLOB = { 0x0097, 5, 5, 0, "SPDUP_LDO_TLOB", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TPAD = { 0x0097, 4, 4, 0, "SPDUP_LDO_TPAD", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_TXBUF = { 0x0097, 3, 3, 0, "SPDUP_LDO_TXBUF", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_VCOGN = { 0x0097, 2, 2, 0, "SPDUP_LDO_VCOGN", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_VCOSXR = { 0x0097, 1, 1, 0, "SPDUP_LDO_VCOSXR", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_VCOSXT = { 0x0097, 0, 0, 0, "SPDUP_LDO_VCOSXT", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_AFE = { 0x0098, 8, 8, 0, "SPDUP_LDO_AFE", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_CPGN = { 0x0098, 7, 7, 0, "SPDUP_LDO_CPGN", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_CPSXR = { 0x0098, 6, 6, 0, "SPDUP_LDO_CPSXR", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_CPSXT = { 0x0098, 5, 5, 0, "SPDUP_LDO_CPSXT", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIG = { 0x0098, 4, 4, 0, "SPDUP_LDO_DIG", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIGGN = { 0x0098, 3, 3, 0, "SPDUP_LDO_DIGGN", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIGSXR = { 0x0098, 2, 2, 0, "SPDUP_LDO_DIGSXR", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIGSXT = { 0x0098, 1, 1, 0, "SPDUP_LDO_DIGSXT", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIVGN = { 0x0098, 0, 0, 0, "SPDUP_LDO_DIVGN", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter RDIV_VCOSXR = { 0x0099, 15, 8, 101, "RDIV_VCOSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_VCOSXT = { 0x0099, 7, 0, 101, "RDIV_VCOSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TXBUF = { 0x009A, 15, 8, 101, "RDIV_TXBUF", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_VCOGN = { 0x009A, 7, 0, 140, "RDIV_VCOGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TLOB = { 0x009B, 15, 8, 101, "RDIV_TLOB", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TPAD = { 0x009B, 7, 0, 101, "RDIV_TPAD", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TIA12 = { 0x009C, 15, 8, 101, "RDIV_TIA12", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TIA14 = { 0x009C, 7, 0, 140, "RDIV_TIA14", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_RXBUF = { 0x009D, 15, 8, 101, "RDIV_RXBUF", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_TBB = { 0x009D, 7, 0, 101, "RDIV_TBB", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_MXRFE = { 0x009E, 15, 8, 101, "RDIV_MXRFE", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_RBB = { 0x009E, 7, 0, 140, "RDIV_RBB", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_LNA12 = { 0x009F, 15, 8, 101, "RDIV_LNA12", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_LNA14 = { 0x009F, 7, 0, 140, "RDIV_LNA14", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIVSXR = { 0x00A0, 15, 8, 101, "RDIV_DIVSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIVSXT = { 0x00A0, 7, 0, 101, "RDIV_DIVSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIGSXT = { 0x00A1, 15, 8, 101, "RDIV_DIGSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIVGN = { 0x00A1, 7, 0, 101, "RDIV_DIVGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIGGN = { 0x00A2, 15, 8, 101, "RDIV_DIGGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIGSXR = { 0x00A2, 7, 0, 101, "RDIV_DIGSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_CPSXT = { 0x00A3, 15, 8, 101, "RDIV_CPSXT", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIG = { 0x00A3, 7, 0, 101, "RDIV_DIG", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_CPGN = { 0x00A4, 15, 8, 101, "RDIV_CPGN", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_CPSXR = { 0x00A4, 7, 0, 101, "RDIV_CPSXR", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_SPIBUF = { 0x00A5, 15, 8, 101, "RDIV_SPIBUF", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_AFE = { 0x00A5, 7, 0, 101, "RDIV_AFE", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter SPDUP_LDO_SPIBUF = { 0x00A6, 12, 12, 0, "SPDUP_LDO_SPIBUF", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIGIp2 = { 0x00A6, 11, 11, 0, "SPDUP_LDO_DIGIp2", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter SPDUP_LDO_DIGIp1 = { 0x00A6, 10, 10, 0, "SPDUP_LDO_DIGIp1", "Short the noise filter resistor to speed up the settling time" }; -const struct LMS7Parameter BYP_LDO_SPIBUF = { 0x00A6, 9, 9, 0, "BYP_LDO_SPIBUF", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIGIp2 = { 0x00A6, 8, 8, 0, "BYP_LDO_DIGIp2", "Bypass signal for the LDO" }; -const struct LMS7Parameter BYP_LDO_DIGIp1 = { 0x00A6, 7, 7, 0, "BYP_LDO_DIGIp1", "Bypass signal for the LDO" }; -const struct LMS7Parameter EN_LOADIMP_LDO_SPIBUF = { 0x00A6, 6, 6, 0, "EN_LOADIMP_LDO_SPIBUF", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp2 = { 0x00A6, 5, 5, 0, "EN_LOADIMP_LDO_DIGIp2", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp1 = { 0x00A6, 4, 4, 0, "EN_LOADIMP_LDO_DIGIp1", "Enables the load dependent bias to optimize the load regulation" }; -const struct LMS7Parameter PD_LDO_SPIBUF = { 0x00A6, 3, 3, 1, "PD_LDO_SPIBUF", "Enables the LDO" }; -const struct LMS7Parameter PD_LDO_DIGIp2 = { 0x00A6, 2, 2, 1, "PD_LDO_DIGIp2", "Enables the LDO" }; -const struct LMS7Parameter PD_LDO_DIGIp1 = { 0x00A6, 1, 1, 1, "PD_LDO_DIGIp1", "Enables the LDO" }; -const struct LMS7Parameter EN_G_LDOP = { 0x00A6, 0, 0, 1, "EN_G_LDOP", "Enable control for all the LDO power downs" }; -const struct LMS7Parameter RDIV_DIGIp2 = { 0x00A7, 15, 8, 101, "RDIV_DIGIp2", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter RDIV_DIGIp1 = { 0x00A7, 7, 0, 101, "RDIV_DIGIp1", "Controls the output voltage of the LDO by setting the resistive voltage divider ratio" }; -const struct LMS7Parameter BSIGT = { 0x00A8, 31, 9, 0, "BSIGT", "" }; -const struct LMS7Parameter BSTATE = { 0x00A8, 8, 8, 0, "BSTATE", "" }; -const struct LMS7Parameter EN_SDM_TSTO_SXT = { 0x00A8, 6, 6, 0, "EN_SDM_TSTO_SXT", "Enables the SDM_TSTO_SXT" }; -const struct LMS7Parameter EN_SDM_TSTO_SXR = { 0x00A8, 5, 5, 0, "EN_SDM_TSTO_SXR", "Enables the SDM_TSTO_SXR" }; -const struct LMS7Parameter EN_SDM_TSTO_CGEN = { 0x00A8, 4, 4, 0, "EN_SDM_TSTO_CGEN", "Enables the SDM_TSTO_CGEN" }; -const struct LMS7Parameter BENC = { 0x00A8, 3, 3, 0, "BENC", "enables CGEN BIST" }; -const struct LMS7Parameter BENR = { 0x00A8, 2, 2, 0, "BENR", "enables SXR BIST" }; -const struct LMS7Parameter BENT = { 0x00A8, 1, 1, 0, "BENT", "enables SXT BIST" }; -const struct LMS7Parameter BSTART = { 0x00A8, 0, 0, 0, "BSTART", "Starts delta sigma built in self test. Keep it at 1 one at least three clock cycles" }; -const struct LMS7Parameter BSIGR = { 0x00AA, 22, 0, 0, "BSIGR", "" }; -const struct LMS7Parameter BSIGC = { 0x00AB, 29, 7, 0, "BSIGC", "" }; -const struct LMS7Parameter CDS_MCLK2 = { 0x00AD, 15, 14, 0, "CDS_MCLK2", "MCLK2 clock delay" }; -const struct LMS7Parameter CDS_MCLK1 = { 0x00AD, 13, 12, 0, "CDS_MCLK1", "MCLK1 clock delay" }; -const struct LMS7Parameter CDSN_TXBTSP = { 0x00AD, 9, 9, 1, "CDSN_TXBTSP", "TX TSPB clock inversion control" }; -const struct LMS7Parameter CDSN_TXATSP = { 0x00AD, 8, 8, 1, "CDSN_TXATSP", "TX TSPA clock inversion control" }; -const struct LMS7Parameter CDSN_RXBTSP = { 0x00AD, 7, 7, 1, "CDSN_RXBTSP", "RX TSPB clock inversion control" }; -const struct LMS7Parameter CDSN_RXATSP = { 0x00AD, 6, 6, 1, "CDSN_RXATSP", "RX TSPA clock inversion control" }; -const struct LMS7Parameter CDSN_TXBLML = { 0x00AD, 5, 5, 1, "CDSN_TXBLML", "TX LMLB clock inversion control" }; -const struct LMS7Parameter CDSN_TXALML = { 0x00AD, 4, 4, 1, "CDSN_TXALML", "TX LMLA clock inversion control" }; -const struct LMS7Parameter CDSN_RXBLML = { 0x00AD, 3, 3, 1, "CDSN_RXBLML", "RX LMLB clock inversion control" }; -const struct LMS7Parameter CDSN_RXALML = { 0x00AD, 2, 2, 1, "CDSN_RXALML", "RX LMLA clock inversion control" }; -const struct LMS7Parameter CDSN_MCLK2 = { 0x00AD, 1, 1, 1, "CDSN_MCLK2", "MCLK2 clock inversion control" }; -const struct LMS7Parameter CDSN_MCLK1 = { 0x00AD, 0, 0, 1, "CDSN_MCLK1", "MCLK1 clock inversion control" }; -const struct LMS7Parameter CDS_TXBTSP = { 0x00AE, 15, 14, 0, "CDS_TXBTSP", "TX TSP B clock delay" }; -const struct LMS7Parameter CDS_TXATSP = { 0x00AE, 13, 12, 0, "CDS_TXATSP", "TX TSP A clock delay" }; -const struct LMS7Parameter CDS_RXBTSP = { 0x00AE, 11, 10, 0, "CDS_RXBTSP", "RX TSP B clock delay" }; -const struct LMS7Parameter CDS_RXATSP = { 0x00AE, 9, 8, 0, "CDS_RXATSP", "RX TSP A clock delay" }; -const struct LMS7Parameter CDS_TXBLML = { 0x00AE, 7, 6, 0, "CDS_TXBLML", "TX LML B clock delay" }; -const struct LMS7Parameter CDS_TXALML = { 0x00AE, 5, 4, 0, "CDS_TXALML", "TX LML A clock delay" }; -const struct LMS7Parameter CDS_RXBLML = { 0x00AE, 3, 2, 0, "CDS_RXBLML", "RX LML B clock delay" }; -const struct LMS7Parameter CDS_RXALML = { 0x00AE, 1, 0, 0, "CDS_RXALML", "RX LML A clock delay" }; -const struct LMS7Parameter EN_LOWBWLOMX_TMX_TRF = { 0x0100, 15, 15, 0, "EN_LOWBWLOMX_TMX_TRF", "Controls the high pass pole frequency of the RC biasing the gate of the mixer switches" }; -const struct LMS7Parameter EN_NEXTTX_TRF = { 0x0100, 14, 14, 0, "EN_NEXTTX_TRF", "Enables the daisy change LO buffer going from TRF_1 to TRF2" }; -const struct LMS7Parameter EN_AMPHF_PDET_TRF = { 0x0100, 13, 12, 3, "EN_AMPHF_PDET_TRF", "Enables the TXPAD power detector preamplifier" }; -const struct LMS7Parameter LOADR_PDET_TRF = { 0x0100, 11, 10, 1, "LOADR_PDET_TRF", "Controls the resistive load of the Power detector" }; -const struct LMS7Parameter PD_PDET_TRF = { 0x0100, 3, 3, 1, "PD_PDET_TRF", "Powerdown signal for Power Detector" }; -const struct LMS7Parameter PD_TLOBUF_TRF = { 0x0100, 2, 2, 0, "PD_TLOBUF_TRF", "Powerdown signal for TX LO buffer" }; -const struct LMS7Parameter PD_TXPAD_TRF = { 0x0100, 1, 1, 0, "PD_TXPAD_TRF", "Powerdown signal for TXPAD" }; -const struct LMS7Parameter EN_G_TRF = { 0x0100, 0, 0, 1, "EN_G_TRF", "Enable control for all the TRF_1 power downs" }; -const struct LMS7Parameter F_TXPAD_TRF = { 0x0101, 15, 13, 3, "F_TXPAD_TRF", "Controls the switched capacitor at the TXPAD output. Is used for fine tuning of the TXPAD output" }; -const struct LMS7Parameter L_LOOPB_TXPAD_TRF = { 0x0101, 12, 11, 3, "L_LOOPB_TXPAD_TRF", "Controls the loss of the of the loopback path at the TX side" }; -const struct LMS7Parameter LOSS_LIN_TXPAD_TRF = { 0x0101, 10, 6, 0, "LOSS_LIN_TXPAD_TRF", "Controls the gain of the linearizing part of of the TXPAD" }; -const struct LMS7Parameter LOSS_MAIN_TXPAD_TRF = { 0x0101, 5, 1, 0, "LOSS_MAIN_TXPAD_TRF", "Controls the gain output power of the TXPAD" }; -const struct LMS7Parameter EN_LOOPB_TXPAD_TRF = { 0x0101, 0, 0, 0, "EN_LOOPB_TXPAD_TRF", "Enables the TXPAD loopback path" }; -const struct LMS7Parameter GCAS_GNDREF_TXPAD_TRF = { 0x0102, 15, 15, 0, "GCAS_GNDREF_TXPAD_TRF", "Controls if the TXPAD cascode transistor gate bias is referred to VDD or GND" }; -const struct LMS7Parameter ICT_LIN_TXPAD_TRF = { 0x0102, 14, 10, 12, "ICT_LIN_TXPAD_TRF", "Control the bias current of the linearization section of the TXPAD" }; -const struct LMS7Parameter ICT_MAIN_TXPAD_TRF = { 0x0102, 9, 5, 12, "ICT_MAIN_TXPAD_TRF", "Control the bias current of the main gm section of the TXPAD" }; -const struct LMS7Parameter VGCAS_TXPAD_TRF = { 0x0102, 4, 0, 0, "VGCAS_TXPAD_TRF", "Controls the bias voltage at the gate of TXPAD cascade" }; -const struct LMS7Parameter SEL_BAND1_TRF = { 0x0103, 11, 11, 1, "SEL_BAND1_TRF", "" }; -const struct LMS7Parameter SEL_BAND2_TRF = { 0x0103, 10, 10, 0, "SEL_BAND2_TRF", "" }; -const struct LMS7Parameter LOBIASN_TXM_TRF = { 0x0103, 9, 5, 16, "LOBIASN_TXM_TRF", "Controls the bias at the gate of the mixer NMOS" }; -const struct LMS7Parameter LOBIASP_TXX_TRF = { 0x0103, 4, 0, 18, "LOBIASP_TXX_TRF", "Controls the bias at the gate of the mixer PMOS" }; -const struct LMS7Parameter CDC_I_TRF = { 0x0104, 7, 4, 8, "CDC_I_TRF", "" }; -const struct LMS7Parameter CDC_Q_TRF = { 0x0104, 3, 0, 8, "CDC_Q_TRF", "" }; -const struct LMS7Parameter STATPULSE_TBB = { 0x0105, 15, 15, 0, "STATPULSE_TBB", "" }; -const struct LMS7Parameter LOOPB_TBB = { 0x0105, 14, 12, 0, "LOOPB_TBB", "This controls which signal is connected to the loopback output pins. Note: when both the lowpass ladder and real pole are powered down, the output of the active highband biquad is routed to the loopb output" }; -const struct LMS7Parameter PD_LPFH_TBB = { 0x0105, 4, 4, 0, "PD_LPFH_TBB", "This selectively powers down the LPFH_TBB biquad" }; -const struct LMS7Parameter PD_LPFIAMP_TBB = { 0x0105, 3, 3, 0, "PD_LPFIAMP_TBB", "selectively powers down the LPFIAMP_TBB front-end current amp of the transmitter baseband" }; -const struct LMS7Parameter PD_LPFLAD_TBB = { 0x0105, 2, 2, 1, "PD_LPFLAD_TBB", "This selectively powers down the LPFLAD_TBB low pass ladder filter of the transmitter baseband" }; -const struct LMS7Parameter PD_LPFS5_TBB = { 0x0105, 1, 1, 1, "PD_LPFS5_TBB", "This selectively powers down the LPFS5_TBB low pass real-pole filter of the transmitter baseband" }; -const struct LMS7Parameter EN_G_TBB = { 0x0105, 0, 0, 1, "EN_G_TBB", "Enable control for all the TBB_TOP power downs" }; -const struct LMS7Parameter ICT_LPFS5_F_TBB = { 0x0106, 14, 10, 12, "ICT_LPFS5_F_TBB", "This controls the operational amplifier's output stage bias current of the low band real pole filter of the transmitter's baseband" }; -const struct LMS7Parameter ICT_LPFS5_PT_TBB = { 0x0106, 9, 5, 12, "ICT_LPFS5_PT_TBB", "This controls the operational amplifier's input stage bias current of the low band real pole filter of the transmitter's baseband" }; -const struct LMS7Parameter ICT_LPF_H_PT_TBB = { 0x0106, 4, 0, 12, "ICT_LPF_H_PT_TBB", "This controls the operational amplifiers input stage bias reference current of the high band low pass filter of the transmitter's baseband " }; -const struct LMS7Parameter ICT_LPFH_F_TBB = { 0x0107, 14, 10, 12, "ICT_LPFH_F_TBB", "controls the operational amplifiers output stage bias reference current of the high band low pass filter of the transmitter's baseband (LPFH_TBB)" }; -const struct LMS7Parameter ICT_LPFLAD_F_TBB = { 0x0107, 9, 5, 12, "ICT_LPFLAD_F_TBB", "This controls the operational amplfiers' output stages bias referene current of the low band ladder filter of the transmisster's baseband" }; -const struct LMS7Parameter ICT_LPFLAD_PT_TBB = { 0x0107, 4, 0, 12, "ICT_LPFLAD_PT_TBB", "This controls the operational amplifers' input stages bias reference current of the low band ladder filter of the transmitter's baseband" }; -const struct LMS7Parameter CG_IAMP_TBB = { 0x0108, 15, 10, 37, "CG_IAMP_TBB", "This controls the frontend gain of the TBB. For a given gain value, this control value varies with the set TX mode. After resistance calibration, the following table gives the nominal values for each frequency setting. However, this table is to be updated and corrected after calibration" }; -const struct LMS7Parameter ICT_IAMP_FRP_TBB = { 0x0108, 9, 5, 1, "ICT_IAMP_FRP_TBB", "This controls the reference bias current of the IAMP main bias current sources" }; -const struct LMS7Parameter ICT_IAMP_GG_FRP_TBB = { 0x0108, 4, 0, 6, "ICT_IAMP_GG_FRP_TBB", "This controls the reference bias current of the IAMP's cascode transistors gate voltages that set the IAMP's input voltage level. The IAMP's input is connected to the DAC output" }; -const struct LMS7Parameter RCAL_LPFH_TBB = { 0x0109, 15, 8, 97, "RCAL_LPFH_TBB", "This controls the value of the equivalent resistance of the resistor banks of the biquad filter stage (of the high band section) of the transmitter baseband(TBB)" }; -const struct LMS7Parameter RCAL_LPFLAD_TBB = { 0x0109, 7, 0, 193, "RCAL_LPFLAD_TBB", "This controls the value of the equivalent resistance of the resistor banks of the low pass filter ladder (of the low band section) of the transmitter baseband(TBB)" }; -const struct LMS7Parameter TSTIN_TBB = { 0x010A, 15, 14, 0, "TSTIN_TBB", "This control selects where the input test signal (vinp/n_aux_bbq/i) is routed to as well as disabling the route." }; -const struct LMS7Parameter BYPLADDER_TBB = { 0x010A, 13, 13, 0, "BYPLADDER_TBB", "This signal bypasses the LPF ladder of TBB and directly connects the output of current amplifier to the null port of the real pole stage of TBB low pass filter" }; -const struct LMS7Parameter CCAL_LPFLAD_TBB = { 0x010A, 12, 8, 16, "CCAL_LPFLAD_TBB", "A common control signal for all the capacitor banks of TBB filters (including the ladder, real pole, and the high band biquad). It is the calibrated value of the banks control that sets the value of the banks' equivalent capacitor to their respective nominal values" }; -const struct LMS7Parameter RCAL_LPFS5_TBB = { 0x010A, 7, 0, 76, "RCAL_LPFS5_TBB", "This controls the value of the equivalent resistance of the resistor banks of the real pole filter stage (of the low band section) of the transmitter baseband (TBB). Following is a nominal values table that are corrected for any process variation after calibration" }; -const struct LMS7Parameter CDC_I_RFE = { 0x010C, 15, 12, 8, "CDC_I_RFE", "" }; -const struct LMS7Parameter CDC_Q_RFE = { 0x010C, 11, 8, 8, "CDC_Q_RFE", "" }; -const struct LMS7Parameter PD_LNA_RFE = { 0x010C, 7, 7, 1, "PD_LNA_RFE", "Power control signal for LNA_RFE" }; -const struct LMS7Parameter PD_RLOOPB_1_RFE = { 0x010C, 6, 6, 1, "PD_RLOOPB_1_RFE", "Power control signal for RXFE loopback 1" }; -const struct LMS7Parameter PD_RLOOPB_2_RFE = { 0x010C, 5, 5, 1, "PD_RLOOPB_2_RFE", "Power control signal for RXFE loopback 2" }; -const struct LMS7Parameter PD_MXLOBUF_RFE = { 0x010C, 4, 4, 1, "PD_MXLOBUF_RFE", "Power control signal for RXFE mixer lo buffer" }; -const struct LMS7Parameter PD_QGEN_RFE = { 0x010C, 3, 3, 1, "PD_QGEN_RFE", "Power control signal for RXFE Quadrature LO generator" }; -const struct LMS7Parameter PD_RSSI_RFE = { 0x010C, 2, 2, 1, "PD_RSSI_RFE", "Power control signal for RXFE RSSI" }; -const struct LMS7Parameter PD_TIA_RFE = { 0x010C, 1, 1, 0, "PD_TIA_RFE", "Power control signal for RXFE TIA" }; -const struct LMS7Parameter EN_G_RFE = { 0x010C, 0, 0, 1, "EN_G_RFE", "Enable control for all the RFE_1 power downs" }; -const struct LMS7Parameter SEL_PATH_RFE = { 0x010D, 8, 7, 1, "SEL_PATH_RFE", "Selects the active path of the RXFE" }; -const struct LMS7Parameter EN_DCOFF_RXFE_RFE = { 0x010D, 6, 6, 0, "EN_DCOFF_RXFE_RFE", "Enables the DCOFFSET block for the RXFE" }; -const struct LMS7Parameter EN_INSHSW_LB1_RFE = { 0x010D, 4, 4, 1, "EN_INSHSW_LB1_RFE", "Enables the input shorting switch at the input of the loopback 1 (in parallel with LNAL mixer)" }; -const struct LMS7Parameter EN_INSHSW_LB2_RFE = { 0x010D, 3, 3, 1, "EN_INSHSW_LB2_RFE", "Enables the input shorting switch at the input of the loopback 2 (in parallel with LNAW mixer)" }; -const struct LMS7Parameter EN_INSHSW_L_RFE = { 0x010D, 2, 2, 1, "EN_INSHSW_L_RFE", "Enables the input shorting switch at the input of the LNAL" }; -const struct LMS7Parameter EN_INSHSW_W_RFE = { 0x010D, 1, 1, 1, "EN_INSHSW_W_RFE", "Enables the input shorting switch at the input of the LNAW" }; -const struct LMS7Parameter EN_NEXTRX_RFE = { 0x010D, 0, 0, 0, "EN_NEXTRX_RFE", "Enables the daisy chain LO buffer going from RXFE1 to RXFE2" }; -const struct LMS7Parameter DCOFFI_RFE = { 0x010E, 13, 7, 64, "DCOFFI_RFE", "Controls DC offset at the output of the TIA by injecting current to the input of the TIA (I side)" }; -const struct LMS7Parameter DCOFFQ_RFE = { 0x010E, 6, 0, 64, "DCOFFQ_RFE", "Controls DC offset at the output of the TIA by injecting current to the input of the TIA (Q side)" }; -const struct LMS7Parameter ICT_LOOPB_RFE = { 0x010F, 14, 10, 12, "ICT_LOOPB_RFE", "Controls the reference current of the RXFE loopback amplifier" }; -const struct LMS7Parameter ICT_TIAMAIN_RFE = { 0x010F, 9, 5, 2, "ICT_TIAMAIN_RFE", "Controls the reference current of the RXFE TIA first stage" }; -const struct LMS7Parameter ICT_TIAOUT_RFE = { 0x010F, 4, 0, 2, "ICT_TIAOUT_RFE", "Controls the reference current of the RXFE TIA 2nd stage" }; -const struct LMS7Parameter ICT_LNACMO_RFE = { 0x0110, 14, 10, 2, "ICT_LNACMO_RFE", "Controls the current generating LNA output common mode voltage" }; -const struct LMS7Parameter ICT_LNA_RFE = { 0x0110, 9, 5, 31, "ICT_LNA_RFE", "Controls the current of the LNA core" }; -const struct LMS7Parameter ICT_LODC_RFE = { 0x0110, 4, 0, 20, "ICT_LODC_RFE", "Controls the DC of the mixer LO signal at the gate of the mixer switches" }; -const struct LMS7Parameter CAP_RXMXO_RFE = { 0x0111, 9, 5, 4, "CAP_RXMXO_RFE", "Control the decoupling cap at the output of the RX Mixer" }; -const struct LMS7Parameter CGSIN_LNA_RFE = { 0x0111, 4, 0, 3, "CGSIN_LNA_RFE", "Controls the cap parallel with the LNA input input NMOS CGS to control the Q of the maching circuit and provides trade off between gain/NF and IIP. The higher the frequency, the lower CGSIN_LNA_RFE should be. Also, the higher CGSIN, the lower the Q, The lower the gain, the higher the NF, and the higher the IIP3" }; -const struct LMS7Parameter CCOMP_TIA_RFE = { 0x0112, 15, 12, 12, "CCOMP_TIA_RFE", "Compensation capacitor for TIA" }; -const struct LMS7Parameter CFB_TIA_RFE = { 0x0112, 11, 0, 230, "CFB_TIA_RFE", "Feeback capacitor for TIA. Controls the 3dB BW of the TIA. Should be set with calibration through digital baseband" }; -const struct LMS7Parameter G_LNA_RFE = { 0x0113, 9, 6, 15, "G_LNA_RFE", "Controls the gain of the LNA" }; -const struct LMS7Parameter G_RXLOOPB_RFE = { 0x0113, 5, 2, 0, "G_RXLOOPB_RFE", "Controls RXFE loopback gain" }; -const struct LMS7Parameter G_TIA_RFE = { 0x0113, 1, 0, 3, "G_TIA_RFE", "Controls the Gain of the TIA" }; -const struct LMS7Parameter RCOMP_TIA_RFE = { 0x0114, 8, 5, 4, "RCOMP_TIA_RFE", "Controls the compensation resistors of the TIA opamp" }; -const struct LMS7Parameter RFB_TIA_RFE = { 0x0114, 4, 0, 13, "RFB_TIA_RFE", "Sets the feedback resistor to the nominal value" }; -const struct LMS7Parameter EN_LB_LPFH_RBB = { 0x0115, 15, 15, 0, "EN_LB_LPFH_RBB", "" }; -const struct LMS7Parameter EN_LB_LPFL_RBB = { 0x0115, 14, 14, 0, "EN_LB_LPFL_RBB", "" }; -const struct LMS7Parameter PD_LPFH_RBB = { 0x0115, 3, 3, 1, "PD_LPFH_RBB", "Power down of the LPFH block" }; -const struct LMS7Parameter PD_LPFL_RBB = { 0x0115, 2, 2, 0, "PD_LPFL_RBB", "Power down of the LPFL block" }; -const struct LMS7Parameter PD_PGA_RBB = { 0x0115, 1, 1, 0, "PD_PGA_RBB", "Power down of the PGA block" }; -const struct LMS7Parameter EN_G_RBB = { 0x0115, 0, 0, 1, "EN_G_RBB", "Enable control for all the RBB_1 power downs" }; -const struct LMS7Parameter R_CTL_LPF_RBB = { 0x0116, 15, 11, 16, "R_CTL_LPF_RBB", "Controls the absolute value of the resistance of the RC time constant of the RBB_LPF blocks (both Low and High)" }; -const struct LMS7Parameter RCC_CTL_LPFH_RBB = { 0x0116, 10, 8, 1, "RCC_CTL_LPFH_RBB", "Controls the stability passive compensation of the LPFH_RBB operational amplifier" }; -const struct LMS7Parameter C_CTL_LPFH_RBB = { 0x0116, 7, 0, 128, "C_CTL_LPFH_RBB", "Controls the capacitance value of the RC time constant of RBB_LPFH and it varies with the respective rxMode from 37MHz to 108MHz" }; -const struct LMS7Parameter RCC_CTL_LPFL_RBB = { 0x0117, 13, 11, 5, "RCC_CTL_LPFL_RBB", "Controls the stability passive compensation of the LPFL_RBB operational amplifier" }; -const struct LMS7Parameter C_CTL_LPFL_RBB = { 0x0117, 10, 0, 12, "C_CTL_LPFL_RBB", "Controls the capacitance value of the RC time constant of RBB_LPFH and it varies with the respective rxMode from 1.4MHz to 20MHz." }; -const struct LMS7Parameter INPUT_CTL_PGA_RBB = { 0x0118, 15, 13, 0, "INPUT_CTL_PGA_RBB", "There are a total of four different differential inputs to the PGA. Only one of them is active at a time" }; -const struct LMS7Parameter ICT_LPF_IN_RBB = { 0x0118, 9, 5, 12, "ICT_LPF_IN_RBB", "Controls the reference bias current of the input stage of the operational amplifier used in RBB_LPF blocks (Low or High). " }; -const struct LMS7Parameter ICT_LPF_OUT_RBB = { 0x0118, 4, 0, 12, "ICT_LPF_OUT_RBB", "The reference bias current of the output stage of the operational amplifier used in RBB_LPF blocks (low or High)" }; -const struct LMS7Parameter OSW_PGA_RBB = { 0x0119, 15, 15, 0, "OSW_PGA_RBB", "There are two instances of the PGA circuit in the design. The output of the RBB_LPF blocks are connected the input of these PGA blocks (common). The output of one of them is connected to two pads pgaoutn and pgaoutp and the output of the other PGA is connected directly to the ADC input" }; -const struct LMS7Parameter ICT_PGA_OUT_RBB = { 0x0119, 14, 10, 6, "ICT_PGA_OUT_RBB", "Controls the output stage reference bias current of the operational amplifier used in the PGA circuit" }; -const struct LMS7Parameter ICT_PGA_IN_RBB = { 0x0119, 9, 5, 6, "ICT_PGA_IN_RBB", "Controls the input stage reference bias current of the operational amplifier used in the PGA circuit" }; -const struct LMS7Parameter G_PGA_RBB = { 0x0119, 4, 0, 11, "G_PGA_RBB", "This is the gain of the PGA" }; -const struct LMS7Parameter RCC_CTL_PGA_RBB = { 0x011A, 13, 9, 23, "RCC_CTL_PGA_RBB", "Controls the stability passive compensation of the PGA_RBB operational amplifier" }; -const struct LMS7Parameter C_CTL_PGA_RBB = { 0x011A, 6, 0, 2, "C_CTL_PGA_RBB", "Control the value of the feedback capacitor of the PGA that is used to help against the parasitic cap at the virtual node for stability" }; -const struct LMS7Parameter RESET_N = { 0x011C, 15, 15, 1, "RESET_N", "Resets SX. A pulse should be used in the start-up to reset" }; -const struct LMS7Parameter SPDUP_VCO = { 0x011C, 14, 14, 0, "SPDUP_VCO", "Bypasses the noise filter resistor for fast settling time. It should be connected to a 1uS pulse" }; -const struct LMS7Parameter BYPLDO_VCO = { 0x011C, 13, 13, 1, "BYPLDO_VCO", "Controls the bypass signal for the SX LDO" }; -const struct LMS7Parameter EN_COARSEPLL = { 0x011C, 12, 12, 0, "EN_COARSEPLL", "Enable signal for coarse tuning block" }; -const struct LMS7Parameter CURLIM_VCO = { 0x011C, 11, 11, 1, "CURLIM_VCO", "Enables the output current limitation in the VCO regulator" }; -const struct LMS7Parameter EN_DIV2_DIVPROG = { 0x011C, 10, 10, 1, "EN_DIV2_DIVPROG", "" }; -const struct LMS7Parameter EN_INTONLY_SDM = { 0x011C, 9, 9, 0, "EN_INTONLY_SDM", "Enables INTEGER-N mode of the SX " }; -const struct LMS7Parameter EN_SDM_CLK = { 0x011C, 8, 8, 1, "EN_SDM_CLK", "Enables/Disables SDM clock. In INT-N mode or for noise testing, SDM clock can be disabled" }; -const struct LMS7Parameter PD_FBDIV = { 0x011C, 7, 7, 0, "PD_FBDIV", "Power down the feedback divider block" }; -const struct LMS7Parameter PD_LOCH_T2RBUF = { 0x011C, 6, 6, 1, "PD_LOCH_T2RBUF", "Power down for LO buffer from SXT to SXR. To be active only in the TDD mode" }; -const struct LMS7Parameter PD_CP = { 0x011C, 5, 5, 0, "PD_CP", "Power down for Charge Pump" }; -const struct LMS7Parameter PD_FDIV = { 0x011C, 4, 4, 0, "PD_FDIV", "Power down for feedback frequency and forward dividers" }; -const struct LMS7Parameter PD_SDM = { 0x011C, 3, 3, 0, "PD_SDM", "Power down for SDM" }; -const struct LMS7Parameter PD_VCO_COMP = { 0x011C, 2, 2, 0, "PD_VCO_COMP", "Power down for VCO comparator" }; -const struct LMS7Parameter PD_VCO = { 0x011C, 1, 1, 1, "PD_VCO", "Power down for VCO" }; -const struct LMS7Parameter EN_G = { 0x011C, 0, 0, 1, "EN_G", "Enable control for all the SXT power downs" }; -const struct LMS7Parameter FRAC_SDM_LSB = { 0x011D, 15, 0, 0x0400, "FRAC_SDM_LSB", "" }; -const struct LMS7Parameter INT_SDM = { 0x011E, 13, 4, 120, "INT_SDM", "" }; -const struct LMS7Parameter FRAC_SDM_MSB = { 0x011E, 3, 0, 0, "FRAC_SDM_MSB", "" }; -const struct LMS7Parameter PW_DIV2_LOCH = { 0x011F, 14, 12, 3, "PW_DIV2_LOCH", "trims the duty cycle of DIV2 LOCH. Only works when forward divider is dividing by at least 2 (excluding quadrature block division). If in bypass mode, this does not work" }; -const struct LMS7Parameter PW_DIV4_LOCH = { 0x011F, 11, 9, 3, "PW_DIV4_LOCH", "trims the duty cycle of DIV4 LOCH. Only works when forward divider is dividing by at least 4 (excluding quadrature block division). If in bypass mode, this does not work" }; -const struct LMS7Parameter DIV_LOCH = { 0x011F, 8, 6, 1, "DIV_LOCH", "Controls the division ratio in the LOCH_DIV" }; -const struct LMS7Parameter TST_SX = { 0x011F, 5, 3, 0, "TST_SX", -"Controls the test mode of PLLs. TST signal lines are shared between all PLLs (CGEN, RX and TX). Only one TST signal of any PLL should be active at a given time.\n\ -0 - TST disabled; RSSI analog outputs enabled if RSSI blocks active and when all PLL test signals are off(default)\n\ -1 - tstdo[0] = VCO / 20 clock*; tstdo[1] = VCO / 40 clock*; tstao = High impedance;\n\ -2 - tstdo[0] = SDM clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 60kOhm resistor;\n\ -3 - tstdo[0] = Reference clock; tstdo[1] = feedback divider output; tstao = VCO tune through a 10kOhm resistor;\n\ -4 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = High impedance;\n\ -5 - tstdo[0] = Charge pump Down signal; tstdo[1] = Charge pump Up signal; tstao = High impedance;\n\ -6 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 60kOhm resistor;\n\ -7 - tstdo[0] = High impedance; tstdo[1] = High impedance; tstao = VCO tune through a 10kOhm resistor;\n\ -if TST_SX[2] = 1 --> VCO_TSTBUF active generating VCO_TST_DIV20 and VCO_TST_DIV40\n\ -* When EN_DIV2_DIVPROG_(SXR, SXT) is active, the division ratio must be multiplied by 2 (40 / 80)"}; -const struct LMS7Parameter SEL_SDMCLK = { 0x011F, 2, 2, 0, "SEL_SDMCLK", "Selects between the feedback divider output and Fref for SDM" }; -const struct LMS7Parameter SX_DITHER_EN = { 0x011F, 1, 1, 0, "SX_DITHER_EN", "Enabled dithering in SDM" }; -const struct LMS7Parameter REV_SDMCLK = { 0x011F, 0, 0, 0, "REV_SDMCLK", "Reverses the SDM clock" }; -const struct LMS7Parameter VDIV_VCO = { 0x0120, 15, 8, 185, "VDIV_VCO", "Controls VCO LDO output voltage" }; -const struct LMS7Parameter ICT_VCO = { 0x0120, 7, 0, 255, "ICT_VCO", "Scales the VCO bias current from 0 to 2.5xInom" }; -const struct LMS7Parameter RSEL_LDO_VCO = { 0x0121, 15, 11, 6, "RSEL_LDO_VCO", "Set the reference voltage that supplies bias voltage of switch-cap array and varactor" }; -const struct LMS7Parameter CSW_VCO = { 0x0121, 10, 3, 128, "CSW_VCO", "Coarse control of VCO frequency, 0 for lowest frequency and 255 for highest. This control is set by SX_SWC_calibration" }; -const struct LMS7Parameter SEL_VCO = { 0x0121, 2, 1, 2, "SEL_VCO", "Selects the active VCO. It is set by SX_SWC_calibration" }; -const struct LMS7Parameter COARSE_START = { 0x0121, 0, 0, 0, "COARSE_START", "" }; -const struct LMS7Parameter REVPH_PFD = { 0x0122, 12, 12, 0, "REVPH_PFD", "Reverse the pulses of PFD. It can be used to reverse the polarity of the PLL loop (positive feedback to negative feedback)" }; -const struct LMS7Parameter IOFFSET_CP = { 0x0122, 11, 6, 12, "IOFFSET_CP", "Scales the offset current of the charge pump, 0-->63. This current is used in Fran-N mode to create an offset in the CP response and avoid the non-linear section" }; -const struct LMS7Parameter IPULSE_CP = { 0x0122, 5, 0, 63, "IPULSE_CP", "Scales the pulse current of the charge pump" }; -const struct LMS7Parameter COARSE_STEPDONE = { 0x0123, 15, 15, 0, "COARSE_STEPDONE", "" }; -const struct LMS7Parameter COARSEPLL_COMPO = { 0x0123, 14, 14, 0, "COARSEPLL_COMPO", "" }; -const struct LMS7Parameter VCO_CMPHO = { 0x0123, 13, 13, 0, "VCO_CMPHO", "" }; -const struct LMS7Parameter VCO_CMPLO = { 0x0123, 12, 12, 0, "VCO_CMPLO", "" }; -const struct LMS7Parameter CP2_PLL = { 0x0123, 11, 8, 6, "CP2_PLL", "Controls the value of CP2 (cap from CP output to GND) in the PLL filter" }; -const struct LMS7Parameter CP3_PLL = { 0x0123, 7, 4, 7, "CP3_PLL", "Controls the value of CP3 (cap from VCO Vtune input to GND) in the PLL filter" }; -const struct LMS7Parameter CZ = { 0x0123, 3, 0, 11, "CZ", "Controls the value of CZ (Zero capacitor) in the PLL filter" }; -const struct LMS7Parameter EN_DIR_SXRSXT = { 0x0124, 4, 4, 0, "EN_DIR_SXRSXT", "Enables direct control of PDs and ENs for SXR/SXT module" }; -const struct LMS7Parameter EN_DIR_RBB = { 0x0124, 3, 3, 0, "EN_DIR_RBB", "Enables direct control of PDs and ENs for RBB module" }; -const struct LMS7Parameter EN_DIR_RFE = { 0x0124, 2, 2, 0, "EN_DIR_RFE", "Enables direct control of PDs and ENs for RFE module" }; -const struct LMS7Parameter EN_DIR_TBB = { 0x0124, 1, 1, 0, "EN_DIR_TBB", "Enables direct control of PDs and ENs for TBB module" }; -const struct LMS7Parameter EN_DIR_TRF = { 0x0124, 0, 0, 0, "EN_DIR_TRF", "Enables direct control of PDs and ENs for TRF module" }; -const struct LMS7Parameter TSGFC_TXTSP = { 0x0200, 9, 9, 0, "TSGFC_TXTSP", "TSG full scale control" }; -const struct LMS7Parameter TSGFCW_TXTSP = { 0x0200, 8, 7, 1, "TSGFCW_TXTSP", "Set frequency of TSG's NCO" }; -const struct LMS7Parameter TSGDCLDQ_TXTSP = { 0x0200, 6, 6, 0, "TSGDCLDQ_TXTSP", "" }; -const struct LMS7Parameter TSGDCLDI_TXTSP = { 0x0200, 5, 5, 0, "TSGDCLDI_TXTSP", "" }; -const struct LMS7Parameter TSGSWAPIQ_TXTSP = { 0x0200, 4, 4, 0, "TSGSWAPIQ_TXTSP", "Swap signals at test signal generator's output" }; -const struct LMS7Parameter TSGMODE_TXTSP = { 0x0200, 3, 3, 0, "TSGMODE_TXTSP", "Test signal generator mode" }; -const struct LMS7Parameter INSEL_TXTSP = { 0x0200, 2, 2, 0, "INSEL_TXTSP", "Input source of TxTSP" }; -const struct LMS7Parameter BSTART_TXTSP = { 0x0200, 1, 1, 0, "BSTART_TXTSP", "Starts delta sigma built in self test. Keep it at 1 one at least three clock cycles" }; -const struct LMS7Parameter EN_TXTSP = { 0x0200, 0, 0, 1, "EN_TXTSP", "TxTSP modules enable" }; -const struct LMS7Parameter GCORRQ_TXTSP = { 0x0201, 10, 0, 2047, "GCORRQ_TXTSP", "corrector value, channel Q Unsigned integer" }; -const struct LMS7Parameter GCORRI_TXTSP = { 0x0202, 10, 0, 2047, "GCORRI_TXTSP", "corrector value, channel I Unsigned integer" }; -const struct LMS7Parameter HBI_OVR_TXTSP = { 0x0203, 14, 12, 0, "HBI_OVR_TXTSP", "HBI interpolation ratio" }; -const struct LMS7Parameter IQCORR_TXTSP = { 0x0203, 11, 0, 0, "IQCORR_TXTSP", "Phase corrector value (tan(Alpha/2)). Integer, 2's complement" }; -const struct LMS7Parameter DCCORRI_TXTSP = { 0x0204, 15, 8, 0, "DCCORRI_TXTSP", "DC corrector value, channel I. Integer, 2's complement" }; -const struct LMS7Parameter DCCORRQ_TXTSP = { 0x0204, 7, 0, 0, "DCCORRQ_TXTSP", "DC corrector value, channel Q. Integer, 2's complement" }; -const struct LMS7Parameter GFIR1_L_TXTSP = { 0x0205, 10, 8, 0, "GFIR1_L_TXTSP", "Parameter l of GFIR1 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR1_N_TXTSP = { 0x0205, 7, 0, 0, "GFIR1_N_TXTSP", "Clock division ratio of GFIR1 is GFIR1_N + 1. Unsigned integer" }; -const struct LMS7Parameter GFIR2_L_TXTSP = { 0x0206, 10, 8, 0, "GFIR2_L_TXTSP", "Parameter l of GFIR2 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR2_N_TXTSP = { 0x0206, 7, 0, 0, "GFIR2_N_TXTSP", "Clock division ratio of GFIR2 is GFIR2_N + 1. Unsigned integer" }; -const struct LMS7Parameter GFIR3_L_TXTSP = { 0x0207, 10, 8, 0, "GFIR3_L_TXTSP", "Parameter l of GFIR3 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR3_N_TXTSP = { 0x0207, 7, 0, 0, "GFIR3_N_TXTSP", "Clock division ratio of GFIR3 is GFIR3_N + 1. Unsigned integer" }; -const struct LMS7Parameter CMIX_GAIN_TXTSP = { 0x0208, 15, 14, 0, "CMIX_GAIN_TXTSP", "Gain of CMIX output" }; -const struct LMS7Parameter CMIX_SC_TXTSP = { 0x0208, 13, 13, 0, "CMIX_SC_TXTSP", "Spectrum control of CMIX" }; -const struct LMS7Parameter CMIX_BYP_TXTSP = { 0x0208, 8, 8, 0, "CMIX_BYP_TXTSP", "CMIX bypass" }; -const struct LMS7Parameter ISINC_BYP_TXTSP = { 0x0208, 7, 7, 0, "ISINC_BYP_TXTSP", "ISINC bypass" }; -const struct LMS7Parameter GFIR3_BYP_TXTSP = { 0x0208, 6, 6, 0, "GFIR3_BYP_TXTSP", "GFIR3 bypass" }; -const struct LMS7Parameter GFIR2_BYP_TXTSP = { 0x0208, 5, 5, 0, "GFIR2_BYP_TXTSP", "GFIR2 bypass" }; -const struct LMS7Parameter GFIR1_BYP_TXTSP = { 0x0208, 4, 4, 0, "GFIR1_BYP_TXTSP", "GFIR1 bypass" }; -const struct LMS7Parameter DC_BYP_TXTSP = { 0x0208, 3, 3, 0, "DC_BYP_TXTSP", "DC corrector bypass" }; -const struct LMS7Parameter GC_BYP_TXTSP = { 0x0208, 1, 1, 0, "GC_BYP_TXTSP", "Gain corrector bypass" }; -const struct LMS7Parameter PH_BYP_TXTSP = { 0x0208, 0, 0, 0, "PH_BYP_TXTSP", "Phase corrector bypass" }; -const struct LMS7Parameter BSIGI_TXTSP = { 0x0209, 23, 1, 0, "BSIGI_TXTSP", "" }; -const struct LMS7Parameter BSTATE_TXTSP = { 0x0209, 0, 0, 0, "BSTATE_TXTSP", "" }; -const struct LMS7Parameter BSIGQ_TXTSP = { 0x020A, 30, 8, 0, "BSIGQ_TXTSP", "" }; -const struct LMS7Parameter DC_REG_TXTSP = { 0x020C, 15, 0, 0, "DC_REG_TXTSP", "" }; -const struct LMS7Parameter DTHBIT_TX = { 0x0240, 8, 5, 1, "DTHBIT_TX", "NCO bits to dither" }; -const struct LMS7Parameter SEL_TX = { 0x0240, 4, 1, 0, "SEL_TX", "" }; -const struct LMS7Parameter MODE_TX = { 0x0240, 0, 0, 0, "MODE_TX", "" }; -const struct LMS7Parameter CAPTURE = { 0x0400, 15, 15, 0, "CAPTURE", "" }; -const struct LMS7Parameter CAPSEL = { 0x0400, 14, 13, 0, "CAPSEL", "" }; -const struct LMS7Parameter CAPSEL_ADC = { 0x0400, 12, 12, 0, "CAPSEL_ADC", "" }; -const struct LMS7Parameter TSGFC_RXTSP = { 0x0400, 9, 9, 0, "TSGFC_RXTSP", "TSG full scale control" }; -const struct LMS7Parameter TSGFCW_RXTSP = { 0x0400, 8, 7, 1, "TSGFCW_RXTSP", "Set frequency of TSG's NCO" }; -const struct LMS7Parameter TSGDCLDQ_RXTSP = { 0x0400, 6, 6, 0, "TSGDCLDQ_RXTSP", "" }; -const struct LMS7Parameter TSGDCLDI_RXTSP = { 0x0400, 5, 5, 0, "TSGDCLDI_RXTSP", "" }; -const struct LMS7Parameter TSGSWAPIQ_RXTSP = { 0x0400, 4, 4, 0, "TSGSWAPIQ_RXTSP", "Swap signals at test signal generator's output" }; -const struct LMS7Parameter TSGMODE_RXTSP = { 0x0400, 3, 3, 0, "TSGMODE_RXTSP", "Test signal generator mode" }; -const struct LMS7Parameter INSEL_RXTSP = { 0x0400, 2, 2, 0, "INSEL_RXTSP", "Input source of RxTSP" }; -const struct LMS7Parameter BSTART_RXTSP = { 0x0400, 1, 1, 0, "BSTART_RXTSP", "Starts delta sigma built in self test. Keep it at 1 one at least three clock cycles" }; -const struct LMS7Parameter EN_RXTSP = { 0x0400, 0, 0, 1, "EN_RXTSP", "RxTSP modules enable" }; -const struct LMS7Parameter GCORRQ_RXTSP = { 0x0401, 10, 0, 2047, "GCORRQ_RXTSP", "corrector value, channel Q Unsigned integer" }; -const struct LMS7Parameter GCORRI_RXTSP = { 0x0402, 10, 0, 2047, "GCORRI_RXTSP", "corrector value, channel I Unsigned integer" }; -const struct LMS7Parameter HBD_OVR_RXTSP = { 0x0403, 14, 12, 0, "HBD_OVR_RXTSP", "HBD interpolation ratio. Interpolation ratio is 2HBD_OVR+1" }; -const struct LMS7Parameter IQCORR_RXTSP = { 0x0403, 11, 0, 0, "IQCORR_RXTSP", "Phase corrector value (tan(Alpha/2)). Integer, 2's complement" }; -const struct LMS7Parameter HBD_DLY = { 0x0404, 15, 13, 0, "HBD_DLY", "" }; -const struct LMS7Parameter DCLOOP_BYP = { 0x0404, 8, 8, 0, "DCLOOP_BYP", "" }; -const struct LMS7Parameter DCCORR_AVG_RXTSP = { 0x0404, 2, 0, 0, "DCCORR_AVG_RXTSP", "Number of samples to average for Automatic DC corrector. Number of samples to average is 2DCCORR_AVG + 12" }; -const struct LMS7Parameter GFIR1_L_RXTSP = { 0x0405, 10, 8, 0, "GFIR1_L_RXTSP", "Parameter l of GFIR1 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR1_N_RXTSP = { 0x0405, 7, 0, 0, "GFIR1_N_RXTSP", "Clock division ratio of GFIR1 is GFIR1_N + 1. Unsigned integer" }; -const struct LMS7Parameter GFIR2_L_RXTSP = { 0x0406, 10, 8, 0, "GFIR2_L_RXTSP", "Parameter l of GFIR2 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR2_N_RXTSP = { 0x0406, 7, 0, 0, "GFIR2_N_RXTSP", "Clock division ratio of GFIR2 is GFIR2_N + 1. Unsigned integer" }; -const struct LMS7Parameter GFIR3_L_RXTSP = { 0x0407, 10, 8, 0, "GFIR3_L_RXTSP", "Parameter l of GFIR3 (l = roundUp(CoeffN/5)-1). Unsigned integer" }; -const struct LMS7Parameter GFIR3_N_RXTSP = { 0x0407, 7, 0, 0, "GFIR3_N_RXTSP", "Clock division ratio of GFIR3 is GFIR3_N + 1. Unsigned integer" }; -const struct LMS7Parameter AGC_K_RXTSP = { 0x0408, 17, 0, 0, "AGC_K_RXTSP", "AGC loop gain" }; -const struct LMS7Parameter AGC_ADESIRED_RXTSP = { 0x0409, 15, 4, 0, "AGC_ADESIRED_RXTSP", "AGC_ADESIRED" }; -const struct LMS7Parameter RSSI_MODE = { 0x040A, 15, 14, 0, "RSSI_MODE", "" }; -const struct LMS7Parameter AGC_MODE_RXTSP = { 0x040A, 13, 12, 0, "AGC_MODE_RXTSP", "" }; -const struct LMS7Parameter AGC_AVG_RXTSP = { 0x040A, 2, 0, 0, "AGC_AVG_RXTSP", "AGC Averaging window size" }; -const struct LMS7Parameter DC_REG_RXTSP = { 0x040B, 15, 0, 0, "DC_REG_RXTSP", "" }; -const struct LMS7Parameter CMIX_GAIN_RXTSP = { 0x040C, 15, 14, 0, "CMIX_GAIN_RXTSP", "Gain of CMIX output" }; -const struct LMS7Parameter CMIX_SC_RXTSP = { 0x040C, 13, 13, 0, "CMIX_SC_RXTSP", "Spectrum control of CMIX" }; -const struct LMS7Parameter CMIX_BYP_RXTSP = { 0x040C, 7, 7, 0, "CMIX_BYP_RXTSP", "CMIX bypass" }; -const struct LMS7Parameter AGC_BYP_RXTSP = { 0x040C, 6, 6, 0, "AGC_BYP_RXTSP", "AGC bypass" }; -const struct LMS7Parameter GFIR3_BYP_RXTSP = { 0x040C, 5, 5, 0, "GFIR3_BYP_RXTSP", "GFIR3 bypass" }; -const struct LMS7Parameter GFIR2_BYP_RXTSP = { 0x040C, 4, 4, 0, "GFIR2_BYP_RXTSP", "GFIR2 bypass" }; -const struct LMS7Parameter GFIR1_BYP_RXTSP = { 0x040C, 3, 3, 0, "GFIR1_BYP_RXTSP", "GFIR1 bypass" }; -const struct LMS7Parameter DC_BYP_RXTSP = { 0x040C, 2, 2, 0, "DC_BYP_RXTSP", "DC corrector bypass" }; -const struct LMS7Parameter GC_BYP_RXTSP = { 0x040C, 1, 1, 0, "GC_BYP_RXTSP", "Gain corrector bypass" }; -const struct LMS7Parameter PH_BYP_RXTSP = { 0x040C, 0, 0, 0, "PH_BYP_RXTSP", "Phase corrector bypass" }; -const struct LMS7Parameter CAPD = { 0x040E, 31, 0, 0, "CAPD", "" }; -const struct LMS7Parameter DTHBIT_RX = { 0x0440, 8, 5, 1, "DTHBIT_RX", "NCO bits to dither" }; -const struct LMS7Parameter SEL_RX = { 0x0440, 4, 1, 0, "SEL_RX", "" }; -const struct LMS7Parameter MODE_RX = { 0x0440, 0, 0, 0, "MODE_RX", "" }; diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.h deleted file mode 100644 index 3fc4e0be6b..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_parameters.h +++ /dev/null @@ -1,613 +0,0 @@ -/** -@file LMS7002M_parameters.h -@author Lime Microsystems (www.limemicro.com) -@brief List of LMS7002M transceiver control parameters -*/ - -#ifndef LMS7002M_PARAMETERS_H -#define LMS7002M_PARAMETERS_H - -#include "typedefs.h" -#include - -struct LMS7Parameter; -extern std::vector LMS7parameterList; - -struct LMS7Parameter -{ - LMS7Parameter() : address(0), msb(0), lsb(0), defaultValue(0), name(nullptr), tooltip(nullptr) - { - } - - LMS7Parameter(uint16_t address, uint8_t msb, uint8_t lsb, uint16_t defaultValue, const char *name, const char* tooltip) - : address(address), msb(msb), lsb(lsb), defaultValue(defaultValue), name(name), tooltip(tooltip) - { - LMS7parameterList.push_back(this); - } - - uint16_t address; - uint8_t msb; - uint8_t lsb; - uint16_t defaultValue; - const char* name; - const char* tooltip; - inline bool operator==(const LMS7Parameter& obj) - { - if (address == obj.address && msb == obj.msb && lsb == obj.lsb) - return true; - return false; - }; -}; - -extern const struct LMS7Parameter LRST_TX_B; -extern const struct LMS7Parameter MRST_TX_B; -extern const struct LMS7Parameter LRST_TX_A; -extern const struct LMS7Parameter MRST_TX_A; -extern const struct LMS7Parameter LRST_RX_B; -extern const struct LMS7Parameter MRST_RX_B; -extern const struct LMS7Parameter LRST_RX_A; -extern const struct LMS7Parameter MRST_RX_A; -extern const struct LMS7Parameter SRST_RXFIFO; -extern const struct LMS7Parameter SRST_TXFIFO; -extern const struct LMS7Parameter RXEN_B; -extern const struct LMS7Parameter RXEN_A; -extern const struct LMS7Parameter TXEN_B; -extern const struct LMS7Parameter TXEN_A; -extern const struct LMS7Parameter MAC; -extern const struct LMS7Parameter TX_CLK_PE; -extern const struct LMS7Parameter RX_CLK_PE; -extern const struct LMS7Parameter SDA_PE; -extern const struct LMS7Parameter SDA_DS; -extern const struct LMS7Parameter SCL_PE; -extern const struct LMS7Parameter SCL_DS; -extern const struct LMS7Parameter SDIO_DS; -extern const struct LMS7Parameter SDIO_PE; -extern const struct LMS7Parameter SDO_PE; -extern const struct LMS7Parameter SCLK_PE; -extern const struct LMS7Parameter SEN_PE; -extern const struct LMS7Parameter SPIMODE; -extern const struct LMS7Parameter DIQ2_DS; -extern const struct LMS7Parameter DIQ2_PE; -extern const struct LMS7Parameter IQ_SEL_EN_2_PE; -extern const struct LMS7Parameter TXNRX2_PE; -extern const struct LMS7Parameter FCLK2_PE; -extern const struct LMS7Parameter MCLK2_PE; -extern const struct LMS7Parameter DIQ1_DS; -extern const struct LMS7Parameter DIQ1_PE; -extern const struct LMS7Parameter IQ_SEL_EN_1_PE; -extern const struct LMS7Parameter TXNRX1_PE; -extern const struct LMS7Parameter FCLK1_PE; -extern const struct LMS7Parameter MCLK1_PE; -extern const struct LMS7Parameter DIQDIRCTR2; -extern const struct LMS7Parameter DIQDIR2; -extern const struct LMS7Parameter DIQDIRCTR1; -extern const struct LMS7Parameter DIQDIR1; -extern const struct LMS7Parameter ENABLEDIRCTR2; -extern const struct LMS7Parameter ENABLEDIR2; -extern const struct LMS7Parameter ENABLEDIRCTR1; -extern const struct LMS7Parameter ENABLEDIR1; -extern const struct LMS7Parameter MOD_EN; -extern const struct LMS7Parameter LML2_FIDM; -extern const struct LMS7Parameter LML2_TXNRXIQ; -extern const struct LMS7Parameter LML2_MODE; -extern const struct LMS7Parameter LML1_FIDM; -extern const struct LMS7Parameter LML1_TXNRXIQ; -extern const struct LMS7Parameter LML1_MODE; -extern const struct LMS7Parameter LML1_S3S; -extern const struct LMS7Parameter LML1_S2S; -extern const struct LMS7Parameter LML1_S1S; -extern const struct LMS7Parameter LML1_S0S; -extern const struct LMS7Parameter LML1_BQP; -extern const struct LMS7Parameter LML1_BIP; -extern const struct LMS7Parameter LML1_AQP; -extern const struct LMS7Parameter LML1_AIP; -extern const struct LMS7Parameter LML1_BB2RF_PST; -extern const struct LMS7Parameter LML1_BB2RF_PRE; -extern const struct LMS7Parameter LML1_RF2BB_PST; -extern const struct LMS7Parameter LML1_RF2BB_PRE; -extern const struct LMS7Parameter LML2_S3S; -extern const struct LMS7Parameter LML2_S2S; -extern const struct LMS7Parameter LML2_S1S; -extern const struct LMS7Parameter LML2_S0S; -extern const struct LMS7Parameter LML2_BQP; -extern const struct LMS7Parameter LML2_BIP; -extern const struct LMS7Parameter LML2_AQP; -extern const struct LMS7Parameter LML2_AIP; -extern const struct LMS7Parameter LML2_BB2RF_PST; -extern const struct LMS7Parameter LML2_BB2RF_PRE; -extern const struct LMS7Parameter LML2_RF2BB_PST; -extern const struct LMS7Parameter LML2_RF2BB_PRE; -extern const struct LMS7Parameter FCLK2_DLY; -extern const struct LMS7Parameter FCLK1_DLY; -extern const struct LMS7Parameter RX_MUX; -extern const struct LMS7Parameter TX_MUX; -extern const struct LMS7Parameter TXRDCLK_MUX; -extern const struct LMS7Parameter TXWRCLK_MUX; -extern const struct LMS7Parameter RXRDCLK_MUX; -extern const struct LMS7Parameter RXWRCLK_MUX; -extern const struct LMS7Parameter FCLK2_INV; -extern const struct LMS7Parameter FCLK1_INV; -extern const struct LMS7Parameter MCLK2DLY; -extern const struct LMS7Parameter MCLK1DLY; -extern const struct LMS7Parameter MCLK2SRC; -extern const struct LMS7Parameter MCLK1SRC; -extern const struct LMS7Parameter TXDIVEN; -extern const struct LMS7Parameter RXDIVEN; -extern const struct LMS7Parameter TXTSPCLKA_DIV; -extern const struct LMS7Parameter RXTSPCLKA_DIV; -extern const struct LMS7Parameter MIMO_SISO; -extern const struct LMS7Parameter VER; -extern const struct LMS7Parameter REV; -extern const struct LMS7Parameter MASK; -extern const struct LMS7Parameter EN_DIR_LDO; -extern const struct LMS7Parameter EN_DIR_CGEN; -extern const struct LMS7Parameter EN_DIR_XBUF; -extern const struct LMS7Parameter EN_DIR_AFE; -extern const struct LMS7Parameter ISEL_DAC_AFE; -extern const struct LMS7Parameter MODE_INTERLEAVE_AFE; -extern const struct LMS7Parameter MUX_AFE_1; -extern const struct LMS7Parameter MUX_AFE_2; -extern const struct LMS7Parameter PD_AFE; -extern const struct LMS7Parameter PD_RX_AFE1; -extern const struct LMS7Parameter PD_RX_AFE2; -extern const struct LMS7Parameter PD_TX_AFE1; -extern const struct LMS7Parameter PD_TX_AFE2; -extern const struct LMS7Parameter EN_G_AFE; -extern const struct LMS7Parameter MUX_BIAS_OUT; -extern const struct LMS7Parameter RP_CALIB_BIAS; -extern const struct LMS7Parameter PD_FRP_BIAS; -extern const struct LMS7Parameter PD_F_BIAS; -extern const struct LMS7Parameter PD_PTRP_BIAS; -extern const struct LMS7Parameter PD_PT_BIAS; -extern const struct LMS7Parameter PD_BIAS_MASTER; -extern const struct LMS7Parameter SLFB_XBUF_RX; -extern const struct LMS7Parameter SLFB_XBUF_TX; -extern const struct LMS7Parameter BYP_XBUF_RX; -extern const struct LMS7Parameter BYP_XBUF_TX; -extern const struct LMS7Parameter EN_OUT2_XBUF_TX; -extern const struct LMS7Parameter EN_TBUFIN_XBUF_RX; -extern const struct LMS7Parameter PD_XBUF_RX; -extern const struct LMS7Parameter PD_XBUF_TX; -extern const struct LMS7Parameter EN_G_XBUF; -extern const struct LMS7Parameter SPDUP_VCO_CGEN; -extern const struct LMS7Parameter RESET_N_CGEN; -extern const struct LMS7Parameter EN_ADCCLKH_CLKGN; -extern const struct LMS7Parameter EN_COARSE_CKLGEN; -extern const struct LMS7Parameter EN_INTONLY_SDM_CGEN; -extern const struct LMS7Parameter EN_SDM_CLK_CGEN; -extern const struct LMS7Parameter PD_CP_CGEN; -extern const struct LMS7Parameter PD_FDIV_FB_CGEN; -extern const struct LMS7Parameter PD_FDIV_O_CGEN; -extern const struct LMS7Parameter PD_SDM_CGEN; -extern const struct LMS7Parameter PD_VCO_CGEN; -extern const struct LMS7Parameter PD_VCO_COMP_CGEN; -extern const struct LMS7Parameter EN_G_CGEN; -extern const struct LMS7Parameter FRAC_SDM_CGEN_LSB; -extern const struct LMS7Parameter INT_SDM_CGEN; -extern const struct LMS7Parameter FRAC_SDM_CGEN_MSB; -extern const struct LMS7Parameter REV_SDMCLK_CGEN; -extern const struct LMS7Parameter SEL_SDMCLK_CGEN; -extern const struct LMS7Parameter SX_DITHER_EN_CGEN; -extern const struct LMS7Parameter CLKH_OV_CLKL_CGEN; -extern const struct LMS7Parameter DIV_OUTCH_CGEN; -extern const struct LMS7Parameter TST_CGEN; -extern const struct LMS7Parameter REV_CLKDAC_CGEN; -extern const struct LMS7Parameter CMPLO_CTRL_CGEN; -extern const struct LMS7Parameter REV_CLKADC_CGEN; -extern const struct LMS7Parameter REVPH_PFD_CGEN; -extern const struct LMS7Parameter IOFFSET_CP_CGEN; -extern const struct LMS7Parameter IPULSE_CP_CGEN; -extern const struct LMS7Parameter ICT_VCO_CGEN; -extern const struct LMS7Parameter CSW_VCO_CGEN; -extern const struct LMS7Parameter COARSE_START_CGEN; -extern const struct LMS7Parameter COARSE_STEPDONE_CGEN; -extern const struct LMS7Parameter COARSEPLL_COMPO_CGEN; -extern const struct LMS7Parameter VCO_CMPHO_CGEN; -extern const struct LMS7Parameter VCO_CMPLO_CGEN; -extern const struct LMS7Parameter CP2_CGEN; -extern const struct LMS7Parameter CP3_CGEN; -extern const struct LMS7Parameter CZ_CGEN; -extern const struct LMS7Parameter EN_LDO_DIG; -extern const struct LMS7Parameter EN_LDO_DIGGN; -extern const struct LMS7Parameter EN_LDO_DIGSXR; -extern const struct LMS7Parameter EN_LDO_DIGSXT; -extern const struct LMS7Parameter EN_LDO_DIVGN; -extern const struct LMS7Parameter EN_LDO_DIVSXR; -extern const struct LMS7Parameter EN_LDO_DIVSXT; -extern const struct LMS7Parameter EN_LDO_LNA12; -extern const struct LMS7Parameter EN_LDO_LNA14; -extern const struct LMS7Parameter EN_LDO_MXRFE; -extern const struct LMS7Parameter EN_LDO_RBB; -extern const struct LMS7Parameter EN_LDO_RXBUF; -extern const struct LMS7Parameter EN_LDO_TBB; -extern const struct LMS7Parameter EN_LDO_TIA12; -extern const struct LMS7Parameter EN_LDO_TIA14; -extern const struct LMS7Parameter EN_G_LDO; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TLOB; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TPAD; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TXBUF; -extern const struct LMS7Parameter EN_LOADIMP_LDO_VCOGN; -extern const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXR; -extern const struct LMS7Parameter EN_LOADIMP_LDO_VCOSXT; -extern const struct LMS7Parameter EN_LDO_AFE; -extern const struct LMS7Parameter EN_LDO_CPGN; -extern const struct LMS7Parameter EN_LDO_CPSXR; -extern const struct LMS7Parameter EN_LDO_TLOB; -extern const struct LMS7Parameter EN_LDO_TPAD; -extern const struct LMS7Parameter EN_LDO_TXBUF; -extern const struct LMS7Parameter EN_LDO_VCOGN; -extern const struct LMS7Parameter EN_LDO_VCOSXR; -extern const struct LMS7Parameter EN_LDO_VCOSXT; -extern const struct LMS7Parameter EN_LDO_CPSXT; -extern const struct LMS7Parameter EN_LOADIMP_LDO_CPSXT; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIG; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGGN; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXR; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGSXT; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIVGN; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXR; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIVSXT; -extern const struct LMS7Parameter EN_LOADIMP_LDO_LNA12; -extern const struct LMS7Parameter EN_LOADIMP_LDO_LNA14; -extern const struct LMS7Parameter EN_LOADIMP_LDO_MXRFE; -extern const struct LMS7Parameter EN_LOADIMP_LDO_RBB; -extern const struct LMS7Parameter EN_LOADIMP_LDO_RXBUF; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TBB; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TIA12; -extern const struct LMS7Parameter EN_LOADIMP_LDO_TIA14; -extern const struct LMS7Parameter BYP_LDO_TBB; -extern const struct LMS7Parameter BYP_LDO_TIA12; -extern const struct LMS7Parameter BYP_LDO_TIA14; -extern const struct LMS7Parameter BYP_LDO_TLOB; -extern const struct LMS7Parameter BYP_LDO_TPAD; -extern const struct LMS7Parameter BYP_LDO_TXBUF; -extern const struct LMS7Parameter BYP_LDO_VCOGN; -extern const struct LMS7Parameter BYP_LDO_VCOSXR; -extern const struct LMS7Parameter BYP_LDO_VCOSXT; -extern const struct LMS7Parameter EN_LOADIMP_LDO_AFE; -extern const struct LMS7Parameter EN_LOADIMP_LDO_CPGN; -extern const struct LMS7Parameter EN_LOADIMP_LDO_CPSXR; -extern const struct LMS7Parameter BYP_LDO_AFE; -extern const struct LMS7Parameter BYP_LDO_CPGN; -extern const struct LMS7Parameter BYP_LDO_CPSXR; -extern const struct LMS7Parameter BYP_LDO_CPSXT; -extern const struct LMS7Parameter BYP_LDO_DIG; -extern const struct LMS7Parameter BYP_LDO_DIGGN; -extern const struct LMS7Parameter BYP_LDO_DIGSXR; -extern const struct LMS7Parameter BYP_LDO_DIGSXT; -extern const struct LMS7Parameter BYP_LDO_DIVGN; -extern const struct LMS7Parameter BYP_LDO_DIVSXR; -extern const struct LMS7Parameter BYP_LDO_DIVSXT; -extern const struct LMS7Parameter BYP_LDO_LNA12; -extern const struct LMS7Parameter BYP_LDO_LNA14; -extern const struct LMS7Parameter BYP_LDO_MXRFE; -extern const struct LMS7Parameter BYP_LDO_RBB; -extern const struct LMS7Parameter BYP_LDO_RXBUF; -extern const struct LMS7Parameter SPDUP_LDO_DIVSXR; -extern const struct LMS7Parameter SPDUP_LDO_DIVSXT; -extern const struct LMS7Parameter SPDUP_LDO_LNA12; -extern const struct LMS7Parameter SPDUP_LDO_LNA14; -extern const struct LMS7Parameter SPDUP_LDO_MXRFE; -extern const struct LMS7Parameter SPDUP_LDO_RBB; -extern const struct LMS7Parameter SPDUP_LDO_RXBUF; -extern const struct LMS7Parameter SPDUP_LDO_TBB; -extern const struct LMS7Parameter SPDUP_LDO_TIA12; -extern const struct LMS7Parameter SPDUP_LDO_TIA14; -extern const struct LMS7Parameter SPDUP_LDO_TLOB; -extern const struct LMS7Parameter SPDUP_LDO_TPAD; -extern const struct LMS7Parameter SPDUP_LDO_TXBUF; -extern const struct LMS7Parameter SPDUP_LDO_VCOGN; -extern const struct LMS7Parameter SPDUP_LDO_VCOSXR; -extern const struct LMS7Parameter SPDUP_LDO_VCOSXT; -extern const struct LMS7Parameter SPDUP_LDO_AFE; -extern const struct LMS7Parameter SPDUP_LDO_CPGN; -extern const struct LMS7Parameter SPDUP_LDO_CPSXR; -extern const struct LMS7Parameter SPDUP_LDO_CPSXT; -extern const struct LMS7Parameter SPDUP_LDO_DIG; -extern const struct LMS7Parameter SPDUP_LDO_DIGGN; -extern const struct LMS7Parameter SPDUP_LDO_DIGSXR; -extern const struct LMS7Parameter SPDUP_LDO_DIGSXT; -extern const struct LMS7Parameter SPDUP_LDO_DIVGN; -extern const struct LMS7Parameter RDIV_VCOSXR; -extern const struct LMS7Parameter RDIV_VCOSXT; -extern const struct LMS7Parameter RDIV_TXBUF; -extern const struct LMS7Parameter RDIV_VCOGN; -extern const struct LMS7Parameter RDIV_TLOB; -extern const struct LMS7Parameter RDIV_TPAD; -extern const struct LMS7Parameter RDIV_TIA12; -extern const struct LMS7Parameter RDIV_TIA14; -extern const struct LMS7Parameter RDIV_RXBUF; -extern const struct LMS7Parameter RDIV_TBB; -extern const struct LMS7Parameter RDIV_MXRFE; -extern const struct LMS7Parameter RDIV_RBB; -extern const struct LMS7Parameter RDIV_LNA12; -extern const struct LMS7Parameter RDIV_LNA14; -extern const struct LMS7Parameter RDIV_DIVSXR; -extern const struct LMS7Parameter RDIV_DIVSXT; -extern const struct LMS7Parameter RDIV_DIGSXT; -extern const struct LMS7Parameter RDIV_DIVGN; -extern const struct LMS7Parameter RDIV_DIGGN; -extern const struct LMS7Parameter RDIV_DIGSXR; -extern const struct LMS7Parameter RDIV_CPSXT; -extern const struct LMS7Parameter RDIV_DIG; -extern const struct LMS7Parameter RDIV_CPGN; -extern const struct LMS7Parameter RDIV_CPSXR; -extern const struct LMS7Parameter RDIV_SPIBUF; -extern const struct LMS7Parameter RDIV_AFE; -extern const struct LMS7Parameter SPDUP_LDO_SPIBUF; -extern const struct LMS7Parameter SPDUP_LDO_DIGIp2; -extern const struct LMS7Parameter SPDUP_LDO_DIGIp1; -extern const struct LMS7Parameter BYP_LDO_SPIBUF; -extern const struct LMS7Parameter BYP_LDO_DIGIp2; -extern const struct LMS7Parameter BYP_LDO_DIGIp1; -extern const struct LMS7Parameter EN_LOADIMP_LDO_SPIBUF; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp2; -extern const struct LMS7Parameter EN_LOADIMP_LDO_DIGIp1; -extern const struct LMS7Parameter PD_LDO_SPIBUF; -extern const struct LMS7Parameter PD_LDO_DIGIp2; -extern const struct LMS7Parameter PD_LDO_DIGIp1; -extern const struct LMS7Parameter EN_G_LDOP; -extern const struct LMS7Parameter RDIV_DIGIp2; -extern const struct LMS7Parameter RDIV_DIGIp1; -extern const struct LMS7Parameter BSIGT; -extern const struct LMS7Parameter BSTATE; -extern const struct LMS7Parameter EN_SDM_TSTO_SXT; -extern const struct LMS7Parameter EN_SDM_TSTO_SXR; -extern const struct LMS7Parameter EN_SDM_TSTO_CGEN; -extern const struct LMS7Parameter BENC; -extern const struct LMS7Parameter BENR; -extern const struct LMS7Parameter BENT; -extern const struct LMS7Parameter BSTART; -extern const struct LMS7Parameter BSIGR; -extern const struct LMS7Parameter BSIGC; -extern const struct LMS7Parameter CDS_MCLK2; -extern const struct LMS7Parameter CDS_MCLK1; -extern const struct LMS7Parameter CDSN_TXBTSP; -extern const struct LMS7Parameter CDSN_TXATSP; -extern const struct LMS7Parameter CDSN_RXBTSP; -extern const struct LMS7Parameter CDSN_RXATSP; -extern const struct LMS7Parameter CDSN_TXBLML; -extern const struct LMS7Parameter CDSN_TXALML; -extern const struct LMS7Parameter CDSN_RXBLML; -extern const struct LMS7Parameter CDSN_RXALML; -extern const struct LMS7Parameter CDSN_MCLK2; -extern const struct LMS7Parameter CDSN_MCLK1; -extern const struct LMS7Parameter CDS_TXBTSP; -extern const struct LMS7Parameter CDS_TXATSP; -extern const struct LMS7Parameter CDS_RXBTSP; -extern const struct LMS7Parameter CDS_RXATSP; -extern const struct LMS7Parameter CDS_TXBLML; -extern const struct LMS7Parameter CDS_TXALML; -extern const struct LMS7Parameter CDS_RXBLML; -extern const struct LMS7Parameter CDS_RXALML; -extern const struct LMS7Parameter EN_LOWBWLOMX_TMX_TRF; -extern const struct LMS7Parameter EN_NEXTTX_TRF; -extern const struct LMS7Parameter EN_AMPHF_PDET_TRF; -extern const struct LMS7Parameter LOADR_PDET_TRF; -extern const struct LMS7Parameter PD_PDET_TRF; -extern const struct LMS7Parameter PD_TLOBUF_TRF; -extern const struct LMS7Parameter PD_TXPAD_TRF; -extern const struct LMS7Parameter EN_G_TRF; -extern const struct LMS7Parameter F_TXPAD_TRF; -extern const struct LMS7Parameter L_LOOPB_TXPAD_TRF; -extern const struct LMS7Parameter LOSS_LIN_TXPAD_TRF; -extern const struct LMS7Parameter LOSS_MAIN_TXPAD_TRF; -extern const struct LMS7Parameter EN_LOOPB_TXPAD_TRF; -extern const struct LMS7Parameter GCAS_GNDREF_TXPAD_TRF; -extern const struct LMS7Parameter ICT_LIN_TXPAD_TRF; -extern const struct LMS7Parameter ICT_MAIN_TXPAD_TRF; -extern const struct LMS7Parameter VGCAS_TXPAD_TRF; -extern const struct LMS7Parameter SEL_BAND1_TRF; -extern const struct LMS7Parameter SEL_BAND2_TRF; -extern const struct LMS7Parameter LOBIASN_TXM_TRF; -extern const struct LMS7Parameter LOBIASP_TXX_TRF; -extern const struct LMS7Parameter CDC_I_TRF; -extern const struct LMS7Parameter CDC_Q_TRF; -extern const struct LMS7Parameter STATPULSE_TBB; -extern const struct LMS7Parameter LOOPB_TBB; -extern const struct LMS7Parameter PD_LPFH_TBB; -extern const struct LMS7Parameter PD_LPFIAMP_TBB; -extern const struct LMS7Parameter PD_LPFLAD_TBB; -extern const struct LMS7Parameter PD_LPFS5_TBB; -extern const struct LMS7Parameter EN_G_TBB; -extern const struct LMS7Parameter ICT_LPFS5_F_TBB; -extern const struct LMS7Parameter ICT_LPFS5_PT_TBB; -extern const struct LMS7Parameter ICT_LPF_H_PT_TBB; -extern const struct LMS7Parameter ICT_LPFH_F_TBB; -extern const struct LMS7Parameter ICT_LPFLAD_F_TBB; -extern const struct LMS7Parameter ICT_LPFLAD_PT_TBB; -extern const struct LMS7Parameter CG_IAMP_TBB; -extern const struct LMS7Parameter ICT_IAMP_FRP_TBB; -extern const struct LMS7Parameter ICT_IAMP_GG_FRP_TBB; -extern const struct LMS7Parameter RCAL_LPFH_TBB; -extern const struct LMS7Parameter RCAL_LPFLAD_TBB; -extern const struct LMS7Parameter TSTIN_TBB; -extern const struct LMS7Parameter BYPLADDER_TBB; -extern const struct LMS7Parameter CCAL_LPFLAD_TBB; -extern const struct LMS7Parameter RCAL_LPFS5_TBB; -extern const struct LMS7Parameter CDC_I_RFE; -extern const struct LMS7Parameter CDC_Q_RFE; -extern const struct LMS7Parameter PD_LNA_RFE; -extern const struct LMS7Parameter PD_RLOOPB_1_RFE; -extern const struct LMS7Parameter PD_RLOOPB_2_RFE; -extern const struct LMS7Parameter PD_MXLOBUF_RFE; -extern const struct LMS7Parameter PD_QGEN_RFE; -extern const struct LMS7Parameter PD_RSSI_RFE; -extern const struct LMS7Parameter PD_TIA_RFE; -extern const struct LMS7Parameter EN_G_RFE; -extern const struct LMS7Parameter SEL_PATH_RFE; -extern const struct LMS7Parameter EN_DCOFF_RXFE_RFE; -extern const struct LMS7Parameter EN_INSHSW_LB1_RFE; -extern const struct LMS7Parameter EN_INSHSW_LB2_RFE; -extern const struct LMS7Parameter EN_INSHSW_L_RFE; -extern const struct LMS7Parameter EN_INSHSW_W_RFE; -extern const struct LMS7Parameter EN_NEXTRX_RFE; -extern const struct LMS7Parameter DCOFFI_RFE; -extern const struct LMS7Parameter DCOFFQ_RFE; -extern const struct LMS7Parameter ICT_LOOPB_RFE; -extern const struct LMS7Parameter ICT_TIAMAIN_RFE; -extern const struct LMS7Parameter ICT_TIAOUT_RFE; -extern const struct LMS7Parameter ICT_LNACMO_RFE; -extern const struct LMS7Parameter ICT_LNA_RFE; -extern const struct LMS7Parameter ICT_LODC_RFE; -extern const struct LMS7Parameter CAP_RXMXO_RFE; -extern const struct LMS7Parameter CGSIN_LNA_RFE; -extern const struct LMS7Parameter CCOMP_TIA_RFE; -extern const struct LMS7Parameter CFB_TIA_RFE; -extern const struct LMS7Parameter G_LNA_RFE; -extern const struct LMS7Parameter G_RXLOOPB_RFE; -extern const struct LMS7Parameter G_TIA_RFE; -extern const struct LMS7Parameter RCOMP_TIA_RFE; -extern const struct LMS7Parameter RFB_TIA_RFE; -extern const struct LMS7Parameter EN_LB_LPFH_RBB; -extern const struct LMS7Parameter EN_LB_LPFL_RBB; -extern const struct LMS7Parameter PD_LPFH_RBB; -extern const struct LMS7Parameter PD_LPFL_RBB; -extern const struct LMS7Parameter PD_PGA_RBB; -extern const struct LMS7Parameter EN_G_RBB; -extern const struct LMS7Parameter R_CTL_LPF_RBB; -extern const struct LMS7Parameter RCC_CTL_LPFH_RBB; -extern const struct LMS7Parameter C_CTL_LPFH_RBB; -extern const struct LMS7Parameter RCC_CTL_LPFL_RBB; -extern const struct LMS7Parameter C_CTL_LPFL_RBB; -extern const struct LMS7Parameter INPUT_CTL_PGA_RBB; -extern const struct LMS7Parameter ICT_LPF_IN_RBB; -extern const struct LMS7Parameter ICT_LPF_OUT_RBB; -extern const struct LMS7Parameter OSW_PGA_RBB; -extern const struct LMS7Parameter ICT_PGA_OUT_RBB; -extern const struct LMS7Parameter ICT_PGA_IN_RBB; -extern const struct LMS7Parameter G_PGA_RBB; -extern const struct LMS7Parameter RCC_CTL_PGA_RBB; -extern const struct LMS7Parameter C_CTL_PGA_RBB; -extern const struct LMS7Parameter RESET_N; -extern const struct LMS7Parameter SPDUP_VCO; -extern const struct LMS7Parameter BYPLDO_VCO; -extern const struct LMS7Parameter EN_COARSEPLL; -extern const struct LMS7Parameter CURLIM_VCO; -extern const struct LMS7Parameter EN_DIV2_DIVPROG; -extern const struct LMS7Parameter EN_INTONLY_SDM; -extern const struct LMS7Parameter EN_SDM_CLK; -extern const struct LMS7Parameter PD_FBDIV; -extern const struct LMS7Parameter PD_LOCH_T2RBUF; -extern const struct LMS7Parameter PD_CP; -extern const struct LMS7Parameter PD_FDIV; -extern const struct LMS7Parameter PD_SDM; -extern const struct LMS7Parameter PD_VCO_COMP; -extern const struct LMS7Parameter PD_VCO; -extern const struct LMS7Parameter EN_G; -extern const struct LMS7Parameter FRAC_SDM_LSB; -extern const struct LMS7Parameter INT_SDM; -extern const struct LMS7Parameter FRAC_SDM_MSB; -extern const struct LMS7Parameter PW_DIV2_LOCH; -extern const struct LMS7Parameter PW_DIV4_LOCH; -extern const struct LMS7Parameter DIV_LOCH; -extern const struct LMS7Parameter TST_SX; -extern const struct LMS7Parameter SEL_SDMCLK; -extern const struct LMS7Parameter SX_DITHER_EN; -extern const struct LMS7Parameter REV_SDMCLK; -extern const struct LMS7Parameter VDIV_VCO; -extern const struct LMS7Parameter ICT_VCO; -extern const struct LMS7Parameter RSEL_LDO_VCO; -extern const struct LMS7Parameter CSW_VCO; -extern const struct LMS7Parameter SEL_VCO; -extern const struct LMS7Parameter COARSE_START; -extern const struct LMS7Parameter REVPH_PFD; -extern const struct LMS7Parameter IOFFSET_CP; -extern const struct LMS7Parameter IPULSE_CP; -extern const struct LMS7Parameter COARSE_STEPDONE; -extern const struct LMS7Parameter COARSEPLL_COMPO; -extern const struct LMS7Parameter VCO_CMPHO; -extern const struct LMS7Parameter VCO_CMPLO; -extern const struct LMS7Parameter CP2_PLL; -extern const struct LMS7Parameter CP3_PLL; -extern const struct LMS7Parameter CZ; -extern const struct LMS7Parameter EN_DIR_SXRSXT; -extern const struct LMS7Parameter EN_DIR_RBB; -extern const struct LMS7Parameter EN_DIR_RFE; -extern const struct LMS7Parameter EN_DIR_TBB; -extern const struct LMS7Parameter EN_DIR_TRF; -extern const struct LMS7Parameter TSGFC_TXTSP; -extern const struct LMS7Parameter TSGFCW_TXTSP; -extern const struct LMS7Parameter TSGDCLDQ_TXTSP; -extern const struct LMS7Parameter TSGDCLDI_TXTSP; -extern const struct LMS7Parameter TSGSWAPIQ_TXTSP; -extern const struct LMS7Parameter TSGMODE_TXTSP; -extern const struct LMS7Parameter INSEL_TXTSP; -extern const struct LMS7Parameter BSTART_TXTSP; -extern const struct LMS7Parameter EN_TXTSP; -extern const struct LMS7Parameter GCORRQ_TXTSP; -extern const struct LMS7Parameter GCORRI_TXTSP; -extern const struct LMS7Parameter HBI_OVR_TXTSP; -extern const struct LMS7Parameter IQCORR_TXTSP; -extern const struct LMS7Parameter DCCORRI_TXTSP; -extern const struct LMS7Parameter DCCORRQ_TXTSP; -extern const struct LMS7Parameter GFIR1_L_TXTSP; -extern const struct LMS7Parameter GFIR1_N_TXTSP; -extern const struct LMS7Parameter GFIR2_L_TXTSP; -extern const struct LMS7Parameter GFIR2_N_TXTSP; -extern const struct LMS7Parameter GFIR3_L_TXTSP; -extern const struct LMS7Parameter GFIR3_N_TXTSP; -extern const struct LMS7Parameter CMIX_GAIN_TXTSP; -extern const struct LMS7Parameter CMIX_SC_TXTSP; -extern const struct LMS7Parameter CMIX_BYP_TXTSP; -extern const struct LMS7Parameter ISINC_BYP_TXTSP; -extern const struct LMS7Parameter GFIR3_BYP_TXTSP; -extern const struct LMS7Parameter GFIR2_BYP_TXTSP; -extern const struct LMS7Parameter GFIR1_BYP_TXTSP; -extern const struct LMS7Parameter DC_BYP_TXTSP; -extern const struct LMS7Parameter GC_BYP_TXTSP; -extern const struct LMS7Parameter PH_BYP_TXTSP; -extern const struct LMS7Parameter BSIGI_TXTSP; -extern const struct LMS7Parameter BSTATE_TXTSP; -extern const struct LMS7Parameter BSIGQ_TXTSP; -extern const struct LMS7Parameter DC_REG_TXTSP; -extern const struct LMS7Parameter DTHBIT_TX; -extern const struct LMS7Parameter SEL_TX; -extern const struct LMS7Parameter MODE_TX; -extern const struct LMS7Parameter CAPTURE; -extern const struct LMS7Parameter CAPSEL; -extern const struct LMS7Parameter CAPSEL_ADC; -extern const struct LMS7Parameter TSGFC_RXTSP; -extern const struct LMS7Parameter TSGFCW_RXTSP; -extern const struct LMS7Parameter TSGDCLDQ_RXTSP; -extern const struct LMS7Parameter TSGDCLDI_RXTSP; -extern const struct LMS7Parameter TSGSWAPIQ_RXTSP; -extern const struct LMS7Parameter TSGMODE_RXTSP; -extern const struct LMS7Parameter INSEL_RXTSP; -extern const struct LMS7Parameter BSTART_RXTSP; -extern const struct LMS7Parameter EN_RXTSP; -extern const struct LMS7Parameter GCORRQ_RXTSP; -extern const struct LMS7Parameter GCORRI_RXTSP; -extern const struct LMS7Parameter HBD_OVR_RXTSP; -extern const struct LMS7Parameter IQCORR_RXTSP; -extern const struct LMS7Parameter HBD_DLY; -extern const struct LMS7Parameter DCLOOP_BYP; -extern const struct LMS7Parameter DCCORR_AVG_RXTSP; -extern const struct LMS7Parameter GFIR1_L_RXTSP; -extern const struct LMS7Parameter GFIR1_N_RXTSP; -extern const struct LMS7Parameter GFIR2_L_RXTSP; -extern const struct LMS7Parameter GFIR2_N_RXTSP; -extern const struct LMS7Parameter GFIR3_L_RXTSP; -extern const struct LMS7Parameter GFIR3_N_RXTSP; -extern const struct LMS7Parameter AGC_K_RXTSP; -extern const struct LMS7Parameter AGC_ADESIRED_RXTSP; -extern const struct LMS7Parameter RSSI_MODE; -extern const struct LMS7Parameter AGC_MODE_RXTSP; -extern const struct LMS7Parameter AGC_AVG_RXTSP; -extern const struct LMS7Parameter DC_REG_RXTSP; -extern const struct LMS7Parameter CMIX_GAIN_RXTSP; -extern const struct LMS7Parameter CMIX_SC_RXTSP; -extern const struct LMS7Parameter CMIX_BYP_RXTSP; -extern const struct LMS7Parameter AGC_BYP_RXTSP; -extern const struct LMS7Parameter GFIR3_BYP_RXTSP; -extern const struct LMS7Parameter GFIR2_BYP_RXTSP; -extern const struct LMS7Parameter GFIR1_BYP_RXTSP; -extern const struct LMS7Parameter DC_BYP_RXTSP; -extern const struct LMS7Parameter GC_BYP_RXTSP; -extern const struct LMS7Parameter PH_BYP_RXTSP; -extern const struct LMS7Parameter CAPD; -extern const struct LMS7Parameter DTHBIT_RX; -extern const struct LMS7Parameter SEL_RX; -extern const struct LMS7Parameter MODE_RX; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.cpp deleted file mode 100644 index 4e00854e14..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.cpp +++ /dev/null @@ -1,16 +0,0 @@ -/** -@file LMS7002M_statuses.cpp -@author Lime Microsystems (www.limemicro.com) -*/ - -#include "LMS7002M_statuses.h" - -const char* undefinedStatusStr = "undefined status"; - -const char* liblms7_status2string(liblms7_status status) -{ - if (status >= 0 && status < LIBLMS7_STATUS_COUNT) - return liblms7_status_strings[status]; - else - return undefinedStatusStr; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.h deleted file mode 100644 index 43b736bfd5..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/LMS7002M_statuses.h +++ /dev/null @@ -1,48 +0,0 @@ -/** -@file LMS7002M_statuses.h -@author Lime Microsystems (www.limemicro.com) -@brief LMS7002M control library statuses enumerations -*/ - -#ifndef LMS7API_STATUSES_H -#define LMS7API_STATUSES_H - -const char liblms7_status_strings[][64] = -{ -"success", -"failure", -"index out of range", -"too many values", -"connection manager is NULL", -"port not connected", -"frequency out of range", -"cannot deliver frequency", -"VCO is powered down", -"Bad SEL_PATH_RFE", -"Band not selected", -"file not found", -"file invalid format", -}; - -enum liblms7_status -{ - LIBLMS7_SUCCESS = 0, - LIBLMS7_FAILURE, - LIBLMS7_INDEX_OUT_OF_RANGE, - LIBLMS7_TOO_MANY_VALUES, - LIBLMS7_NO_CONNECTION_MANAGER, - LIBLMS7_NOT_CONNECTED, - LIBLMS7_FREQUENCY_OUT_OF_RANGE, - LIBLMS7_CANNOT_DELIVER_FREQUENCY, - LIBLMS7_VCO_IS_POWERED_DOWN, - LIBLMS7_BAD_SEL_PATH, - LIBLMS7_BAND_NOT_SELECTED, - LIBLMS7_FILE_NOT_FOUND, - LIBLMS7_FILE_INVALID_FORMAT, - - LIBLMS7_STATUS_COUNT -}; - -const char* liblms7_status2string(liblms7_status status); - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.cpp deleted file mode 100644 index 6c7fc0d829..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.cpp +++ /dev/null @@ -1,596 +0,0 @@ -/** - @file ConnectionCOM.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of communications through COM port -*/ - -#include "ConnectionCOM.h" - -#include "string.h" -#ifdef __unix__ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif // LINUX - -const int COM_RETRY_INTERVAL = 20; //ms -const int COM_TOTAL_TIMEOUT = 300; //ms - -/** @brief Initializes com port connection -*/ -ConnectionCOM::ConnectionCOM() -{ - currentDeviceIndex = -1; - connected = false; - comPortList.clear(); - m_deviceNames.clear(); - m_connectionType = COM_PORT; -#ifndef __unix__ - hComm = INVALID_HANDLE_VALUE; -#else - hComm = -1; -#endif - comBaudrate = 9600; -} - -/** @brief When object is destroyed it closes it's opened COM port -*/ -ConnectionCOM::~ConnectionCOM() -{ - Close(); -} - -/** @brief Opens connection to first found chip - @return 0-success -*/ -IConnection::DeviceStatus ConnectionCOM::Open() -{ - comPortList.clear(); - if(comPortList.size() == 0) - FindAllComPorts(); - - m_deviceNames.clear(); - if(m_deviceNames.size() == 0) - RefreshDeviceList(); - - for(unsigned int i=0; i 0 ) - { - comPortName = m_deviceNames[toOpen]; - IConnection::DeviceStatus status = Open(comPortName.c_str(), comBaudrate); - if( status == SUCCESS ) - currentDeviceIndex = toOpen; - return status; - } - return FAILURE; -} - -/** @brief Closes connection to chip -*/ -void ConnectionCOM::Close() -{ - connected = false; - currentDeviceIndex = -1; -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE) - { - SetCommTimeouts(hComm, &m_ctmoOld); - CloseHandle(hComm); - } - hComm = INVALID_HANDLE_VALUE; -#else - if( hComm >= 0) - { - close(hComm); - } - hComm = -1; -#endif -} - -/** @brief Returns whether chip is connected - @return chip is connected -*/ -bool ConnectionCOM::IsOpen() -{ -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE && TestConnectivity() ) - return true; -#else - if( hComm != -1 && TestConnectivity() ) - return true; -#endif - return false; -} - -int ConnectionCOM::GetOpenedIndex() -{ - return currentDeviceIndex; -} - -/** @brief Sends data through COM port - @param buffer data buffer to send - @param length size of data buffer - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes sent -*/ -int ConnectionCOM::Write(const unsigned char *buffer, int length, int timeout_ms) -{ - if(timeout_ms == 0) - { - timeout_ms = COM_TOTAL_TIMEOUT; - } - int retryCount = 0; - const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; - bool status = false; -#ifndef __unix__ - unsigned long bytesWriten = 0; - m_osWOverlap.InternalHigh = 0; - - for(int i = 0; iwrite("COM PORT: error writing data\n", LOG_ERROR); -// if(bytesWriten == 0) -// MessageLog::getInstance()->write("COM PORT: data bytes sent 0\n", LOG_WARNING); - status = false; - } - else - status = true; - ++retryCount; - } -#endif - if(bytesWriten == length) - status = true; - - return bytesWriten; -} - -/** @brief Reads data from COM port - @param buffer pointer to data buffer for receiving - @param length number of bytes to read - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes received -*/ -int ConnectionCOM::Read(unsigned char *buffer, int length, int timeout_ms) -{ - if(timeout_ms == 0) - { - timeout_ms = COM_TOTAL_TIMEOUT; - } - int retryCount = 0; - const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; - bool status = false; - - memset(buffer, 0, length); - long bytesReaded = 0; - unsigned long totalBytesReaded = 0; - char cRawData[COM_BUFFER_LENGTH]; - unsigned long bytesToRead = length; - - memset(cRawData, '\0', sizeof(cRawData[0])*COM_BUFFER_LENGTH); - - for(int i=0; iwrite("COM PORT: error reading data\n", LOG_ERROR); -// if(bytesReaded == 0) -// MessageLog::getInstance()->write("COM PORT: reading 0 bytes\n", LOG_WARNING); - status = false; - } -#endif - retryCount++; - - for(int j=0; jwrite(ss.str(), LOG_DATA); - -// if(retryCount == maxRetries) -// MessageLog::getInstance()->write("COM PORT: read data timeout\n", LOG_WARNING); -// -// if(totalBytesReaded > length) -// MessageLog::getInstance()->write("COM PORT: read data corrupted, received length > requested length\n", LOG_ERROR); - return totalBytesReaded; -} - -/** @brief Searches for available COM ports and adds them to list -*/ -void ConnectionCOM::FindAllComPorts() -{ - Close(); - comPortList.clear(); -#ifndef __unix__ - HKEY hSERIALCOMM; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hSERIALCOMM) == ERROR_SUCCESS) - { - // Get the max value name and max value lengths - DWORD dwMaxValueNameLen; - DWORD dwMaxValueLen; - DWORD dwQueryInfo = RegQueryInfoKey(hSERIALCOMM, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &dwMaxValueNameLen, &dwMaxValueLen, NULL, NULL); - if (dwQueryInfo == ERROR_SUCCESS) - { - DWORD dwMaxValueNameSizeInChars = dwMaxValueNameLen + 1; - // Include space for the NULL terminator - DWORD dwMaxValueNameSizeInBytes = dwMaxValueNameSizeInChars*sizeof(TCHAR); - DWORD dwMaxValueDataSizeInChars = dwMaxValueLen / sizeof(TCHAR) + 1; - // Include space for the NULL terminator - DWORD dwMaxValueDataSizeInBytes = dwMaxValueDataSizeInChars*sizeof(TCHAR); - - // Allocate some space for the value name and value data - TCHAR* szValueName = new TCHAR[dwMaxValueNameSizeInChars]; - TCHAR* byValue = new TCHAR[dwMaxValueDataSizeInBytes]; - if (szValueName && byValue) - { - // Enumerate all the values underneath HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM - DWORD dwIndex = 0; - DWORD dwType; - DWORD dwValueNameSize = dwMaxValueNameSizeInChars; - DWORD dwDataSize = dwMaxValueDataSizeInBytes; - memset(szValueName, 0, dwMaxValueNameSizeInBytes); - memset(byValue, 0, dwMaxValueDataSizeInBytes); - LONG nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); - while (nEnum == ERROR_SUCCESS) - { - // If the value is of the correct type, then add it to the array - if (dwType == REG_SZ) - { - char portname[512]; - TCHAR* szPort = byValue; - int nUserNameLenUnicode = lstrlen( szPort ); // Convert all UNICODE characters - int nUserNameLen = WideCharToMultiByte( CP_ACP, // ANSI Code Page - 0, // No special handling of unmapped chars - (LPCWSTR)szPort, // wide-character string to be converted - nUserNameLenUnicode, - NULL, 0, // No output buffer since we are calculating length - NULL, NULL ); // Unrepresented char replacement - Use Default - TCHAR* pszUserName = new TCHAR[ nUserNameLen ]; // nUserNameLen includes the NULL character - WideCharToMultiByte( CP_ACP, // ANSI Code Page - 0, // No special handling of unmapped chars - (LPCWSTR)szPort, // wide-character string to be converted - nUserNameLenUnicode, - portname, - nUserNameLen, - NULL, NULL ); // Unrepresented char replacement - Use Default - portname[nUserNameLen] = 0; -#ifdef UNICODE - comPortList.push_back(portname); -#else - comPortList.push_back(szPort); -#endif - } - // Prepare for the next time around - dwValueNameSize = dwMaxValueNameSizeInChars; - dwDataSize = dwMaxValueDataSizeInBytes; - memset(szValueName, 0, dwMaxValueNameSizeInBytes); - memset(byValue, 0, dwMaxValueDataSizeInBytes); - ++dwIndex; - nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); - } - } - delete szValueName; - delete byValue; - } - // Close the registry key now that we are finished with it - RegCloseKey(hSERIALCOMM); - - if (dwQueryInfo != ERROR_SUCCESS) - SetLastError(dwQueryInfo); - } -#else - char tempBuffer[256]; - string result = ""; -#warning Currently searching only for ACM connections - system( "ls /dev | grep ttyACM > /tmp/foundSerialPorts.txt"); - - fstream fin; - fin.open("/tmp/foundSerialPorts.txt", ios::in); - while(!fin.eof()) - { - fin.getline(tempBuffer, 256); - result = "/dev/"; - result.append(tempBuffer); - if( strlen(tempBuffer) > 3 ) //longer than tty - comPortList.push_back(result); - } - fin.close(); -#endif -} - -/** @brief Opens COM port - @param comName COM port name - @param baudrate COM port baudrate - @return 0 on success -*/ -IConnection::DeviceStatus ConnectionCOM::Open(const char *comName, int baudrate) -{ - Close(); - if (strlen(comName) == 0) - return FAILURE; - - DeviceStatus errorCode = SUCCESS; - -#ifndef __unix__ - // Initialize Overlap structures - m_osROverlap.Internal = 0; - m_osROverlap.InternalHigh = 0; - m_osROverlap.Offset = 0; - m_osROverlap.OffsetHigh = 0; - m_osROverlap.hEvent = CreateEvent(NULL, false, false, NULL); - - m_osWOverlap.Internal = 0; - m_osWOverlap.InternalHigh = 0; - m_osWOverlap.Offset = 0; - m_osWOverlap.OffsetHigh = 0; - m_osWOverlap.hEvent = CreateEvent(NULL, false, false, NULL); - - // Initialize DSB structure - memset(&m_dcbCommPort, 0, sizeof(m_dcbCommPort)); - - m_dcbCommPort.BaudRate = comBaudrate; - m_dcbCommPort.fBinary = 1; - m_dcbCommPort.fParity = 0; - m_dcbCommPort.fOutxCtsFlow = 0; - m_dcbCommPort.fOutxDsrFlow = 0; - m_dcbCommPort.fDtrControl = 0; - m_dcbCommPort.fDsrSensitivity = 0; - m_dcbCommPort.fTXContinueOnXoff = 0; - m_dcbCommPort.fOutX = 0; - m_dcbCommPort.fInX = 0; - m_dcbCommPort.fErrorChar = 0; - m_dcbCommPort.fNull = 0; - m_dcbCommPort.fRtsControl = 0; - m_dcbCommPort.fAbortOnError = 0; - m_dcbCommPort.fDummy2 = 0; - // m_dcbCommPort.wReserved = 0; - m_dcbCommPort.XonLim = 512; - m_dcbCommPort.XoffLim = 512; - m_dcbCommPort.ByteSize = 8; - m_dcbCommPort.Parity = 0; - m_dcbCommPort.StopBits = 0; - //m_dcbCommPort.StopBits = 1; - m_dcbCommPort.XonChar = 17; - m_dcbCommPort.XoffChar = 19; - m_dcbCommPort.ErrorChar = 0; - m_dcbCommPort.EofChar = 26; - m_dcbCommPort.EvtChar = 0; - m_dcbCommPort.wReserved1 = 0; - m_dcbCommPort.DCBlength = sizeof(DCB); - - // Initialize Timeout's - m_ctmoNew.ReadIntervalTimeout = 50; - m_ctmoNew.ReadTotalTimeoutMultiplier = 0; - m_ctmoNew.ReadTotalTimeoutConstant = 100; // 1; - m_ctmoNew.WriteTotalTimeoutMultiplier = 0; - m_ctmoNew.WriteTotalTimeoutConstant = 100; - - // Open COM port - string stmp; - stmp = "\\\\.\\"; - stmp.append(comName); - hComm = CreateFileA(stmp.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - - if (hComm != INVALID_HANDLE_VALUE) - { - // Set Events - if (!SetCommMask(hComm, 0)) - errorCode = FAILURE; - - // Set Timeouts - GetCommTimeouts(hComm, &m_ctmoOld); - if (!SetCommTimeouts(hComm, &m_ctmoNew)) - errorCode = FAILURE; - - // Set DCB - if (!SetCommState(hComm, &m_dcbCommPort)) - errorCode = FAILURE; - } - else - { - errorCode = FAILURE; - }; - - // Check the results - if (errorCode != 0) - { - //unsigned long err = GetLastError(); - CloseHandle(hComm); - hComm = INVALID_HANDLE_VALUE; - return errorCode; - } - else - { - PurgeComm(hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); - return SUCCESS; - } -#else - hComm = open(comName, O_RDWR | O_NOCTTY | O_SYNC); - if(hComm < 0) - { -// printf("%s",strerror(errno)); -// MessageLog::getInstance()->write("Connection manager: failed opening COM port\n", LOG_ERROR); - return FAILURE; - } - - struct termios tty; - memset(&tty, 0, sizeof(tty)); - if( tcgetattr(hComm, &tty) != 0) - { -// MessageLog::getInstance()->write("Connection Manager: error from tcgetattr\n", LOG_ERROR); - return FAILURE; - } - int speed = B9600; - cfsetospeed(&tty, speed); - cfsetispeed(&tty, speed); - - tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; - tty.c_iflag &= ~IGNBRK; - tty.c_lflag = 0; - tty.c_oflag = 0; - tty.c_cc[VMIN] = 0; // read non blocking - tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout - - tty.c_iflag &= ~(IXON | IXOFF | IXANY); - tty.c_cflag |= (CLOCAL | CREAD); - - if(tcsetattr(hComm, TCSANOW, &tty) != 0) - { -// MessageLog::getInstance()->write("Connection manager: error from tcsetattr\n", LOG_ERROR); - return FAILURE; - } -#endif - return SUCCESS; -} - -/** @brief Checks if chip is connected to currently open port - @return chip is connected -*/ -bool ConnectionCOM::TestConnectivity() -{ -//currently set to always return true to show all com ports - return true; -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE) -#else - if( hComm >= 0) -#endif - { -// unsigned char out[64]; -// unsigned char in[64]; -// memset(in, 0, 64); -// out[0] = CMD_GET_INFO; -// SendData(out, 64); -// ReadData(in, 64); -// if(in[0] == CMD_GET_INFO && in[1] == 0x01) -// return true; -// else -// return false; - } - return false; -} - -/** @brief Finds all chips connected to com ports - @return number of devices found -*/ -int ConnectionCOM::RefreshDeviceList() -{ - int wasOpen = -1; - string wasOpenName = ""; - if(IsOpen()) - { - wasOpen = GetOpenedIndex(); - wasOpenName = comPortName; - } - Close(); - comPortList.clear(); - if(comPortList.size() == 0) - FindAllComPorts(); - - m_deviceNames.clear(); - string comName; - for(unsigned int i=0; i ConnectionCOM::GetDeviceNames() -{ - return m_deviceNames; -} - -/** @brief Purges communication buffers -*/ -void ConnectionCOM::ClearComm() -{ -#ifndef __unix__ - PurgeComm(hComm, PURGE_TXCLEAR|PURGE_RXCLEAR); -#endif -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.h deleted file mode 100644 index 0549472db1..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionCOM.h +++ /dev/null @@ -1,62 +0,0 @@ -/** -@file ConnectionCOM.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data communications through COM port -*/ - -#ifndef CONNECTION_COM_PORT_H -#define CONNECTION_COM_PORT_H - -#ifndef __unix__ - #include "windows.h" -#endif - -#include "IConnection.h" - -class ConnectionCOM : public IConnection -{ -public: - static const int COM_BUFFER_LENGTH = 1024; //max buffer size for data - - ConnectionCOM(); - ~ConnectionCOM(); - - DeviceStatus Open(); - DeviceStatus Open(unsigned i); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - std::vector GetDeviceNames(); - int RefreshDeviceList(); - void ClearComm(); -private: - void FindAllComPorts(); - DeviceStatus Open(const char *comName, int baudrate); - - bool TestConnectivity(); - - std::string comPortName; - int comBaudrate; - bool connected; - - int currentDeviceIndex; - std::vector comPortList; - std::vector m_deviceNames; - -#ifndef __unix__ - HANDLE hComm; - COMMTIMEOUTS m_ctmoNew; - COMMTIMEOUTS m_ctmoOld; - OVERLAPPED m_osROverlap; - OVERLAPPED m_osWOverlap; - DCB m_dcbCommPort; -#else - int hComm; //com port file descriptor -#endif - -}; -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.cpp deleted file mode 100644 index 36f73da5d7..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/** - @file ConnectionManager.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of various connection types to devices -*/ - -#include "ConnectionManager.h" -#include "ConnectionCOM.h" - -#ifdef ENABLE_USB_CONNECTION - #include "ConnectionUSB.h" -#endif -#ifdef ENABLE_SPI_CONNECTION - #include "ConnectionSPI.h" -#endif - -#include -#include -#include - -/** @brief Creates connection interfaces -*/ -ConnectionManager::ConnectionManager() : activeControlPort(NULL) -{ - mLogData = false; - mOpenedDevice = -1; - m_connections[IConnection::COM_PORT] = new ConnectionCOM(); -#ifdef ENABLE_USB_CONNECTION - m_connections[IConnection::USB_PORT] = new ConnectionUSB(); -#endif -#ifdef ENABLE_SPI_CONNECTION - m_connections[IConnection::SPI_PORT] = new ConnectionSPI(); -#endif -} - -/** @brief Destroys connection interfaces -*/ -ConnectionManager::~ConnectionManager() -{ - for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) - { - delete iter->second; - } -} - -/** @brief Checks if connection to device is opened - @return True if device is connected -*/ -bool ConnectionManager::IsOpen() -{ - return activeControlPort ? activeControlPort->IsOpen() : false; -} - -/** @brief Opens connection to first available device - @return True if connected to device -*/ -bool ConnectionManager::Open() -{ - return Open(0); -} - -/** @brief Connects to selected device - @param i device index from device list - @return 1:Success, 0:failure -*/ -int ConnectionManager::Open(unsigned i) -{ - if(i >= mDevices.size()) - return 0; - - if(activeControlPort) - activeControlPort->Close(); - switch(mDevices[i].port) - { - case IConnection::COM_PORT: - activeControlPort = m_connections[IConnection::COM_PORT]; - break; - case IConnection::USB_PORT: - activeControlPort = m_connections[IConnection::USB_PORT]; - break; - case IConnection::SPI_PORT: - activeControlPort = m_connections[IConnection::SPI_PORT]; - break; - default: - return 0; - } - mOpenedDevice = -1; - if( i < mDevices.size() ) - { - if( activeControlPort->Open(mDevices[i].portIndex) ) - { - mOpenedDevice = i; - return 1; - } - } - return 0; -} - -/** @brief Closes connection to device -*/ -void ConnectionManager::Close() -{ - if(activeControlPort) - { - activeControlPort->Close(); - //Notify(LMS_Message(MSG_BOARD_DISCONNECTED, "", 0, 0)); - } - mOpenedDevice = -1; -} - -/** @brief Finds all currently connected devices and forms device list - @return number of devices found -*/ -int ConnectionManager::RefreshDeviceList() -{ - mDeviceList.clear(); - mDevices.clear(); - DeviceInfo dev; - for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) - { - vector names; - IConnection *port = iter->second; - if(port->RefreshDeviceList() > 0) - { - names = port->GetDeviceNames(); - for(unsigned i=0; ifirst; - dev.portIndex = i; - mDevices.push_back(dev); - } - } - } - for(unsigned i=0; iWrite(buffer, length, timeout_ms); -#ifndef NDEBUG - if(mLogData) - { - stringstream ss; - ss << "WR(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; - ss << std::hex << std::setfill('0'); - int repeatedZeros = 0; - for(int i=length-1; i>=0; --i) - if(buffer[i] == 0) - ++repeatedZeros; - else break; - if(repeatedZeros == 1) - repeatedZeros = 0; - repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); - for(int i=0; i 1) - ss << " (00 x " << std::dec << repeatedZeros << " times)"; - cout << ss.str() << endl; - } -#endif - return bytesTransferred; - } - return -1; -} - -/** @brief Receives data from currently opened connection - @param buffer incomming data buffer, must be big enough for length bytes - @param length bytes to read - @param timeout_ms timeout in milliseconds - @return number of bytes received -*/ -int ConnectionManager::Read(unsigned char *buffer, int length, int timeout_ms) -{ - if(activeControlPort) - { - int bytesTransferred = activeControlPort->Read(buffer, length, timeout_ms); -#ifndef NDEBUG - if(mLogData) - { - stringstream ss; - ss << "RD(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; - ss << std::hex << std::setfill('0'); - int repeatedZeros = 0; - for(int i=length-1; i>=0; --i) - if(buffer[i] == 0) - ++repeatedZeros; - else break; - if(repeatedZeros == 2) - repeatedZeros = 0; - repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); - for(int i=0; i 2) - ss << " (00 x " << std::dec << repeatedZeros << " times)"; - cout << ss.str() << endl; - } -#endif - return bytesTransferred; - } - return -1; -} - -int ConnectionManager::WriteStream(const char *buffer, int length) -{ - return 0; -} - -int ConnectionManager::ReadStream(char *buffer, int length, unsigned int timeout_ms) -{ - /*int handle = activeControlPort->BeginDataReading(buffer, length); - activeControlPort->WaitForReading(handle, timeout_ms); - long received = length; - activeControlPort->FinishDataReading(buffer, received, handle); - return received; - */ - long len = length; - int status = activeControlPort->ReadDataBlocking(buffer, len, 0); - return len; -} - - -int ConnectionManager::BeginDataReading(char *buffer, long length) -{ - return activeControlPort->BeginDataReading(buffer, length); -} -/** -@brief Blocks until data is received or set number of milliseconds have passed. -@param contextHandle handle returned by BeginDataReading() -@param timeout_ms number of milliseconds to wait -@return 1-data received, 0-data not received -*/ -int ConnectionManager::WaitForReading(int contextHandle, unsigned int timeout_ms) -{ - return activeControlPort->WaitForReading(contextHandle, timeout_ms); -} -/** -@brief Finished asynchronous data reading. -@param buffer where to put received data -@param length number of bytes to read, will be changed to actual number of bytes received -@param contextHandle context handle returned by BeginDataReading() -@return received data length -*/ -int ConnectionManager::FinishDataReading(char *buffer, long &length, int contextHandle) -{ - return activeControlPort->FinishDataReading(buffer, length, contextHandle); -} - -/** -@brief Aborts reading operations -*/ -void ConnectionManager::AbortReading() -{ - activeControlPort->AbortReading(); -} - -/** -@brief Start asynchronous data sending. -@param buffer data buffer to be sent -@param length number of bytes to send. -@return context handle -*/ -int ConnectionManager::BeginDataSending(const char *buffer, long length) -{ - return activeControlPort->BeginDataSending(buffer, length); -} -/** -@brief Blocks until data is sent or set number of miliseconds have passed. -@param contextHandle handle returned by BeginDataReading() -@param timeout_ms number of miliseconds to wait -@return 1-data sent, 0-data not sent -*/ -int ConnectionManager::WaitForSending(int contextHandle, unsigned int timeout_ms) -{ - return activeControlPort->WaitForSending(contextHandle, timeout_ms); -} -/** -@brief Finished asynchronous data sending. -@param buffer where to put received data -@param length number of bytes to send, will be changed to actual number of bytes sent -@param contextHandle context handle returned by BeginDataReading() -@return sent data length -*/ -int ConnectionManager::FinishDataSending(const char *buffer, long &length, int contextHandle) -{ - return activeControlPort->FinishDataSending(buffer, length, contextHandle); -} - -/** -@brief Aborts sending operations -*/ -void ConnectionManager::AbortSending() -{ - activeControlPort->AbortSending(); -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.h deleted file mode 100644 index edd01d3833..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionManager.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - @file ConnectionManager.h - @author Lime Microsystems (www.limemicro.com) - @brief Class for managing connection to devices -*/ - -#ifndef LMS_CONNECTION_MANAGER_H -#define LMS_CONNECTION_MANAGER_H - -#include "IConnection.h" -#include - -class ConnectionManager -{ -public: - struct DeviceInfo - { - std::string name; - IConnection::eConnectionType port; - int portIndex; - }; - - ConnectionManager(); - ~ConnectionManager(); - bool IsOpen(); - bool Open(); - int Open(unsigned i); - void Close(); - int RefreshDeviceList(); - int GetOpenedIndex(); - std::vector GetDeviceList(){return mDeviceList;}; - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - int WriteStream(const char *buffer, int length); - int ReadStream(char *buffer, int length, unsigned int timeout_ms); - - int BeginDataReading(char *buffer, long length); - int WaitForReading(int contextHandle, unsigned int timeout_ms); - int FinishDataReading(char *buffer, long &length, int contextHandle); - void AbortReading(); - - int BeginDataSending(const char *buffer, long length); - int WaitForSending(int contextHandle, unsigned int timeout_ms); - int FinishDataSending(const char *buffer, long &length, int contextHandle); - void AbortSending(); - -protected: - bool mLogData; - /// Port used for communication. - IConnection *activeControlPort; - std::vector mDevices; - std::vector mDeviceList; - int mOpenedDevice; - std::map m_connections; -}; - -#endif // LMS_CONNECTION_MANAGER_H - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.cpp deleted file mode 100644 index e490db4dab..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/** - @file ConnectionSPI.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of communications through SPI port -*/ - -#include "ConnectionSPI.h" - -#include "string.h" -#ifdef __unix__ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif // LINUX - -#include -#include - -const int ConnectionSPI::cSPI_BUF_SIZE = 128; -const int ConnectionSPI::cSPI_SPEED_HZ = 2000000; - -/** @brief Tries to read EEPROM for Novena board signature - @return true if Novena board -*/ -bool IsNovenaBoard() -{ -#ifdef __unix__ - char data[8]; - int count = 6; - memset(data, 0, 8); - int addr = 0; - struct i2c_rdwr_ioctl_data session; - struct i2c_msg messages[2]; - char set_addr_buf[2]; - memset(set_addr_buf, 0, sizeof(set_addr_buf)); - memset(data, 0, count); - set_addr_buf[0] = addr>>8; - set_addr_buf[1] = addr; - messages[0].addr = 0xac>>1; - messages[0].flags = 0; - messages[0].len = sizeof(set_addr_buf); - messages[0].buf = set_addr_buf; - messages[1].addr = 0xac>>1; - messages[1].flags = I2C_M_RD; - messages[1].len = count; - messages[1].buf = data; - session.msgs = messages; - session.nmsgs = 2; - - bool isNovena = false; - - int fd = open("/dev/i2c-2", O_RDWR); - if(fd > 0) - { - if(ioctl(fd, I2C_RDWR, &session) < 0) - { - perror("Unable to communicate with i2c device"); - isNovena = false; - } - if(strcmp("Novena", data) == 0) - isNovena = true; - } - close(fd); - return isNovena; -#else - return false; -#endif -} - -/** @brief Initializes SPI port and exports needed GPIO -*/ -ConnectionSPI::ConnectionSPI() -{ - fd = -1; - m_connectionType = SPI_PORT; - std::fstream gpio; - //export SEN pin - gpio.open("/sys/class/gpio/export", ios::out); - if(gpio.good()) - { - gpio << 122; - gpio.flush(); - gpio.close(); - gpio.open("/sys/class/gpio/gpio122/direction", ios::out); - gpio << "out"; - gpio.flush(); - gpio.close(); - m_SEN.open("/sys/class/gpio/gpio122/value", ios::out); - m_SEN<< 1; - m_SEN.flush(); - cout << "GPIO122: set to 1" << endl; - } -} - -ConnectionSPI::~ConnectionSPI() -{ - Close(); - m_SEN.close(); -} - -/** @brief Opens connection to first found chip - @return 0-success -*/ -IConnection::DeviceStatus ConnectionSPI::Open() -{ - Close(); -#ifdef __unix__ - fd = open("/dev/spidev2.0", O_RDWR | O_SYNC); - if (fd < 0) - { - //MessageLog::getInstance()->write("SPI PORT: device not found\n", LOG_ERROR); - return IConnection::FAILURE; - } - int mode = SPI_MODE_0; - int ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); - if (ret == -1) - printf("can't set spi mode"); - - ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); - if (ret == -1) - printf("can't get spi mode"); - - /* - * bits per word - */ - int bits = 8; - ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); - if (ret == -1) - printf("can't set bits per word"); - - ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); - if (ret == -1) - printf("can't get bits per word"); - - /* - * max speed hz - */ - int speed = cSPI_SPEED_HZ; - ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); - if (ret == -1) - printf("can't set max speed hz"); - - ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); - if (ret == -1) - printf("can't get max speed hz"); - - printf("spi mode: 0x%x\n", mode); - printf("bits per word: %d\n", bits); - printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); - return IConnection::SUCCESS; -#else - return IConnection::FAILURE; -#endif -} - -/** @brief Opens connection to selected chip - @param index chip index in device list - @return 0-success -*/ -IConnection::DeviceStatus ConnectionSPI::Open(unsigned index) -{ - return Open(); -} - -/** @brief Closes connection to chip -*/ -void ConnectionSPI::Close() -{ -#ifdef __unix__ - close(fd); - fd = -1; -#endif -} - -/** @brief Returns whether chip is connected - @return chip is connected -*/ -bool ConnectionSPI::IsOpen() -{ - return (fd >= 0); -} - -/** @brief Sends data through SPI port - @param buffer data buffer to send - @param length size of data buffer - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes sent -*/ -int ConnectionSPI::Write(const unsigned char *buffer, int length, int timeout_ms) -{ - #ifdef __unix__ - if(fd < 0) - return 0; - m_SEN << 0; - m_SEN.flush(); - unsigned long bytesWritten = 0; - rxbuf.clear(); - int bytesReceived = 0; - char rxbytes[2]; - while(bytesWritten < length) - { - int toWrite = length-bytesWritten > cSPI_BUF_SIZE ? cSPI_BUF_SIZE : length-bytesWritten; - for(int i=0; i rxbuf.size() ? rxbuf.size() : length; - memcpy(buffer, &rxbuf[0], tocpy); - rxbuf.clear(); - return tocpy; -#else - return 0; -#endif -} - -/** @brief Finds SPI port - @return number of devices found -*/ -int ConnectionSPI::RefreshDeviceList() -{ - m_deviceNames.clear(); -#ifdef __unix__ - int spidev = open("/dev/spidev2.0", O_RDWR); - if (spidev >= 0) - { - if(IsNovenaBoard() == true) - m_deviceNames.push_back("SPI (Novena)"); - else - m_deviceNames.push_back("SPI"); - } - close(spidev); -#endif - return m_deviceNames.size(); -} - -/** @brief Returns found devices names - @return vector of device names -*/ -vector ConnectionSPI::GetDeviceNames() -{ - return m_deviceNames; -} - -int ConnectionSPI::GetOpenedIndex() -{ - return 0; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.h deleted file mode 100644 index 79d9bd9b9b..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionSPI.h +++ /dev/null @@ -1,41 +0,0 @@ -/** -@file ConnectionSPI.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data communications through SPI port -*/ - -#ifndef CONNECTION_SPI_PORT_H -#define CONNECTION_SPI_PORT_H - -#include "IConnection.h" -#include -#include -#include - -class ConnectionSPI : public IConnection -{ -public: - static const int cSPI_BUF_SIZE; - static const int cSPI_SPEED_HZ; - - ConnectionSPI(); - ~ConnectionSPI(); - - DeviceStatus Open(); - DeviceStatus Open(unsigned i); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - std::vector GetDeviceNames(); - int RefreshDeviceList(); -protected: - std::vector m_deviceNames; - std::vector rxbuf; - int fd; - std::fstream m_SEN; -}; -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.cpp deleted file mode 100644 index b99fe6490b..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.cpp +++ /dev/null @@ -1,762 +0,0 @@ -/** -@file ConnectionUSB.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Data writing and reading through USB port -*/ - -#include "ConnectionUSB.h" -#include - -#ifdef __unix__ - #include - #include -#endif - -#define USB_TIMEOUT 1000 - -#define HW_LDIGIRED L"DigiRed" -#define HW_LDIGIGREEN L"DigiGreen" -#define HW_LSTREAMER L"Stream" - -#define HW_DIGIRED "DigiRed" -#define HW_DIGIGREEN "DigiGreen" -#define HW_STREAMER "Stream" - -#define CTR_W_REQCODE 0xC1 -#define CTR_W_VALUE 0x0000 -#define CTR_W_INDEX 0x0000 - -#define CTR_R_REQCODE 0xC0 -#define CTR_R_VALUE 0x0000 -#define CTR_R_INDEX 0x0000 - -/** @brief Initializes port type and object necessary to communicate to usb device. -*/ -ConnectionUSB::ConnectionUSB() -{ - m_hardwareName = ""; - isConnected = false; - m_connectionType = USB_PORT; -#ifndef __unix__ - USBDevicePrimary = new CCyUSBDevice(NULL); - OutCtrEndPt = NULL; - InCtrEndPt = NULL; - InCtrlEndPt3 = NULL; - OutCtrlEndPt3 = NULL; -#else - dev_handle = 0; - devs = 0; - int r = libusb_init(&ctx); //initialize the library for the session we just declared - if(r < 0) - printf("Init Error %i\n", r); //there was an error - libusb_set_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation -#endif - currentDeviceIndex = -1; -} - -/** @brief Closes connection to chip and deallocates used memory. -*/ -ConnectionUSB::~ConnectionUSB() -{ - Close(); -#ifndef __unix__ - delete USBDevicePrimary; -#else - libusb_exit(ctx); -#endif -} - -/** @brief Automatically open first available chip connected to usb port. - @return 0-success, other-failure -*/ -IConnection::DeviceStatus ConnectionUSB::Open() -{ - currentDeviceIndex = -1; - if(m_deviceNames.size() == 0) - RefreshDeviceList(); - -#ifndef __unix__ - for(int i=0; iDeviceCount(); ++i) - if( Open(i) == SUCCESS) - { - currentDeviceIndex = i; - return SUCCESS; - } -#else - if(Open(0) == SUCCESS) - return SUCCESS; -#endif - return FAILURE; -} - -/** @brief Tries to open connected USB device and find communication endpoints. - @return Returns 1-Success, 0-EndPoints not found or device didn't connect. -*/ -IConnection::DeviceStatus ConnectionUSB::Open(unsigned index) -{ -#ifndef __unix__ - wstring m_hardwareDesc = L""; - if( index < USBDevicePrimary->DeviceCount()) - { - if(USBDevicePrimary->Open(index)) - { - m_hardwareDesc = USBDevicePrimary->Product; - unsigned int pos; - //determine connected board type - pos = m_hardwareDesc.find(HW_LDIGIRED, 0); - if( pos != wstring::npos ) - m_hardwareName = HW_DIGIRED; - else if (m_hardwareDesc.find(HW_LSTREAMER, 0) != wstring::npos) - m_hardwareName = HW_STREAMER; - else - m_hardwareName = HW_STREAMER; - - - if (InCtrlEndPt3) - { - delete InCtrlEndPt3; - InCtrlEndPt3 = NULL; - } - InCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); - - if (OutCtrlEndPt3) - { - delete OutCtrlEndPt3; - OutCtrlEndPt3 = NULL; - } - OutCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); - - InCtrlEndPt3->ReqCode = CTR_R_REQCODE; - InCtrlEndPt3->Value = CTR_R_VALUE; - InCtrlEndPt3->Index = CTR_R_INDEX; - - OutCtrlEndPt3->ReqCode = CTR_W_REQCODE; - OutCtrlEndPt3->Value = CTR_W_VALUE; - OutCtrlEndPt3->Index = CTR_W_INDEX; - - for (int i=0; iEndPointCount(); i++) - if(USBDevicePrimary->EndPoints[i]->Address == 0x01) - { - OutEndPt = USBDevicePrimary->EndPoints[i]; - long len = OutEndPt->MaxPktSize * 64; - OutEndPt->SetXferSize(len); - break; - } - for (int i=0; iEndPointCount(); i++) - if(USBDevicePrimary->EndPoints[i]->Address == 0x81) - { - InEndPt = USBDevicePrimary->EndPoints[i]; - long len = InEndPt->MaxPktSize * 64; - InEndPt->SetXferSize(len); - break; - } - isConnected = true; - return SUCCESS; - } //successfully opened device - } //if has devices - return FAILURE; -#else - if(index >= 0 && index < m_dev_pid_vid.size()) - { - dev_handle = libusb_open_device_with_vid_pid(ctx, m_dev_pid_vid[index].second, m_dev_pid_vid[index].first); - - if(dev_handle == 0) - return FAILURE; - if(libusb_kernel_driver_active(dev_handle, 0) == 1) //find out if kernel driver is attached - { - printf("Kernel Driver Active\n"); - if(libusb_detach_kernel_driver(dev_handle, 0) == 0) //detach it - printf("Kernel Driver Detached!\n"); - } - int r = libusb_claim_interface(dev_handle, 0); //claim interface 0 (the first) of device - if(r < 0) - { - printf("Cannot Claim Interface\n"); - return CANNOT_CLAIM_INTERFACE; - } - printf("Claimed Interface\n"); - isConnected = true; - return SUCCESS; - } - else - { - return FAILURE; - } -#endif -} - -/** @brief Closes communication to device. -*/ -void ConnectionUSB::Close() -{ - #ifndef __unix__ - USBDevicePrimary->Close(); - InEndPt = NULL; - OutEndPt = NULL; - if (InCtrlEndPt3) - { - delete InCtrlEndPt3; - InCtrlEndPt3 = NULL; - } - if (OutCtrlEndPt3) - { - delete OutCtrlEndPt3; - OutCtrlEndPt3 = NULL; - } - #else - if(dev_handle != 0) - { - libusb_release_interface(dev_handle, 0); - libusb_close(dev_handle); - dev_handle = 0; - } - #endif - isConnected = false; -} - -/** @brief Returns connection status - @return 1-connection open, 0-connection closed. -*/ -bool ConnectionUSB::IsOpen() -{ - #ifndef __unix__ - return USBDevicePrimary->IsOpen() && isConnected; - #else - return isConnected; - #endif -} - -/** @brief Sends given data buffer to chip through USB port. - @param buffer data buffer, must not be longer than 64 bytes. - @param length given buffer size. - @param timeout_ms timeout limit for operation in milliseconds - @return number of bytes sent. -*/ -int ConnectionUSB::Write(const unsigned char *buffer, const int length, int timeout_ms) -{ - long len = length; - if(IsOpen()) - { - unsigned char* wbuffer = new unsigned char[length]; - memcpy(wbuffer, buffer, length); - if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) - { - #ifndef __unix__ - if(OutCtrlEndPt3) - OutCtrlEndPt3->Write(wbuffer, len); - else - len = 0; - #else - len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR,CTR_W_REQCODE ,CTR_W_VALUE, CTR_W_INDEX, wbuffer, length, USB_TIMEOUT); - #endif - } - else - { - #ifndef __unix__ - if(OutCtrEndPt) - OutCtrEndPt->XferData(wbuffer, len); - else - len = 0; - #else - int actual = 0; - libusb_bulk_transfer(dev_handle, 0x01, wbuffer, len, &actual, USB_TIMEOUT); - len = actual; - #endif - } - delete wbuffer; - } - else - return 0; - return len; -} - -/** @brief Reads data coming from the chip through USB port. - @param buffer pointer to array where received data will be copied, array must be - big enough to fit received data. - @param length number of bytes to read from chip. - @param timeout_ms timeout limit for operation in milliseconds - @return number of bytes received. -*/ -int ConnectionUSB::Read(unsigned char *buffer, const int length, int timeout_ms) -{ - long len = length; - if(IsOpen()) - { - if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) - { - #ifndef __unix__ - if(InCtrlEndPt3) - InCtrlEndPt3->Read(buffer, len); - else - len = 0; - #else - len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN ,CTR_R_REQCODE ,CTR_R_VALUE, CTR_R_INDEX, buffer, len, USB_TIMEOUT); - #endif - } - else - { - #ifndef __unix__ - if(InCtrEndPt) - InCtrEndPt->XferData(buffer, len); - else - len = 0; - #else - int actual = 0; - libusb_bulk_transfer(dev_handle, 0x81, buffer, len, &actual, USB_TIMEOUT); - len = actual; - #endif - } - } - return len; -} - -#ifdef __unix__ -/** @brief Function for handling libusb callbacks -*/ -void callback_libusbtransfer(libusb_transfer *trans) -{ - USBTransferContext *context = reinterpret_cast(trans->user_data); - switch(trans->status) - { - case LIBUSB_TRANSFER_CANCELLED: - printf("Transfer canceled\n" ); - context->bytesXfered = trans->actual_length; - context->done = true; - context->used = false; - context->reset(); - break; - case LIBUSB_TRANSFER_COMPLETED: - if(trans->actual_length == context->bytesExpected) - { - context->bytesXfered = trans->actual_length; - context->done = true; - } - //printf("Transfer complete %i\n", trans->actual_length); - break; - case LIBUSB_TRANSFER_ERROR: - printf("TRANSFER ERRRO\n"); - break; - case LIBUSB_TRANSFER_TIMED_OUT: - printf("transfer timed out\n"); - - break; - case LIBUSB_TRANSFER_OVERFLOW: - printf("transfer overflow\n"); - - break; - case LIBUSB_TRANSFER_STALL: - printf("transfer stalled\n"); - break; - } - context->mPacketProcessed.notify_one(); -} -#endif - -/** @brief Finds all chips connected to usb ports - @return number of devices found -*/ -int ConnectionUSB::RefreshDeviceList() -{ - #ifndef __unix__ - USBDevicePrimary->Close(); - currentDeviceIndex = -1; - m_deviceNames.clear(); - string name; - if (USBDevicePrimary->DeviceCount()) - { - for (int i=0; iDeviceCount(); ++i) - { - Open(i); - name = DeviceName(); - m_deviceNames.push_back(name); - } - currentDeviceIndex = -1; - } - #else - m_dev_pid_vid.clear(); - m_deviceNames.clear(); - int usbDeviceCount = libusb_get_device_list(ctx, &devs); - if(usbDeviceCount > 0) - { - libusb_device_descriptor desc; - for(int i=0; i(pid,vid)); - } - else if(pid == 241) - { - m_hardwareName = HW_DIGIRED; - libusb_device_handle *tempDev_handle; - tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid); - if(libusb_kernel_driver_active(tempDev_handle, 0) == 1) //find out if kernel driver is attached - { - if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it - printf("Kernel Driver Detached!\n"); - } - if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device - { - printf("Cannot Claim Interface\n"); - } - - string fullName; - //check operating speed - int speed = libusb_get_device_speed(devs[i]); - if(speed == LIBUSB_SPEED_HIGH) - fullName = "USB 2.0"; - else if(speed == LIBUSB_SPEED_SUPER) - fullName = "USB 3.0"; - else - fullName = "USB"; - fullName += " ("; - //read device name - char data[255]; - memset(data, 0, 255); - int st = libusb_get_string_descriptor_ascii(tempDev_handle, 2, (unsigned char*)data, 255); - if(strlen(data) > 0) - fullName += data; - fullName += ")"; - libusb_close(tempDev_handle); - - m_deviceNames.push_back(fullName); - m_dev_pid_vid.push_back( pair(pid,vid)); - } - } - } - } - else - { - libusb_free_device_list(devs, 1); - return 0; - } - #endif - return m_deviceNames.size(); -} - -void ConnectionUSB::ClearComm() -{ -} - -/** @return name of currently opened device as string. -*/ -string ConnectionUSB::DeviceName() -{ -#ifndef __unix__ - string name; - char tempName[USB_STRING_MAXLEN]; - //memcpy(tempName, USBDevicePrimary->FriendlyName, USB_STRING_MAXLEN); - //name = tempName; - - for (int i = 0; i < USB_STRING_MAXLEN; ++i) - tempName[i] = USBDevicePrimary->DeviceName[i]; - if (USBDevicePrimary->bSuperSpeed == true) - name = "USB 3.0"; - else if (USBDevicePrimary->bHighSpeed == true) - name = "USB 2.0"; - else - name = "USB"; - name += " ("; - name += tempName; - name += ")"; - return name; -#else - if(dev_handle != 0) - { - char data[255]; - int st = libusb_get_string_descriptor_ascii(dev_handle, 2, (unsigned char*)data, 255); - return string(data); - } - return "no name"; -#endif -} - -/** - @brief Starts asynchronous data reading from board - @param *buffer buffer where to store received data - @param length number of bytes to read - @return handle of transfer context -*/ -int ConnectionUSB::BeginDataReading(char *buffer, long length) -{ - int i = 0; - bool contextFound = false; - //find not used context - for(i = 0; iBeginDataXfer((unsigned char*)buffer, length, contexts[i].inOvLap); - return i; - #else - unsigned int Timeout = 1000; - libusb_transfer *tr = contexts[i].transfer; - libusb_fill_bulk_transfer(tr, dev_handle, 0x81, (unsigned char*)buffer, length, callback_libusbtransfer, &contexts[i], Timeout); - contexts[i].done = false; - contexts[i].bytesXfered = 0; - contexts[i].bytesExpected = length; - int status = libusb_submit_transfer(tr); - int actual = 0; - //int status = libusb_bulk_transfer(dev_handle, 0x81, (unsigned char*)buffer, length, &actual, USB_TIMEOUT); - if(status != 0) - printf("ERROR BEGIN DATA TRANSFER %s\n", libusb_error_name(status)); - #endif - return i; -} - -/** - @brief Waits for asynchronous data reception - @param contextHandle handle of which context data to wait - @param timeout_ms number of miliseconds to wait - @return 1-data received, 0-data not received -*/ -int ConnectionUSB::WaitForReading(int contextHandle, unsigned int timeout_ms) -{ - if( contexts[contextHandle].used == true && contextHandle >= 0) - { - int status = 0; - #ifndef __unix__ - if(InEndPt) - status = InEndPt->WaitForXfer(contexts[contextHandle].inOvLap, timeout_ms); - return status; - #else - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - while(contexts[contextHandle].done == false && std::chrono::duration_cast(t2 - t1).count() < timeout_ms) - { - struct timeval tv; - tv.tv_sec = 1; - tv.tv_usec = 0; - //if(libusb_handle_events(ctx) != 0) - if(libusb_handle_events_timeout_completed(ctx, &tv, NULL) != 0) - printf("error libusb_handle_events %i\n", status); - t2 = chrono::high_resolution_clock::now(); - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - std::unique_lock lck(contexts[contextHandle].m_lock); - while(contexts[contextHandle].done == false) //is changed in libusb callback - { - if(contexts[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return 0; - } - return contexts[contextHandle].done == true; - #endif - } - else - return 0; -} - -/** - @brief Finishes asynchronous data reading from board - @param buffer array where to store received data - @param length number of bytes to read, function changes this value to number of bytes actually received - @param contextHandle handle of which context to finish - @return false failure, true number of bytes received -*/ -int ConnectionUSB::FinishDataReading(char *buffer, long &length, int contextHandle) -{ - if( contexts[contextHandle].used == true && contextHandle >= 0) - { - #ifndef __unix__ - int status = 0; - if(InEndPt) - status = InEndPt->FinishDataXfer((unsigned char*)buffer, length, contexts[contextHandle].inOvLap, contexts[contextHandle].context); - contexts[contextHandle].used = false; - contexts[contextHandle].reset(); - return length; - #else - length = contexts[contextHandle].bytesXfered; - contexts[contextHandle].used = false; - contexts[contextHandle].reset(); - return length; - #endif - } - else - return 0; -} - -int ConnectionUSB::ReadDataBlocking(char *buffer, long &length, int timeout_ms) -{ -#ifndef __unix__ - return InEndPt->XferData((unsigned char*)buffer, length); -#else - return 0; -#endif -} - - -/** - @brief Aborts reading operations -*/ -void ConnectionUSB::AbortReading() -{ -#ifndef __unix__ - InEndPt->Abort(); -#else - for(int i=0; iBeginDataXfer((unsigned char*)buffer, length, contextsToSend[i].inOvLap); - return i; - #else - unsigned int Timeout = 1000; - libusb_transfer *tr = contextsToSend[i].transfer; - //libusb_set_iso_packet_lengths(contexts[i].transfer, 512*64); - libusb_fill_bulk_transfer(tr, dev_handle, 0x1, (unsigned char*)buffer, length, callback_libusbtransfer, &contextsToSend[i], Timeout); - contextsToSend[i].done = false; - contextsToSend[i].bytesXfered = 0; - contextsToSend[i].bytesExpected = length; - libusb_submit_transfer(tr); - #endif - return i; -} - -/** - @brief Waits for asynchronous data sending - @param contextHandle handle of which context data to wait - @param timeout_ms number of miliseconds to wait - @return 1-data received, 0-data not received -*/ -int ConnectionUSB::WaitForSending(int contextHandle, unsigned int timeout_ms) -{ - if( contextsToSend[contextHandle].used == true ) - { - #ifndef __unix__ - int status = 0; - if(OutEndPt) - status = OutEndPt->WaitForXfer(contextsToSend[contextHandle].inOvLap, timeout_ms); - return status; - #else - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - while(contextsToSend[contextHandle].done == false && std::chrono::duration_cast(t2 - t1).count() < timeout_ms) - { - struct timeval tv; - tv.tv_sec = 1; - tv.tv_usec = 0; - int status = libusb_handle_events_timeout_completed(ctx, &tv, NULL); - if(status != 0) - printf("error libusb_handle_events %i\n", status); - t2 = chrono::high_resolution_clock::now(); - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - std::unique_lock lck(contextsToSend[contextHandle].m_lock); - while(contextsToSend[contextHandle].done == false) //is changed in libusb callback - { - if(contextsToSend[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return 0; - } - return contextsToSend[contextHandle].done == true; - #endif - } - else - return 0; -} - -/** - @brief Finishes asynchronous data sending to board - @param buffer array where to store received data - @param length number of bytes to read, function changes this value to number of bytes acctually received - @param contextHandle handle of which context to finish - @return false failure, true number of bytes sent -*/ -int ConnectionUSB::FinishDataSending(const char *buffer, long &length, int contextHandle) -{ - if( contextsToSend[contextHandle].used == true) - { - #ifndef __unix__ - if(OutEndPt) - OutEndPt->FinishDataXfer((unsigned char*)buffer, length, contextsToSend[contextHandle].inOvLap, contextsToSend[contextHandle].context); - contextsToSend[contextHandle].used = false; - contextsToSend[contextHandle].reset(); - return length; - #else - length = contextsToSend[contextHandle].bytesXfered; - contextsToSend[contextHandle].used = false; - contextsToSend[contextHandle].reset(); - return length; - #endif - } - else - return 0; -} - -/** - @brief Aborts sending operations -*/ -void ConnectionUSB::AbortSending() -{ -#ifndef __unix__ - OutEndPt->Abort(); -#else - for (int i = 0; i ConnectionUSB::GetDeviceNames() -{ - return m_deviceNames; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.h deleted file mode 100644 index f3048c1842..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/ConnectionUSB.h +++ /dev/null @@ -1,144 +0,0 @@ -/** -@file ConnectionUSB.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data writing and reading through USB port -*/ - -#ifndef USB_PORT_CONNECTION_H -#define USB_PORT_CONNECTION_H - -#include "IConnection.h" - -#ifndef __unix__ -#include "windows.h" -#include "CyAPI.h" -#else -#include -#include -#include -#include -#endif - -#define USB_MAX_CONTEXTS 64 //maximum number of contexts for asynchronous transfers - -/** @brief Wrapper class for holding USB asynchronous transfers contexts -*/ -class USBTransferContext -{ -public: - USBTransferContext() : used(false) - { - #ifndef __unix__ - inOvLap = new OVERLAPPED; - memset(inOvLap, 0, sizeof(OVERLAPPED)); - inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); - context = NULL; - #else - transfer = libusb_alloc_transfer(0); - bytesXfered = 0; - bytesExpected = 0; - done = 0; - #endif - } - ~USBTransferContext() - { - #ifndef __unix__ - CloseHandle(inOvLap->hEvent); - delete inOvLap; - #else - libusb_free_transfer(transfer); - #endif - } - bool reset() - { - if(used) - return false; - #ifndef __unix__ - CloseHandle(inOvLap->hEvent); - memset(inOvLap, 0, sizeof(OVERLAPPED)); - inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); - #endif - return true; - } - bool used; - #ifndef __unix__ - PUCHAR context; - OVERLAPPED *inOvLap; - #else - libusb_transfer* transfer; - long bytesXfered; - long bytesExpected; - bool done; - std::mutex m_lock; - std::condition_variable mPacketProcessed; - #endif -}; - -class ConnectionUSB : public IConnection -{ -public: - ConnectionUSB(); - ~ConnectionUSB(); - - void FindDevices(); - DeviceStatus Open(); - DeviceStatus Open(unsigned index); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - virtual int BeginDataReading(char *buffer, long length); - virtual int WaitForReading(int contextHandle, unsigned int timeout_ms); - virtual int FinishDataReading(char *buffer, long &length, int contextHandle); - virtual void AbortReading(); - virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms); - - virtual int BeginDataSending(const char *buffer, long length); - virtual int WaitForSending(int contextHandle, unsigned int timeout_ms); - virtual int FinishDataSending(const char *buffer, long &length, int contextHandle); - virtual void AbortSending(); - - std::vector GetDeviceNames(); - int RefreshDeviceList(); - void ClearComm(); -private: - int currentDeviceIndex; - std::string DeviceName(); - - std::vector m_deviceNames; - std::string m_hardwareName; - int m_hardwareVer; - - USBTransferContext contexts[USB_MAX_CONTEXTS]; - USBTransferContext contextsToSend[USB_MAX_CONTEXTS]; - void Initialize(); - - bool isConnected; - int currentPortIndex; - - #ifndef __unix__ - CCyUSBDevice *USBDevicePrimary; - //control endpoints for DigiRed - CCyControlEndPoint *InCtrlEndPt3; - CCyControlEndPoint *OutCtrlEndPt3; - - //control endpoints for DigiGreen - CCyUSBEndPoint *OutCtrEndPt; - CCyUSBEndPoint *InCtrEndPt; - - //end points for samples reading and writing - CCyUSBEndPoint *InEndPt; - CCyUSBEndPoint *OutEndPt; - - #else - libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices - libusb_device_handle *dev_handle; //a device handle - libusb_context *ctx; //a libusb session - std::vector > m_dev_pid_vid; - #endif -}; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/IConnection.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/IConnection.h deleted file mode 100644 index 5804f1149f..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/connectionManager/IConnection.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - @file IConnection.h - @author Lime Microsystems - @brief Interface class for connection types -*/ - -#ifndef ICONNECTION_H -#define ICONNECTION_H - -#include -#include - -using namespace std; - -class IConnection -{ -public: - /// Supported connection types. - enum eConnectionType - { - CONNECTION_UNDEFINED = -1, - COM_PORT = 0, - USB_PORT = 1, - SPI_PORT = 2, - //insert new types here - CONNECTION_TYPES_COUNT //used only for memory allocation - }; - - enum DeviceStatus - { - SUCCESS, - FAILURE, - END_POINTS_NOT_FOUND, - CANNOT_CLAIM_INTERFACE - }; - - IConnection() : m_connectionType(CONNECTION_UNDEFINED){}; - virtual ~IConnection(){}; - virtual int RefreshDeviceList() = 0; - virtual DeviceStatus Open(unsigned i) = 0; - virtual void Close() = 0; - virtual bool IsOpen() = 0; - virtual int GetOpenedIndex() = 0; - - virtual int Write(const unsigned char *buffer, int length, int timeout_ms = 0) = 0; - virtual int Read(unsigned char *buffer, int length, int timeout_ms = 0) = 0; - - virtual std::vector GetDeviceNames() = 0; - - virtual eConnectionType GetType() { return m_connectionType; }; - virtual bool SetParam(const char *name, const char* value) {return false;}; - - virtual int BeginDataReading(char *buffer, long length){ return -1; }; - virtual int WaitForReading(int contextHandle, unsigned int timeout_ms){ return 0;}; - virtual int FinishDataReading(char *buffer, long &length, int contextHandle){ return 0;} - virtual void AbortReading(){}; - virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms){ return 0; } - - virtual int BeginDataSending(const char *buffer, long length){ return -1; }; - virtual int WaitForSending(int contextHandle, unsigned int timeout_ms){ return 0;}; - virtual int FinishDataSending(const char *buffer, long &length, int contextHandle){ return 0;} - virtual void AbortSending(){}; -protected: - eConnectionType m_connectionType; -}; - -#endif - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/INI.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/INI.h deleted file mode 100644 index de54b4e7b4..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/INI.h +++ /dev/null @@ -1,639 +0,0 @@ -/* - Feather INI Parser - 1.40 - You are free to use this however you wish. - - If you find a bug, please attept to debug the cause. - Post your environment details and the cause or fix in the issues section of GitHub. - - Written by Turbine. - - Website: - https://github.com/Turbine1991/feather-ini-parser - http://code.google.com/p/feather-ini-parser/downloads - - Help: - Bundled example & readme. - http://code.google.com/p/feather-ini-parser/wiki/Tutorials -*/ - -#pragma once - -#include -#include -#include -#include -#include -#include - -#define FINI_SAFE -#define FINI_BUFFER_SIZE 128 - -#if __cplusplus >= 201103L - #include - #define FINI_CPP11 - #define ALLOCATE_SECTIONS 100 - #define ALLOCATE_KEYS 5 -#else - #include -#endif - -#ifdef FINI_WIDE_SUPPORT - #include - - typedef std::wstringstream fini_sstream_t; - typedef std::wstring fini_string_t; - typedef wchar_t fini_char_t; - typedef std::wifstream fini_ifstream_t; - typedef std::wofstream fini_ofstream_t; - - #define fini_strlen(a) wcslen(a) - #define fini_strncpy(a, b) wcscpy(a, b) - #define fini_strncpy(a, b, c) wcsncpy(a, b, c) - #define fini_strtok(a, b) wcstok(a, b) - - #define _T(x) L ##x -#else - #include - - typedef std::stringstream fini_sstream_t; - typedef std::string fini_string_t; - typedef char fini_char_t; - typedef std::ifstream fini_ifstream_t; - typedef std::ofstream fini_ofstream_t; - - #define fini_strlen(a) strlen(a) - #define fini_strcpy(a, b) strcpy(a, b) - #define fini_strncpy(a, b, c) strncpy(a, b, c) - #define fini_strtok(a, b) strtok(a, b) - - #define _T(x) x -#endif - -#define CHAR_SIZE sizeof(fini_char_t) - -///Simple converter using templates and streams to effectively required for the flexibility of handling native types -class Converters -{ -public: - template - static T Convert(U value); - template - static void GetLine(fini_sstream_t& out, T& value); - static void GetLine(fini_sstream_t& out, fini_string_t& value); - template - static size_t GetDataSize(T& value); - static size_t GetDataSize(fini_string_t value); -}; - -/// -template - class INI -{ -public: - typedef T section_t; - typedef U key_t; - typedef V value_t; - typedef INI ini_t; - -///Type definition declarations -#ifdef FINI_CPP11 - typedef typename std::unordered_map keys_t; - typedef typename std::unordered_map sections_t; -#else - typedef typename std::map keys_t; - typedef typename std::map sections_t; -#endif - - typedef typename keys_t::iterator keysit_t; - typedef typename sections_t::iterator sectionsit_t; - - typedef typename std::pair keyspair_t; - typedef typename std::pair sectionspair_t; - - typedef char data_t; - - enum source_e {SOURCE_FILE, SOURCE_MEMORY}; - -///Data members - std::string filename; - data_t* data; - size_t dataSize; - keys_t* current; - sections_t sections; - source_e source; - -///Constuctor/Destructor - //Specify the filename to associate and whether to parse immediately - INI(const std::string filename, bool doParse): filename(filename) - { - init(SOURCE_FILE, doParse); - } - - //Used for loading INI from memory - INI(void* data, size_t dataSize, bool doParse): data((data_t*)data), dataSize(dataSize) - { - init(SOURCE_MEMORY, doParse); - } - - ~INI() - { - clear(); - } - -///Access Content - //Provide bracket access to section contents - keys_t& operator[](section_t section) - { - #ifdef FINI_SAFE - if (!sections[section]) - sections[section] = new keys_t; - #endif - - return *sections[section]; - } - - //Create a new section and select it - bool create(const section_t section) - { - if (select(section)) - return false; - - current = new keys_t; - sections[section] = current; - - reserveKeys(current); - - return true; - } - - //Select a section for performing operations - bool select(const section_t section) - { - sectionsit_t sectionsit = sections.find(section); - if (sectionsit == sections.end()) - return false; - - current = sectionsit->second; - - return true; - } - -///Set - //Assign a value for key under the selected section - bool set(const key_t key, const value_t value) - { - if (current == NULL) - return false; - - (*current)[key] = value; - - return true; - } - - template - bool set(const W key, const X value) - { return set(Converters::Convert(key), Converters::Convert(value)); } - -///Get - value_t get(const key_t key, value_t def = value_t()) - { - keysit_t it = current->find(key); - if (current == NULL || it == current->end()) - return def; - - return it->second; - } - - value_t get(const section_t section, const key_t key, value_t def) - { - if (!select(section)) - return def; - - return get(key, def); - } - - template - X get(const W key, const X def = value_t()) - { return Converters::Convert(get(Converters::Convert(key), Converters::Convert(def))); } - - template - fini_string_t get(const W key, const fini_char_t* def = _T("")) //Handle C string default value without casting - { return Converters::Convert(get(Converters::Convert(key), Converters::Convert(def))); } - - template - Y get(const W section, const X key, const Y def) - { return Converters::Convert(get(Converters::Convert(section), Converters::Convert(key), Converters::Convert(def))); } - - template - fini_string_t get(const W section, const X key, const fini_char_t* def) //Handle C string default value without casting - { return Converters::Convert(Converters::Convert(section), get(Converters::Convert(key), Converters::Convert(def))); } - -///Functions - void parse(std::istream& file) - { - fini_char_t line[FINI_BUFFER_SIZE]; - bool first = true; - fini_sstream_t out; - - while(!file.eof()) - { - file.getline(line, FINI_BUFFER_SIZE); - - if (first) - { - first = false; - if (line[0] == 0xEF) //Allows handling of UTF-16/32 documents - { - memmove(line, line + (CHAR_SIZE * 3), CHAR_SIZE * (FINI_BUFFER_SIZE - 3)); - return; - } - } - - nake(line); - - if (line[0]) - { - size_t len = fini_strlen(line); - if (len > 0 && !((len >= 2 && (line[0] == '/' && line[1] == '/')) || (len >= 1 && line[0] == '#'))) //Ignore comment and empty lines - { - if (line[0] == '[') //Section - { - section_t section; - size_t length = fini_strlen(line) - 2; //Without section brackets - while(isspace(line[length + 1])) //Leave out any additional new line characters, not "spaces" as the name suggests - --length; - - fini_char_t* ssection = (fini_char_t*)calloc(CHAR_SIZE, length + 1); - fini_strncpy(ssection, line + 1, length); //Count after first bracket - - current = new keys_t; - - out << ssection; - free(ssection); - Converters::GetLine(out, section); - - sections[section] = current; - } - else //Key - { - key_t key; - value_t value; - - fini_char_t* skey; - fini_char_t* svalue; - - skey = fini_strtok(line, _T("=")); - svalue = fini_strtok(NULL, _T("\n")); - - if (skey && svalue) - { - size_t index = 0; //Without section brackets - while(isspace(skey[index])) //Leave out any additional new line characters, not "spaces" as the name suggests - index++; - - if (index != 0) //Has preceeding white space - fini_strcpy(skey, skey + index); - - out << skey; - - Converters::GetLine(out, key); - - out.clear(); - out.str(fini_string_t()); - - out << svalue; - Converters::GetLine(out, value); - - if (value != value_t()) - (*current)[key] = value; - } - } - - out.clear(); - out.str(fini_string_t()); //Clear existing stream; - } - } - } - } - - //Parse an INI's contents into memory from the filename given during construction - bool parse() - { - switch(source) - { - case SOURCE_FILE: { - fini_ifstream_t file(filename.c_str()); - - if (!file.is_open()) - return false; - - parse(file); - - file.close(); - } - break; - - case SOURCE_MEMORY: { - std::stringstream sstream; - sstream.rdbuf()->pubsetbuf(data, dataSize); - - parse(sstream); - } - break; - } - - return true; - } - - bool parseBinary() - { - fini_ifstream_t file(filename.c_str(), std::ios::binary); - if (!file.is_open()) - return false; - - size_t sectionCount; - size_t keyCount; - key_t key; - value_t value; - section_t section; - - //file.read((fini_char_t*)§ionCount, sizeof(sectionCount)); - file >> sectionCount; - - for(size_t i = 0; i < sectionCount; i++) - { - if (i > 0) - file.seekg(1 + file.tellg()); - - file.read((fini_char_t*)&keyCount, sizeof(keyCount)); - file >> section; - - create(section); - - for(size_t j = 0; j < keyCount; j++) - { - file >> key; - file >> value; - set(key, value); - } - } - - file.close(); - - return true; - } - - //Clear the contents from memory - void clear() - { - clean(); - sections.clear(); - } - -///Output - //Save from memory into file - bool save(const std::string filename = "") - { - if (!hasFileAssociation(filename)) - return false; - - fini_ofstream_t file(((filename == "")? this->filename: filename).c_str(), std::ios::trunc); - if (!file.is_open()) - return false; - - //Loop through sections - for(typename INI::sectionsit_t i = sections.begin(); i != sections.end(); i++) - { - if (i->second->size() == 0) //No keys/values in section, skip to next - continue; - - //Write section - const fini_string_t temp = makeSection(i->first); - const fini_char_t* line = temp.c_str(); - file.write(line, fini_strlen(line)); - - for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) - { - //Write key and value - const fini_string_t temp = makeKeyValue(j->first, j->second); - const fini_char_t* line = temp.c_str(); - file.write(line, fini_strlen(line)); - } - } - - file.close(); - - return true; - } - - //Saves it without any conventional INI formatting characters, however it only uses string streams - bool saveBinary(const std::string filename = "") - { - if (!hasFileAssociation(filename)) - return false; - - fini_ofstream_t file(((filename == "")? this->filename: filename).c_str(), std::ios::trunc | std::ios::binary); - if (!file.is_open()) - return false; - - size_t sectionCount = sections.size(); - size_t keyCount; - - file.write((fini_char_t*)§ionCount, sizeof(sectionCount)); - - //Loop through sections - for(typename INI::sectionsit_t i = sections.begin(); i != sections.end(); i++) - { - keyCount = i->second->size(); - file.write((fini_char_t*)&keyCount, sizeof(keyCount)); - - file << i->first << std::endl; - - for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) - { - file << j->first << std::endl; - file << j->second << std::endl; - } - } - - file.close(); - - return true; - } - - //Saves it as a true binary file, intended to replace the existing one. Don't bother using it with all strings. - bool saveBinaryExperimental(std::string filename = "") - { - if (!hasFileAssociation(filename)) - return false; - - fini_ofstream_t file(((filename == "")? this->filename: filename).c_str(), std::ios::trunc | std::ios::binary); - if (!file.is_open()) - return false; - - size_t sectionCount = sections.size(); - size_t keyCount; - - file.write((fini_char_t*)§ionCount, sizeof(sectionCount)); - - //Loop through sections - for(typename INI::sectionsit_t i = sections.begin(); i != sections.end(); i++) - { - keyCount = i->second->size(); - file.write((fini_char_t*)&keyCount, sizeof(keyCount)); - - file.write((fini_char_t*)&i->first, Converters::GetDataSize(i->first)); - - for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) - { - file.write((fini_char_t*)&j->first, Converters::GetDataSize(j->first)); - file.write((fini_char_t*)&j->second, Converters::GetDataSize(j->second)); - } - } - - file.close(); - - return true; - } - - //Alows another INI's contents to be insert into another, with the ability to retain the original values - void merge(ini_t& other, bool retainValues = true) - { - for(typename INI::sectionsit_t i = other.sections.begin(); i != other.sections.end(); i++) - { - if (!select(i->first)) //Create and insert all key values into a missing section - { - keys_t* keys = new keys_t(*i->second); - sections.insert(std::make_pair(i->first, keys)); - } - else - { - for(typename INI::keysit_t j = i->second->begin(); j != i->second->end(); j++) - { - keysit_t it = current->find(j->first); - if (it == current->end()) - current->insert(std::make_pair(j->first, j->second)); - else if (!retainValues) - it->second = j->second; - } - } - } - } - -private: -///Functions - //Init the INI in with values set by constructor - void init(source_e source, bool doParse) - { - this->source = source; - - reserveSections(); - if (doParse) - parse(); - } - - //Clean the contents for descruction - void clean() - { - for(sectionsit_t i = sections.begin(); i != sections.end(); i++) - delete i->second; - - current = NULL; - } - - //Make any alterations to the raw line - void nake(const fini_char_t*) //Strip the line of any non-interpretable characters - { - - } - - void reserveSections() - { - #ifdef FINI_CPP11 - sections.reserve(ALLOCATE_SECTIONS); - #endif - } - - void reserveKeys(keys_t* current) - { - #ifdef FINI_CPP11 - current->reserve(ALLOCATE_KEYS); - #endif - } - - bool hasFileAssociation(std::string filename) - { - if (source == SOURCE_MEMORY && filename == "") //No association to a file - return false; - - return true; - } - -///Output - //Creates a section as a string - fini_string_t makeSection(const section_t& section) - { - fini_sstream_t line; - line << '[' << section << ']' << std::endl; - - return line.str(); - } - - //Creates a key and a value as a string - fini_string_t makeKeyValue(const key_t& key, const value_t& value) - { - fini_sstream_t line; - line << key << '=' << value << std::endl; - - return line.str(); - } -}; - -///Definitions -template - inline T Converters::Convert(U value) -{ - fini_sstream_t sout; - T result; - - sout << value; - sout >> result; - - sout.str(fini_string_t()); - - return result; -} - -template <> - inline fini_string_t Converters::Convert(fini_string_t value) -{ - return value; -} - -template <> - inline fini_string_t Converters::Convert(const fini_char_t* value) -{ - return value; -} - -template - inline void Converters::GetLine(fini_sstream_t& out, T& value) -{ - out >> value; -} - -inline void Converters::GetLine(fini_sstream_t& out, fini_string_t& value) -{ - std::getline(out, value); -} - -template - inline size_t Converters::GetDataSize(T& value) -{ - return sizeof(value); -} - -inline size_t Converters::GetDataSize(fini_string_t value) -{ - return value.size() + 1; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/LICENSE b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/LICENSE deleted file mode 100644 index 7d961cc6e5..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Turbine1991 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/README.md b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/README.md deleted file mode 100644 index f1245971cd..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/README.md +++ /dev/null @@ -1,47 +0,0 @@ -feather-ini-parser -================== - -Simple like your girlfriend, fast, lightweight, header, portable INI parser for ANSI C++. - -Why use feather-ini-parser? It's a fast, intuitive, uses C++, supports native data types, wide char support (enable), converting to data types simply by setting a default value or providing the type as a template parameter. - -##Methods - -Statement | Return Type -------------- | ------------- -ini(filename, doParse)|constructor -ini(data, dataSize, doParse)|constructor -ini.parse()|bool -ini.merge(other INI, retainValues)|void -ini.create(section)|bool -ini.select(section)|bool -ini.set(key, value)|bool -ini.get(key, dvalue = value_t())|dvalue_t -ini.save(filename = "")|bool -ini.clear()|bool -ini[section][key]|value_t& -ini[section]|keys_t& - -##Example -``` -#include -#include "INI.h" - -using namespace std; -``` -... -``` -typedef INI<> ini_t; -//or -//typedef INI ini_t; - -ini_t ini("filename.ini", true); -ini.create("section1"); //Create and select section1 -ini.set("key", "value"); -cout << ini.get("keynumeric", -1) << endl; -ini["section2"]["key"] = "value"; -ini.save(); -``` - -##More -Please see the example .cpp file and Code::Blocks .cbp project for a compilable GCC and VSC++ example. Additionally includes enabling wide char support and iterating through contents. diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp deleted file mode 100644 index 462dd241dc..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/example.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include -#include -#include -#include "../INI.h" - -using namespace std; - -void centerString(string str); //Printing to console -std::string getStringFromFile(const std::string& path); //Source for data loading from memory. - -int main() -{ - ///Declare - typedef INI<> ini_t; //Makes things shorter/easier to write - //or - //typedef INI ini_t; //Equivelant to previous line when wide characters are disabled - ini_t ini("file.ini", true); //File to open/default save filename. The constuctor is set to parse by default, unless specified as false - - ///Manipulate and access contents - centerString("########## Access & Manipulate Contents ##########"); - - //Common usage - ini.create("Section 1"); - ini.create("Section 2"); - ini.get("Key1", "DefaultValue"); - ini.select("Section 1"); - ini.set("Key2", "Value"); - ini.save(); //Save contents to file, optional filename parameter available - ini.clear(); //Clear INI contents from memory - - //Extended usage - ini["Section Name"]["Key"] = "Value"; //You are not required to create a section first - - ini.create("Section1"); //Also selects as current section - ini.create("Section2"); //Current - - ini.set("Key1", "Value1"); //Added pair under section "Section2" - - ini.select("Section1"); //Current - cout << ini.get("Key1", "-1") << endl; //Returns "-1" as no key exists, no default will return NULL for data type, eg int() is 0 - - ini.select("Section2"); - ini.set("Key1", "1.123"); - cout << ini.get("Key1", -1.0) << endl; //Return value as double - ini.set(123, 123); //Will convert to provided INI data type for key/value, in this case string for both - - ini.save(); - ini.clear(); - ini.parse(); //Parses file into objects in memory - - cout << ini["Section2"]["Key1"] << endl; //Returns "Value1", slightly more overhead involved seeking section, avoid using excessively - - ///Iterate through sections and keys for both C++11 and C++98 - centerString("########## Iterate Contents ##########"); - -#ifdef FINI_CPP11 - for(auto i: ini.sections) - { - cout << "[" << i.first << "]" << endl; - - //for(auto j = i.second->begin(); j != i.second->end(); j++) - for(auto j: *i.second) - { - cout << " " << j.first << "=" << j.second << endl; - } - } -#else - for(ini_t::sectionsit_t i = ini.sections.begin(); i != ini.sections.end(); i++) - { - //Section name as ini_t::section_t - cout << i->first << endl; - - if (i->second->size() == 0) //No keys/values in section, skip to next - continue; - - for(ini_t::keysit_t j = i->second->begin(); j != i->second->end(); j++) - { - //Name as ini_t::key_t & Value as ini_t::key_t - cout << " " << j->first << "=" << j->second << endl; - } - } -#endif - -///Example with different data types - typedef INI ini_int_t; //Makes things shorter/easier to write - ini_int_t ini_int("file_ints.ini", false); //File to open/default save filename. The constuctor is set to parse by default, unless specified as false - for(int i = 1; i <= 200; i++) - { - ini_int.create(i); //Section - ini_int.set("Key", i / 2.f); - } - - ini_int.save(); - -///Wide char support example (please define FINI_WIDE_SUPPORT in project) - /* - ini_t ini_w("file.ini", true); - wcout << ini_w[L"Section2"][L"Key1"] << endl; - */ - -///Load from memory - std::string str = getStringFromFile("config/test.ini"); //Allows us to tap into a source for the purpose of this example - - ini_t ini_mem((void*)str.c_str(), str.size(), true); //This is the line which parses data from memory - -///Merge contents and keep values - ini_t inid("file.ini", true); - ini_t inis("merge.ini", true); - inid.merge(inis, true); - inid.save("merged.ini"); - - return EXIT_SUCCESS; -} - -void centerString(string str) -{ - const char* s = str.c_str(); - int l = strlen(s); - int pos = (int)((80 - l) / 2); - for(int i = 0; i < pos; i++) - cout << " "; - cout << s << endl; -} - -std::string getStringFromFile(const std::string& path) { - std::ostringstream buf; - std::ifstream input (path.c_str()); - buf << input.rdbuf(); - return buf.str(); -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file.ini b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file.ini deleted file mode 100644 index e1c485ba2a..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file.ini +++ /dev/null @@ -1,5 +0,0 @@ -[Section2] -123=123 -Key1=1.123 -[Section Name] -Key=Value diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file_ints.ini b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file_ints.ini deleted file mode 100644 index 3d71e76cae..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/file_ints.ini +++ /dev/null @@ -1,400 +0,0 @@ -[200] -Key=100 -[199] -Key=99.5 -[198] -Key=99 -[197] -Key=98.5 -[196] -Key=98 -[195] -Key=97.5 -[194] -Key=97 -[193] -Key=96.5 -[192] -Key=96 -[191] -Key=95.5 -[190] -Key=95 -[189] -Key=94.5 -[188] -Key=94 -[187] -Key=93.5 -[186] -Key=93 -[185] -Key=92.5 -[184] -Key=92 -[183] -Key=91.5 -[182] -Key=91 -[181] -Key=90.5 -[180] -Key=90 -[179] -Key=89.5 -[178] -Key=89 -[177] -Key=88.5 -[176] -Key=88 -[175] -Key=87.5 -[174] -Key=87 -[173] -Key=86.5 -[172] -Key=86 -[171] -Key=85.5 -[170] -Key=85 -[169] -Key=84.5 -[168] -Key=84 -[167] -Key=83.5 -[166] -Key=83 -[165] -Key=82.5 -[164] -Key=82 -[163] -Key=81.5 -[162] -Key=81 -[161] -Key=80.5 -[160] -Key=80 -[159] -Key=79.5 -[158] -Key=79 -[157] -Key=78.5 -[156] -Key=78 -[155] -Key=77.5 -[154] -Key=77 -[153] -Key=76.5 -[152] -Key=76 -[151] -Key=75.5 -[150] -Key=75 -[149] -Key=74.5 -[148] -Key=74 -[147] -Key=73.5 -[146] -Key=73 -[145] -Key=72.5 -[144] -Key=72 -[143] -Key=71.5 -[142] -Key=71 -[141] -Key=70.5 -[140] -Key=70 -[139] -Key=69.5 -[138] -Key=69 -[137] -Key=68.5 -[136] -Key=68 -[135] -Key=67.5 -[134] -Key=67 -[133] -Key=66.5 -[132] -Key=66 -[131] -Key=65.5 -[130] -Key=65 -[129] -Key=64.5 -[128] -Key=64 -[127] -Key=63.5 -[126] -Key=63 -[125] -Key=62.5 -[124] -Key=62 -[123] -Key=61.5 -[122] -Key=61 -[121] -Key=60.5 -[120] -Key=60 -[119] -Key=59.5 -[118] -Key=59 -[117] -Key=58.5 -[116] -Key=58 -[115] -Key=57.5 -[114] -Key=57 -[113] -Key=56.5 -[112] -Key=56 -[111] -Key=55.5 -[110] -Key=55 -[109] -Key=54.5 -[108] -Key=54 -[107] -Key=53.5 -[106] -Key=53 -[105] -Key=52.5 -[104] -Key=52 -[103] -Key=51.5 -[1] -Key=0.5 -[2] -Key=1 -[3] -Key=1.5 -[4] -Key=2 -[5] -Key=2.5 -[6] -Key=3 -[7] -Key=3.5 -[8] -Key=4 -[9] -Key=4.5 -[10] -Key=5 -[11] -Key=5.5 -[12] -Key=6 -[13] -Key=6.5 -[14] -Key=7 -[15] -Key=7.5 -[16] -Key=8 -[17] -Key=8.5 -[18] -Key=9 -[19] -Key=9.5 -[20] -Key=10 -[21] -Key=10.5 -[22] -Key=11 -[23] -Key=11.5 -[24] -Key=12 -[25] -Key=12.5 -[26] -Key=13 -[27] -Key=13.5 -[28] -Key=14 -[29] -Key=14.5 -[30] -Key=15 -[31] -Key=15.5 -[32] -Key=16 -[33] -Key=16.5 -[34] -Key=17 -[35] -Key=17.5 -[36] -Key=18 -[37] -Key=18.5 -[38] -Key=19 -[39] -Key=19.5 -[40] -Key=20 -[41] -Key=20.5 -[42] -Key=21 -[43] -Key=21.5 -[44] -Key=22 -[45] -Key=22.5 -[46] -Key=23 -[47] -Key=23.5 -[48] -Key=24 -[49] -Key=24.5 -[50] -Key=25 -[51] -Key=25.5 -[52] -Key=26 -[53] -Key=26.5 -[54] -Key=27 -[55] -Key=27.5 -[56] -Key=28 -[57] -Key=28.5 -[58] -Key=29 -[59] -Key=29.5 -[60] -Key=30 -[61] -Key=30.5 -[62] -Key=31 -[63] -Key=31.5 -[64] -Key=32 -[65] -Key=32.5 -[66] -Key=33 -[67] -Key=33.5 -[68] -Key=34 -[69] -Key=34.5 -[70] -Key=35 -[71] -Key=35.5 -[72] -Key=36 -[73] -Key=36.5 -[74] -Key=37 -[75] -Key=37.5 -[76] -Key=38 -[77] -Key=38.5 -[78] -Key=39 -[79] -Key=39.5 -[80] -Key=40 -[81] -Key=40.5 -[82] -Key=41 -[83] -Key=41.5 -[84] -Key=42 -[85] -Key=42.5 -[86] -Key=43 -[87] -Key=43.5 -[88] -Key=44 -[89] -Key=44.5 -[90] -Key=45 -[91] -Key=45.5 -[92] -Key=46 -[93] -Key=46.5 -[94] -Key=47 -[95] -Key=47.5 -[96] -Key=48 -[97] -Key=48.5 -[98] -Key=49 -[99] -Key=49.5 -[100] -Key=50 -[101] -Key=50.5 -[102] -Key=51 diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/merge.ini b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/merge.ini deleted file mode 100644 index dfdc381084..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/merge.ini +++ /dev/null @@ -1,5 +0,0 @@ -[NewSection] -Key=Value -[Section2] -NewKey=Value -123=456 \ No newline at end of file diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp deleted file mode 100644 index 913928a115..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.cbp +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.depend b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.depend deleted file mode 100644 index 02c743092d..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/cpp-feather-ini-parser/example/project.depend +++ /dev/null @@ -1,802 +0,0 @@ -# depslib dependency file v1.0 -1399614205 source:d:\projects\feather-ini-parser\example\example.cpp - - - - "../INI.h" - -1399625159 d:\projects\feather-ini-parser\ini.h - - - - - - - - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iostream - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\istream - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ostream - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ios - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocnum - - - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\climits - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\yvals.h - - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xkeycheck.h - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\crtdefs.h - - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\sal.h - "codeanalysis\sourceannotations.h" - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\codeanalysis\sourceannotations.h - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\concurrencysal.h - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\vadefs.h - - -1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\use_ansi.h - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\crtwrn.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\limits.h - - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cmath - - - - - - -1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\math.h - - -1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtgmath.h - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtr1common - - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdio - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdio.h - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\swprintf.inl - - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdlib.h - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\streambuf - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xiosbase - - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocale - - - - - - - - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstring - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\string.h - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdexcept - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\exception - - - - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstddef - - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstddef - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stddef.h - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\initializer_list - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\eh.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\malloc.h - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstring - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 - - - - - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\limits - - - - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ymath.h - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cfloat - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\float.h - - - -1375351090 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cwchar - - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\wchar.h - - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\wtime.inl - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\new - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility - - - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\utility - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iosfwd - - - - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\crtdbg.h - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\type_traits - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xrefwrap - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xatomic0.h - - -1379495880 c:\program files (x86)\microsoft visual studio 12.0\vc\include\intrin.h - - - - - - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\setjmp.h - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\setjmpex.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\immintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\wmmintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\nmmintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\smmintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\tmmintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\pmmintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\emmintrin.h - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmmintrin.h - - "xmm_func.h" - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\mmintrin.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ammintrin.h - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\mm3dnow.h - - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\armintr.h - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xatomic.h - - - - - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\typeinfo - - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocinfo - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xlocinfo.h - - - - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\ctype.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\locale.h - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xdebug - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xfacet - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\system_error - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\cerrno - - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\errno.h - - -1374412934 c:\program files (x86)\microsoft visual studio 12.0\vc\include\share.h - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdint.h - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\string - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\iterator - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\fstream - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\sstream - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\unordered_map - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xhash - - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\list - - - -1374410776 c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector - - - -1374412938 c:\program files (x86)\microsoft visual studio 12.0\vc\include\tuple - - - - -1374412936 c:\program files (x86)\microsoft visual studio 12.0\vc\include\map - - - -1374726946 c:\program files (x86)\microsoft visual studio 12.0\vc\include\xtree - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\iostream - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\istream - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ostream - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocnum - - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\climits - - - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\yvals.h - - - - - - - -1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h - - - -1263987576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\sal.h - "codeanalysis\sourceannotations.h" - -1263303828 c:\program files (x86)\microsoft visual studio 10.0\vc\include\codeanalysis\sourceannotations.h - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\vadefs.h - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xkeycheck.h - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtwrn.h - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\use_ansi.h - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\limits.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cmath - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstdio - - - - -1257335008 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h - - - -1256197836 c:\program files (x86)\microsoft visual studio 10.0\vc\include\swprintf.inl - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstdlib - - - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdlib.h - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\streambuf - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xiosbase - - - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocale - - - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstring - - - - -1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\string.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdexcept - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\exception - - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstddef - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cstddef - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stddef.h - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\eh.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\malloc.h - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstring - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\new - - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility - - - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\iosfwd - - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar - - - - -1257335008 c:\program files (x86)\microsoft visual studio 10.0\vc\include\wchar.h - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\wtime.inl - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdbg.h - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\type_traits - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\limits - - - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ymath.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cfloat - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\float.h - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtr1common - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfwrap - - - - - - - - - - - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfwrap1 - - - - - - - - - - - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxbind1 - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxcallfun - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxcallobj - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxcallpmf - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxfunction - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxmem_fn - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxpmfcaller - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxrefwrap - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxresult - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxshared - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxtuple0 - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxtuple1 - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxtype_traits - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\typeinfo - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocinfo - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xlocinfo.h - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\ctype.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\locale.h - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xdebug - - - - -1260264954 c:\program files (x86)\microsoft visual studio 10.0\vc\include\system_error - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\cerrno - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\errno.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\share.h - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdint.h - - -1257671184 c:\program files (x86)\microsoft visual studio 10.0\vc\include\string - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\fstream - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\sstream - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\unordered_map - - -1263720180 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xhash - - - - - - -1251647994 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xfunctional - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\list - - - - -1267607544 c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory - - - - - - - - - -1263118342 c:\program files (x86)\microsoft visual studio 10.0\vc\include\intrin.h - - - - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\setjmp.h - - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\setjmpex.h - - -1251647992 c:\program files (x86)\microsoft visual studio 10.0\vc\include\immintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\wmmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\nmmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\smmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\tmmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\pmmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\emmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmmintrin.h - - "xmm_func.h" - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\mmintrin.h - - -1251642866 c:\program files (x86)\microsoft visual studio 10.0\vc\include\mm3dnow.h - - - - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\vector - - - - -1254299028 c:\program files (x86)\microsoft visual studio 10.0\vc\include\map - - -1258271576 c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree - - - - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lms7002_defines.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lms7002_defines.h deleted file mode 100644 index 6b06a51c7e..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lms7002_defines.h +++ /dev/null @@ -1,218 +0,0 @@ -/** -@file lms7002_defines.h -@author Lime Microsystems -@brief enumerations of available LMS7002M commands and statuses -*/ -#pragma once - -const int LMS_RST_DEACTIVATE = 0; -const int LMS_RST_ACTIVATE = 1; -const int LMS_RST_PULSE = 2; - -enum eLMS_DEV -{ - LMS_DEV_UNKNOWN, - LMS_DEV_EVB6, - LMS_DEV_DIGIGREEN, - LMS_DEV_DIGIRED, - LMS_DEV_EVB7, - LMS_DEV_ZIPPER, - LMS_DEV_SOCKETBOARD, - LMS_DEV_EVB7V2, - LMS_DEV_STREAM, - LMS_DEV_NOVENA, - LMS_DEV_DATASPARK, - LMS_DEV_RFSPARK, - LMS_DEV_LMS6002USB, - LMS_DEV_RFESPARK, - LMS_DEV_SODERA, - - LMS_DEV_COUNT -}; - -const char LMS_DEV_NAMES[][80] = -{ - "UNKNOWN", - "EVB6", - "DigiGreen", - "DigiRed", - "EVB7", - "ZIPPER", - "Socket Board", - "EVB7_v2", - "Stream", - "Novena", - "DataSpark", - "RF-Spark", - "LMS6002-USB Stick", - "RF-ESpark", - "SoDeRa", -}; - -static const char* GetDeviceName(const eLMS_DEV device) -{ - if (LMS_DEV_UNKNOWN < device && device < LMS_DEV_COUNT) - return LMS_DEV_NAMES[device]; - else - return LMS_DEV_NAMES[LMS_DEV_UNKNOWN]; -} - -enum eEXP_BOARD -{ - EXP_BOARD_UNKNOWN, - EXP_BOARD_UNSUPPORTED, - EXP_BOARD_NO, - EXP_BOARD_MYRIAD1, - EXP_BOARD_MYRIAD2, - EXP_BOARD_MYRIAD_NOVENA, - EXP_BOARD_HPM1000, - EXP_BOARD_MYRIAD7, - EXP_BOARD_HPM7, - - EXP_BOARD_COUNT -}; - -const char EXP_BOARD_NAMES[][80] = -{ - "UNKNOWN", - "UNSUPPORTED", - "NOT AVAILABLE", - "Myriad1", - "Myriad2", - "Novena", - "HPM1000", - "Myriad7", - "HMP7" -}; - -static const char* GetExpansionBoardName(const eEXP_BOARD board) -{ - if (EXP_BOARD_UNKNOWN < board && board < EXP_BOARD_COUNT) - return EXP_BOARD_NAMES[board]; - else - return EXP_BOARD_NAMES[EXP_BOARD_UNKNOWN]; -} - -struct LMS64C_Info -{ - unsigned char firmware; - unsigned char deviceType; - unsigned char protocol; - unsigned char hardware; - unsigned char expansionBoard; -}; - -enum eCMD_LMS -{ - CMD_GET_INFO = 0x00, - CMD_LMS6002_RST = 0x10, - ///Writes data to SI5356 synthesizer via I2C - CMD_SI5356_WR = 0x11, - ///Reads data from SI5356 synthesizer via I2C - CMD_SI5356_RD = 0x12, - ///Writes data to SI5351 synthesizer via I2C - CMD_SI5351_WR = 0x13, - ///Reads data from SI5351 synthesizer via I2C - CMD_SI5351_RD = 0x14, - ///PanelBus DVI (HDMI) Transmitter control - CMD_TFP410_WR = 0x15, - ///PanelBus DVI (HDMI) Transmitter control - CMD_TFP410_RD = 0x16, - ///Sets new LMS7002M chip’s RESET pin level (0, 1, pulse) - CMD_LMS7002_RST = 0x20, - ///Writes data to LMS7002M chip via SPI - CMD_LMS7002_WR = 0x21, - ///Reads data from LMS7002M chip via SPI - CMD_LMS7002_RD = 0x22, - ///Writes data to LMS6002 chip via SPI - CMD_LMS6002_WR = 0x23, - ///Reads data from LMS6002 chip via SPI - CMD_LMS6002_RD = 0x24, - - CMD_LMS_LNA = 0x2A, - CMD_LMS_PA = 0x2B, - - CMD_PROG_MCU = 0x2C, - ///Writes data to ADF4002 chip via SPI - CMD_ADF4002_WR = 0x31, - - CMD_USB_FIFO_RST = 0x40, - CMD_PE636040_WR = 0x41, - CMD_PE636040_RD = 0x42, - - CMD_GPIO_WR = 0x51, - CMD_GPIO_RD = 0x52, - - CMD_ALTERA_FPGA_GW_WR = 0x53, - CMD_ALTERA_FPGA_GW_RD = 0x54, - - CMD_BRDSPI_WR = 0x55,//16 bit spi for stream, dataspark control - CMD_BRDSPI_RD = 0x56,//16 bit spi for stream, dataspark control - CMD_BRDSPI8_WR = 0x57, //8 + 8 bit spi for stream, dataspark control - CMD_BRDSPI8_RD = 0x58, //8 + 8 bit spi for stream, dataspark control - - CMD_BRDCONF_WR = 0x5D, //write config data to board - CMD_BRDCONF_RD = 0x5E, //read config data from board - - CMD_ANALOG_VAL_WR = 0x61, //write analog value - CMD_ANALOG_VAL_RD = 0x62, //read analog value - - CMD_MYRIAD_RST = 0x80, - CMD_MYRIAD_WR = 0x81, - CMD_MYRIAD_RD = 0x82, - CMD_MYRIAD_PROG = 0x8C -}; - -enum eCMD_STATUS -{ - STATUS_UNDEFINED, - STATUS_COMPLETED_CMD, - STATUS_UNKNOWN_CMD, - STATUS_BUSY_CMD, - STATUS_MANY_BLOCKS_CMD, - STATUS_ERROR_CMD, - STATUS_WRONG_ORDER_CMD, - STATUS_RESOURCE_DENIED_CMD, - STATUS_COUNT -}; - -static const char status_text[][32]= -{ - "Undefined/Failure", - "Completed", - "Unknown command", - "Busy", - "Too many blocks", - "Error", - "Wrong order", - "Resource denied" -}; - -static const char* status2string(const int status) -{ - if(status >= 0 && status < STATUS_COUNT) - return status_text[status]; - else - return "Unknown status"; -} - -enum eADC_UNITS -{ - RAW, - VOLTAGE, - CURRENT, - RESISTANCE, - POWER, - TEMPERATURE, - ADC_UNITS_COUNT -}; - -static const char adc_units_text[][8] = {"", "V", "A", "Ohm", "W", "C"}; - -static const char* adcUnits2string(const unsigned units) -{ - if (units < ADC_UNITS_COUNT) - return adc_units_text[units]; - else - return " unknown"; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.cpp deleted file mode 100644 index 5b74ef8975..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.cpp +++ /dev/null @@ -1,326 +0,0 @@ -/** -@file LMScomms.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Implementation of data transmission to LMS boards -*/ - -#include "lmsComms.h" - -LMScomms::LMScomms() -{ - callback_logData = nullptr; - unsigned short test = 0x1234; - unsigned char* bytes = (unsigned char*)&test; - if(bytes[0] == 0x12 && bytes[1] == 0x34) - mSystemBigEndian = true; - else - mSystemBigEndian = false; -} - -LMScomms::~LMScomms() -{ -} - -/** @brief Transfers data between packet and connected device - @param pkt packet containing output data and to receive incomming data - @return 0: success, other: failure -*/ -LMScomms::TransferStatus LMScomms::TransferPacket(GenericPacket& pkt) -{ - std::lock_guard lock(mControlPortLock); - TransferStatus status = TRANSFER_SUCCESS; - if(IsOpen() == false) - return NOT_CONNECTED; - - int packetLen; - eLMS_PROTOCOL protocol = LMS_PROTOCOL_UNDEFINED; - if(activeControlPort->GetType() == IConnection::SPI_PORT) - protocol = LMS_PROTOCOL_NOVENA; - else - protocol = LMS_PROTOCOL_LMS64C; - switch(protocol) - { - case LMS_PROTOCOL_UNDEFINED: - return TRANSFER_FAILED; - case LMS_PROTOCOL_LMS64C: - packetLen = ProtocolLMS64C::pktLength; - break; - case LMS_PROTOCOL_NOVENA: - packetLen = pkt.outBuffer.size() > ProtocolNovena::pktLength ? ProtocolNovena::pktLength : pkt.outBuffer.size(); - break; - default: - packetLen = 0; - return TRANSFER_FAILED; - } - int outLen = 0; - unsigned char* outBuffer = NULL; - outBuffer = PreparePacket(pkt, outLen, protocol); - unsigned char* inBuffer = new unsigned char[outLen]; - memset(inBuffer, 0, outLen); - - int outBufPos = 0; - int inDataPos = 0; - if(outLen == 0) - { - //printf("packet outlen = 0\n"); - outLen = 1; - } - - if(protocol == LMS_PROTOCOL_NOVENA) - { - bool transferData = true; //some commands are fake, so don't need transferring - if(pkt.cmd == CMD_GET_INFO) - { - //spi does not have GET INFO, fake it to inform what device it is - pkt.status = STATUS_COMPLETED_CMD; - pkt.inBuffer.clear(); - pkt.inBuffer.resize(64, 0); - pkt.inBuffer[0] = 0; //firmware - pkt.inBuffer[1] = LMS_DEV_NOVENA; //device - pkt.inBuffer[2] = 0; //protocol - pkt.inBuffer[3] = 0; //hardware - pkt.inBuffer[4] = EXP_BOARD_UNSUPPORTED; //expansion - transferData = false; - } - - if(transferData) - { - if (callback_logData) - callback_logData(true, outBuffer, outLen); - int bytesWritten = Write(outBuffer, outLen); - if( bytesWritten == outLen) - { - if(pkt.cmd == CMD_LMS7002_RD) - { - inDataPos = Read(&inBuffer[inDataPos], outLen); - if(inDataPos != outLen) - status = TRANSFER_FAILED; - else - { - if (callback_logData) - callback_logData(false, inBuffer, inDataPos); - } - } - ParsePacket(pkt, inBuffer, inDataPos, protocol); - } - else - status = TRANSFER_FAILED; - } - } - else - { - for(int i=0; i= 5) - { - info.firmware = pkt.inBuffer[0]; - info.device = pkt.inBuffer[1] < LMS_DEV_COUNT ? (eLMS_DEV)pkt.inBuffer[1] : LMS_DEV_UNKNOWN; - info.protocol = pkt.inBuffer[2]; - info.hardware = pkt.inBuffer[3]; - info.expansion = pkt.inBuffer[4] < EXP_BOARD_COUNT ? (eEXP_BOARD)pkt.inBuffer[4] : EXP_BOARD_UNKNOWN; - } - return info; -} - -/** @brief Takes generic packet and converts to specific protocol buffer - @param pkt generic data packet to convert - @param length returns length of returned buffer - @param protocol which protocol to use for data - @return pointer to data buffer, must be manually deleted after use -*/ -unsigned char* LMScomms::PreparePacket(const GenericPacket& pkt, int& length, const eLMS_PROTOCOL protocol) -{ - unsigned char* buffer = NULL; - if(protocol == LMS_PROTOCOL_UNDEFINED) - return NULL; - - if(protocol == LMS_PROTOCOL_LMS64C) - { - ProtocolLMS64C packet; - int maxDataLength = packet.maxDataLength; - packet.cmd = pkt.cmd; - packet.status = pkt.status; - int byteBlockRatio = 1; //block ratio - how many bytes in one block - switch( packet.cmd ) - { - case CMD_PROG_MCU: - case CMD_GET_INFO: - case CMD_SI5351_RD: - case CMD_SI5356_RD: - byteBlockRatio = 1; - break; - case CMD_SI5351_WR: - case CMD_SI5356_WR: - byteBlockRatio = 2; - break; - case CMD_LMS7002_RD: - case CMD_BRDSPI_RD: - case CMD_BRDSPI8_RD: - byteBlockRatio = 2; - break; - case CMD_ADF4002_WR: - byteBlockRatio = 3; - break; - case CMD_LMS7002_WR: - case CMD_BRDSPI_WR: - case CMD_ANALOG_VAL_WR: - byteBlockRatio = 4; - break; - default: - byteBlockRatio = 1; - } - if (packet.cmd == CMD_LMS7002_RD || packet.cmd == CMD_BRDSPI_RD) - maxDataLength = maxDataLength/2; - if (packet.cmd == CMD_ANALOG_VAL_RD) - maxDataLength = maxDataLength / 4; - int blockCount = pkt.outBuffer.size()/byteBlockRatio; - int bufLen = blockCount/(maxDataLength/byteBlockRatio) - +(blockCount%(maxDataLength/byteBlockRatio)!=0); - bufLen *= packet.pktLength; - if(bufLen == 0) - bufLen = packet.pktLength; - buffer = new unsigned char[bufLen]; - memset(buffer, 0, bufLen); - int srcPos = 0; - for(int j=0; j*packet.pktLength (maxDataLength/byteBlockRatio)) - { - buffer[pktPos+2] = maxDataLength/byteBlockRatio; - blockCount -= buffer[pktPos+2]; - } - else - buffer[pktPos+2] = blockCount; - memcpy(&buffer[pktPos+3], packet.reserved, sizeof(packet.reserved)); - int bytesToPack = (maxDataLength/byteBlockRatio)*byteBlockRatio; - for (int k = 0; k> 8) | 0x80; - buffer[1] = NOVENA_GPIO_ADDR & 0xFF; - buffer[2] = 0x00; - buffer[3] = 0x18; - buffer[4] = (NOVENA_GPIO_ADDR >> 8) | 0x80; - buffer[5] = NOVENA_GPIO_ADDR & 0xFF; - buffer[6] = 0x00; - buffer[7] = 0x38; - length = 8; - } - else - { - buffer = new unsigned char[pkt.outBuffer.size()]; - memcpy(buffer, &pkt.outBuffer[0], pkt.outBuffer.size()); - if (pkt.cmd == CMD_LMS7002_WR) - { - for(int i=0; i callback) -{ - callback_logData = callback; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h deleted file mode 100644 index 3d94d8ece2..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/lmsComms.h +++ /dev/null @@ -1,111 +0,0 @@ -/** -@file LMScomms.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for handling data transmission to LMS boards -*/ - -#ifndef LMS_COMMS_H -#define LMS_COMMS_H - -#include "lms7002_defines.h" -#include "connectionManager/ConnectionManager.h" -#include -#include - -struct LMSinfo -{ - eLMS_DEV device; - eEXP_BOARD expansion; - int firmware; - int hardware; - int protocol; -}; - -/* @brief Class for abstracting transfering data to and from chip -*/ -class LMScomms : public ConnectionManager -{ -public: - enum TransferStatus - { - TRANSFER_SUCCESS, - TRANSFER_FAILED, - NOT_CONNECTED - }; - - enum eLMS_PROTOCOL - { - LMS_PROTOCOL_UNDEFINED = 0, - LMS_PROTOCOL_DIGIC, - LMS_PROTOCOL_LMS64C, - LMS_PROTOCOL_NOVENA, - }; - struct ProtocolDIGIC - { - static const int pktLength = 64; - static const int maxDataLength = 60; - ProtocolDIGIC() : cmd(0), i2cAddr(0), blockCount(0) {}; - unsigned char cmd; - unsigned char i2cAddr; - unsigned char blockCount; - unsigned char reserved; - unsigned char data[maxDataLength]; - }; - - struct ProtocolLMS64C - { - static const int pktLength = 64; - static const int maxDataLength = 56; - ProtocolLMS64C() :cmd(0),status(STATUS_UNDEFINED),blockCount(0) - { - memset(reserved, 0, 5); - }; - unsigned char cmd; - unsigned char status; - unsigned char blockCount; - unsigned char reserved[5]; - unsigned char data[maxDataLength]; - }; - - struct ProtocolNovena - { - static const int pktLength = 128; - static const int maxDataLength = 128; - ProtocolNovena() :cmd(0),status(0) {}; - unsigned char cmd; - unsigned char status; - unsigned char blockCount; - unsigned char data[maxDataLength]; - }; - - struct GenericPacket - { - GenericPacket() - { - cmd = CMD_GET_INFO; - status = STATUS_UNDEFINED; - } - - eCMD_LMS cmd; - eCMD_STATUS status; - vector outBuffer; - vector inBuffer; - }; - - LMScomms(); - ~LMScomms(); - - virtual TransferStatus TransferPacket(GenericPacket &pkt); - LMSinfo GetInfo(); - void SetDataLogCallback(std::function callback); -protected: - std::function callback_logData; - std::mutex mControlPortLock; - unsigned char* PreparePacket(const GenericPacket &pkt, int &length, const eLMS_PROTOCOL protocol); - int ParsePacket(GenericPacket &pkt, const unsigned char* buffer, const int length, const eLMS_PROTOCOL protocol); -protected: - bool mSystemBigEndian; -}; - -#endif // LMS_COMMS_H - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h deleted file mode 100644 index 9ae0c25d93..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms7002m/typedefs.h +++ /dev/null @@ -1,18 +0,0 @@ -/** -@file typedefs.h -@author Lime Microsystems (www.limemicro.com) -@brief Variables types definitions -*/ - -#ifndef LMS7002M_TYPEDEFS_H -#define LMS7002M_TYPEDEFS_H - -typedef unsigned int uint32_t; -typedef int int32_t; -typedef unsigned short uint16_t; -typedef short int16_t; -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef double float_type; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/CMakeLists.txt deleted file mode 100644 index 0225e1d4d6..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/CMakeLists.txt +++ /dev/null @@ -1,58 +0,0 @@ -cmake_minimum_required(VERSION 2.8) -set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE TYPE INTERNAL FORCE) -project("matlab_StreamDLL") -#include modules for finding CyAPI -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") -cmake_policy(SET CMP0015 OLD) -if(${CMAKE_MAJOR_VERSION} GREATER 2) - cmake_policy(SET CMP0043 NEW) -endif() -ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS) -if(CMAKE_COMPILER_IS_GNUCXX) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fPIC") -endif() - -# Add sub-directories -add_subdirectory(LMS_StreamBoard) -include_directories(LMS_StreamBoard) -add_subdirectory(connectionManager) -include_directories(connectionManager) - -set(BINARY_OUTPUT_DIR "${CMAKE_BINARY_DIR}/bin") - -if (MSVC) - SET( MSVC_MULTITHREAD_COMPILE_FLAGS "/MP") - SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MSVC_MULTITHREAD_COMPILE_FLAGS}" ) -endif(MSVC) - -set(Library_file_list LMS_SDR.cpp ) - -set(BUILD_STATIC_LIB OFF CACHE BOOL "Build static or dynamic library") -if( BUILD_STATIC_LIB ) - add_library(LMS_SDR STATIC ${Library_file_list}) -else() - add_library(LMS_SDR SHARED ${Library_file_list}) -endif(BUILD_STATIC_LIB) - -set(AUTO_UPDATE_VERSION OFF CACHE BOOL "Uses python script to increment version") -if(AUTO_UPDATE_VERSION) - add_custom_target(updateVersion ALL COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/auto_version.py WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - add_dependencies(LMS_SDR updateVersion) -endif() - -target_link_libraries(LMS_SDR - LMS_StreamBoard - ${CYAPI_LIBRARIES} - ) - -if(WIN32) - find_package(CyAPI REQUIRED) - LINK_DIRECTORIES(${CYAPI_LIBRARIES}) - include_directories(${CYAPI_INCLUDE_DIRS}) - set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI) -endif() -if(UNIX) - set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread) -endif() - -target_link_libraries(LMS_SDR ${CONNECTION_MANAGER_LIBS}) diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp deleted file mode 100644 index 1ff4bbf1de..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.cpp +++ /dev/null @@ -1,334 +0,0 @@ -/** -@author Lime Microsystems -@brief Stream board communications for Matlab -*/ - -#include "LMS_SDR.h" - -#include "lmsComms.h" -#include "LMS_StreamBoard.h" -#include "ringBuffer.h" -#include "IConnection.h" -#include "fifo.h" -#include "dataTypes.h" -#include -#include - -#include -#include -#include -#include -#include - -#define _USE_MATH_DEFINES -#include - -using namespace std; - -typedef enum -{ - LMS_SUCCESS = 0, - LMS_ERROR -} LMS_STATUS; - -LMS_SamplesFIFO rxBuffer(1); -static thread rxThread; -atomic rxStop(1); -atomic rxRunning(0); -atomic rxDroppedSamples(0); -atomic RxDataRate(0); -atomic rxSamplingRate(0); - -LMS_SamplesFIFO txBuffer(1); -static thread txThread; -atomic txStop(1); -atomic txRunning(0); -atomic txDroppedSamples(0); -atomic TxDataRate(0); -atomic txSamplingRate(0); - -LMScomms comPort(IConnection::COM_PORT); -LMScomms usbPort(IConnection::USB_PORT); -LMS_StreamBoard streamer(&usbPort); - -const int samplesInPacket = 1024; -unsigned int opMode = 0; - -DLL_EXPORT void LMS_Stats(uint32_t *RxBufSize, uint32_t *RxBufFilled, uint32_t *RxSamplingRate, uint32_t *TxBufSize, uint32_t *TxBufFilled, uint32_t *TxSamplingRate) -{ - LMS_SamplesFIFO::BufferInfo rxStats = rxBuffer.GetInfo(); - LMS_SamplesFIFO::BufferInfo txStats = txBuffer.GetInfo(); - if (RxBufSize) - *RxBufSize = rxStats.size*samplesInPacket; - if (RxBufFilled) - *RxBufFilled = rxStats.itemsFilled*samplesInPacket; - if (TxBufSize) - *TxBufSize = txStats.size*samplesInPacket; - if (TxBufFilled) - *TxBufFilled = txStats.itemsFilled*samplesInPacket; - if (TxSamplingRate) - *TxSamplingRate = txSamplingRate.load(); - if (RxSamplingRate) - *RxSamplingRate = rxSamplingRate.load(); -} - -DLL_EXPORT int LMS_Init(const int OperationMode, uint32_t trxBuffersLength) -{ - opMode = OperationMode; - unsigned int packetsNeeded = trxBuffersLength / samplesInPacket; - if (trxBuffersLength % samplesInPacket != 0) - ++packetsNeeded; - if (packetsNeeded >= (uint32_t)(1 << 31)) - packetsNeeded = (uint32_t)(1 << 31); - for (int i = 0; i < 32; ++i) - if ((1 << i) >= packetsNeeded) - { - packetsNeeded = (1 << i); - break; - } - rxBuffer.Reset(packetsNeeded); - txBuffer.Reset(packetsNeeded); - return LMS_SUCCESS; -} - -DLL_EXPORT int LMS_Destroy() -{ - LMS_RxStop(); - //buffers size is reduced to lower memory consumption when not used - rxBuffer.Reset(1); - txBuffer.Reset(1); - return LMS_SUCCESS; -} - -DLL_EXPORT LMScomms* LMS_GetUSBPort() -{ - return &usbPort; -} - -DLL_EXPORT LMScomms* LMS_GetCOMPort() -{ - return &comPort; -} - -const int maxDevListLen = 32; -const int maxDevNameLen = 256; //each device name not longer than 256 -static char DeviceNames[maxDevListLen][maxDevNameLen]; - -DLL_EXPORT int LMS_UpdateDeviceList(LMScomms* port) -{ - memset(DeviceNames, 0, maxDevListLen*maxDevNameLen); - port->Close(); - int devCount = port->RefreshDeviceList(); - vector names = port->GetDeviceList(); - int charsWritten = 0; - for (unsigned int i = 0; i < names.size() && i < maxDevListLen; ++i) - { - charsWritten += sprintf(DeviceNames[i], "[%i] %.*s", i, maxDevNameLen, names[i].c_str()); - } - return devCount; -} - -DLL_EXPORT const char* LMS_GetDeviceName(LMScomms* port, unsigned int deviceIndex) -{ - if (deviceIndex < maxDevListLen) - return DeviceNames[deviceIndex]; - else - return ""; -} - -DLL_EXPORT int LMS_DeviceOpen(LMScomms* port, const uint32_t deviceIndex) -{ - port->Close(); - int status = port->Open(deviceIndex); - if (status == 1) - { - return LMS_SUCCESS; - } - else - { - return LMS_ERROR; - } -} - -DLL_EXPORT void LMS_DeviceClose(LMScomms* port) -{ - port->Close(); -} - -DLL_EXPORT uint32_t LMS_ControlWrite(LMScomms* port, const uint8_t *buffer, const uint16_t bufLen) -{ - return port->Write(buffer, bufLen, 0); -} - -DLL_EXPORT uint32_t LMS_ControlRead(LMScomms* port, uint8_t* buffer, const uint16_t bufLen) -{ - return port->Read(buffer, bufLen, 0); -} - - - -const int RX_BUFF_SZ (1020*1024/4); -uint32_t rx_buffer[RX_BUFF_SZ]; -uint64_t start_timestamp = 0;; -uint32_t wr_pos = 0; -uint32_t rd_pos = 0; - -void ReceivePackets() -{ - rxRunning.store(true); - uint32_t samplesCollected = 0; - - const int bufferSize = 4096;// 4096; - const int buffersCount = 32; // must be power of 2 - const int buffersCountMask = buffersCount - 1; - int handles[buffersCount]= {0}; - char buffers[buffersCount*bufferSize]={0}; - - struct sched_param sp; - sp.sched_priority = sched_get_priority_max(SCHED_FIFO); - if (pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp)!=0) - { - printf("Shed prams failed\n"); - } - - //switch off Rx - uint16_t regVal = streamer.SPI_read(0x0005); - streamer.SPI_write(0x0005, regVal & ~0x6); - //USB FIFO reset - LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_USB_FIFO_RST; - ctrPkt.outBuffer.push_back(0x01); - usbPort.TransferPacket(ctrPkt); - ctrPkt.outBuffer[0] = 0x00; - usbPort.TransferPacket(ctrPkt); - - streamer.SPI_write(0x0005, regVal | 0x6); - - streamer.SPI_write(0x0001, 0x0001); - streamer.SPI_write(0x0007, 0x0000); - - for (int i = 0; i 0) - { - PacketLTE* pkt = (PacketLTE*)&buffers[bi*bufferSize]; - for(uint16_t sampleIndex = 0; sampleIndex < sizeof(pkt->samples)/sizeof(int16_t); sampleIndex++) - { - pkt->samples[sampleIndex] <<= 4; - pkt->samples[sampleIndex] >>= 4; - } - - rxBuffer.push_samples((complex16_t*)pkt->samples, 1020, pkt->counter, 100); - } - // Re-submit this request to keep the queue full - memset(&buffers[bi*bufferSize], 0, bufferSize); - handles[bi] = usbPort.BeginDataReading(&buffers[bi*bufferSize], bufferSize); - bi = (bi + 1) & buffersCountMask; - pthread_yield(); - } - - usbPort.AbortReading(); - for (int j = 0; jsamples)[index++]=(((uint32_t*)data)[i]& 0xFFF0FFF) | 0x1000; - - if (index == 1020) - { - pkt->counter = ts; - - if (bufferUsed[bi]) - { - if (usbPort.WaitForSending(handles[bi], 1000) == false) - return -1; - // Must always call FinishDataXfer to release memory of contexts[i] - long tempToSend = sizeof(PacketLTE); - usbPort.FinishDataSending(&buffers[bi*bufferSize], tempToSend, handles[bi]); - - bufferUsed[bi] = false; - } - handles[bi] = usbPort.BeginDataSending(&buffers[bi*bufferSize], sizeof(PacketLTE)); - bufferUsed[bi] = true; - bi = (bi + 1) & buffersCountMask; - pkt = (PacketLTE*)&buffers[bi*bufferSize]; - ts += 1020; - index = 0; - } - } -} - -vector PacketsBuffer(2048, PacketLTE()); -DLL_EXPORT uint32_t LMS_TRxRead(int16_t *buffer, const uint32_t samplesCount, const uint32_t antenna_id, uint64_t *timestamp, const uint32_t timeout_ms) -{ - if (usbPort.IsOpen() == false && opMode != -1) - return 0; - pthread_yield(); - uint32_t samplesPopped = rxBuffer.pop_samples((complex16_t*)buffer, samplesCount, timestamp, timeout_ms); - return samplesPopped; -} - - -DLL_EXPORT int LMS_RxStart() -{ - if (rxRunning.load()) - return 1; - if (usbPort.IsOpen() == false && opMode != -1) - return 1; - rxStop.store(false); - unsigned int bufSz = rxBuffer.GetInfo().size; - rxBuffer.Reset(bufSz); - rxThread = thread(ReceivePackets); - return 0; -} - -DLL_EXPORT int LMS_RxStop() -{ - if (rxRunning.load()) - { - if (rxThread.joinable()) - { - rxStop.store(true); - rxThread.join(); - } - rxStop.store(true); - } - return 0; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h deleted file mode 100644 index 27a72e351a..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_SDR.h +++ /dev/null @@ -1,143 +0,0 @@ -/** -@author Lime Microsystems -@brief Interface for implementing SDR using Lime microsystems boards -*/ - -#ifndef LMS_SDR_INTERFACE_H -#define LMS_SDR_INTERFACE_H - -#include - -#ifdef __cplusplus -class LMScomms; -#else -typedef void LMScomms; -#endif - -#define BUILD_DLL -#ifndef __unix__ -#ifdef BUILD_DLL - #define DLL_EXPORT __declspec(dllexport) -#else - #define DLL_EXPORT __declspec(dllimport) -#endif -#else -#define DLL_EXPORT -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** @brief Returns stats of internal buffers - @param RxBufSize Receiver buffer size in samples - @param RxBufFilled Number of samples currently in the receiver buffer - @param RxSamplingRate Approximate receiver sampling rate, calculated from incomming data - @param TxBufSize Transmitter buffer size in samples - @param TxBufFilled Number of samples currently in the transmitter buffer - @param TxSamplingRate Approximate transmitter sampling rate, calculated from incomming data -*/ -DLL_EXPORT void LMS_Stats(uint32_t *RxBufSize, uint32_t *RxBufFilled, uint32_t *RxSamplingRate, uint32_t *TxBufSize, uint32_t *TxBufFilled, uint32_t *TxSamplingRate); - -/** @brief Initializes internal memory for samples buffering to hardware - @param OperationMode samples transfering mode: 0-packets synchronized, 1-packets not synchronized - @param trxBuffersLength Rx and Tx internal buffers size in samples - @return 0 success, -1 failure - - Generally trxBuffersSamplesCount should be more than 65536 -*/ -DLL_EXPORT int LMS_Init(const int OperationMode, uint32_t trxBuffersLength); - -/** @brief Stops internal threads and frees internal buffers memory - @return 0 success, -1 failure -*/ -DLL_EXPORT int LMS_Destroy(); - -///@name Device connection -/** @return object for communicating over USB port -*/ -DLL_EXPORT LMScomms* LMS_GetUSBPort(); - -/** @return object for communicating over COM port -*/ -DLL_EXPORT LMScomms* LMS_GetCOMPort(); - -/** @brief Refreshes currently connected device list - @param port Communications port to update - @return number of devices connected -*/ -DLL_EXPORT int LMS_UpdateDeviceList(LMScomms* port); - -/** @brief Returns pointer to static null terminated c-string name of selected device - @param port Communications port object - @param deviceIndex index from communications port device list -*/ -DLL_EXPORT const char* LMS_GetDeviceName(LMScomms* port, unsigned int deviceIndex); - -/** @brief Connects to selected device on given port - @param port Communications port object - @param deviceIndex index from communications port device list - @return 0-success -*/ -DLL_EXPORT int LMS_DeviceOpen(LMScomms* port, const uint32_t deviceIndex); - -/** @brief Closes connection on given port - @param port Communications port to close -*/ -DLL_EXPORT void LMS_DeviceClose(LMScomms* port); -///@} - -///@name Communications -/** @brief Writes given data to control port - @param port Port for communications - @param buffer data to be written - @param bufLen buffer length in bytes - @return number of bytes written -*/ -DLL_EXPORT uint32_t LMS_ControlWrite(LMScomms* port, const uint8_t *buffer, const uint16_t bufLen); - -/** @brief Reads given data from SPI regiter - @param port Port for communications - @param buffer destination buffer for data - @param bufLen number of bytes to read - @return number of bytes read -*/ -DLL_EXPORT uint32_t LMS_ControlRead(LMScomms* port, uint8_t* buffer, const uint16_t bufLen); - -/** @brief Starts thread for samples receiving - @return 0-success -*/ -DLL_EXPORT int LMS_RxStart(); - -/** @brief Stops samples receiving thread - @return 0:success, 1:failed -*/ -DLL_EXPORT int LMS_RxStop(); - -/** @brief Adds given samples to transmitter buffer, to be sent at specified timestamp -@param buffer source array for interleaved values (IQIQIQ...), each value amplitude should be from -2048 to 2047 -@param samplesCount number of samples in buffer, 1 sample = 2 bytes I + 2 bytes Q -@param channel_id destination channel -@param timestamp timestamp when the first sample in buffer should be transmitted (used only in synchronized operating mode) -@param timeout_ms time amount in milliseconds to try adding samples -@return number of samples written -*/ -DLL_EXPORT uint32_t LMS_TRxWrite(const int16_t *buffer, const uint32_t samplesCount, const uint32_t channel_id, uint64_t timestamp); - -/** @brief Reads samples from receiver buffer -@param buffer destination array for interleaved values (IQIQIQ...), must be big enough to store requested number of samples, each value amplitude will be from -2048 to 2047 -@param samplesCount number of samples to read, 1 sample = 2 bytes I + 2 bytes Q -@param antenna_id source channel -@param timestamp returns timestamp of the first sample in the buffer (used only in synchronized operating mode) -@param timeout_ms time amount in milliseconds to try reading samples -@return number of samples read -*/ -DLL_EXPORT uint32_t LMS_TRxRead(int16_t *buffer, const uint32_t samplesCount, const uint32_t channel_id, uint64_t *timestamp, const uint32_t timeout_ms); - -///@} - -#ifdef __cplusplus -} //extern "C" -#endif - -#endif //LMS_SDR_INTERFACE_H diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt deleted file mode 100644 index 02e6bb5ab9..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -set(streamBoard_src_files - LMS_StreamBoard.cpp -) - -add_library(LMS_StreamBoard STATIC ${streamBoard_src_files}) -target_include_directories(LMS_StreamBoard PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -target_link_libraries(LMS_StreamBoard ConnectionManager) - -if(WIN32 AND ENABLE_USB_CONNECTION) - find_package(CyAPI REQUIRED) - LINK_DIRECTORIES(${CYAPI_LIBRARIES}) - include_directories(${CYAPI_INCLUDE_DIRS}) - set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI) - target_link_libraries(LMS_StreamBoard ${CONNECTION_MANAGER_LIBS}) -endif() -if(UNIX AND ENABLE_USB_CONNECTION) - set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread) - target_link_libraries(LMS_StreamBoard ${CONNECTION_MANAGER_LIBS}) -endif() - - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.cpp deleted file mode 100644 index da9e4a7b8e..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.cpp +++ /dev/null @@ -1,770 +0,0 @@ -#include "LMS_StreamBoard.h" -#include "lmsComms.h" -#include "lms7002_defines.h" -#include -#include - -/** @brief Configures Stream board FPGA clocks - @param serPort Communications port to send data - @param fOutTx_MHz transmitter frequency in MHz - @param fOutRx_MHz receiver frequency in MHz - @param phaseShift_deg IQ phase shift in degrees - @return 0-success, other-failure -*/ -LMS_StreamBoard::Status LMS_StreamBoard::ConfigurePLL(LMScomms *serPort, const float fOutTx_MHz, const float fOutRx_MHz, const float phaseShift_deg) -{ - assert(serPort != nullptr); - if (serPort == NULL) - return FAILURE; - if (serPort->IsOpen() == false) - return FAILURE; - const float vcoLimits_MHz[2] = { 600, 1300 }; - int M, C; - const short bufSize = 64; - - float fOut_MHz = fOutTx_MHz; - float coef = 0.8*vcoLimits_MHz[1] / fOut_MHz; - M = C = (int)coef; - int chigh = (((int)coef) / 2) + ((int)(coef) % 2); - int clow = ((int)coef) / 2; - - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_BRDSPI_WR; - - if (fOut_MHz*M > vcoLimits_MHz[0] && fOut_MHz*M < vcoLimits_MHz[1]) - { - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x0F); - pkt.outBuffer.push_back(0x15); //c4-c2_bypassed - pkt.outBuffer.push_back(0x01 | ((M % 2 != 0) ? 0x08 : 0x00) | ((C % 2 != 0) ? 0x20 : 0x00)); //N_bypassed - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x08); - pkt.outBuffer.push_back(1); //N_high_cnt - pkt.outBuffer.push_back(1);//N_low_cnt - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x09); - pkt.outBuffer.push_back(chigh); //M_high_cnt - pkt.outBuffer.push_back(clow); //M_low_cnt - for (int i = 0; i <= 1; ++i) - { - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x0A + i); - pkt.outBuffer.push_back(chigh); //cX_high_cnt - pkt.outBuffer.push_back(clow); //cX_low_cnt - } - - float Fstep_us = 1 / (8 * fOutTx_MHz*C); - float Fstep_deg = (360 * Fstep_us) / (1 / fOutTx_MHz); - short nSteps = phaseShift_deg / Fstep_deg; - unsigned short reg2 = 0x0400 | (nSteps & 0x3FF); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x02); - pkt.outBuffer.push_back((reg2 >> 8)); - pkt.outBuffer.push_back(reg2); //phase - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x03); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x01); - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x03); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x00); - - reg2 = reg2 | 0x800; - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x02); - pkt.outBuffer.push_back((reg2 >> 8)); - pkt.outBuffer.push_back(reg2); - - if(serPort->TransferPacket(pkt) != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) - return FAILURE; - } - else - return FAILURE; - - fOut_MHz = fOutRx_MHz; - coef = 0.8*vcoLimits_MHz[1] / fOut_MHz; - M = C = (int)coef; - chigh = (((int)coef) / 2) + ((int)(coef) % 2); - clow = ((int)coef) / 2; - if (fOut_MHz*M > vcoLimits_MHz[0] && fOut_MHz*M < vcoLimits_MHz[1]) - { - short index = 0; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x0F); - pkt.outBuffer.push_back(0x15); //c4-c2_bypassed - pkt.outBuffer.push_back(0x41 | ((M % 2 != 0) ? 0x08 : 0x00) | ((C % 2 != 0) ? 0x20 : 0x00)); //N_bypassed, c1 bypassed - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x08); - pkt.outBuffer.push_back(1); //N_high_cnt - pkt.outBuffer.push_back(1);//N_low_cnt - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x09); - pkt.outBuffer.push_back(chigh); //M_high_cnt - pkt.outBuffer.push_back(clow); //M_low_cnt - for (int i = 0; i <= 1; ++i) - { - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x0A + i); - pkt.outBuffer.push_back(chigh); //cX_high_cnt - pkt.outBuffer.push_back(clow); //cX_low_cnt - } - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x03); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x02); - - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x03); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x00); - - if (serPort->TransferPacket(pkt) != LMScomms::TRANSFER_SUCCESS || pkt.status != STATUS_COMPLETED_CMD) - return FAILURE; - } - else - return FAILURE; - return SUCCESS; -} - -/** @brief Captures IQ samples from Stream board, this is blocking function, it blocks until desired frames count is captured - @param isamples destination array for I samples, must be big enough to contain samplesCount - @param qsamples destination array for Q samples, must be big enough to contain samplesCount - @param framesCount number of IQ frames to capture - @param frameStart frame start indicator 0 or 1 - @return 0-success, other-failure -*/ -LMS_StreamBoard::Status LMS_StreamBoard::CaptureIQSamples(LMScomms *dataPort, int16_t *isamples, int16_t *qsamples, const uint32_t framesCount, const bool frameStart) -{ - assert(dataPort != nullptr); - if (dataPort == NULL) - return FAILURE; - if (dataPort->IsOpen() == false) - return FAILURE; - - int16_t sample_value; - const uint32_t bufSize = framesCount * 2 * sizeof(uint16_t); - char *buffer = new char[bufSize]; - if (buffer == 0) - { -#ifndef NDEBUG - std::cout << "Failed to allocate memory for samples buffer" << std::endl; -#endif - return FAILURE; - } - memset(buffer, 0, bufSize); - - LMScomms::GenericPacket pkt; - pkt.cmd = CMD_BRDSPI_RD; - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - dataPort->TransferPacket(pkt); - if (pkt.status != STATUS_COMPLETED_CMD) - return FAILURE; - - uint16_t regVal = (pkt.inBuffer[2] * 256) + pkt.inBuffer[3]; - pkt.cmd = CMD_BRDSPI_WR; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - pkt.outBuffer.push_back(0); - pkt.outBuffer.push_back(regVal | 0x4); - dataPort->TransferPacket(pkt); - if (pkt.status != STATUS_COMPLETED_CMD) - return FAILURE; - - int bytesReceived = 0; - for(int i = 0; i<3; ++i) - bytesReceived = dataPort->ReadStream(buffer, bufSize, 5000); - if (bytesReceived > 0) - { - bool iqSelect = false; - int16_t frameCounter = 0; - for (uint32_t b = 0; b < bufSize;) - { - sample_value = buffer[b++] & 0xFF; - sample_value |= (buffer[b++] & 0x0F) << 8; - sample_value = sample_value << 4; //shift left then right to fill sign bits - sample_value = sample_value >> 4; - if (iqSelect == false) - isamples[frameCounter] = sample_value; - else - qsamples[frameCounter] = sample_value; - frameCounter += iqSelect; - iqSelect = !iqSelect; - } - } - pkt.cmd = CMD_BRDSPI_RD; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x01); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - dataPort->TransferPacket(pkt); - - regVal = (pkt.inBuffer[2] * 256) + pkt.inBuffer[3]; - pkt.cmd = CMD_BRDSPI_WR; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - pkt.outBuffer.push_back(0); - pkt.outBuffer.push_back(regVal & ~0x4); - dataPort->TransferPacket(pkt); - - delete[] buffer; - return SUCCESS; -} - -/** @brief Blocking operation to upload IQ samples to Stream board RAM - @param serPort port to use for communication - @param isamples I channel samples - @param qsamples Q channel samples - @param framesCount number of samples in arrays - @return 0-success, other-failure -*/ -LMS_StreamBoard::Status LMS_StreamBoard::UploadIQSamples(LMScomms* serPort, int16_t *isamples, int16_t *qsamples, const uint32_t framesCount) -{ - int bufferSize = framesCount * 2; - uint16_t *buffer = new uint16_t[bufferSize]; - memset(buffer, 0, bufferSize*sizeof(uint16_t)); - int bufPos = 0; - for (unsigned i = 0; iTransferPacket(pkt); - pkt.cmd = CMD_BRDSPI_WR; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - pkt.outBuffer.push_back(pkt.inBuffer[2]); - pkt.outBuffer.push_back(pkt.inBuffer[3] & ~0x7); - serPort->TransferPacket(pkt); - - while (sent packetSize ? packetSize : outLen - sent; - long toSend = toSendBytes; - int context = serPort->BeginDataSending(&outBuf[sent], toSend); - if (serPort->WaitForSending(context, 5000) == false) - { - success = false; - serPort->FinishDataSending(&outBuf[sent], toSend, context); - break; - } - sent += serPort->FinishDataSending(&outBuf[sent], toSend, context); - } - - pkt.cmd = CMD_BRDSPI_RD; - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - - serPort->TransferPacket(pkt); - pkt.cmd = CMD_BRDSPI_WR; - pkt.outBuffer.clear(); - pkt.outBuffer.push_back(0x00); - pkt.outBuffer.push_back(0x05); - pkt.outBuffer.push_back(pkt.inBuffer[2]); - pkt.outBuffer.push_back(pkt.inBuffer[3] | 0x3); - serPort->TransferPacket(pkt); - return success ? SUCCESS : FAILURE; -} - -LMS_StreamBoard::LMS_StreamBoard(LMScomms* dataPort) -{ - mRxFrameStart.store(true); - mDataPort = dataPort; - mRxFIFO = new LMS_StreamBoard_FIFO(1024*4); - mTxFIFO = new LMS_StreamBoard_FIFO(1024*4); - mStreamRunning.store(false); - mTxCyclicRunning.store(false); -} - -LMS_StreamBoard::~LMS_StreamBoard() -{ - StopReceiving(); - delete mRxFIFO; - delete mTxFIFO; -} - -/** @brief Crates threads for packets receiving, processing and transmitting -*/ -LMS_StreamBoard::Status LMS_StreamBoard::StartReceiving(unsigned int fftSize) -{ - if (mStreamRunning.load() == true) - return FAILURE; - if (mDataPort->IsOpen() == false) - return FAILURE; - mRxFIFO->reset(); - stopRx.store(false); - threadRx = std::thread(ReceivePackets, this); - mStreamRunning.store(true); - return SUCCESS; -} - -/** @brief Stops receiving, processing and transmitting threads -*/ -LMS_StreamBoard::Status LMS_StreamBoard::StopReceiving() -{ - if (mStreamRunning.load() == false) - return FAILURE; - stopTx.store(true); - stopRx.store(true); - threadRx.join(); - mStreamRunning.store(false); - return SUCCESS; -} - -/** @brief Function dedicated for receiving data samples from board -*/ -void LMS_StreamBoard::ReceivePackets(LMS_StreamBoard* pthis) -{ - SamplesPacket pkt; - int samplesCollected = 0; - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - - const int buffer_size = 65536;// 4096; - const int buffers_count = 16; // must be power of 2 - const int buffers_count_mask = buffers_count - 1; - int handles[buffers_count]; - memset(handles, 0, sizeof(int)*buffers_count); - char *buffers = NULL; - buffers = new char[buffers_count*buffer_size]; - if (buffers == 0) - { - printf("error allocating buffers\n"); - return; - } - memset(buffers, 0, buffers_count*buffer_size); - - //USB FIFO reset - LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_USB_FIFO_RST; - ctrPkt.outBuffer.push_back(0x01); - pthis->mDataPort->TransferPacket(ctrPkt); - ctrPkt.outBuffer[0] = 0x00; - pthis->mDataPort->TransferPacket(ctrPkt); - - uint16_t regVal = pthis->SPI_read(0x0005); - pthis->SPI_write(0x0005, regVal | 0x4); - - for (int i = 0; imDataPort->BeginDataReading(&buffers[i*buffer_size], buffer_size); - - int bi = 0; - int packetsReceived = 0; - unsigned long BytesReceived = 0; - int m_bufferFailures = 0; - short sample; - - bool frameStart = pthis->mRxFrameStart.load(); - while (pthis->stopRx.load() == false) - { - if (pthis->mDataPort->WaitForReading(handles[bi], 1000) == false) - ++m_bufferFailures; - - long bytesToRead = buffer_size; - long bytesReceived = pthis->mDataPort->FinishDataReading(&buffers[bi*buffer_size], bytesToRead, handles[bi]); - if (bytesReceived > 0) - { - ++packetsReceived; - BytesReceived += bytesReceived; - char* bufStart = &buffers[bi*buffer_size]; - - for (int p = 0; p < bytesReceived; p+=2) - { - if (samplesCollected == 0) //find frame start - { - int frameStartOffset = FindFrameStart(&bufStart[p], bytesReceived-p, frameStart); - if (frameStartOffset < 0) - break; //frame start was not found, move on to next buffer - p += frameStartOffset; - } - sample = (bufStart[p+1] & 0x0F); - sample = sample << 8; - sample |= (bufStart[p] & 0xFF); - sample = sample << 4; - sample = sample >> 4; - pkt.iqdata[samplesCollected] = sample; - ++samplesCollected; - if (pkt.samplesCount == samplesCollected) - { - samplesCollected = 0; - if (pthis->mRxFIFO->push_back(pkt, 200) == false) - ++m_bufferFailures; - } - } - } - else - { - ++m_bufferFailures; - } - - t2 = chrono::high_resolution_clock::now(); - long timePeriod = std::chrono::duration_cast(t2 - t1).count(); - if (timePeriod >= 1000) - { - // periodically update frame start, user might change it during operation - frameStart = pthis->mRxFrameStart.load(); - float m_dataRate = 1000.0*BytesReceived / timePeriod; - t1 = t2; - BytesReceived = 0; - LMS_StreamBoard_FIFO::Status rxstats = pthis->mRxFIFO->GetStatus(); - - pthis->mRxDataRate.store(m_dataRate); - pthis->mRxFIFOfilled.store(100.0*rxstats.filledElements / rxstats.maxElements); -#ifndef NDEBUG - printf("Rx: %.1f%% \t rate: %.0f kB/s failures:%i\n", 100.0*rxstats.filledElements / rxstats.maxElements, m_dataRate / 1000.0, m_bufferFailures); -#endif - m_bufferFailures = 0; - } - - // Re-submit this request to keep the queue full - memset(&buffers[bi*buffer_size], 0, buffer_size); - handles[bi] = pthis->mDataPort->BeginDataReading(&buffers[bi*buffer_size], buffer_size); - bi = (bi + 1) & buffers_count_mask; - } - pthis->mDataPort->AbortReading(); - for (int j = 0; jmDataPort->WaitForReading(handles[j], 1000); - pthis->mDataPort->FinishDataReading(&buffers[j*buffer_size], bytesToRead, handles[j]); - } - - regVal = pthis->SPI_read(0x0005); - pthis->SPI_write(0x0005, regVal & ~0x4); - - delete[] buffers; -#ifndef NDEBUG - printf("Rx finished\n"); -#endif -} - -/** @brief Function dedicated for transmitting samples to board -*/ -void LMS_StreamBoard::TransmitPackets(LMS_StreamBoard* pthis) -{ - const int packetsToBatch = 16; - const int buffer_size = sizeof(SamplesPacket)*packetsToBatch; - const int buffers_count = 16; // must be power of 2 - const int buffers_count_mask = buffers_count - 1; - int handles[buffers_count]; - memset(handles, 0, sizeof(int)*buffers_count); - char *buffers = NULL; - buffers = new char[buffers_count*buffer_size]; - if (buffers == 0) - { - printf("error allocating buffers\n"); - } - memset(buffers, 0, buffers_count*buffer_size); - bool *bufferUsed = new bool[buffers_count]; - memset(bufferUsed, 0, sizeof(bool)*buffers_count); - - int bi = 0; //buffer index - - SamplesPacket* pkt = new SamplesPacket[packetsToBatch]; - int m_bufferFailures = 0; - long bytesSent = 0; - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - long totalBytesSent = 0; - - unsigned long outputCounter = 0; - - while (pthis->stopTx.load() == false) - { - for (int i = 0; i < packetsToBatch; ++i) - { - if (pthis->mTxFIFO->pop_front(&pkt[i], 200) == false) - { - printf("Error popping from TX\n"); - if (pthis->stopTx.load() == false) - break; - continue; - } - } - //wait for desired slot buffer to be transferred - if (bufferUsed[bi]) - { - if (pthis->mDataPort->WaitForSending(handles[bi], 1000) == false) - { - ++m_bufferFailures; - } - // Must always call FinishDataXfer to release memory of contexts[i] - long bytesToSend = buffer_size; - bytesSent = pthis->mDataPort->FinishDataSending(&buffers[bi*buffer_size], bytesToSend, handles[bi]); - if (bytesSent > 0) - totalBytesSent += bytesSent; - else - ++m_bufferFailures; - bufferUsed[bi] = false; - } - - memcpy(&buffers[bi*buffer_size], &pkt[0], sizeof(SamplesPacket)*packetsToBatch); - handles[bi] = pthis->mDataPort->BeginDataSending(&buffers[bi*buffer_size], buffer_size); - bufferUsed[bi] = true; - - t2 = chrono::high_resolution_clock::now(); - long timePeriod = std::chrono::duration_cast(t2 - t1).count(); - if (timePeriod >= 1000) - { - float m_dataRate = 1000.0*totalBytesSent / timePeriod; - t1 = t2; - totalBytesSent = 0; -#ifndef NDEBUG - cout << "Tx rate: " << m_dataRate / 1000 << " kB/s\t failures: " << m_bufferFailures << endl; -#endif - LMS_StreamBoard_FIFO::Status txstats = pthis->mTxFIFO->GetStatus(); - pthis->mTxDataRate.store(m_dataRate); - pthis->mTxFIFOfilled.store(100.0*txstats.filledElements / txstats.maxElements); - m_bufferFailures = 0; - } - bi = (bi + 1) & buffers_count_mask; - } - - // Wait for all the queued requests to be cancelled - pthis->mDataPort->AbortSending(); - for (int j = 0; jmDataPort->WaitForSending(handles[j], 1000); - pthis->mDataPort->FinishDataSending(&buffers[j*buffer_size], bytesToSend, handles[j]); - } - } - - delete[] buffers; - delete[] bufferUsed; - delete[] pkt; -#ifndef NDEBUG - printf("Tx finished\n"); -#endif -} - -/** @brief Returns current data state for user interface -*/ -LMS_StreamBoard::DataToGUI LMS_StreamBoard::GetIncomingData() -{ - std::unique_lock lck(mLockIncomingPacket); - return mIncomingPacket; -} - -/** @brief Returns data rate info and Tx Rx FIFO fill percentage -*/ -LMS_StreamBoard::ProgressStats LMS_StreamBoard::GetStats() -{ - ProgressStats stats; - stats.RxRate_Bps = mRxDataRate.load(); - stats.TxRate_Bps = mTxDataRate.load(); - stats.RxFIFOfilled = mRxFIFOfilled.load(); - stats.TxFIFOfilled = mTxFIFOfilled.load(); - return stats; -} - -/** @brief Helper function to write board spi regiters - @param address spi address - @param data register value -*/ -LMS_StreamBoard::Status LMS_StreamBoard::SPI_write(uint16_t address, uint16_t data) -{ - assert(mDataPort != nullptr); - LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_BRDSPI_WR; - ctrPkt.outBuffer.push_back((address >> 8) & 0xFF); - ctrPkt.outBuffer.push_back(address & 0xFF); - ctrPkt.outBuffer.push_back((data >> 8) & 0xFF); - ctrPkt.outBuffer.push_back(data & 0xFF); - mDataPort->TransferPacket(ctrPkt); - return ctrPkt.status == 1 ? SUCCESS : FAILURE; -} - -/** @brief Helper function to read board spi registers - @param address spi address - @return register value -*/ -uint16_t LMS_StreamBoard::SPI_read(uint16_t address) -{ - assert(mDataPort != nullptr); - LMScomms::GenericPacket ctrPkt; - ctrPkt.cmd = CMD_BRDSPI_RD; - ctrPkt.outBuffer.push_back((address >> 8) & 0xFF); - ctrPkt.outBuffer.push_back(address & 0xFF); - mDataPort->TransferPacket(ctrPkt); - if (ctrPkt.status == STATUS_COMPLETED_CMD && ctrPkt.inBuffer.size() >= 4) - return ctrPkt.inBuffer[2] * 256 + ctrPkt.inBuffer[3]; - else - return 0; -} - -/** @brief Changes which frame start to look for when receiving data -*/ -void LMS_StreamBoard::SetRxFrameStart(const bool startValue) -{ - mRxFrameStart.store(startValue); -} - -/** @brief Searches for frame start index in given buffer - @return frameStart index in buffer, -1 if frame start was not found - Frame start indicator is 13th bit inside each I and Q sample -*/ -int LMS_StreamBoard::FindFrameStart(const char* buffer, const int bufLen, const bool frameStart) -{ - int startIndex = -1; - for (int i = 0; i < bufLen; i+=2) - if ((buffer[i+1] & 0x10)>0 == frameStart) - { - startIndex = i; - break; - } - return startIndex; -} - -/** @brief Starts a thread for continuous cyclic transmitting of given samples - @param isamples I channel samples - @param qsamples Q channel samples - @param framesCount number of samples in given arrays - @return 0:success, other:failure -*/ -LMS_StreamBoard::Status LMS_StreamBoard::StartCyclicTransmitting(const int16_t* isamples, const int16_t* qsamples, uint32_t framesCount) -{ - if (mDataPort->IsOpen() == false) - return FAILURE; - - stopTxCyclic.store(false); - threadTxCyclic = std::thread([](LMS_StreamBoard* pthis) - { - const int buffer_size = 65536; - const int buffers_count = 16; // must be power of 2 - const int buffers_count_mask = buffers_count - 1; - int handles[buffers_count]; - memset(handles, 0, sizeof(int)*buffers_count); - char *buffers = NULL; - buffers = new char[buffers_count*buffer_size]; - if (buffers == 0) - { - printf("error allocating buffers\n"); - return 0; - } - memset(buffers, 0, buffers_count*buffer_size); - - //timers for data rate calculation - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - - int bi = 0; //buffer index - - //setup output data - int dataIndex = 0; - for (int i = 0; i < buffers_count; ++i) - { - for (int j = 0; j < buffer_size; ++j) - { - buffers[i*buffer_size + j] = pthis->mCyclicTransmittingSourceData[dataIndex]; - ++dataIndex; - if (dataIndex > pthis->mCyclicTransmittingSourceData.size()) - dataIndex = 0; - } - } - - for (int i = 0; i < buffers_count; ++i) - handles[i] = pthis->mDataPort->BeginDataSending(&buffers[i*buffer_size], buffer_size); - - int m_bufferFailures = 0; - int bytesSent = 0; - int totalBytesSent = 0; - int sleepTime = 200; - while (pthis->stopTxCyclic.load() != true) - { - if (pthis->mDataPort->WaitForSending(handles[bi], 1000) == false) - { - ++m_bufferFailures; - } - long bytesToSend = buffer_size; - bytesSent = pthis->mDataPort->FinishDataSending(&buffers[bi*buffer_size], bytesToSend, handles[bi]); - if (bytesSent > 0) - totalBytesSent += bytesSent; - else - { - ++m_bufferFailures; - } - - t2 = chrono::high_resolution_clock::now(); - long timePeriod = std::chrono::duration_cast(t2 - t1).count(); - if (timePeriod >= 1000) - { - pthis->mTxDataRate.store(1000.0*totalBytesSent / timePeriod); - t1 = t2; - totalBytesSent = 0; -#ifndef NDEBUG - printf("Upload rate: %f\t failures:%li\n", 1000.0*totalBytesSent / timePeriod, m_bufferFailures); -#endif - m_bufferFailures = 0; - } - - //fill up next buffer - for (int j = 0; j < buffer_size; ++j) - { - buffers[bi*buffer_size + j] = pthis->mCyclicTransmittingSourceData[dataIndex]; - ++dataIndex; - if (dataIndex >= pthis->mCyclicTransmittingSourceData.size()) - dataIndex = 0; - } - - // Re-submit this request to keep the queue full - handles[bi] = pthis->mDataPort->BeginDataSending(&buffers[bi*buffer_size], buffer_size); - bi = (bi + 1) & buffers_count_mask; - } - - // Wait for all the queued requests to be cancelled - pthis->mDataPort->AbortSending(); - for (int j = 0; j < buffers_count; j++) - { - long bytesToSend = buffer_size; - pthis->mDataPort->WaitForSending(handles[j], 1000); - pthis->mDataPort->FinishDataSending(&buffers[j*buffer_size], bytesToSend, handles[j]); - } -#ifndef NDEBUG - printf("Cyclic transmitting FULLY STOPPED\n"); -#endif - delete[] buffers; - return 0; - }, this); - mTxCyclicRunning.store(true); - - return LMS_StreamBoard::SUCCESS; -} - -/** @brief Stops cyclic transmitting thread -*/ -LMS_StreamBoard::Status LMS_StreamBoard::StopCyclicTransmitting() -{ - stopTxCyclic.store(true); - if (mTxCyclicRunning.load() == true) - { - threadTxCyclic.join(); - mTxCyclicRunning.store(false); - } - return LMS_StreamBoard::SUCCESS; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h deleted file mode 100644 index 99b3636336..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef STREAM_BOARD_API_H -#define STREAM_BOARD_API_H - -#include -#include -#include -#include -#include "LMS_StreamBoard_FIFO.h" - -class LMScomms; - -class LMS_StreamBoard -{ -public: - struct SamplesPacket - { - public: - SamplesPacket() : channel(0) - {} - ~SamplesPacket() - {} - - SamplesPacket& operator=(const SamplesPacket& obj) - { - memcpy(this->iqdata, obj.iqdata, sizeof(float)*samplesCount); - this->channel = obj.channel; - return *this; - } - const static int samplesCount = 32768; - float iqdata[samplesCount]; - int channel; - }; - - - enum Status - { - SUCCESS, - FAILURE, - }; - - static Status CaptureIQSamples(LMScomms* serPort, int16_t *isamples, int16_t *qsamples, uint32_t framesCount, bool frameStart); - static Status UploadIQSamples(LMScomms* serPort, int16_t *isamples, int16_t *qsamples, uint32_t framesCount); - static Status ConfigurePLL(LMScomms *serPort, const float fOutTx_MHz, const float fOutRx_MHz, const float phaseShift_deg); - - struct DataToGUI - { - std::vector samplesI; - std::vector samplesQ; - std::vector fftBins_dbFS; - float nyquist_MHz; - }; - - struct ProgressStats - { - float RxRate_Bps; - float TxRate_Bps; - float RxFIFOfilled; - float TxFIFOfilled; - }; - - LMS_StreamBoard(LMScomms* dataPort); - virtual ~LMS_StreamBoard(); - - void SetRxFrameStart(const bool startValue); - virtual Status StartReceiving(unsigned int fftSize); - virtual Status StopReceiving(); - - virtual Status StartCyclicTransmitting(const int16_t* isamples, const int16_t* qsamples, uint32_t framesCount); - virtual Status StopCyclicTransmitting(); - - DataToGUI GetIncomingData(); - ProgressStats GetStats(); - - Status SPI_write(uint16_t address, uint16_t data); - uint16_t SPI_read(uint16_t address); -protected: - static int FindFrameStart(const char* buffer, const int bufLen, const bool frameStart); - std::mutex mLockIncomingPacket; - DataToGUI mIncomingPacket; - - LMS_StreamBoard_FIFO *mRxFIFO; - LMS_StreamBoard_FIFO *mTxFIFO; - - static void ReceivePackets(LMS_StreamBoard* pthis); - static void TransmitPackets(LMS_StreamBoard* pthis); - - std::atomic_bool mRxFrameStart; - std::atomic_bool mStreamRunning; - std::atomic_bool stopRx; - std::atomic_bool stopTx; - - std::thread threadRx; - std::thread threadTx; - LMScomms* mDataPort; - - std::atomic mRxDataRate; - std::atomic mTxDataRate; - std::atomic mRxFIFOfilled; - std::atomic mTxFIFOfilled; - - std::vector mCyclicTransmittingSourceData; - std::atomic_bool mTxCyclicRunning; - std::thread threadTxCyclic; - std::atomic_bool stopTxCyclic; -}; -#endif - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard_FIFO.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard_FIFO.h deleted file mode 100644 index 833f7a37c0..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/LMS_StreamBoard_FIFO.h +++ /dev/null @@ -1,122 +0,0 @@ -/** -@file LMS_StreamBoard_FIFO.h -@author Lime Microsystems (www.limemicro.com) -@brief blocking FIFO for packets storing -*/ - -#ifndef LMS_STREAMBOARD_FIFO_H -#define LMS_STREAMBOARD_FIFO_H - -#include -#include -#include -#include -#include -#include -#include - -template -class LMS_StreamBoard_FIFO -{ -private: - LMS_StreamBoard_FIFO(){}; -public: - struct Status - { - uint32_t maxElements; - uint32_t filledElements; - uint32_t head; - uint32_t tail; - }; - - LMS_StreamBoard_FIFO(uint64_t FIFO_length) - { - mHead = 0; - mTail = 0; - mElements.resize(FIFO_length); - mElementsFilled = 0; - } - - ~LMS_StreamBoard_FIFO() - { - - } - - /** @brief Copies given src element to queue. - @param src Source data - @return true if element was inserted - - Copies element to queue. This function blocks until element is copied to - queue or certain amount of time has passed. - */ - bool push_back(const T &src, unsigned int timeout_ms = 200) - { - std::unique_lock lck(mElementsLock); - while (mElementsFilled == mElements.size()) - { - if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return false; - } - memcpy(&mElements[mTail], &src, sizeof(T)); - mTail = (mTail+1) % mElements.size(); - ++mElementsFilled; - canRead.notify_one(); - return true; - } - - /** @brief Copies and removes first element from queue to dest. - @param dest destination container for data - @return true if element was copied - Copies element from queue to destination and then removes it. - This function blocks until element is returned, or certain amount of time - has passed. - */ - bool pop_front(T *dest, unsigned int timeout_ms = 200) - { - assert(dest != nullptr); - std::unique_lock lck(mElementsLock); - while (mElementsFilled == 0) - { - if (canRead.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return false; - } - if (mElementsFilled == 0) - return false; - *dest = mElements[mHead]; - memcpy(dest, &mElements[mHead], sizeof(T)); - mHead = (mHead + 1) % mElements.size(); - --mElementsFilled; - canWrite.notify_one(); - return true; - } - void reset() - { - std::unique_lock lck(mElementsLock); - mElementsFilled = 0; - mHead = 0; - mTail = 0; - } - - Status GetStatus() - { - Status stats; - std::unique_lock lck(mElementsLock); - stats.maxElements = mElements.size(); - stats.filledElements = mElementsFilled; - stats.head = mHead; - stats.tail = mTail; - return stats; - }; - -protected: - uint32_t mHead; //reading pos - uint32_t mTail; //writing pos - uint32_t mElementsFilled; - - std::mutex mElementsLock; // condition variable for critical section - std::vector mElements; - std::condition_variable canWrite; - std::condition_variable canRead; -}; - -#endif // LMS_STREAMBOARD_FIFO_H diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/lms7002_defines.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/lms7002_defines.h deleted file mode 100644 index c098dfe965..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/LMS_StreamBoard/lms7002_defines.h +++ /dev/null @@ -1,215 +0,0 @@ -/** -@file lms7002_defines.h -@author Lime Microsystems -@brief enumerations of available LMS7002M commands and statuses -*/ -#pragma once - -const int LMS_RST_DEACTIVATE = 0; -const int LMS_RST_ACTIVATE = 1; -const int LMS_RST_PULSE = 2; - -enum eLMS_DEV -{ - LMS_DEV_UNKNOWN, - LMS_DEV_EVB6, - LMS_DEV_DIGIGREEN, - LMS_DEV_DIGIRED, - LMS_DEV_EVB7, - LMS_DEV_ZIPPER, - LMS_DEV_SOCKETBOARD, - LMS_DEV_EVB7V2, - LMS_DEV_STREAM, - LMS_DEV_NOVENA, - LMS_DEV_DATASPARK, - LMS_DEV_RFSPARK, - LMS_DEV_LMS6002USB, - LMS_DEV_RFESPARK, - - LMS_DEV_COUNT -}; - -const char LMS_DEV_NAMES[][80] = -{ - "UNKNOWN", - "EVB6", - "DigiGreen", - "DigiRed", - "EVB7", - "ZIPPER", - "Socket Board", - "EVB7_v2", - "Stream", - "Novena", - "DataSpark", - "RF-Spark", - "LMS6002-USB Stick", - "RF-ESpark" -}; - -static const char* GetDeviceName(const eLMS_DEV device) -{ - if (LMS_DEV_UNKNOWN < device && device < LMS_DEV_COUNT) - return LMS_DEV_NAMES[device]; - else - return LMS_DEV_NAMES[LMS_DEV_UNKNOWN]; -} - -enum eEXP_BOARD -{ - EXP_BOARD_UNKNOWN, - EXP_BOARD_UNSUPPORTED, - EXP_BOARD_NO, - EXP_BOARD_MYRIAD1, - EXP_BOARD_MYRIAD2, - EXP_BOARD_MYRIAD_NOVENA, - EXP_BOARD_HPM1000, - EXP_BOARD_MYRIAD7, - EXP_BOARD_HPM7, - - EXP_BOARD_COUNT -}; - -const char EXP_BOARD_NAMES[][80] = -{ - "UNKNOWN", - "UNSUPPORTED", - "NOT AVAILABLE", - "Myriad1", - "Myriad2", - "Novena", - "HPM1000", - "Myriad7", - "HMP7" -}; - -static const char* GetExpansionBoardName(const eEXP_BOARD board) -{ - if (EXP_BOARD_UNKNOWN < board && board < EXP_BOARD_COUNT) - return EXP_BOARD_NAMES[board]; - else - return EXP_BOARD_NAMES[EXP_BOARD_UNKNOWN]; -} - -struct LMS64C_Info -{ - unsigned char firmware; - unsigned char deviceType; - unsigned char protocol; - unsigned char hardware; - unsigned char expansionBoard; -}; - -enum eCMD_LMS -{ - CMD_GET_INFO = 0x00, - CMD_LMS6002_RST = 0x10, - ///Writes data to SI5356 synthesizer via I2C - CMD_SI5356_WR = 0x11, - ///Reads data from SI5356 synthesizer via I2C - CMD_SI5356_RD = 0x12, - ///Writes data to SI5351 synthesizer via I2C - CMD_SI5351_WR = 0x13, - ///Reads data from SI5351 synthesizer via I2C - CMD_SI5351_RD = 0x14, - ///PanelBus DVI (HDMI) Transmitter control - CMD_TFP410_WR = 0x15, - ///PanelBus DVI (HDMI) Transmitter control - CMD_TFP410_RD = 0x16, - ///Sets new LMS7002M chip’s RESET pin level (0, 1, pulse) - CMD_LMS7002_RST = 0x20, - ///Writes data to LMS7002M chip via SPI - CMD_LMS7002_WR = 0x21, - ///Reads data from LMS7002M chip via SPI - CMD_LMS7002_RD = 0x22, - ///Writes data to LMS6002 chip via SPI - CMD_LMS6002_WR = 0x23, - ///Reads data from LMS6002 chip via SPI - CMD_LMS6002_RD = 0x24, - - CMD_LMS_LNA = 0x2A, - CMD_LMS_PA = 0x2B, - - CMD_PROG_MCU = 0x2C, - ///Writes data to ADF4002 chip via SPI - CMD_ADF4002_WR = 0x31, - - CMD_USB_FIFO_RST = 0x40, - CMD_PE636040_WR = 0x41, - CMD_PE636040_RD = 0x42, - - CMD_GPIO_WR = 0x51, - CMD_GPIO_RD = 0x52, - - CMD_ALTERA_FPGA_GW_WR = 0x53, - CMD_ALTERA_FPGA_GW_RD = 0x54, - - CMD_BRDSPI_WR = 0x55,//16 bit spi for stream, dataspark control - CMD_BRDSPI_RD = 0x56,//16 bit spi for stream, dataspark control - CMD_BRDSPI8_WR = 0x57, //8 + 8 bit spi for stream, dataspark control - CMD_BRDSPI8_RD = 0x58, //8 + 8 bit spi for stream, dataspark control - - CMD_BRDCONF_WR = 0x5D, //write config data to board - CMD_BRDCONF_RD = 0x5E, //read config data from board - - CMD_ANALOG_VAL_WR = 0x61, //write analog value - CMD_ANALOG_VAL_RD = 0x62, //read analog value - - CMD_MYRIAD_RST = 0x80, - CMD_MYRIAD_WR = 0x81, - CMD_MYRIAD_RD = 0x82, - CMD_MYRIAD_PROG = 0x8C -}; - -enum eCMD_STATUS -{ - STATUS_UNDEFINED, - STATUS_COMPLETED_CMD, - STATUS_UNKNOWN_CMD, - STATUS_BUSY_CMD, - STATUS_MANY_BLOCKS_CMD, - STATUS_ERROR_CMD, - STATUS_WRONG_ORDER_CMD, - STATUS_RESOURCE_DENIED_CMD, - STATUS_COUNT -}; - -static const char status_text[][32]= -{ - "Undefined/Failure", - "Completed", - "Unknown command", - "Busy", - "Too many blocks", - "Error", - "Wrong order", - "Resource denied" -}; - -static const char* status2string(const int status) -{ - if(status >= 0 && status < STATUS_COUNT) - return status_text[status]; - else - return "Unknown status"; -} - -enum eADC_UNITS -{ - RAW, - VOLTAGE, - CURRENT, - RESISTANCE, - POWER, - ADC_UNITS_COUNT -}; - -static const char adc_units_text[][8] = {"", "V", "A", "Ohm", "W"}; - -static const char* adcUnits2string(const unsigned units) -{ - if (units < ADC_UNITS_COUNT) - return adc_units_text[units]; - else - return " unknown"; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/CMakeLists.txt b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/CMakeLists.txt deleted file mode 100644 index d9124aaef1..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -set(ENABLE_USB_CONNECTION "YES" CACHE BOOL INTERNAL) -set(ENABLE_SPI_CONNECTION "NO" CACHE BOOL INTERNAL) -set(CONNECTION_MANAGER_DIR connectionManager) -set(connectionManager_src_files - ConnectionManager.cpp - ConnectionCOM.cpp - ConnectionManager.h - ConnectionCOM.h - lmsComms.h - lmsComms.cpp -) -if(ENABLE_USB_CONNECTION) - list(APPEND connectionManager_src_files ConnectionUSB.cpp ConnectionUSB.h) - add_definitions(-DENABLE_USB_CONNECTION) -endif() -if(ENABLE_SPI_CONNECTION) - list(APPEND connectionManager_src_files ConnectionSPI.cpp ConnectionSPI.h) - add_definitions(-DENABLE_SPI_CONNECTION) -endif() - -add_library(ConnectionManager STATIC ${connectionManager_src_files}) -target_include_directories(ConnectionManager PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -if(WIN32 AND ENABLE_USB_CONNECTION) - find_package(CyAPI REQUIRED) - LINK_DIRECTORIES(${CYAPI_LIBRARIES}) - include_directories(${CYAPI_INCLUDE_DIRS}) - set(CONNECTION_MANAGER_LIBS ${CYAPI_LIBRARIES} SetupAPI) - target_link_libraries(ConnectionManager ${CONNECTION_MANAGER_LIBS}) -endif() -if(UNIX AND ENABLE_USB_CONNECTION) - set(CONNECTION_MANAGER_LIBS usb-1.0 -lpthread) - target_link_libraries(ConnectionManager ${CONNECTION_MANAGER_LIBS}) -endif() diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.cpp deleted file mode 100644 index 6c7fc0d829..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.cpp +++ /dev/null @@ -1,596 +0,0 @@ -/** - @file ConnectionCOM.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of communications through COM port -*/ - -#include "ConnectionCOM.h" - -#include "string.h" -#ifdef __unix__ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif // LINUX - -const int COM_RETRY_INTERVAL = 20; //ms -const int COM_TOTAL_TIMEOUT = 300; //ms - -/** @brief Initializes com port connection -*/ -ConnectionCOM::ConnectionCOM() -{ - currentDeviceIndex = -1; - connected = false; - comPortList.clear(); - m_deviceNames.clear(); - m_connectionType = COM_PORT; -#ifndef __unix__ - hComm = INVALID_HANDLE_VALUE; -#else - hComm = -1; -#endif - comBaudrate = 9600; -} - -/** @brief When object is destroyed it closes it's opened COM port -*/ -ConnectionCOM::~ConnectionCOM() -{ - Close(); -} - -/** @brief Opens connection to first found chip - @return 0-success -*/ -IConnection::DeviceStatus ConnectionCOM::Open() -{ - comPortList.clear(); - if(comPortList.size() == 0) - FindAllComPorts(); - - m_deviceNames.clear(); - if(m_deviceNames.size() == 0) - RefreshDeviceList(); - - for(unsigned int i=0; i 0 ) - { - comPortName = m_deviceNames[toOpen]; - IConnection::DeviceStatus status = Open(comPortName.c_str(), comBaudrate); - if( status == SUCCESS ) - currentDeviceIndex = toOpen; - return status; - } - return FAILURE; -} - -/** @brief Closes connection to chip -*/ -void ConnectionCOM::Close() -{ - connected = false; - currentDeviceIndex = -1; -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE) - { - SetCommTimeouts(hComm, &m_ctmoOld); - CloseHandle(hComm); - } - hComm = INVALID_HANDLE_VALUE; -#else - if( hComm >= 0) - { - close(hComm); - } - hComm = -1; -#endif -} - -/** @brief Returns whether chip is connected - @return chip is connected -*/ -bool ConnectionCOM::IsOpen() -{ -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE && TestConnectivity() ) - return true; -#else - if( hComm != -1 && TestConnectivity() ) - return true; -#endif - return false; -} - -int ConnectionCOM::GetOpenedIndex() -{ - return currentDeviceIndex; -} - -/** @brief Sends data through COM port - @param buffer data buffer to send - @param length size of data buffer - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes sent -*/ -int ConnectionCOM::Write(const unsigned char *buffer, int length, int timeout_ms) -{ - if(timeout_ms == 0) - { - timeout_ms = COM_TOTAL_TIMEOUT; - } - int retryCount = 0; - const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; - bool status = false; -#ifndef __unix__ - unsigned long bytesWriten = 0; - m_osWOverlap.InternalHigh = 0; - - for(int i = 0; iwrite("COM PORT: error writing data\n", LOG_ERROR); -// if(bytesWriten == 0) -// MessageLog::getInstance()->write("COM PORT: data bytes sent 0\n", LOG_WARNING); - status = false; - } - else - status = true; - ++retryCount; - } -#endif - if(bytesWriten == length) - status = true; - - return bytesWriten; -} - -/** @brief Reads data from COM port - @param buffer pointer to data buffer for receiving - @param length number of bytes to read - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes received -*/ -int ConnectionCOM::Read(unsigned char *buffer, int length, int timeout_ms) -{ - if(timeout_ms == 0) - { - timeout_ms = COM_TOTAL_TIMEOUT; - } - int retryCount = 0; - const int maxRetries = (timeout_ms/COM_RETRY_INTERVAL) > 1 ? (timeout_ms/COM_RETRY_INTERVAL) : 1; - bool status = false; - - memset(buffer, 0, length); - long bytesReaded = 0; - unsigned long totalBytesReaded = 0; - char cRawData[COM_BUFFER_LENGTH]; - unsigned long bytesToRead = length; - - memset(cRawData, '\0', sizeof(cRawData[0])*COM_BUFFER_LENGTH); - - for(int i=0; iwrite("COM PORT: error reading data\n", LOG_ERROR); -// if(bytesReaded == 0) -// MessageLog::getInstance()->write("COM PORT: reading 0 bytes\n", LOG_WARNING); - status = false; - } -#endif - retryCount++; - - for(int j=0; jwrite(ss.str(), LOG_DATA); - -// if(retryCount == maxRetries) -// MessageLog::getInstance()->write("COM PORT: read data timeout\n", LOG_WARNING); -// -// if(totalBytesReaded > length) -// MessageLog::getInstance()->write("COM PORT: read data corrupted, received length > requested length\n", LOG_ERROR); - return totalBytesReaded; -} - -/** @brief Searches for available COM ports and adds them to list -*/ -void ConnectionCOM::FindAllComPorts() -{ - Close(); - comPortList.clear(); -#ifndef __unix__ - HKEY hSERIALCOMM; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hSERIALCOMM) == ERROR_SUCCESS) - { - // Get the max value name and max value lengths - DWORD dwMaxValueNameLen; - DWORD dwMaxValueLen; - DWORD dwQueryInfo = RegQueryInfoKey(hSERIALCOMM, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &dwMaxValueNameLen, &dwMaxValueLen, NULL, NULL); - if (dwQueryInfo == ERROR_SUCCESS) - { - DWORD dwMaxValueNameSizeInChars = dwMaxValueNameLen + 1; - // Include space for the NULL terminator - DWORD dwMaxValueNameSizeInBytes = dwMaxValueNameSizeInChars*sizeof(TCHAR); - DWORD dwMaxValueDataSizeInChars = dwMaxValueLen / sizeof(TCHAR) + 1; - // Include space for the NULL terminator - DWORD dwMaxValueDataSizeInBytes = dwMaxValueDataSizeInChars*sizeof(TCHAR); - - // Allocate some space for the value name and value data - TCHAR* szValueName = new TCHAR[dwMaxValueNameSizeInChars]; - TCHAR* byValue = new TCHAR[dwMaxValueDataSizeInBytes]; - if (szValueName && byValue) - { - // Enumerate all the values underneath HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM - DWORD dwIndex = 0; - DWORD dwType; - DWORD dwValueNameSize = dwMaxValueNameSizeInChars; - DWORD dwDataSize = dwMaxValueDataSizeInBytes; - memset(szValueName, 0, dwMaxValueNameSizeInBytes); - memset(byValue, 0, dwMaxValueDataSizeInBytes); - LONG nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); - while (nEnum == ERROR_SUCCESS) - { - // If the value is of the correct type, then add it to the array - if (dwType == REG_SZ) - { - char portname[512]; - TCHAR* szPort = byValue; - int nUserNameLenUnicode = lstrlen( szPort ); // Convert all UNICODE characters - int nUserNameLen = WideCharToMultiByte( CP_ACP, // ANSI Code Page - 0, // No special handling of unmapped chars - (LPCWSTR)szPort, // wide-character string to be converted - nUserNameLenUnicode, - NULL, 0, // No output buffer since we are calculating length - NULL, NULL ); // Unrepresented char replacement - Use Default - TCHAR* pszUserName = new TCHAR[ nUserNameLen ]; // nUserNameLen includes the NULL character - WideCharToMultiByte( CP_ACP, // ANSI Code Page - 0, // No special handling of unmapped chars - (LPCWSTR)szPort, // wide-character string to be converted - nUserNameLenUnicode, - portname, - nUserNameLen, - NULL, NULL ); // Unrepresented char replacement - Use Default - portname[nUserNameLen] = 0; -#ifdef UNICODE - comPortList.push_back(portname); -#else - comPortList.push_back(szPort); -#endif - } - // Prepare for the next time around - dwValueNameSize = dwMaxValueNameSizeInChars; - dwDataSize = dwMaxValueDataSizeInBytes; - memset(szValueName, 0, dwMaxValueNameSizeInBytes); - memset(byValue, 0, dwMaxValueDataSizeInBytes); - ++dwIndex; - nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, (LPBYTE)byValue, &dwDataSize); - } - } - delete szValueName; - delete byValue; - } - // Close the registry key now that we are finished with it - RegCloseKey(hSERIALCOMM); - - if (dwQueryInfo != ERROR_SUCCESS) - SetLastError(dwQueryInfo); - } -#else - char tempBuffer[256]; - string result = ""; -#warning Currently searching only for ACM connections - system( "ls /dev | grep ttyACM > /tmp/foundSerialPorts.txt"); - - fstream fin; - fin.open("/tmp/foundSerialPorts.txt", ios::in); - while(!fin.eof()) - { - fin.getline(tempBuffer, 256); - result = "/dev/"; - result.append(tempBuffer); - if( strlen(tempBuffer) > 3 ) //longer than tty - comPortList.push_back(result); - } - fin.close(); -#endif -} - -/** @brief Opens COM port - @param comName COM port name - @param baudrate COM port baudrate - @return 0 on success -*/ -IConnection::DeviceStatus ConnectionCOM::Open(const char *comName, int baudrate) -{ - Close(); - if (strlen(comName) == 0) - return FAILURE; - - DeviceStatus errorCode = SUCCESS; - -#ifndef __unix__ - // Initialize Overlap structures - m_osROverlap.Internal = 0; - m_osROverlap.InternalHigh = 0; - m_osROverlap.Offset = 0; - m_osROverlap.OffsetHigh = 0; - m_osROverlap.hEvent = CreateEvent(NULL, false, false, NULL); - - m_osWOverlap.Internal = 0; - m_osWOverlap.InternalHigh = 0; - m_osWOverlap.Offset = 0; - m_osWOverlap.OffsetHigh = 0; - m_osWOverlap.hEvent = CreateEvent(NULL, false, false, NULL); - - // Initialize DSB structure - memset(&m_dcbCommPort, 0, sizeof(m_dcbCommPort)); - - m_dcbCommPort.BaudRate = comBaudrate; - m_dcbCommPort.fBinary = 1; - m_dcbCommPort.fParity = 0; - m_dcbCommPort.fOutxCtsFlow = 0; - m_dcbCommPort.fOutxDsrFlow = 0; - m_dcbCommPort.fDtrControl = 0; - m_dcbCommPort.fDsrSensitivity = 0; - m_dcbCommPort.fTXContinueOnXoff = 0; - m_dcbCommPort.fOutX = 0; - m_dcbCommPort.fInX = 0; - m_dcbCommPort.fErrorChar = 0; - m_dcbCommPort.fNull = 0; - m_dcbCommPort.fRtsControl = 0; - m_dcbCommPort.fAbortOnError = 0; - m_dcbCommPort.fDummy2 = 0; - // m_dcbCommPort.wReserved = 0; - m_dcbCommPort.XonLim = 512; - m_dcbCommPort.XoffLim = 512; - m_dcbCommPort.ByteSize = 8; - m_dcbCommPort.Parity = 0; - m_dcbCommPort.StopBits = 0; - //m_dcbCommPort.StopBits = 1; - m_dcbCommPort.XonChar = 17; - m_dcbCommPort.XoffChar = 19; - m_dcbCommPort.ErrorChar = 0; - m_dcbCommPort.EofChar = 26; - m_dcbCommPort.EvtChar = 0; - m_dcbCommPort.wReserved1 = 0; - m_dcbCommPort.DCBlength = sizeof(DCB); - - // Initialize Timeout's - m_ctmoNew.ReadIntervalTimeout = 50; - m_ctmoNew.ReadTotalTimeoutMultiplier = 0; - m_ctmoNew.ReadTotalTimeoutConstant = 100; // 1; - m_ctmoNew.WriteTotalTimeoutMultiplier = 0; - m_ctmoNew.WriteTotalTimeoutConstant = 100; - - // Open COM port - string stmp; - stmp = "\\\\.\\"; - stmp.append(comName); - hComm = CreateFileA(stmp.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - - if (hComm != INVALID_HANDLE_VALUE) - { - // Set Events - if (!SetCommMask(hComm, 0)) - errorCode = FAILURE; - - // Set Timeouts - GetCommTimeouts(hComm, &m_ctmoOld); - if (!SetCommTimeouts(hComm, &m_ctmoNew)) - errorCode = FAILURE; - - // Set DCB - if (!SetCommState(hComm, &m_dcbCommPort)) - errorCode = FAILURE; - } - else - { - errorCode = FAILURE; - }; - - // Check the results - if (errorCode != 0) - { - //unsigned long err = GetLastError(); - CloseHandle(hComm); - hComm = INVALID_HANDLE_VALUE; - return errorCode; - } - else - { - PurgeComm(hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); - return SUCCESS; - } -#else - hComm = open(comName, O_RDWR | O_NOCTTY | O_SYNC); - if(hComm < 0) - { -// printf("%s",strerror(errno)); -// MessageLog::getInstance()->write("Connection manager: failed opening COM port\n", LOG_ERROR); - return FAILURE; - } - - struct termios tty; - memset(&tty, 0, sizeof(tty)); - if( tcgetattr(hComm, &tty) != 0) - { -// MessageLog::getInstance()->write("Connection Manager: error from tcgetattr\n", LOG_ERROR); - return FAILURE; - } - int speed = B9600; - cfsetospeed(&tty, speed); - cfsetispeed(&tty, speed); - - tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; - tty.c_iflag &= ~IGNBRK; - tty.c_lflag = 0; - tty.c_oflag = 0; - tty.c_cc[VMIN] = 0; // read non blocking - tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout - - tty.c_iflag &= ~(IXON | IXOFF | IXANY); - tty.c_cflag |= (CLOCAL | CREAD); - - if(tcsetattr(hComm, TCSANOW, &tty) != 0) - { -// MessageLog::getInstance()->write("Connection manager: error from tcsetattr\n", LOG_ERROR); - return FAILURE; - } -#endif - return SUCCESS; -} - -/** @brief Checks if chip is connected to currently open port - @return chip is connected -*/ -bool ConnectionCOM::TestConnectivity() -{ -//currently set to always return true to show all com ports - return true; -#ifndef __unix__ - if (hComm != INVALID_HANDLE_VALUE) -#else - if( hComm >= 0) -#endif - { -// unsigned char out[64]; -// unsigned char in[64]; -// memset(in, 0, 64); -// out[0] = CMD_GET_INFO; -// SendData(out, 64); -// ReadData(in, 64); -// if(in[0] == CMD_GET_INFO && in[1] == 0x01) -// return true; -// else -// return false; - } - return false; -} - -/** @brief Finds all chips connected to com ports - @return number of devices found -*/ -int ConnectionCOM::RefreshDeviceList() -{ - int wasOpen = -1; - string wasOpenName = ""; - if(IsOpen()) - { - wasOpen = GetOpenedIndex(); - wasOpenName = comPortName; - } - Close(); - comPortList.clear(); - if(comPortList.size() == 0) - FindAllComPorts(); - - m_deviceNames.clear(); - string comName; - for(unsigned int i=0; i ConnectionCOM::GetDeviceNames() -{ - return m_deviceNames; -} - -/** @brief Purges communication buffers -*/ -void ConnectionCOM::ClearComm() -{ -#ifndef __unix__ - PurgeComm(hComm, PURGE_TXCLEAR|PURGE_RXCLEAR); -#endif -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.h deleted file mode 100644 index 0549472db1..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionCOM.h +++ /dev/null @@ -1,62 +0,0 @@ -/** -@file ConnectionCOM.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data communications through COM port -*/ - -#ifndef CONNECTION_COM_PORT_H -#define CONNECTION_COM_PORT_H - -#ifndef __unix__ - #include "windows.h" -#endif - -#include "IConnection.h" - -class ConnectionCOM : public IConnection -{ -public: - static const int COM_BUFFER_LENGTH = 1024; //max buffer size for data - - ConnectionCOM(); - ~ConnectionCOM(); - - DeviceStatus Open(); - DeviceStatus Open(unsigned i); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - std::vector GetDeviceNames(); - int RefreshDeviceList(); - void ClearComm(); -private: - void FindAllComPorts(); - DeviceStatus Open(const char *comName, int baudrate); - - bool TestConnectivity(); - - std::string comPortName; - int comBaudrate; - bool connected; - - int currentDeviceIndex; - std::vector comPortList; - std::vector m_deviceNames; - -#ifndef __unix__ - HANDLE hComm; - COMMTIMEOUTS m_ctmoNew; - COMMTIMEOUTS m_ctmoOld; - OVERLAPPED m_osROverlap; - OVERLAPPED m_osWOverlap; - DCB m_dcbCommPort; -#else - int hComm; //com port file descriptor -#endif - -}; -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.cpp deleted file mode 100644 index 9ec16e0d88..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.cpp +++ /dev/null @@ -1,319 +0,0 @@ -/** - @file ConnectionManager.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of various connection types to devices -*/ - -#include "ConnectionManager.h" -#include "ConnectionCOM.h" - -#ifdef ENABLE_USB_CONNECTION - #include "ConnectionUSB.h" -#endif -#ifdef ENABLE_SPI_CONNECTION - #include "ConnectionSPI.h" -#endif - -#include -#include -#include - -/** @brief Creates connection interfaces -*/ -ConnectionManager::ConnectionManager(const IConnection::eConnectionType port_type) : activeControlPort(NULL) -{ - mLogData = false; - mOpenedDevice = -1; - if (port_type == IConnection::COM_PORT) - m_connections[IConnection::COM_PORT] = new ConnectionCOM(); -#ifdef ENABLE_USB_CONNECTION - if (port_type == IConnection::USB_PORT) - m_connections[IConnection::USB_PORT] = new ConnectionUSB(); -#endif -#ifdef ENABLE_SPI_CONNECTION - m_connections[IConnection::SPI_PORT] = new ConnectionSPI(); -#endif -} - -/** @brief Destroys connection interfaces -*/ -ConnectionManager::~ConnectionManager() -{ - for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) - { - delete iter->second; - } -} - -/** @brief Checks if connection to device is opened - @return True if device is connected -*/ -bool ConnectionManager::IsOpen() -{ - return activeControlPort ? activeControlPort->IsOpen() : false; -} - -/** @brief Opens connection to first available device - @return True if connected to device -*/ -bool ConnectionManager::Open() -{ - return Open(0); -} - -/** @brief Connects to selected device - @param i device index from device list - @return 1:Success, 0:failure -*/ -int ConnectionManager::Open(unsigned i) -{ - if(i >= mDevices.size()) - return 0; - - if(activeControlPort) - activeControlPort->Close(); - switch(mDevices[i].port) - { - case IConnection::COM_PORT: - activeControlPort = m_connections[IConnection::COM_PORT]; - break; - case IConnection::USB_PORT: - activeControlPort = m_connections[IConnection::USB_PORT]; - break; - case IConnection::SPI_PORT: - activeControlPort = m_connections[IConnection::SPI_PORT]; - break; - default: - return 0; - } - mOpenedDevice = -1; - if( i < mDevices.size() ) - { - if (activeControlPort->Open(mDevices[i].portIndex) == IConnection::SUCCESS) - { - mOpenedDevice = i; - return 1; - } - } - return 0; -} - -/** @brief Closes connection to device -*/ -void ConnectionManager::Close() -{ - if(activeControlPort) - { - activeControlPort->Close(); - //Notify(LMS_Message(MSG_BOARD_DISCONNECTED, "", 0, 0)); - } - mOpenedDevice = -1; -} - -/** @brief Finds all currently connected devices and forms device list - @return number of devices found -*/ -int ConnectionManager::RefreshDeviceList() -{ - mDeviceList.clear(); - mDevices.clear(); - DeviceInfo dev; - for (auto iter = m_connections.begin(); iter != m_connections.end(); ++iter) - { - vector names; - IConnection *port = iter->second; - if(port->RefreshDeviceList() > 0) - { - names = port->GetDeviceNames(); - for(unsigned i=0; ifirst; - dev.portIndex = i; - mDevices.push_back(dev); - } - } - } - for(unsigned i=0; iWrite(buffer, length, timeout_ms); -#ifndef NDEBUG - if(mLogData) - { - stringstream ss; - ss << "WR(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; - ss << std::hex << std::setfill('0'); - int repeatedZeros = 0; - for(int i=length-1; i>=0; --i) - if(buffer[i] == 0) - ++repeatedZeros; - else break; - if(repeatedZeros == 1) - repeatedZeros = 0; - repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); - for(int i=0; i 1) - ss << " (00 x " << std::dec << repeatedZeros << " times)"; - cout << ss.str() << endl; -#ifndef __unix__ - OutputDebugString(ss.str().c_str()); -#endif - } -#endif - return bytesTransferred; - } - return -1; -} - -/** @brief Receives data from currently opened connection - @param buffer incomming data buffer, must be big enough for length bytes - @param length bytes to read - @param timeout_ms timeout in milliseconds - @return number of bytes received -*/ -int ConnectionManager::Read(unsigned char *buffer, int length, int timeout_ms) -{ - if(activeControlPort) - { - int bytesTransferred = activeControlPort->Read(buffer, length, timeout_ms); -#ifndef NDEBUG - if(mLogData) - { - stringstream ss; - ss << "RD(" << (bytesTransferred>=0?bytesTransferred: 0) << "): "; - ss << std::hex << std::setfill('0'); - int repeatedZeros = 0; - for(int i=length-1; i>=0; --i) - if(buffer[i] == 0) - ++repeatedZeros; - else break; - if(repeatedZeros == 2) - repeatedZeros = 0; - repeatedZeros = repeatedZeros - (repeatedZeros & 0x1); - for(int i=0; i 2) - ss << " (00 x " << std::dec << repeatedZeros << " times)"; - cout << ss.str() << endl; - } -#endif - return bytesTransferred; - } - return -1; -} - -int ConnectionManager::WriteStream(const char *buffer, int length) -{ - return 0; -} - -int ConnectionManager::ReadStream(char *buffer, int length, unsigned int timeout_ms) -{ - /*int handle = activeControlPort->BeginDataReading(buffer, length); - activeControlPort->WaitForReading(handle, timeout_ms); - long received = length; - activeControlPort->FinishDataReading(buffer, received, handle); - return received; - */ - long len = length; - int status = activeControlPort->ReadDataBlocking(buffer, len, 0); - return len; -} - - -int ConnectionManager::BeginDataReading(char *buffer, long length) -{ - return activeControlPort->BeginDataReading(buffer, length); -} -/** -@brief Blocks until data is received or set number of milliseconds have passed. -@param contextHandle handle returned by BeginDataReading() -@param timeout_ms number of milliseconds to wait -@return 1-data received, 0-data not received -*/ -int ConnectionManager::WaitForReading(int contextHandle, unsigned int timeout_ms) -{ - return activeControlPort->WaitForReading(contextHandle, timeout_ms); -} -/** -@brief Finished asynchronous data reading. -@param buffer where to put received data -@param length number of bytes to read, will be changed to actual number of bytes received -@param contextHandle context handle returned by BeginDataReading() -@return received data length -*/ -int ConnectionManager::FinishDataReading(char *buffer, long &length, int contextHandle) -{ - return activeControlPort->FinishDataReading(buffer, length, contextHandle); -} - -/** -@brief Aborts reading operations -*/ -void ConnectionManager::AbortReading() -{ - activeControlPort->AbortReading(); -} - -/** -@brief Start asynchronous data sending. -@param buffer data buffer to be sent -@param length number of bytes to send. -@return context handle -*/ -int ConnectionManager::BeginDataSending(const char *buffer, long length) -{ - return activeControlPort->BeginDataSending(buffer, length); -} -/** -@brief Blocks until data is sent or set number of miliseconds have passed. -@param contextHandle handle returned by BeginDataReading() -@param timeout_ms number of miliseconds to wait -@return 1-data sent, 0-data not sent -*/ -int ConnectionManager::WaitForSending(int contextHandle, unsigned int timeout_ms) -{ - return activeControlPort->WaitForSending(contextHandle, timeout_ms); -} -/** -@brief Finished asynchronous data sending. -@param buffer where to put received data -@param length number of bytes to send, will be changed to actual number of bytes sent -@param contextHandle context handle returned by BeginDataReading() -@return sent data length -*/ -int ConnectionManager::FinishDataSending(const char *buffer, long &length, int contextHandle) -{ - return activeControlPort->FinishDataSending(buffer, length, contextHandle); -} - -/** -@brief Aborts sending operations -*/ -void ConnectionManager::AbortSending() -{ - activeControlPort->AbortSending(); -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.h deleted file mode 100644 index 68819011ff..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionManager.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - @file ConnectionManager.h - @author Lime Microsystems (www.limemicro.com) - @brief Class for managing connection to devices -*/ - -#ifndef LMS_CONNECTION_MANAGER_H -#define LMS_CONNECTION_MANAGER_H - -#include "IConnection.h" -#include - -class ConnectionManager -{ -public: - struct DeviceInfo - { - std::string name; - IConnection::eConnectionType port; - int portIndex; - }; - - ConnectionManager(const IConnection::eConnectionType port_type); - ~ConnectionManager(); - bool IsOpen(); - bool Open(); - int Open(unsigned i); - void Close(); - int RefreshDeviceList(); - int GetOpenedIndex(); - std::vector GetDeviceList(){return mDeviceList;}; - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - int WriteStream(const char *buffer, int length); - int ReadStream(char *buffer, int length, unsigned int timeout_ms); - - int BeginDataReading(char *buffer, long length); - int WaitForReading(int contextHandle, unsigned int timeout_ms); - int FinishDataReading(char *buffer, long &length, int contextHandle); - void AbortReading(); - - int BeginDataSending(const char *buffer, long length); - int WaitForSending(int contextHandle, unsigned int timeout_ms); - int FinishDataSending(const char *buffer, long &length, int contextHandle); - void AbortSending(); - -protected: - bool mLogData; - /// Port used for communication. - IConnection *activeControlPort; - std::vector mDevices; - std::vector mDeviceList; - int mOpenedDevice; - std::map m_connections; -}; - -#endif // LMS_CONNECTION_MANAGER_H - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.cpp deleted file mode 100644 index fb305f9c1c..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.cpp +++ /dev/null @@ -1,313 +0,0 @@ -/** - @file ConnectionSPI.cpp - @author Lime Microsystems (www.limemicro.com) - @brief Implementation of communications through SPI port -*/ - -#include "ConnectionSPI.h" - -#include "string.h" -#ifdef __unix__ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif // LINUX - -#include -#include - -const int ConnectionSPI::cSPI_BUF_SIZE = 128; -const int ConnectionSPI::cSPI_SPEED_HZ = 2000000; - -/** @brief Tries to read EEPROM for Novena board signature - @return true if Novena board -*/ -bool IsNovenaBoard() -{ -#ifdef __unix__ - char data[8]; - int count = 6; - memset(data, 0, 8); - int addr = 0; - struct i2c_rdwr_ioctl_data session; - struct i2c_msg messages[2]; - char set_addr_buf[2]; - memset(set_addr_buf, 0, sizeof(set_addr_buf)); - memset(data, 0, count); - set_addr_buf[0] = addr>>8; - set_addr_buf[1] = addr; - messages[0].addr = 0xac>>1; - messages[0].flags = 0; - messages[0].len = sizeof(set_addr_buf); - messages[0].buf = set_addr_buf; - messages[1].addr = 0xac>>1; - messages[1].flags = I2C_M_RD; - messages[1].len = count; - messages[1].buf = data; - session.msgs = messages; - session.nmsgs = 2; - - bool isNovena = false; - - int fd = open("/dev/i2c-2", O_RDWR); - if(fd > 0) - { - if(ioctl(fd, I2C_RDWR, &session) < 0) - { - perror("Unable to communicate with i2c device"); - isNovena = false; - } - if(strcmp("Novena", data) == 0) - isNovena = true; - } - close(fd); - return isNovena; -#else - return false; -#endif -} - -/** @brief Initializes SPI port and exports needed GPIO -*/ -ConnectionSPI::ConnectionSPI() -{ - fd = -1; - m_connectionType = SPI_PORT; - std::fstream gpio; - //export SEN pin - gpio.open("/sys/class/gpio/export", ios::out); - if(gpio.good()) - { - gpio << 122; - gpio.flush(); - gpio.close(); - gpio.open("/sys/class/gpio/gpio122/direction", ios::out); - gpio << "out"; - gpio.flush(); - gpio.close(); - m_SEN.open("/sys/class/gpio/gpio122/value", ios::out); - m_SEN<< 1; - m_SEN.flush(); - cout << "GPIO122: set to 1" << endl; - } -} - -ConnectionSPI::~ConnectionSPI() -{ - Close(); - m_SEN.close(); -} - -/** @brief Opens connection to first found chip - @return 0-success -*/ -IConnection::DeviceStatus ConnectionSPI::Open() -{ - Close(); -#ifdef __unix__ - fd = open("/dev/spidev2.0", O_RDWR | O_SYNC); - if (fd < 0) - { - //MessageLog::getInstance()->write("SPI PORT: device not found\n", LOG_ERROR); - return IConnection::FAILURE; - } - int mode = SPI_MODE_0; - int ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); - if (ret == -1) - printf("can't set spi mode"); - - ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); - if (ret == -1) - printf("can't get spi mode"); - - /* - * bits per word - */ - int bits = 8; - ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); - if (ret == -1) - printf("can't set bits per word"); - - ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); - if (ret == -1) - printf("can't get bits per word"); - - /* - * max speed hz - */ - int speed = cSPI_SPEED_HZ; - ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); - if (ret == -1) - printf("can't set max speed hz"); - - ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); - if (ret == -1) - printf("can't get max speed hz"); - - printf("spi mode: 0x%x\n", mode); - printf("bits per word: %d\n", bits); - printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); - return IConnection::SUCCESS; -#else - return IConnection::FAILURE; -#endif -} - -/** @brief Opens connection to selected chip - @param index chip index in device list - @return 0-success -*/ -IConnection::DeviceStatus ConnectionSPI::Open(unsigned index) -{ - return Open(); -} - -/** @brief Closes connection to chip -*/ -void ConnectionSPI::Close() -{ -#ifdef __unix__ - close(fd); - fd = -1; -#endif -} - -/** @brief Returns whether chip is connected - @return chip is connected -*/ -bool ConnectionSPI::IsOpen() -{ - return (fd >= 0); -} - -/** @brief Sends data through COM port - @param buffer data buffer to send - @param length size of data buffer - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes sent -*/ -int ConnectionSPI::Write(const unsigned char *buffer, int length, int timeout_ms) -{ - #ifdef __unix__ - if(fd < 0) - return 0; - m_SEN << 0; - m_SEN.flush(); - unsigned long bytesWritten = 0; - rxbuf.clear(); - int bytesReceived = 0; - char rxbytes[2]; - while(bytesWritten < length) - { - int toWrite = length-bytesWritten > cSPI_BUF_SIZE ? cSPI_BUF_SIZE : length-bytesWritten; - for(int i=0; i 0) -// { -// ss << " re443ad(" << toWrite << "): "; -// for(int i=0; iwrite(ss.str(), LOG_DATA); - - bytesWritten += toWrite; - } - m_SEN << 1; - m_SEN.flush(); - return bytesWritten; -#else - return 0; -#endif -} - -/** @brief Reads data from COM port - @param buffer pointer to data buffer for receiving - @param length number of bytes to read - @param timeout_ms timeout limit for operation in milliseconds - @return Number of bytes received -*/ -int ConnectionSPI::Read(unsigned char *buffer, int length, int timeout_ms) -{ -#ifdef __unix__ - if(fd < 0) - return 0; - //because transfer is done in full duplex, function returns data from last transfer - int tocpy = length > rxbuf.size() ? rxbuf.size() : length; - memcpy(buffer, &rxbuf[0], tocpy); - rxbuf.clear(); - return tocpy; -#else - return 0; -#endif -} - -/** @brief Finds all chips connected to com ports - @return number of devices found -*/ -int ConnectionSPI::RefreshDeviceList() -{ - m_deviceNames.clear(); -#ifdef __unix__ - int spidev = open("/dev/spidev2.0", O_RDWR); - if (spidev >= 0) - { - if(IsNovenaBoard() == true) - m_deviceNames.push_back("SPI (Novena)"); - else - m_deviceNames.push_back("SPI"); - } - close(spidev); -#endif - return m_deviceNames.size(); -} - -/** @brief Returns found devices names - @return vector of device names -*/ -vector ConnectionSPI::GetDeviceNames() -{ - return m_deviceNames; -} - -int ConnectionSPI::GetOpenedIndex() -{ - return 0; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.h deleted file mode 100644 index 79d9bd9b9b..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionSPI.h +++ /dev/null @@ -1,41 +0,0 @@ -/** -@file ConnectionSPI.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data communications through SPI port -*/ - -#ifndef CONNECTION_SPI_PORT_H -#define CONNECTION_SPI_PORT_H - -#include "IConnection.h" -#include -#include -#include - -class ConnectionSPI : public IConnection -{ -public: - static const int cSPI_BUF_SIZE; - static const int cSPI_SPEED_HZ; - - ConnectionSPI(); - ~ConnectionSPI(); - - DeviceStatus Open(); - DeviceStatus Open(unsigned i); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - std::vector GetDeviceNames(); - int RefreshDeviceList(); -protected: - std::vector m_deviceNames; - std::vector rxbuf; - int fd; - std::fstream m_SEN; -}; -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.cpp deleted file mode 100644 index 148b7b776b..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.cpp +++ /dev/null @@ -1,771 +0,0 @@ -/** -@file ConnectionUSB.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Data writing and reading through USB port -*/ - -#include "ConnectionUSB.h" -#include - -#ifdef __unix__ - #include - #include -#endif - -#define USB_TIMEOUT 1000 - -#define HW_LDIGIRED L"DigiRed" -#define HW_LDIGIGREEN L"DigiGreen" -#define HW_LSTREAMER L"Stream" - -#define HW_DIGIRED "DigiRed" -#define HW_DIGIGREEN "DigiGreen" -#define HW_STREAMER "Stream" - -#define CTR_W_REQCODE 0xC1 -#define CTR_W_VALUE 0x0000 -#define CTR_W_INDEX 0x0000 - -#define CTR_R_REQCODE 0xC0 -#define CTR_R_VALUE 0x0000 -#define CTR_R_INDEX 0x0000 - -/** @brief Initializes port type and object necessary to communicate to usb device. -*/ -ConnectionUSB::ConnectionUSB() -{ - m_hardwareName = ""; - isConnected = false; - m_connectionType = USB_PORT; -#ifndef __unix__ - USBDevicePrimary = new CCyUSBDevice(NULL); - OutCtrEndPt = NULL; - InCtrEndPt = NULL; - InCtrlEndPt3 = NULL; - OutCtrlEndPt3 = NULL; -#else - dev_handle = 0; - devs = 0; - int r = libusb_init(&ctx); //initialize the library for the session we just declared - if(r < 0) - printf("Init Error %i\n", r); //there was an error - libusb_set_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation -#endif - currentDeviceIndex = -1; -} - -/** @brief Closes connection to chip and deallocates used memory. -*/ -ConnectionUSB::~ConnectionUSB() -{ - Close(); -#ifndef __unix__ - delete USBDevicePrimary; -#else - libusb_exit(ctx); -#endif -} - -/** @brief Automatically open first available chip connected to usb port. - @return 0-success, other-failure -*/ -IConnection::DeviceStatus ConnectionUSB::Open() -{ - currentDeviceIndex = -1; - if(m_deviceNames.size() == 0) - RefreshDeviceList(); - -#ifndef __unix__ - for(int i=0; iDeviceCount(); ++i) - if( Open(i) == SUCCESS) - { - currentDeviceIndex = i; - return SUCCESS; - } -#else - if(Open(0) == SUCCESS) - return SUCCESS; -#endif - return FAILURE; -} - -/** @brief Tries to open connected USB device and find communication endpoints. - @return Returns 1-Success, 0-EndPoints not found or device didn't connect. -*/ -IConnection::DeviceStatus ConnectionUSB::Open(unsigned index) -{ -#ifndef __unix__ - wstring m_hardwareDesc = L""; - if( index < USBDevicePrimary->DeviceCount()) - { - if(USBDevicePrimary->Open(index)) - { - m_hardwareDesc = USBDevicePrimary->Product; - unsigned int pos; - //determine connected board type - pos = m_hardwareDesc.find(HW_LDIGIRED, 0); - if( pos != wstring::npos ) - m_hardwareName = HW_DIGIRED; - else if (m_hardwareDesc.find(HW_LSTREAMER, 0) != wstring::npos) - m_hardwareName = HW_STREAMER; - else - m_hardwareName = HW_STREAMER; - - - if (InCtrlEndPt3) - { - delete InCtrlEndPt3; - InCtrlEndPt3 = NULL; - } - InCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); - - if (OutCtrlEndPt3) - { - delete OutCtrlEndPt3; - OutCtrlEndPt3 = NULL; - } - OutCtrlEndPt3 = new CCyControlEndPoint(*USBDevicePrimary->ControlEndPt); - - InCtrlEndPt3->ReqCode = CTR_R_REQCODE; - InCtrlEndPt3->Value = CTR_R_VALUE; - InCtrlEndPt3->Index = CTR_R_INDEX; - - OutCtrlEndPt3->ReqCode = CTR_W_REQCODE; - OutCtrlEndPt3->Value = CTR_W_VALUE; - OutCtrlEndPt3->Index = CTR_W_INDEX; - - for (int i=0; iEndPointCount(); i++) - if(USBDevicePrimary->EndPoints[i]->Address == 0x01) - { - OutEndPt = USBDevicePrimary->EndPoints[i]; - long len = OutEndPt->MaxPktSize * 64; - OutEndPt->SetXferSize(len); - break; - } - for (int i=0; iEndPointCount(); i++) - if(USBDevicePrimary->EndPoints[i]->Address == 0x81) - { - InEndPt = USBDevicePrimary->EndPoints[i]; - long len = InEndPt->MaxPktSize * 64; - InEndPt->SetXferSize(len); - break; - } - isConnected = true; - return SUCCESS; - } //successfully opened device - } //if has devices - return FAILURE; -#else - if(index >= 0 && index < m_dev_pid_vid.size()) - { - dev_handle = libusb_open_device_with_vid_pid(ctx, m_dev_pid_vid[index].second, m_dev_pid_vid[index].first); - - if(dev_handle == 0) - return FAILURE; - if(libusb_kernel_driver_active(dev_handle, 0) == 1) //find out if kernel driver is attached - { - printf("Kernel Driver Active\n"); - if(libusb_detach_kernel_driver(dev_handle, 0) == 0) //detach it - printf("Kernel Driver Detached!\n"); - } - int r = libusb_claim_interface(dev_handle, 0); //claim interface 0 (the first) of device - if(r < 0) - { - printf("Cannot Claim Interface\n"); - return CANNOT_CLAIM_INTERFACE; - } - printf("Claimed Interface\n"); - isConnected = true; - return SUCCESS; - } - else - { - return FAILURE; - } -#endif -} - -/** @brief Closes communication to device. -*/ -void ConnectionUSB::Close() -{ - #ifndef __unix__ - USBDevicePrimary->Close(); - InEndPt = NULL; - OutEndPt = NULL; - if (InCtrlEndPt3) - { - delete InCtrlEndPt3; - InCtrlEndPt3 = NULL; - } - if (OutCtrlEndPt3) - { - delete OutCtrlEndPt3; - OutCtrlEndPt3 = NULL; - } - #else - if(dev_handle != 0) - { - libusb_release_interface(dev_handle, 0); - libusb_close(dev_handle); - dev_handle = 0; - } - #endif - isConnected = false; -} - -/** @brief Returns connection status - @return 1-connection open, 0-connection closed. -*/ -bool ConnectionUSB::IsOpen() -{ - #ifndef __unix__ - return USBDevicePrimary->IsOpen() && isConnected; - #else - return isConnected; - #endif -} - -/** @brief Sends given data buffer to chip through USB port. - @param buffer data buffer, must not be longer than 64 bytes. - @param length given buffer size. - @param timeout_ms timeout limit for operation in milliseconds - @return number of bytes sent. -*/ -int ConnectionUSB::Write(const unsigned char *buffer, const int length, int timeout_ms) -{ - long len = length; - if(IsOpen()) - { - unsigned char* wbuffer = new unsigned char[length]; - memcpy(wbuffer, buffer, length); - if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) - { - #ifndef __unix__ - if(OutCtrlEndPt3) - OutCtrlEndPt3->Write(wbuffer, len); - else - len = 0; - #else - len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR,CTR_W_REQCODE ,CTR_W_VALUE, CTR_W_INDEX, wbuffer, length, USB_TIMEOUT); - #endif - } - else - { - #ifndef __unix__ - if(OutCtrEndPt) - OutCtrEndPt->XferData(wbuffer, len); - else - len = 0; - #else - int actual = 0; - libusb_bulk_transfer(dev_handle, 0x01, wbuffer, len, &actual, USB_TIMEOUT); - len = actual; - #endif - } - delete wbuffer; - } - else - return 0; - return len; -} - -/** @brief Reads data coming from the chip through USB port. - @param buffer pointer to array where received data will be copied, array must be - big enough to fit received data. - @param length number of bytes to read from chip. - @param timeout_ms timeout limit for operation in milliseconds - @return number of bytes received. -*/ -int ConnectionUSB::Read(unsigned char *buffer, const int length, int timeout_ms) -{ - long len = length; - if(IsOpen()) - { - if(m_hardwareName == HW_DIGIRED || m_hardwareName == HW_STREAMER) - { - #ifndef __unix__ - if(InCtrlEndPt3) - InCtrlEndPt3->Read(buffer, len); - else - len = 0; - #else - len = libusb_control_transfer(dev_handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN ,CTR_R_REQCODE ,CTR_R_VALUE, CTR_R_INDEX, buffer, len, USB_TIMEOUT); - #endif - } - else - { - #ifndef __unix__ - if(InCtrEndPt) - InCtrEndPt->XferData(buffer, len); - else - len = 0; - #else - int actual = 0; - libusb_bulk_transfer(dev_handle, 0x81, buffer, len, &actual, USB_TIMEOUT); - len = actual; - #endif - } - } - return len; -} - -#ifdef __unix__ -/** @brief Function for handling libusb callbacks -*/ -void callback_libusbtransfer(libusb_transfer *trans) -{ - USBTransferContext *context = reinterpret_cast(trans->user_data); - switch(trans->status) - { - case LIBUSB_TRANSFER_CANCELLED: - printf("Transfer canceled\n" ); - context->bytesXfered = trans->actual_length; - context->done = true; - context->used = false; - context->reset(); - break; - case LIBUSB_TRANSFER_COMPLETED: - if(trans->actual_length == context->bytesExpected) - { - context->bytesXfered = trans->actual_length; - context->done = true; - } - //printf("Transfer complete %i\n", trans->actual_length); - break; - case LIBUSB_TRANSFER_ERROR: - printf("TRANSFER ERRRO\n"); - break; - case LIBUSB_TRANSFER_TIMED_OUT: - printf("transfer timed out\n"); - - break; - case LIBUSB_TRANSFER_OVERFLOW: - printf("transfer overflow\n"); - - break; - case LIBUSB_TRANSFER_STALL: - printf("transfer stalled\n"); - break; - } - context->mPacketProcessed.notify_one(); -} -#endif - -/** @brief Finds all chips connected to usb ports - @return number of devices found -*/ -int ConnectionUSB::RefreshDeviceList() -{ - #ifndef __unix__ - USBDevicePrimary->Close(); - currentDeviceIndex = -1; - m_deviceNames.clear(); - string name; - if (USBDevicePrimary->DeviceCount()) - { - for (int i=0; iDeviceCount(); ++i) - { - Open(i); - name = DeviceName(); - m_deviceNames.push_back(name); - } - currentDeviceIndex = -1; - } - #else - m_dev_pid_vid.clear(); - m_deviceNames.clear(); - int usbDeviceCount = libusb_get_device_list(ctx, &devs); - if(usbDeviceCount > 0) - { - libusb_device_descriptor desc; - for(int i=0; i(pid,vid)); - } - else if(pid == 241) - { - m_hardwareName = HW_DIGIRED; - libusb_device_handle *tempDev_handle; - tempDev_handle = libusb_open_device_with_vid_pid(ctx, vid, pid); - if(libusb_kernel_driver_active(tempDev_handle, 0) == 1) //find out if kernel driver is attached - { - if(libusb_detach_kernel_driver(tempDev_handle, 0) == 0) //detach it - printf("Kernel Driver Detached!\n"); - } - if(libusb_claim_interface(tempDev_handle, 0) < 0) //claim interface 0 (the first) of device - { - printf("Cannot Claim Interface\n"); - } - - string fullName; - //check operating speed - int speed = libusb_get_device_speed(devs[i]); - if(speed == LIBUSB_SPEED_HIGH) - fullName = "USB 2.0"; - else if(speed == LIBUSB_SPEED_SUPER) - fullName = "USB 3.0"; - else - fullName = "USB"; - fullName += " ("; - //read device name - char data[255]; - memset(data, 0, 255); - int st = libusb_get_string_descriptor_ascii(tempDev_handle, 2, (unsigned char*)data, 255); - if(strlen(data) > 0) - fullName += data; - fullName += ")"; - libusb_close(tempDev_handle); - - m_deviceNames.push_back(fullName); - m_dev_pid_vid.push_back( pair(pid,vid)); - } - } - } - } - else - { - libusb_free_device_list(devs, 1); - return 0; - } - #endif - return m_deviceNames.size(); -} - -void ConnectionUSB::ClearComm() -{ -} - -/** @return name of currently opened device as string. -*/ -string ConnectionUSB::DeviceName() -{ -#ifndef __unix__ - string name; - char tempName[USB_STRING_MAXLEN]; - //memcpy(tempName, USBDevicePrimary->FriendlyName, USB_STRING_MAXLEN); - //name = tempName; - - for (int i = 0; i < USB_STRING_MAXLEN; ++i) - tempName[i] = USBDevicePrimary->DeviceName[i]; - if (USBDevicePrimary->bSuperSpeed == true) - name = "USB 3.0"; - else if (USBDevicePrimary->bHighSpeed == true) - name = "USB 2.0"; - else - name = "USB"; - name += " ("; - name += tempName; - name += ")"; - return name; -#else - if(dev_handle != 0) - { - char data[255]; - int st = libusb_get_string_descriptor_ascii(dev_handle, 2, (unsigned char*)data, 255); - return string(data); - } - return "no name"; -#endif -} - -/** - @brief Starts asynchronous data reading from board - @param *buffer buffer where to store received data - @param length number of bytes to read - @return handle of transfer context -*/ -int ConnectionUSB::BeginDataReading(char *buffer, long length) -{ - int i = 0; - bool contextFound = false; - //find not used context - for(i = 0; iBeginDataXfer((unsigned char*)buffer, length, contexts[i].inOvLap); - return i; - #else - unsigned int Timeout = 1000; - libusb_transfer *tr = contexts[i].transfer; - libusb_fill_bulk_transfer(tr, dev_handle, 0x81, (unsigned char*)buffer, length, callback_libusbtransfer, &contexts[i], Timeout); - contexts[i].done = false; - contexts[i].bytesXfered = 0; - contexts[i].bytesExpected = length; - int status = libusb_submit_transfer(tr); - int actual = 0; - //int status = libusb_bulk_transfer(dev_handle, 0x81, (unsigned char*)buffer, length, &actual, USB_TIMEOUT); - if(status != 0) - printf("ERROR BEGIN DATA TRANSFER %s\n", libusb_error_name(status)); - #endif - return i; -} - -/** - @brief Waits for asynchronous data reception - @param contextHandle handle of which context data to wait - @param timeout_ms number of miliseconds to wait - @return 1-data received, 0-data not received -*/ -int ConnectionUSB::WaitForReading(int contextHandle, unsigned int timeout_ms) -{ - if( contexts[contextHandle].used == true && contextHandle >= 0) - { - int status = 0; - #ifndef __unix__ - if(InEndPt) - status = InEndPt->WaitForXfer(contexts[contextHandle].inOvLap, timeout_ms); - return status; - #else - - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 0; - if(libusb_handle_events_timeout_completed(ctx, &tv, NULL) != 0) - printf("error libusb_handle_events %i\n", status); - - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - - while(contexts[contextHandle].done == false && std::chrono::duration_cast(t2 - t1).count() < timeout_ms) - { - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 300; - std::this_thread::yield(); - //if(libusb_handle_events(ctx) != 0) - if(libusb_handle_events_timeout_completed(ctx, &tv, NULL) != 0) - printf("error libusb_handle_events %i\n", status); - t2 = chrono::high_resolution_clock::now(); - //std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - std::unique_lock lck(contexts[contextHandle].m_lock); - while(contexts[contextHandle].done == false) //is changed in libusb callback - { - if(contexts[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return 0; - } - return contexts[contextHandle].done == true; - #endif - } - else - return 0; -} - -/** - @brief Finishes asynchronous data reading from board - @param buffer array where to store received data - @param length number of bytes to read, function changes this value to number of bytes actually received - @param contextHandle handle of which context to finish - @return false failure, true number of bytes received -*/ -int ConnectionUSB::FinishDataReading(char *buffer, long &length, int contextHandle) -{ - if( contexts[contextHandle].used == true && contextHandle >= 0) - { - #ifndef __unix__ - int status = 0; - if(InEndPt) - status = InEndPt->FinishDataXfer((unsigned char*)buffer, length, contexts[contextHandle].inOvLap, contexts[contextHandle].context); - contexts[contextHandle].used = false; - contexts[contextHandle].reset(); - return length; - #else - length = contexts[contextHandle].bytesXfered; - contexts[contextHandle].used = false; - contexts[contextHandle].reset(); - return length; - #endif - } - else - return 0; -} - -int ConnectionUSB::ReadDataBlocking(char *buffer, long &length, int timeout_ms) -{ -#ifndef __unix__ - return InEndPt->XferData((unsigned char*)buffer, length); -#else - return 0; -#endif -} - - -/** - @brief Aborts reading operations -*/ -void ConnectionUSB::AbortReading() -{ -#ifndef __unix__ - InEndPt->Abort(); -#else - for(int i=0; iBeginDataXfer((unsigned char*)buffer, length, contextsToSend[i].inOvLap); - return i; - #else - unsigned int Timeout = 1000; - libusb_transfer *tr = contextsToSend[i].transfer; - //libusb_set_iso_packet_lengths(contexts[i].transfer, 512*64); - libusb_fill_bulk_transfer(tr, dev_handle, 0x1, (unsigned char*)buffer, length, callback_libusbtransfer, &contextsToSend[i], Timeout); - contextsToSend[i].done = false; - contextsToSend[i].bytesXfered = 0; - contextsToSend[i].bytesExpected = length; - libusb_submit_transfer(tr); - #endif - return i; -} - -/** - @brief Waits for asynchronous data sending - @param contextHandle handle of which context data to wait - @param timeout_ms number of miliseconds to wait - @return 1-data received, 0-data not received -*/ -int ConnectionUSB::WaitForSending(int contextHandle, unsigned int timeout_ms) -{ - if( contextsToSend[contextHandle].used == true ) - { - #ifndef __unix__ - int status = 0; - if(OutEndPt) - status = OutEndPt->WaitForXfer(contextsToSend[contextHandle].inOvLap, timeout_ms); - return status; - #else - auto t1 = chrono::high_resolution_clock::now(); - auto t2 = chrono::high_resolution_clock::now(); - while(contextsToSend[contextHandle].done == false && std::chrono::duration_cast(t2 - t1).count() < timeout_ms) - { - /* struct timeval tv; - tv.tv_sec = 1; - tv.tv_usec = 0; - int status = libusb_handle_events_timeout_completed(ctx, &tv, NULL); - if(status != 0) - printf("error libusb_handle_events %i\n", status);*/ - t2 = chrono::high_resolution_clock::now(); - //std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - std::unique_lock lck(contextsToSend[contextHandle].m_lock); - while(contextsToSend[contextHandle].done == false) //is changed in libusb callback - { - if(contextsToSend[contextHandle].mPacketProcessed.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return 0; - } - return contextsToSend[contextHandle].done == true; - #endif - } - else - return 0; -} - -/** - @brief Finishes asynchronous data sending to board - @param buffer array where to store received data - @param length number of bytes to read, function changes this value to number of bytes acctually received - @param contextHandle handle of which context to finish - @return false failure, true number of bytes sent -*/ -int ConnectionUSB::FinishDataSending(const char *buffer, long &length, int contextHandle) -{ - if( contextsToSend[contextHandle].used == true) - { - #ifndef __unix__ - if(OutEndPt) - OutEndPt->FinishDataXfer((unsigned char*)buffer, length, contextsToSend[contextHandle].inOvLap, contextsToSend[contextHandle].context); - contextsToSend[contextHandle].used = false; - contextsToSend[contextHandle].reset(); - return length; - #else - length = contextsToSend[contextHandle].bytesXfered; - contextsToSend[contextHandle].used = false; - contextsToSend[contextHandle].reset(); - return length; - #endif - } - else - return 0; -} - -/** - @brief Aborts sending operations -*/ -void ConnectionUSB::AbortSending() -{ -#ifndef __unix__ - OutEndPt->Abort(); -#else - for (int i = 0; i ConnectionUSB::GetDeviceNames() -{ - return m_deviceNames; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.h deleted file mode 100644 index f3048c1842..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/ConnectionUSB.h +++ /dev/null @@ -1,144 +0,0 @@ -/** -@file ConnectionUSB.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for data writing and reading through USB port -*/ - -#ifndef USB_PORT_CONNECTION_H -#define USB_PORT_CONNECTION_H - -#include "IConnection.h" - -#ifndef __unix__ -#include "windows.h" -#include "CyAPI.h" -#else -#include -#include -#include -#include -#endif - -#define USB_MAX_CONTEXTS 64 //maximum number of contexts for asynchronous transfers - -/** @brief Wrapper class for holding USB asynchronous transfers contexts -*/ -class USBTransferContext -{ -public: - USBTransferContext() : used(false) - { - #ifndef __unix__ - inOvLap = new OVERLAPPED; - memset(inOvLap, 0, sizeof(OVERLAPPED)); - inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); - context = NULL; - #else - transfer = libusb_alloc_transfer(0); - bytesXfered = 0; - bytesExpected = 0; - done = 0; - #endif - } - ~USBTransferContext() - { - #ifndef __unix__ - CloseHandle(inOvLap->hEvent); - delete inOvLap; - #else - libusb_free_transfer(transfer); - #endif - } - bool reset() - { - if(used) - return false; - #ifndef __unix__ - CloseHandle(inOvLap->hEvent); - memset(inOvLap, 0, sizeof(OVERLAPPED)); - inOvLap->hEvent = CreateEvent(NULL, false, false, NULL); - #endif - return true; - } - bool used; - #ifndef __unix__ - PUCHAR context; - OVERLAPPED *inOvLap; - #else - libusb_transfer* transfer; - long bytesXfered; - long bytesExpected; - bool done; - std::mutex m_lock; - std::condition_variable mPacketProcessed; - #endif -}; - -class ConnectionUSB : public IConnection -{ -public: - ConnectionUSB(); - ~ConnectionUSB(); - - void FindDevices(); - DeviceStatus Open(); - DeviceStatus Open(unsigned index); - void Close(); - bool IsOpen(); - int GetOpenedIndex(); - - int Write(const unsigned char *buffer, int length, int timeout_ms = 0); - int Read(unsigned char *buffer, int length, int timeout_ms = 0); - - virtual int BeginDataReading(char *buffer, long length); - virtual int WaitForReading(int contextHandle, unsigned int timeout_ms); - virtual int FinishDataReading(char *buffer, long &length, int contextHandle); - virtual void AbortReading(); - virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms); - - virtual int BeginDataSending(const char *buffer, long length); - virtual int WaitForSending(int contextHandle, unsigned int timeout_ms); - virtual int FinishDataSending(const char *buffer, long &length, int contextHandle); - virtual void AbortSending(); - - std::vector GetDeviceNames(); - int RefreshDeviceList(); - void ClearComm(); -private: - int currentDeviceIndex; - std::string DeviceName(); - - std::vector m_deviceNames; - std::string m_hardwareName; - int m_hardwareVer; - - USBTransferContext contexts[USB_MAX_CONTEXTS]; - USBTransferContext contextsToSend[USB_MAX_CONTEXTS]; - void Initialize(); - - bool isConnected; - int currentPortIndex; - - #ifndef __unix__ - CCyUSBDevice *USBDevicePrimary; - //control endpoints for DigiRed - CCyControlEndPoint *InCtrlEndPt3; - CCyControlEndPoint *OutCtrlEndPt3; - - //control endpoints for DigiGreen - CCyUSBEndPoint *OutCtrEndPt; - CCyUSBEndPoint *InCtrEndPt; - - //end points for samples reading and writing - CCyUSBEndPoint *InEndPt; - CCyUSBEndPoint *OutEndPt; - - #else - libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices - libusb_device_handle *dev_handle; //a device handle - libusb_context *ctx; //a libusb session - std::vector > m_dev_pid_vid; - #endif -}; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/IConnection.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/IConnection.h deleted file mode 100644 index 5804f1149f..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/IConnection.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - @file IConnection.h - @author Lime Microsystems - @brief Interface class for connection types -*/ - -#ifndef ICONNECTION_H -#define ICONNECTION_H - -#include -#include - -using namespace std; - -class IConnection -{ -public: - /// Supported connection types. - enum eConnectionType - { - CONNECTION_UNDEFINED = -1, - COM_PORT = 0, - USB_PORT = 1, - SPI_PORT = 2, - //insert new types here - CONNECTION_TYPES_COUNT //used only for memory allocation - }; - - enum DeviceStatus - { - SUCCESS, - FAILURE, - END_POINTS_NOT_FOUND, - CANNOT_CLAIM_INTERFACE - }; - - IConnection() : m_connectionType(CONNECTION_UNDEFINED){}; - virtual ~IConnection(){}; - virtual int RefreshDeviceList() = 0; - virtual DeviceStatus Open(unsigned i) = 0; - virtual void Close() = 0; - virtual bool IsOpen() = 0; - virtual int GetOpenedIndex() = 0; - - virtual int Write(const unsigned char *buffer, int length, int timeout_ms = 0) = 0; - virtual int Read(unsigned char *buffer, int length, int timeout_ms = 0) = 0; - - virtual std::vector GetDeviceNames() = 0; - - virtual eConnectionType GetType() { return m_connectionType; }; - virtual bool SetParam(const char *name, const char* value) {return false;}; - - virtual int BeginDataReading(char *buffer, long length){ return -1; }; - virtual int WaitForReading(int contextHandle, unsigned int timeout_ms){ return 0;}; - virtual int FinishDataReading(char *buffer, long &length, int contextHandle){ return 0;} - virtual void AbortReading(){}; - virtual int ReadDataBlocking(char *buffer, long &length, int timeout_ms){ return 0; } - - virtual int BeginDataSending(const char *buffer, long length){ return -1; }; - virtual int WaitForSending(int contextHandle, unsigned int timeout_ms){ return 0;}; - virtual int FinishDataSending(const char *buffer, long &length, int contextHandle){ return 0;} - virtual void AbortSending(){}; -protected: - eConnectionType m_connectionType; -}; - -#endif - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.cpp deleted file mode 100644 index 0e5ec66762..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.cpp +++ /dev/null @@ -1,325 +0,0 @@ -/** -@file LMScomms.cpp -@author Lime Microsystems (www.limemicro.com) -@brief Implementation of data transmission to LMS boards -*/ - -#include "lmsComms.h" - -LMScomms::LMScomms(const IConnection::eConnectionType port_type) : ConnectionManager(port_type) -{ - callback_logData = nullptr; - unsigned short test = 0x1234; - unsigned char* bytes = (unsigned char*)&test; - if(bytes[0] == 0x12 && bytes[1] == 0x34) - mSystemBigEndian = true; - else - mSystemBigEndian = false; -} - -LMScomms::~LMScomms() -{ -} - -/** @brief Transfers data between packet and connected device - @param pkt packet containing output data and to receive incomming data - @return 0: success, other: failure -*/ -LMScomms::TransferStatus LMScomms::TransferPacket(GenericPacket& pkt) -{ - std::lock_guard lock(mControlPortLock); - TransferStatus status = TRANSFER_SUCCESS; - if(IsOpen() == false) - return NOT_CONNECTED; - - int packetLen; - eLMS_PROTOCOL protocol = LMS_PROTOCOL_UNDEFINED; - if(activeControlPort->GetType() == IConnection::SPI_PORT) - protocol = LMS_PROTOCOL_NOVENA; - else - protocol = LMS_PROTOCOL_LMS64C; - switch(protocol) - { - case LMS_PROTOCOL_UNDEFINED: - return TRANSFER_FAILED; - case LMS_PROTOCOL_LMS64C: - packetLen = ProtocolLMS64C::pktLength; - break; - case LMS_PROTOCOL_NOVENA: - packetLen = pkt.outBuffer.size() > ProtocolNovena::pktLength ? ProtocolNovena::pktLength : pkt.outBuffer.size(); - break; - default: - packetLen = 0; - return TRANSFER_FAILED; - } - int outLen = 0; - unsigned char* outBuffer = NULL; - outBuffer = PreparePacket(pkt, outLen, protocol); - unsigned char* inBuffer = new unsigned char[outLen]; - memset(inBuffer, 0, outLen); - - int outBufPos = 0; - int inDataPos = 0; - if(outLen == 0) - { - //printf("packet outlen = 0\n"); - outLen = 1; - } - - if(protocol == LMS_PROTOCOL_NOVENA) - { - bool transferData = true; //some commands are fake, so don't need transferring - if(pkt.cmd == CMD_GET_INFO) - { - //spi does not have GET INFO, fake it to inform what device it is - pkt.status = STATUS_COMPLETED_CMD; - pkt.inBuffer.clear(); - pkt.inBuffer.resize(64, 0); - pkt.inBuffer[0] = 0; //firmware - pkt.inBuffer[1] = LMS_DEV_NOVENA; //device - pkt.inBuffer[2] = 0; //protocol - pkt.inBuffer[3] = 0; //hardware - pkt.inBuffer[4] = EXP_BOARD_UNSUPPORTED; //expansion - transferData = false; - } - - if(transferData) - { - if (callback_logData) - callback_logData(true, outBuffer, outLen); - int bytesWritten = Write(outBuffer, outLen); - if( bytesWritten == outLen) - { - if(pkt.cmd == CMD_LMS7002_RD) - { - inDataPos = Read(&inBuffer[inDataPos], outLen); - if(inDataPos != outLen) - status = TRANSFER_FAILED; - else - { - if (callback_logData) - callback_logData(false, inBuffer, inDataPos); - } - } - ParsePacket(pkt, inBuffer, inDataPos, protocol); - } - else - status = TRANSFER_FAILED; - } - } - else - { - for(int i=0; i= 5) - { - info.firmware = pkt.inBuffer[0]; - info.device = pkt.inBuffer[1] < LMS_DEV_COUNT ? (eLMS_DEV)pkt.inBuffer[1] : LMS_DEV_UNKNOWN; - info.protocol = pkt.inBuffer[2]; - info.hardware = pkt.inBuffer[3]; - info.expansion = pkt.inBuffer[4] < EXP_BOARD_COUNT ? (eEXP_BOARD)pkt.inBuffer[4] : EXP_BOARD_UNKNOWN; - } - return info; -} - -/** @brief Takes generic packet and converts to specific protocol buffer - @param pkt generic data packet to convert - @param length returns length of returned buffer - @param protocol which protocol to use for data - @return pointer to data buffer, must be manually deleted after use -*/ -unsigned char* LMScomms::PreparePacket(const GenericPacket& pkt, int& length, const eLMS_PROTOCOL protocol) -{ - unsigned char* buffer = NULL; - if(protocol == LMS_PROTOCOL_UNDEFINED) - return NULL; - - if(protocol == LMS_PROTOCOL_LMS64C) - { - ProtocolLMS64C packet; - int maxDataLength = packet.maxDataLength; - packet.cmd = pkt.cmd; - packet.status = pkt.status; - int byteBlockRatio = 1; //block ratio - how many bytes in one block - switch( packet.cmd ) - { - case CMD_PROG_MCU: - case CMD_GET_INFO: - case CMD_SI5351_RD: - case CMD_SI5356_RD: - byteBlockRatio = 1; - break; - case CMD_SI5351_WR: - case CMD_SI5356_WR: - byteBlockRatio = 2; - break; - case CMD_LMS7002_RD: - case CMD_BRDSPI_RD: - case CMD_BRDSPI8_RD: - byteBlockRatio = 2; - break; - case CMD_ADF4002_WR: - byteBlockRatio = 3; - break; - case CMD_LMS7002_WR: - case CMD_BRDSPI_WR: - case CMD_ANALOG_VAL_WR: - byteBlockRatio = 4; - break; - default: - byteBlockRatio = 1; - } - if (packet.cmd == CMD_LMS7002_RD || packet.cmd == CMD_BRDSPI_RD) - maxDataLength = maxDataLength/2; - if (packet.cmd == CMD_ANALOG_VAL_RD) - maxDataLength = maxDataLength / 4; - int blockCount = pkt.outBuffer.size()/byteBlockRatio; - int bufLen = blockCount/(maxDataLength/byteBlockRatio) - +(blockCount%(maxDataLength/byteBlockRatio)!=0); - bufLen *= packet.pktLength; - if(bufLen == 0) - bufLen = packet.pktLength; - buffer = new unsigned char[bufLen]; - memset(buffer, 0, bufLen); - int srcPos = 0; - for(int j=0; j*packet.pktLength (maxDataLength/byteBlockRatio)) - { - buffer[pktPos+2] = maxDataLength/byteBlockRatio; - blockCount -= buffer[pktPos+2]; - } - else - buffer[pktPos+2] = blockCount; - memcpy(&buffer[pktPos+3], packet.reserved, sizeof(packet.reserved)); - int bytesToPack = (maxDataLength/byteBlockRatio)*byteBlockRatio; - for (int k = 0; k callback) -{ - callback_logData = callback; -} diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.h deleted file mode 100644 index f811d29302..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/connectionManager/lmsComms.h +++ /dev/null @@ -1,111 +0,0 @@ -/** -@file LMScomms.h -@author Lime Microsystems (www.limemicro.com) -@brief Class for handling data transmission to LMS boards -*/ - -#ifndef LMS_COMMS_H -#define LMS_COMMS_H - -#include "lms7002_defines.h" -#include "ConnectionManager.h" -#include -#include - -struct LMSinfo -{ - eLMS_DEV device; - eEXP_BOARD expansion; - int firmware; - int hardware; - int protocol; -}; - -/* @brief Class for abstracting transfering data to and from chip -*/ -class LMScomms : public ConnectionManager -{ -public: - enum TransferStatus - { - TRANSFER_SUCCESS, - TRANSFER_FAILED, - NOT_CONNECTED - }; - - enum eLMS_PROTOCOL - { - LMS_PROTOCOL_UNDEFINED = 0, - LMS_PROTOCOL_DIGIC, - LMS_PROTOCOL_LMS64C, - LMS_PROTOCOL_NOVENA, - }; - struct ProtocolDIGIC - { - static const int pktLength = 64; - static const int maxDataLength = 60; - ProtocolDIGIC() : cmd(0), i2cAddr(0), blockCount(0) {}; - unsigned char cmd; - unsigned char i2cAddr; - unsigned char blockCount; - unsigned char reserved; - unsigned char data[maxDataLength]; - }; - - struct ProtocolLMS64C - { - static const int pktLength = 64; - static const int maxDataLength = 56; - ProtocolLMS64C() :cmd(0),status(STATUS_UNDEFINED),blockCount(0) - { - memset(reserved, 0, 5); - }; - unsigned char cmd; - unsigned char status; - unsigned char blockCount; - unsigned char reserved[5]; - unsigned char data[maxDataLength]; - }; - - struct ProtocolNovena - { - static const int pktLength = 128; - static const int maxDataLength = 128; - ProtocolNovena() :cmd(0),status(0) {}; - unsigned char cmd; - unsigned char status; - unsigned char blockCount; - unsigned char data[maxDataLength]; - }; - - struct GenericPacket - { - GenericPacket() - { - cmd = CMD_GET_INFO; - status = STATUS_UNDEFINED; - } - - eCMD_LMS cmd; - eCMD_STATUS status; - vector outBuffer; - vector inBuffer; - }; - - LMScomms(const IConnection::eConnectionType port_type); - ~LMScomms(); - - virtual TransferStatus TransferPacket(GenericPacket &pkt); - LMSinfo GetInfo(); - void SetDataLogCallback(std::function callback); -protected: - std::function callback_logData; - std::mutex mControlPortLock; - unsigned char* PreparePacket(const GenericPacket &pkt, int &length, const eLMS_PROTOCOL protocol); - int ParsePacket(GenericPacket &pkt, const unsigned char* buffer, const int length, const eLMS_PROTOCOL protocol); -protected: - bool mSystemBigEndian; -}; - -#endif // LMS_COMMS_H - diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h deleted file mode 100644 index c97ac7857d..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/dataTypes.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef LMS_DATA_TYPES_H -#define LMS_DATA_TYPES_H - -typedef struct -{ - uint8_t reserved[8]; - uint64_t counter; - int16_t samples[2040]; -} PacketLTE; - -typedef struct -{ - int16_t i; - int16_t q; -} complex16_t; - -class SamplesPacket -{ - public: - uint64_t timestamp; //timestamp of the packet - uint16_t first; //index of first unused sample in samples[] - uint16_t last; //end index of samples - static const uint16_t samplesCount = 1024; //maximum number of samples in packet - complex16_t samples[samplesCount]; //must be power of two -}; - -complex16_t operator &=(complex16_t & other1, const complex16_t & other) // copy assignment -{ - other1.i = other.i; - other1.q = other.q; - return other1; -} - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h deleted file mode 100644 index 1868c64af7..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/fifo.h +++ /dev/null @@ -1,180 +0,0 @@ -#ifndef LMS_FIFO_BUFFER_H -#define LMS_FIFO_BUFFER_H - -#include -#include -#include -#include -#include -#include "dataTypes.h" - -class LMS_SamplesFIFO -{ -public: - struct BufferInfo - { - uint32_t size; - uint32_t itemsFilled; - }; - - BufferInfo GetInfo() - { - std::unique_lock lck2(readLock); - std::unique_lock lck(writeLock); - BufferInfo stats; - stats.size = (uint32_t)mBuffer.size(); - stats.itemsFilled = mElementsFilled.load(); - return stats; - } - - LMS_SamplesFIFO(uint32_t bufLength) - { - Reset(bufLength); - } - - ~LMS_SamplesFIFO(){}; - - /** @brief inserts items to ring buffer - @param buffer data source - @param itemCount number of buffer items to insert - @param timeout_ms timeout duration for operation - @param overwrite enable to overwrite oldest items inside the buffer - @return number of items added - */ - uint32_t push_packet(SamplesPacket *buffer, const uint32_t itemCount, const uint32_t timeout_ms, const bool overwrite = true) - { - uint32_t addedItems = 0; - std::unique_lock lck(writeLock); - while (addedItems < itemCount) - { - while (mElementsFilled.load() >= mBuffer.size()) //wait for free space to insert items - { - if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return addedItems; //dropped all items - } - - uint32_t itemsToInsert = itemCount - addedItems; - uint32_t itemsToEnd = (uint32_t)mBuffer.size() - mTail.load(); //might need to split memcpy into two operations - if (itemsToInsert > itemsToEnd) - { - memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToEnd*sizeof(SamplesPacket)); - memcpy(&mBuffer[0], &buffer[addedItems+itemsToEnd], (itemsToInsert - itemsToEnd)*sizeof(SamplesPacket)); - } - else - memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToInsert*sizeof(SamplesPacket)); - mTail.store((mTail.load() + itemsToInsert) & (mBuffer.size() - 1)); - mElementsFilled.fetch_add(itemsToInsert); - canRead.notify_one(); - addedItems += itemsToInsert; - } - return addedItems; - } - - /** @brief inserts items to ring buffer - @param buffer data source - @param itemCount number of buffer items to insert - @param timeout_ms timeout duration for operation - @param overwrite enable to overwrite oldest items inside the buffer - @return number of items added - */ - uint32_t push_samples(const complex16_t *buffer, const uint32_t samplesCount, uint64_t timestamp, const uint32_t timeout_ms, const bool overwrite = true) - { - assert(buffer != nullptr); - const int samplesInPacket = SamplesPacket::samplesCount; - uint32_t samplesTaken = 0; - std::unique_lock lck(writeLock); - while (samplesTaken < samplesCount) - { - while (mElementsFilled.load() >= mBuffer.size()) //buffer might be full, wait for free slots - { - if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return samplesTaken; - } - - int tailIndex = mTail.load(); //which element to fill - while (mElementsFilled.load() < mBuffer.size() && samplesTaken < samplesCount) // not to release lock too often - { - mBuffer[tailIndex].timestamp = timestamp + samplesTaken; - mBuffer[tailIndex].first = 0; - mBuffer[tailIndex].last = 0; - while (mBuffer[tailIndex].last < samplesInPacket && samplesTaken < samplesCount) - { - mBuffer[tailIndex].samples[mBuffer[tailIndex].last++] = buffer[samplesTaken++]; - } - mTail.store((tailIndex + 1) & (mBuffer.size() - 1));//advance to next one - tailIndex = mTail.load(); - mElementsFilled.fetch_add(1); - canRead.notify_one(); - } - } - return samplesTaken; - } - - /** @brief Takes items out of ring buffer - @param buffer data destination - @param samplesCount number of samples to pop - @param timestamp returns timestamp of the first sample in buffer - @param timeout_ms timeout duration for operation - @return number of samples returned - */ - uint32_t pop_samples(complex16_t* buffer, const uint32_t samplesCount, uint64_t *timestamp, const uint32_t timeout_ms) - { - assert(buffer != nullptr); - const int samplesInPacket = SamplesPacket::samplesCount; - uint32_t samplesFilled = 0; - *timestamp = 0; - std::unique_lock lck(readLock); - while (samplesFilled < samplesCount) - { - while (mElementsFilled.load() == 0) //buffer might be empty, wait for packets - { - if (canRead.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return samplesFilled; - } - if(samplesFilled == 0) - *timestamp = mBuffer[mHead.load()].timestamp + mBuffer[mHead.load()].first; - - while(mElementsFilled.load() > 0 && samplesFilled < samplesCount) - { - int headIndex = mHead.load(); - while (mBuffer[headIndex].first < mBuffer[headIndex].last && samplesFilled < samplesCount) - { - buffer[samplesFilled++] = mBuffer[headIndex].samples[mBuffer[headIndex].first++]; - } - if (mBuffer[headIndex].first == mBuffer[headIndex].last) //packet depleated - { - mBuffer[headIndex].first = 0; - mBuffer[headIndex].last = 0; - mBuffer[headIndex].timestamp = 0; - mHead.store( (headIndex + 1) & (mBuffer.size() - 1) );//advance to next one - headIndex = mHead.load(); - mElementsFilled.fetch_sub(1); - canWrite.notify_one(); - } - } - } - return samplesFilled; - } - - void Reset(uint32_t bufLength) - { - std::unique_lock lck(writeLock); - std::unique_lock lck2(readLock); - mBuffer.resize(bufLength); - mHead.store(0); - mTail.store(0); - mElementsFilled.store(0); - } - -protected: - std::vector mBuffer; - std::atomic mHead; - std::atomic mTail; - std::mutex writeLock; - std::mutex readLock; - std::atomic mElementsFilled; - std::condition_variable canWrite; - std::condition_variable canRead; -}; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h b/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h deleted file mode 100644 index e4882f8924..0000000000 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lmsSDR/ringBuffer.h +++ /dev/null @@ -1,143 +0,0 @@ -#ifndef LMS_RING_BUFFER_H -#define LMS_RING_BUFFER_H - -#include -#include -#include -#include - -template -class RingBuffer -{ -public: - struct BufferInfo - { - uint32_t size; - uint32_t itemsFilled; - }; - - BufferInfo GetInfo() - { - unique_lock lck(mLock); - BufferInfo stats; - stats.size = (uint32_t)mBuffer.size(); - stats.itemsFilled = mElementsFilled; - return stats; - } - - RingBuffer(uint32_t bufLength) - { - Reset(bufLength); - } - ~RingBuffer(){}; - - /** @brief inserts items to ring buffer - @param buffer data source - @param itemCount number of buffer items to insert - @param timeout_ms timeout duration for operation - @return number of items added - */ - uint32_t push_back(const T* buffer, const uint32_t itemCount, const uint32_t timeout_ms) - { - uint32_t addedItems = 0; - while (addedItems < itemCount) - { - unique_lock lck(mLock); - while (mElementsFilled >= mBuffer.size()) //wait for free space to insert items - { - if (canWrite.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return addedItems; //dropped all items - } - - uint32_t itemsToInsert = itemCount - addedItems; - uint32_t itemsToEnd = (uint32_t)mBuffer.size() - mTail.load(); //might need to split memcpy into two operations - if (itemsToInsert > itemsToEnd) - { - memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToEnd*sizeof(T)); - memcpy(&mBuffer[0], &buffer[addedItems+itemsToEnd], (itemsToInsert - itemsToEnd)*sizeof(T)); - } - else - memcpy(&mBuffer[mTail], &buffer[addedItems], itemsToInsert*sizeof(T)); - mTail.store((mTail.load() + itemsToInsert) & (mBuffer.size() - 1)); - mElementsFilled += itemsToInsert; - lck.unlock(); - canRead.notify_one(); - addedItems += itemsToInsert; - } - return addedItems; - } - - /** @brief Takes items out of ring buffer - @param buffer data destination - @param itemCount number of items to extract from ring buffer - @param timeout_ms timeout duration for operation - @return number of items returned - */ - uint32_t pop_front(T* buffer, const uint32_t itemCount, const uint32_t timeout_ms) - { - assert(buffer != nullptr); - uint32_t itemsTaken = 0; - T* destBuffer = buffer; - while (itemsTaken < itemCount) - { - unique_lock lck(mLock); - while (mElementsFilled == 0) //buffer might be empty, wait for items - { - if (canRead.wait_for(lck, std::chrono::milliseconds(timeout_ms)) == std::cv_status::timeout) - return itemsTaken; - } - - unsigned int itemsToCopy = itemCount - itemsTaken; - if (itemsToCopy > mElementsFilled) - itemsToCopy = mElementsFilled; - unsigned int itemsToEnd = (uint32_t)mBuffer.size() - mHead.load(); //migth need to split memcpy into two operations - if (itemsToEnd < itemsToCopy) - { - memcpy(&destBuffer[itemsTaken], &mBuffer[mHead.load()], sizeof(T)*itemsToEnd); - memcpy(&destBuffer[itemsTaken+itemsToEnd], &mBuffer[0], sizeof(T)*(itemsToCopy - itemsToEnd)); - mHead.store((itemsToCopy - itemsToEnd) & (mBuffer.size() - 1)); - } - else - { - memcpy(&destBuffer[itemsTaken], &mBuffer[mHead.load()], sizeof(T)*itemsToCopy); - int headVal = mHead.load(); - int valueToStore = (headVal + itemsToCopy) & (mBuffer.size() - 1); - mHead.store(valueToStore); - headVal = mHead.load(); - } - mElementsFilled -= itemsToCopy; - lck.unlock(); - canWrite.notify_one(); - itemsTaken += itemsToCopy; - } - return itemsTaken; - } - - void Reset(uint32_t bufLength) - { - std::unique_lock lck(mLock); - if (bufLength >= (uint32_t)(1 << 31)) - bufLength = (uint32_t)(1 << 31); - for (int i = 0; i < 32; ++i) - if ((1 << i) >= bufLength) - { - bufLength = (1 << i); - break; - } - mBuffer.resize(bufLength); - mHead.store(0); - mTail.store(0); - mElementsFilled = 0; - } - -protected: - std::vector mBuffer; - std::atomic mHead; - std::atomic mTail; - std::mutex mLock; - uint32_t mElementsFilled; - std::condition_variable canWrite; - std::condition_variable canRead; -}; - -#endif diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp index 4be796e588..e1a1b768b2 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/lms_lib.cpp @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -40,32 +31,32 @@ #include #include -#include "common_lib.h" -#include "LMS_SDR.h" -#include "LMS7002M.h" -#include "Si5351C.h" -#include "LMS_StreamBoard.h" -#include "LMS7002M_RegistersMap.h" - #include /** @addtogroup _LMSSDR_PHY_RF_INTERFACE_ * @{ */ +#include +#include +#include +#include "common_lib.h" -///define for parameter enumeration if prefix might be needed -#define LMS7param(id) id +lms_device_t* lms_device; +lms_stream_t rx_stream; +lms_stream_t tx_stream; -LMScomms* usbport; -LMScomms* comport; -LMS7002M* lms7; -Si5351C* Si; -LMS_StreamBoard *lmsStream; +/* We have a strange behavior when we just start reading + * from the device (inconsistent values of the timestamp). + * A quick solution is to discard the very first read packet + * after a "start". + * The following global variable "first_rx" serves that purpose. + */ +static int first_rx = 0; #define RXDCLENGTH 4096 -#define NUMBUFF 40 -int16_t cos_fsover8[8] = {2047, 1447, 0, -1448, -2047, -1448, 0, 1447}; -int16_t cos_3fsover8[8] = {2047, -1448, 0, 1447, -2047, 1447, 0, -1448}; +#define NUMBUFF 32 + +using namespace lime; extern "C" { @@ -74,18 +65,23 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d /*! \brief Called to send samples to the LMSSDR RF target \param device pointer to the device structure specific to the RF hardware target - \param timestamp The timestamp at whicch the first sample MUST be sent + \param timestamp The timestamp at whicch the first sample MUST be sent \param buff Buffer which holds the samples \param nsamps number of samples to be sent \param antenna_id index of the antenna \param flags Ignored for the moment \returns 0 on success -*/ +*/ int trx_lms_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int antenna_id, int flags) { - - LMS_TRxWrite((int16_t*)buff[0], nsamps,0, timestamp); - return nsamps; + + lms_stream_meta_t meta; + meta.waitForTimestamp = true; + meta.flushPartialPacket = false; + meta.timestamp = timestamp; + + + return LMS_SendStream(&tx_stream,(const void*)buff[0],nsamps,&meta,30); } /*! \brief Receive samples from hardware. @@ -100,16 +96,22 @@ int trx_lms_write(openair0_device *device, openair0_timestamp timestamp, void ** * \returns number of samples read */ int trx_lms_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int antenna_id) { - - uint64_t timestamp; - int16_t *dst_ptr = (int16_t*) buff[0]; - int ret; - ret = LMS_TRxRead(dst_ptr, nsamps,0,×tamp, 10); - *ptimestamp=timestamp; - return ret; + lms_stream_meta_t meta; + meta.waitForTimestamp = false; + meta.flushPartialPacket = false; + + int ret; + if (first_rx == 1) { + first_rx = 0; + ret = LMS_RecvStream(&rx_stream,buff[0],nsamps,&meta,50); + } + ret = LMS_RecvStream(&rx_stream,buff[0],nsamps,&meta,50); + *ptimestamp = meta.timestamp; + return ret; } + /*! \brief set RX gain offset from calibration table * \param openair0_cfg RF frontend parameters set by application * \param chain_index RF chain ID @@ -132,233 +134,186 @@ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { } i++; } - + } /*! \brief Set Gains (TX/RX) on LMSSDR * \param device the hardware to use * \param openair0_cfg openair0 Config structure - * \returns 0 in success + * \returns 0 in success, -1 on error */ - int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { + int ret = 0; - double gv = openair0_cfg[0].rx_gain[0] - openair0_cfg[0].rx_gain_offset[0]; - - if (gv > 31) { - printf("RX Gain 0 too high, reduce by %f dB\n",gv-31); - gv = 31; + if (openair0_cfg->rx_gain[0] > 70+openair0_cfg->rx_gain_offset[0]) { + printf("[LMS] Reduce RX Gain 0 by %f dB\n",openair0_cfg->rx_gain[0]-openair0_cfg->rx_gain_offset[0]-70); + ret = -1; } - if (gv < 0) { - printf("RX Gain 0 too low, increase by %f dB\n",-gv); - gv = 0; - } - printf("[LMS] Setting 7002M G_PGA_RBB to %d\n", (int16_t)gv); - lms7->Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),(int16_t)gv); + + LMS_SetGaindB(lms_device, LMS_CH_TX, 0, openair0_cfg->tx_gain[0]); + LMS_SetGaindB(lms_device, LMS_CH_RX, 0, openair0_cfg->rx_gain[0]-openair0_cfg->rx_gain_offset[0]); - return(0); + return(ret); } /*! \brief Start LMSSDR - * \param device the hardware to use + * \param device the hardware to use * \returns 0 on success */ int trx_lms_start(openair0_device *device){ - - LMS_Init(0, 128*1024); - usbport = LMS_GetUSBPort(); - //connect data stream port - LMS_UpdateDeviceList(usbport); - const char *name = LMS_GetDeviceName(usbport, 0); - printf("Connecting to device: %s\n",name); + lms_info_str_t list[16]={0}; + int n= LMS_GetDeviceList(list); - - if (LMS_DeviceOpen(usbport, 0)==0) - { - Si = new Si5351C(); - lms7 = new LMS7002M(usbport); - liblms7_status opStatus; - - printf("Configuring Si5351C\n"); - Si->Initialize(usbport); - Si->SetPLL(0, 25000000, 0); - Si->SetPLL(1, 25000000, 0); - Si->SetClock(0, 27000000, true, false); - Si->SetClock(1, 27000000, true, false); - for (int i = 2; i < 8; ++i) - Si->SetClock(i, 27000000, false, false); - Si5351C::Status status = Si->ConfigureClocks(); - if (status != Si5351C::SUCCESS) - { - printf("Failed to configure Si5351C"); - exit(-1); - } - status = Si->UploadConfiguration(); - if (status != Si5351C::SUCCESS) - printf("Failed to upload Si5351C configuration"); - - - - lms7->ResetChip(); - - opStatus = lms7->LoadConfig(device->openair0_cfg[0].configFilename); - - if (opStatus != LIBLMS7_SUCCESS) { - printf("Failed to load configuration file %s\n",device->openair0_cfg[0].configFilename); - exit(-1); + if (n <= 0) { + fprintf(stderr, "No LimeSDR board found: %s\n", n < 0?LMS_GetLastErrorMessage():""); + return -1; } - opStatus = lms7->UploadAll(); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Failed to upload configuration file\n"); + printf("Connecting to device: %s\n",list[0]); + if (LMS_Open(&lms_device,list[0],NULL)<0) { + fprintf(stderr, "Can't open device port: %s\n",LMS_GetLastErrorMessage()); + return -1; + } + + LMS_Init(lms_device); + LMS_EnableCalibCache(lms_device,false); + + if (LMS_LoadConfig(lms_device,device->openair0_cfg[0].configFilename) != 0) + { + printf("Failed to load configuration file %s\n%s",device->openair0_cfg[0].configFilename,LMS_GetLastErrorMessage()); exit(-1); } - // Set TX filter + /* LMS_EnableChannel(lms_device,LMS_CH_RX,0,true); + LMS_EnableChannel(lms_device,LMS_CH_TX,0,true); + if (device->openair0_cfg->rx_num_channels == 2) + { + LMS_EnableChannel(lms_device,LMS_CH_RX,1,true); + LMS_EnableChannel(lms_device,LMS_CH_TX,1,true); + } */ + LMS_VCTCXOWrite(lms_device,129); + + if (LMS_SetSampleRate(lms_device,device->openair0_cfg->sample_rate,2)!=0) + { + fprintf(stderr, "Failed to set sample rate %s\n",LMS_GetLastErrorMessage()); + return -1; + } + printf("Set sample rate %f MHz\n",device->openair0_cfg->sample_rate/1e6); + + if (LMS_SetLOFrequency(lms_device,LMS_CH_RX, 0, device->openair0_cfg[0].rx_freq[0])!=0) + { + fprintf(stderr, "Failed to Set Rx frequency: %s\n", LMS_GetLastErrorMessage()); + return -1; + } + if (LMS_SetLOFrequency(lms_device,LMS_CH_TX, 0,device->openair0_cfg[0].tx_freq[0])!=0) + { + fprintf(stderr, "Failed to Set Tx frequency: %s\n", LMS_GetLastErrorMessage()); + return -1; + } + printf("Set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6); + + /* + printf("Override antenna settings to: RX1_H, TXA_2"); + LMS_SetAntenna(lms_device, LMS_CH_RX, 0, 1); + LMS_SetAntenna(lms_device, LMS_CH_TX, 0, 2); + */ + - printf("Tuning TX filter\n"); - opStatus = lms7->TuneTxFilter(LMS7002M::TxFilter::TX_HIGHBAND,device->openair0_cfg[0].tx_bw/1e6); + for (int i = 0; i< device->openair0_cfg->rx_num_channels; i++) + { + if (LMS_SetLPFBW(lms_device,LMS_CH_RX,i,device->openair0_cfg->rx_bw)!=0) + printf("RX ch:%d filter calibration failed, bw:%fMHz\n%s\n",i,device->openair0_cfg->rx_bw/1e6,LMS_GetLastErrorMessage()); + if (LMS_SetLPFBW(lms_device,LMS_CH_TX,i,device->openair0_cfg->tx_bw)!=0) + printf("TX ch:%d filter calibration failed, bw:%fMHz\n%s\n",i,device->openair0_cfg->tx_bw/1e6,LMS_GetLastErrorMessage()); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Warning: Could not tune TX filter to %f MHz\n",device->openair0_cfg[0].tx_bw/1e6); - } - - printf("Tuning RX filter\n"); - - opStatus = lms7->TuneRxFilter(LMS7002M::RxFilter::RX_LPF_LOWBAND,device->openair0_cfg[0].rx_bw/1e6); - - if (opStatus != LIBLMS7_SUCCESS) { - printf("Warning: Could not tune RX filter to %f MHz\n",device->openair0_cfg[0].rx_bw/1e6); + if (LMS_Calibrate(lms_device,LMS_CH_RX,i,device->openair0_cfg->rx_bw,0)!=0) + printf("RX ch:%d calibration failed, bw:%f MHz\n%s\n",i,device->openair0_cfg->rx_bw/1e6,LMS_GetLastErrorMessage()); + if (LMS_Calibrate(lms_device,LMS_CH_TX,i,device->openair0_cfg->tx_bw,0)!=0) + printf("TX ch:%d calibration failed, bw:%fMHz\n%s\n",i,device->openair0_cfg->tx_bw/1e6,LMS_GetLastErrorMessage()); } - /* printf("Tuning TIA filter\n"); - opStatus = lms7->TuneRxFilter(LMS7002M::RxFilter::RX_TIA,7.0); - if (opStatus != LIBLMS7_SUCCESS) { - printf("Warning: Could not tune RX TIA filter\n"); - }*/ + first_rx = 1; - opStatus = lms7->SetInterfaceFrequency(lms7->GetFrequencyCGEN_MHz(), - lms7->Get_SPI_Reg_bits(HBI_OVR_TXTSP), - lms7->Get_SPI_Reg_bits(HBD_OVR_RXTSP)); - if (opStatus != LIBLMS7_SUCCESS) { - printf("SetInterfaceFrequency failed: %f,%d,%d\n", - lms7->GetFrequencyCGEN_MHz(), - lms7->Get_SPI_Reg_bits(HBI_OVR_TXTSP), - lms7->Get_SPI_Reg_bits(HBD_OVR_RXTSP)); - } - else { - printf("SetInterfaceFrequency as %f,%d,%d\n", - lms7->GetFrequencyCGEN_MHz(), - lms7->Get_SPI_Reg_bits(HBI_OVR_TXTSP), - lms7->Get_SPI_Reg_bits(HBD_OVR_RXTSP)); - } - lmsStream = new LMS_StreamBoard(usbport); - LMS_StreamBoard::Status opStreamStatus; - // this will configure that sampling rate at output of FPGA - opStreamStatus = lmsStream->ConfigurePLL(usbport, - device->openair0_cfg[0].sample_rate, - device->openair0_cfg[0].sample_rate,90); - if (opStatus != LIBLMS7_SUCCESS){ - printf("Sample rate programming failed\n"); - exit(-1); - } - - opStatus = lms7->SetFrequencySX(LMS7002M::Tx, device->openair0_cfg[0].tx_freq[0]/1e6,30.72); - - if (opStatus != LIBLMS7_SUCCESS) { - printf("Cannot set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6); - exit(-1); - } - else { - printf("Set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6); - } - opStatus = lms7->SetFrequencySX(LMS7002M::Rx, device->openair0_cfg[0].rx_freq[0]/1e6,30.72); - - if (opStatus != LIBLMS7_SUCCESS) { - printf("Cannot set RX frequency %f MHz\n",device->openair0_cfg[0].rx_freq[0]/1e6); - exit(-1); - } - else { - printf("Set RX frequency %f MHz\n",device->openair0_cfg[0].rx_freq[0]/1e6); - } + rx_stream.channel = 0; + rx_stream.fifoSize = 256*1024; + rx_stream.throughputVsLatency = 0.1; + rx_stream.dataFmt = lms_stream_t::LMS_FMT_I12; + rx_stream.isTx = false; + if (LMS_SetupStream(lms_device, &rx_stream)!=0) + printf("RX stream setup failed %s\n",LMS_GetLastErrorMessage()); + tx_stream.channel = 0; + tx_stream.fifoSize = 256*1024; + tx_stream.throughputVsLatency = 0.1; + tx_stream.dataFmt = lms_stream_t::LMS_FMT_I12; + tx_stream.isTx = true; trx_lms_set_gains(device, device->openair0_cfg); - // Run calibration procedure - // calibrate_rf(device); - //lms7->CalibrateTx(5.0); - LMS_RxStart(); - } - else - { - return(-1); - } - - //connect control port - /* comport = LMS_GetCOMPort(); - LMS_UpdateDeviceList(comport); - name = LMS_GetDeviceName(comport, 0); - if (*name == 0) - comport = usbport; //attempt to use data port - else - { - printf("Connecting to device: %s\n",name); - if (LMS_DeviceOpen(comport, 0)!=0) - return (-1); - } - lms7 = new LMS7002M(comport); - if( access( "./config.ini", F_OK ) != -1 ) //load config file - lms7->LoadConfig("./config.ini"); - //calibration takes too long - //lms7->CalibrateRx(5.0); - //lms7->CalibrateTx(5.0); - */ + if (LMS_SetupStream(lms_device, &tx_stream)!=0) + printf("TX stream setup failed %s\n",LMS_GetLastErrorMessage()); - return 0; + printf("SR: %.3f MHz\n", (float)device->openair0_cfg->sample_rate / 1e6); + + + printf("SR: %.3f MHz\n", (float)device->openair0_cfg->sample_rate / 1e6); + + if (LMS_StartStream(&rx_stream)!=0) + printf("Failed to start TX stream %s\n",LMS_GetLastErrorMessage()); + if (LMS_StartStream(&tx_stream)!=0) + printf("Failed to start Rx stream %s\n",LMS_GetLastErrorMessage()); + return 0; } /*! \brief Stop LMSSDR - * \param card Index of the RF card to use + * \param card Index of the RF card to use * \returns 0 on success */ -int trx_lms_stop(int card) { - /* - LMS_DeviceClose(usbport); - LMS_DeviceClose(comport); - delete lms7; - return LMS_Destroy(); - */ +int trx_lms_stop(openair0_device *device) { + LMS_StopStream(&rx_stream); + LMS_StopStream(&tx_stream); + LMS_DestroyStream(lms_device,&rx_stream); + LMS_DestroyStream(lms_device,&tx_stream); + LMS_Close(lms_device); } /*! \brief Set frequencies (TX/RX) * \param device the hardware to use * \param openair0_cfg openair0 Config structure (ignored. It is there to comply with RF common API) * \param exmimo_dump_config (ignored) - * \returns 0 in success + * \returns 0 in success */ int trx_lms_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) { - //Control port must be connected - - lms7->SetFrequencySX(LMS7002M::Tx,openair0_cfg->tx_freq[0]/1e6,30.72); - lms7->SetFrequencySX(LMS7002M::Rx,openair0_cfg->rx_freq[0]/1e6,30.72); + //Control port must be connected + LMS_SetLOFrequency(lms_device,LMS_CH_TX,0,openair0_cfg->tx_freq[0]); + LMS_SetLOFrequency(lms_device,LMS_CH_RX,0,openair0_cfg->rx_freq[0]); printf ("[LMS] rx frequency:%f;\n",openair0_cfg->rx_freq[0]/1e6); set_rx_gain_offset(openair0_cfg,0); return(0); - + } // 31 = 19 dB => 105 dB total gain @ 2.6 GHz /*! \brief calibration table for LMSSDR */ -rx_gain_calib_table_t calib_table_sodera[] = { - {3500000000.0,70.0}, - {2660000000.0,80.0}, - {2300000000.0,80.0}, - {1880000000.0,74.0}, // on W PAD - {816000000.0,76.0}, // on W PAD +// V1.2 board +rx_gain_calib_table_t calib_table_lmssdr_1v2[] = { + {3500000000.0,44.0}, // on L PAD + {2660000000.0,55.0}, // on L PAD + {2300000000.0,54.0}, // on L PAD + {1880000000.0,54.0}, // on L PAD + {816000000.0,79.0}, // on W PAD {-1,0}}; +// V1.4 board +rx_gain_calib_table_t calib_table_lmssdr[] = { + {3500000000.0,44.0}, // on H PAD + {2660000000.0,55.0}, // on H PAD + {2300000000.0,54.0}, // on H PAD + {1880000000.0,54.0}, // on H PAD + {816000000.0,79.0}, // on L PAD + {-1,0}}; + @@ -366,8 +321,9 @@ rx_gain_calib_table_t calib_table_sodera[] = { /*! \brief Get LMSSDR Statistics * \param device the hardware to use - * \returns 0 in success + * \returns 0 in success */ + int trx_lms_get_stats(openair0_device* device) { return(0); @@ -376,7 +332,7 @@ int trx_lms_get_stats(openair0_device* device) { /*! \brief Reset LMSSDR Statistics * \param device the hardware to use - * \returns 0 in success + * \returns 0 in success */ int trx_lms_reset_stats(openair0_device* device) { @@ -385,7 +341,7 @@ int trx_lms_reset_stats(openair0_device* device) { } -/*! \brief Terminate operation of the LMSSDR transceiver -- free all associated resources +/*! \brief Terminate operation of the LMSSDR transceiver -- free all associated resources * \param device the hardware to use */ void trx_lms_end(openair0_device *device) { @@ -401,37 +357,34 @@ extern "C" { int device_init(openair0_device *device, openair0_config_t *openair0_cfg){ device->type=LMSSDR_DEV; - printf("LMSSDR: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); + + printf("LMSSDR: Initializing openair0_device for %s ...\n", ((device->host_type == RAU_HOST) ? "RAU": "RRU")); switch ((int)openair0_cfg[0].sample_rate) { case 30720000: // from usrp_time_offset openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; + openair0_cfg[0].tx_sample_advance = 40; openair0_cfg[0].tx_bw = 30.72e6; openair0_cfg[0].rx_bw = 30.72e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; case 15360000: openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 45; - openair0_cfg[0].tx_bw = 28e6; - openair0_cfg[0].rx_bw = 10e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; + openair0_cfg[0].tx_sample_advance = 50; /* TODO: to be refined */ + openair0_cfg[0].tx_bw = 15.36e6; + openair0_cfg[0].rx_bw = 15.36e6; break; case 7680000: openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 70; - openair0_cfg[0].tx_bw = 28e6; + openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_bw = 5.0e6; openair0_cfg[0].rx_bw = 5.0e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; case 1920000: openair0_cfg[0].samples_per_packet = 256; - openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_sample_advance = 10; openair0_cfg[0].tx_bw = 1.25e6; openair0_cfg[0].rx_bw = 1.25e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; break; default: printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); @@ -439,20 +392,20 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg){ break; } - openair0_cfg[0].rx_gain_calib_table = calib_table_sodera; + openair0_cfg[0].rx_gain_calib_table = calib_table_lmssdr; set_rx_gain_offset(openair0_cfg,0); device->Mod_id = 1; device->trx_start_func = trx_lms_start; device->trx_write_func = trx_lms_write; - device->trx_read_func = trx_lms_read; + device->trx_read_func = trx_lms_read; device->trx_get_stats_func = trx_lms_get_stats; device->trx_reset_stats_func = trx_lms_reset_stats; device->trx_end_func = trx_lms_end; device->trx_stop_func = trx_lms_stop; device->trx_set_freq_func = trx_lms_set_freq; device->trx_set_gains_func = trx_lms_set_gains; - + device->openair0_cfg = openair0_cfg; return 0; diff --git a/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp b/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp index 30a2106b34..6f1afe47c0 100644 --- a/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp +++ b/targets/ARCH/LMSSDR/USERSPACE/LIB/sodera_lib.cpp @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** sodera_lib.c * diff --git a/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini b/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini deleted file mode 100644 index e4e420c334..0000000000 --- a/targets/ARCH/LMSSDR/enb_sodera_highband_10MHz_rx19dB_txfull.ini +++ /dev/null @@ -1,1128 +0,0 @@ -[file_info] -type=lms7002m_minimal_config -version=1 -[lms7002_registers_a] -0x0493=0x0000 -0x0492=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x048E=0x0000 -0x0022=0x07FF -0x0283=0x0000 -0x0487=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0460=0x0000 -0x0447=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0456=0x0000 -0x0559=0xACB9 -0x0451=0x0000 -0x0390=0x0000 -0x044B=0x0000 -0x0448=0x0000 -0x0454=0x0000 -0x0446=0x0000 -0x04CA=0x0000 -0x0444=0x0000 -0x0443=0x0000 -0x0508=0xEF99 -0x0441=0x0000 -0x040D=0x0000 -0x040B=0x000F -0x0409=0x0000 -0x0580=0xEFF2 -0x0407=0x0000 -0x0405=0x0000 -0x0254=0x0000 -0x0404=0x0000 -0x00A0=0x6565 -0x0560=0x174B -0x0403=0x0013 -0x0402=0x07D9 -0x055E=0xDB10 -0x03A7=0x0000 -0x0520=0x174B -0x03A5=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x03A2=0x0000 -0x051C=0x0000 -0x048D=0x0000 -0x059A=0x0000 -0x03A1=0x0000 -0x02A2=0x0000 -0x04E1=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x039B=0x0000 -0x0408=0x0000 -0x0398=0x0000 -0x0393=0x0000 -0x0305=0x0000 -0x038E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 -0x038D=0x0000 -0x0387=0x0000 -0x03A0=0x0000 -0x02D0=0x0000 -0x009A=0x658C -0x054E=0x8184 -0x0386=0x0000 -0x040F=0x43E4 -0x04E3=0x0000 -0x0389=0x0000 -0x054F=0x18C9 -0x0385=0x0000 -0x0315=0x0000 -0x0384=0x0000 -0x0382=0x0000 -0x0288=0x0000 -0x0366=0x0000 -0x0365=0x0000 -0x0364=0x0000 -0x0325=0x0000 -0x0081=0x0000 -0x0362=0x0000 -0x038A=0x0000 -0x035E=0x0000 -0x035D=0x0000 -0x0442=0x0000 -0x0449=0x0000 -0x035A=0x0000 -0x02C8=0x0000 -0x0452=0x0000 -0x0299=0x0000 -0x0359=0x0000 -0x0358=0x0000 -0x048B=0x0000 -0x0354=0x0000 -0x0351=0x0000 -0x03A6=0x0000 -0x0293=0x0000 -0x034E=0x0000 -0x035C=0x0000 -0x034D=0x0000 -0x034B=0x0000 -0x011A=0x2E14 -0x0455=0x0000 -0x034A=0x0000 -0x0348=0x0000 -0x0084=0x0400 -0x0498=0x0000 -0x035B=0x0000 -0x0505=0x00D8 -0x0345=0x0000 -0x0484=0x0000 -0x0586=0x196B -0x0344=0x0000 -0x0561=0xAB08 -0x0343=0x0000 -0x0342=0x0000 -0x0380=0x0000 -0x0327=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x0321=0x0000 -0x045E=0x0000 -0x0440=0x0024 -0x031D=0x0000 -0x0363=0x0000 -0x031A=0x0000 -0x031C=0x0000 -0x028F=0x0000 -0x0341=0x0000 -0x0287=0x0000 -0x0318=0x0000 -0x031F=0x0000 -0x0316=0x0000 -0x030D=0x0000 -0x040E=0x0003 -0x0352=0x0000 -0x028C=0x0000 -0x0360=0x0000 -0x0313=0x0000 -0x0461=0x0000 -0x010A=0x104C -0x051B=0xB77F -0x0312=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x0311=0x0000 -0x02D6=0x0000 -0x030C=0x0000 -0x04DF=0x0000 -0x030B=0x0000 -0x0392=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x0309=0x0000 -0x048A=0x0000 -0x0308=0x0000 -0x0588=0xE6C7 -0x0397=0x0000 -0x02E3=0x0000 -0x049C=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x0306=0x0000 -0x0304=0x0000 -0x04D5=0x0000 -0x0303=0x0000 -0x0302=0x0000 -0x0510=0xE6C7 -0x044E=0x0000 -0x0300=0x0000 -0x034F=0x0000 -0x045B=0x0000 -0x02E6=0x0000 -0x00A3=0x6565 -0x04DA=0x0000 -0x025E=0x0000 -0x020A=0x0080 -0x0102=0x3180 -0x020C=0x8000 -0x05A2=0x0000 -0x040A=0x1000 -0x0556=0xA2B5 -0x0243=0x0000 -0x051D=0x4F91 -0x0259=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x011D=0xAAAA -0x039E=0x0000 -0x0252=0x0000 -0x0204=0xC016 -0x0255=0x0000 -0x0281=0x0000 -0x0200=0x0301 -0x0594=0xF40D -0x02C5=0x0000 -0x0406=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0319=0x0000 -0x0121=0x3760 -0x0101=0x7800 -0x025B=0x0000 -0x02C6=0x0000 -0x0558=0x5009 -0x0021=0x0E9F -0x04C2=0x0000 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x0296=0x0000 -0x029C=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x008B=0x2756 -0x02A3=0x0000 -0x05A4=0x0000 -0x02A7=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x02C2=0x0000 -0x02C4=0x0000 -0x044D=0x0000 -0x02E2=0x0000 -0x02D1=0x0000 -0x0546=0x8D44 -0x04C8=0x0000 -0x0207=0x0000 -0x04C6=0x0000 -0x0096=0x0000 -0x0093=0x0000 -0x0250=0x0000 -0x02CB=0x0000 -0x02D3=0x0000 -0x0494=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x0251=0x0000 -0x0488=0x0000 -0x0496=0x0000 -0x04C3=0x0000 -0x0100=0x3409 -0x04CC=0x0000 -0x02A5=0x0000 -0x0257=0x0000 -0x04D6=0x0000 -0x04A6=0x0000 -0x049A=0x0000 -0x049B=0x0000 -0x0097=0x0000 -0x011E=0x0A2A -0x0285=0x0000 -0x0280=0x0000 -0x049E=0x0000 -0x0020=0xFFFD -0x02DD=0x0000 -0x0297=0x0000 -0x049F=0x0000 -0x0522=0xDB10 -0x044C=0x0000 -0x0355=0x0000 -0x04A0=0x0000 -0x02CF=0x0000 -0x04D1=0x0000 -0x0526=0xBE2A -0x0092=0x0001 -0x031B=0x0000 -0x0541=0x4C24 -0x0518=0xEFF2 -0x0543=0xBD96 -0x02C0=0x0000 -0x0499=0x0000 -0x04A1=0x0000 -0x058D=0xF5EF -0x02D7=0x0000 -0x0513=0xDAA2 -0x0549=0x18C9 -0x0552=0x8D44 -0x0521=0x5852 -0x0509=0x0605 -0x0286=0x0000 -0x024F=0x0000 -0x04E0=0x0000 -0x0545=0x364E -0x0349=0x0000 -0x0555=0xBD96 -0x04E4=0x0000 -0x02E4=0x0000 -0x0551=0xD7B7 -0x055D=0xA6B5 -0x0298=0x0000 -0x055F=0x5852 -0x009E=0x658C -0x0547=0xD7B7 -0x0598=0xF61D -0x0123=0x067B -0x0497=0x0000 -0x04A5=0x0000 -0x0565=0xB77F -0x0124=0x0000 -0x0592=0x0DF1 -0x0591=0xFCFE -0x0548=0x79FA -0x04D2=0x0000 -0x0599=0x0000 -0x0511=0x1D10 -0x0506=0x0DF1 -0x0595=0x00BC -0x0584=0xE7E2 -0x0242=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x058C=0xEA50 -0x0450=0x0000 -0x0596=0x0A94 -0x05A7=0x0000 -0x058A=0x17DC -0x059D=0x0000 -0x0485=0x0000 -0x058E=0x1316 -0x0550=0x79FA -0x0554=0x6901 -0x0593=0x00D8 -0x0542=0xA2B5 -0x0553=0x364E -0x0563=0x4F91 -0x024D=0x0000 -0x0567=0x4049 -0x055A=0xBE2A -0x0295=0x0000 -0x0566=0x0906 -0x028A=0x0000 -0x059C=0x0000 -0x04DD=0x0000 -0x054C=0x7FFF -0x0582=0x150F -0x0585=0xDAA2 -0x0109=0x8CC1 -0x04A2=0x0000 -0x0292=0x0000 -0x059F=0x0000 -0x0583=0x2E45 -0x050E=0x17DC -0x0516=0x150F -0x0523=0xA6B5 -0x0525=0x57AC -0x0206=0x0000 -0x051A=0x0906 -0x055C=0x3347 -0x0514=0xE7E2 -0x050F=0xEA5F -0x05A6=0x0000 -0x051E=0xF524 -0x050A=0x1316 -0x04C7=0x0000 -0x049D=0x0000 -0x0527=0xACB9 -0x050C=0xEA50 -0x0087=0x0000 -0x0399=0x0000 -0x050B=0xF5EF -0x0507=0xFCFE -0x010D=0x00DE -0x04C4=0x0000 -0x0495=0x0000 -0x0246=0x0000 -0x0503=0x00BC -0x0320=0x0000 -0x0323=0x0000 -0x02E5=0x0000 -0x055B=0x57AC -0x0114=0x0110 -0x04D8=0x0000 -0x04E7=0x0000 -0x04D0=0x0000 -0x04E6=0x0000 -0x00AE=0x0000 -0x0544=0x6901 -0x0258=0x0000 -0x0502=0x0A94 -0x04DE=0x0000 -0x058B=0x0F45 -0x0028=0x0101 -0x029E=0x0000 -0x04DC=0x0000 -0x04D9=0x0000 -0x0557=0x4C24 -0x058F=0x0605 -0x04DB=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x024C=0x0000 -0x02DC=0x0000 -0x04D4=0x0000 -0x0504=0xF40D -0x02C3=0x0000 -0x04C1=0x0000 -0x04D3=0x0000 -0x0590=0xEF99 -0x04CE=0x0000 -0x05A5=0x0000 -0x04A7=0x0000 -0x0489=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x002A=0x0086 -0x0245=0x0000 -0x045D=0x0000 -0x0581=0xC89D -0x02D2=0x0000 -0x039C=0x0000 -0x002B=0x4032 -0x02A0=0x0000 -0x010E=0x0285 -0x0394=0x0000 -0x0459=0x0000 -0x0088=0x04F0 -0x0085=0x0001 -0x0089=0x0048 -0x0256=0x0000 -0x0111=0x0099 -0x0095=0x0000 -0x0203=0x2F99 -0x030E=0x0000 -0x0482=0x0000 -0x05A0=0x0000 -0x009C=0x658C -0x0381=0x0000 -0x0122=0x033F -0x0110=0x0BFF -0x0026=0x0101 -0x0294=0x0000 -0x009D=0x6565 -0x0524=0x3347 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x0391=0x0000 -0x04CB=0x0000 -0x010F=0x3042 -0x0119=0x18DF -0x02A6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x0500=0xF61D -0x039D=0x0000 -0x011F=0x3600 -0x0395=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0247=0x0000 -0x0512=0x196B -0x04E5=0x0000 -0x0024=0x50D8 -0x0353=0x0000 -0x050D=0x0F45 -0x02CD=0x0000 -0x0490=0x0000 -0x0501=0xFDFB -0x034C=0x0000 -0x00AA=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x008A=0x0491 -0x0453=0x0000 -0x0260=0x0000 -0x00A1=0x6565 -0x0356=0x0000 -0x0241=0x0000 -0x008C=0x267B -0x038F=0x0000 -0x054A=0x8184 -0x00A4=0x6565 -0x0401=0x07FF -0x04CD=0x0000 -0x0249=0x0000 -0x002C=0x0000 -0x054D=0xF7A3 -0x00A6=0x0001 -0x002D=0xFFFF -0x00AC=0x2000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x40F8 -0x0310=0x0000 -0x0099=0x6565 -0x00A2=0x6565 -0x0589=0xEA5F -0x002F=0x3840 -0x035F=0x0000 -0x0597=0xFDFB -0x0116=0x8180 -0x02CC=0x0000 -0x0025=0x0101 -0x0562=0xF524 -0x011C=0xA941 -0x0289=0x0000 -0x0282=0x0000 -0x0307=0x0000 -0x038C=0x0000 -0x02C7=0x0000 -0x054B=0xF7A3 -0x0519=0x4049 -0x009F=0x658C -0x025C=0x0000 -0x0515=0x2E45 -0x00A5=0x6565 -0x0301=0x0000 -0x02C1=0x0000 -0x0481=0x0000 -0x0517=0xC89D -0x00A8=0x0000 -0x0564=0x0000 -0x00AB=0x0040 -0x0261=0x0000 -0x002E=0x0000 -0x02DE=0x0000 -0x02A4=0x0000 -0x0540=0x5009 -0x00AD=0x03FF -0x0029=0x0101 -0x024A=0x0000 -0x00A7=0x6565 -0x0027=0x05E4 -0x0117=0x100C -0x0098=0x0000 -0x0108=0xFC26 -0x020B=0x4000 -0x0383=0x0000 -0x0202=0x0794 -0x0086=0x4101 -0x010C=0x8865 -0x02D8=0x0000 -0x0347=0x0000 -0x0457=0x0000 -0x0103=0x0612 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0101 -0x009B=0x6565 -0x0105=0x0007 -0x05A3=0x0000 -0x0240=0x0028 -0x0367=0x0000 -0x044F=0x0000 -0x038B=0x0000 -0x02D9=0x0000 -0x02CE=0x0000 -0x0284=0x0000 -0x0396=0x0000 -0x029A=0x0000 -0x051F=0xAB08 -0x0361=0x0000 -0x0205=0x0000 -0x031E=0x0000 -0x04C0=0x0000 -0x0587=0x1D10 -0x0023=0x5550 -0x048C=0x0000 -0x0112=0x3171 -0x039A=0x0000 -0x0115=0x0009 -0x00A9=0x8000 -0x0317=0x0000 -0x0244=0x0000 -0x0094=0x0000 -0x0340=0x0000 -0x0208=0x0170 -0x04A3=0x0000 -0x029D=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x04C9=0x0000 -0x02CA=0x0000 -0x0209=0x0000 -0x0082=0x8001 -0x02D4=0x0000 -0x0107=0x318C -[lms7002_registers_b] -0x04E1=0x0000 -0x03A1=0x0000 -0x02A2=0x0000 -0x04E0=0x0000 -0x04DE=0x0000 -0x058B=0x0000 -0x04DC=0x0000 -0x04DB=0x0000 -0x04D9=0x0000 -0x04D5=0x0000 -0x0304=0x0000 -0x04D4=0x0000 -0x0504=0x0000 -0x04D3=0x0000 -0x04D2=0x0000 -0x0548=0x0000 -0x04D0=0x0000 -0x04CF=0x0000 -0x025F=0x0000 -0x04CE=0x0000 -0x04CC=0x0000 -0x02A5=0x0000 -0x04C6=0x0000 -0x0207=0x0000 -0x04C1=0x0000 -0x02C3=0x0000 -0x04C9=0x0000 -0x02CA=0x0000 -0x04C0=0x0000 -0x031E=0x0000 -0x04D6=0x0000 -0x0257=0x0000 -0x04A6=0x0000 -0x04A5=0x0000 -0x04A2=0x0000 -0x0109=0x61C1 -0x049D=0x0000 -0x04C7=0x0000 -0x049C=0x0000 -0x0397=0x0000 -0x02E3=0x0000 -0x0499=0x0000 -0x02C0=0x0000 -0x0496=0x0000 -0x04C3=0x0000 -0x0493=0x0000 -0x04A1=0x0000 -0x0492=0x0000 -0x0491=0x0000 -0x029B=0x0000 -0x048E=0x0000 -0x0283=0x0000 -0x048C=0x0000 -0x048B=0x0000 -0x0358=0x0000 -0x0487=0x0000 -0x0486=0x0000 -0x045F=0x0000 -0x0480=0x0000 -0x0460=0x0000 -0x0447=0x0000 -0x045A=0x0000 -0x02DA=0x0000 -0x0458=0x0000 -0x0314=0x0000 -0x0456=0x0000 -0x0559=0x0000 -0x0453=0x0000 -0x0451=0x0000 -0x0390=0x0000 -0x044D=0x0000 -0x02E2=0x0000 -0x044B=0x0000 -0x0448=0x0000 -0x0454=0x0000 -0x0446=0x0000 -0x04CA=0x0000 -0x0444=0x0000 -0x0443=0x0000 -0x0508=0x0000 -0x0441=0x0000 -0x040D=0x0000 -0x040B=0x7FFF -0x0409=0x0000 -0x0580=0x0000 -0x0407=0x0000 -0x0405=0x0000 -0x0254=0x0000 -0x0404=0x0000 -0x0560=0x0000 -0x04D8=0x0000 -0x0403=0x0000 -0x0402=0x07FF -0x055E=0x0000 -0x03A7=0x0000 -0x0520=0x0000 -0x03A5=0x0000 -0x03A4=0x0000 -0x03A3=0x0000 -0x03A2=0x0000 -0x051C=0x0000 -0x048D=0x0000 -0x059A=0x0000 -0x049E=0x0000 -0x039F=0x0000 -0x0248=0x0000 -0x039B=0x0000 -0x0399=0x0000 -0x0408=0x0000 -0x0398=0x0000 -0x0497=0x0000 -0x0123=0x267B -0x0394=0x0000 -0x0459=0x0000 -0x0393=0x0000 -0x0305=0x0000 -0x038E=0x0000 -0x0324=0x0000 -0x02E7=0x0000 -0x038D=0x0000 -0x0395=0x0000 -0x038A=0x0000 -0x0362=0x0000 -0x0387=0x0000 -0x0200=0x0081 -0x0594=0x0000 -0x02C5=0x0000 -0x02A7=0x0000 -0x0318=0x0000 -0x0544=0x0000 -0x049A=0x0000 -0x0388=0x0000 -0x0120=0xB9FF -0x020A=0x0080 -0x0102=0x3180 -0x0290=0x0000 -0x02DF=0x0000 -0x0291=0x0000 -0x0295=0x0000 -0x055A=0x0000 -0x029C=0x0000 -0x010E=0x2040 -0x02A0=0x0000 -0x010F=0x3042 -0x02A6=0x0000 -0x0119=0x18CB -0x02D2=0x0000 -0x039C=0x0000 -0x028D=0x0000 -0x02A1=0x0000 -0x02C2=0x0000 -0x045E=0x0000 -0x031D=0x0000 -0x0440=0x0020 -0x02C4=0x0000 -0x04D1=0x0000 -0x02CF=0x0000 -0x02C1=0x0000 -0x02C7=0x0000 -0x054B=0x0000 -0x02D3=0x0000 -0x04C8=0x0000 -0x02D1=0x0000 -0x0546=0x0000 -0x0306=0x0000 -0x02D7=0x0000 -0x058D=0x0000 -0x0457=0x0000 -0x02D8=0x0000 -0x0347=0x0000 -0x0103=0x0A12 -0x0104=0x0088 -0x0357=0x0000 -0x02DB=0x0000 -0x0400=0x0081 -0x0209=0x0000 -0x0297=0x0000 -0x02DD=0x0000 -0x029E=0x0000 -0x02DE=0x0000 -0x0527=0x0000 -0x02D5=0x0000 -0x02E1=0x0000 -0x0259=0x0000 -0x0481=0x0000 -0x0517=0x0000 -0x029A=0x0000 -0x051F=0x0000 -0x0483=0x0000 -0x0201=0x07FF -0x0507=0x0000 -0x0321=0x0000 -0x034F=0x0000 -0x0296=0x0000 -0x0510=0x0000 -0x0302=0x0000 -0x038C=0x0000 -0x0307=0x0000 -0x0282=0x0000 -0x0392=0x0000 -0x030B=0x0000 -0x0588=0x0000 -0x0308=0x0000 -0x048A=0x0000 -0x044A=0x0000 -0x04A4=0x0000 -0x04C4=0x0000 -0x010D=0x009E -0x0300=0x0000 -0x0587=0x0000 -0x044E=0x0000 -0x0309=0x0000 -0x0585=0x0000 -0x02E5=0x0000 -0x055B=0x0000 -0x0114=0x008D -0x0323=0x0000 -0x0320=0x0000 -0x0503=0x0000 -0x0513=0x0000 -0x0319=0x0000 -0x0260=0x0000 -0x0549=0x0000 -0x0552=0x0000 -0x0509=0x0000 -0x0521=0x0000 -0x0286=0x0000 -0x04D7=0x0000 -0x059E=0x0000 -0x0557=0x0000 -0x058F=0x0000 -0x0322=0x0000 -0x059B=0x0000 -0x0545=0x0000 -0x0349=0x0000 -0x0555=0x0000 -0x02E4=0x0000 -0x04E4=0x0000 -0x0551=0x0000 -0x0312=0x0000 -0x055D=0x0000 -0x0298=0x0000 -0x055F=0x0000 -0x011D=0xAAAA -0x039E=0x0000 -0x0547=0x0000 -0x0598=0x0000 -0x0449=0x0000 -0x0564=0x0000 -0x0242=0x0000 -0x0525=0x0000 -0x0523=0x0000 -0x0565=0x0000 -0x0124=0x0000 -0x0592=0x0000 -0x0591=0x0000 -0x0563=0x0000 -0x024D=0x0000 -0x0567=0x0000 -0x05A5=0x0000 -0x0566=0x0000 -0x030A=0x0000 -0x029F=0x0000 -0x054C=0x0000 -0x0582=0x0000 -0x0599=0x0000 -0x0511=0x0000 -0x0506=0x0000 -0x0301=0x0000 -0x0595=0x0000 -0x0584=0x0000 -0x058C=0x0000 -0x051E=0x0000 -0x05A6=0x0000 -0x050F=0x0000 -0x0590=0x0000 -0x05A0=0x0000 -0x0596=0x0000 -0x05A7=0x0000 -0x0562=0x0000 -0x058A=0x0000 -0x059D=0x0000 -0x0485=0x0000 -0x0581=0x0000 -0x045D=0x0000 -0x0245=0x0000 -0x0310=0x0000 -0x058E=0x0000 -0x05A2=0x0000 -0x054D=0x0000 -0x020C=0x7FFF -0x0589=0x0000 -0x0522=0x0000 -0x049F=0x0000 -0x031F=0x0000 -0x0292=0x0000 -0x059F=0x0000 -0x0583=0x0000 -0x0543=0x0000 -0x0317=0x0000 -0x0244=0x0000 -0x0554=0x0000 -0x0593=0x0000 -0x05A4=0x0000 -0x02A3=0x0000 -0x0553=0x0000 -0x0542=0x0000 -0x0519=0x0000 -0x024F=0x0000 -0x0524=0x0000 -0x0518=0x0000 -0x0354=0x0000 -0x0526=0x0000 -0x031B=0x0000 -0x050E=0x0000 -0x0516=0x0000 -0x02CB=0x0000 -0x0250=0x0000 -0x031C=0x0000 -0x028F=0x0000 -0x051A=0x0000 -0x055C=0x0000 -0x0514=0x0000 -0x050A=0x0000 -0x050C=0x0000 -0x050B=0x0000 -0x04E7=0x0000 -0x04E6=0x0000 -0x04E5=0x0000 -0x0512=0x0000 -0x0206=0x0000 -0x0550=0x0000 -0x0360=0x0000 -0x030E=0x0000 -0x0203=0x0000 -0x0482=0x0000 -0x0541=0x0000 -0x0122=0x033F -0x0110=0x0BF4 -0x0204=0x0000 -0x0252=0x0000 -0x011E=0x0AA7 -0x049B=0x0000 -0x0294=0x0000 -0x011C=0xA941 -0x02D6=0x0000 -0x0311=0x0000 -0x0117=0x280C -0x02A4=0x0000 -0x0540=0x0000 -0x02E0=0x0000 -0x0118=0x018C -0x0489=0x0000 -0x04A7=0x0000 -0x0101=0x7800 -0x0558=0x0000 -0x02C6=0x0000 -0x05A1=0x0000 -0x02C9=0x0000 -0x039D=0x0000 -0x0500=0x0000 -0x0450=0x0000 -0x011F=0x3600 -0x030C=0x0000 -0x04DF=0x0000 -0x0281=0x0000 -0x0106=0x3182 -0x028E=0x0000 -0x0326=0x0000 -0x0113=0x03C3 -0x04CB=0x0000 -0x0391=0x0000 -0x0105=0x0007 -0x02D9=0x0000 -0x02CE=0x0000 -0x038B=0x0000 -0x044F=0x0000 -0x02D4=0x0000 -0x0107=0x318C -0x0495=0x0000 -0x0246=0x0000 -0x0303=0x0000 -0x02E6=0x0000 -0x045B=0x0000 -0x0100=0x3409 -0x0340=0x0000 -0x0208=0x0070 -0x0111=0x0083 -0x0247=0x0000 -0x024B=0x0000 -0x045C=0x0000 -0x0383=0x0000 -0x0202=0x07FF -0x054A=0x0000 -0x0401=0x07FF -0x0341=0x0000 -0x0287=0x0000 -0x034C=0x0000 -0x0501=0x0000 -0x030F=0x0000 -0x025D=0x0000 -0x0406=0x0000 -0x0313=0x0000 -0x010A=0x104C -0x0461=0x0000 -0x051B=0x0000 -0x0121=0x31FA -0x0115=0x0009 -0x0112=0xC0E6 -0x039A=0x0000 -0x02CC=0x0000 -0x0116=0x8180 -0x04A0=0x0000 -0x0108=0x9442 -0x020B=0x4000 -0x0251=0x0000 -0x0488=0x0000 -0x0241=0x0000 -0x038F=0x0000 -0x02DC=0x0000 -0x024C=0x0000 -0x0494=0x0000 -0x051D=0x0000 -0x0243=0x0000 -0x0556=0x0000 -0x040A=0x0000 -0x04CD=0x0000 -0x0249=0x0000 -0x0261=0x0000 -0x024A=0x0000 -0x0285=0x0000 -0x0280=0x0000 -0x0346=0x0000 -0x024E=0x0000 -0x0253=0x0000 -0x028B=0x0000 -0x040C=0x0000 -0x0255=0x0000 -0x0258=0x0000 -0x0502=0x0000 -0x05A3=0x0000 -0x0367=0x0000 -0x0240=0x0020 -0x0256=0x0000 -0x025A=0x0000 -0x04E2=0x0000 -0x04C5=0x0000 -0x025B=0x0000 -0x0205=0x0000 -0x0361=0x0000 -0x0515=0x0000 -0x025C=0x0000 -0x0355=0x0000 -0x044C=0x0000 -0x010C=0x88FD -0x0284=0x0000 -0x0396=0x0000 -0x0363=0x0000 -0x031A=0x0000 -0x0289=0x0000 -0x028A=0x0000 -0x04DD=0x0000 -0x059C=0x0000 -0x0352=0x0000 -0x028C=0x0000 -0x04C2=0x0000 -0x04DA=0x0000 -0x025E=0x0000 -0x0327=0x0000 -0x0380=0x0000 -0x0342=0x0000 -0x0343=0x0000 -0x0344=0x0000 -0x0561=0x0000 -0x035A=0x0000 -0x02C8=0x0000 -0x0484=0x0000 -0x0586=0x0000 -0x0597=0x0000 -0x035F=0x0000 -0x0345=0x0000 -0x0505=0x0000 -0x035B=0x0000 -0x034A=0x0000 -0x0455=0x0000 -0x011A=0x2E02 -0x034B=0x0000 -0x034D=0x0000 -0x035C=0x0000 -0x034E=0x0000 -0x0293=0x0000 -0x03A6=0x0000 -0x0350=0x0000 -0x0445=0x0000 -0x048F=0x0000 -0x0351=0x0000 -0x0353=0x0000 -0x050D=0x0000 -0x02CD=0x0000 -0x0490=0x0000 -0x0498=0x0000 -0x0348=0x0000 -0x0356=0x0000 -0x030D=0x0000 -0x0316=0x0000 -0x040E=0x0000 -0x04A3=0x0000 -0x029D=0x0000 -0x0359=0x0000 -0x0299=0x0000 -0x0452=0x0000 -0x0442=0x0000 -0x035D=0x0000 -0x035E=0x0000 -0x0325=0x0000 -0x0364=0x0000 -0x0365=0x0000 -0x0366=0x0000 -0x0381=0x0000 -0x0288=0x0000 -0x0382=0x0000 -0x0384=0x0000 -0x0315=0x0000 -0x0385=0x0000 -0x04E3=0x0000 -0x040F=0x0000 -0x0389=0x0000 -0x054F=0x0000 -0x0386=0x0000 -0x02D0=0x0000 -0x054E=0x0000 -0x03A0=0x0000 -[reference_clocks] -sxt_ref_clk_mhz=30.72 -sxr_ref_clk_mhz=30.72 diff --git a/targets/ARCH/USRP/USERSPACE/LIB/COPYING b/targets/ARCH/USRP/USERSPACE/LIB/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/ARCH/USRP/USERSPACE/LIB/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index 72e79b44de..9b1755954a 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /** usrp_lib.cpp * @@ -41,16 +33,21 @@ #include #include #include +#include +#include #include #include #include #include - +#include +#include "UTIL/LOG/log_extern.h" #include "common_lib.h" +#include "assertions.h" + #ifdef __SSE4_1__ # include #endif - + #ifdef __AVX2__ # include #endif @@ -63,132 +60,453 @@ * @{ */ -/*! \brief USRP Configuration */ -typedef struct -{ +/*! \brief USRP Configuration */ +typedef struct { - // -------------------------------- - // variables for USRP configuration - // -------------------------------- - //! USRP device pointer - uhd::usrp::multi_usrp::sptr usrp; - //uhd::usrp::multi_usrp::sptr rx_usrp; - - //create a send streamer and a receive streamer - //! USRP TX Stream - uhd::tx_streamer::sptr tx_stream; - //! USRP RX Stream - uhd::rx_streamer::sptr rx_stream; + // -------------------------------- + // variables for USRP configuration + // -------------------------------- + //! USRP device pointer + uhd::usrp::multi_usrp::sptr usrp; - //! USRP TX Metadata - uhd::tx_metadata_t tx_md; - //! USRP RX Metadata - uhd::rx_metadata_t rx_md; + //create a send streamer and a receive streamer + //! USRP TX Stream + uhd::tx_streamer::sptr tx_stream; + //! USRP RX Stream + uhd::rx_streamer::sptr rx_stream; - //! USRP Timestamp Information - uhd::time_spec_t tm_spec; + //! USRP TX Metadata + uhd::tx_metadata_t tx_md; + //! USRP RX Metadata + uhd::rx_metadata_t rx_md; - //setup variables and allocate buffer - //! USRP Metadata - uhd::async_metadata_t async_md; + //! Sampling rate + double sample_rate; - //! Sampling rate - double sample_rate; + //! TX forward samples. We use usrp_time_offset to get this value + int tx_forward_nsamps; //166 for 20Mhz - //! time offset between transmiter timestamp and receiver timestamp; - double tdiff; - - //! TX forward samples. We use usrp_time_offset to get this value - int tx_forward_nsamps; //166 for 20Mhz - - - // -------------------------------- - // Debug and output control - // -------------------------------- - //! Number of underflows - int num_underflows; - //! Number of overflows - int num_overflows; - - //! Number of sequential errors - int num_seq_errors; - //! tx count - int64_t tx_count; - //! rx count - int64_t rx_count; - //! timestamp of RX packet - openair0_timestamp rx_timestamp; + // -------------------------------- + // Debug and output control + // -------------------------------- + int num_underflows; + int num_overflows; + int num_seq_errors; + int64_t tx_count; + int64_t rx_count; + int wait_for_first_pps; + int use_gps; + //! timestamp of RX packet + openair0_timestamp rx_timestamp; } usrp_state_t; +//void print_notes(void) +//{ + // Helpful notes + // std::cout << boost::format("**************************************Helpful Notes on Clock/PPS Selection**************************************\n"); + // std::cout << boost::format("As you can see, the default 10 MHz Reference and 1 PPS signals are now from the GPSDO.\n"); + // std::cout << boost::format("If you would like to use the internal reference(TCXO) in other applications, you must configure that explicitly.\n"); + // std::cout << boost::format("You can no longer select the external SMAs for 10 MHz or 1 PPS signaling.\n"); + // std::cout << boost::format("****************************************************************************************************************\n"); +//} + +static int sync_to_gps(openair0_device *device) +{ + uhd::set_thread_priority_safe(); + + //std::string args; + + //Set up program options + //po::options_description desc("Allowed options"); + //desc.add_options() + //("help", "help message") + //("args", po::value(&args)->default_value(""), "USRP device arguments") + //; + //po::variables_map vm; + //po::store(po::parse_command_line(argc, argv, desc), vm); + //po::notify(vm); + + //Print the help message + //if (vm.count("help")) + //{ + // std::cout << boost::format("Synchronize USRP to GPS %s") % desc << std::endl; + // return EXIT_FAILURE; + //} + + //Create a USRP device + //std::cout << boost::format("\nCreating the USRP device with: %s...\n") % args; + //uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args); + //std::cout << boost::format("Using Device: %s\n") % usrp->get_pp_string(); + + usrp_state_t *s = (usrp_state_t*)device->priv; + + try + { + size_t num_mboards = s->usrp->get_num_mboards(); + size_t num_gps_locked = 0; + for (size_t mboard = 0; mboard < num_mboards; mboard++) + { + std::cout << "Synchronizing mboard " << mboard << ": " << s->usrp->get_mboard_name(mboard) << std::endl; + + //Set references to GPSDO + s->usrp->set_clock_source("gpsdo", mboard); + s->usrp->set_time_source("gpsdo", mboard); + + //std::cout << std::endl; + //print_notes(); + //std::cout << std::endl; + + //Check for 10 MHz lock + std::vector sensor_names = s->usrp->get_mboard_sensor_names(mboard); + if(std::find(sensor_names.begin(), sensor_names.end(), "ref_locked") != sensor_names.end()) + { + std::cout << "Waiting for reference lock..." << std::flush; + bool ref_locked = false; + for (int i = 0; i < 30 and not ref_locked; i++) + { + ref_locked = s->usrp->get_mboard_sensor("ref_locked", mboard).to_bool(); + if (not ref_locked) + { + std::cout << "." << std::flush; + boost::this_thread::sleep(boost::posix_time::seconds(1)); + } + } + if(ref_locked) + { + std::cout << "LOCKED" << std::endl; + } else { + std::cout << "FAILED" << std::endl; + std::cout << "Failed to lock to GPSDO 10 MHz Reference. Exiting." << std::endl; + exit(EXIT_FAILURE); + } + } + else + { + std::cout << boost::format("ref_locked sensor not present on this board.\n"); + } + + //Wait for GPS lock + bool gps_locked = s->usrp->get_mboard_sensor("gps_locked", mboard).to_bool(); + if(gps_locked) + { + num_gps_locked++; + std::cout << boost::format("GPS Locked\n"); + } + else + { + std::cerr << "WARNING: GPS not locked - time will not be accurate until locked" << std::endl; + } + + //Set to GPS time + uhd::time_spec_t gps_time = uhd::time_spec_t(time_t(s->usrp->get_mboard_sensor("gps_time", mboard).to_int())); + //s->usrp->set_time_next_pps(gps_time+1.0, mboard); + s->usrp->set_time_next_pps(uhd::time_spec_t(0.0)); + + //Wait for it to apply + //The wait is 2 seconds because N-Series has a known issue where + //the time at the last PPS does not properly update at the PPS edge + //when the time is actually set. + boost::this_thread::sleep(boost::posix_time::seconds(2)); + + //Check times + gps_time = uhd::time_spec_t(time_t(s->usrp->get_mboard_sensor("gps_time", mboard).to_int())); + uhd::time_spec_t time_last_pps = s->usrp->get_time_last_pps(mboard); + std::cout << "USRP time: " << (boost::format("%0.9f") % time_last_pps.get_real_secs()) << std::endl; + std::cout << "GPSDO time: " << (boost::format("%0.9f") % gps_time.get_real_secs()) << std::endl; + //if (gps_time.get_real_secs() == time_last_pps.get_real_secs()) + // std::cout << std::endl << "SUCCESS: USRP time synchronized to GPS time" << std::endl << std::endl; + //else + // std::cerr << std::endl << "ERROR: Failed to synchronize USRP time to GPS time" << std::endl << std::endl; + } + + if (num_gps_locked == num_mboards and num_mboards > 1) + { + //Check to see if all USRP times are aligned + //First, wait for PPS. + uhd::time_spec_t time_last_pps = s->usrp->get_time_last_pps(); + while (time_last_pps == s->usrp->get_time_last_pps()) + { + boost::this_thread::sleep(boost::posix_time::milliseconds(1)); + } + + //Sleep a little to make sure all devices have seen a PPS edge + boost::this_thread::sleep(boost::posix_time::milliseconds(200)); + + //Compare times across all mboards + bool all_matched = true; + uhd::time_spec_t mboard0_time = s->usrp->get_time_last_pps(0); + for (size_t mboard = 1; mboard < num_mboards; mboard++) + { + uhd::time_spec_t mboard_time = s->usrp->get_time_last_pps(mboard); + if (mboard_time != mboard0_time) + { + all_matched = false; + std::cerr << (boost::format("ERROR: Times are not aligned: USRP 0=%0.9f, USRP %d=%0.9f") + % mboard0_time.get_real_secs() + % mboard + % mboard_time.get_real_secs()) << std::endl; + } + } + if (all_matched) + { + std::cout << "SUCCESS: USRP times aligned" << std::endl << std::endl; + } else { + std::cout << "ERROR: USRP times are not aligned" << std::endl << std::endl; + } + } + } + catch (std::exception& e) + { + std::cout << boost::format("\nError: %s") % e.what(); + std::cout << boost::format("This could mean that you have not installed the GPSDO correctly.\n\n"); + std::cout << boost::format("Visit one of these pages if the problem persists:\n"); + std::cout << boost::format(" * N2X0/E1X0: http://files.ettus.com/manual/page_gpsdo.html"); + std::cout << boost::format(" * X3X0: http://files.ettus.com/manual/page_gpsdo_x3x0.html\n\n"); + std::cout << boost::format(" * E3X0: http://files.ettus.com/manual/page_usrp_e3x0.html#e3x0_hw_gps\n\n"); + exit(EXIT_FAILURE); + } + + return EXIT_SUCCESS; +} + +#if defined(USRP_REC_PLAY) +#include "usrp_lib.h" +static FILE *pFile = NULL; +int mmapfd = 0; +struct stat sb; +iqrec_t *ms_sample = NULL; // memory for all subframes +unsigned int nb_samples = 0; +unsigned int cur_samples = 0; +int64_t wrap_count = 0; +int64_t wrap_ts = 0; +unsigned int u_sf_mode = 0; // 1=record, 2=replay +unsigned int u_sf_record = 0; // record mode +unsigned int u_sf_replay = 0; // replay mode +char u_sf_filename[1024] = ""; // subframes file path +unsigned int u_sf_max = DEF_NB_SF; // max number of recorded subframes +unsigned int u_sf_loops = DEF_SF_NB_LOOP; // number of loops in replay mode +unsigned int u_sf_read_delay = DEF_SF_DELAY_READ; // read delay in replay mode +unsigned int u_sf_write_delay = DEF_SF_DELAY_WRITE; // write delay in replay mode + +char config_opt_sf_file[] = CONFIG_OPT_SF_FILE; +char config_def_sf_file[] = DEF_SF_FILE; +char config_hlp_sf_file[] = CONFIG_HLP_SF_FILE; +char config_opt_sf_rec[] = CONFIG_OPT_SF_REC; +char config_hlp_sf_rec[] = CONFIG_HLP_SF_REC; +char config_opt_sf_rep[] = CONFIG_OPT_SF_REP; +char config_hlp_sf_rep[] = CONFIG_HLP_SF_REP; +char config_opt_sf_max[] = CONFIG_OPT_SF_MAX; +char config_hlp_sf_max[] = CONFIG_HLP_SF_MAX; +char config_opt_sf_loops[] = CONFIG_OPT_SF_LOOPS; +char config_hlp_sf_loops[] = CONFIG_HLP_SF_LOOPS; +char config_opt_sf_rdelay[] = CONFIG_OPT_SF_RDELAY; +char config_hlp_sf_rdelay[] = CONFIG_HLP_SF_RDELAY; +char config_opt_sf_wdelay[] = CONFIG_OPT_SF_WDELAY; +char config_hlp_sf_wdelay[] = CONFIG_HLP_SF_WDELAY; + +#endif + /*! \brief Called to start the USRP transceiver. Return 0 if OK, < 0 if error @param device pointer to the device structure specific to the RF hardware target */ -static int trx_usrp_start(openair0_device *device) -{ - usrp_state_t *s = (usrp_state_t*)device->priv; +static int trx_usrp_start(openair0_device *device) { - // init recv and send streaming - uhd::stream_cmd_t cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); - cmd.time_spec = s->usrp->get_time_now() + uhd::time_spec_t(0.05); - cmd.stream_now = false; // start at constant delay - s->rx_stream->issue_stream_cmd(cmd); +#if defined(USRP_REC_PLAY) + if (u_sf_mode != 2) { // not replay mode +#endif - s->tx_md.time_spec = cmd.time_spec + uhd::time_spec_t(1-(double)s->tx_forward_nsamps/s->sample_rate); - s->tx_md.has_time_spec = true; - s->tx_md.start_of_burst = true; - s->tx_md.end_of_burst = false; + usrp_state_t *s = (usrp_state_t*)device->priv; - s->rx_count = 0; - s->tx_count = 0; - s->rx_timestamp = 0; + // setup GPIO for TDD, GPIO(4) = ATR_RX + //set data direction register (DDR) to output + s->usrp->set_gpio_attr("FP0", "DDR", 0x1f, 0x1f); + + //set control register to ATR + s->usrp->set_gpio_attr("FP0", "CTRL", 0x1f,0x1f); + + //set ATR register + s->usrp->set_gpio_attr("FP0", "ATR_RX", 1<<4, 0x1f); - return 0; + // init recv and send streaming + uhd::stream_cmd_t cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS); + LOG_I(PHY,"Time in secs now: %llu \n", s->usrp->get_time_now().to_ticks(s->sample_rate)); + LOG_I(PHY,"Time in secs last pps: %llu \n", s->usrp->get_time_last_pps().to_ticks(s->sample_rate)); + + if (s->use_gps == 1) { + s->wait_for_first_pps = 1; + cmd.time_spec = s->usrp->get_time_last_pps() + uhd::time_spec_t(1.0); + } + else { + s->wait_for_first_pps = 0; + cmd.time_spec = s->usrp->get_time_now() + uhd::time_spec_t(0.05); + } + + cmd.stream_now = false; // start at constant delay + s->rx_stream->issue_stream_cmd(cmd); + + s->tx_md.time_spec = cmd.time_spec + uhd::time_spec_t(1-(double)s->tx_forward_nsamps/s->sample_rate); + s->tx_md.has_time_spec = true; + s->tx_md.start_of_burst = true; + s->tx_md.end_of_burst = false; + + s->rx_count = 0; + s->tx_count = 0; + s->rx_timestamp = 0; +#if defined(USRP_REC_PLAY) + } +#endif + return 0; } -/*! \brief Terminate operation of the USRP transceiver -- free all associated resources +/*! \brief Terminate operation of the USRP transceiver -- free all associated resources * \param device the hardware to use */ -static void trx_usrp_end(openair0_device *device) -{ - usrp_state_t *s = (usrp_state_t*)device->priv; +static void trx_usrp_end(openair0_device *device) { +#if defined(USRP_REC_PLAY) // For some ugly reason, this can be called several times... + static int done = 0; + if (done == 1) return; + done = 1; + if (u_sf_mode != 2) { // not subframes replay +#endif + usrp_state_t *s = (usrp_state_t*)device->priv; - s->rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); - - //send a mini EOB packet - s->tx_md.end_of_burst = true; - s->tx_stream->send("", 0, s->tx_md); - s->tx_md.end_of_burst = false; - + s->rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS); + //send a mini EOB packet + s->tx_md.end_of_burst = true; + s->tx_stream->send("", 0, s->tx_md); + s->tx_md.end_of_burst = false; +#if defined(USRP_REC_PLAY) + } +#endif +#if defined(USRP_REC_PLAY) + if (u_sf_mode == 1) { // subframes store + pFile = fopen (u_sf_filename,"wb+"); + if (pFile == NULL) { + std::cerr << "Cannot open " << u_sf_filename << std::endl; + } else { + unsigned int i = 0; + unsigned int modu = 0; + if ((modu = nb_samples % 10) != 0) { + nb_samples -= modu; // store entire number of frames + } + std::cerr << "Writing " << nb_samples << " subframes to " << u_sf_filename << " ..." << std::endl; + for (i = 0; i < nb_samples; i++) { + fwrite(ms_sample+i, sizeof(unsigned char), sizeof(iqrec_t), pFile); + } + fclose (pFile); + std::cerr << "File " << u_sf_filename << " closed." << std::endl; + } + } + if (u_sf_mode == 1) { // record + if (ms_sample != NULL) { + free((void*)ms_sample); + ms_sample = NULL; + } + } + if (u_sf_mode == 2) { // replay + if (ms_sample != MAP_FAILED) { + munmap(ms_sample, sb.st_size); + ms_sample = NULL; + } + if (mmapfd != 0) { + close(mmapfd); + mmapfd = 0; + } + } +#endif } /*! \brief Called to send samples to the USRP RF target @param device pointer to the device structure specific to the RF hardware target - @param timestamp The timestamp at whicch the first sample MUST be sent + @param timestamp The timestamp at which the first sample MUST be sent @param buff Buffer which holds the samples @param nsamps number of samples to be sent - @param antenna_id index of the antenna if the device has multiple anteannas + @param antenna_id index of the antenna if the device has multiple antennas @param flags flags must be set to TRUE if timestamp parameter needs to be applied -*/ -static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) -{ +*/ +static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + int ret=0; +#if defined(USRP_REC_PLAY) + if (u_sf_mode != 2) { // not replay mode +#endif usrp_state_t *s = (usrp_state_t*)device->priv; + + int nsamps2; // aligned to upper 32 or 16 byte boundary +#if defined(__x86_64) || defined(__i386__) +#ifdef __AVX2__ + nsamps2 = (nsamps+7)>>3; + __m256i buff_tx[2][nsamps2]; +#else + nsamps2 = (nsamps+3)>>2; + __m128i buff_tx[2][nsamps2]; +#endif +#elif defined(__arm__) + nsamps2 = (nsamps+3)>>2; + int16x8_t buff_tx[2][nsamps2]; +#endif + + // bring RX data into 12 LSBs for softmodem RX + for (int i=0; itx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate); - if(flags) + s->tx_md.has_time_spec = flags; + + + if(flags>0) s->tx_md.has_time_spec = true; else s->tx_md.has_time_spec = false; - + + if (flags == 2) { // start of burst + s->tx_md.start_of_burst = true; + s->tx_md.end_of_burst = false; + } else if (flags == 3) { // end of burst + s->tx_md.start_of_burst = false; + s->tx_md.end_of_burst = true; + } else if (flags == 4) { // start and end + s->tx_md.start_of_burst = true; + s->tx_md.end_of_burst = true; + } else if (flags==1) { // middle of burst + s->tx_md.start_of_burst = false; + s->tx_md.end_of_burst = false; + } + if (cc>1) { std::vector buff_ptrs; - for (int i=0;itx_stream->send(buff_ptrs, nsamps, s->tx_md); + for (int i=0; itx_stream->send(buff_ptrs, nsamps, s->tx_md,1e-3); + } else + ret = (int)s->tx_stream->send(buff_tx[0], nsamps, s->tx_md,1e-3); + + + + if (ret != nsamps) + LOG_E(PHY,"[xmit] tx samples %d != %d\n",ret,nsamps); +#if defined(USRP_REC_PLAY) + } else { + struct timespec req; + req.tv_sec = 0; + req.tv_nsec = u_sf_write_delay * 1000; + nanosleep(&req, NULL); + ret = nsamps; } - else - s->tx_stream->send(buff[0], nsamps, s->tx_md); - s->tx_md.start_of_burst = false; +#endif - return 0; + return ret; } /*! \brief Receive samples from hardware. @@ -202,578 +520,771 @@ static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, * \param antenna_id Index of antenna for which to receive samples * \returns the number of sample read */ -static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) -{ - usrp_state_t *s = (usrp_state_t*)device->priv; - int samples_received=0,i,j; - int nsamps2; // aligned to upper 32 or 16 byte boundary +static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { + usrp_state_t *s = (usrp_state_t*)device->priv; + int samples_received=0,i,j; + int nsamps2; // aligned to upper 32 or 16 byte boundary +#if defined(USRP_REC_PLAY) + if (u_sf_mode != 2) { // not replay mode +#endif #if defined(__x86_64) || defined(__i386__) #ifdef __AVX2__ - __m256i buff_tmp[2][nsamps>>3]; - nsamps2 = (nsamps+7)>>3; + nsamps2 = (nsamps+7)>>3; + __m256i buff_tmp[2][nsamps2]; #else - __m128i buff_tmp[2][nsamps>>2]; - nsamps2 = (nsamps+3)>>2; + nsamps2 = (nsamps+3)>>2; + __m128i buff_tmp[2][nsamps2]; #endif #elif defined(__arm__) - int16x8_t buff_tmp[2][nsamps>>2]; - nsamps2 = (nsamps+3)>>2; + nsamps2 = (nsamps+3)>>2; + int16x8_t buff_tmp[2][nsamps2]; #endif - - if (device->type == USRP_B200_DEV) { - if (cc>1) { - // receive multiple channels (e.g. RF A and RF B) - std::vector buff_ptrs; - - for (int i=0;irx_stream->recv(buff_ptrs, nsamps, s->rx_md); - } else { - // receive a single channel (e.g. from connector RF A) - samples_received = s->rx_stream->recv(buff_tmp[0], nsamps, s->rx_md); - } - - // bring RX data into 12 LSBs for softmodem RX - for (int i=0;itype == USRP_B200_DEV) { + if (cc>1) { + // receive multiple channels (e.g. RF A and RF B) + std::vector buff_ptrs; + for (int i=0; irx_stream->recv(buff_ptrs, nsamps, s->rx_md); + } else { + // receive a single channel (e.g. from connector RF A) + samples_received=0; + while (samples_received != nsamps) { + samples_received += s->rx_stream->recv(buff_tmp[0]+samples_received, + nsamps-samples_received, s->rx_md); + if ((s->wait_for_first_pps == 0) && (s->rx_md.error_code!=uhd::rx_metadata_t::ERROR_CODE_NONE)) + break; + if ((s->wait_for_first_pps == 1) && (samples_received != nsamps)) { printf("sleep...\n");} //usleep(100); + } + if (samples_received == nsamps) s->wait_for_first_pps=0; + } + // bring RX data into 12 LSBs for softmodem RX + for (int i=0; itype == USRP_X300_DEV) { + if (cc>1) { + // receive multiple channels (e.g. RF A and RF B) + std::vector buff_ptrs; + + for (int i=0; irx_stream->recv(buff_ptrs, nsamps, s->rx_md); + } else { + // receive a single channel (e.g. from connector RF A) + samples_received = s->rx_stream->recv(buff[0], nsamps, s->rx_md); + } + } + if (samples_received < nsamps) + LOG_E(PHY,"[recv] received %d samples out of %d\n",samples_received,nsamps); + + if ( s->rx_md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE) + LOG_E(PHY, "%s\n", s->rx_md.to_pp_string(true).c_str()); + + s->rx_count += nsamps; + s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate); + *ptimestamp = s->rx_timestamp; +#if defined (USRP_REC_PLAY) + } +#endif +#if defined(USRP_REC_PLAY) + if (u_sf_mode == 1) { // record mode + // Copy subframes to memory (later dump on a file) + if (nb_samples < u_sf_max) { + (ms_sample+nb_samples)->header = BELL_LABS_IQ_HEADER; + (ms_sample+nb_samples)->ts = *ptimestamp; + memcpy((ms_sample+nb_samples)->samples, buff[0], nsamps*4); + nb_samples++; + } + } else if (u_sf_mode == 2) { // replay mode + if (cur_samples == nb_samples) { + cur_samples = 0; + wrap_count++; + if (wrap_count == u_sf_loops) { + std::cerr << "USRP device terminating subframes replay mode after " << u_sf_loops << " loops." << std::endl; + return 0; // should make calling process exit } + wrap_ts = wrap_count * (nb_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000)); } - } else if (device->type == USRP_X300_DEV) { - if (cc>1) { - // receive multiple channels (e.g. RF A and RF B) - std::vector buff_ptrs; - - for (int i=0;irx_stream->recv(buff_ptrs, nsamps, s->rx_md); - } else { - // receive a single channel (e.g. from connector RF A) - samples_received = s->rx_stream->recv(buff[0], nsamps, s->rx_md); + if (cur_samples < nb_samples) { + *ptimestamp = (ms_sample[0].ts + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000))) + wrap_ts; + if (cur_samples == 0) { + std::cerr << "starting subframes file with wrap_count=" << wrap_count << " wrap_ts=" << wrap_ts + << " ts=" << *ptimestamp << std::endl; + } + memcpy(buff[0], &ms_sample[cur_samples].samples[0], nsamps*4); + cur_samples++; } + struct timespec req; + req.tv_sec = 0; + req.tv_nsec = u_sf_read_delay * 1000; + nanosleep(&req, NULL); + return nsamps; } - - if (samples_received < nsamps) { - printf("[recv] received %d samples out of %d\n",samples_received,nsamps); - - } - - //handle the error code - switch(s->rx_md.error_code){ - case uhd::rx_metadata_t::ERROR_CODE_NONE: - break; - case uhd::rx_metadata_t::ERROR_CODE_OVERFLOW: - printf("[recv] USRP RX OVERFLOW!\n"); - s->num_overflows++; - break; - case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT: - printf("[recv] USRP RX TIMEOUT!\n"); - break; - default: - printf("[recv] Unexpected error on RX, Error code: 0x%x\n",s->rx_md.error_code); - break; - } - s->rx_count += nsamps; - s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate); - *ptimestamp = s->rx_timestamp; - +#endif return samples_received; } -/*! \brief Get current timestamp of USRP - * \param device the hardware to use -*/ -openair0_timestamp get_usrp_time(openair0_device *device) -{ - - usrp_state_t *s = (usrp_state_t*)device->priv; - - return s->usrp->get_time_now().to_ticks(s->sample_rate); -} - /*! \brief Compares two variables within precision * \param a first variable * \param b second variable */ -static bool is_equal(double a, double b) -{ - return std::fabs(a-b) < std::numeric_limits::epsilon(); +static bool is_equal(double a, double b) { + return std::fabs(a-b) < std::numeric_limits::epsilon(); } -/*! \brief Set frequencies (TX/RX) +void *freq_thread(void *arg) { + + openair0_device *device=(openair0_device *)arg; + usrp_state_t *s = (usrp_state_t*)device->priv; + + s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]); + s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]); +} +/*! \brief Set frequencies (TX/RX). Spawns a thread to handle the frequency change to not block the calling thread * \param device the hardware to use * \param openair0_cfg RF frontend parameters set by application * \param dummy dummy variable not used - * \returns 0 in success + * \returns 0 in success */ -int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) { +int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dont_block) { - usrp_state_t *s = (usrp_state_t*)device->priv; + usrp_state_t *s = (usrp_state_t*)device->priv; + pthread_t f_thread; - printf("Setting USRP TX Freq %f, RX Freq %f\n",openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0]); - s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[0]); - s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[0]); + printf("Setting USRP TX Freq %f, RX Freq %f\n",openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0]); + + // spawn a thread to handle the frequency change to not block the calling thread + if (dont_block == 1) + pthread_create(&f_thread,NULL,freq_thread,(void*)device); + else { + s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]); + s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]); + } + + return(0); - return(0); - } -/*! \brief Set RX frequencies +/*! \brief Set RX frequencies * \param device the hardware to use * \param openair0_cfg RF frontend parameters set by application - * \returns 0 in success + * \returns 0 in success */ int openair0_set_rx_frequencies(openair0_device* device, openair0_config_t *openair0_cfg) { - usrp_state_t *s = (usrp_state_t*)device->priv; - static int first_call=1; - static double rf_freq,diff; + usrp_state_t *s = (usrp_state_t*)device->priv; + static int first_call=1; + static double rf_freq,diff; - uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0]); + uhd::tune_request_t rx_tune_req(openair0_cfg[0].rx_freq[0]); - rx_tune_req.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL; - rx_tune_req.rf_freq = openair0_cfg[0].rx_freq[0]; - rf_freq=openair0_cfg[0].rx_freq[0]; - s->usrp->set_rx_freq(rx_tune_req); + rx_tune_req.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL; + rx_tune_req.rf_freq = openair0_cfg[0].rx_freq[0]; + rf_freq=openair0_cfg[0].rx_freq[0]; + s->usrp->set_rx_freq(rx_tune_req); + + return(0); - return(0); - } /*! \brief Set Gains (TX/RX) * \param device the hardware to use * \param openair0_cfg RF frontend parameters set by application - * \returns 0 in success + * \returns 0 in success */ -int trx_usrp_set_gains(openair0_device* device, - openair0_config_t *openair0_cfg) { +int trx_usrp_set_gains(openair0_device* device, + openair0_config_t *openair0_cfg) { - usrp_state_t *s = (usrp_state_t*)device->priv; + usrp_state_t *s = (usrp_state_t*)device->priv; + ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(0); + s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[0]); + ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(0); + // limit to maximum gain + if (openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0] > gain_range.stop()) { + LOG_E(PHY,"RX Gain 0 too high, reduce by %f dB\n", + openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0] - gain_range.stop()); + exit(-1); + } + s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0]); + LOG_I(PHY,"Setting USRP RX gain to %f (rx_gain %f,gain_range.stop() %f)\n", + openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0], + openair0_cfg[0].rx_gain[0],gain_range.stop()); - s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[0]); - ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(0); - // limit to maximum gain - if (openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0] > gain_range.stop()) { - - printf("RX Gain 0 too high, reduce by %f dB\n", - openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0] - gain_range.stop()); - exit(-1); - } - s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0]); - printf("Setting USRP RX gain to %f (rx_gain %f,gain_range.stop() %f)\n", openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0],openair0_cfg[0].rx_gain[0],gain_range.stop()); - - return(0); + return(0); } /*! \brief Stop USRP * \param card refers to the hardware index to use */ -int trx_usrp_stop(int card) { - return(0); +int trx_usrp_stop(openair0_device* device) { + return(0); } /*! \brief USRPB210 RX calibration table */ rx_gain_calib_table_t calib_table_b210[] = { - {3500000000.0,44.0}, - {2660000000.0,49.0}, - {2300000000.0,50.0}, - {1880000000.0,53.0}, - {816000000.0,58.0}, - {-1,0}}; + {3500000000.0,44.0}, + {2660000000.0,49.0}, + {2300000000.0,50.0}, + {1880000000.0,53.0}, + {816000000.0,58.0}, + {-1,0} +}; /*! \brief USRPB210 RX calibration table */ rx_gain_calib_table_t calib_table_b210_38[] = { - {3500000000.0,44.0}, - {2660000000.0,49.8}, - {2300000000.0,51.0}, - {1880000000.0,53.0}, - {816000000.0,57.0}, - {-1,0}}; + {3500000000.0,44.0}, + {2660000000.0,49.8}, + {2300000000.0,51.0}, + {1880000000.0,53.0}, + {816000000.0,57.0}, + {-1,0} +}; /*! \brief USRPx310 RX calibration table */ rx_gain_calib_table_t calib_table_x310[] = { - {3500000000.0,77.0}, - {2660000000.0,81.0}, - {2300000000.0,81.0}, - {1880000000.0,82.0}, - {816000000.0,85.0}, - {-1,0}}; + {3500000000.0,77.0}, + {2660000000.0,81.0}, + {2300000000.0,81.0}, + {1880000000.0,82.0}, + {816000000.0,85.0}, + {-1,0} +}; -/*! \brief Set RX gain offset +/*! \brief Set RX gain offset * \param openair0_cfg RF frontend parameters set by application * \param chain_index RF chain to apply settings to - * \returns 0 in success + * \returns 0 in success */ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index,int bw_gain_adjust) { - int i=0; - // loop through calibration table to find best adjustment factor for RX frequency - double min_diff = 6e9,diff,gain_adj=0.0; - if (bw_gain_adjust==1) { - switch ((int)openair0_cfg[0].sample_rate) { - case 30720000: - break; - case 23040000: - gain_adj=1.25; - break; - case 15360000: - gain_adj=3.0; - break; - case 7680000: - gain_adj=6.0; - break; - case 3840000: - gain_adj=9.0; - break; - case 1920000: - gain_adj=12.0; - break; - default: - printf("unknown sampling rate %d\n",(int)openair0_cfg[0].sample_rate); - exit(-1); - break; + int i=0; + // loop through calibration table to find best adjustment factor for RX frequency + double min_diff = 6e9,diff,gain_adj=0.0; + if (bw_gain_adjust==1) { + switch ((int)openair0_cfg[0].sample_rate) { + case 30720000: + break; + case 23040000: + gain_adj=1.25; + break; + case 15360000: + gain_adj=3.0; + break; + case 7680000: + gain_adj=6.0; + break; + case 3840000: + gain_adj=9.0; + break; + case 1920000: + gain_adj=12.0; + break; + default: + LOG_E(PHY,"unknown sampling rate %d\n",(int)openair0_cfg[0].sample_rate); + exit(-1); + break; + } } - } - while (openair0_cfg->rx_gain_calib_table[i].freq>0) { - diff = fabs(openair0_cfg->rx_freq[chain_index] - openair0_cfg->rx_gain_calib_table[i].freq); - printf("cal %d: freq %f, offset %f, diff %f\n", - i, - openair0_cfg->rx_gain_calib_table[i].freq, - openair0_cfg->rx_gain_calib_table[i].offset,diff); - if (min_diff > diff) { - min_diff = diff; - openair0_cfg->rx_gain_offset[chain_index] = openair0_cfg->rx_gain_calib_table[i].offset+gain_adj; + while (openair0_cfg->rx_gain_calib_table[i].freq>0) { + diff = fabs(openair0_cfg->rx_freq[chain_index] - openair0_cfg->rx_gain_calib_table[i].freq); + LOG_I(PHY,"cal %d: freq %f, offset %f, diff %f\n", + i, + openair0_cfg->rx_gain_calib_table[i].freq, + openair0_cfg->rx_gain_calib_table[i].offset,diff); + if (min_diff > diff) { + min_diff = diff; + openair0_cfg->rx_gain_offset[chain_index] = openair0_cfg->rx_gain_calib_table[i].offset+gain_adj; + } + i++; } - i++; - } - } -/*! \brief print the USRP statistics +/*! \brief print the USRP statistics * \param device the hardware to use * \returns 0 on success */ int trx_usrp_get_stats(openair0_device* device) { - - return(0); - + return(0); } -/*! \brief Reset the USRP statistics -* \param device the hardware to use -* \returns 0 on success -*/ +/*! \brief Reset the USRP statistics + * \param device the hardware to use + * \returns 0 on success + */ int trx_usrp_reset_stats(openair0_device* device) { - - return(0); - + return(0); } +#if defined(USRP_REC_PLAY) +extern "C" { +/*! \brief Initializer for USRP record/playback config + * \param parameter array description + * \returns 0 on success + */ +int trx_usrp_recplay_config_init(paramdef_t *usrp_recplay_params) { + // --subframes-file + memcpy(usrp_recplay_params[0].optname, config_opt_sf_file, strlen(config_opt_sf_file)); + usrp_recplay_params[0].helpstr = config_hlp_sf_file; + usrp_recplay_params[0].paramflags=PARAMFLAG_NOFREE; + usrp_recplay_params[0].strptr=(char **)&u_sf_filename; + usrp_recplay_params[0].defstrval = NULL; + usrp_recplay_params[0].type=TYPE_STRING; + usrp_recplay_params[0].numelt=sizeof(u_sf_filename); + // --subframes-record + memcpy(usrp_recplay_params[1].optname, config_opt_sf_rec, strlen(config_opt_sf_rec)); + usrp_recplay_params[1].helpstr = config_hlp_sf_rec; + usrp_recplay_params[1].paramflags=PARAMFLAG_BOOL; + usrp_recplay_params[1].uptr=&u_sf_record; + usrp_recplay_params[1].defuintval=0; + usrp_recplay_params[1].type=TYPE_UINT; + usrp_recplay_params[1].numelt=0; + // --subframes-replay + memcpy(usrp_recplay_params[2].optname, config_opt_sf_rep, strlen(config_opt_sf_rep)); + usrp_recplay_params[2].helpstr = config_hlp_sf_rep; + usrp_recplay_params[2].paramflags=PARAMFLAG_BOOL; + usrp_recplay_params[2].uptr=&u_sf_replay; + usrp_recplay_params[2].defuintval=0; + usrp_recplay_params[2].type=TYPE_UINT; + usrp_recplay_params[2].numelt=0; + // --subframes-max + memcpy(usrp_recplay_params[3].optname, config_opt_sf_max, strlen(config_opt_sf_max)); + usrp_recplay_params[3].helpstr = config_hlp_sf_max; + usrp_recplay_params[3].paramflags=0; + usrp_recplay_params[3].uptr=&u_sf_max; + usrp_recplay_params[3].defuintval=DEF_NB_SF; + usrp_recplay_params[3].type=TYPE_UINT; + usrp_recplay_params[3].numelt=0; + // --subframes-loops + memcpy(usrp_recplay_params[4].optname, config_opt_sf_loops, strlen(config_opt_sf_loops)); + usrp_recplay_params[4].helpstr = config_hlp_sf_loops; + usrp_recplay_params[4].paramflags=0; + usrp_recplay_params[4].uptr=&u_sf_loops; + usrp_recplay_params[4].defuintval=DEF_SF_NB_LOOP; + usrp_recplay_params[4].type=TYPE_UINT; + usrp_recplay_params[4].numelt=0; + // --subframes-read-delay + memcpy(usrp_recplay_params[5].optname, config_opt_sf_rdelay, strlen(config_opt_sf_rdelay)); + usrp_recplay_params[5].helpstr = config_hlp_sf_rdelay; + usrp_recplay_params[5].paramflags=0; + usrp_recplay_params[5].uptr=&u_sf_read_delay; + usrp_recplay_params[5].defuintval=DEF_SF_DELAY_READ; + usrp_recplay_params[5].type=TYPE_UINT; + usrp_recplay_params[5].numelt=0; + // --subframes-write-delay + memcpy(usrp_recplay_params[6].optname, config_opt_sf_wdelay, strlen(config_opt_sf_wdelay)); + usrp_recplay_params[6].helpstr = config_hlp_sf_wdelay; + usrp_recplay_params[6].paramflags=0; + usrp_recplay_params[6].uptr=&u_sf_write_delay; + usrp_recplay_params[6].defuintval=DEF_SF_DELAY_WRITE; + usrp_recplay_params[6].type=TYPE_UINT; + usrp_recplay_params[6].numelt=0; + return 0; // always ok +} +} +#endif extern "C" { -/*! \brief Initialize Openair USRP target. It returns 0 if OK -* \param device the hardware to use -* \param openair0_cfg RF frontend parameters set by application -*/ - int device_init(openair0_device* device, openair0_config_t *openair0_cfg) { - - uhd::set_thread_priority_safe(1.0); - usrp_state_t *s = (usrp_state_t*)malloc(sizeof(usrp_state_t)); - memset(s, 0, sizeof(usrp_state_t)); - - // Initialize USRP device - - - std::string args = "type=b200"; - - - uhd::device_addrs_t device_adds = uhd::device::find(args); - size_t i; - - int vers=0,subvers=0,subsubvers=0; - int bw_gain_adjust=0; - - sscanf(uhd::get_version_string().c_str(),"%d.%d.%d",&vers,&subvers,&subsubvers); - - printf("Checking for USRPs : UHD %s (%d.%d.%d)\n",uhd::get_version_string().c_str(),vers,subvers,subsubvers); - - if(device_adds.size() == 0) - { - double usrp_master_clock = 184.32e6; - - std::string args = "type=x300"; - - // workaround for an api problem, master clock has to be set with the constructor not via set_master_clock_rate - args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); - - uhd::device_addrs_t device_adds = uhd::device::find(args); - - if(device_adds.size() == 0) - { - std::cerr<<"No USRP Device Found. " << std::endl; - free(s); - return -1; - - } - - - printf("Found USRP X300\n"); - s->usrp = uhd::usrp::multi_usrp::make(args); - // s->usrp->set_rx_subdev_spec(rx_subdev); - // s->usrp->set_tx_subdev_spec(tx_subdev); - - // lock mboard clocks - s->usrp->set_clock_source("internal"); - - //Setting device type to USRP X300/X310 - device->type=USRP_X300_DEV; - - // this is not working yet, master clock has to be set via constructor - // set master clock rate and sample rate for tx & rx for streaming - //s->usrp->set_master_clock_rate(usrp_master_clock); - - openair0_cfg[0].rx_gain_calib_table = calib_table_x310; - - switch ((int)openair0_cfg[0].sample_rate) { - case 30720000: - // from usrp_time_offset - openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 15; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; - break; - case 15360000: - openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 45; - openair0_cfg[0].tx_bw = 10e6; - openair0_cfg[0].rx_bw = 10e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; - break; - case 7680000: - openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 50; - openair0_cfg[0].tx_bw = 5e6; - openair0_cfg[0].rx_bw = 5e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; - break; - case 1920000: - openair0_cfg[0].samples_per_packet = 256; - openair0_cfg[0].tx_sample_advance = 50; - openair0_cfg[0].tx_bw = 1.25e6; - openair0_cfg[0].rx_bw = 1.25e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; - break; - default: - printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); - exit(-1); - break; - } - - } else { - printf("Found USRP B200"); - args += ",num_recv_frames=256" ; - s->usrp = uhd::usrp::multi_usrp::make(args); - - // s->usrp->set_rx_subdev_spec(rx_subdev); - // s->usrp->set_tx_subdev_spec(tx_subdev); - - // do not explicitly set the clock to "internal", because this will disable the gpsdo - // // lock mboard clocks - // s->usrp->set_clock_source("internal"); - // set master clock rate and sample rate for tx & rx for streaming - - device->type = USRP_B200_DEV; - - - if ((vers == 3) && (subvers == 9) && (subsubvers>=2)) { - openair0_cfg[0].rx_gain_calib_table = calib_table_b210; - bw_gain_adjust=0; - } - else { - openair0_cfg[0].rx_gain_calib_table = calib_table_b210_38; - bw_gain_adjust=1; - } - - switch ((int)openair0_cfg[0].sample_rate) { - case 30720000: - s->usrp->set_master_clock_rate(30.72e6); - openair0_cfg[0].samples_per_packet = 4096; - openair0_cfg[0].tx_sample_advance = 115; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 11*openair0_cfg[0].samples_per_packet; - break; - case 23040000: - s->usrp->set_master_clock_rate(23.04e6); //to be checked - openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 113; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; - break; - case 15360000: - s->usrp->set_master_clock_rate(30.72e06); - openair0_cfg[0].samples_per_packet = 2048; - openair0_cfg[0].tx_sample_advance = 103; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 10240; - break; - case 7680000: - s->usrp->set_master_clock_rate(30.72e6); - openair0_cfg[0].samples_per_packet = 1024; - openair0_cfg[0].tx_sample_advance = 80; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet; - break; - case 1920000: - s->usrp->set_master_clock_rate(7.68e6); - openair0_cfg[0].samples_per_packet = 256; - openair0_cfg[0].tx_sample_advance = 40; - openair0_cfg[0].tx_bw = 20e6; - openair0_cfg[0].rx_bw = 20e6; - openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet; - break; - default: - printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); - exit(-1); - break; - } - } - - /* device specific */ - openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered - openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered - openair0_cfg[0].iq_txshift = 4;//shift - openair0_cfg[0].iq_rxrescale = 15;//rescale iqs - - for(i=0;iusrp->get_rx_num_channels();i++) { - if (iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i); - //s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); - //printf("Setting rx freq/gain on channel %lu/%lu : BW %f (readback %f)\n",i,s->usrp->get_rx_num_channels(),openair0_cfg[0].rx_bw/1e6,s->usrp->get_rx_bandwidth(i)/1e6); - s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i); - set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust); - - ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); - // limit to maximum gain - if (openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] > gain_range.stop()) { - - printf("RX Gain %lu too high, lower by %f dB\n",i,openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop()); - exit(-1); + /*! \brief Initialize Openair USRP target. It returns 0 if OK + * \param device the hardware to use + * \param openair0_cfg RF frontend parameters set by application + */ + int device_init(openair0_device* device, openair0_config_t *openair0_cfg) { +#if defined(USRP_REC_PLAY) + paramdef_t usrp_recplay_params[7]; + // to check + static int done = 0; + if (done == 1) { + return 0; + } // prevent from multiple init + done = 1; + // end to check + memset(usrp_recplay_params, 0, 7*sizeof(paramdef_t)); + memset(&u_sf_filename[0], 0, 1024); + if (trx_usrp_recplay_config_init(usrp_recplay_params) != 0) { + std::cerr << "USRP device record/replay mode configuration error exiting" << std::endl; + return -1; } - s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i); - printf("RX Gain %lu %f (%f) => %f (max %f)\n",i, - openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i], - openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop()); - } - } - for(i=0;iusrp->get_tx_num_channels();i++) { - if (iusrp->set_tx_rate(openair0_cfg[0].sample_rate,i); - //s->usrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i); - //printf("Setting tx freq/gain on channel %lu/%lu: BW %f (readback %f)\n",i,s->usrp->get_tx_num_channels(),openair0_cfg[0].tx_bw/1e6,s->usrp->get_tx_bandwidth(i)/1e6); - s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); - s->usrp->set_tx_gain(openair0_cfg[0].tx_gain[i],i); - } - } + config_process_cmdline(usrp_recplay_params,sizeof(usrp_recplay_params)/sizeof(paramdef_t),NULL); + if (strlen(u_sf_filename) == 0) { + (void) strcpy(u_sf_filename, DEF_SF_FILE); + } - // display USRP settings - std::cout << boost::format("Actual master clock: %fMHz...") % (s->usrp->get_master_clock_rate()/1e6) << std::endl; - - sleep(1); + if (u_sf_replay == 1) u_sf_mode = 2; + if (u_sf_record == 1) u_sf_mode = 1; + + if (u_sf_mode == 2) { + // Replay subframes from from file + int bw_gain_adjust=0; + device->openair0_cfg = openair0_cfg; + device->type = USRP_B200_DEV; + openair0_cfg[0].rx_gain_calib_table = calib_table_b210_38; + bw_gain_adjust=1; + openair0_cfg[0].tx_sample_advance = 80; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + openair0_cfg[0].iq_txshift = 4;//shift + openair0_cfg[0].iq_rxrescale = 15;//rescale iqs + set_rx_gain_offset(&openair0_cfg[0],0,bw_gain_adjust); + device->priv = NULL; + device->trx_start_func = trx_usrp_start; + device->trx_write_func = trx_usrp_write; + device->trx_read_func = trx_usrp_read; + device->trx_get_stats_func = trx_usrp_get_stats; + device->trx_reset_stats_func = trx_usrp_reset_stats; + device->trx_end_func = trx_usrp_end; + device->trx_stop_func = trx_usrp_stop; + device->trx_set_freq_func = trx_usrp_set_freq; + device->trx_set_gains_func = trx_usrp_set_gains; + device->openair0_cfg = openair0_cfg; + std::cerr << "USRP device initialized in subframes replay mode for " << u_sf_loops << " loops." << std::endl; + } else { +#endif + uhd::set_thread_priority_safe(1.0); + usrp_state_t *s = (usrp_state_t*)calloc(sizeof(usrp_state_t),1); + + if (openair0_cfg[0].clock_source==gpsdo) + s->use_gps =1; - // create tx & rx streamer - uhd::stream_args_t stream_args_rx("sc16", "sc16"); - //stream_args_rx.args["spp"] = str(boost::format("%d") % 2048);//(openair0_cfg[0].rx_num_channels*openair0_cfg[0].samples_per_packet)); - for (i = 0; irx_stream = s->usrp->get_rx_stream(stream_args_rx); - std::cout << boost::format("rx_max_num_samps %u") % (s->rx_stream->get_max_num_samps()) << std::endl; - //openair0_cfg[0].samples_per_packet = s->rx_stream->get_max_num_samps(); + // Initialize USRP device + device->openair0_cfg = openair0_cfg; - uhd::stream_args_t stream_args_tx("sc16", "sc16"); - //stream_args_tx.args["spp"] = str(boost::format("%d") % 2048);//(openair0_cfg[0].tx_num_channels*openair0_cfg[0].samples_per_packet)); - for (i = 0; itx_stream = s->usrp->get_tx_stream(stream_args_tx); - std::cout << boost::format("tx_max_num_samps %u") % (s->tx_stream->get_max_num_samps()) << std::endl; + std::string args = "type=b200"; + uhd::device_addrs_t device_adds = uhd::device::find(args); + int vers=0,subvers=0,subsubvers=0; + int bw_gain_adjust=0; - /* Setting TX/RX BW after streamers are created due to USRP calibration issue */ - for(i=0;iusrp->get_tx_num_channels();i++) { - if (iusrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i); - printf("Setting tx freq/gain on channel %lu/%lu: BW %f (readback %f)\n",i,s->usrp->get_tx_num_channels(),openair0_cfg[0].tx_bw/1e6,s->usrp->get_tx_bandwidth(i)/1e6); - } - } - for(i=0;iusrp->get_rx_num_channels();i++) { - if (iusrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); - printf("Setting rx freq/gain on channel %lu/%lu : BW %f (readback %f)\n",i,s->usrp->get_rx_num_channels(),openair0_cfg[0].rx_bw/1e6,s->usrp->get_rx_bandwidth(i)/1e6); - } - } +#if defined(USRP_REC_PLAY) + if (u_sf_mode == 1) { + std::cerr << "USRP device initialized in subframes record mode" << std::endl; + } +#endif + sscanf(uhd::get_version_string().c_str(),"%d.%d.%d",&vers,&subvers,&subsubvers); + LOG_I(PHY,"Checking for USRPs : UHD %s (%d.%d.%d)\n", + uhd::get_version_string().c_str(),vers,subvers,subsubvers); - s->usrp->set_time_now(uhd::time_spec_t(0.0)); + if(device_adds.size() == 0) { + double usrp_master_clock = 184.32e6; + std::string args = "type=x300"; + + // workaround for an api problem, master clock has to be set with the constructor not via set_master_clock_rate + args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock); + +// args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=4096, recv_frame_size=4096"; + + // args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=4096, recv_frame_size=4096"; + uhd::device_addrs_t device_adds = uhd::device::find(args); + + if(device_adds.size() == 0) { + std::cerr<<"No USRP Device Found. " << std::endl; + free(s); + return -1; + } + LOG_I(PHY,"Found USRP X300\n"); + s->usrp = uhd::usrp::multi_usrp::make(args); + // lock mboard clocks + if (openair0_cfg[0].clock_source == internal) + s->usrp->set_clock_source("internal"); + else + s->usrp->set_clock_source("external"); + + //Setting device type to USRP X300/X310 + device->type=USRP_X300_DEV; + + // this is not working yet, master clock has to be set via constructor + // set master clock rate and sample rate for tx & rx for streaming + //s->usrp->set_master_clock_rate(usrp_master_clock); + + openair0_cfg[0].rx_gain_calib_table = calib_table_x310; + +#if defined(USRP_REC_PLAY) + std::cerr << "-- Using calibration table: calib_table_x310" << std::endl; // Bell Labs info +#endif + + LOG_I(PHY,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate); + + switch ((int)openair0_cfg[0].sample_rate) { + case 30720000: + // from usrp_time_offset + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 15; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + case 15360000: + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 45; + openair0_cfg[0].tx_bw = 10e6; + openair0_cfg[0].rx_bw = 10e6; + break; + case 7680000: + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_bw = 5e6; + openair0_cfg[0].rx_bw = 5e6; + break; + case 1920000: + //openair0_cfg[0].samples_per_packet = 2048; + openair0_cfg[0].tx_sample_advance = 50; + openair0_cfg[0].tx_bw = 1.25e6; + openair0_cfg[0].rx_bw = 1.25e6; + break; + default: + LOG_E(PHY,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + exit(-1); + break; + } + + } else { + LOG_I(PHY,"Found USRP B200\n"); + args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=15360, recv_frame_size=15360" ; + s->usrp = uhd::usrp::multi_usrp::make(args); + + // s->usrp->set_rx_subdev_spec(rx_subdev); + // s->usrp->set_tx_subdev_spec(tx_subdev); + + // do not explicitly set the clock to "internal", because this will disable the gpsdo + // // lock mboard clocks + // s->usrp->set_clock_source("internal"); + // set master clock rate and sample rate for tx & rx for streaming + + // lock mboard clocks + if (openair0_cfg[0].clock_source == internal){ + s->usrp->set_clock_source("internal"); + } + else{ + s->usrp->set_clock_source("external"); + s->usrp->set_time_source("external"); + } + + device->type = USRP_B200_DEV; + if ((vers == 3) && (subvers == 9) && (subsubvers>=2)) { + openair0_cfg[0].rx_gain_calib_table = calib_table_b210; + bw_gain_adjust=0; +#if defined(USRP_REC_PLAY) + std::cerr << "-- Using calibration table: calib_table_b210" << std::endl; // Bell Labs info +#endif + } else { + openair0_cfg[0].rx_gain_calib_table = calib_table_b210_38; + bw_gain_adjust=1; +#if defined(USRP_REC_PLAY) + std::cerr << "-- Using calibration table: calib_table_b210_38" << std::endl; // Bell Labs info +#endif + } + + switch ((int)openair0_cfg[0].sample_rate) { + case 30720000: + s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 115; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + case 23040000: + s->usrp->set_master_clock_rate(23.04e6); //to be checked + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 113; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + case 15360000: + s->usrp->set_master_clock_rate(30.72e06); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 103; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + case 7680000: + s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 80; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + case 1920000: + s->usrp->set_master_clock_rate(30.72e6); + //openair0_cfg[0].samples_per_packet = 1024; + openair0_cfg[0].tx_sample_advance = 40; + openair0_cfg[0].tx_bw = 20e6; + openair0_cfg[0].rx_bw = 20e6; + break; + default: + LOG_E(PHY,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + exit(-1); + break; + } + } + + /* device specific */ + //openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered + //openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered + openair0_cfg[0].iq_txshift = 4;//shift + openair0_cfg[0].iq_rxrescale = 15;//rescale iqs + + for(int i=0; iusrp->get_rx_num_channels(); i++) { + if (iusrp->set_rx_rate(openair0_cfg[0].sample_rate,i); + s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i); + set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust); + + ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i); + // limit to maximum gain + AssertFatal( openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] <= gain_range.stop(), + "RX Gain too high, lower by %f dB\n", + openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop()); + s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i); + LOG_I(PHY,"RX Gain %d %f (%f) => %f (max %f)\n",i, + openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i], + openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop()); + } + } + + for(int i=0; iusrp->get_tx_num_channels(); i++) { + ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i); + if (iusrp->set_tx_rate(openair0_cfg[0].sample_rate,i); + s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i); + s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i); + + LOG_I(PHY,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]); + } + } + + //s->usrp->set_clock_source("external"); + //s->usrp->set_time_source("external"); + + // display USRP settings + LOG_I(PHY,"Actual master clock: %fMHz...\n",s->usrp->get_master_clock_rate()/1e6); + sleep(1); + + // create tx & rx streamer + uhd::stream_args_t stream_args_rx("sc16", "sc16"); + int samples=openair0_cfg[0].sample_rate; + int max=s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps(); + samples/=10000; + LOG_I(PHY,"RF board max packet size %u, size for 100µs jitter %d \n", max, samples); + if ( samples < max ) + stream_args_rx.args["spp"] = str(boost::format("%d") % samples ); + LOG_I(PHY,"rx_max_num_samps %zu\n", + s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps()); + + for (int i = 0; irx_stream = s->usrp->get_rx_stream(stream_args_rx); + + uhd::stream_args_t stream_args_tx("sc16", "sc16"); + for (int i = 0; itx_stream = s->usrp->get_tx_stream(stream_args_tx); + + /* Setting TX/RX BW after streamers are created due to USRP calibration issue */ + for(int i=0; iusrp->get_tx_num_channels() && iusrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i); + + for(int i=0; iusrp->get_rx_num_channels() && iusrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i); + + for (int i=0; iusrp->get_rx_rate(i)/1e6); + LOG_I(PHY," Actual RX frequency: %fGHz...\n", s->usrp->get_rx_freq(i)/1e9); + LOG_I(PHY," Actual RX gain: %f...\n", s->usrp->get_rx_gain(i)); + LOG_I(PHY," Actual RX bandwidth: %fM...\n", s->usrp->get_rx_bandwidth(i)/1e6); + LOG_I(PHY," Actual RX antenna: %s...\n", s->usrp->get_rx_antenna(i).c_str()); + } + + for (int i=0; iusrp->get_tx_rate(i)/1e6); + LOG_I(PHY," Actual TX frequency: %fGHz...\n", s->usrp->get_tx_freq(i)/1e9); + LOG_I(PHY," Actual TX gain: %f...\n", s->usrp->get_tx_gain(i)); + LOG_I(PHY," Actual TX bandwidth: %fM...\n", s->usrp->get_tx_bandwidth(i)/1e6); + LOG_I(PHY," Actual TX antenna: %s...\n", s->usrp->get_tx_antenna(i).c_str()); + } + + LOG_I(PHY,"Device timestamp: %f...\n", s->usrp->get_time_now().get_real_secs()); + + device->priv = s; + device->trx_start_func = trx_usrp_start; + device->trx_write_func = trx_usrp_write; + device->trx_read_func = trx_usrp_read; + device->trx_get_stats_func = trx_usrp_get_stats; + device->trx_reset_stats_func = trx_usrp_reset_stats; + device->trx_end_func = trx_usrp_end; + device->trx_stop_func = trx_usrp_stop; + device->trx_set_freq_func = trx_usrp_set_freq; + device->trx_set_gains_func = trx_usrp_set_gains; + device->openair0_cfg = openair0_cfg; + + s->sample_rate = openair0_cfg[0].sample_rate; + // TODO: + // init tx_forward_nsamps based usrp_time_offset ex + if(is_equal(s->sample_rate, (double)30.72e6)) + s->tx_forward_nsamps = 176; + if(is_equal(s->sample_rate, (double)15.36e6)) + s->tx_forward_nsamps = 90; + if(is_equal(s->sample_rate, (double)7.68e6)) + s->tx_forward_nsamps = 50; + + if (s->use_gps == 1) { + if (sync_to_gps(device)) { + LOG_I(PHY,"USRP fails to sync with GPS...\n"); + exit(0); + } + } - - for (i=0;iusrp->get_rx_rate(i)/1e6) << std::endl; - std::cout << boost::format("Actual RX frequency: %fGHz...") % (s->usrp->get_rx_freq(i)/1e9) << std::endl; - std::cout << boost::format("Actual RX gain: %f...") % (s->usrp->get_rx_gain(i)) << std::endl; - std::cout << boost::format("Actual RX bandwidth: %fM...") % (s->usrp->get_rx_bandwidth(i)/1e6) << std::endl; - std::cout << boost::format("Actual RX antenna: %s...") % (s->usrp->get_rx_antenna(i)) << std::endl; +#if defined(USRP_REC_PLAY) + } +#endif +#if defined(USRP_REC_PLAY) + if (u_sf_mode == 1) { // record mode + ms_sample = (iqrec_t*) malloc(u_sf_max * sizeof(iqrec_t)); + if (ms_sample == NULL) { + std::cerr<< "Memory allocation failed for subframe record or replay mode." << std::endl; + exit(-1); + } + memset(ms_sample, 0, u_sf_max * BELL_LABS_IQ_BYTES_PER_SF); + } + if (u_sf_mode == 2) { + // use mmap + mmapfd = open(u_sf_filename, O_RDONLY | O_LARGEFILE); + if (mmapfd != 0) { + fstat(mmapfd, &sb); + std::cerr << "Loading subframes using mmap() from " << u_sf_filename << " size=" << (uint64_t)sb.st_size << " bytes ..." << std::endl; + ms_sample = (iqrec_t*) mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, mmapfd, 0); + if (ms_sample != MAP_FAILED) { + nb_samples = (sb.st_size / sizeof(iqrec_t)); + int aligned = (((unsigned long)ms_sample & 31) == 0)? 1:0; + std::cerr<< "Loaded "<< nb_samples << " subframes." << std::endl; + if (aligned == 0) { + std::cerr<< "mmap address is not 32 bytes aligned, exiting." << std::endl; + close(mmapfd); + exit(-1); + } + } else { + std::cerr << "Cannot mmap file, exiting." << std::endl; + close(mmapfd); + exit(-1); + } + } else { + std::cerr << "Cannot open " << u_sf_filename << " , exiting." << std::endl; + exit(-1); + } + } +#endif + return 0; } - } - - for (i=0;iusrp->get_tx_rate(i)/1e6) << std::endl; - std::cout << boost::format("Actual TX frequency: %fGHz...") % (s->usrp->get_tx_freq(i)/1e9) << std::endl; - std::cout << boost::format("Actual TX gain: %f...") % (s->usrp->get_tx_gain(i)) << std::endl; - std::cout << boost::format("Actual TX bandwidth: %fM...") % (s->usrp->get_tx_bandwidth(i)/1e6) << std::endl; - std::cout << boost::format("Actual TX antenna: %s...") % (s->usrp->get_tx_antenna(i)) << std::endl; - } - } - - std::cout << boost::format("Device timestamp: %f...") % (s->usrp->get_time_now().get_real_secs()) << std::endl; - - device->priv = s; - device->trx_start_func = trx_usrp_start; - device->trx_write_func = trx_usrp_write; - device->trx_read_func = trx_usrp_read; - device->trx_get_stats_func = trx_usrp_get_stats; - device->trx_reset_stats_func = trx_usrp_reset_stats; - device->trx_end_func = trx_usrp_end; - device->trx_stop_func = trx_usrp_stop; - device->trx_set_freq_func = trx_usrp_set_freq; - device->trx_set_gains_func = trx_usrp_set_gains; - - s->sample_rate = openair0_cfg[0].sample_rate; - // TODO: - // init tx_forward_nsamps based usrp_time_offset ex - if(is_equal(s->sample_rate, (double)30.72e6)) - s->tx_forward_nsamps = 176; - if(is_equal(s->sample_rate, (double)15.36e6)) - s->tx_forward_nsamps = 90; - if(is_equal(s->sample_rate, (double)7.68e6)) - s->tx_forward_nsamps = 50; - return 0; - } } /*@}*/ diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.h b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.h new file mode 100644 index 0000000000..47ba171f1b --- /dev/null +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.h @@ -0,0 +1,89 @@ +#ifndef __USRP_LIB_H +#define __USRP_LIB_H +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/** usrp_lib.h + * + * \author: bruno.mongazon-cazavet@nokia-bell-labs.com + */ + +#if defined (USRP_REC_PLAY) + +#include +#include +#include +#include +#include "common/config/config_paramdesc.h" +#include "common/config/config_userapi.h" + +#define BELL_LABS_IQ_HEADER 0xabababababababab +#define BELL_LABS_IQ_PER_SF 7680 // Up to 5MHz bw for now +#define BELL_LABS_IQ_BYTES_PER_SF (BELL_LABS_IQ_PER_SF * 4) +typedef struct { + int64_t header; + int64_t ts; + int64_t rfu1; + int64_t rfu2; // pad for 256 bits alignement required by AVX2 + unsigned char samples[BELL_LABS_IQ_BYTES_PER_SF]; // iq's for one subframe +} iqrec_t; +#define DEF_NB_SF 120000 // default nb of sf or ms to capture (2 minutes at 5MHz) +#define DEF_SF_FILE "/home/nokia/iqfile" // default subframes file name +#define DEF_SF_DELAY_READ 400 // default read delay µs (860=real) +#define DEF_SF_DELAY_WRITE 15 // default write delay µs (15=real) +#define DEF_SF_NB_LOOP 5 // default nb loops + + +/* help strings definition for command line options, used in CMDLINE_XXX_DESC macros and printed when -h option is used */ +#define CONFIG_HLP_SF_FILE "Path of the file used for subframes record or replay" +#define CONFIG_HLP_SF_REC "Record subframes from USRP driver into a file for later replay" +#define CONFIG_HLP_SF_REP "Replay subframes into USRP driver from a file" +#define CONFIG_HLP_SF_MAX "Maximum count of subframes to be recorded in subframe file" +#define CONFIG_HLP_SF_LOOPS "Number of loops to replay of the entire subframes file" +#define CONFIG_HLP_SF_RDELAY "Delay in microseconds to read a subframe in replay mode" +#define CONFIG_HLP_SF_WDELAY "Delay in microseconds to write a subframe in replay mode" + +/* keyword strings for command line options, used in CMDLINE_XXX_DESC macros and printed when -h option is used */ +#define CONFIG_OPT_SF_FILE "subframes-file" +#define CONFIG_OPT_SF_REC "subframes-record" +#define CONFIG_OPT_SF_REP "subframes-replay" +#define CONFIG_OPT_SF_MAX "subframes-max" +#define CONFIG_OPT_SF_LOOPS "subframes-loops" +#define CONFIG_OPT_SF_RDELAY "subframes-read-delay" +#define CONFIG_OPT_SF_WDELAY "subframes-write-delay" + +/* For information only - the macro is not usable in C++ */ +/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* command line parameters for USRP record/playback */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define USRP_RECPLAY_PARAMS_DESC { \ +{"subframes-file", CONFIG_HLP_SF_FILE, 0, strptr:(char **)&u_sf_filename, defstrval:DEF_SF_FILE, TYPE_STRING, sizeof(u_sf_filename)}, \ +{"subframes-record", CONFIG_HLP_SF_REC, PARAMFLAG_BOOL, uptr:&u_sf_record, defuintval:0, TYPE_UINT, 0}, \ +{"subframes-replay", CONFIG_HLP_SF_REP, PARAMFLAG_BOOL, uptr:&u_sf_replay, defuintval:0, TYPE_UINT, 0}, \ +{"subframes-max", CONFIG_HLP_SF_MAX, 0, uptr:&u_sf_max, defintval:DEF_NB_SF, TYPE_UINT, 0}, \ +{"subframes-loops", CONFIG_HLP_SF_LOOPS, 0, uptr:&u_sf_loops, defintval:DEF_SF_NB_LOOP, TYPE_UINT, 0}, \ +{"subframes-read-delay", CONFIG_HLP_SF_RDELAY, 0, uptr:&u_sf_read_delay, defintval:DEF_SF_DELAY_READ, TYPE_UINT, 0}, \ +{"subframes-write-delay", CONFIG_HLP_SF_WDELAY, 0, uptr:&u_sf_write_delay, defintval:DEF_SF_DELAY_WRITE, TYPE_UINT, 0}, \ +} +#endif // BELL_LABS_MUST +#endif // __USRP_LIB_H + diff --git a/targets/ARCH/mobipass/interface.c b/targets/ARCH/mobipass/interface.c new file mode 100644 index 0000000000..db186a404c --- /dev/null +++ b/targets/ARCH/mobipass/interface.c @@ -0,0 +1,210 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common_lib.h" +#include "ethernet_lib.h" + +#include "mobipass.h" +#include "queues.h" + +struct mobipass_header { + uint16_t flags; + uint16_t fifo_status; + unsigned char seqno; + unsigned char ack; + uint32_t word0; + uint32_t timestamp; +} __attribute__((__packed__)); + +int mobipass_start(openair0_device *device) { init_mobipass(device->priv); return 0; } +int mobipass_request(openair0_device *device, void *msg, ssize_t msg_len) { abort(); return 0; } +int mobipass_reply(openair0_device *device, void *msg, ssize_t msg_len) { abort(); return 0; } +int mobipass_get_stats(openair0_device* device) { return 0; } +int mobipass_reset_stats(openair0_device* device) { return 0; } +void mobipass_end(openair0_device *device) {} +int mobipass_stop(openair0_device *device) { return 0; } +int mobipass_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) { return 0; } +int mobipass_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { return 0; } + +int mobipass_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + mobipass_state_t *mobi = device->priv; + struct mobipass_header *mh = (struct mobipass_header *)(((char *)buff[0]) + 14); + mobi->mobipass_write_last_timestamp += 640; + mobi->mobipass_write_last_timestamp %= mobi->samples_per_1024_frames; + mh->timestamp = htonl(ntohl(mh->timestamp) % mobi->samples_per_1024_frames); + if (mobi->mobipass_write_last_timestamp != ntohl(mh->timestamp)) + { printf("mobipass: ERROR: bad timestamp wanted %d got %d\n", mobi->mobipass_write_last_timestamp, ntohl(mh->timestamp)); exit(1); } +//printf("__write nsamps %d timestamps %ld seqno %d (packet timestamp %d)\n", nsamps, timestamp, mh->seqno, ntohl(mh->timestamp)); + if (nsamps != 640) abort(); + enqueue_to_mobipass(mobi->qstate, buff[0]); + return nsamps; +} + +int mobipass_read(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + mobipass_state_t *mobi = device->priv; +//printf("__read nsamps %d return timestamp %d\n", nsamps, ts); + *timestamp = htonl(mobi->mobipass_read_ts); + mobi->mobipass_read_ts += nsamps; + mobi->mobipass_read_ts %= mobi->samples_per_1024_frames; + if (nsamps != 640) { printf("mobipass: ERROR: bad nsamps %d, should be 640\n", nsamps); fflush(stdout); abort(); } + + dequeue_from_mobipass(mobi->qstate, ntohl(*timestamp), buff[0]); + +#if 1 + struct mobipass_header *mh = (struct mobipass_header *)(((char *)buff[0]) + 14); + mh->flags = 0; + mh->fifo_status = 0; + mh->seqno = mobi->mobipass_read_seqno++; + mh->ack = 0; + mh->word0 = 0; + mh->timestamp = htonl(mobi->mobipass_read_ts); +#endif + + return nsamps; +} + +/* this is the only function in the library that is visible from outside + * because in CMakeLists.txt we use -fvisibility=hidden + */ +__attribute__((__visibility__("default"))) +int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, + eth_params_t * eth_params ) +{ + //init_mobipass(); + + mobipass_state_t *mobi = (mobipass_state_t*)malloc(sizeof(mobipass_state_t)); + memset(mobi, 0, sizeof(mobipass_state_t)); + + if (eth_params->transp_preference != 4) goto err; + if (eth_params->if_compress != 0) goto err; + + /* only 50 PRBs handled for the moment */ + if (openair0_cfg[0].sample_rate != 15360000) { + printf("mobipass: ERROR: only 50 PRBs supported\n"); + exit(1); + } + + mobi->eth.flags = ETH_RAW_IF5_MOBIPASS; + mobi->eth.compression = NO_COMPRESS; + device->Mod_id = 0;//num_devices_eth++; + device->transp_type = ETHERNET_TP; + + device->trx_start_func = mobipass_start; + device->trx_request_func = mobipass_request; + device->trx_reply_func = mobipass_reply; + device->trx_get_stats_func = mobipass_get_stats; + device->trx_reset_stats_func = mobipass_reset_stats; + device->trx_end_func = mobipass_end; + device->trx_stop_func = mobipass_stop; + device->trx_set_freq_func = mobipass_set_freq; + device->trx_set_gains_func = mobipass_set_gains; + device->trx_write_func = mobipass_write; + device->trx_read_func = mobipass_read; + + device->priv = mobi; + + mobi->eth.if_name = strdup(eth_params->local_if_name); + if (mobi->eth.if_name == NULL) abort(); + + if (sscanf(eth_params->my_addr, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", + &mobi->eth_local[0], + &mobi->eth_local[1], + &mobi->eth_local[2], + &mobi->eth_local[3], + &mobi->eth_local[4], + &mobi->eth_local[5]) != 6) { + printf("mobipass: ERROR: bad local ethernet address '%s', check configuration file\n", + eth_params->my_addr); + exit(1); + } + + if (sscanf(eth_params->remote_addr, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", + &mobi->eth_remote[0], + &mobi->eth_remote[1], + &mobi->eth_remote[2], + &mobi->eth_remote[3], + &mobi->eth_remote[4], + &mobi->eth_remote[5]) != 6) { + printf("mobipass: ERROR: bad remote ethernet address '%s', check configuration file\n", + eth_params->remote_addr); + exit(1); + } + + /* note: this only works for 50 PRBs */ + mobi->samples_per_1024_frames = 7680*2*10*1024; + + /* TX starts at subframe 4, let's pretend we are at the right position */ + /* note: this only works for 50 PRBs */ + mobi->mobipass_write_last_timestamp = 4*7680*2-640; + + /* device specific */ + openair0_cfg[0].iq_rxrescale = 15;//rescale iqs + openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift + openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance; + + /* this is useless, I think */ + if (device->host_type == BBU_HOST) { + /*Note scheduling advance values valid only for case 7680000 */ + switch ((int)openair0_cfg[0].sample_rate) { + case 30720000: + openair0_cfg[0].samples_per_packet = 3840; + break; + case 23040000: + openair0_cfg[0].samples_per_packet = 2880; + break; + case 15360000: + openair0_cfg[0].samples_per_packet = 1920; + break; + case 7680000: + openair0_cfg[0].samples_per_packet = 960; + break; + case 1920000: + openair0_cfg[0].samples_per_packet = 240; + break; + default: + printf("mobipass: ERROR: unknown sampling rate %f\n",openair0_cfg[0].sample_rate); + exit(-1); + break; + } + } + + device->openair0_cfg=&openair0_cfg[0]; + + return 0; + +err: + printf("mobipass: ERROR: bad configuration file?\n"); + exit(1); +} diff --git a/targets/ARCH/mobipass/mobipass.c b/targets/ARCH/mobipass/mobipass.c new file mode 100644 index 0000000000..2a91068788 --- /dev/null +++ b/targets/ARCH/mobipass/mobipass.c @@ -0,0 +1,221 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "queues.h" +#include "mobipass.h" + +/******************************************************************/ +/* time begin */ +/******************************************************************/ + +#include + +static void init_time(mobipass_state_t *mobi) +{ + struct timespec now; + if (clock_gettime(CLOCK_MONOTONIC_RAW, &now)) abort(); + mobi->t0 = (uint64_t)now.tv_sec * (uint64_t)1000000000 + (uint64_t)now.tv_nsec; +} + +/* called before sending data to mobipass + * waits if called too early with respect to system clock + * does not wait more than 1ms in any case + */ +static void synch_time(mobipass_state_t *mobi, uint32_t ts) +{ + if (ts < mobi->synch_time_last_ts) mobi->synch_time_mega_ts++; + mobi->synch_time_last_ts = ts; + + struct timespec now; + if (clock_gettime(CLOCK_MONOTONIC_RAW, &now)) abort(); + + uint64_t tnow; + tnow = (uint64_t)now.tv_sec * (uint64_t)1000000000 + (uint64_t)now.tv_nsec; + + uint64_t cur = tnow - mobi->t0; + + /* 15360000 samples/second, in nanoseconds: + * = 15360000 / 1000000000 = 1536 / 100000 = 48 / 3125*/ + + uint64_t ts_ns = ((uint64_t)ts + mobi->synch_time_mega_ts * (uint64_t)mobi->samples_per_1024_frames) * (uint64_t)3125 / (uint64_t)48; + + /* TODO: if cur is way higher than ts_ns, we are very late, log something? */ + if (cur >= ts_ns) return; + + uint64_t delta = ts_ns - cur; + /* don't sleep more than 1 ms */ + if (delta > 1000*1000) delta = 1000*1000; + delta = delta/1000; + if (delta) usleep(delta); +} + +/******************************************************************/ +/* time end */ +/******************************************************************/ + +struct ethernet_header { + unsigned char dst[6]; + unsigned char src[6]; + uint16_t packet_type; +} __attribute__((__packed__)); + +struct mobipass_header { + uint16_t flags; + uint16_t fifo_status; + unsigned char seqno; + unsigned char ack; + uint32_t word0; + uint32_t timestamp; +} __attribute__((__packed__)); + +static void do_receive(mobipass_state_t *mobi, unsigned char *b) +{ + if (recv(mobi->sock, b, 14+14+1280, 0) != 14+14+1280) { perror("recv"); exit(1); } + struct mobipass_header *mh = (struct mobipass_header *)(b+14); + mh->timestamp = htonl((ntohl(mh->timestamp)-45378/*40120*/) % mobi->samples_per_1024_frames); +//printf("recv timestamp %u\n", ntohl(mh->timestamp)); +} + +/* receiver thread */ +static void *receiver(void *_mobi) +{ + mobipass_state_t *mobi = _mobi; + unsigned char receive_packet[14 + 14 + 1280]; + while (1) { + do_receive(mobi, receive_packet); + enqueue_from_mobipass(mobi->qstate, receive_packet); + } + return 0; +} + +static void do_send(mobipass_state_t *mobi, int seqno, uint32_t ts, + unsigned char *packet) +{ + struct ethernet_header *eh = (struct ethernet_header *)packet; + struct mobipass_header *mh = (struct mobipass_header *)(packet+14); + + ts %= mobi->samples_per_1024_frames; +//printf("SEND seqno %d ts %d\n", seqno, ts); + + memcpy(eh->dst, mobi->eth_remote, 6); + memcpy(eh->src, mobi->eth_local, 6); + + eh->packet_type = htons(0xbffe); + + mh->flags = 0; + mh->fifo_status = 0; + mh->seqno = seqno; + mh->ack = 0; + mh->word0 = 0; + mh->timestamp = htonl(ts); + + synch_time(mobi, ts); + + if (send(mobi->sock, packet, 14+14+1280, 0) != 14+14+1280) { perror("send"); exit(1); } +} + +/* sender thread */ +static void *sender(void *_mobi) +{ + mobipass_state_t *mobi = _mobi; + unsigned char packet[14 + 14 + 1280]; + uint32_t ts = 0; + unsigned char seqno = 0; + while (1) { + dequeue_to_mobipass(mobi->qstate, ts, packet); + do_send(mobi, seqno, ts, packet); + seqno++; + ts += 640; + ts %= mobi->samples_per_1024_frames; + } + return 0; +} + +static void new_thread(void *(*f)(void *), void *data) +{ + pthread_t t; + pthread_attr_t att; + + if (pthread_attr_init(&att)) + { fprintf(stderr, "pthread_attr_init err\n"); exit(1); } + if (pthread_attr_setdetachstate(&att, PTHREAD_CREATE_DETACHED)) + { fprintf(stderr, "pthread_attr_setdetachstate err\n"); exit(1); } + if (pthread_attr_setstacksize(&att, 10000000)) + { fprintf(stderr, "pthread_attr_setstacksize err\n"); exit(1); } + if (pthread_create(&t, &att, f, data)) + { fprintf(stderr, "pthread_create err\n"); exit(1); } + if (pthread_attr_destroy(&att)) + { fprintf(stderr, "pthread_attr_destroy err\n"); exit(1); } +} + +void init_mobipass(mobipass_state_t *mobi) +{ + int i; + unsigned char data[14+14+640]; + memset(data, 0, 14+14+640); + + init_time(mobi); + + mobi->qstate = init_queues(mobi->samples_per_1024_frames); + + for (i = 0; i < 24*4; i++) { + uint32_t timestamp = i*640; + unsigned char seqno = i; + struct mobipass_header *mh = (struct mobipass_header *)(data+14); + mh->seqno = seqno; + mh->timestamp = htonl(timestamp); + enqueue_to_mobipass(mobi->qstate, data); + } + + mobi->sock = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW); + if (mobi->sock == -1) { perror("socket"); exit(1); } + + /* get if index */ + struct ifreq if_index; + memset(&if_index, 0, sizeof(struct ifreq)); + strcpy(if_index.ifr_name, mobi->eth.if_name); + if (ioctl(mobi->sock, SIOCGIFINDEX, &if_index)<0) {perror("SIOCGIFINDEX");exit(1);} + + struct sockaddr_ll local_addr; + local_addr.sll_family = AF_PACKET; + local_addr.sll_ifindex = if_index.ifr_ifindex; + local_addr.sll_protocol = htons(0xbffe); + local_addr.sll_halen = ETH_ALEN; + local_addr.sll_pkttype = PACKET_OTHERHOST; + + if (bind(mobi->sock, (struct sockaddr *)&local_addr, sizeof(struct sockaddr_ll))<0) + { perror("bind"); exit(1); } + + new_thread(receiver, mobi); + new_thread(sender, mobi); +} diff --git a/targets/ARCH/mobipass/mobipass.h b/targets/ARCH/mobipass/mobipass.h new file mode 100644 index 0000000000..2210824c13 --- /dev/null +++ b/targets/ARCH/mobipass/mobipass.h @@ -0,0 +1,59 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#ifndef _MOBIPASS_H_ +#define _MOBIPASS_H_ + +#include +#include "ethernet_lib.h" + +typedef struct { + /* this has to come first */ + eth_state_t eth; + + void *qstate; + + uint8_t eth_local[6]; + uint8_t eth_remote[6]; + + int samples_per_1024_frames; + + /* variables used by the function interface.c:mobipass_read */ + uint32_t mobipass_read_ts; + unsigned char mobipass_read_seqno; + + /* variables used by the function interface.c:mobipass_write */ + uint32_t mobipass_write_last_timestamp; + + /* variables used by the function mobipass.c:[init_time|synch_time] */ + uint64_t t0; + + /* variables used by the function mobipass.c:synch_time */ + uint32_t synch_time_last_ts; + uint64_t synch_time_mega_ts; + + /* sock is used in mobipass.c */ + int sock; +} mobipass_state_t; + +void init_mobipass(mobipass_state_t *mobi); + +#endif /* _MOBIPASS_H_ */ diff --git a/targets/ARCH/mobipass/queues.c b/targets/ARCH/mobipass/queues.c new file mode 100644 index 0000000000..27c9917084 --- /dev/null +++ b/targets/ARCH/mobipass/queues.c @@ -0,0 +1,302 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#include "queues.h" +#include "mobipass.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#define QSIZE 10000 + +struct mobipass_header { + uint16_t flags; + uint16_t fifo_status; + unsigned char seqno; + unsigned char ack; + uint32_t word0; + uint32_t timestamp; +} __attribute__((__packed__)); + +struct queue { + unsigned char buf[QSIZE][14+14+640*2]; + volatile int start; + volatile int len; + pthread_mutex_t mutex; + pthread_cond_t cond; +}; + +typedef struct { + struct queue to_mobipass; + struct queue from_mobipass; + int samples_per_1024_frames; + + /* variables used by dequeue_from_mobipass */ + int dequeue_from_mobipass_seqno; + + /* variables used to manage logging of "missing samples" + * coming from mobipass. (Yes, this can happen, mostly + * at startup.) + * This idea is to print some logs, but not too much to + * flood stdout. (This is already a bad idea to call + * printf in a 'realtime' thread.) + */ + int no_sample_log_running; + uint32_t no_sample_log_start_sample; + uint32_t no_sample_log_next_sample; +} queue_state_t; + +static void enqueue(void *data, struct queue *q) +{ + int pos; + + if (pthread_mutex_lock(&q->mutex)) abort(); + if (q->len == QSIZE) { + printf("mobipass: WARNING: enqueue: full\n"); + goto done; + } + + pos = (q->start + q->len) % QSIZE; + memcpy(q->buf[pos], data, 14+14+640*2); + q->len++; + +done: + if (pthread_cond_signal(&q->cond)) abort(); + if (pthread_mutex_unlock(&q->mutex)) abort(); +} + +void enqueue_to_mobipass(void *_qstate, void *data) +{ + queue_state_t *qstate = _qstate; + enqueue(data, &qstate->to_mobipass); +} + +void dequeue_to_mobipass(void *_qstate, uint32_t timestamp, void *data) +{ + queue_state_t *qstate = _qstate; + if (pthread_mutex_lock(&qstate->to_mobipass.mutex)) abort(); + while (qstate->to_mobipass.len == 0) { + if (pthread_cond_wait(&qstate->to_mobipass.cond, &qstate->to_mobipass.mutex)) abort(); + } + + memcpy(data, qstate->to_mobipass.buf[qstate->to_mobipass.start], 14+14+640*2); + qstate->to_mobipass.len--; + qstate->to_mobipass.start = (qstate->to_mobipass.start + 1) % QSIZE; + + if (pthread_mutex_unlock(&qstate->to_mobipass.mutex)) abort(); +} + +void enqueue_from_mobipass(void *_qstate, void *data) +{ + queue_state_t *qstate = _qstate; + struct mobipass_header *mh = (struct mobipass_header *)((char*)data+14); + mh->timestamp = htonl(ntohl(mh->timestamp) % qstate->samples_per_1024_frames); +//printf("from mobipass! timestamp %u seqno %d\n", ntohl(mh->timestamp), mh->seqno); + enqueue(data, &qstate->from_mobipass); +} + +static int cmp_timestamps(uint32_t a, uint32_t b, int samples_per_1024_frames) +{ + if (a == b) return 0; + if (a < b) { + if (b-a > samples_per_1024_frames/2) return 1; + return -1; + } + if (a-b > samples_per_1024_frames/2) return -1; + return 1; +} + +/*************************************************/ +/* missing samples logging management begin */ +/*************************************************/ + +static void log_flush(queue_state_t *qstate) +{ + /* print now if there is something to print */ + if (qstate->no_sample_log_running == 0) + return; + qstate->no_sample_log_running = 0; + printf("mobipass: WARNING: missing samples [%u-%u]\n", + qstate->no_sample_log_start_sample, + (uint32_t)(qstate->no_sample_log_next_sample-1)); +} + +static void log_missed_sample(queue_state_t *qstate, uint32_t timestamp) +{ + /* collect data, print if there is a discontinuity */ + if (qstate->no_sample_log_running == 0 || + timestamp != qstate->no_sample_log_next_sample) { + log_flush(qstate); + qstate->no_sample_log_start_sample = timestamp; + } + + qstate->no_sample_log_next_sample = timestamp+1; + qstate->no_sample_log_running = 1; +} + +static void log_flush_if_old(queue_state_t *qstate, uint32_t timestamp) +{ + /* log every second (more or less), if we have to */ + /* note that if mobipass stopped, it may take much more + * than one second to log, due to the sleeps done while + * waiting for samples (that never come) + */ + if (qstate->no_sample_log_running == 1 && + labs(timestamp-qstate->no_sample_log_start_sample) > qstate->samples_per_1024_frames/10) + log_flush(qstate); +} + +/*************************************************/ +/* missing samples logging management end */ +/*************************************************/ + +/* to be called with lock on */ +static void get_sample_from_mobipass(queue_state_t *qstate, char *I, char *Q, uint32_t timestamp) +{ + unsigned char *b = NULL; + unsigned char *data = NULL; + struct mobipass_header *mh = NULL; + uint32_t packet_timestamp = 0; + +#if 0 +uint32_t old_start = qstate->from_mobipass.start; +uint32_t old_len = qstate->from_mobipass.len; +b = qstate->from_mobipass.buf[qstate->from_mobipass.start]; +mh = (struct mobipass_header *)(b+14); +uint32_t old_pts = qstate->from_mobipass.len ? ntohl(mh->timestamp) : -1; +b=NULL; +mh=NULL; +#endif + + while (qstate->from_mobipass.len) { + b = qstate->from_mobipass.buf[qstate->from_mobipass.start]; + mh = (struct mobipass_header *)(b+14); + data = b + 14*2; + packet_timestamp = ntohl(mh->timestamp); + if (cmp_timestamps(timestamp, packet_timestamp, qstate->samples_per_1024_frames) < 0) goto nodata; + if (cmp_timestamps(timestamp, (packet_timestamp+640) % qstate->samples_per_1024_frames, qstate->samples_per_1024_frames) < 0) break; + qstate->from_mobipass.len--; + qstate->from_mobipass.start = (qstate->from_mobipass.start+1) % QSIZE; + } + + if (qstate->from_mobipass.len == 0) goto nodata; + + if (timestamp == (packet_timestamp + 639) % qstate->samples_per_1024_frames) { + qstate->from_mobipass.len--; + qstate->from_mobipass.start = (qstate->from_mobipass.start+1) % QSIZE; + } + + if (timestamp < packet_timestamp) timestamp += qstate->samples_per_1024_frames; + + *I = data[(timestamp - packet_timestamp) * 2]; + *Q = data[(timestamp - packet_timestamp) * 2 + 1]; + + return; + +nodata: + *I = 0; + *Q = 0; + + log_missed_sample(qstate, timestamp); + +#if 0 +printf("no sample timestamp %u pt %u start %d old_start %d old_pt %u len %d old len %d\n", timestamp, packet_timestamp, qstate->from_mobipass.start, old_start, old_pts, qstate->from_mobipass.len, old_len); +#endif +} + +/* doesn't work with delay more than 1s */ +static void wait_for_data(pthread_cond_t *cond, pthread_mutex_t *mutex, int delay_us) +{ + struct timeval now; + struct timespec target; + gettimeofday(&now, NULL); + target.tv_sec = now.tv_sec; + target.tv_nsec = (now.tv_usec + delay_us) * 1000; + if (target.tv_nsec >= 1000 * 1000 * 1000) { target.tv_nsec -= 1000 * 1000 * 1000; target.tv_sec++; } + int err = pthread_cond_timedwait(cond, mutex, &target); + if (err != 0 && err != ETIMEDOUT) { printf("mobipass: ERROR: pthread_cond_timedwait: err (%d) %s\n", err, strerror(err)); abort(); } +} + +/* don't block infinitely when waiting for data + * if waiting for too long, just return some zeros + */ +void dequeue_from_mobipass(void *_qstate, uint32_t timestamp, void *data) +{ + queue_state_t *qstate = _qstate; + int i; +// int ts = timestamp; + int waiting_allowed; + + if (pthread_mutex_lock(&qstate->from_mobipass.mutex)) abort(); + + if (qstate->from_mobipass.len == 0) { +//printf("sleep 1\n"); + wait_for_data(&qstate->from_mobipass.cond, &qstate->from_mobipass.mutex, 2000); //1000/3); + } + + waiting_allowed = qstate->from_mobipass.len != 0; + + for (i = 0; i < 640*2; i+=2) { + if (qstate->from_mobipass.len == 0 && waiting_allowed) { +//printf("sleep 2\n"); + wait_for_data(&qstate->from_mobipass.cond, &qstate->from_mobipass.mutex, 2000); //1000/3); + waiting_allowed = qstate->from_mobipass.len != 0; + } + + get_sample_from_mobipass(qstate, (char*)data + 14*2 + i, (char*)data + 14*2 + i+1, timestamp % qstate->samples_per_1024_frames); + timestamp++; + } + + log_flush_if_old(qstate, timestamp); + + if (pthread_mutex_unlock(&qstate->from_mobipass.mutex)) abort(); + + struct mobipass_header *mh = (struct mobipass_header *)(((char *)data) + 14); + mh->flags = 0; + mh->fifo_status = 0; + mh->seqno = qstate->dequeue_from_mobipass_seqno++; + mh->ack = 0; + mh->word0 = 0; + mh->timestamp = htonl(timestamp); +} + +void *init_queues(int samples_per_1024_frames) +{ + queue_state_t *q; + q = malloc(sizeof(queue_state_t)); + if (q == NULL) abort(); + memset(q, 0, sizeof(queue_state_t)); + + if (pthread_mutex_init(&q->to_mobipass.mutex, NULL)) abort(); + if (pthread_mutex_init(&q->from_mobipass.mutex, NULL)) abort(); + if (pthread_cond_init(&q->to_mobipass.cond, NULL)) abort(); + if (pthread_cond_init(&q->from_mobipass.cond, NULL)) abort(); + + q->samples_per_1024_frames = samples_per_1024_frames; + + return q; +} diff --git a/targets/ARCH/mobipass/queues.h b/targets/ARCH/mobipass/queues.h new file mode 100644 index 0000000000..e47a622730 --- /dev/null +++ b/targets/ARCH/mobipass/queues.h @@ -0,0 +1,36 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#ifndef _QUEUES_H_ +#define _QUEUES_H_ + +#include + +void enqueue_to_mobipass(void *qstate, void *data); +void dequeue_to_mobipass(void *qstate, uint32_t timestamp, void *data); + +void enqueue_from_mobipass(void *qstate, void *receive_packet); +void dequeue_from_mobipass(void *qstate, uint32_t timestamp, void *data); + +/* returns a queue state type, as opaque data structure */ +void *init_queues(int samples_per_1024_frames); + +#endif /* _QUEUES_H_ */ diff --git a/targets/ARCH/tcp_bridge/README b/targets/ARCH/tcp_bridge/README new file mode 100644 index 0000000000..9bd1a16e59 --- /dev/null +++ b/targets/ARCH/tcp_bridge/README @@ -0,0 +1,4 @@ +This is sort of a "TCP driver" to ease debugging. This is mostly internal +to EURECOM. You probably don't want to use it. + +Same license as the rest. diff --git a/targets/ARCH/tcp_bridge/tcp_bridge.c b/targets/ARCH/tcp_bridge/tcp_bridge.c new file mode 100644 index 0000000000..127ba39bbc --- /dev/null +++ b/targets/ARCH/tcp_bridge/tcp_bridge.c @@ -0,0 +1,292 @@ +#include +#include +#include +#include +#include +#include +#include + +int fullread(int fd, void *_buf, int count) +{ + char *buf = _buf; + int ret = 0; + int l; + while (count) { + l = read(fd, buf, count); + if (l <= 0) return -1; + count -= l; + buf += l; + ret += l; + } + return ret; +} + +int fullwrite(int fd, void *_buf, int count) +{ + char *buf = _buf; + int ret = 0; + int l; + while (count) { + l = write(fd, buf, count); + if (l <= 0) return -1; + count -= l; + buf += l; + ret += l; + } + return ret; +} + +#include "common_lib.h" + +typedef struct { + int32_t data[30720]; /* max 20MHz */ + unsigned long timestamp; + int size; +} input_buffer; + +#define BSIZE 16 + +typedef struct { + int sock; + int samples_per_subframe; + input_buffer b[BSIZE]; + int bstart; + int blen; + unsigned long read_timestamp; +} tcp_bridge_state_t; + + +/****************************************************************************/ +/* buffer management */ +/* (could be simpler, we are synchronous) */ +/* maybe we should lock */ +/****************************************************************************/ + +void put_buffer(tcp_bridge_state_t *t, void *data, int size, unsigned long timestamp) +{ + int nextpos; + if (t->blen == BSIZE) { printf("tcp_bridge: buffer full\n"); exit(1); } + if (size > 30720*4) abort(); + if (t->blen) { + int lastpos = (t->bstart+t->blen-1) % BSIZE; + if (timestamp != t->b[lastpos].timestamp + t->samples_per_subframe) + { printf("tcp_bridge: discontinuity\n"); exit(1); } + } + nextpos = (t->bstart+t->blen) % BSIZE; + t->b[nextpos].timestamp = timestamp; + t->b[nextpos].size = size; + memcpy(t->b[nextpos].data, data, size); + t->blen++; +} + +void get_buffer(tcp_bridge_state_t *t, void *data, int size, unsigned long timestamp) +{ + int pos; + if (t->blen == 0) { printf("tcp_bridge: buffer empty\n"); exit(1); } + if (size >30720*4) abort(); + pos = t->bstart; + if (size != t->b[pos].size) { printf("tcp_bridge: bad size\n"); exit(1); } + memcpy(data, t->b[pos].data, size); + t->bstart = (t->bstart + 1) % BSIZE; + t->blen--; +} + +/****************************************************************************/ +/* end of buffer management */ +/****************************************************************************/ + + +/****************************************************************************/ +/* network management (read/write) */ +/****************************************************************************/ + +void read_data_from_network(int sock, input_buffer *b) +{ + if (fullread(sock, &b->timestamp, sizeof(b->timestamp)) != sizeof(b->timestamp)) goto err; + if (fullread(sock, &b->size, sizeof(b->size)) != sizeof(b->size)) goto err; + if (fullread(sock, b->data, b->size) != b->size) goto err; + return; + +err: + printf("tcp_bridge: read_data_from_network fails\n"); + exit(1); +} + +void write_data_to_network(int sock, input_buffer *b) +{ + if (fullwrite(sock, &b->timestamp, sizeof(b->timestamp)) != sizeof(b->timestamp)) goto err; + if (fullwrite(sock, &b->size, sizeof(b->size)) != sizeof(b->size)) goto err; + if (fullwrite(sock, b->data, b->size) != b->size) goto err; + return; + +err: + printf("tcp_bridge: write_data_to_network fails\n"); + exit(1); +} + +/****************************************************************************/ +/* end of network management */ +/****************************************************************************/ + + +int tcp_bridge_start(openair0_device *device) +{ + int i; + int port = 4042; + tcp_bridge_state_t *tcp_bridge = device->priv; + + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) { perror("tcp_bridge: socket"); exit(1); } + + int enable = 1; + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int))) + { perror("tcp_bridge: SO_REUSEADDR"); exit(1); } + + struct sockaddr_in addr = { + sin_family: AF_INET, + sin_port: htons(port), + sin_addr: { s_addr: INADDR_ANY } + }; + + if (bind(sock, (struct sockaddr *)&addr, sizeof(addr))) + { perror("tcp_bridge: bind"); exit(1); } + + if (listen(sock, 5)) + { perror("tcp_bridge: listen"); exit(1); } + + printf("tcp_bridge: wait for connection on port %d\n", port); + + socklen_t len = sizeof(addr); + int sock2 = accept(sock, (struct sockaddr *)&addr, &len); + if (sock2 == -1) + { perror("tcp_bridge: accept"); exit(1); } + + close(sock); + + tcp_bridge->sock = sock2; + + /* the other end has to send 10 subframes at startup */ + for (i = 0; i < 10; i++) + read_data_from_network(sock2, &tcp_bridge->b[i]); + tcp_bridge->bstart = 0; + tcp_bridge->blen = 10; + + printf("tcp_bridge: connection established\n"); + + return 0; +} + +int tcp_bridge_request(openair0_device *device, void *msg, ssize_t msg_len) { abort(); return 0; } +int tcp_bridge_reply(openair0_device *device, void *msg, ssize_t msg_len) { abort(); return 0; } +int tcp_bridge_get_stats(openair0_device* device) { return 0; } +int tcp_bridge_reset_stats(openair0_device* device) { return 0; } +void tcp_bridge_end(openair0_device *device) {} +int tcp_bridge_stop(openair0_device *device) { return 0; } +int tcp_bridge_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,int exmimo_dump_config) { return 0; } +int tcp_bridge_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) { return 0; } + +int tcp_bridge_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) +{ + tcp_bridge_state_t *t = device->priv; + input_buffer out; + int i; +//printf("write ts %ld nsamps %d\n", timestamp, nsamps); + + if (nsamps > 30720) abort(); + + /* read buffer timestamped with 'timestamp' if not already here */ + for (i = 0; i < t->blen; i++) { + input_buffer *b = &t->b[(t->bstart + i) % BSIZE]; + if (b->timestamp == timestamp) break; + } + if (i == t->blen) { + int nextpos = (t->bstart + t->blen) % BSIZE; + if (t->blen == BSIZE) abort(); + read_data_from_network(t->sock, &t->b[nextpos]); + t->blen++; + if (t->b[nextpos].timestamp != timestamp) abort(); + } + + memcpy(out.data, buff[0], nsamps * 4); + out.timestamp = timestamp; + out.size = nsamps * 4; + write_data_to_network(t->sock, &out); + + return nsamps; +} + +int tcp_bridge_read(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) +{ + tcp_bridge_state_t *t = device->priv; + input_buffer *b; + + if (cc != 1) abort(); + if (t->blen == 0) abort(); + + b = &t->b[t->bstart]; + +#if 0 +typedef struct { + int32_t data[30720]; /* max 20MHz */ + unsigned long timestamp; + int size; +} input_buffer; +#endif + + if (b->timestamp != t->read_timestamp) abort(); + if (b->size != nsamps * 4) abort(); + + *timestamp = b->timestamp; + memcpy(buff[0], b->data, b->size); + + t->read_timestamp += nsamps; + t->bstart = (t->bstart + 1) % BSIZE; + t->blen--; + +static unsigned long ts = 0; +//printf("read ts %ld nsamps %d\n", ts, nsamps); +*timestamp = ts; +ts += nsamps; + + return nsamps; +} + +__attribute__((__visibility__("default"))) +int device_init(openair0_device* device, openair0_config_t *openair0_cfg) +{ + tcp_bridge_state_t *tcp_bridge = (tcp_bridge_state_t*)malloc(sizeof(tcp_bridge_state_t)); + memset(tcp_bridge, 0, sizeof(tcp_bridge_state_t)); + + /* only 25 or 50 PRBs handled for the moment */ + if (openair0_cfg[0].sample_rate != 30720000 && + openair0_cfg[0].sample_rate != 15360000 && + openair0_cfg[0].sample_rate != 7680000) { + printf("tcp_bridge: ERROR: only 25, 50 or 100 PRBs supported\n"); + exit(1); + } + + device->trx_start_func = tcp_bridge_start; + device->trx_get_stats_func = tcp_bridge_get_stats; + device->trx_reset_stats_func = tcp_bridge_reset_stats; + device->trx_end_func = tcp_bridge_end; + device->trx_stop_func = tcp_bridge_stop; + device->trx_set_freq_func = tcp_bridge_set_freq; + device->trx_set_gains_func = tcp_bridge_set_gains; + device->trx_write_func = tcp_bridge_write; + device->trx_read_func = tcp_bridge_read; + + device->priv = tcp_bridge; + + switch ((int)openair0_cfg[0].sample_rate) { + case 30720000: tcp_bridge->samples_per_subframe = 30720; break; + case 15360000: tcp_bridge->samples_per_subframe = 15360; break; + case 7680000: tcp_bridge->samples_per_subframe = 7680; break; + } + + /* let's pretend to be a b2x0 */ + device->type = USRP_B200_DEV; + + device->openair0_cfg=&openair0_cfg[0]; + + return 0; +} diff --git a/targets/COMMON/COPYING b/targets/COMMON/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/COMMON/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/COMMON/MESSAGES/V2/flexsplit.proto b/targets/COMMON/MESSAGES/V2/flexsplit.proto index c4a8b70a4e..526eda0cba 100644 --- a/targets/COMMON/MESSAGES/V2/flexsplit.proto +++ b/targets/COMMON/MESSAGES/V2/flexsplit.proto @@ -3,6 +3,17 @@ package protocol; import "header.proto"; import "flexsplit-messages.proto"; + +message f1u_message{ + optional flexsplit_direction msg_dir = 100; + oneof msg{ + dl_user_data dl_data = 1; + dl_data_delivery_status dl_status = 2; + } +} + + + message flexsplit_message { optional flexsplit_direction msg_dir = 100; oneof msg { @@ -25,7 +36,6 @@ enum flexsplit_direction { } enum flexsplit_err { - option allow_alias = true; // message errors NO_ERR = 0; MSG_DEQUEUING = -1; @@ -83,3 +93,24 @@ message fspPdcpDataIndAck { optional fsp_header header = 1; optional uint32 result = 2; } + +message dl_data_header { + required uint32 fields = 1; +} + +message dl_user_data { + required dl_data_header header = 1; + required bytes pdu = 2; + required uint32 frame = 3; + required uint32 subframe = 4; + required uint32 rnti = 5; +} + + +message dl_data_delivery_status { + required dl_data_header header = 1; + required bytes pdu = 2; + required uint32 frame = 3; + required uint32 subframe = 4; + required uint32 rnti = 5; +} diff --git a/targets/COMMON/MESSAGES/V2/header.proto b/targets/COMMON/MESSAGES/V2/header.proto index 44d52f777c..e68dbd5793 100644 --- a/targets/COMMON/MESSAGES/V2/header.proto +++ b/targets/COMMON/MESSAGES/V2/header.proto @@ -17,3 +17,9 @@ enum fsp_type { FSPT_PDCP_DATA_IND_ACK = 6; } +enum f1u_type { + // Discovery and maintenance messages + F1U_DL_DATA = 0; + F1U_DL_STATUS = 1; +} + diff --git a/targets/COMMON/create_tasks.c b/targets/COMMON/create_tasks.c index 148843dbbc..b911fbc5a4 100644 --- a/targets/COMMON/create_tasks.c +++ b/targets/COMMON/create_tasks.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #if defined(ENABLE_ITTI) # include "intertask_interface.h" @@ -50,7 +42,23 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb) { + LOG_D(ENB_APP, "%s(enb_nb:%d ue_nb:%d)\n", __FUNCTION__, enb_nb, ue_nb); + itti_wait_ready(1); + if (itti_create_task (TASK_L2L1, l2l1_task, NULL) < 0) { + LOG_E(PDCP, "Create task for L2L1 failed\n"); + return -1; + } + + if (enb_nb > 0) { + /* Last task to create, others task must be ready before its start */ + if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) { + LOG_E(ENB_APP, "Create task for eNB APP failed\n"); + return -1; + } + } + + # ifdef OPENAIR2 { # if defined(ENABLE_USE_MME) @@ -79,7 +87,10 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb) # if defined(NAS_BUILT_IN_UE) if (ue_nb > 0) { - if (itti_create_task (TASK_NAS_UE, nas_ue_task, NULL) < 0) { + nas_user_container_t *users = calloc(1, sizeof(*users)); + if (users == NULL) abort(); + users->count = ue_nb; + if (itti_create_task (TASK_NAS_UE, nas_ue_task, users) < 0) { LOG_E(NAS, "Create task for NAS UE failed\n"); return -1; } @@ -89,19 +100,13 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb) # endif if (enb_nb > 0) { + LOG_I(RRC,"Creating RRC eNB Task\n"); + if (itti_create_task (TASK_RRC_ENB, rrc_enb_task, NULL) < 0) { LOG_E(RRC, "Create task for RRC eNB failed\n"); return -1; } -# if ENABLE_RAL - - if (itti_create_task (TASK_RAL_ENB, eRAL_task, NULL) < 0) { - LOG_E(RAL_ENB, "Create task for RAL eNB failed\n"); - return -1; - } - -# endif } if (ue_nb > 0) { @@ -120,20 +125,8 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb) # endif } } -# endif +# endif // openair2: NN: should be openair3 - if (itti_create_task (TASK_L2L1, l2l1_task, NULL) < 0) { - LOG_E(PDCP, "Create task for L2L1 failed\n"); - return -1; - } - - if (enb_nb > 0) { - /* Last task to create, others task must be ready before its start */ - if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) { - LOG_E(ENB_APP, "Create task for eNB APP failed\n"); - return -1; - } - } itti_wait_ready(0); diff --git a/targets/COMMON/create_tasks.h b/targets/COMMON/create_tasks.h index 4e6f5817d8..493c441f59 100644 --- a/targets/COMMON/create_tasks.h +++ b/targets/COMMON/create_tasks.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef CREATE_TASKS_H_ #define CREATE_TASKS_H_ diff --git a/targets/COMMON/create_tasks_ue.c b/targets/COMMON/create_tasks_ue.c new file mode 100644 index 0000000000..269ac9a689 --- /dev/null +++ b/targets/COMMON/create_tasks_ue.c @@ -0,0 +1,81 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#if defined(ENABLE_ITTI) +# include "intertask_interface.h" +# include "create_tasks.h" +# include "log.h" + +# ifdef OPENAIR2 +# if defined(ENABLE_USE_MME) +# include "sctp_eNB_task.h" +# include "s1ap_eNB.h" +# include "nas_ue_task.h" +# include "udp_eNB_task.h" +# include "gtpv1u_eNB_task.h" +# endif +# if ENABLE_RAL +# include "lteRALue.h" +# include "lteRALenb.h" +# endif +# include "RRC/LITE/defs.h" +# endif +# include "enb_app.h" + +int create_tasks_ue(uint32_t ue_nb) +{ + LOG_D(ENB_APP, "%s(ue_nb:%d)\n", __FUNCTION__, ue_nb); + + itti_wait_ready(1); + if (itti_create_task (TASK_L2L1, l2l1_task, NULL) < 0) { + LOG_E(PDCP, "Create task for L2L1 failed\n"); + return -1; + } + +# if defined(ENABLE_USE_MME) +# if defined(NAS_BUILT_IN_UE) + if (ue_nb > 0) { + nas_user_container_t *users = calloc(1, sizeof(*users)); + if (users == NULL) abort(); + users->count = ue_nb; + if (itti_create_task (TASK_NAS_UE, nas_ue_task, users) < 0) { + LOG_E(NAS, "Create task for NAS UE failed\n"); + return -1; + } + } +# endif +# endif + + if (ue_nb > 0) { + if (itti_create_task (TASK_RRC_UE, rrc_ue_task, NULL) < 0) { + LOG_E(RRC, "Create task for RRC UE failed\n"); + return -1; + } + + } + + + itti_wait_ready(0); + + return 0; +} +#endif + diff --git a/targets/COMMON/openairinterface5g_limits.h b/targets/COMMON/openairinterface5g_limits.h new file mode 100644 index 0000000000..63f5b96c33 --- /dev/null +++ b/targets/COMMON/openairinterface5g_limits.h @@ -0,0 +1,36 @@ +#ifndef OPENAIRINTERFACE5G_LIMITS_H_ +#define OPENAIRINTERFACE5G_LIMITS_H_ + +#if defined(CBMIMO1) || defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_LMSSDR) +# define NUMBER_OF_eNB_MAX 1 +# define NUMBER_OF_RU_MAX 2 +# define NUMBER_OF_UE_MAX 16 +# define NUMBER_OF_CONNECTED_eNB_MAX 3 +#else +# define NUMBER_OF_eNB_MAX 7 +# define NUMBER_OF_RU_MAX 32 +# define NUMBER_OF_UE_MAX 20 +# define NUMBER_OF_CONNECTED_eNB_MAX 3 + +# if defined(STANDALONE) && STANDALONE==1 +# undef NUMBER_OF_eNB_MAX +# undef NUMBER_OF_UE_MAX +# undef NUMBER_OF_RU_MAX +# define NUMBER_OF_eNB_MAX 3 +# define NUMBER_OF_UE_MAX 3 +# define NUMBER_OF_RU_MAX 3 +# endif + +# if defined(LARGE_SCALE) && LARGE_SCALE +# undef NUMBER_OF_eNB_MAX +# undef NUMBER_OF_UE_MAX +# undef NUMBER_OF_CONNECTED_eNB_MAX +# undef NUMBER_OF_RU_MAX +# define NUMBER_OF_eNB_MAX 2 +# define NUMBER_OF_UE_MAX 120 +# define NUMBER_OF_RU_MAX 16 +# define NUMBER_OF_CONNECTED_eNB_MAX 1 // to save some memory +# endif +#endif + +#endif /* OPENAIRINTERFACE5G_LIMITS_H_ */ diff --git a/targets/COMMON/threads_t.h b/targets/COMMON/threads_t.h new file mode 100644 index 0000000000..ddc060e8c3 --- /dev/null +++ b/targets/COMMON/threads_t.h @@ -0,0 +1,14 @@ +#ifndef _THREADS_T_H_ +#define _THREADS_T_H_ + +typedef struct threads_s { + int iq; + int one; + int two; + int three; + int slot1_proc_one; + int slot1_proc_two; + int slot1_proc_three; +} threads_t; + +#endif /* _THREADS_T_H_ */ diff --git a/targets/COPYING b/targets/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/DOCS/E-UTRAN_User_Guide.docx b/targets/DOCS/E-UTRAN_User_Guide.docx old mode 100644 new mode 100755 index 824aa46e9a..12a9d17da5 Binary files a/targets/DOCS/E-UTRAN_User_Guide.docx and b/targets/DOCS/E-UTRAN_User_Guide.docx differ diff --git a/targets/DOCS/E-UTRAN_User_Guide.pdf b/targets/DOCS/E-UTRAN_User_Guide.pdf old mode 100644 new mode 100755 index 5005692944..3de31b24f2 Binary files a/targets/DOCS/E-UTRAN_User_Guide.pdf and b/targets/DOCS/E-UTRAN_User_Guide.pdf differ diff --git a/targets/DOCS/oai_L1_L2_procedures.ipe b/targets/DOCS/oai_L1_L2_procedures.ipe new file mode 100755 index 0000000000..2062240c14 --- /dev/null +++ b/targets/DOCS/oai_L1_L2_procedures.ipe @@ -0,0 +1,12461 @@ + + + + +\usepackage{setspace}\usepackage{amsmath}\usepackage{stackrel} + +eNrsnQV3G9m2rX/Uu+/dce49p0+fhnSHwbHDDN1Jh8GOmZllmZmZmRnFZmbLJFtmtvWmVIla +LSdpx3YcyV5z7KFRKpVKVUu1vz1Xwd4yGYlEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJ +RCKRSCQSiUQikUgkEolEIpFIpEOrra2toaEhDdwwzdwqEomkdRocHHr+/JVEMqVRWzU+PvHs +2QuxWEx/EIlE2qMCAwMfPvw9ISFRo7YqMjIKWxUeHkF/EIlE2otGR8du375z48atBw9+m52d +1ZCtgrG8d+8BturOnbsTE5P0N5FIpF0rKCj41q07ly9fxavm2LmoqGjlVpGdI5FIezRyV69e +B0+uXbvx4MHvmmDnpqZg5O5je7BV2DbYOYlEQn8WiUTai5FjCqbj4xM0x8gptyosLJz+LBKJ +tBcjxxTYp/v3H87MzHzDrWLOyDFGjilXr964c+cenZ0jkUh7NHJK4xQXF/8NtyoyMuqjW0V2 +jkQifamRAzpUjZwm2LntRk7Vzk1O0tk5Eom0I21tbbFYXqDZtWs31Xhy/fpNzP9WxikgIBC/ +jm346Fb5+vpjy+nvI5FIO6GcSNQoEAiSkpKVxunKlWtXrlzPzs7B/Obmlm+yVU1NTfj1tLR0 +VTuH6dTUNMxvamomypFIpC9Se3vHjRu3lJRDYjgy8u2fqOrt7VO1c5ju7e2hP4tEIu1CQqFI +jXLd3d+eJ62tbWqUa2lpoT+LRCIR5UgkEokoRyKRiHJEORKJRJQjypFIJKIcUY5EIhHliHIk +EokoR5QjkUhEORKJRCLKkUgkohxRjkQiEeWIciQSiShHlCORSEQ5ohyJRCLKEeVIJBJRDlpZ +WVEdynB2dnZpaYmZXltb6+rqRvlU95sjI2Ls8tzcPB0MJNJBqqKiMioqmplG9UxISJyampbJ +B2sYDQkJ9fBgeXh48PkC1a+sr6/HxycoR1Pt7OzMyso+IpTr7Oy6e/d+T8/7LQ8NDS8rK8NE +c3OLpaW1l5e3m5uHlZXt8PCw6rc2NzcjIiJdXd28vX1MTc0qKyvpwCORDkwpKal37z7g8XhM +ZbSwsJyYmJienjYyMsnPLxgcHBSJRM+fv+BwuMqvwLQwizFv6+vrAcMjQrmurq7ff39kZWW9 +vr6Gt8HBoUDWwsKCsbFxc3Mzs0xGRiab7a36rfT0TABwc3MD021t7TY2touLi3TskUgHo/T0 +DHd3TxMTc8abOTg4zc3NxcXFJyYmKZfp7+/v6OhUpZyDg8Pk5PtBS7lcro+P79/+kEjUqEa5 +np7eb777fX3923pE/9xWNTY2BgQEhYSExcTEKrxcWEMDp7a2zt8/UC2xVU7DIdvY2PX19akG +kAaVIJEOTKBZaWlZbm4ei+WFt05OLlNTU6AW40yAPoFAgDQN7k41YwXllKen4AN3QjlN8HLY +HX+F/PzeF1BddQhFTDs4OCo/ZUpgYBAM2AfKNfn6+gFib94YDAwMIHOHyy0oKExNTcWny8vL +YWERyPTT0tIRJZVGwUlpfUkk0sFTLjs7FxOWlpbl5RXe3r5SqRQVGQ4NM5Gxoo6DaajssD0w +fpmZWTB7Ci8nUXo5pGOq69zY2PD19XV2dnVwcFYWY2NTwE3JE0ybmZmrLuDq6l5WVv5VdxZ0 +EgiE4Daf/74gl1Qbwys9PV35KVOEQqES6aCcp6e8OeDz+XZ29gEBgdh9THt6spiUv7m5paGh +AQksnKqLXK6AuYeHZ0tLq3IzAMbR0VE69kikA6NcRkYmk5a+fPnq3TujpaWlysoq2A/Ailmm +urrazc1jaGgoP7+gsLAQjgWWj8fjM5/GxydGRkaqrhPp2MzMzNTU9JSKqqqqlbkh4+UAENUF +YBeV1ysPTECQWsba3d31+bwboWCmIyOjbt68DWTBrdnY2IL/mMD8yspKfX3D+fn5aYVg6jDH +0tJ6bGwMC1RX1zx//mJ8fJyOPRLpYBQTE5uamsZMw6rBzMDLYRqZF/xVXFw88i9LSyuATvVb +XC7P2NgEn4aHR5qamo+Ojv3tDzU1NatlrDCH33z3v/TqA1LXkJAwZhq0NzExQygwDUrDANvZ +OTo5OQOD7e3tal/Mz8+3t7dn/K3yEi2JRDoADQ8PK7MneLDGxsaVldUPPqe7pKQUWSRsyfYv +joyIi4tLsMBHP92uw3GNFSFSWlxGyFKV0wjFwsLCp767urr6mU9JJJK2i559IJFIRDminIZo +bm5OKBQq3/b3909MTK6vr1dX1xTKVVRf3/DRLyJ6cPjKuysnJiZUb6Hp6uqamZmh8JKIckS5 +b66ent5bt+5UVb0/GRsYGFRSUiqRSH777VFCQmJ8fIKHBysmJlb1rj9Mh4aGu7l5JCYm4VMn +J5eVlZWysjJfX3/lMpgpEAgovCSiHFHum6iqqgomraOjY3R0tL9/wMDA0MDgHXPvd3h4eEVF +5djYmJOTk3J5ff13yqf8oPLyCkBM+TY0NGx0dKymplZ5sQZisdiNjY1UF0hEOaLcwQv2zM7O +MTU1/cGD3woKCgcHBwMCgvPyClxc5OCKjIwG5UC8d++MuFweFBcXHxgYqHrlxd/fv7S0TG21 +ZWXlRDkSUY4o9801MzNrbGzMXP+NjIzMzc0bGBhknoWxsbGrq6tPTU2DVZNKpX/88QTZq79/ +oIuLK9za+vo60AfvNzc3HxAQCOemtmbkuaqU8/T0EolEVBdIRDmi3AFrclJiZmbOnGTLyMjM +y8sH5Tw8PPFWLBbjIxcXt9raWrWM1cHBicPhREZGeXl51dXV5eTkhodHqCSw5fX1DfjTVTsu +cHBwQEZMdYF0WNXY2KRGud7evm++Ve3tHWqUa2trO2p/DRJPcCw5OQXtztu3BkVFxf39/YAY +82lxccm9ew/h6MbGxt++fdsv10Bzc8vbt/qYUq5kelpqamqenZ2DT5HePn/+YmBgYHl52dDQ +uLKyCjNhES0sLFX7MSCRlNo4FGpo4KpRrqW57ZtvlVDYqEY5gUCoLSFVPS22R0kkkuDgECSh +LBYbXg55aHp6uvLT4OBQwH9paclNLg+Uj55hGx8fx0pYLJavrz/cIDNzcHAQbzEzMDAEbpCq +81HW9PR0W2tneVlVfFwSDjYfHx8vtqeLq7OTs72tvYWNnXYXO3vLd0b6ly5dVfLk8qWrxiaG +mP9tt8rQ2OCyylZhCzHn227VDguOClsHa2cXRzc3Z08vTzabHRoanpKS3lDP6+0ZUPaIssNm +1MfHt7q6Go7L3NwcnKf6SNpHkybgNyYlprq5uzu42LizbWKSfUrrE5p687tGS3smyodna0YX +6qbWeVPrXK0uy7KmSl7iubMXP8DkykWdS4LO7EVZ4zfcqiVZU31T+oXzutgeBnHnz+vWilIx +XwuiusGTrHFG5moGpdXdY2Wd4hJBR05+RXRYrKezh6WTq7wbmdycgt6ezz0srOweoaenF6Dz +9vbZfgWBRNqdOtq7o6PiHBxtWb52RdVxneJSHLeo8osy0YJMOCsTzGzxpFu86Q0czxzJWoO2 +lyWZqIKboEY5XkcmdvYbbhWiXdeUqka5GmEK5mtJYDk4QlBwqOCAmZMJFmQiHEV4HV+qF3Xn +peQEO7hYurq6ZmfljYrVe0EB1ohppK+hqqo6V1d3Z3fL0roE8XztovywFOEQxRE7sVJ/WAto +Vs6JV6Mcty0DFfMbbtW8TFgrSlGjXLUgGfO1O+Cr9WgcEdslWSNazK6xspTsYDtHC1/vgLbW +930+p6amuri4MV1FkUj7paLCUlt7W78Ql46RkgW5ZxOhFT7EZCPKaUKZXG2Y2eLD4Em3+PVN +GbaOJoGBgXl5BU5OLqurq1QrSfulluZ2JwfnoAj33olyOLdZGX9ytf6I8A0FvmJF1lTF335e +LmtJfl6O8622alnW1NCcpka5usbUZfl5ucNmrZHhgt6rsuackojbt+96e/tRN1CkfdHi4mJo +SIStg3lTXwFq9IyMf3TgxpSxpbreyfKJpfqCqig1ysE1jS3W9UnKx5frDnir8Iu9krLxxfqy +hng1ypXUxWF+32TZwW/V1y7STZ54vsbS1rC0Pq6sLsHcyhz5BVVS0l7U1tppZWWTXx4zKxN8 +29TsG/oHZEx2TqZ37t69/+AeAxNlefDw/q3bt929baUbvIM0t9ik6XWui6fV7Tu37z+8r7pV +mL7/4P7tu7ed3C2m1riTaw2H6b+Y2eTbu5hFJnjBrKLNHZmrYQc4env7kqkj7U452fkWViYd +wyU4nCSHqLLs4txXblnEyRPndHQuqSIOReeC3pnTF8q5CXMHfh4Mv1hcG3v65Hlsg/pW6eid +Onm+sDr6MJ2dm1itX5SJgqPcXFiWaHBxQI6v1M9s8RZkosLKWCsrq9aWdqqzpC9SaHCET6Cz +ZJVzNC3cXy0EZ2qN88741dkP6aqyAHFWdkazm/yDt0z4RRhIMyuDM2d01Lbq7BkdE/O30g3u +YWqb0NTmlIYbmb0ZX6pTveYFW4uP0BabWRhVVdJdJaQdaXNz09vLNzbFF62kdJN7xBH34QKr +qKgm5ty5i3/JDfWuXNTRqxGlfCvLhN+t4CZeuKCnlrGeP69b1hC/cFiM3LhiT3kdWa/fPusQ +F83KBOPLH7kCPrZQZ21vlpdbSFWY9LeIc3FyyywMX0SWus4hvqnbORXjxBi5mS3+tzr3Basm +3YSd0z9zWmWrFEZuWv5YwSExcojwwFTF23cvqvhJaG4+RUIsNrXGdXK3TEvNoopM+ozc3b1y +SqNWZM1IBAhuanausDrm3Nn3dk5PbuQufUMjp/QwFdyEC+f1PlxjVRo50SFpX9Y50+tcazuj +xEx/ZKafvegsP003uyVwcrMoyC+mukz6qAL8gxMzAnAsEeI+e3ZOhzFy1vZGs9/OyKmenTO1 +1GfOzsFqGsuN3CE5I4fjcFEm8g12YvnZged/e1gCdDC3klWOlb1xXS2HajRJTYnxKSHRnorn +HylR/czZuWjYOV3dy5pg5P58KENu53T1dC/DyJUeIiOHBjctL9jc2gDg2uFNzgDdrIw/Ol9n +am7c1UlDY5P+FI8rtHEwmZUJjs4TW7vKnhoYO3fsp1PvjZwGmF7lxVZslfzS6vphMHKAFVhd +35T6xuB570TZzNYX3Is+riB/50iJqbm5sscS0hGXRDJtbGI0MFU1u8UnlP2tnSuoijp18nyN +SIOeFZVfbOUkYKtK6uIOx6VV+LGe8VIgrqE5DXu0/aLqTnxgUXWcF8ubKjgJcnFyq21MR646 +ThzbgZ0bnq2KTfUZX67TnLOXsHOji7XYKvF8zSEwclOwoysNZlb66QUhn7/isINzes7FRWVU +x4+4Ksqr2QGOi/IrDhpxtlki74xOk0vD1AYHTmNqXWO3qkGzA/jXogij2jEA88bytfMPdQam +9nJYSjd5owt1pmbGs7NzVNOPrJaWlnAMDE5XzWzyNCHtglMalJYPaHbBFg7OVAzSVu1TGZmv +mpMJpje54x8yzfh0PxsHY+kGb+93bC7K7/+JDfAPpsp+ZBUVGZtVHLHrpGAfLRyO88LqKGs7 +Y3tHazcPR1cPBypHoDi6uNlb2Zp5+dv2TpbObPEX5B0yJxoYvRycrpTuR8sLZzu7JbBxMOno +6Kb6fgQllc5YWJpMrXG/eUdkyFDi0rzfvjUsLa3o6Ozu6e3v6emjcgRKf3dPX1Nza0hwhIHh +q6GZip7x0tf6z4Vd2fO7uuLwqRyB15bl5uZBVf4IKjYmIbvk2xs5JMu8jvS3b/U7u7onJicH +h4YGBgepHJ0yPDIinZmJi0t2dDezsjfKr4hc3NdjcnINmYLQzsn886PkkA6hkZueMTU3HF+q +1wQjFxzlGh0dL5ma6h8YoHIEC5q2oeHhP/54Hhbn/jWaXSTCtaJ0NtuPKv6RUk52flJm4Dc3 +cswR6BvkkJdXNDo2RvX9aBY4upERsaOTY4e4QLq1/xfCJIobpy2sjCcmJFT3j44cHR07xSUz +GnAbMCjnF+JIlDvilBseHgHlWgZzp79OZ19o0JOzgtC4U90/IurrG7BzMp3bEmjCfa07oRxq +gXh0VKvLiFi8dxogrROPHcI4HADl0KB3ikudnZ2p+h8RJcQn51fELGrGM91/SzlUgb7+/pra +2qLikuISrSxFxcUNHO7eT161trWXlJRqaRCYOHC43G9COeZuJTsnc7QVRICjIFdX157x8q9x +AuRrUA7zwbcXL16xWF5eXmxtLB4erJcvX4tEjcMjI7um3Nj4uKurm4WFpZYGQREHz5evXjc2 +NanF4QAoxyStKdlB1JnwUdDMzIyNvdmUxvRc8beUQ+1OTkmNiIjU6rC7uLjV1tbthXKIj62t +3fDwsFbHwdnZta6+4ZtQblYmaOzJ86ErrUdAnAZ+QJjrogZcXd055VLT0kNDw7S+dtfV75Fy +9vYO3d3afQ+/k5NLfQPnm1BuaoM7tlRn62C9srJCHDj0J+XKOUma09EiUY4odzCUYw42Z3eL +nu4+4sDhVmBAUGNvvuaMP0iUI8odJOXC41g11fXEgcMtFzfnwemqaY0ZgvCrUi42Ns7JydnZ +2cXBQT4C++joKGaKRCLMdHFxRY3D/OLiEtWvSCQSzE9NTVPOSU5O+bASJxbLC5VSSylXW1vr +6Ig9cWUCEhAQKJFMYT7WiWigYD4W8PDw7O7+sy/xvr5+hM7GxhZ/weTkpFZTblEmKqiMTU3J +JA4cYi0sLNo5WU2taVCn2V+Vck+fPj9x4tTdu/dRfv31xO+/P15cXMzPL/j++x9u3ryNmVeu +XPv++x8DAoKUX8nNzfvf//3X9es3Z2dnmTkGBoa//HKcWQnWdvv2XYaWWke5iIhI7Di2XxmQ +t2/1NzY2Ghoafvjh52vXbjDzz5w5j90HdvCVysqqM2fOXbhwkdl3zO/s7NJeys3JhPz27JCQ +MELBIdbgwLCLu/WMjK85/dx+bcrBhDDTmZlZP/74s0jUWFlZefr02b6+vs3NTaAM7uX48ZPt +7R1YZmtry9DQyNbWDgwsKytnvvjunRFAx0yXlpZiJXl5+dpIuejoGD29K8pz776+fseO/Qp7 +hpiAYF1d7/FVVFT03XffV1RUYUmg79mzF+PjE4gVl8vD24KCQu2lnFTG7xwp8fambtIPs7q7 +et1ZtnMywRGh3PPnL42MjEcU8vHx/fnnXzo7O8vLK0C5oaH3d4d2dHSCcmlp6Zju7e29fPlq +T0+PubmFmZk5swDW8OLFK2YlYWHhP/10rKKiQhsph/z93DmdoKDgmJhYTIPkDx8+Wltb4/MF +CIi7uycwGB+f8OrV63PnLojFYqT2iJiS9jJFt6tanbFKN3l9kxWentQLkwZpclLS1bWfZ5tb +WzrcvW3m99bRtBZRztDQ+NSpM4AYsjN4MNi2zc0tuBFUauXpNUygUqN2YzoyMhpgVHi2sosX +9SYm5KehrK1tlCv54YefLCwskfZqI+Wwj9gR7Bd2BMXZ2aW/X94ZUUMDBxHAfIQFO4igCQRC +JgjweEKh8NBcfZje4A7NVLu6uhBbNEc1NbXe3j77uEIBv9EnyElzbpb72pR79erN06fPcnPz +srKya2pqkJBiZk5OLqozjBmzTHt7O6o8ZjIZ7o0btzw9WZaW1phZVCQfot3ExOzBg9+wkuzs +7IqKyo2NDS29+gCrpqt7aWxsjMfjX7hwEZRjAlJf3wCaISEdHBy6e/c+OD8zM4P5HA4XXk41 +Rc3IyOzp6dVeyk2tc8YW6x0c7IgtmiM0soGB+9llfX0dLzTac0nWdEQo9+TJMzs7e7WZ4BUo +19bWNjc3D7dma2sHhzM6Otbb26ejo+vg4Ojm5s5ied26dcfc3JLJWGFv9hh5jaHc5fn5eUyn +p6f/7//+Kzw8QnGYySnX0tIqU1yA/umnX0xNzRXXqhbu3XuAgh/FtzIzM//nf/4ZFRWt3ZRb +qreztz3KVNG0m6L3nXJ1tdywGNbXptz4cp10i7fDs39flXJ37tx7985QbWZWVtZ33/0HQEOO +dvbs+WPHfmXSVScnZ8xRWrWgoODvvvu+r69PX//dH388PQSUCwkJ/eWXExKJvI+1zc1NeNTv +v/+hq6uLz+eDeHy+gFkMof5//+8fzIlKLpd76dJlZOsIF5LZd++M5ubmiHJaqpaWFhh4ZIhE +uX04+7HOLamLq+QnzcmEf8u6r0q51NS07dcEOzo6goNDwsLCQ0LCgDK4F6bWJyYmFhYWKRdD +5fP3D+js7ELempmZfQgoh0Q1PDxSeQVBLBb7+vohXR0dHUUcxOJR5SUGeDxQDjHB24mJidjY +OD8//+zs3NXVVa0+L3dkKdfY2Igk5dq1G/fuPeTxeBq1bUKhaH/v+edxRZHx7A1Z+8wW7+NF +xocNw5G2l7Iqa/YNdjp54pyjqzm3PXNeJlCwjp59oGcfiHIHLZGoEUkK+Hbz5u0rV65hwt/f +Hw134SdUWVkJc7X3gtYTamtr6+zsbG/v+FRBKoH21MXFpbu75zOLtbe3d3V1j46O7aTk5Rb5 +BDr1j1W0DOR/qnSMFPVMlPaM776IZ6p9ghxPnTx/+tQFPb0rcta1Zc59gnVEOaIcUe5rSCAQ +2NraK/l2+fJVply/fvPGjVufKLfxKb6yX+Xq1ev46b8t2KodLrbDcuXK51Z4+crVm7duPXh4 +7/6DPZSH9xDZS5eu4Of09C4rWceT+zqhGuuIcl9EuZ6eHqIcUe4zWlpaqqmptbGxVdDs9hfB +4QMirh1w2fcfBXxAns8UXd3LF3UuXby4h6JzCVhTjRvDukt6V1w8LYWd2bMygXLY9B32L6ft +lEPt3nv/cjh0+/r6tDoOjo7O36p/uSNCORwhr169vX//IbzZl/KNyt4LWIc09sxpHScPi0Fp +JTNI4k76Ci4pLX327IW9g6MjaoIWFjs7B3lfwY177SvY3d3D0NBYS4PwPg7yvoKbiXJfVWtr +a2VlZfr6hshV4ei2WzUkkp8pB2/k9j1j/XaIuwK+Xbiga2z2Nr8ianSxVqK49rqT0W36+vuF +IlEDh9PA4Wpn4TQ1N+99oKvOri4Ol6u1QfhkHIhyX0Orq6slJaXv3qmz7vr1W3fu3MXMjxZQ +br/yR6xn5+fu/nYx7MKtW3d2UrAXOhf0Tp2SXxf4TDlzek8Fa9DR0VOyV8G3Cxd19Cxs3lVw +E6SbvAWZUHl7yQ7H8ELrr+1lX0ZnPpRxIMp9TdatFRUVIYdlWIc0Ni8vTyKRjH9MExMT+Dc6 +0ZruWd3d3XgRiUQ8Hv8zEgiE8fEJDg5OmOB/dkEOh1teXrGTEhIcbutoWlgek1UU9tGSXRKW +lB0QleQdk7z7kpjhb2Khf+GCHuPfQDxLW8NqYfKMjC/n2187fdo55UbEYu0t+0U5rQ7Cp+JA +lPvaWllZhq/T1ze4d+9hTU2Npt3rwjyDs28rFLZEJ/nIZN2LMtEnSiNeF/ZWZLL20BjPH/9z +Qkfn0nu+bfHnVfzbLkad5vEF1fh7amu1sVRX14gaG1GX956x1tTWaWkQPhMHotxBsW4lKyur +ublFo7ZKS599mJcJgiLc9A1fMP7tU3zb+UiFpWVlL1++cnZ2dXV108bi5OT8+vXb7SP0fenV +B09PlomJqZYG4X0c3rxtam454lcfmE4SVN8yczY2NpaWliHmqZMjIi2lHJjWO1mG18/z7Yvu +JAkLC6c7SWxsbHfXHzvdSaJRlBsaGjYyMhofn2DepqVlNDQ0zM/PGxqaID5oCxwcHNva2ohy +mkw55nDaYafrdFcwPftwFCi3vr7OPEEMn4Y9vnbthouLG/NRaGh4SUnp2NiYmZnlikLt7R3G +xqZ777NUK1Rfz/H3D9RGytEYXkQ5opxSnZ2dlpaWHh6eDg4OtbW1g4NDXl5sUC43N08mH48j +qry8Ynx83M7OgVleLB61srJeWFg4CpTjcLh77M6LKEeUI8odMOU2N7emp6dbWlrz8vJBMB6P +B3xxOByYNLi1nJwcUM7Hx3dqaur16zdSqTQxMQmUm5mZefz4D2ZouZcvX2PmISabRCJRDkmw +sbHR3NyMaBDldkE5sVgcEBDo7x/g5+fPZnsXFRUxJ3UzMrJwjGGmt7cvkgVkCirH52ZlZSXa +WR8fP6FQxMzs6Ojw9fVj1uPt7QNYaRflUIOwp9h47BQC0tvbh5nY68DAIMxE8fLyRn1cX/+z +D2QccrGxcZ6erJiYWFRYZmZWVrYybmFh4RMTE0Q55eWD0dFRPl+Qk5MbGBjMYnlhNxEokKqm +pratrd3KyoZZMj+/ICcnb3Bw0N1dPvZEYWERFo6JiauoqEQ8LSwsmV41+vsHHBycAMPDSjlE +4OnTZ8zjivj/TUxMR0bERLldUK6xsfGnn37R0dG9cuXahQsXf/zx57i4OMxHA/rzz78wt2cf +O/br5ctXcRxi/vLyMg6tH388hjn41rFjxxkjXVBQ+P33P+jpXcbyZ86cU/aUri2UQ2b0n//8 +yOwvNv7q1es4orq7e3755TjCgpm6upewgw4Ojmtra1i+tbX12rUbx4+fQhyw/M2bt8F5zH/z +Rl8ZN0w8fvyEGc71CFJuaWlpeHi4vr4+KSkZjQV2Ci2Cv79/RkYmnBs+Uu02HxbOyMiYsS5o +UJClYofd3N6flGOzfX777VFDAwcZKw4/5bfMzMyRyh1iO1dWVmZsbDIxMWlu/n5Px8cnRkZG +EFUk+ES5Haq5ueXEiVNVVdU45ObnF5AF3Lv3ABXZwMDQyMhkaWkZRSgUyh86MzaRyTsJzwAN +EhIScQzDwJiamj958gzLwwudOnWms7ML68GheOPGLeXAhVpBOdiG+/cfoq4xQ68C7CkpqaDK +yZOni4tLEITZ2dmgoOAffvipoqIKtgR7ff36zY6OTmAf/gQMZLInff13hoZGG3Jtwteh1Sgp +KT0ilFtcXMQBgCMhPj4eVt/DwwOYioiIgHlrbGxC/vX50UB4PL65uSUwaGhoiCYSTkZJORxp +Dx/+Xltbh4z10aM/AD0UNEywgkyjc4gFF/HHH0+ZIVegsLCI589fhoZGoKruLmM6mpRDRS4s +LJZKpTiufv/9Mcr6+jpqKzOuwYfG1PvSpSsKrJnheFPORx1nxuoqLi4G5QQCEdYD13f58hUT +EzMtopyHh+fdu/cnJyex/ciYYMMyM7PgNxCc6ur3t8EDdDCr/v6BIM7x4ydhUZRfx7eYu7kM +DN7p6xtIFYqOjoHpBRUPK+WQs7e3d8DGh4dHwoBhs319fSMjo+BAMB8R+JLTdJtoauGHEXMk ++wUFBcAX0y+98iTVwsICgtzf39/a2oai7Wdfdyjk6bdv30POxbwNCQlLTk6RKUZmAeSJcjtR +S0vLxYt6587pMGkmKm9ubq4iY32riilUWCw2ODj09q2+iYnp9vXAsWAN585dwCsQcf68DhyR +FlEONQuUPnv2PLYfBgyoB9J7enpBucrKKmUKBqPLYnm1tLRiPkzL9vXAjZw6dRYrOX36HDOg +IRzy4aAcnNjkpEQgEOTl5eNIQ7sArwXPprguUNnb27eXmzqALxxj9vaOvr4Bbm4eexw449AI +SEd1A+hev37DnPoICwtnBv8tLCyE7yXK7dDLoWq7urrFxyfExMQ2NTUx80E5VS+HVgM2Bm03 +vNxvvz1SzsexjSZ4bW29tLTs9Omzfn4BcXHxKLsbqu8bUo7FYl++fDU2Ng4lLS1dKpWPQtjW +1qbq5RYW5rEM9hHIQXOAlFa1wWWGbTU2Nr1//wETTLQX8LpaevXB0cl+dXV1aGgYiWRqalpg +YAjggyQxMDAYJpbD4Q4NDe19hAs1YZ09PT1qTz0cWSE9f/NGn0lLk5KSzMzM0dCEhIQyA6/g +6PLx8SXK7ZByqLDMAMqqAuWMjExWFeru7rl69TozzhcOeFgUVHAmoXj58jVsG+oyqjkzlOFe +/tZvSDk3N3fVTJxRe3s7KAeAIwgrKysJCYmweeXl5UivHj9+cuvWHcB8dXUN2/yf//zEDAr8 +9q2BmZnZHg/vb0458XzNq9cvwDQPD4/g4BAkR2DdxMTE7obZJe1OGRkZkZHRqidV+Hx+fn4h +kyXV1NSonjMhyn1GIlHjP//5HRilNv/VqzfHjv3KdHQPfOnq6jHPLyMrsbCwQmW/fv2mjo7u +L78cZ4buQhbz3Xffd3R0ainl7Ozs4dPUTmUjM8UO6upeQhCuXbsBvFtb2zIGRigUyfs7PXUG +cUCgHjz4TSyWX+X/448nL1681HbKjS7WWVmb7+PdWaRdaHubsr6+vl8rP1KUQ8Vxd/fYjgV4 +Ng8PFovlhU+RpChH6JPJO1ldLygoREOPTxsb32e4ra2taGuUTx1qHeUKCgoQPbXjanR0FEmB +lxcbe4qkPicnVxWD4+PjISFhzs4uUVHRSC6YmfB7ycnJ2k45ZKwODnbEmUMsevbhW4mefdCu +a6wkohxRjihHlCMR5YhyRDmiHIkot/P+5fa3z+SDl4uL2977l7O1tVM+46zFtKeRCklEuW2U +KywqevbshZubh7u7VhZXV7fnz18KhaI99hXs7OxiZmaupUFQxkHU2ESUIxHl1KpAb19ffX1D +eUVlRaVWlvKKCi6P19ffv8dxH1rb2iorq7Q0CEwceDx+Xz+NbkMiyn2kFmj72FUoex/Da2h4 +WDw6evjiQJQjEeWoHO5ClCMR5agQ5YhyJO2mXLBjfn4xUY4oR5QjHVbK+YY45uTkj42PU30/ +spQbEY/a2tk2DxDlSIeQcvMyYVyatzc7YGp6mur70SwjYnFLS7upudGAtBwgIsqRDhnlpta5 +/VPlbw1eFRaWAnTjExNIXUfHqRyVMimRiEfHHOxdo1O80OR97WGCiXJEuYMv4yv1czIBty3d +2FTfm+2flpqVnZWflZX3kZIpL0VFJTk5BfLprF2WzMy8vLzCwsLizD2s5JAVhCI/v6igoGiP +McHXEViEd4fryc7Oj49PsbCw9g1x3PlI5UQ5knZRTgm6QWlFXLp3UKRLRAIrIv7jJSbZ28js +TUCYS1QS+1PL/G3BStzY1lZ2hnEpPrteySErsSk+jq7m9i5me4xJXKqPpa2hu7c1gryT5cPj +PAMjXco5cTgAvmquSpQjymlG6spZkImWZI14XdxWMHNN1jK6WHvvwd2imhiZrGNBJlz82JJ/ +W/DdwAhXA6OXK7KmZVnj7lZyyMqWrN3Z3cLO2XRT1ra025ggmMuyJn3DF0GRrgjyDr+Fn5uV +8Q/sGCPKEeU0uSzKGkNjPH768eQb/ed4K9lV0z+zxe8cLb558+apk+dBS8BTG0OxvwU+it+R +pXvxks4FvYaWNLzd9eXywuroUyfO37x1C0Ge2eJpYEtKlCPKaWyRbvJ6Jkrv3ruDmnj2jE5u +WcTirgCFb/mHOgNxZ8/qvDN+PbX21c8FaXiZXJVf5nZytzh96sKZ0xdg50C5ydUvjgnCiGAa +GL06e/bi6ZPnA8Nd0SoR5UhEuZ2XJZkIRg50unz56rmzF2HnJr/czsHIdYiL4TQu6ly6dOkK +1kN2Tm7kOjMRDT29yyi6upcbWtJ3ca1zUWHkEFKsCuG9dfu2ws7xiXIkotyXGTkdPVAO9Wh3 +du69kTslRyVDy3fGr460nVMxckxM5HbOibFzX2bkJKswci8RUmY9aI8Cwlw0zc4R5YhyGn5G +7vTJ9zVRxc417NzOKYxckdzIXbz0fj1H3s4pzsjJjRwsHBMTPT1MX2poSfsiO7fwwcghpMx6 +EGQNtHNEOaKc5hq5ScbIXVJS7rLCzuWURewcUAoj58LkvMpy9r2d4x5FOyc3cgJVI/ennXM2 +nd2xnZOscRRn5P40cn/auXDNsnNEOaKcJhs5NTrJ7dy592fndnKf1cwmr2O06JaqkVMU+dm5 +c0fUzsHI8TqymDNyqjFR2LkvODunekZOdT2MneuCndvkEeVIRLnPGLmusRLQCSxSo5ye7mWg +L6s4bCeAWpAJfYIdj/96Vq0mMpbj7bsX8uR3jXN0EDe52jC7xbd3MTshj8lfAnL50tUTx89Z +2xvNbPL/9mIrc8bgjcGL7c0QQo2A+4Y4aU4LQpQjymlggZ2IjGchV71586ZaTbx+/QbqkZHp +m7Glus8DSrrJ7RAXPfjt/tWr169eu35ZpVJfuXLthmLNxXWxu75PTBvLzBaf35F58+YthPHq +1WuqscXb6zduoDS0ps/+3Vm1OZkQThh/BMKIYKr+QVgNAv7w9wed4iLp1+xphChH0u6MdbW+ +Z7y0b6qc156J+qg8SX7m1IXYVJ9RaU2nuHh0sfbzlgOfDs9WAXRiaY2Lh+WZ0+9PQ124oPvs ++eOeidLusZL+qfJd3CSm1V5uUFqJmAxJq0wtDc5+OKWGxNPQ9PWQtLJztGhQWvG3McECCB0C +2D1e+vT5Y50Luso/yMXTSiytxU8g+BoSW6IcUU4zC/PkF1inSrnTJ89nFIasy1p32B0ZahmS +3zVZi5ef3ekPd5KcP6/78vXTmS3erIx/pNJV5e0fiMmyrMnKzvjMGZ33l2PO6JhZGSzJGhGW +HV6RQegQQLi1F6+eXjivq/yD2P72a7JW/ITmNB9EOaKc5p6d2+J1jBSpUS41L2jpC6/fLcpE +nj62qpR78eoJ6uBRfvwBebqlrZEq5Uwt9UGtL71fDq/PXz5RpRzL147ulyMR5YhyRDmiHIko +R5QjyhHlSEQ5ohxRjihHIsoR5YhyRDmiHFGOKEeUIxHliHJEOaIciShHlCPKEeVIRDmiHFGO +KEciyhHliHJEORJRjihHlCPKkYhyRDmiHFGOKEeUI8oR5UhEOaIcUY4oRzqylAMopja4Uxsc +ReF+qqcdyRpHWXcUbOFoEeXmZcLF94PON36mq3Ds4KxMsKRYZnLP8BxfrpuR8ZnB7vEq7+dz ++SPLID7STS4mxpflnfeCUePL2kE5ZuOX3gdWHltsP2Z+qjdU5i+Y3uAS5UgHTLmxpbo+SVnn +aHHXaEmnuPhTvSaOzFWPL9UpvzIyX60dlFuVM7m0Pi4u1Sc+zTcmxTurOAwY2b6P4PbMJq+c +kxCRwMopCccCqI87B85HauUal9OaEZfmixKdxC6oit4+Ztn0GlfYld3UlzctH6OH0ztRVt+U +uvMW5NtSDtvc2JOTkOHH7GNsqk/XaPH0Ovej29k6WIAFsBgOMzQl40Q50kFRbm5LgHr95Nkj +a3tjKzsjY7O35Q0Js5sCNbOH4sqyEvXkSjd50i1+Q0uap6/tDrtY/LaUYyyZvuFLVFugJjTG +IyU3CBBQIwnDNN9gJxtHk7gEXwdXM3OrdwNTFVPru++fE4bQxdMSUY1N9gmJcs8uCQd/1Mgp +H/0nyj02zXdRJoTxqxWm4KcxoRWUwz8YFOFmYPQSOxgRzwqL9UQrObPF276RxTWxhiavI+JY +geGu+NcqeUkzm3yiHOlgKIeamFkYyvKzW5CJlMgCl1SrCUM5S1tDfmcWPkIdrBEl2zmbKhb7 +ipTDNoBRyoLlWb7qlIM7QqKtupjaJmHO6GId2CVeqJXJumWyjmVZk3ihZnSxVhWPqIk5pRG2 +jibA/qqsBW8Dwly4bRl7GcEKK3H3tua0pstk/TJZ54qsubE3F7ZZNWVG2KMSvJKyAxYUlKtv +SnNnWx8A5VQjxgRQjXJefnY40v4S2G2tCdqdoEi37JIwxQ52rMta5d3Xz1WrBnZqg9s7WQbE +NffnrclasExuWQTs3y5GeiXKEeV2Tbns4jAvf3v4tzFFQjq+XFdSFydZb5j9MF4MQzkbB2NB +VzZDudrGFEc3849SDl9H1VuWNS59KDiwh2aqVCl36sS5nLJwMGdJZbH5bcPTYFVgkbLMbQg8 +vG3UKIdtVltsbLFWrTrDO5lbv4tP9yuujc2vjBqeqargJuSVR06tcuCsUJiTSwhCen4wJsYV +u4zd3IuRY2KLdeobvnD3snHxsOweK8ksDotJ9hZ15wDO+CHwdk3WGhnP2iHlwC7mFJ+ybMna +bRxNT38YC+PM6QsWNu82ZW2q8cevwF/95XTZcr1qxJgAqlEOtnluQ6i6GLOkGuXg35w9LMvr +E3LLIoXd2X2TZUhLATr5Od51DhPYsoZ4B1fzuQ9DxE5vcpEFUMZKOkjKFVXHPHh4HxAztdBH +AoJD0SfIEfWuoSUdaQXgg2WQ31nbGwm7cxjK1TV9knKARlZRmH+YS0i0B1PC4zyxwqtXrynH +GdS5oIc8LiqerVwGxgmW8i/malMAEBmZvsGSTLF1MPn98UNd3UvKgUdv3bplZW+EDVMuA5qh +0g1IK5WAUjiQBhMLfZhPdqADEu3OkSJk5V5+9nEpPqKeHCRZ/I4soI8dYJ9TGs4YLdRBQF6R +Xdbtxcvh50Jj3MGuSn7SxGI9KArKxaZ4l3MT4tJ8kSDz27Jik71TcgKZjJXTku7Ksvwo5bAj +4vkaJN2wT8q4IU988uyRckTvizqXHj/5DTORmCuX8Q91rhIkSTfem1JAplNchFjBnDNBYwKI +YCKkzHp0L1569Pg3WwdTZWBRcHhUC5JVM01QLiLe6/XbZ75BTm5e1vkVkUMzlZiIS/UpqIoa +nK5EYLvHSgurYzCTGQgb8URUZ2V8uvpAOkjK5ZSEu7NtxLM1PROlg9JKzPQLcaoVpaCyVHAS +kMS5sqzwkZ2TKbwcKiAqb40wxd7ZdEb2EcrhUIQVhHFKzg5kSlp+cGSC19Wr15WV6MI5XWcP +i6z8MOUyjNFSpdzkijz3we8i32HK2Gyti+dfx/B68bhPUt4/Va5cpneiDHNU0QQ4wO/ZOJj0 +TpYjY1Jc5mtEfSyui60RpWQUhoTFeBqbvSmsigZq2AEOcJ7Yx1VZc0ZhaGZR6Owmf28Zq00Z +Jx6/i3oNt4ZQCLqySuvj8ioikbjB9rT05WMm21/+u0j6gFm5ifrYqIvy1HuhBhucmOmvjFtG +foh8VJoLesrmAzFJzw/BviiXAU45bRmqFwXGlmr/jNhkGRPAp88fX1AZwwt/+thsnepi+C+A +WfwvahlrWl4QthyeDTvYOVocHs9CVg4ao5EyMX/rF+oMj2ds/nZ8qQ4HGxZrGyoICHfF2y8d +N4coR5TbNeWyikJRu3H44SiaWueiCkQksIZnq3CgNvfnwdFxWtOn1jhYJiTKHekPlvQOdAiM +cP3oLRlID1FJcfwvfCio44CnWsaaXYqMtUu5DJbfXrXlt7jIN+l9WZE1sXzt1DJWeb65yVVd +TC3NZCiH6tbYm8cMGYYfyquIKKmPreAlgmNMQgcKDUxVoDJi35u78gAK1HpeW+Yez8sB5gAa +s2t4TckJqm9Oyy2PKOfEA2vMbS3AsqmlPtyOf4gz/JKgM/tTPwovtCC/JebP2CI5BcDVMtYN +WeuSyjL4FalaxqoghrIwAdx2Xs5+RdasFlg1LuFI8A1xjkr0WlAcCVgALhEBBBJxqCg8Gw/J +KVwcjhYkC9zWjDpRqoHRS7R6s1sC8nKkg/NypeE+wU4MsnAYg3JRSWy07zHJ7MGZyjlkUvIb +unjI7HCgWtsZW9ka2TuboW5+9J4BjbvGutqACh6d5N01VsIAEPvS0JrO78xEulrXmKpECiZ6 +JsoAcGt7YzCnqS9vTsbfS2yR5gu7srvHS5jruXjtEBcNTFdgDjjAbDYaBWzP0GxVdnE4YgKf +80V3WXzba6wwujmlESV1sUwai/XgsCmqiUGjVlAZrTid+z4OaCWTswNsHE1snUxgYmfkW9hA +lCMdDOWYMZ37p/4yQjGOUpCBef3z/k/5fSP1gs4s1FzJOmd6c6f3kmnCXcHyiv9hMWw240wU +12f/3ItxxTkr0H5WcSpSfsZ+r3cF189syS9hMD+BV9gbeZVX/Lpq9BSj1grhu6a/cBR7Tbgr +WHEk1P15Q84mlxk/V81RI6TYWqZ80eYR5Yhyey84yNWyPObm1e23sOJYld+ov/VlIxHTE170 +hBc94UX6tpSj51iJckQ5ElGOKEeUI8qRiHJEOaIcUY5ElCPKEeWIciSiHFGOKEeUI8oR5Yhy +RDkSUY4oR5QjypGIckQ5ohxRjkSUI8oR5YhyJKIcUY4oR5QjEeWIckQ5ohyJKEeUI8oR5Yhy +RDmiHFGOUECU0zTELcua+iXlf+1F83xWceiWrH12Z/2MoRqiOm/K2tj+9qdO/km5l6+fzss7 +LBLKuy4/SnAbV1R5xGRN1mJtb3L69AfKndYxtzZYlTXPywTyzp12sB6EbkHRJ5K8z+EPlMMf +5B3gsClrx3zNaUSIckQ5DSwgGK8jq745raAq+tq1P3tEh+UICHcVduTUCFPUhnz6yLG9xumZ +KKvkJwk7sq0djM+dfV+jdXT0Hj/5va4prVqY3DyQP7XGOTqUm5J3yFmMmPA7sgyMXp0/p6sk +/xuDF7z2zCp+UvtI0d/GBAs09+cjgHVNqY/++B0hVf5BNg4m+IPwE72TZRoSW6IcUU4DC4xW +eKzniePn9PTeuzhluXTpyqnT59++ezG+VPf5QZalm7wOcdGt27fOndNVjo+jLBcvXjp79mJx +bexHx0o4rGV2i8/vyEQ0LlzQU4vJpUvy0R90dS81tKTP/t1ogMzYRmAawrj9Dzp37uLtO7c7 +xcXSPXQLT5QjHW7KIRtCrnr/wb3zH1IhZYGvQ+UqrIpakIl2ckYuOMrt5PFzaiuRn0E6dcHY +/M30OnfySJ2dW5UDys3L+uSJj8Tk5InzTm7ykQEnVv/+VMDUOtfI9A3C+JH1HD8XEu2+uIM/ +iChHOsrn5RZljVFJ7FPbKtHZszrvjF8hFZLsIBuSykdkKL17787FDymV0m+An+WchIWPjbNz +2O2coLE398rVa8qzne+bD93LCAu/M2uH5hatTFlDPMKo5gmRvd67fxfpqoYYOaIcUU5zrz5s +cAemKx78dl85mp4yGyqqiVnYsU8ALUOjPZSXHlQvKUo3eEfxMqtiPC/FMNwX1Myts4cFnN4O +L7MidPiPTMzfnv1woVZ5mTUs1kOjLrMS5YhyGluWYOcS2aqV8YuMnKqdu3P3jvIM+SW9Kxfk +Ri7+CBq593ZOxpfbuSt/2jndLzRyH+ycUG7nVE57Ish372mWkSPKEeU0287x+qcqHjy8r6Ow +c4yRK6z+AiOntHMh0e6nPtwvB+9hYgEjd8TOyG2zc+5sm9MnL/xp5Nwt5YNOfsn9cgjg9DrP +WMXOIcihMR50vxyJKPcldk4EO8fkm2fPXPxSI7fdzqmckRMdUcR9uNja2JvD2Dm9XRk5lbNz +cczZOcbI9UyWapSRI8odmGZmZvz9/aXSGeZtbW0dj8ff3Nz08fH19GR5enphQiwWq35lcHDI +w4OFwmJ5BQYGT05KMLO7uyc3N0+5TH5+YVtbu+ZTDlxCDVpQGbd9h2VV1jy52vDk2aPz5y5e +vHipRpS8JetgRiD9oiKTdcSn+Z45owPXYetkgtUiHd7F9nysCKVb36xST67Wz8j4uwjIoky0 +JWv3D3U+c1oHhR1gvylrX/zy3UcYEUwbB+OzitgmpPvJ5H/QvgRWNLtPtxbvC+Xm5uZ8ff0k +kinmbX19Awom/Pz8UUOZKjw0NKT6leHhYQ+5mCocND4+jpn9/f05ObnKZYqKiltaWg4H5bCD +N27cws4yb2Nj49LS0hcXF1+/ftPa2trT01NZWW1lZY05yq/U1NTa2Nj39PSiICwmJqZLS0tg +o5ubm3IZFotdVlau4ZQD38QLNQVVEdHJrOgkr+jkLyvJWX76hs9Pnjh38/aNqCRWbCr7S9eA +kpDu4x/mdPGi3pnT5+1djJMy/Xaxku0F25OQ6SPszlTc6n+gd8AyQ1EDcfUtKfHp3tiSL934 +xAxfTz+b8+d0zp3Tcfe2wtvdBQHBtHM2Pn36vK6uHoKMUO9DbBW7U9oQgwx6ZouvHJz6G1Ju +cnLy2rUbLi7va19iYhLKysrKy5dvmptbUIVhXSwsLAFD5VcaGjio1Ioq3JOfX2BsbLqwsNDU +1Ojk5KJcxtfXH6DTUqxhZ8F2Ly/v6OiYurp6iUSCXUMQyssr8GlSUnJ2ds78/LyNjZ3yK6am +pmNjY6qUCwoKUomGX2VlZXt7u7e3j3JmUFAo06BoLOXmZEJOa5qhyRtnJ7e4uMSMjOz09C8r +mZk5mVnZ9+49CAoKzssrTE/P+tI1KEpWYWGJvb3jixcvCwqLd7UG9YJ9SU3NDA4ONzI2Ru3e +RSq9t1sKeeL5aleWhZmZeVhYVFpa5pfHNquoqMTE1Azbj4m9hAIhff78pYOjE4K82z9IJbCK +15iYeHs7R3Prd+3DhfK7lJcPmnKonqh0MBIxMTGojNPT04oqbF1cXIJP4VJQlpeXbWz+XC3+ +C/g35VsOh+PvH6hSW4NLSkq7urq8vNjKmcHBoQwTtE5bW1vYkaioGDhYA4N3MTFxCBHmIAl9 +9UofPM9Evc3OWV1dff78FTLZwMBAKyurkJBQ1ZUgsPhI+bagoDAlJbWjowPwZOYAiYaGxrGx +sX19fQsLixpIOekmr3Uw7+WrF4WFpZMSyfjExNj4+C7KxORkUXFxT28vVrK7NaBIpqdFjY2V +VVVT09O7Xsn2gk0aGByytXGKSPA4sIu2yOKn17mObmbeXgFi8Sjis7uNRygaONz6hoY9xgRf +R2ARXsn+xRZHy8SkJDEhzdRS/2+fc9kXyk1NTcGVwXQNDg7iLSpaaGg4qAUPFh4eOTMzg7QU +NRr5F6bz8vJBuc3NzZcvUYUDUIXhWAICAlVXCMopaysExCUkJHZ3d7PZ3sqZISFhWko5JJ6g ++uLiEqZLS0vhbJHOOzg44W1GRibYlZWVgyQUDYGBgWFVVXV9fT1eYYYBLsAtNzevqamZw+Gq +Ui49PQMFXk4ZIvhDU1N5U45Iurl5oISFhaelpWFVvb29Uql0Y2ODWVLAb4qMZ6/L2ibXGr6o +04m9P6jF8rWJiU6YnpH2DwzspYyIxQNDg3tZQ19//9DwMNaDiT1uzPZt6+7pNTI2auzNPpgT +70iQS+tj4CuAAuzUXmIyPDKCsseY4OsIArZkf2M7MDgIfrI8vWPTvOf20ILI+x9YbnBw/Avl +1tbWwFGhUJiVlR0WFuGC6ufmASuC2jo6OgoHgprFpJ+oUHFx8ahQTBVGzfX29gXlUB/X19cN +DY0qK6uUVRiHGNIrVGGRqBErR0Kq/EUYm+TklO7uLuWZK4XBC9nJSScNFLJ1pJ+jo2OK5DQF +IUIzoUzGEYrXr/VBP5g6Ozt75bcQZGToiBXCjhAhqVd1d2gp2trax8bGkfYqZ9rZOfT19TMJ +MhodLpeH7yJHBgnxr6Hp8fX1TU5O9fcPdvey6R8rH12snd7kAj6LilO7mMYBsJPOPXZ3xWF4 +vsrazry5uRX1aH/BomlFMjUVEBCakOlzMI814R8MjHBJSkqDizvcgRWPjlZX19m7mEu3uF/U +QGNhHNvSLR5itSxrkqxxbW2tYNJQrVJT0/z8/D08PFBHAgODYckwUywWw3UoaxZDOeZqAmiG +OgX/5uTkxHzq4eH56tUbpFdLS0uqGSsgmZ+fX1tbh2ooEAhRADHlpw4Ojk1NTTAnqMKbmxvK +eg0DqaXn5cArS0tr5Jhv3xogqopds1Zmmjdu3M7NlXu5R4/+AAOTkpKjoqLNzc2x2J9pZl39 +q1ev8RH4D0LCDG9ubmE+vLGHBwtrZrN90KbAM390A9bW1pHLNDY2AadY/rX+czeWlY2DsZuX +dUC4S2Kmf1l9fHNf3sB0xfSGnHtMmdnivefe6j5c2OqZLLFzsO7rkzfKh7syTkxOxMQkRiV7 +HRjlvPztiorKxGOjhzuwwyPDAkGjg7PV1PrfpCE4aHHIzcr4TJ9aMNX9U+W8jszs4rDQaA83 +lvXDh7+xWOzg4FCACC4COfHW1tZnqjAslrm5JSoaEi5UQ3g5Cwsrprqhnl6/fhN4hJf7448n +sbHyKhwTE2tmZsFcSGXE4/FevHhfheFt4OuYr2MbYGmwZpgQbJKSeFqnnp4eGFeQKiIiEsn4 +yspqS0ur8tPW1lZYLwS5uroG5hYeGO3C/PzCX28+mS0tLcNHWIDH46t+hKYnP78AK9/hxggF +zRHx7IUNUddYSX1zalZxWES8l5efvZ2zKYqjmzk70CE2xSe/MorbltEnKWduj1+UNcq5J+MD +g7u4oI9DrneyxN7RRo1yTHYD8zMpkWhpwcaPjY+pZmcKyiXEpLIPjHLsAPvtlBscGtLeqCpj +q3pWAZTj80VOrtbbKSe/J3mDqzhQRYoH0xp6JkprRSlpecEBYS5O7hZ2TvJjOzDcNaMgpFaU +amVt+XmsbavCvchDUcti5IqFu2tpaVGuob29nTl9B+eG7FVRhQtmZ+fULkEqqzCHw1X9CGkX +qnBNTa1W3zoCXMO+wriiOejt7dWEu4JXZM0gz4fbq4Tym5HkdquM35FVVB0DynkHOLh4WsLv +2TubsvzsQmM8MotC65pSO0aKRhdqsDzTSs4pUl2J/BRfwy4oh+y1praW7Q0j6uPt46uNhcXy +wpGrmoZrAuWAuI7OztCwcDbbW0sDi+3GgVFbV6eMrZJy0xuwag048OYUxyFex5fq2oYKK3mJ +8em+PkGODi5mto4mSFWCo9xzSsPRXvdPV8DRMRnr9CZf7bzc3yo8PAJZraIKm3d1ddFNvx9V +Q0NDWVnZ5OSkxj77wJh86RZPecuu/GTabFVzfx7y2aSsgMAIV2cPS7nlczLFRFCkW3J2YDkn +vmUgf3iuGt9lvoWvS5Wp7t9RDu21q5u7r68fmjktLUhAjIxMUBOV+6UJlBsdG0NGYGhoXCqX +tsYW3sCT5QVHp6Qcjydy9bCdlwnQ1Db35aFFjk5ie/jY2isOS3dvm6hEdmFVdGNv7sh8NY7D +RcUByZx7YU687Pp+OS6Xi7xV9f4u0iF4wksxGgKHaTEXFGfqkBGIF2rahguRC2QUhoZEe3j6 +2No6mVjZGYF73kh1U32KamKFXdl9krKpDY7yiygD02XbKTcxOenm5t7U1KS98VxYWLC2toV3 +0jTKZefkBgeHaPWxilQOlENTqKRcU3OL/rs3Ht7WTJaBQy4uzbeCm9g6WDC2VMdYu3nFibhP +5Rf0hBdRbid97DC32SsuzjZiYny5rneirKElPbcsAi0p0lt7FzM0rKCfl799RIJXdkk4rz1D +1JNl72g7MDCkRjl3d4+GBo42P8kyoZmUy8nN8/cP0OpjtaqqmuXFVqWcSNRkam5YLUjqHith +7qJR3CHAR1u8w/4WiHJEuV08O8mkugz3mIK3/ZJyUU9OcW1sXKqPX4iTi6eVmZXB7Tt3EhKT +UAGJckS53VEOGauLu618KKLNXd71RJQjyu3X3fjyU3ybPKapZS7Odo0WmZgZcbl81TtX94Vy +Kysr8/PzCwphQnn/89raGmZ/6u4aLKz6mCFRbrsQyYUPQiSXlpaY+Qgp5qyurn70Wwj77Owc +Xr8G5T51jZUoRzpgyn107Ia+qVJHZ7uhoZF9z1jDwyMuXbqCoqd3WUdH948/nopEjTL5QzQl +V65cV+saApqenvb09MLC58/rGBmZdHZ2EuU+qqam5lu37ly5cg2x0tW9dPXq9cTExK0tmVQq +vX37bkpK6vavZGZm3717/9y5C/fuPcjPLyDKkY4O5T51jXVfKMdme4NXgYFBISGhwcEhqIwP +H/4OH1JYWPjrryf7+/v/auEWX716c+LEKRbLCwuj8l64cHFoaJgot10CgQCBsrd3QGBR3r0z ++vnnX5uammDqzp49HxMTq7Y85vznPz8aG5sisG/evP2f//lXZmYWUY5ElNs75cArOAflWxsb +W0APGVNJSenp0+cGBgZUF87Ly//hh5+Ki9/3byMUiry8vEEqotx2CYXC48dPtra2MW8rKiq+ +++77srLylZWVixf14uLiVReemJjQ0dFDKJi3ICECy+XyiHIkotzeKefn53/mzDn4t6dPn718 ++Qo2A3Nkip5btlMOxg/518zMDF192AHlRGgv7ty59+jRHzDAV69ee/z4yfS0dHZ2djvl+Hz+ +r7+eYHoi+npXH4hypKNJOV9fP1RGGxu7u3fvnzp1Njs7h5mfn5+/nXIsFhspLeopUW4nlDt3 +7oKhoZGhofHPP//i6OjEXK+ZnJzcTjkejwfjV15eTpQjEeX2nXJeXmzwTabo+uDatRtPnz6X +SqUKyuWBcmrPmyQlJaPCMpcnoJaWVn39d93dPUS5T2es8meu7e0dTp8+yzwuLZFIdHR01a4+ +DA4Ooonx8fFj3m5tbVlaWtN5ORJRbr/Oy92+fXdlZUWm6G70++9/dHPzYDJW1Lu0tPQqhUpL +y1ATJybkfVnfuHELn5aVld279+DUqTNqfo8op0o55tFyuF+krrDBsHPz83OXLl1xcnJmAgv/ +xucLgDVXV/effjoWHh4BOjk5ufzP//wLbQpRjkSU2zvlsAaAi6Ec5OnJ+uGHn5qbmysqKo8d +O/7rryeOHfsV5R//+N/w8EiFf2t58uQZ6iMWu3PnbkNDw15+/RBTjs/n//jjz8p/p76+AW+9 +vX1APDQTysD+61///u23RzJFt+EAHcCIwML4AXfKexeJciSi3F72SCwWd3V1Ke/+XV5ebmpq +QvYK19Ha2tbxQci8mLHPoPX19fb2dqSrCwsLdF7uU0JwEDTVTsCQ2iOSaFC6u7sRQCawbW1t +fX39ym6I+vsHmptbhodH6LwciShHT3jRE15EORJRjihHlCPKkQ4B5QQCofbGUyqd0diel4KC +grX7WK2rJ8qRDgHlPDxZ6ekZvVorDodraWk9NDysaZTLLyh0dnbt1WYlJaWwvX2IciStphwO +YDbbW1//HRydlhYrKxtTU3P54IkaRrnSsvI//nji5uahvbF980bfzz+AKEc6BBmrUCjS3njO +zMxSxvqV1NDAoYyVRFcf6OoDXX0gypGIckQ5ohxRjihHlCPKEeVIRDnNpFx+fr6bm3t8fAJz +7/3w8LC3t4+XF7urq5tZYG1tLSwsPDIySrVr9I2NjdLSMjc3DxbLa499oB1WynV2diKMCKZY +LJYpekGPi4tHqAsKCpXLlJdXuLq6qfVB2tnZ5efnj/lpaenKTtSJciSi3K53x9ra5l//+vel +S1eYvkcyM7O+++77H374qazsfRdAra1tP//8y/HjJ7u733NveXnZzs7+xx9/vnbthp7e5Z9/ +/hUY/NTwEEeWcsXFxQjj99//mJubJ1P096Kjo/vPf35na2uvbCmePn32X//135GR0cpv5ebm +njhx6sKFi4gtwv7y5WvlU3VEORJRbndydHS6fv3mo0eP6+vlD92zWOxHj/5ALUMFYRZgs33e +vjX4/fdHkZGRzJyUlFTU3+TklNXV1dnZWUtL66dPn++6x7nDSrny8nKE8fHjJz4+vnhbXV39 +22+PwC5nZ1dmAYFAcP/+QwsLy2fPnjNP5Q8ODp09e97ExGxiYhKxRYujq6u3F6tMlCMR5WSK +fs9QEx0cnMLDI5C0GhgYMp1qMpRbXFy8fftuRUVlaGgYquTa2jpmYhmmDw1GqI9wd5Sxqglm +GGH09vY1MjLB26CgYEdHZ4QazQqzgIeHJ3xda2vrmTPnmHuBgLVjx35taWlVrmSPo6QR5UhE +OQi554sXL2HPYMl6e/tev36TlyfvIpihXG1t3Y0btzAxMDBw5sz5pqZmTD979oKpuXT14fOU +gzHLzy949ep1X1+fubllamrakyfPGMqhXbh7935lZRWmYZ7ZbG9MxMXFnzt3YXh4iK4+kIhy ++0s5VD3g6+XL1yEhoQ4Ojo2NTSdPnkGGhU+RXiHtCggI9PJinzx5OiwsHDPfvTN6+PB35Rq6 +u7tLS0t3becOMeVOnTrD5wtsbOxg5N68Mejo6Hj69Jm9vSPTfPz660kYacT23r37v//+WHFS +Lg9errm5RWmSc3Nz1fpqJsqRiHJfKtRBeLOFhYW3b/V1dHRhJ7q6uk6cOFVf34BaduvWHeSn +ICHoB8vx6NHjjY2N7OycH374KTExCWSbmJiAFYQDkUimiHLbKHe2t7cXIUVg37zRn5+fRwwR +SXzq6uqO2Do5OSO25uYWCCAamqmpKUzAJ4+PjyO20dEx//jHP4uKiohyJKLcXiiHOsUM+mBr +a/9f//XfXC4PFfO77/7T0NBQVCS/Sjg4+D6Bwtv//u9/VFRUrq+vg40//njsypVr58/r/Prr +iZycXMpY1VRYWPTvf/+nt7evvr7+//yf/wugYebt23dtbGxBs+PHT0ZGRjFLgn5wfWAdphFJ +NDFgHWKL4CPOyj6ciXIkotzulJ2dDVcmUzzz6O3tMzMzOz097ePj29/fX1xcgpq4sfH+FhHM +xwIVFRUyxV0QJSWlnp4sLNnS0kLn5bYL+SmCI1UIcePx5JdK4+MTENW+vn4Wi616m1xaWnpY +WASaD5niRjv8roeHZ15ePjOHKEciytGzD/TsA1GORJQjyhHliHIkohxRjihHlCNpGuVmZmc9 +PDz5fIH2xnN2ds7KykbTKDc2Pl5QWBQQEKjVx2p9fYOHJ4soR9JeyolHR+MTEh4+/M3MzMLN +zV1Li7m5paWltUb1FQzk4tVWfifhU+0NrIuL6+vXb4OCQ4hyJK2mnImpGY/HHx4e7tdavX2r +X1NbOzwyopKGf2PKDQ0PC0UixFYsHtXewHp7+7DZ3kMqJpkoR9I6ysH/2NjajY2Na3U8HRwc +m5qbARZNo5y94vZd7VVyckp8fMLU9LQysEQ5kpZSTq13Mq2TnZ09kKKBlLOzd9DqwCYkJMbE +xE5MThLlSEQ5ohxRjihHIsoR5YhyRDmi3OGgXEBAoJ3dx2t3Xl6+qan5HvvoPrKUW1lZMTIy +Bnk++imb7b3v9+YR5UhEuY/KzMz8wYPf1Gaurq6mp2ecOnXm7t178/PzRLldCK2Dru4lLy+2 +2nypVOrl5f3vf/9gv9/WkShHIsp9VDY2tk+ePFObGRsbp6Oj9/Tps99/f7ywsECU2x3lbty4 +5efnrzbf1NTs1q07t2/fZTotIcqRNEE8jtA/1GVR1nh0KFdfX49fjYqKRmUkyu0j5ZiuXWDn +DAwMEXmiHElD1NLc7uFjOy8T7fo40TrKMQoMDCLK7buXY/TixStbWzutoNz0Bnd4tsbZxZFQ +cIjV3dXr4WU3JxNOrjYcSso9e/aCKPc1KHf9+s2goOCPfvry5WttoZx0k9c3WeHm4UYoOMQa +HBxxZdnNygSHknJgzoMHv3Up1NkpL8oBHYhye6Qcoufo6PQhtp19ff3KQWy1iHIzW/zOkRI2 +m00oOMSam5tzcrGe3uBJ1g6nl/v3v384duw4yk8/HUNRDrbCZntfvKhH11h3p8XFxVu37iCe +TGy///6H69dvYSbz6cOHj0xMTLWCcnMygbArJzgohFBwuOXkbD8yVzO9wT18lAPTiopKyhQq +LZWXmZn3w0nDflRVVe2xj+4jS7mNjY26urqSklImtsXFJbW1dcxg0zJFd/SNjY1aQTn8KSW1 +CUmJqcSBwy1fX9+WgYJZGZ+efSDKaay+EuUWZKLYFN/ysiriwOFWdHRctSB1QSYkyhHljh7l +Gl1ZVu1tncSBwy00ZFGJ3gd5y9xnKCcWj2p1MO3tHTSTctre81JSUvK+U06y3iBZ49o6Wu37 +6VmSpkksHrNxNJ3dOrjLrJ+inLmFZVtb+7z2am7e3MxCMylnZm6JzdNehYWFR0VF7y/lZrb4 +HSPFXl5eBIFDr62tLScXp6GZ6ulN3gFTrr9/ULWvYB8fX0NDY2trGy0toLSFhWVnVxfTCbkK +5RIPknJe/vbFxeWqPaJ3dXdbWVmbm1tqaWCtrGzevNEvKi4eGx/fR8rhH8kri0pNySAIHAWF +h0fWCA/u1Bwo1zdVamtv1dXdqwoETPf09nb3aG/pAbRVx+tBmZRMRkbGRiezlg7knAAo5x3o +kJdXNDo2ptwGZquwedob2L7+frXADo+M8PlCO0fzqQ3Obii3Kr/04M62aW1pJwIcBYmETR7e +tgsHYjZQkBrjsLSxN62padheGbW9qNZEBeUkzs5uueVh8wfSiOBXYlK8ggJDVTsPPxyx3R7Y +zMw8N7b17m4PQOaC/MXG1lp5Awzp0AuZwaC0SnpQSSt8Y3KOv7WVA3IQgO5w8E2twJpOS6X5 +eUUm5vqjCzWSdc4BBHZ6g9c+XPDm7RuBsHFySsKMmXj4yvjEBPydgYFhjShxdou/y3S1PDoh +Ppnq/tER/u68sugDu9I6udaAvNXT19bS0raultPXN4DSe1iKfHf6Bzu7euLikl++es5rT5+T +CSaWD+gSNuxcXkX46zdvMtJzurp7+/oPW2zxWl5ebaBvFJXE2p1DRjYxJxPaOZn29w1S3T86 +GhkZNbcynl7nStY4B3Z2Dq1wRlGwhY2RlY2Fq7uzq5vTISnuzk4uDhaWpm5sq/aRAjniDrBj +KwZ0gq5MJ/nwsKbYkkMWW2tbSys746LaqLndPn+NLzb3F7i50EP6R04BAcGK24NFB1YZcYjO +ywlQ1zdV2ic5VKVXUjI4UzEj40u3eAeMuPe3SSh+ekBafsgCKy9TpZK1+l23HZOK6w6ePnY8 +rpBq/VHTQP+QtZ2J/Ma5A3xyX5m9okgOUWF25yB77ftoIyI5jIGdkgd294forPw2uRI7O3uq +8kdTbJY37NziAdo5KlQOtKzKrzuw/R04DXyq70dT4pFRUzPDyZWG6XUu1Qgqh68syIS89ixn +Jxeq7EdZKSkZCekBywc7EgQVKgdzwWt6nWduZTjQP0Q1/ShrY2PDwsKqY6RkXiYYp6pB5RCV +JVljUmZQXEwCVXNSR3uXuZWRZJVzkF1rUqHylXNVkaAzx8rCZt+7TiVpqbIycwPD3dD2HeR4 +EFSofK37arZ4owt1JqZGI8OjVLtJSrFY3gWVMcsHOyA1FSr7/9TbOnd2S+Dgal5RXkP1mqSq +lZUVKyubWmH6El2JoKK1RbLGQa6KxCQuNokqNWm7pqdnzM3NhV25BDoqWoo4JCPx6f6BATRK +F+mTEo+MmZmbCDpyCHRUtO6+kUWZKDEziM32pYpM+rxGxWMWFlaV3GSATrJGFyOoaHoZX66X +bvHmZMLQaM8Af3JxpB1pfn7e0dEpuyRyQdYo3aTbS6hodJmXCSdXOO5smxi6NY70JVpfXw/w +D/bycxhfqj/IYQ2pUPmiE3HIOFr6CyysjAvyi6naknahgrxiS2uTpt58HEvTZOqoaFKZkwlm +ZcKckkgbG5uurl6qraRdq7u7z8HOMTSaNbZQtyhrPJiOvqlQ+UyRbvHQ7Lb2F9o5mYWFRq6s +rFA9Je1dWVl5VtZmJTXx0+vcRZloilhH5Rs91AC+DUmrw2O97OztG0UtVDdJ+6iJcQnaTRs7 +i/zy6PFl+aPQszI+PRFG5WDuEpmXCXHI9U1WRMR5WVlb5eUWUpUkfSWNjU5ER8Vb25r//y1f +N+PG4z3Agu4ruLgb7cmOIuoiYAX67s8ZYOH2FbS9+vSpq5unzurs6OrYs2v/r1+/RnPiKKA1 +ePcOdCVfX19fW1f9lj2Lrj3c8+YnaGcNMEECkyWw0AOmT9CJ1r9Ogy9jHUWjiAACJhXQcXB/ +zwATD6TZ9un/+aefjp2+thnYeGtta5g1a+6Z0+dHs94ooD948ODx5k3bpk6d1t7VMnFa68ad +849f3HDjyd7HH468+AaskU99+Hf2/SgaRYQQMKm8+Hbi4dvDVx7sOnBq9fJ107v6Gts72ubP +W3DwwJFPnz6N5rVRMODgz58/d27fO3L4+Lq1G+bOndvW0VpTV11VXV5YkldYnDuKRhEuVFSS +V1yWX1NXVddQ09fXs2DBoi2btwObbU+ePBvNVpgAADfb3Qk= + + +eNrsnQVYHHf6x7metHe1VK5tHHdd3HaXZY31mRXcHQJBAsEhgjtrWLRpY40QJ+5pFFjYxUKa +5urX1NL04vOfBWp3aa/t/xJ26ft5vk+e2WFm9jfvbz47ml0MAwAAAAAAAAAAAAAAAAAAAAAA +AIDfL7dv3zp88OjubQd2b4dAdDvb9nfvPnzlyhXQ9qcYGRybafY0LdmQEguB6HToScaW/s+m +p6WDtj+FumeEHGz2+qeSFVfFEIguZ90/Q5JW2WdmZIG2P4Wmb9RXZNo6irT0CiAQXU7biCha +ZpuVmQ3ags4Q0Bl0hkBAZ9AZAgGdQWcIBHQGnSGgM+gMOkNAZ9B5uqUPkfUj8gFEqvp+pFSF +SL+fQDAxwURkql+xZHw5Pz+NtG88KugI0Bl0/h+4LO8X1B5nVRxhN/Yg8nFV5RpU1ito7pl0 +ufkir+poQOUJds0pdsURVu1ZPj7yFyxZ0HyeW/c2t/lnp2lRaZdfd5Lb1APmgs6g8/9vv6zi +Ztc5kdlz3Bjz6NnORafwjUdY/qabL8sm5xBPge+L1cL6vb6MkLn2Hi+bOL1CYBmHKOmKK+LO +dyQrxkQKXP9+tH10/OVVcceYeMUVkVIj7HhH3DkmrNrum9BOrFOJOi6LO65IOsdEMq2/aPsV +fGJJ27Cw+Rg1pdaz+ABjwRKf8gtI67AIH98+IsQPDGQaYftlcSf+chiVgs6gM+j83yIdEMqO +ED18TZJ2ctv6OJmdnvlH+XUHyNzQuXOtTDIO8ZTqifogrVfQguW2rDjnGg1uK1rXTQ5KtmAW +uJW9jTQf8w+vcuRFmzIS7UU51tQct7y3iMJkm4RNAbX7yGnrKFUHaUkNBFGyBbfQo/IS0nyC +Gp5tRY+zWbibXSy3NjR8SbDcK62OXNuPlK1y848wDaonNWrQ8s3eEcsduJEW4R3U5oHftdGg +M+j8i6JCFL3sxAJrd5F5SJ1HzpYAuRqtP80u3030Q2zT93IVP9C5sNKOk+RSNyxRnqXxuPO8 +g829ubMcEzzL1jsbEg1DqxxcjF7xW0RgBc52S3SML7F2iXVOb7Sj5ziXvOlGoM6WVLvSaSYh +DZTsNhdaqj0SOc8t0j6rw9WbbBhR48og26evdXMPMguuc+OGGolWU7NLjK2FlvHl9h4+ltkH +tMcJoDNoCzr/l+CHyiNo7VFmXrubJ32+aHUAflTcfsaPyLX+oc7KMbSgwo6T6FI3Gtiy28PC +6RWvKAtGtCk3z7dwnav9AreGgQAJzTrzID9vuRmtgqQ85UeUOCTU2nOKXIvecGem2lVfFi5M +sBEt9s1e7xVW5y6OmmsvssrdSAyKdMjfTkZ4DuF5puRCr5UfhRQq7ezzPDLKLTm15A4NU+Br +kdr1XUtAZwB0/smD7fp9RLTMOXsbs+4wDUk3pctoHVfEyuMkT6rlgt0/0PkKmrfEhhFFqB2W +yI6RqYhF4iZG0Vqv8DbakjcI5vHO1eeoPE+LtD2czCITdi1ZeojoKbCPq7Rl5DoXrHWlJdgs +VwuSI63FGW6cNENiiVd2rTWBb5a+zofNNY2TebD87ZNlDoQw66zt1NAkY3ozOavMjFlBlF+g +st3NQGfQGXT+JQfb0h52VrMTiTnXlW0U1ESqvoTIB1D5GZokyzXvME8+eYiLKIaRJR3uUeU+ +dQNCpQZZttbNnzXHKdgqdQendrdPQJVv3QVmXIpL/mFukZIQvYYmPUGVFHhmr/KIkvku7SJG +VLlX9wtyl7klKan5Kwje7Hm0NCvmYqeCg4yoDAt6qn1omlflJV5mtR2BOYeZ41bZixS3EqJW +UmUXmTHJzosPfNcS0BkAnX/2RpUaVWjGo0a1V557tCOVg+PD303Wg+/KtdNMvMRnwSdQ4rP0 +I1IV2qpBtMoPaWeR4ZPh6k0sAR9Wa2894zOOX6xG5WrtxwX+J4VG2IpPgP9pUIi/r2IQlfZp +J1OOt+T75UwsVgVXtkFn0PmXSy34RbeS/22W/8/bPYrFgs6gM2wwENAZdIZAQGfQGQIBnUFn +COgMgM4Q0Bl0hkBAZ9AZAgGdH6/ORIlZ51WhXI1CILqcFe9IYpV2oPPPoO4dtia/WHrYJ3+X +NwSiyyk7RGIXzkxOSgFtf4qPPvqYj3CFQVw0EPKrExiGioL5UIfHE3wr5aGsjo4O0BZ4FHz5 ++Q0oAgBMD8rLyy9cuAB1AAB956uvvpo3b15ubi6UAgD0ne7ubgMDAyKReOfOHagGAOg16enp +uM4vv/zy2bNnoRoAoL/885//dHBwMBhn2bJlUBAA0F+OHTtmaGj49NNPz507NyYmBo63AUB/ +uX79ukaj4XA4Fy9eHB0dvXv3LtQEAPSa0NDQb775BuoAAPrOvXv3goKCPvvsMygFAIDOAADo +DiEhITduwHOeAKDf4BZ/9NFHCIJcvnz5008/vX//PtQEAPSUPXv2GBkZPfPMM/i/ERERt27d +gpoAgJ7yzjvvzJ49e+IxksLCQigIAOg1UVFRuMszZsw4deoUVAMA9JpNmzbhOvv4+MCRNqA7 +3PrX7a8+/+YG5FdG0z/y4vMvL0heePPLW1CNxxB8K7154xZcdfwZrr37HsHdliIgkHmQXxku +YZbxC06+Zn58qMbjCEXg7OZnXVFRAdr+FAM9I67c2dIhVv3FAMivSsMlVsFWSvUZfACq8Tgi +G+SGNJqmLUgHbX8K7fdsi03bxrQ/Kwz5tZH1ayPtE0ApHkPaL4tj5PA92/9NZ/ja/EfxA80Q ++Np80BkCAZ1BZwjoDDqDzhDQGXSGQEBn0BkCAZ1BZwjoDDqDzo8mUtXkfWeZarJ6ky/H70RP +TvPdvekfv/zhNBDQGXSe8jRf4tWeYlcdY9ee48vHhW06z60+zq46wWnuQxT4mH5UpuLXHGdX +n+bJBlAZ7m8Pv+40pwofc4YnHZh0HAI6g85TGRXa3s8OjjU0953lwp7jHGaZ1s2XHyF6+L5q +z5jjQp/rn+dWdg5VngtIyLN0Zs5xYhsHtfnLxtDsPDMbj9ecWXMcWKaRK+gyDQrFBJ1B5ynX +uaOPwRJbhqxirfpAXCS1c070qNzt5cayKzqHtPUFBMaYccq8U8ut/dPca/rRuh3erCxCyQVu +aryZuILcdi2wepMHJcC66Dyq6Id6gs6g81TrrGLyAs0CyrxL9vpH5pj75PnW7vH2FDiUnkc7 +rogqV7swo0xoYWap+3gdQyh+ptx8ni8b5qckmjLSnAt205KX2voHOi7rQeUqqCfoDDpPsc6d +/QF84RwT3zneYkNShlPpObR5p5eHwHHJJeGKd8XL2wjMaHNWgnniLm7nqFAxKFT2CWQj/AVJ +881dZnqKDD3DbDP3cBRqKDvoDDrrwsE2PQC1DHudvfr9wPYRoXJIVL/dw4lilbEvoHovmRNp +Ftjil1lp4x3sWHSEVbzWnb3YZUkvLyXGTFLt1/GPoM5RkWIAag46g8668B+ptCfIkYudkzax +FIPay1nSAbTlCNmfO4cQMMeFMZ9X7VOjEiousJMLrVzxMUKzqLV0+aggZ6lTfJu/VI3CNW3Q +GXTWqcg1Pz7z7UNwteXae8qoQq29LSVVIQrN+JgBfIz2tpRMrX0JpQOdQWc9+M/O2u8xEPzb +8yH/OQYCOoPOENAZdAadIaAz6AyBgM6gMwQCOoPOEAjoDDpDQGcAdIaAztNMZ6LErOMdoXwA +hUB0OZ1XJLFKO9D5Z1D3DttSXl52glTcTdSdLD9CLTvop1NN+n2mpJu47Ai19ABZJ7aK4xRe +6eyU5FTQ9qf48MOPWBwGX8LkiXQmYqYniUDnkHSoSb/XcIV0Es2TJfDXhcbwxcwAHlWpVIK2 ++sWirMU7tu+COkw5d27dS05M7bnYB6UAfhuff/65jY1NREQElGLKOXPmzBNPPLFmzRooBfDb +6O7uxjchExOTzz77DKoxtTQ3NxsYGCAI8uDBA6gG8BvIz8/HN6Gnnnpq586dUI0p5NatW25u +bnhfzJgx49q1a1AQ4Nfy6aef4vtlg3Gio6NhpzCFXLhw4Q9/+MNEX7S0tEBBgF9LT09PQEDA +7Nmz8f1Camoqfh4NNZkqNm3axGAwDA0NbWxsSkpK7t27BzUBfhX/+te/bt68GRUVdfz48S+/ +/PLu3btQk6niq6++unHjRmZm5oYNG7755hv9P1L6Bhscwr66ox28cxO7/j52H479HgeJiYm9 +vb1QB10gPz9/9+7d+r8e97H2NOxZG+zYR9pX/ziDbSrG4HDjsRAfH3/+/Hmogy6Qm5vb1dWl +3+vw2WVseSz2/F8wA1vszD+1Yz7pxdbkYNdvQP+CzqCzXnEPk+Vi/igWz8eetMJOjet85zPs +6Gbsg0+hfx8DYampbw8OQh10Qufi4q4DB/R7Hd69ht14gHWVYH8wntRZN1GrsWPHpl9quNyh +9vZpuWp6l9zg4K6KCj1ehUuXJmVZv1jXdaZSMQMDCOTRJdfAoEuvV8HWVm90TknBTE2nXz5+ +7rlbc+dOy1XTpzg6Yh4epbNmHbGwwJyd9XIV8JafOPG9zgZGOq3zgwfTMglxcefPnZuua6cv +2bd3r1wmo9NoSYmJ27dtu3/3rl6uyHesXYgZvIwd+wSuhzxmYhMSzn13ygNMEfVNTQbfwubx +7uv7+rynxroOYNdvQ8/CjarfIdeuXZsxYwbu8l//+tdp8SQJADr/fnnw4AGKorjOM2fOvH79 +OhQEAJ31mrVr1+I6L1y4EEoBgM76zpUrV/BdM/zHcwB0/s189NHHo4NXRzTvTHkGeofTkrJ2 +b+/WhcaMqN+5MnLtyy+/BEFAZ705Y72PkSjeHjwjX6G5LzrVEZqTxJZEkcXUtwQ1J0ksbH1n +5ufngyCgs75w/w7mz/OouUhtG0OVI8iUp+0y2qoDzcCz6j1xbJv1wvQMEAR01iOd6QLvipNU +WT/80hD8qA3oDDqDzgDoDDqDzgDoDDqDzgDoDDqDzqAz6Aw6A6Az6Aw6A6CznujcJ5CO57f4 +8ptn/G+LBZ1BZ9D5V+vchygGUfkAIhtAFRpUrvq5ifFp5N8tvw+Rq7+dUY3K/jcCIvIBVKZC +pCoEdAadQedfpbO0H5WfprED5xEC5rqy5geUeS49K8DdVA4JZbi8GnwAlQ0IO96RrBgTtw4L +Fjc7Rq7wlw4g+N5TMSgoecODicxxYRqKa4m1vYi0D1EOi1a8I24dRPGFywdFbaPiDvylGmlR +oe0jovYxSeeoUIq/tQptG5OsuCJWDiDNPQLpAIq/RceoUNnLzniDlL/Rf0G5b2UPotBo37pj +RIivVNuwqP2yuHNM9PMfOKAz6Pz71XlAKD3k60oxT3yLUXuMKo41peYTW1Scws2U6kuCmp20 +wi3M6iPU2GLH4FpivVqQvtgkoNJXpkYVQ2jVOjdisFXSRkZFFxFNsojfHNAxipSt9RAXOGXv +ZCs0gmXbyelK97Bil7wjvJYzzPS1vrFVThFtfo39QnkPK6PWKWi5R+lJvnJQ2HyaHlfslLye +WbvD08b7777ZLplySr1G2HzMP7rQIaKD0niOvWgDMaGeENzgU3kekalAZ9AZdH6ozkRvvl3u +SaTzXXHNOldWvH1hF5EdaZp7DsnLs2eIHMMyrQPirNzY8+gyv6ylFrxaokwj6hjhxSda8QpI +iqtipQZtOM2uO8cvWePsIjThLLAghVhk7A+Ijp9lF2QpCDXyCXMvetNlvvdcVq61O8swfjNt +YaENCTXyD5pHiHWtvsiOijP34Ri6ITaxDS6O1FfdQsyoVMeyY3REaOwfb02JMWdl21rT55LS +bYjcOfxGP/zz5JefsIPOoPPvS2eebc4xQfs74vpN7qwE27ztJEGSReEltGiJEyeYkNTskdjs +6kp/xSbfK7PcclxnYfsoLyHZRlzqp3hHhJ87t46IWwc4kSnzac20jR+JIvItfGt8ExeZBL7O +bj1CYvjZp69ytY93rrssTF9sKql1Jfu/ahlgRA6c7yxwKN5F9KJbLDwswD8Wmo/4cYpso6Ve +QoSQ0elkIXFseD+4aaMn0XLm/HD7gl7x0npLWqF7U78QdAadQeeH6HzQ151pnXWY36piR2aY +M/OJzaf8aEGGSbtZKamWXkRjQoBVyiZK6AIj+xyPtDJzThV+sC1UjqBLZI6uEutFR/jSM4z4 +ckLWroDUIlO3XK+WC0wkzpjTSk7MMg56PaB5pzeD4rBwpYtdsnP1AD8py0TS5MENMQ9ewWg4 +4h8t86s9TvHzN4laQ82R+izq9KSmm4uWuXDZTjkb3B1plnmnePlNju4+80zj7PPOIQWVFvRi +D9AZdAadH3YpTCg/SSHTZtrS5jjT5pAynYtOIx2D3IRcE3vyXD+JpTjLRZBoQuCa+IeY+GV5 +LKizC5b74btjqQpV9nNSq+09SLMIlLnMbNdlF9GWk1RBtJG9/+yAxW6VFzipRZbRG1nN+0jC +YJecNz198z1q+vnpZVYR6+iVGzypAa850udxa8ktg0hhi5OHxysOXJv8/cy4RaY23rP9A12r +VPxFS23d8OVH26au8qQsJuSfRUqkdsJaH9AZdAadfypNF7g1J9hVJziNPYj2PlQfIuvl153i +NFzgS/sQaQ+v+gSn4SK/+RK/uQfPtzOqEEW/oP6kdsZmfBaV9o6V7KJ24qY+RK4SjE+vnbL5 +kqClRzA5PL4EuRppfJtdfYor7dfek5IPCOpPceovasdLL/HqznAbL/JbxsfXnWTXnucrBhB8 +ado3/WEDQGfQGXR+yD4akY3nu10ebrF2jEo7BtdtclilHf+j3WLff8yo+v7ldxPjM373tMn3 +I384Y59g4i2+X4LqB8tXae+LTd6J/rcGgM6gM+gMD3kCoDPoDDoDoDPoDDoDoDPoDDqDzqAz +BHQGnUFn0BkAnUFn0BkAnUFn0BkAnf9DZwbiXXue0T4qah0SQr7LqmuB8e32oDPorE8638Wc +fayilRZp65xT1xAg3yVzk6tf2otJiUkgCOisR5SVlcUnxOlIklNwgRJ0pDFx8XGbNm0CQUBn +4DfyAEoAgM7TgVu3blVXV2s0GigFADrrO2q1esaMGXB8C4DO04A1a9YYGBikpaVBKQDQWa+5 +f/8+n8/HdX7ttdc+/fRTKAgAOusvly9ffvLJJ3Gd//SnP23ZsgUKAoDO+suGDRsMDQ2fffZZ +/PQZP97Gd9ZQEwB01t+9c29vb3R0dENDAz4MOgOgs75TWFjY3d0NdQBA52lAbm5uV1cX1AEA +nUFnAACdQWcAdAZAZwB0BkBn4BGRkpIyMDAAddAF4Mo28Jv58ssv1Wq1SCTatGnT8PDw7du3 +oSZTxfvvv49/qMbGxspksrGxMSgI8Gs5c+aMwbf4+Ph88cUXUJOpQqFQ/OEPf5joi/DwcCgI +8Gu5ceOGh4fHxCaUlZUFBZlCRkZGXnjhBXhmG/j/UFlZiW9Czz///NGjR6EaUwuCIHhfGBoa +fvLJJ1AN4Ddw4sSJp556ytLS8tatW1CNqaWjowPXOSkJvm0P+I3gFru7u6empkIpppyhoaGX +X35548aNUArgN1NStOTwwWNQhynnzq175UsrR4evQCn0gg8/+JDGpHBEVLZQV8IRUn38Xehc +ou406fcb1J/M8GDwSDrSHq6YSqETz5+/AOY+FHXvsD317xVn/MoOknUn5cdpS49QdKpJv9Mc +Ipcfoy49rCubR+0FqrPohW2bdoK5D0XTN0oUm3W8g8oHEAhEx7P6PQk10WjHlr1g7k/p7Csy +bR2FXzeD6EFWXBX7xxuCzqAzBHQGnSEQ0Bl0hkBAZ9AZAgGdQWcI6Aw6g84Q0Bl0hmjTI5D2 +o51XJSvG03FZKMNHqtC2IaGsb3IaqQppvSzW/nVUKIWKgc6gs65G2o80HvaXpFsy4szpcRaS +SmJtv7DlODVxNaninECmEkgHUGkPO22ZLT3OPLjer16F4iOhbqAz6KyDkQ+iy1cSLDxM49eS +cl735PBNJI20xt3uhHirxSeQVg2qvBgQkWNJSXNMkrlywkxELeQWXPA+KB3oDDrrns4atGKd +i42noajcJa6eEICYRbQzGvd6eKXZ5p9E2keFy1e7kjm2pX3i1e+KG49Qc7fSG3sR0Bl0Bp11 +Vmdrt3mCPGtbm2edUz3l1wKbt7t5LtDq3DGKlipd6IGuDWMiea9AMSJq06D46TbUDXQGnXVT +56WrXDxC3GUfB9W+4eLFt8w5KZTudvfMcFiqCnzjk2DpLh9ygNmCo+jr70mqd5PTX6dq985Q +OtAZdNZJnZetcnYREio1ohUjvMg4I59F3rXd3k7Uv7sGmlKjLOLWUNKa7d3YhtQoY2+eadQ6 +mkyNQt1AZ9BZF69s9wkaz7CXdLOa+rRXuZtOMUv2MhsucEs2ERe0eqUovfP3c5RqwZINxBSl +V95ONu4ynDiDzqCz7hqtQpSa8ePnHoFsAFWqEWkfohwStY1ooxhAWvoQxfhL5SAKh9mgM+gM +gYDOoDMEdAadIRDQGXSGQEBn0BkCAZ1BZwjoDIDOENAZdIZAQGfdRN0zQgoyXftPSec7Ip2J +eDwiiI50x4qrEh3pkQ1fhNBTDbdv3gPmPpTR4bFZZs9TYoxI4YY6EkqkiV+Ese6053cev0hj +Wqw5OUInthBanPEs67/u3dUN5j6UO3funHv7wtEDp48d1JXs3Nrdveuw7rTnd57Nb25HuYHd +u47oQmOO7j/99qlzN76+AebqCxs3bhwZGYE66AjHjh2zsrJ67733oBTAr+Xjjz+eNWuWVCqF +UugI6enpBgYG7e3tUArg13L48GF845FIJPfv34dqTDlffPGFm5sb3iMCgQB6BPi1xMfH4xvP +iy++ePnyZajGlLNv3z6DcWbOnDk4OAgFAX7VvsDS0nJi+1m5ciUUZMopKip66qmn/vSnP+H/ +dnZ2QkGAX87GjRv/8Ic/TOhMpVLv3bsHNZlCHjx4cOLEiV27dpHJ5DfffLO/vx9qAvxyxsbG +Dh06lJWVlZKScvr0aThZ0xHCw8Nv374NdQB+A2vWrJHL5VAH3dlHBwcHX79+HUoB/AZaW1vr +6+uhDqAzADoD/3NCQkI+//xzqAMAOk8DQkNDb9yA5yoB0Fm/qaysdHZ2fvHFF+3s7FatWgUF +AUBn/aWjo2PivuETTzyxZw/8t0QAdNZjxsbGDA0NcZ19fX1v3boFBQFAZ70mJCQE1zk7OxtK +AYDO+o5MJnvmmWfOnj0LpQBAZ33niy++iIqKgjoAoPNvY9XKVcuXVOpIlpQsD5aE4f/qQmOW +lVVUVlRfu3YNNAGd9YL7dzEHNwt+8bzgKougiqlPcKVlVIN9UKVONCaqxXqu2x+3v7UTNAGd +9UPnOxgD9WnoZa64KukYE0N+mPWfhTBSjbvegi/mBZ31Rme6wLviJFXWD19+Dt+zDTqDzqAz +ADqDzqAzADqDzqAzADqDzqAz6Aw6g84A6Aw6g84A6Aw6g84A6KxDOjf3CORDQuUg2tKDv0SU +wyJFv0CmFrZpkPEx4+nRjmkdRKU/nlExLF4xJpJODA+J8GFZn3a4RYW0jgrlqsl5pQNo+zuS +FVclbfi7gM4A6PzIdJZrBMvWExdtoDcPoNKLnMWrvUuP85Z1kRI2MmUaVIFHjSqH0KqdpMyN +1JZBkWJgvAF9AkU/v3CFm6TBt64PVaqRsjc9A2u8qy4gcryF51k5MmLFeQFut2xQ2HiMGrXI +MiDJbsHmAKkaAZ0B0PnR6Iy0XhGkLzDn5/u0fxy6eogVFDM/ajOnaq9f8pYAhYa/bAdtyQFW +oxopqLUip9rn72BUnObJcKNVSOcQLyz4JYMnX8k4gqwc4SK+z/zJYl7BGWHHmKhqraMlYaaw +g9nxjqjlMJkVb87NI8SU2fuHmid1sZX/a6NBZ9AZdJ7UeQzJzjN3ZRiLywhBi61cGXOTd3EX +K5wodaT8Jgd34jxv7jxCjmeuws6FPYfEnevMt8s/zMf32h0abuQC09fMXuatZsiPEQluL1kL +zfNPCVeMchNz7JB0O3SRe+NVNCvXiprs3nQ1aOUYumwrOX8vS9oPOoPOoPOj0nlRnrmzvyGS +7yjMtHCmzk3Zzc1qsndNt6OEWGccFlS+TnBMc81qtPFNcWpQs8X+ZmFKhnxY2KFmh6fZ+IZa +UBe5L6yzp8SbBSRZLT4rVnR7kaJsst70ocdYpnWzF2TaiUspiqtCaR9+Qi1S9gua4WAbdAad +H5XOgoxsK1EZsQM/2B5mh6cYJ2znZDc7uC3AVbXJfVvUtN3NPcsts96WXewuHeKEsCyj2yZ1 +Dkm24RV7hkTNNnc3iaxw5i+wKjiP5tdbmTq+4s6fZ2H/KrOFkl/j4BvhWDkcuPoKUrKRuHhH +gHQA9s6gM+j8yHTOtOTleDYNi+Xn6OIYI1xnXF7XUq+s5XZk1NyfP9sk2SWr0Zax2LVZww6k +W0S2TuocFG8lrPeLSX7lzxaGmeu9+SmWi3bQAlOtEvfwO0ZFjft9qBGOxQeo4gxzT4EJLcSY +FGadeYCrBJ1BZ9D50VzZlvYLag8ylx9it6gQaQ+vvJtefZZfe5xZdoxbs58cuNCahM51zvWs +OslafpjV0sev2MmoPMmTqhAZPtzNLD/Oqz1Mz98d0Hies3w/s+Y0p7I7oFmFyvAJ+vlVO5h1 +PYj8PGuRwiNB6lN6hCeHK9sA6PzoHiPR3lNGFeqJu8yIXIObqL3L3KHm5cgJfpGmlAzH/EM8 +hUaoGDdRPojK+7VzNWtvcuHDiPYm9RCKC65Qay3GR357exrBJ5b24Z8YKH7W3D4qUqgRuO8M +gM5T8lSYXCPUft0HrqFuP4oGOoPOoDM85AmAzqAz6AyAzqAz6AyAzqAz6Aw6g86gMwA6g86g +MwA6g86gMwA6/xKdGYh3Yz9z1T8knVfFU54VVyUrdKAZE9nwZQhjgVHXZvjheNBZP3hwD3Px +tPcOmUWJMfSLmvrQ481ocaa60BJtY5KMZ1o/uWfnPtAEdNYXei71HthzbP/uo7qQRen5dZXN +OtKY7l1Hjh0++dVXX4ImoDPwG8jIyGhqaoI6AKCzvnP9+nW7cW7fvj1NVumbb7B7D8bPau5j +N29it+5qf4L365vY3fvQ3aDz9Ka7u9vAwODpp5/WaDTTYX3eKsVcKFj/V9rhr/sxL2csrQvT +rMdsXbDtw9DdoPP0Jj8/H9f5iSeeWLJkiZ6vyhfY2grs5Sew5y2wvhvaETdVmOGr2IIubGA1 +9twr2KYh6O5HQdO6dctbW6EOU84nDx48b2pqMI49hfK1Xq/MznKMGIDRXTAzAtY7vnd+8DGW +FoptU2OfXcIk8VjvdR1q7ddfY01N0yOnJJLDAsG0WR39zXs5OTlPPrnQwABP+SuvfFZaqrfr +Uo8FCbANO7C9xZihDdaj8xfGGQzMwAACgfxk/vInLJGAOXjqgc5xcRiKTo9ccXIasbObNquj +7+k3N//A03M6rAubjcXYY/b6oPM0onnt2gqFAuqgI6SVlLx18OA0WZn1C7H5NqDzY72y3dZW +39AAddARcnNzu3bsmCYr0x6BPTsLO/8FdOtjY+XKlS0tLVAHHaGgoGDfvunyjHTPTqxein1w +C7r1MTA6Orply5aEhISwsLADBw7cuXMHajKFfPzxx7t27eLxeDk5OXv37v3888+hJsAv5+jR +o88999zEjU6RSPTgwQOoydTqbGxsPNEdrq6uoDPwq7h58yaBQJjYfrZu3QoFmXJSU1MnumPh +woVQDeDXUlxcjG88L7300tWrV6EaU86OHTvw7njyySePHDkC1QB+LWfOnMG3H/z0GUqhC3zy +ySempqYmJiZff/01VAP4DZBJ5I0bN0IddIT09IXFRcVQB73gxo0bLc3SmoqGmkqdSNXyWj5H +uHBBto6053ee2soGHgsJEoXpSpMqGhrrm9977z0w96EM9o/MtH4yqMpMVKYTES8xi6hxCC63 +0pH2QMJr7MOq7HSkMWF1lrNdnti+ZReY+1DUvaN+weZrP5Z0XBFDIDqe9Z+HMhYYd70FX8z7 +cDR9o74i09ZR+EpnCHzPNugMgYDOoDMEAjqDzhDQGXQGnSGgM+gMgYDOoDMEAjqDzhAI6Aw6 +P8IoBkWtA0hzzy+dHp9SNihacUUk7xsf1gg78WGVdlg6IGwbQqXfTikdQDve0f7oaqsGegF0 +Bp0feWS9vKLNvou6OYpvf0Jd2o8o1KisH5H2ITIV0tInkA+gsj6BVIW/1E4g70fKt/gE13iV +n0eUGrRmDzms2rPsFF8xiNYf9M/YQmvs0xot16BNR6jhOdachQ4Ld7MVaugI0Bl0fpTpQ5S9 +nJDM+VQZrXMY1dqtRqVn2aW76NXnBNJLvPrzPGkvv+40t+GSoOUct/5tXrMKaR9Gs4vmGxg8 +G7qes+o9YVL0a3+Y8WL8HsHaK4LkEhMTV9OCE4K2YWFDNwmJM2XnEcILbYgim8xdHDkYDTqD +zo9Y54g8E1YrvWMI3yOjjcf9+bHGDsw5lBSnzHYXRqFr2V5fF6dXhEr/lDx7STVFOixqH0Ky +Km1nzX2BXEtW9ND9Wa8a+c5JPYi0n6BIcm146dbBK2krRgUJJZbei32U14JWjiGl60kFe9my +fugL0Bl0fkw6K4eRjFJT5wx3+ZAgNteMWOIiTrANzbezmvm092JHTqZ17FYufmrcNshPW+bo +I7EgpztntBBoiWb0OLP0g/zSVkdyilv+G27kEKdaFT+6xJLZylh5GcXfpe2ySNEvaOmBmoPO +oPOj1LmHE55vyl/HXv9x0NoPRAvzjTwLvVd/IEldYuG+nFhQa2njPY8RbmHLnOkRbld2Uajs +R7Q6l9r7Z3rEZRhZucwTFblKMs0X7GRGx8yd5zXLnTXTmDA/ZTsnp8HWI9mt5WrQKu3emZy3 +h6M9E4eag86g8yPTubWfG5k+x4hhzEm25Jd55m/28Qs2IkaYEAPN0/bzqlfZPT/zxdBVPj5m +Tzul+yguC6V9Wp1TC20oi3wXVRk98cLLkev8QtPNQmsIzCTnZecErUOCxTUOnMUeNSfpwfFG +HuHmjEgTr2D7vAM8+QD0BegMOj/KK9sqQeUeSlKze0ydW0I7ua4Prd/nF1fvvngPW65BW86y +CzdSq87xlndRyk7y5KrJWaoPMksPcBpOMnM20+ou8Cr20ZceYCw9xcXPjmUDqPQ8e9lBZlO/ +UPo2M7XZLabRq/gED65sg86g82OIXCPsuCzG0z4ilPVp7yPjw62a8dvHKrR1RChXIYohkRLf +t3578itTo7ie0n60bViIH0Lj4svxMRM73x6BVIX/VTs7PkG7dsnj80KpQWfQGQI6A6AzBHQG +nSEQ0Bl0hkBAZ9AZAgGdQWcI6Aw6QyCgM+gMgYDOU4S6d4QcbPb6p9r/Pq8bkax8V3caA9H2 +yHh0ojEbvwxlLDDq2rwHzH0oI4OXXzN7mp5i6B+nE6ElGLFSLXSkMRA8ASnmzGQzXWlMmvFM +m7/s3gF754dz6/atgwcO79zSvXOrTkTe2O7t5qcjjYHs2tadHJdekFOqI+3ZsWXf/r2Hvvji +czBXL/jHP/4RHx8PddAdkpOTc3NzoQ7Ab7k0p9FERkZCHXSEjz76yNTU1MjI6MaNG1ANAHTW +a7q6ugwMDP7yl78cPnwYqgGAznpNYmKiwTipqanTZZ1uY3tWYOnpWONG7Kv70MWg8++Ejz/+ +2MLC4oknnvjjH//o6en56aef6v0qPfgKq4jBXpqBzZiBPT0D4xdjn4PRjxD16GhodDTUQRf4 +8LPPdnR3sxAku6Bg94EDn339td6v0vv7MQMDLLQNe4BhqxZgBq9g3dd0tKmffTYNMvz228nB +wdNjXfQ+X36J3b5dvmjRka1b8QHsiy/0fo3+9TG24yB2bfxzaUsR9owhdvA9XXR57Vrs+een +Qe4/88w3f/7z9FiX6ZF/Pfnknb/9bZqsztLySV+GdmGWL2D+RZhuXrA3NNQeRUAgkJ/LE9iN +G9jIIczsBcwEwYZ09XGUsTFscHAaZGz37nyBABsamh6rMw1SFxt7SC6fJqszMoJpdmJO8zFS +DvYFXB155Fz5+OOwpCSog+6QUVi4tbt7mqzM/X9gfjO1++iQbKyqHFtaiQ18BF38KLh161Ze +Xp67u/trr71GIpF27twJNdEFcnNzu7q6psnKXHoDM34Vm/kq9sxfsT//GXvqBWyTCrr4kdwS +fPAgJibG4FtOnjwJNQGd/8fcuYV9fRO7+V2+we7BfedHxd69e2fMmIG7zGQyb9++DQUBnQH9 +5euvv7a1tcV1rqmpgWqAzoC+k5iYiO+gL168CKUAnQF95+23z4pEYqiD7lBaWnrk8BGog54c +395oa+1orpM31+tEivLKaH6slgaFjrRH2qjcu+dxf5XN5s1v6U4FiF6UmIgEHWlMU51cIWv9 +4IMPwNyHMjgw+prlk+JlpkihiS5EVGoRWmGvI40RlpqREl+mMsiPs0ce3MMc3CyY2bPRYp3o +FLw7ApdY6UiPBFVYzCI80bVlF5j7UNS9o37B5ms/Cey8Iob8W1a/F1R2hCgJFTzOHrl/B2Oi +Po19ASuvQaf8ezZ8HspcYNz1FnyT58OB79n+mSjUaN5OL3HI49aZLvCuOEmV9UOnwPdsg86g +M+gMOsPWAjqDzqAz6Aw6g86gM+gMOoPOoDPoDDoDoDPoDDqDzqAz6Aw6TyOdewSK4cnfBu28 +LJT1CVr60dYRoVyNKgaQ76aRDwqV6l+2EfYhylGhXKWdq7kXaR39duGj4wv/X3Q9vljFiFDb +vJ5pqfP3RWsfQaU9AqlaqNSgeI/Iv11lbWGHhMoBpPm/VgCfHe/QIaF0fBjvnbYrksmFD6PS +3v9ZjygHf1l7QOdHqbNMLShb6yHOteNn2ga1kOp60aaj9GwFZflhxrLjHGmfdnZZv2D5VlLe +ngCpCpENaLcrmQrBh7UbQ58AH8D/nRyPb6jnWYtb/cpP8/FhRR8vt91NmGOLLzxESqzrRfCR +2in7EXzJE9undNxxab/25YTv+AK1f5rY5r+dTDs8MX4AVfRz85Wkor0cmQaVDYzPqPp2xoHx +Zar0Vme8wj2cRUoX4SJbfpZ9wmpayxBavYu8aAut6mDA8qOcloHx0l3i5mwk5x/m4iv7fY/0 +T/YIPqzttfHxcjXScIS2aAOl9hIy0TvplQ5oFt4jdvGv01vGZ/z3Hun9vkcmekc20Tvji53o +nYlVmOypAUTRw8l+k7hoP1c5iE6877czavtL1j/Zy6DzI9YZ3xFwI9E5XlF2SS2ufhHGbAVN +diYgW+4bGm/KK/Np6McVQxTDgpQsw4BKonJEWHeUWdYd0IDvec/zcNekPfzGs7yWfqT2GHPJ +voDGAaH8FJnuYp62m6cYFHb00Cm0OW6RthGVTow4U04TRdovqD/BwjdLaT+/6gBj2TGu1kd8 +2zjHXnaQ1dSr3TxaLnCW7GVUnOLJcVt7eOX7GRUneNotpJdX3s0oP8VXanh5MmLhXk7zJX7d +SdZSvD0XtYbiMy7fz6w+zWu6yNdTnaX4h9UJClkyk7TYNbXBwZdqmbqNU7efsvgtUliiJSPf +t2lIiAvScZ5OjjXlrgpYOTbZI42XBI1v85rxJfQK6s/wpAOCifEtQ6KadQRytFXJOSF+0NWw +14fk+Hd6HiFqmR0ZtUp8g4n3SN1x1vIjHFkfv3I/Y/lRLt4GvFOaz3KWHWI14r2vRhpPscr2 +MmovTBZ56T5GzQU+3jst5zhLuxk155E2FTfrdWLWPg7eRzXHAvAZm/BPgAGk6TRryYGAunO8 +ph7Q+XHorBzhxoQaUlKdFrR5sMKNgt5kSff7Cdgm1nbPmZAsi99GWvEjvRFBWr4p0kKq2EJE +Qo2IQSbcMhdxvn36UUHDNh/JIteCLT78RBMiaiJaRqo75c8jW2Xs1ercfpHKkNimHRB13Y9Y +KrcnJLhl1Vu7UGZTsp1ji+x9/Gc5iEzD3gyQnaUL4owsvWfSa0hN5wKSllh7BhuRw50K9wek +19u6BMy1RyxTdgfkLLfxZM91Epln7qMlxDumb6IvSLfyohkS/GcTC7zrL7GiF5kQePPcyMaB +1RTpiPBn9gg6rfNJCj1yHmOJZ6bUyUNsnXWIX77WWVxo4+P4/Ewvq5KzSOuwqOMCg55qKX4z +oHaPLzPMhCg0EVc6ixPtFx/h1+/2Zhd4FLzpIww3IoqNec1+S95wDUi1LcV1HhbW7vARiG2r +rkXsvC1JijYTVvhmVTgQPOfQMpyjKuzxrnFhm8ZtYLacoQUmzLf0mMVbRqw+ThWnmBMDDVnF +7suOM8NSzV15s71DCWWH6OG5Zi7s2S4xhCXHA0KXOQavIkekzXcXGroS54qbqE2nqeyg+Q68 ++R6oUfx2TpsGAZ0fi85zHbkm/Cxrd7859GJy5TYfdoC1OMYiopnSMiCoxz/z+/lpheaSRg9U +ONuUNJ8imWPoNJ+WYitZ7rtQRhA3+4ZJXjWlzPcTzzF2MkzbQhZSrSd07uhlBHBmW9HnUyKM +XSSmMduYmUUmpEKfxgM+DjTzrONI1VpnL4FTapONQ4rzsoO0jK3UvCZbK+uXfSJN7O3/Ts91 +FcTNdYy2DVnukrDZP0QyxyPWPryEkLnLL5RrFb+aGhdhzlxEaj7m6xRnHbHckRnlWDXIj40w +4xaQpKN6q/Npf3rgTOdwK3ShuRN5TuR6ZrHUll9MCEq351X7y0eQhvN8+Wk6I90qaI1/cOxM +Q7/5FPHs+cS5zAwrtJm8qNYxXOmNisZ7KnDOPGfj6DoCZ6HdhM6NB4h+Ti86i00oQfPdxHZF +J9npqZbUZJ+6g94eEtOFx4W1bxAIKQ6JZbaUKIeS/Yy8NeSYXKNZrrMpYYZmLq8J6t3J5Dn0 +RU7BBR5F6719eDP9shzFy9wKu+m8bCuO1EcSPS94A6tc4eLPdoyttvYrIcouMASh88PWs9oH +QedHr/MwJybMPHkLvwuLrFQ4efGcS7t8eTwbNNw8tsO/WOrkzJwTUOiVWGoVVOPCCDSmlnkX +vkVKkJOL13pQBDOdmNZ5R+lBAXNZZd4Fm4mJLb7L9vvx/Sb3zvjBNkNgwihwz1zjm7MzQHkZ +ySgyQ1ooDV0eFlzr0sEgxU4vCt0+psLSOcddPiKqO8vOKrX2ZFpmbKNmyDyyNlPzVnpENriL +ki0YuR45K71im9yD0s1ZS10DUZuktf7x0bbB1XTlGbJ7ul1ovj07xk1+PTA7y1ZUTGrR272z +/AiZnmmV3RO2FwvJzDRmVZGKZPZIiZM42U7YSCtaS3AOmENf7ETJsAlcQZYkzKUu8yneTExo +I+at96H7zbSS2BXtpbKDjfxLvIu24D1FWtzuzPx271y/15fhNy9Y6pO50rfoMLfzGj810UZU +SKnZ5e4RbFGsDm3f7+mQZBeRbUWPc20eEzeeZoSnzXdLdync6pck9czdSUtvdotrcOWGmgY2 +EzOV7rHNbsxQ/JPfl5dnw5X6RCw0Sz3Ar+5wYyNOEUvMmY3UtVf4EQtNw9ezYO/8eM6do8Sz +bJnG3HRL/PM5sJ1Ru9WbSbMNyzRzRmwKj/Gb8fPQAX5qjgm/0XdxI8E/0JSTYEbK8azvYXH8 +Z8ziODWPovlN9qRIc3asOWuBe/lRCtvTIn3P+MH2Jao/zzJ6I3flNUnr4PhBe55JQBVR0csK +izbzlZj5hhgxaim1+4m+gUYenDmEZNfS3WRhoillgZW/2CZtnV90oYVnuDmZZyoq84jMMPcL +MfcNNeXXeUg4VvGrKLGhVqKlVPlJokOMbfoWP0mqCS3V0tVxNqvAT6a/e+dT/hT0FcdgS/4C +c1+uVdZ+bnGTDbvYOaHA2o5hU3CS19wjUJymURItRK8zCjucvAPNuDFmjEK3mktsPmXGbD6h +ZUyYV+foL9H2lF+hV94KZ3qiTcnkwbY3i2VReEm8ckyk1KDtY7zkWCvuQpJskB2YYeYmNqUI +jQTN5OrdvszAua6s2d6pTovWefqHmnFSzKnpDou2kflhpsQ4C3KYWbjMA0k2JSZY+LItUjuJ +rCwrVpN3SLJxwl5epdKFFkAo3OVLCTKlp5o5EWdFbGTD3vlxXNnuF5RvJ8XVuUZUuCSspTYN +oM2nWSVvMauPM9LaiUtPCxTaa6eCqn3UsiNcxQCvoMM9ssaz5DhfOYRU7fQv3s+W9qMKFS9v +lUdktWfpCb68l1u6kVZ9lq+9DN7DLdlGW36SJ528KCqo7qaWHmLL1ELpOWZanUvsSkpDL9qq +QSq7SNH4Yo/ytJvcfkpUpUvqG4yWQWHLaUZyvWuswq9+QCh9m7Gg1jW6g9LQxy/fSq84wanY +QV96kCu9yM7byajr4ZescUfSzFy9DQNrqbIRoVQfr2xrry7yitf7xFS7RFS4Zm4NkA2j9Ufo +pQdZDSfo6Uri0lN87cXkXl7xbtqS0/zWAV5ex3jlj/NbNYLyHbSi3WypGlX0f9tTJ/nStwNK +dtHrLyEyFdL0Nrt0C632ouDbK8/8yl30sj1s6aBQfpaZWusS306p70WVg3iPEKPrPIqO8tuH +kaUbfCKr3HL3shVDaG03JabKZcFGhmxQWLefEo0Pv8nAt5CyvfTSI+zle6iVZ/mNxwJKtgY0 +93Ky6h0ZMSbuPKPkXdxWNej8OO47ywdFHWNibYbHbw2rEOWQ9v5C+6hIrpqcBhdQe59Xe08Z +n1I0cYdRPijETZy4m9k6oh0/fqsaUQxP3jnS3o7EF9UvmLxB/N1yxm+GtuHvOKJ9x2bcL20b +Jhcr0wjxxrSN3xXFJ2vHJxu/Z/2DWRC5drGIfBBVqLWtasNHnqFHZlmSQ4xZRZ4VFwRyFaK/ +952Vw5M90jaEamuF77LV2htAkz0yfkNfqREq+scrPzpZ+ckeGZzske96qkWF4jviyfvOKkQx +9IMHAPBq4zXUTPYIXur2bx8PmNgqtD2Cl2u8PRN9Pdk7Q9oF4r35XU8pNNoHFeQaoXyipy4L +a/eSRLHG5CDT0Ba/BtV/uVcFOsNTYf+2X8MP71uHRa1Dkx8m8FTY1Eaq3S+I2kZEysH//rwK +6Aw6w0Oe8JAn6AwBnUFn0Bl0Bp1BZ9AZdAadQWfQGXQGnQHQGXQGnacT6t5RcpDZqvfFbSMi +yL9lxTuSkgO+4sf+tfkM1KfuIkN7rxZ64cdZ90kwPcWo6y3Q+Sd07huZT3g6eY19XKudLiSp +wynzDW9daUynA79sNpX5WH/U5v5dzMnTMqTBNKFdJzoleYVzYoejjvRI2hsEE9Jftm3eCeY+ +lM8++yw7e9HChRk6kvDwCCtLK91pD5729vbH3Cm1tbW6s/qhIWEJ8Qm60x6c0dFRMFcv+OD9 +D+PjEqAOuoNS0drdvR/qAPyWS3MaTWRkJNRBR3jw4AGbzY6IiIBSAKCzvtPf3//CCy/Mmzfv ++vXrUA0AdNZrVq1aZWBg8Je//GXXLvhJZQB01mPu3r3r7+9vMM406pS72MF12OI8bMVR6GLQ ++ffD2NjY/Pnzn3zyyb/97W9EIvHTTz/V/2sB/8JaUrGXn8X++lfs6dewrDXY7QfQ0Y8O9eho +aHQ01EEX+OzGDdXgYFBERFV9fa9G89WtW3q/SvevYF6mGL0cw25hIdbYn1jYh/d1tKk3bkyD +DF24kBAaOj3WRe9z8yZ+wL0kJ+fAtm3YnTval/q+Rtg9rFeF9WuwRSJsphHWdADTzZ1zZyf2 +979Pg9x74YWvnnpqeqzL9MjXf/vb7eeemyarU1gybsv7mJCEvTobW7gO+5dO+lxcjBkYQCCQ +n0tQMPbdKcP2Euyvf8d26OoDZr29+p2+Pqy//90dO0r4fHwAU6n0fo2mRRqjoo40N0+T1bm8 +B3MjYSv7tL5cbMOe/xO26hJcJHkkVykw7A7+mXT5siQmBj8A+hdURDdYWFS0Zf90ecjz+kVs +/jPYfApWXY1RzLA5DGzsBnTxo+DevXtFRUWOjo6vvPKKp6fnkSNHoCa6QG5ubldX1/RZn8uH +MKaN9sDbKQw7fw3699FRWlo68dDCH//4R41GAwUBnR/NnuNf2JdfYregbx8tKpUK3zXjOkdH +R9+/fx8KAjoDenz6fP++n58frnNHRwdUA3QG9J2Kior58+ePjY1BKUBnQN8ZHBxMTU2FOugO +paWlhw8fhjroBTdvfr1yxWp5c7uiRSdSW9EYH52ilHbqRHua21tlnQf2H3jMnbJ9W5eypUOh +G51C9qHiPaIjm4e8qb2jbeVHH30I5j6UoYHR1yyeRIqNubk6EX6eqajYSkcaI8g38Yl9icp4 +rF/99+Ae5uBqQUufxcvTiSIEltkKiyx0pEdEZWYzHZ7o2robzH0o6t5RvxDz1/8Z2PmOREey +Qmdasua9oCVHiZLH/sW8TNSnSRWw6lqgjnSH7vTIhi9CmQuMu97aA+Y+FPjafPjafPjafNAZ +dAadQWfQGXTWKZ1lA4i0D/8XVWi0kX/7pjL15BgFPoEKkWu+fan50c/ca2dUo/gSQGfQGXSe +Yp17+PWnuE2X+LXHA8p20Yp20CrP8JUaFB9fc5SJjyneQS09wKo7zS7bSS3dy1i2l168g151 +hjfhL/5RUHeMuaSb1dSHSEFn0Bl0njqdpf2o9BRFwLLP30GhMWdZ0+Z68uZ6xdimdfPkJ8h+ +zjNsmPO8kPnERS65b3pT0Xm27i/Mdn3VjWeasJ4pV6P4/rpuN5HDnm3lOT9QSVcMo1LQGXQG +nadQ55N+LF+bRZt9/RCbjIOCNf8QZiyxIca5Vx4kUv3mJe3mynv5zZfwKZGOK6KcegufSmLH +mFgxfrCtGBWWtztSwi34i2xoZWTFmFAGOoPOoPOU6szxs815i+gvtEnbw227LG7a481LsMre +RqLYPWtGnu0aMA8t92seFLYOIlk1Fj7LffD98sReGN87V+30cnZ73ohtu+S8QNbDbwadp6/O +eL8rBn5wXUX98LeQqhDFf2y3MjXyw+stE5Npz9dUiFyNgM7/e51FtpkHBavek9Rt8mBF2i3e +RmQyDFP28pQqQdOl8VJofqSzbABtOUrhR1hEdRDFkvmObPOUTQEyzSM/gwadp0RnaQ+/+khA +9Rk+7qBUJag7zqo4xm3+j+uf+F8bz3EqT3Fb+n44kl97jF13jv/9SHyyC7ymi/zGU+zl+9hN +qsd04WX663yCzHCzyt7k60M1lkjJJVuIgnhTdrlf40FfkteclP2CjsHJq9a4zhnlpq4lXt/p +3HSYzObPD1vjn5JnOOOl55BOhnwQBZ2nn87SAVR5nu7v++z8UOeGIUlbD41s+Zwl4tIwKm4f +EbWPilrHNxKZRrjiXUnpSoJjtkfziLhNu9tFlJfFHYMBQWzLmA6G8rKobVTUjo9RcxManRK3 +cpr2+CXX+DUOaxfSPiLU7v1VqPaHvIe1L+Uq0PnXdBP+qfg2PSHHc8khRvhCcw/E0Asx4lV4 +V/UJW475Ry12KjjO/+7AST6AlKxzC13tj7dK62wfgo+p2OpFCzYkpzmnd7hHtZHrepBHfccK +dJ4SnRVnaTTOs89YGBe+LWrc4TL3xb858d0aBnlJBVbufKOQFnLzIFq+zs1fYOzJm2eX51W8 +zj1+NVXaw0rK8Sg9Qgtm4TrTl3f5MIONiHG2aW1u9vbPmCYSijf6pdb4Ld3pyxPN84i3XXSI +jx/y8RbbM2ONfFKcSk/x5f9TBab/jao+RDkilKmQ1lFRx2Xth2TbkFA2flLTOiLCPx6bf3QG +JGzVID8+JxJOfK4qh4RKNQo3qqarzvIT/uxMIxeOUcR66qJia2+qESfMLaHBxjneMfcNL0aY +SaDcix9kHqEghqQY2S72zFhmzljiI+uhczwt0rdTwwTWCe2U+EoCusSZK5rtGW5JiTbkdlKX +ylz93Y3deGaSet8FlTaukW6lm92MSEZRa4iisHn8JopCg4LO8FQY6Py/1tmPlW0hWOZECzcn +JdpK0p2QcII43YjXRt/8sSiqzJoQZ+kRR6i6HFT5pot7kefC5RacGlKbOgDxt87cqdU5VkqK +b3GJaHTnS2Z7xVpzFltF7uHVr/YgW898TWRXog5aedqP4Wu3cLWbYzKhclCYVWzKqyfJ1aDz +5Hlx67BQm0FU9lPnID3aU2Dl0PgJb4+217QT9z18Jy7/j0e/pP3Id5c6J6NCtG3uQ/C6yfpA +52mk8zEyJdk06nUi6bU/vsS3SatyCRAQkqR2zlF2aa1utFCTsE5fNMRMUukpiplnke6Rr7R1 +ElkmtzgRbIzTd9GCmZZR5a6+IXOZ5Z4xGUYEkSkt3si/llQidaV6mnijZshSz9hSK7d499JN +buYRDkv7BAuyDVk1oPPESbGg4VRA3npSxkrf7M20RhX60KsK2kuUx5hle1mNfdrHOJtOs0p2 +M+suCf5dW/zlRW7VkYD6i9//CR+oP81edpz7w8uV+GR153gtF7glexmVZ/lSFeg8LXTGP6Xf +ZiS0ehQcYaUW2wY1Ucq3+SVV+TWpuWnLbH0kppHt/i2Dwpoub16wKSPVTrKC1nKeEZZsxkiz +jyjxXHqClV3ulbcrYLHUkRxqKix1CpF6Zylc2Iudc9aRU+v8Kg6QReFGxDTH/OOC5iOUwBZi +dZ+gZKVb6iaGDM6d+5C2IUFGqeVcx1nkaFNfkRG1xLvy0vjj1oNCJR71xH0BpPUKkr5gzgsv +vZp2BFk1hqQunP3nebMXHkPwk2jtZEPa57fxXXDbmFh2lMyPNcs4hKwYFeG7XXzX3zEmzGm2 +c8z1kg6LWscX2/6uaFm7S3CFT+NFdnybd8FxftvI+Ntpn/FG5Jrx4SGh4v93nxF0npr7zn1I +65AQ3x6Ul8Xtw6hMjbaO4Ad1iHJE1HlF3DZ+gKe9kHJF3DEmbh9EtRvhmLhDeylbe2VGMX7V +WjGknVh7MXwY3xJEHaNCuQZVjqDyARSfsfOySNGPH+Ch7eOPF8oHRcr/9S1pfdV5kJ+cb+u/ +2G/Vl6EdF/xpTJP4Lezmo/6hCcakCMu4jUxcUmmfVufMdMNXXnqOJmN2DgQgfs//2dU46yh/ +yVpnD/Yc7zhC6SlBywkqP9qYIJjrJjbL7mamVTvlHuPXrPeJKfBNUzgQ8r3rT1BDMs28xSYh +9d7C4Fdnm87N2EKNkHotPsjKXmbtxppDX+ZddY6TXmkTEGfmwzWJeZ0hU//2+4ygMzwV9jvU +OaXQlpzpKxsTtY4K0habSaReIaHzHQKMaUGzZ7mYLT4tXP1u4JqPhFmLLElMQ2qie+E2b3+2 +kW2qfVSjG51nmvAWNX6hZUCac1ixFbXYe3GroxfXNGs3VRJjmLSfXyEl0FmE5DYn12KfpW+5 +I6XO0Yst7ByNBbHmzHiXumP+3gmW9IU2nkK7vD1+gkgzzhJPYeRs6nKf7OV2PkzH8gGhQgU6 +g86g8y/eOxfie2dy5yfBK0c4EVHmMVIPP95cjwT70DLHwFKPTJkbNdiYXegem2ETtMiRl2nu +E24mKieQcuzQDDsqh9D8WVjLJhdajAktwTRqF/J6D1WYZpnR5R+UaJJ2HK1pc2GhLiltTm4l +XkWdbmHLXaMLrAgEU3GStaTAR3mJ7pdi5RJm4lpEfvNfQXm5dsxgB0m2eeJeXtMGDzrNYWk/ +6Aw6g86/VOf2IX5yroUlyzrtDWJskZV7lNOyM+zYhVacPLcMhQu3zKt0HyPndVLhPkZCvHnQ +Mq+wlJkGBi+lrPbxSLIOV3hyJUbCWnc0zIyf75lUY+eT6BBZZOlINcw5xApLmOubQQiONnbn +OifLHRwLPZJSjNwDbZMbHF1c53NjzYki25JdZM94S06BI4lrES11pYSaoQ0+wUmGkds4datd +yT52oDPoDDr/4iAKNbJ0vSc9ypQSbkpf6LT4EFcxJGw5TY9aaOoXY5OylSUfFLYOizquoKWd +3ou2MJa96SHIcy8/wYxv8y05I6ju8mZEmrIKvSovocpLrLhCa0qKTViDV8VFpHqrFzfSXFzq +mt7qX7yDHP0GvaabjB9j8/MJ0RXuuZtIoXmOaW9SEjuJxad4pe0E/3BTiZLSeImb2+aRf5TX +2O2fUkWqUf3221igM+j8e7tR1dwjkGuEK66Of2XfmEg5gGhvK/ejbVfwMeLWby8YaicbEio1 +iHxQ1HlFJFMhbUPaB2VlGqH2e/Yujz8ehh+6XxavGL8gKdM+lyvqvCppvyxqHUblamH7ICod +EOJjtE+UXRYpNcL2MbFSg+LLUfQjimER3oaOYVTap72qqb1uOYC2jgqlcGUbdAadIaAz6Aw6 +g86gMwR0Bp31TufeUVKg2cr3RJOP+EJ+kM4r4uL9PuLH/rX5DMS77gJj/BQVeuFHWfdxMD3Z +qOst0PnhqPuGjVyfSVvvlLTCUReyYLVzziZfXWnMGgK6fC4twO+x6nwXI3hbRUjNU1brRKcs +XOeettZVR3oka7OLGeXJbZt2grkP5fr162lpC5JTknUkwcFBlpYWutMePDKZ7DF3Snn5ct1Z +fQ6HIwmU6FCPJCcPDw+DuXrB++99EBcXD3XQHepq69e/uR7qAPyWc3mNJjIyEuqgI9y9e9ff +359MJj948ACqAYDOes2lS5eefvrpZ5999urVq1ANAHTWaxQKhYGBwRNPPNHa2grVAEBn/eXW +rVseHh4G49BoNPzAG2oCgM56yuXLly0sLJ555pkXX3yRRCK9//77UBMAdNZT8N3xzZs3s7Ky +Nm3ahA/cu3cPagKAznpNXl7e7t27oQ4A6DwNyM3N7erqgjoAoDPoDPyeuXr1amxsLNQBdAb0 +mjt37gwODm7evJnL5fb29l67dg1qAjoDesrdu3fT0tJefPHFv/71r3//+9937NgBNQGdAf1F +JpNNPLTw/PPPv/POO1AQ0BnQXz744ANTU1Nc5wULFkA1QGdA3+FwOH/84x/XrFkDpQCdAX1n +w4YNBALh+vXrUAodoaCgYO9e+DIf/eD+/fv/ePf90cF3L+tGtm7aSSUFjGqu6kh7rgxfu/7p +4/5s+efHH304qvlwRK0LSY0IXi1t1JHGfDg88OHVK7fv3AFzH8qVsasmNrNJEnNfVFfizjUi +Ci10oSVEkYULc744UPRYu+TBfQ8/2tP+wU8zI55mhE95/uwX+CQ1RBdaog075mkL52MH94O5 +D0XdM+IjMlrxPqIcFuhCWkcQ7e8p6EZjOq6ghfs90UDuY+2Su7dtAoQGmz4z6H5gsPfu1Gf/ +A4N993WiJXhOYQai/ENb4MuOHg58z7aufc82rrMDW2yw7j2DHTcMtn8B+VEO4TrnHt62CcwF +nUFn0Bl0Bp1BZ9B5euss7Uekff8/X/oQ+cC3C/nh8C+bV6b6pW2WDaC/buG6rvOXBjtvGuz6 +xmDHV9qXXV9NDvz2/HAJ3y5cm5sGXV/+aEr8Jf52eHb+knf8cnL6X968nf/X3nuAVZWlaaPv +nX/uzJ2emb/vzPx3pqu7q7urrLLUKktLy4yoKJLDIeeckZxzTpIElYyiIBmUHEUyCAKSJQoq +KjlIFjh373PAwtLqruqectBa77Oe8+yz99prr/Wt9a7vW9/69jmzb3koofPPT+fAu8KBDSJ/ +C52D7gn71goFNYuy/iFUxK9WKLDhR3JZ9EKdoE+l4IWmH8HlVlG/Cj73O4LUDPAh0DnjBXJm +EduFiDakTtLH6aNIGfkbuDyNm2N0CTdZx7cmkfAQUa2IaEXkA6SMv06uSdyaQNJTxA79OdK9 +SjcnkTKE+Me4+SMyZ71A0iCu9rGqQej8rujczAhpF1BT3aF2nZca8OwzoV0SUf1SEd1iF1sY +Yay/CQ5upf/n9xL12SsZxfpbYfovhvskI/vov/oN6RR3DfvqPz79L+VkwejHkq5hu3+/8z+V +UwTDH4iFdbOKYv0vcGivRGSfZBTrlkvt4hG9kpEPJSP7JfxyTmiHHfdtlYh8SGeIZP9rcItY +BJ1ZMryL/m/ioPuilzvEvNM5OAV+v4P7E5VU/ld/bfze0nkG2ZPwjgKPErhEwfDH9XEEXYf6 +JeQyUfySVoV5KyhmonCZplvuCu2Xpr7mvKDngaJVFFLZVpFJKc1ZFDDpS0VriMqGfCDiJpG7 +hMR74OMFhyzOyIPLFBcfIm+ZzkaXuYSLebDNxuV6mN1B3ip9bxETeYu067uIejpFyQX6TPEa +8ldwtQgOBQirhGsu0hdoRz1VSN4CzdbcZRSu0jlz51hTxBRtDMTdg6AivpGEWSXy5gmd3x2d +OwQUJLYpRPOEdND8Da7jN/D9+pTy59KBpwKqedRDjjpUi12q4FIO5/Qo49Ww2cWt9qVRlkBg +Gbea+W4e3T0m2UIRvRLOoV/98//9T5yuJyIfMVSVfve/f/P/KqUJRTbz67l/zaX8udTFUxca ++A1svhHU2X5cf69djYhX6lFpi13cMtsVw7nPF54yiOF0TDqparaHV327sCuHf7v4pSpuaYPt +J/S+Ugo+6lbLuNzKCOtiWJ/fwyG1W9ryc+GQM9Rc8X7TOXsBIengNUXkMArHYXQRro24EAN+ +BTDMoJ2I1BE4h0HEEHrpSBuBWxQ0XSBkieCHSO2GVgiUbCAZhBuTuDkIM0+IO8D/IaIzIOaO +2EmauddvQ8YAoc+ROYW0CdrwvtEEBRNIuOJKH9QU8Ud+mGfCvg7hRdD0gLgF3Eth7AWVq0if +QeQdSOtD3AdXHkFfG9s5YREP71Kas9a+4NeEcxWypuCdDC0vSJjAs5m2rimC5y0hKAF8+tD1 +gmIa8pcInd8lnZWkP1O6QtP5Uoe4z60jAqZfydnv3P3VJ/qpZxR0dqrG8zoH7eU5t0faavtu +oW28sh/vFP1cK/jA4a8/lgk75VMrEtYlZnt5/74THx8w+9Y568RZ9T99y/iT5i1B/0wObp2v +5ex2fHP6j/rJJ/j2/Y7H4ZC82fYjxofPuXy2W3S7TvCB00JfyFjt4jf/Ws9lz/5vtmmGHTgo ++ZlCEs85t53HDb/VdNnxDe+nZuVi4e2Myx0Mz8QD3+z69U6l/V6NjOBGkfeZztPIWYCDB7Ru +0YOfvYClzviH45QSHBNw/Bw0rkPBFQa+OCoBl3JIikAhFDqOOBmCmFJ8IgKzFEhpwbQAZtY4 +qQIxDezWgusNyJxfp3NCLU4dwwEGOCXA6Yi4MeiZ4ZAKZC1hdQsm7uC2gd5FcEXC3g3HzGDm +g6+UYZcCESV434WBPzQuQEgSsjFw9IaoFcy8oegBC6qStnCPBb8RXOugogWhAFi4gd8CCdRS +fYbWzrEV4DiEfQaIpSz8CZbxT+j8zuj8uWosH2XohvWKe6UcU3Lfr+a868s/fqyRJnw+8cBZ +k938el8pXDjOUP5ot9R2EcMdZy326Qcd4Bf4xrNLMrxNNLSTYX1h3wn1b6TO7RJU3iFssEfC +eLtaCr9PFoeU5wE1+517OH+vHsspJbXHoVEyvJiTl+srRYddchdPXR2WNLDdxqX6majdXj3X +bwXlDoc9FBEx2yl8kVPWdJtavnhsw2kxk52mdxgRXeKBhZw88rt0rhw+JfmHA4q7DHMEQzsY +77F2zlmE2wUo3qAtasowzmH5mrzDoOCPokVagUqEwiQWlgE4LASbImicw4UniMzHYX9EleOg +M1IX4ewPvevgkwKnDhTtoRAEjxuQ3qDz9RLImyJijLbPb71A7jyCbkHSCqqesMmEbQRUYuCa +DN5oOAdBrxAJVdhnh+QZmJnBOhfWcbCMgwgDYtEIiIZxHHxioeIKBWucq0UzE/JukI6HsRuc +OpFcDnFDXGM9Je0BpMxhnwVRbZw4B/cm5C4QOr8bOod2CsgJ/UHA5ZhjNrdbuYCRxeeHxXaZ +xB45uudj6TC+yHY+Pu7/85tT2x1qBDVsvuD14HRPP64SfNQ85OAZzt0uLWIhLTSdLc9/fUT9 +iJnvp3//j//C43lcyehT5SQ+c6/PdijuNos5eIz7dzIRHAyuP4kHHNdx23VU56C+x45Dyl+Z +x3Hwi2+XMNspYPG1tv0+HsaBiw8EeXW3C0ec1nXawWV31DT46yOMzy3KxSg6B2QdO3r8c8pg +UNf5/T//5/9RThEI6xR7j+mcNY9rZeBRgU0BQktoani2wS8MUu7ImYSIPb5VxTFr+OXgrAz0 +UqGsAd9eXEzHfh/aDN5tjYQpWLtCOwn6jtBJQkQl9FPhHw9RF1yfpMOuKGNbRAEutYhoREgD +kp/QFNa7CmN78DjAJBACdtC/DK5wOJ6HRiZiivG1I5LGYGAIk0gcV4dRBvTNcNYf5yMh6QCz +81Byh1EQuD1xKR+ChrApg541bO8jNg9COiw6LyClBWfl4VQJaxv879/BtIJekhM6vyPtLGxk +t+Og0B8Oi/7xtN4hp6yTQnKfcGl9KXbuK90EvuhHYho6H+/RPHypXzKo9LS46ieHBLcpXzvj +nXVK1eKoVzPjcrPo5XaGy41jcr5cntlHj8vvNCngM7+wzyRfKLCAU1D6jyd0vxSx3qMdd5zB +8cdDYp9w6O9xqBe19fniW/6POYQ/l4vk9sk6rnH5qFXUcXWXExfbhdQDD2hlCoXePStj/MUR +id9/I/qZVaVYWDvjUquo89UDXEJ/OGP7rZ7/Ie3IUwGtYj9+x2rrucKmkT2LsHzaSD4jRxM2 +bRbh+bBOQ9YkTJNgnQllIwjZQskXtsVwjED4Y1ypgdotxDZDOR7JU/BPhss9WhuqGeKUBqyr +cb0W5ilImKRN99QuKOuASx6nFejk0UBfFVMBnwn8HyC+AbIWUA6BYQmCMuByF/FNUE6kHeAe +UQhohMMFcOtAxRsaKYhtgaIFNM7DMZteyBvY45QMLAtxcxTO1xHQi8QGmEUhgbVqyHqBiEKI +qoBxHs43aDWdMkO77Aid38FGVZNoSJdERI9EeJcEpe8utYmF9UiEPRAP65GM7BY1d9+1+9Sn +RreFw9pob3ZYl0R4t0Qoy7Md2iV2caME+q5O+mRkr0RIK7XOpf3htPebVVREr1Ro7Wlhri/N +S0Sj+yUi+sTM3XYIeR8P7ZdmPzG0Q+xyu1joAzGqqNBO8fBOUZcbh4WUP+cQ/kTU/Zhvi9gl +Fm2pYsO66QJDH4iHtDHe/33nadohlv+STnkLtDM5c37dLqU+c9mXlpC/jJw55CzRjMicRf48 +7dnOX6TzU7fnzNIn81iF5M7Rx7msom5NsrKtoODl+iMolmXO0Weo42zWXfRzF5E3R5sKVDl0 +ftbTsxfpDNQSgLqXMtqpurEz04sC1hY5dZIqh7KrqQUCtWqgKJzByp+xydHHrjx9yxxxhW2F +qLBLLaLeedwO+QIXW/+2MikyNgn7lAgENIhS+pRKAdUCPtVCwT+gW6kMfmU81vEnLVPP+jcy +qGqQqDASFUbo/N/A6HZadV6kI8co7SlOa0ZKn/41/GJQNjnN5VbqdsZlqpx2RnDTnwlUox/3 +1z7rw6UzpUApfZfHSjnzPyG8hNK2GazPzB+O62AHfVGPyJoldP4g6fxKXQZW89unnDKLO2GR +wu3X9FdqTKoc/yoB37tCXrm8XhXCF1tIzPZP4vI0UodwuQq+JfArwaX7SJv+EQFdVJ5xXBuk +N7KjuhD7/AcCNdkRZeNIHkB0H7219GNCxQid30M6U6taC5/tfzjyEafsp4f5PxH3OO7XJk6t +tcO7xCmahHSKh7HW3WzlSy2u6VCuFlqzh7GOWetcRkinRPSAmJH9dsnLnNYXjlveFAhnBX2F +d4tfbhW92EItzKkyaQPgUjOh89sStXz2i8Z2bgjpQlALaqFIekGvrNkpd5YOFGGHYFHr2ew5 ++pNewDKR04MTdvBqgnMegh7SAV30mnqZrhWl6+kVNLXIXUTAVdiWI7YBziW4Obe+6M6ZW1+b +57GeQi2TbxI6v990DulgGHlt57rMnbKgHFN14qTS5+eyeI2cd55Q+EIp6pS579cnFbYJ+5/w +bxUPKDzJI/fHA9rfON8VPZ9+jI/x8SGNr0wKhMI7RU29dx+U/vQg328lQk9Y+XIYhXEou3zJ +p7iNU2G3dano5WpuMfVPDyhsF3f51qGSEdrKIHR+g84L8IoEdxCSh5HwmNakWZPwDAevKiQ9 +YFuJy2XQzEHWGJxi4VMDq0DwakArHund4LSBVyPsMqEfCj4VnJEFjxkiHtD72nSeOKQ8hsBJ +fCUFr3y4lOBGBxR0waUCzybE36f3wkR1IOyOK8PIfkHo/H7TuZNh6v35Lukdav4HpfW3nzHd +71LMdVbwI5FLXGbeX+0+8DtuzW3b9n0kHnhC3vIzDssDSh57VcIPcwttkwo6Yejz5UGlb20T +D3IofnkukVOI8XvxyxzK4rskjb8+Jvp7uaiTiorbBQ2PaHjuOmV1xCJkz0G+PxkWM8LbCZ3f +SJQm9YvCn47glCxOSkMzARF3cEYVPmUQ0YJgHLxu4EgwckegbgntaOiEwDwA3/DB8zZOu8Cv +Frw20MpHXDNUzCERhegqqF2AeSD2nqF3vc3N6cCSgDhIuUHKEpJRCEoCjw1sYnBaDG4lEDGG +XBYrhpzQ+f2ms5nX559y/1FQf6eg6X77MtFLladENLdbVoqaOH3+p9PbpJ32ipnsNY45zq/9 +J5l0kcQRmcCbBz8X2+XQLhNdcZLv5FcqbjtOOxyJeCpj4bFDOvyYqtxX0mZ7hQ13ObaK29rt +FVbeJ2b5mVKG6I3Ws5LGXxgWihI6v107e0ZBJB5lTJoLpUyabpwe9IFjNKQS4JWAU5EonoaO +AzQuwSoGlsE4JACPQprOvnch4gqbJoQXwyALeUxcKYRhOCwv4iA3PDvh6gbLUkRmQsIKvPrw +GELjAs7aQdEfSk7IWIK2H8RTCZ0/AGPbwHXb0fOnrj+VvfJQklrkBt0+wSf3iUGJqFvkfi6F +3abJnJL235pm8ihbf35Qd4+IwS5R70OCEp8JOR1Ssf3ikPYhl1tHOeW/kA86dIbnNyJBx5TF +donp7+bR3G7TwDA3/lJA5aB2wG4OvX3aXl8eFPjUuIRo57dq50V4XsY3hvAugEc2vGsRUQFR +LZjHQ0ATkqkIz8K3irC6Dl45CCjRMdUuCeDkg2UijtnAuwaCtjipj5MarHepKNvbBVw6cEnC +8dOwqoGbG0R94RENaU8oOkDQG04Xwe8I+2sQN0bqDJRdIZy0/r4VofN7S+dLrQynxCPqCWep +A3rTqoURVM1jcPEQtcgNbxc29919QvZTEWrt3CIeXH5GXO8zTt39TncZgYUnxZU/PWnyjW2Z +SPgDhmPUt1yqXwhb7zXNPmsdyGESxakfftSjkeF6heNc2Nng+/yqtrs4ZP6wT3ibWRmh81tf +Ip7HlTKI6UFQh07CXrgyiuhCKJjiqAoEE1E4BVMPOsjTMhkBFVA3g7w7TMIRUA3zLET2wuEm +5O0hogsRPch6IayRziPnBuPLCOhA3F0oecI1C+6VSBmArg2EjHGhC/EtcExF+jQ88+BQz4oe +IXR+j+kc3ERHZIVvfuWB9Vr05RbRoPuM0G7JqIdSkV3r29ORfVLRffSli23iEf1SUXScGP3C +csgDiah+ycheydA2RkiXOHsX+xI1VzwQj+gTc4s/LCDz6THBTyV8jvtthIEROn//BwSyFmgW +sN9ZLl5F1jSyl1DJhN1ViCXRvuhC9hvKy7RlXsh6A7pgld6hLliio8LylugXk9klFK3S3u+i +V3lm6Zg06piyAXIX6AoXsrLR5+dotzbbPMibo6tBXGHvNZ1/7tQsGlgr4J7P41rEf6GZcamF +bFT9xJQ2ipQxEhVG6LxF0sVmxuV2MXbkGAkj+ekRJn/7j4wROhM6k1/y3Bp0JjHbHx6d7/ec +kP78ymOJUNY7RyRtTlF9kvaFHJLy75zOglJIHkMB6zcKSNqcqCW/tG1JehJh7lvR3ty17dC/ +mqbuPxe7bysko/iDNjdPbJHKGCd8K+Xzx7P8p94tnZf/eOgk7LPhXQavO//zKbCG9nJvhZpQ +KfgeDkoUpJI/tXk7xsbGtLQ0NTTVt0iSkBL/Ysf2rVMfdU21wMDAd9wpjk5OqhpaqppbInGc +OMV1lmeLVIZO6uqdHR2Eue8Fnjwe0lDXJHLYOrCztvLz8SZyIPhr1vIdHcrKykQOWwTT09N7 +9uz5+uuvl8lfKhMQOr/nKCkp+bu/+7t/+qd/qq+vJ9IgIHR+r2Fvbw8WXFxciDQICJ3fX0xO +Tm7bto1N5yNHjszPz38oS4h+5pUrzLZh0sWEzr8cPHny5MKFCxwcHHJycuHh4ePj4x9Es1aY +bgwmwIxoIF38c6P12TNxLS0ih62ANdanoavrzYqKV1/fezzIZP4GTPyaGd+6dSvZ1cXU1PwA +0qSkZOn27R9GWz6EpKVVt3fvIx4e6uBDaE55GlNNlLnzG+Z//Yl57f7WpbOiIm0/kEQSSX8m +/fP/xTx2jplzlfnZp8wrjVuXzk+fMu3t3+/k4EClMT29jD17mI6O9Nf3vUUfRCo+erRLSur9 +b4gDU+oE85+3MUvGmEOZzN//gRnbRtZTPzf6Zmak9PWJHLYO9J2dk0tLP4SWBCgx8b+YX+xm +fvIR8+//nvmbr5mJ90n//kxYWlpKSUkxNTXdv3+/v79/XV0dkclWgKWlZUZGxofg0E69xFSU +Z4oxmCe/oem8V5BZ0EX69+cS98qKrKwsNpCfn09kQuj8s2Agg/nFTmZaH+ncnxXp6en/8A// +QHH58OHDMzMzRCCEzj8LXs4zh4eZ8yQK/efFyMjIzp07KTrb29sTaRA6E7zvUFFRoRT07du3 +iSgInQned6SmpnJwcCwuLhJRbBHY2Njk5uYSObwXWFtbffpsrLt/q6TCknoDU6e+wYktUp/e +gbGpqel33Cnj45M9D7dKj8irGASHxG2VEdI39nhobOUlWfa+HX39j/d/9f8pi/xaWWBLJFWh +f1MS2CqVURb6tSTXr+XlJN9lj6yuMXm5OeR5f60suCWEIH36H+V4/nmr9Ijorw999eui2+WE +uW/FvfsDmoJg3gezesuk2i1Tk3o8S4Cc5Nl32SOLL5kS/LtWCraMHO5upR7pgIsC4lOKCXPf +isaWQU3hf2DWgVlK0hupCg9joSjL/47pLC2050U2mOWkC95ITXBSQFJ6CWEuoTOhM6EzoTOh +M6EzofOHQ+cKMCtZqeKddFnFppFc8RNHNZW57EfnrPxLmX8hdC7b6N/KDQFu/lq+6WvFGwIs +J3R+z+i8kI/hdDxNxWg2qwd/1v66g8VCrNxhDaoyrBRh8fZPuHcqFwu3fwSjK7BWjNEMrBA6 +l2KtBDNZeJaGp2kYz1//+pT1dTIfczl4mo6JLIzexPAtvLyzweU7tAAXb//o+ZPQ+X+czhR5 +s6DLAdHTUOSD/BlkhmC5ih7nzEYw77G6tZZ1XLs+/unj+o0ZvobudLrwKtZxA+uzjHXjPdZB +Oetk48YsUYm1TKh/AhNz1vksSOyGoimrwHpWthrWLXWsq+yn1LKOG1gH+UjwQnMm6+s91mc5 +yx3KrlI1qzIsLi/nI04eQofgaovl6l82nevR4wqhXZDlgSIP/IPR7giBryDP+hoegCJbyHPh +6G6cOQ4DJTwuXO+stHMQOAwDI0yXvUNGEzr/jXROheoZ3L1Fs6POFIZimK3DdALOq8DdACNF +aPOHjTyu+mCtBhPX4SQJD2OM3sFMPPKDsVKBRle0XUH5JXio4KofPfmnGMBWB48KwMzDdV3Y +q6ExhfWsaqzchPq/Yzsfxmsxdh5/+HfwG9O3pFvAWgGZ4TRnrzrAk3q6KaZL0Xse4ZowUUTW +NTBLkBGIlgSUeuGSJpy1MViI8Wg4SyLQHDfDNyaNaizGwV4YwRbQUMZ8zS+bzvfQZAotcYyV +YrWU7uVqXejKYaYcq3c2pug8uo/iYzcmbcrkLoAtN8KNYaSB3sJ3tQojdP7b6ZwJuT3g4wTv +PpzmQPkNrGbBXQCastDmgNZZCH0LO23YSqEpEoaSOG+HaBVYOaDdGyaaWKpBNBeSHGHCgKwy +7mej1ATnFOEnjxvuiNSFhABshcAngvZ8eotzPgmBXBDjwt1YpGiAcRJqThgIg5MuwlTBOITm +SHAdha8DguTg6YEEUcjzIdUZkqJovgY1JcT6wZAbXva4IAI7aTiKIcoRzgwI6LC2UFmNWsiF +PS927kNlGq1Z1sftL5XOHXY4/geIn4bMadTcQpsVjnwCyTOQOYOaRJbQcuGkgcRYlnXEsrTX +7uCaJHbsREo0Lc8VYmy/L3ROg+ZZ3E3DXRvICuJ5NeYjIbMNRipwUIS/GS6rwVUDF41x0wza +SphtAjMBvGq44wZnI9qWSxTCLWdYaOEqpUBbcIUPUf5gtoGZDZMzkBKDkwqMddGTR0/+s/EI +YiDKGE5acNCCmxG07fAwAglOuKIK/u2oCoWeASbvYjYaIpqIUEBqAJidCDmBbA8Y6CDeD76q +6CpHnzW0vwK/Cv3QvgvQMt4w9cuQpIEAF1yRgSwvbvhipeoXTef75tARx+N8zOTjZR3uGkBf +Fs8LMZOHlyUszZsDRw0kXGctWMrozzxjnDdHtCnEeeDrhuXKd2VvEzr/zca2wkk05NBcCGXA +0BAzqfBgID8Ozb6IN4bPORQG0crO8Rx0JJEYgkITaJmg5zIURFAWCeN9iHOGkRouR9DhZzlq +sNBDlgOiHeGriQs+eHwFsR4YKabp/CIO7tyoCsfuf4W4ONJdoWCFdDmYaKHOF9J7UHABUnxI +CsFNPVjbI1kWpkpoioCqAGojoaGCGG94KqClGPcNYMoBPQaKwhGpBikDlqIpo1fQ4cII8Ea3 +P7b/K7TMsVT7C6ZzAxqMoM7ANNsl0oBKLWjJYqFmY21SQU+8Fkq4FvMdna9Jw0oXT2Jw8r/A +LYcFQuf3gs4VtD/qsgF6c2kuTFyFtx6eFONxKLR5oMZAww0UWUNJAO4WGC1B3yVonYGRIh5k +06y5pgIdCfip03Z4jCsK4+lClm7hojykhFCaiIUUuIhAgRcpIViuoIfTQjrSjfA4EwEiuOiL +zkgEBeJpJM7xwE4DflqoCYYIP/1Eax1MVCBHCnKHoSCJpCjaDR7qhLIo3HLC4G30e+OmE/rC +4SAGuZNgGG8Y2xV4kQRPGaiII9MbMW54XPAD3Pkl0LkW/b4It8Js2bprscsTkfZYrNhgaDnt +r7jhjPKU7wi+nImrClAWoefhNBt0Zb+r5TOh89+4UVW2YaPe2XBWl214qmvX/Vf0cTWr39nn +aza2L2s3srGoyt7doI9fnazYyFO5aTfzlfu6atOWd+26j3otASKK6Cpad3enUJa5AyvmvGpd +cdC3sJ3VrKoWOcBMFsoSSIna9JTKjXrWsG78JbvC7rAkUP0DX1+NgerX61OxSYDVxLNNosI2 +DZVX6c0zb6S1YgxlYGljY/rFLXqv+e0jv4z2dT+OQ/VltCX/Vepjq9H5TVm94675M9nePCZ0 +/kXRuWKT8n01DCo2vpZvnHyl2cs2hTBtYtxf4GkVS7NXfRBBnuy4rLINKf38Ma7rj/vzAYGV +m7R59Yb3+8fPGITOHwCdK1AfAN8AlBtBlAOyZyDLj5wE9AdA4Cjr62lcdUagCqRPgPcIJLno +LbClyncbg7R16FxOWxrXtCBykhaOlBCSw/GSPR82bMTzsGN46jZoUr8Rn1O+cbJqw5C+t+FG +qGPlYU+V7OMqlr3NWhaFyNMbhdTjzHTQnrWx5HkVMrQxtWbrQ0Yeo6wnluhDkR9Dr0quZZV2 +dyOqh13huo3AntvI8MGdRNYxOzSoaiPKqH6jhoTO7wWdK5FnCzkr3BCDvSXm7mC2APMVyDbG +aVXMlWIuD3P5mCxAjx+EpVCdgIkCrJW920puHTpX0Ju/NooICaPjXuhJjx8DJWAWocAGoQ4Y +vo35ZHrnKCWQte9WjrseCDZCVwYdBHI/CPOleJKAuiSMxyPXCUn+WK1EVwDCTFmewArc80Oo +Ke6nbCjlQhicQlQgnhXQAWAaCli5h6FIhJqg6JUXgkXnGEng31GUSB9r7MTHv8NgCTou45Ix +bl+lZ4+BEGQ74aIVevOwlo3aQFwzRMZFupJVoWhJw2ACsn1od1x9Csvd4YgrLrh3GS9K3pi9 +CZ23Kp2pXtN0QJoUjn0LHQasVDFWgWorfPYldMRgoIjWTHoaX4iBmjYGiv5ag/mDoXMRXMVw +mguaQvR2uZcL5sqRroZzwjBmQF0WxjJQEIOyGHJuoNID0iLwVYKJKiouwPYQrTFvmkPFDjla +4DmDpDCaywbHocMLB0vUnYcuA9YSUD6DlmyWBi+EBT+yr9NuxtVknJdGdjAdC2QuB2Ve3Ihm +aViWPk0wA+d+XPHFcDi0T0DtOGrD6FgCDxVIHkVnFqJOQuIsXJWgrINGP4gehbM6dE4gPwDW +mogIxVUNHBeArwr0lZBshXOy8FaA0B50FL6x4iB03sJ01rBHijSMddB8He2xWKpCkQVOS6M5 +Fi3XMV1EW2sz0VDRRG/+O4wk3Jp0zoOLMny9UWgErgNoKaLPSO4FQwCGotAWgqsqTYdLFrgd +AT8ZRF+jB7+9GuyMcP4sxiuRbw89R+QaIvgCmO24pQUdHfpgrgShp3GSA8aSkOOjNxDp9S+L +zpkxLNqmIVAB5zXoiddYCircCAxERyiSXXD/Oq5Zw8YITnoI0IKnEjz4UR2JW65IMgTXb1B6 +A3GSyI6mjWfP47hiAn9TMB+g2xGe+rDURkwYrhjDPoBujrsEFA6g6iZ97H2WFShI6Pye0Dnf +DgrWiJegFc362xnVyDKBgB5rCFWv75FNR0FWFT2EzjmwU8WNeHpIxylBwxBLBbAUQNoVTKch +3hnXnHE7DH6isNREoAZs3TB7i1bZEa5wPIF7qQhVgbod8gwQ7E8LvMQI6pLojUOmKyJk6TA5 +anVDzbGDuSxDqBBG3EiOpF9RKbKEuTrK3KGlQ8+xtQGoScIda9gpIjcYESa0D+TyIfxuP274 +IJAXl5XoIIHOaGjtQcFVXBfBBWeMJ0KbFzcdYCKPvgLcVEaQKR0rGHUZEcawDaAnDVcZ6J/F +9UsYiYTeMXQUEDq/N66wKm/YeiBXG+HeGz6QKpQ7Qc/qNU/p7HVYmWKwgGhnXDTBzTjaU7SU +CBM+NNzCUDCMTkKMB+E+yLaBxEloi6IhCSMpsBSExFFcdqP9Eslq4OeAgTwC/FBhj7jLtK5c +uIVgYfDsRZArRtPgJgnJ43A1wCQ7wKAEPiLgPQZpLugo414GVovp4DqxE9BXRUcWzSz2T8yl +WONqNEq1wHsWPTcQKYNKf2hxwlAGRnzIj0GiAB1sLyqImCg8D4XyCchSlaHWVhm4aIG0KKQ6 +IigEzFsIM0ZNFHzkoc8H4a9Z0QWEzu/PvvMaK25h7c2Tf+nML/PXSNZeiaKcdgu/ZPFuOR8z +Bev+q7lczBVt7P0VYzpvw5lchtm8jVeVXxXC4uxs/nr+NSp/LtY2/f7DWgntkJzOwVLJRjl3 +MJOL5Tuv1W29Vq8CA1iRQpTl8KKA9bUKIZyIdsMMK6D0iR/MVNCfzQoCrKQzr21qF/X05zHw +Vcc5AVipYayMuMLeHzq/NUrhrXEIZYTOb8ihfNNB+cbVitfPV2zarK/YtJVf9rY8m483X91c +ZtkbeTb3Y/mmH4Qp/y4NRuJp5vrm9XwGHsTj5eY6b06VGIlDgg3iXDD01shbQuctHhVGfivs +x9P5PU21GxtbdzaF4P6Z2BX2TnoF2XcmdCZ0Jj/994unc/1fiJT+haZqDMT9z9B5NmfDrCVp +c7oPZ0LnH8a9+wOqfKyYui0y/Zb9T4SL/LB2HrwOGYkz75jOYrw75raOdi7fSnbCfdjLkH/B ++EE8HHhy6Js/ygr+VpZ/SyRJ7v/kO/KrLVIZWYHfMrh+q6qi8C57ZHWNKSxwRopnq/SIDN9H +cgK/2yo9IvTbI9/89k5ZFWHuD2Btanr+6fDc05Etke6UNwqKym+RylDp+djcwsK7/nfaubmF +Z6NbRALzgcFXElPzqIMtUZ/huYmpubXVVcLb9wLd3d2qqqpEDlsHKioqxsbGRA4EfwU6OjqU +lZWJHLYIhoeHd+7c+dvf/vbFixdEGgSEzu81MjMzAfzqV7+qqiLLVQJC5/cblJkNFnR1dT+U +Nq0wnz9m9vSwUi/zxSLpZULnXwKePXv2L//yL2w6f/nllxMTEx9Cq5YHmEI7mMB6im0iHU3o +/AtZOCclJZ3l4dHT00tNTZ2cnPwQWjV0m/nlHqZbPPN2ETM7h/l4inT0z4fWZ8/EtLWJHLaQ +ve3hkVVT8+G0J8+b+ZvjzFsVzPq2rVvJvj6mgcEHkCbk5Yt27Pgw2vJhpKr9+/sFBT+Q5jTU +MkP0mH/3K+a/Upb2/2Ke0Wf2TG9FOispfbccIIkkkt6aOA8yr3oyDfyYLW3M4nDm//PPTNmI +rUjnR4+YFhbvfbKymtDQyPvqK+qAaWn5IbTo/U+lBw/2MBgfSHMaKpjpUczc+yzOvGDu3cbc +acRcIyuq/36w4/Y6RkclWHsiJIxvi0Df2TmltPRDac1LpsZu5q/2MxseMVtvMv/j35k6caSL +fw4sLS1dvXpVVVX1yy+/tLKyqqurIzLZCrC0tMzIyPhw2tNdzDz1Bcv2/kcmlzFzcJ508c8E +IyMjbIDQmdD558JkP/NaNDMpmzlNbMCfEWVlZf/2b/9GcZnBYCwvLxOBEDoTvL9YXFzcv38/ +RWc/Pz8iDUJngvcdFhYWH330UWNjIxEFoTPB+47CwsKTJ08uLCwQUWwRmJmZ3bx5k8iB4K/A +s2fPrl+/TuSwdeDo6JiTk0PkQEDwAWB2dnZpaYnIgYCAgICAgIBgi+NxQ5ars7O7l5eHu6uz +5/XW528x4Z62Fp2nrlJw8c1ofEKdmemuCvN0p884e6RW9K0tjd3Orx+apQMAxjpbq4q6iCFI +QPDuMdpbn5QQY3DqlLKRT0JKyeNZJnNxvKuj8+nMq4iRtYJw3bMWgQUU0kLktZyLH892XXNT +l7HOoM7kxFqamcXn39KR9Sx9Qt/ScuWyqXzsNJEsAcH/EIrs7BJKaLW7OtITbqIrpyAja+Nf +Osj+oci1O9fM+I3cExKTbyVcUjX0rng615fsqyljEpOQdCvtip2NXXpJrplWYNVTms7tN6Id +tJNniEx/PF5OVeenRIWHUohJLBn5yZbNUkdVbnRkGHV7+JWcAarTloYLUq+zygtNzm+h9xfn +nze0t4+xfoJr4ml3VfdzIvUPF3O3zM2jszupo+o4TyGT5DUms9jH2dSpmD2ySmNMudSt/B10 +9n58JKDsKXWmI9ZTSUTL18ti7659Vqm9zIUWHSX/2ucr1KWuxBgnjUSinX+KhVQjtpdP3zUk +Ojo6LvH284XVlZXF6cnpl9TsujgzNj7Dflnw5crSzNTkHCXjlYWp6U0vKawNWkkrqVgFUrf7 +WVvbOqT0tGQLcir6RFEnwq2VTSIyOl4+u61mb1M+TGe/e/P8We9s8gLiB0znm2ZmUSw637nq +ImifRx3UBXmbWeayf1Gx8Lq1ZX4fdVByyVnLPW2OUsHRfoFBt6kzbbd81a2vjM70uMhZ5va8 +pG8M89XXo/MQ/FiM3VU6oex7o7CioqLl2ezi4G01TXklPZfk7HQ3C2VJhoZvTMPMk2pVXU1F +RRlFQ6/4K0EKEiqR5X3r7yqsDjppmDiEZVXV3iu6GmRpENXWnK8oYZNaXlnXUBdqbO4Xc295 +uMLAw7V6hM5+LztI7EIBofMHTOd0Y+OIjHbqaLqnzl1VU89YT87YMaV5dH3tfNVcN+EufTjd +ZCipHFnzuDM2wMMthebsy8fe6op2yfUtmSHGJsZWVoYyOlZx94aITH8CJu4pHOGW1DS1srK6 +VNQ10Z56UsWr88XwNQ2t88mtC1MdburmSbeuC2s61zzpC2KoeCW29Rb5qfnFravttSEXZQWG +mrEm4/C2/SqVoyurD/MEOEQNLA25937KaxBLL3wG83Xd3WrH6OyNeRdFA/MJnT9crE4MDo5M +rttvC8Od+dk59wa/+8XXqdFHA+Oz65qkp/fh0OTc2POnQxNs7TD5/GHLAJV5paexNCsr+97D +MSLQn4bhalVu+8rhDWnfTxJwT5xYGQoU0ouvocS+EG1nEBoXregT+2RlNEbB5WbN9FhDuNKF +uEl2B6z2Oeiez+mhDvq9dfWiyoeWe/LV9RKohdJ4bayulnvTONVt1drmtkXPWMZ2ipuwP6Ez +AcHPROcK6cPnMtrX/6FmsjHuhEX40NpKU6KPtr6pm62NkWFM691UfuvQ/sWn4QybpIqJ5zUX +pHyubtC511LJ/iprOhgsChWTdiq+k6qkHDJIM3Y21kpT2fnmC+Zs7sXzpob2fn4uelrn4uoH +idQJCH4WLI7fq2h9PvOS/W156klV+0OWqbR0vyQ5Mupm98QKc3G4pv3h3OriQH3n0Pjy4kT/ +vZ5Hy+vG9mxH04NH4yw/x8pkS13Ng4cDzc2D86yri8MPqutaaNNqbepuxvWIiKg7TWQpREBA +QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA +QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA +QEBAQEBA8K6xOPWsvrI0P+cV8hu7R8af9d69P7j0Mzzu2YN66hl1D8f+TJ6x4aHnL5Z/4OLK +8EBHxZ0idl0LbtePLq5fmH7aU9PYv/DmDTND9xrujyysvXHhRefdxocj8z+1CQsTQ02VZRsS +y73bMcw6vfysd+D5xMJ/i5RWXwxVFuRWdQ6t/rj8a2sLkzMLtHAGex6OvPjxD5oZ6qstK8nd +6Pvi+s7XO325/34FLefy1tnvVeXl6N07BdSlu22P31Lu0lR7Q3Vx/kbBeWUD4+wOXR1/0l1R +WvxqtFU09G8qeLm7sZJ+XFn98ze65eWL4Y6Ovsmltbe3ZHluZm5+5Uc0ebS/MS+ndGB04YOk +c3uy88cf7VExNNuATWzBg4H2spi0urn/5kcttRVEmhubmpmZ6hk4xKY1L76Vy00pDEW5S3fH +f6CQcR9Frm0HRdbramZuaH3hTtckdeFp653opKo3h/LqcEt8QlrX1BvMWB7Jj0ms6Zn8qc1o +izH97Pe7lY3W5aWjdC74ZsMqczxQQi8w+cF/xwz7LNxAU1rFODSv6eWPY3NNrI9H3D1qprmk +K6gaWf2jn7SWbSP6h52cBht9r6iseM4vZ5TFvJXR9qBAH1sne+q8uZGFkUtgSe80+7ah+qIg +S2dre1vqkpWZpa1X6uPXx8rig5tHtm3nV1ov2ERTVVHXNr97ihoDkQZCH+/hNV5/oKm6rLzd +1WK63KXnWYHuFlZ0mdZOzg6Wnrn3Hm0uc6Q8eP8BqVsDb53nl0tCfX3jG/5igyc7cxWlZPWt +Aqp7pj5IOt+PdTjEY/P0exRYXlpYXGbPg2MDDxqbHoy/mB0fn1p4uTo/OTo8/oJ1aW1ucmxk +YnZ5cW5qYmL0SW9TW9cUPT+uPepubWxsH3+drmtjTTbatllddMfPlF3i5lErG3ltpl1ZmLqX +k3rjqqeAkGhYA4tlL+cGunqeTW8uaMRDTljBp+xVP+YHmpyS9+x6wVxbWV5cWlmam3o2PbdR +7urU6OT07MLS0hJr3l4b6W1vbGx8+GyWfZVu5Aq7KbN9bY2NzRvKfXludPLFwsJMX3vT/Y7H +37NSmiPPHRQyH9r4+qIu4tA3UrltnWFKJsEpbDqvPOunH/TgKWvMrC2NT07PLc4/6W5pbO59 +8arRi+OdTY2NLT0vNpN2Zf5heRT3jjOBOd1sRTTe39nYeP/xNFvzrM5OTExNjvZ2NHc+mVhb +t6/6PYU4hY3CB54Ph5pKaEcUDXa2NN7vnNo08Cee9lL1eTT+PZ23estS5JR+xCbjqVT2GG9Y +PTWXjlw0VBCxS3y+3viZNF89EfPQ52vM1aFKLW5Jr7j77KevTXbaySuaRNzd3JfzrSlch6Wy +v6Pj6g1rJX7dhFXmaqSehKhVxnfN7UnlOSKX0fviwS3X45Kur6RaHmonbXJtbFOho5WXDh2V +y368vDhDWSILM88GmhqbBlnm0OJUpzEPj4he5MNRVs/OjVHSb+p9xp7B56enJ8Ynh1hdH+ui +svO0Zd0Ye9Zf7Gu/T8t2k6ZeHn1M3Tow+d2Z2ee99Jnn8+8FnZvjnA6ftRp8/WR1jONZ9chZ +5mp3SbSWmpa6tq2jscLOvRoVoy/yHaW4DcJY4lhKslMTMYvrr0sU38+lb2WuZu1Z2/+8Lu6C +lo62urqOiVN4ff/MpoG6PL+4riK7MvxFlOyaJ16j88xAY/qN3MHBqnMyEiH1Eyyq9Ed7+me3 +jGy2lbwUhKWds7+7c67ZgEssun68N8uXVz2ipTFNXsW/myX7tdEqfQOnhMQoZRX9kifTLaVx +5tr6Ghrqmqqm1+sGmC/7bAXkQ0uGVib7IjycdLXV1OX1zM9fbR1dYQ7fkeLn0Xa/6GenI83Q +8Awpmd5kxrVEGx7kN+p6xcHnxZz7BaIqGyJUzS6m9zFXJ0uuhVubn9PU1JTXtk8q7FtZ6jaW +4ZGw8r/sbawsrmzlnjayyFwa6brm4Wygp6GhqqrlcqXl1Zph/kmUs+IXv/nstIRDaefju4UR +RqqUMNW1TFyyG6hemr+qIcojom1moW15pZQ94Y40ZUjv+nTHIYmrOfVRpoxTjHMu9ibqchKq +nnG9tE2y8iA3zsJQV11dw8DCM61is228mmHNOKl98buRutimefiAfd6jpfYkAU654s2z/Nzz ++82d88y16hDdw8r+m42n2ac9jZ1PNs9J822ppw+Lp3R8R4piX70Dwn5LzLUrBlLCponfdd9k +jdB+vtDakdYY40+PK+d1DL26tLS4vNmiGq28fIRDqWTqZV2QwVkejYv+ATrqcuKGbsV9kyPN +t7i+2L7zgHDYnf6ZRw1BzhZUZyrqmwfGFFPjr/KS6d7jso5WJupqyvwn93+07Yi6f/zTkcHi +q7765/Q1NbUMDFxy2p5Rjxi4f8tcS0tVXVnJ1CO3gVpDrXXcSbU2oOSvZWToFE+NmS2PznT3 +P330JUNRlQ1T9zSKSLVXbU+pRQ/2lypL6KT30COtKc78008lSoZf5NiIHNe6yKbzDUt53nPX ++qujD39+LKadlS3RlVfei02/lgRPWYfop99btE53+9kqf7vrrFd65/etYuYau9s0JMTW6fy2 +pc/36bz20EGQ0zS5tTvLm1M6eHh+0Eda8XIZPRB70wM0rUI6G9NkZLWy6+6YKMteZT1z/lFD +Zdsj5kKX+RnpiLKuMl9TOdNrLDtyMspCQcE1feJ5pcieffrRtPG22nVL+qhM9sPvVHTrFaNv +udRK+5+yMJh7wURQxX9oYSREwTg05/FUZ4qqcQB7PulKdJNWch+c6DHk2i/qmEUP+Ll7useF +r90f70hzO6USwaLAWl1l7YOxTRbIeJ3OKdX8J8zZ5gRBMeM7w/RU8jDL9+xZq7aRsQiFo0fV +QpfWl8zrKiXZRMEghLKxV8O1ePlMb7Ae/tiaoeqf83imL0tMRLuIReKF5hR5HbuKoVdtWc20 +ETsq79pFN+T5xOR4TazD4ePa1WPLLTFW+7gdHr5lLToVJMPNcLz5F9wLbalc3wqE3u6myh0e +nRjuKtXh4dQOuUs9MfKcxBnNywPUhWfDE1NjxRd0DvMY0rbYi0eXLWQOfnVQiCGmbehd0PLo ++x3PovOdqdWa83Lbv1GpZ5lv8TaagsZUZdYi9bSML7VQsvNVUTS72sieZ320jS7ndpWF6H5+ +wrCHZau03jzPpRhOib3r1iVdsxi2sim4qHfGKnHuRZ8ln4BFUht1piHcTlrv8oPmQk0RtfR+ +lp3Ym6krb1E9tNVX3K0JznsPKWbUtbLR2fecanf1VXs+3St5CU5cWqHra4ynxSL8evmPp3Lt +xE7qXmbTOcFaScAotr8i8vQpiULaIbQYqXp8t4R5WlpyUlJKUrDxtq9lc7/nUXs597C7425O +mIKSaU7bSGfD7SQaaTWtz9bH5vOKn0jnAUdBDsPE5u4c35MyF+i5KMJBxTjp5dpMmL2BV9bA +Sl+6hJRmUW9/jIejpesFn4sRxY0sY2Sx05JfOSL1pgGfbED+us4aLjx/Rsqqvr1Y+oR4eA2r +DpP39CUEA6q+sxA64qx3/PYLQRl5FlTMfGI7hykCjV6QMbiY3ru2OlVflBIaGJGSmeKuwXtA +2qpjqN1IQMguqYd192MPVUHrrO6J5iwLPetA36DQazd7Xl/Xrz0pUz+hlNU9luetdtYybUM5 +tmgdE4uqao3R5hb3zHxdJrOx+tLaAcUUjUKNxPTi6tnzZriSqtOV6sYrRjsOMEJT0igp30wM +OLb7hFPmKy2zluco+YfP9ktT7ZAR3r1zB5eGd+MT2l6tCjXdd9Zp8C2euIkAKW5x54w3LwzU +s7sy6Xbz04W+nBPbP+cQpAvm59jz2V6hkMymWXpyWLhqxvjdjmNy1AVJgT1fbBfRv/xg9JUJ +t/bofmXqtWB9BeGD3xw3Cr6zsPamdl6p9lXkVPVluzwawpzEpS/MUw3XUjMMvrcydof/64O6 +XtdSkpKS01KtRM5I6EWmBVlyKwSyzYnGBFdO6cDntIP06Z206xcjYm6lxGpKnNyjea33fsKJ +/QoF7Cns5fzkxGR1tOWOPcIhybTo0pMvCe7fa57Zt9WN7RtOh7gt+l7vuKorFJ2js2JtT+mF +r9P5SZGwgH7B48lsa2q1FcryfKyk2KvSdK6M4jrOyKWXPXPhiqePiGq5uThRcPfy9g/NfjS7 +9sr9unkJbCMsahBUVJEdTWd18ki93bP619F5sk7lpEDY3dHeTO8T0gHUpLLck6evZZlVkmsu +a9FAWYcdCaJiyvm0McXsrc5wcbBUlpXSdsscmem2F1YLT0hUOyMdWPh0w3D2PSluVt1SJM0p +Glz6fJ3OksL+lcPfM7YffN/v/zRQxjAsd2C4JVmOV8QpOK25/3F3fpCAsHppT7OJoIBFbDt7 +wHqoC5umtLGthKzwQFsDZV5xveslPa/TWTmre/imoyy3TfoGZVt0OERCSpsoOou6pH+Pztf1 +pNbpbMjQjKpi8+6SopLD1cq7YWaHDwvZs7rExd3T53zMvYEXrxnbWsF0b65O5kTZcYqbVz6h +7YThykieE0rlo697KQcfTS2vlgaqHdUInnltApp79LivMo3dlU5RRV0vum5xHxZP7qDNhJH2 +vHPivDbXatmehjA9SSHTBLqvl0ay/LUFFKzv08ycK46OKWj+zoR/VHBx3w6xrIcLb6XzMXkP +dn80hDtJyAbOMRdCNFUNLza8fF7Ey3FYwczZmaqHs5u3j19mRXu2nxGntM96forOskHU2GrL +DOQVUApKLOgceF513eGUTODdyphj+xQLHn63aKiJsNr5pZC9O0t0bp7nL4RVPJze+nQ+wGXS +Mfc9Ottxa13taEqTkrJvZkl0uCTw4Ncyhc+X7oXpHNMMYpmGL4I1BHiM4x5WRp3iEM15QhO8 +LNxczi5hfay059n4Jj7c8EvND9zR03Jap8VS6zlx5YC8wbdUiKYz48/Q2VNeWPF8+auRVB5i +dkTStXdxrSPVnVM6gKbl2nCwtT7naWFplxxq2Cy0xDMkVLJ7xgd7B9Z9R/Vhe/fr3etvdRRU +jC5tSbPS0fHMZRdX6KMtZhb17Em5+DGhdTpP1OtLCgVUvU5nPoOOhTfpbBxd3FsTrH1aK4R9 +qilSZ9th2er+FhMB/u/orCZsntY2O/aoa2TdwL6iyC9ulbS8ic5qnAq3uuYfl1w6K+3SyRpf +8003+Dj0qh49jVLnEvk+neeu60mci6D4shpqIKrxis4KCtYRdc/qrsmoO/avG8Fd3h4XSwbn +NtFZ9ITmhQ1uTl01ZXwj4T5IKaiXg16q4tIemRuXliri3RXMg/sWmcsDRXInxQNzejcM68eh +liYWQcWr33OFHRRLbF2fN56WhZ3YfTq4lJpSX4bpSQga31hv7OqzQIXTJ1XCKJWR46x4Rj1w +eEMKIxVXZM5a1I283Eznw8fW6Xx0g873wig6X5hjLoaoqpmFdFDGj4WyVlDF+rRQEnYpPqOl +INiYU+o7Oh+XDZ5mLkcZi/G6VbCzJVqKfXXGY/BZk94pMf9S2gybq7+houaSnhKjLWPftt6w +h8E+vqUDs1uczo0x1rsO67a9Xs3yMLODUpdmmEt1ib7GFk6e3qGB5grbPpHIebSy8KhcQ05B +3dozNi5C68QBvnPXespCDu3jyXi0yprjuyOtTI0d3D09HQzULaLSml++Us4r44Xh3nZuPp6e +ni5urv6RGc/fuufwrFSen/dCLatH5oeyrsVX9m7eSxrzkOH8jEPOw5OGv4eXuYVPZiPNu4Y4 ++2+FvNhG86Nc74/+Y5dXOa2SXzTG8AnJZ7Z13fSzMrR1o+5ytbVyvHF3fv6BMYdQYNGTuf5K +W30zOzd3T0cXXROX7I4p5nAB99en/YpZGn28Vk3gjFf581c1aArV2nVCs/X723hDPsKaF249 +nO6/raEqr27j6X/lioeB4J/4NSq7GnS5ThlcaV1fGsidMUnreNKcqWNo4UHJycfRxPh8ceOz +73Tdo9ty+8Xim2eZy0NxQbZ6xk6enl7mhiaBydTac+6C5MGztknf229qTnIW4ddIzCn11hVS +CWXPdeMB4gw9X+p4ruCCq6GZA9VwMwMTt/M5YyuvTJvVVGOebxXOf7dnM9Gsc/yIhGs2xeIX +PaVWFiaWjlQVPd3tHXTM7RLqn7DvbM+OMVY3t/P2pi652VrpmoY2P39tG2OuJeHwl7yxTa90 +2WpJgN5ODt2mobEIbREunZhXps3Ks0rJg0e0wqpezvXdcLezd/TwovvV28neIaGi57WNqrLA +r7+RLJxcqXCX2CvmyO6Pu8HW/EKeVP2bIjz5ebWii7sf1SabGJtRytTJysrY9nzj09lib/V9 +gq7s/HXX7fYLnx+jlgbl12V5FS09PcMjo40luHZwulKKoLkgQlXLjBpa+poGPmEVL5nz+VG+ +eka2VI3szIyNLuaMvFzb4nSeGequrO148brTY+JxV+39gcXFuZnpiY768sys8rbbMVJGHndZ +bpnpwab46zF5Ne1DfX3tHU9mJx7VVt8bfrXOeTlWmpMUExNX/fDNveOVB7WFMTExaRWdyz+4 +6zre0tAwwN5lWRytzC1sfrLZsns50FaTnhwfw0JiWvnwwtvCSBZH6+91snfKWGEkzWNUeS/H +y7KoisXklLezhtPsqzCStamB/OSYmNjCx9OsuXh+pL6q/iH7/uWptob6/onvbOuZR+2VdW0v +vu8mWuxvbHv4jCb5xEDjjesx8fnVz8dGuvp6RmemOurrO5+wVdVCT3N9B2unbKq7PoWqTVxK +49Dru+UL4y01TU+n2RJaaCm4SdWsrIsdePPy4f2ae93P3tjSHytPTi2q6uh90Nz2mG3YLA/c +b+roZ9+13FaTRze8off1RdXa8wf3aloebnZKj/U2FZS1rZtULyfrC1KpG+NvVX4v7OLlRE9G +cix1qaC6c+ktoTvPaqsans5sKnhppKq0rHt0+knn/fr218JjnnXWFtc9YGVd6qgouE4VmpLV +8fz7UQlLEwNV1ffHXq5N9N2vbuphP3RqsLuhsY8+XhouyEjOrKPtvRcPm1OvxVzbGBsjva3V +7DxU/iF6kLCLHmospZ5183brxOTz5uYB9vT8vKmMen7GvVdr5JW+u7To8qu7VpnvN+b6yy30 +bC5fTUlPTwxwdAlPurvEJCAgeE+xNtJZdeW8j4+Pf3pdPxEHAQEBAQEBAQEBAQEBAQEBAQEB +AQEBAQEBAQEBAQEBAQEBAQEBAQEBARv/PyjEf5A= + + +eNrsnQdcU1f7x+m2fdu+o7u1rXa4ESegKCKIAoIs2Xs4WLL3DiRh7703yN4j7L33FBDFASoq +Khsy/ie5ev9pEiBabdXen+eD4eaMe0/Ifb73Oec8h0RChAgRIkSIECFChAgRIkSIECFChAgR +IkSIECFChAgRIkSIECFChAgRIkSIECFChAgRIkSIECFChAgRIkSIECFChAgRIkSIECFChAgR +IkSIECFChAgRIkSIECFChAgRIkSIECFChAgRIkSI3jBNT097e3urMNLg4CB1zvHxcRUmVFtb +S9MEqGfdUuHh4fTntm4pLBZLX8rY2HjdgiAPTSlwAsxc3dTUFE3BrKysdUvR9CQQ6KV1S4Ga +aUqB1l9RTzLsTHCEmYL0zTHTmS/Wk/R/XYgQIUKECAEPBDwQ8EDAAxEiRGvLngkB80RfEBxc +tyB9KXCHWbcUMIg0pSorK9ct1dnZSVPq2rVrzFwdqJzGHDNTit40MNMnDHsyOjr6BXryzwtc +OAsLi4WFRSWdaD6CmZmZSiY0OTlJzzbrlqI3zdC5rS36jxuosbFx3YIgDz0dMXN1CwsL9H9g +65ai/2MGvbRuKVAzTSnQ+ivqSYadCY4wU5C+OWY688V6kv6vCxEiRG+QgKWD74csTGjTpk30 +lYCD6xakL6WqqrpuKfq7LrC865YCF8XQsK4rGrMOWmemFLiQF+gThj3Jw8PzAj35ssCDvt/+ +Lu3cuZPlperbb78FfLhhwwaWV6CLFy++oprBabO8SomJiTk4OLyUqj777DOGBIgIESJENDp2 +7Bhs3Jl5rqF/SGTy6fLvfSBi5nGb/umSmUfL1Z4u1+0Thj3JzNPlPwE8vv/+e2BztbW1US9P +iYmJQ0NDGAwG9bIF1ezs7PzSay4vL6+urka9SlVT9OfrsbKy2rVr11/MHgYGBrKysshtHBGi +Nxc8EP1j9RqCB6COzZs3v0HskZWV9TqDwVvJHjw8PAw9h4gQIULAAxECHs8LHkZGRsCQvUHs +UVFR8SqqRdgDAQ9EiBDwQISAx18DHpAhe1PYw9/f/xUhDcIeCHggQoSAB6K3Hjxm5pZcoipp +UvvgrfuP5mjKVreN0WQLTm0EOSennqzWXM/wJMh2/FwoSFD+4fEphuDxZrHHq3OnIOyBgAci +RAh4IPq7CIHhKuOXDh6AHD48aEWfvuVzApxAXRaQA8OcOyQ8AVcALKFpCxQHldBkBjlXAw+E +PRD2QMADESIEPBD9XYJWE7/0j4x58IASNXusBh4wflB7M0BB6rdAYgY8Xil7vPTVKAh7ULPH +K425gYAHIkQIeCB6K8EjsbAT/AoSzBgAGOjBAxyEsoF0wSkTLg5ew5kh0viWzymvegA6ArAE +0Ah1Hobg8erY41WsRkHYA/7IbG1tEfBAhAgRU+BBBP/ICejR7Mzde/du3br9+PGTleWVheXl +2YWFhbn5pbmFhfmF2YX52fm5+fnZuYXZWXKaA0fA70Agz8LcwuLcIsgGXsyTM8/Nzc8sgjQ3 +B96ZWVxYWllaXl66/+jB7cmJmbl5IvKRvH7gAV7Dx9kVA9YAD+o66b0ZcJ1Spglrnw9D8Hhe +9oiNVWMmdXZmJCScZzIz86mszOvGjfZXUTNIXV3ZIL2KmqmbKC52eYGCbm5W1J+CpKTkqxtw +QcADEaK3CjwIBDyRiKcQSGJaujvG1c7O3sEdnZCaVFJf09Lc2lnV2FpRX1ldU9JQU15XU11T +Xl5XXlpfgWuoLK2vqqyrrquuaaysbaxsaqxsralpqq2pr6ypqq6vrK8pq68uaaitqW1qq29u +wdWURySFWaNtUSiH1MKiBQL+n/xxDIzdpbbyryF4nNKKYBI8AG/QgMfw+BR0BNDLi4EH8+xx +8+ZPJBILc+k3EimY6czPlQRIpCwSacOrqdyBklheZTJ4gVIrK+9TfxB2dnavbrIHAh6IEL1V +4AGwg0DxehBIsYHh9koXPSytrdxsdC0vWdtYZYbFNOQWVVZV5lWX5+KKC0tw5B8lBYW4wgJc +YX5pYSGuCFdcXFpUUlZUWlJSllVRmlNeWlxUVJVfWFdQXF6Gy6uuzC8syfQLt7I01bHR8ra3 +Q13QjUq9vEhc+Sd/HKm4Hhrz/deABxTZlXo4fjXwYJXyppmSwRA8ZuaWYI+HuW8RvRvkglPm +Gste1gAPiD2++eabr9bU8jLL/Pw7bm6frJv8/X/MzVVhJid9Ak3g8SxrZGhu9goJ2cZ8hbW1 +H/T2vs9k5uvXKyIi9jCZubDwQ0AFKSkbmD+Z5ORTz9UbCQkbHjx4Jzf3I5rP4osvvvj888/L +ysoQ8HguwQOXq31ToHfXrQRad7baWjO4FZrE8F2a1WfUkjJNAN9uOYuk17Y/oTMECfQG86VA +j6Xiutddqbdurz5vKYYZJqYer/1BPFdzr6XHg0QgkFYooy0JEVHmR09b7eN201SNtLP2sLMx +MdJDYxwSEqLLS0saqmvqSqsqi8urSsqrissqi0srSkrLS3GlpaUlZbiysoLSivzCqsL8qhJw +56nFVdVXNuYVV/okJJi7ONgaXPI0MPA00goQV7ThPJWZmYnHI+DxN4AHwz9gmjke4PYFz9yg +XqtCP8cD5IfdHeAggBA4M3iLenIpuBXQL3tZFzyANm7ceP78+fjVRSC8t7T0STwTys/PHx0d +jX8hgSZAQ2tkuHPnDg6HY77C7m7x0dGjTGYGHcV8zQ0N5wF44HBWz3My3c/VG7dv74acHunp +ATRvHTly5FVEiXmLwYP6C0gz9Zo6w7d8TgyLgy8d+LbCnE+z1ow6J30e+HGDfoY5wzOh9nCe +0op4bbsUvikxCR7QfYy6f6BbFjNlV+t5eG4bvcCdkDozQ8gJSGlgOGmfvt3XnD06Ozvp90Mh +D7AQSbMk0iMSmT1i46NsJaRstu1z+npzzAG+RAtrR0tDQws9UytDF1entKTEzuLK6vLa0pLK +yqKKmqKK2qKKyhLAHaXFZQBB8svKc6tKCxrKS1vKyXwSlZRi6u6hY2drY2qAOq/pJyiB3cJm +uJXNhlcoJzON8M8Gj+sT02v/Yf8t4EGznJbmu7PGqhbwRaP/doCvM81yWmqXCPPggcVir6wu +IvE9PP7zK0zo+vXrjx8/vvJCAk2AhtbIMDc3d/PmTeYrvH9f9/FjCSYzg45ivubJSSxAgps3 +45/nZO4/V2/MzbFD4DE2VkHz1tmzZxHw+DNfQPrvyBrgAb6hq+HEGnOxEPCgcY+sdk97MfCA +02qtU0/IXy0bDB6rncmbAh6riUggzVHYgwieqqJDnc+p2vPyeG/fFbTjgL+4NPrISX959QBX +lAnGwtDOJCogoKi6GtfQWFpeVVFcUVNIdn2UA/Iow5WUlVRVlHdV1jUX4VKiIp3Q9oZm+hbm +Rv4ox+gzCuhNbKY/b/XeuUf/xDFLeenL2ZeXCcvI+NfrDB5hGc00OVcDD5qFKtRKLuqi+WLS +4BYCHgh4/MNF/wWk8Q2uBh7UD86QeYIj+0E+kNXA46CCPxTTD0rgkQGKIghnAF9Smhg+byt4 +UFMHuHxNx3RQBBqpeV7wAKWgzoem5dODH00ROMgAw2zU4MHwQt508CAtURJ5yIUUFxfmJHwG +tZ/dQuSIrapooIGWJzuv+zdswUdE/PQvufmgzNDmdj6ukZmXy+pqauvqKkvLyotx5cUl1RWV +1XXNtWUN2dGXXdDOWmgTXXcjrMm5+BOn/dmOOv6y22cnh50Iv6eiCPq0kCPvqaS81BXSCnLP +eQ2HWuDRk19FXFcDD2ioBdyaqCdyrNEE9T2N5r4Kg0dISIibmxsCHgh4IOBBY/JWAw/q7xT4 +2jKsmWH+2o5ra9vQte31WwMe1E9SoAjNkAfDoWFmOg10L8NZc7AfGL5nwmXp3cU04EE/4PIW +gAdh6Sl9hMWHWQoKm21nvcCx3UZBOMTFGqOpjGLndv1xD+pHVg9hsUBrY0cbM1sbcy9P18ys +tJq6qqqqysaa2prK6oTkTFcXb2MrC0t7cwc3S5Shqiv7/tj//ei/ebuhCK+7knSEgqwP/zHM +zgNO7MdS89MIBAQ8XjvwgP6G4fmiNN4J+sml1M9ca3/HV8sJg0dNTc3du3cjIyMR8Hgx8Ojr +66+pbc4vrBq96oCAx5sIHtBTNv13hCF4UBvNNbwTrxo84A0RQKKHH/CtN/ctgjMwnOh1/fZD +cBzOA8wx9VQxqBJwEM7A8GLdY6rh4oAfmASP1aIaPpfoO21i6vEa4AH7WEB3wa/pH9xg8ICv +heZu/BYMtTwhkh6TV7eQ4mMitOXPavNzO+7YHbjrsLeGurmSlL6MiMkpXgzrQf8fdgayHYrX +vhRlbo7V17M1NfDwds3Kz8nOzsO6eRiaGJvoa7t6oUJNjJy5eDw2bY/5lTWY86Aj/xEzBRGH +U3yhv+6N+H6r7UFOwzOnU/LS8Ah4/B3gweSqFhjLGUYupfYNwuOV1EwObh00d4/VbmvU4AHO +7cGDB8XFxeuCR2xCltI5Z+5TJifFUQ+nP792/Ttzm5DM7NKXCB4tbR2uXrGiUlZc/MZC0q6j +136afvSpoXlQUkrR0NDQi4FHVXWjT0DSxUteatq+RWXig1eOl1XWDw4O/nnw6O3tS7pcoKHl +clLUOiNHAyDBtWvRCHi8ceAB8zn1t4kheNCvYf+LwYNbIwQ+B4YTVFYbmaWZxAIPTDA01tRz +1FfzCNHkgQhk3QuhfhRi6C96YfDoGZ5cbeIo+JV6eAU+c/rRFhg8wHnCTVDfjd94jweRtPh0 +sIWUFhFlLSiOOiHod+aMB/dJH0l5Jy4+i90HUDw8QVLi/ieOu/66xXvbAW8uviAVtVCUnaOj +lbaRrpaRkaOrq6uzlYe0RIKSSuJ+Xovvf7HZuzdCRMRHVND5IKcrKzv2V1abbTv9ThxzlZE0 +FBK6nJOOJ+L/5Gk/C3v2F/XSy1V91/W1V2z97XE8oOW01GtV1l1OCzM5qAdayzYzt0jDJzRf +cxg88vPzi4qK4uPjAXsAW+zl5UUNHgMDZOtcXd2ore+5j+sC2yFtPjE3SfUYRd20kWtbWrsO +SGlECElhxOWdUNjopqbWFwOP9vZu8PNyWrGkvC0r+7mDPKYC0r4y5xOV9TLautmv3/xZRjNS +WMZFXduzoqqBGfCATruruzcyJktO1XHfET0eEayEaqSiTmpSpjKuiue0NFbHKDA6Lq+jo/vF +wAPAjLNrlKC4xQEeEwEpH5lzcVqmAUVlh/TNXQNDMxoaWxHweIPAA/wK7DLDcHw04MEQEgCr +rLEqFi4Sl9++dgZmwAOaNw5ZeYYDqdAAKzzzgfoJBb71wZYXXDWUDdQG34XyqgeocQV6l8ZF +QI1q1Mix7oWsFpXoz4PHJdec1fwYcKPwrRIuTuMLgsED9AbcD9Rd96aAB7gbMNxxjEgiEwBk +V1PDojwPi/j8wo7iOmwhKuBnauhyRsLt591hP+/xPcrteOqoleBR5927g77/JeCX7Z6ikv56 +xgbKyvrnNPxMreyFBdx37owVEA89KmjBL3BehA/Fzx25lS12I6vt7gMu3DxW/EdQpw/7HeZx +38+blJe5QoKClv1/wlMSEfqF8CxBR1coP6EjREomIuHZ0ZfEBOQ6nyUSTSKQm6PO8KfbXHc5 +LUAOAAkMFyL9NeCBCi2j+fqs9lWl3pYFYnLqeyn1Ri1r7NWCRqPd3d2zs7MbGxu7urqAKUxO +TobBw9E97riQIYABTj6r03KBcheTAQwo6aYraKeq6ieo6icqaF+Wu5gkez5OTNFPWAZtbBn8 +vODRemVsz6ELHDw6rJxa3EJO4ioRAA9AK4BtQOXaFqHaFmFQK1LqEaelndV1PNcFj/ikAj0j +71Oi5oBhBGX8ZS+QGUZJLx3UDE4b1CZPOWcJ5UDFc95Yz8TauhbmwQPAD9Y9huO4/lEhlKgS ++dyUL2WCPlHUSZPXSpY9Hy+pGnxW2c3WKTI3v3JtvwoCHq8PeJDopijQgwccoI/GttK7IKi/ +bgzXXzDMwAx4gASveoMeNOiRgObZCh5ZgJ/coVvKak4buCE4P/yYA/cVVCfoHPj5iPp2tMaF +wCfzssCD5l7HcNEi/C788LXaaAs1eFA/uNETy2sOHutGLiWvaomLcVZWs+M6avn7b45cRzwN +dD1EJTHcxzHHjjrs2un/+27sYS4sP1+AkCB6336jzb867Oey1VCzVpT23n3AYdNWJ77jISb6 +3hKilrzHTI9w2LPt9N9zIJJfyFZI0OUIj+fufUG//O60Y5eLuGRsbvoStKqFYschUU6DzBME +Ijm0yNOEp0rQEfAuEWTDE0nLIP1F4EGiAQ/in2wXgAfzy8z/FvAobRqBj0N3mDWeEaijeYC7 +zWorZehX3dKsagHIUVFRAV4UFhY+efKkvr5+06ZNADwsUCmHT5hJqEapGxWqG+WrGmQrX8og +G26tFPDzadJJBTYXJLmLCfIX454XPLJy605JuB0TtJHWjNcwLqK0kqUCWtGhtPL/DZFbAcCg +oJW0PniklIvKOokoBFNOuwCctop+BqAO+T/Ulqqomy53MVHufNwl8wjmweOUqOVRQZT0uQQV +/SxwquDyFbQuw9WCJK9NPm3ZczGnZVwu6vvX1La8ueBhYGAgKyv7DwEP6qd4+NtEDR7U36+/ +CzxYpbypD8KWkZ4i4MhmsJGF64chARSnuTPQdwvNNUI3K+icz+jHPO+YEfUta+0PCDp56sRw +yGONQAQ0uEjd4mqjLTTgQe1YhqDlTQcPIgGIbO5J5MmlUSbnVe0UJVHHDzkdOhQkpxpygN+K +i8tURdhF5ETEtv0hm/e4H+SykxHDqkjbcXFYHuS4pKloJHvGj3WP19ET1hqKLuY6kUeOuP76 +i92e7Rh+Ljc1eQcZCVtObt/N+zx+2+G/bZvVGV79c7KXs57N8SCukBOBkiivAVEsU35fpk1E +QLTLFDcHxe0BUGWF9DTy2UseVKFhDjzsaKHCtZcCHn9mUtPLAg9oJR2UaCZmwMehP3XqLyD9 +dwp+C/IZQkdO60VB/k9z3yJmAogB23316lV3d3fwOiws7NatW83NzeHh4QmXK83t400dMi3R +Rcq6aaoGeRomherGuSoGmYq6qTAYACRQNchVM8zXMMx6gaEWY5skU9t4R7c8e1fQSqqKfjZo +RcM4V9UgU4ni94BaUbmUDZKaQea64FFR3R4WXeQfVhKZUKtvnaOinwNXSMEDUFsK+Zz1c9SM +Cs6ZZEUlVjMPHt4BOUa2GcqXMgHSqBnmgDqV9dL/CGNkRlLSywR9As4/K7caiePxRoAH9YAL +MNZrD7VQT5kABhH6DjKcNgkfvOSas7YNfYFVLfRPJQCZoHWpawS4AHmoQ/1Qx92i396axncK +jRNBr7UwWQyh4qUMtdBPVmHYq+BiwWcB/Qoy0E9yox5sgvsfLkIzBk0DHtQDT9Dw95sOHgQS +YY5EhGJqJERF2fAKe+zidDvE6S18+rKOMeb4KbPtrA4HD9gdP+R67Igb33Fr1q1hmzam79yB +5uRyEJGz1dG20lJ3FJMy5OE25zuEVpYPPCbgv48XzceH5uUMO3TIZfsurT1sqENc7sInzQUO +Wp04an2UNzMzlYiHmGH5D4lIToAoiCRAIDSJvLkLAXI2QDRAzkV8aQ4PqoEdwh+HelaeJapx +nbcHPP5e8fPzw+Dh6uo6NTV148aNycnJuLg4aPwlKirq0aNHBbg2db3Q5IwaYNoamnrdA8s1 +jTKV9NI1TAqAHVczzAaWV8OoUEk3XcMoA+OLq2vqegHwsMNknNMPzytspsz36PUPrzhvQm5F +3ShfwzhP3SiH8qJQ0ygrNLaqu7d/XfBobulxcrucV9REmf85mJnX7OBeoqqfoQmoyShHzQBU +WKh8KcvEIT86qaa5tfe55ngApCkoaSzEtbn6l2kYZpBPzJRcrcqlDABjgDpAzYBn1A0ysL5l ++SXtjKbEIuDxmoIHtfWEDNZq4MHQbjKcevpKl9PC1hlukRp+oBkasOWlrj8qu5UGTiD7S23u +qcEDTtRxz14APKinpK59vQCBqMOeQGtn1ui0X0VcGd7b1wg1Rj86Qw8eNAMub4HH4+kmcQA8 +YmIc5VWsD3E5bt0eeJA7TF7d5aSwi4CAw/Ej1my7Qrbuw+xjxwgJ+PGddNm1z3YXK4qT21hN +SV9NxuUQuy3rdrvjXFHGRkESMmZ7OB33c3jsZfNk2x1+jActImR2iMN534HAbaxYVnbsKZHo +gtRlsu0GphwaXqGaPPHs5VOR4J9PDxPIXEJGkyVKIkDvk56WgF9Ar5kbY6GIQB7Aofh/yD+p +E/kI5VTJ7VJOmEh6CUMt4E4Sk9v2DwcPaWnppqYmX19fgBnBwcEPHz6MoKiurq6npycrK2vH +jh2xsbHV9YPn9cOiEyv/6E/o1DVP1LdOs8KUuAWUJaY3lld1/plVLbbOqVrGkZez6qgP1tR3 +XTSKs3TKdvTABURWpuU0d3X1M7mqpbG5G+OZlpVX/4fJJO19/qHFKI+igIiqnKK2xuaewcGh +F1jV4h+aV1jSCL3u7OovKW8Pi63SMkszsCsydCh28a+MTq4rLmvr6OxHIpe+ieBx/fZD6hUf +NOCRVdEH+wrO6MfQsMRfAB47Jb2Wlp8uEJiYenxMIwQqq4vNBke8E2qfOmR8CuGCYoZxNPVD +NczMLbb23bQOKKbuh76RO9AFgp9Xrt9be4qFgHYkfARUBffMGhcCGoXPB+QHrfcM//9aP/B6 +jZjna3eae0w1dETOIgmeXQ8fBG0BqKBOoCB8pZUto2uAB+guVbvUNRYBvVlzPJaJTzdsi0iM +0RMTNz10yFb0uKWmpIuBju8RAevfWU0597mJ8AdKi9qfPO60bQd23+/owzvR4sLWCkrntFT0 +Lii6Scu7HDtjyXPC+oKCDxeH6342C5njtgonHY9yO7AdtN+9z2svJ0r4ZNBZkRAeQXse/tSi +jBcx3BRrT8ATVvAryyTiPIE4hycQqOCBAEEC8TlqfpoZ/MQT5qemhuobussr+qpreiur+8qr ++surBksruoqKr3d1EBbnKGuOCYQ/7+8gkQrrhtb+w/7LJpf+vfr++++tra3v3LkD6AKwx+XL +lx88eNDa2uro6Ojk5AReXL16tbi4+OrV8aqq1vZOWp+AqV1yaVkrk+ZyXfBobe1uaurq7e2n +H4JpaOpezxYzXtXS1tbT3UNbYVR8aVt7L/OGniF45OTV1jV0/HG6aUtodPELRClBwOM1BA+a +kX36AGI0y0ghPwDNGhMmwYN6dui6O5VQz44w9y2iHiyAL4F6ICM4tZFmMxTYRoMXZt4FkO+C +fpYI9dgEeA2FN6RZ+ULtaaF2qjAZuZRmVgz1gM7zRi6F2wKwQT/FlOHQ2BqgyBA8INHEeH9T +PR7k+GFPwSMhJsZCQMxqK5vdjm2+EqJRTg7u6ipoLm7nbayoXbuCuI56q8jYn+L22fJ78M+/ +OLDt8xWTd9LVcdC/4C8qid6xG7trl7e6moeKElpJCS0vjWHfG/nzlvBfd9gIHPdSPBusIo86 +eUyPnV37OLdFgmdJT015R01xa2VBa0V+W0VRd01Jf335leamka7u0f4rN0bHbl+/de/2vYf3 +pmemZ+dnF5bm8fglZgz+87k7SORJrWT+mpntSEvH+QW2xCU0R0Q3hkQ0BITW+wQ2enhVOqNy +nRyvtTRSspNJh0DmlFf7ef1ly2n/dvAwMjJKSEhYXFwsLS0F7OHj4zM6Onr79u3Q0FDwq5aW +FsAScIShBTSxTaLxJ7yKAGKGVgml5S0vAB6rCYBHU0v3nwQPRutcWsNjSxHweGvAg3pk/wX2 +aqHx3q8NHs+7Vws0oECT4FkKcMAKaptOP9RCP30CCmayGhgwtLY0eZiM47GaHX/hvVqo26IJ +70aNiAx3fIMntMALZtcAD5q+fXM9HrCdjo+KNhE/a8lzzHvn7rCt7OEKGg6SkjbCpxx4ubF7 +9yZ/yxq497CNlIj90RO+e7ldtu7y3HnAQUnJQk4yhJXVY882Rz7OmIs6UQoaVpz8rr9xhO/Y +G8i5z4trn70Evz0/j/3ufZcO72PX5N1/jn+PuSS7o+QBp7P70TJ7XWV3e8jt8VPaHai8J0SF +I0iTO+jCiVBtwXA9iSgT5QRrnTRn02wPh/xAv4r4uMac/J7K2istfdcGb92ZePT48fLcAnnE +5cUEDa5Qrn68vt5PSqbM2YXU3Ueqb8KXVi0Wls5mFS6lpC0mxjdhUAWemNl7E7CXhEB8tWFE +/lHgAQCjoaFhYWGhv7/f1dUV/FpVVTU9PV1UVLRx40Y/P7/h4WGGFtDMLjEn/5WDh7FtQnnl +ywSP6ITS5tZXAh5hMTgEPN4sAUsEB/ZkmAEK/nlaL2rtSQjU8x+geQg007nhAKGtfTdXOweG +0xhoBMUR1cVmA+yB26WPSgoMIvW7oAl4sgQ8oxUUOajgD582FHeUpjnIxUF9afROAwHtSLgG ++AxXC3NKL3Aa0KyJNXpvDW5h2BZ8HLyAz2e1jxiKtkodADYV1w3vpEOfH/IgrZHhDQAPPAH/ +bFVLVGyMsYiYAy8vVvKUuRC/u4I6mpPHZNd2Gz52P+nTvny8Tjv3ObCyubFuiz7O5S4ppntS +UFdN3kheHHWC3/2MmKPQSTcVlbBD/JhNu4059nnKCAUInUAd2GPDts/l1z3ae/ecVOP52U/2 +fzb8G/WOf2p9+APnwx9hjnzkfuwTL75PfQU+9T/9WZDIhgixDyPFN0SKfRIp/km42EdhZz4I +EX4n8PT7fmc+8zv7tZ/ML36KbL4ax3y1FSNsTJI8XNNDo4rTshpx1X3N3WMD1yfHHz56sLQ4 +TyISGI7VEJ69eDpVFU/Gh4Xbd1NNLMwPsseqq91Lz5zPzH8QkXQvOPaOf9h9L68pF/SIEypP +X683NweKIkIkvPLoZf808IDW0t6+fXtqaio+Ph78Ghsbe/fu3by8PG9v7zUseF1D16sGj8i4 +0pa27pcIHqUVLd3d/S8dPF5YCHggQoToLwYPytxJsmJiYiwFxaxY91pyHzSVPO1qYYaVlLTd +uR2z5VdPzgOYU8etBflRe/eHbNocsWWL1Qnei6Ji+ueVzdVlrIWFbA9xY3YfdFdUcxeUwB4R +NDhzwlGQM/z3X31/2WK2j9v7iLDz8VNKJziOKB/ZbM73H8dT7zue+BDL9y+34x+7HvnIifMD +a46PLY5+bsH3sc3xD1DHPnHh/bcn3+e+/J+EnH4vRoIlUfadFPmPUqQ/TD77cZL0x/FSG6Il +PokQ2wBAJVDwP0Ei3wdIbPOR4fJVPRtqoBfvhM4OjC5NLGkpar3SNnr76sMnDwj4P2yGC6hj +gURaWSESlwmkpaUuv2iLfUeTTI0HU6N6wgJuBMVccwi6buF23cJ6xNJozNjg3iXzHiWdYl3T +h8PkyT8EyvTW55pMgoDHuuCBwWAAGzQ0NDx69Ki2thZa55KVlTU5ObnaUMtz6c/s1cKELX6+ +vVqeSwh4IOCBCNHbBB4rRMIC5B0gkuLiYi3OaZgf53H7eWv0rr0x51XQ4lKWfKI2J0Wsd7LG +fLcl4AC7w0kuV9HTzuwcmJ9/89/OYSmnYqAgF7CL3fOn3SghEXdzA3dxIRQXpyP7Hocdm124 +9rlJCpoLCvqy84btPBT+/U7DfWxyWlJnMFoiAfp7MbI/Yk5/7iPwXtAplhCBd8NE3g8W+8RL +6GMXvndduN/FHnrH+eC7KPYP7Dk+tjn0L+tDn9gc/MSR8zOXI5/68mwIP/leovC7WRLvZIm/ +my76TsqZdxNEP4gT/zBS4oNgsY+Cxb8KktrkL8MapMoXaaBx2RlbEHG5Iq+lvenqteGpmQcr +sMOCSLpRXe3NJeQicHa4DHenp77Qz63DxWfYGDNy3mhE62LvOdV+ecUhQekGTsHAHexl7p74 +xQXyyhrCGwkeoEJQc2dn52vyZ0kTx8PPz+/WrVtxcXHAiINTBb9u3LgRvADMgIAHAh7IbRwR +orcDPPAEwhLxKXgkR0TbKyhhxUXdjx724jyceFYhfPcxxwNHLJWkbUSFI7ZwBP663Yl9L1ry +tLuMKPbQQTc2TmMlZR0lOa/9hzx5jmPUpL0Mz4VzHfHevAW1Z4fbcQ4/BQlHqVPmRw5id2xH +bd0cuPlXh1NHtBRkYlNSrtwey+koccoPUkm04w7V3hKk9E2g5GeBov8KPv1RmND7ceLvpsq8 +myL1cZzoV6FCP3kf/9aNe4M7z3uuR95z5ngfdfA91IF3UfvfQ3N8gOL8yJnrYzeej334Pg0W ++iT8zIZo8Y/iz76TLMWSIsOSJMMSK8kSJPLvAMmffWT3eCuJBGhfirT1ywutqC++Mtb76MFE +goK6ww6OxvDYoY6O8orStLCQSpTzoJ5hm7hE9WmBvMOHM3ewpXy/OfGbn/z/920IF/ft2moS +ZXebVzq99C/bnfa1Ag9ohAUQAgaDaWpqmp6elpWV7e7uRsADAQ8EPBAheuMEHnIZr80kh+Z6 +GpQrISrankcYw8Zhxr3fQlYqwtghgJPPcdsma66t1tz7PA/zuPEJWO3e77Htt/ADbFZHuc3F +ZUyMNK30FVxFhE2OHXA9xOorL+V7XMBnH7+N4Gn0ce7EnRxBm7fr791txXcwTFs0R0siWPmU +qaRARHjA/ds3CUtzS/jlqUcPRm5eq+xpjSnPdEz3V4414w5SZfVU2OSu8I2n3H/9JP8TLPxl +5KlPE0+zZJxlyZR+P036kySp/8ZIfBkk/G/Pkx+487G48ryDOfIOiuN9+4Pv2+7/0O7ABruD +H9lxfozi/i+G70sXvnfN9nyAPvJ5nARLgsh7EYL/9Tv1X8+T29zFhIPOu7mYOO3cn2tuPjN+ +E1fb4p2UmZNXXOnh0aymlLZja+jGH3y/+i7gq+/Cvvs66fuvs775LvbLH+q0DJYm7r7qWR7/ +WPAAKikpAdQBXqSnp5uZmQ0ODoJ+QMADAQ/kNo4I0dshApEcxwOKyRmWEG0pJWvDesB2028e +R3g8L160k5J2FhG24thtveWHkF+3Yo7wOQsLBxw+GPDzZuefd6K5hMy11c01pd0PHTP+bbvV +of1+Fno+ClI2HEdMOLns2A56/cLhv43H6oS4ydGjMQrCA7YXGoylUnSFw21Vct2t6iMD23Oz +r3f1zk3PQCczv7Bw79HdkTtDTQNtWRW4wOwU88sBUnFWHBFqvwVLbfQX/9r7zJc+ol8GiH8Z +LPlFmNR/omXfS5FnSVV457LsBynSHyVKfhAj8mGU0AchJz725vsPmvcHa+6Nuvs+OPPFR1q/ +fRUj8lG+JEuxOEuRKEuhCEuW8MdhgmKn9oSdEb3XUb+4spJR3e4Un1vfPTKUk1d3QT1hy+/e +n34Z8uWm0O9+iti0MXXz9xXfbyz736aU39mvJGW96s/lnwweQBMTE+3t7dAmcaATxsbGEPD4 +J4MHIkSI3ibhifh5EmXfFDwpISrG9rymueAJl/37A/bu95M448jN53xS1FFA1PbwsaCdB7Db +fvfjPRJ05gyKkxO1fxd6z0EzORU9OVn0QU67fbzGEnJujibeIoet9/5sfGSnFud+PUllVx2U +haSRJtsJw127fQUOZJkK1WLEceZ8efonCs0ly1HncViTAh9UWVJoW23BrVv9K/jH/++MWcI/ +mZu/9niq8e6VstGGws6ChOpEj7xA48sYpXgrnlCt3X6qv3nJ/+gh+63n2f95iX3uL/6vELFP +wsU3RIu9Eyf5XpzUF9Gy3/qK/svu8GdefJ8kibHknGHJP/NOhsiHGWLv5kl+HS0ufGR7uqkx +aerm0vJyx9jtvJae6/emF66NN9o5ZPKcDPtmS8r/tmZ9tz1x068pv26u2crauutIAht3ZUDo +ysoyAh4vETySk5PDw8Nh8ADGi0Ag9Pb2srOz37t37+rVqwh4IOCBCBGit0PEFcIKgRJAjEhK +i4yxFpY04GB3EjnuqSgdpHvJ7dhxu61bMGwHvAXE/GTlMfxcLjt2hmzf57lvv7Ukv42CpJmG +uqmGkpvCWT+es/57hf2UlGxOsWqd2GzlIa9lLq4ozOds4mDjkyCiZcB/+qSc0gl92f1JmpyD +aLFmFG+ZJXudMWeXKV+PtXijgyzOVSXXVzsvBt1Qln11uGN67i6BhKejpMWlpbmZ+UdTs1N9 +94ZrhlvKW6sLqgri8hM80wJtk931EhyVIs3FgvV4QrX3h2mxBWuyBqntCFDeEqS4yf/sj/7i +P4RI/uh9ZpuLyK/eYnvdJc+cPRYR7PF46ub1sf72rpqR0eZ7d4ZWHt3tT83IVbh4eRdXxqe/ +4b7anc/KmXeUr5hXKOeEGM7MZryvd46IR+Z4vETwqK+vX1pays/PB699fX1xOFxiYuLy8vLs +7CwgkJGREQQ8EPBAhAjR2+LxIO8LC23S5pcQaSQobL91j9OOHZ6iYt5YZzNdTXPeI27bf/Pc +sjH08H43RWUrYaGwrdtSvtmE3sHhKK5ge0kTq6MQLizpsZkj5Jf9UXJSIRYyFqqc5p7iXjl6 +phe51E8e1HHEnAsKVjKzltXV1uA7aXhsf7CZWL27Qpu3ZKvbqXp7jipztmor9ib0yQ4PmVbX +89XOukUuWqXhVp24sImRuoXHE4SlldXJiTJctLKyDIhkaf7BwqNbM3evPhgfvHu169ZQ9WhH +/mB9Tn9NZld5RkNBdlXu5eqsqIrkaFxibHliauXlovJcXHX5nRvj1aXxEV7K+eHqxckWwwPV +90av5lui8o7xle9kr+IUyhaUipdWSTynn27tNFJfDxqcJa3gSW/eqpbp6enKysrJycnXDTzq +6uoAXUxMTPT29gLwACYM/MzIyBgbG2ttbX0p5hUBDwQ8EP29mplbggKkv+ZhrxD9BeCxSAEP +8PweGh+lIyyC5uF12r3bjZPLX1nN7bSko4CA2UkuuyN7Qn7f6cLGbi8qgOLlDDjMgWU94Lj3 +mJmqopmcmB/rITQHr6H4CbS2cEmQco4j70WNrx0iTzkFiBno8CkKCeoZWTp5RRvbBF/SRGtI +aoVHhA+3lpfHY3M8lOu8xfv8zvS7CTRaHqsx4Wm2Oj2AOXvVW27QW6YOK4ZzU66IcGzHpY+P +DM7MzBAIVG4Gyg5zS0RKRI61fDrUiUi+YALxCYG4SMCTCCtLy8s9fcMjY2Plxd6xThwFzjuT +XY6UV0eOTtwq9gkqOH2i7MzJyyoqKWaWWQFh+Sk5GYmZ3e2dROIK/tlioDcLPF7bOB4FBQW5 +ublYLLavrw/gB4CQkpISaH4p8iV9/cQDgQeJxODvMycnB+kgRAxFv4ktordbq65qebrjKlk3 +RkYvBwVjDfT0RIUuHjsaLqMSx3rcZROr1XEeN0VZb15+7M7tqF2sjnv3eAsdw0rzm/Dxaqtq +aijLWQjw2MqJnVM8bnH+dIwTb5HPTrPzX1yw3GoXJeYYpGh88dTpY4cuatmiXdKN0clqRn72 +nkm13UMTU5MDbeVVUU6lWLU2d5VRP41Bd9l2J94aC7Zqs31tKN4hX6nBIOUWX8UaL0Wcl2ZF +FKqvPG1ybGBudvaprwFPDuW1SHHXkFfmrDzb2B5PgravJRKfbWxP2duNMnZDDr/xmESap1z7 +0tJyd9+VgasjFUXeqVhOnNPmdNSenHRsZWtndmxmkp5OvqM5LjG6pqigoryypKImPTuvo6OL +SCA+3VP3lQkQAmCP6enpfwh4ODs7e3l5RUVFgdf5+fnz8/Pg8dnJyWnjxo2ARhCPB+LxQPTn +vQ1vN3jQh1v/K/X3tv7aatXIpTQYQiD09HT7+vlqqqlaaWo6CIk6srE7b9nluf+A5/EjjieP +YfZyRfy0JXbTD9ijbEYCQlrndHTUVR2FT5pzH9JiP4CWUfQw4Uny3Rzlskvz4s/W/sKOkVJO +UWIXTQTExaUNDLwdvC/ruMQqWfgbOHrHZhRcuXF35smTq511FXEuxW6aDa6yI/7iNwPPDHgI +1tlyl5ly1tpw97mdvu4vcTNQfNhTpBYlUuyuUZHo1dtU8eDhNOGp54OMGQQ8xZdBCeuFJ5KW +yeABSINAIQTyaBI4RiCnFYhHIGhYWlpq7+ju7u4oTnULt9qfYPJ1ovk2XCKmoaEvt7Adl1fa +3ljX0trS2NzU0NjU2tZaUFjY3t4Bx3p94/Q6Ry4FGhsba29vB7wREBAAOAH8evToUQQ8ngs8 +rl6tB+ktAw9Qp7e3N3IbfwHlVQ9AG5Ews2PaGwoepU0j0H4uf/0VDY9PXXDKhHZ4Qf7YXhg8 +IC0uLXe3tof6+ly4pKGmJm7Iz43eust/8y63g1xevIJhQrz+B393++Unjx1HzeU1baTl4ndw +Wmzm4t0iZSB4zk32YJHHdlz4r1iL39X1D9snKZrHcWESxS2w6rGp+dEZdWYeUfro+HNWvuet +PK09YzJKmybvPyKtzNzuq2lK8ShxO1eDURj0U5oMUbjjLzHofKLG7GiBEU+No8iAz9lroYpX +AhUa3WSKXNQKYzwGupqm7txaXl6i8t8QyeMgADPwc6TlJyT8PInMIGTyWKR4ORb/GH8DgEdL +S3trc31BkkOQ6bYY4/8mWG+tyXTp7R0sreqsr6/v7+vs7evv6yerqakpLy9vcHDwzf0zeM3B +w9fXF3TvxMREWFgY+LW5uXl8fDwnJ2cNI/jkidAzt/+6aQ+wYExnft5USTUA8dIT6ZXVDCX7 +FyuIxPF4/fVcW7W+oeChhclabXvfN9qH8w8BD2Cz8Xg8Af90Lcns7GxlW517mLuhrrIOD5fd +bnavbZzovYfR0ifQasft+fa77ztmK6dioiqF5jqktEP2l58M+Lees2DbU+3wY0P4F7k+2y5q +bdP2E7PN5jeMYnPLkooriewdf+AXk+DgnmHhnaPuEK5qG6ztHOESnlHZ1PtoljzT5P74cAcu +FxfoXI7W6ERLT/grTAUp3vaVbnQ4nWEumGUhWI0W6/OXvxaqNOQl2oQSLPfVb8mNvN7b+GT6 +/rPrIJAIM6SVh6SVRyTCIpFIWKbszLJIDjdKJhBa8GjrGOjtqMlxibDamWD1baL9roZCj7Gx +KzVNba0d9deuDYyP37h27TowggUFBb09PYuLi6SnW9Qi4PFywAOLxaampsL4UVpaOj09XVxc +DF6rq6uD12s4ExYXdwAL+Pix5P37umun6Wns4mLTutkYJiLxIxLpnTUyLC8PP37sy3yFCwts +8/PsTGYGHcV8zcvLP4D0XFc3N1fwXPlB/Qh4IOCBgAcCHi/L40GgiEggRxWDjkw/fFDbUIn2 +tD+nIIHlE7Hafwi9bXvgATbLEwetxYUdLmk5XFKylzjNt/3819+bsn1pob1FLNvgfz3R39SF +fhPquvUSStQ5V9k4ldUwabd9gmZcQdTg1QEHTJKZR7pVcN5FTLyafeQFx2gT19igRFzH4E2o +1Yd37vXVV1XG+JRiL7SgRG97CD8OkbodItfnKlxvdbTMaH+DBfu4+4npoDNj3hLNGPEqV+Xq +cLtO3OXbI31z8/BUFvKCnXlAUBTqIBDxJMI8OVEFOwfg0djc2tHaWJXpFmnLGe+wIw59uKU0 +8M7kzdbu3r4rnfcf3gIP3bW1teXl5eAFxBtEIhEBj5cIHhgMBvxxDgwMeHl5QewRGRl548aN +7u7ubdu2hYeHT01NrQYewHwDC3jjRtIrHWrB4z8nEt97iUMtDx+qAAv+KoZa5ubYQUIil76h +ot7SfXh8Ct6uXc4iaTXDB+/nDm1AD082gLahBwchywgNB5BrTnu6PX1e9QB9u9SbzsMHqReh +0GwiD17T7CAPtQttLk+ibBAPZWNopuH930GGNWahgIuCRjSoN6+H3gIFfxVxhauF2yVR7U0P +zj+xsBMqCK2pYbit/FmTePoN7sFZ0TQNEigFVULfva19N+F+g88EGpSBr5Thxw1ODKoQRkTw +AUFH4Eum6eq3xuMBvyAQyetsSc+iZN15ch9XW4oyN7IQFQ3YfzTuu12ojb9bHefVM1CzPS8T +cvCk5DcaP3xlseM/Hkqc5t4aO/rifq0J3VATtSXKS8kxUheN49VJZLVOPYNOkOwdqh0YuuXk +n2TqFu0UmmvqdVnTNlzLKUbfJcnKMyW3oPzR1NPFnnOzczcGOtuyQ0t9dWucz4xgeB77n1oO +FXzozT3syF5serQAJdPmrTQeqnInRHbUVbDJ8VSFh2Z5SlBnW/PU3TtQJeAK5oikRXA9+GXS +8jQJPwOBBwQPeDy+f2CopDA/I9wpEiUe7sgT5izcXXd5ZXFxZGxi/Pb1G7fGSkpKMjIygBF8 +8uTJ8vLym0sdr/NQi4eHR1dX17179xITEyH2CAsLe/DgwcjISHBwMDiOgAcCHv8oBwVk7KDX +UAKmEyQaSqHOAFtAyJjCVp4m+SbVwU3AVVEbUJqD1EcAljCsk/rEqOkCGFlq0qAHj1NaEdAR +agqiEbgcmq6gPiv6t+DK4beAWYffhdbzUv8KNwQBDLVrCLxLXz99JdSptuMa/CFSu0Hg/NT9 +CecEHQs3BJ0A6NJ1u/qt8Xj8P4SQV9qSF4asEJ8tFSGRmgc6/TDOtmLSKK6Tdgd5rA/x6SlL +m8qKeLHyyX9zYctnNj994KYoE5Psg+1MYK+JYWkN+aI+UCQoxAqbLm9XIKQbv8cjlzci1ZpA +ItyanApLSLdA+2GCLjsFZWg7Rpy3jzRySbHBBgeFRjS1dy2vPB3xWcYv35q80VqbXxtlW4aW +bXU+dctHcCZcYjxIrsRBPMtcqMj8ZJsD34T36ekgsRt+ki0uUqVY5ZJAy+b8+MnhDsL8NGX0 +hbwjzcrK0goeT3wmAoEAwGP8xo2aykpcWkJBnFtyiGGohzYuN/Hm9cmBgfH6xqac3OzkpOSy +srKGhoa2tjbwGL609FdMDgcfFoAExguR3kbwgJSfnz89PV1VVQVdO8C8W7duhYeHT0xMIOCB +gMc/CjygJ1xgg2BbDz0a09t3kBNYbWDXYA6BnqlX83hUtl6lMYvAslMbdMhnAn5CZeFsoBU4 +2yXXHHAC1GcLuw6oTwxul6HHAxT5ls9p3WEganqBLD548Kd2a6zm8aC+dug0II8H8+BBXQOo +FrwFXTXsNmHo8XgB8KDuK9DE9dsP4TOEnCEwO/0tI0p/GXgsk0hPKIlsZVdIpDnyIYACdyYm +Y+29TMVV9TXOG4lJ2yor259XMhGXF/jFnHWD49csaHnl3P7WsaYk6ba0fzX6fTAQxlYQpR+R +jHXIkrXJ5zKP5HRPlMttTAO1PpmZKSitsHPxdfSOcovKM3ZLVLMO18Cma3tlmnnFxqdm37w+ +Bk0FxVNO48njR+MjvQ0FifmBlsVYxWFv8YVwselA/muYo40WHMWm3CVWAs0uZ8cCFW4HyQz5 +yda4ypa6KjfG2I/WZj6aHINoauVpPI+nAqatr6+3uqK6DldViysoxSXlZEelpSRmXi5KScqN +jo9PTb9cXFRcXl5eXFwM8GNgYGB+fv4v+Lz+aXE8YAUHB4OrBkAIuhogBxsbGxaLHR4eRsAD +AY9/GnjAQw8Qe0DWk94mUrvfYfsFD7jQz/GYmVukcWVAPABXCD1Tg2phw0dTFfVgAbWLhgY8 +aJwq9OABlaXJs0afUA8DMTPHg5oKqAGDSfCgtvXU2dad4/EC4EHjykjFddPPzIEB7A1yejwv +eKyQiHNE8hpUImVB6jKeuIgn4okE/CKp0Smp3jaxvKgamAkJYQFNZUkXezfRfZFb3nf/9j1X +vkPB/S23mjIsutJ+rQ/4tCvsq9a44+UFUa7pVo5FYtaJvC7pohbxMvUdZeRW8Cst3X0uQbGm +rpHOUUUWAQXydulKzjnGPrnW7tFuXiGVFdWL83PQhI2n4y/LK7fu3uluqysNsWhyEhrHHJ4P +FpyJkr/qL9eElSix4C8xPdZof3LAS+xGmOy1IOluN7FatEyFn1FTTsyNoV7YX4Enz2QhCzxT +93T3tzT2Vdc2ldbjcDVFOFxpSUFFblZBbmF2WRWupqa6tqamsbGxt6/37t27hFcbK/2fDh5A +GAwGmLDp6emUlBSGcTyaWzuzcsrCIrNCwnOujx8EFnBwMOo1B4/BwcH2ju6Kqsb8wuoiXP3N +W7L37um8LPDo7unNzi3DuMVoGfhdG98+eYe1pq4ZAY83GjyojSxks6jBg9qKQY/wUIKLw4aS +4eRS2CJD2aA8sLcfIgHY0wK7MhiiDrV/Y7UjDM009BrYembmvcDWGRhferO7LnjQEAuT4EHP +VK8OPGjmpgakNFD7sqAEfyKvwzzhVwQe5JEJPJEScIu0TCTOEslTNJdIhOGrk+XnQx97tRKX +iEO3rtt6oiNjQga7b8rzFH3L4vvDBo/9Xzs3FAwPNsQ3xR3sSfi5LvDj/sSv6rNNipuqbZK0 +fcoFzRMF0aXCrhGaQ8NdUFNjd+4HJhVfwkQ7hBa7hpeaouLOW4aZuqVZeWdaYCIj4zKGh8dI +lDChBNLTaKHg5/17E3VleVlhrhku2jVu8uN+EnNhYjNBwjc9TrXZcpeacFRYcHY5Hb/ue2Yi +WP6Kn1I1Wr7U5XxVrEdvS82T6Sl4lgZ+ZXH2yczk5MzQ9cm2a0PNo70dQ4N9fcN9Pf1Dg91D +Az0jo1fHbtyauvdg/snsMn4ZT56BiyfPgqGcBiV+Kjl+CAEaj4Jmn5IT8emQ1bOwqQh4MAke +QDU1NUNDQ5OTk8nJyV5eXvS2r7e3V+2i036uC00te1+dx6O/v9/YwnvvoQvXxr9aWXn/z3s8 +mpradPQ9pJUcrl0/+1I8HiWlNTaOoadEzTl4zQVl/GXOJ3b37+nsZRWRddUxDoiOy2tp7UDA +400ED5qZBjTgsdr8DXp7yrBCGhMGGWh4PgPUClSQHnVojPUa4EG/0IM6M9QWtfOE+Tke4Fdq +/FgXPGjmZDIJHjSTLl4peNCgEXRFq6W3GTwgs0ogvyBQInQtEwnAyLY3dtdeSpv2GwIUskLC +17U1jIxcuTH+RJg745t3XH7/0HPLO4EpYaO3x4dL4gWv5Xzb4L2hK+FfDbH7r3R0pOBSXVKP +m2SIeFaIumcfd0+4NDb59JQezyzmlTXbuITZeyZ4RBVb+maq2Uadd0qy8s+zcItHecbklzXe +n366cS0Rv0LAk6OkL+KJdx7PdPd1lmVG5PnolTqf7fGQvBUscz9U+m6w5LCrQKMlV7kRe7X5 +0R4Xkeu+Zyf9RPtcRYqxikUBZl1lqfcnrlFisIO0BIBidolwb3np9vLi7cXFezOLM48Wlx7O +L0/PzyziH5EniJAjgiyQFmZJMwTwP4WA8OQBKALoCTxxBVq0S3YKkaex4leIK+R1NHhyDLNn +c2QQ8FgHPNBodEhICLRnXG5uLkCOkpKSiYkJ6t1pQyMzhCXN2TgvAlN7Ws5X18y6sWW7pq5n +bGLuSwSP4LC00xLmu9nPc/JZnpb1D4tXzC06LKmIcXKJ7ujofl7w6O7ujUvMO6fjeviE0VEh +R3HlIHc/9bTMwMamthcDj4HhYQd0hIVt0EEeA15RFwnVKEWdVOVLmUq6aTqWYdoWYfJayXLn +4yRUAhXOeaPd4nGldQh4vJXgAU8toEmwm4JhhfAwCrQmBbaGkG8BGuWh9n7QzAP58+ABzztl +xuNBolpaQm1/4fmo64IHzUDJawgeNE3A4MHww6VZd/NWgQeN/4Mi8Lxfi6sZ9mh5EDRGmiMt +Ls83NdSNXLkyMjZ1ijvxWxbMro+CN7HEWehVPnq80FRs2xO/cTDs+xrfz3rS/11/+dLE2NXU +qhDHQkmjGC5Ulrh7iSQ2Sb2xpxZYfUoTxDv37hdWN2NC0619ku2Dc638c3TRCbrOcRaeqTbe +yejAxMTs0r6ha7Nz5Ogc5IAjoMwKkWzeV/Bzs4/u3xoZ78ANFIW0xNu0BJzv81Ec8ZW77it5 +zVO4H3Oq2eFUlYNwA0qw15m331Wo3f1snbdGXYrvYE/rvak7i0uLRMjNs7JMwC9SArEvEojz +gDGIhBU8nhyGjNwifn6JtPh4+tHdkZt3RsfuXr16Z+zq3aujU6OjU1evLT56Ai0IWiARFiiD +OeQw7URotIr4OoDH5OQksAsjIyOvIXgEBgaGh4fX1dX19/ffvXs3Ly8PHNy4cWNcXFxza6+Z +TbCEIobntD2/hJuYSjh4tFfQSVXUSVPQvgyMrOz5OEnVYCnVgIuGoWj3xMjY3O6evucCj7b2 +rksmfqZWgZJKWB5hB34Jd3GVCFnQijbUSqqCdor8xUQpjUhZjUBzu8jA0Mx1waOgqNrKPlxV +y++MnIegtI+kerTcxWRQG0jgnKU1o+U0Q3XNYuwxCVGxecW42h66c14NPLq7+9V1grRNovVt +C1QuZaoZ5qoaZCvrpQP8AB2ioHVZHvwkp1RlvQzwQsskEQGPtwk8JqYeQ9Mywc/SppE/2ujF +pWU8fYWajn/Y9uiYRghUp6J1Cnhh5l0ADl6//RCqFvwKVQ6O0BQBydgzf2l5BToNAe1I+OBz +gQc4T1W7VPCaXTGgZ3itbSupz+HK9XtyFkk09UNmGpwteJcZ8IB7D6SwjGa45i+PO1L3vC42 +G8rDKuVd23GNYQ/DV3RQwR8+CLoaPgjagg66x1QzDx7ROa3wEiSa3rj/aO4N+nsGd4M/s/EH +tAZk+vF0dUXNnYSRqaBR0jwZPBrqa4eHhq6O3RM8GvsDi//uDbE/siSLHo+euPVg+npnWSD3 +3fxNrYGftcR90Ry7ubvYa55I9M+y868XvRB11CLrVEijgn20ZG5tDEAaineF/Mc8t7CMq223 +dY80dYlxjSlzisBdQMWq2UZY+OegQgtMsdFeoZmt3aMreIoxX6QkUBoPuWeeumqezC8Mj16t +K8nBhTsXu6g1YyXHvETvB5y57ycwgj7abMFeYcJRbnuq2FkuWIc/0/VCSQx2sLF05v4UNJZD +INe6PEeaWSI9JkPEMnkfvUXy6eGfDI9V+MdUBSe2xya2hIS2+Qe2+/o3uXvirB2aAsNW7pG/ +IwtEaDYuNMTyzHP0GoDH6yZq8EhLS2tpaYHil9bX1wcEBEDggcViQyLyRRW8lfTSNIwL1Y0K +VA2yVPUzgZGV10oBCbKwFEJIV9RNU9bLVNJJjU8ufS7waGrpAtwipeqjqJ0MTLm6caGaYY6q +QSaw5hS2gVohJ4ANKpfACWSvCx5Jl3GqujFqBtmaJsVqRnngtFUuZTytDapQJ1VJN11JNw3U +JqUeHh1fyPxQS1hMSUp6JXhRWdMZEFGlY5GtbpivYZKvbpSjop8JOAR0lJJepqFtTmRiXWNz +LwIebxN40Iy2QGsuoKAQNDMhabKBDJAppF5hynAyKj05UA95AJNKvaaD4XKbtcEDOgKog2ZR +DMM+gReV0C87hWdE0KygWQM8aC4TKsVwIIM+GxwMhN55AmUAiAI7lGhKMQ8e1KtaoCgo4MJp +onz8EwSBx/jNG/VV9dNpNx6EXKWAx9wz8Lh7+mjMTyzhrBvifmRJPbIzuLfzOmlpqSpBezj7 +s6HEDyv9/nst43+V4WL3Jm5UNpa4FJ52qRfUDOPC4sT8qgXtIkRru3DkSREEInH56dTNwdGb +3pEZ+k7hdkE5rok1ht5Z8pYROthU5/AyG49UK0xUc+fQs5EXAtn9AYqSiEuU8Y6lp2NF5FCo +8zOPrvV3NOfHV4RY4dDybegz1z2EbviJD3ifbXSTDlLnvHDkm2gDoVpX+UKUXF6QU1tdzd2p ++4AcyKRBDrS+vEgiezyIENgsPGp384kWUx7LKyb29OLLKoh5hcSsnIW01Lsh4bWmVleyiiih +ygB7kJ0mlIghBGibOgQ86BUXF+fi4oJGo4uLi0tKSurq6mgme0DgASysgXV8Vn6jW0CZhiGZ +LjRNizRNARtkQWAAEuANNcN8Jb0MNYMMBw9cR1ff8w61GFnG65hGpWbVJ2U06NvmKumlgwrP +mRVTTHkGaBRqReVStpp+JsqjbF3wyCusi04sr6rtDI6uvmSVo2KQc860WNMEEAiZmkAiV2WY +r2aQ6eRVml3Q2tMzwDx4hEQVJ1z+f7vf2TWQmtV4yQqcXpamSZGWZZ5HUEUhrq2/f/AtmOPR +2dnZ2NiIgAfNaALDOB40dhZeFQsnCDyoj68WqYPepc8wrgUNYDwXeHjF164b+ZPa+jNcL1Pa +NLJ2HA968ABsQHMhoEL65bTQmtm1e5gmA+QbgVegwD3McD3sGnFloYhnb/QEj5cCHkB9A30p +MSkjHs0Pgq8CW7qMX2ysr7kyNHRt/J4od8KPLNG7Pon8mSV159dBZQV9oFRHRVht3GcTxR9U ++34ykfqfhpA9jWWJd+/ds49V8qoXRBWKnA/f710r5FF0xjlabWC8jdwQeQ+3Zcg/8PDJXGph +nalLlKlHkmtCtV14mYZ9rLpVlF1AATa0EOUT19jVP7dEXtxKIC6tEObxxCUKH1HmfeLnifiH +FBIhCxj+R9MPR/o7qosycqI8sz10a11lR/2k0i7u0Tj2M0aDf9RXdjZKrtVDLN1JKjPYvK06 +5/G9u5C3YhYgDWVAB2isvDCMl9/70LFqL/cHpcVTCUkzoRFP/AImvDzuenr1GJmXWzg8GR4n +kWeNrCw8pQ0iAh6riYOD49atW+7u7g0NDcB2Nzc3A9hIpQiKKgaBR1JqhalDMmzdUjIajOzz +VfTSwXP9ObMikDRNi1X1M/WscyMTa1czteuCh7FNkrZJVE3d0ykcldUdGJ9SNYM0gBwAP86b +lQDaAa1gfHC9vYPMzPHIyq1Oy6p7tvBkICu/2dGj6JxJloZxAahQzShP3yYnPK62tqH7BSaX +hsfikikeD2r5BeemZdenZTc1Nncju9O+iQLmCQoWQT0fcmZuCTpIb3RANuhZGI47Sh/cEgr7 +Cce4oB4mgBI1YABTCx9fLZQoyH9aLwqqjb45cIS+2tXeAo/2cHOrOT2YuUZgpumnQKx9IdD+ +blARaKqqd0ItTc/DlcNBUMEL+uuCgntA78IDQ9QRXMFHwPBDZPhxU39wcM1QPW9W9LCXQh3g +RXdfT0td05Bbfb9Fzc3e249mHnS0NY+Ojg4MjgtzxGxiidvxr6BN7yVu+iA8NaKb3G83Wwuj +WW/j3u8I/fdg8Bcjmd/lx8vOzz3KqomzTjgZ3CRhknJUN4Y7pE3BKZPfI8F44j5lhI6wQiBv +d09ucYlAbOi6gg1OMcKEO4cVesRVG7qmqltHGLunOgSkm7sGxuZnXr8HwecSkRwRfZFEntqJ +XyAQnhApO7WQsWSFQBnEIVL2iZt6Mjc81N9Ukl4ag0m2k0uyEC1Dy13zlFgKF8PHn34SxTvg +eaQMJVzu7zRa3TLz+DGBEnsd6Mm1a3EqamgOjvZA/4746L7YqDEfv5u2TrcsbUaszEdNzcZ0 +jUtlVLuCI0mLSwQC/hmtkChzSxHwYDzUEhUVNTQ0BDCjpaVlaWmpuLjY29u7q6sLUEdHR8eu +XbsAeCSklOtbJ9CY+5yCeoULEar6qeoG6WgvXEVN95+cXHrJIv6cQTiu/A8TPnv7B9V1Is8Z +pWoaZWB8Sytru5hf1ZKRXZWUVkNzMC65wtA61calKL+kra9v8MUmlwK1d/R0dvXSrNgNCCti +xsWBgAciRIjeiHEWsp+tsx3cYOdz7/abVNVm1lfUFudkpZfiSjPSi06whv3GkrDtM89NH8b8 +9E6yj00HfnllGf8Ql2bYn/HNePI39a6fXC/6sDR2050bQ4/n7odn26LTBIIalS9EHjfN4Q5s +k7SOlQzN8pyZf0TxM5DHNijb1ZHx48ad+zFpBWbOQbZeSd7xVfbBxWq2UQYeyaiwLEMXf0xo +VH1H78IiJbw7cYmAnycQlmYJxMeU2R+UMZI5EiARytgHZSrJ03Cgj+fmezsaq1IDSgLMSp0U +mlDCA1iee37cs2GnHoTLdLgqljhpVyf6373aS0aHpcUyjJfttgMZ5pZTw1c6i0sqXVxGnbBj +2sbXzuv1XLzQIiPXeko8i+1QIr/QFOQWpoAHZW4HMsdjVfAwMjKqpghgxsjICHjh5+dXUVGR +np4OLOmBAwcAeBQVN/iF5g8O0voTLBySIIPLjLlcFzxCowqDwguaW/9gzds7e40sE5mwxQzA +o6qmFVfeQnMw8XJ5XuHzbVtPYi6AGOgH/9DCjs4+BDwQIUL0drAH+NnU0rSwuDCbNXHff/jR +xOPm9lpvT7f42LiK8mZJrtRfWKK3fY7ZvCH8e5ZMC42m+dn7JNJ8R1VNXTDno6J/1fu915f6 +WUf6f/vaCygsMegWY+hZrObaIK4QudWuVCy4+YJFlFBOTcISZYM68qayK4uExUXiCpl5FpZW +qhs7HNzCzLAx2JgKp7haNaeYS57JmIhyO+9MK3RESgbu1gQ0pZm8KcsKIBDykA2BSCLgyR4P +st8CT6BgycrcCmEZ2ogGgMEsMBnXrgw0FDZlhZaGoIpdLpWhVBoxUn3eon1e/DhrgRSMzmhP +5XBhAXo/b5iI0lhZfU37QHZOcQnK+aqVw4iCVofA2TzuY0nbWVO+3pzw7++8vvq2yMJsaQYi +KMjZ8bqAx2u7nPbq1auzs7Pgep2dnVtaWtrb28PDw/v7+3ft2hUcHMwwcmlaVrWZfTLz5vLF +Aoi1tHYbWCZ2d/W+AHgwVHxKRU5+w6sBj6GAsAL6yS0IeCBChOgNFYFAAOABLPjD1Ot3/YaA +2V5amSspzu/s6JiYfCzHn/UjS+L2z923fBzyA0vuefGyR/dvk0hLk+MPccGyDwrf74nbUBP0 +35sFn9XhrCEb3NDahgrVDWgSti49qBp2zLtaO7BGxD5KvKaznMI6BNLKEhFQCHlbtiVoxujw +2M3g2Ex9p0DbkEzbqBJlu+iLtknOAZWYIJypUxTWP6m+Y2AJDwXtmietPCERlikrbqEwGkTy ++hTC0gp5VOZpwlNt97ayvPRw6uG1wdGemprG9PCqSNPqQOUKV7Vk24vpzqah4uJoTp4r2UW3 +r08FZ9VHZlfWxsR2mDvWnzqb+NMmn+82hnyxOe0/P5Z++UPyf76M2Ml2NS2LvP6Wct6E548g +Bu7ePDw8k5OT/xDwSE1NxePxT548yczM9PHx6erq6u7uHh0dFRERAbQwPj7OEDzMHVL+GvDo +Ws+aMw8eCSkV2XmvxOMxNDRUhGvqQ4ZaECFC9Hroz8TxgNwd4Kbd2UWe2XI/dWzSq5/0hAwe +bW2NV0dHb03clxa4/D1L7q5Pg1g/Cf6JpfAsd+rt6zfJnoqFxepMq+G4z+8UfIfz+vRW9ke1 +GQKzi2SKWF4gpucmOSWcCO0UMLp8WitUOLpd2rP4GCpedWC8m+K6IK9zIayAf3N44ixkux8+ +epxbVm7jFWQTnO0UXaeHSlI3CzP1zHWKqLLwTjfHhqdkl9y9e59SfIm4soJfXsGv4Cmh36FA +XkQibShRBliwvLQ4ff/OjetXbg333a6vildXN9u2vdDRDj8zPXTvkc/l6rCMiuGurmb3kGIh +qYAvPwn49ofEb9mKvv2l6tvvKr798fKXvxTLnH8ydoNIGdd5GqXsNdDrCR7Ozs4DAwM3btyY +nZ3t7OwEHAKOAGu4srLi5+cHDcFc+dP6MyHTX2yo5WWJ9Dx7tbyAkFUtiBAhej3BAzx15ubn +riyvPM68dc//CmmGtLg809BYfWVocOLOA7nTqd+x5O78VwgAj80sxXw7I/u7RqCyo11ZdUG/ +3C/7b0Pwpz0Rnzenbr95cxSq+cGj+4GpJi7ZIkFNarrRXJap7FFd0qh0Eb8Uuzv371DcHotE +4hPyEMkKgfRswgQgiY7hEWvvOFRIkU9clbVPppp1xDmn/2PvPACbqPcHHudDfK73ngtRcYAs +feoT11+f8sSBOFEEZO9N2bultIVSuujee680TZNmp2lGm902aZs23XvvkX33/91dG0NboIgo +4n35Ga+Xu9+Npvf95DsTHMOYLsHkE+eDvANjlYVlZtRHg1QZs2CwAf06/d+uKj383ieH/vN+ +BYUMQyPNw72CInWBvHB4cLiaKmKs353871din5iZ+fQCysyZ2S89z37zHdLr/41ftrpZroLR +cFYcPK4NHm5uboAKmEwm0FxarVYgELS2toI1AwMDABWEQuFvol5x8MDreOCCCy5/LvBQqVTE +rEwBO6/KS9LlXwm+yRtMOgAemrLSjq7+jd+nzyBkzHsgaMEDQS8RmItmBAk5Kmz3vo56buT3 +dZR7KpIfzL30WGnav2R5UUhlDPRdTZ3aNWq/H3uNj2jZ9sh55+hfhso2nIn5Mp7qNzA8iBYT +HbKYzEiRDhNWAHTUcSFRaY86hZx2j/WOYzuH5Wx3jl1/JuyED+liGN3BM+GUS2BqNrujD8wA +j6l9zO9huq7bAyvTil014mBi5LltO5rq5FMlkvb2NBWX5VWo6J11sv6erv7Kdu6Zi5QvPk15 +/FnKrPk5b80nfvph4ufLUr5fowiOM/QMYHVFkPxeC3Q7fAxuW4sHOKX09PT8/HyxWNzZ2alW +q729vZFSGNnZRUVFgENw8MDBA3+M44LLXwc8MPbg8/n1DfXlypLCs0zVUW57RYfOOCxXFFSU +a9o6ejcsT3mGkDJ3WvD8aYGzCcxXHw6hpCgwFa/XmYRUb3n8g13M6Vz3x2pTH2ImrOzpakdR +AAnI4MvynCPXBYt/cmD/b1P4W5d434RKl56NXsoQkUxmNEIC6XiCxIdCyKLJZDEivVPMFlmx +9kJA3EFnf5cw0sW43COXSetOhe88l+AcynYKIh06H3QpNFlZUWsaA4qx6mLQdS8WGov90JRr +N6/ddXKXPTGSolaUV9eo4yJOpfmuYUbv41Bj+5rayzKpmWtXMl5/j/PxstQfPovY8nPc/oN5 +l4MGapEk32E0swayWHDwuAZ4YLXCAHgIBIL4+Pje3t6IiAiwpry8/MKFC8nJyYAZcPDAwQN/ +jOOCy18KPMBzlclkAo1gMVu6k2vUR7g8Ip8npJOz0jlsDovDX/5p8POEpLl/C5k/LWgOgT77 +3ojIy/loPiyi5itKFezAN7o598giHq6Pf5QbOatUyYAR64MBoQGdIZ0aey5hZUDxisOkD3dG +vxZU9Ikvf4lT1BZ5mRpFBhMEDWPAgDbNNUJjfpfGju4YEv3ohaDTl5MvRueeC8/d6hC/6XTM +Cf9sl2jGUc+EE+7hREZe92iDOaQ0KtpN5Re0uLYUlZQt+eyHhQv/t3nrGX5BSW1tcVLw7hSX +t1OdFyUE7q4uV1TKxNF7NlO//ilrk12Ky+ms6KCc+Hh2GrGrFSErHXKN0KixBgeP64GHSCTy +8fGprq4Gn7fS0lK5XA40TlFREe5qwcEDBw9ccPmrgUdzczODwRgaGgLLvWl1HT4VvY39EjnP +x/tSXGysXKnatjplJiFq7t9CFzwQNO+unBcJCU6H6AY0iBQo+N7uIUHM4Uri3XU5D2pCHytL +fTA3/cjQYB9a1hypv9HZ0eObcP4CbZlv4bJdcf+2S/pPuGqlK+U7t9hTtW3NKG8MjlkqsChR +k9VpojOZ8+Ql53xiDl+Icg1nukULjniQ1p0K230x2TmS6RiUceR8gF9EcmlFrdmCRX0gMkX2 +GBgeSclibN53dtXWk/RcWWNdUWbIVqLzgizn2Ule3/PZCYI8VqSrfc5JJ0kijc1hM/PY2ZTs +bAq1ua0NHq1YakFqiUC4xeP64FFQUAAWXF1dOzuRGoYUCmXmzJmAeBsaGnDwwMEDf4zjgstf +CjxUKlV+fr7JhBQU7U6tafPRwHp4RD+Yy2UoFYoRveXYHtoMQujc+8MBeMy/O+cFAmnjt/E9 +3V2Y8jWY4FIOWRI1o1swTR78WDftQWbIO01VQjTpA6lTCgiivLrcKW6tB2+Jd8GPW4I/PE1e +GqZa5ZCyLDz7Uu9gO+pxgcaKcY2yB4T0ox8tDlrb0hmVzjziHHLGM9kzlnsujL3JIW7T6QiH +wOxLkbQzntH2bmHUXHnv4Gj1sKkbPXQWqKS2NT6bx+AWlClYSZ4ro47OjDn6j5RLn4lZiXyh +kELOUHMEEr6aJVEKi4u4+aJMOq2+tQWGb7smcX8K8AgMDOzt7a2srASccP78eQ8Pj/b2dhw8 +cPDAH+O44PLXAQ+goAUCgVKphNE4ydE6HsOwwTwklghK1SUGM2x/iPUsIfSVe8MWTg+efzf1 +BQLt0ze81cVFaMdZJJCjvbJWGPh5G40giPz7UM4j0sjHZQwvk8msRwCiH7YYLBYoV045HvWV +r3itE+PnDcFvXuB/EVq4wj56WVZuFGAeVI1b80MgCK2oajYbjAYDVlh12GDOE6tcvCKPXwi/ +EMa+EC09cDFzw/FQO9dEtyimS3D2ofPRQTFZNdU1SC9bNHD0euyBlRBBNq5q7RCI8ot5GfHn +fww+9FzY4cfTPb4uE7FkMi2FJyhUqYoKq4rUFYUlZQwej8JhdvSgKb1IMg4OHlMCj8zMTKw7 +rYuLS2FhIThJjUZTXFyMMQMOHjh44I9xXHD564CHTqfLyMggEokDA0jr5P7Mxg4fDZJOaxgW +iXglKrUFgl1Ocp4jhMy+N/LV6aHz7ia/SGC+Pcs1i5iFeDbQMAf9oF6Z4qJJuFeS8mBLymNN +mY/kRK1u72pHOs1beiBzC1DSI3p9AivyePw3wYU/HyW/uyVqga9kuT9vpWP4Wqmah54LIAyg +yyELlh5rMZiNIyaD3mjQW8yjQRQ19S3hCaTDTuEnvLI8Y0Rn/ZlbT8dss4+xD6Q7R+aeuBR9 +0dMvTyAaHtFfYfeYQCDQ6IsOgkcAeVQ3txTKZbVyRqrHz6En5kTZv5TuvapWJq4o7WLkK4uq +yxprW2tKK/M4PAaLXdtYj7SoBSdrxM73hv0sf0HwCAsLo1AoERERgYGBly5dAuwBFgYHB80A +Lg2G4ZsW8DEG+Dp8awScpF6vv0WTw2iQ1a0To9F4gxf7IQYeIyNl494Cv7W0tDQcPHDBBZdf +AR5YfxZMKbe2toJvo0Ap8AX87q6uwezmbr9KeAgGD1qxgF+iLgXbeDgzn7079MW7U+f/LXLe +PakvEaiLnvUIC4w1W/SIaQLto6JRslnh86qID8n8H9HRnqCHzc5XphkhoKIBmQxYIMQJ0t7T +E5By7gLpv0FFS3Ynvron/v1g5WY35ncXY7bXNVQh5UXhQQOMJLtAiNViAGnAYsGCTiGrUUGn +N3BFckevkOPnwy6FcC9FSvefJ687Eb3HM905nnfCL+PwhdCYNFoLEv8JLtNotpiQxBMIDT4d +YxHMnQMhWSkIotQ0tIkE+aUF1GS/jWGO86Oc56X5rW8tlbbWd4lkRfXdNeDrOZcuEotkvX19 +o0iDJbP8quiOvyB4YAL4FhBCaWlpfX09WOjt7aXT6W1tbY03LWCSoaGhxlsjgDo6Ojpu0eTg +RjXeSunv77/Bi30PA4/W1oJxb4HPbWxsLA4euOCCy68AD0AdWAQmWC4pKcnLywNaoFhVxKXm +qN15HZ4a2AibTHqJQFBchNTrCL7Mfe6+8BfvIs+7P3r+/cmzCZR3n/P3uRTRO4DEWKIBpHB7 +Zz0t5uemzEeZl/7WQ3yykPivjMxdw8NoSVIEI8xojTC4uqH8QsyGS/TPfOXfbI7497HMpSGq +DeczVoQmufYMNlhggwHJrUVrqkMjmB9kUqmqqw2Lzzx2LtLei+oRKz8ZwNxwNnydU/SJiDzn +KO6hC6FuvuH1Dc2oP8SMGEwsEFZwA7KJIzEjiSkIEXX2DItE8hxiQqzv/ojzn4Wcez8tZOdA +o2qkZ7BUo9U2qDIyM5i0/MbGdr1eZ711v1puEXiAL6TgGU6j0W5b8HBxcUlJSQEfOYC7gDrI +ZLKrqyue1YK7WnDwwAWXv4jFAyOQ/Px8qVQK1gD1XFteUXSJo7Jj1Srrewd6iqQSTVn50PCg +27m0F++PePku6vxpUQvuT5xDoL0zM/iSU2hVTQliNjAhyR0mk0HODKxJf0Lgf1955KMtnH9m +hX3SrNXAWPAGwhJGCCl9YRYo80+F77wsXHkh77PN4W84M38IEW87F706jRtqsGD9VSxI8IgF +uqL0+Ziuh8bMHwPDekae0tEz/tD56AsRdNdo5q7zsetPhx+5TLwQRT/tFXc5LKm9uw9zqiDF +UaHR4BH4lyXE1QLIpKtvpFhdyaQyqMlRpLAL0e674gMPlyv4LXUdMrmKTE/PyszMz1VIChTq +ElV3d/dNssdfqjut02Ti7Ozs5uaWkZGRnp6OgwcOHjh44ILLn07s7OxutOMYpjcHBgY4HI5W +q4VhrOkZ3JfdUH44j58lYfLpmUmJZDJFJBPZHwuf/0j0SwTagumR8/8WO4fA+s8T4e7nYpUK +EdogBR6B9WDnpooideJLpUn3sb3v62U/qgh7RUYJQ9NakJRT2GyEoF6AH0YTnM7NOR61LkD2 +46nsRdsjF/nkr/cVrTkVvk5UjAV7mFDwuOrJm80Wg3G0clhFTWNIUuYhlwB770SfeO4ZP9Km +M6E7XOIdI9gnvJI8Q5JVmprR7vUWK8iMGTxQV4vJbGxoa8+XFbFYAi6dJ6RyeaT07NQgUmoC +KYOeEE9MzUjkMhm51DwWjSMUCZuamrAMIBw8fjV4YAI0Tn19Pd6rBQcPHDxwweWOF6vFo6Wl +hclkglcMPCDY0kuq7/aq6G8dVKglwZcvR0TE1DfXJ8XkvfpExPME6oLpYQsfiH6ZwHnt0Rhv +50xhLtukG7TA5n5ID1S4cXBIkbSklT2N4nt3a9qjPUlPcSLWd/V3IoiAZMdaYIsBRjAE7hsa +CckKdkz7OlDx+eGUd/cmfeBbvMKVuto1yq62QYVCAnSNXBGASCaDGQADhLp5+oeGWUKps2f0 +6QuRnhFUl3D6NqeEn8/EnQ5mHr8YY38xjMbJHxhGXCrW6uYQhJYKAZeMBLtYeof7y6orCxRK +gUAq5Mryc0XCXDqTRs8isUgkJptFL8jLk/LEComiQqvFonBvRnDwwGTmzJnZ2dng44eDxxRF +q1W1tHiB1zsJPMCc3t7e+GMZF1zuePDAvrBrNBo2mz00NISiCFLBvIdU1+lRhhTgMOuEHE5B +vhRsxqYpX3sq9DkCbeGDIfOmhbxI4M5/MNHXhSnk5HU1N5jhwX7YqEdnlmTYtedN58feo/J5 +yEh5LC/8jeIiDpL4YUFriZnRlFmsKmlng0fyXrecrwMkq7bFvHaI+nZo0drzKd+Hp5/p6W8z +WyCjxQRdDT1GvSUAPIYs0BA2YVVdW3R8zgmnAEfflPPR3IM+OVucEi+EM84HEo87BwTHZtY0 +dWC7IvVBzCYI6W+LmGvAPwOkHzD0tQ+0NbY3VtbUlJZpSktKSksq1CXVanUl0ly1qrq1rqm7 +s2tEp4Nt/D44eNwkeLi6ujY1NU2qAaurRRB0H6YEpzBeBxpsyhvf6MgF38tv2eTwLZsZG2d/ +3Y6/G3jgggsufx0B3/UlqIzRCGJjAODRcakU7keCSwslYlVRCXgrly1f9HzYswTmgr8Hzp8e +OIcgevm+ZE8HTgFPWq4uhuCBEchsMqHN5nhx5VmPVFD/JnT622DWQ0XJT9HS7Q2mbqSLigke +DdtA2ANQiK6oin8uatdl9lo3/tJ14S86534UJl3hErcikxNjsphNFv212r4iRzMh+bDQMATr +MRAYGBzJFSnO+0Yfd4s6H8E47JW+xT78tG+mawj5xMUIZ584vqzUYMbaw4EzNiJBp+gZmZFU +Gp0ZHjZA/SPm3kFd/8DgMJitf0A30D8yPKQz6Y1IMzubOBMcPH4r8LjGt3sYvguC7gXfwa87 +dLq1JlP2VLacOMAhwIGusYHZrNDrd059QqPxGZPp8SluDCPptFOd2WB4ESCBXj/vRk4m9Ibu +htn8MA4euOCCy62weIBXg8FAIpHi4+NbWlrMZqw9yi/gYTTqpEJBoaIYbCkVl/x3XvRMAnvh +3/0XTvefSxDPuYe8d01cbFg8l8O2wAakzAai0c0NlUpR1As9vEcK3B+oinywmf54dvji5kYZ +lkkDYYdGAMcAHrdA+TML6PYR64Ly19pTPtoW8cJl8dc+eevORG1uaK8yW4zXugQYa2VrtqDZ +skiHFhRSwP/rmttiUyknz/s7BxEPehHXngzbcz72YkTOWd/Uo+eDk8jczr4hbBKzxZoQC6He +ICMWbop5cGxu1xXL0E0XSMfBYyrgAQSC7gF68Fa7WsAhwIF+Q1dLV9fe/v7lt8LV0trqCpCg +sTHuTnK14IILLn8d8GhoaGAwGFgBST6frynX6PX6vqyGDvcyqB82GEekAn6hoghsWaqqXroo +aQaBteBBXzBeIUhmEbI3fRullMpZXFZ7fx+ijw0jJrNhcKg/L2p1Y8oD9RkPcdwfbqH8XZXy +Ty7pwpBxxALrLRDaggVsbIIgA5JIY7LoxGU8jxQ7T+aPTtSlO2PfO8f93lOwMobhpDfoYSsW +YM1rRxU+EqkxVmcM3cCMpcgCAEGa24J5jUZjY2NzbAb9lG/aySDaER/KTueE/a7xZy6nOXjH +X/CNTaGwtPVNRjMCSxBW4MMyNrAaJ2jSD2qZMWGsZEYKu1qsSTFXjisWryve3t6zZs3Cajj8 +hlJQUACmvRUlnnDwuLPBQ5BfHJ8qSiWJpXI1Dh644ILLVORXVC4FylWhUABVNfrd32xWFik5 +1JwSj7wOjxJ4GAYUIRMKiguRUM/62pafPk1/ipA9/8GghdN95iHgwVzzaWRbc6swn68uKUU1 +r8WCVuAokVEFIa/00p4sCJyhjLxrKOcuZuCHheX5yDa2URtA5ZuMEBprWtOidYk56Ere6M5d +vzVy0TnWR+6U5bSCFAum/k1oFTIzmmA7CgPm67IVdlFypdI3KOLoxdizQSyHAOaOs7E7HKLs +A7LOBKcf8AiLSqe2dXShYGMyIYk5BqzDPXRFC5axemNIPCpKKRPGKBRB1orvf8zH4PYvIIaD +x+0GHnJlySV/9rp9xPX7MzfYZW0+QEwm2RmM9/+e4FFYWGh9EOGCCy53MHgMDQ3xeLySkhKr +AQRo+XptVaErp+QAp1pe29PXVSyVqIpKB4cG8vJE338c9wwhe860wAXT/RYQ8mcR6N+8G1Bf +3VhaquIL+GOWCMRa0NfbxI7+rjH1yeqMp+ju9w5lPSqLeS6LdgF1xVxhIQA8YUH8KYiGl5Tl +O4Tv9mT/6MT8cHvoW76cTc6xq1VVCK5YgM43YvEhWONa81RUu9Un0tnVnUTlnvSKPuOd6BJC +OeKWuvVU+CGP1LMhOcddo7yCE4o11SYkyQcyg38wNLrveIy5Zk+WK40fOHjcJHhoNBoevyA8 +imQ03mcw3ELwEAqloZHEwaFHLJZ7fxPwUCqLGSxBVfXmvr7vfxPwKC5WJ6XknLAPWr/t0p4j +4ckZWwASCEVeKlXJzYMHiSrde4q06UD22j1pa3angLFub8bGA2RnL6eq2pfxdFpccMHltwUP +8DhisVjgcQ2PFjId9S6M0NurjovYaXwqm5yVkkwkZvPyOaSsrJVfxM0gpM++P3jh9MD5d+W9 +SGAsWehXUdLQ0trEYDAMBgNsk6Ur5fjJw2Z1cR5he/+9PurJJspDqbFfNbU02yplaNS9geSv +wLABLDEljDNR3/oKlp5M/cKZvMo1+yuflAMtXbWo0QMzchiRMWWPBhq4gogBMivKK3yiEk5f +Cj3vT3L0oew8HbPPMdUpgH7KPeGUW2ROnmwQbe+COl3MKOFgHWOuwIprmFdsieMP4o47BzxI +FM7G7S5v/t+uzq6H2jv+yWLzbwV4+AYkLf3uyJsf7tNUPDM49ACRxLpJ8JBIFAHBKd+vdkjL +XNLe/tVNgodYrDjhEPi/ZUfe/eTkstX+q3Ykrtubfsn/JACPg6ePrdvu5eGTlMvL/3XgUVhU +6h3CXbsnfcN+EoYcNiMVsMe2w7ExydSyMg0OHrjggstvBR5geyyRFmMAAB4mMxJ/0ZPV0Oul +HWrXKYol/h6XgkPCq+uqensHjuygPUmIeeX+iFenhyy4m/0igf7eLB9lQfVA/2i7DdimIWxT +g4Ye8kkTdXpp9FNiz4d6Wffyo+cVCqlXWiQgFAzQuAo0jlRvMmVwYuwjvwkQ/Hgo4b/BijUO +scuSmf7DZiPaNA5G630Zfulhex2LB2QyIZYMk9lgsSCtuHqHBnO4IhevmDNuiU4+1EPnUref +iT3mmXXmcubR8xHRaYymtu5RcIBMY63qfrF3mK2xJFcfWFEzyx/0Mfizg0dhYbHzhfD/+2Tv +q+/s+PBLp2/Xh/qF773kt+vLFS6rN7n6BaWq1eqbBw8mW7h936XX39/++vt7l3zv/uPmaP+I +/dFJK79ccX7F+gupGfQbBY/y8vJ0ImPvIa//W3Lw/z4/+/WaoJPnHc+5bT52JiSNyCwpKf0V +4HHCIejz704s/tr1h02Ra/ekrd9PHDNKpK7Zk/rzrqRVO+JWbA77fo3b0TOhqRnMMo1miuBR +rCrNpkkP2JNtDR0Tx7p9GRvtss5czMkTFOLggQsuuNw8eAB1rFKppFIptoxoZ0RHIy6M3qyG +TnckxsNsNgg5bKlEjpgOTJDjEfoMQtic+2JeezBy/j05LxJobzzpy2eW6w26vLy8srIy2KY8 +iN5somW6FMc915X5LN1jWiP5nvr4J7jJp4aNVzSN/aV7rAkN/4ChvoGhCKKnc8rnJ9L+72zO +5yGidY6R64UqoRHCXCcjkMWAQIF5Spc51hMOXJnBuk95VWN4EtXBPcrBI/6YR/p2x0S780kO +PhnHz4f6hiaVlVeP7ov0gEO8L1hpdTMa3mFGDC7gNgFOAsxkQS0jyEA2RJJ2kIBZHDxuFDyS +0mmZWax1W5xff2/Hmx8e/HS514qtsev3ZYABvpIDJbh6Z8JPWyO/Wun27arzJxxCBQLJjYKH +urRy/xHvwPD0L789+uq7O95dcnrZ6oBVOxOBQl+3Nx3Tvz/vTFi5LerrlRcPHAugMfKuCx55 +fLFQJPULSv5xjcPr7+/75DuEYcBs4LQBHoBzXrk16uvVHtv2+QaFEQvE8hsCj3XbvJZvCNty +OGfTQfLGA+Ak09bsSvl5V7LVKAHwA9wchEC2x/6wITCDxJ0KeOSLVceccsAZTmbomDD2IKaP +rQczeIIiHDxwwQWXXwEev2h5NMCDRqPx+Xxb44MF1bI95Pr2iyq4DzYa9UqxuLhQjW3j7cJ+ +7t6Al++JX/hA9Ny7iS8RaK//I4SSruof6M3ISOfxeDZ+B+QoRWWFHP9PBklPcSOmKaIeGEp9 +jBn2v4o6JYwWPEe1tI1HwoS4Q2DTCFhq7mj2STzpQl62PeJN77wVntQNF6IOV7dVoiygt5iM +QOtDN6rasdiQsb0G9YY8qcIjJPKIW8Rx78z9LnH7HMMcPOKOOHifcfQSiOQjeiN6njDSksUC +YSeLmHPQVnfoqwn6JdAUMcdACLghmb0wVkQeB48pg8f+I0EL39754ZdO362PAPpu04Gs9fvS +gZ611YDI667kn3cmLl/v/+3PF28UPOKSaO/878Rr7+5eglBNPJh/08EsAAk2qtx6lKQfNgYt +W3H+uuARHkNd9N9973/m8M3aMDDPpoMkFDmumA2s/xmdcMUG98BQ4tTBIyqOGRLFtr9IA6cK +8GPL4Wx0/nRszjGjBHHTQSo46MnzOaKCwqmAx+Ug2urdpJ93p1+fOn4xfRC3HspkcZU4eOCC +Cy43Ax7gEZ2QkBAZGSmVStvb20eVM9pTZRQ8kHRanUwoVKJ1PICE++W+ON33BULCwr/FLrg3 +bTaBuvChKI9zWfkiQXJyEoVCwcI8RmcC8+hNrPBj9QlPlVEfo3tMG8p4QhL9nIgfMGZjGQMP +LDwCNSJAJh0MI84ObW31xdSNpzKW7o5+NzB/k1PiqmjqhSF9O7KrCTKbLDfWjB5CqcM4FrUx +Vou9sa01ico+5RF1/FLkiYtRhx2DV2899f3Pe4/Ye6RmcTq6kO5yFow3ENBAKORKp4plfOiH +0WxBo0qua48BT2/wsL3R9jp3Knh4+GVt3hP48864DXakzYeomw5mbzxI2rA/Y80eVMn+QiCp +6/ZmrN+fufUw9UbBo6BAtn5X5M6DYev3JG6wI246QAFHAap8g13GWsRzkWzV5mv3pG20Q9wQ +1wWPLGqBq2fq7qPJu09kbz5EwU57ox0Rm9DmnNOB7t58kHLEPmnq4OEfRqGzxGCBnVvoHczd +djgD3JktRyibD5E3HsjcdJCM/Hgw3TOQw+Aopx7jUSApOeWStXJr1A9bEhCzydTYY/0+4kGH +nMg4Lg4euOCCyw2Bh600NzczGIyysjIej5eZmVlQUNDb24sp6auBR1K0aO5jfrMISa9NS351 +WjIAj9n3R57an1hTU11XV2MN88DAA1PSaj45P+SlZvqjTI8HqpOfrMl8mJW6rW9gBKWgK8AD +6HaDGa3mZdYj2ALDcTSvi5QN++IXH0//MES0yj78S444FQu2MJtGLJD+hi0eKDWg9guDyaI3 +YyEjZrOsRBMUm+boHrbvpPe7n659a/GqrYfdTrqGBEWmVtY0oKcKoAjpvguZTK0lajWVWkKn +q2k5qpwcNY2uptOLaDlFzNy+pk7E0oGevOV6XHSLCoj9ScEjncTffTg8NIrJylXau+Zs3A9U +f9a2Y/QtR7IRL8O+NJQH0jceyN5gl7VhX/o5D+aviPGwd0ndfSQ8NUPAFxY7e9E32aUDfbrt +KDgKZdOBzPX70gEwrEeySklbDhHd/NjXBY98cZGnHzGdJFAUlsYmC484ZiPGgaO0rUeyATWt +RVwhaRsPAE4g7z5O8gvnAaU/dfDwC6XkMMTWH6VydVQif+vBFHAHAHUcd6FFJwnFUtWNZrU0 +NbX29w8LCzQHTqV+uz5q9c6pgcd+4tKfLn/2nQMGHtr6zvnLPbGx4mi89dcNlsGahJxC64/W +dy9G5oK3cPDABZe/LHgAjV9SUiIUChHNq9eXl5ezWCwqlVpTU4MYQ6iN7W6IqwUBD5GoUKnC +9qJkKF5/OngWIXnh3+Ln3x83m0B76d4Yr3Mc8NbwyDCbzdZoNGN2FazDGzzQ3cqM+Lw+bbo6 +9lFe8CMdOQ8wwj4qRaNBLBBa0WMsXcQM6wxwH0APWAfOCemdUl6ncojaco66bk/c6xfo7/rT +l7uF76+qqUQOYRm0wEOwlVpsrA7jk0rG0GZsG6w8KVq5bDSJB1nb3duXm690uBj25coDX685 +duR8lFsY+bRbuMvlaGlROYwZPmC4raws19dPGRFTEpekiohRBEfKAkPFfkH5l/0ozu6syCTj +wPDoEa9nj8HBwxY8iGTR1v1hMck8TDkWFZUFRPB2HAMwkLHlMHXr0Zztx5kb7Ig7jpJ8Q3Nl +CvWvCy4945K+42B4amYB9mOppiIygb/nZNb6/RlbjuQAzgFjo12muz9risGlADzOe6aRKAVj +KcDlVIb8gg8TnOfWw9TtxxibDpDsL9KTifmFRaU3GlwaHJFDZ10RylIgVrpfzszKkZJpsnHJ +JlMHD21lXV1DT1//yPCwLjSGt2Jz1I/XNH2gMJYBqGPef7Z++JkdBh4KTdP9i04BwMjOKwM4 +AaAC+3WPQ5HF20LAwMEDF1z+4uCB5brqdDqBQFBYWGhdD56r4KGUQ6OWFhe3p1X2eJQD8Bgx +DueLBEVjFg8hV/v+S5HPEVIXTAuaf1/sHILohXtj3E6zYaTnmlEkEmE9X8aiOS1YGQ05w08a +/VQT9WGG+zRt5gMFCbNk7FAINulgNI/FjCSpQGazER6wwMNoRVMkiBOC9CazKZUWczZ229nM +pfsi5vtyVl9M/zmU6Dg40oXktkAj0KghQ49koIw6T5AgT5PV04EGhZqQEiAWm5CQsZQYjFkg +zAeD/FTf1JFBETi6RZ1yCb0Yku2aINrvm37IPYLDl5qB9A4w7c8HrljZQCZbxMV6al4fLa8t +m9WWRu6PT28NjCaeOK0WcscOgls8bgA8UjMFm/YEh8XljtOYB08lrN8bv9Eu49BZchpZcpPp +tMcdU7bsC0lME45bv/tw5LaDyVsPER3dc9i8wqmn04oKihxdk9JJ4yeMiGUdPpvpEchh5ip/ +dTqtXFGsUl2BK5xcWUQc+1eUR7MFj+qahu6egcqqxura1r7+YUVRjd3J1B82xf68axL2wMJu +v1jh9crrG+e+uemjLw7Zggd4HRw2AJwISkVqfwEOwcwdVsDAwQMXXG4rAX+w1q8Jvxt4WGM8 +BgYGGAwGVsHDVlpamwUstuActd5eam4z6Uw6oVhUrFSjrDKQmsh5+/mAWQTiwum+C6fFvEJQ +zLo71sGOYkGdC2VlZRwOx2AwoAcBelpvRrV9V30VM/SjKvKj4sAHJNGPlpGe4idsHuzpHE2L +NUMw4loB4KG7wlCBSm9fXwTJ+1z8ijNJSw5EfeCXu8Y1YSMnP3uUKhDYQMFjLJYTGgMPCwzb +2FIQ9rg6B6B7jL1vMlk0lU2RCZQjziGHLhPPxnOPBaQfvRiiKamqzCB7fviJ62efSny8TVRO +b0x6Q2RiVURMXWBYp4d/v7OX4uDR7LNnRlrRKujXC379i4DHxo0bly9ffl3wYHGlFzzTs8ZM +B1Y5fCaORBFoNFP6dn9d8IiKZ/kGZXFypePWHzgZyxfKr9e+ZBLwUBaWJKVyuHnyCeDBEEuL +pg4G8NQql3J5stBo5s2CR22jQlWfkSXMovB7+4Y1FQ2NTZ0XPLN/3BS5ckeyjekDMXSs2Brz +/menX3lj09w3N8/7z5Zx4DHOvgEWjvvQMLsH5m3BwQOXP5G0dg7scCZafYhg+TecXFvfCf4W +sD8QTACu/7aHmIqAv9xr/BneavBobm6m0+ngKQ2PlfyyjJkERoaGm5IrynbSJclCiUaRJ+JJ +82XKIgWbl5MSz/j8jZhZhLT5030WTIuZS5A9T0g4so2o1yExpS0tLTk5Oa2tregRTBA0YIKM +iNI3mPIzLoljXtJmPsK//FgVcSYn7MOqQhlqrTAgVdBNEFqXFBp3qtgptXTXBxPPnov7/kTM +h+dSv3GM3OzofbquuWXUdIHQh8U0ZuX4xZ1iAx4TI0DH3RR4rAuMtVppd/8IX1rsHRh3/FyA +fUDG8WBS8MXwgG+Xu3/5P2lMWHFcfJ1/SJunb6W9g9bhTPXpU/WHj7XuO9K64yDv+zWa6DjY +Wv7jdweP21BWrlz5008//bqS6UfsEyfSyG9eMv3gqfiJNHIzJdMj41gSafFvDh7gJMOiGTcJ +HmASYYGmtLxJo22pa+ikMaVt7b2FqprwWN6GXTHfb4xdsyd13d40ML5c6fPae3vmvL5+Hkod +E8ED0AX2oMYe2mABIw1sAQcPXP5Egmlk8HkGC9j4bS0D2J8MGHnyGutfhPWv42oCzuc3P43f +Hzys3ha1Wp2XlzdaJh0VazotYo1htXWeK6oVVGXxsj183EP8Q3PzuI2tNbWVHWs+S3+WkIiU +TJ8WNY8gBuCxa3Xi4MAwZkXBwjyg0cqfw2ZIh2W5NJdo6UGfaSkPiDynlUc/Lk14sSA7FAnx +QEwRBhjSm2GjaQIjoeCBnGFtc3lw+lGn6GXr7N/+eO2Cdce/jaPF6UxGjBqQHrcwYi4xWqlj +zJEyWlfdfO0K65C1zQqEVuowYaYUCOpt68xlCM9djjvmlXBxs4P9m29nu59qrSwTZ1AKnFxb +nJxrdu2o2rahetumivUbin5cUfjJUsYrbyd9/q2hue66v4W/Dnhcmz2uDR5HHRIzs0W3Hjzi +OLny2x885AoVkyO9SfCQyYvjEhkZWcKi0qbK6jaeoLhUU5fDEKZnckkUqU8w66ctMT9tjf3g +C4e5b2565Y2NGHKAMf+t7Yu/PDbO1YLxBiAQ8PUNC/YAA3ytA8vW749gYXDYAJ6xtmGoOHjg +cluJbajS1VQ2+CRPaiexNWtMuo0t2Nii+DjwAPuCGWzXgA1uFDzAgX5P8Ji6GAwGoVCIBXjY +xGMgr0gVChjqptZ3XiyFe6GOga7k9GQ6hWk0Ilq+u2Nw+4/pzxCi500D4BE5/+785wnJG7+N +6+lB0k7BNvn5+XK5HMuURdwn0LAORoweugEDJ+GsLPmx0qjpRf5/1xAf4SSs7B4tnw6U/IgZ +1pkn+FnQcupI81qwprpZdiFky6dr31r4+XPfH3vtTMxaoSoHs3kA5BiydbdYfvGgmNEOtqOZ +r9ctdw6hPe6Q+u1Iwi5SGwypC2ZpbO1ikXlOn6yJ3rGnXMbjSBTZ6Qymq2fJsePatWuKPv9U +9OF/yf/+T8zc2THPzEh+dIb/ky8q/XwtI/04eEyFPa7bJG7qcjNN4qbQKf7GmsTdkMA30iTu +JsEDqaWmLuMLC5PSuDxBkaCgRKWuotKFuXnyUk2NtrLp25Xu//ng4Ox/r587ZuhAqGPR9s+/ +OxkYmm4FD/D4wh5xACcwqLC1G1sDP7A8F8wGMu6haitgTm9vb1z94fKHiG1g0kTBjHWYKc8K +z9ZwJmxH8LdgtfVNCtjYnwxG4BhLjAMP7C8FMxJifyngR6tDE9t9Yr6YQFlrPRzG+dhpWH06 +2I7Y9wKwpS14YCuv8Vf5Wwlm4hgaGmIymfX19ePAA6vvCUHmHmpDp2sJ3AUPW3QSuaSkuBTb +fWhw5OCmjJmE8PnTAhdOi5xL4D1PSF/5WWx72+iZY8m5iOUE0AISNzGih/V6lAiq5PmM0De0 +6dMLPO8vSbmLnfB8dWHumNrXW+ARywRXC/o/M+KLQW0bhaVC+0uOW06t3On3uiP5PZ+07a1t +WvCG3gIZLVbbxWRIYUENMNeI9vylEYsZjTU1IRGpYC8j1hUGHiqQXP7oKy03r7yh6XIaI5Gc +lxefLjx+kvHpZ3Eznov8x9NBj80IfurpmKcfJz/1PPGRF5iLvwXfIXHwmAp74ODx+4PHWOpQ +SXIaOzGV19k1wBcqKqsa2bnSQlXN8tXuCxftGEcdb3+0j0zJvXUFxHDB5Q+Ua3g9MLqwmhGA +7k5lFmNUAJat9g3b+A2wfqKZwqrx8+Q1KIHobQ8KmME28dw2L8w6FdjGyvZW4IkmyzEawWwp +AGzgMb8ntiN2XOzcwLvW0xh3XbcaPIA0NzfHxcVZVZ6txQPJL4Us3dSGDgAe3UCnG/IlojK1 +BjMhmEy6c4ezZ90VPvd+AB4R8wic5wnE5YtjWpo7YDRTRigUJiYmjoyMQFhfEwjwh9EAD0Gw +ebh3iJNgJ45/RBHykDLmbmHaw1JaoEWPFfk0g82gyaMxUbsFCgJAlCrNpfCzHuTvQhRLziYt +SWH6mSwG7FhDHW0t5eq2Um1rWXVLpba1sqy1srStUt3f3oxWHL32fbGNDhlryWKBzGZYD1uG +OmpIOzfEr15l1huKW3u8kukJOQJtYSnf63L8p0t9/jEz8O9PRj39ctJTz2c9/SxjxsvCf87P +e/Zd/gkXHDymwh44ePxR4IEJj6+QyKtyhRUKZQWXJy1W1y5f7fHqO7vGwGPrgrd3vf3xXiZb +eEtLpuOCy+0JHuMiQoGm9k/OH+easRoAsQG2nzibrakBbADoxfagmDUD231cXpj1KBixYMyA +YQZ2Mhj8gLes0SO2V2T1itqeBjbV70MdVikqKgoMDGQwGGq1uqenx5ZJMEXfQ23sdtfAPXBL +V0tyRjKdwhgaHsIUc6Abb/bfImbfG7DwgbB5dzGfIxC/+b8Yrba6paVJIBCkpqbGxMT09fWZ +xpJpYaScx5Ae7geqXyNm0UPfKk6YURD8sDRtLjPxcCdat9MIm9EQE2gyIoBQWwwSe4o6PmC+ +POd87Hp/3nJv/o9nEzYU1YjAZsMNrbLEWE7gZV5wBDswihEcwvbzzfXyyL10URAVCY/Zc64P +HhAWa4qmAY/CDqyik+xem5PjfNpgMdb2D/OLyqVlFXqDrig7K2Xj5vD5b0T869nEp1/IeuoF ++tMvMV5cKFjwnuidpbknnXDwmAp74ODxx4IHFjoSl5zrG8LQaJs0FY3fr/JY+PZOAB7z39q+ +YNHOZSvsWWzRrW4Shwsufyx4XM3VMi7KwhY8bLU5UO6YlwQbE9NVxgVXbHRIHQcetrtPavHA +NsNCpwB7AHoBwzWSa33LFiRswcP2uNiP1w64uhWCRWJIJEhJBDqdTqVSAYdY8QOjiyFOe/t5 +VVV+dSaX7OnrFRIQyhfyK6pLjaah1AjFgodjXrzLZ8G00Hn3MGYRsha/GhQfn8Rm06VSWXd3 +t0gkam5uNpqHjVA/aslALCUAPIywaaCjnxt7PD/6aYHfzDSXRWGXlmrKEGwwwCbED2Ka1N4B +G5F3jJAFeUEqkkP9LEm2ffiWi/yf7Sk/xFG9DP39otCY5P272xiUAb60I0fQSmF0p2UOxCYM +RcUUXHBrKdGMXdkUwGOsIDridIFMsMnULFNS/HxUXFpHa52kUKwultfWaHoH29vKi5hn7dMX +f5owY1bWjJncl+cL/v0e98P/pX71OeXQrrIc8h8CHmBCMLNthZbbnD1w8PjDwQMTOkuiLK6r +b+pdvtrz1bd3zV+04613Nrz5/trYtCt69eLggcudJ9r6TkAO2XllN2TxGGdGuPYhxm2z3y3L +NtD0avaHceCBOXFso0rOBrGsM1zN4jERPKyBH7/bHR4ZGWGxWFiAh16vLysry8nJAfgBVBWG +HyODQ3UJ6pIdNFlygbyiMFeQKxFJ1aUlZGqWVJ4bcpnyxuPxLxDCFjwQNv9e1guEnPde9k5N +JnV1dYyZU4q12ioI1pngXsRXgdbUMFp0BmgEMsPlEk6cz8uuux7b/tErTvveUEjiLUgFD7MZ +KWOOmDTG0ktGX8H/EfCA9Ei8BRL1OQg4BcAHRUw7mrDOgfxzaMpJXoRfyIo15z9aUh4dB4mK ++4j0juSU3oSE/vCI4cDQckdXnre/eXAQwsqYm0ZbrFizbK/GHuCf2TICjejgYQBN5prqhlq1 +JCbgULLPTmLECSYnor+zrCI9nrLqZ/Ki95n/WcT+9EvSNyszNmyJOmHHpcb39bb+IeBxu9Xx +uC574OBxm4AHUpZEqSZTxT+s8f73e3vfendtzrrn3vtoRXwGEwcPXO54wSIzrdGbrZ0DGIdM +jPHA1o9DBdt4TiyN69rggZX8tYKHbXMBDIQmxR5rjKj1oJ5xfOv5j4vxwK5lUvCwLliv91eL +nZ3dVDqOgUcQk8kca8uCCHiilpSUsNlsLpdbUqIu4AvEl9g1x4X6mhGg7KVySVkRElza0dFV +Wqb2v5zw5ozI5wnx8x8Mn38P5wUC68M5vkWFWtRZg1xyTU19cXHJaFe2seoZgC7MFiRRt6+v +LShy/fKlj69+e37QiTfzsk7193abkJwUowHJTzFbMIeKxYJ1VcFYxPqfBTJjNUgBxGTLsy5E +7fd333D+q0UeH31MPX1RHJrYHJvR6uVXc8Gp/IKjxsmx+tTZ2kP27O27m3ORUE8TmEMPIWkw +JqxgKlZYDLqqGQQcCsmpMYNtSss661X56T7LspznxTm9FRW5o7omryaPkbh5e9JXK7J+WJu2 +93Cyqzc1Mo6UkCiRFPT29/0hfz5/FvCwsgcOHrcPeGCSTszdauez4tMvKnY+hIMHLn81h8vE +AmJYejiWLWIb3mkLHrZZLZOmiowDAPD9edI+R9juVlsExifWY2FEYX0X7IKZXybOMC7+ZNLT +sJYavpmbNsU6HhqNBgAGlh5rNv/SmF6v1+fk5Li6uWakpVRHq/q8tHA/+K6vE4r4RdIi6+5c +tviDOWEzCeFzHwxacA/jRQLzvRe9RMIilC6QQho9PX0yuRK+0reB2DMso+mxUjn5wtGvvHa+ +zAp8jBn1WXMVuGrzCGwcQUufW8Yar5gxA4XZYqUXzGSBVViHkGQWY5EsO3DDV8defSH52KGu +snJZGkl5yaPV4Wzjnv3aPfuqDhyu3XlQu2or8YPFbLu9hu42pEyHyWgxow1nx1k8JgcPLDnX +BM5Do+mqLeZn+3/Bcn4u/dzC6NAtPCFRymIlObimHnHI8wqUpGTm07kiNo9BpUsksq7ubhw8 +psIejz32GA4etxV4AHELTP2dwQOv44HL7eN2mdTrMZVQTLDvzWSnAq6Y9ChXqw1yNZ/O73m7 +pgIeFotFKBQqFArbYEuAH+CJzefzGQyGVCYp4Asklzj1ZySWFpMeMkkk+WoFUjK9u7dLXSJN +Skpf8kbws3f5v/Kgz4L7yC8S6G8/58Fly1BFjVQPNZksYrF04nGtlVH7OjoY4afzAp9rzSXw +Ip8qz4+DLEakiBjW3gQ9KTDRCBLdAWF1OKwkAGFlNsaMFB25NN+3Pwj65gdZHltcpmQmxfPP +2TeePNGwZlvFj+uU36woWLyUMveNoCdm+M6bp06Igy0mA2zoh00jowaUa5EH5u/BcmwtkKlQ +WV2aT0u++FHGgb/H2j0b6bOJy6cK8qSsNIaUkVcslqqk8kKRpFAq4/PzCqSS9jHfEw4e15Y3 +3niD8BvJ3LlzHR0dCbdGwC19/fXXb9HkhYWFhFspO3bsuKHt737kpWX/918AHgvf/OKu6U+O +ezczMxMHD1xwwWWK4KHX69lstu1m9fX1YE12dnZ+fn57ezvieRkcqk1Qq7dTZWkFBRoFj58r +4YsLC5WZ5HSxLFet1mz8LnXmXR5zpnsvuJ/0MoH72uMegT4pWA0xTCRimcFwRc/6X0qFIJU5 +IDWHKAieNyQhFKfdLyM7GkZ04yqam9BipEbUxnEleEAwWiEEyEhtTfLPG90XflgWRypsqAtg +UkgZGXlel4uPnhR+8W3qwjcjZr0U9tSMiH8+Hjdzpu+/nkj76ofBkhIzbO6EDQMwmrxrulZl +c6znC/auwaDLIjHUfEqs0wfJ++6LO/BknM9mqUIgVpSzuHJ5iVaiLZeVqUvLylRqVQ6DrlAV +9Q0O/CEfg98KPIJSCxZvC/k9o49wuX0khshf+fmXADw++N8qnqTsdzgiDh644HKnggcW4DEw +gOjE1tZWoKRIJJJIJGppaTGZTKPaHYaHuO1tjsoaUSVZkON52TPCPyxfwK+sqdDpR8wm+NgO +2sy7Ls2ednnB/ZmzCcJ/Px7g5hLN4QjE4vyeXsTKpJAru7o6x4EHZmAxowq/v70tL2pjWcrf +y9Ifp/tv7ahsgnR680iPqX/YNKC3DCNuIPCfEQmxMNu2eUXAA62xYRoc4bt6np3zesbxc/qe +EUljq2tKRiqZUcaS5J6+mLR4iesTT7j/4x8hjz+e9NTTpOdnZTzzYvTT82VObsZ+QEiWQTTL +F6nVYe1jO0HMSDH30YMbjCM0OrtayY91/SLpxKMJZ55NDt5eqhaXlNfl5iuLtNUlTbXlzXXF +FWU0DitXyB8eGbFA0G0CHphTDxtTr74Ltrx/0anftk3AX1wmDTnDwQMHD1xwubPBo7Kyks/n +A8wQCoUAOcBrW1sbFu8xRgiI+6GX3tx9SQP3wu29HWkZKdwctl6ns27jepI76/5LL93vveBv +6S8RRK/9IzQ9id/e3pGby6FQMxRKeWFhUUND3VW0OTyIujjqpBSy8ztZZxdGHvqO4u1fEB+f +HxOVFxIDBi80tqkYedYZTSakuAd0BcFgP5bxJadfe8/l/Y+kBQKAOOUd3SQ2nylSdrcZJRHE +jJ9W+bzwUui/ZmQ8+Rzlqedpz8wWzF5EfvE94vLNXdpyExLFil6oZTTH5SqnakECWbHgWMgo +lshLxPw4zzXRTi9HOC9IDd/XWF1YX18vlyubGhu6u9uUpUVkDlNSrBwcGf4DPwYTwQMouxVH +47HSu7b5Vjh4/J5ibWWCgwcOHrjgMonGMZkNI4aRId21h25IZxwxDvUP3yanPRXw4PF4Xl5e +TCazqqpqcHDQbEa+7tsGYGAJpQA8Oi8ilUtHTDqRSKBWqGCs8jiq9RPDRfP/5fLC/Y4LHgx5 +icBY8HBAclwejDSUN/X0dmu15dHRMUqlctITwCqBWXQ6SUJi8Ko1mqigASGzk5LdlZbelZDS +FhvXER5T5R7IP+texRLoh0dMltH28tBoOVHEZwN+bFCVH136w8ZPvhCVKip76/P5xCJOQrmc +0dRc3a4p5zucJf5vacqMubQZrzD+/S71k68zl/5E2Xm4msI2DgxCFgirhGqtFjapIAktkBEh +H+SopvKqWnIGOTHUMSZgTcDFFUmhTk3Vpa2tDSqVXKMq5NMY5AwSV8gvKStraWpGfUvXsXh4 +e3uDJ21jY+OtBg8rRVhTt07708G4EMH9fFc4eGtweNQvlsos3uKYDlYecCdvPZduCx7RZPmu +C5ngrW/sosFKlXY0f4ojqcR2weKrWzr7bQ8BJgTrs3JLx50kWA8Ogc2GpYNNOo9PohAcVFYy +eoucQtjgxxY0zio7rwzMsPpE4g4XIti+qw/5M/RLEsVTlWD9RodU8CNYD84BbIPNOellhmZI +wJwcSZX1MsFb68+kgIWJ95YlrsQmB3OCmbHLRE+p33qG2Hqw5U4XonUzcI3/3RIM7id4xdZY +jwW2Aa/Ww1nvG1gJbk5iTiF2o8CPAmUtDh644HKHCVC+I4O67paeJm1LtbJWI64ok1xtlJdJ +y6sVNSKiOCuW+icCj+HhYXVJCTUnh8Xm1NXV6fQ667VD1pKdMNxDb+64pAbgMWAcFgr5ankx +qvoNaCdYWMAt/mCu0/P3H1rwsOvLhOR5D3slRSO6Y2RkuLq6gsViiAukev0VJuWx8hzYD4Oq +1BSXj74K/PoHyaWTbRlpdcGMJu/wVs+L9RedWs65dDq4lRxw9Fu2OsDRdUhvHOUV1PliQDq3 +jRo9SiqqAsLiSsTKejUvxmtNkstHyeeWEGMPt7XLy1nkuLXryJ9/w1z6XcrWjUm+l+JjQ4ls +StcQoiCQumAQ1lQOdaVclRCMCCWhjAJZjMWlWg4rP49FyWOlMEnJ2YkpGYnJKenJYQnhMYlx +NDK47twcGo1FZ8hE+UhnvOuBx+9Zx2MceGC9h8i8UrDGShcJOYXYNgpNE5bDZX1rhzMRLGMN +o61vYcHbL33tBr7Lg/XgFTOq2B4Cq34zzsxy3IdmPRA24dXmsZ4SPFbhB1vG1mN5bWBysIxl +pQEFDZbB/NYeTFZrA7Z+KpcJNgYqHlsYd28xdxXmLsFCx7FrsZ0ZOyuwmVecwLoZOHnrltga +67Gsvx1sGTsf7FaAZXBbJt5bHDxwweUOEJPB1NnYVS7TasXVxZxSGV0hYcildIWMrrQOqXWB +plAw5SpOkfeRwC2L90Wcj/2zgIdVEfYMD+bLFZnZFI6QW9dUbzAhD1IT0owNDCRftZvd2OAn +M/VbOo16kVBULlGgKtpktiBblhRrvljk8dxdXvOnRcwmEOf+3SfMn97c3Mhm00mkLIWiyIT5 +bsbiMSALrEdKcUFG1LjQp1IGf7/C/pOvNdmk0pwYaZCn9mJg49FzzfsPNRw6VGlnV7Fvv2aX +XeqS7wK22OkNJit4jJYUhUZNL2BujbahpLCiRsUj+/1Ac5mbff7NlPBd+VKqnMXyP3TUf/ue +ZPuzjIRYBpeWTMnIYNPae5EKaRYzYjUZzWixXN3kMVZHDM2ohZpb2+WyIqEgT5DH4efy+Bwe +i8EkU8kkahaLy8nLE/EF4FYJ5XJ5Q139KGzdxuCBaTFbfwrmjrFqW0xRYm/ZkoZVaYK3wJqn +PnG21cvWpgDYISbNAhs3G6aXrz2PFR6sDU8xFY81YbduA8DDtlIxODp4F6urY738a18mVgXo +bBDLCjO2gs0D1ttWGbIeHbst2HWBLV9d4W2bID/OdWU9FtZE3no462zYuYErGvcrw8EDF1zu +AOnvGiiVlGmkWkVuEcIb2GDKkMFQWIeYoZAwZRKGTMkqLmaW+Z0IXvPfbbuXHQ93i79NLuSq +4KGzwMMW5FWPDgNqutDD3U09Mr6YnUpWsgW9da3QsBn5ig82G4SHMmua3HnmHlOv0SgWFmjF +SLasCUI0NvKwbWpctSRsJiF27t3kOQT6Kw8GHDsQzOWylYXi/r5B9JB6tMntWL81CBwcGkHD +Jcy9/bSTjsdfW0R0v1yrLefRMyke58qcz9Ru29u8elvNqk3yn1YyvviU/M67Ec/PY51whK9Z +aqO2tkVcXF4oZxDdPycdeyzx6DPRfpu5uVQxm0+KTQZziwX5IqRAvJjF5rDZnO7uHtja9/YG +xWgwdnd3NzY2VlVXV1RUlJaVlZSUlJaWlpWWaTQarVZbV1fX2tra19en1+unMuHtBh6YVrVa +J2zfGqf1rG8BNgBfycfp5XHAMCl4jHvrGvNg2hycFVYVx3aDia0NMM8Rtg3WBQkLq7DaWK57 +mbbTTuy2AKACK9FjezMxkrF2QLBu+RHqW7GumQgekzZ3sL05YGMcPHDB5Q4T/bChra5dI9Yq +uSoZSyljK2VMhYwhl4PBBEMhZyjkTKUCDPAuMuQKlkKao3A/5Ltu8c6tX9jt/upYmNvtbfEo +N/Qm1Hcl1PUgo74ntqYvvnYQjNhaXVKLPqmjxbNYuCNNvI/UHlA+ENM4Et/Um1zTdZzZ48CE +OyC90SgR5pfJEPDQIxmxZlQFGw6sy3iWEP7KXdQ5BO6cBwLdnFMHBwfH6nwBwNCZzViPlVGz +h8GC1uMwQ5oU0slFH4Rs212vKOHmidPSSCQfX5m9o+KntYJ3P6YteCvhpTkRM56JeeLpiH/M +jPn2B+PQ1et/QlBVZT2vQCHITY9z+jjJ7pEou6fi/TbK5ZxCiZzHYJcVq9XFqqKiYsAHbA6H +yWIBKvjV4DFqHDOZAFfodLqhoaEBVMCFg2Wwxmg0Wq7TBPf3AI/e3l7AHuNq2E4FPKz+FFvl +bssk1u/vtj9azRqDwwZbK8c1FCW2+zhHxtXmsXpSbKv8WU0u42a2BQ/s0qxFj62Xf43LxGDg +uvG3mJXDikbY5OMMKeiF6G03mxQ8Jh4LBw9ccLmDpbO1ixrPIgZnx3mnxHglxXqlgIW0QBI5 +PIcSwaBGMqmRLGzQorlgUKM5OXEcdiLP61jgWoQ6Dm1benD314fDLkXf1uBRMNzpUd3kU9Xq +U93uXdXiqW33qOjxrOjyLu/21vZ61gxcru/2qG5xKW27oCk/KFTuYDSHKPv9C/SZVfAAPGw0 +5Ofnq+VI5JtuNB4TaWFyZk/WC3cHzSEwZhOErzwYEoH2qYEgo9lktiAFvnQWC4RFhBjQ2AwL +Yv6A+pUloct+Orv4M21uXntLd2RKTnQKXUjiChwuUj/5IvAfj/s8+s/Axx+PeeKJrMdn0p58 +OfjlhRpy5tVa2kOQpaq6Ll9RLM3PjnX5IvnoM/HHX04P2VaqzgPEweMjcZ4VWm1VVRWPx6PR +aFqtFmDDddrUXlNuiCv+KPCYKNiXcaDmJlowbLUhpuKtX8Ntgx+A+sZiDLC3bBnmv1uCrUV6 +rdEO11aU2GzWA2E4cbV5rDraVk1r6zuxlZi3BQvYGAcemGsG63Rga6O4xmVaQykm7WoNj/VN +sDp3rI4ka7ay7ZZng1i2m1knx67X9li2h8PBAxdc7mBprm0BsOF93N/rZKDXKTACwGuKd5bX +oSDnnR4uu7yuGDu9nHd7Oe/y9DoY7LzNe8sn+3d8cWj7Fwf3fHU0zC3mtr5OpGoGBPfDcA+M +vA6gy30WU7/ePGCE+0yWHgN4hYcgeMDSV9XBz2Tmcws7q3phNOy016DPKygoViqs2r65uUUh +UZ7YHTfvIf85BM5sgmz29OBQfwYGHmj4BAIe0Gi6KmLuwPJV9f09qQeP7HlyVpajs2VouKNn +IJnGS8wWNmu7C4PjKN8s958xw/upx0OffSZt5nOMx5/n/evl9OcX0Pbs13d2XA08Kqoq8+VK +lZKT4LEq8fSr8WfezA7fV1MlKa2pFCqklQ11LR1tykIlAI+W5maMN341eNju+Es9tDG5ncED +qGmrPd8aI2FVf7ZVwrDS/Zg2HPcWoAVMTdt2KwAiUNZaOxSM66J4jbbLtrNhjHG1eeCxNovj +ZgP8gJlBMFWOBXzudSXZ2hysdhJwXbauE9vLtI3xwN4a15HBVmyPaGussA3SGHdo282snRTG +Hcv2cLb3DVwLuKKp3M87ADwOHDiwatUqXDHhcmdLe1NHgm+a7+kgX/tQX4cQMPwcQtL9sgNO +RXoeCpxkHAn0OBQYeCrm0p6ArUsAeBwEY++yY+G3jatlcukzW7rMg/ltvTl1Q0Xdln7LQGWX +oW1ID5sHYYsJHWakRKfZhMZQdgx1ZUukmfRcsaKora9vwGwWSqVlaqRkent7i1AoIpNyChXF +CWG5i2Z4v4yAh2LOg0HhAUz0YFhXOCB6a/orPFbyvL1O6/zTDxc++VRJJA/pdT2Dnepqjbqq +xqSDO/gy5s7dye+8Hf70M3Ezns+cOZvz/ELR3Ldz3lksOHlmuK3tahfX1NzM4uZRsxIi3DZF +OyyOPLuEEn2mt7umvrtNXl7aPtCjqdbS6fSW5hbEDmO5qYpe4+jiJqnj9wQPXK4hEyNdf4Vg +fpap10i5/eX3Bw9ccPkrSFdbT6Jfhu/pQAw8fOyDwUj1y6JGsHMi2dQIzriRHcmmRHIY0fyL ++303Ldn7ZwEPSDEwmNTY4arq8ahodS4cYndpQ2UD7HqghEfGckmRMAx0YCp0wGjQamvYjFwK +nVkgkbAYTD6XK1dKydSMXC6vtqYRfNVXybWL57vPItBfIsjmPBgQFczCwAMaTRLRI5MaRvu/ +IhVAYGiwv0Mj4FRxmFpFcW1zQ4EwXZAbUVxIbaopMdTXF3h6U5Z9R5zxCvmZ+blvfMT54POs +Jcsytm7rKVYgTHQVi0d/X79criITU1NCnZK8t4c4r0kLO9/SWN3W31NYUSYtUqaRMhlMRqm6 +pL6mdmho+CZR4bcVHDz+KMGMKpghZdLslanLDmciFjQyqWsGBw9ccMHlCktAV39SIPHymQDM +3IGBR5xnSrIPMdknY+JI8slM9CGm+Wef3+29Zcm+Pw14FPT1B1cNnNPoHKv7T5XpaL3V7pLh +7AbYiBo4LGN2CevASmtZ4JGB4dqKaiE7N9TXPzw0RFDAr6rT6nWj+RotjfUrFns/S8h6kVAw +/2HfuAgeutpoBQ9EuWPNUNDZAJGYkFgPeLi3s0SlrdJWZEYcibrwaczlHzLizg40ldeycjPX +bOe+/wXz/z4nL/0hdd3m5BPHMyOCDPqr1mezWEzNDU3igkIeh8ejpXOzQykpfikxoSQSicpi +phAz4pOTMkiZLBaTxWRKC8Tt7R2T2i5w8PgLgoc1KsM2mOTXGUzG9bbGwQMXXHC5Knh090d5 +J/icDfJBwQMbkRfjY92TY8C4lBTjjo5LSdhynFsqWIj3Sju/03Pbn8jV0mTqz+3qPFfatbdo +4HyVWaGv9ZLoqA2QGTVF/FIdY2yY0UiNsTBK/cBQtaa8uqpSb9CNRpaiJTqM+s4DG6KfJ2S9 +QOC9+g+f5FgRotBtwMOCdJtF6nRh3haTBUnVBUtdnR2FxbU1mlJOxLZMlzlJbguj/VeWyCha +oTRq79GYH5Zn7NhGdnSkRIVmUzIzciiDQ8NWWhjv7LCYuzq6lXKNgC8T8nh8HpXLzWHQOZkk +ekpqWkpKMjk7m8Vhs9kcoVBYqlb39fbeVr+ZWwQeYEIwc2FhIf43jgsOHrjgcnuBRw8Aj0Rf +x1/AA3W1kMjh9KxQ2sRBDmGAV0oky2O/39Yl+3d+cXDnnwI8LHCbuk1zWT6Y1tFwuaiT1VgW +JBzg1gAdboRHq4mODQgarUxuGYbNQ5AJi/oY1fJYT3ozBBACqR0K67wcs+fcF/sigfHvfwam +peSjW6F1PhA+MOpheAC26MEMZgQ7TJAFrRQK9XT1KJRVlcWFvPDtWQ7PJjo8E+f1PY+WmM/J +Sw4Kzgz05GcmFuTSckVculhAYeUO9A5cDTyQOuZGc1/vSEN9e3l5lbpErShUSuRqqbxEIpbI +JBKlXFFUVKQp0zQ3Nw8MDGC5wHc8eGB1PE6cOJF7dRmXbItl4F5XJp6qTqe77l6TIlBBQcG1 +9wIbTNwLTHXdw01KYlO5ut4ruRRroXhdGXcnp3gzNRrNpL+4W3EnJ72Z172TJ518Fi96R7Xt +CvCY4uekdwLhT+Vm4qY/XP4S4NE7EOWd5OsY7OMQPGrxsA9OukwkBuZkBFCR4Y+OsWViALI+ +K4Thbue36ZM92z4/AMaeZcdvnzoeUVFRvZN9qR9o7G4VVBsbDN359V2ShhZR1XBtN2S+WpYq +xh6QeVyZc9R1ArjCAJtG0IwXYqL0jX96vEQgvf1kNIUqGd0TrQcK5h5B+tqbAafARiNsMBgh +0xDqdent6JUWqIok+UTv7eH7ZoQfeDrhwhopi5kvllKZVLm0QKGQyeQysUwqLyxkc7j9ff3X +ASsLICTziE4H0KKnp7e9s6utraO9vb2zs7Orq6u3p2d4eBhrSXO7CaYQdTbd934TAVqGcD0Z +V14MY5XrCiCliZdw3b0+/vjjiSc5a9asa+81aWYlmOq6h7sa4F1XxkELuEVT2WvcnZzizdy4 +cePE87xFd3LSmzmVOwmEu+ZBW/CY4udkIv5N5WZO/HThgsudJ+CrdPTlZF/HECt4BJ4L9zgQ +sHvZkb3fHN/79SRj15dHzm508zoQvH7xrs2f7gNj59LDIa63dx0PoJoNSNlQwAHQsAUaNEM6 +pPWZyQiZb7AoBTTap9VkQdrFw0px20fzA58kxH7wXFQBXzUpwEAWM2wC9GE0QRYd1gWms0+U +r1KIxRm+O0IO/Sv8+CPJHivU+fxCVTkzj6cqUaPFQMu0Wq1MKsvLyzOZTNc8JWiydbdRBOkf +Ijf6PR23eOAWjz+vxSMzM/PsBJkIhBj/nL2eTHH+cUKj0Sb+Nm03mPQ3jstfUAb7B2N9U3zP +/mLx8HcMC7SPctru6bzTa9JxbrvH5aNh7nYBaz/evvHTXWBs/3x/8IWI2x08MI+JYaymBpLA +AhnAuJFyWBAyAYS4UowWWIfo9K5208qv4v5JcP/kBc/8TF53Q3N7dX17TXVHtbajurqnttEy +ZECOZbGY0GAPrMF8S2e3SKYpLVJnBu2OPPtklNP0RN+lFUWCisrGPJEE8EZjY0N9fb1MJmMy +mROf6lfDj0kxA1tvLbiBf+ZxwWWK4h7MXLPWSbjzlds8xgMQ1Ouvvz5F69Cvs5ht3LjxunvZ +2dld2842d+7cO+BTAZ6hNU19/IIGfkEdt6CGK6rniGrZwkqWoJL5/+y9d1gcSZboe/943333 +ze7szO7M9ExPt9S923dm2o3pVsuilvfegaAstnxRhZEA4YT33pvyFu+99x6EFUhCICFhJCSE +9/AiK6Xs6sIIkGkEdb7z5ZeVGelORkX8MuLEicK7Gfl30/PupOa2pea0JWW3JmW1JmbeTki/ +HZvaFJPcHJ3cEJXQGJHQII2vk8TckkTXiqNrhJHVgohqLlBxNVtYzRJWhAnKwviVoeyKQHZx +ECcvIr7q6bORjfTPGh0eFQVE+1r9BB4+lsERfvFJ7JxEVhbQJJkqrKdwcxwNPTUOauKPEIDq +HqcGOYStc/CYnJ+ahLtOZHO1z80D5JgZhyJ4rEJm5+fG52emwGnGoU4U2HfDzjz+y/9Noak4 +5/nxCkJZmYHBGUH+mQE+We5eGfZe7amFAHEA7IzB88DKuju6XwxkV9SUFBRGBRmF234Z7viJ +OOhKV3tdd8+zmrr6vr5eABvgAy0pKenevXvzK4j3BaPFwpiibx5nQylK2YRS0/DYxiMXR48F +iqVKLmI8YjNq1+3dwp04Xl5eK2kdWluL2e3bt1971N27d5dpZwNotDGCsrZ2DMRm3hXGAW3h +xjZzottYEbdDJY0h4sYgYWMgt96f2+DDvuUZXuMeWuUaVOkcWOHgV27rXWrtUWLplmfhkn/D +sdDEPvu6TbaxVbaBRQb9RjrVNJ10PZVolKbLTNFiJGrSEjCkWBQ5FqefQLiepH8j3ie05N7D +0XVlh+mZWbxlxK92WcAxkFel/7zizvON8LN82dXiZx0KwEPsFRsXmBYbmLqIBiUDTQxLdzb0 +VN+PwxzWBap9nBK47sFjam56AjADIIU5SKFGiPmZGWi5ihYPGXjMTs5B0TnmJmEv0vni5FKd +v2oIMc6DhVUjxaX9mRlPUhKexMc+EUTccw/OMXN6VN04OzMzBjWVvGxsGZgcK2+pS4iPFAfY +8lzVgh0O8wKZjzrbh4aG2+40d3Z2ZGfnRERElJaWgmcZGRlZPkq5fChRhfVF430pq5X1L7UN +j209cs0cMgvKOiYnZ5QGeW9yr/OZd2gphhqtyUjAUCPRlAgMLVqTmaTJiBbF3Op/ProO7xkG +j0WBYf3IBogGf7ezLyq1PkhYHigqCxaVBvMr/Xnlfpxi3/BS75Byr+Ayz8BSj4BiN79CR98i +e59cG6+cmx6ZVm4ZFq5pZo5p123TrtmkGFmlMs2TGWZxDJNY2rVYilEM0TBKVz9Skx6hSYvE +kCVogviqjkCdyNMxiqLeSKTfSKKZxpOM4hk3YuubH60fa1S3PPqPvdb/vtviV7stVwse36l5 +CgOjFcBD4h2XEJwRH5S+iIakAE1mZTobeKruRaEOagLFHyX42wevc/CYk00CPwcPl517pa+m +e18F5slGyU7Pzk/OAggBpdBoR36a776Tvipnm7jimbLKgeiYoQjJMI8/HMQa8Qkrp93gEhjt +dbdmX43bnYMiow5UtZXm5CbkxsRnSzhR4c7cYL+sjMJbt6rz8pPj4+Ok0oi0tLT8/Hy421dJ +C5tHbt994hZYhKXF4PXjcfQ4PCPB0iWrorZLaZk3l+X/Rb1PhjnSGk1mDMAMDDUKIIe8Yukx +WgZJoBZobutTgsdmA4/B4aniik5ebEVYVHVYZENYRG2otCpYXBskqArgl/lxyn1ZVd6hVV4h +Ze7BJe5B+S4BgD0K7LzzbT1zrd2zLV2zzJzSr9unXbdON7ROZlgkMUxTaGZxVJM4snEswTBK +hxkFwANPjcCQJBiymHgt2sgm1cQh3cQx7Zp9qrFdynW7NBO7rBv20unpqXVik/zqdoAQv9pl +8WsVq48O2a1KD2gHS0Pi/SyC5cGD5SgSuEXzXSMXUTcpULFXjB3N5bKKuvo+jPp+DPawtq9d +wDoHDwg6kPGySKzSuVeBSldeds1B4DEyD3RmZn5s4llzhImu5487c03MC/1DOoURD/yCuhxc +e63sesyse0ysHhhaso6eLQvnzs2+jFUGrvfseX91c15uQUpRallZallBek5yfFaEJE0iEgh4 +AZGRkoyMjKysLLDMycm5f//+BgYP2P1sYJ1FF/mlpKCsQ4vx84qPGgnYA3AIoJHbd54oTfQu +ZHhkIi6tmWKSoGWQDEytgBzyitOPo5mnllY9XFf/SCV4vDsBtURR2V3PwNyb7lk2npk23pk2 +ntnW7rk3PbKs3LPMnTKu2Sabu6Sb2CZdv5lk6pB6Dah9krFdwjXrFCPrZEPrJAOrJAPzZLp5 +AsU0Vo8pJVyP1DOM0KVJdA0jtQ0jdQwitJkR2vpSbaoER5NgqRKmVZKdb4G9V66NWxZ0UY8s +G58sU48MFEN44Ny1gtyIkZHn6wc8gB4mhhVU31+VVjU/ihek+ZkD6vgJPLguUql3/BIaJ/VO +iPZPdqC7nN9z+co+1JX9KI3DeG87v/UOHj8P1YHo/KoKEKjJYnZqbm5Y5mU6PzlaHe5rtvM7 +PpXyora+KiqhyMW7w8X3Ht20h2zURaK16ui2aGASDh5PoxqOP4Y+lMagTp/56dHx3iftbe13 +Gyu7aosai4sKCkoq8gvr87MLivIzi4sLi4qKysvLa2tr29rahoeHN3CZr4xcCsvQ8ERMSpOe +cSKWFr2wvgMcArX260eHCqu6eweVqPC2ZGZmFsDedbt0TWYijh67DHL81PRBi8HR45z9Cpta +e5XgseHBIyu/BU9laRA4KKoQTRFjyDwsmYMl87FkEYYo1DeLtPFM06QKLOwTLB3iwF40RYSi +iHAUHo7Cx1EEQPEUAZYixFD4ukyBo3c6xUxCNZU6eabqMkQYighPFeFoYCnGUURYmhionpHE +1C7Fxb/INajYNajENbTc2DHpEMr1v/cw9pw1SIrwevSwbV2Bh7qpeA2HJ4jSAq3CfF85l3pb +BIk9Y+OD0+OC0hbT1Lig9OTwHCeG29mdFy79qAb06kG0p63vOgePOVlADjiEuXxw9NV1tEAn +mZ6em56U8UpfbqHn3mMuxy5XpxXW1TYXRCem3HRus3K5q6V/X1Wr4uTZuJ07Iv/6l7BPPvf4 +2z8b+FLo2wqwx5zM42RybHR8crh/9llP/6PeljuPWtvaHz+429vV/hDc/6NHj/r7+4eGhsbH +xze2Y4YSPKanZ3OK2g2tU0Hdt7CF/+dVXrQWM4lkkhCV1DQ4NKHEhjeU+uYeB+98vH4cnhG/ +EuSQ48BIGahEB/EqHj5+8UGCR1vbfHX1T/r4sWICsNHBAdK2tkVbKqFd/v7z3d0bFTwmp2er +6x9o0/loqhhDFeAAIVClWKpYhgp8LE2IJvD50or7vaNUY15hRWdFQweOyMHQRFi6AE8X4ugi +PA1SHE2AowmxFP4Nu+jegSmPoCyv4PzH/eNmVpEYsgBPE4K9eJoATxVqyg7BUMRgC8082tG/ +wCW0VNNY8PcjZp/u0P9sN13lvFF6tM/jB60bADzihSnBN1kwePhYBQPwEHnGAMZY3Lk0MCU2 +MC0pLMuJ6XZmx7kLey8DVT2g7mHjtd7BQ4YKC4Ojrwo85qBxMdNTsqEwM/fuJOAwZn/fkctO +aLk3wE3JjYpNzPUNrjO8UXL6SuRX21if/c3/oz8GfPxf7E8+CfrT55LTV4Zabs9AfTRzE7LZ +6JAmlJm5kYnZ0cmpmenJuanx6ampKXlvUiV4bGCpaXh80z0HVHx4/ZXWfVh6rCYzycA6Navg +7uTk9LxSVtNgOS/zxs8rafdnlWFpUZqMRNiDdA0KO53qGsWJYut/WafTtYDH3r3z/+t/zf/l +Lz9pQsLP9iLbQTIdnZ8BCbwdSSMQbEjwiE6pI5pEaZABckjwFCkebpegivAUEZYqwNJ5OBI7 +v7S9tfMZgc5Ky2m53ztAMhCiyRIMxBIiWAFOQEqWoCl8j+DMwYkZK6cEG7fMwck5d78UdQIX +gApOn4+j8/FUgewSAsA2WCrAD4GWgeg4xuOzXbRPduhv3WO0ZTdT5bxhWoz344cbATwSRanB +1qxXE7VA4CH0iI4PTl8KPOIC0pLDsh0M3I5vP3N2z8WzKhcv7VNzs/Zc5+Dxlgqu2fG5ySmA +AYNjNU6ODn/7LOqa6cDTkVsdTzzEkfyUjNvZ+eVmFrH7Djn/5g9+v/sT/5NPRJ/9Of6Trcl/ +/IL1yZflNx1mh15MQSeZUw5U2MzgMTU90w6NniiBKq811X04/XhNRoKFc2Z5zUNlLlq5ZOW1 +2nrkoKnxeGB2WtTakGOh06m+eXJK1i9WHawRPIAi4uPz00+YKJCGDn9/iD1guujuhnZdvDiP +9P8CJgFbVtDuwWQy1dXVP6CsEsAu1jGMx9LEAAY0qWJNGsQGOJoYQ5OggZK4ZrbRvc8nRfEV +GrosF5/0p6PTPqF5Gjo8LA2AhAgD9ZtArIKlSvFUCZbKL6npar7bR2IIyYYRzfeellR34Mkc +wDB4Ol+TLsTSpODkOKoQWtIEeIpEg8L95/Ebn+7S/3Sv/hYVxpbdDJXzRqmxADw2QldLkkQR +PATuUa8Bj9Ase6bbkR9Ont59FuiFHy+5WrltBvCYl7V4gO+m1qJKo23bTf7+1b2UzLnZ+Yf9 +vbE5qelVNc8edzfweVEXLoT/z1/FH/0p/pM/Jv/hT8V/+qLi8+8SvtwpvKA6eLsZasOYnJI5 +uyplM4JHRe1DS5dsbWbsoqMnVqHyfqd3lX6nK5K84ns8abWBVQqOHqWqJ0GRI96cPWCnUzwz +MVRY/bhn6IMEj4wMiB/mZX0oADPkWz9gugD4AcTYGEqm4HUGOGR9u5esTUJ5xQSjOBk2iHBQ +I4YMJ+gSdYpETYdLM+LXND1u63xONRGiAGDocwsq2+93D12ziFTXY6OpEohP6AIMUKoUTRTe +dE5+OjjtFZQO+YGQeZ5BmS9GZkSRFRhCGIbIw5PFeBpILMTSAdhIMTQhgBw0lf/dKatP9+hv ++ZGxRYW5ZZcMPGI2CHgkS9PkwCMEBo9lulpkLR5ZDgbuh7cdP7nzJNBzKudcLF02BXjMzc7J +JqatySt1xesG6RLuFVU+fzHS1VX3oKP0QW/n+OxIR21xvD41ftePcb//Y/yWjzP/+k35dz8W +7jqScOJCvpPjeO9DqHtnanrVsdqV4LEhhCcp1zGI1aDEaZCj3kqVB/ud4mhST2Pre3b7Ou1V +Npfa7bpD/c820q9Xos3E3xQUt9g5i2wcxZ4BaRbOGQA81AiSt/Ii0JRIbcNUIkOy6KXv6P+h +h607NzX+LjLV2sED8fHQ1YX4AYiDw0sCWQmubGgJFhRrG8epE4VXSXw1El+dKACqpsfWILIs +7GNqm7ta7j83tYlS1w5RJwmvEsPoJpz61t6G2z3QRr0wNJEL0l/V46nrscjGvMr6R0G8QnVi +uDpBCJ2TEBrKL+l+NhGdUksx4qN0w9F6HBSRhyZwUUSuBpGPIXHRFPF3p20/2a3/+R7GVhXm +VlmLR9pGBA8fy+DlwSMmCCyTk8Iy7Q1dD2w7dHTn8WM7T5xWOetk6bxOcktPT8/yM5u8IXnM +zUzOzk5PTUxODI7cLq9rrLnTdLdVwjZI8VNPDzPIzAl90N9YmyCNv6yRuv1g3JmLAryWhMGM +srRKZoU+e9Y3Pjc3Oj839V7cNib72p9E3+jhEt+i9grp/UmOb1GjjY7Rfvjf9wTX3+5p1602 +s2+k2+lFmWrzGLggAsqRbIQlct78uxtDjcTRY2n6XCeycQPhv1ZYEW9sbV2wpZj4l3r9/8k3 +2M0y1PQwNjYx9bFylHoF5xhaJWozo68SJBpk6dqQA+CfBkl8QtVzzzGLRW6G8ts28n+0Uf/z +WabPOgKPrVvnCQRIv/tu/uDBl9sXBY+hoeXAY2hoQ4JHILvoul1aRHx1ZFJNRFJNVGJNdGJl +dmHLnXt9I2OTdzv7EtLrJHEVUUlVUUk10qRacWJVfHpNR1f/4OhUbf2D+JSayISaxMyW2qbH +TwZGm1sfSuMqpYnV0Qk1MQk1YEUSX15Q2tg3MPx0YLS26VFSRhO4UFQSuFx1dFK1JK6KZhb9 +3QmrLbvpW/bob93D2GAtHulRWStv8YgOAuyRBMDDztBl/7aDR3aeAHp8zxl7S6fNQcFz87PT +M7LZ7YG0t3XWNTy81XIrIgib4fB1+s3vpSE6pQ2pJdnpArpJjO61zABBelxKZmZOXFJKTHp2 +78jo9LxsPtzp1Q6nWYs8jbNW1j7rX+PM9bC0SDU9CerN2j1w9JgzqIAdB4yLtD9WWhXo8K0k +hX9E+/2fBX4cGZ3MK2wI46QyrgW6eMd5BedhqdJL2sKVc6CM92I0SJKjl9z+uYf21Ta9ExfN +F/4TkVsC5PmOvrYWnZZuFV0tKiov/TQW7WpBEsNYIt/VAtbBFmPjjVfW+4QVOvjnT/6saRqa +BnxqZnJyZqlvW6h0n5qamvlpLo65mdmpqenJpb40Z+fmpkHquWlZrfCqlgGfjXPzNq6p3x22 +3LqbsUVF/zO4xePCxgGPvKQCZFQLHMfjteCRHJZlb+gmA49jQI/vOWlv6bBpwANkkrkx2cDc +jvbO6rqOiqoysdflhBt/jL72schHI6cgLi87P4MtqotJqyqoKSmoLC6uysorScvIHxiQTfQz +JZur7t2Dx+zYiz4xs8vz1HrWIv2vBed+ddfx0ArTb7DKsZ7ySRKX6+6fZmqfdkVHpE6UrKmt +I0adKD560eWrH/S+3Kbb0/t8XimL1wqL/OuePB2URuXTDH3b7nY3tfa4+OWq6gov64heix/A +7BhK5KmrPtv2GQCzf7lNJzAs+cXgyPsHj7WIAngAooC7WuZfOZci7SewcymMIrBzKUiAeJOu +2Ln0gxPf8EJ7n7wXozMjkzMjE3OjE3NjEzOzMn6YnJkbHBofGh0fmZwcnp4dm5ydGJ8dm5ga +HZseHB6dgIKLQuEpx6dmx2dm5mRhsodHpsfAGcZnhydmgI5OzID1F8MTI2NT8LSlIOXwxNzI ++Nzo5CzY9nxo1to59btjN7eokLf+SPtMxXDrHuaeCwapMb5ZuUXj62A42xuCR1F6SfDNcF/L +tYHHUaDH95zYNOAhc9CYmx+FhsNO3r97p7i0uSA/l2t3Ssj4Fdvw9yIfrcryotLShuLsguZb +1RW3Gm7VNTXeasrJy09PyxgeGIRG5EKzxczOKqOgy2QzD6cFWaC9ozeYlaxD8XT3jY1KrMPT +I9SJK2/th5ADrJxU8/5+L/Orbbp7DjOCwpNmZ5XuQ6uWx93PK6ruJKZUPBsYzcxtMbNPvaQt +VNUTLxVQBegFbMjOwyZfQcihdwl1MzWjcqmTfwDgUVj4M7pQGGwr36ABgER+EO7GHU4bxC2i +WyQ4emY4eac5+QBNd/VN40hKqhofDU3O1DV3ePtn2rpn2PumO3lnO/pm2PoluXqmZhc1Dk7O +3LnfHx1f6+GX6xuan1V8u/fFWFF5m51LipNnpqNPqqNPupNPhq1riiCioKd/pO/FREZ+q29o +gZN3hrNPqrNPmotPuoNXuq6x+PuT1lt36X++h7lFxWiLiv7eM/qpMd5HNe1/tcvi4yMOR0nh +rtz88sZfZlzbG4JHeXZlCAQeQYibB8814rVdLQ5Gbge2Hdic4DE9Nz8OIerU/Tvt1RVt1SUF +IuczPNPfhpl/EhlIvFNf13DrfmFhRfOdhub7rW2tbUWFBalpqU1NDdNTUEvH9Pz02DxgYuWA +2s0OHrCMjU0VljR5+kU/6h7IKWzD0qQXtYQaJOnr4meCui/qHCZ4x6FroO4DehXv0PVIObZl ++fbK5WR6erqu/n59Y4esAXw+ObOJZhp7UUug/vN3ASx/RZuz94TVN9sJX23TO3TmOl+SNTa2 +XDy39QgebW2KkcGqq3+2Bfz094egYtHWDDi82Gq8Sj448AgWlOkYJ6jr8q7qsq4QwlUJHDVd +PvipzeT6hBa0dbwoLu8gMAWXtMNV9fiXdTkahODIuMoHvcOShEradQmKEK4ONmpzNMlsS4eo +6qYuW7eky/ggNT3WVQLromagrVvyna7nRdXtN+2TNIk8DT32VbBLj6NO4GjostT1wtSp7O9P +W23Zxdi6x/DjXdQtO/WoBpZpErfdqubIbGuAQD46aPubvVYAQkJiKlo73l8J8IbgUV/aGGbP +8Vk7eBw/sfvUzeu26yS3cDic9zbxx/P+yY6WJz23q2ND1SI8/hLj+XW+hDH1pGOwb6y1pWt4 +dPjJ067GxnogY2NjymJ/UYEnzh4fH9/kdhgbmywpu11b3952r887pFCDKF7K2QBDg9w5Lmux +VI5bfL2dAD63j50zEUfljU9MKbPTW3gR45Ndj5/1PYHi0g8OTQqjqnSYkTL30Ui4V+sMyv/v +O8kAObbvp7n7RvU9eX1psx7B473LhwcevHI9oxQ8NIWKEIroRRPjKGIsRaJBFqJ0uFY2sfe7 +n5c1PtRm8DFUIY7MlsbXPBuZ8Q/Jw+mwsCQ+li6EophSpViyFKUX7hGU1fNs/KZLAgbsIvGt +XZJ6Xkyk57fo0AFmQIHW0bLhtGiqFC0LdqpFE6Gp4u9O3/x4D/XPO8nfHCDr6FsKuS4JEndV +fS9Q3QPeUJiS/rd7rX93wObzU84054T3QCBvCB63a++EOwtWBx7hmfZGrgdkPh6Hdxw5qXJG +yBKvk9zyjuN4IF9NUGv2i4HRrs7evq77zXWpTVWi21WSjua8sYEno4OjfX3PAWx0d3e1t98b +HFROrqGUFcmDrqcTst7bW02PbNwyVHWEGuQIJLwYXPGp6QkOnrX/difpq226O/bTvAJin/a/ +UJru7cqzZ8OdD54+lzllhbDzjl/2BiiIIkuOX/b4dgfpmx90r1uGt95ZaRO3Ejw+SPDgluoZ +x2OhkBpSKHIpRaxFEeBpAhRdDEXn0GU7uscODE2HCIvVCGxrp/j+4SleXLUqgYOmCjRpUHx1 +CFqoEixNiqVLcXRew90nFQ2P8PpCLQNxZUN3Q1uvNp2tQQS8AahGAgUco4sA2KAp0LomTYii +SP95zPazHXqn1A3cPJxiJV6xQpfOjtrZWai1vLzxoSs3/ygp/Dd7rf5w0PbXKlZyEGIGCOSv +591CYioGht7VN90bgsed+naWiyJ4LBVADIBHLACPULjF49Dh7cdO/HjS3sp+YmK9zBzxzsFD +KUp5l9Ld/fxBVz+8nld0R4su1iBJ4VYODZL4mGz0xJfbdL/doWdhy2nv6FZa7N1Jb99Ab++A +q1fSwVOOJy667pT1ah09Z1JS1rSq87xr8Kirq7O2tn5b5V5371BP39sfIfvBgUcgu1CLEYmm +C7CyEOhYSAU4mgBQAUpfpEGX4CmcipqOW629WlRWXHJjd98QzVSsTpFgqZF4iBwEcMhTHE2C +o0lRFH4QK+fFyLSJfYylS+Kz4Wn/0HQNIgtHh86MowvhqeI0qXw8jYeFAplKNIj845fN6cYW +ApZ7gsApgnWzqbZw0Vu91dbtKy7eqx38axXL3x+wkW8D+c99NwEYgATrDTzam++Huwm8X00S +B8CD7xaRGJoZH5wGNCE4HSi8Ds0cF5IWH5KSEp7taOx+4LtDx3aedLR2mpxcR/NVKcFjoahe +EyYVtLyLM9958LTm9iOgYEVp57clAOMfdvV3PXoG1g3NhMcuuKvpcE+r+23bZwC5c3yvQ9T3 +rqptUxrq/Uh13f1r5qIjZ+z+voN4Ts2qpfXBas/wrsHjbc1OOz4xnZF/x9gm7ZptWnbhvYm3 +OnTigwOPxrYez8A8DQIHR42QRUoXo+gSDDRviwQn6xZBEQXSuNre55PU6/zyuq7mtm4tcrgm +RaJFlUKdLDSxbEY5KR6ABzT3itDCKX5wYt4nOD0wNO/ZyKypXTSKIsRDaSCeAXiDoUlkhwhA +YiyVf90iMMjXM1boEcmxiRa61VZlTU+9pqodGBqPyKg/z+QBAgHUgRDIHw7abkf7F1TfXz/g +0dnygOMs9rEM87UKBepjFRLuwBd7RoHHBSqSqRBRzwihhzTCO+4m3enQjqM3DCwmJ9dXz/La +wMOZnff1JQ9YQTW6wUpO8FDcxOpFgQR5aliDIsuQvcAOCntB+uHRlzkf5OGDeiEg18G7wAqw +obKSeovy4sXog65+qgH72DnXQ6dsZe4cupfRtmmZVUrjrE3eZCBZOC/H3IY/s6aAwx8EeFTX +P7Z0ycIzEnD0WBw9DqzcdMupbXy8OcFjfHK6pb1vcmrO0T0BpctGk7kYsgBDEqPIQixJgCVz +MJRwdRLL0DrOn12iSeM6+Wc7+2VgiCywCwsFRedrkAUokgAFlhQeisxBk3gEQ3Egv9TwRqSh +eYwfq1iPKUJR+GAvmsJBkbkaZD5IDJZ4MkvfMMjVPUjC847l2UtZjplJwp6ezlXdPyCQkJiK +z085f3TQFsGPjw7ZAfx4W60fbwgeD1ofRvnGhznyw51gFYQ78sPseeFAHXhhMg1/paHQksNx +ETsYud00tRkeHllvGWZt4DE8OmnikwZsKEqte21iol0sqGrf50MBHngTIloKPAA5wKcFioAE +YgGwEfwEZoETAK4AP+Hz9DwdAgeC9DBCg5/gqJWYTimrla5Hz4LCsxkYxhlVS6Eke3R0QmmT +D07WP3hk5t/F0KIBbKApyHyFkZqMBAw1yp9T/uDRW3DX/4DAIyG/ecsJJ2nGLbD+pH/IwzfG +0Mz3+o1AM/NgE4sgU5mamQeYWgQam/kbGvuYmgcZmfgZmvqbWQTDe8EWsEQSv1w3CzI08jU1 +C7x2I8Dwmp/JjQBTK1l6SyRx4HWLIDv7AE6of5TQRcK6GSvxrKvOGRtde89XeePD80zef+2z +kW/9CIoq+8XBY2hgqKm2ub6ysaGyCWijbLmMQgkqmhqrmybG1mMZuOauFrhiXUnlDtfX7/Oh +Vn5vawAPefqCcUIePOTbMQCEkB3j3vx+5EU5quU1H+lT4x03t0EBwA3+e3qwV2kQJXi8XfAY +HJqQxtdrGyQsOl8hPBOQrlFcRELDi8E3+pN+EODR2vFkr3bwH2StBI6s3OK6jpb7fWB7d09H +TXlmRUFCRWFiRVFyRVFSZWFiZVFCRVHiyy2FMi1KroT2ylYKk2QboSW0EayAZUGy7EBovVx2 +CLwuSw+dtqIgsao4qaootro07kF77fzc26lkO7uf61hH/e6A7b/JBsL8h4qVbUj2LwseG0ze +CnhEZtYT7WLvPHiqek0IKmKwhH0YwBKurEFKeDtyOPjeB1vkE8OSVNCCnAScHCzBmeFd8DrY +CPYiG4Miy+DzAIUdM8DNIFcEipy8oPo+fGYk5VIXXSF4wIiyDHiAdRg8wE2CXW/Fb0QZx2N5 +GSgIR6qtp3HWSoMoweNtgcf0zGx+yX1DqxSt182SjKXFgDSG1im5xe3T02sMT7f+wSM8rupP +h+1eumXuu/nxEQdeUs1Gyoe9/UOgAP+dzPv0P/fZ/OOK15uMulWCx1sHD39pKVwFg42I+8cy +4AGwAe6VAIlhxwkYDwCNgO1gC9gO9iIHytfyQMEuGDxAMuSi8DkBXSwKHvCZQRokJdLTsehF +VwIe4FrypLEQPMA5gWXmX3W1AH3z7hUleCwvoKpCqq1eHklpECV4vBXwaG7rc/TJx+nH4/Xj +VxgpFy9LbO+d33h7LS1v6xk8BobGz+hz/vDKHeJPR+w9BYUbNTcC2PjyosfLJz1sB3BLCR7r +CjxA9SpflSM9C4vW1/JumWAvDBLICtIQoQAeCp4bCmNDwF5ADvOLdW0onFne7URhF3x7y4AH +zDkwosi34cDgAQMMAlQNd3qQvbBPyML2FiV4KMFDKesWPPqeDrPE1Th6tCYzEQkRs/KJgTQZ +ieDYUEFVd+/qHA/WLXiAivhv593+bbcl3A6wHe3f2z+0sTMkeORPjjnAjwxwC3NDsobJX5Tg +8S7AA8ED5AMf+fZXAA+4yoY9MGGFE3Q+fg43WSiwhEKLx8I7AZcDJ4EdSuEECuABswTAIeSK +8D2AA+FdCy+6FHjID0uBIUcBPORHtSAkhgi4B/hYedRRgocSPJSyDsFjfGJGGF1Pvh6vyUzC +0KLXPhUyDUBLMvFafFxq88jI5AcNHqCo3HLcEa5APz5i/+aeDx+KDAyNg2/Jjw5BjTy/+dF6 +n3bwatlDCR7vGjzgunsp8JCvvuW1qLZjYWW9PHgkFbTAJ4d3LQUe8M+FV4THnix0fF2Jjwfc +XyPfdiHf1QI7iiyKSfNyPU1K8FCCh1LWLXikZrfoGKXj9OPWjBw/n5w3FgCMiV16SeWDD3TK +y6TClo+POsC15+ennN9FlK11Lt6iYtgC/77bYrXsoQSPXxY84D6IhScE4AFOuLD3ZBnwUOgl +gZ06FoIH7Nu56KASOOXCi67Ex0PhQRR8POC2FPBQi1pvzSN9lOChBA8leLwf8BBIiy9ig9UJ +QqiHZZWdLEs6fjDiAYG4BRa13fvAQggC6vhU1tYB6tzv1H3eXWjxdS6gYN96wmkN7KEED4X/ +4NomiVszeMB9Igu7IbqfDir4fsB191LgAVf0CE7ID25VAA/AFUuFHIFPIr/rtT4eyE9wWsSr +ZH4x51LYlxW+NyV4KMFDKSsHj3tGW3958JAUnlT1PKPhfxEbCk17R4t6K+wBOX4wEzUZMfXN +H0yLASgV4S/9f9ttuYZehg0mt9q618AeSvB4c1EIILY8eMAOFSDrIrChEE0LpITbHODqGD4n +EqFrKfCAPUngFg+wDrc/wAkW+q/Ce+VHsiDri150hcNpYSPAD7IQPMBd7dcJhkEI3CdIJh9b +bG2RS5XgoQSPzQAedyj/edfgk9G2dzJWYuXgcfqq72kN/7NovwNn7K9oc9BkKeYtNX1gadH6 +FhmJ6fXNbX1v67meDIwVVz9Ky+1IzbuXnHM3Kft+Qta9+MzW2PTWmLS26OTWqORWaWKLJKFZ +FNcojG3kRzfwoho4EXUsUV24uC5EUBXErw7gVASwKvzDynxDS72DSjyCiu288y/qiU/h+Kfw +HDWiyNYlz8Y1z8Yjx8knK5BdWF3fNbf5siioAcWpDda++ebuee7skqScdpm178ZlAGu3xaQC +U9+OTL4tTWgRJzQDUwtiG294ZP2/281Byb8LFRAqrAzhVwfyqiBrh1f4hZX5hJR4AWsHFrsF +FLv6Fjv5FDl65zl45Nu55tu45tp6Zjv7ZfEjK5+/2NQRnBRCpgPwkB/foQAeMCHAXhZI44C8 +pwdYh5kEHn6LbIddMZEmBYVRJAjSIInBXiQBch6k3UMh4DninrHoRSMz6xc+9aKdRAjtwH4d +CjihYSoGFwKKuKTCF1pzvHQleCjBY6PK2PhUfHqzuXN2fmz8s3SPyZ53Nb1OT08PoI7XtvRC +LR5qPsfV/LjS4qs4sx9P255WD7iqJ3wb7AHNm3wOHfQvFWZq5psOsX8+OAY0r+weS1oRKCwL +EVaECCr8eRX+3FJfVrlPaJlXSJlnUKkHqNH8ih39ihx88my9cm56ZFu5Z1q4ZNxwTje1zzCx +SzW+mWJgkcK8EccwjaVdiyMbxxAMo3X0o7XokXhqJJYsRRMlV3WEqjpcLF2qdy2eYppAMooi +GEZ5Bufdud+3eTLqg+6BxKymYGFZkLA8RFgeDFubU+obXu4dWuYJrB0IWdsFWNu3wN4Hwoab +HlmmTqn7cSH7sSFaxlHGNsmGVqlM8ySGWaz+9VjqtTiSUbSeAbB2lCYtEkeNwJAkaIJEVZuv +psfDMyKJJglU0ziCQaSzT5ayoFiVgHpZoXsFnjFtYUr57Supo5eKCArOo+C8AY9/WdjLs8zN +vM3iTnb1N5weTgkeSvDYeDI1PZtb3G5sm/5y6hP9ODvPvLqmX7gnAoDHqau+J9R8jaxi9S2k +Ry57aupzVI5dP4cKQIF6Ya34gaVFY2hRZ1ABX/+g+7fvtGISit7kJp8+G4lKqwEaKq0KldaF +SitDxBXBwppAPqgNS/zZ5T5hVd6hFV7BZR5B4Gu6wAmAh2++nXeejWe2lVuWpasMPBzTTezS +jK3TmObJDNMkumkc7Xoc2SiGYBClw4jSpEvxlEhQFWroCXE0Mdk03tAmxcg2xRCAinWKoWWq +wY1kM7u4pIyKDZ9RR8enK+s6+fEVoZKa0IjaUElFsLgyWFgdwC/355b4sSq8Q6u8Qsq9goC1 +i1wDCp18C+198229cm+6ZwNTmzmlmzikmdimXbNON7BKZtxIYZgmAGsD8CAbxugxI7X1I4G1 +cSCfEMUoglCLEUG3SDSyTTWySTG4mWJolWJgnhzCz3wxOKIsNN6dwPFA3u4UgR+6KMFDCR4b +TGobHtt65uHlYnPB4S8w1Cjv0JJ7Hc9+QfA4rQ51tZxUDzyHZx9T9ZHEVRL0XX48aXtaIwgO +kL7KcbVROHrMZS32nmPmX36v/eX3Wl9t04lNLF706kwmU11dffk77Op+wY+q8eEUQcor82ZX +eoeXe7FKPMLKXIOKnQLyXYIKwEe3o1e+vW+urXeOrXfGTY9MK9ccS+dsC+dMM8dMU7uM67Zp +RnYpBlZJ9BvxFJM4qmEcySSGYBytZxSlaxipox+pTZPiqBIcVQoqQQu37Jtu2VYuGaAatXBL +N3dPu+GRRbFI+vG800lVZmVF1sTE8EbNqI2t3cLoOl9WiQ+3yJcL7FzpzSrzDC/xCC11BowR +mO8cWODgDTTfzgdYO9vWK93aHdgKmDrb3CkDmPqabaqhXTLTPBGYmmYRRzGOoxjFEa5D1tY1 +itIxANaO0KJJsVSxJj0SoJ2VR85NVwgOLV0yLNzTzN3TaVZJ3x+kiETc4aHHc3OzytLjrQjR +LjYosgxxhFjYt6IUJXgowWPDyN2OfoAWUJgLxiKxuUA1rWWQpMWI4Uhrep/+AtUZAh7nsCEX +tNgnr/piqQJtpvikmi+W6HHiipeqNhdLjVpJzwtIA5BDnSA8dM7h2x3Ev/4LD8ADUMcy4LF8 +HI/Z2fmcwmaDGxIthljXIEKmIl2mWJcp1TOI0GFEkI2lZBOpHlNKvyYmG4m0GRJNRoQmU6LN +EOroi4Fqv1xKtekSPFhnCPUMhbpMAdVIpCmbpB5Ph1QTmndejKVJcHQJ0yre3ivPxb/I0TfP +0bfQObDYyjtLlR72zZEbn/xAPqlmGMF3v9tWvfEy6vjEND+imGjA19IX6RgCU0t1DYR6TIku +M0KPCawtpV6XEo2lRKZU30RMMBBrMaXA2lpMkQ5D9MrOYmBnLWBSfTGBKSJdE+EZfJKhkMQU +4WgiHLAz2EWDTI2TWRucwcQ+GRjZxa/Q0Tffya/QOajomkvSD+ds/nGQ4uflkJMa9OzZBzyc +ua6ubv3MOCbvsyHv3aEURPLy8gB7rG0gkhI8lLJOBIAEW1KtyYhe0bwnBklUs6T65p5fFjxO +afidRgefxbGOq/rYucccOONw7Irn0Use0HhbSuQy+AGQAyxPqnr9S4UuQw4tGDnWDB5jE9PB +7DwtGl8DmlBegCFLgWLJAhyFj6XyMWQJmiDgSivSS+7p6nOyS9p5kSUoPQ4a4ARVgKcKcFQh +jiKEllQBFloKUSS2tVMCL7oqkFtcVH6fzBRiyUI8DdoFlniqCNSJoH7EUkQE4wgrt0zP8HIv +dpWRY8p+VafPdutv3UX9dDf5NMYsXuzdWl+8wfLq7Px8GK8QTeKiKMDakHmBYsl8HIWHpQjQ +ZIkOXZRTci9EVMY0ldS19lk5xWkQ+WiqCEfl42nAwiKZwcEKpGhSeLiwtKDqAclIkJrXFhFb +jSNxobdAg1Rmc8AhIpzsKNqNaHuffC92pVt4ua6p9PuTFlt2Uf953CA4wC0z2r3v8QfcF7Dm +OB5KUYoSPJSycpmbm+vsGkjJbnP2L9Y1gsJZrLyrAqTUNUzwCi3NK7nf0/emAbqHh4dBoffa +Dy6BGBrVclLd92WLh7rveVwoWDmh5n0BzwLU4RWShdFzPXLR7RI+8NRVH0AgKDLkOAq7j4J7 +1iCKz6IDfzxh9Y/dFMAbCsixNvDoeTJ0zT5Fg8jDgLqJIoaoQKZQVUURYWhCDJVLNhTdbu/P +Kb2jTQ4vrLjf2N4DvrLRZBGWJoC+r2lQYjyEHGI8BXxfC9AUblRSbUR8rVdwQf/IlINHogaB +iwWVIJ2Po/GhxDSQHtSbYqwMRbSNxIfUXb7Yy/x0l/6WPQZbdjM+3UU5jTaJk3i2NZZssHwb +KixFk4C1ga0k+Jd2gwwIiAJDE6DIbBvn5P7BKX9Orr6x8EHfcGx6HYbAB29HztpC6CiKGE3l +6xoKbt3uKavtxJP4qXl32h89pxgBehHIrM3D0QQyzIMOAVfEUoRa+iIck7/9jBUAvE93MYCp +/3WMERTokhXr2df9AVfcHxB4vPkMa0pRgodSfhGpb+mx987D6cfJHDki1xwBA89IxNCivUKK +73Wu3fdjhcNp+aICBDwuQl0tPgh4nMeHH7/ieVIj6CyOfVkzOCa59NRlU0Ag59CBqjpcCDlI +kqOXXP+xiyzfq7KorhY8OrueE40TcFRQCYo1IQzgQ1RAA5WgVIMq0SAJdajs7KK2h30jTEvw +U3DdNubx8/GEjEYckQN9sNMlGJoYow9qOjGGGgFqQ3Vdtk9IXv/QrLl9vDaNn1N8p6tn2Ngi +Aq3HAtWlJtTyL8bSQTUKDpRioZpRqE5mf3PUdMse/U9/pH+qwtgCVYi0M+jrEHg0vTXwCIos +W4mD3wqTLQeio5PLDGFw9cuXWVukCSEBXxMyuBgNW5vANzQT3+16UVx1H0/noEn8AE7e87E5 +d/9MlC4bQCCWJsWAVwNZW4IBjEfipmTefvx0zNw2CkMUMM0i7j8aLKm4r03jYEkc2SWAtUUy +awNTi2VtJsKzWgH/s5e5RYX+6V79T3czvjvGCA50zorzfNLduXnAA55Sdv7VKFRkJKyCwLPM +v+EIDnlZGCXjTYRoFwvPcrvo3qSClivGAvkHAQoHDFn+qRd9cMBLSFx32GtFfi84rbJHSQke +G1si4mrVSZFYesJbCYIBqnUtZpImI5otqel9shbfj1WCh985XOhFba4MPMJegocmBB4whxxX +9SZdBzfGP3bF8wwq8MhZh5NXPH7YbwiQ42/faS2DHGsFj2e61+IwVCmaIkFTRWiqEE0TAdUg +81V1OXr6vNScxt4X056BGSgCC02XaJBDw4R5/cMzPHExmhgON5VoUIUoCk+dwEURw3xCs3ue +TSVlN2JpfA0SX/+GuOluf9O9pzdsIzV0wtEELpYCUEoIdSuAb3zo412gTuZ/fdTi0z2Mz1UM +tgLdLQMPzHWFFg+4mJUvP1cl8MzjbyvZ8pXLMuEcnf1zMFQJmiJGwdaWLa+SeGo67GtW0vrW +ntsdL4wsAOPx0HSRJj00t7St68morWu8mm44hgwZTYMKdYphyKzY1PonA9O+rGwUiYOigEPY +jj6pfQNTGQWtZEOuug4LS+RiqdALwlAFaAq0BEh5Viv08x+NX1obgMdx/aBA5+zYTQQecIwL +OA4nTAKLwgAcv2upKOVvAsBvi2SQwB1L7f3irMvLXPcqYgkcjmyZp170weEJdgFswE6z4Cj5 +eGXzr4KcKEfuKMFjA0tJZaebfy7ROE5VDxS20rcUgCtGk5lENUtOSG8ZHZt6d+BxSt3vuLrP +cUzwCTWfC4uBB/h5ChV8XpN9QtULAo8z9nuP3vjbd5qvRY41t3gQriWhqVwsmYuicNEkLo4M +KclQ6B2UVd/yuK2z39EzGaUThCWGY0lQfYchBnKEBY+fjKRkNxmZizVJoILja9MkVs6JqXmN +j56ORMRW4knhGBIXQ+Kr6YXRTUQlVe33Hg0KYyqMzaO0SSI8iYcnsXFkNo7ExlPC1UnCbyHw +oG3dQ9+qor91F2PLLqjFI/bn4AF/3IFyDw7MuNqRAusEPFz98zFUHqAvDWBtChdL5OEpXAMz +KV9a2vHoeUlNB9NUBFmbxMaSeShiqB4jLKegpatniCUsAjgB7IYhCoiGEZHJNfcfDXj4panr +hGAoHByJD96dqm6IvXti6/2nt1r7fMOyaUZSTaIQB94piYUjc7AkliaVe1Yr/H9+NNyyh/bZ +Hn0EPKAWj57NAh7yNSYyC/zCVwZvfOvg8RYFhnAEJxbCw3a0n/xTIxFTl3nqRR/8ODl84SXg +SyNtJuC/udR0ckpRgscGkKi4In3jADefBEfvbC1GjKquWOYL8TZmXtOP0zVON2QEZVqhuzxP +rVA9Nf4BwCOSsnP5ZP50IhS5FBW4+zD9i2+OHbrsdg7PuqDNO6nmowAe5/EyIIHB46zDvuOW +K6QOoLaekVevsRfqR1u+/Lff/H6RXUZs45sp4Ns5p6g1q7Als6A5p6gJaGt778TUzOzsfNWt +9uTs+oyC5uyipqzC5rSi1rSilrS8+s6u/rn5+Y6ugdzi25kFLZX1j/uHJ2cByTzsycypTs9v +ySpoATVmelFLam5dQcmt/sGR6fn5h31DRZX3MgtvZ4JrFbZkF99OyGjUM5R8e9hs6x79LXsY +W1SYW3Yv3tUijwRwEEX5XLEwzhJSxsJl42rBA5xNoSG6/8XoSr5VlwcPN/+cqMTanFcWyMpv +KihvfdgDufcPDY3nlTQn59RnFrVkFTUBK6UVt6YWNOcWNw0MjU/NzTe0PAavILuotfFu//js +bH3D3bSs6gzoVM15BS3ZBS1phS1pOdVVt1rHZ2bHZucBgeSWtGUV3s4AFypqyS5p4Ugrz2sG +/d+9hlsA4O2BTP1TV8vmAA+4uUOh7wMOtdFw5yeHc/gTXmG2FLhCBxuBLqyIwRawXZhSu0xi +uBsObEdWFDpHkCwKbgY+dplmBBg84G6RRXth5LcvBA/4qRV8ThZ9cDhkuoLIB3tfbaOHcjjt +xgMPpP8OaFb53aX2LvXBCPIP+JsgLA30irFAIXMiPYYLFS7/FTauoWF8Genre8ERZOiQ3Y1u +hHoGplq5ZGCokWoEyZtHHcfSo89jg3cfMbe/uA95769Vp4P/B/yJBOd+tXwyL9QJGXgEHD5v +89dvjx+84HTggu3+K67HVL0uaLIWAQ81rzPoVYPHD+csPzu+iP6f//rs//n/frtw+1dn7G44 +pz8ZGJMz8KxM52ZmJydnphYN7gA2gh1TUzM/3zg9OTM5Mwv4YpGo54BipqFpdMEu6ChZCmjx +fGSWcSPim/1mW3czt+yR6S7Gp7teAx7g8wrJwDCEyM8nLl/FIJOVyx++TM84vAvO4fLlKrgK ++H5UKL3lqzBwcviWlgcPF/+crt4XCuacm5+ZnpmYmp1eNFz8jCwm3vT0zM/tCTBvZn7xtzM3 +NQNeH7A2/Crn5169kbqWJ5fwAV/sNgZ23irz4/0Oci7dROAhH5B8Xm6ONrBRfmYTuOJWmMEN +mUhFIbPBdS6yC8mi8BQtcGL4JPI+HgpgMP/zaOogs8EJlpoYDjkD3LghX+PD9wN7ZSwDHvBT +K9zDwgeHky11A/JZfZm/lRI8Njx4IP13QHVuRi+1d9GyEe4KRA5HVCHxommQbkH5G4D1XTTB +3bvf4+4dRTHwi00s9Q3Jum6bekVXvDb8wMKRuDRZKsfMv/pB78vvdezP73h34HFI1XP/JfdT +GgH/2on67C97D15yOytr34DB4+RV3/P4cGhFzfsMOujoasDjn7tJZLPwVYKHvZlLVs/AwiE5 +c9Pzc5PTc7Oz8wtAYg7CkrnZqempubmfMAPUnmALAiNzcoeBmhWqOmdnZxYwyYvhWaZZ1DcH +b2zZQ9myl/aZiuHWPYwtu6mnMddipZ5tjaUKpRxCs8hcmci8XfDMnnApDdMIUhpPTs0g4LE8 +CctXE3CRDrdyyL5SJ+QvsRA85Ge7WBI8AnI7ewcXWntybm5qanbuJdYpWBtg3szM9OTcPDJ/ +HECL6ZnZn78SBFQAAgJrQ1afU3h5dc1PLuODv4BaPChb9+p/tofxr+P0oCDn7BivJz0PNgN4 +KEQvR2pY8E7lS0v4LSuAh3wrB9xcAO+Ci004Q06++gMsGsFDHjzgae6RNjT5yWdB/jT3T5cv +k5cBD3hFng3gQCLw9uXBY2FU1YUPDm6A7Bi3EvBYeW+LEjw2NnggzkUrAQ+YruVhA9Y/HbZb +LXjIJ3h3gftAndjY/EAozQX4YesiYYlKyddjL2oJ1Ffs+IGhQsihpsc/cNb+2x2kL7fp7Tqo +HxiW+Oz54MpvYxU+Hup+Z1CBKuedVM45ntEIOHrJZfsB8hFVz13HjY9c9riAZ13U4rwJeOw4 +QI9PXnwYyFI+Hh0P+w1uJkck1Kfm3E7Jbk7NbsnMg7Th9uPBMfBRPVddfy8hrT4puyUptyUt +uy0ltzkprzEltbG2sX1qdn54eKqxpTsj905R9f3uZ8OgzO189Dw141Zyegs4W3JOc1p2a0Ja +Y25R0/OhCQA3dx4+yym6m5x9OzWnCZwqLbc5JrlJz0j87RHzrXuon+9lbFW5tkVF/887CCeu +GsUsAA+QkeD254Vfi3ApilQrIKVCsQ+DB9guTx1IYzhQuOJQKMPl5+fqfjoof4m1gYerf44o +tjYlpyU1uxle5hW33n3QPzE7/2JkLLe4GZgrKfd2cm5Les6d5LzGpKzG9IzG9ke9gDKePh0p +r36QnttW09w1MjVT3/QgMfVWSmYreGvJwJ45zalZrfFpdVV17RMz8y8mZ2619qTntcqs3ZgK +rJ13O1xUeVEr+IsfDbeqUD9XMdiyh/H3g5QAf+esOO9N4lyq0B0gX8MiY0CQul4BPOQFnATJ +CXB6hV4G+eayRcFDAU4QWoC3I43V8CGLdmEg/wI4W8pPm4sw9vLgocDhiz74ysFjGUZSgsem +Ag+gCsXvUuAB8p58A4V8Pi+91blw0kbk5DBpILowzdsaO7aUDA2P5+TfMrEMu932qOPhM5ao +HEORXNISvtbvFCCHbJiq2z/30L78Xu+b7brmNpz2+6uO37gq8DglCyB2UZtzWsN/xxm7A5c9 +T6MCv/7XuUOX3I5q+J7ChwPwuADAQxMCj7OY1YHH9v201YJHZ9dz3evxaAIXpcfR0AtXJ4aj +iVygegZCJ7/UkpqHdzqeefllXdUKUyOwrxL4akS2ml6Ad0DGna7+klsdzt5pJKYAo8fVovDM +7aLi0mrvdw/EJFVpkdlXdcM0SKzL2sFMM0nZrfttD57xRGVMk0gckYsigKuwMAQ2UBQpTJUS +/u1Rs627DD7fbfCJiv4nO4h/30e4dt02WeLe2lC0aFeLfMsDXNzBzbzyRa5CxlNo9F4GPOQP +RNKDjdvRfvKXWBt4OAfkA2tr6LE1COFXieEaBBaGxKOaiIMFhU33ntXc6rpuHn1FK/QqkXuV +wLtCDMOTg6MSqu/3vUjKbrxhF6tD5WF0uUSmQBhTdvdhv29Ihrp2KGRqIkudFH5ZK9jZJ7X1 +wdOqhkfgrZGYYiyR88raLLQeC0UJP6Md8MVew627DD/bw/xkFwmlZSpmuaVHuPR1b4oAYgoZ +QL6G1bSKhOtuhAcUwAPkFvnJYeULN/irDexFHEWQnj5wKgQJFMBD3r1T4aLysU+XKkXl8Rvh +nKDIMuScKwEPOP0yDw4eRAkeSvBYLXgo0PKi4IGMn1pht8hKoOK9gcfLFvvBsbr6Dp4oa+DF +WG3DA7eAvKsE0WUd0VJ+pxha1Cl13237DL7cpvvl9zoEmldl9Rqnr10DeFzQYoP1g5c9jmv4 +nwIrF52OqXp/+/2lb/donrjqe16TfVGL+3bBYykB4KF3LVWTIoVia1P5KJoIQ5ECRZHEV/XY +enRRQkrD05FJX3auBpGDpYlRRE4AK//Z0FRc8i0ijaehx0FBAzaFWLIEpcfHEoKcfVMe9U9k +FbVp0vgYMs/AIqLtwfO61scmN6UobS6KJEBT+WgaWEqgIB5QFAuBOpn77THTT1Tof95J37pD +75iaoZO7S5TII5bnfLthcR8P+c86+Y9N+f6URVs84C7sZQyyFHiAlc7Hz+UTKAAGcubXDact +wkPWFsmsLcRQJcDaGkSBuh7byCymtuFRe8+gsU20BpEPxZmncNLzbvc9n/QLzsYDMiRxgPWw +4FgiIIowYWzV06HpUEEhhsTBUYRg6RaY8WRoKjGrnsjgobT5KDIfQwPWFsqszcNT+Xi68KxW +0H/vY366h/HnHZT9F5kSoVcU1ylF4vq0b7N0tSwFHv7SUvBm5VsP5PcivpRLzTkLz2i/A+OP +bAGHIOHT4S4VBfBA+vLg9hP5i0Zm1st/0CEdi0uBB9LdI9+CsRLwQB5kqQcHt7dvMefS+Z87 +pSjBQwkeCFqADKPAEouCB8g8yMalQsqsc/B42XHQ2dfQ1Dkp84isrO20dEq7rCO4SpDIR/yA +nEhp0YcvOH+1TQ/oFYxdWmblm1x0beABeAPqW9HmAv7Zdc4B7Nq5n/jXf50/ftV33wX7oxp+ +J6/6vB/wIBgn46DoUmI8VYKjSDQpQqA4mghFF2NIAh0COzW7rvvZhKF1lDqJY24b3ftiMiGn +GRotS+RpQrE0oUnfZCGqIrAU0VXdcGe/tP6RaXOnJG2GqKjqwd2uF7TrInU9LhT8CoozJsLQ +RWjANjLa0aJJ1IniL49YfvwD4fsTZMZ1Kz7fJ1rkHMm2ys8SDL54shAJkPIcrMj70sM1PpwG +LkWRorX/xShy+PLssSh4wFcB4CF/CcSFD7n0inw8/ApwsllUAH4Ag+PJYk0qFH4NDYyjx2Ma +8Vvv91be6sbp89AkTigvf2By3iMkR12HjaPwNaFQ8xKgWKoUmFqDGBadUtc3OGXhFK9O5Bta +xjzsG8ssvI0lslBEAYYuRlPFwNTA5iDbo+CoZTTpGTx76x7DLTt1D16hBwS6RbAtEyK9H3bc +mp6e+nALavAfXOHEH0v5eMy/8guS9z5V6HGQf62wS8bCwu04OVxh6BPcOoc4HiscBTcygDyp +0MG3cFzA8uAB50bYoxW5gRWCB7j6Mg8+LxvVsrC/CR75Iv9VizT6KcFjk4NHaEyFQu2/KHgg +kLDC4SfrFjxg6e55/qj7ObyemddKMYnRIEkx1Ch4Otcr2pwfT1h9/YPe4TPX+eLssbGJNy/0 +VgQe4iIF8IADiJ286nsGG3JM1VPlvPORqz6nNAL+8vWRv31/CWx/D+DR8aBfxzBWFgxTgJNN +oSJrheDjaAI0XYzSF2qQBQZmwu6+keiUejSRlZDe1NU7TDGLUCODb3YpqAo14SCcVKhOBPgB +fV9TONmFrayIipueqc+Gp/1DM9UJLCwd4g2whCcv0wRf7jRQOUKEo6bH33bU+BLWyMfbJUHk +HsWxiRV6NFTlTk3Jj7WZl2/llu8NhItNZFyh/MgXJH1VUxfsH4IUyEv5Hcknk/9ABlfZjvZb +9BJw+Y8MtFkePBy9c8BTv7I2MAXU7IMFRqOLgLXViRyvwLTBkRk771Q9fWHLvf6iqnZ1Ck+D +CtGdbIo9OOQpNPWbBpVPuS7q6BpIzW1RI7GF8TV9z8YMbghRZB5ibdklwNvhQxelg2tJTmOC +vj9MJdDMOaEeMTz7kuyYgWePN0+RruBaLF/DDo9OwKUWkrUUuiTkd8Efa8jIa+SESH8NUlPD +4AFfdCF4ILlUfugKSHzNKwX5CYjoteAx/6q7XD5jrxA8YGhZ6sGB2IZkK4QLgwlHob5Y+QBG +JXhsbPAA32jIunxb31LgIf+PkA8UqZCjkPTyowyWSvP+wQPIyMjYw67+vieQj6goovTweber +uoKrBOHBc45/30X+apueJtGt98nbmRtxheAhjig+jw0/hQo4qR54UZsnBx4+FzVZRy97bDth +dUzW87L/jMX3+0lQHA80FEDsnYJH39Ph69ZJV/VY4AMZC5GDCEWHFCub2BRUXiiaFEfml9d0 +Nt19SjJgt91/XlF9F0dk4SmRmtSIl/ORQbHQwQc13PQhUSeyA1g5ablNoqiKZ0PTBuZCDEUI +8QY0cxn/1dwuUIULxfAki4jMQOubTiKuRyzfLoJlm53Ke7LKeUPgpo+l/g5vK1MtdYlVBaIM +F5aqE9gYugQHwYMITROjYWuDdWBtqkTfJOLJ87HIxJrrltLRyXkWPwetx9OiRkLmhQwokGGb +RNY1JsGQw/NL7tx/PEA2YNc2ddc1PcZRwmSNVwBOBD+3NtS9haPyaYberq7OUUL3aO7NzEQW +NNJoM4m8C8TCGlZheOnCLglk4DZ8HnnnUrgMvGDAX5gYCT++EDzglpOFpPrFWRfEK2mZ0azy +dwufSr4JQt4DBC6N5Rte5P8ayz9499NBJEoqogsLdgV8UoLHpgWP+VfDyZEOl4XgIe8TIp+X +FAa5KMDzokNaFk3zi4AHLM8Hhnt6Bzw9Ig+fdj5+3vmHfYZffq/75ffa18xDn/a/eFtXqaur +A/+j1/6JevtemNnGAszQYQp/PGV5DArcAcCDc0LNCwogdtkD/LyozTmm6nEKE3JJh/9+wAPI +495BG+cYtC4LSxJjKCI0VQopBfCGBEfhYWhsDRI3mFeRnHdPh8lLKbgXLizBEFg4igAPJRah +KBI05BYClkI0hYemiFAk4Q3HlHBxhV9ocWr+PV0DCYoqwlAEGCofTRGAdVC9oihiHJmrTQ0z +swllh/nEC1wj2Y6xYt+mxrKpqfENXKSAz2oHt3iULhdLFmOoQjRZiqJC0wHjoRYkDprKwdOF +KTl3g/hldDNpWUOPhUMshsjFUwRYYFiq+JW1xWgKH1qS+AG88oyie2SmMDbtNltSjYZj0b+0 +thAFxWYHh4hwZDaBEebgEiTmeMXzXaQsx9QE9gu5nqzNIwr1o3z9Ozw6qYCXCuAKDgQFGkIR +8mO64UBh4P0iGACHFFMYkLLQYQNsWciu4JsRPuEyWLswaJ7C3SJ7EV8R+S0K/UHLP/gyT4T0 +s6zQwUMJHpsBPOQRAo60r7AXaWdTgASkZXsZqJAHYAUyXw/gAUuR6XFrdfUz56x+2EvTJruX +lDX/UncyMzNTVnm3+lY7ge62/5zLSY3gs3jWqas+rwKIhV3UYh9T9Tx0xesiHDJ9leDx/V5K +XNJaZlV7MTjGFeYTGSF69GCiPgsogRlKYIQSmSEERpAe2M4IIYOf+qEkg1ACM4QIaSiRAake +M1SPATbKlrKf0Hb9EBIDHAuWYGMI0SAMOiF0thA4mS4zxNg00M87QML3iuTYSzl22emivu6H +m6FUefZ82MUrXpsaoKcfSKKzAA8QZDaRWSwYmBoYkAQZMJRkCIwZTIRMB1kVNq8uvCKzOUn2 +UsCrIejL3oh+qMzOoT9ZG3ovIQSDEEurwLAg/yiBWwTbJkrgWlacOjo8uDlL9ZW7IihlxTg9 +ufLmDiV4bBLwQAatgC3wdD9LdbUs2qb3xVmXNbRmrB/w6LRXAa9PqHso0H29lDaFpa0YYqil +S8qBU9cPX3S9qMU5/rIBBBpFe1GT9TJkugw8fjxmsRLq+Ho7YfdhRuwS4MHhcLy8vBbb81N8 +qc6HfZERQgk3BFJemJgXLuGFSrihEl6ImBsi4gSLueFCTpiIGy7bBRKEvVoBW8IkYJ0PbwyT +gDQccGCoiBsm4oRCybhhr5ZAofPHSkLTYvxSYzwKsvjdj1o2W9lSV98ijRSIOcHASi+NxoNM +DRmNEwIZjRsu4AADvrIwV2bhl9YOf3UIsHOYmA2ZWswNFQJr/5QsTLYEJw+R8sMSIoJTY3zS +Yr0qS+KHh7o3ecH+5jPyKEVeiHaxqwpPrQSPzQAe83IdLvKNFfKNG8uMatkY4HHPcMtoW+H6 +eU3Pnw/3Pn1hYOJ/+KLHcXV/WeTSl+BxQRZAbFXg8c12ohrO4c69R/eWiEOyVBwPRVvdqy5I +FwAtyhAWZgiLM0XFmYLiLGERpCLZT3FRpghal2khWM8QylS2IvtZnA1tL5YdDlKCXdCBsvTR +0mA3d2cHF3s3N8fkWHZOKq+6LGV4qH9zFi89j2+X5kQUAmtnCovShWEhXi6udk6u9h5eTnnp +AsjUWeLCV6aDrA1bOB1aFsJmzxZBx2YCU0PWlr0OcfFPh0DrcMqCDCGwdltjydTk+LxSlPKL +CvgOAiVST0+P0hQbGzzmFzhmyO+FA+ciXSoKXZBK8Hh30vGg39Ej2cAs9OB5lzOYsEs6vNWC +x9c/EL7ZQTqnZtn1eDkXxxWCx3sQQLn/ttsSZIzPTzl3vhp8pBRvUfFHh2yBWT46ZKecXny1 +sn///l27dh1YVhZWc3D1t7zU1Sl2H6Slpb32KJBGETJ7eg6sQJycnBb+c18rTCZzoU3U1dVf +e+DCo8ANvPaotVly4aMpZTOAB9LJsuhepNED3mXikwZH7AfY8KfDdqsCD3jiRfnum4UzOSrB +Q15yixqPXfZWJ7D2nbGHXD5eRS6FJ4lbCjy+/kHvmx3kPYeZgWFJg0Ojy19i/YDH+OT0F2dd +4bzxt/NuA0PKD/D5pMKWT487AoP87oCtCydfaZDVip2d3TuqLpXgoQQPJXi8CXjM/zwu+mvn +alnziJX3M0ncRgKPqanZ+OSa5MzqqzjbgxfcT2gEX5BFLl0aPHS/2UH6dgeBynS737Gi5sr1 +Ax7QG+l+/tfzbnDe+LuqV2//0GYuZIKiyv942B6Y4jc/WmNuSJSlrlKUogSPjQQesO/xamen +/dNhO0AO8kFslOChQPsrieOxEhFFlahpBzMthLuPmpxUgyKXLgSPr7cTv9lOxOm5Fpc1Xbhw +YdGPnXUOHjB7bDnh+HIqwzMut9o2qbujVWAG3KL42x+tLxkJlEWuUpSilA8RPOblRm0v3NXz +dGiZvcjhyMxZQJvu9i51/kVnEJBPoDB4XAker5WOzidlVbcvaDicuup/Fht85OxPPh5w38qR +syaSqLypqZczpHt5ea3ETWu9gYdCu8fHR+yFKbWbqmwZn5w+o8/5/UFbuK1DSR1KUYpSPmjw +UMqHCx5Aimo7/u9xp9MaPhc12cfOO0Pg8YMuQI4f9tFcvSP7nymGXwCX/te//tXV1fVhgQfM +Hn9X9fr33RawU6XqNeEmcfkob3z4xVlX2Mn2dwdslT0sSlGKUpTgoQSPXxA8wLewKze/7Fan +KLLsKt5333Hrr7fr0Y0Dmlo6lzqkp6dHR0fngwMPIIA0DhPCfrPXClTBoCL+5JhDREb9xs6Q +/KSaj2QNHUD/fNRB6U2qFKUoRQkeSvD4ZcHjZ/XywKhfUGpBUcNrU6alpamrqy81R+e6BQ9Y +mG5JHx2yg+vi3x+w2Y7236heHwCrfrffBqasz085lzc+VP5DlaIUpSjBQwkevzh4+IqL1xDj +QiKR7Nq16/bt2x8ceMzL4uv+8bA93PQB9A8HbfGWEcjMFxtAEvKb/3reDWCV7Ok2Ub/Se5CK +igprmSwMhglPpfRaURg2C86zkqMW/uvBltceBUqMhY/g5eW1/FGLRh4Gp3rt5RZ+jKzkJhca +c22WlH09Dbz2qLi4uIVP944sueiLAzewkqdTMObaLKkEDyV4rEPwgEPcq5uK13Ds06dP/fz8 +QFZPS0ubnp7+gMADyPTMbFpJ2zWvlP8+7fIfKlb/Z6f5F2dczP0zJGm3uvpefHAZDzxOdcsj +d14hziLio0O2v1ax+tUuC7CkOsXfe9iv/GO+Rdm/fz+TyVSCxyYHj7a2xxevOFtZuSrBQylK +8Hif4CFfjsmPdgGlQVlZ2Qf01oAR/nHFC+AH3ADy0UHbz085r60h6P3LrbZuHeuo/9pv89u9 +1vD9/8deqz8ctLvhn65s5XhH4KGc+EMpYWEZO3cageV6vkk4RNu6Ao+gyDI4yCdYsuIq5Qvh +pSYjXpv0PB0ClzioFwJU9ZpQPkbHexNwA19f8ngPAdU3J3gAAaTx5ZdfviPnk/cjdqE5/7XP +BgkI82sVK/BTlFr3oGdgYnJ6YfqR8anyukep2fdSc9oSs9sSM+8mZLXGZTTFpjVFJzdGJTdG +JDZIExrEcbdEsbeEMbcEUXW8yBquuIYtqWaJK8IEVSGCiiBeWTC7PIhVEhBe7Bda6BNS6BVc +5BlQ5Oaf7+qb6+KV7+iRa+eZ7uSdHJlQMzj8E0gMjkw4hOd+fMThD698R6EAHf8/e2cBHsXx +BfAKhbb8WygtlBYpVShWvLhTnAaJO8Tvklw8uYu768Xd3d2Iu7s7cU8IIcH+cxm63V6EEEJy +gX3f+/bbzM7OSm53fvvmzXsnlQGBYMiBgQcmGHgA4eLiAv0F7YAH7G5gZmHAA+vPqSH52kDv +PIekJ6BBEZ3gyeXgEDACGJLOfsECfMmYRCLHArQDs+Vi4EElHT1Dp+5Zz0tci/7+/qUerLix +rQ8w2JfHAXIogx/tikOkB9MMuww8fJ6Q1egeXOHiD7TE3q/Mwbvc1rPEyr3QwqWI7FBgal9o +ZJunb5Ota5WpbZ6hQU5XN05TMU5V0ktR0E8i6cQRtRJkNBKkVKMllWLE5aNFiZE42QhBqXA+ +yVBesTBukSAOoQAWPl9WIf+74iGCsiGixCBLp6zmjn+J4oKALYIcayesNIauyaNTMRImGHhg +goHHooMHvZQb0inD6OVIkvrJ4DE5h+xkAfUvCtpNtnVA6kDnT6GypUwZ72vKI84mMhh6R8g5 +M1SersHZXO87Ax7zLrKysnR0dNNNeFkSAvpu59C8g6zkVSeUKxu6qLYOP3ycmlvr6JNr4ZZl +5ZFh5ZZh5ZJt5pRJdkg1tcswts40tEzXN0/VMUvWME1WN7mvYhSnpB+joBtN0omU1YqUUY+U +Vo2UUooQVwwnEENF5QJFZAJwUoGCEn68BN97wj5cwt6cOG8WPg9GHhd2vLugbKCwfJgwKVRY +LlhQIlhKMTAkqvDpM8qZnOW1Abzx9WnVe0q+7204Vgw8MFlE8DCziHRwcDh7/iL05RgdpS1L +I02BB+QBBC0AeFwSskfwAA0eoGsGW2EPDskkr+IBYrWA7YB1GPx8/Tk1qo5exiQSNMWvFjDl +aUArBJInDjZ+kNUMHAgeERpkXqCCqyOFsAS0DE8MnCdiUQEK2iF7pSPR2mFMVOSSQWV4CHSD +yHVNPjpNgQdMGjXZpepNBPRZ8/uZHBgYuGfPnvk9yUWRjp6hvsFH6JK6pv7gqFI733Q73wIb +7yIbrzwrzxwrt3wLl2yyc4aZQ6aJXa6hVYaeZYqeRaI2GbBHkppRoopBvKJenLxOrJxWtIxW +lAwFPCLFlEJFiWGisqE42UAh6UB+CX9eMd97or5ceC8OIS8OnKeIfIisRrSsZpSsZoSMZoSU +ejj4U0o1lpHH0tEt8NmzcWWr2ODEMqwLwMADk8UCj11/0IGe/Zdtuz6YEB4BYQw8phOYmB4J +Yw5623vKfhAwAEugwQMWAkKAkAARAmZ/A43Afh/040m59aC/3kVvRDVAA20p8ECImwdQsAsC +LWAr2AQbhIlXoPMJkuEFJroFxwJb4RGRk4SnBNZBg2AJKsDzBM2m5DdAfoD+KlQXBddBOVwH +K0jOF6qj0xp4TJbZZHicHOccyXp54NDRj7744fufds4y8SXAiVcey9HREbyZDx8+PKVH/VKF +kO4hF690Re1wolYkSSeColrRRIpGAjaQVAoVUw6WUQsXk/eXUA4RUwZ/BhIUgsTkQ0RJwaKk +IFFisIhsMF42UFAugF/C966oO4+U911h93t4j7ti3twE77sEL25RL268Jxfekx3ngScFaZql +qBvGq+jHqhjEqRrHqZjFCauHXGAj//SnMI4gl58d/OjRIPb+x8ADk0UEj40bj0LkWPnFKrC8 +wy6Igcd0AnthNHgIagZCrw/Yj8N+GfTmVBYDaOiA2d+Qbh1pc/JQCxo80CnhENgAuALKoWEE +ksPP13XgvshACagDtoI6oAJch+ldqGwpkC4gmcAd0UMtyEVBwECGmeBVg8apyl85TEM74AF/ +Wq8UqlclHLJ5pUwmh4SEhFfupaSkBGqOjo6CcxMQEKA18+McJCaxnKTuz8RryyzgxCzoxirg +zibgyC7gyCboyibgzsrvqqofoaQfyY1zMba6zy/uwSLkzirkyiHkzC7kwiHkyk5Zf7lkFXQW +l/c1tku8J+airBemYxTJiXNlx7lz4P9RIbD0uEvwIGpG6lqk6Vql6ttkalikcUo4/3GZuPFP +3MY/BSXkVOOCTbs6mrD3PwYemCyKmJkFA/C4fEMcwAZ46XlGF4GlsJQyBh6vBR4v/hkZQQwC +sC+GvAEV6eghAEBbwQzgAW0jcBiFCkXgOSAtAwUoggYPaGxBdkHXhPYNtCMKwiEQb2YPHvBP +cDlU5cjRaR883lDma1bLdGJpaXn48OGl+6Ju7xly8U4HjMEi4MaG92THu3IBMMB5c+A8OCm0 +4MKGc7+Lc80rbk3ObRSWdG7vH1PUDmEXBptcOSlLD068OyfebUIpXMHCb+/gnto5+IRA9IpO +qi2r7uLFO02AhxtlF9A+zh3syA6OIuxGUAzQtkwhGcRcZDP88Shh45+iW44JbzwiKEFUTwox +68bAAwMPTBZJtLTcAXiw8+hzCsms/N8qCB46xtY0dZI0BR7Q2jAZPJBeHvbRyGgI1e5w7AP6 +QiBbpwQP2KmhnUsR8IDDPWgmgRgwGTwgvVBNSKECD6QyYo2ZDjzgRQGFuW5hOWQeDDzekhQU +FOzZs2fyqM2SEHWTSDa8G6ugOxsgDSEvLiFPCkgANsC5cQi5s+FdWXGOItKeD7pG/CMK+PAO +lfU9hlbxbDhPNgpITFgwJipz4jw4hCjcwiLkFJ1UXveg/x7exT2gsHNwVFTWjUXQlVJfxHmC +PdwpiALax7mz41zZhJ33XSZtOITbdERs8zHxTUdENx3GSRBVEsMAeGAh0N8j8Jg5zTcmCywy +MuYAPPhELC/cYNm45Vcjx1DQxfuFxGDgMZ3AMRR0r42AB4IKcCvs9CFgQKdNdM8Oe20ID2DH +9efUJlMK1XRaZKiFypQBG5wSPBDHUSQSyGTwgBYYuAvingELkaEipD407MAGEdh4b8GjsKoN +XDheO/itHqW/v//SpUtwCGZpibRyyF2CHwfOk2KywLlx4YG6cFKgwoMV58GG92Tlt3Pyyuge +GidpBbDyOboHZAdGl7LwOrPjXTiEQQVoyvBkx3lx4j2Y+Z1k1QLbe8d8g3PZeJ1J6sHt/Y+9 +g3JZeO0mkMOFS9iDHe8JcIWdgiuuXDiPm7zWv56U2HRUZONxkY1HRSngcQQvQVJKDDfr7sTA +gybAA7qmUyl8WaEn9E1XebqayEcT+uUJ16fz2MdkwQSH0wHgISrrsnv/sZ37jyno2YMuvqSi +FgOPGQR24ogBJD6rFm0PQQcQg06kyHMBXSkQ+wPs0+G6gnk0lQUDCvQFBS1Ajw70JFbQJigE +7cMpJIBqjNxS0KeBbgGcMGgfntjkKGdgE2gHlsMdwV6gELQPCqnqU10UPDSogPyJPvq7DR4L +KQA8Tp8+vbRm2sqpBd8l+LLjfNhxHhz/DIhwCHuy4j0ZBdwZ79rpm0Z0Dj4Jiixkwzmy4N2F +ZF2LqzsFCS6M/M6sOE82YQ9WERc2YTdWIU8mHgeclEdReWdZXbeorDurkBuboINnYPbA8FMj +y1hWHms2gYlxHGEXduGXwzqAcG7z2v16WmrTMZHNxwmbjhJeggdROQGzeNASeCABVSYreHGh +Z+jPUJmqJlhHTNCTa2L/iMUVJmY5AB4kzeCNW369cIMFJ6MJuvjhkUcYeMwg6ABimMyjYOAx +syQkJOzZs2cJBVSX1QjhFPVh5Hdl5HOh53dm4Hdm5AXrzgw8dryiLvZuyc2dw8HRZVyCNkw8 +9kwCLgz3LP1Cc1OyaglyHsx8dix8Toy8Lgw8juxCdir6gUVVncUVXWIKXvQ8Dky87gy8zsz8 +tn5hxc3dI87eGQJizqw89iw8Tiy8zkx8jkx8TuyCTrd5nX87I7vxqMiWo4TNx0Q3U4ZaKOCR +GIqBx+KIo6MjFTyjWQJxRUNsFOgoSejKr6yJuNLByoiD/UKGYcRkOrlyDQ/B45PlKziFZJjv +EVZ+sYrWTpLWwOMFKmQ6Ju8zeDS29R3hsCB7L9wvAXwtnj592tLScmlYPFTDREjB8lrBilrB +RO0gea1ABfVAFe1gB/e00oq2kdFn0feL5dV9iGq+Cpr+ChrBclrB2sYhnT0PG1sH7FwSlScK +jayS49Nrex6OVda06psEyyj7yWsHKmkGyWsES2sEyKt7Rcbm9Y08Ka3rcvbMUtWOUtQMVtAM +VNQKkFX1o+dz2npaatNR/KZjwpuQoRZo8cCGWmhD0OCBuGEMj4wh9gr0uC1SeeaaSPTFKUMh +zWNKC0zmJsdPcQHwEJf3AD27mKLhhRssv/2+CwMPTDDwmI0sgHPpZBkdHRUQEPD09KT9+yOh +6Gflkt4/+Lh/cLR38FE3WA6M9A0PP33x/MWLZ6OPH7f1DHb2P+oeGO0ZetQ9NNI5ONo+8HBg +IqnK+NMXPUOPewYfjTyhRBodf/Gkt6+vq7ePUnNwpK9/tH/gURdoc2Cos6d35PHYc0qdF32P +HnYPgfLhvoePCyu7OfAOW09KUwZZjoqhh1oSMfCgbfB48Y8r2ivBY8qa6DYx0zQNyt79dwB4 +CIrbUiazWPnt3n/s6KkLS/FCMPDAwOM9AQ8ooqKiFRNCy/eHoBhg75Mzqfjp02dPxp6Ojz97 +NtVOz549fzE+Pvbs+VOk5OnTsfEnYzMc6Omz50+ePn3y4glYRQqbO0a4cE5bTwDwENl0THTz +McLmI6KbD2M+HksDPKAf+2zAY8qaaIdSbD7LAkhCQsLRk+fNnV/al9raeo2Mgsemieq89ffL +ADxus6oC8LD1S1733eY7TOyTq4FGMjIq0SVPnj2nvCDeRfCAE68Qfaunza8WAGNrzG13GJUd +bUsEJfC059zmdAKHR9GjqHO4sTNncsHAY/bS3t5+eEICAwNp9v6IKwZYumb1Dj/pHx7rHRrr +HRzvGxwfHB4Dbw/w7hh9/KSzd6i7/2Hv8GjPw8cDQ+MDQ6O9/Y96BoaeTjDJ46eUHUfGx0Hl +J89f9PaPdveO9g+O9Q2OTRhDRvsHxnr6R7t6hh89piRgGX3xrP/hWPfgeO/Q44GHYyWVfVx4 +l62npTcdE9x8XGTzMYkfjopsPCJIIColhJl3d7RgnQXNggecvQIL0V73k8FjuppoHw84k2Xe +X4mYQOnv79/35wkY/3DVmnVlNRSkDwvLBmiRlzfFRBXw+G/ceBRsPf0XHuziHlX4yfIVciTF +yTVVVb2kpBz+/e/n5fOJyAFVUFSikaQS8wgeaG8lKrSegwyPjFn6ZEyX2hUdnnTOzyzaVwoZ +7pzZgQr0mFNOopmBOuBo6Zt4toAjIjFA3iXwYCV6LtbzDoSOjo5AINDm/ZFRCxYmBZDUQ0ka +wST1QKJmIEkjUEUnxM49Nb+8tW9kLC6pRFk9RFo1WFYrhKQeIasdqKIbVFTd3DM0nphaTbZO +UNSIMLKKi0+r6Bp8XF7bZmAWJqMUSFIPImoEkjSDZdVAs/6R9wv7Hj4pqe5w9MhU0QknaQTJ +awYqaAZLqQTS89sC8Nh8RHTLUbGNxyU2HRHaeOAuSV41IdQUCyBGg+Ax2WWU6j02g3Pp5Dfe +5Fkt4D32JlksMZks4CtCgCD35Vfrfvpt5y879m/+ZefJv249e/Z8BvAIiYiD4HH4xN2Pl30i +reMM8MPBwWFm8ACfWuu+20SJr/6/VfsOHV++fIWv3+JPi55f8IDWuXmxeEzOV/tWwQOZ5z5z +m68b1XzOUdAntzPDJPqlOKsFsEdHzyK/yoyMjCYnlKEJ8NAM5xLxZeFxZaLMNLG/w+8wMbHF +jZHXkUfMxcY5s6ntYXhcObuQPT2PEwOf6+27dk5eacU1nVrG4RxCjmAXZl4n1ntOXIJ2Krr+ +OaUPiqs6JBV97nDbMPE5MvDaM/FZ+0cUNXYPufik40U9WXgdmfkcmPgcmPmcWHgdmAXsb/HZ +bD0jufkIYdMRsfWH+Lce5+fgJ7rZG8Z463e1N2K9Bq2BB1rBu2LKOB6zrAkFpoGgqox5fcyj +POgaWrVm3ef/oyRbYeAm2Polf7J8hbGV03TgkZOTwyssvX79PrB1284rADxWfLZy1Zq12dnZ +M4MHgI3te4+JyhugE0wsemTFeQcPql8v6NzBzxUGJ4fdDTIzKyW/AV0HlkN7AqiMROWacpAC +ggfY69Q9K8QEAVPCwcaRZwSG8kCfDxxVmYz6yPkjAzFIshhII4gREn058IgwWW1OaQvcBOOE +UNUfHhmDJ0B1UaFJ5chpg0YaW/vQbaLfA+8SeNCI0OZMW1m1iHuEQE6cF8dEHA92vAc7zpOT +ElPUk0XQje2ek4FRROfQo8CYElZBR3YhV5ykW2ltt7isN+s9Bw6cG7sw3MWbXdCTmddGUNIl +r6ytsrGHQPRiF3TlEHT2Cs7vHn6iT45k4bFj4Xdjw7uzCruxCbuz4jw48W7cwp63eZx+PSP9 +3WGhTUf4z9ARlLR0vD0MfBxV74fbDvZ3YT+bhZeZ43igLRjobFZTWjxmrokIDGSExo95+YbC +BEpgYCAAgN/3Hr3FJgiQwzk0m5VfGqCIu0f8ZPAAryklJSUZGZnftu347vvtYMcVn35++jK9 +jIaFlpZWTU3NdODBxYv/Zv2m0IxGQSmNz//3JQy0/t3mXwaHR94x8IChtNApWZEs9tDADukC +9Kon71m9QIUShQMKECdmCR5gK52YC5K9BdSEs87hVthro3EIsZPMDB5IvhjQ3cMwqrAmFUjA +6Kbw0uDjDFAKifIHgQddHzSLzk8HrwtGcUfuCaijah2HbhOeG1Vu36UOHv1Do6o2cTQyOw96 +fRgZGaFLwOO8mBYP1VBuMR9KPHNKKFEvLkAdQm7cOBd2vBsLJcyXKyuPnaN7Qv/QU3ndEGZ+ +B8+A7KC4Mno+Z1CBUhnnRQmWjvNgF/Zix3sxCjhIKvu29o76hhUw8DvLaYV29o+7+WUy8tiy +4dzZRDzYhD05AKjgPdiEPDjw7lx4j1v3XH8+LrH7NL8AQd7Z3iDQU8/LXvV+hNPwQ0Adz7Fe +g9bAA74Z4FtiyjkpVD4eM9SkEvi5hFTGgiHMl4yOjq7fsPnCDeaE0v7te4/9umN/dF7H5l92 +MjBLUoEHpA60HCdYyFgFIn+qqalRectD8LB1dANIY+4eCyOra1r48klS8CO3uPptM9Ur40W/ +JR8PdKo1qhjjiNsGug4shPlcYH2qoRYY1RMJBIrsBft6pBq0ZsAnBT4jcwaPKZPGotfhUcBj +C+pDlvCJKaKKxjPZCgRTxlDldkETxSE2MrpNuAme0nSfJ5hz6ZsLgUBgYmKCMZpOnz4NnlPw +vC8aeKgEsb+0QriBlQl1Yxd2ncii4s4s4s6M8xCWdm/tGPaPKOQVcaqq7zOyjGPD+XAK+Uwk +hnPlwgEC8eDEA/DwZAVNCdpH3y9taB24K+rgEZTb2ftIVNaZDefKQcko5w5ansgFA+o7g/bZ +cZ4Mdy1vs8vo6GoFuOn5O6r5uWjmpUWNj41i/QUtgwfyUoJv4Ckjl76y5szv9rmFVsZkOnMr +nBXrGV0ECIFLWMHWL/mXrX+iwQNNHcrKynBli2SQUmQDgA2AHMhWtNcoAA8+fkPQppQqGTQO +YIOVXxriB9ne621f1wLH8Zjs40HliUH158/XdcA6uhDdvU5OjIJYVNBNocEDSZ6CBp43Bw+0 +5WFya+j0BxA80M8muj7AJCRLwpRJ5ZDbgm4TA48FE09Pz8OHD/Py8sJh0C1btoCvkkU5k+yC +RjW9UGYeOzYBD06cNzvegxXwg7Anu5AXp5AnB56S3I1LyDW3uC01txkn7dI5MK6iHcIt5MmF +82LDU1LLUbK0ICM1OE9mfkd7j8zOwSeSRPe45NqSqh5uEWdKfhacG4zHTjF3UHK7uLEKuvGK +OWhqm3rYGwW46ng6qESFOLQ0lWPdxJIAD3QEsCkjl85cE6bwpjo0ev4LBh7zKxzcvKvWrAvN +aBSVN4ADLnsPn9u3TwCCR2RkJMIV+vr6L9dUVJcR7gPweDERF1FLSwupg3wrAfD46Zdzl29z +Red1/Lpj/8GTlwF+fPnVOjY+sQW4qEUBD3QJFWnMYPF4JXhQyWTwgPsiLiILAB7wctDGCirz +y+SjI5NTqMAD/cWxi95o8pAKPKXpjKIYeMyXkMlktAuWgMCiRbYBvxNr+1h+EQcWXns2IUd2 +ATdWoIIu7ALO7IL2rIK2zIL2JM0wRe0wLpyjjkUcn5gLu6Aju6ATq6Azi6ALi4ALZUXIkUXA +kVXQiU3ASUTOV9c8jgfvJKceoqQdzo5zZhUC6sgq5MAq6MgysRenkB1R3sLaytzfVdfXQdXX +xSAv6/7jsRGsg1gq4PECFRYM/bKdOYAYUhM9ygwtzMgIOFRsau38Cvi02fTjr8iAy8/b998V +VVm3YS8ADzhgAUVXV9fc3PzlH9qGFItH+EuTSHt7u56eHlITeo0C8Ph+yx+AOs5dY/76203+ +iVU//b5/575jCxPKg9bAYwYfj8nggXZ+mD14QO8I+KSgbSOIt8Z04IFsBSszgAfSGnhOgSJH +BAoKXwkeEI2Q9LvIs4/28WAjeaHbRL8ipnvqMfCYFwEv9tWrV3/wX1mkARfK++Hp0+cFxQ16 +Jl6yiiaKShZKKpaKqpaKKpZKKhZQifJmRJKZkrKlDMlUQZlS4aW+rPbPUpWylJe3IMqZKilb +EBXIRHmygoq5kqrVy/rKFooqQM21tM29nE19XdQ9HdViI5xbmiuxroGWwWP9OTWoVJ8qKlax +sBy8WPzjStCVZ67Z2NYHPnzAn+j5LODPn6/rgPdSbGYN9o+Yd2lubj7w59Fr9Nw+cWVHzlw5 +e0Pgmw079x84LicnpzSjqKmpGRkZWVtb29raamhoIOUqGto//LyHjp3454m/Tl28qWcT+NvO +/QJ4sf6BBZpFuMDg4RNTBBRdArpmp5DcnoF/v5iqGrtACdkrHSyb2vqp6oAlWM8pbUF2hzUn +HwvZq7VzENkFPBegPjgHsIIUtnUPwiOCQmQveCB0kBC4CRZSbQUryHU1tvbB1mDj6MsB1IE+ +mcn3BH0m6HKwI9LI8Mjjnv6H6DbhQcGDL2EQNt2dX3LgMfr4SWJuHbgu2jmlJ0+egAf58OHD +VOwB/lz0UGP9/Z0PmqoeNJQ/aKx40FA5sZxYh9pQ2dJI0Qf/KiisoKz8u0SvVFDqN6DrU7QF +bmoobX9QPfKwH+sRaBw83qogARWx4KULY/fYsOXXE3/dTCjt3/jTrmtcVh8vW37x0lWEJQBX +GBoaqqioUJw6/vH0mFJEJGRXfLbyHB3nnmO3bzALmLvHLlu+Qk3HdCEvB8vV8m4Iv1rAzFHL +luJ02syS5v4hGnVWTEhIEBAQQBPIIjqaYoLJwoMHJvMuGRkZWlpaFy9enPJlkpaV98nyFUQd +u9vsQt9MTJgVVTBQek0hkeS/Wrth255jUrpu6zb97p9Y9fW3m67fZl3gK8XA4z2RJQcegDqW +HyTeU/Kl8fMMDAwED9Gnn366iI6mmGCCgcd00t7eXjAh7u7ujo6OKSkpyKasrCzCVAJqTq5j +YGDg+I+gG3lDgc6fADbAO+TAwT9FCJLCBElOTq4pKwsQiKvWrCMoUxLAbdl2UF7T9HXBQ1RU +9Ot132/6ecfv+y8cPse0fe+xH37dufAvLgw8MPCgTaFZ59IpBbydENMH1fx08GL5YBYCnsTJ +zb5yr9OnT0/eCyDQK3ec7lXwSoGziREBFzubvSZ/wXFycr5yr8kz/dE3k4mJCXuuMfCA0tTU +BNDC19cXQQJ7pTCSgA54QK5d+pvpJgfzLQ48p5QYj7yGONldJ8ZDN9ZTL9ZeI8iQaG9EdDAi +ORjLOxgrOJooOJoqOtlr+QeYJwVaJAdZJnsYR5qruZiruapK6RNF1IiiaiRRNRNV+0jnzCiX +rGjXLD1Fi9MTcu3KdYgo2traAE7Kyspmc+aysrLgx0xSVGtq7+/oGwWaU1j5ww9bpqw8ODyy +5ded33y78au1m4VFJcAD4oiSyMhI8KB5hkSflnXaI+3FYn5/i2QQnVEcVeBl8Aifv3QdPkSf +/29VXd0ixErCwAMDDww83lzAa2f16tVUE9aQx3zmbxB+MUWgBpZuk1MQvvL7BbxtXkz4FSMu +yu3dQ1uvKv18kSQpO9OOU5puQDnY6zqXwgVWeaBgBTby7SkiUFAC1qk+jiZHLppSJneIm/9S +gQ3OIJNxBbmZWyYEe67fW/AAnamhoSHo5a9evAGePrBk/JuNl0lUjlfbTiEUUAdQB5VwR9Vw +J7UIZ41IF80oV60oV+1oN50YBDw89eO8DOK8DeN9jO77Gt/3NUnwM03wN0sMICch4BFslRJs +nRJikxpqmxZmnx7ukB7hmBHhlImAR7Rbdox7dqxHTpRbpr2ht4ORj56SmZKUlpGadaJ/QVJA +YVJgIcAhSCNT5l/LyMj4448/1DT1IHgA3fzDD9P9KxMyixhZuWa4M5EVvR8QEj8QS7zjWAZW +tqhmTlnt/v37Nh4R1bV1i/Lvw8ADAw8MPOYFPObWD06ZION18xQj855eoAJOzsHlj2peJDJv +Cz0FbL5k/Tm1N2lwzjf8HRZRUVEaTCr05lJWVga+5clkMui7zcT9yBL+5pL+uiJOBA5FFQEz +XREHK9kga7lgG2KwDSnEVj50scAjzjM3zis33jvvvk/efd/8BL8CBDxCXBJMNW1U5XR4uQXB +T1dISAhcCxpC+PkFdA1NEfBgYmGH3xRzEMesdgp4EBK5PCrBcr1i+nQ1nz5btAjDGHhg4EGb +UtnQtfKIPJEc9Z6AB4zkj4TQnyHf38zg8WIiRs0cwlYjh4YTt2FAfgw8MFkUGRsbc3d3l5OT +A//oW1cYOW8J4JjllPnICHiYSwVYSAdYSgdayQTRPngkBxWlBBelhhSnhpakh5d624Uaa1r5 +OIRnRZdnxVS4WQX+/vsOiBw3bzMcOPgnJzfvdG4erxSlyAYEPFbLpYIVGvz/YuCBgQcmtAAe +VMF70QFkSmrbpzRfwPmMk8FjugOBdmZGl8nAg8SyowKPyaNCs79euBcGHphQCZLITF/AQ1/Q +k+eOmAyHjrGwt7GIj4mojynB11TM790Aj/SI0ozIssyocggeu3fuDY9JAtQBluu/+46RkXHr +tm0bNmyY220U8K2G4HHVpmSLaiZYaR8ao7X/dUVFxSunAWLggYEHJosCHjDJ4JQ5x2E1JEki +Ah4weDU6uQ86fyg6nTFaYAWqOL1UWyEnpOQ3oIdj0A1SHRemMECGjWD6IWQvDDwweTHhFBoc +HKyqqnrh7F+XL1xX4bbS4/eA4GEg5GWI83rnwUNRSouBkRWaO7Zv3+VhG+xhF6CmoHPzxm3w +I3/dsTOjxBZIHUDXkNJWSCWDlc0qGQ29S2/CHQYeGHgsvLxvQy0w6x9ieUDCUwMYCEksQ0ey +ffHPsAgcE0Fn8ppMMmhTBo+K33R0MfNgCnrrRUE72BqS4hmdKnE6goIeOxA5kB0x8Hhvpays +zNDQ8PL5a0BZr/MKMygqcVrq8Lrr8rm/V+CRElqw4ftNxZWNgDpUNXRZ6bnzEqrzE6sLkmoK +k2oyYoqLUuqKU+tK0upL0+u1tbXj4+OHh4enu6v9j568pA4xynKFZDJQuC4bVr/kfiQYeGDg +sfDy3jqXgk4ZHS8XqYZ069VN3VRZNtBYQgUecC8YXG545DH8c7p86LMBj/Xn1JBQdUgSMdjg +DOCBJGdEdsQsHu+tqLE7892U5rspQ2Q10+R21brrqn3PTZvH7T0ED5bbnIA3AHUA9vh9285o +vzQ0eBQm1yLgUZBcZUd2FcWJXzh/wcLCore3d/KNRdxKP5FIAstl4kmfSibDkj16uRh4YIKB +BwYeVJ0+TMQD+QHt0QGgAj20ATYhKYqQOmgfDzR4IIiCNDidZWOWFg/YIPr00DvOAB6T28fA +4z0R0EVGRkbKy8uzXxNSYXVSZXMC4KHO4azO6aLB5fI+g4eLecDePQdg+A52zntyYsq596um +A4/S9PrSjIayzIaitBpDLbMrl6/w8PDAdG+IMLmUQ8z4TikdrqyUTtmgnPHhhNFjyY22YOCB +gQcGHm8bPGB/TWUZgH+SPdPRFg+YWHk24IFYJGYJHq/08YCWCgw8aFNoLY5HWVmZtrb2+TN/ +MVziFqJTVGK2w8ADDR5H/zzp4RsMqCMuKWvbb9tz4ytnAx7lWY0V2U2Vuc2hPtEBHuHVBf+m +/Vo1MYflM6kUaPH4TjF9DTFtmUTSFzIp4E/LtFYMPDDBwGNmWSoh0+cXPBBUgMMZcL2texAN +HsguyFALlXPpdEMtja19cBOAOqrTQFxBQFPgHGAhWIGHmG6oBfHcgA1S0QUaZqi8QeCObwIe +jo6ORkZG2HNNm+ABkOPyuRvXzt/kvS5DZLBUYnJQZnZUYXHEwAMBDx1F04uXrkGf0r17DziY +eb8ueFTlNVfntwDwqCl8UFv0gEfeEtDF/2SSP5dOXqdAsXgA6viKmPqLRtbKCfCgsy+lnd8q +DFeIgQcGHrTJHjSbJO4tgQeaAUDvDPtuHhU/ZLQFVoP9OCiEoTbg1pmdS0G1g6xmM0QnQ0+T +QXSyvQI6l6KPizSIPivkhGELSFgz9I7zGxgEE9oBD/x1NYmbhgr0dooM9oqM9hh4UIFHYlDe +hu83Qp9SY7L1jcu3c+Iq3xA8uC0zAF18RIj/VcRlh8p96FO6SjaVzr7kD71csL5cMmn0yTMa ++a1icTww8MBkccGDahYq7MFh9w2noK4/p2bpk4GuBme7IF05jDj6yum0oJ2Z45KhJ94is2Ze +/DNPdvJ0WrCCbhAxy8Byqum0SFhUsISXg4HHOwMeY2NjkZGRIte15eisiTdtSLds5O/YYeAx +HXjwsOPEJYmAOpra+zds2BTpnfLm4LFdjQIe64ipy8QSV4jFgfWNMlFXLfNWSqeskEoGS1AS +WdGLgQcmGHjMIB09Q6fuWbuF5y+Js32rlv+27sEpy6ubumcfwgvUnK6dyTVfGRwMiV02JUoh +gzVTbsUexncJPIaHh93d3S+cuXTrPBvhuh4tg4eZvDsaPCR4FST4FCX5FFnucLLe4ZISUAIq +LaiEBg+yirO/ecL8goe/Q/RPP/0KfUp5+XBignLZsRVvCB6JaS+jle7VynKIrDmgnTVh/UhY +LhpjmdYaXNrztXwaKGF1rcDAAxMMPGaQpeVcigkm7xt49Pb22tjYAOS4c4GbcNVA9oYVoA6a +Ag99KUcVYWMBNnH6v1lOnz7Nys5VWNNZVNtVXNdVUt+la2Sua2ShZ2zhFxoXHJ1sbGGnb2Jp +YGJZ86C/9kF/XWt/fduAgBAe7Pg33U12Rm4FgpalpluwbfIbgsfp4+cdXX2gT+kfu/amhBW+ +OXjo+FHms2xVy1hHTP1EImm1LGUW7Ta1jAvGuZ9JJX8qmbxVM3uGhHEYeGCCgQcGHphgQuPg +oa2tDZCD8QKf2BVD6WuWMtetaA08rt+g4+DmJUgSyXbuIXGZ+dUdBdWdaPAore8ua+gpb+yp +aOoFWtncV9XcV93ShwaPhvaBxvbBvJKa6IQ0LV1DQZwwCyvbm4CHl034qdPnoU/p6dPnjTVs +smIq3hw8jutRuOIL6WQBp2LH6JqjE3+umJjbQvIpV/GvOG2U++GEScQtgibe/xh4YOCBgQcm +S04KCgoyMjKw+7Ao4CFxkXz3gqzYJWOpKxbSVy0WHTyMJdxl7mly3uEPjM1OK3mQXtqaUdqW +WdaWVd6WXdGeU9GeV9XxJuDR1DHY3DnY0jXU2j3c1jPc3jvc0fuws28kLSuPjxOnLmvgaR42 +S/CQECSlZhUC6nB09Tlz4gLM1fKG4FGa1wKQgxIaXTHtO/nUTYppa4mUebXr5VPprQr+J528 +TS1zHTH1q4nJtnu41AkEQlNTEwYemGDggYEHJq8lWByPhQeP9vZ2sQtm4n+ZAfCQvGQuedl8 +YcBDmkVv/ZqNU4KHIr8xMx3XpctXhMVlTW08olLLDCzdzvx1TV7daAHAo+FBV3h0vKa2LgMD +I+NtFgNlyyj3zJnBQ4hfHPEpDfdMnhfwcIuqAUTxlWwK4I3LpnkXTXLXyFFcSb+USflZJf0n +lYyrZnn7tLNg4SHdbCtz26tXrpLJ5LGxRUseh4EHBh60KaNjT3SdEgur2rD/HSYYeCwueJSV +lQkJCd0+y7ko4PHl56u3b9mnI+ikzmcHwcNU3EecU+XqxRt3GJiNrd3jc+qSi1pSilrcgxOj +08vXffvdZ5+vDIzJetvg0dU/0j3wqGfgUe/gaHxiipiEJN3NmyRx1RCnxCnBI8T5vqKKJgAP +cUkiLwceyU77huDBbFUAB1aumeUZBVWq+5Xv1aI4l34mmQzY44Z5vmlYjWFoNSAQGE29qLyj +srhOQ1VLX18fAw9MMPDABBMMPGgKPHp7e1VVVc+fvsR5VlrsvOnCg8efv59e/smn+nj3H9b/ +unXzbggeDt5RAngJW/fQxPzmxILmpMJmCB5fr133w0+/GNt4fP3N2h279y4kePQNjfYNj1bV +NWnr6hWWlE8JHn+duZqQmptTWPnjlp+TgvPnBTxK8pq/nBhnIXqW7tLIXCaeBHjjjEEOZTqt +Qpp9TO1hvewVkpSkLX+Z5h3Wo5SrBlZ2NPV2NPdlpeY/e7Y4kT0w8MDAg2bF1CO1sa0P6wcX +RpJy6+ml3KYLL4bd8PcQPCIjIwFyMJ4WEDlrSDhnuijg8cmy5Yzn+BnO8n780cfK9yxE5TRs +PKOCE4rPXLz+zdpv165br6JvBcBDTtVQl+xEVDNctfordh78yXOX1n77nbGN+wKDR//DxwMP +Hw+OjA2NjA0/GovzyYn2zIDgYaphf/jw8Y6+0YsXr2krmMAkcW8OHkaBFZSZs+KJezUzrcKq +6kvbsnOb6czz4ezaL2VSZL3Kais7C4rbtIOrPpeiIMpPKhkQPDpb+rpb+7vbBl5MRGLBwGOp +SH1Tn7ZZkqldelvHEAYe894Pvg+5WmhHYIzT6dK1YDec9gVwwgw5019LfMxjeFjwzKfwgqe1 +Rc6YiJ41WRTw0OR1BLwhw6n7v8+/PHr87F0hqU8//dzY3v+7DZv2HjhCUjfRJbvKqOjfE5IU +kpBftuwTnLjC9l17v/hylYiU0m/bdrByCwDwsHbx57gnICwugyPI8OPEbzGwBsekLQx4VFTX +6eroK0irKkvrXLhwpbii0cMniMAvi2SnfUPwyM1s2iCfulwiic++cJd65gaF1MM6Wd/Jp+7W +oIyqfEtMFXMr3aiYtl0985Bu9jfE1L8tC/brUCa8KAVUocGjpKBSV1vP1NSsqKgIAw/alNHR +8dLKTjf/Qnmd++x4X3a8Hzven1PEX9kg0Te0tLK2e2z8KQYeGHgsjFQ1dgFgOHnP6iCrGdBd +9EbQRhSaVE4v5XbqnhUACVB4T9mvsbUvPKXioqAdl6KPqnUc2PTzdZ1DbGSYjYVZ1gNUg9FN +QR238HzQDlgBSvZKA0tQH1Qrrm6/LuIEo6+D9lPyG963G/4+iNAJQ9wJQ/xJI+FTRiKnjRcR +PKSYdD9d8SkvTvyjjz4ydQw6dPT05i0/+0TnfLxsmaGNd0JeU2J+Mwu30KrVX+mQnZYtW7b3 +4JHzl//+8edfceKk33f8se/QUQAeylomASHRHX2jVQ0dh4+esHDwXjCLx8PR8ZHR8aqa+h9+ +2AKODs4BLyiBJIl7c/C4Z1dIiYUukXTbPN8xsrqupLW+tK2yuPWcUS60eACV9Sprqel6UNtV +Ud6hHVy1e8L94xOJpKqabgQ8etoHezsG66uaxAjigoKC7e3tb/s3RpWrpadvRNc8RUEnNjmj +4ck/cd1BV4WAx0C623v7PI6NPY1NqhVXjuAihLILB7AKeVMph3AAFyFEViMmKaP+6dNnNHXy +GHi8k/0gkogNBgsFN214ZAzeOiRqOsxmC+o4heTCcpjTjV8tAJ3hRcYkElYD66ARJOcLqOAe +UQAUHu6GqNMLVGB2DDzeJWlqajKQdqQd8BCiJ3744YeRmfVfr13PyiNCkNP8+OOPgxKL13+/ +8ceft4YmluiSXb5c9dWqr9ZwC4iBJR0D+w8//rJq9RpevBTAjluMHGjwAMrAxKaua7rA4MHD +y6draAqOXlzZiL83n+CxdmKiyjpi6h7NTDWfcrvw6jsWBWuJqRA8NiikGQRXXTTJW0tKZbcv +so+t43UuWUdK/WZisq1qUBUVePR1DvV3Dbk4ud2ku5mSkrIwP7mRR2Mh0RU4uRAOkUBOkSCg +aoYJBSUv5xR0ByrVSf/S6UF4Pj76fj6Sre2DSnrxnKLB4P5MRg6U+kzcvUAN48TCsnbaOX8s +ZPq71w9CNgC9P1WIcmTQBKayhQnaQDUIHlQpYhF4oBpqQcADIgdSQiJHwWaRbLkYeLwbUlBQ +cO70Ba7j8jQCHnqC7tyceAAeFm4RR09dWLf++5jshk0//MR6F+8RmvbVmm8++OCD5ctXfPbZ +54raZHo2ns9X/k9Z1/ybtd9+/c26mwwcu/YckFHShuDh6OrDK4CHUcoheywYeGRk5eza/QfE +nus3bsoSFOcLPMyDKN4dv6tmRCfV3yTnrZRO/lg8CRCITmBFalYzdC5trupIz3sg7FYK2GOF +JCWiqYBLqV5oNdi6UzNrSvDo7x4uyC0C7JGenv5Wf2/Pnj1PyWqU04jmEg1BelU2nA/4kw3n +a2qXUdfY+54/ktV13VIqUYA6wG2ZkTq8/717BHj30uuaaOLuYbNa3r1+EKLCZLPDlHlmJ4MH +wi0zgwdV2tz159TQbWLg8W5IfHz82dMXWI9LCh7TpxHw0OZ3tnQPX/vtd/sPn/SLL/xk+Qoe +vGx4WpVPdE58bqOhjfdHH30E2MPCJQjOagmOz9+85eeNm7fgJRTWfL0WkIlrQCwEj42bNksS +1S5evo6wh4ae6cKAB6COuKQscNCAkOgTJ09lpRVkRM4PeJyfmLryLTH1J+V0SbeSpPTGupJW +k5Cq6+Q8SjwxscRPJZOO6GYD/MC5libmtLTWdWcWtkl4lm9STF82EdS0sKJzSvAY6BlurGvp +6ewfHX1bdoaSig5N00QOkQBO0SDwtT6pA/XlIoTeFQtw8s7v6n74Hj6PbR1D9h65nCJ+HMKB +s0GO/9w9vC+3WOhdgr+zd35n9/DiXshSBI/CqrbRsScYeEwniMmCyuKBDJpQ1X9D8ICHI3ul +v7c3/F0VSpa3U5e5jioIHNWnHfAITasNS6/Vs/ICgKFqaC+nYXby3JXYnMa43EYAHpx8hE8+ +WQ42yaoYINNpOflEz1/+e9/BI/sPHbtKxwin05raengExeVXd5jbef2XPczeNnhYWdsxsbBD +cwcgkOycvPEnz7ISitIjSt4QPFJTG5ZLJH0kRgmTLulakpjWUFfcCn08TEOqTk0wCSW4h2SS +kGtpQk7Lg9ouAB6t9d1ZRW1EvwoYTd3ufsN04DHY+3Cob2S4f2R8fHx+f2zNrQOWTlkcwn4T +3+Yzfciz4/0BfgjJBAdFlj8cGXvnH8PnE8vunoeufoWCMsHchFB2vN/rUsd/7p5YGJ4YGhJd +sYh3b8mBB6AO0M0JagZi4DGDID4egArgqEp1UzckBKCWPhkIMwyPjM0GPKARA+3jgbZpgK2H +2MgvzYATB8LAg3ZEVFR0Dm6BhoaGF0/euHtEnf+IHu2AR0haDQSPiMy6M5foVq/5Jjq7ISa7 +AQGPrdt3f73222/WrT9x9hICHqnFD1R0zbfv2vv1N+tiMysnx/Ewt/+XPf6+Sa9navv2wONB +e+evv20trmwEx1LT1MMLi4yNPwXg8fTZ8ze3eIg7FwNyuGqSG5VUx+9QtFE+bYd6xmHdbMAh +18l5ZqFVEDzSc1tkvcp+UcnYppZx0zJ/l1bWJsV0YfeykAzKWIyUT8UrwWN44JGNjc28uJv2 +DTzyCCjikQgEOME26y51wnMyVFIlIiGt/gmNeU7OuwSGFYrKh7IJA+QImDNyTOF3qh7d2NKP +gcfsP+cx59JXfKtGFED2QBRyAnQcRUZbYPnM4BGaVI40AiBkSvBA3EVgm6DaYt1wR0dHIyMj +DDbQMoc4HuA2Xj1Bz/unNt9hPdoBDxyDnG98EQIewckV56/cRoNHcELx55+vvHSd/iYj5xdf +rkKDR0hCgYS8prmj33Qh0y0cvCF7AAUrNs4+bwk8hPDCgDegT+lvv23t6OyB4PFo9LGosHhK +aOGbgMdPSpQ093ZhVQA8hJ2KAXj8opK+VzOTCjxqytvJETU3LApWSif/ppb5lVzKJbN8y5i6 +pvqey+SCC6b5swIPK1smJqY3YY+2jqGo+9UipFBusVB2Yf85dKAv/U6NEvKLW2GbA+luPaGa +75jmFDxw8syUVo0Al8zA5zkv7AH9TqVUo6vqejDwwMBjvqS9e0jGJBLgBL2UG2LigJAA8AOU +gyUszyltAaiA1BkeGQN/ouEBTsKF9hNk6/B/zXR2AdnwWGAT1RAPJksOPO4eUuc5pM33py7t +gIc0m87Va38HJJUj4BGZWR+VVY8GD2kl/dVfrdExc7ZwDvpk+XJLlyAEPGaTJE5d15SBiQ3m +TJlgD995B4/UjOwDBw9B0wonN6+pmfnjsaeIxYNEkjfQMZkzeITHUZKz/E86+XfVjJ+U0gF4 +UA21XCe/DCC2lph6wzzfPKIGGWpxiKunsyxYR0o9bpALlrMBj4eDj2ysbRkYGAYGBl7fyjHq +GVTMLxXC9ep5GbPwnJzwOzWxTa8qKqvGf41Mtn03NIdvfWx0hoy8nYKai5FljLRaJCOfF7OA +17zgB6doELdoQGdhAgCAhdR6xT2VGHhgln9MMPD4R+4d0OY5qMN7SJemwIP7prCsqgF6qGUy +ePyx788PUELHwP5a4FFc16Wh9y97XLpCYY/5BY/jJ07CObxxSVm7d/8xOvYEDR75+fkszKzZ +CSVzAw9F9xLIFdo+5dUFLTWFD2qLHkDwiE1rvGtfBLPTAt2nnbVRIU3MvSwjvxWCR1tDT3tj +T1V1F50VJQaIc2LjbMBjZGjUgmzJxcX16NGj1/pNOntlCchEMfL7MgvMy8f7P36non4mwsKl +AmveJfCIEz+dL/JLCIldnKDNJ2ysrOVhaBl3l+DH9MbsAZiNRdDr7A3NdPxWwAALqRQ+xK+p +IXy3tHw88NrBS+JsCQQCExPTgh1ufPxpb/dwdVl7YWYDbWpBRkNJXnN/78PnzzEioDnwqKmp +ubtfmzbB49pfdHa+92cAD2uPiC++XLVu/Xe//LZ9284967/f+Olnn8Vl174WeJTUA/YwQ7OH +rYvffIGHu5fvlas3XvqU7vojMyuXCjyePXt+7dq1pJjMrLjSOYDHHbO8NbIp8h4lv6tmbJBP +FXYq9oqpkfcs/Vk5HaiCV1lOXgsEDzidFoDHJsW0HRqZ2sFV3smNHA7F60ipZ00oKWt3ambN +EjweDT/WUNcAL7rXmuqSX9JiSA5X1IkWkAqi5/VgFpyf73d2vB/ADzlhvSixy7USmxe4M31L +6sB1Fq6UKx4NUBYUENDQM/a1ckzglQi4dddtjqYPnA/HxNjW8YsK2/bdS+X+doFpqlp4bRXu +a2w67dKVJ0+e9nQP15S1ZyXVxAcWRbhlhztnhjum06yGOWZEuOckR5ZVFD3o7RkGL1vsn0gL +4EHJwHLyMtcBNRoED21el/PnLwSn1swAHheu3oKGDoAcn32+Eqx8+OGH94QkXhc8Suu7NfX/ +ZY8jx054B8W8OXh09Axs3vwD9Ck1MbdhZeN49PjJZPAAPbins392YskcwONHxTS8QxEMmS7j +VgLYY5l40lpiqohLcVZOc0NZW2N5OwIezdWdLTVdGfmt7HZFq2RTQE1AILqh1U0NvbphlCEb +56SmWYLHo4ePlZSUSSTS81l/TkTH5fPiDIkqTnqmwZpGsZwifnd4PFgE58X04cMjGXmb28HX +wWOBhw/eksb7/OdCWguSEiITJInWlvYx+uYJTPwed+65v9ato4RVx/neYLU4eEZq234e1gt0 +5YQfFoWpGpT2vrch4JaogEe8q2OwMLMxMawk0jMXwEaEc2aMW1ace1acRzYtazxYumdFuWSC +cwZnnhpdXlbQ0tU++PRdd02nZfAoKysD1MFxQJE2LR4q3FY36G7PAB5W7hErV36+fMVHO3Zv +3Xfw2KXr9EdPXQD4seLTz+Kza18XPMoaeuQU1XkF8DCgOmCP4KikNwQPgrgUSVENNvjrb1vr +G5unBA95eXlHa9eclOLXBY+AqOqPxRKVvUqvmuSulUu5Rc5zi6qpLXrgF1/HYk0JW/qXcS7i +XJpX+EAzsHKHeuYmxTRxj7KkvAdtDT2O8fV0VoXrSKkCrmUwktjswWOwf9jTw6ujo2OW7AE+ +l4pLGhTUnLgF9CTkbCzsY9UM4thw3gy8nm82WcMPgMfZG5q7D+PMbcLe4Yf6fmKhqWVQb99I +Vl4jSTPiNrcrPa/HLJDDl13Y7xaX3dG/SNsP8P2+n1dBRncRmWoJUUdjW98RDguyd8b7at94 +3t0+XFnUlp1QE+dTEO2WE++Rm+idBzTJJz/ROz/RZymo9z9Lr7w4j5xot9xY74L06MqqkvbH +j55gqLDA4DE2NsbBwcFwSOTuPi3aBA9FLvOZwWP/4RMfffTh6tUfbN68fNv2P77+Zt3HHy/7 +dv2GDz74gImTfw7gUd7YgxeTkZAmIewREp08Z/DIzi/auWs39CnlE8Rr6+qPjI5PCR7a2toW +JjY5KUVZsa8HHuf0swF4nNDLNvQvL8ltpvLxqC9tsw6vBuyBxPFgsyuKymhGnEuhj0dHU29V +TTefS+knEwE99CPrZgkeoyNjjx+NjY2O9/e/xvTMJ0+f1da1a+l7kq2DbRwi9clRkspht+66 +Mb7+xA3wFQ+og47D5vB5uW37eLYfuBcQkvpuP9etbX3hUTmpGRW9/SPhMaWipOCb3K7T3To2 +nC+HsD8Dj8upa6o7Dwls28977BwB3PZHjx5jb8jZyNJyLn1zefToUWFhUUlJWVZ6YbBvkqtt +tINZmL1RsJNxiKtZqLt5GFC3payUSyCHuZHDnE1CHIyC3W2jk+/nVlZUl5SU5uUVFBQUjjwa +mf3wMebNOwfwIJPJ146ycO/VolnwULtre/HSlenAg6huCgdZVq368OLFD46fOnSVjukOy71v +1n0LCj9etizkfsEcwKOiqZeKPUKjk2cPHuVVDfXNHRA8rl677ujqA31KDxw81NM/NB14wKEW +CnjElc0ePPwjKaaMHWoZX0onXzXJNQqooAIPq7Dq6+S8LyfCp4OaJw1y1pJSeRxLYORSNHh4 +JDft18k+bkhBlHXyaW2t/a8FHm1tbXMw3tbUtWvqe9wTMnTxuB8QViwoTfFemKXzJOxS79x1 +OnFZacdBfvAVz8Gnl5ZZ9u4Yt6ff9HDkcVFJQ1NLN1gffjjuFZjPI+Z7k9sNHfSVDefDIeLP +LOBx4ZbuH0fx2/bx7vqTV0HNub6xHXs3YuAxndTU1OBvy8vQ60jd0ZK4qUVk0acoqwFKDRdW +DV6pJDYjeXZjebB8fZVjNhCj05Rj0pWh15Zj0rt7RTSvIK+mugYDj7cEHoDtKIMse1VpGTyg +c6lHVO5k8PCKzP5y1Vcff7xs05afAWbs3fvB/gOrvtuwaeX/vti99xA96z1QuO/Q0bmBB1Bh +8f+yR0zyLMFDQBC/7ttvDYxMXT19Lv/jU3rs+MmIqFiYJG5K8AC9cHZyEQCP7Pjy2YPHOX1K +Unvb4MrK3GZD/3I42sJsVaAfUI6Ms5iGVFWVtG1USIMBxPIKW5X8Kn5RzQAq51vuk9zI61wK +nUtjclu7W/t3alLy1WqE1rwWePT29Lm4uMzhV/r48Xjc/QIHl8iW1v6a+i6yfTKbkOctbjeW +6f1O2SY8JJn43M7+rbX7sBD4it9/Aqdj5PO+Ddr2Dzxsbunp7KJMam7rGLJwSGER8AA8Bu4P +u7AfgJArjCb7TxK27efZtu8ev6hJXkE19lbEwGNmqa6ukWLQ0uG2NxJyNhR0MhRwUrxjqkRv +hqj8bRM5OoOFUdItI/Shp1RlBrLU39qiV5QlrqpJXVadrOJX1cSn2QR2kbyhqcpsAS5Ti8vG +FOcucFEmJze7umq2TwoGHq8FHsPDw+dOXmTaL8m1R5PGwYPtbz5NU+fJ4LFr76HPPl+5dccf +n3++8rsN31+8+JGh4TJVXc0bd9hA+YZNW+4wcwP2UNG1mBt4VDb38eMIRAVVGPJr3/6DyVnF +swEPb7/gnbt2c3Lzrlq1OqewEuzu6Opz9foNJDvtlOABqAOCx+yHWvwmzB0rJJLy0htgdtqo +xDp2m4LVMimfSSWvJaYIORUlZzRB51IEPKBzaUFxG96t9Cu51E/Ek35UTlcLqqqq6YZJ4pyT +mqDRo71tYPbgMTz0kJGRcc5JbEUJkgzM+MiYXMAOVTVduuT79DxTeU5OIAdgkkv0hnuPi/y+ +j+f3/fckiDbllU3v7WPe1T3Y1NwDIASss9y1uMFiwSLg+Te71Z9nZX7fz/v7fh4GDvWY+3nY ++/BNwIOV6LkkzvbN+0HwsS/LqqMv4KjNY6vDa2eEc1ZkMFViNIOqQG8sw6yhI2y5AKorYiXH +qUW8Y6DESEZOYLKqMJkLXSZJ3NAg0OsIMOsJUimTrsRtHYnbumCFapMAsy6BXpdwTUXrrq2J +qKsGlzVZ3BN/g5ibl1tThVk83gp4jI2NMewX4/pDg/bBQ5RJmYsXTwUefnGFq9d8veLTz7b8 +vPXzlSullfTbe+irm9a0dN4z9cr0iy1Y/dXX3363YfXX3/7viy/9ozPv5zbhtEMQ8Lgj6T4b +8Khq7rvNwGJCtgHwABDiyLETKdnFrwSP1o6+VatWwVCocILM5s0/1NQ3zwY8XiuOxzk9irmD +wzIfgIecawmMHibhWpyY2lBb9CAmpUHAsRjwxmGdbP3Ayg0T4BGd3mgQUnXaKHctKZXXqQQ6 +l/qnNjHaFq2SSZH8J2T6S6NHWO3swWPs8XhRYTEdHd3rRvaAwsXFBSixta23sbkbTndz9c0F +7MGKyt4y4UHqe53F/OBpSdCfAmXn0UlKK8aedCDtHf15IW4M7KZ/3dA5c0VlxyHK2NNfN2Td +vONHH49h9+cN2aOjZ2nExpwn8NDV43NUZiGrslsaCDmhwYN020AdZxxikxhslfC2Ncw22UjO +Vva27ivBQ/iKAvG65nFlu9WFFWtyy/7VvLLV2UW3+Axu4UxXZxWCP9FbV+WVnlCyk7ympsVt +q8tnR7pjYoRzFf6blJefW1Ndi4HH2wAPjl3qnLs1lgR46PC5Xjx/xc7vPpXF48CRU3/sPwxU +Skk/PrfxloSppc9+c69jApp+tsF5V4Ss9x4+8/1PO/cePEJ29MsobTsvYBeRXgPB44Kg/SzB +o7ql7w7jf9gjNbvklc6lx46/DBcG9/r1t63KqmrTgcej0ceB3uGvCx6J9ylTX5dLJMm6FP+q +nMZpXRAUW1Od3zLZudQzrvaOZcGHYokT0U1T6K0KXePrJzuXdjT3SflUAPzgci6V86+CRo+O +9oHZg8f42BMSkZSTkzNn8HhBcfx43lRbX5WZBNaDI4vp7zpSPEiF/djx/jc5bY9eIG4/AL7i +ea/eIvkHpTx58hR7zBGpEvjCg/MwP5PkmSuKJ/8SNyL7d3X3Y7flvZJ5AQ8ZForFQ1+Qoob/ +tXjI3zGSYVc3lXM0kXV422pGdJLn0Za7rf9K8MBfUZC9qXOPXf9vgjmdKEoJ5n+LkPGMujhm +vb9FzOj+u/VvUXOwi8QNdU0uG2NRFw1uazMxT/wNDDzeoiwh8IC5Wti5+WeIXEoyj2Umeifm +XdB2OCptLA/A4yyfraRRJJ24m5BWsIVfjlN4oaptgrV/jmtkEQCPg2xkEb1QUb0woK8Ej5oH +/VTskZZTMjN4SMuSJGVIEDyAAgjZtPmHXbv/mBI8HBwccYLCrwsejOQ8wAafSSbfNM2NS6iD +Qy2TwSMsqYHVpnAtMRXUBPUP62ZP51wKwKOzpa+2vkcvovaYYe7yiektmmG1rwUelRVV1tbW +z18/SuC/4DE+2qxztoBndWWo/cORp9fpDa4xmNzmsjt1VRV+xR+/QLC0CxscHMGe4sngAbRU +dq+5bWRmTgV2Q+ZF+odGVW3iFjH/6SKAB7OOgaCTmbi7KcHNCO+iSG+K7ugV6I2Jtw0XRkm3 +jZRnpA7E4iF3XfMU0XJtSu66hKx/NTF7bXz6bR69O/xGa2PTwJ/orWsTM0+SrCSvqQHwsJDy +MBRyspTyxl0nToAHNtQyz9Lb28u6S3lpgYe+gMftqyzKupbTgcdpXhu/+xUKFvpneNlP8fDs +YzHdP6EOofn7Wc0AeOC0Q4DidSg6B/ConcQe6bklM4BHSHj0/oOHQH26W/Trvv0WIIcQXnhK +59K29o6bdLfiwpMBdWRGzzZXS0hUFQCDj8UT18ilHNfN8o2qpgKPxLQGKbeSn5XTt6tlqPuV +5+S1THYuhZFLC8s6pgQPGGV9nXxaVWPf7MHjyfhTfT39hw8fvu7PMjAwUElJCax0ehBgB/rA +U7awuJGezfjyTf2j52S37efZc0RATce9+UHXm/z+HR0dT89CCgoK/vM2rqmZzV6RkZHUIyDt +7a/cS0tLa8oX2sxCIBAmg8fVX5Yd/mHlK/el2hGcwGyubnJaQFFR0de9ky8mIha+ci/wb5rh +TiYkJCzkOMt7lasFAQ9TMTcTUVcq8FBkMJW5oy3HpEtk0lsAlWXQId42eCV44K8oyNBpc3Ab +XJew+lvcEq03COaiDLp8rPrXxSyoNoESfraXFg9zSQ8DQUcMPN6eyMvL0x3kW3Lgocpjc+mv +Kx7hWVOCR3xu4w2Ci4ln5sjozy9efFDaYKvjnPLjVZ3U4gfn+G3TS1vP8dtllrVZ++dA8Hit +oRYIHuX1HX9dvubhGwzYIzWrcN+Bg7XNXRW1DxxcPCeDR1tn/5Vr15lZ2e2dXKrqmmB22imH +WmxsbB2sXLOSCinmjvjSWYLH2QnvDnaL/LLMBpugij/UM26a5dmFVuZmNmn7lv+pnbVRPk3A +sTgmtaG+tG1K59IHtV0xmS3sE8HSL5nlW8XUNTX0IkMtwVmtvR2DB/RywC4sDiWvBR5kM3JL +S8vzOaVG6E+yQ2Jrj7VXgZLGpm5z65gbjJrS8ral5Q1z/tlzcXHB9wMGHksdPD744APIqBh4 +LDx4kG4bKvLquRuEuOkFv2111w+xVnYXvaGsPAsfD4nratvJnqvySr7KLER0dXbRmsTMe7dU +TijarMoq+Cqr6N+tWUWr0vP+FjSUuo6Bx1sX8P48d/Ivtl2qSw489AU9Fe+SfbzTpwQPq4Cc +fcymCXlNV/AkeqnbN8XvSRpFAnUIzUeDB6AO64Bc79jSg2xkj+hiz+ji9JIHswSPutb+ioaO +i/+wR1xSlrK69o6du48eOzGbJHFTgkd5RZWYiCSgDgp4JBbPMjutsU8p4IEvpJITE2phyPTS +rEYmi7y1xNQPxRJ/UU7X9a9A+3hMBx7IUIuMT/mPKhlg32sWBejstEnFHSsmBmjC8tpmDx7Z +Wdm5ublzMHo8qs+mJPKYoI6eUE2kvLNrMDQip7au9U1++Qh4vPNDLfWkHe/2ZWLgsdjgoeum +H+KqF/y2FRzFStlN9O9XgwfuirzsLT1JNlNRLrIoJ5WayTOYSDObgJXJm+SYTcX/Y/HwEbom +l4uBx3wL+I64cYiLfaf6UgQPAyEvB/XgKcFjL7MpBA+P6NzMkt/zKtZXNRt6xpSwKfiyK/gC +8MBph1j555wXsMuuaL8p4SqiGyqiF8qt7D/7oRYYQKyy8V/2wItKqmrozRk8ysqrLl+6HOgV +TgGPxMKM6NLZgEd2Uu2PihSEkHEqhJFLPSOq9mtkXjXONfQvT0tvJLqX/DSRG07eszQzu2kG +8EjKfYB3K9ukmH5UP0cntDqntIPDsXiTUrqUb2V+ZTeMXCoz4WX6m3pmZ9fQLMHj6fjTtra2 +2QdRh/JksKNO+hfYdbZaMc/7Lx8DDww8MPCYl6EW6dtacow6coy6C6AyDNoT02lfMdQiek0Z +f0VB8pqa1BXVySp+XU1imk0S19VFr6lg4PG2RUhIiGGP+NIFD2MRb2Nhb3uf2MkWj9O8NgA8 +AH5IGqqf4WUffPhFdGbUj1d1LHyzAXhY+uXImEYdYDUD4KHtlAzjeHhGF78ueDS0D1Q1diLs +ERASPSV4/CWT8ErwuEl3y9zIOjOxMCuhMD2qJCOybDbgIWpXAEhgm3J6dGy1kG3BBlLqH+oZ +buFVVD4e0cn13LZFa4mppwxy9AIrqAKIaQZV7VDPhAHEsora0D4e+eWdADw2K6Uf0MsxiKqr +auj7VT0T7CjmVzV78Hj29Blgj2fPZhvOCzqUwn6zQXn/s0cDGHhg4EEj4PG+OZdWV9VI0Wvr +8ToaC7sa4VwMBJzlb5oq3DZDVPE2WeGW2WRVnG+daJOseIescPs/J0ClimB5y1SOznBuKn/L +RJ3Vmizmoc/naCHuI3hJNicvpxqL4/Fm9g10Bo3e3t6zp86z7VRZuuBhiPPSE3K5dYXxLr+w +T3QO2scDgscZXtvEgubj3KL0Urcj084fYDXRc0kB4OETVw7A46drOucF7JRt4t8EPBrbB++n +5uzYtftB1zAVeADegArejcj6lOCRcb8gITI9M6EgE1BHZEl6ROlswCMutgpONtmikAaQA4BH +THxNeVZjRXbTdLNaHKNq7lgUfCmdDJ1F92hlrSWlstsVRWc2TzmrBRlqic5v43YpWyefdsKY +Mn3mU8nk1PLu1wKP2f9Qu3xlYKdZI74RunYsUfDIq3hQ3dSNgce7BB5LS968H2yobyDyaagL +mmjgTIGq40xV+Axno8po5V0YNZhQyhFVeF/qHBpRFTDSFiWr40y0RMjS3MplFWVNjbMNSEgg +EJiYmLAfHlqo4nhYW1tfO8TBvkNtSYOHsbC3sYiPsoCZJE5BVJykZWznF5MLwcMxJF/GNBqA +h7ZzQkiSoLz5mcKqgwQDsortfQ37JOuA3PCJOB53Vfx1nJN1XZIljCLnAB6+QVG79+zl5cdJ +SJM4uHh4+YUAeFiGVAHG0PUqk5IlDT583Ds42t0/AvPIgHLbiNr2zt7QsAhjE7O02NyM+/kA +PAB1pEcVpkUUp4eXzgY8oqMqf5kYZFknlzLBHqkX9LNF7AvJAeU5aQ3TgQccaqktbdulQTFc +mIRVTfbxoAKP2vresJxW9dAaHteyvTrZH4snfSpJoZ3vFdOTyrpmAx6tD1olJCQGBl5tuBjv +e9BqzQZ7TI+/P39L1DF78DByS/n5ug5Y/vsQ3bMCOsujbL9lcIbXerqtBZWtZK90DDyWFni0 +dA7wqwd4RxW9J+Dx9OnTgYF+RDo6uhvrW8uL6wuzq7MSSzJiizJiChHNBBo7sXyVZqBWMlAr +GVPVnFxnPrQgI7ogPWZCY4syE0ry0ysqShra27v6B/r7gEwswLU/nRCMH+YLPG7/Icq8U+Hd +AA8TUR9Tgq+jRqihiuWNa3RMLBwxWbUJeU2J+c0APJIKm5OLWupawdvpg/Ena3MqC+YWMn06 +iwdVADHEygGkuLavZ+DR6Nh439AoAh5AL126rKWqlxydnREPqCM/OagoJbgoNaQ4NbRkluCx +VYlCHfRmucWpdQnxNTJOhd+RUmHO2c8kk/AORfeT6qcDj8by9sO6lIkw3gn1M4BHSGbLHu1s +2CbQTySSGO2L3VJbBnqGxfwozh6rZFNqHwzOxuIhJCSUlJQ0NDRTvMcngx2gl4TdZSTfLzCO +x+KCh7ZDwvKDRLBEswTQsfGneRUPhkfG2ruHLH0yqMwaSbn17hEFYCsaPEBNWI5UJpGjQAXY +DmIhmdwaBh40BR7vm4/H4MBgTET8/ZjkUL84O9NAM20fUw0vcw0vSy1vGx0fG913R620vcF1 +mev4+rlFp9zPjI9JigqNiwyLAQQyNDj0ApN5Ag/W31XZtqu9S+BhKuZnIRPgZRplZ+ge7BwP +FA0eKUUtfUOnwYtq8OGRtwcekCvSSzs6+0aQFyOQ9p5hNHgkRWWlx+WnA+qIz0+LLnhd8CA5 +FYJ+/xvZlPi4anSSuLDYalaLfDj+AnSrSrqKd2ledvNrgUdjXbdVTN1fZvkIcpwzzSfH1qNz +tXR2De2eYJI79iWzAQ9tLW1/f/+Ojo7pfpzPx0dbDK8gfaUANystg0dKfgMop5dyg3+CdRmT +lzNnAWmAP2E5Ah6AKJASsBXgByhcf04NrCPtg9bgjmDJrxbwJlc3/PBxcFQ5HmdFFFKNkqbD +wOO9BY83l8rKasFrJKkbOtI3dWRu6iowG8kx6MsxGCBKZDRcSJVjNEAffUr9p7LBXJTeQPy6 +FrhYyRtaxNsGHGfx2TnZVZVVLzDBwGN68DAT9yNL+NurhPjZxALwCHG+r6VgKCatYO7oG5tZ +lV1eMP5kLXhXtXRJvFXw6Oh9OXu0eYCCyr2DL80dRmQnWCEtLg+AR1psfkpoQVJg4WuBR2x0 +xdeylOEVVdciquy0cDpt9P3aK8a5y8T/z957gLVxpYvf+z33frv3+d8t3/9uNutNdu/du8lu +yu5m0+zEiZM4jh3b4IILLtg0m14MxnSwqab33nvvvYMQvYvee5FAQkL0KvwdcfDJWBIgMAiw +531e9Ixmzsw5M4zm/OY973lfIiKHUw7VzsntW4JHXFH/JQ8SDGoK9L/0Smwzulu6aHA6LUd2 +2pJW2n+slYysGNkSPAIDAv39/clk8tLSEs+bE/l1dKr+bpHSgSKXHmTwAFBBoU0hqIDWD4QN +cBmCx/TsInRHxJpBsBYPWBh8gvWAYcDyzuweLNYqsaxP0yRDSj1VXDVeUi1ZXCXWxa+8b5Dx +qj7WeEb5wMFjt4Q9q+WWtZ1ckLNqqJNqiKPy2qyWG65IDa456F6xFYSK2OpdtV+r1A3bAA41 +uemucdFc9fwTzfMm2meecKuGkKmGEO9NYJeHF83M73q5PAizkfH3UI9SFNKt2Y5zKS6vM3i4 +a8a7ayX4GCZ5aie6aEab6dsq3FM5++M5cSmZsJiHADzYUcV6U3cdPCBUUOjT4PIGBoeX1K+/ +4BdnV4NutDCpAhYoya4tyaojJpMK40nEhPrtgoeYa82/ifi8+yCVI0kcBI+QsHJPP2J7zWBj +9YBVTOvnlhX/fs4JDcGIepISCD0c4EGoHpIOaPy1TjECld8blGhGt3V107BxPDjAY4oxq5fY +yS78uJTOmN0cPGJiYhwcHAB4LCwscN+ZzLIwFChsuj71GSZk+gEED4ANEDzQemjlAAiBFrCF +0aHAMjRogE+wxi2qDC6gI4BPVAYdhH9p6RizcimSeJAo+SAJpdK7qxwLIERGIzEioWFich5/ +DL6sBaCP+p/HDfXdsl4f8GBnp5UPfCrlZXHPhztXi664hYtuoLPOnqurXvBjGRu961vnalE+ +b6B92VJBwvHWQ9/b6i+qmo/aLbsHtx3AAsemW+o+YBeNi6aW0r6OKsGmdz1d1CO2m6sFl83B +o7Ky8tLn919t8PDQTgDg4aWT5KWbFO2SkxpK8HEI1VEzjI/9iO3ssfTLlr7UXQQPm4haABVa +JmbQuKGuqulk4cOmjqQq8LUkuwZSR1F6LSG+tiC2jhC3DfBIiKoKCykNCy0LDyv7T8XUn1/x +/UrcMzKiIiqyMjqqMia6Kj2JhCwemmZJWOfSvwhZG0Q0v2VYirjit3rFcDrtbZ/6P2DW/0a3 +WCKgMa96mHtWC0/woI1PwwGXpDrK5uCRkZFhZGQEwGN2ljOpysJQAwoURks0QmBwcMADDaN0 +DtAgHmwXPOTNEqBBA5bhCR5gGVQEjgkVOX7wI2O0Gf/IWim1eCn1lLuYBL5IxVXAplQ1w9Rc +YtfSMgt/GOKyHfBgZ6c1uetuJsEjO60ZOzstIcmrYK81zZfoqOvDZ3Zadq6Wx75vVDa+WUr6 +Scvq3yiuuS5jd03R+Y2iavAVu/W3ZaSThj4oO62hqLOjcth2s9Pis1o2B4/k5OQLx8RfH/Dw +0U8OsUqPcc9NDipICy8kD3wF2IO18nNS6RMbE+fLF0Vk5JXMrJ2s7N2sHNzjMwgJGQRSBxkL +HqV17anZRak5RWm5xem5xXHJWY6uXi09IxA8AFFck3eCyDHGmCNGVMDl4qxqIomMXDvyomry +o2sLYrYNHkdFndh6g61/FXF4/4rjsRvOx26u6xdAbzkj8IiPq8GCx1+FrZNT6lJSSR5RVWIe +tb/WKUKkAfXfHxGvedX75/ZsMp2WJ3hMT8x2D0+apHdvafGoq6tTUlIC4MHhX8qaYyKH0iEH +ISwY7Cl4WFpa8vN8gKQBkCA8g4S4AlABGmqBYyhwqAUBBvdQC+QKUBiNyyDwoNCmwHo4vAKH +WmC9fJ7I0vJKSnabsm4Ke2xFJY4bObAKjSEmdvmkZjL+PMSF36EWMWt7hSAHlWAH5WBHFQ6L +h5O2mJm1mqcA1EbdS0/y6VoAMT6y04pYS0nYXdD0vPDoRdVwV75lo3Tb9sJDd85NjzykJdZz +tbg8DLWS8XXXiFLGs9PuKngEBgZe/Fz6IICH4Q0ftasWcpd1FUQMEHjo3HK8KyHFka9BSEhY ++ooKNmS68k09w3uO9qqRW4KHt14yYA8fgxRfw9Qg8/Qo55y+totwzKUs1zPMK8HbMdhQywSq +xB1poAkhWTlxJTnxJbnxpZcvXRG5dEXy7j2k96XkjHTNMmLXo3PQmPOFMaWFyZWFyevIUZhR +TXy+DC74S4LHaSmvsJBSONQirRnhH1CMzdUSE1119r4PAI9zMj5Qz8v65mQ0IvA4LubK1juu +5s5ZfS3k4JzuX2mz8eNPT0rtUzq628c2mU67OXjwGcdjanKqvLwcgMfk5CT2nsQ6lGIDhe01 +ePAvAAng2AdUUa0wthXrOXigoRPoLwooAq2BWyF4QK5AzqUQPFKJrXAZWk6wXqmwFn4kKLpO +Sj1FQjVhc+TAjLzESKmliKvEegRWDo0w8aciPtSyNXhsmp32iair/hUHwajhNWfjW/xmpz2l +43Ekv+IP2aVI38opO5JZdP2+7Q1Zhz9kEP+QU4bdeiSn9KQenp12zy0eF49K7hd4qFwyEzuv +ePnMzfNCQueFhO/LKT0xt/EOjkYjHVXN/VnEamRwaB+gdwwy6juGCkpq2cMcwxO9I8zm7pGn +gMSVVMD/+rLIFdELd+RvPtK7Z7MlePg9TvU3SgNamS0HwING/mvw08zMqCKgWTHFWbHF2Wwt +YVPHc/DITSjNA5pYBjQ/CWh5fnJ5QXI5xImpuSXvkMLxyYWkpMr5xZXUkIqZuSWIHEkhFZTx +OVgMXPYdgwfy8SjOan3nvFVeaiMWPJCPRzWxq6aoq61qwM49D2vx4J7V8jfTcgAeQi61W8bx +2BXwWGWtkteEwfjJyxHrULow1MAxFHJAwAPiBOAK7ERXNNQC1oD1oAC2PCgMXUmxAcTgXFq4 +Eo3FgJVgd+x0WnBMfqJirrBYPf3jjt6lEqqJd5Ri+KQODscPOc2k2JSmqekF/NnIvxwu59KX +t/xvFTLdWUvU4omk/RNJBwGowV0bnas2xnxYPLRFrG4pOJ8zCBDS939BdbzVr1tJSzuc0/Pj +2HROz1f+ji2enXZPwaO4uFjoi9uCBA/Niy4QPMqbRwKj0529QyOT88ubBmvaR9ddLLqwLha0 +5j4aB3iw/SuGGAg8oIvFmn/FFKmlO7ew1MXdOyUjl0KfgeDh8DDMTTNuE/AIMEkvjNdhsf5t +uOfzcJuUMOusaOe8OI/8RJ+CRB9Cki8hI7w4yj4v2iE/xrEg1qkgK6o0O7o0B2hMGVAUryPJ +iQg+xS5IhTkXpnsVRbgSkaEjObiCNrmwbu6IrAFrdgYefzln+Q7Q80CtuPVdIbbGxlSFhJad +k/Epym398rbL5uDxoRkbPH50qhEweKBZLVPVscihFCxz+2AcHPDgFg4fDwHLwDDTwqVIRiMR +wMMOqOMnxw9VtuPHI6MMQmkv/nh8JcFDAEniTBQc4t1z4lyz91rj3XICLWP5zE6recn8I+eI +Nyrqf1dS95OW1r2ZVyZzzeykoc8bJbUvbCqpe4NYdUXREc9Ou6fg0dLScvarKwIAD6XzZrfO +yAmdunLuvBCxtq+saQSARzl7KiuF7djZTtkV8BiiTg3T1uN3AfAYZbAjlgeGhIPb4LaI1ENJ +I2fNCJ7gEWia3l5z/tmzn9FH34lziQy1yg6zzgm3zomwyY20zY20y8OCR6wzIc6FEO9amOBG +THAnQpwItiqCmHFLSIoyvh6eNCOoYmpuCYVJf7b6LDei+uUtHkWZLQAz/PyLSMSugIBinrNa +3hWyDo+o0DRLCo+s0DJP0nqaBMBD2yJZ2zLZzCkLgcdfTMoAeFzzrBMweMDbD+tQSo3V4b5X +cfDYRFy880Xl4m7Kx/D0I92uSj5IknyQWFk7dEgfa/h02n0ED8PrjgbSVr6mUT4me66+ptFO +uv7ql022zk573lDnqs3j646GV2y51O7JDZcNNtk+ueH88JIZZ5K4Whw8XkpIJNL8/Pp8OgqF +cvqE0J6Cx70fdS+cunbh4uXH5nYRyYSSxqHSxmFBggd1YpZMZeYSii2tbIWFhe/dULZW9+MG +j0j7qGnm7wF7gM+0AA/+wSPRowhyxdzCcpBNiaaOAegr0wPK0jyK4fqskMrs0MrssKqc8CoA +HnmRNS8JHlKPIq4rBdUVdualNgICyU9r5AaPL265GNulJyTUaponnZf1BeCh9TQZgsfxO64I +PP5sxAaPW14kwYBHRkZGfHw8BI+NHEoPEXigyKX7UntlTYenf8E91eCLd/3FFKNfnj0AwCjo +pOcX95JHpw/dY03AAcQqmgYBeNw3in29wENp3cfDSTWUw8dD95qNzjVrgamhqOOWPh4AHlSE +HmtcMOWp6hdMH26w6eFFU/WLpmzw0GKDh5d2LJ6ddteFnSFub8BD6rSmyNXrdyXvu/nHEEmD +RfWDxQ1D+wIe7OSwk+ys9EOU8ZCwyBs3b16/eNvbIBELHkFmGTFOEfTRd8AzbHHhl8Up+vyD +R5JnETJrYDUjqAJcYQAe4HO3wMPXl/jOecvirFYAHj9Ke6s9iasv6r6nHVWQ0YQFDxnd6Jtq +Ie01gwA8tMyTsCHTheT9sOChmyqnEJInGPCAkUsheAy7XuHpUIoVS0tL8BM+yD+ffUwARyaP +sy/jyLi7b+5VyQAxpZg7L236EFeJP3PV7todKxw8+GGPianDERHl5fvBjvbOh1fMLSR9beUD +bGT9re756V100L/siNRAxMngsuBUX8QJWztvFXHSu+yge8leb5sKdtEXcTS+6eaoEmwp7eus +Eib3o3Z1TVVnRycOHrslt4D802DXwSOvpj84viAkoYBQx06VckDAgzE1PzE9z5xZKC2vmppd +5ACP4KeZ4TYpIz2fw3kutJEPcsJc+ASPZK/iZO/iFJ+SVN/SNP+y9ICyjMByAB6ZwRW7aPEg +pje/c87SyS2vltBp4ZB57IYzdC41tEw9dtOZI3KphlmisV2GnH7MJuAhEeIOznRk4n+HugYF +AB4wVwsAj9E4Q+RQOtdbtV83P5/TaTcSA7csNFVW8NI3QFlZWR1nTNPGJ+OSqi7f9bl2L2zH +7HFXOVZCNf5bIZP3PpY6JazFUVcqsRXGFYGesUjAGjT5F7rIQkOQ4Ief8Oy0e9oPDg8P2z12 +c33i72q0psb+zo99D6ga+rB1fXldnbatPs5PfN1NA8CZupkEWOs79/T2kEfIArvgr7xYWVld ++VRpt8BD9pRxTjXKSj9g5RocmVbKD3gYWToLEjwmZxbWU9LPLVo/8nXVj4DgEWKRFWqZVZn9 +YG7mvyB+DLR9n+gZc0DA46iok6phbE1BR3hY2TvnrZLjatCslrP3vG+oBEPwOCfj88Utl4+u +2GuaJW0OHmbxpG7a/7Az19A19xo8aFSakJAQoI5BQghyKGWWhe3jzc9nALGN5J2L1ruYzW3b +1u/ekbn55frmwa7esWfPVovL2tR0Ii6I+YjKRm7L6wMUBshxSz781GWLv30s+cFn909f5PS3 +QZOCsVFYAYSgScEQQuAymTa5s5irhwg8RsenvrvvHZZe95qAx9TkZDGhpIRYVpBdnJqQnxSd +mxyTmxKTlxqblxYHNP8AKWhSbN4Ly7HsdvKj7JIxucnROUkxubkZRWXFFSWFZYX5RYWE4snJ +SX4ya+PgwadkZmaePy768uCh9L21yPd3r924nVBQD8EjNrvmyFt/5BM8vvrmlLGl876AR0xc +grDwBetHPgg8Qq2yY5wSWspvrSz/HDzSwGdDsUycS+a+g4fko3DkXIr02E3nH+95g893haye +WKcB8PDwLSzKaW2rGoBDLX8VtsYq1sejv40yOpAOznF19ReUgdJdAY/mFkpuYSd9fIoDPDLS +M/T09IYbSzpU3tjEofQQgQfqczeSTZgEbRpnzu6s9p4+yvzCytLScl8/ZXB4fII5Mzs7n5xW +I6UUePGu/23FaH7wQ0I17o5SzPkbTp+ceACo4/1P720EHpA3EF08W8tnJ2+WgKKXvFbg8bo5 +l7a3dygIG2hdZM9j1b1q++S2o76ovZ4oJiPbDQdB6pYZ4kDb1ouJ7lA1LljqiNhoXrQyuOYg +/r1KVXUl/0nicPDYUqanp7//7tTdf5i8DHhInNQUvnjZyMotvawTWTy+//GSrKpOdkXnpet3 +NwEPZQ19r5D4lPzq377xZm5po+DBY2Z+aZg8Ki0l424YhcADOpcme4cNdX0NTR8zk0dKU0z3 +FzxQHI/E2Jq6wk4SsQsbxyM9iYQNmQ7Bw8Q+w9QhE2vxENMIw4LHQPvoNFOS7dky/9lLgkdz +K8UrsEJBO0laPV7/aXZ6dts4fQaBh4mJSWxYQJfu+8ihdHVpn4fIXwY8UBAwOAYBFmAvDKN+ +wTWwAIoDBvPYolhkoCv3jCk/8oPZzgZrRscYcwusxpahnLzqsKgsyhhzemZuhEwjU+huPjm3 +7vtduxe6Ns02ZgN3jjhx1TgRce8vTmm/94n0e59IAeSAupHFAyaaQacD1gB8Al+xp4yDxysJ +HtC51E4+yPkBO0mcE1eSOP1r9gJKEnfFVu+qHT9J4h5eNFNZSxKn88Nj7dMvqM7pxzBJnM5p +HpvWksSZmot7uaqH28r6ezyMUhLS21aSOBw8uCUwMHBiYoJjtOXWR7o7Bo+73z28fOV6WGpp +VmVvdlUfBA9776h3//ZhQe0AoA4xaSUseNh7hpnaeKQVkiB4BESlAeQgVHU80je9dPXmvoDH +7PxSQ2PLJWERjyfRWPCAzqWFcZaT9D9B/KAOfZwb4bvv4FFL6OQGDw4fDwgeKI4HAg9sHA8I +HsNdHSsrb4Kzm2Jo7Qw8SPVDjl7FkqqxUupp4irx4F1b8kGSlHrKwyfp8enNY7QpAB5CQkKd +1meRQ+ny5Oi+/xZeBjxgPwsjfcFkLpA9oCME5Aq0CXbNKAdcKrEVYYm+6wth0vmXxpbe/sHR +GlJfflF7HaljaXmls2vYNyhjZmZ+dm7B3TdbRSv0xr1AUdkIDscP6M4hej/4GyHjDz+XYQ+v +rBk6tgQP+AmJAjQYLsPrQKFN4eDxaoOH7h1rW/lAc0mvp9I+Di/majG87qgnYelmEOKmH7zX +6mEY+kTOVu8aP0niDHUuW8lKO13TCxLVeUGvaweoitmr3nEECxybrukEyko7wyRxDspBpnc8 +XNS2nSQOBw9u4chOC2XHQy131qgjMrMys7IXCx4yKjpAg+ILjrz1x5yKLrkHupdF7+ZXdf/9 +o0//53/fFb58w9DcMTm/5h//+qyqjXJbUlZKTjWntPHPf3l3v8BjbmE5NS1d+PwF1ychPON4 +kAqVlhZ+CfGjv/UcIdbjlQGPwY5R6nAkPLUJquu2wKOqesDWvUhcJYZXlpAYiQfs8Faq+qmZ +OfWBcscPgkPpXgy1QLqAyVmeYbLFYXttjvUo421jJ2VnwUDq6nt8A1Nj4nJJDV2tnZSmlsG+ +gbHw6PyhEfrc3FJeYV1pZaeTR5a0csDFu3635KMADUJ3jtsKkaevWH/0pRIaW+HQTYZakMUD +nhQK/w44BIFHRz8VoggOHq8WeMAkcR5mEl48ksQpOSZ7FyR55u+1pvoQHbaTJO6koc+bpaQj +xNqftKj294RKURm764pOvy+oBF+xW98sqvnewPt5kjh/Q1EXJ5VtJ4nDZU/BQ/xbLUAdERmV +GRU9HODx9ckfTe18DC1cT529VFg3+Mtf/Topr1ZeTff0uUtoqMXC0ecPb//J1i3QxTfiq29O +1XaM/urXvymq7dwv8FhYWiktrRC7cTfCLodnHI9Ej5TOumuwgwY6O3WkuVwuOzTmFQCPwc4x +xpgLPC/GmA8/4FFW3mfpRAB0AdDi7maJyUBnlyirkeiqeL9U4a8APCZKQ/m8V/d6Ou3uggd3 +mlrs184BGk/wgPaBHYDHyspKQ/NgcnpFSERODam/sWVwmDweGUsgj9IJRbVRsdl+gQmxiSUl +FR0xiRXi8v43ZcPA/0L4lutn36gD5HjvE2lu5AD696MKP1423Ag8oKEDJqNJJbaiISSwFa4E +y7d1I/jPMnNIwWN+cdkmqLC+g/z6gAdMEueoys4Qx50kTuu2uaWqu6XKnquVqoeuxDaSxElK +2p3X8RbSflE1PZVu2SiK2YIFjk3ntb3ALs+TxIVZy/i6P9p2kjhc+AQPNntsHzwSiW3R2bXp +5T3c4PGnP78TGFcgKacuKa+ekFt75K0/FtUPfnPqrLGNOwKP+0qPrt6UUNbQT8mveuvtPwHw ++OfHn4XEZuwjeCwusZaWWZnRxVGOuRvF8cgIjGyvEZuf/S9EILSRT+oI+ql++YcaPIa6qJPj +htDRlD4avRF4gE9icZe5fYG4ShwbOZRj+ZytKf0wVUY5yMXYsX9ogn8w2NMAYnsEHjA7LRw9 +mZ5dRIlodxc8kLR3jsYllpaWN/T2kaPiCFQaMyevPD6xoJbUER2XPUabWFxaNDAOPXPJ6ptz +T97/RPq9j6V4IgekDkk5G+/AdI4qwLmgwSCYmwbbYDii9GwtnQ1YcAwrFvxjDZ9OKwAfD5gk +zlk9lCtJnBs7SZyIgwBUT2R7SeJ+0HJ/O7v0jxnFGC15O61Q9L7tTRmHt1MIf8wswW59O7Po +lK7nSyaJw4VP8FhcXBQ+Lib+kSn/4JFS2pVa2p1W1s0TPKDFQ9vY7twl0cK6wf/67e8yipsf +GVoIXRaF4OEeGPfI4Omf//KurVugV0j8Z8e+OggWDwgeyyuslMDCLQOIlabYDrSdX1n5OcQP +1srPBzuECqKjDy94DHdTpxhakD0mqCEc4DE6zMjN7zCyzlvL7pHCJ3JwpAWRfpgmrR7vFVzV +1Tv+qoIHyk6LEtfCeR97BB5AenpHXTzio+MIWXk1ADxS0ojEkjrKKD0mnj0QA9aYWcecPGf6 +8VcqGxk6PvhM5u/HFDT0vBYXlw/jY03w4OESUdJPZrwmvQYfSeKeGkk7GEk77rUaSzsaitvq +XLXmL0mcpaiS6xmjoLNPAl9QfV/1a1aS9xzPPA7g2HTG0F/ujq3myyWJw4V/i4ehoeGVo3K7 +BR4ScuoyKjo+EZn//ed3ciq67kgrid65n1nS8snR43//6FPhyzd++8abgD0AeJTU90vJqYpJ +yuWUNr719p/20ccDCx4rrNUQywx+Ipem+WfUFejRRj6B+LG0+MvuBvGCmPhDCh4jPbTZ6VvP +J/KoQ/AY7hvPyGw1sMhh+2yo7QQ5OMJjSqunST6Ic/Etbe2kHl7wQLQAX/mx+WThuz8gDR3n +TLQeOkLAEOtoFxhui59ctJvLBHMut6DRO4CdqL2zezA7t5Q6zswrqMwrqKKNT9q5JJ88b/bp +iQc8nTo+PCr/96Py9xTtZ2bmD+ljDffx2EfwMLhmb6rokOCZF++Wu9ea4J4XZBXHf5K4jx3D +f19Sd6Sw5icl1v4hu1T2mtkpfe/fE6vZrh2YTb8vqLyq4IiDh8DAo6ur64dvf5T4lxk/4CEl +orU5eFi6BP/rsy8LagdOnb0kJf8wt7IrLJEAZ7UA9gBPiYTsCmJdX0ZRQ1hiHoCQ7JJGY0vn +s8IiBwQ8mpqab16/zX/I9GSv4tyI2I7ae8gBdYb5P8Ndws3l2qVpoYcLPEZ6acxxu9XVX6xF +jz/R3typZZItqZYMdFfykaHpnGsjNTH2XiUNrZTDCB4HUAYGx2vr+9NymhJSa9o6BuMScgqL +ahmM6ac2cTzB48PPZf9+TPHcFf345OKVlRX88YiDxw7Aw/C6o76UpZdxhJdR+N5rhIO278PL +pnwkiTPQvmJtdNXhySXrJ5dsOFXU+ck13puMRDdIEteBg8fugwcQU1PTS19K8AMe8jL6m4NH +Xk0/AA9tY7tUYtPHnx/HTqf9w1t/+p//fdc9MA5Op716S8LWLRCAx1tv/ykhq+TgWDxkZGQ8 +7QNjHPO2FTI9PypuqFN4afGXyAMEjsLQRz/raZStI7gUxhMOPniQ+8bHKVmstTm27e03bslF +ikiFiPEXk2p7kbqfO4pYuxJJzRQcPHZFSA0Dnv75Du5ZWXkNzS3dE8wZK/t4AB6ffK2KwOPD +z2UAchz7TtXJPYHBmMIfjDh4bAkeDkrBGyeJYw9/CChJ3FVrQ1GnLX08NC6Zqwg9eXiRnQyO +W9Uv8F7/cC1JHAQPj50miVNXV3+ZXAyvG3gsLi46OTkB9pD82HwT8JD56uljS9ctwSMhj3T6 +vAhH5FJHn4jzl0VNbTzOXriKjVx64849j8CYfYlcuhF4lJSU3pOQzYoujnbK30HI9PyotNLU +wNoC69ZKzd5mCXLvOcbop3Mzf1hl/dvy4q+mme/QKcdHekX6WuTbqk1aq6zqi/0aSvyq81Kr +czPLMmr2HTzYzqWDI0y6+9Li+6Nj9TmEJnv3HIVHUTdkgq/fD7utuKv4oRwr8SARgI3swwht +o7Dw2HLBgEdiYqKjo+Mr+TNfWloZGPqgqNRuhDIxRp20cUyG4PHBZzIffi77vbCOloFPdl7N +OH0SfyTuQJq7R/9ywfqJR85rcr6gyzBWsndQ93PSCnDSDHB8FGCp4GGliFVPnmq5B7p2WI8N +VWFN2cue68sKHhbbVLC7jaq3q26wo4a/m26I/v2nLa3N/X39fF4uPI7HtsADiqur64WvxDYB +D7ETGnZeUVuCR37NQEHtAEeSuE+OHnfzjy1rGmHHKS1v268kcfyAx/z8wukfTufElaQEEHcx +V8uPOgRFZ18FhZ95ev6MRPoZ1jDygpGE9YtJ+lGglH6J4W7lvlajtprg9tqQ3QWPoa6GscGE +sSGgidThRCbNbIqhNTWhNT2hPcNUW5z/enHhxNzsqaXlkf6h8a4eyvLKckNTv51Lxo17vhfv ++N+Sj3q5jKgx4qpx4ipx16T9vxUy/vsxub/+SwK8kus+8RMMeOzuKzDy3wjPIPEMCAYdP3Yl +twu3VwkvAZdO6hnb5YPi6pX94yXLT0+ofy+kGRaVN7+wiD8JXx8JDAx8ScBeWloiAxn5SSlk +ysgwubdroL66vTS/vji7tjizpiSrpiy7tiznJy3dB61ZU+zyZlqSXV2UWV2UU1NGqCdVt3W2 +9w4Pj5DXZGR4ZGSE/QmWwRVYXubX7xoHjx2Ax+LiYl1d3SbgcfuEmr1PzA7AIzm/DvQj4veV +7ytq/M//vusVmnSQwYPFWgX3DwCPzIji3QIPQB1AwUXIj66lMWYLYuv+4z9+dvLkz/T9rfvb +FAbaFRhjXzPHjy4v/WojINlIFxf+OMP8cmZyXWeBTgE9DnRuGqMzx6HzxrZ0ebmlp4/a0DIE +75CVlZX2jmFnz6zbMn4X7vjf3Al+xEisIccVSd8T543+cUz+bx8D5FifcKFvHCBI8ECBsLC6 +3YPAWSpwxgo8AoQQCAnYMjrOmS/fZo55NJuDB5Syik6/4Jy5uQX8GbgrUt9Bnj8kM4B2tx+c +nJzr66bWlvcWpDRmRddkhlXmRVblR1UXRFfnH05ltzwKvBVWgXPJjKgipDX1do6xVlefn/Hq +/l7w1wQ8oOwFeMir6X7x9cl7ihoAPCRkVLSfWAkSPECPv0PwiNod8EDUweHjAdbATVgfj6qc +8uaKwJbKoMGOh8PdyuMUoSnGsdmpD7bLDJsra+XX87NfLQCdA/r1NFMeWTymJh5PT+gvL/2T +HSptrmhxcXloeJRQVEdnzOQQmufm2L3q0DDNO6Dgrrw/OzamAn/4sRY8U1wlVkTC5+uzj/9+ +VHYtfuYLczwFDB4w2YqoVhiMbQ6/vgx4ANJAwbU4MGYHodF3CzxebTEyMiIQCAKrDlAHuP6K +FomvCXhQx6j+bmGhnrFeNuGW2r7mmj6W2n62ev52+gH2BgdWA7erDuBTPwCcl4WWn4t5aJRf +UqhXTIBLhJdTwPDIMJVKxcHjZcxuHLlaeAqLxdoIPMRPaFu5hW4XPPIqu/7rjd8B8Pjk6PFP +jx4/c/7y2QtXBQAesE+HPT5a5hM8JO5IA/AA+vLgAeutaBl7tjb1D8jU7AIAD7gMqoYFduxc +2lGb09sc0Qe0JbK/NbK/LWqgLXqwI3qoE2jMUFfMcHfsSE8suSeut7l3cx8Pct/wBM11Zfm/ +IZzMz30P2lxS0ZVX2OgXmOjmGU1q7AH4wZiYLiptnJ2bGyHTPXxzb9/3uSYVeFMuciP8gPG6 +7yrHXhb3+upHfZglhOfsTgGDx0ZdOSQQmI5kenYRRs2CZIKGS8IzSGANwAkd50xsjA54HBhF +HKV04RgfAQtgL23HdI4aKbQpsF7eLAHVAneEVePgwftU8em0e9kPtrd3KAk91r3k8FjU8ckN +Z9M7rvrXHPSvr6vBdQfD604G1xwFo+y6rjui2jfUaw46V211rtiyP7n1Cu9Numub9K7aaV+0 +1b9ir3PR1kjUVeK7BxVVFe1t7Th4CECmp6d//PaS5FEjTufSr58aWrhsFzxUtYz+/tGn9xQf +uvnHRiXZaRoYfnni+2JS/56CB0IONNQCO3qwkh/wyI5lUwf43C3wAFc1LbICfOZH1/7suZDH +Z7ktHvviXEru7ZpiaMHJLEABe0wy7Lva+2tJ7VW1nQUlnZSxqbr6zt5+yvz80gh53CcwvaG5 +l7W6Sh2fDAovNLKIl30QfFUqQFQmnCMpqrhKLACSi3c8vjytC9BiI+Q4UOCBHXkBRAHDhqMc +JQAPciu6YKI3lLIEO9Ty7HkGW2wSW1QFBBWw/p2L1ig7LdwR1gK3ovVoJUpPj4MHDh4C6wfZ +uVrErO0Vg9nZaR+EOKm+GLn0hqvuNRvd6wJSnWvWawHbt5hOqyZszI4hds5Y96S+7vcYXfv6 +SMj0kZCJ7vcG3Fu1zhmrXTC2kPR214iwlQ/w1IxWEsaz0wpUwsPDz3576d4xc47ptGoPTbcF +Hrlr5g4RUfFPjh7/+OO1NK+0fxe5+uFDXdO9Aw/Ym1MnZqem5wF4zMwuYsEDKJ/gkehT+JLg +AavLCa8qbx7Li6yB4FHROAotHnDr/k6nJffVzDAlkfvH0sLnEzRfGLm0p4Pi45/hF5iam19J +pU329NPikqtrST1kCt0vMKOhqZc+MUMbZ8YnF1bWdsWn1jw2j5N9EHTpjs8thai7KrHQ0HHt +XsAXp7QBbGyOHGz9XAaBx16LpaUlmvXGEzyweWNR1jPIDOEZJLeoMuTLAUdqOMCDYxlVAUOb +wn2L6/pQLQhynr0Y5hRVDWpBqWBx8MDBQ6DgwU4SF2B618Nc0suBM0mcg+E9a/+nsf7mMXut +gRbxZiqOetdst87Vct5Q77L1bRWP7zzSTrqlYvU7l2Q5SUdZaZfvXJI4Nn3rliKm4vHoIjtJ +nJ1igNEtN2fV8LUkcbV4dlpBiqurK2CP+188xYKH+LUH2wIP0Tv3wZPh/GVRYxv3xBwilf4p +eFQMDf8/Z8/938zihr0AD2TrAEJjzjX3MuiT86P0af7BIzu2GILHtuJ4cIMHtiWpEetZWaOi +S0BFYM384sr+gsfoQPrc9Hnk9TE/I0QbyeRIEtfZSiEQWoLDcpLS6+ubB6vrOodGGBPM2ZDI +3K6ekZa23tCIjMiYLG+/2OCwjJyCeiqNGZ1QdkPK/bp0wG2FCKFbLh8dV94SOWBkiQ8/lzUw +CRbMvY2N47GRxQNrEsEaN8BXRYtEZKzgdi7dBDxAMWS7gCHTYVY17sLwgPJmCRx2FRw89hc8 +oI+HilXy6wUe8oFmkl5Ppb25wcNEwT7OPSfWNWuvNcEjz1bLg9/stJcsz2t6/jWJ+Ld4wk+a +UPjX2DwxKVsxWUewAL5it76bQBB65KG5Bh62Cv5Pbro6qYapbDM7LQ4euyJmZmbnvhWR+fIp +Ao8b3yj4xRXwCR4ewUngsaCqZWTh6PfF1yd//otf/PaNNxWV/3t2lv1+XVz65/ruht0FD9iV +jzJmqtqp6LkEhH+LR3RMTIBrxMuDB6KO5LCq2fll6M5BrBpOj6oEywWxdevUsR8BxGjDngtz +n0HeWF39xQxTktJf+0IcjxdztfR2jRUVtccllnv4JmbmlLe29YVHF3R0DQ8OjyWnEbNyykco +4/GJeQ2NnSzWKpXGkFNxP33B4puzj9/7RPq9T6Q2RQ52/EywoKzhlkeoIxTVHzTw6BygocT3 +4RkkbvDA+nhsCzz6RxhoqgtP8PCMKUcmEZh+7nUDDwptCpwyMvscBPA4XLJrSeIUgpzV2EMt +HNlpH4s6a998aiLjZHJ/z9VUxlnn9lNDUQf+stNa3ZRzPGEdfsIy7Ce1Cj9hESJzx/q+uN2J +p8Hsr9itlmFgl0cX2SHTXR+F28r7e2hGbzc7LQ4euyX29vZnvjsvfdwUgof0CcPb4vf4AY9U +YtORt/6oa2Iv/0AXLFg6+cEkcSFxOY90jq2w2BnWVlb+X/K4JqlzYNfBAzZ+kMl+ZNEn16mj +f2Zhc/Do7e07d/ZchE8CAA/+Q6ZzgAesgjm9OLuwHB1UCatOiqiOC65A3h2wjIAjl/Y2A7Cw +Wl7603NHjjcnxzWHuzt5BBDjlZ12sIdWXt7pG5DhF5QRm1g6QmG0d/SHhKcWldTRGVMJSQUx +8Xl9A6O9/RTlhz4/CJsf++7RxonJ1pHjH8fkVB+5Vda0C/iu5h88ICqAfh86e8CSblFlEAkA +ivD08UDLoAD0TUVVoIOYeOWCBehxyhM84AKoJZXYejAtHnAACKscSWo4LilHSaBw+ImjMEAy +dGTkSwMK8wyEgoOHIMBDMchFg0fIdHaeuOsuepft9UT2Xi/bG1x12jxeOtbiIfzA+f2IrA9C +MzCa+X5Impi07V0pu/eDUj8Iy8RufT8sXUjDXfPiWsh0dnbaneRqwcGDW0gk0vz8TlJBRURE +APZASeIufH/9sYXLluBx7pLoz3/+iw//+SmgjtjM8pLGIQge5c0j1i4BR7/436Sk/7PuV7D8 +Zg858OXBY316SAM7/nZZM3V0kAnbD5bB0wl8wgIbOZfOzM4rKipZGtnDoZY4t4Ltggc8fpIb +sZc8FRZUmBRUCcAjOagiJawKIQdoDyxGiGPnLRUMePS1kBhjGqyVXz/PZ/fuONlpsGNgw8il +vMCDMTY1QZ0aHWZUV/f4BeXWNw2A9pdXtZaWkWZm5onFtRnZJQNDoyMUupZByCkh8y9OavJO +TLaGHP86rqCp711L6tyX3wIHeEAX0I2GWpDDJ/QvBSUbOykoCy0cDeEGD3hYCAnYKiDAgK9H +fjCDuWt57giKgX4Wm+sWruRu7T6CB7wyPJUjaAnytuVWsAnNQYby7X0vniXhRd5f8OgnM45L +eLhFl7924MErV8tjUSftW08tlN0tlPZcLZXdTWQdNUUs+MlOq3XZ4ryO9xduCV+6xP2krvHH +7SNVr1pcV3Y9xl4Tj9ka/4VTjLSE3UsmicPBg1v4jOPBLaurq+w4bmQyBA+5byyvnLuZVNS2 +OXhEppU6+UQ7+0ZnFDfDXC0IPMpbyJ5B8Z7B8dlE15nnNv/pua86BvN3DB6wNx8eXvflGB2f +GSSzwaOoYRQOtWw+nXZ6Zl5LS0tV4WEWmzqKM6OKox22l6vF0LoIHD/cqSzJvWjdyhFUER1S +kRRUlRRWgagjLLoUgYcALB79bYRJ+g3kOzo/89XYYMDWIdM3Bo8J2jRzfJpBnTQxc4yKLXD2 +yg6LrSyrbM/KKQ0OSxkYHB0apqk88vtBmAd4QOT49ISSgUlQY0vfPv4Wtpurhee7Nj+RSDcq +A17zx5mzO656S8cHAYMHdvYNUmzLsdN80BQhLHugktB7E66E84gBw8DyBwE8XkPn0k3AQ/+q +vbmyU4pPYbIXYa81xbsw1C5J7ZIRP9lpAXh88zTk/eTi9xOIP2li0QdRuYrXLS5oer2XWAi+ +Yje9H1cgJueEZ6c9OOABZWZmBrAHAA+lbxxUvnN00Y7cVsh0DvDAxvEYGLVeej6Rc3xSsrW/ +eVvgsY4co1Owcx9jzI0ymHCZSCKPT86hoY2NAohNzcxpQuqIKYbgwTZ3bHOoBYIHqCvClTg9 +t8S2eIRUUhlzsCUpQdVTc0sonAi4nntq8eio6yL3uk0zzyLf0SnGjaGuHH5ztWwFHuTnUlHV +GhRe+MQiNiS6srNneHJqdnhkXOWRLxxqwSQmkwPI8cVJVRPL0PaOwS1vNktLS/DMPDjgcdhE +0OCBPF6gXwpU7olCHCuh4wqHNQOu5MYMgGooJCwOHgcEPAyvO+nefeqo5e+g6bfXCmqxVHXT +EDHnJzut5mVLk0u2pmefmp7jUIvH1x2NLttyrWer0TUH9YumnNlpcfDYV/B4thZbzMXGS/4b +a+VvHDTPu7npRW0XPJQskwF4OEWWQ/CQNIqDzqUN3R2X1LXhi/kK6zejDEMNh+TY/JbNwcMl +sQ104jTm/CB1CoDH8NAkeXQdOfrJk6MDTI7RDZ7gMT278Jw6iiB4JPoURNjk7sDHAzuNBUl2 +WFXS8+ClgslOSxvWXGX9AkUonaDK9LeVby9J3MbgQSXTyRhhMpmASHv7aVHxFRXVPc/YQWDm +NfSCTgk9B4/PZf5xTPHr0+rWDtG9fRT+wQDPTnsYwWMjxuC5EvrPcIAHRySTrU8VB489Bw+b +jbPTuhlcd9S9Yqt7xU4AqnfV7nkcjw0VgIe2iJWasLHGRTOe+nBNN9qkedliLTttpINSEDs7 +rTAOHvsPHkAqKytPnzwr+a2uyreOqt85Sp7U0TS0SCps5gc8xB/HmvgU/CDv9zSAeFrBD4DH +aUU/NKvFIpBo7B0+NXsK9phP/c5nlPpsDh5sh425pcJ+5uDYzPziSn//JPgcGmbOzC2t4wdz +ijI+Bzv9iWm2fws3eIxQxjQf6GVGF0HwSPApCLfO2Rl4pPmve5amBFXMzS8vLrGQiSM3ohrU +DsADfO4ReAx0eE9Qr688d+SYnTo+NmjR3diyk+y0vMCjqa5VTlY+JCQEUQfnM6pnrLKmp6is +7YF26JmLVgA8Pvhc7th3ao7uCYPD1G3dZjh4vALggY0SzxM80KgKdlwGzhJCM4kOJnjc0Y88 +FPcBiUQqL38pd5T29g7li4+NbrmYSbibirsb33HTFLLSFLZGqnXB5icVfv65h2qtuZVqX7DR +vmD7QsP4VrCv3lV7SxlvYzFXKxnfez88rK6p6mzvfIbLvoIHkPr6ejExMdHvZFW+s1c+aXvt +e2nhi5c9Q1M2Bw8j73wRjbCyphEEHg7hpUfvuh6963ZdM/yBbaq0SbyabZq6XVpLb8TC0l+t +Ar76Xlb8pIzMCWn9/OoibvAAvfk7X0sC2ICMMTw6NTLAHB6dpmAMHUPMmdFJJgIPnhaPjCgi +oA4IHvHeBWHWOS8DHnA6LeINbHbavMiavbB49Ld5Mcauryz/Go2qTFBvdjfUbity6ZbgERed +ICIisgl1IOntpwaFEm9Kupw4o3v+ij6hqGFnYICDx2EEDzR6AsOdbQIe07OLPLkFSyNgPfK/ +PSDgAVs4Oj71mvQa4+PjUYFxsYHJbA1iaxx/Git4DUxiK3Y5MClm25oYG5S03v7A5MiAWMoo +hU6n4/yw7+CxurpKoVDAj/3syQuyJ00efO/88LrlZeEr9+VVEwsaNgIPRcukvKq+KxphADy+ +lvb8ywWbq4/CQ7MaVG1Sw7Mb/ZJqI3MagVoFFUHnUkN3g5C0r2rbjgAFT5eZ+R8odL/uYQoW +PFwT29CIRv/AFGV8dn15lNlPZqLen85k2zo4wINYXGpt7JQRSYTgEW6bHeeRH2qVvSvgwZ2d +dtfBo7shbJwstrz4O0wEsA8p/Y+76kt2EDJ9E/Do7x55qKYhKytbU1MDkYNKpc7NzW1+kwwO +0zNyaumMHT6fDx14iGqFocjqYBlN0wCdFHbO6Y48RQ8BeECX0aN3XNFXDmDYxLmU+7LAYLBY +19NNUuwRCIRdeazhwlOWl5cnGBMTdIwymAdVJ9YUu7xTXTtTxpqCK7CysoLfCfsOHlAWFxez +s7NFRUXFv9fQ+NHF/kG4hpzB+bPC+qa2yYRGnkMtSpbJJj4FMXktQen1IRkNR++6mvsXAvBI +JLadUfTPq+7Nr+79UckfgoeGfXpsfsvgWPTk7NWfcqqyfjM5Iz00VoSGWuYWlgFmjDHmn2c/ +mR4ZZqKQ6TA7LczVgsCjurb+iZHxVZHrbjb+EDyCn2aGWGSFWmYdfPDoJIXSRm4vvcgb5F7D +jtqil8nVshF4xEbGi4iIODg4IEPH6OjoltSxK2BwuMADpYRDnSboTGGAdDhqADaB3pbnvIxX +ADywik1yxw0eHESh45zJ7TLa0U/lPjIM8brvMjE1b+qTxx2oBBdcnq1lYnV0dMSvw96Bx7M1 +X9ORkZGGhgbQH6n/4GJwzcteO0DmrpLqfS1u8IjKbfqLsHVZ04i2c5ayVYquS3ZmebeqTQpA +jtqOUQP3HItAYkBynbpdWmBq3UP79LPKATKmCY8c0o298zuHekcZ9ovLf0W97dLy32hMB9ek +emTWwCpo2xiDPVeRAzxSM7LkFRSEhS480TZPDs1LB9QRSQy3zT744NFSmTg2KLm0+Aa6Aguz +fxkdeNBek7MrSeJ4gkdNeb2SklJ5eTmiDjqdDv7pArhXDyl4YLtjFHoUO46wd7L2f1mFBkl2 +QNpnUivg6+qzdWWtKXvbytpasLyyylp/jwNLu2LxOPKDGTxf7phgHBYP9HUTRw5oLMKyx1bR +SwQ0znKInEtxEbDgcTwEAB5Q5ufnwVsw6JUennaR/9HUUi7I1yw+yCY5yDYZgEd8diUEDxGN +UAgennHVADzAJuhcCsEjIrvxulb4PZN4wCcP7dKsg4ti85tj81viClrOKQcg59LBUeLkjDSL +9RvY+S4ufzDGiOeZnRaAB9biEZeYcumCyO0bd+1M3NLCC9Mj1jSSmBxECLHMPJjgUUso6iS5 +UgYkFube/sm+MfsXSr9qW3X27man5Qke2Nkr4F88MzMjsHtVkNlpdxE8AGzAKKMQNmC4dUH1 +mGycYEzPsVjL0OLBerbyDJEHIIvn1uK5+YWpGbbNamVpcWCENr+y9PIWD3i+PvGV3D4bHOCB +oqjxwx5AUNTWbU11wcEDFxw8Xm3wgG9bQMDrsAiQU2KPLts7qkfYKIUG2ybfE5P/8cxZVQ1d +W4+wb+95AvBQtkpWs0v3jq9xCC+9phlu7l+IZrUcE3dr6KYC8IjJb0ZxPLDgAZ1Le0dGxxj+ +cwun10N/s34/NatBYTRvBB4pIQUulr4+9qGpYYS0sEIAHinBhOTAggjH7EDT9CCzjIMDHtW5 +eX2tOjTyeSxssO0b82+PDUo2V2TuenZaDvAY6KR4uftirRxzc3MMBgMaOrAhrzlCU0JPBmwn +AjsXMm0SLfM/0HAYwQPrEol8EtAcjc0dFV5e5haWYhLyOtkTlllsn6iZmytrRMFiLUEmAZ/z +i4uMybnlpaXwTGJ5M3uGYHVbj71fDH1yes1O8rLgMc6cRddho8iliMGwET84IpdyCPYa4uCx +LXn5WS244OBxYMEDyeLioqurq5CQ0M3TsqrnbLSEPLSFPbyeRj5Wt7x3R/6tr5Ru35U8dt3U +1DPj8zuuADyQxcMioFDaJP6dizaAPW5oR2wOHmg67RgjennlvzHjLx9NzdxsblMMCla5dEFE +Q1knJbgAUAfQ1FACW8PAZ2GcZ16IZYa/UVqASfpBAI/yzLyWSsehznvM8aNY2GCxfjFJPzbc +o9xckbgX2Wk5wKO/nRwZEisqKqqpqQmHz7inrkDeAPwAJy9gE8cjIMGCByiDwGOjkNevmMUD +dEywO0YXB6xBcz22nKOxEzMHe0iFZeQQ7R+ZvzaCsgJunlHapWE6s6yiDRDj/OxyTzc7gsr8 +0nJiZkV9W/8glSqu69g9wp7j7BqZq2IRBIrtgDy4p6UgSEBpaDYCj2cvjtSgleBa9Y8wsLVg +Z8rg4IH3g/gFx8GDW5aXl5ubm62trQF+XD8tpXreSvuCp6tOTJBN8pdX7Iy1Pd87rasgaxKS +0XD1Ubh1YIGQvMuPsu4PbFMjcxphrpaHdmlfiLudVQ44t6ZfSrhvHrm0uz+gueXLpaV/w/ba +QBnUD3tar5FKtQuSgwB1+OgnB1tkBBin+z1OBdSxv+BRV+jT0/RgbOjs/Oxb2DYvLrwxOnCj +q8G8sTR+77LTcoBHR0Ofp4uPiIiInp4e1tbB7cuNTTjC8fYK3+ixfetrCB7YE+cYbtgjfw/o +xtHU1XtCzGx0YhYs51Y2s6l1VcLaN7G5a3B2flHXJvaEmHlSXiMoP0Cm6tqGrjxb1naMdo/J +AWtG6NOf3DKg0CdXnm3b6rF5HI8to4phZ84iCwnY652L1jDBDdZZdyP/UiMjIwKBILB/9OFy +LsX7QfyC77sEBgZOTEwIoKLV1dXp6emenh4vLy/wBv1I2EXnopf+Ve8vz9q46cRYGUaHOaaG +OaVpaYUE2iVIicmeEroH/l9C54Rl5JVk5JW/vfpQQdsSWTxE1APsnDzsnD3tnT3NrezlFVWA +KiiqWFjbx/vlJPjnBjnHGWiYuFr4Z8Q41pep9bVfZNLf5YCQleWfk3v/QSJezwk3iLL3Fzx4 +lCSnNJVaDHaITY7/k6Nty0u/Yox9PdCu0FTqX5pG2rvstNzg0dM8ZGluAxARPL2RlQN6dExN +TXGb36HFA73Co8cvnEMKC6De4fW0eKAktuBCwby0cCW8YnwGxdqOsOEwsaj+W0nb+QX29BAz +32T2TbUirmjss7Sy0DtAfe+czr+umYupezxbXWZMTalZBM6xWFqOMd5JRFB+cnbx6G3DPgqD +9WzbLqY8wQOQJ7c7KE/wePZi1HR4O22UeI4jMAgSPDst3g/iFxwXJCwWC3Re0O8UiO4lLz0R +b6D6V3ys5EI9DeMei/o9ueEf7pIeAdQ1w9821t7IC6iDsbfb0+Aoj8xooJ5Z/nbRWiqGUPXU +jJ3NfNlq7utlEwrBA2hiANC8xMC8JKBB+XHeOTFuKZlhFhVZ4n3NX0wx3uTo6+em/+9Q12ek +QrGccNOsEKuMIMeXB4/CuNDyDLfWSrUu0v2uehk65VP66KdTjL9xVL2eEW/ivZGe6+01JtW5 +iQLITrsReID/C4DD1tZWLHJMTk5uNHUF6+OBLBtwnAV+hZ4eryd4YLtISF/YkOCwd971OB5r +bqOsHvL417fNugdG2f1+egl0LrUNTKtt7e0ZHv/qrpWyUcxNJRfW6kpOcX1WcX3fCFXJyHOY +Ng7KF9d3nVe0np9f2AF4oBAlHLYIbOgSSAvoKwd4TM8uok2QXlBWX+z1BHzCM1HLvoBHRdPg +xNT8obgt8X4Qv+Cvp4C35sXFxZmZGQAhTU1N5iYWajI694Q1H11xhODx5Ka/yZ1AW6UIR7Uo +V+0YN91YD704H+NEH5NEH+MET8N4L8N478cJviaJIXZpQINtUoMsU4KsUoOtUwPMk51Uo50e +xDirxbg9ivPQTXDXjnd7FO+uGe+uleChneCpneilk+SlmxRgFBVl75Xq97QwXr0m725L5YX+ +ti/Hht6bnnhzeuL3gEM4zCMzzN8jZdL+TB3617oOA/2YtqbTzLdnp47MTa+H1Fic/83s1B8m +x/9Kp3wCqIPce3q4W3ikW7i7Qba7UbazTq25zKy2wLs0LZUQW7WnuVp4gkd9WXtCZJqznbu1 +hW0JoRw7YwX8a+h0+vT09MLCwuZOhrDjWFxaeWSfduQHs8ZOtufAbd0IsAw+oYLlx+7ZYH1T +NwX0GqWkfrDsFlkG1gsqfNbWYmlpefPmzV08IOArpNOzC2j9OHMWXKXiuj4IYLv/+2L/xFjg +r661Lzg2d2iEtrjEntUyNn5lena2b5g6t7QcnVpu5pqYklfHYq1OTM4sLS11dQ6NMyZXV5dG +RqgxWWXdI7Rnz3bkXbpngi7mljl8BQweJaR+cFeLG0Th/SAu+AU/RDI7O0sgEMTExM79cEH6 +wkP9G55GtwKMbweaiAWa3AkyvRtkJh5sLhFsLhnyVCrEQjrU8l6o1f0wK5kwa9lwG7lwW/kI +O4UIO8VIe6UoB+UoBB4u6rEuD+NcNeJ4goe3XrKPfrKPQYqvYeqWPh7xblF5kXb5UXb50fYF +MfaV2dot5ZItFWxtrQQq1VbF1orMpyXJzqUpLvsSuZRP8Gip7g32ibgnJQPjgGHHUzYJe745 +eKBl+ArPkZUDvu3C91zwogp4g+csmP2VVzVk+sLSyjI7Ogfb4rHIWoY2jEZSTyaxMbOg6nkp +OM12mbW6zFqfb3uIAzPiSeI27wePHDlCeC7cM1xIJBKBD5mf57Tw9PX1bbkX98g+hULZci9Q +hmMvUPuWe1VXV3OfPj+nBq4Ax17gKvGzI3d1bW1tH3/8MQ4eB1bm5uZGR0eJRKK5ufnAwMBB +A49DETKdH/CoL+0QEhJSU1OLj4/H8gb4aTOZzOXl5e3+42rbhpHFGyAHHDrhGEABBbBrCNU9 +4RkknqPzOHjsgf0DcgUAD8nVVdby8sIUczExpcInvNDdP4dJn2OtLK/Nt11mF1tlsW0lzwQS +Eg4Hj/2Qc+fOYTNlc9/zgEx+xodwz0oA13zLvbh758DAwC33AmW4IWfLvUCPz/Pe2FLAFeDY +C1wlfnbk+VQB699//328iz+4j8jV1dnZWTr9pxzr4GX8wpmrsiLaurdccPDYMXhU5DVkxOWj +q4r13xgbG6NSqTMzM6zD3dXg4LF1bwxDpg+P0k2cMz4XsfjoivHn1y31rOJaWwdftVMVLHj0 +kxnHJTzcog9HcAwOuwRu8dhriwdYDz7x/h0rgplOu11ZWVmBEyhAz5iXl2dtbS0qKip85rLU +5Qe6Yk44ePAJHsT0Klc7b9l7CmfOnMHmkMWaOBYXF/FfwWsFHo1dw//f58rvn3/8nbj1vy5b +//xjFe8YIg4euOCCy2sOHhyyvLwMOkrAnK6urmJiYiIiIgrXdHDw2Ag8ogKSdTQMAKqBCwUe +vykpKQMDAzt24Tg4kpiYuKe9yWsCHu395N+dUA7LqFxeXCqp7H3vwuPkwgYcPHDBBRccPDgE +vJhPTk6OjY3BkQKsP6TWHSu1W8am971fW/AoyazPSyqH4AEuSHx8vL+/P0pYj4ZUNpkSe1gs +EocrSdzBBI8BMvPICQ0RBU+XgIIb6sG//Ey5rY+Kg8fLSHsf9T+PG+q7ZeEdCi64vErggbV+ +zMzMjI+PUygU2KVmZmaCh4zomkhdUda4a2arFPLKg0dcUIanfeATHTOxW+JCQkKANMi8ZHR0 +lEajTU1NcUccxcHj9QSPxYUFFdOIhxaxNgG5mvYpKmbR3T0jOHi8jOBJ4nDB5dUGDySrq6vY +93foiQpe9g0NDc+cOUMkEhF4OKiFvzLgkRCcI3bz7smTJ2VlZcGjFfAGNp45djBlcXFxfn7+ +VXIZxcFjV8BjaXHR3Dmyu3e8vW+otXswKrksv4j0qp0qDh644IKDx94LHIsBb/fIEoIE9NFC +QkKiF+/cv6GqfEfHUNbOVNHNXTvuIINHtE96sFv8U0N7Uz1rJQUVdC4DAwOAqbgtG2NrIsgk +9Th4HFLwoDIYobGFbR1DJbWtpKae7KIGYkXr/NIcQBL2nNrVV+FUBZyrBQcPXHB5PcEDydLS +Eoy6CTpiQCOov87Ly4uPj3d1ddXT01NSUjpz5kx3dzcCj0f3jC3UPNn60Etg4BHnneNvH+3v +EI3AIzO8TERE5OTJk5KSkqCRoLX+/v5lZWU8x1CAgNMEJzs3N/cKjKTg4CEY8Cis6jR3imdM +z66wfyyr8ZnlviGZlLFxdhCPVwU8BCwVTYMAPO4bxeKXAhdcXk/w2Eiw4UG4xdzcXGlNZGVl +T67J1Ys3sOChIfP4keyayj3RlHvy9JGLo0GAk2EAFjxcjINdjYPdTIKdjQJ0VUz0VE2BYsFD +4tY9idv3IFoAAQuwUmxLOOKIIqHRfgotzmKxXgfSwMFjL8AjOavawjmuf4ganUisKO9MyKpJ +yqqqqGxZu7EOWpT0w8QehyVXCy644OAhYFlck6mpqcnJSWgVAZ04z46eY0TD9UXR1NTkZgYl +jKCS2AJ5a4KN37WJQIMGk8mcmZnBo20IADza2tq4gym9KrK6HjJ9eSmTUFta1TZKpg8O08gj +o40dvcSalqq67gVwj8FA6WuhS3H+wAUXXHDwEIAAIJmYmADdPY1GI++lwHnBiC6AcAf0w0XA +4PFKCwuCB405ZWAXVVjaMjU5s8JiMZmT/f1Uv/CcyIRCCo2+VpAdLh0Hj23J6PjUd/e9w9Lr +8EuBCy44eOwFmfAUbBkIEpsUWFxc3EFKFFxw8Hh58OjqHdU2DconNrW3DYbF5iVmVFRUdccl +l+cSG8vrOmZXWAsrK7ifx3YFdy7FBRccPHDBweP1kdXnummh9aGWtIzqtKyKwWFaTUtfcRu5 +tofa1jtGLG/s6h+NS6+o66XWdjD7yfOz8zBt3GElEAKBIMjHGg4euOCyLVFTU+POv4MLLjh4 +HCLwYP0EIAgzuLHhZ4sr4n6xRUGxxKbO0bYBZsvIfNPQRM/YRE5RfVZeXWJmVVUnjdjMKGgg +13bR24en5pfmDyl64HE8cMEFF1xwwcFjr4S1CkljgbVCZi629dNbeqkdg4zukckeymQPebKf +OkOmz4PeeIR2TVTdzco9k9QyVtM6lFnUQizv7uqj5+S1ZOc02brFh6XWtQxOF7SMOsS2n5NL +JDUNrK4uHEa7Bw4euOBySGV6drG2bRjoHh0fHPnDq/ZAN6+CQpsCv2ugGxXoHKDBdkIFXw/s +JYXnaxVAAMuiWmFgGXxuucttwT7QdJwzQaXg86BdPZhgek+Pf3hntZCZC1W9E3lN1JyGsdwG +Wk4DfU3BwlhO41h+0yjojXsGLpk5J7kFFpRWD1fUU9KLerLKuuvaKKRWakY2KTGr1iU4I7di +SFQz/79PBR8TdkpJLWCx5nDw2FLmF5dtggrrOw5xBkZccDkgAvpHgPGgD9o78ADHB8oTPAD2 +wK4ZKCgDO2ue8r2sNzwO1CM/mIEdDyZ+YM8FNht8brnLWUW/PW0VQLvwDBLH9dyyYa+kReWQ +xfFYi7lRUj/sk9pa2EkvaqcXNo4Rm6jEJvA5SmweBctFQJtpZR1U0Bt39pxNzq9PzKyOz6jJ +Lh+JJZJjigdKGsiFFe1eoVnVLRRCRYtjUMl15ZibClb6RkapaRkrK6y1MZxVTsXBAxdccHnl +wANuhT01P+ABSoIFoAA84NcDyB4HEDyQ3QmtAdcNtPAgG45w8MBKXnXvSemoO0aFEYTBktbJ +4mZmcQujuIVW1EIrbmYUsb9OlrQyQG88RL7iH1NeWtU+MDxRVt1d2TTcSV6oaeyvaujxicpu +H2J2DowVlDbllzX5B/qG+Pr39fSsIcYyO5o6VlcP+pwswYOHS0RJP5mB9xq44LLX4LHdgRiO +8ltaPOB62EFvCR6oB69uHoKH5RjFgLWDt3vu9/2NTgRu2rILRkfgODhY09RN4R880JgRT/DY +qJE89+JoHjwFniUR4PHzv9uolj0dksPBY3Nhzo5HJeZckbH9VsLbKJDknNzvmNjlmNTulNLp +nNLjmjpgGtqg71UCemPy2BUn/9SY5NLWdmpDbV9kNMHEKr6Q2NzaRrF2j0/NI1XV9xaUtQQl +EpoHGVWkMSpjDhpWYHSP57rCjjK2eqDnvOA+Hrjg8uqBB3QDgP07WGjspGC9F7Dv0bAv5igP +DfubgwcHV/APHkDkzRKwLQfVYWvHei/A0Ry4CRwBdtCgLnguaBM4IM+qQXnsEVCN2H2x4z4b +gQcogMpjLxHc5dhdNzScBL6mEltR7dhhJuz1hw1AZwGKmXrncR+fo/EQ1TicT0B12Lbpu2ai +hsGLiW0bN9fh4LF3wloL87WwONvb1Z6YnOISnBGU1R1ZOBSe3xde0BtZ2B9BGAonDEUV9lv5 +FoDeeHDkQkx2TX0PndTa3949VlI/6BKQWVTe1NI2QuoaT8qprGzoLq/qik6rKCANWgW2+MdV +jDNmO4cn2gd/0o4hZufQRNcQvY8ySZ9ZZq0+T38MFlhrM2sOwEAMDh644HKQZZM4HhuBB1oP +Oi+4DD5hX496f9Afoa/c5WEPtXfgAZ8D8MhoGRwBEQjsu0HfCncEX7HtR41E5wXUM6Z8o6ph +/wsKY3eHuCJjEodt20bgAdoJFkAVYIGDmsDCkR/MwEoEM9hN8AjYdkKiQG2ABcCZWgYUcB8f +LCNsAAuQr7ANQ1cPHAEcE3yCxkC6QI0Be6HaD6BL6qsKHmsWB9jFs8hjcxXN42Xt4xUdzLI2 +emnruha3TpR3TFV3UBIzy0Bv3Ddy2SKgWtOhJKu8r7Gd0k9eItPnqxo7a5oG+8fmalr76zuH +0gtqajroFn5ZEoZZLhHVBc30/HpqAUbz68egFjRQi1vojT2MUcYc2xWE3RDWAfEAwcEDF1xe +MfCAPQ56JQc91CW1IPjT4+gTYRnu8rAf5wCPpm4Kz2kpOwAP7JEhXSCTBTwpaIXgeEmH7YQe +DqB7RTiE+ISjXnAK8AjcgyOoC56eXeC+FJv7eEBjEbos0OKBjA/ovFDt07OLWDsPB/xw8xLH +8bmHWrAN4z53SEHoXNCF3egq7aLs9ayWw2fxYK20DVJJfcyKFlpRI5XYTCU2ja8p7bmONfTP +RaeV1TT2gN54YORSeHrHI+tiK/+K4prh0GhiQnZjSf1IXtlgSnZ9am59clZdbkVnUEJtYGJ1 +YFJtVdckoZX+4gE5dDy/YaysY6S2a5zURWODEOtAXBkcPHDB5VUCD9BNoxdtqMgJAfWwsAzc +kWd52PlygMc7F63Rq/dLggfqlFHtyPUUNQa0E1UHFTUGgseWAMZh5IECeQZrxsHCxibgAY6G +pvBgj8DhXAoLgBPk7uix7eRuMxwx4T7+5uDBPaUI/Jt4boI17il44NlpOWRx+Znc0wxh9axI +wlhFD72slVbcQgVaxPYsHQefFe3jFc0jsSmlLZ0joDdu7rhg6llGbCAXNQ2T2odTsyvTipur +O0Zr2unVzdS0/IbweGJLH7WsdrC7fyIgutAnqb0QHKFzoqRlvKSFBrS4ZXxN1ysqbR2v7pqO +KBg+K5csrhVBHR99tsQ6CJ4fAgaPw5urBfxsgW4SrGC7B6luHuLnaKAM3EsATIitiJ/zBa9y +sBh6pxOAgP4IO7UQBw+ODnecOQunjVj6E4rr+qA2dLInsEdlN4D139330nZMBwtukWUblQfa +P8LgAI/yhgG4Cdy6LwMeZQ39kGGgNwJoD1iWMIzG1g6qyCrtgGcXk9OA3bS4tALBg0ybhAcU +eRgCSl7XDOWoF57m0TuuqCTWxBGSVgu+TkzNwdOHD6WNwAM20ie+El4WDovHt/e84MFBs8HR +gDZ3jRp55MDaQYPh1gfWyfD68/zf/eWCNc/jbw4esGEyJnHrPd3Syp/OWcCvOHjss7nj2coq +a6W2uV/FNOrEnYArDzPtozu907o9kzvdUzrd0zr8MjsyKsmAH3KLW/KIHaA3bh+4ElsyVNVF +q2oj17YNkbro1R2Mug5qQ8dYXRe9rnuisLY3Lbe2trG/e5Da2Dnw1Kv0gka2nE2xW3q3Z1q7 +V2oXUO+1T68UoJ320S0/Kib/U9jz/G1r/cdWRCJhfv5ApIYX/KwWyvjU8spumnuauingOQaU +w0F9d2XzYAUmXrngCQBfWMBj59v7XsjBbKODXNUIAQ8lflhlE5928JyJzm7YLbLiNsVvDjx8 ++gC8jIDnMOh3gK73WfX98MH++swl3BI84H8NKfhfQP8NaGaH3gXoAiLzAvaO4i4PHRe3nE6L +fUNHDdgIPFAZrKvDM8zwBPRSgM6Q2B2RhwYsgL1XkYUEKE9I5janYK8bWAN+g9j5NRuBB9Zb +A9WIwAOZZThm63DUjm0n9+8a3NU8j4/+C5v7eKCrgWxBOHjsr7B9KVZZy0tLw/29GbklYVnN +KZXDaTXk9GpyWvVIRnV/Vee4TyQxjUhq7aUTitpAb1xUdyazrK+ufaR5cLK4jVbQwh5GKW2h +1nczqtqGajuHG3tp1Y3DecSGqrru+lZqVGplQTPNO707tZaaWTeaCT5raRm1tPSasbRqcmbt +aFrNWFB6m7tHiKeLc3ZW1tjYGIt1IMZaAHXs6agch9R3kMHNr2iRuIvHFED3t2VHDB6MaCQa +PsZ5PoH56c23BR7glLE251cPPATwtDzU4IFFDmyUUY5ZKgiD0S4cToYc5WEHt3nkUrSVQ7lL +ojhjUM8p+XNAAsesFuy/m2NaB/SIgBYPOPbBMceEQ7CzWrBHRv078ohAtz3PyKWohbAN2MsC +zwhtxc4R5q6d+x+BCsubJ/A8/rPnozwIabhntSAAY+8eW859LqjGLQOx4uCxm+jxbHVyfr6l +b6KsjV7WzgAIUdy8NhTSPF7VOVVY3e/ik9DRx2juoBWWNTf2PA1O8X3qVfrIoSowdyCrnpxb +T8utp+aSxgoaxso7R0uaB0id1MYeRnZJa3Jue2hcXXouKY5Q1zC8sDbOQl37hOMstLWK6MWt +tJJuakkjrbC8u6uHApPGrLBeu+S2e+HjsXn3B37F8HUjMrMeO4iA9eniGFZAu4DfO4djGz/M +sMm8e+xBwtLrsEeDLvfw0QQagFqIeAA8xKCLO2oVKAD6C/Dk5DgdnqcPFJ0gOhT2aJuAByiA +mgcH37mvPCzwyD5to9qxXQO64GAlnCOJrQIdBL7kovkLoDz34A7PcwGSX9kNi2Ev7CsGHvzc +ii8Tx0PAAqNYbNQwrI0L+XjAqTdbW1nXinHPJAXHxI7C8HN9Nt+60WTVTTbxefwtz5TPS7Gn +goMHVpYWl5p7qNW944QmOofPZ2ETraydWVhHLmkYaO6drG6hkDr6usgzhEaqkV/tRzdjP7+T +qOVVo+9L0vOtBarrU2MYUOOS1BaQ3eGd0PHYqdjErSwgtbWqYySrvKW6e3oj59LCZmpB82hh +83hJG72mm15cP0Slz7122CFw8ECmWmiBBN0QUA6LBHJvg0827C5Yp3T+wWOTl3TsQc4q+qE2 +oMluqFLumYNYMzXchA0RwF0dOi+0O6wX++6GFjr6qZuAB9ayjQ1TiTUCo6MhBMIa2DkaiU4Q +yy3YKrCefki53R15ngsEDEWLRNSwQx3E4GXA41UVDudSXA6I7DV4JCYmOjo6HparwZyZE5GP +e+zXUNL5/7d37sFVVHke9z+namfArXJ2tGpntBQc1NHCUSlhZyQlpeyMCzgIjkhE16AriouE +AIpCCPIGuQl5EFDCU4KARh6KPBRCEsIjiIDkKYFCzOURcjFjDI5A9pf8an/183Tfvp2b5HIf +30/9Cm5u9zl9um+f098+53d+x7enwrfryLlm+6rZdrb8u7/su72VdYVl3gPV9flHLiQvLOk+ +ZPXY7N0fFHybtbY6b/fpvN3ej3Z/S5ZX7M3bc3bT3pqtJac27D3zzqbS9ftPzv2w7Nlpnxce +rd9fdaHwaC3nbFqz9vDuqvLuOnZ+Wm75XY8uX5u3/4cf62Ptzgyl8BABwMqhR3wGSQ4ycWtn +pcEO9vopL0lYD3CntEvhIY5hAX08RHjIKC0/smXI23banQzHU+HJ6MnL8wqtPg/SV8AdHbyS +V5Nlkh2f49INJQ7Cg4ok+ct8BEN4sKi7td8sw2mfD0r/Wictcv7cj6EP0X/UUslfwk3QZw6V +aR1eN86FrxsLD94kR/fXLwThAeEBwl94RBaXr/z05tydtz7yzhOvfbqu6BTJj91ldUVlpDTq +dpXWFZTWFR09X1B2fnvpubm5Zb2Hbbqu18IHnlmbs6V6f0XdvvILtLXw6PmiFmseQCk9U3j0 +bNGRM7tKawsqzxZUnsnN/6bH0x/GPb9pxorSLV/W7T7qKyqtK2RrPpCPrbD8/LqS00MnFdz4 +5+z7B76dmpn+9fGKWPst2Mdj5Mz1IRAe/O5Mjx7uQH4wIZu73JvUlLcmFbXAmkQHWdIP4kFJ +K6Rv31Z1+IvSYys8rF4c2nnM2GqcrIOPhxGcQQs//e7PGdJj2tnHg4MnSBREQ3joiAq8Sa6k +7UkZgsE4hKgXa/eRPqK/c+GtLDykYAFnXkB4RBBUWx99JQfXAcIjvLl0oqr8zbdX3N4v84H4 +D0dnfJGUdWBM5qExGYcSM75ssUNjsw48Nj7/170Xd/lrzpjskh1H64rKfTsPO8TlOLfjyLnP +v2q2wvKzuTuqew1deUv/Vf1f256Y+cWYjIPNmac3Zz4mg/899Gr6oZ7xa7o+OO+J/5k5MSUl +Z/GC6uPV+G06TnjoTng2eiyyb5V+nOnA0dYk4o6lH8QygUV7agVUHf6EhzXKQduFh3MvkBY5 +boSHhFIU53x/woMf9xJfWj/onYMP6EO4FB7+zgXCAwAIj3Dghwvnv9i/J2vB8ldGZ418fcGI +N1JHvJbx4vj0F8bOfz4p7fmk1OFjZg9I8AyIf3vk2Kyhb3y2dNuJomMXCsvOBxQeBeV1uytr +J8zfmzgx7dlXZgwZ4Rk+Pmv4uFTONiHRwzY80fPcqHlPPj8lcdzkebNSVue+d+jw0Ybvf8BP +09E9HrYyQAIo8biG6AeHJM5DLaI6nENM2AoP6yyYjuvxEMdX6SXgfoNX52zwJzwkgCQPP2nX +WeuVl1ESfz0eVhXX9P8xneQQpBncCA9/58LKB8IjDKFfKmg3G4e00bECGoRHFHKl6WJD4/GK +0o0f5mame9JS56Slzk1Pm5c+f17G/HmZ8z2ZmanZizKzsuanZ+T0GvxulwErR3j2flxyZm/V +d82xxcrOF5c3255mq2Urpn+/9m0+cOal6Ttvemhx8ox5Oe+kL3lnceb8tOac097OoGzTU9kW +pKflZGYtzlm4fNXizz/fdvJszY+XLzZdufozakMcx+NETV3PYVkZ77fnULs8jHiyv8yYkAc6 +uxkcrvRaZQk7QsjT2UjS1OK+GFB4yAs+T8MXcyk8JEIjB6lmJwr3woPL7+DjQVt5YILdTmSY +g5trvg5rth7yJzzk+c5eFrY9HuyDQfmTCtJ9SnJ0OSntZ6IXLNOHsPZ4yCZ/Ph76XLgAUSM8 +ogb2tCGrvdAQdFrrfR7cnG5dT8m0pOE5ZdqMyb+0M485stFnCREG4QHh8TPd0bIqyqVLl8+e +O1tRUVlaWlrWQnl5eWVlBVlV1dfHqo/Rn+UV5Ws3bhnwYvZNjyzqlbB+2tryZTuOL992cun2 +U8s+O7Vs+6nlW0+t3P7te5/VrMg/NW3N0fue+uD6Bxb87YVZ6Z75u4uKqqurKyuIcvq32RTV +x74+efJkjdf7fcP3LWvHhMWkligImS4tjzEDoskSuUinkkeh8b2RxE1cC73ek15f0qXwaPr5 +/BSZoOFGeFAbyHEXrbNajPU05bg6ZoIckZ4FDkMtegTKVnhIhjq0lz4pYwlR68XUh9DCQ1xt +nWe16HPhAkB4hKHw4N8oOOGhHcLbLjyst42xVI2/W1cclbW1ak5uFJOXl9ehTxN6ZBcXR5J/ ++JUW3Ox56fLlGu/JjRvyJkzOenBIZu9nMp5MWvb3xPcGjVn9eOLqQYm5jyfm0ufBSasfH5/b +66n53f8y/amXp06bPfXjT9afPn26NUUKiysTBcJDYjvYvqTwognUmMxbUWD71mOd6SBJ6F1G +miOHEOISbNwwf+9ZnIkRx4NDXlD7Jktp84iPEcncGshi6YYS7mmxvTgSSUO/1knQDDpNOX2H +kOkSK4N2lgLowtAO/A6Y9/lX+uh09TghbdWXznox9SE4BIdsIu3BP4dtHA/bc2lScTz0a2wb +I96DNsJTsdo3bVuEB92WW3ZXGEvKykAn9xOKDjGm29MmcUGH8AhZj0pkrdXSKv55qen0uQt7 +9hQsW54zbcbsSSnTJ6dMeytlSou9NXnK1GZLmTppyqzJKSkzp05PfXvWp1s+Plt35tLlyOtw +wyJx4YZLdxEAIvHeZnnAscJkPjtpQuNupz9ZYepodVpaHK708lZb4SHJ/bmF2IapMYSHrbAJ +6EAOIDyC6RtpCSpK1tDY8M03J0pKSgoKiwqI/HyyXWS7drIV5BcU7NpRWLDrwIED5+vqmsJk +udlIEB5DJ+SiEhnNIDuoSOTqWA4SDqJVdcjAhDzc9biGhMk1JpfZdmvopXINrycdhU+Hi/cn +PGRGla3wEBcs3eMRoTFhIDzCWntcuSIDIVcuX7586dJP9vyT/7t0KYI9i0K/SBxpj9O19ahE +1mZQhps7dD0FAMJEeEgEOe04JA7ePI2FezwM4UFS4YY+b9EmPRTCm/R0Kh3szrbGUUUbn/qJ +sWidFEa/CIiPBy9eL1UVXkMQHiAihAfw1yxjViCwMmrUKK/XGx13uLXHQ/cqGMJDD75Yxzv6 +j1oqLzLWGdbi26PXl/cn9fUyRk0W51JZmU7gpd8cVisAEB4grISHr75xyqLt8PEDwCVRE8fD +QXjo4DB6NpZ0KWjhwVFfZIVrvUlPVdNrG/kTHiRyeE1Y2xC70p1iKy1oq8iP/V99gxu1qWXW +SYeudQ7hAeERHHAuDR/Ywc+2p4UjZmizXdlT5u/Qy6m8YwIIj7YID4ZnY8kgiFYX7ASSMHmd +VXhIz4lx91oLIz4eFSfOcnJxBdFlE4cT50UQlm4owY3ahNVpAYQHCIS1S1nPHbaGJdFtryyn +a3gGAgiPNgoP66iHNX4L7dkjPsO4FUWTGDPCbCWxdi6VUHu8p1E2qQtcMNpZSigxPbbtqcKN +CuEBIDyAS+HBvdmPjV6uw4/LBEPu0NDvnroppjafd6DWGMIDwqNdhAd9aawKRPekITzk/rSO +p4gO4Rz8+X9q4SFyhQdcnNdO0jNuRJP/o+EiblQIDwDhET6Nre2a9S0vYhf1EAa3rtY9+Xvb +wQ7GNrCSGz9V3ZxKh7PRsMs7o26obQe+dUQv5wKD2BQeHBmPrPZCAweLE88K3iTB9lkw8PQu +CWHHaeVWH/LaKt6BQ+XrTToHw3FU4JB04jXKScjopjXKxq0Wb92YX6ozJ6PdcJ9DeIDWEhcX +t2TJkpAdLnacS6lF0p7zMkOWGi5usp6dtEYGOHTob2NEQ79YSWMomVDLySHTdSod9Z1zsJ1R +qPXDiW/rHIRHk13XtG2IszVbD+kCo35BeAAIDwgPAEIDPZ3poU8SS0QFv17JOMXwlHW621ZG +NGS8Q4aeSVQY8QQkE0oS/8Zq/ZTXqaTb2Vl4kNhIyd5mHdcWJz2JsMQFkwmMnETLD16dlqWU +fmcEEB4AwqOD8ufvA+Lz+XSq5ORkN6mMF3OqjG5SWccR3CSkE7GeHWkt51S2YiwuLs5NOYO7 +kta5S3SVWnslQ8yeIyd99Y1RXwf10AM/uI1F3/7RcFGCIrJHPc8T1HMGtbO9eOzz6iTyufZC +g0MqIyqjVXjI4m5aJ1idS0nP6AEdHbhJ9+f0iM/Q69QDCA8A4dFe0PPO1jGAF6cLSGNjozW3 +gBw8+LN+XVIvblJZH81uEtKJWM/O4/E4p6IdrKnoKe+mnMFdSWuLRFeptVcyxKqDnlMJyWuj +vg7So1/Ggv0tc2+dRSjxjqxBF7V/ne1Ksno6oSEhHIQH943YCg/e5BDKgA4n8oOTS/eLdv4H +EB4AwgOAq0WMOJfyabIPBq9f2VrhYZUQboSHVa4EFB5cqoTJ6/TyEzqVeJb6GzrR8a5PfFtH +kkO0FrQHhAeA8AAAwiMEeFYW0Gne2m/Wtj1VG/NL//Olxa0VHrUXGu4a7KHP/ztr/dINJWR9 +R7xLfw5puXT+hEfNue948SxJ1Tsh243wKD125oY+b5HlfLTfmv/hSq8Uhv4cnrKOduD8M1bv +5k1csFWbDxZ8cfzjgnJ2eV358Re459tdeLjp1bR2bFImblLZdvYGTGU7ehuwizj03eZWCZeb +mxvKbvPgrmSHdpsbng8uL6a125yubffu3SE8QBhyoqau57CsjPejf2FHGYOgD+waKrMF9Zqb +xpQT/lNmwhqzWiQigc7ESMWzC/Wh/QkP7poQ94wFa4o5H54zaBSMA1kbnq7WgrHEwvpZHYob +Py6rKxc9TdyksnVvC5gqLi7OmiqgU1zoHQWtEmLAgAGhdBQM7kp2qKOgVYy5uZhWgcQ3WLdu +3VBDAbiK2EbYCAJ/kUDcHFr7tbb72dkWLIjSAgAAACBCmZmzQyaVyJpZ1oAbAAAAQCxQfvzs +v/R8c0LGp7gUHYQOq6jnmwAAAAAxCNZq6Wg25pdyOGgO+4x5JQAAACA8IDwAAAAAAOEBAAAA +gGgidiKXAgAAACBMtEcsrNUCAAAAAAAAAACA2OF0bX3vhIWIpA0AAACAEADnUgAAAABAeAAA +AAAAwgMAEN34fL6HH+lzTeu57fddjTVqAQAAwgOUlZVd+4trg3isjBuXhKsX9WzevLlL11vS +3n19X+X77m1OVtJ//OkB68rsAABgpfHHn2Yv3fllRQ0uReyQl5d319139unba+X6We4fLq8k +xd/f417SLbiA0dkUNDaStvxT3P2bixa2SnLcfmfXfv0f9Xq9uIYAAADaV37krJl6z7135eQs +xtWLMkhP3nf/PaQtg5Ac6OgAAKDHA3Sc/PisJGfAoIcHPzHQ5/Ph6kUH+/btveMPt7nXn5Ac +AIC2AB8PEIT8mO4Z3aXrLcXFxbh0kQ4JyH6P9S08shKSAwAA4QHCWX5sLlrY/Y93wOM0omFX +0g+2pUFyAAAgPEBEyA94nEYo7l1J0959nSTHb37zbx6PZwcAICZp37H1UAoP/HYRxKuvvnrt +L64l+bF+RwY8TqOMVrmS9h/Up0fP7jAYLGbtli6/e+GF59uxCQrZWi30LOvU+Vf4BSPOpntG +w+M0msjMymiVKykMBotxmzRzxNPD4iOxuSPhQU8x/IJRbPA4DWeqqqpmzZ758uhhqYsmFJeu +wu0K82fTPKMmTn9xybpp7Zjntn3vUp7tni0sQoWHt7b+5RkffbTjKIRHe1nuprmtql+0J+1P +lb19izF3wVjKlgoTynPfeXDZxOkjRo99cdGihefOncPjPrLcOWBXxeIe7vHbm280rAMr6ZfL +nHego19zzTUjEp9sx4Mu/3AGB0Bu32xhESo8QubjEc7Cw6jy1A6s25oadG5jJv53q+oX7Un7 +t3tT0/3ebpQtFeaqXFI4fkSiOwfsqhhXVW4EOlp43P3H3wdsmiA8YBAeoREezUtc3X4zf2ij +DIDwgOMH3Dlgra2q9G8IjtXpul9CeMAgPMJHeCxcNbnZh3/wQ1xBqKZAeMDxI0LhFWafGPqo +y8hgsPAUHnEP96DvxyY/918D4+hf/jJlzkj6ko3aK909S3/Kl5xW+m8pOR+ImhrOM6DwkANR +hnqkZuCQh+X7T4qy+XvOnw5nLQyEB4SHwZcVNSQ8Rs5cD+HBwoNlACHVmWofV2GuVgtWJBuu +FHor1UpDeEj19ze0KsKDjshVlWztpx7eSoeTL8moMNZGif+k5LwPlzxMhIeEGtu6dQv0QGgI +boVZWBgKD26aeAduUuTNSHfPUiuks5LxGt6Bc5aWLaAA0AeVTER7UMJO1/1S8pdiW1+g9HlB +eEB4YFaLbUVLnvkS1V/+LLWM64uuyKwQRNJLReattL8WHvEJ/XirIVdshYduK6R66mFf3iRK +w+gRlarNfTXhIzzY/ja4L+KMwY8U5sbHQ/oNpNY/99JAakPovYP/pIZF3jX0416y4lZC99/S +iw/9S5qB0vKfzu0h/UtH/KQo2zgEleG9DbO5weE9uXGD8IDwgPAIQngIXKmlG0FqClVV3pN3 +kEZAejvpG/ogwoNkjJu6Jm8irHaoxaDP9/X8g2gb6czkZkReMSJLeGzalQV3U/iRwhyEh2DU +cXkPMjQA94haa70kN9oEq48HfRaTlyOjYbEqik8Ks6mto+/1nhAeEB7uOVFT13NYVsb7xRAe +t91+M9URa7cGyw+qlVLRuCrRW4mtbwYLDxInRqPB0kXXdH7psFZY+izCo7maF2VTtaXdjCNG +lvCAu2lHO3V07tyJ2gc0kpE71EI1l00aH6OOWwdljAd6a4WHfufSvawOwoMkhx5qgfCA8IBz +adt9PKT/kAWD7sw0xkz9jcyy8BABI/0Vuvbp1sBZePAcf12AyBUebP0efyhCe+3Q4wG7Kj4e +boRHcD0eInX04Iuz8KAPvXrfY90TwgPCA8IjaOGhfaukW0PGO3RVchYe0uOh3byNmu6vJ1OE +B28Sf1FrC4AeDwAfj9gRHuwzRl9K68HDr4aPh7Pw0H2wbqbT6maHM+RN8o7Gf/IYMcGertRg +6oYUwgPCA8LDQXhozw3ZJHNJdFUSxy3ZSq8MelZLq3w8bIUHNyPSUBiNjOFVbkwEho8HZrWg +wYwy4SFPc54Sa/VFDyg8brjxet4h4KwWW+HBBaBMqLUxjk4vR+Iiy2WD8IDwcBYeQyfkQnjo +wRTx8ZBxFl3RuCpJI8DfcF0zZrWIGHAzq8UqPCQ5z6g1hlq4N0YfHbNagLh8II5HpBgPpxpd +o3pSm35Yc4AO3VLprUZW3Cmhe0gGDe3rZjqtzpZ926TZiU/oxz4eY5OfM/aUbl7+UhdGSgLh +AeEh2uN0bX2MCw9teiKJTLDl7416bW0EeFaL1C+eCOMcA9mo11yePn95gLWNeLzTB67Xsqex +lYsqjQwXDHE8YhlELo1WY4fz4FZ2CDqhntXinD9+IAgPTKdtu1FV0j6i7dgIuDHK2SFz561X +3RC5FB6nMBgMwuNnXbL1jVMWbc8vqYbwgMGVFB6nMBgMBudSWCQaVqeFxykMBoPwgPCAhcZe +SYq/v8e9cCWFxykMBoPwsLLnyEkSHgnJayE8YO3lRzpuXBKe8vA4hcFgEB4O2sNX3wjhAYMf +KTxOrRb/3ACquTAYLGbtli6/Gzbs6Qid1dKp86/wC0acTZ41En6ksexxOicr6d9/e+NNN920 +ZMmSHQCAmMTr9UZoW4ffLoJITk7u3LkzCY+AffLwI410j9MPtqW56Wsl+fH0sPjjx4/jugEA +AGhfffjnB3uR5HCItgo/0qjB5/P1e6yvS3dTyA8AAABXS3LAjzRq2Ldvb6vcTVl+DH7i8YMH +D+LqAQAACIK8vLy77r7TpeSAH2n0EUSA06meUbff2bVf/0chPwAAALRWcvTp28vlCy/8SKMb +9vogUUES1L0Nefavd9zRDQoEAACAg9i4/tf/OnrCM+4fLnDngPCA8AAAAADhAQAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +wJn/A5vjFyA= + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-0.8 0 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-0.8 0 l +-1 -0.333 l +h + + + + +0.6 0 0 0.6 0 0 e +0.4 0 0 0.4 0 0 e + + + + +0.6 0 0 0.6 0 0 e + + + + + +0.5 0 0 0.5 0 0 e + + +0.6 0 0 0.6 0 0 e +0.4 0 0 0.4 0 0 e + + + + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h +-0.4 -0.4 m +0.4 -0.4 l +0.4 0.4 l +-0.4 0.4 l +h + + + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h + + + + + +-0.5 -0.5 m +0.5 -0.5 l +0.5 0.5 l +-0.5 0.5 l +h + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h +-0.4 -0.4 m +0.4 -0.4 l +0.4 0.4 l +-0.4 0.4 l +h + + + + + + +-0.43 -0.57 m +0.57 0.43 l +0.43 0.57 l +-0.57 -0.43 l +h + + +-0.43 0.57 m +0.57 -0.43 l +0.43 -0.57 l +-0.57 0.43 l +h + + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-0.8 0 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-0.8 0 l +-1 -0.333 l +h + + + + +-1 0.333 m +0 0 l +-1 -0.333 l + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h +-1 0 m +-2 0.333 l +-2 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h +-1 0 m +-2 0.333 l +-2 -0.333 l +h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0.6 0 0 0.6 0 0 e +0.4 0 0 0.4 0 0 e + + + + +0.6 0 0 0.6 0 0 e + + + + + +0.5 0 0 0.5 0 0 e + + +0.6 0 0 0.6 0 0 e +0.4 0 0 0.4 0 0 e + + + + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h +-0.4 -0.4 m +0.4 -0.4 l +0.4 0.4 l +-0.4 0.4 l +h + + + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h + + + + + +-0.5 -0.5 m +0.5 -0.5 l +0.5 0.5 l +-0.5 0.5 l +h + + +-0.6 -0.6 m +0.6 -0.6 l +0.6 0.6 l +-0.6 0.6 l +h +-0.4 -0.4 m +0.4 -0.4 l +0.4 0.4 l +-0.4 0.4 l +h + + + + + + +-0.43 -0.57 m +0.57 0.43 l +0.43 0.57 l +-0.57 -0.43 l +h + + +-0.43 0.57 m +0.57 -0.43 l +0.43 -0.57 l +-0.57 0.43 l +h + + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-0.8 0 l +-1 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-0.8 0 l +-1 -0.333 l +h + + + + +-1 0.333 m +0 0 l +-1 -0.333 l + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h +-1 0 m +-2 0.333 l +-2 -0.333 l +h + + + + +0 0 m +-1 0.333 l +-1 -0.333 l +h +-1 0 m +-2 0.333 l +-2 -0.333 l +h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\renewcommand\rmdefault{cmss} +\makeatletter +\leftmargini 1.5em +\leftmargin \leftmargini +\leftmarginii 1.2em +\leftmarginiii 1em +\def\@listI{\leftmargin\leftmargini + \parsep \z@ + \partopsep 3pt + \topsep \z@ + \itemsep \z@} +\@listI +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \z@ + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep + \topsep \z@ + \parsep \z@ + \partopsep \z@ + \itemsep \topsep} +\makeatother + + + + + + + + + +Some Preliminaries +\begin{itemize} +\item This description corresponds to the {\tt RU-RAU-split} branch for RAN infrastructure components (located in {\tt targets/DOCS/oai\_L1\_L2\_procedures.pdf}, editable with {\tt ipe}) +\item we describe +\begin{enumerate} +\item node functions +\item current functional splits and packet formats +\item RAN procedures +\item process scheduling +\end{enumerate} +\end{itemize} + + + + + +NGFI Harmonization in OAI +\small +\begin{itemize} +\item New descriptions for OAI RAN infrastructure Node Functions +\begin{itemize} +\item{\tt NGFI\_RCC} : Radio Cloud Center +\item{\tt NGFI\_RAU} : Radio Aggregation Unit +\item{\tt NGFI\_RRU} : Remote Radio Unit +\item{\tt 3GPP\_BBU} : Baseband Unit +\item{\tt 3GPP\_eNodeB} : Complete eNodeB +\end{itemize} +\end{itemize} +\small Source: China Mobile - {\tt http://www.windriver.com.cn/windforum/download/wf2015\_networking03.pdf} + + + + + +\small\begin{itemize} +\item Current OAI implementation (RRU/RCC) supports either +\begin{itemize} +\item IF5 time-domain fronthaul ($>$ 1 GbE required) +\item IF4.5 split (FFTs) (280 Mbit/s/antenna port fronthaul – 20 MHz carrier) per carrier/sector +\item Soon IF2 (NFAPI) +\item IF1’ for “PDCP/RRC� soon (3GPP Fh-C/Fh-U) +\end{itemize} +\end{itemize} +NGFI split points + + + + + + +OAI RAN Software Architecture + + + + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +528 64 m +528 32 l +640 32 l +640 64 l +h + + +528 64 m +528 32 l +640 32 l +640 64 l +h + + +528 101 m +528 48 l +736 48 l +736 101 l +h + + +392 376 m +392 296 l +512 296 l +512 376 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +392 376 m +392 296 l +512 296 l +512 376 l +h + + +136 312 m +136 272 l +200 272 l +200 312 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + +\tiny\bf LTE\\ +MODEM + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + + +96 408 m +96 360 l +208 360 l +208 408 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + +\tiny\bf LTE/NR/NB\\ +PDCP + +128 320 m +128 280 l +192 280 l +192 320 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + +\tiny\bf LTE\\ +RRC + +112 464 m +112 440 l +648 440 l +648 464 l +h + + +432 224 m +432 224 l +432 224 l +432 224 l +h + +\bf OSS/BSS/MEC + +192 296 m +232 296 l +232 404 l +256 404 l + + +144 288 m +144 320 l + + +384 368 m +448 368 l + + +384 352 m +448 352 l + + +152 456 m +152 368 l + + +304 456 m +304 408 l + + +456 456 m +456 416 l + + +600 456 m +600 409 l + + +512 368 m +576 368 l + + +512 352 m +576 352 l + + +88 384 m +8 384 l + + +128 264 m +8 264 l + +OAI Functional Splits + +576 384 m +576 336 l +640 336 l +640 384 l +h + +\bf\tiny LTE-L1 + +192 368 m +96 368 l + + +192 368 m +96 368 l + + +192 368 m +96 368 l + +\bf\tiny Management +\bf\tiny data (user/control plane) +\bf\tiny configuration + +576 384 m +576 336 l +640 336 l +640 384 l +h + +\tiny\bf LTE\\ +MAC-RLC + +288 432 m +288 432 l +288 432 l +288 432 l +h + + +240 460 m +240 40 l +520 40 l +520 460 l +h + + +384 416 m +384 416 l +384 416 l +384 416 l +h + + +560 416 m +560 336 l +656 336 l +656 416 l +h + + +88 456 m +88 40 l +216 40 l +216 221 l +216 261 l +216 456 l +100.8 456 l +88 456 l + +\bf\tiny Radio-Cloud Center (RCC) +\tiny\bf Radio-Access Unit (RAU) + +136 248 m +136 208 l +200 208 l +200 248 l +h + + +128 256 m +128 216 l +192 216 l +192 256 l +h + +\tiny\bf NR\\ +RRC + +128 229 m +112 229 l +112 261 l +112 360 l + + +488 368 m +488 304 l +504 304 l +504 368 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + + +384 368 m +448 368 l + + +384 352 m +448 352 l + + +576 384 m +576 336 l +640 336 l +640 384 l +h + +\bf\tiny NR-L1 +\tiny\bf NR\\ +MAC-RLC + +488 368 m +488 304 l +504 304 l +504 368 l +h + +\tiny PRECODE +\tiny PRECODE + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + +\tiny\bf NR\\ +MODEM + +512 368 m +576 368 l + + +512 352 m +576 352 l + + +560 231 m +560 160 l +656 160 l +656 231 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + + +336 264 m +536 264 l + + +336 248 m +536 248 l + + +576 384 m +576 336 l +640 336 l +640 384 l +h + +\bf\tiny LTE-L1 + +576 384 m +576 336 l +640 336 l +640 384 l +h + +\tiny\bf LTE\\ +MAC-RLC + +488 368 m +488 304 l +504 304 l +504 368 l +h + +\tiny PRECODE + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + +\tiny\bf LTE\\ +MODEM + +232 264 m +256 264 l + + +256 424 m +224 424 l +224 316 l +256 316 l + + +64 264 m +64 264 l + + +528 288 m +528 208 l +736 208 l +736 288 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + +\tiny\bf NR\\ +MAC-RLC + +576 384 m +576 336 l +640 336 l +640 384 l +h + +\tiny\bf NB-IoT\\ +MAC-RLC + +128 264 m +8 264 l + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + + +336 264 m +536 264 l + + +336 248 m +536 248 l + + +576 384 m +576 336 l +640 336 l +640 384 l +h + +\bf\tiny NR-L1 + +488 368 m +488 304 l +504 304 l +504 368 l +h + +\tiny PRECODE + +576 384 m +576 336 l +640 336 l +640 384 l +h + + +624 336 m +624 336 l +624 336 l +624 336 l +h + + +608 336 m +608 336 l +608 336 l +608 336 l +h + +\tiny\bf NR\\ +MODEM + +528 288 m +528 208 l +736 208 l +736 288 l +h + +\tiny\bf Remote Radio-Unit (RRU) + +336 72 m +576 72 l + + +336 86 m +576 88 l + + +576 384 m +576 336 l +640 336 l +640 384 l +h + +\tiny\bf NB-IoT\\ +RRC + +128 264 m +8 264 l + + +104 360 m +104 88 l +120 88 l + + +192 88 m +256 88 l + + +528 64 m +528 32 l +640 32 l +640 64 l +h + +\tiny\bf NB-IoT\\ +L1/MODEM + +224 384 m +208 384 l + + +192 240 m +256 240 l + + +232 240 m +232 168 l +256 168 l + + +224 192 m +224 192 l + + +224 192 m +224 192 l + + +224 312 m +224 72 l +256 72 l + + + + + +OAI Functional Splits +\tiny\begin{itemize} +\item OAI currently implements the following entities in openairinterface5g +\begin{itemize} +\item LTE-MODEM (eNB 36.211 OFDM modulation/demodulation) +\item LTE-L1 (eNB 36.211/212/213) +\item LTE-MACRLC (eNB 36.321/322) +\item LTE-PDCP (eNB PDCP/GTPU 36.323) +\item LTE-RRC (eNB RRC/SCTP 36.331) +\end{itemize} +\item Each entity comprises +\begin{itemize} +\item a northbound interface (backhaul/midhaul/fronthaul and configuration) +\item a southbound interface (midaul/fronthaul and configuration) +\item one or two management interfaces +\item Three computing nodes +\begin{itemize} +\item {\bf Radio Cloud Center (RCC)} : multiple RRC/PDCP entities +\item {\bf Radio-Access Unit (RAU)}: multiple MACRLC entities with medium-latency midhaul and L1 entities with low-latency fronthaul. +\item {\bf Remote Radio-Unit (RRU)}: Equipment at radio site. Varying degrees of processing elements depending on fronthaul/midhaul interface. +\end{itemize} +\end{itemize} +\item Each entity has a configuration which is a local file or received via the management interface +\item default interface between all entities is implemented using a UDP socket. Transport is configurable via a dynamically-loadable networking device +\end{itemize} + +288 192 m +288 64 l +432 64 l +432 192 l +h + +OAI entity + +336 171 m +336 208 l + + +384 171 m +384 208 l + + +336 171 m +336 208 l + + +384 171 m +384 208 l + + +240 80 m +288 80 l + + +240 80 m +288 80 l + + +16 0 0 16 288 224 e + + +16 0 0 16 288 224 e + +\tiny\bf Northbound interface +\tiny\bf Southbound interface +\tiny\bf data +\tiny\bf data +\tiny\bf in-band configuration +\tiny\bf in-band configuration +\tiny\bf OSS/BSS +\tiny\bf FlexRAN + +240 80 m +288 80 l + +\tiny\tt .conf + + + + + +511.895 513.539 m +511.895 14.2386 l +734.284 14.2386 l +734.284 513.539 l +h + + +511.895 513.539 m +511.895 14.2386 l +734.284 14.2386 l +734.284 513.539 l +h + + +511.895 513.539 m +511.895 14.2386 l +734.284 14.2386 l +734.284 513.539 l +h + + +16 432 m +16 112 l +192 112 l +192 432 l +h + + +16 432 m +16 112 l +192 112 l +192 432 l +h + +Functional Splits (Current) + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP TX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP RX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +RRC +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +GTP-C +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +GTP-U +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX +\end{tiny} + + +384 432 m +384 384 l + + +384 432 m +384 384 l + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt rf\_device} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP TX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP RX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +RRC +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +GTP-C +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +GTP-U +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + +3GPP\_eNodeB +3GPP\_BBU +\tiny to MME +\tiny to S-PGw + +384 432 m +384 384 l + + +384 432 m +384 384 l + +\tiny to MME +\tiny to S-PGw + +160 112 m +160 112 l +160 112 l +160 112 l +h + + +144 112 m +144 112 l +144 112 l +144 112 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt USB3 or PCIe} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt NFGI\_IF5 / ethernet} +\end{tiny} + + +16 432 m +16 112 l +192 112 l +192 432 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP TX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP RX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +RRC +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +GTP-C +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +GTP-U +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +upper-PHY RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + +NGFI\_RCC (IF4.5) + +384 432 m +384 384 l + + +384 432 m +384 384 l + +\tiny to MME +\tiny to S-PGw + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt NFGI\_IF4p5 / ethernet} +\end{tiny} + +\setstretch{.5}\begin{tiny} +upper-PHY TX +\end{tiny} + + +384 432 m +384 384 l + +\tiny to NGFI\_RRU + +384 432 m +384 384 l + +\tiny to NGFI\_RRU or RRH\_gw + +384 432 m +384 384 l + +\tiny to RF Device + + + + + +1.83417 462.604 m +1.83417 50.8252 l +207.006 50.8252 l +207.006 462.604 l +h + + +1.83417 462.604 m +1.83417 50.8252 l +207.006 50.8252 l +207.006 462.604 l +h + + +16 432 m +16 112 l +192 112 l +192 432 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP TX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP RX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +RRC +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +GTP-C +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +GTP-U +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + +NGFI\_RCC (IF1'') + +384 432 m +384 384 l + + +384 432 m +384 384 l + +\tiny to MME +\tiny to S-PGw + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt NFGI\_IF1pp} / ethernet +\end{tiny} + + +16 432 m +16 112 l +192 112 l +192 432 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +RRC +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +GTP-C +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +GTP-U +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + +NGFI\_RCC (IF1') + +384 432 m +384 384 l + + +384 432 m +384 384 l + +\tiny to MME +\tiny to S-PGw + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt NFGI\_IF1p} / ethernet +\end{tiny} + +\tiny to NGFI\_RRU + +384 432 m +384 384 l + +\tiny to NGFI\_RAU + +384 432 m +384 384 l + +\tiny to NGFI\_RAU +Functional Splits (Current) + +1.83417 462.604 m +1.83417 50.8252 l +207.006 50.8252 l +207.006 462.604 l +h + + +16 432 m +16 112 l +192 112 l +192 432 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +upper-PHY RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + +NGFI\_RAU(IF1'') + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt NFGI\_IF4p5 / ethernet} +\end{tiny} + +\setstretch{.5}\begin{tiny} +upper-PHY TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt NFGI\_IF1pp / ethernet} +\end{tiny} + + +384 432 m +384 384 l + +\tiny to NGFI\_RCC + +384 432 m +384 384 l + +\tiny to NGFI\_RRU + + + + + +1.83417 462.604 m +1.83417 50.8252 l +207.006 50.8252 l +207.006 462.604 l +h + + +1.83417 462.604 m +1.83417 50.8252 l +207.006 50.8252 l +207.006 462.604 l +h + + +1.83417 462.604 m +1.83417 50.8252 l +207.006 50.8252 l +207.006 462.604 l +h + + +16 432 m +16 112 l +192 112 l +192 432 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + +NGFI\_RRU (IF5) + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt NFGI\_IF5/ ethernet} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt rf\_device} +\end{tiny} + +NGFI\_RRU (IF4.5) + +384 432 m +384 384 l + +\tiny to NGFI\_RCC, NGFI\_RAU,3GPP\_BBU + +384 432 m +384 384 l + +\tiny to RF Device + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt USB3, PCIe, CPRI} +\end{tiny} + + +16 432 m +16 112 l +192 112 l +192 432 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt NFGI\_IF4p5/ ethernet} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt rf\_device} +\end{tiny} + + +384 432 m +384 384 l + +\tiny to NGFI\_RCC, NGFI\_RAU + +384 432 m +384 384 l + +\tiny to RF Device + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt USB3, PCIe, CPRI} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +lower-PHY RX +\end{tiny} + +\setstretch{.5}\begin{tiny} +lower-PHY TX +\end{tiny} + + +16 432 m +16 112 l +192 112 l +192 432 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + +\setstretch{.5}\begin{tiny} +upper-PHY TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt NFGI\_IF1pp\_4P5 / ethernet} +\end{tiny} + + +384 432 m +384 384 l + +\tiny to NGFI\_RCC, NGFI\_RAU + +384 432 m +384 384 l + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt USB3, PCIe, CPRI} +\end{tiny} + +\tiny to RF Device +Functional Splits (Current) +NGFI\_RRU\par +(IF1'') + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +lower-PHY RX +\end{tiny} + +\setstretch{.5}\begin{tiny} +lower-PHY TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +upper-PHY RX +\end{tiny} + + + + + +Some Notes on usage of splits +\tiny\begin{itemize} +\item IF4p5 corresponds to the split-point at the input (TX) and output (RX) of the OFDM symbol generator (i.e. frequency-domain signals). According to NGFI, IF4 is "Resource mapping and IFFT" and "FFT and Resource demapping". We currently do not try to exploit multiplexing gains for unused spectral components. So, IF4p5 is simply compressed transmitted or received resource elements in the usable channel band. +\item The simplest deployment for DAS (indoor) is one NGFI\_RCC (IF4p5) and many NGFI\_RRU (IF4p5). Spatio-temportal filtering (Precoding, later) is done in RCC and RRU perform IFFT/FFT and signal generation/acquisition. Fronthaul rates in this case are feasible with 1GbE copper links. This allows for PoE in addition to fronthaul data. +\item More complex indoor, for instance with RCC in a common data center with outdoor RRS, could be +\begin{enumerate} + \item RCC-RAU with IF1'', RAU-RRU with IF4p5. Spatio-temporal filtering is done in frequency-domain in RAU along with full TX and RX processing (L1/L2) for the indoor RRS. Note that IF1' fronthaul on TX to RRU would be difficult because spatio-temporal filtering should be used. RRU does only IFFT/FFT and signal generation/acquisition +\item RCC-RAU with IF1', RAU-RRU with IF4p5. Here RCC does L2, RAU does L1 and precoding for RRS. +\end{enumerate} +\item A massive-MIMO solution would consist either of +\begin{enumerate} +\item an embedded RAU with processing (Spatio-temporal in frequency-domain, lower/upper PHY TX/RX) like the IF1' DAS solution above +\item or more simply a high-speed fronthaul (IF4p5) with an RAU for multiple sites +\item directly connected to RCC via high-speed IF4p5 (several virtual cells, precoder and IFFT/FFT in array). +\end{enumerate} +\item RCC solution with IF1'' would cater to evolved-PDCP for heterogenity (4G,5G,WIFI,IoT) +\item Currently supported node functionalities +\begin{enumerate} +\item {\tt 3GPP\_eNodeB} +\item {\tt 3GPP\_eNodeB\_BBU} [NGFI\_IF5] +\item {\tt NGFI\_RCC} [NGFI\_IF4p5] +\item {\tt NGFI\_RRU} [NGFI\_IF5] +\item {\tt NGFI\_RRU} [NGFI\_IF4p5] +\end{enumerate} +\end{itemize} + + + + +RU - L1 negotiation + +64 448 m +64 256 l +256 256 l +256 448 l +h + + +64 448 m +64 256 l +256 256 l +256 448 l +h + +RRU Entity +RAU/RCC Entity + +544 192 m +544 256 l + + +256 320 m +448 320 l + + +448 288 m +256 288 l + + +544 192 m +544 256 l + +\tiny\tt .conf +\tiny\tt .conf +\tiny\tt fronthaul data (IF5,IF4p5) + +256 320 m +448 320 l + + +448 288 m +256 288 l + +\tiny\tt RRU control/config +\begin{small} +Control and Configuration protocol +\begin{enumerate} +\item RAU$\rightarrow$ RRU : heartbeat (capabilities request) +\item RRU$\rightarrow$ RAU: capabilities indication +\item RAU$\rightarrow$ RRU: configuration (band, dl\_Carrier,ul\_Carrier, dl\_RS\_EPRE, rx/tx attenuation) +\end{enumerate} +\end{small} +During steady state, the control port manages the link quality and status (packet losses, synchronization state, start/stop, etc.) + + + + +\begin{small} +\begin{itemize} +\item IF5 interface +\begin{itemize} +\item DL subframes with timestamp (16-bit samples) +\item UL subframes with timestamp (16-bit samples) +\item optional A-law compression (13$\rightarrow$8bit) +\end{itemize} +\item IF4p5 interface +\begin{itemize} +\item DL packets, ofdm symbols with frame/subframe/symbol count +\item UL packets, ofdm symbols with frame/subframe/symbol count (16-bit) +\item UL PRACH packets with frame/subframe count (16-bit) +\item optional A-law compression (13$\rightarrow$8bit) +\end{itemize} +\end{itemize} +\end{small} +RU - L1 data plane + + + + + +544 288 m +544 256 l +704 256 l +704 288 l +h + +IF5 Packet Format (16-bit) + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + +0 +16 +32 +48 +15 +31 +47 +63 + +64 320 m +64 288 l +544 288 l +544 320 l +h + + +544 320 m +544 288 l +704 288 l +704 320 l +h + + +64 288 m +64 256 l +384 256 l +384 288 l +h + + +384 288 m +384 256 l +544 256 l +544 288 l +h + + +544 288 m +544 256 l +704 256 l +704 288 l +h + +\small Destination Address +\small Source +\small Type (0x1234) +\small RF Config +\small Address + +64 160 m +64 128 l +384 128 l +384 160 l +h + +\small Frame Check Sequence + +256 240 m +256 240 l +256 240 l + +\small Timestamp + +5 63.5079 m +5 46.9999 l +645 46.9999 l +645 63.5079 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +256 240 m +256 240 l +256 240 l + + +166 304 m +165.917 272.508 l +166.247 272.508 l + + +486 304 m +486.316 272.508 l +485.986 272.508 l + + +486.316 256 m +486.646 224 l +485.657 224 l + + +486.316 256 m +486.646 224 l +485.657 224 l + +\tiny $I_0$ +\tiny $Q_0$ +\tiny $I_1$ +\tiny $Q_1$ +\tiny $Q_{N-2}$ +\tiny $Q_{N-2}$ +\tiny $I_{N-1}$ +\tiny $Q_{N-1}$ +\tiny +\begin{itemize} +\item {\bf Type:} 2 byte (16 bit) field that specifies the RoE protocol +\item {\bf RX Config:} 16-bit. Currently just antenna index (0-7). Can later be used for gain/timing adjustments. +\item {\bf Timstamp:} Timestamp in samples of the first sample of the received packet. +\end{itemize} +\begin{itemize} +\item {\bf data block :} Uncompressed IQ samples, 16-bit resolution for each real and imaginary component. $N$ complex samples per packet. $N$ can be configured at initialization. +\end{itemize} + + + + +IF5 Packet Format (8-bit) + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + +0 +16 +32 +48 +15 +31 +47 +63 + +64 320 m +64 288 l +544 288 l +544 320 l +h + + +544 320 m +544 288 l +704 288 l +704 320 l +h + + +64 288 m +64 256 l +384 256 l +384 288 l +h + + +384 288 m +384 256 l +544 256 l +544 288 l +h + + +544 288 m +544 256 l +704 256 l +704 288 l +h + + +384 256 m +384 224 l +704 224 l +704 256 l +h + +\small Destination Address +\small Source +\small Type (0xBEEF) +\small RX Flags +\small Address + +544 288 m +544 256 l +704 256 l +704 288 l +h + +\small FIFO\_status + +544 288 m +544 256 l +704 256 l +704 288 l +h + +\tiny SeqNum +\tiny rsvd + +248.997 435.732 m +248.997 403.732 l + +\small Word0 + +5 63.5079 m +5 46.9999 l +645 46.9999 l +645 63.5079 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +166 304 m +165.917 272.508 l +166.247 272.508 l + + +486 304 m +486.316 272.508 l +485.986 272.508 l + + +486.316 256 m +486.646 224 l +485.657 224 l + +\tiny $I_0$ + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + +\tiny $Q_0$ +\tiny $I_1$ +\tiny $Q_1$ +\tiny $I_2$ +\tiny $Q_2$ +\tiny $I_3$ +\tiny $Q_3$ +\tiny $I_{638}$ +\tiny $Q_{638}$ +\tiny $I_{639}$ +\tiny $Q_{639}$ +\tiny +\begin{itemize} +\item {\bf Type:} 2 byte (16 bit) field that specifies the RoE protocol +\item {\bf RX Flags:} overrun indicator. should be '0'. +\item {\bf FIFO status:} 2 bytes. should be '0'. +\item {\bf SeqNum:} 1 byte. Sequence number of the ethernet packet. +\item {\bf rsvd:} 1 byte. shoult be '0'. \item {\bf Word0:} 4 byte (32-bit). should be '0'. +\item {\bf Timstamp:} Timestamp in samples of the first sample of the received packet. \end{itemize} +\begin{itemize} +\item {\bf data block :} Uncompressed IQ samples, 8-bit resolution for each real and imaginary component. 640 complex samples per packet. +\end{itemize} + +384 256 m +384 224 l +704 224 l +704 256 l +h + +\small Timestamp + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +486 304 m +486.316 272.508 l +485.986 272.508 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + +\tiny $I_4$ +\tiny $Q_4$ +\tiny $I_5$ +\tiny $Q_5$ + +64 160 m +64 128 l +384 128 l +384 160 l +h + +\small Frame Check Sequence + + + + +IF4p5 Packet Formats (RAW) + +272 512 m +272 512 l +272 512 l +272 512 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + +0 +16 +32 +48 +15 +31 +47 +63 + +64 320 m +64 288 l +544 288 l +544 320 l +h + + +544 320 m +544 288 l +704 288 l +704 320 l +h + + +64 288 m +64 256 l +384 256 l +384 288 l +h + + +384 288 m +384 256 l +544 256 l +544 288 l +h + + +544 288 m +544 256 l +704 256 l +704 288 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +384 256 m +384 224 l +704 224 l +704 256 l +h + + +64 160 m +64 96 l +704 96 l +704 160 l +h + +\small Destination Address +\small Source +\small Type (0x080A) +\small Subtype (0x0021) +\small Address +\small LTE PRACH Configuration +\small Reserved +\small PRACH data block (one antenna) + +64 160 m +64 128 l +384 128 l +384 160 l +h + +\small Frame Check Sequence + +384 160 m +384 128 l +704 128 l +704 160 l +h + +IF4p5 PRACH Packet (RRU$\rightarrow$ RAU,RCC) +\tiny +\begin{itemize} +\item {\bf Type:} 2 byte (16 bit) field that specifies the RoE protocol +\item {\bf Subtype:} 2 byte (16 bit) field that specifies the packet subtype +\item {\bf Reserved:} 4 byte (32 bit) field reserved +\item {\bf LTE PRACH conf:} 4 byte (32-bit) field that details the configuration of the LTE PRACH packet +\end{itemize} +\vskip 3pt +\begin{tabular}{|c|c|} +\hline +{\bf field (0 is LSB, 31 is MSB)} & {\bf description}\\ \hline +rsvd (0:2) & Reserved.\\ \hline +ant (3:5) & 3-bit Antenna index of LTE PRACH packet\\ \hline +RF Num (6:21) & 16-bit field indicating the Radio Frame number of this received PRACH packet\\ \hline +SF Num (22:25) & 4-bit field indicating the sub-frame number in the radio frame for the LTE PRACH packet\\ + & Valid range of 0 to 9.\\ \hline +Exponent (26:31) & FFT exponent output (0 if unscaled) \\ +\hline +\end{tabular} +\begin{itemize} +\item {\bf PRACH data block:} Uncompressed IQ samples +\end{itemize} + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + +\tiny RE 0 (Real) +\tiny RE 0 (Imag) +\tiny RE 1 (Real) +\tiny RE 1 (Imag) + +166 304 m +165.917 272.508 l +166.247 272.508 l + + +486 304 m +486.316 272.508 l +485.986 272.508 l + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + +\tiny RE 837 (Real) +\tiny RE 837 (Imag) +\tiny RE 838 (Real) +\tiny RE 838 (Imag) + +166 304 m +165.917 272.508 l +166.247 272.508 l + + +486 304 m +486.316 272.508 l +485.986 272.508 l + + +6.00001 47.492 m +6.00001 32 l +646 32 l +646 47.492 l +h + + +528 16 m +528 16 l +528 16 l +528 16 l +h + + +560 16 m +560 16 l +560 16 l +560 16 l +h + + + + + + +64 224 m +64 192 l +224 192 l +224 224 l +h + + +224 224 m +224 192 l +384 192 l +384 224 l +h + + +384 224 m +384 192 l +544 192 l +544 224 l +h + + +544 224 m +544 192 l +704 192 l +704 224 l +h + + +64 192 m +64 160 l +224 160 l +224 192 l +h + + +224 192 m +224 160 l +384 160 l +384 192 l +h + + +384 192 m +384 160 l +544 160 l +544 192 l +h + + +544 192 m +544 160 l +704 160 l +704 192 l +h + +\small Gain 0 +\small Gain 1 +\small Gain 4 +\small Gain 5 +\small Gain 2 +\small Gain 3 +\small Gain 6 +\small Gain 7 + +272 512 m +272 512 l +272 512 l +272 512 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + +0 +16 +32 +48 +15 +31 +47 +63 + +64 320 m +64 288 l +544 288 l +544 320 l +h + + +544 320 m +544 288 l +704 288 l +704 320 l +h + + +64 288 m +64 256 l +384 256 l +384 288 l +h + + +384 288 m +384 256 l +544 256 l +544 288 l +h + + +544 288 m +544 256 l +704 256 l +704 288 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +384 256 m +384 224 l +704 224 l +704 256 l +h + +\small Destination Address +\small Source +\small Type (0x080A) +\small Subtype (0x0019) +\small Address +\small Frame status +\small Reserved + +64 160 m +64 128 l +384 128 l +384 160 l +h + +\small Frame Check Sequence +\tiny +\begin{itemize} +\item {\bf Type:} 2 byte (16 bit) field that specifies the RoE protocol +\item {\bf Subtype:} 2 byte (16 bit) field that specifies the packet subtype +\item {\bf Reserved:} 4 byte (32 bit) field reserved +\item {\bf Frame Status:} 4 byte (32 bit) field +\end{itemize} +\vskip 3pt +\begin{tabular}{|c|c|} +\hline +{\bf field (0 is LSB, 31 is MSB)} & {\bf description}\\ \hline +{\bf ant} (0:2) & The number of Antenna Carriers represented in the packet. Antenna numbers \\ +& range from 0 to 7 with valid inputs being 0,1, 3 and 7 (1,2,4,8 antennas)\\ \hline +{\bf ant start} (3:5) & starting antenna number\\ \hline +{\bf RF Num} (6:21) & 16-bit field indicating the Radio Frame number of the UL\_RE samples\\ \hline +{\bf SF Num} (22:25) & 4-bit field indicating the sub-frame number in the radio frame for the UL\_RE samples\\ + & Valid range of 0 to 9.\\ \hline +{\bf Sym Num:} (26:29) & Symbol number. Valid range of 0 to 13. \\ +{\bf rsvd:} (30:31) & reserved\\ +\hline +\end{tabular} +\begin{itemize} +\item {\bf ULRE data block:} compressed IQ samples (8-bit A-law). $N$ is the number of resource elements $N_{\mathrm{RB}}^{\mathrm{UL}}$. +\end{itemize} + +5 63.5079 m +5 46.9999 l +645 46.9999 l +645 63.5079 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + +IF4p5 Packets : ULRE (RRU$\rightarrow$ RAU,RCC) + +256 240 m +256 240 l +256 240 l + + +166 304 m +165.917 272.508 l +166.247 272.508 l + + +486 304 m +486.316 272.508 l +485.986 272.508 l + + +486.316 256 m +486.646 224 l +485.657 224 l + + +486.316 256 m +486.646 224 l +485.657 224 l + + +258.16 141.771 m +258.16 141.771 l + + +418.597 191.907 m +418.597 191.907 l + + +429.181 79.9357 m +429.181 79.9357 l + +\tiny RE 0\\Ant 1 (Re) +\tiny RE 0\\Ant 1 (Im) +\tiny RE 1\\Ant 1 (Re) +\tiny RE 1\\Ant 1 (Im) +\tiny RE 2\\Ant 1 (Re) +\tiny RE 2\\Ant 1 (Im) +\tiny RE 3\\Ant 1 (Re) +\tiny RE 3\\Ant 1 (Im) +\tiny RE $N-4$\\Ant $R$ (Re) +\tiny RE $N-4$\\Ant $R$ (Im) +\tiny RE $N-3$\\Ant $R$ (Re) +\tiny RE $N-3$\\Ant $R$ (Im) +\tiny RE $N-2$\\Ant $R$ (Re) +\tiny RE $N-2$\\Ant $R$ (Im) +\tiny RE $N-1$\\Ant $R$ (Re) +\tiny RE $N-1$\\Ant $R$ (Im) + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + + + + + +272 512 m +272 512 l +272 512 l +272 512 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + + +64 352 m +64 320 l +224 320 l +224 352 l +h + +0 +16 +32 +48 +15 +31 +47 +63 + +64 320 m +64 288 l +544 288 l +544 320 l +h + + +544 320 m +544 288 l +704 288 l +704 320 l +h + + +64 288 m +64 256 l +384 256 l +384 288 l +h + + +384 288 m +384 256 l +544 256 l +544 288 l +h + + +544 288 m +544 256 l +704 256 l +704 288 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +384 256 m +384 224 l +704 224 l +704 256 l +h + +\small Destination Address +\small Source +\small Type (0x080A) +\small Subtype (0x0020) +\small Address +\small Frame status +\small Reserved + +64 160 m +64 128 l +384 128 l +384 160 l +h + +\small Frame Check Sequence +\tiny +\begin{itemize} +\item {\bf Type:} 2 byte (16 bit) field that specifies the RoE protocol +\item {\bf Subtype:} 2 byte (16 bit) field that specifies the packet subtype +\item {\bf Reserved:} 4 byte (32 bit) field reserved +\item {\bf Frame Status:} 4 byte (32 bit) field +\end{itemize} +\vskip 3pt +\begin{tabular}{|c|c|} +\hline +{\bf field (0 is LSB, 31 is MSB)} & {\bf description}\\ \hline +{\bf ant} (0:2) & The number of Antenna Carriers represented in the packet. Antenna numbers \\ +& range from 0 to 7 with valid inputs being 0,1, 3 and 7 (1,2,4,8 antennas)\\ \hline +{\bf ant start} (3:5) & starting antenna number\\ \hline +{\bf RF Num} (6:21) & 16-bit field indicating the Radio Frame number of this DLRE packet\\ \hline +{\bf SF Num} (22:25) & 4-bit field indicating the sub-frame number in the radio frame for the DLRE packet\\ + & Valid range of 0 to 9.\\ \hline +{\bf Sym Num:} (26:29) & Symbol number. Valid range of 0 to 13. \\ +{\bf rsvd:} (30:31) & reserved\\ +\hline +\end{tabular} +\begin{itemize} +\item DLRE data block : compressed IQ samples (8-bit A-law). $N$ is the number of resource elements $N_{\mathrm{RB}}^{\mathrm{DL}}$. +\end{itemize} +IF4p5 Packets : DLRE (RAU,RCC $\rightarrow$RRU) + +258.16 141.771 m +258.16 141.771 l + + +418.597 191.907 m +418.597 191.907 l + + +429.181 79.9357 m +429.181 79.9357 l + + +5 63.5079 m +5 46.9999 l +645 46.9999 l +645 63.5079 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +64 256 m +64 224 l +384 224 l +384 256 l +h + + +166 304 m +165.917 272.508 l +166.247 272.508 l + + +486 304 m +486.316 272.508 l +485.986 272.508 l + + +486.316 256 m +486.646 224 l +485.657 224 l + + +486.316 256 m +486.646 224 l +485.657 224 l + +\tiny RE 0\\Ant 1 (Re) +\tiny RE 0\\Ant 1 (Im) +\tiny RE 1\\Ant 1 (Re) +\tiny RE 1\\Ant 1 (Im) +\tiny RE 2\\Ant 1 (Re) +\tiny RE 2\\Ant 1 (Im) +\tiny RE 3\\Ant 1 (Re) +\tiny RE 3\\Ant 1 (Im) +\tiny RE $N-4$\\Ant $R$ (Re) +\tiny RE $N-4$\\Ant $R$ (Im) +\tiny RE $N-3$\\Ant $R$ (Re) +\tiny RE $N-3$\\Ant $R$ (Im) +\tiny RE $N-2$\\Ant $R$ (Re) +\tiny RE $N-2$\\Ant $R$ (Im) +\tiny RE $N-1$\\Ant $R$ (Re) +\tiny RE $N-1$\\Ant $R$ (Im) + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + +248.997 435.732 m +248.997 403.732 l + + + + + + +640 128 m +640 32 l +704 32 l +704 128 l +h + + +640 480 m +640 176 l +720 176 l +720 480 l +h + + +328.159 119.72 m +328.159 15.3556 l +554.022 15.3556 l +554.022 119.72 l +h + + +96 784 m +96 496 l +224 496 l +224 784 l +h + + +-192 928 m +-192 944 l +-192 944 l +-192 928 l +h + + +96 784 m +96 496 l +224 496 l +224 784 l +h + +\begin{small}L1 Instance 0\end{small} +LI instance 1 +\begin{small}MAC/RLC/PDCP Instance 0\end{small} + +364 518 m +364 518 l +364 518 l +364 518 l +h + + +96 784 m +96 496 l +224 496 l +224 784 l +h + + +128 768 m +128 704 l +192 704 l +192 768 l +h + +\setstretch{.5}\begin{tiny} +DL/UL Scheduler +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP TX +\end{tiny} + + +180 460 m +340 460 l + + +180 460 m +340 460 l + +\begin{tiny}1ms TICK\end{tiny} + +392.067 448.35 m +232.502 360 l + +\begin{tiny}$\mathrm{DCI}_0$, Transport Blocks\end{tiny} + +\begin{tiny}$\mathrm{DCI}_1$\end{tiny} + +\begin{tiny}$\mathrm{DCI}_2$\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC RX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX $n$\\ +$\mathrm{eNB}_0$ +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX $n$\\ +$\mathrm{eNB}_1$ +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX $n$\\ +$\mathrm{eNB}_2$ +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX $n+4$\\ +$\mathrm{eNB}_0$ +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX $n+4$\\ +$\mathrm{eNB}_1$ +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX $n+4$\\ +$\mathrm{eNB}_2$ +\end{tiny} + + +234.502 211.006 m +387 210 l + + +243.386 213.48 m +243.386 213.48 l + + +232.502 250.102 m +387.004 250.371 l + + +232.502 310 m +387 310 l + + +232.502 346.88 m +387 347 l + + +336.917 451.424 m +185.872 274.589 l + + +232.5 410 m +386.079 409.083 l + +\begin{tiny}Transport Blocks\end{tiny} + +\begin{tiny}Transport Blocks\end{tiny} + +\setstretch{.5}\begin{tiny}CQI/SR/ACK/NAK/PHR\\Transport Blocks\end{tiny} +\setstretch{.5}\begin{tiny}CQI/SR/ACK/NAK/PHR\\Transport Blocks\end{tiny} +\setstretch{.5}\begin{tiny}CQI/SR/ACK/NAK/PHR\\Transport Blocks\end{tiny} + +180 460 m +340 460 l + + +180 460 m +340 460 l + +\begin{tiny}1ms TICK\end{tiny} +\begin{tiny}$\mathrm{DCI}_0$, Transport Blocks\end{tiny} + + +184.502 313 m +332 313 l + +\begin{small}MAC/RLC/PDCP Instance 1\end{small} + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP TX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP TX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP RX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP RX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX \\ +$\mathrm{eNB}_0$ +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX \\ +$\mathrm{eNB}_0$ +\end{tiny} + +\setstretch{.5}\begin{tiny}CQI/SR/ACK/NAK/PHR\\Transport Blocks\end{tiny} + +128 768 m +128 704 l +192 704 l +192 768 l +h + +\setstretch{.5}\begin{tiny} +DL/UL Scheduler +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP RX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +MAC TX +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PDCP TX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC RX +\end{tiny} + +\setstretch{.5}\begin{tiny} +RLC TX +\end{tiny} + +RU/L1 Instances and Component Carriers + +96 784 m +96 496 l +224 496 l +224 784 l +h + + +96 784 m +96 496 l +224 496 l +224 784 l +h + + +364 518 m +364 518 l +364 518 l +364 518 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_3$ +\end{tiny} + + +144 480 m +144 32 l +176 32 l +176 480 l +h + + +176 432 m +176 432 l + + +192 464 m +176 464 l + + +190.041 464 m +190.041 464 l + + +190.041 464 m +190.041 464 l + + +192 464 m +176 464 l + + +192 464 m +176 464 l + + +192 464 m +176 464 l + + +192 464 m +176 464 l + + +192 464 m +176 464 l + + +192 464 m +176 464 l + + +192 464 m +176 464 l + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_0$ +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_1$ +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_2$ +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_4$ +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_5$ +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_6$ +\end{tiny} + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +144 464 m +129.959 464 l + + +640 400 m +640 400 l +640 400 l +640 400 l +h + + + + + +\small\begin{itemize} +\item {\em Radio Unit} (RU) is +\begin{itemize} +\item an entity managing a set of {\bf physical} antennas. It can have a {\em local RF unit} or {\em remote RF unit} +\item performs precoding of multiple eNB TX streams and OFDM modulation (TX) and demodulation (RX) (part of 36.211) +\end{itemize} +\item {\em L1 Instance} (indexed by {\tt Mod\_id}, or {\tt enb\_mod\_id}) is a separate set of threads and contexts for the eNB/gNB procedures. There is one MAC/RLC entity associated to all :1 component carriers. +\item {\em L1 Component Carrier} (indexed by {\tt CC\_id}) is +\begin{itemize} +\item a software entity managing the L1 procedures (36.213,36.212,36.211) and can act on +\begin{itemize} +\item sectored antenna component +\item Rel10+ component carrier +\item virtual cell for DAS or Massive-MIMO array +\end{itemize} +\item each L1 instance is managed by one or two threads which operate on a subframe (TX and RX) and can have a {\em local RU} or {\em remote RU} +\item if a remote radio unit the eNB performs the 36.213 specifications only (HARQ, etc.) and connects to the remainder via the IF2 midhaul interface. +\end{itemize} +\end{itemize} +RU/L1 Instances and Component Carriers + + + + +RU/L1 Instances and Component Carriers +\small\begin{itemize} +\item RU may have both an {\tt if\_device} for fronthaul and an {\tt rf\_device} for interconnection with a local RF unit +\item if the {\tt rf\_device} is absent, it must have a southbound fronthaul interface (either IF5 or IF4p5) depending on the local processing of the remote RU +\item if the {\tt if\_device} is absent, it must have a southbound RF interface and {\tt rf\_device}. +\item three types of L1 processing are performed by the RU \begin{itemize} +\item subset of common L1 procedures from 36.211 specifications +\item fronthaul compression/decompression +\item framing +\end{itemize} +\item on TX +\begin{itemize} +\item A-law compression for (NGFI\_RAU\_IF4p5, NGFI\_RAU\_IF5) +\item A-law decompression (for NGFI\_RRU\_IF4p5 and NGFI\_RRU\_IF5) +\item OFDM modulation and cyclic prefix insertion (for NGFI\_RRU\_IF4p5,NGFI\_RAU\_IF5,3GPP\_eNodeB\_BBU,3GPP\_eNodeB) +\item Precoding (for NGFI\_RAU\_IF5, NGFI\_RAU\_IF4p5,3GPP\_eNodeB\_BBU,3GPP\_eNodeB) +\end{itemize} +\end{itemize} + + + + +RU/L1 Instances and Component Carriers +\small\begin{itemize} +\item on RX +\begin{itemize} +\item A-law compression for (NGFI\_RRU\_IF4p5, NGFI\_RRU\_IF5) +\item A-law decompression (for NGFI\_RAU\_IF4p5 and 3GPP\_eNodeB\_BBU) +\item cyclic prefix removal, frequency-shifting, OFDM demodulation, PRACH DFT (for NGFI\_RRU\_IF4p5, NGFI\_RAU\_IF5, 3GPP\_eNodeB\_BBU, 3GPP\_eNodeB) +\end{itemize} +\item On TX path +\begin{itemize} +\item L1 instances/component carriers operate on a set of logical antenna ports (0-3 for TM1-6, 4 for eMBMS, 5 for TM7, 6 for positioning, 7-8 for TM8, etc.) +\item each L1 instance has a list of RUs and the logical antenna ports are mapped to the physical antennas attached to the RUs via the precoding function +\end{itemize} +\end{itemize} + + + + +\small\begin{itemize} +\item Example configurations +\begin{itemize} +\item {\em itsolated eNB:} one instance and one or several component carriers (multiple-frequencies or antenna sectors). Potentially multiple radio-units (for CoMP). Here there is a common MACRLC instnance driving multiple L1 procedures +\item {\em indoor DAS system (RCC split with L1/L2 RAU) Multiple layer 2 instances each driving one or more component carriers} here the RAU implements multiple L1/L2 instances and precoding function. Usually with IF2/IF1'' xhaul to RCC or potentially also MAC/RLC in RAU with IF1' xhaul to RCC. +\item {\em massive-MIMO array} same as 2nd indoor DAS system (i.e. integrated L1/L2 RAU with array) +\end{itemize} +\end{itemize} +RU/L1 Instances and Component Carriers + + + + + +288 384 m +288 96 l +672 96 l +672 384 l +h + + +301.83 142.941 m +301.83 103.286 l +648 104 l +648 144 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +301.83 142.941 m +301.83 103.286 l +648 104 l +648 144 l +h + +\setstretch{.5}\begin{tiny} +{\tt NFGI\_IF4p5 / ethernet} +\end{tiny} + +\setstretch{.5}\begin{tiny} +upper-PHY TX (212,213) +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +389.83 375.941 m +389.83 336.286 l +616 336 l +616 376 l +h + +\setstretch{.5}\begin{tiny} +{\tt NFGI\_IF1pp / ethernet} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + +\setstretch{.5}\begin{tiny} +TX PRECODING\\RX COMBINING +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + +\small\begin{itemize} +\item Example: RAU with {\tt NGFI\_IF1pp} xhaul (MAC/PHY split) northbound, {\tt NGFI\_IF4p5} fronthaul southbound, 2 vCell logical interfaces (2 L1/L2 instances, or 1 L2 instance and 2 CCs), 4 RRUs with {\tt NGFI\_IF4p5} + +\end{itemize} + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +upper-PHY RX (212,213) +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +upper-PHY RX (212,213) +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +upper-PHY TX (212,213) +\end{tiny} + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_0$ +\end{tiny} + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_1$ +\end{tiny} + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_2$ +\end{tiny} + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_3$ +\end{tiny} + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{eNB}_0$ +\end{tiny} + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{eNB}_1$ +\end{tiny} + +RAU Example (DAS) + + + + + +168 416 m +168 32 l +576 32 l +576 416 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX0 +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +176 176 m +176 136 l +552 136 l +552 176 l +h + +\setstretch{.5}\begin{tiny} +{\tt NGFI\_IF4p5 / ethernet} +\end{tiny} + +\setstretch{.5}\begin{tiny} +PHY TX0 +\end{tiny} + +184 360 m +184 336 l +552 336 l +552 360 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +184 408 m +184 368 l +552 368 l +552 408 l +h + +\setstretch{.5}\begin{tiny} +{\tt NGFI\_IF1p / ethernet} +\end{tiny} + + +184 264 m +184 224 l +552 224 l +552 264 l +h + +\setstretch{.5}\begin{tiny} +TX PRECODING\\RX COMBINING +\end{tiny} + +\small\begin{itemize} +\item Example: massive-MIMO RAU with {\tt NGFI\_IF1p} fronthaul northbound, 8 L1 component carriers,1 L2 instances, many local RRUs with {\tt NGFI\_IF4p5} southbound + +\end{itemize} + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +{\tt if\_device} +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX1 +\end{tiny} + +\setstretch{.5}\begin{tiny} +PHY TX1 +\end{tiny} + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX7 +\end{tiny} + +\setstretch{.5}\begin{tiny} +PHY TX7 +\end{tiny} + +184 320 m +184 288 l +552 288 l +552 320 l +h + +\setstretch{.5}\begin{tiny} +RLC +\end{tiny} + + +184 280 m +184 248 l +552 248 l +552 280 l +h + +\setstretch{.5}\begin{tiny} +MAC +\end{tiny} + + +376 208 m +448 208 l + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{eNB}_0$ +\end{tiny} + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{eNB}_1$ +\end{tiny} + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{eNB}_7$ +\end{tiny} + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_{0\cdots 15}$ +\end{tiny} + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_{16\cdots 31}$ +\end{tiny} + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_{32\cdots 47}$ +\end{tiny} + + +184.83 261.941 m +184.83 128 l +272 128 l +272 261.941 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_{48\cdots 63}$ +\end{tiny} + +RAU Example (Massive-MIMO) + + + + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +232 384 m +232 256 l +543.99 256 l +543.99 384 l +h + + +96 136 m +96 48 l +540 48 l +540 136 l +h + + +88 192 m +88 80 l +248 80 l +248 192 l +h + + +88 192 m +88 80 l +248 80 l +248 192 l +h + + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\small\begin{itemize} +\item IF5 transports packets of size equal to a subframe and corresponding to a 1ms chunk of signal in the time-domain. This is done via the functions send\_if5 and recv\_if5, in the layer1 transport procedures ({\tt openair1/PHY/LTE\_TRANSPORT/if5\_tools.c}). A timestamp is given along with the samples, corresponding to the time (in samples) of the first sample of the packet. +\item each block can be compressed with A-law compression, yielding a compression rate of .5. +\end{itemize} +RU Procedures (NGFI\_IF5) + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX $n$\\ +$\mathrm{eNB}_2$ (211,212) +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX $n+4$\\ +$\mathrm{eNB}_2$ (211,212) +\end{tiny} + + +144 480 m +144 32 l +176 32 l +176 480 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_0$ +\end{tiny} + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX $n$\\ +$\mathrm{eNB}_1$ (211,212) +\end{tiny} + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX $n$\\ +$\mathrm{eNB}_0$ (211,212) +\end{tiny} + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX $n+4$\\ +$\mathrm{eNB}_1$ (211,212) +\end{tiny} + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX $n+4$\\ +$\mathrm{eNB}_0$ (211,212) +\end{tiny} + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +132 294 m +132 208 l +384 208 l +384 294 l +h + + +144.991 145.396 m +289.432 145.382 l + + +144.991 120.982 m +289.432 121.382 l + +\tiny {\tt RU->ru\_time.rxdata[0]} +\tiny {\tt RU->ru\_time.rxdata[R-1]} + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\setstretch{.5}\tt\tiny slot\_fep\_ul\par36.211 + +153 232 m +153 176 l +228 176 l +228 232 l +h + + +184 268 m +196 268 l + + +184 244 m +196 244 l + +\tiny {\tt eNB->common\_vars.rxdataF[0]} +\tiny {\tt eNB->common\_vars.rxdataF[R-1]} + +273 269 m +412 268 l + + +415.263 120.984 m +575 120.608 l + + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\tiny $\mathrm{Alaw}^{-1}()$ + +56 128 m +110.531 128.542 l + +\tiny from IF5 {\tt if\_device} + +680 104 m +680 104 l +680 104 l +680 104 l +h + + +544 324 m +544 144 l +576 144 l +576 324 l +h + +\setstretch{.5}\tt\tiny P\\R\\E\\C\\O\\D\\I\\N\\G\\ + +632 360 m +632 188 l +660 188 l +660 360 l +h + +\tiny {\tt RU->ru\_time.txdata[0]} + +700 264 m +735.133 264 l + + +632 264.556 m +671.833 265 l + +\setstretch{.5}\tt\tiny do\_ofdm\_mod\_rt()\par 36.211 +\setstretch{.5}\begin{tiny} +{\tt openair1/SCHED/ru-procedures.c} +\end{tiny} + + +517.232 240.387 m +576.078 240 l +576.078 240 l + + +517.232 240.387 m +576.078 240 l +576.078 240 l + + +517.232 240.387 m +576.078 240 l +576.078 240 l + + +517.232 240.387 m +576.078 240 l +576.078 240 l + +\tiny $\mathrm{Alaw}()$ +\tiny to IF5 {\tt if\_device} + +56 240 m +356.214 240.281 l + + +700 264 m +735.133 264 l + +\tiny {\tt RU->ru\_time.txdata[T-1]} +\setstretch{.5}\begin{tiny} +{\tt recv\_IF5()} +\end{tiny} + +\setstretch{.5}\begin{tiny} +{\tt send\_IF5()} +\end{tiny} + +\setstretch{.5}\begin{tiny} +{\tt ru\_fep\_full()} +\end{tiny} + +IF5 RU eNB end +\tiny $\mathrm{7.5kHz}()$ +\setstretch{.5}\begin{tiny} +{\tt ru\_thread()} +\end{tiny} + +\setstretch{.5}\begin{tiny} +{\tt ru\_thread\_asynch\_rxtx()} +\end{tiny} + + + + + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +96 136 m +96 48 l +540 48 l +540 136 l +h + + +88 192 m +88 80 l +248 80 l +248 192 l +h + + +88 192 m +88 80 l +248 80 l +248 192 l +h + + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\small\begin{itemize} +\item IF4p5 transports packets of size equal to an OFDM symbol (for DLRE and ULRE) indexed by the symbol, subframe and frame number. This is done via the functions send\_if4p5 and recv\_if4p5, in the layer1 transport procedures ({\tt openair1/PHY/LTE\_TRANSPORT/if4\_tools.c}). +\item each block are compressed with A-law compression, yielding a compression rate of .5. +\end{itemize} +RU Procedures (NGFI\_IF4p5) + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX $n$\\ +$\mathrm{eNB}_2$ (211,212) +\end{tiny} + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX $n+4$\\ +$\mathrm{eNB}_2$ (211,212) +\end{tiny} + + +144 480 m +144 32 l +176 32 l +176 480 l +h + +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_0$ +\end{tiny} + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX $n$\\ +$\mathrm{eNB}_1$ (211,212) +\end{tiny} + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY RX $n$\\ +$\mathrm{eNB}_0$ (211,212) +\end{tiny} + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX $n+4$\\ +$\mathrm{eNB}_1$ (211,212) +\end{tiny} + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\setstretch{.5}\begin{tiny} +PHY TX $n+4$\\ +$\mathrm{eNB}_0$ (211,212) +\end{tiny} + + +371.001 106.337 m +323.502 106.337 l +323.502 106.337 l + + +175.991 137.396 m +575 138.93 l + + +175.991 112.982 m +575 114.329 l + + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\tiny $\mathrm{Alaw}^{-1}()$ + +56 120 m +141.531 120.07 l + +\tiny from IF4p5 {\tt if\_device} + +680 104 m +680 104 l +680 104 l +680 104 l +h + + +544 324 m +544 144 l +576 144 l +576 324 l +h + +\setstretch{.5}\tt\tiny P\\R\\E\\C\\O\\D\\I\\N\\G\\ + +700 264 m +735.133 264 l + +\setstretch{.5}\begin{tiny} +{\tt openair1/SCHED/ru-procedures.c} +\end{tiny} + + +517.232 240.387 m +576.078 240 l +576.078 240 l + + +517.232 240.387 m +576.078 240 l +576.078 240 l + + +517.232 240.387 m +576.078 240 l +576.078 240 l + + +517.232 240.387 m +576.078 240 l +576.078 240 l + +\tiny $\mathrm{Alaw}()$ +\tiny to IF4p5 {\tt if\_device} + +56 240 m +356.214 240.281 l + + +700 264 m +735.133 264 l + +\setstretch{.5}\begin{tiny} +{\tt recv\_IF4p5()} +\end{tiny} + +\setstretch{.5}\begin{tiny} +{\tt send\_IF4p5()} +\end{tiny} + +IF4p5 RU eNB end + +153 232 m +153 176 l +228 176 l +228 232 l +h + + +111.191 120.045 m +112 70 l +142 69.9344 l + + +-36 68 m +-36 68 l + + +175.991 112.982 m +575 114.329 l + +\tiny {\tt eNB->common\_vars.rxdataF[0]} +\tiny {\tt eNB->common\_vars.rxdataF[R-1]} +\tiny {\tt eNB->prach\_vars.prachF[0$\cdots$ R-1]} +\setstretch{.5}\begin{tiny} +{\tt ru\_thread()} +\end{tiny} + + + + + + +330 430 m +330 390 l +380 390 l +380 430 l +h + + +232 384 m +232 256 l +543.99 256 l +543.99 384 l +h + + +96 136 m +96 48 l +540 48 l +540 136 l +h + + +132 294 m +132 208 l +384 208 l +384 294 l +h + + +96 384 m +96 148 l +544 148 l +544 256 l +224 256 l +224 384 l +h + + +444 164 m +444 84.382 l +522.222 84.382 l +522.222 164 l +h + + +132 294 m +132 208 l +384 208 l +384 294 l +h + + +444 164 m +444 84.382 l +522.222 84.382 l +522.222 164 l +h + + +153 232 m +153 176 l +228 176 l +228 232 l +h + +RU Procedures (NGFI\_IF4p5) +\setstretch{.5}\begin{tiny} +$\mathrm{RU}_0$ +\end{tiny} + + +144.991 145.396 m +289.432 145.382 l + + +144.991 120.982 m +289.432 121.382 l + +\tiny {\tt RU->ru\_time.rxdata[0]} +\tiny {\tt RU->ru\_time.rxdata[R-1]} + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\setstretch{.5}\tt\tiny slot\_fep\_ul\par36.211 + +153 232 m +153 176 l +228 176 l +228 232 l +h + + +184 268 m +196 268 l + + +184 244 m +196 244 l + + +273 269 m +412 268 l + + +415.263 120.984 m +575 120.608 l + + +56 128 m +110.531 128.542 l + +\tiny from {\tt rf\_device} + +680 104 m +680 104 l +680 104 l +680 104 l +h + + +632 360 m +632 188 l +660 188 l +660 360 l +h + +\tiny {\tt RU->ru\_time.txdata[0]} + +380.13 336.98 m +149.46 336.349 l + + +632 264.556 m +671.833 265 l + +\setstretch{.5}\tt\tiny do\_ofdm\_mod\_rt()\par 36.211 +\setstretch{.5}\begin{tiny} +{\tt openair1/SCHED/ru-procedures.c} +\end{tiny} + +\tiny to {\tt rf\_device} + +58 240 m +114.121 240.053 l + + +380.45 296 m +149.46 295.058 l + +\tiny {\tt RU->ru\_time.txdata[T-1]} +\setstretch{.5}\begin{tiny} +{\tt ru\_fep\_full()} +\end{tiny} + +IF4p5 RU remote-end + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\tiny $\mathrm{Alaw}^{-1}()$ + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\tiny $\mathrm{Alaw}()$ +\tiny $\mathrm{7.5kHz}()$ + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\setstretch{.5}\begin{tiny} +{\tt recv\_IF4p5()} +\end{tiny} + +\setstretch{.5}\begin{tiny} +{\tt send\_IF4p5()} +\end{tiny} + + +485.71 128.939 m +581.963 129.331 l + +\tiny to {\tt if\_device} +\tiny from {\tt if\_device} + +58 240 m +114.121 240.053 l + + +131 344 m +131 316 l +276 316 l +276 344 l +h + +\setstretch{.5}\tt\tiny ru\_prach\_procedures\par36.211 + +440.514 328 m +477 327.572 l + +\tt\tiny ru\_prach\_procedures() + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\setstretch{.5}\tt\tiny rx\_prachl\par36.211 + +199.412 220.391 m +200 104 l +236.674 103.978 l + + +178.262 196.069 m +179.06 92 l +236.674 91.6468 l + + +65.0054 121.159 m +65.0054 121.159 l +65.0054 121.159 l +65.0054 121.159 l +h + +\setstretch{.5}\begin{tiny} +{\tt ru\_thread\_prach()} +\end{tiny} + +\setstretch{.5}\begin{tiny} +{\tt ru\_thread()} +\end{tiny} + + +65.0054 357.66 m +65.0054 357.66 l +65.0054 357.66 l +65.0054 357.66 l +h + +\setstretch{.5}\begin{tiny} +{\tt ru\_thread\_asynch\_rxtx()} +\end{tiny} + +\tiny to {\tt if\_device} + +485.71 128.939 m +581.963 129.331 l + + + + + + +175.695 380 m +176.42 128 l + +OAI IF1pp Interface +\tiny\begin{itemize} +\item OAI IF1pp is the interface between the 36.213 Physical Layer Procedures (HARQ, SR, CSI, etc.) and the transport/physical channel processing +\item it can be networked, although this is not used as an xhaul interface at the moment. +\end{itemize} + +96 384 m +96 320 l +640 320 l +640 384 l +h + + +128 368 m +128 336 l +352 336 l +352 368 l +h + + +128 368 m +128 336 l +352 336 l +352 368 l +h + +\tiny {\tt phy\_procedures\_lte\_eNB\_TX} +\tiny {\tt phy\_procedures\_lte\_eNB\_RX} + +96 384 m +96 320 l +640 320 l +640 384 l +h + +\small PHY transport and physical channel procedures +\tiny {\tt common\_signal\_procedures()} +\tiny {\tt pmch\_procedures()} +\tiny {\tt generate\_dlsch\_parameters\_from\_dci()} +\tiny {\tt generate\_ulsch\_parameters\_from\_dci()} +\tiny {\tt phy\_config\_dedicated\_step2()} +\tiny {\tt generate\_dci\_top()} +\tiny {\tt generate\_phich\_top()} +\tiny {\tt pdsch\_procedures()} + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + +\tiny {\tt pucch\_procedures()} +\tiny {\tt process\_Msg3()} + +175.695 380 m +176.42 128 l + +\tiny {\tt rx\_ulsch()} + +175.695 380 m +176.42 128 l + +\tiny {\tt ulsch\_decoding()} + +175.695 380 m +176.42 128 l + +\tiny {\tt extract\_cqi()} + +175.695 380 m +176.42 128 l + +\tiny {\tt get\_Msg3\_alloc\_ret()} + +175.695 380 m +176.42 128 l + +\tiny {\tt lte\_est\_timing\_advance\_pusch()} + +175.695 380 m +176.42 128 l + +\tiny {\tt lte\_eNB\_I0\_measurements()} + +175.695 380 m +176.42 128 l + +\tiny {\tt process\_HARQ\_info()} + +175.695 380 m +176.42 128 l + +\small {\tt 36.213}\par +{\tt openair1/SCHED} +\small {\tt 36.211/212}\par +{\tt openair1/PHY} + + + + + +120 528 m +120 0 l +592 0 l +592 528 l +h + + +180 524 m +180 476 l +588 476 l +588 524 l +h + + +248 520 m +248 483.903 l +400 484 l +400 520 l +h + + +180 493.216 m +180 452 l +536 452 l +536 493.216 l +h + + +404 480 m +404 472 l +404 472 l +404 480 l +h + + +340 488 m +340 464 l +444 464 l +444 488 l +h + + +312 456 m +312 432 l +424 432 l +424.001 456 l +h + + +144 448 m +144 360 l +536 360 l +536 448 l +h + + +144 260 m +144 116 l +536 116 l +536 260 l +h + + +144 344 m +144 264 l +536 264 l +536 344 l +h + + +128 440 m +128 384 l +224 384 l +224 440 l +h + +\tt\tiny generate\_dci\_top() + + +0 424 m +0 32 l +48 32 l +48 424 l +h + +M\\ +A\\ +C + +64 416 m +172 416 l + +\tt\tiny DCI\_PDU + +128 440 m +128 384 l +224 384 l +224 440 l +h + +\setstretch{.5}\tt\tiny dlsch\_coding()\par36.212 + +64 416 m +172 416 l + +\tt\tiny DLSCH\_PDU\_0 + +128 440 m +128 384 l +224 384 l +224 440 l +h + + +64 416 m +172 416 l + +\tt\tiny DLSCH\_PDU\_1\_0 + +128 440 m +128 384 l +224 384 l +224 440 l +h + + +64 416 m +172 416 l + +\tt\tiny DLSCH\_PDU\_1\_1 + +312 456 m +312 432 l +424 432 l +424.001 456 l +h + +\setstretch{.5}\tt\tiny generate\_pcfich()\par36.212,36.211 + +304 408 m +304 384 l +400 384 l +400 408 l +h + +\setstretch{.5}\tt\tiny generate\_dci0()\par36.212 + +408 400 m +408 352 l +520 352 l +520 400 l +h + +\setstretch{.5}\tt\tiny pdcch\_scrambling()\par pdcch\_modulation\par pdcch\_interleaving\par36.211 +\setstretch{.5}\tt\tiny dlsch\_coding()\par36.212 +\setstretch{.5}\tt\tiny dlsch\_coding()\par36.212 + +268 426.729 m +293 426.729 l + + +268 399.17 m +293 399.17 l + + +405 397.373 m +421 397.373 l + + +294 320 m +294 296 l +392 296 l +392 320 l +h + +\setstretch{.5}\tt\tiny dlsch\_encoding()\par36.212 + +268 399.17 m +293 399.17 l + + +408 322.774 m +408 288 l +520 288 l +520 322.774 l +h + +\setstretch{.5}\tt\tiny dlsch\_scrambling()\par dlsch\_modulation()\par36.211 + +405 397.373 m +421 397.373 l + + +294 320 m +294 296 l +392 296 l +392 320 l +h + +\setstretch{.5}\tt\tiny dlsch\_encoding()\par36.212 + +408 251 m +408 144 l +520 144 l +520 251 l +h + +\setstretch{.5}\tt\tiny dlsch\_scrambling()\par dlsch\_modulation()\par[2-4 layers]\par 36.211 + +405 397.373 m +421 397.373 l + + +294 320 m +294 296 l +392 296 l +392 320 l +h + +\setstretch{.5}\tt\tiny dlsch\_encoding()\par36.212 + +405 397.373 m +421 397.373 l + + +268 399.17 m +293 399.17 l + + +268 399.17 m +293 399.17 l + + +552 428 m +552 428 l + + +405 409 m +600 408.924 l + + +520 381 m +600 380.885 l + + +521 292.923 m +600 293.648 l + +\tt\tiny openair1/SCHED/phy\_procedures\_lte\_eNb.c:pdsch\_procedures() +\tt\tiny openair1/SCHED/phy\_procedures\_lte\_eNb.c:pdsch\_procedures() +\tt\tiny openair1/PHY/LTE\_TRANSPORT/dci.c + +360 104 m +360 104 l +360 104 l +360 104 l +h + + +144 344 m +144 264 l +536 264 l +536 344 l +h + + +128 440 m +128 384 l +224 384 l +224 440 l +h + +\setstretch{.5}\tt\tiny dlsch\_coding()\par36.212 +\tt\tiny MCH\_PDU + +294 320 m +294 296 l +392 296 l +392 320 l +h + +\setstretch{.5}\tt\tiny dlsch\_encoding()\par36.212 + +268 399.17 m +293 399.17 l + + +408 322.774 m +408 288 l +520 288 l +520 322.774 l +h + +\setstretch{.5}\tt\tiny dlsch\_scrambling()\par mch\_modulation()\par36.211 + +405 397.373 m +421 397.373 l + +\tt\tiny openair1/SCHED/phy\_procedures\_lte\_eNb.c:pmch\_procedures() + +64 416 m +172 416 l + + +128 488 m +128 452 l +172 452 l +172 488 l +h + + +140 472 m +140 472 l +140 472 l +140 472 l +h + +\setstretch{.5}\tt\tiny UL CNTL\\36.213 + +188 476 m +188 460 l +316 460 l +316 476 l +h + +\tt\tiny generate\_phich\_top() + +172 468 m +188 468 l + +\setstretch{.5}\tt\tiny generate\_phich()\par36.212,36.211 + +405 397.373 m +421 397.373 l + + +445 457 m +600 456.672 l + + +520.262 58 m +600 58.7558 l + +\tt\tiny openair1/PHY/LTE\_TRANSPORT/phich.c +\tiny PHICH REs +\tiny PCFICH REs +\tiny PDCCH REs +\tiny PDSCH REs + +104.077 0 0 104.077 528 236 e + +\tiny PMCH REs +\setstretch{.5}\tt\tiny generate\_pilots\_slot()\par generate\_pss/sss/pbch()\par36.211 + +248 488.695 m +248 488.695 l +248 488.695 l +248 488.695 l +h + +\tt\tiny openair1/SCHED/phy\_procedures\_lte\_eNb.c:common\_signal\_procedures() + +401 507 m +600.424 507.963 l + +\tiny CS-RS/PSS/SSS/PBCH REs + +576 332 m +592 324 l + +\tt\tiny openair1/SCHED/phy\_procedures\_lte\_eNb.c:phy\_procedures\_eNB\_TX() +eNB TX Procedures +\tiny eNodeB\_3GPP or NGFI\_RCC\_IF4p5 + +232 276 m +232 240 l +240 240 l +240 276 l +h + +\tt\tiny IF2 split points + +232 276 m +232 240 l +240 240 l +240 276 l +h + + +521 292.923 m +600 293.648 l + + +521 292.923 m +600 293.648 l + + + + + + +539.766 93 m +539.306 79.0026 l +340 79.7439 l + + +447.064 116 m +447.064 92 l +632 92 l +632 116 l +h + + +304 384 m +304 320 l +368 320 l +368 384 l +h + + +225.588 267.631 m +225.588 257.004 l +451.999 257.004 l +451.999 267.631 l +h + + +286.577 417.212 m +286.577 407.581 l +412.989 407.581 l +412.989 417.212 l +h + + +-66.4757 363.53 m +-66.4757 358.467 l +-65.4632 358.467 l +-65.4632 363.53 l +h + + +330 430 m +330 390 l +380 390 l +380 430 l +h + +\begin{tiny} +\tt {\bf phy\_procedures\_eNB\_TX}(sched\_subframe,eNB,abstraction\_flag,r\_type,rn) +\end{tiny} + +\begin{tiny} eNB instance and component carriers \end{tiny} +\begin{tiny} subframe where TX was scheduled \end{tiny} + +293.168 472.33 m +189.522 511.272 l + + +372.849 474.127 m +310.542 512.47 l + +\setstretch{.5}\begin{tiny} Flag to indicate 212/213 Split\\(transport channels, no 211 procedures) \end{tiny} + +432.16 473.528 m +526.22 499.29 l + + +27.6629 0 0 27.6629 531.612 404.032 e + + +526.819 478.92 m +598.712 484.312 l + +\begin{tiny} Experimental (for relays)\end{tiny} +\begin{tiny} +\bf\tt Check for dead UEs +\end{tiny} + +304 384 m +304 320 l +368 320 l +368 384 l +h + + +340.45 451.636 m +340.45 417.212 l + +\begin{tiny}\tt eNB$\rightarrow$CC\_id==0?\end{tiny} +\begin{tiny} +\bf\tt Call eNB\_dlsch\_ulsch\_scheduler [MAC] +\end{tiny} + +340.45 451.636 m +340.45 417.212 l + + +340.45 451.636 m +340.45 417.212 l + + +340.45 451.636 m +340.45 417.212 l + + +418.155 336 m +528 336 l +528 248 l +340 247.665 l + +\tiny no + +225.588 267.631 m +225.588 257.004 l +451.999 257.004 l +451.999 267.631 l +h + +\begin{tiny}\tt is PMCH subframe?\end{tiny} +\begin{tiny} +\bf\tt Call pmch\_procedures +\end{tiny} + +340.45 451.636 m +340.45 417.212 l + + +340 97.4877 m +340 52 l + +\tiny no +\setstretch{.5} +\begin{tiny} +\bf\tt Call common\_signal\_procedures\\ +(CS-RS/PSS/SSS/PBCH) +\end{tiny} + +417.889 180.561 m +540 180 l +539.532 116 l + + +352 0 m +352 12 l +384 12 l +384 12 l +384 0 l +368 -12 l +368 -12 l +h + +eNB TX Flowchart + + + + + +225.588 267.631 m +225.588 257.004 l +451.999 257.004 l +451.999 267.631 l +h + +\setstretch{.5}\begin{tiny} +\bf\tt Call get\_dci\_sdu [MAC]\\ dci=first\_dci +\end{tiny} + +368.672 502.411 m +368 524 l + + +304 384 m +304 320 l +368 320 l +368 384 l +h + +\setstretch{.5}\begin{tiny}\tt dci not empty and DL dci?\end{tiny} + +368.672 502.411 m +368 524 l + + +368.297 357.206 m +368 380 l + + +260 356 m +260 328 l +476 328 l +476 356 l +h + +\setstretch{.5}\begin{tiny} +\bf\tt Call generate\_dlsch\_params\_from\_dci\\ +dci=next(dci) +\end{tiny} +\tt\tiny no + +260 342 m +240.242 342 l +240 472 l +368 472 l + + +445.666 417.484 m +512.662 417.484 l +512.662 303.725 l +367.862 303.725 l +367.862 288.454 l + + +260 356 m +260 328 l +476 328 l +476 356 l +h + +\setstretch{.5}\begin{tiny} +\bf\tt Call phy\_config\_dedicated\_step2\\ +dci=first\_dci +\end{tiny} + +272 200 m +344.961 161.229 l +416 200 l +344.961 235.739 l +h + +\setstretch{.5}\begin{tiny}\tt dci not empty and UL dci?\end{tiny} + +368.297 357.206 m +368 380 l + + +260 356 m +260 328 l +476 328 l +476 356 l +h + +\setstretch{.5}\begin{tiny} +\bf\tt Call generate\_ulsch\_params\_from\_dci\\ +dci=next(dci) +\end{tiny} +\tt\tiny no + +260 123 m +240.242 123 l +240 252 l +368 252 l + + +416 200 m +488 200 l +489 96 l +345 96 l +344.862 77.0895 l + + +272 80 m +272 48 l +416 48 l +416 80 l +h + +\setstretch{.5}\begin{tiny} +\bf\tt Call generate\_dci\_top\\ +Call generate\_phich\_top +\end{tiny} + +368.297 357.206 m +368 380 l + + +352 0 m +352 12 l +384 12 l +384 12 l +384 0 l +368 -12 l +368 -12 l +h + + +344 24 m +344 48 l + +\tt\tiny yes +\tt\tiny yes +eNB TX Flowchart + + + + + +240 96 m +240 56 l +496 56 l +496 96 l +h + +\setstretch{.5}\begin{tiny} +\bf\tt dlsch\_eNB[UE].subframe\_active=false\par [no PUCCH ACK to be checked in TTI n+k]\par +UE=next(UE) +\end{tiny} + +288 464 m +368 432 l +448 464 l +368 496 l +h + + +288 464 m +368 432 l +448 464 l +368 496 l +h + + +368 528 m +368 512 l + + +288 464 m +368 432 l +448 464 l +368 496 l +h + +\setstretch{.5}\begin{tiny}\tt is dlsch\_SI active?\end{tiny} + +368 528 m +368 504 l + +\setstretch{.5}\begin{tiny}\tt is dlsch\_P active?\end{tiny} + +368 528 m +368 504 l + +\setstretch{.5}\begin{tiny}\tt is dlsch\_RA active?\end{tiny} +\tt\tiny no +\tt\tiny no +\tt\tiny no + +368 528 m +368 504 l + + +456 480 m +456 464 l +648 464 l +648 480 l +h + +\setstretch{.5}\begin{tiny} +\bf\tt Call pdsch\_procedures(dlsch\_SI) +\end{tiny} + +448 464 m +536 464 l +536 448 l + + +536 432 m +536 424 l +368 424 l + +\tt\tiny yes + +456 480 m +456 464 l +648 464 l +648 480 l +h + +\setstretch{.5}\begin{tiny} +\bf\tt Call pdsch\_procedures(dlsch\_P) +\end{tiny} + +448 464 m +536 464 l +536 448 l + + +536 432 m +536 424 l +368 424 l + +\tt\tiny yes + +456 480 m +456 464 l +648 464 l +648 480 l +h + +\setstretch{.5}\begin{tiny} +\bf\tt Call pdsch\_procedures(dlsch\_RA) +\end{tiny} + +448 464 m +536 464 l +536 448 l + + +536 432 m +536 424 l +368 424 l + +\tt\tiny yes + +256 232 m +256 208 l +480 208 l +480 232 l +h + +\setstretch{.5}\begin{tiny} +\bf\tt UE=first\_UE from UE\_list \par [list of UE with t-CRNTI or CRNTI] +\end{tiny} + +288 464 m +368 432 l +448 464 l +368 496 l +h + +\setstretch{.5}\begin{tiny}\tt is dlsch\_UE active?\end{tiny} + +368 528 m +368 504 l + + +368 528 m +368 504 l + + +456 480 m +456 464 l +648 464 l +648 480 l +h + +\setstretch{.5}\begin{tiny} +\bf\tt Call pdsch\_procedures(dlsch\_UE) +\end{tiny} +\tt\tiny yes + +448 464 m +536 464 l +536 448 l + + +536 432 m +536 424 l +368 424 l + +\tt\tiny no + +416 88 m +416 88 l +416 88 l +416 88 l +h + + +320 32 m +368 16 l +416 32 l +368 48 l +h + +\setstretch{.5}\begin{tiny}\tt UE=NULL?\end{tiny} + +368 72 m +368 56 l + + +320 40 m +224 40 l +224 168 l +288 168 l + +\tt\tiny no + +352 0 m +352 12 l +384 12 l +384 12 l +384 0 l +368 -12 l +368 -12 l +h + + +416 40 m +640 40 l +640 24 l + +\tt\tiny yes + +512 48 m +512 32 l +544 32 l +544 48 l +h + + +528 80 m +528 48 l + +\bf\setstretch{.5}\tiny IF4p5 \par [All Frequency-domain Signals are created] +eNB TX Flowchart + + + + + +130 527 m +130 -1 l +608 0 l +608 528 l +h + + +388 288 m +388 208 l +584 208 l +584 288 l +h + + +141 449 m +141 361 l +580.427 361 l +580 448 l +h + + +464 428 m +464 396 l +576 396 l +576 428 l +h + + +462.358 361 m +462.358 287.368 l +602 287.368 l +602 361 l +h + + +462.358 361 m +462.358 287.368 l +602 287.368 l +602 361 l +h + + +492 200 m +492 16 l +596 16 l +596 200 l +h + + +130 202.157 m +130 16 l +484 16 l +484 204 l +h + +\tt\tiny openair1/SCHED/phy\_procedures\_lte\_eNb.c:phy\_procedures\_eNB\_RX() + +0 424 m +0 32 l +48 32 l +48 424 l +h + +M\\ +A\\ +C + +64 416 m +172 416 l + +\setstretch{.5}\tt\tiny RACH Preamble + +534 125.858 m +688 126 l + +\tt\tiny ULSCH\_SDU(UE\_id) +\tiny eNB\_common\_vars.rxdataF[0] +\tiny eNB\_common\_vars.rxdataF[R-1] + +273 269 m +412 268 l + + +273 245 m +412 244 l + + +184 128 m +184 100 l +276 100 l +276 128 l +h + +\setstretch{.5}\tt\tiny rx\_ulsch(UE\_id)\par36.211 + +208 240 m +208 128 l + +\tt\tiny LTE\_TRANSPORT/prach.c +\tt\tiny openair1/PHY/LTE\_TRANSPORT/ulsch\_demodulation.c + +393 285 m +393 229 l +552 228 l +552 284 l +h + +\tt\tiny lte\_eNB\_I0\_measurements() + + + +280 32 m +280 199 l +308 199 l +308 32 l +h + +\setstretch{.5}\tt\tiny ulsch\_extract\_rbs\_single()\par36.211 + + + + +332 32 m +332 199 l +360 199 l +360 32 l +h + +\setstretch{.5}\tt\tiny lte\_ul\_channel\_estimation()\par36.211 + + + +332 32 m +332 199 l +360 199 l +360 32 l +h + +\setstretch{.5}\tt\tiny ulsch\_detection\_mrc()\par36.211 + + + +332 32 m +332 199 l +360 199 l +360 32 l +h + +\setstretch{.5}\tt\tiny frequency\_equalization()\par36.211 + + + +332 32 m +332 199 l +360 199 l +360 32 l +h + +\setstretch{.5}\tt\tiny lte\_idft()\par36.211 + + + +332 32 m +332 199 l +360 199 l +360 32 l +h + +\setstretch{.5}\tt\tiny ulsch\_XXX\_llr()\par36.211 + + + +332 32 m +332 199 l +360 199 l +360 32 l +h + +\setstretch{.5}\tt\tiny ulsch\_decoding()\par36.212 + + + +332 32 m +332 199 l +360 199 l +360 32 l +h + + +\setstretch{.5}\tt\tiny ulsch\_channel\_compensation()\par36.211 + + + +476 118 m +504.475 118 l + + +564 220 m +564 220 l +564 220 l +564 220 l +h + +\tt\tiny ulsch\_decoding.c + +476 118 m +504.475 118 l + +\tt\tiny ACK/NAK,RI,CQI + +131 344 m +131 316 l +276 316 l +276 344 l +h + +\setstretch{.5}\tt\tiny pucch\_procedures(UE\_id)\par36.211 + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\setstretch{.5}\tt\tiny rx\_pucchl\par36.211 + +476 118 m +504.475 118 l + + +551.76 312.126 m +687 312.231 l + +\tt\tiny ACK/NAK +\tt\tiny SR + +440.514 328 m +477 327.572 l + +\tt\tiny TRANSPORT/pucch.c + +373.112 244.28 m +373.112 316 l + + +344.968 268.786 m +345.381 316 l + + +131 344 m +131 316 l +276 316 l +276 344 l +h + +\setstretch{.5}\tt\tiny prach\_procedures\par36.211 + +405.275 413 m +464 412.625 l + + +440.514 328 m +477 327.572 l + +\tt\tiny openair1/SCHED/phy\_procedures\_lte\_eNb.c:prach\_procedures() + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\setstretch{.5}\tt\tiny rx\_prachl\par36.211 +\setstretch{.5}\tt\tiny E\_PRACH>Lmin\par36.211 +\tt\tiny LTE\_ESTIMATION/lte\_eNB\_I0\_measurements.c +eNB PHY RX Procedures + +0 416 m +144 416 l + +\tiny {\tt eNB->prach\_vars.prachF[0$\cdots$ R-1]} + +160 268 m +160 128 l + + + + + + +0 296 m +0 264 l +736 264 l +736 296 l +h + + +0 296 m +0 264 l +736 264 l +736 296 l +h + + +0 296 m +0 264 l +736 264 l +736 296 l +h + + +0 296 m +0 264 l +736 264 l +736 296 l +h + + +0 296 m +0 264 l +736 264 l +736 296 l +h + + +0 296 m +0 264 l +736 264 l +736 296 l +h + + +0 296 m +0 264 l +736 264 l +736 296 l +h + + +0 296 m +0 264 l +736 264 l +736 296 l +h + + +184 128 m +184 100 l +276 100 l +276 128 l +h + +\setstretch{.5}\tt\tiny rx\_ulsch(UE\_id)\par36.211 +\tiny$\mathbf{R}_{r,l}=\mathrm{DFT}_{N_{\mathrm{fft}}}(\mathbf{r}_{r,l}\odot\mathbf{F}_{7.5}),r=0,1,\cdots,R-1,l=0,1,\cdots,N_{\mathrm{symb}}-1$ (\tt\bf eNB\_common\_vars$\rightarrow$rxdataF[][])%,N_{\mathrm{fft}}=2^{1+\left\lceil\log_2 12N^{\mathrm{RB}}_{\mathrm{DL}}\right\rceil$ + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\setstretch{.5}\tt\tiny slot\_fep\_ul\par36.211 + +144 440 m +176 440 l + + +272 328 m +272 328 l + + +144 440 m +176 440 l + +\tiny $\mathbf{r}_{r,l}$ +\tiny $\mathbf{R}_{r,l}$ +\tiny $\mathbf{R}_{\mathrm{ext},r,l}$ +\tiny $R_{\mathrm{ext},r,l}(n)={R}_{r,l}(12\mathrm{firstPRB}+n),n=0,1,\cdots,12N_{\mathrm{PRB}}-1$ (\tt\bf eNB\_pusch\_vars$\rightarrow$ulsch\_rxdataF\_ext[][]) +\tiny $\mathbf{\hat{H}}_{r,l}$ +\tiny $\mathbf{\hat{H}}_{r,l} = \mathbf{R}_{\mathrm{ext},r,l}\odot\mathbf{DRS}^*_{l}(\mathrm{cyclicShift},n_{\mathrm{DMRS}^{(2)}},n_{\mathrm{PRS}})$, (\tt\bf eNB\_pusch\_vars$\rightarrow$drs\_ch\_estimates[]) +\tiny $\mathbf{R}_{\mathrm{comp},r,l}$ +\tiny $\mathbf{R}_{\mathrm{comp},0,l}$ +\tiny $\mathbf{R}_{\mathrm{comp},0,l}=\frac{1}{R}\sum_{r=0}^{R-1}\mathbf{R}_{\mathrm{comp},r,l}$ +\tiny $\mathbf{R}_{\mathrm{comp},0,l}$ +\tiny $\mathbf{r}_{\mathrm{comp},0,l}$ +\tiny $R_{\mathrm{comp},0,l}(n)=R_{\mathrm{comp},0,l}(n)\dot Q_8\left(\frac{1}{|\hat{H}(n)|^2+I_0}\right), \hat{H}(n)=\sum_{r=0}^{R-1}\hat{H}_{r}(n)$ +\tiny $\mathbf{R}_{\mathrm{comp},r,l}=\mathbf{\hat{H}}_r\odot\mathbf{R}_{\mathrm{ext},r,l}2^{-\log_2|H_\mathrm{max}|}, \mathbf{\hat{H}}_r = \frac{1}{2}(\mathbf{\hat{H}}_{r,3}+\mathbf{\hat{H}}_{r,10})$\par (\tt\bf eNB\_pusch\_vars$\rightarrow$ulsch\_rxdataF\_comp) +\tiny $\mathbf{\lambda}_{l}$ +\tiny QPSK : $\lambda_l(2n)=\mathrm{Re}(r_{\mathrm{comp},0,l}(n)), \lambda_l(2n+1)=\mathrm{Im}(r_{\mathrm{comp},0,l}(n))$ (\tt\bf eNB\_pusch\_vars$\rightarrow$ulsch\_llr) +\tiny ${\mathbf r}_{\mathrm{comp},0,l} = \mathrm{IDFT}_{12N_{\mathrm{PRB}}}({\mathbf R}_{\mathrm{comp},0,l})$ +\tiny 16QAM : $\lambda_l(4n)=\mathrm{Re}(r_{\mathrm{comp},0,l}(n)), \lambda_l(4n+2)=\mathrm{Im}(r_{\mathrm{comp},0,l}(n))$\par$\lambda_l(4n+1)=|\mathrm{Re}(r_{\mathrm{comp},0,l}(n))|-2\overline{|h(n)|},\lambda_l(4n+3)=|\mathrm{Im}(r_{\mathrm{comp},0,l}(n))|-2\overline{|h(n)|}$ + +280 32 m +280 199 l +308 199 l +308 32 l +h + +\setstretch{.5}\tt\tiny ulsch\_extract\_rbs\_single()\par36.211 + +332 32 m +332 199 l +360 199 l +360 32 l +h + +\setstretch{.5}\tt\tiny lte\_ul\_channel\_estimation()\par36.211 + +332 32 m +332 199 l +360 199 l +360 32 l +h + + +\setstretch{.5}\tt\tiny ulsch\_channel\_compensation()\par36.211 + + +332 32 m +332 199 l +360 199 l +360 32 l +h + +\setstretch{.5}\tt\tiny ulsch\_detection\_mrc()\par36.211 + +332 32 m +332 199 l +360 199 l +360 32 l +h + +\setstretch{.5}\tt\tiny frequency\_equalization()\par36.211 + +332 32 m +332 199 l +360 199 l +360 32 l +h + +\setstretch{.5}\tt\tiny lte\_idft()\par36.211 + +332 32 m +332 199 l +360 199 l +360 32 l +h + +\setstretch{.5}\tt\tiny ulsch\_XXX\_llr()\par36.211 + +304 236 m +304 236 l +304 236 l +304 236 l +h + +eNB ULSCH Demodulation + + + + +eNB PRACH Detection + +0 296 m +0 264 l +736 264 l +736 296 l +h + +\tiny$\mathbf{R}_{r}=\mathrm{DFT}_{N_{\mathrm{PRACH}}}(\mathbf{r}_{r}),r=0,1,\cdots,R-1$ (\tt\bf lte\_eNB\_prach\_vars$\rightarrow$rxsigF[])%,N_{\mathrm{fft}}=2^{1+\left\lceil\log_2 12N^{\mathrm{RB}}_{\mathrm{DL}}\right\rceil$ + +0 296 m +0 264 l +736 264 l +736 296 l +h + +\tiny$\mathbf{R}_{\mathrm{comp},r}=\mathbf{R}_{r}\odot \mathbf{X}^*_u[i],r=0,1,\cdots,R-1$ (\tt\bf lte\_eNB\_prach\_vars$\rightarrow$prachF[])%,N_{\mathrm{fft}}=2^{1+\left\lceil\log_2 12N^{\mathrm{RB}}_{\mathrm{DL}}\right\rceil$ + +0 296 m +0 264 l +736 264 l +736 296 l +h + +\tiny$\mathbf{r}_{839,r}=\mathrm{IDFT}_{1024}\left(\mathbf{R}_{\mathrm{comp},r}\right), r=0,1,\cdots,R-1$ (\tt\bf lte\_eNB\_prach\_vars$\rightarrow$prach\_ifft[]) + +112 460 m +112 400 l +176 400 l +176 460 l +h + +\tiny $\mathbf{r}_{r}$ + +144 440 m +176 440 l + +DFT +\tiny $\mathbf{R}_{r}$ + +268 480 m +268 452 l +300 452 l +300 480 l +h + +$\odot$ + +176 428 m +208 428 l +208 456 l +268 456 l + + +208 428 m +208 400 l +268 400 l + +\tiny $\mathbf{X}^*_{u}(0)$ +\tiny $\mathbf{X}^*_{u}(1)$ + +284 480 m +284 468 l + + +284 372 m +284 384 l + + +268 480 m +268 452 l +300 452 l +300 480 l +h + +\tiny$R\times\mathrm{IDFT}_{1024}$ + +300 456 m +336 456 l + + +300 456 m +336 456 l + + +268 480 m +268 452 l +300 452 l +300 480 l +h + +\tiny$R\times\mathrm{IDFT}_{1024}$ + + +268 480 m +268 452 l +300 452 l +300 480 l +h + + + +\tiny$\sum_{r}|\cdot|^2$ + + + + + +268 480 m +268 452 l +300 452 l +300 480 l +h + + + +\tiny$\sum_{r}|\cdot|^2$ + + + + + +268 480 m +268 452 l +300 452 l +300 480 l +h + +\tiny max peak in size $\mathrm{NCS}_2$ window, keep delay + + +412 456 m +440 456 l + + +412 400 m +440 400 l + + +500 460 m +532 460 l + + +500 460 m +532 460 l + + +500 460 m +532 460 l + + +624 456 m +672 456 l + + +624 456 m +672 456 l + + +268 480 m +268 452 l +300 452 l +300 480 l +h + +\tiny max peak in size $\mathrm{NCS}_2$ window, keep delay +\tiny\tt preamble\_energy\_list[]\par preamble\_delay\_list[] +\tiny $\mathbf{r}_{839,r}$ +\small\begin{itemize} +\item PRACH detection is a quasi-optimal non-coherent receiver for vector observations (multiple antennas) +\item correlation is done in the frequency-domain, number of correlations (in the example above 2) depends on {\em zeroCorrelationConfig} configuration parameter +\item peak-detection (for delay estimation) is performed in each NCS time-window +\end{itemize} + + +268 480 m +268 452 l +300 452 l +300 480 l +h + +$\odot$ + + + + + + +340 416 m +340 340 l +564 340 l +564 416 l +h + + +268 480 m +268 452 l +300 452 l +300 480 l +h + +\tiny$\sum_{r,l,i}|\cdot|^2$ +\begin{tiny}$\stackbin{<}{>}\sigma^2[\mathrm{dB}]$\end{tiny} +eNB PUCCH1 Detection + +184 128 m +184 100 l +276 100 l +276 128 l +h + +\setstretch{.5}\tt\tiny rx\_pucch()\par36.211 + +153 232 m +153 176 l +228 176 l +228 232 l +h + +\setstretch{.5}\tt\tiny slot\_fep\_ul\par36.211 + +144 440 m +176 440 l + + +144 440 m +176 440 l + +\tiny $\mathbf{r}_{r,l}$ +\tiny $\mathbf{R}_{r,l}$ +\tiny $\mathbf{Z}^*_{l}e^{-j2\pi f/16},-3\leq f\leq 2$ + +308 448 m +352 448 l + +$\odot$ + +308 448 m +352 448 l + + +392 484 m +392 456 l + + +328 448 m +328 400 l +352 400 l + +$\odot$ + +392 484 m +392 456 l + +\tiny $\mathbf{Z}^*_{l}$ + +288 496 m +288 496 l +288 496 l +288 496 l +h + + +308 448 m +352 448 l + + +412 408 m +412 392 l +464 392 l +464 408 l +h + +\tiny$\mathbf{\hat{H}}$ +$\odot$ + +420 392 m +420 376 l + + +384 400 m +384 368 l +412 368 l + + +428 368 m +464 368 l + +\tiny$\mathrm{sgn}(\mathrm{Re}(\cdot))$ + +444 368 m +444 352 l +464 352 l + +\tiny$\mathrm{sgn}(\mathrm{Im}(\cdot))$ + +532 408 m +532 408 l +532 408 l +532 408 l +h + +\tiny PUCCH1 (Scheduling Request) +\tiny PUCCH1a/1b (ACK/NAK) +\small\begin{itemize} +\item PUCCH1 detection is a quasi-optimal non-coherent receiver (energy detector) for vector observations (multiple antennas) for scheduling request. Care is taken to handle residual frequency-offset. +\item PUCCH1A/1B detection is quasi-coherent based on a rough channel estimate obtained on the 3 symbols without data modulation. \item In both cases, correlation is done in the frequency-domain +\end{itemize} + + + + +\small\begin{itemize} +\item Threads (all in {\tt targets/RT/USER/lte-ru.c}) +\begin{itemize} +\item {\tt ru\_thread}: Thread per RU which sequentially +performs +\begin{itemize} +\item read from south interface (RF or IF fronthaul) +\item RX processing for subframe $n$ (if necessary). +\item wakeup eNBs that are waiting for signal (if necessary) +\item wait for eNB task completion (if necessary) +\item do TX processing for subframe $n+4$ (if necessary). Note that this can spawn multiple worker threads for very high order spatial processing (e.g. massive-MIMO or DAS for UDN) +\item do outgoing fronthaul (RF or IF fronthaul) +\end{itemize} +\item {\tt ru\_thread\_prach}: Thread for PRACH processing in remote RU (DFT on RX, IF4p5 RRU) +\item {\tt ru\_thread\_asynch}: Thread for asynchronous reception from fronthaul interface (TX direction in RRU). %Allows for some jitter so as not to block the RRU real-time processing. +\end{itemize} +\item Synchronization on fronthaul interface +\begin{itemize} +\item {\em synch\_to\_ext\_device} : synchronizes to incoming samples from RF or Fronthaul interface using blocking read +\item {\em synch\_to\_other} : synchronizes via POSIX mechanism to other source (other CC, timer) which maintains real-time. +\end{itemize} +\end{itemize} +RU Threads + + + + +\small\begin{itemize} +\item Threads (all in {\tt targets/RT/USER/lte-enb.c}) +\begin{itemize} +\item multi RX/TX thread mode (optional) +\begin{itemize} +\item {\tt eNB\_thread\_rxtx}: 2 threads per CC/Instance which do both RX procedures for subframe $n$ and TX procedures for subframe $n+4$. One operates on even subframes, one on odd. This allows 1ms subframe processing to use multiple-cores. +\end{itemize} +\item common RU-eNB RX/TX thread (default if single RU/eNB) +\begin{itemize} +\item calls {\tt eNB\_top}: procedure per CC/Instance which sequentially +\begin{itemize} +\item blocks on signal from RU +\item RX/TX processing for subframe $n$ and $n+4$ +\item signals completion to RU +\end{itemize} +\end{itemize} +\item {\tt eNB\_prach}: Thread per CC\_id/Instance for PRACH processing +\end{itemize} +\end{itemize} +eNB Threads + + + + + +400 400 m +400 388 l +520 388 l +520 400 l +h + + +400 432 m +400 420 l +520 420 l +520 432 l +h + + +400 448 m +400 436 l +528 436 l +528 448 l +h + + +400 448 m +400 436 l +528 436 l +528 448 l +h + + +192 388 m +192 364 l +272 364 l +272 388 l +h + + +32 480 m +32 464 l +112 464 l +112 480 l +h + +eNB Timing (multi-thread mode) + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny SF $n+1$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny SF $n+2$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny SF $n+3$ +\tiny $n$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny$n+4$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny SF $n+4$ + +32 480 m +212 572 +352 480 c + + +384 464 m +384 464 l + + +380 472 m +380 472 l + +\tiny\begin{itemize} +\item The current processing requires approximately 1ms peak in each direction (basically 1 core RX, 1core TX). The current architecture will work on a single core if the sum of RX and TX procedures is limited to 1ms. It can fit on 2 cores if the sum of RX,TX and PRACH is less than 2ms. +\item three threads, RX-TX even, RX-TX odd and PRACH. RX-TX blocks until woken by the RU thread with a new RX subframe $n$ that is linked to this eNB process. The RX-TX thread performs ue-specific processing for subframe $n$ and then TX common and ue-specific processing for subframe $n+4$ (frequency-domain generation only). This insures the data dependency between TX $n+4$ and RX $n$ is respected. The duration of this thread should be less than 2ms which can compensate some jitter on the RX processing. +\end{itemize} + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny SF $n$ +\tiny LTE HARQ periodicity (FDD, TDD can be longer) +\tiny PRACH $n$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny $n+1$ +\tiny $n$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny$n+5$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny $n+1$ + +124 424 m +172 416 +152 392 c + + +204 424 m +228 424 +236 416 c + + +192 396 m +196 416 l + + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny $n-1$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny$n+3$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny $n-1$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny $n+2$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + +\tiny$n+6$ + +32 480 m +32 464 l +112 464 l +112 480 l +h + + +284 424 m +308 424 +316 436 c + +\tiny $n+2$ + +268 452 m +276 436 l + +\tiny RU thread +\tiny RX-TX thread (even) + +400 448 m +400 436 l +528 436 l +528 448 l +h + + +400 448 m +400 436 l +528 436 l +528 448 l +h + +\tiny RX-TX thread (odd) +\tiny PRACH + +192 396 m +196 416 l + + + + + + +96 384 m +96 320 l +640 320 l +640 384 l +h + + +96 384 m +96 320 l +640 320 l +640 384 l +h + + +96 384 m +96 320 l +640 320 l +640 384 l +h + + +96 384 m +96 320 l +640 320 l +640 384 l +h + + +128 368 m +128 336 l +352 336 l +352 368 l +h + + +128 368 m +128 336 l +352 336 l +352 368 l +h + + +175.695 380 m +176.42 128 l + +OAI IF1'' Interface (can be NFAPI) +\tiny\begin{itemize} +\item OAI IF1'' is the interface between the 36.321 Medium-Access (MAC) Layer Procedures and the 36.213 Physical Layer Procedures. It links several PHY instances to one MAC instance. +\item It is a configurable (dynamically loadable) module which can implement an (N)FAPI P5/P7 or a simpler interface. +\end{itemize} + +128 368 m +128 336 l +352 336 l +352 368 l +h + +\tiny Random-Access +\tiny Events +\small PHY procedures +\tiny {\tt initiate\_ra\_proc()} +\tiny {\tt terminate\_ra\_proc()} +\tiny {\tt cancel\_ra\_proc()} +\tiny {\tt phy\_config\_dedicated()} +\tiny {\tt phy\_config\_sib1()} +\tiny {\tt phy\_config\_sib2()} +\tiny {\tt phy\_config\_sib13()} + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + +\tiny {\tt eNB\_dlsch\_ulsch\_scheduler()} +\tiny {\tt get\_dcii\_sdu()} + +175.695 380 m +176.42 128 l + +\tiny {\tt get\_dlsch\_sdu()} + +175.695 380 m +176.42 128 l + +\tiny {\tt rx\_sdu()} + +175.695 380 m +176.42 128 l + +\tiny {\tt get\_mch\_sdu()} + +175.695 380 m +176.42 128 l + +\tiny {\tt SR\_indication()} + +175.695 380 m +176.42 128 l + + +128 368 m +128 336 l +352 336 l +352 368 l +h + +\tiny PHY Config +\tiny Scheduling +\small {\tt 36.213/36.321}\\ +{\tt openair2/LAYER2/MAC} +\small {\tt 36.211/212}\par +{\tt openair1/PHY} + +96 384 m +96 320 l +640 320 l +640 384 l +h + +\small OAI MAC interface +\tiny {\tt phy\_config\_mib()} + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + + +175.695 380 m +176.42 128 l + +\small UL-Indication +\small Config-Req +\small Schedule-Resp +\tiny Northbound interface +\tiny Southbound interface + + + + +OAI IF1'' Interface +\tiny\begin{itemize} +\item The PHY end uses three basic messages +\begin{itemize} +\item {\tt CONFIG\_REQ}: this provides the cell configuration and UE-specific configuration to the PHY instances. This comprises the following FAPI P5/P7 messages +\begin{enumerate} +\item CONFIG.request +\item UE\_CONFIG.request (**not used in OAI PHY) +\end{enumerate} +\item {\tt UL\_INDICATION} This is an uplink indication that sends all UL information received in one TTI, including PRACH, if available. It also provides the subframe indication for the DL scheduler. It maps to the following FAPI P7 messages +\begin{enumerate} +\item {\tt SUBFRAME.indication} +\item {\tt HARQ.indication} +\item {\tt CRC.indication } +\item {\tt RX\_ULSCH.indication} +\item {\tt RX\_SR.indication} +\item {\tt RX\_CQI.indication} +\item {\tt RACH.indication} +\item {\tt SRS.indication} +\end{enumerate} +\item {\tt SCHEDULE\_REQUEST} This message contains the scheduling response information and comprises the following FAPI P7 messages +\begin{enumerate} +\item {\tt DL\_CONFIG.request} +\item {\tt UL\_CONFIG.request} +\item {\tt TX.request} +\item {\tt HI\_DCI0.request} +\end{enumerate} +\end{itemize} +\item The module is registered both by PHY and MAC and can implement different types of transport (NFAPI, function call, FAPI over UDP, etc.). During registration, fuction pointers for the different messages are provided for the module to interact with either PHY or MAC or both if they are executing in the same machine. Note that for a networked implementation (e.g. NFAPI), there are north and south components running in different machines. +\end{itemize} + + + + +OAI IF1'' Interface +\small\begin{itemize} +\item The PHY-layer timing is assumed to be +\begin{enumerate} +\item wait for subframe indication $n$ from HW +\item trigger PRACH if $n$ has PRACH (parallel thread) +\item trigger UE specific RX procedures for $n$ if $n$ is UL +\item assemble {\tt UL\_INDICATION} and send to MAC +\item wait for {\tt SCHEDULE\_REQUEST} +\item do TX procedures if $n+4$ is TX and RX programming if $n+4+k$ is UL +\end{enumerate} +\item The MAC-layer timing is assumed to be +\begin{enumerate} +\item do all UL processing for subframe $n$ if $n$ is UL after unraveling of UL\_INDICATION in MAC module +\item wait for call to {\tt eNB\_dlsch\_ulsch\_scheduler} +\item do DL scheduling for $n+4$ if it is DL +\item do UL scheduling for $n+8$ if it is UL +\item return from eNB\_dlsch\_ulsch\_scheduler +\item let MAC module form SCHEDULE\_REQUEST +\end{enumerate} +\end{itemize} + + + + + +96 384 m +96 320 l +640 320 l +640 384 l +h + + +128 368 m +128 336 l +352 336 l +352 368 l +h + + +128 368 m +128 336 l +352 336 l +352 368 l +h + +OAI MAC + +128 368 m +128 336 l +352 336 l +352 368 l +h + +\tiny Random-Access +\tiny Events + +128 368 m +128 336 l +352 336 l +352 368 l +h + +\tiny PHY Config +\tiny Scheduling +\small {\tt 36.321}\\ +{\tt openair2/LAYER2/MAC} + +175.695 380 m +176.42 128 l + + +176 496 m +176 384 l +400 384 l +400 496 l +h + + +176 496 m +176 384 l +400 384 l +400 496 l +h + +\small RRC + +384 384 m +272 144 l + + +384 384 m +384 144 l + + +384 384 m +528 144 l + + +608 384 m +528 144 l + +\small RLC + +176 496 m +176 384 l +400 384 l +400 496 l +h + +\small Preprocessor + +160 256 m +528 144 l + + +272 312 m +608 384 l + + +472 504 m +472 232 l +152 232 l +152 40 l +728 40 l +736 40 l +736 504 l +h + +\small {\tt 36.322}\\ +{\tt openair2/LAYER2/RLC} +\small {\tt user customizable scheduling module} + + + + +TX Precoding +\small\begin{itemize} +\item Spatio-temporal filtering for muli-cell (vCell) and multi-user transmission. Input and output are frequency-domain signals. +\item can be applied to Rel-10/11/12/13 physical channels and Rel-8 common channels +\begin{itemize} +\item UE-specific precoding (TM7-10) +\item vCell-specific precoding (PDCCH + TM1-6) for groups of UEs +\item PMCH vCells +\end{itemize} +\item Precoding applicable to +\begin{enumerate} +\item indoor DAS +\item outdoor co-localized arrays (e,g, Massive-MIMO) +\item outdoor CoMP +\end{enumerate} +\end{itemize} + +208 480 m +208 80 l +512 80 l +512 480 l +h + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +400 160 +480 192 +528 160 +400 160 +400 160 u + + +400 96 +448 128 +512 144 +576 96 +496 80 +400 96 +400 96 u + + +480 160 m +480 160 l + + +496 160 m +496 160 l + + +400 96 +448 128 +512 144 +576 96 +496 80 +400 96 +400 96 u + +\small UE +\small vCell +\small vCell +TX Precoding + + + + + +608 516 m +607 37 l +679 37 l +680 516 l +h + + +632 360 m +632 188 l +660 188 l +660 360 l +h + +TX Precoding (to RF device) + +208 480 m +208 80 l +512 80 l +512 480 l +h + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + +\tt eNB[0] +\tt eNB[1] +\tt eNB[CC\_max] + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +528 464 m +528 416 l +592 416 l +592 464 l +h + +\tiny\tt rf\_device[0] + +528 464 m +528 416 l +592 416 l +592 464 l +h + +\tiny\tt rf\_device[1] + +528 464 m +528 416 l +592 416 l +592 464 l +h + +\tiny\tt rf\_device[N-1] + +192 432 m +192 368 l +272 368 l +272 432 l +h + + +192 432 m +192 368 l +272 368 l +272 432 l +h + + +192 432 m +192 368 l +272 368 l +272 432 l +h + +\tiny\tt common signal precoding(vCell)\\ PBCH,PSS/SSS,PCFICH/PHICH/PDCCH\\ +PDSCH - TM1-6 +\tiny\tt UE-specific signal precoding(vCell)\\ +UE-RS,PDSCH - TM7-10 +\tiny\tt PMCH precoding + +145 413.44 m +192 384 l + + +145 413.44 m +192 288 l + + +145 413.44 m +192 192 l + + +145 349.44 m +192 384 l + + +145 349.44 m +191.982 288.048 l + + +145 349.44 m +191.982 192.084 l + + +145 157.44 m +192 384 l +192 384 l + + +145 157.44 m +191.982 288.048 l + + +145 157.44 m +191.982 192.084 l + + +400 384 m +449 447.637 l + + +400.059 384.077 m +449 431.796 l + + +400.059 384.077 m +449 383.637 l + + +400.059 384.077 m +449 367.763 l + + +400.059 384.077 m +449 143.57 l + + +400.059 384.077 m +449 127.637 l + + +400 288 m +449 383.637 l + + +400.001 288.002 m +449 367.763 l + + +400.001 288.002 m +449 143.57 l + + +400.001 288.002 m +449 127.637 l + + +400 192 m +449 447.637 l + + +400.001 288.002 m +449 447.637 l + + +400.001 288.002 m +448.966 431.763 l + + +400.001 192.005 m +449 367.763 l + + +400.001 192.005 m +449 143.57 l + + +400.001 192.005 m +449 127.637 l + +\tiny phy\_vars\_eNB.txdataF +\tiny phy\_vars\_eNB.txdata + +632 264.556 m +671.833 265 l + +\setstretch{.5}\tt\tiny do\_ofdm\_mod\_rt()\par 36.211 + + + + +TX Precoding (to IF device, NGFI\_IFv4p5) + +208 480 m +208 80 l +512 80 l +512 480 l +h + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + +\tt eNB[0] +\tt eNB[1] +\tt eNB[CC\_max] + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +128 448 m +208 448.44 l + + +528 464 m +528 416 l +592 416 l +592 464 l +h + +\tiny\tt if\_device[0] + +528 464 m +528 416 l +592 416 l +592 464 l +h + +\tiny\tt if\_device[1] + +528 464 m +528 416 l +592 416 l +592 464 l +h + +\tiny\tt if\_device[N-1] + +192 432 m +192 368 l +272 368 l +272 432 l +h + + +192 432 m +192 368 l +272 368 l +272 432 l +h + + +192 432 m +192 368 l +272 368 l +272 432 l +h + +\tiny\tt common signal precoding(vCell)\\ PBCH,PSS/SSS,PCFICH/PHICH/PDCCH\\ +PDSCH - TM1-6 +\tiny\tt UE-specific signal precoding(vCell)\\ +UE-RS,PDSCH - TM7-10 +\tiny\tt PMCH precoding + +145 413.44 m +192 384 l + + +145 413.44 m +192 288 l + + +145 413.44 m +192 192 l + + +145 349.44 m +192 384 l + + +145 349.44 m +191.982 288.048 l + + +145 349.44 m +191.982 192.084 l + + +145 157.44 m +192 384 l +192 384 l + + +145 157.44 m +191.982 288.048 l + + +145 157.44 m +191.982 192.084 l + + +400 384 m +449 447.637 l + + +400.059 384.077 m +449 431.796 l + + +400.059 384.077 m +449 383.637 l + + +400.059 384.077 m +449 367.763 l + + +400.059 384.077 m +449 143.57 l + + +400.059 384.077 m +449 127.637 l + + +400 288 m +449 383.637 l + + +400.001 288.002 m +449 367.763 l + + +400.001 288.002 m +449 143.57 l + + +400.001 288.002 m +449 127.637 l + + +400 192 m +449 447.637 l + + +400.001 288.002 m +449 447.637 l + + +400.001 288.002 m +448.966 431.763 l + + +400.001 192.005 m +449 367.763 l + + +400.001 192.005 m +449 143.57 l + + +400.001 192.005 m +449 127.637 l + + +448 544 m +448 544 l + + +432 544 m +432 544 l + + +624 432 m +672 432 l + + +624 432 m +672 432 l + + +624 432 m +672 432 l + +\tiny NGFI\_IFv4p5 +\tiny NGFI\_IFv4p5 +\tiny NGFI\_IFv4p5 + + diff --git a/targets/DOCS/oai_L1_L2_procedures.pdf b/targets/DOCS/oai_L1_L2_procedures.pdf new file mode 100644 index 0000000000..4e8059f503 Binary files /dev/null and b/targets/DOCS/oai_L1_L2_procedures.pdf differ diff --git a/targets/Makefile b/targets/Makefile deleted file mode 100644 index b604898d2a..0000000000 --- a/targets/Makefile +++ /dev/null @@ -1,35 +0,0 @@ - - -build: - ./build_oai.bash -c -m - -build_rtai: - ./build_oai.bash -c -b -eRTAI -tSOFTMODEM -m - -build_usrp_rtai: - ./build_oai.bash -c -b -eRTAI -tSOFTMODEM -wUSRP -m - - -help: - @echo make check1 performs a simple sanity check - @echo make check2 performs another simple sanity check - @echo make check does both the above checks - -all: help - -check1: - @echo Doing 1 eNB 1 UE test - (cd SIMU/EXAMPLES/VIRT_EMUL_1eNB && make one_eNB_one_UE ) - -check2: - @echo Doing 1 eNB 4 UE test - (cd SIMU/EXAMPLES/VIRT_EMUL_1eNB && make one_eNB_four_UE ) - -install: - @echo Generating ASN1 files - @sh SCRIPTS/install_asn1.sh - -check: check1 check2 - -clean: - (cd SIMU/USER && make clean) diff --git a/targets/Makefile.common b/targets/Makefile.common index 042a36bf45..ac0771770b 100644 --- a/targets/Makefile.common +++ b/targets/Makefile.common @@ -86,7 +86,6 @@ endif ifeq ($(ENABLE_ITTI),1) COMMON_CFLAGS += -DENABLE_ITTI -COMMON_CFLAGS += -DUSER_MODE COMMON_CFLAGS += -I$(OPENAIR1_DIR) COMMON_CFLAGS += -I$(OPENAIR2_DIR)/NAS COMMON_CFLAGS += $(L2_incl) diff --git a/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/COPYING b/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/PROJECTS/CENTOS-LTE-EPC-INTEGRATION/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/PROJECTS/COPYING b/targets/PROJECTS/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/PROJECTS/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/PROJECTS/E-MBMS/build_all.bash b/targets/PROJECTS/E-MBMS/build_all.bash index 270c0c9d47..bac9b33736 100755 --- a/targets/PROJECTS/E-MBMS/build_all.bash +++ b/targets/PROJECTS/E-MBMS/build_all.bash @@ -1,34 +1,24 @@ #! /bin/bash -################################################################################ -# Eurecom OpenAirInterface core network -# Copyright(c) 1999 - 2014 Eurecom -# -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. -# -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. -# -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". -# -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : EURECOM, -# Campus SophiaTech, -# 450 Route des Chappes, -# CS 50193 -# 06904 Biot Sophia Antipolis cedex, -# FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file build_all.bash # brief @@ -71,8 +61,8 @@ echo_success "\n###############################" echo_success "# COMPILE oaisim" echo_success "###############################" cd $OPENAIR_TARGETS/SIMU/USER -echo_success "Executing: make oaisim NAS=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 Rel10=1 -j`grep -c ^processor /proc/cpuinfo `" -make oaisim NAS=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 Rel10=1 -j`grep -c ^processor /proc/cpuinfo ` +echo_success "Executing: make oaisim NAS=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 Rel10=1 -j`grep -c ^processor /proc/cpuinfo `" +make oaisim NAS=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 Rel10=1 -j`grep -c ^processor /proc/cpuinfo ` if [[ $? -eq 2 ]] ; then exit 1 fi diff --git a/targets/PROJECTS/E-MBMS/start_enb.bash b/targets/PROJECTS/E-MBMS/start_enb.bash index 597f38eb1f..8e62c8e09c 100755 --- a/targets/PROJECTS/E-MBMS/start_enb.bash +++ b/targets/PROJECTS/E-MBMS/start_enb.bash @@ -1,34 +1,24 @@ #!/bin/bash -################################################################################ -# Eurecom OpenAirInterface core network -# Copyright(c) 1999 - 2014 Eurecom -# -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. -# -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. -# -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". -# -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : EURECOM, -# Campus SophiaTech, -# 450 Route des Chappes, -# CS 50193 -# 06904 Biot Sophia Antipolis cedex, -# FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file start_enb.bash # brief diff --git a/targets/PROJECTS/E-MBMS/start_ue.bash b/targets/PROJECTS/E-MBMS/start_ue.bash index a1a862210a..7e856a8ef4 100755 --- a/targets/PROJECTS/E-MBMS/start_ue.bash +++ b/targets/PROJECTS/E-MBMS/start_ue.bash @@ -1,34 +1,24 @@ #!/bin/bash -################################################################################ -# Eurecom OpenAirInterface core network -# Copyright(c) 1999 - 2014 Eurecom -# -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. -# -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. -# -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". -# -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : EURECOM, -# Campus SophiaTech, -# 450 Route des Chappes, -# CS 50193 -# 06904 Biot Sophia Antipolis cedex, -# FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file start_ue.bash # brief diff --git a/targets/PROJECTS/E-MBMS/utils.bash b/targets/PROJECTS/E-MBMS/utils.bash index e95fd9e5b6..a2fe556c29 100755 --- a/targets/PROJECTS/E-MBMS/utils.bash +++ b/targets/PROJECTS/E-MBMS/utils.bash @@ -1,34 +1,24 @@ #!/bin/bash -################################################################################ -# Eurecom OpenAirInterface core network -# Copyright(c) 1999 - 2014 Eurecom -# -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. -# -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. -# -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". -# -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : EURECOM, -# Campus SophiaTech, -# 450 Route des Chappes, -# CS 50193 -# 06904 Biot Sophia Antipolis cedex, -# FRANCE +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file utils.bash # brief diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.exmimo2.conf deleted file mode 100644 index e11e5e84ff..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.exmimo2.conf +++ /dev/null @@ -1,171 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 13; - downlink_frequency = 748500000L; - uplink_frequency_offset = 31000000; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 2; - rx_gain = 2; - prach_root = 22; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -75; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.171/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.171/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="high"; - hw_log_level ="info"; - hw_log_verbosity ="high"; - phy_log_level ="info"; - phy_log_verbosity ="high"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="high"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="high"; - rrc_log_level ="info"; - rrc_log_verbosity ="high"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.rel10.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.rel10.exmimo2.conf deleted file mode 100644 index 6298932c7b..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.rel10.exmimo2.conf +++ /dev/null @@ -1,170 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 13; - downlink_frequency = 748500000L; - uplink_frequency_offset = 31000000; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 2; - rx_gain = 2; - prach_root = 22; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -75; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth1"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.171/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth1"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.171/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="high"; - hw_log_level ="info"; - hw_log_verbosity ="high"; - phy_log_level ="info"; - phy_log_verbosity ="high"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="high"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="high"; - rrc_log_level ="info"; - rrc_log_verbosity ="high"; - }; - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.sedora.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.sedora.conf deleted file mode 100644 index 2d0b63e4b0..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.sedora.conf +++ /dev/null @@ -1,171 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "93"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 751000000L; - uplink_frequency_offset = 30000000; - Nid_cell = 0; - N_RB_DL = 50; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 60; - rx_gain = 111; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band3.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band3.tm1.usrpb210.conf deleted file mode 100644 index 0a6def7757..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band3.tm1.usrpb210.conf +++ /dev/null @@ -1,170 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "93"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 3; - downlink_frequency = 1865000000L; - uplink_frequency_offset = -95000000; - Nid_cell = 0; - N_RB_DL = 50; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 90; - rx_gain = 125; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -108; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.conf deleted file mode 100755 index 2cf57137c6..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.conf +++ /dev/null @@ -1,171 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Channel parameters: - - component_carriers = ( - { - frame_type = "TDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 38; - downlink_frequency = 2580000000L; - uplink_frequency_offset = 0; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - prach_root = 22; - prach_config_index = 3; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 0; - prach_freq_offset = 0; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 4; - pusch_groupHoppingEnabled = "DISABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -95; - pusch_alpha = "AL08"; - pucch_p0_Nominal = -117; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 52; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -104; - rach_preambleTransMax = 6; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="debug"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="debug"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf deleted file mode 100644 index ae989b5c8d..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.generic.oaisim.local_no_mme.conf +++ /dev/null @@ -1,146 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "10"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "TDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 38; - downlink_frequency = 2580000000L; - uplink_frequency_offset = 0; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 25; - rx_gain = 20; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = 0; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -108; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "0.0.0.0"; - ipv6 = "0::0"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "none"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "0.0.0.0/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "none"; - ENB_IPV4_ADDRESS_FOR_S1U = "0.0.0.0/24"; - ENB_PORT_FOR_S1U = 2153; # Spec 2152 - }; - - log_config : - { - global_log_level ="trace"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="trace"; - phy_log_verbosity ="medium"; - mac_log_level ="trace"; - mac_log_verbosity ="medium"; - rlc_log_level ="trace"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="trace"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="trace"; - rrc_log_verbosity ="medium"; - gtpu_log_level ="debug"; - gtpu_log_verbosity ="medium"; - udp_log_level ="debug"; - udp_log_verbosity ="medium"; - osa_log_level ="debug"; - osa_log_verbosity ="low"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.exmimo2.conf deleted file mode 100644 index 9444a6f95e..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.exmimo2.conf +++ /dev/null @@ -1,169 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "93"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "TDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 38; - downlink_frequency = 2580000000L; - uplink_frequency_offset = 0; //-120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 10; //25; - rx_gain = 10; //20; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.70"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.212/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.212/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="debug"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="debug"; - rrc_log_verbosity ="medium"; - }; - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.conf deleted file mode 100755 index 45d31336b9..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.conf +++ /dev/null @@ -1,179 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Channel parameters: - // Default Paging DRX of the eNB as defined in TS 36.304 - default_paging_drx = "PAGING_DRX_256"; - - ////////// Physical parameters: - frame_type = "TDD"; - prefix_type = "NORMAL"; - eutra_band = 39; - downlink_frequency = 1910000000L; - uplink_frequency_offset = 0; - - component_carriers = ( - { - frame_type = "TDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 39; - downlink_frequency = 1910000000L; - uplink_frequency_offset = 0; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - prach_root = 22; - prach_config_index = 3; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 0; - prach_freq_offset = 0; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 4; - pusch_groupHoppingEnabled = "DISABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -95; - pusch_alpha = "AL08"; - pucch_p0_Nominal = -117; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 52; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -104; - rach_preambleTransMax = 6; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="debug"; - global_log_verbosity ="medium"; - hw_log_level ="debug"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="debug"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.exmimo2.conf deleted file mode 100644 index c8214ad999..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.exmimo2.conf +++ /dev/null @@ -1,173 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "93"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "TDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 39; - downlink_frequency = 1907600000L; - /*downlink_frequency = 1907601000L; for card 33*/ - /*downlink_frequency = 1907602425L; for card 59*/ - /*downlink_frequency = 1907599425L; for card 37*/ - uplink_frequency_offset = 0; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 20; - rx_gain = 20; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -90; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.171"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.212/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.212/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="debug"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.usrpb210.conf deleted file mode 100755 index 8caeca0edb..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band39.tm1.usrpb210.conf +++ /dev/null @@ -1,181 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Channel parameters: - // Default Paging DRX of the eNB as defined in TS 36.304 - default_paging_drx = "PAGING_DRX_256"; - - ////////// Physical parameters: - frame_type = "TDD"; - prefix_type = "NORMAL"; - eutra_band = 39; - downlink_frequency = 1910000000L; - uplink_frequency_offset = 0; - - component_carriers = ( - { - frame_type = "TDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 39; - downlink_frequency = 1910000000L; - uplink_frequency_offset = 0; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 90; - rx_gain = 120; - prach_root = 22; - prach_config_index = 3; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 0; - prach_freq_offset = 0; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 4; - pusch_groupHoppingEnabled = "DISABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -95; - pusch_alpha = "AL08"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 52; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -104; - rach_preambleTransMax = 6; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="debug"; - global_log_verbosity ="high"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="debug"; - phy_log_verbosity ="high"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band4.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band4.tm1.usrpb210.conf deleted file mode 100644 index 853db14393..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band4.tm1.usrpb210.conf +++ /dev/null @@ -1,170 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "93"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 4; - downlink_frequency = 2120000000L; - uplink_frequency_offset = -400000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 90; - rx_gain = 128; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -90; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band5.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band5.tm1.usrpb210.conf deleted file mode 100644 index 827cd8834a..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band5.tm1.usrpb210.conf +++ /dev/null @@ -1,171 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 5; - downlink_frequency = 879000000L; - uplink_frequency_offset = -45000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 90; - rx_gain = 115; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -90; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.exmimo2.conf deleted file mode 100644 index bc9d15195c..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.exmimo2.conf +++ /dev/null @@ -1,192 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 2; - nb_antennas_rx = 2; - tx_gain = 25; - rx_gain = 20; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth1"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth1"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; - - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - /* - otg_config = ( - { - ue_id =1; - app_type ="scbr"; - bg_traffic ="disable"; - }, - { - ue_id =2; - app_type ="bcbr"; - bg_traffic ="enable"; - } - ); -*/ - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="debug"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="debug"; - rrc_log_verbosity ="medium"; - gtpu_log_level ="error"; - gtpu_log_verbosity ="medium"; - udp_log_level ="error"; - udp_log_verbosity ="medium"; - osa_log_level ="warn"; - osa_log_verbosity ="low"; - - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.exmimo2_2a.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.exmimo2_2a.conf deleted file mode 100644 index afd7ccb68d..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.exmimo2_2a.conf +++ /dev/null @@ -1,171 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 30; - rx_gain = 25; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -50; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* - srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =; - */ - - pusch_p0_Nominal = -75; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -90; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.82/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.82/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="debug"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.conf deleted file mode 100644 index 10bee7627a..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.conf +++ /dev/null @@ -1,192 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 25; - rx_gain = 20; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = 0; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -108; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - /* - otg_config = ( - { - ue_id =1; - app_type ="scbr"; - bg_traffic ="disable"; - }, - { - ue_id =2; - app_type ="bcbr"; - bg_traffic ="enable"; - } - ); -*/ - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="debug"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="debug"; - rrc_log_verbosity ="medium"; - gtpu_log_level ="error"; - gtpu_log_verbosity ="medium"; - udp_log_level ="error"; - udp_log_verbosity ="medium"; - osa_log_level ="warn"; - osa_log_verbosity ="low"; - - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf deleted file mode 100644 index 630d6f028e..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf +++ /dev/null @@ -1,177 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "10"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 25; - rx_gain = 20; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = 0; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -108; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.188.2.2"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "tun2"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.188.2.2/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "lo"; - ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.1/8"; - ENB_PORT_FOR_S1U = 2153; # Spec 2152 - }; - - log_config : - { - global_log_level ="trace"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="trace"; - phy_log_verbosity ="medium"; - mac_log_level ="trace"; - mac_log_verbosity ="medium"; - rlc_log_level ="trace"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="trace"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="trace"; - rrc_log_verbosity ="medium"; - gtpu_log_level ="debug"; - gtpu_log_verbosity ="medium"; - udp_log_level ="debug"; - udp_log_verbosity ="medium"; - osa_log_level ="debug"; - osa_log_verbosity ="low"; - - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf deleted file mode 100644 index b5d13d5b54..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_no_mme.conf +++ /dev/null @@ -1,160 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "10"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 25; - rx_gain = 20; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = 0; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -108; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "0.0.0.0"; - ipv6 = "0::0"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "none"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "0.0.0.0/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "none"; - ENB_IPV4_ADDRESS_FOR_S1U = "0.0.0.0/24"; - ENB_PORT_FOR_S1U = 2153; # Spec 2152 - }; - - FLEXSPLIT_INTERFACES : - { - DU_INTERFACE_NAME_FOR_F1U = "eth0"; - DU_IPV4_ADDRESS_FOR_F1U = "127.0.0.1/24"; - DU_PORT_FOR_F1U = 2210; - - CU_INTERFACE_NAME_FOR_F1U = "lo"; - CU_IPV4_ADDRESS_FOR_F1U = "10.64.45.62"; //Address to search the DU - CU_PORT_FOR_F1U = 2210; - - // One of TCP/UDP/SCTP - F1_U_TRANSPORT_TYPE = "UDP"; - }; - - log_config : - { - global_log_level ="trace"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="trace"; - phy_log_verbosity ="medium"; - mac_log_level ="trace"; - mac_log_verbosity ="medium"; - rlc_log_level ="trace"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="trace"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="trace"; - rrc_log_verbosity ="medium"; - gtpu_log_level ="debug"; - gtpu_log_verbosity ="medium"; - udp_log_level ="debug"; - udp_log_verbosity ="medium"; - osa_log_level ="debug"; - osa_log_verbosity ="low"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.bladerfx40.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.bladerfx40.conf deleted file mode 100644 index eb3895dc6d..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.bladerfx40.conf +++ /dev/null @@ -1,171 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "93"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 50; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 60; - rx_gain = 60; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -90; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf deleted file mode 100644 index dae0187f18..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.lmssdr.conf +++ /dev/null @@ -1,171 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "95"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 50; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 60; - rx_gain = 111; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.62"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf deleted file mode 100644 index 4cd761645b..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.rrh.lmssdr.conf +++ /dev/null @@ -1,192 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "93"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 50; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 60; - rx_gain = 111; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.170"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - -rrh_gw_config = ( - { - local_if_name = "eth0"; - #remote_address = "169.254.10.158"; - #local_address = "169.254.8.15"; - remote_address = "74:d4:35:cc:88:45"; - local_address = "d4:be:d9:22:0a:ac"; - local_port = 50000; #for raw option local port must be the same to remote - remote_port = 50000; - rrh_gw_active = "yes"; - tr_preference = "raw"; - rf_preference = "lmssdr"; - iq_txshift = 0; - tx_sample_advance = 45; - tx_scheduling_advance = 8; - -} -); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.118/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth6"; - - - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.118/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf index d00482edca..95e006b705 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf @@ -19,87 +19,96 @@ eNBs = mobile_network_code = "93"; - ////////// Physical parameters: + tr_s_preference = "local_mac" + + ////////// Physical parameters: component_carriers = ( { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 50; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 90; - rx_gain = 125; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ + node_function = "3GPP_eNODEB"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2685000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + pbch_repetition = "FALSE"; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 0; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -27; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ - pusch_p0_Nominal = -96; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -103; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -104; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; } ); + srb1_parameters : { # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] @@ -129,8 +138,9 @@ eNBs = SCTP_OUTSTREAMS = 2; }; + ////////// MME parameters: - mme_ip_address = ( { ipv4 = "127.0.0.3"; + mme_ip_address = ( { ipv4 = "10.64.93.26"; ipv6 = "192:168:30::17"; active = "yes"; preference = "ipv4"; @@ -139,30 +149,90 @@ eNBs = NETWORK_INTERFACES : { - ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; - ENB_INTERFACE_NAME_FOR_S1U = "lo"; - ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_INTERFACE_NAME_FOR_S1_MME = "eno1"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "10.64.45.62/23"; + ENB_INTERFACE_NAME_FOR_S1U = "eno1"; + ENB_IPV4_ADDRESS_FOR_S1U = "10.64.45.62/23"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; + }; + } ); + +DU = ( + { + DU_INTERFACE_NAME_FOR_F1U = "lo"; + DU_IPV4_ADDRESS_FOR_F1U = "127.0.0.1/16"; + DU_PORT_FOR_F1U = 2210; + F1_U_DU_TRANSPORT_TYPE = "TCP"; + } + ); + +CU = ( + { + CU_INTERFACE_NAME_FOR_F1U = "lo"; + CU_IPV4_ADDRESS_FOR_F1U = "127.0.0.1"; //Address to search the DU + CU_PORT_FOR_F1U = 2210; + F1_U_CU_TRANSPORT_TYPE = "TCP"; // One of TCP/UDP/SCTP + DU_TYPE = "LTE"; + }//, +// { +// CU_INTERFACE_NAME_FOR_F1U = "eth0"; +// CU_IPV4_ADDRESS_FOR_F1U = "10.64.93.142"; //Address to search the DU +// CU_PORT_FOR_F1U = 2211; +// F1_U_CU_TRANSPORT_TYPE = "TCP"; // One of TCP/UDP/SCTP +// DU_TYPE = "WiFi"; +// } + ); + + CU_BALANCING = "ALL"; + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [7]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 125; + eNB_instances = [0]; + + } +); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + }; + diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf deleted file mode 100644 index 5a6a9a462b..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.bladerfx40.conf +++ /dev/null @@ -1,171 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "93"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 60; - rx_gain = 120; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -90; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf deleted file mode 100644 index f1160e78ca..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.conf +++ /dev/null @@ -1,176 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "93"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 25; - rx_gain = 20; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -90; /*-85;*/ - pusch_alpha = "AL1"; - pucch_p0_Nominal = -100; /* -108 */ - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.171"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth2"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.80/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth2"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.80/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="debug"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="warn"; - phy_log_verbosity ="medium"; - mac_log_level ="warn"; - mac_log_verbosity ="medium"; - rlc_log_level ="warn"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="warn"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - gtpu_log_level ="error"; - gtpu_log_verbosity ="medium"; - udp_log_level ="error"; - udp_log_verbosity ="medium"; - osa_log_level ="warn"; - osa_log_verbosity ="low"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.openEPC.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.openEPC.conf deleted file mode 100644 index e651a2c07d..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.openEPC.conf +++ /dev/null @@ -1,149 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - # real_time choice in {hard, rt-preempt, no} - real_time = "no"; - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "001"; - - mobile_network_code = "01"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 25; - rx_gain = 20; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -80; /*-85;*/ - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; /* -108 */ - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.4.80"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth3"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "10.0.1.10/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth3"; - ENB_IPV4_ADDRESS_FOR_S1U = "10.0.1.10/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="debug"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="warn"; - phy_log_verbosity ="medium"; - mac_log_level ="warn"; - mac_log_verbosity ="medium"; - rlc_log_level ="warn"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="warn"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - gtpu_log_level ="info"; - gtpu_log_verbosity ="medium"; - udp_log_level ="info"; - udp_log_verbosity ="medium"; - osa_log_level ="warn"; - osa_log_verbosity ="low"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf deleted file mode 100644 index 47e2179d18..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.lmssdr.conf +++ /dev/null @@ -1,171 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 60; - rx_gain = 111; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.170"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.242/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth4"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.242/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.lmssdr.conf deleted file mode 100644 index 9b052bf7ba..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.rrh.lmssdr.conf +++ /dev/null @@ -1,192 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 60; - rx_gain = 111; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.170"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - -rrh_gw_config = ( - { - local_if_name = "eth0"; - #remote_address = "169.254.10.158"; - #local_address = "169.254.8.15"; - remote_address = "74:d4:35:cc:88:45"; - local_address = "d4:be:d9:22:0a:ac"; - local_port = 50000; #for raw option local port must be the same to remote - remote_port = 50000; - rrh_gw_active = "yes"; - tr_preference = "raw"; - rf_preference = "lmssdr"; - iq_txshift = 0; - tx_sample_advance = 70; - tx_scheduling_advance = 8; - -} -); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth6"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.118/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth6"; - - - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.118/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf deleted file mode 100644 index 967b0c0ca8..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf +++ /dev/null @@ -1,168 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "93"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 90; - rx_gain = 125; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -29; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -90; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.213/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.213/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf deleted file mode 100644 index 6e3357e49b..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.usrpb210.conf +++ /dev/null @@ -1,171 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 2; - nb_antennas_rx = 2; - tx_gain = 90; - rx_gain = 132; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -26; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 4; - rach_preambleInitialReceivedTargetPower = -108; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.213/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.213/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.centos.nord.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.centos.nord.conf deleted file mode 100755 index b35a4c2271..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.centos.nord.conf +++ /dev/null @@ -1,83 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - # real_time choice in {hard, rt-preempt, no} - real_time = "no"; - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Channel parameters: - // Default Paging DRX of the eNB as defined in TS 36.304 - default_paging_drx = "PAGING_DRX_256"; - - ////////// Physical parameters: - frame_type = "FDD"; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000; - uplink_frequency_offset = -120000000; - - component_carriers = ( - { - cell_id = 0; - N_RB_DL = 25; - }, - { - cell_id = 1; - N_RB_DL = 50; - } - ); - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="debug"; - global_log_verbosity ="medium"; - hw_log_level ="debug"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="debug"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band13_band4.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band13_band4.exmimo2.conf deleted file mode 100644 index 14f878cda9..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band13_band4.exmimo2.conf +++ /dev/null @@ -1,250 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 13; - downlink_frequency = 748500000L; - uplink_frequency_offset = 31000000; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 2; - rx_gain = 2; - prach_root = 22; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -75; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - }, - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 4; - downlink_frequency = 2112500000L; - uplink_frequency_offset = -400000000; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 2; - rx_gain = 2; - prach_root = 22; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -40; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.82/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.82/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="high"; - hw_log_level ="debug"; - hw_log_verbosity ="high"; - phy_log_level ="debug"; - phy_log_verbosity ="high"; - mac_log_level ="debug"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="high"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="high"; - rrc_log_level ="debug"; - rrc_log_verbosity ="high"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band38_band44.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band38_band44.conf deleted file mode 100644 index 08b34f439f..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band38_band44.conf +++ /dev/null @@ -1,245 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "TDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 38; - downlink_frequency = 2595000000L; - uplink_frequency_offset = 0; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - prach_root = 22; - prach_config_index = 3; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 0; - prach_freq_offset = 0; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 4; - pusch_groupHoppingEnabled = "DISABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -95; - pusch_alpha = "AL08"; - pucch_p0_Nominal = -117; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 52; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -104; - rach_preambleTransMax = 6; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - }, - { - frame_type = "TDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 44; - downlink_frequency = 747500000L; - uplink_frequency_offset = 0; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - prach_root = 22; - prach_config_index = 3; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 0; - prach_freq_offset = 0; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 4; - pusch_groupHoppingEnabled = "DISABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 1; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -95; - pusch_alpha = "AL08"; - pucch_p0_Nominal = -117; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 52; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -104; - rach_preambleTransMax = 6; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.82/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.82/24"; - }; - - log_config : - { - global_log_level ="debug"; - global_log_verbosity ="medium"; - hw_log_level ="debug"; - hw_log_verbosity ="medium"; - phy_log_level ="debug"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band7_band20.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band7_band20.conf deleted file mode 100644 index 781e2a82e9..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.band7_band20.conf +++ /dev/null @@ -1,250 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680000000L; - uplink_frequency_offset = -120000000; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - prach_root = 22; - tx_gain = 20; - rx_gain = 20; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - }, - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 20; - downlink_frequency = 801000000L; - uplink_frequency_offset = 41000000; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 20; - rx_gain = 20; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -95; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.82/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.82/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="high"; - hw_log_level ="debug"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="debug"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.rel10.band13_band4.exmimo2.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.rel10.band13_band4.exmimo2.conf deleted file mode 100644 index 569e7b39b2..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.dual.rel10.band13_band4.exmimo2.conf +++ /dev/null @@ -1,248 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 13; - downlink_frequency = 748500000L; - uplink_frequency_offset = 31000000; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 2; - rx_gain = 2; - prach_root = 22; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pdsch_referenceSignalPower = -24; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -75; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - }, - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 4; - downlink_frequency = 2112500000L; - uplink_frequency_offset = -400000000; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 2; - rx_gain = 2; - prach_root = 22; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pdsch_referenceSignalPower = -40; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =;*/ - - pusch_p0_Nominal = -85; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; - /* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; - */ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -100; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.82/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.82/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="high"; - hw_log_level ="info"; - hw_log_verbosity ="high"; - phy_log_level ="info"; - phy_log_verbosity ="high"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="high"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="high"; - rrc_log_level ="info"; - rrc_log_verbosity ="high"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.pft.memphis.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.pft.memphis.conf deleted file mode 100755 index 9c39aaa665..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.pft.memphis.conf +++ /dev/null @@ -1,54 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_0"); - -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - # real_time choice in {hard, rt-preempt, no} - real_time = "no"; - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_0"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Channel parameters: - // Default Paging DRX of the eNB as defined in TS 36.304 - default_paging_drx = "PAGING_DRX_256"; - - ////////// Physical parameters: - frame_type = "FDD"; - prefix_type = "NORMAL"; - downlink_frequency = 2680000000; - uplink_frequency_offset = -120000000; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.170"; - ipv6 = "2192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.81/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.81/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.sequans.sud.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.sequans.sud.conf deleted file mode 100644 index 1fc22d023e..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.sequans.sud.conf +++ /dev/null @@ -1,55 +0,0 @@ -//Active_eNBs = ( "eNB_Eurecom_0", "eNB_Eurecom_1", "eNB_Eurecom_2", "eNB_Eurecom_3"); -Active_eNBs = ( "eNB_Eurecom_0"); -Asn1_verbosity = "none"; - -eNBs = -( - { - # real_time choice in {hard, rt-preempt, no} - real_time = "hard"; - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_0"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Channel parameters: - // Default Paging DRX of the eNB as defined in TS 36.304 - default_paging_drx = "PAGING_DRX_256"; - - ////////// Physical parameters: - frame_type = "FDD"; - prefix_type = "NORMAL"; - eutra_band = 4; - downlink_frequency = 2120000000; - uplink_frequency_offset = -400000000; - - ////////// MME parameters: - - mme_ip_address = ( { ipv4 = "192.168.13.11"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.sfr.sud.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.sfr.sud.conf deleted file mode 100644 index 1dfbb4a0f2..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.sfr.sud.conf +++ /dev/null @@ -1,185 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_1"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; -eNBs = -( - { - # real_time choice in {hard, rt-preempt, no} - real_time = "no"; - ////////// Identification parameters: - eNB_ID = 347472; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_0"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "10"; - - ////////// Channel parameters: - // Default Paging DRX of the eNB as defined in TS 36.304 - default_paging_drx = "PAGING_DRX_256"; - - ////////// Physical parameters: - frame_type = "TDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 33; - downlink_frequency = 1907600000; - uplink_frequency_offset = 0; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.31"; - ipv6 = "2192:168:30::17"; - active = "yes"; - preference = "ipv4"; - }, - { ipv4 = "192.168.12.86"; - ipv6 = "2192:168:30::18"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.31/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.31/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - }, - { - ////////// Identification parameters: - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_1"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Channel parameters: - // Default Paging DRX of the eNB as defined in TS 36.304 - default_paging_drx = "PAGING_DRX_256"; - - ////////// Physical parameters: - frame_type = "FDD"; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680e6; - uplink_frequency_offset = -120e6; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.31"; - ipv6 = "2192:168:30::17"; - active = "yes"; - preference = "ipv4"; - }, - { ipv4 = "192.168.12.86"; - ipv6 = "2192:168:30::18"; - active = "no"; - preference = "ipv4"; - } - ); - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.31/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.31/24"; - }; - }, - { - ////////// Identification parameters: - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_2"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Channel parameters: - // Default Paging DRX of the eNB as defined in TS 36.304 - default_paging_drx = "PAGING_DRX_256"; - - ////////// Physical parameters: - frame_type = "FDD"; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2680e6; - uplink_frequency_offset = -120e6; - - ////////// MME parameters: - mme_ip_address = ( { ipv4 = "192.168.12.31"; - ipv6 = "2192:168:30::17"; - active = "yes"; - preference = "ipv4"; - }, - { ipv4 = "192.168.12.86"; - ipv6 = "2192:168:30::18"; - active = "no"; - preference = "ipv4"; - } - ); - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.31/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.31/24"; - }; - }, - { - ////////// Identification parameters: - eNB_ID = 347475; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_3"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Channel parameters: - // Default Paging DRX of the eNB as defined in TS 36.304 - default_paging_drx = "PAGING_DRX_256"; - - ////////// MME parameters: - mme_ip_address = { ipv4 = "192.168.12.31"; - ipv6 = "2192:168:30::17"; - active = "yes"; - preference = "ipv4"; - }; - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.31/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.31/24"; - }; - - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/example.enb.band7.epc_eur.local.exmimo2_2a.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/example.enb.band7.epc_eur.local.exmimo2_2a.conf deleted file mode 100644 index 512d1e78b3..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/example.enb.band7.epc_eur.local.exmimo2_2a.conf +++ /dev/null @@ -1,170 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_LTEBox"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - - cell_type = "CELL_MACRO_ENB"; - - eNB_name = "eNB_Eurecom_LTEBox"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - - mobile_country_code = "208"; - - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 30; - rx_gain = 25; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -50; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* - srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =; - */ - - pusch_p0_Nominal = -75; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -90; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - mme_ip_address = ( { ipv4 = "192.188.2.2"; - ipv6 = "2192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "tun2"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.188.2.2/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "tun3"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.188.3.3/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="debug"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - }; - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/example.enb.epc_eur.local.exmimo.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/example.enb.epc_eur.local.exmimo.conf deleted file mode 100755 index c8e0280ba2..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/example.enb.epc_eur.local.exmimo.conf +++ /dev/null @@ -1,174 +0,0 @@ -Active_eNBs = ( "eNB_Eurecom_0"); - -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - - -eNBs = -( - { - ////////// Identification parameters: - eNB_ID = 0xe00; - cell_type = "CELL_MACRO_ENB"; - eNB_name = "eNB_Eurecom_0"; - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = "1"; - mobile_country_code = "208"; - mobile_network_code = "92"; - - ////////// Physical parameters: - - component_carriers = ( - { - frame_type = "FDD"; - tdd_config = 3; - tdd_config_s = 0; - prefix_type = "NORMAL"; - eutra_band = 7; - downlink_frequency = 2660000000L; - uplink_frequency_offset = -120000000; - - Nid_cell = 0; - N_RB_DL = 25; - Nid_cell_mbsfn = 0; - nb_antennas_tx = 1; - nb_antennas_rx = 1; - tx_gain = 30; - rx_gain = 25; - prach_root = 0; - prach_config_index = 0; - prach_high_speed = "DISABLE"; - prach_zero_correlation = 1; - prach_freq_offset = 2; - pucch_delta_shift = 1; - pucch_nRB_CQI = 1; - pucch_nCS_AN = 0; - pucch_n1_AN = 32; - pdsch_referenceSignalPower = -50; - pdsch_p_b = 0; - pusch_n_SB = 1; - pusch_enable64QAM = "DISABLE"; - pusch_hoppingMode = "interSubFrame"; - pusch_hoppingOffset = 0; - pusch_groupHoppingEnabled = "ENABLE"; - pusch_groupAssignment = 0; - pusch_sequenceHoppingEnabled = "DISABLE"; - pusch_nDMRS1 = 0; - phich_duration = "NORMAL"; - phich_resource = "ONESIXTH"; - srs_enable = "DISABLE"; - /* - srs_BandwidthConfig =; - srs_SubframeConfig =; - srs_ackNackST =; - srs_MaxUpPts =; - */ - - pusch_p0_Nominal = -75; - pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; - msg3_delta_Preamble = 6; - pucch_deltaF_Format1 = "deltaF2"; - pucch_deltaF_Format1b = "deltaF3"; - pucch_deltaF_Format2 = "deltaF0"; - pucch_deltaF_Format2a = "deltaF0"; - pucch_deltaF_Format2b = "deltaF0"; - - rach_numberOfRA_Preambles = 64; - rach_preamblesGroupAConfig = "DISABLE"; -/* - rach_sizeOfRA_PreamblesGroupA = ; - rach_messageSizeGroupA = ; - rach_messagePowerOffsetGroupB = ; -*/ - rach_powerRampingStep = 2; - rach_preambleInitialReceivedTargetPower = -90; - rach_preambleTransMax = 10; - rach_raResponseWindowSize = 10; - rach_macContentionResolutionTimer = 48; - rach_maxHARQ_Msg3Tx = 4; - - pcch_default_PagingCycle = 128; - pcch_nB = "oneT"; - bcch_modificationPeriodCoeff = 2; - ue_TimersAndConstants_t300 = 1000; - ue_TimersAndConstants_t301 = 1000; - ue_TimersAndConstants_t310 = 1000; - ue_TimersAndConstants_t311 = 10000; - ue_TimersAndConstants_n310 = 20; - ue_TimersAndConstants_n311 = 1; - } - ); - - - srb1_parameters : - { - # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] - timer_poll_retransmit = 80; - - # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] - timer_reordering = 35; - - # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] - timer_status_prohibit = 0; - - # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] - poll_pdu = 4; - - # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] - poll_byte = 99999; - - # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] - max_retx_threshold = 4; - } - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - mme_ip_address = ( { ipv4 = "192.188.2.2"; - ipv6 = "2192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - ENB_INTERFACE_NAME_FOR_S1_MME = "tun2"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.188.2.2/24"; - - ENB_INTERFACE_NAME_FOR_S1U = "tun3"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.188.3.3/24"; - ENB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - # available options for level: error, warn, notice, info, debug, trace - # available options for verbosity: none, low, medium, high, full - log_config : - { - global_log_level ="debug"; - global_log_verbosity ="medium"; - hw_log_level ="error"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="medium"; - rlc_log_level ="debug"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="debug"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="debug"; - rrc_log_verbosity ="medium"; - gtpu_log_level ="debug"; - gtpu_log_verbosity ="medium"; - udp_log_level ="debug"; - udp_log_verbosity ="medium"; - }; - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpb210.conf new file mode 100644 index 0000000000..9393872b30 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpb210.conf @@ -0,0 +1,44 @@ +log_config = { + global_log_level ="debug"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="low"; + mac_log_level ="info"; + mac_log_verbosity ="medium"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; +}; + +L1s = ( + { + num_cc = 1; + tr_n_preference = "nfapi"; + local_n_if_name = "lo"; + remote_n_address = "127.0.0.2"; + local_n_address = "127.0.0.1"; + local_n_portc = 50000; + remote_n_portc = 50001; + local_n_portd = 50010; + remote_n_portd = 50011; + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + bands = [7,38,42,43]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 125; + eNB_instances = [0]; + } +); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.lmssdr.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf similarity index 83% rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.lmssdr.conf rename to targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf index b81ac861f6..1c9ad09141 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band13.tm1.50PRB.lmssdr.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf @@ -19,34 +19,41 @@ eNBs = mobile_network_code = "93"; - ////////// Physical parameters: + tr_s_preference = "local_mac" + + ////////// Physical parameters: component_carriers = ( { + node_function = "3GPP_eNODEB"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; frame_type = "FDD"; tdd_config = 3; tdd_config_s = 0; prefix_type = "NORMAL"; - eutra_band = 13; - downlink_frequency = 751000000L; - uplink_frequency_offset = 31000000; + eutra_band = 7; + downlink_frequency = 2685000000L; + uplink_frequency_offset = -120000000; Nid_cell = 0; N_RB_DL = 50; Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; rx_gain = 125; + pbch_repetition = "FALSE"; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; prach_zero_correlation = 1; prach_freq_offset = 2; pucch_delta_shift = 1; - pucch_nRB_CQI = 1; + pucch_nRB_CQI = 0; pucch_nCS_AN = 0; pucch_n1_AN = 32; - pdsch_referenceSignalPower = -20; + pdsch_referenceSignalPower = -27; pdsch_p_b = 0; pusch_n_SB = 1; pusch_enable64QAM = "DISABLE"; @@ -64,9 +71,9 @@ eNBs = srs_ackNackST =; srs_MaxUpPts =;*/ - pusch_p0_Nominal = -90; + pusch_p0_Nominal = -96; pusch_alpha = "AL1"; - pucch_p0_Nominal = -96; + pucch_p0_Nominal = -104; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -97,7 +104,7 @@ eNBs = ue_TimersAndConstants_t311 = 10000; ue_TimersAndConstants_n310 = 20; ue_TimersAndConstants_n311 = 1; - + ue_TransmissionMode = 1; } ); @@ -142,15 +149,32 @@ eNBs = NETWORK_INTERFACES : { + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; - ENB_INTERFACE_NAME_FOR_S1U = "lo"; - ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.4/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; + } +); - log_config : +MACRLCs = ( + { + num_cc = 1; + local_s_if_name = "lo"; + remote_s_address = "127.0.0.1"; + local_s_address = "127.0.0.2"; + local_s_portc = 50001; + remote_s_portc = 50000; + local_s_portd = 50011; + remote_s_portd = 50010; + tr_s_preference = "nfapi"; + tr_n_preference = "local_RRC"; + } +); + +log_config = { global_log_level ="info"; global_log_verbosity ="medium"; @@ -167,5 +191,3 @@ eNBs = rrc_log_level ="info"; rrc_log_verbosity ="medium"; }; - } -); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf new file mode 100644 index 0000000000..772e13fe6f --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf @@ -0,0 +1,214 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + # real_time choice in {hard, rt-preempt, no} + real_time = "no"; + + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + tr_s_preference = "local_mac" + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RCC_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2685000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + pbch_repetition = "FALSE"; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 0; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -27; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "192.168.12.26"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.19/24"; + ENB_INTERFACE_NAME_FOR_S1U = "eth0"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + } +); + +RUs = ( + { + local_if_name = "eth1"; + remote_address = "10.10.10.19"; + local_address = "10.10.10.18"; + local_portc = 50000; + remote_portc = 50000; + local_portd = 50001; + remote_portd = 50001; + local_rf = "no" + tr_preference = "udp_if4p5" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + eNB_instances = [0]; + } +); + +log_config = { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; +}; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf new file mode 100644 index 0000000000..048f2fcc35 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf @@ -0,0 +1,214 @@ +Active_eNBs = ( "eNB_Eurecom_LTEBox"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +eNBs = +( + { + # real_time choice in {hard, rt-preempt, no} + real_time = "no"; + + ////////// Identification parameters: + eNB_ID = 0xe00; + + cell_type = "CELL_MACRO_ENB"; + + eNB_name = "eNB_Eurecom_LTEBox"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = "1"; + + mobile_country_code = "208"; + + mobile_network_code = "93"; + + tr_s_preference = "local_mac" + + ////////// Physical parameters: + + component_carriers = ( + { + node_function = "NGFI_RCC_IF4p5"; + node_timing = "synch_to_ext_device"; + node_synch_ref = 0; + frame_type = "FDD"; + tdd_config = 3; + tdd_config_s = 0; + prefix_type = "NORMAL"; + eutra_band = 7; + downlink_frequency = 2685000000L; + uplink_frequency_offset = -120000000; + Nid_cell = 0; + N_RB_DL = 50; + Nid_cell_mbsfn = 0; + nb_antenna_ports = 1; + nb_antennas_tx = 1; + nb_antennas_rx = 1; + tx_gain = 90; + rx_gain = 125; + pbch_repetition = "FALSE"; + prach_root = 0; + prach_config_index = 0; + prach_high_speed = "DISABLE"; + prach_zero_correlation = 1; + prach_freq_offset = 2; + pucch_delta_shift = 1; + pucch_nRB_CQI = 0; + pucch_nCS_AN = 0; + pucch_n1_AN = 32; + pdsch_referenceSignalPower = -27; + pdsch_p_b = 0; + pusch_n_SB = 1; + pusch_enable64QAM = "DISABLE"; + pusch_hoppingMode = "interSubFrame"; + pusch_hoppingOffset = 0; + pusch_groupHoppingEnabled = "ENABLE"; + pusch_groupAssignment = 0; + pusch_sequenceHoppingEnabled = "DISABLE"; + pusch_nDMRS1 = 1; + phich_duration = "NORMAL"; + phich_resource = "ONESIXTH"; + srs_enable = "DISABLE"; + /* srs_BandwidthConfig =; + srs_SubframeConfig =; + srs_ackNackST =; + srs_MaxUpPts =;*/ + + pusch_p0_Nominal = -96; + pusch_alpha = "AL1"; + pucch_p0_Nominal = -104; + msg3_delta_Preamble = 6; + pucch_deltaF_Format1 = "deltaF2"; + pucch_deltaF_Format1b = "deltaF3"; + pucch_deltaF_Format2 = "deltaF0"; + pucch_deltaF_Format2a = "deltaF0"; + pucch_deltaF_Format2b = "deltaF0"; + + rach_numberOfRA_Preambles = 64; + rach_preamblesGroupAConfig = "DISABLE"; + /* + rach_sizeOfRA_PreamblesGroupA = ; + rach_messageSizeGroupA = ; + rach_messagePowerOffsetGroupB = ; + */ + rach_powerRampingStep = 4; + rach_preambleInitialReceivedTargetPower = -108; + rach_preambleTransMax = 10; + rach_raResponseWindowSize = 10; + rach_macContentionResolutionTimer = 48; + rach_maxHARQ_Msg3Tx = 4; + + pcch_default_PagingCycle = 128; + pcch_nB = "oneT"; + bcch_modificationPeriodCoeff = 2; + ue_TimersAndConstants_t300 = 1000; + ue_TimersAndConstants_t301 = 1000; + ue_TimersAndConstants_t310 = 1000; + ue_TimersAndConstants_t311 = 10000; + ue_TimersAndConstants_n310 = 20; + ue_TimersAndConstants_n311 = 1; + ue_TransmissionMode = 1; + } + ); + + + srb1_parameters : + { + # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500] + timer_poll_retransmit = 80; + + # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200] + timer_reordering = 35; + + # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500] + timer_status_prohibit = 0; + + # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)] + poll_pdu = 4; + + # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)] + poll_byte = 99999; + + # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32] + max_retx_threshold = 4; + } + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// MME parameters: + mme_ip_address = ( { ipv4 = "127.0.0.3"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + ENB_INTERFACE_NAME_FOR_S1_MME = "lo"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "127.0.0.2/24"; + ENB_INTERFACE_NAME_FOR_S1U = "lo"; + ENB_IPV4_ADDRESS_FOR_S1U = "127.0.0.5/24"; + ENB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + } +); + +RUs = ( + { + local_if_name = "lo"; + remote_address = "127.0.0.2"; + local_address = "127.0.0.1"; + local_portc = 50000; + remote_portc = 50000; + local_portd = 50001; + remote_portd = 50001; + local_rf = "no" + tr_preference = "udp_if4p5" + nb_tx = 1 + nb_rx = 1 + att_tx = 0 + att_rx = 0; + eNB_instances = [0]; + } +); + +log_config = { + global_log_level ="debug"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="debug"; + phy_log_verbosity ="medium"; + mac_log_level ="debug"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; +}; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.conf new file mode 100644 index 0000000000..24ae36a0a4 --- /dev/null +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.conf @@ -0,0 +1,36 @@ +RUs = ( + { + local_if_name = "lo"; + remote_address = "127.0.0.1" + local_address = "127.0.0.2"; + local_portc = 50000; + remote_portc = 50000; + local_portd = 50001; + remote_portd = 50001; + local_rf = "yes" + tr_preference = "udp_if4p5"; + nb_tx = 1; + nb_rx = 1; + max_pdschReferenceSignalPower = -29; + max_rxgain = 120; + bands = [7,13]; + } +); + +log_config = { + global_log_level ="debug"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="debug"; + phy_log_verbosity ="medium"; + mac_log_level ="debug"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; +}; + diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/COPYING b/targets/PROJECTS/GENERIC-LTE-EPC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/PROJECTS/GENERIC-LTE-EPC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash b/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash index b6151fc677..bfcae67e4a 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/interfaces.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file interfaces.bash # brief diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash b/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash index 81c4b7b1a6..6db4c9f580 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/networks.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file networks.bash # brief diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash b/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash index 3c58834f0f..1c6d87bc8f 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/start_enb_and_ue_virt.bash @@ -1,31 +1,24 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file start_enb_and_ue.bash # brief @@ -132,18 +125,18 @@ if [ ! -f $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/ue_data ] || [ ! -f $OPENAIR3_DIR/NA fi echo_success "make --directory=$OPENAIR3_DIR/NAS/EURECOM-NAS -f Makefile PROCESS=UE all" make -f Makefile --debug=b --directory=$OPENAIR3_DIR/NAS/EURECOM-NAS PROCESS=UE all - rm .ue.nvram - rm .usim.nvram + rm .ue.nvram0 + rm .usim.nvram0 touch /tmp/nas_cleaned fi -if [ ! -f .ue.nvram ]; then - echo_success "generate .ue_emm.nvram .ue.nvram" +if [ ! -f .ue.nvram0 ]; then + echo_success "generate .ue_emm.nvram0 .ue.nvram0" $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/ue_data --gen fi -if [ ! -f .usim.nvram ]; then - echo_success "generate .usim.nvram" +if [ ! -f .usim.nvram0 ]; then + echo_success "generate .usim.nvram0" $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/usim_data --gen fi $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/ue_data --print diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash b/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash index 72a3a6fca1..8b76dc9cc0 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/start_ue.bash @@ -1,31 +1,24 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file start_ue.bash # brief @@ -75,20 +68,20 @@ export NVRAM_DIR=$THIS_SCRIPT_PATH if [ ! -f $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/ue_data ]; then make --directory=$OPENAIR3_DIR/NAS/EURECOM-NAS veryveryclean make --directory=$OPENAIR3_DIR/NAS/EURECOM-NAS PROCESS=UE - rm .ue.nvram + rm .ue.nvram0 fi if [ ! -f $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/usim_data ]; then make --directory=$OPENAIR3_DIR/NAS/EURECOM-NAS veryveryclean make --directory=$OPENAIR3_DIR/NAS/EURECOM-NAS PROCESS=UE - rm .usim.nvram + rm .usim.nvram0 fi -if [ ! -f .ue.nvram ]; then - # generate .ue_emm.nvram .ue.nvram +if [ ! -f .ue.nvram0 ]; then + # generate .ue_emm.nvram0 .ue.nvram0 $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/ue_data --gen fi -if [ ! -f .usim.nvram ]; then - # generate .usim.nvram +if [ ! -f .usim.nvram0 ]; then + # generate .usim.nvram0 $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/usim_data --gen fi $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/ue_data --print diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash b/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash index 0ba30cc504..93441ec9e9 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/utils.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file utils.bash # brief diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash b/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash index 1fad3fe879..72fcea2281 100755 --- a/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash +++ b/targets/PROJECTS/GENERIC-LTE-EPC/virtual_box.bash @@ -1,31 +1,24 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ export HSS_VM_NAME='hss-vm-ubuntu-12.04.4-server-amd64' diff --git a/targets/PROJECTS/TDDREC/s_init_params.m b/targets/PROJECTS/TDDREC/s_init_params.m index 9683ed2d17..be51524755 100644 --- a/targets/PROJECTS/TDDREC/s_init_params.m +++ b/targets/PROJECTS/TDDREC/s_init_params.m @@ -1,6 +1,7 @@ clear all close all addpath([getenv('OPENAIR_TARGETS') '/ARCH/EXMIMO/USERSPACE/OCTAVE']); +addpath([getenv('OPENAIR_DIR') '/cmake_targets/lte_build_oai/build']); %% -------- ExpressMIMO2 configuration -------- limeparms; diff --git a/targets/RT/Makefile b/targets/RT/Makefile deleted file mode 100644 index 1be49d2db8..0000000000 --- a/targets/RT/Makefile +++ /dev/null @@ -1,124 +0,0 @@ -# command line flags are automatically exported and thus passed down to any sub-make. -# here we set the default flags in case on command line flags are provided -# these flags have to be explicitely exported so that the sub-make is aware of them - - -include $(OPENAIR_DIR)/common/utils/Makefile.inc -ifndef OPENAIR_LTE -export OPENAIR_LTE=1 -export OPENAIR_EMU=0 -endif - -ifndef OPENAIR1 -export OPENAIR1=0 -endif - -ifndef OPENAIR2 -export OPENAIR2=0 -endif - -ifndef OPENAIR3 -export OPENAIR3=0 -endif - -ifndef EMOS -export EMOS=0 -endif - -ifndef rrc_cellular -export rrc_cellular = 0 -export rrc_cellular_eNB = 0 -export rrc_cellular_UE = 0 -else - export rrc_cellular = 1 - ifeq ($(eNB_flag),1) - export rrc_cellular_eNB=1 - endif - ifeq ($(UE_flag),1) - export rrc_cellular_UE=1 - endif -endif - -all: openair_rf_cbmimo1_softmodem.ko asn1_msg_kern.ko nasmesh.ko rb_tool openair_rf scope - -openair_rf_cbmimo1_softmodem.ko: - (cd $(OPENAIR1_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 && mv openair_rf.ko $(CURDIR)/openair_rf_softmodem.ko) - -oai_user_cbmimo1.ko: - (cd $(OPENAIR1_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 BIT8_TX=1 OPENAIR1=0 OPENAIR2=0 && mv openair_rf.ko $(CURDIR)/openair_rf_softmodem.ko) - -oai_user_exmimo.ko: - (cd $(OPENAIR1_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) -C $(KERNEL_DIR)/build V=1 M=`pwd` RTAI=1 CBMIMO1=1 OPENAIR1=0 OPENAIR2=0 && mv openair_rf.ko $(CURDIR)/openair_rf_softmodem.ko) - -asn1_msg_kern.ko: - (cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES && $(MAKE) -C $(KERNEL_DIR)/build V=0 M=`pwd` RTAI=1 -j2 && mv asn1_msg_kern.ko $(CURDIR)/asn1_msg_kern.ko) - -nasmesh.ko: - (cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH && $(MAKE) V=1 -C $(KERNEL_DIR)/build M=`pwd` && mv nasmesh.ko $(CURDIR)/nasmesh.ko) - -rb_tool: - (cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && $(MAKE)) - -openair_rf: - (cd $(OPENAIR1_DIR)/USERSPACE_TOOLS/OPENAIR_RF && $(MAKE) clean CBMIMO1=1 && $(MAKE) all CBMIMO1=1 && $(MAKE) clean CBMIMO1=1) - -scope: - (cd $(OPENAIR1_DIR)/USERSPACE_TOOLS/SCOPE && $(MAKE) clean && $(MAKE) all && $(MAKE) clean ) - -#Remove all but source files -cleanall: - (cd $(OPENAIR1_DIR) && $(MAKE) cleanall) - (cd $(OPENAIR2_DIR) && $(MAKE) cleanall) - -fifos: - @for i in `seq 0 64`;\ - do \ - have_rtfX=`ls /dev/ |grep -c rtf$$i`;\ - if [ "$$have_rtfX" -eq 0 ] ;then \ - mknod -m 666 /dev/rtf$$i c 150 $$i; \ - fi;\ - done - -openair0: - mknod /dev/openair0 c 127 0 - chmod a+rw /dev/openair0 - -install_oai_user: - make fifos - insmod openair_rf_softmodem.ko - -updatefw: - $(OPENAIR1_DIR)/USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0 - -boot_exmimo: - sudo make install_oai_user - $(OPENAIR1_DIR)/USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0 - sleep 1 - sudo rmmod openair_rf - sudo make install_oai_user - -reboot_exmimo: - $(OPENAIR1_DIR)/USERSPACE_TOOLS/OAI_FW_INIT/updatefw -f $$OPENAIR0_DIR/express-mimo/software/sdr/main -s 0x43fffff0 -b - sudo rmmod openair_rf - sudo make install_oai_user - -install_softmodem: - make fifos -ifeq ($(OPENAIR2),1) - insmod asn1_msg_kern.ko -endif - insmod openair_rf_softmodem.ko - -remove: - rmmod openair_rf -ifeq ($(OPENAIR2),1) - rmmod asn1_msg_kern -endif - -test: - (cd $(OPENAIR1_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) test RTAI=1 CBMIMO1=1) - (cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES && $(MAKE) test) - -clean: - (cd $(OPENAIR1_DIR)/ARCH/CBMIMO1/DEVICE_DRIVER && $(MAKE) clean RTAI=1 CBMIMO1=1) - (cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES && $(MAKE) clean) diff --git a/targets/RT/USER/COPYING b/targets/RT/USER/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/RT/USER/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/RT/USER/Makefile b/targets/RT/USER/Makefile deleted file mode 100644 index 621f30c5f4..0000000000 --- a/targets/RT/USER/Makefile +++ /dev/null @@ -1,446 +0,0 @@ -# Include some shared directives -include $(OPENAIR_TARGETS)/Makerules - -default: lte-softmodem -all: lte-softmodem rrh - -include $(OPENAIR_TARGETS)/Makefile.common - -KERNEL_VERSION:=$(shell echo `uname -r | cut -d. -f-2`) -KERNEL_TYPE:=$(shell echo `uname -r | cut -d. -f-3 | cut -d- -f3`) -DEADLINE_SCHEDULER_KERNEL:=$(shell if [ $(KERNEL_TYPE) = "lowlatency" ]; then echo "1" ; else echo "0" ; fi) - -include $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc - -ifdef EXMIMO -#ifdef DEADLINE_SCHEDULER # this ifdef is to be removed after the debugging -ifeq ($(DEADLINE_SCHEDULER_KERNEL),1) -CFLAGS+=-DDEADLINE_SCHEDULER -endif -#endif -endif - -ifndef USRP -USRP=0 -endif - -CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/COMMON -I. - -ifndef OPENAIR2 -OPENAIR2=1 -endif - -ifdef DEBUG -DISABLE_XER_PRINT=0 -MSG_PRINT=1 -endif - -ifdef Rel10 -CFLAGS += -DRel10 -endif - -ifeq ($(EXMIMO),1) - CFLAGS += -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO -endif - -ifeq ($(ETHERNET),1) - CFLAGS += -I$(OPENAIR_TARGETS)/ARCH/ETHERNET/USERSPACE/LIB/ -DETHERNET -endif - -ifeq ($(DEBUG),1) -CFLAGS += -g -ggdb -#CFLAGS += -DRRC_MSG_PRINT -#CFLAGS += -DPDCP_MSG_PRINT -else -CFLAGS += -O2 -endif - -ifdef ($(MSG_PRINT),1) -CFLAGS += -DRRC_MSG_PRINT -CFLAGS += -DPDCP_MSG_PRINT -endif - -SRC = synctest.c condtest.c - -ifndef RTAI -RTAI=1 -endif - -ifeq ($(LOCALIZATION), 1) -CFLAGS += -DLOCALIZATION -endif - -ifeq ($(LINUX_LIST), 1) -CFLAGS += -DLINUX_LIST -endif - -ifeq ($(RTAI),1) -CFLAGS += -DENABLE_RTAI_CLOCK -CFLAGS += -DCONFIG_RTAI_LXRT_INLINE #remend the RTAI warning -RTAI_OBJ = sched_dlsch.o sched_rx_pdsch.o rt_wrapper.o -else #RTAI -CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME -OBJ += sched_dlsch.o sched_rx_pdsch.o rt_wrapper.o -endif - -OBJ += $(OPENAIR1_DIR)/SIMULATION/TOOLS/taus.o $(OPENAIR_TARGETS)/SIMU/USER/init_lte.o - -ifeq ($(EXMIMO),1) -OBJ += $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/gain_control.o -CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -endif - -CFLAGS += -DENABLE_VCD_FIFO - - -TOP_DIR = $(OPENAIR1_DIR) -include $(OPENAIR1_DIR)/PHY/Makefile.inc -include $(OPENAIR1_DIR)/SCHED/Makefile.inc - -OBJ += $(PHY_OBJS) -ifeq ($(RTAI),1) -RTAI_OBJ += $(SCHED_OBJS) -else -OBJ += $(SCHED_OBJS) -endif - -OPENAIR2_TOP = $(OPENAIR2_DIR) -include $(OPENAIR2_DIR)/LAYER2/Makefile.inc -include $(OPENAIR2_DIR)/UTIL/Makefile.inc -include $(OPENAIR2_DIR)/RRC/NAS/Makefile.inc -include $(OPENAIR2_DIR)/ENB_APP/Makefile.inc - -ifeq ($(USRP),1) - -include $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/Makefile.inc -#CFLAGS += -I/opt/include/uhd -L/opt/lib -luhd -lpthread -lstdc++ -CFLAGS += -I/usr/include/uhd -L/usr/lib -luhd -lpthread -lstdc++ -CFLAGS += -DOAI_USRP -#LDFLAGS += -L/opt/lib -luhd -lpthread -lstdc++ -LDFLAGS += -L/usr/lib/ -luhd -lpthread -lstdc++ -endif - -ifeq ($(ETHERNET),1) -include $(OPENAIR_TARGETS)/ARCH/ETHERNET/USERSPACE/LIB/Makefile.inc -LDFLAGS += -lpthread -endif - -OBJ += $(ENB_APP_OBJS) - -ifeq ($(RTAI),1) -CFLAGS += -I/usr/realtime/include -I/usr/realtime/include/asm -LOG_OBJS= -RTAI_OBJ+=$(LOG_DIR)/vcd_signal_dumper.o -RTAI_OBJ+=$(LOG_DIR)/log.o -endif - - -OBJ += $(LOG_OBJS) - -ifeq ($(OPENAIR2),1) -ASN1_MSG_OBJS1=$(addprefix $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/, $(ASN1_MSG_OBJS)) -OBJ += $(L2_OBJS) $(LIST_OBJ) $(TIMER_OBJ) $(MEM_OBJ) $(OTG_OBJS) $(MATH_OBJS) $(OSA_OBJS) $(OPT_OBJS) -OBJ += $(OPENAIR1_DIR)/SIMULATION/ETH_TRANSPORT/netlink_init.o -#OBJ += $(PDCP_DIR)/pdcp_thread.o -CFLAGS += -DOPENAIR2 -DNO_RRM -DPUCCH -DMAC_CONTEXT=1 -endif - -#ifdef ENABLE_ITTI -RTAI_OBJ += $(UTILS_OBJS) -#else -#OBJ += $(UTILS_OBJS) -#endif - -ifdef SPECTRA -CFLAGS += -DSPECTRA -endif - -#ifdef ENABLE_ITTI -CFLAGS += -DEXMIMO_IOT -#endif - -CFLAGS += $(L2_incl) $(ENB_APP_incl) $(UTIL_incl) $(UTILS_incl) - -CFLAGS += -I$(OPENAIR1_DIR) -I$(OPENAIR2_DIR)/RRC/LITE/MESSAGES #-I$(OPENAIR3_DIR)/MESH -I$(OPENAIR3_DIR)/MESH/RRM - -CFLAGS += -DNEW_FFT -DLOG_NO_THREAD - -ifeq ($(XFORMS),1) -CFLAGS += -DXFORMS -I/usr/include/X11 -LDFLAGS += -lforms -OBJ += $(OPENAIR1_DIR)/PHY/TOOLS/lte_phy_scope.o -OBJ += stats.o -endif - -OBJ_SYNC = $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o rt_wrapper.o $(OPENAIR2_DIR)/UTIL/LOG/log.o $(OPENAIR2_DIR)/UTIL/LOG/vcd_signal_dumper.o - -ifdef SMBV -CFLAGS += -DSMBV -endif - -CFLAGS += -DPHYSIM -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DPHY_CONTEXT=1 -CFLAGS += -DOPENAIR_LTE -DENABLE_FXP -DOPENAIR1 #-DDLSCH_THREAD #-DULSCH_THREAD - - -ifeq ($(EXMIMO),1) -CFLAGS += -DEXMIMO -#CFLAGS += -DEXMIMO -DTIMING_ADVANCE_HW=138 #this is for ExpressMIMO 1 -#CFLAGS += -DEXMIMO -DTIMING_ADVANCE_HW=45 #this is for ExpressMIMO 2 -endif - -ifeq ($(HARD_RT),1) -CFLAGS += -DHARD_RT -endif - -ifeq ($(EMOS),1) -CFLAGS += -D_FILE_OFFSET_BITS=64 -DEMOS #-DEMOS_CHANNEL -LDFLAGS += -lgps -endif - - -ifeq ($(LINK_ENB_PDCP_TO_GTPV1U), 1) -CFLAGS += -DLINK_ENB_PDCP_TO_GTPV1U -endif - -ifeq ($(LINK_ENB_PDCP_TO_IP_DRIVER), 1) -CFLAGS += -DPDCP_USE_NETLINK -DLINUX -OBJ += $(NAS_OBJS) -NAS_FLAG=1 -endif - -LDFLAGS += -lpthread -lm -lforms -lconfig -lrt -ifeq ($(RTAI),1) -RTAI_CFLAGS += $(shell rtai-config --lxrt-cflags) -DRTAI -LDFLAGS += $(shell rtai-config --lxrt-ldflags) -endif - -#ifeq ($(USRP),1) -#CFLAGS += -I/opt/uhd/include -L/opt/uhd/lib -luhd -lpthread -lstdc++ -#CFLAGS += -DOAI_USRP -#endif -#CFLAGS += -I/usr/include/c++/4.6 -I/usr/include/c++/4.6/x86_64-linux-gnu -I/usr/include/rtai/ - -LFDS_OBJ_DIR = $(subst $(OPENAIR_DIR),$(OBJS_DIR),$(LFDS_DIR)) -LFDS_LIB = $(LFDS_OBJ_DIR)/bin/liblfds611.a -LIBS += $(LFDS_LIB) -SHARED_DEPENDENCIES += $(LFDS_LIB) - --include $(OBJ:.o=.d) --include $(ASN1_MSG_OBJS1:.o=.d) --include $(RTAI_OBJ:.o=.d) --include lte-softmodem.d --include lte-ue.d --include rrh.d - -$(LFDS_LIB): - @if [ ! -d $(LFDS_OBJ_DIR)/bin ]; then mkdir -p $(LFDS_OBJ_DIR)/bin; fi; - @if [ ! -d $(LFDS_OBJ_DIR)/obj ]; then mkdir -p $(LFDS_OBJ_DIR)/obj; fi; - $(MAKE) -C $(LFDS_DIR) -f makefile.linux OUTDIR=$(LFDS_OBJ_DIR) - -ifeq ($(USRP),1) -$(USRP_OBJ):$(USRP_FILE_OBJ) - @echo Compiling $< - @$(CXX) -c -g -ggdb $(USRP_CFLAGS) $(USRP_FILE_OBJ) -o $(USRP_OBJ) -endif - -ifeq ($(ETHERNET),1) -$(ETHERNET_OBJ):$(ETHERNET_FILE_OBJ) - @echo Compiling $< - @$(CC) -c -g -ggdb $(ETHERNET_CFLAGS) $(ETHERNET_FILE_OBJ) -o $(ETHERNET_OBJ) -endif - -ifeq ($(RTAI),1) -$(RTAI_OBJ) lte-softmodem.o lte-ue.o: %.o : %.c -else -$(RTAI_OBJ): %.o : %.c -endif - @echo Compiling $< ... - @$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) -o $@ $< - @$(CC) -MM $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $< > $*.d - @mv -f $*.d $*.d.tmp - @sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d - @sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \ - sed -e 's/^ *//' -e 's/$$/:/' >> $*.d - @rm -f $*.d.tmp - -ifdef ENABLE_ITTI -$(OBJ) $(RTAI_OBJ): $(ITTI_MESSAGES_H) -endif - -ifeq ($(RTAI),1) -$(OBJ) $(ASN1_MSG_OBJS1): %.o : %.c -else -$(OBJ) $(ASN1_MSG_OBJS1) lte-softmodem.o lte-ue.o: %.o : %.c -endif - -rrh.o: %.o : %.c - - @echo Compiling $< ... - @$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -o $@ $< - @$(CC) -MM $(CFLAGS) $(EXTRA_CFLAGS) $< > $*.d - @mv -f $*.d $*.d.tmp - @sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d - @sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \ - sed -e 's/^ *//' -e 's/$$/:/' >> $*.d - @rm -f $*.d.tmp - -OBJ_EMOS = $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/gain_control.o rt_wrapper.o $(OPENAIR2_DIR)/UTIL/LOG/log.o $(OPENAIR2_DIR)/UTIL/LOG/vcd_signal_dumper.o $(OPENAIR1_DIR)/PHY/TOOLS/signal_energy.o $(OPENAIR1_DIR)/PHY/TOOLS/dB_routines.o -ifeq ($(XFORMS),1) -OBJ_EMOS+=lte_scope.o -endif - -condtest: condtest.c - $(CC) $(CFLAGS) $(LDFLAGS) condtest.c -o condtest - -synctest: $(OBJ_SYNC) $(SHARED_DEPENDENCIES) synctest.c - $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $(OBJ_SYNC) -o synctest synctest.c $(LDFLAGS) $(LIBS) - -sleeptest: rt_wrapper.o sleeptest.c - $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) rt_wrapper.o -o sleeptest sleeptest.c $(LDFLAGS) - -lte-softmodem: $(OBJ) $(USRP_OBJ) $(ETHERNET_OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) lte-ue.o lte-softmodem.o $(SHARED_DEPENDENCIES) - @echo Linking $@ - @$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(USRP_OBJ) $(ETHERNET_OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) lte-ue.o lte-softmodem.o -o lte-softmodem $(LDFLAGS) $(LIBS) - -rrh: rrh.o - @$(CC) $(CFLAGS) $(EXTRA_CFLAGS) rrh.o -o rrh -lpthread -lrt - -emos-raw: $(SHARED_DEPENDENCIES) $(OBJ_EMOS) emos-raw.c - @$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $(OBJ_EMOS) -o emos-raw emos-raw.c $(LDFLAGS) $(LIBS) - - -synctest_eNB: synctest - cp synctest synctest_eNB - -synctest_UE: synctest - cp synctest synctest_UE - -drivers: -# cd $(OPENAIR2_DIR) && make clean && make nasmesh_netlink.ko -# cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && make clean && make - cd $(OPENAIR_TARGETS)/ARCH/EXMIMO/DRIVER/eurecom && make clean && make - cd $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT && make clean && make - -run: condtest - rtai-load condtest --verbose - -run_eNB_test: - rtai-load eNB_test --verbose - -run_eNB: - rtai-load eNB --verbose - -run_UE: - rtai-load UE --verbose - -run_UE0: - rtai-load UE0 --verbose - -run_UE0_smbv: - rtai-load UE0_smbv --verbose - -run_UE850: - rtai-load UE850 --verbose - -run_eNB850: - rtai-load eNB850 --verbose - -run_UE0prach: - rtai-load UE0prach --verbose - -run_UE1prach: - rtai-load UE1prach --verbose - -run_UE2prach: - rtai-load UE2prach --verbose - -run_UE0noL2: - rtai-load UE0noL2 -- verbose - -run_UE1noL2: - rtai-load UE1noL2 --verbose - -run_UE2noL2: - rtai-load UE2noL2 --verbose - -run_UE0calib: - rtai-load UE0calib --verbose - -run_UE0calibmed: - rtai-load UE0calibmed --verbose - -run_UE0calibbyp: - rtai-load UE0calibbyp --verbose - -run_UE1: - rtai-load UE1 --verbose - -run_UE2: - rtai-load UE2 --verbose - -run_eNB0: - rtai-load eNB0 --verbose - -run_eNB1: - rtai-load eNB1 --verbose - -run_eNB2: - rtai-load eNB2 --verbose - -clean: cleanmodem common-clean - -cleanmodem: - @$(RM_F_V) $(OBJ) $(RTAI_OBJ) $(OBJ_EMOS) $(OBJ_SYNC) $(USRP_OBJ) $(ETHERNET_OBJ) - @$(RM_F_V) $(OBJ:.o=.d) $(RTAI_OBJ:.o=.d) $(OBJ_EMOS:.o=.d) $(OBJ_SYNC:.o=.d) - @$(RM_F_V) $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1_msg.o $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1_msg.d - @$(RM_F_V) lte-ue.o lte-ue.d rrh.o rrh.d lte-softmodem.o lte-softmodem.d - @$(RM_F_V) rrh.o lte-ue.o lte-softmodem.o - -cleanasn1: - rm -f $(ASN1_MSG_OBJS1) - $(shell cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES ; rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) *.o *.d ) - rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.am.sample - rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc.generated - rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel* - -cleancell: - rm -f $(OPENAIR2_DIR)/RRC/CELLULAR/*.o - rm -f $(OPENAIR2_DIR)/RRC/CELLULAR/*.d - rm -f $(OPENAIR2_DIR)/RRC/L2_INTERFACE/*.o - rm -f $(OPENAIR2_DIR)/RRC/L2_INTERFACE/*.d - rm -f $(OPENAIR2_DIR)/NAS/SIMU_CELLULAR/*.o - rm -f $(OPENAIR2_DIR)/NAS/SIMU_CELLULAR/*.d - -cleanalmostall: cleanmodem - rm -f $(ASN1_MSG_OBJS1) - rm -rf condtest synctest lte-softmodem rrh - rm -rf synctest_eNB synctest_UE - -cleanall: common-cleanall clean cleanasn1 - rm -rf condtest synctest lte-softmodem rrh - rm -rf synctest_eNB synctest_UE - -show: - @echo $(CFLAGS) - @echo $(EXTRA_CFLAGS) - @echo $(OBJ) $(RTAI_OBJ) - @echo $(USRP_OBJ) - @echo $(ETHERNET_OBJ) - @echo $(ETHERNET_FILE_OBJ) - @echo IS_REL8 is $(IS_REL8) - @echo IS_REL10 is $(IS_REL10) - @echo openssl $(OPENSSL_FOUND) - @echo nettle $(NETTLE_FOUND) - @echo lowlatency kernel: $(DEADLINE_SCHEDULER_KERNEL) - -beautiful: - astyle --style=gnu -s2 $(SRC) - -fifos: - @for i in `seq 0 64`;\ - do \ - have_rtfX=`ls /dev/ |grep -c rtf$$i`;\ - if [ "$$have_rtfX" -eq 0 ] ;then \ - mknod -m 666 /dev/rtf$$i c 150 $$i; \ - fi;\ - done diff --git a/targets/RT/USER/Makefile.agilent b/targets/RT/USER/Makefile.agilent deleted file mode 100644 index 061c15a31c..0000000000 --- a/targets/RT/USER/Makefile.agilent +++ /dev/null @@ -1,243 +0,0 @@ -include $(OPENAIR_TARGETS)/Makerules - -include $(OPENAIR_TARGETS)/Makefile.common - -CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO -DEXMIMO_IOT - -SRC = lte-enb.c - -ifndef RTAI -RTAI=1 -endif - -ifeq ($(RTAI),1) -CFLAGS += -DENABLE_RTAI_CLOCK -DRTAI -RTAI_OBJ = sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o lte-enb.o rt_wrapper.o -else -OBJ = sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o lte-enb.o rt_wrapper.o -CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME -endif - -OBJ += $(OPENAIR1_DIR)/SIMULATION/TOOLS/taus.o $(OPENAIR_TARGETS)/SIMU/USER/init_lte.o $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o - -TOP_DIR = $(OPENAIR1_DIR) -include $(OPENAIR1_DIR)/PHY/Makefile.inc -include $(OPENAIR1_DIR)/SCHED/Makefile.inc - -OBJ += $(PHY_OBJS) -ifeq ($(RTAI),1) -RTAI_OBJ += $(SCHED_OBJS) -else -OBJ += $(SCHED_OBJS) -endif - -#ifndef rrc_cellular -ifeq ($(rrc_cellular),0) -rrc_cellular = 0 -rrc_cellular_eNB = 0 -rrc_cellular_UE = 0 -else - ifeq ($(eNB_flag),1) - rrc_cellular_eNB=1 - endif - ifeq ($(UE_flag),1) - rrc_cellular_UE=1 - endif -endif - -export rrc_cellular - -OPENAIR2_TOP = $(OPENAIR2_DIR) -include $(OPENAIR2_DIR)/LAYER2/Makefile.inc -include $(OPENAIR2_DIR)/UTIL/Makefile.inc -include $(OPENAIR2_DIR)/RRC/NAS/Makefile.inc - -ifeq ($(RTAI),1) -LOG_OBJS= -RTAI_OBJ+=$(LOG_DIR)/vcd_signal_dumper.o -RTAI_OBJ+=$(LOG_DIR)/log.o -endif - -include $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc - -OBJ += $(LOG_OBJS) - -ifndef OPENAIR2 -OPENAIR2=1 -endif -ifeq ($(OPENAIR2),1) -ASN1_MSG_OBJS1=$(addprefix $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/, $(ASN1_MSG_OBJS)) -OBJ += $(L2_OBJS) $(LIST_OBJ) $(TIMER_OBJ) $(MEM_OBJ) $(OTG_OBJS) $(MATH_OBJS) -OBJ += $(OPENAIR1_DIR)/SIMULATION/ETH_TRANSPORT/netlink_init.o -OBJ += $(PDCP_DIR)/pdcp_thread.o -CFLAGS += -DOPENAIR2 -DNO_RRM -DPUCCH -DMAC_CONTEXT=1 -endif - -CFLAGS += $(L2_incl) $(UTIL_incl) $(UTILS_incl) - -CFLAGS += -I$(OPENAIR1_DIR) -I$(OPENAIR2_DIR)/RRC/LITE/MESSAGES #-I$(OPENAIR3_DIR)/MESH -I$(OPENAIR3_DIR)/MESH/RRM - -CFLAGS += -DNEW_FFT -DLOG_NO_THREAD - -ifeq ($(XFORMS),1) -CFLAGS += -DXFORMS -I/usr/include/X11 -LDFLAGS += -lforms -OBJ += $(OPENAIR1_DIR)/PHY/TOOLS/lte_phy_scope.o -OBJ += stats.o -endif - -ifdef SMBV -CFLAGS += -DSMBV -endif - -CFLAGS += -DPHYSIM -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DPHY_CONTEXT=1 -CFLAGS += -DOPENAIR_LTE -DENABLE_FXP -DOPENAIR1 -DDLSCH_THREAD #-DULSCH_THREAD - -#only for CBMIMO1 -ifdef CBMIMO1 -CFLAGS += -DFW2011 -DBIT8_TX -DCBMIMO1 -else -#only for EXPRESS MIMO -CFLAGS += -DEXMIMO -#CFLAGS += -DEXMIMO -DTIMING_ADVANCE_HW=138 #this is for ExpressMIMO 1 -#CFLAGS += -DEXMIMO -DTIMING_ADVANCE_HW=45 #this is for ExpressMIMO 2 -endif - -ifndef HARD_RT -HARD_RT=1 -endif - -ifeq ($(HARD_RT),1) -CFLAGS += -DHARD_RT -endif - -ifeq ($(EMOS),1) -CFLAGS += -DEMOS -DEMOS_CHANNEL -LDFLAGS += -lgps -endif - -ifndef NAS -NAS=1 -endif - -ifeq ($(NAS),1) -CFLAGS += -DPDCP_USE_NETLINK -DLINUX -OBJ += $(NAS_OBJS) -endif - -RTAI_CFLAGS += $(shell rtai-config --lxrt-cflags) -CFLAGS += -I/usr/realtime/include -DRTAI -LDFLAGS += -lpthread -lm -lforms -ifeq ($(RTAI),1) -LDFLAGS += $(shell rtai-config --lxrt-ldflags) -else -LDFLAGS += -lrt -endif - -#ifndef USE_MME -# USE_MME=R8 -#endif - -ifdef USE_MME - include $(OPENAIR2_DIR)/S1AP/Makefile.inc - include $(OPENAIR2_DIR)/S1AP/MESSAGES/Makefile.inc - CFLAGS += -DENABLE_USE_MME -DENB_MODE - LDFLAGS += -lsctp - CFLAGS_S1AP += -DENB_MODE -DENABLE_USE_MME -DEMIT_ASN_DEBUG=1 -DUSER_MODE - S1AP_BUILT_OBJS += $(S1AP_OBJS) $(addprefix $(OPENAIR2_DIR)/S1AP/MESSAGES/, $(S1AP_ASN_MODULE_SOURCES)) - S1AP_BUILT_OBJS += $(OPENAIR3_DIR)/OPENAIRMME/SCTP/sctp_primitives_client.o -endif - - -ASN1RELDIR=R9.8 -ifeq ($(USE_MME), R8) - ASN1RELDIR=R8.10 -else - CFLAGS_S1AP += -DUPDATE_RELEASE_9 -endif -S1AP_DIR=$(OPENAIR2_DIR)/S1AP -ASN1MESSAGESDIR=$(S1AP_DIR)/MESSAGES -ASN1DIR=$(ASN1MESSAGESDIR)/ASN1 - -all: lte-enb - -$(LFDS_DIR)/bin/liblfds611.a: - $(MAKE) -C $(LFDS_DIR) -f makefile.linux - - -$(RTAI_OBJ): %.o : %.c - @echo Compiling $< ... - @$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) -o $@ $< - -$(OBJ) $(ASN1_MSG_OBJS1): %.o : %.c - @echo Compiling $< ... - @$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -o $@ $< - -$(S1AP_BUILT_OBJS): %.o : %.c - @echo Compiling $< - @$(CC) -Wall -c $(CFLAGS_S1AP) $(S1AP_Incl) $(UTIL_incl) -o $@ $< - -$(ASN1MESSAGESDIR)/s1ap_ieregen.stamp: $(ASN1DIR)/$(ASN1RELDIR)/S1AP-PDU-Contents.asn $(ASN1DIR)/asn1tostruct.py - echo Timestamp > $@ - (cd $(ASN1DIR) && python $(ASN1DIR)/asn1tostruct.py -f$<) - -$(ASN1MESSAGESDIR)/s1ap_asn1regen.stamp: $(ASN1DIR)/$(ASN1RELDIR)/S1AP-CommonDataTypes.asn $(ASN1DIR)/$(ASN1RELDIR)/S1AP-Constants.asn $(ASN1DIR)/$(ASN1RELDIR)/S1AP-IEs.asn $(ASN1DIR)/$(ASN1RELDIR)/S1AP-PDU.asn - echo Timestamp > $@ - (cd $(ASN1MESSAGESDIR) && asn1c -gen-PER -fnative-types -fskeletons-copy $^) - -$(S1AP_DIR)/libs1ap.a: $(ASN1MESSAGESDIR)/s1ap_ieregen.stamp $(ASN1MESSAGESDIR)/s1ap_asn1regen.stamp $(S1AP_BUILT_OBJS) - @echo Creating $@ - $(AR) rcs $@ $^ - -$(LFDS_DIR)/bin/liblfds611.a: - $(MAKE) -C $(LFDS_DIR) -f makefile.linux - -ifdef USE_MME - lte-enb: $(OBJ) $(S1AP_DIR)/libs1ap.a $(ASN1_MSG_OBJS1) $(RTAI_OBJ) $(LFDS_DIR)/bin/liblfds611.a -else - lte-enb: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) $(LFDS_DIR)/bin/liblfds611.a -endif - $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) -o lte-enb $(LDFLAGS) $(LFDS_DIR)/bin/liblfds611.a - - - -nasmesh: - (cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && $(MAKE)) - (cd $(OPENAIR2_DIR) && $(MAKE) nasmesh_netlink.ko) - (sudo insmod $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko) -rb_tool: - (cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && $(MAKE)) - -nasmesh_install: - (sudo rmmod nasmesh) - (sudo insmod $(OPENAIR2_DIR)/NAS/DRIVER/MESH/nasmesh.ko) - -clean: - rm -rf $(OBJ) $(RTAI_OBJ) - rm -f $(S1AP_BUILT_OBJS) - rm -f $(ASN1MESSAGESDIR)/libs1ap.a - -cleanasn1: - rm -f $(ASN1_MSG_OBJS1) - $(shell cd $(OPENAIR2_DIR)/RRC/LITE/MESSAGES ; rm -f $(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) *.o *.d ) - rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.am.sample - rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc.generated - rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel8 - rm -f $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/asn1c/ASN1_files/.lock-rel10 - -cleanall: clean cleanasn1 - rm -rf condtest synctest lte-softmodem - rm -rf synctest_eNB synctest_UE - -show: - @echo $(CFLAGS) - @echo $(EXTRA_CFLAGS) - @echo $(OBJ) $(RTAI_OBJ) - @echo rrc_cellular variable is $(rrc_cellular) - @echo eNB_flag is $(eNB_flag) - @echo UE_flag is $(UE_flag) - @echo IS_REL8 is $(IS_REL8) - @echo IS_REL10 is $(IS_REL10) - -beautiful: - astyle --style=gnu -s2 $(SRC) diff --git a/targets/RT/USER/Makefile.msg_many b/targets/RT/USER/Makefile.msg_many deleted file mode 100644 index bc7840c1e5..0000000000 --- a/targets/RT/USER/Makefile.msg_many +++ /dev/null @@ -1,21 +0,0 @@ -CFLAGS = $(shell rtai-config --lxrt-cflags) -LDFLAGS = $(shell rtai-config --lxrt-ldflags) -lpthread -llxrt -lm - -CFLAGS += -D__IN_RTAI__ -Wall -O2 -I. - -OBJS = msg_many.o msg_helper.o - -all: msg_many - -msg_many: $(OBJS) - $(CC) $(LDFLAGS) -o $@ $(OBJS) - -$(OBJS): msg_many.h - -run: msg_many - rtai-load msg_many --verbose - -.PHONY: clean -clean: - rm -f msg_many $(OBJS) - diff --git a/targets/RT/USER/TOOLS/thread_ipc.c b/targets/RT/USER/TOOLS/thread_ipc.c index 36a61298ef..7eda3e8431 100644 --- a/targets/RT/USER/TOOLS/thread_ipc.c +++ b/targets/RT/USER/TOOLS/thread_ipc.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include diff --git a/targets/RT/USER/TOOLS/thread_ipc.h b/targets/RT/USER/TOOLS/thread_ipc.h index 99439b2b8d..ec008c30df 100644 --- a/targets/RT/USER/TOOLS/thread_ipc.h +++ b/targets/RT/USER/TOOLS/thread_ipc.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __THREAD_IPC_H__ #define __THREAD_IPC_H__ diff --git a/targets/RT/USER/UE_transport_IQ.c b/targets/RT/USER/UE_transport_IQ.c deleted file mode 100644 index a45b8ba43b..0000000000 --- a/targets/RT/USER/UE_transport_IQ.c +++ /dev/null @@ -1,555 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -/*! \file UE_transport_IQ.c - * \brief UE transport IQ sampels - * \author Katerina Trilyraki, Navid Nikaein, Raymond Knopp - * \date 2015 - * \version 0.1 - * \company Eurecom - * \maintainer: navid.nikaein@eurecom.fr - * \note - * \warning very experimental - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "common_lib.h" -#include "PHY/defs.h" -#include "rrh_gw.h" -#include "rrh_gw_externs.h" - -#define START_CMD 1 -#define RRH_UE_PORT 51000 -#define RRH_UE_DEST_IP "127.0.0.1" -#define PRINTF_PERIOD 3750 - -/****************************************************************************** - ** FUNCTION PROTOTYPES ** - ******************************************************************************/ -void *rrh_proc_UE_thread(void *); -void *rrh_UE_thread(void *); -void *rrh_UE_rx_thread(void *); -void *rrh_UE_tx_thread(void *); - - - -openair0_timestamp timestamp_UE_tx[4]= {0,0,0,0},timestamp_UE_rx[4]= {0,0,0,0}; -openair0_timestamp nrt_UE_counter[4]= {0,0,0,0}; - -pthread_t main_rrh_UE_thread,main_rrh_proc_UE_thread; -pthread_attr_t attr, attr_proc; -struct sched_param sched_param_rrh, sched_param_rrh_proc; -pthread_cond_t sync_UE_cond[4]; -pthread_mutex_t sync_UE_mutex[4]; - -int32_t overflow_rx_buffer_UE[4]= {0,0,0,0}; -int32_t nsamps_UE[4]= {0,0,0,0}; -int32_t UE_tx_started=0,UE_rx_started=0; -int32_t RT_flag_UE=0, NRT_flag_UE=1; -int32_t counter_UE_rx[4]= {0,0,0,0}; -int32_t counter_UE_tx[4]= {0,0,0,0}; -int32_t **tx_buffer_UE, **rx_buffer_UE; - -int sync_UE_rx[4]= {-1,-1,-1,-1}; -void *rrh_UE_thread_status; - - -void *rx_ue[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_rx -void *tx_ue[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_tx - - -void config_UE_mod( rrh_module_t *dev_ue, uint8_t RT_flag,uint8_t NRT_flag) { - - int i; - int error_code_UE, error_code_proc_UE; - void *tmp; - - RT_flag_UE=RT_flag; - NRT_flag_UE=NRT_flag; - - pthread_attr_init(&attr); - sched_param_rrh.sched_priority = sched_get_priority_max(SCHED_FIFO); - pthread_attr_init(&attr_proc); - sched_param_rrh_proc.sched_priority = sched_get_priority_max(SCHED_FIFO-1); - - pthread_attr_setschedparam(&attr,&sched_param_rrh); - pthread_attr_setschedpolicy(&attr,SCHED_FIFO); - pthread_attr_setschedparam(&attr_proc,&sched_param_rrh_proc); - pthread_attr_setschedpolicy(&attr_proc,SCHED_FIFO-1); - - - for (i=0; i<4; i++) { - pthread_mutex_init(&sync_UE_mutex[i],NULL); - pthread_cond_init(&sync_UE_cond[i],NULL); - } - - error_code_UE = pthread_create(&main_rrh_UE_thread, &attr, rrh_UE_thread, (void *)dev_ue); - error_code_proc_UE = pthread_create(&main_rrh_proc_UE_thread, &attr_proc, rrh_proc_UE_thread, (void *)dev_ue); - - if (error_code_UE) { - printf("Error while creating UE thread\n"); - exit(-1); - } - - if (error_code_proc_UE) { - printf("Error while creating UE proc thread\n"); - exit(-1); - } - -} - - -/*! \fn void *rrh_proc_UE_thread((void *)dev_ue) -* \brief this function -* \param[in] -* \param[out] -* \return -* \note -* @ingroup _oai -*/ -void *rrh_proc_UE_thread(void * arg) { - - int antenna_index,i; - openair0_timestamp truncated_timestamp, truncated_timestamp_final, last_hw_counter=0; - struct timespec time_req, time_rem; - int16_t *txp,*rxp; - unsigned int samples_per_frame=0; - rrh_module_t *dev=(rrh_module_t *)arg; - - samples_per_frame= dev->eth_dev.openair0_cfg->samples_per_frame; - AssertFatal(samples_per_frame <=0, "invalide samples_per_frame !%u\n",samples_per_frame); - - time_req.tv_sec = 0; - time_req.tv_nsec = 1000; - - while (rrh_exit==0) { - //wait until some data has been copied - for (antenna_index=0; antenna_index<4; antenna_index++) { - if (sync_UE_rx[antenna_index]==0) { - if (!UE_tx_started) { - UE_tx_started=1; //Set this flag to 1 to indicate that a UE started retrieving data - if (RT_flag_UE==1) { - last_hw_counter=hw_counter; - } - } else { - if (RT_flag_UE==1) { - if (hw_counter > last_hw_counter+1) { - printf("L1"); - // goto end_copy_UE; - } else { - while (hw_counter < last_hw_counter+1) - nanosleep(&time_req,&time_rem); - } - } - } - - truncated_timestamp = timestamp_UE_tx[antenna_index]%(samples_per_frame); - truncated_timestamp_final = (timestamp_UE_tx[antenna_index]+nsamps_UE[antenna_index])%samples_per_frame; - - if ((truncated_timestamp + nsamps_UE[antenna_index]) > samples_per_frame) { - if ((timestamp_eNB_rx[antenna_index]%samples_per_frame < nsamps_UE[antenna_index]) && (eNB_rx_started==1)) { - overflow_rx_buffer_eNB[antenna_index]++; - printf("eNB Overflow[%d] : %d, timestamp : %d\n",antenna_index,overflow_rx_buffer_eNB[antenna_index],(int)truncated_timestamp); - - if (NRT_flag_UE==1) { - while ((timestamp_eNB_rx[antenna_index]%samples_per_frame) < nsamps_UE[antenna_index]) - nanosleep(&time_req,&time_rem); - } - } - - rxp = (int16_t*)&rx_buffer_eNB[antenna_index][truncated_timestamp]; - txp = (int16_t*)&tx_buffer_UE[antenna_index][truncated_timestamp]; - - for (i=0; i<(samples_per_frame<<1)-(truncated_timestamp<<1); i++) { - rxp[i] = txp[i]>>6; - } - - rxp = (int16_t*)&rx_buffer_eNB[antenna_index][0]; - txp = (int16_t*)&tx_buffer_UE[antenna_index][0]; - - for (i=0; i>6; - } - - } else { - if (((truncated_timestamp < (timestamp_eNB_rx[antenna_index]%samples_per_frame)) && - (truncated_timestamp_final > (timestamp_eNB_rx[antenna_index]%samples_per_frame))) && - (eNB_rx_started==1)) { - overflow_rx_buffer_eNB[antenna_index]++; - printf("eNB Overflow[%d] : %d, timestamp : %d\n",antenna_index,overflow_rx_buffer_eNB[antenna_index],(int)truncated_timestamp); - - if (NRT_flag_UE==1) { - while (truncated_timestamp_final > timestamp_eNB_rx[antenna_index]%samples_per_frame) - nanosleep(&time_req,&time_rem); - } - } - - rxp = (int16_t*)&rx_buffer_eNB[antenna_index][truncated_timestamp]; - txp = (int16_t*)&tx_buffer_UE[antenna_index][truncated_timestamp]; - - for (i=0; i<(nsamps_eNB[antenna_index]); i++) { - rxp[i] =txp[i]>>6; - } - - } - //end_copy_UE : - last_hw_counter=hw_counter; - pthread_mutex_lock(&sync_UE_mutex[antenna_index]); - sync_UE_rx[antenna_index]--; - pthread_mutex_unlock(&sync_UE_mutex[antenna_index]); - - } - } - - } - - return(0); -} - -/*! \fn void *rrh_UE_thread(void *arg) -* \brief this function -* \param[in] -* \param[out] -* \return -* \note -* @ingroup _oai -*/ -void *rrh_UE_thread(void *arg) { - - rrh_module_t *dev=(rrh_module_t *)arg; - - struct sched_param sched_param_UE_rx, sched_param_UE_tx; - int16_t i,cmd; //,nsamps,antenna_index; - ssize_t bytes_received; - struct timespec time_req_1us, time_rem_1us; - pthread_t UE_rx_thread, UE_tx_thread; - pthread_attr_t attr_UE_rx, attr_UE_tx; - int error_code_UE_rx, error_code_UE_tx; - void *tmp; - unsigned int samples_per_frame=0; - - samples_per_frame= dev->eth_dev.openair0_cfg->samples_per_frame; - time_req_1us.tv_sec = 0; - time_req_1us.tv_nsec = 1000; - - while (rrh_exit==0) { - - cmd=dev->eth_dev.trx_start_func(&dev->eth_dev); - - /* allocate memory for TX/RX buffers */ - rx_buffer_UE = (int32_t**)malloc16(dev->eth_dev.openair0_cfg->rx_num_channels*sizeof(int32_t*)); - tx_buffer_UE = (int32_t**)malloc16(dev->eth_dev.openair0_cfg->tx_num_channels*sizeof(int32_t*)); - - for (i=0; ieth_dev.openair0_cfg->rx_num_channels; i++) { - tmp=(void *)malloc(sizeof(int32_t)*(samples_per_frame+4)); - memset(tmp,0,sizeof(int32_t)*(samples_per_frame+4)); - rx_buffer_UE[i]=(tmp+4*sizeof(int32_t)); - } - - for (i=0; ieth_dev.openair0_cfg->tx_num_channels; i++) { - tmp=(void *)malloc(sizeof(int32_t)*(samples_per_frame+4)); - memset(tmp,0,sizeof(int32_t)*(samples_per_frame+4)); - tx_buffer_UE[i]=(tmp+4*sizeof(int32_t)); - } - - printf("Client %s:%d is connected (DL_RB=%d) rt=%d|%d. \n" , dev->eth_dev.openair0_cfg->remote_addr, - dev->eth_dev.openair0_cfg->remote_port, - dev->eth_dev.openair0_cfg->num_rb_dl, - dev->eth_dev.openair0_cfg->rx_num_channels, - dev->eth_dev.openair0_cfg->tx_num_channels); - - if (cmd==START_CMD) { - - pthread_attr_init(&attr_UE_rx); - pthread_attr_init(&attr_UE_tx); - sched_param_UE_rx.sched_priority = sched_get_priority_max(SCHED_FIFO); - sched_param_UE_tx.sched_priority = sched_get_priority_max(SCHED_FIFO); - pthread_attr_setschedparam(&attr_UE_rx,&sched_param_UE_rx); - pthread_attr_setschedparam(&attr_UE_tx,&sched_param_UE_tx); - pthread_attr_setschedpolicy(&attr_UE_rx,SCHED_FIFO); - pthread_attr_setschedpolicy(&attr_UE_tx,SCHED_FIFO); - - error_code_UE_rx = pthread_create(&UE_rx_thread, &attr_UE_rx, rrh_UE_rx_thread, (void *)&dev); - error_code_UE_tx = pthread_create(&UE_tx_thread, &attr_UE_tx, rrh_UE_tx_thread, (void *)&dev); - - if (error_code_UE_rx) { - printf("Error while creating UE RX thread\n"); - exit(-1); - } - - if (error_code_UE_tx) { - printf("Error while creating UE TX thread\n"); - exit(-1); - } - - while (rrh_exit==0) - sleep(1); - } - } - - - rrh_UE_thread_status = 0; - pthread_exit(&rrh_UE_thread_status); - - return(0); -} - - -/*! \fn void *rrh_UE_rx_thread(void *arg) -* \brief this function -* \param[in] -* \param[out] -* \return -* \note -* @ingroup _oai -*/ -void *rrh_UE_rx_thread(void *arg) { - - rrh_module_t *dev = (rrh_module_t *)arg; - struct timespec time0,time1,time2; - struct timespec time_req_1us, time_rem_1us; - ssize_t bytes_sent; - int antenna_index, nsamps; - int trace_cnt=0; - unsigned long long max_rx_time=0, min_rx_time=133333, total_rx_time=0, average_rx_time=133333, s_period=0, trial=0; - unsigned int samples_per_frame=0; - openair0_timestamp temp, last_hw_counter=0; - - antenna_index = 0; - nsamps = dev->eth_dev.openair0_cfg->samples_per_packet; - samples_per_frame = dev->eth_dev.openair0_cfg->samples_per_frame; - - while (rrh_exit == 0) { - if (!UE_rx_started) { - UE_rx_started=1; //Set this flag to 1 to indicate that a UE started retrieving data - - if (RT_flag_UE==1) { - last_hw_counter=hw_counter; - } - } else { - if (RT_flag_UE==1) { - if (hw_counter > last_hw_counter+1) { - printf("L1"); - //goto end_copy_UE; - } else { - while (hw_counter < last_hw_counter+1) - nanosleep(&time_req_1us,&time_rem_1us); - } - } - } - - clock_gettime(CLOCK_MONOTONIC,&time1); - - // send return - - if ((timestamp_UE_rx[antenna_index]%(samples_per_frame)+nsamps) > samples_per_frame) { // Wrap around if nsamps exceeds the buffer limit - if (((timestamp_eNB_tx[antenna_index]%(samples_per_frame)) < ((timestamp_UE_rx[antenna_index]+nsamps)%(samples_per_frame))) && (eNB_tx_started==1)) { - printf("UE underflow wraparound timestamp_UE_rx : %d, timestamp_eNB_tx : %d\n", - (int)(timestamp_UE_rx[antenna_index]%(samples_per_frame)), - (int)(timestamp_eNB_tx[antenna_index]%samples_per_frame)); - - if (NRT_flag_UE==1) { - while ((timestamp_eNB_tx[antenna_index]%samples_per_frame) < ((timestamp_UE_rx[antenna_index]+nsamps)%(samples_per_frame))) - nanosleep(&time_req_1us,&time_rem_1us); - } - } - - rx_ue[antenna_index]=(void*)&rx_buffer_UE[antenna_index][timestamp_UE_rx[antenna_index]%(samples_per_frame)]; - if ((bytes_sent =dev->eth_dev.trx_write_func (dev, - timestamp_UE_rx[antenna_index], - rx_ue, - ( samples_per_frame- (timestamp_eNB_rx[antenna_index]%(samples_per_frame)) ), - antenna_index, - 0))<0) - perror("RRH UE : sendto for RX"); - - rx_ue[antenna_index]=(void*)&rx_buffer_UE[antenna_index][3]; - if ((bytes_sent =dev->eth_dev.trx_write_func (dev, - timestamp_UE_rx[antenna_index], - rx_ue, - (nsamps - samples_per_frame + (timestamp_eNB_rx[antenna_index]%(samples_per_frame))), - antenna_index, - 0))<0) - perror("RRH UE : sendto for RX"); - - } else { - if (((timestamp_UE_rx[antenna_index]%samples_per_frame)< timestamp_eNB_tx[antenna_index]%samples_per_frame) && - (((timestamp_UE_rx[antenna_index]+nsamps)%samples_per_frame) > (timestamp_eNB_tx[antenna_index]%samples_per_frame)) && - (eNB_tx_started==1) ) { - printf("UE underflow timestamp_UE_rx : %d, timestamp_eNB_tx : %d\n", - (int)(timestamp_UE_rx[antenna_index]%samples_per_frame), - (int)(timestamp_eNB_tx[antenna_index]%samples_per_frame)); - - if (NRT_flag_UE==1) { - while (((timestamp_UE_rx[antenna_index]+nsamps)%samples_per_frame) > (timestamp_eNB_tx[antenna_index]%samples_per_frame)) { - nanosleep(&time_req_1us,&time_rem_1us); - } - } - } - - rx_ue[antenna_index]=(void*)&rx_buffer_UE[antenna_index][timestamp_UE_rx[antenna_index]%(samples_per_frame)]; - if ((bytes_sent = dev->eth_dev.trx_write_func (dev, - timestamp_UE_rx[antenna_index], - rx_ue, - nsamps, - antenna_index, - 0))<0) - perror("RRH UE thread: sendto for RX"); - } - - timestamp_UE_rx[antenna_index]+=nsamps; - last_hw_counter=hw_counter; - - clock_gettime(CLOCK_MONOTONIC,&time2); - - if (trace_cnt++ > 10) { - total_rx_time = (unsigned int)(time2.tv_nsec - time0.tv_nsec); - - if (total_rx_time < 0) total_rx_time=1000000000-total_rx_time; - - if ((total_rx_time > 0) && (total_rx_time < 1000000000)) { - trial++; - - if (total_rx_time < min_rx_time) - min_rx_time = total_rx_time; - - if (total_rx_time > max_rx_time) - max_rx_time = total_rx_time; - - average_rx_time = (long long unsigned int)((average_rx_time*trial)+total_rx_time)/(trial+1); - } - - if (s_period++ == PRINTF_PERIOD) { - s_period=0; - printf("Average UE RX time : %lu\tMax RX time : %lu\tMin RX time : %lu\n",average_rx_time,max_rx_time,min_rx_time); - - } - - //printf("RX: t1 %llu (time from last send), t2 %llu (sendto of %lu bytes) total time : %llu\n",(long long unsigned int)(time1.tv_nsec - time0.tv_nsec), (long long unsigned int)(time2.tv_nsec - time1.tv_nsec), - // (nsamps<<2)+sizeof(openair0_timestamp),(long long unsigned int)(time2.tv_nsec - time0.tv_nsec)); - - } - - memcpy(&time0,&time2,sizeof(struct timespec)); - - } //while (UE_exit==0) - - return(0); - -} - - -/*! \fn void *rrh_UE_tx_thread(void *arg) -* \brief this function -* \param[in] -* \param[out] -* \return -* \note -* @ingroup _oai -*/ -void *rrh_UE_tx_thread(void *arg) { - - struct timespec time0a,time0,time1,time2; - struct timespec time_req_1us, time_rem_1us; - - - rrh_module_t *dev = (rrh_module_t *)arg; - ssize_t bytes_received; - int antenna_index, nsamps; - int trace_cnt=0; - unsigned int samples_per_frame=0; - - antenna_index = 0; - nsamps = dev->eth_dev.openair0_cfg->samples_per_packet; - samples_per_frame = dev->eth_dev.openair0_cfg->samples_per_frame; - - - while (rrh_exit == 0) { - - clock_gettime(CLOCK_MONOTONIC,&time0a); - - bytes_received = dev->eth_dev.trx_read_func(dev, - ×tamp_UE_tx[antenna_index], - tx_ue, - nsamps, - antenna_index); - - clock_gettime(CLOCK_MONOTONIC,&time1); - - if (NRT_flag_UE==1) { - nrt_UE_counter[antenna_index]++; - } - printf(" first part size: %d second part size: %d idx=%d \n", - (int32_t)(((samples_per_frame)<<2)-((timestamp_UE_tx[antenna_index]%(samples_per_frame))<<2)), - (nsamps<<2)-((samples_per_frame)<<2)+((timestamp_UE_tx[antenna_index]%(samples_per_frame))<<2), - timestamp_UE_tx[antenna_index]%(samples_per_frame)); - if ((timestamp_UE_tx[antenna_index]%(samples_per_frame)+nsamps) > samples_per_frame) { // Wrap around if nsamps exceeds the buffer limit - memcpy(&tx_buffer_UE[antenna_index][timestamp_UE_tx[antenna_index]%(samples_per_frame)],(void*)(tx_ue[antenna_index]), - (samples_per_frame<<2)-((timestamp_UE_tx[antenna_index]%(samples_per_frame))<<2)); - - memcpy(&tx_buffer_UE[antenna_index][0], (void*)(tx_ue[antenna_index]+(samples_per_frame*4)-((timestamp_UE_tx[antenna_index]%(samples_per_frame))<<2)), - (nsamps<<2)-((samples_per_frame-(timestamp_UE_tx[antenna_index]%(samples_per_frame)))<<2)); - //printf("Received UE TX samples for antenna %d, nsamps %d (%d)\n",antenna_index,nsamps,(int)(bytes_received>>2)); - } else { - memcpy(&tx_buffer_UE[antenna_index][timestamp_UE_tx[antenna_index]%(samples_per_frame)], (void*)(tx_ue[antenna_index]),(nsamps<<2)); - } - - while (sync_UE_rx[antenna_index]==0) - nanosleep(&time_req_1us,&time_rem_1us); - - pthread_mutex_lock(&sync_UE_mutex[antenna_index]); - sync_UE_rx[antenna_index]++; - - if (!sync_UE_rx[antenna_index]) { - counter_UE_tx[antenna_index]=(counter_UE_tx[antenna_index]+nsamps)%samples_per_frame; - nsamps_UE[antenna_index]=nsamps; - } else { - printf("rrh_eNB_proc thread is busy, will exit\n"); - exit(-1); - } - - pthread_mutex_unlock(&sync_UE_mutex[antenna_index]); - - clock_gettime(CLOCK_MONOTONIC,&time2); - - memcpy(&time0,&time2,sizeof(struct timespec)); - - } - - return(0); - -} - - diff --git a/targets/RT/USER/condtest.c b/targets/RT/USER/condtest.c deleted file mode 100644 index 6ff2fe4516..0000000000 --- a/targets/RT/USER/condtest.c +++ /dev/null @@ -1,181 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include -#include -#include - -#define PERIOD 100000000 -#define THRESHOLD 1 - -static SEM *mutex; -static CND *cond; - -static int thread0; -static int thread1; - -static int instance_cnt=-1; //0 means worker is busy, -1 means its free - -static void *fun0(void *arg) -{ - RT_TASK *task; - int done1=0, cnt1=0; - RTIME right_now; - int ret; - - task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF); - mlockall(MCL_CURRENT | MCL_FUTURE); - - rt_make_hard_real_time(); - - while (cnt1 < THRESHOLD) { - rt_sem_wait(mutex); - rt_printk("fun0: Hello World %d, instance_cnt %d!\n",cnt1,instance_cnt); - - while (instance_cnt<0) { - ret = rt_cond_wait(cond, mutex); - - if (ret != 0) { - rt_printk("error in rt_cond_wait, code %d\n",ret); - - switch (ret) { - case RTE_PERM: - rt_printk("error RTE_PERM %d\n",ret); - break; - - case RTE_UNBLKD: - rt_printk("error RTE_UNBLKD %d\n",ret); - break; - - case RTE_OBJREM: - rt_printk("error RTE_OBJREM %d\n",ret); - break; - - default: - rt_printk("unknown error code %d\n",ret); - break; - } - - break; - } - } - - rt_sem_signal(mutex); - - // do some work here - cnt1++; - - rt_sem_wait(mutex); - instance_cnt--; - rt_sem_signal(mutex); - - } - - // makes task soft real time - rt_make_soft_real_time(); - - printf("Back to soft RT\n"); - // clean task - rt_task_delete(task); - printf("Task deleted. returning\n"); - return 0; -} - - -int main(void) -{ - RT_TASK *task; - RTIME now; - int cnt=0; - - // make main thread LXRT soft realtime - task = rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF); - mlockall(MCL_CURRENT | MCL_FUTURE); - - // start realtime timer and scheduler - //rt_set_oneshot_mode(); - rt_set_periodic_mode(); - start_rt_timer(0); - - now = rt_get_time() + 10*PERIOD; - rt_task_make_periodic(task, now, PERIOD); - - printf("Init mutex and cond.\n"); - mutex = rt_sem_init(nam2num("MUTEX"), 1); - - if (mutex==0) - printf("Error init mutex\n"); - - cond = rt_cond_init(nam2num("CONDITION")); - - if (cond==0) - printf("Error init cond\n"); - - thread0 = rt_thread_create(fun0, NULL, 10000); - //thread1 = rt_thread_create(fun1, NULL, 20000); - - //rt_sleep(PERIOD); - - while (cnt < THRESHOLD) { - rt_task_wait_period(); - rt_printk("main: Hello World %d!\n",cnt); - rt_sem_wait(mutex); //now the mutex should have value 0 - - if (instance_cnt==0) { - rt_sem_signal(mutex); //now the mutex should have vaule 1 - rt_printk("worker thread busy!\n"); - } else { - instance_cnt++; - rt_cond_signal(cond); - rt_sem_signal(mutex); //now the mutex should have vaule 1 - rt_printk("signaling worker thread to start!\n"); - } - - cnt++; - } - - // wait for end of program - printf("TYPE TO TERMINATE\n"); - getchar(); - - // cleanup - stop_rt_timer(); - return 0; -} diff --git a/targets/RT/USER/eNB_transport_IQ.c b/targets/RT/USER/eNB_transport_IQ.c deleted file mode 100644 index 86080c2c33..0000000000 --- a/targets/RT/USER/eNB_transport_IQ.c +++ /dev/null @@ -1,753 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file eNB_transport_IQ.c - * \brief eNB transport IQ samples - * \author Katerina Trilyraki, Navid Nikaein, Raymond Knopp - * \date 2015 - * \version 0.1 - * \company Eurecom - * \maintainer: navid.nikaein@eurecom.fr - * \note - * \warning very experimental - */ -#include -#include -#include -#include -#include -#include -#include - -#include "common_lib.h" -#include "PHY/defs.h" -#include "rrh_gw.h" -#include "rrh_gw_externs.h" -#include "rt_wrapper.h" - -#define PRINTF_PERIOD 3750 -#define HEADER_SIZE ((sizeof(int32_t) + sizeof(openair0_timestamp))>>2) - -pthread_cond_t sync_eNB_cond[4]; -pthread_mutex_t sync_eNB_mutex[4]; -pthread_mutex_t sync_trx_mutex=PTHREAD_MUTEX_INITIALIZER; -pthread_cond_t sync_trx_cond=PTHREAD_COND_INITIALIZER; - -openair0_timestamp nrt_eNB_counter[4]= {0,0,0,0}; -int32_t overflow_rx_buffer_eNB[4]= {0,0,0,0}; -int32_t nsamps_eNB[4]= {0,0,0,0}; -int32_t eNB_tx_started=0,eNB_rx_started=0; -int32_t counter_eNB_rx[4]= {0,0,0,0}; -int32_t counter_eNB_tx[4]= {0,0,0,0}; -uint8_t RT_flag_eNB,NRT_flag_eNB; -void *rrh_eNB_thread_status; -int sync_eNB_rx[4]= {-1,-1,-1,-1}; -unsigned int sync_trx=0; - -int32_t **tx_buffer_eNB; -int32_t **rx_buffer_eNB; -void **rx_eNB; //was fixed to 2 ant -void **tx_eNB; //was fixed to 2 ant - -openair0_timestamp timestamp_eNB_tx[4]= {0,0,0,0};// all antennas must have the same ts -openair0_timestamp timestamp_eNB_rx[4]= {0,0,0,0}; -openair0_timestamp timestamp_rx=0,timestamp_tx=0; - -unsigned int rx_pos=0, next_rx_pos=0; -unsigned int tx_pos=0, tx_pos_rf=0, prev_tx_pos=0; -unsigned int rt_period=0; - -struct itimerspec timerspec; -pthread_mutex_t timer_mutex; - - - -/*! \fn void *rrh_eNB_rx_thread(void *arg) - * \brief this function - * \param[in] - * \return none - * \note - * @ingroup _oai - */ -void *rrh_eNB_rx_thread(void *); -/*! \fn void *rrh_eNB_tx_thread(void *arg) - * \brief this function - * \param[in] - * \return none - * \note - * @ingroup _oai - */ -void *rrh_eNB_tx_thread(void *); -/*! \fn void *rrh_eNB_thread(void *arg) - * \brief this function - * \param[in] - * \return none - * \note - * @ingroup _oai - */ -void *rrh_eNB_thread(void *); -/*! \fn void check_dev_config( rrh_module_t *mod_enb) - * \brief this function - * \param[in] *mod_enb - * \return none - * \note - * @ingroup _oai - */ -static void check_dev_config( rrh_module_t *mod_enb); -/*! \fn void calc_rt_period_ns( openair0_config_t openair0_cfg) - * \brief this function - * \param[in] openair0_cfg - * \return none - * \note - * @ingroup _oai - */ -static void calc_rt_period_ns( openair0_config_t *openair0_cfg); - - - -void config_BBU_mod( rrh_module_t *mod_enb, uint8_t RT_flag, uint8_t NRT_flag) { - - int error_code_eNB; - pthread_t main_rrh_eNB_thread; - pthread_attr_t attr; - struct sched_param sched_param_rrh; - - RT_flag_eNB=RT_flag; - NRT_flag_eNB=NRT_flag; - - /* init socket and have handshake-like msg with client to exchange parameters */ - mod_enb->eth_dev.trx_start_func(&mod_enb->eth_dev);//change port make it plus_id - - mod_enb->devs->openair0_cfg = mod_enb->eth_dev.openair0_cfg; - - /* check sanity of configuration parameters and print */ - check_dev_config(mod_enb); - if (rf_config_file[0] == '\0') - mod_enb->devs->openair0_cfg->configFilename = NULL; - else - mod_enb->devs->openair0_cfg->configFilename = rf_config_file; - /* initialize and configure the RF device */ - if (openair0_device_load(mod_enb->devs, mod_enb->devs->openair0_cfg)<0) { - LOG_E(RRH,"Exiting, cannot initialize RF device.\n"); - exit(-1); - } else { - if (mod_enb->devs->type != NONE_DEV) { - /* start RF device */ - if (mod_enb->devs->type == EXMIMO_DEV) { - //call start function for exmino - } else { - - if (mod_enb->devs->trx_start_func(mod_enb->devs)!=0) - LOG_E(RRH,"Unable to initiate RF device.\n"); - else - LOG_I(RRH,"RF device has been initiated.\n"); - } - - } - } - - /* create main eNB module thread - main_rrh_eNB_thread allocates memory - for TX/RX buffers and creates TX/RX - threads for every eNB module */ - pthread_attr_init(&attr); - sched_param_rrh.sched_priority = sched_get_priority_max(SCHED_FIFO); - pthread_attr_setschedparam(&attr,&sched_param_rrh); - pthread_attr_setschedpolicy(&attr,SCHED_FIFO); - error_code_eNB = pthread_create(&main_rrh_eNB_thread, &attr, rrh_eNB_thread, (void *)mod_enb); - - if (error_code_eNB) { - LOG_E(RRH,"Error while creating eNB thread\n"); - exit(-1); - } - -} - - -void *rrh_eNB_thread(void *arg) { - - rrh_module_t *dev=(rrh_module_t *)arg; - pthread_t eNB_rx_thread, eNB_tx_thread; - int error_code_eNB_rx, error_code_eNB_tx; - int32_t i,j; - void *tmp; - unsigned int samples_per_frame=0; - - samples_per_frame = dev->eth_dev.openair0_cfg->samples_per_frame; - - while (rrh_exit==0) { - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TRX, 1 ); - - /* calculate packet period */ - calc_rt_period_ns(dev->eth_dev.openair0_cfg); - - /* allocate memory for TX/RX buffers - each antenna port has a TX and a RX buffer - each TX and RX buffer is of (samples_per_frame + HEADER_SIZE) samples (size of samples is 4 bytes) */ - rx_buffer_eNB = (int32_t**)malloc16(dev->eth_dev.openair0_cfg->rx_num_channels*sizeof(int32_t*)); - tx_buffer_eNB = (int32_t**)malloc16(dev->eth_dev.openair0_cfg->tx_num_channels*sizeof(int32_t*)); - LOG_D(RRH,"rx_buffer_eNB address =%p tx_buffer_eNB address =%p \n",rx_buffer_eNB,tx_buffer_eNB); - - /* rx_buffer_eNB points to the beginning of data */ - for (i=0; ieth_dev.openair0_cfg->rx_num_channels; i++) { - tmp=(void *)malloc16(sizeof(int32_t)*(samples_per_frame + 32)); - memset(tmp,0,sizeof(int32_t)*(samples_per_frame + 32)); - rx_buffer_eNB[i]=( tmp + (32*sizeof(int32_t)) ); - LOG_D(RRH,"i=%d rx_buffer_eNB[i]=%p tmp= %p\n",i,rx_buffer_eNB[i],tmp); - } - /* tx_buffer_eNB points to the beginning of data */ - for (i=0; ieth_dev.openair0_cfg->tx_num_channels; i++) { - tmp=(void *)malloc16(sizeof(int32_t)*(samples_per_frame + 32)); - memset(tmp,0,sizeof(int32_t)*(samples_per_frame + 32)); - tx_buffer_eNB[i]=( tmp + (32*sizeof(int32_t)) ); - LOG_D(RRH,"i= %d tx_buffer_eNB[i]=%p tmp= %p \n",i,tx_buffer_eNB[i],tmp); - } - /* dummy initialization for TX/RX buffers */ - for (i=0; ieth_dev.openair0_cfg->rx_num_channels; i++) { - for (j=0; jeth_dev.openair0_cfg->tx_num_channels; i++) { - for (j=0; jeth_dev.openair0_cfg->rx_num_channels*sizeof(int32_t*)); - tx_eNB = (void**)malloc16(dev->eth_dev.openair0_cfg->tx_num_channels*sizeof(int32_t*)); - - /* init mutexes */ - for (i=0; ieth_dev.openair0_cfg->tx_num_channels; i++) { - pthread_mutex_init(&sync_eNB_mutex[i],NULL); - pthread_cond_init(&sync_eNB_cond[i],NULL); - } - /* init mutexes */ - pthread_mutex_init(&sync_trx_mutex,NULL); - - /* create eNB module's TX/RX threads */ -#ifdef DEADLINE_SCHEDULER - error_code_eNB_rx = pthread_create(&eNB_rx_thread, NULL, rrh_eNB_rx_thread, (void *)dev); - error_code_eNB_tx = pthread_create(&eNB_tx_thread, NULL, rrh_eNB_tx_thread, (void *)dev); - LOG_I(RRH,"[eNB][SCHED] deadline scheduling applied to eNB TX/RX threads\n"); -#else - pthread_attr_t attr_eNB_rx, attr_eNB_tx; - struct sched_param sched_param_eNB_rx, sched_param_eNB_tx; - - pthread_attr_init(&attr_eNB_rx); - pthread_attr_init(&attr_eNB_tx); - sched_param_eNB_rx.sched_priority = sched_get_priority_max(SCHED_FIFO); - sched_param_eNB_tx.sched_priority = sched_get_priority_max(SCHED_FIFO); - pthread_attr_setschedparam(&attr_eNB_rx,&sched_param_eNB_rx); - pthread_attr_setschedparam(&attr_eNB_tx,&sched_param_eNB_tx); - pthread_attr_setschedpolicy(&attr_eNB_rx,SCHED_FIFO); - pthread_attr_setschedpolicy(&attr_eNB_tx,SCHED_FIFO); - - error_code_eNB_rx = pthread_create(&eNB_rx_thread, &attr_eNB_rx, rrh_eNB_rx_thread, (void *)dev); - error_code_eNB_tx = pthread_create(&eNB_tx_thread, &attr_eNB_tx, rrh_eNB_tx_thread, (void *)dev); - LOG_I(RRH,"[eNB][SCHED] FIFO scheduling applied to eNB TX/RX threads\n"); -#endif - - if (error_code_eNB_rx) { - LOG_E(RRH,"[eNB] Error while creating eNB RX thread\n"); - exit(-1); - } - if (error_code_eNB_tx) { - LOG_E(RRH,"[eNB] Error while creating eNB TX thread\n"); - exit(-1); - } - - /* create timer thread; when no RF device is present a software clock is generated */ - if (dev->devs->type == NONE_DEV) { - - int error_code_timer; - pthread_t main_timer_proc_thread; - - LOG_I(RRH,"Creating timer thread with rt period %d ns.\n",rt_period); - - /* setup the timer to generate an interrupt: - -for the first time in (sample_per_packet/sample_rate) ns - -and then every (sample_per_packet/sample_rate) ns */ - timerspec.it_value.tv_sec = rt_period/1000000000; - timerspec.it_value.tv_nsec = rt_period%1000000000; - timerspec.it_interval.tv_sec = rt_period/1000000000; - timerspec.it_interval.tv_nsec = rt_period%1000000000; - - -#ifdef DEADLINE_SCHEDULER - error_code_timer = pthread_create(&main_timer_proc_thread, NULL, timer_proc, (void *)&timerspec); - LOG_I(RRH,"[eNB][SCHED] deadline scheduling applied to timer thread \n"); -#else - pthread_attr_t attr_timer; - struct sched_param sched_param_timer; - - pthread_attr_init(&attr_timer); - sched_param_timer.sched_priority = sched_get_priority_max(SCHED_FIFO-1); - pthread_attr_setschedparam(&attr_timer,&sched_param_timer); - pthread_attr_setschedpolicy(&attr_timer,SCHED_FIFO-1); - - pthread_mutex_init(&timer_mutex,NULL); - - error_code_timer = pthread_create(&main_timer_proc_thread, &attr_timer, timer_proc, (void *)&timerspec); - LOG_I(RRH,"[eNB][SCHED] FIFO scheduling applied to timer thread \n"); -#endif - - if (error_code_timer) { - LOG_E(RRH,"Error while creating timer proc thread\n"); - exit(-1); - } - - } - - while (rrh_exit==0) - sleep(1); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TRX,0 ); - } - - rrh_eNB_thread_status = 0; - pthread_exit(&rrh_eNB_thread_status); - return(0); -} - -/* Receive from RF and transmit to RRH */ - -void *rrh_eNB_rx_thread(void *arg) { - - /* measurement related vars */ - struct timespec time0,time1,time2; - unsigned long long max_rx_time=0, min_rx_time=rt_period, total_rx_time=0, average_rx_time=rt_period, s_period=0, trial=0; - int trace_cnt=0; - - struct timespec time_req_1us, time_rem_1us; - rrh_module_t *dev = (rrh_module_t *)arg; - ssize_t bytes_sent; - int i=0 ,pck_rx=0, s_cnt=0; - openair0_timestamp last_hw_counter=0; //volatile int64_t - unsigned int samples_per_frame=0,samples_per_subframe=0, spp_rf=0, spp_eth=0; - uint8_t loopback=0,measurements=0; - unsigned int subframe=0; - unsigned int frame=0; - - time_req_1us.tv_sec = 0; - time_req_1us.tv_nsec =1000; //time_req_1us.tv_nsec = (int)rt_period/2;--->granularity issue - spp_eth = dev->eth_dev.openair0_cfg->samples_per_packet; - spp_rf = dev->devs->openair0_cfg->samples_per_packet; - - samples_per_frame = dev->eth_dev.openair0_cfg->samples_per_frame; - samples_per_subframe = (unsigned int)samples_per_frame/10; - loopback = dev->loopback; - measurements = dev->measurements; - next_rx_pos = spp_eth; - -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = (0.8 * 100) * 10000;//4 * 10000; - attr.sched_deadline = (0.9 * 100) * 10000;//rt_period-2000; - attr.sched_period = 1 * 1000000;//rt_period; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] eNB RX thread: sched_setattr failed (run with sudo)\n"); - exit(-1); - } -#endif - - while (rrh_exit == 0) { - while (rx_pos <(1 + subframe)*samples_per_subframe) { - //LOG_D(RRH,"starting a new send:%d %d\n",sync_trx,frame); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_RX, 1 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME_RX, frame); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME_RX, subframe ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_PCK, pck_rx ); - LOG_D(RRH,"pack=%d rx_pos=%d subframe=%d frame=%d\n ",pck_rx, rx_pos, subframe,frame); - - if (dev->devs->type == NONE_DEV) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_HWCNT, hw_counter ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_LHWCNT, last_hw_counter ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_CNT, s_cnt ); - if (!eNB_rx_started) { - eNB_rx_started=1; // set this flag to 1 to indicate that eNB started - if (RT_flag_eNB==1) { - last_hw_counter=hw_counter;//get current counter - } - } else { - if (RT_flag_eNB==1) { - if (hw_counter > last_hw_counter+1) { - printf("LR"); - } else { - while ((hw_counter < last_hw_counter+1)) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_RX_SLEEP, 1 ); - nanosleep(&time_req_1us,&time_rem_1us); //rt_sleep_ns(sleep_ns); - s_cnt++; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_RX_SLEEP, 0 ); - } - } - } - } - } - - - if (measurements == 1 ) clock_gettime(CLOCK_MONOTONIC,&time1); - - if (loopback == 1 ) { - if (sync_eNB_rx[i]==0) { - rx_eNB[i] = (void*)&tx_buffer_eNB[i][tx_pos]; - LOG_I(RRH,"tx_buffer_eNB[i][tx_pos]=%d ,tx_pos=%d\n",tx_buffer_eNB[i][tx_pos],tx_pos); - } else { - rx_eNB[i] = (void*)&rx_buffer_eNB[i][rx_pos]; - LOG_I(RRH,"rx_buffer_eNB[i][rx_pos]=%d ,rx_pos=%d\n",rx_buffer_eNB[i][rx_pos],rx_pos); - } - } - - for (i=0; ieth_dev.openair0_cfg->rx_num_channels; i++) { - rx_eNB[i] = (void*)&rx_buffer_eNB[i][rx_pos]; - LOG_D(RRH," rx_eNB[i]=%p rx_buffer_eNB[i][rx_pos]=%p ,rx_pos=%d, i=%d ts=%d\n",rx_eNB[i],&rx_buffer_eNB[i][rx_pos],rx_pos,i,timestamp_rx); - } - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RXCNT, rx_pos ); - if (dev->devs->type != NONE_DEV) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_RF, 1 ); - /* Read operation to RF device (RX)*/ - if ( dev->devs->trx_read_func (dev->devs, - ×tamp_rx, - rx_eNB, - spp_rf, - dev->devs->openair0_cfg->rx_num_channels - )<0) { - perror("RRH eNB : USRP read"); - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_RF, 0 ); - } - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RX_TS, timestamp_rx&0xffffffff ); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - if ((bytes_sent = dev->eth_dev.trx_write_func (&dev->eth_dev, - timestamp_rx, - rx_eNB, - spp_eth, - dev->eth_dev.openair0_cfg->rx_num_channels, - 0))<0) { - perror("RRH eNB : ETHERNET write"); - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); - - /* when there is no RF timestamp is updated by number of samples */ - if (dev->devs->type == NONE_DEV) { - timestamp_rx+=spp_eth; - last_hw_counter=hw_counter; - } - - if (measurements == 1 ) { - - clock_gettime(CLOCK_MONOTONIC,&time2); - - if (trace_cnt++ > 10) { - total_rx_time = (unsigned int)(time2.tv_nsec - time0.tv_nsec); - if (total_rx_time < 0) - total_rx_time=1000000000-total_rx_time; - - if ((total_rx_time > 0) && (total_rx_time < 1000000000)) { - trial++; - if (total_rx_time < min_rx_time) - min_rx_time = total_rx_time; - if (total_rx_time > max_rx_time){ - max_rx_time = total_rx_time; - LOG_I(RRH,"Max value %d update at rx_position %d \n",total_rx_time,timestamp_rx); - } - average_rx_time = (long long unsigned int)((average_rx_time*trial)+total_rx_time)/(trial+1); - } - if (s_period++ == PRINTF_PERIOD) { - s_period=0; - LOG_I(RRH,"Average eNB RX time : %lu ns\tMax RX time : %lu ns\tMin RXX time : %lu ns\n",average_rx_time,max_rx_time,min_rx_time); - } - } - - memcpy(&time0,&time2,sizeof(struct timespec)); - } - - if (loopback == 1 ) { - pthread_mutex_lock(&sync_eNB_mutex[i]); - sync_eNB_rx[i]--; - pthread_mutex_unlock(&sync_eNB_mutex[i]); - } - - rx_pos += spp_eth; - pck_rx++; - next_rx_pos=(rx_pos+spp_eth); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_RX, 0 ); - /* - if (frame>50) { - pthread_mutex_lock(&sync_trx_mutex); - while (sync_trx) { - pthread_cond_wait(&sync_trx_cond,&sync_trx_mutex); - } - sync_trx=1; - LOG_D(RRH,"out of while send:%d %d\n",sync_trx,frame); - pthread_cond_signal(&sync_trx_cond); - pthread_mutex_unlock(&sync_trx_mutex); - }*/ - } // while - - subframe++; - s_cnt=0; - - /* wrap around rx buffer index */ - if (next_rx_pos >= samples_per_frame) - next_rx_pos -= samples_per_frame; - if (rx_pos >= samples_per_frame) - rx_pos -= samples_per_frame; - /* wrap around subframe number */ - if (subframe == 10 ) { - subframe = 0; - frame++; - } - - - } //while (eNB_exit==0) - return 0; -} - -/* Receive from eNB and transmit to RF */ - -void *rrh_eNB_tx_thread(void *arg) { - - struct timespec time0a,time0,time1,time2; - - rrh_module_t *dev = (rrh_module_t *)arg; - struct timespec time_req_1us, time_rem_1us; - ssize_t bytes_received; - int i; - openair0_timestamp last_hw_counter=0; - unsigned int samples_per_frame=0,samples_per_subframe=0; - unsigned int spp_rf=0, spp_eth=0; - uint8_t loopback=0,measurements=0; - unsigned int subframe=0,frame=0; - unsigned int pck_tx=0; - -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = (0.8 * 100) * 10000; - attr.sched_deadline = (0.9 * 100) * 10000; - attr.sched_period = 1 * 1000000; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] eNB TX thread: sched_setattr failed\n"); - exit(-1); - } -#endif - - time_req_1us.tv_sec = 1; - time_req_1us.tv_nsec = 0; - spp_eth = dev->eth_dev.openair0_cfg->samples_per_packet; - spp_rf = dev->devs->openair0_cfg->samples_per_packet; - samples_per_frame = dev->eth_dev.openair0_cfg->samples_per_frame; - samples_per_subframe = (unsigned int)samples_per_frame/10; - tx_pos=0; - - loopback = dev->loopback; - measurements = dev->measurements; - - while (rrh_exit == 0) { - while (tx_pos < (1 + subframe)*samples_per_subframe) { - - //LOG_D(RRH,"bef lock read:%d %d\n",sync_trx,frame); - //pthread_mutex_lock(&sync_trx_mutex); - - //while (!sync_trx) { - //LOG_D(RRH,"in sync read:%d %d\n",sync_trx,frame); - //pthread_cond_wait(&sync_trx_cond,&sync_trx_mutex); - //} - //LOG_D(RRH,"out of while read:%d %d\n",sync_trx,frame); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TX, 1 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, subframe ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_PCK, pck_tx ); - - if (measurements == 1 ) clock_gettime(CLOCK_MONOTONIC,&time1); - for (i=0; ieth_dev.openair0_cfg->tx_num_channels; i++) tx_eNB[i] = (void*)&tx_buffer_eNB[i][tx_pos]; - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TXCNT, tx_pos ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - - /* Read operation to ETHERNET device */ - if (( bytes_received = dev->eth_dev.trx_read_func(&dev->eth_dev, - ×tamp_tx, - tx_eNB, - spp_eth, - dev->eth_dev.openair0_cfg->tx_num_channels))<0) { - perror("RRH eNB : ETHERNET read"); - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - - if (dev->devs->type != NONE_DEV) { - LOG_D(RRH," tx_buffer_eNB[i][tx_pos]=%x t_buffer_eNB[i][tx_pos+1]=%x t_buffer_eNB[i][tx_pos+2]=%x \n",tx_buffer_eNB[0][tx_pos],tx_buffer_eNB[0][tx_pos+1],tx_buffer_eNB[0][tx_pos+2]); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_RF, 1 ); - /* Write operation to RF device (TX)*/ - if ( dev->devs->trx_write_func (dev->devs, - timestamp_tx, - tx_eNB, - spp_rf, - dev->devs->openair0_cfg->tx_num_channels, - 1)<0){ - perror("RRH eNB : USRP write"); - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_RF, 0 ); - } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TX_TS, timestamp_tx&0xffffffff ); - - - if (dev->devs->type == NONE_DEV) last_hw_counter=hw_counter; - - - if (loopback ==1 ) { - while (sync_eNB_rx[i]==0) - nanosleep(&time_req_1us,&time_rem_1us); - - pthread_mutex_lock(&sync_eNB_mutex[i]); - sync_eNB_rx[i]++; - pthread_mutex_unlock(&sync_eNB_mutex[i]); - } - - if (measurements == 1 ) { - clock_gettime(CLOCK_MONOTONIC,&time2); - memcpy(&time0,&time2,sizeof(struct timespec)); - } - - prev_tx_pos=tx_pos; - tx_pos += spp_eth; - pck_tx++; - - //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_TX, 0 ); - //sync_trx=0; - //pthread_cond_signal(&sync_trx_cond); - //pthread_mutex_unlock(&sync_trx_mutex); - } - - /* wrap around tx buffer index */ - if (tx_pos >= samples_per_frame) - tx_pos -= samples_per_frame; - /* wrap around subframe number */ - subframe++; - if (subframe == 10 ) { - subframe = 0; // the radio frame is complete, start over - frame++; - } - - } //while (eNB_exit==0) - return 0; -} - - -static void calc_rt_period_ns( openair0_config_t *openair0_cfg) { - - rt_period= (double)(openair0_cfg->samples_per_packet/(openair0_cfg->samples_per_frame/10.0)*1000000); - AssertFatal(rt_period > 0, "Invalid rt period !%u\n", rt_period); - LOG_I(RRH,"[eNB] Real time period is set to %u ns\n", rt_period); -} - - -static void check_dev_config( rrh_module_t *mod_enb) { - - AssertFatal( (mod_enb->devs->openair0_cfg->num_rb_dl==100 || mod_enb->devs->openair0_cfg->num_rb_dl==50 || mod_enb->devs->openair0_cfg->num_rb_dl==25 || mod_enb->devs->openair0_cfg->num_rb_dl==6) , "Invalid number of resource blocks! %d\n", mod_enb->devs->openair0_cfg->num_rb_dl); - AssertFatal( mod_enb->devs->openair0_cfg->samples_per_frame > 0 , "Invalid number of samples per frame! %d\n",mod_enb->devs->openair0_cfg->samples_per_frame); - AssertFatal( mod_enb->devs->openair0_cfg->sample_rate > 0.0, "Invalid sample rate! %f\n", mod_enb->devs->openair0_cfg->sample_rate); - AssertFatal( mod_enb->devs->openair0_cfg->samples_per_packet > 0 , "Invalid number of samples per packet! %d\n",mod_enb->devs->openair0_cfg->samples_per_packet); - AssertFatal( mod_enb->devs->openair0_cfg->rx_num_channels > 0 , "Invalid number of RX antennas! %d\n", mod_enb->devs->openair0_cfg->rx_num_channels); - AssertFatal( mod_enb->devs->openair0_cfg->tx_num_channels > 0 , "Invalid number of TX antennas! %d\n", mod_enb->devs->openair0_cfg->tx_num_channels); - AssertFatal( mod_enb->devs->openair0_cfg->rx_freq[0] > 0.0 ,"Invalid RX frequency! %f\n", mod_enb->devs->openair0_cfg->rx_freq[0]); - AssertFatal( mod_enb->devs->openair0_cfg->tx_freq[0] > 0.0 ,"Invalid TX frequency! %f\n", mod_enb->devs->openair0_cfg->tx_freq[0]); - AssertFatal( mod_enb->devs->openair0_cfg->rx_gain[0] > 0.0 ,"Invalid RX gain! %f\n", mod_enb->devs->openair0_cfg->rx_gain[0]); - AssertFatal( mod_enb->devs->openair0_cfg->tx_gain[0] > 0.0 ,"Invalid TX gain! %f\n", mod_enb->devs->openair0_cfg->tx_gain[0]); - AssertFatal( mod_enb->devs->openair0_cfg->rx_bw > 0.0 ,"Invalid RX bw! %f\n", mod_enb->devs->openair0_cfg->rx_bw); - AssertFatal( mod_enb->devs->openair0_cfg->tx_bw > 0.0 ,"Invalid RX bw! %f\n", mod_enb->devs->openair0_cfg->tx_bw); - AssertFatal( mod_enb->devs->openair0_cfg->autocal[0] > 0 , "Invalid auto calibration choice! %d\n", mod_enb->devs->openair0_cfg->autocal[0]); - - printf("\n---------------------RF device configuration parameters---------------------\n"); - - printf("\tMod_id=%d\n \tlog level=%d\n \tDL_RB=%d\n \tsamples_per_frame=%d\n \tsample_rate=%f\n \tsamples_per_packet=%d\n \ttx_scheduling_advance=%d\n \ttx_sample_advance=%d\n \trx_num_channels=%d\n \ttx_num_channels=%d\n \trx_freq_0=%f\n \ttx_freq_0=%f\n \trx_freq_1=%f\n \ttx_freq_1=%f\n \trx_freq_2=%f\n \ttx_freq_2=%f\n \trx_freq_3=%f\n \ttx_freq_3=%f\n \trxg_mode=%d\n \trx_gain_0=%f\n \ttx_gain_0=%f\n \trx_gain_1=%f\n \ttx_gain_1=%f\n \trx_gain_2=%f\n \ttx_gain_2=%f\n \trx_gain_3=%f\n \ttx_gain_3=%f\n \trx_gain_offset_2=%f\n \ttx_gain_offset_3=%f\n \trx_bw=%f\n \ttx_bw=%f\n \tautocal=%d\n", - mod_enb->devs->openair0_cfg->Mod_id, - mod_enb->devs->openair0_cfg->log_level, - mod_enb->devs->openair0_cfg->num_rb_dl, - mod_enb->devs->openair0_cfg->samples_per_frame, - mod_enb->devs->openair0_cfg->sample_rate, - mod_enb->devs->openair0_cfg->samples_per_packet, - mod_enb->devs->openair0_cfg->tx_scheduling_advance, - mod_enb->devs->openair0_cfg->tx_sample_advance, - mod_enb->devs->openair0_cfg->rx_num_channels, - mod_enb->devs->openair0_cfg->tx_num_channels, - mod_enb->devs->openair0_cfg->rx_freq[0], - mod_enb->devs->openair0_cfg->tx_freq[0], - mod_enb->devs->openair0_cfg->rx_freq[1], - mod_enb->devs->openair0_cfg->tx_freq[1], - mod_enb->devs->openair0_cfg->rx_freq[2], - mod_enb->devs->openair0_cfg->tx_freq[2], - mod_enb->devs->openair0_cfg->rx_freq[3], - mod_enb->devs->openair0_cfg->tx_freq[3], - mod_enb->devs->openair0_cfg->rxg_mode[0], - mod_enb->devs->openair0_cfg->tx_gain[0], - mod_enb->devs->openair0_cfg->tx_gain[0], - mod_enb->devs->openair0_cfg->rx_gain[1], - mod_enb->devs->openair0_cfg->tx_gain[1], - mod_enb->devs->openair0_cfg->rx_gain[2], - mod_enb->devs->openair0_cfg->tx_gain[2], - mod_enb->devs->openair0_cfg->rx_gain[3], - mod_enb->devs->openair0_cfg->tx_gain[3], - //mod_enb->devs->openair0_cfg->rx_gain_offset[0], - //mod_enb->devs->openair0_cfg->rx_gain_offset[1], - mod_enb->devs->openair0_cfg->rx_gain_offset[2], - mod_enb->devs->openair0_cfg->rx_gain_offset[3], - mod_enb->devs->openair0_cfg->rx_bw, - mod_enb->devs->openair0_cfg->tx_bw, - mod_enb->devs->openair0_cfg->autocal[0] - ); - - printf("----------------------------------------------------------------------------\n"); - - -} diff --git a/targets/RT/USER/eNB_usrp.gtkw b/targets/RT/USER/eNB_usrp.gtkw index 935bf68b2e..838ec54383 100644 --- a/targets/RT/USER/eNB_usrp.gtkw +++ b/targets/RT/USER/eNB_usrp.gtkw @@ -1,55 +1,39 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Sun Apr 10 20:34:38 2016 +[*] Tue Jul 25 20:26:12 2017 [*] [dumpfile] "/tmp/openair_dump_eNB.vcd" -[dumpfile_mtime] "Sun Apr 10 20:26:57 2016" -[dumpfile_size] 181182776 +[dumpfile_mtime] "Tue Jul 25 20:11:55 2017" +[dumpfile_size] 19201475 [savefile] "/home/papillon/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw" -[timestart] 19787100000 -[size] 1535 876 -[pos] -1 -1 -*-21.793451 19795882832 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -[sst_width] 284 -[signals_width] 238 +[timestart] 29023604000 +[size] 1236 578 +[pos] 309 0 +*-20.793451 29026062100 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 386 +[signals_width] 262 [sst_expanded] 1 -[sst_vpaned_height] 294 -@24 -variables.hw_frame[63:0] -variables.hw_subframe[63:0] +[sst_vpaned_height] 146 @28 functions.trx_read functions.trx_write @24 -variables.txcnt[63:0] -variables.rxcnt[63:0] variables.trx_ts[63:0] variables.trx_tst[63:0] -variables.frame_number_TX_eNB[63:0] -variables.frame_number_RX_eNB[63:0] @28 -functions.eNB_thread_rx0 -functions.eNB_thread_tx0 -functions.eNB_thread_rx1 -functions.eNB_thread_tx1 -functions.eNB_thread_rx2 -functions.eNB_thread_tx2 -functions.eNB_thread_rx3 -functions.eNB_thread_tx3 -functions.eNB_thread_rx4 -functions.eNB_thread_tx4 -functions.eNB_thread_rx5 -functions.eNB_thread_tx5 -functions.eNB_thread_rx6 -functions.eNB_thread_tx6 -functions.eNB_thread_rx7 -functions.eNB_thread_tx7 -functions.eNB_thread_rx8 -functions.eNB_thread_tx8 -functions.eNB_thread_rx9 -functions.eNB_thread_tx9 -functions.phy_procedures_eNb_tx -functions.phy_procedures_eNb_rx +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_RU[63:0] +variables.subframe_number_RX0_RU[63:0] +@25 +variables.frame_number_TX0_RU[63:0] +@24 +variables.subframe_number_TX0_RU[63:0] +@28 +functions.phy_procedures_eNb_tx0 +functions.eNB_thread_rxtx1 +functions.phy_enb_sfgen +functions.phy_enb_prach_rx @24 variables.dci_info[63:0] variables.ue0_BO[63:0] @@ -64,8 +48,6 @@ functions.macxface_SR_indication @420 variables.ue0_SR_ENERGY[63:0] variables.ue0_SR_THRES[63:0] -@25 -variables.dci_info[63:0] @28 functions.phy_enb_ulsch_decoding0 @24 diff --git a/targets/RT/USER/emos-raw.c b/targets/RT/USER/emos-raw.c deleted file mode 100644 index b436e84502..0000000000 --- a/targets/RT/USER/emos-raw.c +++ /dev/null @@ -1,1611 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file lte-softmodem.c -* \brief main program to control HW and scheduling -* \author R. Knopp, F. Kaltenberger -* \date 2012 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr -* \note -* \warning -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "rt_wrapper.h" - -#include "PHY/types.h" -#include "PHY/TOOLS/defs.h" -#include "openair0_lib.h" - -#include "UTIL/LOG/log.h" -#include "UTIL/LOG/vcd_signal_dumper.h" - -#include "gain_control.h" - -#if defined(ENABLE_ITTI) -# include "intertask_interface_init.h" -# include "timer.h" -# if defined(ENABLE_USE_MME) -# include "s1ap_eNB.h" -# include "sctp_eNB_task.h" -# endif -#endif - -#define OPENAIR_THREAD_PRIORITY 255 -#define OPENAIR_THREAD_STACK_SIZE 8192 - -#ifdef XFORMS -/* -#include "PHY/TOOLS/lte_phy_scope.h" -#include "stats.h" -// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) -// at eNB 0, an UL scope for every UE -FD_lte_phy_scope_ue *form_ue[NUMBER_OF_UE_MAX]; -FD_lte_phy_scope_enb *form_enb[NUMBER_OF_UE_MAX]; -FD_stats_form *form_stats=NULL; -char title[255]; -unsigned char scope_enb_num_ue = 1; -*/ -#include "lte_scope.h" -FD_lte_scope *form_lte; -char title[255]; -#endif //XFORMS - -#ifdef EMOS -#include -struct gps_fix_t dummy_gps_data; -#ifdef RTAI -#include -#endif - -//#define CHANSOUNDER_FIFO_SIZE 10485760 // 10 Mbytes FIFO -//#define CHANSOUNDER_FIFO_SIZE 20971520 // 20 Mbytes FIFO -#define CHANSOUNDER_FIFO_SIZE 52428800 // 50 Mbytes FIFO -//#define CHANSOUNDER_FIFO_SIZE 104857600 // 100 Mbytes FIFO -//#define CHANSOUNDER_FIFO_SIZE 1073741824 // 1Gbyte FIFO -#define CHANSOUNDER_FIFO_MINOR 4 // minor of the FIFO device - this is /dev/rtf3 -#define CHANSOUNDER_FIFO_DEV "/dev/rtf4" -#endif - -#define FRAME_PERIOD 100000000ULL -#define DAQ_PERIOD 66667ULL -#define LTE_SLOTS_PER_FRAME 20 -//#define RESAMPLING_FACTOR 0 -#define SAMPLES_PER_SLOT 15360 -#define FRAME_LENGTH_COMPLEX_SAMPLES (SAMPLES_PER_SLOT*LTE_SLOTS_PER_FRAME) -#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all - -#ifdef RTAI -static SEM *mutex; -//static CND *cond; - -static long int thread0; -//static long int thread1; -//static long int sync_thread; -#else -pthread_t thread0; -//pthread_t thread1; -pthread_attr_t attr_dlsch_threads; -struct sched_param sched_param_dlsch; -#endif - -pthread_t thread2; //xforms -pthread_t thread3; //emos -pthread_t thread4; //GPS -pthread_t thread5; //log - -/* -static int instance_cnt=-1; //0 means worker is busy, -1 means its free -int instance_cnt_ptr_kern,*instance_cnt_ptr_user; -int pci_interface_ptr_kern; -*/ -//extern unsigned int bigphys_top; -//extern unsigned int mem_base; - -int number_of_cards = 1; -exmimo_config_t *p_exmimo_config; -exmimo_id_t *p_exmimo_id; -volatile unsigned int *DAQ_MBOX; - -int oai_exit = 0; - -//int time_offset[4] = {-138,-138,-138,-138}; -//int time_offset[4] = {-145,-145,-145,-145}; -int time_offset[4] = {0,0,0,0}; - -int fs4_test=0; -char UE_flag=0; -uint8_t eNB_id=0,UE_id=0; - -// this array sets the bandwidth used for each card (and applies to all chains on one card). -exmimo_bw_t bandwidth[MAX_CARDS] = {BW5,BW5,BW5,BW5}; -// the array carrier_freq sets the frequency for each chain of each card. A 0 means that the chain is disabled. -// Please make sure that the total number of channels enabled per card is in accordance with the following rules: -// BW20: one channel, BW10: 2 channels, BW5: 4 channels -//uint32_t carrier_freq[MAX_CARDS][4] = {{2590000000,0,0,0},{2590000000,0,0,0},{2605000000,2605000000,0,0},{0,0,0,0}}; -//uint32_t carrier_freq[MAX_CARDS][4] = {{2590000000,0,0,0},{2605000000,2605000000,0,0},{0,0,0,0},{0,0,0,0}}; -uint32_t carrier_freq[MAX_CARDS][4] = {{771500000,771500000,771500000,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; - -// the following paramters set the aquisition time and period. These parameters have to be set in accordance with the write speed of your harddisk and the required throughput according to the setting above (see also channel_buffer_size which is computed later). -#define AQU_LENGTH_FRAMES 100 //Aquisition time in frames -#define AQU_PERIOD_FRAMES 100 //Repetition time of aquisition in frames -#define AQU_LENGTH_SLOTS (AQU_LENGTH_FRAMES*LTE_SLOTS_PER_FRAME) //Aquisition time in slots -#define AQU_PERIOD_SLOTS (AQU_PERIOD_FRAMES*LTE_SLOTS_PER_FRAME) //Repetition time of aquisition in slots - -int32_t rx_total_gain_dB[3] = {-112, -124, -136}; - -/* -// this array sets the bandwidth used for each card (and applies to all chains on one card). -exmimo_bw_t bandwidth[MAX_CARDS] = {BW20,BW20,BW10,BW5}; -// the array carrier_freq sets the frequency for each chain of each card. A 0 means that the chain is disabled. -// Please make sure that the total number of channels enabled per card is in accordance with the following rules: -// BW20: one channel, BW10: 2 channels, BW5: 4 channels -uint32_t carrier_freq[MAX_CARDS][4] = {{2590000000,0,0,0},{2590000000,0,0,0},{2605000000,2605000000,0,0},{0,0,0,0}}; -//uint32_t carrier_freq[MAX_CARDS][4] = {{2590000000,0,0,0},{2605000000,2605000000,0,0},{0,0,0,0},{0,0,0,0}}; -//uint32_t carrier_freq[MAX_CARDS][4] = {{2590000000,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; - -// the following paramters set the aquisition time and period. These parameters have to be set in accordance with the write speed of your harddisk and the required throughput according to the setting above (see also channel_buffer_size which is computed later). -#define AQU_LENGTH_FRAMES 100 //Aquisition time in frames -#define AQU_PERIOD_FRAMES 200 //Repetition time of aquisition in frames -#define AQU_LENGTH_SLOTS (AQU_LENGTH_FRAMES*LTE_SLOTS_PER_FRAME) //Aquisition time in slots -#define AQU_PERIOD_SLOTS (AQU_PERIOD_FRAMES*LTE_SLOTS_PER_FRAME) //Repetition time of aquisition in slots - -int32_t rx_total_gain_dB[3] = {-105, -110, -115}; -*/ - -char dumpfile_dir[256] = "/mnt/emos"; - -char *conf_config_file_name = NULL; - -unsigned int lost_bytes=0; -unsigned int rssi_lin[MAX_CARDS][4],rssi_lin_max[MAX_CARDS],rssi_lin_avg[MAX_CARDS]; -uint8_t rssi_avg_dB[MAX_CARDS]; -long long unsigned int total_bytes=0; - -struct timing_info_t { - //unsigned int frame, hw_slot, last_slot, next_slot; - RTIME time_min, time_max, time_avg, time_last, time_now; - //unsigned int mbox0, mbox1, mbox2, mbox_target; - unsigned int n_samples; -} timing_info; - -extern int16_t* sync_corr_ue0; -extern int16_t prach_ifft[4][1024*2]; - -unsigned int frame; -int rx_input_level_dBm; -#ifdef XFORMS -extern int otg_enabled; -#else -int otg_enabled; -#endif - -int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,76,84,90,98,106,114,120,128,136,144, 0}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers -//int mbox_bounds[20] = {6,14,22,28,36,44,52,58,66,74,82,88,96,104,112,118,126,134,142, 148}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers - -//void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier); -//void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier); -void test_config(int card, int ant, unsigned int rf_mode, int UE_flag); - -unsigned int build_rflocal(int txi, int txq, int rxi, int rxq) -{ - return (txi + (txq<<6) + (rxi<<12) + (rxq<<18)); -} -unsigned int build_rfdc(int dcoff_i_rxfe, int dcoff_q_rxfe) -{ - return (dcoff_i_rxfe + (dcoff_q_rxfe<<8)); -} - -void signal_handler(int sig) -{ - void *array[10]; - size_t size; - - if (sig==SIGSEGV) { - // get void*'s for all entries on the stack - size = backtrace(array, 10); - - // print out all the frames to stderr - fprintf(stderr, "Error: signal %d:\n", sig); - backtrace_symbols_fd(array, size, 2); - exit(-1); - } else { - oai_exit=1; - } -} - -void exit_fun(const char* s) -{ - void *array[10]; - size_t size; - - printf("Exiting: %s\n",s); - - oai_exit=1; - //rt_sleep_ns(FRAME_PERIOD); - - //exit (-1); -} - -#ifdef XFORMS -extern void ia_receiver_on_off( FL_OBJECT * form, long arg) {} - - -void *scope_thread(void *arg) -{ - int16_t prach_corr[1024]; - char stats_buffer[16384]; - //FILE *UE_stats, *eNB_stats; - int i,len=0; - float rxsig_t_dB[4][FRAME_LENGTH_COMPLEX_SAMPLES]; - float time[FRAME_LENGTH_COMPLEX_SAMPLES]; - struct sched_param sched_param; - int card,ant,idx; - - sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1; - sched_setscheduler(0, SCHED_FIFO,&sched_param); - - printf("Scope thread has priority %d\n",sched_param.sched_priority); - - /* - if (UE_flag==1) - UE_stats = fopen("UE_stats.txt", "w"); - else - eNB_stats = fopen("eNB_stats.txt", "w"); - */ - - while (!oai_exit) { - /* - if (UE_flag==1) { - len = dump_ue_stats (PHY_vars_UE_g[0], stats_buffer, 0, mode,rx_input_level_dBm); - fl_set_object_label(form_stats->stats_text, stats_buffer); - //rewind (UE_stats); - //fwrite (stats_buffer, 1, len, UE_stats); - - phy_scope_UE(form_ue[UE_id], - PHY_vars_UE_g[UE_id], - eNB_id, - UE_id,7); - - } else { - len = dump_eNB_stats (PHY_vars_eNB_g[0], stats_buffer, 0); - fl_set_object_label(form_stats->stats_text, stats_buffer); - //rewind (eNB_stats); - //fwrite (stats_buffer, 1, len, eNB_stats); - for(UE_id=0;UE_idframing.resampling_factor[ant]); - - for (i=0; ichannel_t_re[idx],time,rxsig_t_dB[0],len,"","",""); - fl_set_xyplot_data(form_lte->channel_t_im[idx],time,rxsig_t_dB[1],len,"","",""); - idx++; - } - } - } - - //printf("doing forms\n"); - usleep(100000); - } - - //fclose (UE_stats); - //fclose (eNB_stats); - - pthread_exit((void*)arg); -} -#endif - -int dummy_tx_buffer[3840*4] __attribute__((aligned(16))); - - -#ifdef EMOS -void* gps_thread (void *arg) -{ - - struct gps_data_t gps_data; - struct gps_data_t *gps_data_ptr = &gps_data; - struct sched_param sched_param; - int ret; - - sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1; - sched_setscheduler(0, SCHED_FIFO,&sched_param); - - printf("GPS thread has priority %d\n",sched_param.sched_priority); - - memset(&dummy_gps_data,0,sizeof(struct gps_fix_t)); - -#if GPSD_API_MAJOR_VERSION>=5 - ret = gps_open("127.0.0.1","2947",gps_data_ptr); - - if (ret!=0) -#else - gps_data_ptr = gps_open("127.0.0.1","2947"); - - if (gps_data_ptr == NULL) -#endif - { - printf("[EMOS] Could not open GPS\n"); - pthread_exit((void*)arg); - } - -#if GPSD_API_MAJOR_VERSION>=4 - else if (gps_stream(gps_data_ptr, WATCH_ENABLE,NULL) != 0) -#else - else if (gps_query(gps_data_ptr, "w+x") != 0) -#endif - { - printf("[EMOS] Error sending command to GPS\n"); - pthread_exit((void*) arg); - } else - printf("[EMOS] Opened GPS, gps_data=%p\n", gps_data_ptr); - - - while (!oai_exit) { - printf("[EMOS] polling data from gps\n"); -#if GPSD_API_MAJOR_VERSION>=5 - - if (gps_waiting(gps_data_ptr,500)) { - if (gps_read(gps_data_ptr) <= 0) { -#else - - if (gps_waiting(gps_data_ptr)) { - if (gps_poll(gps_data_ptr) != 0) { -#endif - printf("[EMOS] problem polling data from gps\n"); - } else { - memcpy(&dummy_gps_data,&(gps_data_ptr->fix),sizeof(struct gps_fix_t)); - printf("[EMOS] lat %g, lon %g\n",gps_data_ptr->fix.latitude,gps_data_ptr->fix.longitude); - } - } //gps_waiting - else { - printf("[EMOS] WARNING: No GPS data available, storing dummy packet\n"); - } - - //rt_sleep_ns(1000000000LL); - sleep(1); - } //oai_exit - - pthread_exit((void*) arg); - -} - -void *log_thread (void *arg) -{ - //struct tm now_sec; - struct timeval now; - int card; - FILE *logfile_id; - char logfile_name[1024]; - time_t starttime_tmp; - struct tm starttime; - - //open file - time(&starttime_tmp); - localtime_r(&starttime_tmp,&starttime); - snprintf(logfile_name,1024,"%s/%s_data_%d%02d%02d_%02d%02d%02d.log", - dumpfile_dir, - (UE_flag==0) ? "eNB" : "UE", - 1900+starttime.tm_year, starttime.tm_mon+1, starttime.tm_mday, starttime.tm_hour, starttime.tm_min, starttime.tm_sec); - logfile_id = fopen(logfile_name,"w"); - - if ((logfile_id == NULL)) { - fprintf(stderr, "[EMOS] Error opening logfile %s\n",logfile_name); - exit(EXIT_FAILURE); - } - - fprintf(logfile_id, - "#time, frame, total bytes wrote, total bytes lost, GPS time, GPS mode, lat, lon, alt, speed, rssi_lin_max[0], rssi_lin_avg[0], rssi_avg_dBm[0], rssi_avg_dB[0], rx_gain[0], LNA[0], ...\n"); - - while (!oai_exit) { - gettimeofday(&now,NULL); - //localtime_r(&(now.tv_sec),&now_sec); - fprintf(logfile_id,"%d.%06d, %d, %llu, %u, %e, %d, %e, %e, %e, %e, ", - (int) now.tv_sec, (int)now.tv_usec, - frame, total_bytes,lost_bytes, - dummy_gps_data.time, dummy_gps_data.mode, dummy_gps_data.latitude, dummy_gps_data.longitude, dummy_gps_data.altitude, dummy_gps_data.speed); - - for (card=0; cardrf.rf_mode[0] & LNAGAINMASK) >> 14)-1] - openair0_exmimo_pci[card].exmimo_config_ptr->rf.rx_gain[0][0], - rssi_avg_dB[card], openair0_exmimo_pci[card].exmimo_config_ptr->rf.rx_gain[0][0], (openair0_exmimo_pci[card].exmimo_config_ptr->rf.rf_mode[0] & LNAGAINMASK) >> 14); - - fprintf(logfile_id,"\n"); - usleep(10000); - } - - //close file - fclose(logfile_id); - - pthread_exit((void*) arg); - -} - -void *emos_thread (void *arg) -{ - char c; - char *fifo2file_buffer, *fifo2file_ptr; - - int fifo, counter=0, bytes; - - FILE *dumpfile_id; - char dumpfile_name[1024]; - time_t starttime_tmp; - struct tm starttime; - - //time_t timer; - struct tm now_sec; - struct timeval now; - - struct sched_param sched_param; - int ret; - - int card, ant; - int channel_buffer_size=0; //in bytes - - pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL); - - sched_param.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - sched_setscheduler(0, SCHED_FIFO,&sched_param); - - printf("EMOS thread has priority %d\n",sched_param.sched_priority); - - //timer = time(NULL); - //now = localtime(&timer); - - for (card=0; cardframing.resampling_factor[ant]); - } - - channel_buffer_size *= 4; //4 bytes per sample - - // allocate memory for NO_FRAMES_DISK channes estimations - fifo2file_buffer = malloc(AQU_LENGTH_SLOTS*channel_buffer_size); - fifo2file_ptr = fifo2file_buffer; - - if (fifo2file_buffer == NULL) { - printf("[EMOS] Cound not allocate memory for fifo2file_buffer\n"); - exit(EXIT_FAILURE); - } - - if ((fifo = open(CHANSOUNDER_FIFO_DEV, O_RDONLY)) < 0) { - fprintf(stderr, "[EMOS] Error opening the fifo\n"); - exit(EXIT_FAILURE); - } - - - time(&starttime_tmp); - localtime_r(&starttime_tmp,&starttime); - snprintf(dumpfile_name,1024,"%s/%s_data_%d%02d%02d_%02d%02d%02d.EMOS", - dumpfile_dir, - (UE_flag==0) ? "eNB" : "UE", - 1900+starttime.tm_year, starttime.tm_mon+1, starttime.tm_mday, starttime.tm_hour, starttime.tm_min, starttime.tm_sec); - - dumpfile_id = fopen(dumpfile_name,"w"); - - if ((dumpfile_id == NULL)) { - fprintf(stderr, "[EMOS] Error opening dumpfile %s\n",dumpfile_name); - exit(EXIT_FAILURE); - } - - printf("[EMOS] starting dump, channel_buffer_size=%d ...\n",channel_buffer_size); - - while (!oai_exit) { - //bytes = rtf_read_timed(fifo, fifo2file_ptr, channel_buffer_size,100); - bytes = rtf_read_all_at_once(fifo, fifo2file_ptr, channel_buffer_size); - - if (bytes<=0) { - usleep(100); - continue; - } - - if (bytes != channel_buffer_size) { - printf("[EMOS] Frame %d: ERROR! Only got %d bytes instead of %d!\n",frame,bytes,channel_buffer_size); - } - - /* - if (UE_flag==0) - printf("eNB: count %d, frame %d, read: %d bytes from the fifo\n",counter, ((fifo_dump_emos_eNB*)fifo2file_ptr)->frame_tx,bytes); - else - printf("UE: count %d, frame %d, read: %d bytes from the fifo\n",counter, ((fifo_dump_emos_UE*)fifo2file_ptr)->frame_rx,bytes); - */ - - fifo2file_ptr += channel_buffer_size; - counter ++; - total_bytes += bytes; - - if ((counter%AQU_LENGTH_SLOTS)==0) { - //reset stuff - fifo2file_ptr = fifo2file_buffer; - //counter = 0; - - printf("[EMOS] Frame %d: start writing %d bytes to disk\n",frame,AQU_LENGTH_SLOTS*channel_buffer_size); - - //flush buffer to disk - if (fwrite(fifo2file_buffer, sizeof(char), AQU_LENGTH_SLOTS*channel_buffer_size, dumpfile_id) != AQU_LENGTH_SLOTS*channel_buffer_size) { - fprintf(stderr, "[EMOS] Error writing to dumpfile\n"); - exit(EXIT_FAILURE); - } else - printf("[EMOS] Frame %d: wrote %d bytes to disk\n",frame,AQU_LENGTH_SLOTS*channel_buffer_size); - - } - - if ((counter%AQU_LENGTH_SLOTS)==0) { - //time(&starttime_tmp); - gettimeofday(&now,NULL); - localtime_r(&(now.tv_sec),&now_sec); - printf("[EMOS] %02d:%02d:%02d.%03d, frame %d, total bytes wrote %llu, bytes lost %u\n", - now_sec.tm_hour, now_sec.tm_min, now_sec.tm_sec, (int)(now.tv_usec/1000), frame, total_bytes,lost_bytes); - - for (card=0; cardrf.rf_mode[0] & LNAGAINMASK) >> 14)-1] - openair0_exmimo_pci[card].exmimo_config_ptr->rf.rx_gain[0][0], - rssi_avg_dB[card], openair0_exmimo_pci[card].exmimo_config_ptr->rf.rx_gain[0][0], (openair0_exmimo_pci[card].exmimo_config_ptr->rf.rf_mode[0] & LNAGAINMASK) >> 14); - - //printf("[EMOS] %02d:%02d:%02d, frame %d, GPS time %e, GPS mode %d, lat %e, lon %e, alt %e, speed %e\n", starttime.tm_hour, starttime.tm_min, starttime.tm_sec, counter/20, dummy_gps_data.time, dummy_gps_data.mode, dummy_gps_data.latitude, dummy_gps_data.longitude, dummy_gps_data.altitude, dummy_gps_data.speed); - } - } - - free(fifo2file_buffer); - fclose(dumpfile_id); - close(fifo); - - pthread_exit((void*) arg); - -} -#endif - -/* This is the main eNB thread. It gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */ -static void *eNB_thread(void *arg) -{ -#ifdef RTAI - RT_TASK *task; -#endif - unsigned char slot=0,last_slot, next_slot, hw_slot; - unsigned int msg1; - unsigned int aa,slot_offset, slot_offset_F; - int diff; - int delay_cnt; - RTIME time_in, time_diff; - int mbox_target=0,mbox_current=0; - int i,ret; - int tx_offset; - int bytes, bytes_tot=0, bytes_len; - long long int k1=1000; - long long int k2=1024-k1; - int ant,len,card = 0; - -#ifdef RTAI - task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF); - LOG_D(HW,"Started eNB thread (id %p)\n",task); -#endif - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - - timing_info.time_min = 100000000ULL; - timing_info.time_max = 0; - timing_info.time_avg = 0; - timing_info.n_samples = 0; - - while (!oai_exit) { - hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - //LOG_D(HW,"eNB frame %d, time %llu: slot %d, hw_slot %d (mbox %d)\n",frame,rt_get_time_ns(),slot,hw_slot,((unsigned int *)DAQ_MBOX)[0]); - //this is the mbox counter where we should be - //mbox_target = ((((slot+1)%20)*15+1)>>1)%150; - mbox_target = mbox_bounds[slot]; - //this is the mbox counter where we are - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD) - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff = 150-mbox_current+mbox_target; - else if ((mbox_current<15) && (mbox_target>=135)) - diff = -150+mbox_target-mbox_current; - else - diff = mbox_target - mbox_current; - - if (diff < (-7)) { - // at the eNB, even slots have double as much time since most of the processing is done here and almost nothing in odd slots - LOG_D(HW,"eNB Frame %d, time %llu: missed slot, proceeding with next one (slot %d, hw_slot %d, diff %d)\n",frame, rt_get_time_ns(), slot, hw_slot, diff); - slot++; - - //if (frame>0) - //oai_exit=1; - if (slot==20) { - slot=0; - frame++; - } - - continue; - } - - if (diff>8) - LOG_D(HW,"eNB Frame %d, time %llu: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, rt_get_time_ns(), slot, hw_slot, mbox_current, - mbox_target, diff); - - delay_cnt = 0; - - while ((diff>0) && (!oai_exit)) { - time_in = rt_get_time_ns(); - //LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d, (slot+1)*15=%d, diff %d, time %llu\n",frame,delay_cnt,hw_slot,((unsigned int *)DAQ_MBOX)[0],slot,(((slot+1)*15)>>1),diff,time_in); - //LOG_D(HW,"eNB Frame %d, time %llu: sleeping for %llu (slot %d, hw_slot %d, diff %d, mbox %d, delay_cnt %d)\n", frame, time_in, diff*DAQ_PERIOD,slot,hw_slot,diff,((volatile unsigned int *)DAQ_MBOX)[0],delay_cnt); - ret = rt_sleep_ns(diff*DAQ_PERIOD); - - if (ret) - LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in); - - hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - //LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns()); - delay_cnt++; - - if (delay_cnt == 10) { - oai_exit = 1; - LOG_D(HW,"eNB Frame %d: HW stopped ... \n",frame); - } - - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff = 150-mbox_current+mbox_target; - else if ((mbox_current<15) && (mbox_target>=135)) - diff = -150+mbox_target-mbox_current; - else - diff = mbox_target - mbox_current; - } - - last_slot = (slot)%LTE_SLOTS_PER_FRAME; - - if (last_slot <0) - last_slot+=20; - - next_slot = (slot+3)%LTE_SLOTS_PER_FRAME; - - if (frame>=AQU_LENGTH_FRAMES) { - timing_info.time_last = timing_info.time_now; - timing_info.time_now = rt_get_time_ns(); - - if (timing_info.n_samples>0) { - time_diff = timing_info.time_now - timing_info.time_last; - - if (time_diff < timing_info.time_min) - timing_info.time_min = time_diff; - - if (time_diff > timing_info.time_max) - timing_info.time_max = time_diff; - - timing_info.time_avg += time_diff; - } - - timing_info.n_samples++; - - // do measurements for rssi - if (last_slot==0) { - for (card=0; cardframing.resampling_factor[0]); - rssi_lin_max[card] = 0; - - for (ant=0; ant<4; ant++) { - if (carrier_freq[card][ant] != 0) { - rssi_lin[card][ant] = signal_energy(&(((int32_t*) openair0_exmimo_pci[card].adc_head[ant])[last_slot*len]), len); - rssi_lin_max[card] = max(rssi_lin_max[card],rssi_lin[card][ant]); - } - } - - rssi_lin_avg[card] = (int) ((k1*((long long int)(rssi_lin_avg[card])) + (k2*((long long int)(rssi_lin_max[card]))))>>10); - rssi_avg_dB[card] = dB_fixed(rssi_lin_avg[card]); - - if (frame%100==0) { - gain_control_all(rssi_avg_dB[card],card); - //printf("AGC for card %d: rx_power_fil_dB=%d, rx_gain=%d, LNA=%d (1=Byp,2=Med,3=Max)\n",card,rssi_avg_dB,openair0_exmimo_pci[card].exmimo_config_ptr->rf.rx_gain[0][0],(openair0_exmimo_pci[card].exmimo_config_ptr->rf.rf_mode[0]&LNAGAINMASK)>>14); - } - } - } - -#ifdef EMOS - - // save raw samples here - if ((last_slot==0) && ((frame%AQU_PERIOD_FRAMES)==0)) { - printf("[EMOS] Frame %d: start writing to FIFO\n",frame); - bytes_tot=0; - } - - if ((frame%AQU_PERIOD_FRAMES)framing.resampling_factor[ant]); - bytes_len = len*4; - bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &(((int32_t*) openair0_exmimo_pci[card].adc_head[ant])[last_slot*len]), bytes_len); - bytes_tot += bytes; - - if (bytes!=bytes_len) { - lost_bytes += bytes_len - bytes; - LOG_W(PHY,"Frame %d, slot %d: Problem writing EMOS data to FIFO (bytes=%d, size=%d)\n", - frame, last_slot, bytes, bytes_len); - } - } - } - } - - if ((last_slot==19) && ((frame%AQU_PERIOD_FRAMES)==99)) - printf("[EMOS] Frame %d: sent %d bytes to FIFO\n",frame,bytes_tot); - - } - -#endif - } - - slot++; - - if (slot==20) { - slot=0; - frame++; - } - -#if defined(ENABLE_ITTI) - itti_update_lte_time(frame, slot); -#endif - } - - LOG_D(HW,"eNB_thread: finished, ran %d times.\n",frame); - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - - // clean task -#ifdef RTAI - rt_task_delete(task); -#endif - LOG_D(HW,"Task deleted. returning\n"); - return 0; -} - - -int main(int argc, char **argv) -{ - -#ifdef RTAI - RT_TASK *task; -#endif - int i,j,aa; - void *status; - int card = 0; - - uint32_t rf_mode_base = TXLPFNORM + TXLPFEN + RXLPFNORM + RXLPFEN + LNA1ON +LNAMax + RFBBNORM; - uint32_t rf_local[4] = {8255000,8255000,8255000,8255000}; // UE zepto - //{8254617, 8254617, 8254617, 8254617}; //eNB khalifa - //{8255067,8254810,8257340,8257340}; // eNB PETRONAS - uint32_t rf_vcocal[4] = {910,910,910,910}; - uint32_t rf_vcocal_850[4] = {2015, 2015, 2015, 2015}; - uint32_t rf_rxdc[4] = {32896,32896,32896,32896}; - uint32_t rxgain[4] = {30,30,30,30}; - uint32_t txgain[4] = {0,0,0,0}; - - uint16_t Nid_cell = 0; - uint8_t cooperation_flag=0, transmission_mode=1, abstraction_flag=0; - uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; - - int c; - char do_forms=0; - unsigned int fd; - unsigned int tcxo = 114; - - int amp; - uint8_t prach_fmt; - int N_ZC; - - char rxg_fname[100]; - char txg_fname[100]; - char rflo_fname[100]; - char rfdc_fname[100]; - FILE *rxg_fd=NULL; - FILE *txg_fd=NULL; - FILE *rflo_fd=NULL; - FILE *rfdc_fd=NULL; - unsigned int rxg_max[4]= {133,133,133,133}, rxg_med[4]= {127,127,127,127}, rxg_byp[4]= {120,120,120,120}; - int tx_max_power=0; - - char line[1000]; - int l; - int ret, ant; - int ant_offset=0; - - int error_code; - char *itti_dump_file = NULL; - - const struct option long_options[] = { - {"calib-ue-rx", required_argument, NULL, 256}, - {"calib-ue-rx-med", required_argument, NULL, 257}, - {"calib-ue-rx-byp", required_argument, NULL, 258}, - {"debug-ue-prach", no_argument, NULL, 259}, - {"no-L2-connect", no_argument, NULL, 260}, - {NULL, 0, NULL, 0} - }; - - //mode = normal_txrx; - - - while ((c = getopt_long (argc, argv, "C:K:O:ST:UdF:V",long_options,NULL)) != -1) { - switch (c) { - case 'V': - ouput_vcd = 1; - break; - - case 'd': - do_forms=1; - break; - - case 'U': - UE_flag = 1; - break; - - case 'C': - for (card=0; cardlog_component[HW].level = LOG_DEBUG; - g_log->log_component[HW].flag = LOG_HIGH; -#ifdef OPENAIR2 - g_log->log_component[PHY].level = LOG_INFO; -#else - g_log->log_component[PHY].level = LOG_DEBUG; -#endif - g_log->log_component[PHY].flag = LOG_HIGH; - g_log->log_component[MAC].level = LOG_INFO; - g_log->log_component[MAC].flag = LOG_HIGH; - g_log->log_component[RLC].level = LOG_INFO; - g_log->log_component[RLC].flag = LOG_HIGH; - g_log->log_component[PDCP].level = LOG_INFO; - g_log->log_component[PDCP].flag = LOG_HIGH; - g_log->log_component[OTG].level = LOG_INFO; - g_log->log_component[OTG].flag = LOG_HIGH; - g_log->log_component[RRC].level = LOG_INFO; - g_log->log_component[RRC].flag = LOG_HIGH; - - - // Initialize card - ret = openair0_open(); - - if ( ret != 0 ) { - if (ret == -1) - printf("Error opening /dev/openair0"); - - if (ret == -2) - printf("Error mapping bigshm"); - - if (ret == -3) - printf("Error mapping RX or TX buffer"); - - return(ret); - } - - number_of_cards = openair0_num_detected_cards; - - for (card=0; cardboard_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev); - - if (p_exmimo_id->board_swrev>=BOARD_SWREV_CNTL2) - p_exmimo_config->framing.eNB_flag = 0; - else - p_exmimo_config->framing.eNB_flag = !UE_flag; - - if (card==0) - p_exmimo_config->framing.multicard_syncmode = SYNCMODE_MASTER; - else - p_exmimo_config->framing.multicard_syncmode = SYNCMODE_SLAVE; - - //p_exmimo_config->framing.multicard_syncmode = SYNCMODE_FREE; - - - p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_TESTRX; //TXRXSWITCH_LSB; - - /* - for (ant=0;antnb_antennas_tx,frame_parms->nb_antennas_rx);ant++) - p_exmimo_config->rf.rf_mode[ant] = rf_mode_base; - for (ant=0;antnb_antennas_tx;ant++) - p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX); - for (ant=0;antnb_antennas_rx;ant++) - p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX); - for (ant=max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant<4;ant++) { - p_exmimo_config->rf.rf_mode[ant] = 0; - carrier_freq[ant] = 0; //this turns off all other LIMEs - } - */ - - for (ant=0; ant<4; ant++) { - if (carrier_freq[card][ant] != 0) { - p_exmimo_config->rf.rf_mode[ant] = rf_mode_base; - - switch (bandwidth[card]) { - case BW20: - p_exmimo_config->framing.resampling_factor[ant] = 0; - p_exmimo_config->rf.rf_mode[ant] += RXLPF10 + TXLPF10; - break; - - case BW10: - p_exmimo_config->framing.resampling_factor[ant] = 1; - p_exmimo_config->rf.rf_mode[ant] += RXLPF5 + TXLPF5; - break; - - case BW5: - p_exmimo_config->framing.resampling_factor[ant] = 2; - p_exmimo_config->rf.rf_mode[ant] += RXLPF25 + TXLPF25; - break; - } - - //p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX); - p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX); - } else { - p_exmimo_config->rf.rf_mode[ant] = 0; - } - } - - for (ant = 0; ant<4; ant++) { - p_exmimo_config->rf.do_autocal[ant] = 1; - p_exmimo_config->rf.rf_freq_rx[ant] = carrier_freq[card][ant]; - p_exmimo_config->rf.rf_freq_tx[ant] = carrier_freq[card][ant]; - p_exmimo_config->rf.rx_gain[ant][0] = rxgain[ant]; - p_exmimo_config->rf.tx_gain[ant][0] = txgain[ant]; - - p_exmimo_config->rf.rf_local[ant] = rf_local[ant]; - p_exmimo_config->rf.rf_rxdc[ant] = rf_rxdc[ant]; - - if ((carrier_freq[card][ant] >= 850000000) && (carrier_freq[card][ant] <= 865000000)) { - p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal_850[ant]; - p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD; - } else if ((carrier_freq[card][ant] >= 1900000000) && (carrier_freq[card][ant] <= 2000000000)) { - p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal[ant]; - p_exmimo_config->rf.rffe_band_mode[ant] = B19G_TDD; - } else { - p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal[ant]; - p_exmimo_config->rf.rffe_band_mode[ant] = 0; - } - - p_exmimo_config->rf.rffe_gain_txlow[ant] = 31; - p_exmimo_config->rf.rffe_gain_txhigh[ant] = 31; - p_exmimo_config->rf.rffe_gain_rxfinal[ant] = 52; - p_exmimo_config->rf.rffe_gain_rxlow[ant] = 31; - } - - - openair0_dump_config(card); - - printf("EXMIMO_CONFIG card %d: freq0..3 %u %u %u %u Hz, freqtx0..1 %u %u Hz, RX gain0..1 %d %d dB\n", - card, - p_exmimo_config->rf.rf_freq_rx[0], - p_exmimo_config->rf.rf_freq_rx[1], - p_exmimo_config->rf.rf_freq_rx[2], - p_exmimo_config->rf.rf_freq_rx[3], - p_exmimo_config->rf.rf_freq_tx[0], - p_exmimo_config->rf.rf_freq_tx[1], - p_exmimo_config->rf.rx_gain[0][0], - p_exmimo_config->rf.rx_gain[1][0]); - printf("EXMIMO_CONFIG card %d: rf_mode 0x %x %x %x %x, [0]: TXRXEn %d, TXLPFEn %d, TXLPF %d, RXLPFEn %d, RXLPF %d, RFBB %d, LNA %d, LNAGain %d, RXLPFMode %d, SWITCH %d, rf_rxdc %d, rf_local %d, rf_vcocal %d\n", - card, - p_exmimo_config->rf.rf_mode[0], - p_exmimo_config->rf.rf_mode[1], - p_exmimo_config->rf.rf_mode[2], - p_exmimo_config->rf.rf_mode[3], - (p_exmimo_config->rf.rf_mode[0]&3), // RXen+TXen - (p_exmimo_config->rf.rf_mode[0]&4)>>2, //TXLPFen - (p_exmimo_config->rf.rf_mode[0]&TXLPFMASK)>>3, //TXLPF - (p_exmimo_config->rf.rf_mode[0]&128)>>7, //RXLPFen - (p_exmimo_config->rf.rf_mode[0]&RXLPFMASK)>>8, //TXLPF - (p_exmimo_config->rf.rf_mode[0]&RFBBMASK)>>16, // RFBB mode - (p_exmimo_config->rf.rf_mode[0]&LNAMASK)>>12, // RFBB mode - (p_exmimo_config->rf.rf_mode[0]&LNAGAINMASK)>>14, // RFBB mode - (p_exmimo_config->rf.rf_mode[0]&RXLPFMODEMASK)>>19, // RXLPF mode - (p_exmimo_config->framing.tdd_config&TXRXSWITCH_MASK)>>1, // Switch mode - p_exmimo_config->rf.rf_rxdc[0], - p_exmimo_config->rf.rf_local[0], - p_exmimo_config->rf.rf_vcocal[0]); - - for (ant=0; ant<4; ant++) - p_exmimo_config->rf.do_autocal[ant] = 0; - } //card - - card=0; - -#ifdef EMOS - error_code = rtf_create(CHANSOUNDER_FIFO_MINOR,CHANSOUNDER_FIFO_SIZE); - - if (error_code==0) - printf("[OPENAIR][SCHED][INIT] Created EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR); - else if (error_code==ENODEV) - printf("[OPENAIR][SCHED][INIT] Problem: EMOS FIFO %d is greater than or equal to RTF_NO\n",CHANSOUNDER_FIFO_MINOR); - else if (error_code==ENOMEM) - printf("[OPENAIR][SCHED][INIT] Problem: cannot allocate memory for EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR); - else - printf("[OPENAIR][SCHED][INIT] Problem creating EMOS FIFO %d, error_code %d\n",CHANSOUNDER_FIFO_MINOR,error_code); - -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - -#ifdef RTAI - // make main thread LXRT soft realtime - task = rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF); - - // start realtime timer and scheduler - //rt_set_oneshot_mode(); - rt_set_periodic_mode(); - start_rt_timer(0); - - //now = rt_get_time() + 10*PERIOD; - //rt_task_make_periodic(task, now, PERIOD); - - printf("Init mutex\n"); - //mutex = rt_get_adr(nam2num("MUTEX")); - mutex = rt_sem_init(nam2num("MUTEX"), 1); - - if (mutex==0) { - printf("Error init mutex\n"); - exit(-1); - } else - printf("mutex=%p\n",mutex); - -#endif - - DAQ_MBOX = (volatile unsigned int *) openair0_exmimo_pci[0].rxcnt_ptr[0]; - - // this starts the DMA transfers - if (UE_flag!=1) - for (card=0; cardlte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - } else { - for(UE_id=0;UE_idlte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - } - } - fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats"); - if (UE_flag==0) { - for (UE_id=0;UE_idbutton_0,1); - fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic ON"); - } - else { - fl_set_button(form_enb[UE_id]->button_0,0); - fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic OFF"); - } - } - } - else { - if (openair_daq_vars.use_ia_receiver) { - fl_set_button(form_ue[UE_id]->button_0,1); - fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON"); - } - else { - fl_set_button(form_ue[UE_id]->button_0,0); - fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF"); - } - } - */ - form_lte = create_form_lte_scope(); - fl_show_form (form_lte->lte_scope, FL_PLACE_HOTSPOT, FL_FULLBORDER, "Scope"); - - ret = pthread_create(&thread2, NULL, scope_thread, NULL); - printf("Scope thread created, ret=%d\n",ret); - } - -#endif - -#ifdef EMOS - ret = pthread_create(&thread3, NULL, emos_thread, NULL); - printf("EMOS thread created, ret=%d\n",ret); - ret = pthread_create(&thread4, NULL, gps_thread, NULL); - printf("GPS thread created, ret=%d\n",ret); - ret = pthread_create(&thread5, NULL, log_thread, NULL); - printf("LOG thread created, ret=%d\n",ret); -#endif - - rt_sleep_ns(10*FRAME_PERIOD); - -#ifndef RTAI - pthread_attr_init (&attr_dlsch_threads); - pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE); - //attr_dlsch_threads.priority = 1; - sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_dlsch_threads, &sched_param_dlsch); - pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO); -#endif - - // start the main thread - if (UE_flag == 1) { - /* - #ifdef RTAI - thread1 = rt_thread_create(UE_thread, NULL, 100000000); - #else - error_code = pthread_create(&thread1, &attr_dlsch_threads, UE_thread, NULL); - if (error_code!= 0) { - LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code); - return(error_code); - } - else { - LOG_D(HW,"[lte-softmodem.c] Allocate UE_thread successful\n"); - } - #endif - #ifdef DLSCH_THREAD - init_rx_pdsch_thread(); - rt_sleep_ns(FRAME_PERIOD/10); - init_dlsch_threads(); - #endif - printf("UE threads created\n"); - */ - } else { -#ifdef RTAI - thread0 = rt_thread_create(eNB_thread, NULL, 100000000); -#else - error_code = pthread_create(&thread0, &attr_dlsch_threads, eNB_thread, NULL); - - if (error_code!= 0) { - LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code); - return(error_code); - } else { - LOG_D(HW,"[lte-softmodem.c] Allocate eNB_thread successful\n"); - } - -#endif -#ifdef ULSCH_THREAD - init_ulsch_threads(); -#endif - printf("eNB threads created\n"); - } - - - // wait for end of program - printf("TYPE TO TERMINATE\n"); - - //getchar(); - while (oai_exit==0) - rt_sleep_ns(FRAME_PERIOD); - - // stop threads -#ifdef XFORMS - printf("waiting for XFORMS thread\n"); - - if (do_forms==1) { - pthread_join(thread2,&status); - /* - fl_hide_form(form_stats->stats_form); - fl_free_form(form_stats->stats_form); - if (UE_flag==1) { - fl_hide_form(form_ue[UE_id]->lte_phy_scope_ue); - fl_free_form(form_ue[UE_id]->lte_phy_scope_ue); - } else { - for(UE_id=0;UE_idlte_phy_scope_enb); - fl_free_form(form_enb[UE_id]->lte_phy_scope_enb); - } - } - */ - fl_hide_form(form_lte->lte_scope); - fl_free_form(form_lte->lte_scope); - } - -#endif - - printf("stopping MODEM threads\n"); - - // cleanup - if (UE_flag == 1) { - /* - #ifdef RTAI - rt_thread_join(thread1); - #else - pthread_join(thread1,&status); - #endif - #ifdef DLSCH_THREAD - cleanup_dlsch_threads(); - cleanup_rx_pdsch_thread(); - #endif - */ - } else { -#ifdef RTAI - rt_thread_join(thread0); -#else - pthread_join(thread0,&status); -#endif -#ifdef ULSCH_THREAD - cleanup_ulsch_threads(); -#endif - } - -#ifdef OPENAIR2 - //cleanup_pdcp_thread(); -#endif - -#ifdef RTAI - stop_rt_timer(); -#endif - - printf("stopping card\n"); - - for (card=0; card0) - error_code = rtf_destroy(CHANSOUNDER_FIFO_MINOR); - - printf("[OPENAIR][SCHED][CLEANUP] EMOS FIFO closed, error_code %d\n", error_code); -#endif - - if (ouput_vcd) - VCD_SIGNAL_DUMPER_CLOSE(); - - logClean(); - - return 0; -} - -void test_config(int card, int ant, unsigned int rf_mode, int UE_flag) -{ - p_exmimo_config->framing.eNB_flag = !UE_flag; - p_exmimo_config->framing.tdd_config = 0; - p_exmimo_config->framing.resampling_factor[ant] = 2; - - p_exmimo_config->rf.rf_freq_rx[ant] = 1907600000; - p_exmimo_config->rf.rf_freq_tx[ant] = 1907600000;; - p_exmimo_config->rf.rx_gain[ant][0] = 20; - p_exmimo_config->rf.tx_gain[ant][0] = 10; - p_exmimo_config->rf.rf_mode[ant] = rf_mode; - - p_exmimo_config->rf.rf_local[ant] = build_rflocal(20,25,26,04); - p_exmimo_config->rf.rf_rxdc[ant] = build_rfdc(128, 128); - p_exmimo_config->rf.rf_vcocal[ant] = (0xE<<6) + 0xE; -} - -/* -void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier) { - - int i; - if (phy_vars_ue) { - - if ((frame_parms->nb_antennas_rx>1) && (carrier>0)) { - printf("RX antennas > 1 and carrier > 0 not possible\n"); - exit(-1); - } - - if ((frame_parms->nb_antennas_tx>1) && (carrier>0)) { - printf("TX antennas > 1 and carrier > 0 not possible\n"); - exit(-1); - } - - // replace RX signal buffers with mmaped HW versions - for (i=0;inb_antennas_rx;i++) { - free(phy_vars_ue->lte_ue_common_vars.rxdata[i]); - phy_vars_ue->lte_ue_common_vars.rxdata[i] = (int32_t*) openair0_exmimo_pci[card].adc_head[i+carrier]; - - - printf("rxdata[%d] @ %p\n",i,phy_vars_ue->lte_ue_common_vars.rxdata[i]); - } - for (i=0;inb_antennas_tx;i++) { - free(phy_vars_ue->lte_ue_common_vars.txdata[i]); - phy_vars_ue->lte_ue_common_vars.txdata[i] = (int32_t*) openair0_exmimo_pci[card].dac_head[i+carrier]; - - printf("txdata[%d] @ %p\n",i,phy_vars_ue->lte_ue_common_vars.txdata[i]); - } - } -} - -void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier) { - - int i,j; - - if (phy_vars_eNB) { - if ((frame_parms->nb_antennas_rx>1) && (carrier>0)) { - printf("RX antennas > 1 and carrier > 0 not possible\n"); - exit(-1); - } - - if ((frame_parms->nb_antennas_tx>1) && (carrier>0)) { - printf("TX antennas > 1 and carrier > 0 not possible\n"); - exit(-1); - } - - // replace RX signal buffers with mmaped HW versions - for (i=0;inb_antennas_rx;i++) { - free(phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]); - phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[card].adc_head[i+carrier]; - - printf("rxdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]); - for (j=0;j<16;j++) { - printf("rxbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j]); - phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j] = 16-j; - } - } - for (i=0;inb_antennas_tx;i++) { - free(phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]); - phy_vars_eNB->lte_eNB_common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[card].dac_head[i+carrier]; - - printf("txdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]); - for (j=0;j<16;j++) { - printf("txbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j]); - phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j] = 16-j; - } - } - } -} -*/ diff --git a/targets/RT/USER/init_rtai.sh b/targets/RT/USER/init_rtai.sh deleted file mode 100755 index 69b127de33..0000000000 --- a/targets/RT/USER/init_rtai.sh +++ /dev/null @@ -1,5 +0,0 @@ -sudo insmod /usr/realtime/modules/rtai_hal.ko -sudo insmod /usr/realtime/modules/rtai_sched.ko -sudo insmod /usr/realtime/modules/rtai_sem.ko -sudo insmod /usr/realtime/modules/rtai_fifos.ko -sudo insmod /usr/realtime/modules/rtai_mbx.ko diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c new file mode 100644 index 0000000000..79973d3814 --- /dev/null +++ b/targets/RT/USER/lte-enb.c @@ -0,0 +1,1115 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file lte-enb.c + * \brief Top-level threads for eNodeB + * \author R. Knopp, F. Kaltenberger, Navid Nikaein + * \date 2012 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr + * \note + * \warning + */ + +#define _GNU_SOURCE +#include + +#include "time_utils.h" + +#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all + +#include "rt_wrapper.h" + +#include "assertions.h" + + +#include "PHY/types.h" + +#include "PHY/defs.h" +#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all +//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all + +#include "../../ARCH/COMMON/common_lib.h" + +//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all + +#include "PHY/LTE_TRANSPORT/if4_tools.h" +#include "PHY/LTE_TRANSPORT/if5_tools.h" + +#include "PHY/extern.h" +#include "SCHED/extern.h" +#include "LAYER2/MAC/extern.h" + +#include "../../SIMU/USER/init_lte.h" + +#include "LAYER2/MAC/defs.h" +#include "LAYER2/MAC/extern.h" +#include "LAYER2/MAC/proto.h" +#include "RRC/LITE/extern.h" +#include "PHY_INTERFACE/extern.h" +#include "PHY_INTERFACE/defs.h" +#ifdef SMBV +#include "PHY/TOOLS/smbv.h" +unsigned short config_frames[4] = {2,9,11,13}; +#endif +#include "UTIL/LOG/log_extern.h" +#include "UTIL/OTG/otg_tx.h" +#include "UTIL/OTG/otg_externs.h" +#include "UTIL/MATH/oml.h" +#include "UTIL/LOG/vcd_signal_dumper.h" +#include "UTIL/OPT/opt.h" +#include "enb_config.h" +//#include "PHY/TOOLS/time_meas.h" + +#ifndef OPENAIR2 +#include "UTIL/OTG/otg_extern.h" +#endif + +#if defined(ENABLE_ITTI) +# if defined(ENABLE_USE_MME) +# include "s1ap_eNB.h" +#ifdef PDCP_USE_NETLINK +# include "SIMULATION/ETH_TRANSPORT/proto.h" +#endif +# endif +#endif + +#include "T.h" + +//#define DEBUG_THREADS 1 + +//#define USRP_DEBUG 1 +struct timing_info_t { + //unsigned int frame, hw_slot, last_slot, next_slot; + RTIME time_min, time_max, time_avg, time_last, time_now; + //unsigned int mbox0, mbox1, mbox2, mbox_target; + unsigned int n_samples; +} timing_info; + +// Fix per CC openair rf/if device update +// extern openair0_device openair0; + + +#if defined(ENABLE_ITTI) +extern volatile int start_eNB; +extern volatile int start_UE; +#endif +extern volatile int oai_exit; + +extern openair0_config_t openair0_cfg[MAX_CARDS]; + +extern int transmission_mode; + +extern int oaisim_flag; + +uint16_t sf_ahead=4; + +//pthread_t main_eNB_thread; + +time_stats_t softmodem_stats_mt; // main thread +time_stats_t softmodem_stats_hw; // hw acquisition +time_stats_t softmodem_stats_rxtx_sf; // total tx time +time_stats_t nfapi_meas; // total tx time +time_stats_t softmodem_stats_rx_sf; // total rx time + +/* mutex, cond and variable to serialize phy proc TX calls + * (this mechanism may be relaxed in the future for better + * performances) + */ +static struct { + pthread_mutex_t mutex_phy_proc_tx; + pthread_cond_t cond_phy_proc_tx; + volatile uint8_t phy_proc_CC_id; +} sync_phy_proc; + +extern double cpuf; + +void exit_fun(const char* s); + +void init_eNB(int,int); +void stop_eNB(int nb_inst); + + +void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe); +#ifdef Rel14 +void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe); +#endif + +extern uint8_t nfapi_mode; +extern void oai_subframe_ind(uint16_t sfn, uint16_t sf); +extern void add_subframe(uint16_t *frameP, uint16_t *subframeP, int offset); + +//#define TICK_TO_US(ts) (ts.diff) +#define TICK_TO_US(ts) (ts.trials==0?0:ts.diff/ts.trials) + + +static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_name) { + + static double cpu_freq_GHz = 0.0; + + if (cpu_freq_GHz == 0.0) + cpu_freq_GHz = get_cpu_freq_GHz(); + + + start_meas(&softmodem_stats_rxtx_sf); + + // ******************************************************************* + + if (nfapi_mode == 1) { + + // I am a PNF and I need to let nFAPI know that we have a (sub)frame tick + uint16_t frame = proc->frame_rx; + uint16_t subframe = proc->subframe_rx; + + //add_subframe(&frame, &subframe, 4); + + //oai_subframe_ind(proc->frame_tx, proc->subframe_tx); + //LOG_D(PHY, "oai_subframe_ind(frame:%u, subframe:%d) - NOT CALLED ********\n", frame, subframe); + start_meas(&nfapi_meas); + oai_subframe_ind(frame, subframe); + stop_meas(&nfapi_meas); + + if (eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus|| + eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs || + eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs || + eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles || + eNB->UL_INFO.cqi_ind.number_of_cqis + ) { + LOG_D(PHY, "UL_info[rx_ind:%05d:%d harqs:%05d:%d crcs:%05d:%d preambles:%05d:%d cqis:%d] RX:%04d%d TX:%04d%d num_pdcch_symbols:%d\n", + NFAPI_SFNSF2DEC(eNB->UL_INFO.rx_ind.sfn_sf), eNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus, + NFAPI_SFNSF2DEC(eNB->UL_INFO.harq_ind.sfn_sf), eNB->UL_INFO.harq_ind.harq_indication_body.number_of_harqs, + NFAPI_SFNSF2DEC(eNB->UL_INFO.crc_ind.sfn_sf), eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs, + NFAPI_SFNSF2DEC(eNB->UL_INFO.rach_ind.sfn_sf), eNB->UL_INFO.rach_ind.rach_indication_body.number_of_preambles, + eNB->UL_INFO.cqi_ind.number_of_cqis, + proc->frame_rx, proc->subframe_rx, + proc->frame_tx, proc->subframe_tx, eNB->pdcch_vars[proc->subframe_tx&1].num_pdcch_symbols); + } + } + + if (nfapi_mode == 1 && eNB->pdcch_vars[proc->subframe_tx&1].num_pdcch_symbols == 0) { + LOG_E(PHY, "eNB->pdcch_vars[proc->subframe_tx&1].num_pdcch_symbols == 0"); + return 0; + } + + // **************************************** + // Common RX procedures subframe n + + T(T_ENB_PHY_DL_TICK, T_INT(eNB->Mod_id), T_INT(proc->frame_tx), T_INT(proc->subframe_tx)); + + // if this is IF5 or 3GPP_eNB + if (eNB && eNB->RU_list && eNB->RU_list[0] && eNB->RU_list[0]->function < NGFI_RAU_IF4p5) { + wakeup_prach_eNB(eNB,NULL,proc->frame_rx,proc->subframe_rx); +#ifdef Rel14 + wakeup_prach_eNB_br(eNB,NULL,proc->frame_rx,proc->subframe_rx); +#endif + } + + // UE-specific RX processing for subframe n + if (nfapi_mode == 0 || nfapi_mode == 1) { + phy_procedures_eNB_uespec_RX(eNB, proc, no_relay ); + } + + pthread_mutex_lock(&eNB->UL_INFO_mutex); + + eNB->UL_INFO.frame = proc->frame_rx; + eNB->UL_INFO.subframe = proc->subframe_rx; + eNB->UL_INFO.module_id = eNB->Mod_id; + eNB->UL_INFO.CC_id = eNB->CC_id; + + eNB->if_inst->UL_indication(&eNB->UL_INFO); + + pthread_mutex_unlock(&eNB->UL_INFO_mutex); + + // ***************************************** + // TX processing for subframe n+sf_ahead + // run PHY TX procedures the one after the other for all CCs to avoid race conditions + // (may be relaxed in the future for performance reasons) + // ***************************************** + //if (wait_CCs(proc)<0) return(-1); + + if (oai_exit) return(-1); + + phy_procedures_eNB_TX(eNB, proc, no_relay, NULL, 1); + + stop_meas( &softmodem_stats_rxtx_sf ); + + LOG_D(PHY,"%s() Exit proc[rx:%d%d tx:%d%d]\n", __FUNCTION__, proc->frame_rx, proc->subframe_rx, proc->frame_tx, proc->subframe_tx); + +#if 0 + LOG_D(PHY, "rxtx:%lld nfapi:%lld phy:%lld tx:%lld rx:%lld prach:%lld ofdm:%lld ", + softmodem_stats_rxtx_sf.diff_now, nfapi_meas.diff_now, + TICK_TO_US(eNB->phy_proc), + TICK_TO_US(eNB->phy_proc_tx), + TICK_TO_US(eNB->phy_proc_rx), + TICK_TO_US(eNB->rx_prach), + TICK_TO_US(eNB->ofdm_mod_stats), + softmodem_stats_rxtx_sf.diff_now, nfapi_meas.diff_now); + LOG_D(PHY, + "dlsch[enc:%lld mod:%lld scr:%lld rm:%lld t:%lld i:%lld] rx_dft:%lld ", + TICK_TO_US(eNB->dlsch_encoding_stats), + TICK_TO_US(eNB->dlsch_modulation_stats), + TICK_TO_US(eNB->dlsch_scrambling_stats), + TICK_TO_US(eNB->dlsch_rate_matching_stats), + TICK_TO_US(eNB->dlsch_turbo_encoding_stats), + TICK_TO_US(eNB->dlsch_interleaving_stats), + TICK_TO_US(eNB->rx_dft_stats)); + + LOG_D(PHY," ulsch[ch:%lld freq:%lld dec:%lld demod:%lld ru:%lld ", + TICK_TO_US(eNB->ulsch_channel_estimation_stats), + TICK_TO_US(eNB->ulsch_freq_offset_estimation_stats), + TICK_TO_US(eNB->ulsch_decoding_stats), + TICK_TO_US(eNB->ulsch_demodulation_stats), + TICK_TO_US(eNB->ulsch_rate_unmatching_stats)); + + LOG_D(PHY, "td:%lld dei:%lld dem:%lld llr:%lld tci:%lld ", + TICK_TO_US(eNB->ulsch_turbo_decoding_stats), + TICK_TO_US(eNB->ulsch_deinterleaving_stats), + TICK_TO_US(eNB->ulsch_demultiplexing_stats), + TICK_TO_US(eNB->ulsch_llr_stats), + TICK_TO_US(eNB->ulsch_tc_init_stats)); + LOG_D(PHY, "tca:%lld tcb:%lld tcg:%lld tce:%lld l1:%lld l2:%lld]\n\n", + TICK_TO_US(eNB->ulsch_tc_alpha_stats), + TICK_TO_US(eNB->ulsch_tc_beta_stats), + TICK_TO_US(eNB->ulsch_tc_gamma_stats), + TICK_TO_US(eNB->ulsch_tc_ext_stats), + TICK_TO_US(eNB->ulsch_tc_intl1_stats), + TICK_TO_US(eNB->ulsch_tc_intl2_stats) + ); +#endif + + return(0); +} + + +/*! + * \brief The RX UE-specific and TX thread of eNB. + * \param param is a \ref eNB_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ + +static void* eNB_thread_rxtx( void* param ) { + + static int eNB_thread_rxtx_status; + + eNB_rxtx_proc_t *proc = (eNB_rxtx_proc_t*)param; + PHY_VARS_eNB *eNB = RC.eNB[0][proc->CC_id]; + + char thread_name[100]; + + + // set default return value + eNB_thread_rxtx_status = 0; + + + sprintf(thread_name,"RXn_TXnp4_%d",&eNB->proc.proc_rxtx[0] == proc ? 0 : 1); + thread_top_init(thread_name,1,850000L,1000000L,2000000L); + + while (!oai_exit) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); + + if (wait_on_condition(&proc->mutex_rxtx,&proc->cond_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 1 ); + + if (oai_exit) break; + + if (eNB->CC_id==0) + { + if (rxtx(eNB,proc,thread_name) < 0) break; + + } + + if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break; + + } // while !oai_exit + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); + + printf( "Exiting eNB thread RXn_TXnp4\n"); + + eNB_thread_rxtx_status = 0; + return &eNB_thread_rxtx_status; +} + + +#if 0 //defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) +// Wait for eNB application initialization to be complete (eNB registration to MME) +static void wait_system_ready (char *message, volatile int *start_flag) { + + static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....", + " ....", " ...", " ..", " .", " "}; + int i = 0; + + while ((!oai_exit) && (*start_flag == 0)) { + LOG_N(EMU, message, indicator[i]); + fflush(stdout); + i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0])); + usleep(200000); + } + + LOG_D(EMU,"\n"); +} +#endif + + + + + +void eNB_top(PHY_VARS_eNB *eNB, int frame_rx, int subframe_rx, char *string) +{ + eNB_proc_t *proc = &eNB->proc; + eNB_rxtx_proc_t *proc_rxtx = &proc->proc_rxtx[0]; + + proc->frame_rx = frame_rx; + proc->subframe_rx = subframe_rx; + + if (!oai_exit) { + T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx)); + + proc_rxtx->subframe_rx = proc->subframe_rx; + proc_rxtx->frame_rx = proc->frame_rx; + proc_rxtx->subframe_tx = (proc->subframe_rx+sf_ahead)%10; + proc_rxtx->frame_tx = (proc->subframe_rx>(9-sf_ahead)) ? (1+proc->frame_rx)&1023 : proc->frame_rx; + proc->frame_tx = proc_rxtx->frame_tx; + proc_rxtx->timestamp_tx = proc->timestamp_tx; + + if (rxtx(eNB,proc_rxtx,string) < 0) LOG_E(PHY,"eNB %d CC_id %d failed during execution\n",eNB->Mod_id,eNB->CC_id); + } +} + + +int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) { + + eNB_proc_t *proc=&eNB->proc; + + eNB_rxtx_proc_t *proc_rxtx=&proc->proc_rxtx[proc->frame_rx&1]; + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + + int i; + struct timespec wait; + + pthread_mutex_lock(&proc->mutex_RU); + for (i=0;inum_RU;i++) { + if (ru == eNB->RU_list[i]) { + if ((proc->RU_mask&(1< 0) + LOG_E(PHY,"eNB %d frame %d, subframe %d : previous information from RU %d (num_RU %d,mask %x) has not been served yet!\n", + eNB->Mod_id,proc->frame_rx,proc->subframe_rx,ru->idx,eNB->num_RU,proc->RU_mask); + proc->RU_mask |= (1<RU_mask != (1<num_RU)-1) { // not all RUs have provided their information so return + LOG_E(PHY,"Not all RUs have provided their info\n"); + pthread_mutex_unlock(&proc->mutex_RU); + return(0); + } + else { // all RUs have provided their information so continue on and wakeup eNB processing + proc->RU_mask = 0; + pthread_mutex_unlock(&proc->mutex_RU); + } + + + + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + /* accept some delay in processing - up to 5ms */ + for (i = 0; i < 10 && proc_rxtx->instance_cnt_rxtx == 0; i++) { + LOG_W( PHY,"[eNB] Frame %d Subframe %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", proc_rxtx->frame_tx, proc_rxtx->subframe_tx, proc_rxtx->instance_cnt_rxtx); + usleep(500); + } + if (proc_rxtx->instance_cnt_rxtx == 0) { + exit_fun( "TX thread busy" ); + return(-1); + } + + // wake up TX for subframe n+sf_ahead + // lock the TX mutex and make sure the thread is ready + if (pthread_mutex_timedlock(&proc_rxtx->mutex_rxtx,&wait) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", proc_rxtx->subframe_rx&1,proc_rxtx->instance_cnt_rxtx ); + exit_fun( "error locking mutex_rxtx" ); + return(-1); + } + + ++proc_rxtx->instance_cnt_rxtx; + + // We have just received and processed the common part of a subframe, say n. + // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired + // transmitted timestamp of the next TX slot (first). + // The last (TS_rx mod samples_per_frame) was n*samples_per_tti, + // we want to generate subframe (n+sf_ahead), so TS_tx = TX_rx+sf_ahead*samples_per_tti, + // and proc->subframe_tx = proc->subframe_rx+sf_ahead + proc_rxtx->timestamp_tx = proc->timestamp_rx + (sf_ahead*fp->samples_per_tti); + proc_rxtx->frame_rx = proc->frame_rx; + proc_rxtx->subframe_rx = proc->subframe_rx; + proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > (9-sf_ahead)) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx; + proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + sf_ahead)%10; + + // the thread can now be woken up + if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return(-1); + } + + pthread_mutex_unlock( &proc_rxtx->mutex_rxtx ); + + return(0); +} + +void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe) { + + eNB_proc_t *proc = &eNB->proc; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + int i; + + if (ru!=NULL) { + pthread_mutex_lock(&proc->mutex_RU_PRACH); + for (i=0;inum_RU;i++) { + if (ru == eNB->RU_list[i]) { + LOG_D(PHY,"frame %d, subframe %d: RU %d for eNB %d signals PRACH (mask %x, num_RU %d)\n",frame,subframe,i,eNB->Mod_id,proc->RU_mask_prach,eNB->num_RU); + if ((proc->RU_mask_prach&(1< 0) + LOG_E(PHY,"eNB %d frame %d, subframe %d : previous information (PRACH) from RU %d (num_RU %d, mask %x) has not been served yet!\n", + eNB->Mod_id,frame,subframe,ru->idx,eNB->num_RU,proc->RU_mask_prach); + proc->RU_mask_prach |= (1<RU_mask_prach != (1<num_RU)-1) { // not all RUs have provided their information so return + pthread_mutex_unlock(&proc->mutex_RU_PRACH); + return; + } + else { // all RUs have provided their information so continue on and wakeup eNB processing + proc->RU_mask_prach = 0; + pthread_mutex_unlock(&proc->mutex_RU_PRACH); + } + } + + // check if we have to detect PRACH first + if (is_prach_subframe(fp,frame,subframe)>0) { + LOG_D(PHY,"Triggering prach processing, frame %d, subframe %d\n",frame,subframe); + if (proc->instance_cnt_prach == 0) { + LOG_W(PHY,"[eNB] Frame %d Subframe %d, dropping PRACH\n", frame,subframe); + return; + } + + // wake up thread for PRACH RX + if (pthread_mutex_lock(&proc->mutex_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->thread_index, proc->instance_cnt_prach); + exit_fun( "error locking mutex_prach" ); + return; + } + + ++proc->instance_cnt_prach; + // set timing for prach thread + proc->frame_prach = frame; + proc->subframe_prach = subframe; + + // the thread can now be woken up + if (pthread_cond_signal(&proc->cond_prach) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH thread %d\n", proc->thread_index); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + + pthread_mutex_unlock( &proc->mutex_prach ); + } + +} + +#ifdef Rel14 +void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe) { + + eNB_proc_t *proc = &eNB->proc; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + int i; + + if (ru!=NULL) { + pthread_mutex_lock(&proc->mutex_RU_PRACH_br); + for (i=0;inum_RU;i++) { + if (ru == eNB->RU_list[i]) { + LOG_D(PHY,"frame %d, subframe %d: RU %d for eNB %d signals PRACH BR (mask %x, num_RU %d)\n",frame,subframe,i,eNB->Mod_id,proc->RU_mask_prach_br,eNB->num_RU); + if ((proc->RU_mask_prach_br&(1< 0) + LOG_E(PHY,"eNB %d frame %d, subframe %d : previous information (PRACH BR) from RU %d (num_RU %d, mask %x) has not been served yet!\n", + eNB->Mod_id,frame,subframe,ru->idx,eNB->num_RU,proc->RU_mask_prach_br); + proc->RU_mask_prach_br |= (1<RU_mask_prach_br != (1<num_RU)-1) { // not all RUs have provided their information so return + pthread_mutex_unlock(&proc->mutex_RU_PRACH_br); + return; + } + else { // all RUs have provided their information so continue on and wakeup eNB processing + proc->RU_mask_prach_br = 0; + pthread_mutex_unlock(&proc->mutex_RU_PRACH_br); + } + } + + // check if we have to detect PRACH first + if (is_prach_subframe(fp,frame,subframe)>0) { + LOG_D(PHY,"Triggering prach br processing, frame %d, subframe %d\n",frame,subframe); + if (proc->instance_cnt_prach_br == 0) { + LOG_W(PHY,"[eNB] Frame %d Subframe %d, dropping PRACH BR\n", frame,subframe); + return; + } + + // wake up thread for PRACH RX + if (pthread_mutex_lock(&proc->mutex_prach_br) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->thread_index, proc->instance_cnt_prach_br); + exit_fun( "error locking mutex_prach" ); + return; + } + + ++proc->instance_cnt_prach_br; + // set timing for prach thread + proc->frame_prach_br = frame; + proc->subframe_prach_br = subframe; + + // the thread can now be woken up + if (pthread_cond_signal(&proc->cond_prach_br) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB PRACH BR thread %d\n", proc->thread_index); + exit_fun( "ERROR pthread_cond_signal" ); + return; + } + + pthread_mutex_unlock( &proc->mutex_prach_br ); + } + +} +#endif + +/*! + * \brief The prach receive thread of eNB. + * \param param is a \ref eNB_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +static void* eNB_thread_prach( void* param ) { + static int eNB_thread_prach_status; + + + PHY_VARS_eNB *eNB= (PHY_VARS_eNB *)param; + eNB_proc_t *proc = &eNB->proc; + + // set default return value + eNB_thread_prach_status = 0; + + thread_top_init("eNB_thread_prach",1,500000L,1000000L,20000000L); + + + while (!oai_exit) { + + if (oai_exit) break; + + + if (wait_on_condition(&proc->mutex_prach,&proc->cond_prach,&proc->instance_cnt_prach,"eNB_prach_thread") < 0) break; + + LOG_D(PHY,"Running eNB prach procedures\n"); + prach_procedures(eNB +#ifdef Rel14 + ,0 +#endif + ); + + if (release_thread(&proc->mutex_prach,&proc->instance_cnt_prach,"eNB_prach_thread") < 0) break; + } + + LOG_I(PHY, "Exiting eNB thread PRACH\n"); + + eNB_thread_prach_status = 0; + return &eNB_thread_prach_status; +} + +#ifdef Rel14 +/*! + * \brief The prach receive thread of eNB for BL/CE UEs. + * \param param is a \ref eNB_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +static void* eNB_thread_prach_br( void* param ) { + static int eNB_thread_prach_status; + + + PHY_VARS_eNB *eNB= (PHY_VARS_eNB *)param; + eNB_proc_t *proc = &eNB->proc; + + // set default return value + eNB_thread_prach_status = 0; + + thread_top_init("eNB_thread_prach_br",1,500000L,1000000L,20000000L); + + while (!oai_exit) { + + if (oai_exit) break; + + + if (wait_on_condition(&proc->mutex_prach_br,&proc->cond_prach_br,&proc->instance_cnt_prach_br,"eNB_prach_thread_br") < 0) break; + + LOG_D(PHY,"Running eNB prach procedures for BL/CE UEs\n"); + prach_procedures(eNB,1); + + if (release_thread(&proc->mutex_prach_br,&proc->instance_cnt_prach_br,"eNB_prach_thread_br") < 0) break; + } + + LOG_I(PHY, "Exiting eNB thread PRACH BR\n"); + + eNB_thread_prach_status = 0; + return &eNB_thread_prach_status; +} + +#endif + + +extern void init_td_thread(PHY_VARS_eNB *, pthread_attr_t *); +extern void init_te_thread(PHY_VARS_eNB *, pthread_attr_t *); + +void init_eNB_proc(int inst) { + + int i=0; + int CC_id; + PHY_VARS_eNB *eNB; + eNB_proc_t *proc; + eNB_rxtx_proc_t *proc_rxtx; + pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_prach=NULL; + //*attr_td=NULL,*attr_te=NULL; +#ifdef Rel14 + pthread_attr_t *attr_prach_br=NULL; +#endif + + LOG_I(PHY,"%s(inst:%d) RC.nb_CC[inst]:%d \n",__FUNCTION__,inst,RC.nb_CC[inst]); + + for (CC_id=0; CC_idproc; + + proc_rxtx = proc->proc_rxtx; + proc_rxtx[0].instance_cnt_rxtx = -1; + proc_rxtx[1].instance_cnt_rxtx = -1; + proc->instance_cnt_prach = -1; + proc->instance_cnt_asynch_rxtx = -1; + proc->CC_id = CC_id; + + proc->first_rx=1; + proc->first_tx=1; + proc->RU_mask=0; + proc->RU_mask_prach=0; + + pthread_mutex_init( &eNB->UL_INFO_mutex, NULL); + pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); + pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); + pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL); + pthread_cond_init( &proc_rxtx[1].cond_rxtx, NULL); + + pthread_mutex_init( &proc->mutex_prach, NULL); + pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL); + pthread_mutex_init( &proc->mutex_RU,NULL); + pthread_mutex_init( &proc->mutex_RU_PRACH,NULL); + + pthread_cond_init( &proc->cond_prach, NULL); + pthread_cond_init( &proc->cond_asynch_rxtx, NULL); + + pthread_attr_init( &proc->attr_prach); + pthread_attr_init( &proc->attr_asynch_rxtx); + // pthread_attr_init( &proc->attr_td); + // pthread_attr_init( &proc->attr_te); + pthread_attr_init( &proc_rxtx[0].attr_rxtx); + pthread_attr_init( &proc_rxtx[1].attr_rxtx); +#ifdef Rel14 + proc->instance_cnt_prach_br = -1; + proc->RU_mask_prach_br=0; + pthread_mutex_init( &proc->mutex_prach_br, NULL); + pthread_mutex_init( &proc->mutex_RU_PRACH_br,NULL); + pthread_cond_init( &proc->cond_prach_br, NULL); + pthread_attr_init( &proc->attr_prach_br); +#endif +#ifndef DEADLINE_SCHEDULER + attr0 = &proc_rxtx[0].attr_rxtx; + attr1 = &proc_rxtx[1].attr_rxtx; + attr_prach = &proc->attr_prach; +#ifdef Rel14 + attr_prach_br = &proc->attr_prach_br; +#endif + + // attr_td = &proc->attr_td; + // attr_te = &proc->attr_te; +#endif + + LOG_I(PHY,"eNB->single_thread_flag:%d\n", eNB->single_thread_flag); + + if (eNB->single_thread_flag==0) { + pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, &proc_rxtx[0] ); + pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, eNB_thread_rxtx, &proc_rxtx[1] ); + } + pthread_create( &proc->pthread_prach, attr_prach, eNB_thread_prach, eNB ); +#ifdef Rel14 + pthread_create( &proc->pthread_prach_br, attr_prach_br, eNB_thread_prach_br, eNB ); +#endif + char name[16]; + if (eNB->single_thread_flag==0) { + snprintf( name, sizeof(name), "RXTX0 %d", i ); + pthread_setname_np( proc_rxtx[0].pthread_rxtx, name ); + snprintf( name, sizeof(name), "RXTX1 %d", i ); + pthread_setname_np( proc_rxtx[1].pthread_rxtx, name ); + } + + AssertFatal(proc->instance_cnt_prach == -1,"instance_cnt_prach = %d\n",proc->instance_cnt_prach); + + + } + + //for multiple CCs: setup master and slaves + /* + for (CC_id=0; CC_idnode_timing == synch_to_ext_device) { //master + eNB->proc.num_slaves = MAX_NUM_CCs-1; + eNB->proc.slave_proc = (eNB_proc_t**)malloc(eNB->proc.num_slaves*sizeof(eNB_proc_t*)); + + for (i=0; i< eNB->proc.num_slaves; i++) { + if (i < CC_id) eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i]->proc); + if (i >= CC_id) eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i+1]->proc); + } + } + } + */ + + /* setup PHY proc TX sync mechanism */ + pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL); + pthread_cond_init(&sync_phy_proc.cond_phy_proc_tx, NULL); + sync_phy_proc.phy_proc_CC_id = 0; +} + + + +/*! + * \brief Terminate eNB TX and RX threads. + */ +void kill_eNB_proc(int inst) { + + int *status; + PHY_VARS_eNB *eNB; + eNB_proc_t *proc; + eNB_rxtx_proc_t *proc_rxtx; + for (int CC_id=0; CC_idproc; + proc_rxtx = &proc->proc_rxtx[0]; + + + LOG_I(PHY, "Killing TX CC_id %d inst %d\n", CC_id, inst ); + + if (eNB->single_thread_flag==0) { + proc_rxtx[0].instance_cnt_rxtx = 0; // FIXME data race! + proc_rxtx[1].instance_cnt_rxtx = 0; // FIXME data race! + pthread_cond_signal( &proc_rxtx[0].cond_rxtx ); + pthread_cond_signal( &proc_rxtx[1].cond_rxtx ); + } + proc->instance_cnt_prach = 0; + pthread_cond_signal( &proc->cond_prach ); + + pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); + pthread_join( proc->pthread_prach, (void**)&status ); + + LOG_I(PHY, "Destroying prach mutex/cond\n"); + pthread_mutex_destroy( &proc->mutex_prach ); + pthread_cond_destroy( &proc->cond_prach ); +#ifdef Rel14 + proc->instance_cnt_prach_br = 0; + pthread_cond_signal( &proc->cond_prach_br ); + pthread_join( proc->pthread_prach_br, (void**)&status ); + pthread_mutex_destroy( &proc->mutex_prach_br ); + pthread_cond_destroy( &proc->cond_prach_br ); +#endif + LOG_I(PHY, "Destroying UL_INFO mutex\n"); + pthread_mutex_destroy(&eNB->UL_INFO_mutex); + int i; + if (eNB->single_thread_flag==0) { + for (i=0;i<2;i++) { + LOG_I(PHY, "Joining rxtx[%d] mutex/cond\n",i); + pthread_join( proc_rxtx[i].pthread_rxtx, (void**)&status ); + LOG_I(PHY, "Destroying rxtx[%d] mutex/cond\n",i); + pthread_mutex_destroy( &proc_rxtx[i].mutex_rxtx ); + pthread_cond_destroy( &proc_rxtx[i].cond_rxtx ); + } + } + } +} + + + + +void reset_opp_meas(void) { + + int sfn; + reset_meas(&softmodem_stats_mt); + reset_meas(&softmodem_stats_hw); + + for (sfn=0; sfn < 10; sfn++) { + reset_meas(&softmodem_stats_rxtx_sf); + reset_meas(&softmodem_stats_rx_sf); + } +} + + +void print_opp_meas(void) { + + int sfn=0; + print_meas(&softmodem_stats_mt, "Main ENB Thread", NULL, NULL); + print_meas(&softmodem_stats_hw, "HW Acquisation", NULL, NULL); + + for (sfn=0; sfn < 10; sfn++) { + print_meas(&softmodem_stats_rxtx_sf,"[eNB][total_phy_proc_rxtx]",NULL, NULL); + print_meas(&softmodem_stats_rx_sf,"[eNB][total_phy_proc_rx]",NULL,NULL); + } +} + +void init_transport(PHY_VARS_eNB *eNB) { + + int i; + int j; + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + + LOG_I(PHY, "Initialise transport\n"); + + for (i=0; idlsch[i][j] = new_eNB_dlsch(1,8,NSOFT,fp->N_RB_DL,0,fp); + if (!eNB->dlsch[i][j]) { + LOG_E(PHY,"Can't get eNB dlsch structures for UE %d \n", i); + exit(-1); + } else { + eNB->dlsch[i][j]->rnti=0; + LOG_D(PHY,"dlsch[%d][%d] => %p rnti:%d\n",i,j,eNB->dlsch[i][j], eNB->dlsch[i][j]->rnti); + } + } + + LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i); + eNB->ulsch[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,fp->N_RB_UL, 0); + + if (!eNB->ulsch[1+i]) { + LOG_E(PHY,"Can't get eNB ulsch structures\n"); + exit(-1); + } + + // this is the transmission mode for the signalling channels + // this will be overwritten with the real transmission mode by the RRC once the UE is connected + eNB->transmission_mode[i] = fp->nb_antenna_ports_eNB==1 ? 1 : 2; + } + // ULSCH for RA + eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS, fp->N_RB_UL, 0); + + if (!eNB->ulsch[0]) { + LOG_E(PHY,"Can't get eNB ulsch structures\n"); + exit(-1); + } + eNB->dlsch_SI = new_eNB_dlsch(1,8,NSOFT,fp->N_RB_DL, 0, fp); + LOG_D(PHY,"eNB %d.%d : SI %p\n",eNB->Mod_id,eNB->CC_id,eNB->dlsch_SI); + eNB->dlsch_ra = new_eNB_dlsch(1,8,NSOFT,fp->N_RB_DL, 0, fp); + LOG_D(PHY,"eNB %d.%d : RA %p\n",eNB->Mod_id,eNB->CC_id,eNB->dlsch_ra); + eNB->dlsch_MCH = new_eNB_dlsch(1,8,NSOFT,fp->N_RB_DL, 0, fp); + LOG_D(PHY,"eNB %d.%d : MCH %p\n",eNB->Mod_id,eNB->CC_id,eNB->dlsch_MCH); + + + eNB->rx_total_gain_dB=130; + + for(i=0; imu_mimo_mode[i].dl_pow_off = 2; + + eNB->check_for_total_transmissions = 0; + + eNB->check_for_MUMIMO_transmissions = 0; + + eNB->FULL_MUMIMO_transmissions = 0; + + eNB->check_for_SUMIMO_transmissions = 0; + + fp->pucch_config_common.deltaPUCCH_Shift = 1; + +} + +void init_eNB_afterRU(void) { + + int inst,CC_id,ru_id,i,aa; + PHY_VARS_eNB *eNB; + + LOG_I(PHY,"%s() RC.nb_inst:%d\n", __FUNCTION__, RC.nb_inst); + + for (inst=0;instnum_RU>0,"Number of RU attached to eNB %d is zero\n",eNB->Mod_id); + LOG_I(PHY,"Mapping RX ports from %d RUs to eNB %d\n",eNB->num_RU,eNB->Mod_id); + eNB->frame_parms.nb_antennas_rx = 0; + + LOG_I(PHY,"Overwriting eNB->prach_vars.rxsigF[0]:%p\n", eNB->prach_vars.rxsigF[0]); + + eNB->prach_vars.rxsigF[0] = (int16_t**)malloc16(64*sizeof(int16_t*)); +#ifdef Rel14 + for (int ce_level=0;ce_level<4;ce_level++) { + LOG_I(PHY,"Overwriting eNB->prach_vars_br.rxsigF.rxsigF[0]:%p\n", eNB->prach_vars_br.rxsigF[ce_level]); + eNB->prach_vars_br.rxsigF[ce_level] = (int16_t**)malloc16(64*sizeof(int16_t*)); + } +#endif + + LOG_I(PHY,"eNB->num_RU:%d\n", eNB->num_RU); + + for (ru_id=0,aa=0;ru_idnum_RU;ru_id++) { + eNB->frame_parms.nb_antennas_rx += eNB->RU_list[ru_id]->nb_rx; + + AssertFatal(eNB->RU_list[ru_id]->common.rxdataF!=NULL, + "RU %d : common.rxdataF is NULL\n", + eNB->RU_list[ru_id]->idx); + + AssertFatal(eNB->RU_list[ru_id]->prach_rxsigF!=NULL, + "RU %d : prach_rxsigF is NULL\n", + eNB->RU_list[ru_id]->idx); + + for (i=0;iRU_list[ru_id]->nb_rx;aa++,i++) { + LOG_I(PHY,"Attaching RU %d antenna %d to eNB antenna %d\n",eNB->RU_list[ru_id]->idx,i,aa); + eNB->prach_vars.rxsigF[0][aa] = eNB->RU_list[ru_id]->prach_rxsigF[i]; +#ifdef Rel14 + for (int ce_level=0;ce_level<4;ce_level++) + eNB->prach_vars_br.rxsigF[ce_level][aa] = eNB->RU_list[ru_id]->prach_rxsigF_br[ce_level][i]; +#endif + eNB->common_vars.rxdataF[aa] = eNB->RU_list[ru_id]->common.rxdataF[i]; + } + } + + + + /* TODO: review this code, there is something wrong. + * In monolithic mode, we come here with nb_antennas_rx == 0 + * (not tested in other modes). + */ + if (eNB->frame_parms.nb_antennas_rx < 1) + { + LOG_I(PHY, "%s() ************* DJP ***** eNB->frame_parms.nb_antennas_rx:%d - GOING TO HARD CODE TO 1", __FUNCTION__, eNB->frame_parms.nb_antennas_rx); + eNB->frame_parms.nb_antennas_rx = 1; + } + else + { + //LOG_I(PHY," Delete code\n"); + } + + if (eNB->frame_parms.nb_antennas_tx < 1) + { + LOG_I(PHY, "%s() ************* DJP ***** eNB->frame_parms.nb_antennas_tx:%d - GOING TO HARD CODE TO 1", __FUNCTION__, eNB->frame_parms.nb_antennas_tx); + eNB->frame_parms.nb_antennas_tx = 1; + } + else + { + //LOG_I(PHY," Delete code\n"); + } + + + + + AssertFatal(eNB->frame_parms.nb_antennas_rx >0, + "inst %d, CC_id %d : nb_antennas_rx %d\n",inst,CC_id,eNB->frame_parms.nb_antennas_rx); + LOG_I(PHY,"inst %d, CC_id %d : nb_antennas_rx %d\n",inst,CC_id,eNB->frame_parms.nb_antennas_rx); + + init_transport(eNB); + //init_precoding_weights(RC.eNB[inst][CC_id]); + } + init_eNB_proc(inst); + } + + for (ru_id=0;ru_idwakeup_rxtx = wakeup_rxtx; + RC.ru[ru_id]->wakeup_prach_eNB = wakeup_prach_eNB; + RC.ru[ru_id]->wakeup_prach_eNB_br = wakeup_prach_eNB_br; + RC.ru[ru_id]->eNB_top = eNB_top; + } +} + +void init_eNB(int single_thread_flag,int wait_for_sync) { + + int CC_id; + int inst; + PHY_VARS_eNB *eNB; + + LOG_I(PHY,"[lte-softmodem.c] eNB structure about to allocated RC.nb_L1_inst:%d RC.nb_L1_CC[0]:%d\n",RC.nb_L1_inst,RC.nb_L1_CC[0]); + + if (RC.eNB == NULL) RC.eNB = (PHY_VARS_eNB***) malloc(RC.nb_L1_inst*sizeof(PHY_VARS_eNB **)); + LOG_I(PHY,"[lte-softmodem.c] eNB structure RC.eNB allocated\n"); + for (inst=0;instabstraction_flag = 0; + eNB->single_thread_flag = single_thread_flag; + + + LOG_I(PHY,"Initializing eNB %d CC_id %d single_thread_flag:%d\n",inst,CC_id,single_thread_flag); +#ifndef OCP_FRAMEWORK + LOG_I(PHY,"Initializing eNB %d CC_id %d\n",inst,CC_id); +#endif + + + eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; + + + LOG_I(PHY,"Registering with MAC interface module\n"); + AssertFatal((eNB->if_inst = IF_Module_init(inst))!=NULL,"Cannot register interface"); + eNB->if_inst->schedule_response = schedule_response; + eNB->if_inst->PHY_config_req = phy_config_request; + memset((void*)&eNB->UL_INFO,0,sizeof(eNB->UL_INFO)); + memset((void*)&eNB->Sched_INFO,0,sizeof(eNB->Sched_INFO)); + LOG_I(PHY,"Setting indication lists\n"); + eNB->UL_INFO.rx_ind.rx_indication_body.rx_pdu_list = eNB->rx_pdu_list; + eNB->UL_INFO.crc_ind.crc_indication_body.crc_pdu_list = eNB->crc_pdu_list; + eNB->UL_INFO.sr_ind.sr_indication_body.sr_pdu_list = eNB->sr_pdu_list; + eNB->UL_INFO.harq_ind.harq_indication_body.harq_pdu_list = eNB->harq_pdu_list; + eNB->UL_INFO.cqi_ind.cqi_pdu_list = eNB->cqi_pdu_list; + eNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = eNB->cqi_raw_pdu_list; + eNB->prach_energy_counter = 0; + } + + } + + LOG_I(PHY,"[lte-softmodem.c] eNB structure allocated\n"); +} + + +void stop_eNB(int nb_inst) { + + for (int inst=0;inst. + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + +*******************************************************************************/ + +/*! \file lte-enb.c + * \brief Top-level threads for eNodeB + * \author R. Knopp, F. Kaltenberger, Navid Nikaein + * \date 2012 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr + * \note + * \warning + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "rt_wrapper.h" + +#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all + +#include "assertions.h" +#include "msc.h" + +#include "PHY/types.h" + +#include "PHY/defs.h" +#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all +//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all + +#include "../../ARCH/COMMON/common_lib.h" + +//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all + +#include "PHY/LTE_TRANSPORT/if4_tools.h" +#include "PHY/LTE_TRANSPORT/if5_tools.h" + +#include "PHY/extern.h" +#include "SCHED/extern.h" +#include "LAYER2/MAC/extern.h" + +#include "../../SIMU/USER/init_lte.h" + +#include "LAYER2/MAC/defs.h" +#include "LAYER2/MAC/extern.h" +#include "LAYER2/MAC/proto.h" +#include "RRC/LITE/extern.h" +#include "PHY_INTERFACE/extern.h" + +#ifdef SMBV +#include "PHY/TOOLS/smbv.h" +unsigned short config_frames[4] = {2,9,11,13}; +#endif +#include "UTIL/LOG/log_extern.h" +#include "UTIL/OTG/otg_tx.h" +#include "UTIL/OTG/otg_externs.h" +#include "UTIL/MATH/oml.h" +#include "UTIL/LOG/vcd_signal_dumper.h" +#include "UTIL/OPT/opt.h" +#include "enb_config.h" +//#include "PHY/TOOLS/time_meas.h" + +#ifndef OPENAIR2 +#include "UTIL/OTG/otg_extern.h" +#endif + +#if defined(ENABLE_ITTI) +# if defined(ENABLE_USE_MME) +# include "s1ap_eNB.h" +#ifdef PDCP_USE_NETLINK +# include "SIMULATION/ETH_TRANSPORT/proto.h" +#endif +# endif +#endif + +#include "T.h" + +//#define DEBUG_THREADS 1 + +//#define USRP_DEBUG 1 +struct timing_info_t { + //unsigned int frame, hw_slot, last_slot, next_slot; + RTIME time_min, time_max, time_avg, time_last, time_now; + //unsigned int mbox0, mbox1, mbox2, mbox_target; + unsigned int n_samples; +} timing_info; + +// Fix per CC openair rf/if device update +// extern openair0_device openair0; + +#if defined(ENABLE_ITTI) +extern volatile int start_eNB; +extern volatile int start_UE; +#endif +extern volatile int oai_exit; + +extern openair0_config_t openair0_cfg[MAX_CARDS]; + +extern pthread_cond_t sync_cond; +extern pthread_mutex_t sync_mutex; +extern int sync_var; + +//pthread_t main_eNB_thread; + +time_stats_t softmodem_stats_mt; // main thread +time_stats_t softmodem_stats_hw; // hw acquisition +time_stats_t softmodem_stats_rxtx_sf; // total tx time +time_stats_t softmodem_stats_rx_sf; // total rx time +int32_t **rxdata; +int32_t **txdata; + +uint8_t seqno; //sequence number + +static int time_offset[4] = {0,0,0,0}; + +/* mutex, cond and variable to serialize phy proc TX calls + * (this mechanism may be relaxed in the future for better + * performances) + */ +static struct { + pthread_mutex_t mutex_phy_proc_tx; + pthread_cond_t cond_phy_proc_tx; + volatile uint8_t phy_proc_CC_id; +} sync_phy_proc; + +void exit_fun(const char* s); + +void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst,eth_params_t *,int); +void stop_eNB(int nb_inst); +void init_RU(RAN_CONTEXT *rc, eNB_func_t node_function, RU_if_in_t ru_if_in[], RU_if_timing_t ru_if_timing[], eth_params_t *eth_params); +void stop_RU(); + +// Generic thread initialisation function +static inline void thread_top_init(char *thread_name, + int affinity, + uint64_t runtime, + uint64_t deadline, + uint64_t period) { + + MSC_START_USE(); + +#ifdef DEADLINE_SCHEDULER + struct sched_attr attr; + + unsigned int flags = 0; + + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; + + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = runtime; + attr.sched_deadline = deadline; + attr.sched_period = period; + + if (sched_setattr(0, &attr, flags) < 0 ) { + perror("[SCHED] eNB tx thread: sched_setattr failed\n"); + exit_fun("Error setting deadline scheduler"); + } + + LOG_I( HW, "[SCHED] eNB %s deadline thread started on CPU %d\n", thread_name,sched_getcpu() ); + +#else //LOW_LATENCY + int policy, s, j; + struct sched_param sparam; + char cpu_affinity[1024]; + cpu_set_t cpuset; + + /* Set affinity mask to include CPUs 1 to MAX_CPUS */ + /* CPU 0 is reserved for UHD threads */ + /* CPU 1 is reserved for all RX_TX threads */ + /* Enable CPU Affinity only if number of CPUs >2 */ + CPU_ZERO(&cpuset); + +#ifdef CPU_AFFINITY + if (get_nprocs() > 2) + { + if (affinity == 0) + CPU_SET(0,&cpuset); + else + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_setaffinity_np"); + exit_fun("Error setting processor affinity"); + } + } +#endif //CPU_AFFINITY + + /* Check the actual affinity mask assigned to the thread */ + s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) { + perror( "pthread_getaffinity_np"); + exit_fun("Error getting processor affinity "); + } + memset(cpu_affinity,0,sizeof(cpu_affinity)); + for (j = 0; j < CPU_SETSIZE; j++) + if (CPU_ISSET(j, &cpuset)) { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } + + memset(&sparam, 0, sizeof(sparam)); + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); + policy = SCHED_FIFO ; + + s = pthread_setschedparam(pthread_self(), policy, &sparam); + if (s != 0) { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } + + s = pthread_getschedparam(pthread_self(), &policy, &sparam); + if (s != 0) { + perror("pthread_getschedparam : "); + exit_fun("Error getting thread priority"); + } + + LOG_I(HW, "[SCHED][eNB] %s started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",thread_name,sched_getcpu(),gettid(), + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + sparam.sched_priority, cpu_affinity ); + +#endif //LOW_LATENCY + + mlockall(MCL_CURRENT | MCL_FUTURE); + +} + +static inline void wait_sync(char *thread_name) { + + printf( "waiting for sync (%s)\n",thread_name); + pthread_mutex_lock( &sync_mutex ); + + while (sync_var<0) + pthread_cond_wait( &sync_cond, &sync_mutex ); + + pthread_mutex_unlock(&sync_mutex); + + printf( "got sync (%s)\n", thread_name); + +} + +// RU OFDM Modulator, used in IF4p5 RRU, RCC/RAU with IF5, eNodeB + +void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) { + + unsigned int aa,slot_offset, slot_offset_F; + int dummy_tx_b[7680*4] __attribute__((aligned(32))); + int i,j, tx_offset; + int slot_sizeF = (phy_vars_eNB->frame_parms.ofdm_symbol_size)* + ((phy_vars_eNB->frame_parms.Ncp==1) ? 6 : 7); + int len,len2; + int16_t *txdata; +// int CC_id = phy_vars_eNB->proc.CC_id; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); + + slot_offset_F = (subframe<<1)*slot_sizeF; + + slot_offset = subframe*phy_vars_eNB->frame_parms.samples_per_tti; + + if ((subframe_select(&phy_vars_eNB->frame_parms,subframe)==SF_DL)|| + ((subframe_select(&phy_vars_eNB->frame_parms,subframe)==SF_S))) { + // LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot); + + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + if (phy_vars_eNB->frame_parms.Ncp == EXTENDED) { + PHY_ofdm_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F], + dummy_tx_b, + phy_vars_eNB->frame_parms.ofdm_symbol_size, + 6, + phy_vars_eNB->frame_parms.nb_prefix_samples, + CYCLIC_PREFIX); + PHY_ofdm_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], + dummy_tx_b+(phy_vars_eNB->frame_parms.samples_per_tti>>1), + phy_vars_eNB->frame_parms.ofdm_symbol_size, + 6, + phy_vars_eNB->frame_parms.nb_prefix_samples, + CYCLIC_PREFIX); + } else { + normal_prefix_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F], + dummy_tx_b, + 7, + &(phy_vars_eNB->frame_parms)); + // if S-subframe generate first slot only + if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_DL) + normal_prefix_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], + dummy_tx_b+(phy_vars_eNB->frame_parms.samples_per_tti>>1), + 7, + &(phy_vars_eNB->frame_parms)); + } + + // if S-subframe generate first slot only + if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_S) + len = phy_vars_eNB->frame_parms.samples_per_tti>>1; + else + len = phy_vars_eNB->frame_parms.samples_per_tti; + /* + for (i=0;icommon_vars.txdata[0][aa][(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)+tx_offset]; + len2 = -(slot_offset+time_offset[aa]); + len2 = (len2>len) ? len : len2; + for (i=0; i<(len2<<1); i++) { + txdata[i] = ((int16_t*)dummy_tx_b)[i]<common_vars.txdata[0][aa][0]; + for (j=0; i<(len<<1); i++,j++) { + txdata[j++] = ((int16_t*)dummy_tx_b)[i]<(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)) { + tx_offset = (int)slot_offset+time_offset[aa]; + txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset]; + len2 = -tx_offset+LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; + for (i=0; i<(len2<<1); i++) { + txdata[i] = ((int16_t*)dummy_tx_b)[i]<common_vars.txdata[0][aa][0]; + for (j=0; i<(len<<1); i++,j++) { + txdata[j++] = ((int16_t*)dummy_tx_b)[i]<common_vars.txdata[0][aa][tx_offset]; + + for (i=0; i<(len<<1); i++) { + txdata[i] = ((int16_t*)dummy_tx_b)[i]<frame_parms,subframe) == SF_S) { + for (i=0; icommon_vars.txdata[0][aa][tx_offset++] = 0x00010001; + } + } + */ + if ((((phy_vars_eNB->frame_parms.tdd_config==0) || + (phy_vars_eNB->frame_parms.tdd_config==1) || + (phy_vars_eNB->frame_parms.tdd_config==2) || + (phy_vars_eNB->frame_parms.tdd_config==6)) && + (subframe==0)) || (subframe==5)) { + // turn on tx switch N_TA_offset before + //LOG_D(HW,"subframe %d, time to switch to tx (N_TA_offset %d, slot_offset %d) \n",subframe,phy_vars_eNB->N_TA_offset,slot_offset); + for (i=0; iN_TA_offset; i++) { + tx_offset = (int)slot_offset+time_offset[aa]+i-phy_vars_eNB->N_TA_offset/2; + if (tx_offset<0) + tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; + + if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)) + tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti; + + phy_vars_eNB->common_vars.txdata[0][aa][tx_offset] = 0x00000000; + } + } + } + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); +} + + + +void proc_tx_high0(RU_t *ru, + eNB_rxtx_proc_t *proc, + relaying_type_t r_type, + PHY_VARS_RN *rn) { + + int offset = proc == &eNB->proc.proc_rxtx[0] ? 0 : 1; + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB+offset, proc->frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB+offset, proc->subframe_tx ); + + phy_procedures_eNB_TX(eNB,proc,r_type,rn,1); + + /* we're done, let the next one proceed */ + if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc\n"); + exit_fun("nothing to add"); + } + sync_phy_proc.phy_proc_CC_id++; + sync_phy_proc.phy_proc_CC_id %= MAX_NUM_CCs; + pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); + if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc\n"); + exit_fun("nothing to add"); + } + +} + +/* +void proc_tx_high(RU_t *ru, + eNB_rxtx_proc_t *proc, + relaying_type_t r_type, + PHY_VARS_RN *rn) { + + + // do PHY high + proc_tx_high0(eNB,proc,r_type,rn); + + // if TX fronthaul go ahead + if (eNB->tx_fh) eNB->tx_fh(eNB,proc); + +} + +void proc_tx_full(RU_t *ru, + eNB_rxtx_proc_t *proc, + relaying_type_t r_type, + PHY_VARS_RN *rn) { + + + // do PHY high + proc_tx_high0(eNB,proc,r_type,rn); + + + + +} +*/ + +// RU IF5 TX fronthaul for 16-bit OAI format +static inline void tx_rcc_if5(PHY_vars_eNB_t *ru,ru_proc_t *proc) { + if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, eNB->timestamp_tx&0xffffffff ); + send_IF5(ru, proc->timestamp_txp proc->subframe_tx, &seqno, IF5_RRH_GW_DL); +} + +// RCC IF5 TX fronthaul for Mobipass packet format +static inline void tx_rcc_if5_mobipass(PHY_VARS_eNB_t *eNB,ru_proc_t *proc) { + if (eNB == RC.eNB[0][p]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, eNB->timestamp_tx&0xffffffff ); + send_IF5(ru, proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_MOBIPASS); +} + +// RCC IF4p5 TX fronthaul +static inline void tx_rcc_if4p5(PHY_VARS_eNB_t *eNB,eNB_rxtx_proc_t *proc) { + send_IF4p5(eNB,proc->frame_tx, proc->subframe_tx, IF4p5_PDLFFT, 0); +} + +// RAU IF5 TX fronthaul for 16-bit OAI format +static inline void tx_ru_if5(RU_t *ru) { + if (ru == RC.ru_list[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff ); + send_IF5(eNB, ru->proc.timestamp_txp ru->proc.subframe_tx, &seqno, IF5_RRH_GW_DL); +} + +// RAU IF5 TX fronthaul for Mobipass packet format +static inline void tx_ru_if5_mobipass(RU_t *ru) { + if (ru == RC.ru_list[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff ); + send_IF5(eNB, ru->proc.timestamp_tx, ru->proc.subframe_tx, &seqno, IF5_MOBIPASS); +} + +// RAU IF4p5 TX fronthaul +static inline void tx_fh_if4p5(RU_t *ru) { + send_IF4p5(eNB,proc->frame_tx, proc->subframe_tx, IF4p5_PDLFFT, 0); +} + + +// RRU/RAU IF4p5 TX fronthaul receiver. Assumes an if_device on input and if or rf device on output +// receives one subframe's worth of IF4p5 OFDM symbols and precodes (if required for RAU function) modulates via IDFT + prefix insertion (if required for RRU function) +void proc_tx_ru_if4p5(RU_t *ru) { + + uint32_t symbol_number=0; + uint32_t symbol_mask, symbol_mask_full; + uint16_t packet_type; + ru_proc_t = &ru->proc; + + // dump VCD output for first RU in list + if (ru == RC.ru_list[0]) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB, proc->frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB, proc->subframe_tx ); + } + /// **** incoming IF4p5 from remote RCC/RAU **** /// + symbol_number = 0; + symbol_mask = 0; + symbol_mask_full = (1<frame_parms.symbols_per_tti)-1; + + for (PHY_VARS_eNB *eNB_tx = ru->eNB_list[0],i=0; eNB_tx[i] != NULL ; i++) { + do { + recv_IF4p5(ru, &proc->frame_tx, &proc->subframe_tx, &packet_type, &symbol_number); + symbol_mask = symbol_mask | (1<do_precoding) ru->do_precoding(i,ru); + } + // do OFDM modulation if needed + if (ru->do_OFDM_mod) ru->do_OFDM_mod(ru); + + // do outgoing TX fronthaul if needed + if (ru->tx_fh) ru->tx_fh(ru); +} + +void proc_tx_ru_if5(RU_t *ru) { + + + if (ru == RC.ru_list[0]) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB, ru->proc.frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB, ru->proc.subframe_tx ); + } + + /// **** recv_IF5 of txdata from BBU **** /// + recv_IF5(eNB, &ru->timestamp_tx, proc->subframe_tx, IF5_RRH_GW_DL); + + // do OFDM modulation if needed + if (ru->do_OFDM_mod) ru->do_OFDM_mod(ru); + + // do outgoing TX fronthaul if needed + if (ru->tx_fh) ru->tx_fh(ru); +} + +int wait_CCs(eNB_rxtx_proc_t *proc) { + + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + if (pthread_mutex_timedlock(&sync_phy_proc.mutex_phy_proc_tx,&wait) != 0) { + LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX\n"); + exit_fun("nothing to add"); + return(-1); + } + + // wait for our turn or oai_exit + while (sync_phy_proc.phy_proc_CC_id != proc->CC_id && !oai_exit) { + pthread_cond_wait(&sync_phy_proc.cond_phy_proc_tx, + &sync_phy_proc.mutex_phy_proc_tx); + } + + if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) { + LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX\n"); + exit_fun("nothing to add"); + return(-1); + } + return(0); +} + +static inline int rxtx(PHY_VARS_eNB eNB_t *eNB,eNB_rxtx_proc_t *proc, char *thread_name) { + + start_meas(&softmodem_stats_rxtx_sf); + // **************************************** + // Common RX procedures subframe n + phy_procedures_eNB_common_RX(eNB); + + // UE-specific RX processing for subframe n + if (eNB->proc_uespec_rx) eNB->proc_uespec_rx(eNB, proc, no_relay ); + + // ***************************************** + // TX processing for subframe n+4 + // run PHY TX procedures the one after the other for all CCs to avoid race conditions + // (may be relaxed in the future for performance reasons) + // ***************************************** + //if (wait_CCs(proc)<0) return(-1); + + if (oai_exit) return(-1); + + if (eNB->proc_tx) eNB->proc_tx(eNB, proc, no_relay, NULL ); + + if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) return(-1); + + stop_meas( &softmodem_stats_rxtx_sf ); + + return(0); +} + +/*! + * \brief The RX UE-specific and TX thread of eNB. + * \param param is a \ref eNB_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +static void* eNB_thread_rxtx( void* param ) { + + static int eNB_thread_rxtx_status; + + eNB_rxtx_proc_t *proc = (eNB_rxtx_proc_t*)param; + PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id]; + + char thread_name[100]; + + + // set default return value + eNB_thread_rxtx_status = 0; + + sprintf(thread_name,"RXn_TXnp4_%d\n",&eNB->proc.proc_rxtx[0] == proc ? 0 : 1); + thread_top_init(thread_name,1,850000L,1000000L,2000000L); + + while (!oai_exit) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); + + if (wait_on_condition(&proc->mutex_rxtx,&proc->cond_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 1 ); + + + + if (oai_exit) break; + + if (rxtx(eNB,proc,thread_name) < 0) break; + + } // while !oai_exit + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 ); + + printf( "Exiting eNB thread RXn_TXnp4\n"); + + eNB_thread_rxtx_status = 0; + return &eNB_thread_rxtx_status; +} + +#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) +/* Wait for eNB application initialization to be complete (eNB registration to MME) */ +static void wait_system_ready (char *message, volatile int *start_flag) { + + static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....", + " ....", " ...", " ..", " .", " "}; + int i = 0; + + while ((!oai_exit) && (*start_flag == 0)) { + LOG_N(EMU, message, indicator[i]); + fflush(stdout); + i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0])); + usleep(200000); + } + + LOG_D(EMU,"\n"); +} +#endif + + +// asynchronous UL with IF4p5 (RCC,RAU,eNodeB_BBU) +void fh_if5_asynch_UL(RU_t *ru,int *frame,int *subframe) { + + eNB_proc_t *proc = &eNB->proc; + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + + recv_IF5(eNB, &ru->timestamp_rx, *subframe, IF5_RRH_GW_UL); + + proc->subframe_rx = (ru->timestamp_rx/fp->samples_per_tti)%10; + proc->frame_rx = (ru->timestamp_rx/(10*fp->samples_per_tti))&1023; + + if (proc->first_rx != 0) { + proc->first_rx = 0; + *subframe = proc->subframe_rx; + *frame = proc->frame_rx; + } + else { + if (proc->subframe_rx != *subframe) { + LOG_E(PHY,"subframe_rx %d is not what we expect %d\n",proc->subframe_rx,*subframe); + exit_fun("Exiting"); + } + if (proc->frame_rx != *frame) { + LOG_E(PHY,"subframe_rx %d is not what we expect %d\n",proc->frame_rx,*frame); + exit_fun("Exiting"); + } + } +} // eNodeB_3GPP_BBU + +// asynchronous UL with IF4p5 (RCC,RAU,eNodeB_BBU) +void fh_if4p5_asynch_UL(RU_t *ru,int *frame,int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; + + uint16_t packet_type; + uint32_t symbol_number,symbol_mask,symbol_mask_full,prach_rx; + + + symbol_number = 0; + symbol_mask = 0; + symbol_mask_full = (1<symbols_per_tti)-1; + prach_rx = 0; + + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! + recv_IF4p5(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); + if (proc->first_rx != 0) { + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; + proc->first_rx = 0; + } + else { + if (proc->frame_rx != *frame) { + LOG_E(PHY,"frame_rx %d is not what we expect %d\n",proc->frame_rx,*frame); + exit_fun("Exiting"); + } + if (proc->subframe_rx != *subframe) { + LOG_E(PHY,"subframe_rx %d is not what we expect %d\n",proc->subframe_rx,*subframe); + exit_fun("Exiting"); + } + } + if (packet_type == IF4p5_PULFFT) { + symbol_mask = symbol_mask | (1<frame_rx, proc->subframe_rx)>0) ? 1 : 0; + } else if (packet_type == IF4p5_PRACH) { + prach_rx = 0; + } + } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); + + +} + + +void fh_if5_asynch_DL(RU_t *ru,int *frame,int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; + int subframe_tx,frame_tx; + openair0_timestamp timestamp_tx; + + recv_IF5(eNB, ×tamp_tx, *subframe, IF5_RRH_GW_DL); + // printf("Received subframe %d (TS %llu) from RCC\n",subframe_tx,timestamp_tx); + + subframe_tx = (timestamp_tx/fp->samples_per_tti)%10; + frame_tx = (timestamp_tx/(fp->samples_per_tti*10))&1023; + + if (proc->first_tx != 0) { + *subframe = subframe_tx; + *frame = frame_tx; + proc->first_tx = 0; + } + else { + if (subframe_tx != *subframe) { + LOG_E(PHY,"subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); + exit_fun("Exiting"); + } + if (frame_tx != *frame) { + LOG_E(PHY,"frame_tx %d is not what we expect %d\n",frame_tx,*frame); + exit_fun("Exiting"); + } + } +} + +void fh_if4p5_asynch_DL(RU_t *ru,int *frame,int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; + + uint16_t packet_type; + uint32_t symbol_number,symbol_mask,symbol_mask_full; + int subframe_tx,frame_tx; + + symbol_number = 0; + symbol_mask = 0; + symbol_mask_full = (1<symbols_per_tti)-1; + + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! + recv_IF4p5(eNB, &frame_tx, &subframe_tx, &packet_type, &symbol_number); + if (proc->first_tx != 0) { + *frame = frame_tx; + *subframe = subframe_tx; + proc->first_tx = 0; + } + else { + if (frame_tx != *frame) { + LOG_E(PHY,"frame_tx %d is not what we expect %d\n",frame_tx,*frame); + exit_fun("Exiting"); + } + if (subframe_tx != *subframe) { + LOG_E(PHY,"subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); + exit_fun("Exiting"); + } + } + if (packet_type == IF4p5_PDLFFT) { + symbol_mask = symbol_mask | (1<CC_id]; + + + int subframe=0, frame=0; + + thread_top_init("thread_asynch",1,870000L,1000000L,1000000L); + + // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe + + wait_sync("thread_asynch"); + + // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe + printf( "waiting for devices (eNB_thread_asynch_rx)\n"); + + wait_on_condition(&proc->mutex_asynch_rxtx,&proc->cond_asynch_rxtx,&proc->instance_cnt_asynch_rxtx,"thread_asynch"); + + printf( "devices ok (eNB_thread_asynch_rx)\n"); + + + while (!oai_exit) { + + if (oai_exit) break; + + if (subframe==9) { + subframe=0; + frame++; + frame&=1023; + } else { + subframe++; + } + + if (eNB->fh_asynch) eNB->fh_asynch(eNB,&frame,&subframe); + else AssertFatal(1==0, "Unknown eNB->node_function %d",eNB->node_function); + + } + + eNB_thread_asynch_rxtx_status=0; + return(&eNB_thread_asynch_rxtx_status); +} + + + + + +void rx_rf(RU_t *ru,int *frame,int *subframe) { + + eNB_proc_t *proc = &eNB->proc; + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + void *rxp[fp->nb_antennas_rx],*txp[fp->nb_antennas_tx]; + unsigned int rxs,txs; + int i; + int tx_sfoffset = 3;//(eNB->single_thread_flag == 1) ? 3 : 3; + if (proc->first_rx==0) { + + // Transmit TX buffer based on timestamp from RX + // printf("trx_write -> USRP TS %llu (sf %d)\n", (ru->timestamp_rx+(3*fp->samples_per_tti)),(proc->subframe_rx+2)%10); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (ru->timestamp_rx+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers + + for (i=0; inb_antennas_tx; i++) + txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+tx_sfoffset)%10)*fp->samples_per_tti]; + + txs = eNB->rfdevice.trx_write_func(&eNB->rfdevice, + ru->timestamp_rx+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance, + txp, + fp->samples_per_tti, + fp->nb_antennas_tx, + 1); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + + + + if (txs != fp->samples_per_tti) { + LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti); + exit_fun( "problem transmitting samples" ); + } + } + + for (i=0; inb_antennas_rx; i++) + rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][*subframe*fp->samples_per_tti]; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + + rxs = eNB->rfdevice.trx_read_func(&eNB->rfdevice, + &(ru->timestamp_rx), + rxp, + fp->samples_per_tti, + fp->nb_antennas_rx); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); + + if (proc->first_rx == 1) + eNB->ts_offset = ru->timestamp_rx; + + proc->frame_rx = ((ru->timestamp_rx-eNB->ts_offset) / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = ((ru->timestamp_rx-eNB->ts_offset) / fp->samples_per_tti)%10; + // synchronize first reception to frame 0 subframe 0 + + ru->timestamp_tx = ru->timestamp_rx+(4*fp->samples_per_tti); + //printf("trx_read <- USRP TS %llu (sf %d, f %d, first_rx %d)\n", ru->timestamp_rx,proc->subframe_rx,proc->frame_rx,proc->first_rx); + + if (proc->first_rx == 0) { + if (proc->subframe_rx != *subframe){ + LOG_E(PHY,"Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",ru->timestamp_rx,proc->subframe_rx,*subframe); + exit_fun("Exiting"); + } + + if (proc->frame_rx != *frame) { + LOG_E(PHY,"Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",ru->timestamp_rx,proc->frame_rx,*frame); + exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; + } + + //printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",ru->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, ru->timestamp_rx&0xffffffff ); + + if (rxs != fp->samples_per_tti) + exit_fun( "problem receiving samples" ); + + + +} + +void rx_fh_if5(RU_t *ru,int *frame, int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; + + recv_IF5(eNB, &ru->timestamp_rx, *subframe, IF5_RRH_GW_UL); + + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + + if (proc->first_rx == 0) { + if (proc->subframe_rx != *subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,subframe); + exit_fun("Exiting"); + } + + if (proc->frame_rx != *frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,frame); + exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; + } + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + +} + + +void rx_fh_if4p5(RU_t *ru,int *frame,int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; + eNB_proc_t *proc = &eNB->proc; + + int prach_rx; + + uint16_t packet_type; + uint32_t symbol_number=0; + uint32_t symbol_mask, symbol_mask_full; + + symbol_mask = 0; + symbol_mask_full = (1<symbols_per_tti)-1; + prach_rx = 0; + + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! + recv_IF4p5(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); + + if (packet_type == IF4p5_PULFFT) { + symbol_mask = symbol_mask | (1<frame_rx, proc->subframe_rx)>0) ? 1 : 0; + } else if (packet_type == IF4p5_PRACH) { + prach_rx = 0; + } + + } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1)); + + //caculate timestamp_rx, timestamp_tx based on frame and subframe + proc->timestamp_rx = ((proc->frame_rx * 10) + proc->subframe_rx ) * fp->samples_per_tti ; + proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); + + + if (proc->first_rx == 0) { + if (proc->subframe_rx != *subframe){ + LOG_E(PHY,"Received Timestamp (IF4p5) doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d,CCid %d)\n",proc->subframe_rx,*subframe,eNB->CC_id); + exit_fun("Exiting"); + } + if (proc->frame_rx != *frame) { + LOG_E(PHY,"Received Timestamp (IF4p5) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d,CCid %d)\n",proc->frame_rx,*frame,eNB->CC_id); + exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; + } + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + +} + +void rx_fh_slave(RU_t *ru,int *frame,int *subframe) { + // This case is for synchronization to another thread + // it just waits for an external event. The actual rx_fh is handle by the asynchronous RX thread + eNB_proc_t *proc=&eNB->proc; + + if (wait_on_condition(&proc->mutex_FH,&proc->cond_FH,&proc->instance_cnt_FH,"rx_fh_slave") < 0) + return; + + release_thread(&proc->mutex_FH,&proc->instance_cnt_FH,"rx_fh_slave"); + + +} + + +int wakeup_rxtx(eNB_proc_t *proc,eNB_rxtx_proc_t *proc_rxtx,LTE_DL_FRAME_PARMS *fp) { + + int i; + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + /* accept some delay in processing - up to 5ms */ + for (i = 0; i < 10 && proc_rxtx->instance_cnt_rxtx == 0; i++) { + LOG_W( PHY,"[eNB] Frame %d, eNB RXn-TXnp4 thread busy!! (cnt_rxtx %i)\n", proc_rxtx->frame_tx, proc_rxtx->instance_cnt_rxtx); + usleep(500); + } + if (proc_rxtx->instance_cnt_rxtx == 0) { + exit_fun( "TX thread busy" ); + return(-1); + } + + // wake up TX for subframe n+4 + // lock the TX mutex and make sure the thread is ready + if (pthread_mutex_timedlock(&proc_rxtx->mutex_rxtx,&wait) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RXTX thread %d (IC %d)\n", proc_rxtx->subframe_rx&1,proc_rxtx->instance_cnt_rxtx ); + exit_fun( "error locking mutex_rxtx" ); + return(-1); + } + + ++proc_rxtx->instance_cnt_rxtx; + + // We have just received and processed the common part of a subframe, say n. + // TS_rx is the last received timestamp (start of 1st slot), TS_tx is the desired + // transmitted timestamp of the next TX slot (first). + // The last (TS_rx mod samples_per_frame) was n*samples_per_tti, + // we want to generate subframe (n+4), so TS_tx = TX_rx+4*samples_per_tti, + // and proc->subframe_tx = proc->subframe_rx+4 + proc_rxtx->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); + proc_rxtx->frame_rx = proc->frame_rx; + proc_rxtx->subframe_rx = proc->subframe_rx; + proc_rxtx->frame_tx = (proc_rxtx->subframe_rx > 5) ? (proc_rxtx->frame_rx+1)&1023 : proc_rxtx->frame_rx; + proc_rxtx->subframe_tx = (proc_rxtx->subframe_rx + 4)%10; + + // the thread can now be woken up + if (pthread_cond_signal(&proc_rxtx->cond_rxtx) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RXn-TXnp4 thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return(-1); + } + + pthread_mutex_unlock( &proc_rxtx->mutex_rxtx ); + + return(0); +} + +void wakeup_slaves(ru_proc_t *proc) { + + int i; + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + for (i=0;inum_slaves;i++) { + ru_proc_t *slave_proc = proc->slave_proc[i]; + // wake up slave FH thread + // lock the FH mutex and make sure the thread is ready + if (pthread_mutex_timedlock(&slave_proc->mutex_FH,&wait) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB CCid %d slave CCid %d (IC %d)\n",proc->CC_id,slave_proc->CC_id); + exit_fun( "error locking mutex_rxtx" ); + break; + } + + int cnt_slave = ++slave_proc->instance_cnt_FH; + slave_proc->frame_rx = proc->frame_rx; + slave_proc->subframe_rx = proc->subframe_rx; + slave_proc->timestamp_rx = proc->timestamp_rx; + slave_proc->timestamp_tx = proc->timestamp_tx; + + pthread_mutex_unlock( &slave_proc->mutex_FH ); + + if (cnt_slave == 0) { + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&slave_proc->cond_FH) != 0) { + LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB CCid %d, slave CCid %d\n",proc->CC_id,slave_proc->CC_id); + exit_fun( "ERROR pthread_cond_signal" ); + break; + } + } else { + LOG_W( PHY,"[RU] Frame %d, slave CC_id %d thread busy!! (cnt_FH %i)\n",slave_proc->frame_rx,slave_proc->CC_id, cnt_slave); + exit_fun( "FH thread busy" ); + break; + } + } +} + +/*! + * \brief The Fronthaul thread of RRU/RAU/RCC/eNB + * In the case of RRU/eNB, handles interface with external RF + * In the case of RAU/RCC, handles fronthaul interface with RRU/RAU + * \param param is a \ref eNB_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ + +/*! + * \brief The prach receive thread of eNB. + * \param param is a \ref eNB_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +static void* eNB_thread_prach( void* param ) { + static int eNB_thread_prach_status; + + eNB_proc_t *proc = (eNB_proc_t*)param; + PHY_VARS_eNB *eNB= PHY_vars_eNB_g[0][proc->CC_id]; + + // set default return value + eNB_thread_prach_status = 0; + + thread_top_init("eNB_thread_prach",1,500000L,1000000L,20000000L); + + while (!oai_exit) { + + if (oai_exit) break; + + if (wait_on_condition(&proc->mutex_prach,&proc->cond_prach,&proc->instance_cnt_prach,"eNB_prach_thread") < 0) break; + + prach_procedures(eNB); + + if (release_thread(&proc->mutex_prach,&proc->instance_cnt_prach,"eNB_prach_thread") < 0) break; + } + + printf( "Exiting eNB thread PRACH\n"); + + eNB_thread_prach_status = 0; + return &eNB_thread_prach_status; +} + +static void* ru_thread( void* param ) { + + static int ru_thread_status; + + RU_t *ru=(RU_t*)param; + ru_proc_t *proc=ru->proc; + int subframe=0, frame=0; + + // set default return value + ru_thread_status = 0; + + thread_top_init("ru_thread",0,870000,1000000,1000000); + + wait_sync("ru_thread"); + + /* +#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) + if (eNB->node_function < NGFI_RRU_IF5) + wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); +#endif + */ + + // wakeup asnych_rxtx thread because the devices are ready at this point + pthread_mutex_lock(&proc->mutex_asynch_rxtx); + proc->instance_cnt_asynch_rxtx=0; + pthread_mutex_unlock(&proc->mutex_asynch_rxtx); + pthread_cond_signal(&proc->cond_asynch_rxtx); + + // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices + while (!oai_exit) { + + // these are local subframe/frame counters to check that we are in synch with the fronthaul timing. + // They are set on the first rx/tx in the underly FH routines. + if (subframe==9) { + subframe=0; + frame++; + frame&=1023; + } else { + subframe++; + } + + LOG_D(PHY,"RU thread %p (proc %p), frame %d (%p), subframe %d (%p)\n", + pthread_self(), proc, frame,&frame,subframe,&subframe); + + // synchronization on FH interface, acquire signals/data and block + if (ru->rx_fh) ru->rx_fh(ru,&frame,&subframe); + else AssertFatal(1==0, "No fronthaul interface : eNB->node_function %d",eNB->node_function); + + T(T_ENB_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx), T_INT(proc->subframe_rx)); + /* + // wakeup correct eNB processes + proc_rxtx->subframe_rx = proc->subframe_rx; + proc_rxtx->frame_rx = proc->frame_rx; + proc_rxtx->subframe_tx = (proc->subframe_rx+4)%10; + proc_rxtx->frame_tx = (proc->subframe_rx < 6) ? proc->frame_rx : (proc->frame_rx+1)&1023; + proc_rxtx->timestamp_tx = proc->timestamp_tx; + */ + // At this point, all information for subframe has been received on FH interface + // If this proc is to provide synchronization, do so + wakeup_slaves(proc); + + // wait until eNBs are finished subframe RX n and TX n+4 + + // if (rxtx(eNB,proc_rxtx,"eNB_thread_single") < 0) break; + } + + + printf( "Exiting ru_thread \n"); + + ru_thread_status = 0; + return &ru_thread_status; + +} + +extern void init_fep_thread(PHY_VARS_eNB *, pthread_attr_t *);_ +extern void init_td_thread(PHY_VARS_eNB *, pthread_attr_t *); +extern void init_te_thread(PHY_VARS_eNB *, pthread_attr_t *); + +void init_eNB_proc(int inst) { + + int i; + int CC_id; + PHY_VARS_eNB *eNB; + eNB_proc_t *proc; + eNB_rxtx_proc_t *proc_rxtx; + pthread_attr_t *attr0=NULL,*attr1=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_single=NULL,*attr_fep=NULL,*attr_td=NULL,*attr_te; + + for (CC_id=0; CC_idnode_function],eNB_timing[eNB->node_timing]); + proc = &eNB->proc; + + proc_rxtx = proc->proc_rxtx; + proc_rxtx[0].instance_cnt_rxtx = -1; + proc_rxtx[1].instance_cnt_rxtx = -1; + proc->instance_cnt_prach = -1; + proc->instance_cnt_asynch_rxtx = -1; + proc->CC_id = CC_id; + + proc->first_rx=1; + proc->first_tx=1; + + pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); + pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); + pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL); + pthread_cond_init( &proc_rxtx[1].cond_rxtx, NULL); + + pthread_mutex_init( &proc->mutex_prach, NULL); + pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL); + + pthread_cond_init( &proc->cond_prach, NULL); + pthread_cond_init( &proc->cond_asynch_rxtx, NULL); + + pthread_attr_init( &proc->attr_prach); + pthread_attr_init( &proc->attr_asynch_rxtx); + pthread_attr_init( &proc->attr_single); + pthread_attr_init( &proc->attr_fep); + pthread_attr_init( &proc->attr_td); + pthread_attr_init( &proc->attr_te); + pthread_attr_init( &proc_rxtx[0].attr_rxtx); + pthread_attr_init( &proc_rxtx[1].attr_rxtx); +#ifndef DEADLINE_SCHEDULER + attr0 = &proc_rxtx[0].attr_rxtx; + attr1 = &proc_rxtx[1].attr_rxtx; + attr_prach = &proc->attr_prach; + attr_asynch = &proc->attr_asynch_rxtx; + attr_single = &proc->attr_single; + attr_fep = &proc->attr_fep; + attr_td = &proc->attr_td; + attr_te = &proc->attr_te; +#endif + + if (eNB->single_thread_flag==0) { + pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, &proc_rxtx[0] ); + pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, eNB_thread_rxtx, &proc_rxtx[1] ); + } + else { + pthread_create(&proc->pthread_single, attr_single, eNB_thread_single, &eNB->proc); + init_fep_thread(eNB,attr_fep); + init_td_thread(eNB,attr_td); + init_te_thread(eNB,attr_te); + } + pthread_create( &proc->pthread_prach, attr_prach, eNB_thread_prach, &eNB->proc ); + if ((eNB->node_timing == synch_to_other) || + (eNB->node_function == NGFI_RRU_IF5) || + (eNB->node_function == NGFI_RRU_IF4p5)) + pthread_create( &proc->pthread_asynch_rxtx, attr_asynch, eNB_thread_asynch_rxtx, &eNB->proc ); + + char name[16]; + if (eNB->single_thread_flag == 0) { + snprintf( name, sizeof(name), "RXTX0 %d", i ); + pthread_setname_np( proc_rxtx[0].pthread_rxtx, name ); + snprintf( name, sizeof(name), "RXTX1 %d", i ); + pthread_setname_np( proc_rxtx[1].pthread_rxtx, name ); + } + else { + snprintf( name, sizeof(name), " %d", i ); + pthread_setname_np( proc->pthread_single, name ); + } + } + + //for multiple CCs: setup master and slaves + /* + for (CC_id=0; CC_idnode_timing == synch_to_ext_device) { //master + eNB->proc.num_slaves = MAX_NUM_CCs-1; + eNB->proc.slave_proc = (eNB_proc_t**)malloc(eNB->proc.num_slaves*sizeof(eNB_proc_t*)); + + for (i=0; i< eNB->proc.num_slaves; i++) { + if (i < CC_id) eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i]->proc); + if (i >= CC_id) eNB->proc.slave_proc[i] = &(PHY_vars_eNB_g[inst][i+1]->proc); + } + } + }*/ + + + /* setup PHY proc TX sync mechanism */ + pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL); + pthread_cond_init(&sync_phy_proc.cond_phy_proc_tx, NULL); + sync_phy_proc.phy_proc_CC_id = 0; +} + + + +/*! + * \brief Terminate eNB TX and RX threads. + */ +void kill_eNB_proc(int inst) { + + int *status; + PHY_VARS_eNB *eNB; + eNB_proc_t *proc; + eNB_rxtx_proc_t *proc_rxtx; + for (int CC_id=0; CC_idproc; + proc_rxtx = &proc->proc_rxtx[0]; + +#ifdef DEBUG_THREADS + printf( "Killing TX CC_id %d thread %d\n", CC_id, i ); +#endif + + proc_rxtx[0].instance_cnt_rxtx = 0; // FIXME data race! + proc_rxtx[1].instance_cnt_rxtx = 0; // FIXME data race! + proc->instance_cnt_prach = 0; + pthread_cond_signal( &proc_rxtx[0].cond_rxtx ); + pthread_cond_signal( &proc_rxtx[1].cond_rxtx ); + pthread_cond_signal( &proc->cond_prach ); + pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx); + + pthread_join( proc->pthread_FH, (void**)&status ); + pthread_mutex_destroy( &proc->mutex_FH ); + pthread_cond_destroy( &proc->cond_FH ); + + pthread_join( proc->pthread_prach, (void**)&status ); + pthread_mutex_destroy( &proc->mutex_prach ); + pthread_cond_destroy( &proc->cond_prach ); + + int i; + for (i=0;i<2;i++) { + pthread_join( proc_rxtx[i].pthread_rxtx, (void**)&status ); + pthread_mutex_destroy( &proc_rxtx[i].mutex_rxtx ); + pthread_cond_destroy( &proc_rxtx[i].cond_rxtx ); + } + } +} + + +/* this function maps the phy_vars_eNB tx and rx buffers to the available rf chains. + Each rf chain is is addressed by the card number and the chain on the card. The + rf_map specifies for each CC, on which rf chain the mapping should start. Multiple + antennas are mapped to successive RF chains on the same card. */ +int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg) { + + int i, CC_id; + int j; + + uint16_t N_TA_offset = 0; + + LTE_DL_FRAME_PARMS *frame_parms; + + for (CC_id=0; CC_idframe_parms); + printf("setup_eNB_buffers: frame_parms = %p\n",frame_parms); + } else { + printf("phy_vars_eNB[%d] not initialized\n", CC_id); + return(-1); + } + + if (frame_parms->frame_type == TDD) { + if (frame_parms->N_RB_DL == 100) + N_TA_offset = 624; + else if (frame_parms->N_RB_DL == 50) + N_TA_offset = 624/2; + else if (frame_parms->N_RB_DL == 25) + N_TA_offset = 624/4; + } + + + + if (openair0_cfg[CC_id].mmapped_dma == 1) { + // replace RX signal buffers with mmaped HW versions + + for (i=0; inb_antennas_rx; i++) { + printf("Mapping eNB CC_id %d, rx_ant %d\n",CC_id,i); + free(phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); + phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = openair0_cfg[CC_id].rxbase[i]; + + + + printf("rxdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); + + for (j=0; j<16; j++) { + printf("rxbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->common_vars.rxdata[0][i][j]); + phy_vars_eNB[CC_id]->common_vars.rxdata[0][i][j] = 16-j; + } + } + + for (i=0; inb_antennas_tx; i++) { + printf("Mapping eNB CC_id %d, tx_ant %d\n",CC_id,i); + free(phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); + phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = openair0_cfg[CC_id].txbase[i];//(int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i]; + + printf("txdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); + + for (j=0; j<16; j++) { + printf("txbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->common_vars.txdata[0][i][j]); + phy_vars_eNB[CC_id]->common_vars.txdata[0][i][j] = 16-j; + } + } + } + else { // not memory-mapped DMA + + + rxdata = (int32_t**)malloc16(frame_parms->nb_antennas_rx*sizeof(int32_t*)); + txdata = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); + + for (i=0; inb_antennas_rx; i++) { + free(phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]); + rxdata[i] = (int32_t*)(32 + malloc16(32+frame_parms->samples_per_tti*10*sizeof(int32_t))); // FIXME broken memory allocation + phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = rxdata[i]-N_TA_offset; // N_TA offset for TDD FIXME! N_TA_offset > 16 => access of unallocated memory + memset(rxdata[i], 0, frame_parms->samples_per_tti*10*sizeof(int32_t)); + printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->common_vars.rxdata[0][i],rxdata[i],N_TA_offset); + } + + for (i=0; inb_antennas_tx; i++) { + free(phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); + txdata[i] = (int32_t*)(32 + malloc16(32 + frame_parms->samples_per_tti*10*sizeof(int32_t))); // FIXME broken memory allocation + phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = txdata[i]; + memset(txdata[i],0, frame_parms->samples_per_tti*10*sizeof(int32_t)); + printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->common_vars.txdata[0][i]); + } + } + } + + return(0); +} + + +void reset_opp_meas(void) { + + int sfn; + reset_meas(&softmodem_stats_mt); + reset_meas(&softmodem_stats_hw); + + for (sfn=0; sfn < 10; sfn++) { + reset_meas(&softmodem_stats_rxtx_sf); + reset_meas(&softmodem_stats_rx_sf); + } +} + + +void print_opp_meas(void) { + + int sfn=0; + print_meas(&softmodem_stats_mt, "Main ENB Thread", NULL, NULL); + print_meas(&softmodem_stats_hw, "HW Acquisation", NULL, NULL); + + for (sfn=0; sfn < 10; sfn++) { + print_meas(&softmodem_stats_rxtx_sf,"[eNB][total_phy_proc_rxtx]",NULL, NULL); + print_meas(&softmodem_stats_rx_sf,"[eNB][total_phy_proc_rx]",NULL,NULL); + } +} + +int start_if(PHY_VARS_eNB *eNB) { + return(eNB->ifdevice.trx_start_func(&eNB->ifdevice)); +} + +int start_rf(PHY_VARS_eNB *eNB) { + return(eNB->rfdevice.trx_start_func(&eNB->rfdevice)); +} + +extern void eNB_fep_rru_if5(PHY_VARS_eNB *eNB); +extern void eNB_fep_full(PHY_VARS_eNB *eNB); +extern void eNB_fep_full_2thread(PHY_VARS_eNB *eNB); +extern void do_prach(PHY_VARS_eNB *eNB); + +void init_RU(RAN_CONTEXT *rc, eNB_func_t node_function, RU_if_in_t ru_if_in[], RU_if_timing_t ru_if_timing[], eth_params_t *eth_params) { + + int ru_id; + + for (ru_id=0;ru_idnb_RU;ru_id++) { + ru = &rc.ru_desc[ru_id]; + ru->RU_if_in[ru_id] = ru_if_in[ru_id]; + ru->RU_if_timing = ru_if_timing[ru_id]; + LOG_I(PHY,"Initializing RRU descriptor %d : (%s,%s)\n",ru_id,ru_if_types[ru_if_in[ru_id]],eNB_timing[ru_timing[ru_id]]); + + switch (ru->RU_if_in[ru_id]) { + case LOCAL_RF: // this is an RRU or eNB with integrated RF + if (node_function == NGFI_RRU_IF5) { + ru->do_prach = NULL; // no prach processing + ru->fep_rx = eNB_fep_rru_if5; // need only to do send_IF5 + ru->fep_tx = NULL; // nothing (this is a time-domain signal) + ru->fh_asynch = fh_if5_asynch_DL; // TX packets come asynchronously + ru->start_if = start_if; // need to start the if interface for if5 + ru->ifdevice.host_type = RRH_HOST; + ru->rfdevice.host_type = RRH_HOST; + } + else if (node_function == NGFI_RRU_IF4p5) { + ru->do_prach = do_prach; // IF4p5 needs to do part of prach processing in RRU + ru->fep_rx = ru_fep_full; // this is DFTs + send_IF4p5 + ru->fep_tx = ru_fep_idft; // this is fep with idft only (no precoding in RRU) + ru->fh_asynch = fh_if4p5_asynch_DL; // TX packets come asynchronously + ru->start_if = start_if; // need to start the if interface for if4p5 + ru->ifdevice.host_type = RRH_HOST; + ru->rfdevice.host_type = RRH_HOST; + } + else if (node_function == eNodeB_3GPP) { + ru->do_prach = NULL; // prach is done completely in eNB processing + ru->fep_rx = eNB_fep_full; // this is DFTs only + ru->fep_tx = pc_fep_idft_prec; // this is fep with idft and precoding + ru->fh_asynch = NULL; // no incoming fronthaul + ru->start_if = NULL; // no if interface + ru->rfdevice.host_type = BBU_HOST; + } + ru->rx_fh = rx_rf; // local synchronous RF RX + ru->tx_fh = NULL; // nothing connected directly to radio + ru->start_rf = start_rf; // need to start the local RF interface + + ret = openair0_device_load(&ru->rfdevice, &openair0_cfg[ru_id]); + if (setup_RU_buffers(rc,ru_id,&openair0_cfg[ru_id])!=0) { + printf("Exiting, cannot initialize eNodeB Buffers\n"); + exit(-1); + } + break; + + case REMOTE_IF5: // the remote unit is IF5 RRU + ru->do_prach = NULL; // no prach processing in RU + ru->fep_rx = eNB_fep_full; // this is DFTs + ru->fep_tx = pc_fep_tx_rru_if5; // need to do transmit Precoding + FEP + IF5 fronthaul + if (ru->RU_if_timing == synch_to_other) { + ru->rx_fh = rx_fh_slave; // synchronize to master + ru->tx_fh = tx_fh_if5_mobipass; // use send_IF5 for mobipass + ru->fh_asynch = fh_if5_asynch_UL; // UL is asynchronous + } + else { + ru->tx_fh = tx_fh_if5; // synchronous IF5 transmission + ru->rx_fh = rx_fh_if5; // synchronous IF5 reception + ru->fh_asynch = NULL; // no asynchronous UL + } + ru->start_rf = NULL; // no local RF + ru->start_if = start_if; // need to start if interface for IF5 + ru->fh_asynch = fh_if5_asynch_DL; + ru->ifdevice.host_type = BBU_HOST; + + ret = openair0_transport_load(&ru->ifdevice, &openair0_cfg[ru_id], (eth_params+ru_id)); + printf("openair0_transport_init returns %d for ru_id %d\n",ret,ru_id); + if (ret<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } + break; + + case REMOTE_IF4p5: + ru->do_prach = NULL; // no prach processing in RU + ru->fep_rx = eNB_fep_full; // this is DFTs + ru->fep_tx = proc_tx_high; // need to do transmit Precoding + IF4p5 fronthaul (no IDFTs) + ru->tx_fh = tx_fh_if4p5; // synchronous IF5 transmission + ru->rx_fh = rx_fh_if4p5; // synchronous IF5 reception + ru->fh_asynch = (ru->RU_if_timing == synch_to_other) ? fh_if4p5_asynch_UL : NULL; // asynchronous UL if synch_to_other + + ru->start_rf = NULL; // no local RF + ru->start_if = start_if; // need to start if interface for IF4p5 + ru->fh_asynch = fh_if5_asynch_DL; + ru->ifdevice.host_type = BBU_HOST; + + ret = openair0_transport_load(&ru->ifdevice, &openair0_cfg[ru_id], (eth_params+ru_id)); + printf("openair0_transport_init returns %d for ru_id %d\n",ret,ru_id); + if (ret<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } + + malloc_IF4p5_buffer(eNB); + + break; + + case REMOTE_IF1pp: + LOG_E(PHY,"RU with IF1pp not supported yet\n"); + break; + + } // switch on interface type + + } // for ru_id + + sleep(1); + LOG_D(HW,"[lte-softmodem.c] eNB threads created\n"); + + +} + +void init_RAN(RAN_CONTEXT *rc,eNB_func_t node_function[], eNB_timing_t node_timing[],eth_params_t *eth_params,int single_thread_flag) { + + int CC_id; + int inst; + PHY_VARS_eNB *eNB; + int ret; + + for (inst=0;instnb_inst;inst++) { + for (CC_id=0;CC_idnb_CC;CC_id++) { + eNB = rc->eNB[inst][CC_id]; + if (eNB) { + eNB->node_function = node_function[CC_id]; + eNB->node_timing = node_timing[CC_id]; + eNB->abstraction_flag = 0; + eNB->single_thread_flag = single_thread_flag; + eNB->ts_offset = 0; + LOG_I(PHY,"Initializing eNB %d CC_id %d : (%s,%s)\n",inst,CC_id,eNB_functions[node_function[CC_id]],eNB_timing[node_timing[CC_id]]); + + switch (node_function[CC_id]) { + case NGFI_RRU_IF5: + eNB->td = NULL; + eNB->te = NULL; + eNB->proc_uespec_rx = NULL; + eNB->proc_tx = NULL; + break; + case NGFI_RRU_IF4p5: + eNB->td = NULL; + eNB->te = NULL; + eNB->proc_uespec_rx = NULL; + eNB->proc_tx = NULL;//proc_tx_rru_if4p5; + break; + case eNodeB_3GPP: + eNB->do_prach = do_prach; + eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; + eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; + eNB->proc_tx = proc_tx_full; + break; + case eNodeB_3GPP_BBU: + eNB->do_prach = do_prach; + eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; + eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; + eNB->proc_tx = proc_tx_full; + break; + case NGFI_RCC_IF4p5: + eNB->do_prach = do_prach; + eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; + eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; + eNB->proc_tx = proc_tx_high; + break; + case NGFI_RAU_IF4p5: + eNB->do_prach = do_prach; + eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data; + eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding; + eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX; + eNB->proc_tx = proc_tx_high; + break; + } + // initialize eNB procedure threads if needed + init_eNB_proc(rc,inst); + } + } + } + sleep(1); + LOG_D(HW,"[lte-softmodem.c] eNB threads created\n"); + + +} + + +void stop_eNB(int nb_inst) { + + for (int inst=0;inst. + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + +*******************************************************************************/ + +/*! \file lte-enb.c + * \brief Top-level threads for eNodeB + * \author R. Knopp, F. Kaltenberger, Navid Nikaein + * \date 2012 + * \version 0.1 + * \company Eurecom + * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr + * \note + * \warning + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "rt_wrapper.h" + +#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all + +#include "assertions.h" +#include "msc.h" + +#include "PHY/types.h" + +#include "PHY/defs.h" +#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all + + +#include "../../ARCH/COMMON/common_lib.h" +#include "../../ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h" + +#include "PHY/LTE_TRANSPORT/if4_tools.h" +#include "PHY/LTE_TRANSPORT/if5_tools.h" + +#include "PHY/extern.h" +#include "SCHED/extern.h" +#include "LAYER2/MAC/extern.h" + +#include "../../SIMU/USER/init_lte.h" + +#include "LAYER2/MAC/defs.h" +#include "LAYER2/MAC/extern.h" +#include "LAYER2/MAC/proto.h" +#include "RRC/LITE/extern.h" +#include "PHY_INTERFACE/extern.h" + +#ifdef SMBV +#include "PHY/TOOLS/smbv.h" +unsigned short config_frames[4] = {2,9,11,13}; +#endif +#include "UTIL/LOG/log_extern.h" +#include "UTIL/OTG/otg_tx.h" +#include "UTIL/OTG/otg_externs.h" +#include "UTIL/MATH/oml.h" +#include "UTIL/LOG/vcd_signal_dumper.h" +#include "UTIL/OPT/opt.h" +#include "enb_config.h" +//#include "PHY/TOOLS/time_meas.h" + +#include "ENB_APP/enb_paramdef.h" +#include "common/config/config_userapi.h" + +#ifndef OPENAIR2 +#include "UTIL/OTG/otg_extern.h" +#endif + +#if defined(ENABLE_ITTI) +# if defined(ENABLE_USE_MME) +# include "s1ap_eNB.h" +#ifdef PDCP_USE_NETLINK +# include "SIMULATION/ETH_TRANSPORT/proto.h" +#endif +# endif +#endif + +#include "T.h" + +extern volatile int oai_exit; + + +extern void phy_init_RU(RU_t*); + +void init_RU(char*); +void stop_RU(RU_t *ru); +void do_ru_sync(RU_t *ru); + +void configure_ru(int idx, + void *arg); + +void configure_rru(int idx, + void *arg); + +int attach_rru(RU_t *ru); + +int connect_rau(RU_t *ru); + +extern uint16_t sf_ahead; + +/*************************************************************/ +/* Functions to attach and configure RRU */ + +extern void wait_eNBs(void); + +int attach_rru(RU_t *ru) { + + ssize_t msg_len,len; + RRU_CONFIG_msg_t rru_config_msg; + int received_capabilities=0; + + wait_eNBs(); + // Wait for capabilities + while (received_capabilities==0) { + + memset((void*)&rru_config_msg,0,sizeof(rru_config_msg)); + rru_config_msg.type = RAU_tick; + rru_config_msg.len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE; + LOG_I(PHY,"Sending RAU tick to RRU %d\n",ru->idx); + AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1), + "RU %d cannot access remote radio\n",ru->idx); + + msg_len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_capabilities_t); + + // wait for answer with timeout + if ((len = ru->ifdevice.trx_ctlrecv_func(&ru->ifdevice, + &rru_config_msg, + msg_len))<0) { + LOG_I(PHY,"Waiting for RRU %d\n",ru->idx); + } + else if (rru_config_msg.type == RRU_capabilities) { + AssertFatal(rru_config_msg.len==msg_len,"Received capabilities with incorrect length (%d!=%d)\n",(int)rru_config_msg.len,(int)msg_len); + LOG_I(PHY,"Received capabilities from RRU %d (len %d/%d, num_bands %d,max_pdschReferenceSignalPower %d, max_rxgain %d, nb_tx %d, nb_rx %d)\n",ru->idx, + (int)rru_config_msg.len,(int)msg_len, + ((RRU_capabilities_t*)&rru_config_msg.msg[0])->num_bands, + ((RRU_capabilities_t*)&rru_config_msg.msg[0])->max_pdschReferenceSignalPower[0], + ((RRU_capabilities_t*)&rru_config_msg.msg[0])->max_rxgain[0], + ((RRU_capabilities_t*)&rru_config_msg.msg[0])->nb_tx[0], + ((RRU_capabilities_t*)&rru_config_msg.msg[0])->nb_rx[0]); + received_capabilities=1; + } + else { + LOG_E(PHY,"Received incorrect message %d from RRU %d\n",rru_config_msg.type,ru->idx); + } + } + configure_ru(ru->idx, + (RRU_capabilities_t *)&rru_config_msg.msg[0]); + + rru_config_msg.type = RRU_config; + rru_config_msg.len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_config_t); + LOG_I(PHY,"Sending Configuration to RRU %d (num_bands %d,band0 %d,txfreq %u,rxfreq %u,att_tx %d,att_rx %d,N_RB_DL %d,N_RB_UL %d,3/4FS %d, prach_FO %d, prach_CI %d)\n",ru->idx, + ((RRU_config_t *)&rru_config_msg.msg[0])->num_bands, + ((RRU_config_t *)&rru_config_msg.msg[0])->band_list[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->tx_freq[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->rx_freq[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->att_tx[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->att_rx[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_DL[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_UL[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->threequarter_fs[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->prach_FreqOffset[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->prach_ConfigIndex[0]); + + + AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1), + "RU %d failed send configuration to remote radio\n",ru->idx); + + return 0; +} + +int connect_rau(RU_t *ru) { + + RRU_CONFIG_msg_t rru_config_msg; + ssize_t msg_len; + int tick_received = 0; + int configuration_received = 0; + RRU_capabilities_t *cap; + int i; + int len; + + // wait for RAU_tick + while (tick_received == 0) { + + msg_len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE; + + if ((len = ru->ifdevice.trx_ctlrecv_func(&ru->ifdevice, + &rru_config_msg, + msg_len))<0) { + LOG_I(PHY,"Waiting for RAU\n"); + } + else { + if (rru_config_msg.type == RAU_tick) { + LOG_I(PHY,"Tick received from RAU\n"); + tick_received = 1; + } + else LOG_E(PHY,"Received erroneous message (%d)from RAU, expected RAU_tick\n",rru_config_msg.type); + } + } + + // send capabilities + + rru_config_msg.type = RRU_capabilities; + rru_config_msg.len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_capabilities_t); + cap = (RRU_capabilities_t*)&rru_config_msg.msg[0]; + LOG_I(PHY,"Sending Capabilities (len %d, num_bands %d,max_pdschReferenceSignalPower %d, max_rxgain %d, nb_tx %d, nb_rx %d)\n", + (int)rru_config_msg.len,ru->num_bands,ru->max_pdschReferenceSignalPower,ru->max_rxgain,ru->nb_tx,ru->nb_rx); + switch (ru->function) { + case NGFI_RRU_IF4p5: + cap->FH_fmt = OAI_IF4p5_only; + break; + case NGFI_RRU_IF5: + cap->FH_fmt = OAI_IF5_only; + break; + case MBP_RRU_IF5: + cap->FH_fmt = MBP_IF5; + break; + default: + AssertFatal(1==0,"RU_function is unknown %d\n",RC.ru[0]->function); + break; + } + cap->num_bands = ru->num_bands; + for (i=0;inum_bands;i++) { + LOG_I(PHY,"Band %d: nb_rx %d nb_tx %d pdschReferenceSignalPower %d rxgain %d\n", + ru->band[i],ru->nb_rx,ru->nb_tx,ru->max_pdschReferenceSignalPower,ru->max_rxgain); + cap->band_list[i] = ru->band[i]; + cap->nb_rx[i] = ru->nb_rx; + cap->nb_tx[i] = ru->nb_tx; + cap->max_pdschReferenceSignalPower[i] = ru->max_pdschReferenceSignalPower; + cap->max_rxgain[i] = ru->max_rxgain; + } + AssertFatal((ru->ifdevice.trx_ctlsend_func(&ru->ifdevice,&rru_config_msg,rru_config_msg.len)!=-1), + "RU %d failed send capabilities to RAU\n",ru->idx); + + // wait for configuration + rru_config_msg.len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_config_t); + while (configuration_received == 0) { + + if ((len = ru->ifdevice.trx_ctlrecv_func(&ru->ifdevice, + &rru_config_msg, + rru_config_msg.len))<0) { + LOG_I(PHY,"Waiting for configuration from RAU\n"); + } + else { + LOG_I(PHY,"Configuration received from RAU (num_bands %d,band0 %d,txfreq %u,rxfreq %u,att_tx %d,att_rx %d,N_RB_DL %d,N_RB_UL %d,3/4FS %d, prach_FO %d, prach_CI %d)\n", + ((RRU_config_t *)&rru_config_msg.msg[0])->num_bands, + ((RRU_config_t *)&rru_config_msg.msg[0])->band_list[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->tx_freq[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->rx_freq[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->att_tx[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->att_rx[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_DL[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->N_RB_UL[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->threequarter_fs[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->prach_FreqOffset[0], + ((RRU_config_t *)&rru_config_msg.msg[0])->prach_ConfigIndex[0]); + + configure_rru(ru->idx, + (void*)&rru_config_msg.msg[0]); + configuration_received = 1; + } + } + return 0; +} +/*************************************************************/ +/* Southbound Fronthaul functions, RCC/RAU */ + +// southbound IF5 fronthaul for 16-bit OAI format +static inline void fh_if5_south_out(RU_t *ru) { + if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff ); + send_IF5(ru, ru->proc.timestamp_tx, ru->proc.subframe_tx, &ru->seqno, IF5_RRH_GW_DL); +} + +// southbound IF5 fronthaul for Mobipass packet format +static inline void fh_if5_mobipass_south_out(RU_t *ru) { + if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff ); + send_IF5(ru, ru->proc.timestamp_tx, ru->proc.subframe_tx, &ru->seqno, IF5_MOBIPASS); +} + +// southbound IF4p5 fronthaul +static inline void fh_if4p5_south_out(RU_t *ru) { + if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff ); + LOG_D(PHY,"Sending IF4p5 for frame %d subframe %d\n",ru->proc.frame_tx,ru->proc.subframe_tx); + if (subframe_select(&ru->frame_parms,ru->proc.subframe_tx)!=SF_UL) + send_IF4p5(ru,ru->proc.frame_tx, ru->proc.subframe_tx, IF4p5_PDLFFT); +} + +/*************************************************************/ +/* Input Fronthaul from south RCC/RAU */ + +// Synchronous if5 from south +void fh_if5_south_in(RU_t *ru,int *frame, int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + RU_proc_t *proc = &ru->proc; + + recv_IF5(ru, &proc->timestamp_rx, *subframe, IF5_RRH_GW_UL); + + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + + if (proc->first_rx == 0) { + if (proc->subframe_rx != *subframe){ + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,*subframe); + exit_fun("Exiting"); + } + + if (proc->frame_rx != *frame) { + LOG_E(PHY,"Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,*frame); + exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; + } + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + +} + +// Synchronous if4p5 from south +void fh_if4p5_south_in(RU_t *ru,int *frame,int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + RU_proc_t *proc = &ru->proc; + int f,sf; + + + uint16_t packet_type; + uint32_t symbol_number=0; + uint32_t symbol_mask_full; + + if ((fp->frame_type == TDD) && (subframe_select(fp,*subframe)==SF_S)) + symbol_mask_full = (1<ul_symbols_in_S_subframe)-1; + else + symbol_mask_full = (1<symbols_per_tti)-1; + + AssertFatal(proc->symbol_mask[*subframe]==0,"rx_fh_if4p5: proc->symbol_mask[%d] = %x\n",*subframe,proc->symbol_mask[*subframe]); + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! + recv_IF4p5(ru, &f, &sf, &packet_type, &symbol_number); + + if (packet_type == IF4p5_PULFFT) proc->symbol_mask[sf] = proc->symbol_mask[sf] | (1<first_rx==0) && (f!=*frame)) LOG_E(PHY,"rx_fh_if4p5: PULTICK received frame %d != expected %d\n",f,*frame); + if ((proc->first_rx==0) && (sf!=*subframe)) LOG_E(PHY,"rx_fh_if4p5: PULTICK received subframe %d != expected %d (first_rx %d)\n",sf,*subframe,proc->first_rx); + break; + + } else if (packet_type == IF4p5_PRACH) { + // nothing in RU for RAU + } + LOG_D(PHY,"rx_fh_if4p5: subframe %d symbol mask %x\n",*subframe,proc->symbol_mask[*subframe]); + } while(proc->symbol_mask[*subframe] != symbol_mask_full); + + //caculate timestamp_rx, timestamp_tx based on frame and subframe + proc->subframe_rx = sf; + proc->frame_rx = f; + proc->timestamp_rx = ((proc->frame_rx * 10) + proc->subframe_rx ) * fp->samples_per_tti ; + // proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); + proc->subframe_tx = (sf+sf_ahead)%10; + proc->frame_tx = (sf>(9-sf_ahead)) ? (f+1)&1023 : f; + + if (proc->first_rx == 0) { + if (proc->subframe_rx != *subframe){ + LOG_E(PHY,"Received Timestamp (IF4p5) doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",proc->subframe_rx,*subframe); + exit_fun("Exiting"); + } + if (proc->frame_rx != *frame) { + LOG_E(PHY,"Received Timestamp (IF4p5) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",proc->frame_rx,*frame); + exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; + } + + if (ru == RC.ru[0]) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_RU, f ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_RU, sf ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, proc->frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_RU, proc->subframe_tx ); + } + + proc->symbol_mask[sf] = 0; + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + LOG_D(PHY,"RU %d: fh_if4p5_south_in sleeping ...\n",ru->idx); + usleep(100); +} + +// Dummy FH from south for getting synchronization from master RU +void fh_slave_south_in(RU_t *ru,int *frame,int *subframe) { + // This case is for synchronization to another thread + // it just waits for an external event. The actual rx_fh is handle by the asynchronous RX thread + RU_proc_t *proc=&ru->proc; + + if (wait_on_condition(&proc->mutex_FH,&proc->cond_FH,&proc->instance_cnt_FH,"fh_slave_south_in") < 0) + return; + + release_thread(&proc->mutex_FH,&proc->instance_cnt_FH,"rx_fh_slave_south_in"); + + +} + +// asynchronous inbound if5 fronthaul from south (Mobipass) +void fh_if5_south_asynch_in_mobipass(RU_t *ru,int *frame,int *subframe) { + + RU_proc_t *proc = &ru->proc; + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + + recv_IF5(ru, &proc->timestamp_rx, *subframe, IF5_MOBIPASS); + pthread_mutex_lock(&proc->mutex_asynch_rxtx); + int offset_mobipass = 40120; + pthread_mutex_lock(&proc->mutex_asynch_rxtx); + proc->subframe_rx = ((proc->timestamp_rx-offset_mobipass)/fp->samples_per_tti)%10; + proc->frame_rx = ((proc->timestamp_rx-offset_mobipass)/(fp->samples_per_tti*10))&1023; + + proc->subframe_rx = (proc->timestamp_rx/fp->samples_per_tti)%10; + proc->frame_rx = (proc->timestamp_rx/(10*fp->samples_per_tti))&1023; + + if (proc->first_rx == 1) { + proc->first_rx =2; + *subframe = proc->subframe_rx; + *frame = proc->frame_rx; + LOG_E(PHY,"[Mobipass]timestamp_rx:%llu, frame_rx %d, subframe: %d\n",(unsigned long long int)proc->timestamp_rx,proc->frame_rx,proc->subframe_rx); + } + else { + if (proc->subframe_rx != *subframe) { + proc->first_rx++; + LOG_E(PHY,"[Mobipass]timestamp:%llu, subframe_rx %d is not what we expect %d, first_rx:%d\n",(unsigned long long int)proc->timestamp_rx, proc->subframe_rx,*subframe, proc->first_rx); + //exit_fun("Exiting"); + } + if (proc->frame_rx != *frame) { + proc->first_rx++; + LOG_E(PHY,"[Mobipass]timestamp:%llu, frame_rx %d is not what we expect %d, first_rx:%d\n",(unsigned long long int)proc->timestamp_rx,proc->frame_rx,*frame, proc->first_rx); + // exit_fun("Exiting"); + } + // temporary solution + *subframe = proc->subframe_rx; + *frame = proc->frame_rx; + } + + pthread_mutex_unlock(&proc->mutex_asynch_rxtx); + + +} // eNodeB_3GPP_BBU + +// asynchronous inbound if4p5 fronthaul from south +void fh_if4p5_south_asynch_in(RU_t *ru,int *frame,int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + RU_proc_t *proc = &ru->proc; + + uint16_t packet_type; + uint32_t symbol_number,symbol_mask,prach_rx; + uint32_t got_prach_info=0; + + symbol_number = 0; + symbol_mask = (1<symbols_per_tti)-1; + prach_rx = 0; + + do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! + recv_IF4p5(ru, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number); + // grab first prach information for this new subframe + if (got_prach_info==0) { + prach_rx = is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx); + got_prach_info = 1; + } + if (proc->first_rx != 0) { + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; + proc->first_rx = 0; + } + else { + if (proc->frame_rx != *frame) { + LOG_E(PHY,"frame_rx %d is not what we expect %d\n",proc->frame_rx,*frame); + exit_fun("Exiting"); + } + if (proc->subframe_rx != *subframe) { + LOG_E(PHY,"subframe_rx %d is not what we expect %d\n",proc->subframe_rx,*subframe); + exit_fun("Exiting"); + } + } + if (packet_type == IF4p5_PULFFT) symbol_mask &= (~(1< 0) || (prach_rx >0)); // haven't received all PUSCH symbols and PRACH information +} + + + + + +/*************************************************************/ +/* Input Fronthaul from North RRU */ + +// RRU IF4p5 TX fronthaul receiver. Assumes an if_device on input and if or rf device on output +// receives one subframe's worth of IF4p5 OFDM symbols and OFDM modulates +void fh_if4p5_north_in(RU_t *ru,int *frame,int *subframe) { + + uint32_t symbol_number=0; + uint32_t symbol_mask, symbol_mask_full; + uint16_t packet_type; + + + /// **** incoming IF4p5 from remote RCC/RAU **** /// + symbol_number = 0; + symbol_mask = 0; + symbol_mask_full = (1<frame_parms.symbols_per_tti)-1; + + do { + recv_IF4p5(ru, frame, subframe, &packet_type, &symbol_number); + symbol_mask = symbol_mask | (1<frame_parms; + RU_proc_t *proc = &ru->proc; + int subframe_tx,frame_tx; + openair0_timestamp timestamp_tx; + + recv_IF5(ru, ×tamp_tx, *subframe, IF5_RRH_GW_DL); + // printf("Received subframe %d (TS %llu) from RCC\n",subframe_tx,timestamp_tx); + + subframe_tx = (timestamp_tx/fp->samples_per_tti)%10; + frame_tx = (timestamp_tx/(fp->samples_per_tti*10))&1023; + + if (proc->first_tx != 0) { + *subframe = subframe_tx; + *frame = frame_tx; + proc->first_tx = 0; + } + else { + AssertFatal(subframe_tx == *subframe, + "subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); + AssertFatal(frame_tx == *frame, + "frame_tx %d is not what we expect %d\n",frame_tx,*frame); + } +} + +void fh_if4p5_north_asynch_in(RU_t *ru,int *frame,int *subframe) { + + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + RU_proc_t *proc = &ru->proc; + + uint16_t packet_type; + uint32_t symbol_number,symbol_mask,symbol_mask_full; + int subframe_tx,frame_tx; + + LOG_D(PHY, "%s(ru:%p frame, subframe)\n", __FUNCTION__, ru); + symbol_number = 0; + symbol_mask = 0; + symbol_mask_full = ((subframe_select(fp,*subframe) == SF_S) ? (1<dl_symbols_in_S_subframe) : (1<symbols_per_tti))-1; + do { + recv_IF4p5(ru, &frame_tx, &subframe_tx, &packet_type, &symbol_number); + if ((subframe_select(fp,subframe_tx) == SF_DL) && (symbol_number == 0)) start_meas(&ru->rx_fhaul); + LOG_D(PHY,"subframe %d (%d): frame %d, subframe %d, symbol %d\n", + *subframe,subframe_select(fp,*subframe),frame_tx,subframe_tx,symbol_number); + if (proc->first_tx != 0) { + *frame = frame_tx; + *subframe = subframe_tx; + proc->first_tx = 0; + symbol_mask_full = ((subframe_select(fp,*subframe) == SF_S) ? (1<dl_symbols_in_S_subframe) : (1<symbols_per_tti))-1; + } + else { + AssertFatal(frame_tx == *frame, + "frame_tx %d is not what we expect %d\n",frame_tx,*frame); + AssertFatal(subframe_tx == *subframe, + "subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe); + } + if (packet_type == IF4p5_PDLFFT) { + symbol_mask = symbol_mask | (1<rx_fhaul); + + proc->subframe_tx = subframe_tx; + proc->frame_tx = frame_tx; + + if ((frame_tx == 0)&&(subframe_tx == 0)) proc->frame_tx_unwrap += 1024; + + proc->timestamp_tx = ((((uint64_t)frame_tx + (uint64_t)proc->frame_tx_unwrap) * 10) + (uint64_t)subframe_tx) * (uint64_t)fp->samples_per_tti; + + LOG_D(PHY,"RU %d/%d TST %llu, frame %d, subframe %d\n",ru->idx,0,(long long unsigned int)proc->timestamp_tx,frame_tx,subframe_tx); + // dump VCD output for first RU in list + if (ru == RC.ru[0]) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_RU, subframe_tx ); + } + + if (ru->feptx_ofdm) ru->feptx_ofdm(ru); + if (ru->fh_south_out) ru->fh_south_out(ru); +} + +void fh_if5_north_out(RU_t *ru) { + + RU_proc_t *proc=&ru->proc; + uint8_t seqno=0; + + /// **** send_IF5 of rxdata to BBU **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); + send_IF5(ru, proc->timestamp_rx, proc->subframe_rx, &seqno, IF5_RRH_GW_UL); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); + +} + +// RRU IF4p5 northbound interface (RX) +void fh_if4p5_north_out(RU_t *ru) { + + RU_proc_t *proc=&ru->proc; + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + const int subframe = proc->subframe_rx; + if (ru->idx==0) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_RU, proc->subframe_rx ); + + if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) { + /// **** in TDD during DL send_IF4 of ULTICK to RCC **** /// + send_IF4p5(ru, proc->frame_rx, proc->subframe_rx, IF4p5_PULTICK); + return; + } + + start_meas(&ru->tx_fhaul); + send_IF4p5(ru, proc->frame_rx, proc->subframe_rx, IF4p5_PULFFT); + stop_meas(&ru->tx_fhaul); + +} + +void rx_rf(RU_t *ru,int *frame,int *subframe) { + + RU_proc_t *proc = &ru->proc; + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + void *rxp[ru->nb_rx]; + unsigned int rxs; + int i; + openair0_timestamp ts,old_ts; + + for (i=0; inb_rx; i++) + rxp[i] = (void*)&ru->common.rxdata[i][*subframe*fp->samples_per_tti]; + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + + old_ts = proc->timestamp_rx; + + rxs = ru->rfdevice.trx_read_func(&ru->rfdevice, + &ts, + rxp, + fp->samples_per_tti, + ru->nb_rx); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); + + proc->timestamp_rx = ts-ru->ts_offset; + + //AssertFatal(rxs == fp->samples_per_tti, + //"rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs); + if (rxs != fp->samples_per_tti) LOG_E(PHY, "rx_rf: Asked for %d samples, got %d from USRP\n",fp->samples_per_tti,rxs); + + if (proc->first_rx == 1) { + ru->ts_offset = proc->timestamp_rx; + proc->timestamp_rx = 0; + } + else { + if (proc->timestamp_rx - old_ts != fp->samples_per_tti) { + LOG_I(PHY,"rx_rf: rfdevice timing drift of %"PRId64" samples (ts_off %"PRId64")\n",proc->timestamp_rx - old_ts - fp->samples_per_tti,ru->ts_offset); + ru->ts_offset += (proc->timestamp_rx - old_ts - fp->samples_per_tti); + proc->timestamp_rx = ts-ru->ts_offset; + } + + } + proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023; + proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10; + // synchronize first reception to frame 0 subframe 0 + + proc->timestamp_tx = proc->timestamp_rx+(sf_ahead*fp->samples_per_tti); + proc->subframe_tx = (proc->subframe_rx+sf_ahead)%10; + proc->frame_tx = (proc->subframe_rx>(9-sf_ahead)) ? (proc->frame_rx+1)&1023 : proc->frame_rx; + + LOG_D(PHY,"RU %d/%d TS %llu (off %d), frame %d, subframe %d\n", + ru->idx, + 0, + (unsigned long long int)proc->timestamp_rx, + (int)ru->ts_offset,proc->frame_rx,proc->subframe_rx); + + // dump VCD output for first RU in list + if (ru == RC.ru[0]) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_RU, proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_RU, proc->subframe_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, proc->frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_RU, proc->subframe_tx ); + } + + if (proc->first_rx == 0) { + if (proc->subframe_rx != *subframe){ + LOG_E(PHY,"Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d)\n",(long long unsigned int)proc->timestamp_rx,proc->subframe_rx,*subframe); + exit_fun("Exiting"); + } + + if (proc->frame_rx != *frame) { + LOG_E(PHY,"Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d)\n",(long long unsigned int)proc->timestamp_rx,proc->frame_rx,*frame); + exit_fun("Exiting"); + } + } else { + proc->first_rx = 0; + *frame = proc->frame_rx; + *subframe = proc->subframe_rx; + } + + //printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",ru->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe); + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); + + if (rxs != fp->samples_per_tti) + { + //exit_fun( "problem receiving samples" ); + LOG_E(PHY, "problem receiving samples"); + } +} + + +void tx_rf(RU_t *ru) { + + RU_proc_t *proc = &ru->proc; + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + void *txp[ru->nb_tx]; + unsigned int txs; + int i; + + T(T_ENB_PHY_OUTPUT_SIGNAL, T_INT(0), T_INT(0), T_INT(proc->frame_tx), T_INT(proc->subframe_tx), + T_INT(0), T_BUFFER(&ru->common.txdata[0][proc->subframe_tx * fp->samples_per_tti], fp->samples_per_tti * 4)); + + lte_subframe_t SF_type = subframe_select(fp,proc->subframe_tx%10); + lte_subframe_t prevSF_type = subframe_select(fp,(proc->subframe_tx+9)%10); + lte_subframe_t nextSF_type = subframe_select(fp,(proc->subframe_tx+1)%10); + int sf_extension = 0; + + if ((SF_type == SF_DL) || + (SF_type == SF_S)) { + + int siglen=fp->samples_per_tti,flags=1; + + if (SF_type == SF_S) { + siglen = fp->dl_symbols_in_S_subframe*(fp->ofdm_symbol_size+fp->nb_prefix_samples0); + flags=3; // end of burst + } + if ((fp->frame_type == TDD) && + (SF_type == SF_DL)&& + (prevSF_type == SF_UL) && + (nextSF_type == SF_DL)) { + flags = 2; // start of burst + sf_extension = ru->N_TA_offset<<1; + } + + if ((fp->frame_type == TDD) && + (SF_type == SF_DL)&& + (prevSF_type == SF_UL) && + (nextSF_type == SF_UL)) { + flags = 4; // start of burst and end of burst (only one DL SF between two UL) + sf_extension = ru->N_TA_offset<<1; + } + + for (i=0; inb_tx; i++) + txp[i] = (void*)&ru->common.txdata[i][(proc->subframe_tx*fp->samples_per_tti)-sf_extension]; + + + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-ru->openair0_cfg.tx_sample_advance)&0xffffffff ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // prepare tx buffer pointers + + txs = ru->rfdevice.trx_write_func(&ru->rfdevice, + proc->timestamp_tx+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension, + txp, + siglen+sf_extension, + ru->nb_tx, + flags); + + LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, subframe %d\n",ru->idx, + (long long unsigned int)proc->timestamp_tx,proc->frame_tx,proc->frame_tx_unwrap,proc->subframe_tx); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + + + AssertFatal(txs == siglen+sf_extension,"TX : Timeout (sent %d/%d)\n",txs, siglen); + + } +} + + +/*! + * \brief The Asynchronous RX/TX FH thread of RAU/RCC/eNB/RRU. + * This handles the RX FH for an asynchronous RRU/UE + * \param param is a \ref eNB_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +static void* ru_thread_asynch_rxtx( void* param ) { + + static int ru_thread_asynch_rxtx_status; + + RU_t *ru = (RU_t*)param; + RU_proc_t *proc = &ru->proc; + + + + int subframe=0, frame=0; + + thread_top_init("ru_thread_asynch_rxtx",1,870000L,1000000L,1000000L); + + // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe + + wait_sync("ru_thread_asynch_rxtx"); + + // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe + printf( "waiting for devices (ru_thread_asynch_rx)\n"); + + wait_on_condition(&proc->mutex_asynch_rxtx,&proc->cond_asynch_rxtx,&proc->instance_cnt_asynch_rxtx,"thread_asynch"); + + printf( "devices ok (ru_thread_asynch_rx)\n"); + + + while (!oai_exit) { + + if (oai_exit) break; + + if (subframe==9) { + subframe=0; + frame++; + frame&=1023; + } else { + subframe++; + } + LOG_D(PHY,"ru_thread_asynch_rxtx: Waiting on incoming fronthaul\n"); + // asynchronous receive from south (Mobipass) + if (ru->fh_south_asynch_in) ru->fh_south_asynch_in(ru,&frame,&subframe); + // asynchronous receive from north (RRU IF4/IF5) + else if (ru->fh_north_asynch_in) { + if (subframe_select(&ru->frame_parms,subframe)!=SF_UL) + ru->fh_north_asynch_in(ru,&frame,&subframe); + } + else AssertFatal(1==0,"Unknown function in ru_thread_asynch_rxtx\n"); + } + + ru_thread_asynch_rxtx_status=0; + return(&ru_thread_asynch_rxtx_status); +} + + + + +void wakeup_slaves(RU_proc_t *proc) { + + int i; + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + for (i=0;inum_slaves;i++) { + RU_proc_t *slave_proc = proc->slave_proc[i]; + // wake up slave FH thread + // lock the FH mutex and make sure the thread is ready + if (pthread_mutex_timedlock(&slave_proc->mutex_FH,&wait) != 0) { + LOG_E( PHY, "ERROR pthread_mutex_lock for RU %d slave %d (IC %d)\n",proc->ru->idx,slave_proc->ru->idx,slave_proc->instance_cnt_FH); + exit_fun( "error locking mutex_rxtx" ); + break; + } + + int cnt_slave = ++slave_proc->instance_cnt_FH; + slave_proc->frame_rx = proc->frame_rx; + slave_proc->subframe_rx = proc->subframe_rx; + slave_proc->timestamp_rx = proc->timestamp_rx; + slave_proc->timestamp_tx = proc->timestamp_tx; + + pthread_mutex_unlock( &slave_proc->mutex_FH ); + + if (cnt_slave == 0) { + // the thread was presumably waiting where it should and can now be woken up + if (pthread_cond_signal(&slave_proc->cond_FH) != 0) { + LOG_E( PHY, "ERROR pthread_cond_signal for RU %d, slave RU %d\n",proc->ru->idx,slave_proc->ru->idx); + exit_fun( "ERROR pthread_cond_signal" ); + break; + } + } else { + LOG_W( PHY,"[RU] Frame %d, slave %d thread busy!! (cnt_FH %i)\n",slave_proc->frame_rx,slave_proc->ru->idx, cnt_slave); + exit_fun( "FH thread busy" ); + break; + } + } +} + +/*! + * \brief The prach receive thread of RU. + * \param param is a \ref RU_proc_t structure which contains the info what to process. + * \returns a pointer to an int. The storage is not on the heap and must not be freed. + */ +static void* ru_thread_prach( void* param ) { + + static int ru_thread_prach_status; + + RU_t *ru = (RU_t*)param; + RU_proc_t *proc = (RU_proc_t*)&ru->proc; + + // set default return value + ru_thread_prach_status = 0; + + thread_top_init("ru_thread_prach",1,500000L,1000000L,20000000L); + + while (RC.ru_mask>0) { + usleep(1e6); + LOG_I(PHY,"%s() RACH waiting for RU to be configured\n", __FUNCTION__); + } + LOG_I(PHY,"%s() RU configured - RACH processing thread running\n", __FUNCTION__); + + while (!oai_exit) { + + if (oai_exit) break; + if (wait_on_condition(&proc->mutex_prach,&proc->cond_prach,&proc->instance_cnt_prach,"ru_prach_thread") < 0) break; + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 1 ); + if (ru->eNB_list[0]){ + prach_procedures( + ru->eNB_list[0] +#ifdef Rel14 + ,0 +#endif + ); + } + else { + rx_prach(NULL, + ru, + NULL, + NULL, + NULL, + proc->frame_prach, + 0 +#ifdef Rel14 + ,0 +#endif + ); + } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 0 ); + if (release_thread(&proc->mutex_prach,&proc->instance_cnt_prach,"ru_prach_thread") < 0) break; + } + + LOG_I(PHY, "Exiting RU thread PRACH\n"); + + ru_thread_prach_status = 0; + return &ru_thread_prach_status; +} + +#ifdef Rel14 +static void* ru_thread_prach_br( void* param ) { + + static int ru_thread_prach_status; + + RU_t *ru = (RU_t*)param; + RU_proc_t *proc = (RU_proc_t*)&ru->proc; + + // set default return value + ru_thread_prach_status = 0; + + thread_top_init("ru_thread_prach_br",1,500000L,1000000L,20000000L); + + while (!oai_exit) { + + if (oai_exit) break; + if (wait_on_condition(&proc->mutex_prach_br,&proc->cond_prach_br,&proc->instance_cnt_prach_br,"ru_prach_thread_br") < 0) break; + rx_prach(NULL, + ru, + NULL, + NULL, + NULL, + proc->frame_prach_br, + 0, + 1); + if (release_thread(&proc->mutex_prach_br,&proc->instance_cnt_prach_br,"ru_prach_thread_br") < 0) break; + } + + LOG_I(PHY, "Exiting RU thread PRACH BR\n"); + + ru_thread_prach_status = 0; + return &ru_thread_prach_status; +} +#endif + +int wakeup_synch(RU_t *ru){ + + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + // wake up synch thread + // lock the synch mutex and make sure the thread is ready + if (pthread_mutex_timedlock(&ru->proc.mutex_synch,&wait) != 0) { + LOG_E( PHY, "[RU] ERROR pthread_mutex_lock for RU synch thread (IC %d)\n", ru->proc.instance_cnt_synch ); + exit_fun( "error locking mutex_synch" ); + return(-1); + } + + ++ru->proc.instance_cnt_synch; + + // the thread can now be woken up + if (pthread_cond_signal(&ru->proc.cond_synch) != 0) { + LOG_E( PHY, "[RU] ERROR pthread_cond_signal for RU synch thread\n"); + exit_fun( "ERROR pthread_cond_signal" ); + return(-1); + } + + pthread_mutex_unlock( &ru->proc.mutex_synch ); + + return(0); +} + +void do_ru_synch(RU_t *ru) { + + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + RU_proc_t *proc = &ru->proc; + int i; + void *rxp[2],*rxp2[2]; + int32_t dummy_rx[ru->nb_rx][fp->samples_per_tti] __attribute__((aligned(32))); + int rxs; + int ic; + + // initialize the synchronization buffer to the common_vars.rxdata + for (int i=0;inb_rx;i++) + rxp[i] = &ru->common.rxdata[i][0]; + + double temp_freq1 = ru->rfdevice.openair0_cfg->rx_freq[0]; + double temp_freq2 = ru->rfdevice.openair0_cfg->tx_freq[0]; + for (i=0;i<4;i++) { + ru->rfdevice.openair0_cfg->rx_freq[i] = ru->rfdevice.openair0_cfg->tx_freq[i]; + ru->rfdevice.openair0_cfg->tx_freq[i] = temp_freq1; + } + ru->rfdevice.trx_set_freq_func(&ru->rfdevice,ru->rfdevice.openair0_cfg,0); + + while ((ru->in_synch ==0)&&(!oai_exit)) { + // read in frame + rxs = ru->rfdevice.trx_read_func(&ru->rfdevice, + &(proc->timestamp_rx), + rxp, + fp->samples_per_tti*10, + ru->nb_rx); + if (rxs != fp->samples_per_tti*10) LOG_E(PHY,"requested %d samples, got %d\n",fp->samples_per_tti*10,rxs); + + // wakeup synchronization processing thread + wakeup_synch(ru); + ic=0; + + while ((ic>=0)&&(!oai_exit)) { + // continuously read in frames, 1ms at a time, + // until we are done with the synchronization procedure + + for (i=0; inb_rx; i++) + rxp2[i] = (void*)&dummy_rx[i][0]; + for (i=0;i<10;i++) + rxs = ru->rfdevice.trx_read_func(&ru->rfdevice, + &(proc->timestamp_rx), + rxp2, + fp->samples_per_tti, + ru->nb_rx); + pthread_mutex_lock(&ru->proc.mutex_synch); + ic = ru->proc.instance_cnt_synch; + pthread_mutex_unlock(&ru->proc.mutex_synch); + } // ic>=0 + } // in_synch==0 + // read in rx_offset samples + LOG_I(PHY,"Resynchronizing by %d samples\n",ru->rx_offset); + rxs = ru->rfdevice.trx_read_func(&ru->rfdevice, + &(proc->timestamp_rx), + rxp, + ru->rx_offset, + ru->nb_rx); + for (i=0;i<4;i++) { + ru->rfdevice.openair0_cfg->rx_freq[i] = temp_freq1; + ru->rfdevice.openair0_cfg->tx_freq[i] = temp_freq2; + } + + ru->rfdevice.trx_set_freq_func(&ru->rfdevice,ru->rfdevice.openair0_cfg,0); + +} + + + +void wakeup_eNBs(RU_t *ru) { + + int i; + PHY_VARS_eNB **eNB_list = ru->eNB_list; + + LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d ru->eNB_top:%p\n",ru->num_eNB,ru->idx, ru->eNB_top); + + if (ru->num_eNB==1 && ru->eNB_top!=0) { + // call eNB function directly + + char string[20]; + sprintf(string,"Incoming RU %d",ru->idx); + LOG_D(PHY,"RU %d Call eNB_top\n",ru->idx); + ru->eNB_top(eNB_list[0],ru->proc.frame_rx,ru->proc.subframe_rx,string); + } + else { + + LOG_D(PHY,"ru->num_eNB:%d\n", ru->num_eNB); + + for (i=0;inum_eNB;i++) + { + LOG_D(PHY,"ru->wakeup_rxtx:%p\n", ru->wakeup_rxtx); + + if (ru->wakeup_rxtx!=0 && ru->wakeup_rxtx(eNB_list[i],ru) < 0) + { + LOG_E(PHY,"could not wakeup eNB rxtx process for subframe %d\n", ru->proc.subframe_rx); + } + } + } +} + +static inline int wakeup_prach_ru(RU_t *ru) { + + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + if (pthread_mutex_timedlock(&ru->proc.mutex_prach,&wait) !=0) { + LOG_E( PHY, "[RU] ERROR pthread_mutex_lock for RU prach thread (IC %d)\n", ru->proc.instance_cnt_prach); + exit_fun( "error locking mutex_rxtx" ); + return(-1); + } + if (ru->proc.instance_cnt_prach==-1) { + ++ru->proc.instance_cnt_prach; + ru->proc.frame_prach = ru->proc.frame_rx; + ru->proc.subframe_prach = ru->proc.subframe_rx; + + // DJP - think prach_procedures() is looking at eNB frame_prach + if (ru->eNB_list[0]) { + ru->eNB_list[0]->proc.frame_prach = ru->proc.frame_rx; + ru->eNB_list[0]->proc.subframe_prach = ru->proc.subframe_rx; + } + LOG_I(PHY,"RU %d: waking up PRACH thread\n",ru->idx); + // the thread can now be woken up + AssertFatal(pthread_cond_signal(&ru->proc.cond_prach) == 0, "ERROR pthread_cond_signal for RU prach thread\n"); + } + else LOG_W(PHY,"RU prach thread busy, skipping\n"); + pthread_mutex_unlock( &ru->proc.mutex_prach ); + + return(0); +} + +#ifdef Rel14 +static inline int wakeup_prach_ru_br(RU_t *ru) { + + struct timespec wait; + + wait.tv_sec=0; + wait.tv_nsec=5000000L; + + if (pthread_mutex_timedlock(&ru->proc.mutex_prach_br,&wait) !=0) { + LOG_E( PHY, "[RU] ERROR pthread_mutex_lock for RU prach thread BR (IC %d)\n", ru->proc.instance_cnt_prach_br); + exit_fun( "error locking mutex_rxtx" ); + return(-1); + } + if (ru->proc.instance_cnt_prach_br==-1) { + ++ru->proc.instance_cnt_prach_br; + ru->proc.frame_prach_br = ru->proc.frame_rx; + ru->proc.subframe_prach_br = ru->proc.subframe_rx; + + LOG_D(PHY,"RU %d: waking up PRACH thread\n",ru->idx); + // the thread can now be woken up + AssertFatal(pthread_cond_signal(&ru->proc.cond_prach_br) == 0, "ERROR pthread_cond_signal for RU prach thread BR\n"); + } + else LOG_W(PHY,"RU prach thread busy, skipping\n"); + pthread_mutex_unlock( &ru->proc.mutex_prach_br ); + + return(0); +} +#endif + +// this is for RU with local RF unit +void fill_rf_config(RU_t *ru, char *rf_config_file) { + + int i; + + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + openair0_config_t *cfg = &ru->openair0_cfg; + + if(fp->N_RB_DL == 100) { + if (fp->threequarter_fs) { + cfg->sample_rate=23.04e6; + cfg->samples_per_frame = 230400; + cfg->tx_bw = 10e6; + cfg->rx_bw = 10e6; + } + else { + cfg->sample_rate=30.72e6; + cfg->samples_per_frame = 307200; + cfg->tx_bw = 10e6; + cfg->rx_bw = 10e6; + } + } else if(fp->N_RB_DL == 50) { + cfg->sample_rate=15.36e6; + cfg->samples_per_frame = 153600; + cfg->tx_bw = 5e6; + cfg->rx_bw = 5e6; + } else if (fp->N_RB_DL == 25) { + cfg->sample_rate=7.68e6; + cfg->samples_per_frame = 76800; + cfg->tx_bw = 2.5e6; + cfg->rx_bw = 2.5e6; + } else if (fp->N_RB_DL == 6) { + cfg->sample_rate=1.92e6; + cfg->samples_per_frame = 19200; + cfg->tx_bw = 1.5e6; + cfg->rx_bw = 1.5e6; + } + else AssertFatal(1==0,"Unknown N_RB_DL %d\n",fp->N_RB_DL); + + if (fp->frame_type==TDD) + cfg->duplex_mode = duplex_mode_TDD; + else //FDD + cfg->duplex_mode = duplex_mode_FDD; + + cfg->Mod_id = 0; + cfg->num_rb_dl=fp->N_RB_DL; + cfg->tx_num_channels=ru->nb_tx; + cfg->rx_num_channels=ru->nb_rx; + + for (i=0; inb_tx; i++) { + + cfg->tx_freq[i] = (double)fp->dl_CarrierFreq; + cfg->rx_freq[i] = (double)fp->ul_CarrierFreq; + + cfg->tx_gain[i] = (double)fp->att_tx; + cfg->rx_gain[i] = ru->max_rxgain-(double)fp->att_rx; + + cfg->configFilename = rf_config_file; + printf("channel %d, Setting tx_gain offset %f, rx_gain offset %f, tx_freq %f, rx_freq %f\n", + i, cfg->tx_gain[i], + cfg->rx_gain[i], + cfg->tx_freq[i], + cfg->rx_freq[i]); + } +} + +/* this function maps the RU tx and rx buffers to the available rf chains. + Each rf chain is is addressed by the card number and the chain on the card. The + rf_map specifies for each antenna port, on which rf chain the mapping should start. Multiple + antennas are mapped to successive RF chains on the same card. */ +int setup_RU_buffers(RU_t *ru) { + + int i,j; + int card,ant; + + //uint16_t N_TA_offset = 0; + + LTE_DL_FRAME_PARMS *frame_parms; + + if (ru) { + frame_parms = &ru->frame_parms; + printf("setup_RU_buffers: frame_parms = %p\n",frame_parms); + } else { + printf("RU[%d] not initialized\n", ru->idx); + return(-1); + } + + + if (frame_parms->frame_type == TDD) { + if (frame_parms->N_RB_DL == 100) ru->N_TA_offset = 624; + else if (frame_parms->N_RB_DL == 50) ru->N_TA_offset = 624/2; + else if (frame_parms->N_RB_DL == 25) ru->N_TA_offset = 624/4; + } + if (ru->openair0_cfg.mmapped_dma == 1) { + // replace RX signal buffers with mmaped HW versions + + for (i=0; inb_rx; i++) { + card = i/4; + ant = i%4; + printf("Mapping RU id %d, rx_ant %d, on card %d, chain %d\n",ru->idx,i,ru->rf_map.card+card, ru->rf_map.chain+ant); + free(ru->common.rxdata[i]); + ru->common.rxdata[i] = ru->openair0_cfg.rxbase[ru->rf_map.chain+ant]; + + printf("rxdata[%d] @ %p\n",i,ru->common.rxdata[i]); + for (j=0; j<16; j++) { + printf("rxbuffer %d: %x\n",j,ru->common.rxdata[i][j]); + ru->common.rxdata[i][j] = 16-j; + } + } + + for (i=0; inb_tx; i++) { + card = i/4; + ant = i%4; + printf("Mapping RU id %d, tx_ant %d, on card %d, chain %d\n",ru->idx,i,ru->rf_map.card+card, ru->rf_map.chain+ant); + free(ru->common.txdata[i]); + ru->common.txdata[i] = ru->openair0_cfg.txbase[ru->rf_map.chain+ant]; + + printf("txdata[%d] @ %p\n",i,ru->common.txdata[i]); + + for (j=0; j<16; j++) { + printf("txbuffer %d: %x\n",j,ru->common.txdata[i][j]); + ru->common.txdata[i][j] = 16-j; + } + } + } + else { // not memory-mapped DMA + //nothing to do, everything already allocated in lte_init + } + return(0); +} + +static void* ru_stats_thread(void* param) { + + RU_t *ru = (RU_t*)param; + + wait_sync("ru_stats_thread"); + + while (!oai_exit) { + sleep(1); + if (opp_enabled == 1) { + if (ru->feprx) print_meas(&ru->ofdm_demod_stats,"feprx",NULL,NULL); + if (ru->feptx_ofdm) print_meas(&ru->ofdm_mod_stats,"feptx_ofdm",NULL,NULL); + if (ru->fh_north_asynch_in) print_meas(&ru->rx_fhaul,"rx_fhaul",NULL,NULL); + if (ru->fh_north_out) { + print_meas(&ru->tx_fhaul,"tx_fhaul",NULL,NULL); + print_meas(&ru->compression,"compression",NULL,NULL); + print_meas(&ru->transport,"transport",NULL,NULL); + } + } + } + return(NULL); +} + +static void* ru_thread( void* param ) { + + static int ru_thread_status; + + RU_t *ru = (RU_t*)param; + RU_proc_t *proc = &ru->proc; + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + int ret; + int subframe =9; + int frame =1023; + + // set default return value + ru_thread_status = 0; + + + // set default return value + thread_top_init("ru_thread",0,870000,1000000,1000000); + + LOG_I(PHY,"Starting RU %d (%s,%s),\n",ru->idx,eNB_functions[ru->function],eNB_timing[ru->if_timing]); + + + // Start IF device if any + if (ru->start_if) { + LOG_I(PHY,"Starting IF interface for RU %d\n",ru->idx); + AssertFatal(ru->start_if(ru,NULL) == 0, "Could not start the IF device\n"); + if (ru->if_south == LOCAL_RF) ret = connect_rau(ru); + else ret = attach_rru(ru); + AssertFatal(ret==0,"Cannot connect to radio\n"); + } + if (ru->if_south == LOCAL_RF) { // configure RF parameters only + fill_rf_config(ru,ru->rf_config_file); + init_frame_parms(&ru->frame_parms,1); + phy_init_RU(ru); + + ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg); + } + if (setup_RU_buffers(ru)!=0) { + printf("Exiting, cannot initialize RU Buffers\n"); + exit(-1); + } + + LOG_I(PHY, "Signaling main thread that RU %d is ready\n",ru->idx); + pthread_mutex_lock(&RC.ru_mutex); + RC.ru_mask &= ~(1<idx); + pthread_cond_signal(&RC.ru_cond); + pthread_mutex_unlock(&RC.ru_mutex); + + wait_sync("ru_thread"); + + + + + // Start RF device if any + if (ru->start_rf) { + if (ru->start_rf(ru) != 0) + LOG_E(HW,"Could not start the RF device\n"); + else LOG_I(PHY,"RU %d rf device ready\n",ru->idx); + } + else LOG_I(PHY,"RU %d no rf device\n",ru->idx); + + + // if an asnych_rxtx thread exists + // wakeup the thread because the devices are ready at this point + + if ((ru->fh_south_asynch_in)||(ru->fh_north_asynch_in)) { + pthread_mutex_lock(&proc->mutex_asynch_rxtx); + proc->instance_cnt_asynch_rxtx=0; + pthread_mutex_unlock(&proc->mutex_asynch_rxtx); + pthread_cond_signal(&proc->cond_asynch_rxtx); + } + else LOG_I(PHY,"RU %d no asynch_south interface\n",ru->idx); + + // if this is a slave RRU, try to synchronize on the DL frequency + if ((ru->is_slave) && (ru->if_south == LOCAL_RF)) do_ru_synch(ru); + + + // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices + while (!oai_exit) { + + // these are local subframe/frame counters to check that we are in synch with the fronthaul timing. + // They are set on the first rx/tx in the underly FH routines. + if (subframe==9) { + subframe=0; + frame++; + frame&=1023; + } else { + subframe++; + } + + // synchronization on input FH interface, acquire signals/data and block + if (ru->fh_south_in) ru->fh_south_in(ru,&frame,&subframe); + else AssertFatal(1==0, "No fronthaul interface at south port"); + +/* + LOG_D(PHY,"AFTER fh_south_in - SFN/SF:%d%d RU->proc[RX:%d%d TX:%d%d] RC.eNB[0][0]:[RX:%d%d TX(SFN):%d]\n", + frame,subframe, + proc->frame_rx,proc->subframe_rx, + proc->frame_tx,proc->subframe_tx, + RC.eNB[0][0]->proc.frame_rx,RC.eNB[0][0]->proc.subframe_rx, + RC.eNB[0][0]->proc.frame_tx); + + LOG_D(PHY,"RU thread (do_prach %d, is_prach_subframe %d), received frame %d, subframe %d\n", + ru->do_prach, + is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx), + proc->frame_rx,proc->subframe_rx); +*/ + if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)==1)) { + wakeup_prach_ru(ru); + } +#ifdef Rel14 + else if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>1)) { + wakeup_prach_ru_br(ru); + } +#endif + + // adjust for timing offset between RU + if (ru->idx!=0) proc->frame_tx = (proc->frame_tx+proc->frame_offset)&1023; + + + // do RX front-end processing (frequency-shift, dft) if needed + if (ru->feprx) ru->feprx(ru); + + // At this point, all information for subframe has been received on FH interface + // If this proc is to provide synchronization, do so + wakeup_slaves(proc); + + // wakeup all eNB processes waiting for this RU + if (ru->num_eNB>0) wakeup_eNBs(ru); + + // wait until eNBs are finished subframe RX n and TX n+sf_ahead + wait_on_condition(&proc->mutex_eNBs,&proc->cond_eNBs,&proc->instance_cnt_eNBs,"ru_thread"); + + + // do TX front-end processing if needed (precoding and/or IDFTs) + if (ru->feptx_prec) ru->feptx_prec(ru); + + // do OFDM if needed + if ((ru->fh_north_asynch_in == NULL) && (ru->feptx_ofdm)) ru->feptx_ofdm(ru); + // do outgoing fronthaul (south) if needed + if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru); + + if (ru->fh_north_out) ru->fh_north_out(ru); + } + + + printf( "Exiting ru_thread \n"); + + ru_thread_status = 0; + return &ru_thread_status; + +} + + +// This thread run the initial synchronization like a UE +void *ru_thread_synch(void *arg) { + + RU_t *ru = (RU_t*)arg; + LTE_DL_FRAME_PARMS *fp=&ru->frame_parms; + int32_t sync_pos,sync_pos2; + uint32_t peak_val; + uint32_t sync_corr[307200] __attribute__((aligned(32))); + static int ru_thread_synch_status; + + + thread_top_init("ru_thread_synch",0,5000000,10000000,10000000); + + wait_sync("ru_thread_synch"); + + // initialize variables for PSS detection + lte_sync_time_init(&ru->frame_parms); + + while (!oai_exit) { + + // wait to be woken up + if (wait_on_condition(&ru->proc.mutex_synch,&ru->proc.cond_synch,&ru->proc.instance_cnt_synch,"ru_thread_synch")<0) break; + + // if we're not in synch, then run initial synch + if (ru->in_synch == 0) { + // run intial synch like UE + LOG_I(PHY,"Running initial synchronization\n"); + + sync_pos = lte_sync_time_eNB(ru->common.rxdata, + fp, + fp->samples_per_tti*5, + &peak_val, + sync_corr); + LOG_I(PHY,"RU synch: %d, val %d\n",sync_pos,peak_val); + + if (sync_pos >= 0) { + if (sync_pos >= fp->nb_prefix_samples) + sync_pos2 = sync_pos - fp->nb_prefix_samples; + else + sync_pos2 = sync_pos + (fp->samples_per_tti*10) - fp->nb_prefix_samples; + + if (fp->frame_type == FDD) { + + // PSS is hypothesized in last symbol of first slot in Frame + int sync_pos_slot = (fp->samples_per_tti>>1) - fp->ofdm_symbol_size - fp->nb_prefix_samples; + + if (sync_pos2 >= sync_pos_slot) + ru->rx_offset = sync_pos2 - sync_pos_slot; + else + ru->rx_offset = (fp->samples_per_tti*10) + sync_pos2 - sync_pos_slot; + } + else { + + } + + LOG_I(PHY,"Estimated sync_pos %d, peak_val %d => timing offset %d\n",sync_pos,peak_val,ru->rx_offset); + + /* + if ((peak_val > 300000) && (sync_pos > 0)) { + // if (sync_pos++ > 3) { + write_output("ru_sync.m","sync",(void*)&sync_corr[0],fp->samples_per_tti*5,1,2); + write_output("ru_rx.m","rxs",(void*)ru->ru_time.rxdata[0][0],fp->samples_per_tti*10,1,1); + exit(-1); + } + */ + ru->in_synch=1; + } + } + + if (release_thread(&ru->proc.mutex_synch,&ru->proc.instance_cnt_synch,"ru_synch_thread") < 0) break; + } // oai_exit + + lte_sync_time_free(); + + ru_thread_synch_status = 0; + return &ru_thread_synch_status; + +} + + + +int start_if(struct RU_t_s *ru,struct PHY_VARS_eNB_s *eNB) { + return(ru->ifdevice.trx_start_func(&ru->ifdevice)); +} + +int start_rf(RU_t *ru) { + return(ru->rfdevice.trx_start_func(&ru->rfdevice)); +} + +extern void fep_full(RU_t *ru); +extern void ru_fep_full_2thread(RU_t *ru); +extern void feptx_ofdm(RU_t *ru); +extern void feptx_ofdm_2thread(RU_t *ru); +extern void feptx_prec(RU_t *ru); +extern void init_fep_thread(RU_t *ru,pthread_attr_t *attr); +extern void init_feptx_thread(RU_t *ru,pthread_attr_t *attr); + +void init_RU_proc(RU_t *ru) { + + int i=0; + RU_proc_t *proc; + pthread_attr_t *attr_FH=NULL,*attr_prach=NULL,*attr_asynch=NULL,*attr_synch=NULL; + //pthread_attr_t *attr_fep=NULL; +#ifdef Rel14 + pthread_attr_t *attr_prach_br=NULL; +#endif + char name[100]; + +#ifndef OCP_FRAMEWORK + LOG_I(PHY,"Initializing RU proc %d (%s,%s),\n",ru->idx,eNB_functions[ru->function],eNB_timing[ru->if_timing]); +#endif + proc = &ru->proc; + memset((void*)proc,0,sizeof(RU_proc_t)); + + proc->ru = ru; + proc->instance_cnt_prach = -1; + proc->instance_cnt_synch = -1; ; + proc->instance_cnt_FH = -1; + proc->instance_cnt_asynch_rxtx = -1; + proc->first_rx = 1; + proc->first_tx = 1; + proc->frame_offset = 0; + proc->num_slaves = 0; + proc->frame_tx_unwrap = 0; + + for (i=0;i<10;i++) proc->symbol_mask[i]=0; + + pthread_mutex_init( &proc->mutex_prach, NULL); + pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL); + pthread_mutex_init( &proc->mutex_synch,NULL); + pthread_mutex_init( &proc->mutex_FH,NULL); + + pthread_cond_init( &proc->cond_prach, NULL); + pthread_cond_init( &proc->cond_FH, NULL); + pthread_cond_init( &proc->cond_asynch_rxtx, NULL); + pthread_cond_init( &proc->cond_synch,NULL); + + pthread_attr_init( &proc->attr_FH); + pthread_attr_init( &proc->attr_prach); + pthread_attr_init( &proc->attr_synch); + pthread_attr_init( &proc->attr_asynch_rxtx); + pthread_attr_init( &proc->attr_fep); + +#ifdef Rel14 + proc->instance_cnt_prach_br = -1; + pthread_mutex_init( &proc->mutex_prach_br, NULL); + pthread_cond_init( &proc->cond_prach_br, NULL); + pthread_attr_init( &proc->attr_prach_br); +#endif + +#ifndef DEADLINE_SCHEDULER + attr_FH = &proc->attr_FH; + attr_prach = &proc->attr_prach; + attr_synch = &proc->attr_synch; + attr_asynch = &proc->attr_asynch_rxtx; +#ifdef Rel14 + attr_prach_br = &proc->attr_prach_br; +#endif +#endif + + pthread_create( &proc->pthread_FH, attr_FH, ru_thread, (void*)ru ); + + if (ru->function == NGFI_RRU_IF4p5) { + pthread_create( &proc->pthread_prach, attr_prach, ru_thread_prach, (void*)ru ); +#ifdef Rel14 + pthread_create( &proc->pthread_prach_br, attr_prach_br, ru_thread_prach_br, (void*)ru ); +#endif + if (ru->is_slave == 1) pthread_create( &proc->pthread_synch, attr_synch, ru_thread_synch, (void*)ru); + + + if ((ru->if_timing == synch_to_other) || + (ru->function == NGFI_RRU_IF5) || + (ru->function == NGFI_RRU_IF4p5)) pthread_create( &proc->pthread_asynch_rxtx, attr_asynch, ru_thread_asynch_rxtx, (void*)ru ); + + snprintf( name, sizeof(name), "ru_thread_FH %d", ru->idx ); + pthread_setname_np( proc->pthread_FH, name ); + + } + else if (ru->function == eNodeB_3GPP && ru->if_south == LOCAL_RF) { // DJP - need something else to distinguish between monolithic and PNF + LOG_I(PHY,"%s() DJP - added creation of pthread_prach\n", __FUNCTION__); + pthread_create( &proc->pthread_prach, attr_prach, ru_thread_prach, (void*)ru ); + } + + if (get_nprocs()>=2) { + if (ru->feprx) init_fep_thread(ru,NULL); + if (ru->feptx_ofdm) init_feptx_thread(ru,NULL); + } + if (opp_enabled == 1) pthread_create(&ru->ru_stats_thread,NULL,ru_stats_thread,(void*)ru); + +} + +int check_capabilities(RU_t *ru,RRU_capabilities_t *cap) { + + FH_fmt_options_t fmt = cap->FH_fmt; + + int i; + int found_band=0; + + LOG_I(PHY,"RRU %d, num_bands %d, looking for band %d\n",ru->idx,cap->num_bands,ru->frame_parms.eutra_band); + for (i=0;inum_bands;i++) { + LOG_I(PHY,"band %d on RRU %d\n",cap->band_list[i],ru->idx); + if (ru->frame_parms.eutra_band == cap->band_list[i]) { + found_band=1; + break; + } + } + + if (found_band == 0) { + LOG_I(PHY,"Couldn't find target EUTRA band %d on RRU %d\n",ru->frame_parms.eutra_band,ru->idx); + return(-1); + } + + switch (ru->if_south) { + case LOCAL_RF: + AssertFatal(1==0, "This RU should not have a local RF, exiting\n"); + return(0); + break; + case REMOTE_IF5: + if (fmt == OAI_IF5_only || fmt == OAI_IF5_and_IF4p5) return(0); + break; + case REMOTE_IF4p5: + if (fmt == OAI_IF4p5_only || fmt == OAI_IF5_and_IF4p5) return(0); + break; + case REMOTE_MBP_IF5: + if (fmt == MBP_IF5) return(0); + break; + default: + LOG_I(PHY,"No compatible Fronthaul interface found for RRU %d\n", ru->idx); + return(-1); + } + + return(-1); +} + + +char rru_format_options[4][20] = {"OAI_IF5_only","OAI_IF4p5_only","OAI_IF5_and_IF4p5","MBP_IF5"}; + +char rru_formats[3][20] = {"OAI_IF5","MBP_IF5","OAI_IF4p5"}; +char ru_if_formats[4][20] = {"LOCAL_RF","REMOTE_OAI_IF5","REMOTE_MBP_IF5","REMOTE_OAI_IF4p5"}; + +void configure_ru(int idx, + void *arg) { + + RU_t *ru = RC.ru[idx]; + RRU_config_t *config = (RRU_config_t *)arg; + RRU_capabilities_t *capabilities = (RRU_capabilities_t*)arg; + int ret; + int i; + + LOG_I(PHY, "Received capabilities from RRU %d\n",idx); + + + if (capabilities->FH_fmt < MAX_FH_FMTs) LOG_I(PHY, "RU FH options %s\n",rru_format_options[capabilities->FH_fmt]); + + AssertFatal((ret=check_capabilities(ru,capabilities)) == 0, + "Cannot configure RRU %d, check_capabilities returned %d\n", idx,ret); + // take antenna capabilities of RRU + ru->nb_tx = capabilities->nb_tx[0]; + ru->nb_rx = capabilities->nb_rx[0]; + + // Pass configuration to RRU + LOG_I(PHY, "Using %s fronthaul (%d), band %d \n",ru_if_formats[ru->if_south],ru->if_south,ru->frame_parms.eutra_band); + // wait for configuration + config->FH_fmt = ru->if_south; + config->num_bands = 1; + config->band_list[0] = ru->frame_parms.eutra_band; + config->tx_freq[0] = ru->frame_parms.dl_CarrierFreq; + config->rx_freq[0] = ru->frame_parms.ul_CarrierFreq; + config->tdd_config[0] = ru->frame_parms.tdd_config; + config->tdd_config_S[0] = ru->frame_parms.tdd_config_S; + config->att_tx[0] = ru->att_tx; + config->att_rx[0] = ru->att_rx; + config->N_RB_DL[0] = ru->frame_parms.N_RB_DL; + config->N_RB_UL[0] = ru->frame_parms.N_RB_UL; + config->threequarter_fs[0] = ru->frame_parms.threequarter_fs; + if (ru->if_south==REMOTE_IF4p5) { + config->prach_FreqOffset[0] = ru->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset; + config->prach_ConfigIndex[0] = ru->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; + LOG_I(PHY,"REMOTE_IF4p5: prach_FrequOffset %d, prach_ConfigIndex %d\n", + config->prach_FreqOffset[0],config->prach_ConfigIndex[0]); + +#ifdef Rel14 + for (i=0;i<4;i++) { + config->emtc_prach_CElevel_enable[0][i] = ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i]; + config->emtc_prach_FreqOffset[0][i] = ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[i]; + config->emtc_prach_ConfigIndex[0][i] = ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[i]; + } +#endif + } + + init_frame_parms(&ru->frame_parms,1); + phy_init_RU(ru); +} + +void configure_rru(int idx, + void *arg) { + + RRU_config_t *config = (RRU_config_t *)arg; + RU_t *ru = RC.ru[idx]; + + ru->frame_parms.eutra_band = config->band_list[0]; + ru->frame_parms.dl_CarrierFreq = config->tx_freq[0]; + ru->frame_parms.ul_CarrierFreq = config->rx_freq[0]; + if (ru->frame_parms.dl_CarrierFreq == ru->frame_parms.ul_CarrierFreq) { + ru->frame_parms.frame_type = TDD; + ru->frame_parms.tdd_config = config->tdd_config[0]; + ru->frame_parms.tdd_config_S = config->tdd_config_S[0]; + } + else + ru->frame_parms.frame_type = FDD; + ru->att_tx = config->att_tx[0]; + ru->att_rx = config->att_rx[0]; + ru->frame_parms.N_RB_DL = config->N_RB_DL[0]; + ru->frame_parms.N_RB_UL = config->N_RB_UL[0]; + ru->frame_parms.threequarter_fs = config->threequarter_fs[0]; + ru->frame_parms.pdsch_config_common.referenceSignalPower = ru->max_pdschReferenceSignalPower-config->att_tx[0]; + if (ru->function==NGFI_RRU_IF4p5) { + ru->frame_parms.att_rx = ru->att_rx; + ru->frame_parms.att_tx = ru->att_tx; + + LOG_I(PHY,"Setting ru->function to NGFI_RRU_IF4p5, prach_FrequOffset %d, prach_ConfigIndex %d, att (%d,%d)\n", + config->prach_FreqOffset[0],config->prach_ConfigIndex[0],ru->att_tx,ru->att_rx); + ru->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset = config->prach_FreqOffset[0]; + ru->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex = config->prach_ConfigIndex[0]; +#ifdef Rel14 + for (int i=0;i<4;i++) { + ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_CElevel_enable[i] = config->emtc_prach_CElevel_enable[0][i]; + ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[i] = config->emtc_prach_FreqOffset[0][i]; + ru->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_ConfigIndex[i] = config->emtc_prach_ConfigIndex[0][i]; + } +#endif + } + + init_frame_parms(&ru->frame_parms,1); + + fill_rf_config(ru,ru->rf_config_file); + + + phy_init_RU(ru); + +} + +void init_precoding_weights(PHY_VARS_eNB *eNB) { + + int layer,ru_id,aa,re,ue,tb; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + RU_t *ru; + LTE_eNB_DLSCH_t *dlsch; + + // init precoding weigths + for (ue=0;uedlsch[ue][tb]; + for (layer=0; layer<4; layer++) { + int nb_tx=0; + for (ru_id=0;ru_idnb_tx; + } + dlsch->ue_spec_bf_weights[layer] = (int32_t**)malloc16(nb_tx*sizeof(int32_t*)); + + for (aa=0; aaue_spec_bf_weights[layer][aa] = (int32_t *)malloc16(fp->ofdm_symbol_size*sizeof(int32_t)); + for (re=0;reofdm_symbol_size; re++) { + dlsch->ue_spec_bf_weights[layer][aa][re] = 0x00007fff; + } + } + } + } + } +} + +extern void RCconfig_RU(void); + +void init_RU(char *rf_config_file) { + + int ru_id; + RU_t *ru; + int ret; + PHY_VARS_eNB *eNB0= (PHY_VARS_eNB *)NULL; + int i; + int CC_id; + + // create status mask + RC.ru_mask = 0; + pthread_mutex_init(&RC.ru_mutex,NULL); + pthread_cond_init(&RC.ru_cond,NULL); + + // read in configuration file) + printf("configuring RU from file\n"); + RCconfig_RU(); + LOG_I(PHY,"number of L1 instances %d, number of RU %d, number of CPU cores %d\n",RC.nb_L1_inst,RC.nb_RU,get_nprocs()); + + if (RC.nb_CC != 0) + for (i=0;inum_RU=0; + + LOG_D(PHY,"Process RUs RC.nb_RU:%d\n",RC.nb_RU); + for (ru_id=0;ru_idrf_config_file = rf_config_file; + ru->idx = ru_id; + ru->ts_offset = 0; + // use eNB_list[0] as a reference for RU frame parameters + // NOTE: multiple CC_id are not handled here yet! + + if (ru->num_eNB > 0) { + LOG_D(PHY, "%s() RC.ru[%d].num_eNB:%d ru->eNB_list[0]:%p RC.eNB[0][0]:%p rf_config_file:%s\n", __FUNCTION__, ru_id, ru->num_eNB, ru->eNB_list[0], RC.eNB[0][0], ru->rf_config_file); + + if (ru->eNB_list[0] == 0) + { + LOG_E(PHY,"%s() DJP - ru->eNB_list ru->num_eNB are not initialized - so do it manually\n", __FUNCTION__); + ru->eNB_list[0] = RC.eNB[0][0]; + ru->num_eNB=1; + // + // DJP - feptx_prec() / feptx_ofdm() parses the eNB_list (based on num_eNB) and copies the txdata_F to txdata in RU + // + } + else + { + LOG_E(PHY,"DJP - delete code above this %s:%d\n", __FILE__, __LINE__); + } + } + eNB0 = ru->eNB_list[0]; + LOG_D(PHY, "RU FUnction:%d ru->if_south:%d\n", ru->function, ru->if_south); + LOG_D(PHY, "eNB0:%p\n", eNB0); + if (eNB0) + { + if ((ru->function != NGFI_RRU_IF5) && (ru->function != NGFI_RRU_IF4p5)) + AssertFatal(eNB0!=NULL,"eNB0 is null!\n"); + + if (eNB0) { + LOG_I(PHY,"Copying frame parms from eNB %d to ru %d\n",eNB0->Mod_id,ru->idx); + memcpy((void*)&ru->frame_parms,(void*)&eNB0->frame_parms,sizeof(LTE_DL_FRAME_PARMS)); + + // attach all RU to all eNBs in its list/ + LOG_D(PHY,"ru->num_eNB:%d eNB0->num_RU:%d\n", ru->num_eNB, eNB0->num_RU); + for (i=0;inum_eNB;i++) { + eNB0 = ru->eNB_list[i]; + eNB0->RU_list[eNB0->num_RU++] = ru; + } + } + } + // LOG_I(PHY,"Initializing RRU descriptor %d : (%s,%s,%d)\n",ru_id,ru_if_types[ru->if_south],eNB_timing[ru->if_timing],ru->function); + + + LOG_D(PHY,"ru->if_south:%d\n", ru->if_south); + + switch (ru->if_south) { + case LOCAL_RF: // this is an RU with integrated RF (RRU, eNB) + if (ru->function == NGFI_RRU_IF5) { // IF5 RRU + ru->do_prach = 0; // no prach processing in RU + ru->fh_north_in = NULL; // no shynchronous incoming fronthaul from north + ru->fh_north_out = fh_if5_north_out; // need only to do send_IF5 reception + ru->fh_south_out = tx_rf; // send output to RF + ru->fh_north_asynch_in = fh_if5_north_asynch_in; // TX packets come asynchronously + ru->feprx = NULL; // nothing (this is a time-domain signal) + ru->feptx_ofdm = NULL; // nothing (this is a time-domain signal) + ru->feptx_prec = NULL; // nothing (this is a time-domain signal) + ru->start_if = start_if; // need to start the if interface for if5 + ru->ifdevice.host_type = RRU_HOST; + ru->rfdevice.host_type = RRU_HOST; + ru->ifdevice.eth_params = &ru->eth_params; + reset_meas(&ru->rx_fhaul); + reset_meas(&ru->tx_fhaul); + reset_meas(&ru->compression); + reset_meas(&ru->transport); + + ret = openair0_transport_load(&ru->ifdevice,&ru->openair0_cfg,&ru->eth_params); + printf("openair0_transport_init returns %d for ru_id %d\n",ret,ru_id); + if (ret<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } + } + else if (ru->function == NGFI_RRU_IF4p5) { + ru->do_prach = 1; // do part of prach processing in RU + ru->fh_north_in = NULL; // no synchronous incoming fronthaul from north + ru->fh_north_out = fh_if4p5_north_out; // send_IF4p5 on reception + ru->fh_south_out = tx_rf; // send output to RF + ru->fh_north_asynch_in = fh_if4p5_north_asynch_in; // TX packets come asynchronously + ru->feprx = (get_nprocs()<=2) ? fep_full :ru_fep_full_2thread; // RX DFTs + ru->feptx_ofdm = (get_nprocs()<=2) ? feptx_ofdm : feptx_ofdm_2thread; // this is fep with idft only (no precoding in RRU) + ru->feptx_prec = NULL; + ru->start_if = start_if; // need to start the if interface for if4p5 + ru->ifdevice.host_type = RRU_HOST; + ru->rfdevice.host_type = RRU_HOST; + ru->ifdevice.eth_params = &ru->eth_params; + reset_meas(&ru->rx_fhaul); + reset_meas(&ru->tx_fhaul); + reset_meas(&ru->compression); + reset_meas(&ru->transport); + + ret = openair0_transport_load(&ru->ifdevice,&ru->openair0_cfg,&ru->eth_params); + printf("openair0_transport_init returns %d for ru_id %d\n",ret,ru_id); + if (ret<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } + malloc_IF4p5_buffer(ru); + } + else if (ru->function == eNodeB_3GPP) { + ru->do_prach = 0; // no prach processing in RU + ru->feprx = (get_nprocs()<=2) ? fep_full : ru_fep_full_2thread; // RX DFTs + ru->feptx_ofdm = (get_nprocs()<=2) ? feptx_ofdm : feptx_ofdm_2thread; // this is fep with idft and precoding + ru->feptx_prec = feptx_prec; // this is fep with idft and precoding + ru->fh_north_in = NULL; // no incoming fronthaul from north + ru->fh_north_out = NULL; // no outgoing fronthaul to north + ru->start_if = NULL; // no if interface + ru->rfdevice.host_type = RAU_HOST; + } + ru->fh_south_in = rx_rf; // local synchronous RF RX + ru->fh_south_out = tx_rf; // local synchronous RF TX + ru->start_rf = start_rf; // need to start the local RF interface + printf("configuring ru_id %d (start_rf %p)\n",ru_id,start_rf); +/* + if (ru->function == eNodeB_3GPP) { // configure RF parameters only for 3GPP eNodeB, we need to get them from RAU otherwise + fill_rf_config(ru,rf_config_file); + init_frame_parms(&ru->frame_parms,1); + phy_init_RU(ru); + } + + ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg); + if (setup_RU_buffers(ru)!=0) { + printf("Exiting, cannot initialize RU Buffers\n"); + exit(-1); + } + */ + break; + + case REMOTE_IF5: // the remote unit is IF5 RRU + ru->do_prach = 0; + ru->feprx = (get_nprocs()<=2) ? fep_full : fep_full; // this is frequency-shift + DFTs + ru->feptx_prec = feptx_prec; // need to do transmit Precoding + IDFTs + ru->feptx_ofdm = (get_nprocs()<=2) ? feptx_ofdm : feptx_ofdm_2thread; // need to do transmit Precoding + IDFTs + if (ru->if_timing == synch_to_other) { + ru->fh_south_in = fh_slave_south_in; // synchronize to master + ru->fh_south_out = fh_if5_mobipass_south_out; // use send_IF5 for mobipass + ru->fh_south_asynch_in = fh_if5_south_asynch_in_mobipass; // UL is asynchronous + } + else { + ru->fh_south_in = fh_if5_south_in; // synchronous IF5 reception + ru->fh_south_out = fh_if5_south_out; // synchronous IF5 transmission + ru->fh_south_asynch_in = NULL; // no asynchronous UL + } + ru->start_rf = NULL; // no local RF + ru->start_if = start_if; // need to start if interface for IF5 + ru->ifdevice.host_type = RAU_HOST; + ru->ifdevice.eth_params = &ru->eth_params; + ru->ifdevice.configure_rru = configure_ru; + + ret = openair0_transport_load(&ru->ifdevice,&ru->openair0_cfg,&ru->eth_params); + printf("openair0_transport_init returns %d for ru_id %d\n",ret,ru_id); + if (ret<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } + break; + + case REMOTE_IF4p5: + ru->do_prach = 0; + ru->feprx = NULL; // DFTs + ru->feptx_prec = feptx_prec; // Precoding operation + ru->feptx_ofdm = NULL; // no OFDM mod + ru->fh_south_in = fh_if4p5_south_in; // synchronous IF4p5 reception + ru->fh_south_out = fh_if4p5_south_out; // synchronous IF4p5 transmission + ru->fh_south_asynch_in = (ru->if_timing == synch_to_other) ? fh_if4p5_south_in : NULL; // asynchronous UL if synch_to_other + ru->fh_north_out = NULL; + ru->fh_north_asynch_in = NULL; + ru->start_rf = NULL; // no local RF + ru->start_if = start_if; // need to start if interface for IF4p5 + ru->ifdevice.host_type = RAU_HOST; + ru->ifdevice.eth_params = &ru->eth_params; + ru->ifdevice.configure_rru = configure_ru; + + ret = openair0_transport_load(&ru->ifdevice, &ru->openair0_cfg, &ru->eth_params); + printf("openair0_transport_init returns %d for ru_id %d\n",ret,ru_id); + if (ret<0) { + printf("Exiting, cannot initialize transport protocol\n"); + exit(-1); + } + + malloc_IF4p5_buffer(ru); + + break; + + default: + LOG_E(PHY,"RU with invalid or unknown southbound interface type %d\n",ru->if_south); + break; + } // switch on interface type + + LOG_I(PHY,"Starting ru_thread %d\n",ru_id); + + init_RU_proc(ru); + + + + } // for ru_id + + // sleep(1); + LOG_D(HW,"[lte-softmodem.c] RU threads created\n"); + + +} + + + + +void stop_ru(RU_t *ru) { + + printf("Stopping RU %p processing threads\n",(void*)ru); + +} + + +/* --------------------------------------------------------*/ +/* from here function to use configuration module */ +void RCconfig_RU(void) { + + int j = 0; + int i = 0; + + + paramdef_t RUParams[] = RUPARAMS_DESC; + paramlist_def_t RUParamList = {CONFIG_STRING_RU_LIST,NULL,0}; + + + config_getlist( &RUParamList,RUParams,sizeof(RUParams)/sizeof(paramdef_t), NULL); + + + if ( RUParamList.numelt > 0) { + + RC.ru = (RU_t**)malloc(RC.nb_RU*sizeof(RU_t*)); + + + + + RC.ru_mask=(1<idx = j; + + printf("Creating RC.ru[%d]:%p\n", j, RC.ru[j]); + + RC.ru[j]->if_timing = synch_to_ext_device; + if (RC.nb_L1_inst >0) + RC.ru[j]->num_eNB = RUParamList.paramarray[j][RU_ENB_LIST_IDX].numelt; + else + RC.ru[j]->num_eNB = 0; + for (i=0;inum_eNB;i++) RC.ru[j]->eNB_list[i] = RC.eNB[RUParamList.paramarray[j][RU_ENB_LIST_IDX].iptr[i]][0]; + + + if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) { + if ( !(config_isparamset(RUParamList.paramarray[j],RU_LOCAL_IF_NAME_IDX)) ) { + RC.ru[j]->if_south = LOCAL_RF; + RC.ru[j]->function = eNodeB_3GPP; + printf("Setting function for RU %d to eNodeB_3GPP\n",j); + } + else { + RC.ru[j]->eth_params.local_if_name = strdup(*(RUParamList.paramarray[j][RU_LOCAL_IF_NAME_IDX].strptr)); + RC.ru[j]->eth_params.my_addr = strdup(*(RUParamList.paramarray[j][RU_LOCAL_ADDRESS_IDX].strptr)); + RC.ru[j]->eth_params.remote_addr = strdup(*(RUParamList.paramarray[j][RU_REMOTE_ADDRESS_IDX].strptr)); + RC.ru[j]->eth_params.my_portc = *(RUParamList.paramarray[j][RU_LOCAL_PORTC_IDX].uptr); + RC.ru[j]->eth_params.remote_portc = *(RUParamList.paramarray[j][RU_REMOTE_PORTC_IDX].uptr); + RC.ru[j]->eth_params.my_portd = *(RUParamList.paramarray[j][RU_LOCAL_PORTD_IDX].uptr); + RC.ru[j]->eth_params.remote_portd = *(RUParamList.paramarray[j][RU_REMOTE_PORTD_IDX].uptr); + + if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp") == 0) { + RC.ru[j]->if_south = LOCAL_RF; + RC.ru[j]->function = NGFI_RRU_IF5; + RC.ru[j]->eth_params.transp_preference = ETH_UDP_MODE; + printf("Setting function for RU %d to NGFI_RRU_IF5 (udp)\n",j); + } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw") == 0) { + RC.ru[j]->if_south = LOCAL_RF; + RC.ru[j]->function = NGFI_RRU_IF5; + RC.ru[j]->eth_params.transp_preference = ETH_RAW_MODE; + printf("Setting function for RU %d to NGFI_RRU_IF5 (raw)\n",j); + } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp_if4p5") == 0) { + RC.ru[j]->if_south = LOCAL_RF; + RC.ru[j]->function = NGFI_RRU_IF4p5; + RC.ru[j]->eth_params.transp_preference = ETH_UDP_IF4p5_MODE; + printf("Setting function for RU %d to NGFI_RRU_IF4p5 (udp)\n",j); + } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw_if4p5") == 0) { + RC.ru[j]->if_south = LOCAL_RF; + RC.ru[j]->function = NGFI_RRU_IF4p5; + RC.ru[j]->eth_params.transp_preference = ETH_RAW_IF4p5_MODE; + printf("Setting function for RU %d to NGFI_RRU_IF4p5 (raw)\n",j); + } + } + RC.ru[j]->max_pdschReferenceSignalPower = *(RUParamList.paramarray[j][RU_MAX_RS_EPRE_IDX].uptr);; + RC.ru[j]->max_rxgain = *(RUParamList.paramarray[j][RU_MAX_RXGAIN_IDX].uptr); + RC.ru[j]->num_bands = RUParamList.paramarray[j][RU_BAND_LIST_IDX].numelt; + for (i=0;inum_bands;i++) RC.ru[j]->band[i] = RUParamList.paramarray[j][RU_BAND_LIST_IDX].iptr[i]; + } //strcmp(local_rf, "yes") == 0 + else { + printf("RU %d: Transport %s\n",j,*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr)); + + RC.ru[j]->eth_params.local_if_name = strdup(*(RUParamList.paramarray[j][RU_LOCAL_IF_NAME_IDX].strptr)); + RC.ru[j]->eth_params.my_addr = strdup(*(RUParamList.paramarray[j][RU_LOCAL_ADDRESS_IDX].strptr)); + RC.ru[j]->eth_params.remote_addr = strdup(*(RUParamList.paramarray[j][RU_REMOTE_ADDRESS_IDX].strptr)); + RC.ru[j]->eth_params.my_portc = *(RUParamList.paramarray[j][RU_LOCAL_PORTC_IDX].uptr); + RC.ru[j]->eth_params.remote_portc = *(RUParamList.paramarray[j][RU_REMOTE_PORTC_IDX].uptr); + RC.ru[j]->eth_params.my_portd = *(RUParamList.paramarray[j][RU_LOCAL_PORTD_IDX].uptr); + RC.ru[j]->eth_params.remote_portd = *(RUParamList.paramarray[j][RU_REMOTE_PORTD_IDX].uptr); + if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp") == 0) { + RC.ru[j]->if_south = REMOTE_IF5; + RC.ru[j]->function = NGFI_RAU_IF5; + RC.ru[j]->eth_params.transp_preference = ETH_UDP_MODE; + } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw") == 0) { + RC.ru[j]->if_south = REMOTE_IF5; + RC.ru[j]->function = NGFI_RAU_IF5; + RC.ru[j]->eth_params.transp_preference = ETH_RAW_MODE; + } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp_if4p5") == 0) { + RC.ru[j]->if_south = REMOTE_IF4p5; + RC.ru[j]->function = NGFI_RAU_IF4p5; + RC.ru[j]->eth_params.transp_preference = ETH_UDP_IF4p5_MODE; + } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw_if4p5") == 0) { + RC.ru[j]->if_south = REMOTE_IF4p5; + RC.ru[j]->function = NGFI_RAU_IF4p5; + RC.ru[j]->eth_params.transp_preference = ETH_RAW_IF4p5_MODE; + } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw_if5_mobipass") == 0) { + RC.ru[j]->if_south = REMOTE_IF5; + RC.ru[j]->function = NGFI_RAU_IF5; + RC.ru[j]->if_timing = synch_to_other; + RC.ru[j]->eth_params.transp_preference = ETH_RAW_IF5_MOBIPASS; + } + RC.ru[j]->att_tx = *(RUParamList.paramarray[j][RU_ATT_TX_IDX].uptr); + RC.ru[j]->att_rx = *(RUParamList.paramarray[j][RU_ATT_TX_IDX].uptr); + } /* strcmp(local_rf, "yes") != 0 */ + + RC.ru[j]->nb_tx = *(RUParamList.paramarray[j][RU_NB_TX_IDX].uptr); + RC.ru[j]->nb_rx = *(RUParamList.paramarray[j][RU_NB_RX_IDX].uptr); + + }// j=0..num_rus + } else { + RC.nb_RU = 0; + } // setting != NULL + + return; + +} + diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 3f419ed49c..04a8f72505 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -1,34 +1,26 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ - -/*! \file lte-softmodem.c - * \brief main program to control HW and scheduling +/*! \file lte-enb.c + * \brief Top-level threads for eNodeB * \author R. Knopp, F. Kaltenberger, Navid Nikaein * \date 2012 * \version 0.1 @@ -37,46 +29,33 @@ * \note * \warning */ -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include + + +#define _GNU_SOURCE /* See feature_test_macros(7) */ #include -#include -#include -#include -#include -#include + #include "T.h" #include "rt_wrapper.h" + #undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all #include "assertions.h" #include "msc.h" -#ifdef EMOS -#include -struct gps_fix_t dummy_gps_data; -#endif - #include "PHY/types.h" #include "PHY/defs.h" +#include "common/ran_context.h" +#include "common/config/config_userapi.h" +#include "common/utils/load_module_shlib.h" #undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all -#ifdef EXMIMO -#include "openair0_lib.h" -#else #include "../../ARCH/COMMON/common_lib.h" -#endif +#include "../../ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all @@ -86,10 +65,6 @@ struct gps_fix_t dummy_gps_data; #include "../../SIMU/USER/init_lte.h" -#ifdef EMOS -#include "SCHED/phy_procedures_emos.h" -#endif - #include "LAYER2/MAC/defs.h" #include "LAYER2/MAC/vars.h" #include "LAYER2/MAC/proto.h" @@ -114,49 +89,18 @@ unsigned short config_frames[4] = {2,9,11,13}; #endif #if defined(ENABLE_ITTI) -# include "intertask_interface_init.h" -# include "create_tasks.h" -# if defined(ENABLE_USE_MME) -# include "s1ap_eNB.h" -#ifdef PDCP_USE_NETLINK -# include "SIMULATION/ETH_TRANSPORT/proto.h" -#endif -# endif +#include "intertask_interface_init.h" +#include "create_tasks.h" #endif +#include "system.h" + #ifdef XFORMS #include "PHY/TOOLS/lte_phy_scope.h" #include "stats.h" #endif +#include "lte-softmodem.h" -#define FRAME_PERIOD 100000000ULL -#define DAQ_PERIOD 66667ULL - -//#define DEBUG_THREADS 1 - -//#define USRP_DEBUG 1 - -struct timing_info_t { - //unsigned int frame, hw_slot, last_slot, next_slot; - RTIME time_min, time_max, time_avg, time_last, time_now; - //unsigned int mbox0, mbox1, mbox2, mbox_target; - unsigned int n_samples; -} timing_info; - - - -openair0_config_t openair0_cfg[MAX_CARDS]; - -int32_t **rxdata; -int32_t **txdata; -int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); -int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]); - -uint16_t runtime_phy_rx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] -uint16_t runtime_phy_tx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] -double cpuf; - -void fill_ue_band_info(void); #ifdef XFORMS // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) // at eNB 0, an UL scope for every UE @@ -165,84 +109,43 @@ FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; FD_stats_form *form_stats=NULL,*form_stats_l2=NULL; char title[255]; unsigned char scope_enb_num_ue = 2; +static pthread_t forms_thread; //xforms #endif //XFORMS -#ifdef RTAI +pthread_cond_t nfapi_sync_cond; +pthread_mutex_t nfapi_sync_mutex; +int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex -static long main_eNB_thread; -static long main_ue_thread; - -#else -pthread_t main_eNB_thread; -pthread_t main_ue_thread; - -pthread_attr_t attr_dlsch_threads; -pthread_attr_t attr_UE_thread; - -#ifndef DEADLINE_SCHEDULER -struct sched_param sched_param_dlsch; -#endif -#endif +uint8_t nfapi_mode = 0; // Default to monolithic mode pthread_cond_t sync_cond; pthread_mutex_t sync_mutex; int sync_var=-1; //!< protected by mutex \ref sync_mutex. +int config_sync_var=-1; - - - -struct sched_param sched_param_UE_thread; - -pthread_attr_t attr_eNB_proc_tx[MAX_NUM_CCs][NUM_ENB_THREADS]; -pthread_attr_t attr_eNB_proc_rx[MAX_NUM_CCs][NUM_ENB_THREADS]; -#ifndef DEADLINE_SCHEDULER -struct sched_param sched_param_eNB_proc_tx[MAX_NUM_CCs][NUM_ENB_THREADS]; -struct sched_param sched_param_eNB_proc_rx[MAX_NUM_CCs][NUM_ENB_THREADS]; -#endif -#ifdef XFORMS -static pthread_t forms_thread; //xforms -#endif -#ifdef EMOS -static pthread_t thread3; //emos -static pthread_t thread4; //GPS -#endif - -openair0_device openair0; - - -/* - static int instance_cnt=-1; //0 means worker is busy, -1 means its free - int instance_cnt_ptr_kern,*instance_cnt_ptr_user; - int pci_interface_ptr_kern; -*/ -//extern unsigned int bigphys_top; -//extern unsigned int mem_base; - -//int card = 0; - +uint16_t runtime_phy_rx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] +uint16_t runtime_phy_tx[29][6]; // SISO [MCS 0-28][RBs 0-5 : 6, 15, 25, 50, 75, 100] #if defined(ENABLE_ITTI) -static volatile int start_eNB = 0; -static volatile int start_UE = 0; +volatile int start_eNB = 0; +volatile int start_UE = 0; #endif -volatile int oai_exit = 0; +volatile int oai_exit = 0; -//static int time_offset[4] = {-138,-138,-138,-138}; -//static int time_offset[4] = {-145,-145,-145,-145}; -static int time_offset[4] = {0,0,0,0}; +static clock_source_t clock_source = internal; +static int wait_for_sync = 0; - -static char UE_flag=0; -//static uint8_t eNB_id=0,UE_id=0; +static char UE_flag=0; +unsigned int mmapped_dma=0; +int single_thread_flag=1; static char threequarter_fs=0; uint32_t downlink_frequency[MAX_NUM_CCs][4]; int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; -openair0_rf_map rf_map[MAX_NUM_CCs]; -static char *conf_config_file_name = NULL; + #if defined(ENABLE_ITTI) static char *itti_dump_file = NULL; #endif @@ -254,37 +157,18 @@ runmode_t mode = normal_txrx; FILE *input_fd=NULL; -#ifdef EXMIMO -#if MAX_NUM_CCs == 1 -double tx_gain[MAX_NUM_CCs][4] = {{20,20,0,0}}; -double rx_gain[MAX_NUM_CCs][4] = {{20,20,0,0}}; -#else -double tx_gain[MAX_NUM_CCs][4] = {{20,20,0,0},{20,20,0,0}}; -double rx_gain[MAX_NUM_CCs][4] = {{20,20,0,0},{20,20,0,0}}; -#endif -// these are for EXMIMO2 target only -/* - static unsigned int rxg_max[4] = {133,133,133,133}; - static unsigned int rxg_med[4] = {127,127,127,127}; - static unsigned int rxg_byp[4] = {120,120,120,120}; - */ -// these are for EXMIMO2 card 39 -unsigned int rxg_max[4] = {128,128,128,126}; -unsigned int rxg_med[4] = {122,123,123,120}; -unsigned int rxg_byp[4] = {116,117,116,116}; -unsigned int nf_max[4] = {7,9,16,12}; -unsigned int nf_med[4] = {12,13,22,17}; -unsigned int nf_byp[4] = {15,20,29,23}; #if MAX_NUM_CCs == 1 rx_gain_t rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain}}; -#else -rx_gain_t rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain},{max_gain,max_gain,max_gain,max_gain}}; -#endif -#else double tx_gain[MAX_NUM_CCs][4] = {{20,0,0,0}}; double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0}}; +#else +rx_gain_t rx_gain_mode[MAX_NUM_CCs][4] = {{max_gain,max_gain,max_gain,max_gain},{max_gain,max_gain,max_gain,max_gain}}; +double tx_gain[MAX_NUM_CCs][4] = {{20,0,0,0},{20,0,0,0}}; +double rx_gain[MAX_NUM_CCs][4] = {{110,0,0,0},{20,0,0,0}}; #endif +double rx_gain_off = 0.0; + double sample_rate=30.72e6; double bw = 10.0e6; @@ -294,15 +178,19 @@ char rf_config_file[1024]; int chain_offset=0; int phy_test = 0; +uint8_t usim_test = 0; + +uint8_t dci_Format = 0; +uint8_t agregation_Level =0xFF; + +uint8_t nb_antenna_tx = 1; +uint8_t nb_antenna_rx = 1; -#ifndef EXMIMO char ref[128] = "internal"; char channels[128] = "0"; -#endif - int rx_input_level_dBm; -static int online_log_messages=0; + #ifdef XFORMS extern int otg_enabled; static char do_forms=0; @@ -310,14 +198,9 @@ static char do_forms=0; int otg_enabled; #endif //int number_of_cards = 1; -#ifdef EXMIMO -static int mbox_bounds[20] = {8,16,24,30,38,46,54,60,68,76,84,90,98,106,114,120,128,136,144, 0}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers -//static int mbox_bounds[20] = {6,14,22,28,36,44,52,58,66,74,82,88,96,104,112,118,126,134,142, 148}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers -#endif + static LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; - -int multi_thread=1; uint32_t target_dl_mcs = 28; //maximum allowed mcs uint32_t target_ul_mcs = 20; uint32_t timing_advance = 0; @@ -325,110 +208,93 @@ uint8_t exit_missed_slots=1; uint64_t num_missed_slots=0; // counter for the number of missed slots -time_stats_t softmodem_stats_mt; // main thread -time_stats_t softmodem_stats_hw; // hw acquisition -time_stats_t softmodem_stats_tx_sf[10]; // total tx time -time_stats_t softmodem_stats_rx_sf[10]; // total rx time -void reset_opp_meas(void); -void print_opp_meas(void); +extern void reset_opp_meas(void); +extern void print_opp_meas(void); + +extern PHY_VARS_UE* init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, + uint8_t UE_id, + uint8_t abstraction_flag); + +extern void init_eNB_afterRU(void); + int transmission_mode=1; -int16_t glog_level = LOG_INFO; -int16_t glog_verbosity = LOG_MED; -int16_t hw_log_level = LOG_INFO; -int16_t hw_log_verbosity = LOG_MED; -int16_t phy_log_level = LOG_INFO; -int16_t phy_log_verbosity = LOG_MED; -int16_t mac_log_level = LOG_INFO; -int16_t mac_log_verbosity = LOG_MED; -int16_t rlc_log_level = LOG_INFO; -int16_t rlc_log_verbosity = LOG_MED; -int16_t pdcp_log_level = LOG_INFO; -int16_t pdcp_log_verbosity = LOG_MED; -int16_t rrc_log_level = LOG_INFO; -int16_t rrc_log_verbosity = LOG_MED; -int16_t opt_log_level = LOG_INFO; -int16_t opt_log_verbosity = LOG_MED; - -# if defined(ENABLE_USE_MME) -int16_t gtpu_log_level = LOG_DEBUG; -int16_t gtpu_log_verbosity = LOG_MED; -int16_t udp_log_level = LOG_DEBUG; -int16_t udp_log_verbosity = LOG_MED; -#endif -#if defined (ENABLE_SECURITY) -int16_t osa_log_level = LOG_INFO; -int16_t osa_log_verbosity = LOG_MED; -#endif -#ifdef ETHERNET -char *rrh_UE_ip = "127.0.0.1"; -int rrh_UE_port = 51000; -#endif - -/* flag set by eNB conf file to specify if the radio head is local or remote (default option is local) */ -uint8_t local_remote_radio = BBU_LOCAL_RADIO_HEAD; /* struct for ethernet specific parameters given in eNB conf file */ eth_params_t *eth_params; -char uecap_xer[1024],uecap_xer_in=0; -extern void *UE_thread(void *arg); -extern void init_UE_threads(void); +openair0_config_t openair0_cfg[MAX_CARDS]; + +double cpuf; + +extern char uecap_xer[1024]; +char uecap_xer_in=0; + +int oaisim_flag=0; +threads_t threads= {-1,-1,-1,-1,-1,-1,-1}; + +/* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed + * this is very hackish - find a proper solution + */ +uint8_t abstraction_flag=0; + +/* forward declarations */ +void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]); /*---------------------BMC: timespec helpers -----------------------------*/ struct timespec min_diff_time = { .tv_sec = 0, .tv_nsec = 0 }; struct timespec max_diff_time = { .tv_sec = 0, .tv_nsec = 0 }; -struct timespec clock_difftime(struct timespec start, struct timespec end) -{ - struct timespec temp; - if ((end.tv_nsec-start.tv_nsec)<0) { - temp.tv_sec = end.tv_sec-start.tv_sec-1; - temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; - } else { - temp.tv_sec = end.tv_sec-start.tv_sec; - temp.tv_nsec = end.tv_nsec-start.tv_nsec; - } - return temp; +struct timespec clock_difftime(struct timespec start, struct timespec end) { + struct timespec temp; + if ((end.tv_nsec-start.tv_nsec)<0) { + temp.tv_sec = end.tv_sec-start.tv_sec-1; + temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; + } else { + temp.tv_sec = end.tv_sec-start.tv_sec; + temp.tv_nsec = end.tv_nsec-start.tv_nsec; + } + return temp; } -void print_difftimes(void) -{ +void print_difftimes(void) { #ifdef DEBUG - printf("difftimes min = %lu ns ; max = %lu ns\n", min_diff_time.tv_nsec, max_diff_time.tv_nsec); + printf("difftimes min = %lu ns ; max = %lu ns\n", min_diff_time.tv_nsec, max_diff_time.tv_nsec); #else - LOG_I(HW,"difftimes min = %lu ns ; max = %lu ns\n", min_diff_time.tv_nsec, max_diff_time.tv_nsec); + LOG_I(HW,"difftimes min = %lu ns ; max = %lu ns\n", min_diff_time.tv_nsec, max_diff_time.tv_nsec); #endif } -void update_difftimes(struct timespec start, struct timespec end) -{ - struct timespec diff_time = { .tv_sec = 0, .tv_nsec = 0 }; - int changed = 0; - diff_time = clock_difftime(start, end); - if ((min_diff_time.tv_nsec == 0) || (diff_time.tv_nsec < min_diff_time.tv_nsec)) { min_diff_time.tv_nsec = diff_time.tv_nsec; changed = 1; } - if ((max_diff_time.tv_nsec == 0) || (diff_time.tv_nsec > max_diff_time.tv_nsec)) { max_diff_time.tv_nsec = diff_time.tv_nsec; changed = 1; } +void update_difftimes(struct timespec start, struct timespec end) { + struct timespec diff_time = { .tv_sec = 0, .tv_nsec = 0 }; + int changed = 0; + diff_time = clock_difftime(start, end); + if ((min_diff_time.tv_nsec == 0) || (diff_time.tv_nsec < min_diff_time.tv_nsec)) { + min_diff_time.tv_nsec = diff_time.tv_nsec; + changed = 1; + } + if ((max_diff_time.tv_nsec == 0) || (diff_time.tv_nsec > max_diff_time.tv_nsec)) { + max_diff_time.tv_nsec = diff_time.tv_nsec; + changed = 1; + } #if 1 - if (changed) print_difftimes(); + if (changed) print_difftimes(); #endif } /*------------------------------------------------------------------------*/ -unsigned int build_rflocal(int txi, int txq, int rxi, int rxq) -{ +unsigned int build_rflocal(int txi, int txq, int rxi, int rxq) { return (txi + (txq<<6) + (rxi<<12) + (rxq<<18)); } -unsigned int build_rfdc(int dcoff_i_rxfe, int dcoff_q_rxfe) -{ +unsigned int build_rfdc(int dcoff_i_rxfe, int dcoff_q_rxfe) { return (dcoff_i_rxfe + (dcoff_q_rxfe<<8)); } #if !defined(ENABLE_ITTI) -void signal_handler(int sig) -{ +void signal_handler(int sig) { void *array[10]; size_t size; @@ -452,108 +318,82 @@ void signal_handler(int sig) #define KBLU "\x1B[34m" #define RESET "\033[0m" -void help (void) { - printf (KGRN "Usage:\n"); - printf(" sudo -E lte-softmodem [options]\n"); - printf(" sudo -E ./lte-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.openEPC.conf -S -V -m 26 -t 16 -x 1 --ulsch-max-errors 100 -W\n\n"); - printf("Options:\n"); - printf(" --rf-config-file Configuration file for front-end (e.g. LMS7002M)\n"); - printf(" --ulsch-max-errors set the max ULSCH erros\n"); - printf(" --calib-ue-rx set UE RX calibration\n"); - printf(" --calib-ue-rx-med \n"); - printf(" --calib-ue-rxbyp\n"); - printf(" --debug-ue-prach run normal prach power ramping, but don't continue random-access\n"); - printf(" --calib-prach-tx run normal prach with maximum power, but don't continue random-access\n"); - printf(" --no-L2-connect bypass L2 and upper layers\n"); - printf(" --ue-rxgain set UE RX gain\n"); - printf(" --ue-txgain set UE TX gain\n"); - printf(" --ue-scan_carrier set UE to scan around carrier\n"); - printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n"); - printf(" -C Set the downlink frequency for all component carriers\n"); - printf(" -d Enable soft scope and L1 and L2 stats (Xforms)\n"); - printf(" -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n"); - printf(" -g Set the global log level, valide options: (9:trace, 8/7:debug, 6:info, 4:warn, 3:error)\n"); - printf(" -G Set the global log verbosity \n"); - printf(" -h provides this help message!\n"); - printf(" -K Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n"); - printf(" -m Set the maximum downlink MCS\n"); - printf(" -O eNB configuration file (located in targets/PROJECTS/GENERIC-LTE-EPC/CONF\n"); - printf(" -q Enable processing timing measurement of lte softmodem on per subframe basis \n"); - printf(" -r Set the PRB, valid values: 6, 25, 50, 100 \n"); - printf(" -S Skip the missed slots/subframes \n"); - printf(" -t Set the maximum uplink MCS\n"); - printf(" -T Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n"); - printf(" -U Set the lte softmodem as a UE\n"); - printf(" -W Enable L2 wireshark messages on localhost \n"); - printf(" -V Enable VCD (generated file will be located atopenair_dump_eNB.vcd, read it with target/RT/USER/eNB.gtkw\n"); - printf(" -x Set the transmission mode, valid options: 1 \n"); -#if T_TRACER - printf(" --T_port [port] use given port\n"); - printf(" --T_nowait don't wait for tracer, start immediately\n"); - printf(" --T_dont_fork to ease debugging with gdb\n"); -#endif - printf(RESET); - fflush(stdout); -} + + void exit_fun(const char* s) { + int CC_id; + int ru_id; + if (s != NULL) { printf("%s %s() Exiting OAI softmodem: %s\n",__FILE__, __FUNCTION__, s); } oai_exit = 1; + if (UE_flag==0) { + for (ru_id=0; ru_idrfdevice.trx_end_func) + RC.ru[ru_id]->rfdevice.trx_end_func(&RC.ru[ru_id]->rfdevice); + if (RC.ru[ru_id]->ifdevice.trx_end_func) + RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice); + } + } + + for(CC_id=0; CC_idrfdevice.trx_end_func) + PHY_vars_UE_g[0][CC_id]->rfdevice.trx_end_func(&PHY_vars_UE_g[0][CC_id]->rfdevice); + } + } + #if defined(ENABLE_ITTI) - sleep(1); //allow lte-softmodem threads to exit first - itti_terminate_tasks (TASK_UNKNOWN); + sleep(1); //allow lte-softmodem threads to exit first + itti_terminate_tasks (TASK_UNKNOWN); #endif - //rt_sleep_ns(FRAME_PERIOD); + } - //exit (-1); } - #ifdef XFORMS + void reset_stats(FL_OBJECT *button, long arg) { int i,j,k; - PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[0][0]; + PHY_VARS_eNB *phy_vars_eNB = RC.eNB[0][0]; for (i=0; idlsch_eNB[i][0]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0; + for (j=0; jdlsch[i][0]->Mlimit; j++) { + phy_vars_eNB->UE_stats[i].dlsch_NAK[k][j]=0; + phy_vars_eNB->UE_stats[i].dlsch_ACK[k][j]=0; + phy_vars_eNB->UE_stats[i].dlsch_trials[k][j]=0; } - phy_vars_eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; + phy_vars_eNB->UE_stats[i].dlsch_l2_errors[k]=0; + phy_vars_eNB->UE_stats[i].ulsch_errors[k]=0; + phy_vars_eNB->UE_stats[i].ulsch_consecutive_errors=0; - for (j=0; julsch_eNB[i]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; - } + + phy_vars_eNB->UE_stats[i].dlsch_sliding_cnt=0; + phy_vars_eNB->UE_stats[i].dlsch_NAK_round0=0; + phy_vars_eNB->UE_stats[i].dlsch_mcs_offset=0; } - - phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK_round0=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_mcs_offset=0; } } -static void *scope_thread(void *arg) -{ +static void *scope_thread(void *arg) { char stats_buffer[16384]; # ifdef ENABLE_XFORMS_WRITE_STATS FILE *UE_stats, *eNB_stats; # endif - int len = 0; struct sched_param sched_param; int UE_id, CC_id; int ue_cnt=0; @@ -574,38 +414,41 @@ static void *scope_thread(void *arg) while (!oai_exit) { if (UE_flag==1) { - len = dump_ue_stats (PHY_vars_UE_g[0][0], stats_buffer, 0, mode,rx_input_level_dBm); + dump_ue_stats (PHY_vars_UE_g[0][0], &PHY_vars_UE_g[0][0]->proc.proc_rxtx[0],stats_buffer, 0, mode,rx_input_level_dBm); //fl_set_object_label(form_stats->stats_text, stats_buffer); fl_clear_browser(form_stats->stats_text); fl_add_browser_line(form_stats->stats_text, stats_buffer); phy_scope_UE(form_ue[0], - PHY_vars_UE_g[0][0], - 0, - 0,7); + PHY_vars_UE_g[0][0], + 0, + 0,7); + } else { - if (PHY_vars_eNB_g[0][0]->mac_enabled==1) { + /* + if (RC.eNB[0][0]->mac_enabled==1) { len = dump_eNB_l2_stats (stats_buffer, 0); //fl_set_object_label(form_stats_l2->stats_text, stats_buffer); fl_clear_browser(form_stats_l2->stats_text); fl_add_browser_line(form_stats_l2->stats_text, stats_buffer); - } - len = dump_eNB_stats (PHY_vars_eNB_g[0][0], stats_buffer, 0); + } + len = dump_eNB_stats (RC.eNB[0][0], stats_buffer, 0); - if (MAX_NUM_CCs>1) - len += dump_eNB_stats (PHY_vars_eNB_g[0][1], &stats_buffer[len], 0); - - //fl_set_object_label(form_stats->stats_text, stats_buffer); - fl_clear_browser(form_stats->stats_text); - fl_add_browser_line(form_stats->stats_text, stats_buffer); + if (MAX_NUM_CCs>1) + len += dump_eNB_stats (RC.eNB[0][1], &stats_buffer[len], 0); + //fl_set_object_label(form_stats->stats_text, stats_buffer); + fl_clear_browser(form_stats->stats_text); + fl_add_browser_line(form_stats->stats_text, stats_buffer); + */ ue_cnt=0; for(UE_id=0; UE_iddlsch_eNB[UE_id][0]->rnti>0) && (ue_cntdlsch[UE_id][0]->rnti>0) && (ue_cnt=5 - ret = gps_open("127.0.0.1","2947",gps_data_ptr); - - if (ret!=0) -#else - gps_data_ptr = gps_open("127.0.0.1","2947"); - - if (gps_data_ptr == NULL) -#endif - { - printf("[EMOS] Could not open GPS\n"); - pthread_exit((void*)arg); - } - -#if GPSD_API_MAJOR_VERSION>=4 - else if (gps_stream(gps_data_ptr, WATCH_ENABLE,NULL) != 0) -#else - else if (gps_query(gps_data_ptr, "w+x") != 0) -#endif - { - printf("[EMOS] Error sending command to GPS\n"); - pthread_exit((void*) arg); - } else - printf("[EMOS] Opened GPS, gps_data=%p\n", gps_data_ptr); - - - while (!oai_exit) { - printf("[EMOS] polling data from gps\n"); -#if GPSD_API_MAJOR_VERSION>=5 - - if (gps_waiting(gps_data_ptr,500)) { - if (gps_read(gps_data_ptr) <= 0) { -#else - - if (gps_waiting(gps_data_ptr)) { - if (gps_poll(gps_data_ptr) != 0) { -#endif - printf("[EMOS] problem polling data from gps\n"); - } else { - memcpy(&dummy_gps_data,&(gps_data_ptr->fix),sizeof(struct gps_fix_t)); - printf("[EMOS] lat %g, lon %g\n",gps_data_ptr->fix.latitude,gps_data_ptr->fix.longitude); - } - } //gps_waiting - else { - printf("[EMOS] WARNING: No GPS data available, storing dummy packet\n"); - } - - //rt_sleep_ns(1000000000LL); - sleep(1); - } //oai_exit - - pthread_exit((void*) arg); - -} - -void *emos_thread (void *arg) -{ - char c; - char *fifo2file_buffer, *fifo2file_ptr; - - int fifo, counter=0, bytes; - - FILE *dumpfile_id; - char dumpfile_name[1024]; - time_t starttime_tmp; - struct tm starttime; - - int channel_buffer_size,ret; - - time_t timer; - struct tm *now; - - struct sched_param sched_param; - - sched_param.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - sched_setscheduler(0, SCHED_FIFO,&sched_param); - - printf("EMOS thread has priority %d\n",sched_param.sched_priority); - - timer = time(NULL); - now = localtime(&timer); - - if (UE_flag==0) - channel_buffer_size = sizeof(fifo_dump_emos_eNB); - else - channel_buffer_size = sizeof(fifo_dump_emos_UE); - - // allocate memory for NO_FRAMES_DISK channes estimations - fifo2file_buffer = malloc(NO_ESTIMATES_DISK*channel_buffer_size); - fifo2file_ptr = fifo2file_buffer; - - if (fifo2file_buffer == NULL) { - printf("[EMOS] Cound not allocate memory for fifo2file_buffer\n"); - exit(EXIT_FAILURE); - } - - if ((fifo = open(CHANSOUNDER_FIFO_DEV, O_RDONLY)) < 0) { - fprintf(stderr, "[EMOS] Error opening the fifo\n"); - exit(EXIT_FAILURE); - } - - - time(&starttime_tmp); - localtime_r(&starttime_tmp,&starttime); - snprintf(dumpfile_name,1024,"/tmp/%s_data_%d%02d%02d_%02d%02d%02d.EMOS", - (UE_flag==0) ? "eNB" : "UE", - 1900+starttime.tm_year, starttime.tm_mon+1, starttime.tm_mday, starttime.tm_hour, starttime.tm_min, starttime.tm_sec); - - dumpfile_id = fopen(dumpfile_name,"w"); - - if (dumpfile_id == NULL) { - fprintf(stderr, "[EMOS] Error opening dumpfile %s\n",dumpfile_name); - exit(EXIT_FAILURE); - } - - - printf("[EMOS] starting dump, channel_buffer_size=%d, fifo %d\n",channel_buffer_size,fifo); - - while (!oai_exit) { - /* - bytes = rtf_read_timed(fifo, fifo2file_ptr, channel_buffer_size,100); - if (bytes==0) - continue; - */ - bytes = rtf_read_all_at_once(fifo, fifo2file_ptr, channel_buffer_size); - - if (bytes<=0) { - usleep(100); - continue; - } - - if (bytes != channel_buffer_size) { - printf("[EMOS] ERROR! Only got %d bytes instead of %d!\n",bytes,channel_buffer_size); - } - - /* - if (UE_flag==0) - printf("eNB: count %d, frame %d, read: %d bytes from the fifo\n",counter, ((fifo_dump_emos_eNB*)fifo2file_ptr)->frame_tx,bytes); - else - printf("UE: count %d, frame %d, read: %d bytes from the fifo\n",counter, ((fifo_dump_emos_UE*)fifo2file_ptr)->frame_rx,bytes); - */ - - fifo2file_ptr += channel_buffer_size; - counter ++; - - if (counter == NO_ESTIMATES_DISK) { - //reset stuff - fifo2file_ptr = fifo2file_buffer; - counter = 0; - - //flush buffer to disk - if (UE_flag==0) - printf("[EMOS] eNB: count %d, frame %d, flushing buffer to disk\n", - counter, ((fifo_dump_emos_eNB*)fifo2file_ptr)->frame_tx); - else - printf("[EMOS] UE: count %d, frame %d, flushing buffer to disk\n", - counter, ((fifo_dump_emos_UE*)fifo2file_ptr)->frame_rx); - - - if (fwrite(fifo2file_buffer, sizeof(char), NO_ESTIMATES_DISK*channel_buffer_size, dumpfile_id) != NO_ESTIMATES_DISK*channel_buffer_size) { - fprintf(stderr, "[EMOS] Error writing to dumpfile\n"); - exit(EXIT_FAILURE); - } - - if (fwrite(&dummy_gps_data, sizeof(char), sizeof(struct gps_fix_t), dumpfile_id) != sizeof(struct gps_fix_t)) { - printf("[EMOS] Error writing to dumpfile, stopping recording\n"); - exit(EXIT_FAILURE); - } - } - } - - free(fifo2file_buffer); - fclose(dumpfile_id); - close(fifo); - - pthread_exit((void*) arg); - -} -#endif #if defined(ENABLE_ITTI) -static void wait_system_ready (char *message, volatile int *start_flag) -{ - /* Wait for eNB application initialization to be complete (eNB registration to MME) */ - { - static char *indicator[] = {". ", ".. ", "... ", ".... ", ".....", - " ....", " ...", " ..", " .", " " - }; - int i = 0; - - while ((!oai_exit) && (*start_flag == 0)) { - LOG_N(EMU, message, indicator[i]); - fflush(stdout); - i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0])); - usleep(200000); - } - - LOG_D(EMU,"\n"); - } -} -#endif - -#if defined(ENABLE_ITTI) -void *l2l1_task(void *arg) -{ +void *l2l1_task(void *arg) { MessageDef *message_p = NULL; int result; @@ -879,28 +502,28 @@ void *l2l1_task(void *arg) printf("Wait for the ITTI initialize message\n"); do { if (message_p != NULL) { - result = itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p); - AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); + result = itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p); + AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); } itti_receive_msg (TASK_L2L1, &message_p); switch (ITTI_MSG_ID(message_p)) { case INITIALIZE_MESSAGE: - /* Start eNB thread */ - LOG_D(EMU, "L2L1 TASK received %s\n", ITTI_MSG_NAME(message_p)); - start_eNB = 1; - break; + /* Start eNB thread */ + LOG_D(EMU, "L2L1 TASK received %s\n", ITTI_MSG_NAME(message_p)); + start_eNB = 1; + break; case TERMINATE_MESSAGE: - printf("received terminate message\n"); - oai_exit=1; - itti_exit_task (); - break; + printf("received terminate message\n"); + oai_exit=1; + itti_exit_task (); + break; default: - LOG_E(EMU, "Received unexpected message %s\n", ITTI_MSG_NAME(message_p)); - break; + LOG_E(EMU, "Received unexpected message %s\n", ITTI_MSG_NAME(message_p)); + break; } } while (ITTI_MSG_ID(message_p) != INITIALIZE_MESSAGE); @@ -944,1931 +567,150 @@ void *l2l1_task(void *arg) #endif -void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) -{ - - unsigned int aa,slot_offset, slot_offset_F; - int dummy_tx_b[7680*4] __attribute__((aligned(32))); - int i, tx_offset; - int slot_sizeF = (phy_vars_eNB->lte_frame_parms.ofdm_symbol_size)* - ((phy_vars_eNB->lte_frame_parms.Ncp==1) ? 6 : 7); - int len; - - slot_offset_F = (subframe<<1)*slot_sizeF; - - slot_offset = subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti; - - if ((subframe_select(&phy_vars_eNB->lte_frame_parms,subframe)==SF_DL)|| - ((subframe_select(&phy_vars_eNB->lte_frame_parms,subframe)==SF_S))) { - // LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot); - - - for (aa=0; aalte_frame_parms.nb_antennas_tx; aa++) { - if (phy_vars_eNB->lte_frame_parms.Ncp == EXTENDED) { - PHY_ofdm_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F], - dummy_tx_b, - phy_vars_eNB->lte_frame_parms.ofdm_symbol_size, - 6, - phy_vars_eNB->lte_frame_parms.nb_prefix_samples, - CYCLIC_PREFIX); - PHY_ofdm_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], - dummy_tx_b+(phy_vars_eNB->lte_frame_parms.samples_per_tti>>1), - phy_vars_eNB->lte_frame_parms.ofdm_symbol_size, - 6, - phy_vars_eNB->lte_frame_parms.nb_prefix_samples, - CYCLIC_PREFIX); - } else { - normal_prefix_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F], - dummy_tx_b, - 7, - &(phy_vars_eNB->lte_frame_parms)); - // if S-subframe generate first slot only - if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_DL) - normal_prefix_mod(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF], - dummy_tx_b+(phy_vars_eNB->lte_frame_parms.samples_per_tti>>1), - 7, - &(phy_vars_eNB->lte_frame_parms)); - } - - // if S-subframe generate first slot only - if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_S) - len = phy_vars_eNB->lte_frame_parms.samples_per_tti>>1; - else - len = phy_vars_eNB->lte_frame_parms.samples_per_tti; - /* - for (i=0;ilte_frame_parms.samples_per_tti; - - if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti)) - tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; - - ((short*)&phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset])[0] = ((short*)dummy_tx_b)[2*i]<lte_eNB_common_vars.txdata[0][aa][tx_offset])[1] = ((short*)dummy_tx_b)[2*i+1]<lte_frame_parms,subframe) == SF_S) { - for (i=0; ilte_eNB_common_vars.txdata[0][aa][tx_offset++] = 0x00010001; - } - } - - if ((((phy_vars_eNB->lte_frame_parms.tdd_config==0) || - (phy_vars_eNB->lte_frame_parms.tdd_config==1) || - (phy_vars_eNB->lte_frame_parms.tdd_config==2) || - (phy_vars_eNB->lte_frame_parms.tdd_config==6)) && - (subframe==0)) || (subframe==5)) { - // turn on tx switch N_TA_offset before - //LOG_D(HW,"subframe %d, time to switch to tx (N_TA_offset %d, slot_offset %d) \n",subframe,phy_vars_eNB->N_TA_offset,slot_offset); - for (i=0; iN_TA_offset; i++) { - tx_offset = (int)slot_offset+time_offset[aa]+i-phy_vars_eNB->N_TA_offset/2; - if (tx_offset<0) - tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; - - if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti)) - tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->lte_frame_parms.samples_per_tti; - - phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset] = 0x00000000; - } - } - } - } -} - -/* mutex, cond and variable to serialize phy proc TX calls - * (this mechanism may be relaxed in the future for better - * performances) - */ -static struct { - pthread_mutex_t mutex_phy_proc_tx; - pthread_cond_t cond_phy_proc_tx; - volatile uint8_t phy_proc_CC_id; -} sync_phy_proc[NUM_ENB_THREADS]; - -/*! - * \brief The transmit thread of eNB. - * \ref NUM_ENB_THREADS threads of this type are active at the same time. - * \param param is a \ref eNB_proc_t structure which contains the info what to process. - * \returns a pointer to an int. The storage is not on the heap and must not be freed. - */ -static void* eNB_thread_tx( void* param ) -{ - static int eNB_thread_tx_status[NUM_ENB_THREADS]; - - eNB_proc_t *proc = (eNB_proc_t*)param; - FILE *tx_time_file = NULL; - char tx_time_name[101]; - - if (opp_enabled == 1) { - snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->subframe); - tx_time_file = fopen(tx_time_name,"w"); - } - // set default return value - eNB_thread_tx_status[proc->subframe] = 0; - - MSC_START_USE(); - -#ifdef RTAI - RT_TASK *task; - char task_name[8]; - - sprintf(task_name,"TXC%dS%d",proc->CC_id,proc->subframe); - task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task == NULL) { - LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_TX thread_index %d (%s)!!!!\n",proc->subframe,task_name); - return 0; - } else { - LOG_I(PHY,"[SCHED][eNB] eNB TX thread CC %d SF %d started with id %p\n", - proc->CC_id, - proc->subframe, - task); - } - -#else -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - uint64_t runtime = 850000 ; - uint64_t deadline = 1 * 1000000 ; // each tx thread will finish within 1ms - uint64_t period = 1 * 10000000; // each tx thread has a period of 10ms from the starting point - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = runtime; - attr.sched_deadline = deadline; - attr.sched_period = period; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] eNB tx thread: sched_setattr failed\n"); - return &eNB_thread_tx_status[proc->subframe]; - } - - LOG_I( HW, "[SCHED] eNB TX deadline thread %d(TID %ld) started on CPU %d\n", proc->subframe, gettid(), sched_getcpu() ); -#else - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD threads */ - /* CPU 1 is reserved for all TX threads */ - /* Enable CPU Affinity only if number of CPUs >2 */ - CPU_ZERO(&cpuset); - - #ifdef CPU_AFFINITY - if (get_nprocs() > 2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); - } - } - #endif - - /* Check the actual affinity mask assigned to the thread */ - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } - memset(cpu_affinity,0,sizeof(cpu_affinity)); - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf (temp, " CPU_%d", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - policy = SCHED_FIFO ; - - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); - - } - - LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n", proc->subframe, sched_getcpu(),gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - sparam.sched_priority, cpu_affinity ); - - -#endif - -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - while (!oai_exit) { - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 0 ); - - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->subframe ); - exit_fun("nothing to add"); - break; - } - - while (proc->instance_cnt_tx < 0) { - // most of the time the thread is waiting here - // proc->instance_cnt_tx is -1 - pthread_cond_wait( &proc->cond_tx, &proc->mutex_tx ); // this unlocks mutex_tx while waiting and then locks it again - } - - if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { - LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe); - exit_fun("nothing to add"); - break; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 1 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, proc->frame_tx ); - start_meas( &softmodem_stats_tx_sf[proc->subframe] ); - - if (oai_exit) break; - - if (((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD) && - ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx) == SF_DL) || - (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx) == SF_S))) || - (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD)) { - /* run PHY TX procedures the one after the other for all CCs to avoid race conditions - * (may be relaxed in the future for performance reasons) - */ - if (pthread_mutex_lock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->subframe); - exit_fun("nothing to add"); - break; - } - /* wait for our turn or oai_exit */ - while (sync_phy_proc[proc->subframe].phy_proc_CC_id != proc->CC_id && !oai_exit) { - pthread_cond_wait(&sync_phy_proc[proc->subframe].cond_phy_proc_tx, - &sync_phy_proc[proc->subframe].mutex_phy_proc_tx); - } - - if (pthread_mutex_unlock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->subframe); - exit_fun("nothing to add"); - } - - if (oai_exit) - break; - - phy_procedures_eNB_TX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL ); - - /* we're done, let the next one proceed */ - if (pthread_mutex_lock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->subframe); - exit_fun("nothing to add"); - break; - } - sync_phy_proc[proc->subframe].phy_proc_CC_id++; - sync_phy_proc[proc->subframe].phy_proc_CC_id %= MAX_NUM_CCs; - pthread_cond_broadcast(&sync_phy_proc[proc->subframe].cond_phy_proc_tx); - if (pthread_mutex_unlock(&sync_phy_proc[proc->subframe].mutex_phy_proc_tx) != 0) { - LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->subframe); - exit_fun("nothing to add"); - break; - } - } - - do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); - /* - short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->lte_eNB_common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.samples_per_tti]; - int i; - for (i=0;iCC_id]->lte_frame_parms.samples_per_tti*2;i+=8) { - txdata[i] = 2047; - txdata[i+1] = 0; - txdata[i+2] = 0; - txdata[i+3] = 2047; - txdata[i+4] = -2047; - txdata[i+5] = 0; - txdata[i+6] = 0; - txdata[i+7] = -2047; - } - */ - if (pthread_mutex_lock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->subframe ); - exit_fun("nothing to add"); - break; - } - - proc->instance_cnt_tx--; - - if (pthread_mutex_unlock(&proc->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n", proc->subframe ); - exit_fun("nothing to add"); - break; - } - - proc->frame_tx++; - - if (proc->frame_tx==1024) - proc->frame_tx=0; - stop_meas( &softmodem_stats_tx_sf[proc->subframe] ); -#ifdef DEADLINE_SCHEDULER - if (opp_enabled){ - if(softmodem_stats_tx_sf[proc->subframe].diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_tx_sf[proc->subframe].diff_now/cpuf - attr.sched_runtime)/1000000.0); - } - } -#endif - print_meas_now(&softmodem_stats_tx_sf[proc->subframe],"eNB_TX_SF",proc->subframe, tx_time_file); - - } - - - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe), 0 ); - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - -#ifdef DEBUG_THREADS - printf( "Exiting eNB thread TX %d\n", proc->subframe ); -#endif - // clean task -#ifdef RTAI - rt_task_delete(task); -#endif - - eNB_thread_tx_status[proc->subframe] = 0; - return &eNB_thread_tx_status[proc->subframe]; -} - - -/*! - * \brief The receive thread of eNB. - * \ref NUM_ENB_THREADS threads of this type are active at the same time. - * \param param is a \ref eNB_proc_t structure which contains the info what to process. - * \returns a pointer to an int. The storage is not on the heap and must not be freed. - */ -static void* eNB_thread_rx( void* param ) -{ - static int eNB_thread_rx_status[NUM_ENB_THREADS]; - - eNB_proc_t *proc = (eNB_proc_t*)param; - - FILE *rx_time_file = NULL; - char rx_time_name[101]; - //int i; - - if (opp_enabled == 1){ - snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf_%d", "eNB", proc->subframe); - rx_time_file = fopen(rx_time_name,"w"); - } - // set default return value - eNB_thread_rx_status[proc->subframe] = 0; - - MSC_START_USE(); - -#ifdef RTAI - RT_TASK *task; - char task_name[8]; - - sprintf(task_name,"RXC%1dS%1d",proc->CC_id,proc->subframe); - task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_RX thread_index %d (%s)!!!!\n",proc->subframe,task_name); - return 0; - } else { - LOG_I(PHY,"[SCHED][eNB] eNB RX thread CC_id %d SF %d started with id %p\n", /* on CPU %d*/ - proc->CC_id, - proc->subframe, - task); /*,rtai_cpuid()*/ - } - -#else -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - uint64_t runtime = 870000 ; - uint64_t deadline = 1 * 1000000; - uint64_t period = 1 * 10000000; // each rx thread has a period of 10ms from the starting point - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = runtime; - attr.sched_deadline = deadline; - attr.sched_period = period; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] eNB RX sched_setattr failed\n"); - return &eNB_thread_rx_status[proc->subframe]; - } - - LOG_I( HW, "[SCHED] eNB RX deadline thread %d(TID %ld) started on CPU %d\n", proc->subframe, gettid(), sched_getcpu() ); -#else - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD */ - /* CPU 1 is reserved for all TX threads */ - /* CPU 2..MAX_CPUS is reserved for all RX threads */ - /* Set CPU Affinity only if number of CPUs >2 */ - CPU_ZERO(&cpuset); - #ifdef CPU_AFFINITY - if (get_nprocs() >2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun (" Error setting processor affinity :"); - } - } - #endif - /* Check the actual affinity mask assigned to the thread */ - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror ("pthread_getaffinity_np"); - exit_fun (" Error getting processor affinity :"); - } - memset(cpu_affinity,0, sizeof(cpu_affinity)); - - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf (temp, " CPU_%d", j); - strcat(cpu_affinity, temp); - } - - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - - policy = SCHED_FIFO ; - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - - memset(&sparam, 0 , sizeof (sparam)); - - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam"); - exit_fun("Error getting thread priority"); - } - - -LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", proc->subframe, sched_getcpu(),gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - sparam.sched_priority, cpu_affinity); - - -#endif -#endif // RTAI - - mlockall(MCL_CURRENT | MCL_FUTURE); - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - while (!oai_exit) { - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 0 ); - - if (pthread_mutex_lock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB RX proc %d\n", proc->subframe ); - exit_fun( "error locking mutex" ); - break; - } - - while (proc->instance_cnt_rx < 0) { - // most of the time the thread is waiting here - // proc->instance_cnt_rx is -1 - pthread_cond_wait( &proc->cond_rx, &proc->mutex_rx ); // this unlocks mutex_rx while waiting and then locks it again - } - - if (pthread_mutex_unlock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n", proc->subframe ); - exit_fun( "error unlocking mutex" ); - break; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 1 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); - start_meas( &softmodem_stats_rx_sf[proc->subframe] ); - - if (oai_exit) break; - - if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD )&&(subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_rx)==SF_UL)) || - (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) { - - phy_procedures_eNB_RX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay ); - } - - if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_rx) == SF_S)) { - phy_procedures_eNB_S_RX( proc->subframe, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay ); - } - - if (pthread_mutex_lock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB RX proc %d\n", proc->subframe ); - exit_fun( "error locking mutex" ); - break; - } - - proc->instance_cnt_rx--; - - if (pthread_mutex_unlock(&proc->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n", proc->subframe ); - exit_fun( "error unlocking mutex" ); - break; - } - - proc->frame_rx++; - - if (proc->frame_rx==1024) - proc->frame_rx=0; - - stop_meas( &softmodem_stats_rx_sf[proc->subframe] ); -#ifdef DEADLINE_SCHEDULER - if (opp_enabled){ - if(softmodem_stats_rx_sf[proc->subframe].diff_now/(cpuf) > attr.sched_runtime){ - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, (softmodem_stats_rx_sf[proc->subframe].diff_now/cpuf - attr.sched_runtime)/1000000.0); - } - } -#endif - print_meas_now(&softmodem_stats_rx_sf[proc->subframe],"eNB_RX_SF",proc->subframe, rx_time_file); - } - - //stop_meas( &softmodem_stats_rx_sf[proc->subframe] ); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->subframe), 0 ); - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - -#ifdef DEBUG_THREADS - printf( "Exiting eNB thread RX %d\n", proc->subframe ); -#endif - // clean task -#ifdef RTAI - rt_task_delete(task); -#endif - - eNB_thread_rx_status[proc->subframe] = 0; - return &eNB_thread_rx_status[proc->subframe]; -} - - - - -void init_eNB_proc(void) -{ - int i; +static void get_options(void) { int CC_id; + int tddflag; + char *loopfile=NULL; + int dumpframe; + uint32_t online_log_messages; + uint32_t glog_level, glog_verbosity; + uint32_t start_telnetsrv; - for (CC_id=0; CC_idproc[i].instance_cnt_tx = -1; - PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_rx = -1; - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe = i; - PHY_vars_eNB_g[0][CC_id]->proc[i].CC_id = CC_id; - pthread_mutex_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_tx, NULL); - pthread_mutex_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_rx, NULL); - pthread_cond_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx, NULL); - pthread_cond_init( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx, NULL); -#ifndef DEADLINE_SCHEDULER - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, &attr_eNB_proc_tx[CC_id][i], eNB_thread_tx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, &attr_eNB_proc_rx[CC_id][i], eNB_thread_rx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); -#else - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, NULL, eNB_thread_tx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); - pthread_create( &PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, NULL, eNB_thread_rx, &PHY_vars_eNB_g[0][CC_id]->proc[i] ); -#endif - char name[16]; - snprintf( name, sizeof(name), "TX %d", i ); - pthread_setname_np( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, name ); - snprintf( name, sizeof(name), "RX %d", i ); - pthread_setname_np( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, name ); - PHY_vars_eNB_g[0][CC_id]->proc[i].frame_tx = 0; - PHY_vars_eNB_g[0][CC_id]->proc[i].frame_rx = 0; -#ifdef EXMIMO - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_rx = (i+9)%10; - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_tx = (i+1)%10; -#else - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_rx = i; - PHY_vars_eNB_g[0][CC_id]->proc[i].subframe_tx = (i+2)%10; -#endif - } + config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL); - -#ifdef EXMIMO - // TX processes subframe + 1, RX subframe -1 - // Note this inialization is because the first process awoken for frame 0 is number 1 and so processes 9 and 0 have to start with frame 1 - - //PHY_vars_eNB_g[0][CC_id]->proc[0].frame_rx = 1023; - PHY_vars_eNB_g[0][CC_id]->proc[9].frame_tx = 1; - PHY_vars_eNB_g[0][CC_id]->proc[0].frame_tx = 1; -#else - // TX processes subframe +2, RX subframe - // Note this inialization is because the first process awoken for frame 0 is number 1 and so processes 8,9 and 0 have to start with frame 1 - // PHY_vars_eNB_g[0][CC_id]->proc[7].frame_tx = 1; - PHY_vars_eNB_g[0][CC_id]->proc[8].frame_tx = 1; - PHY_vars_eNB_g[0][CC_id]->proc[9].frame_tx = 1; - // PHY_vars_eNB_g[0][CC_id]->proc[0].frame_tx = 1; -#endif - } - - /* setup PHY proc TX sync mechanism */ - for (i=0; iproc[i].instance_cnt_tx = 0; // FIXME data race! - pthread_cond_signal( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx ); - pthread_cond_broadcast(&sync_phy_proc[i].cond_phy_proc_tx); - -#ifdef DEBUG_THREADS - printf( "Joining eNB TX CC_id %d thread %d...\n", CC_id, i ); -#endif - int result = pthread_join( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_tx, (void**)&status ); - -#ifdef DEBUG_THREADS - - if (result != 0) { - printf( "Error joining thread.\n" ); - } else { - if (status) { - printf( "status %d\n", *status ); - } else { - printf( "The thread was killed. No status available.\n" ); - } - } - -#else - UNUSED(result) -#endif - -#ifdef DEBUG_THREADS - printf( "Killing RX CC_id %d thread %d\n", CC_id, i ); -#endif - - PHY_vars_eNB_g[0][CC_id]->proc[i].instance_cnt_rx = 0; // FIXME data race! - pthread_cond_signal( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx ); - -#ifdef DEBUG_THREADS - printf( "Joining eNB RX CC_id %d thread %d...\n", CC_id, i ); -#endif - result = pthread_join( PHY_vars_eNB_g[0][CC_id]->proc[i].pthread_rx, (void**)&status ); - -#ifdef DEBUG_THREADS - - if (result != 0) { - printf( "Error joining thread.\n" ); - } else { - if (status) { - printf( "status %d\n", *status ); - } else { - printf( "The thread was killed. No status available.\n" ); - } - } - -#else - UNUSED(result) -#endif - - pthread_mutex_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_tx ); - pthread_mutex_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].mutex_rx ); - pthread_cond_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_tx ); - pthread_cond_destroy( &PHY_vars_eNB_g[0][CC_id]->proc[i].cond_rx ); - } -} - - - - - - -/*! - * \brief This is the main eNB thread. - * \param arg unused - * \returns a pointer to an int. The storage is not on the heap and must not be freed. - */ -static void* eNB_thread( void* arg ) -{ - UNUSED(arg); - static int eNB_thread_status; - - unsigned char slot; -#ifdef EXMIMO - slot=0; - RTIME time_in; - volatile unsigned int *DAQ_MBOX = openair0_daq_cnt(); - int mbox_target=0,mbox_current=0; - int hw_slot,delay_cnt; - int diff; - int ret; - int first_run=1; -#else - // the USRP implementation operates on subframes, not slots - // one subframe consists of one even and one odd slot - slot = 1; - int spp; - int tx_launched = 0; - int card=0; - - void *rxp[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_rx - void *txp[2]; // FIXME hard coded array size; indexed by lte_frame_parms.nb_antennas_tx - - int hw_subframe = 0; // 0..NUM_ENB_THREADS-1 => 0..9 - - unsigned int rx_pos = 0; - unsigned int tx_pos = 0; -#endif - int CC_id=0; - struct timespec trx_time0, trx_time1, trx_time2; - - /* avoid gcc warnings */ - (void)trx_time0; - (void)trx_time1; - (void)trx_time2; - -#ifdef RTAI - RT_TASK* task = rt_task_init_schmod(nam2num("eNBmain"), 0, 0, 0, SCHED_FIFO, 0xF); -#else -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - /* This creates a .2 ms reservation */ - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = (0.3 * 100) * 10000; - attr.sched_deadline = (0.9 * 100) * 10000; - attr.sched_period = 1 * 1000000; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] main eNB thread: sched_setattr failed\n"); - exit_fun("Nothing to add"); - } else { - LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n", - gettid(),sched_getcpu()); - } - -#else - - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD threads */ - CPU_ZERO(&cpuset); - #ifdef CPU_AFFINITY - if (get_nprocs() >2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); - } - } - #endif - - /* Check the actual affinity mask assigned to the thread */ - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } - memset(cpu_affinity, 0 , sizeof(cpu_affinity)); - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf(temp, " CPU_%d ", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); - policy = SCHED_FIFO ; - - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); - - } - - - LOG_I( HW, "[SCHED][eNB] Started eNB main thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - (int) sparam.sched_priority, cpu_affinity); - - -#endif -#endif - - // stop early, if an exit is requested - // FIXME really neccessary? - if (oai_exit) - goto eNB_thread_cleanup; - -#ifdef RTAI - LOG_I( HW, "[SCHED][eNB] Started eNB main thread (id %p)\n", task ); -#endif - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - printf("eNB_thread: mlockall in ...\n"); - mlockall(MCL_CURRENT | MCL_FUTURE); - printf("eNB_thread: mlockall out ...\n"); - - timing_info.time_min = 100000000ULL; - timing_info.time_max = 0; - timing_info.time_avg = 0; - timing_info.n_samples = 0; - - printf( "waiting for sync (eNB_thread)\n" ); - pthread_mutex_lock( &sync_mutex ); - - while (sync_var<0) - pthread_cond_wait( &sync_cond, &sync_mutex ); - - pthread_mutex_unlock(&sync_mutex); - - printf( "got sync (eNB_thread)\n" ); - - int frame = 0; - -#ifndef EXMIMO - spp = openair0_cfg[0].samples_per_packet; - tx_pos = openair0_cfg[0].tx_scheduling_advance; -#endif - -#if defined(ENABLE_ITTI) - wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB); -#endif - - while (!oai_exit) { - start_meas( &softmodem_stats_mt ); - -#ifdef EXMIMO - hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - // LOG_D(HW,"eNB frame %d, time %llu: slot %d, hw_slot %d (mbox %d)\n",frame,rt_get_time_ns(),slot,hw_slot,((unsigned int *)DAQ_MBOX)[0]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_slot>>1); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame); - //this is the mbox counter where we should be - mbox_target = mbox_bounds[slot]; - //this is the mbox counter where we are - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD) - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff = 150-mbox_current+mbox_target; - else if ((mbox_current<15) && (mbox_target>=135)) - diff = -150+mbox_target-mbox_current; - else - diff = mbox_target - mbox_current; - - //when we start the aquisition we want to start with slot 0, so we rather wait for the hardware than to advance the slot number (a positive diff will cause the programm to go into the second if clause rather than the first) - if (first_run==1) { - first_run=0; - - if (diff<0) - diff = diff + 150; - - LOG_I(HW,"eNB Frame %d, time %llu: slot %d, hw_slot %d, diff %d\n",frame, rt_get_time_ns(), slot, hw_slot, diff); - } - - if (((slot%2==0) && (diff < (-14))) || ((slot%2==1) && (diff < (-7)))) { - - // at the eNB, even slots have double as much time since most of the processing is done here and almost nothing in odd slots - LOG_W(HW,"eNB Frame %d, time %llu: missed slot %d, proceeding with next one (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n", - frame, rt_get_time_ns(), num_missed_slots, slot, hw_slot, mbox_current,mbox_target, diff); - - if (exit_missed_slots==1) { - stop_meas(&softmodem_stats_mt); - exit_fun("[HW][eNB] missed slot"); - } else { - num_missed_slots++; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_MISSED_SLOTS_ENB,num_missed_slots ); - } - - if ((slot&1) == 1) { - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++){ - if (PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_rx==1023) - PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_rx=0; - else - PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_rx += 1; - - if (PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_tx==1023) - PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_tx=0; - else - PHY_vars_eNB_g[0][CC_id]->proc[((slot>>1)+1)%10].frame_tx += 1; - } - } - - slot++; - if (slot == 20) { - frame++; - slot = 0; - } - - - } - - if (diff>8) - LOG_D(HW,"eNB Frame %d, time %llu: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, rt_get_time_ns(), slot, hw_slot, mbox_current, - mbox_target, diff); - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff); - - delay_cnt = 0; - - while ((diff>0) && (!oai_exit)) { - time_in = rt_get_time_ns(); - //LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d, (slot+1)*15=%d, diff %d, time %llu\n",frame,delay_cnt,hw_slot,((unsigned int *)DAQ_MBOX)[0],slot,(((slot+1)*15)>>1),diff,time_in); - //LOG_D(HW,"eNB Frame %d, time %llu: sleeping for %llu (slot %d, hw_slot %d, diff %d, mbox %d, delay_cnt %d)\n", frame, time_in, diff*DAQ_PERIOD,slot,hw_slot,diff,((volatile unsigned int *)DAQ_MBOX)[0],delay_cnt); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1); - ret = rt_sleep_ns(diff*DAQ_PERIOD); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - - if (ret) - LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in); - - hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_slot>>1); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame); -//LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns()); - delay_cnt++; - - if (delay_cnt == 10) { - stop_meas(&softmodem_stats_mt); - LOG_D(HW,"eNB Frame %d: HW stopped ... \n",frame); - exit_fun("[HW][eNB] HW stopped"); - } - - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff = 150-mbox_current+mbox_target; - else if ((mbox_current<15) && (mbox_target>=135)) - diff = -150+mbox_target-mbox_current; - else - diff = mbox_target - mbox_current; - } - -#else // EXMIMO - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_subframe ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame ); - tx_launched = 0; - - while (rx_pos < ((1+hw_subframe)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti)) { - - unsigned int rxs; -#ifndef USRP_DEBUG - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TXCNT, tx_pos ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RXCNT, rx_pos ); - - clock_gettime( CLOCK_MONOTONIC, &trx_time0 ); - - start_meas( &softmodem_stats_hw ); - - openair0_timestamp timestamp; - int i=0; - // prepare rx buffer pointers - for (i=0; ilte_frame_parms.nb_antennas_rx; i++) - rxp[i] = (void*)&rxdata[i][rx_pos]; - // check if nsymb_read == spp - // map antenna port i to the cc_id. Now use the 1:1 mapping - rxs = openair0.trx_read_func(&openair0, - ×tamp, - rxp, - spp, - PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx); - - stop_meas( &softmodem_stats_hw ); - if (frame > 50) { - clock_gettime( CLOCK_MONOTONIC, &trx_time1 ); - } - - if (frame > 20){ - if (rxs != spp) - exit_fun( "problem receiving samples" ); - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - - // Transmit TX buffer based on timestamp from RX - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - // prepare tx buffer pointers - for (i=0; ilte_frame_parms.nb_antennas_tx; i++) - txp[i] = (void*)&txdata[i][tx_pos]; - // if symb_written < spp ==> error - if (frame > 50) { - openair0.trx_write_func(&openair0, - (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance), - txp, - spp, - PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx, - 1); - } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, timestamp&0xffffffff ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance)&0xffffffff ); - - stop_meas( &softmodem_stats_mt ); - if (frame > 50) { - clock_gettime( CLOCK_MONOTONIC, &trx_time2 ); - //update_difftimes(trx_time1, trx_time2); - } - - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,0); -#else - // USRP_DEBUG is active - rt_sleep_ns(1000000); -#endif - /* FT configurable tx lauch delay (in slots): txlaunch_wait, txlaunch_wait_slotcount is device specific and - set in the corresponding library (with txlaunch_wait=1 and txlaunch_wait_slotcount=1 the check is as it previously was) */ - /* old check: - if ((frame>50) && - (tx_launched == 0) && - (rx_pos >= (((2*hw_subframe)+1)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti>>1))) {*/ - if ( (frame>50) && (tx_launched == 0) && - ((openair0_cfg[card].txlaunch_wait == 0) || - ((openair0_cfg[card].txlaunch_wait == 1) && - (rx_pos >= (((2*hw_subframe)+openair0_cfg[card].txlaunch_wait_slotcount)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti>>1))))) { - - tx_launched = 1; - - for (CC_id=0; CC_idproc[hw_subframe].mutex_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", hw_subframe, PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].instance_cnt_tx ); - exit_fun( "error locking mutex_tx" ); - break; - } - - int cnt_tx = ++PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].instance_cnt_tx; - - pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].mutex_tx ); - - if (cnt_tx == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].cond_tx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n", hw_subframe ); - exit_fun( "ERROR pthread_cond_signal" ); - break; - } - } else { - LOG_W( PHY,"[eNB] Frame %d, eNB TX thread %d busy!! (rx_cnt %u, cnt_tx %i)\n", PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].frame_tx, hw_subframe, rx_pos, cnt_tx ); - exit_fun( "TX thread busy" ); - break; - } - } - } - - rx_pos += spp; - tx_pos += spp; - - if (tx_pos >= openair0_cfg[card].samples_per_frame) - tx_pos -= openair0_cfg[card].samples_per_frame; - } - - if (rx_pos >= openair0_cfg[card].samples_per_frame) - rx_pos -= openair0_cfg[card].samples_per_frame; - - -#endif // USRP - - if (oai_exit) break; - - timing_info.time_last = timing_info.time_now; - timing_info.time_now = rt_get_time_ns(); - - if (timing_info.n_samples>0) { - RTIME time_diff = timing_info.time_now - timing_info.time_last; - - if (time_diff < timing_info.time_min) - timing_info.time_min = time_diff; - - if (time_diff > timing_info.time_max) - timing_info.time_max = time_diff; - - timing_info.time_avg += time_diff; - } - - timing_info.n_samples++; - - if ((slot&1) == 1) { - // odd slot -#ifdef EXMIMO - int sf = ((slot>>1)+1)%10; -#else - int sf = hw_subframe; -#endif - /* TODO: is it the right place for master tick? */ - T(T_ENB_MASTER_TICK, T_INT(0), T_INT(frame % 1024), T_INT(sf)); - if (frame>50) { - for (int CC_id=0; CC_idproc[sf].mutex_tx) != 0) { - LOG_E(PHY,"[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx); - } else { - // LOG_I(PHY,"[eNB] Waking up eNB process %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt); - PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx++; - pthread_mutex_unlock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_tx); - - if (PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx == 0) { - if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_tx) != 0) { - LOG_E(PHY,"[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n",sf); - exit_fun("nothing to add"); - } - } else { - LOG_W(PHY,"[eNB] Frame %d, eNB TX thread %d busy!!\n",PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_tx,sf); - exit_fun("nothing to add"); - } - } - -#endif - - if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RX thread %d (IC %d)\n", sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx ); - exit_fun( "error locking mutex_rx" ); - break; - } - - int cnt_rx = ++PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx; - - pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx ); - - if (cnt_rx == 0) { - // the thread was presumably waiting where it should and can now be woken up - if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_rx) != 0) { - LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RX thread %d\n", sf ); - exit_fun( "ERROR pthread_cond_signal" ); - break; - } - } else { - LOG_W( PHY, "[eNB] Frame %d, eNB RX thread %d busy!! instance_cnt %d CC_id %d\n", PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_rx, sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx, CC_id ); - exit_fun( "RX thread busy" ); - break; - } - } - } - } - -#ifdef EXMIMO - slot++; - - if (slot == 20) { - frame++; - slot = 0; - } - -#else - hw_subframe++; - slot += 2; - - if (hw_subframe == NUM_ENB_THREADS) { - // the radio frame is complete, start over - hw_subframe = 0; - frame++; - slot = 1; - } - -#endif - -#if defined(ENABLE_ITTI) - itti_update_lte_time( frame, slot ); -#endif - } - -eNB_thread_cleanup: -#ifdef DEBUG_THREADS - printf( "eNB_thread: finished, ran %d times.\n", frame ); -#endif - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - -#ifdef DEBUG_THREADS - printf( "Exiting eNB_thread ..." ); -#endif - // clean task -#ifdef RTAI - rt_task_delete(task); -#endif - - eNB_thread_status = 0; - - // print_difftimes(); - - return &eNB_thread_status; -} - - - - -static void get_options (int argc, char **argv) -{ - int c; - // char line[1000]; - // int l; - int k,i;//,j,k; -#if defined(OAI_USRP) || defined(CPRIGW) - int clock_src; -#endif - int CC_id; -#ifdef EXMIMO - char rxg_fname[256], line[1000]; - FILE *rxg_fd; - int l; -#endif - - - - - const Enb_properties_array_t *enb_properties; - - enum long_option_e { - LONG_OPTION_START = 0x100, /* Start after regular single char options */ - LONG_OPTION_RF_CONFIG_FILE, - LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS, - LONG_OPTION_CALIB_UE_RX, - LONG_OPTION_CALIB_UE_RX_MED, - LONG_OPTION_CALIB_UE_RX_BYP, - LONG_OPTION_DEBUG_UE_PRACH, - LONG_OPTION_NO_L2_CONNECT, - LONG_OPTION_CALIB_PRACH_TX, - LONG_OPTION_RXGAIN, - LONG_OPTION_TXGAIN, - LONG_OPTION_SCANCARRIER, - LONG_OPTION_MAXPOWER, - LONG_OPTION_DUMP_FRAME, - LONG_OPTION_LOOPMEMORY, - LONG_OPTION_PHYTEST, - -#if T_TRACER - LONG_OPTION_T_PORT, - LONG_OPTION_T_NOWAIT, - LONG_OPTION_T_DONT_FORK, -#endif - }; - - static const struct option long_options[] = { - {"rf-config-file",required_argument, NULL, LONG_OPTION_RF_CONFIG_FILE}, - {"ulsch-max-errors",required_argument, NULL, LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS}, - {"calib-ue-rx", required_argument, NULL, LONG_OPTION_CALIB_UE_RX}, - {"calib-ue-rx-med", required_argument, NULL, LONG_OPTION_CALIB_UE_RX_MED}, - {"calib-ue-rx-byp", required_argument, NULL, LONG_OPTION_CALIB_UE_RX_BYP}, - {"debug-ue-prach", no_argument, NULL, LONG_OPTION_DEBUG_UE_PRACH}, - {"no-L2-connect", no_argument, NULL, LONG_OPTION_NO_L2_CONNECT}, - {"calib-prach-tx", no_argument, NULL, LONG_OPTION_CALIB_PRACH_TX}, - {"ue-rxgain", required_argument, NULL, LONG_OPTION_RXGAIN}, - {"ue-txgain", required_argument, NULL, LONG_OPTION_TXGAIN}, - {"ue-scan-carrier", no_argument, NULL, LONG_OPTION_SCANCARRIER}, - {"ue-max-power", required_argument, NULL, LONG_OPTION_MAXPOWER}, - {"ue-dump-frame", no_argument, NULL, LONG_OPTION_DUMP_FRAME}, - {"loop-memory", required_argument, NULL, LONG_OPTION_LOOPMEMORY}, - {"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST}, - -#if T_TRACER - {"T_port", required_argument, 0, LONG_OPTION_T_PORT}, - {"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT}, - {"T_dont_fork", no_argument, 0, LONG_OPTION_T_DONT_FORK}, -#endif - - {NULL, 0, NULL, 0} - }; - - while ((c = getopt_long (argc, argv, "A:a:C:dEK:g:F:G:hqO:m:SUVRM:r:P:Ws:t:Tx:",long_options,NULL)) != -1) { - switch (c) { - case LONG_OPTION_RF_CONFIG_FILE: - if ((strcmp("null", optarg) == 0) || (strcmp("NULL", optarg) == 0)) { - printf("no configuration filename is provided\n"); - } - else if (strlen(optarg)<=1024){ - strcpy(rf_config_file,optarg); - }else { - printf("Configuration filename is too long\n"); - exit(-1); - } - break; - case LONG_OPTION_MAXPOWER: - tx_max_power[0]=atoi(optarg); - for (CC_id=1;CC_id 0) { opt_type = OPT_PCAP; opt_enabled=1; - - if (optarg == NULL) { - strncpy(in_path, "/tmp/oai_opt.pcap", sizeof(in_path)); - in_path[sizeof(in_path) - 1] = 0; // terminate string - printf("Enabling OPT for PCAP with the following path /tmp/oai_opt.pcap"); - } else { - strncpy(in_path, optarg, sizeof(in_path)); - in_path[sizeof(in_path) - 1] = 0; // terminate string - printf("Enabling OPT for PCAP with the following file %s \n",in_path); - } - - break; - - case 'V': - ouput_vcd = 1; - break; - - case 'q': - opp_enabled = 1; - break; - - case 'R' : - online_log_messages =1; - break; - - case 'r': - UE_scan = 0; - - for (CC_id=0; CC_idN_RB_DL=6; - frame_parms[CC_id]->N_RB_UL=6; - break; - - case 25: - frame_parms[CC_id]->N_RB_DL=25; - frame_parms[CC_id]->N_RB_UL=25; - break; - - case 50: - frame_parms[CC_id]->N_RB_DL=50; - frame_parms[CC_id]->N_RB_UL=50; - break; - - case 100: - frame_parms[CC_id]->N_RB_DL=100; - frame_parms[CC_id]->N_RB_UL=100; - break; - - default: - printf("Unknown N_RB_DL %d, switching to 25\n",atoi(optarg)); - break; - } - } - - break; - - case 's': -#if defined(OAI_USRP) || defined(CPRIGW) - - clock_src = atoi(optarg); - - if (clock_src == 0) { - // char ref[128] = "internal"; - //strncpy(uhd_ref, ref, strlen(ref)+1); - } else if (clock_src == 1) { - //char ref[128] = "external"; - //strncpy(uhd_ref, ref, strlen(ref)+1); - } - -#else - printf("Note: -s not defined for ExpressMIMO2\n"); -#endif - break; - - case 'S': - exit_missed_slots=0; - printf("Skip exit for missed slots\n"); - break; - - case 'g': - glog_level=atoi(optarg); // value between 1 - 9 - break; - - case 'F': -#ifdef EXMIMO - sprintf(rxg_fname,"%srxg.lime",optarg); - rxg_fd = fopen(rxg_fname,"r"); - - if (rxg_fd) { - printf("Loading RX Gain parameters from %s\n",rxg_fname); - l=0; - - while (fgets(line, sizeof(line), rxg_fd)) { - if ((strlen(line)==0) || (*line == '#')) continue; //ignore empty or comment lines - else { - if (l==0) sscanf(line,"%d %d %d %d",&rxg_max[0],&rxg_max[1],&rxg_max[2],&rxg_max[3]); - - if (l==1) sscanf(line,"%d %d %d %d",&rxg_med[0],&rxg_med[1],&rxg_med[2],&rxg_med[3]); - - if (l==2) sscanf(line,"%d %d %d %d",&rxg_byp[0],&rxg_byp[1],&rxg_byp[2],&rxg_byp[3]); - - l++; - } - } - } else - printf("%s not found, running with defaults\n",rxg_fname); - -#endif - break; - - case 'G': - glog_verbosity=atoi(optarg);// value from 0, 0x5, 0x15, 0x35, 0x75 - break; - - case 'x': - transmission_mode = atoi(optarg); - - if (transmission_mode > 7) { - printf("Transmission mode %d not supported for the moment\n",transmission_mode); - exit(-1); - } - break; - - case 'T': - for (CC_id=0; CC_idframe_type = TDD; - break; - - case 'h': - help (); - exit (-1); - - default: - help (); - exit (-1); - break; - } + printf("Enabling OPT for PCAP with the following file %s \n",in_path); + } + if (strlen(in_ip) > 0) { + opt_enabled=1; + opt_type = OPT_WIRESHARK; + printf("Enabling OPT for wireshark for local interface"); } - if (UE_flag == 0) - AssertFatal(conf_config_file_name != NULL,"Please provide a configuration file\n"); + config_process_cmdline( cmdline_logparams,sizeof(cmdline_logparams)/sizeof(paramdef_t),NULL); + if(config_isparamset(cmdline_logparams,CMDLINE_ONLINELOG_IDX)) { + set_glog_onlinelog(online_log_messages); + } + if(config_isparamset(cmdline_logparams,CMDLINE_GLOGLEVEL_IDX)) { + set_glog(glog_level, -1); + } + if(config_isparamset(cmdline_logparams,CMDLINE_GLOGVERBO_IDX)) { + set_glog(-1, glog_verbosity); + } + if (start_telnetsrv) { + load_module_shlib("telnetsrv",NULL,0); + } + + if (UE_flag > 0) { + uint8_t n_rb_dl; + paramdef_t cmdline_uemodeparams[] =CMDLINE_UEMODEPARAMS_DESC; + paramdef_t cmdline_ueparams[] =CMDLINE_UEPARAMS_DESC; - if ((UE_flag == 0) && (conf_config_file_name != NULL)) { - int i,j; + set_default_frame_parms(frame_parms); - NB_eNB_INST = 1; - - /* Read eNB configuration file */ - enb_properties = enb_config_init(conf_config_file_name); - - AssertFatal (NB_eNB_INST <= enb_properties->number, - "Number of eNB is greater than eNB defined in configuration file %s (%d/%d)!", - conf_config_file_name, NB_eNB_INST, enb_properties->number); - - /* Update some simulation parameters */ - for (i=0; i < enb_properties->number; i++) { - AssertFatal (MAX_NUM_CCs == enb_properties->properties[i]->nb_cc, - "lte-softmodem compiled with MAX_NUM_CCs=%d, but only %d CCs configured for eNB %d!", - MAX_NUM_CCs, enb_properties->properties[i]->nb_cc, i); - - for (j=0; jproperties[i]->nb_rrh_gw; j++) { - - if (enb_properties->properties[i]->rrh_gw_config[j].active == 1 ) { - local_remote_radio = BBU_REMOTE_RADIO_HEAD; - eth_params = (eth_params_t*)malloc(sizeof(eth_params_t)); - memset(eth_params, 0, sizeof(eth_params_t)); - - eth_params->local_if_name = enb_properties->properties[i]->rrh_gw_if_name; - eth_params->my_addr = enb_properties->properties[i]->rrh_gw_config[j].local_address; - eth_params->my_port = enb_properties->properties[i]->rrh_gw_config[j].local_port; - eth_params->remote_addr = enb_properties->properties[i]->rrh_gw_config[j].remote_address; - eth_params->remote_port = enb_properties->properties[i]->rrh_gw_config[j].remote_port; - eth_params->transp_preference = enb_properties->properties[i]->rrh_gw_config[j].raw; - eth_params->iq_txshift = enb_properties->properties[i]->rrh_gw_config[j].iq_txshift; - eth_params->tx_sample_advance = enb_properties->properties[i]->rrh_gw_config[j].tx_sample_advance; - eth_params->tx_scheduling_advance = enb_properties->properties[i]->rrh_gw_config[j].tx_scheduling_advance; - if (enb_properties->properties[i]->rrh_gw_config[j].exmimo == 1) { - eth_params->rf_preference = EXMIMO_DEV; - } else if (enb_properties->properties[i]->rrh_gw_config[j].usrp_b200 == 1) { - eth_params->rf_preference = USRP_B200_DEV; - } else if (enb_properties->properties[i]->rrh_gw_config[j].usrp_x300 == 1) { - eth_params->rf_preference = USRP_X300_DEV; - } else if (enb_properties->properties[i]->rrh_gw_config[j].bladerf == 1) { - eth_params->rf_preference = BLADERF_DEV; - } else if (enb_properties->properties[i]->rrh_gw_config[j].lmssdr == 1) { - //eth_params->rf_preference = LMSSDR_DEV; - } else { - eth_params->rf_preference = 0; - } - } else { - local_remote_radio = BBU_LOCAL_RADIO_HEAD; - } - + config_process_cmdline( cmdline_uemodeparams,sizeof(cmdline_uemodeparams)/sizeof(paramdef_t),NULL); + config_process_cmdline( cmdline_ueparams,sizeof(cmdline_ueparams)/sizeof(paramdef_t),NULL); + if (loopfile != NULL) { + printf("Input file for hardware emulation: %s",loopfile); + mode=loop_through_memory; + input_fd = fopen(loopfile,"r"); + AssertFatal(input_fd != NULL,"Please provide a valid input file\n"); } - for (CC_id=0; CC_idframe_type = enb_properties->properties[i]->frame_type[CC_id]; - frame_parms[CC_id]->tdd_config = enb_properties->properties[i]->tdd_config[CC_id]; - frame_parms[CC_id]->tdd_config_S = enb_properties->properties[i]->tdd_config_s[CC_id]; - frame_parms[CC_id]->Ncp = enb_properties->properties[i]->prefix_type[CC_id]; - - //for (j=0; j < enb_properties->properties[i]->nb_cc; j++ ){ - frame_parms[CC_id]->Nid_cell = enb_properties->properties[i]->Nid_cell[CC_id]; - frame_parms[CC_id]->N_RB_DL = enb_properties->properties[i]->N_RB_DL[CC_id]; - frame_parms[CC_id]->N_RB_UL = enb_properties->properties[i]->N_RB_DL[CC_id]; - frame_parms[CC_id]->nb_antennas_tx = enb_properties->properties[i]->nb_antennas_tx[CC_id]; - frame_parms[CC_id]->nb_antennas_tx_eNB = enb_properties->properties[i]->nb_antennas_tx[CC_id]; - frame_parms[CC_id]->nb_antennas_rx = enb_properties->properties[i]->nb_antennas_rx[CC_id]; - //} // j - } - - - init_all_otg(0); - g_otg->seed = 0; - init_seeds(g_otg->seed); - - for (k=0; kproperties[i]->num_otg_elements; k++) { - j=enb_properties->properties[i]->otg_ue_id[k]; // ue_id - g_otg->application_idx[i][j] = 1; - //g_otg->packet_gen_type=SUBSTRACT_STRING; - g_otg->background[i][j][0] =enb_properties->properties[i]->otg_bg_traffic[k]; - g_otg->application_type[i][j][0] =enb_properties->properties[i]->otg_app_type[k];// BCBR; //MCBR, BCBR - - printf("[OTG] configuring traffic type %d for eNB %d UE %d (Background traffic is %s)\n", - g_otg->application_type[i][j][0], i, j,(g_otg->background[i][j][0]==1)?"Enabled":"Disabled"); - } - - init_predef_traffic(enb_properties->properties[i]->num_otg_elements, 1); - - - glog_level = enb_properties->properties[i]->glog_level; - glog_verbosity = enb_properties->properties[i]->glog_verbosity; - hw_log_level = enb_properties->properties[i]->hw_log_level; - hw_log_verbosity = enb_properties->properties[i]->hw_log_verbosity ; - phy_log_level = enb_properties->properties[i]->phy_log_level; - phy_log_verbosity = enb_properties->properties[i]->phy_log_verbosity; - mac_log_level = enb_properties->properties[i]->mac_log_level; - mac_log_verbosity = enb_properties->properties[i]->mac_log_verbosity; - rlc_log_level = enb_properties->properties[i]->rlc_log_level; - rlc_log_verbosity = enb_properties->properties[i]->rlc_log_verbosity; - pdcp_log_level = enb_properties->properties[i]->pdcp_log_level; - pdcp_log_verbosity = enb_properties->properties[i]->pdcp_log_verbosity; - rrc_log_level = enb_properties->properties[i]->rrc_log_level; - rrc_log_verbosity = enb_properties->properties[i]->rrc_log_verbosity; -# if defined(ENABLE_USE_MME) - gtpu_log_level = enb_properties->properties[i]->gtpu_log_level; - gtpu_log_verbosity = enb_properties->properties[i]->gtpu_log_verbosity; - udp_log_level = enb_properties->properties[i]->udp_log_level; - udp_log_verbosity = enb_properties->properties[i]->udp_log_verbosity; -#endif -#if defined (ENABLE_SECURITY) - osa_log_level = enb_properties->properties[i]->osa_log_level; - osa_log_verbosity = enb_properties->properties[i]->osa_log_verbosity; -#endif - - // adjust the log - for (CC_id=0; CC_idproperties[i]->downlink_frequency[CC_id]; - uplink_frequency_offset[CC_id][k] = enb_properties->properties[i]->uplink_frequency_offset[CC_id]; - rx_gain[CC_id][k] = (double)enb_properties->properties[i]->rx_gain[CC_id]; - tx_gain[CC_id][k] = (double)enb_properties->properties[i]->tx_gain[CC_id]; - } - - printf("Downlink frequency/ uplink offset of CC_id %d set to %ju/%d\n", CC_id, - enb_properties->properties[i]->downlink_frequency[CC_id], - enb_properties->properties[i]->uplink_frequency_offset[CC_id]); - } // CC_id - }// i - } else if (UE_flag == 1) { - if (conf_config_file_name != NULL) { + if ( (cmdline_uemodeparams[CMDLINE_CALIBUERX_IDX].paramflags & PARAMFLAG_PARAMSET) != 0) mode = rx_calib_ue; + if ( (cmdline_uemodeparams[CMDLINE_CALIBUERXMED_IDX].paramflags & PARAMFLAG_PARAMSET) != 0) mode = rx_calib_ue_med; + if ( (cmdline_uemodeparams[CMDLINE_CALIBUERXBYP_IDX].paramflags & PARAMFLAG_PARAMSET) != 0) mode = rx_calib_ue_byp; + if ( (cmdline_uemodeparams[CMDLINE_DEBUGUEPRACH_IDX].paramflags & PARAMFLAG_PARAMSET) != 0) mode = debug_prach; + if ( (cmdline_uemodeparams[CMDLINE_NOL2CONNECT_IDX].paramflags & PARAMFLAG_PARAMSET) != 0) mode = no_L2_connect; + if ( (cmdline_uemodeparams[CMDLINE_CALIBPRACHTX_IDX].paramflags & PARAMFLAG_PARAMSET) != 0) mode = calib_prach_tx; + if (dumpframe > 0) mode = rx_dump_frame; - // Here the configuration file is the XER encoded UE capabilities - // Read it in and store in asn1c data structures - strcpy(uecap_xer,conf_config_file_name); - uecap_xer_in=1; - } - } -} + if ( downlink_frequency[0][0] > 0) { + printf("Downlink frequency set to %u\n", downlink_frequency[0][0]); + for (CC_id=0; CC_iddl_CarrierFreq = downlink_frequency[0][0]; + } + UE_scan=0; + } + + if (tddflag > 0) { + for (CC_id=0; CC_idframe_type = TDD; + } + + if (n_rb_dl !=0) { + printf("NB_RB set to %d\n",n_rb_dl); + if ( n_rb_dl < 6 ) { + n_rb_dl = 6; + printf ( "%i: Invalid number of ressource blocks, adjusted to 6\n",n_rb_dl); + } + if ( n_rb_dl > 100 ) { + n_rb_dl = 100; + printf ( "%i: Invalid number of ressource blocks, adjusted to 100\n",n_rb_dl); + } + if ( n_rb_dl > 50 && n_rb_dl < 100 ) { + n_rb_dl = 50; + printf ( "%i: Invalid number of ressource blocks, adjusted to 50\n",n_rb_dl); + } + if ( n_rb_dl > 25 && n_rb_dl < 50 ) { + n_rb_dl = 25; + printf ( "%i: Invalid number of ressource blocks, adjusted to 25\n",n_rb_dl); + } + UE_scan = 0; + for (CC_id=0; CC_idN_RB_DL=n_rb_dl; + frame_parms[CC_id]->N_RB_UL=n_rb_dl; + } + } + + for (CC_id=0;CC_id 0 */ #if T_TRACER -int T_wait = 1; /* by default we wait for the tracer */ + paramdef_t cmdline_ttraceparams[] =CMDLINE_TTRACEPARAMS_DESC ; + config_process_cmdline( cmdline_ttraceparams,sizeof(cmdline_ttraceparams)/sizeof(paramdef_t),NULL); +#endif + + if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) { + if (UE_flag == 0) { + memset((void*)&RC,0,sizeof(RC)); + /* Read RC configuration file */ + RCConfig(); + NB_eNB_INST = RC.nb_inst; + NB_RU = RC.nb_RU; + printf("Configuration: nb_rrc_inst %d, nb_L1_inst %d, nb_ru %d\n",NB_eNB_INST,RC.nb_L1_inst,NB_RU); + } + } else if (UE_flag == 1 && (!(CONFIG_ISFLAGSET(CONFIG_NOOOPT))) ) { + // Here the configuration file is the XER encoded UE capabilities + // Read it in and store in asn1c data structures + sprintf(uecap_xer,"%stargets/PROJECTS/GENERIC-LTE-EPC/CONF/UE_config.xml",getenv("OPENAIR_HOME")); + printf("%s\n",uecap_xer); + uecap_xer_in=1; + } /* UE with config file */ +} + + +#if T_TRACER +int T_nowait = 0; /* by default we wait for the tracer */ int T_port = 2021; /* default port to listen to to wait for the tracer */ int T_dont_fork = 0; /* default is to fork, see 'T_init' to understand */ #endif -int main( int argc, char **argv ) -{ - int i,aa,card=0; -#if defined (XFORMS) || defined (EMOS) || defined (EXMIMO) - void *status; -#endif + + +void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) { int CC_id; - uint16_t Nid_cell = 0; - uint8_t cooperation_flag=0, abstraction_flag=0; - uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; - -#ifdef ENABLE_TCXO - unsigned int tcxo = 114; -#endif - -#if defined (XFORMS) - int ret; -#endif -#if defined (EMOS) || (! defined (RTAI)) - int error_code; -#endif - -#ifdef DEBUG_CONSOLE - setvbuf(stdout, NULL, _IONBF, 0); - setvbuf(stderr, NULL, _IONBF, 0); -#endif - - PHY_VARS_UE *UE[MAX_NUM_CCs]; - - mode = normal_txrx; - memset(&openair0_cfg[0],0,sizeof(openair0_config_t)*MAX_CARDS); - - memset(tx_max_power,0,sizeof(int)*MAX_NUM_CCs); - set_latency_target(); for (CC_id=0; CC_idN_RB_UL = 100; frame_parms[CC_id]->Ncp = NORMAL; frame_parms[CC_id]->Ncp_UL = NORMAL; - frame_parms[CC_id]->Nid_cell = Nid_cell; + frame_parms[CC_id]->Nid_cell = 0; frame_parms[CC_id]->num_MBSFN_config = 0; - frame_parms[CC_id]->nb_antennas_tx_eNB = 1; + frame_parms[CC_id]->nb_antenna_ports_eNB = 1; frame_parms[CC_id]->nb_antennas_tx = 1; frame_parms[CC_id]->nb_antennas_rx = 1; - } - for (CC_id=0; CC_idnushift = 0; - // initialize the log (see log.h for details) - set_glog(glog_level, glog_verbosity); - - //randominit (0); - set_taus_seed (0); - - if (UE_flag==1) { - printf("configuring for UE\n"); - - set_comp_log(HW, LOG_DEBUG, LOG_HIGH, 1); - set_comp_log(PHY, LOG_DEBUG, LOG_HIGH, 1); - set_comp_log(MAC, LOG_INFO, LOG_HIGH, 1); - set_comp_log(RLC, LOG_INFO, LOG_HIGH, 1); - set_comp_log(PDCP, LOG_INFO, LOG_HIGH, 1); - set_comp_log(OTG, LOG_INFO, LOG_HIGH, 1); - set_comp_log(RRC, LOG_INFO, LOG_HIGH, 1); -#if defined(ENABLE_ITTI) - set_comp_log(EMU, LOG_INFO, LOG_MED, 1); -# if defined(ENABLE_USE_MME) - set_comp_log(NAS, LOG_INFO, LOG_HIGH, 1); -# endif -#endif - } else { - printf("configuring for eNB\n"); - - set_comp_log(HW, hw_log_level, hw_log_verbosity, 1); - set_comp_log(PHY, phy_log_level, phy_log_verbosity, 1); - if (opt_enabled == 1 ) - set_comp_log(OPT, opt_log_level, opt_log_verbosity, 1); - set_comp_log(MAC, mac_log_level, mac_log_verbosity, 1); - set_comp_log(RLC, rlc_log_level, rlc_log_verbosity, 1); - set_comp_log(PDCP, pdcp_log_level, pdcp_log_verbosity, 1); - set_comp_log(RRC, rrc_log_level, rrc_log_verbosity, 1); -#if defined(ENABLE_ITTI) - set_comp_log(EMU, LOG_INFO, LOG_MED, 1); -# if defined(ENABLE_USE_MME) - set_comp_log(UDP_, udp_log_level, udp_log_verbosity, 1); - set_comp_log(GTPU, gtpu_log_level, gtpu_log_verbosity, 1); - set_comp_log(S1AP, LOG_DEBUG, LOG_HIGH, 1); - set_comp_log(SCTP, LOG_INFO, LOG_HIGH, 1); -# endif -#if defined(ENABLE_SECURITY) - set_comp_log(OSA, osa_log_level, osa_log_verbosity, 1); -#endif -#endif -#ifdef LOCALIZATION - set_comp_log(LOCALIZE, LOG_DEBUG, LOG_LOW, 1); - set_component_filelog(LOCALIZE); -#endif - set_comp_log(ENB_APP, LOG_INFO, LOG_HIGH, 1); - set_comp_log(OTG, LOG_INFO, LOG_HIGH, 1); - - if (online_log_messages == 1) { - set_component_filelog(RRC); - set_component_filelog(PDCP); - } - } - - if (ouput_vcd) { - if (UE_flag==1) - VCD_SIGNAL_DUMPER_INIT("/tmp/openair_dump_UE.vcd"); - else - VCD_SIGNAL_DUMPER_INIT("/tmp/openair_dump_eNB.vcd"); - } - - if (opp_enabled ==1){ - reset_opp_meas(); - } - cpuf=get_cpu_freq_GHz(); - -#if defined(ENABLE_ITTI) - - if (UE_flag == 1) { - log_set_instance_type (LOG_INSTANCE_UE); - } else { - log_set_instance_type (LOG_INSTANCE_ENB); - } - - itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, itti_dump_file); - - // initialize mscgen log after ITTI - MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX); -#endif - - if (opt_type != OPT_NONE) { - radio_type_t radio_type; - - if (frame_parms[0]->frame_type == FDD) - radio_type = RADIO_TYPE_FDD; - else - radio_type = RADIO_TYPE_TDD; - - if (init_opt(in_path, in_ip, NULL, radio_type) == -1) - LOG_E(OPT,"failed to run OPT \n"); - } - -#ifdef PDCP_USE_NETLINK - netlink_init(); -#if defined(PDCP_USE_NETLINK_QUEUES) - pdcp_netlink_init(); -#endif -#endif - -#if !defined(ENABLE_ITTI) - // to make a graceful exit when ctrl-c is pressed - signal(SIGSEGV, signal_handler); - signal(SIGINT, signal_handler); -#endif - -#ifndef RTAI - check_clock(); -#endif - - // init the parameters - for (CC_id=0; CC_idnushift = 0; - - if (UE_flag==0) { - - } else { - //UE_flag==1 - frame_parms[CC_id]->nb_antennas_tx = 1; - frame_parms[CC_id]->nb_antennas_rx = 1; - frame_parms[CC_id]->nb_antennas_tx_eNB = (transmission_mode == 1) ? 1 : 2; //initial value overwritten by initial sync later - } - - frame_parms[CC_id]->mode1_flag = (transmission_mode == 1) ? 1 : 0; frame_parms[CC_id]->phich_config_common.phich_resource = oneSixth; frame_parms[CC_id]->phich_config_common.phich_duration = normal; // UL RS Config @@ -3041,223 +737,45 @@ int main( int argc, char **argv ) frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 0; frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0; frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0; - frame_parms[CC_id]->threequarter_fs = threequarter_fs; - init_ul_hopping(frame_parms[CC_id]); - init_frame_parms(frame_parms[CC_id],1); - // phy_init_top(frame_parms[CC_id]); - phy_init_lte_top(frame_parms[CC_id]); - } - - for (CC_id=0; CC_idprach_config_common.rootSequenceIndex=22; frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=1; frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.highSpeedFlag=0; frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_FreqOffset=0; - // prach_fmt = get_prach_fmt(frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, frame_parms->frame_type); - // N_ZC = (prach_fmt <4)?839:139; - } - if (UE_flag==1) { - NB_UE_INST=1; - NB_INST=1; - - PHY_vars_UE_g = malloc(sizeof(PHY_VARS_UE**)); - PHY_vars_UE_g[0] = malloc(sizeof(PHY_VARS_UE*)*MAX_NUM_CCs); - - for (CC_id=0; CC_idmac_enabled = 0; - else - UE[CC_id]->mac_enabled = 1; - - if (UE[CC_id]->mac_enabled == 0) { - for (i=0; ipusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; - UE[CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; - UE[CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; - - UE[CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = 0; - UE[CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(0%3); - UE[CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4; - } - } - - UE[CC_id]->UE_scan = UE_scan; - UE[CC_id]->UE_scan_carrier = UE_scan_carrier; - UE[CC_id]->mode = mode; - - compute_prach_seq(&UE[CC_id]->lte_frame_parms.prach_config_common, - UE[CC_id]->lte_frame_parms.frame_type, - UE[CC_id]->X_u); - - if (UE[CC_id]->mac_enabled == 1) - UE[CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1234; - else - UE[CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1235; - -#ifdef EXMIMO - for (i=0; i<4; i++) { - UE[CC_id]->rx_gain_max[i] = rxg_max[i]; - UE[CC_id]->rx_gain_med[i] = rxg_med[i]; - UE[CC_id]->rx_gain_byp[i] = rxg_byp[i]; - } - - if ((UE[0]->mode == normal_txrx) || - (UE[0]->mode == rx_calib_ue) || - (UE[0]->mode == no_L2_connect) || - (UE[0]->mode == debug_prach)) { - for (i=0; i<4; i++) - rx_gain_mode[CC_id][i] = max_gain; - - UE[CC_id]->rx_total_gain_dB = UE[CC_id]->rx_gain_max[0] + (int)rx_gain[CC_id][0] - 30; //-30 because it was calibrated with a 30dB gain - } else if ((mode == rx_calib_ue_med)) { - for (i=0; i<4; i++) - rx_gain_mode[CC_id][i] = med_gain; - - UE[CC_id]->rx_total_gain_dB = UE[CC_id]->rx_gain_med[0] + (int)rx_gain[CC_id][0] - 30; //-30 because it was calibrated with a 30dB gain; - } else if ((mode == rx_calib_ue_byp)) { - for (i=0; i<4; i++) - rx_gain_mode[CC_id][i] = byp_gain; - - UE[CC_id]->rx_total_gain_dB = UE[CC_id]->rx_gain_byp[0] + (int)rx_gain[CC_id][0] - 30; //-30 because it was calibrated with a 30dB gain; - } - -#else - UE[CC_id]->rx_total_gain_dB = (int)rx_gain[CC_id][0]; -#endif - - UE[CC_id]->tx_power_max_dBm = tx_max_power[CC_id]; - - -#ifdef EXMIMO - //N_TA_offset - if (UE[CC_id]->lte_frame_parms.frame_type == TDD) { - if (UE[CC_id]->lte_frame_parms.N_RB_DL == 100) - UE[CC_id]->N_TA_offset = 624; - else if (UE[CC_id]->lte_frame_parms.N_RB_DL == 50) - UE[CC_id]->N_TA_offset = 624/2; - else if (UE[CC_id]->lte_frame_parms.N_RB_DL == 25) - UE[CC_id]->N_TA_offset = 624/4; - } else { - UE[CC_id]->N_TA_offset = 0; - } -#else - //already taken care of in lte-softmodem - UE[CC_id]->N_TA_offset = 0; -#endif - } - - openair_daq_vars.manual_timing_advance = 0; - openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; - openair_daq_vars.auto_freq_correction = 0; - openair_daq_vars.use_ia_receiver = 0; - - - - // printf("tx_max_power = %d -> amp %d\n",tx_max_power,get_tx_amp(tx_max_power,tx_max_power)); - } else { - //this is eNB - PHY_vars_eNB_g = malloc(sizeof(PHY_VARS_eNB**)); - PHY_vars_eNB_g[0] = malloc(sizeof(PHY_VARS_eNB*)); - - for (CC_id=0; CC_idNid_cell,cooperation_flag,transmission_mode,abstraction_flag); - PHY_vars_eNB_g[0][CC_id]->CC_id = CC_id; - - if (phy_test==1) - PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0; - else - PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1; - - if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) { - for (i=0; ipusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; - PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; - PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; - - PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = i; - PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(i%3); - PHY_vars_eNB_g[0][CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4; - } - } - - compute_prach_seq(&PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.prach_config_common, - PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.frame_type, - PHY_vars_eNB_g[0][CC_id]->X_u); - -#ifndef EXMIMO - - PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB = (int)rx_gain[CC_id][0]; - -#else - PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB = rxg_max[0] + (int)rx_gain[CC_id][0] - 30; //was measured at rxgain=30; - - printf("Setting RX total gain to %d\n",PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB); - - // set eNB to max gain - for (i=0; i<4; i++) - rx_gain_mode[CC_id][i] = max_gain; - -#endif - -#ifdef EXMIMO - - //N_TA_offset - if (PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.frame_type == TDD) { - if (PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.N_RB_DL == 100) - PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624; - else if (PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.N_RB_DL == 50) - PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624/2; - else if (PHY_vars_eNB_g[0][CC_id]->lte_frame_parms.N_RB_DL == 25) - PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624/4; - } else { - PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0; - } - -#else - //already taken care of in lte-softmodem.c - PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0; -#endif - - } - - - NB_eNB_INST=1; - NB_INST=1; - - openair_daq_vars.ue_dl_rb_alloc=0x1fff; - openair_daq_vars.target_ue_dl_mcs=target_dl_mcs; - openair_daq_vars.ue_ul_nb_rb=6; - openair_daq_vars.target_ue_ul_mcs=target_ul_mcs; +// downlink_frequency[CC_id][0] = 2680000000; // Use float to avoid issue with frequency over 2^31. +// downlink_frequency[CC_id][1] = downlink_frequency[CC_id][0]; +// downlink_frequency[CC_id][2] = downlink_frequency[CC_id][0]; +// downlink_frequency[CC_id][3] = downlink_frequency[CC_id][0]; + //printf("Downlink for CC_id %d frequency set to %u\n", CC_id, downlink_frequency[CC_id][0]); + frame_parms[CC_id]->dl_CarrierFreq=downlink_frequency[CC_id][0]; } -#ifndef RTAI - fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx); - cpuf=get_cpu_freq_GHz(); -#endif - dump_frame_parms(frame_parms[0]); +} + +void init_openair0(void); + +void init_openair0() { + + int card; + int i; for (card=0; cardN_RB_DL == 100) { if (frame_parms[0]->threequarter_fs) { openair0_cfg[card].sample_rate=23.04e6; - openair0_cfg[card].samples_per_frame = 230400; + openair0_cfg[card].samples_per_frame = 230400; openair0_cfg[card].tx_bw = 10e6; openair0_cfg[card].rx_bw = 10e6; - } - else { + } else { openair0_cfg[card].sample_rate=30.72e6; - openair0_cfg[card].samples_per_frame = 307200; + openair0_cfg[card].samples_per_frame = 307200; openair0_cfg[card].tx_bw = 10e6; openair0_cfg[card].rx_bw = 10e6; } @@ -3278,339 +796,429 @@ int main( int argc, char **argv ) openair0_cfg[card].rx_bw = 1.5e6; } + + + if (frame_parms[0]->frame_type==TDD) openair0_cfg[card].duplex_mode = duplex_mode_TDD; else //FDD openair0_cfg[card].duplex_mode = duplex_mode_FDD; - - if (local_remote_radio == BBU_REMOTE_RADIO_HEAD) { - openair0_cfg[card].remote_addr = eth_params->remote_addr; - openair0_cfg[card].remote_port = eth_params->remote_port; - openair0_cfg[card].my_addr = eth_params->my_addr; - openair0_cfg[card].my_port = eth_params->my_port; - } - printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card, - ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx), - ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx)); + ((UE_flag==0) ? RC.eNB[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx), + ((UE_flag==0) ? RC.eNB[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx)); openair0_cfg[card].Mod_id = 0; -#ifdef ETHERNET - - if (UE_flag) { - printf("ETHERNET: Configuring UE ETH for %s:%d\n",rrh_UE_ip,rrh_UE_port); - openair0_cfg[card].remote_addr = &rrh_UE_ip[0]; - openair0_cfg[card].remote_port = rrh_UE_port; - } openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL; -#endif - // in the case of the USRP, the following variables need to be initialized before the init - // since the USRP only supports one CC (for the moment), we initialize all the cards with first CC. - // in the case of EXMIMO2, these values are overwirtten in the function setup_eNB/UE_buffer -#ifndef EXMIMO - openair0_cfg[card].tx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx)); - openair0_cfg[card].rx_num_channels=min(2,((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx)); + openair0_cfg[card].clock_source = clock_source; + + + openair0_cfg[card].tx_num_channels=min(2,((UE_flag==0) ? RC.eNB[0][0]->frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_tx)); + openair0_cfg[card].rx_num_channels=min(2,((UE_flag==0) ? RC.eNB[0][0]->frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->frame_parms.nb_antennas_rx)); for (i=0; i<4; i++) { - openair0_cfg[card].tx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] : downlink_frequency[0][i]+uplink_frequency_offset[0][i]; - openair0_cfg[card].rx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] + uplink_frequency_offset[0][i] : downlink_frequency[0][i]; - printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n", - card,i, openair0_cfg[card].tx_gain[i], - openair0_cfg[card].rx_gain[i], - openair0_cfg[card].tx_freq[i], - openair0_cfg[card].rx_freq[i]); - + if (irx_total_gain_eNB_dB; + openair0_cfg[card].rx_gain[i] = RC.eNB[0][0]->rx_total_gain_dB; } else { - openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB; + openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB - rx_gain_off; } -#if 0 // UHD 3.8 - switch(frame_parms[0]->N_RB_DL) { - case 6: - openair0_cfg[card].rx_gain[i] -= 12; - break; - - case 25: - openair0_cfg[card].rx_gain[i] -= 6; - break; - - case 50: - openair0_cfg[card].rx_gain[i] -= 3; - break; - - case 100: - openair0_cfg[card].rx_gain[i] -= 0; - break; - - default: - break; - } -#endif - + openair0_cfg[card].configFilename = rf_config_file; + printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n", + card,i, openair0_cfg[card].tx_gain[i], + openair0_cfg[card].rx_gain[i], + openair0_cfg[card].tx_freq[i], + openair0_cfg[card].rx_freq[i]); } + } +} -#endif + +void wait_RUs(void) { + + LOG_I(PHY,"Waiting for RUs to be configured ... RC.ru_mask:%02lx\n", RC.ru_mask); + + // wait for all RUs to be configured over fronthaul + pthread_mutex_lock(&RC.ru_mutex); + + + + while (RC.ru_mask>0) { + pthread_cond_wait(&RC.ru_cond,&RC.ru_mutex); + printf("RC.ru_mask:%02lx\n", RC.ru_mask); } -#ifndef DEADLINE_SCHEDULER + LOG_I(PHY,"RUs configured\n"); +} +void wait_eNBs(void) { + + int i,j; + int waiting=1; + + + while (waiting==1) { + printf("Waiting for eNB L1 instances to all get configured ... sleeping 50ms (nb_L1_inst %d)\n",RC.nb_L1_inst); + usleep(50*1000); + waiting=0; + for (i=0;iconfigured==0) { + waiting=1; + break; + } + } + } + } + printf("eNB L1 are configured\n"); +} + +static inline void wait_nfapi_init(char *thread_name) { + + printf( "waiting for NFAPI PNF connection and population of global structure (%s)\n",thread_name); + pthread_mutex_lock( &nfapi_sync_mutex ); + + while (nfapi_sync_var<0) + pthread_cond_wait( &nfapi_sync_cond, &nfapi_sync_mutex ); + + pthread_mutex_unlock(&nfapi_sync_mutex); + + printf( "NFAPI: got sync (%s)\n", thread_name); +} + +int main( int argc, char **argv ) +{ + int i; +#if defined (XFORMS) + void *status; +#endif + + int CC_id; + int ru_id; + uint8_t abstraction_flag=0; + uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; + +#if defined (XFORMS) + int ret; +#endif + + start_background_system(); + if ( load_configmodule(argc,argv) == NULL) { + exit_fun("[SOFTMODEM] Error, configuration module init failed\n"); + } + +#ifdef DEBUG_CONSOLE + setvbuf(stdout, NULL, _IONBF, 0); + setvbuf(stderr, NULL, _IONBF, 0); +#endif + + PHY_VARS_UE *UE[MAX_NUM_CCs]; + + mode = normal_txrx; + memset(&openair0_cfg[0],0,sizeof(openair0_config_t)*MAX_CARDS); + + memset(tx_max_power,0,sizeof(int)*MAX_NUM_CCs); + + set_latency_target(); + + + // set default parameters + //if (UE_flag == 1) set_default_frame_parms(frame_parms); + + logInit(); + + printf("Reading in command-line options\n"); + + get_options (); + if (CONFIG_ISFLAGSET(CONFIG_ABORT) && UE_flag == 0) { + fprintf(stderr,"Getting configuration failed\n"); + exit(-1); + } + + +#if T_TRACER + T_init(T_port, 1-T_nowait, T_dont_fork); +#endif + + + + //randominit (0); + set_taus_seed (0); + + if (UE_flag==1) { + printf("configuring for UE\n"); + + set_comp_log(HW, LOG_DEBUG, LOG_HIGH, 1); + set_comp_log(PHY, LOG_INFO, LOG_HIGH, 1); + set_comp_log(MAC, LOG_INFO, LOG_HIGH, 1); + set_comp_log(RLC, LOG_INFO, LOG_HIGH | FLAG_THREAD, 1); + set_comp_log(PDCP, LOG_INFO, LOG_HIGH, 1); + set_comp_log(OTG, LOG_INFO, LOG_HIGH, 1); + set_comp_log(RRC, LOG_INFO, LOG_HIGH, 1); +#if defined(ENABLE_ITTI) + set_comp_log(EMU, LOG_INFO, LOG_MED, 1); +# if defined(ENABLE_USE_MME) + set_comp_log(NAS, LOG_INFO, LOG_HIGH, 1); +# endif +#endif + + } else { + printf("configuring for RAU/RRU\n"); + + } + + if (ouput_vcd) { + if (UE_flag==1) + VCD_SIGNAL_DUMPER_INIT("/tmp/openair_dump_UE.vcd"); + else + VCD_SIGNAL_DUMPER_INIT("/tmp/openair_dump_eNB.vcd"); + } + + if (opp_enabled ==1) { + reset_opp_meas(); + } + cpuf=get_cpu_freq_GHz(); + +#if defined(ENABLE_ITTI) + + if (UE_flag == 1) { + log_set_instance_type (LOG_INSTANCE_UE); + } else { + log_set_instance_type (LOG_INSTANCE_ENB); + } + + printf("ITTI init\n"); + itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, itti_dump_file); + + // initialize mscgen log after ITTI + MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX); +#endif + + if (opt_type != OPT_NONE) { + radio_type_t radio_type; + + if (frame_parms[0]->frame_type == FDD) + radio_type = RADIO_TYPE_FDD; + else + radio_type = RADIO_TYPE_TDD; + + if (init_opt(in_path, in_ip, NULL, radio_type) == -1) + LOG_E(OPT,"failed to run OPT \n"); + } + +#ifdef PDCP_USE_NETLINK + printf("PDCP netlink\n"); + netlink_init(); +#if defined(PDCP_USE_NETLINK_QUEUES) + pdcp_netlink_init(); +#endif +#endif + +#if !defined(ENABLE_ITTI) + // to make a graceful exit when ctrl-c is pressed + signal(SIGSEGV, signal_handler); + signal(SIGINT, signal_handler); +#endif + + + check_clock(); + +#ifndef PACKAGE_VERSION +# define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL" +#endif + + LOG_I(HW, "Version: %s\n", PACKAGE_VERSION); + + // init the parameters + for (CC_id=0; CC_idnb_antennas_tx = nb_antenna_tx; + frame_parms[CC_id]->nb_antennas_rx = nb_antenna_rx; + frame_parms[CC_id]->nb_antenna_ports_eNB = 1; //initial value overwritten by initial sync later + } + } + + + + printf("Before CC \n"); + + for (CC_id=0; CC_idmac_enabled = 0; + else + UE[CC_id]->mac_enabled = 1; + + if (UE[CC_id]->mac_enabled == 0) { //set default UL parameters for testing mode + for (i=0; ipusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK; + UE[CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index = beta_RI; + UE[CC_id]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI; + + UE[CC_id]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = 0; + UE[CC_id]->scheduling_request_config[i].sr_ConfigIndex = 7+(0%3); + UE[CC_id]->scheduling_request_config[i].dsr_TransMax = sr_n4; + } + } + + UE[CC_id]->UE_scan = UE_scan; + UE[CC_id]->UE_scan_carrier = UE_scan_carrier; + UE[CC_id]->mode = mode; + printf("UE[%d]->mode = %d\n",CC_id,mode); + + if (UE[CC_id]->mac_enabled == 1) { + UE[CC_id]->pdcch_vars[0][0]->crnti = 0x1234; + UE[CC_id]->pdcch_vars[1][0]->crnti = 0x1234; + }else { + UE[CC_id]->pdcch_vars[0][0]->crnti = 0x1235; + UE[CC_id]->pdcch_vars[1][0]->crnti = 0x1235; + } + UE[CC_id]->rx_total_gain_dB = (int)rx_gain[CC_id][0] + rx_gain_off; + UE[CC_id]->tx_power_max_dBm = tx_max_power[CC_id]; + + if (frame_parms[CC_id]->frame_type==FDD) { + UE[CC_id]->N_TA_offset = 0; + } + else { + if (frame_parms[CC_id]->N_RB_DL == 100) + UE[CC_id]->N_TA_offset = 624; + else if (frame_parms[CC_id]->N_RB_DL == 50) + UE[CC_id]->N_TA_offset = 624/2; + else if (frame_parms[CC_id]->N_RB_DL == 25) + UE[CC_id]->N_TA_offset = 624/4; + } + init_openair0(); + } + + } + + printf("Runtime table\n"); + fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx); + cpuf=get_cpu_freq_GHz(); + + + +#ifndef DEADLINE_SCHEDULER + + printf("NO deadline scheduler\n"); /* Currently we set affinity for UHD to CPU 0 for eNB/UE and only if number of CPUS >2 */ cpu_set_t cpuset; int s; char cpu_affinity[1024]; CPU_ZERO(&cpuset); - #ifdef CPU_AFFINITY - if (get_nprocs() > 2) - { +#ifdef CPU_AFFINITY + if (get_nprocs() > 2) { CPU_SET(0, &cpuset); s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { + if (s != 0) { perror( "pthread_setaffinity_np"); exit_fun("Error setting processor affinity"); } LOG_I(HW, "Setting the affinity of main function to CPU 0, for device library to use CPU 0 only!\n"); } - #endif - +#endif + /* Check the actual affinity mask assigned to the thread */ s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { + if (s != 0) { perror( "pthread_getaffinity_np"); exit_fun("Error getting processor affinity "); } memset(cpu_affinity, 0 , sizeof(cpu_affinity)); - for (int j = 0; j < CPU_SETSIZE; j++) - { - if (CPU_ISSET(j, &cpuset)) - { + for (int j = 0; j < CPU_SETSIZE; j++) { + if (CPU_ISSET(j, &cpuset)) { char temp[1024]; - sprintf(temp, " CPU_%d ", j); + sprintf(temp, " CPU_%d ", j); strcat(cpu_affinity, temp); } } LOG_I(HW, "CPU Affinity of main() function is... %s\n", cpu_affinity); #endif - - /* device host type is set*/ - openair0.host_type = BBU_HOST; - /* device type is initialized NONE_DEV (no RF device) when the RF device will be initiated device type will be set */ - openair0.type = NONE_DEV; - /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ - openair0.transp_type = NONE_TP; - openair0_cfg[0].log_level = glog_level; - - int returns=-1; - /* BBU can have either a local or a remote radio head */ - if (local_remote_radio == BBU_LOCAL_RADIO_HEAD) { //local radio head active - load library of radio head and initiate it - if (mode!=loop_through_memory) { - returns=openair0_device_load(&openair0, &openair0_cfg[0]); - printf("openair0_device_init returns %d\n",returns); - if (returns<0) { - printf("Exiting, cannot initialize device\n"); - exit(-1); - } - } - else if (mode==loop_through_memory) { - } - } else { //remote radio head active - load library of transport protocol and initiate it - if (mode!=loop_through_memory) { - returns=openair0_transport_load(&openair0, &openair0_cfg[0], eth_params); - printf("openair0_transport_init returns %d\n",returns); - if (returns<0) { - printf("Exiting, cannot initialize transport protocol\n"); - exit(-1); - } - } - else if (mode==loop_through_memory) { - } - } - printf("Done\n"); - mac_xface = malloc(sizeof(MAC_xface)); - - int eMBMS_active=0; - l2_init(frame_parms[0],eMBMS_active,(uecap_xer_in==1)?uecap_xer:NULL, - 0,// cba_group_active - 0); // HO flag - mac_xface->macphy_exit = &exit_fun; - #if defined(ENABLE_ITTI) - - if (create_tasks(UE_flag ? 0 : 1, UE_flag ? 1 : 0) < 0) { - printf("cannot create ITTI tasks\n"); - exit(-1); // need a softer mode + if ((UE_flag == 1)|| + (RC.nb_inst > 0)) { + + // don't create if node doesn't connect to RRC/S1/GTP + if (create_tasks(UE_flag ? 0 : 1, UE_flag ? 1 : 0) < 0) { + printf("cannot create ITTI tasks\n"); + exit(-1); // need a softer mode + } + + printf("ITTI tasks created\n"); } - - printf("ITTI tasks created\n"); -#endif - - if (phy_test==0) { - if (UE_flag==1) { - printf("Filling UE band info\n"); - fill_ue_band_info(); - mac_xface->dl_phy_sync_success (0, 0, 0, 1); - } else - mac_xface->mrbch_phy_sync_failure (0, 0, 0); + else { + printf("No ITTI, Initializing L1\n"); + RCconfig_L1(); } - - /* #ifdef OPENAIR2 - //if (otg_enabled) { - init_all_otg(0); - g_otg->seed = 0; - init_seeds(g_otg->seed); - g_otg->num_nodes = 2; - for (i=0; inum_nodes; i++){ - for (j=0; jnum_nodes; j++){ - g_otg->application_idx[i][j] = 1; - //g_otg->packet_gen_type=SUBSTRACT_STRING; - g_otg->aggregation_level[i][j][0]=1; - g_otg->application_type[i][j][0] = BCBR; //MCBR, BCBR - } - } - init_predef_traffic(UE_flag ? 1 : 0, UE_flag ? 0 : 1); - // } - #endif */ - -#ifdef EXMIMO - number_of_cards = openair0_num_detected_cards; -#else - number_of_cards = 1; -#endif - - - - for(CC_id=0; CC_idsamples_per_tti*10; i++) - for (aa=0; aanb_antennas_tx; aa++) - UE[CC_id]->lte_ue_common_vars.txdata[aa][i] = 0x00010001; - } - - if (input_fd) { - printf("Reading in from file to antenna buffer %d\n",0); - if (fread(UE[0]->lte_ue_common_vars.rxdata[0], - sizeof(int32_t), - frame_parms[0]->samples_per_tti*10, - input_fd) != frame_parms[0]->samples_per_tti*10) - printf("error reading from file\n"); - } - //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX; - } else { - openair_daq_vars.timing_advance = 0; - - if (setup_eNB_buffers(PHY_vars_eNB_g[0],&openair0_cfg[0],rf_map)!=0) { - printf("Error setting up eNB buffer\n"); - exit(-1); - } - - printf("Setting eNB buffer to all-RX\n"); - - // Set LSBs for antenna switch (ExpressMIMO) - for (CC_id=0; CC_idsamples_per_tti*10; i++) - for (aa=0; aanb_antennas_tx; aa++) - PHY_vars_eNB_g[0][CC_id]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001; - } - } - -#ifdef EXMIMO - openair0_config(&openair0_cfg[0],UE_flag); -#endif - - /* - for (ant=0;ant<4;ant++) - p_exmimo_config->rf.do_autocal[ant] = 0; - */ - -#ifdef EMOS - error_code = rtf_create(CHANSOUNDER_FIFO_MINOR,CHANSOUNDER_FIFO_SIZE); - - if (error_code==0) - printf("[OPENAIR][SCHED][INIT] Created EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR); - else if (error_code==ENODEV) - printf("[OPENAIR][SCHED][INIT] Problem: EMOS FIFO %d is greater than or equal to RTF_NO\n",CHANSOUNDER_FIFO_MINOR); - else if (error_code==ENOMEM) - printf("[OPENAIR][SCHED][INIT] Problem: cannot allocate memory for EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR); - else - printf("[OPENAIR][SCHED][INIT] Problem creating EMOS FIFO %d, error_code %d\n",CHANSOUNDER_FIFO_MINOR,error_code); - #endif + // init UE_PF_PO and mutex lock + pthread_mutex_init(&ue_pf_po_mutex, NULL); + memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*NUMBER_OF_UE_MAX*MAX_NUM_CCs); + + mlockall(MCL_CURRENT | MCL_FUTURE); - -#ifdef RTAI - // make main thread LXRT soft realtime - /* task = */ rt_task_init_schmod(nam2num("MAIN"), 9, 0, 0, SCHED_FIFO, 0xF); - - // start realtime timer and scheduler - //rt_set_oneshot_mode(); - rt_set_periodic_mode(); - start_rt_timer(0); -#endif - + pthread_cond_init(&sync_cond,NULL); pthread_mutex_init(&sync_mutex, NULL); - - // this starts the DMA transfers -#ifdef EXMIMO - - if (UE_flag!=1) - for (card=0; cardstats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "l2 stats"); form_stats = create_form_stats_form(); fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats"); - + for(UE_id=0; UE_idlte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - + if (otg_enabled) { fl_set_button(form_enb[CC_id][UE_id]->button_0,1); fl_set_object_label(form_enb[CC_id][UE_id]->button_0,"DL Traffic ON"); @@ -3618,8 +1226,8 @@ int main( int argc, char **argv ) fl_set_button(form_enb[CC_id][UE_id]->button_0,0); fl_set_object_label(form_enb[CC_id][UE_id]->button_0,"DL Traffic OFF"); } - } - } + } // CC_id + } // UE_id } else { form_stats = create_form_stats_form(); fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats"); @@ -3627,135 +1235,171 @@ int main( int argc, char **argv ) form_ue[UE_id] = create_lte_phy_scope_ue(); sprintf (title, "LTE DL SCOPE UE"); fl_show_form (form_ue[UE_id]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); + + /* + if (openair_daq_vars.use_ia_receiver) { + fl_set_button(form_ue[UE_id]->button_0,1); + fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON"); + } else { + fl_set_button(form_ue[UE_id]->button_0,0); + fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF"); + }*/ + fl_set_button(form_ue[UE_id]->button_0,0); + fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF"); + } + + ret = pthread_create(&forms_thread, NULL, scope_thread, NULL); + + if (ret == 0) + pthread_setname_np( forms_thread, "xforms" ); + + printf("Scope thread created, ret=%d\n",ret); + } + +#endif + + rt_sleep_ns(10*100000000ULL); - if (openair_daq_vars.use_ia_receiver) { - fl_set_button(form_ue[UE_id]->button_0,1); - fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON"); - } else { - fl_set_button(form_ue[UE_id]->button_0,0); - fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF"); + if (nfapi_mode) { + + printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n"); + pthread_cond_init(&sync_cond,NULL); + pthread_mutex_init(&sync_mutex, NULL); + } + + const char *nfapi_mode_str = ""; + + switch(nfapi_mode) { + case 0: + nfapi_mode_str = "MONOLITHIC"; + break; + case 1: + nfapi_mode_str = "PNF"; + break; + case 2: + nfapi_mode_str = "VNF"; + break; + default: + nfapi_mode_str = ""; + break; + } + printf("NFAPI MODE:%s\n", nfapi_mode_str); + + if (nfapi_mode==2) // VNF + wait_nfapi_init("main?"); + + printf("START MAIN THREADS\n"); + + // start the main threads + if (UE_flag == 1) { + int eMBMS_active = 0; + init_UE(1,eMBMS_active,uecap_xer_in); + + if (phy_test==0) { + printf("Filling UE band info\n"); + fill_ue_band_info(); + dl_phy_sync_success (0, 0, 0, 1); + } + + number_of_cards = 1; + for(CC_id=0; CC_idrf_map.card=0; + PHY_vars_UE_g[0][CC_id]->rf_map.chain=CC_id+chain_offset; + } + } + else { + number_of_cards = 1; + printf("RC.nb_L1_inst:%d\n", RC.nb_L1_inst); + if (RC.nb_L1_inst > 0) { + printf("Initializing eNB threads single_thread_flag:%d wait_for_sync:%d\n", single_thread_flag,wait_for_sync); + init_eNB(single_thread_flag,wait_for_sync); + // for (inst=0;inst0) { + printf("Initializing RU threads\n"); + init_RU(rf_config_file); + for (ru_id=0;ru_idrf_map.card=0; + RC.ru[ru_id]->rf_map.chain=CC_id+chain_offset; } } - ret = pthread_create(&forms_thread, NULL, scope_thread, NULL); + config_sync_var=0; - if (ret == 0) - pthread_setname_np( forms_thread, "xforms" ); + if (nfapi_mode==1) { // PNF + wait_nfapi_init("main?"); + } - printf("Scope thread created, ret=%d\n",ret); + printf("wait RUs\n"); + wait_RUs(); + printf("ALL RUs READY!\n"); + printf("RC.nb_RU:%d\n", RC.nb_RU); + // once all RUs are ready intiailize the rest of the eNBs ((dependence on final RU parameters after configuration) + printf("ALL RUs ready - init eNBs\n"); + + if (nfapi_mode != 1 && nfapi_mode != 2) + { + printf("Not NFAPI mode - call init_eNB_afterRU()\n"); + init_eNB_afterRU(); + } + else + { + printf("NFAPI mode - DO NOT call init_eNB_afterRU()\n"); + } + + printf("ALL RUs ready - ALL eNBs ready\n"); } - -#endif - -#ifdef EMOS - ret = pthread_create(&thread3, NULL, emos_thread, NULL); - printf("EMOS thread created, ret=%d\n",ret); - ret = pthread_create(&thread4, NULL, gps_thread, NULL); - printf("GPS thread created, ret=%d\n",ret); -#endif - - rt_sleep_ns(10*FRAME_PERIOD); - -#ifndef RTAI - pthread_attr_init (&attr_dlsch_threads); - pthread_attr_setstacksize(&attr_dlsch_threads,4*PTHREAD_STACK_MIN); - - pthread_attr_init (&attr_UE_thread); - pthread_attr_setstacksize(&attr_UE_thread,8192);//5*PTHREAD_STACK_MIN); - -#ifndef DEADLINE_SCHEDULER - sched_param_UE_thread.sched_priority = sched_get_priority_max(SCHED_FIFO); - pthread_attr_setschedparam(&attr_UE_thread,&sched_param_UE_thread); - sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_dlsch_threads, &sched_param_dlsch); - pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO); - printf("Setting eNB_thread FIFO scheduling policy with priority %d \n", sched_param_dlsch.sched_priority); -#endif - -#endif - - // start the main thread - if (UE_flag == 1) { - printf("Intializing UE Threads ...\n"); - init_UE_threads(); -#ifdef DLSCH_THREAD - init_rx_pdsch_thread(); - rt_sleep_ns(FRAME_PERIOD/10); - init_dlsch_threads(); -#endif - - sleep(1); -#ifdef RTAI - main_ue_thread = rt_thread_create(UE_thread, NULL, 100000000); + + + // connect the TX/RX buffers + if (UE_flag==1) { + + for (CC_id=0; CC_idhw_timing_advance = timing_advance; #else - error_code = pthread_create(&main_ue_thread, &attr_UE_thread, UE_thread, NULL); - - if (error_code!= 0) { - LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code); - return(error_code); - } else { - LOG_D( HW, "[lte-softmodem.c] Allocate UE_thread successful\n" ); - pthread_setname_np( main_ue_thread, "main UE" ); - } - + UE[CC_id]->hw_timing_advance = 160; #endif - printf("UE threads created\n"); -#ifdef USE_MME - - while (start_UE == 0) { - sleep(1); } - -#endif - - - + if (setup_ue_buffers(UE,&openair0_cfg[0])!=0) { + printf("Error setting up eNB buffer\n"); + exit(-1); + } + + + + if (input_fd) { + printf("Reading in from file to antenna buffer %d\n",0); + if (fread(UE[0]->common_vars.rxdata[0], + sizeof(int32_t), + frame_parms[0]->samples_per_tti*10, + input_fd) != frame_parms[0]->samples_per_tti*10) + printf("error reading from file\n"); + } + //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX; } else { - if (multi_thread>0) { - init_eNB_proc(); - sleep(1); - LOG_D(HW,"[lte-softmodem.c] eNB threads created\n"); - } - - printf("Creating main eNB_thread \n"); -#ifdef RTAI - main_eNB_thread = rt_thread_create(eNB_thread, NULL, PTHREAD_STACK_MIN); -#else - error_code = pthread_create( &main_eNB_thread, &attr_dlsch_threads, eNB_thread, NULL ); - - if (error_code!= 0) { - LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code); - return(error_code); - } else { - LOG_D( HW, "[lte-softmodem.c] Allocate eNB_thread successful\n" ); - pthread_setname_np( main_eNB_thread, "main eNB" ); - } - -#endif + + printf("eNB mode\n"); + } - - // Sleep to allow all threads to setup - sleep(1); - - - -#ifndef EXMIMO - -#ifndef USRP_DEBUG - if (mode!=loop_through_memory) - if (openair0.trx_start_func(&openair0) != 0 ) - LOG_E(HW,"Could not start the device\n"); - -#endif - -#endif - + printf("Sending sync to all threads\n"); - + pthread_mutex_lock(&sync_mutex); sync_var=0; pthread_cond_broadcast(&sync_cond); pthread_mutex_unlock(&sync_mutex); + printf("About to call end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); + end_configmodule(); + printf("Called end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); // wait for end of program printf("TYPE TO TERMINATE\n"); @@ -3764,11 +1408,14 @@ int main( int argc, char **argv ) #if defined(ENABLE_ITTI) printf("Entering ITTI signals handler\n"); itti_wait_tasks_end(); + printf("Returned from ITTI signal handler\n"); oai_exit=1; + printf("oai_exit=%d\n",oai_exit); #else while (oai_exit==0) - rt_sleep_ns(FRAME_PERIOD); + rt_sleep_ns(100000000ULL); + printf("Terminating application - oai_exit=%d\n",oai_exit); #endif @@ -3803,228 +1450,40 @@ int main( int argc, char **argv ) // cleanup if (UE_flag == 1) { -#ifdef EXMIMO -#ifdef RTAI - rt_thread_join(main_ue_thread); -#else - pthread_join(main_ue_thread,&status); -#endif -#ifdef DLSCH_THREAD - cleanup_dlsch_threads(); - cleanup_rx_pdsch_thread(); -#endif -#endif } else { -#ifdef DEBUG_THREADS - printf("Joining eNB_thread ..."); -#endif -#ifdef RTAI - rt_thread_join(main_eNB_thread); -#else - int *eNB_thread_status_p; - int result = pthread_join( main_eNB_thread, (void**)&eNB_thread_status_p ); -#ifdef DEBUG_THREADS - - if (result != 0) { - printf( "\nError joining main_eNB_thread.\n" ); - } else { - if (eNB_thread_status_p) { - printf( "status %d\n", *eNB_thread_status_p ); - } else { - printf( "The thread was killed. No status available.\n"); - } - } - -#else - UNUSED(result); -#endif // DEBUG_THREADS -#endif // RTAI - - if (multi_thread>0) { - printf("Killing eNB processing threads\n"); - kill_eNB_proc(); - } + stop_eNB(1); } -#ifdef RTAI - stop_rt_timer(); -#endif pthread_cond_destroy(&sync_cond); pthread_mutex_destroy(&sync_mutex); + pthread_cond_destroy(&nfapi_sync_cond); + pthread_mutex_destroy(&nfapi_sync_mutex); -#ifdef EXMIMO - printf("stopping card\n"); - openair0_stop(0); - printf("closing openair0_lib\n"); - openair0_close(); -#else - openair0.trx_end_func(&openair0); -#endif + pthread_mutex_destroy(&ue_pf_po_mutex); -#ifdef EMOS - printf("waiting for EMOS thread\n"); - pthread_cancel(thread3); - pthread_join(thread3,&status); - printf("waiting for GPS thread\n"); - pthread_cancel(thread4); - pthread_join(thread4,&status); -#endif - -#ifdef EMOS - error_code = rtf_destroy(CHANSOUNDER_FIFO_MINOR); - printf("[OPENAIR][SCHED][CLEANUP] EMOS FIFO closed, error_code %d\n", error_code); -#endif + // *** Handle per CC_id openair0 + if (UE_flag==1) { + if (PHY_vars_UE_g[0][0]->rfdevice.trx_end_func) + PHY_vars_UE_g[0][0]->rfdevice.trx_end_func(&PHY_vars_UE_g[0][0]->rfdevice); + } + else { + for(ru_id=0; ru_idrfdevice.trx_end_func) + RC.ru[ru_id]->rfdevice.trx_end_func(&RC.ru[ru_id]->rfdevice); + if (RC.ru[ru_id]->ifdevice.trx_end_func) + RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice); + } + } if (ouput_vcd) VCD_SIGNAL_DUMPER_CLOSE(); - + if (opt_enabled == 1) terminate_opt(); - + logClean(); - + return 0; } - - -/* this function maps the phy_vars_eNB tx and rx buffers to the available rf chains. - Each rf chain is is addressed by the card number and the chain on the card. The - rf_map specifies for each CC, on which rf chain the mapping should start. Multiple - antennas are mapped to successive RF chains on the same card. */ -int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]) -{ - - int i, CC_id; -#ifndef EXMIMO - uint16_t N_TA_offset = 0; -#else - int j; -#endif - LTE_DL_FRAME_PARMS *frame_parms; - - - for (CC_id=0; CC_idlte_frame_parms); - printf("setup_eNB_buffers: frame_parms = %p\n",frame_parms); - } else { - printf("phy_vars_eNB[%d] not initialized\n", CC_id); - return(-1); - } - -#ifndef EXMIMO - - if (frame_parms->frame_type == TDD) { - if (frame_parms->N_RB_DL == 100) - N_TA_offset = 624; - else if (frame_parms->N_RB_DL == 50) - N_TA_offset = 624/2; - else if (frame_parms->N_RB_DL == 25) - N_TA_offset = 624/4; - } - -#endif - - // replace RX signal buffers with mmaped HW versions -#ifdef EXMIMO - openair0_cfg[CC_id].tx_num_channels = 0; - openair0_cfg[CC_id].rx_num_channels = 0; - - for (i=0; inb_antennas_rx; i++) { - printf("Mapping eNB CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].adc_head[rf_map[CC_id].chain+i]; - - if (openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i]) { - printf("Error with rf_map! A channel has already been allocated!\n"); - return(-1); - } else { - openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rx_gain[rf_map[CC_id].chain+i] = rx_gain[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rx_num_channels++; - } - - printf("rxdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); - - for (j=0; j<16; j++) { - printf("rxbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i][j]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i][j] = 16-j; - } - } - - for (i=0; inb_antennas_tx; i++) { - printf("Mapping eNB CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i]; - - if (openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i]) { - printf("Error with rf_map! A channel has already been allocated!\n"); - return(-1); - } else { - openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].tx_gain[rf_map[CC_id].chain+i] = tx_gain[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].tx_num_channels++; - } - - printf("txdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); - - for (j=0; j<16; j++) { - printf("txbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i][j]); - phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i][j] = 16-j; - } - } - -#else // not EXMIMO - rxdata = (int32_t**)malloc16(frame_parms->nb_antennas_rx*sizeof(int32_t*)); - txdata = (int32_t**)malloc16(frame_parms->nb_antennas_tx*sizeof(int32_t*)); - - for (i=0; inb_antennas_rx; i++) { - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i]); - rxdata[i] = (int32_t*)(32 + malloc16(32+openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation - phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i] = rxdata[i]-N_TA_offset; // N_TA offset for TDD FIXME! N_TA_offset > 16 => access of unallocated memory - memset(rxdata[i], 0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); - printf("rxdata[%d] @ %p (%p) (N_TA_OFFSET %d)\n", i, phy_vars_eNB[CC_id]->lte_eNB_common_vars.rxdata[0][i],rxdata[i],N_TA_offset); - - } - - for (i=0; inb_antennas_tx; i++) { - free(phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); - txdata[i] = (int32_t*)(32 + malloc16(32 + openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t))); // FIXME broken memory allocation - phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i] = txdata[i]; - memset(txdata[i],0, openair0_cfg[rf_map[CC_id].card].samples_per_frame*sizeof(int32_t)); - printf("txdata[%d] @ %p\n", i, phy_vars_eNB[CC_id]->lte_eNB_common_vars.txdata[0][i]); - - } - -#endif - } - - return(0); -} - -void reset_opp_meas(void) { - int sfn; - reset_meas(&softmodem_stats_mt); - reset_meas(&softmodem_stats_hw); - - for (sfn=0; sfn < 10; sfn++) { - reset_meas(&softmodem_stats_tx_sf[sfn]); - reset_meas(&softmodem_stats_rx_sf[sfn]); - } -} - -void print_opp_meas(void) { - - int sfn=0; - print_meas(&softmodem_stats_mt, "Main ENB Thread", NULL, NULL); - print_meas(&softmodem_stats_hw, "HW Acquisation", NULL, NULL); - - for (sfn=0; sfn < 10; sfn++) { - print_meas(&softmodem_stats_tx_sf[sfn],"[eNB][total_phy_proc_tx]",NULL, NULL); - print_meas(&softmodem_stats_rx_sf[sfn],"[eNB][total_phy_proc_rx]",NULL,NULL); - } -} - - diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h new file mode 100644 index 0000000000..44e35c88a3 --- /dev/null +++ b/targets/RT/USER/lte-softmodem.h @@ -0,0 +1,267 @@ +#ifndef LTE_SOFTMODEM_H +#define LTE_SOFTMODEM_H + +#define _GNU_SOURCE +#include +#include +#include +#include +#include "rt_wrapper.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "rt_wrapper.h" +#include "../../ARCH/COMMON/common_lib.h" +#undef MALLOC +#include "assertions.h" +#include "msc.h" +#include "PHY/types.h" +#include "PHY/defs.h" +#include "SIMULATION/ETH_TRANSPORT/proto.h" + +#if defined(ENABLE_ITTI) +#if defined(ENABLE_USE_MME) +#include "s1ap_eNB.h" +#ifdef PDCP_USE_NETLINK +#include "SIMULATION/ETH_TRANSPORT/proto.h" +#endif +#endif +#endif + +/* help strings definition for command line options, used in CMDLINE_XXX_DESC macros and printed when -h option is used */ +#define CONFIG_HLP_RFCFGF "Configuration file for front-end (e.g. LMS7002M)\n" +#define CONFIG_HLP_ULMAXE "set the eNodeB max ULSCH erros\n" +#define CONFIG_HLP_CALUER "set UE RX calibration\n" +#define CONFIG_HLP_CALUERM "" +#define CONFIG_HLP_CALUERB "" +#define CONFIG_HLP_DBGUEPR "UE run normal prach power ramping, but don't continue random-access\n" +#define CONFIG_HLP_CALPRACH "UE run normal prach with maximum power, but don't continue random-access\n" +#define CONFIG_HLP_NOL2CN "bypass L2 and upper layers\n" +#define CONFIG_HLP_UERXG "set UE RX gain\n" +#define CONFIG_HLP_UERXGOFF "external UE amplifier offset\n" +#define CONFIG_HLP_UETXG "set UE TX gain\n" +#define CONFIG_HLP_UENANTR "set UE number of rx antennas\n" +#define CONFIG_HLP_UENANTT "set UE number of tx antennas\n" +#define CONFIG_HLP_UESCAN "set UE to scan around carrier\n" +#define CONFIG_HLP_DUMPFRAME "dump UE received frame to rxsig_frame0.dat and exit\n" +#define CONFIG_HLP_DLSHIFT "dynamic shift for LLR compuation for TM3/4 (default 0)\n" +#define CONFIG_HLP_UELOOP "get softmodem (UE) to loop through memory instead of acquiring from HW\n" +#define CONFIG_HLP_PHYTST "test UE phy layer, mac disabled\n" +#define CONFIG_HLP_DMAMAP "sets flag for improved EXMIMO UE performance\n" +#define CONFIG_HLP_EXCCLK "tells hardware to use an external clock reference\n" +#define CONFIG_HLP_USIM "use XOR autentication algo in case of test usim mode\n" +#define CONFIG_HLP_NOSNGLT "Disables single-thread mode in lte-softmodem\n" +#define CONFIG_HLP_TADV "Set timing_advance\n" +#define CONFIG_HLP_DLF "Set the downlink frequency for all component carriers\n" +#define CONFIG_HLP_CHOFF "Channel id offset\n" +#define CONFIG_HLP_SOFTS "Enable soft scope and L1 and L2 stats (Xforms)\n" +#define CONFIG_HLP_EXMCAL "Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n" +#define CONFIG_HLP_ITTIL "Generate ITTI analyzser logs (similar to wireshark logs but with more details)\n" +#define CONFIG_HLP_DLMCS "Set the maximum downlink MCS\n" +#define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n" +#define CONFIG_HLP_PRB "Set the PRB, valid values: 6, 25, 50, 100 \n" +#define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n" +#define CONFIG_HLP_ULMCS "Set the maximum uplink MCS\n" +#define CONFIG_HLP_TDD "Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n" +#define CONFIG_HLP_UE "Set the lte softmodem as a UE\n" +#define CONFIG_HLP_L2MONW "Enable L2 wireshark messages on localhost \n" +#define CONFIG_HLP_L2MONP "Enable L2 pcap messages on localhost \n" +#define CONFIG_HLP_VCD "Enable VCD (generated file will is named openair_dump_eNB.vcd, read it with target/RT/USER/eNB.gtkw\n" +#define CONFIG_HLP_TQFS "Apply three-quarter of sampling frequency, 23.04 Msps to reduce the data rate on USB/PCIe transfers (only valid for 20 MHz)\n" +#define CONFIG_HLP_TPORT "tracer port\n" +#define CONFIG_HLP_NOTWAIT "don't wait for tracer, start immediately\n" +#define CONFIG_HLP_TNOFORK "to ease debugging with gdb\n" + + +/***************************************************************************************************************************************/ +/* command line options definitions, CMDLINE_XXXX_DESC macros are used to initialize paramdef_t arrays which are then used as argument + when calling config_get or config_getlist functions */ + + +/*------------------------------------------------------------------------------------------------------------------------------------------*/ +/* command line parameters defining UE running mode */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*------------------------------------------------------------------------------------------------------------------------------------------*/ +#define CMDLINE_UEMODEPARAMS_DESC { \ +{"calib-ue-rx", CONFIG_HLP_CALUER, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ +{"calib-ue-rx-med", CONFIG_HLP_CALUERM, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ +{"calib-ue-rx-byp", CONFIG_HLP_CALUERB, 0, iptr:&rx_input_level_dBm, defintval:0, TYPE_INT, 0}, \ +{"debug-ue-prach", CONFIG_HLP_DBGUEPR, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ +{"no-L2-connect", CONFIG_HLP_NOL2CN, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ +{"calib-prach-tx", CONFIG_HLP_CALPRACH, PARAMFLAG_BOOL, uptr:NULL, defuintval:1, TYPE_INT, 0}, \ +{"loop-memory", CONFIG_HLP_UELOOP, 0, strptr:&loopfile, defstrval:"iqs.in", TYPE_STRING,0}, \ +{"ue-dump-frame", CONFIG_HLP_DUMPFRAME, PARAMFLAG_BOOL, iptr:&dumpframe, defintval:0, TYPE_INT, 0}, \ +} +#define CMDLINE_CALIBUERX_IDX 0 +#define CMDLINE_CALIBUERXMED_IDX 1 +#define CMDLINE_CALIBUERXBYP_IDX 2 +#define CMDLINE_DEBUGUEPRACH_IDX 3 +#define CMDLINE_NOL2CONNECT_IDX 4 +#define CMDLINE_CALIBPRACHTX_IDX 5 +#define CMDLINE_MEMLOOP_IDX 6 +#define CMDLINE_DUMPMEMORY_IDX 7 +/*------------------------------------------------------------------------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* command line parameters specific to UE */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*--------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define CMDLINE_UEPARAMS_DESC { \ +{"ue-rxgain", CONFIG_HLP_UERXG, 0, dblptr:&(rx_gain[0][0]), defdblval:0, TYPE_DOUBLE, 0}, \ +{"ue-rxgain-off", CONFIG_HLP_UERXGOFF, 0, dblptr:&rx_gain_off, defdblval:0, TYPE_DOUBLE, 0}, \ +{"ue-txgain", CONFIG_HLP_UETXG, 0, dblptr:&(tx_gain[0][0]), defdblval:0, TYPE_DOUBLE, 0}, \ +{"ue-nb-ant-rx", CONFIG_HLP_UENANTR, 0, u8ptr:&nb_antenna_rx, defuintval:1, TYPE_UINT8, 0}, \ +{"ue-nb-ant-tx", CONFIG_HLP_UENANTT, 0, u8ptr:&nb_antenna_tx, defuintval:1, TYPE_UINT8, 0}, \ +{"ue-scan-carrier", CONFIG_HLP_UESCAN, PARAMFLAG_BOOL, iptr:&UE_scan_carrier, defintval:0, TYPE_INT, 0}, \ +{"ue-max-power", NULL, 0, iptr:&(tx_max_power[0]), defintval:90, TYPE_INT, 0}, \ +{"r" , CONFIG_HLP_PRB, 0, u8ptr:&n_rb_dl, defintval:0, TYPE_UINT8, 0}, \ +} + + +extern int16_t dlsch_demod_shift; +/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* command line parameters common to eNodeB and UE */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define CMDLINE_PARAMS_DESC { \ +{"rf-config-file", CONFIG_HLP_RFCFGF, 0, strptr:(char **)&rf_config_file, defstrval:NULL, TYPE_STRING, sizeof(rf_config_file)}, \ +{"ulsch-max-errors", CONFIG_HLP_ULMAXE, 0, uptr:&ULSCH_max_consecutive_errors, defuintval:0, TYPE_UINT, 0}, \ +{"phy-test", CONFIG_HLP_PHYTST, PARAMFLAG_BOOL, iptr:&phy_test, defintval:0, TYPE_INT, 0}, \ +{"usim-test", CONFIG_HLP_USIM, PARAMFLAG_BOOL, u8ptr:&usim_test, defintval:0, TYPE_UINT8, 0}, \ +{"mmapped-dma", CONFIG_HLP_DMAMAP, PARAMFLAG_BOOL, uptr:&mmapped_dma, defintval:0, TYPE_INT, 0}, \ +{"external-clock", CONFIG_HLP_EXCCLK, PARAMFLAG_BOOL, uptr:&clock_source, defintval:0, TYPE_INT, 0}, \ +{"wait-for-sync", NULL, PARAMFLAG_BOOL, iptr:&wait_for_sync, defintval:0, TYPE_INT, 0}, \ +{"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \ +{"threadIQ", NULL, 0, iptr:&(threads.iq), defintval:1, TYPE_INT, 0}, \ +{"threadOneSubframe", NULL, 0, iptr:&(threads.one), defintval:1, TYPE_INT, 0}, \ +{"threadTwoSubframe", NULL, 0, iptr:&(threads.two), defintval:1, TYPE_INT, 0}, \ +{"threadThreeSubframe", NULL, 0, iptr:&(threads.three), defintval:1, TYPE_INT, 0}, \ +{"threadSlot1ProcOne", NULL, 0, iptr:&(threads.slot1_proc_one), defintval:1, TYPE_INT, 0}, \ +{"threadSlot1ProcTwo", NULL, 0, iptr:&(threads.slot1_proc_two), defintval:1, TYPE_INT, 0}, \ +{"dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \ +{"A" , CONFIG_HLP_TADV, 0, uptr:&timing_advance, defintval:0, TYPE_UINT, 0}, \ +{"C" , CONFIG_HLP_DLF, 0, uptr:&(downlink_frequency[0][0]), defuintval:2680000000, TYPE_UINT, 0}, \ +{"a" , CONFIG_HLP_CHOFF, 0, iptr:&chain_offset, defintval:0, TYPE_INT, 0}, \ +{"d" , CONFIG_HLP_SOFTS, PARAMFLAG_BOOL, uptr:(uint32_t *)&do_forms, defintval:0, TYPE_INT8, 0}, \ +{"E" , CONFIG_HLP_TQFS, PARAMFLAG_BOOL, i8ptr:&threequarter_fs, defintval:0, TYPE_INT8, 0}, \ +{"K" , CONFIG_HLP_ITTIL, PARAMFLAG_NOFREE, strptr:&itti_dump_file, defstrval:"/tmp/itti.dump", TYPE_STRING, 0}, \ +{"U" , CONFIG_HLP_UE, PARAMFLAG_BOOL, i8ptr:&UE_flag, defintval:0, TYPE_INT8, 0}, \ +{"m" , CONFIG_HLP_DLMCS, 0, uptr:&target_dl_mcs, defintval:0, TYPE_UINT, 0}, \ +{"t" , CONFIG_HLP_ULMCS, 0, uptr:&target_ul_mcs, defintval:0, TYPE_UINT, 0}, \ +{"W" , CONFIG_HLP_L2MONW, 0, strptr:(char **)&in_ip, defstrval:"127.0.0.1", TYPE_STRING, sizeof(in_ip)}, \ +{"P" , CONFIG_HLP_L2MONP, 0, strptr:(char **)&in_path, defstrval:"/tmp/oai_opt.pcap", TYPE_STRING, sizeof(in_path)}, \ +{"V" , CONFIG_HLP_VCD, PARAMFLAG_BOOL, iptr:&ouput_vcd, defintval:0, TYPE_INT, 0}, \ +{"q" , CONFIG_HLP_STMON, PARAMFLAG_BOOL, iptr:&opp_enabled, defintval:0, TYPE_INT, 0}, \ +{"S" , CONFIG_HLP_MSLOTS, PARAMFLAG_BOOL, u8ptr:&exit_missed_slots, defintval:1, TYPE_UINT8, 0}, \ +{"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0} \ +} + +#define CONFIG_HLP_FLOG "Enable online log \n" +#define CONFIG_HLP_LOGL "Set the global log level, valide options: (9:trace, 8/7:debug, 6:info, 4:warn, 3:error)\n" +#define CONFIG_HLP_LOGV "Set the global log verbosity \n" +#define CONFIG_HLP_TELN "Start embedded telnet server \n" +/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +/* command line parameters for LOG utility */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +#define CMDLINE_LOGPARAMS_DESC { \ +{"R" , CONFIG_HLP_FLOG, 0, uptr:&online_log_messages, defintval:1, TYPE_INT, 0}, \ +{"g" , CONFIG_HLP_LOGL, 0, uptr:&glog_level, defintval:0, TYPE_UINT, 0}, \ +{"G" , CONFIG_HLP_LOGV, 0, uptr:&glog_verbosity, defintval:0, TYPE_UINT16, 0}, \ +{"telnetsrv", CONFIG_HLP_TELN, PARAMFLAG_BOOL, uptr:&start_telnetsrv, defintval:0, TYPE_UINT, 0}, \ +} +#define CMDLINE_ONLINELOG_IDX 0 +#define CMDLINE_GLOGLEVEL_IDX 1 +#define CMDLINE_GLOGVERBO_IDX 2 +#define CMDLINE_STARTTELN_IDX 3 + + +extern int T_port; +extern int T_nowait; +extern int T_dont_fork; + +/*------------------------------------------------------------------------------------------------------------------------------------------*/ +/* command line parameters for TTRACE utility */ +/* optname helpstr paramflags XXXptr defXXXval type numelt */ +/*------------------------------------------------------------------------------------------------------------------------------------------*/ +#define CMDLINE_TTRACEPARAMS_DESC { \ +{"T_port", CONFIG_HLP_TPORT, 0, iptr:&T_port, defintval:0, TYPE_INT, 0}, \ +{"T_nowait", CONFIG_HLP_NOTWAIT, PARAMFLAG_BOOL, iptr:&T_nowait, defintval:0, TYPE_INT, 0}, \ +{"T_dont_fork", CONFIG_HLP_TNOFORK, PARAMFLAG_BOOL, iptr:&T_dont_fork, defintval:1, TYPE_INT, 0}, \ +} + + +/***************************************************************************************************************************************/ +/* */ +extern pthread_cond_t sync_cond; +extern pthread_mutex_t sync_mutex; +extern int sync_var; + + +extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; +extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; + +extern int rx_input_level_dBm; +extern uint8_t exit_missed_slots; +extern uint64_t num_missed_slots; // counter for the number of missed slots + +extern int oaisim_flag; +extern volatile int oai_exit; + +extern openair0_config_t openair0_cfg[MAX_CARDS]; +extern pthread_cond_t sync_cond; +extern pthread_mutex_t sync_mutex; +extern int sync_var; +extern int transmission_mode; +extern double cpuf; + +#if defined(ENABLE_ITTI) +extern volatile int start_eNB; +extern volatile int start_UE; +#endif + +#include "threads_t.h" +extern threads_t threads; + +extern void exit_fun(const char* s); +// In lte-enb.c +extern void init_eNB(int single_thread_flag,int wait_for_sync); +extern void stop_eNB(int); +extern void kill_eNB_proc(int inst); + +// In lte-ru.c +extern void init_RU(const char*); + +// In lte-ue.c +extern int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg); +extern void fill_ue_band_info(void); + +extern void init_UE(int,int,int); +extern void init_thread(int sched_runtime, int sched_deadline, int sched_fifo, cpu_set_t *cpuset, char * name); + +extern void reset_opp_meas(void); +extern void print_opp_meas(void); + +extern void init_fep_thread(PHY_VARS_eNB *, pthread_attr_t *); +extern void init_td_thread(PHY_VARS_eNB *, pthread_attr_t *); +extern void init_te_thread(PHY_VARS_eNB *, pthread_attr_t *); + +PHY_VARS_UE* init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, + uint8_t UE_id, + uint8_t abstraction_flag); +void init_eNB_afterRU(void); + +#endif diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 0e834a53ab..913ae958fc 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -*******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file lte-ue.c * \brief threads and support functions for real-time LTE UE target @@ -37,29 +29,10 @@ * \note * \warning */ -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "lte-softmodem.h" #include "rt_wrapper.h" -#include "assertions.h" -#include "PHY/types.h" -#include "PHY/defs.h" #ifdef OPENAIR2 #include "LAYER2/MAC/defs.h" #include "RRC/LITE/extern.h" @@ -69,12 +42,6 @@ #undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all -#ifdef EXMIMO -#include "openair0_lib.h" -#else -#include "../../ARCH/COMMON/common_lib.h" -#endif - #include "PHY/extern.h" #include "SCHED/extern.h" #include "LAYER2/MAC/extern.h" @@ -87,114 +54,208 @@ #include "UTIL/LOG/vcd_signal_dumper.h" #include "UTIL/OPT/opt.h" +#include "T.h" + +extern double cpuf; + #define FRAME_PERIOD 100000000ULL #define DAQ_PERIOD 66667ULL +#define FIFO_PRIORITY 40 typedef enum { - pss=0, - pbch=1, - si=2 + pss=0, + pbch=1, + si=2 } sync_mode_t; -int init_dlsch_threads(void); -void cleanup_dlsch_threads(void); -int32_t init_rx_pdsch_thread(void); -void cleanup_rx_pdsch_thread(void); +void init_UE_threads(int); +void *UE_thread(void *arg); +void init_UE(int nb_inst,int,int); -extern pthread_cond_t sync_cond; -extern pthread_mutex_t sync_mutex; -extern int sync_var; +int32_t **rxdata; +int32_t **txdata; -extern openair0_config_t openair0_cfg[MAX_CARDS]; -extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; -extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; -extern openair0_rf_map rf_map[MAX_NUM_CCs]; - -extern openair0_device openair0; -extern int oai_exit; - -extern int32_t **rxdata; -extern int32_t **txdata; - -//extern unsigned int tx_forward_nsamps; -//extern int tx_delay; - -extern int rx_input_level_dBm; -extern uint8_t exit_missed_slots; -extern uint64_t num_missed_slots; // counter for the number of missed slots - -extern void exit_fun(const char* s); - -#ifdef EXMIMO - -extern unsigned int rxg_max[4]; -extern unsigned int rxg_med[4]; -extern unsigned int rxg_byp[4]; -extern unsigned int nf_max[4]; -extern unsigned int nf_med[4]; -extern unsigned int nf_byp[4]; -extern rx_gain_t rx_gain_mode[MAX_NUM_CCs][4]; - -extern double tx_gain[MAX_NUM_CCs][4]; -extern double rx_gain[MAX_NUM_CCs][4]; -#endif #define KHz (1000UL) -#define MHz (1000 * KHz) +#define MHz (1000*KHz) typedef struct eutra_band_s { - int16_t band; - uint32_t ul_min; - uint32_t ul_max; - uint32_t dl_min; - uint32_t dl_max; - lte_frame_type_t frame_type; + int16_t band; + uint32_t ul_min; + uint32_t ul_max; + uint32_t dl_min; + uint32_t dl_max; + lte_frame_type_t frame_type; } eutra_band_t; typedef struct band_info_s { - int nbands; - eutra_band_t band_info[100]; + int nbands; + eutra_band_t band_info[100]; } band_info_t; band_info_t bands_to_scan; static const eutra_band_t eutra_bands[] = { - { 1, 1920 * MHz, 1980 * MHz, 2110 * MHz, 2170 * MHz, FDD}, - { 2, 1850 * MHz, 1910 * MHz, 1930 * MHz, 1990 * MHz, FDD}, - { 3, 1710 * MHz, 1785 * MHz, 1805 * MHz, 1880 * MHz, FDD}, - { 4, 1710 * MHz, 1755 * MHz, 2110 * MHz, 2155 * MHz, FDD}, - { 5, 824 * MHz, 849 * MHz, 869 * MHz, 894 * MHz, FDD}, - { 6, 830 * MHz, 840 * MHz, 875 * MHz, 885 * MHz, FDD}, - { 7, 2500 * MHz, 2570 * MHz, 2620 * MHz, 2690 * MHz, FDD}, - { 8, 880 * MHz, 915 * MHz, 925 * MHz, 960 * MHz, FDD}, - { 9, 1749900 * KHz, 1784900 * KHz, 1844900 * KHz, 1879900 * KHz, FDD}, - {10, 1710 * MHz, 1770 * MHz, 2110 * MHz, 2170 * MHz, FDD}, - {11, 1427900 * KHz, 1452900 * KHz, 1475900 * KHz, 1500900 * KHz, FDD}, - {12, 698 * MHz, 716 * MHz, 728 * MHz, 746 * MHz, FDD}, - {13, 777 * MHz, 787 * MHz, 746 * MHz, 756 * MHz, FDD}, - {14, 788 * MHz, 798 * MHz, 758 * MHz, 768 * MHz, FDD}, - {17, 704 * MHz, 716 * MHz, 734 * MHz, 746 * MHz, FDD}, - {20, 832 * MHz, 862 * MHz, 791 * MHz, 821 * MHz, FDD}, - {22, 3510 * MHz, 3590 * MHz, 3410 * MHz, 3490 * MHz, FDD}, - {33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD}, - {34, 2010 * MHz, 2025 * MHz, 2010 * MHz, 2025 * MHz, TDD}, - {35, 1850 * MHz, 1910 * MHz, 1850 * MHz, 1910 * MHz, TDD}, - {36, 1930 * MHz, 1990 * MHz, 1930 * MHz, 1990 * MHz, TDD}, - {37, 1910 * MHz, 1930 * MHz, 1910 * MHz, 1930 * MHz, TDD}, - {38, 2570 * MHz, 2620 * MHz, 2570 * MHz, 2630 * MHz, TDD}, - {39, 1880 * MHz, 1920 * MHz, 1880 * MHz, 1920 * MHz, TDD}, - {40, 2300 * MHz, 2400 * MHz, 2300 * MHz, 2400 * MHz, TDD}, - {41, 2496 * MHz, 2690 * MHz, 2496 * MHz, 2690 * MHz, TDD}, - {42, 3400 * MHz, 3600 * MHz, 3400 * MHz, 3600 * MHz, TDD}, - {43, 3600 * MHz, 3800 * MHz, 3600 * MHz, 3800 * MHz, TDD}, - {44, 703 * MHz, 803 * MHz, 703 * MHz, 803 * MHz, TDD}, + { 1, 1920 * MHz, 1980 * MHz, 2110 * MHz, 2170 * MHz, FDD}, + { 2, 1850 * MHz, 1910 * MHz, 1930 * MHz, 1990 * MHz, FDD}, + { 3, 1710 * MHz, 1785 * MHz, 1805 * MHz, 1880 * MHz, FDD}, + { 4, 1710 * MHz, 1755 * MHz, 2110 * MHz, 2155 * MHz, FDD}, + { 5, 824 * MHz, 849 * MHz, 869 * MHz, 894 * MHz, FDD}, + { 6, 830 * MHz, 840 * MHz, 875 * MHz, 885 * MHz, FDD}, + { 7, 2500 * MHz, 2570 * MHz, 2620 * MHz, 2690 * MHz, FDD}, + { 8, 880 * MHz, 915 * MHz, 925 * MHz, 960 * MHz, FDD}, + { 9, 1749900 * KHz, 1784900 * KHz, 1844900 * KHz, 1879900 * KHz, FDD}, + {10, 1710 * MHz, 1770 * MHz, 2110 * MHz, 2170 * MHz, FDD}, + {11, 1427900 * KHz, 1452900 * KHz, 1475900 * KHz, 1500900 * KHz, FDD}, + {12, 698 * MHz, 716 * MHz, 728 * MHz, 746 * MHz, FDD}, + {13, 777 * MHz, 787 * MHz, 746 * MHz, 756 * MHz, FDD}, + {14, 788 * MHz, 798 * MHz, 758 * MHz, 768 * MHz, FDD}, + {17, 704 * MHz, 716 * MHz, 734 * MHz, 746 * MHz, FDD}, + {20, 832 * MHz, 862 * MHz, 791 * MHz, 821 * MHz, FDD}, + {22, 3510 * MHz, 3590 * MHz, 3410 * MHz, 3490 * MHz, FDD}, + {33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD}, + {34, 2010 * MHz, 2025 * MHz, 2010 * MHz, 2025 * MHz, TDD}, + {35, 1850 * MHz, 1910 * MHz, 1850 * MHz, 1910 * MHz, TDD}, + {36, 1930 * MHz, 1990 * MHz, 1930 * MHz, 1990 * MHz, TDD}, + {37, 1910 * MHz, 1930 * MHz, 1910 * MHz, 1930 * MHz, TDD}, + {38, 2570 * MHz, 2620 * MHz, 2570 * MHz, 2630 * MHz, TDD}, + {39, 1880 * MHz, 1920 * MHz, 1880 * MHz, 1920 * MHz, TDD}, + {40, 2300 * MHz, 2400 * MHz, 2300 * MHz, 2400 * MHz, TDD}, + {41, 2496 * MHz, 2690 * MHz, 2496 * MHz, 2690 * MHz, TDD}, + {42, 3400 * MHz, 3600 * MHz, 3400 * MHz, 3600 * MHz, TDD}, + {43, 3600 * MHz, 3800 * MHz, 3600 * MHz, 3800 * MHz, TDD}, + {44, 703 * MHz, 803 * MHz, 703 * MHz, 803 * MHz, TDD}, }; + + + +pthread_t main_ue_thread; +pthread_attr_t attr_UE_thread; +struct sched_param sched_param_UE_thread; + +void phy_init_lte_ue_transport(PHY_VARS_UE *ue,int absraction_flag); + +PHY_VARS_UE* init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, + uint8_t UE_id, + uint8_t abstraction_flag) + +{ + + PHY_VARS_UE* ue; + + if (frame_parms!=(LTE_DL_FRAME_PARMS *)NULL) { // if we want to give initial frame parms, allocate the PHY_VARS_UE structure and put them in + ue = (PHY_VARS_UE *)malloc(sizeof(PHY_VARS_UE)); + memset(ue,0,sizeof(PHY_VARS_UE)); + memcpy(&(ue->frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); + } + else ue = PHY_vars_UE_g[UE_id][0]; + + + ue->Mod_id = UE_id; + ue->mac_enabled = 1; + // initialize all signal buffers + init_lte_ue_signal(ue,1,abstraction_flag); + // intialize transport + init_lte_ue_transport(ue,abstraction_flag); + + return(ue); +} + + +char uecap_xer[1024]; + + + +void init_thread(int sched_runtime, int sched_deadline, int sched_fifo, cpu_set_t *cpuset, char * name) { + +#ifdef DEADLINE_SCHEDULER + if (sched_runtime!=0) { + struct sched_attr attr= {0}; + attr.size = sizeof(attr); + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = sched_runtime; + attr.sched_deadline = sched_deadline; + attr.sched_period = 0; + AssertFatal(sched_setattr(0, &attr, 0) == 0, + "[SCHED] %s thread: sched_setattr failed %s \n", name, strerror(errno)); + LOG_I(HW,"[SCHED][eNB] %s deadline thread %lu started on CPU %d\n", + name, (unsigned long)gettid(), sched_getcpu()); + } +#else + if (CPU_COUNT(cpuset) > 0) + AssertFatal( 0 == pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), cpuset), ""); + struct sched_param sp; + sp.sched_priority = sched_fifo; + AssertFatal(pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp)==0, + "Can't set thread priority, Are you root?\n"); + /* Check the actual affinity mask assigned to the thread */ + cpu_set_t *cset=CPU_ALLOC(CPU_SETSIZE); + if (0 == pthread_getaffinity_np(pthread_self(), CPU_ALLOC_SIZE(CPU_SETSIZE), cset)) { + char txt[512]={0}; + for (int j = 0; j < CPU_SETSIZE; j++) + if (CPU_ISSET(j, cset)) + sprintf(txt+strlen(txt), " %d ", j); + printf("CPU Affinity of thread %s is %s\n", name, txt); + } + CPU_FREE(cset); +#endif + +} + +void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in) { + + PHY_VARS_UE *UE; + int inst; + int ret; + + LOG_I(PHY,"UE : Calling Layer 2 for initialization\n"); + + l2_init_ue(eMBMS_active,(uecap_xer_in==1)?uecap_xer:NULL, + 0,// cba_group_active + 0); // HO flag + + for (inst=0;instrfdevice), &openair0_cfg[0]); + if (ret !=0){ + exit_fun("Error loading device library"); + } + } + UE->rfdevice.host_type = RAU_HOST; + // UE->rfdevice.type = NONE_DEV; + PHY_VARS_UE *UE = PHY_vars_UE_g[inst][0]; + AssertFatal(0 == pthread_create(&UE->proc.pthread_ue, + &UE->proc.attr_ue, + UE_thread, + (void*)UE), ""); + } + + printf("UE threads created by %ld\n", gettid()); +#if 0 +#if defined(ENABLE_USE_MME) + extern volatile int start_UE; + while (start_UE == 0) { + sleep(1); + } +#endif +#endif +} + /*! * \brief This is the UE synchronize thread. * It performs band scanning and synchonization. * \param arg is a pointer to a \ref PHY_VARS_UE structure. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ + static void *UE_thread_synch(void *arg) { static int UE_thread_synch_retval; @@ -203,95 +264,24 @@ static void *UE_thread_synch(void *arg) int current_band = 0; int current_offset = 0; sync_mode_t sync_mode = pbch; - int card; + int CC_id = UE->CC_id; int ind; int found; int freq_offset=0; + char threadname[128]; UE->is_synchronized = 0; printf("UE_thread_sync in with PHY_vars_UE %p\n",arg); - printf("waiting for sync (UE_thread_synch) \n"); -#ifndef DEADLINE_SCHEDULER - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD threads */ + cpu_set_t cpuset; CPU_ZERO(&cpuset); - - #ifdef CPU_AFFINITY - if (get_nprocs() >2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); - } - } - #endif - - /* Check the actual affinity mask assigned to the thread */ - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } - memset(cpu_affinity, 0 , sizeof(cpu_affinity)); - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf(temp, " CPU_%d ", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - policy = SCHED_FIFO ; + if ( threads.iq != -1 ) + CPU_SET(threads.iq, &cpuset); + // this thread priority must be lower that the main acquisition thread + sprintf(threadname, "sync UE %d\n", UE->Mod_id); + init_thread(100000, 500000, FIFO_PRIORITY-1, &cpuset, threadname); - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); - - } - - LOG_I( HW, "[SCHED][UE] Started UE synch thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - (int) sparam.sched_priority, cpu_affinity); - -#endif - - - pthread_mutex_lock(&sync_mutex); - printf("Locked sync_mutex, waiting (UE_sync_thread)\n"); - - while (sync_var<0) - pthread_cond_wait(&sync_cond, &sync_mutex); - - pthread_mutex_unlock(&sync_mutex); - printf("unlocked sync_mutex (UE_sync_thread)\n"); - - printf("starting UE synch thread (IC %d)\n",UE->instance_cnt_synch); + printf("starting UE synch thread (IC %d)\n",UE->proc.instance_cnt_synch); ind = 0; found = 0; @@ -301,10 +291,9 @@ static void *UE_thread_synch(void *arg) current_band = eutra_bands[ind].band; printf( "Scanning band %d, dl_min %"PRIu32", ul_min %"PRIu32"\n", current_band, eutra_bands[ind].dl_min,eutra_bands[ind].ul_min); - if ((eutra_bands[ind].dl_min <= downlink_frequency[0][0]) && (eutra_bands[ind].dl_max >= downlink_frequency[0][0])) { - for (card=0; cardframe_parms.dl_CarrierFreq) && (eutra_bands[ind].dl_max >= UE->frame_parms.dl_CarrierFreq)) { + for (i=0; i<4; i++) + uplink_frequency_offset[CC_id][i] = eutra_bands[ind].ul_min - eutra_bands[ind].dl_min; found = 1; break; @@ -314,21 +303,22 @@ static void *UE_thread_synch(void *arg) } while (ind < sizeof(eutra_bands) / sizeof(eutra_bands[0])); if (found == 0) { + LOG_E(PHY,"Can't find EUTRA band for frequency %d",UE->frame_parms.dl_CarrierFreq); exit_fun("Can't find EUTRA band for frequency"); return &UE_thread_synch_retval; } + LOG_I( PHY, "[SCHED][UE] Check absolute frequency DL %"PRIu32", UL %"PRIu32" (oai_exit %d, rx_num_channels %d)\n", UE->frame_parms.dl_CarrierFreq, UE->frame_parms.ul_CarrierFreq,oai_exit, openair0_cfg[0].rx_num_channels); - - - - LOG_I( PHY, "[SCHED][UE] Check absolute frequency DL %"PRIu32", UL %"PRIu32" (oai_exit %d)\n", downlink_frequency[0][0], downlink_frequency[0][0]+uplink_frequency_offset[0][0],oai_exit ); - - for (i=0;irf_map.card].rx_num_channels;i++) { + openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] = UE->frame_parms.dl_CarrierFreq; + openair0_cfg[UE->rf_map.card].tx_freq[UE->rf_map.chain+i] = UE->frame_parms.ul_CarrierFreq; + openair0_cfg[UE->rf_map.card].autocal[UE->rf_map.chain+i] = 1; + if (uplink_frequency_offset[CC_id][i] != 0) // + openair0_cfg[UE->rf_map.card].duplex_mode = duplex_mode_FDD; + else //FDD + openair0_cfg[UE->rf_map.card].duplex_mode = duplex_mode_TDD; } sync_mode = pbch; @@ -336,1826 +326,756 @@ static void *UE_thread_synch(void *arg) } else if (UE->UE_scan == 1) { current_band=0; - for (card=0; cardrx_total_gain_dB;//-USRP_GAIN_OFFSET; - -#if 0 // UHD 3.8 - switch(UE->lte_frame_parms.N_RB_DL) { - case 6: - openair0_cfg[card].rx_gain[i] -= 12; - break; - - case 25: - openair0_cfg[card].rx_gain[i] -= 6; - break; - - case 50: - openair0_cfg[card].rx_gain[i] -= 3; - break; - - case 100: - openair0_cfg[card].rx_gain[i] -= 0; - break; - - default: - printf( "Unknown number of RBs %d\n", UE->lte_frame_parms.N_RB_DL ); - break; - } -#endif - printf( "UE synch: setting RX gain (%d,%d) to %f\n", card, i, openair0_cfg[card].rx_gain[i] ); -#endif - } + for (i=0; irf_map.card].rx_num_channels; i++) { + downlink_frequency[UE->rf_map.card][UE->rf_map.chain+i] = bands_to_scan.band_info[CC_id].dl_min; + uplink_frequency_offset[UE->rf_map.card][UE->rf_map.chain+i] = + bands_to_scan.band_info[CC_id].ul_min-bands_to_scan.band_info[CC_id].dl_min; + openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] = downlink_frequency[CC_id][i]; + openair0_cfg[UE->rf_map.card].tx_freq[UE->rf_map.chain+i] = + downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i]; + openair0_cfg[UE->rf_map.card].rx_gain[UE->rf_map.chain+i] = UE->rx_total_gain_dB; } + } + while (sync_var<0) + pthread_cond_wait(&sync_cond, &sync_mutex); + pthread_mutex_unlock(&sync_mutex); + + printf("Started device, unlocked sync_mutex (UE_sync_thread)\n"); + + if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) { + LOG_E(HW,"Could not start the device\n"); + oai_exit=1; } while (oai_exit==0) { - - if (pthread_mutex_lock(&UE->mutex_synch) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE initial synch thread\n" ); - exit_fun("noting to add"); - return &UE_thread_synch_retval; - } - - - while (UE->instance_cnt_synch < 0) { + AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synch), ""); + while (UE->proc.instance_cnt_synch < 0) // the thread waits here most of the time - pthread_cond_wait( &UE->cond_synch, &UE->mutex_synch ); - } - - if (pthread_mutex_unlock(&UE->mutex_synch) != 0) { - LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for UE Initial Synch thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_synch_retval; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH, 1 ); - + pthread_cond_wait( &UE->proc.cond_synch, &UE->proc.mutex_synch ); + AssertFatal ( 0== pthread_mutex_unlock(&UE->proc.mutex_synch), ""); + switch (sync_mode) { case pss: LOG_I(PHY,"[SCHED][UE] Scanning band %d (%d), freq %u\n",bands_to_scan.band_info[current_band].band, current_band,bands_to_scan.band_info[current_band].dl_min+current_offset); lte_sync_timefreq(UE,current_band,bands_to_scan.band_info[current_band].dl_min+current_offset); current_offset += 20000000; // increase by 20 MHz - + if (current_offset > bands_to_scan.band_info[current_band].dl_max-bands_to_scan.band_info[current_band].dl_min) { - current_band++; - current_offset=0; - } + current_band++; + current_offset=0; + } - if (current_band==bands_to_scan.nbands) { - current_band=0; - oai_exit=1; - } + if (current_band==bands_to_scan.nbands) { + current_band=0; + oai_exit=1; + } - for (card=0; cardrf_map.card].rx_num_channels; i++) { + downlink_frequency[UE->rf_map.card][UE->rf_map.chain+i] = bands_to_scan.band_info[current_band].dl_min+current_offset; + uplink_frequency_offset[UE->rf_map.card][UE->rf_map.chain+i] = bands_to_scan.band_info[current_band].ul_min-bands_to_scan.band_info[0].dl_min + current_offset; + openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] = downlink_frequency[CC_id][i]; + openair0_cfg[UE->rf_map.card].tx_freq[UE->rf_map.chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i]; + openair0_cfg[UE->rf_map.card].rx_gain[UE->rf_map.chain+i] = UE->rx_total_gain_dB; + if (UE->UE_scan_carrier) { + openair0_cfg[UE->rf_map.card].autocal[UE->rf_map.chain+i] = 1; + } + } - openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]; - openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]; -#ifdef OAI_USRP - openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET; // 65 calibrated for USRP B210 @ 2.6 GHz - -#if 0 // UHD 3.8 - switch(UE->lte_frame_parms.N_RB_DL) { - case 6: - openair0_cfg[card].rx_gain[i] -= 12; - break; - - case 25: - openair0_cfg[card].rx_gain[i] -= 6; - break; - - case 50: - openair0_cfg[card].rx_gain[i] -= 3; - break; - - case 100: - openair0_cfg[card].rx_gain[i] -= 0; - break; - - default: - printf("Unknown number of RBs %d\n",UE->lte_frame_parms.N_RB_DL); - break; - } -#endif - - printf("UE synch: setting RX gain (%d,%d) to %f\n",card,i,openair0_cfg[card].rx_gain[i]); -#endif - - } - - } - - if (UE->UE_scan_carrier) { - - for (i=0;imode ) == 0) { - - hw_slot_offset = (UE->rx_offset<<1) / UE->lte_frame_parms.samples_per_tti; - LOG_I( HW, "Got synch: hw_slot_offset %d\n", hw_slot_offset ); - if (UE->UE_scan_carrier == 1) { - - UE->UE_scan_carrier = 0; - // rerun with new cell parameters and frequency-offset - for (i=0;irx_total_gain_dB;//-USRP_GAIN_OFFSET; - openair0_cfg[0].rx_freq[i] -= UE->lte_ue_common_vars.freq_offset; - openair0_cfg[0].tx_freq[i] = openair0_cfg[0].rx_freq[i]+uplink_frequency_offset[0][i]; - downlink_frequency[0][i] = openair0_cfg[0].rx_freq[i]; - freq_offset=0; - } - - // reconfigure for potentially different bandwidth - switch(UE->lte_frame_parms.N_RB_DL) { - case 6: - openair0_cfg[0].sample_rate =1.92e6; - openair0_cfg[0].rx_bw =.96e6; - openair0_cfg[0].tx_bw =.96e6; - // openair0_cfg[0].rx_gain[0] -= 12; - break; - case 25: - openair0_cfg[0].sample_rate =7.68e6; - openair0_cfg[0].rx_bw =2.5e6; - openair0_cfg[0].tx_bw =2.5e6; - // openair0_cfg[0].rx_gain[0] -= 6; - break; - case 50: - openair0_cfg[0].sample_rate =15.36e6; - openair0_cfg[0].rx_bw =5.0e6; - openair0_cfg[0].tx_bw =5.0e6; - // openair0_cfg[0].rx_gain[0] -= 3; - break; - case 100: - openair0_cfg[0].sample_rate=30.72e6; - openair0_cfg[0].rx_bw=10.0e6; - openair0_cfg[0].tx_bw=10.0e6; - // openair0_cfg[0].rx_gain[0] -= 0; - break; - } -#ifndef EXMIMO - openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0); - //openair0.trx_set_gains_func(&openair0,&openair0_cfg[0]); - //openair0.trx_stop_func(0); +#if DISABLE_LOG_X + printf("[UE thread Synch] Running Initial Synch (mode %d)\n",UE->mode); #else - openair0_set_frequencies(&openair0,&openair0_cfg[0],0); - openair0_set_gains(&openair0,&openair0_cfg[0]); - openair0_stop(0); + LOG_I(PHY, "[UE thread Synch] Running Initial Synch (mode %d)\n",UE->mode); #endif - sleep(1); - init_frame_parms(&UE->lte_frame_parms,1); - } - else { - UE->is_synchronized = 1; + if (initial_sync( UE, UE->mode ) == 0) { - if( UE->mode == rx_dump_frame ){ - FILE *fd; - if ((UE->frame_rx&1) == 0) { // this guarantees SIB1 is present - if ((fd = fopen("rxsig_frame0.dat","w")) != NULL) { - fwrite((void*)&UE->lte_ue_common_vars.rxdata[0][0], - sizeof(int32_t), - 10*UE->lte_frame_parms.samples_per_tti, - fd); - LOG_I(PHY,"Dummping Frame ... bye bye \n"); - fclose(fd); - exit(0); - } - else { - LOG_E(PHY,"Cannot open file for writing\n"); - exit(0); - } - } - else { - UE->is_synchronized = 0; - } - } - + hw_slot_offset = (UE->rx_offset<<1) / UE->frame_parms.samples_per_tti; + LOG_I( HW, "Got synch: hw_slot_offset %d, carrier off %d Hz, rxgain %d (DL %u, UL %u), UE_scan_carrier %d\n", + hw_slot_offset, + freq_offset, + UE->rx_total_gain_dB, + downlink_frequency[0][0]+freq_offset, + downlink_frequency[0][0]+uplink_frequency_offset[0][0]+freq_offset, + UE->UE_scan_carrier ); -#ifndef EXMIMO - UE->slot_rx = 0; - UE->slot_tx = 4; -#else - UE->slot_rx = 18; - UE->slot_tx = 2; -#endif - } - } else { - // initial sync failed - // calculate new offset and try again - if (UE->UE_scan_carrier == 1) { - if (freq_offset >= 0) { - freq_offset += 100; - freq_offset *= -1; - } else { - freq_offset *= -1; + + // rerun with new cell parameters and frequency-offset + for (i=0; irf_map.card].rx_num_channels; i++) { + openair0_cfg[UE->rf_map.card].rx_gain[UE->rf_map.chain+i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET; + if (UE->UE_scan_carrier == 1) { + if (freq_offset >= 0) + openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] += abs(UE->common_vars.freq_offset); + else + openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] -= abs(UE->common_vars.freq_offset); + openair0_cfg[UE->rf_map.card].tx_freq[UE->rf_map.chain+i] = + openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i]+uplink_frequency_offset[CC_id][i]; + downlink_frequency[CC_id][i] = openair0_cfg[CC_id].rx_freq[i]; + freq_offset=0; + } } - - if (abs(freq_offset) > 7500) { - LOG_I( PHY, "[initial_sync] No cell synchronization found, abandoning\n" ); - FILE *fd; - if ((fd = fopen("rxsig_frame0.dat","w"))!=NULL) { - fwrite((void*)&UE->lte_ue_common_vars.rxdata[0][0], - sizeof(int32_t), - 10*UE->lte_frame_parms.samples_per_tti, - fd); - LOG_I(PHY,"Dummping Frame ... bye bye \n"); - fclose(fd); - exit(0); - } - mac_xface->macphy_exit("No cell synchronization found, abandoning"); - return &UE_thread_synch_retval; // not reached - } - } - else { - - } - LOG_I( PHY, "[initial_sync] trying carrier off %d Hz, rxgain %d (DL %u, UL %u)\n", - freq_offset, - UE->rx_total_gain_dB, - downlink_frequency[0][0]+freq_offset, - downlink_frequency[0][0]+uplink_frequency_offset[0][0]+freq_offset ); - for (card=0; cardframe_parms.N_RB_DL) { + case 6: + openair0_cfg[UE->rf_map.card].sample_rate =1.92e6; + openair0_cfg[UE->rf_map.card].rx_bw =.96e6; + openair0_cfg[UE->rf_map.card].tx_bw =.96e6; + // openair0_cfg[0].rx_gain[0] -= 12; + break; + case 25: + openair0_cfg[UE->rf_map.card].sample_rate =7.68e6; + openair0_cfg[UE->rf_map.card].rx_bw =2.5e6; + openair0_cfg[UE->rf_map.card].tx_bw =2.5e6; + // openair0_cfg[0].rx_gain[0] -= 6; + break; + case 50: + openair0_cfg[UE->rf_map.card].sample_rate =15.36e6; + openair0_cfg[UE->rf_map.card].rx_bw =5.0e6; + openair0_cfg[UE->rf_map.card].tx_bw =5.0e6; + // openair0_cfg[0].rx_gain[0] -= 3; + break; + case 100: + openair0_cfg[UE->rf_map.card].sample_rate=30.72e6; + openair0_cfg[UE->rf_map.card].rx_bw=10.0e6; + openair0_cfg[UE->rf_map.card].tx_bw=10.0e6; + // openair0_cfg[0].rx_gain[0] -= 0; + break; + } + + UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0); + //UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]); + //UE->rfdevice.trx_stop_func(&UE->rfdevice); + sleep(1); + init_frame_parms(&UE->frame_parms,1); + /*if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) { + LOG_E(HW,"Could not start the device\n"); + oai_exit=1; + }*/ + + if (UE->UE_scan_carrier == 1) { + + UE->UE_scan_carrier = 0; + } else { + AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synch), ""); + UE->is_synchronized = 1; + AssertFatal ( 0== pthread_mutex_unlock(&UE->proc.mutex_synch), ""); + + if( UE->mode == rx_dump_frame ) { + FILE *fd; + if ((UE->proc.proc_rxtx[0].frame_rx&1) == 0) { // this guarantees SIB1 is present + if ((fd = fopen("rxsig_frame0.dat","w")) != NULL) { + fwrite((void*)&UE->common_vars.rxdata[0][0], + sizeof(int32_t), + 10*UE->frame_parms.samples_per_tti, + fd); + LOG_I(PHY,"Dummping Frame ... bye bye \n"); + fclose(fd); + exit(0); + } else { + LOG_E(PHY,"Cannot open file for writing\n"); + exit(0); + } + } else { + AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synch), ""); + UE->is_synchronized = 0; + AssertFatal ( 0== pthread_mutex_unlock(&UE->proc.mutex_synch), ""); + + } + } + } + } else { + // initial sync failed + // calculate new offset and try again + if (UE->UE_scan_carrier == 1) { + if (freq_offset >= 0) + freq_offset += 100; + freq_offset *= -1; + + if (abs(freq_offset) > 7500) { + LOG_I( PHY, "[initial_sync] No cell synchronization found, abandoning\n" ); + FILE *fd; + if ((fd = fopen("rxsig_frame0.dat","w"))!=NULL) { + fwrite((void*)&UE->common_vars.rxdata[0][0], + sizeof(int32_t), + 10*UE->frame_parms.samples_per_tti, + fd); + LOG_I(PHY,"Dummping Frame ... bye bye \n"); + fclose(fd); + exit(0); + } + AssertFatal(1==0,"No cell synchronization found, abandoning"); + return &UE_thread_synch_retval; // not reached + } + } +#if DISABLE_LOG_X + printf("[initial_sync] trying carrier off %d Hz, rxgain %d (DL %u, UL %u)\n", + freq_offset, + UE->rx_total_gain_dB, + downlink_frequency[0][0]+freq_offset, + downlink_frequency[0][0]+uplink_frequency_offset[0][0]+freq_offset ); #else - openair0_set_frequencies(&openair0,&openair0_cfg[0],0); - + LOG_I(PHY, "[initial_sync] trying carrier off %d Hz, rxgain %d (DL %u, UL %u)\n", + freq_offset, + UE->rx_total_gain_dB, + downlink_frequency[0][0]+freq_offset, + downlink_frequency[0][0]+uplink_frequency_offset[0][0]+freq_offset ); #endif -#if defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) - openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET; - - -#if 0 - switch(UE->lte_frame_parms.N_RB_DL) { - case 6: - openair0_cfg[card].rx_gain[i] -= 12; - break; - - case 25: - openair0_cfg[card].rx_gain[i] -= 6; - break; - - case 50: - openair0_cfg[card].rx_gain[i] -= 0;//3; - break; - - case 100: - openair0_cfg[card].rx_gain[i] -= 0; - break; - - default: - printf("Unknown number of RBs %d\n",UE->lte_frame_parms.N_RB_DL); - break; - } -#endif -#endif - } + for (i=0; irf_map.card].rx_num_channels; i++) { + openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] = downlink_frequency[CC_id][i]+freq_offset; + openair0_cfg[UE->rf_map.card].tx_freq[UE->rf_map.chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i]+freq_offset; + openair0_cfg[UE->rf_map.card].rx_gain[UE->rf_map.chain+i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET; + if (UE->UE_scan_carrier==1) + openair0_cfg[UE->rf_map.card].autocal[UE->rf_map.chain+i] = 1; + } + UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0); + }// initial_sync=0 + break; + case si: + default: + break; } - if (UE->UE_scan_carrier==1) { - for (i=0;iproc.mutex_synch), ""); + // indicate readiness + UE->proc.instance_cnt_synch--; + AssertFatal ( 0== pthread_mutex_unlock(&UE->proc.mutex_synch), ""); - case si: - default: - break; - } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_SYNCH, 0 ); + } // while !oai_exit - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH, 0 ); - - - - if (pthread_mutex_lock(&UE->mutex_synch) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE synch\n" ); - exit_fun("noting to add"); - return &UE_thread_synch_retval; - } - - // indicate readiness - UE->instance_cnt_synch--; - - if (pthread_mutex_unlock(&UE->mutex_synch) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE synch\n" ); - exit_fun("noting to add"); - return &UE_thread_synch_retval; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH, 0 ); - } // while !oai_exit - - return &UE_thread_synch_retval; + return &UE_thread_synch_retval; } /*! - * \brief This is the UE transmit thread. - * This thread performs the phy_procedures_UE_TX() on every transmit slot. - * \param arg is a pointer to a \ref PHY_VARS_UE structure. - * \returns a pointer to an int. The storage is not on the heap and must not be freed. - */ -static void *UE_thread_tx(void *arg) -{ - static int UE_thread_tx_retval; - //int ret; - - PHY_VARS_UE *UE = (PHY_VARS_UE*)arg; - - UE->instance_cnt_tx=-1; - -#ifdef RTAI - RT_TASK *task = rt_task_init_schmod(nam2num("UE TX Thread"), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][UE] Problem starting UE TX thread!!!!\n"); - return 0; - } - - LOG_D(HW,"Started UE TX thread (id %p)\n",task); -#else - -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - /* This creates a 1ms reservation every 10ms period*/ - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = 900000; // each tx thread requires .5ms to finish its job - attr.sched_deadline = 1000000; // each tx thread will finish within 1ms - attr.sched_period = 1000000; // each tx thread has a period of 1ms from the starting point - - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] UE_thread_tx thread: sched_setattr failed\n"); - return &UE_thread_tx_retval; - } - -#else - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD threads */ - CPU_ZERO(&cpuset); - - #ifdef CPU_AFFINITY - if (get_nprocs() >2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); - } - } - #endif - - /* Check the actual affinity mask assigned to the thread */ - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } - memset(cpu_affinity, 0 , sizeof(cpu_affinity)); - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf(temp, " CPU_%d ", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - policy = SCHED_FIFO ; - - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); - - } - - LOG_I( HW, "[SCHED][UE] Started UE thread TX on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - (int) sparam.sched_priority, cpu_affinity); - - -#endif -#endif - - printf("waiting for sync (UE_thread_tx)\n"); - - pthread_mutex_lock(&sync_mutex); - printf("Locked sync_mutex, waiting (UE_thread_tx)\n"); - - while (sync_var<0) - pthread_cond_wait(&sync_cond, &sync_mutex); - - pthread_mutex_unlock(&sync_mutex); - printf("unlocked sync_mutex, waiting (UE_thread_tx)\n"); - - printf("Starting UE TX thread\n"); - - // Lock memory from swapping. This is a process wide call (not constraint to this thread). - mlockall(MCL_CURRENT | MCL_FUTURE); - - while (!oai_exit) { - - if (pthread_mutex_lock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX\n" ); - exit_fun("nothing to add"); - return &UE_thread_tx_retval; - } - - while (UE->instance_cnt_tx < 0) { - // most of the time, the thread is waiting here - pthread_cond_wait( &UE->cond_tx, &UE->mutex_tx ); - } - - if (pthread_mutex_unlock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE TX\n" ); - exit_fun("nothing to add"); - return &UE_thread_tx_retval; - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_TX, 1 ); - - if ((subframe_select( &UE->lte_frame_parms, UE->slot_tx>>1 ) == SF_UL) || - (UE->lte_frame_parms.frame_type == FDD)) { - phy_procedures_UE_TX( UE, 0, 0, UE->mode, no_relay ); - } - - if ((subframe_select( &UE->lte_frame_parms, UE->slot_tx>>1 ) == SF_S) && - ((UE->slot_tx&1) == 1)) { - phy_procedures_UE_S_TX( UE, 0, 0, no_relay ); - } - - UE->slot_tx += 2; - - if (UE->slot_tx >= 20) { - UE->slot_tx -= 20; - UE->frame_tx++; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_UE, UE->frame_tx ); - } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX_UE, UE->slot_tx>>1 ); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_TX, 0 ); - - if (pthread_mutex_lock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_tx_retval; - } - - UE->instance_cnt_tx--; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, UE->instance_cnt_tx); - - if (pthread_mutex_unlock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE TX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_tx_retval; - } - - } - - return &UE_thread_tx_retval; -} - -/*! - * \brief This is the UE receive thread. + * \brief This is the UE thread for RX subframe n and TX subframe n+4. * This thread performs the phy_procedures_UE_RX() on every received slot. + * then, if TX is enabled it performs TX for n+4. * \param arg is a pointer to a \ref PHY_VARS_UE structure. * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ -/* -#ifdef OAI_USRP -void rescale(int16_t *input,int length) -{ -#if defined(__x86_64__) || defined(__i386__) - __m128i *input128 = (__m128i *)input; -#elif defined(__arm__) - int16x8_t *input128 = (int16x8_t *)input; -#endif - int i; +static void *UE_thread_rxn_txnp4(void *arg) { + static __thread int UE_thread_rxtx_retval; + struct rx_tx_thread_data *rtd = arg; + UE_rxtx_proc_t *proc = rtd->proc; + PHY_VARS_UE *UE = rtd->UE; + int ret; - for (i=0; i>2; i++) { -#if defined(__x86_64__) || defined(__i386__) - input128[i] = _mm_srai_epi16(input128[i],4); -#elif defined(__arm__) - input128[i] = vshrq_n_s16(input128[i],4); -#endif - } -} -#endif -*/ + proc->instance_cnt_rxtx=-1; + proc->subframe_rx=proc->sub_frame_start; -static void *UE_thread_rx(void *arg) -{ - static int UE_thread_rx_retval; - PHY_VARS_UE *UE = (PHY_VARS_UE*)arg; - int i; - int ret; + char threadname[256]; + sprintf(threadname,"UE_%d_proc_%d", UE->Mod_id, proc->sub_frame_start); + cpu_set_t cpuset; + CPU_ZERO(&cpuset); - UE->instance_cnt_rx=-1; + if ( (proc->sub_frame_start+1)%RX_NB_TH == 0 && threads.one != -1 ) + CPU_SET(threads.one, &cpuset); + if ( (proc->sub_frame_start+1)%RX_NB_TH == 1 && threads.two != -1 ) + CPU_SET(threads.two, &cpuset); + if ( (proc->sub_frame_start+1)%RX_NB_TH == 2 && threads.three != -1 ) + CPU_SET(threads.three, &cpuset); + //CPU_SET(threads.three, &cpuset); + init_thread(900000,1000000 , FIFO_PRIORITY-1, &cpuset, + threadname); -#ifdef RTAI - RT_TASK *task = rt_task_init_schmod(nam2num("UE RX Thread"), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][UE] Problem starting UE RX thread!!!!\n"); - return &UE_thread_rx_retval; - } - - LOG_D(HW,"Started UE RX thread (id %p)\n",task); -#else - -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - // This creates a .5ms reservation every 1ms period - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = 900000; // each rx thread requires 1ms to finish its job - attr.sched_deadline = 1000000; // each rx thread will finish within 1ms - attr.sched_period = 1000000; // each rx thread has a period of 1ms from the starting point - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] UE_thread_rx : sched_setattr failed\n"); - return &UE_thread_rx_retval; - } - -#else - int policy, s, j; - struct sched_param sparam; - char cpu_affinity[1024]; - cpu_set_t cpuset; - - /* Set affinity mask to include CPUs 1 to MAX_CPUS */ - /* CPU 0 is reserved for UHD threads */ - CPU_ZERO(&cpuset); - - #ifdef CPU_AFFINITY - if (get_nprocs() >2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); - } - } - #endif - - /* Check the actual affinity mask assigned to the thread */ - - s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) - { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } - memset(cpu_affinity, 0 , sizeof(cpu_affinity)); - for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf(temp, " CPU_%d ", j); - strcat(cpu_affinity, temp); - } - - memset(&sparam, 0 , sizeof (sparam)); - sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; - policy = SCHED_FIFO ; - - s = pthread_setschedparam(pthread_self(), policy, &sparam); - if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } - s = pthread_getschedparam(pthread_self(), &policy, &sparam); - if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); - - } - - LOG_I( HW, "[SCHED][UE] Started UE RX thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - (int) sparam.sched_priority, cpu_affinity); - - -#endif -#endif - - // Lock memory from swapping. This is a process wide call (not constraint to this thread). - mlockall(MCL_CURRENT | MCL_FUTURE); - - printf("waiting for sync (UE_thread_rx)\n"); - - pthread_mutex_lock(&sync_mutex); - printf("Locked sync_mutex, waiting (UE_thread_rx)\n"); - - while (sync_var<0) - pthread_cond_wait(&sync_cond, &sync_mutex); - - pthread_mutex_unlock(&sync_mutex); - printf("unlocked sync_mutex, waiting (UE_thread_rx)\n"); - - printf("Starting UE RX thread\n"); - - while (!oai_exit) { - if (pthread_mutex_lock(&UE->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX\n" ); - exit_fun("nothing to add"); - return &UE_thread_rx_retval; - } - - while (UE->instance_cnt_rx < 0) { - // most of the time, the thread is waiting here - pthread_cond_wait( &UE->cond_rx, &UE->mutex_rx ); - } - - if (pthread_mutex_unlock(&UE->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX\n" ); - exit_fun("nothing to add"); - return &UE_thread_rx_retval; - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, 1 ); - for (i=0; i<2; i++) { - if ((subframe_select( &UE->lte_frame_parms, UE->slot_rx>>1 ) == SF_DL) || - (UE->lte_frame_parms.frame_type == FDD)) { - /* -#ifdef OAI_USRP - // this does the adjustments of RX signal amplitude to bring into least 12 significant bits - int slot_length = UE->lte_frame_parms.samples_per_tti>>1; - int rx_offset = (UE->slot_rx)*slot_length + UE->rx_offset; - int frame_length = UE->lte_frame_parms.samples_per_tti*10; - int aa; - if (rx_offset > frame_length) - rx_offset-=frame_length; - - - if (rx_offset >= 0) { - if (rx_offset + slot_length < frame_length) - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++) - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], - slot_length); - else { - int diff = rx_offset + slot_length - frame_length; - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], - slot_length-diff); - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], - diff); - } - } - } - else { - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)], - -rx_offset); - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], - slot_length+rx_offset); - } - } -#endif - */ - phy_procedures_UE_RX( UE, 0, 0, UE->mode, no_relay, NULL ); - } - - if ((subframe_select( &UE->lte_frame_parms, UE->slot_rx>>1 ) == SF_S) && - ((UE->slot_rx&1) == 0)) { - /* -#ifdef OAI_USRP - // this does the adjustments of RX signal amplitude to bring into least 12 significant bits - int slot_length = UE->lte_frame_parms.samples_per_tti>>1; - int rx_offset = (UE->slot_rx)*slot_length + UE->rx_offset; - int frame_length = UE->lte_frame_parms.samples_per_tti*10; - if (rx_offset > frame_length) - rx_offset-=frame_length; - int aa; - - if (rx_offset >= 0) { - if (rx_offset + slot_length < frame_length) - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++) - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], - slot_length); - else { - int diff = rx_offset + slot_length - frame_length; - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][rx_offset&(~0x3)], - slot_length-diff); - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], - diff); - } - } - } - else { - for (aa=0;aalte_frame_parms.nb_antennas_rx;aa++){ - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)], - -rx_offset); - rescale((int16_t*)&UE->lte_ue_common_vars.rxdata[aa][0], - slot_length+rx_offset); - } - } -#endif - */ - phy_procedures_UE_RX( UE, 0, 0, UE->mode, no_relay, NULL ); - } - - if ((UE->mac_enabled==1) && (i==0)) { - ret = mac_xface->ue_scheduler(UE->Mod_id, - UE->frame_tx, - UE->slot_rx>>1, - subframe_select(&UE->lte_frame_parms,UE->slot_tx>>1), - 0, - 0/*FIXME CC_id*/); - - if (ret == CONNECTION_LOST) { - LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, returning to PRACH\n", - UE->Mod_id, UE->frame_rx, UE->slot_tx>>1 ); - UE->UE_mode[0] = PRACH; - } else if (ret == PHY_RESYNCH) { - LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, trying to resynch\n", - UE->Mod_id, UE->frame_rx, UE->slot_tx>>1 ); - UE->UE_mode[0] = RESYNCH; - } else if (ret == PHY_HO_PRACH) { - LOG_I( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u, return to PRACH and perform a contention-free access\n", - UE->Mod_id, UE->frame_rx, UE->slot_tx>>1 ); - UE->UE_mode[0] = PRACH; + while (!oai_exit) { + if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" ); + exit_fun("nothing to add"); + } + while (proc->instance_cnt_rxtx < 0) { + // most of the time, the thread is waiting here + pthread_cond_wait( &proc->cond_rxtx, &proc->mutex_rxtx ); + } + if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RXn_TXnp4\n" ); + exit_fun("nothing to add"); } - } - UE->slot_rx++; + initRefTimes(t2); + initRefTimes(t3); + pickTime(current); + updateTimes(proc->gotIQs, &t2, 10000, "Delay to wake up UE_Thread_Rx (case 2)"); - if (UE->slot_rx == 20) { - UE->slot_rx = 0; - UE->frame_rx++; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_UE, UE->frame_rx ); - } + // Process Rx data for one sub-frame + lte_subframe_t sf_type = subframe_select( &UE->frame_parms, proc->subframe_rx); + if ((sf_type == SF_DL) || + (UE->frame_parms.frame_type == FDD) || + (sf_type == SF_S)) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_UE, UE->slot_rx>>1 ); - } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, 0 ); + if (UE->frame_parms.frame_type == TDD) { + LOG_D(PHY, "%s,TDD%d,%s: calling UE_RX\n", + threadname, + UE->frame_parms.tdd_config, + (sf_type==SF_DL? "SF_DL" : + (sf_type==SF_UL? "SF_UL" : + (sf_type==SF_S ? "SF_S" : "UNKNOWN_SF_TYPE")))); + } else { + LOG_D(PHY, "%s,%s,%s: calling UE_RX\n", + threadname, + (UE->frame_parms.frame_type==FDD? "FDD": + (UE->frame_parms.frame_type==TDD? "TDD":"UNKNOWN_DUPLEX_MODE")), + (sf_type==SF_DL? "SF_DL" : + (sf_type==SF_UL? "SF_UL" : + (sf_type==SF_S ? "SF_S" : "UNKNOWN_SF_TYPE")))); + } +#ifdef UE_SLOT_PARALLELISATION + phy_procedures_slot_parallelization_UE_RX( UE, proc, 0, 0, 1, UE->mode, no_relay, NULL ); +#else + phy_procedures_UE_RX( UE, proc, 0, 0, 1, UE->mode, no_relay, NULL ); +#endif + } - if (pthread_mutex_lock(&UE->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX\n" ); - exit_fun("noting to add"); - return &UE_thread_rx_retval; +#if UE_TIMING_TRACE + start_meas(&UE->generic_stat); +#endif + if (UE->mac_enabled==1) { + + ret = ue_scheduler(UE->Mod_id, + proc->frame_rx, + proc->subframe_rx, + proc->frame_tx, + proc->subframe_tx, + subframe_select(&UE->frame_parms,proc->subframe_tx), + 0, + 0/*FIXME CC_id*/); + if ( ret != CONNECTION_OK) { + char *txt; + switch (ret) { + case CONNECTION_LOST: + txt="RRC Connection lost, returning to PRACH"; + break; + case PHY_RESYNCH: + txt="RRC Connection lost, trying to resynch"; + break; + case RESYNCH: + txt="return to PRACH and perform a contention-free access"; + break; + default: + txt="UNKNOWN RETURN CODE"; + }; + LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u %s\n", + UE->Mod_id, proc->frame_rx, proc->subframe_tx,txt ); + } + } +#if UE_TIMING_TRACE + stop_meas(&UE->generic_stat); +#endif + + + // Prepare the future Tx data + + if ((subframe_select( &UE->frame_parms, proc->subframe_tx) == SF_UL) || + (UE->frame_parms.frame_type == FDD) ) + if (UE->mode != loop_through_memory) + phy_procedures_UE_TX(UE,proc,0,0,UE->mode,no_relay); + + + + if ((subframe_select( &UE->frame_parms, proc->subframe_tx) == SF_S) && + (UE->frame_parms.frame_type == TDD)) + if (UE->mode != loop_through_memory) + phy_procedures_UE_S_TX(UE,0,0,no_relay); + updateTimes(current, &t3, 10000, "Delay to process sub-frame (case 3)"); + + if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" ); + exit_fun("noting to add"); + } + proc->instance_cnt_rxtx--; + if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RXTX\n" ); + exit_fun("noting to add"); + } } - UE->instance_cnt_rx--; - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, UE->instance_cnt_rx); - - if (pthread_mutex_unlock(&UE->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX\n" ); - exit_fun("noting to add"); - return &UE_thread_rx_retval; - } - } - - // thread finished - return &UE_thread_rx_retval; +// thread finished + free(arg); + return &UE_thread_rxtx_retval; } - - - -#ifndef EXMIMO -#define RX_OFF_MAX 10 -#define RX_OFF_MIN 5 -#define RX_OFF_MID ((RX_OFF_MAX+RX_OFF_MIN)/2) - /*! * \brief This is the main UE thread. * This thread controls the other three UE threads: - * - UE_thread_rx - * - UE_thread_tx + * - UE_thread_rxn_txnp4 (even subframes) + * - UE_thread_rxn_txnp4 (odd subframes) * - UE_thread_synch * \param arg unused * \returns a pointer to an int. The storage is not on the heap and must not be freed. */ -void *UE_thread(void *arg) -{ - UNUSED(arg) - static int UE_thread_retval; - PHY_VARS_UE *UE = PHY_vars_UE_g[0][0]; - int spp = openair0_cfg[0].samples_per_packet; - int slot=1, frame=0, hw_subframe=0, rxpos=0, txpos=openair0_cfg[0].tx_scheduling_advance; -#ifdef __AVX2__ - int dummy[2][spp] __attribute__((aligned(32))); -#else - int dummy[2][spp] __attribute__((aligned(16))); -#endif - int dummy_dump = 0; - int tx_enabled = 0; - int start_rx_stream = 0; - int rx_off_diff = 0; - int rx_correction_timer = 0; - int first_rx = 0; - RTIME T0; - unsigned int rxs; - openair0_timestamp timestamp; +void *UE_thread(void *arg) { + + + PHY_VARS_UE *UE = (PHY_VARS_UE *) arg; + // int tx_enabled = 0; + int dummy_rx[UE->frame_parms.nb_antennas_rx][UE->frame_parms.samples_per_tti] __attribute__((aligned(32))); + openair0_timestamp timestamp,timestamp1; + void* rxp[NB_ANTENNAS_RX], *txp[NB_ANTENNAS_TX]; + int start_rx_stream = 0; + int i; + int th_id; + + static uint8_t thread_idx = 0; + + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + if ( threads.iq != -1 ) + CPU_SET(threads.iq, &cpuset); + init_thread(100000, 500000, FIFO_PRIORITY, &cpuset, + "UHD Threads"); #ifdef NAS_UE - MessageDef *message_p; + MessageDef *message_p; + message_p = itti_alloc_new_message(TASK_NAS_UE, INITIALIZE_MESSAGE); + itti_send_msg_to_task (TASK_NAS_UE, UE->Mod_id + NB_eNB_INST, message_p); #endif -#ifdef RTAI - RT_TASK *task = rt_task_init_schmod(nam2num("UE thread"), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][UE] Problem starting UE thread!!!!\n"); - return 0; - } - -#else - -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0;//sched_get_priority_max(SCHED_DEADLINE); - - // This creates a .5 ms reservation - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = 100000; - attr.sched_deadline = 500000; - attr.sched_period = 500000; - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] main eNB thread: sched_setattr failed\n"); - exit_fun("Nothing to add"); - return &UE_thread_retval; - } - LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %lu started on CPU %d\n", - (unsigned long)gettid(), sched_getcpu()); - -#else - struct sched_param sp; - sp.sched_priority = sched_get_priority_max(SCHED_FIFO); - pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp); -#endif -#endif - - // Lock memory from swapping. This is a process wide call (not constraint to this thread). - mlockall(MCL_CURRENT | MCL_FUTURE); - - printf("waiting for sync (UE_thread)\n"); - pthread_mutex_lock(&sync_mutex); - printf("Locked sync_mutex, waiting (UE_thread)\n"); - - while (sync_var<0) - pthread_cond_wait(&sync_cond, &sync_mutex); - - pthread_mutex_unlock(&sync_mutex); - printf("unlocked sync_mutex, waiting (UE_thread)\n"); - - printf("starting UE thread\n"); - -#ifdef NAS_UE - message_p = itti_alloc_new_message(TASK_NAS_UE, INITIALIZE_MESSAGE); - itti_send_msg_to_task (TASK_NAS_UE, INSTANCE_DEFAULT, message_p); -#endif - - T0 = rt_get_time_ns(); - first_rx = 1; - rxpos=0; - - while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_subframe ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP, dummy_dump ); - - - while (rxpos < (1+hw_subframe)*UE->lte_frame_parms.samples_per_tti) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); - -#ifndef USRP_DEBUG - - DevAssert( UE->lte_frame_parms.nb_antennas_rx <= 2 ); - void* rxp[2]; - - for (int i=0; ilte_frame_parms.nb_antennas_rx; i++) - rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rxpos] : (void*)dummy[i]; - - /* if (dummy_dump == 0) - printf("writing %d samples to %d (first_rx %d)\n",spp - ((first_rx==1) ? rx_off_diff : 0),rxpos,first_rx);*/ - - if (UE->mode != loop_through_memory) { - rxs = openair0.trx_read_func(&openair0, - ×tamp, - rxp, - spp - ((first_rx==1) ? rx_off_diff : 0), - UE->lte_frame_parms.nb_antennas_rx); - - if (rxs != (spp- ((first_rx==1) ? rx_off_diff : 0))) { - printf("rx error: asked %d got %d ",spp - ((first_rx==1) ? rx_off_diff : 0),rxs); - if (UE->is_synchronized == 1) { - exit_fun("problem in rx"); - return &UE_thread_retval; - } - } - } - - if (rx_off_diff !=0) - LOG_D(PHY,"frame %d, rx_offset %d, rx_off_diff %d\n",UE->frame_rx,UE->rx_offset,rx_off_diff); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - - // Transmit TX buffer based on timestamp from RX - if ((tx_enabled==1) && (UE->mode!=loop_through_memory)) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - - DevAssert( UE->lte_frame_parms.nb_antennas_tx <= 2 ); - void* txp[2]; - - for (int i=0; ilte_frame_parms.nb_antennas_tx; i++) - txp[i] = (void*)&txdata[i][txpos]; - - openair0.trx_write_func(&openair0, - (timestamp+openair0_cfg[0].tx_scheduling_advance-openair0_cfg[0].tx_sample_advance), - txp, - spp - ((first_rx==1) ? rx_off_diff : 0), - UE->lte_frame_parms.nb_antennas_tx, - 1); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); - } - else if (UE->mode == loop_through_memory) - rt_sleep_ns(1000000); -#else - // define USRP_DEBUG is active - rt_sleep_ns(1000000); -#endif - - rx_off_diff = 0; - first_rx = 0; - - rxpos += spp; - txpos += spp; - - if (txpos >= 10*PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti) - txpos -= 10*PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti; - } - - if (rxpos >= 10*PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti) - rxpos -= 10*PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti; - - if (UE->is_synchronized == 1) { - LOG_D( HW, "UE_thread: hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); - - if (start_rx_stream == 1) { - LOG_D(PHY,"Locking mutex_rx (IC %d)\n",UE->instance_cnt_rx); - if (pthread_mutex_lock(&UE->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - - int instance_cnt_rx = ++UE->instance_cnt_rx; - - LOG_D(PHY,"Unlocking mutex_rx (IC %d)\n",instance_cnt_rx); - if (pthread_mutex_unlock(&UE->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, instance_cnt_rx); - - - if (instance_cnt_rx == 0) { - LOG_D(HW,"signalling rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); - if (pthread_cond_signal(&UE->cond_rx) != 0) { - LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - - LOG_D(HW,"signalled rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); - if (UE->mode == loop_through_memory) { - printf("Processing subframe %d",UE->slot_rx>>1); - getchar(); - } - - if (UE->mode == rx_calib_ue) { - if (frame == 10) { - LOG_D(PHY, - "[SCHED][UE] Found cell with N_RB_DL %"PRIu8", PHICH CONFIG (%d,%d), Nid_cell %"PRIu16", NB_ANTENNAS_TX %"PRIu8", frequency offset "PRIi32" Hz, RSSI (digital) %hu dB, measured Gain %d dB, total_rx_gain %"PRIu32" dB, USRP rx gain %f dB\n", - UE->lte_frame_parms.N_RB_DL, - UE->lte_frame_parms.phich_config_common.phich_duration, - UE->lte_frame_parms.phich_config_common.phich_resource, - UE->lte_frame_parms.Nid_cell, - UE->lte_frame_parms.nb_antennas_tx_eNB, - UE->lte_ue_common_vars.freq_offset, - UE->PHY_measurements.rx_power_avg_dB[0], - UE->PHY_measurements.rx_power_avg_dB[0] - rx_input_level_dBm, - UE->rx_total_gain_dB, - openair0_cfg[0].rx_gain[0] - ); - exit_fun("[HW][UE] UE in RX calibration mode, exiting"); - return &UE_thread_retval; - } - } - } else { - LOG_E( PHY, "[SCHED][UE] UE RX thread busy (IC %d)!!\n", instance_cnt_rx); - if (instance_cnt_rx > 2) { - exit_fun("instance_cnt_rx > 1"); - return &UE_thread_retval; - } - } - - - if ((tx_enabled==1)&&(UE->mode != loop_through_memory)) { - - if (pthread_mutex_lock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - - - int instance_cnt_tx = ++UE->instance_cnt_tx; - - if (pthread_mutex_unlock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE TX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, instance_cnt_tx); - - - if (instance_cnt_tx == 0) { - if (pthread_cond_signal(&UE->cond_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE TX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - LOG_D(HW,"signalled tx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); - - } else { - LOG_E( PHY, "[SCHED][UE] UE TX thread busy (IC %d)!!\n" ); - if (instance_cnt_tx>2) { - exit_fun("instance_cnt_tx > 1"); - return &UE_thread_retval; - } - } - } - - } - } else { - // we are not yet synchronized - if ((hw_subframe == 9) && (dummy_dump == 0)) { - // Wake up initial synch thread - if (pthread_mutex_lock(&UE->mutex_synch) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE initial synch thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - - int instance_cnt_synch = ++UE->instance_cnt_synch; - - if (pthread_mutex_unlock(&UE->mutex_synch) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE initial synch thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - - dummy_dump = 1; - - if (instance_cnt_synch == 0) { - if (pthread_cond_signal(&UE->cond_synch) != 0) { - LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - } else { - LOG_E( PHY, "[SCHED][UE] UE sync thread busy!!\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - } - } - - hw_subframe++; - slot+=2; - - if (hw_subframe==10) { - hw_subframe = 0; - first_rx = 1; - frame++; - slot = 1; - - int fail = pthread_mutex_lock(&UE->mutex_synch); - int instance_cnt_synch = UE->instance_cnt_synch; - fail = fail || pthread_mutex_unlock(&UE->mutex_synch); - - if (fail) { - LOG_E( PHY, "[SCHED][UE] error (un-)locking mutex for UE synch\n" ); - exit_fun("noting to add"); - return &UE_thread_retval; - } - - if (instance_cnt_synch < 0) { - // the UE_thread_synch is ready - if (UE->is_synchronized == 1) { - rx_off_diff = 0; - LTE_DL_FRAME_PARMS *frame_parms = &UE->lte_frame_parms; // for macro FRAME_LENGTH_COMPLEX_SAMPLES - - // LOG_I(PHY,"UE->rx_offset %d\n",UE->rx_offset); - if ((UE->rx_offset > RX_OFF_MAX) && (start_rx_stream == 0)) { - start_rx_stream=1; - frame=0; - // dump ahead in time to start of frame - -#ifndef USRP_DEBUG - if (UE->mode != loop_through_memory) { - LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset); - rxs = openair0.trx_read_func(&openair0, - ×tamp, - (void**)rxdata, - UE->rx_offset, - UE->lte_frame_parms.nb_antennas_rx); - if (rxs != UE->rx_offset) { - exit_fun("problem in rx"); - return &UE_thread_retval; - } - UE->rx_offset=0; - tx_enabled = 1; - } - else - rt_sleep_ns(1000000); -#else - rt_sleep_ns(10000000); -#endif - - } else if ((UE->rx_offset<(FRAME_LENGTH_COMPLEX_SAMPLES/2)) && - (UE->rx_offset > RX_OFF_MIN) && - (start_rx_stream==1) && - (rx_correction_timer == 0)) { - rx_off_diff = -UE->rx_offset + RX_OFF_MIN; - LOG_D(PHY,"UE->rx_offset %d > %d, diff %d\n",UE->rx_offset,RX_OFF_MIN,rx_off_diff); - rx_correction_timer = 5; - } else if ((UE->rx_offset>(FRAME_LENGTH_COMPLEX_SAMPLES/2)) && - (UE->rx_offset < (FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN)) && - (start_rx_stream==1) && - (rx_correction_timer == 0)) { // moving to the left so drop rx_off_diff samples - rx_off_diff = FRAME_LENGTH_COMPLEX_SAMPLES - RX_OFF_MIN - UE->rx_offset; - LOG_D(PHY,"UE->rx_offset %d < %d, diff %d\n",UE->rx_offset,FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN,rx_off_diff); - - rx_correction_timer = 5; - } - - if (rx_correction_timer>0) - rx_correction_timer--; - } - - dummy_dump=0; - } - } - -#if defined(ENABLE_ITTI) - itti_update_lte_time(frame, slot); -#endif - } - - return &UE_thread_retval; -} -#endif - - - -#ifdef EXMIMO -/* This is the main UE thread. Initially it is doing a periodic get_frame. One synchronized it gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */ -void *UE_thread(void *arg) -{ - PHY_VARS_UE *UE=PHY_vars_UE_g[0][0]; -#ifdef RTAI - RT_TASK *task; -#endif - // RTIME in, out, diff; - int slot=0,frame=0,hw_slot; - // unsigned int aa; - int delay_cnt; - RTIME time_in; - int /* hw_slot_offset=0, */ rx_offset_mbox=0,mbox_target=0,mbox_current=0; - int diff2; - int /* i, */ ret; - int /* CC_id, */ card; - volatile unsigned int *DAQ_MBOX = openair0_daq_cnt(); - - int wait_sync_cnt = 0; - int first_synch = 1; -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - // unsigned long mask = 1; // processor 0 -#endif - int freq_offset; - - -#ifdef RTAI - task = rt_task_init_schmod(nam2num("UE thread"), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][UE] Problem starting UE thread!!!!\n"); - return 0; - } - -#endif - - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - -#ifdef DEADLINE_SCHEDULER - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - // This creates a .25 ms reservation - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = (0.1 * 100) * 10000; - attr.sched_deadline = (0.25 * 100) * 10000; - attr.sched_period = (0.5 * 100) * 10000; - - // pin the UE main thread to CPU0 - // if (pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask) <0) { - // perror("[MAIN_ENB_THREAD] pthread_setaffinity_np failed\n"); - // } - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] main UE thread: sched_setattr failed\n"); - exit_fun("Nothing to add"); - } else { - LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n", - gettid(),sched_getcpu()); - } - -#endif - - - mlockall(MCL_CURRENT | MCL_FUTURE); - - printf("waiting for sync (UE_thread)\n"); - - pthread_mutex_lock(&sync_mutex); - printf("Locked sync_mutex, waiting (UE_thread)\n"); - - while (sync_var<0) - pthread_cond_wait(&sync_cond, &sync_mutex); - - pthread_mutex_unlock(&sync_mutex); - printf("unlocked sync_mutex, waiting (UE_thread)\n"); - - printf("starting UE thread\n"); - - freq_offset = 0; //-7500; - - first_synch = 1; - - while (!oai_exit) { - - hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; //the slot the hw is about to store - - - if (UE->is_synchronized) { - - if (first_synch == 1) { - first_synch = 0; - - for (card=0; cardrx_offset * 150) / (10*UE->lte_frame_parms.samples_per_tti); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_RX_OFFSET, UE->rx_offset); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_OFFSET_MBOX, rx_offset_mbox); - //this is the mbox counter where we should be - mbox_target = (((((slot+1)%20)*15+1)>>1) + rx_offset_mbox + 1)%150; - // round up to the next multiple of two (mbox counter from express MIMO gives only even numbers) - mbox_target = ((mbox_target+1)-((mbox_target-1)%2))%150; - //this is the mbox counter where we are - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD) - if ((mbox_current>=120) && (mbox_target<30)) //handle the frame wrap-arround - diff2 = 150-mbox_current+mbox_target; - else if ((mbox_current<30) && (mbox_target>=120)) - diff2 = -150+mbox_target-mbox_current; - else - diff2 = mbox_target - mbox_current; - - if (diff2 <(-7)) { - LOG_D(HW,"UE Frame %d: missed slot, proceeding with next one (slot %d, hw_slot %d, diff %d)\n",frame, slot, hw_slot, diff2); - - if (frame>0) { - if (exit_missed_slots==1) - exit_fun("[HW][UE] missed slot"); - else { - num_missed_slots++; - LOG_W(HW,"[UE] just missed slot (total missed slots %ld)\n", num_missed_slots); - } - } - - slot++; - - if (slot==20) { - slot=0; - frame++; - } - - // update thread slot/frame counters because of skipped slot - UE->slot_rx++; - UE->slot_tx++; - - if (UE->slot_rx == 20) { - UE->slot_rx = 0; - UE->frame_rx++; - } - - if (UE->slot_tx == 20) { - UE->slot_tx = 0; - UE->frame_tx++; - } - - continue; - } - - if (diff2>8) - LOG_D(HW,"UE Frame %d: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, slot, hw_slot, mbox_current, mbox_target, diff2); - - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2); - - - - // This loop implements the delay of 1 slot to allow for processing - delay_cnt = 0; - - while ((diff2>0) && (!oai_exit) ) { - time_in = rt_get_time_ns(); - //LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d (%d), diff %d, time %llu\n",frame,delay_cnt,hw_slot,((volatile unsigned int *)DAQ_MBOX)[0],slot,mbox_target,diff2,time_in); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1); - ret = rt_sleep_ns(diff2*DAQ_PERIOD); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - - if (ret) - LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in); - - hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - //LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns()); - delay_cnt++; - - if (delay_cnt == 30) { - LOG_D(HW,"UE frame %d: HW stopped ... \n",frame); - exit_fun("[HW][UE] HW stopped"); - } - - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff2 = 150-mbox_current+mbox_target; - else if ((mbox_current<15) && (mbox_target>=135)) - diff2 = -150+mbox_target-mbox_current; - else - diff2 = mbox_target - mbox_current; - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2); - } - - // on even slots, schedule processing of entire subframe - if ((slot&1) == 0) { - - if (pthread_mutex_lock(&UE->mutex_rx) != 0) { - LOG_E(PHY,"[SCHED][UE] error locking mutex for UE RX thread\n"); - exit_fun("nothing to add"); - } else { - - int instance_cnt_rx = ++UE->instance_cnt_rx; - - pthread_mutex_unlock(&UE->mutex_rx); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, instance_cnt_rx); - - - if (instance_cnt_rx == 0) { - LOG_D(HW,"Scheduling UE RX for frame %d (hw frame %d), subframe %d (%d), mode %d\n",UE->frame_rx,frame,slot>>1,UE->slot_rx>>1,UE->mode); - - if (pthread_cond_signal(&UE->cond_rx) != 0) { - LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n"); - exit_fun("nothing to add"); + int sub_frame=-1; + //int cumulated_shift=0; + + + while (!oai_exit) { + AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synch), ""); + int instance_cnt_synch = UE->proc.instance_cnt_synch; + int is_synchronized = UE->is_synchronized; + AssertFatal ( 0== pthread_mutex_unlock(&UE->proc.mutex_synch), ""); + + if (is_synchronized == 0) { + if (instance_cnt_synch < 0) { // we can invoke the synch + // grab 10 ms of signal and wakeup synch thread + for (int i=0; iframe_parms.nb_antennas_rx; i++) + rxp[i] = (void*)&UE->common_vars.rxdata[i][0]; + + if (UE->mode != loop_through_memory) + AssertFatal( UE->frame_parms.samples_per_tti*10 == + UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti*10, + UE->frame_parms.nb_antennas_rx), ""); + AssertFatal ( 0== pthread_mutex_lock(&UE->proc.mutex_synch), ""); + instance_cnt_synch = ++UE->proc.instance_cnt_synch; + if (instance_cnt_synch == 0) { + AssertFatal( 0 == pthread_cond_signal(&UE->proc.cond_synch), ""); + } else { + LOG_E( PHY, "[SCHED][UE] UE sync thread busy!!\n" ); + exit_fun("nothing to add"); + } + AssertFatal ( 0== pthread_mutex_unlock(&UE->proc.mutex_synch), ""); } else { - // printf("UE_thread: cond_signal for RX ok (%p) @ %llu\n",(void*)&UE->cond_rx,rt_get_time_ns()-T0); +#if OAISIM + (void)dummy_rx; /* avoid gcc warnings */ + usleep(500); +#else + // grab 10 ms of signal into dummy buffer + if (UE->mode != loop_through_memory) { + for (int i=0; iframe_parms.nb_antennas_rx; i++) + rxp[i] = (void*)&dummy_rx[i][0]; + for (int sf=0; sf<10; sf++) + // printf("Reading dummy sf %d\n",sf); + UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + rxp, + UE->frame_parms.samples_per_tti, + UE->frame_parms.nb_antennas_rx); + } +#endif } - if (UE->mode == rx_calib_ue) { - if (frame == 10) { - LOG_D(PHY, - "[SCHED][UE] Found cell with N_RB_DL %d, PHICH CONFIG (%d,%d), Nid_cell %d, NB_ANTENNAS_TX %d, initial frequency offset %d Hz, frequency offset %d Hz, RSSI (digital) %d dB, measured Gain %d dB, total_rx_gain %d dB, USRP rx gain %f dB\n", - UE->lte_frame_parms.N_RB_DL, - UE->lte_frame_parms.phich_config_common.phich_duration, - UE->lte_frame_parms.phich_config_common.phich_resource, - UE->lte_frame_parms.Nid_cell, - UE->lte_frame_parms.nb_antennas_tx_eNB, - freq_offset, - UE->lte_ue_common_vars.freq_offset, - UE->PHY_measurements.rx_power_avg_dB[0], - UE->PHY_measurements.rx_power_avg_dB[0] - rx_input_level_dBm, - UE->rx_total_gain_dB, - openair0_cfg[0].rx_gain[0] - ); - exit_fun("[HW][UE] UE in RX calibration mode, exiting"); - } - } - } else { - LOG_E(PHY,"[SCHED][UE] UE RX thread busy!!\n"); - exit_fun("nothing to add"); - } - } + } // UE->is_synchronized==0 + else { + if (start_rx_stream==0) { + start_rx_stream=1; + if (UE->mode != loop_through_memory) { + if (UE->no_timing_correction==0) { + LOG_I(PHY,"Resynchronizing RX by %d samples (mode = %d)\n",UE->rx_offset,UE->mode); + AssertFatal(UE->rx_offset == + UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + (void**)UE->common_vars.rxdata, + UE->rx_offset, + UE->frame_parms.nb_antennas_rx),""); + } + UE->rx_offset=0; + UE->time_sync_cell=0; + //UE->proc.proc_rxtx[0].frame_rx++; + //UE->proc.proc_rxtx[1].frame_rx++; + for (th_id=0; th_id < RX_NB_TH; th_id++) { + UE->proc.proc_rxtx[th_id].frame_rx++; + } - if (pthread_mutex_lock(&UE->mutex_tx) != 0) { - LOG_E(PHY,"[SCHED][UE] error locking mutex for UE TX thread\n"); - exit_fun("nothing to add"); - } else { + // read in first symbol + AssertFatal (UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0 == + UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + (void**)UE->common_vars.rxdata, + UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, + UE->frame_parms.nb_antennas_rx),""); + slot_fep(UE,0, 0, 0, 0, 0); + } //UE->mode != loop_through_memory + else + rt_sleep_ns(1000*1000); - int instance_cnt_tx = ++UE->instance_cnt_tx; - - pthread_mutex_unlock(&UE->mutex_tx); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, instance_cnt_tx); - - if (instance_cnt_tx == 0) { - LOG_D(HW,"Scheduling UE TX for frame %d (hw frame %d), subframe %d (%d), mode %d\n",UE->frame_tx,frame,slot>>1,UE->slot_tx>>1,UE->mode); - - if (pthread_cond_signal(&UE->cond_tx) != 0) { - LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE TX thread\n"); - exit_fun("nothing to add"); } else { - // printf("UE_thread: cond_signal for RX ok (%p) @ %llu\n",(void*)&UE->cond_rx,rt_get_time_ns()-T0); - } - } else { - LOG_E(PHY,"[SCHED][UE] UE TX thread busy!!\n"); - exit_fun("nothing to add"); - } - } - } + sub_frame++; + sub_frame%=10; + UE_rxtx_proc_t *proc = &UE->proc.proc_rxtx[thread_idx]; + // update thread index for received subframe + UE->current_thread_id[sub_frame] = thread_idx; - /* - if ((slot%2000)<10) - LOG_D(HW,"fun0: doing very hard work\n"); - */ - // now increment slot and frame counters - slot++; + LOG_D(PHY,"Process Subframe %d thread Idx %d \n", sub_frame, UE->current_thread_id[sub_frame]); - if (slot==20) { - slot=0; - frame++; - } - } else if (UE->is_synchronized == 0) { // we are not yet synchronized - //hw_slot_offset = 0; - first_synch = 1; - slot = 0; + thread_idx++; + if(thread_idx>=RX_NB_TH) + thread_idx = 0; - // wait until we can lock mutex_synch - //printf("Locking mutex_synch (UE_thread)\n"); - if (pthread_mutex_lock(&UE->mutex_synch) != 0) { - LOG_E(PHY,"[SCHED][UE] error locking mutex for UE initial synch thread\n"); - exit_fun("noting to add"); - } else { + if (UE->mode != loop_through_memory) { + for (i=0; iframe_parms.nb_antennas_rx; i++) + rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.ofdm_symbol_size+ + UE->frame_parms.nb_prefix_samples0+ + sub_frame*UE->frame_parms.samples_per_tti]; + for (i=0; iframe_parms.nb_antennas_tx; i++) + txp[i] = (void*)&UE->common_vars.txdata[i][((sub_frame+2)%10)*UE->frame_parms.samples_per_tti]; - if (UE->instance_cnt_synch < 0) { + int readBlockSize, writeBlockSize; + if (sub_frame<9) { + readBlockSize=UE->frame_parms.samples_per_tti; + writeBlockSize=UE->frame_parms.samples_per_tti; + } else { + // set TO compensation to zero + UE->rx_offset_diff = 0; + // compute TO compensation that should be applied for this frame + if ( UE->rx_offset < 5*UE->frame_parms.samples_per_tti && + UE->rx_offset > 0 ) + UE->rx_offset_diff = -1 ; + if ( UE->rx_offset > 5*UE->frame_parms.samples_per_tti && + UE->rx_offset < 10*UE->frame_parms.samples_per_tti ) + UE->rx_offset_diff = 1; - wait_sync_cnt=0; - openair0_config(&openair0_cfg[0],1); - // openair0_set_gains(&openair0,&openair0_cfg[0]); + LOG_D(PHY,"AbsSubframe %d.%d SET rx_off_diff to %d rx_offset %d \n",proc->frame_rx,sub_frame,UE->rx_offset_diff,UE->rx_offset); + readBlockSize=UE->frame_parms.samples_per_tti - + UE->frame_parms.ofdm_symbol_size - + UE->frame_parms.nb_prefix_samples0 - + UE->rx_offset_diff; + writeBlockSize=UE->frame_parms.samples_per_tti - + UE->rx_offset_diff; + } - printf("Getting frame\n"); - openair0_get_frame(0); - rt_sleep_ns(FRAME_PERIOD); - // increment instance count for sync thread - UE->instance_cnt_synch++; - pthread_mutex_unlock(&UE->mutex_synch); + AssertFatal(readBlockSize == + UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + rxp, + readBlockSize, + UE->frame_parms.nb_antennas_rx),""); + AssertFatal( writeBlockSize == + UE->rfdevice.trx_write_func(&UE->rfdevice, + timestamp+ + (2*UE->frame_parms.samples_per_tti) - + UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0 - + openair0_cfg[0].tx_sample_advance, + txp, + writeBlockSize, + UE->frame_parms.nb_antennas_tx, + 1),""); + if( sub_frame==9) { + // read in first symbol of next frame and adjust for timing drift + int first_symbols=writeBlockSize-readBlockSize; + if ( first_symbols > 0 ) + AssertFatal(first_symbols == + UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp1, + (void**)UE->common_vars.rxdata, + first_symbols, + UE->frame_parms.nb_antennas_rx),""); + if ( first_symbols <0 ) + LOG_E(PHY,"can't compensate: diff =%d\n", first_symbols); + } + pickTime(gotIQs); + // operate on thread sf mod 2 + AssertFatal(pthread_mutex_lock(&proc->mutex_rxtx) ==0,""); + if(sub_frame == 0) { + //UE->proc.proc_rxtx[0].frame_rx++; + //UE->proc.proc_rxtx[1].frame_rx++; + for (th_id=0; th_id < RX_NB_TH; th_id++) { + UE->proc.proc_rxtx[th_id].frame_rx++; + } + } + //UE->proc.proc_rxtx[0].gotIQs=readTime(gotIQs); + //UE->proc.proc_rxtx[1].gotIQs=readTime(gotIQs); + for (th_id=0; th_id < RX_NB_TH; th_id++) { + UE->proc.proc_rxtx[th_id].gotIQs=readTime(gotIQs); + } + proc->subframe_rx=sub_frame; + proc->subframe_tx=(sub_frame+4)%10; + proc->frame_tx = proc->frame_rx + (proc->subframe_rx>5?1:0); + proc->timestamp_tx = timestamp+ + (4*UE->frame_parms.samples_per_tti)- + UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0; - if (pthread_cond_signal(&UE->cond_synch) != 0) { - LOG_E(PHY,"[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n"); - exit_fun("nothing to add"); - } - } else { - wait_sync_cnt++; - pthread_mutex_unlock(&UE->mutex_synch); + proc->instance_cnt_rxtx++; + LOG_D( PHY, "[SCHED][UE %d] UE RX instance_cnt_rxtx %d subframe %d !!\n", UE->Mod_id, proc->instance_cnt_rxtx,proc->subframe_rx); + if (proc->instance_cnt_rxtx == 0) { + if (pthread_cond_signal(&proc->cond_rxtx) != 0) { + LOG_E( PHY, "[SCHED][UE %d] ERROR pthread_cond_signal for UE RX thread\n", UE->Mod_id); + exit_fun("nothing to add"); + } + } else { + LOG_E( PHY, "[SCHED][UE %d] UE RX thread busy (IC %d)!!\n", UE->Mod_id, proc->instance_cnt_rxtx); + if (proc->instance_cnt_rxtx > 2) + exit_fun("instance_cnt_rxtx > 2"); + } - if (wait_sync_cnt>1000) - exit_fun("waiting to long for synch thread"); - else - rt_sleep_ns(FRAME_PERIOD); - } - } + AssertFatal (pthread_cond_signal(&proc->cond_rxtx) ==0 ,""); + AssertFatal(pthread_mutex_unlock(&proc->mutex_rxtx) ==0,""); + initRefTimes(t1); + initStaticTime(lastTime); + updateTimes(lastTime, &t1, 20000, "Delay between two IQ acquisitions (case 1)"); + pickStaticTime(lastTime); + } else { + printf("Processing subframe %d",proc->subframe_rx); + getchar(); + } + } // start_rx_stream==1 + } // UE->is_synchronized==1 - /* - if (initial_sync(UE,mode)==0) { - - if (mode == rx_calib_ue) { - exit_fun("[HW][UE] UE in RX calibration mode"); - } - else { - is_synchronized = 1; - //start the streaming DMA transfers - for (card=0;cardrx_offset<<1) / UE->lte_frame_parms.samples_per_tti; - } - } - else { - if (freq_offset >= 0) { - freq_offset += 100; - freq_offset *= -1; - } - else { - freq_offset *= -1; - } - if (abs(freq_offset) > 7500) { - LOG_I(PHY,"[initial_sync] No cell synchronization found, abondoning\n"); - mac_xface->macphy_exit("No cell synchronization found, abondoning"); - } - else { - // LOG_I(PHY,"[initial_sync] trying carrier off %d Hz\n",freq_offset); - #ifndef USRP - for (CC_id=0;CC_idinstance_cnt_tx = -1; - UE->instance_cnt_rx = -1; - UE->instance_cnt_synch = -1; - pthread_mutex_init(&UE->mutex_tx,NULL); - pthread_mutex_init(&UE->mutex_rx,NULL); - pthread_mutex_init(&UE->mutex_synch,NULL); - pthread_cond_init(&UE->cond_tx,NULL); - pthread_cond_init(&UE->cond_rx,NULL); - pthread_cond_init(&UE->cond_synch,NULL); - pthread_create(&UE->thread_tx,NULL,UE_thread_tx,(void*)UE); - pthread_setname_np( UE->thread_tx, "UE_thread_tx" ); - pthread_create(&UE->thread_rx,NULL,UE_thread_rx,(void*)UE); - pthread_setname_np( UE->thread_rx, "UE_thread_rx" ); - pthread_create(&UE->thread_synch,NULL,UE_thread_synch,(void*)UE); - pthread_setname_np( UE->thread_synch, "UE_thread_synch" ); - UE->frame_tx = 0; - UE->frame_rx = 0; + AssertFatal(PHY_vars_UE_g!=NULL,"PHY_vars_UE_g is NULL\n"); + AssertFatal(PHY_vars_UE_g[inst]!=NULL,"PHY_vars_UE_g[inst] is NULL\n"); + AssertFatal(PHY_vars_UE_g[inst][0]!=NULL,"PHY_vars_UE_g[inst][0] is NULL\n"); + UE = PHY_vars_UE_g[inst][0]; + + pthread_attr_init (&UE->proc.attr_ue); + pthread_attr_setstacksize(&UE->proc.attr_ue,8192);//5*PTHREAD_STACK_MIN); + + pthread_mutex_init(&UE->proc.mutex_synch,NULL); + pthread_cond_init(&UE->proc.cond_synch,NULL); + + // the threads are not yet active, therefore access is allowed without locking + int nb_threads=RX_NB_TH; + for (int i=0; iUE = UE; + rtd->proc = &UE->proc.proc_rxtx[i]; + + pthread_mutex_init(&UE->proc.proc_rxtx[i].mutex_rxtx,NULL); + pthread_cond_init(&UE->proc.proc_rxtx[i].cond_rxtx,NULL); + UE->proc.proc_rxtx[i].sub_frame_start=i; + UE->proc.proc_rxtx[i].sub_frame_step=nb_threads; + printf("Init_UE_threads rtd %d proc %d nb_threads %d i %d\n",rtd->proc->sub_frame_start, UE->proc.proc_rxtx[i].sub_frame_start,nb_threads, i); + pthread_create(&UE->proc.proc_rxtx[i].pthread_rxtx, NULL, UE_thread_rxn_txnp4, rtd); + +#ifdef UE_SLOT_PARALLELISATION + //pthread_mutex_init(&UE->proc.proc_rxtx[i].mutex_slot0_dl_processing,NULL); + //pthread_cond_init(&UE->proc.proc_rxtx[i].cond_slot0_dl_processing,NULL); + //pthread_create(&UE->proc.proc_rxtx[i].pthread_slot0_dl_processing,NULL,UE_thread_slot0_dl_processing, rtd); + + pthread_mutex_init(&UE->proc.proc_rxtx[i].mutex_slot1_dl_processing,NULL); + pthread_cond_init(&UE->proc.proc_rxtx[i].cond_slot1_dl_processing,NULL); + pthread_create(&UE->proc.proc_rxtx[i].pthread_slot1_dl_processing,NULL,UE_thread_slot1_dl_processing, rtd); +#endif + + } + pthread_create(&UE->proc.pthread_synch,NULL,UE_thread_synch,(void*)UE); } #ifdef OPENAIR2 -void fill_ue_band_info(void) -{ +void fill_ue_band_info(void) { - UE_EUTRA_Capability_t *UE_EUTRA_Capability = UE_rrc_inst[0].UECap->UE_EUTRA_Capability; - int i,j; + UE_EUTRA_Capability_t *UE_EUTRA_Capability = UE_rrc_inst[0].UECap->UE_EUTRA_Capability; + int i,j; - bands_to_scan.nbands = UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list.count; + bands_to_scan.nbands = UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list.count; - for (i=0; irf_Parameters.supportedBandListEUTRA.list.array[i]->bandEUTRA) { - memcpy(&bands_to_scan.band_info[i], - &eutra_bands[j], - sizeof(eutra_band_t)); + for (j=0; jrf_Parameters.supportedBandListEUTRA.list.array[i]->bandEUTRA) { + memcpy(&bands_to_scan.band_info[i], + &eutra_bands[j], + sizeof(eutra_band_t)); - printf("Band %d (%lu) : DL %u..%u Hz, UL %u..%u Hz, Duplex %s \n", - bands_to_scan.band_info[i].band, - UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list.array[i]->bandEUTRA, - bands_to_scan.band_info[i].dl_min, - bands_to_scan.band_info[i].dl_max, - bands_to_scan.band_info[i].ul_min, - bands_to_scan.band_info[i].ul_max, - (bands_to_scan.band_info[i].frame_type==FDD) ? "FDD" : "TDD"); - break; - } - } + printf("Band %d (%lu) : DL %u..%u Hz, UL %u..%u Hz, Duplex %s \n", + bands_to_scan.band_info[i].band, + UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list.array[i]->bandEUTRA, + bands_to_scan.band_info[i].dl_min, + bands_to_scan.band_info[i].dl_max, + bands_to_scan.band_info[i].ul_min, + bands_to_scan.band_info[i].ul_max, + (bands_to_scan.band_info[i].frame_type==FDD) ? "FDD" : "TDD"); + break; + } + } } #endif -int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]) -{ +int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg) { - //#ifndef EXMIMO - // uint16_t N_TA_offset = 0; - //#endif + int i, CC_id; + LTE_DL_FRAME_PARMS *frame_parms; + openair0_rf_map *rf_map; - int i, CC_id; - LTE_DL_FRAME_PARMS *frame_parms; - - for (CC_id=0; CC_idlte_frame_parms); - } else { - printf("phy_vars_UE[%d] not initialized\n", CC_id); - return(-1); - } - - - //#ifndef EXMIMO - // if (frame_parms->frame_type == TDD) { - // if (frame_parms->N_RB_DL == 100) - // N_TA_offset = 624; - // else if (frame_parms->N_RB_DL == 50) - // N_TA_offset = 624/2; - // else if (frame_parms->N_RB_DL == 25) - // N_TA_offset = 624/4; - // } - //#endif - -#ifdef EXMIMO - openair0_cfg[CC_id].tx_num_channels = 0; - openair0_cfg[CC_id].rx_num_channels = 0; - - // replace RX signal buffers with mmaped HW versions - for (i=0; inb_antennas_rx; i++) { - printf("Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i]); - phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].adc_head[rf_map[CC_id].chain+i]; - - if (openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i]) { - printf("Error with rf_map! A channel has already been allocated!\n"); - return(-1); - } else { - openair0_cfg[rf_map[CC_id].card].rx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rx_gain[rf_map[CC_id].chain+i] = rx_gain[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rxg_mode[rf_map[CC_id].chain+i] = rx_gain_mode[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].rx_num_channels++; + for (CC_id=0; CC_idrf_map; + + AssertFatal( phy_vars_ue[CC_id] !=0, ""); + frame_parms = &(phy_vars_ue[CC_id]->frame_parms); + + // replace RX signal buffers with mmaped HW versions + rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); + txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); + + for (i=0; inb_antennas_rx; i++) { + LOG_I(PHY, "Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n", + CC_id, i, downlink_frequency[CC_id][i], rf_map->card, rf_map->chain+i ); + free( phy_vars_ue[CC_id]->common_vars.rxdata[i] ); + rxdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); + phy_vars_ue[CC_id]->common_vars.rxdata[i] = rxdata[i]; // what about the "-N_TA_offset" ? // N_TA offset for TDD } - - printf("rxdata[%d] @ %p\n",i,phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i]); - } - - for (i=0; inb_antennas_tx; i++) { - printf("Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n",CC_id,i,downlink_frequency[CC_id][i],rf_map[CC_id].card,rf_map[CC_id].chain+i); - free(phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i]); - phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] = (int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i]; - - if (openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i]) { - printf("Error with rf_map! A channel has already been allocated!\n"); - return(-1); - } else { - openair0_cfg[rf_map[CC_id].card].tx_freq[rf_map[CC_id].chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].tx_gain[rf_map[CC_id].chain+i] = tx_gain[CC_id][i]; - openair0_cfg[rf_map[CC_id].card].tx_num_channels++; + + for (i=0; inb_antennas_tx; i++) { + LOG_I(PHY, "Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n", + CC_id, i, downlink_frequency[CC_id][i], rf_map->card, rf_map->chain+i ); + free( phy_vars_ue[CC_id]->common_vars.txdata[i] ); + txdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); + phy_vars_ue[CC_id]->common_vars.txdata[i] = txdata[i]; } - - printf("txdata[%d] @ %p\n",i,phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i]); + + // rxdata[x] points now to the same memory region as phy_vars_ue[CC_id]->common_vars.rxdata[x] + // txdata[x] points now to the same memory region as phy_vars_ue[CC_id]->common_vars.txdata[x] + // be careful when releasing memory! + // because no "release_ue_buffers"-function is available, at least rxdata and txdata memory will leak (only some bytes) } - -#else - // replace RX signal buffers with mmaped HW versions - rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) ); - txdata = (int32_t**)malloc16( frame_parms->nb_antennas_tx*sizeof(int32_t*) ); - - for (i=0; inb_antennas_rx; i++) { - printf( "Mapping UE CC_id %d, rx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i ); - free( phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] ); - rxdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); - phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[i] = rxdata[i]; // what about the "-N_TA_offset" ? // N_TA offset for TDD - } - - for (i=0; inb_antennas_tx; i++) { - printf( "Mapping UE CC_id %d, tx_ant %d, freq %u on card %d, chain %d\n", CC_id, i, downlink_frequency[CC_id][i], rf_map[CC_id].card, rf_map[CC_id].chain+i ); - free( phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] ); - txdata[i] = (int32_t*)malloc16_clear( 307200*sizeof(int32_t) ); - phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[i] = txdata[i]; - } - - // rxdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.rxdata[x] - // txdata[x] points now to the same memory region as phy_vars_ue[CC_id]->lte_ue_common_vars.txdata[x] - // be careful when releasing memory! - // because no "release_ue_buffers"-function is available, at least rxdata and txdata memory will leak (only some bytes) -#endif - - } - - return 0; + return 0; } + diff --git a/targets/RT/USER/make_for_usrp.sh b/targets/RT/USER/make_for_usrp.sh deleted file mode 100755 index 998cd7c462..0000000000 --- a/targets/RT/USER/make_for_usrp.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -############### make nasmesh.ko ############### -sudo rmmod nasmesh -#cd ${OPENAIR2_DIR} && make nasmesh_netlink.ko -#cd ${OPENAIR2_DIR}/NAS/DRIVER/MESH/RB_TOOL/ && make -#make all -sudo insmod $OPENAIR2_DIR/NAS/DRIVER/MESH/nasmesh.ko - -############## Ethernet config #################### -sudo ifconfig eth0 mtu 4000 -sudo sysctl -w net.core.wmem_max=1048576 -sudo sysctl -w net.core.rmem_max=50000000 - -############## rtai modules ################### -if test \! -c /dev/rtai_shm; then - sudo mknod -m 666 /dev/rtai_shm c 10 254 -fi -for n in `seq 0 9`; do - f=/dev/rtf$n - if test \! -c $f; then - sudo mknod -m 666 $f c 150 $n - fi -done -sudo modprobe rtai_hal -sudo modprobe rtai_sched -sudo modprobe rtai_fifos -sudo modprobe rtai_sem -sudo modprobe rtai_mbx -sudo modprobe rtai_msg - -############## make ################### -make lte-softmodem-usrp NAS=1 USRP=1 XFORMS=1 RTAI=1 HARD_RT=1 #DRIVER2013=1 -#make lte-softmodem NAS=1 XFORMS=1 USRP=0 RTAI=1 DRIVER2013=1 -echo DONE! -exit 0 diff --git a/targets/RT/USER/msg_helper.c b/targets/RT/USER/msg_helper.c deleted file mode 100644 index fcba4ce6a1..0000000000 --- a/targets/RT/USER/msg_helper.c +++ /dev/null @@ -1,66 +0,0 @@ -#include - -#include "msg_many.h" - -/* - * Add a task task to ri->worker. - * Return the used index in ri->worker on success - * Return -TM_WORKER_FULL_ERROR if ri->worker full - * Return -TM_WORKER_ERROR else -*/ -int tm_add_task(RT_TASK *task, run_info_t *ri) -{ - if(ri->used >= NUM_THREADS) - return -TM_WORKER_FULL_ERROR; - - rt_sem_wait(ri->update_sem); - (*ri->worker)[ri->used] = task; - ri->used++; - rt_sem_signal(ri->update_sem); - - return ri->used - 1; -} - -/* - * Remove the a hole in worker at index index by - * shift the next slots by one. - * This function assume that update_sem are locked. - * Return the new used counter. -*/ -int _tm_clean_worker(RT_TASK *(*worker)[], int index, int used) -{ - int i; - - for(i = index; i < used; i++) - (*worker)[i] = (*worker)[i + 1]; - - return used - 1; -} - -/* - * Remove a task from ri->worker a index task_index - * Return 0 on success - * Return -TM_WORKER_ERROR else -*/ -int tm_del_task(int task_index, run_info_t *ri) -{ - rt_sem_wait(ri->update_sem); - ri->used = _tm_clean_worker(ri->worker, task_index, ri->used); - rt_sem_signal(ri->update_sem); - - return 0; -} - -/* - * Return next index to use on ri->worker. - * It depends on the old_index and ri->used. - * Return -TM_WORKER_ERROR if ri->used == 0. -*/ -inline int tm_get_next_task_index(int old_index, run_info_t *ri) -{ - if(ri->used == 0) - return -TM_WORKER_ERROR; - - return (old_index + 1) % ri->used; -} - diff --git a/targets/RT/USER/msg_many.c b/targets/RT/USER/msg_many.c deleted file mode 100644 index cf62d5d21c..0000000000 --- a/targets/RT/USER/msg_many.c +++ /dev/null @@ -1,160 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "msg_many.h" - -static void *msg_test_thread(void *arg) -{ - RT_TASK *self; - RT_TASK *sender_task; - thread_info_t *ti = (thread_info_t *)arg; - run_info_t *ri = ti->ri; - unsigned int msg; - int counter = 0; - char name[6]; - int task_index; - - /* Build custom task name for each thread */ - snprintf(name, 6, "%s%03i", THREAD_NAME_PREFIX, ti->thread_num); - - self = rt_task_init_schmod(nam2num(name), 0, 0, 0, SCHED_FIFO, 0xF); - mlockall(MCL_CURRENT | MCL_FUTURE); - - rt_make_hard_real_time(); - - task_index = tm_add_task(self, ri); - - if(task_index != -TM_WORKER_FULL_ERROR) { - while (*(ri->exit_condition) == 0) { - // wait only one PERIOD to avoid wait for ever - sender_task = rt_receive_timed(ri->sender, &msg, ri->period); - - //sender_task = rt_receive(0, &msg); - if(sender_task == ri->sender) - counter++; - } - - rt_printk("%s: counter == %i\n", name, counter); - tm_del_task(task_index, ri); - } else { - rt_printk("%s: Worker array full!\n", name); - } - - rt_make_soft_real_time(); - - rt_task_delete(self); - - free((void *) ti); - - return 0; -} - - -int main(void) -{ - RT_TASK *self; - RT_TASK *tmp_worker_task; - RT_TASK *worker_tasks[NUM_THREADS]; - int worker_threads[NUM_THREADS]; - RTIME now; - unsigned int i, ii; - run_info_t ri; - thread_info_t *ti; - uint8_t exit_condition = 0; - int fail_count = 0; - int old_index = 0; - uint8_t lost; - - // make main thread LXRT soft realtime - self = rt_task_init_schmod(nam2num("MAINTK"), 10, 0, 0, SCHED_FIFO, 0xF); - mlockall(MCL_CURRENT | MCL_FUTURE); - - rt_make_hard_real_time(); - rt_set_periodic_mode(); - start_rt_timer(0); - - /* Build all information need to run in main and the thread */ - ri.sender = self; - ri.exit_condition = &exit_condition; - ri.period = nano2count(PERIOD); - ri.update_sem = rt_sem_init(nam2num("MUTEX"), 1); - - if(ri.update_sem == 0) - exit(-1); - - ri.used = 0; - ri.worker = &worker_tasks; - - now = rt_get_time() + ri.period; - rt_task_make_periodic(self, now, ri.period); - - /* start all threads */ - for(i = 0; i < NUM_THREADS; i++) { - ti = (thread_info_t *)malloc(sizeof(thread_info_t)); - - if(ti == NULL) { - rt_printk("MAINTK: can't get memory!\n"); - exit(-1); - } - - ti->ri = &ri; - ti->thread_num = i; - worker_threads[i] = rt_thread_create(msg_test_thread, ti , 10000); - } - - rt_sleep(NUM_THREADS * ri.period); - - rt_printk("start\n"); - - for(i = 0; i < THRESHOLD; i++) { - rt_task_wait_period(); - lost = 1; - - for(ii = 0; ii < ri.used; ii++) { - old_index = tm_get_next_task_index(old_index, &ri); - - if(old_index == -TM_WORKER_ERROR) { - rt_printk("MAINTK: No Tasks!\n"); - break; - } - - tmp_worker_task = rt_send_if(worker_tasks[old_index], i); - - if(tmp_worker_task == worker_tasks[old_index]) { - lost = 0; - break; - } - } - - if(lost) - fail_count++; - } - - rt_printk("fail_count == %i\n", fail_count); - - // cleanup - exit_condition = 1; - rt_make_soft_real_time(); - - rt_task_delete(self); - - /* wait for the worker threadss */ - for(ii = 0; ii < ri.used; ii++) { - rt_thread_join(worker_threads[ii]); - } - - stop_rt_timer(); - return 0; -} diff --git a/targets/RT/USER/msg_many.h b/targets/RT/USER/msg_many.h deleted file mode 100644 index 82e5eb1371..0000000000 --- a/targets/RT/USER/msg_many.h +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -#ifndef __MSG_MANY_H__ -#define __MSG_MANY_H__ -#include - -#define PERIOD 500000 /* in nano seconds */ -#define THRESHOLD 1000000 -#define THREAD_NAME_PREFIX "TK" -#define NUM_THREADS 10 - -#define TM_WORKER_FULL_ERROR 1 -#define TM_WORKER_ERROR 2 - -typedef struct run_info { - RT_TASK *sender; - uint8_t *exit_condition; - long long period; - SEM *update_sem; /* protect the task array */ - int used; /* counter of used slots in worker */ - RT_TASK *(*worker)[]; /* declare worker as pointer to array of pointer to RT_TASK */ -} run_info_t; - -typedef struct thread_info { - run_info_t *ri; - uint8_t thread_num; -} thread_info_t; - -int tm_add_task(RT_TASK *task, run_info_t *ri); -int tm_del_task(int task_index, run_info_t *ri); -inline int tm_get_next_task_index(int old_index, run_info_t *ri); - -#endif - diff --git a/targets/RT/USER/pnf.gtkw b/targets/RT/USER/pnf.gtkw new file mode 100644 index 0000000000..979d632138 --- /dev/null +++ b/targets/RT/USER/pnf.gtkw @@ -0,0 +1,54 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Tue Jul 25 20:26:12 2017 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Tue Jul 25 20:11:55 2017" +[dumpfile_size] 19201475 +[savefile] "/home/papillon/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw" +[timestart] 29023604000 +[size] 1236 578 +[pos] 309 0 +*-20.793451 29026062100 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 386 +[signals_width] 262 +[sst_expanded] 1 +[sst_vpaned_height] 146 +@28 +functions.trx_read +functions.trx_write +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@25 +variables.frame_number_RX0_RU[63:0] +variables.subframe_number_RX0_RU[63:0] +@25 +variables.frame_number_TX0_RU[63:0] +variables.subframe_number_TX0_RU[63:0] +@24 +functions.phy_procedures_ru_feprx0 +functions.phy_procedures_ru_feprx1 +functions.phy_procedures_eNb_rx_uespec0 +functions.phy_procedures_eNb_tx0 +functions.eNB_thread_rxtx1 +functions.phy_enb_prach_rx +functions.phy_enb_rs_tx +functions.phy_enb_pdcch_tx +functions.nfapi_subframe +functions.generate_pcfich +functions.generate_dci0 +functions.pdcch_scrambling +functions.pdcch_modulation +functions.pdcch_interleaving +functions.pdcch_tx +functions.generate_dlsch +functions.generate_phich +functions.udp_enb_task +functions.phy_procedures_ru_feptx_ofdm0 +functions.phy_procedures_ru_feptx_ofdm1 +functions.phy_procedures_ru_feptx_prec0 +functions.phy_procedures_ru_feptx_prec1 +functions.phy_enb_prach_rx +[pattern_trace] 1 +[pattern_trace] 0 diff --git a/targets/RT/USER/rau_if4_single_thread.gtkw b/targets/RT/USER/rau_if4_single_thread.gtkw new file mode 100644 index 0000000000..454c36b753 --- /dev/null +++ b/targets/RT/USER/rau_if4_single_thread.gtkw @@ -0,0 +1,155 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Tue Apr 18 08:34:21 2017 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Tue Apr 18 08:25:27 2017" +[dumpfile_size] 5288218 +[savefile] "/home/knopp/oai/openairinterface5g/targets/RT/USER/rau_if4_single_thread.gtkw" +[timestart] 64780000000 +[size] 1301 716 +[pos] 309 0 +*-27.793451 65200000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 284 +[signals_width] 262 +[sst_expanded] 1 +[sst_vpaned_height] 294 +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@28 +functions.recv_if4 +functions.send_if4 +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_RU[63:0] +variables.subframe_number_RX0_RU[63:0] +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_RU[63:0] +variables.subframe_number_TX0_RU[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@29 +functions.phy_procedures_ru_feprx0 +@28 +functions.phy_procedures_eNb_tx0 +functions.phy_procedures_eNb_rx_uespec0 +functions.phy_enb_sfgen +functions.phy_eNB_slot_fep +functions.phy_enb_prach_rx +@24 +variables.dci_info[63:0] +variables.ue0_BO[63:0] +@420 +variables.ue0_BSR[63:0] +variables.ue0_timing_advance[63:0] +@28 +functions.macxface_initiate_ra_proc +functions.macxface_terminate_ra_proc +functions.phy_enb_ulsch_msg3 +functions.macxface_SR_indication +@420 +variables.ue0_SR_ENERGY[63:0] +variables.ue0_SR_THRES[63:0] +@28 +functions.phy_enb_ulsch_decoding0 +@24 +variables.ue0_res0[63:0] +@420 +variables.ue0_rssi0[63:0] +variables.ue0_MCS0[63:0] +variables.ue0_RB0[63:0] +@24 +variables.ue0_ROUND0[63:0] +variables.ue0_SFN0[63:0] +@28 +functions.phy_enb_ulsch_decoding1 +@24 +variables.ue0_res1[63:0] +@420 +variables.ue0_rssi1[63:0] +variables.ue0_MCS1[63:0] +variables.ue0_RB1[63:0] +@24 +variables.ue0_ROUND1[63:0] +variables.ue0_SFN1[63:0] +@28 +functions.phy_enb_ulsch_decoding2 +@24 +variables.ue0_res2[63:0] +@420 +variables.ue0_rssi2[63:0] +variables.ue0_MCS2[63:0] +variables.ue0_RB2[63:0] +@24 +variables.ue0_ROUND2[63:0] +variables.ue0_SFN2[63:0] +@28 +functions.phy_enb_ulsch_decoding3 +@24 +variables.ue0_res3[63:0] +@420 +variables.ue0_rssi3[63:0] +variables.ue0_MCS3[63:0] +variables.ue0_RB3[63:0] +@24 +variables.ue0_ROUND3[63:0] +variables.ue0_SFN3[63:0] +@28 +functions.phy_enb_ulsch_decoding4 +@420 +variables.ue0_rssi4[63:0] +@24 +variables.ue0_res4[63:0] +@420 +variables.ue0_MCS4[63:0] +variables.ue0_RB4[63:0] +@24 +variables.ue0_ROUND4[63:0] +variables.ue0_SFN4[63:0] +@28 +functions.phy_enb_ulsch_decoding5 +@24 +variables.ue0_res5[63:0] +@420 +variables.ue0_rssi5[63:0] +variables.ue0_MCS5[63:0] +variables.ue0_RB5[63:0] +@24 +variables.ue0_ROUND5[63:0] +variables.ue0_SFN5[63:0] +@28 +functions.phy_enb_ulsch_decoding6 +@24 +variables.ue0_res6[63:0] +@420 +variables.ue0_rssi6[63:0] +variables.ue0_MCS6[63:0] +variables.ue0_RB6[63:0] +@24 +variables.ue0_ROUND6[63:0] +variables.ue0_SFN6[63:0] +@28 +functions.phy_enb_ulsch_decoding7 +@24 +variables.ue0_res7[63:0] +@420 +variables.ue0_rssi7[63:0] +variables.ue0_MCS7[63:0] +variables.ue0_RB7[63:0] +@24 +variables.ue0_ROUND7[63:0] +variables.ue0_SFN7[63:0] +@28 +functions.phy_enb_prach_rx +functions.phy_eNB_dlsch_encoding +functions.phy_eNB_dlsch_modulation +functions.phy_eNB_dlsch_scrambling +functions.phy_enb_pdcch_tx +functions.phy_enb_rs_tx +functions.rrc_mac_config_req +functions.rlc_data_req +functions.udp_enb_task +[pattern_trace] 1 +[pattern_trace] 0 diff --git a/targets/RT/USER/rcc_if4.gtkw b/targets/RT/USER/rcc_if4.gtkw new file mode 100644 index 0000000000..e099e466c1 --- /dev/null +++ b/targets/RT/USER/rcc_if4.gtkw @@ -0,0 +1,161 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Sat Aug 6 15:00:27 2016 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Sat Aug 6 14:59:21 2016" +[dumpfile_size] 991809002 +[savefile] "/home/fourmi/openairinterface5g/targets/RT/USER/rcc_if4.gtkw" +[timestart] 0 +[size] 1301 716 +[pos] 309 0 +*-19.793451 7382528436 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 284 +[signals_width] 262 +[sst_expanded] 1 +[sst_vpaned_height] 294 +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@28 +functions.recv_if4 +functions.send_if4 +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@28 +functions.phy_procedures_eNb_tx0 +functions.phy_procedures_eNb_rx_common0 +functions.phy_procedures_eNb_rx_uespec0 +functions.eNB_thread_rxtx1 +@24 +variables.frame_number_RX1_eNB[63:0] +variables.subframe_number_RX1_eNB[63:0] +variables.frame_number_TX1_eNB[63:0] +variables.subframe_number_TX1_eNB[63:0] +@29 +functions.phy_procedures_eNb_tx1 +@28 +functions.phy_procedures_eNb_rx_common1 +functions.phy_procedures_eNb_rx_uespec1 +functions.phy_enb_sfgen +functions.phy_eNB_slot_fep +functions.phy_enb_prach_rx +@24 +variables.dci_info[63:0] +variables.ue0_BO[63:0] +@420 +variables.ue0_BSR[63:0] +variables.ue0_timing_advance[63:0] +@28 +functions.macxface_initiate_ra_proc +functions.macxface_terminate_ra_proc +functions.phy_enb_ulsch_msg3 +functions.macxface_SR_indication +@420 +variables.ue0_SR_ENERGY[63:0] +variables.ue0_SR_THRES[63:0] +@28 +functions.phy_enb_ulsch_decoding0 +@24 +variables.ue0_res0[63:0] +@420 +variables.ue0_rssi0[63:0] +variables.ue0_MCS0[63:0] +variables.ue0_RB0[63:0] +@24 +variables.ue0_ROUND0[63:0] +variables.ue0_SFN0[63:0] +@28 +functions.phy_enb_ulsch_decoding1 +@24 +variables.ue0_res1[63:0] +@420 +variables.ue0_rssi1[63:0] +variables.ue0_MCS1[63:0] +variables.ue0_RB1[63:0] +@24 +variables.ue0_ROUND1[63:0] +variables.ue0_SFN1[63:0] +@28 +functions.phy_enb_ulsch_decoding2 +@24 +variables.ue0_res2[63:0] +@420 +variables.ue0_rssi2[63:0] +variables.ue0_MCS2[63:0] +variables.ue0_RB2[63:0] +@24 +variables.ue0_ROUND2[63:0] +variables.ue0_SFN2[63:0] +@28 +functions.phy_enb_ulsch_decoding3 +@24 +variables.ue0_res3[63:0] +@420 +variables.ue0_rssi3[63:0] +variables.ue0_MCS3[63:0] +variables.ue0_RB3[63:0] +@24 +variables.ue0_ROUND3[63:0] +variables.ue0_SFN3[63:0] +@28 +functions.phy_enb_ulsch_decoding4 +@420 +variables.ue0_rssi4[63:0] +@24 +variables.ue0_res4[63:0] +@420 +variables.ue0_MCS4[63:0] +variables.ue0_RB4[63:0] +@24 +variables.ue0_ROUND4[63:0] +variables.ue0_SFN4[63:0] +@28 +functions.phy_enb_ulsch_decoding5 +@24 +variables.ue0_res5[63:0] +@420 +variables.ue0_rssi5[63:0] +variables.ue0_MCS5[63:0] +variables.ue0_RB5[63:0] +@24 +variables.ue0_ROUND5[63:0] +variables.ue0_SFN5[63:0] +@28 +functions.phy_enb_ulsch_decoding6 +@24 +variables.ue0_res6[63:0] +@420 +variables.ue0_rssi6[63:0] +variables.ue0_MCS6[63:0] +variables.ue0_RB6[63:0] +@24 +variables.ue0_ROUND6[63:0] +variables.ue0_SFN6[63:0] +@28 +functions.phy_enb_ulsch_decoding7 +@24 +variables.ue0_res7[63:0] +@420 +variables.ue0_rssi7[63:0] +variables.ue0_MCS7[63:0] +variables.ue0_RB7[63:0] +@24 +variables.ue0_ROUND7[63:0] +variables.ue0_SFN7[63:0] +@28 +functions.phy_enb_prach_rx +functions.phy_eNB_dlsch_encoding +functions.phy_eNB_dlsch_modulation +functions.phy_eNB_dlsch_scrambling +functions.phy_enb_pdcch_tx +functions.phy_enb_rs_tx +functions.rrc_mac_config_req +functions.rlc_data_req +functions.udp_enb_task +[pattern_trace] 1 +[pattern_trace] 0 diff --git a/targets/RT/USER/rcc_if5.gtkw b/targets/RT/USER/rcc_if5.gtkw new file mode 100644 index 0000000000..d64a9ca0fb --- /dev/null +++ b/targets/RT/USER/rcc_if5.gtkw @@ -0,0 +1,154 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Sun Jul 31 13:30:42 2016 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Sun Jul 31 13:21:59 2016" +[dumpfile_size] 18273240 +[savefile] "/home/fourmi/openairinterface5g/targets/RT/USER/rcc_if5.gtkw" +[timestart] 24070893000 +[size] 1301 716 +[pos] 309 0 +*-19.793451 29026062100 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 284 +[signals_width] 262 +[sst_expanded] 1 +[sst_vpaned_height] 294 +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@28 +functions.send_if5 +functions.recv_if5 +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@28 +functions.eNB_thread_rxtx1 +@24 +variables.frame_number_RX1_eNB[63:0] +variables.subframe_number_RX1_eNB[63:0] +variables.frame_number_TX1_eNB[63:0] +variables.subframe_number_TX1_eNB[63:0] +@28 +functions.phy_enb_sfgen +functions.phy_eNB_slot_fep +functions.phy_enb_prach_rx +@24 +variables.dci_info[63:0] +variables.ue0_BO[63:0] +@420 +variables.ue0_BSR[63:0] +variables.ue0_timing_advance[63:0] +@28 +functions.macxface_initiate_ra_proc +functions.macxface_terminate_ra_proc +functions.phy_enb_ulsch_msg3 +functions.macxface_SR_indication +@420 +variables.ue0_SR_ENERGY[63:0] +variables.ue0_SR_THRES[63:0] +@28 +functions.phy_enb_ulsch_decoding0 +@24 +variables.ue0_res0[63:0] +@420 +variables.ue0_rssi0[63:0] +variables.ue0_MCS0[63:0] +variables.ue0_RB0[63:0] +@24 +variables.ue0_ROUND0[63:0] +variables.ue0_SFN0[63:0] +@28 +functions.phy_enb_ulsch_decoding1 +@24 +variables.ue0_res1[63:0] +@420 +variables.ue0_rssi1[63:0] +variables.ue0_MCS1[63:0] +variables.ue0_RB1[63:0] +@24 +variables.ue0_ROUND1[63:0] +variables.ue0_SFN1[63:0] +@28 +functions.phy_enb_ulsch_decoding2 +@24 +variables.ue0_res2[63:0] +@420 +variables.ue0_rssi2[63:0] +variables.ue0_MCS2[63:0] +variables.ue0_RB2[63:0] +@24 +variables.ue0_ROUND2[63:0] +variables.ue0_SFN2[63:0] +@28 +functions.phy_enb_ulsch_decoding3 +@24 +variables.ue0_res3[63:0] +@420 +variables.ue0_rssi3[63:0] +variables.ue0_MCS3[63:0] +variables.ue0_RB3[63:0] +@24 +variables.ue0_ROUND3[63:0] +variables.ue0_SFN3[63:0] +@28 +functions.phy_enb_ulsch_decoding4 +@420 +variables.ue0_rssi4[63:0] +@24 +variables.ue0_res4[63:0] +@420 +variables.ue0_MCS4[63:0] +variables.ue0_RB4[63:0] +@24 +variables.ue0_ROUND4[63:0] +variables.ue0_SFN4[63:0] +@28 +functions.phy_enb_ulsch_decoding5 +@24 +variables.ue0_res5[63:0] +@420 +variables.ue0_rssi5[63:0] +variables.ue0_MCS5[63:0] +variables.ue0_RB5[63:0] +@24 +variables.ue0_ROUND5[63:0] +variables.ue0_SFN5[63:0] +@28 +functions.phy_enb_ulsch_decoding6 +@24 +variables.ue0_res6[63:0] +@420 +variables.ue0_rssi6[63:0] +variables.ue0_MCS6[63:0] +variables.ue0_RB6[63:0] +@24 +variables.ue0_ROUND6[63:0] +variables.ue0_SFN6[63:0] +@28 +functions.phy_enb_ulsch_decoding7 +@24 +variables.ue0_res7[63:0] +@420 +variables.ue0_rssi7[63:0] +variables.ue0_MCS7[63:0] +variables.ue0_RB7[63:0] +@24 +variables.ue0_ROUND7[63:0] +variables.ue0_SFN7[63:0] +@28 +functions.phy_enb_prach_rx +functions.phy_eNB_dlsch_encoding +functions.phy_eNB_dlsch_modulation +functions.phy_eNB_dlsch_scrambling +functions.phy_enb_pdcch_tx +functions.phy_enb_rs_tx +functions.rrc_mac_config_req +functions.rlc_data_req +functions.udp_enb_task +[pattern_trace] 1 +[pattern_trace] 0 diff --git a/targets/RT/USER/rrh.c b/targets/RT/USER/rrh.c deleted file mode 100644 index 6da21190e5..0000000000 --- a/targets/RT/USER/rrh.c +++ /dev/null @@ -1,1228 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/** ethernet_lib : API to stream I/Q samples over standard ethernet (RRH component) -* -* Authors: Raymond Knopp , Riadh Ghaddab -* -* Changelog: -* 06.10.2014: Initial version -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "common_lib.h" - -#define BUF_LEN 4096+32 -#define RRH_eNB_PORT 50000 -#define RRH_eNB_DEST_IP "127.0.0.1" -#define RRH_UE_PORT 51000 -#define RRH_UE_DEST_IP "127.0.0.1" - -#define FRAME_MAX_SIZE 307200//76800 -#define DEFAULT_PERIOD_NS 133333//200000 - -#define START_CMD 1 -#define PRINTF_PERIOD 3750 - -typedef struct { - int eNB_port; - char eNB_dest_ip[20]; - int UE_port; - char UE_dest_ip[20]; - struct timespec time_req; -} rrh_desc_t; - -typedef struct { - int32_t nsamps; - int32_t antenna_index_eNB_rx; - int32_t antenna_index_eNB_tx; - int sockid_eNB; - struct sockaddr clientaddr; - socklen_t clientaddrlen; -} rrh_eNB_desc_t; - -typedef struct { - int32_t nsamps; - int32_t antenna_index_UE_rx; - int32_t antenna_index_UE_tx; - int sockid_UE; - struct sockaddr clientaddr; - socklen_t clientaddrlen; -} rrh_UE_desc_t; - -int rrh_exit=0; - -int32_t tx_buffer_eNB[4][(1+(sizeof(openair0_timestamp)>>2))+FRAME_MAX_SIZE],rx_buffer_eNB[4][(1+(sizeof(openair0_timestamp)>>2))+FRAME_MAX_SIZE]; -int32_t tx_buffer_UE[4][(1+(sizeof(openair0_timestamp)>>2))+FRAME_MAX_SIZE],rx_buffer_UE[4][(1+(sizeof(openair0_timestamp)>>2))+FRAME_MAX_SIZE]; -void *rrh_eNB_thread_status; -void *rrh_UE_thread_status; -int32_t counter_UE_rx[4]= {0,0,0,0}; -int32_t counter_UE_tx[4]= {0,0,0,0}; -int32_t counter_eNB_rx[4]= {0,0,0,0}; -int32_t counter_eNB_tx[4]= {0,0,0,0}; -int32_t overflow_rx_buffer_UE[4]= {0,0,0,0}; -int32_t overflow_rx_buffer_eNB[4]= {0,0,0,0}; -int32_t nsamps_eNB[4]= {0,0,0,0}; -int32_t nsamps_UE[4]= {0,0,0,0}; -int32_t UE_tx_started=0,eNB_tx_started=0, UE_rx_started=0,eNB_rx_started=0; -int32_t RT_FLAG=0, NRT_FLAG=1; -openair0_timestamp nrt_eNB_counter[4]= {0,0,0,0}; -openair0_timestamp nrt_UE_counter[4]= {0,0,0,0}; - -openair0_timestamp timestamp_eNB_tx[4],timestamp_eNB_rx[4]= {0,0,0,0}; -openair0_timestamp timestamp_UE_tx[4],timestamp_UE_rx[4]= {0,0,0,0}; -openair0_timestamp hw_counter=0; - -pthread_cond_t sync_UE_cond[4]; -pthread_mutex_t sync_UE_mutex[4]; -pthread_cond_t sync_eNB_cond[4]; -pthread_mutex_t sync_eNB_mutex[4]; -pthread_mutex_t timer_mutex; - -int sync_UE_rx[4]= {-1,-1,-1,-1}; -int sync_eNB_rx[4]= {-1,-1,-1,-1}; - -//functions prototype -void timer_signal_handler(int); -void *timer_proc(void *); -void *rrh_proc_eNB_thread(); -void *rrh_proc_UE_thread(); -void *rrh_UE_thread(void *); -void *rrh_UE_rx_thread(void *); -void *rrh_UE_tx_thread(void *); -void *rrh_eNB_thread(void *); -void *rrh_eNB_rx_thread(void *); -void *rrh_eNB_tx_thread(void *); - -void timer_signal_handler(int sig) -{ - - if (sig == SIGALRM) { - pthread_mutex_lock(&timer_mutex); - hw_counter ++; - //printf("[RRH] : hw_counter : %d\n",(int)hw_counter); - pthread_mutex_unlock(&timer_mutex); - } - - -} - - -void *timer_proc(void *arg) -{ - timer_t timerid; // timer ID for timer - //struct sigevent event; // event to deliver - struct itimerspec *timer = (struct itimerspec*)arg; // the timer data structure - struct itimerspec *old_value; - - - //printf("Starting the timer\n"); - if (timer_create (CLOCK_REALTIME, NULL, &timerid) == -1) { - fprintf (stderr, "couldn't create a timer\n"); - perror (NULL); - exit (EXIT_FAILURE); - } - - signal(SIGALRM, timer_signal_handler); - // and start it! - timer_settime (timerid, 0, timer, old_value); - - while (!rrh_exit) { - sleep(1); - } - - timer_delete(timerid); - return (0); - - -} - - -void *rrh_proc_eNB_thread() -{ - - //rrh_desc_t *rrh_desc = (rrh_desc_t *)arg; - int antenna_index,i; - openair0_timestamp truncated_timestamp, truncated_timestamp_final, last_hw_counter=0; - struct timespec time_req, time_rem; - int16_t *rxp,*txp; - - time_req.tv_sec = 0; - time_req.tv_nsec = 1000; - - while (rrh_exit==0) { - //wait until some data has been copied - for (antenna_index=0; antenna_index<4; antenna_index++) { - if (sync_eNB_rx[antenna_index]==0) { - if (!eNB_tx_started) { - eNB_tx_started=1; // set this flag to 1 to indicate that eNB started - - if (RT_FLAG==1) { - last_hw_counter=hw_counter; - } - } else { - if (RT_FLAG==1) { - if (hw_counter > last_hw_counter+1) { - printf("L"); - // goto end_copy_eNB; - } else { - //printf("hw_counter : %llu, last_hw_counter : %llu\n",hw_counter,last_hw_counter); - while (hw_counter < last_hw_counter+1) - nanosleep(&time_req,&time_rem); - } - } - } - - truncated_timestamp = timestamp_eNB_tx[antenna_index]%(FRAME_MAX_SIZE); - truncated_timestamp_final = (timestamp_eNB_tx[antenna_index]+nsamps_eNB[antenna_index])%FRAME_MAX_SIZE; - - if ((truncated_timestamp + nsamps_eNB[antenna_index]) > FRAME_MAX_SIZE) { - if ((timestamp_UE_rx[antenna_index]%FRAME_MAX_SIZE < nsamps_eNB[antenna_index]) && (UE_rx_started==1)) { - overflow_rx_buffer_UE[antenna_index]++; - printf("UE Overflow[%d] : %d, timestamp : %d\n",antenna_index,overflow_rx_buffer_UE[antenna_index],(int)truncated_timestamp); - - if (NRT_FLAG==1) { - while ((timestamp_UE_rx[antenna_index]%FRAME_MAX_SIZE) < nsamps_eNB[antenna_index]) - nanosleep(&time_req,&time_rem); - } - } - - rxp = (int16_t*)&rx_buffer_UE[antenna_index][truncated_timestamp+(sizeof(openair0_timestamp)>>2)]; - txp = (int16_t*)&tx_buffer_eNB[antenna_index][truncated_timestamp+(sizeof(openair0_timestamp)>>2)]; - - for (i=0; i<(FRAME_MAX_SIZE<<1)-(truncated_timestamp<<1); i++) { - rxp[i] = txp[i]>>6; - } - - rxp = (int16_t*)&rx_buffer_UE[antenna_index][(sizeof(openair0_timestamp)>>2)]; - txp = (int16_t*)&tx_buffer_eNB[antenna_index][0]; - - for (i=0; i>6; - } - - /* memcpy(&rx_buffer_UE[antenna_index][truncated_timestamp + (sizeof(openair0_timestamp)>>2)],&tx_buffer_eNB[antenna_index][truncated_timestamp],(FRAME_MAX_SIZE<<2)-(truncated_timestamp<<2)); - memcpy(&rx_buffer_UE[antenna_index][(sizeof(openair0_timestamp)>>2)],&tx_buffer_eNB[antenna_index][0],(nsamps_eNB[antenna_index]<<2)-(FRAME_MAX_SIZE<<2)+(truncated_timestamp<<2));*/ - } else { - if (((truncated_timestamp < (timestamp_UE_rx[antenna_index]%FRAME_MAX_SIZE)) && (truncated_timestamp_final > (timestamp_UE_rx[antenna_index]%FRAME_MAX_SIZE))) && (UE_rx_started==1)) { - overflow_rx_buffer_UE[antenna_index]++; - printf("UE Overflow[%d] : %d, timestamp : %d\n",antenna_index,overflow_rx_buffer_UE[antenna_index],(int)truncated_timestamp); - - if (NRT_FLAG==1) { - while (truncated_timestamp_final > timestamp_UE_rx[antenna_index]%FRAME_MAX_SIZE) - nanosleep(&time_req,&time_rem); - } - } - - rxp = (int16_t*)&rx_buffer_UE[antenna_index][truncated_timestamp+(sizeof(openair0_timestamp))]; - txp = (int16_t*)&tx_buffer_eNB[antenna_index][truncated_timestamp]; - - for (i=0; i<(nsamps_eNB[antenna_index]); i++) { - rxp[i] =txp[i]>>6; - } - - /* - memcpy(&rx_buffer_UE[antenna_index][truncated_timestamp + (sizeof(openair0_timestamp)>>2)],&tx_buffer_eNB[antenna_index][truncated_timestamp],(nsamps_eNB[antenna_index]<<2));*/ - } - - - // end_copy_eNB : - last_hw_counter=hw_counter; - pthread_mutex_lock(&sync_eNB_mutex[antenna_index]); - sync_eNB_rx[antenna_index]--; - pthread_mutex_unlock(&sync_eNB_mutex[antenna_index]); - - } - } - - } - - return(0); -} - -void *rrh_proc_UE_thread() -{ - - //rrh_desc_t *rrh_desc = (rrh_desc_t *)arg; - int antenna_index,i; - openair0_timestamp truncated_timestamp, truncated_timestamp_final, last_hw_counter=0; - struct timespec time_req, time_rem; - int16_t *txp,*rxp; - - time_req.tv_sec = 0; - time_req.tv_nsec = 1000; - - - while (rrh_exit==0) { - //wait until some data has been copied - for (antenna_index=0; antenna_index<4; antenna_index++) { - if (sync_UE_rx[antenna_index]==0) { - if (!UE_tx_started) { - UE_tx_started=1; //Set this flag to 1 to indicate that a UE started retrieving data - - if (RT_FLAG==1) { - last_hw_counter=hw_counter; - } - } else { - if (RT_FLAG==1) { - if (hw_counter > last_hw_counter+1) { - printf("L1"); - // goto end_copy_UE; - } else { - while (hw_counter < last_hw_counter+1) - nanosleep(&time_req,&time_rem); - } - } - } - - truncated_timestamp = timestamp_UE_tx[antenna_index]%(FRAME_MAX_SIZE); - truncated_timestamp_final = (timestamp_UE_tx[antenna_index]+nsamps_UE[antenna_index])%FRAME_MAX_SIZE; - - if ((truncated_timestamp + nsamps_UE[antenna_index]) > FRAME_MAX_SIZE) { - if ((timestamp_eNB_rx[antenna_index]%FRAME_MAX_SIZE < nsamps_UE[antenna_index]) && (eNB_rx_started==1)) { - overflow_rx_buffer_eNB[antenna_index]++; - printf("eNB Overflow[%d] : %d, timestamp : %d\n",antenna_index,overflow_rx_buffer_eNB[antenna_index],(int)truncated_timestamp); - - if (NRT_FLAG==1) { - while ((timestamp_eNB_rx[antenna_index]%FRAME_MAX_SIZE) < nsamps_UE[antenna_index]) - nanosleep(&time_req,&time_rem); - } - } - - rxp = (int16_t*)&rx_buffer_eNB[antenna_index][truncated_timestamp+(sizeof(openair0_timestamp)>>2)]; - txp = (int16_t*)&tx_buffer_UE[antenna_index][truncated_timestamp+(sizeof(openair0_timestamp)>>2)]; - - for (i=0; i<(FRAME_MAX_SIZE<<1)-(truncated_timestamp<<1); i++) { - rxp[i] = txp[i]>>6; - } - - rxp = (int16_t*)&rx_buffer_eNB[antenna_index][(sizeof(openair0_timestamp)>>2)]; - txp = (int16_t*)&tx_buffer_UE[antenna_index][0]; - - for (i=0; i>6; - } - - /* - memcpy(&rx_buffer_eNB[antenna_index][truncated_timestamp + (sizeof(openair0_timestamp)>>2)],&tx_buffer_UE[antenna_index][truncated_timestamp],(FRAME_MAX_SIZE<<2)-(truncated_timestamp<<2)); - memcpy(&rx_buffer_eNB[antenna_index][(sizeof(openair0_timestamp)>>2)],&tx_buffer_UE[antenna_index][0],(nsamps_UE[antenna_index]<<2)-(FRAME_MAX_SIZE<<2)+(truncated_timestamp<<2));*/ - - } else { - if (((truncated_timestamp < (timestamp_eNB_rx[antenna_index]%FRAME_MAX_SIZE)) && (truncated_timestamp_final > (timestamp_eNB_rx[antenna_index]%FRAME_MAX_SIZE))) && (eNB_rx_started==1)) { - overflow_rx_buffer_eNB[antenna_index]++; - printf("eNB Overflow[%d] : %d, timestamp : %d\n",antenna_index,overflow_rx_buffer_eNB[antenna_index],(int)truncated_timestamp); - - if (NRT_FLAG==1) { - while (truncated_timestamp_final > timestamp_eNB_rx[antenna_index]%FRAME_MAX_SIZE) - nanosleep(&time_req,&time_rem); - } - } - - rxp = (int16_t*)&rx_buffer_eNB[antenna_index][truncated_timestamp+(sizeof(openair0_timestamp))]; - txp = (int16_t*)&tx_buffer_UE[antenna_index][truncated_timestamp]; - - for (i=0; i<(nsamps_eNB[antenna_index]); i++) { - rxp[i] =txp[i]>>6; - } - - /* memcpy(&rx_buffer_eNB[antenna_index][truncated_timestamp+ (sizeof(openair0_timestamp)>>2)],&tx_buffer_UE[antenna_index][truncated_timestamp],(nsamps_UE[antenna_index]<<2));*/ - } - - //end_copy_UE : - last_hw_counter=hw_counter; - pthread_mutex_lock(&sync_UE_mutex[antenna_index]); - sync_UE_rx[antenna_index]--; - pthread_mutex_unlock(&sync_UE_mutex[antenna_index]); - - } - } - - } - - return(0); -} - - -void *rrh_UE_rx_thread(void *arg) -{ - - struct sockaddr clientaddr; - socklen_t clientaddrlen; - rrh_UE_desc_t *rrh_UE_rx_desc = (rrh_UE_desc_t *)arg; - struct timespec time0,time1,time2; - struct timespec time_req_1us, time_rem_1us; - ssize_t bytes_sent; - int antenna_index, nsamps; - int trace_cnt=0; - int sockid; - char str[INET_ADDRSTRLEN]; - unsigned long long max_rx_time=0, min_rx_time=133333, total_rx_time=0, average_rx_time=133333, s_period=0, trial=0; - - openair0_timestamp temp, last_hw_counter=0; - - antenna_index = rrh_UE_rx_desc->antenna_index_UE_rx; - nsamps = rrh_UE_rx_desc->nsamps; - sockid = rrh_UE_rx_desc->sockid_UE; - - - bzero((void*)&clientaddr,sizeof(struct sockaddr)); - clientaddrlen = sizeof(struct sockaddr); - //printf("Waiting for eNB ...\n"); - //printf("[RRH eNB RX thread] received parameters : nsamps : %d, antenna_index : %d\n",nsamps,antenna_index); - clientaddr = rrh_UE_rx_desc->clientaddr; - clientaddrlen = rrh_UE_rx_desc->clientaddrlen; - - inet_ntop(AF_INET, &(((struct sockaddr_in*)&clientaddr)->sin_addr), str, INET_ADDRSTRLEN); - printf("Received UE RX request for antenna %d, nsamps %d (from %s:%d)\n",antenna_index,nsamps,str, - ntohs(((struct sockaddr_in*)&clientaddr)->sin_port)); - - while (rrh_exit == 0) { - if (!UE_rx_started) { - UE_rx_started=1; //Set this flag to 1 to indicate that a UE started retrieving data - - if (RT_FLAG==1) { - last_hw_counter=hw_counter; - } - } else { - if (RT_FLAG==1) { - if (hw_counter > last_hw_counter+1) { - printf("L1"); - // goto end_copy_UE; - } else { - while (hw_counter < last_hw_counter+1) - nanosleep(&time_req_1us,&time_rem_1us); - } - } - } - - clock_gettime(CLOCK_MONOTONIC,&time1); - - // send return - temp=*(openair0_timestamp*)&rx_buffer_UE[antenna_index][timestamp_UE_rx[antenna_index]%(FRAME_MAX_SIZE)]; - *(openair0_timestamp*)&rx_buffer_UE[antenna_index][timestamp_UE_rx[antenna_index]%(FRAME_MAX_SIZE)]=timestamp_UE_rx[antenna_index]; - - if ((timestamp_UE_rx[antenna_index]%(FRAME_MAX_SIZE)+nsamps) > FRAME_MAX_SIZE) { // Wrap around if nsamps exceeds the buffer limit - if (((timestamp_eNB_tx[antenna_index]%(FRAME_MAX_SIZE)) < ((timestamp_UE_rx[antenna_index]+nsamps)%(FRAME_MAX_SIZE))) && (eNB_tx_started==1)) { - printf("UE underflow wraparound timestamp_UE_rx : %d, timestamp_eNB_tx : %d\n",(int)(timestamp_UE_rx[antenna_index]%(FRAME_MAX_SIZE)),(int)(timestamp_eNB_tx[antenna_index]%FRAME_MAX_SIZE)); - - if (NRT_FLAG==1) { - while ((timestamp_eNB_tx[antenna_index]%FRAME_MAX_SIZE) < ((timestamp_UE_rx[antenna_index]+nsamps)%(FRAME_MAX_SIZE))) - nanosleep(&time_req_1us,&time_rem_1us); - } - } - - if ((bytes_sent = sendto(sockid, - &rx_buffer_UE[antenna_index][timestamp_UE_rx[antenna_index]%(FRAME_MAX_SIZE)], - ((FRAME_MAX_SIZE)<<2) - ((timestamp_UE_rx[antenna_index]%(FRAME_MAX_SIZE))<<2) + sizeof(openair0_timestamp), - 0, - (struct sockaddr*)&clientaddr, - sizeof(struct sockaddr)))<0) - perror("RRH UE : sendto for RX"); - - if ((bytes_sent = sendto(sockid, - &rx_buffer_UE[antenna_index][0], - (nsamps<<2) - ((FRAME_MAX_SIZE)<<2) + ((timestamp_UE_rx[antenna_index]%(FRAME_MAX_SIZE))<<2), - 0, - (struct sockaddr*)&clientaddr, - sizeof(struct sockaddr)))<0) - perror("RRH UE : sendto for RX"); - } else { - if (((timestamp_UE_rx[antenna_index]%FRAME_MAX_SIZE)< timestamp_eNB_tx[antenna_index]%FRAME_MAX_SIZE) - && (((timestamp_UE_rx[antenna_index]+nsamps)%FRAME_MAX_SIZE) > (timestamp_eNB_tx[antenna_index]%FRAME_MAX_SIZE)) && (eNB_tx_started==1) ) { - printf("UE underflow timestamp_UE_rx : %d, timestamp_eNB_tx : %d\n",(int)(timestamp_UE_rx[antenna_index]%FRAME_MAX_SIZE),(int)(timestamp_eNB_tx[antenna_index]%FRAME_MAX_SIZE)); - - if (NRT_FLAG==1) { - while (((timestamp_UE_rx[antenna_index]+nsamps)%FRAME_MAX_SIZE) > (timestamp_eNB_tx[antenna_index]%FRAME_MAX_SIZE)) { - nanosleep(&time_req_1us,&time_rem_1us); - } - } - } - - - if ((bytes_sent = sendto(sockid, - &rx_buffer_UE[antenna_index][timestamp_UE_rx[antenna_index]%(FRAME_MAX_SIZE)], - (nsamps<<2)+sizeof(openair0_timestamp), - 0, - (struct sockaddr*)&clientaddr, - sizeof(struct sockaddr)))<0) - perror("RRH UE thread: sendto for RX"); - } - - //printf("bytes_sent %d(timestamp_UE_rx[%d] %d)\n",(int)bytes_sent,antenna_index,(int)timestamp_UE_rx[antenna_index]); - *(openair0_timestamp*)&rx_buffer_UE[antenna_index][timestamp_UE_rx[antenna_index]%(FRAME_MAX_SIZE)]=temp; - timestamp_UE_rx[antenna_index]+=nsamps; - last_hw_counter=hw_counter; - - clock_gettime(CLOCK_MONOTONIC,&time2); - - if (trace_cnt++ > 10) { - total_rx_time = (unsigned int)(time2.tv_nsec - time0.tv_nsec); - - if (total_rx_time < 0) total_rx_time=1000000000-total_rx_time; - - if ((total_rx_time > 0) && (total_rx_time < 1000000000)) { - trial++; - - if (total_rx_time < min_rx_time) - min_rx_time = total_rx_time; - - if (total_rx_time > max_rx_time) - max_rx_time = total_rx_time; - - average_rx_time = (long long unsigned int)((average_rx_time*trial)+total_rx_time)/(trial+1); - } - - if (s_period++ == PRINTF_PERIOD) { - s_period=0; - printf("Average UE RX time : %lu\tMax RX time : %lu\tMin RX time : %lu\n",average_rx_time,max_rx_time,min_rx_time); - - } - - //printf("RX: t1 %llu (time from last send), t2 %llu (sendto of %lu bytes) total time : %llu\n",(long long unsigned int)(time1.tv_nsec - time0.tv_nsec), (long long unsigned int)(time2.tv_nsec - time1.tv_nsec), - // (nsamps<<2)+sizeof(openair0_timestamp),(long long unsigned int)(time2.tv_nsec - time0.tv_nsec)); - - } - - memcpy(&time0,&time2,sizeof(struct timespec)); - - - } //while (rrh_exit==0) - - return(0); - -} - - -void *rrh_UE_tx_thread(void *arg) -{ - struct sockaddr clientaddr; - socklen_t clientaddrlen; - struct timespec time0a,time0,time1,time2; - rrh_UE_desc_t *rrh_UE_tx_desc = (rrh_UE_desc_t *)arg; - // struct timespec time_rem; - struct timespec time_req_1us, time_rem_1us; - ssize_t bytes_received; - int antenna_index, nsamps; - int8_t buf[BUF_LEN]; - int trace_cnt=0; - int sockid; - - bzero((void*)&clientaddr,sizeof(struct sockaddr)); - clientaddrlen = sizeof(struct sockaddr); - - antenna_index = rrh_UE_tx_desc->antenna_index_UE_tx; - nsamps = rrh_UE_tx_desc->nsamps; - sockid = rrh_UE_tx_desc->sockid_UE; - - while (rrh_exit == 0) { - - clock_gettime(CLOCK_MONOTONIC,&time0a); - - bytes_received = recvfrom(sockid,buf,BUF_LEN,0,&clientaddr,&clientaddrlen); - timestamp_eNB_tx[antenna_index] = *(openair0_timestamp*)(buf+4); - - clock_gettime(CLOCK_MONOTONIC,&time1); - - if (NRT_FLAG==1) { - nrt_UE_counter[antenna_index]++; - } - - //printf("Received UE TX request for antenna %d, nsamps %d, timestamp %d bytes_received %d\n",antenna_index,nsamps,(int)timestamp_UE_tx[antenna_index],(int)bytes_received); - if ((timestamp_UE_tx[antenna_index]%(FRAME_MAX_SIZE)+nsamps) > FRAME_MAX_SIZE) { // Wrap around if nsamps exceeds the buffer limit - memcpy(&tx_buffer_UE[antenna_index][timestamp_UE_tx[antenna_index]%(FRAME_MAX_SIZE)],buf+sizeof(openair0_timestamp)+2*sizeof(int16_t), - (FRAME_MAX_SIZE<<2)-((timestamp_UE_tx[antenna_index]%(FRAME_MAX_SIZE))<<2)); - memcpy(&tx_buffer_UE[antenna_index][0],buf+sizeof(openair0_timestamp)+2*sizeof(int16_t)+(FRAME_MAX_SIZE*4)-((timestamp_UE_tx[antenna_index]%(FRAME_MAX_SIZE))<<2), - (nsamps<<2)-((FRAME_MAX_SIZE-(timestamp_UE_tx[antenna_index]%(FRAME_MAX_SIZE)))<<2)); - //printf("Received UE TX samples for antenna %d, nsamps %d (%d)\n",antenna_index,nsamps,(int)(bytes_received>>2)); - } else { - memcpy(&tx_buffer_UE[antenna_index][timestamp_UE_tx[antenna_index]%(FRAME_MAX_SIZE)],buf+sizeof(openair0_timestamp)+2*sizeof(int16_t),(nsamps<<2)); - } - - //printf("Received UE TX samples for antenna %d, nsamps %d (%d)\n",antenna_index,nsamps,(int)(bytes_received>>2)); - - while (sync_UE_rx[antenna_index]==0) - nanosleep(&time_req_1us,&time_rem_1us); - - pthread_mutex_lock(&sync_UE_mutex[antenna_index]); - sync_UE_rx[antenna_index]++; - - if (!sync_UE_rx[antenna_index]) { - counter_UE_tx[antenna_index]=(counter_UE_tx[antenna_index]+nsamps)%FRAME_MAX_SIZE; - nsamps_UE[antenna_index]=nsamps; - } else { - printf("rrh_eNB_proc thread is busy, will exit\n"); - exit(-1); - } - - pthread_mutex_unlock(&sync_UE_mutex[antenna_index]); - - clock_gettime(CLOCK_MONOTONIC,&time2); - - memcpy(&time0,&time2,sizeof(struct timespec)); - - } - - return(0); - -} - - - -void *rrh_UE_thread(void *arg) -{ - - int sockid=-1; - struct sockaddr_in serveraddr; - struct sockaddr clientaddr; - socklen_t clientaddrlen; - rrh_desc_t *rrh_desc = (rrh_desc_t *)arg; - char str[INET_ADDRSTRLEN]; - //int8_t msg_header[4+sizeof(openair0_timestamp)]; - int8_t buf[BUF_LEN]; - int16_t cmd; //,nsamps,antenna_index; - ssize_t bytes_received; - // struct timespec time_rem; - // ssize_t bytes_sent; - // openair0_timestamp temp; - // openair0_timestamp last_hw_counter=0; - struct timespec time_req_1us, time_rem_1us; - - rrh_UE_desc_t rrh_UE_desc; - pthread_t UE_rx_thread, UE_tx_thread; - pthread_attr_t attr_UE_rx, attr_UE_tx; - struct sched_param sched_param_UE_rx, sched_param_UE_tx; - int error_code_UE_rx, error_code_UE_tx; - - time_req_1us.tv_sec = 0; - time_req_1us.tv_nsec = 1000; - - while (rrh_exit==0) { - - - sockid=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); - - if (sockid==-1) { - perror("Cannot create UE socket: "); - rrh_exit=1; - } - - - bzero((char *)&serveraddr,sizeof(serveraddr)); - serveraddr.sin_family=AF_INET; - serveraddr.sin_port=htons(rrh_desc->UE_port); - inet_pton(AF_INET,rrh_desc->UE_dest_ip,&serveraddr.sin_addr.s_addr); - - inet_ntop(AF_INET, &(serveraddr.sin_addr), str, INET_ADDRSTRLEN); - printf("Binding to UE socket for %s:%d\n",str,ntohs(serveraddr.sin_port)); - - if (bind(sockid,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0) { - perror("Cannot bind to UE socket: "); - rrh_exit = 1; - } - - // now wait for commands from eNB - - // get header info - bzero((void*)&clientaddr,sizeof(struct sockaddr)); - clientaddrlen = sizeof(struct sockaddr); - //printf("Waiting for UE ...\n"); - - bytes_received = recvfrom(sockid,buf,BUF_LEN,0,&clientaddr,&clientaddrlen); - cmd = buf[0]; - - rrh_UE_desc.antenna_index_UE_rx = cmd>>1; - rrh_UE_desc.antenna_index_UE_tx = cmd>>1; - //rrh_eNB_desc.timestamp_eNB_tx[rrh_eNB_desc.antenna_index_eNB_tx] = *(openair0_timestamp*)(buf+4); //we don't need timestamp when receiving the first command - rrh_UE_desc.nsamps = *(int16_t *)(buf+2); - rrh_UE_desc.sockid_UE = sockid; - rrh_UE_desc.clientaddr = clientaddr; - rrh_UE_desc.clientaddrlen = clientaddrlen; - - cmd = cmd&1; - inet_ntop(AF_INET, &(((struct sockaddr_in*)&clientaddr)->sin_addr), str, INET_ADDRSTRLEN); - - if (cmd==START_CMD) { - - pthread_attr_init(&attr_UE_rx); - pthread_attr_init(&attr_UE_tx); - sched_param_UE_rx.sched_priority = sched_get_priority_max(SCHED_FIFO); - sched_param_UE_tx.sched_priority = sched_get_priority_max(SCHED_FIFO); - pthread_attr_setschedparam(&attr_UE_rx,&sched_param_UE_rx); - pthread_attr_setschedparam(&attr_UE_tx,&sched_param_UE_tx); - pthread_attr_setschedpolicy(&attr_UE_rx,SCHED_FIFO); - pthread_attr_setschedpolicy(&attr_UE_tx,SCHED_FIFO); - - error_code_UE_rx = pthread_create(&UE_rx_thread, &attr_UE_rx, rrh_UE_rx_thread, (void *)&rrh_UE_desc); - error_code_UE_tx = pthread_create(&UE_tx_thread, &attr_UE_tx, rrh_UE_tx_thread, (void *)&rrh_UE_desc); - - if (error_code_UE_rx) { - printf("Error while creating UE RX thread\n"); - exit(-1); - } - - if (error_code_UE_tx) { - printf("Error while creating UE TX thread\n"); - exit(-1); - } - - while (rrh_exit==0) - sleep(1); - } - } - - close(sockid); - - rrh_UE_thread_status = 0; - pthread_exit(&rrh_UE_thread_status); - - return(0); -} - - - -void *rrh_eNB_rx_thread(void *arg) -{ - - struct sockaddr clientaddr; - socklen_t clientaddrlen; - rrh_eNB_desc_t *rrh_eNB_rx_desc = (rrh_eNB_desc_t *)arg; - struct timespec time0,time1,time2; - struct timespec time_req_1us, time_rem_1us; - ssize_t bytes_sent; - int antenna_index, nsamps; - int trace_cnt=0; - int sockid; - char str[INET_ADDRSTRLEN]; - unsigned long long max_rx_time=0, min_rx_time=133333, total_rx_time=0, average_rx_time=133333, s_period=0, trial=0; - - openair0_timestamp temp, last_hw_counter=0; - - antenna_index = rrh_eNB_rx_desc->antenna_index_eNB_rx; - nsamps = rrh_eNB_rx_desc->nsamps; - sockid = rrh_eNB_rx_desc->sockid_eNB; - - - bzero((void*)&clientaddr,sizeof(struct sockaddr)); - clientaddrlen = sizeof(struct sockaddr); - //printf("Waiting for eNB ...\n"); - //printf("[RRH eNB RX thread] received parameters : nsamps : %d, antenna_index : %d\n",nsamps,antenna_index); - clientaddr = rrh_eNB_rx_desc->clientaddr; - clientaddrlen = rrh_eNB_rx_desc->clientaddrlen; - - inet_ntop(AF_INET, &(((struct sockaddr_in*)&clientaddr)->sin_addr), str, INET_ADDRSTRLEN); - printf("Received eNB RX request for antenna %d, nsamps %d (from %s:%d)\n",antenna_index,nsamps,str, - ntohs(((struct sockaddr_in*)&clientaddr)->sin_port)); - - while (rrh_exit == 0) { - //printf("Received eNB RX request for antenna %d, nsamps %d (from %s:%d)\n",antenna_index,nsamps,str, - // ntohs(((struct sockaddr_in*)&clientaddr)->sin_port)); - - if (!eNB_rx_started) { - eNB_rx_started=1; // set this flag to 1 to indicate that eNB started - - if (RT_FLAG==1) { - last_hw_counter=hw_counter; - } - } else { - if (RT_FLAG==1) { - if (hw_counter > last_hw_counter+1) { - printf("L"); - // goto end_copy_eNB; - } else { - while (hw_counter < last_hw_counter+1) - nanosleep(&time_req_1us,&time_rem_1us); - } - } - } - - clock_gettime(CLOCK_MONOTONIC,&time1); - - // send return - temp=*(openair0_timestamp*)&rx_buffer_eNB[antenna_index][timestamp_eNB_rx[antenna_index]%(FRAME_MAX_SIZE)]; - *(openair0_timestamp*)&rx_buffer_eNB[antenna_index][timestamp_eNB_rx[antenna_index]%(FRAME_MAX_SIZE)]=timestamp_eNB_rx[antenna_index]; - - if ((timestamp_eNB_rx[antenna_index]%(FRAME_MAX_SIZE)+nsamps) > FRAME_MAX_SIZE) { // Wrap around if nsamps exceeds the buffer limit - if ((timestamp_UE_tx[antenna_index]%FRAME_MAX_SIZE < ((timestamp_eNB_rx[antenna_index]+nsamps)%FRAME_MAX_SIZE)) && (UE_tx_started==1)) { - printf("eNB underflow\n"); - - if (NRT_FLAG==1) { - while ((timestamp_UE_tx[antenna_index]%FRAME_MAX_SIZE) < nsamps) - nanosleep(&time_req_1us,&time_rem_1us); - } - } - - - if ((bytes_sent = sendto(sockid, - &rx_buffer_eNB[antenna_index][timestamp_eNB_rx[antenna_index]%(FRAME_MAX_SIZE)], - ((FRAME_MAX_SIZE)<<2) - ((timestamp_eNB_rx[antenna_index]%(FRAME_MAX_SIZE))<<2) + sizeof(openair0_timestamp), - 0, - (struct sockaddr*)&clientaddr, - sizeof(struct sockaddr)))<0) - perror("RRH eNB : sendto for RX"); - - if ((bytes_sent = sendto(sockid, - &rx_buffer_eNB[antenna_index][0], - (nsamps<<2) - ((FRAME_MAX_SIZE)<<2) + ((timestamp_eNB_rx[antenna_index]%(FRAME_MAX_SIZE))<<2), - 0, - (struct sockaddr*)&clientaddr, - sizeof(struct sockaddr)))<0) - perror("RRH eNB : sendto for RX"); - } else { - if (((timestamp_eNB_rx[antenna_index]%FRAME_MAX_SIZE)< timestamp_UE_tx[antenna_index]%FRAME_MAX_SIZE) - && (((timestamp_eNB_rx[antenna_index]+nsamps)%FRAME_MAX_SIZE) > (timestamp_UE_tx[antenna_index]%FRAME_MAX_SIZE)) && (UE_tx_started==1)) { - printf("eNB underflow\n"); - - if (NRT_FLAG==1) { - while (((timestamp_eNB_rx[antenna_index]+nsamps)%FRAME_MAX_SIZE) > (timestamp_UE_tx[antenna_index]%FRAME_MAX_SIZE)) - nanosleep(&time_req_1us,&time_rem_1us); - } - } - - if ((bytes_sent = sendto(sockid, - &rx_buffer_eNB[antenna_index][timestamp_eNB_rx[antenna_index]%(FRAME_MAX_SIZE)], - (nsamps<<2)+sizeof(openair0_timestamp), - 0, - (struct sockaddr*)&clientaddr, - sizeof(struct sockaddr)))<0) - perror("RRH eNB : sendto for RX"); - - } - - //printf("bytes_sent %d(timestamp_eNB_rx[%d] %d)\n",(int)bytes_sent,antenna_index,(int)timestamp_eNB_rx[antenna_index]); - - - *(openair0_timestamp*)&rx_buffer_eNB[antenna_index][timestamp_eNB_rx[antenna_index]%(FRAME_MAX_SIZE)]=temp; - timestamp_eNB_rx[antenna_index]+=nsamps; - last_hw_counter=hw_counter; - - clock_gettime(CLOCK_MONOTONIC,&time2); - - if (trace_cnt++ > 10) { - total_rx_time = (unsigned int)(time2.tv_nsec - time0.tv_nsec); - - if (total_rx_time < 0) total_rx_time=1000000000-total_rx_time; - - if ((total_rx_time > 0) && (total_rx_time < 1000000000)) { - trial++; - - if (total_rx_time < min_rx_time) - min_rx_time = total_rx_time; - - if (total_rx_time > max_rx_time) - max_rx_time = total_rx_time; - - average_rx_time = (long long unsigned int)((average_rx_time*trial)+total_rx_time)/(trial+1); - } - - if (s_period++ == PRINTF_PERIOD) { - s_period=0; - printf("Average eNB RX time : %lu\tMax RX time : %lu\tMin RX time : %lu\n",average_rx_time,max_rx_time,min_rx_time); - - } - - //printf("RX: t1 %llu (time from last send), t2 %llu (sendto of %lu bytes) total time : %llu\n",(long long unsigned int)(time1.tv_nsec - time0.tv_nsec), (long long unsigned int)(time2.tv_nsec - time1.tv_nsec), - // (nsamps<<2)+sizeof(openair0_timestamp),(long long unsigned int)(time2.tv_nsec - time0.tv_nsec)); - - } - - memcpy(&time0,&time2,sizeof(struct timespec)); - - - } //while (rrh_exit==0) - - return(0); - -} - - -void *rrh_eNB_tx_thread(void *arg) -{ - - struct sockaddr clientaddr; - socklen_t clientaddrlen; - struct timespec time0a,time0,time1,time2; - rrh_eNB_desc_t *rrh_eNB_tx_desc = (rrh_eNB_desc_t *)arg; - // struct timespec time_rem; - struct timespec time_req_1us, time_rem_1us; - ssize_t bytes_received; - int antenna_index, nsamps; - int8_t buf[BUF_LEN]; - int trace_cnt=0; - int sockid; - - bzero((void*)&clientaddr,sizeof(struct sockaddr)); - clientaddrlen = sizeof(struct sockaddr); - //printf("Waiting for eNB ...\n"); - - antenna_index = rrh_eNB_tx_desc->antenna_index_eNB_tx; - nsamps = rrh_eNB_tx_desc->nsamps; - sockid = rrh_eNB_tx_desc->sockid_eNB; - - while (rrh_exit == 0) { - - clock_gettime(CLOCK_MONOTONIC,&time0a); - - bytes_received = recvfrom(sockid,buf,BUF_LEN,0,&clientaddr,&clientaddrlen); - timestamp_eNB_tx[antenna_index] = *(openair0_timestamp*)(buf+4); - - clock_gettime(CLOCK_MONOTONIC,&time1); - - if (NRT_FLAG==1) { - nrt_eNB_counter[antenna_index]++; - } - - //printf("Received eNB TX request for antenna %d, nsamps %d, timestamp %d bytes_received %d\n",antenna_index,nsamps,(int)timestamp_eNB_tx[antenna_index],(int)bytes_received); - - if ((timestamp_eNB_tx[antenna_index]%(FRAME_MAX_SIZE)+nsamps) > FRAME_MAX_SIZE) { // Wrap around if nsamps exceeds the buffer limit - memcpy(&tx_buffer_eNB[antenna_index][timestamp_eNB_tx[antenna_index]%(FRAME_MAX_SIZE)],buf+sizeof(openair0_timestamp)+2*sizeof(int16_t), - ((FRAME_MAX_SIZE)<<2)-((timestamp_eNB_tx[antenna_index]%(FRAME_MAX_SIZE))<<2)); - //printf("Done first part size : %d\n",(int32_t)(((FRAME_MAX_SIZE)<<2)-((timestamp_eNB_tx[antenna_index]%(FRAME_MAX_SIZE))<<2))); - memcpy(&tx_buffer_eNB[antenna_index][0],buf+sizeof(openair0_timestamp)+2*sizeof(int16_t) + ((FRAME_MAX_SIZE)<<2) -((timestamp_eNB_tx[antenna_index]%(FRAME_MAX_SIZE))<<2), - (nsamps<<2)-((FRAME_MAX_SIZE)<<2)+((timestamp_eNB_tx[antenna_index]%(FRAME_MAX_SIZE))<<2)); - //printf("Received eNB TX samples for antenna %d, nsamps %d (%d)\n",antenna_index,nsamps,(int)(bytes_received>>2)); - } else { - memcpy(&tx_buffer_eNB[antenna_index][timestamp_eNB_tx[antenna_index]%(FRAME_MAX_SIZE)],buf+sizeof(openair0_timestamp)+2*sizeof(int16_t),nsamps<<2); - } - - while (sync_eNB_rx[antenna_index]==0) - nanosleep(&time_req_1us,&time_rem_1us); - - //printf("launching eNB proc\n"); - pthread_mutex_lock(&sync_eNB_mutex[antenna_index]); - sync_eNB_rx[antenna_index]++; - - if (!sync_eNB_rx[antenna_index]) { - counter_eNB_tx[antenna_index]=(counter_eNB_tx[antenna_index]+nsamps)%FRAME_MAX_SIZE; - nsamps_eNB[antenna_index]=nsamps; - } else { - printf("rrh_eNB_proc thread is busy, will exit\n"); - exit(-1); - } - - pthread_mutex_unlock(&sync_eNB_mutex[antenna_index]); - - clock_gettime(CLOCK_MONOTONIC,&time2); - - //if (trace_cnt++ < 10) - // printf("TX: t0 %llu (time from previous run) t1 %llu (time of memcpy TX samples), t2 %llu (total time)\n",(long long unsigned int)(time1.tv_nsec - time0.tv_nsec), - // (long long unsigned int)(time2.tv_nsec - time1.tv_nsec), - // (long long unsigned int)(time2.tv_nsec - time0.tv_nsec)); - - memcpy(&time0,&time2,sizeof(struct timespec)); - - - - } - - return(0); - -} - -void *rrh_eNB_thread(void *arg) -{ - - int sockid=-1; - struct sockaddr_in serveraddr; - struct sockaddr clientaddr; - socklen_t clientaddrlen; - rrh_desc_t *rrh_desc = (rrh_desc_t *)arg; - char str[INET_ADDRSTRLEN]; - //int8_t msg_header[4+sizeof(openair0_timestamp)]; - int8_t buf[BUF_LEN]; - int16_t cmd; //,nsamps,antenna_index; - ssize_t bytes_received; - //ssize_t bytes_sent; - //openair0_timestamp temp, last_hw_counter=0; - //struct timespec time_rem; - struct timespec time_req_1us, time_rem_1us; - //struct timespec time0a,time0,time1,time2; - //int trace_cnt=0; - rrh_eNB_desc_t rrh_eNB_desc; - pthread_t eNB_rx_thread, eNB_tx_thread; - pthread_attr_t attr_eNB_rx, attr_eNB_tx; - struct sched_param sched_param_eNB_rx, sched_param_eNB_tx; - int error_code_eNB_rx, error_code_eNB_tx; - - time_req_1us.tv_sec = 0; - time_req_1us.tv_nsec = 1000; - - - while (rrh_exit==0) { - - - sockid=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); - - if (sockid==-1) { - perror("Cannot create eNB socket: "); - rrh_exit=1; - } - - - bzero((char *)&serveraddr,sizeof(serveraddr)); - serveraddr.sin_family=AF_INET; - serveraddr.sin_port=htons(rrh_desc->eNB_port); - inet_pton(AF_INET,rrh_desc->eNB_dest_ip,&serveraddr.sin_addr.s_addr); - - inet_ntop(AF_INET, &(serveraddr.sin_addr), str, INET_ADDRSTRLEN); - printf("Binding to eNB socket for %s:%d\n",str,ntohs(serveraddr.sin_port)); - - if (bind(sockid,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0) { - perror("Cannot bind to eNB socket: "); - rrh_exit = 1; - } - - // now wait for commands from eNB - - // get header info - bzero((void*)&clientaddr,sizeof(struct sockaddr)); - clientaddrlen = sizeof(struct sockaddr); - //printf("Waiting for eNB ...\n"); - - - - bytes_received = recvfrom(sockid,buf,BUF_LEN,0,&clientaddr,&clientaddrlen); - cmd = buf[0]; - rrh_eNB_desc.antenna_index_eNB_rx = cmd>>1; - rrh_eNB_desc.antenna_index_eNB_tx = cmd>>1; - //rrh_eNB_desc.timestamp_eNB_tx[rrh_eNB_desc.antenna_index_eNB_tx] = *(openair0_timestamp*)(buf+4); //we don't need timestamp when receiving the first command - rrh_eNB_desc.nsamps = *(int16_t *)(buf+2); - rrh_eNB_desc.sockid_eNB = sockid; - rrh_eNB_desc.clientaddr = clientaddr; - rrh_eNB_desc.clientaddrlen = clientaddrlen; - - //cmd = cmd&1; - cmd = cmd|1;//in order to make cmd evalution dummy (the first message from lte to rrh has changed, see: @ethernet_lib.c trx_start_func has been substituted by trx_request_func ) - inet_ntop(AF_INET, &(((struct sockaddr_in*)&clientaddr)->sin_addr), str, INET_ADDRSTRLEN); - - if (cmd==START_CMD) { - - pthread_attr_init(&attr_eNB_rx); - pthread_attr_init(&attr_eNB_tx); - sched_param_eNB_rx.sched_priority = sched_get_priority_max(SCHED_FIFO); - sched_param_eNB_tx.sched_priority = sched_get_priority_max(SCHED_FIFO); - pthread_attr_setschedparam(&attr_eNB_rx,&sched_param_eNB_rx); - pthread_attr_setschedparam(&attr_eNB_tx,&sched_param_eNB_tx); - pthread_attr_setschedpolicy(&attr_eNB_rx,SCHED_FIFO); - pthread_attr_setschedpolicy(&attr_eNB_tx,SCHED_FIFO); - - error_code_eNB_rx = pthread_create(&eNB_rx_thread, &attr_eNB_rx, rrh_eNB_rx_thread, (void *)&rrh_eNB_desc); - error_code_eNB_tx = pthread_create(&eNB_tx_thread, &attr_eNB_tx, rrh_eNB_tx_thread, (void *)&rrh_eNB_desc); - - if (error_code_eNB_rx) { - printf("Error while creating eNB RX thread\n"); - exit(-1); - } - - if (error_code_eNB_tx) { - printf("Error while creating eNB TX thread\n"); - exit(-1); - } - - while (rrh_exit==0) - sleep(1); - - } - - - } //while (rrh_exit==0) - - close(sockid); - - rrh_eNB_thread_status = 0; - pthread_exit(&rrh_eNB_thread_status); - - return(0); -} - - -void signal_handler(int sig) -{ - void *array[10]; - size_t size; - - if (sig==SIGSEGV) { - // get void*'s for all entries on the stack - size = backtrace(array, 10); - - // print out all the frames to stderr - fprintf(stderr, "Error: signal %d:\n", sig); - backtrace_symbols_fd(array, size, 2); - exit(-1); - } else { - printf("trying to exit gracefully...\n"); - rrh_exit = 1; - } -} - -int main(int argc, char **argv) -{ - - pthread_t main_rrh_eNB_thread, main_rrh_UE_thread, main_rrh_proc_eNB_thread, main_rrh_proc_UE_thread, main_timer_proc_thread; - pthread_attr_t attr, attr_proc, attr_timer; - struct sched_param sched_param_rrh, sched_param_rrh_proc, sched_param_timer; - int error_code_eNB, error_code_UE, error_code_proc_eNB, error_code_proc_UE, error_code_timer; - int i; - int opt; - int nsecs=0, rt_period=0; - rrh_desc_t rrh; - struct itimerspec timer; - - - rrh.time_req.tv_sec = 0; - rrh.time_req.tv_nsec = 0; - - rrh.eNB_port = RRH_eNB_PORT; - strcpy(rrh.eNB_dest_ip,RRH_eNB_DEST_IP); - rrh.UE_port = RRH_UE_PORT; - strcpy(rrh.UE_dest_ip ,RRH_UE_DEST_IP); - - nsecs = 0; - - while ((opt = getopt(argc, argv, "t:rE:U:")) != -1) { - switch (opt) { - case 't': - rt_period = atoi(optarg); - RT_FLAG=1; - NRT_FLAG=0; - break; - - case 'r': - rt_period = DEFAULT_PERIOD_NS; - RT_FLAG=1; - NRT_FLAG=0; - break; - - case 'E': - strcpy(rrh.eNB_dest_ip,optarg); - break; - - case 'U': - strcpy(rrh.UE_dest_ip,optarg); - break; - - default: /* '?' */ - fprintf(stderr, "Usage: %s [-d nsecs]\n", argv[0]); - exit(-1); - } - } - - // if (optind >= argc) { - // fprintf(stderr, "Expected argument after options\n"); - // exit(EXIT_FAILURE); - // } - - // setup the timer (1s delay, 1s reload) - timer.it_value.tv_sec = rt_period/1000000000; - timer.it_value.tv_nsec = rt_period%1000000000; - timer.it_interval.tv_sec = rt_period/1000000000; - timer.it_interval.tv_nsec = rt_period%1000000000; - - - // to make a graceful exit when ctrl-c is pressed - signal(SIGSEGV, signal_handler); - signal(SIGINT, signal_handler); - - - pthread_attr_init(&attr); - sched_param_rrh.sched_priority = sched_get_priority_max(SCHED_FIFO); - pthread_attr_init(&attr_proc); - sched_param_rrh_proc.sched_priority = sched_get_priority_max(SCHED_FIFO-1); - pthread_attr_init(&attr_timer); - sched_param_timer.sched_priority = sched_get_priority_max(SCHED_FIFO-2); - - pthread_attr_setschedparam(&attr,&sched_param_rrh); - pthread_attr_setschedpolicy(&attr,SCHED_FIFO); - pthread_attr_setschedparam(&attr_proc,&sched_param_rrh_proc); - pthread_attr_setschedpolicy(&attr_proc,SCHED_FIFO-1); - pthread_attr_setschedparam(&attr_timer,&sched_param_timer); - pthread_attr_setschedpolicy(&attr_timer,SCHED_FIFO-2); - - for (i=0; i<4; i++) { - pthread_mutex_init(&sync_eNB_mutex[i],NULL); - pthread_cond_init(&sync_eNB_cond[i],NULL); - pthread_mutex_init(&sync_UE_mutex[i],NULL); - pthread_cond_init(&sync_UE_cond[i],NULL); - } - - pthread_mutex_init(&timer_mutex,NULL); - - error_code_eNB = pthread_create(&main_rrh_eNB_thread, &attr, rrh_eNB_thread, (void *)&rrh); - error_code_UE = pthread_create(&main_rrh_UE_thread, &attr, rrh_UE_thread, (void *)&rrh); - error_code_proc_UE = pthread_create(&main_rrh_proc_UE_thread, &attr_proc, rrh_proc_UE_thread, NULL); - error_code_proc_eNB = pthread_create(&main_rrh_proc_eNB_thread, &attr_proc, rrh_proc_eNB_thread, NULL); - error_code_timer = pthread_create(&main_timer_proc_thread, &attr_timer, timer_proc, (void *)&timer); - - if (error_code_eNB) { - printf("Error while creating eNB thread\n"); - exit(-1); - } - - if (error_code_UE) { - printf("Error while creating UE thread\n"); - exit(-1); - } - - if (error_code_proc_UE) { - printf("Error while creating UE proc thread\n"); - exit(-1); - } - - if (error_code_proc_eNB) { - printf("Error while creating eNB proc thread\n"); - exit(-1); - } - - if (error_code_timer) { - printf("Error while creating timer proc thread\n"); - exit(-1); - } - - printf("TYPE TO TERMINATE\n"); - - while (rrh_exit==0) - sleep(1); - - - //pthread_join(main_rrh_eNB_thread,&rrh_eNB_thread_status); - return 0; -} diff --git a/targets/RT/USER/rrh.gtkw b/targets/RT/USER/rrh.gtkw deleted file mode 100644 index 891f23ada5..0000000000 --- a/targets/RT/USER/rrh.gtkw +++ /dev/null @@ -1,195 +0,0 @@ -[*] -[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Fri Jan 29 16:34:46 2016 -[*] -[dumpfile] "/tmp/openair_dump_rrh.vcd" -[dumpfile_mtime] "Fri Jan 29 16:20:55 2016" -[dumpfile_size] 224259458 -[savefile] "/home/guepe/openairinterface5g_rrh/openairinterface5g/targets/RT/USER/rrh.gtkw" -[timestart] 31315875900 -[size] 1004 1028 -[pos] 926 -1 -*-17.429794 31316090054 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -[sst_width] 224 -[signals_width] 261 -[sst_expanded] 1 -[sst_vpaned_height] 278 -@24 -[color] 1 -variables.hw_frame_rx[63:0] -[color] 1 -variables.hw_subframe_rx[63:0] -@28 -[color] 1 -functions.eNB_rx -functions.eNB_rx_sleep -[color] 3 -functions.trx_read_rf -[color] 7 -functions.trx_write -@c00024 -variables.rxcnt[63:0] -@28 -(0)variables.rxcnt[63:0] -(1)variables.rxcnt[63:0] -(2)variables.rxcnt[63:0] -(3)variables.rxcnt[63:0] -(4)variables.rxcnt[63:0] -(5)variables.rxcnt[63:0] -(6)variables.rxcnt[63:0] -(7)variables.rxcnt[63:0] -(8)variables.rxcnt[63:0] -(9)variables.rxcnt[63:0] -(10)variables.rxcnt[63:0] -(11)variables.rxcnt[63:0] -(12)variables.rxcnt[63:0] -(13)variables.rxcnt[63:0] -(14)variables.rxcnt[63:0] -(15)variables.rxcnt[63:0] -(16)variables.rxcnt[63:0] -(17)variables.rxcnt[63:0] -(18)variables.rxcnt[63:0] -(19)variables.rxcnt[63:0] -(20)variables.rxcnt[63:0] -(21)variables.rxcnt[63:0] -(22)variables.rxcnt[63:0] -(23)variables.rxcnt[63:0] -(24)variables.rxcnt[63:0] -(25)variables.rxcnt[63:0] -(26)variables.rxcnt[63:0] -(27)variables.rxcnt[63:0] -(28)variables.rxcnt[63:0] -(29)variables.rxcnt[63:0] -(30)variables.rxcnt[63:0] -(31)variables.rxcnt[63:0] -(32)variables.rxcnt[63:0] -(33)variables.rxcnt[63:0] -(34)variables.rxcnt[63:0] -(35)variables.rxcnt[63:0] -(36)variables.rxcnt[63:0] -(37)variables.rxcnt[63:0] -(38)variables.rxcnt[63:0] -(39)variables.rxcnt[63:0] -(40)variables.rxcnt[63:0] -(41)variables.rxcnt[63:0] -(42)variables.rxcnt[63:0] -(43)variables.rxcnt[63:0] -(44)variables.rxcnt[63:0] -(45)variables.rxcnt[63:0] -(46)variables.rxcnt[63:0] -(47)variables.rxcnt[63:0] -(48)variables.rxcnt[63:0] -(49)variables.rxcnt[63:0] -(50)variables.rxcnt[63:0] -(51)variables.rxcnt[63:0] -(52)variables.rxcnt[63:0] -(53)variables.rxcnt[63:0] -(54)variables.rxcnt[63:0] -(55)variables.rxcnt[63:0] -(56)variables.rxcnt[63:0] -(57)variables.rxcnt[63:0] -(58)variables.rxcnt[63:0] -(59)variables.rxcnt[63:0] -(60)variables.rxcnt[63:0] -(61)variables.rxcnt[63:0] -(62)variables.rxcnt[63:0] -(63)variables.rxcnt[63:0] -@1401200 --group_end -@24 -variables.pck_rx[63:0] -variables.rx_ts[63:0] -@c00024 -variables.tx_seq_num[63:0] -@28 -(0)variables.tx_seq_num[63:0] -(1)variables.tx_seq_num[63:0] -(2)variables.tx_seq_num[63:0] -(3)variables.tx_seq_num[63:0] -(4)variables.tx_seq_num[63:0] -(5)variables.tx_seq_num[63:0] -(6)variables.tx_seq_num[63:0] -(7)variables.tx_seq_num[63:0] -(8)variables.tx_seq_num[63:0] -(9)variables.tx_seq_num[63:0] -(10)variables.tx_seq_num[63:0] -(11)variables.tx_seq_num[63:0] -(12)variables.tx_seq_num[63:0] -(13)variables.tx_seq_num[63:0] -(14)variables.tx_seq_num[63:0] -(15)variables.tx_seq_num[63:0] -(16)variables.tx_seq_num[63:0] -(17)variables.tx_seq_num[63:0] -(18)variables.tx_seq_num[63:0] -(19)variables.tx_seq_num[63:0] -(20)variables.tx_seq_num[63:0] -(21)variables.tx_seq_num[63:0] -(22)variables.tx_seq_num[63:0] -(23)variables.tx_seq_num[63:0] -(24)variables.tx_seq_num[63:0] -(25)variables.tx_seq_num[63:0] -(26)variables.tx_seq_num[63:0] -(27)variables.tx_seq_num[63:0] -(28)variables.tx_seq_num[63:0] -(29)variables.tx_seq_num[63:0] -(30)variables.tx_seq_num[63:0] -(31)variables.tx_seq_num[63:0] -(32)variables.tx_seq_num[63:0] -(33)variables.tx_seq_num[63:0] -(34)variables.tx_seq_num[63:0] -(35)variables.tx_seq_num[63:0] -(36)variables.tx_seq_num[63:0] -(37)variables.tx_seq_num[63:0] -(38)variables.tx_seq_num[63:0] -(39)variables.tx_seq_num[63:0] -(40)variables.tx_seq_num[63:0] -(41)variables.tx_seq_num[63:0] -(42)variables.tx_seq_num[63:0] -(43)variables.tx_seq_num[63:0] -(44)variables.tx_seq_num[63:0] -(45)variables.tx_seq_num[63:0] -(46)variables.tx_seq_num[63:0] -(47)variables.tx_seq_num[63:0] -(48)variables.tx_seq_num[63:0] -(49)variables.tx_seq_num[63:0] -(50)variables.tx_seq_num[63:0] -(51)variables.tx_seq_num[63:0] -(52)variables.tx_seq_num[63:0] -(53)variables.tx_seq_num[63:0] -(54)variables.tx_seq_num[63:0] -(55)variables.tx_seq_num[63:0] -(56)variables.tx_seq_num[63:0] -(57)variables.tx_seq_num[63:0] -(58)variables.tx_seq_num[63:0] -(59)variables.tx_seq_num[63:0] -(60)variables.tx_seq_num[63:0] -(61)variables.tx_seq_num[63:0] -(62)variables.tx_seq_num[63:0] -(63)variables.tx_seq_num[63:0] -@1401200 --group_end -@24 -variables.hw_frame[63:0] -variables.hw_subframe[63:0] -@28 -[color] 1 -functions.eNB_tx -functions.eNB_tx_sleep -[color] 7 -functions.trx_read -[color] 3 -functions.trx_write_rf -@24 -variables.txcnt[63:0] -variables.pck_tx[63:0] -variables.tx_ts[63:0] -@25 -variables.rx_seq_num_prv[63:0] -@24 -variables.rx_seq_num[63:0] -variables.hw_cnt_rx[63:0] -variables.lhw_cnt_rx[63:0] -[color] 3 -variables.cnt[63:0] -[pattern_trace] 1 -[pattern_trace] 0 diff --git a/targets/RT/USER/rrh_gw.c b/targets/RT/USER/rrh_gw.c deleted file mode 100644 index 4fd687a3a5..0000000000 --- a/targets/RT/USER/rrh_gw.c +++ /dev/null @@ -1,468 +0,0 @@ - -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file rrh_gw.h - * \brief top-level for the remote radio head gateway (RRH_gw) module reusing the ethernet library - * \author Navid Nikaein, Katerina Trilyraki, Raymond Knopp - * \date 2015 - * \version 0.1 - * \company Eurecom - * \maintainer: navid.nikaein@eurecom.fr - * \note - * \warning very experimental - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "common_lib.h" -#include "rrh_gw.h" -#include "rt_wrapper.h" -#include "rrh_gw_externs.h" - - -#include "log_if.h" -#include "log_extern.h" -#include "vcd_signal_dumper.h" - -/***************************************************************************************** - * ---------- * - * ------- RRH_BBU_IF ------- RRH_RF_IF -------USRP - COTS_UE- * - * - BBU - --------------- - RRH - ------------- -------BLADERF ---------- * - * ------- ------- -------EXMIMO * - * --------- * - * -------ETH_IF - EMU_UE- * - * --------- * - *****************************************************************************************/ - - -/* local IP/MAC address is detected*/ -char rrh_ip[20] = "0.0.0.0"; -unsigned char rrh_mac[6] = "0:0:0:0:0:0"; -int rrh_port = 50000; // has to be an option - -/* log */ -int16_t glog_level = LOG_DEBUG; -int16_t glog_verbosity = LOG_MED; -int16_t rrh_log_level = LOG_INFO; -int16_t rrh_log_verbosity = LOG_MED; -int16_t enb_log_level = LOG_INFO; -int16_t enb_log_verbosity = LOG_MED; -int16_t ue_log_level = LOG_INFO; -int16_t ue_log_verbosity = LOG_MED; - - -/* flag definitions */ -uint8_t eNB_flag=0; -uint8_t UE_flag=0; -uint8_t EXMIMO_flag=0; -uint8_t USRP_flag=0; -uint8_t RT_flag=0, NRT_flag=1; -uint8_t rrh_exit=0; -uint8_t loopback_flag=0; -uint8_t measurements_flag=0; - -/* Default operation as RRH: - - there are neither eNB nor UE modules - - no RF hardware is specified (NONE_IF) - - default ethernet interface is local */ -uint8_t num_eNB_mod=0; -uint8_t num_UE_mod=0; -char* if_name="lo"; -uint8_t eth_mode=ETH_UDP_MODE; - -rrh_module_t *enb_array; -rrh_module_t *ue_array; - -openair0_vtimestamp hw_counter=0; - -char rf_config_file[1024]; - -static void debug_init(void); -static void get_options(int argc, char *argv[]); -static void print_help(void); - -/*!\fn static rrh_module_t new_module(unsigned int id); -* \brief creation of a eNB/UE module -* \param[in] module id -* \return module -* \note -* @ingroup _oai -*/ -static rrh_module_t new_module(unsigned int id); - -/*!\fn static int get_address(char* if_name, uint8_t flag); - * \brief retrieves IP address from the specified network interface - * \param[in] name of network interface - * \return 0 - * \note - * @ingroup _oai - */ -static int get_address(char* if_name, uint8_t flag); - - - - - -int main(int argc, char **argv) { - - unsigned int i; - rf_config_file[0]='\0'; - /* parse input arguments */ - get_options(argc, argv); - /* initialize logger and signal analyzer */ - debug_init(); - /* */ - set_latency_target(); - /* make a graceful exit when ctrl-c is pressed */ - signal(SIGSEGV, signal_handler); - signal(SIGINT, signal_handler); - - /* create modules based on input arguments */ - if (eNB_flag==1){ - enb_array=(rrh_module_t*)malloc(num_eNB_mod*sizeof(rrh_module_t)); - for(i=0;i TO TERMINATE\n"); - - while (rrh_exit==0) - sleep(1); - - return EXIT_SUCCESS; -} - - -static rrh_module_t new_module (unsigned int id) { - - rrh_module_t rrh_mod; - openair0_config_t openair0_cfg; - - rrh_mod.id=id; - rrh_mod.loopback=loopback_flag; - rrh_mod.measurements=measurements_flag; - - /* each module is associated with an ethernet device */ - rrh_mod.eth_dev.type=NONE_DEV; - rrh_mod.eth_dev.transp_type=NONE_TP; - /* ethernet device is functioning within RRH */ - rrh_mod.eth_dev.host_type=RRH_HOST; - /* */ - rrh_mod.eth_dev.openair0_cfg = (openair0_config_t*)malloc(sizeof(openair0_config_t)); - memset(rrh_mod.eth_dev.openair0_cfg,0,sizeof(openair0_config_t)); - /* get IP and MAC address */ - get_address(if_name,eth_mode); - - if(eth_mode==ETH_UDP_MODE) { - openair0_cfg.my_addr = &rrh_ip[0]; - openair0_cfg.my_port = rrh_port; - LOG_I(RRH,"UDP mode selected for ethernet.\n"); - } else if (eth_mode==ETH_RAW_MODE) { - openair0_cfg.my_addr = &rrh_mac[0]; - openair0_cfg.my_port = rrh_port; - LOG_I(RRH,"RAW mode selected for ethernet.\n"); - } - - /* */ - eth_params_t *eth_params = (eth_params_t*)malloc(sizeof(eth_params_t)); - memset(eth_params, 0, sizeof(eth_params_t)); - eth_params->local_if_name = if_name; - eth_params->transp_preference = eth_mode; - - /* ethernet device initialization */ - if (openair0_transport_load(&rrh_mod.eth_dev, &openair0_cfg,eth_params)<0) { - LOG_E(RRH,"Exiting, cannot initialize ethernet interface.\n"); - exit(-1); - } - - /* allocate space and specify associated RF device */ - openair0_device *oai_dv = (openair0_device *)malloc(sizeof(openair0_device)); - memset(oai_dv,0,sizeof(openair0_device)); - - rrh_mod.devs=oai_dv; - rrh_mod.devs->type=NONE_DEV; - rrh_mod.devs->transp_type=NONE_TP; - rrh_mod.devs->host_type=RRH_HOST; - - return rrh_mod; -} - -static void debug_init(void) { - - /* log initialization */ - logInit(); - set_glog(glog_level, glog_verbosity); - - set_comp_log(RRH, rrh_log_level, rrh_log_verbosity, 1); - //set_comp_log(ENB_LOG, enb_log_level, enb_log_verbosity, 1); - //set_comp_log(UE_LOG, ue_log_level, ue_log_verbosity, 1); - - /* vcd initialization */ - if (ouput_vcd) { - vcd_signal_dumper_init("/tmp/openair_dump_rrh.vcd"); - - } -} - - -static void get_options(int argc, char *argv[]) { - - int opt; - - while ((opt = getopt(argc, argv, "xvhlte:n:u:g:r:m:i:f:")) != -1) { - - switch (opt) { - case 'n': - eNB_flag=1; - num_eNB_mod=atoi(optarg); - break; - case 'u': - UE_flag=1; - num_UE_mod=atoi(optarg); - break; - case 'g': - glog_level=atoi(optarg); - break; - case 'i': - if (optarg) { - if_name=strdup(optarg); - printf("RRH interface name is set to %s\n", if_name); - } - break; - case 'm': - eth_mode=atoi(optarg); - break; - case 'r': - //rrh_log_level=atoi(optarg); - break; - case 'e': - //enb_log_level=atoi(optarg); - break; - case 'x': - rt_period = DEFAULT_PERIOD_NS; - RT_flag=1; - NRT_flag=0; - break; - case 'v': - /* extern from vcd */ - ouput_vcd=1; - break; - case 'l': - /*In loopback mode rrh sends back to bbu what it receives*/ - loopback_flag=1; - break; - case 'f': - if (optarg){ - if ((strcmp("null", optarg) == 0) || (strcmp("NULL", optarg) == 0)) { - printf("no configuration filename is provided\n"); - } - else if (strlen(optarg)<=1024){ - // rf_config_file = strdup(optarg); - strcpy(rf_config_file,optarg); - }else { - printf("Configuration filename is too long\n"); - exit(-1); - } - } - break; - case 't': - /* When measurements are enabled statistics related to TX/RX time are printed */ - measurements_flag=1; - break; - case 'h': - print_help(); - exit(-1); - default: /* '?' */ - //fprintf(stderr, "Usage: \n", argv[0]); - exit(-1); - } -} - -} - -static int get_address(char* if_name, uint8_t flag) { - - int fd; - struct ifreq ifr; - - fd = socket(AF_INET, SOCK_DGRAM, 0); - /* I want to get an IPv4 IP address */ - ifr.ifr_addr.sa_family = AF_INET; - /* I want IP address attached to "if_name" */ - strncpy(ifr.ifr_name, if_name, IFNAMSIZ-1); - - if (flag==ETH_UDP_MODE) { - if ( ioctl(fd, SIOCGIFADDR, &ifr)<0 ) { - perror("IOCTL:"); - exit(-1); - } - snprintf(&rrh_ip[0],20,"%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); - LOG_I(RRH,"%s: IP address: %s\n",if_name,rrh_ip); - } else if (flag==ETH_RAW_MODE) { - if ( ioctl(fd, SIOCGIFHWADDR, &ifr)<0 ) { - perror("IOCTL:"); - exit(-1); - } - ether_ntoa_r ((unsigned char *)ifr.ifr_hwaddr.sa_data, rrh_mac); - LOG_I(RRH,"%s: MAC address: %s\n",if_name,rrh_mac); - } - - close(fd); - return 0; -} - - -static void print_help(void) { - - puts("Usage: \n"); - puts(" sudo -E chrt 99 ./rrh -n1 -g6 -v -t -i lo -m1"); - puts("Options:\n"); - puts("\t -n create eNB module\n"); - puts("\t -u create UE module\n"); - puts("\t -g define global log level\n"); - puts("\t -i set the RRH interface (default lo)\n"); - puts("\t -m set ethernet mode to be used by RRH, valid options: (1:raw, 0:udp) \n"); - puts("\t -r define rrh log level\n"); - puts("\t -e define eNB log level\n"); - puts("\t -x enable real time bahaviour\n"); - puts("\t -v enable vcd dump\n"); - puts("\t -l enable loopback mode\n"); - puts("\t -t enable measurements\n"); - puts("\t -h display info\n"); - -} - - -void *timer_proc(void *arg) { - - timer_t timerid; - struct itimerspec *timer= (struct itimerspec *)arg ; // the timer data structure - struct itimerspec *old_value; - - -#ifdef DEADLINE_SCHEDULER - struct sched_attr attr; - unsigned int flags = 0; - - attr.size = sizeof(attr); - attr.sched_flags = 0; - attr.sched_nice = 0; - attr.sched_priority = 0; - - attr.sched_policy = SCHED_DEADLINE; - attr.sched_runtime = (0.1 * 100) * 10000; // - attr.sched_deadline = rt_period-30000;//(0.1 * 100) * 10000; - attr.sched_period = rt_period;//(0.1 * 100) * 10000; // each TX/RX thread has, as a function of RT PERIOD ?? - - if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] timer thread: sched_setattr failed\n"); - exit(-1); - } -#endif - - if (timer_create (CLOCK_REALTIME, NULL, &timerid) == -1) { - fprintf (stderr, "couldn't create a timer\n"); - perror (NULL); - exit (EXIT_FAILURE); - } - - signal(SIGALRM, timer_signal_handler); - LOG_I(RRH,"Timer has started!\n"); - timer_settime (timerid, 0, timer, old_value); - - while (!rrh_exit) { - sleep(1); - } - - timer_delete(timerid); - - return (0); -} - - -void timer_signal_handler(int sig) { - - if (sig == SIGALRM) { - pthread_mutex_lock(&timer_mutex); - hw_counter ++; - pthread_mutex_unlock(&timer_mutex); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_CNT, hw_counter);//USED ELSEWHERE - } -} - - -void signal_handler(int sig) { - - void *array[10]; - size_t size; - - if (sig==SIGSEGV) { - // get void*'s for all entries on the stack - size = backtrace(array, 10); - - // print out all the frames to stderr - fprintf(stderr, "Error: signal %d:\n", sig); - backtrace_symbols_fd(array, size, 2); - exit(-1); - } else { - printf("trying to exit gracefully...\n"); - rrh_exit = 1; - } -} - -void exit_fun(const char* s) { - if (s != NULL) { - printf("%s %s() Exiting RRH: %s\n",__FILE__, __FUNCTION__, s); - } - rrh_exit = 1; - exit (-1); -} - - diff --git a/targets/RT/USER/rrh_gw.h b/targets/RT/USER/rrh_gw.h deleted file mode 100644 index 739e2088b2..0000000000 --- a/targets/RT/USER/rrh_gw.h +++ /dev/null @@ -1,112 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file rrh_gw.h - * \brief header file for remote radio head gateway (RRH_gw) module - * \author Navid Nikaein, Katerina Trilyraki, Raymond Knopp - * \date 2015 - * \version 0.1 - * \company Eurecom - * \maintainer: navid.nikaein@eurecom.fr - * \note - * \warning very experimental - */ - -#ifndef RRH_GW_H_ -#define RRH_GW_H_ - -#include "ethernet_lib.h" -#include "vcd_signal_dumper.h" -#include "assertions.h" - -#define DEFAULT_PERIOD_NS 200000 /* default value is calculated for 25 PRB */ -#define RRH_UE_PORT 51000 -#define RRH_UE_DEST_IP "127.0.0.1" - -/*! \brief RRH supports two types of modules: eNB and UE - each module is associated with an ethernet device (device of ETH_IF) - and optionally with a RF device (device type can be USRP_B200/USRP_X300/BLADERF_IF/EXMIMO_IF/NONE_IF) - UE modules will always have RF device type NONE_IF */ -typedef struct { -/*! \brief module id */ - uint8_t id; -/*! \brief! loopback flag */ -uint8_t loopback; -/*! \brief measurement flag */ -uint8_t measurements; -/*! \brief module's ethernet device */ -openair0_device eth_dev; -/*! \brief pointer to RF module's device (pointer->since it's optional) */ -openair0_device *devs; -}rrh_module_t; - -/*! \fn void timer_signal_handler(int sig) - * \brief this function - * \param[in] signal type - * \return none - * \note - * @ingroup _oai -*/ -void timer_signal_handler(int); - -/*! \fn void *timer_proc(void *arg) - * \brief this function - * \param[in] - * \param[out] - * \return - * \note - * @ingroup _oai - */ -void *timer_proc(void *); - -/*! \fn void config_BBU_mod( rrh_module_t *mod_enb, uint8_t RT_flag,uint8_t NRT_flag) - * \brief receive and apply configuration to modules' optional device - * \param[in] *mod_enb pointer to module - * \param[in] RT_flag real time flag - * \return none - * \note - * @ingroup _oai - */ -void config_BBU_mod( rrh_module_t *mod_enb, uint8_t RT_flag, uint8_t NRT_flag); - -/*! \fn void config_UE_mod( rrh_module_t *dev_ue, uint8_t RT_flag,uint8_t NRT_flag) - * \brief this function - * \param[in] *mod_ue pointer to module - * \param[in] - * \return none - * \note - * @ingroup _oai - */ -void config_UE_mod( rrh_module_t *dev_ue, uint8_t RT_flag, uint8_t NRT_flag); - - - -void signal_handler(int sig); - -#endif diff --git a/targets/RT/USER/rrh_gw_externs.h b/targets/RT/USER/rrh_gw_externs.h deleted file mode 100644 index df59b9b1af..0000000000 --- a/targets/RT/USER/rrh_gw_externs.h +++ /dev/null @@ -1,55 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ -/*! \file rrh_gw_extern.h - * \brief rrh gatewy external vars - * \author Navid Nikaein, Katerina Trilyraki, Raymond Knopp - * \date 2015 - * \version 0.1 - * \company Eurecom - * \maintainer: navid.nikaein@eurecom.fr - * \note - * \warning very experimental - */ - -#ifndef RRH_GW_EXTERNS_H_ -#define RRH_GW_EXTERNS_H_ -extern char rf_config_file[1024]; - -extern openair0_timestamp timestamp_UE_tx[4] ,timestamp_UE_rx[4] ,timestamp_eNB_rx[4],timestamp_eNB_tx[4]; -extern openair0_vtimestamp hw_counter; -extern int32_t UE_tx_started,UE_rx_started,eNB_rx_started ,eNB_tx_started; -extern int32_t nsamps_UE[4],nsamps_eNB[4]; -extern int32_t overflow_rx_buffer_eNB[4],overflow_rx_buffer_UE[4]; -extern uint8_t rrh_exit; -extern int32_t **rx_buffer_eNB, **rx_buffer_UE; -extern unsigned int rt_period; -extern pthread_mutex_t timer_mutex; - - -#endif diff --git a/targets/RT/USER/rru_if4p5_single_thread.gtkw b/targets/RT/USER/rru_if4p5_single_thread.gtkw new file mode 100644 index 0000000000..3a9467bcbe --- /dev/null +++ b/targets/RT/USER/rru_if4p5_single_thread.gtkw @@ -0,0 +1,58 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Mon May 1 10:27:32 2017 +[*] +[dumpfile] "/home/knopp/oai/openairinterface5g/cmake_targets/oaisim_build_oai/build/oaisim.vcd" +[dumpfile_mtime] "Mon May 1 10:15:17 2017" +[dumpfile_size] 3932640 +[savefile] "/home/knopp/oai/openairinterface5g/targets/RT/USER/rru_if4p5_single_thread.gtkw" +[timestart] 15501300000 +[size] 1301 831 +[pos] 309 -10 +*-26.793451 15711000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 284 +[signals_width] 262 +[sst_expanded] 1 +[sst_vpaned_height] 354 +@28 +functions.trx_read +functions.trx_write +@24 +variables.trx_write_flags[63:0] +@28 +functions.trx_write_if +functions.send_if4 +functions.trx_read_if +functions.recv_if4 +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +variables.trx_ts_ue[63:0] +variables.trx_tst_ue[63:0] +@28 +functions.phy_procedures_ru_feptx_ofdm0 +functions.phy_procedures_ru_feprx0 +functions.phy_ru_prach_rx +@24 +variables.subframe_number_TX0_RU[63:0] +variables.frame_number_TX0_RU[63:0] +variables.subframe_number_RX0_RU[63:0] +variables.frame_number_RX0_RU[63:0] +variables.frame_number_RX0_UE[63:0] +variables.subframe_RX0_UE[63:0] +variables.frame_number_RX1_UE[63:0] +variables.subframe_RX1_UE[63:0] +variables.frame_number_TX0_UE[63:0] +variables.subframe_TX0_UE[63:0] +variables.frame_number_TX1_UE[63:0] +variables.subframe_TX1_UE[63:0] +@28 +functions.ue_thread_rxtx0 +functions.ue_thread_rxtx1 +functions.rx_pdcch +functions.pdsch_procedures_si +functions.pdsch_procedures +@29 +functions.pdsch_procedures_ra +[pattern_trace] 1 +[pattern_trace] 0 diff --git a/targets/RT/USER/rru_if4p5_usrp.gtkw b/targets/RT/USER/rru_if4p5_usrp.gtkw new file mode 100644 index 0000000000..1a13e6d15f --- /dev/null +++ b/targets/RT/USER/rru_if4p5_usrp.gtkw @@ -0,0 +1,49 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Sun Jan 15 07:26:50 2017 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Sun Jan 15 07:04:19 2017" +[dumpfile_size] 18140627 +[savefile] "/home/uprru1/oai/openairinterface5g/targets/RT/USER/rru_if4p5_usrp.gtkw" +[timestart] 29977510000 +[size] 1301 716 +[pos] 309 0 +*-21.793451 29983948856 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 284 +[signals_width] 262 +[sst_expanded] 1 +[sst_vpaned_height] 294 +@28 +functions.trx_read +functions.trx_write +@25 +variables.trx_write_flags[63:0] +@28 +functions.trx_write_if +functions.send_if4 +functions.trx_read_if +functions.recv_if4 +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@28 +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@28 +functions.eNB_thread_rxtx1 +@24 +variables.frame_number_RX1_eNB[63:0] +variables.subframe_number_RX1_eNB[63:0] +variables.frame_number_TX1_eNB[63:0] +variables.subframe_number_TX1_eNB[63:0] +@28 +functions.phy_eNB_ofdm_mod_l +functions.phy_eNB_slot_fep +functions.phy_enb_prach_rx +[pattern_trace] 1 +[pattern_trace] 0 diff --git a/targets/RT/USER/rru_if5_usrp.gtkw b/targets/RT/USER/rru_if5_usrp.gtkw new file mode 100644 index 0000000000..ff0c116434 --- /dev/null +++ b/targets/RT/USER/rru_if5_usrp.gtkw @@ -0,0 +1,161 @@ +[*] +[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI +[*] Sun Jul 31 17:45:23 2016 +[*] +[dumpfile] "/tmp/openair_dump_eNB.vcd" +[dumpfile_mtime] "Sun Jul 31 17:44:51 2016" +[dumpfile_size] 26766405 +[savefile] "/home/papillon/openairinterface5g/targets/RT/USER/rru_if5_usrp.gtkw" +[timestart] 0 +[size] 1301 716 +[pos] 309 0 +*-19.793451 29983948856 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +[sst_width] 284 +[signals_width] 262 +[sst_expanded] 1 +[sst_vpaned_height] 294 +@28 +functions.trx_read +functions.trx_write +functions.send_if5 +@29 +functions.trx_write_if +@28 +functions.recv_if5 +functions.trx_read_if +@24 +variables.trx_ts[63:0] +variables.trx_tst[63:0] +@28 +functions.eNB_thread_rxtx0 +@24 +variables.frame_number_RX0_eNB[63:0] +variables.subframe_number_RX0_eNB[63:0] +variables.frame_number_TX0_eNB[63:0] +variables.subframe_number_TX0_eNB[63:0] +@28 +functions.eNB_thread_rxtx1 +@24 +variables.frame_number_RX1_eNB[63:0] +variables.subframe_number_RX1_eNB[63:0] +variables.frame_number_TX1_eNB[63:0] +variables.subframe_number_TX1_eNB[63:0] +@28 +functions.phy_enb_sfgen +functions.phy_eNB_slot_fep +functions.phy_enb_prach_rx +@24 +variables.dci_info[63:0] +variables.ue0_BO[63:0] +@420 +variables.ue0_BSR[63:0] +variables.ue0_timing_advance[63:0] +@28 +functions.macxface_initiate_ra_proc +functions.macxface_terminate_ra_proc +functions.phy_enb_ulsch_msg3 +functions.macxface_SR_indication +@420 +variables.ue0_SR_ENERGY[63:0] +variables.ue0_SR_THRES[63:0] +@28 +functions.phy_enb_ulsch_decoding0 +@24 +variables.ue0_res0[63:0] +@420 +variables.ue0_rssi0[63:0] +variables.ue0_MCS0[63:0] +variables.ue0_RB0[63:0] +@24 +variables.ue0_ROUND0[63:0] +variables.ue0_SFN0[63:0] +@28 +functions.phy_enb_ulsch_decoding1 +@24 +variables.ue0_res1[63:0] +@420 +variables.ue0_rssi1[63:0] +variables.ue0_MCS1[63:0] +variables.ue0_RB1[63:0] +@24 +variables.ue0_ROUND1[63:0] +variables.ue0_SFN1[63:0] +@28 +functions.phy_enb_ulsch_decoding2 +@24 +variables.ue0_res2[63:0] +@420 +variables.ue0_rssi2[63:0] +variables.ue0_MCS2[63:0] +variables.ue0_RB2[63:0] +@24 +variables.ue0_ROUND2[63:0] +variables.ue0_SFN2[63:0] +@28 +functions.phy_enb_ulsch_decoding3 +@24 +variables.ue0_res3[63:0] +@420 +variables.ue0_rssi3[63:0] +variables.ue0_MCS3[63:0] +variables.ue0_RB3[63:0] +@24 +variables.ue0_ROUND3[63:0] +variables.ue0_SFN3[63:0] +@28 +functions.phy_enb_ulsch_decoding4 +@420 +variables.ue0_rssi4[63:0] +@24 +variables.ue0_res4[63:0] +@420 +variables.ue0_MCS4[63:0] +variables.ue0_RB4[63:0] +@24 +variables.ue0_ROUND4[63:0] +variables.ue0_SFN4[63:0] +@28 +functions.phy_enb_ulsch_decoding5 +@24 +variables.ue0_res5[63:0] +@420 +variables.ue0_rssi5[63:0] +variables.ue0_MCS5[63:0] +variables.ue0_RB5[63:0] +@24 +variables.ue0_ROUND5[63:0] +variables.ue0_SFN5[63:0] +@28 +functions.phy_enb_ulsch_decoding6 +@24 +variables.ue0_res6[63:0] +@420 +variables.ue0_rssi6[63:0] +variables.ue0_MCS6[63:0] +variables.ue0_RB6[63:0] +@24 +variables.ue0_ROUND6[63:0] +variables.ue0_SFN6[63:0] +@28 +functions.phy_enb_ulsch_decoding7 +@24 +variables.ue0_res7[63:0] +@420 +variables.ue0_rssi7[63:0] +variables.ue0_MCS7[63:0] +variables.ue0_RB7[63:0] +@24 +variables.ue0_ROUND7[63:0] +variables.ue0_SFN7[63:0] +@28 +functions.phy_enb_prach_rx +functions.phy_eNB_dlsch_encoding +functions.phy_eNB_dlsch_modulation +functions.phy_eNB_dlsch_scrambling +functions.phy_enb_pdcch_tx +functions.phy_enb_rs_tx +functions.rrc_mac_config_req +functions.rlc_data_req +functions.udp_enb_task +[pattern_trace] 1 +[pattern_trace] 0 diff --git a/targets/RT/USER/rt_wrapper.c b/targets/RT/USER/rt_wrapper.c index ed9eb4e798..c1e5996d44 100644 --- a/targets/RT/USER/rt_wrapper.c +++ b/targets/RT/USER/rt_wrapper.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rt_wrapper.h * \brief provides a wrapper for the timing function, runtime calculations for real-time opeartions depending on weather RTAI or DEADLINE_SCHEDULER kernels are used or not @@ -37,12 +29,23 @@ * \note * \warning */ - +#define _GNU_SOURCE #include #include #include - +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "rt_wrapper.h" + +#include "openair1/PHY/defs.h" + static int latency_target_fd = -1; static int32_t latency_target_value = 0; /* Latency trick - taken from cyclictest.c @@ -78,8 +81,6 @@ void set_latency_target(void) { } -#ifndef RTAI - struct timespec interval, next, now, res; clockid_t clock_id = CLOCK_MONOTONIC; //other options are CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID RTIME rt_get_time_ns (void) @@ -257,12 +258,106 @@ int sched_getattr(pid_t pid,struct sched_attr *attr,unsigned int size, unsigned #endif -#else +void thread_top_init(char *thread_name, + int affinity, + uint64_t runtime, + uint64_t deadline, + uint64_t period) { + + MSC_START_USE(); + +#ifdef DEADLINE_SCHEDULER + struct sched_attr attr; + + unsigned int flags = 0; + + attr.size = sizeof(attr); + attr.sched_flags = 0; + attr.sched_nice = 0; + attr.sched_priority = 0; + + attr.sched_policy = SCHED_DEADLINE; + attr.sched_runtime = runtime; + attr.sched_deadline = deadline; + attr.sched_period = period; + + if (sched_setattr(0, &attr, flags) < 0 ) { + perror("[SCHED] eNB tx thread: sched_setattr failed\n"); + exit(1); + } + +#else //LOW_LATENCY + int policy, s, j; + struct sched_param sparam; + char cpu_affinity[1024]; + cpu_set_t cpuset; + + /* Set affinity mask to include CPUs 1 to MAX_CPUS */ + /* CPU 0 is reserved for UHD threads */ + /* CPU 1 is reserved for all RX_TX threads */ + /* Enable CPU Affinity only if number of CPUs >2 */ + CPU_ZERO(&cpuset); + +#ifdef CPU_AFFINITY + if (get_nprocs() > 2) + { + if (affinity == 0) + CPU_SET(0,&cpuset); + else + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_setaffinity_np"); + exit_fun("Error setting processor affinity"); + } + } +#endif //CPU_AFFINITY + + /* Check the actual affinity mask assigned to the thread */ + s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) { + perror( "pthread_getaffinity_np"); + exit_fun("Error getting processor affinity "); + } + memset(cpu_affinity,0,sizeof(cpu_affinity)); + for (j = 0; j < 1024; j++) + if (CPU_ISSET(j, &cpuset)) { + char temp[1024]; + sprintf (temp, " CPU_%d", j); + strcat(cpu_affinity, temp); + } + + memset(&sparam, 0, sizeof(sparam)); + sparam.sched_priority = sched_get_priority_max(SCHED_FIFO); + policy = SCHED_FIFO ; + + s = pthread_setschedparam(pthread_self(), policy, &sparam); + if (s != 0) { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } + + s = pthread_getschedparam(pthread_self(), &policy, &sparam); + if (s != 0) { + perror("pthread_getschedparam : "); + exit_fun("Error getting thread priority"); + } + + pthread_setname_np(pthread_self(), thread_name); + + LOG_I(HW, "[SCHED][eNB] %s started on CPU %d, sched_policy = %s , priority = %d, CPU Affinity=%s \n",thread_name,sched_getcpu(), + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + sparam.sched_priority, cpu_affinity ); + +#endif //LOW_LATENCY + + mlockall(MCL_CURRENT | MCL_FUTURE); -int rt_sleep_ns(RTIME x) -{ - rt_sleep(nano2count(x)); - return(0); } -#endif + diff --git a/targets/RT/USER/rt_wrapper.h b/targets/RT/USER/rt_wrapper.h index d67632054b..f9828d0db9 100644 --- a/targets/RT/USER/rt_wrapper.h +++ b/targets/RT/USER/rt_wrapper.h @@ -1,34 +1,26 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file rt_wrapper.h -* \brief provides a wrapper for the timing function for real-time opeartions depending on weather RTAI is used or not. It also implements an API for the SCHED_DEADLINE kernel scheduler. +* \brief provides a wrapper for the timing function for real-time opeartions. It also implements an API for the SCHED_DEADLINE kernel scheduler. * \author F. Kaltenberger and Navid Nikaein * \date 2013 * \version 0.1 @@ -38,10 +30,10 @@ * \warning This code will be removed when a legacy libc API becomes available. */ +#ifndef _RT_WRAPPER_H_ +#define _RT_WRAPPER_H_ -void set_latency_target(void); - -#ifndef RTAI +#define _GNU_SOURCE #include #include #include @@ -52,11 +44,26 @@ void set_latency_target(void); #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "UTIL/LOG/log_extern.h" +#include "msc.h" #define RTIME long long int #define rt_printk printf +void set_latency_target(void); + RTIME rt_get_time_ns (void); int rt_sleep_ns (RTIME x); @@ -115,12 +122,11 @@ int sched_getattr(pid_t pid,struct sched_attr *attr,unsigned int size, unsigned #define gettid() syscall(__NR_gettid) // for gettid -#else -#include -#include -#include -#include -int rt_sleep_ns(RTIME x); +void thread_top_init(char *thread_name, + int affinity, + uint64_t runtime, + uint64_t deadline, + uint64_t period); #endif diff --git a/targets/RT/USER/sched_dlsch.c b/targets/RT/USER/sched_dlsch.c deleted file mode 100644 index 48fac642a9..0000000000 --- a/targets/RT/USER/sched_dlsch.c +++ /dev/null @@ -1,354 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file sched_dlsch.c -* \brief DLSCH decoding thread (RTAI) -* \author R. Knopp, F. Kaltenberger -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr -* \note -* \warning -*/ -#include -#include -#include - -#include "rt_wrapper.h" - -#include - -#include "PHY/types.h" -#include "PHY/defs.h" -#include "PHY/extern.h" - -#include "SCHED/defs.h" - -#include "UTIL/LOG/vcd_signal_dumper.h" - -#define DEBUG_PHY - -/// Mutex for instance count on dlsch scheduling -pthread_mutex_t dlsch_mutex[8]; -/// Condition variable for dlsch thread -pthread_cond_t dlsch_cond[8]; - -pthread_t dlsch_threads[8]; -pthread_attr_t attr_dlsch_threads; -unsigned char dlsch_thread_indices[8]; - -// activity indicators for harq_pid's -int dlsch_instance_cnt[8]; -// process ids for cpu -int dlsch_cpuid[8]; -// subframe number for each harq_pid (needed to store ack in right place for UL) -int dlsch_subframe[8]; - -extern int oai_exit; - -/* -extern int dlsch_errors; -extern int dlsch_received; -extern int dlsch_errors_last; -extern int dlsch_received_last; -extern int dlsch_fer; -extern int current_dlsch_cqi; -*/ - -/** DLSCH Decoding Thread */ -static void * dlsch_thread(void *param) -{ - - //unsigned long cpuid; - unsigned char dlsch_thread_index = *((unsigned char *)param); - unsigned int ret=0; - uint8_t harq_pid; - - -#ifdef RTAI - RT_TASK *task; - char task_name[8]; -#endif - - int eNB_id = 0, UE_id = 0, CC_id=0; - PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[UE_id][CC_id]; - - if ((dlsch_thread_index <0) || (dlsch_thread_index>7)) { - LOG_E(PHY,"[SCHED][DLSCH] Illegal dlsch_thread_index %d (%p)!!!!\n",dlsch_thread_index,param); - return 0; - } - -#ifdef RTAI - sprintf(task_name,"DLSCH%d",dlsch_thread_index); - task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][DLSCH] Problem starting dlsch_thread_index %d (%s)!!!!\n",dlsch_thread_index,task_name); - return 0; - } else { - LOG_I(PHY,"[SCHED][DLSCH] dlsch_thread for process %d started with id %p\n", - dlsch_thread_index, - task); - } - -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - - //rt_set_runnable_on_cpuid(task,1); - //cpuid = rtai_cpuid(); - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - //dlsch_cpuid[dlsch_thread_index] = cpuid; - - while (!oai_exit) { - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_THREAD0+dlsch_thread_index,0); - - if (pthread_mutex_lock(&dlsch_mutex[dlsch_thread_index]) != 0) { - LOG_E(PHY,"[SCHED][DLSCH] error locking mutex.\n"); - } else { - - while (dlsch_instance_cnt[dlsch_thread_index] < 0) { - pthread_cond_wait(&dlsch_cond[dlsch_thread_index],&dlsch_mutex[dlsch_thread_index]); - } - - if (pthread_mutex_unlock(&dlsch_mutex[dlsch_thread_index]) != 0) { - LOG_E(PHY,"[SCHED][DLSCH] error unlocking mutex.\n"); - } - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_THREAD0+dlsch_thread_index,1); - - if (oai_exit) break; - - LOG_I(PHY,"[SCHED][DLSCH] Frame %d: Calling dlsch_decoding with dlsch_thread_index = %d\n",phy_vars_ue->frame_rx,dlsch_thread_index); - - - - if (phy_vars_ue->frame_rx < phy_vars_ue->dlsch_errors[eNB_id]) { - phy_vars_ue->dlsch_errors[eNB_id]=0; - phy_vars_ue->dlsch_received[eNB_id] = 0; - } - - harq_pid = dlsch_thread_index; - - if (phy_vars_ue->dlsch_ue[eNB_id][0]) { - - // rt_printk("[SCHED][DLSCH] Frame %d, slot %d, start %llu, end %llu, proc time: %llu ns\n",phy_vars_ue->frame,last_slot,time0,time1,(time1-time0)); - - dlsch_unscrambling(&phy_vars_ue->lte_frame_parms, - 0, - phy_vars_ue->dlsch_ue[eNB_id][0], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G, - phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0], - 0, - dlsch_subframe[dlsch_thread_index]<<1); - - LOG_I(PHY,"[UE %d] PDSCH Calling dlsch_decoding for subframe %d, harq_pid %d, G%d\n", phy_vars_ue->Mod_id,dlsch_subframe[dlsch_thread_index], harq_pid, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G); - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0+dlsch_thread_index,1); - ret = dlsch_decoding(phy_vars_ue, - phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->dlsch_ue[eNB_id][0], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid], - dlsch_subframe[dlsch_thread_index], - harq_pid, - 1, // is_crnti - 0); // llr8_flag - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DECODING0+dlsch_thread_index,0); - - LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid, - phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],ret, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); - - - if (ret == (1+MAX_TURBO_ITERATIONS)) { - phy_vars_ue->dlsch_errors[eNB_id]++; - -#ifdef DEBUG_PHY - LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - harq_pid,phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs); -#endif - } else { - LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH (rv %d,mcs %d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - harq_pid,phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index], - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs); - -#ifdef OPENAIR2 - mac_xface->ue_send_sdu(phy_vars_ue->Mod_id, - 0, // CC_id - phy_vars_ue->frame_rx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->b, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS>>3, - eNB_id); -#endif - phy_vars_ue->total_TBS[eNB_id] = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS + phy_vars_ue->total_TBS[eNB_id]; - phy_vars_ue->total_received_bits[eNB_id] = phy_vars_ue->total_received_bits[eNB_id] + phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS; - } - } - - // this is done in main thread - /* - if (phy_vars_ue->frame % 100 == 0) { - if ((phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]) != 0) - phy_vars_ue->dlsch_fer[eNB_id] = (100*(phy_vars_ue->dlsch_errors[eNB_id] - phy_vars_ue->dlsch_errors_last[eNB_id]))/(phy_vars_ue->dlsch_received[eNB_id] - phy_vars_ue->dlsch_received_last[eNB_id]); - phy_vars_ue->dlsch_errors_last[eNB_id] = phy_vars_ue->dlsch_errors[eNB_id]; - phy_vars_ue->dlsch_received_last[eNB_id] = phy_vars_ue->dlsch_received[eNB_id]; - } - */ - - -#ifdef DEBUG_PHY - - if (phy_vars_ue->dlsch_ue[eNB_id][0]) { - LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", - phy_vars_ue->Mod_id, - phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid, - phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],ret, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, - phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); - - if (phy_vars_ue->frame_rx%100==0) { - LOG_D(PHY,"[UE %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n", - phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index], - phy_vars_ue->dlsch_errors[eNB_id], - phy_vars_ue->dlsch_received[eNB_id], - phy_vars_ue->dlsch_fer[eNB_id], - phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB_id]); - } - } else { - LOG_I( PHY,"[UE %d][PDSCH ?/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (phy_vars_ue->dlsch_ue[eNB_id][0] == 0)\n", - phy_vars_ue->Mod_id, - harq_pid, - phy_vars_ue->frame_rx, dlsch_subframe[dlsch_thread_index], ret ); - } - -#endif - - if (pthread_mutex_lock(&dlsch_mutex[dlsch_thread_index]) != 0) { - msg("[openair][SCHED][DLSCH] error locking mutex.\n"); - } else { - dlsch_instance_cnt[dlsch_thread_index]--; - - if (pthread_mutex_unlock(&dlsch_mutex[dlsch_thread_index]) != 0) { - msg("[openair][SCHED][DLSCH] error unlocking mutex.\n"); - } - } - - } - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - - msg("[openair][SCHED][DLSCH] DLSCH thread %d exiting\n",dlsch_thread_index); - - return 0; -} - -int init_dlsch_threads(void) -{ - - int error_code; - struct sched_param p; - unsigned char dlsch_thread_index; - - pthread_attr_init (&attr_dlsch_threads); - pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE); - //attr_dlsch_threads.priority = 1; - - p.sched_priority = OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_dlsch_threads, &p); -#ifndef RTAI_ISNT_POSIX - pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO); -#endif - - for(dlsch_thread_index=0; dlsch_thread_index<8; dlsch_thread_index++) { - - pthread_mutex_init(&dlsch_mutex[dlsch_thread_index],NULL); - pthread_cond_init(&dlsch_cond[dlsch_thread_index],NULL); - - dlsch_instance_cnt[dlsch_thread_index] = -1; - dlsch_thread_indices[dlsch_thread_index] = dlsch_thread_index; - rt_printk("[openair][SCHED][DLSCH][INIT] Allocating DLSCH thread for dlsch_thread_index %d (%p)\n",dlsch_thread_index,&dlsch_thread_indices[dlsch_thread_index]); - error_code = pthread_create(&dlsch_threads[dlsch_thread_index], - &attr_dlsch_threads, - dlsch_thread, - (void *)&dlsch_thread_indices[dlsch_thread_index]); - - if (error_code!= 0) { - rt_printk("[openair][SCHED][DLSCH][INIT] Could not allocate dlsch_thread %d, error %d\n",dlsch_thread_index,error_code); - return(error_code); - } else { - rt_printk("[openair][SCHED][DLSCH][INIT] Allocate dlsch_thread %d successful\n",dlsch_thread_index); - } - } - - return(0); -} - -void cleanup_dlsch_threads(void) -{ - - unsigned char dlsch_thread_index; - - for(dlsch_thread_index=0; dlsch_thread_index<8; dlsch_thread_index++) { - // pthread_exit(&dlsch_threads[dlsch_thread_index]); - rt_printk("[openair][SCHED][DLSCH] Scheduling dlsch_thread %d to exit\n",dlsch_thread_index); - - dlsch_instance_cnt[dlsch_thread_index] = 0; - - if (pthread_cond_signal(&dlsch_cond[dlsch_thread_index]) != 0) - rt_printk("[openair][SCHED][DLSCH] ERROR pthread_cond_signal\n"); - else - rt_printk("[openair][SCHED][DLSCH] Signalled dlsch_thread %d to exit\n",dlsch_thread_index); - - rt_printk("[openair][SCHED][DLSCH] Exiting ...\n"); - pthread_cond_destroy(&dlsch_cond[dlsch_thread_index]); - pthread_mutex_destroy(&dlsch_mutex[dlsch_thread_index]); - } -} diff --git a/targets/RT/USER/sched_rx_pdsch.c b/targets/RT/USER/sched_rx_pdsch.c deleted file mode 100644 index e792fe737d..0000000000 --- a/targets/RT/USER/sched_rx_pdsch.c +++ /dev/null @@ -1,321 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file sched_dlsch.c -* \brief DLSCH decoding thread (RTAI) -* \author R. Knopp, F. Kaltenberger -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr -* \note -* \warning -*/ -#include -#include -#include - -#include "rt_wrapper.h" - -#include - -#include "PHY/types.h" -#include "PHY/defs.h" -#include "PHY/extern.h" -#include "SCHED/defs.h" -#include "SCHED/extern.h" - -#include "UTIL/LOG/vcd_signal_dumper.h" - -RTIME time0,time1; - -#define DEBUG_PHY - -/// Mutex for instance count on rx_pdsch scheduling -pthread_mutex_t rx_pdsch_mutex; -/// Condition variable for rx_pdsch thread -pthread_cond_t rx_pdsch_cond; - -pthread_t rx_pdsch_thread_var; -pthread_attr_t attr_rx_pdsch_thread; - -// activity indicators for harq_pid's -int rx_pdsch_instance_cnt; -// process ids for cpu -int rx_pdsch_cpuid; -// subframe number for each harq_pid (needed to store ack in right place for UL) -int rx_pdsch_slot; - -extern int oai_exit; -extern pthread_mutex_t dlsch_mutex[8]; -extern int dlsch_instance_cnt[8]; -extern int dlsch_subframe[8]; -extern pthread_cond_t dlsch_cond[8]; - -/** RX_PDSCH Decoding Thread */ -static void * rx_pdsch_thread(void *param) -{ - - //unsigned long cpuid; - uint8_t dlsch_thread_index = 0; - uint8_t pilot2,harq_pid,subframe; - // uint8_t last_slot; - - uint8_t dual_stream_UE = 0; - uint8_t i_mod = 0; - - -#ifdef RTAI - RT_TASK *task; -#endif - - int m,eNB_id = 0; - int eNB_id_i = 1; - PHY_VARS_UE *UE = PHY_vars_UE_g[0][0]; - -#ifdef RTAI - task = rt_task_init_schmod(nam2num("RX_PDSCH_THREAD"), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][RX_PDSCH] Problem starting rx_pdsch thread!!!!\n"); - return 0; - } else { - LOG_I(PHY,"[SCHED][RX_PDSCH] rx_pdsch_thread started for with id %p\n",task); - } - -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - - //rt_set_runnable_on_cpuid(task,1); - //cpuid = rtai_cpuid(); - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - if (UE->lte_frame_parms.Ncp == NORMAL) { // normal prefix - pilot2 = 7; - } else { // extended prefix - pilot2 = 6; - } - - - while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_THREAD, 0); - - if (pthread_mutex_lock(&rx_pdsch_mutex) != 0) { - LOG_E(PHY,"[SCHED][RX_PDSCH] error locking mutex.\n"); - } else { - while (rx_pdsch_instance_cnt < 0) { - pthread_cond_wait(&rx_pdsch_cond,&rx_pdsch_mutex); - } - - if (pthread_mutex_unlock(&rx_pdsch_mutex) != 0) { - LOG_E(PHY,"[SCHED][RX_PDSCH] error unlocking mutex.\n"); - } - } - - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_THREAD, 1); - - // last_slot = rx_pdsch_slot; - subframe = UE->slot_rx>>1; - // Important! assumption that PDCCH procedure of next SF is not called yet - harq_pid = UE->dlsch_ue[eNB_id][0]->current_harq_pid; - UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&UE->lte_frame_parms, - UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb, - UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even, - get_Qm(UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs), - UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl, - UE->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols, - UE->frame_rx,subframe); - - if ((UE->transmission_mode[eNB_id] == 5) && - (UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) && - (openair_daq_vars.use_ia_receiver > 0)) { - dual_stream_UE = 1; - eNB_id_i = UE->n_connected_eNB; - - if (openair_daq_vars.use_ia_receiver == 2) { - i_mod = get_Qm(((UE->frame_rx%1024)/3)%28); - } else { - i_mod = get_Qm(UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs); - } - } else { - dual_stream_UE = 0; - eNB_id_i = eNB_id+1; - i_mod = 0; - } - - if (oai_exit) break; - - LOG_D(PHY,"[SCHED][RX_PDSCH] Frame %d, slot %d: Calling rx_pdsch_decoding with harq_pid %d\n",UE->frame_rx,UE->slot_rx,harq_pid); - - - // Check if we are in even or odd slot - if (UE->slot_rx%2) { // odd slots - - // measure time - //time0 = rt_get_time_ns(); - // rt_printk("[SCHED][RX_PDSCH][before rx_pdsch] Frame %d, slot %d, time %llu\n",UE->frame,last_slot,rt_get_time_ns()); - for (m=pilot2; mlte_frame_parms.symbols_per_tti; m++) { - - rx_pdsch(UE, - PDSCH, - eNB_id, - eNB_id_i, - subframe, - m, - 0, - dual_stream_UE, - i_mod, - harq_pid); - - } - - // time1 = rt_get_time_ns(); - // rt_printk("[SCHED][RX_PDSCH] Frame %d, slot %d, start %llu, end %llu, proc time: %llu ns\n",UE->frame_rx,last_slot,time0,time1,(time1-time0)); - - dlsch_thread_index = harq_pid; - - if (pthread_mutex_lock (&dlsch_mutex[dlsch_thread_index]) != 0) { // Signal MAC_PHY Scheduler - LOG_E(PHY,"[UE %d] ERROR pthread_mutex_lock\n",UE->Mod_id); // lock before accessing shared resource - // VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - //return(-1); - } - - dlsch_instance_cnt[dlsch_thread_index]++; - dlsch_subframe[dlsch_thread_index] = subframe; - pthread_mutex_unlock (&dlsch_mutex[dlsch_thread_index]); - - if (dlsch_instance_cnt[dlsch_thread_index] == 0) { - if (pthread_cond_signal(&dlsch_cond[dlsch_thread_index]) != 0) { - LOG_E(PHY,"[UE %d] ERROR pthread_cond_signal for dlsch_cond[%d]\n",UE->Mod_id,dlsch_thread_index); - // VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - //return(-1); - } - } else { - LOG_W(PHY,"[UE %d] DLSCH thread for dlsch_thread_index %d busy!!!\n",UE->Mod_id,dlsch_thread_index); - // VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); - //return(-1); - } - - } else { // even slots - - for (m=UE->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols; mlte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0, // first_symbol_flag - dual_stream_UE, - i_mod, - harq_pid); - } - } - - - if (pthread_mutex_lock(&rx_pdsch_mutex) != 0) { - msg("[openair][SCHED][RX_PDSCH] error locking mutex.\n"); - } else { - rx_pdsch_instance_cnt--; - - if (pthread_mutex_unlock(&rx_pdsch_mutex) != 0) { - msg("[openair][SCHED][RX_PDSCH] error unlocking mutex.\n"); - } - } - - } - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - - LOG_D(PHY,"[openair][SCHED][RX_PDSCH] RX_PDSCH thread exiting\n"); - - return 0; -} - -int init_rx_pdsch_thread(void) -{ - - int error_code; - struct sched_param p; - - pthread_mutex_init(&rx_pdsch_mutex,NULL); - - pthread_cond_init(&rx_pdsch_cond,NULL); - - pthread_attr_init (&attr_rx_pdsch_thread); - pthread_attr_setstacksize(&attr_rx_pdsch_thread,OPENAIR_THREAD_STACK_SIZE); - - //attr_rx_pdsch_thread.priority = 1; - - p.sched_priority = OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_rx_pdsch_thread, &p); -#ifndef RTAI_ISNT_POSIX - pthread_attr_setschedpolicy (&attr_rx_pdsch_thread, SCHED_FIFO); -#endif - - rx_pdsch_instance_cnt = -1; - rt_printk("[openair][SCHED][RX_PDSCH][INIT] Allocating RX_PDSCH thread\n"); - error_code = pthread_create(&rx_pdsch_thread_var, - &attr_rx_pdsch_thread, - rx_pdsch_thread, - 0); - - if (error_code!= 0) { - rt_printk("[openair][SCHED][RX_PDSCH][INIT] Could not allocate rx_pdsch_thread, error %d\n",error_code); - return(error_code); - } else { - rt_printk("[openair][SCHED][RX_PDSCH][INIT] Allocate rx_pdsch_thread successful\n"); - return(0); - } - -} - -void cleanup_rx_pdsch_thread(void) -{ - - rt_printk("[openair][SCHED][RX_PDSCH] Scheduling rx_pdsch_thread to exit\n"); - - rx_pdsch_instance_cnt = 0; - - if (pthread_cond_signal(&rx_pdsch_cond) != 0) - rt_printk("[openair][SCHED][RX_PDSCH] ERROR pthread_cond_signal\n"); - else - rt_printk("[openair][SCHED][RX_PDSCH] Signalled rx_pdsch_thread to exit\n"); - - rt_printk("[openair][SCHED][RX_PDSCH] Exiting ...\n"); - pthread_cond_destroy(&rx_pdsch_cond); - pthread_mutex_destroy(&rx_pdsch_mutex); -} diff --git a/targets/RT/USER/sched_ulsch.c b/targets/RT/USER/sched_ulsch.c deleted file mode 100644 index 3ab0c312f5..0000000000 --- a/targets/RT/USER/sched_ulsch.c +++ /dev/null @@ -1,255 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file sched_ulsch.c -* \brief ULSCH decoding thread (RTAI) -* \author R. Knopp, F. Kaltenberger -* \date 2011 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr -* \note -* \warning -*/ -#include -#include -#include - -#include "rt_wrapper.h" - -#include - -#include "PHY/types.h" -#include "PHY/defs.h" -#include "PHY/extern.h" - -#include "SCHED/defs.h" - -#include "MAC_INTERFACE/extern.h" - -#ifdef CBMIMO1 -#include "ARCH/CBMIMO1/DEVICE_DRIVER/cbmimo1_device.h" -#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h" -#include "ARCH/CBMIMO1/DEVICE_DRIVER/defs.h" -#endif // CBMIMO1 - - - -#define DEBUG_PHY - -/// Mutex for instance count on ulsch scheduling -pthread_mutex_t ulsch_mutex[NUMBER_OF_UE_MAX]; -/// Condition variable for ulsch thread -pthread_cond_t ulsch_cond[NUMBER_OF_UE_MAX]; - -pthread_t ulsch_threads[NUMBER_OF_UE_MAX]; -pthread_attr_t attr_ulsch_threads; - -// activity indicators for harq_pid's -int ulsch_instance_cnt[NUMBER_OF_UE_MAX]; -// process ids for cpu -int ulsch_cpuid[NUMBER_OF_UE_MAX]; -// subframe number for each harq_pid (needed to store ack in right place for UL) -int ulsch_subframe[NUMBER_OF_UE_MAX]; - -extern int oai_exit; - -/* -extern int ulsch_errors; -extern int ulsch_received; -extern int ulsch_errors_last; -extern int ulsch_received_last; -extern int ulsch_fer; -extern int current_ulsch_cqi; -*/ - -/** ULSCH Decoding Thread */ -static void * ulsch_thread(void *param) -{ - - //unsigned long cpuid; - unsigned int ulsch_thread_index = (unsigned int)param; - - RTIME time_in,time_out; -#ifdef RTAI - RT_TASK *task; - char ulsch_thread_name[64]; -#endif - - int eNB_id = 0, UE_id = 0; - PHY_VARS_eNB *phy_vars_eNB = PHY_vars_eNB_g[eNB_id]; - - if ((ulsch_thread_index <0) || (ulsch_thread_index>NUMBER_OF_UE_MAX)) { - LOG_E(PHY,"[SCHED][ULSCH] Illegal ulsch_thread_index %d!!!!\n",ulsch_thread_index); - return 0; - } - -#ifdef RTAI - sprintf(ulsch_thread_name,"ULSCH_THREAD%d",ulsch_thread_index); - - LOG_I(PHY,"[SCHED][ULSCH] starting ulsch_thread %s for process %d\n", - ulsch_thread_name, - ulsch_thread_index); - - task = rt_task_init_schmod(nam2num(ulsch_thread_name), 0, 0, 0, SCHED_FIFO, 0xF); - - if (task==NULL) { - LOG_E(PHY,"[SCHED][ULSCH] Problem starting ulsch_thread_index %d!!!!\n",ulsch_thread_index); - return 0; - } else { - LOG_I(PHY,"[SCHED][ULSCH] ulsch_thread for process %d started with id %p\n", - ulsch_thread_index, - task); - } - -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - - //rt_set_runnable_on_cpuid(task,1); - //cpuid = rtai_cpuid(); - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - //ulsch_cpuid[ulsch_thread_index] = cpuid; - - while (!oai_exit) { - - if (pthread_mutex_lock(&ulsch_mutex[ulsch_thread_index]) != 0) { - LOG_E(PHY,"[SCHED][ULSCH] error locking mutex.\n"); - } else { - - while (ulsch_instance_cnt[ulsch_thread_index] < 0) { - pthread_cond_wait(&ulsch_cond[ulsch_thread_index],&ulsch_mutex[ulsch_thread_index]); - } - - if (pthread_mutex_unlock(&ulsch_mutex[ulsch_thread_index]) != 0) { - LOG_E(PHY,"[SCHED][ULSCH] error unlocking mutex.\n"); - } - } - - if (oai_exit) break; - - LOG_D(PHY,"[SCHED][ULSCH] Frame %d: Calling ulsch_decoding with ulsch_thread_index = %d\n",phy_vars_eNB->proc[0].frame_tx,ulsch_thread_index); - - time_in = rt_get_time_ns(); - - ulsch_decoding_procedures(ulsch_subframe[ulsch_thread_index]<<1,ulsch_thread_index,phy_vars_eNB,0); - - time_out = rt_get_time_ns(); - - if (pthread_mutex_lock(&ulsch_mutex[ulsch_thread_index]) != 0) { - msg("[openair][SCHED][ULSCH] error locking mutex.\n"); - } else { - ulsch_instance_cnt[ulsch_thread_index]--; - - if (pthread_mutex_unlock(&ulsch_mutex[ulsch_thread_index]) != 0) { - msg("[openair][SCHED][ULSCH] error unlocking mutex.\n"); - } - } - } - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - - msg("[openair][SCHED][ULSCH] ULSCH thread %d exiting\n",ulsch_thread_index); - - return 0; -} - -int init_ulsch_threads(void) -{ - - int error_code, return_code=0; - struct sched_param p; - int ulsch_thread_index; - - // later loop on all harq_pids, do 0 for now - for (ulsch_thread_index=0; ulsch_thread_index. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file lte-softmodem.c -* \brief main program to control HW and scheduling -* \author R. Knopp, F. Kaltenberger -* \date 2012 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr -* \note -* \warning -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "rt_wrapper.h" - -#define TIMER_ONESHOT_MODE -#define FRAME_PERIOD 10000000ULL -#define DAQ_PERIOD 500000ULL -#define LTE_SLOTS_PER_FRAME 20 - -#ifdef RTAI -static SEM *mutex; -//static CND *cond; - -static long int thread0; -static long int thread1; -//static long int sync_thread; -#else -#define OPENAIR_THREAD_STACK_SIZE 8192 -#define OPENAIR_THREAD_PRIORITY 255 -pthread_t thread0; -//pthread_t thread1; -pthread_attr_t attr_dlsch_threads; -struct sched_param sched_param_dlsch; -#endif - -int oai_exit = 0; - -struct timing_info_t { - //unsigned int frame, hw_slot, last_slot, next_slot; - RTIME time_min, time_max, time_avg, time_last, time_now; - //unsigned int mbox0, mbox1, mbox2, mbox_target; - unsigned int n_samples; -} timing_info; - -void signal_handler(int sig) -{ - void *array[10]; - size_t size; - - if (sig==SIGSEGV) { - // get void*'s for all entries on the stack - size = backtrace(array, 10); - - // print out all the frames to stderr - fprintf(stderr, "Error: signal %d:\n", sig); - backtrace_symbols_fd(array, size, 2); - exit(-1); - } else { - oai_exit=1; - } -} - -void exit_fun(const char* s) -{ - void *array[10]; - size_t size; - - printf("Exiting: %s\n",s); - - oai_exit=1; - //rt_sleep_ns(FRAME_PERIOD); - - //exit (-1); -} - -int frame=0,slot=0; - -/* This is the main eNB thread. It gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */ -static void *eNB_thread(void *arg) -{ -#ifdef RTAI - RT_TASK *task; - RTIME now; -#endif - unsigned char last_slot, next_slot; - RTIME time_in, time_diff; - int ret; - -#ifdef RTAI - task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF); - printf("Started eNB thread (id %p)\n",task); -#ifndef TIMER_ONESHOT_MODE - now = rt_get_time(); - ret = rt_task_make_periodic(task, now, nano2count(DAQ_PERIOD)); - - if (ret!=0) - printf("Problem with periodic timer\n"); - -#endif -#endif - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - - timing_info.time_min = 100000000ULL; - timing_info.time_max = 0; - timing_info.time_avg = 0; - timing_info.n_samples = 0; - - while (!oai_exit) { - time_in = rt_get_time_ns(); -#ifdef TIMER_ONESHOT_MODE - ret = rt_sleep_ns(DAQ_PERIOD); - - if (ret) - printf("eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame,time_in,ret); - -#else - rt_task_wait_period(); -#endif - time_diff = rt_get_time_ns() - time_in; - - if (time_diff > timing_info.time_max) - timing_info.time_max = time_diff; - - if (time_diff < timing_info.time_min) - timing_info.time_min = time_diff; - - timing_info.time_avg = (timing_info.time_avg*timing_info.n_samples + time_diff)/(timing_info.n_samples+1); - timing_info.n_samples++; - - last_slot = (slot)%LTE_SLOTS_PER_FRAME; - - if (last_slot <0) - last_slot+=20; - - next_slot = (slot+3)%LTE_SLOTS_PER_FRAME; - - slot++; - - if (slot==20) { - slot=0; - frame++; - } - } - - printf("eNB_thread: finished, ran %d times.\n",frame); - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - - // clean task -#ifdef RTAI - rt_task_delete(task); -#endif - printf("Task deleted. returning\n"); - return 0; -} - - -int main(int argc, char **argv) -{ - -#ifdef RTAI - RT_TASK *task; - RTIME period; -#else - int error_code; -#endif - int i,j,aa; - void *status; - - // to make a graceful exit when ctrl-c is pressed - signal(SIGSEGV, signal_handler); - signal(SIGINT, signal_handler); - -#ifndef RTAI - check_clock(); -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - -#ifdef RTAI - // make main thread LXRT soft realtime - task = rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF); - - // start realtime timer and scheduler -#ifdef TIMER_ONESHOT_MODE - rt_set_oneshot_mode(); - start_rt_timer(0); - printf("started RTAI timer in oneshot mode\n"); -#else - rt_set_periodic_mode(); - period = start_rt_timer(nano2count(500000)); - printf("started RTAI timer with period %llu ns\n",count2nano(period)); -#endif - - printf("Init mutex\n"); - //mutex = rt_get_adr(nam2num("MUTEX")); - mutex = rt_sem_init(nam2num("MUTEX"), 1); - - if (mutex==0) { - printf("Error init mutex\n"); - exit(-1); - } else - printf("mutex=%p\n",mutex); - -#endif - - rt_sleep_ns(10*FRAME_PERIOD); - -#ifndef RTAI - pthread_attr_init (&attr_dlsch_threads); - pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE); - //attr_dlsch_threads.priority = 1; - sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_dlsch_threads, &sched_param_dlsch); - pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO); -#endif - -#ifdef RTAI - thread0 = rt_thread_create(eNB_thread, NULL, 100000000); -#else - error_code = pthread_create(&thread0, &attr_dlsch_threads, eNB_thread, NULL); - - if (error_code!= 0) { - printf("[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code); - return(error_code); - } else { - printf("[lte-softmodem.c] Allocate eNB_thread successful\n"); - } - -#endif - printf("eNB threads created\n"); - - - - // wait for end of program - printf("TYPE TO TERMINATE\n"); - - //getchar(); - while (oai_exit==0) { - - printf("eNB Frame %d, hw_slot %d (time %llu): period %llu, sleep time (avg/min/max/samples) %llu / %llu / %llu / %d, ratio %f\n",frame,slot,rt_get_time_ns(),DAQ_PERIOD,timing_info.time_avg, - timing_info.time_min,timing_info.time_max,timing_info.n_samples,(double)timing_info.time_avg/DAQ_PERIOD); - - - rt_sleep_ns(100*FRAME_PERIOD); - } - - // stop threads -#ifdef RTAI - rt_thread_join(thread0); -#else - pthread_join(thread0,&status); -#endif - -#ifdef RTAI - stop_rt_timer(); -#endif - - return 0; -} - diff --git a/targets/RT/USER/stats.c b/targets/RT/USER/stats.c index 0dd7a80052..fa8ab38cb2 100644 --- a/targets/RT/USER/stats.c +++ b/targets/RT/USER/stats.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Form definition file generated by fdesign */ #include diff --git a/targets/RT/USER/stats.h b/targets/RT/USER/stats.h index 6e945cebdf..264c8f7af0 100644 --- a/targets/RT/USER/stats.h +++ b/targets/RT/USER/stats.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Header file generated by fdesign on Thu Aug 28 12:13:51 2014 */ #ifndef FD_stats_form_h_ diff --git a/targets/RT/USER/synctest.c b/targets/RT/USER/synctest.c deleted file mode 100644 index e365ad6728..0000000000 --- a/targets/RT/USER/synctest.c +++ /dev/null @@ -1,1326 +0,0 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - -/*! \file lte-softmodem.c -* \brief main program to control HW and scheduling -* \author R. Knopp, F. Kaltenberger -* \date 2012 -* \version 0.1 -* \company Eurecom -* \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr -* \note -* \warning -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "rt_wrapper.h" - -#include "PHY/types.h" -//#include "PHY/defs.h" -#include "openair0_lib.h" - -#include "UTIL/LOG/log.h" -#include "UTIL/LOG/vcd_signal_dumper.h" - -#if defined(ENABLE_ITTI) -# include "intertask_interface_init.h" -# include "timer.h" -# if defined(ENABLE_USE_MME) -# include "s1ap_eNB.h" -# include "sctp_eNB_task.h" -# endif -#endif - -#ifdef XFORMS -#include "PHY/TOOLS/lte_phy_scope.h" -#include "stats.h" -// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) -// at eNB 0, an UL scope for every UE -FD_lte_phy_scope_ue *form_ue[NUMBER_OF_UE_MAX]; -FD_lte_phy_scope_enb *form_enb[NUMBER_OF_UE_MAX]; -FD_stats_form *form_stats=NULL; -char title[255]; -unsigned char scope_enb_num_ue = 1; -#endif //XFORMS - -#ifdef EMOS -#include -#include - -//#define CHANSOUNDER_FIFO_SIZE 10485760 // 10 Mbytes FIFO -#define CHANSOUNDER_FIFO_SIZE 20971520 // 20 Mbytes FIFO -#define CHANSOUNDER_FIFO_MINOR 4 // minor of the FIFO device - this is /dev/rtf3 -#define CHANSOUNDER_FIFO_DEV "/dev/rtf4" -#endif - -#define TIMER_ONESHOT_MODE -#define FRAME_PERIOD 100000000ULL -#define DAQ_PERIOD 66667ULL -#define LTE_SLOTS_PER_FRAME 20 -#define RESAMPLING_FACTOR 2 -#define SAMPLES_PER_SLOT (15360/(1<stats_text, stats_buffer); - //rewind (UE_stats); - //fwrite (stats_buffer, 1, len, UE_stats); - - phy_scope_UE(form_ue[UE_id], - PHY_vars_UE_g[UE_id], - eNB_id, - UE_id,7); - - } else { - len = dump_eNB_stats (PHY_vars_eNB_g[0], stats_buffer, 0); - fl_set_object_label(form_stats->stats_text, stats_buffer); - - //rewind (eNB_stats); - //fwrite (stats_buffer, 1, len, eNB_stats); - for(UE_id=0; UE_id=5 - ret = gps_open("127.0.0.1","2947",gps_data); - - if (ret!=0) -#else - gps_data = gps_open("127.0.0.1","2947"); - - if (gps_data == NULL) -#endif - { - printf("[EMOS] Could not open GPS\n"); - //exit(-1); - } - -#if GPSD_API_MAJOR_VERSION>=4 - else if (gps_stream(gps_data, WATCH_ENABLE,NULL) != 0) -#else - else if (gps_query(gps_data, "w+x") != 0) -#endif - { - //sprintf(tmptxt,"Error sending command to GPS, gps_data = %x", gps_data); - printf("[EMOS] Error sending command to GPS\n"); - //exit(-1); - } else - printf("[EMOS] Opened GPS, gps_data=%p\n", gps_data); - - /* - if (UE_flag==0) - channel_buffer_size = sizeof(fifo_dump_emos_eNB); - else - channel_buffer_size = sizeof(fifo_dump_emos_UE); - */ - - // allocate memory for NO_FRAMES_DISK channes estimations - fifo2file_buffer = malloc(NO_ESTIMATES_DISK*channel_buffer_size); - fifo2file_ptr = fifo2file_buffer; - - if (fifo2file_buffer == NULL) { - printf("[EMOS] Cound not allocate memory for fifo2file_buffer\n"); - exit(EXIT_FAILURE); - } - - if ((fifo = open(CHANSOUNDER_FIFO_DEV, O_RDONLY)) < 0) { - fprintf(stderr, "[EMOS] Error opening the fifo\n"); - exit(EXIT_FAILURE); - } - - - time(&starttime_tmp); - localtime_r(&starttime_tmp,&starttime); - snprintf(dumpfile_name,1024,"/tmp/%s_data_%d%02d%02d_%02d%02d%02d.EMOS", - (UE_flag==0) ? "eNB" : "UE", - 1900+starttime.tm_year, starttime.tm_mon+1, starttime.tm_mday, starttime.tm_hour, starttime.tm_min, starttime.tm_sec); - - dumpfile_id = fopen(dumpfile_name,"w"); - - if (dumpfile_id == NULL) { - fprintf(stderr, "[EMOS] Error opening dumpfile %s\n",dumpfile_name); - exit(EXIT_FAILURE); - } - - - printf("[EMOS] starting dump, channel_buffer_size=%d ...\n",channel_buffer_size); - - while (!oai_exit) { - bytes = rtf_read_timed(fifo, fifo2file_ptr, channel_buffer_size,100); - - if (bytes<=0) - continue; - - /* - if (UE_flag==0) - printf("eNB: count %d, frame %d, read: %d bytes from the fifo\n",counter, ((fifo_dump_emos_eNB*)fifo2file_ptr)->frame_tx,bytes); - else - printf("UE: count %d, frame %d, read: %d bytes from the fifo\n",counter, ((fifo_dump_emos_UE*)fifo2file_ptr)->frame_rx,bytes); - */ - - fifo2file_ptr += channel_buffer_size; - counter ++; - total_bytes += bytes; - - if ((counter%NO_ESTIMATES_DISK)==0) { - //reset stuff - fifo2file_ptr = fifo2file_buffer; - //counter = 0; - - //flush buffer to disk - if (fwrite(fifo2file_buffer, sizeof(char), NO_ESTIMATES_DISK*channel_buffer_size, dumpfile_id) != NO_ESTIMATES_DISK*channel_buffer_size) { - fprintf(stderr, "[EMOS] Error writing to dumpfile\n"); - exit(EXIT_FAILURE); - } - - /* - if (gps_data) - { - if (gps_poll(gps_data) != 0) { - printf("[EMOS] problem polling data from gps\n"); - } - else { - printf("[EMOS] lat %g, lon %g\n",gps_data->fix.latitude,gps_data->fix.longitude); - } - if (fwrite(&(gps_data->fix), sizeof(char), sizeof(struct gps_fix_t), dumpfile_id) != sizeof(struct gps_fix_t)) - { - printf("[EMOS] Error writing to dumpfile, stopping recording\n"); - exit(EXIT_FAILURE); - } - } - else - { - printf("[EMOS] WARNING: No GPS data available, storing dummy packet\n"); - if (fwrite(&(dummy_gps_data), sizeof(char), sizeof(struct gps_fix_t), dumpfile_id) != sizeof(struct gps_fix_t)) - { - printf("[EMOS] Error writing to dumpfile, stopping recording\n"); - exit(EXIT_FAILURE); - } - } - */ - } - - if ((counter%2000)==0) - printf("[EMOS] count %d (%d sec), total bytes wrote %llu\n", counter, counter/2000, total_bytes); - } - - free(fifo2file_buffer); - fclose(dumpfile_id); - close(fifo); - - pthread_exit((void*) arg); - -} -#endif - -/* This is the main eNB thread. It gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */ -static void *eNB_thread(void *arg) -{ -#ifdef RTAI - RT_TASK *task; - RTIME now; -#endif - unsigned char slot=0,last_slot, next_slot; - int hw_slot,frame=0; - unsigned int msg1; - unsigned int aa,slot_offset, slot_offset_F; - int diff; - int delay_cnt; - RTIME time_in, time_diff; - int mbox_target=0,mbox_current=0; - int i,ret; - int tx_offset; - int bytes; - -#ifdef RTAI - task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF); - LOG_D(HW,"Started eNB thread (id %p)\n",task); -#ifndef TIMER_ONESHOT_MODE - now = rt_get_time(); - ret = rt_task_make_periodic(task, now, nano2count(500000LL)); - - if (ret!=0) - LOG_E(HW,"Problem with periodic timer\n"); - -#endif -#endif - -#ifdef HARD_RT - rt_make_hard_real_time(); -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - - timing_info.time_min = 100000000ULL; - timing_info.time_max = 0; - timing_info.time_avg = 0; - timing_info.n_samples = 0; - - while (!oai_exit) { - hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - //LOG_D(HW,"eNB frame %d, time %llu: slot %d, hw_slot %d (mbox %d)\n",frame,rt_get_time_ns(),slot,hw_slot,((unsigned int *)DAQ_MBOX)[0]); - //this is the mbox counter where we should be - //mbox_target = ((((slot+1)%20)*15+1)>>1)%150; - mbox_target = mbox_bounds[slot]; - //this is the mbox counter where we are - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD) - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff = 150-mbox_current+mbox_target; - else if ((mbox_current<15) && (mbox_target>=135)) - diff = -150+mbox_target-mbox_current; - else - diff = mbox_target - mbox_current; - - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_ENB, slot); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_ENB, frame); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0])); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff); - - time_in = rt_get_time_ns(); - //LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d, (slot+1)*15=%d, diff %d, time %llu\n",frame,delay_cnt,hw_slot,((unsigned int *)DAQ_MBOX)[0],slot,(((slot+1)*15)>>1),diff,time_in); - //LOG_D(HW,"eNB Frame %d, time %llu: sleeping for %llu (slot %d, hw_slot %d, diff %d, mbox %d, delay_cnt %d)\n", frame, time_in, diff*DAQ_PERIOD,slot,hw_slot,diff,((volatile unsigned int *)DAQ_MBOX)[0],delay_cnt); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1); -#ifdef TIMER_ONESHOT_MODE - //ret = rt_sleep_ns(DAQ_PERIOD * (slot%4==0?6:8)); - ret = rt_sleep_ns(500000); - - if (ret) - LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in); - -#else - rt_task_wait_period(); -#endif - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0); - - //hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; - //LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns()); - - mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0]; - - if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround - diff = 150-mbox_current+mbox_target; - else if ((mbox_current<15) && (mbox_target>=135)) - diff = -150+mbox_target-mbox_current; - else - diff = mbox_target - mbox_current; - - - last_slot = (slot)%LTE_SLOTS_PER_FRAME; - - if (last_slot <0) - last_slot+=20; - - next_slot = (slot+3)%LTE_SLOTS_PER_FRAME; - - slot++; - - if (slot==20) { - slot=0; - frame++; - } - - if (frame==1000) - oai_exit=1; - -#if defined(ENABLE_ITTI) - itti_update_lte_time(frame, slot); -#endif - } - - LOG_D(HW,"eNB_thread: finished, ran %d times.\n",frame); - -#ifdef HARD_RT - rt_make_soft_real_time(); -#endif - - // clean task -#ifdef RTAI - rt_task_delete(task); -#endif - LOG_D(HW,"Task deleted. returning\n"); - return 0; -} - - -int main(int argc, char **argv) -{ - -#ifdef RTAI - RT_TASK *task; - RTIME period; -#endif - int i,j,aa; - void *status; - - /* - uint32_t rf_mode_max[4] = {55759,55759,55759,55759}; - uint32_t rf_mode_med[4] = {39375,39375,39375,39375}; - uint32_t rf_mode_byp[4] = {22991,22991,22991,22991}; - */ - uint32_t my_rf_mode = RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX; - uint32_t rf_mode_base = TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM; - uint32_t rf_mode[4] = {my_rf_mode,0,0,0}; - uint32_t rf_local[4] = {8255000,8255000,8255000,8255000}; // UE zepto - //{8254617, 8254617, 8254617, 8254617}; //eNB khalifa - //{8255067,8254810,8257340,8257340}; // eNB PETRONAS - - uint32_t rf_vcocal[4] = {910,910,910,910}; - uint32_t rf_vcocal_850[4] = {2015, 2015, 2015, 2015}; - uint32_t rf_rxdc[4] = {32896,32896,32896,32896}; - uint32_t rxgain[4] = {20,20,20,20}; - uint32_t txgain[4] = {20,20,20,20}; - - uint16_t Nid_cell = 0; - uint8_t cooperation_flag=0, transmission_mode=1, abstraction_flag=0; - uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2; - - int c; - char do_forms=0; - unsigned int fd; - unsigned int tcxo = 114; - - int amp; - uint8_t prach_fmt; - int N_ZC; - - char rxg_fname[100]; - char txg_fname[100]; - char rflo_fname[100]; - char rfdc_fname[100]; - FILE *rxg_fd=NULL; - FILE *txg_fd=NULL; - FILE *rflo_fd=NULL; - FILE *rfdc_fd=NULL; - unsigned int rxg_max[4]= {133,133,133,133}, rxg_med[4]= {127,127,127,127}, rxg_byp[4]= {120,120,120,120}; - int tx_max_power=0; - - char line[1000]; - int l; - int ret, ant; - int ant_offset=0; - - int error_code; - char *itti_dump_file = NULL; - - const struct option long_options[] = { - {"calib-ue-rx", required_argument, NULL, 256}, - {"calib-ue-rx-med", required_argument, NULL, 257}, - {"calib-ue-rx-byp", required_argument, NULL, 258}, - {"debug-ue-prach", no_argument, NULL, 259}, - {"no-L2-connect", no_argument, NULL, 260}, - {NULL, 0, NULL, 0} - }; - - //mode = normal_txrx; - - - while ((c = getopt_long (argc, argv, "C:K:O:ST:UdF:V",long_options,NULL)) != -1) { - switch (c) { - case 'V': - ouput_vcd = 1; - break; - - case 'd': - do_forms=1; - break; - - case 'U': - UE_flag = 1; - break; - - case 'C': - carrier_freq[0] = atoi(optarg); - carrier_freq[1] = atoi(optarg); - carrier_freq[2] = atoi(optarg); - carrier_freq[3] = atoi(optarg); - break; - - case 'S': - fs4_test=1; - break; - - case 'T': - tcxo=atoi(optarg); - break; - - case 'K': -#if defined(ENABLE_ITTI) - itti_dump_file = strdup(optarg); -#else - printf("-K option is disabled when ENABLE_ITTI is not defined\n"); -#endif - break; - - case 'O': -#if defined(ENABLE_USE_MME) - EPC_MODE_ENABLED = 1; - - if (optarg == NULL) { /* No IP address provided: use localhost */ - memcpy(&EPC_MODE_MME_ADDRESS[0], "127.0.0.1", 10); - } else { - uint8_t ip_length = strlen(optarg) + 1; - memcpy(&EPC_MODE_MME_ADDRESS[0], optarg, - ip_length > 16 ? 16 : ip_length); - } - -#else - printf("You enabled mme mode without s1ap compiled...\n"); -#endif - break; - - case 'F': - sprintf(rxg_fname,"%srxg.lime",optarg); - rxg_fd = fopen(rxg_fname,"r"); - - if (rxg_fd) { - printf("Loading RX Gain parameters from %s\n",rxg_fname); - l=0; - - while (fgets(line, sizeof(line), rxg_fd)) { - if ((strlen(line)==0) || (*line == '#')) continue; //ignore empty or comment lines - else { - if (l==0) sscanf(line,"%d %d %d %d",&rxg_max[0],&rxg_max[1],&rxg_max[2],&rxg_max[3]); - - if (l==1) sscanf(line,"%d %d %d %d",&rxg_med[0],&rxg_med[1],&rxg_med[2],&rxg_med[3]); - - if (l==2) sscanf(line,"%d %d %d %d",&rxg_byp[0],&rxg_byp[1],&rxg_byp[2],&rxg_byp[3]); - - l++; - } - } - } else - printf("%s not found, running with defaults\n",rxg_fname); - - sprintf(txg_fname,"%stxg.lime",optarg); - txg_fd = fopen(txg_fname,"r"); - - if (txg_fd) { - printf("Loading TX Gain parameters from %s\n",txg_fname); - l=0; - - while (fgets(line, sizeof(line), txg_fd)) { - if ((strlen(line)==0) || (*line == '#')) { - continue; //ignore empty or comment lines - } else { - if (l==0) sscanf(line,"%d %d %d %d",&txgain[0],&txgain[1],&txgain[2],&txgain[3]); - - if (l==1) sscanf(line,"%d",&tx_max_power); - - l++; - } - } - } else - printf("%s not found, running with defaults\n",txg_fname); - - sprintf(rflo_fname,"%srflo.lime",optarg); - rflo_fd = fopen(rflo_fname,"r"); - - if (rflo_fd) { - printf("Loading RF LO parameters from %s\n",rflo_fname); - fscanf(rflo_fd,"%d %d %d %d",&rf_local[0],&rf_local[1],&rf_local[2],&rf_local[3]); - } else - printf("%s not found, running with defaults\n",rflo_fname); - - sprintf(rfdc_fname,"%srfdc.lime",optarg); - rfdc_fd = fopen(rfdc_fname,"r"); - - if (rfdc_fd) { - printf("Loading RF DC parameters from %s\n",rfdc_fname); - fscanf(rfdc_fd,"%d %d %d %d",&rf_rxdc[0],&rf_rxdc[1],&rf_rxdc[2],&rf_rxdc[3]); - } else - printf("%s not found, running with defaults\n",rfdc_fname); - - break; - - /* - case 256: - mode = rx_calib_ue; - rx_input_level_dBm = atoi(optarg); - printf("Running with UE calibration on (LNA max), input level %d dBm\n",rx_input_level_dBm); - break; - case 257: - mode = rx_calib_ue_med; - rx_input_level_dBm = atoi(optarg); - printf("Running with UE calibration on (LNA med), input level %d dBm\n",rx_input_level_dBm); - break; - case 258: - mode = rx_calib_ue_byp; - rx_input_level_dBm = atoi(optarg); - printf("Running with UE calibration on (LNA byp), input level %d dBm\n",rx_input_level_dBm); - break; - case 259: - mode = debug_prach; - break; - case 260: - mode = no_L2_connect; - break; - */ - default: - break; - } - } - - if (UE_flag==1) - printf("configuring for UE\n"); - else - printf("configuring for eNB\n"); - - //randominit (0); - //set_taus_seed (0); - - // initialize the log (see log.h for details) - logInit(); - -#if defined(ENABLE_ITTI) - itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, itti_dump_file); - -# if defined(ENABLE_USE_MME) - - if (itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0) { - LOG_E(EMU, "Create task failed"); - LOG_D(EMU, "Initializing SCTP task interface: FAILED\n"); - return -1; - } - - if (itti_create_task(TASK_S1AP, s1ap_eNB_task, NULL) < 0) { - LOG_E(EMU, "Create task failed"); - LOG_D(EMU, "Initializing S1AP task interface: FAILED\n"); - return -1; - } - -# endif - - if (itti_create_task(TASK_L2L1, l2l1_task, NULL) < 0) { - LOG_E(EMU, "Create task failed"); - LOG_D(EMU, "Initializing L2L1 task interface: FAILED\n"); - return -1; - } - - // Handle signals until all tasks are terminated - // itti_wait_tasks_end(); -#endif - - if (ouput_vcd) { - if (UE_flag==1) - VCD_SIGNAL_DUMPER_INIT("/tmp/openair_dump_UE.vcd"); - else - VCD_SIGNAL_DUMPER_INIT("/tmp/openair_dump_eNB.vcd"); - } - -#ifdef PDCP_USE_NETLINK - netlink_init(); -#endif - - // to make a graceful exit when ctrl-c is pressed - signal(SIGSEGV, signal_handler); - signal(SIGINT, signal_handler); - -#ifndef RTAI - check_clock(); -#endif - - g_log->log_component[HW].level = LOG_DEBUG; - g_log->log_component[HW].flag = LOG_HIGH; -#ifdef OPENAIR2 - g_log->log_component[PHY].level = LOG_INFO; -#else - g_log->log_component[PHY].level = LOG_INFO; -#endif - g_log->log_component[PHY].flag = LOG_HIGH; - g_log->log_component[MAC].level = LOG_INFO; - g_log->log_component[MAC].flag = LOG_HIGH; - g_log->log_component[RLC].level = LOG_INFO; - g_log->log_component[RLC].flag = LOG_HIGH; - g_log->log_component[PDCP].level = LOG_INFO; - g_log->log_component[PDCP].flag = LOG_HIGH; - g_log->log_component[OTG].level = LOG_INFO; - g_log->log_component[OTG].flag = LOG_HIGH; - g_log->log_component[RRC].level = LOG_INFO; - g_log->log_component[RRC].flag = LOG_HIGH; - - - // Initialize card - ret = openair0_open(); - - if ( ret != 0 ) { - if (ret == -1) - printf("Error opening /dev/openair0"); - - if (ret == -2) - printf("Error mapping bigshm"); - - if (ret == -3) - printf("Error mapping RX or TX buffer"); - - return(ret); - } - - printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[card]); - - p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr; - p_exmimo_id = openair0_exmimo_pci[card].exmimo_id_ptr; - - printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", card, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev); - - if (p_exmimo_id->board_swrev>=BOARD_SWREV_CNTL2) - p_exmimo_config->framing.eNB_flag = 0; - else - p_exmimo_config->framing.eNB_flag = !UE_flag; - - p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB; - - for (ant=0; ant<4; ant++) - p_exmimo_config->framing.resampling_factor[ant] = RESAMPLING_FACTOR; - - /* - for (ant=0;antnb_antennas_tx,frame_parms->nb_antennas_rx);ant++) - p_exmimo_config->rf.rf_mode[ant] = rf_mode_base; - for (ant=0;antnb_antennas_tx;ant++) - p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX); - for (ant=0;antnb_antennas_rx;ant++) - p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX); - for (ant=max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant<4;ant++) { - p_exmimo_config->rf.rf_mode[ant] = 0; - carrier_freq[ant] = 0; //this turns off all other LIMEs - } - */ - - ant_offset = 0; - - for (ant=0; ant<4; ant++) { - if (ant==ant_offset) { - //if (1) { - p_exmimo_config->rf.rf_mode[ant] = rf_mode_base; - //p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX); - p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX); - } else { - p_exmimo_config->rf.rf_mode[ant] = 0; - carrier_freq[ant] = 0; //this turns off all other LIMEs - } - } - - for (ant = 0; ant<4; ant++) { - p_exmimo_config->rf.do_autocal[ant] = 1; - p_exmimo_config->rf.rf_freq_rx[ant] = carrier_freq[ant]; - p_exmimo_config->rf.rf_freq_tx[ant] = carrier_freq[ant]; - p_exmimo_config->rf.rx_gain[ant][0] = rxgain[ant]; - p_exmimo_config->rf.tx_gain[ant][0] = txgain[ant]; - - p_exmimo_config->rf.rf_local[ant] = rf_local[ant]; - p_exmimo_config->rf.rf_rxdc[ant] = rf_rxdc[ant]; - - if ((carrier_freq[ant] >= 850000000) && (carrier_freq[ant] <= 865000000)) { - p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal_850[ant]; - p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD; - } else if ((carrier_freq[ant] >= 1900000000) && (carrier_freq[ant] <= 2000000000)) { - p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal[ant]; - p_exmimo_config->rf.rffe_band_mode[ant] = B19G_TDD; - } else { - p_exmimo_config->rf.rf_vcocal[ant] = rf_vcocal[ant]; - p_exmimo_config->rf.rffe_band_mode[ant] = 0; - } - - p_exmimo_config->rf.rffe_gain_txlow[ant] = 31; - p_exmimo_config->rf.rffe_gain_txhigh[ant] = 31; - p_exmimo_config->rf.rffe_gain_rxfinal[ant] = 52; - p_exmimo_config->rf.rffe_gain_rxlow[ant] = 31; - } - - - number_of_cards = openair0_num_detected_cards; - /* - if (p_exmimo_id->board_exmimoversion==1) //ExpressMIMO1 - openair_daq_vars.timing_advance = 138; - else //ExpressMIMO2 - openair_daq_vars.timing_advance = 0; - */ - - openair0_dump_config(card); - - printf("EXMIMO_CONFIG: rf_mode 0x %x %x %x %x, [0]: TXRXEn %d, TXLPFEn %d, TXLPF %d, RXLPFEn %d, RXLPF %d, RFBB %d, LNA %d, LNAGain %d, RXLPFMode %d, SWITCH %d, rf_rxdc %d, rf_local %d, rf_vcocal %d\n", - p_exmimo_config->rf.rf_mode[0], - p_exmimo_config->rf.rf_mode[1], - p_exmimo_config->rf.rf_mode[2], - p_exmimo_config->rf.rf_mode[3], - (p_exmimo_config->rf.rf_mode[0]&3), // RXen+TXen - (p_exmimo_config->rf.rf_mode[0]&4)>>2, //TXLPFen - (p_exmimo_config->rf.rf_mode[0]&TXLPFMASK)>>3, //TXLPF - (p_exmimo_config->rf.rf_mode[0]&128)>>7, //RXLPFen - (p_exmimo_config->rf.rf_mode[0]&RXLPFMASK)>>8, //TXLPF - (p_exmimo_config->rf.rf_mode[0]&RFBBMASK)>>16, // RFBB mode - (p_exmimo_config->rf.rf_mode[0]&LNAMASK)>>12, // RFBB mode - (p_exmimo_config->rf.rf_mode[0]&LNAGAINMASK)>>14, // RFBB mode - (p_exmimo_config->rf.rf_mode[0]&RXLPFMODEMASK)>>19, // RXLPF mode - (p_exmimo_config->framing.tdd_config&TXRXSWITCH_MASK)>>1, // Switch mode - p_exmimo_config->rf.rf_rxdc[0], - p_exmimo_config->rf.rf_local[0], - p_exmimo_config->rf.rf_vcocal[0]); - - for (ant=0; ant<4; ant++) - p_exmimo_config->rf.do_autocal[ant] = 0; - -#ifdef EMOS - error_code = rtf_create(CHANSOUNDER_FIFO_MINOR,CHANSOUNDER_FIFO_SIZE); - - if (error_code==0) - printf("[OPENAIR][SCHED][INIT] Created EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR); - else if (error_code==ENODEV) - printf("[OPENAIR][SCHED][INIT] Problem: EMOS FIFO %d is greater than or equal to RTF_NO\n",CHANSOUNDER_FIFO_MINOR); - else if (error_code==ENOMEM) - printf("[OPENAIR][SCHED][INIT] Problem: cannot allocate memory for EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR); - else - printf("[OPENAIR][SCHED][INIT] Problem creating EMOS FIFO %d, error_code %d\n",CHANSOUNDER_FIFO_MINOR,error_code); - -#endif - - mlockall(MCL_CURRENT | MCL_FUTURE); - -#ifdef RTAI - // make main thread LXRT soft realtime - task = rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF); - - // start realtime timer and scheduler -#ifdef TIMER_ONESHOT_MODE - rt_set_oneshot_mode(); - start_rt_timer(0); - printf("started RTAI timer inoneshot mode\n"); -#else - rt_set_periodic_mode(); - period = start_rt_timer(nano2count(500000)); - printf("started RTAI timer with period %llu ns\n",count2nano(period)); -#endif - - printf("Init mutex\n"); - //mutex = rt_get_adr(nam2num("MUTEX")); - mutex = rt_sem_init(nam2num("MUTEX"), 1); - - if (mutex==0) { - printf("Error init mutex\n"); - exit(-1); - } else - printf("mutex=%p\n",mutex); - -#endif - - DAQ_MBOX = (volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]; - - // this starts the DMA transfers - if (UE_flag!=1) - openair0_start_rt_acquisition(card); - - -#ifdef XFORMS - - if (do_forms==1) { - fl_initialize (&argc, argv, NULL, 0, 0); - form_stats = create_form_stats_form(); - - if (UE_flag==1) { - form_ue[UE_id] = create_lte_phy_scope_ue(); - sprintf (title, "LTE DL SCOPE UE"); - fl_show_form (form_ue[UE_id]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - } else { - for(UE_id=0; UE_idlte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - } - } - - fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats"); - - if (UE_flag==0) { - for (UE_id=0; UE_idbutton_0,1); - fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic ON"); - } else { - fl_set_button(form_enb[UE_id]->button_0,0); - fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic OFF"); - } - } - } else { - if (openair_daq_vars.use_ia_receiver) { - fl_set_button(form_ue[UE_id]->button_0,1); - fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON"); - } else { - fl_set_button(form_ue[UE_id]->button_0,0); - fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF"); - } - } - - ret = pthread_create(&thread2, NULL, scope_thread, NULL); - printf("Scope thread created, ret=%d\n",ret); - } - -#endif - -#ifdef EMOS - ret = pthread_create(&thread3, NULL, emos_thread, NULL); - printf("EMOS thread created, ret=%d\n",ret); -#endif - - rt_sleep_ns(10*FRAME_PERIOD); - -#ifndef RTAI - pthread_attr_init (&attr_dlsch_threads); - pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE); - //attr_dlsch_threads.priority = 1; - sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY; - pthread_attr_setschedparam (&attr_dlsch_threads, &sched_param_dlsch); - pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO); -#endif - - // start the main thread - if (UE_flag == 1) { - /* - #ifdef RTAI - thread1 = rt_thread_create(UE_thread, NULL, 100000000); - #else - error_code = pthread_create(&thread1, &attr_dlsch_threads, UE_thread, NULL); - if (error_code!= 0) { - LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code); - return(error_code); - } - else { - LOG_D(HW,"[lte-softmodem.c] Allocate UE_thread successful\n"); - } - #endif - #ifdef DLSCH_THREAD - init_rx_pdsch_thread(); - rt_sleep_ns(FRAME_PERIOD/10); - init_dlsch_threads(); - #endif - printf("UE threads created\n"); - */ - } else { -#ifdef RTAI - thread0 = rt_thread_create(eNB_thread, NULL, 100000000); -#else - error_code = pthread_create(&thread0, &attr_dlsch_threads, eNB_thread, NULL); - - if (error_code!= 0) { - LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code); - return(error_code); - } else { - LOG_D(HW,"[lte-softmodem.c] Allocate eNB_thread successful\n"); - } - -#endif -#ifdef ULSCH_THREAD - init_ulsch_threads(); -#endif - printf("eNB threads created\n"); - } - - - // wait for end of program - printf("TYPE TO TERMINATE\n"); - - //getchar(); - while (oai_exit==0) - rt_sleep_ns(FRAME_PERIOD); - - // stop threads -#ifdef XFORMS - printf("waiting for XFORMS thread\n"); - - if (do_forms==1) { - pthread_join(thread2,&status); - fl_hide_form(form_stats->stats_form); - fl_free_form(form_stats->stats_form); - - if (UE_flag==1) { - fl_hide_form(form_ue[UE_id]->lte_phy_scope_ue); - fl_free_form(form_ue[UE_id]->lte_phy_scope_ue); - } else { - for(UE_id=0; UE_idlte_phy_scope_enb); - fl_free_form(form_enb[UE_id]->lte_phy_scope_enb); - } - } - } - -#endif - - printf("stopping MODEM threads\n"); - - // cleanup - if (UE_flag == 1) { - /* - #ifdef RTAI - rt_thread_join(thread1); - #else - pthread_join(thread1,&status); - #endif - #ifdef DLSCH_THREAD - cleanup_dlsch_threads(); - cleanup_rx_pdsch_thread(); - #endif - */ - } else { -#ifdef RTAI - rt_thread_join(thread0); -#else - pthread_join(thread0,&status); -#endif -#ifdef ULSCH_THREAD - cleanup_ulsch_threads(); -#endif - } - -#ifdef OPENAIR2 - //cleanup_pdcp_thread(); -#endif - -#ifdef RTAI - stop_rt_timer(); -#endif - - printf("stopping card\n"); - openair0_stop(card); - printf("closing openair0_lib\n"); - openair0_close(); - -#ifdef EMOS - printf("waiting for EMOS thread\n"); - pthread_cancel(thread3); - pthread_join(thread3,&status); -#endif - -#ifdef EMOS - error_code = rtf_destroy(CHANSOUNDER_FIFO_MINOR); - printf("[OPENAIR][SCHED][CLEANUP] EMOS FIFO closed, error_code %d\n", error_code); -#endif - - if (ouput_vcd) - VCD_SIGNAL_DUMPER_CLOSE(); - - logClean(); - - return 0; -} - -void test_config(int card, int ant, unsigned int rf_mode, int UE_flag) -{ - p_exmimo_config->framing.eNB_flag = !UE_flag; - p_exmimo_config->framing.tdd_config = 0; - p_exmimo_config->framing.resampling_factor[ant] = 2; - - p_exmimo_config->rf.rf_freq_rx[ant] = 1907600000; - p_exmimo_config->rf.rf_freq_tx[ant] = 1907600000;; - p_exmimo_config->rf.rx_gain[ant][0] = 20; - p_exmimo_config->rf.tx_gain[ant][0] = 10; - p_exmimo_config->rf.rf_mode[ant] = rf_mode; - - p_exmimo_config->rf.rf_local[ant] = build_rflocal(20,25,26,04); - p_exmimo_config->rf.rf_rxdc[ant] = build_rfdc(128, 128); - p_exmimo_config->rf.rf_vcocal[ant] = (0xE<<6) + 0xE; -} - -/* -void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier) { - - int i; - if (phy_vars_ue) { - - if ((frame_parms->nb_antennas_rx>1) && (carrier>0)) { - printf("RX antennas > 1 and carrier > 0 not possible\n"); - exit(-1); - } - - if ((frame_parms->nb_antennas_tx>1) && (carrier>0)) { - printf("TX antennas > 1 and carrier > 0 not possible\n"); - exit(-1); - } - - // replace RX signal buffers with mmaped HW versions - for (i=0;inb_antennas_rx;i++) { - free(phy_vars_ue->lte_ue_common_vars.rxdata[i]); - phy_vars_ue->lte_ue_common_vars.rxdata[i] = (int32_t*) openair0_exmimo_pci[card].adc_head[i+carrier]; - - - printf("rxdata[%d] @ %p\n",i,phy_vars_ue->lte_ue_common_vars.rxdata[i]); - } - for (i=0;inb_antennas_tx;i++) { - free(phy_vars_ue->lte_ue_common_vars.txdata[i]); - phy_vars_ue->lte_ue_common_vars.txdata[i] = (int32_t*) openair0_exmimo_pci[card].dac_head[i+carrier]; - - printf("txdata[%d] @ %p\n",i,phy_vars_ue->lte_ue_common_vars.txdata[i]); - } - } -} - -void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier) { - - int i,j; - - if (phy_vars_eNB) { - if ((frame_parms->nb_antennas_rx>1) && (carrier>0)) { - printf("RX antennas > 1 and carrier > 0 not possible\n"); - exit(-1); - } - - if ((frame_parms->nb_antennas_tx>1) && (carrier>0)) { - printf("TX antennas > 1 and carrier > 0 not possible\n"); - exit(-1); - } - - // replace RX signal buffers with mmaped HW versions - for (i=0;inb_antennas_rx;i++) { - free(phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]); - phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[card].adc_head[i+carrier]; - - printf("rxdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]); - for (j=0;j<16;j++) { - printf("rxbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j]); - phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j] = 16-j; - } - } - for (i=0;inb_antennas_tx;i++) { - free(phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]); - phy_vars_eNB->lte_eNB_common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[card].dac_head[i+carrier]; - - printf("txdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]); - for (j=0;j<16;j++) { - printf("txbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j]); - phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j] = 16-j; - } - } - } -} -*/ diff --git a/targets/RT/USER/ue_usrp.gtkw b/targets/RT/USER/ue_usrp.gtkw index 81940b5643..becc47ea0b 100644 --- a/targets/RT/USER/ue_usrp.gtkw +++ b/targets/RT/USER/ue_usrp.gtkw @@ -1,12 +1,12 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Sun Mar 20 18:27:06 2016 +[*] Sun Jul 17 20:46:59 2016 [*] [dumpfile] "/tmp/openair_dump_UE.vcd" -[dumpfile_mtime] "Sun Mar 20 18:14:17 2016" -[dumpfile_size] 92262400 -[savefile] "/home/papillon/openairinterface5g/targets/RT/USER/ue_usrp.gtkw" -[timestart] 30032830000 +[dumpfile_mtime] "Sun Jul 17 20:46:29 2016" +[dumpfile_size] 10932224 +[savefile] "/home/fourmi/openairinterface5g/targets/RT/USER/ue_usrp.gtkw" +[timestart] 11696930000 [size] 1215 640 [pos] 105 102 *-22.292629 30041590000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 @@ -19,22 +19,25 @@ variables.hw_subframe[63:0] @28 functions.trx_read functions.trx_write +functions.ue_thread_synch +functions.ue_thread_rxtx0 @24 -variables.subframe_number_RX_UE[63:0] -variables.subframe_number_TX_UE[63:0] +variables.subframe_RX0_UE[63:0] +variables.subframe_TX0_UE[63:0] +variables.frame_number_RX0_UE[63:0] +variables.frame_number_TX0_UE[63:0] @28 -functions.ue_thread_rx -functions.ue_thread_tx -@420 -variables.ue_inst_cnt_rx[63:0] -variables.ue_inst_cnt_tx[63:0] +functions.ue_thread_rxtx1 +@24 +variables.subframe_RX1_UE[63:0] +variables.subframe_TX1_UE[63:0] +@25 +variables.frame_number_RX1_UE[63:0] +@24 +variables.frame_number_TX1_UE[63:0] @28 functions.phy_procedures_ue_rx functions.phy_procedures_ue_tx -@24 -variables.frame_number_RX_UE[63:0] -variables.frame_number_TX_UE[63:0] -@28 functions.ue_slot_fep functions.lte_ue_measurement_procedures functions.ue_rrc_measurements diff --git a/targets/SCRIPTS/PROFILING/gprof2dot.py b/targets/SCRIPTS/PROFILING/gprof2dot.py deleted file mode 100755 index 62b22762fb..0000000000 --- a/targets/SCRIPTS/PROFILING/gprof2dot.py +++ /dev/null @@ -1,2780 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2008-2009 Jose Fonseca -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU Lesser General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -# - -"""Generate a dot graph from the output of several profilers.""" - -__author__ = "Jose Fonseca" - -__version__ = "1.0" - - -import sys -import math -import os.path -import re -import textwrap -import optparse -import xml.parsers.expat - - -try: - # Debugging helper module - import debug -except ImportError: - pass - - -def times(x): - return u"%u\xd7" % (x,) - -def percentage(p): - return "%.02f%%" % (p*100.0,) - -def add(a, b): - return a + b - -def equal(a, b): - if a == b: - return a - else: - return None - -def fail(a, b): - assert False - - -tol = 2 ** -23 - -def ratio(numerator, denominator): - try: - ratio = float(numerator)/float(denominator) - except ZeroDivisionError: - # 0/0 is undefined, but 1.0 yields more useful results - return 1.0 - if ratio < 0.0: - if ratio < -tol: - sys.stderr.write('warning: negative ratio (%s/%s)\n' % (numerator, denominator)) - return 0.0 - if ratio > 1.0: - if ratio > 1.0 + tol: - sys.stderr.write('warning: ratio greater than one (%s/%s)\n' % (numerator, denominator)) - return 1.0 - return ratio - - -class UndefinedEvent(Exception): - """Raised when attempting to get an event which is undefined.""" - - def __init__(self, event): - Exception.__init__(self) - self.event = event - - def __str__(self): - return 'unspecified event %s' % self.event.name - - -class Event(object): - """Describe a kind of event, and its basic operations.""" - - def __init__(self, name, null, aggregator, formatter = str): - self.name = name - self._null = null - self._aggregator = aggregator - self._formatter = formatter - - def __eq__(self, other): - return self is other - - def __hash__(self): - return id(self) - - def null(self): - return self._null - - def aggregate(self, val1, val2): - """Aggregate two event values.""" - assert val1 is not None - assert val2 is not None - return self._aggregator(val1, val2) - - def format(self, val): - """Format an event value.""" - assert val is not None - return self._formatter(val) - - -CALLS = Event("Calls", 0, add, times) -SAMPLES = Event("Samples", 0, add) -SAMPLES2 = Event("Samples", 0, add) - -TIME = Event("Time", 0.0, add, lambda x: '(' + str(x) + ')') -TIME_RATIO = Event("Time ratio", 0.0, add, lambda x: '(' + percentage(x) + ')') -TOTAL_TIME = Event("Total time", 0.0, fail) -TOTAL_TIME_RATIO = Event("Total time ratio", 0.0, fail, percentage) - - -class Object(object): - """Base class for all objects in profile which can store events.""" - - def __init__(self, events=None): - if events is None: - self.events = {} - else: - self.events = events - - def __hash__(self): - return id(self) - - def __eq__(self, other): - return self is other - - def __contains__(self, event): - return event in self.events - - def __getitem__(self, event): - try: - return self.events[event] - except KeyError: - raise UndefinedEvent(event) - - def __setitem__(self, event, value): - if value is None: - if event in self.events: - del self.events[event] - else: - self.events[event] = value - - -class Call(Object): - """A call between functions. - - There should be at most one call object for every pair of functions. - """ - - def __init__(self, callee_id): - Object.__init__(self) - self.callee_id = callee_id - self.ratio = None - self.weight = None - - -class Function(Object): - """A function.""" - - def __init__(self, id, name): - Object.__init__(self) - self.id = id - self.name = name - self.module = None - self.process = None - self.calls = {} - self.called = None - self.weight = None - self.cycle = None - - def add_call(self, call): - if call.callee_id in self.calls: - sys.stderr.write('warning: overwriting call from function %s to %s\n' % (str(self.id), str(call.callee_id))) - self.calls[call.callee_id] = call - - def get_call(self, callee_id): - if not callee_id in self.calls: - call = Call(callee_id) - call[SAMPLES] = 0 - call[SAMPLES2] = 0 - call[CALLS] = 0 - self.calls[callee_id] = call - return self.calls[callee_id] - - # TODO: write utility functions - - def __repr__(self): - return self.name - - -class Cycle(Object): - """A cycle made from recursive function calls.""" - - def __init__(self): - Object.__init__(self) - # XXX: Do cycles need an id? - self.functions = set() - - def add_function(self, function): - assert function not in self.functions - self.functions.add(function) - # XXX: Aggregate events? - if function.cycle is not None: - for other in function.cycle.functions: - if function not in self.functions: - self.add_function(other) - function.cycle = self - - -class Profile(Object): - """The whole profile.""" - - def __init__(self): - Object.__init__(self) - self.functions = {} - self.cycles = [] - - def add_function(self, function): - if function.id in self.functions: - sys.stderr.write('warning: overwriting function %s (id %s)\n' % (function.name, str(function.id))) - self.functions[function.id] = function - - def add_cycle(self, cycle): - self.cycles.append(cycle) - - def validate(self): - """Validate the edges.""" - - for function in self.functions.itervalues(): - for callee_id in function.calls.keys(): - assert function.calls[callee_id].callee_id == callee_id - if callee_id not in self.functions: - sys.stderr.write('warning: call to undefined function %s from function %s\n' % (str(callee_id), function.name)) - del function.calls[callee_id] - - def find_cycles(self): - """Find cycles using Tarjan's strongly connected components algorithm.""" - - # Apply the Tarjan's algorithm successively until all functions are visited - visited = set() - for function in self.functions.itervalues(): - if function not in visited: - self._tarjan(function, 0, [], {}, {}, visited) - cycles = [] - for function in self.functions.itervalues(): - if function.cycle is not None and function.cycle not in cycles: - cycles.append(function.cycle) - self.cycles = cycles - if 0: - for cycle in cycles: - sys.stderr.write("Cycle:\n") - for member in cycle.functions: - sys.stderr.write("\tFunction %s\n" % member.name) - - def _tarjan(self, function, order, stack, orders, lowlinks, visited): - """Tarjan's strongly connected components algorithm. - - See also: - - http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm - """ - - visited.add(function) - orders[function] = order - lowlinks[function] = order - order += 1 - pos = len(stack) - stack.append(function) - for call in function.calls.itervalues(): - callee = self.functions[call.callee_id] - # TODO: use a set to optimize lookup - if callee not in orders: - order = self._tarjan(callee, order, stack, orders, lowlinks, visited) - lowlinks[function] = min(lowlinks[function], lowlinks[callee]) - elif callee in stack: - lowlinks[function] = min(lowlinks[function], orders[callee]) - if lowlinks[function] == orders[function]: - # Strongly connected component found - members = stack[pos:] - del stack[pos:] - if len(members) > 1: - cycle = Cycle() - for member in members: - cycle.add_function(member) - return order - - def call_ratios(self, event): - # Aggregate for incoming calls - cycle_totals = {} - for cycle in self.cycles: - cycle_totals[cycle] = 0.0 - function_totals = {} - for function in self.functions.itervalues(): - function_totals[function] = 0.0 - for function in self.functions.itervalues(): - for call in function.calls.itervalues(): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - function_totals[callee] += call[event] - if callee.cycle is not None and callee.cycle is not function.cycle: - cycle_totals[callee.cycle] += call[event] - - # Compute the ratios - for function in self.functions.itervalues(): - for call in function.calls.itervalues(): - assert call.ratio is None - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - if callee.cycle is not None and callee.cycle is not function.cycle: - total = cycle_totals[callee.cycle] - else: - total = function_totals[callee] - call.ratio = ratio(call[event], total) - - def integrate(self, outevent, inevent): - """Propagate function time ratio allong the function calls. - - Must be called after finding the cycles. - - See also: - - http://citeseer.ist.psu.edu/graham82gprof.html - """ - - # Sanity checking - assert outevent not in self - for function in self.functions.itervalues(): - assert outevent not in function - assert inevent in function - for call in function.calls.itervalues(): - assert outevent not in call - if call.callee_id != function.id: - assert call.ratio is not None - - # Aggregate the input for each cycle - for cycle in self.cycles: - total = inevent.null() - for function in self.functions.itervalues(): - total = inevent.aggregate(total, function[inevent]) - self[inevent] = total - - # Integrate along the edges - total = inevent.null() - for function in self.functions.itervalues(): - total = inevent.aggregate(total, function[inevent]) - self._integrate_function(function, outevent, inevent) - self[outevent] = total - - def _integrate_function(self, function, outevent, inevent): - if function.cycle is not None: - return self._integrate_cycle(function.cycle, outevent, inevent) - else: - if outevent not in function: - total = function[inevent] - for call in function.calls.itervalues(): - if call.callee_id != function.id: - total += self._integrate_call(call, outevent, inevent) - function[outevent] = total - return function[outevent] - - def _integrate_call(self, call, outevent, inevent): - assert outevent not in call - assert call.ratio is not None - callee = self.functions[call.callee_id] - subtotal = call.ratio *self._integrate_function(callee, outevent, inevent) - call[outevent] = subtotal - return subtotal - - def _integrate_cycle(self, cycle, outevent, inevent): - if outevent not in cycle: - - # Compute the outevent for the whole cycle - total = inevent.null() - for member in cycle.functions: - subtotal = member[inevent] - for call in member.calls.itervalues(): - callee = self.functions[call.callee_id] - if callee.cycle is not cycle: - subtotal += self._integrate_call(call, outevent, inevent) - total += subtotal - cycle[outevent] = total - - # Compute the time propagated to callers of this cycle - callees = {} - for function in self.functions.itervalues(): - if function.cycle is not cycle: - for call in function.calls.itervalues(): - callee = self.functions[call.callee_id] - if callee.cycle is cycle: - try: - callees[callee] += call.ratio - except KeyError: - callees[callee] = call.ratio - - for member in cycle.functions: - member[outevent] = outevent.null() - - for callee, call_ratio in callees.iteritems(): - ranks = {} - call_ratios = {} - partials = {} - self._rank_cycle_function(cycle, callee, 0, ranks) - self._call_ratios_cycle(cycle, callee, ranks, call_ratios, set()) - partial = self._integrate_cycle_function(cycle, callee, call_ratio, partials, ranks, call_ratios, outevent, inevent) - assert partial == max(partials.values()) - assert not total or abs(1.0 - partial/(call_ratio*total)) <= 0.001 - - return cycle[outevent] - - def _rank_cycle_function(self, cycle, function, rank, ranks): - if function not in ranks or ranks[function] > rank: - ranks[function] = rank - for call in function.calls.itervalues(): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - if callee.cycle is cycle: - self._rank_cycle_function(cycle, callee, rank + 1, ranks) - - def _call_ratios_cycle(self, cycle, function, ranks, call_ratios, visited): - if function not in visited: - visited.add(function) - for call in function.calls.itervalues(): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - if callee.cycle is cycle: - if ranks[callee] > ranks[function]: - call_ratios[callee] = call_ratios.get(callee, 0.0) + call.ratio - self._call_ratios_cycle(cycle, callee, ranks, call_ratios, visited) - - def _integrate_cycle_function(self, cycle, function, partial_ratio, partials, ranks, call_ratios, outevent, inevent): - if function not in partials: - partial = partial_ratio*function[inevent] - for call in function.calls.itervalues(): - if call.callee_id != function.id: - callee = self.functions[call.callee_id] - if callee.cycle is not cycle: - assert outevent in call - partial += partial_ratio*call[outevent] - else: - if ranks[callee] > ranks[function]: - callee_partial = self._integrate_cycle_function(cycle, callee, partial_ratio, partials, ranks, call_ratios, outevent, inevent) - call_ratio = ratio(call.ratio, call_ratios[callee]) - call_partial = call_ratio*callee_partial - try: - call[outevent] += call_partial - except UndefinedEvent: - call[outevent] = call_partial - partial += call_partial - partials[function] = partial - try: - function[outevent] += partial - except UndefinedEvent: - function[outevent] = partial - return partials[function] - - def aggregate(self, event): - """Aggregate an event for the whole profile.""" - - total = event.null() - for function in self.functions.itervalues(): - try: - total = event.aggregate(total, function[event]) - except UndefinedEvent: - return - self[event] = total - - def ratio(self, outevent, inevent): - assert outevent not in self - assert inevent in self - for function in self.functions.itervalues(): - assert outevent not in function - assert inevent in function - function[outevent] = ratio(function[inevent], self[inevent]) - for call in function.calls.itervalues(): - assert outevent not in call - if inevent in call: - call[outevent] = ratio(call[inevent], self[inevent]) - self[outevent] = 1.0 - - def prune(self, node_thres, edge_thres): - """Prune the profile""" - - # compute the prune ratios - for function in self.functions.itervalues(): - try: - function.weight = function[TOTAL_TIME_RATIO] - except UndefinedEvent: - pass - - for call in function.calls.itervalues(): - callee = self.functions[call.callee_id] - - if TOTAL_TIME_RATIO in call: - # handle exact cases first - call.weight = call[TOTAL_TIME_RATIO] - else: - try: - # make a safe estimate - call.weight = min(function[TOTAL_TIME_RATIO], callee[TOTAL_TIME_RATIO]) - except UndefinedEvent: - pass - - # prune the nodes - for function_id in self.functions.keys(): - function = self.functions[function_id] - if function.weight is not None: - if function.weight < node_thres: - del self.functions[function_id] - - # prune the egdes - for function in self.functions.itervalues(): - for callee_id in function.calls.keys(): - call = function.calls[callee_id] - if callee_id not in self.functions or call.weight is not None and call.weight < edge_thres: - del function.calls[callee_id] - - def dump(self): - for function in self.functions.itervalues(): - sys.stderr.write('Function %s:\n' % (function.name,)) - self._dump_events(function.events) - for call in function.calls.itervalues(): - callee = self.functions[call.callee_id] - sys.stderr.write(' Call %s:\n' % (callee.name,)) - self._dump_events(call.events) - for cycle in self.cycles: - sys.stderr.write('Cycle:\n') - self._dump_events(cycle.events) - for function in cycle.functions: - sys.stderr.write(' Function %s\n' % (function.name,)) - - def _dump_events(self, events): - for event, value in events.iteritems(): - sys.stderr.write(' %s: %s\n' % (event.name, event.format(value))) - - -class Struct: - """Masquerade a dictionary with a structure-like behavior.""" - - def __init__(self, attrs = None): - if attrs is None: - attrs = {} - self.__dict__['_attrs'] = attrs - - def __getattr__(self, name): - try: - return self._attrs[name] - except KeyError: - raise AttributeError(name) - - def __setattr__(self, name, value): - self._attrs[name] = value - - def __str__(self): - return str(self._attrs) - - def __repr__(self): - return repr(self._attrs) - - -class ParseError(Exception): - """Raised when parsing to signal mismatches.""" - - def __init__(self, msg, line): - self.msg = msg - # TODO: store more source line information - self.line = line - - def __str__(self): - return '%s: %r' % (self.msg, self.line) - - -class Parser: - """Parser interface.""" - - def __init__(self): - pass - - def parse(self): - raise NotImplementedError - - -class LineParser(Parser): - """Base class for parsers that read line-based formats.""" - - def __init__(self, file): - Parser.__init__(self) - self._file = file - self.__line = None - self.__eof = False - self.line_no = 0 - - def readline(self): - line = self._file.readline() - if not line: - self.__line = '' - self.__eof = True - else: - self.line_no += 1 - self.__line = line.rstrip('\r\n') - - def lookahead(self): - assert self.__line is not None - return self.__line - - def consume(self): - assert self.__line is not None - line = self.__line - self.readline() - return line - - def eof(self): - assert self.__line is not None - return self.__eof - - -XML_ELEMENT_START, XML_ELEMENT_END, XML_CHARACTER_DATA, XML_EOF = range(4) - - -class XmlToken: - - def __init__(self, type, name_or_data, attrs = None, line = None, column = None): - assert type in (XML_ELEMENT_START, XML_ELEMENT_END, XML_CHARACTER_DATA, XML_EOF) - self.type = type - self.name_or_data = name_or_data - self.attrs = attrs - self.line = line - self.column = column - - def __str__(self): - if self.type == XML_ELEMENT_START: - return '<' + self.name_or_data + ' ...>' - if self.type == XML_ELEMENT_END: - return '' - if self.type == XML_CHARACTER_DATA: - return self.name_or_data - if self.type == XML_EOF: - return 'end of file' - assert 0 - - -class XmlTokenizer: - """Expat based XML tokenizer.""" - - def __init__(self, fp, skip_ws = True): - self.fp = fp - self.tokens = [] - self.index = 0 - self.final = False - self.skip_ws = skip_ws - - self.character_pos = 0, 0 - self.character_data = '' - - self.parser = xml.parsers.expat.ParserCreate() - self.parser.StartElementHandler = self.handle_element_start - self.parser.EndElementHandler = self.handle_element_end - self.parser.CharacterDataHandler = self.handle_character_data - - def handle_element_start(self, name, attributes): - self.finish_character_data() - line, column = self.pos() - token = XmlToken(XML_ELEMENT_START, name, attributes, line, column) - self.tokens.append(token) - - def handle_element_end(self, name): - self.finish_character_data() - line, column = self.pos() - token = XmlToken(XML_ELEMENT_END, name, None, line, column) - self.tokens.append(token) - - def handle_character_data(self, data): - if not self.character_data: - self.character_pos = self.pos() - self.character_data += data - - def finish_character_data(self): - if self.character_data: - if not self.skip_ws or not self.character_data.isspace(): - line, column = self.character_pos - token = XmlToken(XML_CHARACTER_DATA, self.character_data, None, line, column) - self.tokens.append(token) - self.character_data = '' - - def next(self): - size = 16*1024 - while self.index >= len(self.tokens) and not self.final: - self.tokens = [] - self.index = 0 - data = self.fp.read(size) - self.final = len(data) < size - try: - self.parser.Parse(data, self.final) - except xml.parsers.expat.ExpatError, e: - #if e.code == xml.parsers.expat.errors.XML_ERROR_NO_ELEMENTS: - if e.code == 3: - pass - else: - raise e - if self.index >= len(self.tokens): - line, column = self.pos() - token = XmlToken(XML_EOF, None, None, line, column) - else: - token = self.tokens[self.index] - self.index += 1 - return token - - def pos(self): - return self.parser.CurrentLineNumber, self.parser.CurrentColumnNumber - - -class XmlTokenMismatch(Exception): - - def __init__(self, expected, found): - self.expected = expected - self.found = found - - def __str__(self): - return '%u:%u: %s expected, %s found' % (self.found.line, self.found.column, str(self.expected), str(self.found)) - - -class XmlParser(Parser): - """Base XML document parser.""" - - def __init__(self, fp): - Parser.__init__(self) - self.tokenizer = XmlTokenizer(fp) - self.consume() - - def consume(self): - self.token = self.tokenizer.next() - - def match_element_start(self, name): - return self.token.type == XML_ELEMENT_START and self.token.name_or_data == name - - def match_element_end(self, name): - return self.token.type == XML_ELEMENT_END and self.token.name_or_data == name - - def element_start(self, name): - while self.token.type == XML_CHARACTER_DATA: - self.consume() - if self.token.type != XML_ELEMENT_START: - raise XmlTokenMismatch(XmlToken(XML_ELEMENT_START, name), self.token) - if self.token.name_or_data != name: - raise XmlTokenMismatch(XmlToken(XML_ELEMENT_START, name), self.token) - attrs = self.token.attrs - self.consume() - return attrs - - def element_end(self, name): - while self.token.type == XML_CHARACTER_DATA: - self.consume() - if self.token.type != XML_ELEMENT_END: - raise XmlTokenMismatch(XmlToken(XML_ELEMENT_END, name), self.token) - if self.token.name_or_data != name: - raise XmlTokenMismatch(XmlToken(XML_ELEMENT_END, name), self.token) - self.consume() - - def character_data(self, strip = True): - data = '' - while self.token.type == XML_CHARACTER_DATA: - data += self.token.name_or_data - self.consume() - if strip: - data = data.strip() - return data - - -class GprofParser(Parser): - """Parser for GNU gprof output. - - See also: - - Chapter "Interpreting gprof's Output" from the GNU gprof manual - http://sourceware.org/binutils/docs-2.18/gprof/Call-Graph.html#Call-Graph - - File "cg_print.c" from the GNU gprof source code - http://sourceware.org/cgi-bin/cvsweb.cgi/~checkout~/src/gprof/cg_print.c?rev=1.12&cvsroot=src - """ - - def __init__(self, fp): - Parser.__init__(self) - self.fp = fp - self.functions = {} - self.cycles = {} - - def readline(self): - line = self.fp.readline() - if not line: - sys.stderr.write('error: unexpected end of file\n') - sys.exit(1) - line = line.rstrip('\r\n') - return line - - _int_re = re.compile(r'^\d+$') - _float_re = re.compile(r'^\d+\.\d+$') - - def translate(self, mo): - """Extract a structure from a match object, while translating the types in the process.""" - attrs = {} - groupdict = mo.groupdict() - for name, value in groupdict.iteritems(): - if value is None: - value = None - elif self._int_re.match(value): - value = int(value) - elif self._float_re.match(value): - value = float(value) - attrs[name] = (value) - return Struct(attrs) - - _cg_header_re = re.compile( - # original gprof header - r'^\s+called/total\s+parents\s*$|' + - r'^index\s+%time\s+self\s+descendents\s+called\+self\s+name\s+index\s*$|' + - r'^\s+called/total\s+children\s*$|' + - # GNU gprof header - r'^index\s+%\s+time\s+self\s+children\s+called\s+name\s*$' - ) - - _cg_ignore_re = re.compile( - # spontaneous - r'^\s+\s*$|' - # internal calls (such as "mcount") - r'^.*\((\d+)\)$' - ) - - _cg_primary_re = re.compile( - r'^\[(?P\d+)\]?' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?:(?P\d+)(?:\+(?P\d+))?)?' + - r'\s+(?P\S.*?)' + - r'(?:\s+\d+)>)?' + - r'\s\[(\d+)\]$' - ) - - _cg_parent_re = re.compile( - r'^\s+(?P\d+\.\d+)?' + - r'\s+(?P\d+\.\d+)?' + - r'\s+(?P\d+)(?:/(?P\d+))?' + - r'\s+(?P\S.*?)' + - r'(?:\s+\d+)>)?' + - r'\s\[(?P\d+)\]$' - ) - - _cg_child_re = _cg_parent_re - - _cg_cycle_header_re = re.compile( - r'^\[(?P\d+)\]?' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?P\d+\.\d+)' + - r'\s+(?:(?P\d+)(?:\+(?P\d+))?)?' + - r'\s+\d+)\sas\sa\swhole>' + - r'\s\[(\d+)\]$' - ) - - _cg_cycle_member_re = re.compile( - r'^\s+(?P\d+\.\d+)?' + - r'\s+(?P\d+\.\d+)?' + - r'\s+(?P\d+)(?:\+(?P\d+))?' + - r'\s+(?P\S.*?)' + - r'(?:\s+\d+)>)?' + - r'\s\[(?P\d+)\]$' - ) - - _cg_sep_re = re.compile(r'^--+$') - - def parse_function_entry(self, lines): - parents = [] - children = [] - - while True: - if not lines: - sys.stderr.write('warning: unexpected end of entry\n') - line = lines.pop(0) - if line.startswith('['): - break - - # read function parent line - mo = self._cg_parent_re.match(line) - if not mo: - if self._cg_ignore_re.match(line): - continue - sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line) - else: - parent = self.translate(mo) - parents.append(parent) - - # read primary line - mo = self._cg_primary_re.match(line) - if not mo: - sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line) - return - else: - function = self.translate(mo) - - while lines: - line = lines.pop(0) - - # read function subroutine line - mo = self._cg_child_re.match(line) - if not mo: - if self._cg_ignore_re.match(line): - continue - sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line) - else: - child = self.translate(mo) - children.append(child) - - function.parents = parents - function.children = children - - self.functions[function.index] = function - - def parse_cycle_entry(self, lines): - - # read cycle header line - line = lines[0] - mo = self._cg_cycle_header_re.match(line) - if not mo: - sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line) - return - cycle = self.translate(mo) - - # read cycle member lines - cycle.functions = [] - for line in lines[1:]: - mo = self._cg_cycle_member_re.match(line) - if not mo: - sys.stderr.write('warning: unrecognized call graph entry: %r\n' % line) - continue - call = self.translate(mo) - cycle.functions.append(call) - - self.cycles[cycle.cycle] = cycle - - def parse_cg_entry(self, lines): - if lines[0].startswith("["): - self.parse_cycle_entry(lines) - else: - self.parse_function_entry(lines) - - def parse_cg(self): - """Parse the call graph.""" - - # skip call graph header - while not self._cg_header_re.match(self.readline()): - pass - line = self.readline() - while self._cg_header_re.match(line): - line = self.readline() - - # process call graph entries - entry_lines = [] - while line != '\014': # form feed - if line and not line.isspace(): - if self._cg_sep_re.match(line): - self.parse_cg_entry(entry_lines) - entry_lines = [] - else: - entry_lines.append(line) - line = self.readline() - - def parse(self): - self.parse_cg() - self.fp.close() - - profile = Profile() - profile[TIME] = 0.0 - - cycles = {} - for index in self.cycles.iterkeys(): - cycles[index] = Cycle() - - for entry in self.functions.itervalues(): - # populate the function - function = Function(entry.index, entry.name) - function[TIME] = entry.self - if entry.called is not None: - function.called = entry.called - if entry.called_self is not None: - call = Call(entry.index) - call[CALLS] = entry.called_self - function.called += entry.called_self - - # populate the function calls - for child in entry.children: - call = Call(child.index) - - assert child.called is not None - call[CALLS] = child.called - - if child.index not in self.functions: - # NOTE: functions that were never called but were discovered by gprof's - # static call graph analysis dont have a call graph entry so we need - # to add them here - missing = Function(child.index, child.name) - function[TIME] = 0.0 - function.called = 0 - profile.add_function(missing) - - function.add_call(call) - - profile.add_function(function) - - if entry.cycle is not None: - try: - cycle = cycles[entry.cycle] - except KeyError: - sys.stderr.write('warning: entry missing\n' % entry.cycle) - cycle = Cycle() - cycles[entry.cycle] = cycle - cycle.add_function(function) - - profile[TIME] = profile[TIME] + function[TIME] - - for cycle in cycles.itervalues(): - profile.add_cycle(cycle) - - # Compute derived events - profile.validate() - profile.ratio(TIME_RATIO, TIME) - profile.call_ratios(CALLS) - profile.integrate(TOTAL_TIME, TIME) - profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME) - - return profile - - -class CallgrindParser(LineParser): - """Parser for valgrind's callgrind tool. - - See also: - - http://valgrind.org/docs/manual/cl-format.html - """ - - _call_re = re.compile('^calls=\s*(\d+)\s+((\d+|\+\d+|-\d+|\*)\s+)+$') - - def __init__(self, infile): - LineParser.__init__(self, infile) - - # Textual positions - self.position_ids = {} - self.positions = {} - - # Numeric positions - self.num_positions = 1 - self.cost_positions = ['line'] - self.last_positions = [0] - - # Events - self.num_events = 0 - self.cost_events = [] - - self.profile = Profile() - self.profile[SAMPLES] = 0 - - def parse(self): - # read lookahead - self.readline() - - self.parse_key('version') - self.parse_key('creator') - while self.parse_part(): - pass - if not self.eof(): - sys.stderr.write('warning: line %u: unexpected line\n' % self.line_no) - sys.stderr.write('%s\n' % self.lookahead()) - - # compute derived data - self.profile.validate() - self.profile.find_cycles() - self.profile.ratio(TIME_RATIO, SAMPLES) - self.profile.call_ratios(CALLS) - self.profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return self.profile - - def parse_part(self): - if not self.parse_header_line(): - return False - while self.parse_header_line(): - pass - if not self.parse_body_line(): - return False - while self.parse_body_line(): - pass - return True - - def parse_header_line(self): - return \ - self.parse_empty() or \ - self.parse_comment() or \ - self.parse_part_detail() or \ - self.parse_description() or \ - self.parse_event_specification() or \ - self.parse_cost_line_def() or \ - self.parse_cost_summary() - - _detail_keys = set(('cmd', 'pid', 'thread', 'part')) - - def parse_part_detail(self): - return self.parse_keys(self._detail_keys) - - def parse_description(self): - return self.parse_key('desc') is not None - - def parse_event_specification(self): - event = self.parse_key('event') - if event is None: - return False - return True - - def parse_cost_line_def(self): - pair = self.parse_keys(('events', 'positions')) - if pair is None: - return False - key, value = pair - items = value.split() - if key == 'events': - self.num_events = len(items) - self.cost_events = items - if key == 'positions': - self.num_positions = len(items) - self.cost_positions = items - self.last_positions = [0]*self.num_positions - return True - - def parse_cost_summary(self): - pair = self.parse_keys(('summary', 'totals')) - if pair is None: - return False - return True - - def parse_body_line(self): - return \ - self.parse_empty() or \ - self.parse_comment() or \ - self.parse_cost_line() or \ - self.parse_position_spec() or \ - self.parse_association_spec() - - __subpos_re = r'(0x[0-9a-fA-F]+|\d+|\+\d+|-\d+|\*)' - _cost_re = re.compile(r'^' + - __subpos_re + r'( +' + __subpos_re + r')*' + - r'( +\d+)*' + - '$') - - def parse_cost_line(self, calls=None): - line = self.lookahead().rstrip() - mo = self._cost_re.match(line) - if not mo: - return False - - function = self.get_function() - - values = line.split() - assert len(values) <= self.num_positions + self.num_events - - positions = values[0 : self.num_positions] - events = values[self.num_positions : ] - events += ['0']*(self.num_events - len(events)) - - for i in range(self.num_positions): - position = positions[i] - if position == '*': - position = self.last_positions[i] - elif position[0] in '-+': - position = self.last_positions[i] + int(position) - elif position.startswith('0x'): - position = int(position, 16) - else: - position = int(position) - self.last_positions[i] = position - - events = map(float, events) - - if calls is None: - function[SAMPLES] += events[0] - self.profile[SAMPLES] += events[0] - else: - callee = self.get_callee() - callee.called += calls - - try: - call = function.calls[callee.id] - except KeyError: - call = Call(callee.id) - call[CALLS] = calls - call[SAMPLES] = events[0] - function.add_call(call) - else: - call[CALLS] += calls - call[SAMPLES] += events[0] - - self.consume() - return True - - def parse_association_spec(self): - line = self.lookahead() - if not line.startswith('calls='): - return False - - _, values = line.split('=', 1) - values = values.strip().split() - calls = int(values[0]) - call_position = values[1:] - self.consume() - - self.parse_cost_line(calls) - - return True - - _position_re = re.compile('^(?P[cj]?(?:ob|fl|fi|fe|fn))=\s*(?:\((?P\d+)\))?(?:\s*(?P.+))?') - - _position_table_map = { - 'ob': 'ob', - 'fl': 'fl', - 'fi': 'fl', - 'fe': 'fl', - 'fn': 'fn', - 'cob': 'ob', - 'cfl': 'fl', - 'cfi': 'fl', - 'cfe': 'fl', - 'cfn': 'fn', - 'jfi': 'fl', - } - - _position_map = { - 'ob': 'ob', - 'fl': 'fl', - 'fi': 'fl', - 'fe': 'fl', - 'fn': 'fn', - 'cob': 'cob', - 'cfl': 'cfl', - 'cfi': 'cfl', - 'cfe': 'cfl', - 'cfn': 'cfn', - 'jfi': 'jfi', - } - - def parse_position_spec(self): - line = self.lookahead() - - if line.startswith('jump=') or line.startswith('jcnd='): - self.consume() - return True - - mo = self._position_re.match(line) - if not mo: - return False - - position, id, name = mo.groups() - if id: - table = self._position_table_map[position] - if name: - self.position_ids[(table, id)] = name - else: - name = self.position_ids.get((table, id), '') - self.positions[self._position_map[position]] = name - - self.consume() - return True - - def parse_empty(self): - if self.eof(): - return False - line = self.lookahead() - if line.strip(): - return False - self.consume() - return True - - def parse_comment(self): - line = self.lookahead() - if not line.startswith('#'): - return False - self.consume() - return True - - _key_re = re.compile(r'^(\w+):') - - def parse_key(self, key): - pair = self.parse_keys((key,)) - if not pair: - return None - key, value = pair - return value - line = self.lookahead() - mo = self._key_re.match(line) - if not mo: - return None - key, value = line.split(':', 1) - if key not in keys: - return None - value = value.strip() - self.consume() - return key, value - - def parse_keys(self, keys): - line = self.lookahead() - mo = self._key_re.match(line) - if not mo: - return None - key, value = line.split(':', 1) - if key not in keys: - return None - value = value.strip() - self.consume() - return key, value - - def make_function(self, module, filename, name): - # FIXME: module and filename are not being tracked reliably - #id = '|'.join((module, filename, name)) - id = name - try: - function = self.profile.functions[id] - except KeyError: - function = Function(id, name) - if module: - function.module = os.path.basename(module) - function[SAMPLES] = 0 - function.called = 0 - self.profile.add_function(function) - return function - - def get_function(self): - module = self.positions.get('ob', '') - filename = self.positions.get('fl', '') - function = self.positions.get('fn', '') - return self.make_function(module, filename, function) - - def get_callee(self): - module = self.positions.get('cob', '') - filename = self.positions.get('cfi', '') - function = self.positions.get('cfn', '') - return self.make_function(module, filename, function) - - -class OprofileParser(LineParser): - """Parser for oprofile callgraph output. - - See also: - - http://oprofile.sourceforge.net/doc/opreport.html#opreport-callgraph - """ - - _fields_re = { - 'samples': r'(\d+)', - '%': r'(\S+)', - 'linenr info': r'(?P\(no location information\)|\S+:\d+)', - 'image name': r'(?P\S+(?:\s\(tgid:[^)]*\))?)', - 'app name': r'(?P\S+)', - 'symbol name': r'(?P\(no symbols\)|.+?)', - } - - def __init__(self, infile): - LineParser.__init__(self, infile) - self.entries = {} - self.entry_re = None - - def add_entry(self, callers, function, callees): - try: - entry = self.entries[function.id] - except KeyError: - self.entries[function.id] = (callers, function, callees) - else: - callers_total, function_total, callees_total = entry - self.update_subentries_dict(callers_total, callers) - function_total.samples += function.samples - self.update_subentries_dict(callees_total, callees) - - def update_subentries_dict(self, totals, partials): - for partial in partials.itervalues(): - try: - total = totals[partial.id] - except KeyError: - totals[partial.id] = partial - else: - total.samples += partial.samples - - def parse(self): - # read lookahead - self.readline() - - self.parse_header() - while self.lookahead(): - self.parse_entry() - - profile = Profile() - - reverse_call_samples = {} - - # populate the profile - profile[SAMPLES] = 0 - for _callers, _function, _callees in self.entries.itervalues(): - function = Function(_function.id, _function.name) - function[SAMPLES] = _function.samples - profile.add_function(function) - profile[SAMPLES] += _function.samples - - if _function.application: - function.process = os.path.basename(_function.application) - if _function.image: - function.module = os.path.basename(_function.image) - - total_callee_samples = 0 - for _callee in _callees.itervalues(): - total_callee_samples += _callee.samples - - for _callee in _callees.itervalues(): - if not _callee.self: - call = Call(_callee.id) - call[SAMPLES2] = _callee.samples - function.add_call(call) - - # compute derived data - profile.validate() - profile.find_cycles() - profile.ratio(TIME_RATIO, SAMPLES) - profile.call_ratios(SAMPLES2) - profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return profile - - def parse_header(self): - while not self.match_header(): - self.consume() - line = self.lookahead() - fields = re.split(r'\s\s+', line) - entry_re = r'^\s*' + r'\s+'.join([self._fields_re[field] for field in fields]) + r'(?P\s+\[self\])?$' - self.entry_re = re.compile(entry_re) - self.skip_separator() - - def parse_entry(self): - callers = self.parse_subentries() - if self.match_primary(): - function = self.parse_subentry() - if function is not None: - callees = self.parse_subentries() - self.add_entry(callers, function, callees) - self.skip_separator() - - def parse_subentries(self): - subentries = {} - while self.match_secondary(): - subentry = self.parse_subentry() - subentries[subentry.id] = subentry - return subentries - - def parse_subentry(self): - entry = Struct() - line = self.consume() - mo = self.entry_re.match(line) - if not mo: - raise ParseError('failed to parse', line) - fields = mo.groupdict() - entry.samples = int(mo.group(1)) - if 'source' in fields and fields['source'] != '(no location information)': - source = fields['source'] - filename, lineno = source.split(':') - entry.filename = filename - entry.lineno = int(lineno) - else: - source = '' - entry.filename = None - entry.lineno = None - entry.image = fields.get('image', '') - entry.application = fields.get('application', '') - if 'symbol' in fields and fields['symbol'] != '(no symbols)': - entry.symbol = fields['symbol'] - else: - entry.symbol = '' - if entry.symbol.startswith('"') and entry.symbol.endswith('"'): - entry.symbol = entry.symbol[1:-1] - entry.id = ':'.join((entry.application, entry.image, source, entry.symbol)) - entry.self = fields.get('self', None) != None - if entry.self: - entry.id += ':self' - if entry.symbol: - entry.name = entry.symbol - else: - entry.name = entry.image - return entry - - def skip_separator(self): - while not self.match_separator(): - self.consume() - self.consume() - - def match_header(self): - line = self.lookahead() - return line.startswith('samples') - - def match_separator(self): - line = self.lookahead() - return line == '-'*len(line) - - def match_primary(self): - line = self.lookahead() - return not line[:1].isspace() - - def match_secondary(self): - line = self.lookahead() - return line[:1].isspace() - - -class HProfParser(LineParser): - """Parser for java hprof output - - See also: - - http://java.sun.com/developer/technicalArticles/Programming/HPROF.html - """ - - trace_re = re.compile(r'\t(.*)\((.*):(.*)\)') - trace_id_re = re.compile(r'^TRACE (\d+):$') - - def __init__(self, infile): - LineParser.__init__(self, infile) - self.traces = {} - self.samples = {} - - def parse(self): - # read lookahead - self.readline() - - while not self.lookahead().startswith('------'): self.consume() - while not self.lookahead().startswith('TRACE '): self.consume() - - self.parse_traces() - - while not self.lookahead().startswith('CPU'): - self.consume() - - self.parse_samples() - - # populate the profile - profile = Profile() - profile[SAMPLES] = 0 - - functions = {} - - # build up callgraph - for id, trace in self.traces.iteritems(): - if not id in self.samples: continue - mtime = self.samples[id][0] - last = None - - for func, file, line in trace: - if not func in functions: - function = Function(func, func) - function[SAMPLES] = 0 - profile.add_function(function) - functions[func] = function - - function = functions[func] - # allocate time to the deepest method in the trace - if not last: - function[SAMPLES] += mtime - profile[SAMPLES] += mtime - else: - c = function.get_call(last) - c[SAMPLES2] += mtime - - last = func - - # compute derived data - profile.validate() - profile.find_cycles() - profile.ratio(TIME_RATIO, SAMPLES) - profile.call_ratios(SAMPLES2) - profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return profile - - def parse_traces(self): - while self.lookahead().startswith('TRACE '): - self.parse_trace() - - def parse_trace(self): - l = self.consume() - mo = self.trace_id_re.match(l) - tid = mo.group(1) - last = None - trace = [] - - while self.lookahead().startswith('\t'): - l = self.consume() - match = self.trace_re.search(l) - if not match: - #sys.stderr.write('Invalid line: %s\n' % l) - break - else: - function_name, file, line = match.groups() - trace += [(function_name, file, line)] - - self.traces[int(tid)] = trace - - def parse_samples(self): - self.consume() - self.consume() - - while not self.lookahead().startswith('CPU'): - rank, percent_self, percent_accum, count, traceid, method = self.lookahead().split() - self.samples[int(traceid)] = (int(count), method) - self.consume() - - -class SysprofParser(XmlParser): - - def __init__(self, stream): - XmlParser.__init__(self, stream) - - def parse(self): - objects = {} - nodes = {} - - self.element_start('profile') - while self.token.type == XML_ELEMENT_START: - if self.token.name_or_data == 'objects': - assert not objects - objects = self.parse_items('objects') - elif self.token.name_or_data == 'nodes': - assert not nodes - nodes = self.parse_items('nodes') - else: - self.parse_value(self.token.name_or_data) - self.element_end('profile') - - return self.build_profile(objects, nodes) - - def parse_items(self, name): - assert name[-1] == 's' - items = {} - self.element_start(name) - while self.token.type == XML_ELEMENT_START: - id, values = self.parse_item(name[:-1]) - assert id not in items - items[id] = values - self.element_end(name) - return items - - def parse_item(self, name): - attrs = self.element_start(name) - id = int(attrs['id']) - values = self.parse_values() - self.element_end(name) - return id, values - - def parse_values(self): - values = {} - while self.token.type == XML_ELEMENT_START: - name = self.token.name_or_data - value = self.parse_value(name) - assert name not in values - values[name] = value - return values - - def parse_value(self, tag): - self.element_start(tag) - value = self.character_data() - self.element_end(tag) - if value.isdigit(): - return int(value) - if value.startswith('"') and value.endswith('"'): - return value[1:-1] - return value - - def build_profile(self, objects, nodes): - profile = Profile() - - profile[SAMPLES] = 0 - for id, object in objects.iteritems(): - # Ignore fake objects (process names, modules, "Everything", "kernel", etc.) - if object['self'] == 0: - continue - - function = Function(id, object['name']) - function[SAMPLES] = object['self'] - profile.add_function(function) - profile[SAMPLES] += function[SAMPLES] - - for id, node in nodes.iteritems(): - # Ignore fake calls - if node['self'] == 0: - continue - - # Find a non-ignored parent - parent_id = node['parent'] - while parent_id != 0: - parent = nodes[parent_id] - caller_id = parent['object'] - if objects[caller_id]['self'] != 0: - break - parent_id = parent['parent'] - if parent_id == 0: - continue - - callee_id = node['object'] - - assert objects[caller_id]['self'] - assert objects[callee_id]['self'] - - function = profile.functions[caller_id] - - samples = node['self'] - try: - call = function.calls[callee_id] - except KeyError: - call = Call(callee_id) - call[SAMPLES2] = samples - function.add_call(call) - else: - call[SAMPLES2] += samples - - # Compute derived events - profile.validate() - profile.find_cycles() - profile.ratio(TIME_RATIO, SAMPLES) - profile.call_ratios(SAMPLES2) - profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return profile - - -class SharkParser(LineParser): - """Parser for MacOSX Shark output. - - Author: tom@dbservice.com - """ - - def __init__(self, infile): - LineParser.__init__(self, infile) - self.stack = [] - self.entries = {} - - def add_entry(self, function): - try: - entry = self.entries[function.id] - except KeyError: - self.entries[function.id] = (function, { }) - else: - function_total, callees_total = entry - function_total.samples += function.samples - - def add_callee(self, function, callee): - func, callees = self.entries[function.id] - try: - entry = callees[callee.id] - except KeyError: - callees[callee.id] = callee - else: - entry.samples += callee.samples - - def parse(self): - self.readline() - self.readline() - self.readline() - self.readline() - - match = re.compile(r'(?P[|+ ]*)(?P\d+), (?P[^,]+), (?P.*)') - - while self.lookahead(): - line = self.consume() - mo = match.match(line) - if not mo: - raise ParseError('failed to parse', line) - - fields = mo.groupdict() - prefix = len(fields.get('prefix', 0)) / 2 - 1 - - symbol = str(fields.get('symbol', 0)) - image = str(fields.get('image', 0)) - - entry = Struct() - entry.id = ':'.join([symbol, image]) - entry.samples = int(fields.get('samples', 0)) - - entry.name = symbol - entry.image = image - - # adjust the callstack - if prefix < len(self.stack): - del self.stack[prefix:] - - if prefix == len(self.stack): - self.stack.append(entry) - - # if the callstack has had an entry, it's this functions caller - if prefix > 0: - self.add_callee(self.stack[prefix - 1], entry) - - self.add_entry(entry) - - profile = Profile() - profile[SAMPLES] = 0 - for _function, _callees in self.entries.itervalues(): - function = Function(_function.id, _function.name) - function[SAMPLES] = _function.samples - profile.add_function(function) - profile[SAMPLES] += _function.samples - - if _function.image: - function.module = os.path.basename(_function.image) - - for _callee in _callees.itervalues(): - call = Call(_callee.id) - call[SAMPLES] = _callee.samples - function.add_call(call) - - # compute derived data - profile.validate() - profile.find_cycles() - profile.ratio(TIME_RATIO, SAMPLES) - profile.call_ratios(SAMPLES) - profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return profile - - -class XPerfParser(Parser): - """Parser for CSVs generted by XPerf, from Microsoft Windows Performance Tools. - """ - - def __init__(self, stream): - Parser.__init__(self) - self.stream = stream - self.profile = Profile() - self.profile[SAMPLES] = 0 - self.column = {} - - def parse(self): - import csv - reader = csv.reader( - self.stream, - delimiter = ',', - quotechar = None, - escapechar = None, - doublequote = False, - skipinitialspace = True, - lineterminator = '\r\n', - quoting = csv.QUOTE_NONE) - it = iter(reader) - row = reader.next() - self.parse_header(row) - for row in it: - self.parse_row(row) - - # compute derived data - self.profile.validate() - self.profile.find_cycles() - self.profile.ratio(TIME_RATIO, SAMPLES) - self.profile.call_ratios(SAMPLES2) - self.profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return self.profile - - def parse_header(self, row): - for column in range(len(row)): - name = row[column] - assert name not in self.column - self.column[name] = column - - def parse_row(self, row): - fields = {} - for name, column in self.column.iteritems(): - value = row[column] - for factory in int, float: - try: - value = factory(value) - except ValueError: - pass - else: - break - fields[name] = value - - process = fields['Process Name'] - symbol = fields['Module'] + '!' + fields['Function'] - weight = fields['Weight'] - count = fields['Count'] - - function = self.get_function(process, symbol) - function[SAMPLES] += weight * count - self.profile[SAMPLES] += weight * count - - stack = fields['Stack'] - if stack != '?': - stack = stack.split('/') - assert stack[0] == '[Root]' - if stack[-1] != symbol: - # XXX: some cases the sampled function does not appear in the stack - stack.append(symbol) - caller = None - for symbol in stack[1:]: - callee = self.get_function(process, symbol) - if caller is not None: - try: - call = caller.calls[callee.id] - except KeyError: - call = Call(callee.id) - call[SAMPLES2] = count - caller.add_call(call) - else: - call[SAMPLES2] += count - caller = callee - - def get_function(self, process, symbol): - function_id = process + '!' + symbol - - try: - function = self.profile.functions[function_id] - except KeyError: - module, name = symbol.split('!', 1) - function = Function(function_id, name) - function.process = process - function.module = module - function[SAMPLES] = 0 - self.profile.add_function(function) - - return function - - -class SleepyParser(Parser): - """Parser for GNU gprof output. - - See also: - - http://www.codersnotes.com/sleepy/ - - http://sleepygraph.sourceforge.net/ - """ - - def __init__(self, filename): - Parser.__init__(self) - - from zipfile import ZipFile - - self.database = ZipFile(filename) - - self.version_0_7 = 'Version 0.7 required' in self.database.namelist() - - self.symbols = {} - self.calls = {} - - self.profile = Profile() - - _symbol_re = re.compile( - r'^(?P\w+)' + - r'\s+"(?P[^"]*)"' + - r'\s+"(?P[^"]*)"' + - r'\s+"(?P[^"]*)"' + - r'\s+(?P\d+)$' - ) - - def parse_symbols(self): - if self.version_0_7: - symbols_txt = 'Symbols.txt' - else: - symbols_txt = 'symbols.txt' - lines = self.database.read(symbols_txt).splitlines() - for line in lines: - mo = self._symbol_re.match(line) - if mo: - symbol_id, module, procname, sourcefile, sourceline = mo.groups() - - function_id = ':'.join([module, procname]) - - try: - function = self.profile.functions[function_id] - except KeyError: - function = Function(function_id, procname) - function.module = module - function[SAMPLES] = 0 - self.profile.add_function(function) - - self.symbols[symbol_id] = function - - def parse_callstacks(self): - if self.version_0_7: - callstacks_txt = 'Callstacks.txt' - else: - callstacks_txt = 'callstacks.txt' - lines = self.database.read(callstacks_txt).splitlines() - for line in lines: - fields = line.split() - samples = float(fields[0]) - callstack = fields[1:] - - callstack = [self.symbols[symbol_id] for symbol_id in callstack] - - callee = callstack[0] - - callee[SAMPLES] += samples - self.profile[SAMPLES] += samples - - for caller in callstack[1:]: - try: - call = caller.calls[callee.id] - except KeyError: - call = Call(callee.id) - call[SAMPLES2] = samples - caller.add_call(call) - else: - call[SAMPLES2] += samples - - callee = caller - - def parse(self): - profile = self.profile - profile[SAMPLES] = 0 - - self.parse_symbols() - self.parse_callstacks() - - # Compute derived events - profile.validate() - profile.find_cycles() - profile.ratio(TIME_RATIO, SAMPLES) - profile.call_ratios(SAMPLES2) - profile.integrate(TOTAL_TIME_RATIO, TIME_RATIO) - - return profile - - -class AQtimeTable: - - def __init__(self, name, fields): - self.name = name - - self.fields = fields - self.field_column = {} - for column in range(len(fields)): - self.field_column[fields[column]] = column - self.rows = [] - - def __len__(self): - return len(self.rows) - - def __iter__(self): - for values, children in self.rows: - fields = {} - for name, value in zip(self.fields, values): - fields[name] = value - children = dict([(child.name, child) for child in children]) - yield fields, children - raise StopIteration - - def add_row(self, values, children=()): - self.rows.append((values, children)) - - -class AQtimeParser(XmlParser): - - def __init__(self, stream): - XmlParser.__init__(self, stream) - self.tables = {} - - def parse(self): - self.element_start('AQtime_Results') - self.parse_headers() - results = self.parse_results() - self.element_end('AQtime_Results') - return self.build_profile(results) - - def parse_headers(self): - self.element_start('HEADERS') - while self.token.type == XML_ELEMENT_START: - self.parse_table_header() - self.element_end('HEADERS') - - def parse_table_header(self): - attrs = self.element_start('TABLE_HEADER') - name = attrs['NAME'] - id = int(attrs['ID']) - field_types = [] - field_names = [] - while self.token.type == XML_ELEMENT_START: - field_type, field_name = self.parse_table_field() - field_types.append(field_type) - field_names.append(field_name) - self.element_end('TABLE_HEADER') - self.tables[id] = name, field_types, field_names - - def parse_table_field(self): - attrs = self.element_start('TABLE_FIELD') - type = attrs['TYPE'] - name = self.character_data() - self.element_end('TABLE_FIELD') - return type, name - - def parse_results(self): - self.element_start('RESULTS') - table = self.parse_data() - self.element_end('RESULTS') - return table - - def parse_data(self): - rows = [] - attrs = self.element_start('DATA') - table_id = int(attrs['TABLE_ID']) - table_name, field_types, field_names = self.tables[table_id] - table = AQtimeTable(table_name, field_names) - while self.token.type == XML_ELEMENT_START: - row, children = self.parse_row(field_types) - table.add_row(row, children) - self.element_end('DATA') - return table - - def parse_row(self, field_types): - row = [None]*len(field_types) - children = [] - self.element_start('ROW') - while self.token.type == XML_ELEMENT_START: - if self.token.name_or_data == 'FIELD': - field_id, field_value = self.parse_field(field_types) - row[field_id] = field_value - elif self.token.name_or_data == 'CHILDREN': - children = self.parse_children() - else: - raise XmlTokenMismatch(" or ", self.token) - self.element_end('ROW') - return row, children - - def parse_field(self, field_types): - attrs = self.element_start('FIELD') - id = int(attrs['ID']) - type = field_types[id] - value = self.character_data() - if type == 'Integer': - value = int(value) - elif type == 'Float': - value = float(value) - elif type == 'Address': - value = int(value) - elif type == 'String': - pass - else: - assert False - self.element_end('FIELD') - return id, value - - def parse_children(self): - children = [] - self.element_start('CHILDREN') - while self.token.type == XML_ELEMENT_START: - table = self.parse_data() - assert table.name not in children - children.append(table) - self.element_end('CHILDREN') - return children - - def build_profile(self, results): - assert results.name == 'Routines' - profile = Profile() - profile[TIME] = 0.0 - for fields, tables in results: - function = self.build_function(fields) - children = tables['Children'] - for fields, _ in children: - call = self.build_call(fields) - function.add_call(call) - profile.add_function(function) - profile[TIME] = profile[TIME] + function[TIME] - profile[TOTAL_TIME] = profile[TIME] - profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME) - return profile - - def build_function(self, fields): - function = Function(self.build_id(fields), self.build_name(fields)) - function[TIME] = fields['Time'] - function[TOTAL_TIME] = fields['Time with Children'] - #function[TIME_RATIO] = fields['% Time']/100.0 - #function[TOTAL_TIME_RATIO] = fields['% with Children']/100.0 - return function - - def build_call(self, fields): - call = Call(self.build_id(fields)) - call[TIME] = fields['Time'] - call[TOTAL_TIME] = fields['Time with Children'] - #call[TIME_RATIO] = fields['% Time']/100.0 - #call[TOTAL_TIME_RATIO] = fields['% with Children']/100.0 - return call - - def build_id(self, fields): - return ':'.join([fields['Module Name'], fields['Unit Name'], fields['Routine Name']]) - - def build_name(self, fields): - # TODO: use more fields - return fields['Routine Name'] - - -class PstatsParser: - """Parser python profiling statistics saved with te pstats module.""" - - def __init__(self, *filename): - import pstats - try: - self.stats = pstats.Stats(*filename) - except ValueError: - import hotshot.stats - self.stats = hotshot.stats.load(filename[0]) - self.profile = Profile() - self.function_ids = {} - - def get_function_name(self, (filename, line, name)): - module = os.path.splitext(filename)[0] - module = os.path.basename(module) - return "%s:%d:%s" % (module, line, name) - - def get_function(self, key): - try: - id = self.function_ids[key] - except KeyError: - id = len(self.function_ids) - name = self.get_function_name(key) - function = Function(id, name) - self.profile.functions[id] = function - self.function_ids[key] = id - else: - function = self.profile.functions[id] - return function - - def parse(self): - self.profile[TIME] = 0.0 - self.profile[TOTAL_TIME] = self.stats.total_tt - for fn, (cc, nc, tt, ct, callers) in self.stats.stats.iteritems(): - callee = self.get_function(fn) - callee.called = nc - callee[TOTAL_TIME] = ct - callee[TIME] = tt - self.profile[TIME] += tt - self.profile[TOTAL_TIME] = max(self.profile[TOTAL_TIME], ct) - for fn, value in callers.iteritems(): - caller = self.get_function(fn) - call = Call(callee.id) - if isinstance(value, tuple): - for i in xrange(0, len(value), 4): - nc, cc, tt, ct = value[i:i+4] - if CALLS in call: - call[CALLS] += cc - else: - call[CALLS] = cc - - if TOTAL_TIME in call: - call[TOTAL_TIME] += ct - else: - call[TOTAL_TIME] = ct - - else: - call[CALLS] = value - call[TOTAL_TIME] = ratio(value, nc)*ct - - caller.add_call(call) - #self.stats.print_stats() - #self.stats.print_callees() - - # Compute derived events - self.profile.validate() - self.profile.ratio(TIME_RATIO, TIME) - self.profile.ratio(TOTAL_TIME_RATIO, TOTAL_TIME) - - return self.profile - - -class Theme: - - def __init__(self, - bgcolor = (0.0, 0.0, 1.0), - mincolor = (0.0, 0.0, 0.0), - maxcolor = (0.0, 0.0, 1.0), - fontname = "Arial", - minfontsize = 10.0, - maxfontsize = 10.0, - minpenwidth = 0.5, - maxpenwidth = 4.0, - gamma = 2.2, - skew = 1.0): - self.bgcolor = bgcolor - self.mincolor = mincolor - self.maxcolor = maxcolor - self.fontname = fontname - self.minfontsize = minfontsize - self.maxfontsize = maxfontsize - self.minpenwidth = minpenwidth - self.maxpenwidth = maxpenwidth - self.gamma = gamma - self.skew = skew - - def graph_bgcolor(self): - return self.hsl_to_rgb(*self.bgcolor) - - def graph_fontname(self): - return self.fontname - - def graph_fontsize(self): - return self.minfontsize - - def node_bgcolor(self, weight): - return self.color(weight) - - def node_fgcolor(self, weight): - return self.graph_bgcolor() - - def node_fontsize(self, weight): - return self.fontsize(weight) - - def edge_color(self, weight): - return self.color(weight) - - def edge_fontsize(self, weight): - return self.fontsize(weight) - - def edge_penwidth(self, weight): - return max(weight*self.maxpenwidth, self.minpenwidth) - - def edge_arrowsize(self, weight): - return 0.5 * math.sqrt(self.edge_penwidth(weight)) - - def fontsize(self, weight): - return max(weight**2 * self.maxfontsize, self.minfontsize) - - def color(self, weight): - weight = min(max(weight, 0.0), 1.0) - - hmin, smin, lmin = self.mincolor - hmax, smax, lmax = self.maxcolor - - if self.skew < 0: - raise ValueError("Skew must be greater than 0") - elif self.skew == 1.0: - h = hmin + weight*(hmax - hmin) - s = smin + weight*(smax - smin) - l = lmin + weight*(lmax - lmin) - else: - base = self.skew - h = hmin + ((hmax-hmin)*(-1.0 + (base ** weight)) / (base - 1.0)) - s = smin + ((smax-smin)*(-1.0 + (base ** weight)) / (base - 1.0)) - l = lmin + ((lmax-lmin)*(-1.0 + (base ** weight)) / (base - 1.0)) - - return self.hsl_to_rgb(h, s, l) - - def hsl_to_rgb(self, h, s, l): - """Convert a color from HSL color-model to RGB. - - See also: - - http://www.w3.org/TR/css3-color/#hsl-color - """ - - h = h % 1.0 - s = min(max(s, 0.0), 1.0) - l = min(max(l, 0.0), 1.0) - - if l <= 0.5: - m2 = l*(s + 1.0) - else: - m2 = l + s - l*s - m1 = l*2.0 - m2 - r = self._hue_to_rgb(m1, m2, h + 1.0/3.0) - g = self._hue_to_rgb(m1, m2, h) - b = self._hue_to_rgb(m1, m2, h - 1.0/3.0) - - # Apply gamma correction - r **= self.gamma - g **= self.gamma - b **= self.gamma - - return (r, g, b) - - def _hue_to_rgb(self, m1, m2, h): - if h < 0.0: - h += 1.0 - elif h > 1.0: - h -= 1.0 - if h*6 < 1.0: - return m1 + (m2 - m1)*h*6.0 - elif h*2 < 1.0: - return m2 - elif h*3 < 2.0: - return m1 + (m2 - m1)*(2.0/3.0 - h)*6.0 - else: - return m1 - - -TEMPERATURE_COLORMAP = Theme( - mincolor = (2.0/3.0, 0.80, 0.25), # dark blue - maxcolor = (0.0, 1.0, 0.5), # satured red - gamma = 1.0 -) - -PINK_COLORMAP = Theme( - mincolor = (0.0, 1.0, 0.90), # pink - maxcolor = (0.0, 1.0, 0.5), # satured red -) - -GRAY_COLORMAP = Theme( - mincolor = (0.0, 0.0, 0.85), # light gray - maxcolor = (0.0, 0.0, 0.0), # black -) - -BW_COLORMAP = Theme( - minfontsize = 8.0, - maxfontsize = 24.0, - mincolor = (0.0, 0.0, 0.0), # black - maxcolor = (0.0, 0.0, 0.0), # black - minpenwidth = 0.1, - maxpenwidth = 8.0, -) - - -class DotWriter: - """Writer for the DOT language. - - See also: - - "The DOT Language" specification - http://www.graphviz.org/doc/info/lang.html - """ - - def __init__(self, fp): - self.fp = fp - - def graph(self, profile, theme): - self.begin_graph() - - fontname = theme.graph_fontname() - - self.attr('graph', fontname=fontname, ranksep=0.25, nodesep=0.125) - self.attr('node', fontname=fontname, shape="box", style="filled", fontcolor="white", width=0, height=0) - self.attr('edge', fontname=fontname) - - for function in profile.functions.itervalues(): - labels = [] - if function.process is not None: - labels.append(function.process) - if function.module is not None: - labels.append(function.module) - labels.append(function.name) - for event in TOTAL_TIME_RATIO, TIME_RATIO: - if event in function.events: - label = event.format(function[event]) - labels.append(label) - if function.called is not None: - labels.append(u"%u\xd7" % (function.called,)) - - if function.weight is not None: - weight = function.weight - else: - weight = 0.0 - - label = '\n'.join(labels) - self.node(function.id, - label = label, - color = self.color(theme.node_bgcolor(weight)), - fontcolor = self.color(theme.node_fgcolor(weight)), - fontsize = "%.2f" % theme.node_fontsize(weight), - ) - - for call in function.calls.itervalues(): - callee = profile.functions[call.callee_id] - - labels = [] - for event in TOTAL_TIME_RATIO, CALLS: - if event in call.events: - label = event.format(call[event]) - labels.append(label) - - if call.weight is not None: - weight = call.weight - elif callee.weight is not None: - weight = callee.weight - else: - weight = 0.0 - - label = '\n'.join(labels) - - self.edge(function.id, call.callee_id, - label = label, - color = self.color(theme.edge_color(weight)), - fontcolor = self.color(theme.edge_color(weight)), - fontsize = "%.2f" % theme.edge_fontsize(weight), - penwidth = "%.2f" % theme.edge_penwidth(weight), - labeldistance = "%.2f" % theme.edge_penwidth(weight), - arrowsize = "%.2f" % theme.edge_arrowsize(weight), - ) - - self.end_graph() - - def begin_graph(self): - self.write('digraph {\n') - - def end_graph(self): - self.write('}\n') - - def attr(self, what, **attrs): - self.write("\t") - self.write(what) - self.attr_list(attrs) - self.write(";\n") - - def node(self, node, **attrs): - self.write("\t") - self.id(node) - self.attr_list(attrs) - self.write(";\n") - - def edge(self, src, dst, **attrs): - self.write("\t") - self.id(src) - self.write(" -> ") - self.id(dst) - self.attr_list(attrs) - self.write(";\n") - - def attr_list(self, attrs): - if not attrs: - return - self.write(' [') - first = True - for name, value in attrs.iteritems(): - if first: - first = False - else: - self.write(", ") - self.id(name) - self.write('=') - self.id(value) - self.write(']') - - def id(self, id): - if isinstance(id, (int, float)): - s = str(id) - elif isinstance(id, basestring): - if id.isalnum() and not id.startswith('0x'): - s = id - else: - s = self.escape(id) - else: - raise TypeError - self.write(s) - - def color(self, (r, g, b)): - - def float2int(f): - if f <= 0.0: - return 0 - if f >= 1.0: - return 255 - return int(255.0*f + 0.5) - - return "#" + "".join(["%02x" % float2int(c) for c in (r, g, b)]) - - def escape(self, s): - s = s.encode('utf-8') - s = s.replace('\\', r'\\') - s = s.replace('\n', r'\n') - s = s.replace('\t', r'\t') - s = s.replace('"', r'\"') - return '"' + s + '"' - - def write(self, s): - self.fp.write(s) - - -class Main: - """Main program.""" - - themes = { - "color": TEMPERATURE_COLORMAP, - "pink": PINK_COLORMAP, - "gray": GRAY_COLORMAP, - "bw": BW_COLORMAP, - } - - def main(self): - """Main program.""" - - parser = optparse.OptionParser( - usage="\n\t%prog [options] [file] ...", - version="%%prog %s" % __version__) - parser.add_option( - '-o', '--output', metavar='FILE', - type="string", dest="output", - help="output filename [stdout]") - parser.add_option( - '-n', '--node-thres', metavar='PERCENTAGE', - type="float", dest="node_thres", default=0.5, - help="eliminate nodes below this threshold [default: %default]") - parser.add_option( - '-e', '--edge-thres', metavar='PERCENTAGE', - type="float", dest="edge_thres", default=0.1, - help="eliminate edges below this threshold [default: %default]") - parser.add_option( - '-f', '--format', - type="choice", choices=('prof', 'callgrind', 'oprofile', 'hprof', 'sysprof', 'pstats', 'shark', 'sleepy', 'aqtime', 'xperf'), - dest="format", default="prof", - help="profile format: prof, callgrind, oprofile, hprof, sysprof, shark, sleepy, aqtime, pstats, or xperf [default: %default]") - parser.add_option( - '-c', '--colormap', - type="choice", choices=('color', 'pink', 'gray', 'bw'), - dest="theme", default="color", - help="color map: color, pink, gray, or bw [default: %default]") - parser.add_option( - '-s', '--strip', - action="store_true", - dest="strip", default=False, - help="strip function parameters, template parameters, and const modifiers from demangled C++ function names") - parser.add_option( - '-w', '--wrap', - action="store_true", - dest="wrap", default=False, - help="wrap function names") - # add a new option to control skew of the colorization curve - parser.add_option( - '--skew', - type="float", dest="theme_skew", default=1.0, - help="skew the colorization curve. Values < 1.0 give more variety to lower percentages. Value > 1.0 give less variety to lower percentages") - (self.options, self.args) = parser.parse_args(sys.argv[1:]) - - if len(self.args) > 1 and self.options.format != 'pstats': - parser.error('incorrect number of arguments') - - try: - self.theme = self.themes[self.options.theme] - except KeyError: - parser.error('invalid colormap \'%s\'' % self.options.theme) - - # set skew on the theme now that it has been picked. - if self.options.theme_skew: - self.theme.skew = self.options.theme_skew - - if self.options.format == 'prof': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = GprofParser(fp) - elif self.options.format == 'callgrind': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = CallgrindParser(fp) - elif self.options.format == 'oprofile': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = OprofileParser(fp) - elif self.options.format == 'sysprof': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = SysprofParser(fp) - elif self.options.format == 'hprof': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = HProfParser(fp) - elif self.options.format == 'pstats': - if not self.args: - parser.error('at least a file must be specified for pstats input') - parser = PstatsParser(*self.args) - elif self.options.format == 'xperf': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = XPerfParser(fp) - elif self.options.format == 'shark': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = SharkParser(fp) - elif self.options.format == 'sleepy': - if len(self.args) != 1: - parser.error('exactly one file must be specified for sleepy input') - parser = SleepyParser(self.args[0]) - elif self.options.format == 'aqtime': - if not self.args: - fp = sys.stdin - else: - fp = open(self.args[0], 'rt') - parser = AQtimeParser(fp) - else: - parser.error('invalid format \'%s\'' % self.options.format) - - self.profile = parser.parse() - - if self.options.output is None: - self.output = sys.stdout - else: - self.output = open(self.options.output, 'wt') - - self.write_graph() - - _parenthesis_re = re.compile(r'\([^()]*\)') - _angles_re = re.compile(r'<[^<>]*>') - _const_re = re.compile(r'\s+const$') - - def strip_function_name(self, name): - """Remove extraneous information from C++ demangled function names.""" - - # Strip function parameters from name by recursively removing paired parenthesis - while True: - name, n = self._parenthesis_re.subn('', name) - if not n: - break - - # Strip const qualifier - name = self._const_re.sub('', name) - - # Strip template parameters from name by recursively removing paired angles - while True: - name, n = self._angles_re.subn('', name) - if not n: - break - - return name - - def wrap_function_name(self, name): - """Split the function name on multiple lines.""" - - if len(name) > 32: - ratio = 2.0/3.0 - height = max(int(len(name)/(1.0 - ratio) + 0.5), 1) - width = max(len(name)/height, 32) - # TODO: break lines in symbols - name = textwrap.fill(name, width, break_long_words=False) - - # Take away spaces - name = name.replace(", ", ",") - name = name.replace("> >", ">>") - name = name.replace("> >", ">>") # catch consecutive - - return name - - def compress_function_name(self, name): - """Compress function name according to the user preferences.""" - - if self.options.strip: - name = self.strip_function_name(name) - - if self.options.wrap: - name = self.wrap_function_name(name) - - # TODO: merge functions with same resulting name - - return name - - def write_graph(self): - dot = DotWriter(self.output) - profile = self.profile - profile.prune(self.options.node_thres/100.0, self.options.edge_thres/100.0) - - for function in profile.functions.itervalues(): - function.name = self.compress_function_name(function.name) - - dot.graph(profile, self.theme) - - -if __name__ == '__main__': - Main().main() diff --git a/targets/SCRIPTS/PROFILING/profoai.sh b/targets/SCRIPTS/PROFILING/profoai.sh deleted file mode 100755 index aeee839b7a..0000000000 --- a/targets/SCRIPTS/PROFILING/profoai.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -echo "----README------" -echo "" -echo "make sure that you have compiled the code with GPROF=1 and installed gprof and graphviz" - -echo "set up params" - -n_frames=4000 -abstraction=1 -traffic_load=2 -ue="1" -#ping="64 128 256 512 1024 1400" - -if [ $abstraction = 1 ]; then - option1="-a" -else - option1="-A AWGN -s 15" -fi; - -if [ $traffic_load = 1 ]; then - option2="-T1" -fi; -if [ $traffic_load = 2 ]; then - option2="-c8" -fi; -if [ $traffic_load = 3 ]; then - option2="-T3" -fi; - -echo "start oai profiling" -for i in $ue -do - rm gmon.out gmon.txt - echo "$OPENAIR_TARGETS/SIMU/USER/oaisim $option1 $option2 -n $n_frames -u $i > /dev/null" -$OPENAIR_TARGETS/SIMU/USER/oaisim $option1 $option2 -n $n_frames -u $i > /dev/null - - #mv $OPENAIR_TARGETS/SIMU/USER/gmon. . - gprof $OPENAIR_TARGETS/SIMU/USER/oaisim > gmon.txt - echo "$OPENAIR_TARGETS/SCRIPTS/gprof2dot.py gmon.txt > profoai.ue$ue.dot" - $OPENAIR_TARGETS/SCRIPTS/PROFILING/gprof2dot.py gmon.txt > profoai.a$abstraction.n$n_frames.ue$i.dot - dot -Tpng profoai.a$abstraction.n$n_frames.ue$i.dot > profoai.a$abstraction.n$n_frames.ue$i.png - echo "oai profiling with $i ue is done" - -done - -echo "end oai profiling" diff --git a/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash b/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash index 91281ec31a..9c4947d479 100755 --- a/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash +++ b/targets/SCRIPTS/install_asn1c_0.9.24.modified.bash @@ -1,31 +1,24 @@ #!/bin/bash -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # Tested on ubuntu 12.04 with updates 07 november 2013 @@ -35,4 +28,4 @@ cd /usr/local/src/asn1c-r1516 $1 patch -p0 < $OPENAIR3_DIR/S1AP/MESSAGES/ASN1/asn1cpatch.p0 > /tmp/install_log.txt $1 ./configure > /tmp/install_log.txt $1 make > /tmp/install_log.txt -$1 make install > /tmp/install_log.txt \ No newline at end of file +$1 make install > /tmp/install_log.txt diff --git a/targets/SIMU/PROC/COPYING b/targets/SIMU/PROC/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/SIMU/PROC/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/SIMU/PROC/Process.c b/targets/SIMU/PROC/Process.c index 28d4970cc0..9b529fd593 100644 --- a/targets/SIMU/PROC/Process.c +++ b/targets/SIMU/PROC/Process.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -292,8 +284,12 @@ void Channel_Inst(int node_id,int port,double **s_re[MAX_eNB+MAX_UE],double **s_ u2e_t[UE_id][eNB_id]->next_slot=&next_slot; u2e_t[UE_id][eNB_id]->abstraction_flag=&abstraction_flag; u2e_t[UE_id][eNB_id]->frame_parms=frame_parms; - u2e_t[UE_id][eNB_id]->tx_data[3]=tx[eNB_id][3]; - u2e_t[UE_id][eNB_id]->rx_data[3]=rx[NB_eNB_INST+UE_id][3]; + + for (int i=0;i<3;i++) + { + u2e_t[UE_id][eNB_id]->tx_data[i]=tx[eNB_id][i]; + u2e_t[UE_id][eNB_id]->rx_data[i]=rx[NB_eNB_INST+UE_id][i]; + } if(pthread_cond_init (&downlink_cond[eNB_id][UE_id], NULL)) exit(1); @@ -324,8 +320,11 @@ void Channel_Inst(int node_id,int port,double **s_re[MAX_eNB+MAX_UE],double **s_ e2u_t[eNB_id][UE_id]->next_slot=&next_slot; e2u_t[eNB_id][UE_id]->abstraction_flag=&abstraction_flag; e2u_t[eNB_id][UE_id]->frame_parms=frame_parms; - e2u_t[eNB_id][UE_id]->tx_data[3]=tx[NB_eNB_INST+UE_id][3]; - e2u_t[eNB_id][UE_id]->rx_data[3]=rx[eNB_id][3]; + for (int i=0;i<3;i++) + { + e2u_t[eNB_id][UE_id]->tx_data[i]=tx[NB_eNB_INST+UE_id][i]; + e2u_t[eNB_id][UE_id]->rx_data[i]=rx[eNB_id][i]; + } if(pthread_cond_init (&uplink_cond[UE_id][eNB_id], NULL)) exit(1); diff --git a/targets/SIMU/PROC/Process.h b/targets/SIMU/PROC/Process.h index 4bf6c7a739..71383f945f 100644 --- a/targets/SIMU/PROC/Process.h +++ b/targets/SIMU/PROC/Process.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __PROCESS_H__ # define __PROCESS_H__ diff --git a/targets/SIMU/PROC/Tsync.h b/targets/SIMU/PROC/Tsync.h index 6488759440..a6ffe11def 100644 --- a/targets/SIMU/PROC/Tsync.h +++ b/targets/SIMU/PROC/Tsync.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * Tsync.h diff --git a/targets/SIMU/PROC/channel_sim_proc.c b/targets/SIMU/PROC/channel_sim_proc.c index 334d3f5549..dd0adec0d2 100644 --- a/targets/SIMU/PROC/channel_sim_proc.c +++ b/targets/SIMU/PROC/channel_sim_proc.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -191,8 +183,13 @@ void do_DL_sig_channel_T(void *param) next_slot=(cthread->next_slot); abstraction_flag=*(cthread->abstraction_flag); thread_id=(cthread->thread_id); - tx_data[3]=cthread->tx_data[3]; - rx_data[3]=cthread->rx_data[3]; + + for (int i=0;i<3;i++) + { + tx_data[i]=cthread->tx_data[i]; + rx_data[i]=cthread->rx_data[i]; + } + s32 att_eNB_id=-1; s32 **txdata,**rxdata; diff --git a/targets/SIMU/PROC/channel_sim_proc.h b/targets/SIMU/PROC/channel_sim_proc.h index 49e732de98..1d5b53a189 100644 --- a/targets/SIMU/PROC/channel_sim_proc.h +++ b/targets/SIMU/PROC/channel_sim_proc.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /* * channel_sim_proc.h diff --git a/targets/SIMU/PROC/interface.h b/targets/SIMU/PROC/interface.h index 0688226ca6..4c00d9d6f3 100644 --- a/targets/SIMU/PROC/interface.h +++ b/targets/SIMU/PROC/interface.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #ifndef __INTERFACE_H__ # define __INTERFACE_H__ diff --git a/targets/SIMU/USER/COPYING b/targets/SIMU/USER/COPYING deleted file mode 100644 index 94a9ed024d..0000000000 --- a/targets/SIMU/USER/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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 Lesser General -Public License instead of this License. But first, please read -. diff --git a/targets/SIMU/USER/Makefile b/targets/SIMU/USER/Makefile index 7de5f9382f..ec5f5eb0cc 100644 --- a/targets/SIMU/USER/Makefile +++ b/targets/SIMU/USER/Makefile @@ -29,13 +29,12 @@ endif CFLAGS += -Wpointer-sign -CFLAGS += -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 $(CPUFLAGS) -I/usr/include/X11 #-Wno-packed-bitfield-compat +CFLAGS += -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 $(CPUFLAGS) -I/usr/include/X11 #-Wno-packed-bitfield-compat ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES -CFLAGS += -DOPENAIR_LTE -DPUCCH #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE -CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 -DPHY_ABSTRACTION #-DPHY_ABSTRACTION_UL #-DRLC_UM_TEST_TRAFFIC=1 -CFLAGS += -DNEW_FFT +CFLAGS += -DOPENAIR_LTE #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE +CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 #-DRLC_UM_TEST_TRAFFIC=1 #CFLAGS += -DLLR8 CFLAGS += -DPACKAGE_NAME='"oaisim"' @@ -48,15 +47,6 @@ DISABLE_XER_PRINT=0 MSG_PRINT=1 endif -ifndef OPENAIR_EMU -export OPENAIR_EMU=1 -CFLAGS += -DOAISIM -endif - -ifdef EMOS -CFLAGS+=-DEMOS -endif - ifeq ($(LOCALIZATION), 1) CFLAGS += -DLOCALIZATION endif @@ -141,8 +131,6 @@ CFLAGS += -DSTOP_ON_IP_TRAFFIC_OVERLOAD endif -ifeq ($(MIH_C_MEDIEVAL_EXTENSIONS), 1) -CFLAGS += -DMIH_C_MEDIEVAL_EXTENSIONS ifeq ($(USE_3GPP_ADDR_AS_LINK_ADDR), 1) CFLAGS += -DUSE_3GPP_ADDR_AS_LINK_ADDR endif @@ -179,7 +167,7 @@ ifdef OAI_NW_DRIVER_TYPE_ETHERNET CFLAGS+=-DOAI_NW_DRIVER_TYPE_ETHERNET endif -CFLAGS += -DENABLE_FXP -DOAI_EMU -DENABLE_USE_CPU_EXECUTION_TIME +CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME ifndef DISABLE_XER_PRINT CFLAGS += -DXER_PRINT endif @@ -272,7 +260,7 @@ endif # Check if libpgm is installed and use it if found instead of the unreliable # multicast ifeq ($(PGM_FOUND), 1) -CFLAGS += $(PGM_CFLAGS) -DENABLE_PGM_TRANSPORT +CFLAGS += $(PGM_CFLAGS) LIBS += $(PGM_LIBS) endif diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index 187f1109c0..b31c47ba95 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -76,39 +68,68 @@ int first_rbUL ; extern Signal_buffers_t *signal_buffers_g; +double r_re_DL[NUMBER_OF_UE_MAX][2][30720]; +double r_im_DL[NUMBER_OF_UE_MAX][2][30720]; +double r_re_UL[NUMBER_OF_eNB_MAX][2][30720]; +double r_im_UL[NUMBER_OF_eNB_MAX][2][30720]; +int RU_output_mask[NUMBER_OF_UE_MAX]; +int UE_output_mask[NUMBER_OF_RU_MAX]; +pthread_mutex_t RU_output_mutex[NUMBER_OF_UE_MAX]; +pthread_mutex_t UE_output_mutex[NUMBER_OF_RU_MAX]; -void do_DL_sig(double **r_re0,double **r_im0, - double **r_re,double **r_im, - double **s_re,double **s_im, - channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs], - node_desc_t *enb_data[NUMBER_OF_eNB_MAX], - node_desc_t *ue_data[NUMBER_OF_UE_MAX], - uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, - uint8_t UE_id, - int CC_id) +double ru_amp[NUMBER_OF_RU_MAX]; + +void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs], + node_desc_t *enb_data[NUMBER_OF_RU_MAX], + node_desc_t *ue_data[NUMBER_OF_UE_MAX], + uint16_t subframe, + uint16_t offset, + uint16_t length, + uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *ue_frame_parms, + uint8_t UE_id, + int CC_id) { int32_t att_eNB_id=-1; int32_t **txdata,**rxdata; - uint8_t eNB_id=0; + uint32_t eNB_id,ru_id=0; double tx_pwr; double rx_pwr; int32_t rx_pwr2; uint32_t i,aa; - uint32_t slot_offset,slot_offset_meas = 0; + uint32_t sf_offset; double min_path_loss=-200; uint8_t hold_channel=0; - // uint8_t aatx,aarx; - uint8_t nb_antennas_rx = eNB2UE[0][0][CC_id]->nb_rx; // number of rx antennas at UE - uint8_t nb_antennas_tx = eNB2UE[0][0][CC_id]->nb_tx; // number of tx antennas at eNB + uint8_t nb_antennas_rx = RU2UE[0][0][CC_id]->nb_rx; // number of rx antennas at UE + uint8_t nb_antennas_tx = RU2UE[0][0][CC_id]->nb_tx; // number of tx antennas at eNB - //LTE_DL_FRAME_PARMS *fp; - // int subframe_sched = ((next_slot>>1) == 0) ? 9 : ((next_slot>>1)-1); + double s_re0[30720]; + double s_re1[30720]; + double *s_re[2]; + double s_im0[30720]; + double s_im1[30720]; + double *s_im[2]; + double r_re00[30720]; + double r_re01[30720]; + double *r_re0[2]; + double r_im00[30720]; + double r_im01[30720]; + double *r_im0[2]; + LTE_DL_FRAME_PARMS *frame_parms; + s_re[0] = s_re0; + s_im[0] = s_im0; + s_re[1] = s_re1; + s_im[1] = s_im1; - if (next_slot==0) + r_re0[0] = r_re00; + r_im0[0] = r_im00; + r_re0[1] = r_re01; + r_im0[1] = r_im01; + + if (subframe==0) hold_channel = 0; else hold_channel = 1; @@ -117,34 +138,38 @@ void do_DL_sig(double **r_re0,double **r_im0, //for (UE_id=0;UE_idnb_taps;i++) - printf("eNB2UE[%d][%d]->a[0][%d] = (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id]->a[0][i].x,eNB2UE[eNB_id][UE_id]->a[0][i].y); + for (i=0;inb_taps;i++) + printf("RU2UE[%d][%d]->a[0][%d] = (%f,%f)\n",eNB_id,UE_id,i,RU2UE[eNB_id][UE_id]->a[0][i].x,RU2UE[eNB_id][UE_id]->a[0][i].y); */ - freq_channel(eNB2UE[eNB_id][UE_id][CC_id], frame_parms->N_RB_DL,frame_parms->N_RB_DL*12+1); + freq_channel(RU2UE[ru_id][UE_id][CC_id], frame_parms->N_RB_DL,frame_parms->N_RB_DL*12+1); } // find out which eNB the UE is attached to - for (eNB_id=0; eNB_idlte_ue_pdcch_vars[0]->crnti,PHY_vars_eNB_g[eNB_id][CC_id])>=0) { + /* + for (eNB_id=0; eNB_idpdcch_vars[0][0]->crnti,RC.eNB[eNB_id][CC_id])>=0) { // UE with UE_id is connected to eNb with eNB_id att_eNB_id=eNB_id; LOG_D(OCM,"A: UE attached to eNB (UE%d->eNB%d)\n",UE_id,eNB_id); } } - + */ // if UE is not attached yet, find assume its the eNB with the smallest pathloss if (att_eNB_id<0) { for (eNB_id=0; eNB_idpath_loss_dB) { - min_path_loss = eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB; - att_eNB_id=eNB_id; - LOG_D(OCM,"B: UE attached to eNB (UE%d->eNB%d)\n",UE_id,eNB_id); - } + for (int ru=0;ruRU_list[ru]->idx; + if (min_path_losspath_loss_dB) { + min_path_loss = RU2UE[ru_id][UE_id][CC_id]->path_loss_dB; + att_eNB_id=eNB_id; + LOG_D(OCM,"B: UE attached to eNB (UE%d->eNB%d)\n",UE_id,eNB_id); + } + } } } @@ -154,20 +179,20 @@ void do_DL_sig(double **r_re0,double **r_im0, } #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp2(eNB2UE[att_eNB_id][UE_id][CC_id]->ch[0], - eNB2UE[att_eNB_id][UE_id][CC_id]->channel_length)*eNB2UE[att_eNB_id][UE_id][CC_id]->channel_length; + rx_pwr = signal_energy_fp2(RU2UE[att_eNB_id][UE_id][CC_id]->ch[0], + RU2UE[att_eNB_id][UE_id][CC_id]->channel_length)*RU2UE[att_eNB_id][UE_id][CC_id]->channel_length; LOG_D(OCM,"Channel (CCid %d) eNB %d => UE %d : tx_power %d dBm, path_loss %f dB\n", CC_id,att_eNB_id,UE_id, frame_parms->pdsch_config_common.referenceSignalPower, - eNB2UE[att_eNB_id][UE_id][CC_id]->path_loss_dB); + RU2UE[att_eNB_id][UE_id][CC_id]->path_loss_dB); #endif //dlsch_abstraction(PHY_vars_UE_g[UE_id]->sinr_dB, rb_alloc, 8); // fill in perfect channel estimates - channel_desc_t *desc1 = eNB2UE[att_eNB_id][UE_id][CC_id]; - int32_t **dl_channel_est = PHY_vars_UE_g[UE_id][CC_id]->lte_ue_common_vars.dl_ch_estimates[0]; - // double scale = pow(10.0,(enb_data[att_eNB_id]->tx_power_dBm + eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0); - double scale = pow(10.0,(frame_parms->pdsch_config_common.referenceSignalPower+eNB2UE[att_eNB_id][UE_id][CC_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB)/20.0); + channel_desc_t *desc1 = RU2UE[att_eNB_id][UE_id][CC_id]; + int32_t **dl_channel_est = PHY_vars_UE_g[UE_id][CC_id]->common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0]; + // double scale = pow(10.0,(enb_data[att_eNB_id]->tx_power_dBm + RU2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0); + double scale = pow(10.0,(frame_parms->pdsch_config_common.referenceSignalPower+RU2UE[att_eNB_id][UE_id][CC_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB)/20.0); LOG_D(OCM,"scale =%lf (%d dB)\n",scale,(int) (20*log10(scale))); // freq_channel(desc1,frame_parms->N_RB_DL,nb_samples); //write_output("channel.m","ch",desc1->ch[0],desc1->channel_length,1,8); @@ -186,420 +211,362 @@ void do_DL_sig(double **r_re0,double **r_im0, } } - /* - if(PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id]>=5) - { - lte_ue_measurements(PHY_vars_UE_g[UE_id], - ((next_slot-1)>>1)*frame_parms->samples_per_tti, - 1, - abstraction_flag); - - PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE_g[UE_id]->PHY_measurements,0); - // printf("pmi_alloc in channel sim: %d",PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc); - } - */ - // calculate the SNR for the attached eNB (this assumes eNB always uses PMI stored in eNB_UE_stats; to be improved) - init_snr(eNB2UE[att_eNB_id][UE_id][CC_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB, &PHY_vars_UE_g[UE_id][CC_id]->N0, - PHY_vars_UE_g[UE_id][CC_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id][CC_id]->eNB_UE_stats[UE_id].DL_pmi_single, - PHY_vars_eNB_g[att_eNB_id][CC_id]->mu_mimo_mode[UE_id].dl_pow_off,PHY_vars_eNB_g[att_eNB_id][CC_id]->lte_frame_parms.N_RB_DL); + init_snr(RU2UE[att_eNB_id][UE_id][CC_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB, &PHY_vars_UE_g[UE_id][CC_id]->N0, + PHY_vars_UE_g[UE_id][CC_id]->transmission_mode[att_eNB_id], RC.eNB[att_eNB_id][CC_id]->UE_stats[UE_id].DL_pmi_single, + RC.eNB[att_eNB_id][CC_id]->mu_mimo_mode[UE_id].dl_pow_off,RC.eNB[att_eNB_id][CC_id]->frame_parms.N_RB_DL); // calculate sinr here for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { if (att_eNB_id != eNB_id) { - calculate_sinr(eNB2UE[eNB_id][UE_id][CC_id], enb_data[eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB,PHY_vars_eNB_g[att_eNB_id][CC_id]->lte_frame_parms.N_RB_DL); + calculate_sinr(RU2UE[eNB_id][UE_id][CC_id], enb_data[eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB, + RC.eNB[att_eNB_id][CC_id]->frame_parms.N_RB_DL); } } } // hold channel } - else { //abstraction_flag - /* - Call do_OFDM_mod from phy_procedures_eNB_TX function - */ - // printf("r_re[0] %p\n",r_re[0]); - for (aa=0; aasamples_per_tti>>1)*sizeof(double)); - memset((void*)r_im[aa],0,(frame_parms->samples_per_tti>>1)*sizeof(double)); + + pthread_mutex_lock(&RU_output_mutex[UE_id]); + + if (RU_output_mask[UE_id] == 0) { // This is the first eNodeB for this UE, clear the buffer + + for (aa=0; aaframe_parms.samples_per_tti)*sizeof(double)); + memset((void*)r_im_DL[UE_id][aa],0,(RC.ru[0]->frame_parms.samples_per_tti)*sizeof(double)); + } } + pthread_mutex_unlock(&RU_output_mutex[UE_id]); - /* - for (i=0;i<16;i++) - printf("%f, %X\n",r_re[aa][i],(unsigned long long)r_re[aa][i]); - */ - for (eNB_id=0; eNB_idtx_power_dBm + - // eNB2UE[eNB_id][UE_id]->path_loss_dB) <= -107.0) - // break; + for (ru_id=0; ru_idcommon.txdata; + frame_parms = &RC.ru[ru_id]->frame_parms; - txdata = PHY_vars_eNB_g[eNB_id][CC_id]->lte_eNB_common_vars.txdata[0]; - slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); - slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1)); + sf_offset = (subframe*frame_parms->samples_per_tti) + offset; + LOG_D(EMU,"TXPATH: RU %d : DL_sig reading TX for subframe %d (sf_offset %d, length %d) from %p\n",ru_id,subframe,sf_offset,length,txdata[0]+sf_offset); + int length_meas = frame_parms->ofdm_symbol_size; tx_pwr = dac_fixed_gain(s_re, s_im, txdata, - slot_offset, + sf_offset, nb_antennas_tx, - frame_parms->samples_per_tti>>1, - slot_offset_meas, - frame_parms->ofdm_symbol_size, + length, + sf_offset, + length_meas, 14, - // enb_data[eNB_id]->tx_power_dBm); frame_parms->pdsch_config_common.referenceSignalPower, // dBm/RE + 0, + &ru_amp[ru_id], frame_parms->N_RB_DL*12); #ifdef DEBUG_SIM - LOG_D(OCM,"[SIM][DL] eNB %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for slot %d (subframe %d)\n", - eNB_id,CC_id, + LOG_D(PHY,"[SIM][DL] subframe %d: txp (time) %d dB\n", + subframe,dB_fixed(signal_energy(&txdata[0][sf_offset],length_meas))); + + LOG_D(OCM,"[SIM][DL] RU %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for subframe %d\n", + ru_id,CC_id, 10*log10(tx_pwr), frame_parms->pdsch_config_common.referenceSignalPower, - next_slot, - next_slot>>1); + subframe); + #endif - //eNB2UE[eNB_id][UE_id]->path_loss_dB = 0; - multipath_channel(eNB2UE[eNB_id][UE_id][CC_id],s_re,s_im,r_re0,r_im0, - frame_parms->samples_per_tti>>1,hold_channel); + tx_pwr = signal_energy_fp(s_re,s_im,nb_antennas_tx, + lengthN_RB_DL); + + //RU2UE[eNB_id][UE_id]->path_loss_dB = 0; + multipath_channel(RU2UE[ru_id][UE_id][CC_id],s_re,s_im,r_re0,r_im0, + length,hold_channel); #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp2(eNB2UE[eNB_id][UE_id][CC_id]->ch[0], - eNB2UE[eNB_id][UE_id][CC_id]->channel_length)*eNB2UE[eNB_id][UE_id][CC_id]->channel_length; - LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d (CCid %d): Channel gain %f dB (%f)\n",eNB_id,UE_id,CC_id,10*log10(rx_pwr),rx_pwr); + rx_pwr = signal_energy_fp2(RU2UE[ru_id][UE_id][CC_id]->ch[0], + RU2UE[ru_id][UE_id][CC_id]->channel_length)*RU2UE[ru_id][UE_id][CC_id]->channel_length; + LOG_D(OCM,"[SIM][DL] Channel RU %d => UE %d (CCid %d): Channel gain %f dB (%f)\n",ru_id,UE_id,CC_id,10*log10(rx_pwr),rx_pwr); #endif #ifdef DEBUG_SIM - for (i=0; ichannel_length; i++) - LOG_D(OCM,"channel(%d,%d)[%d] : (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id][CC_id]->ch[0][i].x,eNB2UE[eNB_id][UE_id][CC_id]->ch[0][i].y); + for (i=0; ichannel_length; i++) + LOG_D(OCM,"channel(%d,%d)[%d] : (%f,%f)\n",ru_id,UE_id,i,RU2UE[ru_id][UE_id][CC_id]->ch[0][i].x,RU2UE[ru_id][UE_id][CC_id]->ch[0][i].y); #endif - LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d (CCid %d): tx_power %.1f dBm/RE, path_loss %1.f dB\n", - eNB_id,UE_id,CC_id, + LOG_D(OCM,"[SIM][DL] Channel RU %d => UE %d (CCid %d): tx_power %.1f dBm/RE, path_loss %1.f dB\n", + ru_id,UE_id,CC_id, (double)frame_parms->pdsch_config_common.referenceSignalPower, // enb_data[eNB_id]->tx_power_dBm, - eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB); + RU2UE[ru_id][UE_id][CC_id]->path_loss_dB); #ifdef DEBUG_SIM rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx, - frame_parms->ofdm_symbol_size, - slot_offset_meas)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI)for slot %d (subframe %d)\n",UE_id, - 10*log10(rx_pwr), - 10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12),next_slot,next_slot>>1); - LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (noise) -132 dBm/RE (N0fs = %.1f dBm, N0B = %.1f dBm) for slot %d (subframe %d)\n", + lengthN_RB_DL); + LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI,tx %f dB)for subframe %d (length %d)\n",UE_id, + 10*log10(rx_pwr), + 10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12), + 10*log10(tx_pwr),subframe, + lengthsampling_rate*1e6)-174, - 10*log10(eNB2UE[eNB_id][UE_id][CC_id]->sampling_rate*1e6*12*frame_parms->N_RB_DL/(double)frame_parms->ofdm_symbol_size)-174, - next_slot,next_slot>>1); + 10*log10(RU2UE[ru_id][UE_id][CC_id]->sampling_rate*1e6)-174, + 10*log10(RU2UE[ru_id][UE_id][CC_id]->sampling_rate*1e6*12*frame_parms->N_RB_DL/(double)frame_parms->ofdm_symbol_size)-174, + subframe); #endif - if (eNB2UE[eNB_id][UE_id][CC_id]->first_run == 1) - eNB2UE[eNB_id][UE_id][CC_id]->first_run = 0; + if (RU2UE[ru_id][UE_id][CC_id]->first_run == 1) + RU2UE[ru_id][UE_id][CC_id]->first_run = 0; // RF model #ifdef DEBUG_SIM - LOG_D(OCM,"[SIM][DL] UE %d (CCid %d): rx_gain %d dB (-ADC %f) for slot %d (subframe %d)\n",UE_id,CC_id,PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB, - PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB-66.227,next_slot,next_slot>>1); + LOG_D(OCM,"[SIM][DL] UE %d (CCid %d): rx_gain %d dB (-ADC %f) for subframe %d\n",UE_id,CC_id,PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB, + PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB-66.227,subframe); #endif - /* - rf_rx(r_re0, - r_im0, - NULL, - NULL, - 0, - nb_antennas_rx, - frame_parms->samples_per_tti>>1, - 1e3/eNB2UE[eNB_id][UE_id]->BW, // sampling time (ns) - 0.0, // freq offset (Hz) (-20kHz..20kHz) - 0.0, // drift (Hz) NOT YET IMPLEMENTED - ue_data[UE_id]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED - (double)PHY_vars_UE_g[UE_id]->rx_total_gain_dB - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) - 200.0, // IP3_dBm (dBm) - &eNB2UE[eNB_id][UE_id]->ip, // initial phase - 30.0e3, // pn_cutoff (kHz) - -500.0, // pn_amp (dBc) default: 50 - 0.0, // IQ imbalance (dB), - 0.0); // IQ phase imbalance (rad) - */ rf_rx_simple(r_re0, r_im0, nb_antennas_rx, - frame_parms->samples_per_tti>>1, - 1e3/eNB2UE[eNB_id][UE_id][CC_id]->sampling_rate, // sampling time (ns) + length, + 1e3/RU2UE[ru_id][UE_id][CC_id]->sampling_rate, // sampling time (ns) (double)PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) #ifdef DEBUG_SIM rx_pwr = signal_energy_fp(r_re0,r_im0, nb_antennas_rx, - frame_parms->ofdm_symbol_size, - slot_offset_meas)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : ADC in (eNB %d) %f dBm/RE for slot %d (subframe %d)\n", - UE_id,eNB_id, - 10*log10(rx_pwr),next_slot,next_slot>>1); + lengthN_RB_DL); + LOG_D(OCM,"[SIM][DL] UE %d : ADC in (RU %d) %f dBm/RE for subframe %d\n", + UE_id,ru_id, + 10*log10(rx_pwr),subframe); #endif - - for (i=0; i<(frame_parms->samples_per_tti>>1); i++) { + + pthread_mutex_lock(&RU_output_mutex[UE_id]); + for (i=0; isamples_per_tti; i++) { for (aa=0; aaofdm_symbol_size,slot_offset_meas)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1); + rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,lengthN_RB_DL); + LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm/RE for subframe %d\n",UE_id,10*log10(rx_pwr),subframe); #endif + + rxdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.rxdata; + sf_offset = (subframe*frame_parms->samples_per_tti)+offset; - rxdata = PHY_vars_UE_g[UE_id][CC_id]->lte_ue_common_vars.rxdata; - slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); - - adc(r_re, - r_im, - 0, - slot_offset, - rxdata, - nb_antennas_rx, - frame_parms->samples_per_tti>>1, - 12); + adc(r_re_p, + r_im_p, + 0, + sf_offset, + rxdata, + nb_antennas_rx, + length, + 12); + #ifdef DEBUG_SIM - rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->ofdm_symbol_size)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB/RE (%d) for slot %d (subframe %d), writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1,rxdata); + rx_pwr2 = signal_energy(rxdata[0]+sf_offset,lengthN_RB_DL); + LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB/RE (%d) for subframe %d, writing to %p, length %d\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,subframe,rxdata,lengthN_RB_DL) ,subframe); #else - UNUSED_VARIABLE(rx_pwr2); - UNUSED_VARIABLE(tx_pwr); - UNUSED_VARIABLE(rx_pwr); + UNUSED_VARIABLE(rx_pwr2); + UNUSED_VARIABLE(tx_pwr); + UNUSED_VARIABLE(rx_pwr); #endif - //}// UE_index loop + + } // RU_output_mask + pthread_mutex_unlock(&RU_output_mutex[UE_id]); + } // ru_id + } } -void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs], - node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame,uint8_t CC_id) +void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM_CCs], + node_desc_t *enb_data[NUMBER_OF_RU_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX], + uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, + uint32_t frame,int ru_id,uint8_t CC_id) { int32_t **txdata,**rxdata; -#ifdef PHY_ABSTRACTION_UL - int32_t att_eNB_id=-1; -#endif - uint8_t eNB_id=0,UE_id=0; + uint8_t UE_id=0; - uint8_t nb_antennas_rx = UE2eNB[0][0][CC_id]->nb_rx; // number of rx antennas at eNB - uint8_t nb_antennas_tx = UE2eNB[0][0][CC_id]->nb_tx; // number of tx antennas at UE + uint8_t nb_antennas_rx = UE2RU[0][0][CC_id]->nb_rx; // number of rx antennas at eNB + uint8_t nb_antennas_tx = UE2RU[0][0][CC_id]->nb_tx; // number of tx antennas at UE double tx_pwr, rx_pwr; int32_t rx_pwr2; uint32_t i,aa; - uint32_t slot_offset,slot_offset_meas; + uint32_t sf_offset; uint8_t hold_channel=0; -#ifdef PHY_ABSTRACTION_UL - double min_path_loss=-200; - uint16_t ul_nb_rb=0 ; - uint16_t ul_fr_rb=0; - int ulnbrb2 ; - int ulfrrb2 ; - uint8_t harq_pid; - int subframe = (next_slot>>1); -#endif + double s_re0[30720]; + double s_re1[30720]; + double *s_re[2]; + double s_im0[30720]; + double s_im1[30720]; + double *s_im[2]; + double r_re00[30720]; + double r_re01[30720]; + double *r_re0[2]; + double r_im00[30720]; + double r_im01[30720]; + double *r_im0[2]; - /* - if (next_slot==4) - hold_channel = 0; - else - hold_channel = 1; - */ + s_re[0] = s_re0; + s_im[0] = s_im0; + s_re[1] = s_re1; + s_im[1] = s_im1; + r_re0[0] = r_re00; + r_im0[0] = r_im00; + r_re0[1] = r_re01; + r_im0[1] = r_im01; + if (abstraction_flag!=0) { -#ifdef PHY_ABSTRACTION_UL - - for (eNB_id=0; eNB_idN_RB_UL,frame_parms->N_RB_UL*12+1); - - // REceived power at the eNB - rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0], - UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][att_eNB_id][CC_id]->channel_length; // calculate the rx power at the eNB - } - - // write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1); - if(subframe>1 && subframe <5) { - harq_pid = subframe2harq_pid(frame_parms,frame,subframe); - ul_nb_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->nb_rb; - ul_fr_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->first_rb; - } - - if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1)) { - number_rb_ul = ul_nb_rb; - first_rbUL = ul_fr_rb; - init_snr_up(UE2eNB[UE_id][att_eNB_id][CC_id],enb_data[att_eNB_id], ue_data[UE_id],PHY_vars_eNB_g[att_eNB_id][CC_id]->sinr_dB,&PHY_vars_UE_g[att_eNB_id][CC_id]->N0,ul_nb_rb,ul_fr_rb); - - } - } //UE_id - } //eNB_id - -#else - /* the following functions are not needed */ - /* - if (abstraction_flag!=0) { - for (eNB_id=0;eNB_idN_RB_UL,2); - } - } - } - */ -#endif } else { //without abstraction - /* - for (UE_id=0;UE_idlte_ue_common_vars.txdataF,PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdata,next_slot,&PHY_vars_UE_g[UE_id]->lte_frame_parms); - } - */ - - for (eNB_id=0; eNB_idsamples_per_tti>>1); i++) { - for (aa=0; aasamples_per_tti; i++) { + for (aa=0; aacommon_vars.txdata; + AssertFatal(txdata != NULL,"txdata is null\n"); + sf_offset = subframe*frame_parms->samples_per_tti; + if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe] + + UE2RU[UE_id][ru_id][CC_id]->path_loss_dB) <= -125.0) { + // don't simulate a UE that is too weak + LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %d dBm (num_RE %d) for subframe %d (sf_offset %d)\n", + UE_id, + PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe], + PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe], + subframe,sf_offset); + } else { + tx_pwr = dac_fixed_gain((double**)s_re, + (double**)s_im, + txdata, + sf_offset, + nb_antennas_tx, + frame_parms->samples_per_tti, + sf_offset, + frame_parms->ofdm_symbol_size, + 14, + (double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe]-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]), + 1, + NULL, + PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]); // This make the previous argument the total power + LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm, num_RE %d) for subframe %d (sf_offset %d)\n", + UE_id, + 10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]), + PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe], + PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe], + subframe,sf_offset); + + + multipath_channel(UE2RU[UE_id][ru_id][CC_id],s_re,s_im,r_re0,r_im0, + frame_parms->samples_per_tti,hold_channel); + - txdata = PHY_vars_UE_g[UE_id][CC_id]->lte_ue_common_vars.txdata; - slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); - slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1)); + rx_pwr = signal_energy_fp2(UE2RU[UE_id][ru_id][CC_id]->ch[0], + UE2RU[UE_id][ru_id][CC_id]->channel_length)*UE2RU[UE_id][ru_id][CC_id]->channel_length; - if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm + - UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB) <= -125.0) { + LOG_D(OCM,"[SIM][UL] subframe %d Channel UE %d => RU %d : %f dB (hold %d,length %d, PL %f)\n",subframe,UE_id,ru_id,10*log10(rx_pwr), + hold_channel,UE2RU[UE_id][ru_id][CC_id]->channel_length, + UE2RU[UE_id][ru_id][CC_id]->path_loss_dB); - // don't simulate a UE that is too weak - } else { + rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->samples_per_tti,0); + LOG_D(OCM,"[SIM][UL] RU %d (%d/%d rx antennas) : rx_pwr %f dBm (tx_pwr - PL %f) for subframe %d, sptti %d\n", + ru_id,nb_antennas_rx,UE2RU[UE_id][ru_id][CC_id]->nb_rx,10*log10(rx_pwr),10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe])+UE2RU[UE_id][ru_id][CC_id]->path_loss_dB,subframe,frame_parms->samples_per_tti); + /* + if (abs(10*log10(rx_pwr)-10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe])-UE2RU[UE_id][ru_id][CC_id]->path_loss_dB)>3) { + write_output("txsig_re.m","s_re",s_re[0],frame_parms->samples_per_tti,1,7); + write_output("txsig_im.m","s_im",s_im[0],frame_parms->samples_per_tti,1,7); + write_output("rxsig_re.m","r_re",r_re0[0],frame_parms->samples_per_tti,1,7); + write_output("rxsig_im.m","r_im",r_im0[0],frame_parms->samples_per_tti,1,7); + exit(-1); + }*/ - tx_pwr = dac_fixed_gain(s_re, - s_im, - txdata, - slot_offset, - nb_antennas_tx, - frame_parms->samples_per_tti>>1, - slot_offset_meas, - frame_parms->ofdm_symbol_size, - 14, - (double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE), - PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE); // This make the previous argument the total power - //ue_data[UE_id]->tx_power_dBm); - //#ifdef DEBUG_SIM - LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm, num_RE %d) for slot %d (subframe %d, slot_offset %d, slot_offset_meas %d)\n", - UE_id, - 10*log10(tx_pwr), - PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm, - PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE, - next_slot,next_slot>>1,slot_offset,slot_offset_meas); - //#endif - - multipath_channel(UE2eNB[UE_id][eNB_id][CC_id],s_re,s_im,r_re0,r_im0, - frame_parms->samples_per_tti>>1,hold_channel); - - //#ifdef DEBUG_SIM - rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0], - UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][eNB_id][CC_id]->channel_length; - LOG_D(OCM,"[SIM][UL] slot %d Channel UE %d => eNB %d : %f dB (hold %d,length %d, PL %f)\n",next_slot,UE_id,eNB_id,10*log10(rx_pwr), - hold_channel,UE2eNB[UE_id][eNB_id][CC_id]->channel_length, - UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB); - //#endif - - //#ifdef DEBUG_SIM - rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->samples_per_tti>>1,0); - LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dBm (%f) for slot %d (subframe %d), sptti %d\n", - eNB_id,10*log10(rx_pwr),rx_pwr,next_slot,next_slot>>1,frame_parms->samples_per_tti); - //#endif - - - if (UE2eNB[UE_id][eNB_id][CC_id]->first_run == 1) - UE2eNB[UE_id][eNB_id][CC_id]->first_run = 0; - - - - for (aa=0; aasamples_per_tti>>1); i++) { - r_re[aa][i]+=r_re0[aa][i]; - r_im[aa][i]+=r_im0[aa][i]; - } - } - } - } //UE_id - - // RF model - /* - rf_rx(r_re0, - r_im0, - NULL, - NULL, - 0, - frame_parms->nb_antennas_rx, - frame_parms->samples_per_tti>>1, - 1e3/UE2eNB[UE_id][eNB_id]->BW, // sampling time (ns) - 0.0, // freq offset (Hz) (-20kHz..20kHz) - 0.0, // drift (Hz) NOT YET IMPLEMENTED - enb_data[eNB_id]->rx_noise_level, // noise_figure NOT YET IMPLEMENTED - (double)PHY_vars_eNB_g[eNB_id]->rx_total_gain_eNB_dB - 66.227, // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) - 200.0, // IP3_dBm (dBm) - &UE2eNB[UE_id][eNB_id]->ip, // initial phase - 30.0e3, // pn_cutoff (kHz) - -500.0, // pn_amp (dBc) default: 50 - 0.0, // IQ imbalance (dB), - 0.0); // IQ phase imbalance (rad) - */ - - rf_rx_simple(r_re, - r_im, - nb_antennas_rx, - frame_parms->samples_per_tti>>1, - 1e3/UE2eNB[0][eNB_id][CC_id]->sampling_rate, // sampling time (ns) - (double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_eNB_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) + if (UE2RU[UE_id][ru_id][CC_id]->first_run == 1) + UE2RU[UE_id][ru_id][CC_id]->first_run = 0; + + + pthread_mutex_lock(&UE_output_mutex[ru_id]); + for (aa=0; aasamples_per_tti; i++) { + r_re_UL[ru_id][aa][i]+=r_re0[aa][i]; + r_im_UL[ru_id][aa][i]+=r_im0[aa][i]; + } + } + pthread_mutex_unlock(&UE_output_mutex[ru_id]); + } + } //UE_id + + double *r_re_p[2] = {r_re_UL[ru_id][0],r_re_UL[ru_id][1]}; + double *r_im_p[2] = {r_im_UL[ru_id][0],r_im_UL[ru_id][1]}; + rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->samples_per_tti,0); + LOG_D(OCM,"[SIM][UL] RU %d (%d/%d rx antennas) : rx_pwr %f dBm (before RF) for subframe %d, gain %f\n", + ru_id,nb_antennas_rx,nb_antennas_rx,10*log10(rx_pwr),subframe, + (double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx - 66.227); + rf_rx_simple(r_re_p, + r_im_p, + nb_antennas_rx, + frame_parms->samples_per_tti, + 1e3/UE2RU[0][ru_id][CC_id]->sampling_rate, // sampling time (ns) + (double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) + #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->samples_per_tti>>1,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1); + rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->samples_per_tti,0);//*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL; + LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for subframe %d (rx_gain %f)\n",10*log10(rx_pwr),subframe, + (double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx); #endif + + rxdata = RC.ru[ru_id]->common.rxdata; + sf_offset = subframe*frame_parms->samples_per_tti; - rxdata = PHY_vars_eNB_g[eNB_id][CC_id]->lte_eNB_common_vars.rxdata[0]; - slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1); - - adc(r_re, - r_im, - 0, - slot_offset, - rxdata, - nb_antennas_rx, - frame_parms->samples_per_tti>>1, - 12); - + + adc(r_re_p, + r_im_p, + 0, + sf_offset, + rxdata, + nb_antennas_rx, + frame_parms->samples_per_tti, + 12); + #ifdef DEBUG_SIM - rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->samples_per_tti>>1)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][UL] eNB %d rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d)\n",eNB_id,10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1); + rx_pwr2 = signal_energy(rxdata[0]+sf_offset,frame_parms->samples_per_tti)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); + LOG_D(OCM,"[SIM][UL] RU %d rx_pwr (ADC out) %f dB (%d) for subframe %d (offset %d) = %p\n",ru_id,10*log10((double)rx_pwr2),rx_pwr2,subframe,sf_offset,rxdata[0]+sf_offset); #else - UNUSED_VARIABLE(tx_pwr); - UNUSED_VARIABLE(rx_pwr); - UNUSED_VARIABLE(rx_pwr2); + UNUSED_VARIABLE(tx_pwr); + UNUSED_VARIABLE(rx_pwr); + UNUSED_VARIABLE(rx_pwr2); #endif - - } // eNB_id + } // abstraction_flag==0 } @@ -610,29 +577,13 @@ void init_channel_vars(LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ** int i; - *s_re = malloc(2*sizeof(double*)); - *s_im = malloc(2*sizeof(double*)); - *r_re = malloc(2*sizeof(double*)); - *r_im = malloc(2*sizeof(double*)); - *r_re0 = malloc(2*sizeof(double*)); - *r_im0 = malloc(2*sizeof(double*)); + memset(RU_output_mask,0,sizeof(int)*NUMBER_OF_UE_MAX); + for (i=0;i. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "cor_SF_sim.h" diff --git a/targets/SIMU/USER/cor_SF_sim.h b/targets/SIMU/USER/cor_SF_sim.h index 193eef90f1..35b75564e8 100644 --- a/targets/SIMU/USER/cor_SF_sim.h +++ b/targets/SIMU/USER/cor_SF_sim.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include diff --git a/targets/SIMU/USER/event_handler.c b/targets/SIMU/USER/event_handler.c index 1f7ecde72e..7c9f6b73fc 100644 --- a/targets/SIMU/USER/event_handler.c +++ b/targets/SIMU/USER/event_handler.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file event_handler.c * \brief event handler primitives @@ -442,6 +434,7 @@ void update_mac(Event_t event) UE_list = &eNB_mac_inst->UE_list; for(i=UE_list->head; i>=0; i=UE_list->next[i]) { + /* if(&mac_config[i].DCI_aggregation_min) { LOG_I(EMU,"update dci aggregation min\n"); oai_emulation->mac_config[i].DCI_aggregation_min= mac_config[i].DCI_aggregation_min; @@ -457,6 +450,7 @@ void update_mac(Event_t event) LOG_I(EMU,"DLSCH_dci_size_bits UE %d: \n",i); LOG_I(EMU,"%" PRIu8,UE_list->UE_template[0][i].DLSCH_dci_size_bits); } + */ if(mac_config[i].priority !=NULL) { LOG_I(EMU,"update priority \n"); @@ -521,7 +515,7 @@ void update_mac(Event_t event) if(&mac_config[i].mac_ContentionResolutionTimer !=NULL) { oai_emulation->mac_config[i].mac_ContentionResolutionTimer= mac_config[i].mac_ContentionResolutionTimer; UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer = oai_emulation->mac_config[i].mac_ContentionResolutionTimer; - LOG_I(EMU,"mac_ContentionResolutionTimer UE %:", i); + LOG_I(EMU,"mac_ContentionResolutionTimer UE %d:", i); LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer); } @@ -554,7 +548,7 @@ void update_mac(Event_t event) LOG_I(EMU,"update complete mac params \n"); i = event.ue; int j = event.lcid; - + /* if(&mac_config[i].DCI_aggregation_min) { LOG_I(EMU,"update dci aggregation min\n"); oai_emulation->mac_config[i].DCI_aggregation_min= mac_config[i].DCI_aggregation_min; @@ -570,7 +564,7 @@ void update_mac(Event_t event) LOG_I(EMU,"DLSCH_dci_size_bits UE %d: \n",i); LOG_I(EMU,"%" PRIu8,UE_list->UE_template[0][i].DLSCH_dci_size_bits); } - + */ if(mac_config[i].priority !=NULL) { LOG_I(EMU,"update priority \n"); @@ -645,7 +639,7 @@ void update_mac(Event_t event) if(&mac_config[i].mac_ContentionResolutionTimer !=NULL) { oai_emulation->mac_config[i].mac_ContentionResolutionTimer= mac_config[i].mac_ContentionResolutionTimer; UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer = oai_emulation->mac_config[i].mac_ContentionResolutionTimer; - LOG_I(EMU,"mac_ContentionResolutionTimer UE %:", i); + LOG_I(EMU,"mac_ContentionResolutionTimer UE %d:", i); LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer); } @@ -698,18 +692,18 @@ void update_mac(Event_t event) if(event.ue == -1) { UE_list = &eNB_mac_inst->UE_list; - + /* for(i=UE_list->head; i>=0; i=UE_list->next[i]) { oai_emulation->mac_config[i].DCI_aggregation_min=mac_config[i].DCI_aggregation_min; UE_list->UE_template[0][i].DCI_aggregation_min = oai_emulation->mac_config[i].DCI_aggregation_min; LOG_I(EMU,"DCI_aggregation_min UE %d : \n", i); LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_template[0][i].DCI_aggregation_min); - } + }*/ } else { - oai_emulation->mac_config[event.ue].DCI_aggregation_min=mac_config[event.ue].DCI_aggregation_min; + /* oai_emulation->mac_config[event.ue].DCI_aggregation_min=mac_config[event.ue].DCI_aggregation_min; UE_list->UE_template[0][event.ue].DCI_aggregation_min = oai_emulation->mac_config[event.ue].DCI_aggregation_min; LOG_I(EMU,"DCI_aggregation_min UE %d : \n", event.ue); - LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_template[0][event.ue].DCI_aggregation_min); + LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_template[0][event.ue].DCI_aggregation_min);*/ } } else if(!strcmp((char *) event.key, "DLSCH_dci_size_bits") && event.value!=NULL && validate_mac(event)) { Mac_config* mac_config;// = malloc(sizeof(Mac_config)*16); @@ -720,18 +714,18 @@ void update_mac(Event_t event) if(event.ue == -1) { UE_list = &eNB_mac_inst->UE_list; - + /* for(i=UE_list->head; i>=0; i=UE_list->next[i]) { oai_emulation->mac_config[i].DLSCH_dci_size_bits=mac_config[i].DLSCH_dci_size_bits; UE_list->UE_template[0][i].DLSCH_dci_size_bits = oai_emulation->mac_config[i].DLSCH_dci_size_bits; LOG_I(EMU,"DLSCH_dci_size_bits UE %d: \n", i); LOG_I(EMU,"%" PRIu8,UE_list->UE_template[0][i].DLSCH_dci_size_bits); - } + }*/ } else { - oai_emulation->mac_config[event.ue].DLSCH_dci_size_bits=mac_config[event.ue].DLSCH_dci_size_bits; + /* oai_emulation->mac_config[event.ue].DLSCH_dci_size_bits=mac_config[event.ue].DLSCH_dci_size_bits; UE_list->UE_template[0][event.ue].DLSCH_dci_size_bits = oai_emulation->mac_config[event.ue].DLSCH_dci_size_bits; LOG_I(EMU,"DLSCH_dci_size_bits UE %d: \n", event.ue); - LOG_I(EMU,"%" PRIu8,UE_list->UE_template[0][event.ue].DLSCH_dci_size_bits); + LOG_I(EMU,"%" PRIu8,UE_list->UE_template[0][event.ue].DLSCH_dci_size_bits);*/ } } else if(!strcmp((char *) event.key, "ul_bandwidth") && event.value!=NULL) { @@ -911,13 +905,13 @@ void update_mac(Event_t event) for(i=UE_list->head; i>=0; i=UE_list->next[i]) { oai_emulation->mac_config[i].cqiSchedInterval= mac_config[i].cqiSchedInterval; UE_list->UE_sched_ctrl[i].cqiSchedInterval = oai_emulation->mac_config[i].cqiSchedInterval; - LOG_I(EMU,"cqiSchedInterval UE :\n", i); + LOG_I(EMU,"cqiSchedInterval UE %d:\n", i); LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[i].cqiSchedInterval); } } else { oai_emulation->mac_config[event.ue].cqiSchedInterval= mac_config[event.ue].cqiSchedInterval; UE_list->UE_sched_ctrl[event.ue].cqiSchedInterval = oai_emulation->mac_config[event.ue].cqiSchedInterval; - LOG_I(EMU,"cqiSchedInterval UE :\n", event.ue); + LOG_I(EMU,"cqiSchedInterval UE %d:\n", event.ue); LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[event.ue].cqiSchedInterval); } } else if(!strcmp((char *) event.key, "mac_ContentionResolutionTimer") && event.value!=NULL && validate_mac(event)) { @@ -931,13 +925,13 @@ void update_mac(Event_t event) for(i=UE_list->head; i>=0; i=UE_list->next[i]) { oai_emulation->mac_config[i].mac_ContentionResolutionTimer= mac_config[i].mac_ContentionResolutionTimer; UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer = oai_emulation->mac_config[i].mac_ContentionResolutionTimer; - LOG_I(EMU,"mac_ContentionResolutionTimer UE :\n", i); + LOG_I(EMU,"mac_ContentionResolutionTimer UE %d:\n", i); LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer); } } else { oai_emulation->mac_config[event.ue].mac_ContentionResolutionTimer= mac_config[event.ue].mac_ContentionResolutionTimer; UE_list->UE_sched_ctrl[event.ue].mac_ContentionResolutionTimer = oai_emulation->mac_config[event.ue].mac_ContentionResolutionTimer; - LOG_I(EMU,"mac_ContentionResolutionTimer UE :\n", event.ue); + LOG_I(EMU,"mac_ContentionResolutionTimer UE %d:\n", event.ue); LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[event.ue].mac_ContentionResolutionTimer); } } else if(!strcmp((char *) event.key, "max_allowed_rbs") && event.value!=NULL && validate_mac(event)) { @@ -1048,7 +1042,7 @@ void update_sys_model(Event_t event) LOG_I(EMU,"free_space_model_parameters.pathloss_exponent %G\n",oai_emulation->environment_system_config.fading.free_space_model_parameters.pathloss_exponent); LOG_I(EMU,"free_space_model_parameters.pathloss_0_dB %G\n",oai_emulation->environment_system_config.fading.free_space_model_parameters.pathloss_0_dB); - LOG_I(EMU,"ricean_8tap.rice_factor_dB %G\n",oai_emulation->environment_system_config.fading.ricean_8tap.rice_factor_dB); + LOG_I(EMU,"ricean_8tap.rice_factor_dB %d\n",oai_emulation->environment_system_config.fading.ricean_8tap.rice_factor_dB); //Antenna LOG_I(EMU,"antenna.eNB_antenna.number_of_sectors %d\n",oai_emulation->environment_system_config.antenna.eNB_antenna.number_of_sectors); @@ -1111,7 +1105,7 @@ void update_sys_model(Event_t event) } else if(!strcmp((char *) event.key, "free_space_model_parameters.pathloss_0_dB")) { LOG_I(EMU,"free_space_model_parameters.pathloss_0_dB %G\n",oai_emulation->environment_system_config.fading.free_space_model_parameters.pathloss_0_dB); } else if(!strcmp((char *) event.key, "ricean_8tap.rice_factor_dB")) { - LOG_I(EMU,"ricean_8tap.rice_factor_dB %G\n",oai_emulation->environment_system_config.fading.ricean_8tap.rice_factor_dB); + LOG_I(EMU,"ricean_8tap.rice_factor_dB %d\n",oai_emulation->environment_system_config.fading.ricean_8tap.rice_factor_dB); } else if(!strcmp((char *) event.key, "antenna.eNB_antenna.number_of_sectors")) { LOG_I(EMU,"antenna.eNB_antenna.number_of_sectors %d\n",oai_emulation->environment_system_config.antenna.eNB_antenna.number_of_sectors); } else if(!strcmp((char *) event.key, "antenna.eNB_antenna.beam_width_dB")) { @@ -1210,8 +1204,8 @@ void update_topo_model(Event_t event) LOG_I(EMU,"UE_moving_dynamics_max_speed_mps %G\n",oai_emulation->topology_config.mobility.UE_mobility.UE_moving_dynamics.max_speed_mps); LOG_I(EMU,"UE_moving_dynamics_min_journey_time_ms %G\n",oai_emulation->topology_config.mobility.UE_mobility.UE_moving_dynamics.min_journey_time_ms); LOG_I(EMU,"UE_moving_dynamics_max_journey_time_ms %G\n",oai_emulation->topology_config.mobility.UE_mobility.UE_moving_dynamics.max_journey_time_ms); - LOG_I(EMU,"grid_map_horizontal_grid %G\n",oai_emulation->topology_config.mobility.UE_mobility.grid_walk.grid_map.horizontal_grid); - LOG_I(EMU,"grid_map_vertical_grid %G\n",oai_emulation->topology_config.mobility.UE_mobility.grid_walk.grid_map.vertical_grid); + LOG_I(EMU,"grid_map_horizontal_grid %d\n",oai_emulation->topology_config.mobility.UE_mobility.grid_walk.grid_map.horizontal_grid); + LOG_I(EMU,"grid_map_vertical_grid %d\n",oai_emulation->topology_config.mobility.UE_mobility.grid_walk.grid_map.vertical_grid); LOG_I(EMU,"UE_initial_distribution_selected_option %s\n",oai_emulation->topology_config.mobility.UE_mobility.UE_initial_distribution.selected_option); LOG_I(EMU,"random_UE_distribution_number_of_nodes %d\n",oai_emulation->topology_config.mobility.UE_mobility.random_UE_distribution.number_of_nodes); LOG_I(EMU,"concentrated_UE_distribution_number_of_nodes %d\n",oai_emulation->topology_config.mobility.UE_mobility.concentrated_UE_distribution.number_of_nodes); @@ -1253,9 +1247,9 @@ void update_topo_model(Event_t event) } else if(!strcmp((char *) event.key, "UE_moving_dynamics_max_journey_time_ms")) { LOG_I(EMU,"UE_moving_dynamics_max_journey_time_ms %G\n",oai_emulation->topology_config.mobility.UE_mobility.UE_moving_dynamics.max_journey_time_ms); } else if(!strcmp((char *) event.key, "grid_map_horizontal_grid")) { - LOG_I(EMU,"grid_map_horizontal_grid %G\n",oai_emulation->topology_config.mobility.UE_mobility.grid_walk.grid_map.horizontal_grid); + LOG_I(EMU,"grid_map_horizontal_grid %d\n",oai_emulation->topology_config.mobility.UE_mobility.grid_walk.grid_map.horizontal_grid); } else if(!strcmp((char *) event.key, "grid_map_vertical_grid")) { - LOG_I(EMU,"grid_map_vertical_grid %G\n",oai_emulation->topology_config.mobility.UE_mobility.grid_walk.grid_map.vertical_grid); + LOG_I(EMU,"grid_map_vertical_grid %d\n",oai_emulation->topology_config.mobility.UE_mobility.grid_walk.grid_map.vertical_grid); } else if(!strcmp((char *) event.key, "UE_initial_distribution_selected_option")) { LOG_I(EMU,"UE_initial_distribution_selected_option %s\n",oai_emulation->topology_config.mobility.UE_mobility.UE_initial_distribution.selected_option); } else if(!strcmp((char *) event.key, "random_UE_distribution_number_of_nodes")) { diff --git a/targets/SIMU/USER/event_handler.h b/targets/SIMU/USER/event_handler.h index 748d4efc2c..d6579fd411 100644 --- a/targets/SIMU/USER/event_handler.h +++ b/targets/SIMU/USER/event_handler.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file event_handler.h * \brief primitives to handle event acting on oai diff --git a/targets/SIMU/USER/init_lte.c b/targets/SIMU/USER/init_lte.c index 861bfa6cbf..0818629727 100644 --- a/targets/SIMU/USER/init_lte.c +++ b/targets/SIMU/USER/init_lte.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -45,12 +37,11 @@ #include "PHY_INTERFACE/extern.h" - +/* PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, uint8_t eNB_id, uint8_t Nid_cell, - uint8_t cooperation_flag, - uint8_t transmission_mode, + node_function_t node_function, uint8_t abstraction_flag) { @@ -58,144 +49,109 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, PHY_VARS_eNB* PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB)); memset(PHY_vars_eNB,0,sizeof(PHY_VARS_eNB)); PHY_vars_eNB->Mod_id=eNB_id; - PHY_vars_eNB->cooperation_flag=cooperation_flag; - memcpy(&(PHY_vars_eNB->lte_frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); - PHY_vars_eNB->lte_frame_parms.Nid_cell = ((Nid_cell/3)*3)+((eNB_id+Nid_cell)%3); - PHY_vars_eNB->lte_frame_parms.nushift = PHY_vars_eNB->lte_frame_parms.Nid_cell%6; - phy_init_lte_eNB(PHY_vars_eNB,0,cooperation_flag,abstraction_flag); + memcpy(&(PHY_vars_eNB->frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); + PHY_vars_eNB->frame_parms.Nid_cell = ((Nid_cell/3)*3)+((eNB_id+Nid_cell)%3); + PHY_vars_eNB->frame_parms.nushift = PHY_vars_eNB->frame_parms.Nid_cell%6; + phy_init_lte_eNB(PHY_vars_eNB,0,abstraction_flag); + LOG_I(PHY,"init eNB: Node Function %d\n",node_function); LOG_I(PHY,"init eNB: Nid_cell %d\n", frame_parms->Nid_cell); LOG_I(PHY,"init eNB: frame_type %d,tdd_config %d\n", frame_parms->frame_type,frame_parms->tdd_config); LOG_I(PHY,"init eNB: number of ue max %d number of enb max %d number of harq pid max %d\n", NUMBER_OF_UE_MAX, NUMBER_OF_eNB_MAX, NUMBER_OF_HARQ_PID_MAX); LOG_I(PHY,"init eNB: N_RB_DL %d\n", frame_parms->N_RB_DL); - LOG_I(PHY,"init eNB: Transmission mode %d\n", transmission_mode); + LOG_I(PHY,"init eNB: prach_config_index %d\n", frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex); + + if (node_function >= NGFI_RRU_IF5) + // For RRU, don't allocate DLSCH/ULSCH Transport channel buffers + return (PHY_vars_eNB); + for (i=0; idlsch_eNB[i][j] = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL,abstraction_flag); - - if (!PHY_vars_eNB->dlsch_eNB[i][j]) { - LOG_E(PHY,"Can't get eNB dlsch structures for UE %d \n", i); - exit(-1); + PHY_vars_eNB->dlsch[i][j] = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL,abstraction_flag,frame_parms); + if (!PHY_vars_eNB->dlsch[i][j]) { + LOG_E(PHY,"Can't get eNB dlsch structures for UE %d \n", i); + exit(-1); } else { - LOG_D(PHY,"dlsch_eNB[%d][%d] => %p\n",i,j,PHY_vars_eNB->dlsch_eNB[i][j]); - PHY_vars_eNB->dlsch_eNB[i][j]->rnti=0; + LOG_D(PHY,"dlsch[%d][%d] => %p\n",i,j,PHY_vars_eNB->dlsch[i][j]); + PHY_vars_eNB->dlsch[i][j]->rnti=0; } } + - PHY_vars_eNB->ulsch_eNB[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,frame_parms->N_RB_UL, abstraction_flag); - - if (!PHY_vars_eNB->ulsch_eNB[1+i]) { + LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i); + PHY_vars_eNB->ulsch[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,frame_parms->N_RB_UL, abstraction_flag); + + if (!PHY_vars_eNB->ulsch[1+i]) { LOG_E(PHY,"Can't get eNB ulsch structures\n"); exit(-1); } - + // this is the transmission mode for the signalling channels // this will be overwritten with the real transmission mode by the RRC once the UE is connected - PHY_vars_eNB->transmission_mode[i] = transmission_mode; + PHY_vars_eNB->transmission_mode[i] = frame_parms->nb_antenna_ports_eNB==1 ? 1 : 2; #ifdef LOCALIZATION - PHY_vars_eNB->ulsch_eNB[1+i]->aggregation_period_ms = 5000; // 5000 milliseconds // could be given as an argument (TBD)) + PHY_vars_eNB->ulsch[1+i]->aggregation_period_ms = 5000; // 5000 milliseconds // could be given as an argument (TBD)) struct timeval ts; gettimeofday(&ts, NULL); - PHY_vars_eNB->ulsch_eNB[1+i]->reference_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000; + PHY_vars_eNB->ulsch[1+i]->reference_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000; int j; - + for (j=0; j<10; j++) { - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_rss_list[j]); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_rssi_list[j]); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_subcarrier_rss_list[j]); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_timing_advance_list[j]); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_timing_update_list[j]); + initialize(&PHY_vars_eNB->ulsch[1+i]->loc_rss_list[j]); + initialize(&PHY_vars_eNB->ulsch[1+i]->loc_rssi_list[j]); + initialize(&PHY_vars_eNB->ulsch[1+i]->loc_subcarrier_rss_list[j]); + initialize(&PHY_vars_eNB->ulsch[1+i]->loc_timing_advance_list[j]); + initialize(&PHY_vars_eNB->ulsch[1+i]->loc_timing_update_list[j]); } - - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->tot_loc_rss_list); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->tot_loc_rssi_list); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->tot_loc_subcarrier_rss_list); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->tot_loc_timing_advance_list); - initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->tot_loc_timing_update_list); + + initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_rss_list); + initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_rssi_list); + initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_subcarrier_rss_list); + initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_timing_advance_list); + initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_timing_update_list); #endif } - + // ULSCH for RA - PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS, frame_parms->N_RB_UL, abstraction_flag); - - if (!PHY_vars_eNB->ulsch_eNB[0]) { + PHY_vars_eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS, frame_parms->N_RB_UL, abstraction_flag); + + if (!PHY_vars_eNB->ulsch[0]) { LOG_E(PHY,"Can't get eNB ulsch structures\n"); exit(-1); } - - PHY_vars_eNB->dlsch_eNB_SI = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag); - LOG_D(PHY,"eNB %d : SI %p\n",eNB_id,PHY_vars_eNB->dlsch_eNB_SI); - PHY_vars_eNB->dlsch_eNB_ra = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag); - LOG_D(PHY,"eNB %d : RA %p\n",eNB_id,PHY_vars_eNB->dlsch_eNB_ra); - PHY_vars_eNB->dlsch_eNB_MCH = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, 0); - LOG_D(PHY,"eNB %d : MCH %p\n",eNB_id,PHY_vars_eNB->dlsch_eNB_MCH); - - - PHY_vars_eNB->rx_total_gain_eNB_dB=130; - + PHY_vars_eNB->dlsch_SI = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag, frame_parms); + LOG_D(PHY,"eNB %d : SI %p\n",eNB_id,PHY_vars_eNB->dlsch_SI); + PHY_vars_eNB->dlsch_ra = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag, frame_parms); + LOG_D(PHY,"eNB %d : RA %p\n",eNB_id,PHY_vars_eNB->dlsch_ra); + PHY_vars_eNB->dlsch_MCH = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, 0, frame_parms); + LOG_D(PHY,"eNB %d : MCH %p\n",eNB_id,PHY_vars_eNB->dlsch_MCH); + + + PHY_vars_eNB->rx_total_gain_dB=130; + for(i=0; imu_mimo_mode[i].dl_pow_off = 2; - + PHY_vars_eNB->check_for_total_transmissions = 0; - + PHY_vars_eNB->check_for_MUMIMO_transmissions = 0; - + PHY_vars_eNB->FULL_MUMIMO_transmissions = 0; - + PHY_vars_eNB->check_for_SUMIMO_transmissions = 0; - - PHY_vars_eNB->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; + + PHY_vars_eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; return (PHY_vars_eNB); } - -PHY_VARS_UE* init_lte_UE(LTE_DL_FRAME_PARMS *frame_parms, - uint8_t UE_id, - uint8_t abstraction_flag, - uint8_t transmission_mode) -{ - - int i,j; - PHY_VARS_UE* PHY_vars_UE = malloc(sizeof(PHY_VARS_UE)); - memset(PHY_vars_UE,0,sizeof(PHY_VARS_UE)); - PHY_vars_UE->Mod_id=UE_id; - memcpy(&(PHY_vars_UE->lte_frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS)); - phy_init_lte_ue(PHY_vars_UE,1,abstraction_flag); - - for (i=0; idlsch_ue[i][j] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); - - if (!PHY_vars_UE->dlsch_ue[i][j]) { - LOG_E(PHY,"Can't get ue dlsch structures\n"); - exit(-1); - } else - LOG_D(PHY,"dlsch_ue[%d][%d] => %p\n",UE_id,i,PHY_vars_UE->dlsch_ue[i][j]); - } +*/ +/* - PHY_vars_UE->ulsch_ue[i] = new_ue_ulsch(frame_parms->N_RB_UL, abstraction_flag); - - if (!PHY_vars_UE->ulsch_ue[i]) { - LOG_E(PHY,"Can't get ue ulsch structures\n"); - exit(-1); - } - - PHY_vars_UE->dlsch_ue_SI[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); - PHY_vars_UE->dlsch_ue_ra[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, abstraction_flag); - - PHY_vars_UE->transmission_mode[i] = transmission_mode; - } - - PHY_vars_UE->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1; - - PHY_vars_UE->dlsch_ue_MCH[0] = new_ue_dlsch(1,NUMBER_OF_HARQ_PID_MAX,NSOFT,MAX_TURBO_ITERATIONS_MBSFN,frame_parms->N_RB_DL,0); - - return (PHY_vars_UE); -} PHY_VARS_RN* init_lte_RN(LTE_DL_FRAME_PARMS *frame_parms, uint8_t RN_id, uint8_t eMBMS_active_state) @@ -218,6 +174,7 @@ PHY_VARS_RN* init_lte_RN(LTE_DL_FRAME_PARMS *frame_parms, return (PHY_vars_RN); } + void init_lte_vars(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs], uint8_t frame_type, uint8_t tdd_config, @@ -225,11 +182,18 @@ void init_lte_vars(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs], uint8_t extended_prefix_flag, uint8_t N_RB_DL, uint16_t Nid_cell, - uint8_t cooperation_flag,uint8_t transmission_mode,uint8_t abstraction_flag, - int nb_antennas_rx, uint8_t eMBMS_active_state) + uint8_t cooperation_flag, + uint8_t nb_antenna_ports, + uint8_t abstraction_flag, + int nb_antennas_rx, + int nb_antennas_tx, + int nb_antennas_rx_ue, + uint8_t eMBMS_active_state) { - uint8_t eNB_id,UE_id,RN_id,CC_id; + uint8_t eNB_id,UE_id,CC_id; + int i; + mac_xface = malloc(sizeof(MAC_xface)); @@ -250,10 +214,10 @@ void init_lte_vars(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs], (frame_parms[CC_id])->Ncp_UL = extended_prefix_flag; (frame_parms[CC_id])->Nid_cell = Nid_cell; (frame_parms[CC_id])->nushift = (Nid_cell%6); - (frame_parms[CC_id])->nb_antennas_tx = (transmission_mode == 1) ? 1 : 2; - (frame_parms[CC_id])->nb_antennas_tx_eNB = (transmission_mode == 1) ? 1 : 2; - (frame_parms[CC_id])->nb_antennas_rx = (transmission_mode == 1) ? 1 : 2; - (frame_parms[CC_id])->mode1_flag = (transmission_mode == 1) ? 1 : 0; + (frame_parms[CC_id])->nb_antennas_tx = nb_antennas_tx; + (frame_parms[CC_id])->nb_antennas_rx = nb_antennas_rx; + (frame_parms[CC_id])->nb_antenna_ports_eNB = nb_antenna_ports; + (frame_parms[CC_id])->mode1_flag = (frame_parms[CC_id])->nb_antenna_ports_eNB==1 ? 1 : 0; init_frame_parms(frame_parms[CC_id],1); @@ -269,15 +233,21 @@ void init_lte_vars(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs], phy_init_lte_top(frame_parms[0]); - PHY_vars_eNB_g = (PHY_VARS_eNB***)malloc(NB_eNB_INST*sizeof(PHY_VARS_eNB**)); + RC.nb_inst = NB_eNB_INST; + RC.nb_CC = (int *)malloc(MAX_NUM_CCs*sizeof(int)); + RC.nb_RU = NB_RU; + for (i=0;iMod_id=eNB_id; - PHY_vars_eNB_g[eNB_id][CC_id]->CC_id=CC_id; + RC.eNB[eNB_id][CC_id] = init_lte_eNB(frame_parms[CC_id],eNB_id,Nid_cell,eNodeB_3GPP,abstraction_flag); + RC.eNB[eNB_id][CC_id]->Mod_id=eNB_id; + RC.eNB[eNB_id][CC_id]->CC_id=CC_id; } } @@ -289,21 +259,20 @@ void init_lte_vars(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs], for (CC_id=0; CC_idnb_antennas_tx = 1; - (frame_parms[CC_id])->nb_antennas_rx = nb_antennas_rx; - - - PHY_vars_UE_g[UE_id][CC_id] = init_lte_UE(frame_parms[CC_id], UE_id,abstraction_flag,transmission_mode); + (frame_parms[CC_id])->nb_antennas_rx = nb_antennas_rx_ue; + PHY_vars_UE_g[UE_id][CC_id] = init_lte_UE(frame_parms[CC_id], UE_id,abstraction_flag); PHY_vars_UE_g[UE_id][CC_id]->Mod_id=UE_id; PHY_vars_UE_g[UE_id][CC_id]->CC_id=CC_id; } } + +// if (NB_RN_INST > 0) { +// PHY_vars_RN_g = malloc(NB_RN_INST*sizeof(PHY_VARS_RN*)); - if (NB_RN_INST > 0) { - PHY_vars_RN_g = malloc(NB_RN_INST*sizeof(PHY_VARS_RN*)); - - for (RN_id=0; RN_id. - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "PHY/types.h" #include "PHY/defs.h" @@ -33,14 +25,12 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms, uint8_t eNB_id, uint8_t Nid_cell, - uint8_t cooperation_flag, - uint8_t transmission_mode, + node_function_t node_function, uint8_t abstraction_flag); PHY_VARS_UE* init_lte_UE(LTE_DL_FRAME_PARMS *frame_parms, uint8_t UE_id, - uint8_t abstraction_flag, - uint8_t transmission_mode); + uint8_t abstraction_flag); PHY_VARS_RN* init_lte_RN(LTE_DL_FRAME_PARMS *frame_parms, uint8_t RN_id, @@ -54,7 +44,9 @@ void init_lte_vars(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs], uint8_t N_RB_DL, uint16_t Nid_cell, uint8_t cooperation_flag, - uint8_t transmission_mode, + uint8_t nb_antenna_ports, uint8_t abstraction_flag, int nb_antennas_rx, + int nb_antennas_tx, + int nb_antennas_rx_ue, uint8_t eMBMS_active_state); diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index e388356b7c..7d8b33f12c 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -1,41 +1,34 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file oaisim.c -* \brief oaisim top level -* \author Navid Nikaein -* \date 2013-2015 -* \version 1.0 -* \company Eurecom -* \email: openair_tech@eurecom.fr -* \note -* \warning -*/ + * \brief oaisim top level + * \author Navid Nikaein + * \date 2013-2015 + * \version 1.0 + * \company Eurecom + * \email: openair_tech@eurecom.fr + * \note + * \warning + */ #include #include @@ -61,24 +54,16 @@ #include "LAYER2/MAC/proto.h" #include "LAYER2/MAC/vars.h" #include "pdcp.h" -#ifndef CELLULAR #include "RRC/LITE/vars.h" -#endif -#include "PHY_INTERFACE/vars.h" -//#endif #include "RRC/NAS/nas_config.h" -#ifdef IFFT_FPGA -//#include "PHY/LTE_REFSIG/mod_table.h" -#endif //IFFT_FPGA #include "SCHED/defs.h" #include "SCHED/vars.h" +#include "system.h" + -//#ifdef XFORMS #include "PHY/TOOLS/lte_phy_scope.h" -//#endif -//#include "LAYER2/PROTO_AGENT/proto_agent.h" #ifdef SMBV // Rohde&Schwarz SMBV100A vector signal generator @@ -91,6 +76,11 @@ uint8_t config_smbv = 0; char smbv_ip[16]; #endif +#if defined(FLEXRAN_AGENT_SB_IF) +# include "flexran_agent.h" +#endif + + #include "oaisim_functions.h" #include "oaisim.h" @@ -117,14 +107,12 @@ char smbv_ip[16]; #include "T.h" -#include "LAYER2/PROTO_AGENT/proto_agent.h" - /* - DCI0_5MHz_TDD0_t UL_alloc_pdu; - DCI1A_5MHz_TDD_1_6_t CCCH_alloc_pdu; - DCI2_5MHz_2A_L10PRB_TDD_t DLSCH_alloc_pdu1; - DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2; - */ + DCI0_5MHz_TDD0_t UL_alloc_pdu; + DCI1A_5MHz_TDD_1_6_t CCCH_alloc_pdu; + DCI2_5MHz_2A_L10PRB_TDD_t DLSCH_alloc_pdu1; + DCI2_5MHz_2A_M10PRB_TDD_t DLSCH_alloc_pdu2; +*/ #define UL_RB_ALLOC computeRIV(lte_frame_parms->N_RB_UL,0,24) #define CCCH_RB_ALLOC computeRIV(lte_frame_parms->N_RB_UL,0,3) @@ -140,13 +128,41 @@ char smbv_ip[16]; //#define K 2 /* averaging coefficient */ //#define TARGET_SF_TIME_NS 1000000 /* 1ms = 1000000 ns */ +uint8_t usim_test = 0; + frame_t frame = 0; char stats_buffer[16384]; -channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs]; -channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs]; +channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs]; +channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM_CCs]; //Added for PHY abstraction -node_desc_t *enb_data[NUMBER_OF_eNB_MAX]; +node_desc_t *enb_data[NUMBER_OF_RU_MAX]; node_desc_t *ue_data[NUMBER_OF_UE_MAX]; + +pthread_cond_t sync_cond; +pthread_mutex_t sync_mutex; +int sync_var=-1; + +pthread_mutex_t subframe_mutex; +int subframe_ru_mask=0,subframe_UE_mask=0; + +openair0_config_t openair0_cfg[MAX_CARDS]; +uint32_t downlink_frequency[MAX_NUM_CCs][4]; +int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; +openair0_rf_map rf_map[MAX_NUM_CCs]; + +#if defined(ENABLE_ITTI) +volatile int start_eNB = 0; +volatile int start_UE = 0; +#endif +volatile int oai_exit = 0; + + +//int32_t **rxdata; +//int32_t **txdata; + +uint16_t sf_ahead=4; +uint8_t nfapi_mode = 0; + // Added for PHY abstraction extern node_list* ue_node_list; extern node_list* enb_node_list; @@ -166,7 +182,10 @@ extern uint8_t abstraction_flag; extern uint8_t ethernet_flag; extern uint16_t Nid_cell; -extern LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; + +double cpuf; +#include "threads_t.h" +threads_t threads= {-1,-1,-1,-1,-1,-1,-1}; //#ifdef XFORMS int otg_enabled; @@ -197,6 +216,12 @@ sigh (void *arg); void oai_shutdown (void); +void reset_opp_meas_oaisim (void); + +void wait_eNBs() { + return; +} + void help (void) { @@ -223,7 +248,7 @@ help (void) printf ("-L [0-1] 0 to disable new link adaptation, 1 to enable new link adapatation\n"); printf ("-m Gives a fixed DL mcs for eNB scheduler\n"); printf ("-M Set the machine ID for Ethernet-based emulation\n"); - printf ("-n Set the number of frames for the simulation\n"); + printf ("-n Set the number of frames for the simulation. 0 for no limit\n"); printf ("-O [enb_conf_file] eNB configuration file name\n"); printf ("-p Set the total number of machine in emulation - valid if M is set\n"); printf ("-P [trace type] Enable protocol analyzer. Possible values for OPT:\n"); @@ -247,10 +272,13 @@ help (void) #else printf ("-W [Rohde&Schwarz SMBV100A functions disabled. Recompile with SMBV=1]\n"); #endif - printf ("-x Set the transmission mode (1,2,5,6 supported for now)\n"); + printf ("-x deprecated. Set the transmission mode in config file!\n"); + printf ("-y Set the number of receive antennas at the UE (1 or 2)\n"); printf ("-Y Set the global log verbosity (none, low, medium, high, full) \n"); printf ("-z Set the cooperation flag (0 for no cooperation, 1 for delay diversity and 2 for distributed alamouti\n"); printf ("-Z Reserved\n"); + printf ("--xforms Activate the grapical scope\n"); + #if T_TRACER printf ("--T_port [port] use given port\n"); printf ("--T_nowait don't wait for tracer, start immediately\n"); @@ -259,73 +287,6 @@ help (void) } pthread_t log_thread; -// pthread_t async_server_thread; -// int async_server_thread_finalize (void); -// -// void -// async_server_thread_init (void) -// { -// //create log_list -// //log_list_init(&log_list); -// -// async_server_shutdown = 0; -// -// if ((pthread_mutex_init (&async_server_lock, NULL) != 0) -// || (pthread_cond_init (&async_server_notify, NULL) != 0)) { -// return; -// } -// -// if (pthread_create (&async_server_thread, NULL, proto_server_init, (void*) NULL) -// != 0) { -// async_server_thread_finalize(); -// return; -// } -// -// -// } -// -// //Call it after the last LOG call -// int -// async_server_thread_finalize (void) -// { -// int err = 0; -// -// -// if (pthread_mutex_lock (&async_server_lock) != 0) { -// return -1; -// } -// -// async_server_shutdown = 1; -// -// /* Wake up LOG thread */ -// if ((pthread_cond_broadcast (&async_server_notify) != 0) -// || (pthread_mutex_unlock (&async_server_lock) != 0)) { -// err = -1; -// } -// -// if (pthread_join (async_server_thread, NULL) != 0) { -// err = -1; -// } -// -// if (pthread_mutex_unlock (&async_server_lock) != 0) { -// err = -1; -// } -// -// if (!err) { -// //log_list_free(&log_list); -// pthread_mutex_lock (&async_server_lock); -// pthread_mutex_destroy (&async_server_lock); -// pthread_cond_destroy (&async_server_notify); -// } -// -// -// return err; -// } - - - - - void log_thread_init (void) @@ -418,20 +379,21 @@ int omv_write(int pfd, node_list* enb_node_list, node_list* ue_node_list, Data_F omv_data.geo[i].node_type = 0; //eNB enb_node_list = enb_node_list->next; omv_data.geo[i].Neighbors = 0; - - for (j = NB_eNB_INST; j < NB_UE_INST + NB_eNB_INST; j++) { - if (is_UE_active (i, j - NB_eNB_INST) == 1) { +/* + for (j = NB_RU; j < NB_UE_INST + NB_RU; j++) { + if (is_UE_active (i, j - NB_RU) == 1) { omv_data.geo[i].Neighbor[omv_data.geo[i].Neighbors] = j; omv_data.geo[i].Neighbors++; LOG_D( - OMG, - "[eNB %d][UE %d] is_UE_active(i,j) %d geo (x%d, y%d) num neighbors %d\n", i, j-NB_eNB_INST, is_UE_active(i,j-NB_eNB_INST), omv_data.geo[i].x, omv_data.geo[i].y, omv_data.geo[i].Neighbors); + OMG, + "[RU %d][UE %d] is_UE_active(i,j) %d geo (x%d, y%d) num neighbors %d\n", i, j-NB_RU, is_UE_active(i,j-NB_RU), omv_data.geo[i].x, omv_data.geo[i].y, omv_data.geo[i].Neighbors); } } +*/ } } - for (i = NB_eNB_INST; i < NB_UE_INST + NB_eNB_INST; i++) { + for (i = NB_RU; i < NB_UE_INST + NB_RU; i++) { if (ue_node_list != NULL) { omv_data.geo[i].x = (ue_node_list->node->x_pos < 0.0) ? 0.0 : ue_node_list->node->x_pos; omv_data.geo[i].y = (ue_node_list->node->y_pos < 0.0) ? 0.0 : ue_node_list->node->y_pos; @@ -454,16 +416,17 @@ int omv_write(int pfd, node_list* enb_node_list, node_list* ue_node_list, Data_F ue_node_list = ue_node_list->next; omv_data.geo[i].Neighbors = 0; - - for (j = 0; j < NB_eNB_INST; j++) { - if (is_UE_active (j, i - NB_eNB_INST) == 1) { +/* + for (j = 0; j < NB_RU; j++) { + if (is_UE_active (j, i - NB_RU) == 1) { omv_data.geo[i].Neighbor[omv_data.geo[i].Neighbors] = j; omv_data.geo[i].Neighbors++; LOG_D( - OMG, - "[UE %d][eNB %d] is_UE_active %d geo (x%d, y%d) num neighbors %d\n", i-NB_eNB_INST, j, is_UE_active(j,i-NB_eNB_INST), omv_data.geo[i].x, omv_data.geo[i].y, omv_data.geo[i].Neighbors); + OMG, + "[UE %d][RU %d] is_UE_active %d geo (x%d, y%d) num neighbors %d\n", i-NB_RU, j, is_UE_active(j,i-NB_RU), omv_data.geo[i].x, omv_data.geo[i].y, omv_data.geo[i].Neighbors); } } +*/ } } @@ -493,9 +456,7 @@ static Data_Flow_Unit omv_data; #endif //ALU static module_id_t UE_inst = 0; static module_id_t eNB_inst = 0; -#ifdef Rel10 -static module_id_t RN_id = 0; -#endif +static module_id_t ru_id; Packet_OTG_List_t *otg_pdcp_buffer; @@ -505,6 +466,11 @@ typedef enum l2l1_task_state_e { l2l1_task_state_t l2l1_state = L2L1_WAITTING; +extern openair0_timestamp current_ru_rx_timestamp[NUMBER_OF_RU_MAX][MAX_NUM_CCs]; +extern openair0_timestamp current_UE_rx_timestamp[NUMBER_OF_UE_MAX][MAX_NUM_CCs]; +extern openair0_timestamp last_eNB_rx_timestamp[NUMBER_OF_eNB_MAX][MAX_NUM_CCs]; +extern openair0_timestamp last_UE_rx_timestamp[NUMBER_OF_UE_MAX][MAX_NUM_CCs]; + /*------------------------------------------------------------------------------*/ void * l2l1_task (void *args_p) @@ -513,17 +479,10 @@ l2l1_task (void *args_p) int CC_id; // Framing variables - int32_t slot, last_slot, next_slot; + int32_t sf; -#ifdef Rel10 - relaying_type_t r_type = no_relay; // no relaying -#endif + //char fname[64], vname[64]; - lte_subframe_t direction; - - char fname[64], vname[64]; - int sf; - protocol_ctxt_t ctxt; //#ifdef XFORMS // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0) // at eNB 0, an UL scope for every UE @@ -550,27 +509,11 @@ l2l1_task (void *args_p) char eNB_stats_th_filename[255]; #endif - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) - for (eNB_inst = 0; eNB_inst < NB_eNB_INST; eNB_inst++) { - for (sf = 0; sf < 10; sf++) { - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].frame_tx = 0; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].frame_rx = 0; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].subframe_tx = (sf + 1) - % 10; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].subframe_rx = (sf + 9) - % 10; - } - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[0].frame_rx = 1023; - PHY_vars_eNB_g[eNB_inst][CC_id]->proc[9].frame_tx = 1; - } - - //#ifdef XFORMS if (xforms==1) { xargv[0] = xname; fl_initialize (&xargc, xargv, NULL, 0, 0); eNB_inst = 0; - for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) { for (CC_id=0;CC_idlte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - if (openair_daq_vars.use_ia_receiver == 1) { + if (PHY_vars_UE_g[UE_inst][CC_id]->use_ia_receiver == 1) { fl_set_button(form_ue[CC_id][UE_inst]->button_0,1); fl_set_object_label(form_ue[CC_id][UE_inst]->button_0, "IA Receiver ON"); fl_set_object_color(form_ue[CC_id][UE_inst]->button_0, FL_GREEN, FL_GREEN); } } - // UL scope at eNB 0 - form_enb[UE_inst] = create_lte_phy_scope_enb(); - sprintf (title, "LTE UL SCOPE UE %d to eNB %d", UE_inst, eNB_inst); - fl_show_form (form_enb[UE_inst]->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title); - } } - //#endif + #ifdef PRINT_STATS @@ -643,7 +581,8 @@ l2l1_task (void *args_p) itti_mark_task_ready (TASK_L2L1); LOG_I(EMU, "TASK_L2L1 is READY\n"); - if (oai_emulation.info.nb_enb_local > 0) { + if ((oai_emulation.info.nb_enb_local > 0) && + (oai_emulation.info.node_function[0] < NGFI_RAU_IF4p5)) { /* Wait for the initialize message */ do { if (message_p != NULL) { @@ -658,6 +597,7 @@ l2l1_task (void *args_p) switch (ITTI_MSG_ID(message_p)) { case INITIALIZE_MESSAGE: l2l1_state = L2L1_RUNNING; + start_eNB = 1; break; case ACTIVATE_MESSAGE: @@ -683,10 +623,18 @@ l2l1_task (void *args_p) } #endif + module_id_t enb_id; + module_id_t UE_id; + + if (abstraction_flag == 1) { + for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) + dl_phy_sync_success (UE_id, 0, 0,1); //UE_id%NB_eNB_INST); + } + start_meas (&oaisim_stats); for (frame = 0; - (l2l1_state != L2L1_TERMINATED) && + (l2l1_state != L2L1_TERMINATED) && ((oai_emulation.info.n_frames_flag == 0) || (frame < oai_emulation.info.n_frames)); frame++) { @@ -751,7 +699,6 @@ l2l1_task (void *args_p) oai_emulation.info.time_s += 0.01; // emu time in s, each frame lasts for 10 ms // JNote: TODO check the coherency of the time and frame (I corrected it to 10 (instead of 0.01) update_omg (frame); // frequency is defined in the omg_global params configurable by the user - update_omg_ocm (); #ifdef OPENAIR2 @@ -761,55 +708,75 @@ l2l1_task (void *args_p) omv_write (pfd[1], enb_node_list, ue_node_list, omv_data); } -#endif -#ifdef DEBUG_OMG - /* - if ((((int) oai_emulation.info.time_s) % 100) == 0) { - for (UE_inst = oai_emulation.info.first_ue_local; UE_inst < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local); UE_inst++) { - get_node_position (UE, UE_inst); - } - } - */ #endif - update_ocm (); - for (slot = 0; slot < 20; slot++) { - if (slot % 2 == 0) - start_meas (&oaisim_stats_f); + + for (sf = 0; sf < 10; sf++) { + LOG_D(EMU,"************************* Subframe %d\n",sf); + start_meas (&oaisim_stats_f); wait_for_slot_isr (); #if defined(ENABLE_ITTI) - itti_update_lte_time(frame % MAX_FRAME_NUMBER, slot); + itti_update_lte_time(frame % MAX_FRAME_NUMBER, sf<<1); #endif - last_slot = (slot - 1) % 20; - - if (last_slot < 0) - last_slot += 20; - - next_slot = (slot + 1) % 20; - - oai_emulation.info.time_ms = frame * 10 + (slot >> 1); - - direction = subframe_select (frame_parms[0], next_slot >> 1); + oai_emulation.info.time_ms = frame * 10 + sf; #ifdef PROC - if(Channel_Flag==1) - Channel_Func(s_re2,s_im2,r_re2,r_im2,r_re02,r_im02,r_re0_d,r_im0_d,r_re0_u,r_im0_u,eNB2UE,UE2eNB,enb_data,ue_data,abstraction_flag,frame_parms,slot); + if(Channel_Flag==1) + Channel_Func(s_re2,s_im2,r_re2,r_im2,r_re02,r_im02,r_re0_d,r_im0_d,r_re0_u,r_im0_u,RU2UE,UE2RU,enb_data,ue_data,abstraction_flag,frame_parms,sf<<1); - if(Channel_Flag==0) + if(Channel_Flag==0) #endif - { + { // SUBFRAME INNER PART #if defined(ENABLE_ITTI) log_set_instance_type (LOG_INSTANCE_ENB); #endif - // if ((next_slot % 2) == 0) - if ((slot & 1) == 0) - clear_eNB_transport_info (oai_emulation.info.nb_enb_local); + + CC_id=0; + int all_done=0; + + while (all_done==0) { + + pthread_mutex_lock(&subframe_mutex); + int subframe_ru_mask_local = subframe_ru_mask; + int subframe_UE_mask_local = subframe_UE_mask; + pthread_mutex_unlock(&subframe_mutex); + LOG_D(EMU,"Frame %d, Subframe %d, NB_RU %d, NB_UE %d: Checking masks %x,%x\n",frame,sf,NB_RU,NB_UE_INST,subframe_ru_mask_local,subframe_UE_mask_local); + if ((subframe_ru_mask_local == ((1<frame_parms.samples_per_tti; + LOG_D(EMU,"RU %d/%d: TS %llu\n",ru_id,CC_id,current_ru_rx_timestamp[ru_id][CC_id]); + } + for (UE_inst = 0; UE_instframe_parms.samples_per_tti; + LOG_D(EMU,"UE %d/%d: TS %llu\n",UE_id,CC_id,current_UE_rx_timestamp[UE_inst][CC_id]); + } for (eNB_inst = oai_emulation.info.first_enb_local; (eNB_inst @@ -817,49 +784,41 @@ l2l1_task (void *args_p) + oai_emulation.info.nb_enb_local)); eNB_inst++) { if (oai_emulation.info.cli_start_enb[eNB_inst] != 0) { - if ((slot & 1) == 0) { - T(T_ENB_MASTER_TICK, T_INT(eNB_inst), T_INT(frame % 1024), T_INT(slot/2)); - LOG_D(EMU, - "PHY procedures eNB %d for frame %d, slot %d (subframe TX %d, RX %d) TDD %d/%d Nid_cell %d\n", - eNB_inst, - frame % MAX_FRAME_NUMBER, - slot, - PHY_vars_eNB_g[eNB_inst][0]->proc[slot >> 1].subframe_tx, - PHY_vars_eNB_g[eNB_inst][0]->proc[slot >> 1].subframe_rx, - PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.frame_type, - PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.tdd_config, - PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.Nid_cell); - } - + + /* + LOG_D(EMU, + "PHY procedures eNB %d for frame %d, subframe %d TDD %d/%d Nid_cell %d\n", + eNB_inst, + frame % MAX_FRAME_NUMBER, + sf, + PHY_vars_eNB_g[eNB_inst][0]->frame_parms.frame_type, + PHY_vars_eNB_g[eNB_inst][0]->frame_parms.tdd_config, + PHY_vars_eNB_g[eNB_inst][0]->frame_parms.Nid_cell); + + */ #ifdef OPENAIR2 - //Application: traffic gen + //Application: traffic gen update_otg_eNB (eNB_inst, oai_emulation.info.time_ms); //IP/OTG to PDCP and PDCP to IP operation // pdcp_run (frame, 1, 0, eNB_inst); //PHY_vars_eNB_g[eNB_id]->Mod_id #endif - - // PHY_vars_eNB_g[eNB_id]->frame = frame; - if ((slot & 1) == 0) - phy_procedures_eNB_lte (slot >> 1, - PHY_vars_eNB_g[eNB_inst], - abstraction_flag, no_relay, - NULL); + #ifdef PRINT_STATS - if(last_slot==9 && frame%10==0) + if((sf==9) && frame%10==0) if(eNB_avg_thr) - fprintf(eNB_avg_thr,"%d %d\n",PHY_vars_eNB_g[eNB_inst][0]->proc[slot>>1].frame_tx, - (PHY_vars_eNB_g[eNB_inst][0]->total_system_throughput)/((PHY_vars_eNB_g[eNB_inst][0]->proc[slot>>1].frame_tx+1)*10)); - + fprintf(eNB_avg_thr,"%d %d\n",RC.eNB[eNB_inst][0]->proc.proc_rxtx[sf&1].frame_tx, + (RC.eNB[eNB_inst][0]->total_system_throughput)/((RC.eNB[eNB_inst][0]->proc.proc_rxtx[sf&1].frame_tx+1)*10)); + /* if (eNB_stats[eNB_inst]) { - len = dump_eNB_stats(PHY_vars_eNB_g[eNB_inst][0], stats_buffer, 0); + len = dump_eNB_stats(RC.eNB[eNB_inst][0], stats_buffer, 0); rewind (eNB_stats[eNB_inst]); fwrite (stats_buffer, 1, len, eNB_stats[eNB_inst]); fflush(eNB_stats[eNB_inst]); } - + */ #ifdef OPENAIR2 if (eNB_l2_stats) { @@ -872,458 +831,162 @@ l2l1_task (void *args_p) #endif #endif } - } + }// eNB_inst loop - // Call ETHERNET emulation here - //emu_transport (frame, last_slot, next_slot, direction, oai_emulation.info.frame_type, ethernet_flag); #if defined(ENABLE_ITTI) log_set_instance_type (LOG_INSTANCE_UE); #endif - if ((next_slot % 2) == 0) - // if ((slot&1) == 0) - clear_UE_transport_info (oai_emulation.info.nb_ue_local); - for (UE_inst = oai_emulation.info.first_ue_local; - (UE_inst < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local)); - UE_inst++) { - if (oai_emulation.info.cli_start_ue[UE_inst] != 0) { -#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME) + if ((sf == 0) && ((frame % MAX_FRAME_NUMBER) == 0) && (abstraction_flag == 0) + && (oai_emulation.info.n_frames == 1)) { + + write_output ("dlchan0.m", + "dlch0", + &(PHY_vars_UE_g[0][0]->common_vars.common_vars_rx_data_per_thread[0].dl_ch_estimates[0][0][0]), + (6 + * (PHY_vars_UE_g[0][0]->frame_parms.ofdm_symbol_size)), + 1, 1); + write_output ("dlchan1.m", + "dlch1", + &(PHY_vars_UE_g[0][0]->common_vars.common_vars_rx_data_per_thread[0].dl_ch_estimates[1][0][0]), + (6 + * (PHY_vars_UE_g[0][0]->frame_parms.ofdm_symbol_size)), + 1, 1); + write_output ("dlchan2.m", + "dlch2", + &(PHY_vars_UE_g[0][0]->common_vars.common_vars_rx_data_per_thread[0].dl_ch_estimates[2][0][0]), + (6 + * (PHY_vars_UE_g[0][0]->frame_parms.ofdm_symbol_size)), + 1, 1); + write_output ("pbch_rxF_comp0.m", + "pbch_comp0", + PHY_vars_UE_g[0][0]->pbch_vars[0]->rxdataF_comp[0], + 6 * 12 * 4, 1, 1); + write_output ("pbch_rxF_llr.m", "pbch_llr", + PHY_vars_UE_g[0][0]->pbch_vars[0]->llr, + (PHY_vars_UE_g[0][0]->frame_parms.Ncp == 0) ? 1920 : 1728, 1, + 4); + } + + stop_meas (&oaisim_stats_f); + } // SUBFRAME INNER PART -#else - - if (frame >= (UE_inst * 20)) // activate UE only after 20*UE_id frames so that different UEs turn on separately -#endif - { - LOG_D(EMU, - "PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n", - UE_inst, frame % MAX_FRAME_NUMBER, slot, next_slot >> 1, - last_slot >> 1); - - if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] - != NOT_SYNCHED) { - if (frame > 0) { - PHY_vars_UE_g[UE_inst][0]->frame_rx = frame % MAX_FRAME_NUMBER; - PHY_vars_UE_g[UE_inst][0]->slot_rx = last_slot; - PHY_vars_UE_g[UE_inst][0]->slot_tx = next_slot; - - if (next_slot > 1) - PHY_vars_UE_g[UE_inst][0]->frame_tx = frame % MAX_FRAME_NUMBER; - else - PHY_vars_UE_g[UE_inst][0]->frame_tx = (frame + 1) % MAX_FRAME_NUMBER; - -#ifdef OPENAIR2 - //Application - update_otg_UE (UE_inst, oai_emulation.info.time_ms); - - //Access layer - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE_inst, 0, ENB_FLAG_NO, NOT_A_RNTI, frame % MAX_FRAME_NUMBER, next_slot); - pdcp_run (&ctxt); -#endif - - for (CC_id = 0; CC_id < MAX_NUM_CCs; - CC_id++) { - phy_procedures_UE_lte ( - PHY_vars_UE_g[UE_inst][CC_id], - 0, abstraction_flag, - normal_txrx, no_relay, - NULL); - } - - ue_data[UE_inst]->tx_power_dBm = - PHY_vars_UE_g[UE_inst][0]->tx_power_dBm; - } - } else { - if (abstraction_flag == 1) { - LOG_E(EMU, - "sync not supported in abstraction mode (UE%d,mode%d)\n", - UE_inst, - PHY_vars_UE_g[UE_inst][0]->UE_mode[0]); - exit (-1); - } - - if ((frame > 0) - && (last_slot - == (LTE_SLOTS_PER_FRAME - - 2))) { - initial_sync (PHY_vars_UE_g[UE_inst][0], - normal_txrx); - - /* - write_output("dlchan00.m","dlch00",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - if (PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx>1) - write_output("dlchan01.m","dlch01",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][1][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - write_output("dlchan10.m","dlch10",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][2][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - if (PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx>1) - write_output("dlchan11.m","dlch11",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][3][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1); - write_output("rxsig.m","rxs",PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata[0],PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti*10,1,1); - write_output("rxsigF.m","rxsF",PHY_vars_UE_g[0]->lte_ue_common_vars.rxdataF[0],2*PHY_vars_UE_g[0]->lte_frame_parms.symbols_per_tti*PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size,2,1); - write_output("pbch_rxF_ext0.m","pbch_ext0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_ext[0],6*12*4,1,1); - write_output("pbch_rxF_comp0.m","pbch_comp0",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_comp[0],6*12*4,1,1); - write_output("pbch_rxF_llr.m","pbch_llr",PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->llr,(frame_parms->Ncp==0) ? 1920 : 1728,1,4); - */ - } - } - -#ifdef PRINT_STATS - - if(last_slot==2 && frame%10==0) { - if (UE_stats_th[UE_inst]) { - fprintf(UE_stats_th[UE_inst],"%d %d\n",frame % MAX_FRAME_NUMBER, PHY_vars_UE_g[UE_inst][0]->bitrate[0]/1000); - } - } - - if (UE_stats[UE_inst]) { - len = dump_ue_stats (PHY_vars_UE_g[UE_inst][0], stats_buffer, 0, normal_txrx, 0); - rewind (UE_stats[UE_inst]); - fwrite (stats_buffer, 1, len, UE_stats[UE_inst]); - fflush(UE_stats[UE_inst]); - } - -#endif - } - } - } - -#ifdef Rel10 - - for (RN_id=oai_emulation.info.first_rn_local; - RN_idframe = frame % MAX_FRAME_NUMBER; - - if ( oai_emulation.info.frame_type == 0) { - // RN == UE - if (frame>0) { - if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] != NOT_SYNCHED) { - LOG_D(EMU,"[RN %d] PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n", - RN_id, UE_inst, frame, slot, next_slot >> 1,last_slot>>1); - PHY_vars_UE_g[UE_inst][0]->frame_rx = frame % MAX_FRAME_NUMBER; - PHY_vars_UE_g[UE_inst][0]->slot_rx = last_slot; - PHY_vars_UE_g[UE_inst][0]->slot_tx = next_slot; - - if (next_slot>1) PHY_vars_UE_g[UE_inst][0]->frame_tx = frame % MAX_FRAME_NUMBER; - else PHY_vars_UE_g[UE_inst][0]->frame_tx = (frame+1) % MAX_FRAME_NUMBER; - - phy_procedures_UE_lte (PHY_vars_UE_g[UE_inst][0], 0, abstraction_flag,normal_txrx, - r_type, PHY_vars_RN_g[RN_id]); - } else if (last_slot == (LTE_SLOTS_PER_FRAME-2)) { - initial_sync(PHY_vars_UE_g[UE_inst][0],normal_txrx); - } - } - - // RN == eNB - LOG_D(EMU,"[RN %d] PHY procedures eNB %d for frame %d, slot %d (subframe TX %d, RX %d)\n", - RN_id, eNB_inst, frame % MAX_FRAME_NUMBER, slot, next_slot >> 1,last_slot>>1); - phy_procedures_eNB_lte(slot>>1, PHY_vars_eNB_g[eNB_inst], abstraction_flag, - r_type, PHY_vars_RN_g[RN_id]); - } else { - LOG_E(EMU,"TDD is not supported for multicast relaying %d\n", r_type); - exit(-1); - } - } - -#endif - emu_transport (frame % MAX_FRAME_NUMBER, last_slot, next_slot, direction, - oai_emulation.info.frame_type[0], ethernet_flag); - - if ((direction == SF_DL) - || (frame_parms[0]->frame_type == FDD)) { - // consider only sec id 0 - /* for (eNB_id=0;eNB_idlte_eNB_common_vars.txdataF[0], - PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0], - frame,next_slot, - frame_parms); - } - }*/ - start_meas (&dl_chan_stats); - - for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { -//#warning figure out what to do with UE frame_parms during initial_sync - do_DL_sig (r_re0, - r_im0, - r_re, - r_im, - s_re, - s_im, - eNB2UE, - enb_data, - ue_data, - next_slot, - abstraction_flag, - &PHY_vars_eNB_g[0][CC_id]->lte_frame_parms, - UE_inst, CC_id); - } - - stop_meas (&dl_chan_stats); - } - - if ((direction == SF_UL) || (frame_parms[0]->frame_type == 0)) { //if ((subframe<2) || (subframe>4)) - start_meas (&ul_chan_stats); - - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { -//#warning figure out what to do with UE frame_parms during initial_sync - do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, - enb_data, ue_data, next_slot, - abstraction_flag, - &PHY_vars_eNB_g[0][CC_id]->lte_frame_parms, - frame % MAX_FRAME_NUMBER, CC_id); - } - - stop_meas (&ul_chan_stats); - /* - int ccc; - fprintf(SINRpost,"SINRdb For eNB New Subframe : \n "); - for(ccc = 0 ; ccc<301; ccc++) - { - fprintf(SINRpost,"_ %f ", SINRpost_eff[ccc]); - } - fprintf(SINRpost,"SINRdb For eNB : %f \n ", SINRpost_eff[ccc]); - */ - } - - if ((direction == SF_S)) { //it must be a special subframe - if (next_slot % 2 == 0) { //DL part - /* for (eNB_id=0;eNB_idlte_eNB_common_vars.txdataF[0], - PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0], - frame,next_slot, - frame_parms); - } - }*/ - start_meas (&dl_chan_stats); - - for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { -//#warning check dimensions of r_reN,r_imN for multiple CCs - do_DL_sig (r_re0, - r_im0, - r_re, - r_im, - s_re, - s_im, - eNB2UE, - enb_data, - ue_data, - next_slot, - abstraction_flag, - &PHY_vars_eNB_g[0][CC_id]->lte_frame_parms, - UE_inst, CC_id); - } - - stop_meas (&dl_chan_stats); - /* - for (aarx=0;aarxnb_rx;aarx++) - for (aatx=0;aatxnb_tx;aatx++) - for (k=0;kchannel_length;k++) - printf("SB(%d,%d,%d)->(%f,%f)\n",k,aarx,aatx,UE2eNB[1][0]->ch[aarx+(aatx*UE2eNB[1][0]->nb_rx)][k].r,UE2eNB[1][0]->ch[aarx+(aatx*UE2eNB[1][0]->nb_rx)][k].i); - */ - } else { // UL part - start_meas (&ul_chan_stats); - - for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { -//#warning check dimensions of r_reN,r_imN for multiple CCs - do_UL_sig (r_re0, - r_im0, - r_re, - r_im, - s_re, - s_im, - UE2eNB, - enb_data, - ue_data, - next_slot, - abstraction_flag, - &PHY_vars_eNB_g[0][CC_id]->lte_frame_parms, - frame % MAX_FRAME_NUMBER, CC_id); - } - - stop_meas (&ul_chan_stats); - - /* int ccc; - fprintf(SINRpost,"SINRdb For eNB New Subframe : \n "); - for(ccc = 0 ; ccc<301; ccc++) - { - fprintf(SINRpost,"_ %f ", SINRpost_eff[ccc]); - } - fprintf(SINRpost,"SINRdb For eNB : %f \n ", SINRpost_eff[ccc]); - } - */ - } - } - - if ((last_slot == 1) && ((frame % MAX_FRAME_NUMBER) == 0) && (abstraction_flag == 0) - && (oai_emulation.info.n_frames == 1)) { - - write_output ("dlchan0.m", - "dlch0", - &(PHY_vars_UE_g[0][0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]), - (6 - * (PHY_vars_UE_g[0][0]->lte_frame_parms.ofdm_symbol_size)), - 1, 1); - write_output ("dlchan1.m", - "dlch1", - &(PHY_vars_UE_g[0][0]->lte_ue_common_vars.dl_ch_estimates[1][0][0]), - (6 - * (PHY_vars_UE_g[0][0]->lte_frame_parms.ofdm_symbol_size)), - 1, 1); - write_output ("dlchan2.m", - "dlch2", - &(PHY_vars_UE_g[0][0]->lte_ue_common_vars.dl_ch_estimates[2][0][0]), - (6 - * (PHY_vars_UE_g[0][0]->lte_frame_parms.ofdm_symbol_size)), - 1, 1); - write_output ("pbch_rxF_comp0.m", - "pbch_comp0", - PHY_vars_UE_g[0][0]->lte_ue_pbch_vars[0]->rxdataF_comp[0], - 6 * 12 * 4, 1, 1); - write_output ("pbch_rxF_llr.m", "pbch_llr", - PHY_vars_UE_g[0][0]->lte_ue_pbch_vars[0]->llr, - (frame_parms[0]->Ncp == 0) ? 1920 : 1728, 1, - 4); - } - - /* - if ((last_slot==1) && (frame==1)) { - write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0",PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp[0],300*(-(PHY_vars_UE->lte_frame_parms.Ncp*2)+14),1,1); - write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1); - } - */ - } // if Channel_Flag==0 - - if (slot % 2 == 1) - stop_meas (&oaisim_stats_f); - } //end of slot + } + update_ocm (); + /* if ((frame >= 10) && (frame <= 11) && (abstraction_flag == 0) #ifdef PROC - &&(Channel_Flag==0) + &&(Channel_Flag==0) #endif - ) { + ) { sprintf (fname, "UEtxsig%d.m", frame % MAX_FRAME_NUMBER); sprintf (vname, "txs%d", frame % MAX_FRAME_NUMBER); write_output (fname, - vname, - PHY_vars_UE_g[0][0]->lte_ue_common_vars.txdata[0], - PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti - * 10, - 1, 1); + vname, + PHY_vars_UE_g[0][0]->common_vars.txdata[0], + PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti + * 10, + 1, 1); sprintf (fname, "eNBtxsig%d.m", frame % MAX_FRAME_NUMBER); sprintf (vname, "txs%d", frame % MAX_FRAME_NUMBER); write_output (fname, - vname, - PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.txdata[0][0], - PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti - * 10, - 1, 1); + vname, + PHY_vars_eNB_g[0][0]->common_vars.txdata[0][0], + PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti + * 10, + 1, 1); sprintf (fname, "eNBtxsigF%d.m", frame % MAX_FRAME_NUMBER); sprintf (vname, "txsF%d", frame % MAX_FRAME_NUMBER); write_output (fname, - vname, - PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.txdataF[0][0], - PHY_vars_eNB_g[0][0]->lte_frame_parms.symbols_per_tti - * PHY_vars_eNB_g[0][0]->lte_frame_parms.ofdm_symbol_size, - 1, 1); + vname, + PHY_vars_eNB_g[0][0]->common_vars.txdataF[0][0], + PHY_vars_eNB_g[0][0]->frame_parms.symbols_per_tti + * PHY_vars_eNB_g[0][0]->frame_parms.ofdm_symbol_size, + 1, 1); sprintf (fname, "UErxsig%d.m", frame % MAX_FRAME_NUMBER); sprintf (vname, "rxs%d", frame % MAX_FRAME_NUMBER); write_output (fname, - vname, - PHY_vars_UE_g[0][0]->lte_ue_common_vars.rxdata[0], - PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti - * 10, - 1, 1); + vname, + PHY_vars_UE_g[0][0]->common_vars.rxdata[0], + PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti + * 10, + 1, 1); sprintf (fname, "eNBrxsig%d.m", frame % MAX_FRAME_NUMBER); sprintf (vname, "rxs%d", frame % MAX_FRAME_NUMBER); write_output (fname, - vname, - PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.rxdata[0][0], - PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti - * 10, - 1, 1); + vname, + PHY_vars_eNB_g[0][0]->common_vars.rxdata[0][0], + PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti + * 10, + 1, 1); } - + */ + //#ifdef XFORMS if (xforms==1) { - eNB_inst = 0; - - for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) { - for (CC_id=0;CC_id0) { + pthread_cond_wait(&RC.ru_cond,&RC.ru_mutex); + } + + // copy frame parameters from RU to UEs + for (i=0;iframe_parms.N_RB_DL = RC.ru[0]->frame_parms.N_RB_DL; + PHY_vars_UE_g[i][0]->frame_parms.N_RB_UL = RC.ru[0]->frame_parms.N_RB_UL; + PHY_vars_UE_g[i][0]->frame_parms.nb_antennas_tx = 1; + PHY_vars_UE_g[i][0]->frame_parms.nb_antennas_rx = 1; + // set initially to 2, it will be revised after initial synchronization + PHY_vars_UE_g[i][0]->frame_parms.nb_antenna_ports_eNB = 2; + PHY_vars_UE_g[i][0]->frame_parms.tdd_config = 1; + PHY_vars_UE_g[i][0]->frame_parms.dl_CarrierFreq = RC.ru[0]->frame_parms.dl_CarrierFreq; + PHY_vars_UE_g[i][0]->frame_parms.ul_CarrierFreq = RC.ru[0]->frame_parms.ul_CarrierFreq; + PHY_vars_UE_g[i][0]->frame_parms.eutra_band = RC.ru[0]->frame_parms.eutra_band; + LOG_I(PHY,"Initializing UE %d frame parameters from RU information: N_RB_DL %d, p %d, dl_Carrierfreq %u, ul_CarrierFreq %u, eutra_band %d\n", + i, + PHY_vars_UE_g[i][0]->frame_parms.N_RB_DL, + PHY_vars_UE_g[i][0]->frame_parms.nb_antenna_ports_eNB, + PHY_vars_UE_g[i][0]->frame_parms.dl_CarrierFreq, + PHY_vars_UE_g[i][0]->frame_parms.ul_CarrierFreq, + PHY_vars_UE_g[i][0]->frame_parms.eutra_band); + + current_UE_rx_timestamp[i][0] = RC.ru[0]->frame_parms.samples_per_tti + RC.ru[0]->frame_parms.ofdm_symbol_size + RC.ru[0]->frame_parms.nb_prefix_samples0; + + } + + + + + for (ru_id=0;ru_idframe_parms.samples_per_tti; + + printf("RUs are ready, let's go\n"); +} + +void init_UE(int,int,int,int); +void init_RU(const char*); + +void set_UE_defaults(int nb_ue) { + + for (int UE_id = 0;UE_idpdcch_vars[i][0]->dciFormat = 0; + PHY_vars_UE_g[UE_id][CC_id]->pdcch_vars[i][0]->agregationLevel = 0xFF; + } + PHY_vars_UE_g[UE_id][CC_id]->current_dlsch_cqi[0] = 10; + } + } +} + + +static void print_current_directory(void) +{ + char dir[8192]; /* arbitrary size (should be big enough) */ + if (getcwd(dir, 8192) == NULL) + printf("ERROR getting working directory\n"); + else + printf("working directory: %s\n", dir); +} + /*------------------------------------------------------------------------------*/ int main (int argc, char **argv) @@ -1340,6 +1075,10 @@ main (int argc, char **argv) clock_t t; + print_current_directory(); + + start_background_system(); + #ifdef SMBV // Rohde&Schwarz SMBV100A vector signal generator strcpy(smbv_ip,DEFAULT_SMBV_IP); @@ -1349,7 +1088,7 @@ main (int argc, char **argv) int node_id; int port,Process_Flag=0,wgt,Channel_Flag=0,temp; #endif - + int i; //default parameters oai_emulation.info.n_frames = MAX_FRAME_NUMBER; //1024; //10; @@ -1359,6 +1098,15 @@ main (int argc, char **argv) //Default values if not changed by the user in get_simulation_options(); pdcp_period = 1; omg_period = 1; + //Clean ip rule table + for(int i =0; ilte_frame_parms); + smbv_write_config_from_frame_parms(smbv_fname, &PHY_vars_eNB_g[0][0]->frame_parms); #endif + /* #if defined (FLEXRAN_AGENT_SB_IF) + flexran_agent_start(); + #endif */ // add events to future event list: Currently not used //oai_emulation.info.oeh_enabled = 1; @@ -1443,7 +1220,9 @@ main (int argc, char **argv) // oai performance profiler is enabled if (oai_emulation.info.opp_enabled == 1) - reset_opp_meas (); + reset_opp_meas_oaisim (); + + cpuf=get_cpu_freq_GHz(); init_time (); @@ -1451,19 +1230,18 @@ main (int argc, char **argv) t = clock (); -// async_server_thread_init(); - LOG_N(EMU, ">>>>>>>>>>>>>>>>>>>>>>>>>>> OAIEMU initialization done <<<<<<<<<<<<<<<<<<<<<<<<<<\n\n"); +#ifndef PACKAGE_VERSION +# define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL" +#endif + LOG_I(EMU, "Version: %s\n", PACKAGE_VERSION); + #if defined(ENABLE_ITTI) // Handle signals until all tasks are terminated - if (create_tasks(oai_emulation.info.nb_enb_local, oai_emulation.info.nb_ue_local) >= 0) { - itti_wait_tasks_end(); - } else { - exit(-1); // need a softer mode - } + itti_wait_tasks_end(); #else @@ -1487,7 +1265,7 @@ main (int argc, char **argv) } void -reset_opp_meas (void) +reset_opp_meas_oaisim (void) { uint8_t eNB_id = 0, UE_id = 0; @@ -1499,15 +1277,18 @@ reset_opp_meas (void) reset_meas (&ul_chan_stats); for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { - reset_meas (&PHY_vars_UE_g[UE_id][0]->phy_proc); - reset_meas (&PHY_vars_UE_g[UE_id][0]->phy_proc_rx); + reset_meas (&PHY_vars_UE_g[UE_id][0]->phy_proc[0]); + reset_meas (&PHY_vars_UE_g[UE_id][0]->phy_proc[1]); + reset_meas (&PHY_vars_UE_g[UE_id][0]->phy_proc_rx[0]); + reset_meas (&PHY_vars_UE_g[UE_id][0]->phy_proc_rx[1]); reset_meas (&PHY_vars_UE_g[UE_id][0]->phy_proc_tx); - reset_meas (&PHY_vars_UE_g[UE_id][0]->ofdm_demod_stats); + // reset_meas (&PHY_vars_UE_g[UE_id][0]->ofdm_demod_stats); reset_meas (&PHY_vars_UE_g[UE_id][0]->rx_dft_stats); reset_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_channel_estimation_stats); reset_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_freq_offset_estimation_stats); - reset_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_decoding_stats); + reset_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_decoding_stats[0]); + reset_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_decoding_stats[1]); reset_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_rate_unmatching_stats); reset_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_turbo_decoding_stats); reset_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_deinterleaving_stats); @@ -1532,6 +1313,8 @@ reset_opp_meas (void) reset_meas (&PHY_vars_UE_g[UE_id][0]->ulsch_turbo_encoding_stats); reset_meas (&PHY_vars_UE_g[UE_id][0]->ulsch_interleaving_stats); reset_meas (&PHY_vars_UE_g[UE_id][0]->ulsch_multiplexing_stats); + + /* * L2 functions */ @@ -1552,69 +1335,70 @@ reset_opp_meas (void) reset_meas (&UE_pdcp_stats[UE_id].pdcp_ip); reset_meas (&UE_pdcp_stats[UE_id].ip_pdcp); + } for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { - reset_meas (&eNB2UE[eNB_id][UE_id][0]->random_channel); - reset_meas (&eNB2UE[eNB_id][UE_id][0]->interp_time); - reset_meas (&eNB2UE[eNB_id][UE_id][0]->interp_freq); - reset_meas (&eNB2UE[eNB_id][UE_id][0]->convolution); - reset_meas (&UE2eNB[UE_id][eNB_id][0]->random_channel); - reset_meas (&UE2eNB[UE_id][eNB_id][0]->interp_time); - reset_meas (&UE2eNB[UE_id][eNB_id][0]->interp_freq); - reset_meas (&UE2eNB[UE_id][eNB_id][0]->convolution); + reset_meas (&RU2UE[eNB_id][UE_id][0]->random_channel); + reset_meas (&RU2UE[eNB_id][UE_id][0]->interp_time); + reset_meas (&RU2UE[eNB_id][UE_id][0]->interp_freq); + reset_meas (&RU2UE[eNB_id][UE_id][0]->convolution); + reset_meas (&UE2RU[UE_id][eNB_id][0]->random_channel); + reset_meas (&UE2RU[UE_id][eNB_id][0]->interp_time); + reset_meas (&UE2RU[UE_id][eNB_id][0]->interp_freq); + reset_meas (&UE2RU[UE_id][eNB_id][0]->convolution); } - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->phy_proc); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->phy_proc_rx); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->phy_proc_tx); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->rx_prach); + reset_meas (&RC.eNB[eNB_id][0]->phy_proc); + reset_meas (&RC.eNB[eNB_id][0]->phy_proc_rx); + reset_meas (&RC.eNB[eNB_id][0]->phy_proc_tx); + reset_meas (&RC.eNB[eNB_id][0]->rx_prach); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ofdm_mod_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_encoding_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_modulation_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_scrambling_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_rate_matching_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_turbo_encoding_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_interleaving_stats); + reset_meas (&RC.eNB[eNB_id][0]->ofdm_mod_stats); + reset_meas (&RC.eNB[eNB_id][0]->dlsch_encoding_stats); + reset_meas (&RC.eNB[eNB_id][0]->dlsch_modulation_stats); + reset_meas (&RC.eNB[eNB_id][0]->dlsch_scrambling_stats); + reset_meas (&RC.eNB[eNB_id][0]->dlsch_rate_matching_stats); + reset_meas (&RC.eNB[eNB_id][0]->dlsch_turbo_encoding_stats); + reset_meas (&RC.eNB[eNB_id][0]->dlsch_interleaving_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ofdm_demod_stats); - //reset_meas(&PHY_vars_eNB_g[eNB_id]->rx_dft_stats); - //reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_channel_estimation_stats); - //reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_freq_offset_estimation_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_decoding_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_demodulation_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_rate_unmatching_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_turbo_decoding_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_deinterleaving_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_demultiplexing_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_llr_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_init_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_alpha_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_beta_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_gamma_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_ext_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_intl1_stats); - reset_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_intl2_stats); + // reset_meas (&RC.eNB[eNB_id][0]->ofdm_demod_stats); + //reset_meas(&RC.eNB[eNB_id]->rx_dft_stats); + //reset_meas(&RC.eNB[eNB_id]->ulsch_channel_estimation_stats); + //reset_meas(&RC.eNB[eNB_id]->ulsch_freq_offset_estimation_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_decoding_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_demodulation_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_rate_unmatching_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_turbo_decoding_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_deinterleaving_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_demultiplexing_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_llr_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_tc_init_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_tc_alpha_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_tc_beta_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_tc_gamma_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_tc_ext_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_tc_intl1_stats); + reset_meas (&RC.eNB[eNB_id][0]->ulsch_tc_intl2_stats); #ifdef LOCALIZATION - reset_meas(&PHY_vars_eNB_g[eNB_id][0]->localization_stats); + reset_meas(&RC.eNB[eNB_id][0]->localization_stats); #endif /* * L2 functions */ // eNB MAC - reset_meas (&eNB_mac_inst[eNB_id].eNB_scheduler); // total - reset_meas (&eNB_mac_inst[eNB_id].schedule_si); // only schedule + tx - reset_meas (&eNB_mac_inst[eNB_id].schedule_ra); // only ra - reset_meas (&eNB_mac_inst[eNB_id].schedule_ulsch); // onlu ulsch - reset_meas (&eNB_mac_inst[eNB_id].fill_DLSCH_dci); // only dci - reset_meas (&eNB_mac_inst[eNB_id].schedule_dlsch_preprocessor); // include rlc_data_req + MAC header gen - reset_meas (&eNB_mac_inst[eNB_id].schedule_dlsch); // include rlc_data_req + MAC header gen + pre-processor - reset_meas (&eNB_mac_inst[eNB_id].schedule_mch); // only embms - reset_meas (&eNB_mac_inst[eNB_id].rx_ulsch_sdu); // include rlc_data_ind + mac header parser + reset_meas (&RC.mac[eNB_id]->eNB_scheduler); // total + reset_meas (&RC.mac[eNB_id]->schedule_si); // only schedule + tx + reset_meas (&RC.mac[eNB_id]->schedule_ra); // only ra + reset_meas (&RC.mac[eNB_id]->schedule_ulsch); // onlu ulsch + reset_meas (&RC.mac[eNB_id]->fill_DLSCH_dci); // only dci + reset_meas (&RC.mac[eNB_id]->schedule_dlsch_preprocessor); // include rlc_data_req + MAC header gen + reset_meas (&RC.mac[eNB_id]->schedule_dlsch); // include rlc_data_req + MAC header gen + pre-processor + reset_meas (&RC.mac[eNB_id]->schedule_mch); // only embms + reset_meas (&RC.mac[eNB_id]->rx_ulsch_sdu); // include rlc_data_ind + mac header parser reset_meas (&eNB_pdcp_stats[eNB_id].pdcp_run); reset_meas (&eNB_pdcp_stats[eNB_id].data_req); @@ -1628,7 +1412,7 @@ reset_opp_meas (void) } void -print_opp_meas (void) +print_opp_meas_oaisim (void) { uint8_t eNB_id = 0, UE_id = 0; @@ -1644,35 +1428,38 @@ print_opp_meas (void) &oaisim_stats_f); for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { - for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { - print_meas (&eNB2UE[eNB_id][UE_id][0]->random_channel, + for (ru_id = 0; ru_id < NB_RU; ru_id++) { + print_meas (&RU2UE[ru_id][UE_id][0]->random_channel, "[DL][random_channel]", &oaisim_stats, &oaisim_stats_f); - print_meas (&eNB2UE[eNB_id][UE_id][0]->interp_time, + print_meas (&RU2UE[ru_id][UE_id][0]->interp_time, "[DL][interp_time]", &oaisim_stats, &oaisim_stats_f); - print_meas (&eNB2UE[eNB_id][UE_id][0]->interp_freq, + print_meas (&RU2UE[ru_id][UE_id][0]->interp_freq, "[DL][interp_freq]", &oaisim_stats, &oaisim_stats_f); - print_meas (&eNB2UE[eNB_id][UE_id][0]->convolution, + print_meas (&RU2UE[ru_id][UE_id][0]->convolution, "[DL][convolution]", &oaisim_stats, &oaisim_stats_f); - print_meas (&UE2eNB[UE_id][eNB_id][0]->random_channel, + print_meas (&UE2RU[UE_id][ru_id][0]->random_channel, "[UL][random_channel]", &oaisim_stats, &oaisim_stats_f); - print_meas (&UE2eNB[UE_id][eNB_id][0]->interp_time, + print_meas (&UE2RU[UE_id][ru_id][0]->interp_time, "[UL][interp_time]", &oaisim_stats, &oaisim_stats_f); - print_meas (&UE2eNB[UE_id][eNB_id][0]->interp_freq, + print_meas (&UE2RU[UE_id][ru_id][0]->interp_freq, "[UL][interp_freq]", &oaisim_stats, &oaisim_stats_f); - print_meas (&UE2eNB[UE_id][eNB_id][0]->convolution, + print_meas (&UE2RU[UE_id][ru_id][0]->convolution, "[UL][convolution]", &oaisim_stats, &oaisim_stats_f); } } for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { - print_meas (&PHY_vars_UE_g[UE_id][0]->phy_proc, "[UE][total_phy_proc]", + print_meas (&PHY_vars_UE_g[UE_id][0]->phy_proc[0], "[UE][total_phy_proc[0]]", &oaisim_stats, &oaisim_stats_f); + print_meas (&PHY_vars_UE_g[UE_id][0]->phy_proc[1], "[UE][total_phy_proc[1]]", + &oaisim_stats, &oaisim_stats_f); + print_meas (&PHY_vars_UE_g[UE_id][0]->phy_proc_rx, "[UE][total_phy_proc_rx]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_UE_g[UE_id][0]->ofdm_demod_stats, - "[UE][ofdm_demod]", &oaisim_stats, &oaisim_stats_f); + // print_meas (&PHY_vars_UE_g[UE_id][0]->ofdm_demod_stats, + // "[UE][ofdm_demod]", &oaisim_stats, &oaisim_stats_f); print_meas (&PHY_vars_UE_g[UE_id][0]->rx_dft_stats, "[UE][rx_dft]", &oaisim_stats, &oaisim_stats_f); print_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_channel_estimation_stats, @@ -1683,8 +1470,10 @@ print_opp_meas (void) &oaisim_stats, &oaisim_stats_f); print_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_unscrambling_stats, "[UE][unscrambling]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_decoding_stats, - "[UE][decoding]", &oaisim_stats, &oaisim_stats_f); + print_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_decoding_stats[0], + "[UE][decoding[0]]", &oaisim_stats, &oaisim_stats_f); + print_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_decoding_stats[1], + "[UE][decoding[1]]", &oaisim_stats, &oaisim_stats_f); print_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_rate_unmatching_stats, "[UE][rate_unmatching]", &oaisim_stats, &oaisim_stats_f); print_meas (&PHY_vars_UE_g[UE_id][0]->dlsch_deinterleaving_stats, @@ -1728,65 +1517,65 @@ print_opp_meas (void) } for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { - print_meas (&PHY_vars_eNB_g[eNB_id][0]->phy_proc, + print_meas (&RC.eNB[eNB_id][0]->phy_proc, "[eNB][total_phy_proc]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->phy_proc_tx, + print_meas (&RC.eNB[eNB_id][0]->phy_proc_tx, "[eNB][total_phy_proc_tx]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ofdm_mod_stats, + print_meas (&RC.eNB[eNB_id][0]->ofdm_mod_stats, "[eNB][ofdm_mod]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_modulation_stats, + print_meas (&RC.eNB[eNB_id][0]->dlsch_modulation_stats, "[eNB][modulation]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_scrambling_stats, + print_meas (&RC.eNB[eNB_id][0]->dlsch_scrambling_stats, "[eNB][scrambling]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_encoding_stats, + print_meas (&RC.eNB[eNB_id][0]->dlsch_encoding_stats, "[eNB][encoding]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_interleaving_stats, + print_meas (&RC.eNB[eNB_id][0]->dlsch_interleaving_stats, "[eNB][|_interleaving]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_rate_matching_stats, + print_meas (&RC.eNB[eNB_id][0]->dlsch_rate_matching_stats, "[eNB][|_rate_matching]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->dlsch_turbo_encoding_stats, + print_meas (&RC.eNB[eNB_id][0]->dlsch_turbo_encoding_stats, "[eNB][|_turbo_encoding]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->phy_proc_rx, + print_meas (&RC.eNB[eNB_id][0]->phy_proc_rx, "[eNB][total_phy_proc_rx]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ofdm_demod_stats, - "[eNB][ofdm_demod]", &oaisim_stats, &oaisim_stats_f); - //print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_channel_estimation_stats,"[eNB][channel_est]"); - //print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_freq_offset_estimation_stats,"[eNB][freq_offset]"); - //print_meas(&PHY_vars_eNB_g[eNB_id][0]->rx_dft_stats,"[eNB][rx_dft]"); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_demodulation_stats, + // print_meas (&RC.eNB[eNB_id][0]->ofdm_demod_stats, + // "[eNB][ofdm_demod]", &oaisim_stats, &oaisim_stats_f); + //print_meas(&RC.eNB[eNB_id][0]->ulsch_channel_estimation_stats,"[eNB][channel_est]"); + //print_meas(&RC.eNB[eNB_id][0]->ulsch_freq_offset_estimation_stats,"[eNB][freq_offset]"); + //print_meas(&RC.eNB[eNB_id][0]->rx_dft_stats,"[eNB][rx_dft]"); + print_meas (&RC.eNB[eNB_id][0]->ulsch_demodulation_stats, "[eNB][demodulation]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_decoding_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_decoding_stats, "[eNB][decoding]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_deinterleaving_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_deinterleaving_stats, "[eNB][|_deinterleaving]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_demultiplexing_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_demultiplexing_stats, "[eNB][|_demultiplexing]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_rate_unmatching_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_rate_unmatching_stats, "[eNB][|_rate_unmatching]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_turbo_decoding_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_turbo_decoding_stats, "[eNB][|_turbo_decoding]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_init_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_tc_init_stats, "[eNB][ |_tc_init]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_alpha_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_tc_alpha_stats, "[eNB][ |_tc_alpha]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_beta_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_tc_beta_stats, "[eNB][ |_tc_beta]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_gamma_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_tc_gamma_stats, "[eNB][ |_tc_gamma]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_ext_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_tc_ext_stats, "[eNB][ |_tc_ext]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_intl1_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_tc_intl1_stats, "[eNB][ |_tc_intl1]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_intl2_stats, + print_meas (&RC.eNB[eNB_id][0]->ulsch_tc_intl2_stats, "[eNB][ |_tc_intl2]", &oaisim_stats, &oaisim_stats_f); - print_meas (&PHY_vars_eNB_g[eNB_id][0]->rx_prach, "[eNB][rx_prach]", + print_meas (&RC.eNB[eNB_id][0]->rx_prach, "[eNB][rx_prach]", &oaisim_stats, &oaisim_stats_f); #ifdef LOCALIZATION - print_meas(&PHY_vars_eNB_g[eNB_id][0]->localization_stats, "[eNB][LOCALIZATION]",&oaisim_stats,&oaisim_stats_f); + print_meas(&RC.eNB[eNB_id][0]->localization_stats, "[eNB][LOCALIZATION]",&oaisim_stats,&oaisim_stats_f); #endif } @@ -1826,24 +1615,24 @@ print_opp_meas (void) for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { - print_meas (&eNB_mac_inst[eNB_id].eNB_scheduler, "[eNB][mac_scheduler]", + print_meas (&RC.mac[eNB_id]->eNB_scheduler, "[eNB][mac_scheduler]", &oaisim_stats, &oaisim_stats_f); - print_meas (&eNB_mac_inst[eNB_id].schedule_si, "[eNB][DL][SI]", + print_meas (&RC.mac[eNB_id]->schedule_si, "[eNB][DL][SI]", &oaisim_stats, &oaisim_stats_f); - print_meas (&eNB_mac_inst[eNB_id].schedule_ra, "[eNB][DL][RA]", + print_meas (&RC.mac[eNB_id]->schedule_ra, "[eNB][DL][RA]", &oaisim_stats, &oaisim_stats_f); - print_meas (&eNB_mac_inst[eNB_id].fill_DLSCH_dci, + print_meas (&RC.mac[eNB_id]->fill_DLSCH_dci, "[eNB][DL/UL][fill_DCI]", &oaisim_stats, &oaisim_stats_f); - print_meas (&eNB_mac_inst[eNB_id].schedule_dlsch_preprocessor, + print_meas (&RC.mac[eNB_id]->schedule_dlsch_preprocessor, "[eNB][DL][preprocessor]", &oaisim_stats, &oaisim_stats_f); - print_meas (&eNB_mac_inst[eNB_id].schedule_dlsch, + print_meas (&RC.mac[eNB_id]->schedule_dlsch, "[eNB][DL][schedule_tx_dlsch]", &oaisim_stats, &oaisim_stats_f); - print_meas (&eNB_mac_inst[eNB_id].schedule_mch, "[eNB][DL][mch]", + print_meas (&RC.mac[eNB_id]->schedule_mch, "[eNB][DL][mch]", &oaisim_stats, &oaisim_stats_f); - print_meas (&eNB_mac_inst[eNB_id].schedule_ulsch, "[eNB][UL][ULSCH]", + print_meas (&RC.mac[eNB_id]->schedule_ulsch, "[eNB][UL][ULSCH]", &oaisim_stats, &oaisim_stats_f); - print_meas (&eNB_mac_inst[eNB_id].rx_ulsch_sdu, + print_meas (&RC.mac[eNB_id]->rx_ulsch_sdu, "[eNB][UL][rx_ulsch_sdu]", &oaisim_stats, &oaisim_stats_f); print_meas (&eNB_pdcp_stats[eNB_id].pdcp_run, "[eNB][pdcp_run]", @@ -1932,49 +1721,45 @@ oai_shutdown (void) kpi_gen (); } if (oai_emulation.info.opp_enabled == 1) - print_opp_meas (); + print_opp_meas_oaisim (); - // relase all rx state - if (ethernet_flag == 1) { - emu_transport_release (); - } #ifdef PROC if (abstraction_flag == 0 && Channel_Flag==0 && Process_Flag==0) #else - if (abstraction_flag == 0) + if (abstraction_flag == 0) #endif - { - /* - #ifdef IFFT_FPGA - free(txdataF2[0]); - free(txdataF2[1]); - free(txdataF2); - free(txdata[0]); - free(txdata[1]); - free(txdata); - #endif - */ + { + /* + #ifdef IFFT_FPGA + free(txdataF2[0]); + free(txdataF2[1]); + free(txdataF2); + free(txdata[0]); + free(txdata[1]); + free(txdata); + #endif + */ + /* + for (int i = 0; i < 2; i++) { + free (s_re[i]); + free (s_im[i]); + free (r_re[i]); + free (r_im[i]); + } - for (int i = 0; i < 2; i++) { - free (s_re[i]); - free (s_im[i]); - free (r_re[i]); - free (r_im[i]); - } + free (s_re); + free (s_im); + free (r_re); + free (r_im); + s_re = 0; + s_im = 0; + r_re = 0; + r_im = 0;*/ - free (s_re); - free (s_im); - free (r_re); - free (r_im); - s_re = 0; - s_im = 0; - r_re = 0; - r_im = 0; - - lte_sync_time_free (); - } + lte_sync_time_free (); + } // added for PHY abstraction if (oai_emulation.info.ocm_enabled == 1) { @@ -1989,9 +1774,6 @@ oai_shutdown (void) } } //End of PHY abstraction changes -#ifdef OPENAIR2 - mac_top_cleanup (); -#endif // stop OMG stop_mobility_generator (omg_param_list); //omg_param_list.mobility_type @@ -2034,7 +1816,7 @@ oai_shutdown (void) eNB_MAC_INST* get_eNB_mac_inst (module_id_t module_idP) { - return (&eNB_mac_inst[module_idP]); + return (RC.mac[module_idP]); } OAI_Emulation* @@ -2042,3 +1824,12 @@ get_OAI_emulation () { return &oai_emulation; } + + +// dummy function declarations + +void *rrc_enb_task(void *args_p) { + + +} + diff --git a/targets/SIMU/USER/oaisim.h b/targets/SIMU/USER/oaisim.h index 6fb16b82db..ce21470ed4 100644 --- a/targets/SIMU/USER/oaisim.h +++ b/targets/SIMU/USER/oaisim.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -50,11 +42,17 @@ eNB_MAC_INST* get_eNB_mac_inst(module_id_t module_idP); OAI_Emulation* get_OAI_emulation(void); void init_channel_vars(LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ***s_im,double ***r_re,double ***r_im,double ***r_re0,double ***r_im0); -void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs], - node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, uint32_t,uint8_t); +void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM_CCs], + node_desc_t *enb_data[NUMBER_OF_RU_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX], + uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, + uint32_t frame,int eNB_id,uint8_t CC_id); -void do_DL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs], - node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id,int CC_id); +void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs], + node_desc_t *enb_data[NUMBER_OF_RU_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX], + uint16_t subframe, + uint16_t offset, + uint16_t length, + uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id,int CC_id); void init_ue(node_desc_t *ue_data, UE_Antenna ue_ant);//Abstraction changes void init_enb(node_desc_t *enb_data, eNB_Antenna enb_ant);//Abstraction changes diff --git a/targets/SIMU/USER/oaisim_config.c b/targets/SIMU/USER/oaisim_config.c index 51a5a03eac..17ed9ff571 100644 --- a/targets/SIMU/USER/oaisim_config.c +++ b/targets/SIMU/USER/oaisim_config.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file oaisim_config.c * \brief Configuration of oaisim @@ -255,7 +247,8 @@ void init_oai_emulation(void) oai_emulation.info.first_rn_local=0; oai_emulation.info.master_id=0; oai_emulation.info.nb_ue_local= 1;//default 1 UE - oai_emulation.info.nb_enb_local= 1;//default 1 eNB + oai_emulation.info.nb_enb_local= 0;//default 0 eNB (to be loaded from config) + oai_emulation.info.nb_ru_local= 0;//default 0 ru (to be loaded from config) oai_emulation.info.nb_rn_local= 0;//default 0 RN : currently only applicable for eMBMS oai_emulation.info.ethernet_flag=0; oai_emulation.info.ocm_enabled=1;// flag ? @@ -456,7 +449,7 @@ int olg_config(void) set_comp_log(PHY, LOG_TRACE, 0x15, 1); set_comp_log(PDCP, LOG_DEBUG, 0x15,1); set_comp_log(RRC, LOG_DEBUG, 0x15,1); - set_comp_log(OCM, LOG_ERR, 0x15,20); + set_comp_log(OCM, LOG_DEBUG, 0x15,20); set_comp_log(OTG, LOG_DEBUG, 0x15,1); set_comp_log(OMG, LOG_NOTICE, 0x15,1); set_comp_log(OPT, LOG_ERR, 0x15,1); @@ -476,7 +469,7 @@ int ocg_config_env(void) oai_emulation.info.frame_type[CC_id] = map_str_to_int(frame_type_names, oai_emulation.info.frame_type_name[CC_id]); if (oai_emulation.info.frame_type[CC_id] == -1) { - LOG_E(EMU,"frame type incorrect %s, set it to TDD \n",oai_emulation.info.frame_type_name); + LOG_E(EMU,"frame type incorrect %s, set it to TDD \n",oai_emulation.info.frame_type_name[CC_id]); oai_emulation.info.frame_type[CC_id]=TDD; } else LOG_I(EMU,"Frame type is %s \n",oai_emulation.info.frame_type_name[CC_id]); @@ -486,7 +479,7 @@ int ocg_config_env(void) LOG_E(EMU,"TDD config %d out of range, set it to 3\n",oai_emulation.info.tdd_config[CC_id]); oai_emulation.info.tdd_config[CC_id]=3; } else - LOG_I(EMU,"TDD config is set to \n",oai_emulation.info.tdd_config[CC_id]); + LOG_I(EMU,"TDD config is set to %d\n",oai_emulation.info.tdd_config[CC_id]); } } } @@ -1095,8 +1088,8 @@ int ocg_config_app(void) oai_emulation.application_config.customized_traffic.holding_time_pe_off[customized_traffic_config_index]; - LOG_I(OTG,"customized:: OCG_config_OTG: (2) FORMAT (%d:%d) source = %d, dest = %d, dist type for size = %d start/duration %d/%d\n", source_id_start, source_id_end, source_id_index, - destination_id_index, g_otg->size_dist[source_id_index][destination_id_index][0], + LOG_I(OTG,"customized:: OCG_config_OTG: (2) FORMAT (%s:%s) source = %d, dest = %d, dist type for size = %d [TODO: check code, printed value may not be correct, checks the indexes of the arry access] start/duration %d/%d\n", source_id_start, source_id_end, source_id_index, + destination_id_index, g_otg->size_dist[source_id_index][destination_id_index][0][0], g_otg->flow_start[source_id_index][destination_id_index][g_otg->application_idx[source_id_index][destination_id_index]], g_otg->flow_duration[source_id_index][destination_id_index][g_otg->application_idx[source_id_index][destination_id_index]]); per_source_id = strtok(NULL, comma); diff --git a/targets/SIMU/USER/oaisim_config.h b/targets/SIMU/USER/oaisim_config.h index a50a8d2426..fe1309b7a4 100644 --- a/targets/SIMU/USER/oaisim_config.h +++ b/targets/SIMU/USER/oaisim_config.h @@ -1,32 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ - +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ /*! \file oaisim_config.h * \brief configure an emulation diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index a5acb2616a..be8f66fb93 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -1,34 +1,27 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ /*! \file oaisim_functions.c * \brief function primitives of oaisim -* \author Navid Nikaein +* \author Navid Nikaein * \date 2013-2015 * \version 1.0 * \company Eurecom @@ -84,6 +77,12 @@ # include "s1ap_eNB.h" #endif +#include "../../ARCH/COMMON/common_lib.h" +#include "../../ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" + +#include "ENB_APP/enb_paramdef.h" +#include "common/config/config_userapi.h" + #ifdef SMBV extern uint8_t config_smbv; extern char smbv_ip[16]; @@ -95,12 +94,13 @@ extern char smbv_ip[16]; #define K 2 // averaging coefficient #define TARGET_SF_TIME_NS 1000000 // 1ms = 1000000 ns + int otg_times = 0; int if_times = 0; int for_times = 0; uint16_t Nid_cell = 0; //needed by init_lte_vars -int nb_antennas_rx = 2; // // +int nb_antennas_rx_ue = 1; // // uint8_t target_dl_mcs = 16; // max mcs used by MAC scheduler uint8_t rate_adaptation_flag = 0; uint8_t set_snr = 0; @@ -117,7 +117,7 @@ uint8_t beta_ACK = 0; uint8_t beta_RI = 0; uint8_t beta_CQI = 2; uint8_t target_ul_mcs = 16; -LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; +//LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]; int map1,map2; double **ShaF = NULL; // pointers signal buffers (s = transmit, r,r0 = receive) @@ -157,13 +157,13 @@ char tdd_config[10]; Packet_OTG_List_t *otg_pdcp_buffer = NULL; -extern node_desc_t *enb_data[NUMBER_OF_eNB_MAX]; +extern node_desc_t *enb_data[NUMBER_OF_RU_MAX]; extern node_desc_t *ue_data[NUMBER_OF_UE_MAX]; -extern channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs]; -extern channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs]; +extern channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs]; +extern channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM_CCs]; extern mapping small_scale_names[]; -#if defined(Rel10) +#if defined(Rel10) || defined(Rel14) extern pdcp_mbms_t pdcp_mbms_array_ue[NUMBER_OF_UE_MAX][maxServiceCount][maxSessionPerPMCH]; extern pdcp_mbms_t pdcp_mbms_array_eNB[NUMBER_OF_eNB_MAX][maxServiceCount][maxSessionPerPMCH]; #endif @@ -173,11 +173,28 @@ extern time_stats_t ul_chan_stats; extern int xforms; + +extern uint32_t downlink_frequency[MAX_NUM_CCs][4]; +extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; + +int oaisim_flag=1; + + +void RCConfig_sim(void) { + + paramlist_def_t RUParamList = {CONFIG_STRING_RU_LIST,NULL,0}; + + + // Get num RU instances + config_getlist( &RUParamList,NULL,0, NULL); + RC.nb_RU = RUParamList.numelt; + + +} + void get_simulation_options(int argc, char *argv[]) { int option; - const Enb_properties_array_t *enb_properties; - char *conf_config_file_name = NULL; enum long_option_e { LONG_OPTION_START = 0x100, /* Start after regular single char options */ @@ -269,9 +286,9 @@ void get_simulation_options(int argc, char *argv[]) case LONG_OPTION_ENB_CONF: if (optarg) { - free(conf_config_file_name); // prevent memory leak if option is used multiple times - conf_config_file_name = strdup(optarg); - printf("eNB configuration file is %s\n", conf_config_file_name); + free(RC.config_file_name); // prevent memory leak if option is used multiple times + RC.config_file_name = strdup(optarg); + printf("eNB configuration file is %s\n", RC.config_file_name); } break; @@ -448,6 +465,8 @@ void get_simulation_options(int argc, char *argv[]) case 'a': abstraction_flag = 1; + printf("FATAL: -a flag not functional for the moment.\nWe are working on fixing the abstraction mode.\n"); + exit(1); break; case 'A': @@ -597,8 +616,8 @@ void get_simulation_options(int argc, char *argv[]) case 'O': if (optarg) { - free(conf_config_file_name); // prevent memory leak if option is used multiple times - conf_config_file_name = strdup(optarg); + free(RC.config_file_name); // prevent memory leak if option is used multiple times + RC.config_file_name = strdup(optarg); } break; @@ -714,13 +733,18 @@ void get_simulation_options(int argc, char *argv[]) break; case 'x': + /* oai_emulation.info.transmission_mode[0] = atoi (optarg); - if ((oai_emulation.info.transmission_mode[0] != 1) && (oai_emulation.info.transmission_mode[0] != 2) && (oai_emulation.info.transmission_mode[0] != 3) - && (oai_emulation.info.transmission_mode[0] != 5) && (oai_emulation.info.transmission_mode[0] != 6)) { + if ((oai_emulation.info.transmission_mode[0] != 1) && (oai_emulation.info.transmission_mode[0] != 2) && + (oai_emulation.info.transmission_mode[0] != 3) && (oai_emulation.info.transmission_mode[0] != 4) && + (oai_emulation.info.transmission_mode[0] != 5) && (oai_emulation.info.transmission_mode[0] != 6)) && (oai_emulation.info.transmission_mode[0] !=7)) { printf("Unsupported transmission mode %d\n",oai_emulation.info.transmission_mode[0]); exit(-1); } + */ + printf("Option -x deprecated. Please set transmission mode in eNB config file\n"); + exit(-1); break; @@ -745,9 +769,9 @@ void get_simulation_options(int argc, char *argv[]) break; case 'y': - nb_antennas_rx=atoi(optarg); + nb_antennas_rx_ue=atoi(optarg); - if (nb_antennas_rx>4) { + if (nb_antennas_rx_ue>4) { printf("Cannot have more than 4 antennas\n"); exit(-1); } @@ -773,23 +797,71 @@ void get_simulation_options(int argc, char *argv[]) } } - if ((oai_emulation.info.nb_enb_local > 0) && (conf_config_file_name != NULL)) { + if ( load_configmodule(argc,argv) == NULL) { + exit_fun("[SOFTMODEM] Error, configuration module init failed\n"); + } + + if (RC.config_file_name != NULL) { /* Read eNB configuration file */ - enb_properties = enb_config_init(conf_config_file_name); + RCConfig_sim(); + printf("returned with %d eNBs, %d rus\n",RC.nb_inst,RC.nb_RU); + oai_emulation.info.nb_enb_local = RC.nb_inst; + oai_emulation.info.nb_ru_local = RC.nb_RU; + + /* + for (int j=0; jnb_ru; j++) { + + // local_remote_radio = BBU_REMOTE_RADIO_HEAD; + (eth_params+j)->local_if_name = enb_properties->ru_config[j]->ru_if_name; + (eth_params+j)->my_addr = enb_properties->ru_config[j]->local_address; + (eth_params+j)->my_port = enb_properties->ru_config[j]->local_port; + (eth_params+j)->remote_addr = enb_properties->ru_config[j]->remote_address; + (eth_params+j)->remote_port = enb_properties->ru_config[j]->remote_port; + + if (enb_properties->ru_config[j]->raw == 1) { + (eth_params+j)->transp_preference = ETH_RAW_MODE; + ru_if_in[j] = REMOTE_IF5; + node_function[j] = NGFI_RRU_IF5; + } else if (enb_properties->ru_config[j]->rawif4p5 == 1) { + (eth_params+j)->transp_preference = ETH_RAW_IF4p5_MODE; + ru_if_in[j] = REMOTE_IF4p5; + node_function[j] = NGFI_RRU_IF4p5; + } else if (enb_properties->ru_config[j]->udpif4p5 == 1) { + (eth_params+j)->transp_preference = ETH_UDP_IF4p5_MODE; + ru_if_in[j] = REMOTE_IF4p5; + node_function[j] = NGFI_RRU_IF4p5; + } else if (enb_properties->ru_config[j]->rawif5_mobipass == 1) { + (eth_params+j)->transp_preference = ETH_RAW_IF5_MOBIPASS; + ru_if_in[j] = REMOTE_IF5; + LOG_E(EMU,"Don't use 8-bit IF5 format with oaisim, please change in configuration file\n"); + } else { + (eth_params+j)->transp_preference = ETH_UDP_MODE; + ru_if_in[j] = REMOTE_IF5; + node_function[j] = NGFI_RRU_IF5; + } + node_timing[j] = synch_to_ext_device; - AssertFatal (oai_emulation.info.nb_enb_local <= enb_properties->number, - "Number of eNB is greater than eNB defined in configuration file %s (%d/%d)!", - conf_config_file_name, oai_emulation.info.nb_enb_local, enb_properties->number); - - /* Update some simulation parameters */ - oai_emulation.info.frame_type[0] = enb_properties->properties[0]->frame_type[0]; - oai_emulation.info.tdd_config[0] = enb_properties->properties[0]->tdd_config[0]; - oai_emulation.info.tdd_config_S[0] = enb_properties->properties[0]->tdd_config_s[0]; - oai_emulation.info.extended_prefix_flag[0] = enb_properties->properties[0]->prefix_type[0]; + if (enb_properties->number > 0) { + //Update some simulation parameters + oai_emulation.info.frame_type[0] = enb_properties->properties[0]->frame_type[0]; + oai_emulation.info.tdd_config[0] = enb_properties->properties[0]->tdd_config[0]; + oai_emulation.info.tdd_config_S[0] = enb_properties->properties[0]->tdd_config_s[0]; + oai_emulation.info.extended_prefix_flag[0] = enb_properties->properties[0]->prefix_type[0]; + + oai_emulation.info.node_function[0] = enb_properties->properties[0]->cc_node_function[0]; + oai_emulation.info.node_timing[0] = enb_properties->properties[0]->cc_node_timing[0]; + downlink_frequency[0][0] = enb_properties->properties[0]->downlink_frequency[0]; + uplink_frequency_offset[0][0] = enb_properties->properties[0]->uplink_frequency_offset[0]; + oai_emulation.info.N_RB_DL[0] = enb_properties->properties[0]->N_RB_DL[0]; + LOG_E(EMU,"Please use only RRU with oaisim, remove eNB descriptors in configuration file\n"); + exit(-1); + } + }*/ + } + else { + printf("Please provide a configuration file\n"); + exit(-1); } - - free(conf_config_file_name); - conf_config_file_name = 0; } void check_and_adjust_params(void) @@ -828,7 +900,7 @@ void check_and_adjust_params(void) if (ret < 0) LOG_W(EMU,"[INIT] Netlink not available, careful ...\n"); - + /* if (ethernet_flag == 1) { oai_emulation.info.master[oai_emulation.info.master_id].nb_ue = oai_emulation.info.nb_ue_local + oai_emulation.info.nb_rn_local; oai_emulation.info.master[oai_emulation.info.master_id].nb_enb = oai_emulation.info.nb_enb_local + oai_emulation.info.nb_rn_local; @@ -850,18 +922,19 @@ void check_and_adjust_params(void) } LOG_I (EMU, " Total number of master %d my master id %d\n", oai_emulation.info.nb_master, oai_emulation.info.master_id); - init_bypass (); + // init_bypass (); while (emu_tx_status != SYNCED_TRANSPORT) { LOG_I (EMU, " Waiting for EMU Transport to be synced\n"); emu_transport_sync (); //emulation_tx_rx(); } } // ethernet flag - + */ // NB_UE_INST = oai_emulation.info.nb_ue_local + oai_emulation.info.nb_ue_remote; NB_eNB_INST = oai_emulation.info.nb_enb_local + oai_emulation.info.nb_enb_remote; NB_RN_INST = oai_emulation.info.nb_rn_local + oai_emulation.info.nb_rn_remote; + NB_RU = oai_emulation.info.nb_ru_local + oai_emulation.info.nb_ru_remote; #if defined(PDCP_USE_NETLINK_QUEUES) && defined(OPENAIR2) pdcp_netlink_init(); @@ -946,201 +1019,379 @@ void init_seed(uint8_t set_seed) } } -void init_openair1(void) -{ - module_id_t UE_id, eNB_id; - uint8_t CC_id; -#if ENABLE_RAL - int list_index; -#endif +openair0_timestamp current_ru_rx_timestamp[NUMBER_OF_RU_MAX][MAX_NUM_CCs]; +openair0_timestamp current_UE_rx_timestamp[NUMBER_OF_UE_MAX][MAX_NUM_CCs]; +openair0_timestamp last_ru_rx_timestamp[NUMBER_OF_RU_MAX][MAX_NUM_CCs]; +openair0_timestamp last_UE_rx_timestamp[NUMBER_OF_UE_MAX][MAX_NUM_CCs]; - // change the nb_connected_eNB - for (CC_id=0; CC_idpusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK; - PHY_vars_eNB_g[eNB_id][CC_id]->pusch_config_dedicated[UE_id].betaOffset_RI_Index = beta_RI; - PHY_vars_eNB_g[eNB_id][CC_id]->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI; - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.p_b = (frame_parms[CC_id]->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_A = rho_B - - PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK; - PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_RI_Index = beta_RI; - PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI; - PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.pdsch_config_common.p_b = (frame_parms[CC_id]->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_A = rho_B - } - } - } - - printf ("AFTER init: MAX_NUM_CCs %d, Nid_cell %d frame_type %d,tdd_config %d\n", - MAX_NUM_CCs, - PHY_vars_eNB_g[0][0]->lte_frame_parms.Nid_cell, - PHY_vars_eNB_g[0][0]->lte_frame_parms.frame_type, - PHY_vars_eNB_g[0][0]->lte_frame_parms.tdd_config); - - number_of_cards = 1; - - openair_daq_vars.rx_rf_mode = 1; - openair_daq_vars.tdd = 1; - openair_daq_vars.rx_gain_mode = DAQ_AGC_ON; - - openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode[0]; -//#warning "NN->FK: OAI EMU channel abstraction does not work for MCS higher than" - openair_daq_vars.target_ue_dl_mcs = cmin(target_dl_mcs,16); - openair_daq_vars.target_ue_ul_mcs = target_ul_mcs; - openair_daq_vars.ue_dl_rb_alloc=0x1fff; - openair_daq_vars.ue_ul_nb_rb=6; - openair_daq_vars.dlsch_rate_adaptation = rate_adaptation_flag; - openair_daq_vars.use_ia_receiver = 0; - - //N_TA_offset - for (CC_id=0; CC_idlte_frame_parms.frame_type == TDD) { - if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 100) - PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624; - else if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 50) - PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624/2; - else if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 25) - PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624/4; - } else { - PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 0; - } - } - - for (eNB_id=0; eNB_idlte_frame_parms.frame_type == TDD) { - if (PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL == 100) - PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 624; - else if (PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL == 50) - PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 624/2; - else if (PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL == 25) - PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 624/4; - } else { - PHY_vars_eNB_g[eNB_id][CC_id]->N_TA_offset = 0; - } - } - } - - for (eNB_id=0; eNB_idmac_enabled=0; - else - PHY_vars_eNB_g[eNB_id][CC_id]->mac_enabled=1; - } - - // init_ue_status(); - for (UE_id=0; UE_idtx_power_max_dBm=23; - - PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB=100; - - // update UE_mode for each eNB_id not just 0 - if (abstraction_flag == 0) - PHY_vars_UE_g[UE_id][CC_id]->UE_mode[0] = NOT_SYNCHED; - else { - // 0 is the index of the connected eNB - PHY_vars_UE_g[UE_id][CC_id]->UE_mode[0] = PRACH; - } - - if (phy_test==1) - PHY_vars_UE_g[UE_id][CC_id]->mac_enabled=0; - else - PHY_vars_UE_g[UE_id][CC_id]->mac_enabled=1; - - PHY_vars_UE_g[UE_id][CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1235 + UE_id; - PHY_vars_UE_g[UE_id][CC_id]->current_dlsch_cqi[0] = 10; - - LOG_I(EMU, "UE %d mode is initialized to %d\n", UE_id, PHY_vars_UE_g[UE_id][CC_id]->UE_mode[0] ); -#if ENABLE_RAL - PHY_vars_UE_g[UE_id][CC_id]->ral_thresholds_timed = hashtable_create (64, NULL, NULL); - - for (list_index = 0; list_index < RAL_LINK_PARAM_GEN_MAX; list_index++) { - SLIST_INIT(&PHY_vars_UE_g[UE_id][CC_id]->ral_thresholds_gen_polled[list_index]); - } - - for (list_index = 0; list_index < RAL_LINK_PARAM_LTE_MAX; list_index++) { - SLIST_INIT(&PHY_vars_UE_g[UE_id][CC_id]->ral_thresholds_lte_polled[list_index]); - } - -#endif - - } +int ru_trx_start(openair0_device *device) { + return(0); } -void init_openair2(void) +void ru_trx_end(openair0_device *device) { + return; +} + +int ru_trx_stop(openair0_device *device) { + return(0); +} +int UE_trx_start(openair0_device *device) { + return(0); +} +void UE_trx_end(openair0_device *device) { + return; +} +int UE_trx_stop(openair0_device *device) { + return(0); +} +int ru_trx_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dummy) { + return(0); +} +int ru_trx_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) { + return(0); +} +int UE_trx_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dummy) { + return(0); +} +int UE_trx_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) { + return(0); +} + +extern pthread_mutex_t subframe_mutex; +extern int subframe_ru_mask,subframe_UE_mask; + + +int ru_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { + + int ru_id = device->Mod_id; + int CC_id = device->CC_id; + + int subframe; + int sample_count=0; + + *ptimestamp = last_ru_rx_timestamp[ru_id][CC_id]; + + + LOG_D(EMU,"RU_trx_read nsamps %d TS(%llu,%llu) => subframe %d\n",nsamps, + (unsigned long long)current_ru_rx_timestamp[ru_id][CC_id], + (unsigned long long)last_ru_rx_timestamp[ru_id][CC_id], + (int)((*ptimestamp/RC.ru[ru_id]->frame_parms.samples_per_tti)%10)); + // if we're at a subframe boundary generate UL signals for this ru + + while (sample_countframe_parms.samples_per_tti)%10; + LOG_D(EMU,"RU_trx_read generating UL subframe %d (Ts %llu, current TS %llu)\n", + subframe,(unsigned long long)*ptimestamp, + (unsigned long long)current_ru_rx_timestamp[ru_id][CC_id]); + + do_UL_sig(UE2RU, + enb_data, + ue_data, + subframe, + 0, // abstraction_flag + &RC.ru[ru_id]->frame_parms, + 0, // frame is only used for abstraction + ru_id, + CC_id); + + last_ru_rx_timestamp[ru_id][CC_id] += RC.ru[ru_id]->frame_parms.samples_per_tti; + sample_count += RC.ru[ru_id]->frame_parms.samples_per_tti; + } + + + return(nsamps); +} + +int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) { -#ifdef OPENAIR2 - module_id_t enb_id; - module_id_t UE_id; - int CC_id; -//#warning "eNB index is hard coded to zero" + int UE_id = device->Mod_id; + int CC_id = device->CC_id; + + int subframe; + int sample_count=0; + int read_size; + int sptti = PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti; + + *ptimestamp = last_UE_rx_timestamp[UE_id][CC_id]; + + LOG_D(EMU,"UE %d DL simulation 0: UE_trx_read nsamps %d TS %llu (%llu, offset %d) antenna %d\n", + UE_id, + nsamps, + (unsigned long long)current_UE_rx_timestamp[UE_id][CC_id], + (unsigned long long)last_UE_rx_timestamp[UE_id][CC_id], + (int)(last_UE_rx_timestamp[UE_id][CC_id]%sptti), + cc); + + + if (nsamps < sptti) + read_size = nsamps; + else + read_size = sptti; + + while (sample_countframe_parms, + UE_id, + CC_id); + LOG_D(EMU,"UE %d: DL simulation 6: UE_trx_read @ TS %llu (%llu)=> frame %d, subframe %d\n", + UE_id,(unsigned long long)current_UE_rx_timestamp[UE_id][CC_id], + (unsigned long long)last_UE_rx_timestamp[UE_id][CC_id], + ((unsigned long long)last_UE_rx_timestamp[UE_id][CC_id]/(sptti*10))&1023, + subframe); + + last_UE_rx_timestamp[UE_id][CC_id] += read_size; + sample_count += read_size; + - for (CC_id=0; CC_idlte_frame_parms, - oai_emulation.info.eMBMS_active_state, - NULL, - oai_emulation.info.cba_group_active, - oai_emulation.info.handover_active); - for (enb_id = 0; enb_id < NB_eNB_INST; enb_id++) - mac_xface->mrbch_phy_sync_failure (enb_id, 0, enb_id); - if (abstraction_flag == 1) { - for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) - mac_xface->dl_phy_sync_success (UE_id, 0, 0,1); //UE_id%NB_eNB_INST); } - mac_xface->macphy_exit = exit_fun; -#endif + return(nsamps); +} + +extern double ru_amp[NUMBER_OF_RU_MAX]; + +int ru_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + + int ru_id = device->Mod_id; + + LTE_DL_FRAME_PARMS *frame_parms = &RC.ru[ru_id]->frame_parms; + + pthread_mutex_lock(&subframe_mutex); + LOG_D(EMU,"[TXPATH] ru_trx_write: RU %d mask %d\n",ru_id,subframe_ru_mask); + pthread_mutex_unlock(&subframe_mutex); + + // compute amplitude of TX signal from first symbol in subframe + // note: assumes that the packet is an entire subframe + + ru_amp[ru_id] = 0; + for (int aa=0; aanb_tx; aa++) { + ru_amp[ru_id] += (double)signal_energy((int32_t*)buff[aa],frame_parms->ofdm_symbol_size)/(12*frame_parms->N_RB_DL); + } + ru_amp[ru_id] = sqrt(ru_amp[ru_id]); + + LOG_D(EMU,"Setting amp for RU %d to %f (%d)\n",ru_id,ru_amp[ru_id], dB_fixed((double)signal_energy((int32_t*)buff[0],frame_parms->ofdm_symbol_size))); + // tell top-level we are done + pthread_mutex_lock(&subframe_mutex); + subframe_ru_mask|=(1<N_RB_DL == 100) { + if (frame_parms[0]->threequarter_fs) { + openair0_cfg[card].sample_rate=23.04e6; + openair0_cfg[card].samples_per_frame = 230400; + openair0_cfg[card].tx_bw = 10e6; + openair0_cfg[card].rx_bw = 10e6; + } + else { + openair0_cfg[card].sample_rate=30.72e6; + openair0_cfg[card].samples_per_frame = 307200; + openair0_cfg[card].tx_bw = 10e6; + openair0_cfg[card].rx_bw = 10e6; + } + } else if(frame_parms[0]->N_RB_DL == 50) { + openair0_cfg[card].sample_rate=15.36e6; + openair0_cfg[card].samples_per_frame = 153600; + openair0_cfg[card].tx_bw = 5e6; + openair0_cfg[card].rx_bw = 5e6; + } else if (frame_parms[0]->N_RB_DL == 25) { + openair0_cfg[card].sample_rate=7.68e6; + openair0_cfg[card].samples_per_frame = 76800; + openair0_cfg[card].tx_bw = 2.5e6; + openair0_cfg[card].rx_bw = 2.5e6; + } else if (frame_parms[0]->N_RB_DL == 6) { + openair0_cfg[card].sample_rate=1.92e6; + openair0_cfg[card].samples_per_frame = 19200; + openair0_cfg[card].tx_bw = 1.5e6; + openair0_cfg[card].rx_bw = 1.5e6; + } + + if (frame_parms[0]->frame_type==TDD) + openair0_cfg[card].duplex_mode = duplex_mode_TDD; + else //FDD + openair0_cfg[card].duplex_mode = duplex_mode_FDD; + + + openair0_cfg[card].remote_addr = (eth_params+card)->remote_addr; + openair0_cfg[card].remote_port = (eth_params+card)->remote_port; + openair0_cfg[card].my_addr = (eth_params+card)->my_addr; + openair0_cfg[card].my_port = (eth_params+card)->my_port; + + + printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card, + RC.ru[0]->nb_tx, + RC.ru[0]->nb_rx); + openair0_cfg[card].Mod_id = 0; + + + + openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL; + openair0_cfg[card].tx_num_channels=min(2,RC.ru[0]->nb_tx); + openair0_cfg[card].rx_num_channels=min(2,RC.ru[0]->nb_rx); + + for (i=0; i<4; i++) { + + openair0_cfg[card].rx_gain[i] = RC.ru[0]->rx_total_gain_dB; + + printf("Card %d, channel %d, Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n", + card,i, openair0_cfg[card].tx_gain[i], + openair0_cfg[card].rx_gain[i], + openair0_cfg[card].tx_freq[i], + openair0_cfg[card].rx_freq[i]); + } + } +} +*/ + +void init_devices(void){ + + + module_id_t UE_id, ru_id; + uint8_t CC_id; + RU_t *ru; + + // allocate memory for RU if not already done + if (RC.ru==NULL) RC.ru = (RU_t**)malloc(RC.nb_RU*sizeof(RU_t*)); + + for (ru_id=0;ru_idrfdevice.Mod_id = ru_id; + ru->rfdevice.CC_id = 0; + ru->rfdevice.trx_start_func = ru_trx_start; + ru->rfdevice.trx_read_func = ru_trx_read; + ru->rfdevice.trx_write_func = ru_trx_write; + ru->rfdevice.trx_end_func = ru_trx_end; + ru->rfdevice.trx_stop_func = ru_trx_stop; + ru->rfdevice.trx_set_freq_func = ru_trx_set_freq; + ru->rfdevice.trx_set_gains_func = ru_trx_set_gains; + last_ru_rx_timestamp[ru_id][0] = 0; + + } + if (PHY_vars_UE_g==NULL) { + PHY_vars_UE_g = (PHY_VARS_UE ***)malloc((1+NB_UE_INST)*sizeof(PHY_VARS_UE*)); + for (UE_id=0;UE_idrfdevice.Mod_id = UE_id; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.CC_id = CC_id; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_start_func = UE_trx_start; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_read_func = UE_trx_read; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_write_func = UE_trx_write; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_end_func = UE_trx_end; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_stop_func = UE_trx_stop; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_set_freq_func = UE_trx_set_freq; + PHY_vars_UE_g[UE_id][CC_id]->rfdevice.trx_set_gains_func = UE_trx_set_gains; + last_UE_rx_timestamp[UE_id][CC_id] = 0; + + + + } + } + } } void init_ocm(void) { - module_id_t UE_id, eNB_id; + module_id_t UE_id, ru_id; int CC_id; /* Added for PHY abstraction */ char* frame_type = "unknown"; + LTE_DL_FRAME_PARMS *fp = &RC.ru[0]->frame_parms; - switch (oai_emulation.info.frame_type[0]) { + switch (fp->frame_type) { case FDD: frame_type = "FDD"; break; case TDD: - frame_type = "FDD"; + frame_type = "TDD"; break; } - LOG_I(OCM,"Running with frame_type %d (%s), Nid_cell %d, N_RB_DL %d, EP %d, mode %d, target dl_mcs %d, rate adaptation %d, nframes %d, abstraction %d, channel %s\n", - oai_emulation.info.frame_type[0], frame_type, Nid_cell, oai_emulation.info.N_RB_DL[0], oai_emulation.info.extended_prefix_flag[0], oai_emulation.info.transmission_mode[0],target_dl_mcs, - rate_adaptation_flag,oai_emulation.info.n_frames,abstraction_flag,oai_emulation.environment_system_config.fading.small_scale.selected_option); - if (abstraction_flag) { get_beta_map(); -#ifdef PHY_ABSTRACTION_UL - get_beta_map_up(); -#endif get_MIESM_param(); //load_pbch_desc(); } - for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { - enb_data[eNB_id] = (node_desc_t *)malloc(sizeof(node_desc_t)); - init_enb(enb_data[eNB_id],oai_emulation.environment_system_config.antenna.eNB_antenna); + for (ru_id = 0; ru_id < RC.nb_RU; ru_id++) { + enb_data[ru_id] = (node_desc_t *)malloc(sizeof(node_desc_t)); + init_enb(enb_data[ru_id],oai_emulation.environment_system_config.antenna.eNB_antenna); } for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { @@ -1164,54 +1415,44 @@ void init_ocm(void) } if (abstraction_flag == 0) - init_channel_vars (frame_parms[0], &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0); + init_channel_vars (fp, &s_re, &s_im, &r_re, &r_im, &r_re0, &r_im0); // initialize channel descriptors - for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) { + for (ru_id = 0; ru_id < RC.nb_RU; ru_id++) { for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) { for (CC_id=0; CC_idlte_frame_parms.nb_antennas_tx, - PHY_vars_UE_g[UE_id]->lte_frame_parms.nb_antennas_rx, - (UE_id == 0)? Rice1_corr : Rice1_anticorr, - oai_emulation.environment_system_config.system_bandwidth_MB, - forgetting_factor, - 0, - 0); - else - */ - - eNB2UE[eNB_id][UE_id][CC_id] = - new_channel_desc_scm(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.nb_antennas_tx, - PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.nb_antennas_rx, + RU2UE[ru_id][UE_id][CC_id] = + new_channel_desc_scm(RC.ru[ru_id]->nb_tx, + PHY_vars_UE_g[UE_id][CC_id]->frame_parms.nb_antennas_rx, map_str_to_int(small_scale_names,oai_emulation.environment_system_config.fading.small_scale.selected_option), - N_RB2sampling_rate(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL), - N_RB2channel_bandwidth(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_DL), + N_RB2sampling_rate(RC.ru[ru_id]->frame_parms.N_RB_DL), + N_RB2channel_bandwidth(RC.ru[ru_id]->frame_parms.N_RB_DL), forgetting_factor, 0, 0); - random_channel(eNB2UE[eNB_id][UE_id][CC_id],abstraction_flag); - LOG_D(OCM,"[SIM] Initializing channel (%s, %d) from UE %d to eNB %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option, - map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),UE_id, eNB_id); + random_channel(RU2UE[ru_id][UE_id][CC_id],abstraction_flag); + LOG_D(OCM,"[SIM] Initializing channel (%s, %d) from UE %d to ru %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option, + map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),UE_id, ru_id); - UE2eNB[UE_id][eNB_id][CC_id] = - new_channel_desc_scm(PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.nb_antennas_tx, - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.nb_antennas_rx, + + UE2RU[UE_id][ru_id][CC_id] = + new_channel_desc_scm(PHY_vars_UE_g[UE_id][CC_id]->frame_parms.nb_antennas_tx, + RC.ru[ru_id]->nb_rx, map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option), - N_RB2sampling_rate(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_UL), - N_RB2channel_bandwidth(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.N_RB_UL), + N_RB2sampling_rate(RC.ru[ru_id]->frame_parms.N_RB_UL), + N_RB2channel_bandwidth(RC.ru[ru_id]->frame_parms.N_RB_UL), forgetting_factor, 0, 0); - random_channel(UE2eNB[UE_id][eNB_id][CC_id],abstraction_flag); + random_channel(UE2RU[UE_id][ru_id][CC_id],abstraction_flag); // to make channel reciprocal uncomment following line instead of previous. However this only works for SISO at the moment. For MIMO the channel would need to be transposed. - //UE2eNB[UE_id][eNB_id] = eNB2UE[eNB_id][UE_id]; + //UE2RU[UE_id][ru_id] = RU2UE[ru_id][UE_id]; } } } @@ -1268,22 +1509,24 @@ void update_omg_ocm() void update_ocm() { - module_id_t UE_id, eNB_id; + module_id_t UE_id, ru_id; int CC_id; - for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) - enb_data[eNB_id]->tx_power_dBm = PHY_vars_eNB_g[eNB_id][0]->lte_frame_parms.pdsch_config_common.referenceSignalPower; - - for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) - ue_data[UE_id]->tx_power_dBm = PHY_vars_UE_g[UE_id][0]->tx_power_dBm; /* check if the openair channel model is activated used for PHY abstraction : path loss*/ if ((oai_emulation.info.ocm_enabled == 1)&& (ethernet_flag == 0 )) { + + for (ru_id = 0; ru_id < RC.nb_RU; ru_id++) + enb_data[ru_id]->tx_power_dBm = RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower; + + for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) + ue_data[UE_id]->tx_power_dBm = PHY_vars_UE_g[UE_id][0]->tx_power_dBm[0]; + //LOG_D(OMG," extracting position of eNb...\n"); //display_node_list(enb_node_list); // display_node_list(ue_node_list); - extract_position(enb_node_list, enb_data, NB_eNB_INST); + extract_position(enb_node_list, enb_data, RC.nb_RU); //extract_position_fixed_enb(enb_data, NB_eNB_INST,frame); //LOG_D(OMG," extracting position of UE...\n"); // if (oai_emulation.info.omg_model_ue == TRACE) @@ -1293,21 +1536,21 @@ void update_ocm() LOG_N(OCM,"Path loss for TTI %d : \n", frame); */ for (CC_id=0; CC_idpath_loss_dB = eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB; + calc_path_loss (enb_data[ru_id], ue_data[UE_id], RU2UE[ru_id][UE_id][CC_id], oai_emulation.environment_system_config,ShaF); + //calc_path_loss (enb_data[ru_id], ue_data[UE_id], RU2UE[ru_id][UE_id], oai_emulation.environment_system_config,0); + UE2RU[UE_id][ru_id][CC_id]->path_loss_dB = RU2UE[ru_id][UE_id][CC_id]->path_loss_dB; // if (frame % 50 == 0) - LOG_I(OCM,"Path loss (CCid %d) between eNB %d at (%f,%f) and UE %d at (%f,%f) is %f, angle %f\n", - CC_id,eNB_id,enb_data[eNB_id]->x,enb_data[eNB_id]->y,UE_id,ue_data[UE_id]->x,ue_data[UE_id]->y, - eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB, eNB2UE[eNB_id][UE_id][CC_id]->aoa); + LOG_D(OCM,"Path loss (CCid %d) between eNB %d at (%f,%f) and UE %d at (%f,%f) is %f, angle %f\n", + CC_id,ru_id,enb_data[ru_id]->x,enb_data[ru_id]->y,UE_id,ue_data[UE_id]->x,ue_data[UE_id]->y, + RU2UE[ru_id][UE_id][CC_id]->path_loss_dB, RU2UE[ru_id][UE_id][CC_id]->aoa); //double dx, dy, distance; - //dx = enb_data[eNB_id]->x - ue_data[UE_id]->x; - //dy = enb_data[eNB_id]->y - ue_data[UE_id]->y; + //dx = enb_data[ru_id]->x - ue_data[UE_id]->x; + //dy = enb_data[ru_id]->y - ue_data[UE_id]->y; //distance = sqrt(dx * dx + dy * dy); /*LOG_D(LOCALIZE, " OCM distance between eNB %d at (%f,%f) and UE %d at (%f,%f) is %f \n", - eNB_id, enb_data[eNB_id]->x,enb_data[eNB_id]->y, + ru_id, enb_data[ru_id]->x,enb_data[ru_id]->y, UE_id, ue_data[UE_id]->x,ue_data[UE_id]->y, distance);*/ } @@ -1316,26 +1559,28 @@ void update_ocm() } else { - for (CC_id=0; CC_idpath_loss_dB = -132.24 + snr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; - UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -132.24 + snr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; - } else { - eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; - UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; - } - - LOG_I(OCM,"Path loss from eNB %d to UE %d (CCid %d)=> %f dB (eNB TX %d, SNR %f)\n",eNB_id,UE_id,CC_id, - eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB, - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower,snr_dB); - // printf("[SIM] Path loss from UE %d to eNB %d => %f dB\n",UE_id,eNB_id,UE2eNB[UE_id][eNB_id]->path_loss_dB); - } + AssertFatal(RU2UE[ru_id][UE_id][CC_id]!=NULL,"RU2UE[%d][%d][%d] is null\n",ru_id,UE_id,CC_id); + AssertFatal(UE2RU[UE_id][ru_id][CC_id]!=NULL,"UE2RU[%d][%d][%d] is null\n",UE_id,ru_id,CC_id); + //pathloss: -132.24 dBm/15kHz RE + target SNR - eNB TX power per RE + if (ru_id == (UE_id % RC.nb_RU)) { + RU2UE[ru_id][UE_id][CC_id]->path_loss_dB = -132.24 + snr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower; + UE2RU[UE_id][ru_id][CC_id]->path_loss_dB = -132.24 + snr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower; + } else { + RU2UE[ru_id][UE_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower; + UE2RU[UE_id][ru_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower; + } + + LOG_D(OCM,"Path loss from eNB %d to UE %d (CCid %d)=> %f dB (eNB TX %d, SNR %f)\n",ru_id,UE_id,CC_id, + RU2UE[ru_id][UE_id][CC_id]->path_loss_dB, + RC.ru[ru_id]->frame_parms.pdsch_config_common.referenceSignalPower,snr_dB); + + } + } } - } } } @@ -1346,7 +1591,7 @@ void update_otg_eNB(module_id_t enb_module_idP, unsigned int ctime) #if defined(USER_MODE) && defined(OAI_EMU) //int rrc_state=0; - +/* if (oai_emulation.info.otg_enabled ==1 ) { int dst_id, app_id; @@ -1356,15 +1601,14 @@ void update_otg_eNB(module_id_t enb_module_idP, unsigned int ctime) for_times += 1; // generate traffic if the ue is rrc reconfigured state - //if ((rrc_state=mac_eNB_get_rrc_status(enb_module_idP, dst_id)) > 2 /*RRC_CONNECTED*/ ) { - if (mac_eNB_get_rrc_status(enb_module_idP, oai_emulation.info.eNB_ue_module_id_to_rnti[enb_module_idP][dst_id]) > 2 ){ - + //if ((rrc_state=mac_eNB_get_rrc_status(enb_module_idP, dst_id)) > 2 //RRC_CONNECTED + { + if (mac_eNB_get_rrc_status(enb_module_idP, oai_emulation.info.eNB_ue_module_id_to_rnti[enb_module_idP][dst_id]) > 2 ){ if_times += 1; - + for (app_id=0; app_idotg_pkt).sdu_buffer = (uint8_t*) packet_gen(enb_module_idP, dst_id + NB_eNB_INST, app_id, ctime, &((otg_pkt->otg_pkt).sdu_buffer_size)); if ((otg_pkt->otg_pkt).sdu_buffer != NULL) { @@ -1376,7 +1620,7 @@ void update_otg_eNB(module_id_t enb_module_idP, unsigned int ctime) (otg_pkt->otg_pkt).mode = PDCP_TRANSMISSION_MODE_DATA; //Adding the packet to the OTG-PDCP buffer pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[enb_module_idP])); - LOG_I(EMU,"[eNB %d] ADD pkt to OTG buffer with size %d for dst %d on rb_id %d for app id %d \n", + LOG_D(EMU,"[eNB %d] ADD pkt to OTG buffer with size %d for dst %d on rb_id %d for app id %d \n", (otg_pkt->otg_pkt).module_id, otg_pkt->otg_pkt.sdu_buffer_size, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id, app_id); } else { free(otg_pkt); @@ -1386,7 +1630,7 @@ void update_otg_eNB(module_id_t enb_module_idP, unsigned int ctime) } } -#ifdef Rel10 +#if defined(Rel10) || defined(Rel14) mbms_service_id_t service_id; mbms_session_id_t session_id; rb_id_t rb_id; @@ -1410,7 +1654,7 @@ void update_otg_eNB(module_id_t enb_module_idP, unsigned int ctime) //Adding the packet to the OTG-PDCP buffer (otg_pkt->otg_pkt).mode = PDCP_TRANSMISSION_MODE_TRANSPARENT; pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[enb_module_idP])); - LOG_I(EMU, "[eNB %d] ADD packet (%p) multicast to OTG buffer for dst %d on rb_id %d\n", + LOG_D(EMU, "[eNB %d] ADD packet (%p) multicast to OTG buffer for dst %d on rb_id %d\n", (otg_pkt->otg_pkt).module_id, otg_pkt, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id); } else { //LOG_I(EMU, "OTG returns null \n"); @@ -1418,10 +1662,10 @@ void update_otg_eNB(module_id_t enb_module_idP, unsigned int ctime) otg_pkt=NULL; } - +*/ // old version /* // MBSM multicast traffic - #ifdef Rel10 + #if defined(Rel10) || defined(Rel14) if (frame >= 46) {// only generate when UE can receive MTCH (need to control this value) for (service_id = 0; service_id < 2 ; service_id++) { //maxServiceCount for (session_id = 0; session_id < 2; session_id++) { // maxSessionPerPMCH @@ -1444,13 +1688,14 @@ void update_otg_eNB(module_id_t enb_module_idP, unsigned int ctime) } // end multicast traffic #endif */ - +/* } } } } // end multicast traffic +*/ #endif } @@ -1473,7 +1718,7 @@ void update_otg_eNB(module_id_t enb_module_idP, unsigned int ctime) (otg_pkt->otg_pkt).mode = PDCP_TRANSMISSION_MODE_DATA; //Adding the packet to the OTG-PDCP buffer pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[module_idP])); - LOG_I(EMU, "[eNB %d] ADD pkt to OTG buffer for dst %d on rb_id %d\n", (otg_pkt->otg_pkt).module_id, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id); + LOG_D(EMU, "[eNB %d] ADD pkt to OTG buffer for dst %d on rb_id %d\n", (otg_pkt->otg_pkt).module_id, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id); } else { //LOG_I(EMU, "OTG returns null \n"); free(otg_pkt); @@ -1482,54 +1727,11 @@ void update_otg_eNB(module_id_t enb_module_idP, unsigned int ctime) } } } - -#endif #endif } void update_otg_UE(module_id_t ue_mod_idP, unsigned int ctime) { -#if defined(USER_MODE) && defined(OAI_EMU) - - if (oai_emulation.info.otg_enabled ==1 ) { - module_id_t dst_id, src_id; //dst_id = eNB_index - module_id_t module_id = ue_mod_idP+NB_eNB_INST; - - src_id = module_id; - - for (dst_id=0; dst_id 2 /*RRC_CONNECTED*/) { - Packet_otg_elt_t *otg_pkt = malloc (sizeof(Packet_otg_elt_t)); - - if (otg_pkt!=NULL) - memset(otg_pkt,0,sizeof(Packet_otg_elt_t)); - else { - LOG_E(OTG,"not enough memory\n"); - exit(-1); - }// Manage to add this packet to the tail of your list - - (otg_pkt->otg_pkt).sdu_buffer = (uint8_t*) packet_gen(src_id, dst_id, 0, ctime, &((otg_pkt->otg_pkt).sdu_buffer_size)); - - if ((otg_pkt->otg_pkt).sdu_buffer != NULL) { - (otg_pkt->otg_pkt).rb_id = DTCH-2; - (otg_pkt->otg_pkt).module_id = module_id; - (otg_pkt->otg_pkt).dst_id = dst_id; - (otg_pkt->otg_pkt).is_ue = 1; - //Adding the packet to the OTG-PDCP buffer - (otg_pkt->otg_pkt).mode = PDCP_TRANSMISSION_MODE_DATA; - pkt_list_add_tail_eurecom(otg_pkt, &(otg_pdcp_buffer[module_id])); - LOG_I(EMU, "[UE %d] ADD pkt to OTG buffer with size %d for dst %d on rb_id %d \n", - (otg_pkt->otg_pkt).module_id, otg_pkt->otg_pkt.sdu_buffer_size, (otg_pkt->otg_pkt).dst_id,(otg_pkt->otg_pkt).rb_id); - } else { - free(otg_pkt); - otg_pkt=NULL; - } - } - } - } - -#endif } #endif @@ -1600,3 +1802,23 @@ void init_time() td_avg = TARGET_SF_TIME_NS; } +// dummy function +int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind) { + + return(0); + +} + +/* +int openair0_transport_load(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t * eth_params) { + + return(0); + + +} + +int openair0_device_load(openair0_device *device, openair0_config_t *openair0_cfg) { + + return(0); +} +*/ diff --git a/targets/SIMU/USER/oaisim_functions.h b/targets/SIMU/USER/oaisim_functions.h index 346e95eaf8..8bbf90df36 100644 --- a/targets/SIMU/USER/oaisim_functions.h +++ b/targets/SIMU/USER/oaisim_functions.h @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include "oaisim.h" #include diff --git a/targets/SIMU/USER/oaisim_pad.c b/targets/SIMU/USER/oaisim_pad.c index b54709b925..1f251de581 100644 --- a/targets/SIMU/USER/oaisim_pad.c +++ b/targets/SIMU/USER/oaisim_pad.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -867,13 +859,13 @@ void run(int argc, char *argv[]) && (abstraction_flag == 0) && (oai_emulation.info.n_frames == 1)) { write_output ("dlchan0.m", "dlch0", - &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]), + &(PHY_vars_UE_g[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[0][0][0]), (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); write_output ("dlchan1.m", "dlch1", - &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[1][0][0]), + &(PHY_vars_UE_g[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[1][0][0]), (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); write_output ("dlchan2.m", "dlch2", - &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[2][0][0]), + &(PHY_vars_UE_g[0]->lte_ue_common_vars.common_vars_rx_data_per_thread[subframe&0x1].dl_ch_estimates[2][0][0]), (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1); write_output ("pbch_rxF_comp0.m", "pbch_comp0", PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_comp[0], 6 * 12 * 4, 1, 1); diff --git a/targets/SIMU/USER/phy_procedures_sim_form.c b/targets/SIMU/USER/phy_procedures_sim_form.c index 5dd422599b..bfc769413a 100644 --- a/targets/SIMU/USER/phy_procedures_sim_form.c +++ b/targets/SIMU/USER/phy_procedures_sim_form.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* Form definition file generated with fdesign. */ #include diff --git a/targets/SIMU/USER/phy_procedures_sim_form.h b/targets/SIMU/USER/phy_procedures_sim_form.h index 4d66a9121b..df8f846f96 100644 --- a/targets/SIMU/USER/phy_procedures_sim_form.h +++ b/targets/SIMU/USER/phy_procedures_sim_form.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /** Header file generated with fdesign on Tue Jul 27 16:31:42 2010.**/ #ifndef FD_phy_procedures_sim_h_ diff --git a/targets/SIMU/USER/sinr_sim.c b/targets/SIMU/USER/sinr_sim.c index b235e16585..7c752ce432 100644 --- a/targets/SIMU/USER/sinr_sim.c +++ b/targets/SIMU/USER/sinr_sim.c @@ -1,31 +1,23 @@ -/******************************************************************************* - OpenAirInterface - Copyright(c) 1999 - 2014 Eurecom - - OpenAirInterface 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 3 of the License, or - (at your option) any later version. - - - OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is - included in this distribution in the file called "COPYING". If not, - see . - - Contact Information - OpenAirInterface Admin: openair_admin@eurecom.fr - OpenAirInterface Tech : openair_tech@eurecom.fr - OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - - Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - - *******************************************************************************/ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ #include #include @@ -379,7 +371,7 @@ void init_snr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_dat break; default: - msg("Problem in SINR Calculation for TM5 \n"); + LOG_E(EMU,"Problem in SINR Calculation for TM5 \n"); break; }//switch(q) @@ -459,7 +451,7 @@ void init_snr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_dat break; default: - msg("Problem in SINR Calculation for TM6 \n"); + LOG_E(EMU,"Problem in SINR Calculation for TM6 \n"); break; }//switch(q) @@ -478,75 +470,11 @@ void init_snr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_dat break; default: - msg("Problem in SINR Initialization in sinr_sim.c\n"); + LOG_E(EMU,"Problem in SINR Initialization in sinr_sim.c\n"); break; }//switch }//function ends -#ifdef PHY_ABSTRACTION_UL -void init_snr_up(channel_desc_t* UE2eNB, node_desc_t *enb_data, node_desc_t *ue_data, double* sinr_dB, double* N0,uint16_t nb_rb,uint16_t fr_rb) -{ - - int return_value; - double thermal_noise; - int count; - int aarx; - - // nb_rb = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb; - /* Thermal noise is calculated using 10log10(K*T*B) K = Boltzmann's constant T = room temperature B = bandwidth */ - thermal_noise = -174 + 10*log10(UE2eNB->sampling_rate*1e6); //value in dBm - *N0 = thermal_noise + enb_data->rx_noise_level;//? all the element have the same noise level????? - double lambda ; - double residual; - double sinrlin; - double residual_db; - residual = 0 ; - int ccc; - /* - for (count = (fr_rb*12) ; count < (12 * (fr_rb+nb_rb)); count++) - { - residual += ( 1 / ( pow((UE2eNB -> chF[0][count].x),2) + pow((UE2eNB -> chF[0][count].y),2))); - } - *///sinreff(nn) = ((sum((1/p).*(snrm(nn,:)./(snrm(nn,:)+1)),2).^(-1) )-1).^-1; - - sinrlin = 0 ; - lambda = 0; - - ////First calculate SINRs of subcarriers just like OFDM - for (count = (fr_rb*12) ; count < (12 * (fr_rb+nb_rb)); count++) { - sinr_dB[count] = ue_data->tx_power_dBm - + UE2eNB->path_loss_dB - - (thermal_noise + enb_data->rx_noise_level) - + 10 * log10 (pow(UE2eNB->chF[0][count].x, 2) - + pow(UE2eNB->chF[0][count].y, 2)); - - - } - - //Then apply formula : - if(nb_rb > 0) { - //calculate lambdas and fill the same with all but just use one of them when necessary for abstraction - for (count = fr_rb*12; count < (12 * (fr_rb+nb_rb)); count++) { - sinrlin = pow((sinr_dB[count]/10),10); // convert SINR to linear - lambda += (sinrlin / (sinrlin + 1)) ; - } - - for (count = fr_rb*12; count < (12 * (fr_rb+nb_rb)); count++) { - sinr_dB[count] = pow(lambda,2) /(((nb_rb)*lambda)-pow(lambda,2)) ; - sinr_dB[count] = 10*log10(sinr_dB[count]) ; //save it in db - } - - printf("tx_power %g, path_loss %g, sinr_dB[0] %g\n",ue_data->tx_power_dBm ,UE2eNB->path_loss_dB,sinr_dB[count-1]); - - for (ccc = 0; ccc < 301 ; ccc++ ) { - SINRpost_eff[ccc] = 0; - SINRpost_eff[ccc] = sinr_dB[ccc]; - } - } -}//function ends - -#endif - void calculate_sinr(channel_desc_t* eNB2UE, node_desc_t *enb_data, node_desc_t *ue_data, double *sinr_dB, uint16_t nb_rb) { @@ -734,7 +662,7 @@ void get_MIESM_param() break; default: - msg("Error, bad input, quitting\n"); + LOG_E(EMU,"Error, bad input, quitting\n"); break; } @@ -745,60 +673,7 @@ void get_MIESM_param() free(file_path); } -#ifdef PHY_ABSTRACTION_UL -void get_beta_map_up() -{ - char *file_path = NULL; - int table_len = 0; - int mcs = 0; - char *sinr_bler; - char buffer[1000]; - FILE *fp; - file_path = (char*) malloc(512); - - for (mcs = 0; mcs < MCS_COUNT; mcs++) { - sprintf(file_path,"%s/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/awgn_abst/awgn_snr_bler_mcs%d_up.csv",getenv("OPENAIR1_DIR"),mcs); - fp = fopen(file_path,"r"); - - if (fp == NULL) { - LOG_W(OCM,"ERROR: Unable to open the file %s, try an alternative path\n", file_path); - memset(file_path, 0, 512); - sprintf(file_path,"AWGN/awgn_snr_bler_mcs%d.csv",mcs); - LOG_I(OCM,"Opening the alternative path %s\n", file_path); - fp = fopen(file_path,"r"); - - if (fp == NULL) { - LOG_E(OCM,"ERROR: Unable to open the file %s, exisitng\n", file_path); - exit(-1); - } - } - - // else { - fgets(buffer, 1000, fp); - table_len=0; - - while (!feof(fp)) { - sinr_bler = strtok(buffer, ","); - sinr_bler_map_up[mcs][0][table_len] = atof(sinr_bler); - sinr_bler = strtok(NULL,","); - sinr_bler_map_up[mcs][1][table_len] = atof(sinr_bler); - table_len++; - fgets(buffer, 1000, fp); - } - - fclose(fp); - // } - LOG_D(OCM,"Print the table for mcs %d\n",mcs); - - for (table_len = 0; table_len < 16; table_len++) - LOG_D(OCM,"%lf %lf \n ",sinr_bler_map_up[mcs][0][table_len],sinr_bler_map_up[mcs][1][table_len]); - } - - free(file_path); -} - -#endif diff --git a/targets/TEST/AT_COMMANDS/Makefile b/targets/TEST/AT_COMMANDS/Makefile index 2939b30c01..fc5f550329 100755 --- a/targets/TEST/AT_COMMANDS/Makefile +++ b/targets/TEST/AT_COMMANDS/Makefile @@ -6,7 +6,7 @@ OPENAIR2_TOP = $(OPENAIR2_DIR) OPENAIR3_TOP = $(OPENAIR3_DIR) OPENAIR3 = $(OPENAIR3_DIR) -CFLAGS += -m32 -DPHYSIM -DNODE_RG -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 +CFLAGS += -m32 -DPHYSIM -DNODE_RG -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES @@ -23,8 +23,6 @@ ifdef PDCP_USE_NETLINK CFLAGS += -DPDCP_USE_NETLINK -DLINUX -DDEBUG_CONTROL endif -CFLAGS += -DPHY_ABSTRACTION #-DEMIT_ASN_DEBUG=1 - #include $(OPENAIR1_DIR)/PHY/Makefile.inc #include $(OPENAIR1_DIR)/SCHED/Makefile.inc diff --git a/targets/TEST/AT_COMMANDS/oaisim.c b/targets/TEST/AT_COMMANDS/oaisim.c old mode 100755 new mode 100644 index 88f31a5481..4420d583e3 --- a/targets/TEST/AT_COMMANDS/oaisim.c +++ b/targets/TEST/AT_COMMANDS/oaisim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/TEST/OAI/case01.py b/targets/TEST/OAI/case01.py index f2211bf6ac..9595f7e35d 100644 --- a/targets/TEST/OAI/case01.py +++ b/targets/TEST/OAI/case01.py @@ -1,32 +1,23 @@ -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -#*******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case01.py # \brief test case 01 for OAI: compilations @@ -255,7 +246,7 @@ def execute(oai, user, pw, host, logfile,logdir,debug,timeout): log.start() test = '14' name = 'Compile oai.rel8.itti.ral.make' - conf = 'make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel8=1' + conf = 'make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel8=1' trace = logdir + '/log_' + case + test + '.txt;' tee = ' 2>&1 | tee ' + trace diag = 'check the compilation errors for ITTI Rel8' @@ -263,7 +254,7 @@ def execute(oai, user, pw, host, logfile,logdir,debug,timeout): oai.send('make cleanall;') oai.send('make cleanasn1;') oai.send('rm -f ./oaisim.rel8.itti.ral.'+host) - oai.send_expect_false('make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel8=1 -j4' + tee, makerr1, timeout) + oai.send_expect_false('make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel8=1 -j4' + tee, makerr1, timeout) oai.send('cp ./oaisim ./oaisim.rel8.itti.ral.'+host) except log.err, e: log.fail(case, test, name, conf, e.value, diag, logfile,trace) @@ -274,7 +265,7 @@ def execute(oai, user, pw, host, logfile,logdir,debug,timeout): log.start() test = '15' name = 'Compile oai.rel10.itti.ral.make' - conf = 'make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel10=1' + conf = 'make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel10=1' trace = logdir + '/log_' + case + test + '.txt;' tee = ' 2>&1 | tee ' + trace diag = 'check the compilation errors for ITTI Rel10' @@ -282,7 +273,7 @@ def execute(oai, user, pw, host, logfile,logdir,debug,timeout): oai.send('make cleanall;') oai.send('make cleanasn1;') oai.send('rm -f ./oaisim.rel10.itti.ral.'+host) - oai.send_expect_false('make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 USER_MODE=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel10=1 -j4' + tee, makerr1, timeout) + oai.send_expect_false('make DISABLE_XER_PRINT=1 LINK_ENB_PDCP_TO_IP_DRIVER=1 OAI_NW_DRIVER_TYPE_ETHERNET=1 ENABLE_ITTI=1 OPENAIR2=1 ENABLE_RAL=1 MIH_C_MEDIEVAL_EXTENSIONS=1 RLC_STOP_ON_LOST_PDU=1 Rel10=1 -j4' + tee, makerr1, timeout) oai.send('cp ./oaisim ./oaisim.rel10.itti.ral.'+host) except log.err, e: log.fail(case, test, name, conf, e.value, diag, logfile,trace) diff --git a/targets/TEST/OAI/case02.py b/targets/TEST/OAI/case02.py index e3a4849901..741c96cd76 100644 --- a/targets/TEST/OAI/case02.py +++ b/targets/TEST/OAI/case02.py @@ -1,32 +1,23 @@ -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -#*******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case02.py # \brief test case 02 for OAI: executions diff --git a/targets/TEST/OAI/case03.py b/targets/TEST/OAI/case03.py index ece67bcba0..e2a783e3ea 100644 --- a/targets/TEST/OAI/case03.py +++ b/targets/TEST/OAI/case03.py @@ -1,32 +1,23 @@ -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -#*******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case03.py # \brief test case 03 for OAI: executions diff --git a/targets/TEST/OAI/case04.py b/targets/TEST/OAI/case04.py index 857190313d..eb77f72297 100644 --- a/targets/TEST/OAI/case04.py +++ b/targets/TEST/OAI/case04.py @@ -1,32 +1,23 @@ -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -#*******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case04.py # \brief test case 04 for OAI: executions diff --git a/targets/TEST/OAI/case05.py b/targets/TEST/OAI/case05.py index c73ae969eb..4f03368721 100644 --- a/targets/TEST/OAI/case05.py +++ b/targets/TEST/OAI/case05.py @@ -1,32 +1,23 @@ -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -#*******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case05.py # \brief test case 05 for OAI: executions diff --git a/targets/TEST/OAI/case11.py b/targets/TEST/OAI/case11.py index 0748fd1703..9a74a1637e 100644 --- a/targets/TEST/OAI/case11.py +++ b/targets/TEST/OAI/case11.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case01.py # \brief test case 01 for OAI: compilations diff --git a/targets/TEST/OAI/case12.py b/targets/TEST/OAI/case12.py index cc46dbc2a3..baa6a73367 100644 --- a/targets/TEST/OAI/case12.py +++ b/targets/TEST/OAI/case12.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case02.py # \brief test case 02 for OAI: executions diff --git a/targets/TEST/OAI/case13.py b/targets/TEST/OAI/case13.py index 2148ddb52f..d6fcca1bc5 100644 --- a/targets/TEST/OAI/case13.py +++ b/targets/TEST/OAI/case13.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file case02.py # \brief test case 02 for OAI: executions diff --git a/targets/TEST/OAI/core.py b/targets/TEST/OAI/core.py index 31c920ecc4..acdd6c830c 100644 --- a/targets/TEST/OAI/core.py +++ b/targets/TEST/OAI/core.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file core.py # \brief OAI core testing class that provides various primitives to send/recv cmd to openair class searching for patterns and process the responses and tag the test case as passed/failed/skipped diff --git a/targets/TEST/OAI/log.py b/targets/TEST/OAI/log.py index 0b4baff3e9..5a97b19cf2 100644 --- a/targets/TEST/OAI/log.py +++ b/targets/TEST/OAI/log.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file log.py # \brief provides primitives and defines how the logs and statistics are generated diff --git a/targets/TEST/OAI/openair.py b/targets/TEST/OAI/openair.py index a40018d065..e03188c11d 100644 --- a/targets/TEST/OAI/openair.py +++ b/targets/TEST/OAI/openair.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file openair.py # \brief class that define the oaisim class and its attributes diff --git a/targets/TEST/OAI/test01.py b/targets/TEST/OAI/test01.py index c382dd5c71..d923a8e27e 100644 --- a/targets/TEST/OAI/test01.py +++ b/targets/TEST/OAI/test01.py @@ -1,33 +1,24 @@ #! /usr/bin/python -#****************************************************************************** - -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom - -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. - - -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . - -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr - -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE - -# *******************************************************************************/ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file test01.py # \brief test 01 for OAI diff --git a/targets/TEST/OAI/test02.py b/targets/TEST/OAI/test02.py index 037d48cf98..c0c94b7d23 100644 --- a/targets/TEST/OAI/test02.py +++ b/targets/TEST/OAI/test02.py @@ -1,31 +1,23 @@ -#****************************************************************************** - -# Eurecom OpenAirInterface -# Copyright(c) 1999 - 2013 Eurecom - -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. - -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -# The full GNU General Public License is included in this distribution in -# the file called "COPYING". - -# Contact Information -# Openair Admin: openair_admin@eurecom.fr -# Openair Tech : openair_tech@eurecom.fr -# Forums : http://forums.eurecom.fsr/openairinterface -# Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France - -#***************************************************************************** +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ # \file test01.py # \brief test 02 for OAI: downlink and uplink performance and profiler diff --git a/targets/TEST/PACKET_TRACER/Makefile b/targets/TEST/PACKET_TRACER/Makefile index 46fa86037c..e7a4e70bf9 100755 --- a/targets/TEST/PACKET_TRACER/Makefile +++ b/targets/TEST/PACKET_TRACER/Makefile @@ -6,21 +6,17 @@ OPENAIR2_TOP = $(OPENAIR2_DIR) OPENAIR3_TOP = $(OPENAIR3_DIR) OPENAIR3 = $(OPENAIR3_DIR) -CFLAGS += -m32 -DPHYSIM -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11 +CFLAGS += -m32 -DPHYSIM -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11 ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES -CFLAGS += -DOPENAIR_LTE -DPUCCH #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE -CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 -DPHY_ABSTRACTION -DOAI_EMU +CFLAGS += -DOPENAIR_LTE #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE +CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 CFLAGS += -DEMIT_ASN_DEBUG=1 ifndef OPENAIR2 OPENAIR2=1 endif -ifndef OPENAIR_EMU -export OPENAIR_EMU=1 -endif - # activate OCG and libxml only under linux ifeq ($(linux),1) CFLAGS += -I/usr/include/libxml2 -L/usr/local/lib -I/usr/include/atlas -L/usr/X11R6/lib @@ -61,8 +57,6 @@ ifdef TRAFFIC_TM5 CFLAGS += -DRLC_UM_TEST_TRAFFIC=1 -DFULL_BUFFER=1 endif -CFLAGS += -DOAI_EMU - include $(OPENAIR1_DIR)/PHY/Makefile.inc include $(OPENAIR1_DIR)/SCHED/Makefile.inc include $(OPENAIR2_DIR)/LAYER2/Makefile.inc diff --git a/targets/TEST/PACKET_TRACER/pt.c b/targets/TEST/PACKET_TRACER/pt.c index c94c326e22..9e4077e274 100644 --- a/targets/TEST/PACKET_TRACER/pt.c +++ b/targets/TEST/PACKET_TRACER/pt.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/TEST/PDCP/Makefile b/targets/TEST/PDCP/Makefile index 66af847af5..805cabe7cb 100755 --- a/targets/TEST/PDCP/Makefile +++ b/targets/TEST/PDCP/Makefile @@ -8,7 +8,7 @@ OPENAIR3 = $(OPENAIR3_DIR) EXE_FILE_NAME = test_pdcp -CFLAGS += -m32 -DPHYSIM -DNODE_RG -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 +CFLAGS += -m32 -DPHYSIM -DNODE_RG -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES @@ -25,8 +25,6 @@ ifdef PDCP_USE_NETLINK CFLAGS += -DPDCP_USE_NETLINK -DLINUX -DDEBUG_CONTROL endif -CFLAGS += -DPHY_ABSTRACTION #-DEMIT_ASN_DEBUG=1 - #include $(OPENAIR1_DIR)/PHY/Makefile.inc #include $(OPENAIR1_DIR)/SCHED/Makefile.inc diff --git a/targets/TEST/PDCP/readme.txt b/targets/TEST/PDCP/readme.txt index 7109ff9772..6e4f3eb054 100644 --- a/targets/TEST/PDCP/readme.txt +++ b/targets/TEST/PDCP/readme.txt @@ -1,31 +1,24 @@ -/******************************************************************************* +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ - OPENAIRINTERFACE 0/1/2/3 - Copyright(c) 1999 - 2011 EURECOM - - This program is free software; you can redistribute it and/or modify it - under the terms and conditions of the GNU General Public License, - version 2, as published by the Free Software Foundation. - - This program is distributed in the hope 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., - 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - - The full GNU General Public License is included in this distribution in - the file called "COPYING". - - Contact Information: - Openair Admin - Mailing List - Forums http://forums.eurecom.fr/openairinterface - Eurecom, 2229, route des cretes, 06560 Valbonne Sophia Antipolis, France - -*******************************************************************************/ /*________________________OEPNAIR/OPENAIR0/________________________ File : readme.txt diff --git a/targets/TEST/PDCP/test_pdcp.c b/targets/TEST/PDCP/test_pdcp.c old mode 100755 new mode 100644 index bce5cd31a9..b07add73a6 --- a/targets/TEST/PDCP/test_pdcp.c +++ b/targets/TEST/PDCP/test_pdcp.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * PDCP test code * diff --git a/targets/TEST/PDCP/test_pdcp.h b/targets/TEST/PDCP/test_pdcp.h index ce3004a8a3..0da174cc8c 100644 --- a/targets/TEST/PDCP/test_pdcp.h +++ b/targets/TEST/PDCP/test_pdcp.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * PDCP test code * diff --git a/targets/TEST/PDCP/test_util.h b/targets/TEST/PDCP/test_util.h index 470aa94038..834a955abf 100644 --- a/targets/TEST/PDCP/test_util.h +++ b/targets/TEST/PDCP/test_util.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + /* * Helper methods for PDCP test code diff --git a/targets/TEST/PDCP/with_rlc/Makefile.data_bearer b/targets/TEST/PDCP/with_rlc/Makefile.data_bearer index 00f07c1b92..d1397d3f49 100755 --- a/targets/TEST/PDCP/with_rlc/Makefile.data_bearer +++ b/targets/TEST/PDCP/with_rlc/Makefile.data_bearer @@ -8,7 +8,7 @@ OPENAIR3 = $(OPENAIR3_DIR) EXE_FILE_NAME = test_pdcp_rlc -CFLAGS += -m32 -DPHYSIM -DNODE_RG -DUSER_MODE -DPC_TARGET -DPC_DSP -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 +CFLAGS += -m32 -DPHYSIM -DNODE_RG -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DMAX_MODULES=1 -I/usr/include/X11 ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES @@ -25,8 +25,6 @@ ifdef PDCP_USE_NETLINK CFLAGS += -DPDCP_USE_NETLINK -DLINUX -DDEBUG_CONTROL endif -CFLAGS += -DPHY_ABSTRACTION #-DEMIT_ASN_DEBUG=1 - #include $(OPENAIR1_DIR)/PHY/Makefile.inc #include $(OPENAIR1_DIR)/SCHED/Makefile.inc diff --git a/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c b/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c old mode 100755 new mode 100644 index b894d7f11c..1cadea3715 --- a/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c +++ b/targets/TEST/PDCP/with_rlc/test_pdcp_rlc.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #define PDCP_C #include #include @@ -111,7 +132,7 @@ void pdcp_rlc_test_mac_rlc_loop (struct mac_data_ind *data_indP, struct mac_dat *tx_packetsP = *tx_packetsP + 1; if (*drop_countP == 0) { - tb_dst = get_free_mem_block(sizeof (mac_rlc_max_rx_header_size_t) + tb_size); + tb_dst = get_free_mem_block(sizeof (mac_rlc_max_rx_header_size_t) + tb_size, __func__); if (tb_dst != NULL) { ((struct mac_tb_ind *) (tb_dst->data))->first_bit = 0; @@ -135,7 +156,7 @@ void pdcp_rlc_test_mac_rlc_loop (struct mac_data_ind *data_indP, struct mac_dat *dropped_tx_packetsP = *dropped_tx_packetsP + 1; } - free_mem_block(tb_src); + free_mem_block(tb_src, __func__); if (data_indP->no_tb > 0) { printf("[RLC-LOOP] Exchange %d TBs\n",data_indP->no_tb); @@ -167,9 +188,9 @@ void pdcp_rlc_test_exchange_pdus(rlc_um_entity_t *um_txP, memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp)); memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp)); - mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, bytes_txP, tx_status); + mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, bytes_txP, tx_status, ENB_FLAG_YES); data_request_tx = rlc_um_mac_data_request(um_txP); - mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, bytes_rxP, tx_status); + mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, bytes_rxP, tx_status, ENB_FLAG_YES); data_request_rx = rlc_um_mac_data_request(um_rxP); diff --git a/targets/TEST/RLC_AM_V9.3.0/Makefile b/targets/TEST/RLC_AM_V9.3.0/Makefile index 9c807cd826..8884d7b667 100755 --- a/targets/TEST/RLC_AM_V9.3.0/Makefile +++ b/targets/TEST/RLC_AM_V9.3.0/Makefile @@ -8,27 +8,18 @@ OPENAIR2_TOP = $(OPENAIR2_DIR) OPENAIR3_TOP = $(OPENAIR3_DIR) OPENAIR3 = $(OPENAIR3_DIR) -CFLAGS += -m32 -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11 +CFLAGS += -m32 -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11 ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES -CFLAGS += -DOPENAIR_LTE -DPUCCH #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE -CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 -DPHY_ABSTRACTION #-DPHY_ABSTRACTION_UL #-DRLC_UM_TEST_TRAFFIC=1 -CFLAGS += -DNEW_FFT +CFLAGS += -DOPENAIR_LTE #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE +CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 #-DRLC_UM_TEST_TRAFFIC=1 #CFLAGS += -DLLR8 ifndef OPENAIR2 OPENAIR2=1 endif -ifndef OPENAIR_EMU -export OPENAIR_EMU=1 -endif - -ifdef EMOS -CFLAGS+=-DEMOS -endif - ifdef TRAFFIC_TM5 CFLAGS += -DRLC_UM_TEST_TRAFFIC=1 #-DFULL_BUFFER=1 endif @@ -114,7 +105,7 @@ endif CFLAGS += $(shell if [ `uname -o` = "Cygwin" ] ; then echo "-DCYGWIN" ;fi) -CFLAGS += -DENABLE_FXP -DOAI_EMU -DENABLE_USE_CPU_EXECUTION_TIME +CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME ifneq ($(USE_MME), R8) UPDATE_RELEASE_9=1 diff --git a/targets/TEST/RLC_AM_V9.3.0/oaisim.c b/targets/TEST/RLC_AM_V9.3.0/oaisim.c old mode 100755 new mode 100644 index 0ca46b291a..dda91f0b1f --- a/targets/TEST/RLC_AM_V9.3.0/oaisim.c +++ b/targets/TEST/RLC_AM_V9.3.0/oaisim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/TEST/RLC_UM_V9.3.0/Makefile b/targets/TEST/RLC_UM_V9.3.0/Makefile index b01ea156f4..919def5f1e 100755 --- a/targets/TEST/RLC_UM_V9.3.0/Makefile +++ b/targets/TEST/RLC_UM_V9.3.0/Makefile @@ -8,27 +8,18 @@ OPENAIR2_TOP = $(OPENAIR2_DIR) OPENAIR3_TOP = $(OPENAIR3_DIR) OPENAIR3 = $(OPENAIR3_DIR) -CFLAGS += -m32 -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11 +CFLAGS += -m32 -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -I/usr/include/X11 ASN1_MSG_INC = $(OPENAIR2_DIR)/RRC/LITE/MESSAGES -CFLAGS += -DOPENAIR_LTE -DPUCCH #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE -CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 -DPHY_ABSTRACTION #-DPHY_ABSTRACTION_UL #-DRLC_UM_TEST_TRAFFIC=1 -CFLAGS += -DNEW_FFT +CFLAGS += -DOPENAIR_LTE #-DOFDMA_ULSCH -DIFFT_FPGA -DIFFT_FPGA_UE +CFLAGS += -DMAC_CONTEXT=1 -DPHY_CONTEXT=1 #-DRLC_UM_TEST_TRAFFIC=1 #CFLAGS += -DLLR8 ifndef OPENAIR2 OPENAIR2=1 endif -ifndef OPENAIR_EMU -export OPENAIR_EMU=1 -endif - -ifdef EMOS -CFLAGS+=-DEMOS -endif - ifdef TRAFFIC_TM5 CFLAGS += -DRLC_UM_TEST_TRAFFIC=1 #-DFULL_BUFFER=1 endif @@ -109,7 +100,7 @@ ifdef OAI_NW_DRIVER_TYPE_ETHERNET CFLAGS+=-DOAI_NW_DRIVER_TYPE_ETHERNET endif -CFLAGS += -DENABLE_FXP -DOAI_EMU -DENABLE_USE_CPU_EXECUTION_TIME +CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME ifneq ($(USE_MME), R8) UPDATE_RELEASE_9=1 diff --git a/targets/TEST/RLC_UM_V9.3.0/oaisim.c b/targets/TEST/RLC_UM_V9.3.0/oaisim.c old mode 100755 new mode 100644 index af0aad8aa9..e1fce26a6f --- a/targets/TEST/RLC_UM_V9.3.0/oaisim.c +++ b/targets/TEST/RLC_UM_V9.3.0/oaisim.c @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/TEST/ROHDE_SCHWARZ/EthernetRawCommand.cpp b/targets/TEST/ROHDE_SCHWARZ/EthernetRawCommand.cpp index b211ab0bce..110d499e06 100644 --- a/targets/TEST/ROHDE_SCHWARZ/EthernetRawCommand.cpp +++ b/targets/TEST/ROHDE_SCHWARZ/EthernetRawCommand.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include "TcpClient.h" diff --git a/targets/TEST/ROHDE_SCHWARZ/TcpClient.cpp b/targets/TEST/ROHDE_SCHWARZ/TcpClient.cpp index 812b310221..70b4ad1f98 100644 --- a/targets/TEST/ROHDE_SCHWARZ/TcpClient.cpp +++ b/targets/TEST/ROHDE_SCHWARZ/TcpClient.cpp @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include #include #include diff --git a/targets/TEST/ROHDE_SCHWARZ/TcpClient.h b/targets/TEST/ROHDE_SCHWARZ/TcpClient.h index 3d064e86ba..c53ff446c1 100644 --- a/targets/TEST/ROHDE_SCHWARZ/TcpClient.h +++ b/targets/TEST/ROHDE_SCHWARZ/TcpClient.h @@ -1,3 +1,24 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + #include //defines structs for socket handling diff --git a/targets/build_helper.bash b/targets/build_helper.bash index bc5cd3fbed..a3c57b8dce 100755 --- a/targets/build_helper.bash +++ b/targets/build_helper.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) any later version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file build_helper.bash # brief @@ -859,8 +852,8 @@ compile_nas_tools() { fi echo_success "make --directory=$OPENAIR3_DIR/NAS/EURECOM-NAS/tools all" make --directory=$OPENAIR3_DIR/NAS/EURECOM-NAS/tools all - rm .ue.nvram - rm .usim.nvram + rm .ue.nvram0 + rm .usim.nvram0 touch /tmp/nas_cleaned } @@ -1034,13 +1027,13 @@ install_oaisim() { install_nas_tools() { cd $OPENAIR_TARGETS/bin - if [ ! -f .ue.nvram ]; then - echo_success "generate .ue_emm.nvram .ue.nvram" + if [ ! -f .ue.nvram0 ]; then + echo_success "generate .ue_emm.nvram0 .ue.nvram0" $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/ue_data --gen fi - if [ ! -f .usim.nvram ]; then - echo_success "generate .usim.nvram" + if [ ! -f .usim.nvram0 ]; then + echo_success "generate .usim.nvram0" $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/usim_data --gen fi $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/ue_data --print diff --git a/targets/build_oai.bash b/targets/build_oai.bash index 5eb1845674..cfe5e35d26 100755 --- a/targets/build_oai.bash +++ b/targets/build_oai.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2014 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file build_oai.bash # brief OAI automated build tool that can be used to install, compile, run OAI. @@ -763,13 +756,13 @@ if [ $RUN -ne 0 ]; then install_nasmesh else # prepare NAS for UE - if [ ! -f .ue.nvram ]; then - echo_success "generate .ue_emm.nvram .ue.nvram" + if [ ! -f .ue.nvram0 ]; then + echo_success "generate .ue_emm.nvram0 .ue.nvram0" $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/ue_data --gen fi - if [ ! -f .usim.nvram ]; then - echo_success "generate .usim.nvram" + if [ ! -f .usim.nvram0 ]; then + echo_success "generate .usim.nvram0" $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/usim_data --gen fi $OPENAIR3_DIR/NAS/EURECOM-NAS/bin/ue_data --print diff --git a/targets/perf_oai.bash b/targets/perf_oai.bash index 9379f7767c..a5209ec7cb 100755 --- a/targets/perf_oai.bash +++ b/targets/perf_oai.bash @@ -1,30 +1,23 @@ -################################################################################ -# OpenAirInterface -# Copyright(c) 1999 - 2015 Eurecom -# -# OpenAirInterface 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 3 of the License, or -# (at your option) anylater version. -# -# -# OpenAirInterface 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 OpenAirInterface.The full GNU General Public License is -# included in this distribution in the file called "COPYING". If not, -# see . -# -# Contact Information -# OpenAirInterface Admin: openair_admin@eurecom.fr -# OpenAirInterface Tech : openair_tech@eurecom.fr -# OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr -# -# Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE -# +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (the "License"); you may not use this file +# * except in compliance with the License. +# * You may obtain a copy of the License at +# * +# * http://www.openairinterface.org/?page_id=698 +# * +# * Unless required by applicable law or agreed to in writing, software +# * distributed under the License is distributed on an "AS IS" BASIS, +# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# * See the License for the specific language governing permissions and +# * limitations under the License. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ ################################################################################ # file build_oai.bash # brief apply a traffic generator, send traffic and measure the performance of OAI